diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..247792115 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,17 @@ +*.txt text +*.[tj]s text +*.py text +*.yml text +*.yaml text +*.csv text +*.tps text +*.md text +*.json text +*.css text + +*.png -text +*.webp -text +*.ttf -text +*.ogg -text +*.aesprite -text +*.zip -text diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 000000000..9645ea8fc --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,113 @@ + +# How to contribute + +### Translation work + +Thank you for your interest in contributing to the translation work! If you want to translate this project, please follow the steps below: + +For some nouns, you can refer to the [Noun Explanation](#Noun-Explanation) section. + +> For users who are not familiar with Git, to quickly translate. + +#### Get started + +1. First. You need to enter the folder where the text resources of this project's `newartwork` branch are located. You can [click here to enter](/Screens/MiniGame/KinkyDungeon/) + +2. Find the corresponding language file you want to translate in the directory and click to enter. + +> The naming format of the language resource file is `Text_KinkyDungeon_.txt` +> Such as `Text_KinkyDungeon_EN.txt` is the English translation file (of course, this does not exist) + +3. Click the edit button in the upper right corner of the editing box. You may be prompted to Fork the project, follow the prompts to operate. + +> If you are not the first time to participate in the translation and have Forked the project, you can directly edit in your Fork project. Note: Before editing, please switch to the `newartwork` branch and **synchronize**. + +![img](https://docs.github.com/assets/cb-47646/mw-1440/images/help/repository/edit-file-edit-button.webp) + +4. Use `Ctrl + F` or other search functions to find the text you want to translate. You can start the translation work. + + +##### Writing rules + +One line of original text, then the next line is the translated text。 + +*(Ensure original text on odd lines, translation on even lines)* + +Such as: +````` +Original text 1 +Translated text 1 +Original text 2 +Translated text 2 +````` + +##### Untranslated content + +If you do not have specific text to translate, you can find the original text that starts with `###`, which is the format of the text that starts with `### Original text` and has not been translated. + +The method is: remove the `### ` in it (note, do not delete the original text), and then write the translated text on the next line. + +> You don't need to worry about the position and the spaces at the beginning and end. You only need to keep the original text and the translated text in the correct order. + +##### Other + +- If you have accumulated some translation content and don't want to find and modify them one by one, you can write *original text-translation* according to the rules at any place, and the first pair of translation pairs that meet the requirements will be retained after submission. (It is best to write at the beginning, because the first submission will cover the later ones) + +- **If you think that submitting and editing is too cumbersome, you can create an `issue`, write the accumulated translation content in it, and indicate the language file.** [Reference document](https://docs.github.com/en/issues/tracking-your-work-with-issues/quickstart) + +> Note: When pasting translation content, please wrap it in **a pair** of ` ``` ` (backticks) . + +Such as: +````` +Text_KinkyDungeon_EN.txt +``` +Original text 1 +Translated text 1 +Original text 2 +Translated text 2 +``` +````` + +#### Finish and submit + +After completing the translation, you can click the `Commit changes...` button in the upper right corner of the editing box, keep the default or fill in the commit information and submit. + +In the `base` item at the top, you should choose `newartwork` Branches. + +> *So far, follow the prompts all the way, the following content may be confusing, it is not recommended to continue reading if you have no questions.* + +After submitting, you will enter the `Comparing changes` page. You can view your submission content on this page. After confirming that there is no error, click `Create pull request` and wait for approval. + +![img](https://camo.githubusercontent.com/34a2cf737ba2f5943e3e469aa231e95a0ee4d0888c10dcaa169c1f8413d43333/68747470733a2f2f6669727374636f6e747269627574696f6e732e6769746875622e696f2f6173736574732f526561646d652f7375626d69742d70756c6c2d726571756573742e706e67) + +If you did not enter or accidentally leave the page, you can return to the `newartwork` branch of this project. You should see a yellow prompt box at the top of the project. Click `Compare & pull request` to enter the Pull Request page. For details, please refer to the [GitHub official document](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request) + +![img](https://camo.githubusercontent.com/e10bdcf31fb3f8ce863dc1dbf9269a23bce9263afcbe9a62d892e9b6e78df1c6/68747470733a2f2f6669727374636f6e747269627574696f6e732e6769746875622e696f2f6173736574732f526561646d652f636f6d706172652d616e642d70756c6c2e706e67) + +#### Noun Explanation + +Note that these contents are mainly for users who are not familiar with Git, and are mainly for easy understanding. They may be different from the actual functions. If you are interested in learning more, please refer to the [GitHub official document](https://docs.github.com/) + +##### Branches + +> Note that this refers to `Branches` rather than `Fork`. + +On GitHub, the code has various versions, and branches are these different versions of the code. In this project, we mainly work in the `newartwork` branch, so you need to pay attention to switching to the `newartwork` branch. + +![img](https://docs.github.com/assets/cb-2058/mw-1440/images/help/branches/pr-retargeting-diagram1.webp) + + +![img](https://docs.github.com/assets/cb-36152/mw-1440/images/help/repository/file-tree-view-branch-dropdown-expanded.webp) + +##### Pull Request + +Since you are not a project member, you cannot submit translation content directly. So you need to `Fork` this project, which means copying it to your account, and then editing it in your account. + +How do you merge the project you copied into this project? This requires a `Pull Request`, which is a request to merge your changes into this project. + + +##### Synchronize + +After you Fork the project, this project may be updated, and you need to synchronize the updates of this project to your Fork project to avoid conflicts caused by the project being updated and your Fork project not being updated. + +The synchronization function is by default for the current branch, so you need to switch to the corresponding branch before synchronizing. diff --git a/.github/scripts/format-translation-script.py b/.github/scripts/format-translation-script.py new file mode 100644 index 000000000..65acd9e0e --- /dev/null +++ b/.github/scripts/format-translation-script.py @@ -0,0 +1,132 @@ +# This script is used to reorder and deduplicate the translation files according to the order of the source text files. Doing so has the following effects: +# - For merging PRs in the future, the translation content supports insertion at any position, and the script will automatically reorder and retain the first non-repeated translation content.(You can rest assured to cover the content) +# - If the source text in the source file is modified in the future, the script will not retain the old translation content in the translation file, reducing the generation of obsolete translation content. +# - Use `### Original` instead of untranslated original text lines to facilitate translators to find and compare untranslated content, and translators do not need to open the source file for copying, improving work efficiency. +# - Retain the empty lines and order of the original file, so that the translation work can be browsed according to the classification of the original file. +# - Remove duplicate content in the translation file to avoid repeated translation. +# +# Git-Action automation configuration: +# This script has been configured in Git-Action. When the translation file or source text file changes, the action is automatically triggered to execute the reorder overwrite operation. +# +# Operation process: +# - Read the Text_KinkyDungeon.csv file and retain empty lines and order. +# - Read the Text_KinkyDungeon_[lang].txt file and store the content in a list. +# - Reorder the content of the translation file according to the order of the Text_KinkyDungeon.csv file +# - If there is no corresponding translation, use `### Original` instead +# - If there is duplicate translation, it will not be written + +import os +import csv +import sys + +# Ignore keys +IGNORE_KEYS = [ + "RestartNeededEN", "RestartNeededCN", "RestartNeededKR", "RestartNeededJP", "RestartNeededES", "RestartNeededFR", "RestartNeededRU", + "KDVersionStr" +] + +class LineCountingWriter: + def __init__(self, file, init_count=1): + self.file = file + self.count_lines = init_count + + def write(self, content): + lines = content.count('\n') + self.count_lines += lines + self.file.write(content) + + def line_count(self): + return self.count_lines + +# Read the csv file +def read_csv_with_empty_lines(file_path) -> list: + with open(file_path, newline='', encoding='utf-8') as csvfile: + reader = csv.reader(csvfile) + lines = [] + for row in reader: + # Retain empty lines + if not row: + lines.append(None) + continue + + if len(row) != 2: + print(f' {row}') + continue + + if row[0] in IGNORE_KEYS: + continue + + lines.append(row) + return lines + + +# Read the translation file +def read_translation_file(file_path) -> list: + with open(file_path, 'r', encoding='utf-8') as file: + lines = [ line.strip() for line in file.readlines() if not line.lstrip().startswith('###') ] + return lines + + +def write_translated_file(csv_lines : list, translations : list, output_path : str): + translated = set() + with open(output_path, 'w', encoding='utf-8') as file: + writer = LineCountingWriter(file) + for line in csv_lines: + if not line or not line[1]: + writer.write('\n') + continue + + key, original, *_ = line + if original in translated: + continue + translated.add(original) + + if writer.line_count() % 2 == 0: + writer.write('\n') + + # The next line of the original text corresponding to the List is the translation. If the translation is not found,will use "### Original" instead. + # When the translation is the same as the original text, "### Original" is also used because it is meaningless. + try: + original_index = translations.index(original.strip()) + translation = translations[original_index + 1].strip() + if not translation or (original == translation) : + raise ValueError + except (ValueError, IndexError): + writer.write(f'### {original}\n') + continue + + writer.write(f'{original}\n{translation}\n') + +original_csv_path = 'Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv' + +# Enable the translation files to be reordered +translation_files = [ + 'Text_KinkyDungeon_CN.txt', + 'Text_KinkyDungeon_DE.txt', + 'Text_KinkyDungeon_KR.txt', + 'Text_KinkyDungeon_RU.txt', + 'Text_KinkyDungeon_JP.txt', + 'Text_KinkyDungeon_ES.txt', + ] +translation_files = [f'Screens/MiniGame/KinkyDungeon/{file}' for file in translation_files] + + +modified_files = sys.argv[1:] +print(f'Modified Files: {modified_files}') + +# if originnal file is modified, then all translation files need to be reformatted +if any(file.endswith('Text_KinkyDungeon.csv') for file in modified_files): + modified_files = translation_files + +modified_files = [file for file in modified_files if file.endswith('.txt')] + +csv_lines = read_csv_with_empty_lines(original_csv_path) + +for file in modified_files: + if not os.path.exists(file): + print(f'File not found: {file}') + continue + + print(f'Processing : {file}') + translations = read_translation_file(file) + write_translated_file(csv_lines, translations, file) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 000000000..ea6e66221 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,32 @@ +name: Deploy to GH Pages + +on: + push: + branches: [ "master" ] + +permissions: + contents: write + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - name: Checkout KinkyDungeon + uses: actions/checkout@v3 + - name: Use Node.js 14.x + uses: actions/setup-node@v3 + with: + node-version: 14.x + - name: Build + run: | + npm install + npm run build + printf "\n!/out/**/*" >> .gitignore + - name: Deploy + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: . + clean: true + single-commit: true \ No newline at end of file diff --git a/.github/workflows/format-translation.yml b/.github/workflows/format-translation.yml new file mode 100644 index 000000000..74257cf68 --- /dev/null +++ b/.github/workflows/format-translation.yml @@ -0,0 +1,37 @@ +name: Format Translation + +permissions: + contents: write + +on: + workflow_dispatch: + push: + branches: + - newartwork + paths: + - "Screens/MiniGame/KinkyDungeon/*" + +jobs: + format-translation: + runs-on: ubuntu-latest + if: github.repository == 'Ada18980/KinkiestDungeon' + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: "3.x" + + - name: 🚀 Run format-translation script + run: python .github/scripts/format-translation-script.py Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv + + - name: 📝 Commit changes + id: check_changes + run: | + git config --local user.email "action@github.com" + git config --local user.name "format-translation-action" + git add . + git diff-index --quiet HEAD || git commit -m "Format translation files" + git push diff --git a/.gitignore b/.gitignore index 552c725c2..72be2f22c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ !*/ !/Assets/**/* -!/Backgrounds/**/*.jpg +!/Backgrounds/**/*.png !/Icons/**/* !/Fonts/**/* !/Game/**/* @@ -11,7 +11,14 @@ !/Screens/**/* !/Mods/example_enemy.zip !/Mods/example_enemy/**/* +!/Data/**/* +!/Models/**/* +!/ModelsBack/**/* +!/TextureAtlas/**/* +!/DisplacementMaps/**/* +!/out/saveworker.js +!/.github/workflows/*.yml !/.editorconfig !/.eslintrc.json !/.gitignore @@ -19,7 +26,9 @@ !/package-lock.json !/package.json !/jsconfig.json +!/tsconfig.json !/README.md !/style.css -*.wav \ No newline at end of file +*.wav + diff --git a/Assets/Female3DCG/Activity/Bite.png b/Assets/Female3DCG/Activity/Bite.png deleted file mode 100644 index f96a9d388..000000000 Binary files a/Assets/Female3DCG/Activity/Bite.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Caress.png b/Assets/Female3DCG/Activity/Caress.png deleted file mode 100644 index 8a446266d..000000000 Binary files a/Assets/Female3DCG/Activity/Caress.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Choke.png b/Assets/Female3DCG/Activity/Choke.png deleted file mode 100644 index 0d6fa035f..000000000 Binary files a/Assets/Female3DCG/Activity/Choke.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Cuddle.png b/Assets/Female3DCG/Activity/Cuddle.png deleted file mode 100644 index af8f456e1..000000000 Binary files a/Assets/Female3DCG/Activity/Cuddle.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/FrenchKiss.png b/Assets/Female3DCG/Activity/FrenchKiss.png deleted file mode 100644 index 6e24ae102..000000000 Binary files a/Assets/Female3DCG/Activity/FrenchKiss.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/GagKiss.png b/Assets/Female3DCG/Activity/GagKiss.png deleted file mode 100644 index 23e3e05c0..000000000 Binary files a/Assets/Female3DCG/Activity/GagKiss.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/GaggedKiss.png b/Assets/Female3DCG/Activity/GaggedKiss.png deleted file mode 100644 index 624834f3e..000000000 Binary files a/Assets/Female3DCG/Activity/GaggedKiss.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Grope.png b/Assets/Female3DCG/Activity/Grope.png deleted file mode 100644 index 62e0cdf04..000000000 Binary files a/Assets/Female3DCG/Activity/Grope.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/HandGag.png b/Assets/Female3DCG/Activity/HandGag.png deleted file mode 100644 index 820f8f28c..000000000 Binary files a/Assets/Female3DCG/Activity/HandGag.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Inject.png b/Assets/Female3DCG/Activity/Inject.png deleted file mode 100644 index 80e1b6c56..000000000 Binary files a/Assets/Female3DCG/Activity/Inject.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Kiss.png b/Assets/Female3DCG/Activity/Kiss.png deleted file mode 100644 index e54138925..000000000 Binary files a/Assets/Female3DCG/Activity/Kiss.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Lick.png b/Assets/Female3DCG/Activity/Lick.png deleted file mode 100644 index fa5f3bdc8..000000000 Binary files a/Assets/Female3DCG/Activity/Lick.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MassageFeet.png b/Assets/Female3DCG/Activity/MassageFeet.png deleted file mode 100644 index 01e3feafb..000000000 Binary files a/Assets/Female3DCG/Activity/MassageFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MassageHands.png b/Assets/Female3DCG/Activity/MassageHands.png deleted file mode 100644 index 9083f9291..000000000 Binary files a/Assets/Female3DCG/Activity/MassageHands.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MasturbateFist.png b/Assets/Female3DCG/Activity/MasturbateFist.png deleted file mode 100644 index d640e0fb4..000000000 Binary files a/Assets/Female3DCG/Activity/MasturbateFist.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MasturbateFoot.png b/Assets/Female3DCG/Activity/MasturbateFoot.png deleted file mode 100644 index 01e3feafb..000000000 Binary files a/Assets/Female3DCG/Activity/MasturbateFoot.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MasturbateHand.png b/Assets/Female3DCG/Activity/MasturbateHand.png deleted file mode 100644 index 4085a06e2..000000000 Binary files a/Assets/Female3DCG/Activity/MasturbateHand.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MasturbateTongue.png b/Assets/Female3DCG/Activity/MasturbateTongue.png deleted file mode 100644 index fa5f3bdc8..000000000 Binary files a/Assets/Female3DCG/Activity/MasturbateTongue.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MoanGag.png b/Assets/Female3DCG/Activity/MoanGag.png deleted file mode 100644 index 0b8895bb8..000000000 Binary files a/Assets/Female3DCG/Activity/MoanGag.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MoanGagAngry.png b/Assets/Female3DCG/Activity/MoanGagAngry.png deleted file mode 100644 index 68f216879..000000000 Binary files a/Assets/Female3DCG/Activity/MoanGagAngry.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MoanGagGiggle.png b/Assets/Female3DCG/Activity/MoanGagGiggle.png deleted file mode 100644 index dc3f27027..000000000 Binary files a/Assets/Female3DCG/Activity/MoanGagGiggle.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MoanGagGroan.png b/Assets/Female3DCG/Activity/MoanGagGroan.png deleted file mode 100644 index 624834f3e..000000000 Binary files a/Assets/Female3DCG/Activity/MoanGagGroan.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MoanGagTalk.png b/Assets/Female3DCG/Activity/MoanGagTalk.png deleted file mode 100644 index de0520840..000000000 Binary files a/Assets/Female3DCG/Activity/MoanGagTalk.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/MoanGagWhimper.png b/Assets/Female3DCG/Activity/MoanGagWhimper.png deleted file mode 100644 index d4fee0e0e..000000000 Binary files a/Assets/Female3DCG/Activity/MoanGagWhimper.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Nibble.png b/Assets/Female3DCG/Activity/Nibble.png deleted file mode 100644 index f96a9d388..000000000 Binary files a/Assets/Female3DCG/Activity/Nibble.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Nod.png b/Assets/Female3DCG/Activity/Nod.png deleted file mode 100644 index bab3fbce6..000000000 Binary files a/Assets/Female3DCG/Activity/Nod.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/PenetrateFast.png b/Assets/Female3DCG/Activity/PenetrateFast.png deleted file mode 100644 index 9e14305df..000000000 Binary files a/Assets/Female3DCG/Activity/PenetrateFast.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/PenetrateSlow.png b/Assets/Female3DCG/Activity/PenetrateSlow.png deleted file mode 100644 index 9e14305df..000000000 Binary files a/Assets/Female3DCG/Activity/PenetrateSlow.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Pet.png b/Assets/Female3DCG/Activity/Pet.png deleted file mode 100644 index 8a446266d..000000000 Binary files a/Assets/Female3DCG/Activity/Pet.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Pinch.png b/Assets/Female3DCG/Activity/Pinch.png deleted file mode 100644 index 641f9060e..000000000 Binary files a/Assets/Female3DCG/Activity/Pinch.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/PoliteKiss.png b/Assets/Female3DCG/Activity/PoliteKiss.png deleted file mode 100644 index 0ef1ba33a..000000000 Binary files a/Assets/Female3DCG/Activity/PoliteKiss.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Pull.png b/Assets/Female3DCG/Activity/Pull.png deleted file mode 100644 index 6d53edb09..000000000 Binary files a/Assets/Female3DCG/Activity/Pull.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/RestHead.png b/Assets/Female3DCG/Activity/RestHead.png deleted file mode 100644 index 1875ec5f3..000000000 Binary files a/Assets/Female3DCG/Activity/RestHead.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Rub.png b/Assets/Female3DCG/Activity/Rub.png deleted file mode 100644 index af8f456e1..000000000 Binary files a/Assets/Female3DCG/Activity/Rub.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Sit.png b/Assets/Female3DCG/Activity/Sit.png deleted file mode 100644 index 01e3feafb..000000000 Binary files a/Assets/Female3DCG/Activity/Sit.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Slap.png b/Assets/Female3DCG/Activity/Slap.png deleted file mode 100644 index 703990ae1..000000000 Binary files a/Assets/Female3DCG/Activity/Slap.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Spank.png b/Assets/Female3DCG/Activity/Spank.png deleted file mode 100644 index 6cdda6c86..000000000 Binary files a/Assets/Female3DCG/Activity/Spank.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Step.png b/Assets/Female3DCG/Activity/Step.png deleted file mode 100644 index 01e3feafb..000000000 Binary files a/Assets/Female3DCG/Activity/Step.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/StruggleArms.png b/Assets/Female3DCG/Activity/StruggleArms.png deleted file mode 100644 index af8f456e1..000000000 Binary files a/Assets/Female3DCG/Activity/StruggleArms.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/StruggleLegs.png b/Assets/Female3DCG/Activity/StruggleLegs.png deleted file mode 100644 index af8f456e1..000000000 Binary files a/Assets/Female3DCG/Activity/StruggleLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Suck.png b/Assets/Female3DCG/Activity/Suck.png deleted file mode 100644 index 8ea312bb2..000000000 Binary files a/Assets/Female3DCG/Activity/Suck.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/TakeCare.png b/Assets/Female3DCG/Activity/TakeCare.png deleted file mode 100644 index 62e0cdf04..000000000 Binary files a/Assets/Female3DCG/Activity/TakeCare.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Tickle.png b/Assets/Female3DCG/Activity/Tickle.png deleted file mode 100644 index 43921ac35..000000000 Binary files a/Assets/Female3DCG/Activity/Tickle.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Whisper.png b/Assets/Female3DCG/Activity/Whisper.png deleted file mode 100644 index e54138925..000000000 Binary files a/Assets/Female3DCG/Activity/Whisper.png and /dev/null differ diff --git a/Assets/Female3DCG/Activity/Wiggle.png b/Assets/Female3DCG/Activity/Wiggle.png deleted file mode 100644 index af8f456e1..000000000 Binary files a/Assets/Female3DCG/Activity/Wiggle.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/Blush.png b/Assets/Female3DCG/Blush/Blush.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/Blush/Blush.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/Extreme/Blush.png b/Assets/Female3DCG/Blush/Extreme/Blush.png deleted file mode 100644 index 83006e9b7..000000000 Binary files a/Assets/Female3DCG/Blush/Extreme/Blush.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/Extreme/Icon.png b/Assets/Female3DCG/Blush/Extreme/Icon.png deleted file mode 100644 index fc7d57ab1..000000000 Binary files a/Assets/Female3DCG/Blush/Extreme/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/High/Blush.png b/Assets/Female3DCG/Blush/High/Blush.png deleted file mode 100644 index 92deea006..000000000 Binary files a/Assets/Female3DCG/Blush/High/Blush.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/High/Icon.png b/Assets/Female3DCG/Blush/High/Icon.png deleted file mode 100644 index cfe52d67b..000000000 Binary files a/Assets/Female3DCG/Blush/High/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/Icon.png b/Assets/Female3DCG/Blush/Icon.png deleted file mode 100644 index 21d565cb3..000000000 Binary files a/Assets/Female3DCG/Blush/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/Low/Blush.png b/Assets/Female3DCG/Blush/Low/Blush.png deleted file mode 100644 index dead020e3..000000000 Binary files a/Assets/Female3DCG/Blush/Low/Blush.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/Low/Icon.png b/Assets/Female3DCG/Blush/Low/Icon.png deleted file mode 100644 index ad5dc562e..000000000 Binary files a/Assets/Female3DCG/Blush/Low/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/Medium/Blush.png b/Assets/Female3DCG/Blush/Medium/Blush.png deleted file mode 100644 index 904bacd9b..000000000 Binary files a/Assets/Female3DCG/Blush/Medium/Blush.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/Medium/Icon.png b/Assets/Female3DCG/Blush/Medium/Icon.png deleted file mode 100644 index d9794dce3..000000000 Binary files a/Assets/Female3DCG/Blush/Medium/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/Orig.png b/Assets/Female3DCG/Blush/Orig.png deleted file mode 100644 index 610efedef..000000000 Binary files a/Assets/Female3DCG/Blush/Orig.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/ShortBreath/Blush.png b/Assets/Female3DCG/Blush/ShortBreath/Blush.png deleted file mode 100644 index 778d5b452..000000000 Binary files a/Assets/Female3DCG/Blush/ShortBreath/Blush.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/ShortBreath/Icon.png b/Assets/Female3DCG/Blush/ShortBreath/Icon.png deleted file mode 100644 index 909499134..000000000 Binary files a/Assets/Female3DCG/Blush/ShortBreath/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/VeryHigh/Blush.png b/Assets/Female3DCG/Blush/VeryHigh/Blush.png deleted file mode 100644 index cd6a0cdd0..000000000 Binary files a/Assets/Female3DCG/Blush/VeryHigh/Blush.png and /dev/null differ diff --git a/Assets/Female3DCG/Blush/VeryHigh/Icon.png b/Assets/Female3DCG/Blush/VeryHigh/Icon.png deleted file mode 100644 index f34cec6bd..000000000 Binary files a/Assets/Female3DCG/Blush/VeryHigh/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/Large_Asian.png b/Assets/Female3DCG/BodyLower/Kneel/Large_Asian.png deleted file mode 100644 index 4b9e1c956..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/Large_Black.png b/Assets/Female3DCG/BodyLower/Kneel/Large_Black.png deleted file mode 100644 index 3a05a1947..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/Large_White.png b/Assets/Female3DCG/BodyLower/Kneel/Large_White.png deleted file mode 100644 index e983b6a03..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/Normal_Asian.png b/Assets/Female3DCG/BodyLower/Kneel/Normal_Asian.png deleted file mode 100644 index 2c552d59a..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/Normal_Black.png b/Assets/Female3DCG/BodyLower/Kneel/Normal_Black.png deleted file mode 100644 index 73bb85cd1..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/Normal_White.png b/Assets/Female3DCG/BodyLower/Kneel/Normal_White.png deleted file mode 100644 index 61a31dce9..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/Small_Asian.png b/Assets/Female3DCG/BodyLower/Kneel/Small_Asian.png deleted file mode 100644 index 1f6fdfb96..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/Small_Black.png b/Assets/Female3DCG/BodyLower/Kneel/Small_Black.png deleted file mode 100644 index 220e69035..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/Small_White.png b/Assets/Female3DCG/BodyLower/Kneel/Small_White.png deleted file mode 100644 index d15ccb238..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/XLarge_Asian.png b/Assets/Female3DCG/BodyLower/Kneel/XLarge_Asian.png deleted file mode 100644 index bc1b69cec..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/XLarge_Black.png b/Assets/Female3DCG/BodyLower/Kneel/XLarge_Black.png deleted file mode 100644 index b177346a1..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Kneel/XLarge_White.png b/Assets/Female3DCG/BodyLower/Kneel/XLarge_White.png deleted file mode 100644 index 37aeab2a2..000000000 Binary files a/Assets/Female3DCG/BodyLower/Kneel/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/Large_Asian.png b/Assets/Female3DCG/BodyLower/KneelingSpread/Large_Asian.png deleted file mode 100644 index eda507fd2..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/Large_Black.png b/Assets/Female3DCG/BodyLower/KneelingSpread/Large_Black.png deleted file mode 100644 index a5c927511..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/Large_White.png b/Assets/Female3DCG/BodyLower/KneelingSpread/Large_White.png deleted file mode 100644 index 32dd43f10..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/Normal_Asian.png b/Assets/Female3DCG/BodyLower/KneelingSpread/Normal_Asian.png deleted file mode 100644 index ca6b7fb6e..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/Normal_Black.png b/Assets/Female3DCG/BodyLower/KneelingSpread/Normal_Black.png deleted file mode 100644 index 1db7abfd8..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/Normal_White.png b/Assets/Female3DCG/BodyLower/KneelingSpread/Normal_White.png deleted file mode 100644 index 2f8471bb9..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/Small_Asian.png b/Assets/Female3DCG/BodyLower/KneelingSpread/Small_Asian.png deleted file mode 100644 index 47f40210e..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/Small_Black.png b/Assets/Female3DCG/BodyLower/KneelingSpread/Small_Black.png deleted file mode 100644 index bb182da62..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/Small_White.png b/Assets/Female3DCG/BodyLower/KneelingSpread/Small_White.png deleted file mode 100644 index 3a416650e..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/XLarge_Asian.png b/Assets/Female3DCG/BodyLower/KneelingSpread/XLarge_Asian.png deleted file mode 100644 index 72fde6833..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/XLarge_Black.png b/Assets/Female3DCG/BodyLower/KneelingSpread/XLarge_Black.png deleted file mode 100644 index 561cba2c4..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/KneelingSpread/XLarge_White.png b/Assets/Female3DCG/BodyLower/KneelingSpread/XLarge_White.png deleted file mode 100644 index 01b194894..000000000 Binary files a/Assets/Female3DCG/BodyLower/KneelingSpread/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Large_Asian.png b/Assets/Female3DCG/BodyLower/Large_Asian.png deleted file mode 100644 index 45129c2d0..000000000 Binary files a/Assets/Female3DCG/BodyLower/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Large_Black.png b/Assets/Female3DCG/BodyLower/Large_Black.png deleted file mode 100644 index 75407efae..000000000 Binary files a/Assets/Female3DCG/BodyLower/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Large_White.png b/Assets/Female3DCG/BodyLower/Large_White.png deleted file mode 100644 index 1bac22e57..000000000 Binary files a/Assets/Female3DCG/BodyLower/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/Large_Asian.png b/Assets/Female3DCG/BodyLower/LegsClosed/Large_Asian.png deleted file mode 100644 index a0c20fbcf..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/Large_Black.png b/Assets/Female3DCG/BodyLower/LegsClosed/Large_Black.png deleted file mode 100644 index 5bca30e96..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/Large_White.png b/Assets/Female3DCG/BodyLower/LegsClosed/Large_White.png deleted file mode 100644 index ac484cf76..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/Normal_Asian.png b/Assets/Female3DCG/BodyLower/LegsClosed/Normal_Asian.png deleted file mode 100644 index 6ab0f3bb6..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/Normal_Black.png b/Assets/Female3DCG/BodyLower/LegsClosed/Normal_Black.png deleted file mode 100644 index a8ef11411..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/Normal_White.png b/Assets/Female3DCG/BodyLower/LegsClosed/Normal_White.png deleted file mode 100644 index e4332c522..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/Small_Asian.png b/Assets/Female3DCG/BodyLower/LegsClosed/Small_Asian.png deleted file mode 100644 index 3446c6a3d..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/Small_Black.png b/Assets/Female3DCG/BodyLower/LegsClosed/Small_Black.png deleted file mode 100644 index 14bfc25e9..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/Small_White.png b/Assets/Female3DCG/BodyLower/LegsClosed/Small_White.png deleted file mode 100644 index c2c0c9610..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/XLarge_Asian.png b/Assets/Female3DCG/BodyLower/LegsClosed/XLarge_Asian.png deleted file mode 100644 index a13a095c7..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/XLarge_Black.png b/Assets/Female3DCG/BodyLower/LegsClosed/XLarge_Black.png deleted file mode 100644 index 873f987bc..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/LegsClosed/XLarge_White.png b/Assets/Female3DCG/BodyLower/LegsClosed/XLarge_White.png deleted file mode 100644 index d0700e831..000000000 Binary files a/Assets/Female3DCG/BodyLower/LegsClosed/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Normal_Asian.png b/Assets/Female3DCG/BodyLower/Normal_Asian.png deleted file mode 100644 index 243e343d1..000000000 Binary files a/Assets/Female3DCG/BodyLower/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Normal_Black.png b/Assets/Female3DCG/BodyLower/Normal_Black.png deleted file mode 100644 index b46730a19..000000000 Binary files a/Assets/Female3DCG/BodyLower/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Normal_White.png b/Assets/Female3DCG/BodyLower/Normal_White.png deleted file mode 100644 index d751f7523..000000000 Binary files a/Assets/Female3DCG/BodyLower/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Small_Asian.png b/Assets/Female3DCG/BodyLower/Small_Asian.png deleted file mode 100644 index 2514bd31d..000000000 Binary files a/Assets/Female3DCG/BodyLower/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Small_Black.png b/Assets/Female3DCG/BodyLower/Small_Black.png deleted file mode 100644 index 28b944f1a..000000000 Binary files a/Assets/Female3DCG/BodyLower/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Small_White.png b/Assets/Female3DCG/BodyLower/Small_White.png deleted file mode 100644 index da267ab9c..000000000 Binary files a/Assets/Female3DCG/BodyLower/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/Large_Asian.png b/Assets/Female3DCG/BodyLower/Spread/Large_Asian.png deleted file mode 100644 index 313db76e5..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/Large_Black.png b/Assets/Female3DCG/BodyLower/Spread/Large_Black.png deleted file mode 100644 index b5615edb1..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/Large_White.png b/Assets/Female3DCG/BodyLower/Spread/Large_White.png deleted file mode 100644 index 0edbec3c6..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/Normal_Asian.png b/Assets/Female3DCG/BodyLower/Spread/Normal_Asian.png deleted file mode 100644 index eb8560c50..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/Normal_Black.png b/Assets/Female3DCG/BodyLower/Spread/Normal_Black.png deleted file mode 100644 index 0a4a188a0..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/Normal_White.png b/Assets/Female3DCG/BodyLower/Spread/Normal_White.png deleted file mode 100644 index 8d532c2bc..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/Small_Asian.png b/Assets/Female3DCG/BodyLower/Spread/Small_Asian.png deleted file mode 100644 index f87d66a7c..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/Small_Black.png b/Assets/Female3DCG/BodyLower/Spread/Small_Black.png deleted file mode 100644 index 11e3aed09..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/Small_White.png b/Assets/Female3DCG/BodyLower/Spread/Small_White.png deleted file mode 100644 index 2a72249fe..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/XLarge_Asian.png b/Assets/Female3DCG/BodyLower/Spread/XLarge_Asian.png deleted file mode 100644 index 8ecd0c67f..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/XLarge_Black.png b/Assets/Female3DCG/BodyLower/Spread/XLarge_Black.png deleted file mode 100644 index b499645eb..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/Spread/XLarge_White.png b/Assets/Female3DCG/BodyLower/Spread/XLarge_White.png deleted file mode 100644 index 7adbac79c..000000000 Binary files a/Assets/Female3DCG/BodyLower/Spread/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/XLarge_Asian.png b/Assets/Female3DCG/BodyLower/XLarge_Asian.png deleted file mode 100644 index fc0ba46e8..000000000 Binary files a/Assets/Female3DCG/BodyLower/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/XLarge_Black.png b/Assets/Female3DCG/BodyLower/XLarge_Black.png deleted file mode 100644 index e5d9452da..000000000 Binary files a/Assets/Female3DCG/BodyLower/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyLower/XLarge_White.png b/Assets/Female3DCG/BodyLower/XLarge_White.png deleted file mode 100644 index a7fc0ad30..000000000 Binary files a/Assets/Female3DCG/BodyLower/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/3DCGPose/AllFours.tdcgpose.png b/Assets/Female3DCG/BodyUpper/3DCGPose/AllFours.tdcgpose.png deleted file mode 100644 index 81194a125..000000000 Binary files a/Assets/Female3DCG/BodyUpper/3DCGPose/AllFours.tdcgpose.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/3DCGPose/BackBoxTie.tdcgpose.png b/Assets/Female3DCG/BodyUpper/3DCGPose/BackBoxTie.tdcgpose.png deleted file mode 100644 index 6bf43e60f..000000000 Binary files a/Assets/Female3DCG/BodyUpper/3DCGPose/BackBoxTie.tdcgpose.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/3DCGPose/BackCuffs.tdcgpose.png b/Assets/Female3DCG/BodyUpper/3DCGPose/BackCuffs.tdcgpose.png deleted file mode 100644 index 858aa2821..000000000 Binary files a/Assets/Female3DCG/BodyUpper/3DCGPose/BackCuffs.tdcgpose.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/3DCGPose/BackElbowTouch.tdcgpose.png b/Assets/Female3DCG/BodyUpper/3DCGPose/BackElbowTouch.tdcgpose.png deleted file mode 100644 index f622afcdc..000000000 Binary files a/Assets/Female3DCG/BodyUpper/3DCGPose/BackElbowTouch.tdcgpose.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/3DCGPose/LegsClosed.tdcgpose.png b/Assets/Female3DCG/BodyUpper/3DCGPose/LegsClosed.tdcgpose.png deleted file mode 100644 index 518a136e1..000000000 Binary files a/Assets/Female3DCG/BodyUpper/3DCGPose/LegsClosed.tdcgpose.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/3DCGPose/OverTheHead.tdcgpose.png b/Assets/Female3DCG/BodyUpper/3DCGPose/OverTheHead.tdcgpose.png deleted file mode 100644 index 4185e1d5c..000000000 Binary files a/Assets/Female3DCG/BodyUpper/3DCGPose/OverTheHead.tdcgpose.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/3DCGPose/Regular.tdcgpose.png b/Assets/Female3DCG/BodyUpper/3DCGPose/Regular.tdcgpose.png deleted file mode 100644 index b83bb5edd..000000000 Binary files a/Assets/Female3DCG/BodyUpper/3DCGPose/Regular.tdcgpose.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/3DCGPose/Yoked.tdcgpose.png b/Assets/Female3DCG/BodyUpper/3DCGPose/Yoked.tdcgpose.png deleted file mode 100644 index 88c6ba8a5..000000000 Binary files a/Assets/Female3DCG/BodyUpper/3DCGPose/Yoked.tdcgpose.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/Large_Asian.png b/Assets/Female3DCG/BodyUpper/AllFours/Large_Asian.png deleted file mode 100644 index 02e04543f..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/Large_Black.png b/Assets/Female3DCG/BodyUpper/AllFours/Large_Black.png deleted file mode 100644 index baf48ebbe..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/Large_White.png b/Assets/Female3DCG/BodyUpper/AllFours/Large_White.png deleted file mode 100644 index 59c9df08b..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/Normal_Asian.png b/Assets/Female3DCG/BodyUpper/AllFours/Normal_Asian.png deleted file mode 100644 index 0d55b7403..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/Normal_Black.png b/Assets/Female3DCG/BodyUpper/AllFours/Normal_Black.png deleted file mode 100644 index 5bd93cad1..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/Normal_White.png b/Assets/Female3DCG/BodyUpper/AllFours/Normal_White.png deleted file mode 100644 index 7d31ff8f2..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/Small_Asian.png b/Assets/Female3DCG/BodyUpper/AllFours/Small_Asian.png deleted file mode 100644 index afce41839..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/Small_Black.png b/Assets/Female3DCG/BodyUpper/AllFours/Small_Black.png deleted file mode 100644 index 73d49b4f6..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/Small_White.png b/Assets/Female3DCG/BodyUpper/AllFours/Small_White.png deleted file mode 100644 index dc6a1cd99..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/XLarge_Asian.png b/Assets/Female3DCG/BodyUpper/AllFours/XLarge_Asian.png deleted file mode 100644 index faf502fc5..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/XLarge_Black.png b/Assets/Female3DCG/BodyUpper/AllFours/XLarge_Black.png deleted file mode 100644 index 1aa36cb0a..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/AllFours/XLarge_White.png b/Assets/Female3DCG/BodyUpper/AllFours/XLarge_White.png deleted file mode 100644 index 3550a53a5..000000000 Binary files a/Assets/Female3DCG/BodyUpper/AllFours/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/Large_Asian.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/Large_Asian.png deleted file mode 100644 index 53afc12e2..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/Large_Black.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/Large_Black.png deleted file mode 100644 index 9c9a5f55e..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/Large_White.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/Large_White.png deleted file mode 100644 index 591f4af6c..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/Normal_Asian.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/Normal_Asian.png deleted file mode 100644 index bb327d415..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/Normal_Black.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/Normal_Black.png deleted file mode 100644 index a53b36c2b..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/Normal_White.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/Normal_White.png deleted file mode 100644 index 506f93566..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/Small_Asian.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/Small_Asian.png deleted file mode 100644 index 598276a27..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/Small_Black.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/Small_Black.png deleted file mode 100644 index a9428aae7..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/Small_White.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/Small_White.png deleted file mode 100644 index bf66cb5cb..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/XLarge_Asian.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/XLarge_Asian.png deleted file mode 100644 index 42edce016..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/XLarge_Black.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/XLarge_Black.png deleted file mode 100644 index d7f05ea2c..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackBoxTie/XLarge_White.png b/Assets/Female3DCG/BodyUpper/BackBoxTie/XLarge_White.png deleted file mode 100644 index 60d72db67..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackBoxTie/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/Large_Asian.png b/Assets/Female3DCG/BodyUpper/BackCuffs/Large_Asian.png deleted file mode 100644 index 6cac2156b..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/Large_Black.png b/Assets/Female3DCG/BodyUpper/BackCuffs/Large_Black.png deleted file mode 100644 index d736e26b5..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/Large_White.png b/Assets/Female3DCG/BodyUpper/BackCuffs/Large_White.png deleted file mode 100644 index 310780c05..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/Normal_Asian.png b/Assets/Female3DCG/BodyUpper/BackCuffs/Normal_Asian.png deleted file mode 100644 index 4efcf1353..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/Normal_Black.png b/Assets/Female3DCG/BodyUpper/BackCuffs/Normal_Black.png deleted file mode 100644 index 21f1a76b6..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/Normal_White.png b/Assets/Female3DCG/BodyUpper/BackCuffs/Normal_White.png deleted file mode 100644 index 45985a9cb..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/Small_Asian.png b/Assets/Female3DCG/BodyUpper/BackCuffs/Small_Asian.png deleted file mode 100644 index 15d58cf8d..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/Small_Black.png b/Assets/Female3DCG/BodyUpper/BackCuffs/Small_Black.png deleted file mode 100644 index 1bab27438..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/Small_White.png b/Assets/Female3DCG/BodyUpper/BackCuffs/Small_White.png deleted file mode 100644 index 889af3c5b..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/XLarge_Asian.png b/Assets/Female3DCG/BodyUpper/BackCuffs/XLarge_Asian.png deleted file mode 100644 index 57b4e72b7..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/XLarge_Black.png b/Assets/Female3DCG/BodyUpper/BackCuffs/XLarge_Black.png deleted file mode 100644 index 42b2033c3..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackCuffs/XLarge_White.png b/Assets/Female3DCG/BodyUpper/BackCuffs/XLarge_White.png deleted file mode 100644 index e0c0d0238..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackCuffs/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Large_Asian.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/Large_Asian.png deleted file mode 100644 index daf513118..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Large_Black.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/Large_Black.png deleted file mode 100644 index 11e8b87db..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Large_White.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/Large_White.png deleted file mode 100644 index 3a037312f..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Normal_Asian.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/Normal_Asian.png deleted file mode 100644 index 5334146fb..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Normal_Black.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/Normal_Black.png deleted file mode 100644 index 98c46b53c..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Normal_White.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/Normal_White.png deleted file mode 100644 index 76eb258e1..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Small_Asian.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/Small_Asian.png deleted file mode 100644 index 3909f1e02..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Small_Black.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/Small_Black.png deleted file mode 100644 index 0e7f337a7..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Small_White.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/Small_White.png deleted file mode 100644 index 1c0a49293..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/XLarge_Asian.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/XLarge_Asian.png deleted file mode 100644 index c1c5c65ec..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/XLarge_Black.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/XLarge_Black.png deleted file mode 100644 index 7fbe608ff..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/BackElbowTouch/XLarge_White.png b/Assets/Female3DCG/BodyUpper/BackElbowTouch/XLarge_White.png deleted file mode 100644 index f6887985f..000000000 Binary files a/Assets/Female3DCG/BodyUpper/BackElbowTouch/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/Large_Asian.png b/Assets/Female3DCG/BodyUpper/Hogtied/Large_Asian.png deleted file mode 100644 index e5da3f875..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/Large_Black.png b/Assets/Female3DCG/BodyUpper/Hogtied/Large_Black.png deleted file mode 100644 index 034b0da29..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/Large_White.png b/Assets/Female3DCG/BodyUpper/Hogtied/Large_White.png deleted file mode 100644 index 4fa9e46c4..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/Normal_Asian.png b/Assets/Female3DCG/BodyUpper/Hogtied/Normal_Asian.png deleted file mode 100644 index 20681c2a8..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/Normal_Black.png b/Assets/Female3DCG/BodyUpper/Hogtied/Normal_Black.png deleted file mode 100644 index 9e21259b4..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/Normal_White.png b/Assets/Female3DCG/BodyUpper/Hogtied/Normal_White.png deleted file mode 100644 index 99ad9a2aa..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/Small_Asian.png b/Assets/Female3DCG/BodyUpper/Hogtied/Small_Asian.png deleted file mode 100644 index 689d1c883..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/Small_Black.png b/Assets/Female3DCG/BodyUpper/Hogtied/Small_Black.png deleted file mode 100644 index 8b8574b7e..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/Small_White.png b/Assets/Female3DCG/BodyUpper/Hogtied/Small_White.png deleted file mode 100644 index ffef5d22f..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/XLarge_Asian.png b/Assets/Female3DCG/BodyUpper/Hogtied/XLarge_Asian.png deleted file mode 100644 index 1d8faa679..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/XLarge_Black.png b/Assets/Female3DCG/BodyUpper/Hogtied/XLarge_Black.png deleted file mode 100644 index 690678c39..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Hogtied/XLarge_White.png b/Assets/Female3DCG/BodyUpper/Hogtied/XLarge_White.png deleted file mode 100644 index 33485f1b0..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Hogtied/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Large_Asian.png b/Assets/Female3DCG/BodyUpper/Large_Asian.png deleted file mode 100644 index ce896cb9e..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Large_Black.png b/Assets/Female3DCG/BodyUpper/Large_Black.png deleted file mode 100644 index f32411a83..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Large_White.png b/Assets/Female3DCG/BodyUpper/Large_White.png deleted file mode 100644 index 82d2e92d9..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/NoEyeLids/UpperBody_Asian_NO_EYELIDS.png b/Assets/Female3DCG/BodyUpper/NoEyeLids/UpperBody_Asian_NO_EYELIDS.png deleted file mode 100644 index a3922978d..000000000 Binary files a/Assets/Female3DCG/BodyUpper/NoEyeLids/UpperBody_Asian_NO_EYELIDS.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/NoEyeLids/UpperBody_Black_NO_EYELIDS.png b/Assets/Female3DCG/BodyUpper/NoEyeLids/UpperBody_Black_NO_EYELIDS.png deleted file mode 100644 index 32466f255..000000000 Binary files a/Assets/Female3DCG/BodyUpper/NoEyeLids/UpperBody_Black_NO_EYELIDS.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/NoEyeLids/UpperBody_White_NO_EYELIDS.png b/Assets/Female3DCG/BodyUpper/NoEyeLids/UpperBody_White_NO_EYELIDS.png deleted file mode 100644 index ab7dac5d3..000000000 Binary files a/Assets/Female3DCG/BodyUpper/NoEyeLids/UpperBody_White_NO_EYELIDS.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Normal_Asian.png b/Assets/Female3DCG/BodyUpper/Normal_Asian.png deleted file mode 100644 index 559dde28f..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Normal_Black.png b/Assets/Female3DCG/BodyUpper/Normal_Black.png deleted file mode 100644 index e0a90dead..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Normal_White.png b/Assets/Female3DCG/BodyUpper/Normal_White.png deleted file mode 100644 index 36027d7d3..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/Large_Asian.png b/Assets/Female3DCG/BodyUpper/Orig/Large_Asian.png deleted file mode 100644 index fd58ea7ae..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/Large_Black.png b/Assets/Female3DCG/BodyUpper/Orig/Large_Black.png deleted file mode 100644 index dce443f2e..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/Large_White.png b/Assets/Female3DCG/BodyUpper/Orig/Large_White.png deleted file mode 100644 index 8a54a7969..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/Normal_Asian.png b/Assets/Female3DCG/BodyUpper/Orig/Normal_Asian.png deleted file mode 100644 index 7a192d9ce..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/Normal_Black.png b/Assets/Female3DCG/BodyUpper/Orig/Normal_Black.png deleted file mode 100644 index 08ea72251..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/Normal_White.png b/Assets/Female3DCG/BodyUpper/Orig/Normal_White.png deleted file mode 100644 index 519e1b6cd..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/Small_Asian.png b/Assets/Female3DCG/BodyUpper/Orig/Small_Asian.png deleted file mode 100644 index df1995030..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/Small_Black.png b/Assets/Female3DCG/BodyUpper/Orig/Small_Black.png deleted file mode 100644 index f3399b122..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/Small_White.png b/Assets/Female3DCG/BodyUpper/Orig/Small_White.png deleted file mode 100644 index 97f4bff9c..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/XLarge_Asian.png b/Assets/Female3DCG/BodyUpper/Orig/XLarge_Asian.png deleted file mode 100644 index 901082561..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/XLarge_Black.png b/Assets/Female3DCG/BodyUpper/Orig/XLarge_Black.png deleted file mode 100644 index 7659d508e..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Orig/XLarge_White.png b/Assets/Female3DCG/BodyUpper/Orig/XLarge_White.png deleted file mode 100644 index ae21568f9..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Orig/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/Large_Asian.png b/Assets/Female3DCG/BodyUpper/OverTheHead/Large_Asian.png deleted file mode 100644 index 317c58e79..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/Large_Black.png b/Assets/Female3DCG/BodyUpper/OverTheHead/Large_Black.png deleted file mode 100644 index c7d309b23..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/Large_White.png b/Assets/Female3DCG/BodyUpper/OverTheHead/Large_White.png deleted file mode 100644 index 530840ae1..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/Normal_Asian.png b/Assets/Female3DCG/BodyUpper/OverTheHead/Normal_Asian.png deleted file mode 100644 index 322024adf..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/Normal_Black.png b/Assets/Female3DCG/BodyUpper/OverTheHead/Normal_Black.png deleted file mode 100644 index 4981b921d..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/Normal_White.png b/Assets/Female3DCG/BodyUpper/OverTheHead/Normal_White.png deleted file mode 100644 index c0caa82ea..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/Small_Asian.png b/Assets/Female3DCG/BodyUpper/OverTheHead/Small_Asian.png deleted file mode 100644 index 5c30f58b3..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/Small_Black.png b/Assets/Female3DCG/BodyUpper/OverTheHead/Small_Black.png deleted file mode 100644 index 1c44b3f2f..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/Small_White.png b/Assets/Female3DCG/BodyUpper/OverTheHead/Small_White.png deleted file mode 100644 index 4f9f5db54..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/XLarge_Asian.png b/Assets/Female3DCG/BodyUpper/OverTheHead/XLarge_Asian.png deleted file mode 100644 index 6952b1971..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/XLarge_Black.png b/Assets/Female3DCG/BodyUpper/OverTheHead/XLarge_Black.png deleted file mode 100644 index 489265b1d..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/OverTheHead/XLarge_White.png b/Assets/Female3DCG/BodyUpper/OverTheHead/XLarge_White.png deleted file mode 100644 index 65199e268..000000000 Binary files a/Assets/Female3DCG/BodyUpper/OverTheHead/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Small_Asian.png b/Assets/Female3DCG/BodyUpper/Small_Asian.png deleted file mode 100644 index 9a8b5e3b5..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Small_Black.png b/Assets/Female3DCG/BodyUpper/Small_Black.png deleted file mode 100644 index b9d404be3..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Small_White.png b/Assets/Female3DCG/BodyUpper/Small_White.png deleted file mode 100644 index ff153f230..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/Large_Asian.png b/Assets/Female3DCG/BodyUpper/TapedHands/Large_Asian.png deleted file mode 100644 index c0aa7f2c9..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/Large_Black.png b/Assets/Female3DCG/BodyUpper/TapedHands/Large_Black.png deleted file mode 100644 index dcf1edc52..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/Large_White.png b/Assets/Female3DCG/BodyUpper/TapedHands/Large_White.png deleted file mode 100644 index 13b157782..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/Normal_Asian.png b/Assets/Female3DCG/BodyUpper/TapedHands/Normal_Asian.png deleted file mode 100644 index bcbf69180..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/Normal_Black.png b/Assets/Female3DCG/BodyUpper/TapedHands/Normal_Black.png deleted file mode 100644 index 87d0bcb26..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/Normal_White.png b/Assets/Female3DCG/BodyUpper/TapedHands/Normal_White.png deleted file mode 100644 index 901b53071..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/Small_Asian.png b/Assets/Female3DCG/BodyUpper/TapedHands/Small_Asian.png deleted file mode 100644 index b99a76658..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/Small_Black.png b/Assets/Female3DCG/BodyUpper/TapedHands/Small_Black.png deleted file mode 100644 index 007e9875d..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/Small_White.png b/Assets/Female3DCG/BodyUpper/TapedHands/Small_White.png deleted file mode 100644 index 35632ae0b..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/XLarge_Asian.png b/Assets/Female3DCG/BodyUpper/TapedHands/XLarge_Asian.png deleted file mode 100644 index 4c1a92202..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/XLarge_Black.png b/Assets/Female3DCG/BodyUpper/TapedHands/XLarge_Black.png deleted file mode 100644 index f23abf2c5..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/TapedHands/XLarge_White.png b/Assets/Female3DCG/BodyUpper/TapedHands/XLarge_White.png deleted file mode 100644 index 4dfba27d3..000000000 Binary files a/Assets/Female3DCG/BodyUpper/TapedHands/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/XLarge_Asian.png b/Assets/Female3DCG/BodyUpper/XLarge_Asian.png deleted file mode 100644 index 40f6ac8c4..000000000 Binary files a/Assets/Female3DCG/BodyUpper/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/XLarge_Black.png b/Assets/Female3DCG/BodyUpper/XLarge_Black.png deleted file mode 100644 index 25de81075..000000000 Binary files a/Assets/Female3DCG/BodyUpper/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/XLarge_White.png b/Assets/Female3DCG/BodyUpper/XLarge_White.png deleted file mode 100644 index cea9858bf..000000000 Binary files a/Assets/Female3DCG/BodyUpper/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/Large_Asian.png b/Assets/Female3DCG/BodyUpper/Yoked/Large_Asian.png deleted file mode 100644 index 25533fa54..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/Large_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/Large_Black.png b/Assets/Female3DCG/BodyUpper/Yoked/Large_Black.png deleted file mode 100644 index 66f86a6b8..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/Large_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/Large_White.png b/Assets/Female3DCG/BodyUpper/Yoked/Large_White.png deleted file mode 100644 index 2e2ab00b6..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/Normal_Asian.png b/Assets/Female3DCG/BodyUpper/Yoked/Normal_Asian.png deleted file mode 100644 index 851542728..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/Normal_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/Normal_Black.png b/Assets/Female3DCG/BodyUpper/Yoked/Normal_Black.png deleted file mode 100644 index bd92fc778..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/Normal_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/Normal_White.png b/Assets/Female3DCG/BodyUpper/Yoked/Normal_White.png deleted file mode 100644 index 49d565110..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/Small_Asian.png b/Assets/Female3DCG/BodyUpper/Yoked/Small_Asian.png deleted file mode 100644 index de65606be..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/Small_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/Small_Black.png b/Assets/Female3DCG/BodyUpper/Yoked/Small_Black.png deleted file mode 100644 index e4dba9a7f..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/Small_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/Small_White.png b/Assets/Female3DCG/BodyUpper/Yoked/Small_White.png deleted file mode 100644 index cce6d09e1..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/XLarge_Asian.png b/Assets/Female3DCG/BodyUpper/Yoked/XLarge_Asian.png deleted file mode 100644 index edd3b160c..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/XLarge_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/XLarge_Black.png b/Assets/Female3DCG/BodyUpper/Yoked/XLarge_Black.png deleted file mode 100644 index 8c47f1ce7..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/XLarge_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/BodyUpper/Yoked/XLarge_White.png b/Assets/Female3DCG/BodyUpper/Yoked/XLarge_White.png deleted file mode 100644 index 6b8a08b8b..000000000 Binary files a/Assets/Female3DCG/BodyUpper/Yoked/XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bandeau1_Large.png b/Assets/Female3DCG/Bra/Bandeau1_Large.png deleted file mode 100644 index 74cc4a75d..000000000 Binary files a/Assets/Female3DCG/Bra/Bandeau1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bandeau1_Normal.png b/Assets/Female3DCG/Bra/Bandeau1_Normal.png deleted file mode 100644 index 0ee87e894..000000000 Binary files a/Assets/Female3DCG/Bra/Bandeau1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bandeau1_Small.png b/Assets/Female3DCG/Bra/Bandeau1_Small.png deleted file mode 100644 index 18766476a..000000000 Binary files a/Assets/Female3DCG/Bra/Bandeau1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bandeau1_XLarge.png b/Assets/Female3DCG/Bra/Bandeau1_XLarge.png deleted file mode 100644 index 3e377f8a3..000000000 Binary files a/Assets/Female3DCG/Bra/Bandeau1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bikini1_Large.png b/Assets/Female3DCG/Bra/Bikini1_Large.png deleted file mode 100644 index 800b2b86d..000000000 Binary files a/Assets/Female3DCG/Bra/Bikini1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bikini1_Normal.png b/Assets/Female3DCG/Bra/Bikini1_Normal.png deleted file mode 100644 index 195b72b0a..000000000 Binary files a/Assets/Female3DCG/Bra/Bikini1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bikini1_Small.png b/Assets/Female3DCG/Bra/Bikini1_Small.png deleted file mode 100644 index 80a22b236..000000000 Binary files a/Assets/Female3DCG/Bra/Bikini1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bikini1_XLarge.png b/Assets/Female3DCG/Bra/Bikini1_XLarge.png deleted file mode 100644 index f725a356b..000000000 Binary files a/Assets/Female3DCG/Bra/Bikini1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/BondageBra1_Large.png b/Assets/Female3DCG/Bra/BondageBra1_Large.png deleted file mode 100644 index 81be939ab..000000000 Binary files a/Assets/Female3DCG/Bra/BondageBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/BondageBra1_Normal.png b/Assets/Female3DCG/Bra/BondageBra1_Normal.png deleted file mode 100644 index 040617dd4..000000000 Binary files a/Assets/Female3DCG/Bra/BondageBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/BondageBra1_Small.png b/Assets/Female3DCG/Bra/BondageBra1_Small.png deleted file mode 100644 index 027fef078..000000000 Binary files a/Assets/Female3DCG/Bra/BondageBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/BondageBra1_XLarge.png b/Assets/Female3DCG/Bra/BondageBra1_XLarge.png deleted file mode 100644 index 5c1f89c01..000000000 Binary files a/Assets/Female3DCG/Bra/BondageBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra10_Large.png b/Assets/Female3DCG/Bra/Bra10_Large.png deleted file mode 100644 index feaaf4ce5..000000000 Binary files a/Assets/Female3DCG/Bra/Bra10_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra10_Normal.png b/Assets/Female3DCG/Bra/Bra10_Normal.png deleted file mode 100644 index 149ec8843..000000000 Binary files a/Assets/Female3DCG/Bra/Bra10_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra10_Small.png b/Assets/Female3DCG/Bra/Bra10_Small.png deleted file mode 100644 index 521b1b64c..000000000 Binary files a/Assets/Female3DCG/Bra/Bra10_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra10_XLarge.png b/Assets/Female3DCG/Bra/Bra10_XLarge.png deleted file mode 100644 index 12ca02eeb..000000000 Binary files a/Assets/Female3DCG/Bra/Bra10_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra1_Large.png b/Assets/Female3DCG/Bra/Bra1_Large.png deleted file mode 100644 index d8fab4090..000000000 Binary files a/Assets/Female3DCG/Bra/Bra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra1_Normal.png b/Assets/Female3DCG/Bra/Bra1_Normal.png deleted file mode 100644 index 1f54ac294..000000000 Binary files a/Assets/Female3DCG/Bra/Bra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra1_Small.png b/Assets/Female3DCG/Bra/Bra1_Small.png deleted file mode 100644 index f08321373..000000000 Binary files a/Assets/Female3DCG/Bra/Bra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra1_XLarge.png b/Assets/Female3DCG/Bra/Bra1_XLarge.png deleted file mode 100644 index 1f7040248..000000000 Binary files a/Assets/Female3DCG/Bra/Bra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra2_Large.png b/Assets/Female3DCG/Bra/Bra2_Large.png deleted file mode 100644 index a72075a3d..000000000 Binary files a/Assets/Female3DCG/Bra/Bra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra2_Normal.png b/Assets/Female3DCG/Bra/Bra2_Normal.png deleted file mode 100644 index 800a27818..000000000 Binary files a/Assets/Female3DCG/Bra/Bra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra2_Small.png b/Assets/Female3DCG/Bra/Bra2_Small.png deleted file mode 100644 index ab0781bd4..000000000 Binary files a/Assets/Female3DCG/Bra/Bra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra2_XLarge.png b/Assets/Female3DCG/Bra/Bra2_XLarge.png deleted file mode 100644 index 4bd657add..000000000 Binary files a/Assets/Female3DCG/Bra/Bra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra7_Large.png b/Assets/Female3DCG/Bra/Bra7_Large.png deleted file mode 100644 index 976c6c715..000000000 Binary files a/Assets/Female3DCG/Bra/Bra7_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra7_Normal.png b/Assets/Female3DCG/Bra/Bra7_Normal.png deleted file mode 100644 index 30368df25..000000000 Binary files a/Assets/Female3DCG/Bra/Bra7_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra7_Small.png b/Assets/Female3DCG/Bra/Bra7_Small.png deleted file mode 100644 index a965a283f..000000000 Binary files a/Assets/Female3DCG/Bra/Bra7_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra7_XLarge.png b/Assets/Female3DCG/Bra/Bra7_XLarge.png deleted file mode 100644 index 8239ce496..000000000 Binary files a/Assets/Female3DCG/Bra/Bra7_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra8_Large.png b/Assets/Female3DCG/Bra/Bra8_Large.png deleted file mode 100644 index ebd849e98..000000000 Binary files a/Assets/Female3DCG/Bra/Bra8_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra8_Normal.png b/Assets/Female3DCG/Bra/Bra8_Normal.png deleted file mode 100644 index b022374c0..000000000 Binary files a/Assets/Female3DCG/Bra/Bra8_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra8_Small.png b/Assets/Female3DCG/Bra/Bra8_Small.png deleted file mode 100644 index fea0b4e43..000000000 Binary files a/Assets/Female3DCG/Bra/Bra8_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra8_XLarge.png b/Assets/Female3DCG/Bra/Bra8_XLarge.png deleted file mode 100644 index 52f6452ef..000000000 Binary files a/Assets/Female3DCG/Bra/Bra8_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra9_Large.png b/Assets/Female3DCG/Bra/Bra9_Large.png deleted file mode 100644 index 0c1d63052..000000000 Binary files a/Assets/Female3DCG/Bra/Bra9_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra9_Normal.png b/Assets/Female3DCG/Bra/Bra9_Normal.png deleted file mode 100644 index ed3560463..000000000 Binary files a/Assets/Female3DCG/Bra/Bra9_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra9_Small.png b/Assets/Female3DCG/Bra/Bra9_Small.png deleted file mode 100644 index 0d518e973..000000000 Binary files a/Assets/Female3DCG/Bra/Bra9_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bra9_XLarge.png b/Assets/Female3DCG/Bra/Bra9_XLarge.png deleted file mode 100644 index ba552ee0b..000000000 Binary files a/Assets/Female3DCG/Bra/Bra9_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/BunnySuit_Large.png b/Assets/Female3DCG/Bra/BunnySuit_Large.png deleted file mode 100644 index b7dea74db..000000000 Binary files a/Assets/Female3DCG/Bra/BunnySuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/BunnySuit_Normal.png b/Assets/Female3DCG/Bra/BunnySuit_Normal.png deleted file mode 100644 index 93d18e66c..000000000 Binary files a/Assets/Female3DCG/Bra/BunnySuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/BunnySuit_Small.png b/Assets/Female3DCG/Bra/BunnySuit_Small.png deleted file mode 100644 index dd279e9cf..000000000 Binary files a/Assets/Female3DCG/Bra/BunnySuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/BunnySuit_XLarge.png b/Assets/Female3DCG/Bra/BunnySuit_XLarge.png deleted file mode 100644 index 04d86de58..000000000 Binary files a/Assets/Female3DCG/Bra/BunnySuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bustier1_Large.png b/Assets/Female3DCG/Bra/Bustier1_Large.png deleted file mode 100644 index 6dcb9d8a2..000000000 Binary files a/Assets/Female3DCG/Bra/Bustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bustier1_Normal.png b/Assets/Female3DCG/Bra/Bustier1_Normal.png deleted file mode 100644 index 2b8f6623d..000000000 Binary files a/Assets/Female3DCG/Bra/Bustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bustier1_Small.png b/Assets/Female3DCG/Bra/Bustier1_Small.png deleted file mode 100644 index b1997a3bb..000000000 Binary files a/Assets/Female3DCG/Bra/Bustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Bustier1_XLarge.png b/Assets/Female3DCG/Bra/Bustier1_XLarge.png deleted file mode 100644 index a8699a9c4..000000000 Binary files a/Assets/Female3DCG/Bra/Bustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Camisole_Large.png b/Assets/Female3DCG/Bra/Camisole_Large.png deleted file mode 100644 index d058bc313..000000000 Binary files a/Assets/Female3DCG/Bra/Camisole_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Camisole_Normal.png b/Assets/Female3DCG/Bra/Camisole_Normal.png deleted file mode 100644 index d3bde8538..000000000 Binary files a/Assets/Female3DCG/Bra/Camisole_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Camisole_Small.png b/Assets/Female3DCG/Bra/Camisole_Small.png deleted file mode 100644 index 3a7ad6427..000000000 Binary files a/Assets/Female3DCG/Bra/Camisole_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Camisole_XLarge.png b/Assets/Female3DCG/Bra/Camisole_XLarge.png deleted file mode 100644 index 413bf10fe..000000000 Binary files a/Assets/Female3DCG/Bra/Camisole_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/ChineseBra1_Large.png b/Assets/Female3DCG/Bra/ChineseBra1_Large.png deleted file mode 100644 index 060fc11d2..000000000 Binary files a/Assets/Female3DCG/Bra/ChineseBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/ChineseBra1_Normal.png b/Assets/Female3DCG/Bra/ChineseBra1_Normal.png deleted file mode 100644 index e597f2c92..000000000 Binary files a/Assets/Female3DCG/Bra/ChineseBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/ChineseBra1_Small.png b/Assets/Female3DCG/Bra/ChineseBra1_Small.png deleted file mode 100644 index edd67fadb..000000000 Binary files a/Assets/Female3DCG/Bra/ChineseBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/ChineseBra1_XLarge.png b/Assets/Female3DCG/Bra/ChineseBra1_XLarge.png deleted file mode 100644 index 4f1b0aeab..000000000 Binary files a/Assets/Female3DCG/Bra/ChineseBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/ClamShell_Large.png b/Assets/Female3DCG/Bra/ClamShell_Large.png deleted file mode 100644 index 5abca4f6a..000000000 Binary files a/Assets/Female3DCG/Bra/ClamShell_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/ClamShell_Normal.png b/Assets/Female3DCG/Bra/ClamShell_Normal.png deleted file mode 100644 index 52c173ebd..000000000 Binary files a/Assets/Female3DCG/Bra/ClamShell_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/ClamShell_Small.png b/Assets/Female3DCG/Bra/ClamShell_Small.png deleted file mode 100644 index 9d3558eba..000000000 Binary files a/Assets/Female3DCG/Bra/ClamShell_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/ClamShell_XLarge.png b/Assets/Female3DCG/Bra/ClamShell_XLarge.png deleted file mode 100644 index 301926ce2..000000000 Binary files a/Assets/Female3DCG/Bra/ClamShell_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CoconutBra_Large.png b/Assets/Female3DCG/Bra/CoconutBra_Large.png deleted file mode 100644 index b9edaa716..000000000 Binary files a/Assets/Female3DCG/Bra/CoconutBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CoconutBra_Normal.png b/Assets/Female3DCG/Bra/CoconutBra_Normal.png deleted file mode 100644 index f94e3ed71..000000000 Binary files a/Assets/Female3DCG/Bra/CoconutBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CoconutBra_Small.png b/Assets/Female3DCG/Bra/CoconutBra_Small.png deleted file mode 100644 index 88dacd3b4..000000000 Binary files a/Assets/Female3DCG/Bra/CoconutBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CoconutBra_XLarge.png b/Assets/Female3DCG/Bra/CoconutBra_XLarge.png deleted file mode 100644 index b9edaa716..000000000 Binary files a/Assets/Female3DCG/Bra/CoconutBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CorsetBikini1_Large.png b/Assets/Female3DCG/Bra/CorsetBikini1_Large.png deleted file mode 100644 index 3279e6da7..000000000 Binary files a/Assets/Female3DCG/Bra/CorsetBikini1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CorsetBikini1_Normal.png b/Assets/Female3DCG/Bra/CorsetBikini1_Normal.png deleted file mode 100644 index 181558fcd..000000000 Binary files a/Assets/Female3DCG/Bra/CorsetBikini1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CorsetBikini1_Small.png b/Assets/Female3DCG/Bra/CorsetBikini1_Small.png deleted file mode 100644 index cfa4d20ec..000000000 Binary files a/Assets/Female3DCG/Bra/CorsetBikini1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CorsetBikini1_XLarge.png b/Assets/Female3DCG/Bra/CorsetBikini1_XLarge.png deleted file mode 100644 index 7423f1544..000000000 Binary files a/Assets/Female3DCG/Bra/CorsetBikini1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CowPrintedBra_Large.png b/Assets/Female3DCG/Bra/CowPrintedBra_Large.png deleted file mode 100644 index 6c7e81bc8..000000000 Binary files a/Assets/Female3DCG/Bra/CowPrintedBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CowPrintedBra_Normal.png b/Assets/Female3DCG/Bra/CowPrintedBra_Normal.png deleted file mode 100644 index 2bd23eba7..000000000 Binary files a/Assets/Female3DCG/Bra/CowPrintedBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CowPrintedBra_Small.png b/Assets/Female3DCG/Bra/CowPrintedBra_Small.png deleted file mode 100644 index a7f0ebf22..000000000 Binary files a/Assets/Female3DCG/Bra/CowPrintedBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CowPrintedBra_XLarge.png b/Assets/Female3DCG/Bra/CowPrintedBra_XLarge.png deleted file mode 100644 index 3f915e282..000000000 Binary files a/Assets/Female3DCG/Bra/CowPrintedBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_LargeClosed_Main.png b/Assets/Female3DCG/Bra/CuteBikini1_LargeClosed_Main.png deleted file mode 100644 index 44a0fd6bc..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_LargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_LargeClosed_Sides.png b/Assets/Female3DCG/Bra/CuteBikini1_LargeClosed_Sides.png deleted file mode 100644 index e7dc29174..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_LargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_Large_Main.png b/Assets/Female3DCG/Bra/CuteBikini1_Large_Main.png deleted file mode 100644 index aa4f7300b..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_Large_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_Large_Sides.png b/Assets/Female3DCG/Bra/CuteBikini1_Large_Sides.png deleted file mode 100644 index e7dc29174..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_Large_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_NormalClosed_Main.png b/Assets/Female3DCG/Bra/CuteBikini1_NormalClosed_Main.png deleted file mode 100644 index a09f28aa9..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_NormalClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_NormalClosed_Sides.png b/Assets/Female3DCG/Bra/CuteBikini1_NormalClosed_Sides.png deleted file mode 100644 index ea937d847..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_NormalClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_Normal_Main.png b/Assets/Female3DCG/Bra/CuteBikini1_Normal_Main.png deleted file mode 100644 index 85226e7ba..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_Normal_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_Normal_Sides.png b/Assets/Female3DCG/Bra/CuteBikini1_Normal_Sides.png deleted file mode 100644 index ea937d847..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_Normal_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_SmallClosed_Main.png b/Assets/Female3DCG/Bra/CuteBikini1_SmallClosed_Main.png deleted file mode 100644 index 2dd143e7d..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_SmallClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_SmallClosed_Sides.png b/Assets/Female3DCG/Bra/CuteBikini1_SmallClosed_Sides.png deleted file mode 100644 index 847e9b773..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_SmallClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_Small_Main.png b/Assets/Female3DCG/Bra/CuteBikini1_Small_Main.png deleted file mode 100644 index fe4e7b01d..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_Small_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_Small_Sides.png b/Assets/Female3DCG/Bra/CuteBikini1_Small_Sides.png deleted file mode 100644 index 847e9b773..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_Small_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_XLargeClosed_Main.png b/Assets/Female3DCG/Bra/CuteBikini1_XLargeClosed_Main.png deleted file mode 100644 index 6423dd8b5..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_XLargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_XLargeClosed_Sides.png b/Assets/Female3DCG/Bra/CuteBikini1_XLargeClosed_Sides.png deleted file mode 100644 index ed74d7923..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_XLargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_XLarge_Main.png b/Assets/Female3DCG/Bra/CuteBikini1_XLarge_Main.png deleted file mode 100644 index 545de9817..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_XLarge_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/CuteBikini1_XLarge_Sides.png b/Assets/Female3DCG/Bra/CuteBikini1_XLarge_Sides.png deleted file mode 100644 index ed74d7923..000000000 Binary files a/Assets/Female3DCG/Bra/CuteBikini1_XLarge_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FishnetBikini1_Large.png b/Assets/Female3DCG/Bra/FishnetBikini1_Large.png deleted file mode 100644 index 27461f03b..000000000 Binary files a/Assets/Female3DCG/Bra/FishnetBikini1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FishnetBikini1_Normal.png b/Assets/Female3DCG/Bra/FishnetBikini1_Normal.png deleted file mode 100644 index 121b70c98..000000000 Binary files a/Assets/Female3DCG/Bra/FishnetBikini1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FishnetBikini1_Small.png b/Assets/Female3DCG/Bra/FishnetBikini1_Small.png deleted file mode 100644 index 4b064621c..000000000 Binary files a/Assets/Female3DCG/Bra/FishnetBikini1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FishnetBikini1_XLarge.png b/Assets/Female3DCG/Bra/FishnetBikini1_XLarge.png deleted file mode 100644 index 78cef4ae3..000000000 Binary files a/Assets/Female3DCG/Bra/FishnetBikini1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FlowerBra_Large_Bra.png b/Assets/Female3DCG/Bra/FlowerBra_Large_Bra.png deleted file mode 100644 index 431458ef7..000000000 Binary files a/Assets/Female3DCG/Bra/FlowerBra_Large_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FlowerBra_Large_Flowers.png b/Assets/Female3DCG/Bra/FlowerBra_Large_Flowers.png deleted file mode 100644 index e7be2164b..000000000 Binary files a/Assets/Female3DCG/Bra/FlowerBra_Large_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FlowerBra_Normal_Bra.png b/Assets/Female3DCG/Bra/FlowerBra_Normal_Bra.png deleted file mode 100644 index 64f348ab8..000000000 Binary files a/Assets/Female3DCG/Bra/FlowerBra_Normal_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FlowerBra_Normal_Flowers.png b/Assets/Female3DCG/Bra/FlowerBra_Normal_Flowers.png deleted file mode 100644 index 9924a7f17..000000000 Binary files a/Assets/Female3DCG/Bra/FlowerBra_Normal_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FlowerBra_Small_Bra.png b/Assets/Female3DCG/Bra/FlowerBra_Small_Bra.png deleted file mode 100644 index ab72162df..000000000 Binary files a/Assets/Female3DCG/Bra/FlowerBra_Small_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FlowerBra_Small_Flowers.png b/Assets/Female3DCG/Bra/FlowerBra_Small_Flowers.png deleted file mode 100644 index 4f3ea8dda..000000000 Binary files a/Assets/Female3DCG/Bra/FlowerBra_Small_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FlowerBra_XLarge_Bra.png b/Assets/Female3DCG/Bra/FlowerBra_XLarge_Bra.png deleted file mode 100644 index 74ad66bcb..000000000 Binary files a/Assets/Female3DCG/Bra/FlowerBra_XLarge_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FlowerBra_XLarge_Flowers.png b/Assets/Female3DCG/Bra/FlowerBra_XLarge_Flowers.png deleted file mode 100644 index f937c5561..000000000 Binary files a/Assets/Female3DCG/Bra/FlowerBra_XLarge_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FrameBra1_Large.png b/Assets/Female3DCG/Bra/FrameBra1_Large.png deleted file mode 100644 index fc1fac044..000000000 Binary files a/Assets/Female3DCG/Bra/FrameBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FrameBra1_Normal.png b/Assets/Female3DCG/Bra/FrameBra1_Normal.png deleted file mode 100644 index 96b92e788..000000000 Binary files a/Assets/Female3DCG/Bra/FrameBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FrameBra1_Small.png b/Assets/Female3DCG/Bra/FrameBra1_Small.png deleted file mode 100644 index 1e68e154f..000000000 Binary files a/Assets/Female3DCG/Bra/FrameBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FrameBra1_XLarge.png b/Assets/Female3DCG/Bra/FrameBra1_XLarge.png deleted file mode 100644 index fe3d0a520..000000000 Binary files a/Assets/Female3DCG/Bra/FrameBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FrameBra2_Large.png b/Assets/Female3DCG/Bra/FrameBra2_Large.png deleted file mode 100644 index c666b8979..000000000 Binary files a/Assets/Female3DCG/Bra/FrameBra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FrameBra2_Normal.png b/Assets/Female3DCG/Bra/FrameBra2_Normal.png deleted file mode 100644 index efbfd0f58..000000000 Binary files a/Assets/Female3DCG/Bra/FrameBra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FrameBra2_Small.png b/Assets/Female3DCG/Bra/FrameBra2_Small.png deleted file mode 100644 index e255ace01..000000000 Binary files a/Assets/Female3DCG/Bra/FrameBra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FrameBra2_XLarge.png b/Assets/Female3DCG/Bra/FrameBra2_XLarge.png deleted file mode 100644 index 40faf1a8e..000000000 Binary files a/Assets/Female3DCG/Bra/FrameBra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra2_Large_Bra.png b/Assets/Female3DCG/Bra/FullLatexBra2_Large_Bra.png deleted file mode 100644 index 0aaa55d6f..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra2_Large_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra2_Large_Shine.png b/Assets/Female3DCG/Bra/FullLatexBra2_Large_Shine.png deleted file mode 100644 index 3dde5ecb2..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra2_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra2_Normal_Bra.png b/Assets/Female3DCG/Bra/FullLatexBra2_Normal_Bra.png deleted file mode 100644 index 4e938d000..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra2_Normal_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra2_Normal_Shine.png b/Assets/Female3DCG/Bra/FullLatexBra2_Normal_Shine.png deleted file mode 100644 index a4c2383b9..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra2_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra2_Small_Bra.png b/Assets/Female3DCG/Bra/FullLatexBra2_Small_Bra.png deleted file mode 100644 index 5a277753b..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra2_Small_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra2_Small_Shine.png b/Assets/Female3DCG/Bra/FullLatexBra2_Small_Shine.png deleted file mode 100644 index dcccc39d0..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra2_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra2_XLarge_Bra.png b/Assets/Female3DCG/Bra/FullLatexBra2_XLarge_Bra.png deleted file mode 100644 index d8e095dc5..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra2_XLarge_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra2_XLarge_Shine.png b/Assets/Female3DCG/Bra/FullLatexBra2_XLarge_Shine.png deleted file mode 100644 index ada672652..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra2_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra_Large.png b/Assets/Female3DCG/Bra/FullLatexBra_Large.png deleted file mode 100644 index 2e5c20491..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra_Normal.png b/Assets/Female3DCG/Bra/FullLatexBra_Normal.png deleted file mode 100644 index 63879ff61..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra_Small.png b/Assets/Female3DCG/Bra/FullLatexBra_Small.png deleted file mode 100644 index b5aed43a9..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/FullLatexBra_XLarge.png b/Assets/Female3DCG/Bra/FullLatexBra_XLarge.png deleted file mode 100644 index 21a8046c8..000000000 Binary files a/Assets/Female3DCG/Bra/FullLatexBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_Large_Fabric.png b/Assets/Female3DCG/Bra/HaremBra_Large_Fabric.png deleted file mode 100644 index 5fa45698f..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_Large_Jewel.png b/Assets/Female3DCG/Bra/HaremBra_Large_Jewel.png deleted file mode 100644 index 523aa4b17..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_Large_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_Large_Straps.png b/Assets/Female3DCG/Bra/HaremBra_Large_Straps.png deleted file mode 100644 index 350ac2575..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_Normal_Fabric.png b/Assets/Female3DCG/Bra/HaremBra_Normal_Fabric.png deleted file mode 100644 index 4e9e0362c..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_Normal_Jewel.png b/Assets/Female3DCG/Bra/HaremBra_Normal_Jewel.png deleted file mode 100644 index 1cfb41bed..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_Normal_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_Normal_Straps.png b/Assets/Female3DCG/Bra/HaremBra_Normal_Straps.png deleted file mode 100644 index 57b0bc832..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_Small_Fabric.png b/Assets/Female3DCG/Bra/HaremBra_Small_Fabric.png deleted file mode 100644 index f62d7e832..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_Small_Jewel.png b/Assets/Female3DCG/Bra/HaremBra_Small_Jewel.png deleted file mode 100644 index 3c46edbe4..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_Small_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_Small_Straps.png b/Assets/Female3DCG/Bra/HaremBra_Small_Straps.png deleted file mode 100644 index 234cf3674..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_XLarge_Fabric.png b/Assets/Female3DCG/Bra/HaremBra_XLarge_Fabric.png deleted file mode 100644 index dee2c8940..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_XLarge_Jewel.png b/Assets/Female3DCG/Bra/HaremBra_XLarge_Jewel.png deleted file mode 100644 index 1f5493f05..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_XLarge_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HaremBra_XLarge_Straps.png b/Assets/Female3DCG/Bra/HaremBra_XLarge_Straps.png deleted file mode 100644 index 0de868cce..000000000 Binary files a/Assets/Female3DCG/Bra/HaremBra_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HarnessBra1_Large.png b/Assets/Female3DCG/Bra/HarnessBra1_Large.png deleted file mode 100644 index abfad1eff..000000000 Binary files a/Assets/Female3DCG/Bra/HarnessBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HarnessBra1_Normal.png b/Assets/Female3DCG/Bra/HarnessBra1_Normal.png deleted file mode 100644 index b97b6ed02..000000000 Binary files a/Assets/Female3DCG/Bra/HarnessBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HarnessBra1_Small.png b/Assets/Female3DCG/Bra/HarnessBra1_Small.png deleted file mode 100644 index e2e8eb23c..000000000 Binary files a/Assets/Female3DCG/Bra/HarnessBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HarnessBra1_XLarge.png b/Assets/Female3DCG/Bra/HarnessBra1_XLarge.png deleted file mode 100644 index bae1616ce..000000000 Binary files a/Assets/Female3DCG/Bra/HarnessBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HarnessBra2_Large.png b/Assets/Female3DCG/Bra/HarnessBra2_Large.png deleted file mode 100644 index 6cdfa1b23..000000000 Binary files a/Assets/Female3DCG/Bra/HarnessBra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HarnessBra2_Normal.png b/Assets/Female3DCG/Bra/HarnessBra2_Normal.png deleted file mode 100644 index a919e27fe..000000000 Binary files a/Assets/Female3DCG/Bra/HarnessBra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HarnessBra2_Small.png b/Assets/Female3DCG/Bra/HarnessBra2_Small.png deleted file mode 100644 index cca210036..000000000 Binary files a/Assets/Female3DCG/Bra/HarnessBra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HarnessBra2_XLarge.png b/Assets/Female3DCG/Bra/HarnessBra2_XLarge.png deleted file mode 100644 index 36b360de3..000000000 Binary files a/Assets/Female3DCG/Bra/HarnessBra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HeartTop_Large.png b/Assets/Female3DCG/Bra/HeartTop_Large.png deleted file mode 100644 index 59b104578..000000000 Binary files a/Assets/Female3DCG/Bra/HeartTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HeartTop_Normal.png b/Assets/Female3DCG/Bra/HeartTop_Normal.png deleted file mode 100644 index f146a8985..000000000 Binary files a/Assets/Female3DCG/Bra/HeartTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HeartTop_Small.png b/Assets/Female3DCG/Bra/HeartTop_Small.png deleted file mode 100644 index b01ca0c4c..000000000 Binary files a/Assets/Female3DCG/Bra/HeartTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/HeartTop_XLarge.png b/Assets/Female3DCG/Bra/HeartTop_XLarge.png deleted file mode 100644 index 2d38ecc97..000000000 Binary files a/Assets/Female3DCG/Bra/HeartTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bandeau1_Large.png b/Assets/Female3DCG/Bra/Hogtied/Bandeau1_Large.png deleted file mode 100644 index 847c3a5b5..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bandeau1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bandeau1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Bandeau1_Normal.png deleted file mode 100644 index baa508e94..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bandeau1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bandeau1_Small.png b/Assets/Female3DCG/Bra/Hogtied/Bandeau1_Small.png deleted file mode 100644 index 7616999df..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bandeau1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bandeau1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Bandeau1_XLarge.png deleted file mode 100644 index ca04422da..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bandeau1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/BondageBra1_Large.png b/Assets/Female3DCG/Bra/Hogtied/BondageBra1_Large.png deleted file mode 100644 index 1fbd0bcea..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/BondageBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/BondageBra1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/BondageBra1_Normal.png deleted file mode 100644 index f74c77f44..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/BondageBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/BondageBra1_Small.png b/Assets/Female3DCG/Bra/Hogtied/BondageBra1_Small.png deleted file mode 100644 index 88ea10e83..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/BondageBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/BondageBra1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/BondageBra1_XLarge.png deleted file mode 100644 index 46b4b577a..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/BondageBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra10_Large.png b/Assets/Female3DCG/Bra/Hogtied/Bra10_Large.png deleted file mode 100644 index 40ef0f9f6..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra10_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra10_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Bra10_Normal.png deleted file mode 100644 index f4b19a23e..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra10_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra10_Small.png b/Assets/Female3DCG/Bra/Hogtied/Bra10_Small.png deleted file mode 100644 index 828a10697..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra10_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra10_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Bra10_XLarge.png deleted file mode 100644 index eaf950c8b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra10_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra1_Large.png b/Assets/Female3DCG/Bra/Hogtied/Bra1_Large.png deleted file mode 100644 index d8fab4090..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Bra1_Normal.png deleted file mode 100644 index 1f54ac294..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra1_Small.png b/Assets/Female3DCG/Bra/Hogtied/Bra1_Small.png deleted file mode 100644 index f08321373..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Bra1_XLarge.png deleted file mode 100644 index 1f7040248..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra2_Large.png b/Assets/Female3DCG/Bra/Hogtied/Bra2_Large.png deleted file mode 100644 index a72075a3d..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra2_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Bra2_Normal.png deleted file mode 100644 index 800a27818..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra2_Small.png b/Assets/Female3DCG/Bra/Hogtied/Bra2_Small.png deleted file mode 100644 index ab0781bd4..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra2_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Bra2_XLarge.png deleted file mode 100644 index 4bd657add..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra7_Large.png b/Assets/Female3DCG/Bra/Hogtied/Bra7_Large.png deleted file mode 100644 index 976c6c715..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra7_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra7_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Bra7_Normal.png deleted file mode 100644 index 43e644566..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra7_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra7_Small.png b/Assets/Female3DCG/Bra/Hogtied/Bra7_Small.png deleted file mode 100644 index d727933ff..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra7_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra7_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Bra7_XLarge.png deleted file mode 100644 index 8239ce496..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra7_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra8_Large.png b/Assets/Female3DCG/Bra/Hogtied/Bra8_Large.png deleted file mode 100644 index ebd849e98..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra8_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra8_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Bra8_Normal.png deleted file mode 100644 index b022374c0..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra8_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra8_Small.png b/Assets/Female3DCG/Bra/Hogtied/Bra8_Small.png deleted file mode 100644 index fea0b4e43..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra8_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra8_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Bra8_XLarge.png deleted file mode 100644 index 52f6452ef..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra8_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra9_Large.png b/Assets/Female3DCG/Bra/Hogtied/Bra9_Large.png deleted file mode 100644 index 0c1d63052..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra9_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra9_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Bra9_Normal.png deleted file mode 100644 index ed3560463..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra9_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra9_Small.png b/Assets/Female3DCG/Bra/Hogtied/Bra9_Small.png deleted file mode 100644 index 9c7738ecf..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra9_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bra9_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Bra9_XLarge.png deleted file mode 100644 index ba552ee0b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bra9_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/BunnySuit_Large.png b/Assets/Female3DCG/Bra/Hogtied/BunnySuit_Large.png deleted file mode 100644 index 68def275c..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/BunnySuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/BunnySuit_Normal.png b/Assets/Female3DCG/Bra/Hogtied/BunnySuit_Normal.png deleted file mode 100644 index eb92a6ad8..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/BunnySuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/BunnySuit_Small.png b/Assets/Female3DCG/Bra/Hogtied/BunnySuit_Small.png deleted file mode 100644 index 62da6d652..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/BunnySuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/BunnySuit_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/BunnySuit_XLarge.png deleted file mode 100644 index 7a3c30ecc..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/BunnySuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bustier1_Large.png b/Assets/Female3DCG/Bra/Hogtied/Bustier1_Large.png deleted file mode 100644 index 20aa95e81..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bustier1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Bustier1_Normal.png deleted file mode 100644 index 7aa4cd7c4..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bustier1_Small.png b/Assets/Female3DCG/Bra/Hogtied/Bustier1_Small.png deleted file mode 100644 index 0547e696a..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Bustier1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Bustier1_XLarge.png deleted file mode 100644 index bd2ed136e..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Bustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Camisole_Large.png b/Assets/Female3DCG/Bra/Hogtied/Camisole_Large.png deleted file mode 100644 index 976c6c715..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Camisole_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Camisole_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Camisole_Normal.png deleted file mode 100644 index 43e644566..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Camisole_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Camisole_Small.png b/Assets/Female3DCG/Bra/Hogtied/Camisole_Small.png deleted file mode 100644 index d727933ff..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Camisole_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Camisole_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Camisole_XLarge.png deleted file mode 100644 index 8239ce496..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Camisole_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_Large.png b/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_Large.png deleted file mode 100644 index 060fc11d2..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_Normal.png deleted file mode 100644 index e597f2c92..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_Small.png b/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_Small.png deleted file mode 100644 index edd67fadb..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_XLarge.png deleted file mode 100644 index 4f1b0aeab..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/ChineseBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/ClamShell_Large.png b/Assets/Female3DCG/Bra/Hogtied/ClamShell_Large.png deleted file mode 100644 index 5abca4f6a..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/ClamShell_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/ClamShell_Normal.png b/Assets/Female3DCG/Bra/Hogtied/ClamShell_Normal.png deleted file mode 100644 index 52c173ebd..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/ClamShell_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/ClamShell_Small.png b/Assets/Female3DCG/Bra/Hogtied/ClamShell_Small.png deleted file mode 100644 index 9d3558eba..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/ClamShell_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/ClamShell_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/ClamShell_XLarge.png deleted file mode 100644 index 301926ce2..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/ClamShell_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_Large.png b/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_Large.png deleted file mode 100644 index d1004823e..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_Normal.png deleted file mode 100644 index 3e11b99e5..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_Small.png b/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_Small.png deleted file mode 100644 index a72e1e9e3..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_XLarge.png deleted file mode 100644 index cbc9a0d98..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CorsetBikini1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_Large.png b/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_Large.png deleted file mode 100644 index 6c7e81bc8..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_Normal.png b/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_Normal.png deleted file mode 100644 index 2bd23eba7..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_Small.png b/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_Small.png deleted file mode 100644 index a7f0ebf22..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_XLarge.png deleted file mode 100644 index 3f915e282..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CowPrintedBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_LargeClosed_Main.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_LargeClosed_Main.png deleted file mode 100644 index b4eeb76af..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_LargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_LargeClosed_Sides.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_LargeClosed_Sides.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_LargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Large_Main.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Large_Main.png deleted file mode 100644 index b4eeb76af..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Large_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Large_Sides.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Large_Sides.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Large_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_NormalClosed_Main.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_NormalClosed_Main.png deleted file mode 100644 index 134633b52..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_NormalClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_NormalClosed_Sides.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_NormalClosed_Sides.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_NormalClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Normal_Main.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Normal_Main.png deleted file mode 100644 index 134633b52..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Normal_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Normal_Sides.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Normal_Sides.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Normal_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_SmallClosed_Main.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_SmallClosed_Main.png deleted file mode 100644 index d81152b67..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_SmallClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_SmallClosed_Sides.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_SmallClosed_Sides.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_SmallClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Small_Main.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Small_Main.png deleted file mode 100644 index d81152b67..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Small_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Small_Sides.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Small_Sides.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_Small_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLargeClosed_Main.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLargeClosed_Main.png deleted file mode 100644 index a7bc39bb3..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLargeClosed_Sides.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLargeClosed_Sides.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLarge_Main.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLarge_Main.png deleted file mode 100644 index a7bc39bb3..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLarge_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLarge_Sides.png b/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLarge_Sides.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/CuteBikini1_XLarge_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_Large.png b/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_Large.png deleted file mode 100644 index 790b2256a..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_Normal.png deleted file mode 100644 index 4d1cbf1d3..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_Small.png b/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_Small.png deleted file mode 100644 index d2b7f6ff6..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_XLarge.png deleted file mode 100644 index 18e3170a6..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FishnetBikini1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Large_Bra.png b/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Large_Bra.png deleted file mode 100644 index 431458ef7..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Large_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Large_Flowers.png b/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Large_Flowers.png deleted file mode 100644 index e7be2164b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Large_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Normal_Bra.png b/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Normal_Bra.png deleted file mode 100644 index 64f348ab8..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Normal_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Normal_Flowers.png b/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Normal_Flowers.png deleted file mode 100644 index 9924a7f17..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Normal_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Small_Bra.png b/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Small_Bra.png deleted file mode 100644 index ab72162df..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Small_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Small_Flowers.png b/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Small_Flowers.png deleted file mode 100644 index 4f3ea8dda..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_Small_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_XLarge_Bra.png b/Assets/Female3DCG/Bra/Hogtied/FlowerBra_XLarge_Bra.png deleted file mode 100644 index 74ad66bcb..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_XLarge_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_XLarge_Flowers.png b/Assets/Female3DCG/Bra/Hogtied/FlowerBra_XLarge_Flowers.png deleted file mode 100644 index f937c5561..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FlowerBra_XLarge_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FrameBra1_Large.png b/Assets/Female3DCG/Bra/Hogtied/FrameBra1_Large.png deleted file mode 100644 index fc1fac044..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FrameBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FrameBra1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/FrameBra1_Normal.png deleted file mode 100644 index 96b92e788..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FrameBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FrameBra1_Small.png b/Assets/Female3DCG/Bra/Hogtied/FrameBra1_Small.png deleted file mode 100644 index 1e68e154f..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FrameBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FrameBra1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/FrameBra1_XLarge.png deleted file mode 100644 index fe3d0a520..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FrameBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FrameBra2_Large.png b/Assets/Female3DCG/Bra/Hogtied/FrameBra2_Large.png deleted file mode 100644 index c666b8979..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FrameBra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FrameBra2_Normal.png b/Assets/Female3DCG/Bra/Hogtied/FrameBra2_Normal.png deleted file mode 100644 index efbfd0f58..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FrameBra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FrameBra2_Small.png b/Assets/Female3DCG/Bra/Hogtied/FrameBra2_Small.png deleted file mode 100644 index e255ace01..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FrameBra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FrameBra2_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/FrameBra2_XLarge.png deleted file mode 100644 index 40faf1a8e..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FrameBra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_Large.png b/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_Large.png deleted file mode 100644 index e0b778be9..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_Normal.png b/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_Normal.png deleted file mode 100644 index 59298f231..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_Small.png b/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_Small.png deleted file mode 100644 index deb638864..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_XLarge.png deleted file mode 100644 index 08107691d..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/FullLatexBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Large_Fabric.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_Large_Fabric.png deleted file mode 100644 index 309b61f75..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Large_Jewel.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_Large_Jewel.png deleted file mode 100644 index 97d6507e1..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Large_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Large_Straps.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_Large_Straps.png deleted file mode 100644 index 61b8f625d..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Normal_Fabric.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_Normal_Fabric.png deleted file mode 100644 index a565b0848..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Normal_Jewel.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_Normal_Jewel.png deleted file mode 100644 index fe7620b01..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Normal_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Normal_Straps.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_Normal_Straps.png deleted file mode 100644 index 6add6f786..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Small_Fabric.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_Small_Fabric.png deleted file mode 100644 index 917227c9a..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Small_Jewel.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_Small_Jewel.png deleted file mode 100644 index ea4d25a08..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Small_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Small_Straps.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_Small_Straps.png deleted file mode 100644 index 5a1fd41bd..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_XLarge_Fabric.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_XLarge_Fabric.png deleted file mode 100644 index caae4fac8..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_XLarge_Jewel.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_XLarge_Jewel.png deleted file mode 100644 index a3691f8d2..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_XLarge_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HaremBra_XLarge_Straps.png b/Assets/Female3DCG/Bra/Hogtied/HaremBra_XLarge_Straps.png deleted file mode 100644 index d6199a90c..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HaremBra_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_Large.png b/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_Large.png deleted file mode 100644 index abfad1eff..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_Normal.png deleted file mode 100644 index b97b6ed02..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_Small.png b/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_Small.png deleted file mode 100644 index e2e8eb23c..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_XLarge.png deleted file mode 100644 index bae1616ce..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HarnessBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_Large.png b/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_Large.png deleted file mode 100644 index 16f97ce09..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_Normal.png b/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_Normal.png deleted file mode 100644 index e06010d25..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_Small.png b/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_Small.png deleted file mode 100644 index 1ced7e33f..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_XLarge.png deleted file mode 100644 index 5f7870d30..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HarnessBra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HeartTop_Large.png b/Assets/Female3DCG/Bra/Hogtied/HeartTop_Large.png deleted file mode 100644 index f82d4d7c2..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HeartTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HeartTop_Normal.png b/Assets/Female3DCG/Bra/Hogtied/HeartTop_Normal.png deleted file mode 100644 index fa4083f4b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HeartTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HeartTop_Small.png b/Assets/Female3DCG/Bra/Hogtied/HeartTop_Small.png deleted file mode 100644 index 8fc1cbf85..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HeartTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/HeartTop_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/HeartTop_XLarge.png deleted file mode 100644 index f75d05c34..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/HeartTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/KittyBra1_Large.png b/Assets/Female3DCG/Bra/Hogtied/KittyBra1_Large.png deleted file mode 100644 index 56dc21118..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/KittyBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/KittyBra1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/KittyBra1_Normal.png deleted file mode 100644 index 5195797ed..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/KittyBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/KittyBra1_Small.png b/Assets/Female3DCG/Bra/Hogtied/KittyBra1_Small.png deleted file mode 100644 index 7d94613e7..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/KittyBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/KittyBra1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/KittyBra1_XLarge.png deleted file mode 100644 index 20d77f48e..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/KittyBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/LatexBra1_Large.png b/Assets/Female3DCG/Bra/Hogtied/LatexBra1_Large.png deleted file mode 100644 index 6e749696b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/LatexBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/LatexBra1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/LatexBra1_Normal.png deleted file mode 100644 index f312ccaa2..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/LatexBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/LatexBra1_Small.png b/Assets/Female3DCG/Bra/Hogtied/LatexBra1_Small.png deleted file mode 100644 index 28a27ecba..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/LatexBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/LatexBra1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/LatexBra1_XLarge.png deleted file mode 100644 index 51edd87a9..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/LatexBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_Large.png b/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_Large.png deleted file mode 100644 index 1bb73a888..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_Normal.png deleted file mode 100644 index ee690bb2e..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_Small.png b/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_Small.png deleted file mode 100644 index 0f111b6a9..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_XLarge.png deleted file mode 100644 index 968813014..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/OuvertPerl1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_Large.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_Large.png deleted file mode 100644 index d62f9ee62..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_LargeBow.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_LargeBow.png deleted file mode 100644 index e55367773..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_LargeBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_LargeWrap.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_LargeWrap.png deleted file mode 100644 index caf390eda..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_LargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_Normal.png deleted file mode 100644 index 2e562d040..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_NormalBow.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_NormalBow.png deleted file mode 100644 index a3d04b834..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_NormalBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_NormalWrap.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_NormalWrap.png deleted file mode 100644 index c98c3b3d6..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_NormalWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_Small.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_Small.png deleted file mode 100644 index 9fbd25bff..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_SmallBow.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_SmallBow.png deleted file mode 100644 index e73e96e19..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_SmallBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_SmallWrap.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_SmallWrap.png deleted file mode 100644 index e4a8e97d4..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_SmallWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_XLarge.png deleted file mode 100644 index eb8ec0398..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_XLargeBow.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_XLargeBow.png deleted file mode 100644 index 20d5034da..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_XLargeBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Ribbons_XLargeWrap.png b/Assets/Female3DCG/Bra/Hogtied/Ribbons_XLargeWrap.png deleted file mode 100644 index 2f3f88bfc..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Ribbons_XLargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Sarashi1_Large.png b/Assets/Female3DCG/Bra/Hogtied/Sarashi1_Large.png deleted file mode 100644 index 335d31695..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Sarashi1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Sarashi1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Sarashi1_Normal.png deleted file mode 100644 index f7483aeb0..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Sarashi1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Sarashi1_Small.png b/Assets/Female3DCG/Bra/Hogtied/Sarashi1_Small.png deleted file mode 100644 index 47a77d89b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Sarashi1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Sarashi1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Sarashi1_XLarge.png deleted file mode 100644 index 050046ed6..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Sarashi1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_Large.png b/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_Large.png deleted file mode 100644 index 1b7091821..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_Normal.png deleted file mode 100644 index 8717f7390..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_Small.png b/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_Small.png deleted file mode 100644 index 83ab05261..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_XLarge.png deleted file mode 100644 index 04008809c..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBeachBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_LargeClosed_Main.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_LargeClosed_Main.png deleted file mode 100644 index d743a84b2..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_LargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_LargeClosed_Sides.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_LargeClosed_Sides.png deleted file mode 100644 index 620834472..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_LargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Large_Main.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Large_Main.png deleted file mode 100644 index d743a84b2..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Large_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Large_Sides.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Large_Sides.png deleted file mode 100644 index 620834472..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Large_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_NormalClosed_Main.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_NormalClosed_Main.png deleted file mode 100644 index c48bc15ce..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_NormalClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_NormalClosed_Sides.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_NormalClosed_Sides.png deleted file mode 100644 index 620834472..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_NormalClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Normal_Main.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Normal_Main.png deleted file mode 100644 index c48bc15ce..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Normal_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Normal_Sides.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Normal_Sides.png deleted file mode 100644 index 620834472..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Normal_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_SmallClosed_Main.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_SmallClosed_Main.png deleted file mode 100644 index 3f44ae0fa..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_SmallClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_SmallClosed_Sides.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_SmallClosed_Sides.png deleted file mode 100644 index 620834472..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_SmallClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Small_Main.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Small_Main.png deleted file mode 100644 index 3f44ae0fa..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Small_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Small_Sides.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Small_Sides.png deleted file mode 100644 index 620834472..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_Small_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLargeClosed_Main.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLargeClosed_Main.png deleted file mode 100644 index a8214e132..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLargeClosed_Sides.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLargeClosed_Sides.png deleted file mode 100644 index 620834472..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLarge_Main.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLarge_Main.png deleted file mode 100644 index a8214e132..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLarge_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLarge_Sides.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLarge_Sides.png deleted file mode 100644 index 620834472..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini1_XLarge_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_Large.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_Large.png deleted file mode 100644 index 35800aee8..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_Normal.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_Normal.png deleted file mode 100644 index 5b1ba8737..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_Small.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_Small.png deleted file mode 100644 index 94b8dff51..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_XLarge.png deleted file mode 100644 index 062d9f4a7..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_Large.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_Large.png deleted file mode 100644 index 3281cf7fd..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_Normal.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_Normal.png deleted file mode 100644 index 9d0bc6bf5..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_Small.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_Small.png deleted file mode 100644 index f6a996320..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_XLarge.png deleted file mode 100644 index 128939d4b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikini3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_Large.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_Large.png deleted file mode 100644 index 7e80591c2..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_Normal.png deleted file mode 100644 index abd815ed0..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_Small.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_Small.png deleted file mode 100644 index 172759615..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_XLarge.png deleted file mode 100644 index 8f4a48ffb..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SexyBikiniBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_Large.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_Large.png deleted file mode 100644 index 74ec3c633..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeBra1.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeBra1.png deleted file mode 100644 index 94d04c1ea..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeBra2.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeBra2.png deleted file mode 100644 index 99c510c8e..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeSwimsuit.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeSwimsuit.png deleted file mode 100644 index 8e85f261b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeSwimsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeWrap.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeWrap.png deleted file mode 100644 index 426f2ce27..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_LargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_Normal.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_Normal.png deleted file mode 100644 index 398977719..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalBra1.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalBra1.png deleted file mode 100644 index 40f6478d0..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalBra2.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalBra2.png deleted file mode 100644 index d359137b7..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalSwimsuit.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalSwimsuit.png deleted file mode 100644 index 3bc081700..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalSwimsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalWrap.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalWrap.png deleted file mode 100644 index 8aa89682c..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_NormalWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_Small.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_Small.png deleted file mode 100644 index f739a919a..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallBra1.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallBra1.png deleted file mode 100644 index f08566d65..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallBra2.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallBra2.png deleted file mode 100644 index d9494c2cb..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallSwimsuit.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallSwimsuit.png deleted file mode 100644 index 396defa0d..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallSwimsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallWrap.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallWrap.png deleted file mode 100644 index 085dcd94b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_SmallWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLarge.png deleted file mode 100644 index 87bb7bb2e..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeBra1.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeBra1.png deleted file mode 100644 index 31b0512a4..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeBra2.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeBra2.png deleted file mode 100644 index d48102af5..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeSwimsuit.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeSwimsuit.png deleted file mode 100644 index 8d2ee59da..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeSwimsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeWrap.png b/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeWrap.png deleted file mode 100644 index b18475eb2..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SilkStraps_XLargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Large_BreastShade.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Large_BreastShade.png deleted file mode 100644 index 98b97b6e6..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Large_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Large_Latex.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Large_Latex.png deleted file mode 100644 index a47257b11..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Large_Shine.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Large_Shine.png deleted file mode 100644 index 4662fa480..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Normal_BreastShade.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Normal_BreastShade.png deleted file mode 100644 index 6d8d35b45..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Normal_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Normal_Latex.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Normal_Latex.png deleted file mode 100644 index 4064bf88b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Normal_Shine.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Normal_Shine.png deleted file mode 100644 index 11f7cc82a..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Small_BreastShade.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Small_BreastShade.png deleted file mode 100644 index d78c5318e..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Small_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Small_Latex.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Small_Latex.png deleted file mode 100644 index 026531027..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Small_Shine.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Small_Shine.png deleted file mode 100644 index d3d63662f..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_XLarge_BreastShade.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_XLarge_BreastShade.png deleted file mode 100644 index 92c1bb0d4..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_XLarge_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_XLarge_Latex.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_XLarge_Latex.png deleted file mode 100644 index 9c2713147..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_XLarge_Shine.png b/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_XLarge_Shine.png deleted file mode 100644 index b4401785d..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/SleevelessSlimLatexLeotard_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_Large.png b/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_Large.png deleted file mode 100644 index ee6ea7a64..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_Normal.png b/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_Normal.png deleted file mode 100644 index 69f962d6c..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_Small.png b/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_Small.png deleted file mode 100644 index b5a241964..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_XLarge.png deleted file mode 100644 index 779204df5..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StarHarnessBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Large_Harness.png b/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Large_Harness.png deleted file mode 100644 index b7ffaa863..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Large_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Large_Metal.png b/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Large_Metal.png deleted file mode 100644 index 2b170d9d8..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Large_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Normal_Harness.png b/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Normal_Harness.png deleted file mode 100644 index 7a4921730..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Normal_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Normal_Metal.png b/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Normal_Metal.png deleted file mode 100644 index acd9cf5e9..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Normal_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Small_Harness.png b/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Small_Harness.png deleted file mode 100644 index d4ccef5f3..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Small_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Small_Metal.png b/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Small_Metal.png deleted file mode 100644 index a851a1d22..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_Small_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_XLarge_Harness.png b/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_XLarge_Harness.png deleted file mode 100644 index 535e162cc..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_XLarge_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_XLarge_Metal.png b/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_XLarge_Metal.png deleted file mode 100644 index 75af5fc8e..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/StuddedHarness_XLarge_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_Large.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_Large.png deleted file mode 100644 index f9763dc64..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_LargeDull.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_LargeDull.png deleted file mode 100644 index 0a94113ed..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_LargeDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_Normal.png deleted file mode 100644 index b5b9c0cfc..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_NormalDull.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_NormalDull.png deleted file mode 100644 index 83e75c6b3..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_NormalDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_Small.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_Small.png deleted file mode 100644 index 3cd688acd..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_SmallDull.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_SmallDull.png deleted file mode 100644 index 51e443c48..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_SmallDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_XLarge.png deleted file mode 100644 index 315f6d7ad..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_XLargeDull.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_XLargeDull.png deleted file mode 100644 index 7410d0fcb..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit1_XLargeDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_Large.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_Large.png deleted file mode 100644 index 549d33523..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_Normal.png deleted file mode 100644 index 2a21c28e0..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_Small.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_Small.png deleted file mode 100644 index 16d07d68e..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_XLarge.png deleted file mode 100644 index e6ac44d1c..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_Large.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_Large.png deleted file mode 100644 index f8dc38997..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_Normal.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_Normal.png deleted file mode 100644 index b71a1d78b..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_Small.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_Small.png deleted file mode 100644 index 22e133f33..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_XLarge.png b/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_XLarge.png deleted file mode 100644 index f9405ee1a..000000000 Binary files a/Assets/Female3DCG/Bra/Hogtied/Swimsuit3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/KittyBra1_Large.png b/Assets/Female3DCG/Bra/KittyBra1_Large.png deleted file mode 100644 index 0680ffda2..000000000 Binary files a/Assets/Female3DCG/Bra/KittyBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/KittyBra1_Normal.png b/Assets/Female3DCG/Bra/KittyBra1_Normal.png deleted file mode 100644 index e760e84bd..000000000 Binary files a/Assets/Female3DCG/Bra/KittyBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/KittyBra1_Small.png b/Assets/Female3DCG/Bra/KittyBra1_Small.png deleted file mode 100644 index 456c58369..000000000 Binary files a/Assets/Female3DCG/Bra/KittyBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/KittyBra1_XLarge.png b/Assets/Female3DCG/Bra/KittyBra1_XLarge.png deleted file mode 100644 index 75a0b59e8..000000000 Binary files a/Assets/Female3DCG/Bra/KittyBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBra1_Large.png b/Assets/Female3DCG/Bra/LatexBra1_Large.png deleted file mode 100644 index 054c47332..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBra1_Normal.png b/Assets/Female3DCG/Bra/LatexBra1_Normal.png deleted file mode 100644 index aa9ffbb7d..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBra1_Small.png b/Assets/Female3DCG/Bra/LatexBra1_Small.png deleted file mode 100644 index 1dcaa4f9b..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBra1_XLarge.png b/Assets/Female3DCG/Bra/LatexBra1_XLarge.png deleted file mode 100644 index dc0e9f66d..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Large_Bottom.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Large_Bottom.png deleted file mode 100644 index 0d37737a3..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Large_Bottom.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Large_BottomShine.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Large_BottomShine.png deleted file mode 100644 index e141386f6..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Large_BottomShine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Large_Breasts.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Large_Breasts.png deleted file mode 100644 index ab1a3d7b5..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Large_Breasts.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Large_BreastsShine.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Large_BreastsShine.png deleted file mode 100644 index 4aa72a5d9..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Large_BreastsShine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Navel.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Navel.png deleted file mode 100644 index c3e737bf5..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Navel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_Bottom.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_Bottom.png deleted file mode 100644 index f2984d210..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_Bottom.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_BottomShine.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_BottomShine.png deleted file mode 100644 index 7c81e4c27..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_BottomShine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_Breasts.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_Breasts.png deleted file mode 100644 index 1e3612fa2..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_Breasts.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_BreastsShine.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_BreastsShine.png deleted file mode 100644 index 851fe281e..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Normal_BreastsShine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Small_Bottom.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Small_Bottom.png deleted file mode 100644 index ce99029d8..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Small_Bottom.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Small_BottomShine.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Small_BottomShine.png deleted file mode 100644 index 7c81e4c27..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Small_BottomShine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Small_Breasts.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Small_Breasts.png deleted file mode 100644 index 3b9723942..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Small_Breasts.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_Small_BreastsShine.png b/Assets/Female3DCG/Bra/LatexBunnySuit_Small_BreastsShine.png deleted file mode 100644 index 9ae895e19..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_Small_BreastsShine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_Bottom.png b/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_Bottom.png deleted file mode 100644 index c3f59f60d..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_Bottom.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_BottomShine.png b/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_BottomShine.png deleted file mode 100644 index e141386f6..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_BottomShine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_Breasts.png b/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_Breasts.png deleted file mode 100644 index 2c579906a..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_Breasts.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_BreastsShine.png b/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_BreastsShine.png deleted file mode 100644 index f98974b06..000000000 Binary files a/Assets/Female3DCG/Bra/LatexBunnySuit_XLarge_BreastsShine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LeatherBreastBinder_Large.png b/Assets/Female3DCG/Bra/LeatherBreastBinder_Large.png deleted file mode 100644 index 2438d424f..000000000 Binary files a/Assets/Female3DCG/Bra/LeatherBreastBinder_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LeatherBreastBinder_Normal.png b/Assets/Female3DCG/Bra/LeatherBreastBinder_Normal.png deleted file mode 100644 index 9fba1b806..000000000 Binary files a/Assets/Female3DCG/Bra/LeatherBreastBinder_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LeatherBreastBinder_Small.png b/Assets/Female3DCG/Bra/LeatherBreastBinder_Small.png deleted file mode 100644 index 839e45d85..000000000 Binary files a/Assets/Female3DCG/Bra/LeatherBreastBinder_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LeatherBreastBinder_XLarge.png b/Assets/Female3DCG/Bra/LeatherBreastBinder_XLarge.png deleted file mode 100644 index f6f8fb2f7..000000000 Binary files a/Assets/Female3DCG/Bra/LeatherBreastBinder_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LeatherStrapBra1_Large.png b/Assets/Female3DCG/Bra/LeatherStrapBra1_Large.png deleted file mode 100644 index 3850a1f00..000000000 Binary files a/Assets/Female3DCG/Bra/LeatherStrapBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LeatherStrapBra1_Normal.png b/Assets/Female3DCG/Bra/LeatherStrapBra1_Normal.png deleted file mode 100644 index a5c1a0e56..000000000 Binary files a/Assets/Female3DCG/Bra/LeatherStrapBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LeatherStrapBra1_Small.png b/Assets/Female3DCG/Bra/LeatherStrapBra1_Small.png deleted file mode 100644 index b36fdfcec..000000000 Binary files a/Assets/Female3DCG/Bra/LeatherStrapBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/LeatherStrapBra1_XLarge.png b/Assets/Female3DCG/Bra/LeatherStrapBra1_XLarge.png deleted file mode 100644 index 835068431..000000000 Binary files a/Assets/Female3DCG/Bra/LeatherStrapBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/MaidBra1_Large_Bra.png b/Assets/Female3DCG/Bra/MaidBra1_Large_Bra.png deleted file mode 100644 index 66cc8e1d2..000000000 Binary files a/Assets/Female3DCG/Bra/MaidBra1_Large_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/MaidBra1_Large_Frills.png b/Assets/Female3DCG/Bra/MaidBra1_Large_Frills.png deleted file mode 100644 index db423487a..000000000 Binary files a/Assets/Female3DCG/Bra/MaidBra1_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/MaidBra1_Normal_Bra.png b/Assets/Female3DCG/Bra/MaidBra1_Normal_Bra.png deleted file mode 100644 index e28c30f64..000000000 Binary files a/Assets/Female3DCG/Bra/MaidBra1_Normal_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/MaidBra1_Normal_Frills.png b/Assets/Female3DCG/Bra/MaidBra1_Normal_Frills.png deleted file mode 100644 index 7e2525808..000000000 Binary files a/Assets/Female3DCG/Bra/MaidBra1_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/MaidBra1_Small_Bra.png b/Assets/Female3DCG/Bra/MaidBra1_Small_Bra.png deleted file mode 100644 index 9bf477237..000000000 Binary files a/Assets/Female3DCG/Bra/MaidBra1_Small_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/MaidBra1_Small_Frills.png b/Assets/Female3DCG/Bra/MaidBra1_Small_Frills.png deleted file mode 100644 index be4952e1f..000000000 Binary files a/Assets/Female3DCG/Bra/MaidBra1_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/MaidBra1_XLarge_Bra.png b/Assets/Female3DCG/Bra/MaidBra1_XLarge_Bra.png deleted file mode 100644 index c86195114..000000000 Binary files a/Assets/Female3DCG/Bra/MaidBra1_XLarge_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/MaidBra1_XLarge_Frills.png b/Assets/Female3DCG/Bra/MaidBra1_XLarge_Frills.png deleted file mode 100644 index dbf1fda4c..000000000 Binary files a/Assets/Female3DCG/Bra/MaidBra1_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/OuvertPerl1_Large.png b/Assets/Female3DCG/Bra/OuvertPerl1_Large.png deleted file mode 100644 index 996e8e373..000000000 Binary files a/Assets/Female3DCG/Bra/OuvertPerl1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/OuvertPerl1_Normal.png b/Assets/Female3DCG/Bra/OuvertPerl1_Normal.png deleted file mode 100644 index 038290716..000000000 Binary files a/Assets/Female3DCG/Bra/OuvertPerl1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/OuvertPerl1_Small.png b/Assets/Female3DCG/Bra/OuvertPerl1_Small.png deleted file mode 100644 index 47e3c7eb1..000000000 Binary files a/Assets/Female3DCG/Bra/OuvertPerl1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/OuvertPerl1_XLarge.png b/Assets/Female3DCG/Bra/OuvertPerl1_XLarge.png deleted file mode 100644 index a69d709fd..000000000 Binary files a/Assets/Female3DCG/Bra/OuvertPerl1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Bandeau1.png b/Assets/Female3DCG/Bra/Preview/Bandeau1.png deleted file mode 100644 index f5b806740..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Bandeau1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Bikini1.png b/Assets/Female3DCG/Bra/Preview/Bikini1.png deleted file mode 100644 index 195b72b0a..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Bikini1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/BondageBra1.png b/Assets/Female3DCG/Bra/Preview/BondageBra1.png deleted file mode 100644 index 456542f27..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/BondageBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Bra1.png b/Assets/Female3DCG/Bra/Preview/Bra1.png deleted file mode 100644 index d8fab4090..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Bra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Bra10.png b/Assets/Female3DCG/Bra/Preview/Bra10.png deleted file mode 100644 index 92c491523..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Bra10.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Bra2.png b/Assets/Female3DCG/Bra/Preview/Bra2.png deleted file mode 100644 index a72075a3d..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Bra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Bra7.png b/Assets/Female3DCG/Bra/Preview/Bra7.png deleted file mode 100644 index 976c6c715..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Bra7.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Bra8.png b/Assets/Female3DCG/Bra/Preview/Bra8.png deleted file mode 100644 index 21de60048..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Bra8.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Bra9.png b/Assets/Female3DCG/Bra/Preview/Bra9.png deleted file mode 100644 index 01b2ee6ab..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Bra9.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/BunnySuit.png b/Assets/Female3DCG/Bra/Preview/BunnySuit.png deleted file mode 100644 index aec3720fc..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/BunnySuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Bustier1.png b/Assets/Female3DCG/Bra/Preview/Bustier1.png deleted file mode 100644 index 15f55ae60..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Bustier1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Camisole.png b/Assets/Female3DCG/Bra/Preview/Camisole.png deleted file mode 100644 index d5a8e3422..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Camisole.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/ChineseBra1.png b/Assets/Female3DCG/Bra/Preview/ChineseBra1.png deleted file mode 100644 index 011571cd2..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/ChineseBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/ClamShell.png b/Assets/Female3DCG/Bra/Preview/ClamShell.png deleted file mode 100644 index a71e0dde4..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/ClamShell.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/CoconutBra.png b/Assets/Female3DCG/Bra/Preview/CoconutBra.png deleted file mode 100644 index 18aa58358..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/CoconutBra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/CorsetBikini1.png b/Assets/Female3DCG/Bra/Preview/CorsetBikini1.png deleted file mode 100644 index f7dea048c..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/CorsetBikini1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/CowPrintedBra.png b/Assets/Female3DCG/Bra/Preview/CowPrintedBra.png deleted file mode 100644 index 6c10fec3b..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/CowPrintedBra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/CuteBikini1.png b/Assets/Female3DCG/Bra/Preview/CuteBikini1.png deleted file mode 100644 index 811a94ab2..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/CuteBikini1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/FishnetBikini1.png b/Assets/Female3DCG/Bra/Preview/FishnetBikini1.png deleted file mode 100644 index cb15be9ed..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/FishnetBikini1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/FlowerBra.png b/Assets/Female3DCG/Bra/Preview/FlowerBra.png deleted file mode 100644 index dd9072570..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/FlowerBra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/FrameBra1.png b/Assets/Female3DCG/Bra/Preview/FrameBra1.png deleted file mode 100644 index c19506027..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/FrameBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/FrameBra2.png b/Assets/Female3DCG/Bra/Preview/FrameBra2.png deleted file mode 100644 index 1a95112ad..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/FrameBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/FullLatexBra.png b/Assets/Female3DCG/Bra/Preview/FullLatexBra.png deleted file mode 100644 index f8e8df1b9..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/FullLatexBra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/FullLatexBra2.png b/Assets/Female3DCG/Bra/Preview/FullLatexBra2.png deleted file mode 100644 index b95b1f2bf..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/FullLatexBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/HaremBra.png b/Assets/Female3DCG/Bra/Preview/HaremBra.png deleted file mode 100644 index 4deff74bd..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/HaremBra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/HarnessBra1.png b/Assets/Female3DCG/Bra/Preview/HarnessBra1.png deleted file mode 100644 index 08be788a3..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/HarnessBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/HarnessBra2.png b/Assets/Female3DCG/Bra/Preview/HarnessBra2.png deleted file mode 100644 index c7f7f51f6..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/HarnessBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/HeartTop.png b/Assets/Female3DCG/Bra/Preview/HeartTop.png deleted file mode 100644 index 5b5977ea4..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/HeartTop.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/KittyBra1.png b/Assets/Female3DCG/Bra/Preview/KittyBra1.png deleted file mode 100644 index 75a0b59e8..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/KittyBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/LatexBra1.png b/Assets/Female3DCG/Bra/Preview/LatexBra1.png deleted file mode 100644 index 32e525f13..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/LatexBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/LatexBunnySuit.png b/Assets/Female3DCG/Bra/Preview/LatexBunnySuit.png deleted file mode 100644 index 21c7e093a..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/LatexBunnySuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/LeatherBreastBinder.png b/Assets/Female3DCG/Bra/Preview/LeatherBreastBinder.png deleted file mode 100644 index abdc1a90b..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/LeatherBreastBinder.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/LeatherStrapBra1.png b/Assets/Female3DCG/Bra/Preview/LeatherStrapBra1.png deleted file mode 100644 index 366788104..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/LeatherStrapBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/MaidBra1.png b/Assets/Female3DCG/Bra/Preview/MaidBra1.png deleted file mode 100644 index c46118131..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/MaidBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/OuvertPerl1.png b/Assets/Female3DCG/Bra/Preview/OuvertPerl1.png deleted file mode 100644 index 22e3851c8..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/OuvertPerl1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Ribbons.png b/Assets/Female3DCG/Bra/Preview/Ribbons.png deleted file mode 100644 index 7d3f73b67..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Ribbons.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Sarashi1.png b/Assets/Female3DCG/Bra/Preview/Sarashi1.png deleted file mode 100644 index 947b6afc2..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Sarashi1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/SexyBeachBra1.png b/Assets/Female3DCG/Bra/Preview/SexyBeachBra1.png deleted file mode 100644 index f755c1e45..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/SexyBeachBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/SexyBikini1.png b/Assets/Female3DCG/Bra/Preview/SexyBikini1.png deleted file mode 100644 index 4e96e6d57..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/SexyBikini1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/SexyBikini2.png b/Assets/Female3DCG/Bra/Preview/SexyBikini2.png deleted file mode 100644 index 3df5ce597..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/SexyBikini2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/SexyBikini3.png b/Assets/Female3DCG/Bra/Preview/SexyBikini3.png deleted file mode 100644 index bf6fb930d..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/SexyBikini3.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/SexyBikiniBra1.png b/Assets/Female3DCG/Bra/Preview/SexyBikiniBra1.png deleted file mode 100644 index 1968ce868..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/SexyBikiniBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/SilkStraps.png b/Assets/Female3DCG/Bra/Preview/SilkStraps.png deleted file mode 100644 index 1502f19b5..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/SilkStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/SleevelessSlimLatexLeotard.png b/Assets/Female3DCG/Bra/Preview/SleevelessSlimLatexLeotard.png deleted file mode 100644 index 80b90193f..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/SleevelessSlimLatexLeotard.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/StarHarnessBra.png b/Assets/Female3DCG/Bra/Preview/StarHarnessBra.png deleted file mode 100644 index 203b93b6d..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/StarHarnessBra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/StuddedHarness.png b/Assets/Female3DCG/Bra/Preview/StuddedHarness.png deleted file mode 100644 index f26c01300..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/StuddedHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Swimsuit1.png b/Assets/Female3DCG/Bra/Preview/Swimsuit1.png deleted file mode 100644 index 3a9555918..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Swimsuit1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Swimsuit2.png b/Assets/Female3DCG/Bra/Preview/Swimsuit2.png deleted file mode 100644 index d9801d55d..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Swimsuit2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Preview/Swimsuit3.png b/Assets/Female3DCG/Bra/Preview/Swimsuit3.png deleted file mode 100644 index 54c75eef3..000000000 Binary files a/Assets/Female3DCG/Bra/Preview/Swimsuit3.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_Large.png b/Assets/Female3DCG/Bra/Ribbons_Large.png deleted file mode 100644 index d62f9ee62..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_LargeBow.png b/Assets/Female3DCG/Bra/Ribbons_LargeBow.png deleted file mode 100644 index e55367773..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_LargeBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_LargeWrap.png b/Assets/Female3DCG/Bra/Ribbons_LargeWrap.png deleted file mode 100644 index caf390eda..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_LargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_Normal.png b/Assets/Female3DCG/Bra/Ribbons_Normal.png deleted file mode 100644 index 2e562d040..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_NormalBow.png b/Assets/Female3DCG/Bra/Ribbons_NormalBow.png deleted file mode 100644 index a3d04b834..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_NormalBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_NormalWrap.png b/Assets/Female3DCG/Bra/Ribbons_NormalWrap.png deleted file mode 100644 index c98c3b3d6..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_NormalWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_Small.png b/Assets/Female3DCG/Bra/Ribbons_Small.png deleted file mode 100644 index 9fbd25bff..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_SmallBow.png b/Assets/Female3DCG/Bra/Ribbons_SmallBow.png deleted file mode 100644 index e73e96e19..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_SmallBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_SmallWrap.png b/Assets/Female3DCG/Bra/Ribbons_SmallWrap.png deleted file mode 100644 index e4a8e97d4..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_SmallWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_XLarge.png b/Assets/Female3DCG/Bra/Ribbons_XLarge.png deleted file mode 100644 index eb8ec0398..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_XLargeBow.png b/Assets/Female3DCG/Bra/Ribbons_XLargeBow.png deleted file mode 100644 index 20d5034da..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_XLargeBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Ribbons_XLargeWrap.png b/Assets/Female3DCG/Bra/Ribbons_XLargeWrap.png deleted file mode 100644 index 2f3f88bfc..000000000 Binary files a/Assets/Female3DCG/Bra/Ribbons_XLargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Sarashi1_Large.png b/Assets/Female3DCG/Bra/Sarashi1_Large.png deleted file mode 100644 index 681ca62bc..000000000 Binary files a/Assets/Female3DCG/Bra/Sarashi1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Sarashi1_Normal.png b/Assets/Female3DCG/Bra/Sarashi1_Normal.png deleted file mode 100644 index c976a83c0..000000000 Binary files a/Assets/Female3DCG/Bra/Sarashi1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Sarashi1_Small.png b/Assets/Female3DCG/Bra/Sarashi1_Small.png deleted file mode 100644 index bb0b3bbc3..000000000 Binary files a/Assets/Female3DCG/Bra/Sarashi1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Sarashi1_XLarge.png b/Assets/Female3DCG/Bra/Sarashi1_XLarge.png deleted file mode 100644 index a7ae2908d..000000000 Binary files a/Assets/Female3DCG/Bra/Sarashi1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBeachBra1_Large.png b/Assets/Female3DCG/Bra/SexyBeachBra1_Large.png deleted file mode 100644 index 149663808..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBeachBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBeachBra1_Normal.png b/Assets/Female3DCG/Bra/SexyBeachBra1_Normal.png deleted file mode 100644 index 0cdb5e869..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBeachBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBeachBra1_Small.png b/Assets/Female3DCG/Bra/SexyBeachBra1_Small.png deleted file mode 100644 index e486a75c2..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBeachBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBeachBra1_XLarge.png b/Assets/Female3DCG/Bra/SexyBeachBra1_XLarge.png deleted file mode 100644 index c56ae1ec6..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBeachBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_LargeClosed_Main.png b/Assets/Female3DCG/Bra/SexyBikini1_LargeClosed_Main.png deleted file mode 100644 index d08ce776d..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_LargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_LargeClosed_Sides.png b/Assets/Female3DCG/Bra/SexyBikini1_LargeClosed_Sides.png deleted file mode 100644 index 316c2f55d..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_LargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_Large_Main.png b/Assets/Female3DCG/Bra/SexyBikini1_Large_Main.png deleted file mode 100644 index 7398dbd8a..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_Large_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_Large_Sides.png b/Assets/Female3DCG/Bra/SexyBikini1_Large_Sides.png deleted file mode 100644 index 316c2f55d..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_Large_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_NormalClosed_Main.png b/Assets/Female3DCG/Bra/SexyBikini1_NormalClosed_Main.png deleted file mode 100644 index e6957f0cf..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_NormalClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_NormalClosed_Sides.png b/Assets/Female3DCG/Bra/SexyBikini1_NormalClosed_Sides.png deleted file mode 100644 index ea90106fb..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_NormalClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_Normal_Main.png b/Assets/Female3DCG/Bra/SexyBikini1_Normal_Main.png deleted file mode 100644 index 882feb888..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_Normal_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_Normal_Sides.png b/Assets/Female3DCG/Bra/SexyBikini1_Normal_Sides.png deleted file mode 100644 index 29825d6e7..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_Normal_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_SmallClosed_Main.png b/Assets/Female3DCG/Bra/SexyBikini1_SmallClosed_Main.png deleted file mode 100644 index b1f981a2f..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_SmallClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_SmallClosed_Sides.png b/Assets/Female3DCG/Bra/SexyBikini1_SmallClosed_Sides.png deleted file mode 100644 index 3df1ba749..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_SmallClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_Small_Main.png b/Assets/Female3DCG/Bra/SexyBikini1_Small_Main.png deleted file mode 100644 index e45f0d9f9..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_Small_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_Small_Sides.png b/Assets/Female3DCG/Bra/SexyBikini1_Small_Sides.png deleted file mode 100644 index 3df1ba749..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_Small_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_XLargeClosed_Main.png b/Assets/Female3DCG/Bra/SexyBikini1_XLargeClosed_Main.png deleted file mode 100644 index f7fde2738..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_XLargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_XLargeClosed_Sides.png b/Assets/Female3DCG/Bra/SexyBikini1_XLargeClosed_Sides.png deleted file mode 100644 index 6089a742d..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_XLargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_XLarge_Main.png b/Assets/Female3DCG/Bra/SexyBikini1_XLarge_Main.png deleted file mode 100644 index 8c9dae1dd..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_XLarge_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini1_XLarge_Sides.png b/Assets/Female3DCG/Bra/SexyBikini1_XLarge_Sides.png deleted file mode 100644 index 6089a742d..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini1_XLarge_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini2_Large.png b/Assets/Female3DCG/Bra/SexyBikini2_Large.png deleted file mode 100644 index a21f4ef2d..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini2_Normal.png b/Assets/Female3DCG/Bra/SexyBikini2_Normal.png deleted file mode 100644 index 6edfb7943..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini2_Small.png b/Assets/Female3DCG/Bra/SexyBikini2_Small.png deleted file mode 100644 index ff1730009..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini2_XLarge.png b/Assets/Female3DCG/Bra/SexyBikini2_XLarge.png deleted file mode 100644 index 3312fd518..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini3_Large.png b/Assets/Female3DCG/Bra/SexyBikini3_Large.png deleted file mode 100644 index be92696e7..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini3_Normal.png b/Assets/Female3DCG/Bra/SexyBikini3_Normal.png deleted file mode 100644 index c7be0fe0c..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini3_Small.png b/Assets/Female3DCG/Bra/SexyBikini3_Small.png deleted file mode 100644 index 7ea877ea5..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikini3_XLarge.png b/Assets/Female3DCG/Bra/SexyBikini3_XLarge.png deleted file mode 100644 index e5a5df8c6..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikini3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikiniBra1_Large.png b/Assets/Female3DCG/Bra/SexyBikiniBra1_Large.png deleted file mode 100644 index b3acf7b6a..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikiniBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikiniBra1_Normal.png b/Assets/Female3DCG/Bra/SexyBikiniBra1_Normal.png deleted file mode 100644 index 6000a9551..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikiniBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikiniBra1_Small.png b/Assets/Female3DCG/Bra/SexyBikiniBra1_Small.png deleted file mode 100644 index 4b137842b..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikiniBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SexyBikiniBra1_XLarge.png b/Assets/Female3DCG/Bra/SexyBikiniBra1_XLarge.png deleted file mode 100644 index eb9b71fd1..000000000 Binary files a/Assets/Female3DCG/Bra/SexyBikiniBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_Large.png b/Assets/Female3DCG/Bra/SilkStraps_Large.png deleted file mode 100644 index 74ec3c633..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_LargeBra1.png b/Assets/Female3DCG/Bra/SilkStraps_LargeBra1.png deleted file mode 100644 index 94d04c1ea..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_LargeBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_LargeBra2.png b/Assets/Female3DCG/Bra/SilkStraps_LargeBra2.png deleted file mode 100644 index 99c510c8e..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_LargeBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_LargeSwimsuit.png b/Assets/Female3DCG/Bra/SilkStraps_LargeSwimsuit.png deleted file mode 100644 index 41245dfda..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_LargeSwimsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_LargeWrap.png b/Assets/Female3DCG/Bra/SilkStraps_LargeWrap.png deleted file mode 100644 index 426f2ce27..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_LargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_Normal.png b/Assets/Female3DCG/Bra/SilkStraps_Normal.png deleted file mode 100644 index 398977719..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_NormalBra1.png b/Assets/Female3DCG/Bra/SilkStraps_NormalBra1.png deleted file mode 100644 index 40f6478d0..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_NormalBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_NormalBra2.png b/Assets/Female3DCG/Bra/SilkStraps_NormalBra2.png deleted file mode 100644 index d359137b7..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_NormalBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_NormalSwimsuit.png b/Assets/Female3DCG/Bra/SilkStraps_NormalSwimsuit.png deleted file mode 100644 index c327eb04b..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_NormalSwimsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_NormalWrap.png b/Assets/Female3DCG/Bra/SilkStraps_NormalWrap.png deleted file mode 100644 index 8aa89682c..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_NormalWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_Small.png b/Assets/Female3DCG/Bra/SilkStraps_Small.png deleted file mode 100644 index f739a919a..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_SmallBra1.png b/Assets/Female3DCG/Bra/SilkStraps_SmallBra1.png deleted file mode 100644 index f08566d65..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_SmallBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_SmallBra2.png b/Assets/Female3DCG/Bra/SilkStraps_SmallBra2.png deleted file mode 100644 index d9494c2cb..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_SmallBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_SmallSwimsuit.png b/Assets/Female3DCG/Bra/SilkStraps_SmallSwimsuit.png deleted file mode 100644 index ac8244ff3..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_SmallSwimsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_SmallWrap.png b/Assets/Female3DCG/Bra/SilkStraps_SmallWrap.png deleted file mode 100644 index 085dcd94b..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_SmallWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_XLarge.png b/Assets/Female3DCG/Bra/SilkStraps_XLarge.png deleted file mode 100644 index 87bb7bb2e..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_XLargeBra1.png b/Assets/Female3DCG/Bra/SilkStraps_XLargeBra1.png deleted file mode 100644 index 31b0512a4..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_XLargeBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_XLargeBra2.png b/Assets/Female3DCG/Bra/SilkStraps_XLargeBra2.png deleted file mode 100644 index d48102af5..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_XLargeBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_XLargeSwimsuit.png b/Assets/Female3DCG/Bra/SilkStraps_XLargeSwimsuit.png deleted file mode 100644 index 05f0e26bd..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_XLargeSwimsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SilkStraps_XLargeWrap.png b/Assets/Female3DCG/Bra/SilkStraps_XLargeWrap.png deleted file mode 100644 index b18475eb2..000000000 Binary files a/Assets/Female3DCG/Bra/SilkStraps_XLargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Large_BreastShade.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Large_BreastShade.png deleted file mode 100644 index 868271142..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Large_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Large_Latex.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Large_Latex.png deleted file mode 100644 index e9e03829e..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Large_Shine.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Large_Shine.png deleted file mode 100644 index a156af5d3..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Normal_BreastShade.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Normal_BreastShade.png deleted file mode 100644 index 226464213..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Normal_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Normal_Latex.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Normal_Latex.png deleted file mode 100644 index 4ae5d3d85..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Normal_Shine.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Normal_Shine.png deleted file mode 100644 index 19af6bc6b..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Small_BreastShade.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Small_BreastShade.png deleted file mode 100644 index 71628608f..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Small_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Small_Latex.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Small_Latex.png deleted file mode 100644 index b6adf8365..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Small_Shine.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Small_Shine.png deleted file mode 100644 index b486a3091..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_XLarge_BreastShade.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_XLarge_BreastShade.png deleted file mode 100644 index 93dd9fff3..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_XLarge_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_XLarge_Latex.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_XLarge_Latex.png deleted file mode 100644 index 7a6397a5b..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_XLarge_Shine.png b/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_XLarge_Shine.png deleted file mode 100644 index 383d9f2cf..000000000 Binary files a/Assets/Female3DCG/Bra/SleevelessSlimLatexLeotard_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StarHarnessBra_Large.png b/Assets/Female3DCG/Bra/StarHarnessBra_Large.png deleted file mode 100644 index d3c661dd7..000000000 Binary files a/Assets/Female3DCG/Bra/StarHarnessBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StarHarnessBra_Normal.png b/Assets/Female3DCG/Bra/StarHarnessBra_Normal.png deleted file mode 100644 index a9f865de1..000000000 Binary files a/Assets/Female3DCG/Bra/StarHarnessBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StarHarnessBra_Small.png b/Assets/Female3DCG/Bra/StarHarnessBra_Small.png deleted file mode 100644 index 0fbc7e002..000000000 Binary files a/Assets/Female3DCG/Bra/StarHarnessBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StarHarnessBra_XLarge.png b/Assets/Female3DCG/Bra/StarHarnessBra_XLarge.png deleted file mode 100644 index 9e10b3a8e..000000000 Binary files a/Assets/Female3DCG/Bra/StarHarnessBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StuddedHarness_Large_Harness.png b/Assets/Female3DCG/Bra/StuddedHarness_Large_Harness.png deleted file mode 100644 index d730ebd6c..000000000 Binary files a/Assets/Female3DCG/Bra/StuddedHarness_Large_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StuddedHarness_Large_Metal.png b/Assets/Female3DCG/Bra/StuddedHarness_Large_Metal.png deleted file mode 100644 index 118eedc7d..000000000 Binary files a/Assets/Female3DCG/Bra/StuddedHarness_Large_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StuddedHarness_Normal_Harness.png b/Assets/Female3DCG/Bra/StuddedHarness_Normal_Harness.png deleted file mode 100644 index ff137038d..000000000 Binary files a/Assets/Female3DCG/Bra/StuddedHarness_Normal_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StuddedHarness_Normal_Metal.png b/Assets/Female3DCG/Bra/StuddedHarness_Normal_Metal.png deleted file mode 100644 index 24a321497..000000000 Binary files a/Assets/Female3DCG/Bra/StuddedHarness_Normal_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StuddedHarness_Small_Harness.png b/Assets/Female3DCG/Bra/StuddedHarness_Small_Harness.png deleted file mode 100644 index ecbefd370..000000000 Binary files a/Assets/Female3DCG/Bra/StuddedHarness_Small_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StuddedHarness_Small_Metal.png b/Assets/Female3DCG/Bra/StuddedHarness_Small_Metal.png deleted file mode 100644 index 4b5f1ac42..000000000 Binary files a/Assets/Female3DCG/Bra/StuddedHarness_Small_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StuddedHarness_XLarge_Harness.png b/Assets/Female3DCG/Bra/StuddedHarness_XLarge_Harness.png deleted file mode 100644 index 145d23da9..000000000 Binary files a/Assets/Female3DCG/Bra/StuddedHarness_XLarge_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/StuddedHarness_XLarge_Metal.png b/Assets/Female3DCG/Bra/StuddedHarness_XLarge_Metal.png deleted file mode 100644 index f6f68ae87..000000000 Binary files a/Assets/Female3DCG/Bra/StuddedHarness_XLarge_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit1_Large.png b/Assets/Female3DCG/Bra/Swimsuit1_Large.png deleted file mode 100644 index 083c15965..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit1_LargeDull.png b/Assets/Female3DCG/Bra/Swimsuit1_LargeDull.png deleted file mode 100644 index b11462016..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit1_LargeDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit1_Normal.png b/Assets/Female3DCG/Bra/Swimsuit1_Normal.png deleted file mode 100644 index 30011de9c..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit1_NormalDull.png b/Assets/Female3DCG/Bra/Swimsuit1_NormalDull.png deleted file mode 100644 index 9a5593768..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit1_NormalDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit1_Small.png b/Assets/Female3DCG/Bra/Swimsuit1_Small.png deleted file mode 100644 index 39a874a5c..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit1_SmallDull.png b/Assets/Female3DCG/Bra/Swimsuit1_SmallDull.png deleted file mode 100644 index cb87d5bcb..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit1_SmallDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit1_XLarge.png b/Assets/Female3DCG/Bra/Swimsuit1_XLarge.png deleted file mode 100644 index 1d9c9006a..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit1_XLargeDull.png b/Assets/Female3DCG/Bra/Swimsuit1_XLargeDull.png deleted file mode 100644 index 078fe918e..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit1_XLargeDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit2_Large.png b/Assets/Female3DCG/Bra/Swimsuit2_Large.png deleted file mode 100644 index 4877d92e1..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit2_Normal.png b/Assets/Female3DCG/Bra/Swimsuit2_Normal.png deleted file mode 100644 index d875a5137..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit2_Small.png b/Assets/Female3DCG/Bra/Swimsuit2_Small.png deleted file mode 100644 index 4a1dda9bb..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit2_XLarge.png b/Assets/Female3DCG/Bra/Swimsuit2_XLarge.png deleted file mode 100644 index dd950360a..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit3_Large.png b/Assets/Female3DCG/Bra/Swimsuit3_Large.png deleted file mode 100644 index dbef1afcb..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit3_Normal.png b/Assets/Female3DCG/Bra/Swimsuit3_Normal.png deleted file mode 100644 index a7a6a5bed..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit3_Small.png b/Assets/Female3DCG/Bra/Swimsuit3_Small.png deleted file mode 100644 index f3dd973ae..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Swimsuit3_XLarge.png b/Assets/Female3DCG/Bra/Swimsuit3_XLarge.png deleted file mode 100644 index b1326acd1..000000000 Binary files a/Assets/Female3DCG/Bra/Swimsuit3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bandeau1_Large.png b/Assets/Female3DCG/Bra/Yoked/Bandeau1_Large.png deleted file mode 100644 index 74cc4a75d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bandeau1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bandeau1_Normal.png b/Assets/Female3DCG/Bra/Yoked/Bandeau1_Normal.png deleted file mode 100644 index 0ee87e894..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bandeau1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bandeau1_Small.png b/Assets/Female3DCG/Bra/Yoked/Bandeau1_Small.png deleted file mode 100644 index 18766476a..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bandeau1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bandeau1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Bandeau1_XLarge.png deleted file mode 100644 index 3e377f8a3..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bandeau1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/BondageBra1_Large.png b/Assets/Female3DCG/Bra/Yoked/BondageBra1_Large.png deleted file mode 100644 index 81be939ab..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/BondageBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/BondageBra1_Normal.png b/Assets/Female3DCG/Bra/Yoked/BondageBra1_Normal.png deleted file mode 100644 index 040617dd4..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/BondageBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/BondageBra1_Small.png b/Assets/Female3DCG/Bra/Yoked/BondageBra1_Small.png deleted file mode 100644 index 027fef078..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/BondageBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/BondageBra1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/BondageBra1_XLarge.png deleted file mode 100644 index 5c1f89c01..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/BondageBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra10_Large.png b/Assets/Female3DCG/Bra/Yoked/Bra10_Large.png deleted file mode 100644 index feaaf4ce5..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra10_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra10_Normal.png b/Assets/Female3DCG/Bra/Yoked/Bra10_Normal.png deleted file mode 100644 index 149ec8843..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra10_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra10_Small.png b/Assets/Female3DCG/Bra/Yoked/Bra10_Small.png deleted file mode 100644 index 521b1b64c..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra10_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra10_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Bra10_XLarge.png deleted file mode 100644 index 12ca02eeb..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra10_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra1_Large.png b/Assets/Female3DCG/Bra/Yoked/Bra1_Large.png deleted file mode 100644 index 850370296..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra1_Normal.png b/Assets/Female3DCG/Bra/Yoked/Bra1_Normal.png deleted file mode 100644 index 6a64c8bf5..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra1_Small.png b/Assets/Female3DCG/Bra/Yoked/Bra1_Small.png deleted file mode 100644 index fa7600906..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Bra1_XLarge.png deleted file mode 100644 index 67dd1250c..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra2_Large.png b/Assets/Female3DCG/Bra/Yoked/Bra2_Large.png deleted file mode 100644 index f904f8f9f..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra2_Normal.png b/Assets/Female3DCG/Bra/Yoked/Bra2_Normal.png deleted file mode 100644 index 24cae8086..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra2_Small.png b/Assets/Female3DCG/Bra/Yoked/Bra2_Small.png deleted file mode 100644 index 1dc5a8657..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra2_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Bra2_XLarge.png deleted file mode 100644 index 4a3920fae..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra7_Large.png b/Assets/Female3DCG/Bra/Yoked/Bra7_Large.png deleted file mode 100644 index 14ffe642a..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra7_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra7_Normal.png b/Assets/Female3DCG/Bra/Yoked/Bra7_Normal.png deleted file mode 100644 index cab876959..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra7_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra7_Small.png b/Assets/Female3DCG/Bra/Yoked/Bra7_Small.png deleted file mode 100644 index b39c29cec..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra7_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra7_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Bra7_XLarge.png deleted file mode 100644 index 98fb98ee8..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra7_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra8_Large.png b/Assets/Female3DCG/Bra/Yoked/Bra8_Large.png deleted file mode 100644 index 716454db9..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra8_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra8_Normal.png b/Assets/Female3DCG/Bra/Yoked/Bra8_Normal.png deleted file mode 100644 index 6746f9382..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra8_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra8_Small.png b/Assets/Female3DCG/Bra/Yoked/Bra8_Small.png deleted file mode 100644 index 24117e4bb..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra8_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra8_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Bra8_XLarge.png deleted file mode 100644 index 47150dc75..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra8_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra9_Large.png b/Assets/Female3DCG/Bra/Yoked/Bra9_Large.png deleted file mode 100644 index 0c1d63052..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra9_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra9_Normal.png b/Assets/Female3DCG/Bra/Yoked/Bra9_Normal.png deleted file mode 100644 index ed3560463..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra9_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra9_Small.png b/Assets/Female3DCG/Bra/Yoked/Bra9_Small.png deleted file mode 100644 index d6e7fd4a4..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra9_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bra9_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Bra9_XLarge.png deleted file mode 100644 index ba552ee0b..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bra9_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/BunnySuit_Large.png b/Assets/Female3DCG/Bra/Yoked/BunnySuit_Large.png deleted file mode 100644 index b7dea74db..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/BunnySuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/BunnySuit_Normal.png b/Assets/Female3DCG/Bra/Yoked/BunnySuit_Normal.png deleted file mode 100644 index 93d18e66c..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/BunnySuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/BunnySuit_Small.png b/Assets/Female3DCG/Bra/Yoked/BunnySuit_Small.png deleted file mode 100644 index dd279e9cf..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/BunnySuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/BunnySuit_XLarge.png b/Assets/Female3DCG/Bra/Yoked/BunnySuit_XLarge.png deleted file mode 100644 index 04d86de58..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/BunnySuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bustier1_Large.png b/Assets/Female3DCG/Bra/Yoked/Bustier1_Large.png deleted file mode 100644 index 066a39ea4..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bustier1_Normal.png b/Assets/Female3DCG/Bra/Yoked/Bustier1_Normal.png deleted file mode 100644 index c9b9f7062..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bustier1_Small.png b/Assets/Female3DCG/Bra/Yoked/Bustier1_Small.png deleted file mode 100644 index a6ed32e09..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Bustier1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Bustier1_XLarge.png deleted file mode 100644 index 2ac472827..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Bustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Camisole_Large.png b/Assets/Female3DCG/Bra/Yoked/Camisole_Large.png deleted file mode 100644 index d058bc313..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Camisole_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Camisole_Normal.png b/Assets/Female3DCG/Bra/Yoked/Camisole_Normal.png deleted file mode 100644 index d3bde8538..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Camisole_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Camisole_Small.png b/Assets/Female3DCG/Bra/Yoked/Camisole_Small.png deleted file mode 100644 index 3a7ad6427..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Camisole_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Camisole_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Camisole_XLarge.png deleted file mode 100644 index 413bf10fe..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Camisole_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/ChineseBra1_Large.png b/Assets/Female3DCG/Bra/Yoked/ChineseBra1_Large.png deleted file mode 100644 index 060fc11d2..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/ChineseBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/ChineseBra1_Normal.png b/Assets/Female3DCG/Bra/Yoked/ChineseBra1_Normal.png deleted file mode 100644 index e597f2c92..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/ChineseBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/ChineseBra1_Small.png b/Assets/Female3DCG/Bra/Yoked/ChineseBra1_Small.png deleted file mode 100644 index edd67fadb..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/ChineseBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/ChineseBra1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/ChineseBra1_XLarge.png deleted file mode 100644 index 4f1b0aeab..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/ChineseBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/ClamShell_Large.png b/Assets/Female3DCG/Bra/Yoked/ClamShell_Large.png deleted file mode 100644 index 5abca4f6a..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/ClamShell_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/ClamShell_Normal.png b/Assets/Female3DCG/Bra/Yoked/ClamShell_Normal.png deleted file mode 100644 index 52c173ebd..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/ClamShell_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/ClamShell_Small.png b/Assets/Female3DCG/Bra/Yoked/ClamShell_Small.png deleted file mode 100644 index 9d3558eba..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/ClamShell_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/ClamShell_XLarge.png b/Assets/Female3DCG/Bra/Yoked/ClamShell_XLarge.png deleted file mode 100644 index 301926ce2..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/ClamShell_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_Large.png b/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_Large.png deleted file mode 100644 index 189083342..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_Normal.png b/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_Normal.png deleted file mode 100644 index 91845ba04..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_Small.png b/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_Small.png deleted file mode 100644 index a073cf5f5..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_XLarge.png deleted file mode 100644 index 5d2a245f7..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CorsetBikini1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_Large.png b/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_Large.png deleted file mode 100644 index 6c7e81bc8..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_Normal.png b/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_Normal.png deleted file mode 100644 index 2bd23eba7..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_Small.png b/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_Small.png deleted file mode 100644 index a7f0ebf22..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_XLarge.png b/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_XLarge.png deleted file mode 100644 index 3f915e282..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CowPrintedBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_LargeClosed_Main.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_LargeClosed_Main.png deleted file mode 100644 index 44a0fd6bc..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_LargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_LargeClosed_Sides.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_LargeClosed_Sides.png deleted file mode 100644 index e7dc29174..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_LargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Large_Main.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Large_Main.png deleted file mode 100644 index aa4f7300b..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Large_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Large_Sides.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Large_Sides.png deleted file mode 100644 index e7dc29174..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Large_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_NormalClosed_Main.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_NormalClosed_Main.png deleted file mode 100644 index a09f28aa9..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_NormalClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_NormalClosed_Sides.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_NormalClosed_Sides.png deleted file mode 100644 index ea937d847..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_NormalClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Normal_Main.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Normal_Main.png deleted file mode 100644 index 85226e7ba..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Normal_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Normal_Sides.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Normal_Sides.png deleted file mode 100644 index ea937d847..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Normal_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_SmallClosed_Main.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_SmallClosed_Main.png deleted file mode 100644 index 2dd143e7d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_SmallClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_SmallClosed_Sides.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_SmallClosed_Sides.png deleted file mode 100644 index 847e9b773..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_SmallClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Small_Main.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Small_Main.png deleted file mode 100644 index fe4e7b01d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Small_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Small_Sides.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Small_Sides.png deleted file mode 100644 index 847e9b773..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_Small_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLargeClosed_Main.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLargeClosed_Main.png deleted file mode 100644 index 6423dd8b5..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLargeClosed_Sides.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLargeClosed_Sides.png deleted file mode 100644 index ed74d7923..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLarge_Main.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLarge_Main.png deleted file mode 100644 index 545de9817..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLarge_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLarge_Sides.png b/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLarge_Sides.png deleted file mode 100644 index ed74d7923..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/CuteBikini1_XLarge_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_Large.png b/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_Large.png deleted file mode 100644 index 27461f03b..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_Normal.png b/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_Normal.png deleted file mode 100644 index 121b70c98..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_Small.png b/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_Small.png deleted file mode 100644 index 4b064621c..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_XLarge.png deleted file mode 100644 index 78cef4ae3..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FishnetBikini1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Large_Bra.png b/Assets/Female3DCG/Bra/Yoked/FlowerBra_Large_Bra.png deleted file mode 100644 index 431458ef7..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Large_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Large_Flowers.png b/Assets/Female3DCG/Bra/Yoked/FlowerBra_Large_Flowers.png deleted file mode 100644 index e7be2164b..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Large_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Normal_Bra.png b/Assets/Female3DCG/Bra/Yoked/FlowerBra_Normal_Bra.png deleted file mode 100644 index 64f348ab8..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Normal_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Normal_Flowers.png b/Assets/Female3DCG/Bra/Yoked/FlowerBra_Normal_Flowers.png deleted file mode 100644 index 9924a7f17..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Normal_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Small_Bra.png b/Assets/Female3DCG/Bra/Yoked/FlowerBra_Small_Bra.png deleted file mode 100644 index ab72162df..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Small_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Small_Flowers.png b/Assets/Female3DCG/Bra/Yoked/FlowerBra_Small_Flowers.png deleted file mode 100644 index 4f3ea8dda..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FlowerBra_Small_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FlowerBra_XLarge_Bra.png b/Assets/Female3DCG/Bra/Yoked/FlowerBra_XLarge_Bra.png deleted file mode 100644 index 74ad66bcb..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FlowerBra_XLarge_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FlowerBra_XLarge_Flowers.png b/Assets/Female3DCG/Bra/Yoked/FlowerBra_XLarge_Flowers.png deleted file mode 100644 index f937c5561..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FlowerBra_XLarge_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FrameBra1_Large.png b/Assets/Female3DCG/Bra/Yoked/FrameBra1_Large.png deleted file mode 100644 index c4760ad9f..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FrameBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FrameBra1_Normal.png b/Assets/Female3DCG/Bra/Yoked/FrameBra1_Normal.png deleted file mode 100644 index 85e7bc4d3..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FrameBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FrameBra1_Small.png b/Assets/Female3DCG/Bra/Yoked/FrameBra1_Small.png deleted file mode 100644 index cdaed89a6..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FrameBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FrameBra1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/FrameBra1_XLarge.png deleted file mode 100644 index 4b9edbd1f..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FrameBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FrameBra2_Large.png b/Assets/Female3DCG/Bra/Yoked/FrameBra2_Large.png deleted file mode 100644 index 52ccbea1a..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FrameBra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FrameBra2_Normal.png b/Assets/Female3DCG/Bra/Yoked/FrameBra2_Normal.png deleted file mode 100644 index 608dc427e..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FrameBra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FrameBra2_Small.png b/Assets/Female3DCG/Bra/Yoked/FrameBra2_Small.png deleted file mode 100644 index bd6eeee41..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FrameBra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FrameBra2_XLarge.png b/Assets/Female3DCG/Bra/Yoked/FrameBra2_XLarge.png deleted file mode 100644 index 420f4fad1..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FrameBra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Large_Bra.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Large_Bra.png deleted file mode 100644 index 0aaa55d6f..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Large_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Large_Shine.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Large_Shine.png deleted file mode 100644 index 3dde5ecb2..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Normal_Bra.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Normal_Bra.png deleted file mode 100644 index 4e938d000..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Normal_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Normal_Shine.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Normal_Shine.png deleted file mode 100644 index a4c2383b9..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Small_Bra.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Small_Bra.png deleted file mode 100644 index 5a277753b..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Small_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Small_Shine.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Small_Shine.png deleted file mode 100644 index dcccc39d0..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_XLarge_Bra.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_XLarge_Bra.png deleted file mode 100644 index d8e095dc5..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_XLarge_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_XLarge_Shine.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_XLarge_Shine.png deleted file mode 100644 index ada672652..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra2_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra_Large.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra_Large.png deleted file mode 100644 index 2e5c20491..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra_Normal.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra_Normal.png deleted file mode 100644 index 63879ff61..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra_Small.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra_Small.png deleted file mode 100644 index b5aed43a9..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/FullLatexBra_XLarge.png b/Assets/Female3DCG/Bra/Yoked/FullLatexBra_XLarge.png deleted file mode 100644 index 21a8046c8..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/FullLatexBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_Large_Fabric.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_Large_Fabric.png deleted file mode 100644 index 2953532fc..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_Large_Jewel.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_Large_Jewel.png deleted file mode 100644 index 13dda267d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_Large_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_Large_Straps.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_Large_Straps.png deleted file mode 100644 index b242a4b10..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_Normal_Fabric.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_Normal_Fabric.png deleted file mode 100644 index 2c216852a..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_Normal_Jewel.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_Normal_Jewel.png deleted file mode 100644 index f9d13bdb4..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_Normal_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_Normal_Straps.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_Normal_Straps.png deleted file mode 100644 index b44d34fed..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_Small_Fabric.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_Small_Fabric.png deleted file mode 100644 index 9fbd00bc7..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_Small_Jewel.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_Small_Jewel.png deleted file mode 100644 index e62ef3282..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_Small_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_Small_Straps.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_Small_Straps.png deleted file mode 100644 index 3af29f084..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_XLarge_Fabric.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_XLarge_Fabric.png deleted file mode 100644 index 184bd6e66..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_XLarge_Jewel.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_XLarge_Jewel.png deleted file mode 100644 index 07686ee8b..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_XLarge_Jewel.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HaremBra_XLarge_Straps.png b/Assets/Female3DCG/Bra/Yoked/HaremBra_XLarge_Straps.png deleted file mode 100644 index 6c401d967..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HaremBra_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HarnessBra1_Large.png b/Assets/Female3DCG/Bra/Yoked/HarnessBra1_Large.png deleted file mode 100644 index abfad1eff..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HarnessBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HarnessBra1_Normal.png b/Assets/Female3DCG/Bra/Yoked/HarnessBra1_Normal.png deleted file mode 100644 index b97b6ed02..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HarnessBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HarnessBra1_Small.png b/Assets/Female3DCG/Bra/Yoked/HarnessBra1_Small.png deleted file mode 100644 index e2e8eb23c..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HarnessBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HarnessBra1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/HarnessBra1_XLarge.png deleted file mode 100644 index bae1616ce..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HarnessBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HarnessBra2_Large.png b/Assets/Female3DCG/Bra/Yoked/HarnessBra2_Large.png deleted file mode 100644 index 6cdfa1b23..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HarnessBra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HarnessBra2_Normal.png b/Assets/Female3DCG/Bra/Yoked/HarnessBra2_Normal.png deleted file mode 100644 index a919e27fe..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HarnessBra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HarnessBra2_Small.png b/Assets/Female3DCG/Bra/Yoked/HarnessBra2_Small.png deleted file mode 100644 index cca210036..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HarnessBra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HarnessBra2_XLarge.png b/Assets/Female3DCG/Bra/Yoked/HarnessBra2_XLarge.png deleted file mode 100644 index 36b360de3..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HarnessBra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HeartTop_Large.png b/Assets/Female3DCG/Bra/Yoked/HeartTop_Large.png deleted file mode 100644 index 59b104578..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HeartTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HeartTop_Normal.png b/Assets/Female3DCG/Bra/Yoked/HeartTop_Normal.png deleted file mode 100644 index f146a8985..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HeartTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HeartTop_Small.png b/Assets/Female3DCG/Bra/Yoked/HeartTop_Small.png deleted file mode 100644 index b01ca0c4c..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HeartTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/HeartTop_XLarge.png b/Assets/Female3DCG/Bra/Yoked/HeartTop_XLarge.png deleted file mode 100644 index 2d38ecc97..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/HeartTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/KittyBra1_Large.png b/Assets/Female3DCG/Bra/Yoked/KittyBra1_Large.png deleted file mode 100644 index 0680ffda2..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/KittyBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/KittyBra1_Normal.png b/Assets/Female3DCG/Bra/Yoked/KittyBra1_Normal.png deleted file mode 100644 index e760e84bd..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/KittyBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/KittyBra1_Small.png b/Assets/Female3DCG/Bra/Yoked/KittyBra1_Small.png deleted file mode 100644 index 456c58369..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/KittyBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/KittyBra1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/KittyBra1_XLarge.png deleted file mode 100644 index 75a0b59e8..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/KittyBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/LatexBra1_Large.png b/Assets/Female3DCG/Bra/Yoked/LatexBra1_Large.png deleted file mode 100644 index 054c47332..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/LatexBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/LatexBra1_Normal.png b/Assets/Female3DCG/Bra/Yoked/LatexBra1_Normal.png deleted file mode 100644 index aa9ffbb7d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/LatexBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/LatexBra1_Small.png b/Assets/Female3DCG/Bra/Yoked/LatexBra1_Small.png deleted file mode 100644 index 1dcaa4f9b..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/LatexBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/LatexBra1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/LatexBra1_XLarge.png deleted file mode 100644 index dc0e9f66d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/LatexBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_Large.png b/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_Large.png deleted file mode 100644 index eac0c4ee6..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_Normal.png b/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_Normal.png deleted file mode 100644 index 9fe87e601..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_Small.png b/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_Small.png deleted file mode 100644 index 87e156768..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_XLarge.png deleted file mode 100644 index 48e709b37..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/OuvertPerl1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_Large.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_Large.png deleted file mode 100644 index d62f9ee62..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_LargeBow.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_LargeBow.png deleted file mode 100644 index e55367773..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_LargeBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_LargeWrap.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_LargeWrap.png deleted file mode 100644 index caf390eda..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_LargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_Normal.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_Normal.png deleted file mode 100644 index 2e562d040..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_NormalBow.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_NormalBow.png deleted file mode 100644 index a3d04b834..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_NormalBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_NormalWrap.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_NormalWrap.png deleted file mode 100644 index c98c3b3d6..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_NormalWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_Small.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_Small.png deleted file mode 100644 index 9fbd25bff..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_SmallBow.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_SmallBow.png deleted file mode 100644 index e73e96e19..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_SmallBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_SmallWrap.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_SmallWrap.png deleted file mode 100644 index e4a8e97d4..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_SmallWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_XLarge.png deleted file mode 100644 index eb8ec0398..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_XLargeBow.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_XLargeBow.png deleted file mode 100644 index 20d5034da..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_XLargeBow.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Ribbons_XLargeWrap.png b/Assets/Female3DCG/Bra/Yoked/Ribbons_XLargeWrap.png deleted file mode 100644 index 2f3f88bfc..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Ribbons_XLargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Sarashi1_Large.png b/Assets/Female3DCG/Bra/Yoked/Sarashi1_Large.png deleted file mode 100644 index 681ca62bc..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Sarashi1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Sarashi1_Normal.png b/Assets/Female3DCG/Bra/Yoked/Sarashi1_Normal.png deleted file mode 100644 index c976a83c0..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Sarashi1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Sarashi1_Small.png b/Assets/Female3DCG/Bra/Yoked/Sarashi1_Small.png deleted file mode 100644 index bb0b3bbc3..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Sarashi1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Sarashi1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Sarashi1_XLarge.png deleted file mode 100644 index a7ae2908d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Sarashi1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_Large.png b/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_Large.png deleted file mode 100644 index 149663808..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_Normal.png b/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_Normal.png deleted file mode 100644 index 0cdb5e869..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_Small.png b/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_Small.png deleted file mode 100644 index e486a75c2..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_XLarge.png deleted file mode 100644 index c56ae1ec6..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBeachBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_LargeClosed_Main.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_LargeClosed_Main.png deleted file mode 100644 index d08ce776d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_LargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_LargeClosed_Sides.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_LargeClosed_Sides.png deleted file mode 100644 index 316c2f55d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_LargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Large_Main.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Large_Main.png deleted file mode 100644 index 7398dbd8a..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Large_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Large_Sides.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Large_Sides.png deleted file mode 100644 index 316c2f55d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Large_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_NormalClosed_Main.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_NormalClosed_Main.png deleted file mode 100644 index e6957f0cf..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_NormalClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_NormalClosed_Sides.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_NormalClosed_Sides.png deleted file mode 100644 index ea90106fb..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_NormalClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Normal_Main.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Normal_Main.png deleted file mode 100644 index 882feb888..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Normal_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Normal_Sides.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Normal_Sides.png deleted file mode 100644 index 29825d6e7..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Normal_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_SmallClosed_Main.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_SmallClosed_Main.png deleted file mode 100644 index b1f981a2f..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_SmallClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_SmallClosed_Sides.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_SmallClosed_Sides.png deleted file mode 100644 index 3df1ba749..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_SmallClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Small_Main.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Small_Main.png deleted file mode 100644 index e45f0d9f9..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Small_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Small_Sides.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Small_Sides.png deleted file mode 100644 index 3df1ba749..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_Small_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLargeClosed_Main.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLargeClosed_Main.png deleted file mode 100644 index f7fde2738..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLargeClosed_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLargeClosed_Sides.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLargeClosed_Sides.png deleted file mode 100644 index 6089a742d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLargeClosed_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLarge_Main.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLarge_Main.png deleted file mode 100644 index 8c9dae1dd..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLarge_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLarge_Sides.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLarge_Sides.png deleted file mode 100644 index 6089a742d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini1_XLarge_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini2_Large.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini2_Large.png deleted file mode 100644 index a21f4ef2d..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini2_Normal.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini2_Normal.png deleted file mode 100644 index 6edfb7943..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini2_Small.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini2_Small.png deleted file mode 100644 index ff1730009..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini2_XLarge.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini2_XLarge.png deleted file mode 100644 index 3312fd518..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini3_Large.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini3_Large.png deleted file mode 100644 index be92696e7..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini3_Normal.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini3_Normal.png deleted file mode 100644 index c7be0fe0c..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini3_Small.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini3_Small.png deleted file mode 100644 index 7ea877ea5..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikini3_XLarge.png b/Assets/Female3DCG/Bra/Yoked/SexyBikini3_XLarge.png deleted file mode 100644 index e5a5df8c6..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikini3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_Large.png b/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_Large.png deleted file mode 100644 index b3acf7b6a..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_Normal.png b/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_Normal.png deleted file mode 100644 index 6000a9551..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_Small.png b/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_Small.png deleted file mode 100644 index 4b137842b..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_XLarge.png deleted file mode 100644 index eb9b71fd1..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SexyBikiniBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_Large.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_Large.png deleted file mode 100644 index 74ec3c633..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_LargeBra1.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_LargeBra1.png deleted file mode 100644 index 94d04c1ea..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_LargeBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_LargeBra2.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_LargeBra2.png deleted file mode 100644 index 99c510c8e..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_LargeBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_LargeWrap.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_LargeWrap.png deleted file mode 100644 index 426f2ce27..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_LargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_Normal.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_Normal.png deleted file mode 100644 index 398977719..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_NormalBra1.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_NormalBra1.png deleted file mode 100644 index 40f6478d0..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_NormalBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_NormalBra2.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_NormalBra2.png deleted file mode 100644 index d359137b7..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_NormalBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_NormalWrap.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_NormalWrap.png deleted file mode 100644 index 8aa89682c..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_NormalWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_Small.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_Small.png deleted file mode 100644 index f739a919a..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_SmallBra1.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_SmallBra1.png deleted file mode 100644 index f08566d65..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_SmallBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_SmallBra2.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_SmallBra2.png deleted file mode 100644 index d9494c2cb..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_SmallBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_SmallWrap.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_SmallWrap.png deleted file mode 100644 index 085dcd94b..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_SmallWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLarge.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLarge.png deleted file mode 100644 index 87bb7bb2e..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeBra1.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeBra1.png deleted file mode 100644 index 31b0512a4..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeBra2.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeBra2.png deleted file mode 100644 index d48102af5..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeSwimsuit.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeSwimsuit.png deleted file mode 100644 index 05f0e26bd..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeSwimsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeWrap.png b/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeWrap.png deleted file mode 100644 index b18475eb2..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/SilkStraps_XLargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_Large.png b/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_Large.png deleted file mode 100644 index d3c661dd7..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_Normal.png b/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_Normal.png deleted file mode 100644 index a9f865de1..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_Small.png b/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_Small.png deleted file mode 100644 index 0fbc7e002..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_XLarge.png b/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_XLarge.png deleted file mode 100644 index 9e10b3a8e..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StarHarnessBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Large_Harness.png b/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Large_Harness.png deleted file mode 100644 index 77c61b720..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Large_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Large_Metal.png b/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Large_Metal.png deleted file mode 100644 index 90bb2ed3b..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Large_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Normal_Harness.png b/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Normal_Harness.png deleted file mode 100644 index 4c7e68e00..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Normal_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Normal_Metal.png b/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Normal_Metal.png deleted file mode 100644 index 24a321497..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Normal_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Small_Harness.png b/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Small_Harness.png deleted file mode 100644 index 602452559..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Small_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Small_Metal.png b/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Small_Metal.png deleted file mode 100644 index 5dcbc7035..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_Small_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_XLarge_Harness.png b/Assets/Female3DCG/Bra/Yoked/StuddedHarness_XLarge_Harness.png deleted file mode 100644 index a7216aebf..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_XLarge_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_XLarge_Metal.png b/Assets/Female3DCG/Bra/Yoked/StuddedHarness_XLarge_Metal.png deleted file mode 100644 index 17fe9f3dc..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/StuddedHarness_XLarge_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_Large.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit1_Large.png deleted file mode 100644 index 97b2dab29..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_LargeDull.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit1_LargeDull.png deleted file mode 100644 index b11462016..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_LargeDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_Normal.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit1_Normal.png deleted file mode 100644 index 53949fc8f..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_NormalDull.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit1_NormalDull.png deleted file mode 100644 index 9a5593768..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_NormalDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_Small.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit1_Small.png deleted file mode 100644 index dfbaeab1c..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_SmallDull.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit1_SmallDull.png deleted file mode 100644 index cb87d5bcb..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_SmallDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit1_XLarge.png deleted file mode 100644 index 1153c9ddd..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_XLargeDull.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit1_XLargeDull.png deleted file mode 100644 index 078fe918e..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit1_XLargeDull.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit2_Large.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit2_Large.png deleted file mode 100644 index 86ded7baa..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit2_Normal.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit2_Normal.png deleted file mode 100644 index 6d7ad1063..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit2_Small.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit2_Small.png deleted file mode 100644 index 002c27098..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit2_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit2_XLarge.png deleted file mode 100644 index ad367a1fb..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit3_Large.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit3_Large.png deleted file mode 100644 index 4880475a3..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit3_Normal.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit3_Normal.png deleted file mode 100644 index e422766f8..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit3_Small.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit3_Small.png deleted file mode 100644 index 735256986..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bra/Yoked/Swimsuit3_XLarge.png b/Assets/Female3DCG/Bra/Yoked/Swimsuit3_XLarge.png deleted file mode 100644 index 7ae490f6e..000000000 Binary files a/Assets/Female3DCG/Bra/Yoked/Swimsuit3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Large_Bands.png b/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Large_Bands.png deleted file mode 100644 index 9fb8ee9a9..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Large_Lace.png b/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Large_Lace.png deleted file mode 100644 index 57965ac02..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Normal_Bands.png b/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Normal_Bands.png deleted file mode 100644 index 2a9fa4ccb..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Normal_Lace.png b/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Normal_Lace.png deleted file mode 100644 index d01e45c48..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Small_Bands.png b/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Small_Bands.png deleted file mode 100644 index b4e38e3c2..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Small_Lace.png b/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Small_Lace.png deleted file mode 100644 index c8d56b3fa..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_XLarge_Bands.png b/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_XLarge_Bands.png deleted file mode 100644 index f788c1a85..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_XLarge_Lace.png b/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_XLarge_Lace.png deleted file mode 100644 index 57965ac02..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackBoxTie/LaceBands_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Large_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Large_Bands.png deleted file mode 100644 index 629888a01..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Large_Lace.png b/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Large_Lace.png deleted file mode 100644 index 770d3309d..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Normal_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Normal_Bands.png deleted file mode 100644 index f8805440b..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Normal_Lace.png b/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Normal_Lace.png deleted file mode 100644 index 84312ac40..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Small_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Small_Bands.png deleted file mode 100644 index f8805440b..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Small_Lace.png b/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Small_Lace.png deleted file mode 100644 index 6af3e090f..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_XLarge_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_XLarge_Bands.png deleted file mode 100644 index ea255e523..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_XLarge_Lace.png b/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_XLarge_Lace.png deleted file mode 100644 index f2f1ffa9a..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/LaceBands_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeLeft_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeLeft_Bands.png deleted file mode 100644 index 8c0d99bcc..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeLeft_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeLeft_Spikes.png deleted file mode 100644 index 69d1ee67e..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeRight_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeRight_Bands.png deleted file mode 100644 index 19a074003..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeRight_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeRight_Spikes.png deleted file mode 100644 index ce23b18d2..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_LargeRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Large_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Large_Bands.png deleted file mode 100644 index a8b06c5b1..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Large_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Large_Spikes.png deleted file mode 100644 index 69d1ee67e..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Large_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalLeft_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalLeft_Bands.png deleted file mode 100644 index 8c0d99bcc..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalLeft_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalLeft_Spikes.png deleted file mode 100644 index 69d1ee67e..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalRight_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalRight_Bands.png deleted file mode 100644 index 1ba34027e..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalRight_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalRight_Spikes.png deleted file mode 100644 index 43fd7213f..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_NormalRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Normal_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Normal_Bands.png deleted file mode 100644 index 100372f4b..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Normal_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Normal_Spikes.png deleted file mode 100644 index fd96954e1..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Normal_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallLeft_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallLeft_Bands.png deleted file mode 100644 index 8c0d99bcc..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallLeft_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallLeft_Spikes.png deleted file mode 100644 index 69d1ee67e..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallRight_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallRight_Bands.png deleted file mode 100644 index e2460d5e7..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallRight_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallRight_Spikes.png deleted file mode 100644 index 0cd53934e..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_SmallRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Small_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Small_Bands.png deleted file mode 100644 index 864c46101..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Small_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Small_Spikes.png deleted file mode 100644 index 6fdba72c9..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_Small_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeLeft_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeLeft_Bands.png deleted file mode 100644 index 8c0d99bcc..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeLeft_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeLeft_Spikes.png deleted file mode 100644 index 69d1ee67e..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeRight_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeRight_Bands.png deleted file mode 100644 index 4e38af10f..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeRight_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeRight_Spikes.png deleted file mode 100644 index ce23b18d2..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLargeRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLarge_Bands.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLarge_Bands.png deleted file mode 100644 index 70a9ba1a2..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLarge_Spikes.png b/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLarge_Spikes.png deleted file mode 100644 index 69d1ee67e..000000000 Binary files a/Assets/Female3DCG/Bracelet/BackCuffs/SpikeBands_XLarge_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_Large.png b/Assets/Female3DCG/Bracelet/Band1_Large.png deleted file mode 100644 index 6359e7a9b..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_LargeBoth.png b/Assets/Female3DCG/Bracelet/Band1_LargeBoth.png deleted file mode 100644 index 94d6aaf24..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_LargeBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_LargeRight.png b/Assets/Female3DCG/Bracelet/Band1_LargeRight.png deleted file mode 100644 index ba9aa176e..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_LargeRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_Normal.png b/Assets/Female3DCG/Bracelet/Band1_Normal.png deleted file mode 100644 index 6359e7a9b..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_NormalBoth.png b/Assets/Female3DCG/Bracelet/Band1_NormalBoth.png deleted file mode 100644 index 94d6aaf24..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_NormalBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_NormalRight.png b/Assets/Female3DCG/Bracelet/Band1_NormalRight.png deleted file mode 100644 index ba9aa176e..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_NormalRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_Small.png b/Assets/Female3DCG/Bracelet/Band1_Small.png deleted file mode 100644 index 6359e7a9b..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_SmallBoth.png b/Assets/Female3DCG/Bracelet/Band1_SmallBoth.png deleted file mode 100644 index 94d6aaf24..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_SmallBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_SmallRight.png b/Assets/Female3DCG/Bracelet/Band1_SmallRight.png deleted file mode 100644 index ba9aa176e..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_SmallRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_XLarge.png b/Assets/Female3DCG/Bracelet/Band1_XLarge.png deleted file mode 100644 index 6359e7a9b..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_XLargeBoth.png b/Assets/Female3DCG/Bracelet/Band1_XLargeBoth.png deleted file mode 100644 index 94d6aaf24..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_XLargeBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Band1_XLargeRight.png b/Assets/Female3DCG/Bracelet/Band1_XLargeRight.png deleted file mode 100644 index ba9aa176e..000000000 Binary files a/Assets/Female3DCG/Bracelet/Band1_XLargeRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BowBand_Large.png b/Assets/Female3DCG/Bracelet/BowBand_Large.png deleted file mode 100644 index 42c85b1f5..000000000 Binary files a/Assets/Female3DCG/Bracelet/BowBand_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BowBand_Normal.png b/Assets/Female3DCG/Bracelet/BowBand_Normal.png deleted file mode 100644 index 42c85b1f5..000000000 Binary files a/Assets/Female3DCG/Bracelet/BowBand_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BowBand_Small.png b/Assets/Female3DCG/Bracelet/BowBand_Small.png deleted file mode 100644 index 42c85b1f5..000000000 Binary files a/Assets/Female3DCG/Bracelet/BowBand_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/BowBand_XLarge.png b/Assets/Female3DCG/Bracelet/BowBand_XLarge.png deleted file mode 100644 index ca29305e6..000000000 Binary files a/Assets/Female3DCG/Bracelet/BowBand_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/KinkBracelet_Large.png b/Assets/Female3DCG/Bracelet/KinkBracelet_Large.png deleted file mode 100644 index 2a2a5cc30..000000000 Binary files a/Assets/Female3DCG/Bracelet/KinkBracelet_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/KinkBracelet_Normal.png b/Assets/Female3DCG/Bracelet/KinkBracelet_Normal.png deleted file mode 100644 index 14585f633..000000000 Binary files a/Assets/Female3DCG/Bracelet/KinkBracelet_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/KinkBracelet_Small.png b/Assets/Female3DCG/Bracelet/KinkBracelet_Small.png deleted file mode 100644 index 6bb111759..000000000 Binary files a/Assets/Female3DCG/Bracelet/KinkBracelet_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/KinkBracelet_XLarge.png b/Assets/Female3DCG/Bracelet/KinkBracelet_XLarge.png deleted file mode 100644 index c3cb4ea96..000000000 Binary files a/Assets/Female3DCG/Bracelet/KinkBracelet_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LaceBands_Large_Bands.png b/Assets/Female3DCG/Bracelet/LaceBands_Large_Bands.png deleted file mode 100644 index 9fb8ee9a9..000000000 Binary files a/Assets/Female3DCG/Bracelet/LaceBands_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LaceBands_Large_Lace.png b/Assets/Female3DCG/Bracelet/LaceBands_Large_Lace.png deleted file mode 100644 index c7a187b63..000000000 Binary files a/Assets/Female3DCG/Bracelet/LaceBands_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LaceBands_Normal_Bands.png b/Assets/Female3DCG/Bracelet/LaceBands_Normal_Bands.png deleted file mode 100644 index 2a9fa4ccb..000000000 Binary files a/Assets/Female3DCG/Bracelet/LaceBands_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LaceBands_Normal_Lace.png b/Assets/Female3DCG/Bracelet/LaceBands_Normal_Lace.png deleted file mode 100644 index d01e45c48..000000000 Binary files a/Assets/Female3DCG/Bracelet/LaceBands_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LaceBands_Small_Bands.png b/Assets/Female3DCG/Bracelet/LaceBands_Small_Bands.png deleted file mode 100644 index b4e38e3c2..000000000 Binary files a/Assets/Female3DCG/Bracelet/LaceBands_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LaceBands_Small_Lace.png b/Assets/Female3DCG/Bracelet/LaceBands_Small_Lace.png deleted file mode 100644 index c8d56b3fa..000000000 Binary files a/Assets/Female3DCG/Bracelet/LaceBands_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LaceBands_XLarge_Bands.png b/Assets/Female3DCG/Bracelet/LaceBands_XLarge_Bands.png deleted file mode 100644 index f788c1a85..000000000 Binary files a/Assets/Female3DCG/Bracelet/LaceBands_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LaceBands_XLarge_Lace.png b/Assets/Female3DCG/Bracelet/LaceBands_XLarge_Lace.png deleted file mode 100644 index 57965ac02..000000000 Binary files a/Assets/Female3DCG/Bracelet/LaceBands_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LesBand_Large.png b/Assets/Female3DCG/Bracelet/LesBand_Large.png deleted file mode 100644 index 9b59232f0..000000000 Binary files a/Assets/Female3DCG/Bracelet/LesBand_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LesBand_Normal.png b/Assets/Female3DCG/Bracelet/LesBand_Normal.png deleted file mode 100644 index cc07710da..000000000 Binary files a/Assets/Female3DCG/Bracelet/LesBand_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LesBand_Small.png b/Assets/Female3DCG/Bracelet/LesBand_Small.png deleted file mode 100644 index 9b59232f0..000000000 Binary files a/Assets/Female3DCG/Bracelet/LesBand_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/LesBand_XLarge.png b/Assets/Female3DCG/Bracelet/LesBand_XLarge.png deleted file mode 100644 index 9b59232f0..000000000 Binary files a/Assets/Female3DCG/Bracelet/LesBand_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_Large.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_Large.png deleted file mode 100644 index 7b8b2386d..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_LargeBoth.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_LargeBoth.png deleted file mode 100644 index 1d8ed3f0d..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_LargeBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_LargeRight.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_LargeRight.png deleted file mode 100644 index a57f7c4af..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_LargeRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_Normal.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_Normal.png deleted file mode 100644 index 4f1a0c604..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_NormalBoth.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_NormalBoth.png deleted file mode 100644 index e01f5effc..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_NormalBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_NormalRight.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_NormalRight.png deleted file mode 100644 index 7d61d3926..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_NormalRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_Small.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_Small.png deleted file mode 100644 index 0c167272b..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_SmallBoth.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_SmallBoth.png deleted file mode 100644 index de23cf924..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_SmallBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_SmallRight.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_SmallRight.png deleted file mode 100644 index 0727e4e98..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_SmallRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_XLarge.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_XLarge.png deleted file mode 100644 index a1d72d93c..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_XLargeBoth.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_XLargeBoth.png deleted file mode 100644 index e5ff116e9..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_XLargeBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_XLargeRight.png b/Assets/Female3DCG/Bracelet/OverTheHead/Band1_XLargeRight.png deleted file mode 100644 index cdd5920e8..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/Band1_XLargeRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_Large.png b/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_Large.png deleted file mode 100644 index 18bd7dc09..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_Normal.png b/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_Normal.png deleted file mode 100644 index 18bd7dc09..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_Small.png b/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_Small.png deleted file mode 100644 index 5b1397b07..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_XLarge.png b/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_XLarge.png deleted file mode 100644 index 8129e1eda..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/BowBand_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_Large.png b/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_Large.png deleted file mode 100644 index c2e823647..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_Normal.png b/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_Normal.png deleted file mode 100644 index d92081b18..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_Small.png b/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_Small.png deleted file mode 100644 index e7d94004b..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_XLarge.png b/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_XLarge.png deleted file mode 100644 index 5c5a19c07..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/KinkBracelet_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Large_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Large_Bands.png deleted file mode 100644 index bd3697831..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Large_Lace.png b/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Large_Lace.png deleted file mode 100644 index db5d577a1..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Normal_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Normal_Bands.png deleted file mode 100644 index 10e549577..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Normal_Lace.png b/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Normal_Lace.png deleted file mode 100644 index ce3bc329a..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Small_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Small_Bands.png deleted file mode 100644 index 86e729633..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Small_Lace.png b/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Small_Lace.png deleted file mode 100644 index 3535edce4..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_XLarge_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_XLarge_Bands.png deleted file mode 100644 index 88304393d..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_XLarge_Lace.png b/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_XLarge_Lace.png deleted file mode 100644 index 7a5b76e84..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LaceBands_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_Large.png b/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_Large.png deleted file mode 100644 index dfebfc188..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_Normal.png b/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_Normal.png deleted file mode 100644 index 85afad34d..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_Small.png b/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_Small.png deleted file mode 100644 index 3e38d15a3..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_XLarge.png b/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_XLarge.png deleted file mode 100644 index 77125a6e8..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/LesBand_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeLeft_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeLeft_Bands.png deleted file mode 100644 index 600b8a29d..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeLeft_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeLeft_Spikes.png deleted file mode 100644 index 7958c02a3..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeRight_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeRight_Bands.png deleted file mode 100644 index 543fbe19c..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeRight_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeRight_Spikes.png deleted file mode 100644 index d5fdfe9bb..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_LargeRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Large_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Large_Bands.png deleted file mode 100644 index ea676a62a..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Large_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Large_Spikes.png deleted file mode 100644 index 54d01b7dd..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Large_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalLeft_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalLeft_Bands.png deleted file mode 100644 index 600b8a29d..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalLeft_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalLeft_Spikes.png deleted file mode 100644 index 7958c02a3..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalRight_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalRight_Bands.png deleted file mode 100644 index 543fbe19c..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalRight_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalRight_Spikes.png deleted file mode 100644 index d5fdfe9bb..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_NormalRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Normal_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Normal_Bands.png deleted file mode 100644 index ea676a62a..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Normal_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Normal_Spikes.png deleted file mode 100644 index 54d01b7dd..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Normal_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallLeft_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallLeft_Bands.png deleted file mode 100644 index 600b8a29d..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallLeft_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallLeft_Spikes.png deleted file mode 100644 index 7958c02a3..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallRight_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallRight_Bands.png deleted file mode 100644 index 543fbe19c..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallRight_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallRight_Spikes.png deleted file mode 100644 index d5fdfe9bb..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_SmallRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Small_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Small_Bands.png deleted file mode 100644 index ea676a62a..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Small_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Small_Spikes.png deleted file mode 100644 index 54d01b7dd..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_Small_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeLeft_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeLeft_Bands.png deleted file mode 100644 index 600b8a29d..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeLeft_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeLeft_Spikes.png deleted file mode 100644 index 7958c02a3..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeRight_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeRight_Bands.png deleted file mode 100644 index 543fbe19c..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeRight_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeRight_Spikes.png deleted file mode 100644 index d5fdfe9bb..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLargeRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLarge_Bands.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLarge_Bands.png deleted file mode 100644 index ea676a62a..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLarge_Spikes.png b/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLarge_Spikes.png deleted file mode 100644 index 54d01b7dd..000000000 Binary files a/Assets/Female3DCG/Bracelet/OverTheHead/SpikeBands_XLarge_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Preview/Band1.png b/Assets/Female3DCG/Bracelet/Preview/Band1.png deleted file mode 100644 index d87fe498c..000000000 Binary files a/Assets/Female3DCG/Bracelet/Preview/Band1.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Preview/BowBand.png b/Assets/Female3DCG/Bracelet/Preview/BowBand.png deleted file mode 100644 index 0697a7135..000000000 Binary files a/Assets/Female3DCG/Bracelet/Preview/BowBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Preview/KinkBracelet.png b/Assets/Female3DCG/Bracelet/Preview/KinkBracelet.png deleted file mode 100644 index 83ce7f4a4..000000000 Binary files a/Assets/Female3DCG/Bracelet/Preview/KinkBracelet.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Preview/LaceBands.png b/Assets/Female3DCG/Bracelet/Preview/LaceBands.png deleted file mode 100644 index 43c50944d..000000000 Binary files a/Assets/Female3DCG/Bracelet/Preview/LaceBands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Preview/LesBand.png b/Assets/Female3DCG/Bracelet/Preview/LesBand.png deleted file mode 100644 index cd80eee8b..000000000 Binary files a/Assets/Female3DCG/Bracelet/Preview/LesBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Preview/SpikeBands.png b/Assets/Female3DCG/Bracelet/Preview/SpikeBands.png deleted file mode 100644 index 0ce038688..000000000 Binary files a/Assets/Female3DCG/Bracelet/Preview/SpikeBands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_LargeLeft_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_LargeLeft_Bands.png deleted file mode 100644 index 0905a89a0..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_LargeLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_LargeLeft_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_LargeLeft_Spikes.png deleted file mode 100644 index 066fdbf3b..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_LargeLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_LargeRight_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_LargeRight_Bands.png deleted file mode 100644 index 6a6ac62fc..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_LargeRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_LargeRight_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_LargeRight_Spikes.png deleted file mode 100644 index 8b2f84e4c..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_LargeRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_Large_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_Large_Bands.png deleted file mode 100644 index c2a41c3bc..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_Large_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_Large_Spikes.png deleted file mode 100644 index 86b25cc98..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_Large_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_NormalLeft_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_NormalLeft_Bands.png deleted file mode 100644 index 0905a89a0..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_NormalLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_NormalLeft_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_NormalLeft_Spikes.png deleted file mode 100644 index 066fdbf3b..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_NormalLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_NormalRight_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_NormalRight_Bands.png deleted file mode 100644 index 6a6ac62fc..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_NormalRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_NormalRight_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_NormalRight_Spikes.png deleted file mode 100644 index 8b2f84e4c..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_NormalRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_Normal_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_Normal_Bands.png deleted file mode 100644 index c2a41c3bc..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_Normal_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_Normal_Spikes.png deleted file mode 100644 index 2cdfd22d9..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_Normal_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_SmallLeft_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_SmallLeft_Bands.png deleted file mode 100644 index 0905a89a0..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_SmallLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_SmallLeft_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_SmallLeft_Spikes.png deleted file mode 100644 index 066fdbf3b..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_SmallLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_SmallRight_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_SmallRight_Bands.png deleted file mode 100644 index 6a6ac62fc..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_SmallRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_SmallRight_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_SmallRight_Spikes.png deleted file mode 100644 index 8b2f84e4c..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_SmallRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_Small_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_Small_Bands.png deleted file mode 100644 index d1bf895a1..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_Small_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_Small_Spikes.png deleted file mode 100644 index 2cdfd22d9..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_Small_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_XLargeLeft_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_XLargeLeft_Bands.png deleted file mode 100644 index 0905a89a0..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_XLargeLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_XLargeLeft_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_XLargeLeft_Spikes.png deleted file mode 100644 index 066fdbf3b..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_XLargeLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_XLargeRight_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_XLargeRight_Bands.png deleted file mode 100644 index 6a6ac62fc..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_XLargeRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_XLargeRight_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_XLargeRight_Spikes.png deleted file mode 100644 index 8b2f84e4c..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_XLargeRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_XLarge_Bands.png b/Assets/Female3DCG/Bracelet/SpikeBands_XLarge_Bands.png deleted file mode 100644 index c2a41c3bc..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/SpikeBands_XLarge_Spikes.png b/Assets/Female3DCG/Bracelet/SpikeBands_XLarge_Spikes.png deleted file mode 100644 index 2cdfd22d9..000000000 Binary files a/Assets/Female3DCG/Bracelet/SpikeBands_XLarge_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_Large.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_Large.png deleted file mode 100644 index abd71a058..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_LargeBoth.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_LargeBoth.png deleted file mode 100644 index 98a75a8c9..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_LargeBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_LargeRight.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_LargeRight.png deleted file mode 100644 index 4da6ab296..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_LargeRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_Normal.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_Normal.png deleted file mode 100644 index 9462d310b..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_NormalBoth.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_NormalBoth.png deleted file mode 100644 index ec0e0a349..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_NormalBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_NormalRight.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_NormalRight.png deleted file mode 100644 index 045ca3df0..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_NormalRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_Small.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_Small.png deleted file mode 100644 index cf85c8dcf..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_SmallBoth.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_SmallBoth.png deleted file mode 100644 index ccec65535..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_SmallBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_SmallRight.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_SmallRight.png deleted file mode 100644 index 036d84994..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_SmallRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_XLarge.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_XLarge.png deleted file mode 100644 index b62df21cb..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_XLargeBoth.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_XLargeBoth.png deleted file mode 100644 index 4ecdea361..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_XLargeBoth.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/Band1_XLargeRight.png b/Assets/Female3DCG/Bracelet/Yoked/Band1_XLargeRight.png deleted file mode 100644 index 43be4c4bf..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/Band1_XLargeRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/BowBand_Large.png b/Assets/Female3DCG/Bracelet/Yoked/BowBand_Large.png deleted file mode 100644 index 19e1f4412..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/BowBand_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/BowBand_Normal.png b/Assets/Female3DCG/Bracelet/Yoked/BowBand_Normal.png deleted file mode 100644 index 19e1f4412..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/BowBand_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/BowBand_Small.png b/Assets/Female3DCG/Bracelet/Yoked/BowBand_Small.png deleted file mode 100644 index 19e1f4412..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/BowBand_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/BowBand_XLarge.png b/Assets/Female3DCG/Bracelet/Yoked/BowBand_XLarge.png deleted file mode 100644 index 19e1f4412..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/BowBand_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_Large.png b/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_Large.png deleted file mode 100644 index e859f37ee..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_Normal.png b/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_Normal.png deleted file mode 100644 index e859f37ee..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_Small.png b/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_Small.png deleted file mode 100644 index e859f37ee..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_XLarge.png b/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_XLarge.png deleted file mode 100644 index e859f37ee..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/KinkBracelet_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Large_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Large_Bands.png deleted file mode 100644 index 995f5692e..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Large_Lace.png b/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Large_Lace.png deleted file mode 100644 index e1b9519ce..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Normal_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Normal_Bands.png deleted file mode 100644 index 22d4accc9..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Normal_Lace.png b/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Normal_Lace.png deleted file mode 100644 index 22c10238d..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Small_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Small_Bands.png deleted file mode 100644 index 22d4accc9..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Small_Lace.png b/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Small_Lace.png deleted file mode 100644 index 22c10238d..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_XLarge_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/LaceBands_XLarge_Bands.png deleted file mode 100644 index 995f5692e..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_XLarge_Lace.png b/Assets/Female3DCG/Bracelet/Yoked/LaceBands_XLarge_Lace.png deleted file mode 100644 index e1b9519ce..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LaceBands_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LesBand_Large.png b/Assets/Female3DCG/Bracelet/Yoked/LesBand_Large.png deleted file mode 100644 index 85252738c..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LesBand_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LesBand_Normal.png b/Assets/Female3DCG/Bracelet/Yoked/LesBand_Normal.png deleted file mode 100644 index 85252738c..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LesBand_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LesBand_Small.png b/Assets/Female3DCG/Bracelet/Yoked/LesBand_Small.png deleted file mode 100644 index 85252738c..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LesBand_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/LesBand_XLarge.png b/Assets/Female3DCG/Bracelet/Yoked/LesBand_XLarge.png deleted file mode 100644 index d2983e28a..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/LesBand_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeLeft_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeLeft_Bands.png deleted file mode 100644 index 3686c6870..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeLeft_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeLeft_Spikes.png deleted file mode 100644 index e47d61119..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeRight_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeRight_Bands.png deleted file mode 100644 index b6b0d2665..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeRight_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeRight_Spikes.png deleted file mode 100644 index 408d0264d..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_LargeRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Large_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Large_Bands.png deleted file mode 100644 index 3149ef273..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Large_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Large_Spikes.png deleted file mode 100644 index 93f8daee4..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Large_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalLeft_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalLeft_Bands.png deleted file mode 100644 index 3686c6870..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalLeft_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalLeft_Spikes.png deleted file mode 100644 index e47d61119..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalRight_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalRight_Bands.png deleted file mode 100644 index b6b0d2665..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalRight_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalRight_Spikes.png deleted file mode 100644 index 408d0264d..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_NormalRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Normal_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Normal_Bands.png deleted file mode 100644 index 3149ef273..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Normal_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Normal_Spikes.png deleted file mode 100644 index 93f8daee4..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Normal_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallLeft_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallLeft_Bands.png deleted file mode 100644 index 3686c6870..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallLeft_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallLeft_Spikes.png deleted file mode 100644 index e47d61119..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallRight_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallRight_Bands.png deleted file mode 100644 index b6b0d2665..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallRight_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallRight_Spikes.png deleted file mode 100644 index 408d0264d..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_SmallRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Small_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Small_Bands.png deleted file mode 100644 index 3149ef273..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Small_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Small_Spikes.png deleted file mode 100644 index 93f8daee4..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_Small_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeLeft_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeLeft_Bands.png deleted file mode 100644 index 3686c6870..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeLeft_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeLeft_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeLeft_Spikes.png deleted file mode 100644 index e47d61119..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeLeft_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeRight_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeRight_Bands.png deleted file mode 100644 index b6b0d2665..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeRight_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeRight_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeRight_Spikes.png deleted file mode 100644 index 408d0264d..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLargeRight_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLarge_Bands.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLarge_Bands.png deleted file mode 100644 index 3149ef273..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLarge_Spikes.png b/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLarge_Spikes.png deleted file mode 100644 index 93f8daee4..000000000 Binary files a/Assets/Female3DCG/Bracelet/Yoked/SpikeBands_XLarge_Spikes.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_Large_Jacket.png b/Assets/Female3DCG/Cloth/AdmiralTop_Large_Jacket.png deleted file mode 100644 index 2c013c1ac..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_Large_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_Large_Shirt.png b/Assets/Female3DCG/Cloth/AdmiralTop_Large_Shirt.png deleted file mode 100644 index 4af759ff9..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_Large_Trim.png b/Assets/Female3DCG/Cloth/AdmiralTop_Large_Trim.png deleted file mode 100644 index 8de39c02b..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_Normal_Jacket.png b/Assets/Female3DCG/Cloth/AdmiralTop_Normal_Jacket.png deleted file mode 100644 index dbb98997e..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_Normal_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_Normal_Shirt.png b/Assets/Female3DCG/Cloth/AdmiralTop_Normal_Shirt.png deleted file mode 100644 index b01f74fc4..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_Normal_Trim.png b/Assets/Female3DCG/Cloth/AdmiralTop_Normal_Trim.png deleted file mode 100644 index 1df3cfd54..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_Small_Jacket.png b/Assets/Female3DCG/Cloth/AdmiralTop_Small_Jacket.png deleted file mode 100644 index ce7d20c1e..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_Small_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_Small_Shirt.png b/Assets/Female3DCG/Cloth/AdmiralTop_Small_Shirt.png deleted file mode 100644 index d69a3ecb3..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_Small_Trim.png b/Assets/Female3DCG/Cloth/AdmiralTop_Small_Trim.png deleted file mode 100644 index 9fd788b52..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_XLarge_Jacket.png b/Assets/Female3DCG/Cloth/AdmiralTop_XLarge_Jacket.png deleted file mode 100644 index 42276e104..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_XLarge_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/AdmiralTop_XLarge_Shirt.png deleted file mode 100644 index 6e1a2cf0a..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdmiralTop_XLarge_Trim.png b/Assets/Female3DCG/Cloth/AdmiralTop_XLarge_Trim.png deleted file mode 100644 index f36bf576b..000000000 Binary files a/Assets/Female3DCG/Cloth/AdmiralTop_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_Large_Dress.png deleted file mode 100644 index bb6aaa29d..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_Large_Sash.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_Large_Sash.png deleted file mode 100644 index 699af7c4b..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_Large_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_Large_Trim.png deleted file mode 100644 index 256fba1e2..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_Normal_Dress.png deleted file mode 100644 index 06e0bdc30..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_Normal_Sash.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_Normal_Sash.png deleted file mode 100644 index f39627680..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_Normal_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_Normal_Trim.png deleted file mode 100644 index c209deec9..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_Small_Dress.png deleted file mode 100644 index 0d390d12f..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_Small_Sash.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_Small_Sash.png deleted file mode 100644 index 69718888b..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_Small_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_Small_Trim.png deleted file mode 100644 index f46779a33..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_XLarge_Dress.png deleted file mode 100644 index 27c350773..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_XLarge_Sash.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_XLarge_Sash.png deleted file mode 100644 index f0711ed6c..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_XLarge_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/AdultBabyDress1_XLarge_Trim.png deleted file mode 100644 index 4e3e08b5a..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_Large_Bow.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_Large_Bow.png deleted file mode 100644 index 5eb037577..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_Large_Dress.png deleted file mode 100644 index e5ab14060..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_Large_Lace.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_Large_Lace.png deleted file mode 100644 index 6ddb52f69..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_Normal_Bow.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_Normal_Bow.png deleted file mode 100644 index 719ee62d3..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_Normal_Dress.png deleted file mode 100644 index cde55596d..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_Normal_Lace.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_Normal_Lace.png deleted file mode 100644 index f302da4fc..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_Small_Bow.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_Small_Bow.png deleted file mode 100644 index acab42801..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_Small_Dress.png deleted file mode 100644 index 14a3fa480..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_Small_Lace.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_Small_Lace.png deleted file mode 100644 index 090fe6645..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_XLarge_Bow.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_XLarge_Bow.png deleted file mode 100644 index 1901cd4e2..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_XLarge_Dress.png deleted file mode 100644 index a65157128..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress2_XLarge_Lace.png b/Assets/Female3DCG/Cloth/AdultBabyDress2_XLarge_Lace.png deleted file mode 100644 index 84254a508..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress2_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_Large_Belt.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_Large_Belt.png deleted file mode 100644 index 4b1c3d78e..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_Large_Collar.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_Large_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_Large_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_Large_Dress.png deleted file mode 100644 index b8fab9cb6..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_Normal_Belt.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_Normal_Belt.png deleted file mode 100644 index 4e6b10b7b..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_Normal_Collar.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_Normal_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_Normal_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_Normal_Dress.png deleted file mode 100644 index e665d9680..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_Small_Belt.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_Small_Belt.png deleted file mode 100644 index 7a21ef799..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_Small_Collar.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_Small_Collar.png deleted file mode 100644 index e1d288227..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_Small_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_Small_Dress.png deleted file mode 100644 index a5ce4a2e5..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_XLarge_Belt.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_XLarge_Belt.png deleted file mode 100644 index b6db1a32b..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_XLarge_Collar.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_XLarge_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress3_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AdultBabyDress3_XLarge_Dress.png deleted file mode 100644 index f866bbcda..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress3_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress4_Large.png b/Assets/Female3DCG/Cloth/AdultBabyDress4_Large.png deleted file mode 100644 index 1827f7fe3..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress4_Normal.png b/Assets/Female3DCG/Cloth/AdultBabyDress4_Normal.png deleted file mode 100644 index 94f458996..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress4_Small.png b/Assets/Female3DCG/Cloth/AdultBabyDress4_Small.png deleted file mode 100644 index 441d50f1a..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AdultBabyDress4_XLarge.png b/Assets/Female3DCG/Cloth/AdultBabyDress4_XLarge.png deleted file mode 100644 index f488a1d91..000000000 Binary files a/Assets/Female3DCG/Cloth/AdultBabyDress4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Large_Jacket.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Large_Jacket.png deleted file mode 100644 index cbaf27bbf..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Large_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Large_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Large_Shirt.png deleted file mode 100644 index 8916fad65..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Large_Trim.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Large_Trim.png deleted file mode 100644 index a41d74deb..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Normal_Jacket.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Normal_Jacket.png deleted file mode 100644 index 7fc5e2ac7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Normal_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Normal_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Normal_Shirt.png deleted file mode 100644 index 89acc3706..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Normal_Trim.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Normal_Trim.png deleted file mode 100644 index 241b7a9e9..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Small_Jacket.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Small_Jacket.png deleted file mode 100644 index 57f4d1306..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Small_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Small_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Small_Shirt.png deleted file mode 100644 index 73824c3b7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Small_Trim.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Small_Trim.png deleted file mode 100644 index 18ae16f42..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_XLarge_Jacket.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_XLarge_Jacket.png deleted file mode 100644 index 23f5e7cb3..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_XLarge_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_XLarge_Shirt.png deleted file mode 100644 index aac71af1b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_XLarge_Trim.png b/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_XLarge_Trim.png deleted file mode 100644 index 82c322b01..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdmiralTop_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Large_Dress.png deleted file mode 100644 index 7c3fcfc5f..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Large_Sash.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Large_Sash.png deleted file mode 100644 index ab9ffa546..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Large_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Large_Trim.png deleted file mode 100644 index 87bc6b67c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Normal_Dress.png deleted file mode 100644 index c2530e3ee..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Normal_Sash.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Normal_Sash.png deleted file mode 100644 index 36bc25134..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Normal_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Normal_Trim.png deleted file mode 100644 index 6993e655f..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Small_Dress.png deleted file mode 100644 index 7c502478b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Small_Sash.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Small_Sash.png deleted file mode 100644 index 39969c18a..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Small_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Small_Trim.png deleted file mode 100644 index 4055c0a0d..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_XLarge_Dress.png deleted file mode 100644 index 6bc27fbad..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_XLarge_Sash.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_XLarge_Sash.png deleted file mode 100644 index ba305434a..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_XLarge_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_XLarge_Trim.png deleted file mode 100644 index 9e43a8c74..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Large_Bow.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Large_Bow.png deleted file mode 100644 index 89b455864..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Large_Dress.png deleted file mode 100644 index ba8a1ca1c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Large_Lace.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Large_Lace.png deleted file mode 100644 index 22a174519..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Normal_Bow.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Normal_Bow.png deleted file mode 100644 index b95c08aac..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Normal_Dress.png deleted file mode 100644 index 5fad26286..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Normal_Lace.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Normal_Lace.png deleted file mode 100644 index c5e22b998..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Small_Bow.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Small_Bow.png deleted file mode 100644 index 25aab4afb..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Small_Dress.png deleted file mode 100644 index 9c8ba3899..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Small_Lace.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Small_Lace.png deleted file mode 100644 index dfa1662b7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_XLarge_Bow.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_XLarge_Bow.png deleted file mode 100644 index f6a0daea6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_XLarge_Dress.png deleted file mode 100644 index f9276d2f6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_XLarge_Lace.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_XLarge_Lace.png deleted file mode 100644 index f3b2a652b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress2_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Large_Collar.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Large_Collar.png deleted file mode 100644 index 760350ff3..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Large_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Large_Dress.png deleted file mode 100644 index 346331af2..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Normal_Collar.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Normal_Collar.png deleted file mode 100644 index 71fc4b43d..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Normal_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Normal_Dress.png deleted file mode 100644 index ec252b505..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Small_Collar.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Small_Collar.png deleted file mode 100644 index e1614e80d..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Small_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Small_Dress.png deleted file mode 100644 index bb41eec52..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_XLarge_Collar.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_XLarge_Collar.png deleted file mode 100644 index 5a023a757..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_XLarge_Dress.png deleted file mode 100644 index 58764440d..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress3_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_Large.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_Large.png deleted file mode 100644 index 40b891bc6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_Normal.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_Normal.png deleted file mode 100644 index 611579223..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_Small.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_Small.png deleted file mode 100644 index e8b52d214..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_XLarge.png deleted file mode 100644 index f5eb3cf58..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/AdultBabyDress4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Large_Dress.png deleted file mode 100644 index 30d0565dd..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Large_Trim.png deleted file mode 100644 index 40eaee546..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Normal_Dress.png deleted file mode 100644 index baa143406..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Normal_Trim.png deleted file mode 100644 index 8956dfd1c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Small_Dress.png deleted file mode 100644 index aa7560de4..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Small_Trim.png deleted file mode 100644 index 24c4d875e..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_XLarge_Dress.png deleted file mode 100644 index 8b0974735..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_XLarge_Trim.png deleted file mode 100644 index f0be001cd..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BabydollDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_Large.png b/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_Large.png deleted file mode 100644 index 88fd232e8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_Normal.png deleted file mode 100644 index 2bc06f481..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_Small.png b/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_Small.png deleted file mode 100644 index cfa12b0e4..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_XLarge.png deleted file mode 100644 index 14f4581ae..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BodyTowel1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_Large.png b/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_Large.png deleted file mode 100644 index 035810835..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_Normal.png deleted file mode 100644 index f2fc7366d..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_Small.png b/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_Small.png deleted file mode 100644 index e205d60dc..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_XLarge.png deleted file mode 100644 index aa1649d4b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageBustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_Large.png b/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_Large.png deleted file mode 100644 index 28a663669..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_Normal.png b/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_Normal.png deleted file mode 100644 index 11c254670..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_Small.png b/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_Small.png deleted file mode 100644 index ead9a1e5b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_XLarge.png deleted file mode 100644 index 17faf339e..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageBustier2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageDress1_Large.png b/Assets/Female3DCG/Cloth/AllFours/BondageDress1_Large.png deleted file mode 100644 index 7e8374ffc..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageDress1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/BondageDress1_Normal.png deleted file mode 100644 index 8fe2894e6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageDress1_Small.png b/Assets/Female3DCG/Cloth/AllFours/BondageDress1_Small.png deleted file mode 100644 index da5f09801..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageDress1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/BondageDress1_XLarge.png deleted file mode 100644 index f2bad732e..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageDress2_Large.png b/Assets/Female3DCG/Cloth/AllFours/BondageDress2_Large.png deleted file mode 100644 index 5a3688dcd..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageDress2_Normal.png b/Assets/Female3DCG/Cloth/AllFours/BondageDress2_Normal.png deleted file mode 100644 index 7a7799903..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageDress2_Small.png b/Assets/Female3DCG/Cloth/AllFours/BondageDress2_Small.png deleted file mode 100644 index 451f7690a..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BondageDress2_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/BondageDress2_XLarge.png deleted file mode 100644 index e8430bfa9..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BondageDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_Large.png b/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_Large.png deleted file mode 100644 index eda9b40c6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_Normal.png deleted file mode 100644 index 0950a5c7a..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_Small.png b/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_Small.png deleted file mode 100644 index b9d1a45a8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_XLarge.png deleted file mode 100644 index 4c69d667b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/BridesmaidDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_Large.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_Large.png deleted file mode 100644 index 70ba43f66..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_Normal.png deleted file mode 100644 index ad1be5cf1..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_Small.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_Small.png deleted file mode 100644 index 2c3dda942..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_XLarge.png deleted file mode 100644 index ea8b3c047..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Large_Dress.png deleted file mode 100644 index 31ff564fb..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Large_Edges.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Large_Edges.png deleted file mode 100644 index 6793478f0..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Large_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Normal_Dress.png deleted file mode 100644 index c30f66c63..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Normal_Edges.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Normal_Edges.png deleted file mode 100644 index 9844df6b7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Normal_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Small_Dress.png deleted file mode 100644 index c12c34e8e..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Small_Edges.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Small_Edges.png deleted file mode 100644 index 96c4283b8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_Small_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_XLarge_Dress.png deleted file mode 100644 index d9ac8f424..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_XLarge_Edges.png b/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_XLarge_Edges.png deleted file mode 100644 index 65f8f5abe..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ChineseDress2_XLarge_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Large_Shirt.png deleted file mode 100644 index af52ba96c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Large_Tie.png b/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Large_Tie.png deleted file mode 100644 index 11506287c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Large_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Normal_Shirt.png deleted file mode 100644 index c79342f34..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Normal_Tie.png b/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Normal_Tie.png deleted file mode 100644 index 239f1a46b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Normal_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Small_Shirt.png deleted file mode 100644 index 9ead08113..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Small_Tie.png b/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Small_Tie.png deleted file mode 100644 index f11b8494c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_Small_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_XLarge_Shirt.png deleted file mode 100644 index d885e8abf..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_XLarge_Tie.png b/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_XLarge_Tie.png deleted file mode 100644 index 079116311..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CollegeOutfit1_XLarge_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ComfyTop_Large.png b/Assets/Female3DCG/Cloth/AllFours/ComfyTop_Large.png deleted file mode 100644 index a75890fef..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ComfyTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ComfyTop_Normal.png b/Assets/Female3DCG/Cloth/AllFours/ComfyTop_Normal.png deleted file mode 100644 index 0c6908ff5..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ComfyTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ComfyTop_Small.png b/Assets/Female3DCG/Cloth/AllFours/ComfyTop_Small.png deleted file mode 100644 index 658953004..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ComfyTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ComfyTop_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/ComfyTop_XLarge.png deleted file mode 100644 index a28e467a4..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ComfyTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Large_Corset.png b/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Large_Corset.png deleted file mode 100644 index 634ced7fd..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Large_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Large_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Large_Shirt.png deleted file mode 100644 index 368dfbd43..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Normal_Corset.png b/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Normal_Corset.png deleted file mode 100644 index 634ced7fd..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Normal_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Normal_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Normal_Shirt.png deleted file mode 100644 index 368dfbd43..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Small_Corset.png b/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Small_Corset.png deleted file mode 100644 index 634ced7fd..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Small_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Small_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Small_Shirt.png deleted file mode 100644 index 368dfbd43..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_XLarge_Corset.png b/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_XLarge_Corset.png deleted file mode 100644 index 634ced7fd..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_XLarge_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_XLarge_Shirt.png deleted file mode 100644 index 368dfbd43..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/CorsetShirt_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Dress2_Large.png b/Assets/Female3DCG/Cloth/AllFours/Dress2_Large.png deleted file mode 100644 index 6791ffa0e..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Dress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Dress2_Normal.png b/Assets/Female3DCG/Cloth/AllFours/Dress2_Normal.png deleted file mode 100644 index c69a827eb..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Dress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Dress2_Small.png b/Assets/Female3DCG/Cloth/AllFours/Dress2_Small.png deleted file mode 100644 index 83fdb9bef..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Dress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Dress2_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/Dress2_XLarge.png deleted file mode 100644 index 43212bb31..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Dress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Dress3_Large.png b/Assets/Female3DCG/Cloth/AllFours/Dress3_Large.png deleted file mode 100644 index 805ba2936..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Dress3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Dress3_Normal.png b/Assets/Female3DCG/Cloth/AllFours/Dress3_Normal.png deleted file mode 100644 index 32d9af294..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Dress3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Dress3_Small.png b/Assets/Female3DCG/Cloth/AllFours/Dress3_Small.png deleted file mode 100644 index d20fea030..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Dress3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Dress3_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/Dress3_XLarge.png deleted file mode 100644 index fc86d5876..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Dress3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/DressFur_Large_Fabric.png b/Assets/Female3DCG/Cloth/AllFours/DressFur_Large_Fabric.png deleted file mode 100644 index d655d3dfc..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/DressFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/DressFur_Large_Fur.png b/Assets/Female3DCG/Cloth/AllFours/DressFur_Large_Fur.png deleted file mode 100644 index bc92632dd..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/DressFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/DressFur_Normal_Fabric.png b/Assets/Female3DCG/Cloth/AllFours/DressFur_Normal_Fabric.png deleted file mode 100644 index 47183fe45..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/DressFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/DressFur_Normal_Fur.png b/Assets/Female3DCG/Cloth/AllFours/DressFur_Normal_Fur.png deleted file mode 100644 index f6c6132ad..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/DressFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/DressFur_Small_Fabric.png b/Assets/Female3DCG/Cloth/AllFours/DressFur_Small_Fabric.png deleted file mode 100644 index e16cbb723..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/DressFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/DressFur_Small_Fur.png b/Assets/Female3DCG/Cloth/AllFours/DressFur_Small_Fur.png deleted file mode 100644 index 9871005ee..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/DressFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/DressFur_XLarge_Fabric.png b/Assets/Female3DCG/Cloth/AllFours/DressFur_XLarge_Fabric.png deleted file mode 100644 index 085cf949a..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/DressFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/DressFur_XLarge_Fur.png b/Assets/Female3DCG/Cloth/AllFours/DressFur_XLarge_Fur.png deleted file mode 100644 index a74e9e7a8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/DressFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Large_Dress.png b/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Large_Dress.png deleted file mode 100644 index fb8fe5335..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Large_Flower.png b/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Large_Flower.png deleted file mode 100644 index 69806137a..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Large_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Normal_Dress.png b/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Normal_Dress.png deleted file mode 100644 index 06f6b93e0..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Normal_Flower.png b/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Normal_Flower.png deleted file mode 100644 index 69b70d647..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Normal_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Small_Dress.png b/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Small_Dress.png deleted file mode 100644 index fa7c1482f..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Small_Flower.png b/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Small_Flower.png deleted file mode 100644 index f1aa88307..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_Small_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AllFours/FlowerDress_XLarge_Dress.png deleted file mode 100644 index 87b30f354..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_XLarge_Flower.png b/Assets/Female3DCG/Cloth/AllFours/FlowerDress_XLarge_Flower.png deleted file mode 100644 index 4b00c20e3..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/FlowerDress_XLarge_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/FurCoat_Upper.png b/Assets/Female3DCG/Cloth/AllFours/FurCoat_Upper.png deleted file mode 100644 index 729218e15..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/FurCoat_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown1_Large.png b/Assets/Female3DCG/Cloth/AllFours/Gown1_Large.png deleted file mode 100644 index f57a99105..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/Gown1_Normal.png deleted file mode 100644 index c392ba27a..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown1_Small.png b/Assets/Female3DCG/Cloth/AllFours/Gown1_Small.png deleted file mode 100644 index 7e9e4288c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/Gown1_XLarge.png deleted file mode 100644 index c22842110..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown2Top_Large.png b/Assets/Female3DCG/Cloth/AllFours/Gown2Top_Large.png deleted file mode 100644 index 715cb78e8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown2Top_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown2Top_Normal.png b/Assets/Female3DCG/Cloth/AllFours/Gown2Top_Normal.png deleted file mode 100644 index d8236be63..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown2Top_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown2Top_Small.png b/Assets/Female3DCG/Cloth/AllFours/Gown2Top_Small.png deleted file mode 100644 index eb50f4ac7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown2Top_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown2Top_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/Gown2Top_XLarge.png deleted file mode 100644 index a9f334c8a..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown2Top_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown3_Large.png b/Assets/Female3DCG/Cloth/AllFours/Gown3_Large.png deleted file mode 100644 index f05dc565b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown3_Normal.png b/Assets/Female3DCG/Cloth/AllFours/Gown3_Normal.png deleted file mode 100644 index dffc18d4c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown3_Small.png b/Assets/Female3DCG/Cloth/AllFours/Gown3_Small.png deleted file mode 100644 index 59cba4543..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Gown3_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/Gown3_XLarge.png deleted file mode 100644 index f1cd29411..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Gown3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Jacket_Base.png b/Assets/Female3DCG/Cloth/AllFours/Jacket_Base.png deleted file mode 100644 index a097cd638..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Jacket_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_Large.png b/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_Large.png deleted file mode 100644 index a72d5a2cb..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_Normal.png b/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_Normal.png deleted file mode 100644 index 96260fee7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_Small.png b/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_Small.png deleted file mode 100644 index ff54aebe2..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_XLarge.png deleted file mode 100644 index e08ffb5d5..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LaceBabydoll_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_Large.png b/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_Large.png deleted file mode 100644 index 685c61ba8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_LargeNonLaced.png b/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_LargeNonLaced.png deleted file mode 100644 index f9aa995e3..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_LargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_Normal.png b/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_Normal.png deleted file mode 100644 index 5ebd1a308..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_NormalNonLaced.png b/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_NormalNonLaced.png deleted file mode 100644 index 8093c2f57..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_NormalNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_Small.png b/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_Small.png deleted file mode 100644 index a4ab2f940..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_SmallNonLaced.png b/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_SmallNonLaced.png deleted file mode 100644 index f63140630..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_SmallNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_XLarge.png deleted file mode 100644 index 7f0144f49..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_XLargeNonLaced.png b/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_XLargeNonLaced.png deleted file mode 100644 index 218f4e16b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexLacedSuit_XLargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexTop_Large.png b/Assets/Female3DCG/Cloth/AllFours/LatexTop_Large.png deleted file mode 100644 index 685c61ba8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexTop_Normal.png b/Assets/Female3DCG/Cloth/AllFours/LatexTop_Normal.png deleted file mode 100644 index 5ebd1a308..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexTop_Small.png b/Assets/Female3DCG/Cloth/AllFours/LatexTop_Small.png deleted file mode 100644 index a4ab2f940..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LatexTop_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/LatexTop_XLarge.png deleted file mode 100644 index 7f0144f49..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LatexTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_Large.png b/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_Large.png deleted file mode 100644 index bad2cf556..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_Normal.png b/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_Normal.png deleted file mode 100644 index 60824a827..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_Small.png b/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_Small.png deleted file mode 100644 index 427548b11..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_XLarge.png deleted file mode 100644 index 8daa057d1..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LeatherBolero_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_Large.png b/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_Large.png deleted file mode 100644 index 9c8b9c4ba..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_Normal.png b/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_Normal.png deleted file mode 100644 index f91ef45cb..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_Small.png b/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_Small.png deleted file mode 100644 index 667a2cc54..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_XLarge.png deleted file mode 100644 index 9c8b9c4ba..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/LeatherCropTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidApron1_Large.png b/Assets/Female3DCG/Cloth/AllFours/MaidApron1_Large.png deleted file mode 100644 index 38f1b8059..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidApron1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidApron1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/MaidApron1_Normal.png deleted file mode 100644 index a6bb9a1b8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidApron1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidApron1_Small.png b/Assets/Female3DCG/Cloth/AllFours/MaidApron1_Small.png deleted file mode 100644 index e1f2c68b2..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidApron1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidApron1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/MaidApron1_XLarge.png deleted file mode 100644 index 073d32261..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidApron1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidApron2_Large.png b/Assets/Female3DCG/Cloth/AllFours/MaidApron2_Large.png deleted file mode 100644 index e8cf7b4e8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidApron2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidApron2_Normal.png b/Assets/Female3DCG/Cloth/AllFours/MaidApron2_Normal.png deleted file mode 100644 index c0454906f..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidApron2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidApron2_Small.png b/Assets/Female3DCG/Cloth/AllFours/MaidApron2_Small.png deleted file mode 100644 index e2fc00fa8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidApron2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidApron2_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/MaidApron2_XLarge.png deleted file mode 100644 index 638f029f8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidApron2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Large_Apron.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Large_Apron.png deleted file mode 100644 index 13e320bfc..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Large_Dress.png deleted file mode 100644 index 07d67d395..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Large_Frills.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Large_Frills.png deleted file mode 100644 index 30e3afbd7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Normal_Apron.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Normal_Apron.png deleted file mode 100644 index 0154d9686..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Normal_Dress.png deleted file mode 100644 index 75e79a28f..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Normal_Frills.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Normal_Frills.png deleted file mode 100644 index aca06c9c6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Small_Apron.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Small_Apron.png deleted file mode 100644 index ece7897ca..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Small_Dress.png deleted file mode 100644 index 0fea36450..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Small_Frills.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Small_Frills.png deleted file mode 100644 index eb9490cd8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_XLarge_Apron.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_XLarge_Apron.png deleted file mode 100644 index 6f50d85a6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_XLarge_Dress.png deleted file mode 100644 index 021e2892d..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_XLarge_Frills.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_XLarge_Frills.png deleted file mode 100644 index 10439f099..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit1_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Large_Apron.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Large_Apron.png deleted file mode 100644 index 15089c86f..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Large_Dress.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Large_Dress.png deleted file mode 100644 index 02a4d4096..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Large_Frills.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Large_Frills.png deleted file mode 100644 index fe791ea72..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Normal_Apron.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Normal_Apron.png deleted file mode 100644 index 1026cfc09..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Normal_Dress.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Normal_Dress.png deleted file mode 100644 index ad144e58f..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Normal_Frills.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Normal_Frills.png deleted file mode 100644 index d4dc3ac4a..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Small_Apron.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Small_Apron.png deleted file mode 100644 index 7520dfe01..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Small_Dress.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Small_Dress.png deleted file mode 100644 index 54a952c72..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Small_Frills.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Small_Frills.png deleted file mode 100644 index 6066029f6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_XLarge_Apron.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_XLarge_Apron.png deleted file mode 100644 index 49d3be6bb..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_XLarge_Dress.png deleted file mode 100644 index 835bfacfb..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_XLarge_Frills.png b/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_XLarge_Frills.png deleted file mode 100644 index b43cc462a..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MaidOutfit2_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MistressTop_Large.png b/Assets/Female3DCG/Cloth/AllFours/MistressTop_Large.png deleted file mode 100644 index cf5a9d648..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MistressTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MistressTop_Normal.png b/Assets/Female3DCG/Cloth/AllFours/MistressTop_Normal.png deleted file mode 100644 index 9a328483b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MistressTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MistressTop_Small.png b/Assets/Female3DCG/Cloth/AllFours/MistressTop_Small.png deleted file mode 100644 index 70919d933..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MistressTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/MistressTop_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/MistressTop_XLarge.png deleted file mode 100644 index 805da5892..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/MistressTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/NurseUniform_Large.png b/Assets/Female3DCG/Cloth/AllFours/NurseUniform_Large.png deleted file mode 100644 index 83c6ced08..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/NurseUniform_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/NurseUniform_Normal.png b/Assets/Female3DCG/Cloth/AllFours/NurseUniform_Normal.png deleted file mode 100644 index ff0eaf318..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/NurseUniform_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/NurseUniform_Small.png b/Assets/Female3DCG/Cloth/AllFours/NurseUniform_Small.png deleted file mode 100644 index 373457a78..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/NurseUniform_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/NurseUniform_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/NurseUniform_XLarge.png deleted file mode 100644 index 71c973f8d..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/NurseUniform_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Robe1_Large.png b/Assets/Female3DCG/Cloth/AllFours/Robe1_Large.png deleted file mode 100644 index 087d539cc..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Robe1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Robe1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/Robe1_Normal.png deleted file mode 100644 index 92ccdd4ae..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Robe1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Robe1_Small.png b/Assets/Female3DCG/Cloth/AllFours/Robe1_Small.png deleted file mode 100644 index 3fe06c90d..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Robe1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Robe1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/Robe1_XLarge.png deleted file mode 100644 index 846687177..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Robe1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_Large.png b/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_Large.png deleted file mode 100644 index 477254e20..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_Normal.png b/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_Normal.png deleted file mode 100644 index 9dbe750e1..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_Small.png b/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_Small.png deleted file mode 100644 index b1b46feda..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_XLarge.png deleted file mode 100644 index 0ebfb1f6b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/ShoulderlessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_Large.png b/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_Large.png deleted file mode 100644 index 68e1bf753..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_Normal.png b/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_Normal.png deleted file mode 100644 index b29b6b946..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_Small.png b/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_Small.png deleted file mode 100644 index 051555186..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_XLarge.png deleted file mode 100644 index b7ef164fb..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SleevelessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Large_Bow.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Large_Bow.png deleted file mode 100644 index 338bc9a41..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Large_Dress.png deleted file mode 100644 index e07ba5ad5..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Large_Shirt.png deleted file mode 100644 index c54c0343c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Normal_Bow.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Normal_Bow.png deleted file mode 100644 index b1c9e5560..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Normal_Dress.png deleted file mode 100644 index 6c5cb9f04..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Normal_Shirt.png deleted file mode 100644 index b5308f57c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Small_Bow.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Small_Bow.png deleted file mode 100644 index 960772e53..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Small_Dress.png deleted file mode 100644 index 9e6ca30e8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Small_Shirt.png deleted file mode 100644 index 669a9ab9e..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_XLarge_Bow.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_XLarge_Bow.png deleted file mode 100644 index 5f65960d1..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_XLarge_Dress.png deleted file mode 100644 index aef795980..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_XLarge_Shirt.png deleted file mode 100644 index fef7c2569..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_Large.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_Large.png deleted file mode 100644 index 33a244330..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_Normal.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_Normal.png deleted file mode 100644 index 6f93418fa..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_Small.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_Small.png deleted file mode 100644 index aa10f12af..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_XLarge.png deleted file mode 100644 index 50695538c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Large_Color.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Large_Color.png deleted file mode 100644 index 0d8dea12a..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Large_White.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Large_White.png deleted file mode 100644 index 08318eea1..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Normal_Color.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Normal_Color.png deleted file mode 100644 index c2118da4f..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Normal_White.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Normal_White.png deleted file mode 100644 index 07b474e03..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Small_Color.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Small_Color.png deleted file mode 100644 index 73efd3cfb..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Small_White.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Small_White.png deleted file mode 100644 index 0619cdc3e..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_XLarge_Color.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_XLarge_Color.png deleted file mode 100644 index a10a0cc28..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_XLarge_White.png b/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_XLarge_White.png deleted file mode 100644 index abbe0528b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/StudentOutfit3_XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Base.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Base.png deleted file mode 100644 index 8f7414186..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer1.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer1.png deleted file mode 100644 index 4b93deafe..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer2.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer2.png deleted file mode 100644 index 351f0cad6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer3.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer3.png deleted file mode 100644 index c47994c76..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer4.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer4.png deleted file mode 100644 index c9ff520ab..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Base.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Base.png deleted file mode 100644 index bccec1063..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer1.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer1.png deleted file mode 100644 index b8f6277d6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer2.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer2.png deleted file mode 100644 index 4f0713048..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer3.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer3.png deleted file mode 100644 index fd6a1df06..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer4.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer4.png deleted file mode 100644 index e38284cf1..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Base.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Base.png deleted file mode 100644 index e2bc9c7d8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer1.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer1.png deleted file mode 100644 index 7d83512dc..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer2.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer2.png deleted file mode 100644 index 4b3376288..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer3.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer3.png deleted file mode 100644 index eee52687b..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer4.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer4.png deleted file mode 100644 index 1dcfdd79e..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Base.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Base.png deleted file mode 100644 index a8bda55aa..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer1.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer1.png deleted file mode 100644 index 3cd3fc42c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer2.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer2.png deleted file mode 100644 index aa641e8ef..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer3.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer3.png deleted file mode 100644 index b6b7f3254..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer4.png b/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer4.png deleted file mode 100644 index abd78a15e..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SummerDress_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_Large.png b/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_Large.png deleted file mode 100644 index db3bb8a80..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_Normal.png deleted file mode 100644 index 9cbaccdd6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_Small.png b/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_Small.png deleted file mode 100644 index 612da7483..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_XLarge.png deleted file mode 100644 index 41e28a150..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/SuspenderTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Sweater1_Large.png b/Assets/Female3DCG/Cloth/AllFours/Sweater1_Large.png deleted file mode 100644 index f2c5714df..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Sweater1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Sweater1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/Sweater1_Normal.png deleted file mode 100644 index 622acf9aa..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Sweater1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Sweater1_Small.png b/Assets/Female3DCG/Cloth/AllFours/Sweater1_Small.png deleted file mode 100644 index 094cb292e..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Sweater1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Sweater1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/Sweater1_XLarge.png deleted file mode 100644 index 93e6deba3..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Sweater1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt1_Large.png b/Assets/Female3DCG/Cloth/AllFours/TShirt1_Large.png deleted file mode 100644 index 7349d25f2..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/TShirt1_Normal.png deleted file mode 100644 index e0eac1fa1..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt1_Small.png b/Assets/Female3DCG/Cloth/AllFours/TShirt1_Small.png deleted file mode 100644 index 109e48d1c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/TShirt1_XLarge.png deleted file mode 100644 index 830bc0be3..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt2BCLogo_Print.png b/Assets/Female3DCG/Cloth/AllFours/TShirt2BCLogo_Print.png deleted file mode 100644 index 095d62e0f..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt2BCLogo_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt2BDSM_Print.png b/Assets/Female3DCG/Cloth/AllFours/TShirt2BDSM_Print.png deleted file mode 100644 index 543c970c6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt2BDSM_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt2Gag_Print.png b/Assets/Female3DCG/Cloth/AllFours/TShirt2Gag_Print.png deleted file mode 100644 index 060bddb63..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt2Gag_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt2Knot_Print.png b/Assets/Female3DCG/Cloth/AllFours/TShirt2Knot_Print.png deleted file mode 100644 index 7cbe94486..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt2Knot_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt2Rock_Print.png b/Assets/Female3DCG/Cloth/AllFours/TShirt2Rock_Print.png deleted file mode 100644 index 2a46212e7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt2Rock_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt2Smile_Print.png b/Assets/Female3DCG/Cloth/AllFours/TShirt2Smile_Print.png deleted file mode 100644 index 756c73aee..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt2Smile_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt2Tick_Print.png b/Assets/Female3DCG/Cloth/AllFours/TShirt2Tick_Print.png deleted file mode 100644 index d9b5af4f7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt2Tick_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt2_Large_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/TShirt2_Large_Shirt.png deleted file mode 100644 index a1934bfc0..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt2_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt2_Normal_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/TShirt2_Normal_Shirt.png deleted file mode 100644 index 049831aa7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt2_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt2_Small_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/TShirt2_Small_Shirt.png deleted file mode 100644 index 19a7ce59c..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt2_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TShirt2_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/AllFours/TShirt2_XLarge_Shirt.png deleted file mode 100644 index 58eac64f6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TShirt2_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_Large.png b/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_Large.png deleted file mode 100644 index d1d117150..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_Normal.png deleted file mode 100644 index 350fbbdda..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_Small.png b/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_Small.png deleted file mode 100644 index b86eb1185..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_XLarge.png deleted file mode 100644 index 4040dc552..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TeacherOutfit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_Large.png b/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_Large.png deleted file mode 100644 index ae3aaa9ea..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_Normal.png deleted file mode 100644 index a705bdcfa..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_Small.png b/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_Small.png deleted file mode 100644 index af07ee7de..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_XLarge.png deleted file mode 100644 index 006337fe8..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/TennisShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_Large.png deleted file mode 100644 index 2cb1e2080..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_Normal.png deleted file mode 100644 index 5a73f9c55..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_Small.png deleted file mode 100644 index 9f3457433..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_XLarge.png deleted file mode 100644 index 7efb77324..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_Large.png deleted file mode 100644 index 9e07d70c6..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_Normal.png deleted file mode 100644 index 7852155f7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_Small.png deleted file mode 100644 index dd6320864..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_XLarge.png deleted file mode 100644 index a683ea8f9..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Yukata1_Large.png b/Assets/Female3DCG/Cloth/AllFours/Yukata1_Large.png deleted file mode 100644 index 357f5ef09..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Yukata1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Yukata1_Normal.png b/Assets/Female3DCG/Cloth/AllFours/Yukata1_Normal.png deleted file mode 100644 index ce95ebf34..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Yukata1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Yukata1_Small.png b/Assets/Female3DCG/Cloth/AllFours/Yukata1_Small.png deleted file mode 100644 index 0bb58e380..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Yukata1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/AllFours/Yukata1_XLarge.png b/Assets/Female3DCG/Cloth/AllFours/Yukata1_XLarge.png deleted file mode 100644 index cb10658f7..000000000 Binary files a/Assets/Female3DCG/Cloth/AllFours/Yukata1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BabydollDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/BabydollDress1_Large_Dress.png deleted file mode 100644 index 12637875f..000000000 Binary files a/Assets/Female3DCG/Cloth/BabydollDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BabydollDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/BabydollDress1_Large_Trim.png deleted file mode 100644 index adca759da..000000000 Binary files a/Assets/Female3DCG/Cloth/BabydollDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BabydollDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BabydollDress1_Normal_Dress.png deleted file mode 100644 index 2797f9ce9..000000000 Binary files a/Assets/Female3DCG/Cloth/BabydollDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BabydollDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/BabydollDress1_Normal_Trim.png deleted file mode 100644 index fdb1d91ab..000000000 Binary files a/Assets/Female3DCG/Cloth/BabydollDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BabydollDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/BabydollDress1_Small_Dress.png deleted file mode 100644 index 5a61d4485..000000000 Binary files a/Assets/Female3DCG/Cloth/BabydollDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BabydollDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/BabydollDress1_Small_Trim.png deleted file mode 100644 index 66555e854..000000000 Binary files a/Assets/Female3DCG/Cloth/BabydollDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BabydollDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BabydollDress1_XLarge_Dress.png deleted file mode 100644 index 53842c5ad..000000000 Binary files a/Assets/Female3DCG/Cloth/BabydollDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BabydollDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BabydollDress1_XLarge_Trim.png deleted file mode 100644 index 6d93db153..000000000 Binary files a/Assets/Female3DCG/Cloth/BabydollDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Large_Jacket.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Large_Jacket.png deleted file mode 100644 index c8ec116f7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Large_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Large_Shirt.png deleted file mode 100644 index 4c310ec10..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Large_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Large_Trim.png deleted file mode 100644 index 0592e9546..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Normal_Jacket.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Normal_Jacket.png deleted file mode 100644 index fc3e3ae5e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Normal_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Normal_Shirt.png deleted file mode 100644 index 9fe97801b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Normal_Trim.png deleted file mode 100644 index 058e3aa9b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Small_Jacket.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Small_Jacket.png deleted file mode 100644 index 389a426e6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Small_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Small_Shirt.png deleted file mode 100644 index 7f014d2bc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Small_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Small_Trim.png deleted file mode 100644 index 02f82afb4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_XLarge_Jacket.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_XLarge_Jacket.png deleted file mode 100644 index 79989c5b1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_XLarge_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_XLarge_Shirt.png deleted file mode 100644 index ca1ede7b6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_XLarge_Trim.png deleted file mode 100644 index 53baa0d2d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdmiralTop_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Large_Dress.png deleted file mode 100644 index 94e2d406f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Large_Sash.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Large_Sash.png deleted file mode 100644 index e1b57f943..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Large_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Large_Trim.png deleted file mode 100644 index c3fbe6435..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Normal_Dress.png deleted file mode 100644 index d1e7684df..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Normal_Sash.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Normal_Sash.png deleted file mode 100644 index 1d5bf45cc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Normal_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Normal_Trim.png deleted file mode 100644 index 79751704c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Small_Dress.png deleted file mode 100644 index fe626ab9f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Small_Sash.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Small_Sash.png deleted file mode 100644 index ab31a3bd1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Small_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Small_Trim.png deleted file mode 100644 index 76b4796e0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_XLarge_Dress.png deleted file mode 100644 index bf381e72d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_XLarge_Sash.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_XLarge_Sash.png deleted file mode 100644 index a10fc8e0d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_XLarge_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_XLarge_Trim.png deleted file mode 100644 index a8d06e05e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Large_Bow.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Large_Bow.png deleted file mode 100644 index 445c1d190..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Large_Dress.png deleted file mode 100644 index aab07f28c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Large_Lace.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Large_Lace.png deleted file mode 100644 index 8c4d32b81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Normal_Bow.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Normal_Bow.png deleted file mode 100644 index 76c241e51..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Normal_Dress.png deleted file mode 100644 index e1c7e8d34..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Normal_Lace.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Normal_Lace.png deleted file mode 100644 index 70bdfc14d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Small_Bow.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Small_Bow.png deleted file mode 100644 index 5fe535b59..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Small_Dress.png deleted file mode 100644 index a57c503e7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Small_Lace.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Small_Lace.png deleted file mode 100644 index acfdce1de..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_XLarge_Bow.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_XLarge_Bow.png deleted file mode 100644 index c4ee1c721..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_XLarge_Dress.png deleted file mode 100644 index aed70c926..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_XLarge_Lace.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_XLarge_Lace.png deleted file mode 100644 index 084868a4f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress2_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Large_Belt.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Large_Belt.png deleted file mode 100644 index 793b0092b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Large_Collar.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Large_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Large_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Large_Dress.png deleted file mode 100644 index 6ce8a906a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Normal_Belt.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Normal_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Normal_Collar.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Normal_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Normal_Dress.png deleted file mode 100644 index d342a0956..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Small_Belt.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Small_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Small_Collar.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Small_Collar.png deleted file mode 100644 index e1d288227..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Small_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Small_Dress.png deleted file mode 100644 index d155334a3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_XLarge_Belt.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_XLarge_Belt.png deleted file mode 100644 index 242ed4478..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_XLarge_Collar.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_XLarge_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_XLarge_Dress.png deleted file mode 100644 index 0fc13d142..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress3_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_Large.png deleted file mode 100644 index ed9073c31..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_Normal.png deleted file mode 100644 index 7235ab9f2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_Small.png deleted file mode 100644 index 5f606de9f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_XLarge.png deleted file mode 100644 index 5e577edb8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/AdultBabyDress4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Large_Dress.png deleted file mode 100644 index 9e1a59773..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Large_Trim.png deleted file mode 100644 index 4848b503e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Normal_Dress.png deleted file mode 100644 index 4fb1d60cb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Normal_Trim.png deleted file mode 100644 index e7453352a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Small_Dress.png deleted file mode 100644 index d025a4895..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Small_Trim.png deleted file mode 100644 index a12084d90..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_XLarge_Dress.png deleted file mode 100644 index b7ef92305..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_XLarge_Trim.png deleted file mode 100644 index c6826313d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BabydollDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_Large.png deleted file mode 100644 index 7f95ac84e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_Normal.png deleted file mode 100644 index 38a5353db..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_Small.png deleted file mode 100644 index 2665b8610..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_XLarge.png deleted file mode 100644 index dfd66b949..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Blouse1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Large_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Large_Base.png deleted file mode 100644 index 219772308..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Large_Pattern.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Large_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Large_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Large_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Large_Trim.png deleted file mode 100644 index 7fe15355c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Normal_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Normal_Base.png deleted file mode 100644 index 97f60e5ed..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Normal_Pattern.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Normal_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Normal_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Normal_Trim.png deleted file mode 100644 index 93cbe63ab..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Small_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Small_Base.png deleted file mode 100644 index da5663e24..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Small_Pattern.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Small_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Small_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Small_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Small_Trim.png deleted file mode 100644 index 08fb88b1d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_XLarge_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_XLarge_Base.png deleted file mode 100644 index 8b59ea5b7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_XLarge_Pattern.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_XLarge_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_XLarge_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_XLarge_Trim.png deleted file mode 100644 index a0049da95..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Bodice1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_Large.png deleted file mode 100644 index 7b609fe2e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_Normal.png deleted file mode 100644 index c38f6ed57..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_Small.png deleted file mode 100644 index bedd4b166..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_XLarge.png deleted file mode 100644 index 6a82a8c1c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BodyTowel1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_Large.png deleted file mode 100644 index 4d60463c3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_Normal.png deleted file mode 100644 index 857335240..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_Small.png deleted file mode 100644 index da44b9797..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_XLarge.png deleted file mode 100644 index 8b00bf184..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_Large.png deleted file mode 100644 index 4c1c5cb3a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_Normal.png deleted file mode 100644 index 6ddda67c7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_Small.png deleted file mode 100644 index 79546443b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_XLarge.png deleted file mode 100644 index ceef0df77..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageBustier2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_Large.png deleted file mode 100644 index 4538f3bbd..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_Normal.png deleted file mode 100644 index 9ef22bd54..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_Small.png deleted file mode 100644 index e9ae8eb25..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_XLarge.png deleted file mode 100644 index 4692b26de..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_Large.png deleted file mode 100644 index 49172e0d9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_Normal.png deleted file mode 100644 index 32b2cf54d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_Small.png deleted file mode 100644 index e15ada08b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_XLarge.png deleted file mode 100644 index 1ebb4f24a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BondageDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_Large.png deleted file mode 100644 index d022b9733..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_Normal.png deleted file mode 100644 index cd32c2cd9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_Small.png deleted file mode 100644 index f465c547f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_XLarge.png deleted file mode 100644 index 7e20a81f1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/BridesmaidDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_Large.png deleted file mode 100644 index a920fd4b7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_Normal.png deleted file mode 100644 index 13656d369..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_Small.png deleted file mode 100644 index 6acf7bd15..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_XLarge.png deleted file mode 100644 index 4e2bfc211..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_LargePink_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_LargePink_Dress.png deleted file mode 100644 index d6b2c0e13..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_LargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_LargePurple_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_LargePurple_Dress.png deleted file mode 100644 index 58f882e57..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_LargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Large_Dress.png deleted file mode 100644 index b5b8c7c8a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Large_Edges.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Large_Edges.png deleted file mode 100644 index 8b896df40..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Large_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_NormalPink_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_NormalPink_Dress.png deleted file mode 100644 index 9fd1df4f8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_NormalPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_NormalPurple_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_NormalPurple_Dress.png deleted file mode 100644 index b1c59397c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_NormalPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Normal_Dress.png deleted file mode 100644 index 18993f2f4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Normal_Edges.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Normal_Edges.png deleted file mode 100644 index 45c82ae7e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Normal_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_SmallPink_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_SmallPink_Dress.png deleted file mode 100644 index c52e6330e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_SmallPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_SmallPurple_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_SmallPurple_Dress.png deleted file mode 100644 index 68473c5ce..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_SmallPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Small_Dress.png deleted file mode 100644 index fbe2b8245..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Small_Edges.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Small_Edges.png deleted file mode 100644 index af0872b38..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_Small_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLargePink_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLargePink_Dress.png deleted file mode 100644 index 98f6f5919..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLargePurple_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLargePurple_Dress.png deleted file mode 100644 index 32111de4b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLarge_Dress.png deleted file mode 100644 index 6e0fc27c5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLarge_Edges.png b/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLarge_Edges.png deleted file mode 100644 index 743dd7ad3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ChineseDress2_XLarge_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Large_Shirt.png deleted file mode 100644 index 3a78860ad..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Large_Tie.png b/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Large_Tie.png deleted file mode 100644 index d55d070e8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Large_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Normal_Shirt.png deleted file mode 100644 index 78bd9f9af..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Normal_Tie.png b/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Normal_Tie.png deleted file mode 100644 index ec87feac0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Normal_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Small_Shirt.png deleted file mode 100644 index 1d4227fb2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Small_Tie.png b/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Small_Tie.png deleted file mode 100644 index fa1418f99..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_Small_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_XLarge_Shirt.png deleted file mode 100644 index 916a478b5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_XLarge_Tie.png b/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_XLarge_Tie.png deleted file mode 100644 index e6ed702cf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CollegeOutfit1_XLarge_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_Large.png deleted file mode 100644 index 115dcf27e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_Normal.png deleted file mode 100644 index 50de1344d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_Small.png deleted file mode 100644 index a98f74056..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_XLarge.png deleted file mode 100644 index 5c78c19a3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ComfyTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Large_Corset.png b/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Large_Corset.png deleted file mode 100644 index fc72f4a20..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Large_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Large_Shirt.png deleted file mode 100644 index 792bd8fa0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Normal_Corset.png b/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Normal_Corset.png deleted file mode 100644 index 532358d87..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Normal_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Normal_Shirt.png deleted file mode 100644 index 2f569e354..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Small_Corset.png b/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Small_Corset.png deleted file mode 100644 index 532358d87..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Small_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Small_Shirt.png deleted file mode 100644 index 2f569e354..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_XLarge_Corset.png b/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_XLarge_Corset.png deleted file mode 100644 index fc72f4a20..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_XLarge_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_XLarge_Shirt.png deleted file mode 100644 index 792bd8fa0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/CorsetShirt_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_Large.png deleted file mode 100644 index b0a39022b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_Normal.png deleted file mode 100644 index dcc704cae..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_Small.png deleted file mode 100644 index 5cb1b6260..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_XLarge.png deleted file mode 100644 index 2969da827..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Dress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_Large.png deleted file mode 100644 index 5d7c1cabf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_Normal.png deleted file mode 100644 index 6a90449a7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_Small.png deleted file mode 100644 index 884916221..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_XLarge.png deleted file mode 100644 index f5ebf32db..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Dress3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Large_Fabric.png b/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Large_Fabric.png deleted file mode 100644 index 8b1d68e56..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Large_Fur.png b/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Large_Fur.png deleted file mode 100644 index 71df548f7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Normal_Fabric.png b/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Normal_Fabric.png deleted file mode 100644 index b60c1b8a4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Normal_Fur.png b/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Normal_Fur.png deleted file mode 100644 index 711020107..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Small_Fabric.png b/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Small_Fabric.png deleted file mode 100644 index 4eacf812d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Small_Fur.png b/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Small_Fur.png deleted file mode 100644 index 0e15ac960..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_XLarge_Fabric.png b/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_XLarge_Fabric.png deleted file mode 100644 index b22b33725..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_XLarge_Fur.png b/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_XLarge_Fur.png deleted file mode 100644 index f8ff38d5d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/DressFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Large_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Large_Dress.png deleted file mode 100644 index 6420ea24d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Large_Flower.png b/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Large_Flower.png deleted file mode 100644 index 0fe57a834..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Large_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Normal_Dress.png deleted file mode 100644 index 1ce6e6f9c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Normal_Flower.png b/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Normal_Flower.png deleted file mode 100644 index f9a431623..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Normal_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Small_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Small_Dress.png deleted file mode 100644 index 712994d56..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Small_Flower.png b/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Small_Flower.png deleted file mode 100644 index c7d872ad6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_Small_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_XLarge_Dress.png deleted file mode 100644 index 356fb9380..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_XLarge_Flower.png b/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_XLarge_Flower.png deleted file mode 100644 index 5686a3cca..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/FlowerDress_XLarge_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/FurCoat_Upper.png b/Assets/Female3DCG/Cloth/BackBoxTie/FurCoat_Upper.png deleted file mode 100644 index f284f1709..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/FurCoat_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_Large.png deleted file mode 100644 index 87d72370d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_Normal.png deleted file mode 100644 index a2ef948e1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_Small.png deleted file mode 100644 index 3b9640086..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_XLarge.png deleted file mode 100644 index 5f07b6481..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_Large.png deleted file mode 100644 index a1d81b38d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_Normal.png deleted file mode 100644 index 36e2f12a9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_Small.png deleted file mode 100644 index 27ca1707f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_XLarge.png deleted file mode 100644 index 2b747b8f8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown2Top_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_Large.png deleted file mode 100644 index 2eff3a5cb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_Normal.png deleted file mode 100644 index 74ac0218e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_Small.png deleted file mode 100644 index 537174c24..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_XLarge.png deleted file mode 100644 index 35eca1103..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Gown3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_BackSkirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_BackSkirt.png deleted file mode 100644 index e6ff11224..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_BackSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Base.png deleted file mode 100644 index d468626f7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Belt.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Belt.png deleted file mode 100644 index 490febbfa..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Buckle.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Buckle.png deleted file mode 100644 index 0fb758187..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Trim.png deleted file mode 100644 index 44f42a8ec..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Base.png deleted file mode 100644 index a8e09ffd0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Belt.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Belt.png deleted file mode 100644 index 6c8457d2d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Buckle.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Buckle.png deleted file mode 100644 index 679247f8d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Trim.png deleted file mode 100644 index 4160a0596..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Base.png deleted file mode 100644 index 1390e1599..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Belt.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Belt.png deleted file mode 100644 index 290d51bfc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Buckle.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Buckle.png deleted file mode 100644 index b11836cb6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Trim.png deleted file mode 100644 index f8dd9d574..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Base.png deleted file mode 100644 index d366ea9f8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Belt.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Belt.png deleted file mode 100644 index ec1c42c84..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Buckle.png deleted file mode 100644 index cc20a702d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Trim.png deleted file mode 100644 index 2fa0772ef..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/GrandMage_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Jacket_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/Jacket_Base.png deleted file mode 100644 index 6f49bbef7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Jacket_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_Large.png deleted file mode 100644 index d9291cbbc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_Normal.png deleted file mode 100644 index e5bfd1266..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_Small.png deleted file mode 100644 index d8be602da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_XLarge.png deleted file mode 100644 index 614fff240..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LaceBabydoll_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_Large.png deleted file mode 100644 index 87868caf9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_LargeNonLaced.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_LargeNonLaced.png deleted file mode 100644 index 3d1b96a0e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_LargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_Normal.png deleted file mode 100644 index 4055e832e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_NormalNonLaced.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_NormalNonLaced.png deleted file mode 100644 index 09da2eb36..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_NormalNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_Small.png deleted file mode 100644 index 06d9c83c2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_SmallNonLaced.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_SmallNonLaced.png deleted file mode 100644 index dfacdcd78..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_SmallNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_XLarge.png deleted file mode 100644 index e7cc58bda..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_XLargeNonLaced.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_XLargeNonLaced.png deleted file mode 100644 index 310288b81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexLacedSuit_XLargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_Large.png deleted file mode 100644 index aecd75d3f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_Normal.png deleted file mode 100644 index 4d8369041..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_Small.png deleted file mode 100644 index afbeb7422..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_XLarge.png deleted file mode 100644 index 1b024c320..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LatexTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_Large.png deleted file mode 100644 index 25bb83f08..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_Normal.png deleted file mode 100644 index 4ee7dd93f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_Small.png deleted file mode 100644 index ff98f2f19..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_XLarge.png deleted file mode 100644 index a6313bd5b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherBolero_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_Large.png deleted file mode 100644 index ba5072c5b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_Normal.png deleted file mode 100644 index de5c722d7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_Small.png deleted file mode 100644 index cd152185c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_XLarge.png deleted file mode 100644 index 4c8ee4413..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/LeatherCropTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_Large.png deleted file mode 100644 index d9336a968..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_Normal.png deleted file mode 100644 index d710f52bc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_Small.png deleted file mode 100644 index 2ddde972b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_XLarge.png deleted file mode 100644 index dc9253ef9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_Large.png deleted file mode 100644 index 1a1a8f47b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_Normal.png deleted file mode 100644 index 150974896..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_Small.png deleted file mode 100644 index 813c91958..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_XLarge.png deleted file mode 100644 index 8817288e2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidApron2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Large_Apron.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Large_Apron.png deleted file mode 100644 index 7e3a0f3db..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Large_Dress.png deleted file mode 100644 index 653bde7d3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Large_Frills.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Large_Frills.png deleted file mode 100644 index 9a41380a4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Normal_Apron.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Normal_Apron.png deleted file mode 100644 index 77aee7aa8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Normal_Dress.png deleted file mode 100644 index 42061fe25..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Normal_Frills.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Normal_Frills.png deleted file mode 100644 index 9581330a9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Small_Apron.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Small_Apron.png deleted file mode 100644 index 16831f7c2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Small_Dress.png deleted file mode 100644 index 1bced5f78..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Small_Frills.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Small_Frills.png deleted file mode 100644 index d369665df..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_XLarge_Apron.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_XLarge_Apron.png deleted file mode 100644 index 889bb0e85..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_XLarge_Dress.png deleted file mode 100644 index f6c136d82..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_XLarge_Frills.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_XLarge_Frills.png deleted file mode 100644 index 28f21ffa6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit1_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Large_Apron.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Large_Apron.png deleted file mode 100644 index d409e80e2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Large_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Large_Dress.png deleted file mode 100644 index edd7efbdc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Large_Frills.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Large_Frills.png deleted file mode 100644 index c7d2d0b92..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Normal_Apron.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Normal_Apron.png deleted file mode 100644 index 455378b33..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Normal_Dress.png deleted file mode 100644 index c23986b35..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Normal_Frills.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Normal_Frills.png deleted file mode 100644 index a850377b5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Small_Apron.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Small_Apron.png deleted file mode 100644 index ed8f3b5dd..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Small_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Small_Dress.png deleted file mode 100644 index 178f6db40..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Small_Frills.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Small_Frills.png deleted file mode 100644 index 4b88a594b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_XLarge_Apron.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_XLarge_Apron.png deleted file mode 100644 index 9fed4d719..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_XLarge_Dress.png deleted file mode 100644 index b682cbaec..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_XLarge_Frills.png b/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_XLarge_Frills.png deleted file mode 100644 index 133a4bfa6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MaidOutfit2_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_Large.png deleted file mode 100644 index d390102f2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_Normal.png deleted file mode 100644 index 82694122c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_Small.png deleted file mode 100644 index ce85e6661..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_XLarge.png deleted file mode 100644 index ff72da762..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/MistressTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_Large.png deleted file mode 100644 index 6c1699596..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_Normal.png deleted file mode 100644 index 384e4058a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_Small.png deleted file mode 100644 index 357ae9c44..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_XLarge.png deleted file mode 100644 index ccc792fd0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/NurseUniform_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_Large.png deleted file mode 100644 index 08c7786e8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_Normal.png deleted file mode 100644 index 9a9bfa4cb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_Small.png deleted file mode 100644 index 5674c7e0f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_XLarge.png deleted file mode 100644 index b5888b0f3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Robe1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_Large.png deleted file mode 100644 index 3d31a4beb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_Normal.png deleted file mode 100644 index 376f73db3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_Small.png deleted file mode 100644 index 94d297937..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_XLarge.png deleted file mode 100644 index 9c28bca30..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/ShoulderlessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_Large.png deleted file mode 100644 index 2eb6e4860..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_Normal.png deleted file mode 100644 index 2e1e1d2b1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_Small.png deleted file mode 100644 index f48c71bcc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_XLarge.png deleted file mode 100644 index 913c20a42..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SleevelessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Bow.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Buckle.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Buckle.png deleted file mode 100644 index 9786715f9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Dress.png deleted file mode 100644 index f350b7987..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Shirt.png deleted file mode 100644 index 22e1982f8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Bow.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Buckle.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Buckle.png deleted file mode 100644 index 5cb83366b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Dress.png deleted file mode 100644 index 2712af5c8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Shirt.png deleted file mode 100644 index 1be7bb968..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Bow.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Buckle.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Buckle.png deleted file mode 100644 index 6bea1d2dc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Dress.png deleted file mode 100644 index 99c891d46..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Shirt.png deleted file mode 100644 index 5837eb879..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Bow.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Buckle.png deleted file mode 100644 index 187fbf3d2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Dress.png deleted file mode 100644 index 47d040fe3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Shirt.png deleted file mode 100644 index 2d56cbf2f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_Large.png deleted file mode 100644 index f50c9571f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_Normal.png deleted file mode 100644 index 988f39acf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_Small.png deleted file mode 100644 index 4b9c93039..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_XLarge.png deleted file mode 100644 index eb8153128..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Large_Color.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Large_Color.png deleted file mode 100644 index fbb99da82..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Large_White.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Large_White.png deleted file mode 100644 index dc79c3b08..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Normal_Color.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Normal_Color.png deleted file mode 100644 index 3d189a9e5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Normal_White.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Normal_White.png deleted file mode 100644 index 21f4a2f38..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Small_Color.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Small_Color.png deleted file mode 100644 index c51c036e8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Small_White.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Small_White.png deleted file mode 100644 index cb53c71da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_XLarge_Color.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_XLarge_Color.png deleted file mode 100644 index fef2f89e0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_XLarge_White.png b/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_XLarge_White.png deleted file mode 100644 index 3ecc15b4f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/StudentOutfit3_XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Base.png deleted file mode 100644 index 2b26c816c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer1.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer1.png deleted file mode 100644 index 9498e44f7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer2.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer2.png deleted file mode 100644 index f53739c3d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer3.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer3.png deleted file mode 100644 index 5762f2d6c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer4.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer4.png deleted file mode 100644 index 7c640d2ba..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Base.png deleted file mode 100644 index c60fd7ab1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer1.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer1.png deleted file mode 100644 index 766b3d758..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer2.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer2.png deleted file mode 100644 index d9a9ae649..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer3.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer3.png deleted file mode 100644 index 74153b387..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer4.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer4.png deleted file mode 100644 index 0d40a7ea5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Base.png deleted file mode 100644 index e6617e735..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer1.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer1.png deleted file mode 100644 index d6b4fe9c4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer2.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer2.png deleted file mode 100644 index a08b559c2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer3.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer3.png deleted file mode 100644 index 62a71f686..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer4.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer4.png deleted file mode 100644 index 467edbf09..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Base.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Base.png deleted file mode 100644 index 910730845..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer1.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer1.png deleted file mode 100644 index 03749cadf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer2.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer2.png deleted file mode 100644 index 427566fc6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer3.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer3.png deleted file mode 100644 index 8e87737b9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer4.png b/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer4.png deleted file mode 100644 index 5c24d2a81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SummerDress_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_Large.png deleted file mode 100644 index fc76aa559..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_Normal.png deleted file mode 100644 index 30c147551..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_Small.png deleted file mode 100644 index 1c410400d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_XLarge.png deleted file mode 100644 index 5cb12a1da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/SuspenderTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_Large.png deleted file mode 100644 index 17a6e9a38..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_Normal.png deleted file mode 100644 index cb21f7a83..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_Small.png deleted file mode 100644 index 201a1eea2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_XLarge.png deleted file mode 100644 index 83738d05a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Sweater1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_Large.png deleted file mode 100644 index 322ad6e03..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_Normal.png deleted file mode 100644 index b9453ae4d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_Small.png deleted file mode 100644 index 747412207..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_XLarge.png deleted file mode 100644 index 710a65757..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2BCLogo_Print.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2BCLogo_Print.png deleted file mode 100644 index 717259582..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2BCLogo_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2BDSM_Print.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2BDSM_Print.png deleted file mode 100644 index 62f576eb9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2BDSM_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Gag_Print.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Gag_Print.png deleted file mode 100644 index 5d5d4ea25..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Gag_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Knot_Print.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Knot_Print.png deleted file mode 100644 index de16f53e4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Knot_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Rock_Print.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Rock_Print.png deleted file mode 100644 index 34cab3760..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Rock_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Smile_Print.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Smile_Print.png deleted file mode 100644 index c6c67db94..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Smile_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Tick_Print.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Tick_Print.png deleted file mode 100644 index fb69e1ad4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2Tick_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_Large_Shirt.png deleted file mode 100644 index a0e99234f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_Normal_Shirt.png deleted file mode 100644 index 45544bee6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_Small_Shirt.png deleted file mode 100644 index 9ded6d670..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_XLarge_Shirt.png deleted file mode 100644 index f80fb354b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TShirt2_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_Large.png deleted file mode 100644 index ed6ac0373..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_Normal.png deleted file mode 100644 index b8d270002..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_Small.png deleted file mode 100644 index f75a6df59..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_XLarge.png deleted file mode 100644 index d5af9d84f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TeacherOutfit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_Large.png deleted file mode 100644 index cf1b60014..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_Normal.png deleted file mode 100644 index ca72b8190..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_Small.png deleted file mode 100644 index 6bbd26335..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_XLarge.png deleted file mode 100644 index 1b9fdd589..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/TennisShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_Large.png deleted file mode 100644 index 204d7389b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_Normal.png deleted file mode 100644 index 7c318a365..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_Small.png deleted file mode 100644 index 881bbda0a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_XLarge.png deleted file mode 100644 index d48ec45de..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/VirginKiller1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_Large.png deleted file mode 100644 index 252537ea5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_Normal.png deleted file mode 100644 index 82c2129f3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_Small.png deleted file mode 100644 index 911f50624..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_XLarge.png deleted file mode 100644 index 0a46e4eb1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_Large.png deleted file mode 100644 index 5f0d310cc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_Normal.png deleted file mode 100644 index 1cb48ec15..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_Small.png deleted file mode 100644 index de1260bf2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_XLarge.png deleted file mode 100644 index 8888855da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_Large.png b/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_Large.png deleted file mode 100644 index b64705773..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_Normal.png b/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_Normal.png deleted file mode 100644 index 1775fb2d2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_Small.png b/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_Small.png deleted file mode 100644 index 05dabb0c5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_XLarge.png b/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_XLarge.png deleted file mode 100644 index c74e42c1d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackBoxTie/Yukata1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Large_Jacket.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Large_Jacket.png deleted file mode 100644 index d0deb6ce1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Large_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Large_Shirt.png deleted file mode 100644 index 5f7ec062e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Large_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Large_Trim.png deleted file mode 100644 index a6d6846ed..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Normal_Jacket.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Normal_Jacket.png deleted file mode 100644 index eec562bf8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Normal_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Normal_Shirt.png deleted file mode 100644 index 058de23eb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Normal_Trim.png deleted file mode 100644 index 678cfde7f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Small_Jacket.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Small_Jacket.png deleted file mode 100644 index f1dfe2684..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Small_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Small_Shirt.png deleted file mode 100644 index e0d47f179..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Small_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Small_Trim.png deleted file mode 100644 index 6c4414031..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_XLarge_Jacket.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_XLarge_Jacket.png deleted file mode 100644 index 5b85b16f2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_XLarge_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_XLarge_Shirt.png deleted file mode 100644 index 7fe07f6b7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_XLarge_Trim.png deleted file mode 100644 index cc34e3b76..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdmiralTop_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Large_Dress.png deleted file mode 100644 index db3e43053..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Large_Sash.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Large_Sash.png deleted file mode 100644 index e1b57f943..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Large_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Large_Trim.png deleted file mode 100644 index 5141b5d28..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Normal_Dress.png deleted file mode 100644 index 0514bf8da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Normal_Sash.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Normal_Sash.png deleted file mode 100644 index 1d5bf45cc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Normal_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Normal_Trim.png deleted file mode 100644 index 733dcb412..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Small_Dress.png deleted file mode 100644 index 7c7a6dca9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Small_Sash.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Small_Sash.png deleted file mode 100644 index ab31a3bd1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Small_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Small_Trim.png deleted file mode 100644 index e62dd0d0c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_XLarge_Dress.png deleted file mode 100644 index db8a4bd0b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_XLarge_Sash.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_XLarge_Sash.png deleted file mode 100644 index a10fc8e0d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_XLarge_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_XLarge_Trim.png deleted file mode 100644 index 814790d5c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Large_Bow.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Large_Bow.png deleted file mode 100644 index 445c1d190..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Large_Dress.png deleted file mode 100644 index 919f12bfa..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Large_Lace.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Large_Lace.png deleted file mode 100644 index 7657899d0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Normal_Bow.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Normal_Bow.png deleted file mode 100644 index 76c241e51..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Normal_Dress.png deleted file mode 100644 index dd62c8853..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Normal_Lace.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Normal_Lace.png deleted file mode 100644 index 1bd964303..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Small_Bow.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Small_Bow.png deleted file mode 100644 index 5fe535b59..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Small_Dress.png deleted file mode 100644 index e29af6fea..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Small_Lace.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Small_Lace.png deleted file mode 100644 index b6549c697..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_XLarge_Bow.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_XLarge_Bow.png deleted file mode 100644 index c4ee1c721..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_XLarge_Dress.png deleted file mode 100644 index e9f4b43c4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_XLarge_Lace.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_XLarge_Lace.png deleted file mode 100644 index db7d377b6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress2_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Large_Belt.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Large_Belt.png deleted file mode 100644 index 793b0092b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Large_Collar.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Large_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Large_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Large_Dress.png deleted file mode 100644 index 6ce8a906a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Normal_Belt.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Normal_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Normal_Collar.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Normal_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Normal_Dress.png deleted file mode 100644 index d342a0956..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Small_Belt.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Small_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Small_Collar.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Small_Collar.png deleted file mode 100644 index e1d288227..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Small_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Small_Dress.png deleted file mode 100644 index d155334a3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_XLarge_Belt.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_XLarge_Belt.png deleted file mode 100644 index 242ed4478..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_XLarge_Collar.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_XLarge_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_XLarge_Dress.png deleted file mode 100644 index 0fc13d142..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress3_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_Large.png deleted file mode 100644 index 9ee24f973..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_Normal.png deleted file mode 100644 index 427df6008..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_Small.png deleted file mode 100644 index df8c6d044..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_XLarge.png deleted file mode 100644 index b1cd5e41c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/AdultBabyDress4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Large_Dress.png deleted file mode 100644 index 9e1a59773..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Large_Trim.png deleted file mode 100644 index 4848b503e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Normal_Dress.png deleted file mode 100644 index 4fb1d60cb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Normal_Trim.png deleted file mode 100644 index e7453352a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Small_Dress.png deleted file mode 100644 index d025a4895..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Small_Trim.png deleted file mode 100644 index a12084d90..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_XLarge_Dress.png deleted file mode 100644 index b7ef92305..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_XLarge_Trim.png deleted file mode 100644 index c6826313d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BabydollDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_Large.png deleted file mode 100644 index f29af1ace..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_Normal.png deleted file mode 100644 index b1cb6bb13..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_Small.png deleted file mode 100644 index 8b5607178..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_XLarge.png deleted file mode 100644 index 74d58d128..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Blouse1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Large_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Large_Base.png deleted file mode 100644 index 219772308..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Large_Pattern.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Large_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Large_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Large_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Large_Trim.png deleted file mode 100644 index 7fe15355c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Normal_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Normal_Base.png deleted file mode 100644 index 97f60e5ed..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Normal_Pattern.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Normal_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Normal_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Normal_Trim.png deleted file mode 100644 index 93cbe63ab..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Small_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Small_Base.png deleted file mode 100644 index da5663e24..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Small_Pattern.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Small_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Small_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Small_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Small_Trim.png deleted file mode 100644 index 08fb88b1d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_XLarge_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_XLarge_Base.png deleted file mode 100644 index 8b59ea5b7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_XLarge_Pattern.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_XLarge_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_XLarge_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_XLarge_Trim.png deleted file mode 100644 index a0049da95..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Bodice1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_Large.png deleted file mode 100644 index 7b609fe2e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_Normal.png deleted file mode 100644 index c38f6ed57..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_Small.png deleted file mode 100644 index bedd4b166..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_XLarge.png deleted file mode 100644 index 6a82a8c1c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BodyTowel1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_Large.png deleted file mode 100644 index 4d60463c3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_Normal.png deleted file mode 100644 index 857335240..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_Small.png deleted file mode 100644 index da44b9797..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_XLarge.png deleted file mode 100644 index 8b00bf184..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_Large.png deleted file mode 100644 index 4c1c5cb3a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_Normal.png deleted file mode 100644 index 6ddda67c7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_Small.png deleted file mode 100644 index 79546443b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_XLarge.png deleted file mode 100644 index ceef0df77..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageBustier2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_Large.png deleted file mode 100644 index 4538f3bbd..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_Normal.png deleted file mode 100644 index 9ef22bd54..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_Small.png deleted file mode 100644 index e9ae8eb25..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_XLarge.png deleted file mode 100644 index 4692b26de..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_Large.png deleted file mode 100644 index 49172e0d9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_Normal.png deleted file mode 100644 index 32b2cf54d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_Small.png deleted file mode 100644 index e15ada08b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_XLarge.png deleted file mode 100644 index 1ebb4f24a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BondageDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_Large.png deleted file mode 100644 index d022b9733..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_Normal.png deleted file mode 100644 index cd32c2cd9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_Small.png deleted file mode 100644 index f465c547f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_XLarge.png deleted file mode 100644 index 7e20a81f1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/BridesmaidDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_Large.png deleted file mode 100644 index 61fd5e350..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_Normal.png deleted file mode 100644 index 855853a46..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_Small.png deleted file mode 100644 index 57042e1da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_XLarge.png deleted file mode 100644 index 588fbc53f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_LargePink_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_LargePink_Dress.png deleted file mode 100644 index d6b2c0e13..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_LargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_LargePurple_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_LargePurple_Dress.png deleted file mode 100644 index 58f882e57..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_LargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Large_Dress.png deleted file mode 100644 index b5b8c7c8a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Large_Edges.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Large_Edges.png deleted file mode 100644 index 20769a7a3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Large_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_NormalPink_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_NormalPink_Dress.png deleted file mode 100644 index 9fd1df4f8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_NormalPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_NormalPurple_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_NormalPurple_Dress.png deleted file mode 100644 index b1c59397c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_NormalPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Normal_Dress.png deleted file mode 100644 index 18993f2f4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Normal_Edges.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Normal_Edges.png deleted file mode 100644 index 1157cc9d6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Normal_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_SmallPink_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_SmallPink_Dress.png deleted file mode 100644 index c52e6330e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_SmallPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_SmallPurple_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_SmallPurple_Dress.png deleted file mode 100644 index 68473c5ce..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_SmallPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Small_Dress.png deleted file mode 100644 index fbe2b8245..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Small_Edges.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Small_Edges.png deleted file mode 100644 index af0872b38..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_Small_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLargePink_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLargePink_Dress.png deleted file mode 100644 index 98f6f5919..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLargePurple_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLargePurple_Dress.png deleted file mode 100644 index 32111de4b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLarge_Dress.png deleted file mode 100644 index 6e0fc27c5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLarge_Edges.png b/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLarge_Edges.png deleted file mode 100644 index 743dd7ad3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ChineseDress2_XLarge_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Large_Shirt.png deleted file mode 100644 index f4b654f1c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Large_Tie.png b/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Large_Tie.png deleted file mode 100644 index a686bf108..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Large_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Normal_Shirt.png deleted file mode 100644 index 498fd68ad..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Normal_Tie.png b/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Normal_Tie.png deleted file mode 100644 index c893faf9c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Normal_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Small_Shirt.png deleted file mode 100644 index fe58a7484..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Small_Tie.png b/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Small_Tie.png deleted file mode 100644 index 688e7120d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_Small_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_XLarge_Shirt.png deleted file mode 100644 index 67df6bbb5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_XLarge_Tie.png b/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_XLarge_Tie.png deleted file mode 100644 index 8dcb4bb7b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CollegeOutfit1_XLarge_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_Large.png deleted file mode 100644 index 3ae594084..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_Normal.png deleted file mode 100644 index 1f913d47d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_Small.png deleted file mode 100644 index 576fdf67f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_XLarge.png deleted file mode 100644 index 8219362f0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ComfyTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Large_Corset.png b/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Large_Corset.png deleted file mode 100644 index f72eedde8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Large_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Large_Shirt.png deleted file mode 100644 index 31d582f86..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Normal_Corset.png b/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Normal_Corset.png deleted file mode 100644 index 532358d87..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Normal_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Normal_Shirt.png deleted file mode 100644 index 99438c1b2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Small_Corset.png b/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Small_Corset.png deleted file mode 100644 index 532358d87..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Small_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Small_Shirt.png deleted file mode 100644 index 99438c1b2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_XLarge_Corset.png b/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_XLarge_Corset.png deleted file mode 100644 index a9abd232e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_XLarge_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_XLarge_Shirt.png deleted file mode 100644 index 54b3f980d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/CorsetShirt_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Dress2_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/Dress2_Large.png deleted file mode 100644 index 549f47aa1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Dress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Dress2_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/Dress2_Normal.png deleted file mode 100644 index 9961a355a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Dress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Dress2_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/Dress2_Small.png deleted file mode 100644 index 8099861d2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Dress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Dress2_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/Dress2_XLarge.png deleted file mode 100644 index 63a584112..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Dress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Dress3_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/Dress3_Large.png deleted file mode 100644 index 5d7c1cabf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Dress3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Dress3_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/Dress3_Normal.png deleted file mode 100644 index 6a90449a7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Dress3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Dress3_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/Dress3_Small.png deleted file mode 100644 index 884916221..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Dress3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Dress3_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/Dress3_XLarge.png deleted file mode 100644 index f5ebf32db..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Dress3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Large_Fabric.png b/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Large_Fabric.png deleted file mode 100644 index 8b1d68e56..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Large_Fur.png b/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Large_Fur.png deleted file mode 100644 index 71df548f7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Normal_Fabric.png b/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Normal_Fabric.png deleted file mode 100644 index b60c1b8a4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Normal_Fur.png b/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Normal_Fur.png deleted file mode 100644 index 711020107..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Small_Fabric.png b/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Small_Fabric.png deleted file mode 100644 index 4eacf812d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Small_Fur.png b/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Small_Fur.png deleted file mode 100644 index 0e15ac960..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_XLarge_Fabric.png b/Assets/Female3DCG/Cloth/BackCuffs/DressFur_XLarge_Fabric.png deleted file mode 100644 index b22b33725..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_XLarge_Fur.png b/Assets/Female3DCG/Cloth/BackCuffs/DressFur_XLarge_Fur.png deleted file mode 100644 index f8ff38d5d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/DressFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Large_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Large_Dress.png deleted file mode 100644 index 6420ea24d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Large_Flower.png b/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Large_Flower.png deleted file mode 100644 index 0fe57a834..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Large_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Normal_Dress.png deleted file mode 100644 index 1ce6e6f9c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Normal_Flower.png b/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Normal_Flower.png deleted file mode 100644 index f9a431623..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Normal_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Small_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Small_Dress.png deleted file mode 100644 index 712994d56..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Small_Flower.png b/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Small_Flower.png deleted file mode 100644 index c7d872ad6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_Small_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_XLarge_Dress.png deleted file mode 100644 index 356fb9380..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_XLarge_Flower.png b/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_XLarge_Flower.png deleted file mode 100644 index 5686a3cca..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/FlowerDress_XLarge_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/FurCoat_Upper.png b/Assets/Female3DCG/Cloth/BackCuffs/FurCoat_Upper.png deleted file mode 100644 index 17880bee7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/FurCoat_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown1_Large.png deleted file mode 100644 index 87d72370d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown1_Normal.png deleted file mode 100644 index a2ef948e1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown1_Small.png deleted file mode 100644 index 3b9640086..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown1_XLarge.png deleted file mode 100644 index 5f07b6481..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_Large.png deleted file mode 100644 index b2863d29d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_Normal.png deleted file mode 100644 index b0d30899d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_Small.png deleted file mode 100644 index e93fce21e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_XLarge.png deleted file mode 100644 index 413e991a2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown2Top_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown3_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown3_Large.png deleted file mode 100644 index f42a5edef..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown3_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown3_Normal.png deleted file mode 100644 index 12b23aefd..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown3_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown3_Small.png deleted file mode 100644 index d6f993420..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Gown3_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/Gown3_XLarge.png deleted file mode 100644 index 3a0ed87ff..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Gown3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_BackSkirt.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_BackSkirt.png deleted file mode 100644 index e6ff11224..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_BackSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Base.png deleted file mode 100644 index d468626f7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Belt.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Belt.png deleted file mode 100644 index 490febbfa..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Buckle.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Buckle.png deleted file mode 100644 index 0fb758187..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Trim.png deleted file mode 100644 index 44f42a8ec..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Base.png deleted file mode 100644 index a8e09ffd0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Belt.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Belt.png deleted file mode 100644 index 6c8457d2d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Buckle.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Buckle.png deleted file mode 100644 index 679247f8d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Trim.png deleted file mode 100644 index 4160a0596..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Base.png deleted file mode 100644 index 1390e1599..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Belt.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Belt.png deleted file mode 100644 index 290d51bfc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Buckle.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Buckle.png deleted file mode 100644 index b11836cb6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Trim.png deleted file mode 100644 index f8dd9d574..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Base.png deleted file mode 100644 index d366ea9f8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Belt.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Belt.png deleted file mode 100644 index ec1c42c84..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Buckle.png deleted file mode 100644 index cc20a702d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Trim.png deleted file mode 100644 index 2fa0772ef..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/GrandMage_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Jacket_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/Jacket_Base.png deleted file mode 100644 index 64e30351a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Jacket_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_Large.png deleted file mode 100644 index d9291cbbc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_Normal.png deleted file mode 100644 index e5bfd1266..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_Small.png deleted file mode 100644 index d8be602da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_XLarge.png deleted file mode 100644 index 614fff240..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LaceBabydoll_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_Large.png deleted file mode 100644 index 87868caf9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_LargeNonLaced.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_LargeNonLaced.png deleted file mode 100644 index 3d1b96a0e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_LargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_Normal.png deleted file mode 100644 index 4055e832e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_NormalNonLaced.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_NormalNonLaced.png deleted file mode 100644 index 09da2eb36..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_NormalNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_Small.png deleted file mode 100644 index 06d9c83c2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_SmallNonLaced.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_SmallNonLaced.png deleted file mode 100644 index dfacdcd78..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_SmallNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_XLarge.png deleted file mode 100644 index e7cc58bda..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_XLargeNonLaced.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_XLargeNonLaced.png deleted file mode 100644 index 310288b81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexLacedSuit_XLargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_Large.png deleted file mode 100644 index aecd75d3f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_Normal.png deleted file mode 100644 index 4d8369041..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_Small.png deleted file mode 100644 index afbeb7422..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_XLarge.png deleted file mode 100644 index 1b024c320..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LatexTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_Large.png deleted file mode 100644 index 25bb83f08..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_Normal.png deleted file mode 100644 index 4ee7dd93f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_Small.png deleted file mode 100644 index ff98f2f19..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_XLarge.png deleted file mode 100644 index a6313bd5b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LeatherBolero_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_Large.png deleted file mode 100644 index 38849ddfd..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_Normal.png deleted file mode 100644 index 92d2a58ae..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_Small.png deleted file mode 100644 index 4be6e4276..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_XLarge.png deleted file mode 100644 index e175860a4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/LeatherCropTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_Large.png deleted file mode 100644 index d9336a968..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_Normal.png deleted file mode 100644 index d710f52bc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_Small.png deleted file mode 100644 index 2ddde972b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_XLarge.png deleted file mode 100644 index dc9253ef9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_Large.png deleted file mode 100644 index 1a89ad1e2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_Normal.png deleted file mode 100644 index 150974896..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_Small.png deleted file mode 100644 index 813c91958..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_XLarge.png deleted file mode 100644 index 8817288e2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidApron2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Large_Apron.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Large_Apron.png deleted file mode 100644 index 128347093..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Large_Dress.png deleted file mode 100644 index f5c988e44..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Large_Frills.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Large_Frills.png deleted file mode 100644 index 30a5323ab..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Normal_Apron.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Normal_Apron.png deleted file mode 100644 index b9df3518f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Normal_Dress.png deleted file mode 100644 index cd6778b4c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Normal_Frills.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Normal_Frills.png deleted file mode 100644 index 7847c52e8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Small_Apron.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Small_Apron.png deleted file mode 100644 index dfce85a41..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Small_Dress.png deleted file mode 100644 index 9403120ba..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Small_Frills.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Small_Frills.png deleted file mode 100644 index 78e79341b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_XLarge_Apron.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_XLarge_Apron.png deleted file mode 100644 index 8cd84ba38..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_XLarge_Dress.png deleted file mode 100644 index fe9bb3dc7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_XLarge_Frills.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_XLarge_Frills.png deleted file mode 100644 index 435d8e4ef..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit1_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Large_Apron.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Large_Apron.png deleted file mode 100644 index 6fb52f50b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Large_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Large_Dress.png deleted file mode 100644 index 17aa914fe..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Large_Frills.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Large_Frills.png deleted file mode 100644 index f643572a0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Normal_Apron.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Normal_Apron.png deleted file mode 100644 index e53fe5f34..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Normal_Dress.png deleted file mode 100644 index 2055c0359..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Normal_Frills.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Normal_Frills.png deleted file mode 100644 index e372c0101..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Small_Apron.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Small_Apron.png deleted file mode 100644 index db918c80f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Small_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Small_Dress.png deleted file mode 100644 index 8020ddc19..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Small_Frills.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Small_Frills.png deleted file mode 100644 index 9594881cc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_XLarge_Apron.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_XLarge_Apron.png deleted file mode 100644 index a7d6a3dfe..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_XLarge_Dress.png deleted file mode 100644 index 43717478e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_XLarge_Frills.png b/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_XLarge_Frills.png deleted file mode 100644 index 022d7f6d7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MaidOutfit2_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_Large.png deleted file mode 100644 index d390102f2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_Normal.png deleted file mode 100644 index 82694122c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_Small.png deleted file mode 100644 index ce85e6661..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_XLarge.png deleted file mode 100644 index ff72da762..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/MistressTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_Large.png deleted file mode 100644 index d2d8e313a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_Normal.png deleted file mode 100644 index db95231ee..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_Small.png deleted file mode 100644 index a79cef73c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_XLarge.png deleted file mode 100644 index 78e276054..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/NurseUniform_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Robe1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/Robe1_Large.png deleted file mode 100644 index ab96d6bea..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Robe1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Robe1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/Robe1_Normal.png deleted file mode 100644 index d56c26017..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Robe1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Robe1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/Robe1_Small.png deleted file mode 100644 index 338f91ff9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Robe1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Robe1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/Robe1_XLarge.png deleted file mode 100644 index 35a90ae87..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Robe1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_Large.png deleted file mode 100644 index a3e837a08..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_Normal.png deleted file mode 100644 index 03bc24aba..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_Small.png deleted file mode 100644 index c569ba1ef..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_XLarge.png deleted file mode 100644 index 0c22cd7b4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/ShoulderlessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_Large.png deleted file mode 100644 index 2eb6e4860..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_Normal.png deleted file mode 100644 index 2e1e1d2b1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_Small.png deleted file mode 100644 index f48c71bcc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_XLarge.png deleted file mode 100644 index 913c20a42..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SleevelessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Bow.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Buckle.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Buckle.png deleted file mode 100644 index 9786715f9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Dress.png deleted file mode 100644 index d5e8f8457..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Shirt.png deleted file mode 100644 index 2070455c4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Bow.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Buckle.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Buckle.png deleted file mode 100644 index 5cb83366b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Dress.png deleted file mode 100644 index 02d53ed51..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Shirt.png deleted file mode 100644 index e6ad8aaa9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Bow.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Buckle.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Buckle.png deleted file mode 100644 index 6bea1d2dc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Dress.png deleted file mode 100644 index ad7728ce2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Shirt.png deleted file mode 100644 index 2b326ed34..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Bow.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Buckle.png deleted file mode 100644 index 187fbf3d2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Dress.png deleted file mode 100644 index 93482be04..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Shirt.png deleted file mode 100644 index 39088371f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_Large.png deleted file mode 100644 index 3dc3df4c9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_Normal.png deleted file mode 100644 index 5610c8d59..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_Small.png deleted file mode 100644 index 3138c3bca..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_XLarge.png deleted file mode 100644 index 28009c872..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Large_Color.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Large_Color.png deleted file mode 100644 index 0687c5e1c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Large_White.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Large_White.png deleted file mode 100644 index c21ad136e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Normal_Color.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Normal_Color.png deleted file mode 100644 index 3d14ee183..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Normal_White.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Normal_White.png deleted file mode 100644 index 16865a89b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Small_Color.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Small_Color.png deleted file mode 100644 index f84ef22ee..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Small_White.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Small_White.png deleted file mode 100644 index 4fb67084c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_XLarge_Color.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_XLarge_Color.png deleted file mode 100644 index 7b021d75b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_XLarge_White.png b/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_XLarge_White.png deleted file mode 100644 index 3c3da2790..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/StudentOutfit3_XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Base.png deleted file mode 100644 index 2b26c816c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer1.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer1.png deleted file mode 100644 index 9498e44f7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer2.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer2.png deleted file mode 100644 index f53739c3d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer3.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer3.png deleted file mode 100644 index be0817599..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer4.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer4.png deleted file mode 100644 index 7c640d2ba..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Base.png deleted file mode 100644 index c60fd7ab1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer1.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer1.png deleted file mode 100644 index 766b3d758..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer2.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer2.png deleted file mode 100644 index d9a9ae649..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer3.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer3.png deleted file mode 100644 index ab23de52b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer4.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer4.png deleted file mode 100644 index 0d40a7ea5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Base.png deleted file mode 100644 index e6617e735..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer1.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer1.png deleted file mode 100644 index d6b4fe9c4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer2.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer2.png deleted file mode 100644 index a08b559c2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer3.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer3.png deleted file mode 100644 index a580139b8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer4.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer4.png deleted file mode 100644 index 467edbf09..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Base.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Base.png deleted file mode 100644 index 910730845..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer1.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer1.png deleted file mode 100644 index 03749cadf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer2.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer2.png deleted file mode 100644 index 427566fc6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer3.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer3.png deleted file mode 100644 index 3cc2ede56..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer4.png b/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer4.png deleted file mode 100644 index 5c24d2a81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SummerDress_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_Large.png deleted file mode 100644 index fc76aa559..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_Normal.png deleted file mode 100644 index 30c147551..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_Small.png deleted file mode 100644 index 1c410400d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_XLarge.png deleted file mode 100644 index 5cb12a1da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/SuspenderTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_Large.png deleted file mode 100644 index 8ac8a4bd0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_Normal.png deleted file mode 100644 index c1796a185..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_Small.png deleted file mode 100644 index e40493e40..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_XLarge.png deleted file mode 100644 index 22e0f745a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Sweater1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_Large.png deleted file mode 100644 index bb34cbe99..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_Normal.png deleted file mode 100644 index 37df10151..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_Small.png deleted file mode 100644 index 7a2de259c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_XLarge.png deleted file mode 100644 index f2c83faf4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2BCLogo_Print.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt2BCLogo_Print.png deleted file mode 100644 index 717259582..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2BCLogo_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2BDSM_Print.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt2BDSM_Print.png deleted file mode 100644 index 62f576eb9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2BDSM_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Gag_Print.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Gag_Print.png deleted file mode 100644 index 5d5d4ea25..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Gag_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Knot_Print.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Knot_Print.png deleted file mode 100644 index de16f53e4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Knot_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Rock_Print.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Rock_Print.png deleted file mode 100644 index 34cab3760..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Rock_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Smile_Print.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Smile_Print.png deleted file mode 100644 index c6c67db94..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Smile_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Tick_Print.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Tick_Print.png deleted file mode 100644 index fb69e1ad4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2Tick_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_Large_Shirt.png deleted file mode 100644 index 3bc721549..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_Normal_Shirt.png deleted file mode 100644 index dc4443ecd..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_Small_Shirt.png deleted file mode 100644 index eaca83973..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_XLarge_Shirt.png deleted file mode 100644 index 3fdaec7c2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TShirt2_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_Large.png deleted file mode 100644 index 8ef434506..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_Normal.png deleted file mode 100644 index eab7dd5b1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_Small.png deleted file mode 100644 index 14cda1472..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_XLarge.png deleted file mode 100644 index 55a554767..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TeacherOutfit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_Large.png deleted file mode 100644 index 0bb9a6fa3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_Normal.png deleted file mode 100644 index 90068d13e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_Small.png deleted file mode 100644 index c8375c0cc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_XLarge.png deleted file mode 100644 index 223dd1680..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/TennisShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_Large.png deleted file mode 100644 index 204d7389b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_Normal.png deleted file mode 100644 index 7c318a365..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_Small.png deleted file mode 100644 index 881bbda0a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_XLarge.png deleted file mode 100644 index d48ec45de..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/VirginKiller1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_Large.png deleted file mode 100644 index 252537ea5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_Normal.png deleted file mode 100644 index 82c2129f3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_Small.png deleted file mode 100644 index 911f50624..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_XLarge.png deleted file mode 100644 index 0a46e4eb1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_Large.png deleted file mode 100644 index 5f0d310cc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_Normal.png deleted file mode 100644 index 1cb48ec15..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_Small.png deleted file mode 100644 index de1260bf2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_XLarge.png deleted file mode 100644 index 8888855da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_Large.png b/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_Large.png deleted file mode 100644 index 4c6f4d35b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_Normal.png b/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_Normal.png deleted file mode 100644 index c77390247..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_Small.png b/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_Small.png deleted file mode 100644 index acb0a6b3c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_XLarge.png b/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_XLarge.png deleted file mode 100644 index 788258e04..000000000 Binary files a/Assets/Female3DCG/Cloth/BackCuffs/Yukata1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Large_Jacket.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Large_Jacket.png deleted file mode 100644 index 26d70c54c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Large_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Large_Shirt.png deleted file mode 100644 index b6a2b3314..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Large_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Large_Trim.png deleted file mode 100644 index ba7b65910..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Normal_Jacket.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Normal_Jacket.png deleted file mode 100644 index 61b386528..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Normal_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Normal_Shirt.png deleted file mode 100644 index 576172eb5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Normal_Trim.png deleted file mode 100644 index d5c91614d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Small_Jacket.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Small_Jacket.png deleted file mode 100644 index a4b275631..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Small_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Small_Shirt.png deleted file mode 100644 index 9edd3bf9f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Small_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Small_Trim.png deleted file mode 100644 index c1dbac3ee..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_XLarge_Jacket.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_XLarge_Jacket.png deleted file mode 100644 index df37bc9a4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_XLarge_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_XLarge_Shirt.png deleted file mode 100644 index 88b0854ed..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_XLarge_Trim.png deleted file mode 100644 index 74b38b4eb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdmiralTop_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Large_Dress.png deleted file mode 100644 index 5b5814e15..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Large_Sash.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Large_Sash.png deleted file mode 100644 index e1b57f943..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Large_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Large_Trim.png deleted file mode 100644 index c4c4ce75f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Normal_Dress.png deleted file mode 100644 index ba23ad9fb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Normal_Sash.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Normal_Sash.png deleted file mode 100644 index 1d5bf45cc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Normal_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Normal_Trim.png deleted file mode 100644 index e64b58179..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Small_Dress.png deleted file mode 100644 index 526c4af97..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Small_Sash.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Small_Sash.png deleted file mode 100644 index ab31a3bd1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Small_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Small_Trim.png deleted file mode 100644 index f0f026a27..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_XLarge_Dress.png deleted file mode 100644 index e2af303f9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_XLarge_Sash.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_XLarge_Sash.png deleted file mode 100644 index a10fc8e0d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_XLarge_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_XLarge_Trim.png deleted file mode 100644 index 740b53290..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Large_Bow.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Large_Bow.png deleted file mode 100644 index 445c1d190..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Large_Dress.png deleted file mode 100644 index 48e0ac9ee..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Large_Lace.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Large_Lace.png deleted file mode 100644 index dc4c03664..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Normal_Bow.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Normal_Bow.png deleted file mode 100644 index 76c241e51..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Normal_Dress.png deleted file mode 100644 index ee8fd9994..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Normal_Lace.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Normal_Lace.png deleted file mode 100644 index 7b6bf51aa..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Small_Bow.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Small_Bow.png deleted file mode 100644 index 5fe535b59..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Small_Dress.png deleted file mode 100644 index ac0259957..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Small_Lace.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Small_Lace.png deleted file mode 100644 index e3abf33f0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_XLarge_Bow.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_XLarge_Bow.png deleted file mode 100644 index c4ee1c721..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_XLarge_Dress.png deleted file mode 100644 index 4a634c2c4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_XLarge_Lace.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_XLarge_Lace.png deleted file mode 100644 index 7ced73eff..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress2_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Large_Belt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Large_Belt.png deleted file mode 100644 index 793b0092b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Large_Collar.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Large_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Large_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Large_Dress.png deleted file mode 100644 index 6ce8a906a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Normal_Belt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Normal_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Normal_Collar.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Normal_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Normal_Dress.png deleted file mode 100644 index d342a0956..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Small_Belt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Small_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Small_Collar.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Small_Collar.png deleted file mode 100644 index e1d288227..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Small_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Small_Dress.png deleted file mode 100644 index d155334a3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_XLarge_Belt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_XLarge_Belt.png deleted file mode 100644 index 242ed4478..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_XLarge_Collar.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_XLarge_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_XLarge_Dress.png deleted file mode 100644 index 0fc13d142..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress3_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_Large.png deleted file mode 100644 index cd184ab6e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_Normal.png deleted file mode 100644 index fd20977b6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_Small.png deleted file mode 100644 index 4eaf3b6b7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_XLarge.png deleted file mode 100644 index daf1ad97d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/AdultBabyDress4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Large_Dress.png deleted file mode 100644 index 9e1a59773..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Large_Trim.png deleted file mode 100644 index 4848b503e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Normal_Dress.png deleted file mode 100644 index 4fb1d60cb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Normal_Trim.png deleted file mode 100644 index e7453352a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Small_Dress.png deleted file mode 100644 index d025a4895..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Small_Trim.png deleted file mode 100644 index a12084d90..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_XLarge_Dress.png deleted file mode 100644 index b7ef92305..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_XLarge_Trim.png deleted file mode 100644 index c6826313d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BabydollDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_Large.png deleted file mode 100644 index 8b59238f5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_Normal.png deleted file mode 100644 index eee081d2e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_Small.png deleted file mode 100644 index defafc983..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_XLarge.png deleted file mode 100644 index 4ec51d231..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Blouse1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Large_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Large_Base.png deleted file mode 100644 index 219772308..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Large_Pattern.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Large_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Large_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Large_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Large_Trim.png deleted file mode 100644 index 7fe15355c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Normal_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Normal_Base.png deleted file mode 100644 index 97f60e5ed..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Normal_Pattern.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Normal_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Normal_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Normal_Trim.png deleted file mode 100644 index 93cbe63ab..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Small_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Small_Base.png deleted file mode 100644 index da5663e24..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Small_Pattern.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Small_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Small_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Small_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Small_Trim.png deleted file mode 100644 index 08fb88b1d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_XLarge_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_XLarge_Base.png deleted file mode 100644 index 8b59ea5b7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_XLarge_Pattern.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_XLarge_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_XLarge_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_XLarge_Trim.png deleted file mode 100644 index a0049da95..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Bodice1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_Large.png deleted file mode 100644 index 7b609fe2e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_Normal.png deleted file mode 100644 index c38f6ed57..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_Small.png deleted file mode 100644 index bedd4b166..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_XLarge.png deleted file mode 100644 index 6a82a8c1c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BodyTowel1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_Large.png deleted file mode 100644 index 4d60463c3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_Normal.png deleted file mode 100644 index 857335240..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_Small.png deleted file mode 100644 index da44b9797..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_XLarge.png deleted file mode 100644 index 8b00bf184..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_Large.png deleted file mode 100644 index 4c1c5cb3a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_Normal.png deleted file mode 100644 index 6ddda67c7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_Small.png deleted file mode 100644 index 79546443b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_XLarge.png deleted file mode 100644 index ceef0df77..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageBustier2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_Large.png deleted file mode 100644 index 4538f3bbd..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_Normal.png deleted file mode 100644 index 9ef22bd54..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_Small.png deleted file mode 100644 index e9ae8eb25..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_XLarge.png deleted file mode 100644 index 4692b26de..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_Large.png deleted file mode 100644 index 49172e0d9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_Normal.png deleted file mode 100644 index 32b2cf54d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_Small.png deleted file mode 100644 index e15ada08b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_XLarge.png deleted file mode 100644 index 1ebb4f24a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BondageDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_Large.png deleted file mode 100644 index d022b9733..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_Normal.png deleted file mode 100644 index cd32c2cd9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_Small.png deleted file mode 100644 index f465c547f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_XLarge.png deleted file mode 100644 index 7e20a81f1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/BridesmaidDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_Large.png deleted file mode 100644 index 9275c4478..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_Normal.png deleted file mode 100644 index 436a86d1c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_Small.png deleted file mode 100644 index c206a96f1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_XLarge.png deleted file mode 100644 index a614dae25..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_LargePink_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_LargePink_Dress.png deleted file mode 100644 index d6b2c0e13..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_LargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_LargePurple_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_LargePurple_Dress.png deleted file mode 100644 index 58f882e57..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_LargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Large_Dress.png deleted file mode 100644 index b5b8c7c8a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Large_Edges.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Large_Edges.png deleted file mode 100644 index 8b896df40..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Large_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_NormalPink_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_NormalPink_Dress.png deleted file mode 100644 index 9fd1df4f8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_NormalPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_NormalPurple_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_NormalPurple_Dress.png deleted file mode 100644 index b1c59397c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_NormalPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Normal_Dress.png deleted file mode 100644 index 18993f2f4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Normal_Edges.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Normal_Edges.png deleted file mode 100644 index 45c82ae7e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Normal_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_SmallPink_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_SmallPink_Dress.png deleted file mode 100644 index c52e6330e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_SmallPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_SmallPurple_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_SmallPurple_Dress.png deleted file mode 100644 index 68473c5ce..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_SmallPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Small_Dress.png deleted file mode 100644 index fbe2b8245..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Small_Edges.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Small_Edges.png deleted file mode 100644 index af0872b38..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_Small_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLargePink_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLargePink_Dress.png deleted file mode 100644 index 98f6f5919..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLargePurple_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLargePurple_Dress.png deleted file mode 100644 index 32111de4b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLarge_Dress.png deleted file mode 100644 index 6e0fc27c5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLarge_Edges.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLarge_Edges.png deleted file mode 100644 index 743dd7ad3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ChineseDress2_XLarge_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Large_Shirt.png deleted file mode 100644 index 21fa9679f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Large_Tie.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Large_Tie.png deleted file mode 100644 index 482d3c672..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Large_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Normal_Shirt.png deleted file mode 100644 index 9157e6596..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Normal_Tie.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Normal_Tie.png deleted file mode 100644 index ac1d6902b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Normal_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Small_Shirt.png deleted file mode 100644 index 2b5eea49d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Small_Tie.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Small_Tie.png deleted file mode 100644 index 1698fb1fb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_Small_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_XLarge_Shirt.png deleted file mode 100644 index e419cbaa5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_XLarge_Tie.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_XLarge_Tie.png deleted file mode 100644 index 0957b46a2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CollegeOutfit1_XLarge_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_Large.png deleted file mode 100644 index 3a07ccddd..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_Normal.png deleted file mode 100644 index ff87f01e1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_Small.png deleted file mode 100644 index 2c6f6c0a0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_XLarge.png deleted file mode 100644 index e2a27a3c7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ComfyTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Large_Corset.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Large_Corset.png deleted file mode 100644 index d954ebedf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Large_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Large_Shirt.png deleted file mode 100644 index f9715781a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Normal_Corset.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Normal_Corset.png deleted file mode 100644 index ca173f733..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Normal_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Normal_Shirt.png deleted file mode 100644 index 997760f01..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Small_Corset.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Small_Corset.png deleted file mode 100644 index ca173f733..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Small_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Small_Shirt.png deleted file mode 100644 index 997760f01..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_XLarge_Corset.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_XLarge_Corset.png deleted file mode 100644 index 73ab4f678..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_XLarge_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_XLarge_Shirt.png deleted file mode 100644 index c79a4c7f1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/CorsetShirt_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_Large.png deleted file mode 100644 index 7b7b3bac6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_Normal.png deleted file mode 100644 index 48fe3c3a2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_Small.png deleted file mode 100644 index f2711e458..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_XLarge.png deleted file mode 100644 index d214069ea..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_Large.png deleted file mode 100644 index 5d7c1cabf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_Normal.png deleted file mode 100644 index 6a90449a7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_Small.png deleted file mode 100644 index 884916221..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_XLarge.png deleted file mode 100644 index f5ebf32db..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Dress3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Large_Fabric.png b/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Large_Fabric.png deleted file mode 100644 index 8b1d68e56..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Large_Fur.png b/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Large_Fur.png deleted file mode 100644 index 71df548f7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Normal_Fabric.png b/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Normal_Fabric.png deleted file mode 100644 index b60c1b8a4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Normal_Fur.png b/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Normal_Fur.png deleted file mode 100644 index 711020107..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Small_Fabric.png b/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Small_Fabric.png deleted file mode 100644 index 4eacf812d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Small_Fur.png b/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Small_Fur.png deleted file mode 100644 index 0e15ac960..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_XLarge_Fabric.png b/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_XLarge_Fabric.png deleted file mode 100644 index b22b33725..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_XLarge_Fur.png b/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_XLarge_Fur.png deleted file mode 100644 index f8ff38d5d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/DressFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Large_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Large_Dress.png deleted file mode 100644 index 6420ea24d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Large_Flower.png b/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Large_Flower.png deleted file mode 100644 index 0fe57a834..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Large_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Normal_Dress.png deleted file mode 100644 index 1ce6e6f9c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Normal_Flower.png b/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Normal_Flower.png deleted file mode 100644 index f9a431623..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Normal_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Small_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Small_Dress.png deleted file mode 100644 index 712994d56..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Small_Flower.png b/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Small_Flower.png deleted file mode 100644 index c7d872ad6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_Small_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_XLarge_Dress.png deleted file mode 100644 index 356fb9380..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_XLarge_Flower.png b/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_XLarge_Flower.png deleted file mode 100644 index 5686a3cca..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/FlowerDress_XLarge_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/FurCoat_Upper.png b/Assets/Female3DCG/Cloth/BackElbowTouch/FurCoat_Upper.png deleted file mode 100644 index cafd32dfd..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/FurCoat_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_Large.png deleted file mode 100644 index 87d72370d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_Normal.png deleted file mode 100644 index a2ef948e1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_Small.png deleted file mode 100644 index 3b9640086..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_XLarge.png deleted file mode 100644 index 5f07b6481..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_Large.png deleted file mode 100644 index 075834961..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_Normal.png deleted file mode 100644 index bb16042ec..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_Small.png deleted file mode 100644 index 2ccef0c4c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_XLarge.png deleted file mode 100644 index 121d5137d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown2Top_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_Large.png deleted file mode 100644 index 45e05ecd9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_Normal.png deleted file mode 100644 index b45d4c1e2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_Small.png deleted file mode 100644 index f6c0446af..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_XLarge.png deleted file mode 100644 index e954c85f1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Gown3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_BackSkirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_BackSkirt.png deleted file mode 100644 index e6ff11224..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_BackSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Base.png deleted file mode 100644 index d468626f7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Belt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Belt.png deleted file mode 100644 index 490febbfa..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Buckle.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Buckle.png deleted file mode 100644 index 0fb758187..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Trim.png deleted file mode 100644 index 44f42a8ec..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Base.png deleted file mode 100644 index a8e09ffd0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Belt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Belt.png deleted file mode 100644 index 6c8457d2d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Buckle.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Buckle.png deleted file mode 100644 index 679247f8d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Trim.png deleted file mode 100644 index 4160a0596..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Base.png deleted file mode 100644 index 1390e1599..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Belt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Belt.png deleted file mode 100644 index 290d51bfc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Buckle.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Buckle.png deleted file mode 100644 index b11836cb6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Trim.png deleted file mode 100644 index f8dd9d574..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Base.png deleted file mode 100644 index d366ea9f8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Belt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Belt.png deleted file mode 100644 index ec1c42c84..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Buckle.png deleted file mode 100644 index cc20a702d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Trim.png b/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Trim.png deleted file mode 100644 index 2fa0772ef..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/GrandMage_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Jacket_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Jacket_Base.png deleted file mode 100644 index 8e342ee31..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Jacket_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_Large.png deleted file mode 100644 index d9291cbbc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_Normal.png deleted file mode 100644 index e5bfd1266..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_Small.png deleted file mode 100644 index d8be602da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_XLarge.png deleted file mode 100644 index 614fff240..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LaceBabydoll_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_Large.png deleted file mode 100644 index 87868caf9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_LargeNonLaced.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_LargeNonLaced.png deleted file mode 100644 index 3d1b96a0e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_LargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_Normal.png deleted file mode 100644 index 4055e832e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_NormalNonLaced.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_NormalNonLaced.png deleted file mode 100644 index 09da2eb36..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_NormalNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_Small.png deleted file mode 100644 index 06d9c83c2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_SmallNonLaced.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_SmallNonLaced.png deleted file mode 100644 index dfacdcd78..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_SmallNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_XLarge.png deleted file mode 100644 index e7cc58bda..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_XLargeNonLaced.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_XLargeNonLaced.png deleted file mode 100644 index 310288b81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexLacedSuit_XLargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_Large.png deleted file mode 100644 index aecd75d3f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_Normal.png deleted file mode 100644 index 4d8369041..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_Small.png deleted file mode 100644 index afbeb7422..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_XLarge.png deleted file mode 100644 index 1b024c320..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LatexTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_Large.png deleted file mode 100644 index 25bb83f08..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_Normal.png deleted file mode 100644 index 4ee7dd93f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_Small.png deleted file mode 100644 index ff98f2f19..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_XLarge.png deleted file mode 100644 index a6313bd5b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherBolero_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_Large.png deleted file mode 100644 index 642c1adf8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_Normal.png deleted file mode 100644 index e052c6c0f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_Small.png deleted file mode 100644 index 9e87e8072..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_XLarge.png deleted file mode 100644 index c18ece8d9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/LeatherCropTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_Large.png deleted file mode 100644 index d9336a968..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_Normal.png deleted file mode 100644 index d710f52bc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_Small.png deleted file mode 100644 index 2ddde972b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_XLarge.png deleted file mode 100644 index dc9253ef9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_Large.png deleted file mode 100644 index 1a89ad1e2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_Normal.png deleted file mode 100644 index 150974896..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_Small.png deleted file mode 100644 index 813c91958..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_XLarge.png deleted file mode 100644 index 8817288e2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidApron2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Large_Apron.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Large_Apron.png deleted file mode 100644 index 53baf2727..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Large_Dress.png deleted file mode 100644 index 90346af6b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Large_Frills.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Large_Frills.png deleted file mode 100644 index 6debe8a90..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Normal_Apron.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Normal_Apron.png deleted file mode 100644 index accd3c858..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Normal_Dress.png deleted file mode 100644 index d246d7613..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Normal_Frills.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Normal_Frills.png deleted file mode 100644 index 5bf884c06..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Small_Apron.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Small_Apron.png deleted file mode 100644 index 89efddf29..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Small_Dress.png deleted file mode 100644 index d10ffb2c2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Small_Frills.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Small_Frills.png deleted file mode 100644 index cfabe6037..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_XLarge_Apron.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_XLarge_Apron.png deleted file mode 100644 index 263732cb9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_XLarge_Dress.png deleted file mode 100644 index a57767d3a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_XLarge_Frills.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_XLarge_Frills.png deleted file mode 100644 index 8989660c1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit1_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Large_Apron.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Large_Apron.png deleted file mode 100644 index 9c644e9ce..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Large_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Large_Dress.png deleted file mode 100644 index c6f37ad8a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Large_Frills.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Large_Frills.png deleted file mode 100644 index e2ea0637e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Normal_Apron.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Normal_Apron.png deleted file mode 100644 index c2bea32fb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Normal_Dress.png deleted file mode 100644 index 79f41959a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Normal_Frills.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Normal_Frills.png deleted file mode 100644 index ee28a292f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Small_Apron.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Small_Apron.png deleted file mode 100644 index 2efab6493..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Small_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Small_Dress.png deleted file mode 100644 index e1e94e52a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Small_Frills.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Small_Frills.png deleted file mode 100644 index 428a8a273..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_XLarge_Apron.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_XLarge_Apron.png deleted file mode 100644 index 3bd40173a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_XLarge_Dress.png deleted file mode 100644 index 6be32669e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_XLarge_Frills.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_XLarge_Frills.png deleted file mode 100644 index d636d5c69..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MaidOutfit2_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_Large.png deleted file mode 100644 index d390102f2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_Normal.png deleted file mode 100644 index 82694122c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_Small.png deleted file mode 100644 index ce85e6661..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_XLarge.png deleted file mode 100644 index ff72da762..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/MistressTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_Large.png deleted file mode 100644 index 25865ada6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_Normal.png deleted file mode 100644 index ed115f3a1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_Small.png deleted file mode 100644 index 8de12992d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_XLarge.png deleted file mode 100644 index 4e6da0843..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/NurseUniform_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_Large.png deleted file mode 100644 index 2de12a4f6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_Normal.png deleted file mode 100644 index ef0775094..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_Small.png deleted file mode 100644 index 1d1cb9782..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_XLarge.png deleted file mode 100644 index 58f684e8d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Robe1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_Large.png deleted file mode 100644 index 2341397d0..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_Normal.png deleted file mode 100644 index 39e6bdda7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_Small.png deleted file mode 100644 index edd3a833a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_XLarge.png deleted file mode 100644 index 155e4201e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/ShoulderlessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_Large.png deleted file mode 100644 index 2eb6e4860..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_Normal.png deleted file mode 100644 index 2e1e1d2b1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_Small.png deleted file mode 100644 index f48c71bcc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_XLarge.png deleted file mode 100644 index 913c20a42..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SleevelessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Bow.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Bow.png deleted file mode 100644 index 354fcc72c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Buckle.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Buckle.png deleted file mode 100644 index 9786715f9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Dress.png deleted file mode 100644 index 196b64b87..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Shirt.png deleted file mode 100644 index 67102035a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Bow.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Bow.png deleted file mode 100644 index 354fcc72c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Buckle.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Buckle.png deleted file mode 100644 index 5cb83366b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Dress.png deleted file mode 100644 index 814605ca9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Shirt.png deleted file mode 100644 index be7b37008..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Bow.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Bow.png deleted file mode 100644 index 354fcc72c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Buckle.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Buckle.png deleted file mode 100644 index 6bea1d2dc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Dress.png deleted file mode 100644 index 7a8d75ea9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Shirt.png deleted file mode 100644 index ae8df684c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Bow.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Bow.png deleted file mode 100644 index 354fcc72c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Buckle.png deleted file mode 100644 index 187fbf3d2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Dress.png deleted file mode 100644 index d9aeac017..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Shirt.png deleted file mode 100644 index 3540d7fba..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_Large.png deleted file mode 100644 index 3b8cf0c49..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_Normal.png deleted file mode 100644 index 51eed1469..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_Small.png deleted file mode 100644 index 4ec311798..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_XLarge.png deleted file mode 100644 index 970dd18be..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Large_Color.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Large_Color.png deleted file mode 100644 index b2f380fd2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Large_White.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Large_White.png deleted file mode 100644 index baddaead3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Normal_Color.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Normal_Color.png deleted file mode 100644 index 96032ec74..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Normal_White.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Normal_White.png deleted file mode 100644 index b14258eaa..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Small_Color.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Small_Color.png deleted file mode 100644 index 72fd29305..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Small_White.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Small_White.png deleted file mode 100644 index 3c637b280..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_XLarge_Color.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_XLarge_Color.png deleted file mode 100644 index 6b17589fb..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_XLarge_White.png b/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_XLarge_White.png deleted file mode 100644 index 832cd65fe..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/StudentOutfit3_XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Base.png deleted file mode 100644 index 2b26c816c..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer1.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer1.png deleted file mode 100644 index 9498e44f7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer2.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer2.png deleted file mode 100644 index f53739c3d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer3.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer3.png deleted file mode 100644 index 6d12c1951..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer4.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer4.png deleted file mode 100644 index 7c640d2ba..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Base.png deleted file mode 100644 index c60fd7ab1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer1.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer1.png deleted file mode 100644 index 766b3d758..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer2.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer2.png deleted file mode 100644 index d9a9ae649..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer3.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer3.png deleted file mode 100644 index 87f3644d8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer4.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer4.png deleted file mode 100644 index 0d40a7ea5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Base.png deleted file mode 100644 index e6617e735..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer1.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer1.png deleted file mode 100644 index d6b4fe9c4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer2.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer2.png deleted file mode 100644 index a08b559c2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer3.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer3.png deleted file mode 100644 index 607b1f01f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer4.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer4.png deleted file mode 100644 index 467edbf09..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Base.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Base.png deleted file mode 100644 index 910730845..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer1.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer1.png deleted file mode 100644 index 03749cadf..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer2.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer2.png deleted file mode 100644 index 427566fc6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer3.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer3.png deleted file mode 100644 index 968fb58b8..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer4.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer4.png deleted file mode 100644 index 5c24d2a81..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SummerDress_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_Large.png deleted file mode 100644 index fc76aa559..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_Normal.png deleted file mode 100644 index 30c147551..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_Small.png deleted file mode 100644 index 1c410400d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_XLarge.png deleted file mode 100644 index 5cb12a1da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/SuspenderTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_Large.png deleted file mode 100644 index 7a302582f..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_Normal.png deleted file mode 100644 index fddcd6ff7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_Small.png deleted file mode 100644 index a081e044a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_XLarge.png deleted file mode 100644 index a4dae29b5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Sweater1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_Large.png deleted file mode 100644 index 4d1ef7445..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_Normal.png deleted file mode 100644 index ca273f8c4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_Small.png deleted file mode 100644 index 79e105321..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_XLarge.png deleted file mode 100644 index 2c5a16ce7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2BCLogo_Print.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2BCLogo_Print.png deleted file mode 100644 index 717259582..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2BCLogo_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2BDSM_Print.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2BDSM_Print.png deleted file mode 100644 index 62f576eb9..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2BDSM_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Gag_Print.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Gag_Print.png deleted file mode 100644 index 5d5d4ea25..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Gag_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Knot_Print.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Knot_Print.png deleted file mode 100644 index de16f53e4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Knot_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Rock_Print.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Rock_Print.png deleted file mode 100644 index 34cab3760..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Rock_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Smile_Print.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Smile_Print.png deleted file mode 100644 index c6c67db94..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Smile_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Tick_Print.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Tick_Print.png deleted file mode 100644 index fb69e1ad4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2Tick_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_Large_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_Large_Shirt.png deleted file mode 100644 index db755a5a4..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_Normal_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_Normal_Shirt.png deleted file mode 100644 index 75d79b519..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_Small_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_Small_Shirt.png deleted file mode 100644 index 3b812550d..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_XLarge_Shirt.png deleted file mode 100644 index ea0ef7fba..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TShirt2_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_Large.png deleted file mode 100644 index eac2bdc12..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_Normal.png deleted file mode 100644 index e3268a2f7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_Small.png deleted file mode 100644 index a7bee920a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_XLarge.png deleted file mode 100644 index 63be520c7..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TeacherOutfit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_Large.png deleted file mode 100644 index 0eda70c27..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_Normal.png deleted file mode 100644 index 3cd0fc58a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_Small.png deleted file mode 100644 index 7bceaa88e..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_XLarge.png deleted file mode 100644 index 0b9ca6ca6..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/TennisShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_Large.png deleted file mode 100644 index 204d7389b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_Normal.png deleted file mode 100644 index 7c318a365..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_Small.png deleted file mode 100644 index 881bbda0a..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_XLarge.png deleted file mode 100644 index d48ec45de..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/VirginKiller1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_Large.png deleted file mode 100644 index 252537ea5..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_Normal.png deleted file mode 100644 index 82c2129f3..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_Small.png deleted file mode 100644 index 911f50624..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_XLarge.png deleted file mode 100644 index 0a46e4eb1..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_Large.png deleted file mode 100644 index 5f0d310cc..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_Normal.png deleted file mode 100644 index 1cb48ec15..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_Small.png deleted file mode 100644 index de1260bf2..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_XLarge.png deleted file mode 100644 index 8888855da..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_Large.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_Large.png deleted file mode 100644 index f2b165618..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_Normal.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_Normal.png deleted file mode 100644 index eb3814e06..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_Small.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_Small.png deleted file mode 100644 index d44ac8a53..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_XLarge.png b/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_XLarge.png deleted file mode 100644 index 5bfa43d0b..000000000 Binary files a/Assets/Female3DCG/Cloth/BackElbowTouch/Yukata1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Blouse1_Large.png b/Assets/Female3DCG/Cloth/Blouse1_Large.png deleted file mode 100644 index 37de4382b..000000000 Binary files a/Assets/Female3DCG/Cloth/Blouse1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Blouse1_Normal.png b/Assets/Female3DCG/Cloth/Blouse1_Normal.png deleted file mode 100644 index 1320f44b4..000000000 Binary files a/Assets/Female3DCG/Cloth/Blouse1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Blouse1_Small.png b/Assets/Female3DCG/Cloth/Blouse1_Small.png deleted file mode 100644 index e945b4bfb..000000000 Binary files a/Assets/Female3DCG/Cloth/Blouse1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Blouse1_XLarge.png b/Assets/Female3DCG/Cloth/Blouse1_XLarge.png deleted file mode 100644 index d5e507946..000000000 Binary files a/Assets/Female3DCG/Cloth/Blouse1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_Large_Base.png b/Assets/Female3DCG/Cloth/Bodice1_Large_Base.png deleted file mode 100644 index 08ff9700e..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_Large_Pattern.png b/Assets/Female3DCG/Cloth/Bodice1_Large_Pattern.png deleted file mode 100644 index acc6c4060..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_Large_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_Large_Trim.png b/Assets/Female3DCG/Cloth/Bodice1_Large_Trim.png deleted file mode 100644 index 7fe15355c..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_Normal_Base.png b/Assets/Female3DCG/Cloth/Bodice1_Normal_Base.png deleted file mode 100644 index 95f96696b..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_Normal_Pattern.png b/Assets/Female3DCG/Cloth/Bodice1_Normal_Pattern.png deleted file mode 100644 index acc6c4060..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_Normal_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_Normal_Trim.png b/Assets/Female3DCG/Cloth/Bodice1_Normal_Trim.png deleted file mode 100644 index 93cbe63ab..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_Small_Base.png b/Assets/Female3DCG/Cloth/Bodice1_Small_Base.png deleted file mode 100644 index 83a6e0ec1..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_Small_Pattern.png b/Assets/Female3DCG/Cloth/Bodice1_Small_Pattern.png deleted file mode 100644 index acc6c4060..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_Small_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_Small_Trim.png b/Assets/Female3DCG/Cloth/Bodice1_Small_Trim.png deleted file mode 100644 index 08fb88b1d..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_XLarge_Base.png b/Assets/Female3DCG/Cloth/Bodice1_XLarge_Base.png deleted file mode 100644 index 3e55d8a4f..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_XLarge_Pattern.png b/Assets/Female3DCG/Cloth/Bodice1_XLarge_Pattern.png deleted file mode 100644 index acc6c4060..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_XLarge_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Bodice1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/Bodice1_XLarge_Trim.png deleted file mode 100644 index a0049da95..000000000 Binary files a/Assets/Female3DCG/Cloth/Bodice1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BodyTowel1_Large.png b/Assets/Female3DCG/Cloth/BodyTowel1_Large.png deleted file mode 100644 index 490675eab..000000000 Binary files a/Assets/Female3DCG/Cloth/BodyTowel1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BodyTowel1_Normal.png b/Assets/Female3DCG/Cloth/BodyTowel1_Normal.png deleted file mode 100644 index b4364eca0..000000000 Binary files a/Assets/Female3DCG/Cloth/BodyTowel1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BodyTowel1_Small.png b/Assets/Female3DCG/Cloth/BodyTowel1_Small.png deleted file mode 100644 index 1677276af..000000000 Binary files a/Assets/Female3DCG/Cloth/BodyTowel1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BodyTowel1_XLarge.png b/Assets/Female3DCG/Cloth/BodyTowel1_XLarge.png deleted file mode 100644 index 8b4ac7459..000000000 Binary files a/Assets/Female3DCG/Cloth/BodyTowel1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageBustier1_Large.png b/Assets/Female3DCG/Cloth/BondageBustier1_Large.png deleted file mode 100644 index 4d60463c3..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageBustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageBustier1_Normal.png b/Assets/Female3DCG/Cloth/BondageBustier1_Normal.png deleted file mode 100644 index 857335240..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageBustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageBustier1_Small.png b/Assets/Female3DCG/Cloth/BondageBustier1_Small.png deleted file mode 100644 index da44b9797..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageBustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageBustier1_XLarge.png b/Assets/Female3DCG/Cloth/BondageBustier1_XLarge.png deleted file mode 100644 index 8b00bf184..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageBustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageBustier2_Large.png b/Assets/Female3DCG/Cloth/BondageBustier2_Large.png deleted file mode 100644 index 4c1c5cb3a..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageBustier2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageBustier2_Normal.png b/Assets/Female3DCG/Cloth/BondageBustier2_Normal.png deleted file mode 100644 index 6ddda67c7..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageBustier2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageBustier2_Small.png b/Assets/Female3DCG/Cloth/BondageBustier2_Small.png deleted file mode 100644 index 79546443b..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageBustier2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageBustier2_XLarge.png b/Assets/Female3DCG/Cloth/BondageBustier2_XLarge.png deleted file mode 100644 index ceef0df77..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageBustier2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageDress1_Large.png b/Assets/Female3DCG/Cloth/BondageDress1_Large.png deleted file mode 100644 index 40ae92855..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageDress1_Normal.png b/Assets/Female3DCG/Cloth/BondageDress1_Normal.png deleted file mode 100644 index e5f7bf04c..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageDress1_Small.png b/Assets/Female3DCG/Cloth/BondageDress1_Small.png deleted file mode 100644 index 319a90e15..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageDress1_XLarge.png b/Assets/Female3DCG/Cloth/BondageDress1_XLarge.png deleted file mode 100644 index 1268b708e..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageDress2_Large.png b/Assets/Female3DCG/Cloth/BondageDress2_Large.png deleted file mode 100644 index d165495a0..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageDress2_Normal.png b/Assets/Female3DCG/Cloth/BondageDress2_Normal.png deleted file mode 100644 index 03f3680df..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageDress2_Small.png b/Assets/Female3DCG/Cloth/BondageDress2_Small.png deleted file mode 100644 index a913ab5d3..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BondageDress2_XLarge.png b/Assets/Female3DCG/Cloth/BondageDress2_XLarge.png deleted file mode 100644 index 5edb263c4..000000000 Binary files a/Assets/Female3DCG/Cloth/BondageDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BridesmaidDress1_Large.png b/Assets/Female3DCG/Cloth/BridesmaidDress1_Large.png deleted file mode 100644 index 471ea7c50..000000000 Binary files a/Assets/Female3DCG/Cloth/BridesmaidDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BridesmaidDress1_Normal.png b/Assets/Female3DCG/Cloth/BridesmaidDress1_Normal.png deleted file mode 100644 index 35eb6950f..000000000 Binary files a/Assets/Female3DCG/Cloth/BridesmaidDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BridesmaidDress1_Small.png b/Assets/Female3DCG/Cloth/BridesmaidDress1_Small.png deleted file mode 100644 index 337c69eab..000000000 Binary files a/Assets/Female3DCG/Cloth/BridesmaidDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/BridesmaidDress1_XLarge.png b/Assets/Female3DCG/Cloth/BridesmaidDress1_XLarge.png deleted file mode 100644 index 77d3a6a44..000000000 Binary files a/Assets/Female3DCG/Cloth/BridesmaidDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress1_Large.png b/Assets/Female3DCG/Cloth/ChineseDress1_Large.png deleted file mode 100644 index 8b438e863..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress1_Normal.png b/Assets/Female3DCG/Cloth/ChineseDress1_Normal.png deleted file mode 100644 index 80a7826c6..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress1_Small.png b/Assets/Female3DCG/Cloth/ChineseDress1_Small.png deleted file mode 100644 index 6fcb2d770..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress1_XLarge.png b/Assets/Female3DCG/Cloth/ChineseDress1_XLarge.png deleted file mode 100644 index c04b10157..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_LargePink_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_LargePink_Dress.png deleted file mode 100644 index bb4c2eaba..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_LargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_LargePurple_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_LargePurple_Dress.png deleted file mode 100644 index dd244ee61..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_LargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_Large_Dress.png deleted file mode 100644 index 89e657505..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_Large_Edges.png b/Assets/Female3DCG/Cloth/ChineseDress2_Large_Edges.png deleted file mode 100644 index 60d286c84..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_Large_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_NormalPink_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_NormalPink_Dress.png deleted file mode 100644 index 3ab60b6ff..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_NormalPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_NormalPurple_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_NormalPurple_Dress.png deleted file mode 100644 index b52891bd6..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_NormalPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_Normal_Dress.png deleted file mode 100644 index 41136ecb6..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_Normal_Edges.png b/Assets/Female3DCG/Cloth/ChineseDress2_Normal_Edges.png deleted file mode 100644 index c661957f0..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_Normal_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_SmallPink_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_SmallPink_Dress.png deleted file mode 100644 index 93ceebc95..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_SmallPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_SmallPurple_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_SmallPurple_Dress.png deleted file mode 100644 index 0db39c649..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_SmallPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_Small_Dress.png deleted file mode 100644 index 94a92a9c4..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_Small_Edges.png b/Assets/Female3DCG/Cloth/ChineseDress2_Small_Edges.png deleted file mode 100644 index 0736c5d5f..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_Small_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_XLargePink_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_XLargePink_Dress.png deleted file mode 100644 index 013b01a23..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_XLargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_XLargePurple_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_XLargePurple_Dress.png deleted file mode 100644 index c5a1f19e7..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_XLargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/ChineseDress2_XLarge_Dress.png deleted file mode 100644 index cab0e37f2..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ChineseDress2_XLarge_Edges.png b/Assets/Female3DCG/Cloth/ChineseDress2_XLarge_Edges.png deleted file mode 100644 index 2c3b2de42..000000000 Binary files a/Assets/Female3DCG/Cloth/ChineseDress2_XLarge_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CollegeOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/CollegeOutfit1_Large_Shirt.png deleted file mode 100644 index efc3109ee..000000000 Binary files a/Assets/Female3DCG/Cloth/CollegeOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CollegeOutfit1_Large_Tie.png b/Assets/Female3DCG/Cloth/CollegeOutfit1_Large_Tie.png deleted file mode 100644 index cb021346e..000000000 Binary files a/Assets/Female3DCG/Cloth/CollegeOutfit1_Large_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CollegeOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/CollegeOutfit1_Normal_Shirt.png deleted file mode 100644 index a923ad6ee..000000000 Binary files a/Assets/Female3DCG/Cloth/CollegeOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CollegeOutfit1_Normal_Tie.png b/Assets/Female3DCG/Cloth/CollegeOutfit1_Normal_Tie.png deleted file mode 100644 index db7bc49ca..000000000 Binary files a/Assets/Female3DCG/Cloth/CollegeOutfit1_Normal_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CollegeOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/CollegeOutfit1_Small_Shirt.png deleted file mode 100644 index 62a732897..000000000 Binary files a/Assets/Female3DCG/Cloth/CollegeOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CollegeOutfit1_Small_Tie.png b/Assets/Female3DCG/Cloth/CollegeOutfit1_Small_Tie.png deleted file mode 100644 index 30c783c4d..000000000 Binary files a/Assets/Female3DCG/Cloth/CollegeOutfit1_Small_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CollegeOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/CollegeOutfit1_XLarge_Shirt.png deleted file mode 100644 index 61b695230..000000000 Binary files a/Assets/Female3DCG/Cloth/CollegeOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CollegeOutfit1_XLarge_Tie.png b/Assets/Female3DCG/Cloth/CollegeOutfit1_XLarge_Tie.png deleted file mode 100644 index f7c68f504..000000000 Binary files a/Assets/Female3DCG/Cloth/CollegeOutfit1_XLarge_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ComfyTop_Large.png b/Assets/Female3DCG/Cloth/ComfyTop_Large.png deleted file mode 100644 index a561e2a43..000000000 Binary files a/Assets/Female3DCG/Cloth/ComfyTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ComfyTop_Normal.png b/Assets/Female3DCG/Cloth/ComfyTop_Normal.png deleted file mode 100644 index eac8b98f5..000000000 Binary files a/Assets/Female3DCG/Cloth/ComfyTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ComfyTop_Small.png b/Assets/Female3DCG/Cloth/ComfyTop_Small.png deleted file mode 100644 index 13cb4fa67..000000000 Binary files a/Assets/Female3DCG/Cloth/ComfyTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ComfyTop_XLarge.png b/Assets/Female3DCG/Cloth/ComfyTop_XLarge.png deleted file mode 100644 index e99e0a3b7..000000000 Binary files a/Assets/Female3DCG/Cloth/ComfyTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CorsetShirt_Large_Corset.png b/Assets/Female3DCG/Cloth/CorsetShirt_Large_Corset.png deleted file mode 100644 index d2e31a453..000000000 Binary files a/Assets/Female3DCG/Cloth/CorsetShirt_Large_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CorsetShirt_Large_Shirt.png b/Assets/Female3DCG/Cloth/CorsetShirt_Large_Shirt.png deleted file mode 100644 index 42edef268..000000000 Binary files a/Assets/Female3DCG/Cloth/CorsetShirt_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CorsetShirt_Normal_Corset.png b/Assets/Female3DCG/Cloth/CorsetShirt_Normal_Corset.png deleted file mode 100644 index 8f9a48e74..000000000 Binary files a/Assets/Female3DCG/Cloth/CorsetShirt_Normal_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CorsetShirt_Normal_Shirt.png b/Assets/Female3DCG/Cloth/CorsetShirt_Normal_Shirt.png deleted file mode 100644 index 2f569e354..000000000 Binary files a/Assets/Female3DCG/Cloth/CorsetShirt_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CorsetShirt_Small_Corset.png b/Assets/Female3DCG/Cloth/CorsetShirt_Small_Corset.png deleted file mode 100644 index bae4aa344..000000000 Binary files a/Assets/Female3DCG/Cloth/CorsetShirt_Small_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CorsetShirt_Small_Shirt.png b/Assets/Female3DCG/Cloth/CorsetShirt_Small_Shirt.png deleted file mode 100644 index af169854c..000000000 Binary files a/Assets/Female3DCG/Cloth/CorsetShirt_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CorsetShirt_XLarge_Corset.png b/Assets/Female3DCG/Cloth/CorsetShirt_XLarge_Corset.png deleted file mode 100644 index 4cb5b0c8a..000000000 Binary files a/Assets/Female3DCG/Cloth/CorsetShirt_XLarge_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CorsetShirt_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/CorsetShirt_XLarge_Shirt.png deleted file mode 100644 index 250645b6f..000000000 Binary files a/Assets/Female3DCG/Cloth/CorsetShirt_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CropTop_Large_Blouse.png b/Assets/Female3DCG/Cloth/CropTop_Large_Blouse.png deleted file mode 100644 index 914aa24ff..000000000 Binary files a/Assets/Female3DCG/Cloth/CropTop_Large_Blouse.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CropTop_Large_Design.png b/Assets/Female3DCG/Cloth/CropTop_Large_Design.png deleted file mode 100644 index 9d159f4fb..000000000 Binary files a/Assets/Female3DCG/Cloth/CropTop_Large_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CropTop_Normal_Blouse.png b/Assets/Female3DCG/Cloth/CropTop_Normal_Blouse.png deleted file mode 100644 index 884ef677f..000000000 Binary files a/Assets/Female3DCG/Cloth/CropTop_Normal_Blouse.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CropTop_Normal_Design.png b/Assets/Female3DCG/Cloth/CropTop_Normal_Design.png deleted file mode 100644 index 1e099ba43..000000000 Binary files a/Assets/Female3DCG/Cloth/CropTop_Normal_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CropTop_Small_Blouse.png b/Assets/Female3DCG/Cloth/CropTop_Small_Blouse.png deleted file mode 100644 index bfbb7ddcd..000000000 Binary files a/Assets/Female3DCG/Cloth/CropTop_Small_Blouse.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CropTop_Small_Design.png b/Assets/Female3DCG/Cloth/CropTop_Small_Design.png deleted file mode 100644 index 361703e70..000000000 Binary files a/Assets/Female3DCG/Cloth/CropTop_Small_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CropTop_XLarge_Blouse.png b/Assets/Female3DCG/Cloth/CropTop_XLarge_Blouse.png deleted file mode 100644 index 00d6ec891..000000000 Binary files a/Assets/Female3DCG/Cloth/CropTop_XLarge_Blouse.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/CropTop_XLarge_Design.png b/Assets/Female3DCG/Cloth/CropTop_XLarge_Design.png deleted file mode 100644 index d42099313..000000000 Binary files a/Assets/Female3DCG/Cloth/CropTop_XLarge_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Dress2_Large.png b/Assets/Female3DCG/Cloth/Dress2_Large.png deleted file mode 100644 index 15eecffeb..000000000 Binary files a/Assets/Female3DCG/Cloth/Dress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Dress2_Normal.png b/Assets/Female3DCG/Cloth/Dress2_Normal.png deleted file mode 100644 index 5351d832e..000000000 Binary files a/Assets/Female3DCG/Cloth/Dress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Dress2_Small.png b/Assets/Female3DCG/Cloth/Dress2_Small.png deleted file mode 100644 index 3a351e4f2..000000000 Binary files a/Assets/Female3DCG/Cloth/Dress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Dress2_XLarge.png b/Assets/Female3DCG/Cloth/Dress2_XLarge.png deleted file mode 100644 index 6c1141a12..000000000 Binary files a/Assets/Female3DCG/Cloth/Dress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Dress3_Large.png b/Assets/Female3DCG/Cloth/Dress3_Large.png deleted file mode 100644 index 048778e58..000000000 Binary files a/Assets/Female3DCG/Cloth/Dress3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Dress3_Normal.png b/Assets/Female3DCG/Cloth/Dress3_Normal.png deleted file mode 100644 index 6a55ddad3..000000000 Binary files a/Assets/Female3DCG/Cloth/Dress3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Dress3_Small.png b/Assets/Female3DCG/Cloth/Dress3_Small.png deleted file mode 100644 index f035610b3..000000000 Binary files a/Assets/Female3DCG/Cloth/Dress3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Dress3_XLarge.png b/Assets/Female3DCG/Cloth/Dress3_XLarge.png deleted file mode 100644 index 871eb4edb..000000000 Binary files a/Assets/Female3DCG/Cloth/Dress3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/DressFur_Large_Fabric.png b/Assets/Female3DCG/Cloth/DressFur_Large_Fabric.png deleted file mode 100644 index 5268a3805..000000000 Binary files a/Assets/Female3DCG/Cloth/DressFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/DressFur_Large_Fur.png b/Assets/Female3DCG/Cloth/DressFur_Large_Fur.png deleted file mode 100644 index 71df548f7..000000000 Binary files a/Assets/Female3DCG/Cloth/DressFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/DressFur_Normal_Fabric.png b/Assets/Female3DCG/Cloth/DressFur_Normal_Fabric.png deleted file mode 100644 index 70d2aa528..000000000 Binary files a/Assets/Female3DCG/Cloth/DressFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/DressFur_Normal_Fur.png b/Assets/Female3DCG/Cloth/DressFur_Normal_Fur.png deleted file mode 100644 index 8f227851d..000000000 Binary files a/Assets/Female3DCG/Cloth/DressFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/DressFur_Small_Fabric.png b/Assets/Female3DCG/Cloth/DressFur_Small_Fabric.png deleted file mode 100644 index 90a4a68e8..000000000 Binary files a/Assets/Female3DCG/Cloth/DressFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/DressFur_Small_Fur.png b/Assets/Female3DCG/Cloth/DressFur_Small_Fur.png deleted file mode 100644 index 0e15ac960..000000000 Binary files a/Assets/Female3DCG/Cloth/DressFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/DressFur_XLarge_Fabric.png b/Assets/Female3DCG/Cloth/DressFur_XLarge_Fabric.png deleted file mode 100644 index 2ced494ac..000000000 Binary files a/Assets/Female3DCG/Cloth/DressFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/DressFur_XLarge_Fur.png b/Assets/Female3DCG/Cloth/DressFur_XLarge_Fur.png deleted file mode 100644 index f8ff38d5d..000000000 Binary files a/Assets/Female3DCG/Cloth/DressFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FlowerDress_Large_Dress.png b/Assets/Female3DCG/Cloth/FlowerDress_Large_Dress.png deleted file mode 100644 index 4df6a73a7..000000000 Binary files a/Assets/Female3DCG/Cloth/FlowerDress_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FlowerDress_Large_Flower.png b/Assets/Female3DCG/Cloth/FlowerDress_Large_Flower.png deleted file mode 100644 index 0fe57a834..000000000 Binary files a/Assets/Female3DCG/Cloth/FlowerDress_Large_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FlowerDress_Normal_Dress.png b/Assets/Female3DCG/Cloth/FlowerDress_Normal_Dress.png deleted file mode 100644 index 817c27756..000000000 Binary files a/Assets/Female3DCG/Cloth/FlowerDress_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FlowerDress_Normal_Flower.png b/Assets/Female3DCG/Cloth/FlowerDress_Normal_Flower.png deleted file mode 100644 index f9a431623..000000000 Binary files a/Assets/Female3DCG/Cloth/FlowerDress_Normal_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FlowerDress_Small_Dress.png b/Assets/Female3DCG/Cloth/FlowerDress_Small_Dress.png deleted file mode 100644 index 154749286..000000000 Binary files a/Assets/Female3DCG/Cloth/FlowerDress_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FlowerDress_Small_Flower.png b/Assets/Female3DCG/Cloth/FlowerDress_Small_Flower.png deleted file mode 100644 index c7d872ad6..000000000 Binary files a/Assets/Female3DCG/Cloth/FlowerDress_Small_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FlowerDress_XLarge_Dress.png b/Assets/Female3DCG/Cloth/FlowerDress_XLarge_Dress.png deleted file mode 100644 index 628e8f268..000000000 Binary files a/Assets/Female3DCG/Cloth/FlowerDress_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FlowerDress_XLarge_Flower.png b/Assets/Female3DCG/Cloth/FlowerDress_XLarge_Flower.png deleted file mode 100644 index 5686a3cca..000000000 Binary files a/Assets/Female3DCG/Cloth/FlowerDress_XLarge_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FurCoat_Lower.png b/Assets/Female3DCG/Cloth/FurCoat_Lower.png deleted file mode 100644 index 5a0a7a753..000000000 Binary files a/Assets/Female3DCG/Cloth/FurCoat_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FurCoat_Upper.png b/Assets/Female3DCG/Cloth/FurCoat_Upper.png deleted file mode 100644 index 5d9c8a61f..000000000 Binary files a/Assets/Female3DCG/Cloth/FurCoat_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_Large_BottomFur.png b/Assets/Female3DCG/Cloth/FuzzyDress_Large_BottomFur.png deleted file mode 100644 index 611099a1e..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_Large_BottomFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_Large_Dress.png b/Assets/Female3DCG/Cloth/FuzzyDress_Large_Dress.png deleted file mode 100644 index 494800410..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_Large_TopFur.png b/Assets/Female3DCG/Cloth/FuzzyDress_Large_TopFur.png deleted file mode 100644 index 7aad8711b..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_Large_TopFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_Normal_BottomFur.png b/Assets/Female3DCG/Cloth/FuzzyDress_Normal_BottomFur.png deleted file mode 100644 index 0ca3b5b0b..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_Normal_BottomFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_Normal_Dress.png b/Assets/Female3DCG/Cloth/FuzzyDress_Normal_Dress.png deleted file mode 100644 index f389b992c..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_Normal_TopFur.png b/Assets/Female3DCG/Cloth/FuzzyDress_Normal_TopFur.png deleted file mode 100644 index d44ee5797..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_Normal_TopFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_Small_BottomFur.png b/Assets/Female3DCG/Cloth/FuzzyDress_Small_BottomFur.png deleted file mode 100644 index 731a10d39..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_Small_BottomFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_Small_Dress.png b/Assets/Female3DCG/Cloth/FuzzyDress_Small_Dress.png deleted file mode 100644 index 27987ddb6..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_Small_TopFur.png b/Assets/Female3DCG/Cloth/FuzzyDress_Small_TopFur.png deleted file mode 100644 index 7b5979bab..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_Small_TopFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_XLarge_BottomFur.png b/Assets/Female3DCG/Cloth/FuzzyDress_XLarge_BottomFur.png deleted file mode 100644 index 611099a1e..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_XLarge_BottomFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_XLarge_Dress.png b/Assets/Female3DCG/Cloth/FuzzyDress_XLarge_Dress.png deleted file mode 100644 index 1db6a6aef..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/FuzzyDress_XLarge_TopFur.png b/Assets/Female3DCG/Cloth/FuzzyDress_XLarge_TopFur.png deleted file mode 100644 index 3fa347348..000000000 Binary files a/Assets/Female3DCG/Cloth/FuzzyDress_XLarge_TopFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown1_Large.png b/Assets/Female3DCG/Cloth/Gown1_Large.png deleted file mode 100644 index 0e6b63846..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown1_Normal.png b/Assets/Female3DCG/Cloth/Gown1_Normal.png deleted file mode 100644 index 45eba4f7f..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown1_Small.png b/Assets/Female3DCG/Cloth/Gown1_Small.png deleted file mode 100644 index fc1394d6e..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown1_XLarge.png b/Assets/Female3DCG/Cloth/Gown1_XLarge.png deleted file mode 100644 index 7c76f2dd5..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown2Top_Large.png b/Assets/Female3DCG/Cloth/Gown2Top_Large.png deleted file mode 100644 index 4c77eef61..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown2Top_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown2Top_Normal.png b/Assets/Female3DCG/Cloth/Gown2Top_Normal.png deleted file mode 100644 index cd82ce890..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown2Top_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown2Top_Small.png b/Assets/Female3DCG/Cloth/Gown2Top_Small.png deleted file mode 100644 index 15fd89fa1..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown2Top_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown2Top_XLarge.png b/Assets/Female3DCG/Cloth/Gown2Top_XLarge.png deleted file mode 100644 index 1744f14b3..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown2Top_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown3_Large.png b/Assets/Female3DCG/Cloth/Gown3_Large.png deleted file mode 100644 index e913050cc..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown3_Normal.png b/Assets/Female3DCG/Cloth/Gown3_Normal.png deleted file mode 100644 index 1375dc4d2..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown3_Small.png b/Assets/Female3DCG/Cloth/Gown3_Small.png deleted file mode 100644 index d50ebbafc..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Gown3_XLarge.png b/Assets/Female3DCG/Cloth/Gown3_XLarge.png deleted file mode 100644 index f7b0cabbe..000000000 Binary files a/Assets/Female3DCG/Cloth/Gown3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_BackSkirt.png b/Assets/Female3DCG/Cloth/GrandMage_BackSkirt.png deleted file mode 100644 index e6ff11224..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_BackSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Large_Base.png b/Assets/Female3DCG/Cloth/GrandMage_Large_Base.png deleted file mode 100644 index 2230c85f6..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Large_Belt.png b/Assets/Female3DCG/Cloth/GrandMage_Large_Belt.png deleted file mode 100644 index f646c1e1e..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Large_Buckle.png b/Assets/Female3DCG/Cloth/GrandMage_Large_Buckle.png deleted file mode 100644 index 687a8328a..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Large_Trim.png b/Assets/Female3DCG/Cloth/GrandMage_Large_Trim.png deleted file mode 100644 index 59406b5ee..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Normal_Base.png b/Assets/Female3DCG/Cloth/GrandMage_Normal_Base.png deleted file mode 100644 index 41fbc52e0..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Normal_Belt.png b/Assets/Female3DCG/Cloth/GrandMage_Normal_Belt.png deleted file mode 100644 index fd4ad0e55..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Normal_Buckle.png b/Assets/Female3DCG/Cloth/GrandMage_Normal_Buckle.png deleted file mode 100644 index ea759d0e4..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Normal_Trim.png b/Assets/Female3DCG/Cloth/GrandMage_Normal_Trim.png deleted file mode 100644 index fde4ed0ef..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Small_Base.png b/Assets/Female3DCG/Cloth/GrandMage_Small_Base.png deleted file mode 100644 index 75b7dad17..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Small_Belt.png b/Assets/Female3DCG/Cloth/GrandMage_Small_Belt.png deleted file mode 100644 index 5da09b4e8..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Small_Buckle.png b/Assets/Female3DCG/Cloth/GrandMage_Small_Buckle.png deleted file mode 100644 index cf8d866a4..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_Small_Trim.png b/Assets/Female3DCG/Cloth/GrandMage_Small_Trim.png deleted file mode 100644 index 7202f3049..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_XLarge_Base.png b/Assets/Female3DCG/Cloth/GrandMage_XLarge_Base.png deleted file mode 100644 index 02bc39788..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_XLarge_Belt.png b/Assets/Female3DCG/Cloth/GrandMage_XLarge_Belt.png deleted file mode 100644 index e5c7d3b1e..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/GrandMage_XLarge_Buckle.png deleted file mode 100644 index 6e136ae9e..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/GrandMage_XLarge_Trim.png b/Assets/Female3DCG/Cloth/GrandMage_XLarge_Trim.png deleted file mode 100644 index 7c3348e66..000000000 Binary files a/Assets/Female3DCG/Cloth/GrandMage_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Large_Jacket.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Large_Jacket.png deleted file mode 100644 index dbd3a2563..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Large_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Large_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Large_Shirt.png deleted file mode 100644 index f82170360..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Large_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Large_Trim.png deleted file mode 100644 index 38ee86fec..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Normal_Jacket.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Normal_Jacket.png deleted file mode 100644 index b812d0a1e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Normal_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Normal_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Normal_Shirt.png deleted file mode 100644 index 561b6d084..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Normal_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Normal_Trim.png deleted file mode 100644 index 2745b50f9..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Small_Jacket.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Small_Jacket.png deleted file mode 100644 index e912cd89a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Small_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Small_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Small_Shirt.png deleted file mode 100644 index 7fd546b6d..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Small_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Small_Trim.png deleted file mode 100644 index 20dde1d6a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_XLarge_Jacket.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_XLarge_Jacket.png deleted file mode 100644 index fa78cf9ba..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_XLarge_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_XLarge_Shirt.png deleted file mode 100644 index d10b7da69..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_XLarge_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_XLarge_Trim.png deleted file mode 100644 index 427b1a465..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdmiralTop_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Large_Dress.png deleted file mode 100644 index af9a78413..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Large_Sash.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Large_Sash.png deleted file mode 100644 index ab9ffa546..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Large_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Large_Trim.png deleted file mode 100644 index dc6901f81..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Normal_Dress.png deleted file mode 100644 index a955f36e0..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Normal_Sash.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Normal_Sash.png deleted file mode 100644 index 36bc25134..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Normal_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Normal_Trim.png deleted file mode 100644 index 93fe26575..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Small_Dress.png deleted file mode 100644 index 8270f28b8..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Small_Sash.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Small_Sash.png deleted file mode 100644 index 39969c18a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Small_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Small_Trim.png deleted file mode 100644 index deb22290f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_XLarge_Dress.png deleted file mode 100644 index 79643246e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_XLarge_Sash.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_XLarge_Sash.png deleted file mode 100644 index ba305434a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_XLarge_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_XLarge_Trim.png deleted file mode 100644 index 4a170169a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Large_Bow.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Large_Bow.png deleted file mode 100644 index 89b455864..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Large_Dress.png deleted file mode 100644 index 9cb9125fb..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Large_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Large_Lace.png deleted file mode 100644 index 8df691dcb..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Normal_Bow.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Normal_Bow.png deleted file mode 100644 index 48d61e8f7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Normal_Dress.png deleted file mode 100644 index 7176bf9ec..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Normal_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Normal_Lace.png deleted file mode 100644 index 3082eea69..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Small_Bow.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Small_Bow.png deleted file mode 100644 index daecf54cc..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Small_Dress.png deleted file mode 100644 index 6408538ef..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Small_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Small_Lace.png deleted file mode 100644 index e21c00424..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_XLarge_Bow.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_XLarge_Bow.png deleted file mode 100644 index f6a0daea6..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_XLarge_Dress.png deleted file mode 100644 index 998cc6ff7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_XLarge_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_XLarge_Lace.png deleted file mode 100644 index 9de6626a4..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress2_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Large_Collar.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Large_Collar.png deleted file mode 100644 index b60054d59..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Large_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Large_Dress.png deleted file mode 100644 index 02e282029..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Normal_Collar.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Normal_Collar.png deleted file mode 100644 index b60054d59..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Normal_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Normal_Dress.png deleted file mode 100644 index 237567707..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Small_Collar.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Small_Collar.png deleted file mode 100644 index b60054d59..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Small_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Small_Dress.png deleted file mode 100644 index d9e7dc8d2..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_XLarge_Collar.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_XLarge_Collar.png deleted file mode 100644 index b60054d59..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_XLarge_Dress.png deleted file mode 100644 index eec194217..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress3_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_Large.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_Large.png deleted file mode 100644 index 9b4500338..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_Normal.png deleted file mode 100644 index d4ee5ae16..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_Small.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_Small.png deleted file mode 100644 index 00bb0f464..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_XLarge.png deleted file mode 100644 index de9bd8014..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/AdultBabyDress4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Large_Dress.png deleted file mode 100644 index f74b482fe..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Large_Trim.png deleted file mode 100644 index 4b00c20e3..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Normal_Dress.png deleted file mode 100644 index d54975ab4..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Normal_Trim.png deleted file mode 100644 index 4b00c20e3..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Small_Dress.png deleted file mode 100644 index f5743346d..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Small_Trim.png deleted file mode 100644 index 4b00c20e3..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_XLarge_Dress.png deleted file mode 100644 index 1f8179676..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_XLarge_Trim.png deleted file mode 100644 index 4b00c20e3..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BabydollDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Blouse1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/Blouse1_Large.png deleted file mode 100644 index 114416273..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Blouse1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Blouse1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/Blouse1_Normal.png deleted file mode 100644 index a7f15d340..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Blouse1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Blouse1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/Blouse1_Small.png deleted file mode 100644 index f79192aa0..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Blouse1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Blouse1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/Blouse1_XLarge.png deleted file mode 100644 index 1938e5879..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Blouse1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_Large.png deleted file mode 100644 index 40aaee6f4..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_Normal.png deleted file mode 100644 index 5db98386c..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_Small.png deleted file mode 100644 index f1120d958..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_XLarge.png deleted file mode 100644 index f69c9c024..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BodyTowel1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_Large.png deleted file mode 100644 index 035810835..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_Normal.png deleted file mode 100644 index f2fc7366d..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_Small.png deleted file mode 100644 index e205d60dc..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_XLarge.png deleted file mode 100644 index aa1649d4b..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_Large.png b/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_Large.png deleted file mode 100644 index 28a663669..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_Normal.png deleted file mode 100644 index 11c254670..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_Small.png b/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_Small.png deleted file mode 100644 index ead9a1e5b..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_XLarge.png deleted file mode 100644 index 17faf339e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageBustier2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_Large.png deleted file mode 100644 index cd6de742f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_Normal.png deleted file mode 100644 index d46e516d7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_Small.png deleted file mode 100644 index 77c63e2a6..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_XLarge.png deleted file mode 100644 index b8dae61ac..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_Large.png b/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_Large.png deleted file mode 100644 index f9b5c385f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_Normal.png deleted file mode 100644 index 69d9f3554..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_Small.png b/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_Small.png deleted file mode 100644 index 3c2d7b255..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_XLarge.png deleted file mode 100644 index 968edd021..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BondageDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_Large.png deleted file mode 100644 index 91b2faa9a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_Normal.png deleted file mode 100644 index 3dae89968..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_Small.png deleted file mode 100644 index edbc5603d..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_XLarge.png deleted file mode 100644 index b6d55e293..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/BridesmaidDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_Large.png deleted file mode 100644 index 78a692c4a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_Normal.png deleted file mode 100644 index 69b4dff78..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_Small.png deleted file mode 100644 index cafcd309a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_XLarge.png deleted file mode 100644 index 6f4a37fb9..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_LargePink_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_LargePink_Dress.png deleted file mode 100644 index d543a54ce..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_LargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_LargePurple_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_LargePurple_Dress.png deleted file mode 100644 index fd933b6db..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_LargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Large_Dress.png deleted file mode 100644 index 039d5df22..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Large_Edges.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Large_Edges.png deleted file mode 100644 index 22ef79a7e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Large_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_NormalPink_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_NormalPink_Dress.png deleted file mode 100644 index ed0958098..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_NormalPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_NormalPurple_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_NormalPurple_Dress.png deleted file mode 100644 index 962589d4c..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_NormalPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Normal_Dress.png deleted file mode 100644 index 146f3d08f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Normal_Edges.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Normal_Edges.png deleted file mode 100644 index d904330cc..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Normal_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_SmallPink_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_SmallPink_Dress.png deleted file mode 100644 index 1deed66ef..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_SmallPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_SmallPurple_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_SmallPurple_Dress.png deleted file mode 100644 index 712d10e31..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_SmallPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Small_Dress.png deleted file mode 100644 index c3d3849de..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Small_Edges.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Small_Edges.png deleted file mode 100644 index fd8019406..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_Small_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLargePink_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLargePink_Dress.png deleted file mode 100644 index d543a54ce..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLargePurple_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLargePurple_Dress.png deleted file mode 100644 index b4627c646..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLarge_Dress.png deleted file mode 100644 index 230428292..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLarge_Edges.png b/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLarge_Edges.png deleted file mode 100644 index 2ef3a29ad..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ChineseDress2_XLarge_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Large_Shirt.png deleted file mode 100644 index fd2545102..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Large_Tie.png b/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Large_Tie.png deleted file mode 100644 index f0b8839e1..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Large_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Normal_Shirt.png deleted file mode 100644 index cc852e6f5..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Normal_Tie.png b/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Normal_Tie.png deleted file mode 100644 index 1535ae20a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Normal_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Small_Shirt.png deleted file mode 100644 index 41777ceb4..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Small_Tie.png b/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Small_Tie.png deleted file mode 100644 index 5a1422d71..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_Small_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_XLarge_Shirt.png deleted file mode 100644 index 60f620873..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_XLarge_Tie.png b/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_XLarge_Tie.png deleted file mode 100644 index 301dacad0..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CollegeOutfit1_XLarge_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_Large.png b/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_Large.png deleted file mode 100644 index 3a07ccddd..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_Normal.png deleted file mode 100644 index ff87f01e1..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_Small.png b/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_Small.png deleted file mode 100644 index 2c6f6c0a0..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_XLarge.png deleted file mode 100644 index e2a27a3c7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ComfyTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Large_Corset.png b/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Large_Corset.png deleted file mode 100644 index abd30e77a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Large_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Large_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Large_Shirt.png deleted file mode 100644 index 7f4dc50d4..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Normal_Corset.png b/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Normal_Corset.png deleted file mode 100644 index 140037e3e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Normal_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Normal_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Normal_Shirt.png deleted file mode 100644 index 97f4e04d3..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Small_Corset.png b/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Small_Corset.png deleted file mode 100644 index 140037e3e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Small_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Small_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Small_Shirt.png deleted file mode 100644 index 97f4e04d3..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_XLarge_Corset.png b/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_XLarge_Corset.png deleted file mode 100644 index 6fd83eee2..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_XLarge_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_XLarge_Shirt.png deleted file mode 100644 index 8839e33ff..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CorsetShirt_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Large_Blouse.png b/Assets/Female3DCG/Cloth/Hogtied/CropTop_Large_Blouse.png deleted file mode 100644 index 1033bc803..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Large_Blouse.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Large_Design.png b/Assets/Female3DCG/Cloth/Hogtied/CropTop_Large_Design.png deleted file mode 100644 index 098bc6573..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Large_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Normal_Blouse.png b/Assets/Female3DCG/Cloth/Hogtied/CropTop_Normal_Blouse.png deleted file mode 100644 index 4ef7bb538..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Normal_Blouse.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Normal_Design.png b/Assets/Female3DCG/Cloth/Hogtied/CropTop_Normal_Design.png deleted file mode 100644 index 5f38d5c02..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Normal_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Small_Blouse.png b/Assets/Female3DCG/Cloth/Hogtied/CropTop_Small_Blouse.png deleted file mode 100644 index 31c39bde4..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Small_Blouse.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Small_Design.png b/Assets/Female3DCG/Cloth/Hogtied/CropTop_Small_Design.png deleted file mode 100644 index 16cb3d27f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CropTop_Small_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CropTop_XLarge_Blouse.png b/Assets/Female3DCG/Cloth/Hogtied/CropTop_XLarge_Blouse.png deleted file mode 100644 index 905be3ef0..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CropTop_XLarge_Blouse.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/CropTop_XLarge_Design.png b/Assets/Female3DCG/Cloth/Hogtied/CropTop_XLarge_Design.png deleted file mode 100644 index eb5c37649..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/CropTop_XLarge_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Dress2_Large.png b/Assets/Female3DCG/Cloth/Hogtied/Dress2_Large.png deleted file mode 100644 index e650fdc6a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Dress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Dress2_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/Dress2_Normal.png deleted file mode 100644 index cc727c66e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Dress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Dress2_Small.png b/Assets/Female3DCG/Cloth/Hogtied/Dress2_Small.png deleted file mode 100644 index 7efdb70df..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Dress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Dress2_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/Dress2_XLarge.png deleted file mode 100644 index a952a2d84..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Dress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Dress3_Large.png b/Assets/Female3DCG/Cloth/Hogtied/Dress3_Large.png deleted file mode 100644 index e72e4ae94..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Dress3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Dress3_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/Dress3_Normal.png deleted file mode 100644 index d2ca15087..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Dress3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Dress3_Small.png b/Assets/Female3DCG/Cloth/Hogtied/Dress3_Small.png deleted file mode 100644 index 0b8cd2b90..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Dress3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Dress3_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/Dress3_XLarge.png deleted file mode 100644 index 98bd7d8bb..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Dress3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Large_Fabric.png b/Assets/Female3DCG/Cloth/Hogtied/DressFur_Large_Fabric.png deleted file mode 100644 index dc19630e5..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Large_Fur.png b/Assets/Female3DCG/Cloth/Hogtied/DressFur_Large_Fur.png deleted file mode 100644 index 220c23c1d..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Normal_Fabric.png b/Assets/Female3DCG/Cloth/Hogtied/DressFur_Normal_Fabric.png deleted file mode 100644 index 9677c09cc..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Normal_Fur.png b/Assets/Female3DCG/Cloth/Hogtied/DressFur_Normal_Fur.png deleted file mode 100644 index 9eefece8b..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Small_Fabric.png b/Assets/Female3DCG/Cloth/Hogtied/DressFur_Small_Fabric.png deleted file mode 100644 index eb1399b8c..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Small_Fur.png b/Assets/Female3DCG/Cloth/Hogtied/DressFur_Small_Fur.png deleted file mode 100644 index 9f5c44556..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/DressFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/DressFur_XLarge_Fabric.png b/Assets/Female3DCG/Cloth/Hogtied/DressFur_XLarge_Fabric.png deleted file mode 100644 index d0923613a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/DressFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/DressFur_XLarge_Fur.png b/Assets/Female3DCG/Cloth/Hogtied/DressFur_XLarge_Fur.png deleted file mode 100644 index 5885697d6..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/DressFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Large_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Large_Dress.png deleted file mode 100644 index bc32ae6fd..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Large_Flower.png b/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Large_Flower.png deleted file mode 100644 index 69806137a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Large_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Normal_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Normal_Dress.png deleted file mode 100644 index 2fb4c555c..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Normal_Flower.png b/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Normal_Flower.png deleted file mode 100644 index 69b70d647..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Normal_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Small_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Small_Dress.png deleted file mode 100644 index afbd00c72..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Small_Flower.png b/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Small_Flower.png deleted file mode 100644 index f1aa88307..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_Small_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_XLarge_Dress.png deleted file mode 100644 index e43a3303f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/FlowerDress_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/FurCoat_Upper.png b/Assets/Female3DCG/Cloth/Hogtied/FurCoat_Upper.png deleted file mode 100644 index b6f3ef0ba..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/FurCoat_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/Gown1_Large.png deleted file mode 100644 index 89c4a8856..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/Gown1_Normal.png deleted file mode 100644 index 772d60131..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/Gown1_Small.png deleted file mode 100644 index 1cbb4a8fd..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/Gown1_XLarge.png deleted file mode 100644 index de9a11209..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_Large.png b/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_Large.png deleted file mode 100644 index 1322afca8..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_Normal.png deleted file mode 100644 index 0fedbe66b..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_Small.png b/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_Small.png deleted file mode 100644 index 2daffd726..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_XLarge.png deleted file mode 100644 index b253f6a86..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown2Top_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown3_Large.png b/Assets/Female3DCG/Cloth/Hogtied/Gown3_Large.png deleted file mode 100644 index b0a8acb69..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown3_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/Gown3_Normal.png deleted file mode 100644 index 76d9a2f06..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown3_Small.png b/Assets/Female3DCG/Cloth/Hogtied/Gown3_Small.png deleted file mode 100644 index 93ff87388..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Gown3_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/Gown3_XLarge.png deleted file mode 100644 index cf0463d4b..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Gown3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Large_Base.png b/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Large_Base.png deleted file mode 100644 index 13bcfa73a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Large_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Large_Trim.png deleted file mode 100644 index 780b0e7fa..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Normal_Base.png b/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Normal_Base.png deleted file mode 100644 index 87fa0bcfd..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Normal_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Normal_Trim.png deleted file mode 100644 index 6f6950414..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Small_Base.png b/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Small_Base.png deleted file mode 100644 index 87fa0bcfd..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Small_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Small_Trim.png deleted file mode 100644 index 9327abf9f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_XLarge_Base.png b/Assets/Female3DCG/Cloth/Hogtied/GrandMage_XLarge_Base.png deleted file mode 100644 index 9e5d1b041..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_XLarge_Trim.png b/Assets/Female3DCG/Cloth/Hogtied/GrandMage_XLarge_Trim.png deleted file mode 100644 index 2ae4345c0..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/GrandMage_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Jacket_Base.png b/Assets/Female3DCG/Cloth/Hogtied/Jacket_Base.png deleted file mode 100644 index 1e3ea7387..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Jacket_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_Large.png b/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_Large.png deleted file mode 100644 index 90d866bbe..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_Normal.png deleted file mode 100644 index bb83b0ff7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_Small.png b/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_Small.png deleted file mode 100644 index 2a866a69b..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_XLarge.png deleted file mode 100644 index bc62ff452..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LaceBabydoll_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_Large.png b/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_Large.png deleted file mode 100644 index 8c1cbb7e1..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_LargeNonLaced.png b/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_LargeNonLaced.png deleted file mode 100644 index 5e1ed7c75..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_LargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_Normal.png deleted file mode 100644 index 4e35529a7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_NormalNonLaced.png b/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_NormalNonLaced.png deleted file mode 100644 index b924b2953..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_NormalNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_Small.png b/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_Small.png deleted file mode 100644 index a2d1098de..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_SmallNonLaced.png b/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_SmallNonLaced.png deleted file mode 100644 index 569402afd..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_SmallNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_XLarge.png deleted file mode 100644 index 7571176c6..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_XLargeNonLaced.png b/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_XLargeNonLaced.png deleted file mode 100644 index 73fbe3d87..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexLacedSuit_XLargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexTop_Large.png b/Assets/Female3DCG/Cloth/Hogtied/LatexTop_Large.png deleted file mode 100644 index aecd75d3f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexTop_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/LatexTop_Normal.png deleted file mode 100644 index 4d8369041..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexTop_Small.png b/Assets/Female3DCG/Cloth/Hogtied/LatexTop_Small.png deleted file mode 100644 index afbeb7422..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LatexTop_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/LatexTop_XLarge.png deleted file mode 100644 index 1b024c320..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LatexTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Large_Base.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_Large_Base.png deleted file mode 100644 index 3964e0656..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Large_Design.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_Large_Design.png deleted file mode 100644 index 35ab60ca7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Large_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Large_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_Large_Lace.png deleted file mode 100644 index c58498172..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Normal_Base.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_Normal_Base.png deleted file mode 100644 index b869d5e61..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Normal_Design.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_Normal_Design.png deleted file mode 100644 index 0bde4fc6d..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Normal_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Normal_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_Normal_Lace.png deleted file mode 100644 index d63b1bf8a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Small_Base.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_Small_Base.png deleted file mode 100644 index f95af3900..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Small_Design.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_Small_Design.png deleted file mode 100644 index 12df9a60e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Small_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Small_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_Small_Lace.png deleted file mode 100644 index 12b9ec1d1..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_XLarge_Base.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_XLarge_Base.png deleted file mode 100644 index fdde1ec5d..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_XLarge_Design.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_XLarge_Design.png deleted file mode 100644 index 86697f8fe..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_XLarge_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Laurel_XLarge_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/Laurel_XLarge_Lace.png deleted file mode 100644 index d5f208de4..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Laurel_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_Large.png b/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_Large.png deleted file mode 100644 index 25bb83f08..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_Normal.png deleted file mode 100644 index 4ee7dd93f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_Small.png b/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_Small.png deleted file mode 100644 index ff98f2f19..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_XLarge.png deleted file mode 100644 index a6313bd5b..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LeatherBolero_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_Large.png b/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_Large.png deleted file mode 100644 index 23597eccb..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_Normal.png deleted file mode 100644 index 0c6f8f5ae..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_Small.png b/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_Small.png deleted file mode 100644 index 0c6f8f5ae..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_XLarge.png deleted file mode 100644 index 4edd48f3e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/LeatherCropTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_Large.png deleted file mode 100644 index 95500b828..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_Normal.png deleted file mode 100644 index e3715800e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_Small.png deleted file mode 100644 index a07267306..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_XLarge.png deleted file mode 100644 index 57a0a5904..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidApron1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Large_Apron.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Large_Apron.png deleted file mode 100644 index 01f1c7072..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Large_Dress.png deleted file mode 100644 index ebf4442ad..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Large_Frills.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Large_Frills.png deleted file mode 100644 index 4df83c934..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Normal_Apron.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Normal_Apron.png deleted file mode 100644 index 5f592d9d7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Normal_Dress.png deleted file mode 100644 index ee6c274f9..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Normal_Frills.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Normal_Frills.png deleted file mode 100644 index 6ffc86f46..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Small_Apron.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Small_Apron.png deleted file mode 100644 index c83c8bb98..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Small_Dress.png deleted file mode 100644 index 66fd7b53d..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Small_Frills.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Small_Frills.png deleted file mode 100644 index 2f55ccfb7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_XLarge_Apron.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_XLarge_Apron.png deleted file mode 100644 index 8ecf467c9..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_XLarge_Dress.png deleted file mode 100644 index 8477b53ff..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_XLarge_Frills.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_XLarge_Frills.png deleted file mode 100644 index 82d894cbb..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit1_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Large_Apron.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Large_Apron.png deleted file mode 100644 index e255330d7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Large_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Large_Dress.png deleted file mode 100644 index 0fc426e96..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Large_Frills.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Large_Frills.png deleted file mode 100644 index 8f8aea4ec..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Normal_Apron.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Normal_Apron.png deleted file mode 100644 index 208d54f6f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Normal_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Normal_Dress.png deleted file mode 100644 index 6c45459f0..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Normal_Frills.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Normal_Frills.png deleted file mode 100644 index 0f4acd927..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Small_Apron.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Small_Apron.png deleted file mode 100644 index 6127e6665..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Small_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Small_Dress.png deleted file mode 100644 index b5fd9bf66..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Small_Frills.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Small_Frills.png deleted file mode 100644 index 8a9f29104..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_XLarge_Apron.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_XLarge_Apron.png deleted file mode 100644 index 217d7e390..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_XLarge_Dress.png deleted file mode 100644 index 533d404e2..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_XLarge_Frills.png b/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_XLarge_Frills.png deleted file mode 100644 index c88e633f8..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MaidOutfit2_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MistressTop_Large.png b/Assets/Female3DCG/Cloth/Hogtied/MistressTop_Large.png deleted file mode 100644 index 7b5f2c659..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MistressTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MistressTop_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/MistressTop_Normal.png deleted file mode 100644 index 6fcc3b29b..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MistressTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MistressTop_Small.png b/Assets/Female3DCG/Cloth/Hogtied/MistressTop_Small.png deleted file mode 100644 index 44dacaa12..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MistressTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/MistressTop_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/MistressTop_XLarge.png deleted file mode 100644 index 2e57269b2..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/MistressTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_Large.png b/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_Large.png deleted file mode 100644 index 727d10fbb..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_Normal.png deleted file mode 100644 index ff792ac90..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_Small.png b/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_Small.png deleted file mode 100644 index a6aaf68a8..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_XLarge.png deleted file mode 100644 index 7457cfe97..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/NurseUniform_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Robe1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/Robe1_Large.png deleted file mode 100644 index 15918668e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Robe1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Robe1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/Robe1_Normal.png deleted file mode 100644 index 570bfcbfb..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Robe1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Robe1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/Robe1_Small.png deleted file mode 100644 index 128793038..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Robe1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Robe1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/Robe1_XLarge.png deleted file mode 100644 index e85d49278..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Robe1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Large_Design.png b/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Large_Design.png deleted file mode 100644 index 581798ecc..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Large_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Large_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Large_Lace.png deleted file mode 100644 index 7f802ff48..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Normal_Design.png b/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Normal_Design.png deleted file mode 100644 index 9966979b9..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Normal_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Normal_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Normal_Lace.png deleted file mode 100644 index b0b4c10ce..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Small_Design.png b/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Small_Design.png deleted file mode 100644 index b3accd957..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Small_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Small_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Small_Lace.png deleted file mode 100644 index c42ed3a55..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_XLarge_Design.png b/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_XLarge_Design.png deleted file mode 100644 index 06221a08a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_XLarge_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_XLarge_Lace.png b/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_XLarge_Lace.png deleted file mode 100644 index f19d60402..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SeethroughTop_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_Large.png b/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_Large.png deleted file mode 100644 index 7093e4f20..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_Normal.png deleted file mode 100644 index acb451303..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_Small.png b/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_Small.png deleted file mode 100644 index 5c2848123..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_XLarge.png deleted file mode 100644 index 5fb00e3fe..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/ShoulderlessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_Large.png b/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_Large.png deleted file mode 100644 index bf72aa89a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_Normal.png deleted file mode 100644 index a7e329367..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_Small.png b/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_Small.png deleted file mode 100644 index e3801a72e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_XLarge.png deleted file mode 100644 index e106cb064..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SleevelessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Large_Bow.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Large_Bow.png deleted file mode 100644 index d2d42b236..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Large_Dress.png deleted file mode 100644 index 6ba617135..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Large_Shirt.png deleted file mode 100644 index e4bfc4602..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Normal_Bow.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Normal_Bow.png deleted file mode 100644 index d2d42b236..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Normal_Dress.png deleted file mode 100644 index ca3591073..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Normal_Shirt.png deleted file mode 100644 index a56d5c306..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Small_Bow.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Small_Bow.png deleted file mode 100644 index d2d42b236..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Small_Dress.png deleted file mode 100644 index fb90f0c8c..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Small_Shirt.png deleted file mode 100644 index 6d3551784..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_XLarge_Bow.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_XLarge_Bow.png deleted file mode 100644 index d2d42b236..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_XLarge_Dress.png deleted file mode 100644 index 139c70e4c..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_XLarge_Shirt.png deleted file mode 100644 index 420fe49f3..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_Large.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_Large.png deleted file mode 100644 index 69476ec34..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_Normal.png deleted file mode 100644 index 694b3d854..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_Small.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_Small.png deleted file mode 100644 index a0bab69a3..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_XLarge.png deleted file mode 100644 index b7d1fb5a5..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Large_Color.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Large_Color.png deleted file mode 100644 index b2f380fd2..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Large_White.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Large_White.png deleted file mode 100644 index ec41adbff..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Normal_Color.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Normal_Color.png deleted file mode 100644 index 96032ec74..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Normal_White.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Normal_White.png deleted file mode 100644 index d80740acc..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Small_Color.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Small_Color.png deleted file mode 100644 index 72fd29305..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Small_White.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Small_White.png deleted file mode 100644 index 5997af3db..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_XLarge_Color.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_XLarge_Color.png deleted file mode 100644 index 6b17589fb..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_XLarge_White.png b/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_XLarge_White.png deleted file mode 100644 index 0d3518da6..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/StudentOutfit3_XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Base.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Base.png deleted file mode 100644 index f111a49f7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer1.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer1.png deleted file mode 100644 index dd1c148d2..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer2.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer2.png deleted file mode 100644 index 5c4aac524..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer3.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer3.png deleted file mode 100644 index 556d2ef7b..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer4.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer4.png deleted file mode 100644 index 6cd046b39..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Base.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Base.png deleted file mode 100644 index 1c912ee5b..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer1.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer1.png deleted file mode 100644 index fb68248d7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer2.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer2.png deleted file mode 100644 index a635b8c49..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer3.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer3.png deleted file mode 100644 index df85fbd1c..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer4.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer4.png deleted file mode 100644 index 82c696cfe..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Base.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Base.png deleted file mode 100644 index 64fabf42f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer1.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer1.png deleted file mode 100644 index a59897c6c..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer2.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer2.png deleted file mode 100644 index ff9b156b6..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer3.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer3.png deleted file mode 100644 index 01e5befdc..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer4.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer4.png deleted file mode 100644 index 8e4a1b652..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Base.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Base.png deleted file mode 100644 index 37ccb7565..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer1.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer1.png deleted file mode 100644 index 306467567..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer2.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer2.png deleted file mode 100644 index 754f9c818..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer3.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer3.png deleted file mode 100644 index cb236fe35..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer4.png b/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer4.png deleted file mode 100644 index 962b5618e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SummerDress_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_Large.png deleted file mode 100644 index 383a79d35..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_Normal.png deleted file mode 100644 index 8e061f192..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_Small.png deleted file mode 100644 index 73f9c6b2c..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_XLarge.png deleted file mode 100644 index 4e9d05ef0..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/SuspenderTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Sweater1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/Sweater1_Large.png deleted file mode 100644 index 4b40194ec..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Sweater1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Sweater1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/Sweater1_Normal.png deleted file mode 100644 index 64d54bb52..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Sweater1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Sweater1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/Sweater1_Small.png deleted file mode 100644 index bde1ee0cf..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Sweater1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Sweater1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/Sweater1_XLarge.png deleted file mode 100644 index 4d83abda2..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Sweater1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt1_Large.png deleted file mode 100644 index 135084728..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt1_Normal.png deleted file mode 100644 index b1d4f8e22..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt1_Small.png deleted file mode 100644 index 9f57639dd..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt1_XLarge.png deleted file mode 100644 index 8f348f6db..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt2BCLogo_Print.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt2BCLogo_Print.png deleted file mode 100644 index 095d62e0f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt2BCLogo_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt2BDSM_Print.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt2BDSM_Print.png deleted file mode 100644 index 543c970c6..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt2BDSM_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt2Gag_Print.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt2Gag_Print.png deleted file mode 100644 index 060bddb63..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt2Gag_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt2Knot_Print.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt2Knot_Print.png deleted file mode 100644 index 7cbe94486..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt2Knot_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt2Rock_Print.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt2Rock_Print.png deleted file mode 100644 index 2a46212e7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt2Rock_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt2Smile_Print.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt2Smile_Print.png deleted file mode 100644 index 756c73aee..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt2Smile_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt2Tick_Print.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt2Tick_Print.png deleted file mode 100644 index d9b5af4f7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt2Tick_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt2_Large_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt2_Large_Shirt.png deleted file mode 100644 index c3c55e9d3..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt2_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt2_Normal_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt2_Normal_Shirt.png deleted file mode 100644 index 378e625e0..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt2_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt2_Small_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt2_Small_Shirt.png deleted file mode 100644 index 8a9a5c99d..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt2_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TShirt2_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/Hogtied/TShirt2_XLarge_Shirt.png deleted file mode 100644 index 07f75de09..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TShirt2_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_Large.png deleted file mode 100644 index 22163cae0..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_Normal.png deleted file mode 100644 index ab4c85d30..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_Small.png deleted file mode 100644 index 5f8c5426b..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_XLarge.png deleted file mode 100644 index e022d110f..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TeacherOutfit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_Large.png deleted file mode 100644 index 8ac095dfa..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_Normal.png deleted file mode 100644 index f43ab361e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_Small.png deleted file mode 100644 index b0f4db98e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_XLarge.png deleted file mode 100644 index f1e06b125..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/TennisShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_Large.png deleted file mode 100644 index bdc635dc9..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_Normal.png deleted file mode 100644 index 28db387d8..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_Small.png deleted file mode 100644 index ac9e63a4a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_XLarge.png deleted file mode 100644 index 356f7c75a..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/VirginKiller1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_Large.png deleted file mode 100644 index 0a9a4667e..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_Normal.png deleted file mode 100644 index 3703d15d9..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_Small.png deleted file mode 100644 index 5dd95d8a7..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_XLarge.png deleted file mode 100644 index b449d8571..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_Large.png deleted file mode 100644 index a93642e7d..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_Normal.png deleted file mode 100644 index 157cc1f35..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_Small.png deleted file mode 100644 index 6e8950767..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_XLarge.png deleted file mode 100644 index 5106cd0ee..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Yukata1_Large.png b/Assets/Female3DCG/Cloth/Hogtied/Yukata1_Large.png deleted file mode 100644 index 511a34d08..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Yukata1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Yukata1_Normal.png b/Assets/Female3DCG/Cloth/Hogtied/Yukata1_Normal.png deleted file mode 100644 index be7824249..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Yukata1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Yukata1_Small.png b/Assets/Female3DCG/Cloth/Hogtied/Yukata1_Small.png deleted file mode 100644 index 975eafd43..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Yukata1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Hogtied/Yukata1_XLarge.png b/Assets/Female3DCG/Cloth/Hogtied/Yukata1_XLarge.png deleted file mode 100644 index 0e3dd99b6..000000000 Binary files a/Assets/Female3DCG/Cloth/Hogtied/Yukata1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Jacket_Base.png b/Assets/Female3DCG/Cloth/Jacket_Base.png deleted file mode 100644 index 279cd8a96..000000000 Binary files a/Assets/Female3DCG/Cloth/Jacket_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Jacket_Hood.png b/Assets/Female3DCG/Cloth/Jacket_Hood.png deleted file mode 100644 index 813381fc5..000000000 Binary files a/Assets/Female3DCG/Cloth/Jacket_Hood.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Kneel/FurCoat_Lower.png b/Assets/Female3DCG/Cloth/Kneel/FurCoat_Lower.png deleted file mode 100644 index 9c887452d..000000000 Binary files a/Assets/Female3DCG/Cloth/Kneel/FurCoat_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_Large.png deleted file mode 100644 index fc0676410..000000000 Binary files a/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_Normal.png deleted file mode 100644 index 5ef772b9f..000000000 Binary files a/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_Small.png deleted file mode 100644 index bcaca19ce..000000000 Binary files a/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_XLarge.png deleted file mode 100644 index c9e54a8e4..000000000 Binary files a/Assets/Female3DCG/Cloth/Kneel/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_Large.png deleted file mode 100644 index d0292633f..000000000 Binary files a/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_Normal.png deleted file mode 100644 index 222bc25f2..000000000 Binary files a/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_Small.png deleted file mode 100644 index 05f01671f..000000000 Binary files a/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_XLarge.png deleted file mode 100644 index b1a551a8a..000000000 Binary files a/Assets/Female3DCG/Cloth/Kneel/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_Large.png b/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_Large.png deleted file mode 100644 index 7b609fe2e..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_Normal.png b/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_Normal.png deleted file mode 100644 index c38f6ed57..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_Small.png b/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_Small.png deleted file mode 100644 index bedd4b166..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_XLarge.png b/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_XLarge.png deleted file mode 100644 index 6a82a8c1c..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BodyTowel1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_Large.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_Large.png deleted file mode 100644 index 4d60463c3..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_Normal.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_Normal.png deleted file mode 100644 index 857335240..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_Small.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_Small.png deleted file mode 100644 index da44b9797..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_XLarge.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_XLarge.png deleted file mode 100644 index 8b00bf184..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier2_Large.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier2_Large.png deleted file mode 100644 index 4c1c5cb3a..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier2_Normal.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier2_Normal.png deleted file mode 100644 index 6ddda67c7..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier2_Small.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier2_Small.png deleted file mode 100644 index 79546443b..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageBustier2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_Large.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_Large.png deleted file mode 100644 index 4538f3bbd..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_Normal.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_Normal.png deleted file mode 100644 index 9ef22bd54..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_Small.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_Small.png deleted file mode 100644 index e9ae8eb25..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_XLarge.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_XLarge.png deleted file mode 100644 index 4692b26de..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_Large.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_Large.png deleted file mode 100644 index 49172e0d9..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_Normal.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_Normal.png deleted file mode 100644 index 32b2cf54d..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_Small.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_Small.png deleted file mode 100644 index e15ada08b..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_XLarge.png b/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_XLarge.png deleted file mode 100644 index 1ebb4f24a..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/BondageDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/FurCoat_Lower.png b/Assets/Female3DCG/Cloth/KneelingSpread/FurCoat_Lower.png deleted file mode 100644 index e93b14845..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/FurCoat_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_Large.png b/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_Large.png deleted file mode 100644 index 87868caf9..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_LargeNonLaced.png b/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_LargeNonLaced.png deleted file mode 100644 index 3d1b96a0e..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_LargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_Normal.png b/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_Normal.png deleted file mode 100644 index 4055e832e..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_NormalNonLaced.png b/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_NormalNonLaced.png deleted file mode 100644 index 09da2eb36..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_NormalNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_Small.png b/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_Small.png deleted file mode 100644 index 06d9c83c2..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_SmallNonLaced.png b/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_SmallNonLaced.png deleted file mode 100644 index dfacdcd78..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_SmallNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_XLarge.png b/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_XLarge.png deleted file mode 100644 index e7cc58bda..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_XLargeNonLaced.png b/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_XLargeNonLaced.png deleted file mode 100644 index 310288b81..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/LatexLacedSuit_XLargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Base.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Base.png deleted file mode 100644 index 2b26c816c..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer1.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer1.png deleted file mode 100644 index 9498e44f7..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer2.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer2.png deleted file mode 100644 index f53739c3d..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer3.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer3.png deleted file mode 100644 index 5762f2d6c..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer4.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer4.png deleted file mode 100644 index 7c640d2ba..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Base.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Base.png deleted file mode 100644 index c60fd7ab1..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer1.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer1.png deleted file mode 100644 index 766b3d758..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer2.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer2.png deleted file mode 100644 index d9a9ae649..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer3.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer3.png deleted file mode 100644 index 74153b387..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer4.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer4.png deleted file mode 100644 index 0d40a7ea5..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Base.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Base.png deleted file mode 100644 index e6617e735..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer1.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer1.png deleted file mode 100644 index d6b4fe9c4..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer2.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer2.png deleted file mode 100644 index a08b559c2..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer3.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer3.png deleted file mode 100644 index 62a71f686..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer4.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer4.png deleted file mode 100644 index 467edbf09..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Base.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Base.png deleted file mode 100644 index 910730845..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer1.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer1.png deleted file mode 100644 index 03749cadf..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer2.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer2.png deleted file mode 100644 index 427566fc6..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer3.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer3.png deleted file mode 100644 index 8e87737b9..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer4.png b/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer4.png deleted file mode 100644 index 5c24d2a81..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SummerDress_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_Large.png b/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_Large.png deleted file mode 100644 index fc76aa559..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_Normal.png b/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_Normal.png deleted file mode 100644 index 30c147551..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_Small.png b/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_Small.png deleted file mode 100644 index 1c410400d..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_XLarge.png b/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_XLarge.png deleted file mode 100644 index 5cb12a1da..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/SuspenderTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_Large.png b/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_Large.png deleted file mode 100644 index 28e202590..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_Normal.png b/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_Normal.png deleted file mode 100644 index d51e529fd..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_Small.png b/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_Small.png deleted file mode 100644 index c16707421..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_XLarge.png b/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_XLarge.png deleted file mode 100644 index 6ee061b92..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/TeacherOutfit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_Large.png deleted file mode 100644 index beda12962..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_Normal.png deleted file mode 100644 index e7d400560..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_Small.png deleted file mode 100644 index e0490fcdc..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_XLarge.png deleted file mode 100644 index 142f57945..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_Large.png deleted file mode 100644 index 6f4e3aa1e..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_Normal.png deleted file mode 100644 index f86d019ef..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_Small.png deleted file mode 100644 index 51c989bb6..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_XLarge.png deleted file mode 100644 index b35bb9ecd..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_Large.png b/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_Large.png deleted file mode 100644 index c9241d916..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_Normal.png b/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_Normal.png deleted file mode 100644 index 75a6009e8..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_Small.png b/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_Small.png deleted file mode 100644 index 344b60f88..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_XLarge.png b/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_XLarge.png deleted file mode 100644 index c9949f3e7..000000000 Binary files a/Assets/Female3DCG/Cloth/KneelingSpread/Yukata1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LaceBabydoll_Large.png b/Assets/Female3DCG/Cloth/LaceBabydoll_Large.png deleted file mode 100644 index e06be1d18..000000000 Binary files a/Assets/Female3DCG/Cloth/LaceBabydoll_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LaceBabydoll_Normal.png b/Assets/Female3DCG/Cloth/LaceBabydoll_Normal.png deleted file mode 100644 index fdda88361..000000000 Binary files a/Assets/Female3DCG/Cloth/LaceBabydoll_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LaceBabydoll_Small.png b/Assets/Female3DCG/Cloth/LaceBabydoll_Small.png deleted file mode 100644 index 5b1efb568..000000000 Binary files a/Assets/Female3DCG/Cloth/LaceBabydoll_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LaceBabydoll_XLarge.png b/Assets/Female3DCG/Cloth/LaceBabydoll_XLarge.png deleted file mode 100644 index 7b6a4ffff..000000000 Binary files a/Assets/Female3DCG/Cloth/LaceBabydoll_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexLacedSuit_Large.png b/Assets/Female3DCG/Cloth/LatexLacedSuit_Large.png deleted file mode 100644 index 15b0ab1f0..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexLacedSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexLacedSuit_LargeNonLaced.png b/Assets/Female3DCG/Cloth/LatexLacedSuit_LargeNonLaced.png deleted file mode 100644 index b6184ca1c..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexLacedSuit_LargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexLacedSuit_Normal.png b/Assets/Female3DCG/Cloth/LatexLacedSuit_Normal.png deleted file mode 100644 index cf34c21d5..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexLacedSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexLacedSuit_NormalNonLaced.png b/Assets/Female3DCG/Cloth/LatexLacedSuit_NormalNonLaced.png deleted file mode 100644 index ac490799a..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexLacedSuit_NormalNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexLacedSuit_Small.png b/Assets/Female3DCG/Cloth/LatexLacedSuit_Small.png deleted file mode 100644 index eb159ead0..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexLacedSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexLacedSuit_SmallNonLaced.png b/Assets/Female3DCG/Cloth/LatexLacedSuit_SmallNonLaced.png deleted file mode 100644 index dd1adc27a..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexLacedSuit_SmallNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexLacedSuit_XLarge.png b/Assets/Female3DCG/Cloth/LatexLacedSuit_XLarge.png deleted file mode 100644 index 37b03bd78..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexLacedSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexLacedSuit_XLargeNonLaced.png b/Assets/Female3DCG/Cloth/LatexLacedSuit_XLargeNonLaced.png deleted file mode 100644 index ced391e92..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexLacedSuit_XLargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexTop_Large.png b/Assets/Female3DCG/Cloth/LatexTop_Large.png deleted file mode 100644 index aecd75d3f..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexTop_Normal.png b/Assets/Female3DCG/Cloth/LatexTop_Normal.png deleted file mode 100644 index 4d8369041..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexTop_Small.png b/Assets/Female3DCG/Cloth/LatexTop_Small.png deleted file mode 100644 index afbeb7422..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LatexTop_XLarge.png b/Assets/Female3DCG/Cloth/LatexTop_XLarge.png deleted file mode 100644 index 1b024c320..000000000 Binary files a/Assets/Female3DCG/Cloth/LatexTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_Large_Base.png b/Assets/Female3DCG/Cloth/Laurel_Large_Base.png deleted file mode 100644 index d4787d508..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_Large_Design.png b/Assets/Female3DCG/Cloth/Laurel_Large_Design.png deleted file mode 100644 index 214eec452..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_Large_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_Large_Lace.png b/Assets/Female3DCG/Cloth/Laurel_Large_Lace.png deleted file mode 100644 index 062d30a4d..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_Normal_Base.png b/Assets/Female3DCG/Cloth/Laurel_Normal_Base.png deleted file mode 100644 index 8f6d458ec..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_Normal_Design.png b/Assets/Female3DCG/Cloth/Laurel_Normal_Design.png deleted file mode 100644 index 68841a9d1..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_Normal_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_Normal_Lace.png b/Assets/Female3DCG/Cloth/Laurel_Normal_Lace.png deleted file mode 100644 index 0881cb756..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_Small_Base.png b/Assets/Female3DCG/Cloth/Laurel_Small_Base.png deleted file mode 100644 index c0d75799a..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_Small_Design.png b/Assets/Female3DCG/Cloth/Laurel_Small_Design.png deleted file mode 100644 index 2a417aa5c..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_Small_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_Small_Lace.png b/Assets/Female3DCG/Cloth/Laurel_Small_Lace.png deleted file mode 100644 index 5afee3a77..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_XLarge_Base.png b/Assets/Female3DCG/Cloth/Laurel_XLarge_Base.png deleted file mode 100644 index 8224ac4b9..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_XLarge_Design.png b/Assets/Female3DCG/Cloth/Laurel_XLarge_Design.png deleted file mode 100644 index c503f5703..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_XLarge_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Laurel_XLarge_Lace.png b/Assets/Female3DCG/Cloth/Laurel_XLarge_Lace.png deleted file mode 100644 index cb0c74c76..000000000 Binary files a/Assets/Female3DCG/Cloth/Laurel_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LeatherBolero_Large.png b/Assets/Female3DCG/Cloth/LeatherBolero_Large.png deleted file mode 100644 index 25bb83f08..000000000 Binary files a/Assets/Female3DCG/Cloth/LeatherBolero_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LeatherBolero_Normal.png b/Assets/Female3DCG/Cloth/LeatherBolero_Normal.png deleted file mode 100644 index 4ee7dd93f..000000000 Binary files a/Assets/Female3DCG/Cloth/LeatherBolero_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LeatherBolero_Small.png b/Assets/Female3DCG/Cloth/LeatherBolero_Small.png deleted file mode 100644 index ff98f2f19..000000000 Binary files a/Assets/Female3DCG/Cloth/LeatherBolero_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LeatherBolero_XLarge.png b/Assets/Female3DCG/Cloth/LeatherBolero_XLarge.png deleted file mode 100644 index a6313bd5b..000000000 Binary files a/Assets/Female3DCG/Cloth/LeatherBolero_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LeatherCropTop_Large.png b/Assets/Female3DCG/Cloth/LeatherCropTop_Large.png deleted file mode 100644 index 648275109..000000000 Binary files a/Assets/Female3DCG/Cloth/LeatherCropTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LeatherCropTop_Normal.png b/Assets/Female3DCG/Cloth/LeatherCropTop_Normal.png deleted file mode 100644 index ad811f348..000000000 Binary files a/Assets/Female3DCG/Cloth/LeatherCropTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LeatherCropTop_Small.png b/Assets/Female3DCG/Cloth/LeatherCropTop_Small.png deleted file mode 100644 index e78f5df94..000000000 Binary files a/Assets/Female3DCG/Cloth/LeatherCropTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LeatherCropTop_XLarge.png b/Assets/Female3DCG/Cloth/LeatherCropTop_XLarge.png deleted file mode 100644 index fb5f1bed6..000000000 Binary files a/Assets/Female3DCG/Cloth/LeatherCropTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LegsClosed/FurCoat_Lower.png b/Assets/Female3DCG/Cloth/LegsClosed/FurCoat_Lower.png deleted file mode 100644 index dee9e2bed..000000000 Binary files a/Assets/Female3DCG/Cloth/LegsClosed/FurCoat_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_Large.png deleted file mode 100644 index cdf451d1c..000000000 Binary files a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_Normal.png deleted file mode 100644 index 7004e14cf..000000000 Binary files a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_Small.png deleted file mode 100644 index 7b86f01c0..000000000 Binary files a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_XLarge.png deleted file mode 100644 index fc1b4c833..000000000 Binary files a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_Large.png deleted file mode 100644 index 76fbcb91c..000000000 Binary files a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_Normal.png deleted file mode 100644 index eef8c0065..000000000 Binary files a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_Small.png deleted file mode 100644 index 1107cc95c..000000000 Binary files a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_XLarge.png deleted file mode 100644 index 42522c924..000000000 Binary files a/Assets/Female3DCG/Cloth/LegsClosed/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidApron1_Large.png b/Assets/Female3DCG/Cloth/MaidApron1_Large.png deleted file mode 100644 index 8dfa0abaf..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidApron1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidApron1_Normal.png b/Assets/Female3DCG/Cloth/MaidApron1_Normal.png deleted file mode 100644 index 5953919bc..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidApron1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidApron1_Small.png b/Assets/Female3DCG/Cloth/MaidApron1_Small.png deleted file mode 100644 index b06a1a34a..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidApron1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidApron1_XLarge.png b/Assets/Female3DCG/Cloth/MaidApron1_XLarge.png deleted file mode 100644 index 5add34302..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidApron1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidApron2_Large.png b/Assets/Female3DCG/Cloth/MaidApron2_Large.png deleted file mode 100644 index f2e578e26..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidApron2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidApron2_Normal.png b/Assets/Female3DCG/Cloth/MaidApron2_Normal.png deleted file mode 100644 index 6c6e4f284..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidApron2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidApron2_Small.png b/Assets/Female3DCG/Cloth/MaidApron2_Small.png deleted file mode 100644 index b57d4b472..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidApron2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidApron2_XLarge.png b/Assets/Female3DCG/Cloth/MaidApron2_XLarge.png deleted file mode 100644 index 92e658bcc..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidApron2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_Large_Apron.png b/Assets/Female3DCG/Cloth/MaidOutfit1_Large_Apron.png deleted file mode 100644 index 237749ad8..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/MaidOutfit1_Large_Dress.png deleted file mode 100644 index f2a35e0c8..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_Large_Frills.png b/Assets/Female3DCG/Cloth/MaidOutfit1_Large_Frills.png deleted file mode 100644 index 17eb3340c..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_Normal_Apron.png b/Assets/Female3DCG/Cloth/MaidOutfit1_Normal_Apron.png deleted file mode 100644 index 6e5da573a..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/MaidOutfit1_Normal_Dress.png deleted file mode 100644 index 1281d965b..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_Normal_Frills.png b/Assets/Female3DCG/Cloth/MaidOutfit1_Normal_Frills.png deleted file mode 100644 index 390442789..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_Small_Apron.png b/Assets/Female3DCG/Cloth/MaidOutfit1_Small_Apron.png deleted file mode 100644 index 208908c27..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/MaidOutfit1_Small_Dress.png deleted file mode 100644 index 6a9066033..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_Small_Frills.png b/Assets/Female3DCG/Cloth/MaidOutfit1_Small_Frills.png deleted file mode 100644 index 02d0fb53f..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_XLarge_Apron.png b/Assets/Female3DCG/Cloth/MaidOutfit1_XLarge_Apron.png deleted file mode 100644 index 8b6eddbda..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/MaidOutfit1_XLarge_Dress.png deleted file mode 100644 index 8f24f6fa0..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit1_XLarge_Frills.png b/Assets/Female3DCG/Cloth/MaidOutfit1_XLarge_Frills.png deleted file mode 100644 index 9e96cef1f..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit1_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_Large_Apron.png b/Assets/Female3DCG/Cloth/MaidOutfit2_Large_Apron.png deleted file mode 100644 index 5bf2a7b04..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_Large_Dress.png b/Assets/Female3DCG/Cloth/MaidOutfit2_Large_Dress.png deleted file mode 100644 index 659489896..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_Large_Frills.png b/Assets/Female3DCG/Cloth/MaidOutfit2_Large_Frills.png deleted file mode 100644 index a92a3129b..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_Normal_Apron.png b/Assets/Female3DCG/Cloth/MaidOutfit2_Normal_Apron.png deleted file mode 100644 index 716c19174..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_Normal_Dress.png b/Assets/Female3DCG/Cloth/MaidOutfit2_Normal_Dress.png deleted file mode 100644 index 56713fa47..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_Normal_Frills.png b/Assets/Female3DCG/Cloth/MaidOutfit2_Normal_Frills.png deleted file mode 100644 index 61b2efe94..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_Small_Apron.png b/Assets/Female3DCG/Cloth/MaidOutfit2_Small_Apron.png deleted file mode 100644 index 0e723ef96..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_Small_Dress.png b/Assets/Female3DCG/Cloth/MaidOutfit2_Small_Dress.png deleted file mode 100644 index f187d702c..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_Small_Frills.png b/Assets/Female3DCG/Cloth/MaidOutfit2_Small_Frills.png deleted file mode 100644 index 7b6afd067..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_XLarge_Apron.png b/Assets/Female3DCG/Cloth/MaidOutfit2_XLarge_Apron.png deleted file mode 100644 index 9a4854a87..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/MaidOutfit2_XLarge_Dress.png deleted file mode 100644 index 6d265c680..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MaidOutfit2_XLarge_Frills.png b/Assets/Female3DCG/Cloth/MaidOutfit2_XLarge_Frills.png deleted file mode 100644 index 2c80a2496..000000000 Binary files a/Assets/Female3DCG/Cloth/MaidOutfit2_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MistressTop_Large.png b/Assets/Female3DCG/Cloth/MistressTop_Large.png deleted file mode 100644 index 2ba62e124..000000000 Binary files a/Assets/Female3DCG/Cloth/MistressTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MistressTop_Normal.png b/Assets/Female3DCG/Cloth/MistressTop_Normal.png deleted file mode 100644 index 4a96f5742..000000000 Binary files a/Assets/Female3DCG/Cloth/MistressTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MistressTop_Small.png b/Assets/Female3DCG/Cloth/MistressTop_Small.png deleted file mode 100644 index 45276ab91..000000000 Binary files a/Assets/Female3DCG/Cloth/MistressTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/MistressTop_XLarge.png b/Assets/Female3DCG/Cloth/MistressTop_XLarge.png deleted file mode 100644 index 9a08113ac..000000000 Binary files a/Assets/Female3DCG/Cloth/MistressTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/NurseUniform_Large.png b/Assets/Female3DCG/Cloth/NurseUniform_Large.png deleted file mode 100644 index aa74374b0..000000000 Binary files a/Assets/Female3DCG/Cloth/NurseUniform_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/NurseUniform_Normal.png b/Assets/Female3DCG/Cloth/NurseUniform_Normal.png deleted file mode 100644 index d61ff2037..000000000 Binary files a/Assets/Female3DCG/Cloth/NurseUniform_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/NurseUniform_Small.png b/Assets/Female3DCG/Cloth/NurseUniform_Small.png deleted file mode 100644 index af14e0251..000000000 Binary files a/Assets/Female3DCG/Cloth/NurseUniform_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/NurseUniform_XLarge.png b/Assets/Female3DCG/Cloth/NurseUniform_XLarge.png deleted file mode 100644 index b4fe6bdb7..000000000 Binary files a/Assets/Female3DCG/Cloth/NurseUniform_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Orig/MistressTop_Large.png b/Assets/Female3DCG/Cloth/Orig/MistressTop_Large.png deleted file mode 100644 index a89914156..000000000 Binary files a/Assets/Female3DCG/Cloth/Orig/MistressTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Orig/MistressTop_Normal.png b/Assets/Female3DCG/Cloth/Orig/MistressTop_Normal.png deleted file mode 100644 index 919422979..000000000 Binary files a/Assets/Female3DCG/Cloth/Orig/MistressTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Orig/MistressTop_Small.png b/Assets/Female3DCG/Cloth/Orig/MistressTop_Small.png deleted file mode 100644 index 7adc58092..000000000 Binary files a/Assets/Female3DCG/Cloth/Orig/MistressTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Orig/MistressTop_XLarge.png b/Assets/Female3DCG/Cloth/Orig/MistressTop_XLarge.png deleted file mode 100644 index 1f00d8350..000000000 Binary files a/Assets/Female3DCG/Cloth/Orig/MistressTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Large_Jacket.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Large_Jacket.png deleted file mode 100644 index 8746e0281..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Large_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Large_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Large_Shirt.png deleted file mode 100644 index 9591ca855..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Large_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Large_Trim.png deleted file mode 100644 index 86d905d2a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Normal_Jacket.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Normal_Jacket.png deleted file mode 100644 index 4ae58aad8..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Normal_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Normal_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Normal_Shirt.png deleted file mode 100644 index 844b32a59..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Normal_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Normal_Trim.png deleted file mode 100644 index 748d36c1b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Small_Jacket.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Small_Jacket.png deleted file mode 100644 index f1f865669..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Small_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Small_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Small_Shirt.png deleted file mode 100644 index 3cc8c1d02..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Small_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Small_Trim.png deleted file mode 100644 index d63623391..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_XLarge_Jacket.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_XLarge_Jacket.png deleted file mode 100644 index 2e7793465..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_XLarge_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_XLarge_Shirt.png deleted file mode 100644 index 5f7466b36..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_XLarge_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_XLarge_Trim.png deleted file mode 100644 index 1cc373abf..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdmiralTop_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Large_Dress.png deleted file mode 100644 index 26dc37b1d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Large_Sash.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Large_Sash.png deleted file mode 100644 index e1b57f943..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Large_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Large_Trim.png deleted file mode 100644 index d8fea8023..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Normal_Dress.png deleted file mode 100644 index 29bb8ba47..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Normal_Sash.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Normal_Sash.png deleted file mode 100644 index 1d5bf45cc..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Normal_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Normal_Trim.png deleted file mode 100644 index 214fe37fa..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Small_Dress.png deleted file mode 100644 index 9cb71b37b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Small_Sash.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Small_Sash.png deleted file mode 100644 index ab31a3bd1..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Small_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Small_Trim.png deleted file mode 100644 index f3fa73578..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_XLarge_Dress.png deleted file mode 100644 index 3812c4a20..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_XLarge_Sash.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_XLarge_Sash.png deleted file mode 100644 index a10fc8e0d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_XLarge_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_XLarge_Trim.png deleted file mode 100644 index 6d783d29f..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Large_Bow.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Large_Bow.png deleted file mode 100644 index 445c1d190..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Large_Dress.png deleted file mode 100644 index 2c6d09343..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Large_Lace.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Large_Lace.png deleted file mode 100644 index ca93de98a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Normal_Bow.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Normal_Bow.png deleted file mode 100644 index 76c241e51..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Normal_Dress.png deleted file mode 100644 index 0acb43587..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Normal_Lace.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Normal_Lace.png deleted file mode 100644 index b69404a26..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Small_Bow.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Small_Bow.png deleted file mode 100644 index 5fe535b59..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Small_Dress.png deleted file mode 100644 index 80e6a8421..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Small_Lace.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Small_Lace.png deleted file mode 100644 index bbee8d4cf..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_XLarge_Bow.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_XLarge_Bow.png deleted file mode 100644 index c4ee1c721..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_XLarge_Dress.png deleted file mode 100644 index c13537ab3..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_XLarge_Lace.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_XLarge_Lace.png deleted file mode 100644 index 21c6aa20a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress2_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Large_Belt.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Large_Belt.png deleted file mode 100644 index cca24766c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Large_Collar.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Large_Collar.png deleted file mode 100644 index 5282e9c55..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Large_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Large_Dress.png deleted file mode 100644 index 674552691..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Normal_Belt.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Normal_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Normal_Collar.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Normal_Collar.png deleted file mode 100644 index 98677f104..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Normal_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Normal_Dress.png deleted file mode 100644 index 76f519a7b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Small_Belt.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Small_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Small_Collar.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Small_Collar.png deleted file mode 100644 index 2d9d5809f..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Small_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Small_Dress.png deleted file mode 100644 index 5ecd47a1e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_XLarge_Belt.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_XLarge_Belt.png deleted file mode 100644 index b89a7da44..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_XLarge_Collar.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_XLarge_Collar.png deleted file mode 100644 index d177f0141..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_XLarge_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_XLarge_Dress.png deleted file mode 100644 index a1d86ae39..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress3_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_Large.png deleted file mode 100644 index 127434c92..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_Normal.png deleted file mode 100644 index dc2b27a72..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_Small.png deleted file mode 100644 index f6a5060eb..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_XLarge.png deleted file mode 100644 index cda002d4b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/AdultBabyDress4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Large_Dress.png deleted file mode 100644 index 9e1a59773..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Large_Trim.png deleted file mode 100644 index 4848b503e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Normal_Dress.png deleted file mode 100644 index 4fb1d60cb..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Normal_Trim.png deleted file mode 100644 index e7453352a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Small_Dress.png deleted file mode 100644 index d025a4895..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Small_Trim.png deleted file mode 100644 index a12084d90..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_XLarge_Dress.png deleted file mode 100644 index b7ef92305..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_XLarge_Trim.png deleted file mode 100644 index c6826313d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BabydollDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_Large.png deleted file mode 100644 index 2c880c570..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_Normal.png deleted file mode 100644 index 58cd6be88..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_Small.png deleted file mode 100644 index d5a5e0e09..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_XLarge.png deleted file mode 100644 index d1b8138ee..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Blouse1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Large_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Large_Base.png deleted file mode 100644 index d789ec39c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Large_Pattern.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Large_Pattern.png deleted file mode 100644 index 1cea600d0..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Large_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Large_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Large_Trim.png deleted file mode 100644 index 5107ba730..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Normal_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Normal_Base.png deleted file mode 100644 index 546d5066a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Normal_Pattern.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Normal_Pattern.png deleted file mode 100644 index 1cea600d0..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Normal_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Normal_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Normal_Trim.png deleted file mode 100644 index f424b791a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Small_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Small_Base.png deleted file mode 100644 index b6cfbb7f8..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Small_Pattern.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Small_Pattern.png deleted file mode 100644 index 1cea600d0..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Small_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Small_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Small_Trim.png deleted file mode 100644 index f424b791a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_XLarge_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_XLarge_Base.png deleted file mode 100644 index 969691eb8..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_XLarge_Pattern.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_XLarge_Pattern.png deleted file mode 100644 index 1cea600d0..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_XLarge_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_XLarge_Trim.png deleted file mode 100644 index 31bd3dff7..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Bodice1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_Large.png deleted file mode 100644 index 7b609fe2e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_Normal.png deleted file mode 100644 index c38f6ed57..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_Small.png deleted file mode 100644 index bedd4b166..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_XLarge.png deleted file mode 100644 index 6a82a8c1c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BodyTowel1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_Large.png deleted file mode 100644 index 4d60463c3..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_Normal.png deleted file mode 100644 index 857335240..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_Small.png deleted file mode 100644 index da44b9797..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_XLarge.png deleted file mode 100644 index 8b00bf184..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_Large.png deleted file mode 100644 index 4c1c5cb3a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_Normal.png deleted file mode 100644 index 6ddda67c7..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_Small.png deleted file mode 100644 index 79546443b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_XLarge.png deleted file mode 100644 index ceef0df77..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageBustier2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_Large.png deleted file mode 100644 index 91c2c64ee..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_Normal.png deleted file mode 100644 index 285ecceb6..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_Small.png deleted file mode 100644 index 70eed2e74..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_XLarge.png deleted file mode 100644 index 3c5126bf0..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_Large.png deleted file mode 100644 index dd2de8651..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_Normal.png deleted file mode 100644 index 57dd5505b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_Small.png deleted file mode 100644 index bfb15089c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_XLarge.png deleted file mode 100644 index 7d011c84e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BondageDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_Large.png deleted file mode 100644 index 136fbb359..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_Normal.png deleted file mode 100644 index 605ccf3c6..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_Small.png deleted file mode 100644 index 213e3d630..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_XLarge.png deleted file mode 100644 index a43d943b2..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/BridesmaidDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_Large.png deleted file mode 100644 index 84736a629..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_Normal.png deleted file mode 100644 index 9c507531e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_Small.png deleted file mode 100644 index 73bc6ebab..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_XLarge.png deleted file mode 100644 index a24017266..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_LargePink_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_LargePink_Dress.png deleted file mode 100644 index d6b2c0e13..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_LargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_LargePurple_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_LargePurple_Dress.png deleted file mode 100644 index 58f882e57..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_LargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Large_Dress.png deleted file mode 100644 index b5b8c7c8a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Large_Edges.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Large_Edges.png deleted file mode 100644 index 8b896df40..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Large_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_NormalPink_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_NormalPink_Dress.png deleted file mode 100644 index 9fd1df4f8..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_NormalPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_NormalPurple_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_NormalPurple_Dress.png deleted file mode 100644 index b1c59397c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_NormalPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Normal_Dress.png deleted file mode 100644 index 18993f2f4..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Normal_Edges.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Normal_Edges.png deleted file mode 100644 index 45c82ae7e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Normal_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_SmallPink_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_SmallPink_Dress.png deleted file mode 100644 index c52e6330e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_SmallPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_SmallPurple_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_SmallPurple_Dress.png deleted file mode 100644 index 68473c5ce..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_SmallPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Small_Dress.png deleted file mode 100644 index fbe2b8245..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Small_Edges.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Small_Edges.png deleted file mode 100644 index af0872b38..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_Small_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLargePink_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLargePink_Dress.png deleted file mode 100644 index 98f6f5919..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLargePurple_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLargePurple_Dress.png deleted file mode 100644 index 32111de4b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLarge_Dress.png deleted file mode 100644 index 6e0fc27c5..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLarge_Edges.png b/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLarge_Edges.png deleted file mode 100644 index 743dd7ad3..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ChineseDress2_XLarge_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Large_Shirt.png deleted file mode 100644 index 5a11085c1..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Large_Tie.png b/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Large_Tie.png deleted file mode 100644 index d7cb8b732..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Large_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Normal_Shirt.png deleted file mode 100644 index f44f20250..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Normal_Tie.png b/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Normal_Tie.png deleted file mode 100644 index 5b3d0275b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Normal_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Small_Shirt.png deleted file mode 100644 index 398d4d26b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Small_Tie.png b/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Small_Tie.png deleted file mode 100644 index e1ab9830c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_Small_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_XLarge_Shirt.png deleted file mode 100644 index ac6471599..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_XLarge_Tie.png b/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_XLarge_Tie.png deleted file mode 100644 index 366d4e097..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CollegeOutfit1_XLarge_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_Large.png deleted file mode 100644 index 8beb502ed..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_Normal.png deleted file mode 100644 index b2332060d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_Small.png deleted file mode 100644 index b2332060d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_XLarge.png deleted file mode 100644 index 4346f210b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ComfyTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Large_Corset.png b/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Large_Corset.png deleted file mode 100644 index 663080654..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Large_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Large_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Large_Shirt.png deleted file mode 100644 index bdf15c958..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Normal_Corset.png b/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Normal_Corset.png deleted file mode 100644 index 314b636d3..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Normal_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Normal_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Normal_Shirt.png deleted file mode 100644 index 4e80d8589..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Small_Corset.png b/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Small_Corset.png deleted file mode 100644 index 314b636d3..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Small_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Small_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Small_Shirt.png deleted file mode 100644 index 4e80d8589..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_XLarge_Corset.png b/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_XLarge_Corset.png deleted file mode 100644 index 57954956a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_XLarge_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_XLarge_Shirt.png deleted file mode 100644 index bdf15c958..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/CorsetShirt_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Dress2_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/Dress2_Large.png deleted file mode 100644 index 4127d3667..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Dress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Dress2_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/Dress2_Normal.png deleted file mode 100644 index f78e215c6..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Dress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Dress2_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/Dress2_Small.png deleted file mode 100644 index 53131ac39..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Dress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Dress2_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/Dress2_XLarge.png deleted file mode 100644 index 9e917f38a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Dress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Dress3_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/Dress3_Large.png deleted file mode 100644 index 5d7c1cabf..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Dress3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Dress3_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/Dress3_Normal.png deleted file mode 100644 index 6a90449a7..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Dress3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Dress3_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/Dress3_Small.png deleted file mode 100644 index 884916221..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Dress3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Dress3_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/Dress3_XLarge.png deleted file mode 100644 index f5ebf32db..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Dress3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Large_Fabric.png b/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Large_Fabric.png deleted file mode 100644 index 8b1d68e56..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Large_Fur.png b/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Large_Fur.png deleted file mode 100644 index 71df548f7..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Normal_Fabric.png b/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Normal_Fabric.png deleted file mode 100644 index b60c1b8a4..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Normal_Fur.png b/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Normal_Fur.png deleted file mode 100644 index 711020107..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Small_Fabric.png b/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Small_Fabric.png deleted file mode 100644 index 4eacf812d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Small_Fur.png b/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Small_Fur.png deleted file mode 100644 index 0e15ac960..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_XLarge_Fabric.png b/Assets/Female3DCG/Cloth/OverTheHead/DressFur_XLarge_Fabric.png deleted file mode 100644 index b22b33725..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_XLarge_Fur.png b/Assets/Female3DCG/Cloth/OverTheHead/DressFur_XLarge_Fur.png deleted file mode 100644 index f8ff38d5d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/DressFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Large.png deleted file mode 100644 index 6420ea24d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Large_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Large_Dress.png deleted file mode 100644 index 6420ea24d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Large_Flower.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Large_Flower.png deleted file mode 100644 index 0fe57a834..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Large_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Normal.png deleted file mode 100644 index 1ce6e6f9c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Normal_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Normal_Dress.png deleted file mode 100644 index 1ce6e6f9c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Normal_Flower.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Normal_Flower.png deleted file mode 100644 index f9a431623..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Normal_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Small.png deleted file mode 100644 index 712994d56..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Small_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Small_Dress.png deleted file mode 100644 index 712994d56..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Small_Flower.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Small_Flower.png deleted file mode 100644 index c7d872ad6..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_Small_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_XLarge.png deleted file mode 100644 index 356fb9380..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_XLarge_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_XLarge_Dress.png deleted file mode 100644 index 356fb9380..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_XLarge_Flower.png b/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_XLarge_Flower.png deleted file mode 100644 index 5686a3cca..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FlowerDress_XLarge_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/FurCoat_Upper.png b/Assets/Female3DCG/Cloth/OverTheHead/FurCoat_Upper.png deleted file mode 100644 index 8863db067..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/FurCoat_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown1_Large.png deleted file mode 100644 index 87d72370d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown1_Normal.png deleted file mode 100644 index a2ef948e1..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown1_Small.png deleted file mode 100644 index 3b9640086..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown1_XLarge.png deleted file mode 100644 index 5f07b6481..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_Large.png deleted file mode 100644 index b0f7b1792..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_Normal.png deleted file mode 100644 index dcc9da25e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_Small.png deleted file mode 100644 index 22bc62380..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_XLarge.png deleted file mode 100644 index ff01aea07..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown2Top_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown3_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown3_Large.png deleted file mode 100644 index e4097f387..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown3_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown3_Normal.png deleted file mode 100644 index 4d9898a5a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown3_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown3_Small.png deleted file mode 100644 index 5915c9088..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Gown3_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/Gown3_XLarge.png deleted file mode 100644 index 34014aa14..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Gown3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_BackSkirt.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_BackSkirt.png deleted file mode 100644 index e6ff11224..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_BackSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Base.png deleted file mode 100644 index d468626f7..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Belt.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Belt.png deleted file mode 100644 index 490febbfa..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Buckle.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Buckle.png deleted file mode 100644 index 0fb758187..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Trim.png deleted file mode 100644 index 44f42a8ec..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Base.png deleted file mode 100644 index a8e09ffd0..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Belt.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Belt.png deleted file mode 100644 index 6c8457d2d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Buckle.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Buckle.png deleted file mode 100644 index 679247f8d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Trim.png deleted file mode 100644 index 4160a0596..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Base.png deleted file mode 100644 index 1390e1599..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Belt.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Belt.png deleted file mode 100644 index 290d51bfc..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Buckle.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Buckle.png deleted file mode 100644 index b11836cb6..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Trim.png deleted file mode 100644 index f8dd9d574..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Base.png deleted file mode 100644 index d366ea9f8..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Belt.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Belt.png deleted file mode 100644 index ec1c42c84..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Buckle.png deleted file mode 100644 index cc20a702d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Trim.png b/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Trim.png deleted file mode 100644 index 2fa0772ef..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/GrandMage_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Jacket_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/Jacket_Base.png deleted file mode 100644 index 07629ff81..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Jacket_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_Large.png deleted file mode 100644 index d9291cbbc..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_Normal.png deleted file mode 100644 index e5bfd1266..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_Small.png deleted file mode 100644 index d8be602da..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_XLarge.png deleted file mode 100644 index 614fff240..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LaceBabydoll_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_Large.png deleted file mode 100644 index 87868caf9..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_LargeNonLaced.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_LargeNonLaced.png deleted file mode 100644 index 3d1b96a0e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_LargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_Normal.png deleted file mode 100644 index 4055e832e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_NormalNonLaced.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_NormalNonLaced.png deleted file mode 100644 index 09da2eb36..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_NormalNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_Small.png deleted file mode 100644 index 06d9c83c2..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_SmallNonLaced.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_SmallNonLaced.png deleted file mode 100644 index dfacdcd78..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_SmallNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_XLarge.png deleted file mode 100644 index e7cc58bda..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_XLargeNonLaced.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_XLargeNonLaced.png deleted file mode 100644 index 310288b81..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexLacedSuit_XLargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_Large.png deleted file mode 100644 index aecd75d3f..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_Normal.png deleted file mode 100644 index 4d8369041..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_Small.png deleted file mode 100644 index afbeb7422..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_XLarge.png deleted file mode 100644 index 1b024c320..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LatexTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Large_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Large_Base.png deleted file mode 100644 index 0ab8e5ae1..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Large_Design.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Large_Design.png deleted file mode 100644 index d58b9feb6..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Large_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Large_Lace.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Large_Lace.png deleted file mode 100644 index a6d6896e5..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Normal_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Normal_Base.png deleted file mode 100644 index 9a4d0f486..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Normal_Design.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Normal_Design.png deleted file mode 100644 index 8d1cd7051..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Normal_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Normal_Lace.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Normal_Lace.png deleted file mode 100644 index 946d8c21b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Small_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Small_Base.png deleted file mode 100644 index eb8ce7198..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Small_Design.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Small_Design.png deleted file mode 100644 index dabac4154..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Small_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Small_Lace.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Small_Lace.png deleted file mode 100644 index 0806f6e4d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_XLarge_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_XLarge_Base.png deleted file mode 100644 index 33416f3c9..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_XLarge_Design.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_XLarge_Design.png deleted file mode 100644 index 7bf859868..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_XLarge_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_XLarge_Lace.png b/Assets/Female3DCG/Cloth/OverTheHead/Laurel_XLarge_Lace.png deleted file mode 100644 index f6d8a8b46..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Laurel_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_Large.png deleted file mode 100644 index 6fe843206..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_Normal.png deleted file mode 100644 index 6bc6d3670..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_Small.png deleted file mode 100644 index 53b917739..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_XLarge.png deleted file mode 100644 index 8f969784d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LeatherBolero_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_Large.png deleted file mode 100644 index be3f507aa..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_Normal.png deleted file mode 100644 index 644f6729a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_Small.png deleted file mode 100644 index a139f254c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_XLarge.png deleted file mode 100644 index 9c820ef40..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/LeatherCropTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_Large.png deleted file mode 100644 index d9336a968..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_Normal.png deleted file mode 100644 index d710f52bc..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_Small.png deleted file mode 100644 index 2ddde972b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_XLarge.png deleted file mode 100644 index dc9253ef9..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_Large.png deleted file mode 100644 index 1a89ad1e2..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_Normal.png deleted file mode 100644 index 150974896..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_Small.png deleted file mode 100644 index 813c91958..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_XLarge.png deleted file mode 100644 index 8817288e2..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidApron2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Large_Apron.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Large_Apron.png deleted file mode 100644 index 8e3035ffa..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Large_Dress.png deleted file mode 100644 index c68c2e879..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Large_Frills.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Large_Frills.png deleted file mode 100644 index d345143f9..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Normal_Apron.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Normal_Apron.png deleted file mode 100644 index 0f23b40ca..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Normal_Dress.png deleted file mode 100644 index b9e6745e9..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Normal_Frills.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Normal_Frills.png deleted file mode 100644 index f7fe8f806..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Small_Apron.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Small_Apron.png deleted file mode 100644 index c83d876ec..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Small_Dress.png deleted file mode 100644 index 13ea74de7..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Small_Frills.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Small_Frills.png deleted file mode 100644 index 1450294e4..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_XLarge_Apron.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_XLarge_Apron.png deleted file mode 100644 index b67caf50f..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_XLarge_Dress.png deleted file mode 100644 index 4c01db26f..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_XLarge_Frills.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_XLarge_Frills.png deleted file mode 100644 index 7b1282898..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit1_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Large_Apron.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Large_Apron.png deleted file mode 100644 index 787b8b684..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Large_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Large_Dress.png deleted file mode 100644 index 2d2fc4e4e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Large_Frills.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Large_Frills.png deleted file mode 100644 index ffba915ff..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Normal_Apron.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Normal_Apron.png deleted file mode 100644 index 609a7db7a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Normal_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Normal_Dress.png deleted file mode 100644 index 729b4d9d9..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Normal_Frills.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Normal_Frills.png deleted file mode 100644 index 953c440c5..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Small_Apron.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Small_Apron.png deleted file mode 100644 index 962f4caba..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Small_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Small_Dress.png deleted file mode 100644 index d59449e88..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Small_Frills.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Small_Frills.png deleted file mode 100644 index ddb3cd0b7..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_XLarge_Apron.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_XLarge_Apron.png deleted file mode 100644 index 9ff8c4353..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_XLarge_Dress.png deleted file mode 100644 index 328f292b4..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_XLarge_Frills.png b/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_XLarge_Frills.png deleted file mode 100644 index f430d6d02..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MaidOutfit2_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_Large.png deleted file mode 100644 index d390102f2..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_Normal.png deleted file mode 100644 index 82694122c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_Small.png deleted file mode 100644 index ce85e6661..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_XLarge.png deleted file mode 100644 index ff72da762..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/MistressTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_Large.png deleted file mode 100644 index cd3c6e0bd..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_Normal.png deleted file mode 100644 index 2e0f2bd38..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_Small.png deleted file mode 100644 index 0635ddc01..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_XLarge.png deleted file mode 100644 index 20c6d2e99..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/NurseUniform_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Robe1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/Robe1_Large.png deleted file mode 100644 index 880e33f2b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Robe1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Robe1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/Robe1_Normal.png deleted file mode 100644 index 73274d418..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Robe1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Robe1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/Robe1_Small.png deleted file mode 100644 index 905aa645e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Robe1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Robe1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/Robe1_XLarge.png deleted file mode 100644 index 814d152d1..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Robe1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_Large.png deleted file mode 100644 index 5672df73c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_Normal.png deleted file mode 100644 index 6ff6c13ea..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_Small.png deleted file mode 100644 index 470652e90..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_XLarge.png deleted file mode 100644 index 3b9d8fde9..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/ShoulderlessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_Large.png deleted file mode 100644 index 2eb6e4860..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_Normal.png deleted file mode 100644 index 2e1e1d2b1..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_Small.png deleted file mode 100644 index f48c71bcc..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_XLarge.png deleted file mode 100644 index 913c20a42..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SleevelessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Bow.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Bow.png deleted file mode 100644 index 9eb3676d2..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Buckle.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Buckle.png deleted file mode 100644 index 972078fef..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Dress.png deleted file mode 100644 index b30743269..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Shirt.png deleted file mode 100644 index 27076f6fa..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Bow.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Bow.png deleted file mode 100644 index 9eb3676d2..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Buckle.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Buckle.png deleted file mode 100644 index 0676a5605..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Dress.png deleted file mode 100644 index 73adbf446..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Shirt.png deleted file mode 100644 index a4d83eefa..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Bow.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Bow.png deleted file mode 100644 index 9eb3676d2..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Buckle.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Buckle.png deleted file mode 100644 index 8ba059385..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Dress.png deleted file mode 100644 index 4a99eaa29..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Shirt.png deleted file mode 100644 index af8ed4548..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Bow.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Bow.png deleted file mode 100644 index 9eb3676d2..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Buckle.png deleted file mode 100644 index dc0ff9b53..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Dress.png deleted file mode 100644 index 67c7c6f16..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Shirt.png deleted file mode 100644 index 067baff3a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_Large.png deleted file mode 100644 index a11834ef0..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_Normal.png deleted file mode 100644 index 774058b1c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_Small.png deleted file mode 100644 index dd681efbb..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_XLarge.png deleted file mode 100644 index be26571b6..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Large_Color.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Large_Color.png deleted file mode 100644 index d8153c037..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Large_White.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Large_White.png deleted file mode 100644 index edbd5028a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Normal_Color.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Normal_Color.png deleted file mode 100644 index 39cd32799..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Normal_White.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Normal_White.png deleted file mode 100644 index f5bb8849d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Small_Color.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Small_Color.png deleted file mode 100644 index 3478f2d8e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Small_White.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Small_White.png deleted file mode 100644 index 052d14e22..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_XLarge_Color.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_XLarge_Color.png deleted file mode 100644 index 9cbaa2810..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_XLarge_White.png b/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_XLarge_White.png deleted file mode 100644 index f46463ea4..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/StudentOutfit3_XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Base.png deleted file mode 100644 index a860f8c56..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer1.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer1.png deleted file mode 100644 index 1231ee5f0..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer2.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer2.png deleted file mode 100644 index 52110305b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer3.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer3.png deleted file mode 100644 index ea4c8e4f7..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer4.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer4.png deleted file mode 100644 index 04d21bd00..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Base.png deleted file mode 100644 index be95114c8..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer1.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer1.png deleted file mode 100644 index 8b07628db..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer2.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer2.png deleted file mode 100644 index 1b4942c7e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer3.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer3.png deleted file mode 100644 index c359a8723..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer4.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer4.png deleted file mode 100644 index f168d882c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Base.png deleted file mode 100644 index 041c68d1b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer1.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer1.png deleted file mode 100644 index a9bfdf1df..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer2.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer2.png deleted file mode 100644 index 09ca29490..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer3.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer3.png deleted file mode 100644 index 77d639d3a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer4.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer4.png deleted file mode 100644 index fa1bd10d8..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Base.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Base.png deleted file mode 100644 index 4c656a224..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer1.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer1.png deleted file mode 100644 index ca29704e8..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer2.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer2.png deleted file mode 100644 index 1debaaa18..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer3.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer3.png deleted file mode 100644 index c3ea329fc..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer4.png b/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer4.png deleted file mode 100644 index 7b3b7ac88..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SummerDress_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_Large.png deleted file mode 100644 index db2128b5f..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_Normal.png deleted file mode 100644 index 73c85d929..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_Small.png deleted file mode 100644 index ec5d92544..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_XLarge.png deleted file mode 100644 index d5487cfa7..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/SuspenderTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_Large.png deleted file mode 100644 index 08adc676c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_Normal.png deleted file mode 100644 index 01dbdc32e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_Small.png deleted file mode 100644 index e96e036b3..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_XLarge.png deleted file mode 100644 index 038d10302..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Sweater1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_Large.png deleted file mode 100644 index f49045d26..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_Normal.png deleted file mode 100644 index ca79d1c34..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_Small.png deleted file mode 100644 index 32bcfadaf..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_XLarge.png deleted file mode 100644 index 8df9a742f..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2BCLogo_Print.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt2BCLogo_Print.png deleted file mode 100644 index 717259582..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2BCLogo_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2BDSM_Print.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt2BDSM_Print.png deleted file mode 100644 index 62f576eb9..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2BDSM_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Gag_Print.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Gag_Print.png deleted file mode 100644 index 5d5d4ea25..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Gag_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Knot_Print.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Knot_Print.png deleted file mode 100644 index de16f53e4..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Knot_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Rock_Print.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Rock_Print.png deleted file mode 100644 index 34cab3760..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Rock_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Smile_Print.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Smile_Print.png deleted file mode 100644 index c6c67db94..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Smile_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Tick_Print.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Tick_Print.png deleted file mode 100644 index fb69e1ad4..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2Tick_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_Large_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_Large_Shirt.png deleted file mode 100644 index 6c03bf61d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_Normal_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_Normal_Shirt.png deleted file mode 100644 index fc7adf3c8..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_Small_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_Small_Shirt.png deleted file mode 100644 index 07aba2a88..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_XLarge_Shirt.png deleted file mode 100644 index f0f90a577..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TShirt2_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_Large.png deleted file mode 100644 index b3c93dbab..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_Normal.png deleted file mode 100644 index 479460170..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_Small.png deleted file mode 100644 index d0d2d6c6a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_XLarge.png deleted file mode 100644 index 218da9d9c..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TeacherOutfit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_Large.png deleted file mode 100644 index ebf2068f6..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_Normal.png deleted file mode 100644 index ddffddabb..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_Small.png deleted file mode 100644 index a7d9facee..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_XLarge.png deleted file mode 100644 index 0f5d51606..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/TennisShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_Large.png deleted file mode 100644 index 17cf93fe1..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_Normal.png deleted file mode 100644 index d5460518b..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_Small.png deleted file mode 100644 index 51424c10e..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_XLarge.png deleted file mode 100644 index 9aa1bf9d9..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/VirginKiller1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_Large.png deleted file mode 100644 index 72214dbc8..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_Normal.png deleted file mode 100644 index 6c141e19a..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_Small.png deleted file mode 100644 index 2bac6b43d..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_XLarge.png deleted file mode 100644 index b75a58d39..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_Large.png deleted file mode 100644 index 5f0d310cc..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_Normal.png deleted file mode 100644 index 1cb48ec15..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_Small.png deleted file mode 100644 index de1260bf2..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_XLarge.png deleted file mode 100644 index 8888855da..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_Large.png b/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_Large.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_Normal.png b/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_Normal.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_Small.png b/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_Small.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_XLarge.png b/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_XLarge.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/Cloth/OverTheHead/Yukata1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/AdmiralTop.png b/Assets/Female3DCG/Cloth/Preview/AdmiralTop.png deleted file mode 100644 index c96ead6c6..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/AdmiralTop.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/AdultBabyDress1.png b/Assets/Female3DCG/Cloth/Preview/AdultBabyDress1.png deleted file mode 100644 index c11a70c91..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/AdultBabyDress1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/AdultBabyDress2.png b/Assets/Female3DCG/Cloth/Preview/AdultBabyDress2.png deleted file mode 100644 index f2640a02f..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/AdultBabyDress2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/AdultBabyDress3.png b/Assets/Female3DCG/Cloth/Preview/AdultBabyDress3.png deleted file mode 100644 index e47453b83..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/AdultBabyDress3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/AdultBabyDress4.png b/Assets/Female3DCG/Cloth/Preview/AdultBabyDress4.png deleted file mode 100644 index 35fdabfc0..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/AdultBabyDress4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/BabydollDress1.png b/Assets/Female3DCG/Cloth/Preview/BabydollDress1.png deleted file mode 100644 index 0d2779008..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/BabydollDress1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Blouse1.png b/Assets/Female3DCG/Cloth/Preview/Blouse1.png deleted file mode 100644 index dcceacfe9..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Blouse1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Bodice1.png b/Assets/Female3DCG/Cloth/Preview/Bodice1.png deleted file mode 100644 index b95773a0a..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Bodice1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/BodyTowel1.png b/Assets/Female3DCG/Cloth/Preview/BodyTowel1.png deleted file mode 100644 index 44e4102d1..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/BodyTowel1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/BondageBustier1.png b/Assets/Female3DCG/Cloth/Preview/BondageBustier1.png deleted file mode 100644 index c01b49762..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/BondageBustier1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/BondageBustier2.png b/Assets/Female3DCG/Cloth/Preview/BondageBustier2.png deleted file mode 100644 index 979d606c6..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/BondageBustier2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/BondageDress1.png b/Assets/Female3DCG/Cloth/Preview/BondageDress1.png deleted file mode 100644 index e45aa7a64..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/BondageDress1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/BondageDress2.png b/Assets/Female3DCG/Cloth/Preview/BondageDress2.png deleted file mode 100644 index d81f42518..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/BondageDress2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/BridesmaidDress1.png b/Assets/Female3DCG/Cloth/Preview/BridesmaidDress1.png deleted file mode 100644 index effce03f7..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/BridesmaidDress1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/ChineseDress1.png b/Assets/Female3DCG/Cloth/Preview/ChineseDress1.png deleted file mode 100644 index 0efbdc19d..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/ChineseDress1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/ChineseDress2.png b/Assets/Female3DCG/Cloth/Preview/ChineseDress2.png deleted file mode 100644 index 9e19a0790..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/ChineseDress2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/CollegeOutfit1.png b/Assets/Female3DCG/Cloth/Preview/CollegeOutfit1.png deleted file mode 100644 index 8565b66c9..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/CollegeOutfit1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/ComfyTop.png b/Assets/Female3DCG/Cloth/Preview/ComfyTop.png deleted file mode 100644 index a1a4d8abe..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/ComfyTop.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/CorsetShirt.png b/Assets/Female3DCG/Cloth/Preview/CorsetShirt.png deleted file mode 100644 index 46a2670a6..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/CorsetShirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/CropTop.png b/Assets/Female3DCG/Cloth/Preview/CropTop.png deleted file mode 100644 index fc4392233..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/CropTop.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Dress2.png b/Assets/Female3DCG/Cloth/Preview/Dress2.png deleted file mode 100644 index 7d5c0a473..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Dress2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Dress3.png b/Assets/Female3DCG/Cloth/Preview/Dress3.png deleted file mode 100644 index 84848eb01..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Dress3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/DressFur.png b/Assets/Female3DCG/Cloth/Preview/DressFur.png deleted file mode 100644 index b4c826ae9..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/DressFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/FlowerDress.png b/Assets/Female3DCG/Cloth/Preview/FlowerDress.png deleted file mode 100644 index afd599ccc..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/FlowerDress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/FurCoat.png b/Assets/Female3DCG/Cloth/Preview/FurCoat.png deleted file mode 100644 index 237e5f757..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/FurCoat.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/FuzzyDress.png b/Assets/Female3DCG/Cloth/Preview/FuzzyDress.png deleted file mode 100644 index 0037dc06f..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/FuzzyDress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Gown1.png b/Assets/Female3DCG/Cloth/Preview/Gown1.png deleted file mode 100644 index f592460fe..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Gown1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Gown2Top.png b/Assets/Female3DCG/Cloth/Preview/Gown2Top.png deleted file mode 100644 index 1ca846632..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Gown2Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Gown3.png b/Assets/Female3DCG/Cloth/Preview/Gown3.png deleted file mode 100644 index 297487080..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Gown3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/GrandMage.png b/Assets/Female3DCG/Cloth/Preview/GrandMage.png deleted file mode 100644 index c7b7467c4..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/GrandMage.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Jacket.png b/Assets/Female3DCG/Cloth/Preview/Jacket.png deleted file mode 100644 index 7e102d474..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/LaceBabydoll.png b/Assets/Female3DCG/Cloth/Preview/LaceBabydoll.png deleted file mode 100644 index 8d37e2294..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/LaceBabydoll.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/LatexLacedSuit.png b/Assets/Female3DCG/Cloth/Preview/LatexLacedSuit.png deleted file mode 100644 index 904fad23c..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/LatexLacedSuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/LatexTop.png b/Assets/Female3DCG/Cloth/Preview/LatexTop.png deleted file mode 100644 index 345aae43c..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/LatexTop.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Laurel.png b/Assets/Female3DCG/Cloth/Preview/Laurel.png deleted file mode 100644 index 78597e527..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Laurel.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/LeatherBolero.png b/Assets/Female3DCG/Cloth/Preview/LeatherBolero.png deleted file mode 100644 index 878ec21b8..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/LeatherBolero.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/LeatherCropTop.png b/Assets/Female3DCG/Cloth/Preview/LeatherCropTop.png deleted file mode 100644 index 460b83307..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/LeatherCropTop.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/MaidApron1.png b/Assets/Female3DCG/Cloth/Preview/MaidApron1.png deleted file mode 100644 index 0c190e95e..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/MaidApron1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/MaidApron2.png b/Assets/Female3DCG/Cloth/Preview/MaidApron2.png deleted file mode 100644 index a252388b0..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/MaidApron2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/MaidOutfit1.png b/Assets/Female3DCG/Cloth/Preview/MaidOutfit1.png deleted file mode 100644 index 9ed40d4d0..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/MaidOutfit1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/MaidOutfit2.png b/Assets/Female3DCG/Cloth/Preview/MaidOutfit2.png deleted file mode 100644 index 6200e1fb5..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/MaidOutfit2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/MistressTop.png b/Assets/Female3DCG/Cloth/Preview/MistressTop.png deleted file mode 100644 index a6601a5e1..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/MistressTop.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/NurseUniform.png b/Assets/Female3DCG/Cloth/Preview/NurseUniform.png deleted file mode 100644 index 135267a2e..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/NurseUniform.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Robe1.png b/Assets/Female3DCG/Cloth/Preview/Robe1.png deleted file mode 100644 index d0050e47e..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Robe1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/SeethroughTop.png b/Assets/Female3DCG/Cloth/Preview/SeethroughTop.png deleted file mode 100644 index 87d712d1c..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/SeethroughTop.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/ShoulderlessTop.png b/Assets/Female3DCG/Cloth/Preview/ShoulderlessTop.png deleted file mode 100644 index 7a44a1622..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/ShoulderlessTop.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/SleevelessTop.png b/Assets/Female3DCG/Cloth/Preview/SleevelessTop.png deleted file mode 100644 index 745ca277a..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/SleevelessTop.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/StudentOutfit1.png b/Assets/Female3DCG/Cloth/Preview/StudentOutfit1.png deleted file mode 100644 index 43c4a0342..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/StudentOutfit1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/StudentOutfit2.png b/Assets/Female3DCG/Cloth/Preview/StudentOutfit2.png deleted file mode 100644 index 8a8b9ccf2..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/StudentOutfit2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/StudentOutfit3.png b/Assets/Female3DCG/Cloth/Preview/StudentOutfit3.png deleted file mode 100644 index 5f990b3ea..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/StudentOutfit3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/SummerDress.png b/Assets/Female3DCG/Cloth/Preview/SummerDress.png deleted file mode 100644 index d909fbf43..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/SummerDress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/SuspenderTop1.png b/Assets/Female3DCG/Cloth/Preview/SuspenderTop1.png deleted file mode 100644 index 4224deba5..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/SuspenderTop1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Sweater1.png b/Assets/Female3DCG/Cloth/Preview/Sweater1.png deleted file mode 100644 index 14f574f64..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Sweater1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/TShirt1.png b/Assets/Female3DCG/Cloth/Preview/TShirt1.png deleted file mode 100644 index b377dd873..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/TShirt1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/TShirt2.png b/Assets/Female3DCG/Cloth/Preview/TShirt2.png deleted file mode 100644 index 291cf5b12..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/TShirt2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/TeacherOutfit1.png b/Assets/Female3DCG/Cloth/Preview/TeacherOutfit1.png deleted file mode 100644 index 493532e69..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/TeacherOutfit1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/TennisShirt1.png b/Assets/Female3DCG/Cloth/Preview/TennisShirt1.png deleted file mode 100644 index 6d484e30c..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/TennisShirt1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/VirginKiller1.png b/Assets/Female3DCG/Cloth/Preview/VirginKiller1.png deleted file mode 100644 index 115bd736c..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/VirginKiller1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/WeddingDress1.png b/Assets/Female3DCG/Cloth/Preview/WeddingDress1.png deleted file mode 100644 index 3d94716f2..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/WeddingDress1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/WeddingDress2.png b/Assets/Female3DCG/Cloth/Preview/WeddingDress2.png deleted file mode 100644 index d7e9ae83a..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/WeddingDress2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Preview/Yukata1.png b/Assets/Female3DCG/Cloth/Preview/Yukata1.png deleted file mode 100644 index f6e08c25c..000000000 Binary files a/Assets/Female3DCG/Cloth/Preview/Yukata1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Robe1_Large.png b/Assets/Female3DCG/Cloth/Robe1_Large.png deleted file mode 100644 index 8cfbc79c4..000000000 Binary files a/Assets/Female3DCG/Cloth/Robe1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Robe1_Normal.png b/Assets/Female3DCG/Cloth/Robe1_Normal.png deleted file mode 100644 index 204122bab..000000000 Binary files a/Assets/Female3DCG/Cloth/Robe1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Robe1_Small.png b/Assets/Female3DCG/Cloth/Robe1_Small.png deleted file mode 100644 index eb3237bbd..000000000 Binary files a/Assets/Female3DCG/Cloth/Robe1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Robe1_XLarge.png b/Assets/Female3DCG/Cloth/Robe1_XLarge.png deleted file mode 100644 index 65018ab05..000000000 Binary files a/Assets/Female3DCG/Cloth/Robe1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SeethroughTop_Large_Design.png b/Assets/Female3DCG/Cloth/SeethroughTop_Large_Design.png deleted file mode 100644 index 17ed41046..000000000 Binary files a/Assets/Female3DCG/Cloth/SeethroughTop_Large_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SeethroughTop_Large_Lace.png b/Assets/Female3DCG/Cloth/SeethroughTop_Large_Lace.png deleted file mode 100644 index 6fe31c49c..000000000 Binary files a/Assets/Female3DCG/Cloth/SeethroughTop_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SeethroughTop_Normal_Design.png b/Assets/Female3DCG/Cloth/SeethroughTop_Normal_Design.png deleted file mode 100644 index 968806424..000000000 Binary files a/Assets/Female3DCG/Cloth/SeethroughTop_Normal_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SeethroughTop_Normal_Lace.png b/Assets/Female3DCG/Cloth/SeethroughTop_Normal_Lace.png deleted file mode 100644 index 07ea3c265..000000000 Binary files a/Assets/Female3DCG/Cloth/SeethroughTop_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SeethroughTop_Small_Design.png b/Assets/Female3DCG/Cloth/SeethroughTop_Small_Design.png deleted file mode 100644 index d53aa38a0..000000000 Binary files a/Assets/Female3DCG/Cloth/SeethroughTop_Small_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SeethroughTop_Small_Lace.png b/Assets/Female3DCG/Cloth/SeethroughTop_Small_Lace.png deleted file mode 100644 index 2910e4ca9..000000000 Binary files a/Assets/Female3DCG/Cloth/SeethroughTop_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SeethroughTop_XLarge_Design.png b/Assets/Female3DCG/Cloth/SeethroughTop_XLarge_Design.png deleted file mode 100644 index efe60bf11..000000000 Binary files a/Assets/Female3DCG/Cloth/SeethroughTop_XLarge_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SeethroughTop_XLarge_Lace.png b/Assets/Female3DCG/Cloth/SeethroughTop_XLarge_Lace.png deleted file mode 100644 index 71027a86f..000000000 Binary files a/Assets/Female3DCG/Cloth/SeethroughTop_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ShoulderlessTop_Large.png b/Assets/Female3DCG/Cloth/ShoulderlessTop_Large.png deleted file mode 100644 index 65be38bde..000000000 Binary files a/Assets/Female3DCG/Cloth/ShoulderlessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ShoulderlessTop_Normal.png b/Assets/Female3DCG/Cloth/ShoulderlessTop_Normal.png deleted file mode 100644 index ea62f27aa..000000000 Binary files a/Assets/Female3DCG/Cloth/ShoulderlessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ShoulderlessTop_Small.png b/Assets/Female3DCG/Cloth/ShoulderlessTop_Small.png deleted file mode 100644 index 799620923..000000000 Binary files a/Assets/Female3DCG/Cloth/ShoulderlessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/ShoulderlessTop_XLarge.png b/Assets/Female3DCG/Cloth/ShoulderlessTop_XLarge.png deleted file mode 100644 index f4f9e2d40..000000000 Binary files a/Assets/Female3DCG/Cloth/ShoulderlessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SleevelessTop_Large.png b/Assets/Female3DCG/Cloth/SleevelessTop_Large.png deleted file mode 100644 index 747086970..000000000 Binary files a/Assets/Female3DCG/Cloth/SleevelessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SleevelessTop_Normal.png b/Assets/Female3DCG/Cloth/SleevelessTop_Normal.png deleted file mode 100644 index fa9929d08..000000000 Binary files a/Assets/Female3DCG/Cloth/SleevelessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SleevelessTop_Small.png b/Assets/Female3DCG/Cloth/SleevelessTop_Small.png deleted file mode 100644 index 0b93a1976..000000000 Binary files a/Assets/Female3DCG/Cloth/SleevelessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SleevelessTop_XLarge.png b/Assets/Female3DCG/Cloth/SleevelessTop_XLarge.png deleted file mode 100644 index 757c942e2..000000000 Binary files a/Assets/Female3DCG/Cloth/SleevelessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Spread/FurCoat_Lower.png b/Assets/Female3DCG/Cloth/Spread/FurCoat_Lower.png deleted file mode 100644 index 1382cf896..000000000 Binary files a/Assets/Female3DCG/Cloth/Spread/FurCoat_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_Large_Bow.png b/Assets/Female3DCG/Cloth/StudentOutfit1_Large_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/StudentOutfit1_Large_Dress.png deleted file mode 100644 index 3eab4dd4c..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/StudentOutfit1_Large_Shirt.png deleted file mode 100644 index b0414b3d0..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_Normal_Bow.png b/Assets/Female3DCG/Cloth/StudentOutfit1_Normal_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/StudentOutfit1_Normal_Dress.png deleted file mode 100644 index 006cadfa5..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/StudentOutfit1_Normal_Shirt.png deleted file mode 100644 index b2c685caf..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_Small_Bow.png b/Assets/Female3DCG/Cloth/StudentOutfit1_Small_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/StudentOutfit1_Small_Dress.png deleted file mode 100644 index 2644cfa44..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/StudentOutfit1_Small_Shirt.png deleted file mode 100644 index 5837eb879..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_XLarge_Bow.png b/Assets/Female3DCG/Cloth/StudentOutfit1_XLarge_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/StudentOutfit1_XLarge_Dress.png deleted file mode 100644 index e2d03bd82..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/StudentOutfit1_XLarge_Shirt.png deleted file mode 100644 index 337147144..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit2_Large.png b/Assets/Female3DCG/Cloth/StudentOutfit2_Large.png deleted file mode 100644 index 7fb432404..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit2_Normal.png b/Assets/Female3DCG/Cloth/StudentOutfit2_Normal.png deleted file mode 100644 index 560fe4141..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit2_Small.png b/Assets/Female3DCG/Cloth/StudentOutfit2_Small.png deleted file mode 100644 index 39ce2ecdf..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit2_XLarge.png b/Assets/Female3DCG/Cloth/StudentOutfit2_XLarge.png deleted file mode 100644 index fbff62b72..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit3_Large_Color.png b/Assets/Female3DCG/Cloth/StudentOutfit3_Large_Color.png deleted file mode 100644 index d090291dd..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit3_Large_White.png b/Assets/Female3DCG/Cloth/StudentOutfit3_Large_White.png deleted file mode 100644 index 0831fbff4..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit3_Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit3_Normal_Color.png b/Assets/Female3DCG/Cloth/StudentOutfit3_Normal_Color.png deleted file mode 100644 index fbadf1776..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit3_Normal_White.png b/Assets/Female3DCG/Cloth/StudentOutfit3_Normal_White.png deleted file mode 100644 index 9ecdbfd03..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit3_Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit3_Small_Color.png b/Assets/Female3DCG/Cloth/StudentOutfit3_Small_Color.png deleted file mode 100644 index a03fee9c4..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit3_Small_White.png b/Assets/Female3DCG/Cloth/StudentOutfit3_Small_White.png deleted file mode 100644 index a99c155f1..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit3_Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit3_XLarge_Color.png b/Assets/Female3DCG/Cloth/StudentOutfit3_XLarge_Color.png deleted file mode 100644 index 8a05781ea..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/StudentOutfit3_XLarge_White.png b/Assets/Female3DCG/Cloth/StudentOutfit3_XLarge_White.png deleted file mode 100644 index 160592de4..000000000 Binary files a/Assets/Female3DCG/Cloth/StudentOutfit3_XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Large_Base.png b/Assets/Female3DCG/Cloth/SummerDress_Large_Base.png deleted file mode 100644 index 46449741c..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Large_Layer1.png b/Assets/Female3DCG/Cloth/SummerDress_Large_Layer1.png deleted file mode 100644 index 9498e44f7..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Large_Layer2.png b/Assets/Female3DCG/Cloth/SummerDress_Large_Layer2.png deleted file mode 100644 index 0c8248e01..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Large_Layer3.png b/Assets/Female3DCG/Cloth/SummerDress_Large_Layer3.png deleted file mode 100644 index 5762f2d6c..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Large_Layer4.png b/Assets/Female3DCG/Cloth/SummerDress_Large_Layer4.png deleted file mode 100644 index 7c640d2ba..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Normal_Base.png b/Assets/Female3DCG/Cloth/SummerDress_Normal_Base.png deleted file mode 100644 index 11a625224..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer1.png b/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer1.png deleted file mode 100644 index 766b3d758..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer2.png b/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer2.png deleted file mode 100644 index d9a9ae649..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer3.png b/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer3.png deleted file mode 100644 index 74153b387..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer4.png b/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer4.png deleted file mode 100644 index 0d40a7ea5..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Small_Base.png b/Assets/Female3DCG/Cloth/SummerDress_Small_Base.png deleted file mode 100644 index fe70b44a2..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Small_Layer1.png b/Assets/Female3DCG/Cloth/SummerDress_Small_Layer1.png deleted file mode 100644 index d6b4fe9c4..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Small_Layer2.png b/Assets/Female3DCG/Cloth/SummerDress_Small_Layer2.png deleted file mode 100644 index a08b559c2..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Small_Layer3.png b/Assets/Female3DCG/Cloth/SummerDress_Small_Layer3.png deleted file mode 100644 index 62a71f686..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_Small_Layer4.png b/Assets/Female3DCG/Cloth/SummerDress_Small_Layer4.png deleted file mode 100644 index 467edbf09..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_XLarge_Base.png b/Assets/Female3DCG/Cloth/SummerDress_XLarge_Base.png deleted file mode 100644 index 278d4861f..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer1.png b/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer1.png deleted file mode 100644 index 03749cadf..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer2.png b/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer2.png deleted file mode 100644 index 0aec5e87a..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer3.png b/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer3.png deleted file mode 100644 index 8e87737b9..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer4.png b/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer4.png deleted file mode 100644 index 5c24d2a81..000000000 Binary files a/Assets/Female3DCG/Cloth/SummerDress_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SuspenderTop1_Large.png b/Assets/Female3DCG/Cloth/SuspenderTop1_Large.png deleted file mode 100644 index c64ce07f3..000000000 Binary files a/Assets/Female3DCG/Cloth/SuspenderTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SuspenderTop1_Normal.png b/Assets/Female3DCG/Cloth/SuspenderTop1_Normal.png deleted file mode 100644 index 49c4249ae..000000000 Binary files a/Assets/Female3DCG/Cloth/SuspenderTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SuspenderTop1_Small.png b/Assets/Female3DCG/Cloth/SuspenderTop1_Small.png deleted file mode 100644 index 6f97113e8..000000000 Binary files a/Assets/Female3DCG/Cloth/SuspenderTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/SuspenderTop1_XLarge.png b/Assets/Female3DCG/Cloth/SuspenderTop1_XLarge.png deleted file mode 100644 index bda7a98cb..000000000 Binary files a/Assets/Female3DCG/Cloth/SuspenderTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Large_Dress.png b/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Large_Dress.png deleted file mode 100644 index cf51be132..000000000 Binary files a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Large_Flower.png b/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Large_Flower.png deleted file mode 100644 index 7e4849e9a..000000000 Binary files a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Large_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Normal_Dress.png b/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Normal_Dress.png deleted file mode 100644 index f015caaf9..000000000 Binary files a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Normal_Flower.png b/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Normal_Flower.png deleted file mode 100644 index 3695b81b2..000000000 Binary files a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Normal_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Small_Dress.png b/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Small_Dress.png deleted file mode 100644 index bcccb4dae..000000000 Binary files a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Small_Flower.png b/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Small_Flower.png deleted file mode 100644 index 7e9a4c71c..000000000 Binary files a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_Small_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Suspension/FlowerDress_XLarge_Dress.png deleted file mode 100644 index 2079ddce0..000000000 Binary files a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_XLarge_Flower.png b/Assets/Female3DCG/Cloth/Suspension/FlowerDress_XLarge_Flower.png deleted file mode 100644 index 27582d113..000000000 Binary files a/Assets/Female3DCG/Cloth/Suspension/FlowerDress_XLarge_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Sweater1_Large.png b/Assets/Female3DCG/Cloth/Sweater1_Large.png deleted file mode 100644 index 018e1f404..000000000 Binary files a/Assets/Female3DCG/Cloth/Sweater1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Sweater1_Normal.png b/Assets/Female3DCG/Cloth/Sweater1_Normal.png deleted file mode 100644 index 6044f1d68..000000000 Binary files a/Assets/Female3DCG/Cloth/Sweater1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Sweater1_Small.png b/Assets/Female3DCG/Cloth/Sweater1_Small.png deleted file mode 100644 index 083cf9518..000000000 Binary files a/Assets/Female3DCG/Cloth/Sweater1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Sweater1_XLarge.png b/Assets/Female3DCG/Cloth/Sweater1_XLarge.png deleted file mode 100644 index 77ddc60d3..000000000 Binary files a/Assets/Female3DCG/Cloth/Sweater1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt1_Large.png b/Assets/Female3DCG/Cloth/TShirt1_Large.png deleted file mode 100644 index e366a5902..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt1_Normal.png b/Assets/Female3DCG/Cloth/TShirt1_Normal.png deleted file mode 100644 index ed6b790d4..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt1_Small.png b/Assets/Female3DCG/Cloth/TShirt1_Small.png deleted file mode 100644 index 46a6426ad..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt1_XLarge.png b/Assets/Female3DCG/Cloth/TShirt1_XLarge.png deleted file mode 100644 index e4d9acefe..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt2BCLogo_Print.png b/Assets/Female3DCG/Cloth/TShirt2BCLogo_Print.png deleted file mode 100644 index 717259582..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt2BCLogo_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt2BDSM_Print.png b/Assets/Female3DCG/Cloth/TShirt2BDSM_Print.png deleted file mode 100644 index 4e2211df7..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt2BDSM_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt2Gag_Print.png b/Assets/Female3DCG/Cloth/TShirt2Gag_Print.png deleted file mode 100644 index 5d5d4ea25..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt2Gag_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt2Knot_Print.png b/Assets/Female3DCG/Cloth/TShirt2Knot_Print.png deleted file mode 100644 index fccbf7aeb..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt2Knot_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt2Rock_Print.png b/Assets/Female3DCG/Cloth/TShirt2Rock_Print.png deleted file mode 100644 index 5bc1115c6..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt2Rock_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt2Smile_Print.png b/Assets/Female3DCG/Cloth/TShirt2Smile_Print.png deleted file mode 100644 index 88ac0a66f..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt2Smile_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt2Tick_Print.png b/Assets/Female3DCG/Cloth/TShirt2Tick_Print.png deleted file mode 100644 index 4d95bf7c9..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt2Tick_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt2_Large_Shirt.png b/Assets/Female3DCG/Cloth/TShirt2_Large_Shirt.png deleted file mode 100644 index 3e8570785..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt2_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt2_Normal_Shirt.png b/Assets/Female3DCG/Cloth/TShirt2_Normal_Shirt.png deleted file mode 100644 index 6caca5064..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt2_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt2_Small_Shirt.png b/Assets/Female3DCG/Cloth/TShirt2_Small_Shirt.png deleted file mode 100644 index a950db299..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt2_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TShirt2_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/TShirt2_XLarge_Shirt.png deleted file mode 100644 index 004ff59f6..000000000 Binary files a/Assets/Female3DCG/Cloth/TShirt2_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Large_Jacket.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Large_Jacket.png deleted file mode 100644 index 1213499db..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Large_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Large_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Large_Shirt.png deleted file mode 100644 index b14fbe115..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Large_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Large_Trim.png deleted file mode 100644 index e986cbc79..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Normal_Jacket.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Normal_Jacket.png deleted file mode 100644 index 3b6f7ab2a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Normal_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Normal_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Normal_Shirt.png deleted file mode 100644 index b9c9e6018..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Normal_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Normal_Trim.png deleted file mode 100644 index cac834ba0..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Small_Jacket.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Small_Jacket.png deleted file mode 100644 index c365266be..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Small_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Small_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Small_Shirt.png deleted file mode 100644 index d91747fcb..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Small_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Small_Trim.png deleted file mode 100644 index fcae2b04c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_XLarge_Jacket.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_XLarge_Jacket.png deleted file mode 100644 index 7c9c35973..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_XLarge_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_XLarge_Shirt.png deleted file mode 100644 index 49b954f7f..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_XLarge_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_XLarge_Trim.png deleted file mode 100644 index fd835169b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdmiralTop_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Large_Dress.png deleted file mode 100644 index a30827994..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Large_Sash.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Large_Sash.png deleted file mode 100644 index 2129e3b2c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Large_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Large_Trim.png deleted file mode 100644 index c3fbe6435..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Normal_Dress.png deleted file mode 100644 index 30d2a5ccd..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Normal_Sash.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Normal_Sash.png deleted file mode 100644 index c52878be1..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Normal_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Normal_Trim.png deleted file mode 100644 index 79751704c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Small_Dress.png deleted file mode 100644 index 36bd27dfe..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Small_Sash.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Small_Sash.png deleted file mode 100644 index 79add8605..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Small_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Small_Trim.png deleted file mode 100644 index 76b4796e0..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_XLarge_Dress.png deleted file mode 100644 index 2f1f3b4f9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_XLarge_Sash.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_XLarge_Sash.png deleted file mode 100644 index 26b0fe7ef..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_XLarge_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_XLarge_Trim.png deleted file mode 100644 index a8d06e05e..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Large_Bow.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Large_Bow.png deleted file mode 100644 index 445c1d190..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Large_Dress.png deleted file mode 100644 index aab07f28c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Large_Lace.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Large_Lace.png deleted file mode 100644 index 8c4d32b81..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Normal_Bow.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Normal_Bow.png deleted file mode 100644 index 76c241e51..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Normal_Dress.png deleted file mode 100644 index e1c7e8d34..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Normal_Lace.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Normal_Lace.png deleted file mode 100644 index 70bdfc14d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Small_Bow.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Small_Bow.png deleted file mode 100644 index 5fe535b59..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Small_Dress.png deleted file mode 100644 index a57c503e7..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Small_Lace.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Small_Lace.png deleted file mode 100644 index acfdce1de..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_XLarge_Bow.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_XLarge_Bow.png deleted file mode 100644 index c4ee1c721..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_XLarge_Dress.png deleted file mode 100644 index f4030d661..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_XLarge_Lace.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_XLarge_Lace.png deleted file mode 100644 index 084868a4f..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress2_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Large_Belt.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Large_Belt.png deleted file mode 100644 index 793b0092b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Large_Collar.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Large_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Large_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Large_Dress.png deleted file mode 100644 index 6ce8a906a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Normal_Belt.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Normal_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Normal_Collar.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Normal_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Normal_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Normal_Dress.png deleted file mode 100644 index d342a0956..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Small_Belt.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Small_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Small_Collar.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Small_Collar.png deleted file mode 100644 index e1d288227..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Small_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Small_Dress.png deleted file mode 100644 index d155334a3..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_XLarge_Belt.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_XLarge_Belt.png deleted file mode 100644 index 242ed4478..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_XLarge_Collar.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_XLarge_Collar.png deleted file mode 100644 index cc1c5ce81..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_XLarge_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_XLarge_Dress.png deleted file mode 100644 index 0fc13d142..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress3_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_Large.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_Large.png deleted file mode 100644 index 2dd4be62a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_Normal.png deleted file mode 100644 index e46e40e99..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_Small.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_Small.png deleted file mode 100644 index e5a5554d5..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_XLarge.png deleted file mode 100644 index cf54d92e9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/AdultBabyDress4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Large_Dress.png deleted file mode 100644 index 9e1a59773..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Large_Trim.png deleted file mode 100644 index 4848b503e..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Normal_Dress.png deleted file mode 100644 index 4fb1d60cb..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Normal_Trim.png deleted file mode 100644 index e7453352a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Small_Dress.png deleted file mode 100644 index d025a4895..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Small_Trim.png deleted file mode 100644 index a12084d90..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_XLarge_Dress.png deleted file mode 100644 index b7ef92305..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_XLarge_Trim.png deleted file mode 100644 index c6826313d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BabydollDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Blouse1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/Blouse1_Large.png deleted file mode 100644 index 02fd96539..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Blouse1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Blouse1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/Blouse1_Normal.png deleted file mode 100644 index bdc1036b5..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Blouse1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Blouse1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/Blouse1_Small.png deleted file mode 100644 index ca0a232a3..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Blouse1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Blouse1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/Blouse1_XLarge.png deleted file mode 100644 index 365c9e9a5..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Blouse1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Large_Base.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Large_Base.png deleted file mode 100644 index 219772308..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Large_Pattern.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Large_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Large_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Large_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Large_Trim.png deleted file mode 100644 index 7fe15355c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Normal_Base.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Normal_Base.png deleted file mode 100644 index 97f60e5ed..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Normal_Pattern.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Normal_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Normal_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Normal_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Normal_Trim.png deleted file mode 100644 index 93cbe63ab..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Small_Base.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Small_Base.png deleted file mode 100644 index da5663e24..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Small_Pattern.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Small_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Small_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Small_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Small_Trim.png deleted file mode 100644 index 08fb88b1d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_XLarge_Base.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_XLarge_Base.png deleted file mode 100644 index 8b59ea5b7..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_XLarge_Pattern.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_XLarge_Pattern.png deleted file mode 100644 index 3c0f6c92a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_XLarge_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/Bodice1_XLarge_Trim.png deleted file mode 100644 index a0049da95..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Bodice1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_Large.png deleted file mode 100644 index 7b609fe2e..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_Normal.png deleted file mode 100644 index c38f6ed57..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_Small.png deleted file mode 100644 index bedd4b166..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_XLarge.png deleted file mode 100644 index 6a82a8c1c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BodyTowel1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_Large.png deleted file mode 100644 index 4d60463c3..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_Normal.png deleted file mode 100644 index 857335240..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_Small.png deleted file mode 100644 index da44b9797..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_XLarge.png deleted file mode 100644 index 8b00bf184..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_Large.png b/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_Large.png deleted file mode 100644 index 4c1c5cb3a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_Normal.png deleted file mode 100644 index 6ddda67c7..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_Small.png b/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_Small.png deleted file mode 100644 index 79546443b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_XLarge.png deleted file mode 100644 index ceef0df77..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageBustier2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_Large.png deleted file mode 100644 index 4538f3bbd..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_Normal.png deleted file mode 100644 index 9ef22bd54..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_Small.png deleted file mode 100644 index e9ae8eb25..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_XLarge.png deleted file mode 100644 index 4692b26de..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_Large.png b/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_Large.png deleted file mode 100644 index 49172e0d9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_Normal.png deleted file mode 100644 index 32b2cf54d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_Small.png b/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_Small.png deleted file mode 100644 index e15ada08b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_XLarge.png deleted file mode 100644 index 1ebb4f24a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BondageDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_Large.png deleted file mode 100644 index d022b9733..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_Normal.png deleted file mode 100644 index cd32c2cd9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_Small.png deleted file mode 100644 index f465c547f..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_XLarge.png deleted file mode 100644 index 7e20a81f1..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/BridesmaidDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_Large.png deleted file mode 100644 index a920fd4b7..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_Normal.png deleted file mode 100644 index 13656d369..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_Small.png deleted file mode 100644 index 6acf7bd15..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_XLarge.png deleted file mode 100644 index 4e2bfc211..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_LargePink_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_LargePink_Dress.png deleted file mode 100644 index d6b2c0e13..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_LargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_LargePurple_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_LargePurple_Dress.png deleted file mode 100644 index 58f882e57..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_LargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Large_Dress.png deleted file mode 100644 index b5b8c7c8a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Large_Edges.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Large_Edges.png deleted file mode 100644 index 8b896df40..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Large_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_NormalPink_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_NormalPink_Dress.png deleted file mode 100644 index 9fd1df4f8..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_NormalPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_NormalPurple_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_NormalPurple_Dress.png deleted file mode 100644 index b1c59397c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_NormalPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Normal_Dress.png deleted file mode 100644 index 18993f2f4..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Normal_Edges.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Normal_Edges.png deleted file mode 100644 index 45c82ae7e..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Normal_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_SmallPink_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_SmallPink_Dress.png deleted file mode 100644 index c52e6330e..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_SmallPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_SmallPurple_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_SmallPurple_Dress.png deleted file mode 100644 index 68473c5ce..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_SmallPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Small_Dress.png deleted file mode 100644 index fbe2b8245..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Small_Edges.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Small_Edges.png deleted file mode 100644 index af0872b38..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_Small_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLargePink_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLargePink_Dress.png deleted file mode 100644 index 98f6f5919..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLargePurple_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLargePurple_Dress.png deleted file mode 100644 index 32111de4b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLarge_Dress.png deleted file mode 100644 index 6e0fc27c5..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLarge_Edges.png b/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLarge_Edges.png deleted file mode 100644 index 743dd7ad3..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ChineseDress2_XLarge_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Large_Shirt.png deleted file mode 100644 index 350b3e5dc..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Large_Tie.png b/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Large_Tie.png deleted file mode 100644 index fbed4b647..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Large_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Normal_Shirt.png deleted file mode 100644 index b7feec298..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Normal_Tie.png b/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Normal_Tie.png deleted file mode 100644 index 712d4ec5a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Normal_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Small_Shirt.png deleted file mode 100644 index 1c6be74e9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Small_Tie.png b/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Small_Tie.png deleted file mode 100644 index e964a9e22..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_Small_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_XLarge_Shirt.png deleted file mode 100644 index 65f56ec64..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_XLarge_Tie.png b/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_XLarge_Tie.png deleted file mode 100644 index 8f8ea64b6..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CollegeOutfit1_XLarge_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_Large.png b/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_Large.png deleted file mode 100644 index a561e2a43..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_Normal.png deleted file mode 100644 index eac8b98f5..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_Small.png b/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_Small.png deleted file mode 100644 index 13cb4fa67..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_XLarge.png deleted file mode 100644 index e99e0a3b7..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ComfyTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Large.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Large.png deleted file mode 100644 index fe9098136..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Large_Corset.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Large_Corset.png deleted file mode 100644 index fc72f4a20..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Large_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Large_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Large_Shirt.png deleted file mode 100644 index 792bd8fa0..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Normal.png deleted file mode 100644 index c8561f3af..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Normal_Corset.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Normal_Corset.png deleted file mode 100644 index 532358d87..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Normal_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Normal_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Normal_Shirt.png deleted file mode 100644 index 2f569e354..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Small.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Small.png deleted file mode 100644 index c8561f3af..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Small_Corset.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Small_Corset.png deleted file mode 100644 index 532358d87..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Small_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Small_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Small_Shirt.png deleted file mode 100644 index 2f569e354..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_XLarge.png deleted file mode 100644 index fe9098136..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_XLarge_Corset.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_XLarge_Corset.png deleted file mode 100644 index fc72f4a20..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_XLarge_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_XLarge_Shirt.png deleted file mode 100644 index 792bd8fa0..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/CorsetShirt_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Dress2_Large.png b/Assets/Female3DCG/Cloth/TapedHands/Dress2_Large.png deleted file mode 100644 index b0a39022b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Dress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Dress2_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/Dress2_Normal.png deleted file mode 100644 index dcc704cae..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Dress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Dress2_Small.png b/Assets/Female3DCG/Cloth/TapedHands/Dress2_Small.png deleted file mode 100644 index 5cb1b6260..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Dress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Dress2_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/Dress2_XLarge.png deleted file mode 100644 index 2969da827..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Dress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Dress3_Large.png b/Assets/Female3DCG/Cloth/TapedHands/Dress3_Large.png deleted file mode 100644 index 5d7c1cabf..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Dress3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Dress3_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/Dress3_Normal.png deleted file mode 100644 index 6a90449a7..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Dress3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Dress3_Small.png b/Assets/Female3DCG/Cloth/TapedHands/Dress3_Small.png deleted file mode 100644 index 884916221..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Dress3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Dress3_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/Dress3_XLarge.png deleted file mode 100644 index f5ebf32db..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Dress3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Large_Fabric.png b/Assets/Female3DCG/Cloth/TapedHands/DressFur_Large_Fabric.png deleted file mode 100644 index 8b1d68e56..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Large_Fur.png b/Assets/Female3DCG/Cloth/TapedHands/DressFur_Large_Fur.png deleted file mode 100644 index 71df548f7..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Normal_Fabric.png b/Assets/Female3DCG/Cloth/TapedHands/DressFur_Normal_Fabric.png deleted file mode 100644 index b60c1b8a4..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Normal_Fur.png b/Assets/Female3DCG/Cloth/TapedHands/DressFur_Normal_Fur.png deleted file mode 100644 index 711020107..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Small_Fabric.png b/Assets/Female3DCG/Cloth/TapedHands/DressFur_Small_Fabric.png deleted file mode 100644 index 4eacf812d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Small_Fur.png b/Assets/Female3DCG/Cloth/TapedHands/DressFur_Small_Fur.png deleted file mode 100644 index 0e15ac960..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/DressFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/DressFur_XLarge_Fabric.png b/Assets/Female3DCG/Cloth/TapedHands/DressFur_XLarge_Fabric.png deleted file mode 100644 index b22b33725..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/DressFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/DressFur_XLarge_Fur.png b/Assets/Female3DCG/Cloth/TapedHands/DressFur_XLarge_Fur.png deleted file mode 100644 index f8ff38d5d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/DressFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Large_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Large_Dress.png deleted file mode 100644 index 6420ea24d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Large_Flower.png b/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Large_Flower.png deleted file mode 100644 index 0fe57a834..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Large_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Normal_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Normal_Dress.png deleted file mode 100644 index 1ce6e6f9c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Normal_Flower.png b/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Normal_Flower.png deleted file mode 100644 index f9a431623..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Normal_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Small_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Small_Dress.png deleted file mode 100644 index 712994d56..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Small_Flower.png b/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Small_Flower.png deleted file mode 100644 index c7d872ad6..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_Small_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_XLarge_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_XLarge_Dress.png deleted file mode 100644 index 356fb9380..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_XLarge_Flower.png b/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_XLarge_Flower.png deleted file mode 100644 index 5686a3cca..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/FlowerDress_XLarge_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/FurCoat_Upper.png b/Assets/Female3DCG/Cloth/TapedHands/FurCoat_Upper.png deleted file mode 100644 index 99ae85b00..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/FurCoat_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/Gown1_Large.png deleted file mode 100644 index 87d72370d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/Gown1_Normal.png deleted file mode 100644 index a2ef948e1..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/Gown1_Small.png deleted file mode 100644 index 3b9640086..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/Gown1_XLarge.png deleted file mode 100644 index 5f07b6481..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_Large.png b/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_Large.png deleted file mode 100644 index a1d81b38d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_Normal.png deleted file mode 100644 index 36e2f12a9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_Small.png b/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_Small.png deleted file mode 100644 index 27ca1707f..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_XLarge.png deleted file mode 100644 index 2b747b8f8..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown2Top_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown3_Large.png b/Assets/Female3DCG/Cloth/TapedHands/Gown3_Large.png deleted file mode 100644 index 649d85c10..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown3_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/Gown3_Normal.png deleted file mode 100644 index f215829fa..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown3_Small.png b/Assets/Female3DCG/Cloth/TapedHands/Gown3_Small.png deleted file mode 100644 index c63c66bca..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Gown3_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/Gown3_XLarge.png deleted file mode 100644 index c74d144e9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Gown3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_BackSkirt.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_BackSkirt.png deleted file mode 100644 index e6ff11224..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_BackSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Base.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Base.png deleted file mode 100644 index d468626f7..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Belt.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Belt.png deleted file mode 100644 index 490febbfa..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Buckle.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Buckle.png deleted file mode 100644 index 0fb758187..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Trim.png deleted file mode 100644 index 44f42a8ec..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Base.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Base.png deleted file mode 100644 index a8e09ffd0..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Belt.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Belt.png deleted file mode 100644 index 6c8457d2d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Buckle.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Buckle.png deleted file mode 100644 index 679247f8d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Trim.png deleted file mode 100644 index 4160a0596..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Base.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Base.png deleted file mode 100644 index 1390e1599..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Belt.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Belt.png deleted file mode 100644 index 290d51bfc..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Buckle.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Buckle.png deleted file mode 100644 index b11836cb6..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Trim.png deleted file mode 100644 index f8dd9d574..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Base.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Base.png deleted file mode 100644 index d366ea9f8..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Belt.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Belt.png deleted file mode 100644 index ec1c42c84..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Buckle.png deleted file mode 100644 index cc20a702d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Trim.png b/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Trim.png deleted file mode 100644 index 2fa0772ef..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/GrandMage_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Jacket_Base.png b/Assets/Female3DCG/Cloth/TapedHands/Jacket_Base.png deleted file mode 100644 index 5569a3d74..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Jacket_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_Large.png b/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_Large.png deleted file mode 100644 index d9291cbbc..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_Normal.png deleted file mode 100644 index e5bfd1266..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_Small.png b/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_Small.png deleted file mode 100644 index d8be602da..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_XLarge.png deleted file mode 100644 index 614fff240..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LaceBabydoll_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_Large.png b/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_Large.png deleted file mode 100644 index 87868caf9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_LargeNonLaced.png b/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_LargeNonLaced.png deleted file mode 100644 index 3d1b96a0e..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_LargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_Normal.png deleted file mode 100644 index 4055e832e..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_NormalNonLaced.png b/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_NormalNonLaced.png deleted file mode 100644 index 09da2eb36..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_NormalNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_Small.png b/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_Small.png deleted file mode 100644 index 06d9c83c2..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_SmallNonLaced.png b/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_SmallNonLaced.png deleted file mode 100644 index dfacdcd78..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_SmallNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_XLarge.png deleted file mode 100644 index e7cc58bda..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_XLargeNonLaced.png b/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_XLargeNonLaced.png deleted file mode 100644 index 310288b81..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexLacedSuit_XLargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexTop_Large.png b/Assets/Female3DCG/Cloth/TapedHands/LatexTop_Large.png deleted file mode 100644 index aecd75d3f..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexTop_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/LatexTop_Normal.png deleted file mode 100644 index 4d8369041..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexTop_Small.png b/Assets/Female3DCG/Cloth/TapedHands/LatexTop_Small.png deleted file mode 100644 index afbeb7422..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LatexTop_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/LatexTop_XLarge.png deleted file mode 100644 index 1b024c320..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LatexTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_Large.png b/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_Large.png deleted file mode 100644 index 25bb83f08..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_Normal.png deleted file mode 100644 index 4ee7dd93f..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_Small.png b/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_Small.png deleted file mode 100644 index ff98f2f19..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_XLarge.png deleted file mode 100644 index a6313bd5b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LeatherBolero_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_Large.png b/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_Large.png deleted file mode 100644 index 648275109..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_Normal.png deleted file mode 100644 index ad811f348..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_Small.png b/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_Small.png deleted file mode 100644 index e78f5df94..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_XLarge.png deleted file mode 100644 index fb5f1bed6..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/LeatherCropTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_Large.png deleted file mode 100644 index d9336a968..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_Normal.png deleted file mode 100644 index d710f52bc..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_Small.png deleted file mode 100644 index 2ddde972b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_XLarge.png deleted file mode 100644 index dc9253ef9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidApron1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_Large.png b/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_Large.png deleted file mode 100644 index 1a89ad1e2..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_Normal.png deleted file mode 100644 index 150974896..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_Small.png b/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_Small.png deleted file mode 100644 index 813c91958..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_XLarge.png deleted file mode 100644 index 8817288e2..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidApron2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Large_Apron.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Large_Apron.png deleted file mode 100644 index 268505d4f..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Large_Dress.png deleted file mode 100644 index 4f6cd4968..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Large_Frills.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Large_Frills.png deleted file mode 100644 index d227afa2b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Normal_Apron.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Normal_Apron.png deleted file mode 100644 index a1b6bf14c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Normal_Dress.png deleted file mode 100644 index 29e0ea163..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Normal_Frills.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Normal_Frills.png deleted file mode 100644 index 390442789..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Small_Apron.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Small_Apron.png deleted file mode 100644 index 2bcf7e1e9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Small_Dress.png deleted file mode 100644 index 13848961e..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Small_Frills.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Small_Frills.png deleted file mode 100644 index b3d127d00..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_XLarge_Apron.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_XLarge_Apron.png deleted file mode 100644 index 84c4d857b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_XLarge_Dress.png deleted file mode 100644 index f0de927d3..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_XLarge_Frills.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_XLarge_Frills.png deleted file mode 100644 index 1ecc4452d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit1_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Large_Apron.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Large_Apron.png deleted file mode 100644 index eb2bf0393..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Large_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Large_Dress.png deleted file mode 100644 index 496d5d16c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Large_Frills.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Large_Frills.png deleted file mode 100644 index 2274b4d5e..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Normal_Apron.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Normal_Apron.png deleted file mode 100644 index 5a95c1ba9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Normal_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Normal_Dress.png deleted file mode 100644 index dcc92c8f7..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Normal_Frills.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Normal_Frills.png deleted file mode 100644 index 6c57f53c2..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Small_Apron.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Small_Apron.png deleted file mode 100644 index 0e5d51ef2..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Small_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Small_Dress.png deleted file mode 100644 index 5ef22d09a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Small_Frills.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Small_Frills.png deleted file mode 100644 index 0ce2affc8..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_XLarge_Apron.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_XLarge_Apron.png deleted file mode 100644 index 1659e3040..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_XLarge_Dress.png deleted file mode 100644 index c8dfeb115..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_XLarge_Frills.png b/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_XLarge_Frills.png deleted file mode 100644 index 93eac4330..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MaidOutfit2_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MistressTop_Large.png b/Assets/Female3DCG/Cloth/TapedHands/MistressTop_Large.png deleted file mode 100644 index d390102f2..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MistressTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MistressTop_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/MistressTop_Normal.png deleted file mode 100644 index 82694122c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MistressTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MistressTop_Small.png b/Assets/Female3DCG/Cloth/TapedHands/MistressTop_Small.png deleted file mode 100644 index ce85e6661..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MistressTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/MistressTop_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/MistressTop_XLarge.png deleted file mode 100644 index ff72da762..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/MistressTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_Large.png b/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_Large.png deleted file mode 100644 index 6c1699596..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_Normal.png deleted file mode 100644 index 384e4058a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_Small.png b/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_Small.png deleted file mode 100644 index 357ae9c44..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_XLarge.png deleted file mode 100644 index ccc792fd0..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/NurseUniform_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Robe1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/Robe1_Large.png deleted file mode 100644 index 08c7786e8..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Robe1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Robe1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/Robe1_Normal.png deleted file mode 100644 index 9a9bfa4cb..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Robe1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Robe1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/Robe1_Small.png deleted file mode 100644 index 5674c7e0f..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Robe1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Robe1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/Robe1_XLarge.png deleted file mode 100644 index b5888b0f3..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Robe1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_Large.png b/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_Large.png deleted file mode 100644 index 81c6d0841..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_Normal.png deleted file mode 100644 index 56a6810ef..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_Small.png b/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_Small.png deleted file mode 100644 index 799620923..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_XLarge.png deleted file mode 100644 index f4f9e2d40..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/ShoulderlessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_Large.png b/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_Large.png deleted file mode 100644 index 2eb6e4860..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_Normal.png deleted file mode 100644 index 2e1e1d2b1..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_Small.png b/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_Small.png deleted file mode 100644 index f48c71bcc..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_XLarge.png deleted file mode 100644 index 913c20a42..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SleevelessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Bow.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Buckle.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Buckle.png deleted file mode 100644 index 9786715f9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Dress.png deleted file mode 100644 index f350b7987..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Shirt.png deleted file mode 100644 index b0414b3d0..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Bow.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Buckle.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Buckle.png deleted file mode 100644 index 5cb83366b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Dress.png deleted file mode 100644 index 2712af5c8..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Shirt.png deleted file mode 100644 index b2c685caf..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Bow.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Buckle.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Buckle.png deleted file mode 100644 index 6bea1d2dc..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Dress.png deleted file mode 100644 index 99c891d46..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Shirt.png deleted file mode 100644 index 5837eb879..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Bow.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Bow.png deleted file mode 100644 index 0fb49076c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Buckle.png deleted file mode 100644 index 187fbf3d2..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Dress.png deleted file mode 100644 index 47d040fe3..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Shirt.png deleted file mode 100644 index 337147144..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_Large.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_Large.png deleted file mode 100644 index f50c9571f..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_Normal.png deleted file mode 100644 index 988f39acf..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_Small.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_Small.png deleted file mode 100644 index 4b9c93039..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_XLarge.png deleted file mode 100644 index eb8153128..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Large_Color.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Large_Color.png deleted file mode 100644 index 1b85a8837..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Large_White.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Large_White.png deleted file mode 100644 index dc79c3b08..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Normal_Color.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Normal_Color.png deleted file mode 100644 index 90cf31012..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Normal_White.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Normal_White.png deleted file mode 100644 index 21f4a2f38..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Small_Color.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Small_Color.png deleted file mode 100644 index b3fbbdc58..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Small_White.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Small_White.png deleted file mode 100644 index cb53c71da..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_XLarge_Color.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_XLarge_Color.png deleted file mode 100644 index 9611d16ca..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_XLarge_White.png b/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_XLarge_White.png deleted file mode 100644 index 3ecc15b4f..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/StudentOutfit3_XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Base.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Base.png deleted file mode 100644 index 2b26c816c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer1.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer1.png deleted file mode 100644 index 9498e44f7..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer2.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer2.png deleted file mode 100644 index f53739c3d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer3.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer3.png deleted file mode 100644 index 5762f2d6c..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer4.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer4.png deleted file mode 100644 index 7c640d2ba..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Base.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Base.png deleted file mode 100644 index c60fd7ab1..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer1.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer1.png deleted file mode 100644 index 766b3d758..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer2.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer2.png deleted file mode 100644 index d9a9ae649..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer3.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer3.png deleted file mode 100644 index 74153b387..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer4.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer4.png deleted file mode 100644 index 0d40a7ea5..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Base.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Base.png deleted file mode 100644 index e6617e735..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer1.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer1.png deleted file mode 100644 index d6b4fe9c4..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer2.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer2.png deleted file mode 100644 index a08b559c2..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer3.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer3.png deleted file mode 100644 index 62a71f686..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer4.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer4.png deleted file mode 100644 index 467edbf09..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Base.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Base.png deleted file mode 100644 index 910730845..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer1.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer1.png deleted file mode 100644 index 03749cadf..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer2.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer2.png deleted file mode 100644 index 427566fc6..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer3.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer3.png deleted file mode 100644 index 8e87737b9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer4.png b/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer4.png deleted file mode 100644 index 5c24d2a81..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SummerDress_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_Large.png deleted file mode 100644 index fc76aa559..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_Normal.png deleted file mode 100644 index 30c147551..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_Small.png deleted file mode 100644 index 1c410400d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_XLarge.png deleted file mode 100644 index 5cb12a1da..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/SuspenderTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Sweater1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/Sweater1_Large.png deleted file mode 100644 index 17a6e9a38..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Sweater1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Sweater1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/Sweater1_Normal.png deleted file mode 100644 index cb21f7a83..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Sweater1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Sweater1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/Sweater1_Small.png deleted file mode 100644 index 201a1eea2..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Sweater1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Sweater1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/Sweater1_XLarge.png deleted file mode 100644 index 83738d05a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Sweater1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt1_Large.png deleted file mode 100644 index 322ad6e03..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt1_Normal.png deleted file mode 100644 index b9453ae4d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt1_Small.png deleted file mode 100644 index 747412207..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt1_XLarge.png deleted file mode 100644 index 710a65757..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt2BCLogo_Print.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt2BCLogo_Print.png deleted file mode 100644 index 717259582..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt2BCLogo_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt2BDSM_Print.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt2BDSM_Print.png deleted file mode 100644 index 62f576eb9..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt2BDSM_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt2Gag_Print.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt2Gag_Print.png deleted file mode 100644 index 5d5d4ea25..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt2Gag_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt2Knot_Print.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt2Knot_Print.png deleted file mode 100644 index de16f53e4..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt2Knot_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt2Rock_Print.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt2Rock_Print.png deleted file mode 100644 index 34cab3760..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt2Rock_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt2Smile_Print.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt2Smile_Print.png deleted file mode 100644 index c6c67db94..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt2Smile_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt2Tick_Print.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt2Tick_Print.png deleted file mode 100644 index fb69e1ad4..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt2Tick_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt2_Large_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt2_Large_Shirt.png deleted file mode 100644 index a719c0499..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt2_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt2_Normal_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt2_Normal_Shirt.png deleted file mode 100644 index 1c57f9740..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt2_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt2_Small_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt2_Small_Shirt.png deleted file mode 100644 index 23e3acbe1..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt2_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TShirt2_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/TapedHands/TShirt2_XLarge_Shirt.png deleted file mode 100644 index 3d3b17f84..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TShirt2_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_Large.png deleted file mode 100644 index ed6ac0373..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_Normal.png deleted file mode 100644 index b8d270002..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_Small.png deleted file mode 100644 index f75a6df59..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_XLarge.png deleted file mode 100644 index d5af9d84f..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TeacherOutfit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_Large.png deleted file mode 100644 index cf1b60014..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_Normal.png deleted file mode 100644 index ca72b8190..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_Small.png deleted file mode 100644 index 6bbd26335..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_XLarge.png deleted file mode 100644 index 1b9fdd589..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/TennisShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_Large.png deleted file mode 100644 index 204d7389b..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_Normal.png deleted file mode 100644 index 7c318a365..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_Small.png deleted file mode 100644 index 881bbda0a..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_XLarge.png deleted file mode 100644 index d48ec45de..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/VirginKiller1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_Large.png deleted file mode 100644 index 252537ea5..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_Normal.png deleted file mode 100644 index 82c2129f3..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_Small.png deleted file mode 100644 index 911f50624..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_XLarge.png deleted file mode 100644 index 0a46e4eb1..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_Large.png deleted file mode 100644 index 5f0d310cc..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_Normal.png deleted file mode 100644 index 1cb48ec15..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_Small.png deleted file mode 100644 index de1260bf2..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_XLarge.png deleted file mode 100644 index 8888855da..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Yukata1_Large.png b/Assets/Female3DCG/Cloth/TapedHands/Yukata1_Large.png deleted file mode 100644 index b64705773..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Yukata1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Yukata1_Normal.png b/Assets/Female3DCG/Cloth/TapedHands/Yukata1_Normal.png deleted file mode 100644 index 1775fb2d2..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Yukata1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Yukata1_Small.png b/Assets/Female3DCG/Cloth/TapedHands/Yukata1_Small.png deleted file mode 100644 index 05dabb0c5..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Yukata1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TapedHands/Yukata1_XLarge.png b/Assets/Female3DCG/Cloth/TapedHands/Yukata1_XLarge.png deleted file mode 100644 index c74e42c1d..000000000 Binary files a/Assets/Female3DCG/Cloth/TapedHands/Yukata1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TeacherOutfit1_Large.png b/Assets/Female3DCG/Cloth/TeacherOutfit1_Large.png deleted file mode 100644 index ec6fceb3f..000000000 Binary files a/Assets/Female3DCG/Cloth/TeacherOutfit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TeacherOutfit1_Normal.png b/Assets/Female3DCG/Cloth/TeacherOutfit1_Normal.png deleted file mode 100644 index 4cac18c61..000000000 Binary files a/Assets/Female3DCG/Cloth/TeacherOutfit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TeacherOutfit1_Small.png b/Assets/Female3DCG/Cloth/TeacherOutfit1_Small.png deleted file mode 100644 index d0c84cce5..000000000 Binary files a/Assets/Female3DCG/Cloth/TeacherOutfit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TeacherOutfit1_XLarge.png b/Assets/Female3DCG/Cloth/TeacherOutfit1_XLarge.png deleted file mode 100644 index 7d73bd117..000000000 Binary files a/Assets/Female3DCG/Cloth/TeacherOutfit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TennisShirt1_Large.png b/Assets/Female3DCG/Cloth/TennisShirt1_Large.png deleted file mode 100644 index a0599fb1b..000000000 Binary files a/Assets/Female3DCG/Cloth/TennisShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TennisShirt1_Normal.png b/Assets/Female3DCG/Cloth/TennisShirt1_Normal.png deleted file mode 100644 index 59f06074b..000000000 Binary files a/Assets/Female3DCG/Cloth/TennisShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TennisShirt1_Small.png b/Assets/Female3DCG/Cloth/TennisShirt1_Small.png deleted file mode 100644 index c3a374f82..000000000 Binary files a/Assets/Female3DCG/Cloth/TennisShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/TennisShirt1_XLarge.png b/Assets/Female3DCG/Cloth/TennisShirt1_XLarge.png deleted file mode 100644 index 7ceaa9dff..000000000 Binary files a/Assets/Female3DCG/Cloth/TennisShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/VirginKiller1_Large.png b/Assets/Female3DCG/Cloth/VirginKiller1_Large.png deleted file mode 100644 index fc37778fe..000000000 Binary files a/Assets/Female3DCG/Cloth/VirginKiller1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/VirginKiller1_Normal.png b/Assets/Female3DCG/Cloth/VirginKiller1_Normal.png deleted file mode 100644 index 8bab63531..000000000 Binary files a/Assets/Female3DCG/Cloth/VirginKiller1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/VirginKiller1_Small.png b/Assets/Female3DCG/Cloth/VirginKiller1_Small.png deleted file mode 100644 index f365be1dc..000000000 Binary files a/Assets/Female3DCG/Cloth/VirginKiller1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/VirginKiller1_XLarge.png b/Assets/Female3DCG/Cloth/VirginKiller1_XLarge.png deleted file mode 100644 index 7ef3009ea..000000000 Binary files a/Assets/Female3DCG/Cloth/VirginKiller1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/WeddingDress1_Large.png deleted file mode 100644 index 5e458d27e..000000000 Binary files a/Assets/Female3DCG/Cloth/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/WeddingDress1_Normal.png deleted file mode 100644 index 068c6ef4e..000000000 Binary files a/Assets/Female3DCG/Cloth/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/WeddingDress1_Small.png deleted file mode 100644 index 6c43cc502..000000000 Binary files a/Assets/Female3DCG/Cloth/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/WeddingDress1_XLarge.png deleted file mode 100644 index d2e702b96..000000000 Binary files a/Assets/Female3DCG/Cloth/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/WeddingDress2_Large.png deleted file mode 100644 index 585a0762f..000000000 Binary files a/Assets/Female3DCG/Cloth/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/WeddingDress2_Normal.png deleted file mode 100644 index 8d0b2f00a..000000000 Binary files a/Assets/Female3DCG/Cloth/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/WeddingDress2_Small.png deleted file mode 100644 index cd8ccf80c..000000000 Binary files a/Assets/Female3DCG/Cloth/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/WeddingDress2_XLarge.png deleted file mode 100644 index f8167ca0c..000000000 Binary files a/Assets/Female3DCG/Cloth/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Large_Jacket.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Large_Jacket.png deleted file mode 100644 index 7db711902..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Large_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Large_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Large_Shirt.png deleted file mode 100644 index 438518045..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Large_Trim.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Large_Trim.png deleted file mode 100644 index e75cbcbf1..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Normal_Jacket.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Normal_Jacket.png deleted file mode 100644 index 01044d013..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Normal_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Normal_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Normal_Shirt.png deleted file mode 100644 index af0b07a6f..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Normal_Trim.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Normal_Trim.png deleted file mode 100644 index fc2b30ccb..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Small_Jacket.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Small_Jacket.png deleted file mode 100644 index 1e7871aeb..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Small_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Small_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Small_Shirt.png deleted file mode 100644 index abcb14829..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Small_Trim.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Small_Trim.png deleted file mode 100644 index a549c6ef6..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_XLarge_Jacket.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_XLarge_Jacket.png deleted file mode 100644 index 843c186a7..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_XLarge_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_XLarge_Shirt.png deleted file mode 100644 index 7c557ce63..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_XLarge_Trim.png b/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_XLarge_Trim.png deleted file mode 100644 index 2e0d1709e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdmiralTop_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Large_Dress.png deleted file mode 100644 index d53f4da3b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Large_Sash.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Large_Sash.png deleted file mode 100644 index e1b57f943..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Large_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Large_Trim.png deleted file mode 100644 index dc614d980..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Normal_Dress.png deleted file mode 100644 index 76d9aac41..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Normal_Sash.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Normal_Sash.png deleted file mode 100644 index 1d5bf45cc..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Normal_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Normal_Trim.png deleted file mode 100644 index f2524cc1c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Small_Dress.png deleted file mode 100644 index 9eb578704..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Small_Sash.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Small_Sash.png deleted file mode 100644 index ab31a3bd1..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Small_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Small_Trim.png deleted file mode 100644 index 87c20197c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_XLarge_Dress.png deleted file mode 100644 index 4ac212790..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_XLarge_Sash.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_XLarge_Sash.png deleted file mode 100644 index a10fc8e0d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_XLarge_Sash.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_XLarge_Trim.png deleted file mode 100644 index 641f90b34..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Large_Bow.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Large_Bow.png deleted file mode 100644 index 445c1d190..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Large_Dress.png deleted file mode 100644 index f27691d73..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Large_Lace.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Large_Lace.png deleted file mode 100644 index 1a7623eff..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Large_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Normal_Bow.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Normal_Bow.png deleted file mode 100644 index 76c241e51..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Normal_Dress.png deleted file mode 100644 index 1c1ff1538..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Normal_Lace.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Normal_Lace.png deleted file mode 100644 index 562e14082..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Normal_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Small_Bow.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Small_Bow.png deleted file mode 100644 index 5fe535b59..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Small_Dress.png deleted file mode 100644 index 9109b5494..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Small_Lace.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Small_Lace.png deleted file mode 100644 index f6195c439..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_Small_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_XLarge_Bow.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_XLarge_Bow.png deleted file mode 100644 index c4ee1c721..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_XLarge_Dress.png deleted file mode 100644 index d88626136..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_XLarge_Lace.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_XLarge_Lace.png deleted file mode 100644 index a9c0d9246..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress2_XLarge_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Large_Belt.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Large_Belt.png deleted file mode 100644 index cca24766c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Large_Collar.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Large_Collar.png deleted file mode 100644 index 5282e9c55..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Large_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Large_Dress.png deleted file mode 100644 index 674552691..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Normal_Belt.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Normal_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Normal_Collar.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Normal_Collar.png deleted file mode 100644 index 98677f104..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Normal_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Normal_Dress.png deleted file mode 100644 index 76f519a7b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Small_Belt.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Small_Belt.png deleted file mode 100644 index dbe9a49bf..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Small_Collar.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Small_Collar.png deleted file mode 100644 index 2d9d5809f..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Small_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Small_Dress.png deleted file mode 100644 index 5ecd47a1e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_XLarge_Belt.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_XLarge_Belt.png deleted file mode 100644 index b89a7da44..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_XLarge_Collar.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_XLarge_Collar.png deleted file mode 100644 index d177f0141..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_XLarge_Dress.png deleted file mode 100644 index a1d86ae39..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress3_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_Large.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_Large.png deleted file mode 100644 index 7821cd6e7..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_Normal.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_Normal.png deleted file mode 100644 index 65aa5f014..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_Small.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_Small.png deleted file mode 100644 index d86153508..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_XLarge.png deleted file mode 100644 index b6d0a1ac6..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/AdultBabyDress4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Large_Dress.png b/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Large_Dress.png deleted file mode 100644 index 9e1a59773..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Large_Trim.png b/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Large_Trim.png deleted file mode 100644 index 4848b503e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Normal_Dress.png b/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Normal_Dress.png deleted file mode 100644 index 4fb1d60cb..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Normal_Trim.png b/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Normal_Trim.png deleted file mode 100644 index e7453352a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Small_Dress.png b/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Small_Dress.png deleted file mode 100644 index d025a4895..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Small_Trim.png b/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Small_Trim.png deleted file mode 100644 index a12084d90..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_XLarge_Dress.png deleted file mode 100644 index b7ef92305..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_XLarge_Trim.png deleted file mode 100644 index c6826313d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BabydollDress1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Blouse1_Large.png b/Assets/Female3DCG/Cloth/Yoked/Blouse1_Large.png deleted file mode 100644 index 2565560ce..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Blouse1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Blouse1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/Blouse1_Normal.png deleted file mode 100644 index 9a9787e18..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Blouse1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Blouse1_Small.png b/Assets/Female3DCG/Cloth/Yoked/Blouse1_Small.png deleted file mode 100644 index fff30cfe3..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Blouse1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Blouse1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/Blouse1_XLarge.png deleted file mode 100644 index a119e6986..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Blouse1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Large_Base.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_Large_Base.png deleted file mode 100644 index c4cc52ea9..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Large_Pattern.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_Large_Pattern.png deleted file mode 100644 index 1cea600d0..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Large_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Large_Trim.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_Large_Trim.png deleted file mode 100644 index 5107ba730..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Normal_Base.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_Normal_Base.png deleted file mode 100644 index 546d5066a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Normal_Pattern.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_Normal_Pattern.png deleted file mode 100644 index 1cea600d0..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Normal_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Normal_Trim.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_Normal_Trim.png deleted file mode 100644 index f424b791a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Small_Base.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_Small_Base.png deleted file mode 100644 index ec0edd6ac..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Small_Pattern.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_Small_Pattern.png deleted file mode 100644 index 1cea600d0..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Small_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Small_Trim.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_Small_Trim.png deleted file mode 100644 index f424b791a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_XLarge_Base.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_XLarge_Base.png deleted file mode 100644 index a96a14889..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_XLarge_Pattern.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_XLarge_Pattern.png deleted file mode 100644 index 1cea600d0..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_XLarge_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Bodice1_XLarge_Trim.png b/Assets/Female3DCG/Cloth/Yoked/Bodice1_XLarge_Trim.png deleted file mode 100644 index 31bd3dff7..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Bodice1_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_Large.png b/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_Large.png deleted file mode 100644 index 7b609fe2e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_Normal.png deleted file mode 100644 index c38f6ed57..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_Small.png b/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_Small.png deleted file mode 100644 index bedd4b166..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_XLarge.png deleted file mode 100644 index 6a82a8c1c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BodyTowel1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_Large.png b/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_Large.png deleted file mode 100644 index 4d60463c3..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_Normal.png deleted file mode 100644 index 857335240..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_Small.png b/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_Small.png deleted file mode 100644 index da44b9797..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_XLarge.png deleted file mode 100644 index 8b00bf184..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageBustier1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_Large.png b/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_Large.png deleted file mode 100644 index 4c1c5cb3a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_Normal.png b/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_Normal.png deleted file mode 100644 index 6ddda67c7..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_Small.png b/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_Small.png deleted file mode 100644 index 79546443b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_XLarge.png deleted file mode 100644 index ceef0df77..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageBustier2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageDress1_Large.png b/Assets/Female3DCG/Cloth/Yoked/BondageDress1_Large.png deleted file mode 100644 index 4538f3bbd..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageDress1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/BondageDress1_Normal.png deleted file mode 100644 index 9ef22bd54..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageDress1_Small.png b/Assets/Female3DCG/Cloth/Yoked/BondageDress1_Small.png deleted file mode 100644 index e9ae8eb25..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageDress1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/BondageDress1_XLarge.png deleted file mode 100644 index 4692b26de..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageDress2_Large.png b/Assets/Female3DCG/Cloth/Yoked/BondageDress2_Large.png deleted file mode 100644 index 49172e0d9..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageDress2_Normal.png b/Assets/Female3DCG/Cloth/Yoked/BondageDress2_Normal.png deleted file mode 100644 index 32b2cf54d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageDress2_Small.png b/Assets/Female3DCG/Cloth/Yoked/BondageDress2_Small.png deleted file mode 100644 index e15ada08b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BondageDress2_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/BondageDress2_XLarge.png deleted file mode 100644 index 1ebb4f24a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BondageDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_Large.png b/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_Large.png deleted file mode 100644 index 5b87cca8b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_Normal.png deleted file mode 100644 index a57c16708..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_Small.png b/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_Small.png deleted file mode 100644 index 0422b74c9..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_XLarge.png deleted file mode 100644 index b32a6c106..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/BridesmaidDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_Large.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_Large.png deleted file mode 100644 index a5fc22bed..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_Normal.png deleted file mode 100644 index a63e4764d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_Small.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_Small.png deleted file mode 100644 index 4a18206fa..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_XLarge.png deleted file mode 100644 index 4ac9e8ee0..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_LargePink_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_LargePink_Dress.png deleted file mode 100644 index d6b2c0e13..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_LargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_LargePurple_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_LargePurple_Dress.png deleted file mode 100644 index 58f882e57..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_LargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Large_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Large_Dress.png deleted file mode 100644 index b5b8c7c8a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Large_Edges.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Large_Edges.png deleted file mode 100644 index 8b896df40..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Large_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_NormalPink_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_NormalPink_Dress.png deleted file mode 100644 index 9fd1df4f8..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_NormalPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_NormalPurple_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_NormalPurple_Dress.png deleted file mode 100644 index b1c59397c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_NormalPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Normal_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Normal_Dress.png deleted file mode 100644 index 18993f2f4..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Normal_Edges.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Normal_Edges.png deleted file mode 100644 index 45c82ae7e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Normal_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_SmallPink_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_SmallPink_Dress.png deleted file mode 100644 index c52e6330e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_SmallPink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_SmallPurple_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_SmallPurple_Dress.png deleted file mode 100644 index 68473c5ce..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_SmallPurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Small_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Small_Dress.png deleted file mode 100644 index fbe2b8245..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Small_Edges.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Small_Edges.png deleted file mode 100644 index af0872b38..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_Small_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLargePink_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLargePink_Dress.png deleted file mode 100644 index 98f6f5919..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLargePink_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLargePurple_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLargePurple_Dress.png deleted file mode 100644 index 32111de4b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLargePurple_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLarge_Dress.png deleted file mode 100644 index 6e0fc27c5..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLarge_Edges.png b/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLarge_Edges.png deleted file mode 100644 index 743dd7ad3..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ChineseDress2_XLarge_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Large_Shirt.png deleted file mode 100644 index 26d69053c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Large_Tie.png b/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Large_Tie.png deleted file mode 100644 index a2041b4a3..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Large_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Normal_Shirt.png deleted file mode 100644 index ff9221238..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Normal_Tie.png b/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Normal_Tie.png deleted file mode 100644 index 249241523..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Normal_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Small_Shirt.png deleted file mode 100644 index dc610f56b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Small_Tie.png b/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Small_Tie.png deleted file mode 100644 index 671ae8ae5..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_Small_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_XLarge_Shirt.png deleted file mode 100644 index 4f942fb4d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_XLarge_Tie.png b/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_XLarge_Tie.png deleted file mode 100644 index aa17f327c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CollegeOutfit1_XLarge_Tie.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ComfyTop_Large.png b/Assets/Female3DCG/Cloth/Yoked/ComfyTop_Large.png deleted file mode 100644 index e0eb8e41e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ComfyTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ComfyTop_Normal.png b/Assets/Female3DCG/Cloth/Yoked/ComfyTop_Normal.png deleted file mode 100644 index 1057fd05d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ComfyTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ComfyTop_Small.png b/Assets/Female3DCG/Cloth/Yoked/ComfyTop_Small.png deleted file mode 100644 index 19cf99f3b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ComfyTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ComfyTop_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/ComfyTop_XLarge.png deleted file mode 100644 index d0bebf1f6..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ComfyTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Large.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Large.png deleted file mode 100644 index 9c83a7e41..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Large_Corset.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Large_Corset.png deleted file mode 100644 index 663080654..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Large_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Large_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Large_Shirt.png deleted file mode 100644 index 0699aa654..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Normal.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Normal.png deleted file mode 100644 index a3b548ade..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Normal_Corset.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Normal_Corset.png deleted file mode 100644 index 314b636d3..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Normal_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Normal_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Normal_Shirt.png deleted file mode 100644 index 78fc4c66e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Small.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Small.png deleted file mode 100644 index a3b548ade..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Small_Corset.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Small_Corset.png deleted file mode 100644 index 314b636d3..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Small_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Small_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Small_Shirt.png deleted file mode 100644 index 78fc4c66e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_XLarge.png deleted file mode 100644 index 2a4b04d80..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_XLarge_Corset.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_XLarge_Corset.png deleted file mode 100644 index 57954956a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_XLarge_Corset.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_XLarge_Shirt.png deleted file mode 100644 index 092b6a929..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/CorsetShirt_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Dress2_Large.png b/Assets/Female3DCG/Cloth/Yoked/Dress2_Large.png deleted file mode 100644 index 7b7b3bac6..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Dress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Dress2_Normal.png b/Assets/Female3DCG/Cloth/Yoked/Dress2_Normal.png deleted file mode 100644 index 48fe3c3a2..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Dress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Dress2_Small.png b/Assets/Female3DCG/Cloth/Yoked/Dress2_Small.png deleted file mode 100644 index f2711e458..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Dress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Dress2_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/Dress2_XLarge.png deleted file mode 100644 index d214069ea..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Dress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Dress3_Large.png b/Assets/Female3DCG/Cloth/Yoked/Dress3_Large.png deleted file mode 100644 index 5d7c1cabf..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Dress3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Dress3_Normal.png b/Assets/Female3DCG/Cloth/Yoked/Dress3_Normal.png deleted file mode 100644 index 6a90449a7..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Dress3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Dress3_Small.png b/Assets/Female3DCG/Cloth/Yoked/Dress3_Small.png deleted file mode 100644 index 884916221..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Dress3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Dress3_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/Dress3_XLarge.png deleted file mode 100644 index f5ebf32db..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Dress3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/DressFur_Large_Fabric.png b/Assets/Female3DCG/Cloth/Yoked/DressFur_Large_Fabric.png deleted file mode 100644 index 8b1d68e56..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/DressFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/DressFur_Large_Fur.png b/Assets/Female3DCG/Cloth/Yoked/DressFur_Large_Fur.png deleted file mode 100644 index 71df548f7..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/DressFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/DressFur_Normal_Fabric.png b/Assets/Female3DCG/Cloth/Yoked/DressFur_Normal_Fabric.png deleted file mode 100644 index b60c1b8a4..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/DressFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/DressFur_Normal_Fur.png b/Assets/Female3DCG/Cloth/Yoked/DressFur_Normal_Fur.png deleted file mode 100644 index 711020107..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/DressFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/DressFur_Small_Fabric.png b/Assets/Female3DCG/Cloth/Yoked/DressFur_Small_Fabric.png deleted file mode 100644 index 4eacf812d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/DressFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/DressFur_Small_Fur.png b/Assets/Female3DCG/Cloth/Yoked/DressFur_Small_Fur.png deleted file mode 100644 index 0e15ac960..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/DressFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/DressFur_XLarge_Fabric.png b/Assets/Female3DCG/Cloth/Yoked/DressFur_XLarge_Fabric.png deleted file mode 100644 index b22b33725..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/DressFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/DressFur_XLarge_Fur.png b/Assets/Female3DCG/Cloth/Yoked/DressFur_XLarge_Fur.png deleted file mode 100644 index f8ff38d5d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/DressFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Large_Dress.png b/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Large_Dress.png deleted file mode 100644 index 6420ea24d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Large_Flower.png b/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Large_Flower.png deleted file mode 100644 index 0fe57a834..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Large_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Normal_Dress.png b/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Normal_Dress.png deleted file mode 100644 index 1ce6e6f9c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Normal_Flower.png b/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Normal_Flower.png deleted file mode 100644 index f9a431623..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Normal_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Small_Dress.png b/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Small_Dress.png deleted file mode 100644 index 712994d56..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Small_Flower.png b/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Small_Flower.png deleted file mode 100644 index c7d872ad6..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_Small_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Yoked/FlowerDress_XLarge_Dress.png deleted file mode 100644 index 356fb9380..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_XLarge_Flower.png b/Assets/Female3DCG/Cloth/Yoked/FlowerDress_XLarge_Flower.png deleted file mode 100644 index 5686a3cca..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FlowerDress_XLarge_Flower.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FurCoat_Upper.png b/Assets/Female3DCG/Cloth/Yoked/FurCoat_Upper.png deleted file mode 100644 index 265e2f7b0..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FurCoat_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_Large_TopFur.png b/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_Large_TopFur.png deleted file mode 100644 index f6166b729..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_Large_TopFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_Normal_TopFur.png b/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_Normal_TopFur.png deleted file mode 100644 index 038c376c9..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_Normal_TopFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_Small_TopFur.png b/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_Small_TopFur.png deleted file mode 100644 index 0d03b3b32..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_Small_TopFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_XLarge_TopFur.png b/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_XLarge_TopFur.png deleted file mode 100644 index 41f8ac474..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/FuzzyDress_XLarge_TopFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown1_Large.png b/Assets/Female3DCG/Cloth/Yoked/Gown1_Large.png deleted file mode 100644 index 87d72370d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/Gown1_Normal.png deleted file mode 100644 index a2ef948e1..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown1_Small.png b/Assets/Female3DCG/Cloth/Yoked/Gown1_Small.png deleted file mode 100644 index 3b9640086..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/Gown1_XLarge.png deleted file mode 100644 index 5f07b6481..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown2Top_Large.png b/Assets/Female3DCG/Cloth/Yoked/Gown2Top_Large.png deleted file mode 100644 index 4406184af..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown2Top_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown2Top_Normal.png b/Assets/Female3DCG/Cloth/Yoked/Gown2Top_Normal.png deleted file mode 100644 index 529c08ba1..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown2Top_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown2Top_Small.png b/Assets/Female3DCG/Cloth/Yoked/Gown2Top_Small.png deleted file mode 100644 index 1cc7930c6..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown2Top_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown2Top_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/Gown2Top_XLarge.png deleted file mode 100644 index 065032718..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown2Top_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown3_Large.png b/Assets/Female3DCG/Cloth/Yoked/Gown3_Large.png deleted file mode 100644 index 8456c7e26..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown3_Normal.png b/Assets/Female3DCG/Cloth/Yoked/Gown3_Normal.png deleted file mode 100644 index 6b6d33bc8..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown3_Small.png b/Assets/Female3DCG/Cloth/Yoked/Gown3_Small.png deleted file mode 100644 index 05f12939c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Gown3_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/Gown3_XLarge.png deleted file mode 100644 index 411c30dd7..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Gown3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_BackSkirt.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_BackSkirt.png deleted file mode 100644 index e6ff11224..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_BackSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Base.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Base.png deleted file mode 100644 index d468626f7..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Belt.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Belt.png deleted file mode 100644 index 490febbfa..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Buckle.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Buckle.png deleted file mode 100644 index 0fb758187..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Trim.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Trim.png deleted file mode 100644 index 44f42a8ec..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Base.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Base.png deleted file mode 100644 index a8e09ffd0..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Belt.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Belt.png deleted file mode 100644 index 6c8457d2d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Buckle.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Buckle.png deleted file mode 100644 index 679247f8d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Trim.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Trim.png deleted file mode 100644 index 4160a0596..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Base.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Base.png deleted file mode 100644 index 1390e1599..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Belt.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Belt.png deleted file mode 100644 index 290d51bfc..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Buckle.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Buckle.png deleted file mode 100644 index b11836cb6..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Trim.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Trim.png deleted file mode 100644 index f8dd9d574..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Base.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Base.png deleted file mode 100644 index d366ea9f8..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Belt.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Belt.png deleted file mode 100644 index ec1c42c84..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Buckle.png deleted file mode 100644 index cc20a702d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Trim.png b/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Trim.png deleted file mode 100644 index 2fa0772ef..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/GrandMage_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Jacket_Base.png b/Assets/Female3DCG/Cloth/Yoked/Jacket_Base.png deleted file mode 100644 index 61a4b3067..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Jacket_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_Large.png b/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_Large.png deleted file mode 100644 index d9291cbbc..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_Normal.png b/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_Normal.png deleted file mode 100644 index e5bfd1266..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_Small.png b/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_Small.png deleted file mode 100644 index d8be602da..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_XLarge.png deleted file mode 100644 index 614fff240..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LaceBabydoll_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_Large.png b/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_Large.png deleted file mode 100644 index 87868caf9..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_LargeNonLaced.png b/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_LargeNonLaced.png deleted file mode 100644 index 3d1b96a0e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_LargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_Normal.png b/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_Normal.png deleted file mode 100644 index 4055e832e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_NormalNonLaced.png b/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_NormalNonLaced.png deleted file mode 100644 index 09da2eb36..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_NormalNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_Small.png b/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_Small.png deleted file mode 100644 index 06d9c83c2..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_SmallNonLaced.png b/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_SmallNonLaced.png deleted file mode 100644 index dfacdcd78..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_SmallNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_XLarge.png deleted file mode 100644 index e7cc58bda..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_XLargeNonLaced.png b/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_XLargeNonLaced.png deleted file mode 100644 index 310288b81..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexLacedSuit_XLargeNonLaced.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexTop_Large.png b/Assets/Female3DCG/Cloth/Yoked/LatexTop_Large.png deleted file mode 100644 index aecd75d3f..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexTop_Normal.png b/Assets/Female3DCG/Cloth/Yoked/LatexTop_Normal.png deleted file mode 100644 index 4d8369041..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexTop_Small.png b/Assets/Female3DCG/Cloth/Yoked/LatexTop_Small.png deleted file mode 100644 index afbeb7422..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LatexTop_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/LatexTop_XLarge.png deleted file mode 100644 index 1b024c320..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LatexTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_Large.png b/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_Large.png deleted file mode 100644 index 6fe843206..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_Normal.png b/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_Normal.png deleted file mode 100644 index 6bc6d3670..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_Small.png b/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_Small.png deleted file mode 100644 index 53b917739..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_XLarge.png deleted file mode 100644 index 8f969784d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherBolero_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_Large.png b/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_Large.png deleted file mode 100644 index fe39142db..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_Normal.png deleted file mode 100644 index 5c0edcfb3..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_Small.png b/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_Small.png deleted file mode 100644 index 2dee4b1d2..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_XLarge.png deleted file mode 100644 index 32158342d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherCorsetTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_Large.png b/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_Large.png deleted file mode 100644 index 5b07cea1e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_Normal.png b/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_Normal.png deleted file mode 100644 index 5b46432e4..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_Small.png b/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_Small.png deleted file mode 100644 index e70ae8d15..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_XLarge.png deleted file mode 100644 index de3f28ad4..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/LeatherCropTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidApron1_Large.png b/Assets/Female3DCG/Cloth/Yoked/MaidApron1_Large.png deleted file mode 100644 index d9336a968..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidApron1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidApron1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/MaidApron1_Normal.png deleted file mode 100644 index d710f52bc..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidApron1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidApron1_Small.png b/Assets/Female3DCG/Cloth/Yoked/MaidApron1_Small.png deleted file mode 100644 index 2ddde972b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidApron1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidApron1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/MaidApron1_XLarge.png deleted file mode 100644 index dc9253ef9..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidApron1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidApron2_Large.png b/Assets/Female3DCG/Cloth/Yoked/MaidApron2_Large.png deleted file mode 100644 index 1a89ad1e2..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidApron2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidApron2_Normal.png b/Assets/Female3DCG/Cloth/Yoked/MaidApron2_Normal.png deleted file mode 100644 index 150974896..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidApron2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidApron2_Small.png b/Assets/Female3DCG/Cloth/Yoked/MaidApron2_Small.png deleted file mode 100644 index 813c91958..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidApron2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidApron2_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/MaidApron2_XLarge.png deleted file mode 100644 index 8817288e2..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidApron2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Large_Apron.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Large_Apron.png deleted file mode 100644 index c5a60d241..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Large_Dress.png deleted file mode 100644 index ecb3e3b68..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Large_Frills.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Large_Frills.png deleted file mode 100644 index d1b361272..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Normal_Apron.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Normal_Apron.png deleted file mode 100644 index a622ad264..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Normal_Dress.png deleted file mode 100644 index fb54df23a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Normal_Frills.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Normal_Frills.png deleted file mode 100644 index 907fe9b34..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Small_Apron.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Small_Apron.png deleted file mode 100644 index 3501e9d46..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Small_Dress.png deleted file mode 100644 index a200c6917..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Small_Frills.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Small_Frills.png deleted file mode 100644 index 53c81d727..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_XLarge_Apron.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_XLarge_Apron.png deleted file mode 100644 index c4699a08b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_XLarge_Dress.png deleted file mode 100644 index 09d019b2d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_XLarge_Frills.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_XLarge_Frills.png deleted file mode 100644 index 4eddff378..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit1_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Large_Apron.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Large_Apron.png deleted file mode 100644 index 0bb13defe..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Large_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Large_Dress.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Large_Dress.png deleted file mode 100644 index 119e798d3..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Large_Frills.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Large_Frills.png deleted file mode 100644 index 7f56b5fcb..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Normal_Apron.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Normal_Apron.png deleted file mode 100644 index 6ca8bab52..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Normal_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Normal_Dress.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Normal_Dress.png deleted file mode 100644 index 645dc5e46..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Normal_Frills.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Normal_Frills.png deleted file mode 100644 index 6ff398178..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Small_Apron.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Small_Apron.png deleted file mode 100644 index 06e93faef..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Small_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Small_Dress.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Small_Dress.png deleted file mode 100644 index 93a2c4faf..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Small_Frills.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Small_Frills.png deleted file mode 100644 index 5f89de78a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_XLarge_Apron.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_XLarge_Apron.png deleted file mode 100644 index a2e0cb4bb..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_XLarge_Apron.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_XLarge_Dress.png deleted file mode 100644 index b58ee25f4..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_XLarge_Frills.png b/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_XLarge_Frills.png deleted file mode 100644 index 5a5cc4224..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MaidOutfit2_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MistressTop_Large.png b/Assets/Female3DCG/Cloth/Yoked/MistressTop_Large.png deleted file mode 100644 index d390102f2..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MistressTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MistressTop_Normal.png b/Assets/Female3DCG/Cloth/Yoked/MistressTop_Normal.png deleted file mode 100644 index 82694122c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MistressTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MistressTop_Small.png b/Assets/Female3DCG/Cloth/Yoked/MistressTop_Small.png deleted file mode 100644 index ce85e6661..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MistressTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/MistressTop_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/MistressTop_XLarge.png deleted file mode 100644 index ff72da762..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/MistressTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/NurseUniform_Large.png b/Assets/Female3DCG/Cloth/Yoked/NurseUniform_Large.png deleted file mode 100644 index 5ac7bf338..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/NurseUniform_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/NurseUniform_Normal.png b/Assets/Female3DCG/Cloth/Yoked/NurseUniform_Normal.png deleted file mode 100644 index b097f11f0..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/NurseUniform_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/NurseUniform_Small.png b/Assets/Female3DCG/Cloth/Yoked/NurseUniform_Small.png deleted file mode 100644 index 70b712d18..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/NurseUniform_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/NurseUniform_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/NurseUniform_XLarge.png deleted file mode 100644 index 5756bd091..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/NurseUniform_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Robe1_Large.png b/Assets/Female3DCG/Cloth/Yoked/Robe1_Large.png deleted file mode 100644 index 5ce3c6e53..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Robe1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Robe1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/Robe1_Normal.png deleted file mode 100644 index 79ce87ba5..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Robe1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Robe1_Small.png b/Assets/Female3DCG/Cloth/Yoked/Robe1_Small.png deleted file mode 100644 index ed3d5537d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Robe1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Robe1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/Robe1_XLarge.png deleted file mode 100644 index 797f6bab0..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Robe1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_Large.png b/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_Large.png deleted file mode 100644 index 65e0457c6..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_Normal.png b/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_Normal.png deleted file mode 100644 index 219a49376..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_Small.png b/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_Small.png deleted file mode 100644 index 9f1a1f420..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_XLarge.png deleted file mode 100644 index 34d8952c4..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/ShoulderlessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_Large.png b/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_Large.png deleted file mode 100644 index 2eb6e4860..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_Normal.png b/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_Normal.png deleted file mode 100644 index 2e1e1d2b1..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_Small.png b/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_Small.png deleted file mode 100644 index f48c71bcc..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_XLarge.png deleted file mode 100644 index 913c20a42..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SleevelessTop_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_Large.png b/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_Large.png deleted file mode 100644 index 1062250d5..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_Normal.png deleted file mode 100644 index d3c3a5c46..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_Small.png b/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_Small.png deleted file mode 100644 index 4726c3dc1..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_XLarge.png deleted file mode 100644 index f5cbddb51..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SteampunkCorsetTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Bow.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Bow.png deleted file mode 100644 index 05b3676af..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Buckle.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Buckle.png deleted file mode 100644 index 9786715f9..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Dress.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Dress.png deleted file mode 100644 index 0864bd254..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Shirt.png deleted file mode 100644 index 5959896a1..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Bow.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Bow.png deleted file mode 100644 index 05b3676af..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Buckle.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Buckle.png deleted file mode 100644 index 5cb83366b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Dress.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Dress.png deleted file mode 100644 index f5c227500..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Shirt.png deleted file mode 100644 index 0d8eaf8ec..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Bow.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Bow.png deleted file mode 100644 index 05b3676af..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Buckle.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Buckle.png deleted file mode 100644 index 6bea1d2dc..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Dress.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Dress.png deleted file mode 100644 index 682d9b79e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Shirt.png deleted file mode 100644 index f3c8ccc2f..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Bow.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Bow.png deleted file mode 100644 index 05b3676af..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Buckle.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Buckle.png deleted file mode 100644 index 187fbf3d2..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Dress.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Dress.png deleted file mode 100644 index 81f223b3d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Shirt.png deleted file mode 100644 index eb24f4439..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit1_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_Large.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_Large.png deleted file mode 100644 index 169c2273a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_Normal.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_Normal.png deleted file mode 100644 index 748085bf5..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_Small.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_Small.png deleted file mode 100644 index 91b98d486..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_XLarge.png deleted file mode 100644 index 09167e4eb..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Large_Color.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Large_Color.png deleted file mode 100644 index 72165498d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Large_White.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Large_White.png deleted file mode 100644 index 75c529374..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Large_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Normal_Color.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Normal_Color.png deleted file mode 100644 index 99e344e4e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Normal_White.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Normal_White.png deleted file mode 100644 index 826fe7615..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Normal_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Small_Color.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Small_Color.png deleted file mode 100644 index 29f8432de..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Small_White.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Small_White.png deleted file mode 100644 index 9a84789bc..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_Small_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_XLarge_Color.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_XLarge_Color.png deleted file mode 100644 index 613b3a104..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_XLarge_White.png b/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_XLarge_White.png deleted file mode 100644 index 2a6777718..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/StudentOutfit3_XLarge_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Base.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Base.png deleted file mode 100644 index 902f2f497..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer1.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer1.png deleted file mode 100644 index e3a5cc8fe..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer2.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer2.png deleted file mode 100644 index 13431252d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer3.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer3.png deleted file mode 100644 index 801070217..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer4.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer4.png deleted file mode 100644 index 97702cd07..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Base.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Base.png deleted file mode 100644 index 0f7a7fa76..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer1.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer1.png deleted file mode 100644 index 8b07628db..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer2.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer2.png deleted file mode 100644 index 1b4942c7e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer3.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer3.png deleted file mode 100644 index b538f0ecf..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer4.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer4.png deleted file mode 100644 index f168d882c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Base.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Base.png deleted file mode 100644 index 1f1e9b5be..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer1.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer1.png deleted file mode 100644 index 68da4cf8e..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer2.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer2.png deleted file mode 100644 index 700143a51..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer3.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer3.png deleted file mode 100644 index 00c641d10..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer4.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer4.png deleted file mode 100644 index 6410fccee..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Base.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Base.png deleted file mode 100644 index 8ffc47950..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer1.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer1.png deleted file mode 100644 index ca29704e8..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer2.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer2.png deleted file mode 100644 index 1debaaa18..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer3.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer3.png deleted file mode 100644 index 3ad749844..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer4.png b/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer4.png deleted file mode 100644 index 7b3b7ac88..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SummerDress_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_Large.png b/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_Large.png deleted file mode 100644 index fc76aa559..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_Normal.png deleted file mode 100644 index 30c147551..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_Small.png b/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_Small.png deleted file mode 100644 index 1c410400d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_XLarge.png deleted file mode 100644 index 5cb12a1da..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/SuspenderTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Sweater1_Large.png b/Assets/Female3DCG/Cloth/Yoked/Sweater1_Large.png deleted file mode 100644 index fe1e9c4b4..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Sweater1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Sweater1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/Sweater1_Normal.png deleted file mode 100644 index 6612833ef..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Sweater1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Sweater1_Small.png b/Assets/Female3DCG/Cloth/Yoked/Sweater1_Small.png deleted file mode 100644 index 436414bc8..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Sweater1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Sweater1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/Sweater1_XLarge.png deleted file mode 100644 index 26ec6e611..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Sweater1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt1_Large.png b/Assets/Female3DCG/Cloth/Yoked/TShirt1_Large.png deleted file mode 100644 index 8d577a057..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/TShirt1_Normal.png deleted file mode 100644 index cee1d35e7..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt1_Small.png b/Assets/Female3DCG/Cloth/Yoked/TShirt1_Small.png deleted file mode 100644 index 6aee4b22c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/TShirt1_XLarge.png deleted file mode 100644 index d64819c92..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt2BCLogo_Print.png b/Assets/Female3DCG/Cloth/Yoked/TShirt2BCLogo_Print.png deleted file mode 100644 index 717259582..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt2BCLogo_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt2BDSM_Print.png b/Assets/Female3DCG/Cloth/Yoked/TShirt2BDSM_Print.png deleted file mode 100644 index 62f576eb9..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt2BDSM_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt2Gag_Print.png b/Assets/Female3DCG/Cloth/Yoked/TShirt2Gag_Print.png deleted file mode 100644 index 5d5d4ea25..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt2Gag_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt2Knot_Print.png b/Assets/Female3DCG/Cloth/Yoked/TShirt2Knot_Print.png deleted file mode 100644 index de16f53e4..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt2Knot_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt2Rock_Print.png b/Assets/Female3DCG/Cloth/Yoked/TShirt2Rock_Print.png deleted file mode 100644 index 34cab3760..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt2Rock_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt2Smile_Print.png b/Assets/Female3DCG/Cloth/Yoked/TShirt2Smile_Print.png deleted file mode 100644 index c6c67db94..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt2Smile_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt2Tick_Print.png b/Assets/Female3DCG/Cloth/Yoked/TShirt2Tick_Print.png deleted file mode 100644 index fb69e1ad4..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt2Tick_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt2_Large_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/TShirt2_Large_Shirt.png deleted file mode 100644 index 1a66d09bb..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt2_Large_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt2_Normal_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/TShirt2_Normal_Shirt.png deleted file mode 100644 index 606f09da7..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt2_Normal_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt2_Small_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/TShirt2_Small_Shirt.png deleted file mode 100644 index 752a86304..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt2_Small_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TShirt2_XLarge_Shirt.png b/Assets/Female3DCG/Cloth/Yoked/TShirt2_XLarge_Shirt.png deleted file mode 100644 index d6f236a47..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TShirt2_XLarge_Shirt.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_Large.png b/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_Large.png deleted file mode 100644 index 17cc856fd..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_Normal.png deleted file mode 100644 index e6a55681b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_Small.png b/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_Small.png deleted file mode 100644 index d37ec2646..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_XLarge.png deleted file mode 100644 index 67b51a781..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TeacherOutfit1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_Large.png b/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_Large.png deleted file mode 100644 index a929d0ef1..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_Normal.png deleted file mode 100644 index 88c3bb97c..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_Small.png b/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_Small.png deleted file mode 100644 index b11aa18a2..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_XLarge.png deleted file mode 100644 index 8c18a7b4f..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/TennisShirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_Large.png b/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_Large.png deleted file mode 100644 index 204d7389b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_Normal.png deleted file mode 100644 index 7c318a365..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_Small.png b/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_Small.png deleted file mode 100644 index 881bbda0a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_XLarge.png deleted file mode 100644 index d48ec45de..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/VirginKiller1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_Large.png b/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_Large.png deleted file mode 100644 index 507ac7f98..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_Normal.png deleted file mode 100644 index fd43364d5..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_Small.png b/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_Small.png deleted file mode 100644 index 4bd46370d..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_XLarge.png deleted file mode 100644 index b1f30cd0a..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/WeddingDress1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_Large.png b/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_Large.png deleted file mode 100644 index 5f0d310cc..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_Normal.png b/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_Normal.png deleted file mode 100644 index 1cb48ec15..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_Small.png b/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_Small.png deleted file mode 100644 index de1260bf2..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_XLarge.png deleted file mode 100644 index 8888855da..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/WeddingDress2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Yukata1_Large.png b/Assets/Female3DCG/Cloth/Yoked/Yukata1_Large.png deleted file mode 100644 index f2b165618..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Yukata1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Yukata1_Normal.png b/Assets/Female3DCG/Cloth/Yoked/Yukata1_Normal.png deleted file mode 100644 index eb3814e06..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Yukata1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Yukata1_Small.png b/Assets/Female3DCG/Cloth/Yoked/Yukata1_Small.png deleted file mode 100644 index d44ac8a53..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Yukata1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yoked/Yukata1_XLarge.png b/Assets/Female3DCG/Cloth/Yoked/Yukata1_XLarge.png deleted file mode 100644 index 5bfa43d0b..000000000 Binary files a/Assets/Female3DCG/Cloth/Yoked/Yukata1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yukata1_Large.png b/Assets/Female3DCG/Cloth/Yukata1_Large.png deleted file mode 100644 index c9241d916..000000000 Binary files a/Assets/Female3DCG/Cloth/Yukata1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yukata1_Normal.png b/Assets/Female3DCG/Cloth/Yukata1_Normal.png deleted file mode 100644 index 75a6009e8..000000000 Binary files a/Assets/Female3DCG/Cloth/Yukata1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yukata1_Small.png b/Assets/Female3DCG/Cloth/Yukata1_Small.png deleted file mode 100644 index 344b60f88..000000000 Binary files a/Assets/Female3DCG/Cloth/Yukata1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Cloth/Yukata1_XLarge.png b/Assets/Female3DCG/Cloth/Yukata1_XLarge.png deleted file mode 100644 index c9949f3e7..000000000 Binary files a/Assets/Female3DCG/Cloth/Yukata1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCollar_Collar.png deleted file mode 100644 index 84be108e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_LargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Large_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Large_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Large_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Large_Collar.png deleted file mode 100644 index 84be108e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Large_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Large_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCollar_Collar.png deleted file mode 100644 index f5707e15e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_NormalCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Normal_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Normal_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Normal_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Normal_Collar.png deleted file mode 100644 index f5707e15e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Normal_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCollar_Collar.png deleted file mode 100644 index 9f9d62e2c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_SmallCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Small_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Small_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Small_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Small_Collar.png deleted file mode 100644 index 9f9d62e2c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Small_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Small_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCollar_Collar.png deleted file mode 100644 index bff26e8ee..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLarge_Bow.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLarge_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLarge_Collar.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLarge_Collar.png deleted file mode 100644 index bff26e8ee..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLarge_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/BunnyCollarCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/FurBolero.png b/Assets/Female3DCG/ClothAccessory/AllFours/FurBolero.png deleted file mode 100644 index e13d1d533..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/FurBolero.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_Large.png b/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_Large.png deleted file mode 100644 index 97e56ca0f..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_LargeStrap.png b/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_LargeStrap.png deleted file mode 100644 index e560ba70d..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_LargeStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_Normal.png b/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_Normal.png deleted file mode 100644 index d1e201ff4..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_NormalStrap.png b/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_NormalStrap.png deleted file mode 100644 index 9696fdc7c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_NormalStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_Small.png b/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_Small.png deleted file mode 100644 index 1472dd938..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_SmallStrap.png b/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_SmallStrap.png deleted file mode 100644 index b4ea33c72..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_SmallStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_XLarge.png b/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_XLarge.png deleted file mode 100644 index 306803fb5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_XLargeStrap.png b/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_XLargeStrap.png deleted file mode 100644 index 5c41680d0..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/AllFours/LeatherStraps_XLargeStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/Bouquet_Base.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/Bouquet_Base.png deleted file mode 100644 index 3ad996f98..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/Bouquet_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/Bouquet_Flowers.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/Bouquet_Flowers.png deleted file mode 100644 index 5dfb7cfb6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/Bouquet_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCollar_Collar.png deleted file mode 100644 index 84be108e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_LargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Large_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Large_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Large_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Large_Collar.png deleted file mode 100644 index 84be108e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Large_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Large_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCollar_Collar.png deleted file mode 100644 index f5707e15e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_NormalCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Normal_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Normal_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Normal_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Normal_Collar.png deleted file mode 100644 index f5707e15e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Normal_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCollar_Collar.png deleted file mode 100644 index 9f9d62e2c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_SmallCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Small_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Small_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Small_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Small_Collar.png deleted file mode 100644 index 9f9d62e2c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Small_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Small_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCollar_Collar.png deleted file mode 100644 index bff26e8ee..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLarge_Bow.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLarge_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLarge_Collar.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLarge_Collar.png deleted file mode 100644 index bff26e8ee..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLarge_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/BunnyCollarCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/Camera1.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/Camera1.png deleted file mode 100644 index 36d5a1fd6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/Camera1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_Large.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_Large.png deleted file mode 100644 index b733633ab..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_Normal.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_Normal.png deleted file mode 100644 index ab22af966..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_Small.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_Small.png deleted file mode 100644 index 00bf25aca..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_XLarge.png b/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_XLarge.png deleted file mode 100644 index 7d1e97eac..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackBoxTie/FrillyApron_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/Bouquet_Base.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/Bouquet_Base.png deleted file mode 100644 index 3ad996f98..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/Bouquet_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/Bouquet_Flowers.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/Bouquet_Flowers.png deleted file mode 100644 index 5dfb7cfb6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/Bouquet_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCollar_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCollar_Collar.png deleted file mode 100644 index 76822d7b5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCuffs_Cuffs.png deleted file mode 100644 index a66585688..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_LargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Large_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Large_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Large_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Large_Collar.png deleted file mode 100644 index 76822d7b5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Large_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Large_Cuffs.png deleted file mode 100644 index a66585688..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCollar_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCollar_Collar.png deleted file mode 100644 index ea967017c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCuffs_Cuffs.png deleted file mode 100644 index 9c73ba45c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_NormalCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Normal_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Normal_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Normal_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Normal_Collar.png deleted file mode 100644 index ea967017c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Normal_Cuffs.png deleted file mode 100644 index 9c73ba45c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCollar_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCollar_Collar.png deleted file mode 100644 index a1602cbd7..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCuffs_Cuffs.png deleted file mode 100644 index 9c73ba45c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_SmallCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Small_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Small_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Small_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Small_Collar.png deleted file mode 100644 index a1602cbd7..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Small_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Small_Cuffs.png deleted file mode 100644 index daee8b5e3..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCollar_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCollar_Collar.png deleted file mode 100644 index 8abe99c4a..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCuffs_Cuffs.png deleted file mode 100644 index 09c4e7aba..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLarge_Bow.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLarge_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLarge_Collar.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLarge_Collar.png deleted file mode 100644 index 8abe99c4a..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLarge_Cuffs.png deleted file mode 100644 index 09c4e7aba..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/BunnyCollarCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/Camera1.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/Camera1.png deleted file mode 100644 index 36d5a1fd6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/Camera1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_Large.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_Large.png deleted file mode 100644 index b733633ab..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_Normal.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_Normal.png deleted file mode 100644 index ab22af966..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_Small.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_Small.png deleted file mode 100644 index 00bf25aca..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_XLarge.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_XLarge.png deleted file mode 100644 index 7d1e97eac..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/FrillyApron_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackCuffs/FurBolero.png b/Assets/Female3DCG/ClothAccessory/BackCuffs/FurBolero.png deleted file mode 100644 index fd08de952..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackCuffs/FurBolero.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Bouquet_Base.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Bouquet_Base.png deleted file mode 100644 index 3ad996f98..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Bouquet_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Bouquet_Flowers.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Bouquet_Flowers.png deleted file mode 100644 index 5dfb7cfb6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Bouquet_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCollar_Collar.png deleted file mode 100644 index 84be108e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_LargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Large_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Large_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Large_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Large_Collar.png deleted file mode 100644 index 84be108e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Large_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Large_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCollar_Collar.png deleted file mode 100644 index f5707e15e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_NormalCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Normal_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Normal_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Normal_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Normal_Collar.png deleted file mode 100644 index f5707e15e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Normal_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCollar_Collar.png deleted file mode 100644 index 9f9d62e2c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_SmallCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Small_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Small_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Small_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Small_Collar.png deleted file mode 100644 index 9f9d62e2c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Small_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Small_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCollar_Collar.png deleted file mode 100644 index bff26e8ee..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLarge_Bow.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLarge_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLarge_Collar.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLarge_Collar.png deleted file mode 100644 index bff26e8ee..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLarge_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/BunnyCollarCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Camera1.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Camera1.png deleted file mode 100644 index 36d5a1fd6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Camera1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_Large.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_Large.png deleted file mode 100644 index b733633ab..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_Normal.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_Normal.png deleted file mode 100644 index ab22af966..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_Small.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_Small.png deleted file mode 100644 index 00bf25aca..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_XLarge.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_XLarge.png deleted file mode 100644 index 7d1e97eac..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FrillyApron_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FurBolero.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FurBolero.png deleted file mode 100644 index 275ac5d53..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/FurBolero.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Large_Back.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Large_Back.png deleted file mode 100644 index 3846584ad..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Large_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Large_Front.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Large_Front.png deleted file mode 100644 index c6029f9f8..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Large_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Normal_Back.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Normal_Back.png deleted file mode 100644 index 7dde64b96..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Normal_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Normal_Front.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Normal_Front.png deleted file mode 100644 index 8938a5fe4..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Normal_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Small_Back.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Small_Back.png deleted file mode 100644 index 7f0a677e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Small_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Small_Front.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Small_Front.png deleted file mode 100644 index 7729dd4bb..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_Small_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_XLarge_Back.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_XLarge_Back.png deleted file mode 100644 index f695dfdfb..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_XLarge_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_XLarge_Front.png b/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_XLarge_Front.png deleted file mode 100644 index 43983637f..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BackElbowTouch/Poncho_XLarge_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Bib_Base.png b/Assets/Female3DCG/ClothAccessory/Bib_Base.png deleted file mode 100644 index 9fa7c1006..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Bib_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Bib_Cows.png b/Assets/Female3DCG/ClothAccessory/Bib_Cows.png deleted file mode 100644 index e6a947b6c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Bib_Cows.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Bib_Hearts.png b/Assets/Female3DCG/ClothAccessory/Bib_Hearts.png deleted file mode 100644 index 74a37c709..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Bib_Hearts.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Bib_Pacis.png b/Assets/Female3DCG/ClothAccessory/Bib_Pacis.png deleted file mode 100644 index 4a13ac4c0..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Bib_Pacis.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Bib_PawPrints.png b/Assets/Female3DCG/ClothAccessory/Bib_PawPrints.png deleted file mode 100644 index b40ca9a8c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Bib_PawPrints.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Bib_Strawberries.png b/Assets/Female3DCG/ClothAccessory/Bib_Strawberries.png deleted file mode 100644 index 6d757be05..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Bib_Strawberries.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Bib_Trim.png b/Assets/Female3DCG/ClothAccessory/Bib_Trim.png deleted file mode 100644 index 7defc8ff7..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Bib_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Bouquet_Base.png b/Assets/Female3DCG/ClothAccessory/Bouquet_Base.png deleted file mode 100644 index 58d5f6bf3..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Bouquet_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Bouquet_Flowers.png b/Assets/Female3DCG/ClothAccessory/Bouquet_Flowers.png deleted file mode 100644 index 328394273..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Bouquet_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCollar_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCollar_Collar.png deleted file mode 100644 index 871a4e433..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCuffs_Cuffs.png deleted file mode 100644 index 71c75c335..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_LargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Large_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Large_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Large_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Large_Collar.png deleted file mode 100644 index 871a4e433..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Large_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Large_Cuffs.png deleted file mode 100644 index 71c75c335..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCollar_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCollar_Collar.png deleted file mode 100644 index 42947c345..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCuffs_Cuffs.png deleted file mode 100644 index 5a34d5470..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_NormalCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Normal_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Normal_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Normal_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Normal_Collar.png deleted file mode 100644 index 42947c345..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Normal_Cuffs.png deleted file mode 100644 index 5a34d5470..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCollar_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCollar_Collar.png deleted file mode 100644 index dad855543..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCuffs_Cuffs.png deleted file mode 100644 index 8640ad545..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_SmallCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Small_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Small_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Small_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Small_Collar.png deleted file mode 100644 index dad855543..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Small_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Small_Cuffs.png deleted file mode 100644 index 8640ad545..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCollar_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCollar_Collar.png deleted file mode 100644 index 7e2867ab5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCuffs_Cuffs.png deleted file mode 100644 index e25087cc8..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLarge_Bow.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLarge_Bow.png deleted file mode 100644 index a44c76bd9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLarge_Collar.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLarge_Collar.png deleted file mode 100644 index 7e2867ab5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLarge_Cuffs.png deleted file mode 100644 index e25087cc8..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/BunnyCollarCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Camera1.png b/Assets/Female3DCG/ClothAccessory/Camera1.png deleted file mode 100644 index 36d5a1fd6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Camera1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Cape_Back.png b/Assets/Female3DCG/ClothAccessory/Cape_Back.png deleted file mode 100644 index 840414dc7..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Cape_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Cape_Front.png b/Assets/Female3DCG/ClothAccessory/Cape_Front.png deleted file mode 100644 index 77733c1ae..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Cape_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/CatsuitCollar.png b/Assets/Female3DCG/ClothAccessory/CatsuitCollar.png deleted file mode 100644 index 59142192a..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/CatsuitCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/FacePaint.png b/Assets/Female3DCG/ClothAccessory/FacePaint.png deleted file mode 100644 index 64d3d912e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/FacePaint.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/FrillyApron_Large.png b/Assets/Female3DCG/ClothAccessory/FrillyApron_Large.png deleted file mode 100644 index 93991aac6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/FrillyApron_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/FrillyApron_Normal.png b/Assets/Female3DCG/ClothAccessory/FrillyApron_Normal.png deleted file mode 100644 index 721fc32cd..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/FrillyApron_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/FrillyApron_Small.png b/Assets/Female3DCG/ClothAccessory/FrillyApron_Small.png deleted file mode 100644 index 2c33173a6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/FrillyApron_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/FrillyApron_XLarge.png b/Assets/Female3DCG/ClothAccessory/FrillyApron_XLarge.png deleted file mode 100644 index 888528e9f..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/FrillyApron_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/FurBolero.png b/Assets/Female3DCG/ClothAccessory/FurBolero.png deleted file mode 100644 index f51d94ad1..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/FurBolero.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_DotsLeft.png b/Assets/Female3DCG/ClothAccessory/Glitter_DotsLeft.png deleted file mode 100644 index 8ae72fbab..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_DotsLeft.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_DotsLeft2.png b/Assets/Female3DCG/ClothAccessory/Glitter_DotsLeft2.png deleted file mode 100644 index 02317cbd6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_DotsLeft2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_DotsRight.png b/Assets/Female3DCG/ClothAccessory/Glitter_DotsRight.png deleted file mode 100644 index 2891703bc..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_DotsRight.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_DotsRight2.png b/Assets/Female3DCG/ClothAccessory/Glitter_DotsRight2.png deleted file mode 100644 index 1f3337703..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_DotsRight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_Freckles.png b/Assets/Female3DCG/ClothAccessory/Glitter_Freckles.png deleted file mode 100644 index 0df4eebfa..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_Freckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_Freckles2.png b/Assets/Female3DCG/ClothAccessory/Glitter_Freckles2.png deleted file mode 100644 index 22dbfce03..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_Freckles2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_Freckles2Small.png b/Assets/Female3DCG/ClothAccessory/Glitter_Freckles2Small.png deleted file mode 100644 index f59285633..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_Freckles2Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_FrecklesSmall.png b/Assets/Female3DCG/ClothAccessory/Glitter_FrecklesSmall.png deleted file mode 100644 index a027896c0..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_FrecklesSmall.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_MidFreckles.png b/Assets/Female3DCG/ClothAccessory/Glitter_MidFreckles.png deleted file mode 100644 index 68001bd23..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_MidFreckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_MidFrecklesSmall.png b/Assets/Female3DCG/ClothAccessory/Glitter_MidFrecklesSmall.png deleted file mode 100644 index d232a09d5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_MidFrecklesSmall.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_SplitFreckles.png b/Assets/Female3DCG/ClothAccessory/Glitter_SplitFreckles.png deleted file mode 100644 index 76454381c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_SplitFreckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_SplitFreckles2.png b/Assets/Female3DCG/ClothAccessory/Glitter_SplitFreckles2.png deleted file mode 100644 index 9d6bd33ef..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_SplitFreckles2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_SplitFreckles2Small.png b/Assets/Female3DCG/ClothAccessory/Glitter_SplitFreckles2Small.png deleted file mode 100644 index 500515ee1..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_SplitFreckles2Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_SplitFrecklesSmall.png b/Assets/Female3DCG/ClothAccessory/Glitter_SplitFrecklesSmall.png deleted file mode 100644 index dcd454675..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_SplitFrecklesSmall.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_StarsLeft.png b/Assets/Female3DCG/ClothAccessory/Glitter_StarsLeft.png deleted file mode 100644 index bfe5e31c4..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_StarsLeft.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_StarsLeft2.png b/Assets/Female3DCG/ClothAccessory/Glitter_StarsLeft2.png deleted file mode 100644 index 85e37df0a..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_StarsLeft2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_StarsRight.png b/Assets/Female3DCG/ClothAccessory/Glitter_StarsRight.png deleted file mode 100644 index daf7a9f2a..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_StarsRight.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Glitter_StarsRight2.png b/Assets/Female3DCG/ClothAccessory/Glitter_StarsRight2.png deleted file mode 100644 index f0fe7a362..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Glitter_StarsRight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/Bouquet_Base.png b/Assets/Female3DCG/ClothAccessory/Hogtied/Bouquet_Base.png deleted file mode 100644 index 3ad996f98..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/Bouquet_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/Bouquet_Flowers.png b/Assets/Female3DCG/ClothAccessory/Hogtied/Bouquet_Flowers.png deleted file mode 100644 index 5dfb7cfb6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/Bouquet_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCollar_Collar.png deleted file mode 100644 index 84be108e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_LargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Large_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Large_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Large_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Large_Collar.png deleted file mode 100644 index 84be108e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Large_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Large_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCollar_Collar.png deleted file mode 100644 index f5707e15e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_NormalCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Normal_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Normal_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Normal_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Normal_Collar.png deleted file mode 100644 index f5707e15e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Normal_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCollar_Collar.png deleted file mode 100644 index 9f9d62e2c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_SmallCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Small_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Small_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Small_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Small_Collar.png deleted file mode 100644 index 9f9d62e2c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Small_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Small_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCollar_Collar.png deleted file mode 100644 index bff26e8ee..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLarge_Bow.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLarge_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLarge_Collar.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLarge_Collar.png deleted file mode 100644 index bff26e8ee..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLarge_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/BunnyCollarCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_Large.png b/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_Large.png deleted file mode 100644 index ed2bd0c85..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_Normal.png b/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_Normal.png deleted file mode 100644 index 934f8ebbd..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_Small.png b/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_Small.png deleted file mode 100644 index d3ce39016..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_XLarge.png b/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_XLarge.png deleted file mode 100644 index c8d99fa66..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/FrillyApron_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Hogtied/FurBolero.png b/Assets/Female3DCG/ClothAccessory/Hogtied/FurBolero.png deleted file mode 100644 index 8cc75b6f9..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Hogtied/FurBolero.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Kneel/Cape_Back.png b/Assets/Female3DCG/ClothAccessory/Kneel/Cape_Back.png deleted file mode 100644 index 2e4f3690e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Kneel/Cape_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Kneel/Cape_Front.png b/Assets/Female3DCG/ClothAccessory/Kneel/Cape_Front.png deleted file mode 100644 index 77733c1ae..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Kneel/Cape_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/LeatherStraps_Large.png b/Assets/Female3DCG/ClothAccessory/LeatherStraps_Large.png deleted file mode 100644 index 7c3756b6f..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/LeatherStraps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/LeatherStraps_LargeStrap.png b/Assets/Female3DCG/ClothAccessory/LeatherStraps_LargeStrap.png deleted file mode 100644 index 10f7f09e6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/LeatherStraps_LargeStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/LeatherStraps_Normal.png b/Assets/Female3DCG/ClothAccessory/LeatherStraps_Normal.png deleted file mode 100644 index 97244ceb8..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/LeatherStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/LeatherStraps_NormalStrap.png b/Assets/Female3DCG/ClothAccessory/LeatherStraps_NormalStrap.png deleted file mode 100644 index d657327b1..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/LeatherStraps_NormalStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/LeatherStraps_Small.png b/Assets/Female3DCG/ClothAccessory/LeatherStraps_Small.png deleted file mode 100644 index 92e29ac88..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/LeatherStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/LeatherStraps_SmallStrap.png b/Assets/Female3DCG/ClothAccessory/LeatherStraps_SmallStrap.png deleted file mode 100644 index a328f9649..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/LeatherStraps_SmallStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/LeatherStraps_XLarge.png b/Assets/Female3DCG/ClothAccessory/LeatherStraps_XLarge.png deleted file mode 100644 index 177ed93c7..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/LeatherStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/LeatherStraps_XLargeStrap.png b/Assets/Female3DCG/ClothAccessory/LeatherStraps_XLargeStrap.png deleted file mode 100644 index a0668bb1f..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/LeatherStraps_XLargeStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/Bouquet_Base.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/Bouquet_Base.png deleted file mode 100644 index 3ad996f98..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/Bouquet_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/Bouquet_Flowers.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/Bouquet_Flowers.png deleted file mode 100644 index 5dfb7cfb6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/Bouquet_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCollar_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCollar_Collar.png deleted file mode 100644 index fd21ebcb5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCuffs_Cuffs.png deleted file mode 100644 index 9a6968f72..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_LargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Large_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Large_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Large_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Large_Collar.png deleted file mode 100644 index fd21ebcb5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Large_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Large_Cuffs.png deleted file mode 100644 index 9a6968f72..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCollar_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCollar_Collar.png deleted file mode 100644 index 63a151837..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCuffs_Cuffs.png deleted file mode 100644 index b3e1b2ce6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_NormalCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Normal_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Normal_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Normal_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Normal_Collar.png deleted file mode 100644 index 63a151837..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Normal_Cuffs.png deleted file mode 100644 index b3e1b2ce6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCollar_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCollar_Collar.png deleted file mode 100644 index e9ce10e66..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCuffs_Cuffs.png deleted file mode 100644 index a531224c4..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_SmallCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Small_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Small_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Small_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Small_Collar.png deleted file mode 100644 index e9ce10e66..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Small_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Small_Cuffs.png deleted file mode 100644 index a531224c4..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCollar_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCollar_Collar.png deleted file mode 100644 index fd21ebcb5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCuffs_Cuffs.png deleted file mode 100644 index 917b68980..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLarge_Bow.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLarge_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLarge_Collar.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLarge_Collar.png deleted file mode 100644 index fd21ebcb5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLarge_Cuffs.png deleted file mode 100644 index 917b68980..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/BunnyCollarCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/Camera1.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/Camera1.png deleted file mode 100644 index 36d5a1fd6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/Camera1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_Large.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_Large.png deleted file mode 100644 index f0ac9423c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_Normal.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_Normal.png deleted file mode 100644 index b2fa268bb..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_Small.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_Small.png deleted file mode 100644 index d271a965b..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_XLarge.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_XLarge.png deleted file mode 100644 index d852b18bc..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/FrillyApron_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/FurBolero.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/FurBolero.png deleted file mode 100644 index 765864e5e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/FurBolero.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Large_Back.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Large_Back.png deleted file mode 100644 index c804945b0..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Large_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Large_Front.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Large_Front.png deleted file mode 100644 index bfb22adcc..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Large_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Normal_Back.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Normal_Back.png deleted file mode 100644 index c804945b0..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Normal_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Normal_Front.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Normal_Front.png deleted file mode 100644 index 5298ddf24..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Normal_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Small_Back.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Small_Back.png deleted file mode 100644 index c804945b0..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Small_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Small_Front.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Small_Front.png deleted file mode 100644 index fac8f93b2..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_Small_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_XLarge_Back.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_XLarge_Back.png deleted file mode 100644 index c804945b0..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_XLarge_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_XLarge_Front.png b/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_XLarge_Front.png deleted file mode 100644 index 6a18fb9d8..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/OverTheHead/Poncho_XLarge_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Poncho_Large_Back.png b/Assets/Female3DCG/ClothAccessory/Poncho_Large_Back.png deleted file mode 100644 index 3846584ad..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Poncho_Large_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Poncho_Large_Front.png b/Assets/Female3DCG/ClothAccessory/Poncho_Large_Front.png deleted file mode 100644 index 546bc8b57..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Poncho_Large_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Poncho_Normal_Back.png b/Assets/Female3DCG/ClothAccessory/Poncho_Normal_Back.png deleted file mode 100644 index 7dde64b96..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Poncho_Normal_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Poncho_Normal_Front.png b/Assets/Female3DCG/ClothAccessory/Poncho_Normal_Front.png deleted file mode 100644 index e4b49a5b5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Poncho_Normal_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Poncho_Small_Back.png b/Assets/Female3DCG/ClothAccessory/Poncho_Small_Back.png deleted file mode 100644 index 7f0a677e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Poncho_Small_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Poncho_Small_Front.png b/Assets/Female3DCG/ClothAccessory/Poncho_Small_Front.png deleted file mode 100644 index 160839491..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Poncho_Small_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Poncho_XLarge_Back.png b/Assets/Female3DCG/ClothAccessory/Poncho_XLarge_Back.png deleted file mode 100644 index f695dfdfb..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Poncho_XLarge_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Poncho_XLarge_Front.png b/Assets/Female3DCG/ClothAccessory/Poncho_XLarge_Front.png deleted file mode 100644 index 7f26dd119..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Poncho_XLarge_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/Bib.png b/Assets/Female3DCG/ClothAccessory/Preview/Bib.png deleted file mode 100644 index 71a4f3f11..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/Bib.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/Bouquet.png b/Assets/Female3DCG/ClothAccessory/Preview/Bouquet.png deleted file mode 100644 index fad335113..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/Bouquet.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/BunnyCollarCuffs.png b/Assets/Female3DCG/ClothAccessory/Preview/BunnyCollarCuffs.png deleted file mode 100644 index 02c480c29..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/BunnyCollarCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/Camera1.png b/Assets/Female3DCG/ClothAccessory/Preview/Camera1.png deleted file mode 100644 index c7f87bb4b..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/Camera1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/Cape.png b/Assets/Female3DCG/ClothAccessory/Preview/Cape.png deleted file mode 100644 index b1d9edda1..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/Cape.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/CatsuitCollar.png b/Assets/Female3DCG/ClothAccessory/Preview/CatsuitCollar.png deleted file mode 100644 index 15f31e40a..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/CatsuitCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/FacePaint.png b/Assets/Female3DCG/ClothAccessory/Preview/FacePaint.png deleted file mode 100644 index 1f6f4e6ed..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/FacePaint.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/FrillyApron.png b/Assets/Female3DCG/ClothAccessory/Preview/FrillyApron.png deleted file mode 100644 index 8b0d13c19..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/FrillyApron.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/FurBolero.png b/Assets/Female3DCG/ClothAccessory/Preview/FurBolero.png deleted file mode 100644 index f98f3b9e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/FurBolero.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/Glitter.png b/Assets/Female3DCG/ClothAccessory/Preview/Glitter.png deleted file mode 100644 index 5d47728a3..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/Glitter.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/LeatherStraps.png b/Assets/Female3DCG/ClothAccessory/Preview/LeatherStraps.png deleted file mode 100644 index 54798ab88..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/LeatherStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/Poncho.png b/Assets/Female3DCG/ClothAccessory/Preview/Poncho.png deleted file mode 100644 index b96176cf3..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/Poncho.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/Scarf.png b/Assets/Female3DCG/ClothAccessory/Preview/Scarf.png deleted file mode 100644 index d8563c518..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/Scarf.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Bow1.png b/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Bow1.png deleted file mode 100644 index 122e6e5f4..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Bow1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Bow2.png b/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Bow2.png deleted file mode 100644 index bfac62b64..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Bow2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Bow3.png b/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Bow3.png deleted file mode 100644 index 8791fba10..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Bow3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Scarf.png b/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Scarf.png deleted file mode 100644 index 4bcaa9294..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Preview/StudentOutfit3Scarf.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Scarf.png b/Assets/Female3DCG/ClothAccessory/Scarf.png deleted file mode 100644 index c6a2d1d92..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Scarf.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/ScarfBundled.png b/Assets/Female3DCG/ClothAccessory/ScarfBundled.png deleted file mode 100644 index 8b5ab00e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/ScarfBundled.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/ScarfHideMouth.png b/Assets/Female3DCG/ClothAccessory/ScarfHideMouth.png deleted file mode 100644 index 356a98220..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/ScarfHideMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/StudentOutfit3Bow1.png b/Assets/Female3DCG/ClothAccessory/StudentOutfit3Bow1.png deleted file mode 100644 index 122e6e5f4..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/StudentOutfit3Bow1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/StudentOutfit3Bow2.png b/Assets/Female3DCG/ClothAccessory/StudentOutfit3Bow2.png deleted file mode 100644 index bfac62b64..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/StudentOutfit3Bow2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/StudentOutfit3Bow3.png b/Assets/Female3DCG/ClothAccessory/StudentOutfit3Bow3.png deleted file mode 100644 index 8791fba10..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/StudentOutfit3Bow3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/StudentOutfit3Scarf.png b/Assets/Female3DCG/ClothAccessory/StudentOutfit3Scarf.png deleted file mode 100644 index 4bcaa9294..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/StudentOutfit3Scarf.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCollar_Collar.png deleted file mode 100644 index 84be108e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_LargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Large_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Large_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Large_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Large_Collar.png deleted file mode 100644 index 84be108e5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Large_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Large_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCollar_Collar.png deleted file mode 100644 index f5707e15e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_NormalCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Normal_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Normal_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Normal_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Normal_Collar.png deleted file mode 100644 index f5707e15e..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Normal_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCollar_Collar.png deleted file mode 100644 index 9f9d62e2c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_SmallCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Small_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Small_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Small_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Small_Collar.png deleted file mode 100644 index 9f9d62e2c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Small_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Small_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCollar_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCollar_Collar.png deleted file mode 100644 index bff26e8ee..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCuffs_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLarge_Bow.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLarge_Bow.png deleted file mode 100644 index 5597e8054..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLarge_Collar.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLarge_Collar.png deleted file mode 100644 index bff26e8ee..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLarge_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/BunnyCollarCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/Camera1.png b/Assets/Female3DCG/ClothAccessory/TapedHands/Camera1.png deleted file mode 100644 index 36d5a1fd6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/Camera1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_Large.png b/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_Large.png deleted file mode 100644 index b733633ab..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_Normal.png b/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_Normal.png deleted file mode 100644 index ab22af966..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_Small.png b/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_Small.png deleted file mode 100644 index 00bf25aca..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_XLarge.png b/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_XLarge.png deleted file mode 100644 index 7d1e97eac..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/TapedHands/FrillyApron_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/Bouquet_Base.png b/Assets/Female3DCG/ClothAccessory/Yoked/Bouquet_Base.png deleted file mode 100644 index 3ad996f98..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/Bouquet_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/Bouquet_Flowers.png b/Assets/Female3DCG/ClothAccessory/Yoked/Bouquet_Flowers.png deleted file mode 100644 index 5dfb7cfb6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/Bouquet_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Cuffs.png deleted file mode 100644 index cd860ef7c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCollar_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCollar_Collar.png deleted file mode 100644 index 5d188837c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCuffs_Cuffs.png deleted file mode 100644 index 6772bf62f..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_LargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Large_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Large_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Large_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Large_Collar.png deleted file mode 100644 index 5d188837c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Large_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Large_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Large_Cuffs.png deleted file mode 100644 index 6772bf62f..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCollar_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCollar_Collar.png deleted file mode 100644 index dfe76b0ed..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCuffs_Cuffs.png deleted file mode 100644 index cd860ef7c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_NormalCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Normal_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Normal_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Normal_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Normal_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Normal_Collar.png deleted file mode 100644 index dfe76b0ed..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Normal_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Normal_Cuffs.png deleted file mode 100644 index cd860ef7c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCollar_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCollar_Collar.png deleted file mode 100644 index fe9327e90..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCuffs_Bow.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCuffs_Collar.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCuffs_Cuffs.png deleted file mode 100644 index d15ddb501..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_SmallCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Small_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Small_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Small_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Small_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Small_Collar.png deleted file mode 100644 index fe9327e90..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Small_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Small_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Small_Cuffs.png deleted file mode 100644 index d15ddb501..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCollar_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCollar_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCollar_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCollar_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCollar_Collar.png deleted file mode 100644 index ebbfb7499..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCollar_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCollar_Cuffs.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCollar_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCuffs_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCuffs_Bow.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCuffs_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCuffs_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCuffs_Collar.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCuffs_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCuffs_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCuffs_Cuffs.png deleted file mode 100644 index 7922b2dd5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLargeCuffs_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLarge_Bow.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLarge_Bow.png deleted file mode 100644 index 4e91ee835..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLarge_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLarge_Collar.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLarge_Collar.png deleted file mode 100644 index ebbfb7499..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLarge_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLarge_Cuffs.png deleted file mode 100644 index 7922b2dd5..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/BunnyCollarCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/Camera1.png b/Assets/Female3DCG/ClothAccessory/Yoked/Camera1.png deleted file mode 100644 index 36d5a1fd6..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/Camera1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_Large.png b/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_Large.png deleted file mode 100644 index f0ac9423c..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_Normal.png b/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_Normal.png deleted file mode 100644 index b2fa268bb..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_Small.png b/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_Small.png deleted file mode 100644 index d271a965b..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_XLarge.png b/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_XLarge.png deleted file mode 100644 index d852b18bc..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/FrillyApron_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/FurBolero.png b/Assets/Female3DCG/ClothAccessory/Yoked/FurBolero.png deleted file mode 100644 index ffc974d47..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/FurBolero.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Large_Back.png b/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Large_Back.png deleted file mode 100644 index ddd5ed51f..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Large_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Large_Front.png b/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Large_Front.png deleted file mode 100644 index e0eb00899..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Large_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Normal_Back.png b/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Normal_Back.png deleted file mode 100644 index ddd5ed51f..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Normal_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Normal_Front.png b/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Normal_Front.png deleted file mode 100644 index dc4be5326..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Normal_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Small_Back.png b/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Small_Back.png deleted file mode 100644 index ddd5ed51f..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Small_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Small_Front.png b/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Small_Front.png deleted file mode 100644 index e98d79f59..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_Small_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_XLarge_Back.png b/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_XLarge_Back.png deleted file mode 100644 index ddd5ed51f..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_XLarge_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_XLarge_Front.png b/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_XLarge_Front.png deleted file mode 100644 index cb377e1d4..000000000 Binary files a/Assets/Female3DCG/ClothAccessory/Yoked/Poncho_XLarge_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Large_Cloth.png b/Assets/Female3DCG/ClothLower/AdmiralSkirt_Large_Cloth.png deleted file mode 100644 index 059b3d04e..000000000 Binary files a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Large_Stripe.png b/Assets/Female3DCG/ClothLower/AdmiralSkirt_Large_Stripe.png deleted file mode 100644 index fb44ceaac..000000000 Binary files a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/AdmiralSkirt_Normal_Cloth.png deleted file mode 100644 index be0d7b48a..000000000 Binary files a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/AdmiralSkirt_Normal_Stripe.png deleted file mode 100644 index 24e24e9c1..000000000 Binary files a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Small_Cloth.png b/Assets/Female3DCG/ClothLower/AdmiralSkirt_Small_Cloth.png deleted file mode 100644 index 233be391b..000000000 Binary files a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Small_Stripe.png b/Assets/Female3DCG/ClothLower/AdmiralSkirt_Small_Stripe.png deleted file mode 100644 index 9922d9eb5..000000000 Binary files a/Assets/Female3DCG/ClothLower/AdmiralSkirt_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AdmiralSkirt_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/AdmiralSkirt_XLarge_Cloth.png deleted file mode 100644 index 96486e494..000000000 Binary files a/Assets/Female3DCG/ClothLower/AdmiralSkirt_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AdmiralSkirt_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/AdmiralSkirt_XLarge_Stripe.png deleted file mode 100644 index 1d55b102d..000000000 Binary files a/Assets/Female3DCG/ClothLower/AdmiralSkirt_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Back.png b/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Back.png deleted file mode 100644 index 3aa56a7e9..000000000 Binary files a/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Large_Front.png b/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Large_Front.png deleted file mode 100644 index 1be11a3ae..000000000 Binary files a/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Large_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Normal_Front.png b/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Normal_Front.png deleted file mode 100644 index 33dd19cea..000000000 Binary files a/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Normal_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Small_Front.png b/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Small_Front.png deleted file mode 100644 index 638123d0d..000000000 Binary files a/Assets/Female3DCG/ClothLower/AsymmetricSkirt_Small_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/AsymmetricSkirt_XLarge_Front.png b/Assets/Female3DCG/ClothLower/AsymmetricSkirt_XLarge_Front.png deleted file mode 100644 index 04f11eaeb..000000000 Binary files a/Assets/Female3DCG/ClothLower/AsymmetricSkirt_XLarge_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/BondageSkirt_Large_Straps.png b/Assets/Female3DCG/ClothLower/BondageSkirt_Large_Straps.png deleted file mode 100644 index bd58533ed..000000000 Binary files a/Assets/Female3DCG/ClothLower/BondageSkirt_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/BondageSkirt_Normal_Straps.png b/Assets/Female3DCG/ClothLower/BondageSkirt_Normal_Straps.png deleted file mode 100644 index 0838b8041..000000000 Binary files a/Assets/Female3DCG/ClothLower/BondageSkirt_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/BondageSkirt_Small_Straps.png b/Assets/Female3DCG/ClothLower/BondageSkirt_Small_Straps.png deleted file mode 100644 index 964514ddd..000000000 Binary files a/Assets/Female3DCG/ClothLower/BondageSkirt_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/BondageSkirt_XLarge_Straps.png b/Assets/Female3DCG/ClothLower/BondageSkirt_XLarge_Straps.png deleted file mode 100644 index d3933b5a2..000000000 Binary files a/Assets/Female3DCG/ClothLower/BondageSkirt_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ChineseSkirt1_Large.png b/Assets/Female3DCG/ClothLower/ChineseSkirt1_Large.png deleted file mode 100644 index a28c802b6..000000000 Binary files a/Assets/Female3DCG/ClothLower/ChineseSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ChineseSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/ChineseSkirt1_Normal.png deleted file mode 100644 index b2246a8f5..000000000 Binary files a/Assets/Female3DCG/ClothLower/ChineseSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ChineseSkirt1_Small.png b/Assets/Female3DCG/ClothLower/ChineseSkirt1_Small.png deleted file mode 100644 index 3ad397a9c..000000000 Binary files a/Assets/Female3DCG/ClothLower/ChineseSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ChineseSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/ChineseSkirt1_XLarge.png deleted file mode 100644 index a61fd4fa8..000000000 Binary files a/Assets/Female3DCG/ClothLower/ChineseSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ClothSkirt1_Large.png b/Assets/Female3DCG/ClothLower/ClothSkirt1_Large.png deleted file mode 100644 index 3ffc5ea00..000000000 Binary files a/Assets/Female3DCG/ClothLower/ClothSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ClothSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/ClothSkirt1_Normal.png deleted file mode 100644 index 1d5244384..000000000 Binary files a/Assets/Female3DCG/ClothLower/ClothSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ClothSkirt1_Small.png b/Assets/Female3DCG/ClothLower/ClothSkirt1_Small.png deleted file mode 100644 index 17349fb6a..000000000 Binary files a/Assets/Female3DCG/ClothLower/ClothSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ClothSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/ClothSkirt1_XLarge.png deleted file mode 100644 index 61fee83b0..000000000 Binary files a/Assets/Female3DCG/ClothLower/ClothSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/CollegeSkirt_Large.png b/Assets/Female3DCG/ClothLower/CollegeSkirt_Large.png deleted file mode 100644 index 4477df316..000000000 Binary files a/Assets/Female3DCG/ClothLower/CollegeSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/CollegeSkirt_Normal.png b/Assets/Female3DCG/ClothLower/CollegeSkirt_Normal.png deleted file mode 100644 index 9e9b97429..000000000 Binary files a/Assets/Female3DCG/ClothLower/CollegeSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/CollegeSkirt_Small.png b/Assets/Female3DCG/ClothLower/CollegeSkirt_Small.png deleted file mode 100644 index 3bb3834d7..000000000 Binary files a/Assets/Female3DCG/ClothLower/CollegeSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/CollegeSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/CollegeSkirt_XLarge.png deleted file mode 100644 index 4f5c322b6..000000000 Binary files a/Assets/Female3DCG/ClothLower/CollegeSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ElegantSkirt_Large_Design.png b/Assets/Female3DCG/ClothLower/ElegantSkirt_Large_Design.png deleted file mode 100644 index e93ffbcec..000000000 Binary files a/Assets/Female3DCG/ClothLower/ElegantSkirt_Large_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ElegantSkirt_Large_Skirt.png b/Assets/Female3DCG/ClothLower/ElegantSkirt_Large_Skirt.png deleted file mode 100644 index d21d985b8..000000000 Binary files a/Assets/Female3DCG/ClothLower/ElegantSkirt_Large_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ElegantSkirt_Normal_Design.png b/Assets/Female3DCG/ClothLower/ElegantSkirt_Normal_Design.png deleted file mode 100644 index 32168b751..000000000 Binary files a/Assets/Female3DCG/ClothLower/ElegantSkirt_Normal_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ElegantSkirt_Normal_Skirt.png b/Assets/Female3DCG/ClothLower/ElegantSkirt_Normal_Skirt.png deleted file mode 100644 index 00ee7e66d..000000000 Binary files a/Assets/Female3DCG/ClothLower/ElegantSkirt_Normal_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ElegantSkirt_Small_Design.png b/Assets/Female3DCG/ClothLower/ElegantSkirt_Small_Design.png deleted file mode 100644 index 95d7933a7..000000000 Binary files a/Assets/Female3DCG/ClothLower/ElegantSkirt_Small_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ElegantSkirt_Small_Skirt.png b/Assets/Female3DCG/ClothLower/ElegantSkirt_Small_Skirt.png deleted file mode 100644 index bfb5b5706..000000000 Binary files a/Assets/Female3DCG/ClothLower/ElegantSkirt_Small_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ElegantSkirt_XLarge_Design.png b/Assets/Female3DCG/ClothLower/ElegantSkirt_XLarge_Design.png deleted file mode 100644 index 82c40b93f..000000000 Binary files a/Assets/Female3DCG/ClothLower/ElegantSkirt_XLarge_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ElegantSkirt_XLarge_Skirt.png b/Assets/Female3DCG/ClothLower/ElegantSkirt_XLarge_Skirt.png deleted file mode 100644 index 6580a2040..000000000 Binary files a/Assets/Female3DCG/ClothLower/ElegantSkirt_XLarge_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Gown2Skirt_Large.png b/Assets/Female3DCG/ClothLower/Gown2Skirt_Large.png deleted file mode 100644 index 30d4795ac..000000000 Binary files a/Assets/Female3DCG/ClothLower/Gown2Skirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Gown2Skirt_Normal.png b/Assets/Female3DCG/ClothLower/Gown2Skirt_Normal.png deleted file mode 100644 index 85b10678f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Gown2Skirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Gown2Skirt_Small.png b/Assets/Female3DCG/ClothLower/Gown2Skirt_Small.png deleted file mode 100644 index cbf91e585..000000000 Binary files a/Assets/Female3DCG/ClothLower/Gown2Skirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Gown2Skirt_XLarge.png b/Assets/Female3DCG/ClothLower/Gown2Skirt_XLarge.png deleted file mode 100644 index eb7c7553a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Gown2Skirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Large_Buttons.png b/Assets/Female3DCG/ClothLower/HaremPants2_Large_Buttons.png deleted file mode 100644 index 5a998c3d2..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Large_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Large_Fabric.png b/Assets/Female3DCG/ClothLower/HaremPants2_Large_Fabric.png deleted file mode 100644 index e7a51176a..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Large_Panty.png b/Assets/Female3DCG/ClothLower/HaremPants2_Large_Panty.png deleted file mode 100644 index 58126c025..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Large_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Large_PantyLine.png b/Assets/Female3DCG/ClothLower/HaremPants2_Large_PantyLine.png deleted file mode 100644 index e68cb2bc1..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Large_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Large_Veil.png b/Assets/Female3DCG/ClothLower/HaremPants2_Large_Veil.png deleted file mode 100644 index a32d8eb79..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Large_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Buttons.png b/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Buttons.png deleted file mode 100644 index adfbeeed7..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Fabric.png b/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Fabric.png deleted file mode 100644 index 67c06b4fd..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Panty.png b/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Panty.png deleted file mode 100644 index d58ada496..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Normal_PantyLine.png b/Assets/Female3DCG/ClothLower/HaremPants2_Normal_PantyLine.png deleted file mode 100644 index 4d323630f..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Normal_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Veil.png b/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Veil.png deleted file mode 100644 index 1fb63fc54..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Normal_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Small_Buttons.png b/Assets/Female3DCG/ClothLower/HaremPants2_Small_Buttons.png deleted file mode 100644 index 1e687dadf..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Small_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Small_Fabric.png b/Assets/Female3DCG/ClothLower/HaremPants2_Small_Fabric.png deleted file mode 100644 index fc1d0c65c..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Small_Panty.png b/Assets/Female3DCG/ClothLower/HaremPants2_Small_Panty.png deleted file mode 100644 index 36edef9e9..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Small_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Small_PantyLine.png b/Assets/Female3DCG/ClothLower/HaremPants2_Small_PantyLine.png deleted file mode 100644 index 9bcf6e2c1..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Small_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_Small_Veil.png b/Assets/Female3DCG/ClothLower/HaremPants2_Small_Veil.png deleted file mode 100644 index 2bb7a910f..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_Small_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Buttons.png b/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Buttons.png deleted file mode 100644 index 2447ed5d7..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Fabric.png b/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Fabric.png deleted file mode 100644 index 3547ab0f8..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Panty.png b/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Panty.png deleted file mode 100644 index e30c411ee..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_PantyLine.png b/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_PantyLine.png deleted file mode 100644 index eb181d22f..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Veil.png b/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Veil.png deleted file mode 100644 index be815ee5c..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants2_XLarge_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_Large_Panty.png b/Assets/Female3DCG/ClothLower/HaremPants_Large_Panty.png deleted file mode 100644 index a9a3dd19b..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_Large_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_Large_Pantyline.png b/Assets/Female3DCG/ClothLower/HaremPants_Large_Pantyline.png deleted file mode 100644 index 95a0723ef..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_Large_Pantyline.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_Large_Veil.png b/Assets/Female3DCG/ClothLower/HaremPants_Large_Veil.png deleted file mode 100644 index b2f8a7c90..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_Large_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_Normal_Panty.png b/Assets/Female3DCG/ClothLower/HaremPants_Normal_Panty.png deleted file mode 100644 index 7db74e189..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_Normal_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_Normal_Pantyline.png b/Assets/Female3DCG/ClothLower/HaremPants_Normal_Pantyline.png deleted file mode 100644 index 0612f2dc1..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_Normal_Pantyline.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_Normal_Veil.png b/Assets/Female3DCG/ClothLower/HaremPants_Normal_Veil.png deleted file mode 100644 index 5fcb4fd62..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_Normal_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_Small_Panty.png b/Assets/Female3DCG/ClothLower/HaremPants_Small_Panty.png deleted file mode 100644 index b9034276f..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_Small_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_Small_Pantyline.png b/Assets/Female3DCG/ClothLower/HaremPants_Small_Pantyline.png deleted file mode 100644 index 028d9c4d0..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_Small_Pantyline.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_Small_Veil.png b/Assets/Female3DCG/ClothLower/HaremPants_Small_Veil.png deleted file mode 100644 index 3cca2d968..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_Small_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_XLarge_Panty.png b/Assets/Female3DCG/ClothLower/HaremPants_XLarge_Panty.png deleted file mode 100644 index f25dfccdc..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_XLarge_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_XLarge_Pantyline.png b/Assets/Female3DCG/ClothLower/HaremPants_XLarge_Pantyline.png deleted file mode 100644 index d1f8116b5..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_XLarge_Pantyline.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HaremPants_XLarge_Veil.png b/Assets/Female3DCG/ClothLower/HaremPants_XLarge_Veil.png deleted file mode 100644 index 422982279..000000000 Binary files a/Assets/Female3DCG/ClothLower/HaremPants_XLarge_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HulaSkirt_BackLeaves.png b/Assets/Female3DCG/ClothLower/HulaSkirt_BackLeaves.png deleted file mode 100644 index 57acff648..000000000 Binary files a/Assets/Female3DCG/ClothLower/HulaSkirt_BackLeaves.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HulaSkirt_Flowers.png b/Assets/Female3DCG/ClothLower/HulaSkirt_Flowers.png deleted file mode 100644 index 5870fe067..000000000 Binary files a/Assets/Female3DCG/ClothLower/HulaSkirt_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HulaSkirt_FrontLeaves.png b/Assets/Female3DCG/ClothLower/HulaSkirt_FrontLeaves.png deleted file mode 100644 index e857a279d..000000000 Binary files a/Assets/Female3DCG/ClothLower/HulaSkirt_FrontLeaves.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/HulaSkirt_Pollen.png b/Assets/Female3DCG/ClothLower/HulaSkirt_Pollen.png deleted file mode 100644 index c8bda787a..000000000 Binary files a/Assets/Female3DCG/ClothLower/HulaSkirt_Pollen.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/JeanSkirt_Large.png b/Assets/Female3DCG/ClothLower/JeanSkirt_Large.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/JeanSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/JeanSkirt_Normal.png b/Assets/Female3DCG/ClothLower/JeanSkirt_Normal.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/JeanSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/JeanSkirt_Small.png b/Assets/Female3DCG/ClothLower/JeanSkirt_Small.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/JeanSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/JeanSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/JeanSkirt_XLarge.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/JeanSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Jeans1_Large.png b/Assets/Female3DCG/ClothLower/Jeans1_Large.png deleted file mode 100644 index e52d3695d..000000000 Binary files a/Assets/Female3DCG/ClothLower/Jeans1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Jeans1_Normal.png b/Assets/Female3DCG/ClothLower/Jeans1_Normal.png deleted file mode 100644 index 39f89737c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Jeans1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Jeans1_Small.png b/Assets/Female3DCG/ClothLower/Jeans1_Small.png deleted file mode 100644 index 1e61fa5bf..000000000 Binary files a/Assets/Female3DCG/ClothLower/Jeans1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Jeans1_XLarge.png b/Assets/Female3DCG/ClothLower/Jeans1_XLarge.png deleted file mode 100644 index 82df21983..000000000 Binary files a/Assets/Female3DCG/ClothLower/Jeans1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Jeans2_Large.png b/Assets/Female3DCG/ClothLower/Jeans2_Large.png deleted file mode 100644 index 4c015d47e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Jeans2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Jeans2_Normal.png b/Assets/Female3DCG/ClothLower/Jeans2_Normal.png deleted file mode 100644 index 10a16d0e4..000000000 Binary files a/Assets/Female3DCG/ClothLower/Jeans2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Jeans2_Small.png b/Assets/Female3DCG/ClothLower/Jeans2_Small.png deleted file mode 100644 index ad9582623..000000000 Binary files a/Assets/Female3DCG/ClothLower/Jeans2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Jeans2_XLarge.png b/Assets/Female3DCG/ClothLower/Jeans2_XLarge.png deleted file mode 100644 index e187cc716..000000000 Binary files a/Assets/Female3DCG/ClothLower/Jeans2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/JeansShorts_Large.png b/Assets/Female3DCG/ClothLower/JeansShorts_Large.png deleted file mode 100644 index a9b4c2017..000000000 Binary files a/Assets/Female3DCG/ClothLower/JeansShorts_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/JeansShorts_Normal.png b/Assets/Female3DCG/ClothLower/JeansShorts_Normal.png deleted file mode 100644 index d7e0a21b4..000000000 Binary files a/Assets/Female3DCG/ClothLower/JeansShorts_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/JeansShorts_Small.png b/Assets/Female3DCG/ClothLower/JeansShorts_Small.png deleted file mode 100644 index 0cd09f3a8..000000000 Binary files a/Assets/Female3DCG/ClothLower/JeansShorts_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/JeansShorts_XLarge.png b/Assets/Female3DCG/ClothLower/JeansShorts_XLarge.png deleted file mode 100644 index 618cd1497..000000000 Binary files a/Assets/Female3DCG/ClothLower/JeansShorts_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Back.png b/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Back.png deleted file mode 100644 index f9bad08e3..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Large_Front.png b/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Large_Front.png deleted file mode 100644 index cd475c622..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Large_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Normal_Front.png b/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Normal_Front.png deleted file mode 100644 index 205f0337c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Normal_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Small_Front.png b/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Small_Front.png deleted file mode 100644 index 3c2f27cfa..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_Small_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_XLarge_Front.png b/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_XLarge_Front.png deleted file mode 100644 index 6a7be05ca..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/AsymmetricSkirt_XLarge_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Large_Frill.png b/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Large_Frill.png deleted file mode 100644 index 6d2d7db20..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Large_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Large_Skirt.png b/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Large_Skirt.png deleted file mode 100644 index 9f581da51..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Large_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Normal_Frill.png b/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Normal_Frill.png deleted file mode 100644 index b93bcee40..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Normal_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Normal_Skirt.png b/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Normal_Skirt.png deleted file mode 100644 index 7218b1a09..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Normal_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Small_Frill.png b/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Small_Frill.png deleted file mode 100644 index 20f04a240..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Small_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Small_Skirt.png b/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Small_Skirt.png deleted file mode 100644 index 4a3ff208c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_Small_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_XLarge_Frill.png b/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_XLarge_Frill.png deleted file mode 100644 index 7ae801343..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_XLarge_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_XLarge_Skirt.png b/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_XLarge_Skirt.png deleted file mode 100644 index 83e64b4d7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/BondageSkirt_XLarge_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_Large.png b/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_Large.png deleted file mode 100644 index a28c802b6..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_Normal.png deleted file mode 100644 index b2246a8f5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_Small.png b/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_Small.png deleted file mode 100644 index 3ad397a9c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_XLarge.png deleted file mode 100644 index a61fd4fa8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ChineseSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_Large.png b/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_Large.png deleted file mode 100644 index 3ffc5ea00..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_Normal.png deleted file mode 100644 index 1d5244384..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_Small.png b/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_Small.png deleted file mode 100644 index 17349fb6a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_XLarge.png deleted file mode 100644 index 61fee83b0..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ClothSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Large_Design.png b/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Large_Design.png deleted file mode 100644 index e4bb7b367..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Large_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Large_Skirt.png b/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Large_Skirt.png deleted file mode 100644 index 36342db22..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Large_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Normal_Design.png b/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Normal_Design.png deleted file mode 100644 index 88c72e2d4..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Normal_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Normal_Skirt.png b/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Normal_Skirt.png deleted file mode 100644 index 0fdb19a04..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Normal_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Small_Design.png b/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Small_Design.png deleted file mode 100644 index 024ba08fa..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Small_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Small_Skirt.png b/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Small_Skirt.png deleted file mode 100644 index b39800432..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_Small_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_XLarge_Design.png b/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_XLarge_Design.png deleted file mode 100644 index 7cc54fc19..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_XLarge_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_XLarge_Skirt.png b/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_XLarge_Skirt.png deleted file mode 100644 index 6874d6b9e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ElegantSkirt_XLarge_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_Large.png b/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_Large.png deleted file mode 100644 index c407986f4..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_Normal.png deleted file mode 100644 index 4da9b6d8f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_Small.png b/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_Small.png deleted file mode 100644 index c7759786a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_XLarge.png deleted file mode 100644 index eb2ccb86b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Gown2Skirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Buttons.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Buttons.png deleted file mode 100644 index 8a3c298c7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Fabric.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Fabric.png deleted file mode 100644 index 1f4f08e9f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Panty.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Panty.png deleted file mode 100644 index e50c1369f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_PantyLine.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_PantyLine.png deleted file mode 100644 index 83a59ffa2..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Veil.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Veil.png deleted file mode 100644 index ad9478d20..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Large_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Buttons.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Buttons.png deleted file mode 100644 index b95d1facc..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Fabric.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Fabric.png deleted file mode 100644 index 77b39d2c6..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Panty.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Panty.png deleted file mode 100644 index 418f4939c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_PantyLine.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_PantyLine.png deleted file mode 100644 index 6baf84ef0..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Veil.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Veil.png deleted file mode 100644 index d1fcfad2b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Normal_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Buttons.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Buttons.png deleted file mode 100644 index 57411727d..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Fabric.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Fabric.png deleted file mode 100644 index 60f7c3060..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Panty.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Panty.png deleted file mode 100644 index 458745bbe..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_PantyLine.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_PantyLine.png deleted file mode 100644 index 7ddb63f54..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Veil.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Veil.png deleted file mode 100644 index 9d10551c1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_Small_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Buttons.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Buttons.png deleted file mode 100644 index 70ef433ee..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Fabric.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Fabric.png deleted file mode 100644 index 7e4a079c2..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Panty.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Panty.png deleted file mode 100644 index 33f6ee73a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_PantyLine.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_PantyLine.png deleted file mode 100644 index f7bc77be5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Veil.png b/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Veil.png deleted file mode 100644 index 0caa1a1fe..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/HaremPants2_XLarge_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_Large.png b/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_Large.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_Normal.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_Small.png b/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_Small.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_XLarge.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/JeanSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Jeans1_Large.png b/Assets/Female3DCG/ClothLower/Kneel/Jeans1_Large.png deleted file mode 100644 index 73ea4d37e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Jeans1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Jeans1_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/Jeans1_Normal.png deleted file mode 100644 index dbb084937..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Jeans1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Jeans1_Small.png b/Assets/Female3DCG/ClothLower/Kneel/Jeans1_Small.png deleted file mode 100644 index 70c7ea56b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Jeans1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Jeans1_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/Jeans1_XLarge.png deleted file mode 100644 index 5d7e4ad2c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Jeans1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Jeans2_Large.png b/Assets/Female3DCG/ClothLower/Kneel/Jeans2_Large.png deleted file mode 100644 index e14f57aa4..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Jeans2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Jeans2_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/Jeans2_Normal.png deleted file mode 100644 index 13dcb230d..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Jeans2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Jeans2_Small.png b/Assets/Female3DCG/ClothLower/Kneel/Jeans2_Small.png deleted file mode 100644 index 23c73e862..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Jeans2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Jeans2_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/Jeans2_XLarge.png deleted file mode 100644 index b5c12d884..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Jeans2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_Large.png b/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_Large.png deleted file mode 100644 index 6519bc2eb..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_Normal.png deleted file mode 100644 index 08ae01dca..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_Small.png b/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_Small.png deleted file mode 100644 index a36797350..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_XLarge.png deleted file mode 100644 index 9689e9713..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/JeansShorts_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_Large.png b/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_Large.png deleted file mode 100644 index edb961d02..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_Normal.png deleted file mode 100644 index 5da6b5ac6..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_Small.png b/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_Small.png deleted file mode 100644 index b09108d60..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_XLarge.png deleted file mode 100644 index a5f3a25e3..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexPants1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_Large.png b/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_Large.png deleted file mode 100644 index 32afffb03..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_Normal.png deleted file mode 100644 index 8b7d8e158..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_Small.png b/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_Small.png deleted file mode 100644 index 90adfdf18..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_XLarge.png deleted file mode 100644 index 782392f1a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_Large.png b/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_Large.png deleted file mode 100644 index 6203e47c2..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_Normal.png deleted file mode 100644 index e01244e14..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_Small.png b/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_Small.png deleted file mode 100644 index 8f65a51a9..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_XLarge.png deleted file mode 100644 index 8950afbad..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LatexSkirt2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Large_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Large_Cloth.png deleted file mode 100644 index 4da9f7195..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Large_Stripe.png deleted file mode 100644 index e05f953cf..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Normal_Cloth.png deleted file mode 100644 index fab067ae2..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Normal_Stripe.png deleted file mode 100644 index d3a8d15bd..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Small_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Small_Cloth.png deleted file mode 100644 index 58400ba02..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Small_Stripe.png deleted file mode 100644 index 56baa1e8e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings1_XLarge_Cloth.png deleted file mode 100644 index 01a9df550..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings1_XLarge_Stripe.png deleted file mode 100644 index 5fd216460..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Large_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Large_Cloth.png deleted file mode 100644 index 7a730733c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Large_Stripe.png deleted file mode 100644 index c716ae637..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Normal_Cloth.png deleted file mode 100644 index 0d6fd6cb1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Normal_Stripe.png deleted file mode 100644 index 0bb5df2e9..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Small_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Small_Cloth.png deleted file mode 100644 index 79f57e27b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Small_Stripe.png deleted file mode 100644 index a4d5f26c7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings2_XLarge_Cloth.png deleted file mode 100644 index 127883d26..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Leggings2_XLarge_Stripe.png deleted file mode 100644 index 658052b32..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Leggings2_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LongSkirt1_Back.png b/Assets/Female3DCG/ClothLower/Kneel/LongSkirt1_Back.png deleted file mode 100644 index 60659c803..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LongSkirt1_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/LongSkirt1_Front.png b/Assets/Female3DCG/ClothLower/Kneel/LongSkirt1_Front.png deleted file mode 100644 index 1d579e85a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/LongSkirt1_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_Large.png b/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_Large.png deleted file mode 100644 index b6dfbb9bb..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_Normal.png deleted file mode 100644 index 190fb7473..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_Small.png b/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_Small.png deleted file mode 100644 index e63c37744..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_XLarge.png deleted file mode 100644 index 664468fe7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/MistressBottom_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Large_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Large_Cloth.png deleted file mode 100644 index 9f30716d8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Large_Stripe.png deleted file mode 100644 index fd9fa94b8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Normal_Cloth.png deleted file mode 100644 index 6bd0209c3..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Normal_Stripe.png deleted file mode 100644 index fd9fa94b8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Small_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Small_Cloth.png deleted file mode 100644 index 27d2c9c0e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Small_Stripe.png deleted file mode 100644 index fd9fa94b8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/Kneel/Pajama1_XLarge_Cloth.png deleted file mode 100644 index 0348e0955..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Pajama1_XLarge_Stripe.png deleted file mode 100644 index fd9fa94b8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Pajama1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_Large.png b/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_Large.png deleted file mode 100644 index ccc059234..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_Normal.png deleted file mode 100644 index 4021de8a6..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_Small.png b/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_Small.png deleted file mode 100644 index 15969107a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_XLarge.png deleted file mode 100644 index 4a798ed8a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PencilSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Large_Dress.png b/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Large_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Large_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Normal_Dress.png b/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Normal_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Normal_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Small_Dress.png b/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Small_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Small_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_XLarge_Dress.png b/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_XLarge_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_XLarge_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/PleatedSkirt_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_Large.png b/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_Large.png deleted file mode 100644 index 80e9a71e0..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_Normal.png deleted file mode 100644 index 9ebb02b66..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_Small.png b/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_Small.png deleted file mode 100644 index cfe327085..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_XLarge.png deleted file mode 100644 index 5c83404fa..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/RuffledSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_Large.png b/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_Large.png deleted file mode 100644 index 4024eb9ad..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_Normal.png deleted file mode 100644 index e00ab53a7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_Small.png b/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_Small.png deleted file mode 100644 index c81e8598f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_XLarge.png deleted file mode 100644 index 90e4635e8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ShortPencilSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_Large.png b/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_Large.png deleted file mode 100644 index dd3ae5ee7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_Normal.png deleted file mode 100644 index ee4c8b752..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_Small.png b/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_Small.png deleted file mode 100644 index 7f4621a43..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_XLarge.png deleted file mode 100644 index b1ad6dfcd..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/ShortPlaidSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Shorts1_Large.png b/Assets/Female3DCG/ClothLower/Kneel/Shorts1_Large.png deleted file mode 100644 index 739973fe1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Shorts1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Shorts1_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/Shorts1_Normal.png deleted file mode 100644 index f51d90ee0..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Shorts1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Shorts1_Small.png b/Assets/Female3DCG/ClothLower/Kneel/Shorts1_Small.png deleted file mode 100644 index 31eb15650..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Shorts1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Shorts1_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/Shorts1_XLarge.png deleted file mode 100644 index d16695cad..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Shorts1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt1_Large.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt1_Large.png deleted file mode 100644 index a9ce7bb1f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt1_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt1_Normal.png deleted file mode 100644 index bbeca3e1b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt1_Small.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt1_Small.png deleted file mode 100644 index 20c44f025..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt1_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt1_XLarge.png deleted file mode 100644 index 3b94ffbcd..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Large_Color.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Large_Color.png deleted file mode 100644 index 3a8b19d0b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Large_Stripe.png deleted file mode 100644 index 956272d96..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Normal_Color.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Normal_Color.png deleted file mode 100644 index a480e22f9..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Normal_Stripe.png deleted file mode 100644 index 481040d85..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Small_Color.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Small_Color.png deleted file mode 100644 index d539509c1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Small_Stripe.png deleted file mode 100644 index a4202be28..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_XLarge_Color.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt2_XLarge_Color.png deleted file mode 100644 index d40de0acb..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt2_XLarge_Stripe.png deleted file mode 100644 index ab936b515..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt2_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Large_Color.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Large_Color.png deleted file mode 100644 index 411a59513..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Large_Stripe.png deleted file mode 100644 index c6b8c3d85..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Normal_Color.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Normal_Color.png deleted file mode 100644 index 8a2b01b94..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Normal_Stripe.png deleted file mode 100644 index 9d9e9d831..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Small_Color.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Small_Color.png deleted file mode 100644 index f79b01f04..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Small_Stripe.png deleted file mode 100644 index 6026acc85..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_XLarge_Color.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt3_XLarge_Color.png deleted file mode 100644 index 9be2243b7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/Skirt3_XLarge_Stripe.png deleted file mode 100644 index d3691c46b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Skirt3_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Large_Color.png b/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Large_Color.png deleted file mode 100644 index 50b76a102..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Large_Stripe.png deleted file mode 100644 index 18af2a97d..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Normal_Color.png b/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Normal_Color.png deleted file mode 100644 index 42ba1b4d5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Normal_Stripe.png deleted file mode 100644 index 0396b423a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Small_Color.png b/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Small_Color.png deleted file mode 100644 index b0ede802c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Small_Stripe.png deleted file mode 100644 index 2b65871ee..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_XLarge_Color.png b/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_XLarge_Color.png deleted file mode 100644 index e205b5642..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_XLarge_Stripe.png deleted file mode 100644 index 8996a3333..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/TennisSkirt1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie1_Large.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie1_Large.png deleted file mode 100644 index 42249a0cf..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie1_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie1_Normal.png deleted file mode 100644 index c37f48f59..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie1_Small.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie1_Small.png deleted file mode 100644 index 6337b22b5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie1_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie1_XLarge.png deleted file mode 100644 index 307c40111..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie2_Large.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie2_Large.png deleted file mode 100644 index fb3123229..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie2_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie2_Normal.png deleted file mode 100644 index 84e7dae00..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie2_Small.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie2_Small.png deleted file mode 100644 index 01021712e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie2_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie2_XLarge.png deleted file mode 100644 index 6cc27d2e3..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie3_Large.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie3_Large.png deleted file mode 100644 index 805ae37ac..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie3_Normal.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie3_Normal.png deleted file mode 100644 index bbd8be846..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie3_Small.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie3_Small.png deleted file mode 100644 index 98d8add1b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Kneel/Waspie3_XLarge.png b/Assets/Female3DCG/ClothLower/Kneel/Waspie3_XLarge.png deleted file mode 100644 index a3d113fb8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Kneel/Waspie3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Large_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Large_Cloth.png deleted file mode 100644 index f6667fb6c..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Large_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Large_Stripe.png deleted file mode 100644 index 9627f2052..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Normal_Cloth.png deleted file mode 100644 index e2fc6966f..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Normal_Stripe.png deleted file mode 100644 index e21e8f486..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Small_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Small_Cloth.png deleted file mode 100644 index 1ebd42771..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Small_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Small_Stripe.png deleted file mode 100644 index 93812b4c8..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_XLarge_Cloth.png deleted file mode 100644 index be68c24d5..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_XLarge_Stripe.png deleted file mode 100644 index 2498e645f..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AdmiralSkirt_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Back.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Back.png deleted file mode 100644 index 4b647cf3f..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Large_Front.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Large_Front.png deleted file mode 100644 index 97d5db58b..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Large_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Normal_Front.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Normal_Front.png deleted file mode 100644 index b286b555f..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Normal_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Small_Front.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Small_Front.png deleted file mode 100644 index d94be39a0..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_Small_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_XLarge_Front.png b/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_XLarge_Front.png deleted file mode 100644 index 3eb2e712c..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/AsymmetricSkirt_XLarge_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_Large.png deleted file mode 100644 index 7594dbc77..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_Normal.png deleted file mode 100644 index 5686a4c67..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_Small.png deleted file mode 100644 index e55c458e6..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_XLarge.png deleted file mode 100644 index 712f518a6..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ChineseSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_Large.png deleted file mode 100644 index 6203d9de0..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_Normal.png deleted file mode 100644 index 5b8d5346c..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_Small.png deleted file mode 100644 index 52e31d27c..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_XLarge.png deleted file mode 100644 index fa3aea27b..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ClothSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_Large.png deleted file mode 100644 index d47c93da0..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_Normal.png deleted file mode 100644 index edf6a3734..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_Small.png deleted file mode 100644 index 17dac7bb2..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_XLarge.png deleted file mode 100644 index f84804105..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/CollegeSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Large_Design.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Large_Design.png deleted file mode 100644 index b28761f11..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Large_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Large_Skirt.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Large_Skirt.png deleted file mode 100644 index b47caeeae..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Large_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Normal_Design.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Normal_Design.png deleted file mode 100644 index 72123d3c2..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Normal_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Normal_Skirt.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Normal_Skirt.png deleted file mode 100644 index c861d3273..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Normal_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Small_Design.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Small_Design.png deleted file mode 100644 index e3aafa844..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Small_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Small_Skirt.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Small_Skirt.png deleted file mode 100644 index 20928ad20..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_Small_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_XLarge_Design.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_XLarge_Design.png deleted file mode 100644 index f4e513700..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_XLarge_Design.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_XLarge_Skirt.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_XLarge_Skirt.png deleted file mode 100644 index 0a7584a95..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ElegantSkirt_XLarge_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Buttons.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Buttons.png deleted file mode 100644 index 557d7f8ef..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Fabric.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Fabric.png deleted file mode 100644 index 42586c21b..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Panty.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Panty.png deleted file mode 100644 index 3b9715881..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_PantyLine.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_PantyLine.png deleted file mode 100644 index 2d9938449..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Veil.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Veil.png deleted file mode 100644 index 53c85f4b0..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Large_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Buttons.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Buttons.png deleted file mode 100644 index e6d1cb3f9..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Fabric.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Fabric.png deleted file mode 100644 index 1244ed2d2..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Panty.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Panty.png deleted file mode 100644 index 9dbff3b90..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_PantyLine.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_PantyLine.png deleted file mode 100644 index dee246da0..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Veil.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Veil.png deleted file mode 100644 index 9afdadb76..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Normal_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Buttons.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Buttons.png deleted file mode 100644 index b72892426..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Fabric.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Fabric.png deleted file mode 100644 index 2a1cba044..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Panty.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Panty.png deleted file mode 100644 index b486b1bca..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_PantyLine.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_PantyLine.png deleted file mode 100644 index f67ae44f5..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Veil.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Veil.png deleted file mode 100644 index 092e37fd6..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_Small_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Buttons.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Buttons.png deleted file mode 100644 index 4d1dba826..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Fabric.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Fabric.png deleted file mode 100644 index f1057873e..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Panty.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Panty.png deleted file mode 100644 index 8449e2945..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_PantyLine.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_PantyLine.png deleted file mode 100644 index 058eb3584..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Veil.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Veil.png deleted file mode 100644 index b110437c3..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants2_XLarge_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Large_Panty.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Large_Panty.png deleted file mode 100644 index 10e82877c..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Large_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Large_Pantyline.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Large_Pantyline.png deleted file mode 100644 index 472c7d888..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Large_Pantyline.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Large_Veil.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Large_Veil.png deleted file mode 100644 index 2ab311eb1..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Large_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Normal_Panty.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Normal_Panty.png deleted file mode 100644 index 5e55bff00..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Normal_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Normal_Pantyline.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Normal_Pantyline.png deleted file mode 100644 index f7bdd2896..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Normal_Pantyline.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Normal_Veil.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Normal_Veil.png deleted file mode 100644 index 4530ff826..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Normal_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Small_Panty.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Small_Panty.png deleted file mode 100644 index ccdeeb934..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Small_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Small_Pantyline.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Small_Pantyline.png deleted file mode 100644 index d25454d03..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Small_Pantyline.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Small_Veil.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Small_Veil.png deleted file mode 100644 index f146135ec..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_Small_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_XLarge_Panty.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_XLarge_Panty.png deleted file mode 100644 index f69545119..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_XLarge_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_XLarge_Pantyline.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_XLarge_Pantyline.png deleted file mode 100644 index 6274a9da6..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_XLarge_Pantyline.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_XLarge_Veil.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_XLarge_Veil.png deleted file mode 100644 index fda695875..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HaremPants_XLarge_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_BackLeaves.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_BackLeaves.png deleted file mode 100644 index 42f26c500..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_BackLeaves.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_Flowers.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_Flowers.png deleted file mode 100644 index 742450963..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_FrontLeaves.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_FrontLeaves.png deleted file mode 100644 index 84a34ba45..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_FrontLeaves.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_Pollen.png b/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_Pollen.png deleted file mode 100644 index 1ac10f44c..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/HulaSkirt_Pollen.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_Large.png deleted file mode 100644 index a9c9cb62e..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_Normal.png deleted file mode 100644 index 212e3bca9..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_Small.png deleted file mode 100644 index 07ef695d7..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_XLarge.png deleted file mode 100644 index b05a3d778..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/JeanSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_Large.png deleted file mode 100644 index 59a50319e..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_Normal.png deleted file mode 100644 index 29d2eea02..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_Small.png deleted file mode 100644 index 3567f6ae8..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_XLarge.png deleted file mode 100644 index 0246dc393..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_Large.png deleted file mode 100644 index de90351ff..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_Normal.png deleted file mode 100644 index 03697db58..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_Small.png deleted file mode 100644 index b6a4a11a1..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_XLarge.png deleted file mode 100644 index 0152ed7c7..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Jeans2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_Large.png deleted file mode 100644 index d79d326e6..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_Normal.png deleted file mode 100644 index d65e43451..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_Small.png deleted file mode 100644 index 1e5114138..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_XLarge.png deleted file mode 100644 index d819f9ff8..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/JeansShorts_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_Large.png deleted file mode 100644 index 9f51e1cd7..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_Normal.png deleted file mode 100644 index 185c56ddf..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_Small.png deleted file mode 100644 index ca0528a54..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_XLarge.png deleted file mode 100644 index 895fca318..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexPants1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_Large.png deleted file mode 100644 index db51cd18a..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_Normal.png deleted file mode 100644 index 5dd7f6ed9..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_Small.png deleted file mode 100644 index 3ed782402..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_XLarge.png deleted file mode 100644 index 550cb429a..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_Large.png deleted file mode 100644 index 8a809ab4c..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_Normal.png deleted file mode 100644 index 9075265cb..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_Small.png deleted file mode 100644 index a17961a72..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_XLarge.png deleted file mode 100644 index 2fdcab0fa..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/LatexSkirt2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Large_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Large_Cloth.png deleted file mode 100644 index d66178a7c..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Large_Stripe.png deleted file mode 100644 index 1caf9e1bc..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Normal_Cloth.png deleted file mode 100644 index 9ae00a0e7..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Normal_Stripe.png deleted file mode 100644 index 316efebab..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Small_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Small_Cloth.png deleted file mode 100644 index aeac67f94..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Small_Stripe.png deleted file mode 100644 index d7ae525b8..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_XLarge_Cloth.png deleted file mode 100644 index 0b023746b..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_XLarge_Stripe.png deleted file mode 100644 index 11ece294d..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Large_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Large_Cloth.png deleted file mode 100644 index fc50fa17b..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Large_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Large_Stripe.png deleted file mode 100644 index 4a589ed40..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Normal_Cloth.png deleted file mode 100644 index f79f42c6d..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Normal_Stripe.png deleted file mode 100644 index dc55b2e46..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Small_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Small_Cloth.png deleted file mode 100644 index d9a7fad01..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Small_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Small_Stripe.png deleted file mode 100644 index 1e049da9a..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_XLarge_Cloth.png deleted file mode 100644 index 9dae3dd7b..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_XLarge_Stripe.png deleted file mode 100644 index d955cbfb1..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Leggings2_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/MageSkirt_Skirt.png b/Assets/Female3DCG/ClothLower/KneelingSpread/MageSkirt_Skirt.png deleted file mode 100644 index 781940220..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/MageSkirt_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/MageSkirt_Waist.png b/Assets/Female3DCG/ClothLower/KneelingSpread/MageSkirt_Waist.png deleted file mode 100644 index 6eae9063f..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/MageSkirt_Waist.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_Large.png deleted file mode 100644 index 5f7b0df25..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_Normal.png deleted file mode 100644 index e66d095a7..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_Small.png deleted file mode 100644 index 10d1aaa12..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_XLarge.png deleted file mode 100644 index 586b9a450..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/MistressBottom_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Large_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Large_Cloth.png deleted file mode 100644 index 1de014ba8..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Large_Stripe.png deleted file mode 100644 index 7adbca385..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Normal_Cloth.png deleted file mode 100644 index 797c67785..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Normal_Stripe.png deleted file mode 100644 index a39b2f9c1..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Small_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Small_Cloth.png deleted file mode 100644 index e30f19a34..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Small_Stripe.png deleted file mode 100644 index 4691da446..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_XLarge_Cloth.png deleted file mode 100644 index dbcf90690..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_XLarge_Stripe.png deleted file mode 100644 index 453f53e2f..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Pajama1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Large_Dress.png b/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Large_Dress.png deleted file mode 100644 index ff844723c..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Large_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Large_Stripe.png deleted file mode 100644 index bcd6eeaff..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Normal_Dress.png b/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Normal_Dress.png deleted file mode 100644 index f0aa507c6..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Normal_Stripe.png deleted file mode 100644 index 1dcabcb7a..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Small_Dress.png b/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Small_Dress.png deleted file mode 100644 index 02919ac1d..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Small_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Small_Stripe.png deleted file mode 100644 index 0a03bdb34..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_XLarge_Dress.png b/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_XLarge_Dress.png deleted file mode 100644 index 00e9e1f27..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_XLarge_Stripe.png deleted file mode 100644 index 14f9fc483..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/PleatedSkirt_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_Large.png deleted file mode 100644 index ae453dd4a..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_Normal.png deleted file mode 100644 index b25c30841..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_Small.png deleted file mode 100644 index 7014af83d..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_XLarge.png deleted file mode 100644 index 199895cb2..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/RuffledSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_Large.png deleted file mode 100644 index eda2b196b..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_Normal.png deleted file mode 100644 index 80b1c38a0..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_Small.png deleted file mode 100644 index 8fab3a75d..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_XLarge.png deleted file mode 100644 index b29a2540d..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/ShortPlaidSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_Large.png deleted file mode 100644 index e88ac771c..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_Normal.png deleted file mode 100644 index c0d48bb70..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_Small.png deleted file mode 100644 index 1b9423657..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_XLarge.png deleted file mode 100644 index 327f0294b..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Shorts1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_Large.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_Large.png deleted file mode 100644 index 501544dad..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_Normal.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_Normal.png deleted file mode 100644 index 4ff04ab05..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_Small.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_Small.png deleted file mode 100644 index 629c1fbb9..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_XLarge.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_XLarge.png deleted file mode 100644 index 42bab0ce1..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Large_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Large_Color.png deleted file mode 100644 index 6c64f3498..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Large_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Large_Stripe.png deleted file mode 100644 index 18813c336..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Normal_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Normal_Color.png deleted file mode 100644 index 6e41091af..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Normal_Stripe.png deleted file mode 100644 index b669fb0fb..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Small_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Small_Color.png deleted file mode 100644 index f1b120278..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Small_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Small_Stripe.png deleted file mode 100644 index d8c029311..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_XLarge_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_XLarge_Color.png deleted file mode 100644 index c15b4898f..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_XLarge_Stripe.png deleted file mode 100644 index 2c807f350..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt2_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Large_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Large_Color.png deleted file mode 100644 index 9e07dfdbb..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Large_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Large_Stripe.png deleted file mode 100644 index 20cd49e86..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Normal_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Normal_Color.png deleted file mode 100644 index d5484587e..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Normal_Stripe.png deleted file mode 100644 index f9c8804ea..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Small_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Small_Color.png deleted file mode 100644 index 2f932b5a0..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Small_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Small_Stripe.png deleted file mode 100644 index aad72167b..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_XLarge_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_XLarge_Color.png deleted file mode 100644 index 89b635bed..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_XLarge_Stripe.png deleted file mode 100644 index 3d4ac08c0..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/Skirt3_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Large_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Large_Color.png deleted file mode 100644 index 4ea1da9a0..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Large_Stripe.png deleted file mode 100644 index b51cb7db7..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Normal_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Normal_Color.png deleted file mode 100644 index 7aca0ca8a..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Normal_Stripe.png deleted file mode 100644 index 18c6f4a84..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Small_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Small_Color.png deleted file mode 100644 index 734fb4b89..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Small_Stripe.png deleted file mode 100644 index 9c012b19e..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_XLarge_Color.png b/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_XLarge_Color.png deleted file mode 100644 index 462f63461..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_XLarge_Stripe.png deleted file mode 100644 index fa97e9310..000000000 Binary files a/Assets/Female3DCG/ClothLower/KneelingSpread/TennisSkirt1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexPants1_Large.png b/Assets/Female3DCG/ClothLower/LatexPants1_Large.png deleted file mode 100644 index f0303824d..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexPants1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexPants1_Normal.png b/Assets/Female3DCG/ClothLower/LatexPants1_Normal.png deleted file mode 100644 index 326caab3c..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexPants1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexPants1_Small.png b/Assets/Female3DCG/ClothLower/LatexPants1_Small.png deleted file mode 100644 index c0fa4e536..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexPants1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexPants1_XLarge.png b/Assets/Female3DCG/ClothLower/LatexPants1_XLarge.png deleted file mode 100644 index a75c79a55..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexPants1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexSkirt1_Large.png b/Assets/Female3DCG/ClothLower/LatexSkirt1_Large.png deleted file mode 100644 index 32afffb03..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/LatexSkirt1_Normal.png deleted file mode 100644 index 874a2eeb0..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexSkirt1_Small.png b/Assets/Female3DCG/ClothLower/LatexSkirt1_Small.png deleted file mode 100644 index 95354df85..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/LatexSkirt1_XLarge.png deleted file mode 100644 index 782392f1a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexSkirt2_Large.png b/Assets/Female3DCG/ClothLower/LatexSkirt2_Large.png deleted file mode 100644 index 6203e47c2..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexSkirt2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexSkirt2_Normal.png b/Assets/Female3DCG/ClothLower/LatexSkirt2_Normal.png deleted file mode 100644 index e01244e14..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexSkirt2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexSkirt2_Small.png b/Assets/Female3DCG/ClothLower/LatexSkirt2_Small.png deleted file mode 100644 index 8f65a51a9..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexSkirt2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LatexSkirt2_XLarge.png b/Assets/Female3DCG/ClothLower/LatexSkirt2_XLarge.png deleted file mode 100644 index 8950afbad..000000000 Binary files a/Assets/Female3DCG/ClothLower/LatexSkirt2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings1_Large_Cloth.png b/Assets/Female3DCG/ClothLower/Leggings1_Large_Cloth.png deleted file mode 100644 index 305a2154f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings1_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Leggings1_Large_Stripe.png deleted file mode 100644 index ba47b692d..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings1_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/Leggings1_Normal_Cloth.png deleted file mode 100644 index fe7df1ea0..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings1_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Leggings1_Normal_Stripe.png deleted file mode 100644 index 0d758c803..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings1_Small_Cloth.png b/Assets/Female3DCG/ClothLower/Leggings1_Small_Cloth.png deleted file mode 100644 index 4e4ae88c1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings1_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Leggings1_Small_Stripe.png deleted file mode 100644 index 9776ef2e8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings1_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/Leggings1_XLarge_Cloth.png deleted file mode 100644 index fb9de1fcd..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings1_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Leggings1_XLarge_Stripe.png deleted file mode 100644 index cfc360b84..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings2_Large_Cloth.png b/Assets/Female3DCG/ClothLower/Leggings2_Large_Cloth.png deleted file mode 100644 index 50cae3e47..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings2_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings2_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Leggings2_Large_Stripe.png deleted file mode 100644 index 8fefb6376..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings2_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings2_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/Leggings2_Normal_Cloth.png deleted file mode 100644 index c4b470b4e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings2_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings2_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Leggings2_Normal_Stripe.png deleted file mode 100644 index d0aaba70c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings2_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings2_Small_Cloth.png b/Assets/Female3DCG/ClothLower/Leggings2_Small_Cloth.png deleted file mode 100644 index 8a17c3532..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings2_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings2_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Leggings2_Small_Stripe.png deleted file mode 100644 index ba8fa88f7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings2_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings2_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/Leggings2_XLarge_Cloth.png deleted file mode 100644 index 102960d82..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings2_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Leggings2_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Leggings2_XLarge_Stripe.png deleted file mode 100644 index 32aa4e792..000000000 Binary files a/Assets/Female3DCG/ClothLower/Leggings2_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Large_Frill.png b/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Large_Frill.png deleted file mode 100644 index ce38336b0..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Large_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Large_Skirt.png b/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Large_Skirt.png deleted file mode 100644 index 959bd9c91..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Large_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Normal_Frill.png b/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Normal_Frill.png deleted file mode 100644 index b93bcee40..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Normal_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Normal_Skirt.png b/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Normal_Skirt.png deleted file mode 100644 index 34381ac36..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Normal_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Small_Frill.png b/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Small_Frill.png deleted file mode 100644 index 20f04a240..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Small_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Small_Skirt.png b/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Small_Skirt.png deleted file mode 100644 index 786d6c02a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_Small_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_XLarge_Frill.png b/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_XLarge_Frill.png deleted file mode 100644 index 36dca9497..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_XLarge_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_XLarge_Skirt.png b/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_XLarge_Skirt.png deleted file mode 100644 index 6ad386aa8..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/BondageSkirt_XLarge_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_Large.png deleted file mode 100644 index a28c802b6..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_Normal.png deleted file mode 100644 index b2246a8f5..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_Small.png deleted file mode 100644 index 3ad397a9c..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_XLarge.png deleted file mode 100644 index a61fd4fa8..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ChineseSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_Large.png deleted file mode 100644 index 3ffc5ea00..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_Normal.png deleted file mode 100644 index 1d5244384..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_Small.png deleted file mode 100644 index 17349fb6a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_XLarge.png deleted file mode 100644 index 61fee83b0..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ClothSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_Large.png deleted file mode 100644 index 30d4795ac..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_Normal.png deleted file mode 100644 index 85b10678f..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_Small.png deleted file mode 100644 index cbf91e585..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_XLarge.png deleted file mode 100644 index eb7c7553a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Gown2Skirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Buttons.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Buttons.png deleted file mode 100644 index 5a998c3d2..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Fabric.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Fabric.png deleted file mode 100644 index e7a51176a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Panty.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Panty.png deleted file mode 100644 index 58126c025..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_PantyLine.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_PantyLine.png deleted file mode 100644 index e68cb2bc1..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Veil.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Veil.png deleted file mode 100644 index a32d8eb79..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Large_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Buttons.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Buttons.png deleted file mode 100644 index adfbeeed7..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Fabric.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Fabric.png deleted file mode 100644 index 67c06b4fd..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Panty.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Panty.png deleted file mode 100644 index d58ada496..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_PantyLine.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_PantyLine.png deleted file mode 100644 index 4d323630f..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Veil.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Veil.png deleted file mode 100644 index 1fb63fc54..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Normal_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Buttons.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Buttons.png deleted file mode 100644 index 1e687dadf..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Fabric.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Fabric.png deleted file mode 100644 index fc1d0c65c..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Panty.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Panty.png deleted file mode 100644 index 36edef9e9..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_PantyLine.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_PantyLine.png deleted file mode 100644 index 9bcf6e2c1..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Veil.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Veil.png deleted file mode 100644 index 2bb7a910f..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_Small_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Buttons.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Buttons.png deleted file mode 100644 index 2447ed5d7..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Fabric.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Fabric.png deleted file mode 100644 index 3547ab0f8..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Panty.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Panty.png deleted file mode 100644 index e30c411ee..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_PantyLine.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_PantyLine.png deleted file mode 100644 index eb181d22f..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Veil.png b/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Veil.png deleted file mode 100644 index be815ee5c..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/HaremPants2_XLarge_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_Large.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_Normal.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_Small.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_XLarge.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/JeanSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_Large.png deleted file mode 100644 index d63f424bf..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_Normal.png deleted file mode 100644 index cdc6559e0..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_Small.png deleted file mode 100644 index d7acf4e4c..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_XLarge.png deleted file mode 100644 index 0c249b707..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_Large.png deleted file mode 100644 index 9976e61fb..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_Normal.png deleted file mode 100644 index 7b5801990..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_Small.png deleted file mode 100644 index 2def6b9a7..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_XLarge.png deleted file mode 100644 index 2e53ae7d3..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Jeans2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_Large.png deleted file mode 100644 index 6a28c9db2..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_Normal.png deleted file mode 100644 index 56da377de..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_Small.png deleted file mode 100644 index 029479744..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_XLarge.png deleted file mode 100644 index 0c827e90a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/JeansShorts_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_Large.png deleted file mode 100644 index 35ffc9aa8..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_Normal.png deleted file mode 100644 index 4239dcdfe..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_Small.png deleted file mode 100644 index fa3761620..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_XLarge.png deleted file mode 100644 index d692cdf16..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexPants1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_Large.png deleted file mode 100644 index 32afffb03..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_Normal.png deleted file mode 100644 index 8b7d8e158..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_Small.png deleted file mode 100644 index 90adfdf18..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_XLarge.png deleted file mode 100644 index 782392f1a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_Large.png deleted file mode 100644 index 6203e47c2..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_Normal.png deleted file mode 100644 index e01244e14..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_Small.png deleted file mode 100644 index 8f65a51a9..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_XLarge.png deleted file mode 100644 index 8950afbad..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/LatexSkirt2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Large_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Large_Cloth.png deleted file mode 100644 index e07e2d7e2..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Large_Stripe.png deleted file mode 100644 index 2887121dc..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Normal_Cloth.png deleted file mode 100644 index 4e0384bb7..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Normal_Stripe.png deleted file mode 100644 index 2e17183fa..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Small_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Small_Cloth.png deleted file mode 100644 index b55252f85..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Small_Stripe.png deleted file mode 100644 index 2bfc15709..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_XLarge_Cloth.png deleted file mode 100644 index 93ac75ef6..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_XLarge_Stripe.png deleted file mode 100644 index 008ac588b..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Large_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Large_Cloth.png deleted file mode 100644 index 867a8df56..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Large_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Large_Stripe.png deleted file mode 100644 index 128a3066a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Normal_Cloth.png deleted file mode 100644 index 047e8e12b..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Normal_Stripe.png deleted file mode 100644 index a987c94e1..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Small_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Small_Cloth.png deleted file mode 100644 index ba782ebe6..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Small_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Small_Stripe.png deleted file mode 100644 index ffa7b93e4..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_XLarge_Cloth.png deleted file mode 100644 index 951d4b5f8..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_XLarge_Stripe.png deleted file mode 100644 index 46baa9367..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Leggings2_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_Large.png deleted file mode 100644 index 1fa823ef9..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_Normal.png deleted file mode 100644 index 617c3a2e7..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_Small.png deleted file mode 100644 index 25a49c9e5..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_XLarge.png deleted file mode 100644 index 8dfbb6fd6..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/MistressBottom_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Large_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Large_Cloth.png deleted file mode 100644 index 7f0722d67..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Large_Stripe.png deleted file mode 100644 index 3f43834f2..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Normal_Cloth.png deleted file mode 100644 index 22eed343d..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Normal_Stripe.png deleted file mode 100644 index 782cba6ac..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Small_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Small_Cloth.png deleted file mode 100644 index 45eb1dd53..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Small_Stripe.png deleted file mode 100644 index 6b2ff16a3..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_XLarge_Cloth.png deleted file mode 100644 index dd6dcf713..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_XLarge_Stripe.png deleted file mode 100644 index c531b7ee2..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Pajama1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_Large.png deleted file mode 100644 index 97dae0820..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_Normal.png deleted file mode 100644 index 4021de8a6..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_Small.png deleted file mode 100644 index 15969107a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_XLarge.png deleted file mode 100644 index 4a798ed8a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PencilSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Large_Dress.png b/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Large_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Large_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Large_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Normal_Dress.png b/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Normal_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Normal_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Small_Dress.png b/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Small_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Small_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Small_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_XLarge_Dress.png b/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_XLarge_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_XLarge_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/PleatedSkirt_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_Large.png deleted file mode 100644 index 4024eb9ad..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_Normal.png deleted file mode 100644 index e00ab53a7..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_Small.png deleted file mode 100644 index c81e8598f..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_XLarge.png deleted file mode 100644 index 90e4635e8..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPencilSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_Large.png deleted file mode 100644 index dd3ae5ee7..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_Normal.png deleted file mode 100644 index ee4c8b752..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_Small.png deleted file mode 100644 index 7f4621a43..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_XLarge.png deleted file mode 100644 index b1ad6dfcd..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/ShortPlaidSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_Large.png deleted file mode 100644 index 55f221cf2..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_Normal.png deleted file mode 100644 index 73eef408c..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_Small.png deleted file mode 100644 index 3282d6a1e..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_XLarge.png deleted file mode 100644 index 8e6a4ec5e..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Shorts1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_Large.png deleted file mode 100644 index e3eb662cc..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_Normal.png deleted file mode 100644 index 846a1a30a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_Small.png deleted file mode 100644 index c9482420b..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_XLarge.png deleted file mode 100644 index cdba7a331..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Large_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Large_Color.png deleted file mode 100644 index 18897e30d..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Large_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Large_Stripe.png deleted file mode 100644 index 956272d96..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Normal_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Normal_Color.png deleted file mode 100644 index 2a322a017..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Normal_Stripe.png deleted file mode 100644 index 481040d85..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Small_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Small_Color.png deleted file mode 100644 index ba81397de..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Small_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Small_Stripe.png deleted file mode 100644 index a4202be28..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_XLarge_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_XLarge_Color.png deleted file mode 100644 index d5a4eb5d1..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_XLarge_Stripe.png deleted file mode 100644 index ab936b515..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt2_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Large_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Large_Color.png deleted file mode 100644 index 0f0ab4db9..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Large_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Large_Stripe.png deleted file mode 100644 index c6b8c3d85..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Normal_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Normal_Color.png deleted file mode 100644 index aea06b64e..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Normal_Stripe.png deleted file mode 100644 index 9d9e9d831..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Small_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Small_Color.png deleted file mode 100644 index dfe5b1a40..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Small_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Small_Stripe.png deleted file mode 100644 index 6026acc85..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_XLarge_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_XLarge_Color.png deleted file mode 100644 index 5670a95a5..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_XLarge_Stripe.png deleted file mode 100644 index d3691c46b..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Skirt3_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Large_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Large_Color.png deleted file mode 100644 index 50b76a102..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Large_Stripe.png deleted file mode 100644 index 18af2a97d..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Normal_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Normal_Color.png deleted file mode 100644 index 42ba1b4d5..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Normal_Stripe.png deleted file mode 100644 index 0396b423a..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Small_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Small_Color.png deleted file mode 100644 index b0ede802c..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Small_Stripe.png deleted file mode 100644 index 2b65871ee..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_XLarge_Color.png b/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_XLarge_Color.png deleted file mode 100644 index e205b5642..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_XLarge_Stripe.png deleted file mode 100644 index 8996a3333..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/TennisSkirt1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_Large.png deleted file mode 100644 index 42249a0cf..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_Normal.png deleted file mode 100644 index c37f48f59..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_Small.png deleted file mode 100644 index 6337b22b5..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_XLarge.png deleted file mode 100644 index 307c40111..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_Large.png deleted file mode 100644 index fb3123229..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_Normal.png deleted file mode 100644 index 84e7dae00..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_Small.png deleted file mode 100644 index 01021712e..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_XLarge.png deleted file mode 100644 index 6cc27d2e3..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_Large.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_Large.png deleted file mode 100644 index 805ae37ac..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_Normal.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_Normal.png deleted file mode 100644 index bbd8be846..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_Small.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_Small.png deleted file mode 100644 index 98d8add1b..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_XLarge.png b/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_XLarge.png deleted file mode 100644 index a3d113fb8..000000000 Binary files a/Assets/Female3DCG/ClothLower/LegsClosed/Waspie3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LongSkirt1_Back.png b/Assets/Female3DCG/ClothLower/LongSkirt1_Back.png deleted file mode 100644 index 2de92637d..000000000 Binary files a/Assets/Female3DCG/ClothLower/LongSkirt1_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/LongSkirt1_Front.png b/Assets/Female3DCG/ClothLower/LongSkirt1_Front.png deleted file mode 100644 index 8552c8004..000000000 Binary files a/Assets/Female3DCG/ClothLower/LongSkirt1_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/MageSkirt_Skirt.pdn b/Assets/Female3DCG/ClothLower/MageSkirt_Skirt.pdn deleted file mode 100644 index 3c2f43874..000000000 Binary files a/Assets/Female3DCG/ClothLower/MageSkirt_Skirt.pdn and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/MageSkirt_Skirt.png b/Assets/Female3DCG/ClothLower/MageSkirt_Skirt.png deleted file mode 100644 index 54785d991..000000000 Binary files a/Assets/Female3DCG/ClothLower/MageSkirt_Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/MageSkirt_Waist.png b/Assets/Female3DCG/ClothLower/MageSkirt_Waist.png deleted file mode 100644 index 51bface83..000000000 Binary files a/Assets/Female3DCG/ClothLower/MageSkirt_Waist.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/MistressBottom_Large.png b/Assets/Female3DCG/ClothLower/MistressBottom_Large.png deleted file mode 100644 index f9ef9fa39..000000000 Binary files a/Assets/Female3DCG/ClothLower/MistressBottom_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/MistressBottom_Normal.png b/Assets/Female3DCG/ClothLower/MistressBottom_Normal.png deleted file mode 100644 index 77a9a74d5..000000000 Binary files a/Assets/Female3DCG/ClothLower/MistressBottom_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/MistressBottom_Small.png b/Assets/Female3DCG/ClothLower/MistressBottom_Small.png deleted file mode 100644 index 04a5d4071..000000000 Binary files a/Assets/Female3DCG/ClothLower/MistressBottom_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/MistressBottom_XLarge.png b/Assets/Female3DCG/ClothLower/MistressBottom_XLarge.png deleted file mode 100644 index fd706d02b..000000000 Binary files a/Assets/Female3DCG/ClothLower/MistressBottom_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Orig/MistressBottom_Large.png b/Assets/Female3DCG/ClothLower/Orig/MistressBottom_Large.png deleted file mode 100644 index 942d16728..000000000 Binary files a/Assets/Female3DCG/ClothLower/Orig/MistressBottom_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Orig/MistressBottom_Normal.png b/Assets/Female3DCG/ClothLower/Orig/MistressBottom_Normal.png deleted file mode 100644 index 60678c430..000000000 Binary files a/Assets/Female3DCG/ClothLower/Orig/MistressBottom_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Orig/MistressBottom_Small.png b/Assets/Female3DCG/ClothLower/Orig/MistressBottom_Small.png deleted file mode 100644 index 60678c430..000000000 Binary files a/Assets/Female3DCG/ClothLower/Orig/MistressBottom_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Orig/MistressBottom_XLarge.png b/Assets/Female3DCG/ClothLower/Orig/MistressBottom_XLarge.png deleted file mode 100644 index 942d16728..000000000 Binary files a/Assets/Female3DCG/ClothLower/Orig/MistressBottom_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer1.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer1.png deleted file mode 100644 index b74cc1431..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer2.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer2.png deleted file mode 100644 index 3a7289163..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer3.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer3.png deleted file mode 100644 index 465f60ae4..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer4.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer4.png deleted file mode 100644 index df3d82a45..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer1.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer1.png deleted file mode 100644 index cdbce7612..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer2.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer2.png deleted file mode 100644 index e10f2b0d5..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer3.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer3.png deleted file mode 100644 index 3999b93c2..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer4.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer4.png deleted file mode 100644 index bcfa9739e..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer1.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer1.png deleted file mode 100644 index 144055e71..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer2.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer2.png deleted file mode 100644 index 914fa5c37..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer3.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer3.png deleted file mode 100644 index e0bc1ea3e..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer4.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer4.png deleted file mode 100644 index 5a04b638d..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer1.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer1.png deleted file mode 100644 index 56ea82a9f..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer2.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer2.png deleted file mode 100644 index b990b5bcc..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer3.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer3.png deleted file mode 100644 index 35b129d00..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer4.png b/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer4.png deleted file mode 100644 index 36e9b1551..000000000 Binary files a/Assets/Female3DCG/ClothLower/OverTheHead/Tutu_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Pajama1_Large_Cloth.png b/Assets/Female3DCG/ClothLower/Pajama1_Large_Cloth.png deleted file mode 100644 index fed062275..000000000 Binary files a/Assets/Female3DCG/ClothLower/Pajama1_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Pajama1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Pajama1_Large_Stripe.png deleted file mode 100644 index 6ca37d008..000000000 Binary files a/Assets/Female3DCG/ClothLower/Pajama1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Pajama1_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/Pajama1_Normal_Cloth.png deleted file mode 100644 index 89ea680f7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Pajama1_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Pajama1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Pajama1_Normal_Stripe.png deleted file mode 100644 index a6906560b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Pajama1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Pajama1_Small_Cloth.png b/Assets/Female3DCG/ClothLower/Pajama1_Small_Cloth.png deleted file mode 100644 index 52f34d3f8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Pajama1_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Pajama1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Pajama1_Small_Stripe.png deleted file mode 100644 index 6eb4f19a8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Pajama1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Pajama1_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/Pajama1_XLarge_Cloth.png deleted file mode 100644 index 522ff76e8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Pajama1_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Pajama1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Pajama1_XLarge_Stripe.png deleted file mode 100644 index 06d7ba287..000000000 Binary files a/Assets/Female3DCG/ClothLower/Pajama1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PencilSkirt_Large.png b/Assets/Female3DCG/ClothLower/PencilSkirt_Large.png deleted file mode 100644 index 97dae0820..000000000 Binary files a/Assets/Female3DCG/ClothLower/PencilSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PencilSkirt_Normal.png b/Assets/Female3DCG/ClothLower/PencilSkirt_Normal.png deleted file mode 100644 index 4021de8a6..000000000 Binary files a/Assets/Female3DCG/ClothLower/PencilSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PencilSkirt_Small.png b/Assets/Female3DCG/ClothLower/PencilSkirt_Small.png deleted file mode 100644 index 15969107a..000000000 Binary files a/Assets/Female3DCG/ClothLower/PencilSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PencilSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/PencilSkirt_XLarge.png deleted file mode 100644 index 4a798ed8a..000000000 Binary files a/Assets/Female3DCG/ClothLower/PencilSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PleatedSkirt_Large_Dress.png b/Assets/Female3DCG/ClothLower/PleatedSkirt_Large_Dress.png deleted file mode 100644 index 45700c364..000000000 Binary files a/Assets/Female3DCG/ClothLower/PleatedSkirt_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PleatedSkirt_Large_Stripe.png b/Assets/Female3DCG/ClothLower/PleatedSkirt_Large_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/PleatedSkirt_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PleatedSkirt_Normal_Dress.png b/Assets/Female3DCG/ClothLower/PleatedSkirt_Normal_Dress.png deleted file mode 100644 index 45700c364..000000000 Binary files a/Assets/Female3DCG/ClothLower/PleatedSkirt_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PleatedSkirt_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/PleatedSkirt_Normal_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/PleatedSkirt_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PleatedSkirt_Small_Dress.png b/Assets/Female3DCG/ClothLower/PleatedSkirt_Small_Dress.png deleted file mode 100644 index 45700c364..000000000 Binary files a/Assets/Female3DCG/ClothLower/PleatedSkirt_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PleatedSkirt_Small_Stripe.png b/Assets/Female3DCG/ClothLower/PleatedSkirt_Small_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/PleatedSkirt_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PleatedSkirt_XLarge_Dress.png b/Assets/Female3DCG/ClothLower/PleatedSkirt_XLarge_Dress.png deleted file mode 100644 index 45700c364..000000000 Binary files a/Assets/Female3DCG/ClothLower/PleatedSkirt_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/PleatedSkirt_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/PleatedSkirt_XLarge_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/PleatedSkirt_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/AdmiralSkirt.png b/Assets/Female3DCG/ClothLower/Preview/AdmiralSkirt.png deleted file mode 100644 index 3d48d7233..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/AdmiralSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/AsymmetricSkirt.png b/Assets/Female3DCG/ClothLower/Preview/AsymmetricSkirt.png deleted file mode 100644 index 3a7928177..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/AsymmetricSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/BondageSkirt.png b/Assets/Female3DCG/ClothLower/Preview/BondageSkirt.png deleted file mode 100644 index 75cb0fd65..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/BondageSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/ChineseSkirt1.png b/Assets/Female3DCG/ClothLower/Preview/ChineseSkirt1.png deleted file mode 100644 index 3602c0cd8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/ChineseSkirt1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/ClothSkirt1.png b/Assets/Female3DCG/ClothLower/Preview/ClothSkirt1.png deleted file mode 100644 index 87a11e3d8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/ClothSkirt1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/CollegeSkirt.png b/Assets/Female3DCG/ClothLower/Preview/CollegeSkirt.png deleted file mode 100644 index 589f65daf..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/CollegeSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/ElegantSkirt.png b/Assets/Female3DCG/ClothLower/Preview/ElegantSkirt.png deleted file mode 100644 index 44480f8b1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/ElegantSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Gown2Skirt.png b/Assets/Female3DCG/ClothLower/Preview/Gown2Skirt.png deleted file mode 100644 index 30d4795ac..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Gown2Skirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/HaremPants.png b/Assets/Female3DCG/ClothLower/Preview/HaremPants.png deleted file mode 100644 index 35fdf718c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/HaremPants.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/HaremPants2.png b/Assets/Female3DCG/ClothLower/Preview/HaremPants2.png deleted file mode 100644 index d7c075163..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/HaremPants2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/HulaSkirt.png b/Assets/Female3DCG/ClothLower/Preview/HulaSkirt.png deleted file mode 100644 index 1e4b76238..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/HulaSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/JeanSkirt.png b/Assets/Female3DCG/ClothLower/Preview/JeanSkirt.png deleted file mode 100644 index f94e01041..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/JeanSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Jeans1.png b/Assets/Female3DCG/ClothLower/Preview/Jeans1.png deleted file mode 100644 index a7bf7d5ef..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Jeans1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Jeans2.png b/Assets/Female3DCG/ClothLower/Preview/Jeans2.png deleted file mode 100644 index 3a7669837..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Jeans2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/JeansShorts.png b/Assets/Female3DCG/ClothLower/Preview/JeansShorts.png deleted file mode 100644 index 8f4eae86c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/JeansShorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/LatexPants1.png b/Assets/Female3DCG/ClothLower/Preview/LatexPants1.png deleted file mode 100644 index 6552ccddb..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/LatexPants1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/LatexSkirt1.png b/Assets/Female3DCG/ClothLower/Preview/LatexSkirt1.png deleted file mode 100644 index 8ec2aa759..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/LatexSkirt1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/LatexSkirt2.png b/Assets/Female3DCG/ClothLower/Preview/LatexSkirt2.png deleted file mode 100644 index d649ee100..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/LatexSkirt2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Leggings1.png b/Assets/Female3DCG/ClothLower/Preview/Leggings1.png deleted file mode 100644 index 730440777..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Leggings1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Leggings2.png b/Assets/Female3DCG/ClothLower/Preview/Leggings2.png deleted file mode 100644 index c8531d3ea..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Leggings2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/LongSkirt1.png b/Assets/Female3DCG/ClothLower/Preview/LongSkirt1.png deleted file mode 100644 index a95cb0303..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/LongSkirt1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/MageSkirt.png b/Assets/Female3DCG/ClothLower/Preview/MageSkirt.png deleted file mode 100644 index a578e1091..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/MageSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/MistressBottom.png b/Assets/Female3DCG/ClothLower/Preview/MistressBottom.png deleted file mode 100644 index 583db42bb..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/MistressBottom.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Pajama1.png b/Assets/Female3DCG/ClothLower/Preview/Pajama1.png deleted file mode 100644 index e8873c6f9..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Pajama1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/PencilSkirt.png b/Assets/Female3DCG/ClothLower/Preview/PencilSkirt.png deleted file mode 100644 index 4021de8a6..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/PencilSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/PleatedSkirt.png b/Assets/Female3DCG/ClothLower/Preview/PleatedSkirt.png deleted file mode 100644 index 1bae7e33f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/PleatedSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/RuffledSkirt.png b/Assets/Female3DCG/ClothLower/Preview/RuffledSkirt.png deleted file mode 100644 index b3cbefcb0..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/RuffledSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/ShortPencilSkirt.png b/Assets/Female3DCG/ClothLower/Preview/ShortPencilSkirt.png deleted file mode 100644 index 712e49c4f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/ShortPencilSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/ShortPlaidSkirt.png b/Assets/Female3DCG/ClothLower/Preview/ShortPlaidSkirt.png deleted file mode 100644 index 27d2bd01e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/ShortPlaidSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Shorts1.png b/Assets/Female3DCG/ClothLower/Preview/Shorts1.png deleted file mode 100644 index 80e9d3f24..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Shorts1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Skirt1.png b/Assets/Female3DCG/ClothLower/Preview/Skirt1.png deleted file mode 100644 index daec24053..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Skirt1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Skirt2.png b/Assets/Female3DCG/ClothLower/Preview/Skirt2.png deleted file mode 100644 index 6e7e04ad1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Skirt2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Skirt3.png b/Assets/Female3DCG/ClothLower/Preview/Skirt3.png deleted file mode 100644 index 76226367f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Skirt3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/TennisSkirt1.png b/Assets/Female3DCG/ClothLower/Preview/TennisSkirt1.png deleted file mode 100644 index 0fcb5d222..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/TennisSkirt1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Tutu.png b/Assets/Female3DCG/ClothLower/Preview/Tutu.png deleted file mode 100644 index 0d7768c35..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Tutu.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Waspie1.png b/Assets/Female3DCG/ClothLower/Preview/Waspie1.png deleted file mode 100644 index bd3e87d95..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Waspie1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Waspie2.png b/Assets/Female3DCG/ClothLower/Preview/Waspie2.png deleted file mode 100644 index 9f8bbe9a7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Waspie2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Preview/Waspie3.png b/Assets/Female3DCG/ClothLower/Preview/Waspie3.png deleted file mode 100644 index 7b85a61e3..000000000 Binary files a/Assets/Female3DCG/ClothLower/Preview/Waspie3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/RuffledSkirt_Large.png b/Assets/Female3DCG/ClothLower/RuffledSkirt_Large.png deleted file mode 100644 index 1b20f1456..000000000 Binary files a/Assets/Female3DCG/ClothLower/RuffledSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/RuffledSkirt_Normal.png b/Assets/Female3DCG/ClothLower/RuffledSkirt_Normal.png deleted file mode 100644 index 58626e9c0..000000000 Binary files a/Assets/Female3DCG/ClothLower/RuffledSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/RuffledSkirt_Small.png b/Assets/Female3DCG/ClothLower/RuffledSkirt_Small.png deleted file mode 100644 index e5229d1d2..000000000 Binary files a/Assets/Female3DCG/ClothLower/RuffledSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/RuffledSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/RuffledSkirt_XLarge.png deleted file mode 100644 index 5e3a95a62..000000000 Binary files a/Assets/Female3DCG/ClothLower/RuffledSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ShortPencilSkirt_Large.png b/Assets/Female3DCG/ClothLower/ShortPencilSkirt_Large.png deleted file mode 100644 index 4024eb9ad..000000000 Binary files a/Assets/Female3DCG/ClothLower/ShortPencilSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ShortPencilSkirt_Normal.png b/Assets/Female3DCG/ClothLower/ShortPencilSkirt_Normal.png deleted file mode 100644 index e00ab53a7..000000000 Binary files a/Assets/Female3DCG/ClothLower/ShortPencilSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ShortPencilSkirt_Small.png b/Assets/Female3DCG/ClothLower/ShortPencilSkirt_Small.png deleted file mode 100644 index c81e8598f..000000000 Binary files a/Assets/Female3DCG/ClothLower/ShortPencilSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ShortPencilSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/ShortPencilSkirt_XLarge.png deleted file mode 100644 index 90e4635e8..000000000 Binary files a/Assets/Female3DCG/ClothLower/ShortPencilSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_Large.png b/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_Large.png deleted file mode 100644 index dd3ae5ee7..000000000 Binary files a/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_Normal.png b/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_Normal.png deleted file mode 100644 index ee4c8b752..000000000 Binary files a/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_Small.png b/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_Small.png deleted file mode 100644 index 7f4621a43..000000000 Binary files a/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_XLarge.png deleted file mode 100644 index b1ad6dfcd..000000000 Binary files a/Assets/Female3DCG/ClothLower/ShortPlaidSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Shorts1_Large.png b/Assets/Female3DCG/ClothLower/Shorts1_Large.png deleted file mode 100644 index 93149d50f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Shorts1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Shorts1_Normal.png b/Assets/Female3DCG/ClothLower/Shorts1_Normal.png deleted file mode 100644 index 11d12e4ac..000000000 Binary files a/Assets/Female3DCG/ClothLower/Shorts1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Shorts1_Small.png b/Assets/Female3DCG/ClothLower/Shorts1_Small.png deleted file mode 100644 index effc0b861..000000000 Binary files a/Assets/Female3DCG/ClothLower/Shorts1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Shorts1_XLarge.png b/Assets/Female3DCG/ClothLower/Shorts1_XLarge.png deleted file mode 100644 index 43240b9a7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Shorts1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt1_Large.png b/Assets/Female3DCG/ClothLower/Skirt1_Large.png deleted file mode 100644 index ba82ea3c5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt1_Normal.png b/Assets/Female3DCG/ClothLower/Skirt1_Normal.png deleted file mode 100644 index d5a1342d5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt1_Small.png b/Assets/Female3DCG/ClothLower/Skirt1_Small.png deleted file mode 100644 index b4f02ea9e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt1_XLarge.png b/Assets/Female3DCG/ClothLower/Skirt1_XLarge.png deleted file mode 100644 index 7bc37cd5c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt2_Large_Color.png b/Assets/Female3DCG/ClothLower/Skirt2_Large_Color.png deleted file mode 100644 index 6e7e04ad1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt2_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt2_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Skirt2_Large_Stripe.png deleted file mode 100644 index 956272d96..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt2_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt2_Normal_Color.png b/Assets/Female3DCG/ClothLower/Skirt2_Normal_Color.png deleted file mode 100644 index 84c4d1a4a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt2_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt2_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Skirt2_Normal_Stripe.png deleted file mode 100644 index 481040d85..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt2_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt2_Small_Color.png b/Assets/Female3DCG/ClothLower/Skirt2_Small_Color.png deleted file mode 100644 index 7ced18b6b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt2_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt2_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Skirt2_Small_Stripe.png deleted file mode 100644 index a4202be28..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt2_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt2_XLarge_Color.png b/Assets/Female3DCG/ClothLower/Skirt2_XLarge_Color.png deleted file mode 100644 index 6d1be9df3..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt2_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt2_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Skirt2_XLarge_Stripe.png deleted file mode 100644 index ab936b515..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt2_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt3_Large_Color.png b/Assets/Female3DCG/ClothLower/Skirt3_Large_Color.png deleted file mode 100644 index 76226367f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt3_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Skirt3_Large_Stripe.png deleted file mode 100644 index c6b8c3d85..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt3_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt3_Normal_Color.png b/Assets/Female3DCG/ClothLower/Skirt3_Normal_Color.png deleted file mode 100644 index 8e6a047b1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt3_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Skirt3_Normal_Stripe.png deleted file mode 100644 index 9d9e9d831..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt3_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt3_Small_Color.png b/Assets/Female3DCG/ClothLower/Skirt3_Small_Color.png deleted file mode 100644 index e090f45ca..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt3_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Skirt3_Small_Stripe.png deleted file mode 100644 index 6026acc85..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt3_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt3_XLarge_Color.png b/Assets/Female3DCG/ClothLower/Skirt3_XLarge_Color.png deleted file mode 100644 index 46d663878..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Skirt3_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Skirt3_XLarge_Stripe.png deleted file mode 100644 index d3691c46b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Skirt3_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ChineseSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/Spread/ChineseSkirt1_Normal.png deleted file mode 100644 index b2246a8f5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ChineseSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ChineseSkirt1_Small.png b/Assets/Female3DCG/ClothLower/Spread/ChineseSkirt1_Small.png deleted file mode 100644 index 3ad397a9c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ChineseSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ChineseSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/ChineseSkirt1_XLarge.png deleted file mode 100644 index a61fd4fa8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ChineseSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_Large.png b/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_Large.png deleted file mode 100644 index 3ffc5ea00..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_Normal.png deleted file mode 100644 index 1d5244384..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_Small.png b/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_Small.png deleted file mode 100644 index 17349fb6a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_XLarge.png deleted file mode 100644 index 61fee83b0..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ClothSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_Large.png b/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_Large.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_Normal.png b/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_Normal.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_Small.png b/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_Small.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_XLarge.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Gown2Skirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Buttons.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Buttons.png deleted file mode 100644 index 5a998c3d2..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Fabric.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Fabric.png deleted file mode 100644 index e7a51176a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Panty.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Panty.png deleted file mode 100644 index 58126c025..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_PantyLine.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_PantyLine.png deleted file mode 100644 index e68cb2bc1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Veil.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Veil.png deleted file mode 100644 index a32d8eb79..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Large_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Buttons.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Buttons.png deleted file mode 100644 index adfbeeed7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Fabric.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Fabric.png deleted file mode 100644 index 67c06b4fd..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Panty.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Panty.png deleted file mode 100644 index d58ada496..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_PantyLine.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_PantyLine.png deleted file mode 100644 index 4d323630f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Veil.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Veil.png deleted file mode 100644 index 1fb63fc54..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Normal_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Buttons.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Buttons.png deleted file mode 100644 index 1e687dadf..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Fabric.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Fabric.png deleted file mode 100644 index fc1d0c65c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Panty.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Panty.png deleted file mode 100644 index 36edef9e9..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_PantyLine.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_PantyLine.png deleted file mode 100644 index 9bcf6e2c1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Veil.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Veil.png deleted file mode 100644 index 2bb7a910f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_Small_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Buttons.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Buttons.png deleted file mode 100644 index 2447ed5d7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Fabric.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Fabric.png deleted file mode 100644 index 3547ab0f8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Panty.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Panty.png deleted file mode 100644 index e30c411ee..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Panty.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_PantyLine.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_PantyLine.png deleted file mode 100644 index eb181d22f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_PantyLine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Veil.png b/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Veil.png deleted file mode 100644 index be815ee5c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/HaremPants2_XLarge_Veil.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_Large.png b/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_Large.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_Normal.png b/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_Normal.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_Small.png b/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_Small.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_XLarge.png deleted file mode 100644 index 34a53783c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/JeanSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Jeans1_Large.png b/Assets/Female3DCG/ClothLower/Spread/Jeans1_Large.png deleted file mode 100644 index 7ba13f291..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Jeans1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Jeans1_Normal.png b/Assets/Female3DCG/ClothLower/Spread/Jeans1_Normal.png deleted file mode 100644 index daeb7addf..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Jeans1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Jeans1_Small.png b/Assets/Female3DCG/ClothLower/Spread/Jeans1_Small.png deleted file mode 100644 index 7a9beadf1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Jeans1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Jeans1_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/Jeans1_XLarge.png deleted file mode 100644 index 30d88d559..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Jeans1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Jeans2_Large.png b/Assets/Female3DCG/ClothLower/Spread/Jeans2_Large.png deleted file mode 100644 index dec43e055..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Jeans2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Jeans2_Normal.png b/Assets/Female3DCG/ClothLower/Spread/Jeans2_Normal.png deleted file mode 100644 index 1b4118951..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Jeans2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Jeans2_Small.png b/Assets/Female3DCG/ClothLower/Spread/Jeans2_Small.png deleted file mode 100644 index 947fafe79..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Jeans2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Jeans2_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/Jeans2_XLarge.png deleted file mode 100644 index 72e220b81..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Jeans2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/JeansShorts_Large.png b/Assets/Female3DCG/ClothLower/Spread/JeansShorts_Large.png deleted file mode 100644 index f1d2a970d..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/JeansShorts_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/JeansShorts_Normal.png b/Assets/Female3DCG/ClothLower/Spread/JeansShorts_Normal.png deleted file mode 100644 index 6e8d76ec1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/JeansShorts_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/JeansShorts_Small.png b/Assets/Female3DCG/ClothLower/Spread/JeansShorts_Small.png deleted file mode 100644 index f99fecc36..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/JeansShorts_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/JeansShorts_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/JeansShorts_XLarge.png deleted file mode 100644 index 29381abd7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/JeansShorts_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexPants1_Large.png b/Assets/Female3DCG/ClothLower/Spread/LatexPants1_Large.png deleted file mode 100644 index 2c7be1693..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexPants1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexPants1_Normal.png b/Assets/Female3DCG/ClothLower/Spread/LatexPants1_Normal.png deleted file mode 100644 index bb2d49005..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexPants1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexPants1_Small.png b/Assets/Female3DCG/ClothLower/Spread/LatexPants1_Small.png deleted file mode 100644 index 332717490..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexPants1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexPants1_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/LatexPants1_XLarge.png deleted file mode 100644 index bf39bf19b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexPants1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_Large.png b/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_Large.png deleted file mode 100644 index 32afffb03..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_Normal.png b/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_Normal.png deleted file mode 100644 index 874a2eeb0..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_Small.png b/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_Small.png deleted file mode 100644 index 95354df85..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_XLarge.png deleted file mode 100644 index 782392f1a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_Large.png b/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_Large.png deleted file mode 100644 index 6203e47c2..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_Normal.png b/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_Normal.png deleted file mode 100644 index e01244e14..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_Small.png b/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_Small.png deleted file mode 100644 index 8f65a51a9..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_XLarge.png deleted file mode 100644 index 8950afbad..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/LatexSkirt2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Large_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Leggings1_Large_Cloth.png deleted file mode 100644 index 09fd93ed7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Leggings1_Large_Stripe.png deleted file mode 100644 index 3230fde8e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Leggings1_Normal_Cloth.png deleted file mode 100644 index a155c1936..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Leggings1_Normal_Stripe.png deleted file mode 100644 index cddf864b4..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Small_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Leggings1_Small_Cloth.png deleted file mode 100644 index a702c1c71..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Leggings1_Small_Stripe.png deleted file mode 100644 index 4d47887f9..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings1_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Leggings1_XLarge_Cloth.png deleted file mode 100644 index 09cb1fa52..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings1_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Leggings1_XLarge_Stripe.png deleted file mode 100644 index ac9fb4d92..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Large_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Leggings2_Large_Cloth.png deleted file mode 100644 index 407c5cd02..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Leggings2_Large_Stripe.png deleted file mode 100644 index 6a30e2334..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Leggings2_Normal_Cloth.png deleted file mode 100644 index 4a33f16ac..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Leggings2_Normal_Stripe.png deleted file mode 100644 index be0d08ea4..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Small_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Leggings2_Small_Cloth.png deleted file mode 100644 index 9d875ab9a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Leggings2_Small_Stripe.png deleted file mode 100644 index 81f99bc54..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings2_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings2_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Leggings2_XLarge_Cloth.png deleted file mode 100644 index facc63e58..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings2_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Leggings2_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Leggings2_XLarge_Stripe.png deleted file mode 100644 index 46ee6e5d2..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Leggings2_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/MistressBottom_Large.png b/Assets/Female3DCG/ClothLower/Spread/MistressBottom_Large.png deleted file mode 100644 index f9ef9fa39..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/MistressBottom_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/MistressBottom_Normal.png b/Assets/Female3DCG/ClothLower/Spread/MistressBottom_Normal.png deleted file mode 100644 index 77a9a74d5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/MistressBottom_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/MistressBottom_Small.png b/Assets/Female3DCG/ClothLower/Spread/MistressBottom_Small.png deleted file mode 100644 index 04a5d4071..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/MistressBottom_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/MistressBottom_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/MistressBottom_XLarge.png deleted file mode 100644 index fd706d02b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/MistressBottom_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Large_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Pajama1_Large_Cloth.png deleted file mode 100644 index 52ea72112..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Pajama1_Large_Stripe.png deleted file mode 100644 index 0dae8b5d5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Normal_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Pajama1_Normal_Cloth.png deleted file mode 100644 index 750001735..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Pajama1_Normal_Stripe.png deleted file mode 100644 index 6608a05d0..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Small_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Pajama1_Small_Cloth.png deleted file mode 100644 index 0f88a8d39..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Pajama1_Small_Stripe.png deleted file mode 100644 index 36a5cad24..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Pajama1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Pajama1_XLarge_Cloth.png b/Assets/Female3DCG/ClothLower/Spread/Pajama1_XLarge_Cloth.png deleted file mode 100644 index 9e76625a6..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Pajama1_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Pajama1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Pajama1_XLarge_Stripe.png deleted file mode 100644 index 2b4f4a459..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Pajama1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_Large.png b/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_Large.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_Normal.png b/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_Normal.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_Small.png b/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_Small.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_XLarge.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PencilSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Large_Dress.png b/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Large_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Large_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Large_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Normal_Dress.png b/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Normal_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Normal_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Normal_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Small_Dress.png b/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Small_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Small_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Small_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_XLarge_Dress.png b/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_XLarge_Dress.png deleted file mode 100644 index f6251908a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_XLarge_Dress.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_XLarge_Stripe.png deleted file mode 100644 index 04345da60..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/PleatedSkirt_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_Large.png b/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_Large.png deleted file mode 100644 index 4024eb9ad..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_Normal.png b/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_Normal.png deleted file mode 100644 index e00ab53a7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_Small.png b/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_Small.png deleted file mode 100644 index c81e8598f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_XLarge.png deleted file mode 100644 index 90e4635e8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ShortPencilSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_Large.png b/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_Large.png deleted file mode 100644 index dd3ae5ee7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_Normal.png b/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_Normal.png deleted file mode 100644 index ee4c8b752..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_Small.png b/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_Small.png deleted file mode 100644 index 7f4621a43..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_XLarge.png deleted file mode 100644 index b1ad6dfcd..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/ShortPlaidSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Shorts1_Large.png b/Assets/Female3DCG/ClothLower/Spread/Shorts1_Large.png deleted file mode 100644 index 93149d50f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Shorts1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Shorts1_Normal.png b/Assets/Female3DCG/ClothLower/Spread/Shorts1_Normal.png deleted file mode 100644 index 11d12e4ac..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Shorts1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Shorts1_Small.png b/Assets/Female3DCG/ClothLower/Spread/Shorts1_Small.png deleted file mode 100644 index effc0b861..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Shorts1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Shorts1_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/Shorts1_XLarge.png deleted file mode 100644 index 43240b9a7..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Shorts1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt1_Large.png b/Assets/Female3DCG/ClothLower/Spread/Skirt1_Large.png deleted file mode 100644 index ba82ea3c5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt1_Normal.png b/Assets/Female3DCG/ClothLower/Spread/Skirt1_Normal.png deleted file mode 100644 index d5a1342d5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt1_Small.png b/Assets/Female3DCG/ClothLower/Spread/Skirt1_Small.png deleted file mode 100644 index b4f02ea9e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt1_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/Skirt1_XLarge.png deleted file mode 100644 index 7bc37cd5c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Large_Color.png b/Assets/Female3DCG/ClothLower/Spread/Skirt2_Large_Color.png deleted file mode 100644 index 6e7e04ad1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Skirt2_Large_Stripe.png deleted file mode 100644 index 956272d96..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Normal_Color.png b/Assets/Female3DCG/ClothLower/Spread/Skirt2_Normal_Color.png deleted file mode 100644 index 84c4d1a4a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Skirt2_Normal_Stripe.png deleted file mode 100644 index 481040d85..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Small_Color.png b/Assets/Female3DCG/ClothLower/Spread/Skirt2_Small_Color.png deleted file mode 100644 index 7ced18b6b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Skirt2_Small_Stripe.png deleted file mode 100644 index a4202be28..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt2_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt2_XLarge_Color.png b/Assets/Female3DCG/ClothLower/Spread/Skirt2_XLarge_Color.png deleted file mode 100644 index 6d1be9df3..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt2_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt2_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Skirt2_XLarge_Stripe.png deleted file mode 100644 index ab936b515..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt2_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Large_Color.png b/Assets/Female3DCG/ClothLower/Spread/Skirt3_Large_Color.png deleted file mode 100644 index 76226367f..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Skirt3_Large_Stripe.png deleted file mode 100644 index c6b8c3d85..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Normal_Color.png b/Assets/Female3DCG/ClothLower/Spread/Skirt3_Normal_Color.png deleted file mode 100644 index 8e6a047b1..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Skirt3_Normal_Stripe.png deleted file mode 100644 index 9d9e9d831..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Small_Color.png b/Assets/Female3DCG/ClothLower/Spread/Skirt3_Small_Color.png deleted file mode 100644 index e090f45ca..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Skirt3_Small_Stripe.png deleted file mode 100644 index 6026acc85..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt3_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt3_XLarge_Color.png b/Assets/Female3DCG/ClothLower/Spread/Skirt3_XLarge_Color.png deleted file mode 100644 index 46d663878..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt3_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Skirt3_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/Skirt3_XLarge_Stripe.png deleted file mode 100644 index d3691c46b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Skirt3_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Large_Color.png b/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Large_Color.png deleted file mode 100644 index 50b76a102..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Large_Stripe.png deleted file mode 100644 index 18af2a97d..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Normal_Color.png b/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Normal_Color.png deleted file mode 100644 index 42ba1b4d5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Normal_Stripe.png deleted file mode 100644 index 0396b423a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Small_Color.png b/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Small_Color.png deleted file mode 100644 index b0ede802c..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Small_Stripe.png deleted file mode 100644 index 2b65871ee..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_XLarge_Color.png b/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_XLarge_Color.png deleted file mode 100644 index e205b5642..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_XLarge_Stripe.png deleted file mode 100644 index 8996a3333..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/TennisSkirt1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie1_Large.png b/Assets/Female3DCG/ClothLower/Spread/Waspie1_Large.png deleted file mode 100644 index 42249a0cf..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie1_Normal.png b/Assets/Female3DCG/ClothLower/Spread/Waspie1_Normal.png deleted file mode 100644 index c37f48f59..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie1_Small.png b/Assets/Female3DCG/ClothLower/Spread/Waspie1_Small.png deleted file mode 100644 index 6337b22b5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie1_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/Waspie1_XLarge.png deleted file mode 100644 index 307c40111..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie2_Large.png b/Assets/Female3DCG/ClothLower/Spread/Waspie2_Large.png deleted file mode 100644 index fb3123229..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie2_Normal.png b/Assets/Female3DCG/ClothLower/Spread/Waspie2_Normal.png deleted file mode 100644 index 84e7dae00..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie2_Small.png b/Assets/Female3DCG/ClothLower/Spread/Waspie2_Small.png deleted file mode 100644 index 01021712e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie2_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/Waspie2_XLarge.png deleted file mode 100644 index 6cc27d2e3..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie3_Large.png b/Assets/Female3DCG/ClothLower/Spread/Waspie3_Large.png deleted file mode 100644 index 805ae37ac..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie3_Normal.png b/Assets/Female3DCG/ClothLower/Spread/Waspie3_Normal.png deleted file mode 100644 index bbd8be846..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie3_Small.png b/Assets/Female3DCG/ClothLower/Spread/Waspie3_Small.png deleted file mode 100644 index 98d8add1b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Spread/Waspie3_XLarge.png b/Assets/Female3DCG/ClothLower/Spread/Waspie3_XLarge.png deleted file mode 100644 index a3d113fb8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Spread/Waspie3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/TennisSkirt1_Large_Color.png b/Assets/Female3DCG/ClothLower/TennisSkirt1_Large_Color.png deleted file mode 100644 index 50b76a102..000000000 Binary files a/Assets/Female3DCG/ClothLower/TennisSkirt1_Large_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/TennisSkirt1_Large_Stripe.png b/Assets/Female3DCG/ClothLower/TennisSkirt1_Large_Stripe.png deleted file mode 100644 index 18af2a97d..000000000 Binary files a/Assets/Female3DCG/ClothLower/TennisSkirt1_Large_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/TennisSkirt1_Normal_Color.png b/Assets/Female3DCG/ClothLower/TennisSkirt1_Normal_Color.png deleted file mode 100644 index 42ba1b4d5..000000000 Binary files a/Assets/Female3DCG/ClothLower/TennisSkirt1_Normal_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/TennisSkirt1_Normal_Stripe.png b/Assets/Female3DCG/ClothLower/TennisSkirt1_Normal_Stripe.png deleted file mode 100644 index 0396b423a..000000000 Binary files a/Assets/Female3DCG/ClothLower/TennisSkirt1_Normal_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/TennisSkirt1_Small_Color.png b/Assets/Female3DCG/ClothLower/TennisSkirt1_Small_Color.png deleted file mode 100644 index b0ede802c..000000000 Binary files a/Assets/Female3DCG/ClothLower/TennisSkirt1_Small_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/TennisSkirt1_Small_Stripe.png b/Assets/Female3DCG/ClothLower/TennisSkirt1_Small_Stripe.png deleted file mode 100644 index 2b65871ee..000000000 Binary files a/Assets/Female3DCG/ClothLower/TennisSkirt1_Small_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/TennisSkirt1_XLarge_Color.png b/Assets/Female3DCG/ClothLower/TennisSkirt1_XLarge_Color.png deleted file mode 100644 index e205b5642..000000000 Binary files a/Assets/Female3DCG/ClothLower/TennisSkirt1_XLarge_Color.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/TennisSkirt1_XLarge_Stripe.png b/Assets/Female3DCG/ClothLower/TennisSkirt1_XLarge_Stripe.png deleted file mode 100644 index 8996a3333..000000000 Binary files a/Assets/Female3DCG/ClothLower/TennisSkirt1_XLarge_Stripe.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Belt.png b/Assets/Female3DCG/ClothLower/Tutu_Belt.png deleted file mode 100644 index d5cf7730b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Large_Layer1.png b/Assets/Female3DCG/ClothLower/Tutu_Large_Layer1.png deleted file mode 100644 index 539a3d9e8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Large_Layer2.png b/Assets/Female3DCG/ClothLower/Tutu_Large_Layer2.png deleted file mode 100644 index 872f11e53..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Large_Layer3.png b/Assets/Female3DCG/ClothLower/Tutu_Large_Layer3.png deleted file mode 100644 index 276de612a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Large_Layer4.png b/Assets/Female3DCG/ClothLower/Tutu_Large_Layer4.png deleted file mode 100644 index 3ecad11db..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer1.png b/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer1.png deleted file mode 100644 index 539a3d9e8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer2.png b/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer2.png deleted file mode 100644 index 872f11e53..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer3.png b/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer3.png deleted file mode 100644 index 276de612a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer4.png b/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer4.png deleted file mode 100644 index 3ecad11db..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Shine.png b/Assets/Female3DCG/ClothLower/Tutu_Shine.png deleted file mode 100644 index 6e08fa19d..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Small_Layer1.png b/Assets/Female3DCG/ClothLower/Tutu_Small_Layer1.png deleted file mode 100644 index 539a3d9e8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Small_Layer2.png b/Assets/Female3DCG/ClothLower/Tutu_Small_Layer2.png deleted file mode 100644 index 872f11e53..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Small_Layer3.png b/Assets/Female3DCG/ClothLower/Tutu_Small_Layer3.png deleted file mode 100644 index 276de612a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_Small_Layer4.png b/Assets/Female3DCG/ClothLower/Tutu_Small_Layer4.png deleted file mode 100644 index 3ecad11db..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer1.png b/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer1.png deleted file mode 100644 index 539a3d9e8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer2.png b/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer2.png deleted file mode 100644 index 872f11e53..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer3.png b/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer3.png deleted file mode 100644 index 276de612a..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer4.png b/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer4.png deleted file mode 100644 index 3ecad11db..000000000 Binary files a/Assets/Female3DCG/ClothLower/Tutu_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie1_Large.png b/Assets/Female3DCG/ClothLower/Waspie1_Large.png deleted file mode 100644 index 42249a0cf..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie1_Normal.png b/Assets/Female3DCG/ClothLower/Waspie1_Normal.png deleted file mode 100644 index c37f48f59..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie1_Small.png b/Assets/Female3DCG/ClothLower/Waspie1_Small.png deleted file mode 100644 index 6337b22b5..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie1_XLarge.png b/Assets/Female3DCG/ClothLower/Waspie1_XLarge.png deleted file mode 100644 index 307c40111..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie2_Large.png b/Assets/Female3DCG/ClothLower/Waspie2_Large.png deleted file mode 100644 index fb3123229..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie2_Normal.png b/Assets/Female3DCG/ClothLower/Waspie2_Normal.png deleted file mode 100644 index 84e7dae00..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie2_Small.png b/Assets/Female3DCG/ClothLower/Waspie2_Small.png deleted file mode 100644 index 01021712e..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie2_XLarge.png b/Assets/Female3DCG/ClothLower/Waspie2_XLarge.png deleted file mode 100644 index 6cc27d2e3..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie3_Large.png b/Assets/Female3DCG/ClothLower/Waspie3_Large.png deleted file mode 100644 index 805ae37ac..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie3_Normal.png b/Assets/Female3DCG/ClothLower/Waspie3_Normal.png deleted file mode 100644 index bbd8be846..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie3_Small.png b/Assets/Female3DCG/ClothLower/Waspie3_Small.png deleted file mode 100644 index 98d8add1b..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ClothLower/Waspie3_XLarge.png b/Assets/Female3DCG/ClothLower/Waspie3_XLarge.png deleted file mode 100644 index a3d113fb8..000000000 Binary files a/Assets/Female3DCG/ClothLower/Waspie3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ColorGroups.csv b/Assets/Female3DCG/ColorGroups.csv deleted file mode 100644 index 66829f313..000000000 --- a/Assets/Female3DCG/ColorGroups.csv +++ /dev/null @@ -1,35 +0,0 @@ -ItemNeckPostureCollarRings,Rings -ItemArmsHighSecurityStraitJacketCanvas,Canvas -ItemArmsHighSecurityStraitJacketStraps,Straps -ItemArmsTransportJacketCanvas,Canvas -ItemArmsTransportJacketStripes,Stripes -ItemArmsLatexArmbinderBottomStrap,Bottom Strap -ItemArmsLatexArmbinderTopStrap,Top Strap -ItemNipplesTapedVibeEggsEggs,Vibe Eggs -ItemNipplesTapedVibeEggsTape,Tape Strips -ItemDevicesCageCage,Cage -ItemDevicesCoffinMain,Coffin -ItemDevicesCryoCapsuleMain,Capsule -ItemDevicesVacBedDeluxeSheet,Sheet -ItemDevicesVacBedDeluxeBody,Body -ItemDevicesFuckMachineMachine,Machine -ItemDevicesDollBoxBox,Box -ItemDevicesDollBoxText,Label & Text -ItemHoodOldGasMaskAttachments,Attachments -ClothLowerTutuTutu,Tutu -ItemDevicesFuturisticCratePadding,Padding -ItemDevicesFuturisticCrateStructure,Structure -ItemDevicesFuturisticCratePleasure,Pleasure Module -ItemDevicesFuturisticCrateHarness,Harness -ItemMouthPonyGagStraps,Straps -ItemMouth2PonyGagStraps,Straps -ItemMouth3PonyGagStraps,Straps -ItemArmsSturdyLeatherBeltsBelts,Belts -ItemArmsSturdyLeatherBeltsMetal,Metal -ItemLegsSturdyLeatherBeltsBelts,Belts -ItemLegsSturdyLeatherBeltsMetal,Metal -ItemFeetSturdyLeatherBeltsBelts,Belts -ItemFeetSturdyLeatherBeltsMetal,Metal -ItemDevicesWoodenRackWood,Wood -ItemPelvisObedienceBeltMetal,Metal -ItemVulvaPiercingsRoundClitPiercingAddons,Addons diff --git a/Assets/Female3DCG/ColorGroups_CN.txt b/Assets/Female3DCG/ColorGroups_CN.txt deleted file mode 100644 index 9f92e7b71..000000000 --- a/Assets/Female3DCG/ColorGroups_CN.txt +++ /dev/null @@ -1,52 +0,0 @@ -Rings -项圈环 -Canvas -帆布 -Straps -带子 -Stripes -条纹 -Bottom Strap -底部带子 -Top Strap -顶部带子 -Vibe Eggs -跳蛋 -Tape Strips -胶带条纹 -Cage -笼子 -Coffin -棺木 -Capsule -胶囊 -Sheet -床单 -Body -身体 -Machine -机器 -Box -盒子 -Label & Text -标识&文本 -Attachments -附件 -Tutu -芭蕾裙 -Padding -填充 -Structure -结构 -Pleasure Module -刺激模块 -Harness -绳束 -Belts -皮带 -Metal -金属 -Wood -木质 -Addons -配件 diff --git a/Assets/Female3DCG/ColorGroups_FR.txt b/Assets/Female3DCG/ColorGroups_FR.txt deleted file mode 100644 index cda34c9c7..000000000 --- a/Assets/Female3DCG/ColorGroups_FR.txt +++ /dev/null @@ -1,30 +0,0 @@ -Canvas -Canevas -Straps -Sangles -Cage -Cage -Body -Corps -Sheet -Feuille -Machine -Machine -Attachments -Accessoires -Capsule -Capsule -Coffin -Cercueil -Tape Strips -Bandes de ruban -Vibe Eggs -Oeuf vibrant -Top Strap -Sangle du haut -Bottom Strap -Sangle du bas -Stripes -Bandes -Rings -Anneaux \ No newline at end of file diff --git a/Assets/Female3DCG/ColorGroups_RU.txt b/Assets/Female3DCG/ColorGroups_RU.txt deleted file mode 100644 index 9e9969d5c..000000000 --- a/Assets/Female3DCG/ColorGroups_RU.txt +++ /dev/null @@ -1,44 +0,0 @@ -Rings -Кольца -Canvas -Холст -Straps -Ремни -Stripes -Полоски -Bottom Strap -Нижний ремешок -Top Strap -Верхний ремешок -Vibe Eggs -Вибро яйцо -Tape Strips -Полоски ленты -Cage -Клетка -Coffin -Гроб -Capsule -Капсула -Sheet -Простынь -Body -Тело -Machine -Машина -Box -Коробка -Label & Text -Этикетка и текст -Attachments -Вложения -Tutu -Пачка -Padding -Прокладка -Structure -Структура -Pleasure Module -Модуль удовольствия -Harness -Упряжь diff --git a/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_Large.png b/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_Large.png deleted file mode 100644 index 3debaff16..000000000 Binary files a/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_Normal.png b/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_Normal.png deleted file mode 100644 index d4e12134b..000000000 Binary files a/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_Small.png b/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_Small.png deleted file mode 100644 index fcc0ad5b6..000000000 Binary files a/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_XLarge.png b/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_XLarge.png deleted file mode 100644 index 9dd41237b..000000000 Binary files a/Assets/Female3DCG/Corset/AllFours/LeatherCorsetTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_Large.png b/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_Large.png deleted file mode 100644 index 698913f01..000000000 Binary files a/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_Normal.png b/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_Normal.png deleted file mode 100644 index 32297700f..000000000 Binary files a/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_Small.png b/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_Small.png deleted file mode 100644 index 2530d34d1..000000000 Binary files a/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_XLarge.png b/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_XLarge.png deleted file mode 100644 index 2cdc94eea..000000000 Binary files a/Assets/Female3DCG/Corset/AllFours/SteampunkCorsetTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset1_Large.png b/Assets/Female3DCG/Corset/Corset1_Large.png deleted file mode 100644 index aed74d6d1..000000000 Binary files a/Assets/Female3DCG/Corset/Corset1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset1_Normal.png b/Assets/Female3DCG/Corset/Corset1_Normal.png deleted file mode 100644 index 1bddee77d..000000000 Binary files a/Assets/Female3DCG/Corset/Corset1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset1_Small.png b/Assets/Female3DCG/Corset/Corset1_Small.png deleted file mode 100644 index cf560b0f0..000000000 Binary files a/Assets/Female3DCG/Corset/Corset1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset1_XLarge.png b/Assets/Female3DCG/Corset/Corset1_XLarge.png deleted file mode 100644 index 1ea7a09ea..000000000 Binary files a/Assets/Female3DCG/Corset/Corset1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset2_Large.png b/Assets/Female3DCG/Corset/Corset2_Large.png deleted file mode 100644 index f57ace439..000000000 Binary files a/Assets/Female3DCG/Corset/Corset2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset2_Normal.png b/Assets/Female3DCG/Corset/Corset2_Normal.png deleted file mode 100644 index ea9e639c9..000000000 Binary files a/Assets/Female3DCG/Corset/Corset2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset2_Small.png b/Assets/Female3DCG/Corset/Corset2_Small.png deleted file mode 100644 index c08b1b08c..000000000 Binary files a/Assets/Female3DCG/Corset/Corset2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset2_XLarge.png b/Assets/Female3DCG/Corset/Corset2_XLarge.png deleted file mode 100644 index b9df3580e..000000000 Binary files a/Assets/Female3DCG/Corset/Corset2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset3_Large.png b/Assets/Female3DCG/Corset/Corset3_Large.png deleted file mode 100644 index 0de865d85..000000000 Binary files a/Assets/Female3DCG/Corset/Corset3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset3_Normal.png b/Assets/Female3DCG/Corset/Corset3_Normal.png deleted file mode 100644 index d1d3a7077..000000000 Binary files a/Assets/Female3DCG/Corset/Corset3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset3_Small.png b/Assets/Female3DCG/Corset/Corset3_Small.png deleted file mode 100644 index a023cfdf4..000000000 Binary files a/Assets/Female3DCG/Corset/Corset3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset3_XLarge.png b/Assets/Female3DCG/Corset/Corset3_XLarge.png deleted file mode 100644 index a70f8e1cc..000000000 Binary files a/Assets/Female3DCG/Corset/Corset3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset4_Large.png b/Assets/Female3DCG/Corset/Corset4_Large.png deleted file mode 100644 index 304d66649..000000000 Binary files a/Assets/Female3DCG/Corset/Corset4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset4_Normal.png b/Assets/Female3DCG/Corset/Corset4_Normal.png deleted file mode 100644 index 2dff3021e..000000000 Binary files a/Assets/Female3DCG/Corset/Corset4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset4_Small.png b/Assets/Female3DCG/Corset/Corset4_Small.png deleted file mode 100644 index fe0773447..000000000 Binary files a/Assets/Female3DCG/Corset/Corset4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset4_XLarge.png b/Assets/Female3DCG/Corset/Corset4_XLarge.png deleted file mode 100644 index dc6a07598..000000000 Binary files a/Assets/Female3DCG/Corset/Corset4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset5_Large.png b/Assets/Female3DCG/Corset/Corset5_Large.png deleted file mode 100644 index 34b1696d7..000000000 Binary files a/Assets/Female3DCG/Corset/Corset5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset5_Normal.png b/Assets/Female3DCG/Corset/Corset5_Normal.png deleted file mode 100644 index 570f8dc19..000000000 Binary files a/Assets/Female3DCG/Corset/Corset5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset5_Small.png b/Assets/Female3DCG/Corset/Corset5_Small.png deleted file mode 100644 index 2ae45fea3..000000000 Binary files a/Assets/Female3DCG/Corset/Corset5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset5_XLarge.png b/Assets/Female3DCG/Corset/Corset5_XLarge.png deleted file mode 100644 index 1f72c98b5..000000000 Binary files a/Assets/Female3DCG/Corset/Corset5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_Large_Buttons.png b/Assets/Female3DCG/Corset/Corset6_Large_Buttons.png deleted file mode 100644 index 4820aa113..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_Large_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_Large_Cloth.png b/Assets/Female3DCG/Corset/Corset6_Large_Cloth.png deleted file mode 100644 index cd6a01a49..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_Large_Leather.png b/Assets/Female3DCG/Corset/Corset6_Large_Leather.png deleted file mode 100644 index f35452099..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_Large_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_Normal_Buttons.png b/Assets/Female3DCG/Corset/Corset6_Normal_Buttons.png deleted file mode 100644 index 1ff19c881..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_Normal_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_Normal_Cloth.png b/Assets/Female3DCG/Corset/Corset6_Normal_Cloth.png deleted file mode 100644 index 082d7b75c..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_Normal_Leather.png b/Assets/Female3DCG/Corset/Corset6_Normal_Leather.png deleted file mode 100644 index aeb881558..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_Normal_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_Small_Buttons.png b/Assets/Female3DCG/Corset/Corset6_Small_Buttons.png deleted file mode 100644 index 8b063266d..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_Small_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_Small_Cloth.png b/Assets/Female3DCG/Corset/Corset6_Small_Cloth.png deleted file mode 100644 index e999533e4..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_Small_Leather.png b/Assets/Female3DCG/Corset/Corset6_Small_Leather.png deleted file mode 100644 index 86fa01d84..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_Small_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_XLarge_Buttons.png b/Assets/Female3DCG/Corset/Corset6_XLarge_Buttons.png deleted file mode 100644 index 015e2b284..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_XLarge_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_XLarge_Cloth.png b/Assets/Female3DCG/Corset/Corset6_XLarge_Cloth.png deleted file mode 100644 index d139a9c4c..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Corset6_XLarge_Leather.png b/Assets/Female3DCG/Corset/Corset6_XLarge_Leather.png deleted file mode 100644 index d28229fb7..000000000 Binary files a/Assets/Female3DCG/Corset/Corset6_XLarge_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset1_Large.png b/Assets/Female3DCG/Corset/Hogtied/Corset1_Large.png deleted file mode 100644 index e72065278..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset1_Normal.png b/Assets/Female3DCG/Corset/Hogtied/Corset1_Normal.png deleted file mode 100644 index 377604565..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset1_Small.png b/Assets/Female3DCG/Corset/Hogtied/Corset1_Small.png deleted file mode 100644 index be65aa2a7..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset1_XLarge.png b/Assets/Female3DCG/Corset/Hogtied/Corset1_XLarge.png deleted file mode 100644 index c2fd7f654..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset2_Large.png b/Assets/Female3DCG/Corset/Hogtied/Corset2_Large.png deleted file mode 100644 index edaef355a..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset2_Normal.png b/Assets/Female3DCG/Corset/Hogtied/Corset2_Normal.png deleted file mode 100644 index af0a32324..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset2_Small.png b/Assets/Female3DCG/Corset/Hogtied/Corset2_Small.png deleted file mode 100644 index a3c753a09..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset2_XLarge.png b/Assets/Female3DCG/Corset/Hogtied/Corset2_XLarge.png deleted file mode 100644 index 3303983ac..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset3_Large.png b/Assets/Female3DCG/Corset/Hogtied/Corset3_Large.png deleted file mode 100644 index 718acc071..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset3_Normal.png b/Assets/Female3DCG/Corset/Hogtied/Corset3_Normal.png deleted file mode 100644 index 9df95dcfd..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset3_Small.png b/Assets/Female3DCG/Corset/Hogtied/Corset3_Small.png deleted file mode 100644 index 76470399f..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset3_XLarge.png b/Assets/Female3DCG/Corset/Hogtied/Corset3_XLarge.png deleted file mode 100644 index f09dd610e..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset4_Large.png b/Assets/Female3DCG/Corset/Hogtied/Corset4_Large.png deleted file mode 100644 index 6fdb9c599..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset4_Normal.png b/Assets/Female3DCG/Corset/Hogtied/Corset4_Normal.png deleted file mode 100644 index 00f85b60d..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset4_Small.png b/Assets/Female3DCG/Corset/Hogtied/Corset4_Small.png deleted file mode 100644 index e0c33e6b5..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset4_XLarge.png b/Assets/Female3DCG/Corset/Hogtied/Corset4_XLarge.png deleted file mode 100644 index 5c958ae42..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset5_Large.png b/Assets/Female3DCG/Corset/Hogtied/Corset5_Large.png deleted file mode 100644 index 683f4207f..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset5_Normal.png b/Assets/Female3DCG/Corset/Hogtied/Corset5_Normal.png deleted file mode 100644 index a3ba16e83..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset5_Small.png b/Assets/Female3DCG/Corset/Hogtied/Corset5_Small.png deleted file mode 100644 index af33165a8..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset5_XLarge.png b/Assets/Female3DCG/Corset/Hogtied/Corset5_XLarge.png deleted file mode 100644 index 9bbc9c5dd..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_Large_Buttons.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_Large_Buttons.png deleted file mode 100644 index fb0633078..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_Large_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_Large_Cloth.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_Large_Cloth.png deleted file mode 100644 index d79515971..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_Large_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_Large_Leather.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_Large_Leather.png deleted file mode 100644 index 1d5d1ca04..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_Large_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_Normal_Buttons.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_Normal_Buttons.png deleted file mode 100644 index 618971898..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_Normal_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_Normal_Cloth.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_Normal_Cloth.png deleted file mode 100644 index f15376498..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_Normal_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_Normal_Leather.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_Normal_Leather.png deleted file mode 100644 index 1a63064c3..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_Normal_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_Small_Buttons.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_Small_Buttons.png deleted file mode 100644 index 7d7c013e9..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_Small_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_Small_Cloth.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_Small_Cloth.png deleted file mode 100644 index 301fc1a0f..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_Small_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_Small_Leather.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_Small_Leather.png deleted file mode 100644 index 195385b89..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_Small_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_XLarge_Buttons.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_XLarge_Buttons.png deleted file mode 100644 index a38cad2b5..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_XLarge_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_XLarge_Cloth.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_XLarge_Cloth.png deleted file mode 100644 index 9bd2c4872..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_XLarge_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/Corset6_XLarge_Leather.png b/Assets/Female3DCG/Corset/Hogtied/Corset6_XLarge_Leather.png deleted file mode 100644 index 5c5b5afe5..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/Corset6_XLarge_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Large_Base.png b/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Large_Base.png deleted file mode 100644 index 9bbc9c5dd..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Large_Garter.png b/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Large_Garter.png deleted file mode 100644 index 9bbc9c5dd..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Large_Garter.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Lock.png b/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Lock.png deleted file mode 100644 index 9bbc9c5dd..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Normal_Base.png b/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Normal_Base.png deleted file mode 100644 index 9bbc9c5dd..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Normal_Garter.png b/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Normal_Garter.png deleted file mode 100644 index 9bbc9c5dd..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Normal_Garter.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Small_Base.png b/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Small_Base.png deleted file mode 100644 index 9bbc9c5dd..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Small_Garter.png b/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Small_Garter.png deleted file mode 100644 index 9bbc9c5dd..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_Small_Garter.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_XLarge_Base.png b/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_XLarge_Base.png deleted file mode 100644 index 9bbc9c5dd..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_XLarge_Garter.png b/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_XLarge_Garter.png deleted file mode 100644 index 9bbc9c5dd..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LatexCorset1_XLarge_Garter.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_Large.png b/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_Large.png deleted file mode 100644 index d8b56968f..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_Normal.png b/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_Normal.png deleted file mode 100644 index 53cc5bcce..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_Small.png b/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_Small.png deleted file mode 100644 index ce46eeede..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_XLarge.png b/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_XLarge.png deleted file mode 100644 index 6bc6519bc..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/LeatherCorsetTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_Large.png b/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_Large.png deleted file mode 100644 index 8bfad5ce3..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_Normal.png b/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_Normal.png deleted file mode 100644 index 063d9e9fb..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_Small.png b/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_Small.png deleted file mode 100644 index 5509abb9d..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_XLarge.png b/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_XLarge.png deleted file mode 100644 index fc32ef68e..000000000 Binary files a/Assets/Female3DCG/Corset/Hogtied/SteampunkCorsetTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LatexCorset1_Large_Base.png b/Assets/Female3DCG/Corset/LatexCorset1_Large_Base.png deleted file mode 100644 index 70d4ddfd1..000000000 Binary files a/Assets/Female3DCG/Corset/LatexCorset1_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LatexCorset1_Large_Garter.png b/Assets/Female3DCG/Corset/LatexCorset1_Large_Garter.png deleted file mode 100644 index 9d6543ab0..000000000 Binary files a/Assets/Female3DCG/Corset/LatexCorset1_Large_Garter.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LatexCorset1_Lock.png b/Assets/Female3DCG/Corset/LatexCorset1_Lock.png deleted file mode 100644 index aeb9e25c1..000000000 Binary files a/Assets/Female3DCG/Corset/LatexCorset1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LatexCorset1_Normal_Base.png b/Assets/Female3DCG/Corset/LatexCorset1_Normal_Base.png deleted file mode 100644 index 306685a8d..000000000 Binary files a/Assets/Female3DCG/Corset/LatexCorset1_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LatexCorset1_Normal_Garter.png b/Assets/Female3DCG/Corset/LatexCorset1_Normal_Garter.png deleted file mode 100644 index 1581966c5..000000000 Binary files a/Assets/Female3DCG/Corset/LatexCorset1_Normal_Garter.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LatexCorset1_Small_Base.png b/Assets/Female3DCG/Corset/LatexCorset1_Small_Base.png deleted file mode 100644 index c83527e9c..000000000 Binary files a/Assets/Female3DCG/Corset/LatexCorset1_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LatexCorset1_Small_Garter.png b/Assets/Female3DCG/Corset/LatexCorset1_Small_Garter.png deleted file mode 100644 index 009ab80a2..000000000 Binary files a/Assets/Female3DCG/Corset/LatexCorset1_Small_Garter.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LatexCorset1_XLarge_Base.png b/Assets/Female3DCG/Corset/LatexCorset1_XLarge_Base.png deleted file mode 100644 index ee0fb5b11..000000000 Binary files a/Assets/Female3DCG/Corset/LatexCorset1_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LatexCorset1_XLarge_Garter.png b/Assets/Female3DCG/Corset/LatexCorset1_XLarge_Garter.png deleted file mode 100644 index ce0d663c6..000000000 Binary files a/Assets/Female3DCG/Corset/LatexCorset1_XLarge_Garter.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LeatherCorsetTop1_Large.png b/Assets/Female3DCG/Corset/LeatherCorsetTop1_Large.png deleted file mode 100644 index fe39142db..000000000 Binary files a/Assets/Female3DCG/Corset/LeatherCorsetTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LeatherCorsetTop1_Normal.png b/Assets/Female3DCG/Corset/LeatherCorsetTop1_Normal.png deleted file mode 100644 index 5c0edcfb3..000000000 Binary files a/Assets/Female3DCG/Corset/LeatherCorsetTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LeatherCorsetTop1_Small.png b/Assets/Female3DCG/Corset/LeatherCorsetTop1_Small.png deleted file mode 100644 index 2dee4b1d2..000000000 Binary files a/Assets/Female3DCG/Corset/LeatherCorsetTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/LeatherCorsetTop1_XLarge.png b/Assets/Female3DCG/Corset/LeatherCorsetTop1_XLarge.png deleted file mode 100644 index 32158342d..000000000 Binary files a/Assets/Female3DCG/Corset/LeatherCorsetTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_Large.png b/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_Large.png deleted file mode 100644 index 967c89b8d..000000000 Binary files a/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_Normal.png b/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_Normal.png deleted file mode 100644 index 65e27e6f2..000000000 Binary files a/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_Small.png b/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_Small.png deleted file mode 100644 index b30247ce8..000000000 Binary files a/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_XLarge.png b/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_XLarge.png deleted file mode 100644 index 5839ce9b3..000000000 Binary files a/Assets/Female3DCG/Corset/OverTheHead/SteampunkCorsetTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Preview/Corset1.png b/Assets/Female3DCG/Corset/Preview/Corset1.png deleted file mode 100644 index 4d9b3d5c0..000000000 Binary files a/Assets/Female3DCG/Corset/Preview/Corset1.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Preview/Corset2.png b/Assets/Female3DCG/Corset/Preview/Corset2.png deleted file mode 100644 index 67bd2a49f..000000000 Binary files a/Assets/Female3DCG/Corset/Preview/Corset2.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Preview/Corset3.png b/Assets/Female3DCG/Corset/Preview/Corset3.png deleted file mode 100644 index 2a32c7d78..000000000 Binary files a/Assets/Female3DCG/Corset/Preview/Corset3.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Preview/Corset4.png b/Assets/Female3DCG/Corset/Preview/Corset4.png deleted file mode 100644 index e478b74c5..000000000 Binary files a/Assets/Female3DCG/Corset/Preview/Corset4.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Preview/Corset5.png b/Assets/Female3DCG/Corset/Preview/Corset5.png deleted file mode 100644 index e9674f67b..000000000 Binary files a/Assets/Female3DCG/Corset/Preview/Corset5.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Preview/Corset6.png b/Assets/Female3DCG/Corset/Preview/Corset6.png deleted file mode 100644 index b419123f7..000000000 Binary files a/Assets/Female3DCG/Corset/Preview/Corset6.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Preview/LatexCorset1.png b/Assets/Female3DCG/Corset/Preview/LatexCorset1.png deleted file mode 100644 index c5e547705..000000000 Binary files a/Assets/Female3DCG/Corset/Preview/LatexCorset1.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Preview/LeatherCorsetTop1.png b/Assets/Female3DCG/Corset/Preview/LeatherCorsetTop1.png deleted file mode 100644 index 44e213cd0..000000000 Binary files a/Assets/Female3DCG/Corset/Preview/LeatherCorsetTop1.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/Preview/SteampunkCorsetTop1.png b/Assets/Female3DCG/Corset/Preview/SteampunkCorsetTop1.png deleted file mode 100644 index 511b15099..000000000 Binary files a/Assets/Female3DCG/Corset/Preview/SteampunkCorsetTop1.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/SteampunkCorsetTop1_Large.png b/Assets/Female3DCG/Corset/SteampunkCorsetTop1_Large.png deleted file mode 100644 index 1062250d5..000000000 Binary files a/Assets/Female3DCG/Corset/SteampunkCorsetTop1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/SteampunkCorsetTop1_Normal.png b/Assets/Female3DCG/Corset/SteampunkCorsetTop1_Normal.png deleted file mode 100644 index d3c3a5c46..000000000 Binary files a/Assets/Female3DCG/Corset/SteampunkCorsetTop1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/SteampunkCorsetTop1_Small.png b/Assets/Female3DCG/Corset/SteampunkCorsetTop1_Small.png deleted file mode 100644 index 4726c3dc1..000000000 Binary files a/Assets/Female3DCG/Corset/SteampunkCorsetTop1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Corset/SteampunkCorsetTop1_XLarge.png b/Assets/Female3DCG/Corset/SteampunkCorsetTop1_XLarge.png deleted file mode 100644 index f5cbddb51..000000000 Binary files a/Assets/Female3DCG/Corset/SteampunkCorsetTop1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Afk/Emoticon.png b/Assets/Female3DCG/Emoticon/Afk/Emoticon.png deleted file mode 100644 index 919896c76..000000000 Binary files a/Assets/Female3DCG/Emoticon/Afk/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Afk/Icon.png b/Assets/Female3DCG/Emoticon/Afk/Icon.png deleted file mode 100644 index 2a46a1b0f..000000000 Binary files a/Assets/Female3DCG/Emoticon/Afk/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Annoyed/Emoticon.png b/Assets/Female3DCG/Emoticon/Annoyed/Emoticon.png deleted file mode 100644 index 1db461e40..000000000 Binary files a/Assets/Female3DCG/Emoticon/Annoyed/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Annoyed/Icon.png b/Assets/Female3DCG/Emoticon/Annoyed/Icon.png deleted file mode 100644 index c9114eba0..000000000 Binary files a/Assets/Female3DCG/Emoticon/Annoyed/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Confusion/Emoticon.png b/Assets/Female3DCG/Emoticon/Confusion/Emoticon.png deleted file mode 100644 index d881695ec..000000000 Binary files a/Assets/Female3DCG/Emoticon/Confusion/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Confusion/Icon.png b/Assets/Female3DCG/Emoticon/Confusion/Icon.png deleted file mode 100644 index 6c3e9e9bb..000000000 Binary files a/Assets/Female3DCG/Emoticon/Confusion/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Emoticon.png b/Assets/Female3DCG/Emoticon/Emoticon.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/Emoticon/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Exclamation/Emoticon.png b/Assets/Female3DCG/Emoticon/Exclamation/Emoticon.png deleted file mode 100644 index fc3f8e220..000000000 Binary files a/Assets/Female3DCG/Emoticon/Exclamation/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Exclamation/Icon.png b/Assets/Female3DCG/Emoticon/Exclamation/Icon.png deleted file mode 100644 index bf624df2d..000000000 Binary files a/Assets/Female3DCG/Emoticon/Exclamation/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Gaming/Emoticon.png b/Assets/Female3DCG/Emoticon/Gaming/Emoticon.png deleted file mode 100644 index 1f31a521d..000000000 Binary files a/Assets/Female3DCG/Emoticon/Gaming/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Gaming/Icon.png b/Assets/Female3DCG/Emoticon/Gaming/Icon.png deleted file mode 100644 index 91d9d7fef..000000000 Binary files a/Assets/Female3DCG/Emoticon/Gaming/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Hearing/Emoticon.png b/Assets/Female3DCG/Emoticon/Hearing/Emoticon.png deleted file mode 100644 index 82a3c4fe8..000000000 Binary files a/Assets/Female3DCG/Emoticon/Hearing/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Hearing/Icon.png b/Assets/Female3DCG/Emoticon/Hearing/Icon.png deleted file mode 100644 index c0234f8c5..000000000 Binary files a/Assets/Female3DCG/Emoticon/Hearing/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Hearts/Emoticon.png b/Assets/Female3DCG/Emoticon/Hearts/Emoticon.png deleted file mode 100644 index 43e198108..000000000 Binary files a/Assets/Female3DCG/Emoticon/Hearts/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Hearts/Icon.png b/Assets/Female3DCG/Emoticon/Hearts/Icon.png deleted file mode 100644 index a39d35d4d..000000000 Binary files a/Assets/Female3DCG/Emoticon/Hearts/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Icon.png b/Assets/Female3DCG/Emoticon/Icon.png deleted file mode 100644 index 0915c49d3..000000000 Binary files a/Assets/Female3DCG/Emoticon/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/LoveGag/Emoticon.png b/Assets/Female3DCG/Emoticon/LoveGag/Emoticon.png deleted file mode 100644 index 37053d935..000000000 Binary files a/Assets/Female3DCG/Emoticon/LoveGag/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/LoveGag/Icon.png b/Assets/Female3DCG/Emoticon/LoveGag/Icon.png deleted file mode 100644 index 423e4a5ad..000000000 Binary files a/Assets/Female3DCG/Emoticon/LoveGag/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/LoveLock/Emoticon.png b/Assets/Female3DCG/Emoticon/LoveLock/Emoticon.png deleted file mode 100644 index b21413ba9..000000000 Binary files a/Assets/Female3DCG/Emoticon/LoveLock/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/LoveLock/Icon.png b/Assets/Female3DCG/Emoticon/LoveLock/Icon.png deleted file mode 100644 index 22585e878..000000000 Binary files a/Assets/Female3DCG/Emoticon/LoveLock/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/LoveRope/Emoticon.png b/Assets/Female3DCG/Emoticon/LoveRope/Emoticon.png deleted file mode 100644 index 70615bd3b..000000000 Binary files a/Assets/Female3DCG/Emoticon/LoveRope/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/LoveRope/Icon.png b/Assets/Female3DCG/Emoticon/LoveRope/Icon.png deleted file mode 100644 index c126bff7d..000000000 Binary files a/Assets/Female3DCG/Emoticon/LoveRope/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/RaisedHand/Emoticon.png b/Assets/Female3DCG/Emoticon/RaisedHand/Emoticon.png deleted file mode 100644 index fa4213b2b..000000000 Binary files a/Assets/Female3DCG/Emoticon/RaisedHand/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/RaisedHand/Icon.png b/Assets/Female3DCG/Emoticon/RaisedHand/Icon.png deleted file mode 100644 index 26ee4156b..000000000 Binary files a/Assets/Female3DCG/Emoticon/RaisedHand/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Read/Emoticon.png b/Assets/Female3DCG/Emoticon/Read/Emoticon.png deleted file mode 100644 index 42bab3eca..000000000 Binary files a/Assets/Female3DCG/Emoticon/Read/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Read/Icon.png b/Assets/Female3DCG/Emoticon/Read/Icon.png deleted file mode 100644 index 5458471dd..000000000 Binary files a/Assets/Female3DCG/Emoticon/Read/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Sleep/Emoticon.png b/Assets/Female3DCG/Emoticon/Sleep/Emoticon.png deleted file mode 100644 index d6eab98c2..000000000 Binary files a/Assets/Female3DCG/Emoticon/Sleep/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Sleep/Icon.png b/Assets/Female3DCG/Emoticon/Sleep/Icon.png deleted file mode 100644 index 005c0bfdd..000000000 Binary files a/Assets/Female3DCG/Emoticon/Sleep/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Spectator/Emoticon.png b/Assets/Female3DCG/Emoticon/Spectator/Emoticon.png deleted file mode 100644 index c0b0374bc..000000000 Binary files a/Assets/Female3DCG/Emoticon/Spectator/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Spectator/Icon.png b/Assets/Female3DCG/Emoticon/Spectator/Icon.png deleted file mode 100644 index ce00d1dbc..000000000 Binary files a/Assets/Female3DCG/Emoticon/Spectator/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Tear/Emoticon.png b/Assets/Female3DCG/Emoticon/Tear/Emoticon.png deleted file mode 100644 index cff193380..000000000 Binary files a/Assets/Female3DCG/Emoticon/Tear/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Tear/Icon.png b/Assets/Female3DCG/Emoticon/Tear/Icon.png deleted file mode 100644 index 53113ef6e..000000000 Binary files a/Assets/Female3DCG/Emoticon/Tear/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/ThumbsDown/Emoticon.png b/Assets/Female3DCG/Emoticon/ThumbsDown/Emoticon.png deleted file mode 100644 index 3913e1509..000000000 Binary files a/Assets/Female3DCG/Emoticon/ThumbsDown/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/ThumbsDown/Icon.png b/Assets/Female3DCG/Emoticon/ThumbsDown/Icon.png deleted file mode 100644 index 25fc27ffc..000000000 Binary files a/Assets/Female3DCG/Emoticon/ThumbsDown/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/ThumbsUp/Emoticon.png b/Assets/Female3DCG/Emoticon/ThumbsUp/Emoticon.png deleted file mode 100644 index ce34738a9..000000000 Binary files a/Assets/Female3DCG/Emoticon/ThumbsUp/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/ThumbsUp/Icon.png b/Assets/Female3DCG/Emoticon/ThumbsUp/Icon.png deleted file mode 100644 index 835e0f136..000000000 Binary files a/Assets/Female3DCG/Emoticon/ThumbsUp/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Wardrobe/Emoticon.png b/Assets/Female3DCG/Emoticon/Wardrobe/Emoticon.png deleted file mode 100644 index 3a770ecc7..000000000 Binary files a/Assets/Female3DCG/Emoticon/Wardrobe/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Wardrobe/Icon.png b/Assets/Female3DCG/Emoticon/Wardrobe/Icon.png deleted file mode 100644 index 3f598d7cf..000000000 Binary files a/Assets/Female3DCG/Emoticon/Wardrobe/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Whisper/Emoticon.png b/Assets/Female3DCG/Emoticon/Whisper/Emoticon.png deleted file mode 100644 index 82a5953fe..000000000 Binary files a/Assets/Female3DCG/Emoticon/Whisper/Emoticon.png and /dev/null differ diff --git a/Assets/Female3DCG/Emoticon/Whisper/Icon.png b/Assets/Female3DCG/Emoticon/Whisper/Icon.png deleted file mode 100644 index db3e4aca3..000000000 Binary files a/Assets/Female3DCG/Emoticon/Whisper/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Angry/Eyebrows1.png b/Assets/Female3DCG/Eyebrows/Angry/Eyebrows1.png deleted file mode 100644 index 88aaccb39..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Angry/Eyebrows1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Angry/Icon.png b/Assets/Female3DCG/Eyebrows/Angry/Icon.png deleted file mode 100644 index 0eaaf541b..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Angry/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Eyebrows1.png b/Assets/Female3DCG/Eyebrows/Eyebrows1.png deleted file mode 100644 index 769e9a9c6..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Eyebrows1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Harsh/Eyebrows1.png b/Assets/Female3DCG/Eyebrows/Harsh/Eyebrows1.png deleted file mode 100644 index e62002621..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Harsh/Eyebrows1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Harsh/Icon.png b/Assets/Female3DCG/Eyebrows/Harsh/Icon.png deleted file mode 100644 index 5ad980a38..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Harsh/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Icon.png b/Assets/Female3DCG/Eyebrows/Icon.png deleted file mode 100644 index c47153324..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Lowered/Eyebrows1.png b/Assets/Female3DCG/Eyebrows/Lowered/Eyebrows1.png deleted file mode 100644 index 79176f4d7..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Lowered/Eyebrows1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Lowered/Icon.png b/Assets/Female3DCG/Eyebrows/Lowered/Icon.png deleted file mode 100644 index 000cc9194..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Lowered/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/OneRaised/Eyebrows1.png b/Assets/Female3DCG/Eyebrows/OneRaised/Eyebrows1.png deleted file mode 100644 index ae41d9704..000000000 Binary files a/Assets/Female3DCG/Eyebrows/OneRaised/Eyebrows1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/OneRaised/Icon.png b/Assets/Female3DCG/Eyebrows/OneRaised/Icon.png deleted file mode 100644 index 196cb391e..000000000 Binary files a/Assets/Female3DCG/Eyebrows/OneRaised/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Raised/Eyebrows1.png b/Assets/Female3DCG/Eyebrows/Raised/Eyebrows1.png deleted file mode 100644 index 8eb5bf2b3..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Raised/Eyebrows1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Raised/Icon.png b/Assets/Female3DCG/Eyebrows/Raised/Icon.png deleted file mode 100644 index 2d3a5194c..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Raised/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Soft/Eyebrows1.png b/Assets/Female3DCG/Eyebrows/Soft/Eyebrows1.png deleted file mode 100644 index 1d5750dbe..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Soft/Eyebrows1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyebrows/Soft/Icon.png b/Assets/Female3DCG/Eyebrows/Soft/Icon.png deleted file mode 100644 index e95f64f92..000000000 Binary files a/Assets/Female3DCG/Eyebrows/Soft/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes1.png b/Assets/Female3DCG/Eyes/Angry/Eyes1.png deleted file mode 100644 index 82f32b65d..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes10.png b/Assets/Female3DCG/Eyes/Angry/Eyes10.png deleted file mode 100644 index 50e10ec3d..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes11.png b/Assets/Female3DCG/Eyes/Angry/Eyes11.png deleted file mode 100644 index 56d7b2dfc..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes12.png b/Assets/Female3DCG/Eyes/Angry/Eyes12.png deleted file mode 100644 index b65e30056..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes13.png b/Assets/Female3DCG/Eyes/Angry/Eyes13.png deleted file mode 100644 index 4e9a7200a..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes2.png b/Assets/Female3DCG/Eyes/Angry/Eyes2.png deleted file mode 100644 index 537ff1f74..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes3.png b/Assets/Female3DCG/Eyes/Angry/Eyes3.png deleted file mode 100644 index e3b27dba4..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes4.png b/Assets/Female3DCG/Eyes/Angry/Eyes4.png deleted file mode 100644 index 835d159d3..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes5.png b/Assets/Female3DCG/Eyes/Angry/Eyes5.png deleted file mode 100644 index d57815954..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes6.png b/Assets/Female3DCG/Eyes/Angry/Eyes6.png deleted file mode 100644 index 29f921ae0..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes7.png b/Assets/Female3DCG/Eyes/Angry/Eyes7.png deleted file mode 100644 index 0b37282ac..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes8.png b/Assets/Female3DCG/Eyes/Angry/Eyes8.png deleted file mode 100644 index 5f66aae24..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Eyes9.png b/Assets/Female3DCG/Eyes/Angry/Eyes9.png deleted file mode 100644 index 1fda6fdab..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Angry/Icon.png b/Assets/Female3DCG/Eyes/Angry/Icon.png deleted file mode 100644 index 23dd83a61..000000000 Binary files a/Assets/Female3DCG/Eyes/Angry/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes1.png b/Assets/Female3DCG/Eyes/Closed/Eyes1.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes10.png b/Assets/Female3DCG/Eyes/Closed/Eyes10.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes11.png b/Assets/Female3DCG/Eyes/Closed/Eyes11.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes12.png b/Assets/Female3DCG/Eyes/Closed/Eyes12.png deleted file mode 100644 index 3bf07260c..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes13.png b/Assets/Female3DCG/Eyes/Closed/Eyes13.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes2.png b/Assets/Female3DCG/Eyes/Closed/Eyes2.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes3.png b/Assets/Female3DCG/Eyes/Closed/Eyes3.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes4.png b/Assets/Female3DCG/Eyes/Closed/Eyes4.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes5.png b/Assets/Female3DCG/Eyes/Closed/Eyes5.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes6.png b/Assets/Female3DCG/Eyes/Closed/Eyes6.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes7.png b/Assets/Female3DCG/Eyes/Closed/Eyes7.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes8.png b/Assets/Female3DCG/Eyes/Closed/Eyes8.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Eyes9.png b/Assets/Female3DCG/Eyes/Closed/Eyes9.png deleted file mode 100644 index 75fc5a8e5..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Icon.png b/Assets/Female3DCG/Eyes/Closed/Icon.png deleted file mode 100644 index 753a7d6c0..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Stitches_Cross.png b/Assets/Female3DCG/Eyes/Closed/Stitches_Cross.png deleted file mode 100644 index 8d009b3bc..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Stitches_FakeEye.png b/Assets/Female3DCG/Eyes/Closed/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Stitches_FakeEye2.png b/Assets/Female3DCG/Eyes/Closed/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Stitches_Skewed.png b/Assets/Female3DCG/Eyes/Closed/Stitches_Skewed.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Stitches_Straight.png b/Assets/Female3DCG/Eyes/Closed/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Stitches_Straight2.png b/Assets/Female3DCG/Eyes/Closed/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Stitches_ZigZag.png b/Assets/Female3DCG/Eyes/Closed/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Closed/Stitches_ZigZag2.png b/Assets/Female3DCG/Eyes/Closed/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/Eyes/Closed/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes1.png b/Assets/Female3DCG/Eyes/Daydream/Eyes1.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes10.png b/Assets/Female3DCG/Eyes/Daydream/Eyes10.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes11.png b/Assets/Female3DCG/Eyes/Daydream/Eyes11.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes12.png b/Assets/Female3DCG/Eyes/Daydream/Eyes12.png deleted file mode 100644 index 21ac38295..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes13.png b/Assets/Female3DCG/Eyes/Daydream/Eyes13.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes2.png b/Assets/Female3DCG/Eyes/Daydream/Eyes2.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes3.png b/Assets/Female3DCG/Eyes/Daydream/Eyes3.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes4.png b/Assets/Female3DCG/Eyes/Daydream/Eyes4.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes5.png b/Assets/Female3DCG/Eyes/Daydream/Eyes5.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes6.png b/Assets/Female3DCG/Eyes/Daydream/Eyes6.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes7.png b/Assets/Female3DCG/Eyes/Daydream/Eyes7.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes8.png b/Assets/Female3DCG/Eyes/Daydream/Eyes8.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Eyes9.png b/Assets/Female3DCG/Eyes/Daydream/Eyes9.png deleted file mode 100644 index bee9b3a1d..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Daydream/Icon.png b/Assets/Female3DCG/Eyes/Daydream/Icon.png deleted file mode 100644 index 759d83291..000000000 Binary files a/Assets/Female3DCG/Eyes/Daydream/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes1.png b/Assets/Female3DCG/Eyes/Dazed/Eyes1.png deleted file mode 100644 index 1cf076151..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes10.png b/Assets/Female3DCG/Eyes/Dazed/Eyes10.png deleted file mode 100644 index 37706c470..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes11.png b/Assets/Female3DCG/Eyes/Dazed/Eyes11.png deleted file mode 100644 index 14bcef277..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes12.png b/Assets/Female3DCG/Eyes/Dazed/Eyes12.png deleted file mode 100644 index cd7123814..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes13.png b/Assets/Female3DCG/Eyes/Dazed/Eyes13.png deleted file mode 100644 index b5d078942..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes2.png b/Assets/Female3DCG/Eyes/Dazed/Eyes2.png deleted file mode 100644 index de9f9e352..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes3.png b/Assets/Female3DCG/Eyes/Dazed/Eyes3.png deleted file mode 100644 index 357be49aa..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes4.png b/Assets/Female3DCG/Eyes/Dazed/Eyes4.png deleted file mode 100644 index e4c1826cb..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes5.png b/Assets/Female3DCG/Eyes/Dazed/Eyes5.png deleted file mode 100644 index 1ff1644fb..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes6.png b/Assets/Female3DCG/Eyes/Dazed/Eyes6.png deleted file mode 100644 index 9197aad34..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes7.png b/Assets/Female3DCG/Eyes/Dazed/Eyes7.png deleted file mode 100644 index a07a335bc..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes8.png b/Assets/Female3DCG/Eyes/Dazed/Eyes8.png deleted file mode 100644 index fbe94a51b..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Eyes9.png b/Assets/Female3DCG/Eyes/Dazed/Eyes9.png deleted file mode 100644 index bec3ea62a..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/EyesDazedLids.png b/Assets/Female3DCG/Eyes/Dazed/EyesDazedLids.png deleted file mode 100644 index fb4e4e186..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/EyesDazedLids.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dazed/Icon.png b/Assets/Female3DCG/Eyes/Dazed/Icon.png deleted file mode 100644 index 87c39d644..000000000 Binary files a/Assets/Female3DCG/Eyes/Dazed/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes1.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes1.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes10.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes10.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes11.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes11.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes12.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes12.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes13.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes13.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes2.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes2.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes3.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes3.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes4.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes4.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes5.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes5.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes6.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes6.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes7.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes7.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes8.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes8.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Eyes9.png b/Assets/Female3DCG/Eyes/Dizzy/Eyes9.png deleted file mode 100644 index 7e20d8292..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Dizzy/Icon.png b/Assets/Female3DCG/Eyes/Dizzy/Icon.png deleted file mode 100644 index f83e7a3ce..000000000 Binary files a/Assets/Female3DCG/Eyes/Dizzy/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes1.png b/Assets/Female3DCG/Eyes/Eyes1.png deleted file mode 100644 index 55871cf5f..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes10.png b/Assets/Female3DCG/Eyes/Eyes10.png deleted file mode 100644 index 77cc69109..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes11.png b/Assets/Female3DCG/Eyes/Eyes11.png deleted file mode 100644 index f6ef69df9..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes12.png b/Assets/Female3DCG/Eyes/Eyes12.png deleted file mode 100644 index 780fef9d6..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes13.png b/Assets/Female3DCG/Eyes/Eyes13.png deleted file mode 100644 index ef4c02d4e..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes2.png b/Assets/Female3DCG/Eyes/Eyes2.png deleted file mode 100644 index 7964acfbe..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes3.png b/Assets/Female3DCG/Eyes/Eyes3.png deleted file mode 100644 index dae6d6c3e..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes4.png b/Assets/Female3DCG/Eyes/Eyes4.png deleted file mode 100644 index 779fdc760..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes5.png b/Assets/Female3DCG/Eyes/Eyes5.png deleted file mode 100644 index 922efaa42..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes6.png b/Assets/Female3DCG/Eyes/Eyes6.png deleted file mode 100644 index 8fac1147c..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes7.png b/Assets/Female3DCG/Eyes/Eyes7.png deleted file mode 100644 index 9cdbd2d47..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes8.png b/Assets/Female3DCG/Eyes/Eyes8.png deleted file mode 100644 index cc69692f8..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Eyes9.png b/Assets/Female3DCG/Eyes/Eyes9.png deleted file mode 100644 index a41bccbeb..000000000 Binary files a/Assets/Female3DCG/Eyes/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes1.png b/Assets/Female3DCG/Eyes/Heart/Eyes1.png deleted file mode 100644 index effed1d59..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes10.png b/Assets/Female3DCG/Eyes/Heart/Eyes10.png deleted file mode 100644 index effed1d59..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes11.png b/Assets/Female3DCG/Eyes/Heart/Eyes11.png deleted file mode 100644 index effed1d59..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes12.png b/Assets/Female3DCG/Eyes/Heart/Eyes12.png deleted file mode 100644 index 115947359..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes13.png b/Assets/Female3DCG/Eyes/Heart/Eyes13.png deleted file mode 100644 index b41713927..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes2.png b/Assets/Female3DCG/Eyes/Heart/Eyes2.png deleted file mode 100644 index effed1d59..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes3.png b/Assets/Female3DCG/Eyes/Heart/Eyes3.png deleted file mode 100644 index effed1d59..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes4.png b/Assets/Female3DCG/Eyes/Heart/Eyes4.png deleted file mode 100644 index effed1d59..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes5.png b/Assets/Female3DCG/Eyes/Heart/Eyes5.png deleted file mode 100644 index effed1d59..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes6.png b/Assets/Female3DCG/Eyes/Heart/Eyes6.png deleted file mode 100644 index effed1d59..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes7.png b/Assets/Female3DCG/Eyes/Heart/Eyes7.png deleted file mode 100644 index effed1d59..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes8.png b/Assets/Female3DCG/Eyes/Heart/Eyes8.png deleted file mode 100644 index effed1d59..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Eyes9.png b/Assets/Female3DCG/Eyes/Heart/Eyes9.png deleted file mode 100644 index effed1d59..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Heart/Icon.png b/Assets/Female3DCG/Eyes/Heart/Icon.png deleted file mode 100644 index 2b11947fe..000000000 Binary files a/Assets/Female3DCG/Eyes/Heart/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes1.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes1.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes10.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes10.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes11.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes11.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes12.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes12.png deleted file mode 100644 index d1ff3072f..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes13.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes13.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes2.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes2.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes3.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes3.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes4.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes4.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes5.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes5.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes6.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes6.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes7.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes7.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes8.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes8.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Eyes9.png b/Assets/Female3DCG/Eyes/HeartPink/Eyes9.png deleted file mode 100644 index 30f6ad0d2..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/HeartPink/Icon.png b/Assets/Female3DCG/Eyes/HeartPink/Icon.png deleted file mode 100644 index 7f13dd0c0..000000000 Binary files a/Assets/Female3DCG/Eyes/HeartPink/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes1.png b/Assets/Female3DCG/Eyes/Horny/Eyes1.png deleted file mode 100644 index c448bdfe7..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes10.png b/Assets/Female3DCG/Eyes/Horny/Eyes10.png deleted file mode 100644 index 6a75a0190..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes11.png b/Assets/Female3DCG/Eyes/Horny/Eyes11.png deleted file mode 100644 index bd42f4fcb..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes12.png b/Assets/Female3DCG/Eyes/Horny/Eyes12.png deleted file mode 100644 index f64f8e9c4..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes13.png b/Assets/Female3DCG/Eyes/Horny/Eyes13.png deleted file mode 100644 index daf5caa34..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes2.png b/Assets/Female3DCG/Eyes/Horny/Eyes2.png deleted file mode 100644 index 497c4d960..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes3.png b/Assets/Female3DCG/Eyes/Horny/Eyes3.png deleted file mode 100644 index 169bb512a..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes4.png b/Assets/Female3DCG/Eyes/Horny/Eyes4.png deleted file mode 100644 index e90ced0eb..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes5.png b/Assets/Female3DCG/Eyes/Horny/Eyes5.png deleted file mode 100644 index a86637508..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes6.png b/Assets/Female3DCG/Eyes/Horny/Eyes6.png deleted file mode 100644 index 7e273bdb2..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes7.png b/Assets/Female3DCG/Eyes/Horny/Eyes7.png deleted file mode 100644 index f947e6d5c..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes8.png b/Assets/Female3DCG/Eyes/Horny/Eyes8.png deleted file mode 100644 index ce39d1407..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Eyes9.png b/Assets/Female3DCG/Eyes/Horny/Eyes9.png deleted file mode 100644 index f0693f419..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Horny/Icon.png b/Assets/Female3DCG/Eyes/Horny/Icon.png deleted file mode 100644 index bde7bfb57..000000000 Binary files a/Assets/Female3DCG/Eyes/Horny/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Icon.png b/Assets/Female3DCG/Eyes/Icon.png deleted file mode 100644 index 03e2700c0..000000000 Binary files a/Assets/Female3DCG/Eyes/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes1.png b/Assets/Female3DCG/Eyes/Lewd/Eyes1.png deleted file mode 100644 index 3f2fc4531..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes10.png b/Assets/Female3DCG/Eyes/Lewd/Eyes10.png deleted file mode 100644 index f2c6cb7e6..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes11.png b/Assets/Female3DCG/Eyes/Lewd/Eyes11.png deleted file mode 100644 index c78f931c2..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes12.png b/Assets/Female3DCG/Eyes/Lewd/Eyes12.png deleted file mode 100644 index 2e14793c0..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes13.png b/Assets/Female3DCG/Eyes/Lewd/Eyes13.png deleted file mode 100644 index b9c05a4dd..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes2.png b/Assets/Female3DCG/Eyes/Lewd/Eyes2.png deleted file mode 100644 index 5a0c3fdb5..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes3.png b/Assets/Female3DCG/Eyes/Lewd/Eyes3.png deleted file mode 100644 index 91e6e65df..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes4.png b/Assets/Female3DCG/Eyes/Lewd/Eyes4.png deleted file mode 100644 index 6ddfe4e32..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes5.png b/Assets/Female3DCG/Eyes/Lewd/Eyes5.png deleted file mode 100644 index 89620c3c6..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes6.png b/Assets/Female3DCG/Eyes/Lewd/Eyes6.png deleted file mode 100644 index 6f49ee3fa..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes7.png b/Assets/Female3DCG/Eyes/Lewd/Eyes7.png deleted file mode 100644 index 62ecaa4b0..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes8.png b/Assets/Female3DCG/Eyes/Lewd/Eyes8.png deleted file mode 100644 index a16900a8c..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Eyes9.png b/Assets/Female3DCG/Eyes/Lewd/Eyes9.png deleted file mode 100644 index 2fd55c99a..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Lewd/Icon.png b/Assets/Female3DCG/Eyes/Lewd/Icon.png deleted file mode 100644 index 1e80eb68d..000000000 Binary files a/Assets/Female3DCG/Eyes/Lewd/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes1.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes1.png deleted file mode 100644 index 6982b49ff..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes10.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes10.png deleted file mode 100644 index 6982b49ff..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes11.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes11.png deleted file mode 100644 index 6982b49ff..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes12.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes12.png deleted file mode 100644 index 315798305..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes13.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes13.png deleted file mode 100644 index cc152aec2..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes2.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes2.png deleted file mode 100644 index 6982b49ff..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes3.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes3.png deleted file mode 100644 index 6982b49ff..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes4.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes4.png deleted file mode 100644 index 6982b49ff..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes5.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes5.png deleted file mode 100644 index 6982b49ff..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes6.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes6.png deleted file mode 100644 index 6982b49ff..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes7.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes7.png deleted file mode 100644 index 6982b49ff..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes8.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes8.png deleted file mode 100644 index 6982b49ff..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Eyes9.png b/Assets/Female3DCG/Eyes/LewdHeart/Eyes9.png deleted file mode 100644 index 6982b49ff..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeart/Icon.png b/Assets/Female3DCG/Eyes/LewdHeart/Icon.png deleted file mode 100644 index 64d411c22..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeart/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes1.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes1.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes10.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes10.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes11.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes11.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes12.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes12.png deleted file mode 100644 index e439c1968..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes13.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes13.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes2.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes2.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes3.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes3.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes4.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes4.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes5.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes5.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes6.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes6.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes7.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes7.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes8.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes8.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes9.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes9.png deleted file mode 100644 index ab9f213ad..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/LewdHeartPink/Icon.png b/Assets/Female3DCG/Eyes/LewdHeartPink/Icon.png deleted file mode 100644 index 6274644ed..000000000 Binary files a/Assets/Female3DCG/Eyes/LewdHeartPink/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes1.png b/Assets/Female3DCG/Eyes/Sad/Eyes1.png deleted file mode 100644 index 7638d375e..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes10.png b/Assets/Female3DCG/Eyes/Sad/Eyes10.png deleted file mode 100644 index e8638ebf8..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes11.png b/Assets/Female3DCG/Eyes/Sad/Eyes11.png deleted file mode 100644 index d07ecfef6..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes12.png b/Assets/Female3DCG/Eyes/Sad/Eyes12.png deleted file mode 100644 index a115ebc9d..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes13.png b/Assets/Female3DCG/Eyes/Sad/Eyes13.png deleted file mode 100644 index 39ad788a2..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes2.png b/Assets/Female3DCG/Eyes/Sad/Eyes2.png deleted file mode 100644 index 69fd3c4d2..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes3.png b/Assets/Female3DCG/Eyes/Sad/Eyes3.png deleted file mode 100644 index 734fcda98..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes4.png b/Assets/Female3DCG/Eyes/Sad/Eyes4.png deleted file mode 100644 index fdcc25d1c..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes5.png b/Assets/Female3DCG/Eyes/Sad/Eyes5.png deleted file mode 100644 index 5ec9b8b31..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes6.png b/Assets/Female3DCG/Eyes/Sad/Eyes6.png deleted file mode 100644 index dd9e0ff84..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes7.png b/Assets/Female3DCG/Eyes/Sad/Eyes7.png deleted file mode 100644 index 78dffd5d0..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes8.png b/Assets/Female3DCG/Eyes/Sad/Eyes8.png deleted file mode 100644 index 9ef302a44..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Eyes9.png b/Assets/Female3DCG/Eyes/Sad/Eyes9.png deleted file mode 100644 index 22fc9d6f0..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Sad/Icon.png b/Assets/Female3DCG/Eyes/Sad/Icon.png deleted file mode 100644 index d051a6489..000000000 Binary files a/Assets/Female3DCG/Eyes/Sad/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes1.png b/Assets/Female3DCG/Eyes/Scared/Eyes1.png deleted file mode 100644 index 360aad7a8..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes10.png b/Assets/Female3DCG/Eyes/Scared/Eyes10.png deleted file mode 100644 index b29329be3..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes11.png b/Assets/Female3DCG/Eyes/Scared/Eyes11.png deleted file mode 100644 index c83922690..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes12.png b/Assets/Female3DCG/Eyes/Scared/Eyes12.png deleted file mode 100644 index 27e0a28fc..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes13.png b/Assets/Female3DCG/Eyes/Scared/Eyes13.png deleted file mode 100644 index 403fab1eb..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes2.png b/Assets/Female3DCG/Eyes/Scared/Eyes2.png deleted file mode 100644 index d08715789..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes3.png b/Assets/Female3DCG/Eyes/Scared/Eyes3.png deleted file mode 100644 index e5bec150e..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes4.png b/Assets/Female3DCG/Eyes/Scared/Eyes4.png deleted file mode 100644 index 0444c000b..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes5.png b/Assets/Female3DCG/Eyes/Scared/Eyes5.png deleted file mode 100644 index d6920b8cf..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes6.png b/Assets/Female3DCG/Eyes/Scared/Eyes6.png deleted file mode 100644 index fa4083c9e..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes7.png b/Assets/Female3DCG/Eyes/Scared/Eyes7.png deleted file mode 100644 index fa5d7f379..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes8.png b/Assets/Female3DCG/Eyes/Scared/Eyes8.png deleted file mode 100644 index 5e7079c72..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Eyes9.png b/Assets/Female3DCG/Eyes/Scared/Eyes9.png deleted file mode 100644 index 80aaba56d..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Scared/Icon.png b/Assets/Female3DCG/Eyes/Scared/Icon.png deleted file mode 100644 index 65d48a450..000000000 Binary files a/Assets/Female3DCG/Eyes/Scared/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes1.png b/Assets/Female3DCG/Eyes/Shy/Eyes1.png deleted file mode 100644 index 6ded1ce96..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes10.png b/Assets/Female3DCG/Eyes/Shy/Eyes10.png deleted file mode 100644 index f9e873105..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes11.png b/Assets/Female3DCG/Eyes/Shy/Eyes11.png deleted file mode 100644 index 834e8d1e1..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes12.png b/Assets/Female3DCG/Eyes/Shy/Eyes12.png deleted file mode 100644 index 7ab72a865..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes13.png b/Assets/Female3DCG/Eyes/Shy/Eyes13.png deleted file mode 100644 index 61d6e6e7c..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes2.png b/Assets/Female3DCG/Eyes/Shy/Eyes2.png deleted file mode 100644 index 8e9019b75..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes3.png b/Assets/Female3DCG/Eyes/Shy/Eyes3.png deleted file mode 100644 index c42afea94..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes4.png b/Assets/Female3DCG/Eyes/Shy/Eyes4.png deleted file mode 100644 index 820840f27..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes5.png b/Assets/Female3DCG/Eyes/Shy/Eyes5.png deleted file mode 100644 index 85e3c0cdb..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes6.png b/Assets/Female3DCG/Eyes/Shy/Eyes6.png deleted file mode 100644 index cb49f9ce2..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes7.png b/Assets/Female3DCG/Eyes/Shy/Eyes7.png deleted file mode 100644 index a42b7a33a..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes8.png b/Assets/Female3DCG/Eyes/Shy/Eyes8.png deleted file mode 100644 index 1fa939935..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Eyes9.png b/Assets/Female3DCG/Eyes/Shy/Eyes9.png deleted file mode 100644 index ec47705ee..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Shy/Icon.png b/Assets/Female3DCG/Eyes/Shy/Icon.png deleted file mode 100644 index d17f0bdfb..000000000 Binary files a/Assets/Female3DCG/Eyes/Shy/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes1.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes1.png deleted file mode 100644 index a35833e56..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes10.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes10.png deleted file mode 100644 index a35833e56..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes11.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes11.png deleted file mode 100644 index f6d0c3d82..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes12.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes12.png deleted file mode 100644 index f6d0c3d82..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes13.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes13.png deleted file mode 100644 index a35833e56..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes2.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes2.png deleted file mode 100644 index f6d0c3d82..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes3.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes3.png deleted file mode 100644 index f6d0c3d82..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes4.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes4.png deleted file mode 100644 index a35833e56..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes5.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes5.png deleted file mode 100644 index a35833e56..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes6.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes6.png deleted file mode 100644 index f6d0c3d82..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes7.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes7.png deleted file mode 100644 index a35833e56..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes8.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes8.png deleted file mode 100644 index f6d0c3d82..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes9.png b/Assets/Female3DCG/Eyes/ShylyHappy/Eyes9.png deleted file mode 100644 index a35833e56..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/ShylyHappy/Icon.png b/Assets/Female3DCG/Eyes/ShylyHappy/Icon.png deleted file mode 100644 index add00c7df..000000000 Binary files a/Assets/Female3DCG/Eyes/ShylyHappy/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes1.png b/Assets/Female3DCG/Eyes/Surprised/Eyes1.png deleted file mode 100644 index a0bf8777e..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes10.png b/Assets/Female3DCG/Eyes/Surprised/Eyes10.png deleted file mode 100644 index f161c00b4..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes11.png b/Assets/Female3DCG/Eyes/Surprised/Eyes11.png deleted file mode 100644 index 4d04281eb..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes12.png b/Assets/Female3DCG/Eyes/Surprised/Eyes12.png deleted file mode 100644 index a449daccf..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes13.png b/Assets/Female3DCG/Eyes/Surprised/Eyes13.png deleted file mode 100644 index 62f479d4f..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes2.png b/Assets/Female3DCG/Eyes/Surprised/Eyes2.png deleted file mode 100644 index 423ff0a63..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes3.png b/Assets/Female3DCG/Eyes/Surprised/Eyes3.png deleted file mode 100644 index 76c700acf..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes4.png b/Assets/Female3DCG/Eyes/Surprised/Eyes4.png deleted file mode 100644 index 8221d7ed1..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes5.png b/Assets/Female3DCG/Eyes/Surprised/Eyes5.png deleted file mode 100644 index 2c781f847..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes6.png b/Assets/Female3DCG/Eyes/Surprised/Eyes6.png deleted file mode 100644 index b97f8ecb5..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes7.png b/Assets/Female3DCG/Eyes/Surprised/Eyes7.png deleted file mode 100644 index d45debbc5..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes8.png b/Assets/Female3DCG/Eyes/Surprised/Eyes8.png deleted file mode 100644 index 1f210aada..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Eyes9.png b/Assets/Female3DCG/Eyes/Surprised/Eyes9.png deleted file mode 100644 index e17bb75e9..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/Surprised/Icon.png b/Assets/Female3DCG/Eyes/Surprised/Icon.png deleted file mode 100644 index 4d3ecca95..000000000 Binary files a/Assets/Female3DCG/Eyes/Surprised/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes1.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes1.png deleted file mode 100644 index d58ec2bc1..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes10.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes10.png deleted file mode 100644 index d560e5db4..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes11.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes11.png deleted file mode 100644 index f25fa24ce..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes12.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes12.png deleted file mode 100644 index 672e47d20..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes13.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes13.png deleted file mode 100644 index 3584452c4..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes2.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes2.png deleted file mode 100644 index de8345036..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes3.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes3.png deleted file mode 100644 index 84449b2bf..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes4.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes4.png deleted file mode 100644 index 6ef3e991f..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes5.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes5.png deleted file mode 100644 index 77a52e49f..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes6.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes6.png deleted file mode 100644 index cf6353ce1..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes7.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes7.png deleted file mode 100644 index 1f71e6996..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes8.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes8.png deleted file mode 100644 index a9790091f..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Eyes9.png b/Assets/Female3DCG/Eyes/VeryLewd/Eyes9.png deleted file mode 100644 index 2e283d550..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes/VeryLewd/Icon.png b/Assets/Female3DCG/Eyes/VeryLewd/Icon.png deleted file mode 100644 index dd5fa4f77..000000000 Binary files a/Assets/Female3DCG/Eyes/VeryLewd/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes1.png b/Assets/Female3DCG/Eyes2/Angry/Eyes1.png deleted file mode 100644 index d4bbe336d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes10.png b/Assets/Female3DCG/Eyes2/Angry/Eyes10.png deleted file mode 100644 index c4ff4acba..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes11.png b/Assets/Female3DCG/Eyes2/Angry/Eyes11.png deleted file mode 100644 index a8a102ac6..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes12.png b/Assets/Female3DCG/Eyes2/Angry/Eyes12.png deleted file mode 100644 index 68703d74b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes13.png b/Assets/Female3DCG/Eyes2/Angry/Eyes13.png deleted file mode 100644 index f83758833..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes2.png b/Assets/Female3DCG/Eyes2/Angry/Eyes2.png deleted file mode 100644 index 214042ae0..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes3.png b/Assets/Female3DCG/Eyes2/Angry/Eyes3.png deleted file mode 100644 index 3cd2aa39f..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes4.png b/Assets/Female3DCG/Eyes2/Angry/Eyes4.png deleted file mode 100644 index 5ec00a503..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes5.png b/Assets/Female3DCG/Eyes2/Angry/Eyes5.png deleted file mode 100644 index 3b24f56bd..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes6.png b/Assets/Female3DCG/Eyes2/Angry/Eyes6.png deleted file mode 100644 index d3eb62f9c..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes7.png b/Assets/Female3DCG/Eyes2/Angry/Eyes7.png deleted file mode 100644 index d47c14902..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes8.png b/Assets/Female3DCG/Eyes2/Angry/Eyes8.png deleted file mode 100644 index 59d66386b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Eyes9.png b/Assets/Female3DCG/Eyes2/Angry/Eyes9.png deleted file mode 100644 index 19235b364..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Angry/Icon.png b/Assets/Female3DCG/Eyes2/Angry/Icon.png deleted file mode 100644 index 23dd83a61..000000000 Binary files a/Assets/Female3DCG/Eyes2/Angry/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes1.png b/Assets/Female3DCG/Eyes2/Closed/Eyes1.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes10.png b/Assets/Female3DCG/Eyes2/Closed/Eyes10.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes11.png b/Assets/Female3DCG/Eyes2/Closed/Eyes11.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes12.png b/Assets/Female3DCG/Eyes2/Closed/Eyes12.png deleted file mode 100644 index 9ba69c921..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes13.png b/Assets/Female3DCG/Eyes2/Closed/Eyes13.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes2.png b/Assets/Female3DCG/Eyes2/Closed/Eyes2.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes3.png b/Assets/Female3DCG/Eyes2/Closed/Eyes3.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes4.png b/Assets/Female3DCG/Eyes2/Closed/Eyes4.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes5.png b/Assets/Female3DCG/Eyes2/Closed/Eyes5.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes6.png b/Assets/Female3DCG/Eyes2/Closed/Eyes6.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes7.png b/Assets/Female3DCG/Eyes2/Closed/Eyes7.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes8.png b/Assets/Female3DCG/Eyes2/Closed/Eyes8.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Eyes9.png b/Assets/Female3DCG/Eyes2/Closed/Eyes9.png deleted file mode 100644 index 4955be5cb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Closed/Icon.png b/Assets/Female3DCG/Eyes2/Closed/Icon.png deleted file mode 100644 index 753a7d6c0..000000000 Binary files a/Assets/Female3DCG/Eyes2/Closed/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes1.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes1.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes10.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes10.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes11.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes11.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes12.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes12.png deleted file mode 100644 index a9ad6292e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes13.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes13.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes2.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes2.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes3.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes3.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes4.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes4.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes5.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes5.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes6.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes6.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes7.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes7.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes8.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes8.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Eyes9.png b/Assets/Female3DCG/Eyes2/Daydream/Eyes9.png deleted file mode 100644 index dadf9614b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Daydream/Icon.png b/Assets/Female3DCG/Eyes2/Daydream/Icon.png deleted file mode 100644 index 759d83291..000000000 Binary files a/Assets/Female3DCG/Eyes2/Daydream/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes1.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes1.png deleted file mode 100644 index 510cd5b93..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes10.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes10.png deleted file mode 100644 index e78348325..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes11.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes11.png deleted file mode 100644 index fcf686f1b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes12.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes12.png deleted file mode 100644 index dda50f6e3..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes13.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes13.png deleted file mode 100644 index dd49d9f3f..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes2.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes2.png deleted file mode 100644 index d8258db37..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes3.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes3.png deleted file mode 100644 index dd4aa0fd1..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes4.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes4.png deleted file mode 100644 index ea81d8cea..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes5.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes5.png deleted file mode 100644 index 8b71d849c..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes6.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes6.png deleted file mode 100644 index 405d62a04..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes7.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes7.png deleted file mode 100644 index d460f95a3..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes8.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes8.png deleted file mode 100644 index 2adfa9838..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Eyes9.png b/Assets/Female3DCG/Eyes2/Dazed/Eyes9.png deleted file mode 100644 index b0d116497..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/EyesDazedLids.png b/Assets/Female3DCG/Eyes2/Dazed/EyesDazedLids.png deleted file mode 100644 index f605dcd21..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/EyesDazedLids.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dazed/Icon.png b/Assets/Female3DCG/Eyes2/Dazed/Icon.png deleted file mode 100644 index 87c39d644..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dazed/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes1.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes1.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes10.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes10.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes11.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes11.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes12.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes12.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes13.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes13.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes2.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes2.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes3.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes3.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes4.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes4.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes5.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes5.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes6.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes6.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes7.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes7.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes8.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes8.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Eyes9.png b/Assets/Female3DCG/Eyes2/Dizzy/Eyes9.png deleted file mode 100644 index 26db1b13d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Dizzy/Icon.png b/Assets/Female3DCG/Eyes2/Dizzy/Icon.png deleted file mode 100644 index f83e7a3ce..000000000 Binary files a/Assets/Female3DCG/Eyes2/Dizzy/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes1.png b/Assets/Female3DCG/Eyes2/Eyes1.png deleted file mode 100644 index f0a80f7a0..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes10.png b/Assets/Female3DCG/Eyes2/Eyes10.png deleted file mode 100644 index c3bee4cc3..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes11.png b/Assets/Female3DCG/Eyes2/Eyes11.png deleted file mode 100644 index f407026dc..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes12.png b/Assets/Female3DCG/Eyes2/Eyes12.png deleted file mode 100644 index 4eb605a75..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes13.png b/Assets/Female3DCG/Eyes2/Eyes13.png deleted file mode 100644 index 87bcd917d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes2.png b/Assets/Female3DCG/Eyes2/Eyes2.png deleted file mode 100644 index a026cedca..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes3.png b/Assets/Female3DCG/Eyes2/Eyes3.png deleted file mode 100644 index e86a91943..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes4.png b/Assets/Female3DCG/Eyes2/Eyes4.png deleted file mode 100644 index 592aa3fd3..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes5.png b/Assets/Female3DCG/Eyes2/Eyes5.png deleted file mode 100644 index cfd6b52a1..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes6.png b/Assets/Female3DCG/Eyes2/Eyes6.png deleted file mode 100644 index 0a1802641..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes7.png b/Assets/Female3DCG/Eyes2/Eyes7.png deleted file mode 100644 index 557c85f46..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes8.png b/Assets/Female3DCG/Eyes2/Eyes8.png deleted file mode 100644 index e99558655..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Eyes9.png b/Assets/Female3DCG/Eyes2/Eyes9.png deleted file mode 100644 index eb86cefdd..000000000 Binary files a/Assets/Female3DCG/Eyes2/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes1.png b/Assets/Female3DCG/Eyes2/Heart/Eyes1.png deleted file mode 100644 index 06ae2689e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes10.png b/Assets/Female3DCG/Eyes2/Heart/Eyes10.png deleted file mode 100644 index 06ae2689e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes11.png b/Assets/Female3DCG/Eyes2/Heart/Eyes11.png deleted file mode 100644 index 06ae2689e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes12.png b/Assets/Female3DCG/Eyes2/Heart/Eyes12.png deleted file mode 100644 index 3817bbe9d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes13.png b/Assets/Female3DCG/Eyes2/Heart/Eyes13.png deleted file mode 100644 index f2e4af97a..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes2.png b/Assets/Female3DCG/Eyes2/Heart/Eyes2.png deleted file mode 100644 index 06ae2689e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes3.png b/Assets/Female3DCG/Eyes2/Heart/Eyes3.png deleted file mode 100644 index 06ae2689e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes4.png b/Assets/Female3DCG/Eyes2/Heart/Eyes4.png deleted file mode 100644 index 06ae2689e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes5.png b/Assets/Female3DCG/Eyes2/Heart/Eyes5.png deleted file mode 100644 index 06ae2689e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes6.png b/Assets/Female3DCG/Eyes2/Heart/Eyes6.png deleted file mode 100644 index 06ae2689e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes7.png b/Assets/Female3DCG/Eyes2/Heart/Eyes7.png deleted file mode 100644 index 06ae2689e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes8.png b/Assets/Female3DCG/Eyes2/Heart/Eyes8.png deleted file mode 100644 index 06ae2689e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Eyes9.png b/Assets/Female3DCG/Eyes2/Heart/Eyes9.png deleted file mode 100644 index 06ae2689e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Heart/Icon.png b/Assets/Female3DCG/Eyes2/Heart/Icon.png deleted file mode 100644 index 2b11947fe..000000000 Binary files a/Assets/Female3DCG/Eyes2/Heart/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes1.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes1.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes10.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes10.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes11.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes11.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes12.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes12.png deleted file mode 100644 index beec985da..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes13.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes13.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes2.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes2.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes3.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes3.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes4.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes4.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes5.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes5.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes6.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes6.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes7.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes7.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes8.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes8.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Eyes9.png b/Assets/Female3DCG/Eyes2/HeartPink/Eyes9.png deleted file mode 100644 index 358cf0619..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/HeartPink/Icon.png b/Assets/Female3DCG/Eyes2/HeartPink/Icon.png deleted file mode 100644 index 7f13dd0c0..000000000 Binary files a/Assets/Female3DCG/Eyes2/HeartPink/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes1.png b/Assets/Female3DCG/Eyes2/Horny/Eyes1.png deleted file mode 100644 index cd965b16b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes10.png b/Assets/Female3DCG/Eyes2/Horny/Eyes10.png deleted file mode 100644 index 1a194d4a1..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes11.png b/Assets/Female3DCG/Eyes2/Horny/Eyes11.png deleted file mode 100644 index a011f8b3b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes12.png b/Assets/Female3DCG/Eyes2/Horny/Eyes12.png deleted file mode 100644 index 91f74d97e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes13.png b/Assets/Female3DCG/Eyes2/Horny/Eyes13.png deleted file mode 100644 index 2fc713284..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes2.png b/Assets/Female3DCG/Eyes2/Horny/Eyes2.png deleted file mode 100644 index 7d6a9dd07..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes3.png b/Assets/Female3DCG/Eyes2/Horny/Eyes3.png deleted file mode 100644 index 31e8d8ff5..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes4.png b/Assets/Female3DCG/Eyes2/Horny/Eyes4.png deleted file mode 100644 index 134ccff6d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes5.png b/Assets/Female3DCG/Eyes2/Horny/Eyes5.png deleted file mode 100644 index 3f766313b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes6.png b/Assets/Female3DCG/Eyes2/Horny/Eyes6.png deleted file mode 100644 index ab22ed91a..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes7.png b/Assets/Female3DCG/Eyes2/Horny/Eyes7.png deleted file mode 100644 index 7956c4941..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes8.png b/Assets/Female3DCG/Eyes2/Horny/Eyes8.png deleted file mode 100644 index 7b4e98d6d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Eyes9.png b/Assets/Female3DCG/Eyes2/Horny/Eyes9.png deleted file mode 100644 index 44face602..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Horny/Icon.png b/Assets/Female3DCG/Eyes2/Horny/Icon.png deleted file mode 100644 index bde7bfb57..000000000 Binary files a/Assets/Female3DCG/Eyes2/Horny/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Icon.png b/Assets/Female3DCG/Eyes2/Icon.png deleted file mode 100644 index 03e2700c0..000000000 Binary files a/Assets/Female3DCG/Eyes2/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes1.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes1.png deleted file mode 100644 index fa8c96096..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes10.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes10.png deleted file mode 100644 index 7be3d972c..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes11.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes11.png deleted file mode 100644 index c0178434a..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes12.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes12.png deleted file mode 100644 index eadf17df9..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes13.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes13.png deleted file mode 100644 index decdddb52..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes2.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes2.png deleted file mode 100644 index a33bb1a74..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes3.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes3.png deleted file mode 100644 index f85bd88ef..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes4.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes4.png deleted file mode 100644 index 98ab5b000..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes5.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes5.png deleted file mode 100644 index 4a48bbc0f..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes6.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes6.png deleted file mode 100644 index a4ae0b9d5..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes7.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes7.png deleted file mode 100644 index 3a19d71f3..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes8.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes8.png deleted file mode 100644 index 709c8c4c1..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Eyes9.png b/Assets/Female3DCG/Eyes2/Lewd/Eyes9.png deleted file mode 100644 index a015bc61b..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Lewd/Icon.png b/Assets/Female3DCG/Eyes2/Lewd/Icon.png deleted file mode 100644 index 1e80eb68d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Lewd/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes1.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes1.png deleted file mode 100644 index f6868ac5a..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes10.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes10.png deleted file mode 100644 index f6868ac5a..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes11.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes11.png deleted file mode 100644 index f6868ac5a..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes12.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes12.png deleted file mode 100644 index 9a6168066..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes13.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes13.png deleted file mode 100644 index fd6cfcca3..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes2.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes2.png deleted file mode 100644 index f6868ac5a..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes3.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes3.png deleted file mode 100644 index f6868ac5a..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes4.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes4.png deleted file mode 100644 index f6868ac5a..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes5.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes5.png deleted file mode 100644 index f6868ac5a..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes6.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes6.png deleted file mode 100644 index f6868ac5a..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes7.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes7.png deleted file mode 100644 index f6868ac5a..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes8.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes8.png deleted file mode 100644 index f6868ac5a..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes9.png b/Assets/Female3DCG/Eyes2/LewdHeart/Eyes9.png deleted file mode 100644 index f6868ac5a..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeart/Icon.png b/Assets/Female3DCG/Eyes2/LewdHeart/Icon.png deleted file mode 100644 index 64d411c22..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeart/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes1.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes1.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes10.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes10.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes11.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes11.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes12.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes12.png deleted file mode 100644 index 22c55c4bf..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes13.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes13.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes2.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes2.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes3.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes3.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes4.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes4.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes5.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes5.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes6.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes6.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes7.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes7.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes8.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes8.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes9.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes9.png deleted file mode 100644 index 86ac6f6bb..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/LewdHeartPink/Icon.png b/Assets/Female3DCG/Eyes2/LewdHeartPink/Icon.png deleted file mode 100644 index 6274644ed..000000000 Binary files a/Assets/Female3DCG/Eyes2/LewdHeartPink/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes1.png b/Assets/Female3DCG/Eyes2/Sad/Eyes1.png deleted file mode 100644 index fcae3f21e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes10.png b/Assets/Female3DCG/Eyes2/Sad/Eyes10.png deleted file mode 100644 index 9453099b3..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes11.png b/Assets/Female3DCG/Eyes2/Sad/Eyes11.png deleted file mode 100644 index bf6736171..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes12.png b/Assets/Female3DCG/Eyes2/Sad/Eyes12.png deleted file mode 100644 index e006e6f03..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes13.png b/Assets/Female3DCG/Eyes2/Sad/Eyes13.png deleted file mode 100644 index 31f40ca6f..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes2.png b/Assets/Female3DCG/Eyes2/Sad/Eyes2.png deleted file mode 100644 index 15836f29f..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes3.png b/Assets/Female3DCG/Eyes2/Sad/Eyes3.png deleted file mode 100644 index 9dd6c17fe..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes4.png b/Assets/Female3DCG/Eyes2/Sad/Eyes4.png deleted file mode 100644 index 6fa2bcae4..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes5.png b/Assets/Female3DCG/Eyes2/Sad/Eyes5.png deleted file mode 100644 index c3cbf25b1..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes6.png b/Assets/Female3DCG/Eyes2/Sad/Eyes6.png deleted file mode 100644 index 748676ca6..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes7.png b/Assets/Female3DCG/Eyes2/Sad/Eyes7.png deleted file mode 100644 index 2eda34eb1..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes8.png b/Assets/Female3DCG/Eyes2/Sad/Eyes8.png deleted file mode 100644 index 1e92eafec..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Eyes9.png b/Assets/Female3DCG/Eyes2/Sad/Eyes9.png deleted file mode 100644 index 682f05cfb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Sad/Icon.png b/Assets/Female3DCG/Eyes2/Sad/Icon.png deleted file mode 100644 index d051a6489..000000000 Binary files a/Assets/Female3DCG/Eyes2/Sad/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes1.png b/Assets/Female3DCG/Eyes2/Scared/Eyes1.png deleted file mode 100644 index baef809e6..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes10.png b/Assets/Female3DCG/Eyes2/Scared/Eyes10.png deleted file mode 100644 index 7cce27522..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes11.png b/Assets/Female3DCG/Eyes2/Scared/Eyes11.png deleted file mode 100644 index fb66a814e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes12.png b/Assets/Female3DCG/Eyes2/Scared/Eyes12.png deleted file mode 100644 index 325e34390..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes13.png b/Assets/Female3DCG/Eyes2/Scared/Eyes13.png deleted file mode 100644 index 3028b7868..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes2.png b/Assets/Female3DCG/Eyes2/Scared/Eyes2.png deleted file mode 100644 index 6aea0258d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes3.png b/Assets/Female3DCG/Eyes2/Scared/Eyes3.png deleted file mode 100644 index c0b4a8ad9..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes4.png b/Assets/Female3DCG/Eyes2/Scared/Eyes4.png deleted file mode 100644 index ddc2bf40d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes5.png b/Assets/Female3DCG/Eyes2/Scared/Eyes5.png deleted file mode 100644 index 664f75f95..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes6.png b/Assets/Female3DCG/Eyes2/Scared/Eyes6.png deleted file mode 100644 index a0ec7be37..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes7.png b/Assets/Female3DCG/Eyes2/Scared/Eyes7.png deleted file mode 100644 index e2d7ae59c..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes8.png b/Assets/Female3DCG/Eyes2/Scared/Eyes8.png deleted file mode 100644 index 6c280aa89..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Eyes9.png b/Assets/Female3DCG/Eyes2/Scared/Eyes9.png deleted file mode 100644 index 32cd5ca63..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Scared/Icon.png b/Assets/Female3DCG/Eyes2/Scared/Icon.png deleted file mode 100644 index 65d48a450..000000000 Binary files a/Assets/Female3DCG/Eyes2/Scared/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes1.png b/Assets/Female3DCG/Eyes2/Shy/Eyes1.png deleted file mode 100644 index ea56a5292..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes10.png b/Assets/Female3DCG/Eyes2/Shy/Eyes10.png deleted file mode 100644 index 6ce31ed4f..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes11.png b/Assets/Female3DCG/Eyes2/Shy/Eyes11.png deleted file mode 100644 index a8e5894b0..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes12.png b/Assets/Female3DCG/Eyes2/Shy/Eyes12.png deleted file mode 100644 index f1e243200..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes13.png b/Assets/Female3DCG/Eyes2/Shy/Eyes13.png deleted file mode 100644 index e1be82b70..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes2.png b/Assets/Female3DCG/Eyes2/Shy/Eyes2.png deleted file mode 100644 index 4e775e288..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes3.png b/Assets/Female3DCG/Eyes2/Shy/Eyes3.png deleted file mode 100644 index bbb1e7794..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes4.png b/Assets/Female3DCG/Eyes2/Shy/Eyes4.png deleted file mode 100644 index bc7042f8a..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes5.png b/Assets/Female3DCG/Eyes2/Shy/Eyes5.png deleted file mode 100644 index 7fa04538e..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes6.png b/Assets/Female3DCG/Eyes2/Shy/Eyes6.png deleted file mode 100644 index 5128d4ca8..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes7.png b/Assets/Female3DCG/Eyes2/Shy/Eyes7.png deleted file mode 100644 index ab3aa6de3..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes8.png b/Assets/Female3DCG/Eyes2/Shy/Eyes8.png deleted file mode 100644 index 35abf5137..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Eyes9.png b/Assets/Female3DCG/Eyes2/Shy/Eyes9.png deleted file mode 100644 index 6662d7360..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Shy/Icon.png b/Assets/Female3DCG/Eyes2/Shy/Icon.png deleted file mode 100644 index d17f0bdfb..000000000 Binary files a/Assets/Female3DCG/Eyes2/Shy/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes1.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes1.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes10.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes10.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes11.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes11.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes12.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes12.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes13.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes13.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes2.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes2.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes3.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes3.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes4.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes4.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes5.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes5.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes6.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes6.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes7.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes7.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes8.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes8.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes9.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes9.png deleted file mode 100644 index 1f7f45d69..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/ShylyHappy/Icon.png b/Assets/Female3DCG/Eyes2/ShylyHappy/Icon.png deleted file mode 100644 index add00c7df..000000000 Binary files a/Assets/Female3DCG/Eyes2/ShylyHappy/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes1.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes1.png deleted file mode 100644 index 22d76f4b8..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes10.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes10.png deleted file mode 100644 index 575e87744..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes11.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes11.png deleted file mode 100644 index 46063695f..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes12.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes12.png deleted file mode 100644 index 94a833e5f..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes13.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes13.png deleted file mode 100644 index 8e455bc9c..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes2.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes2.png deleted file mode 100644 index dc658f251..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes3.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes3.png deleted file mode 100644 index 4b14afc80..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes4.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes4.png deleted file mode 100644 index fa6a9015c..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes5.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes5.png deleted file mode 100644 index 294e7f7e2..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes6.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes6.png deleted file mode 100644 index 092bee231..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes7.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes7.png deleted file mode 100644 index 102bc0f86..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes8.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes8.png deleted file mode 100644 index 03ed9b07d..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Eyes9.png b/Assets/Female3DCG/Eyes2/Surprised/Eyes9.png deleted file mode 100644 index 2492dab31..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/Surprised/Icon.png b/Assets/Female3DCG/Eyes2/Surprised/Icon.png deleted file mode 100644 index 4d3ecca95..000000000 Binary files a/Assets/Female3DCG/Eyes2/Surprised/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes1.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes1.png deleted file mode 100644 index 50e30235d..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes10.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes10.png deleted file mode 100644 index 2fe851f6c..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes10.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes11.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes11.png deleted file mode 100644 index 1e00234c4..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes11.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes12.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes12.png deleted file mode 100644 index 3d00be912..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes12.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes13.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes13.png deleted file mode 100644 index f9e5a755f..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes13.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes2.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes2.png deleted file mode 100644 index 43aca8e8f..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes3.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes3.png deleted file mode 100644 index 577c1779c..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes4.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes4.png deleted file mode 100644 index 23fc5718d..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes5.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes5.png deleted file mode 100644 index a606a8afe..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes6.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes6.png deleted file mode 100644 index 2d29c7a85..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes6.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes7.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes7.png deleted file mode 100644 index 8da41867e..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes7.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes8.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes8.png deleted file mode 100644 index 3189d914b..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes8.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes9.png b/Assets/Female3DCG/Eyes2/VeryLewd/Eyes9.png deleted file mode 100644 index 1f28ca5bd..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Eyes9.png and /dev/null differ diff --git a/Assets/Female3DCG/Eyes2/VeryLewd/Icon.png b/Assets/Female3DCG/Eyes2/VeryLewd/Icon.png deleted file mode 100644 index dd5fa4f77..000000000 Binary files a/Assets/Female3DCG/Eyes2/VeryLewd/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Female3DCG.csv b/Assets/Female3DCG/Female3DCG.csv deleted file mode 100644 index 4e51549b9..000000000 --- a/Assets/Female3DCG/Female3DCG.csv +++ /dev/null @@ -1,1549 +0,0 @@ -Cloth,,Cloth -Cloth,CollegeOutfit1,College -Cloth,MaidOutfit1,Maid -Cloth,MaidOutfit2,Maid Exposed -Cloth,StudentOutfit1,Student Black -Cloth,StudentOutfit2,Student Bow -Cloth,StudentOutfit3,Student Top -Cloth,BabydollDress1,Babydoll Dress -Cloth,TeacherOutfit1,Teacher -Cloth,ChineseDress1,Chinese Dress -Cloth,ChineseDress2,Chinese Long -Cloth,TShirt1,T-Shirt -Cloth,TShirt2,Classic T-Shirt -Cloth,TennisShirt1,Tennis -Cloth,Sweater1,Sweater -Cloth,MistressTop,Mistress Top -Cloth,AdultBabyDress1,Puffy Dress -Cloth,AdultBabyDress2,Bows Dress -Cloth,AdultBabyDress3,Summer flower dress -Cloth,AdultBabyDress4,Shiny dress -Cloth,NurseUniform,Nurse Uniform -Cloth,Robe1,Robe -Cloth,SuspenderTop1,Suspender Top -Cloth,LeatherCorsetTop1,Leather Corset Top -Cloth,FlowerDress,Flower Dress -Cloth,Dress2,Nomadic Dress -Cloth,LaceBabydoll,Lace Babydoll -Cloth,SleevelessTop,Sleeveless Top -Cloth,DressFur,Dress with Fur -Cloth,BodyTowel1,Towel -Cloth,Yukata1,Yukata -Cloth,SteampunkCorsetTop1,Steampunk Corset -Cloth,BondageDress1,Bondage Dress Style 1 -Cloth,BondageDress2,Bondage Dress Style 2 -Cloth,ShoulderlessTop,Shoulderless Top -Cloth,Dress3,Long Dress -Cloth,ComfyTop,Sleep Top -Cloth,WeddingDress1,Wedding Dress -Cloth,WeddingDress2,Shoulderless Wedding Dress -Cloth,BridesmaidDress1,Bridesmaid Dress -Cloth,Gown1,Puffball Gown -Cloth,Gown2Top,Hobble Gown -Cloth,Gown3,Shiny Gown -Cloth,MaidApron1,Maid Apron -Cloth,MaidApron2,Exposed Maid Apron -Cloth,AdmiralTop,Admiral Top -Cloth,VirginKiller1,Virgin Killer -Cloth,ReverseBunnySuit,Reverse Bunny Suit Top -Cloth,LeatherCropTop, Leather Crop Top -Cloth,CorsetShirt,Corset Shirt -Cloth,BondageBustier1,Bondage Bustier 1 -Cloth,BondageBustier2,Bondage Bustier 2 -Cloth,LeatherBolero,Leather Bolero -Cloth,Bodice1,Bodice -Cloth,SummerDress,Summer Dress -Cloth,GrandMage,Grand Mage Dress -Cloth,Blouse1,Blouse -Cloth,LatexTop,Laced Latex Top -Cloth,LatexLacedSuit,Latex Laced Suit -Cloth,FurCoat,Fur Coat -Cloth,FuzzyDress,Fuzzy Dress -Cloth,CropTop,Crop Top -Cloth,Laurel,Laurel Top -Cloth,SeethroughTop,See-through Top -Cloth,Jacket,Jacket -ClothAccessory,,Cloth Accessory -ClothAccessory,StudentOutfit3Scarf,Student Scarf -ClothAccessory,StudentOutfit3Bow1,Student Bow 1 -ClothAccessory,StudentOutfit3Bow2,Student Bow 2 -ClothAccessory,StudentOutfit3Bow3,Student Bow 3 -ClothAccessory,Bouquet,Bouquet of flowers -ClothAccessory,FrillyApron,Frilly Apron -ClothAccessory,BunnyCollarCuffs,Bunny Girl Accessories -ClothAccessory,Camera1,Camera -ClothAccessory,Cape,Cape -ClothAccessory,LeatherStraps,Leather Straps -ClothAccessory,FurBolero,Fur Bolero -ClothAccessory,FacePaint, Face Paint -ClothAccessory,Bib,Bib -ClothAccessory,Scarf,Scarf -ClothAccessory,Glitter,Glitter -ClothAccessory,CatsuitCollar,Catsuit Collar -ClothAccessory,Poncho,Poncho -Necklace,,Necklace -Necklace,Necklace1,Fancy Necklace -Necklace,Necklace2,Beaded Necklace -Necklace,Necklace3,Long Beaded Necklace -Necklace,Necklace4,Pearl Necklace -Necklace,NecklaceLock,Lock Necklace -Necklace,NecklaceKey,Key Necklace -Necklace,IDCard,ID Card -Necklace,BlackHeart,Black Heart -Necklace,NecklaceBallGag,Ball Gag -Necklace,ElegantHeartNecklace,Elegant Heart Necklace -Necklace,Bandana,Bandana -Necklace,FurScarf,Fur Scarf -Necklace,FlowerGarland,Flower Garland -Necklace,NecklaceRope,Rope Necklace -Necklace,ChokerTattoo,Tattoo Choker -Necklace,CatsuitCollar,Catsuit Collar -Necklace,BodyChainNecklace,Body Chain Necklace -Suit,,Upper Suit -Suit,Catsuit,Catsuit -Suit,SeamlessCatsuit, Seamless Catsuit -Suit,SleevelessCatsuit, Sleeveless Catsuit -Suit,PilotSuit,Pilot Suit -Suit,SeethroughSuit,See-through Suit -Suit,SeethroughSuitZip,See-through Zipsuit -Suit,ReverseBunnySuit,Reverse Bunny Suit -Suit,Blouse1,Blouse -Suit,SleevelessSlimLatexLeotard,Slim Latex Leotard (Sleeveless) -ClothLower,,Bottom -ClothLower,Skirt1,Skirt -ClothLower,Skirt2,Student Skirt -ClothLower,Skirt3,Student Skirt Short -ClothLower,TennisSkirt1,Tennis -ClothLower,Jeans1,Jeans -ClothLower,Shorts1,Shorts -ClothLower,Pajama1,Pajama -ClothLower,MistressBottom,Mistress Bottom -ClothLower,Waspie1,Bondage Waspie -ClothLower,Waspie2,Royal Waspie -ClothLower,Waspie3,Straps Waspie -ClothLower,LatexPants1,Latex Pants -ClothLower,LatexSkirt1,Latex Skirt -ClothLower,LatexSkirt2,Long Latex Skirt -ClothLower,Tutu,Tutu -ClothLower,HulaSkirt,Hula Skirt -ClothLower,ClothSkirt1,Patterned Skirt -ClothLower,Jeans2,Ripped Jeans -ClothLower,ChineseSkirt1,Chinese Skirt -ClothLower,Gown2Skirt,Hobble Gown Skirt -ClothLower,AdmiralSkirt,Admiral Skirt -ClothLower,JeanSkirt,Jean Skirt -ClothLower,PencilSkirt,Pencil Skirt -ClothLower,JeansShorts,Jeans Shorts -ClothLower,Leggings1,Short Leggings -ClothLower,Leggings2,Long Leggings -ClothLower,PleatedSkirt,Pleated Skirt -ClothLower,MageSkirt,Witch's Skirt -ClothLower,LongSkirt1,Long Skirt -ClothLower,ShortPencilSkirt,Short Pencil Skirt -ClothLower,HaremPants,Harem Pants -ClothLower,HaremPants2,Harem Pants 2 -ClothLower,ShortPlaidSkirt,Short Plaid Skirt -ClothLower,CollegeSkirt,College Skirt -ClothLower,BondageSkirt,Bondage Skirt -ClothLower,AsymmetricSkirt,Asymmetric Skirt -ClothLower,ElegantSkirt,Elegant Skirt -ClothLower,RuffledSkirt,Ruffled Skirt -SuitLower,,Suit Lower -SuitLower,Catsuit,Catsuit -SuitLower,SeamlessCatsuit, Seamless Catsuit -SuitLower,CatsuitPanties, Catsuit Panties -SuitLower,PilotSuit,Pilot Suit -SuitLower,PilotPanties,Pilot Suit Panties -SuitLower,SeethroughSuit,See-through Suit -SuitLower,SeethroughSuitZip,See-through Zipsuit -SuitLower,ReverseBunnySuit,Reverse Bunny Suit -SuitLower,Pantyhose1,Pantyhose -SuitLower,Pantyhose2,Crotchless Pantyhose -SuitLower,Stockings1,Stockings Dark -SuitLower,Stockings2,Stockings Light -SuitLower,Stockings3,Silky Stockings -SuitLower,Stockings4,Fishnet Stockings -Bra,,Bra -Bra,Bra1,Style 1 -Bra,Bra2,Style 2 -Bra,Bra7,Style 3 -Bra,Bra8,Lace and Satin -Bra,Bra9,Strapless -Bra,Bandeau1,Bandeau -Bra,Bustier1,Satin Bustier -Bra,Bikini1,Frilled Bikini -Bra,MaidBra1,Maid Bra -Bra,SexyBikini1,Demonique Bikini -Bra,SexyBikini2,Micro Bikini -Bra,SexyBikini3,One Piece Swimsuit -Bra,Swimsuit1,Swimsuit style 1 -Bra,Swimsuit2,Swimsuit style 2 -Bra,BunnySuit,Bunny Girl Bodysuit -Bra,LatexBunnySuit,Latex Bunny Girl Bodysuit -Bra,FrameBra1,Frame Bra Style 1 -Bra,FrameBra2,Frame Bra Style 2 -Bra,BondageBra1,Bondage Bra -Bra,LatexBra1,Latex Bra -Bra,HarnessBra1,Bondage Harness -Bra,HarnessBra2,Leather Strap Harness -Bra,CuteBikini1,Cute Bikini -Bra,CorsetBikini1,Corset Bikini -Bra,OuvertPerl1,Ouvert Perl -Bra,Sarashi1,Sarashi -Bra,KittyBra1,Kitty Bra -Bra,FishnetBikini1,Fishnet Bikini -Bra,SexyBeachBra1,Sexy Beach Bra -Bra,SexyBikiniBra1,Micro Bikini Top -Bra,StarHarnessBra,Star Harness -Bra,HeartTop,Heart Top -Bra,ChineseBra1,Chinese Bra -Bra,LeatherStrapBra1,Leather Strap Bra -Bra,Swimsuit3,Swimsuit style 3 -Bra,ClamShell,Clamshell Bra -Bra,CowPrintedBra,Cow Printed Bra -Bra,StuddedHarness,Studded Harness -Bra,Camisole,Camisole -Bra,Ribbons,Ribbons -Bra,LeatherBreastBinder,Leather Breast Binder -Bra,SilkStraps,Silk Straps -Bra,FullLatexBra,Full Latex Bra -Bra,FullLatexBra2,Full Latex Bra (Bright) -Bra,HaremBra,Harem Bra -Bra,FlowerBra,Flower Bra -Bra,Bra10,Style 4 -Bra,CoconutBra,Coconut Bra -Bra,SleevelessSlimLatexLeotard,Slim Latex Leotard (Sleeveless) -Corset,,Corset -Corset,Corset1,Corset + Garters -Corset,Corset2,Corset -Corset,Corset3,Half Cup Corset -Corset,Corset4,Under Bust Corset -Corset,Corset5,Floral Corset -Corset,LatexCorset1,Latex Corset -Corset,LeatherCorsetTop1,Leather Corset Top -Corset,Corset6,Noble Corset -Corset,SteampunkCorsetTop1,Steampunk Corset -Panties,,Panties -Panties,Panties1,Style 1 -Panties,Panties7,Style 2 -Panties,Panties8,Style 3 -Panties,Panties11,Style 4 -Panties,Panties12,String Bikini -Panties,Panties13,Satin Bikini -Panties,Panties14,High Cut -Panties,Panties15,Thong -Panties,Bikini1,Frilled Bikini -Panties,Diapers1,Diaper -Panties,Diapers2,Plastic Covered Diaper -Panties,Diapers3,Satin Covered Diaper -Panties,Diapers4,Patterned Diaper -Panties,Panties16,Frill Panties -Panties,MaidPanties1,Latex Maid Panties -Panties,MaidPanties2,Maid Panties -Panties,LatexPanties1,Crotchless Latex Panties -Panties,WrapPanties1,Wrap Panties -Panties,CrotchPanties1,Crotchless Briefs -Panties,LatexCrotchlessPanties,Crotchless Latex Panties 2 -Panties,RedBowPanties,Bow Panties -Panties,StringPanties1,G-String Panties -Panties,StringPasty1,G-String Pasty -Panties,ZipPanties1,Zip-String Panties -Panties,HarnessPanties1,Bondage Harness -Panties,HarnessPanties2,Full Bondage Harness -Panties,KittyPanties1,Kitty Panties -Panties,PearlPanties1,Pearl String -Panties,SunstripePanties1,Sunstripe Panties -Panties,SexyBeachPanties1,Sexy Beach Panties -Panties,ChinesePanties1,Chinese Panties -Panties,LeatherStrapPanties1,Leather Strap Panties -Panties,CowPrintedPanties,Cow Printed Panties -Panties,LatexPanties2,Latex Panties -Panties,PilotPanties,Pilot Panties -Panties,CatsuitPanties,Catsuit Panties -Panties,SilkStraps,Silk Straps -Panties,FlowerPanties,Flower Panties -Panties,FloralPanties2,Floral Panties 2 -Panties,BulkyDiaper,Bulky Diaper -Panties,PoofyDiaper,Poofy Diaper -Panties,Thong,Thong 2 -Panties,StringThong,String Thong -Panties,MicroThong,Micro Thong -Socks,,Socks -Socks,Socks0,Ankle -Socks,Socks1,Short -Socks,Socks2,Regular -Socks,Socks3,Middle Leg -Socks,Socks4,High Leg -Socks,Socks5,Full Leg -Socks,Stockings1,Stockings Dark -Socks,Stockings2,Stockings Light -Socks,Stockings3,Silky Stockings -Socks,Stockings4,Fishnet Stockings -Socks,Pantyhose1,Pantyhose -Socks,Socks6,Frill Socks -Socks,SocksFur,Socks with Fur -Socks,SocksStriped1,Striped Socks -Socks,LatexSocks1,Latex Socks -Socks,FootlessSocks1,Footless Socks -Socks,ReverseBunnySuit,Reverse Bunny Suit Stockings -Socks,LeatherSocks1,Short Leather Socks -Socks,Pantyhose2,Crotchless Pantyhose -Socks,CowPrintedSocks,Cow Printed Socks -Socks,HaremStockings,Harem Stockings -RightAnklet,,Anklet (Right) -RightAnklet,BandAnklet,Band Anklet -RightAnklet,Ribbon,Ribbon -RightAnklet,Ribbon1,Ribbon Bow -LeftAnklet,,Anklet (Left) -LeftAnklet,BandAnklet,Band Anklet -LeftAnklet,Ribbon,Ribbon -LeftAnklet,Ribbon1,Ribbon Bow -Garters,,Garters -Garters,GarterBelt,Leather Garter Belts -Garters,GarterBelt2,Leather Garter Belt -Garters,Tentacles,Tentacles -Shoes,,Shoes -Shoes,Shoes1,Style 1 -Shoes,Shoes2,Style 2 -Shoes,Shoes4,Style 3 -Shoes,Sneakers1,Sneakers Light -Shoes,Sneakers2,Sneakers Dark -Shoes,Heels1,Heels -Shoes,Heels2,Heels Strap -Shoes,Boots1,Boots -Shoes,MistressBoots,Mistress Boots -Shoes,PonyBoots,Pony Boots -Shoes,Sandals,Strap Sandals -Shoes,SandalsRS,Rhinestone Sandals -Shoes,PawBoots,Paw Boots -Shoes,WoollyBootsTall,Woolly Boots -Shoes,ThighHighLatexHeels,Latex Heels -Shoes,Heels3,Multi-Strap Heels -Shoes,BarefootSandals1,Barefoot Sandals -Shoes,LatexAnkleShoes, Latex Ankle Shoes -Shoes,Flippers,Flippers -Shoes,DeluxeBoots,Deluxe Mistress Boots -Shoes,AnkleStrapShoes,Ankle Strap Shoes -Shoes,Shoes5,Style 4 -Shoes,FuturisticHeels2,Futuristic Heels -Shoes,FuzzyBoots,Fuzzy Boots -Hat,,Hat -Hat,Band1,Hair Band -Hat,Band2,Jeweled Band -Hat,Beret1,Beret -Hat,MaidHairband1,Maid Hairband -Hat,NurseCap,Nurse Cap -Hat,Santa1,Santa Hat -Hat,CaptainHat1,Captain's Hat -Hat,BunnySuccubus2,Bunny Succubus -Hat,WitchHat1,Witch Hat -Hat,PirateBandana1,Pirate Bandana -Hat,Bandana,Bandana -Hat,PoliceWomanHat,Police Woman Hat -Hat,HeadTowel1,Towel -Hat,CollegeDunce,Dunce Hat -Hat,Tiara1,Tiara -Hat,Bonnet1,Bonnet Style 1 -Hat,Bonnet2,Bonnet Style 2 -Hat,Crown1,Crown Style 1 -Hat,Crown2,Crown Style 2 -Hat,Crown3,Crown Style 3 -Hat,Crown4,Crown Style 4 -Hat,Crown5,Crown Style 5 -Hat,SmallHat1,Stylish Small Hat -Hat,Veil1,Veil Half Face -Hat,Veil2,Veil Full Face -Hat,BakerBoyHat,Baker Boy Hat -Hat,ReindeerBand,Reindeer Hairband -Hat,FurHeadband,Fur Headband -Hat,FacePaint, Face Paint -Hat,RoseCrown,Rose Crown -Hat,FlowerCrown,Flower Crown -Hat,PoppyCrown,Poppy Crown -Hat,LatexHabit,Latex Habit -Hat,BallCapBack,Baseball Cap Back -Hat,BallCapFront,Baseball Cap Front -HairAccessory3,,Hair Accessory -HairAccessory3,Ribbons1,Hair Ribbon 1 -HairAccessory3,Ribbons2,Hair Ribbon 2 -HairAccessory3,Ribbons3,Hair Ribbon 3 -HairAccessory3,Ribbons4,Hair Ribbon 4 -HairAccessory3,GiantBow1,Giant Bow 1 -HairAccessory3,HairFlower1,Flower -HairAccessory3,WeddingVeil1,Wedding Veil -HairAccessory3,HairFeathers1,Feathers -HairAccessory3,Halo,Halo -HairAccessory1,,Hair Accessory (All) -HairAccessory1,Ears1,Ears Small -HairAccessory1,Ears2,Ears Large -HairAccessory1,PonyEars1,Pony Ears -HairAccessory1,Ribbons1,Hair Ribbon 1 -HairAccessory1,Ribbons2,Hair Ribbon 2 -HairAccessory1,Ribbons3,Hair Ribbon 3 -HairAccessory1,Ribbons4,Hair Ribbon 4 -HairAccessory1,GiantBow1,Giant Bow 1 -HairAccessory1,BunnyEars1,Bunny Ears -HairAccessory1,BunnyEars2,Floppy Bunny Ears -HairAccessory1,PuppyEars1,Puppy Ears -HairAccessory1,SuccubusHorns,Succubus Horns -HairAccessory1,Horns,Horns -HairAccessory1,Horns2,Horns 2 -HairAccessory1,Horns3,Horns 3 -HairAccessory1,HairFlower1, Flower -HairAccessory1,FoxEars1,Fox Ears Small -HairAccessory1,BatWings,Small Bat Wings -HairAccessory1,KittenEars1,Black Kitty Ears -HairAccessory1,KittenEars2,Light Kitty Ears -HairAccessory1,WolfEars1,Wolf Ears One Piece -HairAccessory1,WolfEars2,Wolf Ears Big -HairAccessory1,FoxEars2,Fox Ears Large -HairAccessory1,FoxEars3,Fox Ears Bell -HairAccessory1,PuppyEars2,Floppy Puppy Ears -HairAccessory1,RaccoonEars1,Raccoon Ears -HairAccessory1,WeddingVeil1,Wedding Veil -HairAccessory1,HairFeathers1,Feathers -HairAccessory1,MouseEars1,Mouse Ears 1 -HairAccessory1,MouseEars2,Mouse Ears 2 -HairAccessory1,ElfEars,Elf Ears -HairAccessory1,CowHorns,Cow Horns -HairAccessory1,Halo,Halo -HairAccessory1,Antennae,Antennae -HairAccessory1,UnicornHorn,Unicorn Horn -HairAccessory1,DildocornHorn,Dildocorn Horn -HairAccessory2,,Ears -HairAccessory2,Ears1,Ears Small -HairAccessory2,Ears2,Ears Large -HairAccessory2,PonyEars1,Pony Ears -HairAccessory2,BunnyEars1,Bunny Ears -HairAccessory2,BunnyEars2,Floppy Bunny Ears -HairAccessory2,PuppyEars1,Puppy Ears -HairAccessory2,SuccubusHorns,Succubus Horns -HairAccessory2,Horns,Horns -HairAccessory2,Horns2,Horns 2 -HairAccessory2,Horns3,Horns 3 -HairAccessory2,FoxEars1,Fox Ears Small -HairAccessory2,BatWings,Small Bat Wings -HairAccessory2,KittenEars1,Black Kitty Ears -HairAccessory2,KittenEars2,Light Kitty Ears -HairAccessory2,WolfEars1,Wolf Ears One Piece -HairAccessory2,WolfEars2,Wolf Ears Big -HairAccessory2,FoxEars2,Fox Ears Large -HairAccessory2,FoxEars3,Fox Ears Bell -HairAccessory2,PuppyEars2,Floppy Puppy Ears -HairAccessory2,RaccoonEars1,Raccoon Ears -HairAccessory2,MouseEars1,Mouse Ears 1 -HairAccessory2,MouseEars2,Mouse Ears 2 -HairAccessory2,ElfEars,Elf Ears -HairAccessory2,CowHorns,Cow Horns -HairAccessory2,Antennae,Antennae -HairAccessory2,UnicornHorn,UnicornHorn -HairAccessory2,DildocornHorn,Dildocorn Horn -Gloves,,Gloves -Gloves,Gloves1,Short Gloves -Gloves,Gloves2,Long Gloves -Gloves,Gloves3,Silky Gloves -Gloves,MistressGloves,Mistress Gloves -Gloves,FingerlessGloves,Fingerless Gloves -Gloves,GlovesFur,Gloves with Fur -Gloves,Catsuit,Catsuit Gloves -Gloves,SeethroughSuit,See-through Gloves -Gloves,CowPrintedGloves,Cow Printed Gloves -Gloves,LatexElbowGloves,Latex Elbow Gloves -Gloves,FishnetGloves, Fishnet Gloves -Gloves,HaremGlove,Harem Gloves -Gloves,BikerGloves,Biker Gloves -Bracelet,,Bracelet -Bracelet,BowBand,Bow Band -Bracelet,KinkBracelet, Kinky Band -Bracelet,LesBand,5 Color Band -Bracelet,SpikeBands,Spiked Wristbands -Bracelet,Band1,Band 1 -Bracelet,LaceBands,Lace Armbands -Glasses,,Glasses -Glasses,Glasses1,Style 1 -Glasses,Glasses2,Style 2 -Glasses,Glasses3,Style 3 -Glasses,Glasses4,Style 4 -Glasses,Glasses5,Style 5 -Glasses,Glasses6,Style 6 -Glasses,SunGlasses1,Sunglasses 1 -Glasses,SunGlasses2,Sunglasses 2 -Glasses,SunGlassesClear,Clear Sunglasses -Glasses,EyePatch1,Eye Patch -Glasses,CatGlasses,Cat-Eye Glasses -Glasses,VGlasses,V Glasses -Glasses,GradientSunglasses,Gradient Sunglasses -Mask,,Mask -Mask,VenetianMask,Venetian Mask -Mask,DominoMask,Domino Mask -Mask,ButterflyMask,Butterfly Mask -Mask,ShinobiMask,Shinobi Mask -Mask,FoxMask,Fox Mask -Mask,BunnyMask1,Bunny Mask Filigrane -Mask,BunnyMask2,Bunny Mask Leather -Mask,BunnyMask3,Bunny Mask Leather Nose -Mask,KittyMask1,Kitty Mask Filigrane -Mask,KittyMask2,Kitty Mask Whiskers -Mask,KittyMask3,Full Kitty Mask -Mask,LaceMask1,Bat Mask -Mask,LaceMask2,Venice Festival Mask -Mask,FuturisticVisor,Futuristic Visor -Mask,OpenFaceHood,Open Face Hood -Mask,FaceVeil,Face Veil -Mask,FacePaint, Face Paint -Mask,PetNose,Pet Nose -Mask,Glitter,Glitter -Mask,HeadHarness,Head Harness -TailStraps,,Tail Strap -TailStraps,TailStrap,Kitty Tail Strap -TailStraps,HorseTailStrap,Horse Tail Strap -TailStraps,HorseTailStrap1,Horse TailStrap -TailStraps,FoxTailsStrap,Fox Tails Strap -TailStraps,PuppyTailStrap,Puppy Tail Strap -TailStraps,SuccubusTailStrap,Succubus Tail Strap -TailStraps,SuccubusHeartTailStrap,Succubus Heart Tail Strap -TailStraps,RaccoonStrap,Raccoon Tail Strap -TailStraps,RaccoonTailStrap,Raccoon2 Tail Strap -TailStraps,PuppyTailStrap1,Puppy Fluffy Tail Strap -TailStraps,KittenTailStrap1,Light Kitten Tail Strap -TailStraps,KittenTailStrap2,Small Fluffy Kitten Tail Strap -TailStraps,FoxTailStrap1,Fox Small Tail Strap -TailStraps,FoxTailStrap2,Fox Large Tail Strap -TailStraps,WolfTailStrap1,Wolf Large Tail Strap -TailStraps,WolfTailStrap2,Wolf Small Tail Strap -TailStraps,WolfTailStrap3,Wolf White Tail Strap -TailStraps,DemonPlug,Demon Tail -TailStraps,MouseTailStrap1,Mouse Tail Strap 1 -TailStraps,MouseTailStrap2,Mouse Tail Strap 2 -TailStraps,CowtailStrap,Cow Tail Strap -TailStraps,BunnyTailStrap,Bunny Tail Strap -TailStraps,DragonTailStrap1,Dragon Tail Strap -TailStraps,Tentacles,Tentacles -Wings,,Wings -Wings,SuccubusFeather,Succubus Feather -Wings,SuccubusWings,Succubus Wings -Wings,AngelFeather,Angel Feather -Wings,DevilWings,Devil Wings -Wings,FallenAngelWings,Fallen Angel Wings -Wings,AngelWings,Angel Wings -Wings,BatWings,Bat Wings -Wings,FairyWings,Fairy Wings -Wings,SteampunkWings,Steampunk Wings -Wings,BeeWings,Bee Wings -Wings,CyberWings,Cyber Wings -Wings,PixieWings,Pixie Wings -Height,,Height -Height,H0950,165 cm -Height,H0960,167 cm -Height,H0970,169 cm -Height,H0980,171 cm -Height,H0990,173 cm -Height,H1000,175 cm -Height,H0900,155 cm -Height,H0910,157 cm -Height,H0920,159 cm -Height,H0930,161 cm -Height,H0940,163 cm -BodyUpper,,Upper Body -BodyUpper,Small,Small -BodyUpper,Normal,Normal -BodyUpper,Large,Large -BodyUpper,XLarge,Xlarge -BodyLower,,Lower Body -BodyLower,Small,Small -BodyLower,Normal,Normal -BodyLower,Large,Large -BodyLower,XLarge,Xlarge -HairFront,,Front Hair -HairFront,HairFront1,Style 1 -HairFront,HairFront1b,Style 1b -HairFront,HairFront2,Style 2 -HairFront,HairFront2b,Style 2b -HairFront,HairFront3,Style 3 -HairFront,HairFront3b,Style 3b -HairFront,HairFront4,Style 4 -HairFront,HairFront4b,Style 4b -HairFront,HairFront5,Style 5 -HairFront,HairFront5b,Style 5b -HairFront,HairFront6,Style 6 -HairFront,HairFront6b,Style 6b -HairFront,HairFront7,Style 7 -HairFront,HairFront7b,Style 7b -HairFront,HairFront8,Style 8 -HairFront,HairFront8b,Style 8b -HairFront,HairFront9,Style 9 -HairFront,HairFront9b,Style 9b -HairFront,HairFront10,Style 10 -HairFront,HairFront10b,Style 10b -HairFront,HairFront11,Style 11 -HairFront,HairFront11b,Style 11b -HairFront,HairFront12,Style 12 -HairFront,HairFront12b,Style 12b -HairFront,HairFront13,Style 13 -HairFront,HairFront13b,Style 13b -HairFront,HairFront14,Style 14 -HairFront,HairFront14b,Style 14b -HairFront,HairFront15,Style 15 -HairFront,HairFront16,Style 16 -HairFront,HairFront17,Style 17 -HairFront,HairFront17b,Style 17b -HairFront,HairFront18,Style 18 -HairFront,HairFront19,Style 19 -HairFront,HairFront20,Style 20 -HairFront,HairFront21,Style 21 -HairFront,HairFront22,Style 22 -HairFront,HairFront22b,Style 22b -HairFront,HairFront23,Style 23 -HairFront,HairFront23b,Style 23b -HairFront,HairFront24,Style 24 -HairFront,HairFront25,Style 25 -HairFront,HairFront26,Style 26 -HairFront,HairFront27,Style 27 -HairFront,HairFront28,Style 28 -HairFront,HairFront29,Style 29 -HairBack,,Back Hair -HairBack,HairNone,None -HairBack,HairBack1,Style 1 -HairBack,HairBack1b,Style 1b -HairBack,HairBack2,Style 2 -HairBack,HairBack2b,Style 2b -HairBack,HairBack4,Style 3 -HairBack,HairBack4b,Style 3b -HairBack,HairBack10,Style 4 -HairBack,HairBack10b,Style 4b -HairBack,HairBack14,Style 5 -HairBack,HairBack15,Style 6 -HairBack,HairBack15b,Style 6b -HairBack,HairBack16,Style 7 -HairBack,HairBack17,Style 8 -HairBack,HairBack18,Style 9 -HairBack,HairBack18b,Style 9b -HairBack,HairBack19,Style 10 -HairBack,HairBack19b,Style 10b -HairBack,HairBack20,Style 11 -HairBack,HairBack20b,Style 11b -HairBack,HairBack5,Style 12 -HairBack,HairBack5b,Style 12b -HairBack,HairBack8,Style 13 -HairBack,HairBack11,Style 14 -HairBack,HairBack6,Style 15 -HairBack,HairBack6b,Style 15b -HairBack,HairBack21,Style 16 -HairBack,HairBack22,Style 17 -HairBack,HairBack23,Style 18 -HairBack,HairBack24,Style 19 -HairBack,HairBack25,Style 20 -HairBack,HairBack26,Style 21 -HairBack,HairBack27,Style 22 -HairBack,HairBack28,Style 23 -HairBack,HairBack29,Style 24 -HairBack,HairBack30,Style 25 -HairBack,HairBack31,Style 26 -HairBack,HairBack32,Style 27 -HairBack,HairBack33,Style 28 -HairBack,HairBack34,Style 29 -HairBack,HairBack35,Style 30 -HairBack,HairBack36,Style 31 -HairBack,HairBack37,Style 32 -HairBack,HairBack38,Style 33 -HairBack,HairBack39,Style 34 -HairBack,HairBack40,Style 35 -HairBack,HairBack41,Style 36 -HairBack,HairBack42,Style 37 -HairBack,HairBack43,Style 38 -HairBack,HairBack44,Style 39 -HairBack,HairBack45,Style 40 -HairBack,HairBack46,Style 41 -HairBack,HairBack47,Style 42 -HairBack,HairBack48,Style 43 -HairBack,HairBack49,Style 44 -HairBack,HairBack50,Style 45 -HairBack,HairBack51,Style 46 -HairBack,HairBack52,Style 47 -HairBack,HairBack53,Style 48 -HairBack,HairBack54,Style 49 -HairBack,HairBack55,Style 50 -Eyes,,Left eye -Eyes,Eyes1,Style 1 -Eyes,Eyes2,Style 2 -Eyes,Eyes3,Style 3 -Eyes,Eyes4,Style 4 -Eyes,Eyes5,Style 5 -Eyes,Eyes6,Style 6 -Eyes,Eyes7,Style 7 -Eyes,Eyes8,Style 8 -Eyes,Eyes9,Style 9 -Eyes,Eyes10,Style 10 -Eyes,Eyes11,Style 11 -Eyes,Eyes12,Style 12 -Eyes,Eyes13,Style 13 -Eyes2,,Right eye -Eyes2,Eyes1,Style 1 -Eyes2,Eyes2,Style 2 -Eyes2,Eyes3,Style 3 -Eyes2,Eyes4,Style 4 -Eyes2,Eyes5,Style 5 -Eyes2,Eyes6,Style 6 -Eyes2,Eyes7,Style 7 -Eyes2,Eyes8,Style 8 -Eyes2,Eyes9,Style 9 -Eyes2,Eyes10,Style 10 -Eyes2,Eyes11,Style 11 -Eyes2,Eyes12,Style 12 -Eyes2,Eyes13,Style 13 -Mouth,,Mouth -Mouth,Regular,Regular -Mouth,Discreet,Discreet -Nipples,,Nipples Style -Nipples,Nipples1,Small -Nipples,Nipples2,Large -Nipples,Nipples3,Light -Pussy,,Pussy -Pussy,PussyLight1,Light 1 -Pussy,PussyLight2,Light 2 -Pussy,PussyLight3,Light 3 -Pussy,PussyDark1,Dark 1 -Pussy,PussyDark2,Dark 2 -Pussy,PussyDark3,Dark 3 -Blush,,Blush -Blush,Blush,Blush -Fluids,,Fluids -Fluids,Fluids,Fluids -Emoticon,,Emoticon -Emoticon,Emoticon,Emoticon -Eyebrows,,Eyebrows -Eyebrows,Eyebrows1,Eyebrows -Hands,,Hands -Hands,Default,Default -Head,,Head -Head,Default,Default -ItemFeet,,Feet -ItemFeet,NylonRope,Nylon Rope -ItemFeet,HempRope,Hemp Rope -ItemFeet,LeatherBelt,Leather Belt -ItemFeet,SturdyLeatherBelts,Sturdy Leather Belt -ItemFeet,Irish8Cuffs,Irish 8 Feet Cuffs -ItemFeet,DuctTape,Duct Tape -ItemFeet,LeatherAnkleCuffs,Leather Ankle Cuffs -ItemFeet,FloorShackles,Floor Shackles -ItemFeet,SteelAnkleCuffs,Steel Ankle Cuffs -ItemFeet,FuturisticAnkleCuffs,Futuristic Ankle Cuffs -ItemFeet,OrnateAnkleCuffs,Ornate Ankle Cuffs -ItemFeet,SpreaderMetal, Metal Leg Spreader -ItemFeet,BallChain,Ball And Chain -ItemFeet,AnkleShackles, Ankle Shackles -ItemFeet,Zipties, Zip Ties -ItemFeet,Chains,Chains -ItemFeet,SpreaderDildoBar,Spreader Dildo Bar -ItemFeet,SpreaderVibratingDildoBar,Vibrating Spreader Dildo Bar -ItemFeet,PlasticWrap,Plastic Wrap -ItemFeet,WoodenCuffs,Wooden Cuffs -ItemFeet,MedicalBedRestraints,Medical Bed Restraints -ItemFeet,SuspensionCuffs,Suspension Cuffs -ItemFeet,Tentacles,Tentacles -ItemFeet,Slime,Slime -ItemLegs,,Legs -ItemLegs,NylonRope,Nylon Rope -ItemLegs,HempRope,Hemp Rope -ItemLegs,LeatherBelt,Leather Belt -ItemLegs,SturdyLeatherBelts,Sturdy Leather Belt -ItemLegs,DuctTape,Duct Tape -ItemLegs,LeatherLegCuffs,Leather Leg Cuffs -ItemLegs,FuturisticLegCuffs,Futuristic Leg Cuffs -ItemLegs,OrnateLegCuffs,Ornate Leg Cuffs -ItemLegs,LegBinder,Leg Binder -ItemLegs,HobbleSkirt,Hobble Skirt -ItemLegs,SeamlessLegBinder,Seamless Leg Binder -ItemLegs,SeamlessHobbleSkirt,Seamless Hobble Skirt -ItemLegs,Zipties,Zip Ties -ItemLegs,Chains,Chains -ItemLegs,PlasticWrap,Plastic Wrap -ItemLegs,FrogtieStraps,Frog-tie Straps -ItemLegs,MermaidTail, Mermaid Tail -ItemLegs,MedicalBedRestraints,Medical Bed Restraints -ItemLegs,Ribbons,Ribbons -ItemLegs,Tentacles,Tentacles -ItemLegs,Slime,Slime -ItemVulva,,Vulva -ItemVulva,VibratingEgg,Vibrating Egg -ItemVulva,VibratorRemote,Vibrating Items Remote -ItemVulva,VibratingLatexPanties,Vibrating Latex Panties -ItemVulva,WandBelt,Wand Belt -ItemVulva,PenisDildo,Penis Dildo -ItemVulva,ShockDildo,Shock Dildo -ItemVulva,VibratingDildo,Vibrating Dildo -ItemVulva,FuturisticVibrator,Futuristic Vibrator -ItemVulva,InflatableVibeDildo,Inflatable Vibrating Dildo -ItemVulva,ClitoralStimulator,Clitoral Stimulator -ItemVulva,ClitSuctionCup,Clitoris Suction Cup -ItemVulva,TapeStrips,Tape Strips -ItemVulva,BenWaBalls,Pair Of Ben Wa Balls -ItemVulva,HeavyWeightClamp,Heavy Weight Clamp -ItemVulva,FullLatexSuitWand,Wand -ItemVulva,ClitAndDildoVibratorbelt,Clitoris & Dildo Vibrating belt -ItemVulva,HempRopeBelt,Hemp Rope Wand Belt -ItemVulva,WiredEgg,Wired Vibrating Egg -ItemVulva,LoversVibrator,Lovers Vibrator -ItemVulva,LoversVibratorRemote,Lovers Remote -ItemVulva,DoubleEndDildo,Double Ended Dildo -ItemVulva,Stitches,Stitches -ItemVulvaPiercings,,Clitoris -ItemVulvaPiercings,StraightClitPiercing,Straight Clitoris Piercing -ItemVulvaPiercings,RoundClitPiercing,Round Clitoris Piercing -ItemVulvaPiercings,BarbellClitPiercing,Barbell Clitoris Piercing -ItemVulvaPiercings,ChastityClitPiercing,Chastity Vulva Piercings -ItemVulvaPiercings,ChastityClitShield,Chastity Vulva Shield -ItemVulvaPiercings,HighSecurityVulvaShield,High Security Vulva Shield -ItemVulvaPiercings,JewelClitPiercing,Jewel Clitoris Piercing -ItemVulvaPiercings,AdornedClitPiercing,Adorned Clitoris Piercing -ItemVulvaPiercings,VibeHeartClitPiercing,Vibrating Heart Clitoris Piercing -ItemVulvaPiercings,TapedClitEgg,Taped Vibrating Egg -ItemVulvaPiercings,ClitRing,Clitoris Ring -ItemButt,,Butt -ItemButt,BlackButtPlug,Black Butt Plug -ItemButt,PenisPlug,Penis Butt Plug -ItemButt,TailButtPlug,Kitty Butt Plug -ItemButt,HorsetailPlug,Horse Butt Plug -ItemButt,HorsetailPlug1,Horse ButtPlug -ItemButt,PuppyTailPlug,Puppy Butt Plug -ItemButt,PuppyTailPlug1,Puppy Fluffy Butt Plug -ItemButt,SuccubusButtPlug,Succubus Butt Plug -ItemButt,SuccubusHeartButtPlug,Succubus Heart Butt Plug -ItemButt,FoxTails,Fox Tails -ItemButt,RaccoonButtPlug,Raccoon Butt Plug -ItemButt,RaccoonTailPlug,Raccoon Tail Plug -ItemButt,AnalBeads,Anal Beads -ItemButt,AnalBeads2,Anal Beads XL -ItemButt,ButtPump,Butt Pump -ItemButt,VibratingButtplug,Vibrating Butt Plug -ItemButt,InflVibeButtPlug,Inflatable Vibrating Butt Plug -ItemButt,AnalHook,Anal Hook -ItemButt,ButtPlugLock,Butt Plug Lock -ItemButt,KittenTail1,Light Kitten Tail -ItemButt,KittenTail2,Small Fluffy Kitten Tail -ItemButt,FoxTail1,Fox Tail Small -ItemButt,FoxTail2,Fox Tail Large -ItemButt,WolfTail1,Wolf Tail Large -ItemButt,WolfTail2,Wolf Tail Small -ItemButt,WolfTail3,Wolf Tail White -ItemButt,DemonPlug,Demon Tail Plug -ItemButt,MouseTail1,Mouse Tail 1 -ItemButt,MouseTail2,Mouse Tail 2 -ItemButt,VibratingDildoPlug,Vibrating Dildo -ItemButt,BunnyTailPlug1,White Bunny Tail Plug -ItemButt,BunnyTailPlug2,Brown Bunny Tail Plug -ItemButt,BunnyTailVibePlug,Bunny Tail Vibe Plug -ItemButt,EggVibePlugXXL,Egg Vibe Plug XXL -ItemButt,ShockPlug,Shock Plug -ItemButt,Cowtail,Cow Tail -ItemButt,HollowButtPlug,Hollow Butt Plug -ItemButt,LockingVibePlug,Locking Vibrating Butt Plug -ItemButt,Tentacles,Tentacles -ItemButt,Stitches,Stitches -ItemPelvis,,Pelvis -ItemPelvis,StraponPanties,Strap-On Panties -ItemPelvis,LeatherChastityBelt,Leather Chastity Belt -ItemPelvis,SleekLeatherChastityBelt,Sleek Leather Chastity Belt -ItemPelvis,StuddedChastityBelt,Studded Chastity Belt -ItemPelvis,MetalChastityBelt,Metal Chastity Belt -ItemPelvis,PolishedChastityBelt,Polished Chastity Belt -ItemPelvis,FuturisticChastityBelt,Futuristic Chastity Belt -ItemPelvis,FuturisticTrainingBelt,Futuristic Training Belt -ItemPelvis,SciFiPleasurePanties,Sci-Fi Pleasure Panties -ItemPelvis,OrnateChastityBelt,Ornate Chastity Belt -ItemPelvis,SteelChastityPanties,Steel Chastity Panties -ItemPelvis,HarnessPanties1,Bondage Harness -ItemPelvis,HarnessPanties2,Full Bondage Harness -ItemPelvis,LeatherStrapPanties1,Leather Strap Panties -ItemPelvis,LoveChastityBelt,Love Chastity Belt -ItemPelvis,HempRope,Rope Harness -ItemPelvis,DiaperHarness,Diaper Harness -ItemPelvis,PelvisChainLeash,Pelvis Chain Leash -ItemPelvis,Ribbons,Ribbons -ItemPelvis,SilkStraps,Silk Straps -ItemPelvis,BulkyDiaper,Bulky Chastity Diaper -ItemPelvis,PoofyDiaper,Poofy Chastity Diaper -ItemPelvis,HybridChastityBelt,Hybrid Chastity Belt -ItemPelvis,ObedienceBelt,Obedience Belt -ItemTorso,,Torso -ItemTorso,NylonRopeHarness,Nylon Rope -ItemTorso,HempRopeHarness,Hemp Rope -ItemTorso,LeatherHarness,Leather Harness -ItemTorso,LeatherStrapHarness,Leather Strap Body Harness -ItemTorso,AdultBabyHarness,Adult Baby Harness -ItemTorso,HarnessBra1,Bondage Harness -ItemTorso,HarnessBra2,Leather Strap Harness -ItemTorso,Corset2,Corset -ItemTorso,FuturisticHarness,Futuristic Harness -ItemTorso,HighSecurityHarness,High Security Harness -ItemTorso,Corset3,Half Cup Corset -ItemTorso,Corset4,Under Bust Corset -ItemTorso,Corset5,Floral Corset -ItemTorso,LeatherBreastBinder,Leather Breast Binder -ItemTorso,LatexCorset1,Latex Corset -ItemTorso,LeatherStrapBra1,Leather Strap Bra -ItemTorso,CrotchChain, Crotch Chain -ItemTorso,StuddedHarness,Studded Harness -ItemTorso,HeavyLatexCorset,Heavy Latex Corset -ItemTorso,Ribbons,Ribbons -ItemTorso,SilkStraps,Silk Straps -ItemTorso,ThinLeatherStraps,Thin Leather Straps -ItemTorso,LockingSwimsuit,Locking Swimsuit -ItemTorso,LockingSwimsuit2,Locking Swimsuit 2 -ItemTorso2,,Torso -ItemTorso2,LockingSwimsuit,Locking Swimsuit -ItemTorso2,LeatherStrapHarness,Leather Strap Body Harness -ItemTorso2,LeatherHarness,Leather Harness -ItemTorso2,NylonRopeHarness,Nylon Rope -ItemTorso2,HempRopeHarness,Hemp Rope -ItemTorso2,AdultBabyHarness,Adult Baby Harness -ItemTorso2,HarnessBra1,Bondage Harness -ItemTorso2,HarnessBra2,Leather Strap Harness -ItemTorso2,Corset2,Corset -ItemTorso2,FuturisticHarness,Futuristic Harness -ItemTorso2,HighSecurityHarness,High Security Harness -ItemTorso2,Corset3,Half Cup Corset -ItemTorso2,Corset4,Under Bust Corset -ItemTorso2,Corset5,Floral Corset -ItemTorso2,LatexCorset1,Latex Corset -ItemTorso2,LeatherBreastBinder,Leather Breast Binder -ItemTorso2,LeatherStrapBra1,Leather Strap Bra -ItemTorso2,CrotchChain, Crotch Chain -ItemTorso2,StuddedHarness,Studded Harness -ItemTorso2,HeavyLatexCorset,Heavy Latex Corset -ItemTorso2,Ribbons,Ribbons -ItemTorso2,SilkStraps,Silk Straps -ItemTorso2,ThinLeatherStraps,Thin Leather Straps -ItemTorso2,LockingSwimsuit2,Locking Swimsuit 2 -ItemNipples,,Nipples -ItemNipples,NippleClamp,Nipple Clamps -ItemNipples,VibeNippleClamp,Vibrating Nipple Clamps -ItemNipples,VibratorRemote,Vibrating Clamps Remote -ItemNipples,ChainClamp,Chain Clamps -ItemNipples,ScrewClamps,Screw Clamps -ItemNipples,ChainTassles,Chain Tassles -ItemNipples,HeartPasties,Heart Pasties -ItemNipples,TapedVibeEggs,Taped Vibrating Eggs -ItemNipples,NippleSuctionCups,Nipple Suction Cups -ItemNipples,NippleTape,Pair Of Nipple Tapes -ItemNipples,ChopStickNippleClamps,Chopstick Nipple Clamps -ItemNipples,KittyPasties,Kitty Pasties -ItemNipples,Clothespins,Clothespins -ItemNipples,NippleWeightClamps,Nipple Weight Clamps -ItemNipples,BellClamps,Nipple Bell Clamps -ItemNipples,LactationPump,Lactation Pump -ItemNipples,ShockClamps,Shock Clamps -ItemNipples,PlateClamps, Plate Clamps -ItemNipples,StretchClovers,Nipple Stretchers -ItemNipplesPiercings,,Nipples -ItemNipplesPiercings,StraightPiercing,Straight Piercings -ItemNipplesPiercings,RoundPiercing,Round Piercings -ItemNipplesPiercings,NecklacePiercingChain, Necklace Nipple Chain -ItemNipplesPiercings,NippleAccessory1,Nipple Jewels -ItemNipplesPiercings,NippleAccessory2,Nipple Jewel Piercings -ItemNipplesPiercings,NippleAccessory3,Nipple Gems Piercings -ItemNipplesPiercings,BarbellPiercing,Barbell Piercing -ItemNipplesPiercings,NippleChastityPiercing1,Chastity Guard Shield -ItemNipplesPiercings,NippleChastityPiercing2,Chastity Cross Shield -ItemNipplesPiercings,VibeHeartPiercings,Vibrating Heart Piercings -ItemNipplesPiercings,BellPiercing,Nipple Bell Piercings -ItemNipplesPiercings,CrossedStraightPiercing,Crossed Straight Piercings -ItemBreast,,Breasts -ItemBreast,MetalChastityBra,Metal Chastity Bra -ItemBreast,PolishedChastityBra,Polished Chastity Bra -ItemBreast,FuturisticBra,Futuristic Chastity Bra -ItemBreast,FuturisticBra2,Futuristic Bra -ItemBreast,OrnateChastityBra,Ornate Chastity Bra -ItemBreast,Ribbons,Ribbons -ItemBreast,LeatherBreastBinder,Leather Breast Binder -ItemArms,,Arms -ItemArms,NylonRope,Nylon Rope -ItemArms,HempRope,Hemp Rope -ItemArms,MetalCuffs,Metal Cuffs -ItemArms,SturdyLeatherBelts,Sturdy Leather Belt -ItemArms,LeatherArmbinder,Leather Armbinder -ItemArms,ArmbinderJacket,Armbinder Jacket -ItemArms,LeatherCuffs,Leather Cuffs -ItemArms,CeilingShackles,Ceiling Shackles -ItemArms,SteelCuffs,Steel Cuffs -ItemArms,FuturisticCuffs,Futuristic Cuffs -ItemArms,OrnateCuffs,Ornate Cuffs -ItemArms,MittenChain1,Mittens Chain -ItemArms,FourLimbsShackles,Four Limbs Shackles -ItemArms,Manacles,Manacles -ItemArms,FullBodyShackles,Full Body Shackles -ItemArms,WristShackles,Wrist Shackles -ItemArms,StraitLeotard,Latex Strait Leotard -ItemArms,FuturisticStraitjacket,Futuristic Straitjacket -ItemArms,StraitJacket,Straitjacket -ItemArms,CollarCuffs,Collar Cuffs -ItemArms,LeatherStraitJacket,Leather Straitjacket -ItemArms,FurStraitJacket,Fur Straitjacket -ItemArms,Bolero,Bolero Straitjacket -ItemArms,DuctTape,Duct Tape -ItemArms,BitchSuit,Pet Suit -ItemArms,CollarLeashHolding,Holding Leash -ItemArms,StraitDress,Strait Dress -ItemArms,StraitDressOpen,Open Crotch Strait Dress -ItemArms,SeamlessStraitDress,Seamless Strait Dress -ItemArms,SeamlessStraitDressOpen,Seamless Open Crotch Strait Dress -ItemArms,Yoke,Yoke -ItemArms,Pillory,Pillory -ItemArms,FullLatexSuit,Full LockDown Latex Suit -ItemArms,Zipties,Zip Ties -ItemArms,BoxTieArmbinder,Latex Box-Tie Armbinder -ItemArms,BondageBouquet,Bondage Bouquet -ItemArms,Chains,Chains -ItemArms,ChainLeashHolding,Holding Chain Leash -ItemArms,PetCrawler,Pet Crawler -ItemArms,MermaidSuit,Mermaid Suit -ItemArms,Web,Web -ItemArms,LatexArmbinder,Latex Armbinder -ItemArms,FuturisticArmbinder,Futuristic Armbinder -ItemArms,SeamlessLatexArmbinder,Seamless Latex Armbinder -ItemArms,FullBodyLeatherHarness,Full Body Leather Harness -ItemArms,UnderBedBondageCuffs,Under Bed Bondage Cuff Set -ItemArms,TightJacket,Tight Straitjacket -ItemArms,LatexSleevelessLeotard,Latex Sleeveless Leotard -ItemArms,LatexBoxtieLeotard,Latex Boxtie Leotard -ItemArms,LatexButterflyLeotard,Latex Butterfly Leotard -ItemArms,PrisonLockdownSuit,Prison Lockdown Suit -ItemArms,LeatherArmSplints,Leather Arm Splints -ItemArms,TightJacketCrotch,Tightjacket Leotard -ItemArms,HighSecurityStraitJacket,High Security Straitjacket -ItemArms,PantyhoseBody,Pantyhose fullBody -ItemArms,PantyhoseBodyOpen,Crotchless Pantyhose fullBody -ItemArms,WoodenCuffs,Wooden Cuffs -ItemArms,InflatableStraightLeotard,Inflatable Strait Leotard -ItemArms,StrictLeatherPetCrawler,Strict Leather Pet Crawler -ItemArms,PlasticWrap,Plastic Wrap -ItemArms,MedicalBedRestraints,Medical Bed Restraints -ItemArms,TransportJacket,Transport Jacket -ItemArms,WrappedBlanket,Wrapped Blanket -ItemArms,Ribbons,Ribbons -ItemArms,ThinLeatherStraps,Thin Leather Straps -ItemArms,Tentacles,Tentacles -ItemArms,Slime,Slime -ItemArms,BondageBra,Bondage Bra -ItemHands,,Hands -ItemHands,PaddedMittens,Padded Mittens -ItemHands,PawMittens,Paw Mittens -ItemHands,LeatherMittens,Leather Mittens -ItemHands,FuturisticMittens,Futuristic Mittens -ItemHands,PaddedLeatherMittens,Padded Leather Mittens -ItemHands,PolishedMittens,Polished Steel Mittens -ItemHands,DuctTape,Duct Tape -ItemHands,SpankingToys,Handheld Items -ItemHands,SpankingToysCrop,Crop -ItemHands,SpankingToysFlogger,Flogger -ItemHands,SpankingToysCane,Cane -ItemHands,SpankingToysHeartCrop,Heart Crop -ItemHands,SpankingToysPaddle,Paddle -ItemHands,SpankingToysWhipPaddle,Whip Paddle -ItemHands,SpankingToysWhip,Whip -ItemHands,SpankingToysCattleProd,Cattle Prod -ItemHands,SpankingToysTennisRacket,Tennis Racket -ItemHands,SpankingToysRainbowWand,Rainbow Wand -ItemHands,SpankingToysGavel,Gavel -ItemHands,SpankingToysFeather,Feather -ItemHands,SpankingToysFeatherDuster,Feather Duster -ItemHands,SpankingToysLongDuster,Long Duster -ItemHands,SpankingToysIceCube,Ice Cube -ItemHands,SpankingToysWartenbergWheel,Wartenberg Wheel -ItemHands,SpankingToysVibratingWand,Vibrating Wand -ItemHands,SpankingToysSmallVibratingWand,Small Vibe Wand -ItemHands,SpankingToysCandleWax,Candle Wax -ItemHands,SpankingToysLargeDildo,Large Dildo -ItemHands,SpankingToysPetToy,Pet Toy -ItemHands,SpankingToysVibrator,Vibrator -ItemHands,SpankingToysBelt,Belt -ItemHands,SpankingToysHairbrush,Hairbrush -ItemHands,SpankingToysSmallDildo,Small Dildo -ItemHands,SpankingToysElectricToothbrush,Electric Toothbrush -ItemHands,SpankingToysToothbrush,Toothbrush -ItemHands,SpankingToysShockWand,Shock Wand -ItemHands,SpankingToysLotion,Lotion -ItemHands,SpankingToysRuler,Ruler -ItemHands,SpankingToysSword,Foam Sword -ItemHands,SpankingToysVibeRemote,Vibrator Remote -ItemHands,SpankingToysShockRemote,Shock Remote -ItemHands,SpankingToysTowel,Towel -ItemHands,SpankingToysRopeCoilLong,Long Coiled Rope -ItemHands,SpankingToysRopeCoilShort,Short Coiled Rope -ItemHands,SpankingToysBallgag,Ballgag -ItemHands,SpankingToysLongSock,Long Sock -ItemHands,SpankingToysBaguette,Baguette -ItemHands,SpankingToysPanties,Panties -ItemHands,SpankingToysTapeRoll,Duct Tape Roll -ItemHands,SpankingToysSpatula,Spatula -ItemHands,SpankingToysBroom,Broom -ItemHands,KeyProp,Key -ItemHands,SpankingToysPhone1,Mobile Phone -ItemHands,SpankingToysPhone2,Mobile Phone 2 -ItemHands,HoofMittens, Hoof Mittens -ItemHands,SpankingToysScissors,Scissors -ItemHands,SpankingToysPlasticWrap,Plastic Wrap Roll -ItemHands,SpankingToysGlassEmpty,Empty Glass -ItemHands,SpankingToysGlassFilled,Filled Glass -ItemHands,SpankingToysPotionBottle,Potion Bottle -ItemHands,MedicalInjector,Medical Injector -ItemNeck,,Neck -ItemNeck,LeatherCollar,Leather Collar -ItemNeck,LeatherCollarBell,Bell Collar -ItemNeck,LeatherCollarBow,Bow Collar -ItemNeck,SlaveCollar,Slave Collar -ItemNeck,ClubSlaveCollar,Club Slave Collar -ItemNeck,ShockCollar,Shock Collar -ItemNeck,AutoShockCollar,Automatic Shock Collar -ItemNeck,ShockCollarRemote,Shock Collar Remote -ItemNeck,BatCollar,Bat Collar -ItemNeck,PostureCollar,Posture Collar -ItemNeck,SteelPostureCollar,Steel Collar -ItemNeck,DogCollar,Dog Collar -ItemNeck,SpikeCollar,Spike Collar -ItemNeck,HighCollar,High Collar -ItemNeck,FuturisticCollar,Futuristic Collar -ItemNeck,LeatherChoker,Leather Choker -ItemNeck,PetCollar,Pet Collar -ItemNeck,MaidCollar,Maid Collar -ItemNeck,BordelleCollar,Bordelle Collar -ItemNeck,LoveLeatherCollar,Lover Leather Collar -ItemNeck,NobleCorsetCollar,Noble Corset Collar -ItemNeck,StrictPostureCollar,Strict Posture Collar -ItemNeck,HeartCollar,Heart Collar -ItemNeck,LeatherCorsetCollar,Leather Corset Collar Gag -ItemNeck,LatexPostureCollar,Latex Posture Collar Gag -ItemNeck,HighSecurityCollar,High Security Collar -ItemNeck,OrnateCollar,Ornate Collar -ItemNeck,SlenderSteelCollar,Slender Steel Collar -ItemNeck,ShinySteelCollar,Shiny Steel Collar -ItemNeck,HeartLinkChoker, Heart-Link Choker -ItemNeck,NeckRope,Neck Rope -ItemNeck,NylonCollar,Nylon Collar -ItemNeck,GothicCollar,Gothic Collar -ItemNeck,LatexCollar1,Inflated Latex Collar -ItemNeck,LatexCollar2,Latex Collar -ItemNeck,TechnoCollar,Techno Collar -ItemNeck,ComboHarness,Combo Harness -ItemNeck,BonedNeckCorset,Boned Neck Corset -ItemNeckAccessories,,Collar -ItemNeckAccessories,CustomCollarTag,Custom Tag -ItemNeckAccessories,ElectronicTag,Electronic Tag -ItemNeckAccessories,CollarBell,Bell -ItemNeckAccessories,CollarBow,Bow -ItemNeckAccessories,CollarShockUnit,Shock Unit -ItemNeckAccessories,CollarAutoShockUnit,Automatic Shock Unit -ItemNeckAccessories,ShockCollarRemote,Shock Collar Remote -ItemNeckAccessories,CollarNameTag,Name Tag -ItemNeckAccessories,CollarNameTagOval,Oval Name Tag -ItemNeckAccessories,CollarNameTagPet,Pet Name Tag -ItemNeckAccessories,CollarNameTagLover,Lover Name Tag -ItemNeckAccessories,CollarNameTagLivestock,Livestock Name Tag -ItemNeckAccessories,CollarMoon,Moon Pendant -ItemNeckAccessories,CollarSun,Sun Pendant -ItemNeckAccessories,CollarLapis,Lapis Pendant -ItemNeckAccessories,CollarPentagram,Pentagram Pendant -ItemNeckAccessories,CollarFlower,Flower -ItemNeckAccessories,CollarRose,Rose -ItemNeckAccessories,CollarCowBell,Cowbell -ItemNeckAccessories,CollarPupBone,Pup Bone -ItemNeckAccessories,Key,Key -ItemNeckRestraints,,Collar -ItemNeckRestraints,CollarChainLong,Long Chain -ItemNeckRestraints,CollarChainShort,Short Chain -ItemNeckRestraints,Post,Hitching Post -ItemNeckRestraints,CollarLeash,Leash -ItemNeckRestraints,CollarLeashTaken,Pulled Leash -ItemNeckRestraints,ChainLeash,Chain Leash -ItemNeckRestraints,ChainLeashTaken,Pulled Chain Leash -ItemNeckRestraints,CollarChainMedium,Medium Chain -ItemNeckRestraints,CollarRopeLong,Long Rope -ItemNeckRestraints,CollarRopeShort,Short Rope -ItemNeckRestraints,CollarRopeMedium,Medium Rope -ItemNeckRestraints,PetPost,Pet Sign -ItemMouth,,Mouth -ItemMouth,ClothGag,Cloth Gag -ItemMouth,WiffleGag,Wiffle Ball Gag -ItemMouth,HarnessBallGag,Harness Ball Gag -ItemMouth,HarnessPanelGag,Harness Panel Gag -ItemMouth,RingGag,Ring Gag -ItemMouth,DuctTape,Duct Tape -ItemMouth,PacifierGag,Pacifier -ItemMouth,HarnessPacifierGag,Harness Pacifier -ItemMouth,DusterGag,Duster Gag -ItemMouth,CupholderGag,Cup Holder Gag -ItemMouth,HarnessPonyBits,Bit Gag -ItemMouth,PumpGag,Pump Gag -ItemMouth,KittyGag,Kitty Mask -ItemMouth,KittyHarnessPanelGag,Kitty Harness Gag -ItemMouth,KittyMuzzleGag,Kitty Muzzle Gag -ItemMouth,CarrotGag,Rubber Carrot Gag -ItemMouth,MuzzleGag,Muzzle Gag -ItemMouth,FuturisticPanelGag,Futuristic Panel Gag -ItemMouth,FuturisticHarnessPanelGag,Futuristic Harness Panel Gag -ItemMouth,FuturisticHarnessBallGag,Futuristic Ball Gag -ItemMouth,RegularSleepingPill,Sleeping Pill -ItemMouth,PantiesMask,Panties Mask -ItemMouth,PlugGag,Plug Gag -ItemMouth,DildoGag,Dildo Gag -ItemMouth,BoneGag,Bone Gag -ItemMouth,ChopstickGag,Chopstick Gag -ItemMouth,BambooGag,Bamboo Gag -ItemMouth,HarnessBallGag1,Harness Ball Gag XL -ItemMouth,PumpkinGag,Pumpkin Gag -ItemMouth,LipGag,Lips Gag -ItemMouth,SpiderGag,Spider Gag -ItemMouth,ClothStuffing,Cloth Stuffing -ItemMouth,PantyStuffing,Panty Stuffing -ItemMouth,ChloroformCloth,Chloroform Cloth -ItemMouth,ScarfGag,Scarf -ItemMouth,LewdGag,Lewd Gag -ItemMouth,DeepthroatGag,Deepthroat Penis Gag -ItemMouth,LeatherCorsetCollar,Leather Corset Collar Gag -ItemMouth,LatexPostureCollar,Latex Posture Collar Gag -ItemMouth,BitGag,Silicon Bit Gag -ItemMouth,XLBoneGag,XL Bone Gag -ItemMouth,DogMuzzleExposed,Exposed Dog Muzzle -ItemMouth,FoxyHarnessPanelGag,Foxy Harness Gag -ItemMouth,BallGag,Ball Gag -ItemMouth,TongueStrapGag,Tongue Strap Gag -ItemMouth,BallGagMask,Ball Gag Mask -ItemMouth,HookGagMask,Hook Gag Mask -ItemMouth,DildoPlugGag,Dildo Plug Gag -ItemMouth,SteelMuzzleGag,Steel Muzzle Gag -ItemMouth,StitchedMuzzleGag,Stitched Muzzle Gag -ItemMouth,LatexBallMuzzleGag,Latex Ball Muzzle Gag -ItemMouth,SockStuffing,Sock Stuffing -ItemMouth,GasMaskGag,Respirator Mask -ItemMouth,WebGag,Web Gag -ItemMouth,RopeGag,Rope Gag -ItemMouth,RopeBallGag,Rope Ball Gag -ItemMouth,MilkBottle,Milk Bottle -ItemMouth,MedicalMask,Medical Mask -ItemMouth,RegressedMilk,Nursery Milk -ItemMouth,PrisonLockdownGag,Prison Lockdown Gag -ItemMouth,ShoeGag,Shoe Gag -ItemMouth,FunnelGag,Funnel Gag -ItemMouth,LargeDildo,Large Dildo -ItemMouth,PlasticWrap, Plastic Wrap -ItemMouth,Ball,Tennis Ball -ItemMouth,FuturisticMuzzle,Futuristic Muzzle -ItemMouth,CageMuzzle,Iron Cage Muzzle -ItemMouth,DentalGag,Dental Gag -ItemMouth,Ribbons,Ribbons -ItemMouth,CropGag,Crop -ItemMouth,CaneGag,Cane -ItemMouth,PaciGag,Pacifier Gag -ItemMouth,Tentacles,Tentacle -ItemMouth,OTNPlugGag,Harness OTN Plug Gag -ItemMouth,PonyGag,Bridle Gag -ItemMouth,LatexSheathGag, Latex Sheath Gag -ItemMouth,Slime,Slime -ItemMouth,FurScarf,Fur Scarf -ItemMouth2,,Mouth -ItemMouth2,ClothGag,Cloth Gag -ItemMouth2,WiffleGag,Wiffle Ball Gag -ItemMouth2,HarnessBallGag,Harness Ball Gag -ItemMouth2,HarnessPanelGag,Harness Panel Gag -ItemMouth2,RingGag,Ring Gag -ItemMouth2,DuctTape,Duct Tape -ItemMouth2,HarnessPacifierGag,Harness Pacifier -ItemMouth2,DusterGag,Duster Gag -ItemMouth2,CupholderGag,Cup Holder Gag -ItemMouth2,HarnessPonyBits,Bit Gag -ItemMouth2,KittyGag,Kitty Mask -ItemMouth2,KittyHarnessPanelGag,Kitty Harness Gag -ItemMouth2,KittyMuzzleGag,Kitty Muzzle Gag -ItemMouth2,CarrotGag,Rubber Carrot Gag -ItemMouth2,MuzzleGag,Muzzle Gag -ItemMouth2,PantiesMask,Panties Mask -ItemMouth2,DildoGag,Dildo Gag -ItemMouth2,BoneGag,Bone Gag -ItemMouth2,HarnessBallGag1,Harness Ball Gag XL -ItemMouth2,PumpkinGag,Pumpkin Gag -ItemMouth2,LipGag,Lips Gag -ItemMouth2,SpiderGag,Spider Gag -ItemMouth2,ChloroformCloth,Chloroform Cloth -ItemMouth2,ScarfGag,Scarf -ItemMouth2,LewdGag,Lewd Gag -ItemMouth2,LeatherCorsetCollar,Leather Corset Collar Gag -ItemMouth2,LatexPostureCollar,Latex Posture Collar Gag -ItemMouth2,BitGag,Silicon Bit Gag -ItemMouth2,XLBoneGag,XL Bone Gag -ItemMouth2,FoxyHarnessPanelGag,Foxy Harness Gag -ItemMouth2,BallGag,Ball Gag -ItemMouth2,BallGagMask,Ball Gag Mask -ItemMouth2,SteelMuzzleGag,Steel Muzzle Gag -ItemMouth2,StitchedMuzzleGag,Stitched Muzzle Gag -ItemMouth2,LatexBallMuzzleGag,Latex Ball Muzzle Gag -ItemMouth2,GasMaskGag,Respirator Mask -ItemMouth2,WebGag,Web Gag -ItemMouth2,RopeGag,Rope Gag -ItemMouth2,RopeBallGag,Rope Ball Gag -ItemMouth2,MedicalMask,Medical Mask -ItemMouth2,RegressedMilk,Nursery Milk -ItemMouth2,PrisonLockdownGag,Prison Lockdown Gag -ItemMouth2,ShoeGag,Shoe Gag -ItemMouth2,PlasticWrap, Plastic Wrap -ItemMouth2,FuturisticMuzzle,Futuristic Muzzle -ItemMouth2,CageMuzzle,Iron Cage Muzzle -ItemMouth2,Ribbons,Ribbons -ItemMouth2,PaciGag,Pacifier Gag -ItemMouth2,Tentacles,Tentacle -ItemMouth2,PonyGag,Bridle Gag -ItemMouth2,MouthFeatureGag, Mouthfeature Gag -ItemMouth2,Slime,Slime -ItemMouth2,FurScarf,Fur Scarf -ItemMouth3,,Mouth -ItemMouth3,ClothGag,Cloth Gag -ItemMouth3,WiffleGag,Wiffle Ball Gag -ItemMouth3,HarnessBallGag,Harness Ball Gag -ItemMouth3,HarnessPanelGag,Harness Panel Gag -ItemMouth3,RingGag,Ring Gag -ItemMouth3,DuctTape,Duct Tape -ItemMouth3,HarnessPacifierGag,Harness Pacifier -ItemMouth3,DusterGag,Duster Gag -ItemMouth3,CupholderGag,Cup Holder Gag -ItemMouth3,HarnessPonyBits,Bit Gag -ItemMouth3,KittyGag,Kitty Mask -ItemMouth3,KittyHarnessPanelGag,Kitty Harness Gag -ItemMouth3,KittyMuzzleGag,Kitty Muzzle Gag -ItemMouth3,CarrotGag,Rubber Carrot Gag -ItemMouth3,MuzzleGag,Muzzle Gag -ItemMouth3,PantiesMask,Panties Mask -ItemMouth3,DildoGag,Dildo Gag -ItemMouth3,BoneGag,Bone Gag -ItemMouth3,HarnessBallGag1,Harness Ball Gag XL -ItemMouth3,PumpkinGag,Pumpkin Gag -ItemMouth3,LipGag,Lips Gag -ItemMouth3,SpiderGag,Spider Gag -ItemMouth3,ChloroformCloth,Chloroform Cloth -ItemMouth3,ScarfGag,Scarf -ItemMouth3,LewdGag,Lewd Gag -ItemMouth3,LeatherCorsetCollar,Leather Corset Collar Gag -ItemMouth3,LatexPostureCollar,Latex Posture Collar Gag -ItemMouth3,BitGag,Silicon Bit Gag -ItemMouth3,XLBoneGag,XL Bone Gag -ItemMouth3,FoxyHarnessPanelGag,Foxy Harness Gag -ItemMouth3,BallGag,Ball Gag -ItemMouth3,BallGagMask,Ball Gag Mask -ItemMouth3,SteelMuzzleGag,Steel Muzzle Gag -ItemMouth3,StitchedMuzzleGag,Stitched Muzzle Gag -ItemMouth3,LatexBallMuzzleGag,Latex Ball Muzzle Gag -ItemMouth3,GasMaskGag,Respirator Mask -ItemMouth3,WebGag,Web Gag -ItemMouth3,RopeGag,Rope Gag -ItemMouth3,RopeBallGag,Rope Ball Gag -ItemMouth3,MedicalMask,Medical Mask -ItemMouth3,RegressedMilk,Nursery Milk -ItemMouth3,PrisonLockdownGag,Prison Lockdown Gag -ItemMouth3,ShoeGag,Shoe Gag -ItemMouth3,FuturisticMuzzle,Futuristic Muzzle -ItemMouth3,CageMuzzle,Iron Cage Muzzle -ItemMouth3,PlasticWrap, Plastic Wrap -ItemMouth3,Ribbons,Ribbons -ItemMouth3,PaciGag,Pacifier Gag -ItemMouth3,Tentacles,Tentacle -ItemMouth3,PonyGag,Bridle Gag -ItemMouth3,Slime,Slime -ItemMouth3,Stitches,Stitches -ItemMouth3,FurScarf,Fur Scarf -ItemHead,,Eyes -ItemHead,ClothBlindfold,Cloth Blindfold -ItemHead,ScarfBlindfold,Scarf Blindfold -ItemHead,LeatherBlindfold,Leather Blindfold -ItemHead,PaddedBlindfold,Padded Blindfold -ItemHead,InteractiveVisor,Interactive Visor -ItemHead,FuturisticMask,Futuristic Mask -ItemHead,InteractiveVRHeadset,VR Headset -ItemHead,LeatherSlimMask,Slim Leather Mask -ItemHead,LeatherSlimMaskOpenMouth,Open Mouth Slim Mask -ItemHead,LeatherSlimMaskOpenEyes,Open Eyes Mouth Slim Mask -ItemHead,StuddedBlindfold,Studded Blindfold -ItemHead,KittyBlindfold,Kitty Blindfold -ItemHead,DuctTape,Duct Tape -ItemHead,SmallBlindfold,Small Blindfold -ItemHead,FullBlindfold,Full Blindfold -ItemHead,LewdBlindfold,Lewd Blindfold -ItemHead,LatexBlindfold,Latex Blindfold -ItemHead,FrilledSleepMask,Frilled Sleep Mask -ItemHead,BlackoutLenses,Blackout Lenses -ItemHead,WebBlindfold,Web -ItemHead,RopeBlindfold,Rope Blindfold -ItemHead,SleepMask,Smooth Sleep Mask -ItemHead,PrisonLockdownBlindfold,Prison Lockdown Blindfold -ItemHead,Pantyhose,Pantyhose -ItemHead,Snorkel,Snorkel -ItemHead,Ribbons,Ribbon Blindfold -ItemHead,Tentacles,Tentacles -ItemHead,MedicalPatch,Medical Patches -ItemHead,DroneMask,Smooth Latex Mask -ItemHead,Slime,Slime -ItemHead,FurScarf,Fur Scarf -ItemHead,Stitches,Stitches -ItemNose,,Nose -ItemNose,NoseHook,Nose Hook -ItemNose,PigNose,Pig Nose -ItemNose,NoseRing,Nose Ring -ItemNose,DuctTape,Duct Tape -ItemNose,NosePlugs,Nose Plugs -ItemNose,BarbelPiercing,Barbel Piercing -ItemNose,PigNoseHook,Pig Nose Hook -ItemHood,,Head -ItemHood,BlanketHood,Blanket Hood -ItemHood,LeatherHoodSealed,Sealed Leather Hood -ItemHood,PolishedSteelHood,Polished Steel Hood -ItemHood,InflatedBallHood,Inflatable Hood -ItemHood,OldGasMask,Gas Mask -ItemHood,KirugumiMask,Kigurumi Mask -ItemHood,PumpkinHead,Pumpkin Head -ItemHood,SackHood,Sack Hood -ItemHood,LeatherHoodSensDep,Sensory Deprivation Hood -ItemHood,LatexHoodOpenHair,Open Hair Latex Hood -ItemHood,LeatherHood,Leather Hood -ItemHood,LeatherHoodOpenEyes,Leather Hood Eyes -ItemHood,GasMask,Gas Mask -ItemHood,DogHood,Dog Hood -ItemHood,FoxyMask,Foxy Mask -ItemHood,PonyHood,Pony Hood -ItemHood,LeatherHoodOpenMouth,Leather Hood Mouth -ItemHood,CanvasHood,Canvas Hood -ItemHood,Pantyhose,Pantyhose -ItemHood,GP9GasMask,GP-9 Gas Mask -ItemHood,OpenFaceHood,Open Face Hood -ItemHood,GwenHood,Gwen Hood -ItemHood,TechnoHelmet1,Techno Helmet -ItemHood,FuturisticHelmet,GGTS Helmet -ItemHood,LampHeadHood,Lampshade Hood -ItemHood,AccentHood,Accent Hood -ItemHood,CollarHood,Collar Hood -ItemHood,ZipperHood,Zipper Hood -ItemHood,LatexHabit,Latex Habit Hood -ItemHood,CowHood,Cow Hood -ItemHood,HeadboxSeethrough,One-Way Glass Head Box -ItemHood,Slime,Slime -ItemHood,KittyHood,Kitty Hood -ItemHood,LatexDogHood,Latex Dog Hood -ItemHood,OpenMouthPlugHood,Latex Open Mouth Plug Hood -ItemHood,DroneMask,Smooth Latex Mask -ItemEars,,Ears -ItemEars,LightDutyEarPlugs,Light Duty Ear Plugs -ItemEars,HeavyDutyEarPlugs,Heavy Duty Ear Plugs -ItemEars,HeadphoneEarPlugs,Headphone Ear Plugs -ItemEars,BluetoothEarbuds,Bluetooth Earbuds -ItemEars,FuturisticEarphones,Futuristic Earphones -ItemEars,Headphones,Headphones -ItemMisc,,Body -ItemMisc,MetalPadlock,Metal Padlock -ItemMisc,IntricatePadlock,Intricate Padlock -ItemMisc,HighSecurityPadlock,High-Security Padlock -ItemMisc,TimerPadlock,Five Minutes Padlock -ItemMisc,CombinationPadlock,Combination Padlock -ItemMisc,PasswordPadlock,Password Lock -ItemMisc,TimerPasswordPadlock,Timer Password Lock -ItemMisc,OwnerPadlock,Owner Padlock -ItemMisc,OwnerTimerPadlock,Owner Timer Padlock -ItemMisc,LoversPadlock,Lovers Padlock -ItemMisc,LoversTimerPadlock,Lovers Timer Padlock -ItemMisc,MistressPadlock,Mistress Padlock -ItemMisc,PandoraPadlock,Pandora's Box Padlock -ItemMisc,MistressTimerPadlock,Mistress Timer Padlock -ItemMisc,ExclusivePadlock,Exclusive Padlock -ItemMisc,SafewordPadlock,Safeword Padlock -ItemMisc,MetalPadlockKey,Metal Padlock Key -ItemMisc,OwnerPadlockKey,Owner Padlock Key -ItemMisc,LoversPadlockKey,Lovers Padlock Key -ItemMisc,MistressPadlockKey,Mistress Padlock Key -ItemMisc,PandoraPadlockKey,Pandora's Box Padlock Key -ItemMisc,MetalCuffsKey,Metal Cuffs Key -ItemMisc,Lockpicks,Lockpicks -ItemMisc,WoodenMaidTray,Wooden Maid Tray -ItemMisc,WoodenMaidTrayFull,Wooden Maid Tray Full -ItemMisc,BountySuitcase,Secret Suitcase -ItemMisc,BountySuitcaseEmpty,Unlocked Suitcase -ItemMisc,WoodenPaddle,Wooden Paddle -ItemMisc,WoodenSign,Wooden Sign -ItemMisc,ServingTray,Serving Tray -ItemMisc,TeddyBear,Teddy Bear Set -ItemDevices,,Body -ItemDevices,WoodenBox,Wooden Box -ItemDevices,SmallWoodenBox,Small Wooden Box -ItemDevices,MilkCan,Water filled milk can -ItemDevices,WaterCell,Water torture Cell -ItemDevices,Cage,Stand up cage -ItemDevices,LowCage,Kennel -ItemDevices,SaddleStand,Saddle Stand -ItemDevices,BurlapSack,Burlap Sack -ItemDevices,InflatableBodyBag,Inflatable Body Bag -ItemDevices,FurBlanketWrap,Fur Blanket Wrap -ItemDevices,BondageBench,Bondage Bench -ItemDevices,BBQ,Grill -ItemDevices,LittleMonster,Halloween Monster Set -ItemDevices,Familiar,Halloween Familiar Set -ItemDevices,Coffin,Vampire Coffin -ItemDevices,CryoCapsule,Cryogenic Capsule -ItemDevices,OneBarPrison,One Bar Prison -ItemDevices,TheDisplayFrame,Display Frame -ItemDevices,Sybian,Sybian -ItemDevices,StrapOnSmooth,Smooth Strap On -ItemDevices,StrapOnStuds,Studded Strap On -ItemDevices,DisplayCase,Display Case -ItemDevices,SmallDisplayCase,Small Display Case -ItemDevices,FuturisticCrate,Futuristic Crate -ItemDevices,DollBox,Doll Box -ItemDevices,WoodenBoxOpenHead,Exposed Head Wooden Box -ItemDevices,SmallWoodenBoxOpenHead,Exposed Head Small Wooden Box -ItemDevices,WoodenStocks,Wooden Stocks -ItemDevices,Vacbed,Vacbed -ItemDevices,VacbedClear,Clear Vacbed -ItemDevices,Crib,Crib -ItemDevices,Bed,Bed -ItemDevices,X-Cross,St. Andrews Cross -ItemDevices,ChangingTable,Changing Table -ItemDevices,Locker,Locker -ItemDevices,SmallLocker,Small Locker -ItemDevices,ConcealingCloak,Concealing Cloak -ItemDevices,Kennel,Heavy Kennel -ItemDevices,PetBed,Pet Bed -ItemDevices,TransportWoodenBox,Transport Box -ItemDevices,VacCube,Vac-Cube -ItemDevices,PetBowl,Pet Bowl -ItemDevices,Pole,Pole -ItemDevices,Cushion,Cushion -ItemDevices,WetFloor,Wet Floor Sign -ItemDevices,VacBedDeluxe,Vacuum Bed Deluxe -ItemDevices,FuckMachine,Fuck Machine -ItemDevices,Net,Net -ItemDevices,Snowman,Snowman -ItemDevices,MedicalBed,Medical Bed -ItemDevices,WoodenRack,Wooden Rack -ItemDevices,WoodenHorse,Wooden Horse -ItemAddon,,Body -ItemAddon,Covers,Blanket -ItemAddon,BedRopes,Bed Ropes -ItemAddon,BedStraps,Bed Straps -ItemAddon,BedTape,Bed Tape -ItemAddon,BedChains,Bed Chains -ItemAddon,CeilingRope,Ceiling Rope -ItemAddon,CeilingChain,Ceiling Chain -ItemBoots,,Feet -ItemBoots,PonyBoots,Pony Boots -ItemBoots,BalletHeels,Ballet Heels -ItemBoots,BalletWedges,Ballet Wedges -ItemBoots,ToeCuffs,Metal Toe Cuffs -ItemBoots,LeatherToeCuffs,Leather Toe Cuffs -ItemBoots,ToeTie,Toe Tie -ItemBoots,ThighHighLatexHeels,Latex Heels -ItemBoots,LockingHeels,Locking Heels -ItemBoots,LockingHeels2,Multi-Strap Locking Heels -ItemBoots,LockingShoes1,Locking Strap Shoes -ItemBoots,LockingShoes2,Locking Full Shoes -ItemBoots,FuturisticHeels,Futuristic Shoes -ItemBoots,FuturisticHeels2,Futuristic Heels -ItemBoots,LockingBoots1,Locking Boots -ItemBoots,LeatherFootMitts1,Short Leather Foot Mittens -ItemBoots,ToeTape,Toe Tape -ItemBoots,Zipties,Zip Ties -ItemBoots,HighThighBoots,High Thigh Boots -ItemBoots,Slime,Slime -ItemBoots,MonoHeel,Monoheel diff --git a/Assets/Female3DCG/Female3DCG.js b/Assets/Female3DCG/Female3DCG.js deleted file mode 100644 index de5a6c473..000000000 --- a/Assets/Female3DCG/Female3DCG.js +++ /dev/null @@ -1,7719 +0,0 @@ -//@ts-check -"use strict"; -// *** Item value guidelines *** -// First, check if there's a similar item and use that price. If there isn't, use the real price in US dollars -// If it's an item that can only used once in real life (duct tape), raise the price a lot (you buy a great quantity of it) -// If it's an item with extended capabilities, raise the price -// If it's an item with multiple image layers, raise the price a little -// If it's a restraint that's impossible to remove, raise the price a little -// If the item doesn't have any image (butt plug), lower the price -// Bondage items should not go over 250$ - The love belt is that item right now -// Regular clothes should not go over 100$ - Dress2 is that item right now -// Empty value is a free item that everyone has from the start -// -1 value items cannot be bought, they must be acquired in-game in some other ways - -// *** Sort order of asset & asset group properties *** -// Name, Priority, Value, Difficulty, SelfBondage, Time, RemoveTime, Enable, Visible, Random, Wear, IsRestraint, AllowLock, OwnerOnly, LoverOnly, Left, Top, DefaultColor, BuyGroup, Prerequisite, Hide, HideItem, everything else -// Group, ParentGroup, ParentSize, ParentColor, Category, Priority, Default, Clothing, Underwear, Random, IsRestraint, Blink, Left, Top, Color, FullAlpha, AllowNone, AllowColorize, AllowCustomize, AllowPose, SetPose, Effect, Zone, Activity - -// *** Item addition & modification guidelines *** -// Don't include images, sounds or names that are obviously copyrighted -// Don't create anything that could be viewed by lots of players as racist, sexist, anti-LGBT, pedophilic, religious or political -// If you change an item or a piece of code made by someone else, make sure to get their approval first - -/** - * Spanking Toys Asset - * @type {AssetDefinition} - */ -var AssetSpankingToys = { - Name: "SpankingToys", Random: false, Wear: false, BuyGroup: "SpankingToys", - DynamicAllowInventoryAdd: C => InventoryIsWorn(Player, "SpankingToys", "ItemHands") && InventorySpankingToysActivityAllowed(C), - DynamicDescription: C => InventorySpankingToysGetDescription(C), - DynamicExpressionTrigger: () => { - const Type = InventorySpankingToysGetType(Player); - const Option = InventoryItemHandsSpankingToysOptions.find(x => x.Name === Type); - return Option && Option.ExpressionTrigger; - }, - DynamicPreviewImage: () => InventorySpankingToysGetType(Player), - DynamicName: C => "SpankingToys" + InventorySpankingToysGetType(C), - DynamicGroupName: "ItemHands", - DynamicActivity: C => InventorySpankingToysGetActivity(C), - DynamicAudio: C => InventorySpankingToysGetAudio(C), - ParentGroup: null, - Effect: [], - DialogSortOverride: DialogSortOrder.Equipped, - PreviewIcons: ["Handheld"] -}; - -// Alpha mask regions based on Appearance.js CanvasUpperOverflow and CanvasLowerOverflow values -/** @type {[number, number, number, number]} */ -const AssetUpperOverflowAlpha = [0, -700, 500, 700]; -/** @type {[number, number, number, number]} */ -const AssetLowerOverflowAlpha = [0, 1000, 500, 1000 + 150]; - -/** - * 3D Custom Girl based assets - * @type {AssetGroupDefinition[]} - */ -var AssetFemale3DCG = [ - - // Appearance specific - { - Group: "Cloth", - ParentGroup: "BodyUpper", - Priority: 30, - Clothing: true, - AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "AllFours", "OverTheHead"], - PreviewZone: [0, 150, 500, 500], - Asset: [ - { - Name: "CollegeOutfit1", Value: -1, DefaultColor: ["Default", "#202020"], BuyGroup: "CollegeOutfit", Hide: ["ItemNeck"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ClothAccessoryPoncho"], Layer: [ - { Name: "Shirt" }, - { Name: "Tie" }, - ] - }, - { Name: "MaidOutfit1", Fetish: ["Lingerie"], Value: -1, BuyGroup: "Maid", Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 560]] }], HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "ClothLowerTutu"], DefaultColor: ["#212121", "Default", "Default"], Layer: [ - { Name: "Dress" }, - { Name: "Frills" }, - { Name: "Apron" }, - ] }, - { Name: "MaidOutfit2", Fetish: ["Lingerie"], Value: -1, BuyGroup: "Maid", Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 560]] }], HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "ClothLowerTutu"], Expose: ["ItemNipples", "ItemNipplesPiercings", "ItemBreast"], DefaultColor: ["#212121", "Default", "Default"], Layer: [ - { Name: "Dress" }, - { Name: "Frills" }, - { Name: "Apron" }, - ] }, - { Name: "StudentOutfit1", Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 560]] }], Hide: ["ItemNeck", "ItemHidden"], HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "ClothLowerTutu", "ClothAccessoryPoncho", "NecklaceCatsuitCollar"], Layer: [ - { Name: "Dress" }, - { Name: "Shirt" }, - { Name: "Buckle", HideForPose: ["", "AllFours", "Hogtied"] }, - { Name: "Bow" }, - ], - }, - { Name: "StudentOutfit2", Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 560]] }], Hide: ["ItemHidden"], HideItem: ["ItemArmsLeatherCuffs", "ItemArmsFuturisticCuffs", "ItemArmsOrnateCuffs", "ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "ClothLowerTutu", "ClothAccessoryPoncho"] }, - { - Name: "StudentOutfit3", Hide: ["ItemHidden"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ClothAccessoryPoncho"], Layer: [ - { Name: "White" }, - { Name: "Color" } - ], - Require: ["ClothLower", "ClothAccessory"] - }, - { Name: "BabydollDress1", Fetish: ["ABDL"], Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 560]] }], HideItem: ["ClothLowerLatexSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons", "ClothLowerTutu"], Layer: [ - { Name: "Dress"}, - { Name: "Trim"} - ] }, - { Name: "TeacherOutfit1", Hide: ["ItemNeck", "ItemHidden"], HideItem: ["ItemArmsLeatherCuffs", "ItemArmsFuturisticCuffs", "ItemArmsOrnateCuffs", "ClothLowerLatexSkirt1", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothAccessoryPoncho", "NecklaceCatsuitCollar", "ItemArmsBondageBra"], AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "AllFours", "OverTheHead", "KneelingSpread"] }, - { Name: "ChineseDress1", HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothLowerTutu"] }, - { Name: "ChineseDress2", Value: 60, DefaultColor: ["Default", "#858585"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons"], Extended: true, - Layer: [ - { Name: "Dress", AllowColorize: true }, - { Name: "Edges", AllowColorize: true, HasType: false}, - ] - }, - { Name: "TShirt1", HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons"], Require: ["ClothLower"] }, - { - Name: "TShirt2", Value: 25, DefaultColor: ["#333", "Default"], Hide: ["Bra"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ItemBreastRibbons", "ItemArmsBondageBra"], Require: ["ClothLower"], Extended: true, - Layer: [ - { Name: "Shirt", AllowColorize: true, HasType: false }, - { Name: "Print", AllowTypes: ["BCLogo","BDSM","Gag","Knot","Rock","Smile","Tick"], AllowColorize: true, ParentGroup: null }, - ] - }, - { Name: "TennisShirt1", Hide: ["ItemHidden"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ClothAccessoryPoncho", "NecklaceCatsuitCollar"], Require: ["ClothLower"] }, - { Name: "Sweater1", HideItem: ["ItemArmsLeatherCuffs", "ItemArmsFuturisticCuffs", "ItemArmsOrnateCuffs", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothLowerTutu", "ClothAccessoryPoncho", "NecklaceCatsuitCollar"], Require: ["ClothLower"] }, - { Name: "MistressTop", Fetish: ["Leather"], Value: -1, Bonus: "KidnapDomination", Hide: ["Bra"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump"], Require: ["ClothLower"] }, - { Name: "AdultBabyDress1", Fetish: ["ABDL"], Value: 60, Hide: ["ItemHidden"], HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerTutu", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons", "ClothAccessoryPoncho"], Layer: [ - { Name: "Dress"}, - { Name: "Sash"}, - { Name: "Trim"} - ] }, - { - Name: "AdultBabyDress2", Fetish: ["ABDL"], Value: 80, HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons", "ClothLowerTutu", "ClothAccessoryPoncho"], Layer: [ - { Name: "Dress" }, - { Name: "Lace" }, - { Name: "Bow" }, - ] - }, - { - Name: "AdultBabyDress3", Fetish: ["ABDL"], Value: 40, HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons", "ClothLowerTutu"], Layer: [ - { Name: "Dress" }, - { Name: "Belt" }, - { Name: "Collar" }, - ] - }, - { Name: "AdultBabyDress4", Fetish: ["ABDL"], Value: 80, Left: 100, Top: 190, HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "ClothLowerTutu", "ClothAccessoryPoncho"] }, - { Name: "NurseUniform", Value: -1, Bonus: "KidnapDomination", HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothLowerTutu", "ClothAccessoryPoncho", "ItemArmsBondageBra"] }, - { Name: "Robe1", Value: 30, Hide: ["ItemHidden"], HideItem: ["ClothLowerLatexSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothLowerTutu", "ClothAccessoryPoncho"] }, - { Name: "SuspenderTop1", Fetish: ["Lingerie"], Priority: 25, Value: 50, Hide: ["Panties", "ItemVulva", "ItemVulvaPiercings"], Expose: ["ItemNipples", "ItemNipplesPiercings", "ItemBreast"] }, - { Name: "LeatherCorsetTop1", Fetish: ["Leather"], DynamicGroupName: "Corset", BuyGroup: "LeatherCorsetTop1", Priority: 25, Value: 60, HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump"], AllowPose: ["Hogtied", "AllFours"] }, - { - Name: "FlowerDress", Value: 50, HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerTutu", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons"], - AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "AllFours", "OverTheHead", "Suspension"], - Layer: [ - { Name: "Dress", AllowColorize: true }, - { Name: "Flower", AllowColorize: false } - ] - }, - { Name: "Dress2", Value: 100, HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons"] }, - { Name: "LaceBabydoll", Fetish: ["Lingerie"], Value: 40, HideItem: ["ItemNipplesLactationPump"] }, - { Name: "SleevelessTop", Fetish: ["Lingerie"], Value: 20, HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump"] }, - { - Name: "DressFur", Value: 70, HideItem: ["ClothLowerTutu", "ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - Layer: [ - { Name: "Fabric" }, - { Name: "Fur" } - ] - }, - { Name: "BodyTowel1", Value: 30, HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerTutu", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"] }, - { Name: "Yukata1", Value: 50, HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerTutu", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemArmsLeatherCuffs", "ItemArmsFuturisticCuffs", "ItemArmsOrnateCuffs", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"] }, - { Name: "SteampunkCorsetTop1", Fetish: ["Leather"], DynamicGroupName: "Corset", BuyGroup: "SteampunkCorsetTop1", Priority: 25, Value: 70, Hide: ["ItemHidden"], HideItem: ["ClothLowerTennisSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ClothAccessoryPoncho", "NecklaceCatsuitCollar", "NecklaceBodyChainNecklace"], AllowPose: ["Hogtied", "AllFours", "OverTheHead"] }, - { Name: "BondageDress1", BuyGroup: "BondageDress1", Value: 90, Hide: ["ClothLower"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"] }, - { Name: "BondageDress2", BuyGroup: "BondageDress2", Value: 90, Hide: ["ClothLower"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"] }, - { Name: "ShoulderlessTop", Value: 40, HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ClothAccessoryPoncho"] }, - { Name: "Dress3", Value: 80, Hide: ["ClothLower"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"] }, - { Name: "ComfyTop", Value: 60, Hide: ["ItemNipples", "ItemNipplesPiercings"], HideItem: ["ClothAccessoryPoncho", "ItemArmsBondageBra"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"] }, - { Name: "WeddingDress1", Fetish: ["Lingerie"], Priority: 22, Value: 150, Hide: ["ClothLower", "Garters", "BodyLower", "Panties", "Shoes", "ItemBoots", "RightAnklet", "LeftAnklet", "ItemNipples"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemFeetFuturisticAnkleCuffs", "ItemFeetFuturisticAnkleCuffs","ItemLegsLeatherLegCuffs", "ItemLegsFuturisticLegCuffs", "ItemDevicesWoodenHorse", "ItemFeetSpreaderMetal", "ItemFeetSpreaderDildoBar", "ItemFeetSpreaderVibratingDildoBar", "ItemLegsOrnateLegCuffs", "ItemFeetOrnateAnkleCuffs", "ItemDevicesSaddleStand", "ItemVulvaWandBelt", "ItemFeetAnkleShackles", "ItemFeetIrish8Cuffs", "ItemFeetBallChain", "ItemPelvisDiaperHarness"], AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "LegsClosed", "Kneel", "KneelingSpread", "AllFours","OverTheHead"] }, - { Name: "WeddingDress2", Fetish: ["Lingerie"], Priority: 22, Value: 150, Hide: ["ClothLower", "Garters", "BodyLower", "Panties", "Shoes", "ItemBoots", "RightAnklet", "LeftAnklet", "ItemNipples"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemFeetFuturisticAnkleCuffs", "ItemFeetFuturisticAnkleCuffs","ItemLegsFuturisticLegCuffs", "ItemLegsLeatherLegCuffs", "ItemDevicesWoodenHorse", "ItemFeetSpreaderMetal", "ItemFeetSpreaderDildoBar", "ItemFeetSpreaderVibratingDildoBar", "ItemLegsOrnateLegCuffs", "ItemFeetOrnateAnkleCuffs", "ItemDevicesSaddleStand", "ItemVulvaWandBelt", "ItemFeetAnkleShackles", "ItemFeetIrish8Cuffs", "ItemFeetBallChain", "ItemPelvisDiaperHarness"], AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "OverTheHead", "LegsClosed", "Kneel", "KneelingSpread", "AllFours"] }, - { Name: "BridesmaidDress1", Fetish: ["Lingerie"], Value: 100, Hide: ["ClothLower"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ItemLegsSlime"] }, - { Name: "Gown1", Value: 70, Random: false, HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ClothLowerTutu"] }, - { Name: "Gown2Top", Value: 90, Random: false, Left: 125, Top: 220, BuyGroup: "Gown2", HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Require: ["ClothLower"] }, - { Name: "Gown3", Value: 70, Random: false, Left: 99, Top: 194, HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesLactationPump", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothLowerTutu", "ClothAccessoryPoncho"] }, - { Name: "MaidApron1", Fetish: ["Lingerie"], Priority: 32, Value: -1, BuyGroup: "Maid", HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ClothLowerTutu"] }, - { Name: "MaidApron2", Fetish: ["Lingerie"], Priority: 32, Value: -1, BuyGroup: "Maid", HideItem: ["ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ClothLowerTutu"], Expose: ["ItemNipples", "ItemNipplesPiercings", "ItemBreast"] }, - { - Name: "AdmiralTop", Value: 30, Hide: ["ItemNeck", "ItemHidden"], HideItem: ["ItemArmsLeatherCuffs", "ItemArmsFuturisticCuffs", "ItemArmsOrnateCuffs", "ClothLowerLatexSkirt1", "ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerClothSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ClothAccessoryPoncho", "NecklaceCatsuitCollar", "ItemArmsBondageBra"], - Layer: [ - { Name: "Jacket" }, - { Name: "Trim" }, - { Name: "Shirt" } - ] - }, - { Name: "VirginKiller1", Value: 40, HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothLowerTutu", "NecklaceCatsuitCollar"] }, - { - Name: "ReverseBunnySuit", Fetish: ["Nylon", "Pet"], DynamicGroupName: "Suit", Value: 100, BuyGroup: "ReverseBunnySuit", Expose: ["ItemNipples", "ItemNipplesPiercings", "ItemBreast", "ItemTorso", "ItemTorso2",], HasType: false, Extended: true, - Layer: [ - { Name: "Suit", AllowColorize: true }, - { Name: "Gloves", AllowColorize: true, Priority: 28, AllowTypes: ["Gloves"] }, - { Name: "AltGloves", CopyLayerColor: "Gloves", Priority: 28, AllowTypes: ["AltGloves"] }, - ] - }, - { Name: "LeatherCropTop", Fetish: ["Leather"], Value: 60, Hide: ["ItemNipples", "ItemNipplesPiercings"], HideItem: ["NecklaceBodyChainNecklace", "ItemArmsBondageBra"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"] }, - { - Name: "CorsetShirt", Fetish: ["Lingerie"], Priority: 25, Value: 60, - HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ClothAccessoryPoncho", "NecklaceBodyChainNecklace"], - Layer: [ - { Name: "Shirt" }, - { Name: "Corset" } - ] - }, - { Name: "BondageBustier1", BuyGroup: "BondageDress1", Value: -1, HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons"] }, - { Name: "BondageBustier2", BuyGroup: "BondageDress2", Value: -1, HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "BraRibbons", "ItemBreastRibbons"] }, - { Name: "LeatherBolero", Fetish:["Leather"], Value: 60, Alpha: [{ Group: ["ItemNeck"], Masks: [[185, 215, 130, 65]] }], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemNipples", "ItemNipplesPiercings", "ItemBreast", "ItemTorso", "ItemTorso2",], HideItem: ["ItemNeckLeatherCollar", "ItemNeckLeatherCollarBell", "ItemNeckLeatherCollarBow", "ItemNeckSlaveCollar", "ItemNeckClubSlaveCollar", "ItemNeckShockCollar", "ItemNeckShockCollarRemote", "ItemNeckBatCollar", "ItemNeckPostureCollar", "ItemNeckSteelPostureCollar", "ItemNeckDogCollar", "ItemNeckSpikeCollar", "ItemNeckHighCollar", "ItemNeckLeatherChoker", "ItemNeckPetCollar", "ItemNeckMaidCollar", "ItemNeckBordelleCollar", "ItemNeckLoveLeatherCollar", "ItemNeckNobleCorsetCollar", "ItemNeckHeartCollar", "ItemNeckHighSecurityCollar", "ItemNeckOrnateCollar", "ItemNeckSlenderSteelCollar", "ItemNeckHeartLinkChoker", "ItemNeckNeckRope", "ItemNipplesStretchClovers"] }, - { - Name: "Bodice1", Value: 90, Top: 213, - HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump"], - HideForPose: ["Hogtied", "AllFours"], - Layer: [ - { Name: "Base" }, - { Name: "Trim" }, - { Name: "Pattern" } - ] - }, - { - Name: "SummerDress", Hide: ["ItemNipples", "ItemNipplesPiercings"], HideItem: [ "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothLowerTutu"], - Layer: [ - { Name: "Base" }, - { Name: "Layer4" }, - { Name: "Layer2" }, - { Name: "Layer3" }, - { Name: "Layer1" } - ] - }, - { - Name: "GrandMage", Value: 90, DefaultColor: ["#720DBB", "#3C0C5E", "#DFDFEC", "#682E0F", "#858482"], HideForPose: ["AllFours"], - HideItem: ["ClothAccessoryPoncho"], - Alpha: [ - { Group: ["ClothAccessory"], Masks: [[0, 500, 500, 500]] }, - { Group: ["ClothLower"], Masks: [[0, 0, 220, 500], [290, 0, 210, 500]] }, - ], - Layer: [ - { Name: "Base" }, - { Name: "BackSkirt", ParentGroup: null, Priority: 3, HideForPose: ["Hogtied"] }, - { Name: "Trim" }, - { Name: "Belt", HideForPose: ["Hogtied"] }, - { Name: "Buckle", HideForPose: ["Hogtied"] } - ] - }, - { - Name: "Blouse1", Value: 20, Top: 1, BuyGroup: "Blouse1", - Alpha: [{ Group: ["Panties", "ItemPelvis", "Bra", "Corset", "Suit"], Masks: [[0, 0, 230, 448], [268, 0, 232, 448]] },], - HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ItemArmsBondageBra", "NecklaceBodyChainNecklace"], - }, - { Name: "LatexTop", Value: 30, Hide: ["ItemNipples"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain"]}, - { Name: "LatexLacedSuit", Priority: 22, Value: 35, Hide: ["Corset", "ItemNipples"], HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump"], Extended: true}, - { - Name: "FurCoat", Value: 90, Hide: ["Corset", "ClothLower", "Bracelet"], HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothAccessoryPoncho", "ItemLegsSlime"], ParentGroup: null, Priority: 32, - Layer: [ - { Name: "Upper", Top: 0, Left: 0, AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "OverTheHead", "AllFours"] }, - { Name: "Lower", Top: 462, Left: 0, CopyLayerColor:"Upper", AllowPose: ["Spread", "KneelingSpread", "LegsClosed", "Kneel"], HideForPose: ["Hogtied", "AllFours"] }, - ] - }, - { - Name: "FuzzyDress", Value: 70, Priority: 32, Top: 0, Left: 0, DefaultColor: ["#cf2828", "#666"], - HideItemAttribute: ["Skirt"], - HideItem: ["ClothLowerPajama1", "ClothLowerHaremPants", "ClothAccessoryPoncho"], - HideForPose: ["Hogtied", "AllFours", "KneelingSpread", "OverTheHead"], - Layer: [ - { Name: "Dress", AllowPose: [], Priority: 26 }, - { Name: "TopFur", AllowPose: ["Yoked"] }, - { Name: "BottomFur", CopyLayerColor: "TopFur", AllowPose: [] }, - ], - Alpha: [ - { Group: ["ClothLower"], Masks: [[0, 320, 500, 300]] }, - ], - }, - { - Name: "CropTop", Value: 40, AllowPose: ["Hogtied"], HideForPose: ["AllFours"], - Hide: ["ItemNipplesPiercings"], - HideItem: ["ItemNipplesLactationPump"], - Layer: [ - { Name: "Blouse" }, - { Name: "Design" }, - ], - }, - { - Name: "Laurel", Value: 50, Priority: 25, AllowPose: ["Hogtied", "OverTheHead"], HideForPose: ["AllFours"], - HideItem: ["ItemNipplesLactationPump"], - Layer: [ - { Name: "Base" }, - { Name: "Design" }, - { Name: "Lace" }, - ], - }, - { - Name: "SeethroughTop", Value: 50, Priority: 25, AllowPose: ["Hogtied"], HideForPose: ["AllFours"], - HideItem: ["ItemNipplesLactationPump"], - Layer: [ - { Name: "Lace" }, - { Name: "Design" }, - ], - }, - { - Name: "Jacket", Value: 40, Priority: 30, ParentGroup: null, Extended: true, - HideItem: ["ClothAccessoryPoncho", "ClothAccessoryCape"], - Layer: [ - { Name: "Base", HasType: false, }, - { Name: "Hood", HasType: false, Priority: 54, AllowTypes: ["Hooded", "HoodedEarsOut"], AllowPose: [], CopyLayerColor: "Base", }, - ], - }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ClothAccessory", - Priority: 32, - Default: false, - Random: false, - Clothing: true, - PreviewZone: [0, 200, 500, 500], - Asset: [ - { Name: "StudentOutfit3Scarf", Priority: 34, Left: 200, Top: 250 }, - { Name: "StudentOutfit3Bow1", Priority: 34, Left: 200, Top: 250 }, - { Name: "StudentOutfit3Bow2", Priority: 34, Left: 200, Top: 250 }, - { Name: "StudentOutfit3Bow3", Priority: 34, Left: 200, Top: 250 }, - { - Name: "Bouquet", Priority: 41, Value: 40, Left: 175, Top: 350, BuyGroup: "Bouquet", AllowPose: ["BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "OverTheHead"], Hide: ["Bracelet"], - Layer: [ - { Name: "Base" }, - { Name: "Flowers" } - ] - }, - { Name: "FrillyApron", Fetish: ["Lingerie"], ParentGroup: "BodyUpper", Value: -1, Left: 135, Top: 179, BuyGroup: "Maid", AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "OverTheHead"] }, - { Name: "BunnyCollarCuffs", Fetish: ["Pet"], ParentGroup: "BodyUpper", Value: 10, AllowPose: ["AllFours", "TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "OverTheHead"], Extended: true, - Layer: [ - { Name: "Collar"}, - { Name: "Bow"}, - { Name: "Cuffs"} - ] - }, - { Name: "Camera1", Priority: 41, Value: -1, Left: 175, Top: 225, Bonus: "KidnapSneakiness", AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "OverTheHead"] }, - { - Name: "Cape", Priority: 41, Value: 40, AllowPose: ["AllFours", "Hogtied", "Kneel"], - Layer: [ - { Name: "Back", Priority: 6 }, - { Name: "Front", Priority: 41 } - ] - }, - { Name: "LeatherStraps", Fetish: ["Leather"], ParentGroup: "BodyUpper", Value: 25, AllowPose: ["AllFours"], Extended: true }, - { Name: "FurBolero", Priority: 34, Value: 25, AllowPose: ["AllFours", "BackElbowTouch", "OverTheHead", "Hogtied", "Yoked", "BackCuffs"], }, - { Name: "FacePaint", Value: 10, Left: 150, Top: 20, Priority: 7, BuyGroup: "FacePaint", DefaultColor: ["#9A7F76"], Hide: ["Head"] }, - { - Name: "Bib", Fetish: ["ABDL"], Priority: 34, Value: 5, Left: 179, Top: 220, Extended: true, DynamicAfterDraw: true, - Layer: [ - {Name: "Base", HasType: false}, - {Name: "Trim", HasType: false}, - {Name: "Pacis", Left: 194, Top: 232, HasType: false, AllowModuleTypes: ["p1"] }, - {Name: "Strawberries", Left: 195, Top: 229, HasType: false, CopyLayerColor: "Pacis", AllowModuleTypes: ["p2"] }, - {Name: "PawPrints", Left: 193, Top: 229, HasType: false, CopyLayerColor: "Pacis", AllowModuleTypes: ["p3"] }, - {Name: "Cows", Left: 191, Top: 228, HasType: false, CopyLayerColor: "Pacis", AllowModuleTypes: ["p4"] }, - {Name: "Hearts", Left: 194, Top: 228, HasType: false, CopyLayerColor: "Pacis", AllowModuleTypes: ["p5"] }, - {Name: "Text", HasImage: false} - ] - }, - { Name: "Scarf", Priority: 41, Value: 7, DefaultColor: ["#B1B1B1"], Extended: true }, - { - Name: "Glitter", Value: 10, Priority: 8, BuyGroup: "Glitter", Left: 150, Top: 20, DefaultColor:["#DCA07C","#DCA07C"], Extended: true, BodyCosplay: true, - Layer:[ - {Name: "Freckles", HasType: false, AllowTypes:[""]}, - {Name: "Freckles2", HasType: false, AllowTypes:[""]}, - {Name: "MidFreckles", HasType: false, AllowTypes:["MidFreckles"], CopyLayerColor: "Freckles"}, - {Name: "SplitFreckles", HasType: false, AllowTypes:["SplitFreckles"], CopyLayerColor: "Freckles"}, - {Name: "SplitFreckles2", HasType: false, AllowTypes:["SplitFreckles"], CopyLayerColor: "Freckles2"}, - {Name: "FrecklesSmall", HasType: false, AllowTypes:["FrecklesSmall"], CopyLayerColor: "Freckles"}, - {Name: "Freckles2Small", HasType: false, AllowTypes:["FrecklesSmall"], CopyLayerColor: "Freckles2"}, - {Name: "MidFrecklesSmall", HasType: false, AllowTypes:["MidFrecklesSmall"], CopyLayerColor: "Freckles"}, - {Name: "SplitFrecklesSmall", HasType: false, AllowTypes:["SplitFrecklesSmall"], CopyLayerColor: "Freckles"}, - {Name: "SplitFreckles2Small", HasType: false, AllowTypes:["SplitFrecklesSmall"], CopyLayerColor: "Freckles2"}, - {Name: "StarsLeft", HasType: false, AllowTypes:["StarsBoth", "StarsLeft"], CopyLayerColor: "Freckles2"}, - {Name: "StarsLeft2", HasType: false, AllowTypes:["StarsBoth", "StarsLeft"], CopyLayerColor: "Freckles"}, - {Name: "StarsRight", HasType: false, AllowTypes:["StarsBoth", "StarsRight"], CopyLayerColor: "Freckles2"}, - {Name: "StarsRight2", HasType: false, AllowTypes:["StarsBoth", "StarsRight"], CopyLayerColor: "Freckles"}, - {Name: "DotsLeft", HasType: false, AllowTypes:["DotsBoth", "DotsLeft"], CopyLayerColor: "Freckles"}, - {Name: "DotsLeft2", HasType: false, AllowTypes:["DotsBoth", "DotsLeft"], CopyLayerColor: "Freckles2"}, - {Name: "DotsRight", HasType: false, AllowTypes:["DotsBoth", "DotsRight"], CopyLayerColor: "Freckles"}, - {Name: "DotsRight2", HasType: false, AllowTypes:["DotsBoth", "DotsRight"], CopyLayerColor: "Freckles2"}, - ] - }, - { Name: "CatsuitCollar", Priority: 15, Value: -1, BuyGroup: "Catsuit"}, - { - Name: "Poncho", Value: 20, ParentGroup: "BodyUpper", DefaultColor: "#25d", - AllowPose: ["Yoked", "OverTheHead", "BackElbowTouch"], - HideForPose: ["AllFours"], - Layer: [ - { Name: "Back", Priority: 6, HideForPose: ["Hogtied"] }, - { Name: "Front", Priority: 34, CopyLayerColor: "Back" }, - ] - } - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Necklace", - ParentGroup: "BodyUpper", - Priority: 31, - Default: false, - Clothing: true, - PreviewZone: [165, 170, 170, 170], - Asset: [ - { Name: "Necklace1", Value: 40, Left: 148, Top: 70, ParentGroup: null }, - { Name: "Necklace2", Left: 147, Top: 90, ParentGroup: null }, - { Name: "Necklace3", Left: 147, Top: 110, ParentGroup: null }, - { Name: "Necklace4", Value: 30, Left: 147, Top: 110, ParentGroup: null }, - { - Name: "NecklaceLock", Fetish: ["Metal"], Value: 40, Left: 155, Top: 152, ParentGroup: null, Extended: true, - Layer: [ - { Name: "Chain", HasType: false }, - { Name: "Lock", HasType: false }, - ] - }, - { - Name: "NecklaceKey", Fetish: ["Metal"], Value: 40, Left: 153, Top: 152, ParentGroup: null, Extended: true, - Layer: [ - { Name: "Chain", HasType: false }, - { Name: "Key", HasType: false }, - ] - }, - { - Name: "IDCard", Value: 10, Left: 145, Top: 180, ParentGroup: null, - Layer: [ - { Name: "String" }, - { Name: "Card" } - ] - - }, - { Name: "BlackHeart", Value: 40, Left: 148, Top: 70, ParentGroup: null }, - { - Name: "NecklaceBallGag", Value: -1, Priority: 43, DefaultColor: "#BC3030", BuyGroup: "BallGag", Left: 150, Top: 10, ParentGroup: null, Layer: [ - { Name: "Strap" }, - { Name: "Ball" }, - ] - }, - { Name: "FurScarf", BuyGroup: "FurScarf", Priority: 35, Value: 40, Left: 0, Top: 0, ParentGroup: null }, - { Name: "ElegantHeartNecklace", Value: 30, Left:155, Top: 152, ParentGroup: null, - Layer: [ - { Name: "Necklace", AllowColorize: true }, - { Name: "Jewels", AllowColorize: true }, - ] - }, - { Name: "Bandana", Value: 15, Left: 148, Top: 97, BuyGroup: "ScarfGag", ParentGroup: null}, - { - Name: "FlowerGarland", Value: 10, Left: 0, Top: -18, DefaultColor: ["#AC5B9D", "#E4E988"], ParentGroup: null, Layer: [ - { Name: "Petals" }, - { Name: "Center" }, - ] - }, - { Name: "NecklaceRope", Priority: 29, Value: -1, Left: 220, Top: 200, DefaultColor: "#956B1C", BuyGroup: "HempRope", CraftGroup: "HempRope", ParentGroup: null, Extended: true }, - { Name: "ChokerTattoo", Priority: 29, Value: 5, Left: 230, Top: 200, DefaultColor: "#444444", ParentGroup: null, Extended: true }, - { Name: "CatsuitCollar", Priority: 31, Value: -1, Left: 148, Top: 97, BuyGroup: "Catsuit", ParentGroup: null}, - { - Name: "BodyChainNecklace", Priority: 29, Value: 50, DefaultColor: ["#d1951f", "#d1951f"], HideForPose: ["AllFours"], - PoseMapping: { Hogtied: "BackElbowTouch" }, - Layer: [ - { Name: "Chains", AllowPose: ["Hogtied", "OverTheHead", "Yoked", "BackElbowTouch", "BackCuffs"] }, - { Name: "Choker", ParentGroup: null }, - ], - }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Suit", - ParentGroup: "BodyUpper", - Priority: 14, - Default: false, - Random: false, - Clothing: true, - AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "OverTheHead"], - PreviewZone: [75, 150, 350, 350], - Asset: [ - { - Name: "Catsuit", Fetish: ["Latex"], Value: 100, BuyGroup: "Catsuit", HideItem: ["ItemNipplesChopStickNippleClamps"], Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HasType: false, Extended: true, - Layer: [ - { Name: "Base" }, - { Name: "Zip" }, - { Name: "Gloves", AllowColorize: true, Priority: 27, AllowTypes: ["Gloves"] }, - { Name: "AltGloves", CopyLayerColor: "Gloves", Priority: 27, AllowTypes: ["AltGloves"] }, - ] - }, - { - Name: "SeamlessCatsuit", Fetish: ["Latex"], Value: -1, BuyGroup: "Catsuit", HideItem: ["ItemNipplesChopStickNippleClamps"], Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HasType: false, Extended: true, - Layer: [ - { Name: "Suit", AllowColorize: true }, - { Name: "Gloves", AllowColorize: true, Priority: 27, AllowTypes: ["Gloves"] }, - { Name: "AltGloves", CopyLayerColor: "Gloves", Priority: 27, AllowTypes: ["AltGloves"] }, - ] - }, - { - Name: "SleevelessCatsuit", Fetish: ["Latex"], Value: -1, BuyGroup: "Catsuit", HideItem: ["ItemNipplesChopStickNippleClamps"], Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HasType: false, AllowPose: ["BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "OverTheHead"], - }, - { - Name: "PilotSuit", Fetish: ["Latex"], Value: 150, BuyGroup: "PilotSuit", DefaultColor: ["#3270C1", "#2B408B", "#969696", "#2B408B", "#2B408B"], HideItem: ["ItemNipplesChopStickNippleClamps"], HasType: false, Extended: true, - Layer: [ - { Name: "Layer1", AllowColorize: true }, - { Name: "Layer2", AllowColorize: true }, - { Name: "Layer3", AllowColorize: true }, - { Name: "Layer4", AllowColorize: true }, - { Name: "Gloves", AllowColorize: true, Priority: 27, AllowTypes: ["Gloves"] }, - { Name: "AltGloves", CopyLayerColor: "Gloves", Priority: 27, AllowTypes: ["AltGloves"] }, - ] - }, - { - Name: "SeethroughSuit", Fetish: ["Latex"], Value: 100, BuyGroup: "SeethroughSuit", HideItem: ["ItemNipplesChopStickNippleClamps"], Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HasType: false, Extended: true, - Layer: [ - { Name: "Suit", AllowColorize: true }, - { Name: "Gloves", AllowColorize: true, Priority: 27, AllowTypes: ["Gloves"] }, - { Name: "AltGloves", CopyLayerColor: "Gloves", Priority: 27, AllowTypes: ["AltGloves"] }, - ] - }, - { - Name: "SeethroughSuitZip", Fetish: ["Latex"], Value: -1, BuyGroup: "SeethroughSuit", HideItem: ["ItemNipplesChopStickNippleClamps"], Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HasType: false, Extended: true, - Layer: [ - { Name: "Base" }, - { Name: "Zip" }, - { Name: "Gloves", AllowColorize: true, Priority: 27, AllowTypes: ["Gloves"] }, - { Name: "AltGloves", CopyLayerColor: "Gloves", Priority: 27, AllowTypes: ["AltGloves"] }, - ] - }, - { - Name: "ReverseBunnySuit", Fetish: ["Latex", "Pet"], Value: 100, BuyGroup: "ReverseBunnySuit", Expose: ["ItemNipples", "ItemNipplesPiercings", "ItemBreast", "ItemTorso", "ItemTorso2",], HasType: false, Extended: true, - Layer: [ - { Name: "Suit", AllowColorize: true }, - { Name: "Gloves", AllowColorize: true, Priority: 27, AllowTypes: ["Gloves"] }, - { Name: "AltGloves", CopyLayerColor: "Gloves", Priority: 27, AllowTypes: ["AltGloves"] }, - ] - }, - { - Name: "Blouse1", Value: -1, Top: 1, Priority: 29, BuyGroup: "Blouse1", DynamicGroupName: "Cloth", - Alpha: [{ Group: ["Panties", "ItemPelvis", "Bra", "Corset"], Masks: [[0, 0, 230, 448], [268, 0, 232, 448]] },], - HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ItemArmsBondageBra", "NecklaceBodyChainNecklace"], - }, - { - Name: "SleevelessSlimLatexLeotard", Value: 50, Top: 0, Left: 0, Hide: ["Panties", "ItemNipples", "ItemVulvaPiercings", "ItemVulva"], HideItemExclude: ["ItemVulvaWiredEgg"], - PoseMapping: { Yoked: "", BackBoxTie: "", BackCuffs: "", BackElbowTouch: "", OverTheHead: "", TapedHands: "" }, - Layer: [ - { Name: "Latex" }, - { Name: "Shine", AllowColorize: false }, - { Name: "BreastShade", AllowColorize: false } - ] - }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ClothLower", - ParentGroup: "BodyLower", - ParentColor: "Cloth", - Priority: 26, - Default: false, - Clothing: true, - Left: 105, - Top: 380, - AllowPose: ["LegsClosed", "Kneel", "KneelingSpread", "Spread"], - PreviewZone: [0, 380, 500, 500], - Asset: [ - { Name: "Skirt1", Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 560]] }], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], }, - { - Name: "Skirt2", Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 560]] }], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], Layer: [ - { Name: "Color" }, - { Name: "Stripe" } - ], - ParentItem: "StudentOutfit3" - }, - { - Name: "Skirt3", HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "PantiesBulkyDiaper", "ItemPelvisBulkyDiaper"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], Layer: [ - { Name: "Color" }, - { Name: "Stripe" } - ], - ParentItem: "StudentOutfit3" - }, - { - Name: "TennisSkirt1", HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "PantiesBulkyDiaper", "ItemPelvisBulkyDiaper"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], Layer: [ - { Name: "Color" }, - { Name: "Stripe" }, - ], - ParentItem: "TennisShirt1" }, - { Name: "Jeans1", Priority: 23, Hide: ["ItemVulvaPiercings", "Garters"], HideItem: ["ItemButtAnalBeads2", "SocksSocksFur", "SocksSocks6", "ItemVulvaHempRopeBelt", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaHeavyWeightClamp", "ItemVulvaClitAndDildoVibratorbelt", "ItemVulvaShockDildo", "PantiesPoofyDiaper", "PantiesBulkyDiaper"] }, - { Name: "Shorts1", Hide: ["ItemVulvaPiercings"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaHempRopeBelt", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaHeavyWeightClamp", "ItemVulvaClitAndDildoVibratorbelt", "ItemVulvaShockDildo", "PantiesPoofyDiaper", "PantiesBulkyDiaper"] }, - { - Name: "Pajama1", Priority: 25, Random: false, Hide: ["Garters"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaClitAndDildoVibratorbelt", "PantiesPoofyDiaper", "PantiesBulkyDiaper"], Layer: [ - { Name: "Cloth" }, - { Name: "Stripe" }, - ], - }, - { Name: "MistressBottom", Fetish: ["Leather"], Value: -1, Hide: ["Panties"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaHeavyWeightClamp", "ItemVulvaClitAndDildoVibratorbelt", "ItemVulvaShockDildo", "ItemVulvaPenisDildo", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "Waspie1", Fetish: ["Leather"], Value: 60, HideForPose: ["KneelingSpread"], Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 165, 600], [335, 0, 165, 600], [0, 0, 500, 480]] }], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], }, - { Name: "Waspie2", Fetish: ["Leather"], Value: 80, HideForPose: ["KneelingSpread"], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], }, - { Name: "Waspie3", Fetish: ["Leather"], Value: 40, HideForPose: ["KneelingSpread"], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], }, - { Name: "LatexPants1", Fetish: ["Latex"], Priority: 21, Value: 60, Hide: ["ItemVulvaPiercings", "Garters"], HideItem: ["ItemButtAnalBeads2", "SocksSocksFur", "SocksSocks1", "SocksSocks2", "SocksSocks3", "SocksSocks4", "SocksSocks5", "SocksSocks6", "SocksStockings2", "SocksStockings3", "ItemVulvaHempRopeBelt", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaHeavyWeightClamp", "ItemVulvaClitAndDildoVibratorbelt", "ItemVulvaShockDildo", "PantiesPoofyDiaper", "PantiesBulkyDiaper"] }, - { Name: "LatexSkirt1", Fetish: ["Latex"], Value: 40, Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 540]] }], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], }, - { Name: "LatexSkirt2", Fetish: ["Latex"], Value: 60, Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 580]] }], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], }, - { - Name: "Tutu", Value: 30, Top: 370, Left: 40, DefaultColor: ["#845e9e", "#c385d0", "#e4d1fc", "#927D99", "#811790"], AllowPose: ["BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "OverTheHead"], HideForPose: ["KneelingSpread"], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], - PoseMapping: { Yoked: "OverTheHead", BackElbowTouch: "OverTheHead", BackCuffs: "OverTheHead", BackBoxTie: "OverTheHead" }, - Layer: [ - { Name: "Layer1", ParentGroup: "BodyUpper", ColorGroup: "Tutu" }, - { Name: "Layer2", ParentGroup: "BodyUpper", ColorGroup: "Tutu" }, - { Name: "Layer3", ParentGroup: "BodyUpper", ColorGroup: "Tutu" }, - { Name: "Layer4", ParentGroup: "BodyUpper", ColorGroup: "Tutu" }, - { Name: "Belt", ParentGroup: null, AllowPose: [] }, - { Name: "Shine", ParentGroup: null, AllowColorize: false, AllowPose: [] }, - ] - }, - { Name: "ClothSkirt1", Value: 40, Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 580]] }], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], }, - { Name: "Jeans2", Priority: 23, Value: 20, Hide: ["ItemVulvaPiercings", "Garters"], HideItem: ["ItemButtAnalBeads2", "SocksSocksFur", "SocksSocks6", "ItemVulvaHempRopeBelt", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaHeavyWeightClamp", "ItemVulvaClitAndDildoVibratorbelt", "ItemVulvaShockDildo", "PantiesPoofyDiaper", "PantiesBulkyDiaper"] }, - { Name: "ChineseSkirt1", Value: 40, HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], }, - { - Name: "Gown2Skirt", Value: -1, Random: false, Left: 50, Top: 462, BuyGroup: "Gown2", Hide: ["ItemFeet", "Garters", "ItemLegs"], SetPose: ["LegsClosed"], AllowActivePose: ["Kneel"], WhitelistActivePose: ["BaseLower", "Kneel"], ParentItem: "Gown2Top", Attribute: ["Skirt"], - HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemBootsThighHighLatexHeels, ItemBootsHighThighBoots", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ItemBootsSlime"], - HideItemExclude: ["ItemLegsHobbleSkirt", "ItemLegsLegBinder", "ItemLegsPlasticWrap", "ItemLegsRibbons"] - }, - { - Name: "AdmiralSkirt", Value: 30, Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 580]] }], AllowPose: ["KneelingSpread"], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], Layer: [ - { Name: "Cloth" }, - { Name: "Stripe" }, - ], - }, - { - Name: "HulaSkirt", Value: 30, Top: 350, Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 455]] }], DefaultColor: ["#40B90B", "#C46E9A", "#F5DC34"], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], AllowPose: ["KneelingSpread"], ParentGroup: null, Layer: [ - { Name: "BackLeaves", Priority: 3 }, - { Name: "FrontLeaves", CopyLayerColor: "BackLeaves" }, - { Name: "Flowers" }, - { Name: "Pollen" }, - ] - }, - { Name: "JeanSkirt", Value: 30, Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 580]] }], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Attribute: ["Skirt"], }, - { Name: "PencilSkirt", Fetish: ["Leather"], Value: 60, Left: 105, Top: 380, HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemLegsNylonRope", "ItemLegsHempRope", "ItemLegsLeatherBelt", "ItemLegsSturdyLeatherBelts", "ItemLegsDuctTape", "ItemLegsLeatherLegCuffs", "ItemLegsOrnateLegCuffs", "ItemLegsFuturisticLegCuffs", "ItemLegsZipties", "ItemLegsChains", "ItemFeetSpreaderMetal", "ItemFeetSpreaderDildoBar", "ItemFeetSpreaderVibratingDildoBar", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "GartersTentacles", "ItemLegsTentacles"], SetPose: ["LegsClosed"], AllowActivePose: ["Kneel"], WhitelistActivePose: ["BaseLower", "Kneel"], HideForPose: ["KneelingSpread"], Attribute: ["Skirt"], }, - { Name: "JeansShorts", Value: 20, Priority: 22, Hide: ["ItemVulvaPiercings"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaHempRopeBelt", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaHeavyWeightClamp", "ItemVulvaClitAndDildoVibratorbelt", "ItemVulvaShockDildo", "PantiesPoofyDiaper", "PantiesBulkyDiaper"] }, - { - Name: "Leggings1", Value: 15, Priority: 21, DefaultColor: "#4499c4", Hide: ["ItemVulvaPiercings", "Panties"], HideItem: ["ItemButtAnalBeads2", "SocksSocksFur", "SocksSocks4", "SocksSocks5", "SocksSocks6", "ItemVulvaVibratingLatexPanties", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaTapeStrips", "ItemVulvaBenWaBalls", "ItemVulvaHeavyWeightClamp", "ItemVulvaShockDildo"], Layer: [ - { Name: "Cloth" }, - { Name: "Stripe" } - ] - }, - { - Name: "Leggings2", Value: 20, Priority: 21, DefaultColor: "#4499c4", Hide: ["ItemVulvaPiercings", "Panties"], HideItem: ["ItemButtAnalBeads2", "SocksSocksFur", "SocksSocks1", "SocksSocks2", "SocksSocks3", "SocksSocks4", "SocksSocks5", "SocksSocks6", "ItemVulvaVibratingLatexPanties", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaTapeStrips", "ItemVulvaBenWaBalls", "ItemVulvaHeavyWeightClamp", "ItemVulvaShockDildo"], Layer: [ - { Name: "Cloth" }, - { Name: "Stripe" } - ] - }, - { - Name: "PleatedSkirt", Value: 35, Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 570]] }], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Attribute: ["Skirt"], Layer: [ - { Name: "Dress" }, - { Name: "Stripe" } - ] - }, - { - Name: "MageSkirt", Value: 35, Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 500, 570]] }], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], Attribute: ["Skirt"], Layer: [ - { Name: "Skirt", ParentGroup: null, AllowColorize: true }, - { Name: "Waist", ParentGroup: null, AllowColorize: true }, - ], PoseMapping: { 'LegsClosed':'', 'Kneel':'', 'Spread': '' } - }, - { - Name: "LongSkirt1", Value: 40, Left: 69, ParentGroup: null, - Attribute: ["Skirt"], - HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], - AllowPose: ["Kneel"], - HideForPose: ["KneelingSpread"], - Layer: [ - { Name: "Back" }, - { Name: "Front", CopyLayerColor: "Back", Priority: 29 }, - ], - }, - { Name: "ShortPencilSkirt", Fetish: ["Leather"], Value: 50, Left: 105, Top: 380, Alpha: [{ Group: ["Panties", "ItemPelvis"], Masks: [[0, 0, 180, 600], [320, 0, 180, 600], [0, 0, 500, 480]] }], HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "ItemFeetSpreaderMetal", "ItemFeetSpreaderDildoBar", "ItemFeetSpreaderVibratingDildoBar"], SetPose: ["LegsClosed"], AllowActivePose: ["Kneel"], WhitelistActivePose: ["BaseLower", "Kneel"], HideForPose: ["KneelingSpread"], Attribute: ["Skirt"], }, - { - Name: "HaremPants", Fetish: ["Lingerie"], Value: 20, BuyGroup: "HaremPants", Hide: ["Panties"], AllowPose: ["KneelingSpread"], - Layer: [ - { Name: "Panty", Priority: 15 }, - { Name: "Veil" }, - { Name: "Pantyline" }, - ], - }, - { - Name: "HaremPants2", Fetish: ["Lingerie"], Value: 20, BuyGroup: "HaremPants", Hide: ["Panties"], Layer: [ - { Name: "Panty", Priority: 15 }, - { Name: "Fabric" }, - { Name: "PantyLine" }, - { Name: "Veil" }, - { Name: "Buttons" }, - ], - }, - { Name: "ShortPlaidSkirt", Value: 40, HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], }, - { - Name: "CollegeSkirt", Value: -1, BuyGroup: "CollegeOutfit", ParentItem: "CollegeOutfit1", - HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds"], - AllowPose: ["KneelingSpread"], - Attribute: ["Skirt"], - }, - { - Name: "BondageSkirt", Value: 90, Priority: 28, Left: 0, Top: 0, Attribute: ["Skirt"], DefaultColor: ["Default", "#25d", "#25d"], - SetPose: ["LegsClosed"], - AllowActivePose: ["Kneel"], - WhitelistActivePose: ["BaseLower", "Kneel"], - HideForPose: ["Spread", "KneelingSpread"], - Effect: ["Slow"], - FreezeActivePose: ["BodyLower"], - HideItem: ["ItemFeetSlime"], - Layer: [ - { Name: "Skirt" }, - { Name: "Frill" }, - { Name: "Straps", AllowPose: [] }, - ], - Alpha: [ - { Group: ["ItemBoots", "Shoes"], Masks: [[75, 0, 350, 800]] } - ] - }, - { - Name: "AsymmetricSkirt", Value: 80, Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], Left: 0, - Hide: ["ItemFeet"], - HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - HideItemExclude: ["ItemFeetLeatherAnkleCuffs", "ItemFeetSteelAnkleCuffs", "ItemFeetFuturisticAnkleCuffs", "ItemFeetOrnateAnkleCuffs", "ItemFeetWoodenCuffs", ""], - AllowPose: ["Kneel", "KneelingSpread"], - Layer: [ - { Name: "Back", ParentGroup: null, Priority: 6 }, - { Name: "Front", CopyLayerColor: "Back" }, - ], - }, - { - Name: "ElegantSkirt", Value: 80, Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], Left: 0, - Hide: ["ItemFeet"], - HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - AllowPose: ["Kneel", "KneelingSpread"], - Layer: [ - { Name: "Skirt" }, - { Name: "Design" }, - ], - Alpha: [ - { Pose: ["KneelingSpread"], Group: ["BodyLower", "Socks", "Shoes", "SuitLower", "Garters"], Masks: [[0, 462, 500, 538]] } - ] - }, - { - Name: "RuffledSkirt", Value: 80, Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Attribute: ["Skirt"], Left: 0, - Hide: ["ItemFeet"], - HideItem: ["ItemDevicesStrapOnSmooth", "ItemDevicesStrapOnStuds", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - AllowPose: ["Kneel", "KneelingSpread"], - Alpha: [ - { Pose: ["KneelingSpread"], Group: ["BodyLower", "Socks", "Shoes", "SuitLower", "Garters"], Masks: [[0, 462, 500, 538]] } - ] - }, - ], - Color: ["Default", "#bbbbbb", "#808080", "#202020", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "SuitLower", - ParentGroup: "BodyLower", - Priority: 14, - Default: false, - Clothing: true, - Random: false, - Left: 95, - Top: 380, - AllowPose: ["LegsClosed", "Kneel", "KneelingSpread", "Spread", "Hogtied"], - PreviewZone: [0, 450, 500, 500], - Asset: [ - { - Name: "Catsuit", Fetish: ["Latex"], Value: -1, BuyGroup: "Catsuit", Hide: ["ItemVulvaPiercings", "BodyLower"], HideItem: ["SocksPantyhose1"], - Layer: [ - { Name: "Base" }, - { Name: "Zip" } - ] - }, - { Name: "SeamlessCatsuit", Fetish: ["Latex"], Value: -1, BuyGroup: "Catsuit", Hide: ["ItemVulvaPiercings", "BodyLower"], HideItem: ["SocksPantyhose1"] }, - { Name: "CatsuitPanties", Fetish: ["Latex"], Value: -1, BuyGroup: "Catsuit", Hide: ["ItemVulvaPiercings"], AllowPose: ["Hogtied"] }, - { Name: "PilotSuit", Fetish: ["Latex"], Value: -1, BuyGroup: "PilotSuit", DefaultColor: ["#3270C1", "#2B408B", "#969696", "#282828"], Hide: ["ItemVulvaPiercings", "BodyLower"], HideItem: ["SocksPantyhose1"], - HideForPose: ["KneelingSpread"], - Layer: [ - { Name: "Layer1", AllowColorize: true }, - { Name: "Layer2", AllowColorize: true }, - { Name: "Layer3", AllowColorize: true }, - { Name: "Layer4", AllowColorize: true } - ] - }, - { Name: "PilotPanties", Fetish: ["Latex"], Value: -1, BuyGroup: "PilotSuit", DefaultColor: ["#3270C1", "#2B408B", "#969696", "#282828"], Hide: ["ItemVulvaPiercings"], DynamicGroupName: "Panties", AllowPose: [], - Layer: [ - { Name: "Layer1", AllowColorize: true }, - { Name: "Layer2", AllowColorize: true }, - { Name: "Layer3", AllowColorize: true }, - ] - }, - { Name: "SeethroughSuit", Fetish: ["Latex"], Value: -1, BuyGroup: "SeethroughSuit", HideItem: ["SocksPantyhose1"] }, - { - Name: "SeethroughSuitZip", Fetish: ["Latex"], Value: -1, BuyGroup: "SeethroughSuit", HideItem: ["SocksPantyhose1"], - Layer: [ - { Name: "Base" }, - { Name: "Zip" } - ] - }, - { Name: "ReverseBunnySuit", Fetish: ["Latex", "Pet"], Value: -1, BuyGroup: "ReverseBunnySuit" }, - { Name: "Pantyhose1", Fetish: ["Nylon"], Value: 10, Left: 125, Top: 400, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo"], BuyGroup: "Pantyhose", Block: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], DynamicGroupName: "Socks" }, - { Name: "Pantyhose2", Fetish: ["Nylon"], Value: 10, Left: 125, Top: 400, BuyGroup: "Pantyhose2", DynamicGroupName: "Socks" }, - { Name: "Stockings1", Fetish: ["Nylon"], Left: 125, Top: 400, BuyGroup: "Stockings1", DynamicGroupName: "Socks" }, - { Name: "Stockings2", Fetish: ["Nylon"], Left: 125, Top: 400, BuyGroup: "Stockings2", DynamicGroupName: "Socks" }, - { Name: "Stockings3", Fetish: ["Nylon"], Value: 10, Left: 125, Top: 400, BuyGroup: "Stockings3", DynamicGroupName: "Socks" }, - { Name: "Stockings4", Fetish: ["Nylon"], Value: 10, Left: 125, Top: 400, BuyGroup: "Stockings4", DynamicGroupName: "Socks" }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Bra", - ParentGroup: "BodyUpper", - Priority: 21, - Clothing: true, - Underwear: true, - Left: 150, - Top: 200, - AllowPose: ["Yoked", "Hogtied"], - PreviewZone: [75, 190, 350, 350], - Asset: [ - { Name: "Bra1", Hide: ["ItemNipples"], }, - { Name: "Bra2", Hide: ["ItemNipples"] }, - { Name: "Bra7", Priority: 20, Hide: ["ItemNipples"] }, - { Name: "Bra8", Value: 15, Hide: ["ItemNipples"] }, - { Name: "Bra9", Value: 10, Hide: ["ItemNipples"] }, - { Name: "Bandeau1", Fetish: ["Lingerie"], Priority: 20, Value: 25, Hide: ["ItemNipples"] }, - { Name: "MaidBra1", Fetish: ["Lingerie"], Value: -1, BuyGroup: "Maid", Hide: ["ItemNipples"], - DefaultColor: ["#212121", "Default"], - Layer:[ - { Name: "Bra" }, - { Name: "Frills" }, - ] - }, - { Name: "Bustier1", Fetish: ["Lingerie"], Value: 30, Hide: ["ItemNipples"] }, - { - Name: "Bikini1", Value: 25, Hide: ["ItemNipples"], - PoseMapping: { Hogtied: "", Yoked: "" } - }, - { Name: "SexyBikini1", Value: 50, Hide: ["ItemNipples"], Extended: true, - Layer:[ - { Name: "Main", AllowColorize: true}, - { Name: "Sides", AllowColorize: true} - ] - }, - { Name: "SexyBikini2", Value: 40, Hide: ["ItemNipples"] }, - { Name: "SexyBikini3", Value: 45, Hide: ["ItemNipples"] }, - { Name: "Swimsuit1", Value: 15, Hide: ["Panties", "ItemNipples", "ItemVulvaPiercings", "ItemVulva"], Extended: true }, - { Name: "Swimsuit2", Value: 25, Hide: ["Panties", "ItemNipples", "ItemVulvaPiercings", "ItemVulva"] }, - { Name: "BunnySuit", Fetish: ["Nylon", "Pet"], Value: 30, Hide: ["Panties", "ItemNipples", "ItemVulvaPiercings", "ItemVulva"] }, - { - Name: "LatexBunnySuit", Top: 0, Left: 0, Fetish: ["Latex", "Pet"], AllowPose: ["Hogtied"], DefaultColor: "#6C33AE", Value: 30, Hide: ["Panties", "ItemNipples", "ItemVulvaPiercings", "ItemVulva"], - Layer: [ - { Name: "Bottom", AllowColorize: true, HideForPose: ["Hogtied"] }, - { Name: "BottomShine", AllowColorize: false, HideForPose: ["Hogtied"] }, - { Name: "Navel", CopyLayerColor: "Bottom", AllowColorize: true, ParentGroup: null , HideForPose: ["Hogtied"] }, - { Name: "Breasts", CopyLayerColor: "Bottom", AllowPose: [], AllowColorize: true }, - { Name: "BreastsShine", AllowPose: [], AllowColorize: false } - ] - }, - { Name: "FrameBra1", Value: 20, Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"] }, - { Name: "FrameBra2", Value: 15, Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"] }, - { Name: "BondageBra1", Fetish: ["Leather"], Priority: 20, Value: 40, Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"] }, - { Name: "LatexBra1", Fetish: ["Lingerie", "Latex"], Value: 30, Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"] }, - { Name: "HarnessBra1", Fetish: ["Leather"], Priority: 20, Value: 30, BuyGroup: "HarnessBra1", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"] }, - { Name: "HarnessBra2", Fetish: ["Leather"], Priority: 20, Value: 40, BuyGroup: "HarnessBra2", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"] }, - { Name: "CuteBikini1", Fetish: ["Lingerie"], Priority: 20, Value: 40, Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], Extended: true, - Layer:[ - { Name: "Main", AllowColorize: true}, - { Name: "Sides", AllowColorize: true} - ] - }, - { Name: "CorsetBikini1", Fetish: ["Lingerie"], Priority: 20, Value: 40, Hide: ["Panties", "ItemNipples", "ItemVulvaPiercings", "ItemVulva"] }, - { Name: "OuvertPerl1", Fetish: ["Lingerie"], Priority: 20, Value: 40, HideItem: ["ItemNipplesLactationPump"], Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"] }, - { Name: "Sarashi1", Value: 25, Hide: ["ItemNipples"] }, - { Name: "KittyBra1", Fetish: ["Pet"], Value: 30, Hide: ["ItemNipples"] }, - { Name: "FishnetBikini1", Priority: 20, Value: 45, Hide: ["Panties", "ItemNipples", "ItemVulvaPiercings", "ItemVulva"] }, - { Name: "SexyBeachBra1", Value: 25, Hide: ["ItemNipples"] }, - { Name: "SexyBikiniBra1", Value: 25, Hide: ["ItemNipples"] }, - { Name: "StarHarnessBra", Fetish: ["Leather"], Priority: 20, Value: 40, Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"] }, - { Name: "HeartTop", Fetish: ["Lingerie"], Priority: 20, Value: 35, Hide: ["ItemNipples"] }, - { Name: "ChineseBra1", Fetish: ["Lingerie"], Value: 35, Hide: ["ItemNipples"] }, - { Name: "LeatherStrapBra1", Fetish: ["Leather"], Value: 15, BuyGroup: "LeatherStrapBra1", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], AllowPose: [] }, - { Name: "Swimsuit3", Value: 35, DefaultColor: "#E53771", Hide: ["Panties", "ItemNipples", "ItemVulvaPiercings", "ItemVulva"] }, - { Name: "ClamShell", Value: 20, Left: 0, Top: 0, DefaultColor: "#E53771", Hide: ["ItemNipples", "ItemNipplesPiercings"] }, - { Name: "CowPrintedBra", Value: 15, Hide: ["ItemNipples"] }, - { - Name: "StuddedHarness", Fetish: ["Lingerie", "Leather"], Priority: 20, Value: -1, DefaultColor:"#343131", BuyGroup: "StuddedHarness", Expose:["ItemBreast"], Hide: ["ItemNipples","ItemNipplesPiercings"], HideItem: ["PantiesDiapers1","PantiesDiapers2","PantiesDiapers3", "PantiesDiapers4"], - Layer:[ - { Name: "Harness", AllowColorize: true}, - { Name: "Metal", AllowColorize: false} - ] - }, - { Name: "Camisole", Priority: 22, DefaultColor: "#908867", Value: 5, Hide: ["ItemNipples"] }, - { Name: "Ribbons", Fetish: ["Lingerie"], Value: 30, BuyGroup: "Ribbon", Extended: true, Hide:["ItemNipples"] }, - { Name: "LeatherBreastBinder", Fetish: ["Leather"], Value: 30, BuyGroup: "BreastBinder", AllowPose: [], Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"] }, - { Name: "SilkStraps", Value: 40, DefaultColor: "#E8E8E8", BuyGroup: "SilkStraps", Extended: true, Hide:["ItemNipples"] }, - { Name: "FullLatexBra", BuyGroup: "FullLatexBra", Fetish: ["Lingerie", "Latex"], Value: 45, Hide: ["ItemNipples"] }, - { Name: "FullLatexBra2", BuyGroup: "FullLatexBra", Fetish: ["Lingerie", "Latex"], Value: -1, Hide: ["ItemNipples"], - Layer:[ - { Name: "Bra", AllowColorize: true}, - { Name: "Shine", AllowColorize: true} - ] - }, - { - Name: "HaremBra", Fetish: ["Lingerie"], Value: 25, Left: 0, Top: 0, Hide: ["ItemNipples"], Layer:[ - { Name: "Fabric" }, - { Name: "Straps" }, - { Name: "Jewel" } - ] - }, - { Name: "FlowerBra", Fetish: ["Lingerie"], Value: 15, Hide: ["ItemNipples"], - Layer: [ - { Name: "Bra", AllowColorize: true }, - { Name: "Flowers", AllowColorize: true }, - ] - }, - { Name: "Bra10", Value: 30, Hide: ["ItemNipples"] }, - { Name: "CoconutBra", Value: 15, Hide: ["ItemNipples"], AllowPose: [], DefaultColor: "#83440B" }, - { - Name: "SleevelessSlimLatexLeotard", Value: 50, Top: 0, Left: 0, Hide: ["Panties", "ItemNipples", "ItemVulvaPiercings", "ItemVulva"], HideItemExclude: ["ItemVulvaWiredEgg"], - PoseMapping: { Yoked: "" }, - Layer: [ - { Name: "Latex" }, - { Name: "Shine", AllowColorize: false }, - { Name: "BreastShade", AllowColorize: false } - ] - }, - ], - Color: ["Default", "#cccccc", "#aaaaaa", "#888888", "#666666", "#444444", "#222222", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Corset", - ParentGroup: "BodyUpper", - Priority: 22, - Clothing: true, - Default: false, - Underwear: true, - Left: 150, - Top: 200, - AllowPose: ["Hogtied"], - PreviewZone: [75, 250, 350, 350], - Asset: [ - { Name: "Corset1", Fetish: ["Lingerie"], Priority: 22, Value: 35, Hide: ["ItemNipples", "ItemNipplesPiercings"], HideForPose: ["AllFours"] }, - { Name: "Corset2", Fetish: ["Lingerie"], Priority: 22, Value: 30, BuyGroup: "Corset2", Hide: ["ItemNipples", "ItemNipplesPiercings"], HideForPose: ["AllFours"] }, - { Name: "Corset3", Fetish: ["Lingerie"], Priority: 22, Value: 25, BuyGroup: "Corset3", Hide: ["ItemNipples", "ItemNipplesPiercings"], HideForPose: ["AllFours"] }, - { Name: "Corset4", Fetish: ["Lingerie"], Priority: 22, Value: 15, BuyGroup: "Corset4", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HideForPose: ["AllFours"] }, - { Name: "Corset5", Fetish: ["Lingerie"], Priority: 22, Value: 20, BuyGroup: "Corset5", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HideForPose: ["AllFours"] }, - { - Name: "LatexCorset1", Fetish: ["Lingerie", "Latex"], Priority: 21, Value: 40, BuyGroup: "LatexCorset1", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HideForPose: ["AllFours"], Extended: true, HasType: false, - Layer:[ - { Name: "Base", HasType: false }, - { Name: "Garter", CopyLayerColor: "Base", HasType: false, AllowTypes: [""] } - ], - }, - { - Name: "LeatherCorsetTop1", Fetish: ["Leather"], Left: 0, Top: 0, BuyGroup: "LeatherCorsetTop1", Priority: 25, Value: 60, - HideItem: ["ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump"], - AllowPose: ["Hogtied", "AllFours"] - }, - { - Name: "Corset6", Fetish: ["Lingerie"], Value: 40, DefaultColor: ["#435331", "#363535", "#A08759"], Hide: ["ItemNipples", "ItemNipplesPiercings"], HideForPose: ["AllFours"], - Layer:[ - { Name: "Cloth", AllowColorize: true}, - { Name: "Leather", AllowColorize: true}, - { Name: "Buttons", AllowColorize: true} - ] - }, - { - Name: "SteampunkCorsetTop1", Fetish: ["Leather"], Left: 0, Top: 0, BuyGroup: "SteampunkCorsetTop1", Priority: 25, Value: 70, Hide: ["ItemHidden"], - HideItem: ["ClothLowerTennisSkirt1", "ItemNipplesPiercingsRoundPiercing", "ItemNipplesPiercingsNecklacePiercingChain", "ItemNipplesLactationPump", "ClothAccessoryPoncho", "NecklaceBodyChainNecklace"], - AllowPose: ["Hogtied", "AllFours", "OverTheHead"] - }, - ], - Color: ["Default", "#cccccc", "#aaaaaa", "#888888", "#666666", "#444444", "#222222", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Panties", - ParentGroup: "BodyLower", - ParentColor: "Bra", - Priority: 19, - Clothing: true, - Underwear: true, - Left: 150, - Top: 395, - PreviewZone: [125, 350, 250, 250], - Asset: [ - { Name: "Panties1", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "Panties7", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "Panties8", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "Panties11", Fetish: ["Lingerie"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "Panties12", Fetish: ["Lingerie"], Value: 10, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "Panties13", Fetish: ["Lingerie"], Value: 10, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "Panties14", Fetish: ["Lingerie"], Value: 10, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "Panties15", Fetish: ["Lingerie"], Value: 10, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "Bikini1", Value: 25, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "Diapers1", Priority: 23, Category: ["ABDL"], Fetish: ["ABDL"], Random: false, Value: 20, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { - Name: "Diapers2", Priority: 23, Category: ["ABDL"], Fetish: ["ABDL"], Random: false,Value: 30, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], - Layer: [ - { Name: "Diaper" }, - { Name: "Cover" } - ] - }, - { Name: "Diapers3", Priority: 23, Category: ["ABDL"], Fetish: ["ABDL"], Random: false,Value: 30, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { - Name: "Diapers4", Priority: 23, Category: ["ABDL"], Fetish: ["ABDL"], Random: false,Value: 30, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], Extended: true, - Layer: [ - { Name: "Diaper", HasType: false }, - { Name: "Tape", HasType: false }, - { Name: "Pattern", AllowTypes: ["StrawBerry", "Spots", "Butterfly", "Flower"] }, - ] - }, - { - Name: "BulkyDiaper", BuyGroup: "BulkyDiapers", Priority: 25, Category: ["ABDL"], Fetish: ["ABDL"], Random: false, Value: 30, DefaultColor:["#688599", "#808080", "#8c7384", "#BF3F97"], AllowPose: ["LegsClosed", "Kneel"], HideForPose: ["KneelingSpread", "Hogtied", "AllFours"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], Left: 49, Top: 360, SetPose: ["LegsOpen"], AllowActivePose: ["Kneel"], WhitelistActivePose: ["BaseLower", "Kneel"], - Layer: [ - { Name: "Base" }, - { Name: "CrotchPiece" }, - { Name: "WaistBand" }, - { Name: "Tape", ParentGroup: null }, - { Name: "Back", CopyLayerColor: "Base", ParentGroup: null, Priority: 6 }, - ] - }, - { - Name: "PoofyDiaper", BuyGroup: "PoofyDiapers", Priority: 25, Category: ["ABDL"], Fetish: ["ABDL"], Random: false, Value: 30, DefaultColor:["#9763A6", "#658AA6", "#997391", "#a916cc"], AllowPose: ["LegsClosed", "Kneel"], HideForPose: ["KneelingSpread", "Hogtied", "AllFours"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], HideItemExclude: ["ClothLowerHaremPants", "ClothLowerPleatedSkirt", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerLeggings1", "ClothLowerLeggings2"], Left: 49, Top: 360, SetPose: ["LegsOpen"], AllowActivePose: ["Kneel"], WhitelistActivePose: ["BaseLower", "Kneel"], Extended: true, - Layer: [ - { Name: "Base", HasType: false, AllowTypes: [""] }, - { Name: "PoofyBase", CopyLayerColor: "Base", HasType: false, AllowTypes: ["Poofy"] }, - { Name: "CrotchPatch", HasType: false }, - { Name: "Frills", HasType: false }, - { Name: "Tape", HasType: false, ParentGroup: null }, - { Name: "Back", CopyLayerColor: "Base", HasType: false, ParentGroup: null, Priority: 6 }, - ] - }, - { Name: "Panties16", Fetish: ["Lingerie"], Value: 20, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "MaidPanties1", Fetish: ["Lingerie"], Value: 25, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "MaidPanties2", Fetish: ["Lingerie"], Value: -1, BuyGroup: "Maid", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], - DefaultColor: ["#212121", "Default"], - Layer: [ - { Name: "Panties" }, - { Name: "Frills" }, - ] - }, - { Name: "LatexPanties1", BuyGroup: "LatexPanties", Fetish: ["Latex"], Value: -1, Expose: ["ItemVulva", "ItemVulvaPiercings"] }, - { Name: "WrapPanties1", Value: 25, Expose: ["ItemVulva", "ItemVulvaPiercings"] }, - { Name: "CrotchPanties1", Value: 30, AllowPose: ["KneelingSpread"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"] }, - { Name: "LatexCrotchlessPanties", Top: 462, Left: 0, Value: 30, Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"] }, - { Name: "RedBowPanties", Top: 435, Left: 0, Value: 30, DefaultColor: ["Default", "#E70505"], - Layer: [ - { Name: "Panties", ParentGroup: null}, - { Name: "Bow", ParentGroup: null}, - ] - }, - { Name: "StringPanties1", Value: 15, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "StringPasty1", Value: 10, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "ZipPanties1", Value: 15, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "HarnessPanties1", Fetish: ["Leather"], Value: 35, Left: 110, Top: 395, DynamicGroupName: "ItemPelvis", BuyGroup: "HarnessPanties1", AllowPose: ["LegsClosed", "Kneel", "KneelingSpread"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"] }, - { Name: "HarnessPanties2", Fetish: ["Leather"], Value: 40, Left: 85, Top: 395, DynamicGroupName: "ItemPelvis", BuyGroup: "HarnessPanties2", AllowPose: ["LegsClosed", "Kneel", "KneelingSpread", "Spread"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"] }, - { Name: "KittyPanties1", Fetish: ["Pet"], Value: 20, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "PearlPanties1", Fetish: ["Lingerie"], Value: 20, Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"] }, - { Name: "SunstripePanties1", Value: 20, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "SexyBeachPanties1", Value: 20, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "ChinesePanties1", Value: 25, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "LeatherStrapPanties1", Fetish: ["Leather"], Value: 20, BuyGroup: "LeatherStrapPanties1", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "CowPrintedPanties", Value: 15, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "LatexPanties2", BuyGroup: "LatexPanties", Fetish: ["Latex"], Value: 30, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - { Name: "PilotPanties", BuyGroup: "PilotSuit", DefaultColor: ["#3270C1", "#2B408B", "#969696"], Left: 95, Top: 380, Fetish: ["Latex"], Value: -1, - HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], - Layer: [ - { Name: "Layer1", AllowColorize: true }, - { Name: "Layer2", AllowColorize: true }, - { Name: "Layer3", AllowColorize: true }, - ] - }, - { Name: "CatsuitPanties", BuyGroup: "Catsuit", Left: 95, Top: 380, Fetish: ["Latex"], Value: -1, DynamicGroupName: "SuitLower", - HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], - }, - { Name: "SilkStraps", Value: 40, BuyGroup: "SilkStraps", DefaultColor: "#E8E8E8", Extended: true}, - { Name: "FlowerPanties", Fetish: ["Lingerie"], Value: 15, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], - Layer: [ - { Name: "Panties", AllowColorize: true }, - { Name: "Flowers", AllowColorize: true }, - ] - }, - {Name: "FloralPanties2", Value: 20, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], - Layer: [ - { Name: "Base" }, - { Name: "Flowers" }, - ] - }, - {Name: "Thong", Value: 15, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - {Name: "StringThong", Value: 20, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - {Name: "MicroThong", Value: 25, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"] }, - ], - Color: ["Default", "#cccccc", "#aaaaaa", "#888888", "#666666", "#444444", "#222222", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Socks", - ParentGroup: "BodyLower", - ParentColor: "Bra", - Priority: 20, - Clothing: true, - Underwear: true, - Left: 125, - Top: 400, - AllowPose: ["LegsClosed", "Kneel", "Spread", "Hogtied", "KneelingSpread"], - PreviewZone: [0, 450, 500, 500], - Asset: [ - { Name: "Socks0", HideForPose: ["KneelingSpread"] }, - { Name: "Socks1", HideForPose: ["KneelingSpread"] }, - { Name: "Socks2", HideForPose: ["KneelingSpread"] }, - { Name: "Socks3" }, - { Name: "Socks4" }, - { Name: "Socks5" }, - { Name: "Stockings1", Fetish: ["Nylon"], BuyGroup: "Stockings1"}, - { Name: "Stockings2", Fetish: ["Nylon"], BuyGroup: "Stockings2"}, - { Name: "Stockings3", Fetish: ["Nylon"], Value: 10, BuyGroup: "Stockings3"}, - { Name: "Stockings4", Fetish: ["Nylon"], Value: 10, BuyGroup: "Stockings4"}, - { Name: "Pantyhose1", Fetish: ["Nylon"], Value: 10, HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo"], BuyGroup: "Pantyhose", Block: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"] }, - { - Name: "Socks6", Fetish: ["Nylon"], Value: 25, - Layer: [ - { Name: "Sock" }, - { Name: "Frill" } - ] - }, - { - Name: "SocksFur", Fetish: ["Nylon"], Value: 40, DefaultColor: ["#8c2331", "Default"], HideForPose: ["KneelingSpread"], - Layer: [ - { Name: "Fabric" }, - { Name: "Fur" } - ] - }, - { - Name: "SocksStriped1", Value: 10, HideForPose: ["KneelingSpread"], Layer: [ - { Name: "Light" }, - { Name: "Dark" }, - ] - }, - { Name: "LatexSocks1", Fetish: ["Latex"], Value: 30 }, - { Name: "FootlessSocks1", Value: 15 }, - { Name: "ReverseBunnySuit", Fetish: ["Nylon", "Pet"], Left: 95, Top: 380, Value: 100, DynamicGroupName: "SuitLower", BuyGroup: "ReverseBunnySuit" }, - { Name: "LeatherSocks1", Fetish: ["Leather"], Value: 20, HideForPose: ["KneelingSpread"] }, - { Name: "Pantyhose2", Fetish: ["Nylon"], Value: 10, BuyGroup: "Pantyhose2" }, - { Name: "CowPrintedSocks", Fetish: ["Nylon"], Value: 15 }, - { - Name: "HaremStockings", Fetish: ["Nylon"], Value: 25, - Layer: [ - { Name: "Fabric" }, - { Name: "Bands" } - ] - }, - ], - Color: ["Default", "#cccccc", "#aaaaaa", "#888888", "#666666", "#444444", "#222222", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "RightAnklet", - ParentGroup: "BodyLower", - Priority: 22, - Clothing: true, - Default: false, - Left: 115, - Top: 500, - AllowPose: ["LegsClosed", "Spread"], - PreviewZone: [100, 700, 300, 300], - Asset: [ - { Name: "BandAnklet", BuyGroup: "BandAnklet"}, - { Name: "Ribbon", Fetish: ["Lingerie"], Value: 30, BuyGroup: "Ribbon" }, - { Name: "Ribbon1", Fetish: ["Lingerie"], Value: 30, BuyGroup: "Ribbon" } - ], - Color: ["Default", "#bbbbbb", "#808080", "#202020", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "LeftAnklet", - ParentGroup: "BodyLower", - Priority: 22, - Clothing: true, - Default: false, - Left: 115, - Top: 500, - AllowPose: ["LegsClosed", "Spread"], - PreviewZone: [100, 700, 300, 300], - Asset: [ - { Name: "BandAnklet", BuyGroup: "BandAnklet"}, - { Name: "Ribbon", Fetish: ["Lingerie"], Value: 30, BuyGroup: "Ribbon" }, - { Name: "Ribbon1", Fetish: ["Lingerie"], Value: 30, BuyGroup: "Ribbon" } - ], - Color: ["Default", "#bbbbbb", "#808080", "#202020", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - { - Group: "Garters", - ParentGroup: "BodyLower", - Priority: 22, - Clothing: true, - Default: false, - Top: 462, - AllowPose: ["LegsClosed", "Spread", "Kneel", "KneelingSpread"], - PreviewZone: [100, 450, 300, 300], - Asset: [ - { - Name: "GarterBelt", Value: 10, Extended: true, - Layer: [ - { Name: "Left", HasType: false, AllowTypes: ["", "Left"] }, - { Name: "Right", HasType: false, AllowTypes: ["", "Right"] }, - ] - }, - { Name: "GarterBelt2", Value: 10 }, - { - Name: "Tentacles", Category: ["Fantasy"], BuyGroup: "Tentacles", Random: false, Left: 0, Value: 250, DefaultColor: "#9221ba", - Layer: [ - { Name: "Tentacle" }, - { Name: "Shine", AllowColorize: false }, - ], - }, - ], - Color: ["Default", "#bbbbbb", "#808080", "#202020", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - { - Group: "Shoes", - ParentGroup: "BodyLower", - Priority: 23, - Clothing: true, - Left: 115, - Top: 500, - AllowPose: ["LegsClosed", "Kneel", "Spread", "Hogtied", "KneelingSpread"], - PreviewZone: [100, 700, 300, 300], - Asset: [ - { Name: "Shoes1", Height: 6, HideForPose: ["Kneel", "KneelingSpread"] }, - { Name: "Shoes2", Height: 6, HideForPose: ["Kneel", "KneelingSpread"] }, - { Name: "Shoes4", Height: 6, HideForPose: ["Kneel", "KneelingSpread"] }, - { Name: "Sneakers1", Height: 3, HideForPose: ["Kneel", "KneelingSpread"], - Layer: [ - { Name: "Main", AllowColorize: true}, - { Name: "Front", AllowColorize: true, HideForPose: ["Hogtied"]}, - { Name: "Laces", AllowColorize: true, HideForPose: ["Hogtied"]} - ] - }, - { Name: "Sneakers2", Height: 3, HideForPose: ["Kneel", "KneelingSpread"], - Layer: [ - { Name: "Shoes", AllowColorize: true}, - { Name: "Laces", AllowColorize: true, HideForPose: ["Hogtied"]} - ] - }, - { Name: "Heels1", Height: 15, HideForPose: ["Kneel", "KneelingSpread"], }, - { Name: "Heels2", Height: 15, HideForPose: ["Kneel", "KneelingSpread"], }, - { Name: "Boots1", Height: 9, HideForPose: ["Kneel", "KneelingSpread"], HideItem: ["LeftAnkletRibbon1", "RightAnkletRibbon1"], - Layer: [ - { Name: "Shoes", AllowColorize: true}, - { Name: "Sides", AllowColorize: true}, - { Name: "Laces", AllowColorize: true} - ] - }, - { Name: "MistressBoots", Fetish: ["Leather"], Value: -1, HideItem: ["SocksSocks4", "SocksSocks5", "LeftAnkletRibbon1", "RightAnkletRibbon1"], Alpha: [{ Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[75, 875, 350, 200]] }], Height: 35, HideForPose: ["KneelingSpread"] }, - { Name: "PonyBoots", Fetish: ["Pony"], Value: -1, Alpha: [{ Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[75, 875, 350, 200]] }], Height: 35, HideForPose: ["KneelingSpread"] }, - { Name: "Sandals", Priority: 22, Value: 30, HideItem: ["SocksSocks0", "SocksSocks1", "SocksSocks2", "SocksSocks3", "SocksSocks4", "SocksSocks5", "SocksSocks6", "SocksSocksFur"], Height: 3, HideForPose: ["Kneel", "KneelingSpread"] }, - { Name: "SandalsRS", Priority: 22, Value: 30, DefaultColor:["#AA9977", "#999999"], HideItem: ["SocksSocks0", "SocksSocks1", "SocksSocks2", "SocksSocks3", "SocksSocks4", "SocksSocks5", "SocksSocks6", "SocksSocksFur"], Height: 1, Alpha: [{ Group: ["BodyUpper"], Pose: ["Hogtied"], Masks: [[0, 0, 500, 70]] }], HideForPose: ["Kneel", "KneelingSpread"], - Layer: [ - { Name: "Soles", Priority: 6 }, - { Name: "Top", Priority: 22 } - ] - }, - { Name: "PawBoots", Fetish: ["Pet"], Value: 45, HideItem: ["LeftAnkletRibbon1", "RightAnkletRibbon1"], Height: 3, HideForPose: ["Kneel", "KneelingSpread"] }, - { Name: "WoollyBootsTall", Fetish: ["Pet"], Value: 60, HideItem: ["LeftAnkletRibbon1", "RightAnkletRibbon1"], Height: 9, HideForPose: ["KneelingSpread"] }, - { Name: "ThighHighLatexHeels", Fetish: ["Latex"], Value: 80, HideItem: ["LeftAnkletRibbon1", "RightAnkletRibbon1"], BuyGroup: "ThighHighLatexHeels", - Alpha: [ - { Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[75, 680, 350, 320]] }, - { Group: ["BodyLower", "Socks", "SuitLower"], Pose: ["LegsClosed"], Masks: [[75, 650, 350, 350]] }, - ], Height: 30, HideForPose: ["KneelingSpread"] - }, - { Name: "Heels3", Height: 15, Value: 30, HideForPose: ["Kneel", "KneelingSpread"], }, - { Name: "BarefootSandals1", Hide: ["Socks"], Value: 10, HideForPose: ["Kneel", "KneelingSpread"], }, - { Name: "LatexAnkleShoes", Fetish: ["Latex"], Value: 60, HideForPose: ["Kneel", "KneelingSpread"], DefaultColor: ["#373636"], }, - { Name: "Flippers", Height: 40, Value: 25, HideForPose: ["Kneel", "KneelingSpread"], HideItem: ["LeftAnkletRibbon1", "RightAnkletRibbon1"], Left: 84, Random: false, - Layer: [ - { Name: "Fins", AllowColorize: true }, - { Name: "Shoes", AllowColorize: false } - ] - }, - { Name: "DeluxeBoots", Fetish: ["Leather"], Value: -1, HideItem: ["LeftAnkletRibbon1", "RightAnkletRibbon1"], Alpha: [{ Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[180, 900, 50, 100], [280, 900, 50, 100]] }], DefaultColor: ["#9F0D0D", "#700A0A", "#700A0A", "#9F0D0D"], Height: 35, HideForPose: ["KneelingSpread"], - Layer: [ - { Name: "Boots", AllowColorize: true}, - { Name: "Laces", AllowColorize: true}, - { Name: "Heels", AllowColorize: true}, - { Name: "Straps", AllowColorize: true}, - { Name: "Buckles", AllowColorize: false}, - ] - }, - { Name: "AnkleStrapShoes", Priority: 22, Value: 30, HideForPose: ["Kneel", "KneelingSpread"], Alpha: [{ Group: ["Socks"], Masks: [[130, 925, 270, 130]] }], Height: 4 }, - { Name: "Shoes5", Value: 30, HideForPose: ["Kneel", "KneelingSpread"], Alpha: [{ Group: ["Socks"], Masks: [[130, 925, 270, 130]] }], Height: 4 }, - { Name: "FuturisticHeels2", Value: 50, Difficulty: 7, Time: 10, RemoveTime: 20, - Left: 75, DefaultColor: ["Default", "#50913C", "Default", "Default", "Default", "#aaaaaa", "Default"], Random: false, AllowLock: true, DrawLocks: false, Audio: "FuturisticApply", BuyGroup: "FuturisticHeels", DynamicGroupName: "ItemBoots", Extended: true, FuturisticRecolor: true, Effect: [], - AllowPose: ["LegsClosed", "Kneel", "Hogtied", "Spread"], - HideForPose: ["Kneel", "KneelingSpread"], - Layer: [ - { Name: "Mesh", ParentGroup: null, HasType: false }, - { Name: "Shine", ParentGroup: null, HasType: false, AllowTypes:[""]}, - { Name: "Cuffs", ParentGroup: null, HasType: false }, - { Name: "Trim", ParentGroup: null, HasType: false }, - { Name: "Soles", ParentGroup: null, HasType: false }, - { Name: "Lock", LockLayer: true, HasType: false ,AllowColorize: true, ParentGroup: null}, - ], Alpha: [ - { Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[75, 860, 350, 120]] }, - { Group: ["BodyLower", "Socks", "SuitLower"], Pose: ["LegsClosed"], Masks: [[75, 870, 350, 150]] }, - ], Height: 30 - }, - { - Name: "FuzzyBoots", Value: 60, Top: 462, Left: 0, DefaultColor: ["#444", "#941a1a", "#666"], - HideForPose: ["Kneel", "Hogtied", "KneelingSpread"], - Hide: ["LeftAnklet", "RightAnklet"], - Layer: [ - { Name: "Heels", ParentGroup: null }, - { Name: "Boots" }, - { Name: "Fur" }, - ], - Alpha: [ - { Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[0, 805, 500, 195]] }, - { Group: ["BodyLower", "Socks", "SuitLower"], Pose: ["LegsClosed"], Masks: [[0, 795, 500, 205]] }, - { Group: ["BodyLower", "Socks", "SuitLower"], Pose: ["Spread"], Masks: [[0, 790, 500, 210]] }, - ], - }, - ], - Color: ["Default", "#bbbbbb", "#808080", "#202020", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Hat", - Priority: 55, - Default: false, - Clothing: true, - Left: 125, - Top: 0, - PreviewZone: [140, 0, 220, 220], - Asset: [ - "Band1", "Band2", - { Name: "Beret1", HideForPose: ["Suspension"] }, - { Name: "MaidHairband1", Fetish: ["Lingerie"], Value: -1 }, - { Name: "NurseCap", Value: -1 }, - { - Name: "Santa1", Value: 20, HideForPose: ["Suspension"], - Layer: [ - { Name: "Fabric" }, - { Name: "Fur" } - ] - }, - { - Name: "CaptainHat1", Value: 25, HideForPose: ["Suspension"], Layer: [ - { Name: "Top" }, - { Name: "Insignia" }, - { Name: "Rope" }, - { Name: "Brim" }, - ] - }, - { Name: "BunnySuccubus2", Fetish: ["Pet"], Value: 35 }, - { - Name: "WitchHat1", Value: 40, HideForPose: ["Suspension"], - Layer: [ - { Name: "Hat" }, - { Name: "Band" }, - ] - }, - { - Name: "PirateBandana1", Value: 15, Layer: [ - { Name: "Bandana" }, - { Name: "Skull" }, - { Name: "Dots" }, - ] - }, - { - Name: "Bandana", Value: 20, Left: 76, Top: -20, DefaultColor: ["#DC3434", "#FFFFFF"], AllowPose: [], Extended: true, Layer: [ - { Name: "Band", HasType: false, CopyLayerColor: "Bow" }, - { Name: "Bow", Priority: 6, HasType: false }, - { Name: "BandPattern", CopyLayerColor: "BowPattern", AllowTypes: ["Circles", "Flowers", "PolkaDots", "Triangles"] }, - { Name: "BowPattern", Priority: 6, AllowTypes: ["Circles", "Flowers", "PolkaDots", "Triangles"] }, - ] - }, - { - Name: "PoliceWomanHat", Value: 40, AllowPose: [], Layer: [ - { Name: "Badge" }, - { Name: "Hat" } - ] - }, - { Name: "HeadTowel1", Value: 15, Hide: ["HairFront", "HairBack"] }, - { Name: "CollegeDunce", Value: -1, HideForPose: ["Suspension"] }, - { Name: "Tiara1", Value: 40 }, - { - Name: "Bonnet1", Value: 20, - Layer: [ - { Name: "Base" }, - { Name: "Lace" } - ] - }, - { Name: "Bonnet2", Value: 20 }, - { Name: "Crown1", Value: 20, HideForPose: ["Suspension"] }, - { - Name: "Crown2", Value: 20, HideForPose: ["Suspension"], Layer: [ - { Name: "Crown" }, - { Name: "Jewels" } - ] - }, - { - Name: "Crown3", Value: 20, HideForPose: ["Suspension"], Layer: [ - { Name: "Crown" }, - { Name: "Jewels" } - ] - }, - { Name: "Crown4", Value: 20, HideForPose: ["Suspension"] }, - { Name: "Crown5", Value: 20, HideForPose: ["Suspension"] }, - { Name: "SmallHat1", Value: 30, HideForPose: ["Suspension"] }, - { Name: "Veil1", Fetish: ["Lingerie"], Value: 40 }, - { Name: "Veil2", Fetish: ["Lingerie"], Value: 40 }, - { Name: "BakerBoyHat", Value: 40, HideForPose: ["Suspension"] }, - { Name: "ReindeerBand", Value: 10 }, - { Name: "FurHeadband", Value: 5}, - { Name: "FacePaint", Value: 10, Left: 150, Top: 20, Priority: 7, BuyGroup: "FacePaint", DefaultColor: ["#9A7F76"], Hide: ["Head"] }, - { - Name: "RoseCrown", Value: 20, DefaultColor: ["#1B7E1B", "#BE2B2B"], Layer: [ - { Name: "Leaves" }, - { Name: "Roses" } - ] - }, - { - Name: "FlowerCrown", Value: 20, DefaultColor: ["#AA7386", "#B25576"], Layer: [ - { Name: "MainFlowers" }, - { Name: "Petals" } - ] - }, - { - Name: "PoppyCrown", Value: 20, DefaultColor: ["#F7B405", "#D816DA", "#2635C4", "#54BF28", "#F7B405"], Layer: [ - { Name: "EndFlowers" }, - { Name: "MainFlower" }, - { Name: "SideFlowers" }, - { Name: "Leaves" }, - { Name: "Center" } - ] - }, - { - Name: "LatexHabit", Fetish: ["Latex"], BuyGroup: "LatexHabit", Top: 23, Left: 85, Value: 30, HideItem: ["ItemEarsFuturisticEarphones"], Hide: ["HairFront", "HairBack", "HairAccessory1", "HairAccessory2", "HairAccessory3",], Block: ["ItemEars"], DynamicGroupName:"ItemHood", - Layer:[ - {Name: "Cape"}, - {Name: "Collar"}, - {Name: "Base"}, - {Name: "Cowl"}, - {Name: "Back", Priority: 5, CopyLayerColor: "Base"} - ], - }, - { - Name: "BallCapBack", Value: -1, Left: 150, Top: 45, BuyGroup: "BallCap", DefaultColor: ["#3B3B3B", "#CCCC32", "#424242", "#3B3B3B"], Extended: true, Layer: [ - { Name: "PanelLeft", HasType: false }, - { Name: "PanelRight", CopyLayerColor: "PanelLeft", HasType: false }, - { Name: "Button", HasType: false }, - { Name: "SideLeft", HasType: false }, - { Name: "SideRight", CopyLayerColor: "SideLeft", HasType: false }, - { Name: "Strap", Priority: 55, AllowTypes: ["StrapOver"], HasType: false }, - { Name: "StrapUnder", CopyLayerColor: "Strap", Priority: 50, HasType: false } - ], - }, - { - Name: "BallCapFront", Value: 30, Left: 150, Top: 45, BuyGroup: "BallCap", DefaultColor: ["#3B3B3B", "#3B3B3B", "#3B3B3B", "#CCCC32", "#424242", "Default"], Extended: true, Layer: [ - { Name: "Panel", HasType: false }, - { Name: "PanelLeft", HasType: false }, - { Name: "PanelRight", HasType: false }, - { Name: "Button", HasType: false }, - { Name: "Visor", HasType: false }, - { Name: "Print", AllowTypes: ["BCLogo", "BDSM", "BG", "Chain", "Gag", "Knot", "Monogram", "Rock", "Smile", "Sun", "Tick"], AllowColorize: true, ParentGroup: null }, - ], - }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - // Hair accessory 1: Ears & Accessories - // Hair accessory 2: Ears only - // Hair accessory 3: Accessories only - { - Group: "HairAccessory3", - Priority: 56, - Default: false, - Clothing: true, - Left: 90, - Top: 0, - PreviewZone: [125, 0, 250, 250], - DynamicGroupName: "HairAccessory1", - Asset: [ - { Name: "Ribbons1", Priority: 4, BuyGroup: "Ribbons1" }, - { Name: "Ribbons2", Priority: 4, Value: -1, BuyGroup: "Ribbons2" }, - { Name: "Ribbons3", BuyGroup: "Ribbons3" }, - { Name: "Ribbons4", BuyGroup: "Ribbons4" }, - { Name: "GiantBow1", Priority: 4, BuyGroup: "GiantBow1" }, - { Name: "HairFlower1", Value: -1, BuyGroup: "HairFlower1" }, - { Name: "WeddingVeil1", Priority: 4, Value: -1, BuyGroup: "WeddingVeil1" }, - { Name: "HairFeathers1", Value: -1, BuyGroup: "HairFeathers1" }, - { - Name: "Halo", Value: -1, BuyGroup: "Halo", Top: -100, Left: 0, DefaultColor: ["#fff4a0", "#ffee66", "#fffdee"], Extended: true, MinOpacity: 0, Opacity: 0, AllowType: ["Broken"], - Layer: [ - { Name: "Glow", Opacity: 0 }, - { Name: "Base", MinOpacity: 1 }, - { Name: "Core", Opacity: 0, } - ] - }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "HairAccessory1", - Priority: 54, - Default: false, - Clothing: true, - Random: false, - Left: 90, - Top: 0, - PreviewZone: [125, 0, 250, 250], - Asset: [ - { Name: "Ears1", Fetish: ["Pet"], BodyCosplay: true }, - { Name: "Ears2", Fetish: ["Pet"], BodyCosplay: true }, - { Name: "PonyEars1", Fetish: ["Pony"], BodyCosplay: true }, - { Name: "Ribbons1", Priority: 4, BuyGroup: "Ribbons1" }, - { Name: "Ribbons2", Priority: 4, Value: -1, BuyGroup: "Ribbons2" }, - { Name: "Ribbons3", BuyGroup: "Ribbons3" }, - { Name: "Ribbons4", BuyGroup: "Ribbons4" }, - { Name: "GiantBow1", Priority: 4, BuyGroup: "GiantBow1" }, - { Name: "BunnyEars1", Fetish: ["Pet"], Value: 10, BuyGroup: "BunnyEars1", BodyCosplay: true }, - { - Name: "BunnyEars2", Fetish: ["Pet"], Value: 20, BuyGroup: "BunnyEars2", BodyCosplay: true, Layer: [ - { Name: "Outer" }, - { Name: "Inner" }, - ] - }, - { Name: "PuppyEars1", Fetish: ["Pet"], Priority: 6, Value: 20, BuyGroup: "PuppyEars1", BodyCosplay: true }, - { Name: "SuccubusHorns", Fetish: ["Pet"], Value: 15, BuyGroup: "SuccubusHorns", BodyCosplay: true }, - { Name: "Horns", Fetish: ["Pet"], Value: 20, BuyGroup: "Horns", BodyCosplay: true }, - { Name: "Horns2", Fetish: ["Pet"], Value: 15, BuyGroup: "Horns2", BodyCosplay: true }, - { Name: "Horns3", Fetish: ["Pet"], Value: 15, BuyGroup: "Horns3", BodyCosplay: true }, - { Name: "HairFlower1", Value: 10, BuyGroup: "HairFlower1" }, - { Name: "FoxEars1", Fetish: ["Pet"], Value: 15, BuyGroup: "FoxEars1", BodyCosplay: true }, - { Name: "BatWings", Fetish: ["Pet"], Value: 20, BuyGroup: "BatWings", BodyCosplay: true }, - { Name: "KittenEars1", Fetish: ["Pet"], Value: 20, BuyGroup: "KittenEars1", BodyCosplay: true, - Layer: [ - { Name: "Outer" }, - { Name: "Inner" }, - ] - }, - { Name: "KittenEars2", Fetish: ["Pet"], Value: 20, BuyGroup: "KittenEars2", BodyCosplay: true }, - { Name: "WolfEars1", Fetish: ["Pet"], Value: 20, BuyGroup: "WolfEars1", BodyCosplay: true }, - { Name: "WolfEars2", Fetish: ["Pet"], Value: 20, BuyGroup: "WolfEars2", BodyCosplay: true }, - { Name: "FoxEars2", Fetish: ["Pet"], Value: 20, BuyGroup: "FoxEars2", BodyCosplay: true, - Layer: [ - { Name: "Outer" }, - { Name: "Inner" }, - ] - }, - { Name: "FoxEars3", Fetish: ["Pet"], Value: 20, BuyGroup: "FoxEars3", BodyCosplay: true, Layer:[ - { Name: "EarOuter"}, - { Name: "EarInner"}, - { Name: "Strap"}, - { Name: "Bell"} - ]}, - { Name: "PuppyEars2", Fetish: ["Pet"], Value: 20, BuyGroup: "PuppyEars2", BodyCosplay: true }, - { Name: "RaccoonEars1", Fetish: ["Pet"], Value: 15, BuyGroup: "RaccoonEars1", BodyCosplay: true }, - { Name: "WeddingVeil1", Priority: 4, Value: 30, BuyGroup: "WeddingVeil1" }, - { Name: "HairFeathers1", Value: 10, BuyGroup: "HairFeathers1" }, - { Name: "MouseEars1", Fetish: ["Pet"], Value: 20, BuyGroup: "MouseEars1", BodyCosplay: true }, - { Name: "MouseEars2", Fetish: ["Pet"], Value: 20, BuyGroup: "MouseEars2", BodyCosplay: true }, - { Name: "ElfEars", Value: 20, BuyGroup: "ElfEars", BodyCosplay: true, InheritColor: "BodyUpper", Extended: true, HasType: false }, - { Name: "CowHorns", Fetish: ["Pet"], Value: 15, BuyGroup: "CowHorns", BodyCosplay: true }, - { - Name: "Halo", Value: 20, BuyGroup: "Halo", Top: -100, Left: 0, DefaultColor: ["#fe6", "#fe6", "#fff"], Extended: true, MinOpacity: 0, Opacity: 0, AllowType: ["Broken"], - Layer: [ - { Name: "Glow", Opacity: 0 }, - { Name: "Base", MinOpacity: 1 }, - { Name: "Core", Opacity: 0, } - ] - }, - { Name: "Antennae", Value: 10, BuyGroup: "Antennae", BodyCosplay: true, DefaultColor: "#151A1F" }, - { Name: "UnicornHorn", Value: 50, DefaultColor: "#EBAACB", BuyGroup: "UnicornHorn", BodyCosplay: true, AllowActivity: ["PenetrateItem"], Top: -30, - Layer: [ - { Name: "Base"}, - { Name: "Shine", AllowColorize: false} - ] - }, - { Name: "DildocornHorn", Value: -1, DefaultColor: "Default", BuyGroup: "UnicornHorn", BodyCosplay: true, AllowActivity: ["PenetrateItem"], Top: -30, - Layer: [ - { Name: "Base"}, - { Name: "Shine", AllowColorize: false} - ] - }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "HairAccessory2", - Priority: 53, - Default: false, - Clothing: true, - Random: false, - BodyCosplay: true, - Left: 90, - Top: 0, - PreviewZone: [125, 0, 250, 250], - DynamicGroupName: "HairAccessory1", - Asset: [ - { Name: "Ears1", Fetish: ["Pet"] }, - { Name: "Ears2", Fetish: ["Pet"] }, - { Name: "PonyEars1", Fetish: ["Pony"] }, - { Name: "BunnyEars1", Fetish: ["Pet"], Value: -1, BuyGroup: "BunnyEars1" }, - { - Name: "BunnyEars2", Fetish: ["Pet"], Value: -1, BuyGroup: "BunnyEars2", Layer: [ - { Name: "Outer" }, - { Name: "Inner" }, - ] - }, - { Name: "PuppyEars1", Fetish: ["Pet"], Priority: 29, Value: -1, BuyGroup: "PuppyEars1" }, - { Name: "SuccubusHorns", Fetish: ["Pet"], Value: -1, BuyGroup: "SuccubusHorns" }, - { Name: "Horns", Fetish: ["Pet"], Value: -1, BuyGroup: "Horns" }, - { Name: "Horns2", Fetish: ["Pet"], Value: -1, BuyGroup: "Horns2" }, - { Name: "Horns3", Fetish: ["Pet"], Value: -1, BuyGroup: "Horns3" }, - { Name: "FoxEars1", Fetish: ["Pet"], Value: -1, BuyGroup: "FoxEars1" }, - { Name: "BatWings", Fetish: ["Pet"], Value: -1, BuyGroup: "BatWings" }, - { Name: "KittenEars1", Fetish: ["Pet"], Value: -1, BuyGroup: "KittenEars1", - Layer: [ - { Name: "Outer" }, - { Name: "Inner" }, - ], - }, - { Name: "KittenEars2", Fetish: ["Pet"], Value: -1, BuyGroup: "KittenEars2" }, - { Name: "WolfEars1", Fetish: ["Pet"], Value: -1, BuyGroup: "WolfEars1" }, - { Name: "WolfEars2", Fetish: ["Pet"], Value: -1, BuyGroup: "WolfEars2" }, - { Name: "FoxEars2", Fetish: ["Pet"], Value: -1, BuyGroup: "FoxEars2", - Layer: [ - { Name: "Outer" }, - { Name: "Inner" }, - ], - }, - { Name: "FoxEars3", Fetish: ["Pet"], Value: -1, BuyGroup: "FoxEars3", - Layer:[ - { Name: "EarOuter"}, - { Name: "EarInner"}, - { Name: "Strap"}, - { Name: "Bell"} - ] - }, - { Name: "PuppyEars2", Fetish: ["Pet"], Value: -1, BuyGroup: "PuppyEars2" }, - { Name: "RaccoonEars1", Fetish: ["Pet"], Value: -1, BuyGroup: "RaccoonEars1" }, - { Name: "MouseEars1", Fetish: ["Pet"], Value: -1, BuyGroup: "MouseEars1" }, - { Name: "MouseEars2", Fetish: ["Pet"], Value: -1, BuyGroup: "MouseEars2" }, - { Name: "ElfEars", Value: -1, BuyGroup: "ElfEars", InheritColor: "BodyUpper", Extended: true, HasType: false }, - { Name: "CowHorns", Fetish: ["Pet"], Value: -1, BuyGroup: "CowHorns" }, - { Name: "Antennae", Value: -1, BuyGroup: "Antennae", BodyCosplay: true, DefaultColor: "#151A1F" }, - { Name: "UnicornHorn", Value: -1, DefaultColor: ["#EBAACB"], BuyGroup: "UnicornHorn", BodyCosplay: true, - Layer: [ - { Name: "Base"}, - { Name: "Shine", AllowColorize: false} - ] - }, - { Name: "DildocornHorn", Value: -1, DefaultColor: "Default", BuyGroup: "UnicornHorn", BodyCosplay: true, AllowActivity: ["PenetrateItem"], Top: -30, - Layer: [ - { Name: "Base"}, - { Name: "Shine", AllowColorize: false} - ] - }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Gloves", - ParentGroup: "BodyUpper", - ParentColor: "Bra", - Priority: 28, - Default: false, - Clothing: true, - Underwear: true, - AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "AllFours", "OverTheHead"], - PreviewZone: [125, 265, 250, 250], - Asset: [ - { Name: "Gloves1", HideForPose: ["BackElbowTouch"] }, - { Name: "Gloves2", Alpha: [{ Group: ["BodyUpper"], Pose: ["OverTheHead"], Masks: [[90, 125, 30, 70], [370, 125, 30, 70]] }], HideForPose: ["BackElbowTouch"] }, - { Name: "Gloves3", Value: 15, Left: 60, Top: 109, HideForPose: ["BackElbowTouch"] }, - { Name: "MistressGloves", Fetish: ["Leather"], Value: -1, HideForPose: ["BackElbowTouch"] }, - { Name: "FingerlessGloves", Value: 20, HideForPose: ["BackElbowTouch"] }, - { - Name: "GlovesFur", Value: 30, DefaultColor: ["#8c2331", "Default"], HideForPose: ["BackElbowTouch"], - Layer: [ - { Name: "Fabric" }, - { Name: "Fur" } - ] - }, - { Name: "Catsuit", Hide: ["Hands"], Fetish: ["Nylon"], Value: -1, BuyGroup: "Catsuit", HideForPose: ["BackElbowTouch"] }, - { Name: "SeethroughSuit", Fetish: ["Nylon"], Value: -1, BuyGroup: "SeethroughSuit", HideForPose: ["BackElbowTouch"] }, - { Name: "CowPrintedGloves", Value: 15, Alpha: [{ Group: ["BodyUpper"], Pose: ["OverTheHead"], Masks: [[90, 125, 30, 70], [370, 125, 30, 70]] }], HideForPose: ["BackElbowTouch"] }, - { Name: "LatexElbowGloves", Fetish: ["Latex"], Value: 75, HideForPose: ["BackElbowTouch"] }, - { Name: "FishnetGloves", Value: 10, DefaultColor: ["#151515"], HideForPose: ["BackElbowTouch"] }, - { - Name: "HaremGlove", Fetish: ["Nylon"], Value: 25, - Layer: [ - { Name: "Fabric" }, - { Name: "Bands" } - ] - }, - { - Name: "BikerGloves", Value: 15, ParentGroup: null, DefaultColor: ["#65696E", "#2A2A2A"], HideForPose: ["BackElbowTouch", "BackBoxTie", "TapedHands"], - Layer: [ - { Name: "Hands" }, - { Name: "Straps" }, - { Name: "Buckles", AllowColorize: false, HideForPose: ["AllFours", "BackCuffs", "OverTheHead", "Yoked"] }, - ] - }, - ], - Color: ["Default", "#cccccc", "#aaaaaa", "#888888", "#666666", "#444444", "#222222", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Bracelet", - ParentGroup: "BodyUpper", - Priority: 46, - Default: false, - Clothing: true, - AllowPose: ["Yoked", "OverTheHead", "BackCuffs", "BackBoxTie" ], - PreviewZone: [125, 265, 250, 250], - Asset: [ - { Name: "BowBand", Value: 20, HideForPose: ["BackCuffs", "BackBoxTie"]}, - { Name: "KinkBracelet", Value: 25, HideForPose: ["BackCuffs", "BackBoxTie"]}, - { Name: "LesBand", Value: 30, HideForPose: ["BackCuffs", "BackBoxTie"]}, - { Name: "SpikeBands", Value: 15, DefaultColor: ["#232323", "#666666"], HideForPose: ["BackBoxTie"], Extended: true, Layer: [ - { Name: "Bands" }, - { Name: "Spikes" }, - ] - }, - { Name: "Band1", Value: 25, HideForPose: ["BackCuffs", "BackBoxTie"], Extended: true}, - { Name: "LaceBands", Value: 20, Priority: 29, DefaultColor: ["Default", "#151515"], Layer: [ - { Name: "Lace" }, - { Name: "Bands" }, - ] - }, - ], - Color: ["Default", "#cccccc", "#aaaaaa", "#888888", "#666666", "#444444", "#222222", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Glasses", - Priority: 27, - Default: false, - Clothing: true, - Underwear: true, - Left: 180, - Top: 125, - PreviewZone: [140, 40, 220, 220], - Asset: [ - "Glasses1", "Glasses2", "Glasses3", "Glasses4", "Glasses5", "Glasses6", - { Name: "SunGlasses1", Value: 15 }, - { Name: "SunGlasses2", Value: 15 }, - { Name: "SunGlassesClear", Value: 15 }, - { Name: "EyePatch1", Value: 10, Priority: 29, Extended: true }, - { Name: "CatGlasses", Value: 15, Priority: 53, Left: 182, Extended: true}, - { - Name: "VGlasses", Value: 20, DefaultColor: ["#93861F", "#7F0202"], - Layer: [ - { Name: "Frame" }, - { Name: "Glass" } - ] - }, - { - Name: "GradientSunglasses", Value: 20, DefaultColor: ["#303030", "#303030"], Extended: true, - Layer: [ - { Name: "Frame" }, - { Name: "Glass" } - ], - }, - ], - Color: ["#303030", "#808080", "#e0e0e0", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"], - }, - - { - Group: "Mask", - Priority: 53, - Default: false, - Clothing: true, - Random: false, - Underwear: true, - Left: 180, - Top: 125, - PreviewZone: [140, 25, 220, 220], - Asset: [ - { Name: "VenetianMask", Priority: 49, Fetish: ["Lingerie"], HideItem: ["ItemNoseNoseRing"] }, - { Name: "DominoMask", Priority: 49, Fetish: ["Lingerie"], HideItem: ["ItemNoseNoseRing"] }, - { Name: "ButterflyMask", Fetish: ["Lingerie"], Priority: 49, Value: 30, HideItem: ["ItemNoseNoseRing"] }, - { Name: "ShinobiMask", Fetish: ["Nylon"], Value: 30, Left: 199, Top: 88, Priority: 49, HideItem: ["ItemNoseNoseRing", "ItemMouthCaneGag", "ItemMouthCropGag"] }, - { - Name: "FoxMask", Fetish: ["Pet"], Priority: 49, Value: 30, Left: 150, Top: 20, HideItem: ["ItemNoseNoseRing"], Layer: [ - { Name: "Upper" }, - { Name: "Lower" }, - ] - }, - { - Name: "BunnyMask1", Fetish: ["Pet"], Value: 40, Left: 150, Top: 20, HideItem: ["ItemNoseNoseRing", "HairAccessory1Ears1", "HairAccessory2Ears1", "HairAccessory1PonyEars1", "HairAccessory2PonyEars1", "HairAccessory1FoxEars1", "HairAccessory2FoxEars1", "HairAccessory1FoxEars3", "HairAccessory2FoxEars3", "HairAccessory1RaccoonEars1", "HairAccessory2RaccoonEars1", "HatVeil1", "HatVeil2", "HatCaptainHat1", "HatPoliceWomanHat"], Hide: ["Glasses"], Extended: true, HasType: false, - Layer: [ - { Name: "Base", HasType: false }, - { Name: "Ears", CopyLayerColor: "Base", HasType: false, AllowTypes: [""] } - ], - }, - { Name: "BunnyMask2", Fetish: ["Pet"], Value: 40, Left: 150, Top: 20, HideItem: ["ItemNoseNoseRing", "HairAccessory1Ears1", "HairAccessory2Ears1", "HairAccessory1PonyEars1", "HairAccessory2PonyEars1", "HairAccessory1FoxEars1", "HairAccessory2FoxEars1", "HairAccessory1FoxEars3", "HairAccessory2FoxEars3", "HairAccessory1RaccoonEars1", "HairAccessory2RaccoonEars1", "HatVeil1", "HatVeil2", "HatCaptainHat1", "HatPoliceWomanHat"], Hide: ["Glasses"] }, - { Name: "BunnyMask3", Fetish: ["Pet"], Value: 40, Left: 150, Top: 20, HideItem: ["ItemNoseNoseRing", "HairAccessory1Ears1", "HairAccessory2Ears1", "HairAccessory1PonyEars1", "HairAccessory2PonyEars1", "HairAccessory1FoxEars1", "HairAccessory2FoxEars1", "HairAccessory1FoxEars3", "HairAccessory2FoxEars3", "HairAccessory1RaccoonEars1", "HairAccessory2RaccoonEars1", "HatVeil1", "HatVeil2", "HatCaptainHat1", "HatPoliceWomanHat"], Hide: ["Glasses"] }, - { Name: "KittyMask1", Fetish: ["Pet"], Value: 30, Left: 150, Top: 20, HideItem: ["ItemNoseNoseRing", "HatVeil1", "HatVeil2"], Hide: ["Glasses"] }, - { Name: "KittyMask2", Fetish: ["Pet"], Value: 30, Left: 150, Top: 20, HideItem: ["ItemNoseNoseRing", "HatVeil1", "HatVeil2"], Hide: ["Glasses"] }, - { - Name: "KittyMask3", Fetish: ["Pet"], Value: 25, Left: 140, Top: 50, Hide: ["HairFront", "Glasses", "HairAccessory1", "HairAccessory2", "HairAccessory3"], Layer: [ - { Name: "Highlights" }, - { Name: "Mask" }, - ] - }, - { Name: "LaceMask1", Fetish: ["Lingerie"], Value: 25, Left: 150, Top: 20, HideItem: ["ItemNoseNoseRing", "HatVeil1", "HatVeil2"], Hide: ["Glasses"] }, - { Name: "LaceMask2", Fetish: ["Lingerie"], Value: 25, Left: 150, Top: 20, HideItem: ["ItemNoseNoseRing", "HatVeil1", "HatVeil2"], Hide: ["Glasses"] }, - { Name: "FuturisticVisor", Category: ["SciFi"], BuyGroup: "FuturisticVisor", Value: 35, Priority: 27, Random: false, HideItem: ["ItemNoseNoseRing"] }, - { Name: "OpenFaceHood", Fetish: ["Latex"], Value: -1, Priority: 40, Left: 150, Top: 20, DefaultColor: "#404040", BuyGroup: "OpenFace", Hide: ["HairFront"] , Extended: true, HasType: false }, - { - Name: "FaceVeil", Fetish: ["Lingerie"], Value: 20, Priority: 51, Left: 150, Top: 20, Layer: [ - { Name: "Fabric" }, - { Name: "String" }, - ] - }, - { Name: "FacePaint", Value: 10, Left: 150, Top: 20, Priority: 7, BuyGroup: "FacePaint", DefaultColor: ["#9A7F76"], Hide: ["Head"] }, - { - Name: "PetNose", Fetish: ["Pet"], Value: 50, Left: 185, Top: 167, Priority: 24, Extended: true, HasType: false, - DefaultColor: ["#D19D55","#2F2E2E","#BEBEBE","#111111"], - BodyCosplay: true, Layer: [ - { Name: "CheeksNone", ColorGroup: "Cheeks", AllowModuleTypes: ["c0"], }, - { Name: "CheeksSmall", CopyLayerColor: "CheeksNone", AllowModuleTypes: ["c1"], }, - { Name: "CheeksBig", CopyLayerColor: "CheeksNone", AllowModuleTypes: ["c2"], }, - { Name: "Nose", ColorGroup: "Nose", AllowModuleTypes: ["n0"], }, - { Name: "NoseNone", CopyLayerColor: "Nose", AllowModuleTypes: ["n1"], }, - { Name: "Gloss", ColorGroup: "Gloss", AllowModuleTypes: ["n0"], }, // Show only with nose - { Name: "WhiskersNone", ColorGroup: "Whiskers", AllowModuleTypes: ["w0"], }, - { Name: "WhiskersShort", CopyLayerColor: "WhiskersNone", AllowModuleTypes: ["w1"], }, - { Name: "WhiskersLong", CopyLayerColor: "WhiskersNone", AllowModuleTypes: ["w2"], }, - ], - }, //PetNose - { - Name: "Glitter", Value: 10, Priority: 8, BuyGroup: "Glitter", Left: 150, Top: 20, DefaultColor:["#DCA07C","#DCA07C"], Extended: true, BodyCosplay: true, - Layer:[ - {Name: "Freckles", HasType: false, AllowTypes:[""]}, - {Name: "Freckles2", HasType: false, AllowTypes:[""]}, - {Name: "MidFreckles", HasType: false, AllowTypes:["MidFreckles"], CopyLayerColor: "Freckles"}, - {Name: "SplitFreckles", HasType: false, AllowTypes:["SplitFreckles"], CopyLayerColor: "Freckles"}, - {Name: "SplitFreckles2", HasType: false, AllowTypes:["SplitFreckles"], CopyLayerColor: "Freckles2"}, - {Name: "FrecklesSmall", HasType: false, AllowTypes:["FrecklesSmall"], CopyLayerColor: "Freckles"}, - {Name: "Freckles2Small", HasType: false, AllowTypes:["FrecklesSmall"], CopyLayerColor: "Freckles2"}, - {Name: "MidFrecklesSmall", HasType: false, AllowTypes:["MidFrecklesSmall"], CopyLayerColor: "Freckles"}, - {Name: "SplitFrecklesSmall", HasType: false, AllowTypes:["SplitFrecklesSmall"], CopyLayerColor: "Freckles"}, - {Name: "SplitFreckles2Small", HasType: false, AllowTypes:["SplitFrecklesSmall"], CopyLayerColor: "Freckles2"}, - {Name: "StarsLeft", HasType: false, AllowTypes:["StarsBoth", "StarsLeft"], CopyLayerColor: "Freckles2"}, - {Name: "StarsLeft2", HasType: false, AllowTypes:["StarsBoth", "StarsLeft"], CopyLayerColor: "Freckles"}, - {Name: "StarsRight", HasType: false, AllowTypes:["StarsBoth", "StarsRight"], CopyLayerColor: "Freckles2"}, - {Name: "StarsRight2", HasType: false, AllowTypes:["StarsBoth", "StarsRight"], CopyLayerColor: "Freckles"}, - {Name: "DotsLeft", HasType: false, AllowTypes:["DotsBoth", "DotsLeft"], CopyLayerColor: "Freckles"}, - {Name: "DotsLeft2", HasType: false, AllowTypes:["DotsBoth", "DotsLeft"], CopyLayerColor: "Freckles2"}, - {Name: "DotsRight", HasType: false, AllowTypes:["DotsBoth", "DotsRight"], CopyLayerColor: "Freckles"}, - {Name: "DotsRight2", HasType: false, AllowTypes:["DotsBoth", "DotsRight"], CopyLayerColor: "Freckles2"}, - ] - }, - { - Name: "HeadHarness", Priority: 51, Value: 20, BuyGroup: "Headharness", Left: 150, Top: 22, DefaultColor: ["#383838"], Extended:true, - Layer:[ - {Name: "BaseMetal", HasType: false, AllowTypes:["","Heavy"], AllowColorize: false}, - {Name: "Base", HasType: false, AllowTypes:["","Heavy"]}, - {Name: "HeavyMetal", HasType: false, AllowTypes:["Heavy"], AllowColorize: false}, - {Name: "Heavy", HasType: false, AllowTypes:["Heavy"], CopyLayerColor: "Base"}, - ], - }, //HeadHarness - ], - Color: ["Default", "#303030", "#808080", "#e0e0e0", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"], - }, - - { - Group: "TailStraps", - Priority: 4, - Default: false, - Clothing: true, - Random: false, - Underwear: true, - BodyCosplay: true, - Left: 0, - Top: 150, - PreviewZone: [0, 200, 500, 500], - Asset: [ - { Name: "TailStrap", Fetish: ["Pet"], Value: 30, Top: 180, Layer: [ - { Name: "Tail"}, - { Name: "Ribbon"}, - { Name: "Bell"}, - ] }, - { Name: "HorseTailStrap", Fetish: ["Pony"], Value: 20, Top: 110, AllowPose: ["AllFours"] }, - { Name: "HorseTailStrap1", Fetish: ["Pony"], Value: 30, Top: 110, AllowPose: ["AllFours"] }, - { Name: "FoxTailsStrap", Fetish: ["Pet"], Priority: 2, Value: 50, Top: 120, Layer: [ - { Name: "Tips"}, - { Name: "Bases"} - ] }, - { Name: "PuppyTailStrap", Fetish: ["Pet"], Value: 15, Top: 130, AllowPose: ["AllFours"] }, - { Name: "SuccubusTailStrap", Fetish: ["Pet"], Value: 10, AllowPose: ["AllFours"] }, - { Name: "SuccubusHeartTailStrap", Fetish: ["Pet"], Value: 15, Layer: [ - { Name: "Heart"}, - { Name: "Tail"} - ]}, - { Name: "RaccoonStrap", Fetish: ["Pet"], Value: 25 }, - { Name: "RaccoonTailStrap", Fetish: ["Pet"], Priority: 2, Value: 35 }, - { Name: "PuppyTailStrap1", Fetish: ["Pet"], Value: 20, AllowPose: ["AllFours"] }, - { Name: "KittenTailStrap1", Fetish: ["Pet"], Value: 20, Top: 100 }, - { Name: "KittenTailStrap2", Fetish: ["Pet"], Value: 20, AllowPose: ["AllFours"] }, - { Name: "FoxTailStrap1", Fetish: ["Pet"], Value: 20, Top: 170, Layer: [ - { Name: "Tip"}, - { Name: "Base"} - ] }, - { Name: "FoxTailStrap2", Fetish: ["Pet"], Value: 20, Top: 200, Layer: [ - { Name: "Tip"}, - { Name: "Base"} - ]}, - { Name: "WolfTailStrap1", Fetish: ["Pet"], Value: 20 }, - { Name: "WolfTailStrap2", Fetish: ["Pet"], Value: 20, AllowPose: ["AllFours"] }, - { Name: "WolfTailStrap3", Fetish: ["Pet"], Value: 20, Top: 140, AllowPose: ["AllFours"] }, - { Name: "DemonPlug", Fetish: ["Pet"], Value: 30, AllowPose: ["AllFours"] }, - { Name: "MouseTailStrap1", Fetish: ["Pet"], Value: 20, Top: 120 }, - { Name: "MouseTailStrap2", Fetish: ["Pet"], Value: 20 }, - { Name: "CowtailStrap", Fetish: ["Pet"], BuyGroup: "CowTails", Value: 20, AllowPose: ["AllFours"] }, - { Name: "BunnyTailStrap", Fetish: ["Pet"], Value: 1, Visible: false, }, - { Name: "DragonTailStrap1", Fetish: ["Pet"], Value: 20, - Layer: [ - { Name: "Primary" }, - { Name: "Secondary" } - ] - }, - { - Name: "Tentacles", Category: ["Fantasy"], BuyGroup: "Tentacles", Random: false, Value: 250, Top: 0, - DefaultColor: ["#c43ba4", "#b832b6", "#9221ba"], - AllowActivity: ["PenetrateItem"], - Layer: [ - { Name: "Inner" }, - { Name: "Sucker" }, - { Name: "InnerShine", AllowColorize: false }, - { Name: "Outer" }, - { Name: "OuterShine", AllowColorize: false }, - ], - }, - ], - Color: ["Default", "#cccccc", "#aaaaaa", "#888888", "#666666", "#444444", "#222222", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Wings", - Priority: 3, - Default: false, - Random: false, - Clothing: true, - Underwear: true, - BodyCosplay: true, - PreviewZone: [0, 50, 500, 500], - Asset: [ - { Name: "SuccubusFeather", Value: 35 }, - { Name: "SuccubusWings", Value: 35 }, - { Name: "AngelFeather", Value: 50 }, - { Name: "DevilWings", Value: 25 }, - { Name: "FallenAngelWings", Value: 50 }, - { Name: "AngelWings", Value: 50 }, - { Name: "BatWings", Value: 20 }, - { Name: "FairyWings", Value: 50 }, - { - Name: "SteampunkWings", Value: 90, DefaultColor: ["#707070", "#707070", "#2F2DCC", "#707070"], HasType: false, Extended: true, DynamicBeforeDraw: true, DynamicScriptDraw: true, Layer: [ - { Name: "Base" }, - { Name: "Gears" }, - { Name: "Wings" }, - { Name: "WingFrames" } - ] - }, - { - Name: "BeeWings", Value: 50, DefaultColor: ["#4896c3", "#ccd44f"], - Layer: [ - { Name: "Wings" }, - { Name: "Veins", AllowColorize: false }, - { Name: "Bone" }, - ], - }, - { - Name: "CyberWings", Value: 60, DefaultColor: ["#2ab4c5", "#b21fd8", "#25dce6"], - Layer: [ - { Name: "Base" }, - { Name: "Shade" }, - { Name: "Highlights" }, - ], - }, - { - Name: "PixieWings", Value: 50, DefaultColor: ["#0e70b4", "#086cb2"], - Layer: [ - { Name: "Wings" }, - { Name: "Veins" }, - ], - }, - ], - Color: ["Default", "#cccccc", "#aaaaaa", "#888888", "#666666", "#444444", "#222222", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "Height", - AllowNone: false, - AllowColorize: false, - Asset: [ - { Name: "H0950", Visible: false, Zoom: 0.950 }, - { Name: "H0960", Visible: false, Zoom: 0.960 }, - { Name: "H0970", Visible: false, Zoom: 0.970 }, - { Name: "H0980", Visible: false, Zoom: 0.980 }, - { Name: "H0990", Visible: false, Zoom: 0.990 }, - { Name: "H1000", Visible: false, Zoom: 1.000 }, - { Name: "H0900", Visible: false, Zoom: 0.900 }, - { Name: "H0910", Visible: false, Zoom: 0.910 }, - { Name: "H0920", Visible: false, Zoom: 0.920 }, - { Name: "H0930", Visible: false, Zoom: 0.930 }, - { Name: "H0940", Visible: false, Zoom: 0.940 } - ] - }, - - { - Group: "BodyUpper", - Priority: 7, - AllowNone: false, - AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "Hogtied", "AllFours", "OverTheHead"], - Asset: ["Small", "Normal", "Large", "XLarge"], - Color: ["White", "Asian", "Black"], - ColorSuffix: { "HEX_COLOR": "White" }, - }, - - { - Group: "BodyLower", - ParentSize: "BodyUpper", - ParentColor: "BodyUpper", - Priority: 9, - Top: 462, - AllowNone: false, - AllowPose: ["LegsClosed", "Kneel", "KneelingSpread", "Spread"], - Asset: ["Small", "Normal", "Large", "XLarge"], - Color: ["Default", "White", "Asian", "Black"], - ColorSuffix: { "HEX_COLOR": "White" }, - InheritColor: "BodyUpper" - - }, - - { - Group: "HairFront", - Priority: 52, - Left: 150, - Top: 50, - AllowNone: false, - PreviewZone: [140, 40, 220, 220], - Asset: ["HairFront1", "HairFront1b", "HairFront2", "HairFront2b", "HairFront3", "HairFront3b", "HairFront4", - "HairFront4b", "HairFront5", "HairFront5b", "HairFront6", "HairFront6b", "HairFront7", "HairFront7b", - "HairFront8", "HairFront8b", "HairFront9", "HairFront9b", "HairFront10", "HairFront10b", "HairFront11", - "HairFront11b", "HairFront12", "HairFront12b", "HairFront13", "HairFront13b", "HairFront14", "HairFront14b", - "HairFront15", "HairFront16", "HairFront17", "HairFront17b", "HairFront18", "HairFront19", "HairFront20", - "HairFront21", - { Name: "HairFront22", Top: 6, Left: 134, - Layer: [ - { Name: "Base", Priority: 51 }, - { Name: "Fluff" }, - { Name: "Tip" }, - { Name: "FrontFluff", Priority: 54, CopyLayerColor: "Fluff" } - ], - }, //HairFront22 - { Name: "HairFront22b", Top: 6, Left: 134, - Layer: [ - { Name: "Base",Priority: 51 }, - { Name: "Fluff" }, - { Name: "Tip" }, - { Name: "FrontFluff", Priority: 54, CopyLayerColor: "Fluff"}, - { Name: "FrontTip", Priority: 54.5, CopyLayerColor: "Tip" }, - ], - }, //HairFront22b - { Name: "HairFront23", Top: 6, Left: 134, - Layer: [ - { Name: "Base",Priority: 51 }, - { Name: "Fluff" }, - { Name: "Tip" }, - { Name: "FrontFluff", Priority: 54, CopyLayerColor: "Fluff" }, - ], - }, //HairFront23 - { Name: "HairFront23b", Top: 6, Left: 134, - Layer: [ - { Name: "Base", Priority: 51 }, - { Name: "Fluff" }, - { Name: "Tip" }, - { Name: "FrontFluff", Priority: 54, CopyLayerColor: "Fluff" }, - { Name: "FrontTip", Priority: 54.5, CopyLayerColor: "Tip" }, - ], - }, //HairFront23b - { Name: "HairFront24" }, - { Name: "HairFront25" }, - { Name: "HairFront26" }, - { Name: "HairFront27", AllowPose: ["Suspension"], - Layer: [ - { Name: "Base" }, - { Name: "Bangs", Priority: 54, CopyLayerColor: "Base" }, - { Name: "BangsTip", Priority: 54}, - ], - Top: -200, Left: 0 }, - { Name: "HairFront28", - Layer: [ - { Name: "Base" }, - { Name: "Bangs" }, - { Name: "Tips", Priority: 54 }, - ], - }, //HairFront28 - { Name: "HairFront29", - Layer: [ - { Name: "Left", Priority: 53 }, - { Name: "Right" }, - ], - },//HairFront29 - ], - Color: ["#6a3628", "#202020", "#dcc787", "#6c2132", "#999999", "#dddddd", "#e781b1", "#81e7b1", "#81b1e7", "#eeee99", "#ee9999", "#ee99ee"] - }, - - { - Group: "HairBack", - ParentColor: "HairFront", - Priority: 5, - Left: 50, - Top: 0, - AllowNone: false, - PreviewZone: [55, 0, 390, 390], - Asset: [ - { Name: "HairNone", Visible: false }, - { Name: "HairBack1", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack1b" }, - { Name: "HairBack2", AllowPose: ["Suspension"] }, - { Name: "HairBack2b" }, - { Name: "HairBack4", AllowPose: ["Hogtied"], HideForPose: ["Suspension", "AllFours"] }, - { Name: "HairBack4b" }, - { Name: "HairBack10", AllowPose: ["Suspension"] }, - { Name: "HairBack10b" }, - { Name: "HairBack14", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack15", AllowPose: ["Suspension"] }, - { Name: "HairBack15b" }, - { Name: "HairBack16", AllowPose: ["Suspension", "Hogtied", "AllFours"] }, - { Name: "HairBack17", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack18", HideForPose: ["Hogtied"] }, - { Name: "HairBack18b" }, - { Name: "HairBack19", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack19b" }, - { Name: "HairBack20", AllowPose: ["Suspension", "Hogtied", "AllFours"] }, - { Name: "HairBack20b" }, - { Name: "HairBack5", AllowPose: ["Suspension"] }, - { Name: "HairBack5b" }, - { Name: "HairBack8", AllowPose: ["Suspension", "AllFours"], HideForPose: ["Hogtied"] }, - { Name: "HairBack11", AllowPose: ["Suspension", "Hogtied", "AllFours"] }, - { Name: "HairBack6" }, - { Name: "HairBack6b" }, - { Name: "HairBack21", HideForPose: ["Suspension"] }, - { Name: "HairBack22", HideForPose: ["Suspension"] }, - { Name: "HairBack23", AllowPose: ["Suspension", "AllFours"], Priority: 48 }, - { Name: "HairBack24", AllowPose: ["Suspension", "AllFours"], Priority: 48 }, - { Name: "HairBack25", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack26", AllowPose: ["Suspension", "Hogtied", "AllFours"] }, - { Name: "HairBack27", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack28", AllowPose: ["Hogtied"] }, - { Name: "HairBack29", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack30", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack31", AllowPose: ["Suspension"] }, - { Name: "HairBack32", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack33", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack34", AllowPose: ["Suspension", "Hogtied", "AllFours"] }, - { Name: "HairBack35", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack36", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack37", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack38", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack39", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack40", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack41", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack42", AllowPose: ["Suspension", "Hogtied", "AllFours"] }, - { Name: "HairBack43", AllowPose: ["Suspension", "Hogtied", "AllFours"] }, - { Name: "HairBack44", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack45", AllowPose: ["Suspension", "Hogtied"] }, - { Name: "HairBack46" }, - { Name: "HairBack47" }, - { Name: "HairBack48", AllowPose: ["Hogtied"] }, - { Name: "HairBack49" }, - { Name: "HairBack50", AllowPose: ["Suspension", "Hogtied", "AllFours"] }, - { Name: "HairBack51" }, - { Name: "HairBack52" }, - { - Name: "HairBack53", - Layer:[ - { Name: "Base" }, - { Name: "Tip" }, - ], - Top: -5, Left: 0 - }, - { - Name: "HairBack54", AllowPose: ["Suspension"], - Layer: [ - { Name: "Left" }, - { Name: "Right" }, - ] - }, - { Name: "HairBack55" }, - ], - Color: ["Default", "#6a3628", "#202020", "#dcc787", "#6c2132", "#999999", "#dddddd", "#e781b1", "#81e7b1", "#81b1e7", "#eeee99", "#ee9999", "#ee99ee"], - InheritColor: "HairFront" - }, - - { - Group: "Eyes", - Priority: 9, - Left: 200, - Top: 145, - Blink: true, - FullAlpha: false, - AllowNone: false, - AllowExpression: ["Closed", "Dazed", "Shy", "Sad", "Horny", "Lewd", "VeryLewd", "Heart", "HeartPink", "LewdHeart", "LewdHeartPink", "Dizzy", "Daydream", "ShylyHappy", "Angry", "Surprised", "Scared"], - MirrorGroup: "Eyes2", - PreviewZone: [190, 100, 120, 120], - Asset: ["Eyes1", "Eyes2", "Eyes3", "Eyes4", "Eyes5", "Eyes6", "Eyes7", "Eyes8", "Eyes9", "Eyes10", "Eyes11", "Eyes12", "Eyes13"], - Color: ["Default", "#6a3628", "#5e481e", "#666666", "#555588", "#558855", "#885555", "#202020", "#aa3333", "#33aa33", "#3333aa", "#aaaa33", "#33aaaa", "#aa33aa"] - }, - - { - Group: "Eyes2", - Priority: 9, - Left: 250, - Top: 145, - Blink: true, - FullAlpha: false, - AllowNone: false, - AllowExpression: ["Closed", "Dazed", "Shy", "Sad", "Horny", "Lewd", "VeryLewd", "Heart", "HeartPink", "LewdHeart", "LewdHeartPink", "Dizzy", "Daydream", "ShylyHappy", "Angry", "Surprised", "Scared"], - MirrorGroup: "Eyes", - PreviewZone: [190, 100, 120, 120], - Asset: [{ Name: "Eyes1", ParentItem: "Eyes1" }, { Name: "Eyes2", ParentItem: "Eyes2" }, { Name: "Eyes3", ParentItem: "Eyes3" }, { Name: "Eyes4", ParentItem: "Eyes4" }, { Name: "Eyes5", ParentItem: "Eyes5" }, { Name: "Eyes6", ParentItem: "Eyes6" }, { Name: "Eyes7", ParentItem: "Eyes7" }, { Name: "Eyes8", ParentItem: "Eyes8" }, { Name: "Eyes9", ParentItem: "Eyes9" }, { Name: "Eyes10", ParentItem: "Eyes10" }, { Name: "Eyes11", ParentItem: "Eyes11" }, { Name: "Eyes12", ParentItem: "Eyes12" }, { Name: "Eyes13", ParentItem: "Eyes13" }], - Color: ["Default", "#6a3628", "#5e481e", "#666666", "#555588", "#558855", "#885555", "#202020", "#aa3333", "#33aa33", "#3333aa", "#aaaa33", "#33aaaa", "#aa33aa"] - }, - - { - Group: "Mouth", - Priority: 10, - Left: 235, - Top: 180, - AllowNone: false, - AllowExpression: ["Frown", "Sad", "Pained", "Angry", "HalfOpen", "Open", "Ahegao", "Moan", "TonguePinch", "LipBite", "Happy", "Devious", "Laughing", "Grin", "Smirk", "Pout"], - PreviewZone: [190, 100, 120, 120], - Asset: [ - { - Name: "Regular", - Layer: [ - { Name: "Lips", AllowColorize: true }, - { Name: "Inner", AllowColorize: false } - ] - }, - { Name: "Discreet" } - ], - Color: ["Default", "#803d26", "#aa5555", "#cc3333", "#55aa55", "#5555aa", "#55aaaa", "#aa55aa", "#aaaa55"], - }, - - { - Group: "Nipples", - ParentGroup: "BodyUpper", - Priority: 11, - Left: 175, - Top: 285, - AllowNone: false, - Asset: ["Nipples1", "Nipples2", "Nipples3"], - Color: ["Default", "#a6665b", "#803d26", "#d68777", "#9b4a2e", "#bb6655"], - ColorSuffix: { "White": "Default", "Asian": "Default", "Black": "Default" }, - InheritColor: "BodyUpper", - }, - - { - Group: "Pussy", - Priority: 12, - Left: 225, - Top: 500, - FullAlpha: false, - AllowNone: false, - Asset: ["PussyLight1", "PussyLight2", "PussyLight3", "PussyDark1", "PussyDark2", "PussyDark3"], - Color: ["Default", "#6a3628", "#443330", "#222222"], - ColorSuffix: { "White": "Default", "Asian": "Default", "Black": "Default" }, - InheritColor: "BodyUpper", - }, - - // Facial Expression specific - { - Group: "Blush", - Priority: 8, - Left: 190, - Top: 100, - AllowNone: false, - AllowColorize: true, - AllowCustomize: false, - AllowExpression: ["Low", "Medium", "High", "VeryHigh", "Extreme", "ShortBreath"], - Asset: ["Blush"] - }, - - { - Group: "Fluids", - Priority: 12, - Left: 200, - Top: 145, - AllowNone: false, - AllowColorize: true, - AllowCustomize: false, - AllowExpression: ["DroolLow", "DroolMedium", "DroolHigh", "DroolSides", "DroolMessy", "DroolTearsLow", "DroolTearsMedium", "DroolTearsHigh", "DroolTearsMessy", "DroolTearsSides", "TearsHigh", "TearsMedium", "TearsLow"], - Asset: ["Fluids"] - }, - - { - Group: "Emoticon", - Priority: 60, - Left: 250, - Top: 0, - AllowNone: false, - AllowColorize: true, - AllowCustomize: false, - AllowExpression: ["Afk", "Whisper", "Sleep", "Hearts", "Tear", "Hearing", "Confusion", "Exclamation", "Annoyed", "Read", "RaisedHand", "Spectator", "ThumbsDown", "ThumbsUp", "LoveRope", "LoveGag", "LoveLock", "Wardrobe", "Gaming"], - Asset: ["Emoticon"] - }, - // Uncolorable body parts - { - Group: "Eyebrows", - Priority: 9, - Left: 200, - Top: 120, - AllowNone: false, - AllowColorize: false, - AllowCustomize: false, - AllowExpression: ["Raised", "Lowered", "OneRaised", "Harsh", "Angry", "Soft"], - Asset: ["Eyebrows1"] - }, - - { - Group: "Hands", - ParentColor: "BodyUpper", - Priority: 27, - AllowNone: false, - AllowCustomize: false, - AllowPose: ["TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "AllFours"], - Asset: [{ Name: "Default", HideForPose: ["BackBoxTie", "BackCuffs", "BackElbowTouch"] }], - ColorSuffix: { "HEX_COLOR": "White" }, - InheritColor: "BodyUpper", - Color: ["Default"], - }, - - { - Group: "Head", - ParentColor: "BodyUpper", - Priority: 7, - AllowNone: false, - AllowCustomize: false, - Asset: ["Default"], - ColorSuffix: { "HEX_COLOR": "White" }, - InheritColor: "BodyUpper" - }, - - // Item specific - { - Group: "ItemFeet", - ParentGroup: "BodyLower", - Category: "Item", - Priority: 27, - Default: false, - IsRestraint: true, - Left: 125, - Top: 725, - Effect: ["Freeze", "Prone"], - FreezeActivePose: ["BodyLower"], - Zone: [[100, 750, 300, 120]], - Asset: [ - { Name: "NylonRope", Fetish: ["Rope", "Nylon"], Value: 30, Time: 15, BuyGroup: "NylonRope", SetPose: ["LegsClosed"], Audio: "RopeShort", Extended: true, AllowActivePose: ["Kneel"], DynamicBeforeDraw: true, - DefaultColor: ["#CCCCCC","#CCCCCC", "#CCCCCC"], - Layer: [ - { Name: "UpperRope", HasType: false, AllowTypes: ["Knees", "AnklesKnees"] }, - { Name: "LowerRope", HasType: false, AllowTypes: ["", "AnklesKnees"] }, - { Name: "BedSpreadEagleRope", HasType: false, AllowTypes: ["BedSpreadEagle"] }, - { Name: "UpperShine", AllowColorize: false, HasType: false, AllowTypes: ["Knees", "AnklesKnees"] }, - { Name: "LowerShine", AllowColorize: false, HasType: false, AllowTypes: ["", "AnklesKnees"] }, - { Name: "BedSpreadEagleShine", AllowColorize: false, HasType: false, AllowTypes: ["BedSpreadEagle"] }, - ] - }, - { Name: "HempRope", Fetish: ["Rope"], Value: 60, Difficulty: 3, Time: 15, DefaultColor: "#956B1C", BuyGroup: "HempRope", HideItem: ["ItemMiscTeddyBear", "ItemDevicesLittleMonster", "ItemDevicesFamiliar"], SetPose: ["LegsClosed"], Audio: "RopeShort", Extended: true, AllowActivePose: ["Kneel"], DynamicBeforeDraw: true }, - { Name: "LeatherBelt", Fetish: ["Leather"], Value: 25, Time: 10, RemoveTime: 5, AllowLock: true, SetPose: ["LegsClosed"], AllowActivePose: ["Kneel"] }, - { Name: "SturdyLeatherBelts", Fetish: ["Leather"], Value: 50, Time: 10, RemoveTime: 5, AllowLock: true, BuyGroup: "SturdyLeatherBelts", SetPose: ["LegsClosed"], Extended: true, AllowActivePose: ["Kneel"], Audio: "Buckle", - DefaultColor: ["#11161B", "#403E40", "#11161B", "#403E40", "#11161B", "#403E40"], - Layer: [ - { Name: "LowerBelt", ColorGroup: "Belts", HasType: false, AllowTypes: ["", "Two", "Three"] }, - { Name: "LowerMetal", ColorGroup: "Metal", HasType: false, AllowTypes: ["", "Two", "Three"] }, - { Name: "UpperBelt", ColorGroup: "Belts", HasType: false, AllowTypes: ["Two", "Three"] }, - { Name: "UpperMetal", ColorGroup: "Metal", HasType: false, AllowTypes: ["Two", "Three"] }, - { Name: "FeetBelt", ColorGroup: "Belts", HasType: false, AllowTypes: ["Three"] }, - { Name: "FeetMetal", ColorGroup: "Metal", HasType: false, AllowTypes: ["Three"] }, - ], - }, - { Name: "Irish8Cuffs", Fetish: ["Metal"], Value: 25, Difficulty: 5, Time: 10, RemoveTime: 5, AllowLock: true, Audio: "CuffsMetal", SetPose: ["LegsClosed"], AllowActivePose: ["Kneel"] }, - { Name: "DuctTape", Fetish: ["Tape"], Value: 50, Time: 15, RemoveTime: 10, BuyGroup: "DuctTape", Audio: "DuctTapeRoll", HideItem: ["ItemBootsThighHighLatexHeels", "ItemBootsHighThighBoots"], SetPose: ["LegsClosed"], Extended: true, AllowActivePose: ["Kneel"] }, - { Name: "LeatherAnkleCuffs", Fetish: ["Leather"], Priority: 24, Value: 30, Difficulty: 2, Time: 10, Random: false, AllowLock: true, AllowPose: ["LegsClosed", "Spread", "KneelingSpread"], Effect: ["CuffedFeet"], Extended: true, AllowActivePose: ["Kneel", "KneelingSpread"], HasType: false, RemoveItemOnRemove: [{ Name: "X-Cross", Group: "ItemDevices" }], FreezeActivePose: [], - DefaultColor: ["Default", "#2E2E2E", "Default"], - Layer: [ - { Name: "Chain", ParentGroup: null, AllowTypes: ["Chained"]}, - { Name: "Cuffs" }, - { Name: "Rings" }, - ] - }, - { - Name: "FloorShackles", Fetish: ["Metal"], Priority: 24, Left: 0, Value: 20, Difficulty: 6, Time: 10, AllowLock: true, Prerequisite: ["NoItemLegs", "LegsOpen"], SetPose: ["Spread"], Effect: ["Freeze", "Prone", "BlockKneel"], Block: ["ItemLegs", "ItemBoots", "ItemDevices"], AllowActivityOn: ["ItemLegs", "ItemBoots"], - Layer: [ - { Name: "Chain", Priority: 6 }, - { Name: "Cuffs" } - ] - }, - { Name: "SteelAnkleCuffs", Fetish: ["Metal"], Priority: 24, Value: 30, Difficulty: 6, Time: 10, Random: false, AllowLock: true, DrawLocks: false, AllowPose: ["LegsClosed", "Spread"], HideForPose: ["Kneel"], Effect: ["CuffedFeet"], Extended: true, AllowActivePose: ["Kneel"], HasType: false, RemoveItemOnRemove: [{ Name: "X-Cross", Group: "ItemDevices" }], FreezeActivePose: [], - Layer: [ - { Name: "Chain", ParentGroup: null, AllowTypes: ["Chained"]}, - { Name: "Cuffs" } - ] - }, - { Name: "FuturisticAnkleCuffs", Category: ["SciFi"], Fetish: ["Metal"], DefaultColor: ["Default", "#40812C", "#707070"], Audio: "FuturisticApply", Priority: 24, Value: 45, Difficulty: 4, Time: 10, Random: false, AllowLock: true, DrawLocks: false, - AllowPose: ["LegsClosed", "Spread"], FuturisticRecolor: true, Effect: [ "CuffedFeet"], Extended: true, AllowActivePose: ["Kneel"], HasType: false, RemoveItemOnRemove: [{ Name: "X-Cross", Group: "ItemDevices" }], FreezeActivePose: [], - Layer: [ - { Name: "Chain", ParentGroup: null, AllowTypes: ["Chained"]}, - { Name: "Display", ParentGroup: null}, - { Name: "Cuffs" }, - { Name: "Lock", LockLayer: true,AllowColorize: true, HasType: false, ParentGroup: null}, - ] - }, - { - Name: "OrnateAnkleCuffs", Fetish: ["Metal"], Priority: 24, Value: 90, Difficulty: 3, Time: 10, Random: false, AllowLock: true, Audio: "CuffsMetal", AllowPose: ["LegsClosed", "Spread"], Effect: ["CuffedFeet"], Extended: true, AllowActivePose: ["Kneel"], HasType: false, RemoveItemOnRemove: [{ Name: "X-Cross", Group: "ItemDevices" }], FreezeActivePose: [], - Layer: [ - { Name: "Chain", ParentGroup: null, AllowTypes: ["Chained"]}, - { Name: "Cuffs" }, - { Name: "Gems" }, - ] - }, - { Name: "SpreaderMetal", Fetish: ["Metal"], Value: 50, Difficulty: 3, Time: 10, Random: false, AllowLock: true, Prerequisite: ["NotKneeling", "LegsOpen"], Block: ["ItemLegs"], AllowActivityOn: ["ItemLegs"], Extended: true, RemoveAtLogin: true, SetPose: ["LegsOpen"] }, - { Name: "BallChain", Fetish: ["Metal"], Value: 40, Difficulty: 5, Time: 10, RemoveTime: 10, Random: false, AllowLock: true, AllowPose: ["LegsClosed"], Effect: ["Slow"], FreezeActivePose: [] }, - { Name: "AnkleShackles", Fetish: ["Metal"], Value: 30, Difficulty: 6, Time: 10, RemoveTime: 5, Random: false, AllowLock: true, Audio: "CuffsMetal", AllowPose: ["LegsClosed"], Effect: ["Prone","Slow"], FreezeActivePose: [] }, - { Name: "PlasticWrap", Value: 100, Difficulty: 7, Time: 30, RemoveTime: 25, BuyGroup: "PlasticWrap", SetPose: ["LegsClosed"]}, - { Name: "Zipties", Value: 20, Difficulty: 6, Time: 5, RemoveTime: 6, BuyGroup: "Zipties", SetPose: ["LegsClosed"], Audio: "ZipTie", Extended: true, AllowActivePose: ["LegsClosed", "Kneel"], FreezeActivePose: [] }, - { Name: "Chains", Fetish: ["Metal"], Value: 90, Difficulty: 5, Time: 20, AllowLock: true, BuyGroup: "Chains", Audio: "ChainLong", SetPose: ["LegsClosed"], Extended: true, AllowActivePose: ["Kneel"] }, - { - Name: "SpreaderDildoBar", Fetish: ["Metal", "Leather"], Priority: 25, Value: 60, Difficulty: 5, Time: 10, Random: false, AllowLock: true, Top: 400, Prerequisite: ["AccessVulva", "LegsOpen", "NotSuspended", "NotHogtied", "NotHorse", "NotKneeling", "NotChaste", "VulvaEmpty"], SetPose: ["LegsOpen"], Effect: ["FillVulva", "Freeze", "Prone", "BlockKneel"], Block: ["ItemPelvis", "ItemLegs", "ItemVulva"], AllowActivityOn: ["ItemPelvis", "ItemLegs"], - Layer: [ - { Name: "DildoBar", AllowColorize: true }, - { Name: "Pussy", AllowColorize: false } - ], RemoveAtLogin: true - }, - { - Name: "SpreaderVibratingDildoBar", Fetish: ["Metal", "Leather"], Priority: 25, Value: 70, Difficulty: 5, Time: 10, Random: false, AllowLock: true, Top: 400, Prerequisite: ["AccessVulva", "LegsOpen", "NotSuspended", "NotHogtied", "NotHorse", "NotKneeling", "NotChaste", "VulvaEmpty"], SetPose: ["LegsOpen"], Effect: ["FillVulva", "Egged", "Freeze", "Prone", "BlockKneel"], AllowEffect: ["Egged", "Vibrating"], Block: ["ItemPelvis", "ItemLegs", "ItemVulva"], AllowActivityOn: ["ItemPelvis", "ItemLegs"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], DynamicScriptDraw: true, - Layer: [ - { Name: "DildoBar", AllowColorize: true }, - { Name: "Pussy", AllowColorize: false } - ], RemoveAtLogin: true, ArousalZone: "ItemVulva" - }, - { - Name: "WoodenCuffs", Priority: 24, Value: 30, Difficulty: 2, Time: 5, Random: false, Left: 74, AllowLock: true, Audio: "WoodenCuffs", BuyGroup: "WoodenCuffs", Prerequisite: ["LegsOpen", "NotKneeling"], AllowPose: ["Spread", "LegsClosed"], Effect: ["Freeze", "Prone"], Block: ["ItemLegs"], AllowActivityOn: ["ItemLegs"], RemoveAtLogin: false, Extended: true, HasType: false - }, - { - Name: "MedicalBedRestraints", Value: -1, Difficulty: 5, Time: 5, Random: false, RemoveTime: 5, DefaultColor: "#ccc", AllowLock: true, BuyGroup: "MedicalBedRestraints", Left: 0, Top: 0, - Prerequisite: ["OnBed", "LegsOpen"], SetPose: ["LegsOpen"], Effect: ["Prone", "BlockKneel"], Block: ["ItemDevices"], AvailableLocations: ["Asylum"], - HideItem: ["ClothLowerGown2Skirt", "ClothLowerPajama1"], - Layer: [ - { Name: "Base", Priority: 1, ParentGroup: null }, - { Name: "Straps"} - ], - }, - { - Name: "SuspensionCuffs", Fetish: ["Leather"], Value: 70, Difficulty: 10, SelfBondage: 3, Time: 30, AllowLock: true, Random: false, SetPose: ["LegsOpen", "Suspension"], Effect: ["Block", "Prone", "Freeze"], Block: ["ItemLegs", "ItemBoots"], Prerequisite: ["NotKneeling", "NotMounted", "NotChained", "NotHogtied", "LegsOpen"], Hide: ["Shoes"], OverrideHeight: { Height: -100, Priority: 41 }, - }, - { - Name: "Tentacles", Category: ["Fantasy"], BuyGroup: "Tentacles", Random: false, Value: 250, Difficulty: 6, Time: 15, RemoveTime: 15, Top: 465, Left: 0, Extended: true, - AllowPose: ["Spread"], - SetPose: ["LegsClosed"], - HideItem: ["ShoesBoots1", "ShoesFlippers", "ShoesFuzzyBoots", "ShoesThighHighLatexHeels", "ShoesWoollyBootsTall", "ItemBootsHighThighBoots", "ItemBootsThighHighLatexHeels", "ClothLowerPajama1"], - DefaultColor: ["#c43ba4", "#b832b6", "#9221ba"], - Layer: [ - { Name: "Inner", HasType: false }, - { Name: "Sucker", AllowTypes: [""] }, - { Name: "SuckerSpread", CopyLayerColor: "Sucker", AllowTypes: ["Spread"], ParentGroup: null, HasType: false }, - { Name: "Outer", HasType: false }, - { Name: "Shine", AllowColorize: false, AllowTypes: [""] }, - { Name: "ShineSpread", AllowColorize: false, AllowTypes: ["Spread"], ParentGroup: null, HasType: false }, - ], - }, - { - Name: "Slime", Category: ["Fantasy"], BuyGroup: "Slime", DefaultColor: ["#57ab5e", "#57ab5e"], Random: false, Value: 200, Difficulty: 5, Time: 25, RemoveTime: 40, Top: 650, ParentGroup: null, Prerequisite: ["CanCloseLegs"], SetPose: ["LegsClosed"], AllowActivePose: ["Kneel"], Effect: ["Freeze"], - HideForPose: ["Kneel", "Spread", "KneelingSpread"], - Layer: [ - { Name: "One" }, - { Name: "Two" }, - ], - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemLegs", - ParentGroup: "BodyLower", - Category: "Item", - Priority: 25, - Default: false, - IsRestraint: true, - Left: 125, - Top: 400, - AllowPose: ["Kneel"], - Effect: ["Prone", "KneelFreeze", "Slow"], - FreezeActivePose: ["BodyLower"], - Zone: [[100, 580, 300, 170]], - Asset: [ - { Name: "NylonRope", Fetish: ["Rope", "Nylon"], Value: 30, Time: 10, BuyGroup: "NylonRope", Audio: "RopeShort", SetPose: ["LegsClosed"], AllowPose: ["Kneel", "KneelingSpread"], AllowActivePose: ["Kneel", "LegsClosed"], FreezeActivePose: [], Extended: true, - DefaultColor: ["#CCCCCC","#CCCCCC", "#CCCCCC"], - Layer: [ - { Name: "UpperRope", HasType: false, AllowTypes: ["Thighs", "KneesThighs"] }, - { Name: "LowerRope", HasType: false, AllowTypes: ["", "KneesThighs"] }, - { Name: "FrogtieRope", HasType: false, AllowTypes: ["Frogtie"] }, - { Name: "UpperShine", AllowColorize: false, HasType: false, AllowTypes: ["Thighs", "KneesThighs"] }, - { Name: "LowerShine", AllowColorize: false, HasType: false, AllowTypes: ["", "KneesThighs"] }, - { Name: "FrogtieShine", AllowColorize: false, HasType: false, AllowTypes: ["Frogtie"] }, - ] - }, - { Name: "HempRope", Fetish: ["Rope"], Value: 60, Difficulty: 3, Time: 10, RemoveTime: 15, DefaultColor: "#956B1C", BuyGroup: "HempRope", SetPose: ["LegsClosed"], Extended: true, Audio: "RopeShort", AllowPose: ["Kneel", "KneelingSpread"], AllowActivePose: ["Kneel", "LegsClosed"], FreezeActivePose: [] }, - { Name: "LeatherBelt", Fetish: ["Leather"], Value: 25, Difficulty: 2, Time: 5, AllowLock: true, SetPose: ["LegsClosed"], AllowActivePose: ["Kneel"], Prerequisite: ["CanCloseLegs"] }, - { Name: "SturdyLeatherBelts", Fetish: ["Leather"], Value: 50, Time: 5, AllowLock: true, BuyGroup: "SturdyLeatherBelts", SetPose: ["LegsClosed"], Extended: true, AllowActivePose: ["Kneel"], Prerequisite: ["CanCloseLegs"], Audio: "Buckle", - DefaultColor: ["#11161B", "#403E40", "#11161B", "#403E40"], - Layer: [ - { Name: "LowerBelt", ColorGroup: "Belts", HasType: false, AllowTypes: ["", "Two"] }, - { Name: "LowerMetal", ColorGroup: "Metal", HasType: false, AllowTypes: ["", "Two"] }, - { Name: "UpperBelt", ColorGroup: "Belts", HasType: false, AllowTypes: ["Two"] }, - { Name: "UpperMetal", ColorGroup: "Metal", HasType: false, AllowTypes: ["Two"] }, - ], }, - { Name: "DuctTape", Fetish: ["Tape"], Value: 50, Time: 15, RemoveTime: 10, BuyGroup: "DuctTape", Audio: "DuctTapeRoll", HideItem: ["ItemBootsThighHighLatexHeels", "ShoesThighHighLatexHeels", "ItemBootsHighThighBoots"], SetPose: ["LegsClosed"], Extended: true, AllowActivePose: ["Kneel"], Prerequisite: ["CanCloseLegs"] }, - { Name: "LeatherLegCuffs", Fetish: ["Leather"], Priority: 24, Value: 45, Difficulty: 3, Time: 10, Random: false, AllowLock: true, AllowPose: ["Kneel", "LegsClosed", "KneelingSpread"], Effect: ["CuffedLegs"], Extended: true, AllowActivePose: ["Kneel", "KneelingSpread"], FreezeActivePose: [], HasType: false, - DefaultColor: ["Default", "#2E2E2E", "Default"], - Layer: [ - { Name: "Chain", ParentGroup: null, AllowTypes: ["Chained"]}, - { Name: "Cuffs" }, - { Name: "Rings" }, - ] - }, - { Name: "FuturisticLegCuffs", Category: ["SciFi"], Fetish: ["Metal"], DefaultColor: ["Default", "#40812C", "#707070"], Audio: "FuturisticApply", Priority: 24, Value: 30, Difficulty: 3, Time: 10, Random: false, AllowLock: true, DrawLocks: false, - AllowPose: ["Kneel", "LegsClosed", "KneelingSpread"], FuturisticRecolor: true, Effect: ["CuffedLegs"], Extended: true, AllowActivePose: ["Kneel", "KneelingSpread"], FreezeActivePose: [], HasType: false, HideForPose: ["KneelingSpread"], - Layer: [ - { Name: "Chain", ParentGroup: null, AllowTypes: ["Chained"]}, - { Name: "Display", ParentGroup: null}, - { Name: "Cuffs" }, - { Name: "Lock", LockLayer: true,AllowColorize: true, ParentGroup: null}, - ] - }, - { - Name: "OrnateLegCuffs", Fetish: ["Metal"], Priority: 24, Value: 90, Difficulty: 3, Time: 10, Random: false, AllowLock: true, Audio: "CuffsMetal", AllowPose: ["Kneel", "LegsClosed", "KneelingSpread"], Effect: ["CuffedLegs"], Extended: true, AllowActivePose: ["Kneel", "KneelingSpread"], FreezeActivePose: [], HasType: false, - Layer: [ - { Name: "Chain", ParentGroup: null, AllowTypes: ["Chained"]}, - { Name: "Cuffs" }, - { Name: "Gems" }, - ] - }, - { - Name: "LegBinder", Fetish: ["Latex"], Value: 80, Difficulty: 15, Time: 30, RemoveTime: 20, AllowLock: true, DefaultColor: ["#222", "Default"], Prerequisite: ["NotSuspended", "NotHogtied", "CanCloseLegs"], Hide: ["Shoes", "Socks", "ClothLower", "Garters"], HideItem: ["ItemFeetOrnateAnkleCuffs", "ItemFeetNylonRope", "ItemFeetHempRope", "ItemFeetLeatherBelt", "ItemFeetFuturisticAnkleCuffs", "ItemFeetFuturisticAnkleCuffs","ItemBootsThighHighLatexHeels", "ItemBootsHighThighBoots", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], SetPose: ["LegsClosed"], Effect: ["Prone", "Slow"], Block: ["ItemFeet"], AllowActivePose: ["Kneel"], - Layer: [ - { Name: "Latex" }, - { Name: "Belts" }, - ] - }, - { - Name: "HobbleSkirt", Fetish: ["Latex"], Value: 125, Difficulty: 15, Time: 30, RemoveTime: 20, AllowLock: true, DefaultColor: ["#222", "Default"], Prerequisite: ["NotSuspended", "NotHogtied", "CanCloseLegs"], Hide: ["Shoes", "Socks", "ClothLower", "Garters"], HideItem: ["ItemFeetOrnateAnkleCuffs", "ItemFeetNylonRope", "ItemFeetHempRope", "ItemFeetLeatherBelt", "ItemFeetFuturisticAnkleCuffs", "ItemFeetFuturisticAnkleCuffs","ItemBootsThighHighLatexHeels", "ItemBootsHighThighBoots", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], SetPose: ["LegsClosed"], Effect: ["Prone", "Slow"], Block: ["ItemPelvis", "ItemFeet", "ItemVulva", "ItemVulvaPiercings", "ItemButt"], AllowActivePose: ["Kneel"], - Layer: [ - { Name: "Latex" }, - { Name: "Belts" } - ] - }, - { Name: "SeamlessLegBinder", Value: 80, Difficulty: 15, Time: 30, RemoveTime: 20, AllowLock: true, DefaultColor: "#222222", Prerequisite: ["NotSuspended", "NotHogtied", "CanCloseLegs"], Hide: ["Shoes", "Garters"], HideItem: ["ItemFeetOrnateAnkleCuffs", "ItemFeetNylonRope", "ItemFeetHempRope", "ItemFeetLeatherBelt", "ItemFeetFuturisticAnkleCuffs", "ItemFeetFuturisticAnkleCuffs","ItemBootsThighHighLatexHeels", "ClothLowerPajama1", "SocksSocks6", "SocksSocksFur", "ItemBootsHighThighBoots", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], SetPose: ["LegsClosed"], Effect: ["Prone", "Slow"], Block: ["ItemFeet"], AllowActivePose: ["Kneel"] }, - { Name: "SeamlessHobbleSkirt", Value: 125, Difficulty: 15, Time: 30, RemoveTime: 20, AllowLock: true, DefaultColor: "#222222", Prerequisite: ["NotSuspended", "NotHogtied", "CanCloseLegs"], Hide: ["Shoes", "Garters"], HideItem: ["ItemFeetOrnateAnkleCuffs", "ItemFeetNylonRope", "ItemFeetHempRope", "ItemFeetLeatherBelt", "ItemFeetFuturisticAnkleCuffs", "ItemFeetFuturisticAnkleCuffs","ItemBootsThighHighLatexHeels", "ClothLowerPajama1", "ClothLowerShorts1", "ClothLowerJeans1", "ClothLowerJeans2", "ClothLowerLatexPants1", "ClothLowerLeggings1", "ClothLowerLeggings2", "ClothLowerMistressBottom", "ClothLowerPencilSkirt", "SocksSocks6", "SocksSocksFur", "ItemBootsHighThighBoots", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], SetPose: ["LegsClosed"], Effect: ["Prone", "Slow"], Block: ["ItemPelvis", "ItemFeet", "ItemVulva", "ItemVulvaPiercings", "ItemButt"], AllowActivePose: ["Kneel"] }, - { Name: "Zipties", Value: 20, Difficulty: 6, Time: 5, RemoveTime: 6, BuyGroup: "Zipties", Audio: "ZipTie", SetPose: ["LegsClosed"], Extended: true, Prerequisite: ["CanCloseLegs"],}, - { Name: "Chains", Fetish: ["Metal"], Value: 90, Difficulty: 5, Time: 20, RemoveTime: 15, AllowLock: true, BuyGroup: "Chains", Audio: "ChainLong", SetPose: ["LegsClosed"], Extended: true, AllowActivePose: ["Kneel"], Prerequisite: ["CanCloseLegs"] }, - { Name: "PlasticWrap", Value: 100, Difficulty: 7, Time: 30, RemoveTime: 25, BuyGroup: "PlasticWrap", SetPose: ["LegsClosed"], Hide: ["ClothLower", "Garters"], AllowActivePose: ["Kneel"], Prerequisite: ["CanCloseLegs"] }, - { Name: "FrogtieStraps", Fetish: ["Leather"], Value: 25, Difficulty: 3, Time: 5, Random: false, AllowLock: true, Prerequisite: ["NotSuspended", "CanKneel"], SetPose: ["Kneel"], AllowPose: ["Kneel", "KneelingSpread"], AllowActivePose: ["Kneel", "KneelingSpread"], FreezeActivePose: [], Effect: ["ForceKneel", "Slow"] }, - { - Name: "MermaidTail", - Value: 120, Left: 0, Top: 380, Difficulty: 5, Time: 30, RemoveTime: 20, Random: false, AllowLock: true, DefaultColor: "#0D7800", ArousalZone: "ItemVulva", DynamicScriptDraw: true, - Fetish: ["Latex", "Pet"], - Prerequisite: ["NotSuspended", "NotHogtied", "AccessVulva", "NotKneeling", "NoOuterClothes", "NotChaste", "CanCloseLegs"], - Hide: ["Shoes", "Socks", "BodyLower", "ClothLower", "ItemFeet", "ItemBoots", "Garters"], - SetPose: ["LegsClosed"], - Effect: ["Prone", "Freeze", "FillVulva", "Egged","BlockKneel"], - AllowEffect: ["Egged", "Vibrating", "FillVulva", "Edged"], - AllowPose: ["BackBoxTie", "BackCuffs", "BackElbowTouch", "TapedHands", "Yoked", "OverTheHead"], - Block: ["ItemFeet", "ItemBoots", "ItemPelvis", "ItemVulva", "ItemVulvaPiercings", "ItemButt"], - }, - { - Name: "MedicalBedRestraints", Value: -1, Difficulty: 5, Time: 5, RemoveTime: 5, Random: false, DefaultColor: "#ccc", AllowLock: true, BuyGroup: "MedicalBedRestraints", Left: 0, Top: 0, AllowPose: [], - Prerequisite: ["OnBed", "LegsOpen"], SetPose: ["LegsOpen"], Effect: ["Prone", "BlockKneel"], Block: ["ItemDevices"], AvailableLocations: ["Asylum"], - HideItem: ["ClothBondageDress1", "ClothBondageDress2", "ClothBridesmaidDress1", "ClothDress3", "ClothGown3", "ClothWeddingDress1", "ClothWeddingDress2", "ClothLowerWaspie1", "ClothLowerGown2Skirt", "ClothLowerPajama1", "ClothLowerClothSkirt1", "ClothLowerPencilSkirt", "ClothLowerWaspie2", "ClothLowerWaspie3"], - Layer: [ - { Name: "Base", Priority: 1, ParentGroup: null }, - { Name: "Straps", Priority: 26 }, - ], - }, - { Name: "Ribbons", Fetish: ["Lingerie"], Value: 30, Difficulty: 3, Time: 10, RemoveTime: 5, Hide: ["ClothLower"], BuyGroup: "Ribbon", Extended: true, SetPose: ["LegsClosed"], AllowActivePose: ["Kneel"], Prerequisite: ["CanCloseLegs"] }, - { - Name: "Tentacles", Category: ["Fantasy"], BuyGroup: "Tentacles", Random: false, Value: 250, Difficulty: 6, Time: 15, RemoveTime: 15, Left: 142, Top: 560, - SetPose: ["LegsClosed"], - DefaultColor: ["#c43ba4", "#b832b6", "#9221ba"], - Layer: [ - { Name: "Inner" }, - { Name: "Sucker" }, - { Name: "Outer" }, - { Name: "Shine", AllowColorize: false }, - ], - }, - { - Name: "Slime", Category: ["Fantasy"], BuyGroup: "Slime", DefaultColor: ["#57ab5e", "#57ab5e"], Random: false, Value: 200, Difficulty: 5, Time: 25, RemoveTime: 40, ParentGroup: null, Prerequisite: ["CanCloseLegs"], SetPose: ["LegsClosed"], - AllowPose: [], - AllowActivePose: ["Kneel"], - HideForPose: ["Spread", "KneelingSpread"], - Effect: ["Slow"], - Block: ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis"], - HideItemAttribute: ["Skirt"], - HideItemExclude: ["ClothLowerGown2Skirt"], - HideItem: ["ClothBabydollDress1", "ClothBondageDress1", "ClothBondageDress2", "ClothChineseDress1", "ClothDressFur", "ClothFlowerDress", "ClothFuzzyDress", "ClothGrandMage", "ClothDress3", "ClothNurseUniform", "ClothRobe1", "ClothGown3", "ClothStudentOutfit1", "ClothStudentOutfit2", "ClothSummerDress", "ClothTeacherOutfit1", "ClothBodyTowel1", "ClothSweater1", "ClothVirginKiller1", "ClothYukata1", "PantiesBulkyDiaper", "PantiesPoofyDiaper", "ItemPelvisBulkyDiaper", "ItemPelvisPoofyDiaper"], - Layer: [ - { Name: "One" }, - { Name: "Two" }, - ], - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemVulva", - Category: "Item", - Priority: 15, - Default: false, - Left: 125, - Top: 400, - AllowPose: ["Kneel"], - Zone: [[100, 500, 100, 80]], - Asset: [ - { Name: "VibratingEgg", Value: 25, Time: 5, Visible: false, Prerequisite: ["AccessVulva"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "VibratorRemote", Value: 50, Visible: false, Wear: false, BuyGroup: "VibratorRemote", Prerequisite: ["RemotesAllowed"], Effect: ["Remote"] }, - { Name: "VibratingLatexPanties", Fetish: ["Latex"], Value: 50, Time: 10, AllowLock: true, DefaultColor: "#60A0AF", Prerequisite: ["AccessVulva", "CannotHaveWand"], Effect: ["Chaste"], Block: ["ItemButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { - Name: "WandBelt", Priority: 24, Value: 80, Time: 15, AllowLock: true, DefaultColor: ["#baa", "Default"], Prerequisite: ["CannotHaveWand"], HideItem: ["ClothLowerPajama1", "ClothLowerMistressBottom"], Block: ["ItemPelvis"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], - Layer: [ - { Name: "Belt" }, - { Name: "Wand" } - ] - }, - { - Name: "PenisDildo", Priority: 11, Value: 20, Time: 10, BuyGroup: "PenisDildo", Prerequisite: ["AccessVulva"], Effect: ["FillVulva"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], - Layer: [ - { Name: "Dildo", AllowColorize: true }, - { Name: "Pussy", AllowColorize: false } - ] - }, - { - Name: "ShockDildo", Fetish: ["Masochism"], Priority: 11, Value: 70, Time: 10, Extended: true, AlwaysExtend: true, Prerequisite: ["AccessVulva"], Effect: ["FillVulva"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], AllowActivity: ["ShockItem"], - Layer: [ - { Name: "Dildo", AllowColorize: true }, - { Name: "Pussy", AllowColorize: false } - ] - }, - { - Name: "VibratingDildo", Priority: 11, DefaultColor: "#ED4BEE", BuyGroup: "VibratingDildo", Value: 60, Time: 10, Prerequisite: ["AccessVulva"], Effect: ["FillVulva"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], - Layer: [ - { Name: "Dildo", AllowColorize: true }, - { Name: "End", AllowColorize: true }, - { Name: "Pussy", AllowColorize: false } - ] - }, - { - Name: "FuturisticVibrator", DefaultColor: ["#3C724C", "Default"], Value: 70, Difficulty: 3, AllowLock: true, DrawLocks: false, Time: 10, Prerequisite: ["AccessVulva"], FuturisticRecolor: true, Effect: [ "Egged", "FillVulva"], AllowEffect: ["Egged", "Vibrating", "FillVulva", "Edged"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], AllowType: ["TriggerValue"], DynamicScriptDraw: true, - Layer: [ - { Name: "Display", AllowColorize: true }, - { Name: "Band", AllowColorize: true }, - { Name: "Lock", LockLayer: true,AllowColorize: true, HasType: false, ParentGroup: null}, - ] - }, - { - Name: "InflatableVibeDildo", Priority: 11, Value: 100, Time: 10, Prerequisite: ["AccessVulva"], Effect: ["Egged", "FillVulva"], AllowEffect: ["Egged", "Vibrating", "FillVulva", "Edged"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], - Layer: [ - { Name: "Dildo", AllowColorize: true }, - { Name: "Pussy", AllowColorize: false } - ] - }, - { - Name: "ClitoralStimulator", Priority: 11, Value: 70, Time: 10, DefaultColor: "#8a00d1", Prerequisite: ["AccessVulva"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], - Layer: [ - { Name: "Stimulator", AllowColorize: true }, - { Name: "Pussy", AllowColorize: false } - ] - }, - { Name: "ClitSuctionCup", Priority: 11, Value: 25, Time: 10, Prerequisite: "AccessVulva", ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }], Extended: true, HasType: false }, - { Name: "TapeStrips", Fetish: ["Tape"], Value: 10, Time: 5, Prerequisite: "AccessVulva", CraftGroup: "DuctTape", ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "BenWaBalls", Fetish: ["Metal"], Value: 30, Time: 5, Visible: false, Prerequisite: ["AccessVulva"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "HeavyWeightClamp", Fetish: ["Metal", "Masochism"], Value: 30, Time: 5, Prerequisite: "AccessVulva", ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "FullLatexSuitWand", Fetish: ["Latex"], Priority: 34, Value: -1, Difficulty: 12, Time: 5, IsRestraint: true, AllowLock: true, Block: ["ItemVulvaPiercings"] }, - { - Name: "ClitAndDildoVibratorbelt", Fetish: ["Leather"], Priority: 11, Value: 100, Time: 10, AllowLock: true, Prerequisite: ["AccessVulva"], Hide: ["Panties"], Effect: ["Egged", "FillVulva"], AllowEffect: ["Egged", "Vibrating", "FillVulva", "Edged"], Block: ["ItemPelvis"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], - Layer: [ - { Name: "Belt", AllowColorize: true }, - { Name: "Crotch", AllowColorize: false } - ] - }, - { - Name: "HempRopeBelt", Fetish: ["Rope"], Value: 60, Time: 24, DefaultColor: ["#956B1C", "Default"], BuyGroup: "HempRope", Audio: "RopeShort", Prerequisite: ["CannotHaveWand"], HideItem: ["ClothLowerPajama1", "ClothLowerMistressBottom"], Block: ["ItemPelvis"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], - Layer: [ - { Name: "Rope" }, - { Name: "Wand" } - ] - }, - { - Name: "WiredEgg", ParentGroup: "BodyLower", Value: 30, Time: 5, Prerequisite: "AccessVulva", AllowPose: ["Kneel", "LegsClosed"], - Layer: [ - { Name: "Remote" }, - { Name: "Strap" } - ] - }, - { Name: "LoversVibrator", Value: 75, Time: 5, LoverOnly: true, DefaultColor: "#790c0c", Prerequisite: ["AccessVulva"], Effect: ["Egged", "FillVulva"], AllowEffect: ["Egged", "Vibrating", "Edged", "FillVulva"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], AllowRemoveExclusive: true, CharacterRestricted: true, DynamicScriptDraw: true}, - { Name: "LoversVibratorRemote", Value: 75, Wear: false, LoverOnly: true, Prerequisite: ["RemotesAllowed"], Effect: ["Remote"] }, - { Name: "DoubleEndDildo", Value: 15, Time: 10, DefaultColor: ["#624662"], Effect: ["FillVulva"], Prerequisite: ["AccessVulva"], AllowPose: [], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 20 }], AllowActivity: ["PenetrateItem"], HasType: true, Extended: true, }, - { - Name: "Stitches", Category: ["Medical", "Extreme"], Priority: 13, BuyGroup: "Suture", Random: false, Value: -1, Difficulty: 8, Time: 5, RemoveTime: 5, Prerequisite: "AccessVulva", Effect: ["Chaste"], DefaultColor: ["#3f3c3a"], AllowPose: ["Spread"], Extended: true, AlwaysExtend: true, - Layer: [ - { Name: "Straight", HasType: false, AllowTypes: ["Straight"] }, - { Name: "ZigZag", HasType: false, CopyLayerColor: "Straight", AllowTypes: ["ZigZag"] }, - { Name: "Skewed", HasType: false, CopyLayerColor: "Straight", AllowTypes: ["Skewed"] }, - { Name: "Cross", HasType: false, CopyLayerColor: "Straight", AllowTypes: ["Cross"] }, - ], - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemVulvaPiercings", - Category: "Item", - Priority: 13, - Default: false, - Left: 125, - Top: 400, - Zone: [[200, 500, 100, 80]], - Asset: [ - { Name: "StraightClitPiercing", Fetish: ["Metal"], Value: 15, Difficulty: 10, Time: 5, AllowLock: true, DrawLocks: false, Prerequisite: ["AccessVulva"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { - Name: "RoundClitPiercing", Fetish: ["Metal"], Value: 25, Difficulty: 10, Time: 5, AllowLock: true, DrawLocks: false, Prerequisite: ["AccessVulva"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }], - Extended: true, HasType: false, - Layer: [ - { Name: "Ring", AllowTypes: ["", "Weight", "Bell"], }, - { Name: "PulledRing", AllowTypes: ["Chain", "HaremChain"], CopyLayerColor: "Ring", }, - { Name: "Weight", AllowTypes: ["Weight"], ColorGroup: "Addons", }, - { Name: "Bell", AllowTypes: ["Bell"], ColorGroup: "Addons", }, - { Name: "Chain", AllowTypes: ["Chain"], ColorGroup: "Addons", Top: 263, }, - { Name: "HaremVeil", AllowTypes: ["HaremChain"], ColorGroup: "Addons", Top: 263, }, - { Name: "HaremChain", AllowTypes: ["HaremChain"], CopyLayerColor: "Chain", Top: 263, }, - ] - }, - { Name: "BarbellClitPiercing", Fetish: ["Metal"], Value: 20, Difficulty: 10, Time: 5, AllowLock: true, DrawLocks: false, Prerequisite: ["AccessVulva"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "ChastityClitPiercing", Fetish: ["Metal"], Value: 50, Difficulty: 50, Time: 20, RemoveTime: 20, AllowLock: true, DrawLocks: false, Prerequisite: ["AccessVulva"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo"], Effect: ["Chaste"], Block: ["ItemVulva"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "ChastityClitShield", Fetish: ["Metal"], Value: 70, Difficulty: 50, Time: 30, RemoveTime: 30, AllowLock: true, DrawLocks: false, Prerequisite: ["AccessVulva"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo"], Effect: ["Chaste"], Block: ["ItemVulva"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "HighSecurityVulvaShield", Fetish: ["Metal"], Value: 100, Difficulty: 99, Time: 60, RemoveTime: 200, AllowLock: true, DrawLocks: false, Prerequisite: ["AccessVulva"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo"], Effect: ["Chaste"], Block: ["ItemVulva"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "JewelClitPiercing", Fetish: ["Metal"], Value: 20, Difficulty: 10, Time: 5, AllowLock: true, DrawLocks: false, Prerequisite: ["AccessVulva"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "AdornedClitPiercing", Fetish: ["Metal"], Value: 20, Difficulty: 10, Time: 5, AllowLock: true, DrawLocks: false, Prerequisite: ["AccessVulva"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { - Name: "VibeHeartClitPiercing", Value: 35, Difficulty: 10, Time: 5, AllowLock: true, DrawLocks: false, BuyGroup: "VibeHeart", Prerequisite: ["AccessVulva"], Effect: ["Egged"], AllowEffect: ["Egged", "Vibrating", "Edged"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], DynamicScriptDraw: true, - Layer: [ - { Name: "Heart" }, - { Name: "Ring" } - ] - }, - { - Name: "ClitRing", Fetish: ["Metal"], Value: 20, Difficulty: 10, Time: 15, Random: false, AllowLock: true, DrawLocks: false, Left: 50, AllowPose: ["Kneel"], Prerequisite: ["AccessVulva"], Extended: true, - Layer: [ - { Name: "Ring", HasType: false, AllowTypes: ["", "Leash"] }, - { Name: "Leash", HasType: false, AllowTypes: ["Leash"] } - ] - }, - { Name: "TapedClitEgg", Fetish: ["Tape"], Value: 25, Time: 5, Prerequisite: ["AccessVulva"], Effect: ["Egged"], AllowEffect: ["Egged", "Vibrating", "Edged"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], DynamicScriptDraw: true, - Layer: [ - { Name: "Egg" }, - { Name: "Tape" } - ] - }, - AssetSpankingToys, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemButt", - Category: "Item", - Priority: 4, - Default: false, - Left: 0, - Top: 0, - Effect: ["IsPlugged"], - Zone: [[300, 500, 100, 80]], - Asset: [ - { Name: "BlackButtPlug", Value: 15, Time: 10, Visible: false, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "PenisPlug", Value: 20, Time: 10, Visible: false, BuyGroup: "PenisDildo", Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { - Name: "TailButtPlug", Fetish: ["Pet"], Value: 40, Time: 10, Top: 100, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], Layer: [ - { Name: "Tail" }, - { Name: "Ribbon" }, - { Name: "Bell" }, - ] - }, - { Name: "HorsetailPlug", Fetish: ["Pony"], Value: 30, Time: 10, Prerequisite: ["AccessButt"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "HorsetailPlug1", Fetish: ["Pony"], Value: 40, Time: 10, Prerequisite: ["AccessButt"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "PuppyTailPlug", Fetish: ["Pet"], Value: 25, Time: 10, Top: 20, Prerequisite: ["AccessButt"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "PuppyTailPlug1", Fetish: ["Pet"], Value: 30, Time: 10, Top: 30, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "SuccubusButtPlug", Fetish: ["Pet"], Value: 15, Time: 10, Top: 65, Prerequisite: ["AccessButt"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "SuccubusHeartButtPlug", Fetish: ["Pet"], Value: 25, Time: 10, Top: 60, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], - Layer: [ - { Name: "Tail" }, - { Name: "Heart" }, - ] - }, - { - Name: "FoxTails", Fetish: ["Pet"], Priority: 2, Value: 60, Time: 10, Top: 20, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], Layer: [ - { Name: "Tips" }, - { Name: "Bases" } - ] - }, - { Name: "RaccoonButtPlug", Fetish: ["Pet"], Value: 40, Time: 10, Top: 20, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "RaccoonTailPlug", Fetish: ["Pet"], Priority: 2, Value: 50, Time: 10, Top: 30, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "AnalBeads", Value: 20, Time: 10, Visible: false, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "AnalBeads2", Fetish: ["Metal"], Value: 70, Time: 14, Prerequisite: ["AccessButt"], AllowType: ["Base", "_2in", "_3in", "_4in", "_5in"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], Extended: true, Activity: "MasturbateItem" }, - { Name: "ButtPump", Value: 35, Time: 10, Visible: false, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], Extended: true }, - { Name: "VibratingButtplug", Value: 60, Time: 10, Visible: false, Prerequisite: ["AccessButt"], Effect: ["IsPlugged", "Egged"], AllowEffect: ["IsPlugged", "Egged", "Vibrating", "Edged"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], DynamicScriptDraw: true }, - { Name: "InflVibeButtPlug", Value: 90, Time: 10, Visible: false, Prerequisite: ["AccessButt"], Effect: ["IsPlugged", "Egged"], AllowEffect: ["IsPlugged", "Egged", "Vibrating", "Edged"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }] }, - { Name: "AnalHook", Fetish: ["Metal"], Value: 20, Time: 10, IsRestraint: true, Prerequisite: ["AccessButt"], Effect: ["IsPlugged"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], Extended: true }, - { Name: "ButtPlugLock", Fetish: ["Metal"], Value: 75, Difficulty: 50, Time: 30, RemoveTime: 50, IsRestraint: true, AllowLock: true, Prerequisite: ["AccessButt"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "High", Group: "Blush", Timer: 10 }, { Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }], Extended: true }, - { Name: "KittenTail1", Fetish: ["Pet"], Value: 30, Time: 10, Top: 100, Prerequisite: ["AccessButt"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "KittenTail2", Fetish: ["Pet"], Value: 30, Time: 10, Top: 30, Prerequisite: ["AccessButt"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "FoxTail1", Fetish: ["Pet"], Value: 50, Time: 10, Top: 80, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], - Layer: [ - { Name: "Base" }, - { Name: "Tip" }, - ] - }, - { Name: "FoxTail2", Fetish: ["Pet"], Value: 50, Time: 10, Top: 100, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], - Layer: [ - { Name: "Base" }, - { Name: "Tip" }, - ] - }, - { Name: "WolfTail1", Fetish: ["Pet"], Value: 35, Time: 10, Top: 50, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "WolfTail2", Fetish: ["Pet"], Value: 35, Time: 10, Top: 60, Prerequisite: ["AccessButt"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "WolfTail3", Fetish: ["Pet"], Value: 35, Time: 10, Top: 40, Prerequisite: ["AccessButt"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "DemonPlug", Fetish: ["Pet"], Value: 35, Time: 10, Top: 70, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "MouseTail1", Fetish: ["Pet"], Value: 35, Time: 10, Top: 150, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "MouseTail2", Fetish: ["Pet"], Value: 35, Time: 10, Top: 180, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "VibratingDildoPlug", Value: 60, Time: 10, Visible: false, BuyGroup: "VibratingDildo", Prerequisite: ["AccessButt"], Effect: ["IsPlugged", "Egged"], AllowEffect: ["IsPlugged", "Egged", "Vibrating", "Edged"], DynamicScriptDraw: true }, - { Name: "BunnyTailPlug1", Fetish: ["Pet"], Value: 1, Time: 10, Visible: false, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "BunnyTailPlug2", Fetish: ["Pet"], Value: 1, Time: 10, Visible: false, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "BunnyTailVibePlug", Fetish: ["Pet"], Effect: ["IsPlugged", "Egged"], Value: 75, Prerequisite: ["AccessButt"], Time: 10, ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }], AllowEffect: ["Egged", "Vibrating", "Edged"], Visible: false, DynamicScriptDraw: true }, - { Name: "EggVibePlugXXL", Effect: ["IsPlugged", "Egged"], Value: 90, Prerequisite: ["AccessButt"], Time: 10, ExpressionTrigger: [{ Group: "Blush", Name: "High", Timer: 10 }], AllowEffect: ["Egged", "Vibrating", "Edged"], Visible: false, DynamicScriptDraw: true }, - { Name: "LockingVibePlug", Effect: ["IsPlugged", "Egged"], Value: 80, Difficulty: 30, Time: 30, RemoveTime: 50, IsRestraint: true, AllowLock: true, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Group: "Blush", Name: "High", Timer: 10 }], AllowEffect: ["Egged", "Vibrating", "Edged"], Visible: false, DynamicScriptDraw: true }, - { Name: "ShockPlug", Fetish: ["Masochism"], Value: 60, Time: 10, Visible: false, Extended: true, AlwaysExtend: true, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], AllowActivity: ["ShockItem"] }, - { Name: "Cowtail", Fetish: ["Pet"], BuyGroup: "CowTails", Value: 20, Time: 10, Top: 80, Prerequisite: ["AccessButt"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { Name: "HollowButtPlug", Value: 15, Time: 10, Visible: false, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, - { - Name: "Tentacles", Category: ["Fantasy"], BuyGroup: "Tentacles", Random: false, Value: 250, Time: 10, Prerequisite: ["AccessVulva"], DynamicGroupName: "TailStraps", - DefaultColor: ["#c43ba4", "#b832b6", "#9221ba"], - AllowActivity: ["PenetrateItem"], - Layer: [ - { Name: "Inner" }, - { Name: "Sucker" }, - { Name: "InnerShine", AllowColorize: false }, - { Name: "Outer" }, - { Name: "OuterShine", AllowColorize: false }, - ], - }, - { Name: "Stitches", Category: ["Medical", "Extreme",], Priority: 10, Visible: false, BuyGroup: "Suture", Random: false, Value: -1, Difficulty: 8, Time: 5, RemoveTime: 5, Prerequisite: ["AccessButt"] }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemPelvis", - ParentGroup: "BodyLower", - Category: "Item", - Priority: 16, - Default: false, - Left: 125, - Top: 375, - Zone: [[100, 420, 300, 80]], - RemoveItemOnRemove: [ - { Group: "ItemAddon", Name: "CeilingRope" }, - { Group: "ItemAddon", Name: "CeilingChain" }, - ], - Asset: [ - { Name: "StraponPanties", Fetish: ["Latex"], Value: -1, Time: 15, DefaultColor: "#505050", Prerequisite: "AccessVulva", AllowActivity: ["PenetrateItem"], Bonus: "KidnapBruteForce", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], Effect: ["Chaste"], Block: ["ItemVulva", "ItemButt", "ItemVulvaPiercings"] }, - { Name: "LeatherChastityBelt", Fetish: ["Leather"], ParentGroup: null, Value: 30, Difficulty: 8, Time: 20, RemoveTime: 10, AllowLock: true, Prerequisite: "AccessVulva", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo"], Effect: ["Chaste"], Block: ["ItemVulva", "ItemButt", "ItemVulvaPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Layer: [ - { Name: "Belt" }, - { Name: "Studs" }, - { Name: "Locks", LockLayer: true } - ] }, - { Name: "SleekLeatherChastityBelt", Fetish: ["Leather"], Value: 45, Difficulty: 11, Time: 20, RemoveTime: 10, AllowLock: true, Prerequisite: "AccessVulva", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], Effect: ["Chaste"], Block: ["ItemVulva", "ItemButt", "ItemVulvaPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }] }, - { Name: "StuddedChastityBelt", Fetish: ["Leather", "Metal"], Value: 60, Difficulty: 14, Time: 20, RemoveTime: 10, AllowLock: true, Prerequisite: "AccessVulva", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], Effect: ["Chaste"], Block: ["ItemVulva", "ItemVulvaPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Extended: true, HasType: false }, - { Name: "MetalChastityBelt", Fetish: ["Metal"], ParentGroup: null, Value: 100, Difficulty: 20, Time: 20, RemoveTime: 10, DrawLocks: false, AllowLock: true, Audio: "CuffsMetal", Prerequisite: "AccessVulva", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], Effect: ["Chaste"], Block: ["ItemVulva", "ItemVulvaPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Extended: true, HasType: false, Layer: [ - { Name: "Belt" }, - { Name: "Keyhole", CopyLayerColor: "Lock"}, - { Name: "Lock", LockLayer: true }, - ]}, - { Name: "PolishedChastityBelt", Fetish: ["Metal"], Value: 150, Difficulty: 30, Time: 20, RemoveTime: 10, AllowLock: true, Audio: "CuffsMetal", Prerequisite: "AccessVulva", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], Effect: ["Chaste"], Block: ["ItemVulva", "ItemVulvaPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Extended: true, HasType: false }, - { Name: "FuturisticChastityBelt", Category: ["SciFi"], Fetish: ["Metal"], Value: 170, BuyGroup: "FuturisticChastityBelt", - Difficulty: 50, Time: 20, RemoveTime: 10, Random: false, AllowLock: true, DrawLocks: false, - DefaultColor: ["#93C48C", "#3B7F2C", "Default", "Default", "Default", "Default", "#222222", "Default"], FuturisticRecolor: true, - Audio: "FuturisticApply", Prerequisite: "AccessVulva", - HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], - Effect: [ "UseRemote"], - AllowBlock: ["ItemVulvaPiercings", "ItemButt", "ItemVulva"], - AllowType: ["ClosedBack1","OpenBoth1", "OpenBack2", "ClosedBack2","OpenBoth2", "OpenBack3", "ClosedBack3","OpenBoth3", "ChatMessage", "PunishOrgasm", "PunishStruggle", "PunishStrugleOther"], - Block: [], - ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], - Extended: true, DynamicScriptDraw: true, - Layer: [ - { Name: "Mesh", AllowColorize: true, HasType: false, AllowModuleTypes: ["m0"]}, // ModuleType: ["m"], - { Name: "Screen", AllowColorize: true , ParentGroup: null, HasType: false, AllowModuleTypes: ["m0"]}, - { Name: "Belt", AllowColorize: true, HasType: false, AllowModuleTypes: ["m0"]}, - { Name: "Lock", LockLayer: true,AllowColorize: true, HasType: false, ParentGroup: null, AllowModuleTypes: ["m0"]}, - { Name: "Mesh_2", AllowColorize: true, CopyLayerColor: "Mesh", HasType: false, AllowModuleTypes: ["m1"]}, - { Name: "Screen_2", AllowColorize: true, CopyLayerColor: "Screen" , ParentGroup: null, HasType: false, AllowModuleTypes: ["m1"]}, - { Name: "Band_2", AllowColorize: true, HasType: false, AllowModuleTypes: ["m1"]}, - { Name: "Belt_2", AllowColorize: true, CopyLayerColor: "Belt", HasType: false, AllowModuleTypes: ["m1"]}, - { Name: "Lock_2", LockLayer: true,AllowColorize: true, CopyLayerColor: "Lock", HasType: false, ParentGroup: null, AllowModuleTypes: ["m1"]}, - { Name: "Display_3", AllowColorize: true, CopyLayerColor: "Screen", ParentGroup: null, HasType: false, AllowModuleTypes: ["m2"]}, - { Name: "Mesh_3", AllowColorize: true, CopyLayerColor: "Mesh", HasType: false, AllowModuleTypes: ["m2"]}, - { Name: "Mesh2_3", AllowColorize: true, HasType: false, AllowModuleTypes: ["m2"]}, - { Name: "Band_3", AllowColorize: true, CopyLayerColor: "Band_2", HasType: false, AllowModuleTypes: ["m2"]}, - { Name: "Belt_3", AllowColorize: true, ParentGroup: null, CopyLayerColor: "Belt", HasType: false, AllowModuleTypes: ["m2"]}, - { Name: "Lock_3", LockLayer: true, AllowColorize: true, CopyLayerColor: "Lock", HasType: false, ParentGroup: null, AllowModuleTypes: ["m2"]}, - { Name: "Display_4", AllowColorize: true, CopyLayerColor: "Screen", ParentGroup: null, HasType: false, AllowModuleTypes: ["m3"]}, - { Name: "Mesh_4", AllowColorize: true, CopyLayerColor: "Mesh", HasType: false, AllowModuleTypes: ["m3"]}, - { Name: "Belt_4", AllowColorize: true, ParentGroup: null, CopyLayerColor: "Belt", HasType: false, AllowModuleTypes: ["m3"]}, - { Name: "Band_4", AllowColorize: true, CopyLayerColor: "Band_2", HasType: false, AllowModuleTypes: ["m3"]}, - { Name: "Plug_4", AllowColorize: true, ParentGroup: null, HasType: false, AllowModuleTypes: ["m3"]}, - { Name: "PlugCap", AllowColorize: true, HasType: true, ModuleType: ["m"], AllowModuleTypes: ["f1"]}, - { Name: "Strap_4", AllowColorize: true, ParentGroup: null, HasType: false, AllowModuleTypes: ["m3"]}, - { Name: "Mesh2_4", AllowColorize: true, CopyLayerColor: "Mesh2_3", HasType: false, AllowModuleTypes: ["m3"]}, - { Name: "Lock_4", LockLayer: true, AllowColorize: true, CopyLayerColor: "Lock", HasType: false, ParentGroup: null, AllowModuleTypes: ["m3"]}, - { Name: "TLock", AllowColorize: true, CopyLayerColor: "Lock", HasType: true, ParentGroup: null, ModuleType: ["m"], AllowModuleTypes: ["t1", "t2"]}, - { Name: "OLock", AllowColorize: true, CopyLayerColor: "Lock", HasType: true, ParentGroup: null, ModuleType: ["m"], AllowModuleTypes: ["o1"]}, - ] - }, - { Name: "FuturisticTrainingBelt", Category: ["SciFi"], Fetish: ["Metal"], ArousalZone: "ItemVulva", Value: -1, Difficulty: 100, Time: 30, RemoveTime: 30, BuyGroup: "FuturisticChastityBelt", Random: false, AllowLock: true, DrawLocks: false, DefaultColor: ["#3B7F2C", "#93C48C", "#93C48C", "Default", "Default", "Default"], Audio: "FuturisticApply", Prerequisite: ["AccessVulva", "VulvaEmpty", "ClitEmpty", "ButtEmpty"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], FuturisticRecolor: true, Effect: ["FillVulva", "UseRemote", "Egged", "Chaste", "Edged"], AllowEffect: ["Vibrating", "DenialMode", "RuinOrgasms"], Block: ["ItemVulvaPiercings", "ItemButt", "ItemVulva"], AllowType: [], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Extended: true, HasType: false, DynamicScriptDraw: true, - Layer: [ - { Name: "Display", AllowColorize: true , ParentGroup: null}, - { Name: "Mesh", AllowColorize: true}, - { Name: "Mesh2", AllowColorize: true}, - { Name: "Band", AllowColorize: true}, - { Name: "Belt", AllowColorize: true , ParentGroup: null}, - { Name: "Lock", LockLayer: true,AllowColorize: true, HasType: false, ParentGroup: null}, - ] - }, - { Name: "SciFiPleasurePanties", Category: ["SciFi"], Fetish: ["Metal"], Value: -1, Difficulty: 50, Time: 15, RemoveTime: 12, BuyGroup: "FuturisticChastityBelt", Random: false, AllowLock: true, DrawLocks: false, DefaultColor: ["#592599", "#202020", "#592599", "#202020", "#7631cc", "#7631cc"], Audio: "FuturisticApply", Prerequisite: "AccessVulva", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], FuturisticRecolor: true, Effect: [ "Chaste", "UseRemote", "Egged"], AllowBlock: ["ItemVulvaPiercings", "ItemButt", "ItemVulva"], ArousalZone: "ItemVulva", AllowEffect: ["Egged", "Vibrating", "DenialMode", "RuinOrgasms"], Block: [], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Extended: true, HasType: false, - Layer: [ - { Name: "Screen", AllowColorize: true, ParentGroup: null}, - { Name: "Mesh2", AllowColorize: true}, - { Name: "Mesh1", AllowColorize: true}, - { Name: "Band", AllowColorize: true, ParentGroup: null}, - { Name: "Plug2", AllowColorize: true, ParentGroup: null}, - { Name: "Plug1", AllowColorize: true, ParentGroup: null}, - { Name: "Lock", LockLayer: true,AllowColorize: true, HasType: false, ParentGroup: null}, - ] - }, - { - Name: "OrnateChastityBelt", Fetish: ["Metal"], Value: 200, Difficulty: 50, Time: 20, RemoveTime: 10, AllowLock: true, Audio: "CuffsMetal", Prerequisite: "AccessVulva", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], Effect: ["Chaste"], Block: ["ItemVulva", "ItemVulvaPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Extended: true, HasType: false, - Layer: [ - { Name: "Belt" }, - { Name: "Gems" } - ] - }, - { Name: "SteelChastityPanties", Fetish: ["Metal"], Value: 150, Difficulty: 50, Time: 50, RemoveTime: 60, AllowLock: true, Audio: "CuffsMetal", Prerequisite: "AccessVulva", Hide: ["ItemVulva", "ItemVulvaPiercings"], Effect: ["Chaste"], Block: ["ItemVulva", "ItemButt", "ItemVulvaPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }] }, - { Name: "HarnessPanties1", Fetish: ["Leather"], Priority: 19, Value: 35, Difficulty: 8, Time: 10, RemoveTime: 15, AllowLock: true, Left: 110, Top: 395, BuyGroup: "HarnessPanties1", Prerequisite: "AccessVulva", AllowPose: ["LegsClosed", "Kneel", "KneelingSpread"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"] }, - { Name: "HarnessPanties2", Fetish: ["Leather"], Priority: 19, Value: 40, Difficulty: 9, Time: 10, RemoveTime: 15, AllowLock: true, Left: 85, Top: 395, BuyGroup: "HarnessPanties2", Prerequisite: "AccessVulva", AllowPose: ["LegsClosed", "Kneel", "KneelingSpread", "Spread"], Expose: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], DrawLocks: false }, - { Name: "LeatherStrapPanties1", Fetish: ["Leather"], Value: 20, Difficulty: 5, Time: 20, RemoveTime: 10, AllowLock: true, Left: 150, Top: 395, BuyGroup: "LeatherStrapPanties1", Prerequisite: "AccessVulva", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing"], Effect: ["Chaste"], Block: ["ItemVulva", "ItemButt", "ItemVulvaPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }] }, - { - Name: "LoveChastityBelt", Fetish: ["Metal"], Value: 250, Difficulty: 50, Time: 20, RemoveTime: 10, OwnerOnly: true, Prerequisite: "AccessVulva", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo"], - Effect: ["Lock"], AllowBlock: ["ItemVulva", "ItemButt", "ItemVulvaPiercings"], ArousalZone: "ItemVulva", - Audio: "CuffsMetal", - AllowEffect: ["Chaste", "Egged", "Vibrating"], - AllowType: ["Open", "Closed", "Vibe", "Shock"], - DynamicExpressionTrigger: C => { - if (InventoryItemPelvisLoveChastityBeltLastAction == "Open") { - return [{ Name: "Low", Group: "Blush", Timer: 10 }]; - } else if (InventoryItemPelvisLoveChastityBeltLastAction == "Closed") { - return [{ Name: "Medium", Group: "Blush", Timer: 10 }]; - } else if (InventoryItemPelvisLoveChastityBeltLastAction == "Vibe") { - return [{ Name: "Medium", Group: "Blush", Timer: 10 }]; - } else if (InventoryItemPelvisLoveChastityBeltLastAction == "Shock") { - return [{ Name: "Medium", Group: "Blush", Timer: 10 }]; - } else if (InventoryItemPelvisLoveChastityBeltLastAction == "ShockTriggered") { - var belt = InventoryGet(C, "ItemPelvis"); - var intensity = belt && belt.Property && belt.Property.Intensity; - if (intensity == 0) { - return [{ Name: "Low", Group: "Blush", Timer: 10 }]; - } else if (intensity == 1) { - return [{ Name: "Medium", Group: "Blush", Timer: 10 }]; - } else if (intensity == 2) { - return [{ Name: "High", Group: "Blush", Timer: 10 }]; - } else { - return null; - } - } else { - return null; - } - }, - Extended: true, - Layer: [ - { Name: "Open", AllowColorize: true, AllowTypes: ["", "Open"], HasType: false }, - { Name: "Closed", AllowColorize: true, CopyLayerColor: "Open", AllowTypes: ["Closed", "Vibe", "Shock"], HasType: false }, - { Name: "Vibe", AllowColorize: false, AllowTypes: ["Vibe"], HasType: false, AllowPose: [] }, - { Name: "Shock", AllowColorize: false, AllowTypes: ["Shock"], HasType: false, AllowPose: [] }, - { Name: "Lock", AllowColorize: false, AllowTypes: ["", "Open", "Closed", "Vibe", "Shock"], HasType: false, AllowPose: [] }, - { Name: "ShieldLock", AllowColorize: false, AllowTypes: ["Closed", "Vibe", "Shock"], HasType: false, AllowPose: [] }, - ] - }, - { Name: "HempRope", Fetish: ["Rope"], Value: 60, Difficulty: 3, Time: 20, RemoveTime: 25, DefaultColor: "#956B1C", BuyGroup: "HempRope", Audio: "RopeShort", Prerequisite: "AccessTorso", AllowPose: ["LegsClosed", "Kneel", "KneelingSpread"], Extended: true }, - { Name: "DiaperHarness", Category: ["ABDL"], Fetish: ["Leather", "ABDL"], Priority: 24, Value: 65, Difficulty: 50, Time: 25, RemoveTime: 30, AllowLock: true, Left: 150, Top: 395, Hide: ["ItemVulva", "ItemVulvaPiercings"], Effect: ["Chaste"], Block: ["ItemVulva", "ItemButt", "ItemVulvaPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }] }, - { Name: "PelvisChainLeash", Priority: 27, Fetish: ["Metal"], Value: 40, Difficulty: 5, Time: 20, RemoveTime: 25, AllowLock: true, Effect: ["Leash"] }, - { Name: "Ribbons", Fetish: ["Lingerie"], Value: 30, Difficulty: 3, Time: 10, RemoveTime: 5, BuyGroup: "Ribbon", Prerequisite: "AccessVulva", Extended: true }, - { Name: "SilkStraps", Value: 40, Difficulty: 3, Time: 20, RemoveTime: 25, DefaultColor: "#E8E8E8", BuyGroup: "SilkStraps", Audio: "RopeShort", Prerequisite: "AccessTorso", AllowPose: ["KneelingSpread", "LegsClosed", "Kneel"], Extended: true }, - { - Name: "BulkyDiaper", BuyGroup: "BulkyDiapers", Priority: 25, Category: ["ABDL"], Fetish: ["ABDL"], Random: false, Value: 30, Difficulty: 50, Time: 5, RemoveTime: 5, AllowLock: true, DrawLocks: false, Effect: ["Chaste"], Block: ["ItemVulva", "ItemButt", "ItemVulvaPiercings"], DefaultColor:["#688599", "#808080", "#8c7384", "#BF3F97"], AllowPose: ["LegsClosed", "Kneel"], HideForPose: ["KneelingSpread", "Hogtied", "AllFours"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ClothMistressBottom", "ClothShorts1"], Left: 49, Top: 360, SetPose: ["LegsOpen"], AllowActivePose: ["Kneel"], WhitelistActivePose: ["BaseLower", "Kneel"], - Layer: [ - { Name: "Base" }, - { Name: "CrotchPiece" }, - { Name: "WaistBand" }, - { Name: "Tape", ParentGroup: null }, - { Name: "Back", CopyLayerColor: "Base", ParentGroup: null, Priority: 6 }, - ] - }, - { - Name: "PoofyDiaper", BuyGroup: "PoofyDiapers", Priority: 25, Category: ["ABDL"], Fetish: ["ABDL"], Random: false, Value: 30, Difficulty: 50, Time: 5, RemoveTime: 5, AllowLock: true, DrawLocks: false, Effect: ["Chaste"], Block: ["ItemVulva", "ItemButt", "ItemVulvaPiercings"], DefaultColor:["#9763A6", "#658AA6", "#997391", "#a916cc"], AllowPose: ["LegsClosed", "Kneel"], HideForPose: ["KneelingSpread", "Hogtied", "AllFours"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemVulvaPiercingsVibeHeartClitPiercing", "ItemVulvaPiercingsClitRing", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ClothMistressBottom", "ClothShorts1"], Left: 49, Top: 360, SetPose: ["LegsOpen"], AllowActivePose: ["Kneel"], WhitelistActivePose: ["BaseLower", "Kneel"], Extended: true, - Layer: [ - { Name: "Base", HasType: false, AllowTypes: [""] }, - { Name: "PoofyBase", CopyLayerColor: "Base", HasType: false, AllowTypes: ["Poofy"] }, - { Name: "CrotchPatch", HasType: false }, - { Name: "Frills", HasType: false }, - { Name: "Tape", HasType: false, ParentGroup: null }, - { Name: "Back", CopyLayerColor: "Base", HasType: false, ParentGroup: null, Priority: 6 }, - ] - }, - { Name: "HybridChastityBelt", Fetish: ["Leather", "Metal"], ParentGroup: null, Value: 120, Difficulty: 8, Time: 20, RemoveTime: 10, AllowLock: true, Prerequisite: "AccessVulva", HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaClitSuctionCup", "ItemVulvaInflatableVibeDildo", "ItemVulvaHeavyWeightClamp", "ItemVulvaPenisDildo", "ItemVulvaShockDildo"], Effect: ["Chaste"], Block: ["ItemVulva", "ItemButt", "ItemVulvaPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Layer: [ - { Name: "Belt" }, - { Name: "CrotchPlate" }, - { Name: "Rivets" }, - { Name: "Lock", LockLayer: true } - ] }, - { - Name: "ObedienceBelt", Fetish: ["Metal", "Chastity"], ParentGroup: null, Value: 150, - Difficulty: 8, Time: 15, RemoveTime: 20, - Extended: true, DynamicScriptDraw: true, DynamicAfterDraw: true, AllowLock: true, DrawLocks: false, Prerequisite: ["AccessVulva"], AllowEffect: ["Chaste"], - DefaultColor: ['Default', 'Default', "Default", "Default", "#FF0000", "#004A7F"], - AllowBlock: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], - Layer: [ - { Name: "Base", HasType: false, ColorGroup: "Metal", }, - { Name: "Trim", HasType: false, ColorGroup: "Metal", }, - { Name: "Text", HasType: false, HasImage: false, }, - { Name: "CrotchShield", HasType: false, ColorGroup: "Metal", AllowModuleTypes: ["c1", "c3"], }, - { Name: "WireOutline", HasType: false, AllowColorize: false, AllowModuleTypes: ["s1"], }, - { Name: "PositiveWire", HasType: false, AllowModuleTypes: ["s1"], }, - { Name: "NegativeWire", HasType: false, AllowModuleTypes: ["s1"], }, - { Name: "CrotchLock", HasType: false, LockLayer: true, AllowColorize: false, AllowModuleTypes: ["c1", "c3"], }, - { Name: "Locks", HasType: false, LockLayer: true, AllowColorize: false, }, - ], - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemTorso", - ParentGroup: "BodyUpper", - Category: "Item", - Priority: 17, - Default: false, - Left: 125, - Top: 200, - AllowPose: ["Hogtied", "AllFours"], - Zone: [[100, 340, 150, 80]], - RemoveItemOnRemove: [ - { Group: "ItemAddon", Name: "CeilingRope" }, - { Group: "ItemAddon", Name: "CeilingChain" }, - ], - Asset: [ - { Name: "NylonRopeHarness", Fetish: ["Rope", "Nylon"], Value: 30, Time: 20, BuyGroup: "NylonRope", CraftGroup: "NylonRope", Audio: "RopeShort", Prerequisite: "AccessTorso", Extended: true, - DefaultColor: ["#CCCCCC"], - Layer: [ - { Name: "Rope" }, - { Name: "Shine", AllowColorize: false }, - ] }, - { Name: "HempRopeHarness", Fetish: ["Rope"], Value: 60, Difficulty: 3, Time: 20, RemoveTime: 25, DefaultColor: "#956B1C", BuyGroup: "HempRope", CraftGroup: "HempRope", Audio: "RopeShort", Prerequisite: "AccessTorso", Extended: true }, - { Name: "LeatherHarness", Fetish: ["Leather"], BuyGroup: "LeatherHarness", Value: 60, Difficulty: 50, Time: 15, RemoveTime: 10, AllowLock: true, Prerequisite: "AccessTorso" }, - { Name: "LeatherStrapHarness", Fetish: ["Leather"], BuyGroup: "LeatherStrapHarness", Value: 50, Difficulty: 50, Time: 15, RemoveTime: 10, DefaultColor: "#101010", AllowLock: true, Prerequisite: "AccessTorso" }, - { Name: "AdultBabyHarness", Category: ["ABDL"], Fetish: ["Leather", "ABDL"], BuyGroup: "AdultBabyHarness", Priority: 33, Value: 50, Difficulty: 3, Time: 15, RemoveTime: 10, HideItem: ["ItemNipplesLactationPump"], AllowLock: true, DefaultColor: "#aaaaaa", ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], DrawLocks: false, Attribute: ["CanAttachMittens"]}, - { Name: "HarnessBra1", Fetish: ["Leather"], Priority: 20, Value: 30, Difficulty: 8, Time: 15, RemoveTime: 10, HideItem: ["ItemNipplesLactationPump"], AllowLock: true, BuyGroup: "HarnessBra1", Prerequisite: "AccessTorso", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], DrawLocks: false }, - { Name: "HarnessBra2", Fetish: ["Leather"], Priority: 20, Value: 40, Difficulty: 8, Time: 15, RemoveTime: 10, HideItem: ["ItemNipplesLactationPump"], AllowLock: true, BuyGroup: "HarnessBra2", Prerequisite: "AccessTorso", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"] }, - { Name: "Corset2", Fetish: ["Lingerie"], Priority: 22, Value: 30, Difficulty: 8, Time: 15, RemoveTime: 10, AllowLock: true, DrawLocks: false, Left: 150, BuyGroup: "Corset2", Prerequisite: "AccessTorso", Hide: ["ItemNipples", "ItemNipplesPiercings"], HideForPose: ["AllFours"], DynamicGroupName: "Corset" }, - { Name: "FuturisticHarness", Fetish: ["Metal"], Category: ["SciFi"], BuyGroup: "FuturisticHarness", Value: 30, Difficulty: 20, Time: 17, RemoveTime: 12, Audio: "FuturisticApply", DefaultColor: ["#50913C", "Default", "#889FA7"], FuturisticRecolor: true, Effect: [], AllowLock: true, DrawLocks: false, Prerequisite: "AccessTorso", HideForPose: ["AllFours"], Extended: true, AllowType: ["Upper", "Lower"], - Layer:[ - { Name: "Display", AllowColorize: true, ParentGroup: null, Priority: 15, AllowTypes: ["", "Lower"], HasType: false}, - { Name: "Band", AllowColorize: true, Priority: 15 , AllowTypes: ["", "Lower"], HasType: false}, - { Name: "Mesh", AllowColorize: true, ParentGroup: null, Priority: 15, AllowTypes: ["", "Lower"], HasType: false}, - { Name: "Lock", LockLayer: true,AllowColorize: true, ParentGroup: null, AllowTypes: ["", "Lower"], HasType: false}, - { Name: "Display2", AllowColorize: true, CopyLayerColor: "Display", ParentGroup: null, AllowTypes: ["", "Upper"], HasType: false}, - { Name: "Band2", AllowColorize: true, CopyLayerColor: "Band", AllowTypes: ["", "Upper"], HasType: false}, - { Name: "Lock2", LockLayer: true, CopyLayerColor: "Lock", ParentGroup: null, AllowTypes: ["", "Upper"], HasType: false}, - ] - }, - { Name: "HighSecurityHarness", Fetish: ["Metal"], BuyGroup: "HighSecurityHarness", Value: 50, Difficulty: 50, Time: 20, RemoveTime: 15, DefaultColor: ["#444444", "Default"], Effect: [], AllowLock: true, DrawLocks: false, Prerequisite: "AccessTorso", HideForPose: ["AllFours"], Extended: true, - Layer:[ - { Name: "StrapsHarness", AllowColorize: true, ParentGroup: null, Priority: 15 , HasType: true}, - { Name: "ClampsHarness", AllowColorize: true, ParentGroup: null, Priority: 15, HasType: true}, - ] - }, - { Name: "Corset3", Fetish: ["Lingerie"], Priority: 22, Value: 25, Difficulty: 8, Time: 15, RemoveTime: 10, AllowLock: true, DrawLocks: false, Left: 150, BuyGroup: "Corset3", Prerequisite: "AccessTorso", Hide: ["ItemNipples", "ItemNipplesPiercings"], HideForPose: ["AllFours"], DynamicGroupName: "Corset" }, - { Name: "Corset4", Fetish: ["Lingerie"], Priority: 22, Value: 15, Difficulty: 8, Time: 15, RemoveTime: 10, AllowLock: true, DrawLocks: false, Left: 150, BuyGroup: "Corset4", Prerequisite: "AccessTorso", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HideForPose: ["Hogtied", "AllFours"], DynamicGroupName: "Corset" }, - { Name: "Corset5", Fetish: ["Lingerie"], Priority: 22, Value: 20, Difficulty: 8, Time: 15, RemoveTime: 10, AllowLock: true, DrawLocks: false, Left: 150, BuyGroup: "Corset5", Prerequisite: "AccessTorso", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HideForPose: ["Hogtied", "AllFours"], DynamicGroupName: "Corset" }, - { Name: "LeatherBreastBinder", Fetish: ["Leather"], Value: 30, Difficulty: 50, Time: 15, BuyGroup: "BreastBinder", RemoveTime: 10, AllowLock: true, Prerequisite: "AccessTorso" }, - { - Name: "LatexCorset1", Fetish: ["Lingerie", "Latex"], Priority: 21, Value: 40, Difficulty: 8, Time: 15, RemoveTime: 10, AllowLock: true, Left: 150, BuyGroup: "LatexCorset1", Prerequisite: "AccessTorso", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HideForPose: ["Hogtied", "AllFours"], DynamicGroupName: "Corset", Extended: true, HasType: false, - Layer:[ - { Name: "Base", HasType: false }, - { Name: "Garter", CopyLayerColor: "Base", HasType: false, AllowTypes: [""] } - ] - }, - { Name: "LeatherStrapBra1", Fetish: ["Leather"], Value: 15, Difficulty: 5, Time: 15, RemoveTime: 10, AllowLock: true, Left: 150, Top: 200, BuyGroup: "LeatherStrapBra1", Prerequisite: "AccessTorso", DrawLocks: false, PoseMapping: { Hogtied: "" } }, - { Name: "CrotchChain", Fetish: ["Metal"], Value: 40, Difficulty: 50, Time: 15, BuyGroup: "Chains", RemoveTime: 10, AllowLock: true, Audio: "ChainLong", Effect: ["CrotchRope"], Prerequisite: "AccessTorso", HideForPose: ["AllFours", "Hogtied"] }, - { - Name: "StuddedHarness", Fetish: ["Lingerie", "Leather"], Priority: 20, Value: 100, DefaultColor:"#343131", Difficulty: 30, Time: 15, RemoveTime: 10, AllowLock: true, Prerequisite: "AccessTorso",BuyGroup: "StuddedHarness", Expose:["ItemBreast"], Hide: ["ItemNipples","ItemNipplesPiercings"], HideItem: ["PantiesDiapers1","PantiesDiapers2","PantiesDiapers3", "PantiesDiapers4"], AllowPose: ["Hogtied", "AllFours", "Yoked"], - Layer:[ - { Name: "Harness", AllowColorize: true}, - { Name: "Metal", AllowColorize: false} - ], - }, - { Name: "HeavyLatexCorset", Fetish: ["Lingerie", "Latex"], Priority: 22, Value: 60, Difficulty: 10, Time: 20, RemoveTime: 15, BuyGroup: "HeavyLatexCorset", AllowLock: true, DrawLocks: false, Prerequisite: "AccessTorso", AllowPose: ["OverTheHead"], HideForPose: ["AllFours", "Hogtied"], Extended: true}, - { Name: "Ribbons", Fetish: ["Lingerie"], Value: 30, Difficulty: 3, Time: 10, RemoveTime: 5, BuyGroup: "Ribbon", Prerequisite: "AccessTorso", AllowPose: ["AllFours", "Hogtied"], Extended: true }, - { Name: "SilkStraps", Value: 40, BuyGroup: "SilkStraps", DefaultColor: "#E8E8E8", Difficulty: 3, Time: 10, RemoveTime: 5, Prerequisite: "AccessTorso", Extended: true}, - { Name: "ThinLeatherStraps", Fetish: ["Leather"], Value: 70, Difficulty: 2, Time: 20, RemoveTime: 20, BuyGroup: "ThinLeatherStraps", Prerequisite: "AccessTorso", Random: false, AllowLock: true, DrawLocks: false, Extended: true, - Layer: [ - { Name: "Strap" }, - { Name: "Buckle" }, - { Name: "Locks", LockLayer: true } - ] - }, - { Name: "LockingSwimsuit", Left: 150, Top: 200, Difficulty: 4, BuyGroup: "LockingSwimsuit", Value: 60, AllowLock: true, DrawLocks: false, Prerequisite: "AccessTorso", Extended: true }, - { Name: "LockingSwimsuit2", Left: 150, Top: 200, Difficulty: 4, BuyGroup: "LockingSwimsuit2", Value: 70, AllowLock: true, DrawLocks: false, Prerequisite: "AccessTorso" }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemTorso2", - ParentGroup: "BodyUpper", - Category: "Item", - Priority: 18, - Default: false, - Left: 125, - Top: 200, - AllowPose: ["Hogtied", "AllFours"], - Zone: [[250, 340, 150, 80]], - RemoveItemOnRemove: [ - { Group: "ItemAddon", Name: "CeilingRope" }, - { Group: "ItemAddon", Name: "CeilingChain" }, - ], - DynamicGroupName: "ItemTorso", - MirrorActivitiesFrom: "ItemTorso", - Asset: [ - { Name: "LockingSwimsuit", Left: 150, Top: 200, Difficulty: 4, BuyGroup: "LockingSwimsuit", Value: 60, AllowLock: true, DrawLocks: false, Prerequisite: "AccessTorso", Extended: true }, - { Name: "LeatherStrapHarness", Fetish: ["Leather"], BuyGroup: "LeatherStrapHarness", Value: 50, Difficulty: 50, Time: 15, RemoveTime: 10, DefaultColor: "#101010", AllowLock: true, Prerequisite: "AccessTorso" }, - { Name: "LeatherHarness", Fetish: ["Leather"], BuyGroup: "LeatherHarness", Value: 60, Difficulty: 50, Time: 15, RemoveTime: 10, AllowLock: true, Prerequisite: "AccessTorso" }, - { Name: "NylonRopeHarness", Fetish: ["Rope", "Nylon"], Value: 30, Time: 20, BuyGroup: "NylonRope", CraftGroup: "NylonRope",Audio: "RopeShort", Prerequisite: "AccessTorso", Extended: true, - DefaultColor: ["#CCCCCC"], - Layer: [ - { Name: "Rope" }, - { Name: "Shine", AllowColorize: false }, - ] - }, - { Name: "HempRopeHarness", Fetish: ["Rope"], Value: 60, Difficulty: 3, Time: 20, RemoveTime: 25, DefaultColor: "#956B1C", BuyGroup: "HempRope", CraftGroup: "HempRope", Audio: "RopeShort", Prerequisite: "AccessTorso", Extended: true }, - { Name: "AdultBabyHarness", Category: ["ABDL"], Fetish: ["Leather", "ABDL"], BuyGroup: "AdultBabyHarness", Priority: 33, Value: 50, Difficulty: 3, Time: 15, RemoveTime: 10, HideItem: ["ItemNipplesLactationPump"], AllowLock: true, DefaultColor: "#aaaaaa", ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], DrawLocks: false, Attribute: ["CanAttachMittens"] }, - { Name: "HarnessBra1", Fetish: ["Leather"], Priority: 20, Value: 30, Difficulty: 8, Time: 15, RemoveTime: 10, HideItem: ["ItemNipplesLactationPump"], AllowLock: true, BuyGroup: "HarnessBra1", Prerequisite: "AccessTorso", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], DrawLocks: false }, - { Name: "HarnessBra2", Fetish: ["Leather"], Priority: 20, Value: 40, Difficulty: 8, Time: 15, RemoveTime: 10, HideItem: ["ItemNipplesLactationPump"], AllowLock: true, BuyGroup: "HarnessBra2", Prerequisite: "AccessTorso", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"] }, - { Name: "Corset2", Fetish: ["Lingerie"], Priority: 22, Value: 30, Difficulty: 8, Time: 15, RemoveTime: 10, AllowLock: true, DrawLocks: false, Left: 150, BuyGroup: "Corset2", Prerequisite: "AccessTorso", Hide: ["ItemNipples", "ItemNipplesPiercings"], HideForPose: ["AllFours"], DynamicGroupName: "Corset" }, - { Name: "FuturisticHarness", Fetish: ["Metal"], Category: ["SciFi"], BuyGroup: "FuturisticHarness", Value: 30, Difficulty: 20, Time: 17, RemoveTime: 12, Audio: "FuturisticApply", DefaultColor: ["#50913C", "Default", "#889FA7"], FuturisticRecolor: true, Effect: [], AllowLock: true, DrawLocks: false, Prerequisite: "AccessTorso", HideForPose: ["AllFours"], Extended: true, AllowType: ["Upper", "Lower"], - Layer:[ - { Name: "Display", AllowColorize: true, ParentGroup: null, Priority: 15, AllowTypes: ["", "Lower"], HasType: false}, - { Name: "Band", AllowColorize: true, Priority: 15 , AllowTypes: ["", "Lower"], HasType: false}, - { Name: "Mesh", AllowColorize: true, ParentGroup: null, Priority: 15, AllowTypes: ["", "Lower"], HasType: false}, - { Name: "Lock", LockLayer: true,AllowColorize: true, ParentGroup: null, AllowTypes: ["", "Lower"], HasType: false}, - { Name: "Display2", AllowColorize: true, CopyLayerColor: "Display", ParentGroup: null, AllowTypes: ["", "Upper"], HasType: false}, - { Name: "Band2", AllowColorize: true, CopyLayerColor: "Band", AllowTypes: ["", "Upper"], HasType: false}, - { Name: "Lock2", LockLayer: true, CopyLayerColor: "Lock", ParentGroup: null, AllowTypes: ["", "Upper"], HasType: false}, - ] - }, - { Name: "HighSecurityHarness", Fetish: ["Metal"], BuyGroup: "HighSecurityHarness", Value: 50, Difficulty: 50, Time: 20, RemoveTime: 15, DefaultColor: ["#444444", "Default"], Effect: [], AllowLock: true, DrawLocks: false, Prerequisite: "AccessTorso", HideForPose: ["AllFours"], Extended: true, - Layer:[ - { Name: "StrapsHarness", AllowColorize: true, ParentGroup: null, Priority: 15 , HasType: true}, - { Name: "ClampsHarness", AllowColorize: true, ParentGroup: null, Priority: 15, HasType: true}, - ] - }, - { Name: "Corset3", Fetish: ["Lingerie"], Priority: 22, Value: 25, Difficulty: 8, Time: 15, RemoveTime: 10, AllowLock: true, DrawLocks: false, Left: 150, BuyGroup: "Corset3", Prerequisite: "AccessTorso", Hide: ["ItemNipples", "ItemNipplesPiercings"], HideForPose: ["AllFours"], DynamicGroupName: "Corset" }, - { Name: "Corset4", Fetish: ["Lingerie"], Priority: 22, Value: 15, Difficulty: 8, Time: 15, RemoveTime: 10, AllowLock: true, DrawLocks: false, Left: 150, BuyGroup: "Corset4", Prerequisite: "AccessTorso", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HideForPose: ["Hogtied", "AllFours"], DynamicGroupName: "Corset" }, - { Name: "Corset5", Fetish: ["Lingerie"], Priority: 22, Value: 20, Difficulty: 8, Time: 15, RemoveTime: 10, AllowLock: true, DrawLocks: false, Left: 150, BuyGroup: "Corset5", Prerequisite: "AccessTorso", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HideForPose: ["Hogtied", "AllFours"], DynamicGroupName: "Corset" }, - { - Name: "LatexCorset1", Fetish: ["Lingerie", "Latex"], Priority: 21, Value: 40, Difficulty: 8, Time: 15, RemoveTime: 10, AllowLock: true, Left: 150, BuyGroup: "LatexCorset1", Prerequisite: "AccessTorso", Expose: ["ItemNipples", "ItemBreast", "ItemNipplesPiercings"], HideForPose: ["Hogtied", "AllFours"], DynamicGroupName: "Corset", Extended: true, HasType: false, - Layer:[ - { Name: "Base", HasType: false }, - { Name: "Garter", CopyLayerColor: "Base", HasType: false, AllowTypes: [""] } - ] - }, - { Name: "LeatherBreastBinder", Fetish: ["Leather"], Value: 30, Difficulty: 50, Time: 15, BuyGroup: "BreastBinder", RemoveTime: 10, AllowLock: true, Prerequisite: "AccessTorso" }, - { Name: "LeatherStrapBra1", Fetish: ["Leather"], Value: 15, Difficulty: 5, Time: 15, RemoveTime: 10, AllowLock: true, Left: 150, Top: 200, BuyGroup: "LeatherStrapBra1", Prerequisite: "AccessTorso", DrawLocks: false, PoseMapping: { Hogtied: "" } }, - { Name: "CrotchChain", Fetish: ["Metal"], Value: 40, Difficulty: 50, Time: 15, BuyGroup: "Chains", RemoveTime: 10, AllowLock: true, Audio: "ChainLong", Effect: ["CrotchRope"], Prerequisite: "AccessTorso", HideForPose: ["AllFours", "Hogtied"] }, - { - Name: "StuddedHarness", Fetish: ["Lingerie", "Leather"], Priority: 20, Value: 100, DefaultColor:"#343131", Difficulty: 30, Time: 15, RemoveTime: 10, AllowLock: true, Prerequisite: "AccessTorso",BuyGroup: "StuddedHarness", Expose:["ItemBreast"], Hide: ["ItemNipples","ItemNipplesPiercings"], HideItem: ["PantiesDiapers1","PantiesDiapers2","PantiesDiapers3", "PantiesDiapers4"], AllowPose: ["Hogtied", "AllFours", "Yoked"], - Layer:[ - { Name: "Harness", AllowColorize: true}, - { Name: "Metal", AllowColorize: false} - ], - }, - { Name: "HeavyLatexCorset", Fetish: ["Lingerie", "Latex"], Priority: 22, Value: 60, Difficulty: 10, Time: 20, RemoveTime: 15, BuyGroup: "HeavyLatexCorset", AllowLock: true, DrawLocks: false, Prerequisite: "AccessTorso", AllowPose: ["OverTheHead"], HideForPose: ["AllFours", "Hogtied"], Extended: true }, - { Name: "Ribbons", Fetish: ["Lingerie"], Value: 30, Difficulty: 3, Time: 10, RemoveTime: 5, BuyGroup: "Ribbon", Prerequisite: "AccessTorso", AllowPose: ["AllFours", "Hogtied"], Extended: true }, - { Name: "SilkStraps", Value: 40, BuyGroup: "SilkStraps", DefaultColor: "#E8E8E8", Difficulty: 3, Time: 10, RemoveTime: 5, Prerequisite: "AccessTorso", Extended: true}, - { Name: "ThinLeatherStraps", Fetish: ["Leather"], Value: 70, Difficulty: 2, Time: 20, RemoveTime: 20, BuyGroup: "ThinLeatherStraps", Prerequisite: "AccessTorso", Random: false, AllowLock: true, DrawLocks: false, Extended: true, - Layer: [ - { Name: "Strap" }, - { Name: "Buckle" }, - { Name: "Locks", LockLayer: true } - ] - }, - { Name: "LockingSwimsuit2", Left: 150, Top: 200, Difficulty: 4, BuyGroup: "LockingSwimsuit2", Value: 70, AllowLock: true, DrawLocks: false, Prerequisite: "AccessTorso" }, - AssetSpankingToys - ] - }, - - { - Group: "ItemNipples", - ParentGroup: "BodyUpper", - Category: "Item", - Priority: 22, - Default: false, - Left: 150, - Top: 200, - AllowPose: ["AllFours"], - Zone: [[100, 270, 100, 70]], - Asset: [ - { Name: "NippleClamp", Fetish: ["Metal", "Masochism"], Value: 25, Time: 10, Prerequisite: "AccessBreast", ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }] }, - { Name: "VibeNippleClamp", Fetish: ["Metal", "Masochism"], Value: 40, Time: 10, Prerequisite: "AccessBreast", Effect: ["Egged", "Wiggling"], AllowEffect: ["Egged", "Vibrating", "Edged"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }], DynamicScriptDraw: true }, - { Name: "VibratorRemote", Value: 50, Wear: false, BuyGroup: "VibratorRemote", Prerequisite: ["RemotesAllowed"], Effect: ["Remote"] }, - { Name: "ChainClamp", Fetish: ["Metal", "Masochism"], Value: 25, Time: 10, Prerequisite: "AccessBreast", Effect: ["Wiggling"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }], Extended: true, - Layer: [ - { Name: "Chain", AllowColorize: true , HasType: false, AllowTypes: [""]}, - { Name: "Metal", AllowColorize: true , HasType: false}, - { Name: "Clamp", AllowColorize: true , HasType: false}, - { Name: "Chain2", CopyLayerColor: "Chain", HasType: false, AllowTypes: ["Chain2"]} - ] - }, - { Name: "ScrewClamps", Fetish: ["Metal", "Masochism"], Value: 35, Time: 10, Prerequisite: "AccessBreast", ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "ChainTassles", Value: 45, Time: 10, Prerequisite: "AccessBreast", Hide: ["ItemNipplesPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "HeartPasties", Value: 20, Time: 10, DefaultColor: "#800000", Prerequisite: "AccessBreast", Hide: ["ItemNipplesPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "TapedVibeEggs", Fetish: ["Tape"], Value: 30, Time: 5, Prerequisite: "AccessBreast", Effect: ["Egged"], AllowEffect: ["Egged", "Vibrating", "Edged"], DynamicScriptDraw: true, Layer: [ - { Name: "Egg1", ColorGroup: "Eggs" }, - { Name: "Egg2", ColorGroup: "Eggs" }, - { Name: "Tape1", ColorGroup: "Tape" }, - { Name: "Tape2", ColorGroup: "Tape" } - - ] }, - { Name: "NippleSuctionCups", Value: 25, Time: 10, Prerequisite: "AccessBreast", Hide: ["ItemNipplesPiercings"], Effect: ["Wiggling"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }], Extended: true, HasType: false }, - { Name: "NippleTape", Fetish: ["Tape"], Value: 10, Time: 5, CraftGroup: "DuctTape", Prerequisite: "AccessBreast", Hide: ["ItemNipplesPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "ChopStickNippleClamps", Fetish: ["Rope", "Masochism"], Value: 25, Time: 10, Prerequisite: "AccessBreast", Effect: ["Wiggling"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "KittyPasties", Value: 20, Time: 10, DefaultColor: "#444444", Prerequisite: "AccessBreast", Hide: ["ItemNipplesPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "Clothespins", Fetish: ["Masochism"], Value: 15, Time: 10, Prerequisite: "AccessBreast", ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }] }, - { Name: "NippleWeightClamps", Fetish: ["Metal", "Masochism"], Value: 35, Time: 10, Prerequisite: "AccessBreast", Effect: ["Wiggling"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 10 }] }, - { Name: "BellClamps", Fetish: ["Metal", "Masochism"], Value: 20, Time: 10, Prerequisite: "AccessBreast", Audio: "BellSmall", Effect: ["Wiggling"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 10 }] }, - { - Name: "LactationPump", Fetish: ["Pet"], Value: 130, Top: 0, Priority: 38, Left: 0, Time: 10, Extended: true, AlwaysExtend: true, HasType: false, DynamicBeforeDraw: true, - Prerequisite: ["AccessBreast", "CannotBeSuited"], - AllowPose: ["AllFours", "Kneel", "Hogtied", "KneelingSpread"], - Block: ["ItemNipplesPiercings", "ItemBreast"], - Hide: ["ItemNipplesPiercings"], - ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }], - }, - { Name: "ShockClamps", Fetish: ["Metal", "Masochism"], Value: 60, Time: 10, Extended: true, AlwaysExtend: true, Prerequisite: "AccessBreast", ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 10 }], }, - {Name: "PlateClamps", Fetish: ["Metal", "Masochism"], Value: 20, Time: 15, Extended: true, Prerequisite: "AccessBreast", ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 10 }]}, - { - Name: "StretchClovers", Fetish: ["Metal", "Masochism"], Top: 0, Left: 0, Value: 35, Time: 17, Prerequisite: "AccessBreast", ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }], HideForPose: ["AllFours"], Layer: [ - { Name: "Frame" }, - { Name: "Clamps" } - ], - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemNipplesPiercings", - ParentGroup: "BodyUpper", - Category: "Item", - Priority: 13, - Default: false, - Left: 150, - Top: 200, - AllowPose: ["AllFours"], - Zone: [[200, 270, 100, 70]], - Asset: [ - { Name: "StraightPiercing", Fetish: ["Metal"], Value: 10, Difficulty: 10, Time: 15, AllowLock: true, Prerequisite: ["AccessBreast", "AccessBreastSuitZip"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }] }, - { Name: "RoundPiercing", Fetish: ["Metal"], Value: 40, Difficulty: 10, Time: 15, AllowLock: true, DrawLocks: false, Prerequisite: ["AccessBreast", "AccessBreastSuitZip"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }], Extended: true, - Layer: [ - { Name: "Piercings", HasType: false, AllowTypes: ["", "Weighted"] }, - { Name: "PiercingsChained", HasType: false, AllowTypes: ["Chain", "WeightedChain"], CopyLayerColor: "Piercings" }, - { Name: "Chain", HasType: false, AllowTypes: ["Chain", "WeightedChain"] }, - { Name: "Weights", HasType: false, AllowTypes: ["Weighted"] }, - { Name: "WeightsChained", HasType: false, AllowTypes: ["WeightedChain"], CopyLayerColor: "Weights" } - ] - }, - { - Name: "NecklacePiercingChain", Value: 80, Difficulty: 3, Time: 20, AllowLock: true, DrawLocks: false, Prerequisite: ["AccessBreast", "AccessBreastSuitZip"], HideForPose: ["AllFours"], - Layer: [ - { Name: "Chain" }, - { Name: "Heart" }, - { Name: "Piercing" } - ] - }, - { Name: "NippleAccessory1", Fetish: ["Metal"], Value: 15, Difficulty: 10, Time: 5, AllowLock: true, Prerequisite: ["AccessBreast", "AccessBreastSuitZip"] }, - { Name: "NippleAccessory2", Fetish: ["Metal"], Value: 15, Difficulty: 10, Time: 5, AllowLock: true, Prerequisite: ["AccessBreast", "AccessBreastSuitZip"] }, - { Name: "NippleAccessory3", Fetish: ["Metal"], Value: 15, Difficulty: 10, Time: 5, AllowLock: true, Prerequisite: ["AccessBreast", "AccessBreastSuitZip"] }, - { Name: "BarbellPiercing", Fetish: ["Metal"], Value: 20, Difficulty: 10, Time: 15, AllowLock: true, Prerequisite: ["AccessBreast", "AccessBreastSuitZip"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }] }, - { Name: "NippleChastityPiercing1", Fetish: ["Metal"], Value: 50, Difficulty: 50, Time: 30, RemoveTime: 30, AllowLock: true, Prerequisite: ["AccessBreast", "AccessBreastSuitZip"], Effect: ["BreastChaste"], Block: ["ItemNipples"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }] }, - { Name: "NippleChastityPiercing2", Fetish: ["Metal"], Value: 50, Difficulty: 50, Time: 30, RemoveTime: 30, AllowLock: true, Prerequisite: ["AccessBreast", "AccessBreastSuitZip"], Effect: ["BreastChaste"], Block: ["ItemNipples"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }] }, - { - Name: "VibeHeartPiercings", Value: 40, Difficulty: 10, Time: 10, AllowLock: true, BuyGroup: "VibeHeart", Prerequisite: ["AccessBreast", "AccessBreastSuitZip"], Effect: ["Egged", "Wiggling"], AllowEffect: ["Egged", "Vibrating", "Edged", "Wiggling"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }], DynamicScriptDraw: true, - Layer: [ - { Name: "Heart" }, - { Name: "Ring" } - ] - }, - { Name: "BellPiercing", Fetish: ["Metal"], Value: 30, Difficulty: 10, Time: 15, AllowLock: true, Audio: "BellSmall", Prerequisite: ["AccessBreast", "AccessBreastSuitZip"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }] }, - { Name: "CrossedStraightPiercing", Fetish: ["Metal"], Value: 10, Difficulty: 10, Time: 15, AllowLock: true, Prerequisite: ["AccessBreast", "AccessBreastSuitZip"], ExpressionTrigger: [{ Name: "Closed", Group: "Eyes", Timer: 5 }, { Name: "Angry", Group: "Eyebrows", Timer: 5 }] }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemBreast", - ParentGroup: "BodyUpper", - Category: "Item", - Priority: 16, - Default: false, - Left: 150, - Top: 200, - AllowPose: ["AllFours"], - Zone: [[300, 270, 100, 70]], - Asset: [ - { Name: "MetalChastityBra", Fetish: ["Metal"], Value: 60, Difficulty: 50, Time: 15, AllowLock: true, Audio: "CuffsMetal", Prerequisite: "AccessBreast", Hide: ["ItemNipples", "ItemNipplesPiercings"], Effect: ["BreastChaste"], Block: ["ItemNipples", "ItemNipplesPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }] }, - { Name: "PolishedChastityBra", Fetish: ["Metal"], Value: 100, Difficulty: 50, Time: 15, AllowLock: true, Audio: "CuffsMetal", Prerequisite: "AccessBreast", Hide: ["ItemNipples", "ItemNipplesPiercings"], Effect: ["BreastChaste"], Block: ["ItemNipples", "ItemNipplesPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }] }, - { Name: "FuturisticBra", Category: ["SciFi"], Fetish: ["Metal"], Value: 120, BuyGroup: "FuturisticBra", HideForPose: ["AllFours"], Difficulty: 50, Time: 10, Random: false, AllowLock: true, DrawLocks: false, DefaultColor: ["#50913C", "#FFFFFF", "#889FA7", "Default"], AllowType: ["", "Heart", "Solid", "Show2", "Show2Heart", "Solid2"], Audio: "FuturisticApply", Prerequisite: "AccessBreast", Hide: ["ItemNipples", "ItemNipplesPiercings"], FuturisticRecolor: true, Effect: [ "BreastChaste", "UseRemote"], Block: ["ItemNipples", "ItemNipplesPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Extended: true, DynamicAfterDraw: true, DynamicScriptDraw: true, - Layer: [ - { Name: "Display", AllowColorize: true , HasType: false}, - { Name: "Lock", LockLayer: true, AllowColorize: true, HasType: false, ParentGroup: null}, - { Name: "Text" , AllowColorize: true , HasType: true, AllowTypes: ["", "Heart", "Show2", "Show2Heart"]}, - { Name: "Mesh" , AllowColorize: true , HasType: false, AllowTypes: ["", "Heart", "Solid"]}, - { Name: "Mesh2", CopyLayerColor: "Mesh", HasType: false, AllowTypes: ["Show2", "Show2Heart", "Solid2"]}, - { Name: "Bra" , AllowColorize: true , AllowTypes: ["", "Heart", "Solid", "Show2", "Show2Heart", "Solid2"]}, - ] - }, - { Name: "FuturisticBra2", Category: ["SciFi"], Fetish: ["Metal"], Value: -1, BuyGroup: "FuturisticBra", Difficulty: 50, Time: 10, Random: false, AllowLock: true, DrawLocks: false, HideForPose: ["AllFours"], DefaultColor: ["#50913C", "Default", "#889FA7","Default", "#404040"], - Audio: "FuturisticApply", Prerequisite: "AccessBreast", Hide: ["ItemNipples", "ItemNipplesPiercings"], FuturisticRecolor: true, Effect: ["BreastChaste", "UseRemote"], Block: ["ItemNipples", "ItemNipplesPiercings"], - ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Extended: true, - Layer: [ - { Name: "Display", AllowColorize: true , HasType: false, AllowModuleTypes: ["d0"], ParentGroup: null}, - { Name: "Bra" , AllowColorize: true, HasType: false}, - { Name: "Mesh" , AllowColorize: true , HasType: false}, - { Name: "Shine" , AllowColorize: true, HasType: false, AllowModuleTypes: ["s0"]}, - { Name: "Straps" , AllowColorize: true , HasType: false}, - { Name: "Lock", LockLayer: true,AllowColorize: true, ParentGroup: null, HasType: false, AllowModuleTypes: ["d0"]}, - ] - }, - { - Name: "OrnateChastityBra", Audio: "CuffsMetal", Fetish: ["Metal"], Value: 150, Difficulty: 50, Time: 15, AllowLock: true, Prerequisite: "AccessBreast", Hide: ["ItemNipples", "ItemNipplesPiercings"], Effect: ["BreastChaste"], Block: ["ItemNipples", "ItemNipplesPiercings"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], - Layer: [ - { Name: "Bra" }, - { Name: "Gems" } - ] - }, - { Name: "Ribbons", Fetish: ["Lingerie"], Value: 30, Difficulty: 3, Time: 10, RemoveTime: 5, BuyGroup: "Ribbon", Prerequisite: "AccessBreast", Extended: true }, - { Name: "LeatherBreastBinder", Fetish: ["Leather"], Value: 30, Difficulty: 5, Time: 15, BuyGroup: "BreastBinder", RemoveTime: 10, AllowLock: true, Prerequisite: "AccessTorso" }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemArms", - ParentGroup: "BodyUpper", - Category: "Item", - Priority: 31, - Default: false, - IsRestraint: true, - Left: 50, - Top: 200, - Zone: [[10, 200, 90, 200], [400, 200, 90, 200]], - RemoveItemOnRemove: [ - { Group: "ItemAddon", Name: "CeilingRope" }, - { Group: "ItemAddon", Name: "CeilingChain" }, - ], - Asset: [ - { Name: "NylonRope", Fetish: ["Rope", "Nylon"], Value: 30, SelfBondage: 2, Time: 15, BuyGroup: "NylonRope", SetPose: ["BackBoxTie"], Effect: ["Block", "Prone"], Audio: "RopeShort", Extended: true, DynamicBeforeDraw: true, - DefaultColor: "#CCCCCC", - Layer: [ - { Name: "Rope" }, - { Name: "Shine", AllowColorize: false } - ] - }, - { - Name: "HempRope", Fetish: ["Rope"], Value: 60, Difficulty: 3, SelfBondage: 2, Time: 20, DefaultColor: "#956B1C", BuyGroup: "HempRope", Audio: "RopeShort", Extended: true, DynamicBeforeDraw: true, - SetPose: ["BackBoxTie"], - Effect: ["Block", "Prone"], - Layer: [ - { Name: "" }, - { Name: "Suspension", Top: -687, HasType: false, Priority: 31, ParentGroup: "", AllowTypes: ["SuspensionHogtied", "SuspensionAllFours", "SuspensionKneelingHogtie"] }, - { Name: "InvertedSuspension", Top: 346, HasType: false, Priority: 6, ParentGroup: "", AllowTypes: ["InvertedSuspensionHogtied", "InvertedSuspensionAllFours"] }, - ] - }, - { - Name: "MetalCuffs", Fetish: ["Metal"], Priority: 29, Value: 40, Difficulty: 5, Time: 5, Audio: "MetalCuffs", Extended: true, HasType: false, - SetPose: ["BackCuffs"], - Effect: ["Lock", "Block", "Prone"], - AllowPose: ["BackCuffs"], - }, - { - Name: "SturdyLeatherBelts", Fetish: ["Leather"], Value: 50, Difficulty: 5, SelfBondage: 4, Time: 20, AllowLock: true, BuyGroup: "SturdyLeatherBelts", SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone", "NotSelfPickable"], Extended: true, SelfUnlock: false, Audio: "Buckle", - HideItem: ["ClothBabydollDress1", "ClothAdultBabyDress1", "ClothAdultBabyDress2", "ClothAdultBabyDress3", "ClothAdultBabyDress4", "ClothFlowerDress", "ClothMaidOutfit1", "ClothMaidOutfit2", "ClothRobe1", "ClothGown3", "ClothStudentOutfit1", "ClothStudentOutfit2", "ClothStudentOutfit3", "ClothTeacherOutfit1", ], - DefaultColor: ["#11161B", "#403E40", "#11161B", "#403E40", "#11161B", "#403E40"], - Layer: [ - { Name: "WaistBelt", ColorGroup: "Belts", HasType: false, AllowTypes: ["", "Two", "Three"] }, - { Name: "WaistMetal", ColorGroup: "Metal", HasType: false, AllowTypes: ["", "Two", "Three"] }, - { Name: "UpperTorsoBelt", ColorGroup: "Belts", HasType: false, AllowTypes: ["Two", "Three"] }, - { Name: "UpperTorsoMetal", ColorGroup: "Metal", HasType: false, AllowTypes: ["Two", "Three"] }, - { Name: "LowerTorsoBelt", ColorGroup: "Belts", HasType: false, AllowTypes: ["Three"] }, - { Name: "LowerTorsoMetal", ColorGroup: "Metal", HasType: false, AllowTypes: ["Three"] }, - ], - }, - { - Name: "LeatherArmbinder", Fetish: ["Leather"], Priority: 6, Value: 80, Difficulty: 10, SelfBondage: 7, Time: 25, RemoveTime: 10, AllowLock: true, DefaultColor: "#404040", SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], Block: ["ItemHands"], Extended: true, SelfUnlock: false, DrawLocks: false, - Layer: [ - { Name: "Binder", HasType: false, ParentGroup: null }, - { Name: "Strap", HasType: false, Priority: 31, ParentGroup: null, AllowTypes: ["Strap"], HideAs: { Group: "ItemHidden", Asset: "LeatherArmbinderStrap" } }, - { Name: "WrapStrap", CopyLayerColor: "Strap", HasType: false, Priority: 31, ParentGroup: null, AllowTypes: ["WrapStrap"], HideAs: { Group: "ItemHidden", Asset: "LeatherArmbinderWrapStrap" } }, - { Name: "Lock", LockLayer: true, HasType: false, Priority: 6, ParentGroup: null, AllowColorize: false } - ] - }, - { - Name: "ArmbinderJacket", Fetish: ["Leather"], Priority: 33, Value: 100, Difficulty: 12, SelfBondage: 8, DefaultColor: ["#B23E46", "#0A0A0A", "Default"], Time: 35, RemoveTime: 25, AllowLock: true, Hide: ["Cloth"], SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], HideItem: ["ClothAccessoryStudentOutfit3Scarf", "ClothAccessoryStudentOutfit3Bow1", "ClothAccessoryStudentOutfit3Bow2", "ClothAccessoryStudentOutfit3Bow3", "ClothAccessoryBunnyCollarCuffs"], Block: ["ItemHands"], SelfUnlock: false, - Alpha: [{Group: ["Cloth", "Necklace", "Suit"], Masks: [[0, 200, 500, 40], [0, 240, 135, 20], [365, 240, 135, 20]]}], - Layer: [ - { Name: "Jacket" }, - { Name: "Straps" }, - { Name: "Rings" }, - ] - }, - { Name: "LeatherCuffs", Fetish: ["Leather"], Priority: 29, Value: 100, Left: 0, Top: 0, Difficulty: 3, Time: 20, Random: false, AllowLock: true, AllowPose: ["BackBoxTie", "BackElbowTouch", "OverTheHead", "BackCuffs", "Yoked", "Hogtied"], Effect: ["CuffedArms"], Extended: true, HasType: false, Hide: ["Bracelet"], RemoveItemOnRemove: [{ Name: "X-Cross", Group: "ItemDevices" }], - DefaultColor: ["#2E2E2E", "Default"], - Layer: [ - { Name: "Cuffs" }, - { Name: "Rings" } - ] - }, - { Name: "CeilingShackles", Fetish: ["Metal"], Value: 100, Left: 0, Top: 0, Difficulty: 6, Audio: "ChainLong", Time: 20, Random: false, AllowLock: true, AllowPose: ["Suspension"], Effect: ["Block", "Prone", "Freeze", "NotSelfPickable"], SetPose: ["Yoked"], Hide: ["Bracelet"], Extended: true, - Layer: [ - { Name: "Chain", Top: -388, Priority: 6 }, - { Name: "Cuffs" } - ] - }, - { Name: "SteelCuffs", Fetish: ["Metal"], Value: 50, Left: 0, Top: 0, Difficulty: 6, Time: 20, Random: false, AllowLock: true, DrawLocks: false, AllowPose: ["OverTheHead", "BackCuffs", "Yoked"], HideForPose: ["BackBoxTie", "BackElbowTouch"], Effect: ["CuffedArms"], Extended: true, HasType: false, RemoveItemOnRemove: [{ Name: "X-Cross", Group: "ItemDevices" }] }, - { Name: "FuturisticCuffs", Category: ["SciFi"], Fetish: ["Metal"], HideForPose: ["Hogtied"], DefaultColor: ["#40812C", "#707070"], Audio: "FuturisticApply", Priority: 29, Value: 100, Left: 0, Top: 0, Difficulty: 5, Time: 20, Random: false, AllowLock: true, DrawLocks: false, - AllowPose: ["BackBoxTie", "BackElbowTouch", "OverTheHead", "BackCuffs", "Yoked"], FuturisticRecolor: true, Effect: [ "CuffedArms"], Extended: true, HasType: false, Hide: ["Bracelet"], RemoveItemOnRemove: [{ Name: "X-Cross", Group: "ItemDevices" }], - Layer: [ - { Name: "Display", ParentGroup: null }, - { Name: "Cuffs" }, - { Name: "Lock", LockLayer: true,AllowColorize: true, HasType: false, ParentGroup: null}, - ], - }, - { - Name: "OrnateCuffs", Fetish: ["Metal"], Priority: 29, Value: 200, Left: 0, Top: 0, Difficulty: 4, Time: 20, Random: false, AllowLock: true, Audio: "CuffsMetal", AllowPose: ["BackBoxTie", "BackElbowTouch", "OverTheHead", "BackCuffs", "Yoked", "Hogtied"], Effect: ["CuffedArms"], Extended: true, HasType: false, Hide: ["Bracelet"], RemoveItemOnRemove: [{ Name: "X-Cross", Group: "ItemDevices" }], - Layer: [ - { Name: "Cuffs" }, - { Name: "Gems" }, - ], - }, - { Name: "MittenChain1", Fetish: ["Metal"], Priority: 33, Value: -1, Difficulty: 5, SelfBondage: 5, Time: 15, Random: false, AllowLock: true, Block: ["ItemHands", "ItemTorso", "ItemTorso2",], SetPose: ["BaseUpper"] }, - { Name: "FourLimbsShackles", Fetish: ["Metal"], Value: -1, Time: 30, Enable: false, SetPose: ["BackBoxTie"], Effect: ["Block", "Prone", "Lock"], RemoveAtLogin: true}, - { Name: "Manacles", Fetish: ["Metal"], Value: 120, Difficulty: 16, Audio: "CuffsMetal", SelfBondage: 1, Time: 30, Random: false, AllowLock: true, Prerequisite: ["NoItemFeet", "NotMounted", "NotSuspended", "NotHogtied", "NotKneelingSpread"], SetPose: ["BackBoxTie", "Kneel"], Effect: ["Block", "Freeze", "Prone", "ForceKneel"], Block: ["ItemFeet"], AllowActivityOn: ["ItemFeet"]}, - { Name: "FullBodyShackles", Fetish: ["Metal"], Value: 150, Difficulty: 18, Random: false, AllowLock: true, Audio: "ChainLong", Prerequisite: ["NoItemFeet", "NotMounted", "NotSuspended", "NotHogtied", "NotKneelingSpread"], AllowPose: ["LegsClosed", "Kneel"], Effect: ["Prone", "Shackled"], Block: ["ItemFeet"], AllowActivityOn: ["ItemFeet"], SetPose: ["BaseUpper"] }, - { - Name: "WristShackles", Fetish: ["Metal"], Top: 0, Value: 80, Difficulty: 6, Time: 20, Random: false, AllowLock: true, Audio: "CuffsMetal", Extended: true, ParentGroup: null, HasType: false, - AllowPose: ["BackCuffs", "OverTheHead"], - Effect: ["Prone"], - SetPose: ["BaseUpper"], - Layer: [ - { Name: "Cuffs" }, - { Name: "Chain" }, - ] - }, - { - Name: "StraitLeotard", Fetish: ["Latex"], Value: 120, Priority: 15, Difficulty: 13, SelfBondage: 7, Time: 35, RemoveTime: 20, AllowLock: true, HasType: false, DefaultColor: "#70C0C0", HideItemExclude: ["CorsetCorset1", "CorsetLatexCorset1"], HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ItemNipplesLactationPump"], SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], Block: ["ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands"], SelfUnlock: false, Extended: true, - Layer: [ - { Name: "Lower" }, - { Name: "Gloves", Priority: 31 }, - { Name: "Upper" }, - ] - }, - { - Name: "FuturisticStraitjacket", Category: ["SciFi"], Fetish: ["Latex"], Value: 100, Priority: 15, Difficulty: 13, SelfBondage: 4, Time: 35, RemoveTime: 15, Audio: "FuturisticApply", AllowLock: true, DrawLocks: false, DefaultColor: ["#528FD1", "#8EADC4", "#A4A4A4", "#93C48C", "Default"], - Hide: ["Cloth", "ItemNipplesPiercings", "ItemVulvaPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemNipples"], - Block: ["ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemHands"], - AllowBlock: ["ItemPelvis", "ItemBreast"], - HideItem: ["ItemButtAnalBeads2"], - SetPose: ["BackElbowTouch"], FuturisticRecolor: true, Effect: [ "Block", "Prone"], SelfUnlock: false, Extended: true, - Layer: [ - { Name: "Lower", AllowColorize: true , HasType: false}, - { Name: "Mesh", AllowColorize: true , HasType: false}, - { Name: "Sides", AllowColorize: true, HasType: false}, - { Name: "Display", AllowColorize: true, HasType: false, ParentGroup: null}, - { Name: "Band", AllowColorize: true, HasType: false}, - { Name: "Lock", LockLayer: true,AllowColorize: true, HasType: false, ParentGroup: null}, - { Name: "GlovesBack", CopyLayerColor: "Lower", HasType: false, Priority: 14, AllowModuleTypes: ["a1"]}, - { Name: "Gloves", CopyLayerColor: "Lower", HasType: false, Priority: 23, AllowModuleTypes: ["a0"]}, - ] - }, - { Name: "StraitJacket", Value: 150, Difficulty: 6, SelfBondage: 8, Time: 35, RemoveTime: 20, AllowLock: true, DefaultColor: "#A0A0A0", Hide: ["Cloth", "ItemNipplesPiercings"], HideItemAttribute: ["Skirt"], HideItem: ["ItemNipplesLactationPump"], SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], Block: ["ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands"], Extended: true, SelfUnlock: false, HasType: false }, - { Name: "CollarCuffs", Fetish: ["Leather"], Value: 60, Difficulty: 6, SelfBondage: 3, Time: 35, RemoveTime: 20, Visible: false, Random: false, AllowLock: true, Prerequisite: "Collared", SetPose: ["BackBoxTie"], Effect: ["Block", "Prone"], Block: ["ItemHands", "ItemNeck"], Extended: true, SelfUnlock: false }, - { Name: "LeatherStraitJacket", Fetish: ["Leather"], Value: 200, Difficulty: 7, SelfBondage: 8, Time: 45, RemoveTime: 30, AllowLock: true, Hide: ["Cloth", "ItemNipplesPiercings"], HideItemAttribute: ["Skirt"], HideItem: ["ItemNipplesLactationPump", "ClothAccessoryPoncho"], SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], Block: ["ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands"], Extended: true, SelfUnlock: false }, - { Name: "FurStraitJacket", Value: 150, Difficulty: 6, SelfBondage: 7, Time: 45, RemoveTime: 30, AllowLock: true, Hide: ["Cloth", "ItemNipplesPiercings"], HideItemAttribute: ["Skirt"], HideItem: ["ItemNipplesLactationPump", "ClothAccessoryPoncho"], SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], Block: ["ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands"], DrawLocks: false, SelfUnlock: false, ParentGroup: null }, - { - Name: "Bolero", Fetish: ["Leather"], Priority: 33, Value: 100, Difficulty: 11, SelfBondage: 7, Time: 35, RemoveTime: 20, AllowLock: true, DefaultColor: ["#E080A0", "Default"], SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], HideItem: ["ClothAccessoryStudentOutfit3Scarf", "ClothAccessoryStudentOutfit3Bow1", "ClothAccessoryStudentOutfit3Bow2", "ClothAccessoryStudentOutfit3Bow3", "ClothAccessoryBunnyCollarCuffs"], Block: ["ItemHands"], - Alpha: [{ Group: ["Cloth", "Necklace", "Suit"], Masks: [[270, 190, 480, 60], [230, 190, -480, 60], [0, 250, 182, 100], [318, 250, 182, 100]] }], - Layer: [ - { Name: "Leather" }, - { Name: "Belts" } - ], - SelfUnlock: false - }, - { Name: "DuctTape", Fetish: ["Tape"], Value: 50, Difficulty: 5, SelfBondage: 4, Time: 20, RemoveTime: 10, BuyGroup: "DuctTape", Audio: "DuctTapeRoll", HideItem: ["ItemNipplesLactationPump"], AllowPose: ["KneelingSpread"], SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], Extended: true }, - { - Name: "BitchSuit", Fetish: ["Latex", "Pet"], Priority: 21, Value: 200, Difficulty: 15, SelfBondage: 8, Time: 40, RemoveTime: 30, Random: false, AllowLock: true, DefaultColor: ["#888888", "Default"], Top: 150, - Prerequisite: ["NotSuspended", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader", "CanKneel"], - Hide: ["Cloth", "ClothLower", "Bra", "Panties", "Shoes", "Socks", "ItemBoots", "ItemNipplesPiercings", "ItemLegs", "ItemFeet", "Corset", "ItemHands", "Hands", "Gloves", "Garters"], - AllowPose: ["BackElbowTouch", "Kneel", "AllFours"], - AllowActivePose: ["BackElbowTouch", "Kneel", "AllFours"], - SetPose: ["BackElbowTouch", "Kneel"], - Effect: ["Block", "Prone", "ForceKneel", "Slow"], - HideItem: ["ItemNipplesLactationPump", "ClothAccessoryPoncho", "NecklaceBodyChainNecklace"], - Block: ["ItemPelvis", "ItemTorso", "ItemTorso2", "ItemHands"], - AllowActivityOn: ["ItemPelvis", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands"], - Extended: true, - DrawLocks: false, - // HasType: true, - Alpha: [{Group: ["BodyLower"], Pose: ["Kneel"], Masks: [[140, 462, 75, 238], [285, 462, 75, 238], [215 ,545, 70, 155]]}], - Layer: [ - { Name: "Latex", }, - { Name: "Straps", HasType: false, AllowPose: ["AllFours"], CopyLayerColor: "Latex", ParentGroup: null, }, - { Name: "Lock", HasType: false, ParentGroup: null, LockLayer: true }, - ], - SelfUnlock: false - }, - { Name: "CollarLeashHolding", Fetish: ["Sadism"], Priority: 36, Value: -1, Difficulty: 1, Time: 3, RemoveTime: 3, Random: false, Prerequisite: ["NotSuspended", "NotHogtied"], SetPose: ["BaseUpper"], Effect: ["Leash"] }, - { - Name: "StraitDress", Fetish: ["Latex"], Value: 200, Difficulty: 15, SelfBondage: 8, Time: 40, RemoveTime: 30, Random: false, AllowLock: true, BuyGroup: "StraitDress", DefaultColor: ["#4040C0", "Default"], - Prerequisite: ["NotSuspended", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader"], - Hide: ["Socks", "BodyLower", "Cloth", "ClothLower", "Bra", "Shoes", "ItemBoots", "ItemNipplesPiercings", "ItemLegs", "Suit", "SuitLower", "Garters"], - HideItem: ["ItemFeetOrnateAnkleCuffs", "ItemFeetNylonRope", "ItemFeetHempRope", "ItemFeetLeatherBelt", "ItemFeetIrish8Cuffs", "ItemFeetDuctTape", "ItemFeetFuturisticAnkleCuffs", "ItemFeetFuturisticAnkleCuffs","ItemNipplesLactationPump", "ItemFeetChains", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "NecklaceBodyChainNecklace"], - AllowPose: ["Kneel"], - SetPose: ["BackElbowTouch", "LegsClosed"], - Effect: ["Block", "Prone", "Slow"], - Block: ["ItemPelvis", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands", "ItemFeet", "ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemLegs", "ItemButt"], - AllowActivePose: ["Kneel"], - Layer: [ - { Name: "Latex" }, - { Name: "Belts" } - ], - SelfUnlock: false - }, - { - Name: "StraitDressOpen", Fetish: ["Latex"], Value: 200, Difficulty: 15, SelfBondage: 8, Time: 40, RemoveTime: 30, Random: false, AllowLock: true, BuyGroup: "StraitDress", DefaultColor: ["#400000", "Default"], - Prerequisite: ["NotSuspended", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader"], - Hide: ["Cloth", "Shoes", "Socks", "ItemBoots", "ItemNipples", "ItemNipplesPiercings", "Suit", "LeftAnklet", "RightAnklet", "Garters"], - HideItem: ["NecklaceBodyChainNecklace"], - AllowPose: ["Kneel"], - SetPose: ["BackElbowTouch", "LegsClosed"], - Effect: ["Block", "Prone", "Slow"], - Block: ["ItemPelvis", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands", "ItemFeet", "ItemNipples", "ItemNipplesPiercings", "ItemLegs"], - AllowActivePose: ["Kneel"], - Alpha: [ - { - Group: ["BodyLower", "ClothLower", "ItemLegs", "ItemFeet", "SuitLower", "Bra", "Panties", "Corset", "ItemTorso", "ItemTorso2",], - Masks: [[0, 220, 500, 242], [0, 462, 210, 120], [290, 462, 210, 120], [0, 582, 500, 418]] - } - ], - Layer: [ - { Name: "Latex" }, - { Name: "Belts" } - ], - SelfUnlock: false - }, - { Name: "SeamlessStraitDress", Fetish: ["Latex"], Value: 200, Difficulty: 15, SelfBondage: 8, Time: 40, RemoveTime: 30, Random: false, AllowLock: true, BuyGroup: "SeamlessStraitDress", DefaultColor: "#4040C0", Prerequisite: ["NotSuspended", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader"], Hide: ["Socks", "BodyLower", "Cloth", "ClothLower", "Bra", "Shoes", "ItemBoots", "ItemNipplesPiercings", "ItemLegs", "Suit", "SuitLower", "Corset", "Garters"], HideItem: ["ItemFeetOrnateAnkleCuffs", "ItemFeetNylonRope", "ItemFeetHempRope", "ItemFeetLeatherBelt", "ItemFeetIrish8Cuffs", "ItemFeetDuctTape", "ItemFeetFuturisticAnkleCuffs", "ItemFeetFuturisticAnkleCuffs","ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "NecklaceBodyChainNecklace"], AllowPose: ["Kneel"], SetPose: ["BackElbowTouch", "LegsClosed"], Effect: ["Block", "Prone", "Slow"], Block: ["ItemPelvis", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands", "ItemFeet", "ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemLegs", "ItemButt"], AllowActivePose: ["Kneel"], SelfUnlock: false }, - { Name: "SeamlessStraitDressOpen", Fetish: ["Latex"], Value: 200, Difficulty: 15, SelfBondage: 8, Time: 40, RemoveTime: 30, Random: false, AllowLock: true, BuyGroup: "SeamlessStraitDress", DefaultColor: "#400000", - Prerequisite: ["NotSuspended", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader"], - Hide: ["Cloth", "Shoes", "Socks", "ItemBoots", "ItemNipples", "ItemNipplesPiercings", "Suit", "LeftAnklet", "RightAnklet", "Garters"], - HideItem: ["NecklaceBodyChainNecklace"], - AllowPose: ["Kneel"], - SetPose: ["BackElbowTouch", "LegsClosed"], - Effect: ["Block", "Prone", "Slow"], - Block: ["ItemPelvis", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands", "ItemFeet", "ItemNipples", "ItemNipplesPiercings", "ItemLegs"], - AllowActivePose: ["Kneel"], SelfUnlock: false, - Alpha: [ - { - Group: ["BodyLower", "ClothLower", "ItemLegs", "ItemFeet", "SuitLower", "Bra", "Panties", "Corset", "ItemTorso", "ItemTorso2",], - Masks: [[0, 220, 500, 242], [0, 462, 210, 120], [290, 462, 210, 120], [0, 582, 500, 418]] - } - ], - }, - { - Name: "Yoke", Fetish: ["Metal", "Leather"], Priority: 39, Value: 80, Difficulty: 10, SelfBondage: 6, Time: 20, AllowLock: true, HideItem: ["BraceletSpikeBands"], ParentGroup: null, - SetPose: ["Yoked"], - Effect: ["Block", "Prone", "NotSelfPickable"], - Layer: [ - { Name: "Straps" }, - { Name: "Bars" }, - ] - }, - { - Name: "Pillory", Fetish: ["Metal"], Priority: 46, Value: -1, Difficulty: 12, SelfBondage: 5, Time: 20, Random: false, AllowLock: true, ParentGroup: null, Bonus: "KidnapDomination", - Prerequisite: ["NotMasked"], - SetPose: ["Yoked"], - Effect: ["Block", "Prone", "NotSelfPickable"], - Layer: [ - { Name: "Wood" }, - { Name: "Metal" }, - ] - }, - { - Name: "FullLatexSuit", Fetish: ["Leather", "Latex"], Value: 200, Difficulty: 15, SelfBondage: 8, Time: 40, RemoveTime: 30, Random: false, AllowLock: true, DefaultColor: "#888888", Prerequisite: ["NotSuspended", "NotKneeling", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader", "NotShackled", "CannotBeSuited"], - Hide: ["Socks", "Cloth", "ClothLower", "Bra", "Shoes", "ItemBoots", "ItemLegs", "ItemFeet", "Suit", "SuitLower", "Corset", "Panties", "Garters"], - HideItem: ["ItemNipplesLactationPump"], - SetPose: ["BackElbowTouch", "LegsClosed"], - Effect: ["Block", "Prone", "Freeze", "BlockKneel", "Slow"], - AllowBlock: ["ItemBreast", "ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt"], - AllowEffect: ["Egged", "Vibrating"], - AllowType: ["", "UnZip"], - Block: ["ItemBoots", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemHands", "ItemLegs", "ItemFeet"], - Extended: true, - Layer: [ - { - Name: "Latex", AllowTypes: ["", "Base"], HasType: false, - Alpha: [{Group: ["BodyLower"], Masks: [[100, 546, 300, 440], [150, 462, 70, 98], [280, 462, 70, 98]]}], - }, - { - Name: "UnZip", CopyLayerColor: "Latex", AllowTypes: ["UnZip", "Base"], HasType: false, - Alpha: [{Group: ["BodyLower"], Masks: [[100, 546, 300, 440], [150, 462, 70, 98], [280, 462, 70, 98]]}], - }, - { Name: "Base", AllowTypes: ["", "Base", "UnZip", "Latex"], HasType: false } - ], - RemoveItemOnRemove: [{ Name: "FullLatexSuitWand", Group: "ItemVulva" }], - }, - { Name: "Zipties", Value: 20, Difficulty: 6, SelfBondage: 1, RemoveTime: 6, BuyGroup: "Zipties", Audio: "ZipTie", SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], Extended: true }, - { - Name: "BoxTieArmbinder", Fetish: ["Latex"], DefaultColor: ["#222222", "#ffffff"], Value: 140, Difficulty: 11, SelfBondage: 7, Time: 40, RemoveTime: 30, AllowLock: true, SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], HideItem: ["ClothAccessoryStudentOutfit3Scarf", "ClothAccessoryStudentOutfit3Bow1", "ClothAccessoryStudentOutfit3Bow2", "ClothAccessoryStudentOutfit3Bow3", "ClothAccessoryBunnyCollarCuffs", "ClothAccessoryPoncho"], Block: ["ItemHands"], SelfUnlock: false, - Alpha: [{Group: ["Cloth", "Necklace", "Suit"], Masks: [[0, 190, 500, 60], [0, 250, 175, 90], [325, 250, 175, 90]]},], - Layer: [ - { Name: "Base" }, - { Name: "Shine" } - ] - }, - { - Name: "BondageBouquet", Fetish: ["Metal"], Priority: 47, Value: 40, Difficulty: 3, Time: 15, Random: false, AllowLock: true, Audio: "CuffsMetal", BuyGroup: "Bouquet", Effect: ["Prone"], SetPose: ["BaseUpper"], - Layer: [ - { Name: "Base" }, - { Name: "Flowers" } - ] - }, - { - Name: "Chains", Fetish: ["Metal"], Value: 90, Difficulty: 5, SelfBondage: 3, Time: 30, AllowLock: true, BuyGroup: "Chains", Audio: "ChainLong", Extended: true, - SetPose: ["BackBoxTie"], - Effect: ["Block", "Prone"], - Layer: [ - { Name: "" }, - { Name: "Suspension", Top: -687, Left: 0, HasType: false, Priority: 31, ParentGroup: "", AllowTypes: ["SuspensionHogtied"], AllowPose: [] }, - ] - }, - { Name: "ChainLeashHolding", Fetish: ["Sadism"], Priority: 36, Value: -1, Difficulty: 1, Time: 3, RemoveTime: 3, Random: false, Prerequisite: ["NotSuspended", "NotHogtied"], SetPose: ["BaseUpper"], Effect: ["Leash"] }, - { - Name: "PetCrawler", Priority: 36, Value: 80, Difficulty: 10, SelfBondage: 7, Time: 20, Random: false, AllowLock: true, Prerequisite: ["NoItemFeet", "NoItemLegs", "LegsOpen", "NotMounted", "NotHorse", "NotSuspended", "NotYoked", "NotKneelingSpread", "NoFeetSpreader"], Hide: ["ItemBoots", "Suit", "Panties", "Bra"], - HideItem: ["ItemButtRaccoonTailPlug", "TailStrapsRaccoonTailStrap", "ItemButtKittenTail1", "ItemNipplesPiercingsNippleChastityPiercing2", "ItemTorsoAdultBabyHarness", "ItemTorsoCorset2", "ItemTorsoCorset3", "ItemNipplesPiercingsNippleChastityPiercing1", "ItemNipplesChainTassles", "ItemNipplesHeartPasties", "ItemNipplesNippleTape", "ItemNipplesKittyPasties"], - SetPose: ["AllFours"], - Effect: ["Block", "Prone", "ForceKneel"], - Block: ["ItemLegs", "ItemFeet", "ItemDevices"], - AllowActivityOn: ["ItemLegs", "ItemFeet"] - }, - { - Name: "MermaidSuit", Fetish: ["Latex", "Pet"], Value: 200, Difficulty: 15, SelfBondage: 6, Time: 40, RemoveTime: 30, Random: false, AllowLock: true, DefaultColor: "#400000", Prerequisite: ["NotSuspended", "NotKneeling", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader", "NotShackled", "CannotBeSuited"], - Hide: ["Socks", "Cloth", "ClothLower", "Bra", "Shoes", "ItemBoots", "ItemLegs", "Suit", "SuitLower", "ItemPelvis", "ItemFeet", "Panties", "Corset", "Garters"], - HideItem: ["ItemNipplesLactationPump", "ClothAccessoryPoncho"], - SetPose: ["BackElbowTouch", "LegsClosed"], - Effect: ["Block", "Prone", "Freeze", "BlockKneel"], - Block: ["ItemBoots", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemHands", "ItemLegs", "ItemFeet"], - Extended: true, - Layer: [ - { - Name: "Latex", AllowTypes: [""], HasType: false, - Alpha: [{Group: ["BodyLower"], Masks: [[100, 546, 300, 440], [150, 462, 70, 98], [280, 462, 70, 98]]}], - }, - { - Name: "UnZip", CopyLayerColor: "Latex", AllowTypes: ["UnZip"], HasType: false, - Alpha: [{Group: ["BodyLower"], Masks: [[100, 546, 300, 440], [150, 462, 70, 98], [280, 462, 70, 98]]}], - }, - ], - }, - { - Name: "Web", Category: ["Fantasy"], Fetish: ["Tape"], Priority: 35, Value: 150, Difficulty: 4, SelfBondage: 2, Time: 20, RemoveTime: 30, Random: false, Left: 0, Top: 0, - Prerequisite: ["NotKneelingSpread", "NotMounted"], - Hide: ["Cloth", "ClothLower", "Shoes"], - HideItem: ["ItemNipplesLactationPump", "ClothAccessoryPoncho"], - AllowPose: ["Kneel", "Hogtied", "Suspension"], - SetPose: ["LegsOpen", "BackElbowTouch"], - Effect: ["Block", "Freeze", "Prone"], - Block: ["ItemTorso", "ItemTorso2", "ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - Extended: true, - }, - { - Name: "LatexArmbinder", Fetish: ["Latex"], Priority: 6, Value: 60, Difficulty: 10, SelfBondage: 7, Time: 25, RemoveTime: 10, AllowLock: true, SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], Block: ["ItemHands"], SelfUnlock: false, - Layer: [ - { Name: "Latex" }, - { Name: "Strap1", ColorGroup: "BottomStrap" }, - { Name: "Strap2", ColorGroup: "TopStrap" }, - { Name: "Hole2", ColorGroup: "TopStrap" }, - { Name: "Buckle2", ColorGroup: "TopStrap" }, - { Name: "Buckle1" ,ColorGroup: "BottomStrap" }, - { Name: "Hole1", ColorGroup: "BottomStrap" }, - { Name: "Laces"} - ] - }, - { - Name: "FuturisticArmbinder", Category: ["SciFi"], Fetish: ["Metal"], Random: false, Priority: 31, Value: 80, Difficulty: 10, Left: 0, Top: 0, SelfBondage: 6, Time: 20, RemoveTime: 15, Audio: "FuturisticApply", AllowLock: true, DrawLocks: false, - DefaultColor: ["#40812C", "#555555", "#777777", "Default",], SetPose: ["BackElbowTouch"], FuturisticRecolor: true, - Effect: [ "Block", "Prone"], Block: ["ItemHands"], SelfUnlock: false, Extended: true, - Layer: [ - { Name: "Display" , ParentGroup: null, HasType: false, Priority: 31, Left: 0, Top: 0 }, - { Name: "Binder" , ParentGroup: null, AllowTypes: [""], Priority: 6, Left: 50, Top: 200 }, - { Name: "Band" , ParentGroup: null, AllowTypes: [""], Priority: 6, Left: 50, Top: 200 }, - { Name: "Straps", Priority: 31, HasType: false, Left: 0, Top: 0, }, - { Name: "Lock", LockLayer: true,AllowColorize: true, Priority: 31, ParentGroup: null}, - ] - }, - { Name: "SeamlessLatexArmbinder", Fetish: ["Latex"], Priority: 6, Value: 60, Difficulty: 10, SelfBondage: 7, Time: 25, RemoveTime: 10, AllowLock: true, SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], Block: ["ItemHands"], SelfUnlock: false }, - { - Name: "FullBodyLeatherHarness", Fetish: ["Leather"], Priority: 29, Value: 60, Difficulty: 14, SelfBondage: 6, Time: 20, RemoveTime: 15, AllowLock: true, SetPose: ["BackElbowTouch", "LegsClosed"], AllowPose: ["Kneel"], Prerequisite: ["NotSuspended", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader", "NotShackled"], Effect: ["Block", "Prone", "Slow"], SelfUnlock: false, - HideItem: ["ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerWaspie1", "ClothLowerWaspie2", "ClothLowerWaspie3", "ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerClothSkirt1", "ClothLowerChineseSkirt1", "ClothLowerGown2Skirt", "ClothLowerAdmiralSkirt", "ClothLowerJeanSkirt", "ClothLowerPencilSkirt", "ClothLowerPajama1", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothLowerTutu"], AllowActivePose: ["Kneel"] - }, - { Name: "UnderBedBondageCuffs", Fetish: ["Leather"], Value: -1, Difficulty: 9, SelfBondage: 3, Random: false, IsRestraint: true, SetPose: ["Yoked", "LegsOpen"], Prerequisite: ["OnBed", "LegsOpen"], Effect: ["Block", "Prone", "Freeze", "BlockKneel"], Block: ["ItemDevices", "ItemLegs", "ItemFeet", "ItemBoots"], AllowActivityOn: ["ItemLegs", "ItemFeet", "ItemBoots"], AllowLock: true, BuyGroup: "Bed", Left: 0, Top: -250 }, - { - Name: "TightJacket", Fetish: ["Leather"], DefaultColor: "#FFFFFF", Value: 150, Difficulty: 6, SelfBondage: 8, Time: 35, RemoveTime: 20, AllowLock: true, BuyGroup: "TightJacket", SelfUnlock: false, Extended: true, - Hide: ["Cloth", "ItemNipplesPiercings"], - HideItem: ["ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerGown2Skirt", "ClothLowerWaspie1", "ClothLowerWaspie2", "ClothLowerWaspie3", "ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerClothSkirt1", "ClothLowerChineseSkirt1", "ClothLowerAdmiralSkirt", "ClothLowerJeanSkirt", "ClothLowerPencilSkirt", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothLowerTutu", "ClothAccessoryPoncho"], - SetPose: ["BackElbowTouch"], - Effect: ["Block", "Prone"], - Block: ["ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands"], - }, - { Name: "LatexSleevelessLeotard", Fetish: ["Latex"], Value: 120, Priority: 23, Difficulty: 14, SelfBondage: 7, Time: 35, RemoveTime: 20, AllowLock: true, DefaultColor: "#d986a2", BuyGroup: "LatexSleevelessLeotard", Extended: true, SelfUnlock: false, - Hide: ["Cloth", "ItemNipplesPiercings", "ItemVulvaPiercings", "Corset"], - HideItemExclude: ["CorsetCorset1", "CorsetLatexCorset1"], - HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ClothAccessoryPoncho", "NecklaceBodyChainNecklace"], - SetPose: ["BackElbowTouch"], - Effect: ["Block", "Prone"], - Block: ["ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands"], - Layer: [ - { Name: "Latex", AllowColorize: true, AllowTypes: ["", "Polished"], HasType: false }, - { Name: "Highlights", AllowColorize: false, AllowTypes: ["", "Polished"] } - ] - }, - { - Name: "LatexBoxtieLeotard", Fetish: ["Latex"], Value: 120, Priority: 23, Difficulty: 14, SelfBondage: 7, Time: 35, RemoveTime: 20, AllowLock: true, DefaultColor: "#185d97", BuyGroup: "LatexSleevelessLeotard", Extended: true, SelfUnlock: false, - Hide: ["Cloth", "ItemNipplesPiercings", "ItemVulvaPiercings", "Corset"], - HideItemExclude: ["CorsetCorset1", "CorsetLatexCorset1"], - HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "ClothAccessoryPoncho", "NecklaceBodyChainNecklace"], - SetPose: ["BackElbowTouch"], - Effect: ["Block", "Prone"], - Block: ["ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands"], - Layer: [ - { Name: "Latex", AllowColorize: true, AllowTypes: ["", "Polished"], HasType: false }, - { Name: "Highlights", AllowColorize: false, AllowTypes: ["", "Polished"] } - ] - }, - { - Name: "LatexButterflyLeotard", Fetish: ["Latex"], Value: 150, Priority: 23, Difficulty: 14, SelfBondage: 7, Time: 35, RemoveTime: 20, AllowLock: true, DefaultColor: "#580505", Extended: true, SelfUnlock: false, - Hide: ["Cloth", "Bra", "ItemNipplesPiercings", "ItemVulvaPiercings", "Corset"], - HideItemExclude: ["CorsetCorset1", "CorsetLatexCorset1"], - HideItem: ["ItemButtAnalBeads2", "ItemVulvaVibratingDildo", "ItemVulvaInflatableVibeDildo", "ItemVulvaClitSuctionCup", "NecklaceBodyChainNecklace"], - SetPose: ["BackElbowTouch"], - Effect: ["Block", "Prone"], - Block: ["ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands"], - Layer: [ - { Name: "Latex", AllowColorize: true, AllowTypes: ["", "Polished"], HasType: false }, - { Name: "Highlights", AllowColorize: false, AllowTypes: ["", "Polished"] } - ] - }, - { - Name: "PrisonLockdownSuit", Value: 125, Difficulty: 7, SelfBondage: 7, Time: 50, RemoveTime: 30, Random: false, AllowLock: true, BuyGroup: "PrisonLockdownSuit", DefaultColor: ["#ab5207", "Default"], Hide: ["BodyUpper", "BodyLower", "Cloth", "ClothLower", "Shoes", "Socks", "ItemLegs", "ItemFeet", "ItemPelvis", "ItemBoots", "SuitLower", "Panties", "ItemVulva", "ItemVulvaPiercings", "Garters"], HideItem: ["ItemButtAnalBeads2", "ClothAccessoryPoncho"], SetPose: ["LegsClosed", "BackElbowTouch"], Prerequisite: ["NotSuspended", "NotKneeling", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader", "NotShackled"], Effect: ["Block", "Prone", "Slow", "BlockKneel"], AllowEffect: ["Freeze"], AllowType: ["Ankles", "Thighs", "Full"], Block: ["ItemBreast", "ItemNipplesPiercings", "ItemNipples", "ItemTorso", "ItemTorso2", "ItemPelvis", "ItemHands", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemLegs", "ItemFeet", "ItemBoots"], Extended: true, SelfUnlock: false, Layer: [ - { Name: "Suit", AllowTypes: ["", "Ankles", "Thighs", "Full"] }, - { Name: "Belts", AllowTypes: ["", "Ankles", "Thighs", "Full"] }, - ], - Alpha: [{ Group: ["ItemNeck"], Masks: [[0, 213, 500, 60]] }] - }, - { Name: "LeatherArmSplints", Value: 65, Fetish: ["Leather"], Difficulty: 7, SelfBondage: 7, Time: 15, RemoveTime: 10, Visible: false, AllowLock: true, SetPose: ["BackElbowTouch"], Effect: ["Block", "Prone"], SelfUnlock: false }, - { - Name: "TightJacketCrotch", Fetish: ["Leather"], DefaultColor: "#FFFFFF", Value: 150, Difficulty: 6, SelfBondage: 8, Time: 35, RemoveTime: 20, AllowLock: true, BuyGroup: "TightJacket", SelfUnlock: false, Extended: true, - Hide: ["Cloth", "ItemNipplesPiercings"], - HideItem: ["ClothLowerSkirt1", "ClothLowerSkirt2", "ClothLowerSkirt3", "ClothLowerTennisSkirt1", "ClothLowerGown2Skirt", "ClothLowerWaspie1", "ClothLowerWaspie2", "ClothLowerWaspie3", "ClothLowerLatexSkirt1", "ClothLowerLatexSkirt2", "ClothLowerTutu", "ClothLowerClothSkirt1", "ClothLowerChineseSkirt1", "ClothLowerAdmiralSkirt", "ClothLowerJeanSkirt", "ClothLowerPencilSkirt", "ClothAccessoryPoncho"], - SetPose: ["BackElbowTouch"], - Effect: ["Block", "Prone"], - Block: ["ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands", "ItemVulva", "ItemButt", "ItemVulvaPiercings"], - }, - { Name: "HighSecurityStraitJacket", Value: 220, Priority: 25, Difficulty: 4, SelfBondage: 2, Time: 45, RemoveTime: 30, Random: false, AllowLock: true, DrawLocks: false, DefaultColor: ["#333", "#333", "#3e3e3e", "#3e3e3e"], - Hide: ["Cloth", "ItemNipplesPiercings"], - HideItem: ["NecklaceBodyChainNecklace"], - SetPose: ["BackElbowTouch"], - Effect: ["Block", "Prone"], - Block: ["ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands"], - Extended: true, - Layer: [ - { Name: "Crotch", ColorGroup: "Canvas", ParentGroup: null, AllowModuleTypes: ["c1"], HasType: false }, - { Name: "JacketLoose", ColorGroup: "Canvas", ParentGroup: null, AllowModuleTypes: ["a0"], HasType: false}, - { Name: "JacketFront", CopyLayerColor: "JacketLoose", AllowModuleTypes: ["a1"], HasType: false }, - { Name: "JacketBack", CopyLayerColor: "JacketLoose", AllowModuleTypes: ["a2"], HasType: false }, - { Name: "StrapsLoose", ColorGroup: "Straps", AllowModuleTypes: ["a0"], HasType: false}, - { Name: "StrapsFront", CopyLayerColor: "StrapsLoose", AllowModuleTypes: ["a1"], HasType: false }, - { Name: "StrapsBack", CopyLayerColor: "StrapsLoose", AllowModuleTypes: ["a2"], HasType: false }, - { Name: "CrotchStrapsSingle", ColorGroup: "Straps", ParentGroup: null, AllowModuleTypes: ["s1"], HasType: false }, - { Name: "CrotchStrapsDouble", CopyLayerColor: "CrotchStrapsSingle", ParentGroup: null, AllowModuleTypes: ["s2"], HasType: false }, - { Name: "CrotchStrapsTriple", CopyLayerColor: "CrotchStrapsSingle", ParentGroup: null, AllowModuleTypes: ["s3"], HasType: false }, - { Name: "Lock", AllowColorize: false, ParentGroup: null, AllowModuleTypes: ["s1", "s2", "s3", "a2"], LockLayer: true } - ], - SelfUnlock: false - }, - { Name: "PantyhoseBody", Fetish: ["Nylon"], Value: 75, Priority: 15, Difficulty: 3, SelfBondage: 4, Time: 30, RemoveTime: 20, Random: false, BuyGroup: "PantyhoseBody", AllowPose: ["Kneel"], SetPose: ["BackElbowTouch", "LegsClosed"], Effect: ["Block", "Prone", "Slow"], - Prerequisite: ["NotHogtied", "NotMounted", "NoFeetSpreader"], Hide: ["Cloth", "ClothLower", "Suit", "SuitLower", "Garters"], - Block: ["ItemHands", "ItemVulva", "ItemButt", "ItemVulvaPiercings", "ItemNipplesPiercings"], AllowActivePose: ["Kneel"], Audio: "ClothSlip" }, - { Name: "PantyhoseBodyOpen", Fetish: ["Nylon"], Value: 75, Priority: 15, Difficulty: 3, SelfBondage: 4, Time: 30, RemoveTime: 20, Random: false, BuyGroup: "PantyhoseBody", AllowPose: ["Kneel"], SetPose: ["BackElbowTouch", "LegsClosed"], Effect: ["Block", "Prone", "Slow"], - Prerequisite: ["NotHogtied", "NotMounted", "NoFeetSpreader"], Hide: ["Cloth", "ClothLower", "Suit", "SuitLower", "Garters"], Block: ["ItemHands", "ItemNipplesPiercings"], AllowActivePose: ["Kneel"], Audio: "ClothSlip" }, - { - Name: "WoodenCuffs", Value: 30, Top: 0 ,Left: 0, Difficulty: 2, Time: 5, Random: false, AllowLock: true, Audio: "WoodenCuffs", BuyGroup: "WoodenCuffs", Effect: ["Block", "Prone"], AllowPose: ["Yoked", "BackCuffs","Hogtied"], HideItem: ["ClothFurCoat"], Extended: true, HasType: false, - Layer:[ - { Name: "", Priority: 50, HasType: false, AllowColorize: true }, - { Name: "bgnd", Priority: 1, HasType: false, AllowColorize: false, CopyLayerColor: "", AllowTypes: ["Hogtied"] }, - ] - }, - { - Name: "InflatableStraightLeotard", ParentGroup: null, Fetish: ["Latex"], Value: 150, Top: 137 ,Left: 3, Difficulty: 10, SelfBondage: 6, Time: 30, RemoveTime: 50, AllowLock: true, Prerequisite: ["NotSuspended", "AllFours", "NotHogtied", "NotYoked", "NotMounted", "NotKneelingSpread"], - Hide: ["Cloth", "Suit", "ClothLower", "ClothAccessory", "ItemButt", "TailStraps", "Wings", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2",], - HideItem: ["ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - SetPose: ["BackElbowTouch"], - Effect: ["Block", "Prone"], - Block: ["ItemBreast", "ItemButt", "ItemHands", "ItemNipples", "ItemNipplesPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], SelfUnlock: false, Extended:true - }, - { Name: "StrictLeatherPetCrawler", ParentGroup: null, Fetish: ["Leather", "Pet"], Value: 150, Difficulty: 15, SelfBondage: 8, Time: 40, RemoveTime: 30, Random: false, AllowLock: true, DrawLocks: false, - Prerequisite: ["NotSuspended", "NotHogtied", "NotMounted", "NoFeetSpreader", "CanKneel"], - Hide: ["Cloth", "ClothLower","Shoes", "ItemBoots", "ItemLegs", "ItemFeet"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "GartersTentacles", "ClothAccessoryPoncho"], - AllowPose: ["BackElbowTouch", "Kneel", "KneelingSpread", "AllFours"], - AllowActivePose: ["BackElbowTouch", "Kneel", "KneelingSpread", "AllFours"], - SetPose: ["BackElbowTouch", "Kneel"], - Effect: ["Block", "Prone", "ForceKneel"], - Block: ["ItemHands"], - SelfUnlock: false, - DefaultColor: ["#888888", "Default"], - Layer:[ - { Name: "Arms", AllowPose: ["BackElbowTouch", "AllFours"], AllowColorize: true, ParentGroup: "BodyUpper", }, - { Name: "Legs", AllowPose: ["Kneel", "KneelingSpread"], HideForPose: ["AllFours"], CopyLayerColor: "Arms", ParentGroup: "BodyLower", }, - { Name: "ArmsLock", AllowPose: ["BackElbowTouch", "AllFours"], AllowColorize: true, HideColoring: true, LockLayer: true, }, - { Name: "LegsLock", AllowPose: ["Kneel", "KneelingSpread"], HideForPose: ["AllFours"], CopyLayerColor: "ArmsLock", LockLayer: true, ParentGroup: null, } - ] - }, - { - Name: "MedicalBedRestraints", Value: -1, Priority: 39, Difficulty: 5, Time: 5, RemoveTime: 5, Random: false, DefaultColor: "#ccc", AllowLock: true, Left: 0, BuyGroup: "MedicalBedRestraints", - Prerequisite: ["OnBed"], SetPose: ["Yoked"], Effect: ["Block", "Prone"], Block: ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemDevices"], AvailableLocations: ["Asylum"], Hide: ["Cloth", "ClothLower", "ItemVulva", "ItemVulvaPiercings"], HideItem: ["ItemButtAnalBeads2"], - HideItemExclude: ["ClothBondageBustier1", "ClothBondageBustier2", "ClothLowerLatexSkirt1", "ClothCorsetShirt", "ClothGown2Top", "ClothLeatherBolero", "ClothLeatherCorsetTop1", "CorsetLeatherCorsetTop1", "ClothLeatherCropTop", "ClothMistressTop", "ClothReverseBunnySuit", "ClothShoulderlessTop", "ClothComfyTop", "ClothSleevelessTop", "ClothStudentOutfit3", "ClothSuspenderTop1", "ClothSweater1", "ClothTShirt1", "ClothTennisShirt1", "ClothBodyTowel1", "ClothVirginKiller1", "ClothLowerLeggings1", "ClothLowerLeggings2", "ClothLowerMistressBottom", "ItemVulvaLoversVibrator", "ItemVulvaFuturisticVibrator", "ItemVulvaTapeStrips", "ItemVulvaVibratingLatexPanties"], - Layer: [ - { Name: "Base", Priority: 2, ParentGroup: null }, - { Name: "Straps"} - ], - }, - { - Name: "TransportJacket", Value: 100, Difficulty: 7, Time: 25, RemoveTime: 15, AllowLock: true, DrawLocks: false, Left: 100, AllowPose: ["Kneel", "LegsClosed", "KneelingSpread", "Spread"], SetPose: ["BackElbowTouch"], Extended: true, DynamicAfterDraw: true, - DefaultColor: ["#888", "#801612", "#888", "#eee", "#801612", "#888"], - AllowType: ["Shorts", "ShortsAndStraps"], - Effect: ["Block", "Prone"], - Hide: ["Cloth", "ClothLower", "ItemNipplesPiercings"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper", "ClothAccessoryPoncho"], - HideItemExclude: ["ClothLowerJeans1", "ClothLowerJeans2", "ClothLowerJeansShorts", "ClothLowerLatexPants1", "ClothLowerLeggings1", "ClothLowerLeggings2", "ClothLowerMistressBottom"], - Block: ["ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands", "ItemPelvis"], - AllowBlock: ["ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis"], - Layer: [ - { Name: "Shorts", ColorGroup: "Canvas", ParentGroup: "BodyLower", AllowTypes: ["Shorts", "ShortsAndStraps"], HasType: false, HideForPose: ["KneelingSpread", "Spread"] }, - { Name: "StripesLegs", ColorGroup: "Stripes", ParentGroup: null, AllowTypes: ["Shorts", "ShortsAndStraps"], HasType: false, HideForPose: ["KneelingSpread", "Spread"] }, - { Name: "Jacket", ColorGroup: "Canvas", ParentGroup: null, HasType: false, AllowPose: [] }, - { Name: "Text", HasImage: false }, - { Name: "Stripes", ColorGroup: "Stripes", ParentGroup: null, HasType: false, AllowPose: [] }, - { Name: "CrotchStraps", CopyLayerColor: "Straps", ParentGroup: null, HasType: false, AllowPose: ["KneelingSpread", "Spread"], HideForPose: ["KneelingSpread", "Spread"] }, - { Name: "Straps", ParentGroup: null, HasType: false, AllowPose: [] }, - { Name: "StrapsLegs", CopyLayerColor: "Straps", ParentGroup: "BodyLower", AllowTypes: ["ShortsAndStraps"], HasType: false, HideForPose: ["KneelingSpread", "Spread"] }, - ], - }, - { Name: "PlasticWrap", Value: 100, Difficulty: 7, SelfBondage: 3, Time: 30, RemoveTime: 25, BuyGroup: "PlasticWrap", SetPose: ["BackElbowTouch", "LegsClosed"], Block:["ItemBreast","ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemTorso2",], Hide: ["Cloth", "ClothAccessory"], HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], Effect: ["Block", "Prone"]}, - { Name: "WrappedBlanket", Extended: true, Value: -1, Difficulty: 15, SelfBondage: 3, Time: 40, RemoveTime: 30, Random: false, BuyGroup: "Bed", Prerequisite: ["NotSuspended", "NotHogtied", "NotKneelingSpread", "NoFeetSpreader"], Hide: ["Shoes", "Socks", "Cloth", "ClothLower", "Bra", "ItemNipplesPiercings", "ItemLegs", "Garters"], HideItem: ["ItemFeetOrnateAnkleCuffs", "ItemFeetNylonRope", "ItemFeetHempRope", "ItemFeetLeatherBelt", "ItemFeetIrish8Cuffs", "ItemFeetDuctTape", "ItemFeetLeatherAnkleCuffs", "ItemNipplesLactationPump", "PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], AllowPose: ["Kneel"], SetPose: ["BackElbowTouch", "LegsClosed"], Effect: ["Block", "Prone"], Block: ["ItemPelvis", "ItemTorso", "ItemTorso2", "ItemBreast", "ItemHands", "ItemFeet", "ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemLegs", "ItemButt"], }, - { Name: "Ribbons", Priority: 29, Fetish: ["Lingerie"], Value: 30, Difficulty: 2, SelfBondage: 2, Time: 20, RemoveTime: 20, BuyGroup: "Ribbon", Random: false, SetPose: ["BackBoxTie"], Extended: true, Effect: ["Block", "Prone"] }, - { Name: "ThinLeatherStraps", Fetish: ["Leather"], Value: 70, Difficulty: 2, SelfBondage: 2, Time: 20, RemoveTime: 20, BuyGroup: "ThinLeatherStraps", SetPose: ["BackBoxTie"], AllowLock: true, DrawLocks: false, Extended: true, Effect: ["Block", "Prone"], - Layer: [ - { Name: "Strap" }, - { Name: "Buckle" }, - { Name: "Locks", LockLayer: true, HideForPose: ["Hogtied"] } - ] - }, - { - Name: "Tentacles", Category: ["Fantasy"], BuyGroup: "Tentacles", Random: false, Value: 250, Difficulty: 8, Time: 25, RemoveTime: 25, Top: -135, Left: 0, Extended: true, - SetPose: ["BackElbowTouch"], - AllowPose: ["OverTheHead"], - HideForPose: ["Hogtied", "AllFours"], - Effect: ["Block", "Prone"], - DefaultColor: ["#c43ba4", "#b832b6", "#9221ba"], - Layer: [ - { Name: "Inner", HasType: false }, - { Name: "Sucker", ParentGroup: null, HasType: false }, - { Name: "Outer", HasType: false }, - { Name: "Shine", ParentGroup: null, AllowColorize: false, HasType: false }, - ], - }, - { - Name: "Slime", Category: ["Fantasy"], BuyGroup: "Slime", DefaultColor: ["#57ab5e", "#57ab5e", "#57ab5e"], Random: false, Value: 200, Difficulty: 6, Time: 30, RemoveTime: 50, ParentGroup: null, Extended: true, - SetPose: ["BackElbowTouch"], - AllowPose : ["Hogtied"], - Effect: ["Block", "Prone"], - Block: ["ItemHands", "ItemBreast", "ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemTorso2",], - Layer: [ - { Name: "BaseOne", AllowModuleTypes: ["p0"], HasType: false }, - { Name: "BaseTwo", AllowModuleTypes: ["p0"], HasType: false }, - { Name: "BaseOneHogtied", CopyLayerColor: "BaseOne", AllowModuleTypes: ["p1"], HasType: false, Priority: 46, Top: 0 }, - { Name: "BaseTwoHogtied", CopyLayerColor: "BaseTwo", AllowModuleTypes: ["p1"], HasType: false, Priority: 46, Top: 0 }, - { Name: "GirlBack", AllowModuleTypes: ["p0t1"], HasType: false, Priority: 4, Top: 0 }, - { Name: "GirlFront", CopyLayerColor: "GirlBack", AllowModuleTypes: ["p0t1"], HasType: false, Priority: 50, Top: 0 }, - { Name: "GirlFrontHogtied", CopyLayerColor: "GirlBack", AllowModuleTypes: ["p1t1"], HasType: false, Priority: 55, Top: -150 }, - { Name: "GirlFeatures", AllowModuleTypes: ["p0t1"], AllowColorize: false, HasType: false, Priority: 50, Top: 0 }, - { Name: "GirlFeaturesHogtied", AllowModuleTypes: ["p1t1"], AllowColorize: false, HasType: false, Priority: 55, Top: -150 }, - ], - HideItem: ["ClothFuzzyDress", "ClothAdultBabyDress1", "ClothAdultBabyDress4", "ClothGown3", "ClothTeacherOutfit1"] - }, - { - Name: "BondageBra", Fetish: ["Lingerie"], Priority: 20, Value: 40, Time: 20, RemoveTime: 10, Difficulty: 2, SelfBondage: 1, Left: 150, - SetPose: ["BackElbowTouch"], - Effect: ["Block", "Prone"], - Block: ["ItemHands"], - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"], - }, - - { - Group: "ItemHands", - ParentGroup: "BodyUpper", - Category: "Item", - Priority: 35, - Default: false, - IsRestraint: true, - Zone: [[10, 400, 90, 200], [400, 400, 90, 200]], - Asset: [ - { Name: "PaddedMittens", Fetish: ["ABDL"], Value: 40, Difficulty: 4, SelfBondage: 2, Time: 15, AllowLock: true, DefaultColor: "#bbbbbb", AllowPose: ["OverTheHead", "BackBoxTie", "BackElbowTouch", "BackCuffs", "Yoked", "AllFours"], Effect: ["Block", "Prone"], HideItem: ["BraceletSpikeBands"], Extended: true, - Layer: [ - { Name: "Gloves", AllowColorize: true}, - { Name: "Straps", AllowColorize: true}, - { Name: "Buckles", AllowColorize: true}, - ] - }, - { Name: "PawMittens", Fetish: ["ABDL", "Pet"], Value: 50, Difficulty: 4, SelfBondage: 1, Time: 15, AllowLock: true, DefaultColor: ["#bbbbbb","#bbbbbb","#bbbbbb","#B38295"], AllowPose: ["OverTheHead", "BackBoxTie", "BackElbowTouch", "BackCuffs", "Yoked", "AllFours"], Effect: ["Block", "Prone"], HideItem: ["BraceletSpikeBands"], Extended: true, - Layer: [ - { Name: "Gloves", AllowColorize: true}, - { Name: "Straps", AllowColorize: true}, - { Name: "Buckles", AllowColorize: true}, - { Name: "Paws", AllowColorize: true}, - ] - }, - { Name: "LeatherMittens", Fetish: ["Leather"], Value: 60, Difficulty: 5, SelfBondage: 4, Time: 15, RemoveTime: 5, AllowLock: true, AllowPose: ["OverTheHead", "BackBoxTie", "BackElbowTouch", "BackCuffs", "Yoked", "AllFours"], SetPose: ["TapedHands"], Effect: ["Block", "Prone"] }, - { Name: "FuturisticMittens", Fetish: ["Metal"], Category: ["SciFi"], Value: 70, Difficulty: 5, SelfBondage: 0, Time: 5, RemoveTime: 5, Audio: "FuturisticApply", Random: false, AllowLock: true, DrawLocks: false, - DefaultColor: ["#93C48C", "#3B7F2C", "Default"], AllowPose: ["OverTheHead", "BackBoxTie", "BackElbowTouch", "BackCuffs", "Yoked", "AllFours"], SetPose: ["TapedHands"], FuturisticRecolor: true, - Effect: ["UseRemote"], SelfUnlock: false, Extended: true, - Layer: [ - { Name: "Mesh", ParentGroup: null}, - { Name: "Display", ParentGroup: null}, - { Name: "Body", ParentGroup: null}, - { Name: "Lock", LockLayer: true,AllowColorize: true, HasType: false, ParentGroup: null}, - - ] - }, - { Name: "PaddedLeatherMittens", Fetish: ["Leather"], Value: 70, Difficulty: 6, SelfBondage: 5, Time: 15, RemoveTime: 5, AllowLock: true, AllowPose: ["OverTheHead", "BackBoxTie", "BackElbowTouch", "BackCuffs", "Yoked", "AllFours"], SetPose: ["TapedHands"], Effect: ["Block", "Prone"] }, - { Name: "PolishedMittens", Fetish: ["Metal"], Value: 80, Difficulty: 8, SelfBondage: 6, Time: 20, RemoveTime: 10, AllowLock: true, Audio: "CuffsMetal", AllowPose: ["OverTheHead", "BackBoxTie", "BackElbowTouch", "BackCuffs", "Yoked", "AllFours"], Effect: ["Block", "Prone"] }, - { Name: "DuctTape", Fetish: ["Tape"], Value: 50, Difficulty: 5, SelfBondage: 3, Time: 20, RemoveTime: 10, BuyGroup: "DuctTape", Audio: "DuctTapeRollShort", Hide: ["Gloves"], AllowPose: ["OverTheHead", "BackBoxTie", "BackElbowTouch", "BackCuffs", "Yoked", "AllFours"], SetPose: ["TapedHands"], Effect: ["Block", "Prone"] }, - { Name: "KeyProp", Value: 10, Priority: 46, Difficulty: -10, Time: 5, IsRestraint: false, AllowPose: ["OverTheHead", "BackBoxTie", "BackElbowTouch", "BackCuffs", "Yoked", "AllFours"], }, - { Name: "MedicalInjector", Category: ["SciFi"], Value: 75, Priority: 46, Time: 8, IsRestraint: false, AllowActivity: ["InjectItem"], AllowPose: ["Yoked"], HideForPose: ["OverTheHead", "BackBoxTie", "BackElbowTouch", "BackCuffs", "AllFours"], }, - { - Name: "SpankingToys", Fetish: ["Sadism"], Priority: 46, Random: false, Wear: true, IsRestraint: false, BuyGroup: "SpankingToys", - AllowPose: ["OverTheHead", "BackBoxTie", "BackElbowTouch", "BackCuffs", "Yoked", "AllFours"], - AllowType: ["Flogger", "Cane", "HeartCrop", "Paddle", "WhipPaddle", "Whip", "CattleProd", "TennisRacket", "RainbowWand", "Gavel", "Feather", - "FeatherDuster", "LongDuster", "IceCube", "WartenbergWheel", "VibratingWand", "SmallVibratingWand", "CandleWax", "LargeDildo", - "PetToy", "Vibrator", "Belt", "Hairbrush", "SmallDildo", "ElectricToothbrush", "Toothbrush", "ShockWand", "Lotion", "Ruler", - "Sword", "VibeRemote", "ShockRemote", "Towel", "RopeCoilLong", "RopeCoilShort", "Ballgag", "LongSock", "Baguette", "Panties", - "TapeRoll", "Spatula", "Broom", "Phone1", "Phone2", "Scissors", "GlassEmpty", "GlassFilled", "PlasticWrap", "PotionBottle"], - DynamicPreviewImage: C => InventorySpankingToysGetType(C), - DynamicAllowInventoryAdd: C => { return InventorySpankingToysAvailableToys(C).length > 0; }, - Extended: true, - ParentGroup: null - }, - { - Name: "SpankingToysCrop", Value: 20, Random: false, BuyGroup: "Crop", AllowActivity: ["SpankItem"], Audio: "SmackCrop", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysFlogger", Value: 40, Random: false, AllowActivity: ["SpankItem"], Audio: "SmackCrop", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysCane", Value: 15, Random: false, BuyGroup: "Cane", AllowActivity: ["SpankItem"], Audio: "SmackCrop", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysHeartCrop", Value: 30, Random: false, AllowActivity: ["SpankItem"], Audio: "SmackCrop", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysPaddle", Value: 35, Random: false, AllowActivity: ["SpankItem"], Audio: "SmackCrop", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysWhipPaddle", Value: 25, Random: false, AllowActivity: ["SpankItem"], Audio: "SmackCrop", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysWhip", Value: 50, Random: false, AllowActivity: ["SpankItem"], Audio: "WhipCrack", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysCattleProd", Value: 45, Random: false, AllowActivity: ["ShockItem"], Audio: "Shocks", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysTennisRacket", Value: -1, Random: false, AllowActivity: ["SpankItem"], Bonus: "KidnapBruteForce", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysRainbowWand", Value: -1, Random: false, AllowActivity: ["SpankItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysGavel", Value: -1, Random: false, AllowActivity: ["SpankItem"], Bonus: "KidnapDomination", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysFeather", Value: 2, Random: false, AllowActivity: ["TickleItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysFeatherDuster", Value: 4, Random: false, AllowActivity: ["TickleItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysLongDuster", Value: -1, Random: false, AllowActivity: ["TickleItem"], Bonus: "KidnapSneakiness", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysIceCube", Value: 3, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysWartenbergWheel", Value: 10, Random: false, AllowActivity: ["RollItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysVibratingWand", Value: 40, Random: false, AllowActivity: ["MasturbateItem"], Audio: "WandBig", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysSmallVibratingWand", Value: 20, Random: false, AllowActivity: ["MasturbateItem"], Audio: "Wand", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysCandleWax", Value: 10, Random: false, AllowActivity: ["PourItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysLargeDildo", Value: 30, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysPetToy", Value: 5, Random: false, AllowActivity: ["TickleItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysVibrator", Value: 45, Random: false, AllowActivity: ["MasturbateItem"], Audio: "Vibrator", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysBelt", Value: 10, Random: false, AllowActivity: ["SpankItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysHairbrush", Value: 5, Random: false, AllowActivity: ["SpankItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysSmallDildo", Value: 20, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysElectricToothbrush", Value: 20, Random: false, AllowActivity: ["TickleItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysToothbrush", Value: 10, Random: false, AllowActivity: ["TickleItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysShockWand", Value: 50, Random: false, AllowActivity: ["ShockItem"], Audio: "Shocks", DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysLotion", Value: 10, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysRuler", Value: 3, Random: false, AllowActivity: ["SpankItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysSword", Value: 5, Random: false, AllowActivity: ["SpankItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysVibeRemote", Value: 50, Random: false, BuyGroup: "VibratorRemote", AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysShockRemote", Value: 50, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysTowel", Value: 10, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysRopeCoilLong", Value: 60, BuyGroup: "HempRope", Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysRopeCoilShort", Value: 60, BuyGroup: "HempRope", Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysBallgag", Value: 40, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysLongSock", Value: 40, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysBaguette", Value: -1, Random: false, AllowActivity: ["SpankItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysPanties", Value: 10, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysTapeRoll", Value: 50, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysSpatula", Value: 5, Random: false, AllowActivity: ["SpankItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysBroom", Value: 15, Random: false, AllowActivity: ["SpankItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysPhone1", Value: 100, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysPhone2", Value: 140, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysScissors", Value: 15, Random: false, DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysPlasticWrap", Value: 100, BuyGroup: "PlasticWrap", Random: false, DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysGlassEmpty", Value: 10, Random: false, DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysGlassFilled", Value: 20, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { - Name: "SpankingToysPotionBottle", Value: 40, Random: false, AllowActivity: ["RubItem"], DynamicAllowInventoryAdd: () => { return false; }, - PrerequisiteBuyGroups: ["SpankingToys"], PreviewIcons: ["Handheld"] - }, - { Name: "HoofMittens", Fetish: ["Pony"], Value: -1, Difficulty: 5, SelfBondage: 4, Time: 15, RemoveTime: 5, AllowLock: true, DrawLocks: false, AllowPose: ["BackBoxTie", "BackElbowTouch", "BackCuffs", "Yoked", "AllFours", "OverTheHead"], SetPose: ["TapedHands"], Effect: ["Block", "Prone"], HideForPose: ["BackBoxTie", "BackElbowTouch"], }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemNeck", - Category: "Item", - Priority: 34, - Default: false, - Left: 185, - Top: 160, - Zone: [[200, 200, 100, 70]], - RemoveItemOnRemove: [ - { Group: "ItemNeckAccessories", Name: ""}, - { Group: "ItemNeckRestraints", Name: ""}, - { Group: "ItemArms", Name: "CollarCuffs"}, - { Group: "ItemNipplesPiercings", Name: "RoundPiercing", Type: "Chain"}, - { Group: "ItemNipplesPiercings", Name: "RoundPiercing", Type: "WeightedChain"}, - ], - Asset: [ - { Name: "LeatherCollar", Fetish: ["Leather"], DefaultColor: ["#000000", "Default"], Value: 20, Difficulty: 50, Time: 5, AllowLock: true, Layer: [ - { Name: "Collar"}, - { Name: "Ring"} - ] }, - { Name: "LeatherCollarBell", Fetish: ["Leather"], Value: 30, Difficulty: 50, Time: 5, AllowLock: true }, - { Name: "LeatherCollarBow", Fetish: ["Leather"], Value: 25, Difficulty: 50, Time: 5, AllowLock: true }, - { Name: "SlaveCollar", Value: -1, Difficulty: 50, Time: 5, Enable: false, Random: false, OwnerOnly: true, Effect: ["Lock"], AllowBlock: ["ItemMouth", "ItemMouth2", "ItemMouth3"], AllowEffect: ["GagNormal", "FixedHead"], AllowType: ["SteelPosture", "LeatherPosture", "PetCollar", "HighCollar", "LeatherCollarBell", "LeatherCollarBow", "MaidCollar", "BatCollar", "HighSecurityCollar", "SpikeCollar", "BordelleCollar", "LeatherCorsetCollar", "StrictPostureCollar", "LatexPostureCollar", "HeartCollar", "NobleCorsetCollar", "OrnateCollar", "LoveLeatherCollar", "SlenderSteelCollar", "ShinySteelCollar", "HeartLinkChoker", "NeckRope"], Extended: true }, - { Name: "ClubSlaveCollar", Value: -1, Difficulty: 50, Time: 5, Enable: false, Random: false, Effect: ["Lock"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }] }, - { - Name: "ShockCollar", Fetish: ["Leather", "Masochism"], Value: 80, Difficulty: 50, Time: 15, Random: false, AllowLock: true, BuyGroup: "ShockCollar", Effect: ["ReceiveShock"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], AllowType: ["", "Blink"], Extended: true, AlwaysExtend: true, AllowActivity: ["ShockItem"], Layer: [ - { Name: "Collar", HasType: false, AllowTypes: ["", "Blink"] }, - { Name: "Light", AllowTypes: ["Blink"], HideColoring: true }, - ], DynamicBeforeDraw: true, DynamicScriptDraw: true, - }, - { - Name: "AutoShockCollar", Fetish: ["Leather", "Masochism"], Value: -1, Difficulty: 50, Time: 15, Random: false, AllowLock: true, BuyGroup: "ShockCollar", Effect: ["ReceiveShock"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], AllowType: ["", "Blink", "Sensitivity"], Extended: true, AlwaysExtend: true, AllowActivity: ["ShockItem"], Layer: [ - { Name: "Collar", HasType: false, AllowTypes: ["", "Blink"] }, - { Name: "Light", AllowTypes: ["Blink"], HideColoring: true }, - ], DynamicBeforeDraw: true, DynamicScriptDraw: true, - }, - { Name: "ShockCollarRemote", Value: -1, Random: false, Wear: false, BuyGroup: "ShockCollar", AllowActivity: ["ShockItem"], Effect: ["TriggerShock"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }, { Name: "Soft", Group: "Blush", Timer: 15 }, { Name: "Closed", Group: "Eyes", Timer: 5 }] }, - { Name: "BatCollar", Fetish: ["Leather"], Value: 25, Difficulty: 50, Time: 5, AllowLock: true }, - { Name: "PostureCollar", Fetish: ["Leather"], Effect: ["FixedHead"], DefaultColor: ["#000000", "Default", "Default", "Default"], Value: 40, Difficulty: 50, Time: 5, AllowLock: true, Layer: [ - { Name: "Collar" }, - { Name: "Ring1", ColorGroup: "Rings"}, - { Name: "Ring2", ColorGroup: "Rings"}, - { Name: "Ring3", ColorGroup: "Rings"} - - ] }, - { Name: "SteelPostureCollar", Fetish: ["Metal"], Effect: ["FixedHead"], Value: 60, Difficulty: 50, Time: 5, AllowLock: true, Audio: "CuffsMetal" }, - { Name: "DogCollar", Fetish: ["Leather", "Pet"], Value: 20, Difficulty: 50, Time: 5, Random: false, AllowLock: true }, - { Name: "SpikeCollar", Fetish: ["Leather", "Metal", "Pet"], Value: 40, Difficulty: 50, Time: 5, AllowLock: true }, - { - Name: "HighCollar", Fetish: ["Leather", "Metal"], Value: 50, Difficulty: 50, Time: 5, AllowLock: true, - Layer: [ - { Name: "Leather" }, - { Name: "Rings" } - ] - }, - { - Name: "FuturisticCollar", Category: ["SciFi"], Fetish: ["Metal"], Value: 100, Difficulty: 50, Time: 12, Audio: "FuturisticApply", Random: false, - DefaultColor: ["#40812C", "Default", "Default"], AllowLock: true, DrawLocks: false, Extended: true, - AllowEffect:["BlockRemotes", "OpenPermission", "OpenPermissionArm", "OpenPermissionLeg", "OpenPermissionChastity"], - Layer: [ - { Name: "Display" }, - { Name: "Band" }, - { Name: "Mesh", HasType: false}, - { Name: "Lock", LockLayer: true,AllowColorize: true, HasType: false, ParentGroup: null}, - ] - }, - { Name: "LeatherChoker", Fetish: ["Leather"], DefaultColor: ["Default", "#000000"], Value: 10, Difficulty: 50, Time: 5, AllowLock: true, Layer: [ - { Name: "Metal" }, - { Name: "Leather" } - ] }, - { Name: "PetCollar", Fetish: ["Leather", "Pet"], Value: -1, Difficulty: 50, Time: 5, AllowLock: true }, - { Name: "MaidCollar", Fetish: ["Lingerie"], Value: 30, Difficulty: 50, Time: 5, AllowLock: true, DefaultColor: ["#DCDCDC", "#2C2C2C"], Layer: [ - { Name: "Frills" }, - { Name: "Collar" }, - { Name: "Brooch" }, - ] }, - { Name: "BordelleCollar", Fetish: ["Leather"], Value: 30, Difficulty: 50, Time: 5, AllowLock: true }, - { Name: "LoveLeatherCollar", Fetish: ["Leather"], Value: 50, Difficulty: 50, Time: 5, Random: false, AllowLock: true, LoverOnly: false }, - { Name: "NobleCorsetCollar", Fetish: ["Leather"], Value: 45, Difficulty: 50, Time: 5, AllowLock: true }, - { Name: "StrictPostureCollar", Effect: ["FixedHead"], Fetish: ["Leather"], Priority: 38, Value: 60, Difficulty: 50, Time: 30, RemoveTime: 40, AllowLock: true }, - { Name: "HeartCollar", Fetish: ["Leather"], Value: 50, Difficulty: 50, Time: 5, AllowLock: true }, - { Name: "LeatherCorsetCollar", Fetish: ["Leather"], Priority: 38, Value: 75, Difficulty: 50, Time: 20, RemoveTime: 30, Random: false, IsRestraint: true, AllowLock: true, DefaultColor: "#404040", BuyGroup: "LeatherCorsetCollar", Effect: ["GagNormal"], }, - { Name: "LatexPostureCollar", Fetish: ["Latex"], Priority: 38, Value: 80, Difficulty: 50, Time: 20, RemoveTime: 30, Random: false, IsRestraint: true, AllowLock: true, BuyGroup: "LatexPostureCollar", Effect: ["GagNormal", "FixedHead"], }, - { Name: "HighSecurityCollar", Fetish: ["Metal"], Value: 70, Difficulty: 50, Time: 5, AllowLock: true, Audio: "LockLarge" }, - { - Name: "OrnateCollar", Fetish: ["Metal"], Value: 80, Difficulty: 50, Time: 5, AllowLock: true, Audio: "CuffsMetal", - Layer: [ - { Name: "Collar" }, - { Name: "Gem" } - ] - }, - { Name: "SlenderSteelCollar", Fetish: ["Metal"], Value: 30, Difficulty: 50, Time: 5, AllowLock: true, Audio: "CuffsMetal" }, - { - Name: "ShinySteelCollar", Fetish: ["Metal"], Value: 35, Difficulty: 50, Time: 5, AllowLock: true, DrawLocks: false, Audio: "CuffsMetal", HasType: false, Extended: true, - Layer: [ - { Name: "Collar" }, - { Name: "Ring", AllowTypes: ["Ring"] } - ] - }, - { Name: "HeartLinkChoker", Fetish: ["Leather"], Value: 15, Difficulty: 50, Time: 5, AllowLock: true, - DefaultColor: ["#979797", "#3D3D3D"], - Layer: [ - { Name: "HeartLink"}, - { Name: "LeatherStrap"} - ] - }, - { Name: "NeckRope", Fetish: ["Rope"], Value: 60, Difficulty: 50, Time: 5, AllowLock: false, BuyGroup: "HempRope", CraftGroup: "HempRope", Audio: "RopeShort", DefaultColor: "#956B1C", ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 3 }, { Name: "Soft", Group: "Eyebrows", Timer: 3 }] }, - { Name: "NylonCollar", Value: 45, Difficulty: 50, Time: 5, AllowLock: true }, - { Name: "GothicCollar",Priority: 29, Value: 85, Difficulty: 50, Time: 5, AllowLock: true, DefaultColor:["Default","#202020",], - Layer: [ - { Name: "Ornaments"}, - { Name: "Collar"}, - { Name: "Jewels"}, - { Name: "Metal"}, - { Name: "Flowers"} - ] - }, - { Name: "LatexCollar1", Fetish: ["Latex"], Value: 40, Difficulty: 50, Time: 5, Effect: ["FixedHead"]}, - { Name: "LatexCollar2", Fetish: ["Latex"], Value: 40, Difficulty: 50, Time: 5, AllowLock: true}, - { Name: "TechnoCollar", Category: ["SciFi"], Fetish: ["Metal"], Value: 70, DefaultColor: ["#959595","#3976AE"], Difficulty: 60, Time: 4, AllowLock: true, DrawLocks: false, Extended: true, - Layer: [ - { Name: "SlenderCollarBase", HasType: false, AllowModuleTypes: ["c0"] }, - { Name: "ChokerCollarBase", HasType: false, CopyLayerColor: "SlenderCollarBase", AllowModuleTypes: ["c1"] }, - { Name: "FullCollarBase", HasType: false, CopyLayerColor: "SlenderCollarBase", AllowModuleTypes: ["c2"] }, - { Name: "PostureCollarBase", HasType: false, CopyLayerColor: "SlenderCollarBase", AllowModuleTypes: ["c3"] }, - { Name: "StrictPostureCollarBase", HasType: false, CopyLayerColor: "SlenderCollarBase", AllowModuleTypes: ["c4"] }, - { Name: "SlenderCollarSides", HasType: false, AllowModuleTypes: ["c0"] }, - { Name: "ChokerCollarSides", HasType: false, CopyLayerColor: "SlenderCollarSides", AllowModuleTypes: ["c1"] }, - { Name: "FullCollarSides", HasType: false, CopyLayerColor: "SlenderCollarSides", AllowModuleTypes: ["c2"] }, - { Name: "PostureCollarSides", HasType: false, CopyLayerColor: "SlenderCollarSides", AllowModuleTypes: ["c3"] }, - { Name: "StrictPostureCollarSides", HasType: false, CopyLayerColor: "SlenderCollarSides", AllowModuleTypes: ["c4"] }, - { Name: "SlenderCollarShine", HasType: false, AllowColorize: false, AllowModuleTypes: ["c0"] }, - { Name: "ChokerCollarShine", HasType: false, AllowColorize: false, AllowModuleTypes: ["c1"] }, - { Name: "FullCollarShine", HasType: false, AllowColorize: false, AllowModuleTypes: ["c2"] }, - { Name: "PostureCollarShine", HasType: false, AllowColorize: false, AllowModuleTypes: ["c3"] }, - { Name: "StrictPostureCollarShine", HasType: false, AllowColorize: false, AllowModuleTypes: ["c4"] }, - ] - }, - { Name: "ComboHarness", Top: 0, Left:150, DefaultColor: ['#4D4848', 'Default', '#7E7B77', '#FFFFFF', '#ACA1A1'], Effect: ["BlockMouth", "GagMedium", "BlindNormal", "Prone"], Prerequisite: ["AccessMouth", "EyesEmpty", "HoodEmpty", "GagUnique"], Block: ["ItemHood", "ItemHead", "ItemMouth", "ItemMouth2", "ItemMouth3"], Value: 100, Difficulty: 30, Time: 18, AllowLock: true, Extended: true, Random: false, IsRestraint: true, Layer: [ - { Name: "Harness", HasType: false }, - { Name: "Buckles", HasType: false }, - { Name: "Ball"}, - { Name: "Studs", HasType: false }, - { Name: "Ring", HasType: false } - ] }, - { - Name: "BonedNeckCorset", Fetish: ["Latex"], Time: 7, Value: 50, Difficulty: 40, AllowLock: true, DrawLocks: false, DefaultColor: ["#222222","#888888", "#AA2121", "#AA2121", "#888888"], Effect: ["FixedHead"], Extended: true, - Layer:[ - { Name: "Base", HasType: false,}, - { Name: "Shine", HasType: false,}, - { Name: "Stripes", HasType: false,}, - { Name: "StripesShine", HasType: false,}, - { Name: "Bump", HasType: false, AllowTypes: ["Ring"], CopyLayerColor: "Base",}, - { Name: "RingShadow", HasType: false, AllowTypes: ["Ring"], AllowColorize: false,}, - { Name: "Ring", HasType: false, AllowTypes: ["Ring"],}, - ], - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemNeckAccessories", - Category: "Item", - Priority: 41, - Default: false, - Left: 0, - Top: 190, - Zone: [[100, 200, 100, 70]], - MirrorActivitiesFrom: "ItemNeck", - Asset: [ - { - Name: "CustomCollarTag", Value: 50, Difficulty: 20, Time: 5, Random: false, IsRestraint: false, AllowLock: true, DefaultColor: ["#aaa366", "#000000"], Prerequisite: "Collared", DynamicAfterDraw: true, Extended: true, DrawLocks: false, - Layer: [ - { Name: "Tag", ModuleType: ["t"], AllowModuleTypes: ["t0", "t1", "t2", "t3", "t4", "t5"] }, - { Name: "Text", HasImage: false }, - { Name: "Lock", AllowColorize: false, LockLayer: true, HasType: false }, - ] - }, - { - Name: "ElectronicTag", Value: 50, Difficulty: 20, Time: 5, Random: false, IsRestraint: false, AllowLock: true, DrawLocks: false, DefaultColor: ["#40812C", "Default", "#000000"], Prerequisite: "Collared", DynamicAfterDraw: true, Extended: true, FuturisticRecolor: true, - Layer: [ - { Name: "Display" }, - { Name: "Tag" }, - { Name: "Text" } - ] - }, - { Name: "CollarBell", Fetish: ["Metal", "Pet"], Value: 5, Difficulty: 3, Time: 5, Random: false, AllowLock: true, Prerequisite: "Collared", Audio: "BellMedium" }, - { Name: "CollarBow", Fetish: ["Lingerie"], Value: 5, Difficulty: 1, Time: 5, Random: false, Prerequisite: "Collared" }, - { - Name: "CollarShockUnit", Fetish: ["Masochism"], Value: 80, Difficulty: 6, Time: 5, Random: false, AllowLock: true, BuyGroup: "ShockCollar", Prerequisite: "Collared", Effect: ["ReceiveShock"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }], AllowType: ["", "Blink"], Extended: true, AlwaysExtend: true, AllowActivity: ["ShockItem"], Layer: [ - { Name: "Unit", AllowTypes: ["", "Blink"], HasType: false }, - { Name: "Light", AllowTypes: ["Blink"], HideColoring: true }, - ], DynamicBeforeDraw: true, DynamicScriptDraw: true, - }, - { - Name: "CollarAutoShockUnit", Fetish: ["Masochism"], Value: -1, Difficulty: 6, Time: 5, Random: false, AllowLock: true, BuyGroup: "ShockCollar", Prerequisite: "Collared", Effect: ["ReceiveShock"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }], AllowType: ["", "Blink", "Sensitivity"], Extended: true, AlwaysExtend: true, AllowActivity: ["ShockItem"], Layer: [ - { Name: "Unit", AllowTypes: ["", "Blink"], HasType: false }, - { Name: "Light", AllowTypes: ["Blink"], HideColoring: true }, - ], DynamicBeforeDraw: true, DynamicScriptDraw: true, - }, - { Name: "Key", Value: 5, Difficulty: 3, Time: 5, Random: false, AllowLock: true, DrawLocks: false, Prerequisite: "Collared"}, - { Name: "ShockCollarRemote", Value: -1, Random: false, Wear: false, BuyGroup: "ShockCollar", AllowActivity: ["ShockItem"], Effect: ["TriggerShock"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }, { Name: "Soft", Group: "Blush", Timer: 15 }, { Name: "Closed", Group: "Eyes", Timer: 5 }] }, - { Name: "CollarNameTag", Value: 50, Difficulty: 20, Time: 5, Random: false, IsRestraint: false, AllowLock: true, DefaultColor: "#aaa366", Prerequisite: "Collared", AllowType: ["Angel", "BadGirl", "BindMe", "Bitch", "Boobs", "Cupcake", "Devil", "Dom", "Free", "FuckMe", "GagMe", "Goddess", "GoodGirl", "HoldMe", "Jewel", "Love", "Maid", "Meat", "Miss", "Mummy", "Nice", "Needy", "Owned", "Precious", "Pudding", "Queen", "Slave", "Slut", "Sub", "Sweetie", "Taken", "Toy", "Useless", "UseMe", "Whore"], Extended: true }, - { Name: "CollarNameTagOval", Value: 50, Difficulty: 20, Time: 5, Random: false, IsRestraint: false, AllowLock: true, DefaultColor: "#aaa366", Prerequisite: "Collared", AllowType: ["Babe", "Bandit", "Bimbo", "Bratty", "Chair", "Chaste", "Crazy", "Cumslut", "Cutie", "Damsel", "Doll", "EdgeMe", "Evil", "ForSale", "Greedy", "Happy", "Horny", "Kinky", "Lady", "LockMe", "Nude", "Nurse", "Nympho", "Painslut", "Pillow", "Punish", "Robber", "Sad", "Switch", "Table", "Ticklish", "Undress", "Victim", "Violent", "Worm", "AnalSlut", "ButtSlut"], Extended: true }, - { Name: "CollarNameTagPet", Fetish: ["Pet"], Value: 50, Difficulty: 20, Time: 5, Random: false, IsRestraint: false, AllowLock: true, DefaultColor: "#aaa366", Prerequisite: "Collared", AllowType: ["Bunny", "Cat", "Dog", "Foxy", "Kitten", "Kitty", "Mochi", "Panda", "Pet", "PetMe", "Pixie", "Pony", "Puppy", "Racoon", "Sloth"], Extended: true }, - { Name: "CollarNameTagLover", Value: -1, Difficulty: 20, Time: 5, Random: false, IsRestraint: false, AllowLock: true, DefaultColor: "#aaa366", Prerequisite: "Collared", AllowType: ["Cookie", "Feather", "Lover", "Muffin"], Extended: true }, - { Name: "CollarNameTagLivestock", Fetish: ["Pet"], Value: 50, Difficulty: 20, Time: 5, Random: false, IsRestraint: false, AllowLock: true, Prerequisite: "Collared", AllowType: ["Animal", "BreedMe", "Cow", "Meat", "MilkMe", "Pig"], Extended: true }, - { Name: "CollarMoon", Value: 5, Difficulty: 3, Time: 5, Random: false, AllowLock: true, Prerequisite: "Collared" }, - { Name: "CollarSun", Value: 10, Difficulty: 3, Time: 5, Random: false, AllowLock: true, DrawLocks: false, Prerequisite: "Collared" }, - { Name: "CollarLapis", Value: 10, Difficulty: 3, Time: 5, Random: false, AllowLock: true, DrawLocks: false, Prerequisite: "Collared" }, - { Name: "CollarPentagram", Value: 10, Difficulty: 3, Time: 5, Random: false, AllowLock: true, DrawLocks: false, Prerequisite: "Collared" }, - { Name: "CollarFlower", Value: 5, Difficulty: 1, Time: 5, Random: false, AllowLock: true, DrawLocks: false, Prerequisite: "Collared" }, - { Name: "CollarRose", Value: 5, Difficulty: 1, Time: 5, Random: false, AllowLock: true, DrawLocks: false, Prerequisite: "Collared" }, - { Name: "CollarCowBell", Fetish: ["Pet"], Value: 15, Difficulty: 3, Time: 5, Random: false, AllowLock: true, Prerequisite: "Collared" }, - { Name: "CollarPupBone", Fetish: ["Pet"], Value: 25, Difficulty: 3, Time: 5, Random: false, AllowLock: true, DrawLocks: false, Prerequisite: "Collared" }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemNeckRestraints", - Category: "Item", - Priority: 40, - Default: false, - IsRestraint: true, - Left: 0, - Top: 190, - Zone: [[300, 200, 100, 70]], - MirrorActivitiesFrom: "ItemNeck", - Asset: [ - { Name: "CollarChainLong", Fetish: ["Metal"], Value: 30, Difficulty: 6, Time: 5, Random: false, AllowLock: true, BuyGroup: "CollarChain", Audio: "ChainLong", Prerequisite: ["Collared", "NotSuspended"], AllowPose: ["Kneel", "KneelingSpread", "AllFours", "Hogtied"], Effect: ["Tethered", "IsChained"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }] }, - { Name: "CollarChainShort", Fetish: ["Metal"], Value: -1, Difficulty: 6, Time: 5, Random: false, AllowLock: true, BuyGroup: "CollarChain", Audio: "ChainLong", Prerequisite: ["Collared", "AllFours", "NotSuspended", "NotMounted", "CanKneel"], AllowPose: ["AllFours", "Hogtied"], SetPose: ["Kneel"], AllowActivePose: ["Kneel", "KneelingSpread"], Effect: ["Freeze", "ForceKneel", "IsChained"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }] }, - { Name: "Post", Fetish: ["Metal"], Value: 130, Difficulty: 9, Time: 5, Random: false, AllowLock: true, Audio: "ChainShort", Prerequisite: ["Collared", "AllFours", "NotSuspended", "NotMounted", "CanKneel"], AllowPose: ["AllFours", "Hogtied"], SetPose: ["Kneel"], AllowActivePose: ["Kneel", "KneelingSpread"], Effect: ["Freeze", "ForceKneel", "IsChained"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }], - Layer: [ - { Name: "Chain", Priority: 40 }, - { Name: "Base", Priority: 54 }, - { Name: "Post", Priority: 54 }, - { Name: "Head", Priority: 54 }, - ] - }, - { Name: "CollarLeash", Fetish: ["Leather"], Value: 20, Difficulty: 6, Time: 5, Random: false, AllowLock: true, Audio: "LockSmall", Prerequisite: "Collared", Effect: ["Leash"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }] }, - { Name: "CollarLeashTaken", Fetish: ["Leather"], Value: -1, Difficulty: 6, Time: 5, Random: false, AllowLock: true, Audio: "LockSmall", Prerequisite: "Collared", AllowPose: ["AllFours"], Effect: ["Tethered", "Leash"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }] }, - { Name: "ChainLeash", Fetish: ["Leather"], Value: 25, Difficulty: 6, Time: 5, Random: false, AllowLock: true, Prerequisite: "Collared", Audio: "LockSmall", AllowPose: ["AllFours"], Effect: ["Leash"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }] }, - { Name: "ChainLeashTaken", Fetish: ["Leather"], Value: -1, Difficulty: 6, Time: 5, Random: false, AllowLock: true, Audio: "LockSmall", Prerequisite: "Collared", AllowPose: ["AllFours"], Effect: ["Tethered", "Leash"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }] }, - { Name: "CollarChainMedium", Fetish: ["Metal"], Value: -1, Difficulty: 6, Time: 5, Random: false, AllowLock: true, BuyGroup: "CollarChain", Audio: "ChainLong", Prerequisite: ["Collared", "NotSuspended"], AllowPose: ["AllFours", "Kneel", "KneelingSpread", "Hogtied"], Effect: ["Tethered", "IsChained"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }] }, - { - Name: "CollarRopeLong", Fetish: ["Rope"], Value: 30, Difficulty: 5, Time: 5, Random: false, DefaultColor: "#956B1C", BuyGroup: "CollarRope", Prerequisite: ["Collared", "NotSuspended"], AllowPose: ["AllFours", "Kneel", "KneelingSpread", "Hogtied"], Effect: ["Tethered", "IsChained"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }], DrawLocks: false, - Layer: [ - { Name: "Rope", }, - { Name: "Plate", AllowColorize: false, }, - ], - }, - { - Name: "CollarRopeShort", Fetish: ["Rope"], Value: -1, Difficulty: 5, Time: 5, Random: false, DefaultColor: "#956B1C", BuyGroup: "CollarRope", Prerequisite: ["Collared", "AllFours", "NotSuspended", "NotMounted", "CanKneel", "Hogtied"], AllowPose: ["AllFours", "Hogtied"], SetPose: ["Kneel"], AllowActivePose: ["Kneel", "KneelingSpread"], Effect: ["Freeze", "ForceKneel", "IsChained"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 },], DrawLocks: false, - Layer: [ - { Name: "Rope", }, - { Name: "Plate", AllowColorize: false, }, - ], - }, - { - Name: "CollarRopeMedium", Fetish: ["Rope"], Value: -1, Difficulty: 6, Time: 5, Random: false, DefaultColor: "#956B1C", BuyGroup: "CollarRope", Prerequisite: ["Collared", "NotSuspended"], AllowPose: ["AllFours", "Kneel", "KneelingSpread", "Hogtied"], Effect: ["Tethered", "IsChained"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }], DrawLocks: false, - Layer: [ - { Name: "Rope", }, - { Name: "Plate", AllowColorize: false, }, - ], - }, - { Name: "PetPost", Fetish: ["Metal", "Pet"], Value: 150, Difficulty: 4, Time: 5, Random: false, DefaultColor: ["Default", "#845343", "#A1794A", "Default", "#237D22", "#F3F3F3", "#F3F3F3", "#FFF483", "#FFBCD6", "Default"], DrawLocks: false, Prerequisite: ["Collared", "NotSuspended", "NotMounted"], AllowPose: [], Effect: ["IsChained", "Tethered"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }, { Name: "Soft", Group: "Eyebrows", Timer: 5 }], DynamicAfterDraw: true, Extended: true, AlwaysExtend: true, Top: 352, Left: 310, FixedPosition: true, - Layer: [ - //Pole Base - { Name: "PoleShade", Priority: 10, AllowColorize: false, HasType: false}, - { Name: "Pole", Priority: 54, AllowModuleTypes: ["d1"], HasType: false, }, - { Name: "PoleClean", Priority: 54, CopyLayerColor: "Pole", AllowModuleTypes: ["d0"], HasType: false}, - //Leashes - { Name: "Leash", Priority: 55, AllowModuleTypes: ["l0"], AllowPose: ["AllFours", "Kneel", "KneelingSpread", "Hogtied"], HasType: false, Top: 212, Left: 239 }, - { Name: "Rope", Priority: 55, AllowModuleTypes: ["l1"], AllowPose: ["AllFours", "Kneel", "KneelingSpread", "Hogtied"], HasType: false, Top: 212, Left: 239 }, - { Name: "Chain", Priority: 55, AllowModuleTypes: ["l2"], AllowPose: ["AllFours", "Kneel", "KneelingSpread", "Hogtied"], HasType: false, Top: 212, Left: 239 }, - //Plaque - { Name: "Plaque", Priority: 54, AllowModuleTypes: ["d1"], HasType: false }, - { Name: "PlaqueClean", Priority: 54, CopyLayerColor: "Plaque",AllowModuleTypes: ["d0"], HasType: false }, - { Name: "PlaqueBorder", Priority: 54, AllowModuleTypes: ["p1d1"], HasType: false }, - { Name: "PlaqueBorderClean", Priority: 54, CopyLayerColor: "PlaqueBorder", AllowModuleTypes: ["p1d0"], HasType: false }, - { Name: "PlaqueBolts", Priority: 54, HasType: false }, - //Details - { Name: "Postit", Priority: 54, HasType: false, AllowModuleTypes: ["m0"] }, - { Name: "Text", HasImage: false, Priority: 55 }, - { Name: "Paw", Priority: 54, HasType: false, AllowModuleTypes: ["s0"] }, - { Name: "Triskel", Priority: 54, HasType: false, CopyLayerColor: "Paw", AllowModuleTypes: ["s1"] }, - { Name: "Moon", Priority: 54, HasType: false, CopyLayerColor: "Paw", AllowModuleTypes: ["s2"] }, - { Name: "LGBT", Priority: 54, HasType: false, AllowColorize: false, AllowModuleTypes: ["s3"] }, - { Name: "Trans", Priority: 54, HasType: false, AllowColorize: false, AllowModuleTypes: ["s4"] }, - { Name: "Bi", Priority: 54, HasType: false, AllowColorize: false, AllowModuleTypes: ["s5"] }, - { Name: "NoSwim", Priority: 54, HasType: false, CopyLayerColor: "Paw", AllowModuleTypes: ["s6"] }, - ] - }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemMouth", - Category: "Item", - Priority: 35, - Default: false, - IsRestraint: true, - Left: 150, - Top: 0, - Effect: ["BlockMouth", "GagNormal"], - Zone: [[100, 130, 100, 70]], - Asset: [ - { Name: "ClothGag", Value: 15, Difficulty: -4, Time: 10, DefaultColor: "#E0E0E0", BuyGroup: "ClothGag", Prerequisite: "GagFlat", Effect: ["BlockMouth", "GagVeryLight"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], Audio: "ClothKnot", Extended: true }, - { - Name: "WiffleGag", Fetish: ["Leather"], Value: 30, Difficulty: 1, Time: 10, AllowLock: true, BuyGroup: "WiffleGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagNormal"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - DefaultColor: ["Default", "#FF6060"], - Extended: true, - Layer: [ - { Name: "Strap" , HasType: false}, - { Name: "Ball" }, - ] - }, - { - Name: "HarnessBallGag", Fetish: ["Leather"], Value: 60, Difficulty: 6, Time: 20, AllowLock: true, BuyGroup: "HarnessBallGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - DefaultColor: ["#FF6060", "Default"], Extended: true, - Layer: [ - { Name: "Ball" }, - { Name: "Harness", HasType: false}, - ] - }, - { - Name: "Ball", Fetish: ["Pet"], Value: 5, Difficulty: -50, Time: 5, Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], AllowEffect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 20 }], - DefaultColor: ["#E1D31C", "Default"], - Layer: [ - { Name: "Base" }, - { Name: "Stripes", HasType: false}, - ] - }, - { - Name: "HarnessPanelGag", Fetish: ["Leather"], Value: 80, Difficulty: 6, Time: 20, AllowLock: true, DefaultColor: "#404040", BuyGroup: "HarnessPanelGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], Layer: [ - { Name: "Panel" }, - { Name: "Straps" }, - { Name: "Metal" }, - ] - }, - { - Name: "RingGag", Fetish: ["Leather", "Metal"], Value: 30, Difficulty: 2, Time: 5, AllowLock: true, DefaultColor: "#404040", BuyGroup: "RingGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["GagEasy", "OpenMouth"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Mouth", Priority: 10, AllowColorize: false }, - { Name: "Gag", AllowColorize: true } - ] - }, - { Name: "DuctTape", Fetish: ["Tape"], Value: 50, Difficulty: -2, Time: 10, RemoveTime: 5, BuyGroup: "DuctTape", Audio: "DuctTape", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagVeryLight"], Extended: true }, - { Name: "PacifierGag", Category: ["ABDL"], Fetish: ["ABDL", "Leather"], Value: 10, Difficulty: -50, Time: 2, Random: false, Hide: ["Mouth"], Effect: ["BlockMouth", "GagVeryLight"], Block: ["ItemMouth2", "ItemMouth3"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }] }, - { - Name: "HarnessPacifierGag", Category: ["ABDL"], Fetish: ["ABDL", "Leather"], Value: 50, Difficulty: 6, Time: 20, Random: false, AllowLock: true, BuyGroup: "HarnessPacifierGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], - Layer: [ - { Name: "Harness" }, - { Name: "Metal" }, - { Name: "PacifierOuter" }, - { Name: "PacifierInner" }, - ] - }, - { - Name: "DusterGag", Fetish: ["Leather"], Priority: 42, Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "DusterGag", Bonus: "KidnapBruteForce", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], Block: ["ItemMouth2", "ItemMouth3"], - Layer: [ - { Name: "Duster" }, - { Name: "Panel" }, - ] - }, - { - Name: "CupholderGag", Fetish: ["Leather"], Priority: 42, Value: 30, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "CupholderGag", Hide: ["Mouth"], Extended: true, AlwaysExtend: true, AlwaysInteract: true, Effect: ["BlockMouth", "GagEasy", "ProtrudingMouth"], Block: ["ItemMouth2", "ItemMouth3"], - Layer: [ - { Name: "Gag", HasType: false, AllowTypes: ["", "Cup"] }, - { Name: "Holder", HasType: false, AllowTypes: ["", "Cup"] }, - { Name: "Cup", HasType: false, AllowTypes: ["Cup"] } - ] - }, - { - Name: "HarnessPonyBits", Fetish: ["Leather", "Pony"], Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "HarnessPonyBits", Prerequisite: "GagUnique", Extended: true, AlwaysExtend: true, Effect: ["BlockMouth", "GagLight"], Bonus: "KidnapBruteForce", - Layer: [ - { Name: "Metal"}, - { Name: "Straps", HasType: false }, - { Name: "Bobble", HasType: false }, - ] - }, - {Name: "PumpGag", Fetish: ["Leather"], Value: 100, Difficulty: 2, Time: 20, Random: false, AllowLock: true, DefaultColor: "#404040", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Extended: true, HasType: false }, - { - Name: "KittyGag", Fetish: ["Pet"], Value: 20, Difficulty: -4, Time: 10, Random: false, BuyGroup: "KittyGag", Prerequisite: "GagFlat", DefaultColor: ["#FFFFFF", "#000000", "#E496E7"], Hide: ["Mouth"], Effect: ["BlockMouth"], Layer: [ - { Name: "Base", AllowColorize: true, HasType: false }, - { Name: "Lines", AllowColorize: true, HasType: false }, - { Name: "Mouth", AllowColorize: true, HasType: false }, - ] - }, - { - Name: "KittyHarnessPanelGag", Fetish: ["Leather", "Pet"], Value: 80, Difficulty: 6, Time: 20, Random: false, AllowLock: true, DefaultColor: ["#FFFFFF", "#FFFFFF", "#000000", "#E496E7"], BuyGroup: "KittyHarnessPanelGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], Layer: [ - { Name: "Panel", AllowColorize: true, HasType: false }, - { Name: "Straps", AllowColorize: true, HasType: false }, - { Name: "Lines", AllowColorize: true, HasType: false }, - { Name: "Mouth", AllowColorize: true, HasType: false }, - ] - }, - { - Name: "KittyMuzzleGag", Fetish: ["Leather", "Pet"], Value: 80, Difficulty: 6, Time: 20, Random: false, AllowLock: true, DefaultColor: ["#FFFFFF", "#FFFFFF", "#000000", "#E496E7"], BuyGroup: "KittyMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Layer: [ - { Name: "Muzzle", AllowColorize: true, HasType: false }, - { Name: "Straps", AllowColorize: true, HasType: false }, - { Name: "Lines", AllowColorize: true, HasType: false }, - { Name: "Mouth", AllowColorize: true, HasType: false }, - ] - }, - { - Name: "CarrotGag", Fetish: ["Leather", "Pony"], Value: 40, Difficulty: 3, Time: 15, Random: false, AllowLock: true, BuyGroup: "CarrotGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Carrot" }, - { Name: "Straps" }, - ] - }, - { - Name: "MuzzleGag", Fetish: ["Leather"], Value: 70, Difficulty: 6, Time: 20, AllowLock: true, DefaultColor: "#404040", BuyGroup: "MuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Layer: [ - { Name: "Muzzle" }, - { Name: "Straps" }, - ] - }, - { - Name: "FuturisticPanelGag", Category: ["SciFi"], Fetish: ["Metal"], Value: 100, Difficulty: 4, Time: 15, Random: false, AllowLock: true, DrawLocks: false, DefaultColor: ["#50913C", "Default"], BuyGroup: "FuturisticPanelGag", Prerequisite: "GagFlat", Hide: ["Mouth"], FuturisticRecolor: true, Effect: [ "BlockMouth", "UseRemote"], AllowEffect: ["BlockMouth", "GagVeryLight", "LightBall", "GagMedium", "GagTotal"], AllowType: ["Padded", "LightBall", "Ball", "Plug", "AutoPunish", "AutoPunishUndoTime", "AutoPunishUndoTimeSetting", "OriginalSetting", "ChatMessage"], HideItem: ["ItemNoseNoseRing"], Extended: true, DynamicScriptDraw: true,DynamicBeforeDraw: true, Audio: "FuturisticApply", - Layer: [ - { Name: "Ball", AllowColorize: true, HasType: false }, - { Name: "Mask" , AllowColorize: true, HasType: false }, - { Name: "Light" , AllowColorize: true, AllowTypes: ["", "LightBall", "Ball", "Plug", "Blink"]}, - { Name: "Lock", LockLayer: true,AllowColorize: true, ParentGroup: null}, - ] - }, - { - Name: "FuturisticHarnessPanelGag", Category: ["SciFi"], Fetish: ["Metal"], Value: -1, Difficulty: 6, Time: 15, Random: false, AllowLock: true, DrawLocks: false, DefaultColor: ["#50913C", "Default"], BuyGroup: "FuturisticPanelGag", Prerequisite: "GagFlat", Hide: ["Mouth"], FuturisticRecolor: true, Effect: [ "BlockMouth", "UseRemote"], AllowEffect: ["BlockMouth", "GagVeryLight", "GagMedium", "GagTotal"], AllowType: ["Padded", "LightBall", "Ball", "Plug", "AutoPunish", "AutoPunishUndoTime", "AutoPunishUndoTimeSetting", "OriginalSetting", "ChatMessage"], HideItem: ["ItemNoseNoseRing"], Extended: true,DynamicScriptDraw: true,DynamicBeforeDraw: true, Audio: "FuturisticApply", - Layer: [ - { Name: "Ball", AllowColorize: true, HasType: false }, - { Name: "Straps" , AllowColorize: true, HasType: false }, - { Name: "Mask" , AllowColorize: true, HasType: false }, - { Name: "Light" , AllowColorize: true, AllowTypes: ["", "LightBall", "Ball", "Plug", "Blink"]}, - { Name: "Lock", LockLayer: true,AllowColorize: true, ParentGroup: null}, - ] - }, - { - Name: "FuturisticHarnessBallGag", Category: ["SciFi"], Fetish: ["Metal"], Value: -1, Difficulty: 6, Time: 15, Random: false, AllowLock: true, DrawLocks: false, DefaultColor: ["#50913C", "Default", "Default", "Default"], BuyGroup: "FuturisticPanelGag", Prerequisite: "GagFlat", Hide: ["Mouth"], FuturisticRecolor: true, Effect: [ "BlockMouth", "GagLight", "UseRemote"], AllowEffect: ["BlockMouth", "GagLight", "GagMedium", "GagTotal"], AllowType: ["LightBall", "Ball", "Plug", "AutoPunish", "AutoPunishUndoTime", "AutoPunishUndoTimeSetting", "OriginalSetting", "ChatMessage"], Extended: true, DynamicScriptDraw: true,DynamicBeforeDraw: true, Audio: "FuturisticApply", - Layer: [ - { Name: "Ball", AllowColorize: true, HasType: false }, - { Name: "Mask" , AllowColorize: true, HasType: false }, - { Name: "Straps" , AllowColorize: true, HasType: false }, - { Name: "Light" , AllowColorize: true, AllowTypes: ["", "LightBall", "Ball", "Plug", "Blink"]}, - { Name: "Lock", LockLayer: true,AllowColorize: true, ParentGroup: null}, - { Name: "BallHighlights", AllowColorize: false, HasType: false }, - ] - }, - { Name: "RegularSleepingPill", Value: -1, Enable: false, Wear: false, Bonus: "KidnapSneakiness" }, - { - Name: "PantiesMask", Fetish: ["Lingerie"], Value: 20, Time: 15, Random: false, BuyGroup: "PantiesMask", Hide: ["Mouth"], Effect: ["BlockMouth", "GagVeryLight"], HideItem: ["ItemNoseNoseRing"], Layer: [ - { Name: "DarkStripes" }, - { Name: "LightStripes" }, - ] - }, - { - Name: "PlugGag", Fetish: ["Leather"], Value: 100, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "PlugGag", Prerequisite: "GagFlat", Extended: true, - Hide: ["Mouth"], - Effect: ["GagMedium", "OpenMouth"], - ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], - Layer: [ - { Name: "Strap", AllowColorize: true, HasType: false }, - { Name: "Tongue", AllowColorize: false, HasType: false }, - { Name: "Close", CopyLayerColor: "Strap", AllowColorize: true, AllowTypes: ["Plug"] } - ] - }, - { - Name: "DildoGag", Fetish: ["Leather"], Priority: 42, Value: 60, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "DildoGag", Prerequisite: "GagUnique", AllowActivity: ["PenetrateItem"], Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium", "ProtrudingMouth"], Block: ["ItemMouth2", "ItemMouth3"], - DefaultColor: ["Default", "#404040"], - Layer: [ - { Name: "Strap" }, - { Name: "Dildo" }, - ] - }, - { - Name: "BoneGag", Fetish: ["Leather"], Value: 50, Difficulty: 6, Time: 10, Random: false, AllowLock: true, BuyGroup: "BoneGag", Prerequisite: "GagUnique", Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Bone" }, - { Name: "Straps" }, - ] - }, - { - Name: "ChopstickGag", Fetish: ["Rope"], Value: 15, Difficulty: 2, Time: 10, Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["GagNormal", "ProtrudingMouth"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Chopsticks", AllowColorize: true }, - { Name: "Tongue", AllowColorize: false } - ] - }, - { - Name: "BambooGag", Fetish: ["Rope"], Value: 30, Difficulty: 6, Time: 10, Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagNormal", "ProtrudingMouth"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - DefaultColor: ["Default", "#A07858"], - Layer: [ - { Name: "Rod" }, - { Name: "Rope" }, - ] - }, - { - Name: "HarnessBallGag1", Fetish: ["Leather"], Value: 75, Difficulty: 6, Time: 20, AllowLock: true, BuyGroup: "HarnessBallGag1", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagHeavy"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Ball" }, - { Name: "Strap" }, - ] - }, - { - Name: "PumpkinGag", Fetish: ["Leather"], Value: 40, Difficulty: 1, Time: 10, Random: false, AllowLock: true, BuyGroup: "PumpkinGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Pumpkin" }, - { Name: "Straps" }, - { Name: "Rings" }, - ] - }, - { - Name: "LipGag", Fetish: ["Leather"], Value: 40, Difficulty: 2, Time: 5, DefaultColor: ["#cc3333", "Default", "Default"], AllowLock: true, BuyGroup: "LipGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["GagLight", "OpenMouth"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Mouth", Priority: 10, AllowColorize: false }, - { Name: "Lips", AllowColorize: true }, - { Name: "Straps", AllowColorize: true }, - { Name: "Rings", AllowColorize: true }, - ] - }, - { - Name: "SpiderGag", Fetish: ["Leather", "Metal"], Value: 45, Difficulty: 4, Time: 5, AllowLock: true, BuyGroup: "SpiderGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["GagEasy", "OpenMouth"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Mouth", Priority: 10, AllowColorize: false }, - { Name: "Gag", AllowColorize: true } - ] - }, - { - Name: "ClothStuffing", Value: 10, Difficulty: -20, Time: 5, Hide: ["Mouth"], Effect: ["BlockMouth", "GagLight"], - Layer: [ - { Name: "Cheeks", AllowColorize: false }, - { Name: "Cloth", AllowColorize: true } - ] - }, - { - Name: "PantyStuffing", Fetish: ["Lingerie"], Value: 10, Difficulty: -20, Time: 5, DefaultColor: "#900000", Hide: ["Mouth"], Effect: ["BlockMouth", "GagLight"], - Layer: [ - { Name: "Lips", AllowColorize: false }, - { Name: "Cloth", AllowColorize: true } - ] - }, - { - Name: "LargeDildo", Value: 20, Difficulty: -20, Time: 5, DefaultColor: "#333333", BuyGroup: "PenisDildo", Hide: ["Mouth"], ExpressionTrigger: [{ Name: "Raised", Group: "Eyebrows", Timer: 10 }], - Layer: [ - { Name: "Dildo", AllowColorize: true }, - { Name: "Lips", AllowColorize: false } - ] - }, - { Name: "ChloroformCloth", Value: 40, Time: 2, Random: false, Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagVeryLight"], ExpressionTrigger: [{ Name: "High", Group: "Blush", Timer: 20 }, { Name: "Soft", Group: "Eyebrows", Timer: 180 }, { Name: "Wink", Group: "Eyes", Timer: 180 }] }, - { Name: "ScarfGag", Value: 15, Time: 10, BuyGroup: "ScarfGag", Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagLight"], Audio: "ClothKnot", Extended: true }, - { Name: "LewdGag", Value: 70, Time: 10, Random: false, AllowLock: true, BuyGroup: "LewdGag", Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }] }, - { Name: "DeepthroatGag", Fetish: ["Leather"], Value: 55, Difficulty: 5, Time: 15, Random: false, AllowLock: true, DefaultColor: "#404040", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagHeavy"], ExpressionTrigger: [{ Name: "Raised", Group: "Eyebrows", Timer: 10 }] }, - { Name: "LeatherCorsetCollar", Fetish: ["Leather"], Value: 75, Difficulty: 50, Time: 20, RemoveTime: 30, Random: false, AllowLock: true, DefaultColor: "#404040", BuyGroup: "LeatherCorsetCollar", Prerequisite: "GagCorset", Hide: ["Mouth"], Block: ["ItemNeck"] }, - { Name: "LatexPostureCollar", Fetish: ["Latex"], Effect: ["FixedHead","BlockMouth","GagNormal"], Value: 80, Difficulty: 50, Time: 20, RemoveTime: 30, Random: false, AllowLock: true, BuyGroup: "LatexPostureCollar", Prerequisite: "GagCorset", Hide: ["Mouth"], Block: ["ItemNeck"] }, - { - Name: "BitGag", Fetish: ["Leather", "Pony"], Value: 40, Difficulty: 4, Time: 20, AllowLock: true, BuyGroup: "BitGag", Prerequisite: "GagUnique", Effect: ["BlockMouth", "GagNormal"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Bit" }, - { Name: "Straps" }, - ] - }, - { - Name: "XLBoneGag", Fetish: ["Leather", "Pet"], Value: 60, Difficulty: 6, Time: 10, Random: false, AllowLock: true, BuyGroup: "XLBoneGag", Prerequisite: "GagUnique", Effect: ["BlockMouth", "GagNormal"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Bone" }, - { Name: "Straps" }, - ] - }, - { Name: "DogMuzzleExposed", Fetish: ["Leather", "Pet"], Value: 50, Difficulty: 7, Time: 10, Random: false, AllowLock: true, Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Block: ["ItemMouth2", "ItemMouth3"], Effect: ["BlockMouth", "GagNormal", "ProtrudingMouth"]}, - { - Name: "FoxyHarnessPanelGag", Fetish: ["Leather", "Pet"], Value: 40, Difficulty: 6, Time: 20, Random: false, AllowLock: true, Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Prerequisite: "GagFlat", Effect: ["BlockMouth", "GagEasy"], BuyGroup: "FoxyHarnessPanelGag", - Layer: [ - { Name: "Panel" }, - { Name: "Straps" }, - ] - }, - { - Name: "BallGag", Fetish: ["Leather"], Value: 40, Difficulty: 4, Time: 10, AllowLock: true, BuyGroup: "BallGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Extended: true, - Layer: [ - { Name: "Ball" }, - { Name: "Strap", HasType: false}, - ] - }, - { - Name: "TongueStrapGag", Fetish: ["Leather", "Metal"], Value: 35, Difficulty: 4, Time: 15, AllowLock: true, Hide: ["Mouth"], Effect: ["GagEasy", "OpenMouth", "ProtrudingMouth"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Mouth", Priority: 10, AllowColorize: false }, - { Name: "Gag", AllowColorize: true } - ] - }, - { - Name: "BallGagMask", Fetish: ["Leather"], Value: 90, Difficulty: 6, Time: 30, AllowLock: true, BuyGroup: "BallGagMask", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Strap" }, - { Name: "Ball" }, - ] - }, - { - Name: "HookGagMask", Fetish: ["Leather"], Value: 70, Difficulty: 6, Time: 30, AllowLock: true, Hide: ["Mouth"], Effect: ["GagEasy", "OpenMouth"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Mouth", Priority: 10, AllowColorize: false }, - { Name: "Gag", AllowColorize: true } - ] - }, - { - Name: "DildoPlugGag", Fetish: ["Leather"], Value: 100, Difficulty: 6, Time: 20, Random: false, AllowLock: true, BuyGroup: "PlugGag", Prerequisite: "GagUnique", Extended: true, - Hide: ["Mouth"], - Effect: ["GagEasy", "OpenMouth"], - ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], - Layer: [ - { Name: "Strap", AllowColorize: true, HasType: false, }, - { Name: "Tongue", AllowColorize: false, HasType: false }, - { Name: "Close", AllowColorize: true, AllowTypes: ["Plug"] } - ] - }, - { Name: "SteelMuzzleGag", Fetish: ["Metal"], Value: 80, Difficulty: 8, Time: 30, AllowLock: true, Audio: "CuffsMetal", BuyGroup: "SteelMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"] }, - { Name: "StitchedMuzzleGag", Fetish: ["Leather"], Value: 60, Difficulty: 5, Time: 15, AllowLock: true, BuyGroup: "StitchedMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"] }, - { Name: "LatexBallMuzzleGag", Fetish: ["Latex"], Value: 65, Difficulty: 6, Time: 15, AllowLock: true, BuyGroup: "LatexBallMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"] }, - { - Name: "SockStuffing", Value: 10, Difficulty: -20, Time: 5, DefaultColor: "#FFFFFF", Hide: ["Mouth"], Effect: ["BlockMouth", "GagLight"], - Layer: [ - { Name: "Lips", AllowColorize: false }, - { Name: "Cloth", AllowColorize: true } - ] - }, - { Name: "GasMaskGag", Fetish: ["Leather"], Priority: 53, Value: 40, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "GasMaskGag", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing", "ItemNosePigNose"], Effect: ["BlockMouth"], Block: ["ItemMouth2", "ItemMouth3"], - Layer: [ - { Name: "Mask"}, - { Name: "Sides"}, - { Name: "Highlights"}, - ] - }, - { Name: "WebGag", Category: ["Fantasy"], Fetish: ["Tape"], Value: 30, Difficulty: 3, Time: 5, RemoveTime: 10, BuyGroup: "WebGag", CraftGroup: "Web", Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagEasy"] }, - { Name: "RopeGag", Fetish: ["Rope"], Value: 60, Difficulty: 3, Time: 20, RemoveTime: 10, BuyGroup: "HempRope", CraftGroup: "HempRope", Audio: "RopeShort", Prerequisite: "GagUnique", DefaultColor: "#956B1C", Effect: ["BlockMouth", "GagLight"] }, - { Name: "RopeBallGag", Fetish: ["Rope"], Value: 60, Difficulty: 3, Time: 20, RemoveTime: 10, BuyGroup: "HempRope", CraftGroup: "HempRope", Audio: "RopeShort", Prerequisite: "GagUnique", Hide: ["Mouth"], DefaultColor: "#956B1C", Effect: ["BlockMouth", "GagNormal"], Extended: true }, - { Name: "MilkBottle", Category: ["ABDL"], Fetish: ["ABDL"], Priority: 42, Value: 30, Difficulty: -50, Time: 1, Random: false, AllowLock: false, Left: 199, Top: 0, Prerequisite: "GagUnique", Effect: ["GagVeryLight", "ProtrudingMouth"], Block: ["ItemMouth2", "ItemMouth3"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], ParentGroup: null, Extended: true }, - { - Name: "MedicalMask", Value: 25, Time: 10, Random: false, BuyGroup: "MedicalMask", Hide: ["Mouth"], Effect: ["BlockMouth"], HideItem: ["ItemNoseNoseRing"], - Layer: [ - { Name: "Inner" }, - { Name: "Outer" }, - ] - }, - { Name: "RegressedMilk", Category: ["ABDL"], Fetish: ["ABDL"], Value: -1, Time: 10, IsRestraint: false,Random: false, Visible: false, BuyGroup: "RegressedMilk", Block: [], Effect: ["RegressedTalk"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }]}, - { - Name: "PrisonLockdownGag", Value: -1, Difficulty: 5, Time: 20, AllowLock: true, BuyGroup: "PrisonLockdownSuit", Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], - DefaultColor: ["#8c4309", "Default"], - Layer: [ - { Name: "Mask" }, - { Name: "Straps" }, - { Name: "Belts" }, - ] - }, - { - Name: "ShoeGag", Fetish: ["Leather"], Priority: 42, Value: 30, Difficulty: 4, Time: 20, DefaultColor: ["Default", "#000000" ], Random: false, BuyGroup: "ShoeGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium", "ProtrudingMouth"], Block: ["ItemMouth2", "ItemMouth3"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 25 }, { Name: "Daydream", Group: "Eyes", Timer: 10 }], Layer: [ - { Name: "Shoe" }, - { Name: "Strap" }, - ] - }, - { - Name: "FunnelGag", Value: 50, Difficulty: 4, Time: 20, Random: false, Prerequisite: "GagUnique", Extended: true, - Hide: ["Mouth"], - Effect: ["OpenMouth", "GagMedium", "ProtrudingMouth"], - Block: ["ItemMouth2", "ItemMouth3", "ItemHood"], - Layer: [ - { Name: "Straps", AllowColorize: true, HasType: false }, - { Name: "Base", AllowColorize: false, HasType: false }, - { Name: "Funnel", Priority: 55, AllowColorize: false, AllowTypes: ["Funnel"] } - ] - }, - { Name: "PlasticWrap", Value: 100, Difficulty: 4, Time: 30, RemoveTime: 25, BuyGroup: "PlasticWrap", Effect: ["BlockMouth", "GagLight"]}, - { Name: "FuturisticMuzzle", Category: ["SciFi"], Fetish: ["Metal"], Value: -1, Difficulty: 8, Time: 30, BuyGroup: "FuturisticPanelGag", Random: false, AllowLock: true, Audio: "FuturisticApply", FuturisticRecolor: true, - Effect: [ "BlockMouth"], Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Extended: true, DrawLocks: false, - Layer: [ - { Name: "Straps", HasType: false, AllowModuleTypes: ["h1"]}, - { Name: "Nose", HasType: false, AllowModuleTypes: ["n1"]}, - { Name: "Mask", HasType: false,}, - { Name: "IconLock", HasType: false, AllowModuleTypes: ["s1"]}, - { Name: "IconMute", CopyLayerColor: "IconLock", HasType: false, AllowModuleTypes: ["s2"]}, - { Name: "IconX", CopyLayerColor: "IconLock", HasType: false, AllowModuleTypes: ["s3"]}, - ] - }, - { - Name: "CageMuzzle", Fetish: ["Pet", "Metal"], Value: 30, Difficulty: 4, Time: 20, BuyGroup: "CageMuzzle", Random: false, AllowLock: true, Effect: ["BlockMouth", "ProtrudingMouth"], Block: ["ItemMouth2", "ItemMouth3"], - Layer: [ - { Name: "Strap" }, - { Name: "Muzzle" }, - ] - }, - { - Name: "DentalGag", Fetish: ["Metal"], Value: 50, Difficulty: 5, Time: 30, Random: false, AllowLock: true, Block: ["ItemMouth2", "ItemMouth3"], Effect: ["OpenMouth", "GagLight"], Extended: true, - Layer: [ - { Name: "Mouth", AllowColorize: false, }, - { Name: "Gag", AllowColorize: false, }, - ], - }, - { Name: "Ribbons", Value: 30, Difficulty: 3, Time: 10, BuyGroup: "Ribbon", Prerequisite: "GagFlat", Effect: ["BlockMouth", "GagVeryLight"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }, { Name: "HalfOpen", Group: "Mouth", Timer: 60 }], Extended: true }, - { - Name: "CropGag", Value: -1, Priority: 41, Difficulty: -100, Time: 2, Random: false, BuyGroup: "Crop", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagLight", "ProtrudingMouth"], Block: ["ItemMouth2", "ItemMouth3"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], - Layer: [ - { Name: "Crop", AllowColorize: true, Left: 100 }, - { Name: "Mouth", AllowColorize: false }, - ] - }, - { - Name: "CaneGag", Value: -1, Priority: 41, Difficulty: -100, Time: 2, Random: false, BuyGroup: "Cane", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagLight", "ProtrudingMouth"], Block: ["ItemMouth2", "ItemMouth3"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], - Layer: [ - { Name: "Cane", AllowColorize: true, Left: 80 }, - { Name: "Mouth", AllowColorize: false }, - ] - }, - { - Name: "PaciGag", Category: ["ABDL"], Fetish: ["ABDL", "Leather"], Value: 50, Difficulty: 4, Time: 10, Random: false, BuyGroup: "Pacigag", AllowLock: true, DrawLocks: false, Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], - Layer: [ - { Name: "Base" }, - { Name: "Straps" }, - { Name: "Metal" }, - ] - }, - { - Name: "Tentacles", Category: ["Fantasy"], BuyGroup: "Tentacles", Random: false, Value: 250, Difficulty: 6, Time: 5, RemoveTime: 5, DefaultColor: "#9221ba", Prerequisite: ["AccessMouth", "GagUnique"], Effect: ["BlockMouth", "GagMedium", "ProtrudingMouth"], - Layer: [ - { Name: "Base" }, - { Name: "Shine", AllowColorize: false }, - ], - }, - { - Name: "OTNPlugGag", Value: 120, Difficulty: 4, Time: 20, Random: false, AllowLock: true, Prerequisite: "GagFlat", Extended: true, - DefaultColor: ["#665D5D", "#514D57", "#979595"], - Hide: ["Mouth"], - Effect: ["GagMedium", "OpenMouth"], - ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], - Layer: [ - { Name: "Base", AllowColorize: true, HasType: false }, - { Name: "Straps", AllowColorize: true, HasType: false }, - { Name: "Metal", AllowColorize: false, HasType: false }, - { Name: "Tongue", AllowColorize: false, AllowTypes: ["", "Open"]}, - { Name: "Plug", AllowColorize: true, AllowTypes: ["Plug"] }, - ] - }, - { - Name: "PonyGag", Category: ["Pony"], Fetish: ["Leather", "Pony", "Pet"], Value: 150, Difficulty: 5, Time: 8, Random: false, AllowLock: true, DrawLocks: false, BuyGroup: "PonyGag", Prerequisite: "GagUnique", DefaultColor: ["Default", "Default", "#383838", "Default", "#B24031", "#EAEAEA", "Default", "#FF95DB", "#383838", "Default", "#383838", "#956B1C", "#8A7055", "#383838"], Effect: [], Extended: true, AlwaysExtend: true, Bonus: "KidnapBruteForce", Top: -57, Left: 133, - Layer: [ - // Layers: Metal, Straps, Plume, Horn, Panel - { Name: "BaseMetal", HasType: false}, - { Name: "ManeB", HasType: false, AllowModuleTypes: ["t2", "t3", "t4"], InheritColor: "HairFront" }, - { Name: "BaseStraps", HasType: false, ColorGroup: "Straps" }, - - // All Gags - { Name: "Bit", HasType: false, AllowModuleTypes: ["g0"], CopyLayerColor: "BaseMetal" }, - { Name: "BitLarge", HasType: false, AllowModuleTypes: ["g2"] }, - { Name: "BitDepressor", HasType: false, AllowModuleTypes: ["g3"], CopyLayerColor: "BaseMetal" }, - { Name: "BallLips", HasType: false, AllowModuleTypes: ["g4"], InheritColor: "Mouth", AllowColorize: false }, - { Name: "BallStraps", HasType: false, AllowModuleTypes: ["g4"], CopyLayerColor: "BaseStraps" }, - { Name: "Ballgag", HasType: false, AllowModuleTypes: ["g4"], CopyLayerColor: "BitLarge" }, - { Name: "DildoLips", HasType: false, AllowModuleTypes: ["g5"], InheritColor: "Mouth", AllowColorize: false }, - { Name: "Dildo", HasType: false, AllowModuleTypes: ["g5"], CopyLayerColor: "BitLarge" }, - { Name: "DildoMetal", HasType: false, AllowModuleTypes: ["g5"], CopyLayerColor: "BaseMetal", Priority: 42 }, - - //ExtraStraps - { Name: "ExtraMetal", HasType: false, AllowModuleTypes: ["e1", "e2", "b1", "p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8"], CopyLayerColor: "BaseMetal", Priority: 55 }, - { Name: "ExtraStraps", HasType: false, AllowModuleTypes: ["e1", "e2","b1","p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8"], CopyLayerColor: "BaseStraps", Priority: 55 }, - { Name: "Flags", HasType: false, AllowModuleTypes: ["e2"], Priority: 55 }, - { Name: "FlagPoles", HasType: false, AllowModuleTypes: ["e2"], AllowColorize: false, Priority: 55 }, - - // All Top Pieces - { Name: "Plume", HasType: false, AllowModuleTypes: ["t1"] }, - { Name: "PlumeBase", HasType: false, AllowModuleTypes: ["t1"], CopyLayerColor: "BaseMetal"}, - { Name: "ManeL", HasType: false, AllowModuleTypes: ["t2"], InheritColor: "HairFront", HideAs: { Group: "HairAccessory1" } }, - { Name: "ManeLFront", HasType: false, AllowModuleTypes: ["t2"], InheritColor: "HairFront", CopyLayerColor: "ManeL", Priority: 59, HideAs: { Group: "HairAccessory1" } }, - { Name: "ManeR", HasType: false, AllowModuleTypes: ["t3"], InheritColor: "HairFront", CopyLayerColor: "ManeL", HideAs: { Group: "HairAccessory1" } }, - { Name: "ManeRFront", HasType: false, AllowModuleTypes: ["t3"], InheritColor: "HairFront", CopyLayerColor: "ManeL", Priority: 59, HideAs: { Group: "HairAccessory1" } }, - { Name: "Mohawk", HasType: false, AllowModuleTypes:["t4"], InheritColor: "HairFront", CopyLayerColor: "ManeL", Priority: 59 }, - { Name: "MohawkBase", HasType: false, AllowModuleTypes:["t4"], CopyLayerColor: "BaseStraps", Priority: 59}, - - //Horns - { Name: "Horn", HasType: false, AllowModuleTypes: ["h1"], Priority: 58 }, - { Name: "HornShine", HasType: false, AllowModuleTypes: ["h1"], AllowColorize: false, Priority: 58 }, - { Name: "Horn2", HasType: false, AllowModuleTypes: ["h2"], CopyLayerColor: "Horn", Priority: 58 }, - { Name: "Horn2Shine", HasType: false, AllowModuleTypes: ["h2"], AllowColorize: false, Priority: 58 }, - - // All Panels - { Name: "PanelBase", HasType: false, AllowModuleTypes: ["p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8", "p9"], ColorGroup: "Straps", Priority: 55 }, - { Name: "PanelStuds", HasType: false, AllowModuleTypes: ["p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8", "p9"], CopyLayerColor: "BaseMetal", Priority: 55 }, - { Name: "PanelHex", HasType: false, AllowModuleTypes: ["p2"],Priority: 55 }, - { Name: "PanelShield", HasType: false, AllowModuleTypes: ["p3"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelMoon", HasType: false, AllowModuleTypes: ["p4"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelSun", HasType: false, AllowModuleTypes: ["p5"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelHeart", HasType: false, AllowModuleTypes: ["p6"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelHorse", HasType: false, AllowModuleTypes: ["p7"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelTriskel", HasType: false, AllowModuleTypes: ["p8"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelPentacle", HasType: false, AllowModuleTypes: ["p9"], CopyLayerColor: "PanelHex", Priority: 55 }, - - //Reins - { Name: "Reins", HasType: false, AllowModuleTypes: ["r1"], ColorGroup: "Straps" }, - { Name: "Rope", HasType: false, AllowModuleTypes: ["r2"] }, - { Name: "PostReins", HasType: false, AllowModuleTypes: ["r3"], CopyLayerColor: "Reins", HideAs: { Group: "ItemDevices" }, Priority: 55 }, - { Name: "Post", HasType: false, AllowModuleTypes: ["r3"], FixedPosition: true , HideAs: { Group: "ItemDevices" }, Priority: 60 }, - { Name: "PostReinsDetail", HasType: false, AllowModuleTypes: ["r3"], CopyLayerColor: "Reins", HideAs: { Group: "ItemDevices" } , Priority: 60 }, - - - //Blinders - { Name: "Blinders", HasType: false, AllowModuleTypes: ["b1"], ColorGroup: "Straps", Priority: 55 }, - ] - }, //PonyGag - { - Name: "LatexSheathGag", Fetish: ["Latex"], Value: 10, Priority: 11, Difficulty: 0, DefaultColor: ["#CC2222","#CC2222",], Top: 22, Time: 2, RemoveTime: 2, Effect: ["OpenMouth"], Extended: true, AllowExpression: ["Frown", "Sad", "Pained", "Angry", "HalfOpen", "Open", "Ahegao", "Moan", "TonguePinch", "LipBite", "Happy", "Devious", "Laughing", "Grin", "Smirk", "Pout"], - Layer: [ - { Name: "Base", HasType: false, MirrorExpression: "Mouth",}, - { Name: "Shine", HasType: false, MirrorExpression: "Mouth",}, - ], - }, // LatexSheathGag - { - Name: "Slime", Category: ["Fantasy"], BuyGroup: "Slime", DefaultColor: ["#57ab5e"], Random: false, Value: 200, Difficulty: 4, Time: 15, RemoveTime: 25, Left: 200, Top: 170, Effect: ["BlockMouth", "GagMedium"], - }, - { Name: "FurScarf", Value: 40, Top: 0, Left: 0, Difficulty: 3, BuyGroup: "FurScarf", Effect: ["BlockMouth", "GagLight"] }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemMouth2", - Category: "Item", - Priority: 36, - Default: false, - IsRestraint: true, - Left: 150, - Top: 0, - Block: ["ItemMouth"], - Effect: ["BlockMouth", "GagNormal"], - Zone: [[200, 130, 100, 70]], - DynamicGroupName: "ItemMouth", - MirrorActivitiesFrom: "ItemMouth", - Asset: [ - { Name: "ClothGag", Value: -1, Difficulty: -4, Time: 10, Random: false, DefaultColor: "#E0E0E0", BuyGroup: "ClothGag", Prerequisite: "GagFlat", Effect: ["BlockMouth", "GagVeryLight"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], Audio: "ClothKnot", Extended: true }, - { - Name: "WiffleGag", Fetish: ["Leather"], Value: -1, Difficulty: 1, Time: 10, Random: false, AllowLock: true, BuyGroup: "WiffleGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagNormal"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - DefaultColor: ["Default", "#FF6060"], - Extended: true, - Layer: [ - { Name: "Strap" , HasType: false}, - { Name: "Ball" }, - ] - }, - { - Name: "HarnessBallGag", Fetish: ["Leather"], Value: -1, Difficulty: 6, Time: 20, Random: false, AllowLock: true, BuyGroup: "HarnessBallGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - DefaultColor: ["#FF6060", "Default"], - Extended: true, - Layer: [ - { Name: "Ball" }, - { Name: "Harness", HasType: false}, - ] - }, - { - Name: "HarnessPanelGag", Fetish: ["Leather"], Value: -1, Difficulty: 6, Time: 20, Random: false, AllowLock: true, DefaultColor: "#404040", BuyGroup: "HarnessPanelGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], Layer: [ - { Name: "Panel" }, - { Name: "Straps" }, - { Name: "Metal" }, - ] - }, - { - Name: "RingGag", Value: -1, Difficulty: 2, Time: 5, Random: false, AllowLock: true, DefaultColor: "#404040", BuyGroup: "RingGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["GagEasy"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Mouth", Priority: 10, AllowColorize: false }, - { Name: "Gag", AllowColorize: true } - ] - }, - { Name: "DuctTape", Fetish: ["Tape"], Value: -1, Difficulty: -2, Time: 10, RemoveTime: 5, Random: false, BuyGroup: "DuctTape", Audio: "DuctTape", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagVeryLight"], Extended: true }, - { - Name: "HarnessPacifierGag", Category: ["ABDL"], Fetish: ["ABDL", "Leather"], Value: -1, Difficulty: 6, Time: 20, Random: false, AllowLock: true, BuyGroup: "HarnessPacifierGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], - Layer: [ - { Name: "Harness" }, - { Name: "Metal" }, - { Name: "PacifierOuter" }, - { Name: "PacifierInner" }, - ] - }, - { - Name: "DusterGag", Fetish: ["Leather"], Priority: 42, Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "DusterGag", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], Block: ["ItemMouth", "ItemMouth3"], - Layer: [ - { Name: "Duster" }, - { Name: "Panel" }, - ] - }, - { - Name: "CupholderGag", Fetish: ["Leather"], Priority: 42, Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "CupholderGag", Hide: ["Mouth"], Extended: true, AlwaysExtend: true, AlwaysInteract: true, Effect: ["BlockMouth", "GagEasy", "ProtrudingMouth"], Block: ["ItemMouth", "ItemMouth3"], - Layer: [ - { Name: "Gag", HasType: false, AllowTypes: ["", "Cup"] }, - { Name: "Holder", HasType: false, AllowTypes: ["", "Cup"] }, - { Name: "Cup", HasType: false, AllowTypes: ["Cup"] } - ] - }, - { - Name: "HarnessPonyBits", Fetish: ["Leather", "Pony"], Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "HarnessPonyBits", Effect: ["BlockMouth", "GagLight"], Prerequisite: "GagUnique", Extended: true, - Layer: [ - { Name: "Metal" }, - { Name: "Straps", HasType: false }, - { Name: "Bobble", HasType: false }, - ] - }, - { - Name: "KittyGag", Fetish: ["Pet"], Value: 20, Difficulty: -4, Time: 10, Random: false, BuyGroup: "KittyGag", Prerequisite: "GagFlat", DefaultColor: ["#FFFFFF", "#000000", "#E496E7"], Hide: ["Mouth"], Effect: ["BlockMouth"], Layer: [ - { Name: "Base", AllowColorize: true, HasType: false }, - { Name: "Lines", AllowColorize: true, HasType: false }, - { Name: "Mouth", AllowColorize: true, HasType: false }, - ] - }, - { - Name: "KittyHarnessPanelGag", Fetish: ["Leather", "Pet"], Value: 80, Difficulty: 6, Time: 20, Random: false, AllowLock: true, DefaultColor: ["#FFFFFF", "#FFFFFF", "#000000", "#E496E7"], BuyGroup: "KittyHarnessPanelGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], Layer: [ - { Name: "Panel", AllowColorize: true, HasType: false }, - { Name: "Straps", AllowColorize: true, HasType: false }, - { Name: "Lines", AllowColorize: true, HasType: false }, - { Name: "Mouth", AllowColorize: true, HasType: false }, - ] - }, - { - Name: "KittyMuzzleGag", Fetish: ["Leather", "Pet"], Value: 80, Difficulty: 6, Time: 20, Random: false, AllowLock: true, DefaultColor: ["#FFFFFF", "#FFFFFF", "#000000", "#E496E7"], BuyGroup: "KittyMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Layer: [ - { Name: "Muzzle", AllowColorize: true, HasType: false }, - { Name: "Straps", AllowColorize: true, HasType: false }, - { Name: "Lines", AllowColorize: true, HasType: false }, - { Name: "Mouth", AllowColorize: true, HasType: false }, - ] - }, - { - Name: "CarrotGag", Fetish: ["Leather", "Pony"], Value: -1, Difficulty: 3, Time: 15, Random: false, AllowLock: true, BuyGroup: "CarrotGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Carrot" }, - { Name: "Straps" }, - ] - }, - { - Name: "MuzzleGag", Fetish: ["Leather"], Value: -1, Difficulty: 6, Time: 20, Random: false, AllowLock: true, DefaultColor: "#404040", BuyGroup: "MuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Layer: [ - { Name: "Muzzle" }, - { Name: "Straps" }, - ] - }, - { - Name: "PantiesMask", Fetish: ["Lingerie"], Value: -1, Time: 15, Random: false, BuyGroup: "PantiesMask", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagVeryLight"], Layer: [ - { Name: "DarkStripes" }, - { Name: "LightStripes" }, - ] - }, - { - Name: "DildoGag", Fetish: ["Leather"], Priority: 42, Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "DildoGag", Prerequisite: "GagFlat", AllowActivity: ["PenetrateItem"], Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium", "ProtrudingMouth"], Block: ["ItemMouth", "ItemMouth3"], - DefaultColor: ["Default", "#404040"], - Layer: [ - { Name: "Strap" }, - { Name: "Dildo" }, - ] - }, - { - Name: "BoneGag", Fetish: ["Leather", "Pet"], Value: -1, Difficulty: 6, Time: 10, Random: false, AllowLock: true, BuyGroup: "BoneGag", Prerequisite: "GagUnique", Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Bone" }, - { Name: "Straps" }, - ] - }, - { - Name: "HarnessBallGag1", Fetish: ["Leather"], Value: -1, Difficulty: 6, Time: 20, AllowLock: true, BuyGroup: "HarnessBallGag1", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagHeavy"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Ball" }, - { Name: "Strap" }, - ] - }, - { - Name: "PumpkinGag", Fetish: ["Leather"], Value: -1, Difficulty: 1, Time: 10, Random: false, AllowLock: true, BuyGroup: "PumpkinGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Pumpkin" }, - { Name: "Straps" }, - { Name: "Rings" }, - ] - }, - { - Name: "LipGag", Fetish: ["Leather"], Value: -1, Difficulty: 2, Time: 5, DefaultColor: ["#cc3333", "Default", "Default"], Random: false, AllowLock: true, BuyGroup: "LipGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["GagLight", "OpenMouth"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Mouth", Priority: 10, AllowColorize: false }, - { Name: "Lips", AllowColorize: true }, - { Name: "Straps", AllowColorize: true }, - { Name: "Rings", AllowColorize: true }, - ] - }, - { - Name: "SpiderGag", Fetish: ["Leather", "Metal"], Value: -1, Difficulty: 4, Time: 5, Random: false, AllowLock: true, BuyGroup: "SpiderGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["GagEasy", "OpenMouth"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Mouth", Priority: 10, AllowColorize: false }, - { Name: "Gag", AllowColorize: true } - ] - }, - { Name: "ChloroformCloth", Value: -1, Time: 2, Random: false, BuyGroup: "ChloroformCloth", Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagVeryLight"], ExpressionTrigger: [{ Name: "High", Group: "Blush", Timer: 20 }, { Name: "Soft", Group: "Eyebrows", Timer: 180 }, { Name: "Wink", Group: "Eyes", Timer: 180 }] }, - { Name: "ScarfGag", Value: -1, Time: 10, Random: false, BuyGroup: "ScarfGag", Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagLight"], Audio: "ClothKnot", Extended: true }, - { Name: "LewdGag", Value: -1, Time: 10, Random: false, AllowLock: true, BuyGroup: "LewdGag", Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], }, - { Name: "LeatherCorsetCollar", Fetish: ["Leather"], Value: -1, Difficulty: 50, Time: 20, RemoveTime: 30, Random: false, AllowLock: true, DefaultColor: "#404040", BuyGroup: "LeatherCorsetCollar", Prerequisite: "GagCorset", Hide: ["Mouth"], Block: ["ItemNeck", "ItemMouth"], }, - { Name: "LatexPostureCollar", Fetish: ["Latex"], Effect: ["FixedHead", "BlockMouth", "GagNormal"], Value: -1, Difficulty: 50, Time: 20, RemoveTime: 30, Random: false, AllowLock: true, BuyGroup: "LatexPostureCollar", Prerequisite: "GagCorset", Hide: ["Mouth"], Block: ["ItemNeck", "ItemMouth"], }, - { - Name: "BitGag", Fetish: ["Leather", "Pony"], Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "BitGag", Prerequisite: "GagUnique", ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Bit" }, - { Name: "Straps" }, - ] - }, - { - Name: "XLBoneGag", Fetish: ["Leather", "Pet"], Value: -1, Difficulty: 6, Time: 10, Random: false, AllowLock: true, BuyGroup: "XLBoneGag", Prerequisite: "GagUnique", ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Bone" }, - { Name: "Straps" }, - ] - }, - { - Name: "FoxyHarnessPanelGag", Fetish: ["Leather", "Pet"], Value: 40, Difficulty: 6, Time: 20, Random: false, AllowLock: true, Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Prerequisite: "GagFlat", Effect: ["BlockMouth", "GagEasy"], BuyGroup: "FoxyHarnessPanelGag", - Layer: [ - { Name: "Panel" }, - { Name: "Straps" }, - ] - }, - { - Name: "BallGag", Fetish: ["Leather"], Value: -1, Difficulty: 4, Time: 10, AllowLock: true, BuyGroup: "BallGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Extended: true, - Layer: [ - { Name: "Ball" }, - { Name: "Strap", HasType: false}, - ] - }, - { - Name: "BallGagMask", Fetish: ["Leather"], Value: -1, Difficulty: 6, Time: 30, AllowLock: true, BuyGroup: "BallGagMask", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Strap" }, - { Name: "Ball" }, - ] - }, - { Name: "SteelMuzzleGag", Fetish: ["Leather", "Metal"], Value: -1, Difficulty: 8, Time: 30, AllowLock: true, Audio: "CuffsMetal", BuyGroup: "SteelMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], }, - { Name: "StitchedMuzzleGag", Fetish: ["Leather"], Value: -1, Difficulty: 5, Time: 15, AllowLock: true, BuyGroup: "StitchedMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], }, - { Name: "LatexBallMuzzleGag", Fetish: ["Latex"], Value: -1, Difficulty: 6, Time: 15, AllowLock: true, BuyGroup: "LatexBallMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], }, - { Name: "GasMaskGag", Fetish: ["Leather"], Priority: 53, Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "GasMaskGag", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing", "ItemNosePigNose"], Effect: ["BlockMouth"], Prerequisite: "GagFlat", Block: ["ItemMouth", "ItemMouth3"], - Layer: [ - { Name: "Mask"}, - { Name: "Sides"}, - { Name: "Highlights"}, - ] - }, - { Name: "WebGag", Category: ["Fantasy"], Fetish: ["Tape"], Value: -1, Difficulty: 3, Time: 5, RemoveTime: 10, BuyGroup: "WebGag", CraftGroup: "Web", Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagLight"], }, - { Name: "RopeGag", Fetish: ["Rope"], Value: -1, Difficulty: 3, Time: 20, RemoveTime: 10, Audio: "RopeShort", Prerequisite: "GagUnique", DefaultColor: "#956B1C", BuyGroup: "HempRope", CraftGroup: "HempRope", Effect: ["BlockMouth", "GagLight"], }, - { Name: "RopeBallGag", Fetish: ["Rope"], Value: -1, Difficulty: 3, Time: 20, RemoveTime: 10, Audio: "RopeShort", Prerequisite: "GagUnique", Hide: ["Mouth"], DefaultColor: "#956B1C", BuyGroup: "HempRope", CraftGroup: "HempRope", Effect: ["BlockMouth", "GagNormal"], Extended: true }, - { - Name: "MedicalMask", Value: -1, Time: 10, Random: false, BuyGroup: "MedicalMask", Hide: ["Mouth"], Effect: ["BlockMouth"], HideItem: ["ItemNoseNoseRing"], - Layer: [ - { Name: "Inner" }, - { Name: "Outer" }, - ] - }, - { Name: "RegressedMilk", Category: ["ABDL"], Fetish: ["ABDL"], Value: -1, Time: 10, IsRestraint: false,Random: false, Visible: false, BuyGroup: "RegressedMilk", Block: [], Effect: ["RegressedTalk"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }]}, - { - Name: "PrisonLockdownGag", Value: -1, Difficulty: 5, Time: 20, AllowLock: true, BuyGroup: "PrisonLockdownSuit", Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], - DefaultColor: ["#8c4309", "Default"], - Layer: [ - { Name: "Mask" }, - { Name: "Straps" }, - { Name: "Belts" }, - ] - }, - { - Name: "ShoeGag", Fetish: ["Leather"], Priority: 42, Value: -1, Difficulty: 4, Time: 20, DefaultColor: ["Default", "#000000"], Random: false, BuyGroup: "ShoeGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium", "ProtrudingMouth"], Block: ["ItemMouth", "ItemMouth3"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 25 }, { Name: "Daydream", Group: "Eyes", Timer: 10 }], Layer: [ - { Name: "Shoe" }, - { Name: "Strap" }, - ] - }, - { Name: "PlasticWrap", Value: 100, Difficulty: 4, Time: 30, RemoveTime: 25, BuyGroup: "PlasticWrap", Effect: ["BlockMouth", "GagLight"]}, - { Name: "FuturisticMuzzle", Category: ["SciFi"], Fetish: ["Metal"], Value: -1, Difficulty: 8, Time: 30, BuyGroup: "FuturisticPanelGag", Random: false, AllowLock: true, Audio: "FuturisticApply", FuturisticRecolor: true, - Effect: [ "BlockMouth"], Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Block: ["ItemMouth"], Extended: true, DrawLocks: false, - Layer: [ - { Name: "Straps", HasType: false, AllowModuleTypes: ["h1"]}, - { Name: "Nose", HasType: false, AllowModuleTypes: ["n1"]}, - { Name: "Mask", HasType: false,}, - { Name: "IconLock", HasType: false, AllowModuleTypes: ["s1"]}, - { Name: "IconMute", CopyLayerColor: "IconLock", HasType: false, AllowModuleTypes: ["s2"]}, - { Name: "IconX", CopyLayerColor: "IconLock", HasType: false, AllowModuleTypes: ["s3"]}, - ] - }, - { - Name: "CageMuzzle", Fetish: ["Pet", "Metal"], Value: 30, Difficulty: 4, Time: 20, BuyGroup: "CageMuzzle", Random: false, AllowLock: true, Effect: ["BlockMouth", "ProtrudingMouth"], Block: ["ItemMouth", "ItemMouth3"], - Layer: [ - { Name: "Strap" }, - { Name: "Muzzle" }, - ] - }, - { Name: "Ribbons", Value: 30, Difficulty: 3, Time: 10, BuyGroup: "Ribbon", Prerequisite: "GagFlat", Effect: ["BlockMouth", "GagVeryLight"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }, { Name: "HalfOpen", Group: "Mouth", Timer: 60 }], Extended: true }, - { - Name: "PaciGag", Category: ["ABDL"], Fetish: ["ABDL", "Leather"], Value: -1, Difficulty: 4, Time: 10, Random: false, BuyGroup: "Pacigag", AllowLock: true, DrawLocks: false, Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], - Layer: [ - { Name: "Base" }, - { Name: "Straps" }, - { Name: "Metal" }, - ] - }, - { - Name: "Tentacles", Category: ["Fantasy"], BuyGroup: "Tentacles", Random: false, Value: -1, Difficulty: 6, Time: 5, RemoveTime: 5, DefaultColor: "#9221ba", Prerequisite: ["AccessMouth", "GagUnique"], Effect: ["BlockMouth", "GagMedium", "ProtrudingMouth"], - Layer: [ - { Name: "Base" }, - { Name: "Shine", AllowColorize: false }, - ], - }, - { - Name: "PonyGag", Category: ["Pony"], Fetish: ["Leather", "Pony", "Pet"], Value: 150, Difficulty: 5, Time: 8, Random: false, AllowLock: true, DrawLocks: false, BuyGroup: "PonyGag", Prerequisite: "GagUnique", DefaultColor: ["Default", "Default", "#383838", "Default", "#B24031", "#EAEAEA", "Default", "#FF95DB", "#383838", "Default", "#383838", "#956B1C", "#8A7055", "#383838"], Effect: [], Extended: true, AlwaysExtend: true, Bonus: "KidnapBruteForce", Top: -57, Left: 133, - Layer: [ - // Layers: Metal, Straps, Plume, Horn, Panel - { Name: "BaseMetal", HasType: false}, - { Name: "ManeB", HasType: false, AllowModuleTypes: ["t2", "t3", "t4"], InheritColor: "HairFront" }, - { Name: "BaseStraps", HasType: false, ColorGroup: "Straps" }, - - // All Gags - { Name: "Bit", HasType: false, AllowModuleTypes: ["g0"], CopyLayerColor: "BaseMetal" }, - { Name: "BitLarge", HasType: false, AllowModuleTypes: ["g2"] }, - { Name: "BitDepressor", HasType: false, AllowModuleTypes: ["g3"], CopyLayerColor: "BaseMetal" }, - { Name: "BallLips", HasType: false, AllowModuleTypes: ["g4"], InheritColor: "Mouth", AllowColorize: false }, - { Name: "BallStraps", HasType: false, AllowModuleTypes: ["g4"], CopyLayerColor: "BaseStraps" }, - { Name: "Ballgag", HasType: false, AllowModuleTypes: ["g4"], CopyLayerColor: "BitLarge" }, - { Name: "DildoLips", HasType: false, AllowModuleTypes: ["g5"], InheritColor: "Mouth", AllowColorize: false }, - { Name: "Dildo", HasType: false, AllowModuleTypes: ["g5"], CopyLayerColor: "BitLarge" }, - { Name: "DildoMetal", HasType: false, AllowModuleTypes: ["g5"], CopyLayerColor: "BaseMetal" }, - - //ExtraStraps - { Name: "ExtraMetal", HasType: false, AllowModuleTypes: ["e1", "e2", "b1", "p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8"], CopyLayerColor: "BaseMetal", Priority: 55 }, - { Name: "ExtraStraps", HasType: false, AllowModuleTypes: ["e1", "e2","b1","p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8"], ColorGroup: "BaseStraps", Priority: 55 }, - { Name: "Flags", HasType: false, AllowModuleTypes: ["e2"], Priority: 55 }, - { Name: "FlagPoles", HasType: false, AllowModuleTypes: ["e2"], AllowColorize: false, Priority: 55 }, - - // All Top Pieces - { Name: "Plume", HasType: false, AllowModuleTypes: ["t1"] }, - { Name: "PlumeBase", HasType: false, AllowModuleTypes: ["t1"], CopyLayerColor: "BaseMetal"}, - { Name: "ManeL", HasType: false, AllowModuleTypes: ["t2"], InheritColor: "HairFront", HideAs: { Group: "HairAccessory1" } }, - { Name: "ManeLFront", HasType: false, AllowModuleTypes: ["t2"], InheritColor: "HairFront", CopyLayerColor: "ManeL", Priority: 59, HideAs: { Group: "HairAccessory1" } }, - { Name: "ManeR", HasType: false, AllowModuleTypes: ["t3"], InheritColor: "HairFront", CopyLayerColor: "ManeL", HideAs: { Group: "HairAccessory1" } }, - { Name: "ManeRFront", HasType: false, AllowModuleTypes: ["t3"], InheritColor: "HairFront", CopyLayerColor: "ManeL", Priority: 59, HideAs: { Group: "HairAccessory1" } }, - { Name: "Mohawk", HasType: false, AllowModuleTypes:["t4"], InheritColor: "HairFront", CopyLayerColor: "ManeL", Priority: 59 }, - { Name: "MohawkBase", HasType: false, AllowModuleTypes:["t4"], CopyLayerColor: "BaseStraps", Priority: 59}, - - //Horns - { Name: "Horn", HasType: false, AllowModuleTypes: ["h1"], Priority: 58 }, - { Name: "HornShine", HasType: false, AllowModuleTypes: ["h1"], AllowColorize: false, Priority: 58 }, - { Name: "Horn2", HasType: false, AllowModuleTypes: ["h2"], CopyLayerColor: "Horn", Priority: 58 }, - { Name: "Horn2Shine", HasType: false, AllowModuleTypes: ["h2"], AllowColorize: false, Priority: 58 }, - - // All Panels - { Name: "PanelBase", HasType: false, AllowModuleTypes: ["p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8", "p9"], ColorGroup: "Straps", Priority: 55 }, - { Name: "PanelStuds", HasType: false, AllowModuleTypes: ["p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8", "p9"], CopyLayerColor: "BaseMetal", Priority: 55 }, - { Name: "PanelHex", HasType: false, AllowModuleTypes: ["p2"],Priority: 55 }, - { Name: "PanelShield", HasType: false, AllowModuleTypes: ["p3"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelMoon", HasType: false, AllowModuleTypes: ["p4"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelSun", HasType: false, AllowModuleTypes: ["p5"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelHeart", HasType: false, AllowModuleTypes: ["p6"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelHorse", HasType: false, AllowModuleTypes: ["p7"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelTriskel", HasType: false, AllowModuleTypes: ["p8"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelPentacle", HasType: false, AllowModuleTypes: ["p9"], CopyLayerColor: "PanelHex", Priority: 55 }, - - //Reins - { Name: "Reins", HasType: false, AllowModuleTypes: ["r1"], ColorGroup: "Straps" }, - { Name: "Rope", HasType: false, AllowModuleTypes: ["r2"] }, - { Name: "PostReins", HasType: false, AllowModuleTypes: ["r3"], CopyLayerColor: "Reins", HideAs: { Group: "ItemDevices" }, Priority: 55 }, - { Name: "Post", HasType: false, AllowModuleTypes: ["r3"], FixedPosition: true , HideAs: { Group: "ItemDevices" }, Priority: 60 }, - { Name: "PostReinsDetail", HasType: false, AllowModuleTypes: ["r3"], CopyLayerColor: "Reins", HideAs: { Group: "ItemDevices" } , Priority: 60 }, - - - //Blinders - { Name: "Blinders", HasType: false, AllowModuleTypes: ["b1"], ColorGroup: "Straps", Priority: 55 }, - ] - }, //PonyGag - { - Name: "MouthFeatureGag", Fetish: ["Latex"], Value: 40, Difficulty: 5, Prerequisite: "GagUnique", DefaultColor: ["#222222", "#444444", "#CC2222", "#CC2222",], Top: 22 , Time: 5, RemoveTime: 7, HideItem: ["ItemMouthLatexSheathGag"], Effect: ["GagVeryLight","OpenMouth"], Extended: false, AllowExpression: ["Frown", "Sad", "Pained", "Angry", "HalfOpen", "Open", "Ahegao", "Moan", "TonguePinch", "LipBite", "Happy", "Devious", "Laughing", "Grin", "Smirk", "Pout"], - Layer: [ - { Name: "Panel", HasType: false,}, - { Name: "PanelShine", HasType: false,}, - { Name: "Base", HasType: false, MirrorExpression: "Mouth",}, - { Name: "Shine", HasType: false, MirrorExpression: "Mouth",}, - { Name: "Lip", HasType: false, CopyLayerColor: "Panel", MirrorExpression: "Mouth",}, - { Name: "LipShine", HasType: false, CopyLayerColor: "PanelShine", MirrorExpression: "Mouth",}, - ], - }, // MouthFeatureGag - { - Name: "Slime", Category: ["Fantasy"], BuyGroup: "Slime", DefaultColor: ["#57ab5e"], Random: false, Value: 200, Difficulty: 4, Time: 15, RemoveTime: 25, Left: 200, Top: 170, Effect: ["BlockMouth", "GagMedium"], - }, - { Name: "FurScarf", Value: 40, Top: 0, Left: 0, Difficulty: 3, BuyGroup: "FurScarf", Effect: ["BlockMouth", "GagLight"] }, - - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemMouth3", - Category: "Item", - Priority: 37, - Default: false, - IsRestraint: true, - Left: 150, - Top: 0, - Block: ["ItemMouth", "ItemMouth2"], - Effect: ["BlockMouth", "GagNormal"], - Zone: [[300, 130, 100, 70]], - DynamicGroupName: "ItemMouth", - MirrorActivitiesFrom: "ItemMouth", - Asset: [ - { Name: "ClothGag", Value: -1, Difficulty: -4, Time: 10, Random: false, DefaultColor: "#E0E0E0", BuyGroup: "ClothGag", Effect: ["BlockMouth", "GagVeryLight"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], Audio: "ClothKnot", Extended: true }, - { - Name: "WiffleGag", Fetish: ["Leather"], Value: -1, Difficulty: 1, Time: 10, Random: false, AllowLock: true, BuyGroup: "WiffleGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagNormal"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - DefaultColor: ["Default", "#FF6060"], - Extended: true, - Layer: [ - { Name: "Strap" , HasType: false}, - { Name: "Ball" }, - ] - }, - { - Name: "HarnessBallGag", Fetish: ["Leather"], Value: -1, Difficulty: 6, Time: 20, Random: false, AllowLock: true, BuyGroup: "HarnessBallGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - DefaultColor: ["#FF6060", "Default"], Extended: true, - Layer: [ - { Name: "Ball" }, - { Name: "Harness", HasType: false}, - ] - }, - { - Name: "HarnessPanelGag", Fetish: ["Leather"], Value: -1, Difficulty: 6, Time: 20, Random: false, AllowLock: true, DefaultColor: "#404040", BuyGroup: "HarnessPanelGag", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], Layer: [ - { Name: "Panel" }, - { Name: "Straps" }, - { Name: "Metal" }, - ] - }, - { - Name: "RingGag", Fetish: ["Leather", "Metal"], Value: -1, Difficulty: 2, Time: 5, Random: false, AllowLock: true, DefaultColor: "#404040", BuyGroup: "RingGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["GagEasy"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Mouth", Priority: 10, AllowColorize: false }, - { Name: "Gag", AllowColorize: true } - ] - }, - { Name: "DuctTape", Fetish: ["Tape"], Value: -1, Difficulty: -2, Time: 10, RemoveTime: 5, Random: false, BuyGroup: "DuctTape", Audio: "DuctTape", Hide: ["Mouth"], Effect: ["BlockMouth", "GagVeryLight"], Extended: true }, - { - Name: "HarnessPacifierGag", Category: ["ABDL"], Fetish: ["ABDL", "Leather"], Value: -1, Difficulty: 6, Time: 20, Random: false, AllowLock: true, BuyGroup: "HarnessPacifierGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], - Layer: [ - { Name: "Harness" }, - { Name: "Metal" }, - { Name: "PacifierOuter" }, - { Name: "PacifierInner" }, - ] - }, - { - Name: "DusterGag", Fetish: ["Leather"], Priority: 42, Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "DusterGag", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], - Layer: [ - { Name: "Duster" }, - { Name: "Panel" }, - ] - }, - { - Name: "CupholderGag", Fetish: ["Leather"], Priority: 42, Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "CupholderGag", Hide: ["Mouth"], Extended: true, AlwaysExtend: true, AlwaysInteract: true, Effect: ["BlockMouth", "GagEasy", "ProtrudingMouth"], - Layer: [ - { Name: "Gag", HasType: false, AllowTypes: ["", "Cup"] }, - { Name: "Holder", HasType: false, AllowTypes: ["", "Cup"] }, - { Name: "Cup", HasType: false, AllowTypes: ["Cup"] } - ] - }, - { - Name: "HarnessPonyBits", Fetish: ["Leather", "Pony"], Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "HarnessPonyBits", Effect: ["BlockMouth", "GagLight"], Prerequisite: "GagUnique", Extended: true, - Layer: [ - { Name: "Metal" }, - { Name: "Straps", HasType: false }, - { Name: "Bobble", HasType: false }, - ] - }, - { - Name: "KittyGag", Fetish: ["Pet"], Value: 20, Difficulty: -4, Time: 10, Random: false, BuyGroup: "KittyGag", Prerequisite: "GagFlat", DefaultColor: ["#FFFFFF", "#000000", "#E496E7"], Hide: ["Mouth"], Effect: ["BlockMouth"], Layer: [ - { Name: "Base", AllowColorize: true, HasType: false }, - { Name: "Lines", AllowColorize: true, HasType: false }, - { Name: "Mouth", AllowColorize: true, HasType: false }, - ] - }, - { - Name: "KittyHarnessPanelGag", Fetish: ["Leather", "Pet"], Value: 80, Difficulty: 6, Time: 20, Random: false, AllowLock: true, DefaultColor: ["#FFFFFF", "#FFFFFF", "#000000", "#E496E7"], BuyGroup: "KittyHarnessPanelGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], Layer: [ - { Name: "Panel", AllowColorize: true, HasType: false }, - { Name: "Straps", AllowColorize: true, HasType: false }, - { Name: "Lines", AllowColorize: true, HasType: false }, - { Name: "Mouth", AllowColorize: true, HasType: false }, - ] - }, - { - Name: "KittyMuzzleGag", Fetish: ["Leather", "Pet"], Value: 80, Difficulty: 6, Time: 20, Random: false, AllowLock: true, DefaultColor: ["#FFFFFF", "#FFFFFF", "#000000", "#E496E7"], BuyGroup: "KittyMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Layer: [ - { Name: "Muzzle", AllowColorize: true, HasType: false }, - { Name: "Straps", AllowColorize: true, HasType: false }, - { Name: "Lines", AllowColorize: true, HasType: false }, - { Name: "Mouth", AllowColorize: true, HasType: false }, - ] - }, - { - Name: "CarrotGag", Fetish: ["Leather", "Pony"], Value: -1, Difficulty: 3, Time: 15, Random: false, AllowLock: true, BuyGroup: "CarrotGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Carrot" }, - { Name: "Straps" }, - ] - }, - { - Name: "MuzzleGag", Fetish: ["Leather"], Value: -1, Difficulty: 6, Time: 20, Random: false, AllowLock: true, DefaultColor: "#404040", BuyGroup: "MuzzleGag", Hide: ["Mouth"], Layer: [ - { Name: "Muzzle" }, - { Name: "Straps" }, - ] - }, - { - Name: "PantiesMask", Fetish: ["Lingerie"], Value: -1, Time: 15, Random: false, BuyGroup: "PantiesMask", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagVeryLight"], Layer: [ - { Name: "DarkStripes" }, - { Name: "LightStripes" }, - ] - }, - { - Name: "DildoGag", Fetish: ["Leather"], Priority: 42, Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "DildoGag", Prerequisite: "GagFlat", AllowActivity: ["PenetrateItem"], Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium", "ProtrudingMouth"], - DefaultColor: ["Default", "#404040"], - Layer: [ - { Name: "Strap" }, - { Name: "Dildo" }, - ] - }, - { - Name: "BoneGag", Fetish: ["Leather", "Pet"], Value: -1, Difficulty: 6, Time: 10, Random: false, AllowLock: true, BuyGroup: "BoneGag", Prerequisite: "GagUnique", Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Bone" }, - { Name: "Straps" }, - ] - }, - { - Name: "HarnessBallGag1", Value: -1, Difficulty: 6, Time: 20, AllowLock: true, BuyGroup: "HarnessBallGag1", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagHeavy"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Ball" }, - { Name: "Strap" }, - ] - }, - { - Name: "PumpkinGag", Fetish: ["Leather"], Value: -1, Difficulty: 1, Time: 10, Random: false, AllowLock: true, BuyGroup: "PumpkinGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Pumpkin" }, - { Name: "Straps" }, - { Name: "Rings" }, - ] - }, - { - Name: "LipGag", Fetish: ["Leather"], Value: -1, Difficulty: 2, Time: 5, DefaultColor: ["#cc3333", "Default", "Default"], Random: false, AllowLock: true, BuyGroup: "LipGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["GagLight", "OpenMouth"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Mouth", Priority: 10, AllowColorize: false }, - { Name: "Lips", AllowColorize: true }, - { Name: "Straps", AllowColorize: true }, - { Name: "Rings", AllowColorize: true }, - ] - }, - { - Name: "SpiderGag", Fetish: ["Leather", "Metal"], Value: -1, Difficulty: 4, Time: 5, Random: false, AllowLock: true, BuyGroup: "SpiderGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["GagEasy", "OpenMouth"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Mouth", Priority: 10, AllowColorize: false }, - { Name: "Gag", AllowColorize: true } - ] - }, - { Name: "ChloroformCloth", Value: -1, Time: 2, Random: false, BuyGroup: "ChloroformCloth", Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagVeryLight"], ExpressionTrigger: [{ Name: "High", Group: "Blush", Timer: 20 }, { Name: "Soft", Group: "Eyebrows", Timer: 180 }, { Name: "Wink", Group: "Eyes", Timer: 180 }], }, - { Name: "ScarfGag", Value: -1, Time: 10, Random: false, BuyGroup: "ScarfGag", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagLight"], Audio: "ClothKnot", Extended: true }, - { Name: "LewdGag", Value: -1, Time: 10, Random: false, AllowLock: true, BuyGroup: "LewdGag", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], }, - { Name: "LeatherCorsetCollar", Fetish: ["Leather"], Value: -1, Difficulty: 50, Time: 20, RemoveTime: 30, Random: false, AllowLock: true, DefaultColor: "#404040", BuyGroup: "LeatherCorsetCollar", Prerequisite: "GagCorset", Hide: ["Mouth"], Block: ["ItemNeck", "ItemMouth", "ItemMouth2"], }, - { Name: "LatexPostureCollar", Fetish: ["Latex"], Effect: ["FixedHead", "BlockMouth", "GagNormal"], Value: -1, Difficulty: 50, Time: 20, RemoveTime: 30, Random: false, AllowLock: true, BuyGroup: "LatexPostureCollar", Prerequisite: "GagCorset", Hide: ["Mouth"], Block: ["ItemNeck", "ItemMouth", "ItemMouth2"], }, - { - Name: "BitGag", Fetish: ["Leather", "Pony"], Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "BitGag", Prerequisite: "GagUnique", ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Bit" }, - { Name: "Straps" }, - ] - }, - { - Name: "XLBoneGag", Fetish: ["Leather", "Pet"], Value: -1, Difficulty: 6, Time: 10, Random: false, AllowLock: true, BuyGroup: "XLBoneGag", Prerequisite: "GagUnique", ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Bone" }, - { Name: "Straps" }, - ] - }, - { - Name: "FoxyHarnessPanelGag", Fetish: ["Leather", "Pet"], Value: 40, Difficulty: 6, Time: 20, Random: false, AllowLock: true, Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Prerequisite: "GagFlat", Effect: ["BlockMouth", "GagEasy"], BuyGroup: "FoxyHarnessPanelGag", - Layer: [ - { Name: "Panel" }, - { Name: "Straps" }, - ] - }, - { - Name: "BallGag", Fetish: ["Leather"], Value: -1, Difficulty: 4, Time: 10, AllowLock: true, BuyGroup: "BallGag", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Extended: true, - Layer: [ - { Name: "Ball" }, - { Name: "Strap", HasType: false}, - ] - }, - { - Name: "BallGagMask", Fetish: ["Leather"], Value: -1, Difficulty: 6, Time: 30, AllowLock: true, BuyGroup: "BallGagMask", Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }], - Layer: [ - { Name: "Strap" }, - { Name: "Ball" }, - ] - }, - { Name: "SteelMuzzleGag", Fetish: ["Metal"], Value: -1, Difficulty: 8, Time: 30, AllowLock: true, Audio: "CuffsMetal", BuyGroup: "SteelMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"] }, - { Name: "StitchedMuzzleGag", Fetish: ["Leather"], Value: -1, Difficulty: 5, Time: 15, AllowLock: true, BuyGroup: "StitchedMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagEasy"] }, - { Name: "LatexBallMuzzleGag", Fetish: ["Latex"], Value: -1, Difficulty: 6, Time: 15, AllowLock: true, BuyGroup: "LatexBallMuzzleGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium"] }, - { Name: "GasMaskGag", Fetish: ["Leather"], Priority: 53, Value: -1, Difficulty: 4, Time: 20, Random: false, AllowLock: true, BuyGroup: "GasMaskGag", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing", "ItemNosePigNose"], Effect: ["BlockMouth"], Prerequisite: "GagFlat", Block: ["ItemMouth", "ItemMouth2"], - Layer: [ - { Name: "Mask"}, - { Name: "Sides"}, - { Name: "Highlights"}, - ] - }, - { Name: "WebGag", Category: ["Fantasy"], Fetish: ["Tape"], Value: -1, Difficulty: 3, Time: 5, RemoveTime: 10, BuyGroup: "WebGag", CraftGroup: "Web", Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Effect: ["BlockMouth", "GagLight"] }, - { Name: "RopeGag", Fetish: ["Rope"], Value: -1, Difficulty: 3, Time: 20, RemoveTime: 10, Audio: "RopeShort", Prerequisite: "GagUnique", DefaultColor: "#956B1C", BuyGroup: "HempRope", CraftGroup: "HempRope", Effect: ["BlockMouth", "GagLight"] }, - { Name: "RopeBallGag", Fetish: ["Rope"], Value: -1, Difficulty: 3, Time: 20, RemoveTime: 10, Audio: "RopeShort", Prerequisite: "GagUnique", Hide: ["Mouth"], DefaultColor: "#956B1C", BuyGroup: "HempRope", CraftGroup: "HempRope", Effect: ["BlockMouth", "GagNormal"], Extended: true }, - { - Name: "MedicalMask", Value: -1, Time: 10, Random: false, BuyGroup: "MedicalMask", Hide: ["Mouth"], Effect: ["BlockMouth"], HideItem: ["ItemNoseNoseRing"], - Layer: [ - { Name: "Inner" }, - { Name: "Outer" }, - ] - }, - { Name: "RegressedMilk", Category: ["ABDL"], Fetish: ["ABDL"], Value: -1, Time: 10, IsRestraint: false,Random: false, Visible: false, BuyGroup: "RegressedMilk", Block: [], Effect: ["RegressedTalk"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }] }, - { - Name: "PrisonLockdownGag", Value: -1, Difficulty: 5, Time: 20, AllowLock: true, BuyGroup: "PrisonLockdownSuit", Prerequisite: "GagFlat", DefaultColor: ["#8c4309", "Default"], Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], - Layer: [ - { Name: "Mask" }, - { Name: "Straps" }, - { Name: "Belts" }, - ] - }, - { - Name: "ShoeGag", Fetish: ["Leather"], Priority: 42, Value: -1, Difficulty: 4, Time: 20, DefaultColor: ["Default", "#000000"], Random: false, BuyGroup: "ShoeGag", Prerequisite: "GagFlat", Hide: ["Mouth"], Effect: ["BlockMouth", "GagMedium", "ProtrudingMouth"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 25 }, { Name: "Daydream", Group: "Eyes", Timer: 10 }], Layer: [ - { Name: "Shoe" }, - { Name: "Strap" }, - ] - }, - { Name: "FuturisticMuzzle", Category: ["SciFi"], Fetish: ["Metal"], Priority: 42, Value: -1, Difficulty: 8, Time: 30, BuyGroup: "FuturisticPanelGag", Random: false, AllowLock: true, Audio: "FuturisticApply", FuturisticRecolor: true, - Effect: [ "BlockMouth"], Prerequisite: "GagFlat", Hide: ["Mouth"], HideItem: ["ItemNoseNoseRing"], Block: ["ItemMouth", "ItemMouth2"], Extended: true, DrawLocks: false, - Layer: [ - { Name: "Straps", HasType: false, AllowModuleTypes: ["h1"]}, - { Name: "Nose", HasType: false, AllowModuleTypes: ["n1"]}, - { Name: "Mask", HasType: false,}, - { Name: "IconLock", HasType: false, AllowModuleTypes: ["s1"]}, - { Name: "IconMute", CopyLayerColor: "IconLock", HasType: false, AllowModuleTypes: ["s2"]}, - { Name: "IconX", CopyLayerColor: "IconLock", HasType: false, AllowModuleTypes: ["s3"]}, - ] - }, - { - Name: "CageMuzzle", Fetish: ["Pet", "Metal"], Value: 30, Difficulty: 4, Time: 20, BuyGroup: "CageMuzzle", Random: false, AllowLock: true, Effect: ["BlockMouth", "ProtrudingMouth"], - Layer: [ - { Name: "Strap" }, - { Name: "Muzzle" }, - ] - }, - { Name: "PlasticWrap", Value: 100, Difficulty: 4, Time: 30, RemoveTime: 25, BuyGroup: "PlasticWrap", Effect: ["BlockMouth", "GagLight"]}, - { Name: "Ribbons", Value: 30, Difficulty: 3, Time: 10, BuyGroup: "Ribbon", Prerequisite: "GagFlat", Effect: ["BlockMouth", "GagVeryLight"], ExpressionTrigger: [{ Name: "DroolSides", Group: "Fluids", Timer: 30 }, { Name: "HalfOpen", Group: "Mouth", Timer: 60 }], Extended: true }, - { - Name: "PaciGag", Category: ["ABDL"], Fetish: ["ABDL", "Leather"], Value: -1, Difficulty: 4, Time: 10, Random: false, BuyGroup: "Pacigag", AllowLock: true, DrawLocks: false,Prerequisite: "GagUnique", Hide: ["Mouth"], Effect: ["BlockMouth", "GagLight"], ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], - Layer: [ - { Name: "Base" }, - { Name: "Straps" }, - { Name: "Metal" }, - ] - }, - { - Name: "Tentacles", Category: ["Fantasy"], BuyGroup: "Tentacles", Random: false, Value: -1, Difficulty: 6, Time: 5, RemoveTime: 5, DefaultColor: "#9221ba", Prerequisite: ["AccessMouth", "GagUnique"], Effect: ["BlockMouth", "GagMedium", "ProtrudingMouth"], - Layer: [ - { Name: "Base" }, - { Name: "Shine", AllowColorize: false }, - ], - }, - { - Name: "PonyGag", Category: ["Pony"], Fetish: ["Leather", "Pony", "Pet"], Value: 150, Difficulty: 5, Time: 8, Random: false, AllowLock: true, DrawLocks: false, BuyGroup: "PonyGag", Prerequisite: "GagUnique", DefaultColor: ["Default", "Default", "#383838", "Default", "#B24031", "#EAEAEA", "Default", "#FF95DB", "#383838", "Default", "#383838", "#956B1C", "#8A7055", "#383838"], Effect: [], Extended: true, AlwaysExtend: true, Bonus: "KidnapBruteForce", Top: -57, Left: 133, - Layer: [ - // Layers: Metal, Straps, Plume, Horn, Panel - { Name: "BaseMetal", HasType: false}, - { Name: "ManeB", HasType: false, AllowModuleTypes: ["t2", "t3", "t4"], InheritColor: "HairFront" }, - { Name: "BaseStraps", HasType: false, ColorGroup: "Straps" }, - - // All Gags - { Name: "Bit", HasType: false, AllowModuleTypes: ["g0"], CopyLayerColor: "BaseMetal" }, - { Name: "BitLarge", HasType: false, AllowModuleTypes: ["g2"] }, - { Name: "BitDepressor", HasType: false, AllowModuleTypes: ["g3"], CopyLayerColor: "BaseMetal" }, - { Name: "BallLips", HasType: false, AllowModuleTypes: ["g4"], InheritColor: "Mouth", AllowColorize: false }, - { Name: "BallStraps", HasType: false, AllowModuleTypes: ["g4"], CopyLayerColor: "BaseStraps" }, - { Name: "Ballgag", HasType: false, AllowModuleTypes: ["g4"], CopyLayerColor: "BitLarge" }, - { Name: "DildoLips", HasType: false, AllowModuleTypes: ["g4"], InheritColor: "Mouth", AllowColorize: false }, - { Name: "Dildo", HasType: false, AllowModuleTypes: ["g4"], CopyLayerColor: "BitLarge" }, - { Name: "DildoMetal", HasType: false, AllowModuleTypes: ["g4"], CopyLayerColor: "BaseMetal" }, - - //ExtraStraps - { Name: "ExtraMetal", HasType: false, AllowModuleTypes: ["e1", "e2", "b1", "p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8"], CopyLayerColor: "BaseMetal", Priority: 55 }, - { Name: "ExtraStraps", HasType: false, AllowModuleTypes: ["e1", "e2","b1","p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8"], CopyLayerColor: "BaseStraps", Priority: 55 }, - { Name: "Flags", HasType: false, AllowModuleTypes: ["e2"], Priority: 55 }, - { Name: "FlagPoles", HasType: false, AllowModuleTypes: ["e2"], AllowColorize: false, Priority: 55 }, - - // All Top Pieces - { Name: "Plume", HasType: false, AllowModuleTypes: ["t1"] }, - { Name: "PlumeBase", HasType: false, AllowModuleTypes: ["t1"], CopyLayerColor: "BaseMetal"}, - { Name: "ManeL", HasType: false, AllowModuleTypes: ["t2"], InheritColor: "HairFront", HideAs: { Group: "HairAccessory1" } }, - { Name: "ManeLFront", HasType: false, AllowModuleTypes: ["t2"], InheritColor: "HairFront", CopyLayerColor: "ManeL", Priority: 59, HideAs: { Group: "HairAccessory1" } }, - { Name: "ManeR", HasType: false, AllowModuleTypes: ["t3"], InheritColor: "HairFront", CopyLayerColor: "ManeL", HideAs: { Group: "HairAccessory1" } }, - { Name: "ManeRFront", HasType: false, AllowModuleTypes: ["t3"], InheritColor: "HairFront", CopyLayerColor: "ManeL", Priority: 59, HideAs: { Group: "HairAccessory1" } }, - { Name: "Mohawk", HasType: false, AllowModuleTypes:["t4"], InheritColor: "HairFront", CopyLayerColor: "ManeL", Priority: 59 }, - { Name: "MohawkBase", HasType: false, AllowModuleTypes:["t4"], CopyLayerColor: "BaseStraps", Priority: 59}, - - //Horns - { Name: "Horn", HasType: false, AllowModuleTypes: ["h1"], Priority: 58 }, - { Name: "HornShine", HasType: false, AllowModuleTypes: ["h1"], AllowColorize: false, Priority: 58 }, - { Name: "Horn2", HasType: false, AllowModuleTypes: ["h2"], CopyLayerColor: "Horn", Priority: 58 }, - { Name: "Horn2Shine", HasType: false, AllowModuleTypes: ["h2"], AllowColorize: false, Priority: 58 }, - - // All Panels - { Name: "PanelBase", HasType: false, AllowModuleTypes: ["p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8", "p9"], ColorGroup: "Straps", Priority: 55 }, - { Name: "PanelStuds", HasType: false, AllowModuleTypes: ["p1", "p2","p3" ,"p4" ,"p5" ,"p6" ,"p7" ,"p8", "p9"], CopyLayerColor: "BaseMetal", Priority: 55 }, - { Name: "PanelHex", HasType: false, AllowModuleTypes: ["p2"],Priority: 55 }, - { Name: "PanelShield", HasType: false, AllowModuleTypes: ["p3"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelMoon", HasType: false, AllowModuleTypes: ["p4"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelSun", HasType: false, AllowModuleTypes: ["p5"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelHeart", HasType: false, AllowModuleTypes: ["p6"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelHorse", HasType: false, AllowModuleTypes: ["p7"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelTriskel", HasType: false, AllowModuleTypes: ["p8"], CopyLayerColor: "PanelHex", Priority: 55 }, - { Name: "PanelPentacle", HasType: false, AllowModuleTypes: ["p9"], CopyLayerColor: "PanelHex", Priority: 55 }, - - //Reins - { Name: "Reins", HasType: false, AllowModuleTypes: ["r1"], ColorGroup: "Straps" }, - { Name: "Rope", HasType: false, AllowModuleTypes: ["r2"] }, - { Name: "PostReins", HasType: false, AllowModuleTypes: ["r3"], CopyLayerColor: "Reins", HideAs: { Group: "ItemDevices" }, Priority: 55 }, - { Name: "Post", HasType: false, AllowModuleTypes: ["r3"], FixedPosition: true , HideAs: { Group: "ItemDevices" }, Priority: 60 }, - { Name: "PostReinsDetail", HasType: false, AllowModuleTypes: ["r3"], CopyLayerColor: "Reins", HideAs: { Group: "ItemDevices" } , Priority: 60 }, - - - //Blinders - { Name: "Blinders", HasType: false, AllowModuleTypes: ["b1"], ColorGroup: "Straps", Priority: 55 }, - ] - }, //PonyGag - { - Name: "Stitches", Category: ["Medical", "Extreme"], Priority: 10, BuyGroup: "Suture", Random: false, Value: 20, Difficulty: 8, Time: 5, RemoveTime: 5, Left: 235, Top: 180, DefaultColor: ["Default", "#3f3c3a"], Hide: ["Mouth"], Prerequisite: ["GagUnique"], Effect: ["GagHeavy"], Extended: true, AlwaysExtend: true, - AllowExpression: ["Frown", "Sad", "Pained", "Angry", "HalfOpen", "Open", "Ahegao", "Moan", "TonguePinch", "LipBite", "Happy", "Devious", "Laughing", "Grin", "Smirk", "Pout"], - Layer: [ - { Name: "FakeMouth", HasType: false, InheritColor: "Mouth", AllowTypes: ["Straight", "ZigZag", "Skewed", "Cross"], MirrorExpression: "Mouth"}, - { Name: "Straight", HasType: false, AllowTypes: ["Straight"], MirrorExpression: "Mouth"}, - { Name: "ZigZag", HasType: false, CopyLayerColor: "Straight", AllowTypes: ["ZigZag"], MirrorExpression: "Mouth"}, - { Name: "Skewed", HasType: false, CopyLayerColor: "Straight", AllowTypes: ["Skewed"], MirrorExpression: "Mouth"}, - { Name: "Cross", HasType: false, CopyLayerColor: "Straight", AllowTypes: ["Cross"], MirrorExpression: "Mouth" }, - ], - }, - { - Name: "Slime", Category: ["Fantasy"], BuyGroup: "Slime", DefaultColor: ["#57ab5e"], Random: false, Value: 200, Difficulty: 4, Time: 15, RemoveTime: 25, Left: 200, Top: 170, Effect: ["BlockMouth", "GagMedium"], - }, - { Name: "FurScarf", Value: 40, Top: 0, Left: 0, Difficulty: 3, BuyGroup: "FurScarf", Effect: ["BlockMouth", "GagLight"] }, - - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemHead", - Category: "Item", - Priority: 44, - Default: false, - IsRestraint: true, - Left: 150, - Top: 20, - Zone: [[175, 0, 150, 65]], - Asset: [ - { Name: "ClothBlindfold", Value: 15, Time: 10, RemoveTime: 5, DefaultColor: "#A0A0A0", Hide: ["Glasses"], Effect: ["BlindLight", "Prone", "BlurLight"], Audio: "ClothKnot", Tint: [{Color: 0, Strength: 0.25}]}, - { Name: "ScarfBlindfold", Value: 15, Time: 15, DefaultColor: "Default", BuyGroup: "ScarfGag", Audio: "ClothKnot", Hide: ["Glasses"], Effect: ["BlindLight", "Prone"] }, - { Name: "LeatherBlindfold", Fetish: ["Leather"], Value: 30, Time: 5, AllowLock: true, DefaultColor: "#404040", Hide: ["Glasses"], Effect: ["BlindNormal", "Prone"] }, - { Name: "PaddedBlindfold", Fetish: ["Leather"], Value: 35, Time: 5, AllowLock: true, DefaultColor: ["#545454", "#808080"], Hide: ["Glasses"], Effect: ["BlindHeavy", "Prone"], - Layer: [ - { Name: "Trim", HasType: false}, - { Name: "Base", HasType: false}, - ] - }, - { Name: "InteractiveVisor", Category: ["SciFi"], Fetish: ["Metal"], Priority: 34, BuyGroup: "FuturisticVisor", Difficulty: 6, Value: 50, Time: 6, Random: false, AllowLock: true, FuturisticRecolor: true, Extended: true, Audio: "FuturisticApply", - HideItem: ["ItemNoseNoseRing", "MaskFuturisticVisor"], - Effect: ["UseRemote"], - Tint: [{ Color: 0, Strength: 0.1 }], - DefaultTint: "#2d58bc" - }, - { Name: "FuturisticMask", Category: ["SciFi"], Fetish: ["Metal"], DefaultColor: ["#4040CB", "#FFFFFF", "#FFFFFF"], Priority: 41, BuyGroup: "FuturisticVisor", Difficulty: 7, Value: -1, Time: 7, Random: false, AllowLock: true, DrawLocks: false, HideItem: ["ItemNoseNoseRing", "MaskFuturisticVisor"], FuturisticRecolor: true, FuturisticRecolorDisplay: true, - Effect: ["UseRemote", "BlockMouth"], Extended: true, Audio: "FuturisticApply", - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNose"] , - Layer: [ - { Name: "Display", HasType: true}, - { Name: "Text", HasType: true, AllowTypes: ["LightTint", "Blind", "HeavyTint"]}, - { Name: "Lock", HasType: false, LockLayer: true, AllowTypes: ["LightTint", "", "HeavyTint"]}, - ], - Tint: [{Color: 0, Strength: 0.1}], - }, - { Name: "InteractiveVRHeadset", Difficulty: 6, Value: 80, Time: 3, DefaultColor: ["Default", "Default"], Random: false, AllowLock: true, DrawLocks: false, Hide: ["Mask", "Glasses"], HideItem: ["ItemNoseNoseRing"], FuturisticRecolor: true, - Effect: ["VR"], AllowEffect: ["BlindHeavy", "BlindTotal", "Prone", "VRAvatars", "HideRestraints", "KinkyDungeonParty"], Extended: true, AlwaysExtend: true, Audio: "FuturisticApply", - Layer: [ - { Name: "Body", HasType: false}, - { Name: "Display", HasType: false}, - ] - }, - { Name: "LeatherSlimMask", Fetish: ["Leather"], Value: 70, Difficulty: 50, Time: 15, AllowLock: true, DefaultColor: "#555555", Prerequisite: ["NotHogtied"], Hide: ["Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3"], Effect: ["BlindHeavy", "Prone", "GagLight", "BlockMouth"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNose"] }, - { Name: "LeatherSlimMaskOpenMouth", Fetish: ["Leather"], Value: 70, Difficulty: 50, Time: 15, AllowLock: true, DefaultColor: "#555555", Prerequisite: ["NotHogtied"], Hide: ["Glasses"], HideItem: ["ItemNosePigNose"], Effect: ["BlindHeavy", "Prone"], Block: ["ItemEars", "ItemNose"] }, - { Name: "LeatherSlimMaskOpenEyes", Fetish: ["Leather"], Value: 70, Difficulty: 50, Time: 15, AllowLock: true, DefaultColor: "#555555", Prerequisite: ["NotHogtied"], Hide: ["ItemMouth", "ItemMouth2", "ItemMouth3"], Effect: ["GagLight", "BlockMouth"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNose"] }, - { Name: "StuddedBlindfold", Fetish: ["Leather", "Metal"], Value: -1, Difficulty: 2, Time: 5, AllowLock: true, DefaultColor: "#FF4040", Bonus: "KidnapSneakiness", Hide: ["Glasses"], Effect: ["BlindNormal", "Prone"] }, - { Name: "KittyBlindfold", Fetish: ["Pet"], Value: 40, Time: 5, AllowLock: true, DefaultColor: ["#FFFFFF","#000000","#E48FE9"], Hide: ["Glasses"], Effect: ["BlindLight", "Prone"], Audio: "ClothSlip", - Layer: [ - { Name: "Base", AllowColorize: true, HasType: false }, - { Name: "Eyes", AllowColorize: true, HasType: false }, - { Name: "Ears", AllowColorize: true, HasType: false }, - ] - }, - { Name: "DuctTape", Fetish: ["Tape"], Value: 50, Time: 10, RemoveTime: 5, BuyGroup: "DuctTape", Audio: "DuctTapeRollShort", Hide: ["Glasses"], Extended: true, Alpha: [{ Group: ["ItemMouth", "ItemMouth2", "ItemMouth3"], Masks: [[0, 220, 500, 500]], Type: ["Mummy", "Open"] }] }, - { Name: "SmallBlindfold", Fetish: ["Leather"], Value: 40, Time: 5, AllowLock: true, DefaultColor: "#404040", Hide: ["Glasses"], Effect: ["BlindLight", "Prone"] }, - { Name: "FullBlindfold", Fetish: ["Latex"], Priority: 30, Value: 40, Difficulty: 6, Time: 5, AllowLock: true, DefaultColor: "#353535", Hide: ["Glasses"], Effect: ["BlindHeavy", "Prone"] }, - { Name: "LewdBlindfold", Priority: 30, Value: 45, Time: 5, Random: false, AllowLock: true, Hide: ["Glasses", "Mask"], Effect: ["BlindLight", "Prone"], Audio: "ClothSlip", ExpressionTrigger: [{ Name: "Light", Group: "Blush", Timer: 5 }, { Name: "Closed", Group: "Eyes", Timer: 5 }] }, - { Name: "LatexBlindfold", Fetish: ["Latex"], Value: 35, Time: 5, AllowLock: true, Hide: ["Glasses", "Mask"], Effect: ["BlindNormal", "Prone"] }, - { Name: "FrilledSleepMask", Fetish: ["Lingerie"], Value: 5, Time: 5, Hide: ["Glasses", "Mask"], Effect: ["BlindLight", "Prone"], Audio: "ClothSlip", - Layer: [ - { Name: "Frills" }, - { Name: "Mask" }, - ] - }, - { Name: "BlackoutLenses", Priority: 9, Value: 60, Difficulty: 10, Random: false, DefaultColor: "#333333", OverrideBlinking: true, Hide: ["Eyes", "Eyes2"], Block: [], Effect: ["BlindHeavy", "Prone"], AllowExpression: ["Closed"], - Layer: [ - { Name: "Left", MirrorExpression: "Eyes" }, - { Name: "Right", MirrorExpression: "Eyes2" }, - ] - }, - { Name: "WebBlindfold", Category: ["Fantasy"], Fetish: ["Tape"], Value: 50, Difficulty: 5, Time: 10, RemoveTime: 20, Random: false, CraftGroup: "Web", Hide: ["Glasses", "Mask"], Effect: ["BlindLight", "Prone"], Extended: true }, - { Name: "RopeBlindfold", Fetish: ["Rope"], Value: 60, Time: 15, DefaultColor: "#956B1C", BuyGroup: "HempRope", CraftGroup: "HempRope", Audio: "RopeShort", Hide: ["Glasses", "Mask"], Effect: ["BlindLight", "Prone"] }, - { Name: "SleepMask", Value: 5, Time: 5, Hide: ["Glasses", "Mask"], Effect: ["BlindLight", "Prone"], Audio: "ClothSlip" }, - { Name: "PrisonLockdownBlindfold", Priority: 34, Value: -1, Time: 5, BuyGroup: "PrisonLockdownSuit", DefaultColor: "#77511f", Hide: ["Glasses"], Effect: ["BlindNormal", "Prone"] }, - { Name: "Pantyhose", Value: 10, Time: 5, Hide: ["Glasses", "Mask", "HairFront", "HairBack", "HairAccessory1", "HairAccessory2", "HairAccessory3"], BuyGroup: "Pantyhose", Effect: ["BlindLight", "Prone"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemNose"], Audio: "ClothSlip", Tint: [{Color: 0, Strength: 0.2}], DefaultTint: "#765d4e" }, - { - Name: "Snorkel", Priority: 55, Value: 30, Top: 30, Difficulty: 5, Time: 15, Random: false, AllowLock: true, Block: [], - Layer: [ - { Name: "Mask", AllowColorize: false }, - { Name: "Tube", Priority: 56, AllowColorize: true }, - ] - }, - { Name: "Ribbons", Fetish: ["Lingerie"], Value: 30, Difficulty: 5, Time: 10, RemoveTime: 5, BuyGroup: "Ribbon", Hide: ["Glasses", "Mask"], Effect: ["BlindLight", "Prone"], Extended: true }, - { - Name: "Tentacles", Category: ["Fantasy"], BuyGroup: "Tentacles", Random: false, Value: 250, Difficulty: 6, Time: 5, RemoveTime: 5, DefaultColor: "#9221ba", Hide: ["Glasses", "Mask"], Effect: ["BlindNormal", "Prone"], - Layer: [ - { Name: "Tentacles" }, - { Name: "Shine", AllowColorize: false }, - ], - }, - { - Name: "MedicalPatch", Value: 20, Difficulty: 1, Priority: 25, Time: 3, RemoveTime: 5, DefaultColor: ["#ECC7A1","#ECC7A1","#B459A6","#B459A6",], Extended: true, - Layer: [ - { Name: "Right" , HasType: false, AllowModuleTypes: ["e0","e1"] }, - { Name: "Left" , HasType: false, AllowModuleTypes: ["e0","e2"] }, - { Name: "RightHeart", HasType: false, AllowModuleTypes: ["e0r1","e1r1"] }, - { Name: "LeftHeart", HasType: false, AllowModuleTypes: ["e0l1","e2l1"] }, - { Name: "RightStripes", HasType: false, AllowModuleTypes: ["e0r2","e1r2"], CopyLayerColor: "RightHeart" }, - { Name: "LeftStripes", HasType: false, AllowModuleTypes: ["e0l2","e2l2"], CopyLayerColor: "LeftHeart" }, - { Name: "RightX", HasType: false, AllowModuleTypes: ["e0r3","e1r3"], CopyLayerColor: "RightHeart" }, - { Name: "LeftX", HasType: false, AllowModuleTypes: ["e0l3","e2l3"], CopyLayerColor: "LeftHeart" }, - { Name: "RightTeddy", HasType: false, AllowModuleTypes: ["e0r4","e1r4"], CopyLayerColor: "RightHeart" }, - { Name: "LeftTeddy", HasType: false, AllowModuleTypes: ["e0l4","e2l4"], CopyLayerColor: "LeftHeart" }, - ], - }, - { - Name: "DroneMask", Category: ["SciFi"], Fetish: ["Latex"], Value: 90, Difficulty: 5, DefaultColor: ["#222222", "#CCCCCC", "#7F7F7F", "#00F4FD", "#E700CA", ], Time: 10, AllowLock: true, DrawLocks: false, Extended: true, DynamicAfterDraw: true, - BuyGroup: "DroneMask", - Block:["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemNose"], - Hide: ["Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "Blush"], - HideItem: ["HatFacePaint", "MaskFacePaint", "ClothAccessoryFacePaint"], - Layer: [ // Colors layer references: Base, Shine, EyeRegular, MouthOnahole, Barcode - { Name: "Base", HasType: false, AllowModuleTypes: ["h0"] }, - { Name: "Shine", HasType: false, AllowModuleTypes: ["h0"] }, - { Name: "BaseHelm", HasType: false, AllowModuleTypes: ["h1","h2"], CopyLayerColor: "Base", Alpha: [{ Masks: [[0, 0, 500, 200]], Group: ["Head"] }], }, - { Name: "ShineHelm", HasType: false, AllowModuleTypes: ["h1","h2"], CopyLayerColor: "Shine" }, - - // All Non-part-reliant Patterns - { Name: "Barcode", HasType: false, AllowModuleTypes: ["p1"]}, - { Name: "Scarab", HasType: false, AllowModuleTypes: ["p2"], CopyLayerColor: "Barcode"}, - { Name: "Hexagon", HasType: false, AllowModuleTypes: ["p3"], CopyLayerColor: "Barcode"}, - { Name: "TwoLines", HasType: false, AllowModuleTypes: ["p4"], CopyLayerColor: "Barcode"}, - { Name: "Text", HasImage: false, CopyLayerColor: "Barcode"}, - - // All Eyes - { Name: "EyeRegularShine", HasType: false, AllowModuleTypes: ["e1"], CopyLayerColor: "Shine" }, - { Name: "EyeRegular", HasType: false, AllowModuleTypes: ["e1"], }, - { Name: "EyeRegularGlow", HasType: false, AllowModuleTypes: ["e1g1"], CopyLayerColor: "EyeRegular" }, - - { Name: "EyeSpiralShine", HasType: false, AllowModuleTypes: ["e2"], CopyLayerColor: "Shine" }, - { Name: "EyeSpiral", HasType: false, AllowModuleTypes: ["e2"], CopyLayerColor: "EyeRegular" }, - { Name: "EyeSpiralGlow", HasType: false, AllowModuleTypes: ["e2g1"], CopyLayerColor: "EyeRegular" }, - - { Name: "EyeSmileShine", HasType: false, AllowModuleTypes: ["e3"], CopyLayerColor: "Shine" }, - { Name: "EyeSmile", HasType: false, AllowModuleTypes: ["e3"], CopyLayerColor: "EyeRegular" }, - { Name: "EyeSmileGlow", HasType: false, AllowModuleTypes: ["e3g1"], CopyLayerColor: "EyeRegular" }, - - { Name: "EyeHolesShine", HasType: false, AllowModuleTypes: ["e4"], CopyLayerColor: "Shine" }, - { Name: "EyeHoles", HasType: false, AllowModuleTypes: ["e4"], CopyLayerColor: "EyeRegular" }, - - { Name: "EyeSculpted", HasType: false, AllowModuleTypes: ["e5"], CopyLayerColor: "EyeRegular" }, - { Name: "EyeSculptedShine", HasType: false, AllowModuleTypes: ["e5"], CopyLayerColor: "Shine" }, - { Name: "EyeSculptedGlow", HasType: false, AllowModuleTypes: ["e5g1"], CopyLayerColor: "EyeRegular" }, - - { Name: "EyeConcave", HasType: false, AllowModuleTypes: ["e6"], CopyLayerColor: "Base"}, - { Name: "EyeConcaveShine", HasType: false, AllowModuleTypes: ["e6"], CopyLayerColor: "Shine"}, - - // All Mouths - { Name: "MouthOnahole", HasType: false, AllowModuleTypes: ["m1"]}, - - { Name: "MouthFleshlightShine", HasType: false, AllowModuleTypes: ["m2"], CopyLayerColor: "Shine" }, - { Name: "MouthFleshlight", HasType: false, AllowModuleTypes: ["m2"], CopyLayerColor: "MouthOnahole" }, - - { Name: "MouthSmileShine", HasType: false, AllowModuleTypes: ["m3"], CopyLayerColor: "Shine" }, - { Name: "MouthSmile", HasType: false, AllowModuleTypes: ["m3"], CopyLayerColor: "MouthOnahole" }, - { Name: "MouthSmileGlow", HasType: false, AllowModuleTypes: ["m3g1"], CopyLayerColor: "MouthOnahole" }, - - { Name: "MouthHolesShine", HasType: false, AllowModuleTypes: ["m4"], CopyLayerColor: "Shine" }, - { Name: "MouthHoles", HasType: false, AllowModuleTypes: ["m4"], CopyLayerColor: "MouthOnahole" }, - - { Name: "MouthSculpted", HasType: false, AllowModuleTypes: ["m5"], CopyLayerColor: "MouthOnahole" }, - ], - }, - { - Name: "Slime", Category: ["Fantasy"], BuyGroup: "Slime", DefaultColor: ["#57ab5e"], Random: false, Value: 200, Difficulty: 4, Time: 15, RemoveTime: 25, Effect: ["BlindLight", "Prone", "BlurNormal"], Tint: [{Color: 0, Strength: 0.4}] - }, - { Name: "FurScarf", BuyGroup: "FurScarf", Value: 40, Difficulty: 3, Effect: ["BlindLight", "Prone"] }, - { - Name: "Stitches", Category: ["Medical", "Extreme"], Priority: 8.5, BuyGroup: "Suture", Random: false, Value: -1, Difficulty: 8, Time: 5, RemoveTime: 5, DefaultColor: ["#3f3c3a", "#3f3c3a"], Effect: [], Top:145, Extended: true, AlwaysExtend: true, - AllowExpression: ["Angry", "Closed", "Daydream", "Dazed", "Dizzy", "Heart", "HeartPink", "Horny", "Lewd", "LewdHeart", "LewdHeartPink", "Sad", "Scared", "Scared", "Shy", "ShylyHappy", "Surprised", "VeryLewd"], - Layer: [ - { Name: "FakeEye", HasType: false, AllowColorize: false, AllowModuleTypes: ["m0r0l0", "m0r0l1", "m0r0l2", "m0r0l3", "m0r1l0","m0r1l1","m0r1l2","m0r1l3", "m0r2l0","m0r2l1","m0r2l2","m0r2l3", "m0r3l0", "m0r3l1", "m0r3l2", "m0r3l3", "m2r0l0", "m2r0l1", "m2r0l2", "m2r0l3", "m2r1l0","m2r1l1","m2r1l2","m2r1l3", "m2r2l0","m2r2l1","m2r2l2","m2r2l3", "m2r3l0", "m2r3l1", "m2r3l2", "m2r3l3"], MirrorExpression: "Eyes", Left: 200}, - { Name: "FakeEye2", HasType: false, AllowColorize: false, AllowModuleTypes: ["m1r0l0", "m1r0l1", "m1r0l2", "m1r0l3", "m1r1l0","m1r1l1","m1r1l2","m1r1l3", "m1r2l0","m1r2l1","m1r2l2","m1r2l3", "m1r3l0", "m1r3l1", "m1r3l2", "m1r3l3", "m2r0l0", "m2r0l1", "m2r0l2", "m2r0l3", "m2r1l0","m2r1l1","m2r1l2","m2r1l3", "m2r2l0","m2r2l1","m2r2l2","m2r2l3", "m2r3l0", "m2r3l1", "m2r3l2", "m2r3l3"], MirrorExpression: "Eyes2", Left: 250}, - { Name: "Straight", HasType: false, AllowTypes: ["m0r0l0", "m0r0l1", "m0r0l2", "m0r0l3", "m2r0l0", "m2r0l1", "m2r0l2", "m2r0l3" ], MirrorExpression: "Eyes", Left: 200}, - { Name: "ZigZag", HasType: false, CopyLayerColor: "Straight", AllowModuleTypes: ["m0r1l0", "m0r1l1", "m0r1l2", "m0r1l3", "m2r1l0", "m2r1l1", "m2r1l2", "m2r1l3" ], MirrorExpression: "Eyes", Left: 200}, - { Name: "Skewed", HasType: false, CopyLayerColor: "Straight", AllowModuleTypes: ["m0r2l0", "m0r2l1", "m0r2l2", "m0r2l3", "m2r2l0", "m2r2l1", "m2r2l2", "m2r2l3"], MirrorExpression: "Eyes", Left: 200}, - { Name: "Cross", HasType: false, CopyLayerColor: "Straight", AllowModuleTypes: ["m0r3l0", "m0r3l1", "m0r3l2", "m0r3l3", "m2r3l0", "m2r3l1", "m2r3l2", "m2r3l3"], MirrorExpression: "Eyes", Left: 200}, - { Name: "Straight2", HasType: false, AllowTypes: ["m1r0l0", "m1r1l0", "m1r2l0", "m1r3l0", "m2r0l0", "m2r1l0", "m2r2l0", "m2r3l0"], MirrorExpression: "Eyes2", Left: 250}, - { Name: "ZigZag2", HasType: false, CopyLayerColor: "Straight2", AllowModuleTypes: ["m1r0l1", "m1r1l1", "m1r2l1", "m1r3l1", "m2r0l1", "m2r1l1", "m2r2l1", "m2r3l1"], MirrorExpression: "Eyes2", Left: 250}, - { Name: "Skewed2", HasType: false, CopyLayerColor: "Straight2", AllowModuleTypes:["m1r0l2", "m1r1l2", "m1r2l2", "m1r3l2", "m2r0l2", "m2r1l2", "m2r2l2", "m2r3l2"], MirrorExpression: "Eyes2", Left: 250}, - { Name: "Cross2", HasType: false, CopyLayerColor: "Straight2", AllowModuleTypes: ["m1r0l3", "m1r1l3", "m1r2l3", "m1r3l3", "m2r0l3", "m2r1l3", "m2r2l3", "m2r3l3"], MirrorExpression: "Eyes2", Left: 250}, - ], - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemNose", - Category: "Item", - Priority: 33, - Default: false, - IsRestraint: true, - Left: 150, - Top: 20, - Zone: [[175, 65, 150, 65]], - Asset: [ - { - Name: "NoseHook", Fetish: ["Metal"], Priority: 26, Value: 25, Difficulty: 20, Time: 15, Random: false, AllowLock: true, BuyGroup: "Nosehook", Layer: [ - { Name: "Band" }, - { Name: "Hook" }, - ] - }, - { - Name: "PigNose", Fetish: ["Pet"], Top: 18, Left: 151, DefaultColor: "#D976D2", Priority: 43, Value: 25, Difficulty: 10, Time: 15, Random: false, AllowLock: true, DrawLocks: false, Layer: [ - { Name: "Nose" }, - { Name: "Strap" }, - ] - }, - { Name: "NoseRing", Priority: 43, Fetish: ["Metal"], Value: 25, Difficulty: 10, Time: 15, Random: false, AllowLock: true, Left: 50, AllowPose: ["Kneel"], Extended: true }, - { Name: "DuctTape", Fetish: ["Tape"], Value: 50, BuyGroup: "DuctTape", Audio: "DuctTape", Difficulty: 2, Time: 10, RemoveTime: 5}, - { Name: "NosePlugs", Value: 20, Difficulty: 3, Time: 5, RemoveTime: 5}, - { Name: "BarbelPiercing", Left: 124, Top: 50, Value: 20, Difficulty: 3, Time: 5, RemoveTime: 5}, - { - Name: "PigNoseHook", Fetish: ["Metal"], Priority: 26, Value: -1, Difficulty: 30, Time: 15, Random: false, AllowLock: true, DrawLocks: false, BuyGroup: "Nosehook", Layer: [ - { Name: "Band" }, - { Name: "Hook" }, - ] - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - { - Group: "ItemHood", - Category: "Item", - Priority: 45, - Default: false, - IsRestraint: true, - Block: ["ItemHead", "ItemNose", "ItemEars"], - Left: 150, - Top: 20, - Zone: [[325, 0, 75, 130]], - Asset: [ - { Name: "LeatherHoodSealed", Fetish: ["Leather"], Value: 70, Difficulty: 5, Time: 15, AllowLock: true, DefaultColor: "#555555", HideItem: ["ItemEarsFuturisticEarphones"], Hide: ["Head", "HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "Hat", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask", "ItemHead"], Effect: ["BlindHeavy", "Prone", "GagLight", "BlockMouth"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNeck", "ItemHead", "ItemNose"], Prerequisite: ["NotProtrudingFromMouth"] }, - { Name: "BlanketHood", Value: 50, Difficulty: 3, Time: 5, HideItem: ["ItemEarsFuturisticEarphones",], Hide: ["Head", "HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "Hat", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask", "ItemHead"], Effect: ["BlindNormal", "Prone", "GagLight", "BlockMouth"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNeck", "ItemHead", "ItemNose"], Prerequisite: ["NotProtrudingFromMouth"] }, - { Name: "PolishedSteelHood", Fetish: ["Metal"], Value: 85, Difficulty: 8, Time: 15, AllowLock: true, Audio: "LockLarge", Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask", "ItemEars", "ItemHead"], HideItem: ["HatBand1", "HatBand2", "HatTiara1"], Effect: ["BlindHeavy", "DeafLight", "Prone", "GagHeavy", "BlockMouth"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemNeck", "ItemHead", "ItemNose", "ItemEars"] }, - { - Name: "InflatedBallHood", Fetish: ["Latex"], Value: 65, Difficulty: 5, Time: 15, AllowLock: true, Prerequisite: ["NotProtrudingFromMouth"], Extended: true, HasType: false, - Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Hat", "Mask", "ItemEars", "ItemHead"], - Effect: ["BlindHeavy", "DeafLight", "Prone", "BlockMouth"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemNeck", "ItemHead", "ItemNose", "ItemEars"], - }, - { - Name: "OldGasMask", Fetish: ["Leather"], Value: 85, Difficulty: 25, Time: 10, Random: false, AllowLock: true, DrawLocks: false, Prerequisite: ["GasMask", "NotProtrudingFromMouth"], DefaultColor: "#313131", Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask"], HideItem: ["ItemHeadSnorkel", "ItemEarsFuturisticEarphones","HatFurHeadband"], Effect: ["BlockMouth"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemNeck", "ItemHead", "ItemNose", "ItemEars"], Extended: true, Layer: [ - { Name: "Mask", AllowColorize: true, HasType: false }, - { Name: "Light", AllowColorize: false, HasType: false }, - { Name: "Lenses", AllowColorize: true, ColorGroup: "Attachments", HasType: false, AllowModuleTypes: ["l1"], Left: 0, Top: -250 }, - { Name: "TubeA", AllowColorize: true, ColorGroup: "Attachments", HasType: false, AllowModuleTypes: ["a1"], Left: 0, Top: -250 }, - { Name: "TubeB", AllowColorize: true, CopyLayerColor: "TubeA", HasType: false, AllowModuleTypes: ["a2"], Left: 0, Top: -250 }, - { Name: "Rebreather", AllowColorize: true, CopyLayerColor: "TubeA", HasType: false, AllowModuleTypes: ["a3"], Left: 0, Top: -250 }, - { Name: "Lock", LockLayer: true, HasType: false, AllowColorize: false }, - ], - Alpha: [{Group: ["ItemHead"], Masks: [[0, 0, 200, 175], [300, 0, 200, 175]]}], - }, - { - Name: "KirugumiMask", Fetish: ["Latex"], Value: 50, Priority: 51, Difficulty: 15, Time: 10, - Random: false, AllowLock: true, DrawLocks: false, Prerequisite: ["GasMask", "NotProtrudingFromMouth"], DefaultColor: ["#9A7F76", "Default"], - AllowEffect: ["BlindLight", "BlindHeavy", "Prone"], - Block: [], - Layer: [ - { Name: "Mask", AllowColorize: true, HasType: false }, - { Name: "Blush1", AllowColorize: true, HasType: false, Left: 190, Top: 100, AllowModuleTypes:["b0"]}, - { Name: "Blush2", AllowColorize: true, HasType: false, CopyLayerColor: "Blush1", Left: 190, Top: 100, AllowModuleTypes:["b1"]}, - { Name: "Blush3", AllowColorize: true, HasType: false, CopyLayerColor: "Blush1", Left: 190, Top: 100, AllowModuleTypes:["b2"]}, - { Name: "Blush4", AllowColorize: true, HasType: false, CopyLayerColor: "Blush1", Left: 190, Top: 100, AllowModuleTypes:["b3"]}, - { Name: "Eyes1", AllowColorize: true, HasType: false, Left: 200, Top: 145, AllowModuleTypes:["e0"]}, - { Name: "Eyes2", AllowColorize: true, HasType: false, CopyLayerColor: "Eyes1", Left: 200, Top: 145, AllowModuleTypes:["e1"]}, - { Name: "Eyes3", AllowColorize: true, HasType: false, CopyLayerColor: "Eyes1", Left: 200, Top: 145, AllowModuleTypes:["e2"]}, - { Name: "Eyes4", AllowColorize: true, HasType: false, CopyLayerColor: "Eyes1", Left: 200, Top: 145, AllowModuleTypes:["e3"]}, - // CopyLayerColor: "Back" - { Name: "Mouth1", AllowColorize: true, HasType: false, Left: 235, Top: 180, AllowModuleTypes:["m0"]}, - { Name: "Mouth2", AllowColorize: true, HasType: false, CopyLayerColor: "Mouth1", Left: 235, Top: 180, AllowModuleTypes:["m1"]}, - { Name: "Mouth3", AllowColorize: true, HasType: false, CopyLayerColor: "Mouth1", Left: 235, Top: 180, AllowModuleTypes:["m2"]}, - { Name: "Mouth4", AllowColorize: true, HasType: false, CopyLayerColor: "Mouth1", Left: 235, Top: 180, AllowModuleTypes:["m3"]}, - - { Name: "Brows1", AllowColorize: false, HasType: false, Left: 200, Top: 120, AllowModuleTypes:["br0"]}, - { Name: "Brows2", AllowColorize: false, HasType: false, CopyLayerColor: "Brows1", Left: 200, Top: 120, AllowModuleTypes:["br1"]}, - { Name: "Brows3", AllowColorize: false, HasType: false, CopyLayerColor: "Brows1", Left: 200, Top: 120, AllowModuleTypes:["br2"]}, - { Name: "Brows4", AllowColorize: false, HasType: false, CopyLayerColor: "Brows1", Left: 200, Top: 120, AllowModuleTypes:["br3"]}, - ], - Extended: true - }, - { - Name: "PumpkinHead", Priority: 54, Value: 40, Difficulty: 2, Time: 10, Random: false, AllowLock: false, Hide: ["HairBack"], HideItem: ["ItemHeadSnorkel", "ItemEarsFuturisticEarphones","HatFurHeadband"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemNeck", "ItemHead", "ItemNose", "ItemEars"], - Alpha: [{ Masks: [[150, 0, 200, 80]] }], - Layer: [ - { Name: "Front", AllowColorize: true, Priority:54}, - { Name: "Back", AllowColorize: true, Priority: 1 } - ] - }, - { Name: "SackHood", Fetish: ["Rope"], Value: 20, Difficulty: 3, Time: 5, Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Hat", "Mask", "ItemEars", "ItemHead"], Effect: ["Prone", "BlindHeavy", "BlockMouth"], Block: ["ItemEars", "ItemMouth", "ItemMouth2", "ItemMouth3", "ItemHead", "ItemNose"] }, - { Name: "LeatherHoodSensDep", Fetish: ["Leather"], Value: 100, Difficulty: 50, Time: 15, AllowLock: true, DefaultColor: "#555555", HideItem: ["ItemEarsFuturisticEarphones"], Hide: ["Head", "HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "Hat", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask", "ItemHead"], Effect: ["BlindHeavy", "DeafHeavy", "Prone", "GagHeavy", "BlockMouth"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNeck", "ItemHead", "ItemNose"], Prerequisite: ["NotProtrudingFromMouth"] }, - { - Name: "LatexHoodOpenHair", Fetish: ["Latex"], Value: 45, Difficulty: 50, Time: 15, AllowLock: true, DefaultColor: ["Default", "#555555"], HideItem: ["ItemEarsFuturisticEarphones"], Hide: ["HairFront", "HairBack", "Hat", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask"], - Alpha: [ - { Group: ["Head"], Masks: [[150, 50, 200, 87]] }, - { Group: ["BodyUpper"], Pose: ["AllFours"], Masks: [[150, 50, 200, 87]] }, - { Group: ["ItemHead"], Masks: [[0, 0, 195, 250], [300, 0, 200, 250]]}, - ], - Block: ["ItemEars", "ItemHead", "ItemNose"], - Layer: [ - { Name: "Hair", InheritColor: "HairFront" }, - { Name: "Hood" }, - ] - }, - { - Name: "LeatherHood", Fetish: ["Leather"], Value: 60, Difficulty: 50, Time: 15, AllowLock: true, DefaultColor: ["#404040", "#404040", "#888"], Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask", "ItemEars", "ItemHead"], HideItem: ["HatFurHeadband"], Effect: ["BlindHeavy", "DeafLight", "Prone", "GagNormal", "BlockMouth"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNeck", "ItemHead", "ItemNose"], - Prerequisite: ["NotProtrudingFromMouth"], - Layer: [ - { Name: "Hood", AllowColorize: true }, - { Name: "Collar", AllowColorize: true }, - { Name: "Snaps", AllowColorize: false }, - ] - }, - { - Name: "LeatherHoodOpenEyes", Fetish: ["Leather"], Value: 40, Difficulty: 50, Time: 15, AllowLock: true, DefaultColor: "#404040", - HideItem: ["HatBand1", "HatBand2", "HatTiara1", "ItemEarsFuturisticEarphones","HatFurHeadband"], - Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3"], Effect: ["GagLight", "BlockMouth"], - Block: ["ItemHead", "ItemNose", "ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNeck"], - Prerequisite: ["NotProtrudingFromMouth"], - Alpha: [{Group: ["ItemHead"], Masks: [[0, 0, 210, 250], [295, 0, 205, 250]]}], - }, - { Name: "GasMask", Fetish: ["Leather"], Value: 50, Difficulty: 25, Time: 10, Random: false, AllowLock: true, DefaultColor: "#585858", Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask", "ItemEars", "ItemHead"], HideItem: ["HatFurHeadband"], Effect: ["BlockMouth"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNeck", "ItemHead", "ItemNose"], Prerequisite: ["NotProtrudingFromMouth"]}, - { - Name: "DogHood", Fetish: ["Leather", "Pet"], Value: 60, Difficulty: 50, Time: 15, Random: false, AllowLock: true, DefaultColor: "#404040", - HideItem: ["HatBand1", "HatBand2", "HatTiara1", "ItemEarsFuturisticEarphones","HatFurHeadband"], - Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask"], - Effect: ["GagNormal", "BlockMouth"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemHead", "ItemNose"], - Alpha: [{Group: ["ItemHead"], Masks: [[0, 0, 210, 250], [295, 0, 205, 250]]}], - }, - { - Name: "FoxyMask", Fetish: ["Pet"], Value: 50, Difficulty: 2, Time: 15, Random: false, AllowLock: true, Effect: ["GagLight", "BlockMouth"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemHead", "ItemNose"], - Layer: [ - { Name: "Upper" }, - { Name: "Lower" }, - ], - Alpha: [{Group: ["ItemHead"], Masks: [[0, 0, 198, 250], [300, 0, 200, 250]]}], - }, - { Name: "PonyHood", Fetish: ["Pony"], Value: -1, Difficulty: 50, Time: 15, Random: false, AllowLock: true, DefaultColor: "#404040", Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask", "ItemEars", "ItemHead"], HideItem: ["ItemHeadSnorkel","HatFurHeadband"], Effect: ["BlindLight", "GagNormal", "BlockMouth"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNeck", "ItemHead", "ItemNose"] }, - { - Name: "LeatherHoodOpenMouth", Fetish: ["Leather"], Value: 50, Difficulty: 50, Time: 15, AllowLock: true, DefaultColor: "#404040", Hide: ["HairFront", "HairBack", "Glasses", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask"], HideItem: ["ItemHeadSnorkel", "ItemNosePigNose", "ItemEarsFuturisticEarphones", "HatFurHeadband"], Effect: ["Prone", "BlindHeavy"], Block: ["ItemEars", "ItemHead", "ItemNose"], - Alpha: [{ Group: ["ItemHead"], Masks: [[0, 0, 217, 250], [282, 0, 218, 250]] }], - }, - { Name: "CanvasHood", Value: 50, Difficulty: 20, Time: 15, AllowLock: true, DefaultColor: ["#a5a095", "#ce7210"], Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask", "ItemEars", "ItemHead"], HideItem: ["HatFurHeadband"], Effect: ["Prone", "BlindHeavy", "GagHeavy", "BlockMouth", "DeafLight"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNose", "ItemHead"], Extended: true, DynamicAfterDraw: true, - Prerequisite: ["NotProtrudingFromMouth"], - Layer: [ - { Name: "Hood" }, - { Name: "Text" }, - ] - }, - { - Name: "Pantyhose", Value: 10, Time: 5, BuyGroup: "Pantyhose", - Hide: ["Glasses", "Mask", "HairFront", "HairBack", "HairAccessory1", "HairAccessory2", "HairAccessory3"], - HideItem: ["ItemHeadSnorkel", "ItemEarsFuturisticEarphones","HatFurHeadband"], - Effect: ["BlindLight", "Prone"], - Prerequisite: ["NotProtrudingFromMouth"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemNose", "ItemHead"], - Alpha: [{ Group: ["ItemHead"], Masks: [[0, 0, 208, 250], [290, 0, 210, 250]] }], - Audio: "ClothSlip", - Tint: [{Color: 0, Strength: 0.2}], - DefaultTint: "#765d4e", - }, - { - Name: "GP9GasMask", Priority: 54, Value: 75, Difficulty: 25, Time: 10, HideItem: ["ItemHeadSnorkel", "ItemMouthCaneGag", "ItemMouthCropGag", "ItemEarsFuturisticEarphones", "HatFurHeadband"], Random: false, Alpha: [{ Group: ["HairFront"], Masks: [[206, 115, 88, 70]] }], AllowLock: true, Effect: ["BlockMouth"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemHead", "ItemNose"], - Prerequisite: ["NotProtrudingFromMouth"], - Layer: [ - { Name: "Mouth", AllowColorize: true }, - { Name: "Lens", AllowColorize: true }, - { Name: "Mask", AllowColorize: true }, - { Name: "Edges", AllowColorize: true }, - ], - Tint: [{Color: 1, Strength: 0.1}], - DefaultTint: "#ccc", - }, - { Name: "OpenFaceHood", Fetish: ["Latex"], Value: 35, Priority: 40, Difficulty: 5, Time: 15, AllowLock: false, DefaultColor: "#404040", BuyGroup: "OpenFace", Block: ["ItemEars"], Hide: ["HairFront"], HideItem: ["HatFurHeadband"] , Extended: true, HasType: false }, - { - Name: "GwenHood", Fetish: ["Leather"], Value: 35, Difficulty: 5, Time: 15, AllowLock: true, DefaultColor: "#404040", Extended: true, HasType: false, - Prerequisite: ["NotProtrudingFromMouth"], - Hide: ["HairFront", "HairAccessory1", "HairAccessory2", "HairAccessory3"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars"], - Alpha: [ - // Mask over the neck area - { Group: ["ItemMouth", "ItemMouth2", "ItemMouth3"], Masks: [[200, 190, 100, 70]] }, - { Group: ["ItemHead"], Masks: [[0, 0, 203, 250], [295, 0, 205, 250]] }, - ], - HideItem: ["HatFurHeadband"], - }, - { - Name: "TechnoHelmet1", Category: ["SciFi"], Fetish: ["Metal"], Value: 100, Difficulty: 7, DefaultColor: ["#1E7484", "Default", "#2F2F2F", "#999999", "#246489"], RemoveTime: 10, AllowLock: true, DrawLocks: false, Effect: [], Extended: true, - Hide: ["HairFront", "HairBack", "HairAccessory1", "HairAccessory2", "HairAccessory3", "ItemEars", "Glasses"], - Layer: [ - { Name: "TransparentVisor", HasType: false, AllowModuleTypes: ["v1"] }, - { Name: "LightlyTintedVisor", HasType: false, CopyLayerColor: "TransparentVisor", AllowModuleTypes: ["v2"] }, - { Name: "HeavilyTintedVisor", HasType: false, CopyLayerColor: "TransparentVisor", AllowModuleTypes: ["v3"] }, - { Name: "OpaqueVisor", HasType: false, CopyLayerColor: "TransparentVisor", AllowModuleTypes: ["v4", "v5"] }, - { Name: "HypnoSpiral", HasType: false, AllowModuleTypes: ["v5"] }, - { Name: "Shine", HasType: false, AllowColorize: false, AllowModuleTypes: ["v1", "v2", "v3", "v4", "v5"] }, - { Name: "ChinStrap", HasType: false, AllowModuleTypes: ["c1"] }, - { Name: "HelmetMain", HasType: false, }, - { Name: "HelmetSecondary", HasType: false, }, - ], - Alpha: [{ Group: ["ItemHead"], Masks: [[0, 0, 500, 1000], [0, 0, 203, 250], [295, 0, 205, 250]] }], - }, - { - Name: "FuturisticHelmet", Category: ["SciFi"], Fetish: ["Metal"], Value: -1, Difficulty: 10, RemoveTime: 10, AllowLock: true, DrawLocks: false, Effect: [], - Hide: ["HairFront", "HairBack", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Glasses"], - Alpha: [{ Group: ["ItemHead"], Masks: [[0, 0, 203, 250], [295, 0, 205, 250]] }] - }, - { - Name: "LampHeadHood", Fetish: ["Forniphilia"], Value: 40, Difficulty: 3, Time: 8, RemoveTime: 5, Top: 25, Left: 135, Priority: 57, DefaultColor: ["Default", "#a13f75", "#ad4c81"], - Effect: ["BlindLight"], - Block: ["ItemHead"], - Hide: ["Hat"], - HideItem: ["HairAccessory1HairFeathers1", "HairAccessory1HairFlower1", "HairAccessory3HairFeathers1", "HairAccessory3HairFlower1"], - HideItemExclude: ["HatBandana", "HatBunnySuccubus2", "HatCrown1", "HatCrown2", "HatFacePaint", "HatFurHeadband"], - Alpha: [{Group: ["HairFront", "Mask", "ItemHead", "ItemEars"], Masks: [[0, 0, 500, 165]]}], - Layer: [ - { Name: "Inside", Priority: 1 }, - { Name: "Cord", AllowColorize: false, HideForPose: ["Suspension"] }, - { Name: "Switch", HideForPose: ["Suspension"] }, - { Name: "Lamp" }, - ], - }, - { Name: "AccentHood", Fetish: ["Latex"], Top: 25, Left: 149, Value: 30, Time: 15, AllowLock: true, HideItem: ["ItemEarsFuturisticEarphones"], Hide: ["HairFront", "HairBack", "Hat", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask"] }, - { - Name: "CollarHood", Fetish: ["Latex"], Top: 23, Left: 150, Value: 50, AllowLock: true, Time: 17, HideItem: ["ItemEarsFuturisticEarphones"], Hide: ["HairFront", "HairBack", "Hat", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask"], Layer: [ - { Name: "Hood" }, - { Name: "Collar" } - ] - }, - { - Name: "ZipperHood", Fetish: ["Latex"], Value: 20, DrawLocks: false, AllowLock: true, Time: 15, Extended: true, HideItem: ["ItemEarsFuturisticEarphones"], Hide: ["HairFront", "HairBack", "Hat", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask"], - Layer:[ - { Name: ""}, - { Name: "Lock", LockLayer: true, HasType: false, AllowColorize: false}, - ], - }, - { - Name: "LatexHabit", Fetish: ["Latex"], BuyGroup: "LatexHabit", Top: 23, Left: 85, Value: 30, Time: 5, AllowLock: true, HideItem: ["ItemEarsFuturisticEarphones"], Hide: ["HairFront", "HairBack", "Hat", "HairAccessory1", "HairAccessory2", "HairAccessory3",], Block: ["ItemEars"], - Layer:[ - { Name: "Cape"}, - { Name: "Collar"}, - { Name: "Base"}, - { Name: "Cowl"}, - { Name: "Back", Priority: 5, CopyLayerColor: "Base"} - ], - }, - { - Name: "CowHood", Fetish: ["Pet", "Latex"], Value: 30, Difficulty: 5, Time: 15, Top: 25,Left: 124, Random: false, AllowLock: true, DefaultColor: "#404040", Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask", "ItemEars", "ItemHead"], HideItem: ["ItemHeadSnorkel","HatFurHeadband"], Effect: ["BlockMouth"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNeck", "ItemHead", "ItemNose"], - Layer:[ - {Name: "Base"}, - {Name: "Spots"}, - ], - }, - { - Name: "HeadboxSeethrough", Value: 80, Priority: 54, Difficulty: 10, Time: 19, AllowLock: true, Extended: true, Top: 0, - Block: ["ItemHead", "ItemNose", "ItemEars", "ItemMouth", "ItemMouth2", "ItemMouth3"], - Hide: ["HairBack", "Hat", "HairAccessory1", "HairAccessory2", "HairAccessory3"], - Alpha: [{ Group: ["HairFront", "ItemMouth", "ItemMouth2", "ItemMouth3", "Mask", "ItemNose", "ItemHead", "Glasses", "ItemEars"], - Masks: [[0, 0, 500, 65], [0, 220, 500, 780], [0, 0, 180, 1000], [320, 0, 180, 1000]] }], - Effect: ["BlindHeavy"], - Layer: [ - { Name: "GlassInside", HasType: false }, - { Name: "LEDs", HasType: false, CopyLayerColor: "GlassInside" }, - { Name: "Frame", HasType: false }, - { Name: "Glass", AllowColorize: false }, - ], - }, - { - Name: "Slime", Category: ["Fantasy"], BuyGroup: "Slime", DefaultColor: ["#57ab5e", "#57ab5e"], Random: false, Value: 200, Difficulty: 4, Time: 15, RemoveTime: 25, - Effect: ["BlindLight", "Prone", "DeafHeavy", "BlockMouth", "GagHeavy", "BlurHeavy"], - Hide: ["HairFront", "HairBack", "Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask", "ItemEars", "ItemHead", "Hat"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemNeck", "ItemHead", "ItemNose"], - Layer: [ - { Name: "One" }, - { Name: "Two" }, - ], - Tint: [{Color: 1, Strength: 0.4}], - }, - { - Name: "KittyHood", Fetish: ["Pet"], Random: false, Value: 40, Difficulty: 2, Top: 33, Left: 142, - AllowLock: true, Extended: true, DrawLocks: false, - Hide: ["HairFront", "HairBack", "Glasses", "HairAccessory1", "HairAccessory2", "HairAccessory3"], - DefaultColor: ["Default", "Default", "Default", "#2D8736", "Default", "Default", "#000000"], - Layer: [ - { Name: "Base", HasType: false, }, - { Name: "Linings", HasType: false, }, - { Name: "Panel", HasType: false, }, - { Name: "Display", HasType: false, }, - { Name: "Openings", HasType: false, }, - { Name: "Blindfold", Top: 80, Left: 164, HasType: false, AllowModuleTypes: ["b1"], AllowColorize: false, }, - { Name: "BlindfoldNeutral", Top: 80, Left: 164, HasType: false, AllowModuleTypes: ["b1e0"], CopyLayerColor: "Drawings", }, - { Name: "BlindfoldOwO", Top: 80, Left: 164, HasType: false, AllowModuleTypes: ["b1e1"], CopyLayerColor: "Drawings", }, - { Name: "BlindfoldUwU", Top: 80, Left: 164, HasType: false, AllowModuleTypes: ["b1e2"], CopyLayerColor: "Drawings", }, - { Name: "Gag", Top: 80, Left: 164, HasType: false, AllowModuleTypes: ["g1"], AllowColorize: false, }, - { Name: "GagNeutral", Top: 80, Left: 164, HasType: false, AllowModuleTypes: ["g1e0"], CopyLayerColor: "Drawings", }, - { Name: "GagOwO", Top: 80, Left: 164, HasType: false, AllowModuleTypes: ["g1e1"], CopyLayerColor: "Drawings", }, - { Name: "GagUwU", Top: 80, Left: 164, HasType: false, AllowModuleTypes: ["g1e2"], CopyLayerColor: "Drawings", }, - { Name: "Drawings", HasImage: false, }, - { Name: "Lock", Top: 113, Left: 233, HasType: false, LockLayer: true, AllowColorize: true, } - ], - }, - { - Name: "LatexDogHood", Fetish: ["Latex", "Pet"], Random: false, Value: 20, Difficulty: 1, Top: -5, Left: 113, - AllowLock: true, - Hide: ["HairFront", "HairBack", "Glasses", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Mask"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3"], - }, - { - Name: "OpenMouthPlugHood", Fetish: ["Latex"], Random: false, Value: 40, Difficulty: 3, Top: 0, - DrawLocks: false, - AllowLock: true, - Hide: ["HairFront", "HairBack", "Glasses", "HairAccessory1", "HairAccessory2", "HairAccessory3"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3"], - Layer: [ - { Name: "FakeMouth", AllowColorize: false }, - { Name: "Lenses" }, - { Name: "Hood" }, - { Name: "Plug" } - ] - - }, - { - Name: "DroneMask", Category: ["SciFi"], Fetish: ["Latex"], Value: -1, Difficulty: 5, DefaultColor: ["#222222", "#CCCCCC", "#7F7F7F", "#00F4FD", "#E700CA", ], Time: 10, AllowLock: true, DrawLocks: false, Extended: true, DynamicAfterDraw: true, - DynamicGroupName: "ItemHead", - BuyGroup: "DroneMask", - Block:["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemNose", "ItemHead"], - Hide: ["Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "Blush", "ItemHead"], - HideItem: ["HatFacePaint", "MaskFacePaint", "ClothAccessoryFacePaint"], - Layer: [ // Colors layer references: Base, Shine, EyeRegular, MouthOnahole, Barcode - { Name: "Base", HasType: false, AllowModuleTypes: ["h0"] }, - { Name: "Shine", HasType: false, AllowModuleTypes: ["h0"] }, - { Name: "BaseHelm", HasType: false, AllowModuleTypes: ["h1","h2"], CopyLayerColor: "Base", Alpha: [{ Masks: [[0, 0, 500, 200]], Group: ["Head"] }], }, - { Name: "ShineHelm", HasType: false, AllowModuleTypes: ["h1","h2"], CopyLayerColor: "Shine" }, - - // All Non-part-reliant Patterns - { Name: "Barcode", HasType: false, AllowModuleTypes: ["p1"]}, - { Name: "Scarab", HasType: false, AllowModuleTypes: ["p2"], CopyLayerColor: "Barcode"}, - { Name: "Hexagon", HasType: false, AllowModuleTypes: ["p3"], CopyLayerColor: "Barcode"}, - { Name: "TwoLines", HasType: false, AllowModuleTypes: ["p4"], CopyLayerColor: "Barcode"}, - { Name: "Text", HasImage: false, CopyLayerColor: "Barcode"}, - - // All Eyes - { Name: "EyeRegularShine", HasType: false, AllowModuleTypes: ["e1"], CopyLayerColor: "Shine" }, - { Name: "EyeRegular", HasType: false, AllowModuleTypes: ["e1"], }, - { Name: "EyeRegularGlow", HasType: false, AllowModuleTypes: ["e1g1"], CopyLayerColor: "EyeRegular" }, - - { Name: "EyeSpiralShine", HasType: false, AllowModuleTypes: ["e2"], CopyLayerColor: "Shine" }, - { Name: "EyeSpiral", HasType: false, AllowModuleTypes: ["e2"], CopyLayerColor: "EyeRegular" }, - { Name: "EyeSpiralGlow", HasType: false, AllowModuleTypes: ["e2g1"], CopyLayerColor: "EyeRegular" }, - - { Name: "EyeSmileShine", HasType: false, AllowModuleTypes: ["e3"], CopyLayerColor: "Shine" }, - { Name: "EyeSmile", HasType: false, AllowModuleTypes: ["e3"], CopyLayerColor: "EyeRegular" }, - { Name: "EyeSmileGlow", HasType: false, AllowModuleTypes: ["e3g1"], CopyLayerColor: "EyeRegular" }, - - { Name: "EyeHolesShine", HasType: false, AllowModuleTypes: ["e4"], CopyLayerColor: "Shine" }, - { Name: "EyeHoles", HasType: false, AllowModuleTypes: ["e4"], CopyLayerColor: "EyeRegular" }, - - { Name: "EyeSculpted", HasType: false, AllowModuleTypes: ["e5"], CopyLayerColor: "EyeRegular" }, - { Name: "EyeSculptedShine", HasType: false, AllowModuleTypes: ["e5"], CopyLayerColor: "Shine" }, - { Name: "EyeSculptedGlow", HasType: false, AllowModuleTypes: ["e5g1"], CopyLayerColor: "EyeRegular" }, - - { Name: "EyeConcave", HasType: false, AllowModuleTypes: ["e6"], CopyLayerColor: "Base"}, - { Name: "EyeConcaveShine", HasType: false, AllowModuleTypes: ["e6"], CopyLayerColor: "Shine"}, - - // All Mouths - { Name: "MouthOnahole", HasType: false, AllowModuleTypes: ["m1"]}, - - { Name: "MouthFleshlightShine", HasType: false, AllowModuleTypes: ["m2"], CopyLayerColor: "Shine" }, - { Name: "MouthFleshlight", HasType: false, AllowModuleTypes: ["m2"], CopyLayerColor: "MouthOnahole" }, - - { Name: "MouthSmileShine", HasType: false, AllowModuleTypes: ["m3"], CopyLayerColor: "Shine" }, - { Name: "MouthSmile", HasType: false, AllowModuleTypes: ["m3"], CopyLayerColor: "MouthOnahole" }, - { Name: "MouthSmileGlow", HasType: false, AllowModuleTypes: ["m3g1"], CopyLayerColor: "MouthOnahole" }, - - { Name: "MouthHolesShine", HasType: false, AllowModuleTypes: ["m4"], CopyLayerColor: "Shine" }, - { Name: "MouthHoles", HasType: false, AllowModuleTypes: ["m4"], CopyLayerColor: "MouthOnahole" }, - - { Name: "MouthSculpted", HasType: false, AllowModuleTypes: ["m5"], CopyLayerColor: "MouthOnahole" }, - ], - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - { - Group: "ItemEars", - Category: "Item", - Priority: 1, - Default: false, - IsRestraint: true, - Left: 150, - Top: 50, - Zone: [[100, 0, 75, 130]], - Asset: [ - { Name: "LightDutyEarPlugs", Value: 15, Difficulty: 50, Time: 5, Visible: false, Effect: ["DeafLight"] }, - { Name: "HeavyDutyEarPlugs", Value: 30, Difficulty: 50, Time: 5, Visible: false, Effect: ["DeafHeavy"] }, - { Name: "HeadphoneEarPlugs", Value: 50, Difficulty: 50, Time: 5, Visible: false, Extended: true }, - { Name: "BluetoothEarbuds", Value: 50, Difficulty: 50, Time: 5, Visible: false, Extended: true, AlwaysExtend: true }, - { Name: "FuturisticEarphones", Priority: 54, Category: ["SciFi"], Value: 60, Difficulty: 50, Top: 20, Time: 12, DefaultColor: ["Default", "#50913C"], AllowLock: true, DrawLocks: false, Random: false, FuturisticRecolor: true, Effect: ["UseRemote"], Extended: true, HasType: false, - Layer: [ - { Name: "Band" }, - { Name: "Display" }, - { Name: "Lock", LockLayer: true,AllowColorize: true, HasType: false, ParentGroup: null}, - ] - }, - { - Name: "Headphones", Priority: 54, Value: 50, Time: 5, Random: false, Top: 20, Extended: true, AlwaysExtend: true, HasType: false, - Layer: [ - { Name: "Light" }, - { Name: "Dark" }, - ] - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemMisc", - Category: "Item", - Priority: 48, - Default: false, - Top: -250, - Zone: [[10, 0, 90, 200]], - Asset: [ - { Name: "MetalPadlock", Value: 15, Time: 10, Wear: false, Effect: [], IsLock: true}, - { Name: "IntricatePadlock", Value: 50, Time: 30, Wear: false, Effect: [], IsLock: true, PickDifficulty: 7, ExclusiveUnlock: true, AllowType: ["LockPickSeed"]}, - { Name: "HighSecurityPadlock", Value: 60, Time: 10, Wear: false, Effect: [], IsLock: true, PickDifficulty: 10, ExclusiveUnlock: true, AllowType: ["LockPickSeed"]}, - { Name: "TimerPadlock", Value: 80, Wear: false, Effect: [], IsLock: true, MaxTimer: 300, RemoveTimer: 300 }, - { Name: "CombinationPadlock", Value: 100, Random: false, Wear: false, Effect: [], IsLock: true, AllowType: ["CombinationNumber"]}, - { Name: "PasswordPadlock", Value: 100, BuyGroup: "PasswordPadlock", Random: false, Wear: false, Effect: [], IsLock: true, AllowType: ["Password", "Hint", "LockSet"]}, - { Name: "TimerPasswordPadlock", Value: -1, BuyGroup: "PasswordPadlock", Random: false, Wear: false, Effect: [], IsLock: true, AllowType: ["Password", "Hint", "LockSet"], MaxTimer: 14400, RemoveTimer: 300 }, - { Name: "OwnerPadlock", Value: 60, Time: 10, Wear: false, OwnerOnly: true, Effect: [], IsLock: true }, - { Name: "OwnerTimerPadlock", Value: 100, Wear: false, OwnerOnly: true, Effect: [], IsLock: true, MaxTimer: 604800, RemoveTimer: 300 }, - { Name: "LoversPadlock", Value: 60, Time: 10, Wear: false, LoverOnly: true, Effect: [], IsLock: true}, - { Name: "LoversTimerPadlock", Value: 100, Wear: false, LoverOnly: true, Effect: [], IsLock: true, MaxTimer: 604800, RemoveTimer: 300 }, - { Name: "MistressPadlock", Value: -1, Time: 10, Wear: false, Effect: [], IsLock: true}, - { Name: "MistressTimerPadlock", Value: -1, Wear: false, Effect: [], IsLock: true, MaxTimer: 14400, RemoveTimer: 300 }, - { Name: "PandoraPadlock", Value: -1, Time: 10, Wear: false, Effect: [], IsLock: true}, - { Name: "ExclusivePadlock", Value: 50, Time: 10, Wear: false, Effect: [], IsLock: true}, - { Name: "SafewordPadlock", Value: 40, Random: false, Wear: false, Effect: [], IsLock: true, AllowType: ["Password", "Hint", "LockSet"]}, - { Name: "MetalPadlockKey", Value: 10, Wear: false, Effect: ["Unlock-MetalPadlock"] }, - { Name: "OwnerPadlockKey", Value: 60, Wear: false, OwnerOnly: true, Effect: ["Unlock-OwnerPadlock", "Unlock-OwnerTimerPadlock"] }, - { Name: "LoversPadlockKey", Value: 40, Wear: false, LoverOnly: true, Effect: ["Unlock-LoversPadlock", "Unlock-LoversTimerPadlock"] }, - { Name: "MistressPadlockKey", Value: -1, Wear: false, Effect: ["Unlock-MistressPadlock", "Unlock-MistressTimerPadlock"] }, - { Name: "PandoraPadlockKey", Value: -1, Wear: false, Effect: ["Unlock-PandoraPadlock"] }, - { Name: "MetalCuffsKey", Value: 20, Time: 5, Wear: false, Effect: ["Unlock-MetalCuffs"] }, - { Name: "Lockpicks", Value: 25, Time: 5, Wear: false, Effect: ["Unlock-"] }, - { Name: "WoodenMaidTray", Value: -1, Enable: false, RemoveAtLogin: true, }, - { Name: "WoodenMaidTrayFull", Value: -1, Enable: false, RemoveAtLogin: true, }, - { Name: "BountySuitcase", Value: -1, Enable: false }, - { Name: "BountySuitcaseEmpty", Value: -1, Enable: false }, - { Name: "WoodenPaddle", Value: -1, Enable: false, RemoveAtLogin: true, }, - { - Name: "WoodenSign", Value: 90, Top: 0, Left: 0, Priority: 57, Difficulty: 1, Time: 5, Random: false, Prerequisite: ["NoMaidTray"], Hide: ["ItemNipples", "ItemNipplesPiercings"], AllowPose: ["Suspension"], Extended: true, DynamicAfterDraw: true, Layer: [ - { Name: "Sign" }, - { Name: "Rope" }, - { Name: "Text" }, - ] - }, - { Name: "ServingTray", Value: -1, Time: 5, Extended: true, - Layer: [ - { Name: "Tray", AllowColorize: false }, - { Name: "Objects", AllowTypes: ["Drinks", "Cake", "Cookies", "Toys"] }, - { Name: "Details", AllowTypes: ["Drinks", "Cake", "Toys"] }, - ] - }, - { Name: "TeddyBear", Fetish: ["ABDL"], Priority: 34, Value: 50, Difficulty: -10, Time: 5, IsRestraint: false, AllowPose: ["AllFours", "Hogtied", "TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "OverTheHead"], Effect: [], Extended: true, RemoveAtLogin: true }, - ], - Color: ["Default"] - }, - - { - Group: "ItemDevices", - Category: "Item", - Priority: 56, - Default: false, - IsRestraint: true, - Left: 0, - Top: -250, - Zone: [[10, 600, 90, 400], [400, 600, 90, 400]], - Asset: [ - { - Name: "WoodenBox", Priority: 58, Value: 60, Difficulty: -2, SelfBondage: 5, Time: 15, RemoveTime: 10, AllowLock: true, Audio: "LockLarge", RemoveAtLogin: true, DefaultColor: ["Default", "#600"], SetPose: ["BaseLower"], Extended: true, DynamicAfterDraw: true, MinOpacity: 0, Opacity: 0, FixedPosition: true, - AllowType: ["NWSE"], - Block: ["ItemAddon"], - Prerequisite: ["NotSuspended", "NotHogtied", "NotHorse", "NotLifted"], - Effect: ["Prone", "Enclose", "Freeze"], - AllowEffect: ["Prone", "Enclose", "BlindNormal", "GagLight", "Freeze"], - Layer: [ - { Name: "Back", Priority: 1, MinOpacity: 1, HasType: false }, - { Name: "Panel", CopyLayerColor: "Back", HasType: false }, - { Name: "Text", HasImage: false, HasType: false }, - { - Name: "Frame", CopyLayerColor: "Back", MinOpacity: 1, HasType: false, - Alpha: [{ Masks: [[0, -50, 500, 80], [0, 10, 45, 980], [445, 10, 55, 980], [0, 990, 500, 110], AssetUpperOverflowAlpha, AssetLowerOverflowAlpha] }], - }, - ], - }, - { Name: "SmallWoodenBox", Priority: 58, Value: 40, Difficulty: -2, SelfBondage: 5, Time: 15, RemoveTime: 10, AllowLock: true, Audio: "LockLarge", Prerequisite: ["NotSuspended", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader", "CanKneel", "NotLifted"], SetPose: ["Kneel"], Block: ["ItemAddon"], Effect: ["ForceKneel", "Prone", "Enclose", "BlindNormal", "GagLight", "Freeze"], HideItem: ["ShoesFlippers"], Alpha: [{ Masks: [[1, 1, 70, 999], [420, 1, 80, 999], AssetUpperOverflowAlpha, AssetLowerOverflowAlpha] }], RemoveAtLogin: true }, - { Name: "MilkCan", Priority: 58, Fetish: ["Metal"], Value: -1, Difficulty: 1, Time: 15, RemoveTime: 10, SetPose: ["Kneel"], Effect: ["BlindHeavy", "Prone", "Enclose", "GagHeavy", "Freeze"], HideItem: ["ShoesFlippers"], RemoveAtLogin: true }, - { - Name: "WaterCell", Priority: 58, Fetish: ["Metal"], Value: -1, Difficulty: 1, Time: 15, RemoveTime: 15, SetPose: ["Suspension", "LegsClosed"], Effect: ["Prone", "Enclose", "GagMedium", "Freeze"], HideItem: ["ShoesFlippers"], Block: ["ItemFeet"], RemoveAtLogin: true, - Alpha: [{ Masks: [[0, 145, 81, 910], [419, 145, 81, 910]] }], - OverrideHeight: { Height: -150, Priority: 41, HeightRatioProportion: 0 }, - }, - { - Name: "Cage", Priority: 58, Fetish: ["Metal"], Value: 120, Difficulty: 4, Time: 15, RemoveTime: 10, AllowLock: true, Audio: "LockLarge", RemoveAtLogin: true, - Prerequisite: ["NotKneeling", "NotSuspended", "NotLifted"], - Effect: ["Prone", "Enclose", "Freeze"], - HideItem: ["ShoesFlippers"], - Block: ["ItemAddon"], - Alpha: [{ Masks: [[1, 80, 105, 900], [410, 80, 105, 900]] }], - SetPose: ["BaseLower"], - Layer: [ - { Name: "Frame", ColorGroup: "Cage" }, - { Name: "Mesh", ColorGroup: "Cage" }, - { Name: "Tint" }, - ] - }, - { Name: "LowCage", Priority: 58, Fetish: ["Metal"], Value: 80, Difficulty: 4, Time: 15, RemoveTime: 10, AllowLock: true, Audio: "LockLarge", Block: ["ItemAddon"], Prerequisite: ["NotLifted", "NotSuspended", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader"], SetPose: ["Kneel"], Effect: ["ForceKneel", "Prone", "Enclose", "Freeze"], HideItem: ["ShoesFlippers"], Alpha: [{ Masks: [[1, 80, 75, 900], [400, 80, 100, 900]] }], RemoveAtLogin: true }, - { Name: "SaddleStand", Fetish: ["Metal"], Priority: 39, Value: 100, Difficulty: -2, Time: 10, AllowLock: true, Prerequisite: ["LegsOpen", "AllFours", "NotSuspended", "NotHogtied", "NotHorse", "NotKneeling", "NotKneelingSpread", "NotShackled"], SetPose: ["LegsOpen"], Effect: ["Prone", "Freeze", "Mounted"], Block: ["ItemPelvis", "ItemLegs", "ItemFeet"], AllowActivityOn: ["ItemPelvis", "ItemLegs", "ItemFeet"], Height: 30, RemoveAtLogin: true }, - { Name: "BurlapSack", Priority: 39, Value: 35, Difficulty: 5, SelfBondage: 4, Time: 15, RemoveTime: 6, Audio: "Bag", Prerequisite: ["NotSuspended", "AllFours", "NotHogtied", "NotYoked", "NotMounted", "NotKneelingSpread", "NoFeetSpreader"], Hide: ["Cloth", "ClothLower", "Shoes", "ItemBoots", "ItemLegs", "ItemFeet", "ItemArms", "ItemButt", "TailStraps", "Wings", "BodyLower", "Socks", "ItemHidden", "ItemNipplesPiercings", "ItemTorso", "ItemTorso2", "Panties", "Garters"], SetPose: ["Kneel", "BackElbowTouch"], Effect: ["ForceKneel", "Block", "Prone", "Freeze"], Block: ["ItemArms", "ItemBreast", "ItemButt", "ItemFeet", "ItemHands", "ItemLegs", "ItemMisc", "ItemNipples", "ItemNipplesPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings", "ItemBoots"] }, - { Name: "InflatableBodyBag", Fetish: ["Latex"], Priority: 31, Value: 225, Difficulty: 1, SelfBondage: 6, Time: 30, RemoveTime: 50, AllowLock: true, Audio: "Bag", Prerequisite: ["NotSuspended", "AllFours", "NotHogtied", "NotYoked", "NotMounted", "NotKneelingSpread", "NoFeetSpreader"], Hide: ["Cloth", "Suit", "ClothLower", "SuitLower", "Shoes", "ItemBoots", "ItemLegs", "ItemFeet", "ItemArms", "ItemButt", "TailStraps", "Wings", "BodyLower", "Socks", "ItemNipplesPiercings", "Panties", "ItemPelvis", "Garters"], HideItem: ["ItemVulvaFullLatexSuitWand", "ItemNipplesLactationPump", "ClothAccessoryPoncho"], AllowPose: ["Kneel"], SetPose: ["LegsClosed", "BackElbowTouch"], Effect: ["Block", "Prone", "Freeze"], Block: ["ItemArms", "ItemBreast", "ItemButt", "ItemFeet", "ItemHands", "ItemLegs", "ItemMisc", "ItemNipples", "ItemNipplesPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings", "ItemBoots"], Extended: true, SelfUnlock: false, AllowActivePose: ["Kneel"] }, - { - Name: "FurBlanketWrap", Priority: 31, Value: 225, Difficulty: 1, Top: 0, SelfBondage: 5, Time: 30, RemoveTime: 50, - Prerequisite: ["NotSuspended", "AllFours", "NotHogtied", "NotYoked", "NotMounted", "NotKneelingSpread", "NoFeetSpreader"], - Hide: ["ItemLegs", "ClothLower", "Cloth", "Suit", "Shoes", "ItemArms", "ItemButt", "TailStraps", "Wings", "ItemNipplesPiercings", "Panties", "ItemPelvis", "Garters"], - HideItem: ["ItemVulvaFullLatexSuitWand", "ItemNipplesLactationPump", "ClothAccessoryPoncho"], - AllowPose: ["Kneel"], SetPose: ["LegsClosed", "BackElbowTouch"], - Effect: ["Block", "Prone", "Freeze"], - Block: ["ItemArms", "ItemBreast", "ItemButt", "ItemFeet", "ItemHands", "ItemLegs", "ItemMisc", "ItemNipples", "ItemNipplesPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - Alpha: [{ Masks: [[0, 0, 500, 900]], Group: ["SuitLower", "Shoes", "ItemBoots", "ItemFeet", "BodyLower", "Socks"] }], - Extended: true, SelfUnlock: false, DrawLocks: false, AllowActivePose: ["Kneel"], Layer: [ - { Name: "Blanket" }, - { Name: "Belts", AllowTypes: ["Belts"] } - ] - }, - { - Name: "BondageBench", Fetish: ["Leather"], Priority: 1, Value: 250, SelfBondage: 0, Time: 10, RemoveTime: 10, Extended: true, RemoveAtLogin: true, - Prerequisite: ["NotKneeling", "AllFours", "NotSuspended", "NotHogtied", "NoFeetSpreader"], - SetPose: ["LegsClosed"], - Effect: ["Mounted"], - AllowLock: true, - Layer: [ - { Name: "Bench", AllowColorize: true, Priority: 1, HasType: false }, - { Name: "Straps", AllowColorize: true, Priority: 53, HasType: true }, - ], - }, - - { Name: "BBQ", Priority: 1, Value: 30, Difficulty: -10, Time: 5, IsRestraint: false, Effect: [], RemoveAtLogin: true, FixedPosition: true }, - { Name: "WetFloor", Priority: 70, Value: 30, Difficulty: -10, Time: 5, IsRestraint: false, Effect: [], RemoveAtLogin: true, FixedPosition: true, DefaultColor: ["#fdc800", "#000000"], - Layer: [ - { Name: "Sign" }, - { Name: "Text" } - ] - }, - { Name: "LittleMonster", Priority: 34, Value: 40, Difficulty: -10, Time: 5, IsRestraint: false, AllowPose: ["AllFours", "Hogtied", "TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "OverTheHead"], Effect: [], Extended: true, RemoveAtLogin: true }, - { Name: "Familiar", Priority: 6, Value: 200, Difficulty: -10, Time: 5, IsRestraint: false, AllowPose: ["AllFours", "Hogtied", "TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "OverTheHead"], Effect: [], Extended: true, RemoveAtLogin: true, HideItem: ["ItemMiscTeddyBear"] }, - { Name: "Coffin", Priority:70, Value: 240, Top: -150, Left:10, Difficulty: -20, SelfBondage: 1, Time: 15, RemoveTime: 10, AllowLock: true, Audio: "LockLarge", Prerequisite: ["NotLifted", "AllFours", "NotSuspended", "NotHogtied", "NotHorse", "NotKneeling", "NoFeetSpreader"], Block: ["ItemAddon"], SetPose: ["LegsClosed"], HideItem: ["ShoesFlippers"], - Layer: [ - {Name:"Inside", Priority:1, HasType: false}, - {Name:"Frame", Priority:57, ColorGroup: "Main", HasType: false, Alpha: [{ Masks: [ - [0, 0, 500, 20], //Above - [0, 950, 500, 50], //Below - [0, 0, 160, 1000], //Left side is covered by lid - [360, 0, 135, 200], //Triangle approx of right side - [370, 200, 135, 1000], - [355, 500, 15, 500], - [350, 600, 5, 400], - [345, 700, 5, 300], - [340, 800, 5, 200] - ]}]}, - {Name:"Open", Priority:58, ColorGroup:"Main", AllowTypes:[""]}, - {Name:"Closed", Priority:59, ColorGroup:"Main", AllowTypes:["Closed"]} - ], - Extended:true, RemoveAtLogin: true - }, - { Name: "CryoCapsule", Category: ["SciFi"], Priority:70, Value: 240, Top: 0, Left:10, Difficulty: -20, SelfBondage: 1, Time: 15, RemoveTime: 10, AllowLock: true, Audio: "LockLarge", Prerequisite: ["NotLifted", "AllFours", "NotSuspended", "NotHogtied", "NotHorse", "NotKneeling", "NoFeetSpreader"], Block: ["ItemAddon"], SetPose: ["LegsClosed"], HideItem: ["ShoesFlippers"], - Layer: [ - {Name:"Inside", Priority:1, HasType: false}, - {Name:"Frame", Priority:57, ColorGroup: "Main", HasType: false, Alpha: [{ Masks: [ - [0, 0, 500, 50], //Above - [0, 970, 500, 30], //Below - [0, 0, 160, 1000], //Left side is covered by lid - [360, 0, 135, 200], //Triangle approx of right side - [370, 200, 135, 1000], - [365, 500, 15, 500], - [355, 600, 5, 400], - [355, 700, 5, 300], - [350, 800, 5, 200] - ]}]}, - {Name:"Open", Priority:58, ColorGroup:"Main", AllowTypes:[""]}, - {Name:"Closed", Priority:59, ColorGroup:"Main", AllowTypes:["Closed"]} - ], - Extended:true, RemoveAtLogin: true - }, - { - Name: "OneBarPrison", Fetish: ["Metal"], Priority: 16, Value: 75, Difficulty: 8, SelfBondage: 2, Time: 20, AllowLock: true, Prerequisite: ["AccessVulva", "AllFours", "LegsOpen", "NotSuspended", "NotHogtied", "NotHorse", "NotKneeling", "NotChaste"], SetPose: ["LegsOpen"], Effect: ["FillVulva", "Prone", "Freeze", "Mounted"], Block: ["ItemPelvis", "ItemLegs", "ItemVulva", "ItemFeet"], AllowActivityOn: ["ItemPelvis", "ItemLegs", "ItemFeet"], Layer: [ - { Name: "Bar", AllowColorize: true }, - { Name: "Pussy", AllowColorize: false } - ], - RemoveAtLogin: true - }, - { Name: "TheDisplayFrame", Fetish: ["Metal"], Value: 100, Difficulty: 50, SelfBondage: 5, Time: 10, AllowLock: true, Audio: "LockLarge", Prerequisite: ["DisplayFrame", "AllFours", "NotSuspended", "NotHogtied", "NotHorse", "NotKneeling", "NotMasked"], SetPose: ["LegsClosed", "BackElbowTouch"], Effect: ["Prone", "Freeze", "Block", "Mounted"], HideItem: ["ShoesFlippers"], Block: ["ItemArms", "ItemLegs", "ItemFeet", "ItemBoots", "ItemNeckAccessories"], RemoveAtLogin: true }, - { Name: "Sybian", Priority: 22, Value: 80, Difficulty: 1, Time: 10, IsRestraint: false, Prerequisite: ["AccessVulva", "AllFours", "LegsOpen", "NotSuspended", "NotHogtied", "NotShackled", "NotChaste", "NotHorse"], Hide: ["Shoes", "ItemBoots", "ItemLegs", "ItemVulva"], SetPose: ["KneelingSpread"], Effect: ["FillVulva", "Egged", "Freeze", "Mounted"], Block: ["ItemLegs", "ItemFeet", "ItemBoots", "ItemPelvis", "ItemButt", "ItemVulva"], AllowActivityOn: ["ItemLegs", "ItemFeet", "ItemBoots", "ItemPelvis"], RemoveAtLogin: true, ArousalZone: "ItemVulva", DynamicScriptDraw: true }, - { Name: "StrapOnSmooth", Fetish: ["Leather"], Priority: 34, Value: 25, Difficulty: 1, Time: 10, IsRestraint: false, AllowActivity: ["PenetrateItem"] }, - { Name: "StrapOnStuds", Fetish: ["Leather"], Priority: 34, Value: 25, Difficulty: 1, Time: 10, IsRestraint: false, AllowActivity: ["PenetrateItem"] }, - { Name: "DisplayCase", Priority: 58, Fetish: ["Metal"], Value: 60, Difficulty: -2, SelfBondage: 1, Time: 15, RemoveTime: 10, AllowLock: true, Audio: "LockLarge", Prerequisite: ["NotSuspended", "NotLifted"], Effect: ["Prone", "Enclose", "DeafLight", "GagLight", "Freeze"], Block: ["ItemAddon"], HideItem: ["ShoesFlippers"], Alpha: [{ Masks: [[1, 1, 70, 999], [420, 1, 80, 999], AssetUpperOverflowAlpha, AssetLowerOverflowAlpha] }], RemoveAtLogin: true, SetPose: ["BaseLower"] }, - { Name: "SmallDisplayCase", Priority: 58, Fetish: ["Metal"], Value: 40, Difficulty: -2, SelfBondage: 1, Time: 15, RemoveTime: 10, AllowLock: true, Audio: "LockLarge", Prerequisite: ["NotSuspended", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader", "NotLifted"], Block: ["ItemAddon"], SetPose: ["Kneel"], Effect: ["ForceKneel", "Prone", "Enclose", "DeafLight", "GagLight", "Freeze"], HideItem: ["ShoesFlippers"], Alpha: [{ Masks: [[1, 1, 70, 999], [420, 1, 80, 999], AssetUpperOverflowAlpha, AssetLowerOverflowAlpha] }], RemoveAtLogin: true }, - { Name: "FuturisticCrate", Priority: 58, Category: ["SciFi"], Fetish: ["Metal"], Value: 70, FixedPosition: true, Difficulty: -6, SelfBondage: 1, Time: 15, RemoveTime: 10, AllowLock: true, DrawLocks: false, Audio: "LockLarge", Prerequisite: ["NotSuspended", "NotLifted"], LayerVisibility: true, - Effect: ["Tethered"], - AllowEffect: ["GagLight", "Freeze", "Prone", "BlindLight", "Enclose", "BlindNormal", "BlindHeavy", "Block", "Egged", "Vibrating", "FillVulva", "Edged", "BlockKneel", "Mounted"], - HideItem: ["ShoesFlippers"], - Block: ["ItemAddon"], - ArousalZone: "ItemVulva", - RemoveAtLogin: true, Extended: true, DynamicScriptDraw: true, DynamicBeforeDraw: true, - DefaultColor: ["#222222", "Default", "#444444", "Default", "Default", "#FF1199", "Default", "#444444", "#555555", "#3B7F2C","Default", "Default", "#BBBBFF", "Default", ], - Layer: [ - { Name: "Body", ColorGroup: "Padding", Priority: 1, HasType: false}, - { Name: "StrapsArms", ColorGroup: "Structure", Priority: 40, HasType: false, AllowModuleTypes:["a3"]}, - { Name: "StrapsHarness", ColorGroup: "Harness", Priority: 25, HasType: false, ModuleType: ["h"], AllowModuleTypes:["h1", "h2", "h3", "h4"]}, - { Name: "ClampsHarness", ColorGroup: "Harness", Priority: 25, HasType: false, ModuleType: ["h"], AllowModuleTypes:["h1", "h2", "h3", "h4"]}, - { Name: "DevicePleasure", ColorGroup: "Pleasure", Priority: 25, HasType: false, AllowModuleTypes:["d1"]}, - { Name: "DevicePleasurePlug", ColorGroup: "Pleasure", Priority: 25, HasType: false, AllowModuleTypes:["d1"]}, - { Name: "DevicePleasureHolder", ColorGroup: "Pleasure", Priority: 25, HasType: false, AllowModuleTypes:["d1"]}, - { Name: "DevicePleasureStructure", ColorGroup: "Structure", Priority: 2, HasType: false, ModuleType: ["t"], AllowModuleTypes:["t1", "t2", "t3", "d1", "l1", "a1", "a2"]}, - { Name: "StrapsArmsMesh", ColorGroup: "Padding", Priority: 2, HasType: false, AllowModuleTypes:["a3"]}, - { Name: "Display", Priority: 58, HasType: false, }, - { Name: "Lock", Priority: 58, HasType: false, LockLayer: true }, - { Name: "Frame", ColorGroup: "Structure", Priority: 58, HasType: false, Alpha: [{ Masks: [[0, 0, 55, 1000], [420, 0, 80, 1000], [0, 995, 500, 5], AssetUpperOverflowAlpha, AssetLowerOverflowAlpha] }], }, - { Name: "Glass", Priority: 57, HasType: false, ModuleType: ["w"], AllowModuleTypes: ["w1", "w2", "w3"], Visibility: "AllExceptPlayerDialog" }, - { Name: "Lid", ColorGroup: "Structure", Priority: 57, HasType: false, AllowModuleTypes: ["w4"], Visibility: "Others" }, - { Name: "Lid_Window", Priority: 57, CopyLayerColor: "Lid", HasType: false, ModuleType:["w"], AllowModuleTypes: ["w2", "w3"], Visibility: "AllExceptPlayerDialog" }, - { Name: "StrapsLegs", CopyLayerColor: "StrapsArms", Priority: 56, HasType: false, AllowModuleTypes:["l3"]}, - { Name: "StrapsLegsClosed", CopyLayerColor: "StrapsArms", Priority: 56, HasType: false, AllowModuleTypes:["l2"]}, - { Name: "StrapsLegsMesh", Priority: 2, CopyLayerColor: "StrapsArmsMesh", HasType: false, AllowModuleTypes:["l3"]}, - ], - }, - { Name: "DollBox", Priority: 58, Value: 20, Difficulty: -2, SelfBondage: 1, Time: 1, RemoveTime: 1, Left: -8, Top: -20, AllowLock: true, DrawLocks: false, Audio: "LockLarge", Prerequisite: ["NotSuspended", "NotLifted"], Effect: ["Freeze", "Prone", "Enclose"], HideItem: ["ShoesFlippers"], - Block: ["ItemAddon"], DynamicAfterDraw: true, HasType: false, - RemoveAtLogin: true, Extended: true, SetPose: ["BaseLower"], - DefaultColor: ["#530E50", "#DD2BD5","#A0A0A0", "#D8D8D8","#854DA5", "#9EDDFA"], - Layer: [ - { Name: "Back", Priority: 1, ColorGroup: "Box" }, - { Name: "Cover", Priority: 58, ColorGroup: "Box", Alpha: [{ Masks: [[0, 0, 100, 1000], [410, 0, 90, 1000], [0, 880, 500, 140], [0, 0, 500, 70], AssetUpperOverflowAlpha, AssetLowerOverflowAlpha] }] }, - { Name: "DollText", Priority: 58, ColorGroup: "Text" }, - { Name: "Text", Priority: 58, ColorGroup: "Text", HasImage: false }, - { Name: "Heart", Priority: 58 }, - { Name: "Glass", Priority: 57 }, - ], - }, - { Name: "WoodenBoxOpenHead", Value: 60, Difficulty: -2, SelfBondage: 3, Time: 15, RemoveTime: 10, AllowLock: true, Audio: "LockLarge", Prerequisite: ["NotSuspended", "NotHogtied", "NotYoked", "NotLifted"], Hide: ["Wings"], Effect: ["Prone", "Freeze", "Block"], HideItem: ["ShoesFlippers"], Alpha: [{ Masks: [[1, 220, 70, 999], [420, 220, 80, 999], AssetUpperOverflowAlpha, AssetLowerOverflowAlpha] }], Block: ["ItemAddon", "ItemArms", "ItemBreast", "ItemButt", "ItemFeet", "ItemLegs", "ItemMisc", "ItemNipples", "ItemNipplesPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings", "ItemBoots", "ItemHands"], RemoveAtLogin: true, SetPose: ["BaseLower"] }, - { Name: "SmallWoodenBoxOpenHead", Value: 40, Difficulty: -2, SelfBondage: 3, Time: 15, RemoveTime: 10, AllowLock: true, Audio: "LockLarge", Prerequisite: ["NotSuspended", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader", "CanKneel", "NotYoked", "NotLifted"], Hide: ["Wings"], SetPose: ["Kneel"], Effect: ["ForceKneel", "Prone", "Freeze", "Block"], HideItem: ["ShoesFlippers"], Alpha: [{ Masks: [[1, 220, 70, 999], [420, 220, 80, 999], AssetUpperOverflowAlpha, AssetLowerOverflowAlpha] }], Block: ["ItemArms", "ItemAddon", "ItemBreast", "ItemButt", "ItemFeet", "ItemLegs", "ItemMisc", "ItemNipples", "ItemNipplesPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings", "ItemBoots", "ItemHands"], RemoveAtLogin: true }, - { Name: "WoodenStocks", Value: 150, Difficulty: 50, SelfBondage: 4, Time: 10, AllowLock: true, Prerequisite: ["NotKneeling", "AllFours", "NotSuspended", "NotHogtied", "NotKneelingSpread", "NoItemArms", "LegsOpen"], SetPose: ["Yoked", "LegsOpen"], Effect: ["Prone", "Freeze", "Block", "Mounted"], Block: ["ItemArms", "ItemFeet", "ItemLegs", "ItemBoots"], AllowActivityOn: ["ItemArms", "ItemFeet", "ItemLegs", "ItemBoots"],RemoveAtLogin: true, HideItem: ["ItemMiscTeddyBear"], }, - { - Name: "Vacbed", Fetish: ["Latex"], ParentGroup: "BodyUpper", Value: 200, Difficulty: 50, BuyGroup: "Vac", Priority: 36, SelfBondage: 3, Time: 10, Extended: true, - Prerequisite: ["NotKneeling", "AllFours", "NotSuspended", "NotHogtied", "NotKneelingSpread", "NoItemArms", "LegsOpen", "NoItemHands", "NoItemLegs", "NoHorse", "NoItemFeet"], - Hide: ["ItemNeckAccessories", "ItemNeckRestraints", "HairBack", "ClothAccessory", "Bracelet", "Garters"], - SetPose: ["Yoked", "BaseLower"], - Effect: ["Prone", "Freeze", "Block", "Mounted", "Chaste", "ButtChaste"], - HideItem: ["ShoesFlippers"], - Alpha: [{ Masks: [[1, 1, 70, 999], [420, 1, 80, 999]] }], - Block: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemFeet", "ItemHands", "ItemLegs", "ItemMisc", "ItemAddon", "ItemNeck", "ItemNeckAccessories", "ItemNeckRestraints", "ItemNipples", "ItemNipplesPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - AllowActivityOn: ["ItemNeck", "ItemArms", "ItemHands", "ItemBreast", "ItemNipples", "ItemPelvis", "ItemLegs", "ItemFeet", "ItemBoots", "ItemButt", "ItemVulva", "ItemVulvaPiercings"], - RemoveAtLogin: true - }, - { - Name: "VacBedDeluxe", Fetish: ["Latex"], Priority: 36, Value: 250, Difficulty: 50, SelfBondage: 3, Time: 10, RemoveTime: 10, AllowLock: true, RemoveAtLogin: true, DefaultColor: ["#808080", "#808080", "#808080"], Extended: true, MinOpacity: 0.25, MaxOpacity: 1, Opacity: 1, - Hide: ["Hands", "HairBack", "Cloth", "ClothLower", "ClothAccessory", "Necklace", "Suit", "SuitLower", "Bra", "Panties", "Socks", "RightAnklet", "LeftAnklet", "Shoes", "Gloves", "TailStraps", "Wings", "ItemFeet", "ItemLegs", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemNipples", "ItemNipplesPiercings", "ItemBreast", "ItemArms", "ItemHands", "ItemBoots", "Pussy", "Corset", "Bracelet", "Garters"], - HideItem: ["ItemMiscTeddyBear"], - Prerequisite: ["NotKneeling", "AllFours", "NotSuspended", "NotHogtied", "NotKneelingSpread", "NoItemArms", "NoItemHands", "NoItemLegs", "NoHorse", "NoItemFeet"], - Block: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemFeet", "ItemHands", "ItemLegs", "ItemMisc", "ItemNeck", "ItemNeckAccessories", "ItemNeckRestraints", "ItemNipples", "ItemNipplesPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - AllowActivityOn: ["ItemArms", "ItemFeet", "ItemLegs", "ItemBoots"], - SetPose: ["BaseUpper", "BaseLower"], - Effect: ["Prone", "Freeze", "Block", "Mounted"], - FreezeActivePose: ["BodyUpper", "BodyLower"], - DrawLocks: false, - AllowType: ["ArmsDownLegsTogether","ArmsUpLegsSpread","ArmsUpLegsTogether"], - AllowPose: ["Yoked","BaseLower","LegsClosed"], - AllowEffect: ["Prone", "Freeze", "Block", "Mounted"], - Layer: [ - { Name: "SheetBack", ColorGroup:"Sheet", Priority: 1 }, - { Name: "SheetFront", ColorGroup:"Sheet", Priority: 2 }, - { Name: "Upper", ColorGroup:"Body", ParentGroup: "BodyUpper" }, - { Name: "Lower", ColorGroup:"Body", ParentGroup: "BodyLower" }, - { Name: "Frame", MinOpacity: 1, Priority: 3 } - ] - }, - { - Name: "VacbedClear", Fetish: ["Latex"], ParentGroup: "BodyUpper", Value: -1, Difficulty: 50, BuyGroup: "Vac", Priority: 36, SelfBondage: 3, Time: 10, - Prerequisite: ["NotKneeling", "AllFours", "NotSuspended", "NotHogtied", "NotKneelingSpread", "NoItemArms", "LegsOpen", "NoItemHands", "NoItemLegs", "NoHorse", "NoItemFeet"], - Hide: ["ItemNeckAccessories", "ItemNeckRestraints", "ClothAccessory", "Shoes"], - HideItem: ["ItemMiscTeddyBear"], - SetPose: ["Yoked", "BaseLower"], - Effect: ["Prone", "Freeze", "Block", "Mounted", "Chaste", "ButtChaste"], - Alpha: [{ Masks: [[1, 1, 60, 999], [440, 1, 60, 999]] }], - Block: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemFeet", "ItemHands", "ItemLegs", "ItemMisc", "ItemAddon", "ItemNeck", "ItemNeckAccessories", "ItemNeckRestraints", "ItemNipples", "ItemNipplesPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - AllowActivityOn: ["ItemNeck", "ItemArms", "ItemHands", "ItemBreast", "ItemNipples", "ItemPelvis", "ItemLegs", "ItemFeet", "ItemBoots", "ItemButt", "ItemVulva", "ItemVulvaPiercings"], - RemoveAtLogin: true - }, - { - Name: "Crib", Category: ["ABDL"], Fetish: ["ABDL"], Priority: 1, Value: 100, - Difficulty: 0, SelfBondage: 1, Time: 15, RemoveTime: 10, IsRestraint: true, AllowLock: true, Left: -30, Top: -235, - Effect: ["Freeze", "Leash"], HideItem: ["ShoesFlippers"], RemoveAtLogin: true, Prerequisite: ["AllFours", "NotSuspended", "NotHogtied"], Extended: true, SetPose: ["BaseLower"], - Layer: [ - { Name: "GateClosed", CopyLayerColor: "Frame", AllowModuleTypes: ["g1"], HasType: false }, - { Name: "GateOpen", CopyLayerColor: "Frame", AllowModuleTypes: ["g0"], HasType: false }, - { Name: "Frame", ParentGroup: null, HasType: false }, - { Name: "Mattress", ParentGroup: null, HasType: false }, - { Name: "Pillow", ParentGroup: null, HasType: false }, - { Name: "PillowTrim", ParentGroup: null, HasType: false }, - { Name: "Plushies", Priority: 54, ParentGroup: null, AllowModuleTypes: ["p1"], HasType: false } - ], - }, - { - Name: "Bed", Value: 100, Priority: 1, Difficulty: -20, SelfBondage: 0, Time: 5, RemoveTime: 5, RemoveAtLogin: true, DefaultColor: ["#523629", "#888990", "#808284"], BuyGroup: "Bed", - OverrideHeight: { Height: 0, HeightRatioProportion: 1, Priority: 21 }, - RemoveItemOnRemove: [ - { Group: "ItemAddon", Name: "Covers" }, - { Group: "ItemAddon", Name: "BedRopes" }, - { Group: "ItemAddon", Name: "BedStraps" }, - { Group: "ItemAddon", Name: "BedTape" }, - { Group: "ItemAddon", Name: "BedChains" }, - { Group: "ItemArms", Name: "UnderBedBondageCuffs" }, - { Group: "ItemArms", Name: "MedicalBedRestraints" }, - { Group: "ItemArms", Name: "HempRope", Type: "BedSpreadEagle" }, - { Group: "ItemLegs", Name: "MedicalBedRestraints" }, - { Group: "ItemFeet", Name: "HempRope", Type: "BedSpreadEagle" }, - { Group: "ItemFeet", Name: "MedicalBedRestraints" }, - ], - Effect: ["Freeze", "Mounted", "OnBed"], - Prerequisite: ["AllFours", "NotSuspended", "NotHogtied"], - SetPose: ["BaseLower"], - Layer: [ - { Name: "BedFrame" }, - { Name: "Mattress" }, - { Name: "Pillow" } - ] - }, - { - Name: "X-Cross", Priority: 1, Value: 200, Left: 0, Top: -50, Difficulty: 9, SelfBondage: 1, Time: 15, AllowLock: true, RemoveAtLogin: true, Prerequisite: ["CuffedArms", "CuffedFeet", "AllFours", "NotSuspended", "NotHogtied", "LegsOpen", "NotKneeling"], SetPose: ["OverTheHead", "Spread"], HideItem: ["ShoesMistressBoots", "ShoesPonyBoots", "ShoesThighHighLatexHeels"], Effect: ["Prone", "Freeze", "Block", "Mounted"], Block: ["ItemArms", "ItemFeet", "ItemLegs", "ItemBoots"], AllowActivityOn: ["ItemArms", "ItemFeet", "ItemLegs", "ItemBoots"], - OverrideHeight: { Height: -25, Priority: 10 }, - Layer: [ - { Name: "Cross" }, - { Name: "Padding" } - ] - }, - { - Name: "ChangingTable", Category: ["ABDL"], Fetish: ["ABDL"], Priority: 1, Value: 100, Difficulty: 0, SelfBondage: 1, Time: 15, RemoveTime: 10, IsRestraint: true, AllowLock: false, Left: -30, Top: -235, Effect: ["Freeze"], RemoveAtLogin: true, Prerequisite: ["NotSuspended", "NotHogtied"], SetPose: ["BaseLower"], Layer: [ - { Name: "Frame" }, - { Name: "Table" } - ] - }, - { - Name: "Locker", Priority: 58, Value: 50, Difficulty: -2, SelfBondage: 5, Time: 15, RemoveTime: 10, Top: 0, AllowLock: true, Extended: true, RemoveAtLogin: true, MinOpacity: 0, Opacity: 0, FixedPosition: true, - AllowType: ["Ventless"], - Block: ["ItemAddon"], - Prerequisite: ["NotSuspended", "NotHogtied", "NotLifted"], - Effect: ["Prone", "Enclose", "BlindLight", "Freeze"], - AllowEffect: ["GagLight", "BlindHeavy"], - Layer: [ - { Name: "Back", Priority: 1, MinOpacity: 1, HasType: false }, - { Name: "Door", CopyLayerColor: "Back", HasType: false }, - { Name: "VentCovers", CopyLayerColor: "Back", AllowTypes: ["Ventless"] }, - { Name: "Handle", AllowColorize: false, HasType: false }, - { - Name: "Frame", CopyLayerColor: "Back", MinOpacity: 1, HasType: false, - Alpha: [{ Masks: [[0, 0, 135, 1000], [350, 0, 150, 1000], [135, 0, 215, 25], [135, 995, 215, 5], AssetUpperOverflowAlpha] }], - }, - ], - }, - { - Name: "SmallLocker", Priority: 58, Value: 40, Difficulty: -2, SelfBondage: 5, Time: 15, RemoveTime: 10, Top: 0, AllowLock: true, Extended: true, RemoveAtLogin: true, MinOpacity: 0, Opacity: 0, - AllowType: ["Ventless"], - Prerequisite: ["NotSuspended", "NotHogtied", "NotMounted", "NotKneelingSpread", "NoFeetSpreader", "CanKneel", "NotLifted"], - SetPose: ["Kneel"], - Block: ["ItemAddon"], - Effect: ["ForceKneel", "Prone", "Enclose", "BlindLight", "Freeze"], - AllowEffect: ["GagLight", "BlindHeavy"], - Layer: [ - { Name: "Back", Priority: 1, MinOpacity: 1, HasType: false }, - { Name: "Door", CopyLayerColor: "Back", HasType: false }, - { Name: "VentCovers", CopyLayerColor: "Back", AllowTypes: ["Ventless"] }, - { Name: "Handle", AllowColorize: false, HasType: false }, - { - Name: "Frame", CopyLayerColor: "Back", MinOpacity: 1, HasType: false, - Alpha: [{ Masks: [[0, 0, 135, 750], [350, 0, 150, 750], [135, 0, 215, 25], [135, 725, 215, 25], AssetUpperOverflowAlpha ] }], - }, - ], - }, - { - Name: "ConcealingCloak", Value: 75, Difficulty: 0, Top: 0, SelfBondage: 5, Time: 7, AllowLock: true, - Prerequisite: ["NotSuspended", "AllFours", "Notkneeling", "NotHogtied", "NotYoked", "NotMounted", "NotKneelingSpread"], - Hide: [ "Suit", "ItemArms", "ItemButt", "TailStraps", "Wings", "ItemNipplesPiercings"], - HideItem: ["ItemVulvaFullLatexSuitWand", "ClothLowerTutu", "ClothJacket"], Effect: ["Prone"], - Block: ["ItemArms", "ItemBreast", "ItemButt", "ItemHands", "ItemLegs", "ItemMisc", "ItemNipples", "ItemNipplesPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - SetPose: ["BaseUpper"], - Layer: [ - { Name: "Front", Priority: 48 }, - { Name: "Back", Priority: 3, CopyLayerColor: "Front" }, - { Name: "Strap", Priority: 52 } - ] - }, - { - Name: "Kennel", Fetish: ["Metal", "Pet"], Top: 0, Value: 150, Time: 15, RemoveTime: 10, AllowLock: true, AlwaysExtend: true, RemoveAtLogin: true, Extended: true, FixedPosition: true, DynamicBeforeDraw: true, DynamicScriptDraw: true, - DynamicAudio: (C) => InventoryItemDevicesKennelGetAudio(C), - DefaultColor: ["#2E2E29", "#780E0E", "#2E2E29", "#2E2E29"], - Prerequisite: ["NotLifted", "NotSuspended", "NotMounted", "NotKneelingSpread", "NoFeetSpreader", "CanKneel"], - SetPose: ["Kneel"], - Block: ["ItemAddon"], - AllowType: ["OpenPadding", "Closed", "ClosedPadding"], - AllowEffect: ["OneWayEnclose", "Prone", "Freeze"], - Effect: ["ForceKneel", "Tethered"], - Layer: [ - { Name: "Kennel", Priority: 1, HasType: false }, - { Name: "Padding", Priority: 1, AllowTypes: ["OpenPadding", "ClosedPadding"], HasType: false }, - { - Name: "Frame", HasType: false, Priority: 58, - Alpha: [{ - Masks: [[0, 0, 500, 270], [0, 1000, 500, 250], AssetUpperOverflowAlpha, AssetLowerOverflowAlpha] - }] - }, - { Name: "Door", Priority: 58 }, - ] - }, - { - Name: "PetBed", Fetish: ["Pet"], Value: 50, Difficulty: -25, SelfBondage: 0, Time: 5, RemoveTime: 5, Effect: ["Tethered"], RemoveAtLogin: true, SetPose: ["Kneel"], FixedPosition: true, Extended: true, HasType: false, - Layer: [ - { Name: "Lining", Priority: 1, AllowColorize: false}, - { Name: "Bed", AllowColorize: true, Alpha: [{ Masks: [[0, 800, 500, 900]] }] }, - { Name: "Blanket", Priority: 4, AllowColorize: true, AllowTypes: ["Blanket"] }, - { Name: "Inner", Priority: 2, AllowColorize: true, AllowTypes: ["Blanket"]}, - ], - }, - { - Name: "TransportWoodenBox", Priority: 58, Value: 60, Difficulty: -2, SelfBondage: 5, Time: 15, RemoveTime: 10, AllowLock: true, Audio: "LockLarge", DefaultColor: ["Default", "Default", "Default", "#600"], Extended: true, RemoveAtLogin: true, SetPose: ["BaseLower"], MinOpacity: 0, Opacity: 0, DynamicAfterDraw: true, FixedPosition: true, - AllowType: ["NWSE"], - Block: ["ItemAddon"], - Prerequisite: ["NotSuspended", "NotHogtied", "NotLifted"], - Effect: ["Prone", "Enclose", "Freeze", "Leash"], - AllowEffect: ["Prone", "Enclose", "BlindNormal", "GagLight", "Freeze", "Leash"], - Layer: [ - { Name: "Back", Priority: 1, MinOpacity: 1, HasType: false }, - { Name: "Panel", CopyLayerColor: "Back", HasType: false }, - { - Name: "Frame", CopyLayerColor: "Back", MinOpacity: 1, HasType: false, - Alpha: [{ Masks: [[0, -50, 500, 80], [0, 10, 45, 980], [445, 10, 55, 980], [0, 990, 500, 110], AssetUpperOverflowAlpha, AssetLowerOverflowAlpha] }], - }, - { Name: "Wheelholders", MinOpacity: 1, HasType: false }, - { Name: "Wheels", MinOpacity: 1, HasType: false }, - { Name: "Text", HasImage: false, HasType: false }, - ], - }, - { - Name: "VacCube", Fetish: ["Latex"], Value: 250, Difficulty: 50, Priority: 36, Top: -70, Left: 0, SelfBondage: 4, Time: 20, RemoveAtLogin: true, DefaultColor: "#480000", - Prerequisite: ["NoItemArms", "NoItemLegs", "AllFours", "NotSuspended", "NotHogtied", "NotKneelingSpread", "NotYoked", "LegsOpen", "NoHorse", "NoItemFeet"], - Hide: ["BodyLower", "Hands", "HairBack", "Cloth", "ClothLower", "ClothAccessory", "Necklace", "Suit", "SuitLower", "Bra", "Panties", "Socks", "RightAnklet", "LeftAnklet", "Shoes", "Gloves", "TailStraps", "Wings", "ItemFeet", "ItemLegs", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemNipples", "ItemNipplesPiercings", "ItemBreast", "ItemArms", "ItemHands", "ItemBoots", "Pussy", "Corset", "Bracelet"], - HideItem: ["ItemMiscTeddyBear"], - SetPose: ["BaseUpper", "BaseLower"], - Effect: ["Prone", "Freeze", "Block"], - Block: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemFeet", "ItemHands", "ItemLegs", "ItemNipples", "ItemNipplesPiercings", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings", "ItemAddon"], - AllowActivityOn: ["ItemArms", "ItemBoots", "ItemBreast", "ItemFeet", "ItemLegs", "ItemNipples", "ItemPelvis", "ItemTorso", "ItemTorso2",], - OverrideHeight: { Height: -570, Priority: 60, HeightRatioProportion: 0.95 }, - Alpha: [{Group: ["BodyUpper"], Masks: [[0, 225, 500, 775]]}], - Layer: [ - { Name: "Latex", ParentGroup: "BodyUpper" }, - { Name: "Highlights", ParentGroup: null, AllowColorize: false }, - ] - }, - { - Name: "PetBowl", Value: 20, Time: 5, IsRestraint: false, DefaultColor: ["Default", "#000000"], FixedPosition: true, Extended: true, DynamicAfterDraw: true, Layer: [ - { Name: "Bowl", Top: 885, Left: 300 }, - { Name: "Text", HasImage: false, Top: 905, Left: 335 }, - ] - }, - { Name: "Pole", Value: 40, Top: -150, Priority: 1, Difficulty: -5, RemoveTime: 10, HasType: false, RemoveAtLogin: true, Extended: true, FixedPosition: true }, - { Name: "Cushion", Priority: 34, Value: 4, Difficulty: -10, Time: 5, IsRestraint: false, AllowPose: ["AllFours", "Hogtied", "TapedHands", "BackBoxTie", "BackCuffs", "BackElbowTouch", "Yoked", "OverTheHead"], Extended: true }, - { - Name: "FuckMachine", Value: 200, Difficulty: -100, RemoveTime: 15, SetPose: ["BaseLower"], Left: 1, Top: 465, Priority: 6, RemoveAtLogin: true, - AllowActivePose: ["BaseLower", "LegsClosed"], - Prerequisite: ["AccessVulva", "NotSuspended", "NotHogtied", "NotHorse", "NotKneeling", "NotChaste", "VulvaEmpty"], - Effect: ["Mounted", "Freeze", "Egged", "BlockKneel"], - Block: ["ItemVulva", "ItemPelvis", "ItemVulvaPiercings", "ItemLegs", "ItemFeet"], - AllowEffect: ["Egged", "Vibrating", "Edged"], - DynamicBeforeDraw: true, DynamicScriptDraw: true, - AllowActivityOn: ["ItemFeet", "ItemLegs", "ItemBoots"], - ArousalZone: "ItemVulva", - Alpha: [{ Group: ["Pussy"], Masks: [[0, 524, 500, 40]] }], - Layer: [ - { Name: "Pole", Top: 492 }, - { Name: "Metal", ColorGroup: "Machine" }, - { Name: "Plastic", ColorGroup: "Machine" }, - { Name: "Caps", ColorGroup: "Machine" }, - { Name: "Dildo", Top: 492 }, - { Name: "Pussy", AllowColorize: false, Top: 408, Left: 125, Priority: 11 }, - ], - }, - { - Name: "Net", Value: 50, Difficulty: 20, Random: false, Top: 0, AllowLock: false, - Prerequisite: ["NotSuspended", "NotMounted", "NoFeetSpreader", "CanKneel",], - AllowPose: ["Kneel","AllFours","Yoked","Hogtied"], - SetPose: ["Kneel"], - Effect: ["Freeze","Block", "Prone", "ForceKneel",], - Extended: true, - Layer: [ - { Name: "Front"}, - { Name: "Back", Priority: 3, CopyLayerColor: "Front"}, - { Name: "WeightsFront", HideForPose:["Hogtied"]}, - { Name: "WeightsBack", Priority: 3, CopyLayerColor:"WeightsFront", HideForPose:["Hogtied"]}, - ] - }, - { - Name: "Snowman", Value: 60, Difficulty: 4, SelfBondage: 2, Random: false, Top: 0, Height: -40, Time: 15, RemoveTime: 25, DefaultColor: ["#666", "#974338"], - Prerequisite: ["NotSuspended", "NotHogtied", "AllFours"], - SetPose: ["BackBoxTie", "BaseLower"], - Effect: ["Freeze", "Block", "Prone", "KneelFreeze"], - Hide: ["BodyLower", "Hands", "Cloth", "ClothLower", "SuitLower", "Bra", "Corset", "Panties", "Socks", "RightAnklet", "LeftAnklet", "Garters", "Shoes", "Gloves", "Bracelet", "TailStraps", "ItemFeet", "ItemLegs", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemNipples", "ItemNipplesPiercings", "ItemBreast", "ItemArms", "ItemHands", "ItemBoots"], - Block: ["ItemFeet", "ItemLegs", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemNipples", "ItemNipplesPiercings", "ItemBreast", "ItemArms", "ItemHands", "ItemBoots"], - Layer: [ - { Name: "Snow", AllowColorize: false }, - { Name: "Buttons" }, - { Name: "StickHands" }, - ], - }, - { - Name: "MedicalBed", Value: -1, Priority: 1, Difficulty: -20, SelfBondage: 0, Time: 5, RemoveTime: 5, RemoveAtLogin: true, DefaultColor: ["#909090", "#75B2C8", "#808284"], BuyGroup: "Bed", - OverrideHeight: { Height: 0, HeightRatioProportion: 1, Priority: 21 }, - RemoveItemOnRemove: [ - { Group: "ItemAddon", Name: "Covers" }, - { Group: "ItemAddon", Name: "BedRopes" }, - { Group: "ItemAddon", Name: "BedStraps" }, - { Group: "ItemAddon", Name: "BedTape" }, - { Group: "ItemAddon", Name: "BedChains" }, - { Group: "ItemArms", Name: "UnderBedBondageCuffs" }, - { Group: "ItemArms", Name: "MedicalBedRestraints" }, - { Group: "ItemArms", Name: "HempRope", Type: "BedSpreadEagle" }, - { Group: "ItemLegs", Name: "MedicalBedRestraints" }, - { Group: "ItemFeet", Name: "HempRope", Type: "BedSpreadEagle" }, - { Group: "ItemFeet", Name: "MedicalBedRestraints" }, - ], - Effect: ["Freeze", "Mounted", "OnBed", "Leash"], - AvailableLocations: ["Asylum"], - Prerequisite: ["AllFours", "NotSuspended", "NotHogtied"], - SetPose: ["BaseLower"], - Layer: [ - { Name: "BedFrame" }, - { Name: "Mattress" }, - { Name: "Pillow" } - ] - }, - { - Name: "WoodenRack", Value: 180, Priority: 1, Difficulty: 0, RemoveTime: 5, Time: 5, SelfBondage: 0, Random: false, RemoveAtLogin: true, DefaultColor: ["#866949", "#875D37", "#63605F", "#372D24", "#BB895D", "Default", "#875D37", "#875D37"], Extended: true, AlwaysExtend: true, BuyGroup: "WoodenRack", - OverrideHeight: { Height: 0, HeightRatioProportion: 1, Priority: 21 }, - Effect: ["Freeze", "Mounted", "OnBed"], - Prerequisite: ["AllFours", "NotSuspended", "NotHogtied"], - SetPose: ["BaseLower"], - Block: ["ItemAddon"], - Layer: [ - { Name: "Back", HasType: false, ColorGroup: "Wood", AllowModuleTypes: ["f0", "f1"] }, - { Name: "HalfBack", HasType: false, CopyLayerColor: "Back", AllowModuleTypes: ["f2"] }, - { Name: "NoBack", HasType: false, AllowColorize: false, AllowModuleTypes: ["f3"], HasImage: false }, - { Name: "FrameWood", HasType: false, ColorGroup: "Wood" }, - { Name: "FrameMetal", HasType: false, AllowColorize: true }, - { Name: "FrameStains", HasType: false, AllowModuleTypes: ["f1"] }, - { Name: "TopRopes", HasType: false, AllowModuleTypes: ["t1"], Priority: 50 }, - { Name: "TopRopesTight", HasType: false, CopyLayerColor: "TopRopes", AllowModuleTypes: ["t2"], Priority: 50 }, - { Name: "TopChains", HasType: false, AllowModuleTypes: ["t3"],Priority: 30 }, - { Name: "TopChainsTight", HasType: false, CopyLayerColor: "TopChains",AllowModuleTypes: ["t4"], Priority: 30 }, - { Name: "TopStocksBack", HasType: false, ColorGroup: "Wood", AllowModuleTypes: ["t5"] }, - { Name: "TopStocks", HasType: false, CopyLayerColor: "TopStocksBack", AllowModuleTypes: ["t5"], Priority: 50 }, - { Name: "BotRings", HasType: false, CopyLayerColor: "TopChains",AllowModuleTypes: ["b1", "b2"]}, - { Name: "BotRopes", HasType: false, CopyLayerColor: "TopRopes",AllowModuleTypes: ["b1"], Priority: 50 }, - { Name: "BotRopesTogether", HasType: false, CopyLayerColor: "TopRopes",AllowModuleTypes: ["b2"], Priority: 50 }, - { Name: "BotChains", HasType: false, CopyLayerColor: "TopChains", AllowModuleTypes: ["b3"]}, - { Name: "BotChainsTogether", HasType: false, CopyLayerColor: "TopChains", AllowModuleTypes: ["b4"]}, - { Name: "BotStocksBack", HasType: false, ColorGroup: "Wood", AllowModuleTypes: ["b5"] }, - { Name: "BotStocks", HasType: false, CopyLayerColor: "BotStocksBack", AllowModuleTypes: ["b5"], Priority: 50 }, - ] - }, - { - Name: "WoodenHorse", Priority: 34, Value: 200, Difficulty: 2, Time: 10, Top: 488, Left: 137, Random: false, - Prerequisite: ["NotKneeling", "LegsOpen", "NotSuspended", "NotHogtied", "NotShackled"], - Hide: ["Shoes", "ItemBoots"], HideItem: ["ClothLowerWaspie1", "ClothLowerWaspie2", "ClothLowerWaspie3", "ClothLowerGown2Skirt", "ItemMiscTeddyBear", "ItemDevicesLittleMonster", "ItemDevicesFamiliar"], - SetPose: ["KneelingSpread"], Effect: ["Prone", "Freeze", "Mounted"], - OverrideHeight: { Height: -75, Priority: 21 }, - Alpha: [{ Masks: [[160, 720, 200, 240]] }], Block: ["ItemFeet", "ItemBoots"], - AllowActivityOn: ["ItemFeet", "ItemBoots"], - ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }, { Name: "Closed", Group: "Eyes", Timer: 5 }], - Layer: [ - { Name: "Frame" }, - { Name: "Wood" } - ] - }, - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - { - Group: "ItemAddon", - Category: "Item", - Priority: 51, - Default: false, - IsRestraint: true, - Left: 0, - Top: -250, - Zone: [[400, 0, 90, 200]], - Asset: [ - { - Name: "Covers", Value: -1, Difficulty: 1, SelfBondage: 0, DefaultColor: ["#99A2AB", "Default"], Prerequisite: "OnBed", BuyGroup: "Bed", - Layer: [ - { Name: "Outer" }, - { Name: "Inner" }, - ] - }, - { Name: "BedRopes", Fetish: ["Rope"], Value: -1, Difficulty: 6, SelfBondage: 3, DefaultColor: "#956B1C", Audio: "RopeShort", Block: ["ItemDevices"], Hide: ["TailStraps"], Prerequisite: "OnBed", BuyGroup: "Bed", CraftGroup: "HempRope", }, - { Name: "BedStraps",Fetish: ["Leather"], Value: -1, Difficulty: 6, SelfBondage: 2, Block: ["ItemDevices"], Hide: ["TailStraps"], AllowLock: true, Prerequisite: "OnBed", BuyGroup: "Bed" }, - { Name: "BedTape", Fetish: ["Tape"], Value: -1, Difficulty: 6, SelfBondage: 2, Block: ["ItemDevices"], Hide: ["TailStraps"], Prerequisite: "OnBed", BuyGroup: "Bed", CraftGroup: "DuctTape", }, - { Name: "BedChains", Fetish: ["Metal"], Value: -1, Difficulty: 6, SelfBondage: 4, Block: ["ItemDevices"], Hide: ["TailStraps"], AllowLock: true, Audio: "ChainLong", Prerequisite: "OnBed", BuyGroup: "Bed" }, - { Name: "CeilingRope", Top: -700, Random: false, Priority: 1, Fetish: ["Rope"], Value: 60, Prerequisite: ["CanBeCeilingTethered"], BuyGroup: "HempRope", CraftGroup: "HempRope", Difficulty: 6, Audio: "RopeLong", SelfBondage: 0, Extended: true, HasType: false, DefaultColor: "#956B1C", Effect: ["Freeze"], SetPose: ["BaseLower"], WhitelistActivePose: ["BaseLower", "LegsClosed"], AllowActivePose: ["LegsClosed"], - Layer: [ - { Name: "Ring", AllowColorize: false }, - { Name: "Ropes" }, - ] - }, - { Name: "CeilingChain", Top: -700, Random: false, Priority: 1, Fetish: ["Metal"], Prerequisite: ["CanBeCeilingTethered"], Value: 90, BuyGroup: "Chains", Difficulty: 6, Audio: "ChainLong", SelfBondage: 0, AllowLock: true, DrawLocks: false, Extended: true, HasType: false, Effect: ["Freeze"], SetPose: ["BaseLower"], WhitelistActivePose: ["BaseLower", "LegsClosed"], AllowActivePose: ["LegsClosed"] } - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - - { - Group: "ItemBoots", - ParentGroup: "BodyLower", - Category: "Item", - Priority: 23, - Default: false, - IsRestraint: true, - Left: 125, - Top: 500, - Hide: ["Shoes"], - AllowPose: ["LegsClosed", "Kneel", "Hogtied", "KneelingSpread"], - Zone: [[100, 870, 300, 130]], - Asset: [ - { Name: "PonyBoots", Fetish: ["Leather", "Pony"], Value: -1, Difficulty: 6, Time: 10, RemoveTime: 15, AllowLock: true, Alpha: [{ Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[75, 875, 350, 200]] }], Height: 35, HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "BalletHeels", Fetish: ["Leather"], Value: 75, Difficulty: 6, Time: 10, RemoveTime: 15, AllowLock: true, Alpha: [{ Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[75, 825, 350, 200]] }], Height: 35, HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "BalletWedges", Fetish: ["Leather"], Value: 50, Difficulty: 6, Time: 10, RemoveTime: 15, AllowLock: true, Alpha: [{ Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[75, 825, 350, 200]] }], Height: 35, HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "ToeCuffs", Fetish: ["Metal"], Value: 35, Difficulty: 4, Time: 10, RemoveTime: 5, AllowLock: true, Prerequisite: ["CanCloseLegs"], Audio: "LockSmall", SetPose: ["LegsClosed"], Effect: ["Freeze", "Prone"], AllowActivePose: ["Kneel"], FreezeActivePose: ["BodyLower"], HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "LeatherToeCuffs", Fetish: ["Leather"], Value: 50, Difficulty: 3, Time: 10, RemoveTime: 5, AllowLock: true, Prerequisite: ["CanCloseLegs"], SetPose: ["LegsClosed"], Effect: ["Freeze", "Prone"], AllowActivePose: ["Kneel"], FreezeActivePose: ["BodyLower"], HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "ToeTie", Fetish: ["Rope"], Value: 15, Difficulty: 2, Time: 10, RemoveTime: 5, DefaultColor: "#956B1C", CraftGroup: "HempRope", Prerequisite: ["CanCloseLegs"], Audio: "RopeShort", SetPose: ["LegsClosed"], Effect: ["Freeze", "Prone"], AllowActivePose: ["Kneel"], FreezeActivePose: ["BodyLower"], HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "ThighHighLatexHeels", Fetish: ["Latex"], Value: -1, Time: 10, RemoveTime: 15, AllowLock: true, BuyGroup: "ThighHighLatexHeels", - Alpha: [ - { Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[75, 680, 350, 320]] }, - { Group: ["BodyLower", "Socks", "SuitLower"], Pose: ["LegsClosed"], Masks: [[75, 650, 350, 350]] }, - ], Height: 30, HideForPose: ["Spread"] - }, - { Name: "LockingHeels", Value: 20, Difficulty: 6, Time: 10, RemoveTime: 15, AllowLock: true, Height: 15, HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "LockingHeels2", Value: 25, Difficulty: 7, Time: 10, RemoveTime: 15, AllowLock: true, Height: 15, HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "LockingShoes1", Value: 15, Difficulty: 3, Time: 5, RemoveTime: 8, AllowLock: true, Height: 6, HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "LockingShoes2", Value: 20, Difficulty: 4, Time: 5, RemoveTime: 8, AllowLock: true, Height: 6, HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "FuturisticHeels", Category: ["SciFi"], Value: 50, Difficulty: 7, Time: 10, RemoveTime: 20, DefaultColor: ["#50913C", "Default"], Random: false, AllowLock: true, DrawLocks: false, Height: 6, FuturisticRecolor: true, Effect: [], - Extended: true, Audio: "FuturisticApply", BuyGroup: "FuturisticHeels", - Layer: [ - { Name: "Display", HasType: false }, - { Name: "Shoes", AllowTypes:["", "Heel"] }, - { Name: "Lock", LockLayer: true, AllowColorize: true, AllowTypes:["", "Heel"], ParentGroup: null}, - ], HideForPose: ["Spread", "KneelingSpread"] - }, - { Name: "FuturisticHeels2", Value: 50, Difficulty: 7, Time: 10, RemoveTime: 20, - Left: 75, DefaultColor: ["Default", "#50913C", "Default", "Default", "Default", "#aaaaaa", "Default"], Random: false, AllowLock: true, DrawLocks: false, Audio: "FuturisticApply", BuyGroup: "FuturisticHeels", Extended: true, FuturisticRecolor: true, Effect: [], - AllowPose: ["LegsClosed", "Kneel", "Hogtied", "Spread"], - HideForPose: ["KneelingSpread"], - Layer: [ - { Name: "Mesh", ParentGroup: null, HasType: false }, - { Name: "Display", ParentGroup: null, HasType: false }, - { Name: "Shine", ParentGroup: null, HasType: false, AllowTypes:[""]}, - { Name: "Cuffs", ParentGroup: null, HasType: false }, - { Name: "Trim", ParentGroup: null, HasType: false }, - { Name: "Soles", ParentGroup: null, HasType: false }, - { Name: "Lock", LockLayer: true, HasType: false ,AllowColorize: true, ParentGroup: null}, - ],Alpha: [ - { Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[75, 860, 350, 120]] }, - { Group: ["BodyLower", "Socks", "SuitLower"], Pose: ["LegsClosed"], Masks: [[75, 870, 350, 150]] }, - ], Height: 30 - }, - { - Name: "LockingBoots1", Value: 30, Difficulty: 6, Time: 7, RemoveTime: 14, AllowLock: true, Height: 9, HideForPose: ["Spread", "KneelingSpread"], - Layer: [ - { Name: "Boots" }, - { Name: "Straps" } - ] - }, - { - Name: "LeatherFootMitts1", Fetish: ["Leather"], Value: 35, Difficulty: 4, Time: 6, RemoveTime: 7, AllowLock: true, Hide: ["Shoes", "Socks"], HideForPose: ["Spread", "KneelingSpread"], - Layer: [ - { Name: "Mitts" }, - { Name: "Straps" } - ] - }, - { Name: "ToeTape", Fetish: ["Tape"], Extended: true, Value: 50, BuyGroup: "DuctTape", CraftGroup: "DuctTape", Audio: "DuctTape", Difficulty: 2, Time: 10, RemoveTime: 5, Prerequisite: ["CanCloseLegs"], SetPose: ["LegsClosed"], AllowActivePose: ["Kneel"], HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "Zipties", Value: 20, Difficulty: 6, Time: 5, RemoveTime: 6, BuyGroup: "Zipties", Audio: "ZipTie", Prerequisite: ["CanCloseLegs"], SetPose: ["LegsClosed"], Effect: ["Freeze", "Prone"], AllowActivePose: ["Kneel"], HideForPose: ["Spread", "KneelingSpread"] }, - { Name: "HighThighBoots", Value: 100, Time: 10, RemoveTime: 10, AllowLock: true, Hide: ["ItemFeet", "Shoes"], AllowPose: ["LegsClosed", "Kneel", "Hogtied", "Spread", "KneelingSpread"], - Alpha: [ - { Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[75, 680, 350, 320]] }, - { Group: ["BodyLower", "Socks", "SuitLower"], Pose: ["LegsClosed"], Masks: [[75, 650, 350, 350]] }, - ], Height: 30 - }, - { - Name: "Slime", Category: ["Fantasy"], BuyGroup: "Slime", DefaultColor: ["#57ab5e", "#57ab5e"], Priority: 28, Random: false, Value: 200, Difficulty: 5, Time: 25, RemoveTime: 40, Left: 100, Top: 800, ParentGroup: null, Prerequisite: ["CanCloseLegs"], SetPose: ["LegsClosed"], AllowActivePose: ["Kneel"], Effect: ["Freeze"], - HideForPose: ["Kneel", "Spread", "KneelingSpread", "Hogtied"], - Layer: [ - { Name: "One" }, - { Name: "Two" }, - ], - }, - { - Name: "MonoHeel", Value: 60, Difficulty: 5, Time: 15, RemoveTime: 10, DefaultColor: ["#2c2c2c", "#666", "#999"], AllowLock: true, Extended: true, Height: 25, DrawLocks: false, - Prerequisite: ["CanCloseLegs"], - SetPose: ["LegsClosed"], - AllowActivePose: ["Kneel"], - FreezeActivePose: ["BodyLower"], - HideForPose: ["Spread", "KneelingSpread", "Kneel"], - Effect: ["Freeze", "Prone"], - Hide: ["Shoes", "ItemFeet"], - HideItem: ["ClothLowerPajama1", "ItemLegsHempRope", "ItemLegsNylonRope"], - HideItemExclude: ["ItemFeetChains", "ItemFeetDuctTape", "ItemFeetLeatherBelt", "ItemFeetPlasticWrap", "ItemFeetSlime", "ItemFeetSturdyLeatherBelts", "ItemFeetTentacles", "ItemFeetZipties"], - Alpha: [ - { Group: ["BodyLower", "Socks", "SuitLower"], Masks: [[175, 835, 150, 165]] }, - ], - Layer: [ - { Name: "Binder" }, - { Name: "Vamp", HasType: false }, - { Name: "Trim", HasType: false }, - { Name: "Shine", AllowColorize: false }, - ] - }, - AssetSpankingToys - ], - Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"] - }, - -]; - -/** 3D Custom Girl based pose - * @type {Pose[]} - */ -var PoseFemale3DCG = [ - { - Name: "BaseUpper", - Category: "BodyUpper", - AllowMenu: true, - }, - { - Name: "BaseLower", - Category: "BodyLower", - AllowMenu: true, - }, - { - Name: "Kneel", - Category: "BodyLower", - AllowMenu: true, - OverrideHeight: { Height: -250, Priority: 20 }, - Hide: ["ItemFeet", "LeftAnklet", "RightAnklet"] - }, - { - Name: "KneelingSpread", - Category: "BodyLower", - OverrideHeight: { Height: -250, Priority: 20 }, - AllowMenu: true, - Hide: ["ItemFeet", "LeftAnklet", "RightAnklet"], - MovePosition: [ - { Group: "ClothLower", X: -90, Y: 0}, - { Group: "ItemLegs", X: -60, Y: 0}, - { Group: "Socks", X: -30, Y: 0 }, - { Group: "Shoes", X: -20, Y: -100 }, - { Group: "ItemBoots", X: -65, Y: -35 }, - ] - }, - { - Name: "Yoked", - Category: "BodyUpper", - AllowMenu: true, - Hide: ["Hands"] - }, - { - Name: "OverTheHead", - Category: "BodyUpper", - AllowMenu: true, - Hide: ["Hands"], - }, - { - Name: "Hogtied", - Category: "BodyFull", - OverrideHeight: { Height: -575, Priority: 50 }, - Hide: ["BodyLower", "Hands", "ClothLower", "Wings", "Gloves", "Panties", "Pussy", "ItemHands", "ItemPelvis", "ItemVulva", "ItemVulvaPiercings", "ItemLegs", "ItemFeet", "LeftAnklet", "RightAnklet", "Garters", "Bracelet"], - MovePosition: [{ Group: "Socks", X: 0, Y: -400 }, { Group: "Shoes", X: 0, Y: -500 }, { Group: "ItemBoots", X: 0, Y: -500 }, { Group: "SuitLower", X: 0, Y: -380 }, { Group: "TailStraps", X: 0, Y: -300 }, { Group: "ItemButt", X: 0, Y: -300 }] - }, - { - Name: "Suspension", - OverrideHeight: { Height: -150, Priority: 40 }, - Hide: [] - }, - { - Name: "AllFours", - Category: "BodyFull", - OverrideHeight: { Height: -560, Priority: 50 }, - Hide: ["ItemFeet", "ClothLower", "SuitLower", "Nipples", "Pussy", "BodyLower", "Wings", "ItemPelvis", "ItemVulva", "ItemVulvaPiercings", "ItemLegs", "ItemBoots", "Suit", "Panties", "Bra", "Socks", "Shoes", "LeftAnklet", "RightAnklet", "Garters", "Bracelet"], - MovePosition: [{ Group: "TailStraps", X: 0, Y: -300 }, { Group: "ItemButt", X: 0, Y: -300 }, {Group: "Head", X: 0, Y: 1}], - AllowMenuTransient: true, - }, - { - Name: "BackBoxTie", - Category: "BodyUpper", - AllowMenu: true, - }, - { - Name: "LegsClosed", - Category: "BodyLower", - AllowMenu: true, - }, - { - Name: "Spread", - Category: "BodyLower", - MovePosition: [{ Group: "Pussy", X: 0, Y: -5 }, { Group: "ItemVulva", X: 0, Y: -5 }, { Group: "ItemButt", X: 0, Y: -5 }, { Group: "TailStraps", X: 0, Y: -5 }, { Group: "ItemVulvaPiercings", X: 0, Y: -5 }] - }, - { - Name: "BackElbowTouch", - Category: "BodyUpper", - AllowMenu: true, - Hide: ["Bracelet"], - }, - { - Name: "BackCuffs", - Category: "BodyUpper", - AllowMenu: true, - }, - { - Name: "TapedHands", - }, - { - Name: "LegsOpen", - Category: "BodyLower", - }, -]; - -/** - * List of all available pose names in the game - * @constant {string[]} - */ -var PoseFemale3DCGNames = PoseFemale3DCG.map(pose => pose.Name); - -/** - * 3D Custom Girl based activities - * - * The ordering is supposed to match what body part they use, in order: - * mouth, hand, feet, whole-body, head, then the item-related ones. - * Inside that, they get sorted by softest to harshest, when that makes sense. - * - * @type {Activity[]} - */ -var ActivityFemale3DCG = [ - /* Mouth activities */ - { - Name: "Whisper", - MaxProgress: 20, - Prerequisite: ["UseMouth"], - Target: ["ItemEars"], - }, - { - Name: "MoanGag", - MaxProgress: 60, - Prerequisite: ["IsGagged"], - Target: [], - TargetSelf: ["ItemMouth"], - MakeSound: true, - StimulationAction: "Talk", - }, - { - Name: "MoanGagTalk", - MaxProgress: 10, - Prerequisite: ["IsGagged"], - Target: [], - TargetSelf: ["ItemMouth"], - MakeSound: true, - StimulationAction: "Talk", - }, - { - Name: "MoanGagWhimper", - MaxProgress: 40, - Prerequisite: ["IsGagged"], - Target: [], - TargetSelf: ["ItemMouth"], - MakeSound: true, - StimulationAction: "Talk", - }, - { - Name: "MoanGagGroan", - MaxProgress: 30, - Prerequisite: ["IsGagged"], - Target: [], - TargetSelf: ["ItemMouth"], - MakeSound: true, - StimulationAction: "Talk", - }, - { - Name: "MoanGagAngry", - MaxProgress: 10, - Prerequisite: ["IsGagged"], - Target: [], - TargetSelf: ["ItemMouth"], - MakeSound: true, - StimulationAction: "Talk", - }, - { - Name: "MoanGagGiggle", - MaxProgress: 20, - Prerequisite: ["IsGagged"], - Target: [], - TargetSelf: ["ItemMouth"], - MakeSound: true, - StimulationAction: "Talk", - }, - { - Name: "GagKiss", - MaxProgress: 55, - Prerequisite: ["ZoneAccessible", "UseMouth", "TargetMouthBlocked"], - Target: ["ItemMouth"], - }, - { - Name: "Nibble", - MaxProgress: 40, - Prerequisite: ["ZoneAccessible", "UseMouth", "ZoneNaked"], - Target: ["ItemArms", "ItemBoots", "ItemEars", "ItemFeet", "ItemHands", "ItemLegs", "ItemMouth", "ItemNeck", "ItemNipples", "ItemNose", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - TargetSelf: ["ItemArms", "ItemBoots", "ItemHands", "ItemMouth", "ItemNipples"], - }, - { - Name: "Lick", - MaxProgress: 80, - Prerequisite: ["ZoneAccessible", "UseTongue", "ZoneNaked"], - Target: ["ItemArms", "ItemBoots", "ItemBreast", "ItemEars", "ItemFeet", "ItemHands", "ItemLegs", "ItemMouth", "ItemNeck", "ItemNipples", "ItemNose", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - TargetSelf: ["ItemArms", "ItemBoots", "ItemBreast", "ItemHands", "ItemMouth", "ItemNipples"], - }, - { - Name: "PoliteKiss", - MaxProgress: 30, - Prerequisite: ["UseMouth"], - Target: ["ItemBoots", "ItemHands", "ItemMouth"], - TargetSelf: ["ItemBoots", "ItemHands"], - }, - { - Name: "Kiss", - MaxProgress: 50, - Prerequisite: ["ZoneAccessible", "UseMouth"], - Target: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemEars", "ItemFeet", "ItemHands", "ItemHead", "ItemLegs", "ItemMouth", "ItemNeck", "ItemNipples", "ItemNose", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - TargetSelf: ["ItemArms", "ItemBoots", "ItemBreast", "ItemHands", "ItemNipples"], - }, - { - Name: "GaggedKiss", - MaxProgress: 40, - Prerequisite: ["IsGagged"], - Target: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemEars", "ItemFeet", "ItemHands", "ItemHead", "ItemLegs", "ItemMouth", "ItemNeck", "ItemNipples", "ItemNose", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - }, - { - Name: "FrenchKiss", - MaxProgress: 70, - Prerequisite: ["ZoneAccessible", "UseTongue", "ZoneNaked", "TargetCanUseTongue"], - Target: ["ItemMouth"], - }, - { - Name: "Suck", - MaxProgress: 60, - Prerequisite: ["ZoneAccessible", "UseMouth", "ZoneNaked"], - Target: ["ItemBoots", "ItemHands", "ItemNipples"], - TargetSelf: true, - }, - { - Name: "MasturbateTongue", - MaxProgress: 100, - Prerequisite: ["ZoneAccessible", "UseTongue", "ZoneNaked"], - Target: ["ItemButt", "ItemVulva", "ItemVulvaPiercings"], - }, - { - Name: "Bite", - MaxProgress: 40, - Prerequisite: ["ZoneAccessible", "UseMouth", "ZoneNaked"], - Target: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemEars", "ItemFeet", "ItemHands", "ItemHead", "ItemLegs", "ItemMouth", "ItemNeck", "ItemNipples", "ItemNose", "ItemTorso", "ItemTorso2",], - TargetSelf: ["ItemArms", "ItemBoots", "ItemFeet", "ItemHands", "ItemLegs", "ItemMouth"], - }, - /* Hand activities */ - { - Name: "Caress", - MaxProgress: 80, - Prerequisite: ["ZoneAccessible", "UseHands"], - Target: ["ItemArms", "ItemBreast", "ItemButt", "ItemEars", "ItemFeet", "ItemHands", "ItemHead", "ItemLegs", "ItemMouth", "ItemNeck", "ItemNipples", "ItemNose", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - TargetSelf: true, - }, - { - Name: "MassageHands", - MaxProgress: 60, - Prerequisite: ["ZoneAccessible", "UseHands"], - Target: ["ItemArms", "ItemBoots", "ItemFeet", "ItemLegs", "ItemNeck", "ItemPelvis", "ItemTorso", "ItemTorso2",], - TargetSelf: true, - }, - { - Name: "TakeCare", - MaxProgress: 10, - Prerequisite: ["ZoneAccessible", "UseHands", "ZoneNaked"], - Target: ["ItemBoots", "ItemHands", "ItemHead"], - TargetSelf: true, - }, - { - Name: "Tickle", - MaxProgress: 50, - Prerequisite: ["ZoneAccessible", "UseHands"], - Target: ["ItemArms", "ItemBoots", "ItemBreast", "ItemFeet", "ItemLegs", "ItemNeck", "ItemPelvis", "ItemTorso", "ItemTorso2",], - TargetSelf: true, - }, - { - Name: "Pet", - MaxProgress: 20, - Prerequisite: ["UseArms"], - Target: ["ItemHead", "ItemNose"], - TargetSelf: true, - }, - { - Name: "Grope", - MaxProgress: 50, - Prerequisite: ["UseHands"], - Target: ["ItemArms", "ItemBreast", "ItemButt", "ItemFeet", "ItemLegs", "ItemPelvis"], - TargetSelf: ["ItemBreast", "ItemButt"], - }, - { - Name: "Pinch", - MaxProgress: 20, - Prerequisite: ["ZoneAccessible", "UseHands"], - Target: ["ItemArms", "ItemEars", "ItemNipples", "ItemNose", "ItemPelvis"], - TargetSelf: true, - }, - { - Name: "HandGag", - MaxProgress: 40, - Prerequisite: ["UseHands"], - Target: ["ItemMouth"], - TargetSelf: true, - }, - { - Name: "Slap", - MaxProgress: 30, - Prerequisite: ["UseHands"], - Target: ["ItemBreast", "ItemHead", "ItemVulva", "ItemVulvaPiercings"], - TargetSelf: true, - }, - { - Name: "Spank", - MaxProgress: 40, - Prerequisite: ["UseHands"], - Target: ["ItemArms", "ItemBoots", "ItemButt", "ItemFeet", "ItemHands", "ItemLegs", "ItemPelvis", "ItemTorso", "ItemTorso2",], - TargetSelf: true, - }, - { - Name: "Pull", - MaxProgress: 30, - Prerequisite: ["ZoneAccessible", "UseHands"], - Target: ["ItemHead", "ItemNipples", "ItemNose"], - TargetSelf: true, - }, - { - Name: "Choke", - MaxProgress: 50, - Prerequisite: ["ZoneAccessible", "UseHands"], - Target: ["ItemNeck", "ItemNose"], - TargetSelf: true, - }, - { - Name: "MasturbateHand", - MaxProgress: 100, - Prerequisite: ["ZoneAccessible", "UseHands", "ZoneNaked"], - Target: ["ItemBreast", "ItemButt", "ItemVulva", "ItemVulvaPiercings"], - TargetSelf: true, - }, - { - Name: "MasturbateFist", - MaxProgress: 100, - Prerequisite: ["ZoneAccessible", "VulvaEmpty", "UseHands", "ZoneNaked"], - Target: ["ItemButt", "ItemVulva"], - TargetSelf: true, - }, - /* Feet activities */ - { - Name: "MassageFeet", - MaxProgress: 40, - Prerequisite: ["ZoneAccessible", "UseFeet"], - Target: ["ItemBoots", "ItemTorso", "ItemTorso2",], - }, - { - Name: "MasturbateFoot", - MaxProgress: 100, - Prerequisite: ["ZoneAccessible", "UseFeet", "ZoneNaked"], - Target: ["ItemVulva", "ItemVulvaPiercings"], - }, - { - Name: "Step", - MaxProgress: 25, - Prerequisite: ["UseFeet", "TargetKneeling"], - Target: ["ItemBreast", "ItemButt", "ItemHead", "ItemNeck", "ItemNose", "ItemPelvis", "ItemTorso", "ItemTorso2",], - }, - /* Body activities */ - { - Name: "Cuddle", - MaxProgress: 30, - Prerequisite: [], - Target: ["ItemArms", "ItemNose"], - }, - { - Name: "Rub", - MaxProgress: 60, - Prerequisite: [], - Target: ["ItemHead", "ItemNose", "ItemTorso", "ItemTorso2",], - TargetSelf: ["ItemNose"], - }, - { - Name: "StruggleArms", - MaxProgress: 10, - Prerequisite: ["CantUseArms"], - Target: [], - TargetSelf: ["ItemArms"], - StimulationAction: "Struggle", - }, - { - Name: "StruggleLegs", - MaxProgress: 10, - Prerequisite: ["CantUseFeet"], - Target: [], - TargetSelf: ["ItemLegs"], - }, - { - Name: "Sit", - MaxProgress: 25, - Prerequisite: ["UseFeet", "TargetKneeling"], - Target: ["ItemLegs"], - }, - { - Name: "RestHead", - MaxProgress: 25, - Prerequisite: ["TargetKneeling"], - Target: ["ItemBreast", "ItemLegs"], - }, - /* Head activities */ - { - Name: "Nod", - MaxProgress: 0, - Prerequisite: ["MoveHead"], - Target: [], - TargetSelf: ["ItemHead"], - }, - { - Name: "Wiggle", - MaxProgress: 10, - Prerequisite: ["MoveHead"], - Target: [], - TargetSelf: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemEars", "ItemFeet", "ItemHands", "ItemHead", "ItemLegs", "ItemNose", "ItemPelvis", "ItemTorso", "ItemTorso2",], - StimulationAction: "Struggle", - }, - /* Item activities */ - { - Name: "SpankItem", - MaxProgress: 70, - Prerequisite: [], - Target: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemFeet", "ItemLegs", "ItemNipples", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - TargetSelf: true, - }, - { - Name: "TickleItem", - MaxProgress: 50, - Prerequisite: [], - Target: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemEars", "ItemFeet", "ItemHood", "ItemLegs", "ItemMouth", "ItemNeck", "ItemNipples", "ItemNose", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - TargetSelf: true, - }, - { - Name: "RubItem", - MaxProgress: 60, - Prerequisite: [], - Target: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemEars", "ItemFeet", "ItemHood", "ItemLegs", "ItemMouth", "ItemNeck", "ItemNipples", "ItemNose", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - TargetSelf: true, - }, - { - Name: "RollItem", - MaxProgress: 30, - Prerequisite: [], - Target: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemEars", "ItemFeet", "ItemLegs", "ItemMouth", "ItemNeck", "ItemNipples", "ItemPelvis", "ItemTorso", "ItemTorso2",], - TargetSelf: true, - }, - { - Name: "MasturbateItem", - MaxProgress: 100, - Prerequisite: ["ZoneNaked"], - Target: ["ItemBreast", "ItemButt", "ItemFeet", "ItemLegs", "ItemNipples", "ItemPelvis", "ItemVulva", "ItemVulvaPiercings"], - TargetSelf: true, - }, - { - Name: "PourItem", - MaxProgress: 40, - Prerequisite: [], - Target: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemFeet", "ItemLegs", "ItemNipples", "ItemPelvis", "ItemTorso", "ItemTorso2",], - TargetSelf: true, - }, - { - Name: "ShockItem", - MaxProgress: 50, - Prerequisite: [], - Target: ["ItemArms", "ItemBoots", "ItemBreast", "ItemButt", "ItemFeet", "ItemLegs", "ItemNipples", "ItemPelvis", "ItemTorso", "ItemTorso2", "ItemVulva", "ItemVulvaPiercings"], - TargetSelf: true, - }, - { - Name: "Inject", - MaxProgress: 20, - Prerequisite: ["ZoneAccessible", "UseHands", "Needs-InjectItem"], - Target: ["ItemNeck", "ItemBreast", "ItemArms", "ItemButt", "ItemVulvaPiercings", "ItemLegs", "ItemFeet"], - TargetSelf: true, - }, - { - Name: "PenetrateSlow", - MaxProgress: 80, - Prerequisite: ["ZoneAccessible", "TargetMouthOpen", "VulvaEmpty", "Needs-PenetrateItem", "ZoneNaked"], - Target: ["ItemButt", "ItemMouth", "ItemVulva"], - }, - { - Name: "PenetrateFast", - MaxProgress: 100, - Prerequisite: ["ZoneAccessible", "TargetMouthOpen", "VulvaEmpty", "Needs-PenetrateItem", "ZoneNaked"], - Target: ["ItemButt", "ItemMouth", "ItemVulva"], - }, -]; - -/** - * Display order for activities. - * @type string[] - */ -let ActivityFemale3DCGOrdering = ActivityFemale3DCG.map(a => a.Name); - -/** - * 3D Custom Girl based fetishes - * @type {{Name: string; GetFactor(C: Character): number; }[]} - */ -var FetishFemale3DCG = [ - { - Name: "Bondage", - GetFactor: function (C) { return C.IsRestrained() ? (PreferenceGetFetishFactor(C, "Bondage") - 2) : 0; } - }, - { - Name: "Gagged", - GetFactor: function (C) { return !C.CanTalk() ? (PreferenceGetFetishFactor(C, "Gagged") - 2) : 0; } - }, - { - Name: "Blindness", - GetFactor: function (C) { return C.IsBlind() ? (PreferenceGetFetishFactor(C, "Blindness") - 2) : 0; } - }, - { - Name: "Deafness", - GetFactor: function (C) { return C.IsDeaf() ? (PreferenceGetFetishFactor(C, "Deafness") - 2) : 0; } - }, - { - Name: "Chastity", - GetFactor: function (C) { return C.IsChaste() ? (PreferenceGetFetishFactor(C, "Chastity") - 2) : 0; } - }, - { - Name: "Exhibitionist", - GetFactor: function (C) { return C.IsNaked() ? (PreferenceGetFetishFactor(C, "Exhibitionist") - 2) : 0; } - }, - { - Name: "Masochism", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "Masochism"); } - }, - { - Name: "Sadism", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "Sadism"); } - }, - { - Name: "Rope", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "Rope"); } - }, - { - Name: "Latex", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "Latex"); } - }, - { - Name: "Leather", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "Leather"); } - }, - { - Name: "Metal", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "Metal"); } - }, - { - Name: "Tape", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "Tape"); } - }, - { - Name: "Nylon", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "Nylon"); } - }, - { - Name: "Lingerie", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "Lingerie"); } - }, - { - Name: "Pet", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "Pet"); } - }, - { - Name: "Pony", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "Pony"); } - }, - { - Name: "ABDL", - GetFactor: function (C) { return ActivityFetishItemFactor(C, "ABDL"); } - }, - { - Name: "Forniphilia", - GetFactor: function (C) {return ActivityFetishItemFactor(C, "Forniphilia"); } - }, -]; diff --git a/Assets/Female3DCG/Female3DCGExtended.js b/Assets/Female3DCG/Female3DCGExtended.js deleted file mode 100644 index 6e63278ae..000000000 --- a/Assets/Female3DCG/Female3DCGExtended.js +++ /dev/null @@ -1,7308 +0,0 @@ -//@ts-check -"use strict"; - -/** - * Female3DCGExtended.js - * --------------------- - * This file contains definitions and configuration for extended items. Items which are marked as Extended in - * `Female3DCG.js` and which have an extended item definition here will have their load/draw/click functions - * _automatically_ created when assets are loaded, saving the need for an individual extended item script. - * - * Currently, modular and typed items are supported, and this is likely to expand in the future. - */ - -/** - * An enum encapsulating the available extended item archetypes - * MODULAR - Indicates that this item is modular, with several independently configurable modules - * @type {{MODULAR: "modular", TYPED: "typed", VIBRATING: "vibrating", VARIABLEHEIGHT: "variableheight"}} - * @see {@link ModularItemConfig} - * @see {@link TypedItemConfig} - */ -const ExtendedArchetype = { - MODULAR: "modular", - TYPED: "typed", - VIBRATING: "vibrating", - VARIABLEHEIGHT: "variableheight", -}; - -/** - * An object containing all extended item configurations. - * @type {ExtendedItemConfig} - * @const - */ -var AssetFemale3DCGExtended = { - Hat: { - Bandana: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Plain", - Property: { Type: null, }, - }, - { - Name: "Circles", - Property: { Type: "Circles", }, - }, - { - Name: "Flowers", - Property: { Type: "Flowers", }, - }, - { - Name: "Dots", - Property: { Type: "PolkaDots", }, - }, - { - Name: "Triangles", - Property: { Type: "Triangles", }, - }, - ], - }, - }, //Bandana - BallCapBack: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "StrapUnder", - Property: { Type: "StrapUnder" }, - }, - { - Name: "StrapOver", - Property: { Type: "StrapOver", }, - }, - ], - }, - }, //BallCapBack - BallCapFront: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Blank", - Property: { Type: null, }, - }, - { - Name: "BCLogo", - Property: { - Type: "BCLogo", - DefaultColor: "Default", - }, - }, - { - Name: "BDSM", - Property: { - Type: "BDSM", - DefaultColor: "Default", - }, - }, - { - Name: "BG", - Property: { - Type: "BG", - DefaultColor: "Default", - }, - }, - { - Name: "Chain", - Property: { - Type: "Chain", - DefaultColor: "Default", - }, - }, - { - Name: "Gag", - Property: { - Type: "Gag", - DefaultColor: "Default", - }, - }, - { - Name: "Knot", - Property: { - Type: "Knot", - DefaultColor: "Default", - }, - }, - { - Name: "Monogram", - Property: { - Type: "Monogram", - DefaultColor: "Default", - }, - }, - { - Name: "Rock", - Property: { - Type: "Rock", - DefaultColor: "Default", - }, - }, - { - Name: "Smile", - Property: { - Type: "Smile", - DefaultColor: "Default", - }, - }, - { - Name: "Sun", - Property: { - Type: "Sun", - DefaultColor: "Default", - }, - }, - { - Name: "Tick", - Property: { - Type: "Tick", - DefaultColor: "Default", - }, - }, - ], - }, - }, //BallCapFront - }, - Cloth: { - TShirt2: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Plain", - Property: { Type: null, }, - }, - { - Name: "BCLogo", - Property: { - Type: "BCLogo", - DefaultColor: "#FFF0CC", - }, - }, - { - Name: "BDSM", - Property: { - Type: "BDSM", - DefaultColor: "Default", - }, - }, - { - Name: "Gag", - Property: { - Type: "Gag", - DefaultColor: "Default", - }, - }, - { - Name: "Knot", - Property: { - Type: "Knot", - DefaultColor: "#CCC088", - }, - }, - { - Name: "Rock", - Property: { - Type: "Rock", - DefaultColor: "#B03030", - }, - }, - { - Name: "Smile", - Property: { - Type: "Smile", - DefaultColor: "#BB9911", - }, - }, - { - Name: "Tick", - Property: { - Type: "Tick", - DefaultColor: "#119977", - }, - }, - ], - }, - }, // TShirt2 - ChineseDress2: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Red", - Property: { Type: null }, - }, - { - Name: "Purple", - Property: { Type: "Purple" }, - }, - { - Name: "Pink", - Property: { Type: "Pink" }, - }, - ], - }, - }, // ChineseDress2 - LatexLacedSuit: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Laced", - Property: { - Type: null, - }, - }, - { - Name: "NonLaced", - Property: { - Type: "NonLaced", - }, - }, - ], - }, - }, // LatexLacedSuit - ReverseBunnySuit: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "Suit", AssetName: "Catsuit" }, - }, // ReverseBunnySuit - Jacket: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Normal", - Property: { - Type: null, - }, - }, - { - Name: "Hooded", - Property: { - Type: "Hooded", - Hide: [ - "HairFront", "HairBack", - "HairAccessory1", "HairAccessory2", "HairAccessory3", - "Hat", - ], - }, - }, - { - Name: "HoodedEarsOut", - Property: { - Type: "HoodedEarsOut", - HideItem: ["HairAccessory2UnicornHorn", "HairAccessory2DildocornHorn"], - Hide: [ - "HairFront", "HairBack", - "HairAccessory1", "HairAccessory3", - "Hat", - ], - }, - } - ] - } - }, // Jacket - }, // Cloth - ClothAccessory: { - LeatherStraps: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemArms", AssetName: "LeatherArmbinder" }, - Config: { - Options: [ - { - Name: "WrapStrap", - Property: { Type: null, }, - }, - { - Name: "Strap", - Property: { Type: "Strap", }, - }, - ], - }, - }, // LeatherStraps - BunnyCollarCuffs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Both", - Property: { - Type: null, - }, - }, - { - Name: "Collar", - Property: { - Type: "Collar", - }, - }, - { - Name: "Cuffs", - Property: { - Type: "Cuffs", - }, - }, - ], - }, - }, // BunnyCollarCuffs - Bib: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Pattern", Key: "p", - Options: [{}, {}, {}, {}, {}, {}], - }, - { - Name: "Txt", Key: "x", - Options: [{}, { HasSubscreen: true }], - }, - ] - } - }, // Bib - Scarf: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "ShowMouth", - Property: { Type: null, }, - }, - { - Name: "Bundled", - Property: { Type: "Bundled", }, - }, - { - Name: "HideMouth", - Property: { Type: "HideMouth", }, - }, - - ], DrawImages: false, - }, - }, // Scarf - Glitter: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options:[ - { - Name: "Freckles", - Property: {Type: null,} - }, - { - Name: "MidFreckles", - Property: {Type: "MidFreckles",} - }, - { - Name: "SplitFreckles", - Property: {Type: "SplitFreckles",} - }, - { - Name: "FrecklesSmall", - Property: {Type: "FrecklesSmall",} - }, - { - Name: "MidFrecklesSmall", - Property: {Type: "MidFrecklesSmall",} - }, - { - Name: "SplitFrecklesSmall", - Property: {Type: "SplitFrecklesSmall",} - }, - { - Name: "StarsBoth", - Property: {Type: "StarsBoth",} - }, - { - Name: "StarsLeft", - Property: {Type: "StarsLeft",} - }, - { - Name: "StarsRight", - Property: {Type: "StarsRight",} - }, - { - Name: "DotsBoth", - Property: {Type: "DotsBoth",} - }, - { - Name: "DotsLeft", - Property: {Type: "DotsLeft",} - }, - { - Name: "DotsRight", - Property: {Type: "DotsRight",} - }, - ], - }, - }, //Glitter - }, // ClothAccessory - ItemBreast: { - Ribbons: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "LightWrap", - Property: { Type: null, Difficulty: 0 }, - }, - { - Name: "LightWrapBow", - Property: { Type: "LightWrapBow", Difficulty: 1 }, - }, - { - Name: "Wrap", - Property: { Type: "Wrap", Difficulty: 2 }, - }, - ], - Dialog: { - Load: "SelectRibbonType", - TypePrefix: "RibbonsStyle", - ChatPrefix: "RibbonsSet", - NpcPrefix: "ItemBreastRibbons", - }, - } - }, // Ribbons - FuturisticBra2: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Display", Key: "d", - Options: [ - {}, // d0 - Display - {}, // d1 - No Display - ], - }, - { - Name: "Shiny", Key: "s", - Options: [ - {}, // s0 - Shiny - {}, // s1 - No Shiny - ], - }, - ], - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - } - }, // FuturisticBra2 - }, // ItemBreast - ItemArms: { - Web: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Dictionary: [ - ({ newIndex, previousIndex }) => { return { Tag: "Action", Text: newIndex > previousIndex ? "tightens" : "loosens" };}, - ], - Options: [ - { - Name: "Tangled", - Property: { Type: null, Difficulty: 0 }, - }, - { - Name: "Wrapped", - BondageLevel: 0, - SelfBondageLevel: 4, - Prerequisite: ["NoFeetSpreader"], - Property: { - Type: "Wrapped", - Difficulty: 2, - SetPose: ["LegsClosed", "BackElbowTouch"], - Effect: ["Block", "Freeze", "Prone"], - Block: ["ItemTorso", "ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - }, - }, - { - Name: "Cocooned", - BondageLevel: 1, - SelfBondageLevel: 5, - Prerequisite: ["NoFeetSpreader"], - Property: { - Type: "Cocooned", - Difficulty: 4, - SetPose: ["LegsClosed", "BackElbowTouch"], - Effect: ["Block", "Freeze", "Prone"], - Block: ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemNipples", "ItemNipplesPiercings", "ItemBreast"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - }, - Random: false, - }, - { - Name: "Hogtied", - BondageLevel: 3, - SelfBondageLevel: 6, - Prerequisite: ["NotSuspended", "NoFeetSpreader"], - Property: { - Type: "Hogtied", - Difficulty: 4, - SetPose: ["Hogtied"], - Effect: ["Block", "Freeze", "Prone"], - Hide: ["Cloth", "ClothLower", "ClothAccessory", "Necklace", "Shoes", "Socks"], - Block: ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemNipples", "ItemNipplesPiercings", "ItemBreast", "ItemDevices"], - }, - Random: false, - }, - { - Name: "Suspended", - BondageLevel: 4, - SelfBondageLevel: 8, - Prerequisite: ["NoFeetSpreader", "NotChained"], - Property: { - Type: "Suspended", - Difficulty: 6, - SetPose: ["LegsClosed", "BackElbowTouch", "Suspension"], - Effect: ["Block", "Freeze", "Prone", "Suspended"], - Block: ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemNipples", "ItemNipplesPiercings", "ItemBreast"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - }, - Random: false, - }, - { - Name: "KneelingSuspended", - BondageLevel: 5, - SelfBondageLevel: 8, - Prerequisite: ["NoFeetSpreader", "NotChained"], - Property: { - Type: "KneelingSuspended", - Difficulty: 8, - SetPose: ["LegsClosed", "BackElbowTouch", "Suspension"], - Effect: ["Block", "Freeze", "Prone"], - Hide: ["BodyLower", "Cloth", "ClothLower", "Shoes", "SuitLower", "Panties", "Socks", "Pussy", "ItemFeet", "ItemLegs", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemBoots", "ItemHands", "ItemNipples", "ItemNipplesPiercings", "ItemBreast"], - Block: ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemNipples", "ItemNipplesPiercings", "ItemBreast"], - }, - Random: false, - }, - { - Name: "SuspensionHogtied", - BondageLevel: 5, - SelfBondageLevel: 9, - Prerequisite: ["NotSuspended", "NoFeetSpreader", "NotChained"], - Property: { - Type: "SuspensionHogtied", - Difficulty: 11, - SetPose: ["Hogtied"], - Effect: ["Block", "Freeze", "Prone", "Suspended"], - Hide: ["Cloth", "ClothLower", "ClothAccessory", "Necklace", "Shoes", "Socks"], - Block: ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemNipples", "ItemNipplesPiercings", "ItemBreast", "ItemDevices"], - OverrideHeight: { Height: 0, Priority: 51, HeightRatioProportion: 0 }, - }, - Random: false, - }, - ], - Dialog: { - Load: "WebBondageSelect", - TypePrefix: "WebBondage", - ChatPrefix: "ArmsWebSet", - NpcPrefix: "ItemArmsWeb", - }, - } - }, // Web - InflatableStraightLeotard: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Light", - Property: { - Type: null, - Effect: ["Block", "Prone"], - }, - }, - { - Name: "Inflated", - Property: { - Type: "Inflated", - Effect: ["Block", "Prone"], - Difficulty: 1, - }, - }, - { - Name: "Bloated", - Property: { - Type: "Bloated", - Effect: ["Block", "Prone"], - Difficulty: 2, - }, - }, - { - Name: "Max", - Property: { - Type: "Max", - Effect: ["Block", "Prone", "Freeze"], - Difficulty: 3, - }, - }, - ], - Dialog: { - Load: "SelectInflationLevel", - TypePrefix: "InflationAmount", - ChatPrefix: "InflationAmountSet", - NpcPrefix: "ItemArmsInflatableStraightLeotard", - }, - } - }, // InflatableStraightLeotard - MetalCuffs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "InFront", - Property: { - Type: "InFront", - SetPose: ["BaseUpper"], - } - }, - { - Name: "BehindBack", - Property: { - Type: null, - SetPose: ["BackCuffs"], - } - } - ], - Dialog: { - Load: "SelectBondagePosition", - TypePrefix: "MetalCuffsPose", - ChatPrefix: "MetalCuffsRestrain", - NpcPrefix: "ItemArmsMetalCuffs", - }, - } - }, // MetalCuffs - Chains: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "WristTie", - Property: { Type: "WristTie", Effect: ["Block", "Prone"], SetPose: ["BackBoxTie"], Difficulty: 1 }, - Expression: [{ Group: "Blush", Name: "Low", Timer: 5 }] - }, { - Name: "BoxTie", - Property: { Type: null, Effect: ["Block", "Prone"], SetPose: ["BackBoxTie"], Difficulty: 1 } - }, { - Name: "ChainCuffs", - Property: { Type: "ChainCuffs", Effect: ["Block", "Prone"], SetPose: ["BackCuffs"], Difficulty: 1, OverridePriority: 29 }, - Expression: [{ Group: "Blush", Name: "Low", Timer: 5 }] - }, { - Name: "WristElbowTie", - BondageLevel: 2, - Property: { Type: "WristElbowTie", Effect: ["Block", "Prone", "NotSelfPickable"], SetPose: ["BackElbowTouch"], Difficulty: 2 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "WristElbowHarnessTie", - BondageLevel: 3, - Property: { Type: "WristElbowHarnessTie", Effect: ["Block", "Prone", "NotSelfPickable"], SetPose: ["BackElbowTouch"], Difficulty: 3 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "KneelingHogtie", - BondageLevel: 4, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { Type: "KneelingHogtie", Effect: ["Block", "Freeze", "Prone", "NotSelfPickable"], Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], SetPose: ["Kneel", "BackElbowTouch"], Difficulty: 3, AllowPose: ["Kneel", "KneelingSpread"], AllowActivePose: ["Kneel", "KneelingSpread"], WhitelistActivePose: ["Kneel", "KneelingSpread"] }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "Hogtied", - BondageLevel: 4, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { Type: "Hogtied", Effect: ["Block", "Freeze", "Prone", "NotSelfPickable"], Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], SetPose: ["Hogtied"], Difficulty: 3 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "AllFours", - BondageLevel: 6, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { Type: "AllFours", Effect: ["ForceKneel", "NotSelfPickable"], Block: ["ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], AllowActivityOn: ["ItemLegs", "ItemFeet", "ItemBoots"], SetPose: ["AllFours"], Difficulty: 3 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "SuspensionHogtied", - BondageLevel: 8, - Prerequisite: ["NotMounted", "NotChained", "NotSuspended"], - Property: { - Type: "SuspensionHogtied", - Effect: ["Block", "Freeze", "Prone", "NotSelfPickable", "Suspended"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["Hogtied"], - Difficulty: 6, - OverrideHeight: { Height: -575, Priority: 51, HeightRatioProportion: 1 } }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - HasSubscreen: true, - Archetype: ExtendedArchetype.VARIABLEHEIGHT, - ArchetypeConfig: { - MaxHeight: 0, - MinHeight: -575, - Slider: { - Icon: "player", - Top: 125, - Height: 675, - }, - Dialog: { - ChatPrefix: "SuspensionChange", - NpcPrefix: "ChainBondage", - }, - }, - } - ], - Dialog: { - Load: "SelectChainBondage", - TypePrefix: "ChainBondage", - ChatPrefix: "ArmsChainSet", - NpcPrefix: "ChainBondage", - }, - ChangeWhenLocked: false, - } - }, // Chains - HighSecurityStraitJacket: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Crotch", Key: "c", - Options: [ - {}, // c0 - No crotch panel - { // c1 - Crotch panel - Property: { - Difficulty: 1, - Block: ["ItemPelvis", "ItemVulva", "ItemVulvaPiercings", "ItemButt"], - Hide: ["ItemVulva", "ItemVulvaPiercings"], - HideItem: ["ItemButtAnalBeads2"], - }, - }, - ], - }, - { - Name: "Arms", Key: "a", - Options: [ - {}, // a0 - Arms loose - { Property: { Difficulty: 2 }, SelfBondageLevel: 8 }, // a1 - Arms in front - { Property: { Difficulty: 3 }, SelfBondageLevel: 8 }, // a2 - Arms behind - ], - }, - { - Name: "Straps", Key: "s", - Options: [ - {}, // s0 - No crotch straps - { // s1 - One crotch strap - Property: { - Difficulty: 1, - Block: ["ItemPelvis", "ItemVulva", "ItemVulvaPiercings", "ItemButt"], - Hide: ["ItemVulvaPiercings"], - HideItem: ["ItemButtAnalBeads2"], - }, - }, - { Property: { Difficulty: 2, Block: ["ItemPelvis"] } }, // s2 - Two crotch straps - { // s3 - Three crotch straps - Property: { - Difficulty: 2, - Block: ["ItemPelvis", "ItemVulva", "ItemVulvaPiercings", "ItemButt"], - Hide: ["ItemVulvaPiercings"], - HideItem: ["ItemButtAnalBeads2"], - }, - }, - ], - }, - ], - ChangeWhenLocked: false, - }, - }, // HighSecurityStraitJacket - LatexButterflyLeotard: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Unpolished", - Property: { Type: null }, - }, - { - Name: "Polished", - Property: { Type: "Polished" }, - }, - ], - Dialog: { - Load: "ItemArmsLatexLeotardSelect", - TypePrefix: "ItemArmsLatexLeotard", - ChatPrefix: "ItemArmsLatexLeotardSet", - }, - }, - }, // LatexButterflyLeotard - LatexBoxtieLeotard: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "LatexButterflyLeotard" }, - }, - LatexSleevelessLeotard: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "LatexButterflyLeotard" }, - }, - CeilingShackles: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "HeadLevel", - Property: { - Type: null, - SetPose: ["Yoked"] - }, - }, - { - Name: "Overhead", - Property: { - Type: "Overhead", - SetPose: ["OverTheHead"] - }, - }, - ], - Dialog: { - Load: "SelectBondagePosition", - ChatPrefix: ({ C }) => `ItemArmsCeilingShacklesSet${C.Pose.includes("Suspension") ? "Suspension" : ""}` - }, - }, - }, // CeilingShackles - BitchSuit: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Zipped", - Property: { - Type: null, - Block: ["ItemBreast", "ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt"], - Hide: ["ItemNipples"], - } - }, - { - Name: "Unzipped", - Property: { - Type: "z1", - Block: [], - } - }, - { - Name: "Exposed", - Property: { - Type: "z2", - Block: [], - Hide: ["Cloth", "ClothLower", "Shoes", "Socks", "ItemBoots", "ItemLegs", "ItemFeet", "ItemHands", "Hands", "Gloves", "Garters"], - } - }, - ], - ChangeWhenLocked: false, - }, - }, // BitchSuit - LeatherArmbinder: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "None", - Property: { Type: null, Difficulty: 0 }, - }, - { - Name: "Strap", - Property: { Type: "Strap", Difficulty: 3 }, - }, - { - Name: "WrapStrap", - Property: { Type: "WrapStrap", Difficulty: 3 }, - }, - ], - Dialog: { - Load: "ItemArmsLeatherArmbinderSelect", - TypePrefix: "ItemArmsLeatherArmbinder", - ChatPrefix: "ItemArmsLeatherArmbinderSet", - }, - }, - }, // LeatherArmbinder - WristShackles: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "InFront", - Property: { - Type: null - }, - }, - { - Name: "Behind", - Property: { - Type: "Behind", - SetPose: ["BackCuffs"], - Effect: ["Block", "Prone"], - Difficulty: 3 - }, - }, - { - Name: "Overhead", - Property: { - Type: "Overhead", - SetPose: ["OverTheHead"], - Effect: ["Block", "Prone"], - Difficulty: 3 - }, - }, - ], - Dialog: { - Load: "SelectBondagePosition", - } - }, - }, // WristShackles - FuturisticCuffs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "None", - Property: { - Type: null, - Difficulty: 0, - Effect: [], - SetPose: [], - SelfUnlock: true, - }, - }, - { - Name: "Wrist", - Property: { - Type: "Wrist", - Difficulty: 2, - Effect: ["Block", "Prone"], - SetPose: ["BackBoxTie"], - SelfUnlock: true, - }, - }, - { - Name: "Elbow", - Property: { - Type: "Elbow", - Difficulty: 4, - Effect: ["Block", "Prone", "NotSelfPickable"], - SetPose: ["BackElbowTouch"], - SelfUnlock: false, - }, - }, - { - Name: "Both", - Property: { - Type: "Both", - Difficulty: 6, - Effect: ["Block", "Prone", "NotSelfPickable"], - SetPose: ["BackElbowTouch"], - SelfUnlock: false, - }, - }, - ], - Dialog: { - Load: "SelectBondagePosition", - TypePrefix: "ItemArmsCuffs", - ChatPrefix: "FuturisticCuffsRestrain", - }, - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - }, - }, // FuturisticCuffs - FuturisticArmbinder: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Normal", - Property: { Type: null, Difficulty: 0 }, - }, - { - Name: "Tight", - Property: { Type: "Tight", Difficulty: 7 }, - }, - ], - Dialog: { - Load: "SelectFuturisticArmbinderType", - TypePrefix: "FuturisticArmbinderType", - ChatPrefix: "FuturisticArmbinderSet", - }, - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - }, - }, // FuturisticArmbinder - LeatherCuffs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "None", - Property: { - Type: null, - Difficulty: 0, - Effect: [], - SetPose: [], - SelfUnlock: true, - }, - }, - { - Name: "Wrist", - Property: { - Type: "Wrist", - Difficulty: 2, - Effect: ["Block", "Prone"], - SetPose: ["BackBoxTie"], - SelfUnlock: true, - }, - }, - { - Name: "Elbow", - Property: { - Type: "Elbow", - Difficulty: 4, - Effect: ["Block", "Prone", "NotSelfPickable"], - SetPose: ["BackElbowTouch"], - SelfUnlock: false, - }, - }, - { - Name: "Both", - Property: { - Type: "Both", - Difficulty: 6, - Effect: ["Block", "Prone", "NotSelfPickable"], - SetPose: ["BackElbowTouch"], - SelfUnlock: false, - }, - }, - { - Name: "Hogtie", - Prerequisite: ["CuffedFeet", "NotSuspended", "NotMounted", "NoFeetSpreader"], - Property: { - Type: "Hogtie", - Difficulty: 6, - Effect: ["Block", "Prone", "Freeze", "NotSelfPickable"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["Hogtied"], - SelfUnlock: false, - }, - }, - ], - Dialog: { - Load: "SelectBondagePosition", - TypePrefix: "ItemArmsCuffs", - }, - }, - }, // LeatherCuffs - OrnateCuffs: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "LeatherCuffs" }, - }, // OrnateCuffs - SteelCuffs: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "LeatherCuffs" }, - Config: { - Options: [ - { - Name: "None", - Property: { Type: null } - }, - { - Name: "Wrist", - Property: { - Type: "Wrist", - Effect: ["Block", "Prone"], - SetPose: ["BackBoxTie"] - } - } - ], - }, - }, // SteelCuffs - StraitJacket: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Loose", - Property: { - Type: null, - Difficulty: 0, - }, - }, - { - Name: "Normal", - Property: { - Type: "Normal", - Difficulty: 3, - }, - }, - { - Name: "Snug", - Property: { - Type: "Snug", - Difficulty: 6, - }, - }, - { - Name: "Tight", - Property: { - Type: "Tight", - Difficulty: 9, - }, - }, - ], - Dialog: { - Load: "ItemArmsStraitJacketSelect", - TypePrefix: "ItemArmsStraitJacket", - }, - }, - }, // StraitJacket - LeatherStraitJacket: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "StraitJacket" }, - }, // LeatherStraitJacket - CollarCuffs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Loose", - Property: { - Type: null, - Difficulty: 0, - }, - }, - { - Name: "Normal", - Property: { - Type: "Normal", - Difficulty: 3, - }, - }, - { - Name: "Snug", - Property: { - Type: "Snug", - Difficulty: 6, - }, - }, - { - Name: "Tight", - Property: { - Type: "Tight", - Difficulty: 9, - }, - }, - ], - DrawImages: false, - }, - }, // CollarCuffs - DuctTape: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Arms", - Property: { Type: null, Difficulty: 1 }, - }, - { - Name: "Bottom", - SelfBondageLevel: 4, - Prerequisite: ["NoOuterClothes"], - Property: { - Type: "Bottom", - SetPose: ["BackElbowTouch"], - Block: ["ItemVulva", "ItemButt", "ItemPelvis", "ItemVulvaPiercings"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - Difficulty: 2, - }, - }, - { - Name: "Top", - SelfBondageLevel: 6, - Prerequisite: ["NoOuterClothes"], - Property: { - Type: "Top", - SetPose: ["BackElbowTouch"], - Block: ["ItemTorso", "ItemBreast", "ItemNipples", "ItemNipplesPiercings"], - Difficulty: 4, - }, - }, - { - Name: "Full", - SelfBondageLevel: 8, - Prerequisite: ["NoOuterClothes"], - Property: { - Type: "Full", - SetPose: ["BackElbowTouch"], - Block: ["ItemVulva", "ItemButt", "ItemPelvis", "ItemTorso", "ItemBreast", "ItemNipples", "ItemVulvaPiercings", "ItemNipplesPiercings"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - Difficulty: 6, - } - }, - { - Name: "Complete", - SelfBondageLevel: 10, - Prerequisite: ["NoOuterClothes"], - Property: { - Type: "Complete", - SetPose: ["BackElbowTouch"], - Block: ["ItemVulva", "ItemButt", "ItemPelvis", "ItemTorso", "ItemBreast", "ItemNipples", "ItemVulvaPiercings", "ItemNipplesPiercings"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - Difficulty: 7, - } - }, - { - Name: "ExposedComplete", - SelfBondageLevel: 10, - Prerequisite: ["NoOuterClothes"], - Property: { - Type: "ExposedComplete", - SetPose: ["BackElbowTouch"], - Block: ["ItemVulva", "ItemButt", "ItemPelvis", "ItemTorso", "ItemVulvaPiercings", "ItemBreast"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - Difficulty: 7, - } - }, - { - Name: "PetTape", - SelfBondageLevel: 10, - Property: { - Type: "PetTape", - SetPose: ["BackElbowTouch"], - Block: ["ItemHands"], - HideItem: ["ClothAccessoryPoncho"], - Difficulty: 7, - } - }, - ], - Dialog: { - Load: "SelectTapeWrapping", - }, - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR, CommonChatTags.DEST_CHAR], - } - }, // DuctTape - Zipties: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "ZipLight", - Property: { - Type: null, - Effect: ["Block", "Prone"], - SetPose: ["BackElbowTouch"], - Difficulty: 1 - } - }, { - Name: "ZipMedium", - Property: { - Type: "ZipMedium", - Effect: ["Block", "Prone"], - SetPose: ["BackElbowTouch"], - Difficulty: 2 - }, - Expression: [{ Group: "Blush", Name: "Low", Timer: 5 }] - }, { - Name: "ZipFull", - Property: { - Type: "ZipFull", - Effect: ["Block", "Prone"], - SetPose: ["BackElbowTouch"], - Difficulty: 3 - }, - Expression: [{ Group: "Blush", Name: "Low", Timer: 5 }] - }, { - Name: "ZipElbowWrist", - Property: { - Type: "ZipElbowWrist", - Effect: ["Block", "Prone"], - SetPose: ["BackElbowTouch"], - Difficulty: 1 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "ZipWristLight", - Property: { - Type: "ZipWristLight", - Effect: ["Block", "Prone"], - SetPose: ["BackBoxTie"], - Difficulty: 3 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "ZipWristMedium", - Property: { - Type: "ZipWristMedium", - Effect: ["Block", "Prone"], - SetPose: ["BackBoxTie"], - Difficulty: 3 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "ZipWristFull", - Property: { - Type: "ZipWristFull", - Effect: ["Block", "Prone"], - SetPose: ["BackBoxTie"], - Difficulty: 3 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "ZipWrist", - Property: { - Type: "ZipWrist", - Effect: ["Block", "Prone"], - SetPose: ["BackBoxTie"], - Difficulty: 1 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "ZipKneelingHogtie", - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "ZipKneelingHogtie", - Effect: ["Block", "Freeze", "Prone"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["Kneel", "BackElbowTouch"], Difficulty: 3 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "ZipHogtie", - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "ZipHogtied", - Effect: ["Block", "Freeze", "Prone"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["Hogtied"], Difficulty: 3 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "ZipAllFours", - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "ZipAllFours", Effect: ["ForceKneel"], - Block: ["ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["AllFours"], Difficulty: 3 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, - ], - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Dialog: { - Load: "SelectZipTie", - } - }, - }, // Zipties - ThinLeatherStraps: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { Name: "Wrist", Property: { Type: "Wrist", SetPose: ["BackBoxTie"] } }, - { Name: "Boxtie", Property: { Type: null, SetPose: ["BackBoxTie"], Difficulty: 4 } }, - { Name: "WristElbow", Property: { Type: "WristElbow", SetPose: ["BackElbowTouch"], Difficulty: 3 } }, - { Name: "WristElbowHarness", Property: { Type: "WristElbowHarness", SetPose: ["BackElbowTouch"], Difficulty: 5 } }, - { - Name: "Hogtie", - Property: { - Type: "Hogtie", SetPose: ["Hogtied"], Effect: ["Block", "Freeze", "Prone"], Difficulty: 6 - }, - Random: false, - } - ] - } - }, //ThinLeatherStraps - MermaidSuit: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Zipped", - Property: { - Type: null, - Difficulty: 0, - Block: ["ItemBreast", "ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt"], - }, - }, - { - Name: "UnZip", - Property: { - Type: "UnZip", - Block: [], - }, - }, - ], - }, - }, // MermaidSuit - TightJacket: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Basic", - Property: { - Type: null, - Difficulty: 1, - }, - }, - { - Name: "PulledStraps", - Property: { - Type: "PulledStraps", - Difficulty: 1, - }, - }, - { - Name: "LiningStraps", - Property: { - Type: "LiningStraps", - Difficulty: 2, - }, - }, - { - Name: "ExtraPadding", - Property: { - Type: "ExtraPadding", - Difficulty: 2, - }, - }, - { - Name: "PulledLining", - Property: { - Type: "PulledLining", - Difficulty: 3, - }, - }, - { - Name: "PulledPadding", - Property: { - Type: "PulledPadding", - Difficulty: 3, - }, - }, - { - Name: "PaddedLining", - Property: { - Type: "PaddedLining", - Difficulty: 3, - }, - }, - { - Name: "FullJacket", - Property: { - Type: "FullJacket", - Difficulty: 4, - }, - }, - ], - Dialog: { - Load: "ItemArmsTightJacketSelect", - TypePrefix: "ItemArmsTightJacket", - ChatPrefix: "ItemArmsTightJacketSet", - }, - }, - }, // TightJacket - TightJacketCrotch: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "TightJacket" }, - }, // TightJacketCrotch - WrappedBlanket: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "NormalWrapped", - Property: { Type: null, }, - }, - { - Name: "ShouldersWrapped", - Property: { Type: "ShouldersWrapped", }, - }, - { - Name: "FeetWrapped", - Property: { Type: "FeetWrapped", }, - }, - { - Name: "FullWrapped", - Property: { Type: "FullWrapped", }, - }, - ], - }, - }, // WrappedBlanket - Ribbons: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Cross", - Property: { Type: null, Difficulty: 1 }, - }, - { - Name: "Heavy", - SelfBondageLevel: 4, - Property: { Type: "Heavy", Difficulty: 2 } - }, - ], - Dialog: { - Load: "SelectRibbonType", - }, - }, - }, // Ribbons - SturdyLeatherBelts: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - ChangeWhenLocked: false, - Dialog: { - Load: "SturdyLeatherBeltsSelectTightness", - TypePrefix: "SturdyLeatherBeltsPose", - ChatPrefix: "SturdyLeatherBeltsRestrain", - }, - Options: [ - { - Name: "One", - Property: { Type: null, }, - }, - { - Name: "Two", - Property: { Type: "Two", Difficulty: 2, }, - }, - { - Name: "Three", - Property: { Type: "Three", Difficulty: 4, }, - }, - ], - } - }, // SturdyLeatherBelts - StraitLeotard: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - ChatTags: [CommonChatTags.DEST_CHAR_NAME, CommonChatTags.ASSET_NAME], - Modules: [ - { - Name: "Cloth", Key: "cl", - Options: [{ Property: { Hide: ["Cloth"] } }, {}], - }, - { - Name: "Corset", Key: "co", - Options: [{ Property: { Hide: ["Corset", "ItemTorso"] } }, {}], - }, - { - Name: "NipplesPiercings", Key: "np", - Options: [{ Property: { Hide: ["ItemNipplesPiercings", "ItemNipples", "ItemBreast"] } }, {}], - }, - { - Name: "VulvaPiercings", Key: "vp", - Options: [{ Property: { Hide: ["ItemVulvaPiercings", "Panties", "ItemPelvis"] } }, {}], - }, - ], - ChangeWhenLocked: false, - }, - }, // StraitLeotard - FuturisticStraitjacket: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Cloth", Key: "cl", - Options: [{ Property: { Hide: ["Cloth"] } }, {}], - }, - { - Name: "Corset", Key: "co", - Options: [{ Property: { Hide: ["Corset", "ItemTorso"] } }, {}], - }, - { - Name: "NipplesPiercings", Key: "np", - Options: [{ Property: { Hide: ["ItemNipplesPiercings", "ItemNipples", "ItemBreast"] } }, {}], - }, - { - Name: "VulvaPiercings", Key: "vp", - Options: [{ Property: { Hide: ["ItemVulvaPiercings", "Panties", "ItemPelvis"] } }, {}], - }, - { - Name: "Arms", Key: "a", - Options: [ - {}, // a0 - Arms front - { // a1 - Arms behind - Property: { - Difficulty: 2, - } - }, - ], - }, - ], - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - }, - }, // FuturisticStraitjacket - Tentacles: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "BehindBack", - Property: { - Type: null, - SetPose: ["BackElbowTouch"], - }, - }, - { - Name: "OverTheHead", - Property: { - Type: "OverTheHead", - SetPose: ["OverTheHead"], - HideItem: ["ClothAdmiralTop", "ClothFurCoat", "ClothStudentOutfit2", "ClothSweater1", "ClothTeacherOutfit1"], - }, - }, - ], - }, - }, // Tentacles - NylonRope: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "WristTie", - Property: { Type: "WristTie", Effect: ["Block", "Prone"], SetPose: ["BackBoxTie"], Difficulty: 1 }, - Expression: [{ Group: "Blush", Name: "Low", Timer: 5 }] - }, { - Name: "BoxTie", - Property: { Type: null, Effect: ["Block", "Prone"], SetPose: ["BackBoxTie"], Difficulty: 1 } - }, { - Name: "WristElbowTie", - BondageLevel: 2, - Property: { Type: "WristElbowTie", Effect: ["Block", "Prone"], SetPose: ["BackElbowTouch"], Difficulty: 2 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "SimpleHogtie", - BondageLevel: 2, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { Type: "SimpleHogtie", Effect: ["Block", "Prone"], SetPose: ["Hogtied"], Difficulty: 2 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }], - Random: false, - }, { - Name: "TightBoxtie", - BondageLevel: 3, - Property: { Type: "TightBoxtie", Effect: ["Block", "Prone"], SetPose: ["BackBoxTie"], Difficulty: 3 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "WristElbowHarnessTie", - BondageLevel: 3, - Property: { Type: "WristElbowHarnessTie", Effect: ["Block", "Prone"], SetPose: ["BackElbowTouch"], Difficulty: 3 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "KneelingHogtie", - BondageLevel: 4, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "KneelingHogtie", - Effect: ["Block", "Freeze", "Prone"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["Kneel", "BackElbowTouch"], - Difficulty: 3, - AllowPose: ["Kneel", "KneelingSpread"], - AllowActivePose: ["Kneel", "KneelingSpread"], - WhitelistActivePose: ["Kneel", "KneelingSpread"], - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "Hogtied", - BondageLevel: 4, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "Hogtied", - Effect: ["Block", "Freeze", "Prone"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["Hogtied"], - Difficulty: 3 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "AllFours", - BondageLevel: 6, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "AllFours", - Effect: ["ForceKneel"], - Block: ["ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["AllFours"], - Difficulty: 3 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "BedSpreadEagle", - BondageLevel: 1, - Prerequisite: ["OnBed"], - Property: { Type: "BedSpreadEagle", Effect: ["Block", "Freeze", "Prone"], Block: ["ItemDevices"], SetPose: ["Yoked"], Difficulty: 5 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, - ], - Dialog: { - Load: "SelectRopeBondage", - TypePrefix: "RopeBondage", - ChatPrefix: "ArmsRopeSet", - NpcPrefix: "RopeBondage", - }, - } - }, // NylonRope - HempRope: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "WristTie", - Property: { Type: "WristTie", Effect: ["Block", "Prone"], SetPose: ["BackBoxTie"], Difficulty: 1 }, - Expression: [{ Group: "Blush", Name: "Low", Timer: 5 }] - }, { - Name: "BoxTie", - Property: { Type: null, Effect: ["Block", "Prone"], SetPose: ["BackBoxTie"], Difficulty: 1 } - }, { - Name: "CrossedBoxtie", - Property: { Type: "CrossedBoxtie", Effect: ["Block", "Prone"], SetPose: ["BackBoxTie"], Difficulty: 1 }, - Expression: [{ Group: "Blush", Name: "Low", Timer: 5 }] - }, { - Name: "RopeCuffs", - Property: { Type: "RopeCuffs", Effect: ["Block", "Prone"], SetPose: ["BackCuffs"], Difficulty: 1, OverridePriority: 29 }, - Expression: [{ Group: "Blush", Name: "Low", Timer: 5 }] - }, { - Name: "WristElbowTie", - BondageLevel: 2, - Property: { Type: "WristElbowTie", Effect: ["Block", "Prone"], SetPose: ["BackElbowTouch"], Difficulty: 2 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "SimpleHogtie", - BondageLevel: 2, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { Type: "SimpleHogtie", Effect: ["Block", "Prone"], SetPose: ["Hogtied"], Difficulty: 2 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }], - Random: false, - }, { - Name: "TightBoxtie", - BondageLevel: 3, - Property: { Type: "TightBoxtie", Effect: ["Block", "Prone"], SetPose: ["BackBoxTie"], Difficulty: 3 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "WristElbowHarnessTie", - BondageLevel: 3, - Property: { Type: "WristElbowHarnessTie", Effect: ["Block", "Prone"], SetPose: ["BackElbowTouch"], Difficulty: 3 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }] - }, { - Name: "KneelingHogtie", - BondageLevel: 4, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "KneelingHogtie", - Effect: ["Block", "Freeze", "Prone"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["Kneel", "BackElbowTouch"], - Difficulty: 3, - AllowPose: ["Kneel", "KneelingSpread"], - AllowActivePose: ["Kneel", "KneelingSpread"], - WhitelistActivePose: ["Kneel", "KneelingSpread"], - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "Hogtied", - BondageLevel: 4, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "Hogtied", - Effect: ["Block", "Freeze", "Prone"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["Hogtied"], - Difficulty: 3 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "AllFours", - BondageLevel: 6, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "AllFours", - Effect: ["ForceKneel"], - Block: ["ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["AllFours"], - Difficulty: 3 - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "BedSpreadEagle", - BondageLevel: 1, - Prerequisite: ["OnBed"], - Property: { Type: "BedSpreadEagle", Effect: ["Block", "Freeze", "Prone"], Block: ["ItemDevices"], SetPose: ["Yoked"], Difficulty: 5 }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - }, { - Name: "SuspensionKneelingHogtie", - BondageLevel: 6, - Prerequisite: ["NotMounted", "NotChained", "NotSuspended"], - Property: { - Type: "SuspensionKneelingHogtie", - Effect: ["Block", "Freeze", "Prone", "Suspended"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["Kneel", "BackElbowTouch"], - AllowPose: ["Kneel", "KneelingSpread"], - AllowActivePose: ["Kneel", "KneelingSpread"], - WhitelistActivePose: ["Kneel", "KneelingSpread"], - Difficulty: 6, - OverrideHeight: { Height: -250, Priority: 51, HeightRatioProportion: 1 } - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - HasSubscreen: true, - Archetype: ExtendedArchetype.VARIABLEHEIGHT, - ArchetypeConfig: { - MaxHeight: 0, - MinHeight: -250, - Slider: { - Icon: "rope", - Top: 175, - Height: 400, - }, - Dialog: { - ChatPrefix: "SuspensionChange", - NpcPrefix: "RopeBondage", - }, - }, - }, { - Name: "SuspensionHogtied", - BondageLevel: 8, - Prerequisite: ["NotMounted", "NotChained", "NotSuspended"], - Property: { - Type: "SuspensionHogtied", - Effect: ["Block", "Freeze", "Prone", "Suspended"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["Hogtied"], - Difficulty: 6, - OverrideHeight: { Height: -575, Priority: 51, HeightRatioProportion: 1 } - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - HasSubscreen: true, - Archetype: ExtendedArchetype.VARIABLEHEIGHT, - ArchetypeConfig: { - MaxHeight: 0, - MinHeight: -575, - Slider: { - Icon: "rope", - Top: 125, - Height: 675, - }, - Dialog: { - ChatPrefix: "SuspensionChange", - NpcPrefix: "RopeBondage", - }, - }, - }, { - Name: "SuspensionAllFours", - BondageLevel: 8, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "SuspensionAllFours", - Effect: ["Block", "Freeze", "Prone", "Suspended"], - Block: ["ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["AllFours"], - Difficulty: 6, - OverrideHeight: { Height: -560, Priority: 51, HeightRatioProportion: 1 } - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - HasSubscreen: true, - Archetype: ExtendedArchetype.VARIABLEHEIGHT, - ArchetypeConfig: { - MaxHeight: 0, - MinHeight: -560, - Slider: { - Icon: "rope", - Top: 125, - Height: 675, - }, - Dialog: { - ChatPrefix: "SuspensionChange", - NpcPrefix: "RopeBondage", - }, - }, - }, { - Name: "InvertedSuspensionHogtied", - BondageLevel: 8, - Prerequisite: ["NotMounted", "NotChained", "NotSuspended"], - Property: { - Type: "InvertedSuspensionHogtied", - Effect: ["Block", "Freeze", "Prone", "Suspended"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["Hogtied", "Suspension"], - Difficulty: 6, - OverrideHeight: { Height: -600, Priority: 51, HeightRatioProportion: 0 } - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - HasSubscreen: true, - Archetype: ExtendedArchetype.VARIABLEHEIGHT, - ArchetypeConfig: { - MaxHeight: -50, - MinHeight: -600, - Slider: { - Icon: "rope", - Top: 100, - Height: 700, - }, - Dialog: { - ChatPrefix: "SuspensionChange", - NpcPrefix: "RopeBondage", - }, - }, - }, { - Name: "InvertedSuspensionAllFours", - BondageLevel: 8, - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "InvertedSuspensionAllFours", - Effect: ["Block", "Freeze", "Prone", "Suspended"], - Block: ["ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemLegs", "ItemFeet", "ItemBoots"], - SetPose: ["AllFours", "Suspension"], - Difficulty: 6, - OverrideHeight: { Height: -560, Priority: 51, HeightRatioProportion: 0 } - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 10 }], - Random: false, - HasSubscreen: true, - Archetype: ExtendedArchetype.VARIABLEHEIGHT, - ArchetypeConfig: { - MaxHeight: 0, - MinHeight: -560, - Slider: { - Icon: "rope", - Top: 100, - Height: 700, - }, - Dialog: { - ChatPrefix: "SuspensionChange", - NpcPrefix: "RopeBondage", - }, - }, - }, - ], - Dialog: { - Load: "SelectRopeBondage", - TypePrefix: "RopeBondage", - ChatPrefix: "ArmsRopeSet", - NpcPrefix: "RopeBondage", - }, - } - }, - Slime: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Position", Key: "p", - Options: [ - {}, // p0 - Arms behind back - { Property: { Difficulty: 2, SetPose: ["Hogtied"] } }, // p1 - Hogtied - ], - }, - { - Name: "Type", Key: "t", - Options: [ - {}, // t0 - Normal slime - { Property: { Difficulty: 3 } }, // t1 - Slime girl - ] - } - ], - ChatTags: [CommonChatTags.DEST_CHAR, CommonChatTags.TARGET_CHAR], - } - }, - WoodenCuffs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "HandsFront", - Property: { - Type: "HandsFront", - Difficulty: 2, - Effect: ["Block", "Prone"], - SetPose: ["BaseUpper"], - SelfUnlock: true, - }, - }, - { - Name: "HandsBack", - Property: { - Type: "HandsBack", - Difficulty: 3, - Effect: ["Block", "Prone"], - SetPose: ["BackCuffs"], - SelfUnlock: false, - }, - }, - { - Name: "HandsHead", - Property: { - Type: "HandsHead", - Difficulty: 4, - Effect: ["Block", "Prone", "NotSelfPickable"], - SetPose: ["Yoked"], - SelfUnlock: false, - }, - }, - { - Name: "Hogtied", - Prerequisite: ["NotMounted", "NotSuspended"], - Property: { - Type: "Hogtied", - Difficulty: 5, - Effect: ["Block", "Freeze", "Prone", "NotSelfPickable"], - SetPose: ["Hogtied"], - Block: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemHands", "ItemLegs", "ItemFeet", "ItemBoots"], - SelfUnlock: false, - }, - Expression: [{ Group: "Blush", Name: "Medium", Timer: 5 }], - }, - ], - Dialog: { - Load: "SelectBondagePosition", - TypePrefix: "ItemArmsWoodenCuffs", - }, - }, - }, // WoodenCuffs - }, // ItemArms - ItemNeck: { - ShinySteelCollar: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { Name: "NoRing", Property: { Type: null } }, - { Name: "Ring", Property: { Type: "Ring" } } - ], - DrawImages: false - } - }, // ShinySteelCollar - TechnoCollar: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "CollarType", Key: "c", - Options: [ - {}, // c0 Slender Collar - { - Property: { - Difficulty: 65, - }, - }, //c1 Choker Collar - { - Property: { - Difficulty: 70, - }, - }, //c2 Full Collar - { - Property: { - Difficulty: 75, - }, - }, //c3 Posture Collar - { - Property: { - Difficulty: 80, - }, - }, //c4 Strict Posture Collar - ], - }, - { - Name: "ShockModule", Key: "s", - Options: [ - {}, // s0 No Shock Module - { HasSubscreen: true }, // s1 Shock Module - ], - }, - ], - ChangeWhenLocked: false, - }, - }, //TechnoCollar - ComboHarness: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "BallGag", GroupName: "ItemMouth" }, - }, // ComboHarness - BonedNeckCorset: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { Name: "NoRing", Property: { Type: null } }, - { Name: "Ring", Property: { Type: "Ring" } }, - ], - } - }, // BonedNeckCorset - }, // ItemNeck - ItemNeckAccessories: { - CustomCollarTag: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - ChatSetting: ModularItemChatSetting.PER_MODULE, - Modules: [ - { - Name: "Tag", Key: "t", - Options: [{}, {}, {}, {}, {}, {}], - }, - { - Name: "Txt", Key: "x", - Options: [{ HasSubscreen: true }], - }, - ], - ChangeWhenLocked: false, - }, - } // CustomCollarTag - }, // ItemNeckAccessories - ItemNeckRestraints: { - PetPost: { - Archetype: ExtendedArchetype.MODULAR, - Config:{ - Modules: [ - { - Name: "Plaque", Key: "p", - Options: [ - {}, //p0 - Border - {}, //p1 - Border - ] - }, - { - Name: "Dirt", Key: "d", - Options: [ - {}, //d0 - Clean - {}, //d1 - Dirty - ] - }, - { - Name: "Leash", Key: "l", - Options: [ - {}, //l0 - Leash - {Property: { Difficulty: 5, },}, //l1 - Rope - {AllowLock: true, Property: { Difficulty: 6 },}, //l2 - Chain - ] - }, - { - Name: "Sticker", Key: "s", - Options: [ - {}, //s0 - Paw - {}, //s1 - Triskel - {}, //s2 - Moon - {}, //s3 - LGBT - {}, //s4 - Trans - {}, //s5 - Bi - {}, //s6 - NoSwim - {}, //s7 - None - ] - }, - { - Name: "PostIt", Key: "m", - Options: [ - {}, //m0 - Postit - {}, //m1 - No PostIt - ] - }, - { - Name: "Txt", Key: "x", - Options: [{ HasSubscreen: true }], - }, - ], - ChangeWhenLocked: false, - }, - },//PetPost - },//ItemNeckRestraints - ItemHood: { - OldGasMask: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Lenses", Key: "l", - Options: [ - {}, - { Property: { Effect: ["BlindHeavy"] } }, - ], - }, - { - Name: "Addons", Key: "a", - Options: [ - {}, - { Property: { Effect: ["GagEasy"] } }, - { Property: { Effect: ["GagEasy"] } }, - { Property: { Effect: ["GagEasy"] } }, - ], - }, - ], - ChangeWhenLocked: false, - }, - }, - InflatedBallHood: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Empty", - Property: { - Type: null, - Difficulty: 0, - InflateLevel: 0, - Effect: [], - }, - }, - { - Name: "Light", - Property: { - Type: "Light", - Difficulty: 2, - InflateLevel: 1, - Effect: ["GagLight", "BlockMouth"], - }, - }, - { - Name: "Inflated", - Property: { - Type: "Inflated", - Difficulty: 4, - InflateLevel: 2, - Effect: ["GagEasy", "BlockMouth"], - }, - }, - { - Name: "Bloated", - Property: { - Type: "Bloated", - Difficulty: 6, - InflateLevel: 3, - Effect: ["GagMedium", "BlockMouth"], - }, - }, - { - Name: "Maximum", - Property: { - Type: "Maximum", - Difficulty: 8, - InflateLevel: 4, - Effect: ["GagVeryHeavy", "BlockMouth"], - }, - }, - ], - Dialog: { - Load: "SelectInflateLevel", - TypePrefix: "InflateLevel", - ChatPrefix: ({ newIndex, previousIndex }) => `InflatedHood${(newIndex > previousIndex) ? "pumps" : "deflates"}To`, - }, - DrawImages: false, - } - }, // InflatedBallHood - KirugumiMask: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - ChatSetting: ModularItemChatSetting.PER_MODULE, - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR, CommonChatTags.TARGET_CHAR], - Modules: [ - { - Name: "Eyes", Key: "e", - Options: [{}, {}, {}, {}], // All options are merely cosmetic - }, - { - Name: "Mouth", Key: "m", - Options: [{}, {}, {}, {}], // All options are merely cosmetic, - }, - { - Name: "Blush", Key: "b", - Options: [{}, {}, {}, {}], // All options are merely cosmetic, - }, - { - Name: "Brows", Key: "br", - Options: [{}, {}, {}, {}], // All options are merely cosmetic, - }, - { - Name: "Opacity", Key: "op", - Options: [ - {}, - { - Property: { - Effect: ["BlindLight"], - }, - }, - { - Property: { - Effect: ["BlindHeavy", "Prone"], - }, - } - ], // Opacity - }, - { - Name: "MaskStyle", Key: "ms", - Options: [ - { - Property: { - Effect: ["BlockMouth"], - Hide: ["Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "Mask", "ItemHead"], - HideItem: ["ItemHeadSnorkel"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemHead", "ItemNose", "ItemEars"] - } - }, - { - Property: { - OverridePriority: 35, - Hide: ["Head"], - } - }, - ], - }, - ], - ChangeWhenLocked: false, - }, - }, // KirugumiMask - GwenHood: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "HairOutAccOut", - Property: { - Type: null, - Hide: [] - }, - }, - { - Name: "HairInAccOut", - Property: { - Type: "HairInAccOut", - Hide: ["HairBack"] - }, - }, - { - Name: "HairOutAccIn", - Property: { - Type: "HairOutAccIn", - Hide: ["HairAccessory1", "HairAccessory2", "HairAccessory3"] - }, - }, - { - Name: "HairInAccIn", - Property: { - Type: "HairInAccIn", - Hide: ["HairAccessory1", "HairAccessory2", "HairAccessory3", "HairBack"] - }, - }, - ], - Dialog: { - Load: "GwenHoodSelectStyle", - TypePrefix: "GwenHoodStyle", - ChatPrefix: "GwenHoodChangeStyle", - }, - DrawImages: false, - }, - }, // GwenHood - OpenFaceHood: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "HideBackHair", - Property: { Type: "HideBackHair", Hide: ["HairBack"] }, - }, - { - Name: "ShowBackHair", - Property: { Type: null }, - }, - ], - Dialog: { - Load: "SelectOpenFaceHoodStyle", - TypePrefix: "OpenFaceHoodStyle", - }, - DrawImages: false, - } - }, // OpenFaceHood - TechnoHelmet1: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Visor", Key: "v", - Options:[ - { - Property: { - CustomBlindBackground: "", - Effect: [], - } - }, //v0 No Visor - { - Property: { - CustomBlindBackground: "", - Effect: [], - Tint: [{ Color: 0, Strength: 0.1 }], - } - }, // v1 Transparent Visor - { - Property: { - CustomBlindBackground: "", - Effect: ["BlindLight", "Prone"], - Tint: [{ Color: 0, Strength: 0.2 }], - }, - }, // v2 Lightly Tinted Visor - { - Property: { - CustomBlindBackground: "", - Effect: ["BlindNormal", "Prone"], - Tint: [{ Color: 0, Strength: 0.5 }], - }, - }, // v3 Heavily Tinted Visor - { - Property: { - CustomBlindBackground: "", - Effect: ["BlindHeavy", "Prone"], - Tint: [{ Color: 0, Strength: 1 }], - }, - }, // v4 Opaque Visor - { - Property: { - CustomBlindBackground: "HypnoSpiral2", - Effect: ["BlindHeavy", "Prone"] - }, - }, // v5 Hypnotic Visor - ], - - }, - { - Name: "DeafeningModule", Key: "d", - Options: [ - {}, //h0 Disabled - { - Property: { - Effect: ["DeafLight"] - }, - }, //h1 Light - { - Property: { - Effect: ["DeafHeavy"], - }, - }, //h2 Heavy - { - Property: { - Effect: ["DeafTotal"] - }, - }, //h3 Noise-Cancelling - ], - }, - { - Name: "ChinStrap", Key: "c", - Options: [ - {}, //c0 No Chin Strap - { - Property: { - Difficulty: 10 - } - }, //h1 Chin Strap - ], - }, - ], - ChangeWhenLocked: false, - } - }, // TechnoHelmet1 - ZipperHood: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "ZippersOpen", - Property: { Type: null }, - }, - { - Name: "ZippersClosed", - Property: { Type: "ZippersClosed", Effect: ["BlindHeavy"] }, - }, - { - Name: "ZippersClosedEyes", - Property: { Type: "ZippersClosedEyes", Effect: ["BlindHeavy"] }, - }, - { - Name: "ZippersClosedMouth", - Property: {Type: "ZippersClosedMouth"}, - }, - ] - } - - }, // ZipperHood - HeadboxSeethrough: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Seethrough", - Property: { - Type: null, - Tint: [{Color: 0, Strength: 1}], - }, - }, - { - Name: "Opaque", - Property: { - Type: "Opaque" - }, - }, - ], - DrawImages: false, - }, - }, // HeadboxSeethrough - KittyHood: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Modules: [ - { - Name: "Blindfold", Key: "b", - Options: [ - {}, // b0 - None - { - Property: { - Effect: ["BlindHeavy"], - } - }, // b1 - Blindfold - ] - }, - { - Name: "Gag", Key: "g", - Options: [ - {}, // g0 - None - { - Property: { - Effect: ["GagLight"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3"], - } - }, // g1 - Gag - ] - }, - { - Name: "Expression", Key: "e", - Options: [ - {}, // e0 - Neutral - {}, // e1 - OwO - {}, // e2 - UwU - ] - } - ] - } - }, - DroneMask: { - Archetype: ExtendedArchetype.MODULAR, - CopyConfig: { GroupName: "ItemHead", AssetName: "DroneMask" }, - }, // DroneMask - }, // ItemHood - ItemDevices: { - FuturisticCrate: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Window", Key: "w", - Options: [ - {}, // d0 - Open - { - Property: { - Difficulty: 20, - Effect: ["Prone", "Freeze", "Enclose"] - }, - }, // d1 - Window - { - Property: { - Difficulty: 22, - Effect: ["BlindLight", "Prone", "Freeze", "Enclose"] - }, - }, // d2 - Normal Window - { - Property: { - Difficulty: 22, - Effect: ["BlindNormal", "Prone", "Freeze", "Enclose"] - }, - }, // d3 - Small window - { - Property: { - Difficulty: 52, - Effect: ["BlindHeavy", "GagLight", "Prone", "Freeze", "Enclose"] - }, - }, // d4 - Closed - ], - }, - { - Name: "LegCuffs", Key: "l", - Options: [ - {}, // l0 - No leg straps - { // l1 - Kneel leg restraints - Prerequisite: ["LegsOpen", "CuffedLegsOrEmpty", "CuffedFeetOrEmpty", "NotSuspended", "NotHogtied", "NotHorse", "NotKneeling"], - Property: { - Difficulty: 18, - SetPose: ["Kneel"], - Block: ["ItemFeet", "ItemLegs"], - Effect: ["Prone", "Freeze", "BlockKneel", "Mounted"], - Hide: ["ItemBoots", "Shoes"], - OverrideHeight: { Height: 0, Priority: 60 }, - }, - }, - { // l2 - Closed leg restraints - Prerequisite: ["LegsOpen", "CuffedLegsOrEmpty", "CuffedFeetOrEmpty", "NotSuspended", "NotHogtied", "NotHorse", "NotKneeling"], - Property: { - Difficulty: 22, - SetPose: ["LegsClosed"], - Block: ["ItemFeet", "ItemLegs"], - Effect: ["Prone", "Freeze", "BlockKneel", "Mounted"], - Hide: ["ItemBoots", "Shoes"] - }, - }, - { // l3 - Spread leg restraints - Prerequisite: ["LegsOpen", "CuffedLegsOrEmpty", "CuffedFeetOrEmpty", "NotSuspended", "NotHogtied", "NotHorse", "NotKneeling"], - Property: { - Difficulty: 22, - SetPose: ["Spread"], - Block: ["ItemFeet", "ItemLegs"], - Effect: ["Prone", "Freeze", "BlockKneel", "Mounted"], - Hide: ["ItemBoots", "Shoes"] - }, - }, - ], - }, - { - Name: "ArmCuffs", Key: "a", - Options: [ - {}, // s0 - No arm cuffs - { // s1 - Elbow cuffs - Prerequisite: ["CuffedArmsOrEmpty"], - Property: { - Difficulty: 18, - SetPose: ["BackElbowTouch"], - AllowActivePose: ["Spread", "LegsClosed", "BaseLower"], - Block: ["ItemArms"], - Effect: ["Prone", "Freeze", "Block", "BlockKneel", "Mounted"], - OverrideHeight: { Height: 0, Priority: 60 }, - }, - }, - { // s2 - Box cuffs - Prerequisite: ["CuffedArmsOrEmpty"], - Property: { - Difficulty: 18, - SetPose: ["BackBoxTie"], - AllowActivePose: ["Spread", "LegsClosed", "BaseLower"], - Block: ["ItemArms"], - Effect: ["Prone", "Freeze", "Block", "BlockKneel", "Mounted"], - OverrideHeight: { Height: 0, Priority: 60 }, - }, - }, - { // s3 - Overhead restraints - Prerequisite: ["CuffedArmsOrEmpty"], - Property: { - Difficulty: 22, - SetPose: ["OverTheHead"], - AllowActivePose: ["Spread", "LegsClosed", "BaseLower"], - Block: ["ItemArms"], - Effect: ["Prone", "Freeze", "Block", "BlockKneel", "Mounted"], - OverrideHeight: { Height: 0, Priority: 60 }, - }, - }, - ], - }, - { - Name: "Device", Key: "d", - Options: [ - {}, // d0 - No devvice - { // s1 - Pleasure module - HasSubscreen: true, - Prerequisite: ["AccessVulva", "VulvaEmpty", "VulvaNotBlockedByBelt"], - Property: { - SetPose: ["BaseLower"], - AllowActivePose: ["Spread", "LegsClosed", "BaseLower"], - Effect: ["Egged", "Prone", "Freeze", "BlockKneel"], - OverrideHeight: { Height: 0, Priority: 60 }, - } - }, - ], - }, - { - Name: "Structure", Key: "t", - Options: [ - {}, // t0 - No harness - {}, // t1 - X - {}, // t2 - + - {}, // t3 - H - ], - }, - { - Name: "Harness", Key: "h", - Options: [ - {}, // h0 - None - { // h1 - Minimal - Property: { - Difficulty: 12, - Effect: ["Prone", "Freeze"], - OverrideHeight: { Height: 0, Priority: 60 }, - }, - }, - { // h2 - Comprehensive - Property: { - Difficulty: 18, - Effect: ["Prone", "Freeze"], - OverrideHeight: { Height: 0, Priority: 60 }, - }, - }, - { // h3 - Comprehensive (breast) - Property: { - Difficulty: 18, - Effect: ["Prone", "Freeze"], - OverrideHeight: { Height: 0, Priority: 60 }, - }, - }, - { // h4 - High Security - Property: { - Difficulty: 24, - Effect: ["Prone", "Freeze"], - OverrideHeight: { Height: 0, Priority: 60 }, - }, - }, - ], - }, - ], - ChangeWhenLocked: false, - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - } - }, - }, // FuturisticCrate - - BondageBench: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "None", - AllowLock: false, - Property: { - Type: null, - Difficulty: 0, - SetPose: ["LegsClosed"], - Effect: ["Mounted"], - }, - }, - { - Name: "Light", - SelfBondageLevel: 2, - Prerequisite: ["NoOuterClothes"], - Property: { - Type: "Light", - Difficulty: 2, - SetPose: ["LegsClosed", "BaseUpper"], - Effect: ["Block", "Prone", "Freeze", "Mounted"], - Hide: ["HairBack", "Wings", "TailStraps", "ItemButt"], - }, - }, - { - Name: "Normal", - SelfBondageLevel: 3, - Prerequisite: ["NoOuterClothes"], - Property: { - Type: "Normal", - Difficulty: 3, - SetPose: ["LegsClosed", "BaseUpper"], - Effect: ["Block", "Prone", "Freeze", "Mounted"], - Hide: ["HairBack", "Wings", "TailStraps", "ItemButt"], - }, - }, - { - Name: "Heavy", - SelfBondageLevel: 6, - Prerequisite: ["NoOuterClothes"], - Property: { - Type: "Heavy", - Difficulty: 6, - SetPose: ["LegsClosed", "BaseUpper"], - Effect: ["Block", "Prone", "Freeze", "Mounted"], - Hide: ["HairBack", "Wings", "TailStraps", "ItemButt"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - }, - }, - { - Name: "Full", - SelfBondageLevel: 9, - Prerequisite: ["NoOuterClothes"], - Property: { - Type: "Full", - Difficulty: 9, - SetPose: ["LegsClosed", "BaseUpper"], - Effect: ["Block", "Prone", "Freeze", "Mounted"], - Hide: ["HairBack", "Wings", "TailStraps", "ItemButt"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - }, - }, - ], - Dialog: { - Load: "BondageBenchStrapsSelectTightness", - TypePrefix: "BondageBenchStrapsPose", - ChatPrefix: "BondageBenchStrapsRestrain", - }, - }, - }, // BondageBench - Cushion: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Hold", - Property: { - Type: null, - HideItem: ["ItemMiscTeddyBear"], - }, - }, - { - Name: "Kneel", - Prerequisite: ["NotSuspended", "CanKneel"], - Property: { - Type: "Kneel", - OverrideHeight: { Height: -200, Priority: 21 }, - OverridePriority: 1, - SetPose: ["Kneel"] - }, - }, - ], - Dialog: { - Load: "SelectCushionStyle", - TypePrefix: "CushionType", - }, - ChatSetting: TypedItemChatSetting.SILENT, - }, - }, // Cushion - Crib: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Gate", Key: "g", - Options: [ - {}, // g0 - Gate open - { Property: { Difficulty: 15 } }, // g1 - Gate closed - ], - }, - { - Name: "Plushies", Key: "p", - Options: [ - {}, // p0 - No plushies - {}, // p1 - Plushies - ], - }, - ], - }, - }, // Crib - PetBed: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "NoBlanket", - Property: { - Type: null - }, - }, - { - Name: "Blanket", - Property: { - Type: "Blanket", - SetPose: ["AllFours"], - Hide: ["ItemArms", "ItemButt", "TailStraps", "Wings"], - HideItem: ["ItemMiscTeddyBear"], - HideItemExclude: ["ItemArmsBitchSuit", "ItemArmsBitchSuitExposed"], - Block: [ - "ItemArms", "ItemBreast", "ItemButt", "ItemFeet", "ItemBoots", - "ItemLegs", "ItemMisc", "ItemNipples", "ItemNipplesPiercings", - "ItemPelvis", "ItemTorso", "ItemVulva", "ItemVulvaPiercings" - ] - }, - Random: false, - }, - ], - }, - }, // PetBed - Vacbed: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Normal", - Property: { Type: null } - }, - { - Name: "Nohair", - Property: { - Type: "Nohair", - Hide: ["HairFront", "HairAccessory1", "HairAccessory2", "HairAccessory3", "Hat"], - }, - }, - ], - }, - }, // Vacbed - Familiar: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Bat", - Property: { Type: null }, - }, - { - Name: "Cat", - Property: { Type: "Cat" }, - }, - { - Name: "Skeleton", - Property: { Type: "Skeleton" }, - }, - { - Name: "Parrot", - Property: { Type: "Parrot" }, - }, - ], - }, - }, // Familiar - LittleMonster: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Black", - Property: { Type: null }, - }, - { - Name: "Red", - Property: { Type: "Red" }, - }, - { - Name: "Green", - Property: { Type: "Green" }, - }, - { - Name: "Blue", - Property: { Type: "Blue" }, - }, - ], - }, - }, // LitteMonster - InflatableBodyBag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Light", - Property: { - Type: null, - Difficulty: 0, - }, - }, - { - Name: "Inflated", - Property: { - Type: "Inflated", - Difficulty: 3, - }, - }, - { - Name: "Bloated", - Property: { - Type: "Bloated", - Difficulty: 6, - }, - }, - { - Name: "Max", - Property: { - Type: "Max", - Difficulty: 9, - }, - }, - ], - }, - }, // InflatableBodyBag - FurBlanketWrap: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR_NAME], - Options: [ - { - Name: "Loose", - Property: { - Type: null, - Difficulty: 3, - }, - }, - { - Name: "Tight", - Property: { - Type: "Tight", - Difficulty: 5, - }, - }, - { - Name: "Belts", - AllowLock: true, - Property: { - Type: "Belts", - Difficulty: 8, - }, - }, - ], - DrawImages: false, - ChangeWhenLocked: false, - }, - }, // FurBlanketWrap - Pole: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Untied", - Property: { - Type: null, - } - }, - { - Name: "Tied", - SelfBondageLevel: 2, - Property: { - Type: "Tied", - Difficulty: 8, - SetPose: ["BackBoxTie"], - Effect: ["Block", "Freeze", "Prone"], - } - }, - ], - }, - }, // Pole - CryoCapsule: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Open", - Property: { - Type: null, - Difficulty: 0, - Effect: ["Freeze"], - SelfUnlock: true - } - }, - { - Name: "Closed", - Property: { - Type: "Closed", - Difficulty: 50, - Effect: ["Freeze", "GagMedium", "Prone", "Enclose", "BlindLight"], - SelfUnlock: false - } - } - ], - ChangeWhenLocked: false, - Dialog: { - Load: "SelectCryoCapsuleType", - TypePrefix: "CryoCapsuleType", - ChatPrefix: "CryoCapsuleSet", - }, - }, - }, // CryoCapsule - Coffin: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "CryoCapsule" }, - Config: { - Options: [ - { - Name: "Open", - Property: { - Type: null, - Difficulty: 0, - Effect: ["Freeze"], - SelfUnlock: true - } - }, - { - Name: "Closed", - Property: { - Type: "Closed", - Difficulty: 50, - Effect: ["Freeze", "GagMedium", "Prone", "Enclose", "BlindLight"], - SelfUnlock: false - } - } - ], - Dialog: { - Load: "SelectCoffinType", - TypePrefix: "CoffinType", - ChatPrefix: "CoffinSet", - }, - }, - }, // Coffin - Net: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR_NAME], - Options: [ - { - Name: "Kneel", - Property: { - Type: "Kneel", - Difficulty: 3, - Effect: ["Freeze", "Prone", "ForceKneel"], - SetPose: ["Kneel"], - }, - }, - { - Name: "AllFours", - Property: { - Type: "AllFours", - Difficulty: 6, - Effect: ["Freeze", "Prone"], - SetPose: ["AllFours"], - }, - }, - { - Name: "Suspended", - Property: { - Type: "Suspended", - Difficulty: 7, - Effect: ["Block", "Freeze", "Prone", "Suspended"], - SetPose: ["Hogtied"], - Block: ["ItemArms","ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemNipples", "ItemNipplesPiercings", "ItemBreast"], - Hide: ["ItemArms","ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis", "ItemTorso", "ItemHands", "ItemLegs", "ItemFeet", "ItemBoots", "ItemNipples", "ItemNipplesPiercings", "ItemBreast"], - HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], - OverrideHeight: { Height: 25, Priority: 51, HeightRatioProportion: 0 }, - }, - }, - ], - Dialog: { - Load: "SelectBondagePosition", - TypePrefix: "ItemDevicesNet", - }, - }, - }, // Net - WoodenRack: { - Archetype: ExtendedArchetype.MODULAR, - Config:{ - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR, CommonChatTags.DEST_CHAR_NAME, CommonChatTags.TARGET_CHAR_NAME], - Modules:[ - { - Name: "Frame", Key: "f", - Options: [ - {}, // f0 - Normal - {}, // f1 - Stained - {}, // f2 - HalfBack - {}, // f3 - NoBack - ], - }, - { - Name: "TopRestraints", Key: "t", - Options: [ - {}, // t0 - No - { - Prerequisite: ["CuffedArmsOrEmpty"], - Property: { - Difficulty: 6, - SetPose: ["Yoked"], - AllowActivePose: ["LegsClosed", "BaseLower"], - Block: ["ItemArms"], - Effect: ["Prone", "Freeze", "Block", "BlockKneel", "Mounted"], - }, - }, // t1 - Rope - { - Prerequisite: ["CuffedArmsOrEmpty"], - Property: { - Difficulty: 6, - SetPose: ["OverTheHead"], - AllowActivePose: ["LegsClosed", "BaseLower"], - Block: ["ItemArms"], - Effect: ["Prone", "Freeze", "Block", "BlockKneel", "Mounted"], - - }, - }, // t2 - RopeTight - { - AllowLock: true, - Prerequisite: ["CuffedArms"], - Property: { - Difficulty: 10, - SetPose: ["Yoked"], - AllowActivePose: ["LegsClosed", "BaseLower"], - Block: ["ItemArms"], - Effect: ["Prone", "Freeze", "Block", "BlockKneel", "Mounted"], - }, - }, // t3 - Chains - { - AllowLock: true, - Prerequisite: ["CuffedArms"], - Property: { - Difficulty: 10, - SetPose: ["OverTheHead"], - AllowActivePose: ["LegsClosed", "BaseLower"], - Block: ["ItemArms"], - Effect: ["Prone", "Freeze", "Block", "BlockKneel", "Mounted"], - }, - }, // t4 - ChainsTight - { - AllowLock: true, - Property: { - Difficulty: 12, - SetPose: ["Yoked"], - Block: ["ItemArms"], - Effect: ["Prone", "Freeze", "BlockKneel", "Mounted"], - }, - }, // t5 - Stocks - ], - }, - { - Name: "BotRestraints", Key: "b", - Options: [ - {}, // b0 - No - { - Property: { - Difficulty: 6, - SetPose: ["Spread"], - Block: ["ItemFeet", "ItemLegs"], - Effect: ["Prone", "Freeze", "BlockKneel", "Mounted"], - Hide: ["ItemBoots", "Shoes"] - }, - }, // b1 - Rope - { - Property: { - Difficulty: 6, - SetPose: ["LegsClosed"], - Block: ["ItemFeet", "ItemLegs"], - Effect: ["Prone", "Freeze", "BlockKneel", "Mounted"], - Hide: ["ItemBoots", "Shoes"] - }, - }, // b2 - RopeTight - { - AllowLock: true, - Prerequisite: ["CuffedLegs"], - Property: { - Difficulty: 10, - SetPose: ["Spread"], - Block: ["ItemFeet", "ItemLegs"], - Effect: ["Prone", "Freeze", "BlockKneel", "Mounted"], - Hide: ["ItemBoots", "Shoes"] - }, - }, // b3 - Chains - { - AllowLock: true, - Prerequisite: ["CuffedLegs"], - Property: { - Difficulty: 10, - SetPose: ["LegsClosed"], - Block: ["ItemFeet", "ItemLegs"], - Effect: ["Prone", "Freeze", "BlockKneel", "Mounted"], - Hide: ["ItemBoots", "Shoes"] - }, - }, // b4 - ChainsTogether - { - AllowLock: true, - Property: { - Difficulty: 12, - SetPose: ["BaseLower"], - Block: ["ItemFeet", "ItemLegs"], - Effect: ["Prone", "Freeze", "BlockKneel", "Mounted"], - Hide: ["ItemBoots", "Shoes", "ItemFeet", "ItemLegs"], - }, - }, // b5 - Stocks - ], - }, - ], - }, - }, //WoodenRack - - }, // ItemDevices - ItemBoots: { - ToeTape: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Toes", - Property: { Type: null, Difficulty: 0 }, - }, - { - Name: "Full", - Property: { Type: "Full", Difficulty: 2 }, - }, - ], - Dialog: { - Load: "SelectTapeWrapping", - TypePrefix: "ToeTapePose", - ChatPrefix: "ToeTapeSet", - NpcPrefix: "", - }, - }, - }, // ToeTape - FuturisticHeels: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Shoes", - Property: { Type: null, HeightModifier: 6 }, - }, - { - Name: "Heel", - Property: { Type: "Heel", HeightModifier: 16 }, - }, - ], - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - }, - }, // FuturisticHeels - FuturisticHeels2: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { Name: "Shiny", Property: { Type: null } }, - { Name: "Matte", Property: { Type: "Matte" } }, - ], - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - }, - }, // FuturisticHeels2 - MonoHeel: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR, CommonChatTags.ASSET_NAME], - Options: [ - { - Name: "Full", - Property: { Type: null, Difficulty: 1 }, - }, - { - Name: "Half", - Property: { Type: "Half", Difficulty: 0 }, - }, - ], - }, - }, // MonoHeel - }, // ItemBoots - ItemVulva: { - ClitSuctionCup: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Loose", - Property: { - Type: null, - SuctionLevel: 0, - }, - }, - { - Name: "Light", - Property: { - Type: "Light", - SuctionLevel: 1, - }, - }, - { - Name: "Medium", - Property: { - Type: "Medium", - SuctionLevel: 2, - }, - }, - { - Name: "Heavy", - Property: { - Type: "Heavy", - SuctionLevel: 3, - }, - }, - { - Name: "Maximum", - Property: { - Type: "Maximum", - SuctionLevel: 4, - }, - }, - ], - Dialog: { - Load: "SelectSuctionLevel", - TypePrefix: "SuctionLevel", - ChatPrefix: ({ newIndex, previousIndex }) => `ClitSuc${(newIndex > previousIndex) ? "tightens" : "loosens"}To`, - NpcPrefix: "ItemVulvaClitSuctionCupNPCReaction" - }, - DrawImages: false, - }, - }, // ClitSuctionCup - DoubleEndDildo: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.DEST_CHAR_NAME, CommonChatTags.ASSET_NAME], - Options: [ - { - Name: "Normal", - Property: { - Type: null, - }, - }, - { - Name: "Large", - Property: { - Type: "Large", - }, - }, - ], - DrawImages: false, - }, - }, // DoubleEndDildo - VibratingDildo: { - Archetype: ExtendedArchetype.VIBRATING, - }, // VibratingDildo - ClitoralStimulator: { - Archetype: ExtendedArchetype.VIBRATING, - }, // ClitoralStimulator - VibratingEgg: { - Archetype: ExtendedArchetype.VIBRATING, - }, // VibratingEgg - VibratingLatexPanties: { - Archetype: ExtendedArchetype.VIBRATING, - }, // VibratingLatexPanties - WandBelt: { - Archetype: ExtendedArchetype.VIBRATING, - }, // WandBelt - FullLatexSuitWand: { - Archetype: ExtendedArchetype.VIBRATING, - }, // FullLatexSuitWand - HempRopeBelt: { - Archetype: ExtendedArchetype.VIBRATING, - }, // HempRopeBelt - WiredEgg: { - Archetype: ExtendedArchetype.VIBRATING, - }, // WiredEgg - Stitches: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options:[ - { - Name: "Straight", - Property: {Type: "Straight",} - }, - { - Name: "ZigZag", - Property: {Type: "ZigZag",} - }, - { - Name: "Skewed", - Property: {Type: "Skewed",} - }, - { - Name: "Cross", - Property: {Type: "Cross",} - }, - ], - }, - }, // Stitches - }, // ItemVulva - ItemVulvaPiercings: { - ClitRing: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Base", - Property: { - Type: "", - Effect: [], - }, - }, - { - Name: "Leash", - Prerequisite: ["NotSuspended"], - Property: { - Type: "Leash", - Effect: ["Leash", "Wiggling"], - }, - }, - ], - Dialog: { - Load: "SelectAttachmentState", - TypePrefix: "ClitRingPose", - ChatPrefix: "ClitRingRestrain", - }, - }, - }, // ClitRing - RoundClitPiercing: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Ring", - Property: { - Type: null, - Effect: [], - } - }, - { - Name: "Weight", - Property: { - Type: "Weight", - Effect: ["Wiggling"], - } - }, - { - Name: "Bell", - Property: { - Type: "Bell", - Effect: ["Wiggling"], - }, - }, - { - Name: "Chain", - Property: { - Type: "Chain", - Effect: ["Wiggling"], - Block: ["ItemNipplesPiercings"], - }, - Prerequisite: ["NeedsNippleRings"], - }, - { - Name: "HaremChain", - Property: { - Type: "HaremChain", - Effect: ["Wiggling"], - Block: ["ItemNipplesPiercings"], - }, - Prerequisite: ["NeedsNippleRings"], - }, - ], - }, - }, // RoundClitPiercings - }, // ItemVulvaPiercings - ItemButt: { - AnalHook: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Base", - Property: { - Type: null, - Difficulty: 0, - Intensity: 0, - Effect: ["IsPlugged"], - }, - }, - { - Name: "Chain", - Property: { - Type: "Chain", - Difficulty: 8, - Intensity: 1, - Effect: ["IsPlugged", "Freeze", "Egged"] - }, - Random: false, - }, - { - Name: "Hair", - Property: { - Type: "Hair", - Difficulty: 4, - Intensity: 1, - Effect: ["IsPlugged", "Egged"] - } - }, - ], - Dialog: { - Load: "SelectAttachmentState", - TypePrefix: "AnalHookPose", - ChatPrefix: "AnalHookRestrain", - NpcPrefix: "InventoryItemButtAnalHookNPCReaction", - }, - }, - }, // AnalHook - ButtPlugLock: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Base", - Property: { Type: null }, - }, - { - Name: "ChainShort", - Prerequisite: ["NotSuspended", "CanKneel", "NotMounted"], - Property: { - Type: "ChainShort", - Effect: ["Freeze", "ForceKneel", "IsChained"], - SetPose: ["Kneel"], - }, - Random: false, - }, - { - Name: "ChainLong", - Prerequisite: ["NotSuspended"], - Property: { - Type: "ChainLong", - Effect: ["Tethered", "IsChained"], - }, - Random: false, - }, - ], - Dialog: { - Load: "SelectAttachmentState", - TypePrefix: "ButtPlugLockPose", - ChatPrefix: "ButtPlugLockRestrain", - NpcPrefix: "ButtPlugLockSet", - }, - }, - }, // ButtPlugLock - ButtPump: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Empty", - Property: { - Type: null, - InflateLevel: 0, - }, - }, - { - Name: "Light", - Property: { - Type: "Light", - InflateLevel: 1, - }, - }, - { - Name: "Inflated", - Property: { - Type: "Inflated", - InflateLevel: 2, - }, - }, - { - Name: "Bloated", - Property: { - Type: "Bloated", - InflateLevel: 3, - }, - }, - { - Name: "Maximum", - Property: { - Type: "Maximum", - InflateLevel: 4, - }, - }, - ], - Dialog: { - Load: "SelectInflateLevel", - TypePrefix: "InflateLevel", - ChatPrefix: ({ newIndex, previousIndex }) => `BPumps${(newIndex > previousIndex) ? "pumps" : "deflates"}To`, - NpcPrefix: "InventoryItemButtButtPumpNPCReaction", - }, - DrawImages: false, - }, - }, // ButtPump - }, // ItemButt - ItemNipplesPiercings: { - RoundPiercing: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Base", - BondageLevel: 0, - Prerequisite: ["AccessBreast", "AccessBreastSuitZip"], - Property: { - Type: null, - Difficulty: 0, - }, - }, - { - Name: "Chain", - BondageLevel: 0, - Prerequisite: ["AccessBreast", "AccessBreastSuitZip", "Collared"], - Property: { - Type: "Chain", - Difficulty: 0, - Block: ["ItemNeck"], - AllowActivityOn: ["ItemNeck"] - }, - }, - { - Name: "Weighted", - BondageLevel: 0, - Prerequisite: ["AccessBreast", "AccessBreastSuitZip"], - Property: { - Type: "Weighted", - Difficulty: 0, - Effect: ["Wiggling"], - }, - }, - { - Name: "WeightedChain", - BondageLevel: 0, - Prerequisite: ["AccessBreast", "AccessBreastSuitZip", "Collared"], - Property: { - Type: "WeightedChain", - Difficulty: 0, - Block: ["ItemNeck"], - AllowActivityOn: ["ItemNeck"], - Effect: ["Wiggling"], - }, - }, - ], - Dialog: { - Load: "SelectPiercingState", - TypePrefix: "RoundPiercingPose", - ChatPrefix: "RoundPiercingRestrain", - NpcPrefix: "RoundPiercingNPCReaction", - }, - }, - }, // RoundPiercing - }, // ItemNipplesPiercings - ItemNipples: { - ChainClamp: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Chain", - Property: { - Type: null - }, - }, - { - Name: "Chain2", - Property: { - Type: "Chain2" - }, - } - ], - Dialog: { - Load: "SelectChainType", - TypePrefix: "ChainClapNipples", - ChatPrefix: "ChainClampSet", - NpcPrefix: "ItemNipplesChainClamp", - }, - }, - }, //ChainClamp - LactationPump: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Off", - Property: { - Type: null, - SuctionLevel: 0, - }, - }, - { - Name: "LowSuction", - Property: { - Type: "LowSuction", - SuctionLevel: 1, - }, - }, - { - Name: "MediumSuction", - Property: { - Type: "MediumSuction", - SuctionLevel: 2, - }, - }, - { - Name: "HighSuction", - Property: { - Type: "HighSuction", - SuctionLevel: 3, - }, - }, - { - Name: "MaximumSuction", - Property: { - Type: "MaximumSuction", - SuctionLevel: 4, - }, - }, - ], - Dialog: { - Load: "LactationPumpSelectSetting", - TypePrefix: "LactationPump", - ChatPrefix: ({ newIndex, previousIndex }) => `LactationPumpPower${(newIndex > previousIndex) ? "tightens" : "loosens"}To`, - }, - DrawImages: false, - }, - }, // LactationPump - NippleSuctionCups: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Loose", - Property: { - Type: null, - SuctionLevel: 0, - }, - }, - { - Name: "Light", - Property: { - Type: "Light", - SuctionLevel: 1, - }, - }, - { - Name: "Medium", - Property: { - Type: "Medium", - SuctionLevel: 2, - }, - }, - { - Name: "Heavy", - Property: { - Type: "Heavy", - SuctionLevel: 3, - }, - }, - { - Name: "Maximum", - Property: { - Type: "Maximum", - SuctionLevel: 4, - }, - }, - ], - Dialog: { - Load: "SelectSuctionLevel", - TypePrefix: "SuctionLevel", - ChatPrefix: ({ newIndex, previousIndex }) => `NipSuc${(newIndex > previousIndex) ? "tightens" : "loosens"}To`, - }, - DrawImages: false, - }, - }, // NippleSuctionCups - PlateClamps: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Loose", - Property: { - Type: null - }, - }, - { - Name: "Tight", - Property: { - Type: "Tight" - }, - } - ], - Dialog: { - Load: "ItemNipplesPlateClampsSelectTightness", - TypePrefix: "ItemNipplesPlateClampsTightnessLevel", - ChatPrefix: "ItemNipplesPlateClamps", - }, - DrawImages: false, - }, - }, // PlateClamps - }, // ItemNipples - Corset: { - LatexCorset1: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Garter", - Property: { Type: null }, - }, - { - Name: "NoGarter", - Property: { Type: "Garterless" }, - }, - ], - Dialog: { - Load: "LatexCorset1Select", - TypePrefix: "LatexCorset1", - ChatPrefix: "LatexCorset1Set", - }, - }, - }, // LatexCorset1 - }, // Corset - ItemTorso: { - HeavyLatexCorset: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Normal", - Property: { Type: null }, - }, - { - Name: "Straps", - Property: { Type: "Straps" }, - }, - ], - Dialog: { - Load: "SelectHeavyLatexCorsetType", - TypePrefix: "HeavyLatexCorsetType", - ChatPrefix: "HeavyLatexCorsetSet", - NpcPrefix: "HeavyLatexCorset", - }, - } - }, // HeavyLatexCorset - Ribbons: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Basic", - Property: { Type: null, Difficulty: 1 } - }, { - Name: "Harness1", - BondageLevel: 2, - Property: { Type: "Harness1" , Difficulty: 3 , Effect: ["CrotchRope"]} - }, { - Name: "Harness2", - BondageLevel: 3, - Property: { Type: "Harness2" , Difficulty: 4, Effect: ["CrotchRope"] } - } - ], - Dialog: { - Load: "SelectRibbonType", - TypePrefix: "RibbonsTorso", - ChatPrefix: "TorsoRibbonsSet", - NpcPrefix: "ItemTorsoRibbons", - }, - } - }, // Ribbons - HighSecurityHarness: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "LowSec", - Property: { Type: null } - }, { - Name: "MedSec", - Property: { Type: "h2" , Difficulty: 5 , Effect: ["CrotchRope"]} - }, { - Name: "MedSecBreast", - Property: { Type: "h3" , Difficulty: 5 } - }, { - Name: "MaxSec", - Property: { Type: "h4" , Difficulty: 10, Effect: ["CrotchRope"] } - } - ], - Dialog: { - Load: "HighSecurityHarnessType", - TypePrefix: "HighSecurityHarnessType", - ChatPrefix: "HighSecurityHarnessSet", - }, - } - }, // HighSecurityHarness - LatexCorset1: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "Corset", AssetName: "LatexCorset1" }, - }, //LatexCorset1 - SilkStraps: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { Name: "Crotch", Property: { Type: null } }, - { Name: "Waist", Property: { Type: "Waist" } }, - { Name: "Harness", Property: { Type: "Harness" } }, - { Name: "Star", Property: { Type: "Star" } }, - { Name: "Diamond", Property: { Type: "Diamond" } }, - ] - }, - }, // SilkStraps - ThinLeatherStraps: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { Name: "Crotch", Property: { Type: null } }, - { Name: "Waist", Property: { Type: "Waist" } }, - { Name: "Harness", Property: { Type: "Harness" } }, - ] - }, - }, // ThinLeatherStraps - NylonRopeHarness: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "HempRopeHarness" } - }, // NylonRopeHarness - HempRopeHarness: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Crotch", - Property: { Type: null, Difficulty: 1, Effect: ["CrotchRope"] } - }, { - Name: "Waist", - Property: { Type: "Waist", Difficulty: 1 } - }, { - Name: "Harness", - BondageLevel: 2, - Property: { Type: "Harness", Difficulty: 1, Effect: ["CrotchRope"] } - }, { - Name: "Star", - BondageLevel: 3, - Property: { Type: "Star", Difficulty: 2 } - }, { - Name: "Diamond", - BondageLevel: 4, - Property: { Type: "Diamond", Difficulty: 3, Effect: ["CrotchRope"] } - }, - ], - Dialog: { - Load: "SelectRopeBondage", - TypePrefix: "RopeBondage", - ChatPrefix: "RopeHarnessSet", - NpcPrefix: "RopeBondage", - }, - }, - }, // HempRopeHarness - LockingSwimsuit: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Shiny", - Property: {Type: null } - }, - { - Name: "Dull", - Property: {Type: "Dull" } - } - ], - }, - }, //LockingSwimsuit - }, // ItemTorso - ItemTorso2: { - LockingSwimsuit: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemTorso", AssetName: "LockingSwimsuit" }, - }, // LockingSwimsuit - NylonRopeHarness: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemTorso", AssetName: "HempRopeHarness" }, - }, // NylonRopeHarness - HempRopeHarness: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemTorso", AssetName: "HempRopeHarness" }, - }, // HempRopeHarness - HighSecurityHarness: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemTorso", AssetName: "HighSecurityHarness"}, - }, // HighSecurityHarness - LatexCorset1: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "Corset", AssetName: "LatexCorset1" }, - }, // LatexCorset1 - HeavyLatexCorset: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemTorso", AssetName: "HeavyLatexCorset" }, - }, // HeavyLatexCorset - Ribbons: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemTorso", AssetName: "Ribbons" }, - }, // Ribbons - SilkStraps: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemTorso", AssetName: "SilkStraps" }, - }, // SilkStraps - ThinLeatherStraps: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemTorso", AssetName: "ThinLeatherStraps" }, - }, // ThinLeatherStraps - }, //ItemTorso2 - Shoes: { - FuturisticHeels2: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { Name: "Shiny", Property: { Type: null } }, - { Name: "Matte", Property: { Type: "Matte" } }, - ] - }, - }, // FuturisticHeels2 - }, // Shoes - HairAccessory1: { - ElfEars: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "InFront", - Property: { Type: null }, - }, - { - Name: "Behind", - Property: { Type: "Behind", OverridePriority: 51 }, - }, - ], - Dialog: { - Load: "HairAccessory1ElfEarsSelect", - TypePrefix: "HairAccessory1ElfEars", - }, - } - } // ElfEars - }, // HairAccessory1 - HairAccessory2: { - ElfEars: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "HairAccessory1", AssetName: "ElfEars" }, - }, - }, // HairAccessory2 - ItemMouth: { - ClothGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Small", - Property: { - Type: null, - Effect: ["BlockMouth", "GagVeryLight"], - }, - }, - { - Name: "Cleave", - Property: { - Type: "Cleave", - Effect: ["BlockMouth", "GagLight"], - }, - }, - { - Name: "Knotted", - Property: { - Type: "Knotted", - Effect: ["BlockMouth", "GagLight"], - }, - }, - { - Name: "OTM", - Property: { - Type: "OTM", - Effect: ["BlockMouth", "GagLight"], - }, - }, - { - Name: "OTN", - Property: { - Type: "OTN", - Effect: ["BlockMouth", "GagLight"], - }, - }, - ], - Dialog: { - Load: "SelectGagType", - TypePrefix: "ClothGagType", - ChatPrefix: "ClothGagSet", - }, - }, - }, // ClothGag - ScarfGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Loose", - Property: { - Type: null, - Effect: ["BlockMouth", "GagVeryLight"], - }, - }, - { - Name: "OTN", - Property: { - Type: "OTN", - Effect: ["BlockMouth", "GagLight"], - }, - }, - ], - Dialog: { - Load: "SelectGagType", - TypePrefix: "ScarfGagType", - ChatPrefix: "ScarfGagSet", - }, - } - }, // ScarfGag - WiffleGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Normal", - Property: { - Type: null, - Effect: ["BlockMouth", "GagNormal"], - }, - }, - { - Name: "Tight", - Property: { - Type: "Tight", - Effect: ["BlockMouth", "GagNormal"], - }, - }, - ], - Dialog: { - Load: "SelectGagType", - TypePrefix: "BallGagMouthType", - ChatPrefix: "BallGagMouthSet", - }, - }, - }, // WiffleGag - BallGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Normal", - Property: { - Type: null, - Effect: ["BlockMouth", "GagMedium"], - }, - }, - { - Name: "Shiny", - Property: { - Type: "Shiny", - Effect: ["BlockMouth", "GagMedium"], - }, - }, - { - Name: "Tight", - Property: { - Type: "Tight", - Effect: ["BlockMouth", "GagMedium"], - }, - }, - ], - Dialog: { - Load: "SelectGagType", - TypePrefix: "BallGagMouthType", - ChatPrefix: "BallGagMouthSet", - }, - }, - }, // BallGag - RopeBallGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Normal", - Property: { - Type: null, - Effect: ["BlockMouth", "GagEasy"], - }, - }, - { - Name: "Tight", - Property: { - Type: "Tight", - Effect: ["BlockMouth", "GagNormal"], - }, - }, - ], - Dialog: { - Load: "SelectGagType", - TypePrefix: "BallGagMouthType", - ChatPrefix: "BallGagMouthSet", - }, - }, - }, // RopeBallGag - HarnessBallGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "BallGag" }, - }, - DuctTape: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Small", - Property: { - Type: null, - Effect: ["BlockMouth", "GagVeryLight"], - }, - }, - { - Name: "Crossed", - Property: { - Type: "Crossed", - Effect: ["BlockMouth", "GagLight"], - }, - }, - { - Name: "Full", - Property: { - Type: "Full", - Effect: ["BlockMouth", "GagEasy"], - }, - }, - { - Name: "Double", - Property: { - Type: "Double", - Effect: ["BlockMouth", "GagNormal"], - }, - }, - { - Name: "Cover", - Property: { - Type: "Cover", - Effect: ["BlockMouth", "GagMedium"], - }, - }, - ], - Dialog: { - Load: "SelectGagType", - TypePrefix: "DuctTapeMouthType", - ChatPrefix: "DuctTapeMouthSet", - }, - }, - }, // DuctTape - CupholderGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "NoCup", - Property: { - Type: null, - Effect: ["BlockMouth", "GagEasy"], - }, - }, - { - Name: "Tip", - Property: { - Type: null, - Effect: ["BlockMouth", "GagEasy"], - }, - }, - { - Name: "Cup", - Property: { - Type: "Cup", - Effect: ["BlockMouth", "GagEasy"], - }, - }, - ], - Dialog: { - Load: "CupholderGagOptions", - TypePrefix: "CupholderGagOptions", - ChatPrefix: "CupholderGagSet", - }, - DrawImages: false, - }, - }, // CupholderGag - PumpGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Empty", - Property: { - Type: null, - InflateLevel: 0, - Difficulty: 0, - Effect: ["BlockMouth"], - }, - }, - { - Name: "Light", - Property: { - Type: "Light", - InflateLevel: 1, - Difficulty: 2, - Effect: ["BlockMouth", "GagLight"], - }, - }, - { - Name: "Inflated", - Property: { - Type: "Inflated", - InflateLevel: 2, - Difficulty: 4, - Effect: ["BlockMouth", "GagEasy"], - }, - }, - { - Name: "Bloated", - Property: { - Type: "Bloated", - InflateLevel: 3, - Difficulty: 6, - Effect: ["BlockMouth", "GagMedium"], - }, - }, - { - Name: "Maximum", - Property: { - Type: "Maximum", - InflateLevel: 4, - Difficulty: 8, - Effect: ["BlockMouth", "GagVeryHeavy"], - }, - }, - ], - Dialog: { - Load: "SelectInflateLevel", - TypePrefix: "InflateLevel", - ChatPrefix: ({ previousIndex, newIndex }) => - `PumpGag${newIndex > previousIndex ? "pumps" : "deflates"}To`, - }, - DrawImages: false, - }, - }, // PumpGag - PlugGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Open", - Property: { - Type: null, - }, - }, - { - Name: "Plug", - Property: { - Type: "Plug", - Effect: ["BlockMouth", "GagTotal"], - OverrideAssetEffect: true, - }, - }, - ], - Dialog: { - Load: "SelectGagType", - TypePrefix: "PlugGagMouthType", - ChatPrefix: "PlugGagMouthSet", - }, - }, - }, // PlugGag - DildoPlugGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Open", - Property: { - Type: null, - }, - }, - { - Name: "Plug", - Property: { - Type: "Plug", - Effect: ["BlockMouth", "GagTotal2"], - OverrideAssetEffect: true, - }, - }, - ], - Dialog: { - Load: "SelectGagType", - TypePrefix: "PlugGagMouthType", - ChatPrefix: "DildoPlugGagMouthSet", - }, - }, - }, // DildoPlugGag - MilkBottle: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Rest", - Property: { Type: null }, - }, - { - Name: "Raised", - Property: { Type: "Raised" }, - }, - { - Name: "Chug", - Property: { Type: "Chug" }, - }, - ], - Dialog: { - Load: "SelectMilkBottleState", - TypePrefix: "MilkBottle", - ChatPrefix: "MilkBottleSet", - }, - }, - }, // MilkBottle - FunnelGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "None", - Property: { - Type: null, - }, - }, - { - Name: "Funnel", - Property: { - Type: "Funnel", - Effect: ["BlockMouth", "GagMedium", "ProtrudingMouth"], - OverrideAssetEffect: true, - }, - }, - ], - Dialog: { - Load: "SelectGagType", - TypePrefix: "FunnelGagMouthType", - ChatPrefix: "FunnelGagMouthSet", - }, - }, - }, // FunnelGag - HarnessPonyBits: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Attached", - Property: { - Type: null - }, - }, - { - Name: "Detached", - Property: { - Type: "Detached", - Effect: ["OpenMouth"], - OverrideAssetEffect: true - }, - }, - ], - Dialog: { - Load: "ItemMouthHarnessPonyBitsSelect", - TypePrefix: "ItemMouthHarnessPonyBits", - ChatPrefix: "ItemMouthHarnessPonyBitsSet", - NpcPrefix: "ItemMouthHarnessPonyBits", - } - }, - }, // PonyBit - DentalGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Open", - Property: { - Type: null, - }, - }, - { - Name: "Closed", - Property: { - Type: "Closed", - Effect: ["BlockMouth", "GagMedium"], - OverrideAssetEffect: true - }, - }, - ], - ChangeWhenLocked: false, - }, - }, // DentalGag - Ribbons: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Basic", - Property: { - Type: null, - Effect: ["BlockMouth", "GagVeryLight"], - }, - }, - { - Name: "Bow", - Property: { - Type: "Bow", - Effect: ["BlockMouth", "GagLight"], - }, - }, - ], - Dialog: { - Load: "SelectRibbonType", - TypePrefix: "RibbonType", - ChatPrefix: "RibbonsGagSet", - }, - }, - }, // Ribbons - FuturisticMuzzle: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Nose", Key: "n", - Options: [ - {}, // n0 - No nose - { // n1 - OTN - Property: { - Difficulty: 1, - }, - }, - ], - }, - { - Name: "Harness", Key: "h", - Options: [ - {}, // h0 - No straps - { // h1 - Harness straps - Property: { - Difficulty: 1, - }, - }, - ], - }, - { - Name: "Symbol", Key: "s", - Options: [ - {}, // s0 - Nothing - {}, // s1 - Lock symbol - {}, // s2 - Mute symbol - {}, // s3 - X symbol - ], - }, - ], - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - } - }, - }, // FuturisticMuzzle - OTNPlugGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Open", - Property: { - Type: null, - }, - }, - { - Name: "Plug", - Property: { - Type: "Plug", - Effect: ["BlockMouth", "GagTotal"], - OverrideAssetEffect: true, - }, - }, - ], - Dialog: { - Load: "SelectGagType", - TypePrefix: "PlugGagMouthType", - ChatPrefix: "PlugGagMouthSet", - }, - }, - }, // OTNPlugGag - PonyGag: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR, CommonChatTags.DEST_CHAR], - Modules:[ - { - Name: "Gag", Key: "g", - Options:[ - { Property: { Effect: ["BlockMouth", "GagLight"] },}, //g0 - Regular BitGag - { Property: {},}, //g1 - No Gag - { Property: { Effect: ["BlockMouth", "GagMedium"] },}, //g2 - Thick BitGag - { Property: { Effect: ["BlockMouth", "GagHeavy"] },}, //g3 - Tongue Depresor - { Property: { Effect: ["BlockMouth", "GagMedium"] },}, //g4 - Ballgag - { Property: { Effect: ["BlockMouth", "GagVeryHeavy"], Hide: ["Mouth"] },}, //g5 - DildoGag - ], - }, - { - Name: "Panel", Key: "p", - Options:[ - {}, //None - {}, //p1 - Panel - {}, //p2 - PanelShield - {}, //p3 - PanelHex - {}, //p4 - PanelSun - {}, //p5 - PanelMoon - {}, //p6 - PanelHeart - {}, //p7 - PanelHorse - {}, //p8 - PanelTriskel - {}, //p9 - PanelPentacle - ], - }, - { - Name: "Reins", Key: "r", - Options:[ - {}, //r0 - None - { Property: { Effect: ["Leash"] },}, //r1 - Reins - { Property: { Effect: ["Leash"] },}, //r2 - Rope - { Property: { Effect: ["Tethered", "IsChained"], Block: ["ItemAddon", "ItemDevices"] }}, //r3 - Pole - ], - }, - { - Name: "Top", Key: "t", - Options:[ - {}, //t0 - None - {}, //t1 - Plume - {Property: { Hide: ["HairFront"]},}, //t2 - Mane Left - {Property: { Hide: ["HairFront"]},}, //t3 - Mane Right - {Property: { Hide: ["HairFront"]},}, //t4 - Mohawk - ], - }, - { - Name: "Extra", Key: "e", - Options:[ - {}, //e0 - None - { Property: {Difficulty: 7}}, //e1 - ExtraStraps - {}, //e2 - Flags - ], - }, - { - Name: "Horn", Key: "h", - Options:[ - {}, //h0 - None - { Property: { AllowActivity: ["PenetrateItem"]},}, //h1 - Horn - { Property: { AllowActivity: ["PenetrateItem"]},}, //h2 - Dildocorn - ], - }, - { - Name: "Blinders", Key: "b", - Options:[ - {}, //b0 - None - {}, //b1 - Blinders - ], - }, - ], - ChangeWhenLocked: false, - Dialog: { - Select: "ItemMouthPonyGagSelect", - ModulePrefix:"ItemMouthPonyGagModule", - OptionPrefix: "ItemMouthPonyGagOption", - ChatPrefix: "ItemMouthPonyGagSet", - }, - }, - }, // PonyGag - LatexSheathGag: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Thin", - Property: { Type: null, Effect: ["OpenMouth",], }, - }, - { - Name: "Thick", - Property: { Type: "Thick", Effect: ["OpenMouth", "GagVeryLight"],}, - }, - { - Name: "VeryThick", - Property: { Type: "VeryThick", Effect: ["OpenMouth", "GagMedium"],}, - }, - ], - DrawImages: false, - }, - }, //LatexSheathGag - }, // ItemMouth - ItemMouth2: { - ClothGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "ClothGag" }, - }, - ScarfGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "ScarfGag" }, - }, - WiffleGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "WiffleGag" }, - }, - BallGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "BallGag" }, - }, - RopeBallGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "RopeBallGag" }, - }, - HarnessBallGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "BallGag" }, - }, - HarnessPonyBits: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "HarnessPonyBits" }, - }, - DuctTape: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "DuctTape" }, - }, - CupholderGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "CupholderGag" }, - }, - Ribbons: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "Ribbons" }, - }, - FuturisticMuzzle: { - Archetype: ExtendedArchetype.MODULAR, - CopyConfig: { GroupName: "ItemMouth", AssetName: "FuturisticMuzzle" }, - }, - PonyGag: { - Archetype: ExtendedArchetype.MODULAR, - CopyConfig: { GroupName: "ItemMouth", AssetName: "PonyGag" }, - }, - }, // ItemMouth2 - ItemMouth3: { - ClothGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "ClothGag" }, - }, - ScarfGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "ScarfGag" }, - }, - WiffleGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "WiffleGag" }, - }, - BallGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "BallGag" }, - }, - RopeBallGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "RopeBallGag" }, - }, - HarnessBallGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "BallGag" }, - }, - HarnessPonyBits: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "HarnessPonyBits" }, - }, - DuctTape: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "DuctTape" }, - }, - CupholderGag: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "CupholderGag" }, - }, - Ribbons: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemMouth", AssetName: "Ribbons" }, - }, - FuturisticMuzzle: { - Archetype: ExtendedArchetype.MODULAR, - CopyConfig: { GroupName: "ItemMouth", AssetName: "FuturisticMuzzle" }, - }, - PonyGag: { - Archetype: ExtendedArchetype.MODULAR, - CopyConfig: { GroupName: "ItemMouth", AssetName: "PonyGag" }, - }, - Stitches: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options:[ - { - Name: "Straight", - Property: {Type: "Straight",} - }, - { - Name: "ZigZag", - Property: {Type: "ZigZag",} - }, - { - Name: "Skewed", - Property: {Type: "Skewed",} - }, - { - Name: "Cross", - Property: {Type: "Cross",} - }, - ], - }, - }, //StitchGag - }, // ItemMouth3 - Mask: { - BunnyMask1: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Ears", - Property: { Type: null }, - }, - { - Name: "Earless", - Property: { Type: "Earless", OverridePriority: 51 }, - }, - ], - Dialog: { - Load: "SelectBunnyMaskStyle", - TypePrefix: "BunnyMaskType", - }, - } - }, // BunnyMask1 - OpenFaceHood: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "HideBackHair", - Property: { Type: "HideBackHair", Hide: ["HairBack"] }, - }, - { - Name: "ShowBackHair", - Property: { Type: null }, - }, - ], - Dialog: { - Load: "SelectOpenFaceHoodStyle", - TypePrefix: "OpenFaceHoodStyle", - }, - DrawImages: false, - } - }, // OpenFaceHood - PetNose: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { Name: "Nose", Key: "n", - Options: [ - {}, // n0 - Nose - {}, // n1 - No Nose - ] - }, - { Name: "Cheeks", Key: "c", - Options: [ - {}, // c0 - No Cheeks - {}, // c1 - Small Cheeks - {}, // c2 - Big Cheeks - ] - }, - { Name: "Whiskers", Key: "w", - Options: [ - {}, // w0 - No Whiskers - {}, // w1 - Short Whiskers - {}, // w2 - Long Whiskers - ] - }, - { Name: "Mouth", Key: "m", - Options: [ - {}, // m0 - Show Mouth - { Property: { Hide: ["Mouth"] } }, // m1 - Hide Mouth - ] - }, - ], - }, - }, //PetNose - Glitter: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options:[ - { - Name: "Freckles", - Property: {Type: null,} - }, - { - Name: "MidFreckles", - Property: {Type: "MidFreckles",} - }, - { - Name: "SplitFreckles", - Property: {Type: "SplitFreckles",} - }, - { - Name: "FrecklesSmall", - Property: {Type: "FrecklesSmall",} - }, - { - Name: "MidFrecklesSmall", - Property: {Type: "MidFrecklesSmall",} - }, - { - Name: "SplitFrecklesSmall", - Property: {Type: "SplitFrecklesSmall",} - }, - { - Name: "StarsBoth", - Property: {Type: "StarsBoth",} - }, - { - Name: "StarsLeft", - Property: {Type: "StarsLeft",} - }, - { - Name: "StarsRight", - Property: {Type: "StarsRight",} - }, - { - Name: "DotsBoth", - Property: {Type: "DotsBoth",} - }, - { - Name: "DotsLeft", - Property: {Type: "DotsLeft",} - }, - { - Name: "DotsRight", - Property: {Type: "DotsRight",} - }, - ], - }, - }, //Glitter - HeadHarness: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options:[ - { - Name: "Simple", - Property: {Type: null,} - }, - { - Name: "Heavy", - Property: {Type: "Heavy",} - - }, - ], - }, - }, //HeadHarness - }, // Mask - ItemLegs: { - DuctTape: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Legs", - Property: { Type: null, Difficulty: 0 } - }, { - Name: "HalfLegs", - Prerequisite: ["NoClothLower"], - Property: { Type: "HalfLegs", Hide: ["ClothLower", "Garters"], Difficulty: 2 } - }, { - Name: "MostLegs", - Prerequisite: ["NoClothLower"], - Property: { Type: "MostLegs", Hide: ["ClothLower", "Garters"], Difficulty: 4, HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], } - }, { - Name: "CompleteLegs", - Prerequisite: ["NoClothLower"], - Property: { Type: "CompleteLegs", Hide: ["ClothLower", "Garters"], Block: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Difficulty: 6, HideItem: ["PantiesPoofyDiaper", "PantiesBulkyDiaper", "ItemPelvisPoofyDiaper", "ItemPelvisBulkyDiaper"], } - }, { - Name: "PetLegs", - Prerequisite: ["NoClothLower", "NotSuspended", "CanKneel"], - Property: { Type: "PetLegs", Hide: ["ClothLower", "Garters"], SetPose: ["Kneel"], Block: ["ItemFeet"], Effect: ["ForceKneel"], Difficulty: 6 }, - Random: false, - }, { - Name: "CutOut", - Prerequisite: ["NoClothLower", "Garters"], - Property: { Type: "CutOut", Hide: ["ClothLower"], Difficulty: 6 } - } - ], - Dialog: { - Load: "SelectTapeWrapping", - TypePrefix: "DuctTapePose", - ChatPrefix: "DuctTapeRestrain", - NpcPrefix: "DuctTapePose", - }, - }, - }, // DuctTape - NylonRope: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Knees", - Property: { Type: null, SetPose: ["LegsClosed"], Difficulty: 1 }, - Prerequisite: ["CanCloseLegs"], - }, - { - Name: "Thighs", - Property: { Type: "Thighs", SetPose: ["LegsClosed"], Difficulty: 1 }, - Prerequisite: ["CanCloseLegs"], - }, - { - Name: "KneesThighs", - Property: { Type: "KneesThighs", SetPose: ["LegsClosed"], Difficulty: 2 }, - Prerequisite: ["CanCloseLegs"], - }, - { - Name: "Frogtie", - BondageLevel: 3, - Property: { Type: "Frogtie", SetPose: ["Kneel"], AllowActivePose: ["Kneel", "KneelingSpread"], Block: ["ItemFeet"], Effect: ["ForceKneel"], Difficulty: 3 }, - Prerequisite: ["NotSuspended", "CanKneel"], - Random: false, - }, - ], - Dialog: { - Load: "SelectRopeBondage", - TypePrefix: "RopeBondage", - ChatPrefix: "LegRopeSet", - NpcPrefix: "RopeBondage", - }, - } - }, // NylonRope - HempRope: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Basic", - Property: { Type: null, SetPose: ["LegsClosed"], Difficulty: 1 }, - Prerequisite: ["CanCloseLegs"], - }, { - Name: "FullBinding", - BondageLevel: 2, - Property: { Type: "FullBinding", SetPose: ["LegsClosed"], Difficulty: 2 }, - Prerequisite: ["CanCloseLegs"], - }, { - Name: "Link", - BondageLevel: 2, - Property: { Type: "Link", SetPose: ["LegsClosed"], Difficulty: 2 }, - Prerequisite: ["CanCloseLegs"], - }, { - Name: "Frogtie", - BondageLevel: 3, - Property: { Type: "Frogtie", SetPose: ["Kneel"], AllowActivePose: ["Kneel", "KneelingSpread"], Block: ["ItemFeet"], Effect: ["ForceKneel"], Difficulty: 3 }, - Prerequisite: ["NotSuspended", "CanKneel"], - Random: false, - }, { - Name: "Crossed", - BondageLevel: 4, - Property: { Type: "Crossed", SetPose: ["LegsClosed"], Difficulty: 4 }, - Prerequisite: ["CanCloseLegs"], - }, { - Name: "Mermaid", - BondageLevel: 4, - Property: { Type: "Mermaid", SetPose: ["LegsClosed"], Difficulty: 4 }, - Prerequisite: ["CanCloseLegs"], - } - ], - Dialog: { - Load: "SelectRopeBondage", - TypePrefix: "RopeBondage", - ChatPrefix: "LegRopeSet", - NpcPrefix: "RopeBondage", - }, - } - }, // HempRope - Chains: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Basic", - BondageLevel: 0, - Property: { Type: null, Difficulty: 0 } - }, { - Name: "Strict", - BondageLevel: 2, - Property: { Type: "Strict", Difficulty: 2 } - } - ], - Dialog: { - Load: "SelectChainBondage", - TypePrefix: "ChainBondage", - ChatPrefix: "LegChainSet", - NpcPrefix: "ChainBondage", - }, - ChangeWhenLocked: false, - } - }, // Chains - SturdyLeatherBelts: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemArms", AssetName: "SturdyLeatherBelts" }, - Config: { - Options: [ - { - Name: "One", - Property: { Type: null, }, - }, - { - Name: "Two", - Property: { Type: "Two", Difficulty: 2, }, - }, - ], - } - }, // SturdyLeatherBelts - FuturisticLegCuffs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "None", - Property: { Type: null }, - }, - { - Name: "Closed", - Property: { - Type: "Closed", - SetPose: ["LegsClosed"], - Effect: ["Prone", "KneelFreeze", "Slow"], - FreezeActivePose: ["BodyLower"], - Difficulty: 6, - }, - Prerequisite: ["CanCloseLegs"], - }, - { - Name: "Chained", - Property: { - Type: "Chained", Effect: ["Slow"], - }, - Prerequisite: ["NotHorse"], - } - ], - Dialog: { - Load: "SelectBondagePosition", - TypePrefix: "ItemLegsLeatherLegCuffs", - ChatPrefix: "FuturisticLegCuffsRestrain", - }, - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - } - }, // FuturisticLegCuffs - LeatherLegCuffs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "None", - Property: { Type: null }, - }, - { - Name: "Closed", - Property: { - Type: "Closed", - SetPose: ["LegsClosed"], - Effect: ["Prone", "KneelFreeze", "Slow"], - AllowActivePose: ["Kneel", "LegsClosed"], - Difficulty: 6, - }, - Prerequisite: ["CanCloseLegs"], - }, - { - Name: "Chained", - Property: { - Type: "Chained", Effect: ["Slow"], - }, - Prerequisite: ["NotHorse"], - } - ], - Dialog: { - Load: "SelectBondagePosition", - } - } - }, // LeatherLegCuffs - Ribbons: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Messystyle", - Property: { Type: null, Difficulty: 3 }, - }, - { - Name: "MessyWrap", - Property: { Type: "MessyWrap", Difficulty: 4 }, - }, - { - Name: "Cross", - Property: { Type: "Cross", Difficulty: 5 }, - }, - ], - Dialog: { - Load: "SelectRibbonType", - } - } - }, // Ribbons - OrnateLegCuffs: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "LeatherLegCuffs" }, - }, // OrnateLegCuffs - Zipties: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "ZipLegLight", - Property: { Type: null, SetPose: ["LegsClosed"], Difficulty: 1 } - }, { - Name: "ZipLegMedium", - Property: { Type: "ZipLegMedium", SetPose: ["LegsClosed"], Difficulty: 2 } - }, { - Name: "ZipLegFull", - Property: { Type: "ZipLegFull", SetPose: ["LegsClosed"], Difficulty: 2 } - }, { - Name: "ZipFrogtie", - Property: { Type: "ZipFrogtie", SetPose: ["Kneel"], Block: ["ItemFeet"], Effect: ["ForceKneel"], Difficulty: 3 }, - Prerequisite: ["NotSuspended", "CanKneel"], - Random: false, - } - ], - Dialog: { - Load: "SelectZipTie", - TypePrefix: "ZipBondage", - NpcPrefix: "Zip", - } - } - }, // Zipties - }, // ItemLegs - ItemFeet: { - SpreaderMetal: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Narrow", - Property: { - Type: null, Effect: ["Prone", "Freeze"], SetPose: ["LegsOpen"], - } - }, - { - Name: "Wide", - Property: { - Type: "Wide", Effect: ["Prone", "Freeze"], SetPose: ["Spread"], - } - } - ], - Dialog: { - Load: "SelectSpreaderType", - TypePrefix: "SpreaderMetalPose", - }, - ChatSetting: TypedItemChatSetting.SILENT, - } - }, // SpreaderMetal - Chains: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Basic", - BondageLevel: 0, - Property: { Type: null, Difficulty: 0, SetPose: ["LegsClosed"] }, - }, - { - Name: "Strict", - BondageLevel: 2, - Property: { Type: "Strict", Difficulty: 2, SetPose: ["LegsClosed"] }, - }, - { - Name: "Suspension", - BondageLevel: 6, - Prerequisite: ["NotKneeling", "NotMounted", "NotChained", "NotHogtied"], - Property: { - Type: "Suspension", - Difficulty: 4, - SetPose: ["Suspension", "LegsClosed"], - AllowActivePose: [], - }, - Random: false, - }, - ], - Dialog: { - Load: "SelectChainBondage", - TypePrefix: "ChainBondage", - ChatPrefix: "LegChainSet", - NpcPrefix: "ChainBondage", - }, - ChangeWhenLocked: false, - } - }, // Chains - FuturisticAnkleCuffs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR, CommonChatTags.ASSET_NAME], - Options: [ - { - Name: "None", - Property: { - Type: null, SetPose: [], Difficulty: 0, Effect: [], FreezeActivePose: [], - } - }, - { - Name: "Closed", - Property: { - Type: "Closed", Effect: ["Prone", "Freeze"], SetPose: ["LegsClosed"], Difficulty: 6, FreezeActivePose: ["BodyLower"], - } - }, - { - Name: "Chained", - Property: { - Type: "Chained", Effect: ["Slow"], - } - } - ], - Dialog: { - Load: "SelectBondagePosition", - TypePrefix: "ItemFeetSteelAnkleCuffs", - ChatPrefix: "FuturisticAnkleCuffsRestrain", - }, - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - } - }, // FuturisticAnkleCuffs - SteelAnkleCuffs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR, CommonChatTags.ASSET_NAME], - Options: [ - { - Name: "None", - Property: { - Type: null, SetPose: [], Difficulty: 0, Effect: [], FreezeActivePose: [], - } - }, - { - Name: "Closed", - Property: { - Type: "Closed", Effect: ["Prone", "Freeze"], SetPose: ["LegsClosed"], Difficulty: 6, FreezeActivePose: ["BodyLower"], - } - }, - { - Name: "Chained", - Property: { - Type: "Chained", Effect: ["Slow"], - } - } - ], - Dialog: { - Load: "SelectBondagePosition", - TypePrefix: "ItemFeetSteelAnkleCuffs", - ChatPrefix: "ItemFeetSteelAnkleCuffsSet", - } - } - }, // SteelAnkleCuffs - SturdyLeatherBelts: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "ItemArms", AssetName: "SturdyLeatherBelts" }, - }, // SturdyLeatherBelts - LeatherAnkleCuffs: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "SteelAnkleCuffs" }, - }, // LeatherAnkleCuffs - OrnateAnkleCuffs: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "SteelAnkleCuffs" }, - }, // OrnateAnkleCuffs - DuctTape: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Feet", - Property: { - Type: null, - Difficulty: 0, - Hide: [], - SetPose: ["LegsClosed"], - }, - }, - { - Name: "HalfFeet", - Property: { - Type: "HalfFeet", - Difficulty: 2, - Hide: ["ClothLower", "Shoes"], - SetPose: ["LegsClosed"], - }, - }, - { - Name: "MostFeet", - Property: { - Type: "MostFeet", - Difficulty: 4, - Hide: ["ClothLower", "Shoes"], - SetPose: ["LegsClosed"], - }, - }, - { - Name: "CompleteFeet", - Property: { - Type: "CompleteFeet", - Difficulty: 6, - Hide: ["ClothLower", "Shoes"], - SetPose: ["LegsClosed"], - }, - }, - ], - Dialog: { - Load: "SelectTapeWrapping", - ChatPrefix: "DuctTapeRestrain", - NpcPrefix: "DuctTapeRestrain", - TypePrefix: "DuctTapePose", - } - }, - }, // DuctTape - Zipties: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "ZipFeetLight", - Property: { Type: null, SetPose: ["LegsClosed"], Difficulty: 1 }, - }, { - Name: "ZipFeetMedium", - Property: { Type: "ZipFeetMedium", SetPose: ["LegsClosed"], Difficulty: 2 } - }, { - Name: "ZipFeetFull", - Property: { Type: "ZipFeetFull", SetPose: ["LegsClosed"], Difficulty: 2 } - } - ], - Dialog: { - Load: "SelectZipTie", - ChatPrefix: "ZipFeetSet", - NpcPrefix: "ZipFeetSet", - TypePrefix: "ZipBondage", - }, - }, - }, // Zipties - Tentacles: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Closed", - Property: {Type: null, SetPose: ["LegsClosed"]}, - }, - { - Name: "Spread", - Prerequisite: ["NoItemLegs", "LegsOpen"], - Property: { - Type: "Spread", - OverridePriority: 25, - SetPose: ["Spread"], - Effect: ["Freeze", "Prone", "BlockKneel"], - Block: ["ItemLegs", "ItemBoots", "ItemDevices"], - OverrideHeight: {Height: 0, Priority: 60}, - }, - }, - ], - }, - }, // Tentacles - WoodenCuffs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "LegsOpen", - Property: { - Type: null, - Difficulty: 2, - Effect: ["Freeze", "Prone"], - SetPose: ["LegsOpen"], - SelfUnlock: true, - }, - }, - { - Name: "Spread", - Property: { - Type: "Spread2", - Difficulty: 3, - Effect: ["Freeze", "Prone"], - SetPose: ["Spread"], - SelfUnlock: true, - }, - }, - { - Name: "LegsClosed", - Property: { - Type: "Spread3", - Difficulty: 3, - Effect: ["Freeze", "Prone"], - SetPose: ["LegsClosed"], - SelfUnlock: true, - }, - }, - ], - Dialog: { - Load: "SelectBondagePosition", - TypePrefix: "ItemFeetWoodenCuffs", - }, - }, - }, // WoodenCuffs - NylonRope: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Ankles", - Property: { Type: null, SetPose: ["LegsClosed"], Difficulty: 1 }, - }, - { - Name: "Knees", - Property: { Type: "Knees", SetPose: ["LegsClosed"], Difficulty: 1 }, - }, - { - Name: "AnklesKnees", - Property: { Type: "AnklesKnees", SetPose: ["LegsClosed"], Difficulty: 2 }, - }, - { - Name: "BedSpreadEagle", - BondageLevel: 1, - Property: { - Type: "BedSpreadEagle", - Effect: ["Freeze", "Prone"], - Block: ["ItemLegs", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemLegs", "ItemBoots"], - SetPose: ["Spread"], - Difficulty: 5 - }, - Prerequisite: ["OnBed", "NoItemLegs", "LegsOpen"], - } - ], - Dialog: { - Load: "SelectRopeBondage", - TypePrefix: "RopeBondage", - NpcPrefix: "RopeBondage", - ChatPrefix: "FeetRopeSet", - }, - }, - }, // NylonRope - HempRope: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Basic", - Property: { Type: null, SetPose: ["LegsClosed"], Difficulty: 1 } - }, { - Name: "FullBinding", - BondageLevel: 2, - Property: { Type: "FullBinding", SetPose: ["LegsClosed"], Difficulty: 2 } - }, { - Name: "Link", - BondageLevel: 2, - Property: { Type: "Link", SetPose: ["LegsClosed"], Difficulty: 2 } - }, { - Name: "Diamond", - BondageLevel: 4, - Property: { Type: "Diamond", SetPose: ["LegsClosed"], Difficulty: 4 } - }, { - Name: "Mermaid", - BondageLevel: 4, - Property: { Type: "Mermaid", SetPose: ["LegsClosed"], Difficulty: 4 } - }, { - Name: "Suspension", - BondageLevel: 6, - Property: { - Type: "Suspension", - SetPose: ["LegsClosed", "Suspension"], - AllowActivePose: [], - Difficulty: 6 - }, - Expression: [{ Group: "Blush", Name: "High", Timer: 30 }], - Prerequisite: ["NotKneeling", "NotMounted", "NotChained", "NotHogtied"] - }, { - Name: "BedSpreadEagle", - BondageLevel: 1, - Property: { - Type: "BedSpreadEagle", - Effect: ["Freeze", "Prone"], - Block: ["ItemLegs", "ItemBoots", "ItemDevices"], - AllowActivityOn: ["ItemLegs", "ItemBoots"], - SetPose: ["Spread"], - Difficulty: 5 - }, - Prerequisite: ["OnBed", "NoItemLegs", "LegsOpen"], - } - ], - Dialog: { - Load: "SelectRopeBondage", - TypePrefix: "RopeBondage", - NpcPrefix: "RopeBondage", - ChatPrefix: "LegRopeSet", - } - }, - }, - }, // ItemFeet - ItemMisc: { - ServingTray: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { Name: "Empty", Property: { Type: null } }, - { Name: "Drinks", Property: { Type: "Drinks" } }, - { Name: "Cake", Property: { Type: "Cake" } }, - { Name: "Cookies", Property: { Type: "Cookies" } }, - { Name: "Toys", Property: { Type: "Toys" } }, - ], - }, - }, // WoodenMaidTray - TeddyBear: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Bear", - Property: { Type: null }, - }, - { - Name: "Fox", - Property: { Type: "Fox" }, - }, - { - Name: "Pup", - Property: { Type: "Pup" }, - }, - { - Name: "Pony", - Property: { Type: "Pony" }, - }, - { - Name: "Kitty", - Property: { Type: "Kitty" }, - }, - { - Name: "Bunny", - Property: { Type: "Bunny" }, - }, - ], - }, - }, // TeddyBear - }, // ItemMisc - ItemPelvis: { - SilkStraps: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { Name: "Crotch", Property: { Type: null } }, - { Name: "OverPanties", Property: { Type: "OverPanties", OverridePriority: 21 } }, - { Name: "SwissSeat", Property: { Type: "SwissSeat" } }, - { Name: "KikkouHip", Property: { Type: "KikkouHip" } }, - ] - }, - }, // SilkStraps - FuturisticChastityBelt: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Model", Key: "m", - Options: [ - {}, - {}, - {}, - {}, - ], - }, - { - Name: "Front", Key: "f", - Options: [ - { - Property: { - }, - }, - { - Property: { - Block: ["ItemVulva", "ItemVulvaPiercings"], - Effect: ["Chaste"], - }, - }, - ], - }, - { - Name: "Back", Key: "b", - Options: [ - { - Property: { - }, - }, - { - Property: { - Block: ["ItemButt"], - }, - }, - ], - }, - { - Name: "Tamper", Key: "t", - Options: [ - {}, - {}, - {}, - ], - }, - { - Name: "Orgasm", Key: "o", - Options: [ - {}, - {}, - ], - }, - ], - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - } - }, - }, // FuturisticChastityBelt - MetalChastityBelt: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "OpenBack", - Property: { - Type: null, - Block: [], - }, - }, - { - Name: "ClosedBack", - Property: { - Type: "ClosedBack", - Block: ["ItemButt"], - }, - }, - ], - Dialog: { - Load: "SelectBackShield", - TypePrefix: "Chastity", - NpcPrefix: "Chastity", - ChatPrefix: "ChastityBeltBackShield", - }, - ChangeWhenLocked: false, - }, - }, // MetalChastityBelt - OrnateChastityBelt: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "MetalChastityBelt" }, - }, // OrnateChastityBelt - StuddedChastityBelt: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "MetalChastityBelt" }, - }, // StuddedChastityBelt - PolishedChastityBelt: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "MetalChastityBelt" }, - }, // PolishedChastityBelt - Ribbons: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "BowWrap", - Property: { Type: null, Difficulty: 3, OverridePriority: 21 }, - }, - { - Name: "CrotchWrapping", - Property: { Type: "CrotchWrapping", Difficulty: 4 }, - }, - ], - Dialog: { - Load: "SelectRibbonType", - TypePrefix: "RibbonsBelt", - NpcPrefix: "ItemPelvisRibbons", - ChatPrefix: "PelvisRibbonsSet", - } - }, - }, // Ribbons - HempRope: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Crotch", - Property: { Type: null, Difficulty: 1, Effect: ["CrotchRope"] } - }, { - Name: "OverPanties", - Property: { Type: "OverPanties", Difficulty: 1, OverridePriority: 21, Effect: ["CrotchRope"] } - }, { - Name: "SwissSeat", - BondageLevel: 4, - Property: { Type: "SwissSeat", Difficulty: 4 } - }, { - Name: "KikkouHip", - BondageLevel: 5, - Property: { Type: "KikkouHip", Difficulty: 5 } - } - ], - Dialog: { - Load: "SelectRopeBondage", - TypePrefix: "RopeBondage", - NpcPrefix: "RopeBondage", - ChatPrefix: "PelvisRopeSet", - } - }, - }, // HempRope - PoofyDiaper: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.DEST_CHAR_NAME], - Options: [ - { - Name: "RegularPadding", - Property: { Type: null, }, - }, - { - Name: "ExtraPadding", - Property: { Type: "Poofy", HideItem: ["ClothLowerSkirt3", "ClothLowerTennisSkirt1"] }, - }, - ], - }, - }, // PoofyDiaper - ObedienceBelt: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - ChangeWhenLocked: false, - Modules: [ - { - Name: "CrotchShield", Key: "c", - Options: [ - {}, // 0 - open - { // 1 - close front - Property: { - Effect: ["Chaste"], - Block: ["ItemVulva", "ItemVulvaPiercings"], - } - }, - { // 2 - close back - Property: { - Effect: ["Chaste"], - Block: ["ItemButt"], - } - }, - { // 3 - close both - Property: { - Effect: ["Chaste"], - Block: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], - } - } - ], - }, - { - Name: "ShockModule", Key: "s", - Options: [ - {}, // 0 - disabled - { HasSubscreen: true }, // 1 - enabled - ] - }, - { - Name: "Engraving", Key: "e", - Options: [ - { HasSubscreen: true }, - ], - } - ], - } - } - }, // ItemPelvis - ItemEars: { - FuturisticEarphones: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR, CommonChatTags.ASSET_NAME], - Options: [ - { - Name: "Off", - Property: { - Type: null, - Effect: [], - }, - }, - { - Name: "Light", - Property: { - Type: "Light", - Effect: ["DeafLight"], - }, - }, - { - Name: "Heavy", - Property: { - Type: "Heavy", - Effect: ["DeafHeavy"], - }, - }, - { - Name: "NoiseCancelling", - Property: { - Type: "NoiseCancelling", - Effect: ["DeafTotal"], - }, - }, - ], - Dialog: { - Load: "HeadphoneEarPlugsSelectLoudness", - TypePrefix: "HeadphoneEarPlugsPose", - ChatPrefix: "HeadphoneEarPlugsRestrain", - NpcPrefix: "ItemEarsHeadphonePlugs", - }, - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - }, - }, // FuturisticEarphones - HeadphoneEarPlugs: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR, CommonChatTags.ASSET_NAME], - Options: [ - { - Name: "Off", - Property: { - Type: null, - Effect: [], - }, - }, - { - Name: "Light", - Property: { - Type: "Light", - Effect: ["DeafLight"], - }, - }, - { - Name: "Heavy", - Property: { - Type: "Heavy", - Effect: ["DeafHeavy"], - }, - }, - { - Name: "NoiseCancelling", - Property: { - Type: "NoiseCancelling", - Effect: ["DeafTotal"], - }, - }, - ], - Dialog: { - Load: "HeadphoneEarPlugsSelectLoudness", - TypePrefix: "HeadphoneEarPlugsPose", - ChatPrefix: "HeadphoneEarPlugsRestrain", - NpcPrefix: "ItemEarsHeadphonePlugs", - } - }, - }, // HeadphoneEarPlugs - Headphones: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "HeadphoneEarPlugs" }, - }, // Headphones - BluetoothEarbuds: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "HeadphoneEarPlugs" }, - }, // BluetoothEarbuds - }, // ItemEars - Bra: { - SilkStraps: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { Name: "Strip", Property: { Type: null } }, - { Name: "Wrap", Property: { Type: "Wrap" } }, - { Name: "Bra1", Property: { Type: "Bra1" } }, - { Name: "Bra2", Property: { Type: "Bra2" } }, - { Name: "Swimsuit", Property: { Type: "Swimsuit" } }, - ] - } - }, // SilkStraps - Ribbons: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Basic", - Property: { - Type: null, - }, - }, - { - Name: "Bow", - Property: { - Type: "Bow", - }, - }, - { - Name: "Wrap", - Property: { - Type: "Wrap", - }, - }, - ], - Dialog: { - TypePrefix: "RibbonBraType", - Load: "SelectRibbonStyle", - } - } - }, // Ribbons - SexyBikini1: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Open", - Property: { - Type: null, - }, - }, - { - Name: "Closed", - Property: { - Type: "Closed" - }, - }, - ], - Dialog: { - TypePrefix: "BikiniType", - Load: "SelectBikiniType", - } - } - }, // SexyBikini1 - CuteBikini1: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "SexyBikini1" }, - }, // CuteBikini1 - Swimsuit1: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Shiny", - Property: { Type: null}, - }, - { - Name: "Dull", - Property: { Type: "Dull"}, - }, - ], - }, - }, // ChineseDress2 - }, // Bra - Panties: { - SilkStraps: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { Name: "Strips", Property: { Type: null } }, - { Name: "Wrap", Property: { Type: "Wrap" } }, - { Name: "Thong", Property: { Type: "Thong" } }, - { Name: "Panties1", Property: { Type: "Panties1" } }, - ] - }, - }, // SilkStraps - Diapers4: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "None", - Property: { Type: null, }, - }, - { - Name: "StrawBerry", - Property: { Type: "StrawBerry", }, - }, - { - Name: "Flower", - Property: { Type: "Flower", }, - }, - { - Name: "Butterflies", - Property: { Type: "Butterfly", }, - }, - { - Name: "Spots", - Property: { Type: "Spots", }, - }, - ], - }, - }, // Diapers4 - PoofyDiaper: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.DEST_CHAR_NAME], - Options: [ - { - Name: "RegularPadding", - Property: { Type: null, }, - }, - { - Name: "ExtraPadding", - Property: { Type: "Poofy", HideItem: ["ClothLowerSkirt3", "ClothLowerTennisSkirt1"], }, - }, - ], - }, - }, // PoofyDiaper - }, // Panties - Glasses: { - EyePatch1: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Left", - Property: { - Type: null, - }, - }, - { - Name: "Right", - Property: { - Type: "Right", - }, - }, - ], - Dialog: { - Load: "SelectEyePatchType", - TypePrefix: "EyePatchType", - } - }, - }, // EyePatch1 - CatGlasses: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Front", - Property: { - Type: null, - OverridePriority: 53 - }, - }, - { - Name: "Back", - Property: { - Type: "Back", - OverridePriority: 27 - }, - }, - ], - Dialog: { - Load: "CatGlassesSelectStyle", - TypePrefix: "CatGlassesStyle", - }, - DrawImages: false, - }, - }, // CatGlasses - GradientSunglasses: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "GradUp", - Property: { - Type: null, - }, - }, - { - Name: "GradDipped", - Property: { - Type: "GradDipped", - }, - }, - { - Name: "FlatUp", - Property: { - Type: "FlatUp", - }, - }, - { - Name: "FlatDipped", - Property: { - Type: "FlatDipped", - }, - }, - ], - Dialog: { - Load: "GradientSunglassesSelectType", - TypePrefix: "GradientSunglassesType", - }, - DrawImages: false, - }, - }, // GradientSunglasses - }, // Glasses - Bracelet: { - Band1: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Left", - Property: { - Type: null, - }, - }, - { - Name: "Both", - Property: { - Type: "Both", - }, - }, - { - Name: "Right", - Property: { - Type: "Right", - }, - }, - ], - DrawImages: false, - }, - }, // Band1 - SpikeBands: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Both", - Property: { - Type: null, - }, - }, - { - Name: "Right", - Property: { - Type: "Right", - }, - }, - { - Name: "Left", - Property: { - Type: "Left", - }, - }, - ], - Dialog: { - Load: "BraceletSpikeBandsSelect", - TypePrefix: "BraceletSpikeBands", - } - }, - }, // SpikeBands - }, //Bracelet - Garters: { - GarterBelt: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Both", - Property: { - Type: null, - }, - }, - { - Name: "Right", - Property: { - Type: "Right", - }, - }, - { - Name: "Left", - Property: { - Type: "Left", - }, - }, - ], - DrawImages: false, - }, - }, // GarterBelt - }, // Garters - Necklace: { - NecklaceKey: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Normal", - Property: { - Type: null, - OverridePriority: 31 - }, - }, - { - Name: "Tucked", - Property: { - Type: "Tucked", - OverridePriority: 29 - }, - }, - ], - Dialog: { - Load: "SelectPriorityType", - TypePrefix: "ClothPriorityType", - } - }, - }, // NecklaceKey - NecklaceLock: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { AssetName: "NecklaceKey" }, - }, // NecklaceLock - NecklaceRope: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Short", - Property: { - Type: null, - }, - }, - { - Name: "Long", - Property: { - Type: "Long", - }, - }, - ], - }, - }, //NecklaceRope - ChokerTattoo: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Loops", - Property: { - Type: null, - }, - }, - { - Name: "Flowers", - Property: { - Type: "Flowers", - }, - }, - ], - }, - }, //ChokerTattoo - - }, // Necklace - Suit: { - Catsuit: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "NoGloves", - Property: { - Type: null, - }, - }, - { - Name: "Solid", - Property: { - Type: "Gloves", - Hide: ["Hands"], - }, - }, - { - Name: "Seethrough", - Property: { - Type: "AltGloves", - }, - }, - ], - Dialog: { - Load: "SelectSuitGloves", - TypePrefix: "SuitGloveType", - }, - DrawImages: false, - }, - }, // Catsuit - SeamlessCatsuit: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "Suit", AssetName: "Catsuit" }, - }, // SeamlessCatsuit - PilotSuit: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "Suit", AssetName: "Catsuit" }, - }, // PilotSuit - SeethroughSuit: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "NoGloves", - Property: { - Type: null, - }, - }, - { - Name: "Seethrough", - Property: { - Type: "Gloves", - }, - }, - { - Name: "Solid", - Property: { - Type: "AltGloves", - Hide: ["Hands"], - }, - }, - ], - Dialog: { - Load: "SelectSuitGloves", - TypePrefix: "SuitGloveType", - }, - DrawImages: false, - }, - }, // SeethroughSuit - SeethroughSuitZip: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "Suit", AssetName: "SeethroughSuit" }, - }, // SeethroughSuitZip - ReverseBunnySuit: { - Archetype: ExtendedArchetype.TYPED, - CopyConfig: { GroupName: "Suit", AssetName: "Catsuit" }, - }, // ReverseBunnySuit - }, // Suit - ItemHead: { - DuctTape: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Double", - Property: { - Type: null, - Block: ["ItemNose"], - Effect: ["BlindNormal", "Prone"], - }, - }, - { - Name: "Wrap", - Property: { - Type: "Wrap", - Block: ["ItemNose"], - Effect: ["BlindNormal", "Prone"], - }, - }, - { - Name: "Mummy", - Property: { - Type: "Mummy", - Hide: ["HairFront", "HairBack"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemHood", "ItemNose"], - Effect: ["GagNormal", "BlindNormal", "Prone", "BlockMouth"], - }, - }, - { - Name: "Open", - Property: { - Type: "Open", - Hide: ["HairFront", "HairBack"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemHood"], - Effect: ["GagNormal", "BlockMouth"], - }, - } - ] - } - }, // DuctTape - Ribbons: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Basic", - Property: { - Type: null, - Effect: ["BlindLight", "Prone"], - }, - }, - { - Name: "Wrap", - Property: { - Type: "Wrap", - Effect: ["BlindNormal", "Prone"], - }, - }, - ], - Dialog: { - Load: "SelectRibbonType", - }, - }, - }, // Ribbons - WebBlindfold: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Blindfold", - Property: { - Type: null, - Difficulty: 0, - Block: ["ItemNose"], - }, - }, - { - Name: "Cocoon", - Property: { - Type: "Cocoon", - Difficulty: 30, - Hide: ["HairFront", "HairBack", "Glasses", "Hat", "ItemMouth", "ItemMouth2", "ItemMouth3"], - Block: ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemEars", "ItemHood", "ItemNose"], - Effect: ["BlindHeavy", "Prone", "GagNormal", "BlockMouth"], - }, - }, - ], - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Dialog: { - Load: "WebBondageSelect", - }, - }, - }, // WebBlindfold - FuturisticMask: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Transparent", - Property: { - Type: null, - SelfUnlock: true, - Effect: [], - }, - }, - { - Name: "LightTint", - Property: { - Type: "LightTint", - Effect: ["BlindLight", "Prone"], - Tint: [{Color: 0, Strength: 0.2}], - }, - }, - { - Name: "HeavyTint", - Property: { - Type: "HeavyTint", - Effect: ["BlindNormal", "Prone"], - Tint: [{Color: 0, Strength: 0.5}], - }, - }, - { - Name: "Blind", - Property: { - Type: "Blind", - Effect: ["BlindHeavy", "Prone"], - }, - }, - ], - Dialog: { - Load: "SelectVisorType", - TypePrefix: "ItemHeadInteractiveVisorType", - ChatPrefix: "ItemHeadInteractiveVisorSet", - }, - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - }, - }, // FuturisticMask - InteractiveVisor: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Transparent", - Property: { - Type: null, - SelfUnlock: true, - Effect: [], - }, - }, - { - Name: "LightTint", - Property: { - Type: "LightTint", - Effect: ["BlindLight", "Prone"], - Tint: [{ Color: 0, Strength: 0.2 }] - }, - }, - { - Name: "HeavyTint", - Property: { - Type: "HeavyTint", - Effect: ["BlindNormal", "Prone"], - Tint: [{ Color: 0, Strength: 0.5 }] - }, - }, - { - Name: "Blind", - Property: { - Type: "Blind", - Effect: ["BlindHeavy", "Prone"], - }, - }, - ], - Dialog: { - Load: "SelectVisorType", - TypePrefix: "ItemHeadInteractiveVisorType", - ChatPrefix: "ItemHeadInteractiveVisorSet", - }, - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - }, - }, // InteractiveVisor - InteractiveVRHeadset: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules: [ - { - Name: "Background", Key: "b", - Options: [ - //CustomBlindBackground: {"None" : "SynthWave", "FreeVR" : "SynthWave", "Gaming" : "Dungeon", "Off" : "", "AR" : ""}, - { // b0 - Passthrough - Property: { - CustomBlindBackground: "", - } - }, - { // b1 - SynthWave - Property: { - CustomBlindBackground: "SynthWave", - Effect: [], - } - }, - { // b2 - Dungeon - Property: { - CustomBlindBackground: "Dungeon", - Effect: [], - } - }, - { // b3 - SciFiCell - Property: { - CustomBlindBackground: "SciFiCell", - Effect: [], - } - }, - { // b4 - AncientRuins - Property: { - CustomBlindBackground: "AncientRuins", - Effect: [], - } - }, - { // b5 - HypnoticSpiral - Property: { - CustomBlindBackground: "HypnoticSpiral", - Effect: [], - } - }, - ], - }, - { - // Use `BlindTotal` for VR avatars to ensure that the `thin` property never reduces the blindness level below `BlindHeavy`, - // as lowering it any more will result in visual odities related to partial blindness - Name: "Function", Key: "f", - Options: [ - { // f0 - Passthrough - Property: { - Effect: [], - } - }, - { // f1 - Off - Property: { - Effect: ["BlindHeavy", "Prone"], - } - }, - { // f2 - VR Avatar - Property: { - Effect: ["BlindTotal", "Prone", "VRAvatars"], - } - }, - { // f3 - VR Avatar (hide restraints) - Property: { - Effect: ["BlindTotal", "VRAvatars", "HideRestraints"], - } - }, - ], - }, - { - Name: "Game", Key: "g", - Options: [ - { // g0 - None - Property: { - Effect: [], - } - }, - { // f1 - Kinky Dungeon - Property: { - Effect: ["KinkyDungeonParty"], - } - }, - ], - }, - ], - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - } - }, - }, // InteractiveVRHeadset - MedicalPatch: { - Archetype: ExtendedArchetype.MODULAR, - Config:{ - ChatSetting: ModularItemChatSetting.PER_MODULE, - Modules:[ - { - Name: "Eye", Key: "e", - Options:[ - { - Property:{ - Type:null, - Effect:["BlindNormal","Prone"] - }, - }, - { - Property:{ - Type: "Right", - Effect:[] - }, - }, - { - Property:{ - Type: "Left", - Effect:[] - }, - }, - ], - }, - { - Name:"RightSticker", Key: "r", - Options: [{},{},{},{},{}], //Just blank and cosmetic options - }, - { - Name:"LeftSticker", Key: "l", - Options: [{},{},{},{},{}], //Just blank and cosmetic options - }, - ], - } - }, //MedicalPatch - DroneMask: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - ChatSetting: ModularItemChatSetting.PER_MODULE, - Modules:[ - { - Name: "Mouth", Key: "m", - Options:[ - { // m0 - None - Property: { Effect: ["BlockMouth"] } - }, - { // m1 - Onahole - Property: { Effect: ["GagMedium","OpenMouth"] } - }, - { // m2 - Fleshlight - Property: { Effect: ["GagMedium","OpenMouth"] } - }, - { // m3 - Smile - Property: { Effect: ["BlockMouth"] } - }, - { // m4 - Holes - Property: { Effect: ["BlockMouth"] } - }, - { // m5 - Sculpted - Property: { Effect: ["BlockMouth"] } - }, - ] - }, - { - Name: "Eyes", Key: "e", - Options:[ - { // e0 - None - Property: { Effect: ["BlindLight"] } - }, - { // e1 - Regular - Property: { Effect: [] } - }, - { // e2 - Spiral - Property: { Effect: [] } - }, - { // e3 - Smile - Property: { Effect: [] } - }, - { // e4 - Holes - Property: { Effect: ["BlindLight"] } - }, - { // e5 - Sculpted - Property: { Effect: [] } - }, - { // e6 - Concave - Property: {Effect: ["BlindLight"] } - } - - ] - }, - { - Name: "Pattern", Key: "p", - Options:[{},{},{},{},{},{HasSubscreen: true},] // Blank, Barcode, Scarab, Hex, Lines, Text - }, - { - Name: "Glow", Key: "g", - Options: [{},{},] // Glow Off, Glow On - }, - { - Name: "Sight", Key: "s", - Options: [ - { // s0 - Opaque - Property: { Effect: ["BlindHeavy", "Prone"] } - }, - { // s1 - One Way - Property: { Effect: [""] } - }, - ] - }, - { - Name: "Helmet", Key: "h", - Options: [ - {}, // h0 - Mask - { - Property: { - Hide: ["HairFront", "HairBack",], //"HairAccessory1", "HairAccessory2"], - HideItem: [ - "HatBonnet1", "HatBonnet2", "HatBunnySuccubus2", "HatCrown1", "HatCrown2", "HatCrown4", "HatCrown5", "HatBand1", - "HatBand2", "HatPirateBandana1", "HatVeil1","HatVeil2", // Hat items - "MaskFuturisticVisor", "MaskShinobiMask", // Mask items - "HairAccessory3Ribbons4", // HairAccessory items - "HairAccessory1Antennae", "HairAccessory1BunnyEars1", "HairAccessory1BunnyEars2", "HairAccessory1CowHorns", "HairAccessory1ElfEars", - "HairAccessory1Ears1", "HairAccessory1Ears2", "HairAccessory1FoxEars1", "HairAccessory1FoxEars2", "HairAccessory1FoxEars3", - "HairAccessory1KittenEars1", "HairAccessory1KittenEars2", "HairAccessory1MouseEars1", "HairAccessory1MouseEars2", - "HairAccessory1PuppyEars1", "HairAccessory1Ribbons2", "HairAccessory1WolfEars1", "HairAccessory1WolfEars2", - "HairAccessory1Ribbons4", // Ear items (HA1) - "HairAccessory2Antennae", "HairAccessory2BunnyEars1", "HairAccessory2BunnyEars2", "HairAccessory2CowHorns", "HairAccessory2ElfEars", - "HairAccessory2Ears1", "HairAccessory2Ears2", "HairAccessory2FoxEars1", "HairAccessory2FoxEars2", "HairAccessory2FoxEars3", - "HairAccessory2KittenEars1", "HairAccessory2KittenEars2", "HairAccessory2MouseEars1", "HairAccessory2MouseEars2", - "HairAccessory2PuppyEars1", "HairAccessory2Ribbons2", "HairAccessory2WolfEars1", "HairAccessory2WolfEars2", // Ear items (HA2) - ], // These items are hidden because they have clear mismatch issues with the hood. - }, - }, // h1 - Helmet (hood) - { // h2 - Helmet ( hood but nothing shows) - Property: { - Hide: ["HairFront", "HairBack", "Hat", "HairAccessory1", "HairAccessory2", "HairAccessory3"], - HideItem: ["MaskFuturisticVisor", "MaskShinobiMask",], - }, - }, - ] - }, - ], - ChangeWhenLocked: false, - } - }, // DroneMask - Stitches: { - Archetype: ExtendedArchetype.MODULAR, - Config: { - Modules:[ - { - Name:"Main", Key: "m", - Options: [ - {Property: { Hide: ["Eyes"]}, }, // Right Eye - {Property: { Hide: ["Eyes2"]}, }, // Left Eye - {Property: { Hide: ["Eyes","Eyes2"], Effect: ["BlindHeavy", "Prone"]},} //Both Eyes - ], - }, - { - Name:"Right", Key: "r", - Options: [ - {}, // Straight - {}, // ZigZag - {}, // Skewed - {}, // Crossed - ], - }, - { - Name:"Left", Key: "l", - Options: [ - {}, // Straight - {}, // ZigZag - {}, // Skewed - {}, // Crossed - ], - }, - ], - }, - }, // Stitches - }, // ItemHead - ItemHands: { - FuturisticMittens: { - Archetype: ExtendedArchetype.TYPED, - Config: { - Options: [ - { - Name: "Mittens", - Property: { Type: null, Difficulty: 8, Effect: ["Block", "Prone"], SelfUnlock: false}, - }, - { - Name: "Gloves", - Property: { Type: "Gloves", Difficulty: 0, Effect: [], SelfUnlock: true}, - }, - ], - Dialog: { - Load: "SelectFuturisticMittensType", - TypePrefix: "FuturisticMittensType", - ChatPrefix: "FuturisticMittensSet", - }, - ScriptHooks: { - Load: FuturisticAccessLoad, - Click: FuturisticAccessClick, - Draw: FuturisticAccessDraw, - Exit: FuturisticAccessExit, - Validate: FuturisticAccessValidate, - } - }, - }, // FuturisticMittens - }, // ItemHands - ItemAddon: { - CeilingChain: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Lowered", - Property: { Type: null, Difficulty: 6, Effect: []} - }, { - Name: "Suspended", - Property: { - Type: "Suspended", Difficulty: 7, - OverrideHeight: { Height: 30, Priority: 51, HeightRatioProportion: 0 }, - Effect: ["Lifted"], - AllowActivePose: ["BodyLower", "LegsClosed", "Kneel", "KneelingSpread"], - }, - }, - ], - Dialog: { - Load: "SelectCeilingChainState", - TypePrefix: "CeilingChainBondage", - ChatPrefix: "CeilingChainSet", - NpcPrefix: "CeilingChain", - }, - ChangeWhenLocked: false, - } - }, // CeilingChain - CeilingRope: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.TARGET_CHAR], - Options: [ - { - Name: "Lowered", - Property: { Type: null, Difficulty: 6} - }, { - Name: "Suspended", - Property: { - Type: "Suspended", Difficulty: 7, - OverrideHeight: { Height: 30, Priority: 51, HeightRatioProportion: 0 }, - Effect: ["Lifted"], - AllowActivePose: ["BodyLower", "LegsClosed", "Kneel", "KneelingSpread"], - }, - }, - ], - Dialog: { - Load: "SelectCeilingRopeState", - TypePrefix: "CeilingRopeBondage", - ChatPrefix: "CeilingRopeSet", - NpcPrefix: "CeilingRope", - }, - } - }, // CeilingRope - }, // ItemAddon - ItemNose: { - NoseRing: { - Archetype: ExtendedArchetype.TYPED, - Config: { - ChatTags: [CommonChatTags.SOURCE_CHAR, CommonChatTags.DEST_CHAR], - Options: [ - { - Name: "Base", - Property: { - Type: null, - Effect: [], - SetPose: [], - }, - }, - { - Name: "ChainShort", - Prerequisite: ["NotSuspended", "CanKneel", "NotMounted"], - Property: { - Type: "ChainShort", - Effect: ["Freeze", "ForceKneel", "IsChained"], - SetPose: ["Kneel"], - }, - }, - { - Name: "ChainLong", - Prerequisite: ["NotSuspended"], - Property: { - Type: "ChainLong", - Effect: ["Tethered", "IsChained"], - SetPose: [], - }, - }, - { - Name: "Leash", - Prerequisite: ["NotSuspended"], - Property: { - Type: "Leash", - Effect: ["Leash"], - SetPose: [], - }, - }, - ], - Dialog: { - Load: "SelectAttachmentState", - TypePrefix: "NoseRingPose", - ChatPrefix: "NoseRingRestrain", - NpcPrefix: "InventoryItemNoseNoseRingNPCReaction", - }, - } - }, // NoseRing - }, // ItemNose - Wings: { - SteampunkWings: { - Archetype: ExtendedArchetype.TYPED, - Config: { - DrawImages: false, - Options: [ - { - Name: "Off", - Property: { - Type: null, - }, - }, - { - Name: "On", - Property: { - Type: "On", - }, - }, - ], - } - }, // SteampunkWings - }, // Wings -}; diff --git a/Assets/Female3DCG/Female3DCG_CN.txt b/Assets/Female3DCG/Female3DCG_CN.txt deleted file mode 100644 index 96d4ce456..000000000 --- a/Assets/Female3DCG/Female3DCG_CN.txt +++ /dev/null @@ -1,2332 +0,0 @@ -Cloth -衣服 -College -学院 -Maid -女仆装 -Maid Exposed -暴露女仆装 -Student Black -黑色学生服 -Student Bow -有领结学生服 -Student Top -学生服上衣 -Babydoll Dress -芭比裙 -Teacher -教师服 -Chinese Dress -短旗袍 -Chinese Long -旗袍 -T-Shirt -T恤 -Classic T-Shirt -复古T恤 -Tennis -网球服 -Sweater -毛衣 -Mistress Top -女王上衣 -Puffy Dress -蓬松短裙 -Bows Dress -蝴蝶结连衣裙 -Summer flower dress -夏花裙 -Shiny dress -反光短裙 -Nurse Uniform -护士服 -Robe -睡袍 -Suspender Top -吊带上衣 -Leather Corset Top -皮革紧身胸衣 -Flower Dress -印花裙 -Nomadic Dress -游牧民族连衣裙 -Lace Babydoll -蕾丝娃娃裙 -Sleeveless Top -无袖上衣 -Dress with Fur -带毛连衣裙 -Towel -浴巾 -Yukata -浴衣 -Steampunk Corset -蒸汽朋克胸衣 -Bondage Dress Style 1 -捆绑礼服 1 -Bondage Dress Style 2 -捆绑礼服 2 -Shoulderless Top -无肩上衣 -Long Dress -长款礼服 -Sleep Top -睡衣上衣 -Wedding Dress -婚纱礼服 -Shoulderless Wedding Dress -无肩婚纱礼服 -Bridesmaid Dress -伴娘礼服 -Puffball Gown -泡芙袍服 -Hobble Gown -蹒跚袍服 -Shiny Gown -闪亮袍服 -Maid Apron -女仆围裙 -Exposed Maid Apron -暴露女仆围裙 -Admiral Top -海军风上衣 -Virgin Killer -露背毛衣 -Reverse Bunny Suit Top -逆兔女郎上衣 - Leather Crop Top -皮衣上衣 -Corset Shirt -紧身胸衣 -Bondage Bustier 1 -捆绑式紧身胸衣 1 -Bondage Bustier 2 -捆绑式紧身胸衣 2 -Leather Bolero -皮革波蕾若 -Bodice -鲸骨褡 -Summer Dress -夏日连衣裙 -Grand Mage Dress -大法师连衣袍 -Blouse -衬衫 -Laced Latex Top -织边乳胶上衣 -Latex Laced Suit -织边乳胶服 -Fur Coat -毛绒大衣 -Fuzzy Dress -毛绒裙装 -Crop Top -露腹短上衣 -Laurel Top -月桂上衣 -See-through Top -透视上衣 -Jacket -夹克 -Cloth Accessory -服装配饰 -Student Scarf -学园围巾 -Student Bow 1 -学园领带 1 -Student Bow 2 -学园领带 2 -Student Bow 3 -学园领带 3 -Bouquet of flowers -捧花 -Frilly Apron -褶边围裙 -Bunny Girl Accessories -兔女服饰物 -Camera -相机 -Cape -披肩 -Leather Straps -皮革束带 -Fur Bolero -毛绒波蕾若 - Face Paint -面部彩绘 -Bib -围嘴 -Scarf -围巾 -Glitter -亮片 -Catsuit Collar -紧身衣项圈 -Poncho -庞乔斗篷 -Necklace -项链 -Fancy Necklace -精制项链 -Beaded Necklace -挂珠项链 -Long Beaded Necklace -长挂珠项链 -Pearl Necklace -珍珠项链 -Lock Necklace -锁头项链 -Key Necklace -钥匙项链 -ID Card -身份卡 -Black Heart -黑色心形项链 -Ball Gag -口球 -Elegant Heart Necklace -典雅心形项链 -Bandana -大头巾 -Fur Scarf -毛绒围巾 -Flower Garland -花圈 -Rope Necklace -绳子项圈 -Tattoo Choker -纹身项圈 -Body Chain Necklace -身体项链 -Upper Suit -套装(上身) -Catsuit -紧身衣 - Seamless Catsuit -无缝紧身衣 - Sleeveless Catsuit -无袖紧身衣 -Pilot Suit -飞行服 -See-through Suit -透视紧身衣 -See-through Zipsuit -透视拉链紧身衣 -Reverse Bunny Suit -逆兔女郎装 -Slim Latex Leotard (Sleeveless) -贴面乳胶紧身衣(无袖) -Bottom -下装 -Skirt -连衣裙 -Student Skirt -学园连衣裙 -Student Skirt Short -学园短连衣裙 -Jeans -牛仔裤 -Shorts -短裤 -Pajama -睡衣 -Mistress Bottom -女王装下装 -Bondage Waspie -捆绑式紧身带 -Royal Waspie -皇家妇女紧身带 -Straps Waspie -紧身胸带 -Latex Pants -乳胶裤 -Latex Skirt -乳胶裙 -Long Latex Skirt -长乳胶裙 -Tutu -芭蕾舞短裙 -Hula Skirt -草裙舞裙 -Patterned Skirt -格子裙 -Ripped Jeans -破洞牛仔裤 -Chinese Skirt -中式花裙 -Hobble Gown Skirt -步履式礼服裙 -Admiral Skirt -海军裙 -Jean Skirt -牛仔裙 -Pencil Skirt -铅笔裙 -Jeans Shorts -牛仔短裤 -Short Leggings -短打底裤 -Long Leggings -长打底裤 -Pleated Skirt -百褶裙 -Witch's Skirt -女巫裙 -Long Skirt -长裙 -Short Pencil Skirt -短铅笔裙 -Harem Pants -后宫裤 -Harem Pants 2 -后宫裤2 -Short Plaid Skirt -格子短裙 -College Skirt -大学裙 -Bondage Skirt -束缚裙 -Asymmetric Skirt -非对称裙 -Elegant Skirt -优雅裙 -Ruffled Skirt -荷叶裙 -Suit Lower -套装(下身) - Catsuit Panties -紧身衣内裤 -Pilot Suit Panties -飞行服内裤 -Pantyhose -丝袜 -Crotchless Pantyhose -无裆丝袜 -Stockings Dark -黑过膝袜 -Stockings Light -白过膝袜 -Silky Stockings -丝质丝袜 -Fishnet Stockings -渔网袜 -Bra -胸罩 -Style 1 -样式 1 -Style 2 -样式 2 -Style 3 -样式 3 -Lace and Satin -蕾丝缎子 -Strapless -无肩带式 -Bandeau -班多式 -Satin Bustier -缎面紧身胸衣 -Frilled Bikini -褶边比基尼 -Maid Bra -女仆胸罩 -Demonique Bikini -恶魔比基尼 -Micro Bikini -三点比基尼 -One Piece Swimsuit -连体泳衣 -Swimsuit style 1 -泳衣样式 1 -Swimsuit style 2 -泳衣样式 2 -Bunny Girl Bodysuit -兔女郎连体衣 -Latex Bunny Girl Bodysuit -乳胶兔女郎连体衣 -Frame Bra Style 1 -框架文胸样式 1 -Frame Bra Style 2 -框架文胸样式 2 -Bondage Bra -捆绑式文胸 -Latex Bra -乳胶文胸 -Bondage Harness -束缚带 -Leather Strap Harness -皮革束缚带 -Cute Bikini -可爱比基尼 -Corset Bikini -紧身比基尼 -Ouvert Perl -开放式串珠内衣 -Sarashi -裹胸 -Kitty Bra -猫咪文胸 -Fishnet Bikini -渔网文胸 -Sexy Beach Bra -性感沙滩文胸 -Micro Bikini Top -两点文胸 -Star Harness -星形束带 -Heart Top -心形裸露胸衣 -Chinese Bra -旗袍胸衣 -Leather Strap Bra -皮带胸带 -Swimsuit style 3 -泳衣样式 3 -Clamshell Bra -贝壳挡胸 -Cow Printed Bra -奶牛图案文胸 -Studded Harness -饰钉束缚带 -Camisole -吊带背心 -Ribbons -丝带 -Leather Breast Binder -皮革裹胸带 -Silk Straps -丝质束带 -Full Latex Bra -全乳胶文胸 -Full Latex Bra (Bright) -全乳胶文胸(亮色) -Harem Bra -后宫文胸 -Flower Bra -花文胸 -Style 4 -样式 4 -Coconut Bra -椰子文胸 -Corset -束腰 -Corset + Garters -束腰 + 吊袜带 -Half Cup Corset -半胸束腰 -Under Bust Corset -围胸式束腰 -Floral Corset -花卉束腰 -Latex Corset -乳胶束腰 -Noble Corset -皇家束腰 -Panties -内裤 -String Bikini -细绳比基尼 -Satin Bikini -缎面比基尼 -High Cut -高切内裤 -Thong -丁字裤 -Diaper -纸尿裤 -Plastic Covered Diaper -塑料全包纸尿裤 -Satin Covered Diaper -缎面全包纸尿裤 -Patterned Diaper -印花纸尿裤 -Frill Panties -褶边内裤 -Latex Maid Panties -乳胶女仆内裤 -Maid Panties -女仆内裤 -Crotchless Latex Panties -无裆乳胶内裤 -Wrap Panties -包裹形内裤 -Crotchless Briefs -无裆三角裤 -Crotchless Latex Panties 2 -无裆乳胶内裤 2 -Bow Panties -蝴蝶结内裤 -G-String Panties -线型丁字裤 -G-String Pasty -线型遮裆 -Zip-String Panties -拉链内裤 -Full Bondage Harness -紧缚束缚带 -Kitty Panties -猫猫内裤 -Pearl String -珍珠串 -Sunstripe Panties -太阳条纹内裤 -Sexy Beach Panties -性感沙滩内裤 -Chinese Panties -旗袍式内裤 -Leather Strap Panties -皮带内裤 -Cow Printed Panties -奶牛印花内裤 -Latex Panties -乳胶内裤 -Pilot Panties -飞行员内裤 -Catsuit Panties -紧身衣内裤 -Flower Panties -印花内裤 -Floral Panties 2 -碎花内裤 2 -Bulky Diaper -大块尿布 -Poofy Diaper -屎尿布 -Thong 2 -丁字裤 -String Thong -系带丁字裤 -Micro Thong -微型丁字裤 -Socks -袜子 -Ankle -极短袜 -Short -短袜 -Regular -常规 -Middle Leg -过膝袜 -High Leg -长筒袜 -Full Leg -筒袜 -Frill Socks -褶边袜子 -Socks with Fur -毛皮袜 -Striped Socks -条纹袜 -Latex Socks -乳胶袜 -Footless Socks -无脚袜 -Reverse Bunny Suit Stockings -反兔装长筒袜 -Short Leather Socks -短皮革袜 -Cow Printed Socks -奶牛印花袜 -Harem Stockings -后宫丝袜 -Anklet (Right) -踝绳 (右) -Band Anklet -脚踝箍带 -Ribbon -丝带 -Ribbon Bow -蝴蝶结 -Anklet (Left) -踝绳 (左) -Garters -袜带 -Leather Garter Belts -双皮革吊袜带 -Leather Garter Belt -皮革吊袜带 -Tentacles -触手 -Shoes -鞋子 -Sneakers Light -浅色运动鞋 -Sneakers Dark -深色运动鞋 -Heels -高跟鞋 -Heels Strap -箍带高跟鞋 -Boots -靴子 -Mistress Boots -女王靴 -Pony Boots -小马靴 -Strap Sandals -绑带凉鞋 -Rhinestone Sandals -水钻凉鞋 -Paw Boots -爪靴 -Woolly Boots -羊毛靴 -Latex Heels -乳胶靴 -Multi-Strap Heels -多带高跟鞋 -Barefoot Sandals -赤脚凉鞋 - Latex Ankle Shoes -乳胶系踝鞋 -Flippers -脚蹼 -Deluxe Mistress Boots -豪华女王靴 -Ankle Strap Shoes -踝带鞋 -Futuristic Heels -未来高跟鞋 -Fuzzy Boots -毛绒靴子 -Hat -帽子 -Hair Band -发带 -Jeweled Band -宝石箍带 -Beret -贝雷帽 -Maid Hairband -女仆发箍 -Nurse Cap -护士帽 -Santa Hat -圣诞老人帽 -Captain's Hat -船长帽 -Bunny Succubus -兔子魅魔 -Witch Hat -女巫帽 -Pirate Bandana -海盗头巾 -Police Woman Hat -女警察帽 -Dunce Hat -傻帽 -Tiara -头饰 -Bonnet Style 1 -苏格兰帽样式 1 -Bonnet Style 2 -苏格兰帽样式 2 -Crown Style 1 -皇冠样式 1 -Crown Style 2 -皇冠样式 2 -Crown Style 3 -皇冠样式 3 -Crown Style 4 -皇冠样式 4 -Crown Style 5 -皇冠样式 5 -Stylish Small Hat -时尚小帽 -Veil Half Face -半脸面纱 -Veil Full Face -全脸面纱 -Baker Boy Hat -贝克男孩帽 -Reindeer Hairband -驯鹿发带 -Fur Headband -毛皮头带 -Rose Crown -玫瑰皇冠 -Flower Crown -花冠 -Poppy Crown -罂粟花冠 -Latex Habit -乳胶修女 -Baseball Cap Back -棒球帽后 -Baseball Cap Front -棒球帽前 -Hair Accessory -发饰 -Hair Ribbon 1 -发带 1 -Hair Ribbon 2 -发带 2 -Hair Ribbon 3 -发带 3 -Hair Ribbon 4 -发带 4 -Giant Bow 1 -大蝴蝶结 1 -Flower -花 -Wedding Veil -婚礼面纱 -Feathers -羽毛 -Halo -光环 -Hair Accessory (All) -发饰 (全) -Ears Small -小动物耳 -Ears Large -大动物耳 -Pony Ears -小马耳 -Bunny Ears -兔耳 -Floppy Bunny Ears -软兔耳 -Puppy Ears -小狗耳朵 -Succubus Horns -魅魔耳 -Horns -角 -Horns 2 -角 2 -Horns 3 -角 3 - Flower -花 -Fox Ears Small -小 狐狸耳朵 -Small Bat Wings -小 蝙蝠翅膀 -Black Kitty Ears -黑猫耳 -Light Kitty Ears -浅色猫耳 -Wolf Ears One Piece -狼耳一件套 -Wolf Ears Big -狼耳 大 -Fox Ears Large -狐耳 大 -Fox Ears Bell -狐耳 + 铃铛 -Floppy Puppy Ears -软狗耳 -Raccoon Ears -浣熊耳朵 -Mouse Ears 1 -老鼠耳朵 1 -Mouse Ears 2 -老鼠耳朵 2 -Elf Ears -精灵耳朵 -Cow Horns -牛角 -Antennae -触角 -Unicorn Horn -独角兽角 -Dildocorn Horn -独角兽阳具角 -Ears -耳朵 -UnicornHorn -独角兽角 -Gloves -手套 -Short Gloves -短手套 -Long Gloves -长手套 -Silky Gloves -丝手套 -Mistress Gloves -女王手套 -Fingerless Gloves -无指手套 -Gloves with Fur -毛绒手套 -Catsuit Gloves -紧身衣手套 -See-through Gloves -透视装手套 -Cow Printed Gloves -奶牛印花手套 -Latex Elbow Gloves -乳胶护肘手套 - Fishnet Gloves -渔网手套 -Harem Gloves -后宫手套 -Biker Gloves -单车手套 -Bracelet -手镯 -Bow Band -蝴蝶结手环 - Kinky Band -色色手环 -5 Color Band -五色环 -Spiked Wristbands -尖刺腕带 -Band 1 -手环 1 -Lace Armbands -蕾丝袖標 -Glasses -眼镜 -Style 5 -样式 5 -Style 6 -样式 6 -Sunglasses 1 -太阳镜 1 -Sunglasses 2 -太阳镜 2 -Clear Sunglasses -透明太阳镜 -Eye Patch -眼罩 -Cat-Eye Glasses -猫眼眼镜 -V Glasses -V眼镜 -Gradient Sunglasses -渐变太阳镜 -Mask -面具 -Venetian Mask -威尼斯面具 -Domino Mask -多米诺面具 -Butterfly Mask -蝴蝶面具 -Shinobi Mask -忍者面具 -Fox Mask -狐狸面具 -Bunny Mask Filigrane -兔兔花丝面具 -Bunny Mask Leather -兔兔皮革面具 -Bunny Mask Leather Nose -兔兔遮鼻皮革面具 -Kitty Mask Filigrane -猫猫花丝面具 -Kitty Mask Whiskers -猫猫毛绒面具 -Full Kitty Mask -猫猫全头面具 -Bat Mask -蝙蝠面具 -Venice Festival Mask -威尼斯节面具 -Futuristic Visor -未来眼镜 -Open Face Hood -开脸兜帽 -Face Veil -面纱 -Pet Nose -宠物鼻 -Head Harness -头束带 -Tail Strap -尾巴 -Kitty Tail Strap -穿戴式猫尾 -Horse Tail Strap -穿戴式马尾 -Horse TailStrap -马尾 -Fox Tails Strap -穿戴式狐尾 -Puppy Tail Strap -穿戴式狗尾 -Succubus Tail Strap -穿戴式魅魔尾 -Succubus Heart Tail Strap -穿戴式心形魅魔尾 -Raccoon Tail Strap -穿戴式浣熊尾 -Raccoon2 Tail Strap -穿戴式浣熊尾 2 -Puppy Fluffy Tail Strap -穿戴式软小狗尾 -Light Kitten Tail Strap -穿戴式浅色猫尾 -Small Fluffy Kitten Tail Strap -小型穿戴式软猫尾 -Fox Small Tail Strap -小型穿戴式狐尾 -Fox Large Tail Strap -大型穿戴式狐尾 -Wolf Large Tail Strap -大型穿戴式狼尾 -Wolf Small Tail Strap -小型穿戴式狼尾 -Wolf White Tail Strap -白色穿戴式狼尾 -Demon Tail -恶魔尾巴 -Mouse Tail Strap 1 -穿戴式鼠尾 1 -Mouse Tail Strap 2 -穿戴式鼠尾 2 -Cow Tail Strap -穿戴式奶牛尾巴 -Bunny Tail Strap -穿戴式兔子尾巴 -Dragon Tail Strap -穿戴式龙尾 -Wings -翅膀 -Succubus Feather -魅魔羽毛翅膀 -Succubus Wings -魅魔之翼 -Angel Feather -天使羽毛翅膀 -Devil Wings -恶魔之翼 -Fallen Angel Wings -堕天使之翼 -Angel Wings -天使之翼 -Bat Wings -蝙蝠翅膀 -Fairy Wings -精灵之翼 -Steampunk Wings -赛博朋克翅膀 -Bee Wings -蜜蜂翅膀 -Cyber Wings -电子翅膀 -Pixie Wings -小妖精翅膀 -Height -身高 -165 cm -165 cm -167 cm -167 cm -169 cm -169 cm -171 cm -171 cm -173 cm -173 cm -175 cm -175 cm -155 cm -155 cm -157 cm -157 cm -159 cm -159 cm -161 cm -161 cm -163 cm -163 cm -Upper Body -上身 -Small -小号 -Normal -中号 -Large -大号 -Xlarge -超大号 -Lower Body -下身 -Front Hair -前发 -Style 1b -样式 1b -Style 2b -样式 2b -Style 3b -样式 3b -Style 4b -样式 4b -Style 5b -样式 5b -Style 6b -样式 6b -Style 7 -样式 7 -Style 7b -样式 7b -Style 8 -样式 8 -Style 8b -样式 8b -Style 9 -样式 9 -Style 9b -样式 9b -Style 10 -样式 10 -Style 10b -样式 10b -Style 11 -样式 11 -Style 11b -样式 11b -Style 12 -样式 12 -Style 12b -样式 12b -Style 13 -样式 13 -Style 13b -样式 13b -Style 14 -样式 14 -Style 14b -样式 14b -Style 15 -样式 15 -Style 16 -样式 16 -Style 17 -样式 17 -Style 17b -样式 17b -Style 18 -样式 18 -Style 19 -样式 19 -Style 20 -样式 20 -Style 21 -样式 21 -Style 22 -样式 22 -Style 22b -样式 22b -Style 23 -样式 23 -Style 23b -样式 23b -Style 24 -样式 24 -Style 25 -样式 25 -Style 26 -样式 26 -Style 27 -样式 27 -Style 28 -样式 28 -Style 29 -样式 29 -Back Hair -后发 -None -无 -Style 15b -样式 15b -Style 30 -样式 30 -Style 31 -样式 31 -Style 32 -样式 32 -Style 33 -样式 33 -Style 34 -样式 34 -Style 35 -样式 35 -Style 36 -样式 36 -Style 37 -样式 37 -Style 38 -样式 38 -Style 39 -样式 39 -Style 40 -样式 40 -Style 41 -样式 41 -Style 42 -样式 42 -Style 43 -样式 43 -Style 44 -样式 44 -Style 45 -样式 45 -Style 46 -样式 46 -Style 47 -样式 47 -Style 48 -样式 48 -Style 49 -样式 49 -Style 50 -样式 50 -Left eye -左眼 -Right eye -右眼 -Mouth -嘴巴 -Discreet -矜持的 -Nipples Style -乳头式样 -Light -浅色 -Pussy -阴部 -Light 1 -浅色 1 -Light 2 -浅色 2 -Light 3 -浅色 3 -Dark 1 -深色 1 -Dark 2 -深色 2 -Dark 3 -深色 3 -Blush -腮红 -Fluids -液体 -Emoticon -表情图标 -Eyebrows -眉毛 -Hands -手 -Default -默认 -Head -头 -Feet -脚 -Nylon Rope -尼龙绳 -Hemp Rope -麻绳 -Leather Belt -皮带 -Sturdy Leather Belt -坚固皮带 -Irish 8 Feet Cuffs -爱尔兰制8尺铐 -Duct Tape -胶带 -Leather Ankle Cuffs -皮革脚铐 -Floor Shackles -地板脚镣 -Steel Ankle Cuffs -钢质脚铐 -Futuristic Ankle Cuffs -未来脚铐 -Ornate Ankle Cuffs -华丽脚铐 - Metal Leg Spreader -金属分腿棍 -Ball And Chain -铁球和锁链 - Ankle Shackles -脚踝镣铐 - Zip Ties -扎带 -Chains -链条 -Spreader Dildo Bar -分腿假阳具固定器 -Vibrating Spreader Dildo Bar -分腿阳具式振动固定器 -Plastic Wrap -保鲜膜 -Wooden Cuffs -木质铐 -Medical Bed Restraints -医疗床拘束装置 -Suspension Cuffs -吊缚手铐 -Slime -史莱姆 -Legs -腿 -Leather Leg Cuffs -皮革腿铐 -Futuristic Leg Cuffs -未来腿铐 -Ornate Leg Cuffs -华丽腿铐 -Leg Binder -绑腿器 -Hobble Skirt -蹒跚裙 -Seamless Leg Binder -无缝腿部捆绑器 -Seamless Hobble Skirt -无缝蹒跚裙 -Zip Ties -扎带 -Frog-tie Straps -蟹缚绑带 - Mermaid Tail -美人鱼尾巴 -Vulva -前阴 -Vibrating Egg -跳蛋 -Vibrating Items Remote -振动遥控器 -Vibrating Latex Panties -振动乳胶内裤 -Wand Belt -振动棒固定带 -Penis Dildo -假阳具 -Shock Dildo -电击阳具 -Vibrating Dildo -振动阳具 -Futuristic Vibrator -未来振动器 -Inflatable Vibrating Dildo -充气振动阳具 -Clitoral Stimulator -阴蒂刺激器 -Clitoris Suction Cup -阴蒂吮吸杯 -Tape Strips -胶带 -Pair Of Ben Wa Balls -拉珠 -Heavy Weight Clamp -重型乳夹 -Wand -皮带振动棒 -Clitoris & Dildo Vibrating belt -阴蒂阳具振动带 -Hemp Rope Wand Belt -麻绳腰带 -Wired Vibrating Egg -有线跳蛋 -Lovers Vibrator -恋人振动器 -Lovers Remote -恋人遥控器 -Double Ended Dildo -双头龙 -Stitches -缝线 -Clitoris -阴蒂 -Straight Clitoris Piercing -垂直阴蒂穿孔 -Round Clitoris Piercing -圆形阴蒂穿环 -Barbell Clitoris Piercing -半圆阴蒂穿环 -Chastity Vulva Piercings -贞操外阴穿环 -Chastity Vulva Shield -贞操外阴盾 -High Security Vulva Shield -高安全外阴护罩 -Jewel Clitoris Piercing -珠宝阴蒂穿环 -Adorned Clitoris Piercing -装饰阴蒂穿环 -Vibrating Heart Clitoris Piercing -心形振动阴蒂穿环 -Taped Vibrating Egg -胶带 + 跳蛋 -Clitoris Ring -阴蒂环 -Butt -臀部 -Black Butt Plug -黑肛塞 -Penis Butt Plug -阳具肛塞 -Kitty Butt Plug -猫尾肛塞 -Horse Butt Plug -马尾肛塞 -Horse ButtPlug -马尾肛塞 -Puppy Butt Plug -狗尾肛塞 -Puppy Fluffy Butt Plug -软狗尾肛塞 -Succubus Butt Plug -魅魔尾巴肛塞 -Succubus Heart Butt Plug -心形恶魔尾巴肛塞 -Fox Tails -狐尾塞 -Raccoon Butt Plug -浣熊尾肛塞 -Raccoon Tail Plug -浣熊尾塞 -Anal Beads -肛珠 -Anal Beads XL -大号肛珠 -Butt Pump -肛门泵 -Vibrating Butt Plug -振动肛塞 -Inflatable Vibrating Butt Plug -充气式振动肛塞 -Anal Hook -肛钩 -Butt Plug Lock -肛塞锁 -Light Kitten Tail -浅色猫尾 -Small Fluffy Kitten Tail -软猫尾 -Fox Tail Small -狐尾 小 -Fox Tail Large -狐尾 大 -Wolf Tail Large -狼尾 大 -Wolf Tail Small -狼尾 小 -Wolf Tail White -狼尾 白色 -Demon Tail Plug -恶魔尾巴肛塞 -Mouse Tail 1 -鼠尾塞 1 -Mouse Tail 2 -鼠尾塞 2 -White Bunny Tail Plug -白兔尾肛塞 -Brown Bunny Tail Plug -棕兔尾肛塞 -Bunny Tail Vibe Plug -兔尾式振动肛塞 -Egg Vibe Plug XXL -超超大振动肛塞蛋 -Shock Plug -电击肛塞 -Cow Tail -牛尾 -Hollow Butt Plug -空心肛塞 -Locking Vibrating Butt Plug -带锁振动肛塞 -Pelvis -小腹 -Strap-On Panties -绑带式内裤 -Leather Chastity Belt -皮革贞操带 -Sleek Leather Chastity Belt -时尚皮革贞操带 -Studded Chastity Belt -铆钉式贞操腰带 -Metal Chastity Belt -金属贞操带 -Polished Chastity Belt -抛光贞操带 -Futuristic Chastity Belt -未来式贞操带 -Futuristic Training Belt -未来式训练腰带 -Sci-Fi Pleasure Panties -高科技快感管理内裤 -Ornate Chastity Belt -华丽贞操带 -Steel Chastity Panties -不锈钢贞操带 -Love Chastity Belt -爱人贞操带 -Rope Harness -绳缚带 -Diaper Harness -纸尿裤缚带 -Pelvis Chain Leash -腹部牵引链 -Bulky Chastity Diaper -大块贞操尿布 -Poofy Chastity Diaper -贞操尿布 -Hybrid Chastity Belt -混合贞操带 -Obedience Belt -服从贞操带 -Torso -躯干 -Leather Harness -皮革束带 -Leather Strap Body Harness -全身皮革束带 -Adult Baby Harness -成人婴儿束带 -Futuristic Harness -未来束带 -High Security Harness -高安全束带 - Crotch Chain -裆链 -Heavy Latex Corset -重型乳胶束腰 -Thin Leather Straps -细皮革束带 -Locking Swimsuit -上锁泳衣 -Locking Swimsuit 2 -上锁泳衣2 -Nipples -乳头 -Nipple Clamps -乳头夹 -Vibrating Nipple Clamps -振动乳头夹 -Vibrating Clamps Remote -振动乳头夹控制器 -Chain Clamps -铁链乳夹 -Screw Clamps -螺丝乳夹 -Chain Tassles -链式流苏 -Heart Pasties -心形流苏 -Taped Vibrating Eggs -胶带 + 跳蛋 -Nipple Suction Cups -乳头吸吮杯 -Pair Of Nipple Tapes -一对乳头贴 -Chopstick Nipple Clamps -筷子乳头夹 -Kitty Pasties -猫猫头乳贴 -Clothespins -晾衣夹 -Nipple Weight Clamps -加重乳头夹 -Nipple Bell Clamps -铃铛乳头夹 -Lactation Pump -哺乳泵 -Shock Clamps -电击乳头夹 - Plate Clamps -板夹 -Nipple Stretchers -乳头拉扯器 -Straight Piercings -直穿环 -Round Piercings -圆形穿环 - Necklace Nipple Chain -项链式乳头链 -Nipple Jewels -乳头珠宝饰 -Nipple Jewel Piercings -乳头珠宝穿环 -Nipple Gems Piercings -乳头宝珠穿环 -Barbell Piercing -半圆穿环 -Chastity Guard Shield -贞操护盾 -Chastity Cross Shield -贞操十字盾 -Vibrating Heart Piercings -振动心形穿环 -Nipple Bell Piercings -乳头铃铛穿环 -Crossed Straight Piercings -十字穿环 -Breasts -乳房 -Metal Chastity Bra -金属贞操文胸 -Polished Chastity Bra -抛光贞操文胸 -Futuristic Chastity Bra -未来贞操文胸 -Futuristic Bra -未来文胸 -Ornate Chastity Bra -华丽贞操文胸 -Arms -手臂 -Metal Cuffs -金属手铐 -Leather Armbinder -皮革单手套 -Armbinder Jacket -单手套衣 -Leather Cuffs -皮革手铐 -Ceiling Shackles -吊顶手镣 -Steel Cuffs -不锈钢手铐 -Futuristic Cuffs -未来臂铐 -Ornate Cuffs -华丽手铐 -Mittens Chain -连指手套链 -Four Limbs Shackles -四肢束缚铐 -Manacles -镣铐 -Full Body Shackles -全身镣铐 -Wrist Shackles -手腕镣铐 -Latex Strait Leotard -乳胶拘束紧身衣 -Futuristic Straitjacket -未来拘束衣 -Straitjacket -拘束衣 -Collar Cuffs -项圈手铐 -Leather Straitjacket -皮革拘束衣 -Fur Straitjacket -毛绒拘束衣 -Bolero Straitjacket -波蕾若拘束衣 -Pet Suit -宠物拘束服 -Pet Suit Exposed -露出宠物拘束服 -Holding Leash -牵引绳 -Strait Dress -拘束连衣裙 -Open Crotch Strait Dress -开档拘束连衣裙 -Seamless Strait Dress -无缝拘束连衣裙 -Seamless Open Crotch Strait Dress -无缝开档拘束连衣裙 -Yoke -轭 -Pillory -颈手枷 -Full LockDown Latex Suit -全身禁闭乳胶拘束衣 -Latex Box-Tie Armbinder -乳胶箱式缚单手套 -Bondage Bouquet -花束手铐 -Holding Chain Leash -牵引链 -Pet Crawler -宠物爬行训练器 -Mermaid Suit -美人鱼服 -Web -蜘蛛丝 -Latex Armbinder -乳胶单手套 -Futuristic Armbinder -未来单手套 -Seamless Latex Armbinder -无缝乳胶单手套 -Full Body Leather Harness -全身皮革束带 -Under Bed Bondage Cuff Set -床上四肢铐 -Tight Straitjacket -紧身拘束衣 -Latex Sleeveless Leotard -乳胶无缝紧身拘束衣 -Latex Boxtie Leotard -乳胶箱式缚拘束衣 -Latex Butterfly Leotard -乳胶蝴蝶式拘束衣 -Prison Lockdown Suit -监狱禁闭拘束服 -Leather Arm Splints -皮革手臂夹板 -Tightjacket Leotard -紧缚拘束衣 -High Security Straitjacket -高安全拘束衣 -Pantyhose fullBody -全包丝袜 -Crotchless Pantyhose fullBody -开裆式全包丝袜 -Inflatable Strait Leotard -可充气式拘束紧身衣 -Strict Leather Pet Crawler -紧缚皮革宠物爬行训练器 -Transport Jacket -转监拘束衣 -Wrapped Blanket -全包毛毯 -Padded Mittens -衬套无指手套 -Paw Mittens -猫爪无指手套 -Leather Mittens -皮革无指手套 -Futuristic Mittens -未来无指手套 -Padded Leather Mittens -衬套皮革无指手套 -Polished Steel Mittens -抛光不锈钢无指手套 -Handheld Items -手持物品 -Crop -硬鞭 -Flogger -鞭笞 -Cane -手杖 -Heart Crop -心形硬鞭 -Paddle -板子 -Whip Paddle -板鞭 -Whip -皮鞭 -Cattle Prod -赶牛棒 -Tennis Racket -网球拍 -Rainbow Wand -彩虹魔杖 -Gavel -木槌 -Feather -羽毛 -Feather Duster -羽毛掸 -Long Duster -长鸡毛掸 -Ice Cube -冰块 -Wartenberg Wheel -刺轮 -Vibrating Wand -振动按摩棒 -Small Vibe Wand -小振动棒 -Candle Wax -蜡烛 -Large Dildo -大假阳具 -Pet Toy -逗猫棒 -Vibrator -振动棒 -Belt -腰带 -Hairbrush -梳子 -Small Dildo -小假阳具 -Electric Toothbrush -电动牙刷 -Toothbrush -牙刷 -Shock Wand -电击棒 -Lotion -洗液 -Ruler -尺子 -Foam Sword -泡沫剑 -Vibrator Remote -振动玩具遥控器 -Shock Remote -电击遥控器 -Long Coiled Rope -长捆绳 -Short Coiled Rope -短捆绳 -Ballgag -口球 -Long Sock -长袜 -Baguette -法棍面包 -Duct Tape Roll -胶带卷 -Spatula -菜铲 -Broom -扫帚 -Key -钥匙 -Mobile Phone -手机 -Mobile Phone 2 -手机 2 - Hoof Mittens -马蹄手套 -Scissors -剪刀 -Plastic Wrap Roll -保鲜膜卷 -Empty Glass -空玻璃杯 -Filled Glass -装液体的玻璃杯 -Potion Bottle -药剂瓶 -Medical Injector -医用注射器 -Neck -颈部 -Leather Collar -皮革项圈 -Bell Collar -铃铛项圈 -Bow Collar -蝴蝶结项圈 -Slave Collar -奴隶项圈 -Club Slave Collar -俱乐部奴隶项圈 -Shock Collar -电击项圈 -Automatic Shock Collar -自动电击项圈 -Shock Collar Remote -电击项圈控制器 -Bat Collar -蝙蝠项圈 -Posture Collar -姿势项圈 -Steel Collar -不锈钢项圈 -Dog Collar -狗狗项圈 -Spike Collar -带刺项圈 -High Collar -高领项圈 -Futuristic Collar -未来项圈 -Leather Choker -皮革贴颈环 -Pet Collar -宠物项圈 -Maid Collar -女仆围脖 -Bordelle Collar -波戴尔项圈 -Lover Leather Collar -恋人皮革项圈 -Noble Corset Collar -皇家贴颈项圈 -Strict Posture Collar -严苛姿势项圈 -Heart Collar -心心项圈 -Leather Corset Collar Gag -皮革贴颈项圈口塞 -Latex Posture Collar Gag -乳胶姿势项圈口塞 -High Security Collar -高安全项圈 -Ornate Collar -华丽项圈 -Slender Steel Collar -纤细不锈钢项圈 -Shiny Steel Collar -闪亮不锈钢项圈 - Heart-Link Choker -心连心贴颈项圈 -Neck Rope -脖绳 -Nylon Collar -尼龙项圈 -Gothic Collar -哥特式项圈 -Inflated Latex Collar -可充气乳胶项圈 -Latex Collar -乳胶项圈 -Techno Collar -科幻项圈 -Combo Harness -全套束缚具 -Boned Neck Corset -支撑束颈 -Collar -项圈 -Custom Tag -自定义名牌 -Electronic Tag -电子名牌 -Bell -铃铛 -Bow -蝴蝶结 -Shock Unit -电击单元 -Automatic Shock Unit -自动电击单元 -Name Tag -名牌 -Oval Name Tag -椭圆名牌 -Pet Name Tag -宠物名牌 -Lover Name Tag -爱人名牌 -Livestock Name Tag -牲畜名牌 -Moon Pendant -月亮吊坠 -Sun Pendant -太阳吊坠 -Lapis Pendant -青金石吊坠 -Pentagram Pendant -五角星吊坠 -Rose -玫瑰 -Cowbell -牛铃 -Pup Bone -小狗骨头 -Long Chain -长锁链 -Short Chain -短锁链 -Hitching Post -马桩 -Leash -牵引绳 -Pulled Leash -牵拉绳 -Chain Leash -牵引链 -Pulled Chain Leash -牵拉链 -Medium Chain -中锁链 -Long Rope -长绳 -Short Rope -短绳 -Medium Rope -中长绳 -Pet Sign -宠物标牌 -Cloth Gag -布塞 -Wiffle Ball Gag -有孔口球 -Harness Ball Gag -马具口球 -Harness Panel Gag -马具板塞 -Ring Gag -圆环口塞 -Pacifier -奶嘴 -Harness Pacifier -马具奶嘴 -Duster Gag -掸子口塞 -Cup Holder Gag -杯架口塞 -Bit Gag -衔铁 -Pump Gag -充气口塞 -Kitty Mask -猫猫口罩 -Kitty Harness Gag -猫猫马具口塞 -Kitty Muzzle Gag -猫猫口套 -Rubber Carrot Gag -乳胶胡萝卜形口塞 -Muzzle Gag -口套 -Futuristic Panel Gag -未来板塞 -Futuristic Harness Panel Gag -未来马具板塞 -Futuristic Ball Gag -未来口球 -Sleeping Pill -安眠药 -Panties Mask -内衣面具 -Plug Gag -插入式口塞 -Dildo Gag -阳具口塞 -Bone Gag -骨头口塞 -Chopstick Gag -筷子口塞 -Bamboo Gag -竹口塞 -Harness Ball Gag XL -超大号马具口塞 -Pumpkin Gag -南瓜口塞 -Lips Gag -口唇形口塞 -Spider Gag -蛛腿形口环 -Cloth Stuffing -布球堵嘴 -Panty Stuffing -内裤堵嘴 -Chloroform Cloth -药棉 -Lewd Gag -色色口罩 -Deepthroat Penis Gag -深喉式阳具口塞 -Silicon Bit Gag -硅胶口衔 -XL Bone Gag -超大号骨头口塞 -Exposed Dog Muzzle -无遮蔽狗狗口套 -Foxy Harness Gag -狐狸马具口塞 -Tongue Strap Gag -舌束带口塞 -Ball Gag Mask -口球面罩 -Hook Gag Mask -钩式口塞面罩 -Dildo Plug Gag -阳具插入式口塞 -Steel Muzzle Gag -不锈钢口套 -Stitched Muzzle Gag -缝合口套 -Latex Ball Muzzle Gag -乳胶球形口套 -Sock Stuffing -袜子堵嘴 -Respirator Mask -呼吸面罩 -Web Gag -蜘蛛丝堵嘴 -Rope Gag -麻绳堵嘴 -Rope Ball Gag -麻绳口球 -Milk Bottle -奶瓶 -Medical Mask -医用口罩 -Nursery Milk -婴儿奶瓶 -Prison Lockdown Gag -监狱禁闭口塞 -Shoe Gag -鞋子堵嘴 -Funnel Gag -漏斗式口塞 - Plastic Wrap -保鲜膜 -Tennis Ball -网球 -Futuristic Muzzle -未来口套 -Iron Cage Muzzle -铁笼口套 -Dental Gag -医用开口器 -Pacifier Gag -奶嘴口塞 -Tentacle -触手 -Harness OTN Plug Gag -马具覆嘴式塞子口塞 -Bridle Gag -缰绳口塞 - Latex Sheath Gag -乳胶隐藏口塞 - Mouthfeature Gag -嘴内特征口塞 -Stitches -缝线 -Eyes -眼睛 -Cloth Blindfold -布料眼罩 -Scarf Blindfold -围巾眼罩 -Leather Blindfold -皮革眼罩 -Padded Blindfold -软垫眼罩 -Interactive Visor -互动眼镜 -Futuristic Mask -未来面罩 -VR Headset -VR头戴显示器 -Slim Leather Mask -贴面皮革面具 -Open Mouth Slim Mask -开口式贴面面具 -Open Eyes Mouth Slim Mask -开口眼式贴脸面具 -Studded Blindfold -铆钉眼罩 -Kitty Blindfold -猫猫眼罩 -Small Blindfold -轻型眼罩 -Full Blindfold -全脸眼罩 -Lewd Blindfold -色色眼罩 -Latex Blindfold -乳胶眼罩 -Frilled Sleep Mask -褶边睡眠用面罩 -Blackout Lenses -不透光美瞳 -Rope Blindfold -麻绳眼罩 -Smooth Sleep Mask -光滑睡眠用眼罩 -Prison Lockdown Blindfold -监狱禁闭眼罩 -Snorkel -浮潜镜 -Ribbon Blindfold -丝带眼罩 -Medical Patches -医用胶布 -Smooth Latex Mask -平滑乳胶面具 -Nose -鼻子 -Nose Hook -鼻钩 -Pig Nose -猪鼻子 -Nose Ring -鼻环 -Nose Plugs -鼻塞 -Barbel Piercing -杠铃穿孔 -Pig Nose Hook -猪鼻勾 -Blanket Hood -毛毯头罩 -Sealed Leather Hood -封闭式皮革头罩 -Polished Steel Hood -抛光不锈钢头罩 -Inflatable Hood -充气式头罩 -Gas Mask -防毒面具 -Kigurumi Mask -Kigurumi面具 -Pumpkin Head -南瓜头 -Sack Hood -麻袋头罩 -Sensory Deprivation Hood -感官剥夺头罩 -Open Hair Latex Hood -束发乳胶头套 -Leather Hood -皮革头套 -Leather Hood Eyes -皮革露眼头套 -Dog Hood -狗狗头套 -Foxy Mask -狐狸头套 -Pony Hood -小马头套 -Leather Hood Mouth -皮革开嘴头套 -Canvas Hood -帆布头套 -GP-9 Gas Mask -GP-9防毒面具 -Gwen Hood -情趣头套 -Techno Helmet -高科技头盔 -GGTS Helmet -GGTS头盔 -Lampshade Hood -灯罩头套 -Accent Hood -重点头套 -Collar Hood -项圈头套 -Zipper Hood -拉链头套 -Latex Habit Hood -乳胶修女头套 -Cow Hood -奶牛头套 -One-Way Glass Head Box -单面玻璃头盒 -Kitty Hood -猫咪头套 -Latex Dog Hood -乳胶狗狗头套 -Latex Open Mouth Plug Hood -乳胶开口塞头套 -Light Duty Ear Plugs -轻型耳塞 -Heavy Duty Ear Plugs -重型耳塞 -Headphone Ear Plugs -耳机耳塞 -Bluetooth Earbuds -蓝牙耳机 -Futuristic Earphones -未来耳机 -Headphones -耳机 -Body -身体 -Metal Padlock -金属挂锁 -Intricate Padlock -复杂的挂锁 -High-Security Padlock -高安全挂锁 -Five Minutes Padlock -五分钟计时锁 -Combination Padlock -组合密码锁 -Password Lock -密码锁 -Timer Password Lock -计时密码锁 -Owner Padlock -主人锁 -Owner Timer Padlock -主人计时锁 -Lovers Padlock -爱人锁 -Lovers Timer Padlock -爱人计时锁 -Mistress Padlock -女王锁 -Pandora's Box Padlock -潘多拉魔盒锁 -Mistress Timer Padlock -女王计时锁 -Exclusive Padlock -专属挂锁 -Safeword Padlock -安全词锁 -Metal Padlock Key -金属挂锁钥匙 -Owner Padlock Key -主人锁钥匙 -Lovers Padlock Key -爱人锁钥匙 -Mistress Padlock Key -女王锁钥匙 -Pandora's Box Padlock Key -潘多拉魔盒锁钥匙 -Metal Cuffs Key -手铐钥匙 -Lockpicks -撬锁器 -Wooden Maid Tray -木制女仆托盘 -Wooden Maid Tray Full -装满了的木制女仆托盘 -Secret Suitcase -秘密手提箱 -Unlocked Suitcase -解锁的手提箱 -Wooden Paddle -木桨拍 -Wooden Sign -木制挂牌 -Serving Tray -托盘 -Teddy Bear Set -泰迪熊套装 -Wooden Box -木盒子 -Small Wooden Box -小木盒子 -Water filled milk can -装满水的牛奶罐 -Water torture Cell -水刑间 -Stand up cage -站立式铁笼 -Kennel -狗窝 -Saddle Stand -马鞍架 -Burlap Sack -麻袋 -Inflatable Body Bag -充气式全包袋 -Fur Blanket Wrap -毛绒全包毯 -Bondage Bench -捆绑躺椅 -Grill -烧烤架 -Halloween Monster Set -万圣节怪物套装 -Halloween Familiar Set -万圣节伪装者套装 -Vampire Coffin -吸血鬼棺材 -Cryogenic Capsule -低温休眠舱 -One Bar Prison -竖杠监狱 -Display Frame -展示架 -Sybian -鞍式振动器 -Smooth Strap On -穿戴式平滑假阳具 -Studded Strap On -穿戴式铆钉假阳具 -Display Case -展示柜 -Small Display Case -小型展示柜 -Futuristic Crate -未来拘束箱 -Doll Box -人偶箱 -Exposed Head Wooden Box -露头式木箱 -Exposed Head Small Wooden Box -露头式小木箱 -Wooden Stocks -木制牲畜架 -Vacbed -真空床 -Clear Vacbed -透明真空床 -Crib -婴儿床 -Bed -床 -St. Andrews Cross -圣安德鲁斯X字架 -Changing Table -尿布台 -Locker -储物柜 -Small Locker -小型储物柜 -Concealing Cloak -隐藏斗篷 -Heavy Kennel -重型狗窝 -Pet Bed -宠物窝 -Transport Box -运输箱 -Vac-Cube -真空柜 -Pet Bowl -宠物碗 -Pole -柱子 -Cushion -靠枕 -Wet Floor Sign -小心地滑标志 -Vacuum Bed Deluxe -豪华真空床 -Fuck Machine -炮机 -Net -捕获网 -Snowman -雪人 -Medical Bed -医疗床 -Wooden Rack -木质拉肢刑具 -Wooden Horse -木马 -Blanket -毛毯 -Bed Ropes -床上用绳子 -Bed Straps -床上用束带 -Bed Tape -床上用胶带 -Bed Chains -床上用铁链 -Ceiling Rope -吊顶绳 -Ceiling Chain -吊顶链 -Ballet Heels -芭蕾高跟鞋 -Ballet Wedges -芭蕾坡跟鞋 -Metal Toe Cuffs -金属脚趾铐 -Leather Toe Cuffs -皮革脚趾铐 -Toe Tie -绳缚脚趾 -Locking Heels -可上锁高跟鞋 -Multi-Strap Locking Heels -绑带式可上锁高跟鞋 -Locking Strap Shoes -可上锁绑带鞋 -Locking Full Shoes -可上锁鞋 -Futuristic Shoes -未来鞋 -Locking Boots -可上锁靴子 -Short Leather Foot Mittens -短型无指皮革鞋套 -Toe Tape -胶带绑脚趾 -High Thigh Boots -高筒靴 -Monoheel -单跟靴 diff --git a/Assets/Female3DCG/Female3DCG_DE.txt b/Assets/Female3DCG/Female3DCG_DE.txt deleted file mode 100644 index b64f639eb..000000000 --- a/Assets/Female3DCG/Female3DCG_DE.txt +++ /dev/null @@ -1,882 +0,0 @@ -Cloth -Kleidung oben -College -College -Maid -Hausmädchen -Maid Exposed -Hausmädchen entblößt -Student Black -Schuluniform Schwarz -Student Bow -Schuluniform Schleife -Babydoll Dress -Babydoll-Kleid -Teacher -Lehrerin -Chinese Dress -Chinakleid -Chinese Long -Chinakleid lang -T-Shirt -T-Shirt -Tennis -Tennis -Sweater -Pullover -Mistress Top -Herrinnen-Oberteil -Puffy Baby Dress -Bauschiges Babykleid -Bows Baby Dress -Schleifen-Babykleid -Flower Baby dress -Blumen-Babykleid -Nurse Uniform -Schwestern-Uniform -Bunny Girl Accessories -Bunny-Accessoires -Robe -Robe -Suspender Top -Träger-Top -Leather Corset Top -Lederkorsett-Top -Flower Dress -Blumenkleid -Nomadic Dress -Nomadenkleid -Lace Babydoll -Spitzen-Babydoll -Sleeveless Top -Ärmelloses Top -Dress with Fur -Kleid mit Fell -Towel -Handtuch -Yukata -Yukata -Steampunk Corset -Steampunk-Korsett -Bondage Dress Style 1 -Bondage-Kleid Stil 1 -Bondage Dress Style 2 -Bondage-Kleid Stil 2 -Bottom -Kleidung unten -Skirt -Rock -Jeans -Jeans -Shorts -Shorts -Pajama -Pyjama -Mistress Bottom -Herrinnen-Unterteil -Bondage Waspie -Bondage-Waspie -Royal Waspie -Edel-Waspie -Straps Waspie -Riemen-Waspie -Latex Pants -Latexhose -Latex Skirt -LatexRock -Long Latex Skirt -Langer Latexrock -Patterned Skirt -Musterrock -Ripped Jeans -Zerrissene Jeans -Bra -BH -Style 1 -Stil 1 -Style 2 -Stil 2 -Style 3 -Stil 3 -Lace and Satin -Spitzensatin -Strapless -Trägerlos -Bandeau -Bandeau-BH -Satin Bustier -Satin-Bustier -Corset + Garters -Korsett + Strapse -Corset -Korsett -Half Cup Corset -Halbkörbchenkorsett -Under Bust Corset -Unterbrustkorsett -Floral Corset -Blumenkorsett -Frilled Bikini -Rüschenbikini -Demonique Bikini -Demonischer Bikini -Swimsuit style 1 -Badeanzug Stil 1 -Swimsuit style 2 -Badeanzug Stil 2 -Bunny Girl Bodysuit -Bunny-Girl-Anzug -Frame Bra Style 1 -Rahmen-BH Stil 1 -Frame Bra Style 2 -Rahmen-BH Stil 2 -Bondage Bra -Bondage-BH -Latex Bra -Latex-BH -Bondage Harness -Harnisch-BH -Leather Strap Harness -Lederriemen-Harnisch -Cute Bikini -Süßer Bikini -Corset Bikini -Korsett-Bikini -Ouvert Perl -Reizwäsche -Sarashi -Binden-BH -Kitty Bra -Katzen-BH -Fishnet Bikini -Netzbikini -Panties -Slip -Style 4 -Stil 4 -String Bikini -Stringbikini -Satin Bikini -Satinbikini -High Cut -Rio-Slip -Thong -Tangaslip -Diapers -Windeln -Frill Panties -Rüschenhöschen -Latex Maid Panties -Hausmädchen-Latexhöschen -Maid Panties -Hausmädchen-Höschen -Latex Panties -Latexhöschen -Wrap Panties -Bindehöschen -Crotchless Briefs -Schrittfreie Unterhose -G-String Panties -Stringtanga -G-String Pasty -String-Pasty -Zip-String Panties -Reißverschluss-String -Kitty Panties -Katzenhöschen -Pearl String -Perlenstring -Sunstripe Panties -Sonnenstrahl-Slip -Socks -Socken -Ankle -Knöchel -Short -Kurz -Regular -Normal -Middle Leg -Kniehöhe -High Leg -Oberschenkel -Full Leg -Volle Höhe -Stockings Dark -Strümpfe Dunkel -Stockings Light -Strümpfe Hell -Silky Stockings -Seidige Strümpfe -Fishnet Stockings -Netzstrümpfe -Pantyhose -Strumpfhose -Frill Socks -Rüschensocken -Socks with Fur -Socken mit Fell -Shoes -Schuhe -Sneakers Light -Sneakers Hell -Sneakers Dark -Sneakers Dunkel -Heels -Heels 1 -Heels Strap -Heels 2 -Boots -Stiefel -Mistress Boots -Herrinnen-Stiefel -Pony Boots -Pony-Stiefel -Strap Sandals -Riemensandalen -Paw Boots -Tatzenstiefel -Woolly Boots -Wollstiefel -Hat -Kopfbedeckung -Hair Band -Haarband -Beret -Baskenmütze -Maid Hairband -Hausmädchen-Haarband -Nurse Cap -Schwestern-Kappe -Santa Hat -Weihnachtsmütze -Captain's Hat -Kapitänsmütze -Bunny Succubus -Hasen-Succubus - Witch Hat -Hexenhut -Pirate Bandana -Piraten-Kopftuch -Police Woman Hat -Polizeihut -Hair Accessory -Haar-Accessoire -Ears Small -Tierohren klein -Ears Large -Tierohren groß -Pony Ears -Pony-Ohren -Hair Ribbon 1 -Haarschleife 1 - Giant Bow 1 -Große Schleife 1 -Bunny Ears -Hasenohren -Floppy Bunny Ears -Hängende Hasenohren -Puppy Ears -Hundeohren -Succubus Horns -Succubus-Hörner -Horns -Hörner -Horns 2 -Hörner 2 -Horns 3 -Hörner 3 - Flower -Blüte -Fox Ears Small -Fuchsohren klein -Small Bat Wings -Mini-Fledermausflügel -Full Kitty Mask -Kätzchen-Vollmaske -Gloves -Handschuhe -Short Gloves -Kurze Handschuhe -Long Gloves -Lange Handschuhe -Mistress Gloves -Herrinnen-Handschuhe -Fingerless Gloves -Fingerfreie Handschuhe -Gloves with Fur -Handschuhe mit Fell -Glasses -Brille -Style 5 -Stil 5 -Style 6 -Stil 6 -Sunglasses 1 -Sonnenbrille 1 -Sunglasses 2 -Sonnenbrille 2 -Venetian Mask -Venezianische Maske -Domino Mask -Domino-Maske -Butterfly Mask -Schmetterlingsmaske -Eye Patch -Augenklappe -Tail Strap -Schwanzgürtel -Kitty Tail Strap -Katzenschwanzgürtel -Horse Tail Strap -Pferdeschweifgürtel -Fox Tails Strap -Fuchsschweifgürtel -Puppy Tail Strap -Hundeschwanzgürtel -Succubus Tail Strap -Succubusschwanzgürtel -Succubus2 Tail Strap -Succubusschwanzgürtel 2 -Raccoon Tail Strap -Waschbärschweifgürtel -Raccoon2 Tail Strap -Waschbärschweifgürtel 2 -Wings -Flügel -Succubus Feather -Succubus gefiedert -Succubus Wings -Succubus-Flügel -Angel Feather -Engelsflügel -Devil Wings -Dämonenflügel -Fallen Angel Wings -Dunkelengelsflügel -Angel Wings -Engelsflügel -Bat Wings -Fledermausflügel -Upper Body -Oberkörper -Small -Klein -Normal -Normal -Large -Groß -Xlarge -Sehr groß -Lower Body -Unterkörper -Hands -Hände -Default -Standard -Back Hair -Haare hinten -None -Nichts -Style 7 -Stil 7 -Style 8 -Stil 8 -Style 9 -Stil 9 -Style 10 -Stil 10 -Style 11 -Stil 11 -Style 12 -Stil 12 -Style 13 -Stil 13 -Style 14 -Stil 14 -Style 15 -Stil 15 -Front Hair -Haare vorne -Eyes -Augen -Mouth -Mund -Nipples Style -Nippel-Stil -Pussy -Pussy -Light 1 -Hell 1 -Light 2 -Hell 2 -Light 3 -Hell 3 -Dark 1 -Dunkel 1 -Dark 2 -Dunkel 2 -Dark 3 -Dunkel 3 -Eyebrows -Augenbrauen -Blush -Röte -Feet -Füße -Nylon Rope -Nylonseil -Hemp Rope -Hanfseil -Leather Belt -Ledergürtel -Sturdy Leather Belt -Robuster Ledergürtel -Irish 8 Feet Cuffs -Irische Achter-Fußschellen -Suspension Hemp Rope -Hänge-Hanfseil -Duct Tape -Klebeband -Leather Ankle Cuffs -Leder-Fußfesseln - Metal Leg Spreader -Metall-Spreizstange -Ball And Chain -Sträflingskugel - Ankle Shackles -Fußketten -Legs -Beine -Leather Leg Cuffs -Leder-Beinfesseln -Leg Binder -Zwangshose -Hobble Skirt -Humpelrock -Wooden Horse -Holzbock -Vulva -Vulva -Vibrating Egg -Vibrator-Ei -Vibrating Wand -Vibrator-Stab -Vibrating Items Remote -Vibrator-Fernbedienung -Vibrating Latex Panties -Latex-Vibratorhöschen -Wand Belt -Vibrator-Gürtel -Vibrating Dildo -Vibrator-Dildo -Inflatable Vibrating Dildo -Aufblasbarer Vibrator-Dildo -Clit Suction Cup -Klitoris-Saugnapf -Tape Strips -Pflaster -Pair Of Ben Wa Balls -Liebeskugeln -Clit -Klitoris -Straight Clit Piercing -Gerades Klitorispiercing -Round Clit Piercing -Rundes Klitorispiercing -Weighted Clit Piercing -Gewichtetes Klitorispiercing -Barbell Clit Piercing -Barbell-KlitorispPiercing -Chastity Clit Piercing -Keuschheits-Klitorispiercing -Chastity Clit Shield -Keuschheits-Klitorispchild -Jewel Clit Piercing -Juwelen-Klitorispiercing -Adorned Clit Piercing -Verziertes Klitorispiercing -Butt -Hintern -Black Butt Plug -Schwarzer Stöpsel -Kitty Butt Plug -Katzenschwanz -Horse Butt Plug -Pferdeschweif -Puppy Butt Plug -Hundeschwanz -Succubus Butt Plug -Succubus-Stöpsel -Succubus Tail -Succubus-Schwanz -Fox Tails -Fuchsschweife -Raccoon Butt Plug -Waschbär-Analstöpsel -Raccoon Tail Plug -Waschbärschweif-Stöpsel -Anal Beads -Analperlenkette -Butt Pump -Analpumpe -Vibrating Butt Plug -Vibrator-Analstöpsel -Inflatable Vibrating Butt Plug -Aufblasbarer Vibrator-Analstöpsel -Anal Hook -Analhaken -Pelvis -Becken -Strap-On Panties -Umschnalldildo -Leather Chastity Belt -Leder-Keuschheitsgürtel -Studded Chastity Belt -Nieten-Keuschheitsgürtel -Metal Chastity Belt -Metall-Keuschheitsgürtel -Polished Chastity Belt -Hochglanz-Keuschheitsgürtel -Love Chastity Belt -Liebes-Keuschheitsgürtel -Leather Crop -Ledergerte -Leather Whip -Lederpeitsche -Spanking Toys -Spanking-Spielzeug -Torso -Körper -Leather Harness -Lederharnisch -Adult Baby Harness -Erwachsenenbaby-Harnisch -Nipples -Nippel -Straight Piercings -Gerade Nippelpiercings -Round Piercings -Runde Nippelpiercings -Nipple Clamps -Nippelklemmen -Vibrating Nipple Clamps -Vibrator-Nippelklemmen -Vibrating Clamps Remote -Vibratorklemmen-Fernbedienung -Weighted Piercing -Gewichtetes Piercing -Chain Clamp -Kettenklemme -Screw Clamps -Schraubklemmen -Chain Tassles -Kettentroddeln -Heart Pasties -Herz-Pasties -Nipple Jewels -Nippelschmuck -Nipple Jewel Piercings -Nippelschmuck-Piercings -Taped Vibrating Eggs -Klebeband-Vibratoren -Nipple Suction Cups -Nippel-Saugnäpfe -Pair Of Nipple Tapes -Nippel-Klebeband -Barbell Piercing -Barbell-Piercing -Chopstick Nipple Clamps -Stäbchen-Nippelklemmen -Kitty Pasties -Katzen-Pasties -Clothespins -Wäscheklammern -Breast -Brust -Metal Chastity Bra -Metall-Keuschheits-BH -Polished Chastity Bra -Hochglanz-Keuschheits-BH -Arms -Arme -Metal Cuffs -Handschellen -Leather Armbinder -Monohandschuh -Armbinder Jacket -Monohandschuh-Jacke -Leather Cuffs -Ledermanschetten -Mittens Chain -Fäustlingskette -Four Limbs Shackles -Viererketten -Manacles -Ketten -Full Body Shackles -Ganzkörperketten -Wrist Shackles -Handketten -Latex Strait Leotard -Latex-Zwangsjackenanzug -Straitjacket -Zwangsjacke -Leather Straitjacket -Leder-Zwangsjacke -Bolero Straitjacket -Bolero-Zwangsjacke -Pet Suit -Tieranzug -Holding Leash -Leine -Strait Dress -Zwangskleid -Open Crotch Strait Dress -Schrittfreies Zwangskleid -Padded Mittens -Gepolsterte Fäustlinge -Paw Mittens -Pfotenfäustlinge -Leather Mittens -Lederfäustlinge -Padded Leather Mittens -Gepolsterte Lederfäustlinge -Polished Steel Mittens -Hochglanz-Stahlfäustlinge -Crop -Gerte -Flogger -Peitsche -Cane -Rohrstock -Heart Crop -Herz-Gerte -Paddle -Paddel -Whip Paddle -Paddelpeitsche -Whip -Peitsche -Cattle Prod -Viehtreiber -Tennis Racket -Tennisschläger -Neck -Hals -Leather Collar -Lederhalsband -Bell Collar -Glockenhalsband -Bow Collar -Schleifenhalsband -Slave Collar -Sklavenhalsband -Club Slave Collar -Clubsklavenhalsband -Shock Collar -Elektrohalsband -Shock Collar Remote -Elektrohalsband-Fernbedienung -Bat Collar -Fledermaus-Halsband -Posture Collar -Haltungshalsband -Steel Collar -Stahlhalsband -Spike Collar -Nietenhalsband -High Collar -Hohes Halsband -Leather Choker -Lederhalsreif -Pet Collar -Tierhalsband -Maid Collar -Hausmädchenhalsband -Bordelle Collar -Bordelle-Halsband -Lover Leather Collar -Liebes-Lederhalsband -Collar -Halsband -Bell -Glöckchen -Bow -Schleife -Shock Unit -Schock-Einheit -Long Chain -Lange Kette -Short Chain -Kurze Kette -Leash -Leine -Pulled Leash -Gehaltene Leine -Name Tag -Namensschild -Moon -Mond -Cloth Gag -Stoffknebel -Wiffle Ball Gag -Loch-Ballknebel -Harness Ball Gag -Ballknebel -Harness Panel Gag -Maulkorb -Ring Gag -Ringknebel -Pacifier -Schnuller -Harness Pacifier -Schnuller-Harnisch -Duster Gag -Staubwedel-Knebel -Bit Gag -Trensenknebel -Pump Gag -Pumpknebel -Kitty Mask Gag -Katzenmasken-Knebel -Kitty Harness Gag -Harnisch-Katzenknebel -Rubber Carrot Gag -Gummikarotten-Knebel -Muzzle Gag -Kiefer-Maulkorb -Neck Corset Gag -Halskorsettknebel -Sleeping Pill -Schlaftablette -Panties Mask -Höschen-Maske -Plug Gag -Plug-Knebel -Dildo Gag -Dildo-Knebel -Bone Gag -Knochenknebel -Chopstick Gag -Stäbchenknebel -Bamboo Gag -Bambusknebel -Harness Ball Gag XL -XL-Harnischballknebel -Pumpkin Gag -Kürbisknebel -Lips Gag -Lippenknebel -Spider Gag -Spinnenknebel -Cloth Stuffing -Stofffüllung -Scarf -Schal -Lewd Gag -Versauter Knebel -Head -Kopf -Cloth Blindfold -Stoff-Augenbinde -Leather Blindfold -Leder-Augenbinde -Leather Hood -Lederhaube -Leather Hood Eyes -Lederhaube (Augen frei) -Studded Blindfold -Nieten-Augenbinde -Kitty Blindfold -Katzen-Augenbinde -Small Blindfold -Kleine Augenbinde -Leather Hood Mouth -Lederhaube (Mund frei) -Full Blindfold -Voll-Augenbinde -Sensory Deprivation Hood -Reizentzugshaube -Open Hair Latex Hood -Haarfreie Lederhaube -Sealed Leather Hood -Dichte Lederhaube -Polished Steel Hood -Polierte Stahlhaube -Sack Hood -Sackhaube -Lewd Blindfold -Versaute Augenbinde -Ears -Ohren -Light Duty Ear Plugs -Herkömmliche Ohrenstöpsel -Heavy Duty Ear Plugs -Hochleistungs-Ohrenstöpsel -Headphone Ear Plugs -Kopfhörer-Ohrenstöpsel -Misc Items -Sonstiges -Metal Padlock -Vorhängeschloss -Intricate Padlock -Komplexes Vorhängeschloss -Five Minutes Padlock -Fünf-Minuten-Schloss -Owner Padlock -Besitzer-Schloss -Mistress Padlock -Herrinnen-Schloss -Metal Padlock Key -Vorhängeschloss-Schlüssel -Intricate Padlock Key -Komplex-Schloss-Schlüssel -Owner Padlock Key -Besitzer-Schloss-Schlüssel -Mistress Padlock Key -Herrinnen-Schloss-Schlüssel -Metal Cuffs Key -Handschellenschlüssel -Wooden Maid Tray -Holztablett -Wooden Maid Tray Full -Holztablett voll -Wooden Paddle -Holzpaddel -Body -Körper -Wooden Box -Holzkiste -Small Wooden Box -Kleine Holzkiste -Water filled milk can -Milchkanne mit Wasser -Water torture Cell -Wasserfolterzelle -Stand up cage -Aufrechter Käfig -Kennel -Zwinger -Saddle Stand -Sattelständer -Burlap Sack -Leinensack -Inflatable Body Bag -Aufblasbarer Schlafsack -Teddy Bear Set -Teddybär-Set -One Bar Prison -Ein-Stangen-Gefängins -Ballet Heels -Ballett-Heels -Ballet Wedges -Ballett-Wedges -Metal Toe Cuffs -Metall-Zehenfesseln -Leather Toe Cuffs -Leder-Zehenfesseln -Toe Tie -Zehenfessel -Striped Socks -Gestreifte Socken diff --git a/Assets/Female3DCG/Female3DCG_FR.txt b/Assets/Female3DCG/Female3DCG_FR.txt deleted file mode 100644 index 42486160f..000000000 --- a/Assets/Female3DCG/Female3DCG_FR.txt +++ /dev/null @@ -1,1678 +0,0 @@ -Cloth -Vtmt. -College -Collège -Maid -Servante -Maid Exposed -Servante Exposée -Student Black -Étudiante Noir -Student Bow -Étudiante Boucle -Babydoll Dress -Rope de Poupée -Teacher -Enseignante -Chinese Dress -Robe Chinoise -Chinese Long -Chinoise Longue -T-Shirt -T-Shirt -Tennis -Tennis -Sweater -Pull -Mistress Top -Maîtresse Haut -Puffy Baby Dress -Robe de Bébé -Bows Baby Dress -Robe Bouclée Bébé -Flower Baby dress -Robe Fleurée Bébé -Nurse Uniform -Infirmière -Bunny Girl Accessories -Accessoires de Lapin -Robe -Tunique -Bottom -Bas -Skirt -Jupe -Jeans -Jeans -Shorts -Short -Mistress Bottom -Maîtresse Bas -Bra -Brassière -Style 1 -Style 1 -Style 2 -Style 2 -Style 3 -Style 3 -Lace and Satin -Dentelle/Satin -Strapless -Sans Bretelles -Bandeau -Bandeau -Satin Bustier -Bustier Satin -Corset + Garters -Corset/Jarretière -Corset -Corset -Half Cup Corset -Demi-Corset -Under Bust Corset -Corset Sous-buste -Swimsuit style 1 -Maillot style 1 -Swimsuit style 2 -Maillot style 2 -Bunny Girl Bodysuit -Maillot Joint Lapin -Panties -Slip -Style 4 -Style 4 -String Bikini -Bikini Mince -Satin Bikini -Bikini en Satin -High Cut -Coupe Haute -Thong -Lanière -Socks -Chaussettes -Ankle -Cheville -Short -Petit -Regular -Régulier -Middle Leg -Aux Genoux -High Leg -À la Cuisse -Full Leg -Jambe Complète -Stockings Dark -Collants Foncés -Stockings Light -Collants Légers -Silky Stockings -Collants Soyeux -Fishnet Stockings -Collants Résille -Pantyhose -Collants Lisses -Shoes -Chaussures -Sneakers Light -Sport Lèger -Sneakers Dark -Sport Foncé -Heels -Talons -Heels Strap -Talons-sangle -Boots -Bottes -Mistress Boots -Bottes Maîtresse -Pony Boots -Bottes de Poney -Hat -Chapeau -Hair Band -Bande -Beret -Béret -Hair Ribbon 1 -Ruban à Cheveux 1 -Giant Bow 1 -Grand Noeud 1 -Maid Hairband -Servante -Nurse Cap -Chapeau Infirmière -Santa Hat -Père Noël -Captain's Hat -Capitaine -Bunny Succubus -Lapin Succubus -Flower -Fleur -Hair Accessory -Accessoire à Chvx. -Ears Small -Oreilles P. -Ears Large -Oreilles G. -Pony Ears -Oreilles de Poney -Bunny Ears -Lapin -Floppy Bunny Ears -Lapin Souples -Puppy Ears -Puppy Ears -Succubus Horns -Cornes Succubus -Horns -Cornes -Horns 2 -Cornes 2 -Horns 3 -Cornes 3 -Fox Ears Small -Oreilles Renard P. -Small Bat Wings -Ailes Chauve-Souris P. -Full Kitty Mask -Masque Chaton -Gloves -Gants -Short Gloves -Gants Courts -Long Gloves -Gants Longs -Mistress Gloves -Gants Maîtresse -Glasses -Lunettes -Style 5 -Style 5 -Style 6 -Style 6 -Sunglasses 1 -Lun. Soleil 1 -Sunglasses 2 -Lun. Soleil 2 -Venetian Mask -Masque Vénitien -Domino Mask -Masque Domino -Tail Strap -Queue -Kitty Tail Strap -Queue de Chaton -Horse Tail Strap -Queue de Cheval -Fox Tails Strap -Queues de Renard -Puppy Tail Strap -Queue de Chiot -Succubus Tail Strap -Queue de Succubus -Raccoon Tail Strap -Queue de Raton -Raccoon2 Tail Strap -Queue de Raton 2 -Wings -Ailes -Succubus Feather -Plume de Succubus -Succubus Wings -Ailes de Succubus -Angel Feather -Plume d'Ange -Devil Wings -Ailes de Démon -Fallen Angel Wings -Ailes d'Ange Déchu -Angel Wings -Ailes d'Ange -Bat Wings -Ailes de Chauve-Souris -Upper Body -Haut du Corps -Small -Petit -Normal -Normal -Large -Grand -Xlarge -TGrand -Lower Body -Bas du Corps -Hands -Mains -Back Hair -Chvx. Arrière -None -Aucun -Style 7 -Style 7 -Style 8 -Style 8 -Style 9 -Style 9 -Style 10 -Style 10 -Front Hair -Chvx. Avant -Style 11 -Style 11 -Style 12 -Style 12 -Eyes -Yeux -Mouth -Bouche -Nipples Style -Mamelons -Pussy -Vagin -Light 1 -Léger 1 -Light 2 -Léger 2 -Light 3 -Léger 3 -Dark 1 -Foncé 1 -Dark 2 -Foncé 2 -Dark 3 -Foncé 3 -Eyebrows -Sourcils -Blush -Rougir -Feet -Pieds -Nylon Rope -Corde en Nylon -Hemp Rope -Corde en Chanvre -Leather Belt -Ceinture de Cuir -Irish 8 Feet Cuffs -Menottes Irlandaises-8 -Duct Tape -Ruban Adhésif -Legs -Jambes -Vulva -Vulve -Vibrating Egg -Oeuf Vibrant -Vibrating Wand -Baguette Vibrante -Vibrating Latex Panties -Slip en Latex Vibrant -Butt -Fesses -Black Butt Plug -Plug Anal Noir -Kitty Butt Plug -Plug Anal Chat -Horse Butt Plug -Plug Anal Poney -Puppy Butt Plug -Plug Anal Chiot -Succubus Butt Plug -Plug Anal Succubus -Fox Tails -Queues de Renard -Raccoon Butt Plug -Plug Anal Raton -Raccoon Tail Plug -Queue Anale Raton -Anal Beads -Perles Anales -Butt Pump -Plug Anal Gonflable -Pelvis -Bassin -Metal Chastity Belt -Ceinture de Chasteté -Leather Crop -Cravache de Cuir -Leather Whip -Fouet de Cuir -Strap-On Panties -Godemiché avec Sangle -Torso -Torse -Leather Harness -Harnais de Cuir -Adult Baby Harness -Harnais de Bébé Adulte -Nipples -Mamelons -Straight Piercings -Perçants Droits -Round Piercings -Perçants Ronds -Nipple Clamps -Pinces à Seins -Vibrating Nipple Clamps -Pinces à Seins Vibrantes -Vibrating Clamps Remote -Télécommande pour Pinces -Chain Clamp -Chaîne à Pinces -Metal Chastity Bra -Brassière de Chasteté -Arms -Bras -Metal Cuffs -Menottes en Métal -Leather Armbinder -Monogant en Cuir -Leather Cuffs -Lanières en Cuir -Mittens Chain -Chaîne pour Mitaines -Four Limbs Shackles -Entraves en Fer -Latex Strait Leotard -Camisole de Force en Latex -Pet Suit -Habit de Familier -Holding Leash -Laisse de Retient -Padded Mittens -Mitaines Rembourrées -Paw Mittens -Mitaines Pattes -Neck -Cou -Leather Collar -Collier en Cuir -Bell Collar -Collier Cloche -Bow Collar -Collier Boucle -Slave Collar -Collier d'Esclave -Club Slave Collar -Collier d'Esclave Publique -Shock Collar -Collier de Choc -Shock Collar Remote -Télécommande pour Collier de Choc -Bat Collar -Collier Chauve-Souris -Posture Collar -Collier de Posture -Collar -Collier -Bell -Cloche -Bow -Boucle -Shock Unit -Unité de Choc -Long Chain -Longue Chaîne -Short Chain -Courte Chaîne -Leash -Laisse -Pulled Leash -Laisse Tirée -Cloth Gag -Bâillon en Tissu -Wiffle Ball Gag -Bâillon-boule Troué -Harness Ball Gag -Bâillon-boule avec Harnais -Harness Panel Gag -Bâillon-panneau avec Harnais -Ring Gag -Bâillon-anneau -Pacifier -Sucette -Harness Pacifier -Sucette avec Harnais -Duster Gag -Bâillon Dépoussièreur -Bit Gag -Bâillon-mordant -Pump Gag -Bâillon Gonflable -Kitty Mask Gag -Bâillon Chaton -Kitty Harness Gag -Harnais Bâillon-chaton -Rubber Carrot Gag -Bâillon-carotte -Muzzle Gag -Bâillon Museau -Sleeping Pill -Pillule Endormante -Panties Mask -Masque Slip -Plug Gag -Bâillon Plug -Dildo Gag -Bâillon Godemiché -Head -Tête -Cloth Blindfold -Bandeau en Tissu -Leather Blindfold -Bandeau en Cuir -Leather Hood -Masque en Cuir -Leather Hood Eyes -Masque en Cuir avec Yeux -Studded Blindfold -Bandeau Clouté -Kitty Blindfold -Bandeau Chaton -Small Blindfold -Petit Bandeau -Leather Hood Mouth -Masque en Latex Bouche Ouverte -Ears -Oreilles -Light Duty Ear Plugs -Bouchons à Épreuve Faible -Heavy Duty Ear Plugs -Bouchons à Épreuve Forte -Metal Padlock -Cadenas de Métal -Intricate Padlock -Cadenas Complexe -Five Minutes Padlock -Cadenas Cinq Minutes -Owner Padlock -Cadenas Patronne -Metal Padlock Key -Clé pour Cadenas -Intricate Padlock Key -Clé pour Cadenas Complexe -Owner Padlock Key -Clé pour Cadenas Patronne -Metal Cuffs Key -Clé pour Menottes en Métal -Wooden Maid Tray -Plateau de Service en Bois -Wooden Maid Tray Full -Plateau de Service en Bois Plein -Wooden Paddle -Pagaie en Bois -Wooden Box -Caisse en Bois -Water filled milk can -Bidon de Lait Rempli d'Eau -Water torture Cell -Cellule de Torture d'Eau -Saddle Stand -Stand de selle -Metal Leg Spreader -Écarteur de jambe en métal -Student Top -Habit d'étudiante -Shiny Baby dress -Robe de bébé brillante -Suspender Top -Haut à bretelles -Leather Corset Top -Haut corset en cuir -Flower Dress -Robe fleurie -Nomadic Dress -Robe nomade -Lace Babydoll -Babydoll en dentelle -Sleeveless Top -Top sans manches -Dress with Fur -Robe avec fourrure -Towel -Serviette -Yukata -Yukata -Steampunk Corset -Corset Steampunk -Bondage Dress Style 1 -Robe de bondage Style 1 -Bondage Dress Style 2 -Robe de bondage Style 2 -Shoulderless Top -Top sans épaules -Long Dress -Robe Longue -Sleep Top -Haut de nuit -Wedding Dress -Robe de mariée -Shoulderless Wedding Dress -Robe de mariée sans épaules -Bridesmaid Dress -Robe de demoiselle d'honneur -Puffball Gown -Robe Puffball -Hobble Gown -Robbe entravante -Shiny Gown -Robe brillante -Maid Apron -Tablier de femme de chambre -Exposed Maid Apron -Tablier de femme de chambre ouvert -Admiral Top -Haut d'amirale -Virgin Killer -Virgin Killer -Reverse Bunny Suit Top -Haut de costume de lapin inversé -Leather Crop Top -Top court en cuir -Corset Shirt -Chemise corset -Leather Bolero -Boléro en cuir -Cloth Accessory -Accessoire d'habit -Student Scarf -Écharpe d'étudiante -Student Bow 1 -Noeud d'étudiante 1 -Student Bow 2 -Noeud d'étudiante 2 -Student Bow 3 -Noeud d'étudiante 3 -Bouquet of flowers -Bouquet de fleurs -Frilly Apron -Tablier à froufrous -Necklace -Collier -Fancy Necklace -Collier précieux -Beaded Necklace -Collier de perles -Long Beaded Necklace -Collier de perles long -Pearl Necklace -Collier de perles 2 -Lock Necklace -Collier cadenas -Key Necklace -Collier clef -ID Card -Carte d'identification -Black Heart -Coeur noir -Upper Suit -Habit supérieure -Catsuit -Catsuit -Seamless Catsuit -Catsuit sans couture -See-through Suit -Catsuit transparent -See-through Zipsuit -Zipsuit transparent -Reverse Bunny Suit -Costume de lapin inversé -Student Skirt -Jupe d'étudiante -Student Skirt Short -Jupe courte d'étudiante -Pajama -Pyjama -Bondage Waspie -Bondage Waspie -Royal Waspie -Waspie royale -Straps Waspie -Waspie avec attaches -Latex Pants -Pantalon en latex -Latex Skirt -Jupe en latex -Long Latex Skirt -Longue jupe en latex -Patterned Skirt -Jupe à motifs -Ripped Jeans -Jeans déchirés -Chinese Skirt -Jupe chinoise -Hobble Gown Skirt -Jupe contraignante -Admiral Skirt -Jupe d'amirale -Jean Skirt -Jupe en jean -Pencil Skirt -Jupe mince -Jeans Shorts -Shorts en jean -Short Leggings -Leggings court -Long Leggings -Leggings long -Pleated Skirt -Jupe plissée -Suit Lower -Habit inférieur -Floral Corset -Corset fleuri -Frilled Bikini -Bikini à froufrous -Demonique Bikini -Bikini Démonique -Micro Bikini -Micro Bikini -One Piece Swimsuit -Maillot de bain une pièce -Frame Bra Style 1 -Soutien-gorge Cadre Style 1 -Frame Bra Style 2 -Soutien-gorge Cadre Style 2 -Bondage Bra -Soutien-gorge Bondage -Latex Bra -Soutien-gorge en latex -Bondage Harness -Harnais de bondage -Leather Strap Harness -Harnais en cuir -Cute Bikini -Bikini mignon -Corset Bikini -Bikini corset -Ouvert Perl -Perl ouvert -Sarashi -Sarashi -Kitty Bra -Soutien-gorge chaton -Fishnet Bikini -Bikini résille -Sexy Beach Bra -Soutien-gorge de plage sexy -Micro Bikini Top -Haut de micro bikini -Star Harness -Harnais étoile -Heart Top -Haut en coeur -Chinese Bra -Soutien-gorge chinois -Latex Corset -Corset en latex -Leather Strap Bra -Soutien-gorge à bretelles en cuir -Swimsuit style 3 -Maillot de bain Style 3 -Clamshell Bra -Soutien-gorge coquille -Cow Printed Bra -Soutien-gorge vache -Studded Harness -Soutien-gorge harnais clouté -Diaper -Couche -Plastic Covered Diaper -Couche couverte de plastique -Satin Covered Diaper -Couche couverte de satin -Frill Panties -Culotte à froufrous -Latex Maid Panties -Culotte de femme de chambre en latex -Maid Panties -Culotte de femme de chambre -Latex Panties -Culotte en latex -Wrap Panties -Culotte enveloppante -Crotchless Briefs -Slip sans entrejambe -G-String Panties -G-String -G-String Pasty -G-String sans corde -Zip-String Panties -Culotte zippée -Full Bondage Harness -Harnais de bondage complet -Kitty Panties -Culotte chaton -Pearl String -Culotte perlée -165 cm -165 cm -167 cm -167 cm -169 cm -169 cm -171 cm -171 cm -173 cm -173 cm -175 cm -175 cm -155 cm -155 cm -157 cm -157 cm -159 cm -159 cm -161 cm -161 cm -163 cm -163 cm -Style 13 -Style 13 -Style 14 -Style 14 -Style 15 -Style 15 -Style 16 -Style 16 -Style 17 -Style 17 -Style 18 -Style 18 -Style 19 -Style 19 -Style 1b -Style 1b -Style 2b -Style 2b -Style 3b -Style 3b -Style 4b -Style 4b -Style 5b -Style 5b -Style 6b -Style 6b -Style 7b -Style 7b -Style 8b -Style 8b -Style 9b -Style 9b -Style 10b -Style 10b -Style 11b -Style 11b -Style 12b -Style 12b -Style 13b -Style 13b -Style 14b -Style 14b -Left eye -Oeil gauche -Right eye -Oeil droit -Bonnet Style 1 -Bonnet Style 1 -Bonnet Style 2 -Bonnet Style 2 -Crown Style 1 -Couronne Style 1 -Crown Style 2 -Couronne Style 2 -Crown Style 3 -Couronne Style 3 -Crown Style 4 -Couronne Style 4 -Crown Style 5 -Couronne Style 5 -Stylish Small Hat -Petit chapeau élégant -Veil Half Face -Voile demi-visage -Veil Full Face -Voile complet -Baker Boy Hat -Chapeau Baker Boy -Hair Ribbon 2 -Ruban à cheveux 2 -Hair Ribbon 3 -Ruban à cheveux 3 -Hair Ribbon 4 -Ruban à cheveux 4 -Sunstripe Panties -Culotte à rayures solaires -Sexy Beach Panties -Culotte de plage sexy -Chinese Panties -Culotte chinoise -Leather Strap Panties -Culotte à bretelles en cuir -Cow Printed Panties -Culotte vache -Frill Socks -Bas à froufous -Socks with Fur -Chaussettes avec fourrure -Striped Socks -Chaussettes rayées -Latex Socks -Chaussettes en latex -Footless Socks -Chaussettes sans pieds -Reverse Bunny Suit Stockings -Bas d'habit de lapin inversé -Short Leather Socks -Chaussettes courtes en cuir -Crochless Pantyhose -Collants sans entrejambe -Cow Printed Socks -Bas vache -Strap Sandals -Sandales à bride -Rhinestone Sandals -Sandales strass -Paw Boots -Bottes patte -Woolly Boots -Bottes en laine -Latex Heels -Talons hauts en latex -Multi-Strap Heels -Talons hauts à sangles multiples -Jeweled Band -Bandeau ornée de bijoux -Witch Hat -Chapeau de sorcière -Pirate Bandana -Bandana de pirate -Police Woman Hat -Chapeau de police -Dunce Hat -Chapeau Cone -Tiara -Diadème -Wedding Veil -Voile de mariée -Feathers -Plumes -Hair Accessory (All) -Accessoire de cheveux (Tous) -Black Kitty Ears -Oreilles de chat Foncées -Light Kitty Ears -Oreilles de chat pâles -Wolf Ears One Piece -Oreilles de loup -Wolf Ears Big -Grandes oreilles de loup -Fox Ears Large -Grandes oreilles de renard -Fox Ears Bell -Oreilles de renard avec cloche -Floppy Puppy Ears -Oreilles de chiot -Raccoon Ears -Oreilles de raton laveur -Mouse Ears 1 -Oreilles de souris 1 -Mouse Ears 2 -Oreilles de souris 2 -Elf Ears -Oreilles d'elfe -Cow Horns -Cornes de vache -Silky Gloves -Gants soyeux -Fingerless Gloves -Gants sans doigts -Gloves with Fur -Gants avec fourrure -Catsuit Gloves -Gants de Catsuit -See-through Gloves -Gants transparents -Cow Printed Gloves -Gants Vache -Eye Patch -Cache-oeil -Mask -Masque -Butterfly Mask -Masque de papillon -Shinobi Mask -Masque Shinobi -Fox Mask -Masque de renard -Bunny Mask Filigrane -Masque de lapin Filigrane -Bunny Mask Leather -Masque de lapin en cuir -Bunny Mask Leather Nose -Masque de lapin en cuir -Kitty Mask Filigrane -Masque de chat Filigrane -Kitty Mask Whiskers -Masque de chat avec moustaches -Bat Mask -Masque de chauve-souris -Venice Festival Mask -Masque de fête -Horse TailStrap -Queue de cheval -Succubus Heart Tail Strap -Queue de succube en coeur -Puppy Fluffy Tail Strap -Queue de chien -Light Kitten Tail Strap -Queue de chat pâle -Small Fluffy Kitten Tail Strap -Petite queue de chat -Fox Small Tail Strap -Petite queue de renard -Fox Large Tail Strap -Grande queue de renard -Wolf Large Tail Strap -Grande queue de loup -Wolf Small Tail Strap -Petite queue de loup -Wolf White Tail Strap -Queue de loup -Demon Tail -Queue de démon -Mouse Tail Strap 1 -Queue de souris 1 -Mouse Tail Strap 2 -Queue de souris 2 -Fairy Wings -Ailes de fée -Height -Hauteur -Discreet -Discrète -Light -Simple -Fluids -Fluides -Emoticon -Émoticône -Sturdy Leather Belt -Ceinture en cuir robuste -Leather Ankle Cuffs -Menottes de cheville en cuir -Ornate Ankle Cuffs -Menottes de cheville ornées -Ball And Chain -Boule et chaîne -Ankle Shackles -Manilles de cheville -Zip Ties -Attaches en plastique -Chains -Chaînes -Spreader Dildo Bar -Barre à gode -Vibrating Spreader Dildo Bar -Barre à gode vibrants -Leather Leg Cuffs -Menottes de jambe en cuir -Ornate Leg Cuffs -Menottes de jambe ornées -Leg Binder -Attache jambe -Hobble Skirt -Jupe contraignante -Seamless Leg Binder -Attache jambe sans couture -Seamless Hobble Skirt -Jupe contraignante sans couture -Wooden Horse -Cheval en bois -Frog-tie Straps -Sangles de jambes -Mermaid Tail -Queue de sirène -Vibrating Items Remote -Télécommande d'objets vibrants -Wand Belt -Ceinture vibrateur -Penis Dildo -Godemiché -Shock Dildo -Gode électrique -Vibrating Dildo -Gode ​​vibrant -Inflatable Vibrating Dildo -Gode ​​vibrant gonflable -Clitoral Stimulator -Stimulateur clitoridien -Clit Suction Cup -Ventouse de clitoris -Tape Strips -Bandes de ruban adhésif -Pair Of Ben Wa Balls -Paire de boules Ben Wa -Heavy Weight Clamp -Pince lourde -Wand -Vibrateur -Clit & Dildo Vibrating belt -Ceinture vibrante clito et gode -Hemp Rope Wand Belt -Ceinture de vibrateur en corde de chanvre -Wired Vibrating Egg -Œuf vibrant avec file -Lovers Vibrator -Vibromasseur d'amoureux -Lovers Remote -Télécommande de vibrateur pour amantes -Double Ended Dildo -Gode ​​à double extrémité -Clit -Clitoris -Straight Clit Piercing -Piercing Clitoris Droit -Round Clit Piercing -Piercing Clitoris Rond -Weighted Clit Piercing -Piercing Clitoris Lourd -Barbell Clit Piercing -Piercing Clitoris Haltère -Chastity Vulva Piercings -Piercing de chasteté -Chastity Vulva Shield -Bouclié de chasteté -High Security Vulva Shield -Bouclié de haute sécurité -Jewel Clit Piercing -Piercing Clitoris Bijoux -Adorned Clit Piercing -Piercing Clitoris Orné -Vibrating Heart Clit Piercing -Piercing Vibrant en Coeur -Bell Clit Piercing -Piercing avec cloche -Taped Vibrating Egg -Oeuf vibrant collé -Penis Butt Plug -Plug Pénis -Horse ButtPlug -Plug queue de cheval -Puppy Fluffy Butt Plug -Plug queue de chien -Succubus Heart Butt Plug -Plug queue de succube en coeur -Anal Beads XL -Perles anales XL -Vibrating Butt Plug -Plug anal vibrant -Inflatable Vibrating Butt Plug -Plug anal vibrant gonflable -Anal Hook -Crochet anal -Butt Plug Lock -Plug anal avec verrou -Light Kitten Tail -Plug queue de chat pâle -Small Fluffy Kitten Tail -Plug queue de chat -Fox Tail Small -Plug queue de renard -Fox Tail Large -Plug grande queue de renard -Wolf Tail Large -Plug grande queue de loup -Wolf Tail Small -Plug petite queue de loup -Wolf Tail White -Plug queue de loup -Demon Tail Plug -Plug queue de démon -Mouse Tail 1 -Plug queue de souris 1 -Mouse Tail 2 -Plug queue de souris 2 -White Bunny Tail Plug -Plug queue de lapin 1 -Brown Bunny Tail Plug -Plug queue de lapin 2 -Bunny Tail Vibe Plug -Plug queue de lapin vibrant -Egg Vibe Plug XXL -Oeuf vibrant XXL -Shock Plug -Plug électrique -Cow Tail -Plug queue de vache -Leather Chastity Belt -Ceinture de chasteté en cuir -Sleek Leather Chastity Belt -Ceinture de chasteté en cuir mince -Studded Chastity Belt -Ceinture de chasteté cloutée -Polished Chastity Belt -Ceinture de chasteté polie -Ornate Chastity Belt -Ceinture de chasteté ornée -Steel Chastity Panties -Culotte de chasteté en acier -Love Chastity Belt -Ceinture de chasteté d'amoureuses -Rope Harness -Harnais de corde -Diaper Harness -Harnais à couches -Pelvis Chain Leash -Laisse en chaîne de bassin -Leather Breast Binder -Attache de poitrine en cuir -Crotch Chain -Chaîne d'entrejambe -Screw Clamps -Pinces à vis -Chain Tassles -Pompons chaîne -Heart Pasties -Collant en coeur -Taped Vibrating Eggs -Œufs vibrants collés -Nipple Suction Cups -Ventouses à mamelons -Pair Of Nipple Tapes -Ruban adhésif à mamelons -Chopstick Nipple Clamps -Pinces baguette -Kitty Pasties -Collants chats -Clothespins -Pinces à linge -Nipple Weight Clamps -Pinces à poids -Nipple Bell Clamps -Pinces à cloche -Lactation Pump -Pompe de lactation -Shock Clamps -Pinces électrique -Nipple Jewels -Bijoux de mamelon -Nipple Jewel Piercings -Piercing bijoux -Nipple Gems Piercings -Piercing à pierres précieuses -Barbell Piercing -Piercing Droit -Chastity Guard Shield -Bouclié de chasteté -Chastity Cross Shield -Bouclié de chasteté à croix -Vibrating Heart Piercings -Piercings vibrants en cœur -Nipple Bell Piercings -Piercing à cloche -Breasts -Seins -Polished Chastity Bra -Soutien-gorge de chasteté poli -Ornate Chastity Bra -Soutien-gorge de chasteté orné -Armbinder Jacket -Veste brassard -Ornate Cuffs -Menottes ornées -Manacles -Manilles -Full Body Shackles -Manilles complètes -Wrist Shackles -Manilles de poignet -Straitjacket -Camisole de force -Collar Cuffs -Menottes de collier -Leather Straitjacket -Camisole de force en cuir -Bolero Straitjacket -Camisole de force boléro -Pet Suit Exposed -Pet Suit Ouvert -Strait Dress -Robe droite -Open Crotch Strait Dress -Robe droite ouverte -Seamless Strait Dress -Robe droite sans couture -Seamless Open Crotch Strait Dress -Robe droite ouverte sans couture -Yoke -Joug -Pillory -Pilori -Full LockDown Latex Suit -Combinaison en latex complète -Latex Box-Tie Armbinder -Brassard en latex -Bondage Bouquet -Bouquet de bondage -Holding Chain Leash -Laisse en chaîne maintenue -Pet Crawler -Pet Suit Rampant -Mermaid Suit -Combinaison de sirène -Web -Toile -Latex Armbinder -Brassard en latex -Seamless Latex Armbinder -Brassard en latex sans couture -Full Body Leather Harness -Harnais en cuir complet -Under Bed Bondage Cuff Set -Ensemble d'attaches de lit -Tight Straitjacket -Camisole de force serrée -Latex Sleeveless Leotard -Justaucorps sans manches en latex -Latex Boxtie Leotard -Justaucorps en latex -Latex Butterfly Leotard -Justaucorps papillon en latex -Prison Lockdown Suit -Combinaison de prison -Leather Arm Splints -Attelles de bras en cuir -Tightjacket Leotard -Camisole de force -High Security Straitjacket -Camisole de force haute sécurité -Pantyhose fullBody -Collants complet -Crotchless Pantyhose fullBody -Collants sans entrejambe complet -Leather Mittens -Mitaines en cuir -Padded Leather Mittens -Mitaines en cuir rembourrées -Polished Steel Mittens -Mitaines en acier poli -Handheld Toys -Jouets portables -Crop -Cravache -Flogger -Flogger -Cane -Canne -Heart Crop -Cravache en coeur -Paddle -Pagaie -Whip Paddle -Pagaie de fouet -Whip -Fouet -Cattle Prod -Aiguillon -Tennis Racket -Raquette de tennis -Feather -Plume -Feather Duster -Plumeau -Ice Cube -Glaçon -Wartenberg Wheel -Roue de Wartenberg -Small Vibe Wand -Petit vibrateur -Candle Wax -Cire de bougie -Large Dildo -Gode large -Pet Toy -Jouet pour animal -Vibrator -Vibrateur -Belt -Ceinture -Hairbrush -Brosse à cheveux -Small Dildo -Petit Gode -Electric Toothbrush -Brosse à dents électrique -Toothbrush -Brosse à dents -Shock Wand -Baton électrique -Lotion -Lotion -Hoof Mittens -Mitaines sabot -Steel Collar -Collier en acier -Dog Collar -Collier de chien -Spike Collar -Collier à pointes -High Collar -Collier Haut -Leather Choker -Choker en cuir -Pet Collar -Collier d'animal de compagnie -Maid Collar -Collier de femme de chambre -Bordelle Collar -Collier Bordelle -Lover Leather Collar -Collier en cuir d'amantes -Strict Posture Collar -Collier de posture stricte -Noble Corset Collar -Collier de corset noble -Heart Collar -Collier coeur -Latex Posture Collar Gag -Bâillon collier de posture en latex -Leather Corset Collar Gag -Bâillon en cuir avec col corset -High Security Collar -Collier haute sécurité -Ornate Collar -Collier orné -Slender Steel Collar -Collier en acier mince -Heart-Link Choker -Choker en coeur -Neck Rope -Corde -Custom Tag -Étiquette personnalisée -Name Tag -Étiquette de nom -Oval Name Tag -Étiquette de nom ovale -Pet Name Tag -Étiquette de nom d'animal -Lover Name Tag -Étiquette de nom d'amantes -Livestock Name Tag -Étiquette de nom de bétail -Moon Pendant -Pendentif lune -Sun Pendant -Pendentif soleil -Lapis Pendant -Pendentif Lapis -Pentagram Pendant -Pendentif pentagramme -Rose -Rose -Cowbell -Cloche de vache -Pup Bone -Os de chiot -Chain Leash -Laisse chaîne -Pulled Chain Leash -Laisse chaîne tirée -Medium Chain -Chaîne Moyenne -Cup Holder Gag -Porte-gobelet -Bone Gag -Bâillon os -Chopstick Gag -Baguettes -Bamboo Gag -Bâillon en bambou -Harness Ball Gag XL -Bâillon harnais à boule XL -Pumpkin Gag -Bâillon citrouille -Lips Gag -Bâillon Lèvres -Spider Gag -Bâillon araignée -Cloth Stuffing -Tissu -Panty Stuffing -Culotte -Chloroform Cloth -Tissu avec chloroforme -Scarf -Écharpe -Lewd Gag -Bâillon obscène -Deepthroat Penis Gag -Bâillon gode long -Silicon Bit Gag -Bâillon en silicon -XL Bone Gag -Os XL -Exposed Dog Muzzle -Museau de chien exposé -Foxy Harness Gag -Baillon hairnais renard -Ball Gag -Baillon boule -Tongue Strap Gag -Bâillon sangle de langue -Ball Gag Mask -Masque bâillon boule -Hook Gag Mask -Masque bâillon crochet -Dildo Plug Gag -Baillon gode -Steel Muzzle Gag -Bâillon museau en acier -Stitched Muzzle Gag -Bâillon museau cousu -Latex Ball Muzzle Gag -Bâillon muselière en latex -Sock Stuffing -Bas -Respirator Mask -Masque respiratoire -Web Gag -Baillon toile -Rope Gag -Baillon corde -Milk Bottle -Bouteille de lait -Medical Mask -Masque médical -Nursery Milk -Lait de garderie -Prison Lockdown Gag -Baillon de prison -Shoe Gag -Baillon Chaussure -Slim Leather Mask -Masque en cuir mince -Open Mouth Slim Mask -Masque mince à bouche ouverte -Open Eyes Mouth Slim Mask -Masque mince à yeux ouverts -Full Blindfold -Bandeau complet -Lewd Blindfold -Bandeau obscènes -Latex Blindfold -Bandeau en latex -Frilled Sleep Mask -Masque de sommeil à froufous -Blackout Lenses -Verres occultants -Rope Blindfold -Bandeau en corde -Smooth Sleep Mask -Masque de sommeil lisse -Prison Lockdown Blindfold -Bandeau de prison -Snorkel -Tuba -Nose -Nez -Nose Hook -Crochet -Nose Ring -Anneau -Nose Plugs -Bouchons -Sealed Leather Hood -Cagoule en cuir scellé -Polished Steel Hood -Cagoule en acier poli -Inflatable Hood -Cagoule gonflable -Gas Mask -Masque à gaz -Sack Hood -Cagoule sac -Sensory Deprivation Hood -Cagoule isolante -Open Hair Latex Hood -Cagoule en latex avec cheveux -Dog Hood -Cagoule Chien -Foxy Mask -Masque de renard -Pony Hood -Cagoule Poney -Canvas Hood -Capuche en toile -Headphone Ear Plugs -Écouteurs -Bluetooth Earbuds -Écouteurs Bluetooth -Body -Corps -Combination Padlock -Cadenas à combinaison -Owner Timer Padlock -Cadenas de patronne à minuterie -Lovers Padlock -Cadenas d'amantes -Lovers Timer Padlock -Cadenas d'amantes à minuterie -Mistress Padlock -Cadenas de maîtresse -Mistress Timer Padlock -Cadenas de maîtresse à minuterie -Exclusive Padlock -Cadenas exclusif -Lovers Padlock Key -Clé de cadenas d'amantes -Mistress Padlock Key -Clé de cadenas maîtresse -Small Wooden Box -Petite boîte en bois -Stand up cage -Cage -Kennel -Niche -Burlap Sack -Sac en toile de jute -Inflatable Body Bag -Sac gonflable -Bondage Bench -Banc de bondage -Teddy Bear Set -Ensemble d'ours en peluche -One Bar Prison -Barre prison -Display Frame -Cadre moulant -Sybian -Sybian -Smooth Strap On -Gode-ceinture -Studded Strap On -Gode-ceinture à relief -Display Case -Vitrine -Small Display Case -Petite vitrine -Exposed Head Wooden Box -Boîte à tête exposée -Exposed Head Small Wooden Box -Petite boîte à tête exposée -Wooden Stocks -Pillori complet -Vacbed -Vacbed -Crib -Lit de bébé -Bed -Lit -St. Andrews Cross -Croix de St-André -Changing Table -Table à langer -Locker -Casier -Small Locker -Petit casier -Ventless Locker -Casier sans ventilation -Small Ventless Locker -Petit casier sans ventilation -Concealing Cloak -Cape de dissimulation -Hood -Cagoule -Blinding Lenses -Lentilles opaques -Gas Mask Tube -Tube -Rebreather -Respirateur -Gas Mask Tube & Lenses -Tube et lentilles -Rebreather & Lenses -Respirateur et lentilles -Leather Belt Straps -Sangles en cuir -Blanket -Couverture -Bed Ropes -Cordes de lit -Bed Straps -Sangles de lit -Bed Tape -Ruban adhésif de lit -Bed Chains -Chaînes de lit -Ballet Heels -Talons de ballet -Ballet Wedges -Ballerines -Metal Toe Cuffs -Menottes en métal -Leather Toe Cuffs -Menottes en cuir -Toe Tie -Corde -Locking Heels -Talons haut -Multi-Strap Locking Heels -Talons haut à brides multiples -Locking Strap Shoes -Chaussures à bande -Locking Full Shoes -Chaussures -Locking Boots -Bottes -Short Leather Foot Mittens -Mitaines courtes en cuir -Toe Tape -Ruban adhésif diff --git a/Assets/Female3DCG/Female3DCG_RU.txt b/Assets/Female3DCG/Female3DCG_RU.txt deleted file mode 100644 index e9dedaf61..000000000 --- a/Assets/Female3DCG/Female3DCG_RU.txt +++ /dev/null @@ -1,2347 +0,0 @@ -Cloth -Верх -College -колледж -Maid -горничная -Maid Exposed -обнаженная горничная -Student Black -школьница черная -Student Bow -Юнга -Student Top -студенческий верх -Babydoll Dress -кукольное платье -Teacher -учитель -Chinese Dress -китайское платье -Chinese Long -китайское Длинное -T-Shirt -футболка -Classic T-Shirt -Классическая футболка -Tennis -тенниска -Sweater -свитер -Mistress Top -верх Госпожи -Puffy Dress -Пышное платье -Bows Dress -Платье с бантом -Summer flower dress -Летнее цветочное платье -Shiny dress -Блестящее платье -Nurse Uniform -униформа медсестры -Bunny Girl Accessories -аксессуары для девочек-зайчиков -Robe -халат -Suspender Top -верх подвязка -Leather Corset Top -кожаный корсет -Flower Dress -цветочное платье -Nomadic Dress -одежда кочевника -Lace Babydoll -гипюровая куколка -Sleeveless Top -верх без руковов -Dress with Fur -платье с мехом -Towel -полотенце -Yukata -кимоно -Steampunk Corset -корсет стимпанк -Bondage Dress Style 1 -платье бондаж стиль 1 -Bondage Dress Style 2 -платье бондаж стиль 2 -Shoulderless Top -топ с открытыми плечами -Long Dress -Длинное платье -Sleep Top -Топ для сна -Wedding Dress -Свадебное платье -Shoulderless Wedding Dress -Свадебное платье без плеч -Bridesmaid Dress -Платье подружки невесты -Puffball Gown -Платье-пуховик -Hobble Gown -Хоббл платье -Shiny Gown -Блестящее Платье -Maid Apron -Фартук горничной -Exposed Maid Apron -Открытый фартук горничной -Admiral Top -Адмирал Топ -Virgin Killer -Убийца девственниц -Reverse Bunny Suit Top -Обратный костюм кролика топ - Leather Crop Top - Кожаный укороченный топ -Corset Shirt -Корсетная рубашка -Bondage Bustier 1 -бондаж бюстье 1 -Bondage Bustier 2 -бондаж бюстье 2 -Leather Bolero -Кожаное болеро -Bodice -Лиф -Summer Dress -Летнее платье -Grand Mage Dress -Платье Великого Мага -Blouse -Блузка -Laced Latex Top -Кружевной Латексный Топ -Latex Laced Suit -Костюм Со шнуровкой из латекса -Fur Coat -шуба -Fuzzy Dress -Пушистое платье -Crop Top -Укороченный Топ -Laurel Top -Лорел Топ -See-through Top -Прозрачный верх -Cloth Accessory -Тканевый аксессуар -Student Scarf -Студенческий Шарф -Student Bow 1 -студенческий бант 1 -Student Bow 2 -студенческий бант 2 -Student Bow 3 -студенческий бант 3 -Bouquet of flowers -Букет цветов -Frilly Apron -Фартук с оборками -Bunny Girl Accessories -Девочка-зайчик аксессуары -Camera -Камера -Cape -Накидка -Leather Straps -Кожаные ремни -Fur Bolero -Меховое болеро - Face Paint - Краска для лица -Bib -Слюнявчик -Scarf -Шарф -Glitter -Веснушки -Catsuit Collar -Ошейник костюма кошки -Poncho -Пончо -Necklace -Ожерелье -Fancy Necklace -Необычное Ожерелье -Beaded Necklace -Ожерелье из бисера -Long Beaded Necklace -Длинное Ожерелье Из Бисера -Pearl Necklace -Жемчужное Ожерелье -Lock Necklace -Ожерелье с замком -Key Necklace -Ожерелье с ключами -ID Card -Удостоверение личности -Black Heart -Черное Сердце -Ball Gag -Кляп с шариком -Elegant Heart Necklace -Элегантное Ожерелье в виде Сердца -Bandana -Бандана -Fur Scarf -Меховой Шарф -Flower Garland -Цветочная гирлянда -Rope Necklace -Веревочное Ожерелье -Tattoo Choker -Тату Колье -Body Chain Necklace -Ожерелье с цепочкой для тела -Upper Suit -Верхний костюм -Catsuit -Костюм кошки - Seamless Catsuit - Бесшовный костюм кошки - Sleeveless Catsuit - Костюм кошки без рукавов -Pilot Suit -Костюм пилота -See-through Suit -Прозрачный костюм -See-through Zipsuit -Прозрачный костюм на молнии -Reverse Bunny Suit -Обратный костюм кролика -Slim Latex Leotard (Sleeveless) -Тонкий латексный купальник (без рукавов) -Bottom -Низ -Skirt -юбка -Student Skirt -Студенческая юбка -Student Skirt Short -Студенческая юбка короткая -Jeans -синие джинсы -Shorts -шорты -Pajama -пижама -Mistress Bottom -низ Госпожи -Bondage Waspie -бондаж пояс -Royal Waspie -королевский пояс -Straps Waspie -ременной пояс -Latex Pants -латексные брюки -Latex Skirt -латексная юбка -Long Latex Skirt -длинная латексная юбка -Tutu -Пачка -Hula Skirt -Юбка Хула -Patterned Skirt -юбка с рисунком -Ripped Jeans -рваные джинсы -Chinese Skirt -Китайская юбка -Hobble Gown Skirt -Юбка в стиле хобл -Admiral Skirt -Адмирал Юбка -Jean Skirt -Джинсовая юбка -Pencil Skirt -Юбка карандаш -Jeans Shorts -Джинсовые шорты -Short Leggings -Короткие леггинсы -Long Leggings -Длинные леггинсы -Pleated Skirt -Плиссированная юбка -Witch's Skirt -Юбка ведьмы -Long Skirt -Длинная юбка -Short Pencil Skirt -Короткая юбка-карандаш -Harem Pants -Гаремные штаны -Harem Pants 2 -Гаремные штаны 2 -Short Plaid Skirt -Короткая клетчатая юбка -College Skirt -Юбка колледжа -Bondage Skirt -Бондаж юбка -Asymmetric Skirt -Асимметричная юбка -Elegant Skirt -Элегантная юбка -Ruffled Skirt -Юбка с оборками -Suit Lower -Нижний костюм - Catsuit Panties - Кошачий костюм Трусики -Pilot Suit Panties -Трусики пилотного костюма -Pantyhose -Колготки -Crotchless Pantyhose -Колготки с вырезом -Stockings Dark -Чулки Темные -Stockings Light -Чулки Светлые -Silky Stockings -Шелковые чулки -Fishnet Stockings -Ажурные чулки -Bra -Бюстгальтер -Style 1 -стиль 1 -Style 2 -стиль 2 -Style 3 -стиль 3 -Lace and Satin -кружево и атлас -Strapless -Без бретелек -Bandeau -Повязка -Satin Bustier -Атласное Без бретелек -Frilled Bikini -Бикини С Оборками -Maid Bra -Бюстгальтер горничной -Demonique Bikini -Демоническое бикини -Micro Bikini -Микро бикини -One Piece Swimsuit -Цельный купальник -Swimsuit style 1 -купальник стиль 1 -Swimsuit style 2 -купальник стиль 2 -Bunny Girl Bodysuit -Костюм девушки-кролика -Latex Bunny Girl Bodysuit -Латексное боди девочки кролика -Frame Bra Style 1 -каркас Бюстгальтер Стиль 1 -Frame Bra Style 2 -каркас Бюстгальтер Стиль 2 -Bondage Bra -Бондаж Бюстгальтер -Latex Bra -Латексный Бюстгальтер -Bondage Harness -бондаж сбруя -Leather Strap Harness -кожаная ременная сбруя -Cute Bikini -Милое Бикини -Corset Bikini -Корсет Бикини -Ouvert Perl -открытый -Sarashi -Сараши -Kitty Bra -Бюстгальтер Кошечки -Fishnet Bikini -Ажурные Бикини -Panties -Трусики -Sexy Beach Bra -Сексуальный пляжный бюстгальтер -Micro Bikini Top -Верх микро бикини -Star Harness -Звездная упряжь -Heart Top -Сердечный топ -Chinese Bra -Китайский бюстгальтер -Leather Strap Bra -Кожаный бюстгальтер на бретелях -Swimsuit style 3 -Стиль купальника 3 -Clamshell Bra -Бюстгальтер-раскладушка -Cow Printed Bra -Бюстгальтер с принтом коровы -Studded Harness -Упряжь с шипами -Camisole -Камзол -Ribbons -Ленты -Leather Breast Binder -Кожаная нагрудная перевязь -Silk Straps -Шелковые ремни -Full Latex Bra -Полный латексный бюстгальтер -Full Latex Bra (Bright) -Полный Латексный Бюстгальтер (Яркий) -Harem Bra -Гарем Бюстгальтер -Flower Bra -Цветочный бюстгальтер -Style 4 -Стиль 4 -Coconut Bra -Кокосовый бюстгальтер -Corset -Корсет -Corset + Garters -Корсет + Подвязки -Half Cup Corset -Корсет с половинной чашкой -Under Bust Corset -Корсет под грудью -Floral Corset -Цветочный корсет -Latex Corset -Латексный корсет -Noble Corset -Благородный корсет -Panties -Трусики -String Bikini -бикини -Satin Bikini -Атласное Бикини -High Cut -Высокий Вырез -Thong -Трусики -Diaper -Подгузник -Plastic Covered Diaper -Подгузник с пластиковым покрытием -Satin Covered Diaper -Подгузник с атласным покрытием -Patterned Diaper -Узорчатый подгузник -Frill Panties -Трусики С Оборками -Latex Maid Panties -Латексные Трусики Горничной -Maid Panties -Трусики Горничной -Latex Panties -Латексные Трусики -Crotchless Latex Panties -Латексные трусики с вырезом -Wrap Panties -Обворачивающие Трусики -Crotchless Briefs -Трусы Без Промежности -Crotchless Latex Panties 2 -Латексные трусики с вырезом 2 -Bow Panties -Трусики с бантом -G-String Panties -Трусики-Стринги -G-String Pasty -G-Стринги -Zip-String Panties -Трусики на молнии -Full Bondage Harness -Полная упряжь для бондажа -Kitty Panties -Трусики Кошечки -Pearl String -Жемчужная Нить -Sunstripe Panties -Трусики из ремней -Sexy Beach Panties -Сексуальные пляжные трусики -Chinese Panties -Китайские трусики -Leather Strap Panties -Кожаные трусики с ремешком -Cow Printed Panties -Трусики с коровьим принтом -Latex Panties -Латексные трусики -Pilot Panties -Пилот трусики -Catsuit Panties -Кошачий костюм Трусики -Flower Panties -Цветочные трусики -Floral Panties 2 -Цветочные трусики 2 -Bulky Diaper -Громоздкий подгузник -Poofy Diaper -Пушистый подгузник -Thong 2 -Стринги 2 -String Thong -Стрнги нить -Micro Thong -Микро стринги -Socks -Носки -Ankle -до щиколотки -Short -Короткие -Regular -стандартные -Middle Leg -до колена -High Leg -выше колена -Full Leg -до бедер -Frill Socks -Носки С Оборками -Socks with Fur -Носки с мехом -Striped Socks -Полосатые носки -Latex Socks -Латексные носки -Footless Socks -Носки без ступней -Reverse Bunny Suit Stockings -Обратные чулки костюма кролика -Short Leather Socks -Короткие кожаные носки -Cow Printed Socks -Носки с коровьим принтом -Harem Stockings -Гарем Чулки -Anklet (Right) -Ножной браслет (справа) -Band Anklet -Браслет на ногу -Ribbon -Лента -Ribbon Bow -Лента Бант -Anklet (Left) -Ножной браслет (левый) -Garters -Подвязки -Leather Garter Belts -Кожаные подвязки -Leather Garter Belt -Кожаный пояс с подвязками -Tentacles -Тентакли -Shoes -Обувь -Sneakers Light -Кроссовки Светлые -Sneakers Dark -Кроссовки Темные -Heels -Каблуки -Heels Strap -Каблуки с ремешком -Boots -Ботинки -Mistress Boots -Сапоги Госпожи -Pony Boots -Сапоги Пони -Strap Sandals -Сандалии с ремешками -Rhinestone Sandals -Сандалии со стразами -Paw Boots -Сапоги Лапы -Woolly Boots -Вязаные Сапоги -Latex Heels -Латексные каблуки -Multi-Strap Heels -Каблуки с несколькими ремешками -Barefoot Sandals -Босоножки - Latex Ankle Shoes - Латексные туфли на щиколотке -Flippers -Ласты -Deluxe Mistress Boots -Роскошные сапоги госпожи -Ankle Strap Shoes -Обувь с ремешком на щиколотке -Futuristic Heels -Футуристические каблуки -Fuzzy Boots -Пушистые сапоги -Hat -Головной убор -Hair Band -Лента Для Волос -Jeweled Band -Драгоценное кольцо -Beret -Берет -Maid Hairband -Лента Для Волос Горничной -Nurse Cap -Капор медсестры -Santa Hat -Шляпа Санты -Captain's Hat -Капитанская фуражка -Bunny Succubus -Кролик Суккуб - Witch Hat - Шляпа Ведьмы -Pirate Bandana -Пиратская Бандана -Police Woman Hat -Фуражка полицейского -Dunce Hat -Дурацкая шляпа -Tiara -Тиара -Bonnet Style 1 -Стиль капота 1 -Bonnet Style 2 -Стиль капота 2 -Crown Style 1 -Стиль короны 1 -Crown Style 2 -Стиль короны 2 -Crown Style 3 -Стиль короны 3 -Crown Style 4 -Стиль короны 4 -Crown Style 5 -Стиль короны 5 -Stylish Small Hat -Стильная маленькая шляпа -Veil Half Face -Вуаль на половину лица. -Veil Full Face -Вуаль на всё лицо. -Baker Boy Hat -Кепи -Reindeer Hairband -Лента для волос Оленя -Fur Headband -Меховая повязка на голову -Rose Crown -Корона роз -Flower Crown -Венок -Poppy Crown -Маковая корона -Latex Habit -Латексный верх рясы -Hair Accessory -Аксессуар для волос -Hair Ribbon 1 -Лента для волос 1 -Hair Ribbon 2 -Лента для волос 2 -Hair Ribbon 3 -Лента для волос 3 -Hair Ribbon 4 -Лента для волос 4 - Giant Bow 1 - Гигантский бант 1 - Flower - Цветок -Wedding Veil -Свадебная фата -Feathers -Перья -Halo -Ореол -Hair Accessory (All) -Аксессуары для волос (Все) -Ears Small -Уши Маленькие -Ears Large -Уши Большие -Pony Ears -Уши Пони -Bunny Ears -Кроличьи Ушки -Floppy Bunny Ears -Гибкие Кроличьи Ушки -Puppy Ears -Уши Щенка -Succubus Horns -Рога Суккуба -Horns -Рога -Horns 2 -Рога 2 -Horns 3 -Рога 3 -Fox Ears Small -Лисьи Уши Маленькие -Small Bat Wings -Маленькие Крылья Летучей Мыши -Small Bat Wings -Black Kitty Ears -Черные кошачьи уши -Light Kitty Ears -Светлые кошачьи уши -Wolf Ears One Piece -Волчьи уши, цельный кусок -Wolf Ears Big -Волчьи уши большие -Fox Ears Large -Уши лисы большие -Fox Ears Bell -Колокол лисьих ушей -Floppy Puppy Ears -Гибкие щенячьи уши -Raccoon Ears -Уши енота -Mouse Ears 1 -Мышиные уши 1 -Mouse Ears 2 -Мышиные уши 2 -Elf Ears -Эльфийские уши -Cow Horns -Коровьи рога -Antennae -Антенны -Unicorn Horn -Рог единорога -Dildocorn Horn -Рог дилдокорна -Ears -Уши -UnicornHorn -Рог единорога -Gloves -Перчатки -Short Gloves -Короткие Перчатки -Long Gloves -длинные перчатки -Silky Gloves -Шелковые перчатки -Mistress Gloves -Перчатки Госпожи -Fingerless Gloves -Перчатки Без Пальцев -Gloves with Fur -Перчатки с мехом -Catsuit Gloves -Кошачий костюм Перчатки -See-through Gloves -Прозрачные перчатки -Cow Printed Gloves -Перчатки с коровьим принтом -Latex Elbow Gloves -Латексные перчатки на локоть - Fishnet Gloves - Ажурные перчатки -Harem Gloves -Гаремные перчатки -Bracelet -Браслет -Bow Band -Бант-лента - Kinky Band - Извращенная браслет -5 Color Band -5-цветная полоса -Spiked Wristbands -Браслеты с шипами -Band 1 -браслет 1 -Lace Armbands -Кружевные повязки -Glasses -Очки -Style 5 -Стиль 5 -Style 6 -Стиль 6 -Sunglasses 1 -Солнцезащитные очки 1 -Sunglasses 2 -Солнцезащитные очки 2 -Clear Sunglasses -Прозрачные солнцезащитные очки -Eye Patch -Повязка на глаз -Cat-Eye Glasses -Очки «кошачий глаз» -V Glasses -V Очки -Mask -Маска -Venetian Mask -Венецианская маска -Domino Mask -Маска Домино -Butterfly Mask -Маска Бабочки -Shinobi Mask -Маска шиноби -Fox Mask -Маска лисы -Bunny Mask Filigrane -Маска Кролика Филигрань -Bunny Mask Leather -Кожаная Маска Кролика -Bunny Mask Leather Nose -Маска Кролика Кожаный Нос -Kitty Mask Filigrane -Китти Маска Филигрань -Kitty Mask Whiskers -Усы Китти в маске -Full Kitty Mask -Полная маска Китти -Bat Mask -Маска летучей мыши -Venice Festival Mask -Маска Венецианского фестиваля -Futuristic Visor -Футуристический визор -Open Face Hood -Капюшон с открытым лицом -Face Veil -Вуаль для лица -Pet Nose -Нос питомца -Tail Strap -Ремень с хвостом -Kitty Tail Strap -Хвост котенка -Horse Tail Strap -Хвост лошади -Horse TailStrap -Хвост лошади -Fox Tails Strap -Хвост лисы -Puppy Tail Strap -Хвост щенка -Succubus Tail Strap -Хвост суккубы -Succubus2 Tail Strap -Хвост суккубы 2 -Succubus Heart Tail Strap -суккуба хвост с сердцем -Raccoon Tail Strap -Хвост енота -Raccoon2 Tail Strap -Хвост енота 2 -Puppy Fluffy Tail Strap -Ремешок с пушистым хвостом для щенков -Light Kitten Tail Strap -Ремешок для Легкого хвоста котенка -Small Fluffy Kitten Tail Strap -Ремешок для Маленького пушистого хвоста котенка -Fox Small Tail Strap -Ремешок с маленьким хвостом лисы -Fox Large Tail Strap -Ремешок с большим хвостом лисы -Wolf Large Tail Strap -Ремешок с большим хвостом волка -Wolf Small Tail Strap -Ремешок с маленьким хвостом волка -Wolf White Tail Strap -Ремешок с белым хвостом волка -Demon Tail -Хвост Демона -Mouse Tail Strap 1 -Ремешок с хвостом мыши 1 -Mouse Tail Strap 2 -Ремешок с хвостом мыши 2 -Cow Tail Strap -Ремешок из коровьего хвоста -Bunny Tail Strap -Ремешок с кроличьим хвостом -Dragon Tail Strap -Ремешок с хвостом дракона -Wings -Крылья -Succubus Feather -Перо Суккуба -Succubus Wings -Крылья Суккуба -Angel Feather -Перо Ангела -Devil Wings -Крылья Дьявола -Fallen Angel Wings -Крылья Падшего Ангела -Angel Wings -Крылья ангела -Bat Wings -Крылья Летучей Мыши -Fairy Wings -Крылья феи -Steampunk Wings -Крылья в стиле стимпанк -Bee Wings -Пчелиные Крылья -Cyber Wings -Кибер Крылья -Pixie Wings -Пикси Крылья -Height -Рост -165 cm -165 см -167 cm -167 см -169 cm -169 см -171 cm -171 см -173 cm -173 см -175 cm -175 см -155 cm -155 см -157 cm -157 см -159 cm -159 см -161 cm -161 см -163 cm -163 см -Upper Body -верхняя часть тела -Small -Маленькая -Normal -Нормальная -Large -Большая -Xlarge -Очень большая -Lower Body -нижняя часть тела -Hands -Руки -Default -По умолчанию -Back Hair -Волосы сзади -None -нет -Front Hair -передние волосы -Style 1b -Стиль 1b -Style 2b -Стиль2b -Style 3b -Стиль 3b -Style 4b -Стиль 4b -Style 5b -Стиль 5b -Style 6b -Стиль 6b -Style 7 -Стиль 7 -Style 7b -Стиль 7b -Style 8 -Стиль 8 -Style 8b -Стиль 8b -Style 9 -Стиль 9 -Style 9b -Стиль 9b -Style 10 -Стиль 10 -Style 10b -Стиль 10b -Style 11 -Стиль 11 -Style 11b -Стиль 11b -Style 12 -Стиль 12 -Style 12b -Стиль 12b -Style 13 -Стиль 13 -Style 13b -Стиль 13b -Style 14 -Стиль 14 -Style 14b -Стиль 14b -Style 15 -Стиль 15 -Eyes -Глаза -Style 16 -Стиль 16 -Style 17 -Стиль 17 -Style 17b -Стиль 17b -Style 18 -Стиль 18 -Style 19 -Стиль 19 -Style 20 -Стиль 20 -Style 21 -Стиль 21 -Style 22 -Стиль 22 -Style 22b -Стиль 22b -Style 23 -Стиль 23 -Style 23b -Стиль 23b -Style 24 -Стиль 24 -Style 25 -Стиль 25 -Style 26 -Стиль 26 -Style 27 -Стиль 27 -None -Нет -Style 15b -Стиль 15b -Style 28 -Стиль 28 -Style 29 -Стиль 29 -Style 30 -Стиль 30 -Style 31 -Стиль 31 -Style 32 -Стиль 32 -Style 33 -Стиль 33 -Style 34 -Стиль 34 -Style 35 -Стиль 35 -Style 36 -Стиль 36 -Style 37 -Стиль 37 -Style 38 -Стиль 38 -Style 39 -Стиль 39 -Style 40 -Стиль 40 -Style 41 -Стиль 41 -Style 42 -Стиль 42 -Style 43 -Стиль 43 -Style 44 -Стиль 44 -Style 45 -Стиль 45 -Style 46 -Стиль 46 -Style 47 -Стиль 47 -Style 48 -Стиль 48 -Left eye -Левый глаз -Right eye -Правый глаз -Mouth -Рот -Discreet -Сдержанный -Nipples Style -Тип сосков -Light -Светлые -Pussy -Киска -Light 1 -Светлая 1 -Light 2 -Светлая 2 -Light 3 -Светлая 3 -Dark 1 -Темная 1 -Dark 2 -Темная 2 -Dark 3 -Темная 3 -Eyebrows -Брови -Blush -Румянец -Fluids -жидкости -Emoticon -Смайлик -Eyebrows -Брови -Hands -Руки -Default -По умолчанию -Head -Голова -Feet -Ступни -Nylon Rope -нейлоновая веревка -Hemp Rope -пеньковая веревка -Leather Belt -кожаный ремень -Sturdy Leather Belt -Прочный Кожаный Ремень -Irish 8 Feet Cuffs -Манжеты для ступней -Suspension Hemp Rope -Подвеска Пенькового Каната -Duct Tape -клейкая лента -Leather Ankle Cuffs -Кожаные Манжеты для Щиколоток -Floor Shackles -Напольные кандалы -Steel Ankle Cuffs -Стальные манжеты на щиколотке -Futuristic Ankle Cuffs -Футуристические манжеты на лодыжках -Ornate Ankle Cuffs -Богато украшенные манжеты на щиколотках - Metal Leg Spreader -Металическая распорка -Ball And Chain -Ядро на цепи - Ankle Shackles -Кандалы На Лодыжки -Zip Ties -Стяжки -Chains -Цепи -Spreader Dildo Bar -Распорка с фаллоимитатором стержнем -Vibrating Spreader Dildo Bar -Распорка с вибрирующим фаллоимитатором стержнем -Plastic Wrap -Пластиковая упаковка -Wooden Cuffs -Деревянные манжеты -Medical Bed Restraints -Ограничения для медицинских кроватей -Suspension Cuffs -Подвесные манжеты -Slime -Слайм -Legs -Ноги -Leather Leg Cuffs -Кожаные наножники -Futuristic Leg Cuffs -Футуристические манжеты для ног -Ornate Leg Cuffs -Изысканные манжеты на ноги -Leg Binder -Стяжка для ног -Hobble Skirt -узкая юбка -Wooden Horse -Деревянная лошадь -Seamless Leg Binder -Бесшовное перевязочное устройство для ног -Seamless Hobble Skirt -Бесшовная узкая юбка -Zip Ties -Стяжки -Frog-tie Straps -Ремни-лягушки - Mermaid Tail - Хвост русалки -Vulva -Вульва -Vibrating Egg -Вибрирующее Яйцо -Vibrating Wand -Вибруящая палочка -Vibrating Items Remote -Дистанционная виброигрушка -Vibrating Latex Panties -Вибрирующие Латексные Трусики -Wand Belt -Ремнь для палочки -Penis Dildo -пенис фаллоимитатор -Shock Dildo -Шоковый фаллоимитатор -Vibrating Dildo -Вибрационный Фаллоимитатор -Inflatable Vibrating Dildo -Надувной Вибрационный Фаллоимитатор -Clitoral Stimulator -Стимулятор Клитора -Clitoris Suction Cup -Присоска для клитора -Tape Strips -Ленты -Pair Of Ben Wa Balls -пара вагинальных шариков -Heavy Weight Clamp -Тяжелый зажим -Futuristic Vibrator -Футуристичный вибратор -Wand -Палочка -Clitoris & Dildo Vibrating belt -Клитор и вибрирующий фаллоимитатор пояс -Hemp Rope Wand Belt -Пояс для жезлов из пеньковой веревки -Wired Vibrating Egg -Проводное вибрирующее яйцо -Lovers Vibrator -Любовный вибратор -Lovers Remote -Любовный пульт -Double Ended Dildo -Двусторонний дилдо -Clitoris -Клитор -Straight Clitoris Piercing -Прямой Клитор Пирсинг -Round Clitoris Piercing -Круглый пирсинг клитора -Weighted Clitoris Piercing -Пирсинг клитора с утяжелением -Barbell Clitoris Piercing -Пирсинг клитора штангой -Chastity Vulva Piercings -Целомудрие Пирсинг вульвы -Chastity Vulva Shield -Целомудрие вульва щит -High Security Vulva Shield -Щит вульвы повышенной безопасности -Jewel Clitoris Piercing -Пирсинг клитора с драгоценными камнями -Adorned Clitoris Piercing -Украшенный пирсинг клитора -Vibrating Heart Clitoris Piercing -Вибрирующее сердце, пирсинг клитора -Bell Clitoris Piercing -Колокольчик Пирсинг Клитора -Taped Vibrating Egg -Приклеенное вибрирующее яйцо -Clitoris Ring -Клитор Кольцо -Butt -Попа -Black Butt Plug -Черная Анальная Пробка -Penis Butt Plug -Анальная пробка Пенис -Kitty Butt Plug -Анальная Пробка с хвостом кошки -Horse Butt Plug -Анальная Пробка с хвостом лошади -Horse ButtPlug -Анальная Пробка с хвостом лошади -Puppy Butt Plug -Анальная Пробка с хвостом щенка -Puppy Fluffy Butt Plug -Пушистая анальная пробка для щенков -Succubus Butt Plug -Анальная Пробка с хвостом суккубы -Succubus Tail -Хвост Суккуба -Succubus Heart Butt Plug -Анальная пробка с сердцем суккуба -Fox Tails -Хвост лисы -Raccoon Butt Plug -Анальная Пробка с хвостом енота -Raccoon Tail Plug -пробка хвост енота -Anal Beads -Анальные Шарики -Anal Beads XL -Анальные Шарики XL -Butt Pump -Анальная Помпа -Vibrating Butt Plug -ВиброАнальная Пробка -Inflatable Vibrating Butt Plug -Надувная ВиброАнальная Пробка -Anal Hook -Анальный Крюк -Butt Plug Lock -Анальная пробка Замок -Light Kitten Tail -Светлый хвост котенка -Small Fluffy Kitten Tail -Маленький пушистый хвост котенка -Fox Tail Small -Маленький лисий хвост -Fox Tail Large -Лисий Хвост Большой -Wolf Tail Large -Волчий Хвост Большой -Wolf Tail Small -Волчий Хвост Маленький -Wolf Tail White -Волчий Хвост Белый -Demon Tail Plug -Пробка Хвост Демона -Mouse Tail 1 -Мышиный хвост 1 -Mouse Tail 2 -Мышиный хвост 2 -White Bunny Tail Plug -Пробка белого хвоста кролика -Brown Bunny Tail Plug -Пробка коричневого хвоста кролика -Bunny Tail Vibe Plug -Вибропробка хвоста кролика -Egg Vibe Plug XXL -Виброяйцо пробка XXL -Shock Plug -Шоковая пробка -Cow Tail -Коровий хвост -Hollow Butt Plug -Полая анальная пробка -Locking Vibrating Butt Plug -Фиксирующая вибрационная анальная пробка -Pelvis -Таз -Strap-On Panties -Трусики-старпон -Leather Chastity Belt -Кожаный Пояс Верности -Sleek Leather Chastity Belt -Гладкий кожаный пояс целомудрия -Studded Chastity Belt -Шипованный Пояс Верности -Metal Chastity Belt -Металлический Пояс Верности -Polished Chastity Belt -Полированный Пояс Верности -Futuristic Chastity Belt -Футуристический пояс целомудрия -Futuristic Training Belt -Футуристический тренировочный пояс -Sci-Fi Pleasure Panties -Научно-фантастические трусики удовольствия -Ornate Chastity Belt -Богато украшенный пояс верности -Steel Chastity Panties -Стальные трусики целомудрия -Love Chastity Belt -Пояс Верности Любви -Spanking Toys -Игрушки для порки -Rope Harness -Веревочная Упряжь -Diaper Harness -Подгузник Упряжь -Pelvis Chain Leash -Цепной поводок для таза -Bulky Chastity Diaper -Громоздкий подгузник целомудрия -Poofy Chastity Diaper -Пушистый подгузник целомудрия -Hybrid Chastity Belt -Гибридный пояс целомудрия -Torso -Туловище -Leather Harness -Кожаная Сбруя -Leather Strap Body Harness -Кожаный Ремень Сбруя Для Тела -Adult Baby Harness -Сбруя для взрослого ребенка -Futuristic Harness -Футуристическая сбруя -High Security Harness -Ремни повышенной безопасности - Crotch Chain - промежностная цепь -Heavy Latex Corset -Тяжелый латексный корсет -Thin Leather Straps -Тонкие кожаные ремешки -Nipples -Соски -Nipple Clamps -Зажимы Для Сосков -Vibrating Nipple Clamps -ВиброЗажимы Для Сосков -Vibrating Clamps Remote -ВиброЗажимы Дистанционные -Chain Clamp -Зажимы с цепочкой -Screw Clamps -винтовой зажим -Chain Tassles -кисточки на цепочке -Heart Pasties -накладки с сердечками -Taped Vibrating Eggs -Вибрирующие Яйца -Nipple Suction Cups -Присоски Для Сосков -Pair Of Nipple Tapes -Пара Лент для сосков -Chopstick Nipple Clamps -зажимы для сосков из палочек для еды -Kitty Pasties -накладки с кошечками -Clothespins -Прищепки -Nipple Weight Clamps -Зажимы с весом для сосков -Nipple Bell Clamps -Зажимы колокольчики для сосков -Lactation Pump -Насос для лактации -Shock Clamps -Шоковые зажимы - Plate Clamps - Пластинчатые зажимы -Nipple Stretchers -Растяжки для сосков -Straight Piercings -Прямой Пирсинг -Round Piercings -Круглый Пирсинг -Weighted Piercing -Утяжеленный Пирсинг -Necklace Nipple Chain -Ожерелье с цепочкой для сосков -Nipple Jewels -Драгоценности для сосков -Nipple Jewel Piercings -Драгоценный пирсинг для сосков -Nipple Gems Piercings -Пирсинг сосков с драгоценными камнями -Barbell Piercing -Пирсинг гантелька -Breast -Грудь -Chastity Guard Shield -Защитный щит Целомудрия -Chastity Cross Shield -Щит Целомудрия Крест -Vibrating Heart Piercings -Вибрирующий пирсинг сердца -Nipple Bell Piercings -пирсинг сосков колокольчик -Crossed Straight Piercings -Скрещенные Прямые Пирсинги -Breasts -Грудь -Metal Chastity Bra -Металлический бюстгальтер целомудрия -Polished Chastity Bra -Полированный бюстгальтер целомудрия -Futuristic Chastity Bra -Футуристический бюстгальтер целомудрия -Futuristic Bra -Футуристический бюстгальтер -Ornate Chastity Bra -Богато украшенный бюстгальтер целомудрия -Arms -Обьтья -Metal Cuffs -Металлические Манжеты -Leather Armbinder -Кожаный армбиндер -Armbinder Jacket -Куртка-армбиндер -Leather Cuffs -Кожаные Манжеты -Ceiling Shackles -Потолочные кандалы -Steel Cuffs -Стальные манжеты -Futuristic Cuffs -Футуристические манжеты -Ornate Cuffs -Изысканные манжеты -Mittens Chain -Цепочка для варежек -Four Limbs Shackles -Кандалы на четыре конечности -Manacles -Оковы -Full Body Shackles -Кандалы Для Всего Тела -Wrist Shackles -Наручные Кандалы -Latex Strait Leotard -Латексный узкий купальник -Futuristic Straitjacket -Футуристическая смирительная рубашка -Straitjacket -Смирительная рубашка -Collar Cuffs -Манжеты на ошейник -Leather Straitjacket -Кожаная Смирительная Рубашка -Fur Straitjacket -Меховая смирительная рубашка -Bolero Straitjacket -Смирительная рубашка-жакет -Pet Suit -Костюм питомца -Pet Suit Exposed -Костюм питомца Открытый -Holding Leash -Удерживающий Поводок -Strait Dress -Узкое Платье -Open Crotch Strait Dress -Узкое Платье с вырезом -Seamless Strait Dress -Бесшовное прямое платье -Seamless Open Crotch Strait Dress -Бесшовное прямое платье с открытой промежностью -Yoke -Хомут -Pillory -Позорный столб -Full LockDown Latex Suit -Латексный костюм с полной блокировкой -Latex Box-Tie Armbinder -Латексная Коробка-Галстук Армбиндер -Bondage Bouquet -Букет Бондажа -Holding Chain Leash -Удерживающий Цепной Поводок -Pet Crawler -Ползучий питомец -Mermaid Suit -Костюм Русалки -Web -Сеть -Latex Armbinder -Латексный Армбиндер -Futuristic Armbinder -Футуристический Армбиндер -Seamless Latex Armbinder -Бесшовный Латексный Армбиндер -Full Body Leather Harness -Кожаная сбруя для всего тела -Under Bed Bondage Cuff Set -Набор наручников для бондажа под кроватью -Tight Straitjacket -Узкая смирительная рубашка -Latex Sleeveless Leotard -Латексный купальник без рукавов -Latex Boxtie Leotard -Латексный купальник с завязками в виде коробки -Latex Butterfly Leotard -Латексный купальник с бабочкой -Prison Lockdown Suit -Тюремный Карантинный костюм -Leather Arm Splints -Кожаные шины для рук -Tightjacket Leotard -Купальник в обтяжку -High Security Straitjacket -Смирительная рубашка повышенной безопасности -Pantyhose fullBody -Колготки на все тело -Crotchless Pantyhose fullBody -Колготки без промежности на все тело -Inflatable Strait Leotard -Надувной Купальник в обтяжку -Strict Leather Pet Crawler -Строгий кожаный ползун для питомца -Transport Jacket -Транспортная куртка -Wrapped Blanket -Завернутое одеяло -Padded Mittens -Варежки с набивкой -Paw Mittens -Рукавицы Для Лап -Leather Mittens -Кожаные Варежки -Futuristic Mittens -Футуристические варежки -Padded Leather Mittens -Варежки Из Мягкой Кожи -Polished Steel Mittens -Рукавицы Из Полированной Стали -Handheld Items -Ручные предметы -Crop -Стек -Flogger -Флогер -Cane -Трость -Heart Crop -Стек-сердце -Paddle -Падл -Whip Paddle -Кнут падл -Whip -Кнут -Cattle Prod -Электрошокер -Tennis Racket -теннисная ракетка -Rainbow Wand -Радужная палочка -Gavel -Молоток -Feather -Перо -Feather Duster -Метелка из перьев -Long Duster -Длинный Пыльник -Ice Cube -Кубик льда -Wartenberg Wheel -Колесо Вартенберга -Vibrating Wand -Вибрирующая палочка -Small Vibe Wand -Маленькая вибрирующая палочка -Candle Wax -Свечной воск -Large Dildo -Большой фаллоимитатор -Pet Toy -Игрушка для питомца -Vibrator -Вибратор -Belt -Пояс -Hairbrush -Расческа -Small Dildo -Маленький фаллоимитатор -Electric Toothbrush -Электрическая зубная щетка -Toothbrush -Зубная щетка -Shock Wand -Шоковая палочка -Lotion -Лосьон -Ruler -Линейка -Foam Sword -Пластиковый меч -Vibrator Remote -Вибратор Пульт -Shock Remote -Шоковый пульт -Long Coiled Rope -Длинная спиральная веревка -Short Coiled Rope -Короткая спиральная веревка -Ballgag -кляп мяч -Long Sock -Длинный носок -Baguette -Багет -Duct Tape Roll -Рулон клейкой ленты -Spatula -Шпатель -Broom -Метла -Key -Ключ -Mobile Phone -Мобильный телефон -Mobile Phone 2 -Мобильный телефон 2 - Hoof Mittens - Рукавицы-копыта -Scissors -Ножницы -Plastic Wrap Roll -Пластиковый рулон -Empty Glass -Пустой стакан -Filled Glass -Заполненный стакан -Potion Bottle -Бутылка с зельем -Medical Injector -медицинский инъектор -Neck -Шея -Leather Collar -кожаный ошейник -Bell Collar -Ошейник с колокольчиком -Bow Collar -Ошейник с бантом -Slave Collar -Рабский Ошейник -Club Slave Collar -Клубный Рабский Ошейник -Shock Collar -шоковый ошейник -Automatic Shock Collar -Автоматический шоковый ошейник -Shock Collar Remote -шоковый ошейник дистанционный -Bat Collar -Ошейник Летучая Мышь -Posture Collar -Ошейник позиционнирующий -Steel Collar -Стальной ошейник -Dog Collar -Собачий ошейник -Spike Collar -Шипованый ошейник -High Collar -высокий ошейник -Futuristic Collar -Футуристический ошейник -Leather Choker -кожаный чокер -Pet Collar -ошейник для питомца -Maid Collar -Ошейник горничьной -Bordelle Collar -ошейник для борделя -Lover Leather Collar -Кожаный Ошейник любимой -Noble Corset Collar -Благородный корсетный воротник -Strict Posture Collar -Ошейник строгой осанки -Heart Collar -Ошейник-сердечко -Leather Corset Collar Gag -Кожаный корсет ошейник кляп -Latex Posture Collar Gag -Латексный позиционирующий ошейник с кляпом -High Security Collar -Ошейник повышенной безопасности -Ornate Collar -Богато украшенный ошейник -Slender Steel Collar -Тонкий стальной ошейник -Shiny Steel Collar -Блестящий стальной ошейник - Heart-Link Choker - Колье с сердечным звеном -Neck Rope -Веревка на шее -Nylon Collar -Нейлоновый ошейник -Gothic Collar -Готический ошейник -Inflated Latex Collar -Надутый латексный ошейник -Latex Collar -Латексный ошейник -Techno Collar -Техно Ошейник -Combo Harness -Комбинированная сбруя -Boned Neck Corset -Корсет с костяным воротником -Collar -Ошейник -Custom Tag -Пользовательский тег -Electronic Tag -Электронный тег -Bell -колокольчик -Bow -Бант -Shock Unit -шокирующие устройство -Automatic Shock Unit -Автоматическая шокирующяя установка -Name Tag -Именная метка -Oval Name Tag -Овальная табличка с именем -Pet Name Tag -Бирка с именем питомца -Lover Name Tag -Бирка с именем любовницы -Livestock Name Tag -Бирка с именем домашнего скота -Moon Pendant -Кулон Луны -Sun Pendant -Кулон Солнца -Lapis Pendant -Подвеска из лазурита -Pentagram Pendant -Подвеска с пентаграммой -Flower -Цветок -Rose -Роза -Cowbell -Колокольчик для коровы -Pup Bone -Щенячья кость -Long Chain -длинная цепочка -Short Chain -короткая цепочка -Hitching Post -Коновязный столб -Leash -поводок -Pulled Leash -поводок с натяжкой -Chain Leash -Цепной Поводок -Pulled Chain Leash -Натянутый Цепной Поводок -Medium Chain -Средняя Цепь -Long Rope -Длинная Веревка -Short Rope -Короткая Веревка -Medium Rope -Средняя Веревка -Cloth Gag -Тканевый Кляп -Wiffle Ball Gag -Кляп Бейсбольный Мяч -Harness Ball Gag -Кляп-шар со сбруей -Harness Panel Gag -Кляп-панель со сбруей -Ring Gag -Кляп-кольцо -Pacifier -Пустышка -Harness Pacifier -Пустышка со сбруей -Duster Gag -Тряпочный Кляп -Cup Holder Gag -Кляп для подстаканника -Bit Gag -Кусочек кляпа -Pump Gag -Накачиваемый кляп -Kitty Mask Gag -Кляп-маска кошечка -Kitty Mask -Кошачья маска -Kitty Harness Gag -Кляп кошечка со сбруей -Kitty Muzzle Gag -Кляп Кошачья Морда -Rubber Carrot Gag -Кляп резиновая морковь -Muzzle Gag -Кляп намордник -Neck Corset Gag -Шейный Корсет Кляп -Futuristic Panel Gag -Футуристическая Панель кляп -Futuristic Harness Panel Gag -Футуристический панельный Кляп -Futuristic Ball Gag -Футуристический Кляп с Мячом -Sleeping Pill -снотворное -Panties Mask -Трусики Маска -Plug Gag -Кляп пробка -Dildo Gag -Кляп Фаллоимитатор -Bone Gag -Кляп Кость -Chopstick Gag -Кляп из Палочек -Bamboo Gag -Бамбуковый Кляп -Harness Ball Gag XL -Кляп-шар XL со сбруей -Pumpkin Gag -Кляп Тыква -Lips Gag -Кляп Губы -Spider Gag -Кляп-Паук -Cloth Stuffing -Моток Ткани -Scarf -Шарф -Panty Stuffing -Начинка из трусиков -Chloroform Cloth -Хлороформ Ткань -Lewd Gag -Развратный Кляп -Deepthroat Penis Gag -глубокий заглот пенис кляп -Silicon Bit Gag -Силиконовый бит кляп -XL Bone Gag -XL Костяной кляп -Exposed Dog Muzzle -Открытая морда собаки -Foxy Harness Gag -Кляп в виде Лисьей Упряжи -Tongue Strap Gag -Кляп с Ремешком Для языка -Ball Gag Mask -Маска с кляпом во рту -Hook Gag Mask -Маска с кляпом на крючке -Dildo Plug Gag -Кляп с вилкой для фаллоимитатора -Steel Muzzle Gag -Стальной Кляп Намордник -Stitched Muzzle Gag -Сшитый Кляп Намордник -Latex Ball Muzzle Gag -Кляп намордник с Латексным Шариком -Sock Stuffing -Набивка из носков -Respirator Mask -Респираторная маска -Web Gag -Паутинный Кляп -Rope Gag -Веревочный Кляп -Milk Bottle -Бутылка для молока -Medical Mask -Медицинская маска -Nursery Milk -Детское молоко -Prison Lockdown Gag -Кляп для тюремного заключения -Shoe Gag -Кляп из обуви -Funnel Gag -Воронкообразный Кляп - Plastic Wrap - Пластиковая упаковка -Tennis Ball -Теннисный мяч -Futuristic Muzzle -Футуристический намордник -Iron Cage Muzzle -Намордник из железной клетки -Dental Gag -Зубной Кляп -Pacifier Gag -Кляп-пустышка -Tentacle -Тентакль -Harness OTN Plug Gag -Упряж OTN вилка кляп -Bridle Gag -Уздечка кляп - Latex Sheath Gag - Кляп в латексной оболочке - Mouthfeature Gag - Кляп для придания формы рту -Eyes -Глаза -Cloth Blindfold -Тканевая повязка -Scarf Blindfold -Позяка на глаза из Шарфа -Leather Blindfold -Кожаная повязка -Leather Hood -Кожаный капюшон -Leather Hood Eyes -Кожаный капюшон с глазами -Padded Blindfold -Мягкая повязка -Interactive Visor -Интерактивный визор -Futuristic Mask -Футуристическая маска -VR Headset -VR-гарнитура -Slim Leather Mask -Тонкая кожаная маска -Open Mouth Slim Mask -Тонкая маска с открытым ртом -Open Eyes Mouth Slim Mask -Тонкая маска для рта с открытыми глазами -Studded Blindfold -Шипованная повязка -Kitty Blindfold -Повязка кошечка -Small Blindfold -Маленькая повязка -Full Blindfold -Цельная повязка -Lewd Blindfold -Непристойная Повязка На Глазах -Latex Blindfold -Латексная Повязка На Глаза -Frilled Sleep Mask -Маска для сна с оборками -Blackout Lenses -Затемняющие линзы -Rope Blindfold -Веревочная Повязка На Глаза -Smooth Sleep Mask -Гладкая Маска для Сна -Prison Lockdown Blindfold -Тюремная повязка на глаза -Snorkel -Дыхательная трубка -Ribbon Blindfold -Повязка на глаза Из ленты -Medical Patches -Медицинские Пластыри -Smooth Latex Mask -Гладкая Латексная Маска -Nose -Нос -Nose Hook -Крючок для носа -Pig Nose -Свиной Нос -Nose Ring -Кольцо в носу -Nose Plugs -Затычки для носа -Barbel Piercing -Пирсинг штанги -Pig Nose Hook -Крючок Для Свиного Носа -Blanket Hood -Одеяло с капюшоном -Sealed Leather Hood -Герметичный Кожаный капюшон -Polished Steel Hood -Полированный стальной капюшон -Inflatable Hood -Надувной Капюшон -Gas Mask -Противогаз -Kigurumi Mask -Маска Кигуруми -Pumpkin Head -Тыквенная Голова -Sack Hood -Мешок Капюшон -Sensory Deprivation Hood -Капюшон Сенсорной депривации -Open Hair Latex Hood -Латексный Капюшон с Открытыми Волосами -Leather Hood -Кожаный Капюшон -Leather Hood Eyes -Глаза в кожаном Капюшоне -Dog Hood -Собачий Капюшон -Foxy Mask -Лисья маска -Pony Hood -Капюшон для пони -Leather Hood Mouth -Рот Кожаного Капюшона -Canvas Hood -Брезентовый Капюшон -GP-9 Gas Mask -GP-9 Противогаз -Gwen Hood -Гвен капюшон -Techno Helmet -Техно-Шлем -GGTS Helmet -GGTS Шлем -Lampshade Hood -Абажур Капот -Accent Hood -Капюшон с акцентом -Collar Hood -Ошейник-капюшон -Zipper Hood -Капюшон на молнии -Latex Habit Hood -Латексный Habit Капюшон -Cow Hood -Капюшон коровы -One-Way Glass Head Box -Односторонняя Стеклянная Головная коробка -Kitty Hood -Кошачий Капюшон -Latex Dog Hood -Латексный Капюшон Собаки -Light Duty Ear Plugs -Легкие Беруши -Heavy Duty Ear Plugs -Сверхмощные Беруши -Headphone Ear Plugs -Разъемы Для Наушников -Bluetooth Earbuds -Bluetooth-наушники -Futuristic Earphones -Футуристические Наушники -Headphones -Наушники -Body -Тело -Metal Padlock -Металлический Висячий Замок -Intricate Padlock -Замысловатый Висячий Замок -High-Security Padlock -Навесной замок повышенной безопасности -Five Minutes Padlock -Пятиминутный Висячий Замок -Combination Padlock -Кодовый Замок -Password Lock -Блокировка паролем -Timer Password Lock -Блокировка Паролем Таймера -Owner Padlock -Навесной Замок Хозяйки -Owner Timer Padlock -Навесной замок с Таймером Хозяйки -Lovers Padlock -Висячий замок влюбленных -Lovers Timer Padlock -Висячий замок влюбленных с таймером -Mistress Padlock -Висячий Замок Госпожи -Pandora's Box Padlock -Висячий замок ящика Пандоры -Mistress Timer Padlock -Замок с Таймером Госпожи -Exclusive Padlock -Эксклюзивный Навесной Замок -Safeword Padlock -Висячий замок Сейв-слова -Metal Padlock Key -Металлический Ключ -Owner Padlock Key -Ключ Хозяйки -Lovers Padlock Key -Ключ От Висячего замка Влюбленных -Mistress Padlock Key -Ключ Госпожи -Pandora's Box Padlock Key -Ключ от замка ящика Пандоры -Metal Cuffs Key -Металлический Ключ для Манжет -Lockpicks -Отмычки -Wooden Maid Tray -Деревянный Поднос Горничной -Wooden Maid Tray Full -Деревянный Поднос Горничной Полный -Secret Suitcase -Секретный Чемодан -Unlocked Suitcase -Незапертый чемодан -Wooden Paddle -Деревянный падл -Wooden Sign -Деревянная Вывеска -Serving Tray -Сервировочный поднос -Teddy Bear Set -Набор Плюшевых Мишек -Wooden Box -деревянный ящик -Small Wooden Box -Маленький деревянный ящик -Water filled milk can -Заполненная водой банка молока -Water torture Cell -Ячейка для пыток водой -Stand up cage -Ростовая клетка -Kennel -конура -Saddle Stand -Седельная Стойка -Burlap Sack -холщевый мешок -Inflatable Body Bag -Надувной мешок для тела -Fur Blanket Wrap -Обертывание Меховым одеялом -Bondage Bench -Скамья для Бондажа -Grill -Гриль -Halloween Monster Set -Набор монстров на Хэллоуин -Halloween Familiar Set -Хеллоуинский фамильярный набор -Vampire Coffin -Вампирский гроб -Cryogenic Capsule -Криогенная капсула -One Bar Prison -Одиночная стойка -Display Frame -Рамка дисплея -Sybian -Сибиан -Smooth Strap On -Гладкий Страпон -Studded Strap On -Страпон С Шипами -Display Case -Витрина -Small Display Case -Небольшая Витрина -Futuristic Crate -Футуристический ящик -Doll Box -Коробка для кукол -Exposed Head Wooden Box -Деревянная коробка с Открытой Головкой -Exposed Head Small Wooden Box -Открытая Головка Маленькая Деревянная Коробка -Wooden Stocks -Деревянные Колодки -Vacbed -Вакуумная кровать -Clear Vacbed -Прозрачная вакуумная кровать -Crib -Детская кроватка -Bed -Кровать -St. Andrews Cross -Андреевский крест -Changing Table -Пеленальный Столик -Locker -Запирающийся шкафчик -Small Locker -Маленький Шкафчик -Concealing Cloak -Скрывающий Плащ -Heavy Kennel -Большая Конура -Pet Bed -Кровать питомцев -Transport Box -Транспортная коробка -Vac-Cube -Вакуумный куб -Pet Bowl -Миска для питомцев -Pole -Шест -Cushion -Подушка -Wet Floor Sign -Знак Мокрого Пола -Vacuum Bed Deluxe -Вакуумная Кровать Делюкс -Fuck Machine -Трахательная Машина -Net -Сеть -Snowman -Снеговик -Medical Bed -Медицинская кровать -Wooden Rack -Деревянная Стойка -Wooden Horse -Деревянная лошадка -Blanket -Одеяло -Bed Ropes -Веревки для кровати -Bed Straps -Ремни для кровати -Bed Tape -Постельная клейкая лента -Bed Chains -Цепи для кровати -Ceiling Rope -Потолочный канат -Ceiling Chain -Потолочная цепь -Ballet Heels -Балетные Каблуки -Ballet Wedges -Балетные Клинья -Metal Toe Cuffs -Металлические Манжеты на пальцы ног -Leather Toe Cuffs -Кожаные Манжеты на пальцы ног -Toe Tie -стяжка на пальцы ног -Locking Heels -Запирающиеся Каблуки -Multi-Strap Locking Heels -Запирающиеся каблуки с несколькими ремешками -Locking Strap Shoes -Обувь с запирающимся Ремешком -Locking Full Shoes -Запирание Полных Ботинок -Futuristic Shoes -Футуристическая обувь -Locking Boots -Запирающиеся Ботинки -Short Leather Foot Mittens -Короткие Кожаные Варежки Для Ног -Toe Tape -Лента для пальцев ног -High Thigh Boots -Высокие плотные Сапоги До бедра -Monoheel -Моноколесо diff --git a/Assets/Female3DCG/Female3DCG_Types.d.ts b/Assets/Female3DCG/Female3DCG_Types.d.ts deleted file mode 100644 index 8eaa6f4ab..000000000 --- a/Assets/Female3DCG/Female3DCG_Types.d.ts +++ /dev/null @@ -1,177 +0,0 @@ -interface AssetGroupDefinition { - Asset: (AssetDefinition | string)[]; - Group: AssetGroupName; - ParentGroup?: string; - Category?: 'Appearance' | 'Item'; - Default?: boolean; - IsRestraint?: boolean; - AllowNone?: boolean; - AllowColorize?: boolean; - AllowCustomize?: boolean; - Random?: boolean; - Color?: string[]; - ParentSize?: string; - ParentColor?: string; - Clothing?: boolean; - Underwear?: boolean; - BodyCosplay?: boolean; - Hide?: AssetGroupName[]; - Block?: AssetGroupItemName[]; - Zone?: [number, number, number, number][]; - SetPose?: string[]; - AllowPose?: string[]; - AllowExpression?: string[]; - Effect?: EffectName[]; - MirrorGroup?: string; - RemoveItemOnRemove?: { Group: string, Name: string, Type?: string }[]; - Priority?: number; - Left?: number; - Top?: number; - FullAlpha?: boolean; - Blink?: boolean; - InheritColor?: string; - FreezeActivePose?: string[]; - PreviewZone?: [number, number, number, number]; - DynamicGroupName?: AssetGroupName; - MirrorActivitiesFrom?: string; - ColorSuffix?: { [string]: string}; -} - -interface AssetDefinition { - Name: string, - ParentItem?: string; - ParentGroup?: string | null; - Enable?: boolean; - Visible?: boolean; - Wear?: boolean; - /** Applying that asset triggers the following activity */ - Activity?: string; - AllowActivity?: string[]; - AllowActivityOn?: AssetGroupName[]; - BuyGroup?: string; - PrerequisiteBuyGroups?: string[]; - Effect?: EffectName[]; - Bonus?: string; - Block?: AssetGroupItemName[]; - Expose?: string[]; - Hide?: AssetGroupName[]; - HideItem?: string[]; - HideItemExclude?: string[]; - Require?: string[]; - SetPose?: string[]; - AllowPose?: string[]; - HideForPose?: string[]; - PoseMapping?: { [index: string]: string}; - AllowActivePose?: string[]; - WhitelistActivePose?: string[]; - Value?: number; - Difficulty?: number; - SelfBondage?: number; - SelfUnlock?: boolean; - ExclusiveUnlock?: boolean; - Random?: boolean; - RemoveAtLogin?: boolean; - Time?: number; - LayerVisibility?: boolean; - RemoveTime?: number; - RemoveTimer?: number; - MaxTimer?: number; - Priority?: number; - Left?: number; - Top?: number; - Height?: number; - Zoom?: number; - Alpha?: AlphaDefinition[]; - Prerequisite?: string | string[]; - Extended?: boolean; - AlwaysExtend?: boolean; - AlwaysInteract?: boolean; - AllowLock?: boolean; - IsLock?: boolean; - PickDifficulty?: number | null; - OwnerOnly?: boolean; - LoverOnly?: boolean; - ExpressionTrigger?: { Name: string, Group: string, Timer: number }[]; - RemoveItemOnRemove?: { Name: string, Group: string, Type?: string }[]; - AllowEffect?: EffectName[]; - AllowBlock?: AssetGroupItemName[]; - AllowType?: string[]; - DefaultColor?: ItemColor; - Opacity?: number; - MinOpacity?: number; - MaxOpacity?: number; - Audio?: string; - Category?: string[]; - Fetish?: string[]; - ArousalZone?: string; - IsRestraint?: boolean; - BodyCosplay?: boolean; - OverrideBlinking?: boolean; - DialogSortOverride?: DialogSortOrder; - DynamicDescription?: (C: Character) => string; - DynamicPreviewImage?: (C: Character) => string; - DynamicAllowInventoryAdd?: (C: Character) => boolean; - DynamicExpressionTrigger?: (C: Character) => ExpressionTrigger[] | null | undefined; - DynamicName?: (C: Character) => string; - DynamicGroupName?: AssetGroupName; - DynamicActivity?: (C: Character) => string | null | undefined; - DynamicAudio?: (C: Character) => string; - CharacterRestricted?: boolean; - AllowRemoveExclusive?: boolean; - InheritColor?: string; - DynamicBeforeDraw?: boolean; - DynamicAfterDraw?: boolean; - DynamicScriptDraw?: boolean; - HasType?: boolean; - AllowLockType?: string[]; - AllowColorize?: boolean; - AllowColorizeAll?: boolean; - AvailableLocations?: string[]; - OverrideHeight?: AssetOverrideHeight; - FreezeActivePose?: string[]; - DrawLocks?: boolean; - AllowExpression?: string[]; - MirrorExpression?: string; - FixedPosition?: boolean; - CustomBlindBackground?: any; - Layer?: AssetLayerDefinition[]; - Archetype?: string; - FuturisticRecolor?: boolean; - FuturisticRecolorDisplay?: boolean; - Attribute?: string[]; - HideItemAttribute?: string[]; - PreviewIcons?: InventoryIcon[]; - Tint?: TintDefinition[]; - DefaultTint?: string; - CraftGroup?: string; -} - -interface AssetLayerDefinition { - Name?: string; - AllowColorize?: boolean; - CopyLayerColor?: string; - ColorGroup?: string; - HideColoring?: boolean; - AllowTypes?: string[]; - HasType?: boolean; - Visibility?: string; - ParentGroup?: string | null, - AllowPose?: string[]; - Priority?: number; - InheritColor?: string; - Alpha?: AlphaDefinition[], - Left?: number; - Top?: number; - HideAs?: { Group: string, Asset?: string }; - FixedPosition?: boolean; - HasImage?: boolean; - Opacity?: number; - MinOpacity?: number; - MaxOpacity?: number; - LockLayer?: boolean; - MirrorExpression?: string; - HideForPose?: string[]; - PoseMapping?: { [index: string]: string }; - AllowModuleTypes?: string[]; - ModuleType?: string[]; -} diff --git a/Assets/Female3DCG/Fluids/DroolHigh/Fluids.png b/Assets/Female3DCG/Fluids/DroolHigh/Fluids.png deleted file mode 100644 index 864fe81e7..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolHigh/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolHigh/Icon.png b/Assets/Female3DCG/Fluids/DroolHigh/Icon.png deleted file mode 100644 index e360262a4..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolHigh/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolLow/Fluids.png b/Assets/Female3DCG/Fluids/DroolLow/Fluids.png deleted file mode 100644 index b6dab5246..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolLow/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolLow/Icon.png b/Assets/Female3DCG/Fluids/DroolLow/Icon.png deleted file mode 100644 index 25f909cb9..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolLow/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolMedium/Fluids.png b/Assets/Female3DCG/Fluids/DroolMedium/Fluids.png deleted file mode 100644 index 4abfbd217..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolMedium/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolMedium/Icon.png b/Assets/Female3DCG/Fluids/DroolMedium/Icon.png deleted file mode 100644 index 52e1b3720..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolMedium/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolMessy/Fluids.png b/Assets/Female3DCG/Fluids/DroolMessy/Fluids.png deleted file mode 100644 index ff81f8f1b..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolMessy/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolMessy/Icon.png b/Assets/Female3DCG/Fluids/DroolMessy/Icon.png deleted file mode 100644 index ea4afb5d9..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolMessy/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolSides/Fluids.png b/Assets/Female3DCG/Fluids/DroolSides/Fluids.png deleted file mode 100644 index 262fa2b5f..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolSides/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolSides/Icon.png b/Assets/Female3DCG/Fluids/DroolSides/Icon.png deleted file mode 100644 index e888f585c..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolSides/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolTearsHigh/Fluids.png b/Assets/Female3DCG/Fluids/DroolTearsHigh/Fluids.png deleted file mode 100644 index 031ff8128..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolTearsHigh/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolTearsHigh/Icon.png b/Assets/Female3DCG/Fluids/DroolTearsHigh/Icon.png deleted file mode 100644 index 568a89fcd..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolTearsHigh/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolTearsLow/Fluids.png b/Assets/Female3DCG/Fluids/DroolTearsLow/Fluids.png deleted file mode 100644 index 3697ceced..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolTearsLow/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolTearsLow/Icon.png b/Assets/Female3DCG/Fluids/DroolTearsLow/Icon.png deleted file mode 100644 index 8ebc3e666..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolTearsLow/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolTearsMedium/Fluids.png b/Assets/Female3DCG/Fluids/DroolTearsMedium/Fluids.png deleted file mode 100644 index 522bb18bd..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolTearsMedium/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolTearsMedium/Icon.png b/Assets/Female3DCG/Fluids/DroolTearsMedium/Icon.png deleted file mode 100644 index 3af1a949f..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolTearsMedium/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolTearsMessy/Fluids.png b/Assets/Female3DCG/Fluids/DroolTearsMessy/Fluids.png deleted file mode 100644 index 3b65f754e..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolTearsMessy/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolTearsMessy/Icon.png b/Assets/Female3DCG/Fluids/DroolTearsMessy/Icon.png deleted file mode 100644 index b6f0930bc..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolTearsMessy/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolTearsSides/Fluids.png b/Assets/Female3DCG/Fluids/DroolTearsSides/Fluids.png deleted file mode 100644 index e2ac30b07..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolTearsSides/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/DroolTearsSides/Icon.png b/Assets/Female3DCG/Fluids/DroolTearsSides/Icon.png deleted file mode 100644 index 5be44c8d3..000000000 Binary files a/Assets/Female3DCG/Fluids/DroolTearsSides/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/Fluids.png b/Assets/Female3DCG/Fluids/Fluids.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/Fluids/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/Icon.png b/Assets/Female3DCG/Fluids/Icon.png deleted file mode 100644 index fe8ef98ba..000000000 Binary files a/Assets/Female3DCG/Fluids/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/TearsHigh/Fluids.png b/Assets/Female3DCG/Fluids/TearsHigh/Fluids.png deleted file mode 100644 index cc91679aa..000000000 Binary files a/Assets/Female3DCG/Fluids/TearsHigh/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/TearsHigh/Icon.png b/Assets/Female3DCG/Fluids/TearsHigh/Icon.png deleted file mode 100644 index 01989e167..000000000 Binary files a/Assets/Female3DCG/Fluids/TearsHigh/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/TearsLow/Fluids.png b/Assets/Female3DCG/Fluids/TearsLow/Fluids.png deleted file mode 100644 index 65ca9ea07..000000000 Binary files a/Assets/Female3DCG/Fluids/TearsLow/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/TearsLow/Icon.png b/Assets/Female3DCG/Fluids/TearsLow/Icon.png deleted file mode 100644 index e1132771a..000000000 Binary files a/Assets/Female3DCG/Fluids/TearsLow/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/TearsMedium/Fluids.png b/Assets/Female3DCG/Fluids/TearsMedium/Fluids.png deleted file mode 100644 index 9fae037ad..000000000 Binary files a/Assets/Female3DCG/Fluids/TearsMedium/Fluids.png and /dev/null differ diff --git a/Assets/Female3DCG/Fluids/TearsMedium/Icon.png b/Assets/Female3DCG/Fluids/TearsMedium/Icon.png deleted file mode 100644 index 18cb99789..000000000 Binary files a/Assets/Female3DCG/Fluids/TearsMedium/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt2_Large.png b/Assets/Female3DCG/Garters/GarterBelt2_Large.png deleted file mode 100644 index 2eb4798f8..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt2_Normal.png b/Assets/Female3DCG/Garters/GarterBelt2_Normal.png deleted file mode 100644 index 22860d2e4..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt2_Small.png b/Assets/Female3DCG/Garters/GarterBelt2_Small.png deleted file mode 100644 index 71b257026..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt2_XLarge.png b/Assets/Female3DCG/Garters/GarterBelt2_XLarge.png deleted file mode 100644 index e7b900163..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt_Large_Left.png b/Assets/Female3DCG/Garters/GarterBelt_Large_Left.png deleted file mode 100644 index 0fdf2476f..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt_Large_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt_Large_Right.png b/Assets/Female3DCG/Garters/GarterBelt_Large_Right.png deleted file mode 100644 index 80a844996..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt_Large_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt_Normal_Left.png b/Assets/Female3DCG/Garters/GarterBelt_Normal_Left.png deleted file mode 100644 index 8a7c95587..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt_Normal_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt_Normal_Right.png b/Assets/Female3DCG/Garters/GarterBelt_Normal_Right.png deleted file mode 100644 index 57014aad0..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt_Normal_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt_Small_Left.png b/Assets/Female3DCG/Garters/GarterBelt_Small_Left.png deleted file mode 100644 index a95b86619..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt_Small_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt_Small_Right.png b/Assets/Female3DCG/Garters/GarterBelt_Small_Right.png deleted file mode 100644 index c079a6891..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt_Small_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt_XLarge_Left.png b/Assets/Female3DCG/Garters/GarterBelt_XLarge_Left.png deleted file mode 100644 index 90831a143..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt_XLarge_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/GarterBelt_XLarge_Right.png b/Assets/Female3DCG/Garters/GarterBelt_XLarge_Right.png deleted file mode 100644 index b15090b11..000000000 Binary files a/Assets/Female3DCG/Garters/GarterBelt_XLarge_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt2_Large.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt2_Large.png deleted file mode 100644 index fc5e31645..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt2_Normal.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt2_Normal.png deleted file mode 100644 index bad68e232..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt2_Small.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt2_Small.png deleted file mode 100644 index b2bf1e4a2..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt2_XLarge.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt2_XLarge.png deleted file mode 100644 index c205402e0..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Large_Left.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt_Large_Left.png deleted file mode 100644 index 5a46a421a..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Large_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Large_Right.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt_Large_Right.png deleted file mode 100644 index e68808a8e..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Large_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Normal_Left.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt_Normal_Left.png deleted file mode 100644 index f1de527bd..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Normal_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Normal_Right.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt_Normal_Right.png deleted file mode 100644 index 768773ec7..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Normal_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Small_Left.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt_Small_Left.png deleted file mode 100644 index 92090b2bc..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Small_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Small_Right.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt_Small_Right.png deleted file mode 100644 index 63a2a442a..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt_Small_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt_XLarge_Left.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt_XLarge_Left.png deleted file mode 100644 index 9abd2983d..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt_XLarge_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/GarterBelt_XLarge_Right.png b/Assets/Female3DCG/Garters/Kneel/GarterBelt_XLarge_Right.png deleted file mode 100644 index 767ab0710..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/GarterBelt_XLarge_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/Tentacles_Large_Shine.png b/Assets/Female3DCG/Garters/Kneel/Tentacles_Large_Shine.png deleted file mode 100644 index 057752abf..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/Tentacles_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/Tentacles_Large_Tentacle.png b/Assets/Female3DCG/Garters/Kneel/Tentacles_Large_Tentacle.png deleted file mode 100644 index 25eb3c9b1..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/Tentacles_Large_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/Tentacles_Normal_Shine.png b/Assets/Female3DCG/Garters/Kneel/Tentacles_Normal_Shine.png deleted file mode 100644 index 1874731c2..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/Tentacles_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/Tentacles_Normal_Tentacle.png b/Assets/Female3DCG/Garters/Kneel/Tentacles_Normal_Tentacle.png deleted file mode 100644 index 232abc6d3..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/Tentacles_Normal_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/Tentacles_Small_Shine.png b/Assets/Female3DCG/Garters/Kneel/Tentacles_Small_Shine.png deleted file mode 100644 index b35aff592..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/Tentacles_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/Tentacles_Small_Tentacle.png b/Assets/Female3DCG/Garters/Kneel/Tentacles_Small_Tentacle.png deleted file mode 100644 index c2562cfcc..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/Tentacles_Small_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/Tentacles_XLarge_Shine.png b/Assets/Female3DCG/Garters/Kneel/Tentacles_XLarge_Shine.png deleted file mode 100644 index cbc5fd586..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/Tentacles_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Kneel/Tentacles_XLarge_Tentacle.png b/Assets/Female3DCG/Garters/Kneel/Tentacles_XLarge_Tentacle.png deleted file mode 100644 index b19954a25..000000000 Binary files a/Assets/Female3DCG/Garters/Kneel/Tentacles_XLarge_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_Large.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_Large.png deleted file mode 100644 index f7693a2f0..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_Normal.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_Normal.png deleted file mode 100644 index b90bb6050..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_Small.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_Small.png deleted file mode 100644 index f6d5f7168..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_XLarge.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_XLarge.png deleted file mode 100644 index 2048802cf..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Large_Left.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Large_Left.png deleted file mode 100644 index 26a2618de..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Large_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Large_Right.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Large_Right.png deleted file mode 100644 index ba7817073..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Large_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Normal_Left.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Normal_Left.png deleted file mode 100644 index 2e63759f6..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Normal_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Normal_Right.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Normal_Right.png deleted file mode 100644 index deda8b72b..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Normal_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Small_Left.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Small_Left.png deleted file mode 100644 index 0d49a8d9b..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Small_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Small_Right.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Small_Right.png deleted file mode 100644 index c83160680..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_Small_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_XLarge_Left.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_XLarge_Left.png deleted file mode 100644 index 8772c3be1..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_XLarge_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_XLarge_Right.png b/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_XLarge_Right.png deleted file mode 100644 index c37e31f85..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/GarterBelt_XLarge_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Large_Shine.png b/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Large_Shine.png deleted file mode 100644 index 65c7913f3..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Large_Tentacle.png b/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Large_Tentacle.png deleted file mode 100644 index 334c825a7..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Large_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Normal_Shine.png b/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Normal_Shine.png deleted file mode 100644 index 407bd76f7..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Normal_Tentacle.png b/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Normal_Tentacle.png deleted file mode 100644 index 23fd45ea6..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Normal_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Small_Shine.png b/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Small_Shine.png deleted file mode 100644 index 6727a81b4..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Small_Tentacle.png b/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Small_Tentacle.png deleted file mode 100644 index 1a4a71e81..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_Small_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_XLarge_Shine.png b/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_XLarge_Shine.png deleted file mode 100644 index c51e54c7b..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_XLarge_Tentacle.png b/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_XLarge_Tentacle.png deleted file mode 100644 index 302527bca..000000000 Binary files a/Assets/Female3DCG/Garters/KneelingSpread/Tentacles_XLarge_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_Large.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_Large.png deleted file mode 100644 index 0f9a2384c..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_Normal.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_Normal.png deleted file mode 100644 index ca798c18f..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_Small.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_Small.png deleted file mode 100644 index feae39e36..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_XLarge.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_XLarge.png deleted file mode 100644 index 2ef091667..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Large_Left.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Large_Left.png deleted file mode 100644 index 5a46a421a..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Large_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Large_Right.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Large_Right.png deleted file mode 100644 index ad69e5572..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Large_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Normal_Left.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Normal_Left.png deleted file mode 100644 index f1de527bd..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Normal_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Normal_Right.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Normal_Right.png deleted file mode 100644 index 67c9f5e1b..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Normal_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Small_Left.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Small_Left.png deleted file mode 100644 index 92090b2bc..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Small_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Small_Right.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Small_Right.png deleted file mode 100644 index d277a5d91..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_Small_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_XLarge_Left.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_XLarge_Left.png deleted file mode 100644 index e292b15bb..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_XLarge_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_XLarge_Right.png b/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_XLarge_Right.png deleted file mode 100644 index 317c283ff..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/GarterBelt_XLarge_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Large_Shine.png b/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Large_Shine.png deleted file mode 100644 index e991643fc..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Large_Tentacle.png b/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Large_Tentacle.png deleted file mode 100644 index 1fad952a3..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Large_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Normal_Shine.png b/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Normal_Shine.png deleted file mode 100644 index 1874731c2..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Normal_Tentacle.png b/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Normal_Tentacle.png deleted file mode 100644 index 232abc6d3..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Normal_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Small_Shine.png b/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Small_Shine.png deleted file mode 100644 index b35aff592..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Small_Tentacle.png b/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Small_Tentacle.png deleted file mode 100644 index c2562cfcc..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_Small_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_XLarge_Shine.png b/Assets/Female3DCG/Garters/LegsClosed/Tentacles_XLarge_Shine.png deleted file mode 100644 index d89b3544a..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_XLarge_Tentacle.png b/Assets/Female3DCG/Garters/LegsClosed/Tentacles_XLarge_Tentacle.png deleted file mode 100644 index 993d50795..000000000 Binary files a/Assets/Female3DCG/Garters/LegsClosed/Tentacles_XLarge_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Preview/GarterBelt.png b/Assets/Female3DCG/Garters/Preview/GarterBelt.png deleted file mode 100644 index b7c4b1cc9..000000000 Binary files a/Assets/Female3DCG/Garters/Preview/GarterBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Preview/GarterBelt2.png b/Assets/Female3DCG/Garters/Preview/GarterBelt2.png deleted file mode 100644 index 4daa2eda9..000000000 Binary files a/Assets/Female3DCG/Garters/Preview/GarterBelt2.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Preview/Tentacles.png b/Assets/Female3DCG/Garters/Preview/Tentacles.png deleted file mode 100644 index 510ea7c8a..000000000 Binary files a/Assets/Female3DCG/Garters/Preview/Tentacles.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt2_Large.png b/Assets/Female3DCG/Garters/Spread/GarterBelt2_Large.png deleted file mode 100644 index fa97ad7b0..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt2_Normal.png b/Assets/Female3DCG/Garters/Spread/GarterBelt2_Normal.png deleted file mode 100644 index bbc3a1d4f..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt2_Small.png b/Assets/Female3DCG/Garters/Spread/GarterBelt2_Small.png deleted file mode 100644 index 17ec5b02e..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt2_XLarge.png b/Assets/Female3DCG/Garters/Spread/GarterBelt2_XLarge.png deleted file mode 100644 index 9d1256c01..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt_Large_Left.png b/Assets/Female3DCG/Garters/Spread/GarterBelt_Large_Left.png deleted file mode 100644 index eb7467082..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt_Large_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt_Large_Right.png b/Assets/Female3DCG/Garters/Spread/GarterBelt_Large_Right.png deleted file mode 100644 index 78a2e9604..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt_Large_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt_Normal_Left.png b/Assets/Female3DCG/Garters/Spread/GarterBelt_Normal_Left.png deleted file mode 100644 index 814199b2a..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt_Normal_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt_Normal_Right.png b/Assets/Female3DCG/Garters/Spread/GarterBelt_Normal_Right.png deleted file mode 100644 index 7e3e061f6..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt_Normal_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt_Small_Left.png b/Assets/Female3DCG/Garters/Spread/GarterBelt_Small_Left.png deleted file mode 100644 index 569d58122..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt_Small_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt_Small_Right.png b/Assets/Female3DCG/Garters/Spread/GarterBelt_Small_Right.png deleted file mode 100644 index bb89f6f73..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt_Small_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt_XLarge_Left.png b/Assets/Female3DCG/Garters/Spread/GarterBelt_XLarge_Left.png deleted file mode 100644 index 79337a692..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt_XLarge_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/GarterBelt_XLarge_Right.png b/Assets/Female3DCG/Garters/Spread/GarterBelt_XLarge_Right.png deleted file mode 100644 index 22f923566..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/GarterBelt_XLarge_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/Tentacles_Large_Shine.png b/Assets/Female3DCG/Garters/Spread/Tentacles_Large_Shine.png deleted file mode 100644 index 3cc3358b2..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/Tentacles_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/Tentacles_Large_Tentacle.png b/Assets/Female3DCG/Garters/Spread/Tentacles_Large_Tentacle.png deleted file mode 100644 index 6d0f1d0fc..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/Tentacles_Large_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/Tentacles_Normal_Shine.png b/Assets/Female3DCG/Garters/Spread/Tentacles_Normal_Shine.png deleted file mode 100644 index 19ba3c1f6..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/Tentacles_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/Tentacles_Normal_Tentacle.png b/Assets/Female3DCG/Garters/Spread/Tentacles_Normal_Tentacle.png deleted file mode 100644 index 045e4e3d2..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/Tentacles_Normal_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/Tentacles_Small_Shine.png b/Assets/Female3DCG/Garters/Spread/Tentacles_Small_Shine.png deleted file mode 100644 index 95b889433..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/Tentacles_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/Tentacles_Small_Tentacle.png b/Assets/Female3DCG/Garters/Spread/Tentacles_Small_Tentacle.png deleted file mode 100644 index e30090a05..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/Tentacles_Small_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/Tentacles_XLarge_Shine.png b/Assets/Female3DCG/Garters/Spread/Tentacles_XLarge_Shine.png deleted file mode 100644 index 5ec51d57b..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/Tentacles_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Spread/Tentacles_XLarge_Tentacle.png b/Assets/Female3DCG/Garters/Spread/Tentacles_XLarge_Tentacle.png deleted file mode 100644 index 04a904ed0..000000000 Binary files a/Assets/Female3DCG/Garters/Spread/Tentacles_XLarge_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Tentacles_Large_Shine.png b/Assets/Female3DCG/Garters/Tentacles_Large_Shine.png deleted file mode 100644 index 68467f048..000000000 Binary files a/Assets/Female3DCG/Garters/Tentacles_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Tentacles_Large_Tentacle.png b/Assets/Female3DCG/Garters/Tentacles_Large_Tentacle.png deleted file mode 100644 index 56952b301..000000000 Binary files a/Assets/Female3DCG/Garters/Tentacles_Large_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Tentacles_Normal_Shine.png b/Assets/Female3DCG/Garters/Tentacles_Normal_Shine.png deleted file mode 100644 index f3162f653..000000000 Binary files a/Assets/Female3DCG/Garters/Tentacles_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Tentacles_Normal_Tentacle.png b/Assets/Female3DCG/Garters/Tentacles_Normal_Tentacle.png deleted file mode 100644 index 3baa83dfe..000000000 Binary files a/Assets/Female3DCG/Garters/Tentacles_Normal_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Tentacles_Small_Shine.png b/Assets/Female3DCG/Garters/Tentacles_Small_Shine.png deleted file mode 100644 index 36ebcb319..000000000 Binary files a/Assets/Female3DCG/Garters/Tentacles_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Tentacles_Small_Tentacle.png b/Assets/Female3DCG/Garters/Tentacles_Small_Tentacle.png deleted file mode 100644 index 3b27e26c6..000000000 Binary files a/Assets/Female3DCG/Garters/Tentacles_Small_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Tentacles_XLarge_Shine.png b/Assets/Female3DCG/Garters/Tentacles_XLarge_Shine.png deleted file mode 100644 index a28ce79cf..000000000 Binary files a/Assets/Female3DCG/Garters/Tentacles_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Garters/Tentacles_XLarge_Tentacle.png b/Assets/Female3DCG/Garters/Tentacles_XLarge_Tentacle.png deleted file mode 100644 index 02640e469..000000000 Binary files a/Assets/Female3DCG/Garters/Tentacles_XLarge_Tentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/CatGlasses.png b/Assets/Female3DCG/Glasses/CatGlasses.png deleted file mode 100644 index 13f9b25f2..000000000 Binary files a/Assets/Female3DCG/Glasses/CatGlasses.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/CatGlassesBack.png b/Assets/Female3DCG/Glasses/CatGlassesBack.png deleted file mode 100644 index 13f9b25f2..000000000 Binary files a/Assets/Female3DCG/Glasses/CatGlassesBack.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/EyePatch1.png b/Assets/Female3DCG/Glasses/EyePatch1.png deleted file mode 100644 index c89660832..000000000 Binary files a/Assets/Female3DCG/Glasses/EyePatch1.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/EyePatch1Right.png b/Assets/Female3DCG/Glasses/EyePatch1Right.png deleted file mode 100644 index 17a4be087..000000000 Binary files a/Assets/Female3DCG/Glasses/EyePatch1Right.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Glasses1.png b/Assets/Female3DCG/Glasses/Glasses1.png deleted file mode 100644 index 5ddf647ee..000000000 Binary files a/Assets/Female3DCG/Glasses/Glasses1.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Glasses2.png b/Assets/Female3DCG/Glasses/Glasses2.png deleted file mode 100644 index 303ad3e4c..000000000 Binary files a/Assets/Female3DCG/Glasses/Glasses2.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Glasses3.png b/Assets/Female3DCG/Glasses/Glasses3.png deleted file mode 100644 index e424ce470..000000000 Binary files a/Assets/Female3DCG/Glasses/Glasses3.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Glasses4.png b/Assets/Female3DCG/Glasses/Glasses4.png deleted file mode 100644 index b3d4ed9b3..000000000 Binary files a/Assets/Female3DCG/Glasses/Glasses4.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Glasses5.png b/Assets/Female3DCG/Glasses/Glasses5.png deleted file mode 100644 index ce0a0ba5f..000000000 Binary files a/Assets/Female3DCG/Glasses/Glasses5.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Glasses6.png b/Assets/Female3DCG/Glasses/Glasses6.png deleted file mode 100644 index 6017f1814..000000000 Binary files a/Assets/Female3DCG/Glasses/Glasses6.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/GradientSunglassesFlatDipped_Frame.png b/Assets/Female3DCG/Glasses/GradientSunglassesFlatDipped_Frame.png deleted file mode 100644 index 4ca04466b..000000000 Binary files a/Assets/Female3DCG/Glasses/GradientSunglassesFlatDipped_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/GradientSunglassesFlatDipped_Glass.png b/Assets/Female3DCG/Glasses/GradientSunglassesFlatDipped_Glass.png deleted file mode 100644 index 5853534ab..000000000 Binary files a/Assets/Female3DCG/Glasses/GradientSunglassesFlatDipped_Glass.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/GradientSunglassesFlatUp_Frame.png b/Assets/Female3DCG/Glasses/GradientSunglassesFlatUp_Frame.png deleted file mode 100644 index b8b707320..000000000 Binary files a/Assets/Female3DCG/Glasses/GradientSunglassesFlatUp_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/GradientSunglassesFlatUp_Glass.png b/Assets/Female3DCG/Glasses/GradientSunglassesFlatUp_Glass.png deleted file mode 100644 index 4f9bebe56..000000000 Binary files a/Assets/Female3DCG/Glasses/GradientSunglassesFlatUp_Glass.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/GradientSunglassesGradDipped_Frame.png b/Assets/Female3DCG/Glasses/GradientSunglassesGradDipped_Frame.png deleted file mode 100644 index 4ca04466b..000000000 Binary files a/Assets/Female3DCG/Glasses/GradientSunglassesGradDipped_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/GradientSunglassesGradDipped_Glass.png b/Assets/Female3DCG/Glasses/GradientSunglassesGradDipped_Glass.png deleted file mode 100644 index 0f44069d5..000000000 Binary files a/Assets/Female3DCG/Glasses/GradientSunglassesGradDipped_Glass.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/GradientSunglasses_Frame.png b/Assets/Female3DCG/Glasses/GradientSunglasses_Frame.png deleted file mode 100644 index b8b707320..000000000 Binary files a/Assets/Female3DCG/Glasses/GradientSunglasses_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/GradientSunglasses_Glass.png b/Assets/Female3DCG/Glasses/GradientSunglasses_Glass.png deleted file mode 100644 index 197fa5f06..000000000 Binary files a/Assets/Female3DCG/Glasses/GradientSunglasses_Glass.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/CatGlasses.png b/Assets/Female3DCG/Glasses/Preview/CatGlasses.png deleted file mode 100644 index 82daf170b..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/CatGlasses.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/EyePatch1.png b/Assets/Female3DCG/Glasses/Preview/EyePatch1.png deleted file mode 100644 index c8c395e4c..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/EyePatch1.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/Glasses1.png b/Assets/Female3DCG/Glasses/Preview/Glasses1.png deleted file mode 100644 index d721d3434..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/Glasses1.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/Glasses2.png b/Assets/Female3DCG/Glasses/Preview/Glasses2.png deleted file mode 100644 index 5f3c42f6e..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/Glasses2.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/Glasses3.png b/Assets/Female3DCG/Glasses/Preview/Glasses3.png deleted file mode 100644 index b8fe490b8..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/Glasses3.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/Glasses4.png b/Assets/Female3DCG/Glasses/Preview/Glasses4.png deleted file mode 100644 index 6764083c6..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/Glasses4.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/Glasses5.png b/Assets/Female3DCG/Glasses/Preview/Glasses5.png deleted file mode 100644 index 4cfe08526..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/Glasses5.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/Glasses6.png b/Assets/Female3DCG/Glasses/Preview/Glasses6.png deleted file mode 100644 index 3aa216286..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/Glasses6.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/GradientSunglasses.png b/Assets/Female3DCG/Glasses/Preview/GradientSunglasses.png deleted file mode 100644 index 86dc328c3..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/GradientSunglasses.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/SunGlasses1.png b/Assets/Female3DCG/Glasses/Preview/SunGlasses1.png deleted file mode 100644 index 124b6afaf..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/SunGlasses1.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/SunGlasses2.png b/Assets/Female3DCG/Glasses/Preview/SunGlasses2.png deleted file mode 100644 index ba5ae345f..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/SunGlasses2.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/SunGlassesClear.png b/Assets/Female3DCG/Glasses/Preview/SunGlassesClear.png deleted file mode 100644 index 4e43f8a0a..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/SunGlassesClear.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/Preview/VGlasses.png b/Assets/Female3DCG/Glasses/Preview/VGlasses.png deleted file mode 100644 index 302dcaea7..000000000 Binary files a/Assets/Female3DCG/Glasses/Preview/VGlasses.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/SunGlasses1.png b/Assets/Female3DCG/Glasses/SunGlasses1.png deleted file mode 100644 index 2355b06d0..000000000 Binary files a/Assets/Female3DCG/Glasses/SunGlasses1.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/SunGlasses2.png b/Assets/Female3DCG/Glasses/SunGlasses2.png deleted file mode 100644 index 171bf5a66..000000000 Binary files a/Assets/Female3DCG/Glasses/SunGlasses2.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/SunGlassesClear.png b/Assets/Female3DCG/Glasses/SunGlassesClear.png deleted file mode 100644 index 18449eb94..000000000 Binary files a/Assets/Female3DCG/Glasses/SunGlassesClear.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/VGlasses_Frame.png b/Assets/Female3DCG/Glasses/VGlasses_Frame.png deleted file mode 100644 index 2861d79c4..000000000 Binary files a/Assets/Female3DCG/Glasses/VGlasses_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/Glasses/VGlasses_Glass.png b/Assets/Female3DCG/Glasses/VGlasses_Glass.png deleted file mode 100644 index 77b4b6a82..000000000 Binary files a/Assets/Female3DCG/Glasses/VGlasses_Glass.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/BikerGloves_Hands.png b/Assets/Female3DCG/Gloves/AllFours/BikerGloves_Hands.png deleted file mode 100644 index 0554b7ccd..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/BikerGloves_Hands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/BikerGloves_Straps.png b/Assets/Female3DCG/Gloves/AllFours/BikerGloves_Straps.png deleted file mode 100644 index a134bd9cd..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/BikerGloves_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Catsuit_Large.png b/Assets/Female3DCG/Gloves/AllFours/Catsuit_Large.png deleted file mode 100644 index 9fb62b493..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Catsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Catsuit_Normal.png b/Assets/Female3DCG/Gloves/AllFours/Catsuit_Normal.png deleted file mode 100644 index d80eafbe7..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Catsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Catsuit_Small.png b/Assets/Female3DCG/Gloves/AllFours/Catsuit_Small.png deleted file mode 100644 index c5c2f0c68..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Catsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Catsuit_XLarge.png b/Assets/Female3DCG/Gloves/AllFours/Catsuit_XLarge.png deleted file mode 100644 index cfa227511..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Catsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_Large.png b/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_Large.png deleted file mode 100644 index 56c9b16d8..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_Normal.png b/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_Normal.png deleted file mode 100644 index 93d41aa7e..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_Small.png b/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_Small.png deleted file mode 100644 index e9d650b4d..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_XLarge.png b/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_XLarge.png deleted file mode 100644 index 9064c7d90..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/CowPrintedGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_Large.png b/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_Large.png deleted file mode 100644 index ed1d06932..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_Normal.png b/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_Normal.png deleted file mode 100644 index 5d8696372..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_Small.png b/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_Small.png deleted file mode 100644 index bd6d012f3..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_XLarge.png b/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_XLarge.png deleted file mode 100644 index 51bce3229..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/FingerlessGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_Large.png b/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_Large.png deleted file mode 100644 index 06f4f4055..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_Normal.png b/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_Normal.png deleted file mode 100644 index 3f5f6b8ee..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_Small.png b/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_Small.png deleted file mode 100644 index 2e9f4f336..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_XLarge.png b/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_XLarge.png deleted file mode 100644 index 33ae5b952..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/FishnetGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves1_Large.png b/Assets/Female3DCG/Gloves/AllFours/Gloves1_Large.png deleted file mode 100644 index 0877ba1b1..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves1_Normal.png b/Assets/Female3DCG/Gloves/AllFours/Gloves1_Normal.png deleted file mode 100644 index 0dc28e72a..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves1_Small.png b/Assets/Female3DCG/Gloves/AllFours/Gloves1_Small.png deleted file mode 100644 index ac22b7071..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves1_XLarge.png b/Assets/Female3DCG/Gloves/AllFours/Gloves1_XLarge.png deleted file mode 100644 index 0e2a68fa8..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves2_Large.png b/Assets/Female3DCG/Gloves/AllFours/Gloves2_Large.png deleted file mode 100644 index a4b033dd6..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves2_Normal.png b/Assets/Female3DCG/Gloves/AllFours/Gloves2_Normal.png deleted file mode 100644 index 17e30b6d2..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves2_Small.png b/Assets/Female3DCG/Gloves/AllFours/Gloves2_Small.png deleted file mode 100644 index bbc35720d..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves2_XLarge.png b/Assets/Female3DCG/Gloves/AllFours/Gloves2_XLarge.png deleted file mode 100644 index 5c16e2b6a..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves3_Large.png b/Assets/Female3DCG/Gloves/AllFours/Gloves3_Large.png deleted file mode 100644 index 8d9263ee2..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves3_Normal.png b/Assets/Female3DCG/Gloves/AllFours/Gloves3_Normal.png deleted file mode 100644 index 703eea19d..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves3_Small.png b/Assets/Female3DCG/Gloves/AllFours/Gloves3_Small.png deleted file mode 100644 index 326bcd089..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/Gloves3_XLarge.png b/Assets/Female3DCG/Gloves/AllFours/Gloves3_XLarge.png deleted file mode 100644 index 87515598c..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/Gloves3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Large_Fabric.png b/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Large_Fabric.png deleted file mode 100644 index 7a2e3804c..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Large_Fur.png b/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Large_Fur.png deleted file mode 100644 index d511e013b..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Normal_Fabric.png b/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Normal_Fabric.png deleted file mode 100644 index bba52c165..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Normal_Fur.png b/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Normal_Fur.png deleted file mode 100644 index 7f4b70d1a..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Small_Fabric.png b/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Small_Fabric.png deleted file mode 100644 index d42da8be5..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Small_Fur.png b/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Small_Fur.png deleted file mode 100644 index a80e21855..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/AllFours/GlovesFur_XLarge_Fabric.png deleted file mode 100644 index 4824e5f0e..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_XLarge_Fur.png b/Assets/Female3DCG/Gloves/AllFours/GlovesFur_XLarge_Fur.png deleted file mode 100644 index e9054cee6..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/GlovesFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Large_Bands.png b/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Large_Bands.png deleted file mode 100644 index 7b2ab280a..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Large_Fabric.png b/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Large_Fabric.png deleted file mode 100644 index d752ef910..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Normal_Bands.png b/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Normal_Bands.png deleted file mode 100644 index d5e469a40..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Normal_Fabric.png b/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Normal_Fabric.png deleted file mode 100644 index 0adae5c13..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Small_Bands.png b/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Small_Bands.png deleted file mode 100644 index 3ac757e97..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Small_Fabric.png b/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Small_Fabric.png deleted file mode 100644 index 52e3edcdf..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_XLarge_Bands.png b/Assets/Female3DCG/Gloves/AllFours/HaremGlove_XLarge_Bands.png deleted file mode 100644 index aa6f205cc..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/AllFours/HaremGlove_XLarge_Fabric.png deleted file mode 100644 index 8327463b8..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/HaremGlove_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_Large.png b/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_Large.png deleted file mode 100644 index 81fcb1ead..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_Normal.png b/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_Normal.png deleted file mode 100644 index 81fcb1ead..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_Small.png b/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_Small.png deleted file mode 100644 index 81fcb1ead..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_XLarge.png b/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_XLarge.png deleted file mode 100644 index 0f5d8df87..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/LatexElbowGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/MistressGloves_Large.png b/Assets/Female3DCG/Gloves/AllFours/MistressGloves_Large.png deleted file mode 100644 index f428fba9f..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/MistressGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/MistressGloves_Normal.png b/Assets/Female3DCG/Gloves/AllFours/MistressGloves_Normal.png deleted file mode 100644 index 55a644fd0..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/MistressGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/MistressGloves_Small.png b/Assets/Female3DCG/Gloves/AllFours/MistressGloves_Small.png deleted file mode 100644 index c1d27634f..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/MistressGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/MistressGloves_XLarge.png b/Assets/Female3DCG/Gloves/AllFours/MistressGloves_XLarge.png deleted file mode 100644 index ed92b58bb..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/MistressGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_Large.png b/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_Large.png deleted file mode 100644 index 9235e0c76..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_Normal.png b/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_Normal.png deleted file mode 100644 index 11366384d..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_Small.png b/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_Small.png deleted file mode 100644 index 5125a83a5..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_XLarge.png b/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_XLarge.png deleted file mode 100644 index cdd543f36..000000000 Binary files a/Assets/Female3DCG/Gloves/AllFours/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_Large.png b/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_Large.png deleted file mode 100644 index c78f3da1d..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_Normal.png b/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_Normal.png deleted file mode 100644 index 7aac22302..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_Small.png b/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_Small.png deleted file mode 100644 index 5373458ff..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_XLarge.png b/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_XLarge.png deleted file mode 100644 index ea1d61ce1..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Catsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_Large.png b/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_Large.png deleted file mode 100644 index 75370bd8a..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_Normal.png b/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_Normal.png deleted file mode 100644 index 515ab7b7c..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_Small.png b/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_Small.png deleted file mode 100644 index 70b5e226b..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_XLarge.png deleted file mode 100644 index d6fefab04..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/CowPrintedGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_Large.png b/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_Large.png deleted file mode 100644 index ba49cbbda..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_Normal.png b/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_Normal.png deleted file mode 100644 index 2302e3a04..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_Small.png b/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_Small.png deleted file mode 100644 index 6ab68387e..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_XLarge.png deleted file mode 100644 index 8b83b926c..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/FingerlessGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_Large.png b/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_Large.png deleted file mode 100644 index 32ed1af42..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_Normal.png b/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_Normal.png deleted file mode 100644 index 6fc31bb37..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_Small.png b/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_Small.png deleted file mode 100644 index b5d145c5b..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_XLarge.png deleted file mode 100644 index 0c826902c..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/FishnetGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_Large.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_Large.png deleted file mode 100644 index 9d735a906..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_Normal.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_Normal.png deleted file mode 100644 index 57c7fdbfe..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_Small.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_Small.png deleted file mode 100644 index 024579349..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_XLarge.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_XLarge.png deleted file mode 100644 index 9383e13aa..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_Large.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_Large.png deleted file mode 100644 index 3d1c80f72..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_Normal.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_Normal.png deleted file mode 100644 index 8899c8dea..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_Small.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_Small.png deleted file mode 100644 index 304380771..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_XLarge.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_XLarge.png deleted file mode 100644 index 64d01247e..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_Large.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_Large.png deleted file mode 100644 index 8553245e2..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_Normal.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_Normal.png deleted file mode 100644 index 28b2e8233..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_Small.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_Small.png deleted file mode 100644 index 51a9f4ebe..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_XLarge.png b/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_XLarge.png deleted file mode 100644 index d2dcc7cca..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Gloves3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Large_Fabric.png b/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Large_Fabric.png deleted file mode 100644 index 3d1c80f72..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Large_Fur.png b/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Large_Fur.png deleted file mode 100644 index 1d28bb1f2..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Normal_Fabric.png b/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Normal_Fabric.png deleted file mode 100644 index 8899c8dea..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Normal_Fur.png b/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Normal_Fur.png deleted file mode 100644 index bc4e95be6..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Small_Fabric.png b/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Small_Fabric.png deleted file mode 100644 index 304380771..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Small_Fur.png b/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Small_Fur.png deleted file mode 100644 index 52eb72050..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_XLarge_Fabric.png deleted file mode 100644 index 64d01247e..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_XLarge_Fur.png b/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_XLarge_Fur.png deleted file mode 100644 index 426b40835..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/GlovesFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Large_Bands.png b/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Large_Bands.png deleted file mode 100644 index 57a0dae2c..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Large_Fabric.png b/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Large_Fabric.png deleted file mode 100644 index 0e8598c01..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Normal_Bands.png b/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Normal_Bands.png deleted file mode 100644 index 70cc59015..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Normal_Fabric.png b/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Normal_Fabric.png deleted file mode 100644 index fadb785e3..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Small_Bands.png b/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Small_Bands.png deleted file mode 100644 index eb65f00e2..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Small_Fabric.png b/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Small_Fabric.png deleted file mode 100644 index 9acd65605..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_XLarge_Bands.png b/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_XLarge_Bands.png deleted file mode 100644 index 74a82828e..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_XLarge_Fabric.png deleted file mode 100644 index 325f3cfa5..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/HaremGlove_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_Large.png b/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_Large.png deleted file mode 100644 index dce07004d..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_Normal.png b/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_Normal.png deleted file mode 100644 index d856ffecf..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_Small.png b/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_Small.png deleted file mode 100644 index 6767c92bc..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_XLarge.png deleted file mode 100644 index 5ba693ecb..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/LatexElbowGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_Large.png b/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_Large.png deleted file mode 100644 index d20924701..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_Normal.png b/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_Normal.png deleted file mode 100644 index 8c07291cf..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_Small.png b/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_Small.png deleted file mode 100644 index e9661c51d..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_XLarge.png deleted file mode 100644 index d5b31a9a5..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/MistressGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_Large.png b/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_Large.png deleted file mode 100644 index 8385ee457..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_Normal.png b/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_Normal.png deleted file mode 100644 index 5e9bc3b8b..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_Small.png b/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_Small.png deleted file mode 100644 index f13774b46..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_XLarge.png deleted file mode 100644 index 6640829d2..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/Orig/MistressGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_Large.png b/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_Large.png deleted file mode 100644 index c78f3da1d..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_Normal.png b/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_Normal.png deleted file mode 100644 index 7aac22302..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_Small.png b/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_Small.png deleted file mode 100644 index 5373458ff..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_XLarge.png b/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_XLarge.png deleted file mode 100644 index ea1d61ce1..000000000 Binary files a/Assets/Female3DCG/Gloves/BackBoxTie/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/BikerGloves_Hands.png b/Assets/Female3DCG/Gloves/BackCuffs/BikerGloves_Hands.png deleted file mode 100644 index 279523f12..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/BikerGloves_Hands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/BikerGloves_Straps.png b/Assets/Female3DCG/Gloves/BackCuffs/BikerGloves_Straps.png deleted file mode 100644 index 6c0472f15..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/BikerGloves_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_Large.png b/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_Large.png deleted file mode 100644 index 096ac86c0..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_Normal.png b/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_Normal.png deleted file mode 100644 index 9e7fecf0f..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_Small.png b/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_Small.png deleted file mode 100644 index 8bcadaca6..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_XLarge.png b/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_XLarge.png deleted file mode 100644 index 0ce9b26f5..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Catsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_Large.png b/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_Large.png deleted file mode 100644 index 345870e9c..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_Normal.png b/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_Normal.png deleted file mode 100644 index 12d9e0bfe..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_Small.png b/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_Small.png deleted file mode 100644 index 98151423b..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_XLarge.png deleted file mode 100644 index b44aa8c1b..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/CowPrintedGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_Large.png b/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_Large.png deleted file mode 100644 index ab5316b37..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_Normal.png b/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_Normal.png deleted file mode 100644 index 3fc89d39e..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_Small.png b/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_Small.png deleted file mode 100644 index 5a4226dba..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_XLarge.png deleted file mode 100644 index cd373c782..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/FingerlessGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_Large.png b/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_Large.png deleted file mode 100644 index 838762d0f..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_Normal.png b/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_Normal.png deleted file mode 100644 index 6d5aeb68d..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_Small.png b/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_Small.png deleted file mode 100644 index b9f3e6d9d..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_XLarge.png deleted file mode 100644 index 08b205f52..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/FishnetGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_Large.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_Large.png deleted file mode 100644 index 450a69faa..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_Normal.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_Normal.png deleted file mode 100644 index c155a6536..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_Small.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_Small.png deleted file mode 100644 index 672602316..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_XLarge.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_XLarge.png deleted file mode 100644 index 176fefac1..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_Large.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_Large.png deleted file mode 100644 index fb58234ea..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_Normal.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_Normal.png deleted file mode 100644 index f523c3b87..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_Small.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_Small.png deleted file mode 100644 index 21d807dea..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_XLarge.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_XLarge.png deleted file mode 100644 index 4c6fc0e6a..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_Large.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_Large.png deleted file mode 100644 index f13ad81cc..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_Normal.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_Normal.png deleted file mode 100644 index 948129939..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_Small.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_Small.png deleted file mode 100644 index 02b877af9..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_XLarge.png b/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_XLarge.png deleted file mode 100644 index e75da7cb2..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Gloves3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Large_Fabric.png b/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Large_Fabric.png deleted file mode 100644 index fb58234ea..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Large_Fur.png b/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Large_Fur.png deleted file mode 100644 index 2267c2fd2..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Normal_Fabric.png b/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Normal_Fabric.png deleted file mode 100644 index f523c3b87..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Normal_Fur.png b/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Normal_Fur.png deleted file mode 100644 index bb58711fa..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Small_Fabric.png b/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Small_Fabric.png deleted file mode 100644 index 21d807dea..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Small_Fur.png b/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Small_Fur.png deleted file mode 100644 index 02c57cf03..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_XLarge_Fabric.png deleted file mode 100644 index 4c6fc0e6a..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_XLarge_Fur.png b/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_XLarge_Fur.png deleted file mode 100644 index 8ffd76669..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/GlovesFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Large_Bands.png b/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Large_Bands.png deleted file mode 100644 index 8dc25cf8b..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Large_Fabric.png b/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Large_Fabric.png deleted file mode 100644 index 35174049b..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Normal_Bands.png b/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Normal_Bands.png deleted file mode 100644 index 637080f38..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Normal_Fabric.png b/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Normal_Fabric.png deleted file mode 100644 index 53004d088..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Small_Bands.png b/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Small_Bands.png deleted file mode 100644 index fc75b1a6e..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Small_Fabric.png b/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Small_Fabric.png deleted file mode 100644 index c1d7d1022..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_XLarge_Bands.png b/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_XLarge_Bands.png deleted file mode 100644 index aa4393910..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_XLarge_Fabric.png deleted file mode 100644 index c3c2504ec..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/HaremGlove_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_Large.png b/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_Large.png deleted file mode 100644 index ccdbeb561..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_Normal.png b/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_Normal.png deleted file mode 100644 index da34c9ec3..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_Small.png b/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_Small.png deleted file mode 100644 index 9c30cc7dc..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_XLarge.png deleted file mode 100644 index 25b7174d0..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/LatexElbowGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_Large.png b/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_Large.png deleted file mode 100644 index 094cb77cb..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_Normal.png b/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_Normal.png deleted file mode 100644 index a759e464b..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_Small.png b/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_Small.png deleted file mode 100644 index 8d899b578..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_XLarge.png deleted file mode 100644 index ebde77933..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/MistressGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_Large.png b/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_Large.png deleted file mode 100644 index e83ede2e4..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_Normal.png b/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_Normal.png deleted file mode 100644 index a994597c4..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_Small.png b/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_Small.png deleted file mode 100644 index 2f0fa8c8f..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_XLarge.png b/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_XLarge.png deleted file mode 100644 index 0345a01cf..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/Orig/MistressGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_Large.png b/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_Large.png deleted file mode 100644 index da9cc24b5..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_Normal.png b/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_Normal.png deleted file mode 100644 index 6f867c473..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_Small.png b/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_Small.png deleted file mode 100644 index a14f1fcd6..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_XLarge.png b/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_XLarge.png deleted file mode 100644 index d9de49d3a..000000000 Binary files a/Assets/Female3DCG/Gloves/BackCuffs/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BikerGloves_Buckles.png b/Assets/Female3DCG/Gloves/BikerGloves_Buckles.png deleted file mode 100644 index 8fe47724a..000000000 Binary files a/Assets/Female3DCG/Gloves/BikerGloves_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BikerGloves_Hands.png b/Assets/Female3DCG/Gloves/BikerGloves_Hands.png deleted file mode 100644 index 4f8e52627..000000000 Binary files a/Assets/Female3DCG/Gloves/BikerGloves_Hands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/BikerGloves_Straps.png b/Assets/Female3DCG/Gloves/BikerGloves_Straps.png deleted file mode 100644 index b0e3bc058..000000000 Binary files a/Assets/Female3DCG/Gloves/BikerGloves_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Catsuit_Large.png b/Assets/Female3DCG/Gloves/Catsuit_Large.png deleted file mode 100644 index 5977a2d5a..000000000 Binary files a/Assets/Female3DCG/Gloves/Catsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Catsuit_Normal.png b/Assets/Female3DCG/Gloves/Catsuit_Normal.png deleted file mode 100644 index 0902bde01..000000000 Binary files a/Assets/Female3DCG/Gloves/Catsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Catsuit_Small.png b/Assets/Female3DCG/Gloves/Catsuit_Small.png deleted file mode 100644 index 447179e4f..000000000 Binary files a/Assets/Female3DCG/Gloves/Catsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Catsuit_XLarge.png b/Assets/Female3DCG/Gloves/Catsuit_XLarge.png deleted file mode 100644 index 08c70a075..000000000 Binary files a/Assets/Female3DCG/Gloves/Catsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/CowPrintedGloves_Large.png b/Assets/Female3DCG/Gloves/CowPrintedGloves_Large.png deleted file mode 100644 index c70eea33a..000000000 Binary files a/Assets/Female3DCG/Gloves/CowPrintedGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/CowPrintedGloves_Normal.png b/Assets/Female3DCG/Gloves/CowPrintedGloves_Normal.png deleted file mode 100644 index e0658545e..000000000 Binary files a/Assets/Female3DCG/Gloves/CowPrintedGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/CowPrintedGloves_Small.png b/Assets/Female3DCG/Gloves/CowPrintedGloves_Small.png deleted file mode 100644 index 6821d31c6..000000000 Binary files a/Assets/Female3DCG/Gloves/CowPrintedGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/CowPrintedGloves_XLarge.png b/Assets/Female3DCG/Gloves/CowPrintedGloves_XLarge.png deleted file mode 100644 index a269afa82..000000000 Binary files a/Assets/Female3DCG/Gloves/CowPrintedGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/FingerlessGloves_Large.png b/Assets/Female3DCG/Gloves/FingerlessGloves_Large.png deleted file mode 100644 index c44da0ec4..000000000 Binary files a/Assets/Female3DCG/Gloves/FingerlessGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/FingerlessGloves_Normal.png b/Assets/Female3DCG/Gloves/FingerlessGloves_Normal.png deleted file mode 100644 index 3dacbe1cf..000000000 Binary files a/Assets/Female3DCG/Gloves/FingerlessGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/FingerlessGloves_Small.png b/Assets/Female3DCG/Gloves/FingerlessGloves_Small.png deleted file mode 100644 index 0a908089b..000000000 Binary files a/Assets/Female3DCG/Gloves/FingerlessGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/FingerlessGloves_XLarge.png b/Assets/Female3DCG/Gloves/FingerlessGloves_XLarge.png deleted file mode 100644 index 8ca60e055..000000000 Binary files a/Assets/Female3DCG/Gloves/FingerlessGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/FishnetGloves_Large.png b/Assets/Female3DCG/Gloves/FishnetGloves_Large.png deleted file mode 100644 index a3b8e27f2..000000000 Binary files a/Assets/Female3DCG/Gloves/FishnetGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/FishnetGloves_Normal.png b/Assets/Female3DCG/Gloves/FishnetGloves_Normal.png deleted file mode 100644 index 388f08e8c..000000000 Binary files a/Assets/Female3DCG/Gloves/FishnetGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/FishnetGloves_Small.png b/Assets/Female3DCG/Gloves/FishnetGloves_Small.png deleted file mode 100644 index 7431a99ae..000000000 Binary files a/Assets/Female3DCG/Gloves/FishnetGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/FishnetGloves_XLarge.png b/Assets/Female3DCG/Gloves/FishnetGloves_XLarge.png deleted file mode 100644 index 9cca6d126..000000000 Binary files a/Assets/Female3DCG/Gloves/FishnetGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves1_Large.png b/Assets/Female3DCG/Gloves/Gloves1_Large.png deleted file mode 100644 index 0b001b13e..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves1_Normal.png b/Assets/Female3DCG/Gloves/Gloves1_Normal.png deleted file mode 100644 index 2edd812f6..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves1_Small.png b/Assets/Female3DCG/Gloves/Gloves1_Small.png deleted file mode 100644 index 953594887..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves1_XLarge.png b/Assets/Female3DCG/Gloves/Gloves1_XLarge.png deleted file mode 100644 index eaed0d823..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves2_Large.png b/Assets/Female3DCG/Gloves/Gloves2_Large.png deleted file mode 100644 index 27146b04a..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves2_Normal.png b/Assets/Female3DCG/Gloves/Gloves2_Normal.png deleted file mode 100644 index 80ea96c9a..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves2_Small.png b/Assets/Female3DCG/Gloves/Gloves2_Small.png deleted file mode 100644 index 8e2a44783..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves2_XLarge.png b/Assets/Female3DCG/Gloves/Gloves2_XLarge.png deleted file mode 100644 index c0ca5cfaf..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves3_Large.png b/Assets/Female3DCG/Gloves/Gloves3_Large.png deleted file mode 100644 index 040dcabed..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves3_Normal.png b/Assets/Female3DCG/Gloves/Gloves3_Normal.png deleted file mode 100644 index fb695ef2c..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves3_Small.png b/Assets/Female3DCG/Gloves/Gloves3_Small.png deleted file mode 100644 index 606524e6d..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Gloves3_XLarge.png b/Assets/Female3DCG/Gloves/Gloves3_XLarge.png deleted file mode 100644 index 2a43c113e..000000000 Binary files a/Assets/Female3DCG/Gloves/Gloves3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/GlovesFur_Large_Fabric.png b/Assets/Female3DCG/Gloves/GlovesFur_Large_Fabric.png deleted file mode 100644 index 27146b04a..000000000 Binary files a/Assets/Female3DCG/Gloves/GlovesFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/GlovesFur_Large_Fur.png b/Assets/Female3DCG/Gloves/GlovesFur_Large_Fur.png deleted file mode 100644 index d5a3ad4c3..000000000 Binary files a/Assets/Female3DCG/Gloves/GlovesFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/GlovesFur_Normal_Fabric.png b/Assets/Female3DCG/Gloves/GlovesFur_Normal_Fabric.png deleted file mode 100644 index 80ea96c9a..000000000 Binary files a/Assets/Female3DCG/Gloves/GlovesFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/GlovesFur_Normal_Fur.png b/Assets/Female3DCG/Gloves/GlovesFur_Normal_Fur.png deleted file mode 100644 index 7d16f4f4f..000000000 Binary files a/Assets/Female3DCG/Gloves/GlovesFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/GlovesFur_Small_Fabric.png b/Assets/Female3DCG/Gloves/GlovesFur_Small_Fabric.png deleted file mode 100644 index 8e2a44783..000000000 Binary files a/Assets/Female3DCG/Gloves/GlovesFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/GlovesFur_Small_Fur.png b/Assets/Female3DCG/Gloves/GlovesFur_Small_Fur.png deleted file mode 100644 index 1ae4bed97..000000000 Binary files a/Assets/Female3DCG/Gloves/GlovesFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/GlovesFur_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/GlovesFur_XLarge_Fabric.png deleted file mode 100644 index c0ca5cfaf..000000000 Binary files a/Assets/Female3DCG/Gloves/GlovesFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/GlovesFur_XLarge_Fur.png b/Assets/Female3DCG/Gloves/GlovesFur_XLarge_Fur.png deleted file mode 100644 index e1422c0f3..000000000 Binary files a/Assets/Female3DCG/Gloves/GlovesFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/HaremGlove_Large_Bands.png b/Assets/Female3DCG/Gloves/HaremGlove_Large_Bands.png deleted file mode 100644 index ce75a8731..000000000 Binary files a/Assets/Female3DCG/Gloves/HaremGlove_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/HaremGlove_Large_Fabric.png b/Assets/Female3DCG/Gloves/HaremGlove_Large_Fabric.png deleted file mode 100644 index 2623eac15..000000000 Binary files a/Assets/Female3DCG/Gloves/HaremGlove_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/HaremGlove_Normal_Bands.png b/Assets/Female3DCG/Gloves/HaremGlove_Normal_Bands.png deleted file mode 100644 index 7bf3d6f22..000000000 Binary files a/Assets/Female3DCG/Gloves/HaremGlove_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/HaremGlove_Normal_Fabric.png b/Assets/Female3DCG/Gloves/HaremGlove_Normal_Fabric.png deleted file mode 100644 index 339649443..000000000 Binary files a/Assets/Female3DCG/Gloves/HaremGlove_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/HaremGlove_Small_Bands.png b/Assets/Female3DCG/Gloves/HaremGlove_Small_Bands.png deleted file mode 100644 index cae6100a7..000000000 Binary files a/Assets/Female3DCG/Gloves/HaremGlove_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/HaremGlove_Small_Fabric.png b/Assets/Female3DCG/Gloves/HaremGlove_Small_Fabric.png deleted file mode 100644 index ddc8df9c8..000000000 Binary files a/Assets/Female3DCG/Gloves/HaremGlove_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/HaremGlove_XLarge_Bands.png b/Assets/Female3DCG/Gloves/HaremGlove_XLarge_Bands.png deleted file mode 100644 index edeb9e25c..000000000 Binary files a/Assets/Female3DCG/Gloves/HaremGlove_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/HaremGlove_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/HaremGlove_XLarge_Fabric.png deleted file mode 100644 index 17949dc46..000000000 Binary files a/Assets/Female3DCG/Gloves/HaremGlove_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/LatexElbowGloves_Large.png b/Assets/Female3DCG/Gloves/LatexElbowGloves_Large.png deleted file mode 100644 index f3a6b87ed..000000000 Binary files a/Assets/Female3DCG/Gloves/LatexElbowGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/LatexElbowGloves_Normal.png b/Assets/Female3DCG/Gloves/LatexElbowGloves_Normal.png deleted file mode 100644 index 9f8ef7d5c..000000000 Binary files a/Assets/Female3DCG/Gloves/LatexElbowGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/LatexElbowGloves_Small.png b/Assets/Female3DCG/Gloves/LatexElbowGloves_Small.png deleted file mode 100644 index 7d6596126..000000000 Binary files a/Assets/Female3DCG/Gloves/LatexElbowGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/LatexElbowGloves_XLarge.png b/Assets/Female3DCG/Gloves/LatexElbowGloves_XLarge.png deleted file mode 100644 index c6feb3706..000000000 Binary files a/Assets/Female3DCG/Gloves/LatexElbowGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/MistressGloves_Large.png b/Assets/Female3DCG/Gloves/MistressGloves_Large.png deleted file mode 100644 index e936f5627..000000000 Binary files a/Assets/Female3DCG/Gloves/MistressGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/MistressGloves_Normal.png b/Assets/Female3DCG/Gloves/MistressGloves_Normal.png deleted file mode 100644 index 925a89be8..000000000 Binary files a/Assets/Female3DCG/Gloves/MistressGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/MistressGloves_Small.png b/Assets/Female3DCG/Gloves/MistressGloves_Small.png deleted file mode 100644 index 23aa1f519..000000000 Binary files a/Assets/Female3DCG/Gloves/MistressGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/MistressGloves_XLarge.png b/Assets/Female3DCG/Gloves/MistressGloves_XLarge.png deleted file mode 100644 index daf63180b..000000000 Binary files a/Assets/Female3DCG/Gloves/MistressGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Orig/Gloves1.png b/Assets/Female3DCG/Gloves/Orig/Gloves1.png deleted file mode 100644 index 0f35cd220..000000000 Binary files a/Assets/Female3DCG/Gloves/Orig/Gloves1.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Orig/Gloves2.png b/Assets/Female3DCG/Gloves/Orig/Gloves2.png deleted file mode 100644 index 06ca20177..000000000 Binary files a/Assets/Female3DCG/Gloves/Orig/Gloves2.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Orig/MistressGloves_Large.png b/Assets/Female3DCG/Gloves/Orig/MistressGloves_Large.png deleted file mode 100644 index 6b84d2898..000000000 Binary files a/Assets/Female3DCG/Gloves/Orig/MistressGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Orig/MistressGloves_Normal.png b/Assets/Female3DCG/Gloves/Orig/MistressGloves_Normal.png deleted file mode 100644 index 36e14e8c5..000000000 Binary files a/Assets/Female3DCG/Gloves/Orig/MistressGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Orig/MistressGloves_Small.png b/Assets/Female3DCG/Gloves/Orig/MistressGloves_Small.png deleted file mode 100644 index 4f78c1b8b..000000000 Binary files a/Assets/Female3DCG/Gloves/Orig/MistressGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Orig/MistressGloves_XLarge.png b/Assets/Female3DCG/Gloves/Orig/MistressGloves_XLarge.png deleted file mode 100644 index b89efb615..000000000 Binary files a/Assets/Female3DCG/Gloves/Orig/MistressGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/BikerGloves_Hands.png b/Assets/Female3DCG/Gloves/OverTheHead/BikerGloves_Hands.png deleted file mode 100644 index bab6281a6..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/BikerGloves_Hands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/BikerGloves_Straps.png b/Assets/Female3DCG/Gloves/OverTheHead/BikerGloves_Straps.png deleted file mode 100644 index 80ca4086c..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/BikerGloves_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_Large.png b/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_Large.png deleted file mode 100644 index 64126b897..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_Normal.png b/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_Normal.png deleted file mode 100644 index 5296141cb..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_Small.png b/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_Small.png deleted file mode 100644 index fd72a99be..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_XLarge.png b/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_XLarge.png deleted file mode 100644 index ff8e8161f..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Catsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_Large.png b/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_Large.png deleted file mode 100644 index 581401bae..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_Normal.png b/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_Normal.png deleted file mode 100644 index dd72646a8..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_Small.png b/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_Small.png deleted file mode 100644 index 041f73057..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_XLarge.png b/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_XLarge.png deleted file mode 100644 index 9a6113a2f..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/CowPrintedGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_Large.png b/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_Large.png deleted file mode 100644 index 534c14129..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_Normal.png b/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_Normal.png deleted file mode 100644 index ddbcf607e..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_Small.png b/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_Small.png deleted file mode 100644 index ea2a3d3b6..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_XLarge.png b/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_XLarge.png deleted file mode 100644 index dc60fb63a..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/FingerlessGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_Large.png b/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_Large.png deleted file mode 100644 index 351d36039..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_Normal.png b/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_Normal.png deleted file mode 100644 index 38480d3a3..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_Small.png b/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_Small.png deleted file mode 100644 index c69555fc6..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_XLarge.png b/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_XLarge.png deleted file mode 100644 index 769a4b463..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/FishnetGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_Large.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_Large.png deleted file mode 100644 index 2e6a8ffd5..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_Normal.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_Normal.png deleted file mode 100644 index 109e8ffe7..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_Small.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_Small.png deleted file mode 100644 index 0ef01dfb0..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_XLarge.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_XLarge.png deleted file mode 100644 index d3d4408ef..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_Large.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_Large.png deleted file mode 100644 index e25867cb7..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_Normal.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_Normal.png deleted file mode 100644 index 03bca63a7..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_Small.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_Small.png deleted file mode 100644 index b80c08e17..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_XLarge.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_XLarge.png deleted file mode 100644 index 5efda2af1..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_Large.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_Large.png deleted file mode 100644 index 037c1b1ef..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_Normal.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_Normal.png deleted file mode 100644 index 037c1b1ef..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_Small.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_Small.png deleted file mode 100644 index 037c1b1ef..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_XLarge.png b/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_XLarge.png deleted file mode 100644 index 037c1b1ef..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/Gloves3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Large_Fabric.png b/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Large_Fabric.png deleted file mode 100644 index 7a2e3804c..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Large_Fur.png b/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Large_Fur.png deleted file mode 100644 index d511e013b..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Normal_Fabric.png b/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Normal_Fabric.png deleted file mode 100644 index bba52c165..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Normal_Fur.png b/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Normal_Fur.png deleted file mode 100644 index 7f4b70d1a..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Small_Fabric.png b/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Small_Fabric.png deleted file mode 100644 index d42da8be5..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Small_Fur.png b/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Small_Fur.png deleted file mode 100644 index a80e21855..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_XLarge_Fabric.png deleted file mode 100644 index 4824e5f0e..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_XLarge_Fur.png b/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_XLarge_Fur.png deleted file mode 100644 index e9054cee6..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/GlovesFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Large_Bands.png b/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Large_Bands.png deleted file mode 100644 index 79bf10f46..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Large_Fabric.png b/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Large_Fabric.png deleted file mode 100644 index b10a77533..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Normal_Bands.png b/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Normal_Bands.png deleted file mode 100644 index 12158ffca..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Normal_Fabric.png b/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Normal_Fabric.png deleted file mode 100644 index 3ffb0aa83..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Small_Bands.png b/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Small_Bands.png deleted file mode 100644 index 5c8c58cd6..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Small_Fabric.png b/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Small_Fabric.png deleted file mode 100644 index ddd85fb47..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_XLarge_Bands.png b/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_XLarge_Bands.png deleted file mode 100644 index 6467a3f5f..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_XLarge_Fabric.png deleted file mode 100644 index 3d20ca08c..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/HaremGlove_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_Large.png b/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_Large.png deleted file mode 100644 index 8cc80d5f0..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_Normal.png b/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_Normal.png deleted file mode 100644 index a04e146b7..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_Small.png b/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_Small.png deleted file mode 100644 index eeb6dff55..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_XLarge.png b/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_XLarge.png deleted file mode 100644 index fb1088ef3..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/LatexElbowGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_Large.png b/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_Large.png deleted file mode 100644 index 9574e1399..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_Normal.png b/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_Normal.png deleted file mode 100644 index 987e89a45..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_Small.png b/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_Small.png deleted file mode 100644 index 19add3632..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_XLarge.png b/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_XLarge.png deleted file mode 100644 index 8fde38a30..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/MistressGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_Large.png b/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_Large.png deleted file mode 100644 index 75011ea2e..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_Normal.png b/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_Normal.png deleted file mode 100644 index 59e93bc08..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_Small.png b/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_Small.png deleted file mode 100644 index d0f98f293..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_XLarge.png b/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_XLarge.png deleted file mode 100644 index 50c86c325..000000000 Binary files a/Assets/Female3DCG/Gloves/OverTheHead/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/BikerGloves.png b/Assets/Female3DCG/Gloves/Preview/BikerGloves.png deleted file mode 100644 index 9036c06a7..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/BikerGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/Catsuit.png b/Assets/Female3DCG/Gloves/Preview/Catsuit.png deleted file mode 100644 index 788582ea8..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/Catsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/CowPrintedGloves.png b/Assets/Female3DCG/Gloves/Preview/CowPrintedGloves.png deleted file mode 100644 index 09ada305b..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/CowPrintedGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/FingerlessGloves.png b/Assets/Female3DCG/Gloves/Preview/FingerlessGloves.png deleted file mode 100644 index 01c2c95ac..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/FingerlessGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/FishnetGloves.png b/Assets/Female3DCG/Gloves/Preview/FishnetGloves.png deleted file mode 100644 index a3b8e27f2..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/FishnetGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/Gloves1.png b/Assets/Female3DCG/Gloves/Preview/Gloves1.png deleted file mode 100644 index 10997d83c..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/Gloves1.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/Gloves2.png b/Assets/Female3DCG/Gloves/Preview/Gloves2.png deleted file mode 100644 index 93f0477f4..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/Gloves2.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/Gloves3.png b/Assets/Female3DCG/Gloves/Preview/Gloves3.png deleted file mode 100644 index 9dd6f2d26..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/Gloves3.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/GlovesFur.png b/Assets/Female3DCG/Gloves/Preview/GlovesFur.png deleted file mode 100644 index 4aefbc913..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/GlovesFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/HaremGlove.png b/Assets/Female3DCG/Gloves/Preview/HaremGlove.png deleted file mode 100644 index 1aef5c77f..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/HaremGlove.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/LatexElbowGloves.png b/Assets/Female3DCG/Gloves/Preview/LatexElbowGloves.png deleted file mode 100644 index f1a77aa54..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/LatexElbowGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/MistressGloves.png b/Assets/Female3DCG/Gloves/Preview/MistressGloves.png deleted file mode 100644 index 4f504538e..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/MistressGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Preview/SeethroughSuit.png b/Assets/Female3DCG/Gloves/Preview/SeethroughSuit.png deleted file mode 100644 index 0039ffe6f..000000000 Binary files a/Assets/Female3DCG/Gloves/Preview/SeethroughSuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/SeethroughSuit_Large.png b/Assets/Female3DCG/Gloves/SeethroughSuit_Large.png deleted file mode 100644 index e6c8ec440..000000000 Binary files a/Assets/Female3DCG/Gloves/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/SeethroughSuit_Normal.png b/Assets/Female3DCG/Gloves/SeethroughSuit_Normal.png deleted file mode 100644 index c5a45abbf..000000000 Binary files a/Assets/Female3DCG/Gloves/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/SeethroughSuit_Small.png b/Assets/Female3DCG/Gloves/SeethroughSuit_Small.png deleted file mode 100644 index 82328ad30..000000000 Binary files a/Assets/Female3DCG/Gloves/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/SeethroughSuit_XLarge.png b/Assets/Female3DCG/Gloves/SeethroughSuit_XLarge.png deleted file mode 100644 index 23459156a..000000000 Binary files a/Assets/Female3DCG/Gloves/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Catsuit_Large.png b/Assets/Female3DCG/Gloves/TapedHands/Catsuit_Large.png deleted file mode 100644 index 84b637b8f..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Catsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Catsuit_Normal.png b/Assets/Female3DCG/Gloves/TapedHands/Catsuit_Normal.png deleted file mode 100644 index 9f7026123..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Catsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Catsuit_Small.png b/Assets/Female3DCG/Gloves/TapedHands/Catsuit_Small.png deleted file mode 100644 index 75ce09e98..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Catsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Catsuit_XLarge.png b/Assets/Female3DCG/Gloves/TapedHands/Catsuit_XLarge.png deleted file mode 100644 index a21bfcc40..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Catsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_Large.png b/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_Large.png deleted file mode 100644 index 8c97882b5..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_Normal.png b/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_Normal.png deleted file mode 100644 index 2e956d774..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_Small.png b/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_Small.png deleted file mode 100644 index 9aed06d82..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_XLarge.png b/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_XLarge.png deleted file mode 100644 index 75befe16f..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/CowPrintedGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_Large.png b/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_Large.png deleted file mode 100644 index c44da0ec4..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_Normal.png b/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_Normal.png deleted file mode 100644 index 3dacbe1cf..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_Small.png b/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_Small.png deleted file mode 100644 index 0a908089b..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_XLarge.png b/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_XLarge.png deleted file mode 100644 index 8ca60e055..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/FingerlessGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_Large.png b/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_Large.png deleted file mode 100644 index a3b8e27f2..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_Normal.png b/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_Normal.png deleted file mode 100644 index 388f08e8c..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_Small.png b/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_Small.png deleted file mode 100644 index 7431a99ae..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_XLarge.png b/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_XLarge.png deleted file mode 100644 index 9cca6d126..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/FishnetGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves1_Large.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves1_Large.png deleted file mode 100644 index 636393607..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves1_Normal.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves1_Normal.png deleted file mode 100644 index 8be775f59..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves1_Small.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves1_Small.png deleted file mode 100644 index 654abe3be..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves1_XLarge.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves1_XLarge.png deleted file mode 100644 index 2a646c29b..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves2_Large.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves2_Large.png deleted file mode 100644 index 2dfee5849..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves2_Normal.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves2_Normal.png deleted file mode 100644 index f44cb6cfe..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves2_Small.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves2_Small.png deleted file mode 100644 index 08786f99f..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves2_XLarge.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves2_XLarge.png deleted file mode 100644 index 9d3e7785d..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves3_Large.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves3_Large.png deleted file mode 100644 index ac71eb411..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves3_Normal.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves3_Normal.png deleted file mode 100644 index 44c3dd20d..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves3_Small.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves3_Small.png deleted file mode 100644 index f44c60257..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/Gloves3_XLarge.png b/Assets/Female3DCG/Gloves/TapedHands/Gloves3_XLarge.png deleted file mode 100644 index 35e6f6536..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/Gloves3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Large_Fabric.png b/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Large_Fabric.png deleted file mode 100644 index 2dfee5849..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Large_Fur.png b/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Large_Fur.png deleted file mode 100644 index d5a3ad4c3..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Normal_Fabric.png b/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Normal_Fabric.png deleted file mode 100644 index f44cb6cfe..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Normal_Fur.png b/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Normal_Fur.png deleted file mode 100644 index 7d16f4f4f..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Small_Fabric.png b/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Small_Fabric.png deleted file mode 100644 index 08786f99f..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Small_Fur.png b/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Small_Fur.png deleted file mode 100644 index 1ae4bed97..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_XLarge_Fabric.png deleted file mode 100644 index 9d3e7785d..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_XLarge_Fur.png b/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_XLarge_Fur.png deleted file mode 100644 index e1422c0f3..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/GlovesFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Large_Fabric.png b/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Large_Fabric.png deleted file mode 100644 index 2623eac15..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Normal_Bands.png b/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Normal_Bands.png deleted file mode 100644 index 7bf3d6f22..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Normal_Fabric.png b/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Normal_Fabric.png deleted file mode 100644 index 339649443..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Small_Bands.png b/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Small_Bands.png deleted file mode 100644 index cae6100a7..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Small_Fabric.png b/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Small_Fabric.png deleted file mode 100644 index ddc8df9c8..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_XLarge_Bands.png b/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_XLarge_Bands.png deleted file mode 100644 index edeb9e25c..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_XLarge_Fabric.png deleted file mode 100644 index 17949dc46..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/HaremGlove_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_Large.png b/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_Large.png deleted file mode 100644 index dce07004d..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_Normal.png b/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_Normal.png deleted file mode 100644 index d856ffecf..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_Small.png b/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_Small.png deleted file mode 100644 index 6767c92bc..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_XLarge.png b/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_XLarge.png deleted file mode 100644 index 5ba693ecb..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/LatexElbowGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_Large.png b/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_Large.png deleted file mode 100644 index 64eeb2df8..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_Normal.png b/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_Normal.png deleted file mode 100644 index fce036b94..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_Small.png b/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_Small.png deleted file mode 100644 index a4667696a..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_XLarge.png b/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_XLarge.png deleted file mode 100644 index c4a57f389..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/MistressGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_Large.png b/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_Large.png deleted file mode 100644 index eb0c45eca..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_Normal.png b/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_Normal.png deleted file mode 100644 index c68513400..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_Small.png b/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_Small.png deleted file mode 100644 index 2a86c8594..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_XLarge.png b/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_XLarge.png deleted file mode 100644 index 51465518b..000000000 Binary files a/Assets/Female3DCG/Gloves/TapedHands/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/BikerGloves_Hands.png b/Assets/Female3DCG/Gloves/Yoked/BikerGloves_Hands.png deleted file mode 100644 index 55cff8bbf..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/BikerGloves_Hands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/BikerGloves_Straps.png b/Assets/Female3DCG/Gloves/Yoked/BikerGloves_Straps.png deleted file mode 100644 index 1ea1e3a31..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/BikerGloves_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Catsuit_Large.png b/Assets/Female3DCG/Gloves/Yoked/Catsuit_Large.png deleted file mode 100644 index a0447dd7a..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Catsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Catsuit_Normal.png b/Assets/Female3DCG/Gloves/Yoked/Catsuit_Normal.png deleted file mode 100644 index 0e064ebc5..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Catsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Catsuit_Small.png b/Assets/Female3DCG/Gloves/Yoked/Catsuit_Small.png deleted file mode 100644 index 3c930c2c4..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Catsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Catsuit_XLarge.png b/Assets/Female3DCG/Gloves/Yoked/Catsuit_XLarge.png deleted file mode 100644 index fef97665b..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Catsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_Large.png b/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_Large.png deleted file mode 100644 index e48ce2453..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_Normal.png b/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_Normal.png deleted file mode 100644 index 96a812ead..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_Small.png b/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_Small.png deleted file mode 100644 index 600eac587..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_XLarge.png b/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_XLarge.png deleted file mode 100644 index c4d84ef52..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/CowPrintedGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_Large.png b/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_Large.png deleted file mode 100644 index 237aacb25..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_Normal.png b/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_Normal.png deleted file mode 100644 index 78f0ece3f..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_Small.png b/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_Small.png deleted file mode 100644 index d604732f4..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_XLarge.png b/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_XLarge.png deleted file mode 100644 index 8df7e72b3..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/FingerlessGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_Large.png b/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_Large.png deleted file mode 100644 index e9b6094d3..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_Normal.png b/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_Normal.png deleted file mode 100644 index 955f6e5f8..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_Small.png b/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_Small.png deleted file mode 100644 index d61a1a925..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_XLarge.png b/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_XLarge.png deleted file mode 100644 index e6e86143f..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/FishnetGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves1_Large.png b/Assets/Female3DCG/Gloves/Yoked/Gloves1_Large.png deleted file mode 100644 index 515352deb..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves1_Normal.png b/Assets/Female3DCG/Gloves/Yoked/Gloves1_Normal.png deleted file mode 100644 index 6203830f1..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves1_Small.png b/Assets/Female3DCG/Gloves/Yoked/Gloves1_Small.png deleted file mode 100644 index 2e27a5b71..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves1_XLarge.png b/Assets/Female3DCG/Gloves/Yoked/Gloves1_XLarge.png deleted file mode 100644 index 4d1159d15..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves2_Large.png b/Assets/Female3DCG/Gloves/Yoked/Gloves2_Large.png deleted file mode 100644 index 9e533289d..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves2_Normal.png b/Assets/Female3DCG/Gloves/Yoked/Gloves2_Normal.png deleted file mode 100644 index b0db70a8f..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves2_Small.png b/Assets/Female3DCG/Gloves/Yoked/Gloves2_Small.png deleted file mode 100644 index f45276f4f..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves2_XLarge.png b/Assets/Female3DCG/Gloves/Yoked/Gloves2_XLarge.png deleted file mode 100644 index d130f0db9..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves3_Large.png b/Assets/Female3DCG/Gloves/Yoked/Gloves3_Large.png deleted file mode 100644 index 3b600abe9..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves3_Normal.png b/Assets/Female3DCG/Gloves/Yoked/Gloves3_Normal.png deleted file mode 100644 index 7e9554ad5..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves3_Small.png b/Assets/Female3DCG/Gloves/Yoked/Gloves3_Small.png deleted file mode 100644 index 953c98313..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/Gloves3_XLarge.png b/Assets/Female3DCG/Gloves/Yoked/Gloves3_XLarge.png deleted file mode 100644 index 6a4980868..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/Gloves3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Large_Fabric.png b/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Large_Fabric.png deleted file mode 100644 index 7a2e3804c..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Large_Fur.png b/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Large_Fur.png deleted file mode 100644 index d511e013b..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Normal_Fabric.png b/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Normal_Fabric.png deleted file mode 100644 index bba52c165..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Normal_Fur.png b/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Normal_Fur.png deleted file mode 100644 index 7f4b70d1a..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Small_Fabric.png b/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Small_Fabric.png deleted file mode 100644 index d42da8be5..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Small_Fur.png b/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Small_Fur.png deleted file mode 100644 index a80e21855..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/Yoked/GlovesFur_XLarge_Fabric.png deleted file mode 100644 index 4824e5f0e..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_XLarge_Fur.png b/Assets/Female3DCG/Gloves/Yoked/GlovesFur_XLarge_Fur.png deleted file mode 100644 index e9054cee6..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/GlovesFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Large_Bands.png b/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Large_Bands.png deleted file mode 100644 index 602540fd0..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Large_Fabric.png b/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Large_Fabric.png deleted file mode 100644 index d9a768280..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Normal_Bands.png b/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Normal_Bands.png deleted file mode 100644 index 63577bc39..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Normal_Fabric.png b/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Normal_Fabric.png deleted file mode 100644 index a0604dcf5..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Small_Bands.png b/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Small_Bands.png deleted file mode 100644 index b10b0e04b..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Small_Fabric.png b/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Small_Fabric.png deleted file mode 100644 index a6f4b71c7..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_XLarge_Bands.png b/Assets/Female3DCG/Gloves/Yoked/HaremGlove_XLarge_Bands.png deleted file mode 100644 index c4451a007..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_XLarge_Fabric.png b/Assets/Female3DCG/Gloves/Yoked/HaremGlove_XLarge_Fabric.png deleted file mode 100644 index 5d1535c16..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/HaremGlove_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_Large.png b/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_Large.png deleted file mode 100644 index e988f5456..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_Normal.png b/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_Normal.png deleted file mode 100644 index 932540544..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_Small.png b/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_Small.png deleted file mode 100644 index 98a4dcc29..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_XLarge.png b/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_XLarge.png deleted file mode 100644 index 2cad0d29b..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/LatexElbowGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/MistressGloves_Large.png b/Assets/Female3DCG/Gloves/Yoked/MistressGloves_Large.png deleted file mode 100644 index 0a1eeb61b..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/MistressGloves_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/MistressGloves_Normal.png b/Assets/Female3DCG/Gloves/Yoked/MistressGloves_Normal.png deleted file mode 100644 index 0a6e6f1c5..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/MistressGloves_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/MistressGloves_Small.png b/Assets/Female3DCG/Gloves/Yoked/MistressGloves_Small.png deleted file mode 100644 index 4a0d0d0de..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/MistressGloves_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/MistressGloves_XLarge.png b/Assets/Female3DCG/Gloves/Yoked/MistressGloves_XLarge.png deleted file mode 100644 index 29b8acf3e..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/MistressGloves_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_Large.png b/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_Large.png deleted file mode 100644 index 40f8351bc..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_Normal.png b/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_Normal.png deleted file mode 100644 index 564a0cd59..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_Small.png b/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_Small.png deleted file mode 100644 index 13959e694..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_XLarge.png b/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_XLarge.png deleted file mode 100644 index e41831e6c..000000000 Binary files a/Assets/Female3DCG/Gloves/Yoked/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Antennae.png b/Assets/Female3DCG/HairAccessory1/Antennae.png deleted file mode 100644 index 4090d946e..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Antennae.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/BatWings.png b/Assets/Female3DCG/HairAccessory1/BatWings.png deleted file mode 100644 index d2f1b6de6..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/BatWings.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/BunnyEars1.png b/Assets/Female3DCG/HairAccessory1/BunnyEars1.png deleted file mode 100644 index 2a78a6e27..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/BunnyEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/BunnyEars2_Inner.png b/Assets/Female3DCG/HairAccessory1/BunnyEars2_Inner.png deleted file mode 100644 index c613e131f..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/BunnyEars2_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/BunnyEars2_Outer.png b/Assets/Female3DCG/HairAccessory1/BunnyEars2_Outer.png deleted file mode 100644 index bd4bae30b..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/BunnyEars2_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/CowHorns.png b/Assets/Female3DCG/HairAccessory1/CowHorns.png deleted file mode 100644 index a9ba54769..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/CowHorns.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/DildocornHorn_Base.png b/Assets/Female3DCG/HairAccessory1/DildocornHorn_Base.png deleted file mode 100644 index 1297e6124..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/DildocornHorn_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/DildocornHorn_Shine.png b/Assets/Female3DCG/HairAccessory1/DildocornHorn_Shine.png deleted file mode 100644 index d2e27a374..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/DildocornHorn_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Ears1.png b/Assets/Female3DCG/HairAccessory1/Ears1.png deleted file mode 100644 index 1101da98c..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Ears1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Ears2.png b/Assets/Female3DCG/HairAccessory1/Ears2.png deleted file mode 100644 index a6ddc1a6d..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Ears2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/ElfEars.png b/Assets/Female3DCG/HairAccessory1/ElfEars.png deleted file mode 100644 index 006a46b5d..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/ElfEars.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/ElfEars_Asian.png b/Assets/Female3DCG/HairAccessory1/ElfEars_Asian.png deleted file mode 100644 index 240689a77..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/ElfEars_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/ElfEars_Black.png b/Assets/Female3DCG/HairAccessory1/ElfEars_Black.png deleted file mode 100644 index f4b1f415b..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/ElfEars_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/ElfEars_White.png b/Assets/Female3DCG/HairAccessory1/ElfEars_White.png deleted file mode 100644 index c2a076bb7..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/ElfEars_White.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/FoxEars1.png b/Assets/Female3DCG/HairAccessory1/FoxEars1.png deleted file mode 100644 index 07de7e162..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/FoxEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/FoxEars2_Inner.png b/Assets/Female3DCG/HairAccessory1/FoxEars2_Inner.png deleted file mode 100644 index 399cf8e38..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/FoxEars2_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/FoxEars2_Outer.png b/Assets/Female3DCG/HairAccessory1/FoxEars2_Outer.png deleted file mode 100644 index 7c9da14c0..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/FoxEars2_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/FoxEars3_Bell.png b/Assets/Female3DCG/HairAccessory1/FoxEars3_Bell.png deleted file mode 100644 index 8e1b030d4..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/FoxEars3_Bell.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/FoxEars3_EarInner.png b/Assets/Female3DCG/HairAccessory1/FoxEars3_EarInner.png deleted file mode 100644 index 0077559c2..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/FoxEars3_EarInner.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/FoxEars3_EarOuter.png b/Assets/Female3DCG/HairAccessory1/FoxEars3_EarOuter.png deleted file mode 100644 index f6cd3d999..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/FoxEars3_EarOuter.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/FoxEars3_Strap.png b/Assets/Female3DCG/HairAccessory1/FoxEars3_Strap.png deleted file mode 100644 index 4f5f5ad1f..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/FoxEars3_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/GiantBow1.png b/Assets/Female3DCG/HairAccessory1/GiantBow1.png deleted file mode 100644 index 810754e16..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/GiantBow1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/HairFeathers1.png b/Assets/Female3DCG/HairAccessory1/HairFeathers1.png deleted file mode 100644 index deee8be78..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/HairFeathers1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/HairFlower1.png b/Assets/Female3DCG/HairAccessory1/HairFlower1.png deleted file mode 100644 index bc7ebf712..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/HairFlower1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/HaloBroken_Base.png b/Assets/Female3DCG/HairAccessory1/HaloBroken_Base.png deleted file mode 100644 index 9661a01dd..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/HaloBroken_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/HaloBroken_Core.png b/Assets/Female3DCG/HairAccessory1/HaloBroken_Core.png deleted file mode 100644 index bde853671..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/HaloBroken_Core.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/HaloBroken_Glow.png b/Assets/Female3DCG/HairAccessory1/HaloBroken_Glow.png deleted file mode 100644 index afd4790c8..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/HaloBroken_Glow.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Halo_Base.png b/Assets/Female3DCG/HairAccessory1/Halo_Base.png deleted file mode 100644 index f2c62c1ab..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Halo_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Halo_Core.png b/Assets/Female3DCG/HairAccessory1/Halo_Core.png deleted file mode 100644 index ad22cedb4..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Halo_Core.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Halo_Glow.png b/Assets/Female3DCG/HairAccessory1/Halo_Glow.png deleted file mode 100644 index b92e7c65b..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Halo_Glow.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Horns.png b/Assets/Female3DCG/HairAccessory1/Horns.png deleted file mode 100644 index ffd955cfe..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Horns.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Horns2.png b/Assets/Female3DCG/HairAccessory1/Horns2.png deleted file mode 100644 index e8caec702..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Horns2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Horns3.png b/Assets/Female3DCG/HairAccessory1/Horns3.png deleted file mode 100644 index b670bbf30..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Horns3.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/KittenEars1_Inner.png b/Assets/Female3DCG/HairAccessory1/KittenEars1_Inner.png deleted file mode 100644 index 0b813e252..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/KittenEars1_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/KittenEars1_Outer.png b/Assets/Female3DCG/HairAccessory1/KittenEars1_Outer.png deleted file mode 100644 index 7e2941ae3..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/KittenEars1_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/KittenEars2.png b/Assets/Female3DCG/HairAccessory1/KittenEars2.png deleted file mode 100644 index f1db0c24e..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/KittenEars2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/MouseEars1.png b/Assets/Female3DCG/HairAccessory1/MouseEars1.png deleted file mode 100644 index a9c1926a6..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/MouseEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/MouseEars2.png b/Assets/Female3DCG/HairAccessory1/MouseEars2.png deleted file mode 100644 index 6a305343d..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/MouseEars2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/PonyEars1.png b/Assets/Female3DCG/HairAccessory1/PonyEars1.png deleted file mode 100644 index 909293868..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/PonyEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/Antennae.png b/Assets/Female3DCG/HairAccessory1/Preview/Antennae.png deleted file mode 100644 index aa1432d22..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/Antennae.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/BatWings.png b/Assets/Female3DCG/HairAccessory1/Preview/BatWings.png deleted file mode 100644 index 523739c49..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/BatWings.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/BunnyEars1.png b/Assets/Female3DCG/HairAccessory1/Preview/BunnyEars1.png deleted file mode 100644 index dce2799cd..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/BunnyEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/BunnyEars2.png b/Assets/Female3DCG/HairAccessory1/Preview/BunnyEars2.png deleted file mode 100644 index 1f3253488..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/BunnyEars2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/CowHorns.png b/Assets/Female3DCG/HairAccessory1/Preview/CowHorns.png deleted file mode 100644 index 7475cd203..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/CowHorns.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/DildocornHorn.png b/Assets/Female3DCG/HairAccessory1/Preview/DildocornHorn.png deleted file mode 100644 index ac65c10e4..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/DildocornHorn.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/Ears1.png b/Assets/Female3DCG/HairAccessory1/Preview/Ears1.png deleted file mode 100644 index 8e9ff6a09..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/Ears1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/Ears2.png b/Assets/Female3DCG/HairAccessory1/Preview/Ears2.png deleted file mode 100644 index 574f66834..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/Ears2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/ElfEars.png b/Assets/Female3DCG/HairAccessory1/Preview/ElfEars.png deleted file mode 100644 index 0c4c6589e..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/ElfEars.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/FoxEars1.png b/Assets/Female3DCG/HairAccessory1/Preview/FoxEars1.png deleted file mode 100644 index 0da4e08e4..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/FoxEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/FoxEars2.png b/Assets/Female3DCG/HairAccessory1/Preview/FoxEars2.png deleted file mode 100644 index 8015436d7..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/FoxEars2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/FoxEars3.png b/Assets/Female3DCG/HairAccessory1/Preview/FoxEars3.png deleted file mode 100644 index 93e480c21..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/FoxEars3.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/GiantBow1.png b/Assets/Female3DCG/HairAccessory1/Preview/GiantBow1.png deleted file mode 100644 index 1e47e5528..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/GiantBow1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/HairFeathers1.png b/Assets/Female3DCG/HairAccessory1/Preview/HairFeathers1.png deleted file mode 100644 index 4ce630d26..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/HairFeathers1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/HairFlower1.png b/Assets/Female3DCG/HairAccessory1/Preview/HairFlower1.png deleted file mode 100644 index 21ba643d8..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/HairFlower1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/Halo.png b/Assets/Female3DCG/HairAccessory1/Preview/Halo.png deleted file mode 100644 index 1ae6216d7..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/Halo.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/Horns.png b/Assets/Female3DCG/HairAccessory1/Preview/Horns.png deleted file mode 100644 index 8b02d47d4..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/Horns.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/Horns2.png b/Assets/Female3DCG/HairAccessory1/Preview/Horns2.png deleted file mode 100644 index c0c36d350..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/Horns2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/Horns3.png b/Assets/Female3DCG/HairAccessory1/Preview/Horns3.png deleted file mode 100644 index 26dd8780f..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/Horns3.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/KittenEars1.png b/Assets/Female3DCG/HairAccessory1/Preview/KittenEars1.png deleted file mode 100644 index 3118debe1..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/KittenEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/KittenEars2.png b/Assets/Female3DCG/HairAccessory1/Preview/KittenEars2.png deleted file mode 100644 index b372d10de..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/KittenEars2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/MouseEars1.png b/Assets/Female3DCG/HairAccessory1/Preview/MouseEars1.png deleted file mode 100644 index 672bb4a2a..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/MouseEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/MouseEars2.png b/Assets/Female3DCG/HairAccessory1/Preview/MouseEars2.png deleted file mode 100644 index 3306ab484..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/MouseEars2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/PonyEars1.png b/Assets/Female3DCG/HairAccessory1/Preview/PonyEars1.png deleted file mode 100644 index c61911fe0..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/PonyEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/PuppyEars1.png b/Assets/Female3DCG/HairAccessory1/Preview/PuppyEars1.png deleted file mode 100644 index 3ec930558..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/PuppyEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/PuppyEars2.png b/Assets/Female3DCG/HairAccessory1/Preview/PuppyEars2.png deleted file mode 100644 index 9e11365ad..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/PuppyEars2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/RaccoonEars1.png b/Assets/Female3DCG/HairAccessory1/Preview/RaccoonEars1.png deleted file mode 100644 index 081587260..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/RaccoonEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/Ribbons1.png b/Assets/Female3DCG/HairAccessory1/Preview/Ribbons1.png deleted file mode 100644 index cfc5fff8c..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/Ribbons1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/Ribbons2.png b/Assets/Female3DCG/HairAccessory1/Preview/Ribbons2.png deleted file mode 100644 index b441da24d..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/Ribbons2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/Ribbons3.png b/Assets/Female3DCG/HairAccessory1/Preview/Ribbons3.png deleted file mode 100644 index 83b59835c..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/Ribbons3.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/Ribbons4.png b/Assets/Female3DCG/HairAccessory1/Preview/Ribbons4.png deleted file mode 100644 index f4437330c..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/Ribbons4.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/SuccubusHorns.png b/Assets/Female3DCG/HairAccessory1/Preview/SuccubusHorns.png deleted file mode 100644 index 04434f859..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/SuccubusHorns.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/UnicornHorn.png b/Assets/Female3DCG/HairAccessory1/Preview/UnicornHorn.png deleted file mode 100644 index 2713582c1..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/UnicornHorn.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/WeddingVeil1.png b/Assets/Female3DCG/HairAccessory1/Preview/WeddingVeil1.png deleted file mode 100644 index ea7472870..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/WeddingVeil1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/WolfEars1.png b/Assets/Female3DCG/HairAccessory1/Preview/WolfEars1.png deleted file mode 100644 index 294fc5a14..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/WolfEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Preview/WolfEars2.png b/Assets/Female3DCG/HairAccessory1/Preview/WolfEars2.png deleted file mode 100644 index 51c311491..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Preview/WolfEars2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/PuppyEars1.png b/Assets/Female3DCG/HairAccessory1/PuppyEars1.png deleted file mode 100644 index e7be81e5d..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/PuppyEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/PuppyEars2.png b/Assets/Female3DCG/HairAccessory1/PuppyEars2.png deleted file mode 100644 index 9fb8f11ba..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/PuppyEars2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/RaccoonEars1.png b/Assets/Female3DCG/HairAccessory1/RaccoonEars1.png deleted file mode 100644 index 081587260..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/RaccoonEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Ribbons1.png b/Assets/Female3DCG/HairAccessory1/Ribbons1.png deleted file mode 100644 index 38ae410f2..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Ribbons1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Ribbons2.png b/Assets/Female3DCG/HairAccessory1/Ribbons2.png deleted file mode 100644 index 19b9131d8..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Ribbons2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Ribbons3.png b/Assets/Female3DCG/HairAccessory1/Ribbons3.png deleted file mode 100644 index 8a6c9f1f5..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Ribbons3.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/Ribbons4.png b/Assets/Female3DCG/HairAccessory1/Ribbons4.png deleted file mode 100644 index f1343a1fe..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/Ribbons4.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/SuccubusHorns.png b/Assets/Female3DCG/HairAccessory1/SuccubusHorns.png deleted file mode 100644 index e55b1c4e0..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/SuccubusHorns.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/UnicornHorn_Base.png b/Assets/Female3DCG/HairAccessory1/UnicornHorn_Base.png deleted file mode 100644 index 342a4176d..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/UnicornHorn_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/UnicornHorn_Shine.png b/Assets/Female3DCG/HairAccessory1/UnicornHorn_Shine.png deleted file mode 100644 index 5361f6467..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/UnicornHorn_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/WeddingVeil1.png b/Assets/Female3DCG/HairAccessory1/WeddingVeil1.png deleted file mode 100644 index d8b9e648a..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/WeddingVeil1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/WolfEars1.png b/Assets/Female3DCG/HairAccessory1/WolfEars1.png deleted file mode 100644 index 88dcaef06..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/WolfEars1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairAccessory1/WolfEars2.png b/Assets/Female3DCG/HairAccessory1/WolfEars2.png deleted file mode 100644 index ad6389471..000000000 Binary files a/Assets/Female3DCG/HairAccessory1/WolfEars2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack10b.png b/Assets/Female3DCG/HairBack/AllFours/HairBack10b.png deleted file mode 100644 index d6e67ed27..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack10b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack11.png b/Assets/Female3DCG/HairBack/AllFours/HairBack11.png deleted file mode 100644 index 8dd61dbcc..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack11.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack15b.png b/Assets/Female3DCG/HairBack/AllFours/HairBack15b.png deleted file mode 100644 index 9ab112ca0..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack15b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack16.png b/Assets/Female3DCG/HairBack/AllFours/HairBack16.png deleted file mode 100644 index 5fb9fc419..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack16.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack18b.png b/Assets/Female3DCG/HairBack/AllFours/HairBack18b.png deleted file mode 100644 index 7632e08f3..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack18b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack19b.png b/Assets/Female3DCG/HairBack/AllFours/HairBack19b.png deleted file mode 100644 index 2a2fadc74..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack19b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack1b.png b/Assets/Female3DCG/HairBack/AllFours/HairBack1b.png deleted file mode 100644 index bb12e7e4e..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack1b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack20.png b/Assets/Female3DCG/HairBack/AllFours/HairBack20.png deleted file mode 100644 index 4780275ad..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack20.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack20b.png b/Assets/Female3DCG/HairBack/AllFours/HairBack20b.png deleted file mode 100644 index 1cb5815c5..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack20b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack23.png b/Assets/Female3DCG/HairBack/AllFours/HairBack23.png deleted file mode 100644 index 046163e27..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack23.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack24.png b/Assets/Female3DCG/HairBack/AllFours/HairBack24.png deleted file mode 100644 index 4d1487d26..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack24.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack26.png b/Assets/Female3DCG/HairBack/AllFours/HairBack26.png deleted file mode 100644 index f6bba3263..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack26.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack2b.png b/Assets/Female3DCG/HairBack/AllFours/HairBack2b.png deleted file mode 100644 index 6fb62f1cf..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack2b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack34.png b/Assets/Female3DCG/HairBack/AllFours/HairBack34.png deleted file mode 100644 index 65e826c34..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack34.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack38.png b/Assets/Female3DCG/HairBack/AllFours/HairBack38.png deleted file mode 100644 index ae098901a..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack38.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack42.png b/Assets/Female3DCG/HairBack/AllFours/HairBack42.png deleted file mode 100644 index 52cc63dcb..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack42.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack43.png b/Assets/Female3DCG/HairBack/AllFours/HairBack43.png deleted file mode 100644 index 1350bc80e..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack43.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack4b.png b/Assets/Female3DCG/HairBack/AllFours/HairBack4b.png deleted file mode 100644 index 3ac670be1..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack4b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack50.png b/Assets/Female3DCG/HairBack/AllFours/HairBack50.png deleted file mode 100644 index d590b238f..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack50.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack5b.png b/Assets/Female3DCG/HairBack/AllFours/HairBack5b.png deleted file mode 100644 index e907c8c43..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack5b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack6.png b/Assets/Female3DCG/HairBack/AllFours/HairBack6.png deleted file mode 100644 index 897b572e7..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack6.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack6b.png b/Assets/Female3DCG/HairBack/AllFours/HairBack6b.png deleted file mode 100644 index 1fa76b622..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack6b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/AllFours/HairBack8.png b/Assets/Female3DCG/HairBack/AllFours/HairBack8.png deleted file mode 100644 index 50c033b10..000000000 Binary files a/Assets/Female3DCG/HairBack/AllFours/HairBack8.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack1.png b/Assets/Female3DCG/HairBack/HairBack1.png deleted file mode 100644 index 58e1e2d71..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack10.png b/Assets/Female3DCG/HairBack/HairBack10.png deleted file mode 100644 index 1419d6bc7..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack10.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack10b.png b/Assets/Female3DCG/HairBack/HairBack10b.png deleted file mode 100644 index d6e67ed27..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack10b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack11.png b/Assets/Female3DCG/HairBack/HairBack11.png deleted file mode 100644 index 0105f612a..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack11.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack14.png b/Assets/Female3DCG/HairBack/HairBack14.png deleted file mode 100644 index 3dbc84785..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack14.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack15.png b/Assets/Female3DCG/HairBack/HairBack15.png deleted file mode 100644 index 8fca86855..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack15.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack15b.png b/Assets/Female3DCG/HairBack/HairBack15b.png deleted file mode 100644 index 9ab112ca0..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack15b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack16.png b/Assets/Female3DCG/HairBack/HairBack16.png deleted file mode 100644 index 72cbfd1d9..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack16.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack17.png b/Assets/Female3DCG/HairBack/HairBack17.png deleted file mode 100644 index a52c3cd9b..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack17.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack18.png b/Assets/Female3DCG/HairBack/HairBack18.png deleted file mode 100644 index 3e32d9296..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack18.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack18b.png b/Assets/Female3DCG/HairBack/HairBack18b.png deleted file mode 100644 index 7632e08f3..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack18b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack19.png b/Assets/Female3DCG/HairBack/HairBack19.png deleted file mode 100644 index 88006f01b..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack19.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack19b.png b/Assets/Female3DCG/HairBack/HairBack19b.png deleted file mode 100644 index 2a2fadc74..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack19b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack1b.png b/Assets/Female3DCG/HairBack/HairBack1b.png deleted file mode 100644 index bb12e7e4e..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack1b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack2.png b/Assets/Female3DCG/HairBack/HairBack2.png deleted file mode 100644 index 428d248c7..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack20.png b/Assets/Female3DCG/HairBack/HairBack20.png deleted file mode 100644 index 88d134a22..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack20.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack20b.png b/Assets/Female3DCG/HairBack/HairBack20b.png deleted file mode 100644 index 1cb5815c5..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack20b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack21.png b/Assets/Female3DCG/HairBack/HairBack21.png deleted file mode 100644 index f19fe06be..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack21.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack22.png b/Assets/Female3DCG/HairBack/HairBack22.png deleted file mode 100644 index 2d41903fb..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack22.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack23.png b/Assets/Female3DCG/HairBack/HairBack23.png deleted file mode 100644 index e5f9aa4c4..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack23.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack24.png b/Assets/Female3DCG/HairBack/HairBack24.png deleted file mode 100644 index c94fd0b00..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack24.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack25.png b/Assets/Female3DCG/HairBack/HairBack25.png deleted file mode 100644 index 131d3c8de..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack25.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack26.png b/Assets/Female3DCG/HairBack/HairBack26.png deleted file mode 100644 index 906dbe7b8..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack26.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack27.png b/Assets/Female3DCG/HairBack/HairBack27.png deleted file mode 100644 index 5e0bc948d..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack27.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack28.png b/Assets/Female3DCG/HairBack/HairBack28.png deleted file mode 100644 index 297afc4b7..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack28.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack29.png b/Assets/Female3DCG/HairBack/HairBack29.png deleted file mode 100644 index 0a55d024e..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack29.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack2b.png b/Assets/Female3DCG/HairBack/HairBack2b.png deleted file mode 100644 index 6fb62f1cf..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack2b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack30.png b/Assets/Female3DCG/HairBack/HairBack30.png deleted file mode 100644 index 78d278e14..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack30.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack31.png b/Assets/Female3DCG/HairBack/HairBack31.png deleted file mode 100644 index e565f1d2d..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack31.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack32.png b/Assets/Female3DCG/HairBack/HairBack32.png deleted file mode 100644 index ed0d21f2c..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack32.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack33.png b/Assets/Female3DCG/HairBack/HairBack33.png deleted file mode 100644 index e9b784b2c..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack33.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack34.png b/Assets/Female3DCG/HairBack/HairBack34.png deleted file mode 100644 index 38653dc4b..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack34.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack35.png b/Assets/Female3DCG/HairBack/HairBack35.png deleted file mode 100644 index c5790c772..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack35.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack36.png b/Assets/Female3DCG/HairBack/HairBack36.png deleted file mode 100644 index 4ef1b37a6..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack36.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack37.png b/Assets/Female3DCG/HairBack/HairBack37.png deleted file mode 100644 index 38b5c3030..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack37.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack38.png b/Assets/Female3DCG/HairBack/HairBack38.png deleted file mode 100644 index ae098901a..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack38.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack39.png b/Assets/Female3DCG/HairBack/HairBack39.png deleted file mode 100644 index 8a074093a..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack39.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack4.png b/Assets/Female3DCG/HairBack/HairBack4.png deleted file mode 100644 index c00aa54d2..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack4.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack40.png b/Assets/Female3DCG/HairBack/HairBack40.png deleted file mode 100644 index bc079df5b..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack40.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack41.png b/Assets/Female3DCG/HairBack/HairBack41.png deleted file mode 100644 index e9b4a66e9..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack41.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack42.png b/Assets/Female3DCG/HairBack/HairBack42.png deleted file mode 100644 index 0a9e51694..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack42.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack43.png b/Assets/Female3DCG/HairBack/HairBack43.png deleted file mode 100644 index b7077f4e5..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack43.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack44.png b/Assets/Female3DCG/HairBack/HairBack44.png deleted file mode 100644 index d3a2526d4..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack44.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack45.png b/Assets/Female3DCG/HairBack/HairBack45.png deleted file mode 100644 index 17e6e75aa..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack45.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack46.png b/Assets/Female3DCG/HairBack/HairBack46.png deleted file mode 100644 index 532f377ec..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack46.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack47.png b/Assets/Female3DCG/HairBack/HairBack47.png deleted file mode 100644 index fc2e8f4b5..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack47.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack48.png b/Assets/Female3DCG/HairBack/HairBack48.png deleted file mode 100644 index 11f259e27..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack48.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack49.png b/Assets/Female3DCG/HairBack/HairBack49.png deleted file mode 100644 index ca373e437..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack49.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack4b.png b/Assets/Female3DCG/HairBack/HairBack4b.png deleted file mode 100644 index 3ac670be1..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack4b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack5.png b/Assets/Female3DCG/HairBack/HairBack5.png deleted file mode 100644 index 6ce24059d..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack5.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack50.png b/Assets/Female3DCG/HairBack/HairBack50.png deleted file mode 100644 index 191a0a170..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack50.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack51.png b/Assets/Female3DCG/HairBack/HairBack51.png deleted file mode 100644 index 0d8c993bc..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack51.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack52.png b/Assets/Female3DCG/HairBack/HairBack52.png deleted file mode 100644 index 888138e75..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack52.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack53_Base.png b/Assets/Female3DCG/HairBack/HairBack53_Base.png deleted file mode 100644 index d0431865e..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack53_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack53_Tip.png b/Assets/Female3DCG/HairBack/HairBack53_Tip.png deleted file mode 100644 index 64bd050b1..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack53_Tip.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack54_Left.png b/Assets/Female3DCG/HairBack/HairBack54_Left.png deleted file mode 100644 index bbc4867e4..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack54_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack54_Right.png b/Assets/Female3DCG/HairBack/HairBack54_Right.png deleted file mode 100644 index 6556e42a1..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack54_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack55.png b/Assets/Female3DCG/HairBack/HairBack55.png deleted file mode 100644 index ef7511c81..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack55.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack5b.png b/Assets/Female3DCG/HairBack/HairBack5b.png deleted file mode 100644 index e907c8c43..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack5b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack6.png b/Assets/Female3DCG/HairBack/HairBack6.png deleted file mode 100644 index 897b572e7..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack6.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack6b.png b/Assets/Female3DCG/HairBack/HairBack6b.png deleted file mode 100644 index 1fa76b622..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack6b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/HairBack8.png b/Assets/Female3DCG/HairBack/HairBack8.png deleted file mode 100644 index 46d6bfef1..000000000 Binary files a/Assets/Female3DCG/HairBack/HairBack8.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack1.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack1.png deleted file mode 100644 index 14493effd..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack10b.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack10b.png deleted file mode 100644 index d6e67ed27..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack10b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack11.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack11.png deleted file mode 100644 index f7508eb8d..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack11.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack14.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack14.png deleted file mode 100644 index 436e1d863..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack14.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack15b.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack15b.png deleted file mode 100644 index 9ab112ca0..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack15b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack16.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack16.png deleted file mode 100644 index f79520d6d..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack16.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack17.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack17.png deleted file mode 100644 index a044e1e64..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack17.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack18b.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack18b.png deleted file mode 100644 index 7632e08f3..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack18b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack19.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack19.png deleted file mode 100644 index 989d86274..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack19.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack19b.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack19b.png deleted file mode 100644 index 2a2fadc74..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack19b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack1b.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack1b.png deleted file mode 100644 index bb12e7e4e..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack1b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack20.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack20.png deleted file mode 100644 index cb3b200af..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack20.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack20b.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack20b.png deleted file mode 100644 index 1cb5815c5..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack20b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack25.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack25.png deleted file mode 100644 index d3d4a3d33..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack25.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack26.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack26.png deleted file mode 100644 index f79520d6d..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack26.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack27.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack27.png deleted file mode 100644 index 14493effd..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack27.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack28.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack28.png deleted file mode 100644 index 897b572e7..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack28.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack29.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack29.png deleted file mode 100644 index a2c7e3b8c..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack29.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack2b.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack2b.png deleted file mode 100644 index 6fb62f1cf..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack2b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack30.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack30.png deleted file mode 100644 index b0f08bc67..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack30.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack32.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack32.png deleted file mode 100644 index fb2806f1a..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack32.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack33.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack33.png deleted file mode 100644 index 6d14810bb..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack33.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack34.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack34.png deleted file mode 100644 index f79520d6d..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack34.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack35.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack35.png deleted file mode 100644 index d3d4a3d33..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack35.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack36.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack36.png deleted file mode 100644 index ce1b8c39b..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack36.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack37.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack37.png deleted file mode 100644 index ec2e1e023..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack37.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack38.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack38.png deleted file mode 100644 index a044e1e64..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack38.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack39.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack39.png deleted file mode 100644 index a044e1e64..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack39.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack4.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack4.png deleted file mode 100644 index d3d4a3d33..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack4.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack40.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack40.png deleted file mode 100644 index dc9b99b81..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack40.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack41.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack41.png deleted file mode 100644 index 2f3a84dab..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack41.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack42.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack42.png deleted file mode 100644 index b509594a1..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack42.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack43.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack43.png deleted file mode 100644 index e29fc529d..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack43.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack44.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack44.png deleted file mode 100644 index decd01414..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack44.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack45.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack45.png deleted file mode 100644 index 1fb87ff95..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack45.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack48.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack48.png deleted file mode 100644 index b314a108a..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack48.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack4b.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack4b.png deleted file mode 100644 index 3ac670be1..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack4b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack50.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack50.png deleted file mode 100644 index 1f33505d8..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack50.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack5b.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack5b.png deleted file mode 100644 index e907c8c43..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack5b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack6.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack6.png deleted file mode 100644 index 897b572e7..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack6.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Hogtied/HairBack6b.png b/Assets/Female3DCG/HairBack/Hogtied/HairBack6b.png deleted file mode 100644 index 1fa76b622..000000000 Binary files a/Assets/Female3DCG/HairBack/Hogtied/HairBack6b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack1.png b/Assets/Female3DCG/HairBack/Suspension/HairBack1.png deleted file mode 100644 index 290278045..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack10.png b/Assets/Female3DCG/HairBack/Suspension/HairBack10.png deleted file mode 100644 index 663134f5d..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack10.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack10b.png b/Assets/Female3DCG/HairBack/Suspension/HairBack10b.png deleted file mode 100644 index d6e67ed27..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack10b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack11.png b/Assets/Female3DCG/HairBack/Suspension/HairBack11.png deleted file mode 100644 index ea735bba7..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack11.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack14.png b/Assets/Female3DCG/HairBack/Suspension/HairBack14.png deleted file mode 100644 index 689d3eac7..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack14.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack15.png b/Assets/Female3DCG/HairBack/Suspension/HairBack15.png deleted file mode 100644 index 418d8e2aa..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack15.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack15b.png b/Assets/Female3DCG/HairBack/Suspension/HairBack15b.png deleted file mode 100644 index 9ab112ca0..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack15b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack16.png b/Assets/Female3DCG/HairBack/Suspension/HairBack16.png deleted file mode 100644 index ea735bba7..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack16.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack17.png b/Assets/Female3DCG/HairBack/Suspension/HairBack17.png deleted file mode 100644 index e69a998d2..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack17.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack18b.png b/Assets/Female3DCG/HairBack/Suspension/HairBack18b.png deleted file mode 100644 index 7632e08f3..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack18b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack19.png b/Assets/Female3DCG/HairBack/Suspension/HairBack19.png deleted file mode 100644 index 4f41f5aa4..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack19.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack19b.png b/Assets/Female3DCG/HairBack/Suspension/HairBack19b.png deleted file mode 100644 index 2a2fadc74..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack19b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack1b.png b/Assets/Female3DCG/HairBack/Suspension/HairBack1b.png deleted file mode 100644 index bb12e7e4e..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack1b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack2.png b/Assets/Female3DCG/HairBack/Suspension/HairBack2.png deleted file mode 100644 index 418d8e2aa..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack20.png b/Assets/Female3DCG/HairBack/Suspension/HairBack20.png deleted file mode 100644 index 08b8977f2..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack20.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack20b.png b/Assets/Female3DCG/HairBack/Suspension/HairBack20b.png deleted file mode 100644 index 1cb5815c5..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack20b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack23.png b/Assets/Female3DCG/HairBack/Suspension/HairBack23.png deleted file mode 100644 index 5745ef59e..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack23.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack24.png b/Assets/Female3DCG/HairBack/Suspension/HairBack24.png deleted file mode 100644 index f85c37dc8..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack24.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack25.png b/Assets/Female3DCG/HairBack/Suspension/HairBack25.png deleted file mode 100644 index 0dde4b97b..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack25.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack26.png b/Assets/Female3DCG/HairBack/Suspension/HairBack26.png deleted file mode 100644 index af4a4934d..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack26.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack27.png b/Assets/Female3DCG/HairBack/Suspension/HairBack27.png deleted file mode 100644 index 841e6269b..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack27.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack29.png b/Assets/Female3DCG/HairBack/Suspension/HairBack29.png deleted file mode 100644 index 07440b690..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack29.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack2b.png b/Assets/Female3DCG/HairBack/Suspension/HairBack2b.png deleted file mode 100644 index 6fb62f1cf..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack2b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack30.png b/Assets/Female3DCG/HairBack/Suspension/HairBack30.png deleted file mode 100644 index 655a6d008..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack30.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack31.png b/Assets/Female3DCG/HairBack/Suspension/HairBack31.png deleted file mode 100644 index a44180891..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack31.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack32.png b/Assets/Female3DCG/HairBack/Suspension/HairBack32.png deleted file mode 100644 index 2c684df0f..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack32.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack33.png b/Assets/Female3DCG/HairBack/Suspension/HairBack33.png deleted file mode 100644 index 432adc85c..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack33.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack34.png b/Assets/Female3DCG/HairBack/Suspension/HairBack34.png deleted file mode 100644 index ae96ba5c9..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack34.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack35.png b/Assets/Female3DCG/HairBack/Suspension/HairBack35.png deleted file mode 100644 index 5ec1d9868..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack35.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack36.png b/Assets/Female3DCG/HairBack/Suspension/HairBack36.png deleted file mode 100644 index 418d8e2aa..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack36.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack37.png b/Assets/Female3DCG/HairBack/Suspension/HairBack37.png deleted file mode 100644 index 689d3eac7..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack37.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack38.png b/Assets/Female3DCG/HairBack/Suspension/HairBack38.png deleted file mode 100644 index f4b2c1979..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack38.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack39.png b/Assets/Female3DCG/HairBack/Suspension/HairBack39.png deleted file mode 100644 index 44624f5e7..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack39.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack40.png b/Assets/Female3DCG/HairBack/Suspension/HairBack40.png deleted file mode 100644 index 9391fd02f..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack40.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack41.png b/Assets/Female3DCG/HairBack/Suspension/HairBack41.png deleted file mode 100644 index 5f77176a9..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack41.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack42.png b/Assets/Female3DCG/HairBack/Suspension/HairBack42.png deleted file mode 100644 index 54b52e802..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack42.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack43.png b/Assets/Female3DCG/HairBack/Suspension/HairBack43.png deleted file mode 100644 index df079d3c3..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack43.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack44.png b/Assets/Female3DCG/HairBack/Suspension/HairBack44.png deleted file mode 100644 index 0b3204caa..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack44.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack45.png b/Assets/Female3DCG/HairBack/Suspension/HairBack45.png deleted file mode 100644 index 9ecfa096a..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack45.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack4b.png b/Assets/Female3DCG/HairBack/Suspension/HairBack4b.png deleted file mode 100644 index 3ac670be1..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack4b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack5.png b/Assets/Female3DCG/HairBack/Suspension/HairBack5.png deleted file mode 100644 index 432adc85c..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack5.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack50.png b/Assets/Female3DCG/HairBack/Suspension/HairBack50.png deleted file mode 100644 index 972a0a77e..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack50.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack54_Left.png b/Assets/Female3DCG/HairBack/Suspension/HairBack54_Left.png deleted file mode 100644 index d8a04307f..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack54_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack54_Right.png b/Assets/Female3DCG/HairBack/Suspension/HairBack54_Right.png deleted file mode 100644 index bb41f4f53..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack54_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack5b.png b/Assets/Female3DCG/HairBack/Suspension/HairBack5b.png deleted file mode 100644 index e907c8c43..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack5b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack6.png b/Assets/Female3DCG/HairBack/Suspension/HairBack6.png deleted file mode 100644 index 897b572e7..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack6.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack6b.png b/Assets/Female3DCG/HairBack/Suspension/HairBack6b.png deleted file mode 100644 index 1fa76b622..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack6b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairBack/Suspension/HairBack8.png b/Assets/Female3DCG/HairBack/Suspension/HairBack8.png deleted file mode 100644 index 402caaa62..000000000 Binary files a/Assets/Female3DCG/HairBack/Suspension/HairBack8.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront1.png b/Assets/Female3DCG/HairFront/HairFront1.png deleted file mode 100644 index ea630a705..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront10.png b/Assets/Female3DCG/HairFront/HairFront10.png deleted file mode 100644 index 31d98f563..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront10.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront10b.png b/Assets/Female3DCG/HairFront/HairFront10b.png deleted file mode 100644 index 1d3e0e1a2..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront10b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront11.png b/Assets/Female3DCG/HairFront/HairFront11.png deleted file mode 100644 index 1177e4a9f..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront11.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront11b.png b/Assets/Female3DCG/HairFront/HairFront11b.png deleted file mode 100644 index 526387bc5..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront11b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront12.png b/Assets/Female3DCG/HairFront/HairFront12.png deleted file mode 100644 index 68c01791f..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront12.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront12b.png b/Assets/Female3DCG/HairFront/HairFront12b.png deleted file mode 100644 index 2b1de8939..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront12b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront13.png b/Assets/Female3DCG/HairFront/HairFront13.png deleted file mode 100644 index dafcc3126..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront13.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront13b.png b/Assets/Female3DCG/HairFront/HairFront13b.png deleted file mode 100644 index 83248db96..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront13b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront14.png b/Assets/Female3DCG/HairFront/HairFront14.png deleted file mode 100644 index 8ce2528a3..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront14.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront14b.png b/Assets/Female3DCG/HairFront/HairFront14b.png deleted file mode 100644 index 371a23ab6..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront14b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront15.png b/Assets/Female3DCG/HairFront/HairFront15.png deleted file mode 100644 index b71f1f6dc..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront15.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront16.png b/Assets/Female3DCG/HairFront/HairFront16.png deleted file mode 100644 index 6f5590516..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront16.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront17.png b/Assets/Female3DCG/HairFront/HairFront17.png deleted file mode 100644 index 42c1d1488..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront17.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront17b.png b/Assets/Female3DCG/HairFront/HairFront17b.png deleted file mode 100644 index 2d504240b..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront17b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront18.png b/Assets/Female3DCG/HairFront/HairFront18.png deleted file mode 100644 index d8e39bc94..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront18.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront19.png b/Assets/Female3DCG/HairFront/HairFront19.png deleted file mode 100644 index b7b4ccbce..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront19.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront1b.png b/Assets/Female3DCG/HairFront/HairFront1b.png deleted file mode 100644 index 3f10c2260..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront1b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront2.png b/Assets/Female3DCG/HairFront/HairFront2.png deleted file mode 100644 index 2419e0bde..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront20.png b/Assets/Female3DCG/HairFront/HairFront20.png deleted file mode 100644 index da46d23e6..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront20.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront21.png b/Assets/Female3DCG/HairFront/HairFront21.png deleted file mode 100644 index 09784a67d..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront21.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront22_Base.png b/Assets/Female3DCG/HairFront/HairFront22_Base.png deleted file mode 100644 index 89323601d..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront22_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront22_Fluff.png b/Assets/Female3DCG/HairFront/HairFront22_Fluff.png deleted file mode 100644 index f8f2e59ec..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront22_Fluff.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront22_FrontFluff.png b/Assets/Female3DCG/HairFront/HairFront22_FrontFluff.png deleted file mode 100644 index f215daddf..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront22_FrontFluff.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront22_Tip.png b/Assets/Female3DCG/HairFront/HairFront22_Tip.png deleted file mode 100644 index 3e11719a1..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront22_Tip.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront22b_Base.png b/Assets/Female3DCG/HairFront/HairFront22b_Base.png deleted file mode 100644 index 89323601d..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront22b_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront22b_Fluff.png b/Assets/Female3DCG/HairFront/HairFront22b_Fluff.png deleted file mode 100644 index 2f268cfe9..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront22b_Fluff.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront22b_FrontFluff.png b/Assets/Female3DCG/HairFront/HairFront22b_FrontFluff.png deleted file mode 100644 index f90dc3fc4..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront22b_FrontFluff.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront22b_FrontTip.png b/Assets/Female3DCG/HairFront/HairFront22b_FrontTip.png deleted file mode 100644 index b01703c05..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront22b_FrontTip.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront22b_Tip.png b/Assets/Female3DCG/HairFront/HairFront22b_Tip.png deleted file mode 100644 index 3e11719a1..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront22b_Tip.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront23_Base.png b/Assets/Female3DCG/HairFront/HairFront23_Base.png deleted file mode 100644 index 89323601d..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront23_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront23_Fluff.png b/Assets/Female3DCG/HairFront/HairFront23_Fluff.png deleted file mode 100644 index f009a7283..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront23_Fluff.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront23_FrontFluff.png b/Assets/Female3DCG/HairFront/HairFront23_FrontFluff.png deleted file mode 100644 index 3738f3f88..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront23_FrontFluff.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront23_Tip.png b/Assets/Female3DCG/HairFront/HairFront23_Tip.png deleted file mode 100644 index 46057d128..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront23_Tip.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront23b_Base.png b/Assets/Female3DCG/HairFront/HairFront23b_Base.png deleted file mode 100644 index 89323601d..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront23b_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront23b_Fluff.png b/Assets/Female3DCG/HairFront/HairFront23b_Fluff.png deleted file mode 100644 index e035ee0d8..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront23b_Fluff.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront23b_FrontFluff.png b/Assets/Female3DCG/HairFront/HairFront23b_FrontFluff.png deleted file mode 100644 index 27fc22add..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront23b_FrontFluff.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront23b_FrontTip.png b/Assets/Female3DCG/HairFront/HairFront23b_FrontTip.png deleted file mode 100644 index bfd887a62..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront23b_FrontTip.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront23b_Tip.png b/Assets/Female3DCG/HairFront/HairFront23b_Tip.png deleted file mode 100644 index dddb3d42e..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront23b_Tip.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront24.png b/Assets/Female3DCG/HairFront/HairFront24.png deleted file mode 100644 index 2d78740f9..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront24.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront25.png b/Assets/Female3DCG/HairFront/HairFront25.png deleted file mode 100644 index 2da1e7c6c..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront25.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront26.png b/Assets/Female3DCG/HairFront/HairFront26.png deleted file mode 100644 index f6d564c1e..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront26.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront27_Bangs.png b/Assets/Female3DCG/HairFront/HairFront27_Bangs.png deleted file mode 100644 index 8663b498c..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront27_Bangs.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront27_BangsTip.png b/Assets/Female3DCG/HairFront/HairFront27_BangsTip.png deleted file mode 100644 index 9a537aa5e..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront27_BangsTip.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront27_Base.png b/Assets/Female3DCG/HairFront/HairFront27_Base.png deleted file mode 100644 index 650dbf4a8..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront27_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront28_Bangs.png b/Assets/Female3DCG/HairFront/HairFront28_Bangs.png deleted file mode 100644 index 08743af26..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront28_Bangs.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront28_Base.png b/Assets/Female3DCG/HairFront/HairFront28_Base.png deleted file mode 100644 index 5cdf6c4f0..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront28_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront28_Tips.png b/Assets/Female3DCG/HairFront/HairFront28_Tips.png deleted file mode 100644 index 5dfe242cd..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront28_Tips.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront29_Left.png b/Assets/Female3DCG/HairFront/HairFront29_Left.png deleted file mode 100644 index 9a4f30311..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront29_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront29_Right.png b/Assets/Female3DCG/HairFront/HairFront29_Right.png deleted file mode 100644 index f5939efcd..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront29_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront2b.png b/Assets/Female3DCG/HairFront/HairFront2b.png deleted file mode 100644 index 018cf686b..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront2b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront3.png b/Assets/Female3DCG/HairFront/HairFront3.png deleted file mode 100644 index 477797aeb..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront3.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront3b.png b/Assets/Female3DCG/HairFront/HairFront3b.png deleted file mode 100644 index a69334f06..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront3b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront4.png b/Assets/Female3DCG/HairFront/HairFront4.png deleted file mode 100644 index 26e3a36e3..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront4.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront4b.png b/Assets/Female3DCG/HairFront/HairFront4b.png deleted file mode 100644 index f0c9292da..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront4b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront5.png b/Assets/Female3DCG/HairFront/HairFront5.png deleted file mode 100644 index bc66174aa..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront5.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront5b.png b/Assets/Female3DCG/HairFront/HairFront5b.png deleted file mode 100644 index e3e163482..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront5b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront6.png b/Assets/Female3DCG/HairFront/HairFront6.png deleted file mode 100644 index 63a670364..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront6.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront6b.png b/Assets/Female3DCG/HairFront/HairFront6b.png deleted file mode 100644 index 1b664b973..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront6b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront7.png b/Assets/Female3DCG/HairFront/HairFront7.png deleted file mode 100644 index 522e4a6f8..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront7.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront7b.png b/Assets/Female3DCG/HairFront/HairFront7b.png deleted file mode 100644 index 7e9aa8062..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront7b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront8.png b/Assets/Female3DCG/HairFront/HairFront8.png deleted file mode 100644 index 34880b675..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront8.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront8b.png b/Assets/Female3DCG/HairFront/HairFront8b.png deleted file mode 100644 index ffa0884ca..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront8b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront9.png b/Assets/Female3DCG/HairFront/HairFront9.png deleted file mode 100644 index e251df92e..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront9.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/HairFront9b.png b/Assets/Female3DCG/HairFront/HairFront9b.png deleted file mode 100644 index b5dc830db..000000000 Binary files a/Assets/Female3DCG/HairFront/HairFront9b.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Orig/HairFront1.png b/Assets/Female3DCG/HairFront/Orig/HairFront1.png deleted file mode 100644 index ce4b84755..000000000 Binary files a/Assets/Female3DCG/HairFront/Orig/HairFront1.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Orig/HairFront13.png b/Assets/Female3DCG/HairFront/Orig/HairFront13.png deleted file mode 100644 index dafcc3126..000000000 Binary files a/Assets/Female3DCG/HairFront/Orig/HairFront13.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Orig/HairFront2.png b/Assets/Female3DCG/HairFront/Orig/HairFront2.png deleted file mode 100644 index c1aaff9a4..000000000 Binary files a/Assets/Female3DCG/HairFront/Orig/HairFront2.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Orig/HairFront3.png b/Assets/Female3DCG/HairFront/Orig/HairFront3.png deleted file mode 100644 index 35e8bdda1..000000000 Binary files a/Assets/Female3DCG/HairFront/Orig/HairFront3.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Orig/HairFront4.png b/Assets/Female3DCG/HairFront/Orig/HairFront4.png deleted file mode 100644 index 7cecd66af..000000000 Binary files a/Assets/Female3DCG/HairFront/Orig/HairFront4.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Orig/HairFront5.png b/Assets/Female3DCG/HairFront/Orig/HairFront5.png deleted file mode 100644 index c33e4b7c2..000000000 Binary files a/Assets/Female3DCG/HairFront/Orig/HairFront5.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Orig/HairFront6.png b/Assets/Female3DCG/HairFront/Orig/HairFront6.png deleted file mode 100644 index 719b7fb27..000000000 Binary files a/Assets/Female3DCG/HairFront/Orig/HairFront6.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Orig/HairFront7.png b/Assets/Female3DCG/HairFront/Orig/HairFront7.png deleted file mode 100644 index 861871c35..000000000 Binary files a/Assets/Female3DCG/HairFront/Orig/HairFront7.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Orig/HairFront8.png b/Assets/Female3DCG/HairFront/Orig/HairFront8.png deleted file mode 100644 index decb90a23..000000000 Binary files a/Assets/Female3DCG/HairFront/Orig/HairFront8.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Orig/HairFront9.png b/Assets/Female3DCG/HairFront/Orig/HairFront9.png deleted file mode 100644 index 8840e2f22..000000000 Binary files a/Assets/Female3DCG/HairFront/Orig/HairFront9.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Suspension/HairFront27_Bangs.png b/Assets/Female3DCG/HairFront/Suspension/HairFront27_Bangs.png deleted file mode 100644 index f7a04e0ae..000000000 Binary files a/Assets/Female3DCG/HairFront/Suspension/HairFront27_Bangs.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Suspension/HairFront27_BangsTip.png b/Assets/Female3DCG/HairFront/Suspension/HairFront27_BangsTip.png deleted file mode 100644 index 91baeb11d..000000000 Binary files a/Assets/Female3DCG/HairFront/Suspension/HairFront27_BangsTip.png and /dev/null differ diff --git a/Assets/Female3DCG/HairFront/Suspension/HairFront27_Base.png b/Assets/Female3DCG/HairFront/Suspension/HairFront27_Base.png deleted file mode 100644 index 8e5b223d1..000000000 Binary files a/Assets/Female3DCG/HairFront/Suspension/HairFront27_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Hands/AllFours/Default_Asian.png b/Assets/Female3DCG/Hands/AllFours/Default_Asian.png deleted file mode 100644 index cf17f62f3..000000000 Binary files a/Assets/Female3DCG/Hands/AllFours/Default_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/Hands/AllFours/Default_Black.png b/Assets/Female3DCG/Hands/AllFours/Default_Black.png deleted file mode 100644 index d02068fb4..000000000 Binary files a/Assets/Female3DCG/Hands/AllFours/Default_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/Hands/AllFours/Default_White.png b/Assets/Female3DCG/Hands/AllFours/Default_White.png deleted file mode 100644 index 18a3e59c8..000000000 Binary files a/Assets/Female3DCG/Hands/AllFours/Default_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Hands/Default_Asian.png b/Assets/Female3DCG/Hands/Default_Asian.png deleted file mode 100644 index 427ec24c4..000000000 Binary files a/Assets/Female3DCG/Hands/Default_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/Hands/Default_Black.png b/Assets/Female3DCG/Hands/Default_Black.png deleted file mode 100644 index 52cdee8a0..000000000 Binary files a/Assets/Female3DCG/Hands/Default_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/Hands/Default_White.png b/Assets/Female3DCG/Hands/Default_White.png deleted file mode 100644 index 50a0346e5..000000000 Binary files a/Assets/Female3DCG/Hands/Default_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Hands/TapedHands/Default_Asian.png b/Assets/Female3DCG/Hands/TapedHands/Default_Asian.png deleted file mode 100644 index 3a1a2de26..000000000 Binary files a/Assets/Female3DCG/Hands/TapedHands/Default_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/Hands/TapedHands/Default_Black.png b/Assets/Female3DCG/Hands/TapedHands/Default_Black.png deleted file mode 100644 index bb2825988..000000000 Binary files a/Assets/Female3DCG/Hands/TapedHands/Default_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/Hands/TapedHands/Default_White.png b/Assets/Female3DCG/Hands/TapedHands/Default_White.png deleted file mode 100644 index e0edfc0cd..000000000 Binary files a/Assets/Female3DCG/Hands/TapedHands/Default_White.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BakerBoyHat.png b/Assets/Female3DCG/Hat/BakerBoyHat.png deleted file mode 100644 index eb76935b9..000000000 Binary files a/Assets/Female3DCG/Hat/BakerBoyHat.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapBack_Button.png b/Assets/Female3DCG/Hat/BallCapBack_Button.png deleted file mode 100644 index c56a8371d..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapBack_Button.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapBack_PanelLeft.png b/Assets/Female3DCG/Hat/BallCapBack_PanelLeft.png deleted file mode 100644 index d60f0e9ac..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapBack_PanelLeft.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapBack_PanelRight.png b/Assets/Female3DCG/Hat/BallCapBack_PanelRight.png deleted file mode 100644 index 36b2a0c5d..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapBack_PanelRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapBack_SideLeft.png b/Assets/Female3DCG/Hat/BallCapBack_SideLeft.png deleted file mode 100644 index 07e32d977..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapBack_SideLeft.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapBack_SideRight.png b/Assets/Female3DCG/Hat/BallCapBack_SideRight.png deleted file mode 100644 index 4a765d957..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapBack_SideRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapBack_Strap.png b/Assets/Female3DCG/Hat/BallCapBack_Strap.png deleted file mode 100644 index 26535d244..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapBack_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapBack_StrapUnder.png b/Assets/Female3DCG/Hat/BallCapBack_StrapUnder.png deleted file mode 100644 index 26535d244..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapBack_StrapUnder.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFrontBCLogo_Print.png b/Assets/Female3DCG/Hat/BallCapFrontBCLogo_Print.png deleted file mode 100644 index 8f2a1bddb..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFrontBCLogo_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFrontBDSM_Print.png b/Assets/Female3DCG/Hat/BallCapFrontBDSM_Print.png deleted file mode 100644 index ef79be72a..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFrontBDSM_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFrontBG_Print.png b/Assets/Female3DCG/Hat/BallCapFrontBG_Print.png deleted file mode 100644 index e3c9cfb03..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFrontBG_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFrontChain_Print.png b/Assets/Female3DCG/Hat/BallCapFrontChain_Print.png deleted file mode 100644 index cd0d5af81..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFrontChain_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFrontGag_Print.png b/Assets/Female3DCG/Hat/BallCapFrontGag_Print.png deleted file mode 100644 index 33fba9d3c..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFrontGag_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFrontKnot_Print.png b/Assets/Female3DCG/Hat/BallCapFrontKnot_Print.png deleted file mode 100644 index fd8a18b73..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFrontKnot_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFrontMonogram_Print.png b/Assets/Female3DCG/Hat/BallCapFrontMonogram_Print.png deleted file mode 100644 index cf837edf8..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFrontMonogram_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFrontRock_Print.png b/Assets/Female3DCG/Hat/BallCapFrontRock_Print.png deleted file mode 100644 index 50396a2c8..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFrontRock_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFrontSmile_Print.png b/Assets/Female3DCG/Hat/BallCapFrontSmile_Print.png deleted file mode 100644 index 914d5e894..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFrontSmile_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFrontSun_Print.png b/Assets/Female3DCG/Hat/BallCapFrontSun_Print.png deleted file mode 100644 index aa4713998..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFrontSun_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFrontTick_Print.png b/Assets/Female3DCG/Hat/BallCapFrontTick_Print.png deleted file mode 100644 index 31cf34537..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFrontTick_Print.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFront_Button.png b/Assets/Female3DCG/Hat/BallCapFront_Button.png deleted file mode 100644 index 9dd381e31..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFront_Button.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFront_Panel.png b/Assets/Female3DCG/Hat/BallCapFront_Panel.png deleted file mode 100644 index abd7b8b87..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFront_Panel.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFront_PanelLeft.png b/Assets/Female3DCG/Hat/BallCapFront_PanelLeft.png deleted file mode 100644 index c2895f25c..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFront_PanelLeft.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFront_PanelRight.png b/Assets/Female3DCG/Hat/BallCapFront_PanelRight.png deleted file mode 100644 index 5d1df6847..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFront_PanelRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BallCapFront_Visor.png b/Assets/Female3DCG/Hat/BallCapFront_Visor.png deleted file mode 100644 index fb321c26f..000000000 Binary files a/Assets/Female3DCG/Hat/BallCapFront_Visor.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Band1.png b/Assets/Female3DCG/Hat/Band1.png deleted file mode 100644 index fe4353ddf..000000000 Binary files a/Assets/Female3DCG/Hat/Band1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Band2.png b/Assets/Female3DCG/Hat/Band2.png deleted file mode 100644 index 6b5baa236..000000000 Binary files a/Assets/Female3DCG/Hat/Band2.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BandanaCircles_BandPattern.png b/Assets/Female3DCG/Hat/BandanaCircles_BandPattern.png deleted file mode 100644 index 448c315ca..000000000 Binary files a/Assets/Female3DCG/Hat/BandanaCircles_BandPattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BandanaCircles_BowPattern.png b/Assets/Female3DCG/Hat/BandanaCircles_BowPattern.png deleted file mode 100644 index d7ee8b6e1..000000000 Binary files a/Assets/Female3DCG/Hat/BandanaCircles_BowPattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BandanaFlowers_BandPattern.png b/Assets/Female3DCG/Hat/BandanaFlowers_BandPattern.png deleted file mode 100644 index b089c4ca1..000000000 Binary files a/Assets/Female3DCG/Hat/BandanaFlowers_BandPattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BandanaFlowers_BowPattern.png b/Assets/Female3DCG/Hat/BandanaFlowers_BowPattern.png deleted file mode 100644 index e4019c0c6..000000000 Binary files a/Assets/Female3DCG/Hat/BandanaFlowers_BowPattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BandanaPolkaDots_BandPattern.png b/Assets/Female3DCG/Hat/BandanaPolkaDots_BandPattern.png deleted file mode 100644 index dec7471ea..000000000 Binary files a/Assets/Female3DCG/Hat/BandanaPolkaDots_BandPattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BandanaPolkaDots_BowPattern.png b/Assets/Female3DCG/Hat/BandanaPolkaDots_BowPattern.png deleted file mode 100644 index 125d6f526..000000000 Binary files a/Assets/Female3DCG/Hat/BandanaPolkaDots_BowPattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BandanaTriangles_BandPattern.png b/Assets/Female3DCG/Hat/BandanaTriangles_BandPattern.png deleted file mode 100644 index c9d4f3939..000000000 Binary files a/Assets/Female3DCG/Hat/BandanaTriangles_BandPattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BandanaTriangles_BowPattern.png b/Assets/Female3DCG/Hat/BandanaTriangles_BowPattern.png deleted file mode 100644 index bcc5e6163..000000000 Binary files a/Assets/Female3DCG/Hat/BandanaTriangles_BowPattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Bandana_Band.png b/Assets/Female3DCG/Hat/Bandana_Band.png deleted file mode 100644 index 86148f347..000000000 Binary files a/Assets/Female3DCG/Hat/Bandana_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Bandana_Bow.png b/Assets/Female3DCG/Hat/Bandana_Bow.png deleted file mode 100644 index 6c7b803f8..000000000 Binary files a/Assets/Female3DCG/Hat/Bandana_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Beret1.png b/Assets/Female3DCG/Hat/Beret1.png deleted file mode 100644 index fd0c9cef8..000000000 Binary files a/Assets/Female3DCG/Hat/Beret1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Bonnet1_Base.png b/Assets/Female3DCG/Hat/Bonnet1_Base.png deleted file mode 100644 index 7499cb1c8..000000000 Binary files a/Assets/Female3DCG/Hat/Bonnet1_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Bonnet1_Lace.png b/Assets/Female3DCG/Hat/Bonnet1_Lace.png deleted file mode 100644 index 852c37ba4..000000000 Binary files a/Assets/Female3DCG/Hat/Bonnet1_Lace.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Bonnet2.png b/Assets/Female3DCG/Hat/Bonnet2.png deleted file mode 100644 index f47c9c389..000000000 Binary files a/Assets/Female3DCG/Hat/Bonnet2.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/BunnySuccubus2.png b/Assets/Female3DCG/Hat/BunnySuccubus2.png deleted file mode 100644 index a70af042c..000000000 Binary files a/Assets/Female3DCG/Hat/BunnySuccubus2.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/CaptainHat1_Brim.png b/Assets/Female3DCG/Hat/CaptainHat1_Brim.png deleted file mode 100644 index aefa75be4..000000000 Binary files a/Assets/Female3DCG/Hat/CaptainHat1_Brim.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/CaptainHat1_Insignia.png b/Assets/Female3DCG/Hat/CaptainHat1_Insignia.png deleted file mode 100644 index dcdb7e81c..000000000 Binary files a/Assets/Female3DCG/Hat/CaptainHat1_Insignia.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/CaptainHat1_Rope.png b/Assets/Female3DCG/Hat/CaptainHat1_Rope.png deleted file mode 100644 index e841c15b1..000000000 Binary files a/Assets/Female3DCG/Hat/CaptainHat1_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/CaptainHat1_Top.png b/Assets/Female3DCG/Hat/CaptainHat1_Top.png deleted file mode 100644 index e85a55ba5..000000000 Binary files a/Assets/Female3DCG/Hat/CaptainHat1_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/CollegeDunce.png b/Assets/Female3DCG/Hat/CollegeDunce.png deleted file mode 100644 index 4335eb1ad..000000000 Binary files a/Assets/Female3DCG/Hat/CollegeDunce.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Crown1.png b/Assets/Female3DCG/Hat/Crown1.png deleted file mode 100644 index 319a9a730..000000000 Binary files a/Assets/Female3DCG/Hat/Crown1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Crown2_Crown.png b/Assets/Female3DCG/Hat/Crown2_Crown.png deleted file mode 100644 index ffe81fd21..000000000 Binary files a/Assets/Female3DCG/Hat/Crown2_Crown.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Crown2_Jewels.png b/Assets/Female3DCG/Hat/Crown2_Jewels.png deleted file mode 100644 index 10acaf6ae..000000000 Binary files a/Assets/Female3DCG/Hat/Crown2_Jewels.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Crown3_Crown.png b/Assets/Female3DCG/Hat/Crown3_Crown.png deleted file mode 100644 index bef1926b1..000000000 Binary files a/Assets/Female3DCG/Hat/Crown3_Crown.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Crown3_Jewels.png b/Assets/Female3DCG/Hat/Crown3_Jewels.png deleted file mode 100644 index d2e2d3cf2..000000000 Binary files a/Assets/Female3DCG/Hat/Crown3_Jewels.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Crown4.png b/Assets/Female3DCG/Hat/Crown4.png deleted file mode 100644 index 7f03cf328..000000000 Binary files a/Assets/Female3DCG/Hat/Crown4.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Crown5.png b/Assets/Female3DCG/Hat/Crown5.png deleted file mode 100644 index 450dae034..000000000 Binary files a/Assets/Female3DCG/Hat/Crown5.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/FacePaint.png b/Assets/Female3DCG/Hat/FacePaint.png deleted file mode 100644 index 64d3d912e..000000000 Binary files a/Assets/Female3DCG/Hat/FacePaint.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/FlowerCrown_MainFlowers.png b/Assets/Female3DCG/Hat/FlowerCrown_MainFlowers.png deleted file mode 100644 index 12a6767f1..000000000 Binary files a/Assets/Female3DCG/Hat/FlowerCrown_MainFlowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/FlowerCrown_Petals.png b/Assets/Female3DCG/Hat/FlowerCrown_Petals.png deleted file mode 100644 index 89f2b643e..000000000 Binary files a/Assets/Female3DCG/Hat/FlowerCrown_Petals.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/FurHeadband.png b/Assets/Female3DCG/Hat/FurHeadband.png deleted file mode 100644 index ae726d7e8..000000000 Binary files a/Assets/Female3DCG/Hat/FurHeadband.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/HeadTowel1.png b/Assets/Female3DCG/Hat/HeadTowel1.png deleted file mode 100644 index 352bbf977..000000000 Binary files a/Assets/Female3DCG/Hat/HeadTowel1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/MaidHairband1.png b/Assets/Female3DCG/Hat/MaidHairband1.png deleted file mode 100644 index 26475f866..000000000 Binary files a/Assets/Female3DCG/Hat/MaidHairband1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/NurseCap.png b/Assets/Female3DCG/Hat/NurseCap.png deleted file mode 100644 index 5c74a9e19..000000000 Binary files a/Assets/Female3DCG/Hat/NurseCap.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/PirateBandana1_Bandana.png b/Assets/Female3DCG/Hat/PirateBandana1_Bandana.png deleted file mode 100644 index 481a927b1..000000000 Binary files a/Assets/Female3DCG/Hat/PirateBandana1_Bandana.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/PirateBandana1_Dots.png b/Assets/Female3DCG/Hat/PirateBandana1_Dots.png deleted file mode 100644 index 4fa9ba37c..000000000 Binary files a/Assets/Female3DCG/Hat/PirateBandana1_Dots.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/PirateBandana1_Skull.png b/Assets/Female3DCG/Hat/PirateBandana1_Skull.png deleted file mode 100644 index 1e7887db4..000000000 Binary files a/Assets/Female3DCG/Hat/PirateBandana1_Skull.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/PoliceWomanHat_Badge.png b/Assets/Female3DCG/Hat/PoliceWomanHat_Badge.png deleted file mode 100644 index 866cd7aec..000000000 Binary files a/Assets/Female3DCG/Hat/PoliceWomanHat_Badge.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/PoliceWomanHat_Hat.png b/Assets/Female3DCG/Hat/PoliceWomanHat_Hat.png deleted file mode 100644 index d0982c7cb..000000000 Binary files a/Assets/Female3DCG/Hat/PoliceWomanHat_Hat.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/PoppyCrown.png b/Assets/Female3DCG/Hat/PoppyCrown.png deleted file mode 100644 index 73bc69aa2..000000000 Binary files a/Assets/Female3DCG/Hat/PoppyCrown.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/PoppyCrown_Center.png b/Assets/Female3DCG/Hat/PoppyCrown_Center.png deleted file mode 100644 index f359fda61..000000000 Binary files a/Assets/Female3DCG/Hat/PoppyCrown_Center.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/PoppyCrown_EndFlowers.png b/Assets/Female3DCG/Hat/PoppyCrown_EndFlowers.png deleted file mode 100644 index 51e298236..000000000 Binary files a/Assets/Female3DCG/Hat/PoppyCrown_EndFlowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/PoppyCrown_Leaves.png b/Assets/Female3DCG/Hat/PoppyCrown_Leaves.png deleted file mode 100644 index 1019a0c9e..000000000 Binary files a/Assets/Female3DCG/Hat/PoppyCrown_Leaves.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/PoppyCrown_MainFlower.png b/Assets/Female3DCG/Hat/PoppyCrown_MainFlower.png deleted file mode 100644 index b1b9fb067..000000000 Binary files a/Assets/Female3DCG/Hat/PoppyCrown_MainFlower.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/PoppyCrown_SideFlowers.png b/Assets/Female3DCG/Hat/PoppyCrown_SideFlowers.png deleted file mode 100644 index 83f449b0f..000000000 Binary files a/Assets/Female3DCG/Hat/PoppyCrown_SideFlowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/BakerBoyHat.png b/Assets/Female3DCG/Hat/Preview/BakerBoyHat.png deleted file mode 100644 index b251fb723..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/BakerBoyHat.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/BallCapBack.png b/Assets/Female3DCG/Hat/Preview/BallCapBack.png deleted file mode 100644 index f0fa0a77d..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/BallCapBack.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/BallCapFront.png b/Assets/Female3DCG/Hat/Preview/BallCapFront.png deleted file mode 100644 index cc269545a..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/BallCapFront.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Band1.png b/Assets/Female3DCG/Hat/Preview/Band1.png deleted file mode 100644 index 5a472604f..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Band1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Band2.png b/Assets/Female3DCG/Hat/Preview/Band2.png deleted file mode 100644 index b42a7d73d..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Band2.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Bandana.png b/Assets/Female3DCG/Hat/Preview/Bandana.png deleted file mode 100644 index 4c9dca93d..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Bandana.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Beret1.png b/Assets/Female3DCG/Hat/Preview/Beret1.png deleted file mode 100644 index 288f055ef..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Beret1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Bonnet1.png b/Assets/Female3DCG/Hat/Preview/Bonnet1.png deleted file mode 100644 index 2231d0d6a..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Bonnet1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Bonnet2.png b/Assets/Female3DCG/Hat/Preview/Bonnet2.png deleted file mode 100644 index 677706302..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Bonnet2.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/BunnySuccubus2.png b/Assets/Female3DCG/Hat/Preview/BunnySuccubus2.png deleted file mode 100644 index eaa7d4069..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/BunnySuccubus2.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/CaptainHat1.png b/Assets/Female3DCG/Hat/Preview/CaptainHat1.png deleted file mode 100644 index 10f4cedff..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/CaptainHat1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/CollegeDunce.png b/Assets/Female3DCG/Hat/Preview/CollegeDunce.png deleted file mode 100644 index 4335eb1ad..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/CollegeDunce.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Crown1.png b/Assets/Female3DCG/Hat/Preview/Crown1.png deleted file mode 100644 index a84c7677e..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Crown1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Crown2.png b/Assets/Female3DCG/Hat/Preview/Crown2.png deleted file mode 100644 index 95b86f686..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Crown2.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Crown3.png b/Assets/Female3DCG/Hat/Preview/Crown3.png deleted file mode 100644 index 81cf3db31..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Crown3.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Crown4.png b/Assets/Female3DCG/Hat/Preview/Crown4.png deleted file mode 100644 index 362c7a088..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Crown4.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Crown5.png b/Assets/Female3DCG/Hat/Preview/Crown5.png deleted file mode 100644 index 2b7919f64..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Crown5.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/FacePaint.png b/Assets/Female3DCG/Hat/Preview/FacePaint.png deleted file mode 100644 index 1f6f4e6ed..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/FacePaint.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/FlowerCrown.png b/Assets/Female3DCG/Hat/Preview/FlowerCrown.png deleted file mode 100644 index 1c8cbed61..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/FlowerCrown.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/FurHeadband.png b/Assets/Female3DCG/Hat/Preview/FurHeadband.png deleted file mode 100644 index 5a6583b80..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/FurHeadband.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/HeadTowel1.png b/Assets/Female3DCG/Hat/Preview/HeadTowel1.png deleted file mode 100644 index 2c0458496..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/HeadTowel1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/MaidHairband1.png b/Assets/Female3DCG/Hat/Preview/MaidHairband1.png deleted file mode 100644 index 26475f866..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/MaidHairband1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/NurseCap.png b/Assets/Female3DCG/Hat/Preview/NurseCap.png deleted file mode 100644 index 5c74a9e19..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/NurseCap.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/PirateBandana1.png b/Assets/Female3DCG/Hat/Preview/PirateBandana1.png deleted file mode 100644 index 6c90ae069..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/PirateBandana1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/PoliceWomanHat.png b/Assets/Female3DCG/Hat/Preview/PoliceWomanHat.png deleted file mode 100644 index cdda1ba53..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/PoliceWomanHat.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/PoppyCrown.png b/Assets/Female3DCG/Hat/Preview/PoppyCrown.png deleted file mode 100644 index 4b4a3deb4..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/PoppyCrown.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/ReindeerBand.png b/Assets/Female3DCG/Hat/Preview/ReindeerBand.png deleted file mode 100644 index 9d9704eba..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/ReindeerBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/RoseCrown.png b/Assets/Female3DCG/Hat/Preview/RoseCrown.png deleted file mode 100644 index ac49ab621..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/RoseCrown.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Santa1.png b/Assets/Female3DCG/Hat/Preview/Santa1.png deleted file mode 100644 index 6cf4bc90c..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Santa1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/SmallHat1.png b/Assets/Female3DCG/Hat/Preview/SmallHat1.png deleted file mode 100644 index cbc86901f..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/SmallHat1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Tiara1.png b/Assets/Female3DCG/Hat/Preview/Tiara1.png deleted file mode 100644 index c672d79c0..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Tiara1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Veil1.png b/Assets/Female3DCG/Hat/Preview/Veil1.png deleted file mode 100644 index ee0691d5c..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Veil1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/Veil2.png b/Assets/Female3DCG/Hat/Preview/Veil2.png deleted file mode 100644 index d2091e2e9..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/Veil2.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Preview/WitchHat1.png b/Assets/Female3DCG/Hat/Preview/WitchHat1.png deleted file mode 100644 index 4bc7cadd3..000000000 Binary files a/Assets/Female3DCG/Hat/Preview/WitchHat1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/ReindeerBand.png b/Assets/Female3DCG/Hat/ReindeerBand.png deleted file mode 100644 index 5b54d26b5..000000000 Binary files a/Assets/Female3DCG/Hat/ReindeerBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/RoseCrown_Leaves.png b/Assets/Female3DCG/Hat/RoseCrown_Leaves.png deleted file mode 100644 index 7dbc2d1b4..000000000 Binary files a/Assets/Female3DCG/Hat/RoseCrown_Leaves.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/RoseCrown_Roses.png b/Assets/Female3DCG/Hat/RoseCrown_Roses.png deleted file mode 100644 index f8f129bab..000000000 Binary files a/Assets/Female3DCG/Hat/RoseCrown_Roses.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Santa1_Fabric.png b/Assets/Female3DCG/Hat/Santa1_Fabric.png deleted file mode 100644 index 6e85afa13..000000000 Binary files a/Assets/Female3DCG/Hat/Santa1_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Santa1_Fur.png b/Assets/Female3DCG/Hat/Santa1_Fur.png deleted file mode 100644 index bba0a08dd..000000000 Binary files a/Assets/Female3DCG/Hat/Santa1_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/SmallHat1.png b/Assets/Female3DCG/Hat/SmallHat1.png deleted file mode 100644 index 436e9983c..000000000 Binary files a/Assets/Female3DCG/Hat/SmallHat1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Tiara1.png b/Assets/Female3DCG/Hat/Tiara1.png deleted file mode 100644 index 3f5e1dc39..000000000 Binary files a/Assets/Female3DCG/Hat/Tiara1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Veil1.png b/Assets/Female3DCG/Hat/Veil1.png deleted file mode 100644 index 953ec1334..000000000 Binary files a/Assets/Female3DCG/Hat/Veil1.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/Veil2.png b/Assets/Female3DCG/Hat/Veil2.png deleted file mode 100644 index 29dd1da38..000000000 Binary files a/Assets/Female3DCG/Hat/Veil2.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/WitchHat1_Band.png b/Assets/Female3DCG/Hat/WitchHat1_Band.png deleted file mode 100644 index fbce25f36..000000000 Binary files a/Assets/Female3DCG/Hat/WitchHat1_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/Hat/WitchHat1_Hat.png b/Assets/Female3DCG/Hat/WitchHat1_Hat.png deleted file mode 100644 index 4cb37d993..000000000 Binary files a/Assets/Female3DCG/Hat/WitchHat1_Hat.png and /dev/null differ diff --git a/Assets/Female3DCG/Head/Default_Asian.png b/Assets/Female3DCG/Head/Default_Asian.png deleted file mode 100644 index b5eaac345..000000000 Binary files a/Assets/Female3DCG/Head/Default_Asian.png and /dev/null differ diff --git a/Assets/Female3DCG/Head/Default_Black.png b/Assets/Female3DCG/Head/Default_Black.png deleted file mode 100644 index 2cf32a224..000000000 Binary files a/Assets/Female3DCG/Head/Default_Black.png and /dev/null differ diff --git a/Assets/Female3DCG/Head/Default_White.png b/Assets/Female3DCG/Head/Default_White.png deleted file mode 100644 index 32e84b481..000000000 Binary files a/Assets/Female3DCG/Head/Default_White.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/BedChains.png b/Assets/Female3DCG/ItemAddon/BedChains.png deleted file mode 100644 index 938494a95..000000000 Binary files a/Assets/Female3DCG/ItemAddon/BedChains.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/BedChains_Lock.png b/Assets/Female3DCG/ItemAddon/BedChains_Lock.png deleted file mode 100644 index 8ddb61adc..000000000 Binary files a/Assets/Female3DCG/ItemAddon/BedChains_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/BedRopes.png b/Assets/Female3DCG/ItemAddon/BedRopes.png deleted file mode 100644 index 0a1656232..000000000 Binary files a/Assets/Female3DCG/ItemAddon/BedRopes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/BedStraps.png b/Assets/Female3DCG/ItemAddon/BedStraps.png deleted file mode 100644 index 33e9b164c..000000000 Binary files a/Assets/Female3DCG/ItemAddon/BedStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/BedStraps_Lock.png b/Assets/Female3DCG/ItemAddon/BedStraps_Lock.png deleted file mode 100644 index c396f63b1..000000000 Binary files a/Assets/Female3DCG/ItemAddon/BedStraps_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/BedTape.png b/Assets/Female3DCG/ItemAddon/BedTape.png deleted file mode 100644 index 74cba72ce..000000000 Binary files a/Assets/Female3DCG/ItemAddon/BedTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/CeilingChain.png b/Assets/Female3DCG/ItemAddon/CeilingChain.png deleted file mode 100644 index 4ce6ec3c5..000000000 Binary files a/Assets/Female3DCG/ItemAddon/CeilingChain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/CeilingRope_Ring.png b/Assets/Female3DCG/ItemAddon/CeilingRope_Ring.png deleted file mode 100644 index 3a672e312..000000000 Binary files a/Assets/Female3DCG/ItemAddon/CeilingRope_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/CeilingRope_Ropes.png b/Assets/Female3DCG/ItemAddon/CeilingRope_Ropes.png deleted file mode 100644 index ff4c17c87..000000000 Binary files a/Assets/Female3DCG/ItemAddon/CeilingRope_Ropes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/Covers_Inner.png b/Assets/Female3DCG/ItemAddon/Covers_Inner.png deleted file mode 100644 index 6ea53c3e6..000000000 Binary files a/Assets/Female3DCG/ItemAddon/Covers_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/Covers_Outer.png b/Assets/Female3DCG/ItemAddon/Covers_Outer.png deleted file mode 100644 index 7d67c15ce..000000000 Binary files a/Assets/Female3DCG/ItemAddon/Covers_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/Preview/BedChains.png b/Assets/Female3DCG/ItemAddon/Preview/BedChains.png deleted file mode 100644 index 490e199c4..000000000 Binary files a/Assets/Female3DCG/ItemAddon/Preview/BedChains.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/Preview/BedRopes.png b/Assets/Female3DCG/ItemAddon/Preview/BedRopes.png deleted file mode 100644 index b66e802ae..000000000 Binary files a/Assets/Female3DCG/ItemAddon/Preview/BedRopes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/Preview/BedStraps.png b/Assets/Female3DCG/ItemAddon/Preview/BedStraps.png deleted file mode 100644 index 3bc623795..000000000 Binary files a/Assets/Female3DCG/ItemAddon/Preview/BedStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/Preview/BedTape.png b/Assets/Female3DCG/ItemAddon/Preview/BedTape.png deleted file mode 100644 index 008f0ff07..000000000 Binary files a/Assets/Female3DCG/ItemAddon/Preview/BedTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/Preview/CeilingChain.png b/Assets/Female3DCG/ItemAddon/Preview/CeilingChain.png deleted file mode 100644 index 0617c1adb..000000000 Binary files a/Assets/Female3DCG/ItemAddon/Preview/CeilingChain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/Preview/CeilingRope.png b/Assets/Female3DCG/ItemAddon/Preview/CeilingRope.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemAddon/Preview/CeilingRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemAddon/Preview/Covers.png b/Assets/Female3DCG/ItemAddon/Preview/Covers.png deleted file mode 100644 index 1feaa3605..000000000 Binary files a/Assets/Female3DCG/ItemAddon/Preview/Covers.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Large_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Large_Latex.png deleted file mode 100644 index d1c30cee9..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Largez1_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Largez1_Latex.png deleted file mode 100644 index 79f434097..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Largez1_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Largez2_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Largez2_Latex.png deleted file mode 100644 index 83572df7f..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Largez2_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Lock.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Lock.png deleted file mode 100644 index 272989a49..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Normal_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Normal_Latex.png deleted file mode 100644 index d04d13967..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Normalz1_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Normalz1_Latex.png deleted file mode 100644 index cb03c45d2..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Normalz1_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Normalz2_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Normalz2_Latex.png deleted file mode 100644 index 60fa99711..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Normalz2_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Small_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Small_Latex.png deleted file mode 100644 index 8cd6e7c12..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Smallz1_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Smallz1_Latex.png deleted file mode 100644 index a5a0a20b2..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Smallz1_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Smallz2_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Smallz2_Latex.png deleted file mode 100644 index faa71fc89..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Smallz2_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Straps.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Straps.png deleted file mode 100644 index 0b2f67027..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_XLarge_Latex.png deleted file mode 100644 index 3865e74f0..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_XLargez1_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_XLargez1_Latex.png deleted file mode 100644 index 2b704e077..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_XLargez1_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_XLargez2_Latex.png b/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_XLargez2_Latex.png deleted file mode 100644 index 5aaf3fccd..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/BitchSuit_XLargez2_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_ArmsLock.png b/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_ArmsLock.png deleted file mode 100644 index d9cb602eb..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_ArmsLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_Large_Arms.png b/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_Large_Arms.png deleted file mode 100644 index 782229058..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_Large_Arms.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_Normal_Arms.png b/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_Normal_Arms.png deleted file mode 100644 index 782229058..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_Normal_Arms.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_Small_Arms.png b/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_Small_Arms.png deleted file mode 100644 index 782229058..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_Small_Arms.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_XLarge_Arms.png b/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_XLarge_Arms.png deleted file mode 100644 index 782229058..000000000 Binary files a/Assets/Female3DCG/ItemArms/AllFours/StrictLeatherPetCrawler_XLarge_Arms.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Large_Jacket.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_Large_Jacket.png deleted file mode 100644 index 9de796b0f..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Large_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Large_Rings.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_Large_Rings.png deleted file mode 100644 index 3642a8612..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Large_Straps.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_Large_Straps.png deleted file mode 100644 index e18dcd53d..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Lock.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Normal_Jacket.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_Normal_Jacket.png deleted file mode 100644 index 5be557fae..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Normal_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Normal_Rings.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_Normal_Rings.png deleted file mode 100644 index e23a6f0c8..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Normal_Straps.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_Normal_Straps.png deleted file mode 100644 index 787efd2d2..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Small_Jacket.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_Small_Jacket.png deleted file mode 100644 index 10196e2ab..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Small_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Small_Rings.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_Small_Rings.png deleted file mode 100644 index 4860e3125..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Small_Straps.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_Small_Straps.png deleted file mode 100644 index 0c1f16fed..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_XLarge_Jacket.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_XLarge_Jacket.png deleted file mode 100644 index 94eb6b1b8..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_XLarge_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_XLarge_Rings.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_XLarge_Rings.png deleted file mode 100644 index 3ff716195..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ArmbinderJacket_XLarge_Straps.png b/Assets/Female3DCG/ItemArms/ArmbinderJacket_XLarge_Straps.png deleted file mode 100644 index 0cd6b769d..000000000 Binary files a/Assets/Female3DCG/ItemArms/ArmbinderJacket_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Display.png b/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Display.png deleted file mode 100644 index a5aacb6a8..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Large_Cuffs.png deleted file mode 100644 index d7812145a..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Lock.png b/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Lock.png deleted file mode 100644 index e82bb27ef..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Normal_Cuffs.png deleted file mode 100644 index 5d79f4444..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Small_Cuffs.png deleted file mode 100644 index 5c9eab92f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_XLarge_Cuffs.png deleted file mode 100644 index 45f18e44d..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/FuturisticCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Large_Cuffs.png deleted file mode 100644 index 6f74727fc..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Large_Rings.png b/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Large_Rings.png deleted file mode 100644 index c23f04299..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Lock.png b/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Lock.png deleted file mode 100644 index d6b44dbbf..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Normal_Cuffs.png deleted file mode 100644 index 54a82dba0..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Normal_Rings.png deleted file mode 100644 index 1934a00b0..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Small_Cuffs.png deleted file mode 100644 index f2ca1ae8e..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Small_Rings.png b/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Small_Rings.png deleted file mode 100644 index bab03ed81..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_XLarge_Cuffs.png deleted file mode 100644 index 78fe8a0c9..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_XLarge_Rings.png deleted file mode 100644 index 5103b0d6b..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/LeatherCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Large_Cuffs.png deleted file mode 100644 index af5788c0f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Large_Gems.png b/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Large_Gems.png deleted file mode 100644 index 711a81c05..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Lock.png b/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Normal_Cuffs.png deleted file mode 100644 index 17027a8dc..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Normal_Gems.png deleted file mode 100644 index 39a694b84..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Small_Cuffs.png deleted file mode 100644 index 155af0946..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Small_Gems.png b/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Small_Gems.png deleted file mode 100644 index 10682ee16..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_XLarge_Cuffs.png deleted file mode 100644 index fe8f4960b..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_XLarge_Gems.png deleted file mode 100644 index 29c54043e..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackBoxTie/OrnateCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Display.png b/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Display.png deleted file mode 100644 index 2b158f978..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Large_Cuffs.png deleted file mode 100644 index 7149fbab9..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Lock.png b/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Lock.png deleted file mode 100644 index e569b3283..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Normal_Cuffs.png deleted file mode 100644 index 9d473d004..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Small_Cuffs.png deleted file mode 100644 index 61da4b9b4..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_XLarge_Cuffs.png deleted file mode 100644 index 549b28ccb..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/FuturisticCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Large_Cuffs.png deleted file mode 100644 index 4bde3e4cf..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Large_Rings.png b/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Large_Rings.png deleted file mode 100644 index ffe84f6e8..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Lock.png b/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Lock.png deleted file mode 100644 index 3585a2605..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Normal_Cuffs.png deleted file mode 100644 index 68c2585d2..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Normal_Rings.png deleted file mode 100644 index 7fc5a32e8..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Small_Cuffs.png deleted file mode 100644 index 6e35e5b9c..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Small_Rings.png b/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Small_Rings.png deleted file mode 100644 index ca232aadd..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_XLarge_Cuffs.png deleted file mode 100644 index 139812667..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_XLarge_Rings.png deleted file mode 100644 index 8034e0b75..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/LeatherCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_Large.png b/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_Large.png deleted file mode 100644 index ca183fd6f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_Normal.png b/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_Normal.png deleted file mode 100644 index ca183fd6f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_Small.png b/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_Small.png deleted file mode 100644 index ca183fd6f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_XLarge.png b/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_XLarge.png deleted file mode 100644 index ca183fd6f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/MetalCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Large_Cuffs.png deleted file mode 100644 index cba8520ae..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Large_Gems.png b/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Large_Gems.png deleted file mode 100644 index a38f3f56f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Lock.png b/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Normal_Cuffs.png deleted file mode 100644 index 413980e56..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Normal_Gems.png deleted file mode 100644 index f376c3503..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Small_Cuffs.png deleted file mode 100644 index 9ef4d9408..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Small_Gems.png b/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Small_Gems.png deleted file mode 100644 index 04920f4c7..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_XLarge_Cuffs.png deleted file mode 100644 index d9d0cd781..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_XLarge_Gems.png deleted file mode 100644 index 522e36b8e..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/OrnateCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_Large.png b/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_Large.png deleted file mode 100644 index 9d995c1fd..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_Normal.png b/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_Normal.png deleted file mode 100644 index 503643307..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_Small.png b/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_Small.png deleted file mode 100644 index 2512db60b..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_XLarge.png b/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_XLarge.png deleted file mode 100644 index 89fdf78c6..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/SteelCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Large.png b/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Large.png deleted file mode 100644 index bcdbe6b45..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Lock.png b/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Lock.png deleted file mode 100644 index 0167f5ded..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Normal.png b/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Normal.png deleted file mode 100644 index d89e70f91..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Small.png b/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Small.png deleted file mode 100644 index 0a67ea0c4..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_XLarge.png b/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_XLarge.png deleted file mode 100644 index ac58926ca..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/WoodenCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/WristShackles_Chain.png b/Assets/Female3DCG/ItemArms/BackCuffs/WristShackles_Chain.png deleted file mode 100644 index 648463aed..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/WristShackles_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/WristShackles_Cuffs.png b/Assets/Female3DCG/ItemArms/BackCuffs/WristShackles_Cuffs.png deleted file mode 100644 index b4e2d85d7..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/WristShackles_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackCuffs/WristShackles_Lock.png b/Assets/Female3DCG/ItemArms/BackCuffs/WristShackles_Lock.png deleted file mode 100644 index af367b99a..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackCuffs/WristShackles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Display.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Display.png deleted file mode 100644 index e5d8eba76..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Large_Cuffs.png deleted file mode 100644 index be87229c2..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Lock.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Lock.png deleted file mode 100644 index 12806a06b..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Normal_Cuffs.png deleted file mode 100644 index 4ab279078..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Small_Cuffs.png deleted file mode 100644 index 0dfa34874..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_XLarge_Cuffs.png deleted file mode 100644 index 54ab17ec6..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/FuturisticCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Large_Cuffs.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Large_Rings.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Large_Rings.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Lock.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Normal_Cuffs.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Normal_Rings.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Small_Cuffs.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Small_Rings.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Small_Rings.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_XLarge_Cuffs.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_XLarge_Rings.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/LeatherCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Large_Cuffs.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Large_Gems.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Large_Gems.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Lock.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Normal_Cuffs.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Normal_Gems.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Small_Cuffs.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Small_Gems.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Small_Gems.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_XLarge_Cuffs.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_XLarge_Gems.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/OrnateCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_ArmsLock.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_ArmsLock.png deleted file mode 100644 index cb4986454..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_ArmsLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_Large_Arms.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_Large_Arms.png deleted file mode 100644 index 93fa6540a..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_Large_Arms.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_Normal_Arms.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_Normal_Arms.png deleted file mode 100644 index b9ab1c7b3..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_Normal_Arms.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_Small_Arms.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_Small_Arms.png deleted file mode 100644 index 224df12a0..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_Small_Arms.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_XLarge_Arms.png b/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_XLarge_Arms.png deleted file mode 100644 index fd5bba9b2..000000000 Binary files a/Assets/Female3DCG/ItemArms/BackElbowTouch/StrictLeatherPetCrawler_XLarge_Arms.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Bolero_Large_Belts.png b/Assets/Female3DCG/ItemArms/Bolero_Large_Belts.png deleted file mode 100644 index b1e497dc5..000000000 Binary files a/Assets/Female3DCG/ItemArms/Bolero_Large_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Bolero_Large_Leather.png b/Assets/Female3DCG/ItemArms/Bolero_Large_Leather.png deleted file mode 100644 index ba4eadfad..000000000 Binary files a/Assets/Female3DCG/ItemArms/Bolero_Large_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Bolero_Lock.png b/Assets/Female3DCG/ItemArms/Bolero_Lock.png deleted file mode 100644 index 378134cb4..000000000 Binary files a/Assets/Female3DCG/ItemArms/Bolero_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Bolero_Normal_Belts.png b/Assets/Female3DCG/ItemArms/Bolero_Normal_Belts.png deleted file mode 100644 index 0e0809c0a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Bolero_Normal_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Bolero_Normal_Leather.png b/Assets/Female3DCG/ItemArms/Bolero_Normal_Leather.png deleted file mode 100644 index c96bb823c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Bolero_Normal_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Bolero_Small_Belts.png b/Assets/Female3DCG/ItemArms/Bolero_Small_Belts.png deleted file mode 100644 index c57611da8..000000000 Binary files a/Assets/Female3DCG/ItemArms/Bolero_Small_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Bolero_Small_Leather.png b/Assets/Female3DCG/ItemArms/Bolero_Small_Leather.png deleted file mode 100644 index 023987163..000000000 Binary files a/Assets/Female3DCG/ItemArms/Bolero_Small_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Bolero_XLarge_Belts.png b/Assets/Female3DCG/ItemArms/Bolero_XLarge_Belts.png deleted file mode 100644 index 448d01c6f..000000000 Binary files a/Assets/Female3DCG/ItemArms/Bolero_XLarge_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Bolero_XLarge_Leather.png b/Assets/Female3DCG/ItemArms/Bolero_XLarge_Leather.png deleted file mode 100644 index 997d324c7..000000000 Binary files a/Assets/Female3DCG/ItemArms/Bolero_XLarge_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBouquet_Large_Base.png b/Assets/Female3DCG/ItemArms/BondageBouquet_Large_Base.png deleted file mode 100644 index b5c76c38a..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBouquet_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBouquet_Large_Flowers.png b/Assets/Female3DCG/ItemArms/BondageBouquet_Large_Flowers.png deleted file mode 100644 index b44d19ccf..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBouquet_Large_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBouquet_Lock.png b/Assets/Female3DCG/ItemArms/BondageBouquet_Lock.png deleted file mode 100644 index 19f75101c..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBouquet_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBouquet_Normal_Base.png b/Assets/Female3DCG/ItemArms/BondageBouquet_Normal_Base.png deleted file mode 100644 index 2e50547a6..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBouquet_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBouquet_Normal_Flowers.png b/Assets/Female3DCG/ItemArms/BondageBouquet_Normal_Flowers.png deleted file mode 100644 index 48050e7c8..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBouquet_Normal_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBouquet_Small_Base.png b/Assets/Female3DCG/ItemArms/BondageBouquet_Small_Base.png deleted file mode 100644 index 10bd9375c..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBouquet_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBouquet_Small_Flowers.png b/Assets/Female3DCG/ItemArms/BondageBouquet_Small_Flowers.png deleted file mode 100644 index 1ba426a6f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBouquet_Small_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBouquet_XLarge_Base.png b/Assets/Female3DCG/ItemArms/BondageBouquet_XLarge_Base.png deleted file mode 100644 index 406d13cc2..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBouquet_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBouquet_XLarge_Flowers.png b/Assets/Female3DCG/ItemArms/BondageBouquet_XLarge_Flowers.png deleted file mode 100644 index ac13e96ba..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBouquet_XLarge_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBra_Large.png b/Assets/Female3DCG/ItemArms/BondageBra_Large.png deleted file mode 100644 index 943ddc1a1..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBra_Normal.png b/Assets/Female3DCG/ItemArms/BondageBra_Normal.png deleted file mode 100644 index d5b5a2404..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBra_Small.png b/Assets/Female3DCG/ItemArms/BondageBra_Small.png deleted file mode 100644 index dffb969c1..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BondageBra_XLarge.png b/Assets/Female3DCG/ItemArms/BondageBra_XLarge.png deleted file mode 100644 index 82a62afb1..000000000 Binary files a/Assets/Female3DCG/ItemArms/BondageBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Large_Base.png b/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Large_Base.png deleted file mode 100644 index ec2046d04..000000000 Binary files a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Large_Shine.png b/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Large_Shine.png deleted file mode 100644 index 0b05dafaf..000000000 Binary files a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Lock.png b/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Lock.png deleted file mode 100644 index 958a05edd..000000000 Binary files a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Normal_Base.png b/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Normal_Base.png deleted file mode 100644 index 59d3771b4..000000000 Binary files a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Normal_Shine.png b/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Normal_Shine.png deleted file mode 100644 index cc931dd9c..000000000 Binary files a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Small_Base.png b/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Small_Base.png deleted file mode 100644 index 2c1c00c75..000000000 Binary files a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Small_Shine.png b/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Small_Shine.png deleted file mode 100644 index 43d74cda9..000000000 Binary files a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_XLarge_Base.png b/Assets/Female3DCG/ItemArms/BoxTieArmbinder_XLarge_Base.png deleted file mode 100644 index 5fb7cb27f..000000000 Binary files a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_XLarge_Shine.png b/Assets/Female3DCG/ItemArms/BoxTieArmbinder_XLarge_Shine.png deleted file mode 100644 index 24d9a7ba0..000000000 Binary files a/Assets/Female3DCG/ItemArms/BoxTieArmbinder_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingChains_Large.png b/Assets/Female3DCG/ItemArms/CeilingChains_Large.png deleted file mode 100644 index 5738640e8..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingChains_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShacklesOverhead_Lock.png b/Assets/Female3DCG/ItemArms/CeilingShacklesOverhead_Lock.png deleted file mode 100644 index 8ebf0c305..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShacklesOverhead_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_LargeOverhead_Chain.png b/Assets/Female3DCG/ItemArms/CeilingShackles_LargeOverhead_Chain.png deleted file mode 100644 index e0a2fe1aa..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_LargeOverhead_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_LargeOverhead_Cuffs.png b/Assets/Female3DCG/ItemArms/CeilingShackles_LargeOverhead_Cuffs.png deleted file mode 100644 index 9068e76e0..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_LargeOverhead_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_Large_Chain.png b/Assets/Female3DCG/ItemArms/CeilingShackles_Large_Chain.png deleted file mode 100644 index 9f5975a8d..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_Large_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/CeilingShackles_Large_Cuffs.png deleted file mode 100644 index f11657c8e..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_Lock.png b/Assets/Female3DCG/ItemArms/CeilingShackles_Lock.png deleted file mode 100644 index b13a28381..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_NormalOverhead_Chain.png b/Assets/Female3DCG/ItemArms/CeilingShackles_NormalOverhead_Chain.png deleted file mode 100644 index e0a2fe1aa..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_NormalOverhead_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_NormalOverhead_Cuffs.png b/Assets/Female3DCG/ItemArms/CeilingShackles_NormalOverhead_Cuffs.png deleted file mode 100644 index 981ae658b..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_NormalOverhead_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_Normal_Chain.png b/Assets/Female3DCG/ItemArms/CeilingShackles_Normal_Chain.png deleted file mode 100644 index 9f5975a8d..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_Normal_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/CeilingShackles_Normal_Cuffs.png deleted file mode 100644 index f11657c8e..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_SmallOverhead_Chain.png b/Assets/Female3DCG/ItemArms/CeilingShackles_SmallOverhead_Chain.png deleted file mode 100644 index e0a2fe1aa..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_SmallOverhead_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_SmallOverhead_Cuffs.png b/Assets/Female3DCG/ItemArms/CeilingShackles_SmallOverhead_Cuffs.png deleted file mode 100644 index 981ae658b..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_SmallOverhead_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_Small_Chain.png b/Assets/Female3DCG/ItemArms/CeilingShackles_Small_Chain.png deleted file mode 100644 index 9f5975a8d..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_Small_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/CeilingShackles_Small_Cuffs.png deleted file mode 100644 index f11657c8e..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_XLargeOverhead_Chain.png b/Assets/Female3DCG/ItemArms/CeilingShackles_XLargeOverhead_Chain.png deleted file mode 100644 index e0a2fe1aa..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_XLargeOverhead_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_XLargeOverhead_Cuffs.png b/Assets/Female3DCG/ItemArms/CeilingShackles_XLargeOverhead_Cuffs.png deleted file mode 100644 index 9068e76e0..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_XLargeOverhead_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_XLarge_Chain.png b/Assets/Female3DCG/ItemArms/CeilingShackles_XLarge_Chain.png deleted file mode 100644 index 9f5975a8d..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_XLarge_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CeilingShackles_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/CeilingShackles_XLarge_Cuffs.png deleted file mode 100644 index f11657c8e..000000000 Binary files a/Assets/Female3DCG/ItemArms/CeilingShackles_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainLeashHolding_Large.png b/Assets/Female3DCG/ItemArms/ChainLeashHolding_Large.png deleted file mode 100644 index f3a0de907..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainLeashHolding_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainLeashHolding_Normal.png b/Assets/Female3DCG/ItemArms/ChainLeashHolding_Normal.png deleted file mode 100644 index f3a0de907..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainLeashHolding_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainLeashHolding_Small.png b/Assets/Female3DCG/ItemArms/ChainLeashHolding_Small.png deleted file mode 100644 index f3a0de907..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainLeashHolding_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainLeashHolding_XLarge.png b/Assets/Female3DCG/ItemArms/ChainLeashHolding_XLarge.png deleted file mode 100644 index f3a0de907..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainLeashHolding_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainsAllFours_Lock.png b/Assets/Female3DCG/ItemArms/ChainsAllFours_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainsAllFours_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainsChainCuffs_Lock.png b/Assets/Female3DCG/ItemArms/ChainsChainCuffs_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainsChainCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainsHogtied_Lock.png b/Assets/Female3DCG/ItemArms/ChainsHogtied_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainsHogtied_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainsKneelingHogtie_Lock.png b/Assets/Female3DCG/ItemArms/ChainsKneelingHogtie_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainsKneelingHogtie_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainsSuspensionHogtied_Lock.png b/Assets/Female3DCG/ItemArms/ChainsSuspensionHogtied_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainsSuspensionHogtied_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainsWristElbowHarnessTie_Lock.png b/Assets/Female3DCG/ItemArms/ChainsWristElbowHarnessTie_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainsWristElbowHarnessTie_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainsWristElbowTie_Lock.png b/Assets/Female3DCG/ItemArms/ChainsWristElbowTie_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainsWristElbowTie_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ChainsWristTie_Lock.png b/Assets/Female3DCG/ItemArms/ChainsWristTie_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/ChainsWristTie_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_Large.png b/Assets/Female3DCG/ItemArms/Chains_Large.png deleted file mode 100644 index fd01753ab..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_LargeAllFours.png b/Assets/Female3DCG/ItemArms/Chains_LargeAllFours.png deleted file mode 100644 index 0a04af8d5..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_LargeAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_LargeChainCuffs.png b/Assets/Female3DCG/ItemArms/Chains_LargeChainCuffs.png deleted file mode 100644 index 18f6d14cd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_LargeChainCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_LargeHogtied.png b/Assets/Female3DCG/ItemArms/Chains_LargeHogtied.png deleted file mode 100644 index f33681f1a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_LargeHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_LargeKneelingHogtie.png b/Assets/Female3DCG/ItemArms/Chains_LargeKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_LargeKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_LargeSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/Chains_LargeSuspensionHogtied.png deleted file mode 100644 index b70bb9cff..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_LargeSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_LargeWristElbowHarnessTie.png b/Assets/Female3DCG/ItemArms/Chains_LargeWristElbowHarnessTie.png deleted file mode 100644 index f9b903231..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_LargeWristElbowHarnessTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_LargeWristElbowTie.png b/Assets/Female3DCG/ItemArms/Chains_LargeWristElbowTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_LargeWristElbowTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_LargeWristTie.png b/Assets/Female3DCG/ItemArms/Chains_LargeWristTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_LargeWristTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_Lock.png b/Assets/Female3DCG/ItemArms/Chains_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_Normal.png b/Assets/Female3DCG/ItemArms/Chains_Normal.png deleted file mode 100644 index ccb5473dc..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_NormalAllFours.png b/Assets/Female3DCG/ItemArms/Chains_NormalAllFours.png deleted file mode 100644 index 4c6175edd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_NormalAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_NormalChainCuffs.png b/Assets/Female3DCG/ItemArms/Chains_NormalChainCuffs.png deleted file mode 100644 index c0e1b19e0..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_NormalChainCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_NormalHogtied.png b/Assets/Female3DCG/ItemArms/Chains_NormalHogtied.png deleted file mode 100644 index 5361c2b7d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_NormalHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_NormalKneelingHogtie.png b/Assets/Female3DCG/ItemArms/Chains_NormalKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_NormalKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_NormalSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/Chains_NormalSuspensionHogtied.png deleted file mode 100644 index f42f7e0b2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_NormalSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_NormalWristElbowHarnessTie.png b/Assets/Female3DCG/ItemArms/Chains_NormalWristElbowHarnessTie.png deleted file mode 100644 index d98bc6719..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_NormalWristElbowHarnessTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_NormalWristElbowTie.png b/Assets/Female3DCG/ItemArms/Chains_NormalWristElbowTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_NormalWristElbowTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_NormalWristTie.png b/Assets/Female3DCG/ItemArms/Chains_NormalWristTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_NormalWristTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_Small.png b/Assets/Female3DCG/ItemArms/Chains_Small.png deleted file mode 100644 index 23663123c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_SmallAllFours.png b/Assets/Female3DCG/ItemArms/Chains_SmallAllFours.png deleted file mode 100644 index 1a34a8efc..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_SmallAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_SmallChainCuffs.png b/Assets/Female3DCG/ItemArms/Chains_SmallChainCuffs.png deleted file mode 100644 index 1702fd1a5..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_SmallChainCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_SmallHogtied.png b/Assets/Female3DCG/ItemArms/Chains_SmallHogtied.png deleted file mode 100644 index 8e10c7dda..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_SmallHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_SmallKneelingHogtie.png b/Assets/Female3DCG/ItemArms/Chains_SmallKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_SmallKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_SmallSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/Chains_SmallSuspensionHogtied.png deleted file mode 100644 index 765c80bcb..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_SmallSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_SmallWristElbowHarnessTie.png b/Assets/Female3DCG/ItemArms/Chains_SmallWristElbowHarnessTie.png deleted file mode 100644 index 34eec9aad..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_SmallWristElbowHarnessTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_SmallWristElbowTie.png b/Assets/Female3DCG/ItemArms/Chains_SmallWristElbowTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_SmallWristElbowTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_SmallWristTie.png b/Assets/Female3DCG/ItemArms/Chains_SmallWristTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_SmallWristTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_Suspension.png b/Assets/Female3DCG/ItemArms/Chains_Suspension.png deleted file mode 100644 index aa07e7995..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_Suspension.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_XLarge.png b/Assets/Female3DCG/ItemArms/Chains_XLarge.png deleted file mode 100644 index 633f85784..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_XLargeAllFours.png b/Assets/Female3DCG/ItemArms/Chains_XLargeAllFours.png deleted file mode 100644 index f33010728..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_XLargeAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_XLargeChainCuffs.png b/Assets/Female3DCG/ItemArms/Chains_XLargeChainCuffs.png deleted file mode 100644 index e19343d16..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_XLargeChainCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_XLargeHogtied.png b/Assets/Female3DCG/ItemArms/Chains_XLargeHogtied.png deleted file mode 100644 index 2e96e6c43..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_XLargeHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_XLargeKneelingHogtie.png b/Assets/Female3DCG/ItemArms/Chains_XLargeKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_XLargeKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_XLargeSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/Chains_XLargeSuspensionHogtied.png deleted file mode 100644 index 04c7134b6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_XLargeSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_XLargeWristElbowHarnessTie.png b/Assets/Female3DCG/ItemArms/Chains_XLargeWristElbowHarnessTie.png deleted file mode 100644 index 9acde5e4f..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_XLargeWristElbowHarnessTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_XLargeWristElbowTie.png b/Assets/Female3DCG/ItemArms/Chains_XLargeWristElbowTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_XLargeWristElbowTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Chains_XLargeWristTie.png b/Assets/Female3DCG/ItemArms/Chains_XLargeWristTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Chains_XLargeWristTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CollarLeashHolding_Large.png b/Assets/Female3DCG/ItemArms/CollarLeashHolding_Large.png deleted file mode 100644 index b83690429..000000000 Binary files a/Assets/Female3DCG/ItemArms/CollarLeashHolding_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CollarLeashHolding_Normal.png b/Assets/Female3DCG/ItemArms/CollarLeashHolding_Normal.png deleted file mode 100644 index b83690429..000000000 Binary files a/Assets/Female3DCG/ItemArms/CollarLeashHolding_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CollarLeashHolding_Small.png b/Assets/Female3DCG/ItemArms/CollarLeashHolding_Small.png deleted file mode 100644 index b83690429..000000000 Binary files a/Assets/Female3DCG/ItemArms/CollarLeashHolding_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/CollarLeashHolding_XLarge.png b/Assets/Female3DCG/ItemArms/CollarLeashHolding_XLarge.png deleted file mode 100644 index b83690429..000000000 Binary files a/Assets/Female3DCG/ItemArms/CollarLeashHolding_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_Large.png b/Assets/Female3DCG/ItemArms/DuctTape_Large.png deleted file mode 100644 index b7accac05..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_LargeBottom.png b/Assets/Female3DCG/ItemArms/DuctTape_LargeBottom.png deleted file mode 100644 index 569a18a36..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_LargeBottom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_LargeComplete.png b/Assets/Female3DCG/ItemArms/DuctTape_LargeComplete.png deleted file mode 100644 index 4319d87f2..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_LargeComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_LargeExposedComplete.png b/Assets/Female3DCG/ItemArms/DuctTape_LargeExposedComplete.png deleted file mode 100644 index e6456ba0e..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_LargeExposedComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_LargeFull.png b/Assets/Female3DCG/ItemArms/DuctTape_LargeFull.png deleted file mode 100644 index 8296d06ec..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_LargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_LargePetTape.png b/Assets/Female3DCG/ItemArms/DuctTape_LargePetTape.png deleted file mode 100644 index 78ae27ced..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_LargePetTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_LargeTop.png b/Assets/Female3DCG/ItemArms/DuctTape_LargeTop.png deleted file mode 100644 index b399e2369..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_LargeTop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_Normal.png b/Assets/Female3DCG/ItemArms/DuctTape_Normal.png deleted file mode 100644 index 24b2ddd5d..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_NormalBottom.png b/Assets/Female3DCG/ItemArms/DuctTape_NormalBottom.png deleted file mode 100644 index 4b2869dbb..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_NormalBottom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_NormalComplete.png b/Assets/Female3DCG/ItemArms/DuctTape_NormalComplete.png deleted file mode 100644 index 59dc11a46..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_NormalComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_NormalExposedComplete.png b/Assets/Female3DCG/ItemArms/DuctTape_NormalExposedComplete.png deleted file mode 100644 index 984fe675c..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_NormalExposedComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_NormalFull.png b/Assets/Female3DCG/ItemArms/DuctTape_NormalFull.png deleted file mode 100644 index 37cc80f04..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_NormalFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_NormalPetTape.png b/Assets/Female3DCG/ItemArms/DuctTape_NormalPetTape.png deleted file mode 100644 index 682d7419c..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_NormalPetTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_NormalTop.png b/Assets/Female3DCG/ItemArms/DuctTape_NormalTop.png deleted file mode 100644 index 1f39908d2..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_NormalTop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_Small.png b/Assets/Female3DCG/ItemArms/DuctTape_Small.png deleted file mode 100644 index ee354daa9..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_SmallBottom.png b/Assets/Female3DCG/ItemArms/DuctTape_SmallBottom.png deleted file mode 100644 index 17cc3214e..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_SmallBottom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_SmallComplete.png b/Assets/Female3DCG/ItemArms/DuctTape_SmallComplete.png deleted file mode 100644 index cbe09571e..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_SmallComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_SmallExposedComplete.png b/Assets/Female3DCG/ItemArms/DuctTape_SmallExposedComplete.png deleted file mode 100644 index 5b6f9a406..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_SmallExposedComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_SmallFull.png b/Assets/Female3DCG/ItemArms/DuctTape_SmallFull.png deleted file mode 100644 index 37cc80f04..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_SmallFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_SmallPetTape.png b/Assets/Female3DCG/ItemArms/DuctTape_SmallPetTape.png deleted file mode 100644 index 901bc50cf..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_SmallPetTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_SmallTop.png b/Assets/Female3DCG/ItemArms/DuctTape_SmallTop.png deleted file mode 100644 index c37464743..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_SmallTop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_XLarge.png b/Assets/Female3DCG/ItemArms/DuctTape_XLarge.png deleted file mode 100644 index 01fb37bc2..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_XLargeBottom.png b/Assets/Female3DCG/ItemArms/DuctTape_XLargeBottom.png deleted file mode 100644 index b274c7f0a..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_XLargeBottom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_XLargeComplete.png b/Assets/Female3DCG/ItemArms/DuctTape_XLargeComplete.png deleted file mode 100644 index b7c610556..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_XLargeComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_XLargeExposedComplete.png b/Assets/Female3DCG/ItemArms/DuctTape_XLargeExposedComplete.png deleted file mode 100644 index a2af8d61f..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_XLargeExposedComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_XLargeFull.png b/Assets/Female3DCG/ItemArms/DuctTape_XLargeFull.png deleted file mode 100644 index 0b23c24cd..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_XLargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_XLargePetTape.png b/Assets/Female3DCG/ItemArms/DuctTape_XLargePetTape.png deleted file mode 100644 index 6f89232f5..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_XLargePetTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/DuctTape_XLargeTop.png b/Assets/Female3DCG/ItemArms/DuctTape_XLargeTop.png deleted file mode 100644 index 3b2063b68..000000000 Binary files a/Assets/Female3DCG/ItemArms/DuctTape_XLargeTop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FourLimbsShackles_Large.png b/Assets/Female3DCG/ItemArms/FourLimbsShackles_Large.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/FourLimbsShackles_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FourLimbsShackles_Normal.png b/Assets/Female3DCG/ItemArms/FourLimbsShackles_Normal.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/FourLimbsShackles_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FourLimbsShackles_Small.png b/Assets/Female3DCG/ItemArms/FourLimbsShackles_Small.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/FourLimbsShackles_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FourLimbsShackles_XLarge.png b/Assets/Female3DCG/ItemArms/FourLimbsShackles_XLarge.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/FourLimbsShackles_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Large.png b/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Large.png deleted file mode 100644 index e3c0efee9..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Lock.png b/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Normal.png b/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Normal.png deleted file mode 100644 index e860f6f4a..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Small.png b/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Small.png deleted file mode 100644 index 948d4e9ca..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_XLarge.png b/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_XLarge.png deleted file mode 100644 index 024ff7929..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullBodyLeatherHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullBodyShackles_Large.png b/Assets/Female3DCG/ItemArms/FullBodyShackles_Large.png deleted file mode 100644 index d0a7868fd..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullBodyShackles_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullBodyShackles_Lock.png b/Assets/Female3DCG/ItemArms/FullBodyShackles_Lock.png deleted file mode 100644 index 0d60868aa..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullBodyShackles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullBodyShackles_Normal.png b/Assets/Female3DCG/ItemArms/FullBodyShackles_Normal.png deleted file mode 100644 index d0a7868fd..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullBodyShackles_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullBodyShackles_Small.png b/Assets/Female3DCG/ItemArms/FullBodyShackles_Small.png deleted file mode 100644 index d0a7868fd..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullBodyShackles_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullBodyShackles_XLarge.png b/Assets/Female3DCG/ItemArms/FullBodyShackles_XLarge.png deleted file mode 100644 index d0a7868fd..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullBodyShackles_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuitUnZip_Lock.png b/Assets/Female3DCG/ItemArms/FullLatexSuitUnZip_Lock.png deleted file mode 100644 index d7ddd426d..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuitUnZip_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_Large_Base.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_Large_Base.png deleted file mode 100644 index b16291dec..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_Large_Latex.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_Large_Latex.png deleted file mode 100644 index c74c1858c..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_Large_UnZip.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_Large_UnZip.png deleted file mode 100644 index 6678d2c6a..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_Large_UnZip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_Lock.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_Lock.png deleted file mode 100644 index d7ddd426d..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_Normal_Base.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_Normal_Base.png deleted file mode 100644 index 7658748f7..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_Normal_Latex.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_Normal_Latex.png deleted file mode 100644 index b6d4bfa6f..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_Normal_UnZip.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_Normal_UnZip.png deleted file mode 100644 index 4c2f3fec6..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_Normal_UnZip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_Small_Base.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_Small_Base.png deleted file mode 100644 index 8f8489296..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_Small_Latex.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_Small_Latex.png deleted file mode 100644 index dc9c7592c..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_Small_UnZip.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_Small_UnZip.png deleted file mode 100644 index 52e9e46a6..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_Small_UnZip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_XLarge_Base.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_XLarge_Base.png deleted file mode 100644 index 9942e50e7..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_XLarge_Latex.png deleted file mode 100644 index afd9849d6..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FullLatexSuit_XLarge_UnZip.png b/Assets/Female3DCG/ItemArms/FullLatexSuit_XLarge_UnZip.png deleted file mode 100644 index a4593a158..000000000 Binary files a/Assets/Female3DCG/ItemArms/FullLatexSuit_XLarge_UnZip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FurStraitJacket.png b/Assets/Female3DCG/ItemArms/FurStraitJacket.png deleted file mode 100644 index 695280ac9..000000000 Binary files a/Assets/Female3DCG/ItemArms/FurStraitJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticArmbinderTight_Lock.png b/Assets/Female3DCG/ItemArms/FuturisticArmbinderTight_Lock.png deleted file mode 100644 index c2894059d..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticArmbinderTight_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Band.png b/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Band.png deleted file mode 100644 index 4562e13f0..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Binder.png b/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Binder.png deleted file mode 100644 index 7fde58cfb..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Binder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Display.png b/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Display.png deleted file mode 100644 index b51238bbe..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Large_Straps.png b/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Large_Straps.png deleted file mode 100644 index 03960a7be..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Lock.png b/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Lock.png deleted file mode 100644 index c2894059d..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Normal_Straps.png b/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Normal_Straps.png deleted file mode 100644 index ce879f7b2..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Small_Straps.png b/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Small_Straps.png deleted file mode 100644 index 51de09b7e..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_XLarge_Straps.png b/Assets/Female3DCG/ItemArms/FuturisticArmbinder_XLarge_Straps.png deleted file mode 100644 index 14d8211f0..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticArmbinder_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticCuffs_Display.png b/Assets/Female3DCG/ItemArms/FuturisticCuffs_Display.png deleted file mode 100644 index a5aacb6a8..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/FuturisticCuffs_Large_Cuffs.png deleted file mode 100644 index cc3ead484..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticCuffs_Lock.png b/Assets/Female3DCG/ItemArms/FuturisticCuffs_Lock.png deleted file mode 100644 index e82bb27ef..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/FuturisticCuffs_Normal_Cuffs.png deleted file mode 100644 index d4c5fd086..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/FuturisticCuffs_Small_Cuffs.png deleted file mode 100644 index 7ef8344da..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/FuturisticCuffs_XLarge_Cuffs.png deleted file mode 100644 index b7089bd96..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacketHandsBackChastity_Lock.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacketHandsBackChastity_Lock.png deleted file mode 100644 index 287ec985d..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacketHandsBackChastity_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacketHandsBack_Lock.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacketHandsBack_Lock.png deleted file mode 100644 index 287ec985d..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacketHandsBack_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacketHandsFrontChastity_Lock.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacketHandsFrontChastity_Lock.png deleted file mode 100644 index 287ec985d..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacketHandsFrontChastity_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Display.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Display.png deleted file mode 100644 index d29848796..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Band.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Band.png deleted file mode 100644 index 8daec778f..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Gloves.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Gloves.png deleted file mode 100644 index d973eefc5..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_GlovesBack.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_GlovesBack.png deleted file mode 100644 index fd59f5df0..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_GlovesBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Lower.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Lower.png deleted file mode 100644 index c51ddd111..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Mesh.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Mesh.png deleted file mode 100644 index 826fcf58b..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Sides.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Sides.png deleted file mode 100644 index fe9f5acd5..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Large_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Lock.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Lock.png deleted file mode 100644 index 287ec985d..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Band.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Band.png deleted file mode 100644 index c9b529601..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Gloves.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Gloves.png deleted file mode 100644 index 6b6252b65..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_GlovesBack.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_GlovesBack.png deleted file mode 100644 index 8b5f78d34..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_GlovesBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Lower.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Lower.png deleted file mode 100644 index 22469fdae..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Mesh.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Mesh.png deleted file mode 100644 index 18758d688..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Sides.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Sides.png deleted file mode 100644 index fe9f5acd5..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Normal_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Band.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Band.png deleted file mode 100644 index c9b529601..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Gloves.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Gloves.png deleted file mode 100644 index 8e80e8ba7..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_GlovesBack.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_GlovesBack.png deleted file mode 100644 index 03b3584b9..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_GlovesBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Lower.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Lower.png deleted file mode 100644 index 02d600939..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Mesh.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Mesh.png deleted file mode 100644 index b7570320c..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Sides.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Sides.png deleted file mode 100644 index fe9f5acd5..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_Small_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Band.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Band.png deleted file mode 100644 index 264921367..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Gloves.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Gloves.png deleted file mode 100644 index b740766ba..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_GlovesBack.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_GlovesBack.png deleted file mode 100644 index 63e2235e0..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_GlovesBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Lower.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Lower.png deleted file mode 100644 index 1c1945b90..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Mesh.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Mesh.png deleted file mode 100644 index 8e824d99a..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Sides.png b/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Sides.png deleted file mode 100644 index fe9f5acd5..000000000 Binary files a/Assets/Female3DCG/ItemArms/FuturisticStraitjacket_XLarge_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_InvertedSuspension.png b/Assets/Female3DCG/ItemArms/HempRope_InvertedSuspension.png deleted file mode 100644 index f63d8bf4c..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_InvertedSuspension.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_Large.png b/Assets/Female3DCG/ItemArms/HempRope_Large.png deleted file mode 100644 index 78f5c5fef..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_LargeAllFours.png deleted file mode 100644 index 8ca30a462..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeBedSpreadEagle.png b/Assets/Female3DCG/ItemArms/HempRope_LargeBedSpreadEagle.png deleted file mode 100644 index fda8c3f17..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeBedSpreadEagle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeCrossedBoxtie.png b/Assets/Female3DCG/ItemArms/HempRope_LargeCrossedBoxtie.png deleted file mode 100644 index 2d595edb3..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeCrossedBoxtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_LargeHogtied.png deleted file mode 100644 index d47ff3d5e..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeInvertedSuspensionAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_LargeInvertedSuspensionAllFours.png deleted file mode 100644 index 8ca30a462..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeInvertedSuspensionAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeInvertedSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_LargeInvertedSuspensionHogtied.png deleted file mode 100644 index a2658ce78..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeInvertedSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeKneelingHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_LargeKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeRopeCuffs.png b/Assets/Female3DCG/ItemArms/HempRope_LargeRopeCuffs.png deleted file mode 100644 index a2887205b..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeRopeCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeSimpleHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_LargeSimpleHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeSimpleHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeSuspensionAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_LargeSuspensionAllFours.png deleted file mode 100644 index 8ca30a462..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeSuspensionAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_LargeSuspensionHogtied.png deleted file mode 100644 index a2658ce78..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeSuspensionKneelingHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_LargeSuspensionKneelingHogtie.png deleted file mode 100644 index 8ccbad558..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeSuspensionKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeTightBoxtie.png b/Assets/Female3DCG/ItemArms/HempRope_LargeTightBoxtie.png deleted file mode 100644 index 7aa8c700e..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeTightBoxtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeWristElbowHarnessTie.png b/Assets/Female3DCG/ItemArms/HempRope_LargeWristElbowHarnessTie.png deleted file mode 100644 index 8ccbad558..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeWristElbowHarnessTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeWristElbowTie.png b/Assets/Female3DCG/ItemArms/HempRope_LargeWristElbowTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeWristElbowTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_LargeWristTie.png b/Assets/Female3DCG/ItemArms/HempRope_LargeWristTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_LargeWristTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_Normal.png b/Assets/Female3DCG/ItemArms/HempRope_Normal.png deleted file mode 100644 index 7d53b9ae7..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_NormalAllFours.png deleted file mode 100644 index bf2858ce5..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalBedSpreadEagle.png b/Assets/Female3DCG/ItemArms/HempRope_NormalBedSpreadEagle.png deleted file mode 100644 index fda8c3f17..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalBedSpreadEagle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalCrossedBoxtie.png b/Assets/Female3DCG/ItemArms/HempRope_NormalCrossedBoxtie.png deleted file mode 100644 index e5f5ca252..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalCrossedBoxtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_NormalHogtied.png deleted file mode 100644 index 9a03ee7e1..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalInvertedSuspensionAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_NormalInvertedSuspensionAllFours.png deleted file mode 100644 index bf2858ce5..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalInvertedSuspensionAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalInvertedSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_NormalInvertedSuspensionHogtied.png deleted file mode 100644 index 06e90c390..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalInvertedSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalKneelingHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_NormalKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalRopeCuffs.png b/Assets/Female3DCG/ItemArms/HempRope_NormalRopeCuffs.png deleted file mode 100644 index 53ddea37e..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalRopeCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalSimpleHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_NormalSimpleHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalSimpleHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalSuspensionAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_NormalSuspensionAllFours.png deleted file mode 100644 index bf2858ce5..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalSuspensionAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_NormalSuspensionHogtied.png deleted file mode 100644 index 06e90c390..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalSuspensionKneelingHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_NormalSuspensionKneelingHogtie.png deleted file mode 100644 index 2eba9fa12..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalSuspensionKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalTightBoxtie.png b/Assets/Female3DCG/ItemArms/HempRope_NormalTightBoxtie.png deleted file mode 100644 index 0ad26acd9..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalTightBoxtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalWristElbowHarnessTie.png b/Assets/Female3DCG/ItemArms/HempRope_NormalWristElbowHarnessTie.png deleted file mode 100644 index 2eba9fa12..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalWristElbowHarnessTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalWristElbowTie.png b/Assets/Female3DCG/ItemArms/HempRope_NormalWristElbowTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalWristElbowTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_NormalWristTie.png b/Assets/Female3DCG/ItemArms/HempRope_NormalWristTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_NormalWristTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_Small.png b/Assets/Female3DCG/ItemArms/HempRope_Small.png deleted file mode 100644 index c388e58c8..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_SmallAllFours.png deleted file mode 100644 index 6965692bb..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallBedSpreadEagle.png b/Assets/Female3DCG/ItemArms/HempRope_SmallBedSpreadEagle.png deleted file mode 100644 index 4120c9d56..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallBedSpreadEagle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallCrossedBoxtie.png b/Assets/Female3DCG/ItemArms/HempRope_SmallCrossedBoxtie.png deleted file mode 100644 index 02edff54a..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallCrossedBoxtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_SmallHogtied.png deleted file mode 100644 index d077ba72c..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallInvertedSuspensionAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_SmallInvertedSuspensionAllFours.png deleted file mode 100644 index 6965692bb..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallInvertedSuspensionAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallInvertedSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_SmallInvertedSuspensionHogtied.png deleted file mode 100644 index d91c01c29..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallInvertedSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallKneelingHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_SmallKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallRopeCuffs.png b/Assets/Female3DCG/ItemArms/HempRope_SmallRopeCuffs.png deleted file mode 100644 index a1bfb5083..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallRopeCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallSimpleHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_SmallSimpleHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallSimpleHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallSuspensionAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_SmallSuspensionAllFours.png deleted file mode 100644 index 6965692bb..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallSuspensionAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_SmallSuspensionHogtied.png deleted file mode 100644 index d91c01c29..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallSuspensionKneelingHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_SmallSuspensionKneelingHogtie.png deleted file mode 100644 index 0ec46b71e..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallSuspensionKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallTightBoxtie.png b/Assets/Female3DCG/ItemArms/HempRope_SmallTightBoxtie.png deleted file mode 100644 index 00efe30f4..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallTightBoxtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallWristElbowHarnessTie.png b/Assets/Female3DCG/ItemArms/HempRope_SmallWristElbowHarnessTie.png deleted file mode 100644 index 0ec46b71e..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallWristElbowHarnessTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallWristElbowTie.png b/Assets/Female3DCG/ItemArms/HempRope_SmallWristElbowTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallWristElbowTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_SmallWristTie.png b/Assets/Female3DCG/ItemArms/HempRope_SmallWristTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_SmallWristTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_Suspension.png b/Assets/Female3DCG/ItemArms/HempRope_Suspension.png deleted file mode 100644 index 66219d88e..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_Suspension.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLarge.png b/Assets/Female3DCG/ItemArms/HempRope_XLarge.png deleted file mode 100644 index 383394a1c..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeAllFours.png deleted file mode 100644 index c5ce2632e..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeBedSpreadEagle.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeBedSpreadEagle.png deleted file mode 100644 index 6567ef4c8..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeBedSpreadEagle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeCrossedBoxtie.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeCrossedBoxtie.png deleted file mode 100644 index 40dcd5c0d..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeCrossedBoxtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeHogtied.png deleted file mode 100644 index c64281486..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeInvertedSuspensionAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeInvertedSuspensionAllFours.png deleted file mode 100644 index c5ce2632e..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeInvertedSuspensionAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeInvertedSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeInvertedSuspensionHogtied.png deleted file mode 100644 index d4d33bc86..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeInvertedSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeKneelingHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeRopeCuffs.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeRopeCuffs.png deleted file mode 100644 index 1a7b5de96..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeRopeCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeSimpleHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeSimpleHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeSimpleHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeSuspensionAllFours.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeSuspensionAllFours.png deleted file mode 100644 index c5ce2632e..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeSuspensionAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeSuspensionHogtied.png deleted file mode 100644 index d4d33bc86..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeSuspensionKneelingHogtie.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeSuspensionKneelingHogtie.png deleted file mode 100644 index b97b59214..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeSuspensionKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeTightBoxtie.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeTightBoxtie.png deleted file mode 100644 index 464e0fdaf..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeTightBoxtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeWristElbowHarnessTie.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeWristElbowHarnessTie.png deleted file mode 100644 index b97b59214..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeWristElbowHarnessTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeWristElbowTie.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeWristElbowTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeWristElbowTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HempRope_XLargeWristTie.png b/Assets/Female3DCG/ItemArms/HempRope_XLargeWristTie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/HempRope_XLargeWristTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Crotch.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Crotch.png deleted file mode 100644 index 27390e6ec..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Crotch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_CrotchStrapsDouble.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_CrotchStrapsDouble.png deleted file mode 100644 index dd8e3a22c..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_CrotchStrapsDouble.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_CrotchStrapsSingle.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_CrotchStrapsSingle.png deleted file mode 100644 index 245411236..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_CrotchStrapsSingle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_CrotchStrapsTriple.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_CrotchStrapsTriple.png deleted file mode 100644 index 377997b84..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_CrotchStrapsTriple.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_JacketLoose.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_JacketLoose.png deleted file mode 100644 index 40680ad60..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_JacketLoose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_JacketBack.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_JacketBack.png deleted file mode 100644 index c880fd51e..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_JacketBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_JacketFront.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_JacketFront.png deleted file mode 100644 index 650326f5d..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_JacketFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_StrapsBack.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_StrapsBack.png deleted file mode 100644 index 208227734..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_StrapsBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_StrapsFront.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_StrapsFront.png deleted file mode 100644 index 01633be08..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_StrapsFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_StrapsLoose.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_StrapsLoose.png deleted file mode 100644 index 8aa254212..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Large_StrapsLoose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_JacketBack.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_JacketBack.png deleted file mode 100644 index 212d2528f..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_JacketBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_JacketFront.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_JacketFront.png deleted file mode 100644 index 43135be06..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_JacketFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_StrapsBack.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_StrapsBack.png deleted file mode 100644 index 8a12941f7..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_StrapsBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_StrapsFront.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_StrapsFront.png deleted file mode 100644 index 737e5fa5f..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_StrapsFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_StrapsLoose.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_StrapsLoose.png deleted file mode 100644 index cccb45b6a..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Normal_StrapsLoose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_JacketBack.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_JacketBack.png deleted file mode 100644 index 81fcb69e5..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_JacketBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_JacketFront.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_JacketFront.png deleted file mode 100644 index b79be3338..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_JacketFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_StrapsBack.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_StrapsBack.png deleted file mode 100644 index 889c1ec79..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_StrapsBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_StrapsFront.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_StrapsFront.png deleted file mode 100644 index eeea29e27..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_StrapsFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_StrapsLoose.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_StrapsLoose.png deleted file mode 100644 index 9371dfa5c..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_Small_StrapsLoose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_JacketBack.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_JacketBack.png deleted file mode 100644 index bcfa3d555..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_JacketBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_JacketFront.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_JacketFront.png deleted file mode 100644 index 370fcfcd3..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_JacketFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_StrapsBack.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_StrapsBack.png deleted file mode 100644 index 8cedabd7a..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_StrapsBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_StrapsFront.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_StrapsFront.png deleted file mode 100644 index 3babc04b6..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_StrapsFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_StrapsLoose.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_StrapsLoose.png deleted file mode 100644 index 483508882..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacket_XLarge_StrapsLoose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a0s1_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a0s1_Lock.png deleted file mode 100644 index 276004a46..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a0s1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a0s2_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a0s2_Lock.png deleted file mode 100644 index defc0e975..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a0s2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a0s3_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a0s3_Lock.png deleted file mode 100644 index 3979f29a9..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a0s3_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a1s1_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a1s1_Lock.png deleted file mode 100644 index 276004a46..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a1s1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a1s2_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a1s2_Lock.png deleted file mode 100644 index defc0e975..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a1s2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a1s3_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a1s3_Lock.png deleted file mode 100644 index 3979f29a9..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a1s3_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s0_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s0_Lock.png deleted file mode 100644 index d5502ef8d..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s0_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s1_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s1_Lock.png deleted file mode 100644 index 917a80c94..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s2_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s2_Lock.png deleted file mode 100644 index c772ff8e8..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s3_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s3_Lock.png deleted file mode 100644 index f1da363e0..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc0a2s3_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a0s1_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a0s1_Lock.png deleted file mode 100644 index 276004a46..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a0s1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a0s2_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a0s2_Lock.png deleted file mode 100644 index defc0e975..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a0s2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a0s3_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a0s3_Lock.png deleted file mode 100644 index 3979f29a9..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a0s3_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a1s1_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a1s1_Lock.png deleted file mode 100644 index 276004a46..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a1s1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a1s2_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a1s2_Lock.png deleted file mode 100644 index defc0e975..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a1s2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a1s3_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a1s3_Lock.png deleted file mode 100644 index 3979f29a9..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a1s3_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s0_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s0_Lock.png deleted file mode 100644 index d5502ef8d..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s0_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s1_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s1_Lock.png deleted file mode 100644 index 917a80c94..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s2_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s2_Lock.png deleted file mode 100644 index c772ff8e8..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s3_Lock.png b/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s3_Lock.png deleted file mode 100644 index f1da363e0..000000000 Binary files a/Assets/Female3DCG/ItemArms/HighSecurityStraitJacketc1a2s3_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Large_Cuffs.png deleted file mode 100644 index a53bf3771..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Large_Rings.png b/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Large_Rings.png deleted file mode 100644 index 4ed9ba0b7..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Lock.png b/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Lock.png deleted file mode 100644 index 4d1b0a7e5..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Normal_Cuffs.png deleted file mode 100644 index a53bf3771..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Normal_Rings.png deleted file mode 100644 index 4ed9ba0b7..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Small_Cuffs.png deleted file mode 100644 index a53bf3771..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Small_Rings.png b/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Small_Rings.png deleted file mode 100644 index 4ed9ba0b7..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_XLarge_Cuffs.png deleted file mode 100644 index a53bf3771..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_XLarge_Rings.png deleted file mode 100644 index 4ed9ba0b7..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/LeatherCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Large_Cuffs.png deleted file mode 100644 index 283f1cdf4..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Large_Gems.png b/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Large_Gems.png deleted file mode 100644 index ddf019054..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Lock.png b/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Lock.png deleted file mode 100644 index 4d1b0a7e5..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Normal_Cuffs.png deleted file mode 100644 index d6fae4268..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Normal_Gems.png deleted file mode 100644 index b25f17631..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Small_Cuffs.png deleted file mode 100644 index 3f32ad60a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Small_Gems.png b/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Small_Gems.png deleted file mode 100644 index 43d858ae6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_XLarge_Cuffs.png deleted file mode 100644 index 1f6beb73c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_XLarge_Gems.png deleted file mode 100644 index 5123520d5..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/OrnateCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Slime_BaseOneHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Slime_BaseOneHogtied.png deleted file mode 100644 index 7bdbc0a9c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Slime_BaseOneHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Slime_BaseTwoHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Slime_BaseTwoHogtied.png deleted file mode 100644 index af2b702c6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Slime_BaseTwoHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Slime_GirlFeaturesHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Slime_GirlFeaturesHogtied.png deleted file mode 100644 index b3a28c943..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Slime_GirlFeaturesHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Slime_GirlFrontHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Slime_GirlFrontHogtied.png deleted file mode 100644 index 19e9c07ba..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Slime_GirlFrontHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Web_LargeHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Web_LargeHogtied.png deleted file mode 100644 index 773c7a1a1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Web_LargeHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Web_LargeSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Web_LargeSuspensionHogtied.png deleted file mode 100644 index a51a0f6ce..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Web_LargeSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Web_NormalHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Web_NormalHogtied.png deleted file mode 100644 index 773c7a1a1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Web_NormalHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Web_NormalSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Web_NormalSuspensionHogtied.png deleted file mode 100644 index a51a0f6ce..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Web_NormalSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Web_SmallHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Web_SmallHogtied.png deleted file mode 100644 index 773c7a1a1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Web_SmallHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Web_SmallSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Web_SmallSuspensionHogtied.png deleted file mode 100644 index a51a0f6ce..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Web_SmallSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Web_XLargeHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Web_XLargeHogtied.png deleted file mode 100644 index 773c7a1a1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Web_XLargeHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/Web_XLargeSuspensionHogtied.png b/Assets/Female3DCG/ItemArms/Hogtied/Web_XLargeSuspensionHogtied.png deleted file mode 100644 index a51a0f6ce..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/Web_XLargeSuspensionHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Large.png b/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Large.png deleted file mode 100644 index f4c601aa2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Large_bgnd.png b/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Large_bgnd.png deleted file mode 100644 index 121be7b5d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Large_bgnd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Lock.png b/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Lock.png deleted file mode 100644 index 6cac80055..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Normal.png b/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Normal.png deleted file mode 100644 index f4c601aa2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Normal_bgnd.png b/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Normal_bgnd.png deleted file mode 100644 index c0b56ff43..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Normal_bgnd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Small.png b/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Small.png deleted file mode 100644 index f4c601aa2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Small_bgnd.png b/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Small_bgnd.png deleted file mode 100644 index 76a02b53a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_Small_bgnd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_XLarge.png b/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_XLarge.png deleted file mode 100644 index f4c601aa2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_XLarge_bgnd.png b/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_XLarge_bgnd.png deleted file mode 100644 index 07aeb6ce7..000000000 Binary files a/Assets/Female3DCG/ItemArms/Hogtied/WoodenCuffs_XLarge_bgnd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/InflatableStraightLeotard.png b/Assets/Female3DCG/ItemArms/InflatableStraightLeotard.png deleted file mode 100644 index 4202cf9eb..000000000 Binary files a/Assets/Female3DCG/ItemArms/InflatableStraightLeotard.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardBloated.png b/Assets/Female3DCG/ItemArms/InflatableStraightLeotardBloated.png deleted file mode 100644 index f581ecd22..000000000 Binary files a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardBloated.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardBloated_Lock.png b/Assets/Female3DCG/ItemArms/InflatableStraightLeotardBloated_Lock.png deleted file mode 100644 index aee39f10f..000000000 Binary files a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardBloated_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardInflated.png b/Assets/Female3DCG/ItemArms/InflatableStraightLeotardInflated.png deleted file mode 100644 index 01b08bdf4..000000000 Binary files a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardInflated.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardInflated_Lock.png b/Assets/Female3DCG/ItemArms/InflatableStraightLeotardInflated_Lock.png deleted file mode 100644 index 696c74b01..000000000 Binary files a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardInflated_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardMax.png b/Assets/Female3DCG/ItemArms/InflatableStraightLeotardMax.png deleted file mode 100644 index d29b07a15..000000000 Binary files a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardMax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardMax_Lock.png b/Assets/Female3DCG/ItemArms/InflatableStraightLeotardMax_Lock.png deleted file mode 100644 index 0d9947bbe..000000000 Binary files a/Assets/Female3DCG/ItemArms/InflatableStraightLeotardMax_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/InflatableStraightLeotard_Lock.png b/Assets/Female3DCG/ItemArms/InflatableStraightLeotard_Lock.png deleted file mode 100644 index 903a59f02..000000000 Binary files a/Assets/Female3DCG/ItemArms/InflatableStraightLeotard_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Large_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Large_Latex.png deleted file mode 100644 index 190655bf1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Largez1_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Largez1_Latex.png deleted file mode 100644 index 9310a041c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Largez1_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Largez2_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Largez2_Latex.png deleted file mode 100644 index d79d19fcd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Largez2_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Lock.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Lock.png deleted file mode 100644 index eef42583c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Normal_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Normal_Latex.png deleted file mode 100644 index 7f9ad3313..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Normalz1_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Normalz1_Latex.png deleted file mode 100644 index 6a743aa03..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Normalz1_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Normalz2_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Normalz2_Latex.png deleted file mode 100644 index 9f7c65ac8..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Normalz2_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Small_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Small_Latex.png deleted file mode 100644 index 431ee0853..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Smallz1_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Smallz1_Latex.png deleted file mode 100644 index e022fbcdc..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Smallz1_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Smallz2_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Smallz2_Latex.png deleted file mode 100644 index 3d125b815..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_Smallz2_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_XLarge_Latex.png deleted file mode 100644 index dcf1e75b3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_XLargez1_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_XLargez1_Latex.png deleted file mode 100644 index 8442ffdb5..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_XLargez1_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_XLargez2_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_XLargez2_Latex.png deleted file mode 100644 index e32adbaf7..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/BitchSuit_XLargez2_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Large.png b/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Large.png deleted file mode 100644 index 9abd407e6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Lock.png b/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Normal.png b/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Normal.png deleted file mode 100644 index 7b68e86fb..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Small.png b/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Small.png deleted file mode 100644 index a7d8b8585..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_XLarge.png b/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_XLarge.png deleted file mode 100644 index 4322e237e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/FullBodyLeatherHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Large.png b/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Large.png deleted file mode 100644 index 384f225a1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Lock.png b/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Lock.png deleted file mode 100644 index 0d60868aa..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Normal.png b/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Normal.png deleted file mode 100644 index 384f225a1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Small.png b/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Small.png deleted file mode 100644 index 384f225a1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_XLarge.png b/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_XLarge.png deleted file mode 100644 index 384f225a1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/FullBodyShackles_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_Large.png b/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_Large.png deleted file mode 100644 index 3fd582f99..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_Normal.png b/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_Normal.png deleted file mode 100644 index 433e8253b..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_Small.png b/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_Small.png deleted file mode 100644 index 0c888331a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_XLarge.png b/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_XLarge.png deleted file mode 100644 index 3fa6a0db8..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBodyOpen_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_Large.png b/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_Large.png deleted file mode 100644 index 5e57e6abb..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_Normal.png b/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_Normal.png deleted file mode 100644 index 362af2d2b..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_Small.png b/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_Small.png deleted file mode 100644 index 35cc32ecc..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_XLarge.png b/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_XLarge.png deleted file mode 100644 index 553df03c9..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/PantyhoseBody_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Large.png b/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Large.png deleted file mode 100644 index 792ae3afc..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Lock.png b/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Normal.png b/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Normal.png deleted file mode 100644 index edfb7d380..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Small.png b/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Small.png deleted file mode 100644 index 1901f5ece..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_XLarge.png b/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_XLarge.png deleted file mode 100644 index 66c916c7a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDressOpen_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Large.png b/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Large.png deleted file mode 100644 index 143c7ffea..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Lock.png b/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Normal.png b/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Normal.png deleted file mode 100644 index 6aae9d753..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Small.png b/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Small.png deleted file mode 100644 index 2c75b285c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_XLarge.png b/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_XLarge.png deleted file mode 100644 index 65c51700f..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/SeamlessStraitDress_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Large_Belts.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Large_Belts.png deleted file mode 100644 index 1a7470c23..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Large_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Large_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Large_Latex.png deleted file mode 100644 index 792ae3afc..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Lock.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Lock.png deleted file mode 100644 index 50dc494e1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Normal_Belts.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Normal_Belts.png deleted file mode 100644 index 7075b2abc..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Normal_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Normal_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Normal_Latex.png deleted file mode 100644 index 13827a1ff..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Small_Belts.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Small_Belts.png deleted file mode 100644 index 071cb88e2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Small_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Small_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Small_Latex.png deleted file mode 100644 index 1901f5ece..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_XLarge_Belts.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_XLarge_Belts.png deleted file mode 100644 index ab882dc92..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_XLarge_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_XLarge_Latex.png deleted file mode 100644 index 66c916c7a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDressOpen_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Large_Belts.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Large_Belts.png deleted file mode 100644 index 605f12df1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Large_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Large_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Large_Latex.png deleted file mode 100644 index 143c7ffea..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Lock.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Lock.png deleted file mode 100644 index 50dc494e1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Normal_Belts.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Normal_Belts.png deleted file mode 100644 index 9950ff531..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Normal_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Normal_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Normal_Latex.png deleted file mode 100644 index 50667ff77..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Small_Belts.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Small_Belts.png deleted file mode 100644 index 0c83cdd58..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Small_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Small_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Small_Latex.png deleted file mode 100644 index 2c75b285c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_XLarge_Belts.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDress_XLarge_Belts.png deleted file mode 100644 index 49f7775de..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_XLarge_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/Kneel/StraitDress_XLarge_Latex.png deleted file mode 100644 index 65c51700f..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StraitDress_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_Large_Legs.png b/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_Large_Legs.png deleted file mode 100644 index 02a98f0d1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_Large_Legs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_LegsLock.png b/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_LegsLock.png deleted file mode 100644 index fcc12df9c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_LegsLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_Normal_Legs.png b/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_Normal_Legs.png deleted file mode 100644 index 913759ea1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_Normal_Legs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_Small_Legs.png b/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_Small_Legs.png deleted file mode 100644 index 5357a862c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_Small_Legs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_XLarge_Legs.png b/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_XLarge_Legs.png deleted file mode 100644 index 344c6bfc2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/StrictLeatherPetCrawler_XLarge_Legs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Large_Shorts.png b/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Large_Shorts.png deleted file mode 100644 index 339ee0c1d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Large_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Large_StrapsLegs.png b/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Large_StrapsLegs.png deleted file mode 100644 index 92ee1f0ea..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Large_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Normal_Shorts.png b/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Normal_Shorts.png deleted file mode 100644 index d7720b61d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Normal_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Normal_StrapsLegs.png b/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Normal_StrapsLegs.png deleted file mode 100644 index 5d357dad3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Normal_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Small_Shorts.png b/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Small_Shorts.png deleted file mode 100644 index e0ecbb439..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Small_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Small_StrapsLegs.png b/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Small_StrapsLegs.png deleted file mode 100644 index 0d1350a6e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_Small_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_StripesLegs.png b/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_StripesLegs.png deleted file mode 100644 index 3bee1621a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_StripesLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_XLarge_Shorts.png b/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_XLarge_Shorts.png deleted file mode 100644 index a5f3bd1fe..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_XLarge_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_XLarge_StrapsLegs.png b/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_XLarge_StrapsLegs.png deleted file mode 100644 index 2e09080ee..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/TransportJacket_XLarge_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_Large.png b/Assets/Female3DCG/ItemArms/Kneel/Web_Large.png deleted file mode 100644 index 5784accfd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_LargeCocooned.png b/Assets/Female3DCG/ItemArms/Kneel/Web_LargeCocooned.png deleted file mode 100644 index 7d1f66047..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_LargeCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_LargeWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/Web_LargeWrapped.png deleted file mode 100644 index 5784accfd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_LargeWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_Normal.png b/Assets/Female3DCG/ItemArms/Kneel/Web_Normal.png deleted file mode 100644 index 5784accfd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_NormalCocooned.png b/Assets/Female3DCG/ItemArms/Kneel/Web_NormalCocooned.png deleted file mode 100644 index 7d1f66047..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_NormalCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_NormalWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/Web_NormalWrapped.png deleted file mode 100644 index 5784accfd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_NormalWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_Small.png b/Assets/Female3DCG/ItemArms/Kneel/Web_Small.png deleted file mode 100644 index 5784accfd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_SmallCocooned.png b/Assets/Female3DCG/ItemArms/Kneel/Web_SmallCocooned.png deleted file mode 100644 index 7d1f66047..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_SmallCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_SmallWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/Web_SmallWrapped.png deleted file mode 100644 index 5784accfd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_SmallWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_XLarge.png b/Assets/Female3DCG/ItemArms/Kneel/Web_XLarge.png deleted file mode 100644 index 5784accfd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_XLargeCocooned.png b/Assets/Female3DCG/ItemArms/Kneel/Web_XLargeCocooned.png deleted file mode 100644 index 7d1f66047..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_XLargeCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_XLargeWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/Web_XLargeWrapped.png deleted file mode 100644 index 5784accfd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_XLargeWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/Web_kneeling_open.png b/Assets/Female3DCG/ItemArms/Kneel/Web_kneeling_open.png deleted file mode 100644 index a3b89c919..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/Web_kneeling_open.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_Large.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_Large.png deleted file mode 100644 index 2e8fa6088..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_LargeFeetWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_LargeFeetWrapped.png deleted file mode 100644 index d2329f952..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_LargeFeetWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_LargeFullWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_LargeFullWrapped.png deleted file mode 100644 index bf6f3e26a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_LargeFullWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_LargeShouldersWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_LargeShouldersWrapped.png deleted file mode 100644 index 7bd39c6a6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_LargeShouldersWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_Normal.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_Normal.png deleted file mode 100644 index 7477b2943..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_NormalFeetWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_NormalFeetWrapped.png deleted file mode 100644 index 68129c973..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_NormalFeetWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_NormalFullWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_NormalFullWrapped.png deleted file mode 100644 index f2a7fa726..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_NormalFullWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_NormalShouldersWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_NormalShouldersWrapped.png deleted file mode 100644 index bf645c263..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_NormalShouldersWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_Small.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_Small.png deleted file mode 100644 index cc1d97316..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_SmallFeetWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_SmallFeetWrapped.png deleted file mode 100644 index f81fcae3e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_SmallFeetWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_SmallFullWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_SmallFullWrapped.png deleted file mode 100644 index de61cb1b7..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_SmallFullWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_SmallShouldersWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_SmallShouldersWrapped.png deleted file mode 100644 index f53558a6c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_SmallShouldersWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLarge.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLarge.png deleted file mode 100644 index 09dac0729..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLargeFeetWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLargeFeetWrapped.png deleted file mode 100644 index 09dac0729..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLargeFeetWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLargeFullWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLargeFullWrapped.png deleted file mode 100644 index 4ab4e4dd2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLargeFullWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLargeShouldersWrapped.png b/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLargeShouldersWrapped.png deleted file mode 100644 index 98cfa8655..000000000 Binary files a/Assets/Female3DCG/ItemArms/Kneel/WrappedBlanket_XLargeShouldersWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_Large.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_Large.png deleted file mode 100644 index 2bee617f5..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeBottom.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeBottom.png deleted file mode 100644 index 0438ac157..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeBottom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeComplete.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeComplete.png deleted file mode 100644 index a50d03324..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeExposedComplete.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeExposedComplete.png deleted file mode 100644 index 5966a5a74..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeExposedComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeFull.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeFull.png deleted file mode 100644 index dbca69d1c..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargePetTape.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargePetTape.png deleted file mode 100644 index 78ae27ced..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargePetTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeTop.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeTop.png deleted file mode 100644 index b375f0886..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_LargeTop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_Normal.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_Normal.png deleted file mode 100644 index 0050db23b..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalBottom.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalBottom.png deleted file mode 100644 index 9265feb7f..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalBottom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalComplete.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalComplete.png deleted file mode 100644 index 866996cb9..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalExposedComplete.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalExposedComplete.png deleted file mode 100644 index 06f7e21c9..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalExposedComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalFull.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalFull.png deleted file mode 100644 index 3029b23d1..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalPetTape.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalPetTape.png deleted file mode 100644 index 682d7419c..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalPetTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalTop.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalTop.png deleted file mode 100644 index 49f0277c8..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_NormalTop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_Small.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_Small.png deleted file mode 100644 index 93103c40d..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallBottom.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallBottom.png deleted file mode 100644 index 805aea2b7..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallBottom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallComplete.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallComplete.png deleted file mode 100644 index 9404822b1..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallExposedComplete.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallExposedComplete.png deleted file mode 100644 index 055ce3454..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallExposedComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallFull.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallFull.png deleted file mode 100644 index 5677a1af6..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallPetTape.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallPetTape.png deleted file mode 100644 index 901bc50cf..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallPetTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallTop.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallTop.png deleted file mode 100644 index 96a990091..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_SmallTop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLarge.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLarge.png deleted file mode 100644 index d8698f9a8..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeComplete.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeComplete.png deleted file mode 100644 index 881454c0e..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeExposedComplete.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeExposedComplete.png deleted file mode 100644 index 8a1c3b97a..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeExposedComplete.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeFull.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeFull.png deleted file mode 100644 index ec9a928f3..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargePetTape.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargePetTape.png deleted file mode 100644 index 6f89232f5..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargePetTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeTop.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeTop.png deleted file mode 100644 index 1bfe1b1e6..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XLargeTop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XlargeBottom.png b/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XlargeBottom.png deleted file mode 100644 index bab8c72e4..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/DuctTape_XlargeBottom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_Large_Legs.png b/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_Large_Legs.png deleted file mode 100644 index eece62424..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_Large_Legs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_LegsLock.png b/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_LegsLock.png deleted file mode 100644 index 242b8b0fe..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_LegsLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_Normal_Legs.png b/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_Normal_Legs.png deleted file mode 100644 index 5e11e035a..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_Normal_Legs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_Small_Legs.png b/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_Small_Legs.png deleted file mode 100644 index 77b257dbf..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_Small_Legs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_XLarge_Legs.png b/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_XLarge_Legs.png deleted file mode 100644 index 24d4bb2e1..000000000 Binary files a/Assets/Female3DCG/ItemArms/KneelingSpread/StrictLeatherPetCrawler_XLarge_Legs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Buckle1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Buckle1.png deleted file mode 100644 index 9acbca102..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Buckle1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Buckle2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Buckle2.png deleted file mode 100644 index e23e79ac9..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Buckle2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Hole1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Hole1.png deleted file mode 100644 index d405664ed..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Hole1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Hole2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Hole2.png deleted file mode 100644 index 123c65a83..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Hole2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Laces.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Laces.png deleted file mode 100644 index 072db7c85..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Latex.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Latex.png deleted file mode 100644 index e1e43cdd2..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Strap1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Strap1.png deleted file mode 100644 index a6811c2ad..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Strap1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Strap2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Strap2.png deleted file mode 100644 index 00832cdcc..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Strap2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Straps.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Straps.png deleted file mode 100644 index 5f098b3f9..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Lock.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Lock.png deleted file mode 100644 index a5554e766..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Buckle1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Buckle1.png deleted file mode 100644 index 982251543..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Buckle1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Buckle2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Buckle2.png deleted file mode 100644 index eb4941766..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Buckle2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Hole1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Hole1.png deleted file mode 100644 index 60aa25c06..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Hole1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Hole2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Hole2.png deleted file mode 100644 index ecbb2e698..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Hole2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Laces.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Laces.png deleted file mode 100644 index 00f5554a5..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Latex.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Latex.png deleted file mode 100644 index e1e43cdd2..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Strap1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Strap1.png deleted file mode 100644 index 563e45ede..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Strap1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Strap2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Strap2.png deleted file mode 100644 index 00832cdcc..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Strap2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Straps.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Straps.png deleted file mode 100644 index 5c74ca0f7..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Buckle1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Buckle1.png deleted file mode 100644 index 88b9af791..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Buckle1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Buckle2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Buckle2.png deleted file mode 100644 index 4136111b9..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Buckle2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Hole1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Hole1.png deleted file mode 100644 index 5f4df1358..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Hole1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Hole2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Hole2.png deleted file mode 100644 index 2f679659a..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Hole2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Laces.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Laces.png deleted file mode 100644 index ba15969b9..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Latex.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Latex.png deleted file mode 100644 index e1e43cdd2..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Strap1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Strap1.png deleted file mode 100644 index 214b9a928..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Strap1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Strap2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Strap2.png deleted file mode 100644 index 00832cdcc..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Strap2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Straps.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Straps.png deleted file mode 100644 index 29fa0fd7c..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Buckle1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Buckle1.png deleted file mode 100644 index 069a25410..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Buckle1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Buckle2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Buckle2.png deleted file mode 100644 index e60785020..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Buckle2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Hole1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Hole1.png deleted file mode 100644 index 60f636281..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Hole1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Hole2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Hole2.png deleted file mode 100644 index c37ed16fe..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Hole2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Laces.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Laces.png deleted file mode 100644 index 922db3da5..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Latex.png deleted file mode 100644 index e1e43cdd2..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Strap1.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Strap1.png deleted file mode 100644 index c293ea2c1..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Strap1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Strap2.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Strap2.png deleted file mode 100644 index 00832cdcc..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Strap2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Straps.png b/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Straps.png deleted file mode 100644 index 507e1b86c..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexArmbinder_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotardPolished_Lock.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotardPolished_Lock.png deleted file mode 100644 index 34519f82a..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotardPolished_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_LargePolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_LargePolished_Highlights.png deleted file mode 100644 index 2ee24dcee..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_LargePolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Large_Highlights.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Large_Highlights.png deleted file mode 100644 index ad7c363fd..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Large_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Large_Latex.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Large_Latex.png deleted file mode 100644 index 5d963de12..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Lock.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Lock.png deleted file mode 100644 index 34519f82a..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_NormalPolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_NormalPolished_Highlights.png deleted file mode 100644 index 0b2c2dda0..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_NormalPolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Normal_Highlights.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Normal_Highlights.png deleted file mode 100644 index 6b022a7f8..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Normal_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Normal_Latex.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Normal_Latex.png deleted file mode 100644 index e8233bab5..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_SmallPolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_SmallPolished_Highlights.png deleted file mode 100644 index a6f1a39d3..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_SmallPolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Small_Highlights.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Small_Highlights.png deleted file mode 100644 index b14f0d7d3..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Small_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Small_Latex.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Small_Latex.png deleted file mode 100644 index f88b57790..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_XLargePolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_XLargePolished_Highlights.png deleted file mode 100644 index 846680744..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_XLargePolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_XLarge_Highlights.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_XLarge_Highlights.png deleted file mode 100644 index 1537112db..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_XLarge_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_XLarge_Latex.png deleted file mode 100644 index b6ff555e2..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexBoxtieLeotard_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotardPolished_Lock.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotardPolished_Lock.png deleted file mode 100644 index b1cf5d898..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotardPolished_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_LargePolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_LargePolished_Highlights.png deleted file mode 100644 index 74fe513f9..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_LargePolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Large_Highlights.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Large_Highlights.png deleted file mode 100644 index e936d7f80..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Large_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Large_Latex.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Large_Latex.png deleted file mode 100644 index d6a3c4643..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Lock.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Lock.png deleted file mode 100644 index b1cf5d898..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_NormalPolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_NormalPolished_Highlights.png deleted file mode 100644 index ebd8f3c08..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_NormalPolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Normal_Highlights.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Normal_Highlights.png deleted file mode 100644 index ccd34f33f..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Normal_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Normal_Latex.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Normal_Latex.png deleted file mode 100644 index 6ee608c93..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_SmallPolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_SmallPolished_Highlights.png deleted file mode 100644 index 12e7498fc..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_SmallPolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Small_Highlights.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Small_Highlights.png deleted file mode 100644 index 2e6b89d51..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Small_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Small_Latex.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Small_Latex.png deleted file mode 100644 index 607d5e9f5..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_XLargePolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_XLargePolished_Highlights.png deleted file mode 100644 index 87687f3ad..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_XLargePolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_XLarge_Highlights.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_XLarge_Highlights.png deleted file mode 100644 index 55d5a8ab6..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_XLarge_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_XLarge_Latex.png deleted file mode 100644 index f12c93979..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexButterflyLeotard_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotardPolished_Lock.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotardPolished_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotardPolished_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_LargePolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_LargePolished_Highlights.png deleted file mode 100644 index 797ec0b9e..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_LargePolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Large_Highlights.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Large_Highlights.png deleted file mode 100644 index 3fa8c20c9..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Large_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Large_Latex.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Large_Latex.png deleted file mode 100644 index f5732b54e..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Lock.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_NormalPolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_NormalPolished_Highlights.png deleted file mode 100644 index 556187d7d..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_NormalPolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Normal_Highlights.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Normal_Highlights.png deleted file mode 100644 index df0cc2030..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Normal_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Normal_Latex.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Normal_Latex.png deleted file mode 100644 index 5464ad198..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_SmallPolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_SmallPolished_Highlights.png deleted file mode 100644 index f2d417bdc..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_SmallPolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Small_Highlights.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Small_Highlights.png deleted file mode 100644 index eb5780503..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Small_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Small_Latex.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Small_Latex.png deleted file mode 100644 index 7bdc1b89c..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_XLargePolished_Highlights.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_XLargePolished_Highlights.png deleted file mode 100644 index 13741a1a8..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_XLargePolished_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_XLarge_Highlights.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_XLarge_Highlights.png deleted file mode 100644 index 08f4a6c01..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_XLarge_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_XLarge_Latex.png deleted file mode 100644 index 725b19142..000000000 Binary files a/Assets/Female3DCG/ItemArms/LatexSleevelessLeotard_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherArmbinder_Binder.png b/Assets/Female3DCG/ItemArms/LeatherArmbinder_Binder.png deleted file mode 100644 index 758d10e31..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherArmbinder_Binder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherArmbinder_Lock.png b/Assets/Female3DCG/ItemArms/LeatherArmbinder_Lock.png deleted file mode 100644 index 56ba0ec5d..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherArmbinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherArmbinder_Strap.png b/Assets/Female3DCG/ItemArms/LeatherArmbinder_Strap.png deleted file mode 100644 index 00dc31e7f..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherArmbinder_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherArmbinder_WrapStrap.png b/Assets/Female3DCG/ItemArms/LeatherArmbinder_WrapStrap.png deleted file mode 100644 index e02dab84c..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherArmbinder_WrapStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/LeatherCuffs_Large_Cuffs.png deleted file mode 100644 index 60dce5106..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherCuffs_Large_Rings.png b/Assets/Female3DCG/ItemArms/LeatherCuffs_Large_Rings.png deleted file mode 100644 index 81511a440..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherCuffs_Lock.png b/Assets/Female3DCG/ItemArms/LeatherCuffs_Lock.png deleted file mode 100644 index abe5323da..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/LeatherCuffs_Normal_Cuffs.png deleted file mode 100644 index 539aa245b..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemArms/LeatherCuffs_Normal_Rings.png deleted file mode 100644 index 6975d6086..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/LeatherCuffs_Small_Cuffs.png deleted file mode 100644 index 98ed03f94..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherCuffs_Small_Rings.png b/Assets/Female3DCG/ItemArms/LeatherCuffs_Small_Rings.png deleted file mode 100644 index 69f9207ba..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/LeatherCuffs_XLarge_Cuffs.png deleted file mode 100644 index df2e2be73..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemArms/LeatherCuffs_XLarge_Rings.png deleted file mode 100644 index fd38dc259..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacketNormal_Lock.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacketNormal_Lock.png deleted file mode 100644 index 6457cac46..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacketNormal_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacketSnug_Lock.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacketSnug_Lock.png deleted file mode 100644 index c3600d9d7..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacketSnug_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacketTight_Lock.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacketTight_Lock.png deleted file mode 100644 index efddf6e9e..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacketTight_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Large.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Large.png deleted file mode 100644 index 2ff147ebc..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_LargeNormal.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_LargeNormal.png deleted file mode 100644 index 48b25e0dd..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_LargeNormal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_LargeSnug.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_LargeSnug.png deleted file mode 100644 index d0a7a9029..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_LargeSnug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_LargeTight.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_LargeTight.png deleted file mode 100644 index e5592a0fb..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_LargeTight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Lock.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Lock.png deleted file mode 100644 index 6ba909053..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Normal.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Normal.png deleted file mode 100644 index 1b376cd72..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_NormalNormal.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_NormalNormal.png deleted file mode 100644 index c45ee047a..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_NormalNormal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_NormalSnug.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_NormalSnug.png deleted file mode 100644 index a70c08dec..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_NormalSnug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_NormalTight.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_NormalTight.png deleted file mode 100644 index 7f0f3769c..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_NormalTight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Small.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Small.png deleted file mode 100644 index 61dc3d163..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_SmallNormal.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_SmallNormal.png deleted file mode 100644 index 605b72139..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_SmallNormal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_SmallSnug.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_SmallSnug.png deleted file mode 100644 index 14ae18808..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_SmallSnug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_SmallTight.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_SmallTight.png deleted file mode 100644 index ad1f80191..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_SmallTight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLarge.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLarge.png deleted file mode 100644 index 3ae571d85..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLargeNormal.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLargeNormal.png deleted file mode 100644 index 63d9bf589..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLargeNormal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLargeSnug.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLargeSnug.png deleted file mode 100644 index 5127e1166..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLargeSnug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLargeTight.png b/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLargeTight.png deleted file mode 100644 index 11b9fc721..000000000 Binary files a/Assets/Female3DCG/ItemArms/LeatherStraitJacket_XLargeTight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Large.png b/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Large.png deleted file mode 100644 index 08a2d01fc..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Lock.png b/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Lock.png deleted file mode 100644 index 0d60868aa..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Normal.png b/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Normal.png deleted file mode 100644 index 08a2d01fc..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Small.png b/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Small.png deleted file mode 100644 index 08a2d01fc..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_XLarge.png b/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_XLarge.png deleted file mode 100644 index 08a2d01fc..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/FullBodyShackles_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Large_Shorts.png b/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Large_Shorts.png deleted file mode 100644 index 339ee0c1d..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Large_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Large_StrapsLegs.png b/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Large_StrapsLegs.png deleted file mode 100644 index 92ee1f0ea..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Large_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Normal_Shorts.png b/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Normal_Shorts.png deleted file mode 100644 index d7720b61d..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Normal_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Normal_StrapsLegs.png b/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Normal_StrapsLegs.png deleted file mode 100644 index 5d357dad3..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Normal_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Small_Shorts.png b/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Small_Shorts.png deleted file mode 100644 index e0ecbb439..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Small_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Small_StrapsLegs.png b/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Small_StrapsLegs.png deleted file mode 100644 index 0d1350a6e..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_Small_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_StripesLegs.png b/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_StripesLegs.png deleted file mode 100644 index 3bee1621a..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_StripesLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_XLarge_Shorts.png b/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_XLarge_Shorts.png deleted file mode 100644 index a5f3bd1fe..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_XLarge_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_XLarge_StrapsLegs.png b/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_XLarge_StrapsLegs.png deleted file mode 100644 index 2e09080ee..000000000 Binary files a/Assets/Female3DCG/ItemArms/LegsClosed/TransportJacket_XLarge_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Manacles_Large.png b/Assets/Female3DCG/ItemArms/Manacles_Large.png deleted file mode 100644 index ddfd50c2c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Manacles_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Manacles_Lock.png b/Assets/Female3DCG/ItemArms/Manacles_Lock.png deleted file mode 100644 index f595987ff..000000000 Binary files a/Assets/Female3DCG/ItemArms/Manacles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Manacles_Normal.png b/Assets/Female3DCG/ItemArms/Manacles_Normal.png deleted file mode 100644 index ddfd50c2c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Manacles_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Manacles_Small.png b/Assets/Female3DCG/ItemArms/Manacles_Small.png deleted file mode 100644 index ddfd50c2c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Manacles_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Manacles_XLarge.png b/Assets/Female3DCG/ItemArms/Manacles_XLarge.png deleted file mode 100644 index ddfd50c2c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Manacles_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Base.png b/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Base.png deleted file mode 100644 index 362ee99f8..000000000 Binary files a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Large_Straps.png b/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Large_Straps.png deleted file mode 100644 index f37256a0b..000000000 Binary files a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Lock.png b/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Normal_Straps.png b/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Normal_Straps.png deleted file mode 100644 index b0e47fa69..000000000 Binary files a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Small_Straps.png b/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Small_Straps.png deleted file mode 100644 index 33075788c..000000000 Binary files a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_XLarge_Straps.png b/Assets/Female3DCG/ItemArms/MedicalBedRestraints_XLarge_Straps.png deleted file mode 100644 index b1d44b78f..000000000 Binary files a/Assets/Female3DCG/ItemArms/MedicalBedRestraints_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MermaidSuitUnZip_Lock.png b/Assets/Female3DCG/ItemArms/MermaidSuitUnZip_Lock.png deleted file mode 100644 index 9fa36fd14..000000000 Binary files a/Assets/Female3DCG/ItemArms/MermaidSuitUnZip_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MermaidSuit_Large_Latex.png b/Assets/Female3DCG/ItemArms/MermaidSuit_Large_Latex.png deleted file mode 100644 index ff4d6486f..000000000 Binary files a/Assets/Female3DCG/ItemArms/MermaidSuit_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MermaidSuit_Large_UnZip.png b/Assets/Female3DCG/ItemArms/MermaidSuit_Large_UnZip.png deleted file mode 100644 index f6b909ce2..000000000 Binary files a/Assets/Female3DCG/ItemArms/MermaidSuit_Large_UnZip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MermaidSuit_Lock.png b/Assets/Female3DCG/ItemArms/MermaidSuit_Lock.png deleted file mode 100644 index 9fa36fd14..000000000 Binary files a/Assets/Female3DCG/ItemArms/MermaidSuit_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MermaidSuit_Normal_Latex.png b/Assets/Female3DCG/ItemArms/MermaidSuit_Normal_Latex.png deleted file mode 100644 index 05365663e..000000000 Binary files a/Assets/Female3DCG/ItemArms/MermaidSuit_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MermaidSuit_Normal_UnZip.png b/Assets/Female3DCG/ItemArms/MermaidSuit_Normal_UnZip.png deleted file mode 100644 index b306a37a5..000000000 Binary files a/Assets/Female3DCG/ItemArms/MermaidSuit_Normal_UnZip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MermaidSuit_Small_Latex.png b/Assets/Female3DCG/ItemArms/MermaidSuit_Small_Latex.png deleted file mode 100644 index 855628680..000000000 Binary files a/Assets/Female3DCG/ItemArms/MermaidSuit_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MermaidSuit_Small_UnZip.png b/Assets/Female3DCG/ItemArms/MermaidSuit_Small_UnZip.png deleted file mode 100644 index 7daffda92..000000000 Binary files a/Assets/Female3DCG/ItemArms/MermaidSuit_Small_UnZip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MermaidSuit_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/MermaidSuit_XLarge_Latex.png deleted file mode 100644 index 6e02c3ae9..000000000 Binary files a/Assets/Female3DCG/ItemArms/MermaidSuit_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MermaidSuit_XLarge_UnZip.png b/Assets/Female3DCG/ItemArms/MermaidSuit_XLarge_UnZip.png deleted file mode 100644 index f1a91637e..000000000 Binary files a/Assets/Female3DCG/ItemArms/MermaidSuit_XLarge_UnZip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MetalCuffs_Large.png b/Assets/Female3DCG/ItemArms/MetalCuffs_Large.png deleted file mode 100644 index e89caf313..000000000 Binary files a/Assets/Female3DCG/ItemArms/MetalCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MetalCuffs_Normal.png b/Assets/Female3DCG/ItemArms/MetalCuffs_Normal.png deleted file mode 100644 index e89caf313..000000000 Binary files a/Assets/Female3DCG/ItemArms/MetalCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MetalCuffs_Small.png b/Assets/Female3DCG/ItemArms/MetalCuffs_Small.png deleted file mode 100644 index e89caf313..000000000 Binary files a/Assets/Female3DCG/ItemArms/MetalCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MetalCuffs_XLarge.png b/Assets/Female3DCG/ItemArms/MetalCuffs_XLarge.png deleted file mode 100644 index e89caf313..000000000 Binary files a/Assets/Female3DCG/ItemArms/MetalCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MittenChain1_Large.png b/Assets/Female3DCG/ItemArms/MittenChain1_Large.png deleted file mode 100644 index 7a1ce9c77..000000000 Binary files a/Assets/Female3DCG/ItemArms/MittenChain1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MittenChain1_Lock.png b/Assets/Female3DCG/ItemArms/MittenChain1_Lock.png deleted file mode 100644 index 9216915cd..000000000 Binary files a/Assets/Female3DCG/ItemArms/MittenChain1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MittenChain1_Normal.png b/Assets/Female3DCG/ItemArms/MittenChain1_Normal.png deleted file mode 100644 index 7a1ce9c77..000000000 Binary files a/Assets/Female3DCG/ItemArms/MittenChain1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MittenChain1_Small.png b/Assets/Female3DCG/ItemArms/MittenChain1_Small.png deleted file mode 100644 index 7a1ce9c77..000000000 Binary files a/Assets/Female3DCG/ItemArms/MittenChain1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/MittenChain1_XLarge.png b/Assets/Female3DCG/ItemArms/MittenChain1_XLarge.png deleted file mode 100644 index dd87fd3af..000000000 Binary files a/Assets/Female3DCG/ItemArms/MittenChain1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeAllFours_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeAllFours_Rope.png deleted file mode 100644 index 015c63025..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeAllFours_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeAllFours_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeAllFours_Shine.png deleted file mode 100644 index 3aa357034..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeAllFours_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeBedSpreadEagle_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeBedSpreadEagle_Rope.png deleted file mode 100644 index 3ccc62769..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeBedSpreadEagle_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeBedSpreadEagle_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeBedSpreadEagle_Shine.png deleted file mode 100644 index d32350c71..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeBedSpreadEagle_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeHogtied_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeHogtied_Rope.png deleted file mode 100644 index 4f1576cbf..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeHogtied_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeHogtied_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeHogtied_Shine.png deleted file mode 100644 index b819cc6c6..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeHogtied_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeKneelingHogtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeKneelingHogtie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeKneelingHogtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeKneelingHogtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeKneelingHogtie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeKneelingHogtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeSimpleHogtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeSimpleHogtie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeSimpleHogtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeSimpleHogtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeSimpleHogtie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeSimpleHogtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeTightBoxtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeTightBoxtie_Rope.png deleted file mode 100644 index b62ca377c..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeTightBoxtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeTightBoxtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeTightBoxtie_Shine.png deleted file mode 100644 index 0d697e7a1..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeTightBoxtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowHarnessTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowHarnessTie_Rope.png deleted file mode 100644 index 07b2f71ff..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowHarnessTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowHarnessTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowHarnessTie_Shine.png deleted file mode 100644 index fb7a9349d..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowHarnessTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowTie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowTie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristElbowTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeWristTie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_LargeWristTie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_LargeWristTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_Large_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_Large_Rope.png deleted file mode 100644 index 9b926ce33..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_Large_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_Large_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_Large_Shine.png deleted file mode 100644 index 87e97e0ab..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalAllFours_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalAllFours_Rope.png deleted file mode 100644 index c7dfd5d63..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalAllFours_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalAllFours_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalAllFours_Shine.png deleted file mode 100644 index 694bd235b..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalAllFours_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalBedSpreadEagle_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalBedSpreadEagle_Rope.png deleted file mode 100644 index d551a2f1e..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalBedSpreadEagle_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalBedSpreadEagle_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalBedSpreadEagle_Shine.png deleted file mode 100644 index d32350c71..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalBedSpreadEagle_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalHogtied_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalHogtied_Rope.png deleted file mode 100644 index 61e264c68..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalHogtied_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalHogtied_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalHogtied_Shine.png deleted file mode 100644 index dac976d7b..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalHogtied_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalKneelingHogtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalKneelingHogtie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalKneelingHogtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalKneelingHogtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalKneelingHogtie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalKneelingHogtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalSimpleHogtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalSimpleHogtie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalSimpleHogtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalSimpleHogtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalSimpleHogtie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalSimpleHogtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalTightBoxtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalTightBoxtie_Rope.png deleted file mode 100644 index bc56b86b4..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalTightBoxtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalTightBoxtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalTightBoxtie_Shine.png deleted file mode 100644 index 0b0a81cef..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalTightBoxtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowHarnessTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowHarnessTie_Rope.png deleted file mode 100644 index 360c0d6a8..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowHarnessTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowHarnessTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowHarnessTie_Shine.png deleted file mode 100644 index 3c410bf4b..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowHarnessTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowTie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowTie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristElbowTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalWristTie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_NormalWristTie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_NormalWristTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_Normal_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_Normal_Rope.png deleted file mode 100644 index 88dfc78bb..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_Normal_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_Normal_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_Normal_Shine.png deleted file mode 100644 index bc6a307a6..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallAllFours_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallAllFours_Rope.png deleted file mode 100644 index 52e9146f6..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallAllFours_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallAllFours_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallAllFours_Shine.png deleted file mode 100644 index adb343f59..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallAllFours_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallBedSpreadEagle_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallBedSpreadEagle_Rope.png deleted file mode 100644 index 2b2ec136e..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallBedSpreadEagle_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallBedSpreadEagle_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallBedSpreadEagle_Shine.png deleted file mode 100644 index 0d397cb82..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallBedSpreadEagle_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallHogtied_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallHogtied_Rope.png deleted file mode 100644 index 843f9f0a5..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallHogtied_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallHogtied_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallHogtied_Shine.png deleted file mode 100644 index 1fb85546e..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallHogtied_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallKneelingHogtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallKneelingHogtie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallKneelingHogtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallKneelingHogtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallKneelingHogtie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallKneelingHogtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallSimpleHogtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallSimpleHogtie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallSimpleHogtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallSimpleHogtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallSimpleHogtie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallSimpleHogtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallTightBoxtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallTightBoxtie_Rope.png deleted file mode 100644 index e6129ca97..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallTightBoxtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallTightBoxtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallTightBoxtie_Shine.png deleted file mode 100644 index c031c6cd6..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallTightBoxtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowHarnessTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowHarnessTie_Rope.png deleted file mode 100644 index 2050b623b..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowHarnessTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowHarnessTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowHarnessTie_Shine.png deleted file mode 100644 index f009606bc..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowHarnessTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowTie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowTie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristElbowTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallWristTie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_SmallWristTie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_SmallWristTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_Small_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_Small_Rope.png deleted file mode 100644 index f6ede615f..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_Small_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_Small_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_Small_Shine.png deleted file mode 100644 index a609db156..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeAllFours_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeAllFours_Rope.png deleted file mode 100644 index a682cb660..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeAllFours_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeAllFours_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeAllFours_Shine.png deleted file mode 100644 index 8d6268640..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeAllFours_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeBedSpreadEagle_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeBedSpreadEagle_Rope.png deleted file mode 100644 index a9b823cc3..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeBedSpreadEagle_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeBedSpreadEagle_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeBedSpreadEagle_Shine.png deleted file mode 100644 index ef03cb658..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeBedSpreadEagle_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeHogtied_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeHogtied_Rope.png deleted file mode 100644 index f1a8919cc..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeHogtied_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeHogtied_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeHogtied_Shine.png deleted file mode 100644 index 1ef2605cf..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeHogtied_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeKneelingHogtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeKneelingHogtie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeKneelingHogtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeKneelingHogtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeKneelingHogtie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeKneelingHogtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeSimpleHogtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeSimpleHogtie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeSimpleHogtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeSimpleHogtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeSimpleHogtie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeSimpleHogtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeTightBoxtie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeTightBoxtie_Rope.png deleted file mode 100644 index fc2cec0e5..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeTightBoxtie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeTightBoxtie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeTightBoxtie_Shine.png deleted file mode 100644 index 935bbcce1..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeTightBoxtie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowHarnessTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowHarnessTie_Rope.png deleted file mode 100644 index d5a1d93b1..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowHarnessTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowHarnessTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowHarnessTie_Shine.png deleted file mode 100644 index 2b25fadfc..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowHarnessTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowTie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowTie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristElbowTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristTie_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristTie_Rope.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristTie_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristTie_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristTie_Shine.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLargeWristTie_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLarge_Rope.png b/Assets/Female3DCG/ItemArms/NylonRope_XLarge_Rope.png deleted file mode 100644 index 8eaf04943..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLarge_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/NylonRope_XLarge_Shine.png b/Assets/Female3DCG/ItemArms/NylonRope_XLarge_Shine.png deleted file mode 100644 index 62d5c0f21..000000000 Binary files a/Assets/Female3DCG/ItemArms/NylonRope_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Orig/DuctTape.png b/Assets/Female3DCG/ItemArms/Orig/DuctTape.png deleted file mode 100644 index f1e2b8908..000000000 Binary files a/Assets/Female3DCG/ItemArms/Orig/DuctTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Orig/LeatherArmbinder.png b/Assets/Female3DCG/ItemArms/Orig/LeatherArmbinder.png deleted file mode 100644 index 0b3a92073..000000000 Binary files a/Assets/Female3DCG/ItemArms/Orig/LeatherArmbinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OrnateCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/OrnateCuffs_Large_Cuffs.png deleted file mode 100644 index d619983c9..000000000 Binary files a/Assets/Female3DCG/ItemArms/OrnateCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OrnateCuffs_Large_Gems.png b/Assets/Female3DCG/ItemArms/OrnateCuffs_Large_Gems.png deleted file mode 100644 index 9d497a3a5..000000000 Binary files a/Assets/Female3DCG/ItemArms/OrnateCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OrnateCuffs_Lock.png b/Assets/Female3DCG/ItemArms/OrnateCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/OrnateCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OrnateCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/OrnateCuffs_Normal_Cuffs.png deleted file mode 100644 index 08aebde8b..000000000 Binary files a/Assets/Female3DCG/ItemArms/OrnateCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OrnateCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemArms/OrnateCuffs_Normal_Gems.png deleted file mode 100644 index 14e3eac08..000000000 Binary files a/Assets/Female3DCG/ItemArms/OrnateCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OrnateCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/OrnateCuffs_Small_Cuffs.png deleted file mode 100644 index d2c247efd..000000000 Binary files a/Assets/Female3DCG/ItemArms/OrnateCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OrnateCuffs_Small_Gems.png b/Assets/Female3DCG/ItemArms/OrnateCuffs_Small_Gems.png deleted file mode 100644 index ffee798ef..000000000 Binary files a/Assets/Female3DCG/ItemArms/OrnateCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OrnateCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/OrnateCuffs_XLarge_Cuffs.png deleted file mode 100644 index 259f58b58..000000000 Binary files a/Assets/Female3DCG/ItemArms/OrnateCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OrnateCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemArms/OrnateCuffs_XLarge_Gems.png deleted file mode 100644 index e02892e9f..000000000 Binary files a/Assets/Female3DCG/ItemArms/OrnateCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Display.png b/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Display.png deleted file mode 100644 index 69e06d1fb..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Large_Cuffs.png deleted file mode 100644 index 55921b58f..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Lock.png b/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Lock.png deleted file mode 100644 index aa0fc50b5..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Normal_Cuffs.png deleted file mode 100644 index 50c39c6c2..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Small_Cuffs.png deleted file mode 100644 index 139a9c167..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_XLarge_Cuffs.png deleted file mode 100644 index fef6bc5cf..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/FuturisticCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Large_Cuffs.png deleted file mode 100644 index 030a0083f..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Large_Rings.png b/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Large_Rings.png deleted file mode 100644 index 37d308f4b..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Lock.png b/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Lock.png deleted file mode 100644 index b313908a6..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Normal_Cuffs.png deleted file mode 100644 index d6ddaf36e..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Normal_Rings.png deleted file mode 100644 index dc3b30e20..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Small_Cuffs.png deleted file mode 100644 index 42f1fbba8..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Small_Rings.png b/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Small_Rings.png deleted file mode 100644 index af6da35c2..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_XLarge_Cuffs.png deleted file mode 100644 index d3699a404..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_XLarge_Rings.png deleted file mode 100644 index da62da809..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/LeatherCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Large_Cuffs.png deleted file mode 100644 index 8e2848f44..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Large_Gems.png b/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Large_Gems.png deleted file mode 100644 index 048468ad0..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Lock.png b/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Normal_Cuffs.png deleted file mode 100644 index 8e2848f44..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Normal_Gems.png deleted file mode 100644 index 048468ad0..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Small_Cuffs.png deleted file mode 100644 index 8e2848f44..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Small_Gems.png b/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Small_Gems.png deleted file mode 100644 index 048468ad0..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_XLarge_Cuffs.png deleted file mode 100644 index 8e2848f44..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_XLarge_Gems.png deleted file mode 100644 index 048468ad0..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/OrnateCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_Large.png b/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_Large.png deleted file mode 100644 index 9068e76e0..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_Normal.png b/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_Normal.png deleted file mode 100644 index 981ae658b..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_Small.png b/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_Small.png deleted file mode 100644 index 981ae658b..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_XLarge.png b/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_XLarge.png deleted file mode 100644 index 9068e76e0..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/SteelCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Large_Inner.png b/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Large_Inner.png deleted file mode 100644 index 7480f1681..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Large_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Large_Outer.png b/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Large_Outer.png deleted file mode 100644 index 9771c4fc2..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Large_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Normal_Inner.png b/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Normal_Inner.png deleted file mode 100644 index 1a4e6b21f..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Normal_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Normal_Outer.png b/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Normal_Outer.png deleted file mode 100644 index 208cfa71e..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Normal_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Shine.png b/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Shine.png deleted file mode 100644 index 29e09232c..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Small_Inner.png b/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Small_Inner.png deleted file mode 100644 index 4715ec1fc..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Small_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Small_Outer.png b/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Small_Outer.png deleted file mode 100644 index fab133e48..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Small_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Sucker.png b/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Sucker.png deleted file mode 100644 index 7e8e6c182..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_Sucker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_XLarge_Inner.png b/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_XLarge_Inner.png deleted file mode 100644 index 634e1a931..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_XLarge_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_XLarge_Outer.png b/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_XLarge_Outer.png deleted file mode 100644 index 29c1c985e..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/Tentacles_XLarge_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/WristShackles_Chain.png b/Assets/Female3DCG/ItemArms/OverTheHead/WristShackles_Chain.png deleted file mode 100644 index a58e312a5..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/WristShackles_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/WristShackles_Cuffs.png b/Assets/Female3DCG/ItemArms/OverTheHead/WristShackles_Cuffs.png deleted file mode 100644 index 5d10a55cd..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/WristShackles_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/OverTheHead/WristShackles_Lock.png b/Assets/Female3DCG/ItemArms/OverTheHead/WristShackles_Lock.png deleted file mode 100644 index af367b99a..000000000 Binary files a/Assets/Female3DCG/ItemArms/OverTheHead/WristShackles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_Large.png b/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_Large.png deleted file mode 100644 index 1c9f1b41f..000000000 Binary files a/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_Normal.png b/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_Normal.png deleted file mode 100644 index 1c9f1b41f..000000000 Binary files a/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_Small.png b/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_Small.png deleted file mode 100644 index 1c9f1b41f..000000000 Binary files a/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_XLarge.png b/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_XLarge.png deleted file mode 100644 index 1c9f1b41f..000000000 Binary files a/Assets/Female3DCG/ItemArms/PaddedMittensHarnessLocked_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PaddedMittensHarness_Large.png b/Assets/Female3DCG/ItemArms/PaddedMittensHarness_Large.png deleted file mode 100644 index 111859b7f..000000000 Binary files a/Assets/Female3DCG/ItemArms/PaddedMittensHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PaddedMittensHarness_Normal.png b/Assets/Female3DCG/ItemArms/PaddedMittensHarness_Normal.png deleted file mode 100644 index e4c3f8aa3..000000000 Binary files a/Assets/Female3DCG/ItemArms/PaddedMittensHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PaddedMittensHarness_Small.png b/Assets/Female3DCG/ItemArms/PaddedMittensHarness_Small.png deleted file mode 100644 index 111859b7f..000000000 Binary files a/Assets/Female3DCG/ItemArms/PaddedMittensHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PaddedMittensHarness_XLarge.png b/Assets/Female3DCG/ItemArms/PaddedMittensHarness_XLarge.png deleted file mode 100644 index 111859b7f..000000000 Binary files a/Assets/Female3DCG/ItemArms/PaddedMittensHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PaddedMittens_Lock.png b/Assets/Female3DCG/ItemArms/PaddedMittens_Lock.png deleted file mode 100644 index 45a75e573..000000000 Binary files a/Assets/Female3DCG/ItemArms/PaddedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_Large.png b/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_Large.png deleted file mode 100644 index 81a77ba6d..000000000 Binary files a/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_Normal.png b/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_Normal.png deleted file mode 100644 index db32f7c8b..000000000 Binary files a/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_Small.png b/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_Small.png deleted file mode 100644 index 0ead79abc..000000000 Binary files a/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_XLarge.png b/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_XLarge.png deleted file mode 100644 index 8e5c10b6d..000000000 Binary files a/Assets/Female3DCG/ItemArms/PantyhoseBodyOpen_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PantyhoseBody_Large.png b/Assets/Female3DCG/ItemArms/PantyhoseBody_Large.png deleted file mode 100644 index 9180b92e2..000000000 Binary files a/Assets/Female3DCG/ItemArms/PantyhoseBody_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PantyhoseBody_Normal.png b/Assets/Female3DCG/ItemArms/PantyhoseBody_Normal.png deleted file mode 100644 index 4b3c38d81..000000000 Binary files a/Assets/Female3DCG/ItemArms/PantyhoseBody_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PantyhoseBody_Small.png b/Assets/Female3DCG/ItemArms/PantyhoseBody_Small.png deleted file mode 100644 index d96572499..000000000 Binary files a/Assets/Female3DCG/ItemArms/PantyhoseBody_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PantyhoseBody_XLarge.png b/Assets/Female3DCG/ItemArms/PantyhoseBody_XLarge.png deleted file mode 100644 index 4d33e7670..000000000 Binary files a/Assets/Female3DCG/ItemArms/PantyhoseBody_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PawMittens_Lock.png b/Assets/Female3DCG/ItemArms/PawMittens_Lock.png deleted file mode 100644 index 45a75e573..000000000 Binary files a/Assets/Female3DCG/ItemArms/PawMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PetCrawler_Large.png b/Assets/Female3DCG/ItemArms/PetCrawler_Large.png deleted file mode 100644 index 9dc01cb2a..000000000 Binary files a/Assets/Female3DCG/ItemArms/PetCrawler_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PetCrawler_Lock.png b/Assets/Female3DCG/ItemArms/PetCrawler_Lock.png deleted file mode 100644 index c25070590..000000000 Binary files a/Assets/Female3DCG/ItemArms/PetCrawler_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PetCrawler_Normal.png b/Assets/Female3DCG/ItemArms/PetCrawler_Normal.png deleted file mode 100644 index 020e977e5..000000000 Binary files a/Assets/Female3DCG/ItemArms/PetCrawler_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PetCrawler_Small.png b/Assets/Female3DCG/ItemArms/PetCrawler_Small.png deleted file mode 100644 index f97ea96f1..000000000 Binary files a/Assets/Female3DCG/ItemArms/PetCrawler_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PetCrawler_XLarge.png b/Assets/Female3DCG/ItemArms/PetCrawler_XLarge.png deleted file mode 100644 index 42d61e72b..000000000 Binary files a/Assets/Female3DCG/ItemArms/PetCrawler_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Pillory_Lock.png b/Assets/Female3DCG/ItemArms/Pillory_Lock.png deleted file mode 100644 index c7ff0a683..000000000 Binary files a/Assets/Female3DCG/ItemArms/Pillory_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Pillory_Metal.png b/Assets/Female3DCG/ItemArms/Pillory_Metal.png deleted file mode 100644 index da35ebce9..000000000 Binary files a/Assets/Female3DCG/ItemArms/Pillory_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Pillory_Wood.png b/Assets/Female3DCG/ItemArms/Pillory_Wood.png deleted file mode 100644 index 8545b89e3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Pillory_Wood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PlasticWrap_Large.png b/Assets/Female3DCG/ItemArms/PlasticWrap_Large.png deleted file mode 100644 index 42fe73949..000000000 Binary files a/Assets/Female3DCG/ItemArms/PlasticWrap_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PlasticWrap_Normal.png b/Assets/Female3DCG/ItemArms/PlasticWrap_Normal.png deleted file mode 100644 index 92e6f0160..000000000 Binary files a/Assets/Female3DCG/ItemArms/PlasticWrap_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PlasticWrap_Small.png b/Assets/Female3DCG/ItemArms/PlasticWrap_Small.png deleted file mode 100644 index be951fe02..000000000 Binary files a/Assets/Female3DCG/ItemArms/PlasticWrap_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PlasticWrap_XLarge.png b/Assets/Female3DCG/ItemArms/PlasticWrap_XLarge.png deleted file mode 100644 index 7135b029a..000000000 Binary files a/Assets/Female3DCG/ItemArms/PlasticWrap_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/ArmbinderJacket.png b/Assets/Female3DCG/ItemArms/Preview/ArmbinderJacket.png deleted file mode 100644 index 13dcd2d96..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/ArmbinderJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/BitchSuit.png b/Assets/Female3DCG/ItemArms/Preview/BitchSuit.png deleted file mode 100644 index 6df93a5a2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/BitchSuit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/BitchSuitExposed.png b/Assets/Female3DCG/ItemArms/Preview/BitchSuitExposed.png deleted file mode 100644 index f00340fa8..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/BitchSuitExposed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/Bolero.png b/Assets/Female3DCG/ItemArms/Preview/Bolero.png deleted file mode 100644 index d3e1c4e35..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/Bolero.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/BondageBouquet.png b/Assets/Female3DCG/ItemArms/Preview/BondageBouquet.png deleted file mode 100644 index 86f1c038b..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/BondageBouquet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/BondageBra.png b/Assets/Female3DCG/ItemArms/Preview/BondageBra.png deleted file mode 100644 index f0a930373..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/BondageBra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/BoxTieArmbinder.png b/Assets/Female3DCG/ItemArms/Preview/BoxTieArmbinder.png deleted file mode 100644 index 48c010900..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/BoxTieArmbinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/CeilingShackles.png b/Assets/Female3DCG/ItemArms/Preview/CeilingShackles.png deleted file mode 100644 index d78ec0fc2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/CeilingShackles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/ChainLeashHolding.png b/Assets/Female3DCG/ItemArms/Preview/ChainLeashHolding.png deleted file mode 100644 index 1c949e20f..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/ChainLeashHolding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/Chains.png b/Assets/Female3DCG/ItemArms/Preview/Chains.png deleted file mode 100644 index 0617c1adb..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/CollarCuffs.png b/Assets/Female3DCG/ItemArms/Preview/CollarCuffs.png deleted file mode 100644 index fcaff2a1b..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/CollarCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/CollarLeashHolding.png b/Assets/Female3DCG/ItemArms/Preview/CollarLeashHolding.png deleted file mode 100644 index ba1129447..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/CollarLeashHolding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/DuctTape.png b/Assets/Female3DCG/ItemArms/Preview/DuctTape.png deleted file mode 100644 index f86bb58bc..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/DuctTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/FourLimbsShackles.png b/Assets/Female3DCG/ItemArms/Preview/FourLimbsShackles.png deleted file mode 100644 index 074919f19..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/FourLimbsShackles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/FullBodyLeatherHarness.png b/Assets/Female3DCG/ItemArms/Preview/FullBodyLeatherHarness.png deleted file mode 100644 index a26aa6483..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/FullBodyLeatherHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/FullBodyShackles.png b/Assets/Female3DCG/ItemArms/Preview/FullBodyShackles.png deleted file mode 100644 index 1b23b9742..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/FullBodyShackles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/FullLatexSuit.png b/Assets/Female3DCG/ItemArms/Preview/FullLatexSuit.png deleted file mode 100644 index a444b1e35..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/FullLatexSuit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/FurStraitJacket.png b/Assets/Female3DCG/ItemArms/Preview/FurStraitJacket.png deleted file mode 100644 index f1c7f0745..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/FurStraitJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/FuturisticArmbinder.png b/Assets/Female3DCG/ItemArms/Preview/FuturisticArmbinder.png deleted file mode 100644 index 102e7057a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/FuturisticArmbinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/FuturisticCuffs.png b/Assets/Female3DCG/ItemArms/Preview/FuturisticCuffs.png deleted file mode 100644 index 8568866c3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/FuturisticCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/FuturisticStraitjacket.png b/Assets/Female3DCG/ItemArms/Preview/FuturisticStraitjacket.png deleted file mode 100644 index 93fc7c8a5..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/FuturisticStraitjacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/HempRope.png b/Assets/Female3DCG/ItemArms/Preview/HempRope.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/HempRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/HighSecurityStraitJacket.png b/Assets/Female3DCG/ItemArms/Preview/HighSecurityStraitJacket.png deleted file mode 100644 index 57487c21f..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/HighSecurityStraitJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/HogtieHempRope.png b/Assets/Female3DCG/ItemArms/Preview/HogtieHempRope.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/HogtieHempRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/InflatableStraightLeotard.png b/Assets/Female3DCG/ItemArms/Preview/InflatableStraightLeotard.png deleted file mode 100644 index 4202cf9eb..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/InflatableStraightLeotard.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/LatexArmbinder.png b/Assets/Female3DCG/ItemArms/Preview/LatexArmbinder.png deleted file mode 100644 index 78ae3efe3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/LatexArmbinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/LatexBoxtieLeotard.png b/Assets/Female3DCG/ItemArms/Preview/LatexBoxtieLeotard.png deleted file mode 100644 index ff165236b..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/LatexBoxtieLeotard.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/LatexButterflyLeotard.png b/Assets/Female3DCG/ItemArms/Preview/LatexButterflyLeotard.png deleted file mode 100644 index ec3d0c2a8..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/LatexButterflyLeotard.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/LatexSleevelessLeotard.png b/Assets/Female3DCG/ItemArms/Preview/LatexSleevelessLeotard.png deleted file mode 100644 index 02e9e2216..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/LatexSleevelessLeotard.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/LeatherArmSplints.png b/Assets/Female3DCG/ItemArms/Preview/LeatherArmSplints.png deleted file mode 100644 index f6853c465..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/LeatherArmSplints.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/LeatherArmbinder.png b/Assets/Female3DCG/ItemArms/Preview/LeatherArmbinder.png deleted file mode 100644 index 2573742c4..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/LeatherArmbinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/LeatherArmbinderStrap.png b/Assets/Female3DCG/ItemArms/Preview/LeatherArmbinderStrap.png deleted file mode 100644 index b24f974bf..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/LeatherArmbinderStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/LeatherArmbinderWrapStrap.png b/Assets/Female3DCG/ItemArms/Preview/LeatherArmbinderWrapStrap.png deleted file mode 100644 index be69f63b3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/LeatherArmbinderWrapStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/LeatherCuffs.png b/Assets/Female3DCG/ItemArms/Preview/LeatherCuffs.png deleted file mode 100644 index bf54fa79f..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/LeatherCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/LeatherCuffsKey.png b/Assets/Female3DCG/ItemArms/Preview/LeatherCuffsKey.png deleted file mode 100644 index d6ee8f12e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/LeatherCuffsKey.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/LeatherStraitJacket.png b/Assets/Female3DCG/ItemArms/Preview/LeatherStraitJacket.png deleted file mode 100644 index 26d636802..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/LeatherStraitJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/Manacles.png b/Assets/Female3DCG/ItemArms/Preview/Manacles.png deleted file mode 100644 index 9ce91babc..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/Manacles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/MedicalBedRestraints.png b/Assets/Female3DCG/ItemArms/Preview/MedicalBedRestraints.png deleted file mode 100644 index 850e69161..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/MedicalBedRestraints.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/MermaidSuit.png b/Assets/Female3DCG/ItemArms/Preview/MermaidSuit.png deleted file mode 100644 index c28e5e24c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/MermaidSuit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/MetalCuffs.png b/Assets/Female3DCG/ItemArms/Preview/MetalCuffs.png deleted file mode 100644 index 935f7c9fa..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/MetalCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/MittenChain1.png b/Assets/Female3DCG/ItemArms/Preview/MittenChain1.png deleted file mode 100644 index 9f739b183..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/MittenChain1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/NylonRope.png b/Assets/Female3DCG/ItemArms/Preview/NylonRope.png deleted file mode 100644 index d3c1fd4d2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/NylonRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/OrnateCuffs.png b/Assets/Female3DCG/ItemArms/Preview/OrnateCuffs.png deleted file mode 100644 index 73fe25b10..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/OrnateCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/PaddedMittens.png b/Assets/Female3DCG/ItemArms/Preview/PaddedMittens.png deleted file mode 100644 index 3cec6c1d6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/PaddedMittens.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/PaddedMittensHarness.png b/Assets/Female3DCG/ItemArms/Preview/PaddedMittensHarness.png deleted file mode 100644 index 3cec6c1d6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/PaddedMittensHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/PaddedMittensHarnessLocked.png b/Assets/Female3DCG/ItemArms/Preview/PaddedMittensHarnessLocked.png deleted file mode 100644 index 3cec6c1d6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/PaddedMittensHarnessLocked.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/PaddedMittensLocked.png b/Assets/Female3DCG/ItemArms/Preview/PaddedMittensLocked.png deleted file mode 100644 index 3cec6c1d6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/PaddedMittensLocked.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/PantyhoseBody.png b/Assets/Female3DCG/ItemArms/Preview/PantyhoseBody.png deleted file mode 100644 index 2dcd29d1b..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/PantyhoseBody.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/PantyhoseBodyOpen.png b/Assets/Female3DCG/ItemArms/Preview/PantyhoseBodyOpen.png deleted file mode 100644 index 0e3d9b59b..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/PantyhoseBodyOpen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/PawMittens.png b/Assets/Female3DCG/ItemArms/Preview/PawMittens.png deleted file mode 100644 index b3119ebcf..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/PawMittens.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/PetCrawler.png b/Assets/Female3DCG/ItemArms/Preview/PetCrawler.png deleted file mode 100644 index c320cf2f7..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/PetCrawler.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/Pillory.png b/Assets/Female3DCG/ItemArms/Preview/Pillory.png deleted file mode 100644 index 7914ee3b0..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/Pillory.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/PlasticWrap.png b/Assets/Female3DCG/ItemArms/Preview/PlasticWrap.png deleted file mode 100644 index f559dac76..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/PlasticWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/PrisonLockdownSuit.png b/Assets/Female3DCG/ItemArms/Preview/PrisonLockdownSuit.png deleted file mode 100644 index d1bf578b0..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/PrisonLockdownSuit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/Ribbons.png b/Assets/Female3DCG/ItemArms/Preview/Ribbons.png deleted file mode 100644 index 7d3f73b67..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/Ribbons.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/SeamlessLatexArmbinder.png b/Assets/Female3DCG/ItemArms/Preview/SeamlessLatexArmbinder.png deleted file mode 100644 index 68f815e3d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/SeamlessLatexArmbinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/SeamlessStraitDress.png b/Assets/Female3DCG/ItemArms/Preview/SeamlessStraitDress.png deleted file mode 100644 index 203797e6d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/SeamlessStraitDress.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/SeamlessStraitDressOpen.png b/Assets/Female3DCG/ItemArms/Preview/SeamlessStraitDressOpen.png deleted file mode 100644 index 7543ccec2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/SeamlessStraitDressOpen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/Slime.png b/Assets/Female3DCG/ItemArms/Preview/Slime.png deleted file mode 100644 index 2f1b835e0..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/Slime.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/SteelCuffs.png b/Assets/Female3DCG/ItemArms/Preview/SteelCuffs.png deleted file mode 100644 index c2aaae875..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/SteelCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/StraitDress.png b/Assets/Female3DCG/ItemArms/Preview/StraitDress.png deleted file mode 100644 index 25164811e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/StraitDress.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/StraitDressOpen.png b/Assets/Female3DCG/ItemArms/Preview/StraitDressOpen.png deleted file mode 100644 index e0336af6a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/StraitDressOpen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/StraitJacket.png b/Assets/Female3DCG/ItemArms/Preview/StraitJacket.png deleted file mode 100644 index c312f2b75..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/StraitJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/StraitLeotard.png b/Assets/Female3DCG/ItemArms/Preview/StraitLeotard.png deleted file mode 100644 index 6b4d045ff..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/StraitLeotard.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/StrictLeatherPetCrawler.png b/Assets/Female3DCG/ItemArms/Preview/StrictLeatherPetCrawler.png deleted file mode 100644 index b06e4d74a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/StrictLeatherPetCrawler.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/SturdyLeatherBelts.png b/Assets/Female3DCG/ItemArms/Preview/SturdyLeatherBelts.png deleted file mode 100644 index 8f6dd41d4..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/SturdyLeatherBelts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/Tentacles.png b/Assets/Female3DCG/ItemArms/Preview/Tentacles.png deleted file mode 100644 index 510ea7c8a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/Tentacles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/ThinLeatherStraps.png b/Assets/Female3DCG/ItemArms/Preview/ThinLeatherStraps.png deleted file mode 100644 index bd4544184..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/ThinLeatherStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/TightJacket.png b/Assets/Female3DCG/ItemArms/Preview/TightJacket.png deleted file mode 100644 index 12ddc35bd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/TightJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/TightJacketCrotch.png b/Assets/Female3DCG/ItemArms/Preview/TightJacketCrotch.png deleted file mode 100644 index 071d496b8..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/TightJacketCrotch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/TransportJacket.png b/Assets/Female3DCG/ItemArms/Preview/TransportJacket.png deleted file mode 100644 index cb42ec083..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/TransportJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/UnderBedBondageCuffs.png b/Assets/Female3DCG/ItemArms/Preview/UnderBedBondageCuffs.png deleted file mode 100644 index 87182f4a0..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/UnderBedBondageCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/Web.png b/Assets/Female3DCG/ItemArms/Preview/Web.png deleted file mode 100644 index 2245ac1f6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/Web.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/WoodenCuffs.png b/Assets/Female3DCG/ItemArms/Preview/WoodenCuffs.png deleted file mode 100644 index 7ac3a6734..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/WoodenCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/WrappedBlanket.png b/Assets/Female3DCG/ItemArms/Preview/WrappedBlanket.png deleted file mode 100644 index 683683cf6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/WrappedBlanket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/WristShackles.png b/Assets/Female3DCG/ItemArms/Preview/WristShackles.png deleted file mode 100644 index 58a677338..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/WristShackles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/Yoke.png b/Assets/Female3DCG/ItemArms/Preview/Yoke.png deleted file mode 100644 index 51ff9362d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/Yoke.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Preview/Zipties.png b/Assets/Female3DCG/ItemArms/Preview/Zipties.png deleted file mode 100644 index 781403069..000000000 Binary files a/Assets/Female3DCG/ItemArms/Preview/Zipties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuitAnkles_Lock.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuitAnkles_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuitAnkles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuitFull_Lock.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuitFull_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuitFull_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuitThighs_Lock.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuitThighs_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuitThighs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeAnkles_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeAnkles_Belts.png deleted file mode 100644 index 67bbe419a..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeAnkles_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeAnkles_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeAnkles_Suit.png deleted file mode 100644 index 51b22e45d..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeAnkles_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeFull_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeFull_Belts.png deleted file mode 100644 index 051b6e128..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeFull_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeFull_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeFull_Suit.png deleted file mode 100644 index 508b83c9e..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeFull_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeThighs_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeThighs_Belts.png deleted file mode 100644 index 53ef06cdb..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeThighs_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeThighs_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeThighs_Suit.png deleted file mode 100644 index 2a20ef935..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_LargeThighs_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Large_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Large_Belts.png deleted file mode 100644 index 4de5d9ce9..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Large_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Large_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Large_Suit.png deleted file mode 100644 index 5af36d486..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Lock.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalAnkles_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalAnkles_Belts.png deleted file mode 100644 index 668d44ee1..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalAnkles_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalAnkles_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalAnkles_Suit.png deleted file mode 100644 index 6c3d6d772..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalAnkles_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalFull_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalFull_Belts.png deleted file mode 100644 index 957fc9788..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalFull_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalFull_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalFull_Suit.png deleted file mode 100644 index e70c8a991..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalFull_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalThighs_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalThighs_Belts.png deleted file mode 100644 index 7e361cace..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalThighs_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalThighs_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalThighs_Suit.png deleted file mode 100644 index 5b6ff255e..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_NormalThighs_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Normal_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Normal_Belts.png deleted file mode 100644 index aa6c3b1b3..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Normal_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Normal_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Normal_Suit.png deleted file mode 100644 index d828cb0f0..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallAnkles_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallAnkles_Belts.png deleted file mode 100644 index 9fa43a7a5..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallAnkles_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallAnkles_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallAnkles_Suit.png deleted file mode 100644 index 7d98139e9..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallAnkles_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallFull_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallFull_Belts.png deleted file mode 100644 index 8db7e64cd..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallFull_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallFull_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallFull_Suit.png deleted file mode 100644 index 2d40a196e..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallFull_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallThighs_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallThighs_Belts.png deleted file mode 100644 index 27a49d69d..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallThighs_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallThighs_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallThighs_Suit.png deleted file mode 100644 index 171f50592..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_SmallThighs_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Small_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Small_Belts.png deleted file mode 100644 index 0bb97a21c..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Small_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Small_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Small_Suit.png deleted file mode 100644 index 48f150528..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeAnkles_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeAnkles_Belts.png deleted file mode 100644 index 8a40252b8..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeAnkles_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeAnkles_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeAnkles_Suit.png deleted file mode 100644 index db4c63733..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeAnkles_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeFull_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeFull_Belts.png deleted file mode 100644 index 3a64d9ddf..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeFull_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeFull_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeFull_Suit.png deleted file mode 100644 index af1204787..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeFull_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeThighs_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeThighs_Belts.png deleted file mode 100644 index 37221f09b..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeThighs_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeThighs_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeThighs_Suit.png deleted file mode 100644 index 7648b088a..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLargeThighs_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLarge_Belts.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLarge_Belts.png deleted file mode 100644 index bc28c94eb..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLarge_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLarge_Suit.png b/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLarge_Suit.png deleted file mode 100644 index a250ad111..000000000 Binary files a/Assets/Female3DCG/ItemArms/PrisonLockdownSuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Ribbons_Large.png b/Assets/Female3DCG/ItemArms/Ribbons_Large.png deleted file mode 100644 index 3001613ac..000000000 Binary files a/Assets/Female3DCG/ItemArms/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Ribbons_LargeHeavy.png b/Assets/Female3DCG/ItemArms/Ribbons_LargeHeavy.png deleted file mode 100644 index c7f4eaffb..000000000 Binary files a/Assets/Female3DCG/ItemArms/Ribbons_LargeHeavy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Ribbons_Normal.png b/Assets/Female3DCG/ItemArms/Ribbons_Normal.png deleted file mode 100644 index 3712a9436..000000000 Binary files a/Assets/Female3DCG/ItemArms/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Ribbons_NormalHeavy.png b/Assets/Female3DCG/ItemArms/Ribbons_NormalHeavy.png deleted file mode 100644 index 0936e21c9..000000000 Binary files a/Assets/Female3DCG/ItemArms/Ribbons_NormalHeavy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Ribbons_Small.png b/Assets/Female3DCG/ItemArms/Ribbons_Small.png deleted file mode 100644 index 39610668d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Ribbons_SmallHeavy.png b/Assets/Female3DCG/ItemArms/Ribbons_SmallHeavy.png deleted file mode 100644 index f58a3d9eb..000000000 Binary files a/Assets/Female3DCG/ItemArms/Ribbons_SmallHeavy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Ribbons_XLarge.png b/Assets/Female3DCG/ItemArms/Ribbons_XLarge.png deleted file mode 100644 index 9cec7d07d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Ribbons_XLargeHeavy.png b/Assets/Female3DCG/ItemArms/Ribbons_XLargeHeavy.png deleted file mode 100644 index 0d6cbb184..000000000 Binary files a/Assets/Female3DCG/ItemArms/Ribbons_XLargeHeavy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Large.png b/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Large.png deleted file mode 100644 index e1e43cdd2..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Lock.png b/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Normal.png b/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Normal.png deleted file mode 100644 index e1e43cdd2..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Small.png b/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Small.png deleted file mode 100644 index e1e43cdd2..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_XLarge.png b/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_XLarge.png deleted file mode 100644 index e1e43cdd2..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessLatexArmbinder_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Large.png b/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Large.png deleted file mode 100644 index fe10cbecb..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Lock.png b/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Normal.png b/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Normal.png deleted file mode 100644 index 9cddacfb3..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Small.png b/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Small.png deleted file mode 100644 index 6def4d15e..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_XLarge.png b/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_XLarge.png deleted file mode 100644 index 4ef6fcf32..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessStraitDressOpen_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Large.png b/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Large.png deleted file mode 100644 index 8b26cf6bf..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Lock.png b/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Normal.png b/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Normal.png deleted file mode 100644 index b67d905ba..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Small.png b/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Small.png deleted file mode 100644 index 12475dd2e..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessStraitDress_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SeamlessStraitDress_XLarge.png b/Assets/Female3DCG/ItemArms/SeamlessStraitDress_XLarge.png deleted file mode 100644 index 243eeb31c..000000000 Binary files a/Assets/Female3DCG/ItemArms/SeamlessStraitDress_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Slime_BaseOne.png b/Assets/Female3DCG/ItemArms/Slime_BaseOne.png deleted file mode 100644 index 7e5547fb3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Slime_BaseOne.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Slime_BaseTwo.png b/Assets/Female3DCG/ItemArms/Slime_BaseTwo.png deleted file mode 100644 index 69ff04bca..000000000 Binary files a/Assets/Female3DCG/ItemArms/Slime_BaseTwo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Slime_GirlBack.png b/Assets/Female3DCG/ItemArms/Slime_GirlBack.png deleted file mode 100644 index c7cfb1657..000000000 Binary files a/Assets/Female3DCG/ItemArms/Slime_GirlBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Slime_GirlFeatures.png b/Assets/Female3DCG/ItemArms/Slime_GirlFeatures.png deleted file mode 100644 index 183a7eca1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Slime_GirlFeatures.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Slime_GirlFront.png b/Assets/Female3DCG/ItemArms/Slime_GirlFront.png deleted file mode 100644 index 2af23e803..000000000 Binary files a/Assets/Female3DCG/ItemArms/Slime_GirlFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SteelCuffs_Large.png b/Assets/Female3DCG/ItemArms/SteelCuffs_Large.png deleted file mode 100644 index 872e874f4..000000000 Binary files a/Assets/Female3DCG/ItemArms/SteelCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SteelCuffs_Normal.png b/Assets/Female3DCG/ItemArms/SteelCuffs_Normal.png deleted file mode 100644 index 750d5cc7f..000000000 Binary files a/Assets/Female3DCG/ItemArms/SteelCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SteelCuffs_Small.png b/Assets/Female3DCG/ItemArms/SteelCuffs_Small.png deleted file mode 100644 index 750d5cc7f..000000000 Binary files a/Assets/Female3DCG/ItemArms/SteelCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SteelCuffs_XLarge.png b/Assets/Female3DCG/ItemArms/SteelCuffs_XLarge.png deleted file mode 100644 index 216963ec4..000000000 Binary files a/Assets/Female3DCG/ItemArms/SteelCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDressOpen_Large_Belts.png b/Assets/Female3DCG/ItemArms/StraitDressOpen_Large_Belts.png deleted file mode 100644 index 9605768ae..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDressOpen_Large_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDressOpen_Large_Latex.png b/Assets/Female3DCG/ItemArms/StraitDressOpen_Large_Latex.png deleted file mode 100644 index fe10cbecb..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDressOpen_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDressOpen_Lock.png b/Assets/Female3DCG/ItemArms/StraitDressOpen_Lock.png deleted file mode 100644 index b5b39e6bd..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDressOpen_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDressOpen_Normal_Belts.png b/Assets/Female3DCG/ItemArms/StraitDressOpen_Normal_Belts.png deleted file mode 100644 index e5edfbc2f..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDressOpen_Normal_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDressOpen_Normal_Latex.png b/Assets/Female3DCG/ItemArms/StraitDressOpen_Normal_Latex.png deleted file mode 100644 index 9cddacfb3..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDressOpen_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDressOpen_Small_Belts.png b/Assets/Female3DCG/ItemArms/StraitDressOpen_Small_Belts.png deleted file mode 100644 index e1d45ff30..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDressOpen_Small_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDressOpen_Small_Latex.png b/Assets/Female3DCG/ItemArms/StraitDressOpen_Small_Latex.png deleted file mode 100644 index 6def4d15e..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDressOpen_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDressOpen_XLarge_Belts.png b/Assets/Female3DCG/ItemArms/StraitDressOpen_XLarge_Belts.png deleted file mode 100644 index f68d73869..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDressOpen_XLarge_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDressOpen_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/StraitDressOpen_XLarge_Latex.png deleted file mode 100644 index 4ef6fcf32..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDressOpen_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDress_Large_Belts.png b/Assets/Female3DCG/ItemArms/StraitDress_Large_Belts.png deleted file mode 100644 index f02d449da..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDress_Large_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDress_Large_Latex.png b/Assets/Female3DCG/ItemArms/StraitDress_Large_Latex.png deleted file mode 100644 index 8b26cf6bf..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDress_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDress_Lock.png b/Assets/Female3DCG/ItemArms/StraitDress_Lock.png deleted file mode 100644 index b5b39e6bd..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDress_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDress_Normal_Belts.png b/Assets/Female3DCG/ItemArms/StraitDress_Normal_Belts.png deleted file mode 100644 index 4a3e74ed7..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDress_Normal_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDress_Normal_Latex.png b/Assets/Female3DCG/ItemArms/StraitDress_Normal_Latex.png deleted file mode 100644 index b67d905ba..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDress_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDress_Small_Belts.png b/Assets/Female3DCG/ItemArms/StraitDress_Small_Belts.png deleted file mode 100644 index 57df3603c..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDress_Small_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDress_Small_Latex.png b/Assets/Female3DCG/ItemArms/StraitDress_Small_Latex.png deleted file mode 100644 index 12475dd2e..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDress_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDress_XLarge_Belts.png b/Assets/Female3DCG/ItemArms/StraitDress_XLarge_Belts.png deleted file mode 100644 index 4f15631df..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDress_XLarge_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitDress_XLarge_Latex.png b/Assets/Female3DCG/ItemArms/StraitDress_XLarge_Latex.png deleted file mode 100644 index 243eeb31c..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitDress_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitJacket_Large.png b/Assets/Female3DCG/ItemArms/StraitJacket_Large.png deleted file mode 100644 index 31d972b9f..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitJacket_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitJacket_Lock.png b/Assets/Female3DCG/ItemArms/StraitJacket_Lock.png deleted file mode 100644 index 1ca54fdec..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitJacket_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitJacket_Normal.png b/Assets/Female3DCG/ItemArms/StraitJacket_Normal.png deleted file mode 100644 index 26ac211ec..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitJacket_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitJacket_Small.png b/Assets/Female3DCG/ItemArms/StraitJacket_Small.png deleted file mode 100644 index 62df6a60e..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitJacket_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitJacket_XLarge.png b/Assets/Female3DCG/ItemArms/StraitJacket_XLarge.png deleted file mode 100644 index 61d25eb7e..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitJacket_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_Large_Gloves.png b/Assets/Female3DCG/ItemArms/StraitLeotard_Large_Gloves.png deleted file mode 100644 index 2286f18c5..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_Large_Lower.png b/Assets/Female3DCG/ItemArms/StraitLeotard_Large_Lower.png deleted file mode 100644 index 779889c74..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_Large_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_Large_Upper.png b/Assets/Female3DCG/ItemArms/StraitLeotard_Large_Upper.png deleted file mode 100644 index 0695fcb80..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_Large_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_Lock.png b/Assets/Female3DCG/ItemArms/StraitLeotard_Lock.png deleted file mode 100644 index da7a5bdd5..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_Lock_2.png b/Assets/Female3DCG/ItemArms/StraitLeotard_Lock_2.png deleted file mode 100644 index da7a5bdd5..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_Lock_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_Normal_Gloves.png b/Assets/Female3DCG/ItemArms/StraitLeotard_Normal_Gloves.png deleted file mode 100644 index 020127256..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_Normal_Lower.png b/Assets/Female3DCG/ItemArms/StraitLeotard_Normal_Lower.png deleted file mode 100644 index f9f1b7187..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_Normal_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_Normal_Upper.png b/Assets/Female3DCG/ItemArms/StraitLeotard_Normal_Upper.png deleted file mode 100644 index 7b82c8bd1..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_Normal_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_Small_Gloves.png b/Assets/Female3DCG/ItemArms/StraitLeotard_Small_Gloves.png deleted file mode 100644 index f6e8b0518..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_Small_Lower.png b/Assets/Female3DCG/ItemArms/StraitLeotard_Small_Lower.png deleted file mode 100644 index b06117225..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_Small_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_Small_Upper.png b/Assets/Female3DCG/ItemArms/StraitLeotard_Small_Upper.png deleted file mode 100644 index 0b3a71023..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_Small_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_XLarge_Gloves.png b/Assets/Female3DCG/ItemArms/StraitLeotard_XLarge_Gloves.png deleted file mode 100644 index 6d7f9badf..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_XLarge_Lower.png b/Assets/Female3DCG/ItemArms/StraitLeotard_XLarge_Lower.png deleted file mode 100644 index a249db9ba..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_XLarge_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/StraitLeotard_XLarge_Upper.png b/Assets/Female3DCG/ItemArms/StraitLeotard_XLarge_Upper.png deleted file mode 100644 index 6ae6fd7d4..000000000 Binary files a/Assets/Female3DCG/ItemArms/StraitLeotard_XLarge_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBeltsThree_Lock.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBeltsThree_Lock.png deleted file mode 100644 index 3cfc36028..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBeltsThree_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBeltsTwo_Lock.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBeltsTwo_Lock.png deleted file mode 100644 index 78e8a2dea..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBeltsTwo_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_LowerTorsoBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_LowerTorsoBelt.png deleted file mode 100644 index 1e7c5ebd4..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_LowerTorsoBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_LowerTorsoMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_LowerTorsoMetal.png deleted file mode 100644 index 80d71244d..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_LowerTorsoMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_UpperTorsoBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_UpperTorsoBelt.png deleted file mode 100644 index cd13ae884..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_UpperTorsoBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_UpperTorsoMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_UpperTorsoMetal.png deleted file mode 100644 index b4f1cb1cf..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_UpperTorsoMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_WaistBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_WaistBelt.png deleted file mode 100644 index 3dc57faf2..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_WaistBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_WaistMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_WaistMetal.png deleted file mode 100644 index 5ac2a4c95..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Large_WaistMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Lock.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Lock.png deleted file mode 100644 index a05f7d731..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_LowerTorsoBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_LowerTorsoBelt.png deleted file mode 100644 index dfc543a3f..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_LowerTorsoBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_LowerTorsoMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_LowerTorsoMetal.png deleted file mode 100644 index 1928cdc01..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_LowerTorsoMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_UpperTorsoBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_UpperTorsoBelt.png deleted file mode 100644 index a6e688f41..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_UpperTorsoBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_UpperTorsoMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_UpperTorsoMetal.png deleted file mode 100644 index f0680c13c..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_UpperTorsoMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_WaistBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_WaistBelt.png deleted file mode 100644 index 5ab4d203e..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_WaistBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_WaistMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_WaistMetal.png deleted file mode 100644 index b27fccd24..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Normal_WaistMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_LowerTorsoBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_LowerTorsoBelt.png deleted file mode 100644 index 55704a87e..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_LowerTorsoBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_LowerTorsoMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_LowerTorsoMetal.png deleted file mode 100644 index 7fe17bc64..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_LowerTorsoMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_UpperTorsoBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_UpperTorsoBelt.png deleted file mode 100644 index 54bf412e2..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_UpperTorsoBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_UpperTorsoMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_UpperTorsoMetal.png deleted file mode 100644 index 52e986233..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_UpperTorsoMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_WaistBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_WaistBelt.png deleted file mode 100644 index ec01bcd28..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_WaistBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_WaistMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_WaistMetal.png deleted file mode 100644 index 111bf8e4b..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_Small_WaistMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_LowerTorsoBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_LowerTorsoBelt.png deleted file mode 100644 index 47e189ece..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_LowerTorsoBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_LowerTorsoMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_LowerTorsoMetal.png deleted file mode 100644 index f46929040..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_LowerTorsoMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_UpperTorsoBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_UpperTorsoBelt.png deleted file mode 100644 index 6569a9c96..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_UpperTorsoBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_UpperTorsoMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_UpperTorsoMetal.png deleted file mode 100644 index df9057cc3..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_UpperTorsoMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_WaistBelt.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_WaistBelt.png deleted file mode 100644 index 8ec27be26..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_WaistBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_WaistMetal.png b/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_WaistMetal.png deleted file mode 100644 index 4ced854fa..000000000 Binary files a/Assets/Female3DCG/ItemArms/SturdyLeatherBelts_XLarge_WaistMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShacklesOverhead_Lock.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShacklesOverhead_Lock.png deleted file mode 100644 index 8ebf0c305..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShacklesOverhead_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_LargeOverhead_Chain.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_LargeOverhead_Chain.png deleted file mode 100644 index c8ef25941..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_LargeOverhead_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_LargeOverhead_Cuffs.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_LargeOverhead_Cuffs.png deleted file mode 100644 index 43295a768..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_LargeOverhead_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Large_Chain.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Large_Chain.png deleted file mode 100644 index 84b4e2369..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Large_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Large_Cuffs.png deleted file mode 100644 index 1fcaaa65c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Lock.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Lock.png deleted file mode 100644 index b13a28381..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_NormalOverhead_Chain.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_NormalOverhead_Chain.png deleted file mode 100644 index c8ef25941..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_NormalOverhead_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_NormalOverhead_Cuffs.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_NormalOverhead_Cuffs.png deleted file mode 100644 index afd647562..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_NormalOverhead_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Normal_Chain.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Normal_Chain.png deleted file mode 100644 index 84b4e2369..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Normal_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Normal_Cuffs.png deleted file mode 100644 index 1fcaaa65c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_SmallOverhead_Chain.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_SmallOverhead_Chain.png deleted file mode 100644 index c8ef25941..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_SmallOverhead_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_SmallOverhead_Cuffs.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_SmallOverhead_Cuffs.png deleted file mode 100644 index afd647562..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_SmallOverhead_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Small_Chain.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Small_Chain.png deleted file mode 100644 index 84b4e2369..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Small_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Small_Cuffs.png deleted file mode 100644 index 1fcaaa65c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLargeOverhead_Chain.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLargeOverhead_Chain.png deleted file mode 100644 index c8ef25941..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLargeOverhead_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLargeOverhead_Cuffs.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLargeOverhead_Cuffs.png deleted file mode 100644 index 43295a768..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLargeOverhead_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLarge_Chain.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLarge_Chain.png deleted file mode 100644 index 84b4e2369..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLarge_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLarge_Cuffs.png deleted file mode 100644 index 1fcaaa65c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/CeilingShackles_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_Large.png b/Assets/Female3DCG/ItemArms/Suspension/Web_Large.png deleted file mode 100644 index 97d969a61..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_LargeCocooned.png b/Assets/Female3DCG/ItemArms/Suspension/Web_LargeCocooned.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_LargeCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_LargeKneelingSuspended.png b/Assets/Female3DCG/ItemArms/Suspension/Web_LargeKneelingSuspended.png deleted file mode 100644 index 8cc74de44..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_LargeKneelingSuspended.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_LargeSuspended.png b/Assets/Female3DCG/ItemArms/Suspension/Web_LargeSuspended.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_LargeSuspended.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_LargeWrapped.png b/Assets/Female3DCG/ItemArms/Suspension/Web_LargeWrapped.png deleted file mode 100644 index cff475292..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_LargeWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_Normal.png b/Assets/Female3DCG/ItemArms/Suspension/Web_Normal.png deleted file mode 100644 index 97d969a61..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_NormalCocooned.png b/Assets/Female3DCG/ItemArms/Suspension/Web_NormalCocooned.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_NormalCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_NormalKneelingSuspended.png b/Assets/Female3DCG/ItemArms/Suspension/Web_NormalKneelingSuspended.png deleted file mode 100644 index 8cc74de44..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_NormalKneelingSuspended.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_NormalSuspended.png b/Assets/Female3DCG/ItemArms/Suspension/Web_NormalSuspended.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_NormalSuspended.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_NormalWrapped.png b/Assets/Female3DCG/ItemArms/Suspension/Web_NormalWrapped.png deleted file mode 100644 index cff475292..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_NormalWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_Small.png b/Assets/Female3DCG/ItemArms/Suspension/Web_Small.png deleted file mode 100644 index 97d969a61..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_SmallCocooned.png b/Assets/Female3DCG/ItemArms/Suspension/Web_SmallCocooned.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_SmallCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_SmallKneelingSuspended.png b/Assets/Female3DCG/ItemArms/Suspension/Web_SmallKneelingSuspended.png deleted file mode 100644 index 8cc74de44..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_SmallKneelingSuspended.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_SmallSuspended.png b/Assets/Female3DCG/ItemArms/Suspension/Web_SmallSuspended.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_SmallSuspended.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_SmallWrapped.png b/Assets/Female3DCG/ItemArms/Suspension/Web_SmallWrapped.png deleted file mode 100644 index cff475292..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_SmallWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_XLarge.png b/Assets/Female3DCG/ItemArms/Suspension/Web_XLarge.png deleted file mode 100644 index 97d969a61..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeCocooned.png b/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeCocooned.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeKneelingSuspended.png b/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeKneelingSuspended.png deleted file mode 100644 index 8cc74de44..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeKneelingSuspended.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeSuspended.png b/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeSuspended.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeSuspended.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeWrapped.png b/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeWrapped.png deleted file mode 100644 index cff475292..000000000 Binary files a/Assets/Female3DCG/ItemArms/Suspension/Web_XLargeWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_Large.png b/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_Large.png deleted file mode 100644 index 9bbe55b69..000000000 Binary files a/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_Normal.png b/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_Normal.png deleted file mode 100644 index 9bbe55b69..000000000 Binary files a/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_Small.png b/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_Small.png deleted file mode 100644 index 9bbe55b69..000000000 Binary files a/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_XLarge.png b/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_XLarge.png deleted file mode 100644 index 9bbe55b69..000000000 Binary files a/Assets/Female3DCG/ItemArms/TapedHands/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Tentacles_Large_Inner.png b/Assets/Female3DCG/ItemArms/Tentacles_Large_Inner.png deleted file mode 100644 index 39453b213..000000000 Binary files a/Assets/Female3DCG/ItemArms/Tentacles_Large_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Tentacles_Large_Outer.png b/Assets/Female3DCG/ItemArms/Tentacles_Large_Outer.png deleted file mode 100644 index 3a6762c29..000000000 Binary files a/Assets/Female3DCG/ItemArms/Tentacles_Large_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Tentacles_Normal_Inner.png b/Assets/Female3DCG/ItemArms/Tentacles_Normal_Inner.png deleted file mode 100644 index 0f461b343..000000000 Binary files a/Assets/Female3DCG/ItemArms/Tentacles_Normal_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Tentacles_Normal_Outer.png b/Assets/Female3DCG/ItemArms/Tentacles_Normal_Outer.png deleted file mode 100644 index f9d0267d0..000000000 Binary files a/Assets/Female3DCG/ItemArms/Tentacles_Normal_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Tentacles_Shine.png b/Assets/Female3DCG/ItemArms/Tentacles_Shine.png deleted file mode 100644 index 9cb7ff915..000000000 Binary files a/Assets/Female3DCG/ItemArms/Tentacles_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Tentacles_Small_Inner.png b/Assets/Female3DCG/ItemArms/Tentacles_Small_Inner.png deleted file mode 100644 index fb0c9f869..000000000 Binary files a/Assets/Female3DCG/ItemArms/Tentacles_Small_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Tentacles_Small_Outer.png b/Assets/Female3DCG/ItemArms/Tentacles_Small_Outer.png deleted file mode 100644 index 444fe1322..000000000 Binary files a/Assets/Female3DCG/ItemArms/Tentacles_Small_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Tentacles_Sucker.png b/Assets/Female3DCG/ItemArms/Tentacles_Sucker.png deleted file mode 100644 index 9cfe1c1a3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Tentacles_Sucker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Tentacles_XLarge_Inner.png b/Assets/Female3DCG/ItemArms/Tentacles_XLarge_Inner.png deleted file mode 100644 index 72c02a818..000000000 Binary files a/Assets/Female3DCG/ItemArms/Tentacles_XLarge_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Tentacles_XLarge_Outer.png b/Assets/Female3DCG/ItemArms/Tentacles_XLarge_Outer.png deleted file mode 100644 index 881b95199..000000000 Binary files a/Assets/Female3DCG/ItemArms/Tentacles_XLarge_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeHogtie_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeHogtie_Buckle.png deleted file mode 100644 index 741d9d374..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeHogtie_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeHogtie_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeHogtie_Strap.png deleted file mode 100644 index 2745f7dbe..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeHogtie_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbowHarness_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbowHarness_Buckle.png deleted file mode 100644 index 0b6d3d8ec..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbowHarness_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbowHarness_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbowHarness_Locks.png deleted file mode 100644 index c81076719..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbowHarness_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbowHarness_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbowHarness_Strap.png deleted file mode 100644 index ebc94ba29..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbowHarness_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbow_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbow_Buckle.png deleted file mode 100644 index 2f870d1fc..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbow_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbow_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbow_Locks.png deleted file mode 100644 index 5df8cbc5f..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbow_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbow_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbow_Strap.png deleted file mode 100644 index efca5bcf4..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWristElbow_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWrist_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWrist_Buckle.png deleted file mode 100644 index 0f230f5a7..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWrist_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWrist_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWrist_Locks.png deleted file mode 100644 index 9b45c5a0b..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWrist_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWrist_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWrist_Strap.png deleted file mode 100644 index 419b23f8c..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_LargeWrist_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Large_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Large_Buckle.png deleted file mode 100644 index 60cadb1c2..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Large_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Large_Locks.png deleted file mode 100644 index 07c20cfef..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Large_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Large_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Large_Strap.png deleted file mode 100644 index 96d20a80a..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Large_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalHogtie_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalHogtie_Buckle.png deleted file mode 100644 index b2f0a4f28..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalHogtie_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalHogtie_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalHogtie_Strap.png deleted file mode 100644 index 93d025ad1..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalHogtie_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbowHarness_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbowHarness_Buckle.png deleted file mode 100644 index 0b6d3d8ec..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbowHarness_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbowHarness_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbowHarness_Locks.png deleted file mode 100644 index e5423e1d0..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbowHarness_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbowHarness_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbowHarness_Strap.png deleted file mode 100644 index 3b19edd94..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbowHarness_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbow_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbow_Buckle.png deleted file mode 100644 index d41bb833a..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbow_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbow_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbow_Locks.png deleted file mode 100644 index 02f8a366a..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbow_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbow_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbow_Strap.png deleted file mode 100644 index ec12eef67..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWristElbow_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWrist_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWrist_Buckle.png deleted file mode 100644 index 5009e87a7..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWrist_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWrist_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWrist_Locks.png deleted file mode 100644 index 5e6e86514..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWrist_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWrist_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWrist_Strap.png deleted file mode 100644 index 5e3f2f8eb..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_NormalWrist_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Normal_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Normal_Buckle.png deleted file mode 100644 index ea7bc7595..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Normal_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Normal_Locks.png deleted file mode 100644 index 2150f13e7..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Normal_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Normal_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Normal_Strap.png deleted file mode 100644 index 072e98c19..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Normal_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallHogtie_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallHogtie_Buckle.png deleted file mode 100644 index 1de07c300..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallHogtie_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallHogtie_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallHogtie_Strap.png deleted file mode 100644 index c5c3e1ac8..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallHogtie_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness.png deleted file mode 100644 index c26af0b1f..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness_Buckle.png deleted file mode 100644 index 0b6d3d8ec..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness_Locks.png deleted file mode 100644 index 75bb09f47..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness_Strap.png deleted file mode 100644 index a8e19ef24..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbowHarness_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbow_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbow_Buckle.png deleted file mode 100644 index 9c434c082..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbow_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbow_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbow_Locks.png deleted file mode 100644 index 480ac43cc..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbow_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbow_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbow_Strap.png deleted file mode 100644 index 14f661dc2..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWristElbow_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWrist_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWrist_Buckle.png deleted file mode 100644 index 7213b9129..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWrist_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWrist_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWrist_Locks.png deleted file mode 100644 index aca038065..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWrist_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWrist_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWrist_Strap.png deleted file mode 100644 index 1a22f3131..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_SmallWrist_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Small_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Small_Buckle.png deleted file mode 100644 index 75c91ebc1..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Small_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Small_Locks.png deleted file mode 100644 index d2ff74bf4..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Small_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Small_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Small_Strap.png deleted file mode 100644 index 95a730562..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_Small_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeHogtie_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeHogtie_Buckle.png deleted file mode 100644 index bd1afe0dd..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeHogtie_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeHogtie_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeHogtie_Strap.png deleted file mode 100644 index d2fc52720..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeHogtie_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbowHarness_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbowHarness_Buckle.png deleted file mode 100644 index 0b6d3d8ec..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbowHarness_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbowHarness_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbowHarness_Locks.png deleted file mode 100644 index 92d096c3a..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbowHarness_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbowHarness_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbowHarness_Strap.png deleted file mode 100644 index a8e19ef24..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbowHarness_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbow_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbow_Buckle.png deleted file mode 100644 index 5601f13d2..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbow_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbow_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbow_Locks.png deleted file mode 100644 index 8dbdede07..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbow_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbow_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbow_Strap.png deleted file mode 100644 index 52a92d4c6..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWristElbow_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWrist_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWrist_Buckle.png deleted file mode 100644 index 954700cde..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWrist_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWrist_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWrist_Locks.png deleted file mode 100644 index d2d1c0ccc..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWrist_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWrist_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWrist_Strap.png deleted file mode 100644 index c728d26cb..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLargeWrist_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLarge_Buckle.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLarge_Buckle.png deleted file mode 100644 index f1c66198d..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLarge_Locks.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLarge_Locks.png deleted file mode 100644 index b42988752..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLarge_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLarge_Strap.png b/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLarge_Strap.png deleted file mode 100644 index 527f207d8..000000000 Binary files a/Assets/Female3DCG/ItemArms/ThinLeatherStraps_XLarge_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotchExtraPadding_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketCrotchExtraPadding_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotchExtraPadding_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotchFullJacket_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketCrotchFullJacket_Lock.png deleted file mode 100644 index f2d83e309..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotchFullJacket_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotchLiningStraps_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketCrotchLiningStraps_Lock.png deleted file mode 100644 index f2d83e309..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotchLiningStraps_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotchPaddedLining_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketCrotchPaddedLining_Lock.png deleted file mode 100644 index f2d83e309..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotchPaddedLining_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotchPulledLining_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketCrotchPulledLining_Lock.png deleted file mode 100644 index f2d83e309..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotchPulledLining_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotchPulledPadding_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketCrotchPulledPadding_Lock.png deleted file mode 100644 index f2d83e309..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotchPulledPadding_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotchPulledStraps_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketCrotchPulledStraps_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotchPulledStraps_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_Large.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_Large.png deleted file mode 100644 index 0ad888809..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargeExtraPadding.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargeExtraPadding.png deleted file mode 100644 index 4537c1758..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargeExtraPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargeFullJacket.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargeFullJacket.png deleted file mode 100644 index 67ea6b46e..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargeFullJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargeLiningStraps.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargeLiningStraps.png deleted file mode 100644 index 2c95ddaea..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargeLiningStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePaddedLining.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePaddedLining.png deleted file mode 100644 index 83159d249..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePaddedLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePulledLining.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePulledLining.png deleted file mode 100644 index 69a73b243..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePulledLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePulledPadding.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePulledPadding.png deleted file mode 100644 index 0a2c24afa..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePulledPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePulledStraps.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePulledStraps.png deleted file mode 100644 index 405d809f6..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_LargePulledStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_Normal.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_Normal.png deleted file mode 100644 index 55bec3157..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalExtraPadding.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalExtraPadding.png deleted file mode 100644 index 8a96d72ef..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalExtraPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalFullJacket.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalFullJacket.png deleted file mode 100644 index d499e646f..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalFullJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalLiningStraps.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalLiningStraps.png deleted file mode 100644 index 3157ccade..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalLiningStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPaddedLining.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPaddedLining.png deleted file mode 100644 index ee36a2df3..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPaddedLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPulledLining.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPulledLining.png deleted file mode 100644 index c6182313d..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPulledLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPulledPadding.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPulledPadding.png deleted file mode 100644 index 04d1f52e3..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPulledPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPulledStraps.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPulledStraps.png deleted file mode 100644 index 93a65a638..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_NormalPulledStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_Small.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_Small.png deleted file mode 100644 index 0a51dae0e..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallExtraPadding.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallExtraPadding.png deleted file mode 100644 index 981067e30..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallExtraPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallFullJacket.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallFullJacket.png deleted file mode 100644 index 76ccaba65..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallFullJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallLiningStraps.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallLiningStraps.png deleted file mode 100644 index 0c0b1de2e..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallLiningStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPaddedLining.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPaddedLining.png deleted file mode 100644 index 34ed7fd5a..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPaddedLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPulledLining.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPulledLining.png deleted file mode 100644 index 3d19cc975..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPulledLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPulledPadding.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPulledPadding.png deleted file mode 100644 index 574bd40a4..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPulledPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPulledStraps.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPulledStraps.png deleted file mode 100644 index 49ea397e9..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_SmallPulledStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLarge.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLarge.png deleted file mode 100644 index 6d1a3a21a..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargeExtraPadding.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargeExtraPadding.png deleted file mode 100644 index 8ec83280c..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargeExtraPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargeFullJacket.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargeFullJacket.png deleted file mode 100644 index 121538285..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargeFullJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargeLiningStraps.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargeLiningStraps.png deleted file mode 100644 index e4add701b..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargeLiningStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePaddedLining.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePaddedLining.png deleted file mode 100644 index 10c2bb175..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePaddedLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePulledLining.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePulledLining.png deleted file mode 100644 index 68d1968dd..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePulledLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePulledPadding.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePulledPadding.png deleted file mode 100644 index 05b65bdfd..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePulledPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePulledStraps.png b/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePulledStraps.png deleted file mode 100644 index de9f314be..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketCrotch_XLargePulledStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketExtraPadding_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketExtraPadding_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketExtraPadding_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketFullJacket_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketFullJacket_Lock.png deleted file mode 100644 index f2d83e309..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketFullJacket_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketLiningStraps_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketLiningStraps_Lock.png deleted file mode 100644 index f2d83e309..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketLiningStraps_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketPaddedLining_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketPaddedLining_Lock.png deleted file mode 100644 index f2d83e309..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketPaddedLining_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketPulledLining_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketPulledLining_Lock.png deleted file mode 100644 index f2d83e309..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketPulledLining_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketPulledPadding_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketPulledPadding_Lock.png deleted file mode 100644 index f2d83e309..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketPulledPadding_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacketPulledStraps_Lock.png b/Assets/Female3DCG/ItemArms/TightJacketPulledStraps_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacketPulledStraps_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_Large.png b/Assets/Female3DCG/ItemArms/TightJacket_Large.png deleted file mode 100644 index 68ed9547b..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_LargeExtraPadding.png b/Assets/Female3DCG/ItemArms/TightJacket_LargeExtraPadding.png deleted file mode 100644 index a881957c8..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_LargeExtraPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_LargeFullJacket.png b/Assets/Female3DCG/ItemArms/TightJacket_LargeFullJacket.png deleted file mode 100644 index 9336819b4..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_LargeFullJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_LargeLiningStraps.png b/Assets/Female3DCG/ItemArms/TightJacket_LargeLiningStraps.png deleted file mode 100644 index 4dc8a9d80..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_LargeLiningStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_LargePaddedLining.png b/Assets/Female3DCG/ItemArms/TightJacket_LargePaddedLining.png deleted file mode 100644 index e3ff21d31..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_LargePaddedLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_LargePulledLining.png b/Assets/Female3DCG/ItemArms/TightJacket_LargePulledLining.png deleted file mode 100644 index be0381c1f..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_LargePulledLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_LargePulledPadding.png b/Assets/Female3DCG/ItemArms/TightJacket_LargePulledPadding.png deleted file mode 100644 index ea13eb8e9..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_LargePulledPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_LargePulledStraps.png b/Assets/Female3DCG/ItemArms/TightJacket_LargePulledStraps.png deleted file mode 100644 index e8a14ec98..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_LargePulledStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_Lock.png b/Assets/Female3DCG/ItemArms/TightJacket_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_Normal.png b/Assets/Female3DCG/ItemArms/TightJacket_Normal.png deleted file mode 100644 index 2985c4ee1..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_NormalExtraPadding.png b/Assets/Female3DCG/ItemArms/TightJacket_NormalExtraPadding.png deleted file mode 100644 index 9758c0030..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_NormalExtraPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_NormalFullJacket.png b/Assets/Female3DCG/ItemArms/TightJacket_NormalFullJacket.png deleted file mode 100644 index 3a6631920..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_NormalFullJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_NormalLiningStraps.png b/Assets/Female3DCG/ItemArms/TightJacket_NormalLiningStraps.png deleted file mode 100644 index e6e057b3d..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_NormalLiningStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_NormalPaddedLining.png b/Assets/Female3DCG/ItemArms/TightJacket_NormalPaddedLining.png deleted file mode 100644 index 97569d4ae..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_NormalPaddedLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_NormalPulledLining.png b/Assets/Female3DCG/ItemArms/TightJacket_NormalPulledLining.png deleted file mode 100644 index 063796cb3..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_NormalPulledLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_NormalPulledPadding.png b/Assets/Female3DCG/ItemArms/TightJacket_NormalPulledPadding.png deleted file mode 100644 index 5482bb159..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_NormalPulledPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_NormalPulledStraps.png b/Assets/Female3DCG/ItemArms/TightJacket_NormalPulledStraps.png deleted file mode 100644 index e7935dc3f..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_NormalPulledStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_Small.png b/Assets/Female3DCG/ItemArms/TightJacket_Small.png deleted file mode 100644 index 4a90faa94..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_SmallExtraPadding.png b/Assets/Female3DCG/ItemArms/TightJacket_SmallExtraPadding.png deleted file mode 100644 index 32bd123fa..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_SmallExtraPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_SmallFullJacket.png b/Assets/Female3DCG/ItemArms/TightJacket_SmallFullJacket.png deleted file mode 100644 index 5b84b5f8b..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_SmallFullJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_SmallLiningStraps.png b/Assets/Female3DCG/ItemArms/TightJacket_SmallLiningStraps.png deleted file mode 100644 index 58282b212..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_SmallLiningStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_SmallPaddedLining.png b/Assets/Female3DCG/ItemArms/TightJacket_SmallPaddedLining.png deleted file mode 100644 index ea2548a8f..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_SmallPaddedLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_SmallPulledLining.png b/Assets/Female3DCG/ItemArms/TightJacket_SmallPulledLining.png deleted file mode 100644 index 4e81bc90e..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_SmallPulledLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_SmallPulledPadding.png b/Assets/Female3DCG/ItemArms/TightJacket_SmallPulledPadding.png deleted file mode 100644 index 2c7050bad..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_SmallPulledPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_SmallPulledStraps.png b/Assets/Female3DCG/ItemArms/TightJacket_SmallPulledStraps.png deleted file mode 100644 index 3807de4ed..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_SmallPulledStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_XLarge.png b/Assets/Female3DCG/ItemArms/TightJacket_XLarge.png deleted file mode 100644 index 8591ea2f1..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_XLargeExtraPadding.png b/Assets/Female3DCG/ItemArms/TightJacket_XLargeExtraPadding.png deleted file mode 100644 index 488af783c..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_XLargeExtraPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_XLargeFullJacket.png b/Assets/Female3DCG/ItemArms/TightJacket_XLargeFullJacket.png deleted file mode 100644 index 3bc7c6c78..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_XLargeFullJacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_XLargeLiningStraps.png b/Assets/Female3DCG/ItemArms/TightJacket_XLargeLiningStraps.png deleted file mode 100644 index 72be74b29..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_XLargeLiningStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_XLargePaddedLining.png b/Assets/Female3DCG/ItemArms/TightJacket_XLargePaddedLining.png deleted file mode 100644 index 4593f8014..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_XLargePaddedLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_XLargePulledLining.png b/Assets/Female3DCG/ItemArms/TightJacket_XLargePulledLining.png deleted file mode 100644 index 317b70be4..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_XLargePulledLining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_XLargePulledPadding.png b/Assets/Female3DCG/ItemArms/TightJacket_XLargePulledPadding.png deleted file mode 100644 index ea8e88480..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_XLargePulledPadding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TightJacket_XLargePulledStraps.png b/Assets/Female3DCG/ItemArms/TightJacket_XLargePulledStraps.png deleted file mode 100644 index 088998592..000000000 Binary files a/Assets/Female3DCG/ItemArms/TightJacket_XLargePulledStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_CrotchStraps.png b/Assets/Female3DCG/ItemArms/TransportJacket_CrotchStraps.png deleted file mode 100644 index 225a0046f..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_CrotchStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_Jacket.png b/Assets/Female3DCG/ItemArms/TransportJacket_Jacket.png deleted file mode 100644 index 326f8c6fb..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_Jacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_Large_Shorts.png b/Assets/Female3DCG/ItemArms/TransportJacket_Large_Shorts.png deleted file mode 100644 index 93f5fdb98..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_Large_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_Large_StrapsLegs.png b/Assets/Female3DCG/ItemArms/TransportJacket_Large_StrapsLegs.png deleted file mode 100644 index 2df8261e2..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_Large_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_Normal_Shorts.png b/Assets/Female3DCG/ItemArms/TransportJacket_Normal_Shorts.png deleted file mode 100644 index a98e8fc7e..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_Normal_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_Normal_StrapsLegs.png b/Assets/Female3DCG/ItemArms/TransportJacket_Normal_StrapsLegs.png deleted file mode 100644 index 2ff4512f6..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_Normal_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_Small_Shorts.png b/Assets/Female3DCG/ItemArms/TransportJacket_Small_Shorts.png deleted file mode 100644 index b872684af..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_Small_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_Small_StrapsLegs.png b/Assets/Female3DCG/ItemArms/TransportJacket_Small_StrapsLegs.png deleted file mode 100644 index 75080b686..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_Small_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_Straps.png b/Assets/Female3DCG/ItemArms/TransportJacket_Straps.png deleted file mode 100644 index a9f2f9f9e..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_Stripes.png b/Assets/Female3DCG/ItemArms/TransportJacket_Stripes.png deleted file mode 100644 index b3e6493dd..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_Stripes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_StripesLegs.png b/Assets/Female3DCG/ItemArms/TransportJacket_StripesLegs.png deleted file mode 100644 index 504f812fe..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_StripesLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_XLarge_Shorts.png b/Assets/Female3DCG/ItemArms/TransportJacket_XLarge_Shorts.png deleted file mode 100644 index 227fd2cb7..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_XLarge_Shorts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/TransportJacket_XLarge_StrapsLegs.png b/Assets/Female3DCG/ItemArms/TransportJacket_XLarge_StrapsLegs.png deleted file mode 100644 index 905ae86e9..000000000 Binary files a/Assets/Female3DCG/ItemArms/TransportJacket_XLarge_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Large.png b/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Large.png deleted file mode 100644 index 84c89b8fb..000000000 Binary files a/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Lock.png b/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Lock.png deleted file mode 100644 index 4ab375a8d..000000000 Binary files a/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Normal.png b/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Normal.png deleted file mode 100644 index a4fc7b2b4..000000000 Binary files a/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Small.png b/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Small.png deleted file mode 100644 index 5d0dfa336..000000000 Binary files a/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_XLarge.png b/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_XLarge.png deleted file mode 100644 index 9e9ac1b8b..000000000 Binary files a/Assets/Female3DCG/ItemArms/UnderBedBondageCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_Large.png b/Assets/Female3DCG/ItemArms/Web_Large.png deleted file mode 100644 index 97d969a61..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_LargeCocooned.png b/Assets/Female3DCG/ItemArms/Web_LargeCocooned.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_LargeCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_LargeWrapped.png b/Assets/Female3DCG/ItemArms/Web_LargeWrapped.png deleted file mode 100644 index cff475292..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_LargeWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_Normal.png b/Assets/Female3DCG/ItemArms/Web_Normal.png deleted file mode 100644 index 97d969a61..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_NormalCocooned.png b/Assets/Female3DCG/ItemArms/Web_NormalCocooned.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_NormalCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_NormalWrapped.png b/Assets/Female3DCG/ItemArms/Web_NormalWrapped.png deleted file mode 100644 index cff475292..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_NormalWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_Small.png b/Assets/Female3DCG/ItemArms/Web_Small.png deleted file mode 100644 index 97d969a61..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_SmallCocooned.png b/Assets/Female3DCG/ItemArms/Web_SmallCocooned.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_SmallCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_SmallWrapped.png b/Assets/Female3DCG/ItemArms/Web_SmallWrapped.png deleted file mode 100644 index cff475292..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_SmallWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_XLarge.png b/Assets/Female3DCG/ItemArms/Web_XLarge.png deleted file mode 100644 index 97d969a61..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_XLargeCocooned.png b/Assets/Female3DCG/ItemArms/Web_XLargeCocooned.png deleted file mode 100644 index 152e0658d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_XLargeCocooned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Web_XLargeWrapped.png b/Assets/Female3DCG/ItemArms/Web_XLargeWrapped.png deleted file mode 100644 index cff475292..000000000 Binary files a/Assets/Female3DCG/ItemArms/Web_XLargeWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WoodenCuffs_Large.png b/Assets/Female3DCG/ItemArms/WoodenCuffs_Large.png deleted file mode 100644 index 2ca2165a9..000000000 Binary files a/Assets/Female3DCG/ItemArms/WoodenCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WoodenCuffs_Lock.png b/Assets/Female3DCG/ItemArms/WoodenCuffs_Lock.png deleted file mode 100644 index e4885e123..000000000 Binary files a/Assets/Female3DCG/ItemArms/WoodenCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WoodenCuffs_Normal.png b/Assets/Female3DCG/ItemArms/WoodenCuffs_Normal.png deleted file mode 100644 index 2ca2165a9..000000000 Binary files a/Assets/Female3DCG/ItemArms/WoodenCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WoodenCuffs_Small.png b/Assets/Female3DCG/ItemArms/WoodenCuffs_Small.png deleted file mode 100644 index 2ca2165a9..000000000 Binary files a/Assets/Female3DCG/ItemArms/WoodenCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WoodenCuffs_XLarge.png b/Assets/Female3DCG/ItemArms/WoodenCuffs_XLarge.png deleted file mode 100644 index 2ca2165a9..000000000 Binary files a/Assets/Female3DCG/ItemArms/WoodenCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_Large.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_Large.png deleted file mode 100644 index 4cbb8979e..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_LargeFeetWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_LargeFeetWrapped.png deleted file mode 100644 index 29b85c637..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_LargeFeetWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_LargeFullWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_LargeFullWrapped.png deleted file mode 100644 index ec4df1615..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_LargeFullWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_LargeShouldersWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_LargeShouldersWrapped.png deleted file mode 100644 index 4272a841d..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_LargeShouldersWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_Normal.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_Normal.png deleted file mode 100644 index 553efadbc..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_NormalFeetWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_NormalFeetWrapped.png deleted file mode 100644 index 9208d13e3..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_NormalFeetWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_NormalFullWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_NormalFullWrapped.png deleted file mode 100644 index ecdd4c5b7..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_NormalFullWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_NormalShouldersWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_NormalShouldersWrapped.png deleted file mode 100644 index 3552198b8..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_NormalShouldersWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_Small.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_Small.png deleted file mode 100644 index bdac6ee10..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_SmallFeetWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_SmallFeetWrapped.png deleted file mode 100644 index bbba3d9ae..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_SmallFeetWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_SmallFullWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_SmallFullWrapped.png deleted file mode 100644 index 4258c9a23..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_SmallFullWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_SmallShouldersWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_SmallShouldersWrapped.png deleted file mode 100644 index d48ce2f5f..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_SmallShouldersWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_XLarge.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_XLarge.png deleted file mode 100644 index a2be83f9c..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_XLargeFeetWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_XLargeFeetWrapped.png deleted file mode 100644 index 5b55b8234..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_XLargeFeetWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_XLargeFullWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_XLargeFullWrapped.png deleted file mode 100644 index b89ba92ec..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_XLargeFullWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WrappedBlanket_XLargeShouldersWrapped.png b/Assets/Female3DCG/ItemArms/WrappedBlanket_XLargeShouldersWrapped.png deleted file mode 100644 index 496f64e0e..000000000 Binary files a/Assets/Female3DCG/ItemArms/WrappedBlanket_XLargeShouldersWrapped.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WristShackles_Chain.png b/Assets/Female3DCG/ItemArms/WristShackles_Chain.png deleted file mode 100644 index fb55b2b15..000000000 Binary files a/Assets/Female3DCG/ItemArms/WristShackles_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WristShackles_Cuffs.png b/Assets/Female3DCG/ItemArms/WristShackles_Cuffs.png deleted file mode 100644 index 78608ced9..000000000 Binary files a/Assets/Female3DCG/ItemArms/WristShackles_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/WristShackles_Lock.png b/Assets/Female3DCG/ItemArms/WristShackles_Lock.png deleted file mode 100644 index af367b99a..000000000 Binary files a/Assets/Female3DCG/ItemArms/WristShackles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoke_Bars.png b/Assets/Female3DCG/ItemArms/Yoke_Bars.png deleted file mode 100644 index ea190e010..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoke_Bars.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoke_Lock.png b/Assets/Female3DCG/ItemArms/Yoke_Lock.png deleted file mode 100644 index 2a6c5618f..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoke_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoke_Straps.png b/Assets/Female3DCG/ItemArms/Yoke_Straps.png deleted file mode 100644 index b8b5042ef..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoke_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Display.png b/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Display.png deleted file mode 100644 index a99c7ce4d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Large_Cuffs.png deleted file mode 100644 index aac2cf29e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Lock.png b/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Lock.png deleted file mode 100644 index d28af7052..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Normal_Cuffs.png deleted file mode 100644 index c8a4e10c0..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Small_Cuffs.png deleted file mode 100644 index 01f359fd3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_XLarge_Cuffs.png deleted file mode 100644 index 0306f7016..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/FuturisticCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Large_Cuffs.png deleted file mode 100644 index b2540f50c..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Large_Rings.png b/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Large_Rings.png deleted file mode 100644 index 1fd83f766..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Lock.png b/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Lock.png deleted file mode 100644 index 88389bb8e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Normal_Cuffs.png deleted file mode 100644 index a8a2235a3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Normal_Rings.png deleted file mode 100644 index ab701dad6..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Small_Cuffs.png deleted file mode 100644 index 9b9c33c6b..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Small_Rings.png b/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Small_Rings.png deleted file mode 100644 index cff22914a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_XLarge_Cuffs.png deleted file mode 100644 index 3a01a7212..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_XLarge_Rings.png deleted file mode 100644 index 89fa7bfbc..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/LeatherCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Large_Cuffs.png deleted file mode 100644 index a028ef2fd..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Large_Gems.png b/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Large_Gems.png deleted file mode 100644 index e783c0285..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Lock.png b/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Normal_Cuffs.png deleted file mode 100644 index 591747be3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Normal_Gems.png deleted file mode 100644 index 987868566..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Small_Cuffs.png deleted file mode 100644 index d8037fb2a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Small_Gems.png b/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Small_Gems.png deleted file mode 100644 index 7596affd5..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_XLarge_Cuffs.png deleted file mode 100644 index d6faaff2a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_XLarge_Gems.png deleted file mode 100644 index fafe2266d..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/OrnateCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_Large.png b/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_Large.png deleted file mode 100644 index f11657c8e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_Normal.png b/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_Normal.png deleted file mode 100644 index f11657c8e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_Small.png b/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_Small.png deleted file mode 100644 index f11657c8e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_XLarge.png b/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_XLarge.png deleted file mode 100644 index f11657c8e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/SteelCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Large.png b/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Large.png deleted file mode 100644 index 8bb764eba..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Lock.png b/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Lock.png deleted file mode 100644 index 7773052c2..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Normal.png b/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Normal.png deleted file mode 100644 index 8bb764eba..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Small.png b/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Small.png deleted file mode 100644 index 8bb764eba..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_XLarge.png b/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_XLarge.png deleted file mode 100644 index 8bb764eba..000000000 Binary files a/Assets/Female3DCG/ItemArms/Yoked/WoodenCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_Large.png b/Assets/Female3DCG/ItemArms/Zipties_Large.png deleted file mode 100644 index f0e75a897..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_LargeZipAllFours.png b/Assets/Female3DCG/ItemArms/Zipties_LargeZipAllFours.png deleted file mode 100644 index 957526a15..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_LargeZipAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_LargeZipElbowWrist.png b/Assets/Female3DCG/ItemArms/Zipties_LargeZipElbowWrist.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_LargeZipElbowWrist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_LargeZipFull.png b/Assets/Female3DCG/ItemArms/Zipties_LargeZipFull.png deleted file mode 100644 index d9cc99710..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_LargeZipFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_LargeZipHogtied.png b/Assets/Female3DCG/ItemArms/Zipties_LargeZipHogtied.png deleted file mode 100644 index eddc22953..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_LargeZipHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_LargeZipKneelingHogtie.png b/Assets/Female3DCG/ItemArms/Zipties_LargeZipKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_LargeZipKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_LargeZipMedium.png b/Assets/Female3DCG/ItemArms/Zipties_LargeZipMedium.png deleted file mode 100644 index e287485ab..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_LargeZipMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_LargeZipWrist.png b/Assets/Female3DCG/ItemArms/Zipties_LargeZipWrist.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_LargeZipWrist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_LargeZipWristFull.png b/Assets/Female3DCG/ItemArms/Zipties_LargeZipWristFull.png deleted file mode 100644 index 923392e35..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_LargeZipWristFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_LargeZipWristLight.png b/Assets/Female3DCG/ItemArms/Zipties_LargeZipWristLight.png deleted file mode 100644 index 30a549c3f..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_LargeZipWristLight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_LargeZipWristMedium.png b/Assets/Female3DCG/ItemArms/Zipties_LargeZipWristMedium.png deleted file mode 100644 index 9b8aae53a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_LargeZipWristMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_Normal.png b/Assets/Female3DCG/ItemArms/Zipties_Normal.png deleted file mode 100644 index dc56fd041..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_NormalZipAllFours.png b/Assets/Female3DCG/ItemArms/Zipties_NormalZipAllFours.png deleted file mode 100644 index e8c5ba333..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_NormalZipAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_NormalZipElbowWrist.png b/Assets/Female3DCG/ItemArms/Zipties_NormalZipElbowWrist.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_NormalZipElbowWrist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_NormalZipFull.png b/Assets/Female3DCG/ItemArms/Zipties_NormalZipFull.png deleted file mode 100644 index 38a4ce688..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_NormalZipFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_NormalZipHogtied.png b/Assets/Female3DCG/ItemArms/Zipties_NormalZipHogtied.png deleted file mode 100644 index 3c8c61d3b..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_NormalZipHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_NormalZipKneelingHogtie.png b/Assets/Female3DCG/ItemArms/Zipties_NormalZipKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_NormalZipKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_NormalZipMedium.png b/Assets/Female3DCG/ItemArms/Zipties_NormalZipMedium.png deleted file mode 100644 index 5c51bff0e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_NormalZipMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_NormalZipWrist.png b/Assets/Female3DCG/ItemArms/Zipties_NormalZipWrist.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_NormalZipWrist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_NormalZipWristFull.png b/Assets/Female3DCG/ItemArms/Zipties_NormalZipWristFull.png deleted file mode 100644 index 4af6f5482..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_NormalZipWristFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_NormalZipWristLight.png b/Assets/Female3DCG/ItemArms/Zipties_NormalZipWristLight.png deleted file mode 100644 index 118b3eaf3..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_NormalZipWristLight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_NormalZipWristMedium.png b/Assets/Female3DCG/ItemArms/Zipties_NormalZipWristMedium.png deleted file mode 100644 index acf6d52e8..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_NormalZipWristMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_Small.png b/Assets/Female3DCG/ItemArms/Zipties_Small.png deleted file mode 100644 index 1e0b494e1..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_SmallZipAllFours.png b/Assets/Female3DCG/ItemArms/Zipties_SmallZipAllFours.png deleted file mode 100644 index b06dbb42e..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_SmallZipAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_SmallZipElbowWrist.png b/Assets/Female3DCG/ItemArms/Zipties_SmallZipElbowWrist.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_SmallZipElbowWrist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_SmallZipFull.png b/Assets/Female3DCG/ItemArms/Zipties_SmallZipFull.png deleted file mode 100644 index 28d70b366..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_SmallZipFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_SmallZipHogtied.png b/Assets/Female3DCG/ItemArms/Zipties_SmallZipHogtied.png deleted file mode 100644 index 3c8c61d3b..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_SmallZipHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_SmallZipKneelingHogtie.png b/Assets/Female3DCG/ItemArms/Zipties_SmallZipKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_SmallZipKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_SmallZipMedium.png b/Assets/Female3DCG/ItemArms/Zipties_SmallZipMedium.png deleted file mode 100644 index f9b43c642..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_SmallZipMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_SmallZipWrist.png b/Assets/Female3DCG/ItemArms/Zipties_SmallZipWrist.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_SmallZipWrist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_SmallZipWristFull.png b/Assets/Female3DCG/ItemArms/Zipties_SmallZipWristFull.png deleted file mode 100644 index b11dbedd4..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_SmallZipWristFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_SmallZipWristLight.png b/Assets/Female3DCG/ItemArms/Zipties_SmallZipWristLight.png deleted file mode 100644 index e9da9a33f..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_SmallZipWristLight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_SmallZipWristMedium.png b/Assets/Female3DCG/ItemArms/Zipties_SmallZipWristMedium.png deleted file mode 100644 index ff71ca60b..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_SmallZipWristMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_XLarge.png b/Assets/Female3DCG/ItemArms/Zipties_XLarge.png deleted file mode 100644 index ec89de637..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipAllFours.png b/Assets/Female3DCG/ItemArms/Zipties_XLargeZipAllFours.png deleted file mode 100644 index 2cd3f3c04..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipAllFours.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipElbowWrist.png b/Assets/Female3DCG/ItemArms/Zipties_XLargeZipElbowWrist.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipElbowWrist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipFull.png b/Assets/Female3DCG/ItemArms/Zipties_XLargeZipFull.png deleted file mode 100644 index db2e8de7a..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipHogtied.png b/Assets/Female3DCG/ItemArms/Zipties_XLargeZipHogtied.png deleted file mode 100644 index eddc22953..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipHogtied.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipKneelingHogtie.png b/Assets/Female3DCG/ItemArms/Zipties_XLargeZipKneelingHogtie.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipKneelingHogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipMedium.png b/Assets/Female3DCG/ItemArms/Zipties_XLargeZipMedium.png deleted file mode 100644 index 6e225bafb..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWrist.png b/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWrist.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWrist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWristFull.png b/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWristFull.png deleted file mode 100644 index 48c6633ad..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWristFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWristLight.png b/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWristLight.png deleted file mode 100644 index 39a98e910..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWristLight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWristMedium.png b/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWristMedium.png deleted file mode 100644 index d97173ff4..000000000 Binary files a/Assets/Female3DCG/ItemArms/Zipties_XLargeZipWristMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/BalletHeels_Large.png b/Assets/Female3DCG/ItemBoots/BalletHeels_Large.png deleted file mode 100644 index 3d2a640cc..000000000 Binary files a/Assets/Female3DCG/ItemBoots/BalletHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/BalletHeels_Lock.png b/Assets/Female3DCG/ItemBoots/BalletHeels_Lock.png deleted file mode 100644 index 38980be41..000000000 Binary files a/Assets/Female3DCG/ItemBoots/BalletHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/BalletHeels_Normal.png b/Assets/Female3DCG/ItemBoots/BalletHeels_Normal.png deleted file mode 100644 index 7fd32411d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/BalletHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/BalletHeels_Small.png b/Assets/Female3DCG/ItemBoots/BalletHeels_Small.png deleted file mode 100644 index 0be44ae7b..000000000 Binary files a/Assets/Female3DCG/ItemBoots/BalletHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/BalletHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/BalletHeels_XLarge.png deleted file mode 100644 index b7d1111d3..000000000 Binary files a/Assets/Female3DCG/ItemBoots/BalletHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/BalletWedges_Large.png b/Assets/Female3DCG/ItemBoots/BalletWedges_Large.png deleted file mode 100644 index 564877ef5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/BalletWedges_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/BalletWedges_Lock.png b/Assets/Female3DCG/ItemBoots/BalletWedges_Lock.png deleted file mode 100644 index 6eff7d6ea..000000000 Binary files a/Assets/Female3DCG/ItemBoots/BalletWedges_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/BalletWedges_Normal.png b/Assets/Female3DCG/ItemBoots/BalletWedges_Normal.png deleted file mode 100644 index 9bc004f22..000000000 Binary files a/Assets/Female3DCG/ItemBoots/BalletWedges_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/BalletWedges_Small.png b/Assets/Female3DCG/ItemBoots/BalletWedges_Small.png deleted file mode 100644 index 6616f5196..000000000 Binary files a/Assets/Female3DCG/ItemBoots/BalletWedges_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/BalletWedges_XLarge.png b/Assets/Female3DCG/ItemBoots/BalletWedges_XLarge.png deleted file mode 100644 index b330daddd..000000000 Binary files a/Assets/Female3DCG/ItemBoots/BalletWedges_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Cuffs.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Cuffs.png deleted file mode 100644 index 429069b6e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Display.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Display.png deleted file mode 100644 index ae8e375cf..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Lock.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Lock.png deleted file mode 100644 index 63b2be289..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Mesh.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Mesh.png deleted file mode 100644 index 9b91e081b..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Shine.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Shine.png deleted file mode 100644 index 68b98986a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Soles.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Soles.png deleted file mode 100644 index 09cba69a3..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Trim.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Trim.png deleted file mode 100644 index cae0b51d3..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels2_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeelsHeel_Lock.png b/Assets/Female3DCG/ItemBoots/FuturisticHeelsHeel_Lock.png deleted file mode 100644 index d63bffd80..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeelsHeel_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_LargeHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_LargeHeel_Shoes.png deleted file mode 100644 index 297c55ba9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_LargeHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Large_Display.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_Large_Display.png deleted file mode 100644 index 830acf1c3..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Large_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Large_Shoes.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_Large_Shoes.png deleted file mode 100644 index 788b9e99d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Lock.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_Lock.png deleted file mode 100644 index f786b239b..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_NormalHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_NormalHeel_Shoes.png deleted file mode 100644 index 0f7d29eb6..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_NormalHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Normal_Display.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_Normal_Display.png deleted file mode 100644 index 830acf1c3..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Normal_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Normal_Shoes.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_Normal_Shoes.png deleted file mode 100644 index 67894c79f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_SmallHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_SmallHeel_Shoes.png deleted file mode 100644 index 22b36a22e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_SmallHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Small_Display.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_Small_Display.png deleted file mode 100644 index 830acf1c3..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Small_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Small_Shoes.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_Small_Shoes.png deleted file mode 100644 index 4698ef2d1..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_XLargeHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_XLargeHeel_Shoes.png deleted file mode 100644 index 7ef15c071..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_XLargeHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_XLarge_Display.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_XLarge_Display.png deleted file mode 100644 index 830acf1c3..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_XLarge_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/FuturisticHeels_XLarge_Shoes.png b/Assets/Female3DCG/ItemBoots/FuturisticHeels_XLarge_Shoes.png deleted file mode 100644 index d074e1454..000000000 Binary files a/Assets/Female3DCG/ItemBoots/FuturisticHeels_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/HighThighBoots_Large.png b/Assets/Female3DCG/ItemBoots/HighThighBoots_Large.png deleted file mode 100644 index 5de171b88..000000000 Binary files a/Assets/Female3DCG/ItemBoots/HighThighBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/HighThighBoots_Lock.png b/Assets/Female3DCG/ItemBoots/HighThighBoots_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/HighThighBoots_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/HighThighBoots_Normal.png b/Assets/Female3DCG/ItemBoots/HighThighBoots_Normal.png deleted file mode 100644 index 25011a3ab..000000000 Binary files a/Assets/Female3DCG/ItemBoots/HighThighBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/HighThighBoots_Small.png b/Assets/Female3DCG/ItemBoots/HighThighBoots_Small.png deleted file mode 100644 index 909fd5abd..000000000 Binary files a/Assets/Female3DCG/ItemBoots/HighThighBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/HighThighBoots_XLarge.png b/Assets/Female3DCG/ItemBoots/HighThighBoots_XLarge.png deleted file mode 100644 index 30fc56d1a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/HighThighBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Large.png deleted file mode 100644 index 8919bb54e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Lock.png deleted file mode 100644 index 69856cc99..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Normal.png deleted file mode 100644 index 1d4ce414d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Small.png deleted file mode 100644 index c11f6656e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_XLarge.png deleted file mode 100644 index befacb97d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/BalletHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Large.png deleted file mode 100644 index 12e437dae..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Lock.png deleted file mode 100644 index 333033e93..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Normal.png deleted file mode 100644 index ff4a59c43..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Small.png deleted file mode 100644 index 7d540bb78..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_XLarge.png deleted file mode 100644 index 14ca3a31e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/BalletWedges_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Cuffs.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Cuffs.png deleted file mode 100644 index f9e651fdf..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Display.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Display.png deleted file mode 100644 index f9e651fdf..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Lock.png deleted file mode 100644 index a2b0086df..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Mesh.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Mesh.png deleted file mode 100644 index 68aee46e2..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Shine.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Shine.png deleted file mode 100644 index da0947e8e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Soles.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Soles.png deleted file mode 100644 index f9e651fdf..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Trim.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Trim.png deleted file mode 100644 index f9e651fdf..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels2_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeelsHeel_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeelsHeel_Lock.png deleted file mode 100644 index 271762eb6..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeelsHeel_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_LargeHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_LargeHeel_Shoes.png deleted file mode 100644 index ea4c7b068..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_LargeHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Large_Display.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Large_Display.png deleted file mode 100644 index 67c90af76..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Large_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Large_Shoes.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Large_Shoes.png deleted file mode 100644 index ea4c7b068..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Lock.png deleted file mode 100644 index 271762eb6..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_NormalHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_NormalHeel_Shoes.png deleted file mode 100644 index ea4c7b068..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_NormalHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Normal_Display.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Normal_Display.png deleted file mode 100644 index 67c90af76..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Normal_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Normal_Shoes.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Normal_Shoes.png deleted file mode 100644 index ea4c7b068..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_SmallHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_SmallHeel_Shoes.png deleted file mode 100644 index ea4c7b068..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_SmallHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Small_Display.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Small_Display.png deleted file mode 100644 index 67c90af76..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Small_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Small_Shoes.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Small_Shoes.png deleted file mode 100644 index ea4c7b068..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_XLargeHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_XLargeHeel_Shoes.png deleted file mode 100644 index ea4c7b068..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_XLargeHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_XLarge_Display.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_XLarge_Display.png deleted file mode 100644 index 67c90af76..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_XLarge_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_XLarge_Shoes.png b/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_XLarge_Shoes.png deleted file mode 100644 index ea4c7b068..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/FuturisticHeels_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Large.png deleted file mode 100644 index a3e17f77f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Normal.png deleted file mode 100644 index a3e17f77f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Small.png deleted file mode 100644 index a3e17f77f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_XLarge.png deleted file mode 100644 index a3e17f77f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/HighThighBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Large_Mitts.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Large_Mitts.png deleted file mode 100644 index 3f0b49398..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Large_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Large_Straps.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Large_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Normal_Mitts.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Normal_Mitts.png deleted file mode 100644 index 3f0b49398..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Normal_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Normal_Straps.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Normal_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Small_Mitts.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Small_Mitts.png deleted file mode 100644 index 3f0b49398..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Small_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Small_Straps.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Small_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_XLarge_Mitts.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_XLarge_Mitts.png deleted file mode 100644 index 3f0b49398..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_XLarge_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_XLarge_Straps.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_XLarge_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherFootMitts1_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Large.png deleted file mode 100644 index 28d35f254..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Normal.png deleted file mode 100644 index 1de1ba555..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Small.png deleted file mode 100644 index c0fa63c3d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_XLarge.png deleted file mode 100644 index 98724ca80..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LeatherToeCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Large_Boots.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Large_Boots.png deleted file mode 100644 index a256a1e31..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Large_Straps.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Large_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Normal_Boots.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Normal_Boots.png deleted file mode 100644 index a256a1e31..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Normal_Straps.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Normal_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Small_Boots.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Small_Boots.png deleted file mode 100644 index a256a1e31..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Small_Straps.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Small_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_XLarge_Boots.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_XLarge_Boots.png deleted file mode 100644 index a256a1e31..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_XLarge_Straps.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_XLarge_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingBoots1_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Large.png deleted file mode 100644 index 9c743fbf9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Lock.png deleted file mode 100644 index 3f3784737..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Normal.png deleted file mode 100644 index 9c743fbf9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Small.png deleted file mode 100644 index 9c743fbf9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_XLarge.png deleted file mode 100644 index 9c743fbf9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Large.png deleted file mode 100644 index 9c743fbf9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Lock.png deleted file mode 100644 index 3f3784737..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Normal.png deleted file mode 100644 index 9c743fbf9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Small.png deleted file mode 100644 index 9c743fbf9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_XLarge.png deleted file mode 100644 index 9c743fbf9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Large.png deleted file mode 100644 index f99ed1053..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Normal.png deleted file mode 100644 index f99ed1053..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Small.png deleted file mode 100644 index f99ed1053..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_XLarge.png deleted file mode 100644 index f99ed1053..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Large.png deleted file mode 100644 index f99ed1053..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Normal.png deleted file mode 100644 index f99ed1053..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Small.png deleted file mode 100644 index f99ed1053..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_XLarge.png deleted file mode 100644 index f99ed1053..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/LockingShoes2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Large.png deleted file mode 100644 index 0301c9c14..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Lock.png deleted file mode 100644 index 3f3784737..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Normal.png deleted file mode 100644 index 765d3d1a4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Small.png deleted file mode 100644 index 9d88c9984..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_XLarge.png deleted file mode 100644 index d0a77592d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/PonyBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Large.png deleted file mode 100644 index 8919bb54e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Lock.png deleted file mode 100644 index a4ce3a9d4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Normal.png deleted file mode 100644 index 1d4ce414d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Small.png deleted file mode 100644 index c11f6656e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_XLarge.png deleted file mode 100644 index befacb97d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ThighHighLatexHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Large.png deleted file mode 100644 index 448112c3d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Lock.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Normal.png deleted file mode 100644 index 448112c3d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Small.png deleted file mode 100644 index 448112c3d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_XLarge.png deleted file mode 100644 index 448112c3d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_Large.png deleted file mode 100644 index 39048133f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_LargeFull.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_LargeFull.png deleted file mode 100644 index d4ce9a3f2..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_LargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_NormalFull.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_NormalFull.png deleted file mode 100644 index d4ce9a3f2..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_NormalFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_Small.png deleted file mode 100644 index 39048133f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_SmallFull.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_SmallFull.png deleted file mode 100644 index d4ce9a3f2..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_SmallFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_XLarge.png deleted file mode 100644 index 39048133f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_XLargeFull.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_XLargeFull.png deleted file mode 100644 index d4ce9a3f2..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTape_XLargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_Large.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_Large.png deleted file mode 100644 index 53257b1ea..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_Normal.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_Normal.png deleted file mode 100644 index 53257b1ea..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_Small.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_Small.png deleted file mode 100644 index 53257b1ea..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_XLarge.png deleted file mode 100644 index 53257b1ea..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/ToeTie_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Hogtied/Zipties_XLarge.png b/Assets/Female3DCG/ItemBoots/Hogtied/Zipties_XLarge.png deleted file mode 100644 index f5600bdf4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Hogtied/Zipties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/BalletHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/BalletWedges_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Cuffs.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Cuffs.png deleted file mode 100644 index 5ede12643..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Display.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Display.png deleted file mode 100644 index 5ede12643..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Lock.png deleted file mode 100644 index 1bcbe93e9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Mesh.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Mesh.png deleted file mode 100644 index 5ede12643..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Shine.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Shine.png deleted file mode 100644 index f6623bbf0..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Soles.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Soles.png deleted file mode 100644 index 5ede12643..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Trim.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Trim.png deleted file mode 100644 index 5ede12643..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels2_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeelsHeel_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeelsHeel_Lock.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeelsHeel_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_LargeHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_LargeHeel_Shoes.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_LargeHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Large_Display.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Large_Display.png deleted file mode 100644 index 67f8c01b4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Large_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Large_Shoes.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Large_Shoes.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Lock.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_NormalHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_NormalHeel_Shoes.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_NormalHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Normal_Display.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Normal_Display.png deleted file mode 100644 index 67f8c01b4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Normal_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Normal_Shoes.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Normal_Shoes.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_SmallHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_SmallHeel_Shoes.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_SmallHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Small_Display.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Small_Display.png deleted file mode 100644 index 67f8c01b4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Small_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Small_Shoes.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Small_Shoes.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_XLargeHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_XLargeHeel_Shoes.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_XLargeHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_XLarge_Display.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_XLarge_Display.png deleted file mode 100644 index 67f8c01b4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_XLarge_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_XLarge_Shoes.png b/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_XLarge_Shoes.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/FuturisticHeels_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Large.png deleted file mode 100644 index 129a280aa..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Normal.png deleted file mode 100644 index fe3d5fd95..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Small.png deleted file mode 100644 index 483801d8a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_XLarge.png deleted file mode 100644 index 913765d5e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/HighThighBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Large_Mitts.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Large_Mitts.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Large_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Large_Straps.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Large_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Normal_Mitts.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Normal_Mitts.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Normal_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Normal_Straps.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Normal_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Small_Mitts.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Small_Mitts.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Small_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Small_Straps.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Small_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_XLarge_Mitts.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_XLarge_Mitts.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_XLarge_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_XLarge_Straps.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_XLarge_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherFootMitts1_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LeatherToeCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Large_Boots.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Large_Boots.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Large_Straps.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Large_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Lock.png deleted file mode 100644 index d34383dc1..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Normal_Boots.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Normal_Boots.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Normal_Straps.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Normal_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Small_Boots.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Small_Boots.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Small_Straps.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Small_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_XLarge_Boots.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_XLarge_Boots.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_XLarge_Straps.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_XLarge_Straps.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingBoots1_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/LockingShoes2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/PonyBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Large.png deleted file mode 100644 index 270398ac2..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Normal.png deleted file mode 100644 index 15339f187..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Small.png deleted file mode 100644 index 0d43e9517..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_XLarge.png deleted file mode 100644 index 1b6442752..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ThighHighLatexHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Lock.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_LargeFull.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_LargeFull.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_LargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_NormalFull.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_NormalFull.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_NormalFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_SmallFull.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_SmallFull.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_SmallFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_XLargeFull.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_XLargeFull.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTape_XLargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/ToeTie_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/Zipties_Large.png b/Assets/Female3DCG/ItemBoots/Kneel/Zipties_Large.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/Zipties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/Zipties_Normal.png b/Assets/Female3DCG/ItemBoots/Kneel/Zipties_Normal.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/Zipties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/Zipties_Small.png b/Assets/Female3DCG/ItemBoots/Kneel/Zipties_Small.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/Zipties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Kneel/Zipties_XLarge.png b/Assets/Female3DCG/ItemBoots/Kneel/Zipties_XLarge.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Kneel/Zipties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Large.png b/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Large.png deleted file mode 100644 index 6ed033ce4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Lock.png b/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Normal.png b/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Normal.png deleted file mode 100644 index 168130389..000000000 Binary files a/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Small.png b/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Small.png deleted file mode 100644 index 3840fc3bf..000000000 Binary files a/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_XLarge.png b/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_XLarge.png deleted file mode 100644 index 205409078..000000000 Binary files a/Assets/Female3DCG/ItemBoots/KneelingSpread/HighThighBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Large.png b/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Large.png deleted file mode 100644 index f796cf7ae..000000000 Binary files a/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Lock.png b/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Lock.png deleted file mode 100644 index 4ce9edac9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Normal.png b/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Normal.png deleted file mode 100644 index f796cf7ae..000000000 Binary files a/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Small.png b/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Small.png deleted file mode 100644 index 22d811947..000000000 Binary files a/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_XLarge.png deleted file mode 100644 index b9da526f3..000000000 Binary files a/Assets/Female3DCG/ItemBoots/KneelingSpread/ThighHighLatexHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Large_Mitts.png b/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Large_Mitts.png deleted file mode 100644 index a03b3eb64..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Large_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Large_Straps.png b/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Large_Straps.png deleted file mode 100644 index f50f539d8..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Lock.png b/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Lock.png deleted file mode 100644 index f38e9fc96..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Normal_Mitts.png b/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Normal_Mitts.png deleted file mode 100644 index 5eaaf9ec0..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Normal_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Normal_Straps.png b/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Normal_Straps.png deleted file mode 100644 index fb2710c0c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Small_Mitts.png b/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Small_Mitts.png deleted file mode 100644 index 36ab750f1..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Small_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Small_Straps.png b/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Small_Straps.png deleted file mode 100644 index 302b068d6..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_XLarge_Mitts.png b/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_XLarge_Mitts.png deleted file mode 100644 index 908cb2d84..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_XLarge_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_XLarge_Straps.png b/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_XLarge_Straps.png deleted file mode 100644 index f6442206e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherFootMitts1_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Large.png b/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Large.png deleted file mode 100644 index a477ea5f5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Lock.png b/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Normal.png b/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Normal.png deleted file mode 100644 index a477ea5f5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Small.png b/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Small.png deleted file mode 100644 index a477ea5f5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_XLarge.png b/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_XLarge.png deleted file mode 100644 index a477ea5f5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LeatherToeCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Large.png deleted file mode 100644 index 9f157dc51..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Lock.png deleted file mode 100644 index 12a64b03f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Normal.png deleted file mode 100644 index 1f038a95e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Small.png deleted file mode 100644 index d628f9eef..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_XLarge.png deleted file mode 100644 index 730cde695..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Large.png deleted file mode 100644 index a585859d3..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Lock.png deleted file mode 100644 index 92452e183..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Normal.png deleted file mode 100644 index 9cba65620..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Small.png deleted file mode 100644 index 7116ebecc..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_XLarge.png deleted file mode 100644 index a1817786b..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/BalletWedges_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_Large.png deleted file mode 100644 index 18634db23..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_Normal.png deleted file mode 100644 index 504c66c62..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_Small.png deleted file mode 100644 index 4f25154ab..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_XLarge.png deleted file mode 100644 index a696bce2f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/Boots1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Cuffs.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Cuffs.png deleted file mode 100644 index 12ecd9bfd..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Display.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Display.png deleted file mode 100644 index d438e2e99..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Lock.png deleted file mode 100644 index 473730726..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Mesh.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Mesh.png deleted file mode 100644 index f81d7a7e9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Shine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Shine.png deleted file mode 100644 index 3c2da54ee..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Soles.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Soles.png deleted file mode 100644 index 8983817e7..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Trim.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Trim.png deleted file mode 100644 index bb8b88697..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels2_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeelsHeel_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeelsHeel_Lock.png deleted file mode 100644 index e51b8a2fc..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeelsHeel_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_LargeHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_LargeHeel_Shoes.png deleted file mode 100644 index e5aa528b7..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_LargeHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Large_Display.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Large_Display.png deleted file mode 100644 index 900b2a61a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Large_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Large_Shoes.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Large_Shoes.png deleted file mode 100644 index f002d1fcf..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Lock.png deleted file mode 100644 index e51b8a2fc..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_NormalHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_NormalHeel_Shoes.png deleted file mode 100644 index e5aa528b7..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_NormalHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Normal_Display.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Normal_Display.png deleted file mode 100644 index 900b2a61a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Normal_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Normal_Shoes.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Normal_Shoes.png deleted file mode 100644 index f002d1fcf..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_SmallHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_SmallHeel_Shoes.png deleted file mode 100644 index e5aa528b7..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_SmallHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Small_Display.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Small_Display.png deleted file mode 100644 index 900b2a61a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Small_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Small_Shoes.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Small_Shoes.png deleted file mode 100644 index f002d1fcf..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_XLargeHeel_Shoes.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_XLargeHeel_Shoes.png deleted file mode 100644 index 6459edaa9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_XLargeHeel_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_XLarge_Display.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_XLarge_Display.png deleted file mode 100644 index 900b2a61a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_XLarge_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_XLarge_Shoes.png b/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_XLarge_Shoes.png deleted file mode 100644 index cf00d1067..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/FuturisticHeels_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Large.png deleted file mode 100644 index c1d71ff2a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Normal.png deleted file mode 100644 index f6f3cd8ed..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Small.png deleted file mode 100644 index 8e215250b..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_XLarge.png deleted file mode 100644 index 0253016a9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/HighThighBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Large_Mitts.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Large_Mitts.png deleted file mode 100644 index ffd6d00ee..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Large_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Large_Straps.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Large_Straps.png deleted file mode 100644 index 12aad1220..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Lock.png deleted file mode 100644 index 1764d0c89..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Normal_Mitts.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Normal_Mitts.png deleted file mode 100644 index c8d49ff49..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Normal_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Normal_Straps.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Normal_Straps.png deleted file mode 100644 index afbb4ba71..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Small_Mitts.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Small_Mitts.png deleted file mode 100644 index 3236a9649..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Small_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Small_Straps.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Small_Straps.png deleted file mode 100644 index 0e4ca6026..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_XLarge_Mitts.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_XLarge_Mitts.png deleted file mode 100644 index bc7127e16..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_XLarge_Mitts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_XLarge_Straps.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_XLarge_Straps.png deleted file mode 100644 index 46df21b9f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherFootMitts1_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Large.png deleted file mode 100644 index a477ea5f5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Normal.png deleted file mode 100644 index a477ea5f5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Small.png deleted file mode 100644 index a477ea5f5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_XLarge.png deleted file mode 100644 index a477ea5f5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LeatherToeCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Large_Boots.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Large_Boots.png deleted file mode 100644 index 2f76e2c0a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Large_Straps.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Large_Straps.png deleted file mode 100644 index ac3eccf39..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Lock.png deleted file mode 100644 index bf16efb2d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Normal_Boots.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Normal_Boots.png deleted file mode 100644 index 990f7eeab..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Normal_Straps.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Normal_Straps.png deleted file mode 100644 index cb6df0e2d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Small_Boots.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Small_Boots.png deleted file mode 100644 index 990f7eeab..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Small_Straps.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Small_Straps.png deleted file mode 100644 index cb6df0e2d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_XLarge_Boots.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_XLarge_Boots.png deleted file mode 100644 index 2f76e2c0a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_XLarge_Straps.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_XLarge_Straps.png deleted file mode 100644 index ac3eccf39..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingBoots1_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Large.png deleted file mode 100644 index bbc2a8c52..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Lock.png deleted file mode 100644 index 48432b36a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Normal.png deleted file mode 100644 index 39a54ee14..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Small.png deleted file mode 100644 index 5cc5043ab..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_XLarge.png deleted file mode 100644 index 579d3b920..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Large.png deleted file mode 100644 index efbfd05b2..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Lock.png deleted file mode 100644 index b9f57c53e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Normal.png deleted file mode 100644 index e92ed8cb5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Small.png deleted file mode 100644 index 8b5d590f7..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_XLarge.png deleted file mode 100644 index 643a26405..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Large.png deleted file mode 100644 index 9eb94969f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Lock.png deleted file mode 100644 index ff5b105e5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Normal.png deleted file mode 100644 index 9eb94969f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Small.png deleted file mode 100644 index 9eb94969f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_XLarge.png deleted file mode 100644 index 9eb94969f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Large.png deleted file mode 100644 index 436e8cf32..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Lock.png deleted file mode 100644 index b77a11c46..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Normal.png deleted file mode 100644 index d86a2a21d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Small.png deleted file mode 100644 index 1d9ff76ce..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_XLarge.png deleted file mode 100644 index 22f2c3f2e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/LockingShoes2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_LargeHalf_Binder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_LargeHalf_Binder.png deleted file mode 100644 index 48829b58b..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_LargeHalf_Binder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_LargeHalf_Shine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_LargeHalf_Shine.png deleted file mode 100644 index 687bde45e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_LargeHalf_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Binder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Binder.png deleted file mode 100644 index a44e2857d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Binder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_HalfBinder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_HalfBinder.png deleted file mode 100644 index bf1544677..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_HalfBinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_HalfShine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_HalfShine.png deleted file mode 100644 index 7934b1e32..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_HalfShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Shine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Shine.png deleted file mode 100644 index affd90204..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Trim.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Trim.png deleted file mode 100644 index 673e28e88..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Vamp.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Vamp.png deleted file mode 100644 index 0d21088d7..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Large_Vamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_NormalHalf_Binder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_NormalHalf_Binder.png deleted file mode 100644 index 487ea186b..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_NormalHalf_Binder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_NormalHalf_Shine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_NormalHalf_Shine.png deleted file mode 100644 index cfa04a343..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_NormalHalf_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Binder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Binder.png deleted file mode 100644 index ed357f60e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Binder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_HalfBinder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_HalfBinder.png deleted file mode 100644 index e6f5cd8a7..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_HalfBinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_HalfShine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_HalfShine.png deleted file mode 100644 index b9677089e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_HalfShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Shine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Shine.png deleted file mode 100644 index f0228600f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Trim.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Trim.png deleted file mode 100644 index 3c8d44a96..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Vamp.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Vamp.png deleted file mode 100644 index 78978b2ad..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Normal_Vamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_SmallHalf_Binder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_SmallHalf_Binder.png deleted file mode 100644 index 3454189fe..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_SmallHalf_Binder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_SmallHalf_Shine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_SmallHalf_Shine.png deleted file mode 100644 index 781b38ec2..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_SmallHalf_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Binder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Binder.png deleted file mode 100644 index c9400882e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Binder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_HalfBinder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_HalfBinder.png deleted file mode 100644 index bf3bf20e8..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_HalfBinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_HalfShine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_HalfShine.png deleted file mode 100644 index 7f396aaaf..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_HalfShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Shine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Shine.png deleted file mode 100644 index 069497336..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Trim.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Trim.png deleted file mode 100644 index 06ff69e61..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Vamp.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Vamp.png deleted file mode 100644 index 3e5c34569..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_Small_Vamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLargeHalf_Binder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLargeHalf_Binder.png deleted file mode 100644 index 7fd7ce2eb..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLargeHalf_Binder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLargeHalf_Shine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLargeHalf_Shine.png deleted file mode 100644 index 402eca3eb..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLargeHalf_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Binder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Binder.png deleted file mode 100644 index 0e4129c72..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Binder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_HalfBinder.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_HalfBinder.png deleted file mode 100644 index f175c13d9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_HalfBinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_HalfShine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_HalfShine.png deleted file mode 100644 index e1a083311..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_HalfShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Shine.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Shine.png deleted file mode 100644 index 6231c98f9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Trim.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Trim.png deleted file mode 100644 index 216ecf478..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Vamp.png b/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Vamp.png deleted file mode 100644 index b88934ce7..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/MonoHeel_XLarge_Vamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Large.png deleted file mode 100644 index c4a43c064..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Lock.png deleted file mode 100644 index 5b9371b30..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Normal.png deleted file mode 100644 index 5d9c0cad8..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Small.png deleted file mode 100644 index 35c18017d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_XLarge.png deleted file mode 100644 index f9b181a87..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/PonyBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/Slime_One.png b/Assets/Female3DCG/ItemBoots/LegsClosed/Slime_One.png deleted file mode 100644 index 0fb2e909d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/Slime_One.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/Slime_Two.png b/Assets/Female3DCG/ItemBoots/LegsClosed/Slime_Two.png deleted file mode 100644 index 62a6cfe56..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/Slime_Two.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Large.png deleted file mode 100644 index e0a2030d1..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Lock.png deleted file mode 100644 index cb4aba76a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Normal.png deleted file mode 100644 index e30784118..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Small.png deleted file mode 100644 index 15b21be8f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_XLarge.png deleted file mode 100644 index eabc111ce..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ThighHighLatexHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Large.png deleted file mode 100644 index 7c52ede03..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Lock.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Normal.png deleted file mode 100644 index 7c52ede03..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Small.png deleted file mode 100644 index 7c52ede03..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_XLarge.png deleted file mode 100644 index 7c52ede03..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_Large.png deleted file mode 100644 index 30eef1fb4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_LargeFull.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_LargeFull.png deleted file mode 100644 index bc8909d4c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_LargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_Normal.png deleted file mode 100644 index 30eef1fb4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_NormalFull.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_NormalFull.png deleted file mode 100644 index bc8909d4c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_NormalFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_Small.png deleted file mode 100644 index 30eef1fb4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_SmallFull.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_SmallFull.png deleted file mode 100644 index bc8909d4c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_SmallFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_XLarge.png deleted file mode 100644 index 504adcad1..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_XLargeFull.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_XLargeFull.png deleted file mode 100644 index bc8909d4c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTape_XLargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_Large.png deleted file mode 100644 index b7259617f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_Normal.png deleted file mode 100644 index b7259617f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_Small.png deleted file mode 100644 index b7259617f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_XLarge.png deleted file mode 100644 index b7259617f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/ToeTie_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_Large.png b/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_Large.png deleted file mode 100644 index 1f81b2eaa..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_Normal.png b/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_Normal.png deleted file mode 100644 index 1f81b2eaa..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_Small.png b/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_Small.png deleted file mode 100644 index 1f81b2eaa..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_XLarge.png b/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_XLarge.png deleted file mode 100644 index 1f81b2eaa..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LegsClosed/Zipties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingBoots1_Large_Boots.png b/Assets/Female3DCG/ItemBoots/LockingBoots1_Large_Boots.png deleted file mode 100644 index 1a52de99f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingBoots1_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingBoots1_Large_Straps.png b/Assets/Female3DCG/ItemBoots/LockingBoots1_Large_Straps.png deleted file mode 100644 index 4730fcc6d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingBoots1_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingBoots1_Lock.png b/Assets/Female3DCG/ItemBoots/LockingBoots1_Lock.png deleted file mode 100644 index d34383dc1..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingBoots1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingBoots1_Normal_Boots.png b/Assets/Female3DCG/ItemBoots/LockingBoots1_Normal_Boots.png deleted file mode 100644 index 11d3989e5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingBoots1_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingBoots1_Normal_Straps.png b/Assets/Female3DCG/ItemBoots/LockingBoots1_Normal_Straps.png deleted file mode 100644 index 98b8e40bc..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingBoots1_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingBoots1_Small_Boots.png b/Assets/Female3DCG/ItemBoots/LockingBoots1_Small_Boots.png deleted file mode 100644 index 5b59207e5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingBoots1_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingBoots1_Small_Straps.png b/Assets/Female3DCG/ItemBoots/LockingBoots1_Small_Straps.png deleted file mode 100644 index 33627cd41..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingBoots1_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingBoots1_XLarge_Boots.png b/Assets/Female3DCG/ItemBoots/LockingBoots1_XLarge_Boots.png deleted file mode 100644 index 981062b94..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingBoots1_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingBoots1_XLarge_Straps.png b/Assets/Female3DCG/ItemBoots/LockingBoots1_XLarge_Straps.png deleted file mode 100644 index 64343083a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingBoots1_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingHeels2_Large.png b/Assets/Female3DCG/ItemBoots/LockingHeels2_Large.png deleted file mode 100644 index 59630c15e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingHeels2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingHeels2_Lock.png b/Assets/Female3DCG/ItemBoots/LockingHeels2_Lock.png deleted file mode 100644 index aaefe69e4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingHeels2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingHeels2_Normal.png b/Assets/Female3DCG/ItemBoots/LockingHeels2_Normal.png deleted file mode 100644 index 59630c15e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingHeels2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingHeels2_Small.png b/Assets/Female3DCG/ItemBoots/LockingHeels2_Small.png deleted file mode 100644 index 59630c15e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingHeels2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingHeels2_XLarge.png b/Assets/Female3DCG/ItemBoots/LockingHeels2_XLarge.png deleted file mode 100644 index 59630c15e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingHeels2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingHeels_Large.png b/Assets/Female3DCG/ItemBoots/LockingHeels_Large.png deleted file mode 100644 index 1dbd388a0..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingHeels_Lock.png b/Assets/Female3DCG/ItemBoots/LockingHeels_Lock.png deleted file mode 100644 index d41f1fd07..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingHeels_Normal.png b/Assets/Female3DCG/ItemBoots/LockingHeels_Normal.png deleted file mode 100644 index e2fad3674..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingHeels_Small.png b/Assets/Female3DCG/ItemBoots/LockingHeels_Small.png deleted file mode 100644 index 3f338cfb3..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/LockingHeels_XLarge.png deleted file mode 100644 index 143926cb8..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingShoes1_Large.png b/Assets/Female3DCG/ItemBoots/LockingShoes1_Large.png deleted file mode 100644 index 2d381a1d5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingShoes1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingShoes1_Lock.png b/Assets/Female3DCG/ItemBoots/LockingShoes1_Lock.png deleted file mode 100644 index fe2c7a30e..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingShoes1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingShoes1_Normal.png b/Assets/Female3DCG/ItemBoots/LockingShoes1_Normal.png deleted file mode 100644 index 5ead45d84..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingShoes1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingShoes1_Small.png b/Assets/Female3DCG/ItemBoots/LockingShoes1_Small.png deleted file mode 100644 index 5ead45d84..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingShoes1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingShoes1_XLarge.png b/Assets/Female3DCG/ItemBoots/LockingShoes1_XLarge.png deleted file mode 100644 index 2d381a1d5..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingShoes1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingShoes2_Large.png b/Assets/Female3DCG/ItemBoots/LockingShoes2_Large.png deleted file mode 100644 index 5f75e4ace..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingShoes2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingShoes2_Lock.png b/Assets/Female3DCG/ItemBoots/LockingShoes2_Lock.png deleted file mode 100644 index 45bb82261..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingShoes2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingShoes2_Normal.png b/Assets/Female3DCG/ItemBoots/LockingShoes2_Normal.png deleted file mode 100644 index ec8289c2b..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingShoes2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingShoes2_Small.png b/Assets/Female3DCG/ItemBoots/LockingShoes2_Small.png deleted file mode 100644 index 5e51ae71a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingShoes2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/LockingShoes2_XLarge.png b/Assets/Female3DCG/ItemBoots/LockingShoes2_XLarge.png deleted file mode 100644 index 12676ba75..000000000 Binary files a/Assets/Female3DCG/ItemBoots/LockingShoes2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/PonyBoots_Large.png b/Assets/Female3DCG/ItemBoots/PonyBoots_Large.png deleted file mode 100644 index 8c4e54ead..000000000 Binary files a/Assets/Female3DCG/ItemBoots/PonyBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/PonyBoots_Lock.png b/Assets/Female3DCG/ItemBoots/PonyBoots_Lock.png deleted file mode 100644 index cbe45d40a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/PonyBoots_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/PonyBoots_Normal.png b/Assets/Female3DCG/ItemBoots/PonyBoots_Normal.png deleted file mode 100644 index 905d5633a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/PonyBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/PonyBoots_Small.png b/Assets/Female3DCG/ItemBoots/PonyBoots_Small.png deleted file mode 100644 index 252108e1c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/PonyBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/PonyBoots_XLarge.png b/Assets/Female3DCG/ItemBoots/PonyBoots_XLarge.png deleted file mode 100644 index 53a41b50d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/PonyBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/BalletHeels.png b/Assets/Female3DCG/ItemBoots/Preview/BalletHeels.png deleted file mode 100644 index 0ac6ffa18..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/BalletHeels.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/BalletWedges.png b/Assets/Female3DCG/ItemBoots/Preview/BalletWedges.png deleted file mode 100644 index 044d0dd98..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/BalletWedges.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/FuturisticHeels.png b/Assets/Female3DCG/ItemBoots/Preview/FuturisticHeels.png deleted file mode 100644 index 71403ed72..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/FuturisticHeels.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/FuturisticHeels2.png b/Assets/Female3DCG/ItemBoots/Preview/FuturisticHeels2.png deleted file mode 100644 index 9dee7f22f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/FuturisticHeels2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/HighThighBoots.png b/Assets/Female3DCG/ItemBoots/Preview/HighThighBoots.png deleted file mode 100644 index 24c3634d8..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/HighThighBoots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/LeatherFootMitts1.png b/Assets/Female3DCG/ItemBoots/Preview/LeatherFootMitts1.png deleted file mode 100644 index de1c65a5c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/LeatherFootMitts1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/LeatherToeCuffs.png b/Assets/Female3DCG/ItemBoots/Preview/LeatherToeCuffs.png deleted file mode 100644 index 118c19704..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/LeatherToeCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/LockingBoots1.png b/Assets/Female3DCG/ItemBoots/Preview/LockingBoots1.png deleted file mode 100644 index f4d323264..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/LockingBoots1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/LockingHeels.png b/Assets/Female3DCG/ItemBoots/Preview/LockingHeels.png deleted file mode 100644 index 01434e134..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/LockingHeels.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/LockingHeels2.png b/Assets/Female3DCG/ItemBoots/Preview/LockingHeels2.png deleted file mode 100644 index 487a5f797..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/LockingHeels2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/LockingShoes1.png b/Assets/Female3DCG/ItemBoots/Preview/LockingShoes1.png deleted file mode 100644 index 86a00e3d0..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/LockingShoes1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/LockingShoes2.png b/Assets/Female3DCG/ItemBoots/Preview/LockingShoes2.png deleted file mode 100644 index 70ecdf6c9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/LockingShoes2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/MonoHeel.png b/Assets/Female3DCG/ItemBoots/Preview/MonoHeel.png deleted file mode 100644 index 48826e30d..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/MonoHeel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/PonyBoots.png b/Assets/Female3DCG/ItemBoots/Preview/PonyBoots.png deleted file mode 100644 index c12afe14c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/PonyBoots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/Slime.png b/Assets/Female3DCG/ItemBoots/Preview/Slime.png deleted file mode 100644 index 2f1b835e0..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/Slime.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/ThighHighLatexHeels.png b/Assets/Female3DCG/ItemBoots/Preview/ThighHighLatexHeels.png deleted file mode 100644 index bc6c0dc94..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/ThighHighLatexHeels.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/ToeCuffs.png b/Assets/Female3DCG/ItemBoots/Preview/ToeCuffs.png deleted file mode 100644 index 64c1601f2..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/ToeCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/ToeTape.png b/Assets/Female3DCG/ItemBoots/Preview/ToeTape.png deleted file mode 100644 index f86bb58bc..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/ToeTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/ToeTie.png b/Assets/Female3DCG/ItemBoots/Preview/ToeTie.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/ToeTie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Preview/Zipties.png b/Assets/Female3DCG/ItemBoots/Preview/Zipties.png deleted file mode 100644 index 781403069..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Preview/Zipties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Cuffs.png b/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Cuffs.png deleted file mode 100644 index 6f271d70a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Display.png b/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Display.png deleted file mode 100644 index 150088754..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Lock.png b/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Lock.png deleted file mode 100644 index 232382e17..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Mesh.png b/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Mesh.png deleted file mode 100644 index 1c147d47b..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Shine.png b/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Shine.png deleted file mode 100644 index cd2335e14..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Soles.png b/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Soles.png deleted file mode 100644 index 350504b64..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Trim.png b/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Trim.png deleted file mode 100644 index a77d57247..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/FuturisticHeels2_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Large.png b/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Large.png deleted file mode 100644 index 346327d73..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Lock.png b/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Normal.png b/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Normal.png deleted file mode 100644 index 0ec07932a..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Small.png b/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Small.png deleted file mode 100644 index 40d63ac55..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_XLarge.png b/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_XLarge.png deleted file mode 100644 index 631c0ac56..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Spread/HighThighBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Large.png b/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Large.png deleted file mode 100644 index 359e16eff..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Lock.png b/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Lock.png deleted file mode 100644 index b99b827db..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Normal.png b/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Normal.png deleted file mode 100644 index 5667a0546..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Small.png b/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Small.png deleted file mode 100644 index a103c10d6..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_XLarge.png b/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_XLarge.png deleted file mode 100644 index 2597a1f10..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ThighHighLatexHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeCuffs_Large.png b/Assets/Female3DCG/ItemBoots/ToeCuffs_Large.png deleted file mode 100644 index 7c52ede03..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeCuffs_Lock.png b/Assets/Female3DCG/ItemBoots/ToeCuffs_Lock.png deleted file mode 100644 index 08f461af9..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeCuffs_Normal.png b/Assets/Female3DCG/ItemBoots/ToeCuffs_Normal.png deleted file mode 100644 index 7c52ede03..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeCuffs_Small.png b/Assets/Female3DCG/ItemBoots/ToeCuffs_Small.png deleted file mode 100644 index 7c52ede03..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeCuffs_XLarge.png b/Assets/Female3DCG/ItemBoots/ToeCuffs_XLarge.png deleted file mode 100644 index 7c52ede03..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTape_Large.png b/Assets/Female3DCG/ItemBoots/ToeTape_Large.png deleted file mode 100644 index 30eef1fb4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTape_LargeFull.png b/Assets/Female3DCG/ItemBoots/ToeTape_LargeFull.png deleted file mode 100644 index bc8909d4c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTape_LargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTape_Normal.png b/Assets/Female3DCG/ItemBoots/ToeTape_Normal.png deleted file mode 100644 index 30eef1fb4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTape_NormalFull.png b/Assets/Female3DCG/ItemBoots/ToeTape_NormalFull.png deleted file mode 100644 index bc8909d4c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTape_NormalFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTape_Small.png b/Assets/Female3DCG/ItemBoots/ToeTape_Small.png deleted file mode 100644 index 30eef1fb4..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTape_SmallFull.png b/Assets/Female3DCG/ItemBoots/ToeTape_SmallFull.png deleted file mode 100644 index bc8909d4c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTape_SmallFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTape_XLarge.png b/Assets/Female3DCG/ItemBoots/ToeTape_XLarge.png deleted file mode 100644 index 504adcad1..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTape_XLargeFull.png b/Assets/Female3DCG/ItemBoots/ToeTape_XLargeFull.png deleted file mode 100644 index bc8909d4c..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTape_XLargeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTie_Large.png b/Assets/Female3DCG/ItemBoots/ToeTie_Large.png deleted file mode 100644 index b7259617f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTie_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTie_Normal.png b/Assets/Female3DCG/ItemBoots/ToeTie_Normal.png deleted file mode 100644 index b7259617f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTie_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTie_Small.png b/Assets/Female3DCG/ItemBoots/ToeTie_Small.png deleted file mode 100644 index b7259617f..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTie_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/ToeTie_XLarge.png b/Assets/Female3DCG/ItemBoots/ToeTie_XLarge.png deleted file mode 100644 index d90002752..000000000 Binary files a/Assets/Female3DCG/ItemBoots/ToeTie_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Zipties_Large.png b/Assets/Female3DCG/ItemBoots/Zipties_Large.png deleted file mode 100644 index 1f81b2eaa..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Zipties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Zipties_Normal.png b/Assets/Female3DCG/ItemBoots/Zipties_Normal.png deleted file mode 100644 index 1f81b2eaa..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Zipties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Zipties_Small.png b/Assets/Female3DCG/ItemBoots/Zipties_Small.png deleted file mode 100644 index 1f81b2eaa..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Zipties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBoots/Zipties_XLarge.png b/Assets/Female3DCG/ItemBoots/Zipties_XLarge.png deleted file mode 100644 index 1f81b2eaa..000000000 Binary files a/Assets/Female3DCG/ItemBoots/Zipties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Large.png b/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Large.png deleted file mode 100644 index 4b7b465ec..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Lock.png b/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Lock.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Normal.png b/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Normal.png deleted file mode 100644 index 53ff42dda..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Small.png b/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Small.png deleted file mode 100644 index 82a4cd890..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_XLarge.png b/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_XLarge.png deleted file mode 100644 index 7ff073dd4..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/LeatherBreastBinder_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Large.png b/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Large.png deleted file mode 100644 index 3a0f13ba8..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Lock.png b/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Lock.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Normal.png b/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Normal.png deleted file mode 100644 index bb8593d11..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Small.png b/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Small.png deleted file mode 100644 index 5dd6a02fc..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_XLarge.png b/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_XLarge.png deleted file mode 100644 index c9ab386bf..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/MetalChastityBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Large_Bra.png b/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Large_Bra.png deleted file mode 100644 index e878eb1de..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Large_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Large_Gems.png b/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Large_Gems.png deleted file mode 100644 index 35b3e7579..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Lock.png b/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Lock.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Normal_Bra.png b/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Normal_Bra.png deleted file mode 100644 index 5f8cc2153..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Normal_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Normal_Gems.png b/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Normal_Gems.png deleted file mode 100644 index b82c00210..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Small_Bra.png b/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Small_Bra.png deleted file mode 100644 index 04139e812..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Small_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Small_Gems.png b/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Small_Gems.png deleted file mode 100644 index 73eab5938..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_XLarge_Bra.png b/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_XLarge_Bra.png deleted file mode 100644 index 50276fe5a..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_XLarge_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_XLarge_Gems.png b/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_XLarge_Gems.png deleted file mode 100644 index 896f87f21..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/OrnateChastityBra_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Large.png b/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Large.png deleted file mode 100644 index 06cc9074b..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Lock.png b/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Lock.png deleted file mode 100644 index c6b88ea72..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Normal.png b/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Normal.png deleted file mode 100644 index f147467b6..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Small.png b/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Small.png deleted file mode 100644 index 490d6b183..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_XLarge.png b/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_XLarge.png deleted file mode 100644 index 96e94c1c2..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/PolishedChastityBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_Large.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_Large.png deleted file mode 100644 index 65006b11d..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_LargeLightWrapBow.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_LargeLightWrapBow.png deleted file mode 100644 index 65006b11d..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_LargeLightWrapBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_LargeWrap.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_LargeWrap.png deleted file mode 100644 index 2af446c2d..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_LargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_Normal.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_Normal.png deleted file mode 100644 index 82c20539b..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_NormalLightWrapBow.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_NormalLightWrapBow.png deleted file mode 100644 index b83147ed7..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_NormalLightWrapBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_NormalWrap.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_NormalWrap.png deleted file mode 100644 index 7d9487e14..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_NormalWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_Small.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_Small.png deleted file mode 100644 index d5a75047d..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_SmallLightWrapBow.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_SmallLightWrapBow.png deleted file mode 100644 index 153c87f14..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_SmallLightWrapBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_SmallWrap.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_SmallWrap.png deleted file mode 100644 index fad4f39bb..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_SmallWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_XLarge.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_XLarge.png deleted file mode 100644 index 6b7f1dc88..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_XLargeLightWrapBow.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_XLargeLightWrapBow.png deleted file mode 100644 index 1cfaa57c6..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_XLargeLightWrapBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_XLargeWrap.png b/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_XLargeWrap.png deleted file mode 100644 index 2d5e53cc0..000000000 Binary files a/Assets/Female3DCG/ItemBreast/AllFours/Ribbons_XLargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2NoDisplayMatte_Lock.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2NoDisplayMatte_Lock.png deleted file mode 100644 index df75395bf..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2NoDisplayMatte_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2NoDisplay_Lock.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2NoDisplay_Lock.png deleted file mode 100644 index df75395bf..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2NoDisplay_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Display.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Display.png deleted file mode 100644 index 014b960fa..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Bra.png deleted file mode 100644 index 93daaa751..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Mesh.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Mesh.png deleted file mode 100644 index 7104222c8..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Shine.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Shine.png deleted file mode 100644 index c93c64331..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Straps.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Straps.png deleted file mode 100644 index 3d69e96ee..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Lock.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Lock.png deleted file mode 100644 index 702bb5169..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Bra.png deleted file mode 100644 index 231d83813..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Mesh.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Mesh.png deleted file mode 100644 index eb0f0fab7..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Shine.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Shine.png deleted file mode 100644 index 56c9a0673..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Straps.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Straps.png deleted file mode 100644 index f122544cd..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Bra.png deleted file mode 100644 index bd6c7aa94..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Mesh.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Mesh.png deleted file mode 100644 index aefa044bf..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Shine.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Shine.png deleted file mode 100644 index 58b716429..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Straps.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Straps.png deleted file mode 100644 index 610d3ef96..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Bra.png deleted file mode 100644 index 3f19e5810..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Mesh.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Mesh.png deleted file mode 100644 index b952d06bb..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Shine.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Shine.png deleted file mode 100644 index d395789ef..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Straps.png b/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Straps.png deleted file mode 100644 index 3c1110264..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra2_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBraHeart_Lock.png b/Assets/Female3DCG/ItemBreast/FuturisticBraHeart_Lock.png deleted file mode 100644 index 59b5ddcfc..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBraHeart_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBraSolid_Lock.png b/Assets/Female3DCG/ItemBreast/FuturisticBraSolid_Lock.png deleted file mode 100644 index 59b5ddcfc..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBraSolid_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeHeart_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeHeart_Bra.png deleted file mode 100644 index acca2b486..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeHeart_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeHeart_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeHeart_Text.png deleted file mode 100644 index ac9a8dcc3..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeHeart_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2Heart_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2Heart_Bra.png deleted file mode 100644 index 153c6921e..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2Heart_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2Heart_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2Heart_Text.png deleted file mode 100644 index ac9a8dcc3..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2Heart_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2_Bra.png deleted file mode 100644 index 153c6921e..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2_Text.png deleted file mode 100644 index e4e70d602..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeShow2_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeSolid2_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeSolid2_Bra.png deleted file mode 100644 index 8f672d897..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeSolid2_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeSolid_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeSolid_Bra.png deleted file mode 100644 index 766a0eb64..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_LargeSolid_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Bra.png deleted file mode 100644 index acca2b486..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Display.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Display.png deleted file mode 100644 index 5648bb51b..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Mesh.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Mesh.png deleted file mode 100644 index 0267ad371..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Mesh2.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Mesh2.png deleted file mode 100644 index 14da7f6ff..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Text.png deleted file mode 100644 index e4e70d602..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Large_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Lock.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Lock.png deleted file mode 100644 index 59b5ddcfc..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalHeart_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalHeart_Bra.png deleted file mode 100644 index 72f2aea35..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalHeart_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalHeart_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalHeart_Text.png deleted file mode 100644 index 41aea05ef..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalHeart_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2Heart_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2Heart_Bra.png deleted file mode 100644 index 221e11075..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2Heart_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2Heart_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2Heart_Text.png deleted file mode 100644 index 41aea05ef..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2Heart_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2_Bra.png deleted file mode 100644 index 221e11075..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2_Text.png deleted file mode 100644 index e4e70d602..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalShow2_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalSolid2_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalSolid2_Bra.png deleted file mode 100644 index 55ac805f1..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalSolid2_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalSolid_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalSolid_Bra.png deleted file mode 100644 index e6f58cc31..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_NormalSolid_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Bra.png deleted file mode 100644 index e5a25182c..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Display.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Display.png deleted file mode 100644 index c0a11879a..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Mesh.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Mesh.png deleted file mode 100644 index a353e8bf4..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Mesh2.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Mesh2.png deleted file mode 100644 index d59794b2c..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Text.png deleted file mode 100644 index e4e70d602..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Normal_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallHeart_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallHeart_Bra.png deleted file mode 100644 index 7377bb755..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallHeart_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallHeart_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallHeart_Text.png deleted file mode 100644 index 84aa643ff..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallHeart_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2Heart_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2Heart_Bra.png deleted file mode 100644 index 403b7e884..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2Heart_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2Heart_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2Heart_Text.png deleted file mode 100644 index 84aa643ff..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2Heart_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2_Bra.png deleted file mode 100644 index 403b7e884..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2_Text.png deleted file mode 100644 index e4e70d602..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallShow2_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallSolid2_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallSolid2_Bra.png deleted file mode 100644 index 5166dbdde..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallSolid2_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallSolid_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallSolid_Bra.png deleted file mode 100644 index dd9d83678..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_SmallSolid_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Bra.png deleted file mode 100644 index 7377bb755..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Display.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Display.png deleted file mode 100644 index 1941533e1..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Mesh.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Mesh.png deleted file mode 100644 index 5f2f29c80..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Mesh2.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Mesh2.png deleted file mode 100644 index 477b24cab..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Text.png deleted file mode 100644 index e4e70d602..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_Small_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeHeart_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeHeart_Bra.png deleted file mode 100644 index 6b178b269..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeHeart_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeHeart_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeHeart_Text.png deleted file mode 100644 index 9d1c5adea..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeHeart_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2Heart_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2Heart_Bra.png deleted file mode 100644 index fb57d91fa..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2Heart_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2Heart_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2Heart_Text.png deleted file mode 100644 index 9d1c5adea..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2Heart_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2_Bra.png deleted file mode 100644 index fb57d91fa..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2_Text.png deleted file mode 100644 index e4e70d602..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeShow2_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeSolid2_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeSolid2_Bra.png deleted file mode 100644 index f59a4c06d..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeSolid2_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeSolid_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeSolid_Bra.png deleted file mode 100644 index 0a4a365d5..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLargeSolid_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Bra.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Bra.png deleted file mode 100644 index 6b178b269..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Display.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Display.png deleted file mode 100644 index 72c1d5b32..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Mesh.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Mesh.png deleted file mode 100644 index 7c6a0e7dd..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Mesh2.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Mesh2.png deleted file mode 100644 index dfea6562d..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Text.png b/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Text.png deleted file mode 100644 index e4e70d602..000000000 Binary files a/Assets/Female3DCG/ItemBreast/FuturisticBra_XLarge_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Large.png b/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Large.png deleted file mode 100644 index 2438d424f..000000000 Binary files a/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Lock.png b/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Lock.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Normal.png b/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Normal.png deleted file mode 100644 index 9fba1b806..000000000 Binary files a/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Small.png b/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Small.png deleted file mode 100644 index 839e45d85..000000000 Binary files a/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_XLarge.png b/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_XLarge.png deleted file mode 100644 index f6f8fb2f7..000000000 Binary files a/Assets/Female3DCG/ItemBreast/LeatherBreastBinder_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/MetalChastityBra_Large.png b/Assets/Female3DCG/ItemBreast/MetalChastityBra_Large.png deleted file mode 100644 index e9de5b0c4..000000000 Binary files a/Assets/Female3DCG/ItemBreast/MetalChastityBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/MetalChastityBra_Lock.png b/Assets/Female3DCG/ItemBreast/MetalChastityBra_Lock.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ItemBreast/MetalChastityBra_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/MetalChastityBra_Normal.png b/Assets/Female3DCG/ItemBreast/MetalChastityBra_Normal.png deleted file mode 100644 index 02a261893..000000000 Binary files a/Assets/Female3DCG/ItemBreast/MetalChastityBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/MetalChastityBra_Small.png b/Assets/Female3DCG/ItemBreast/MetalChastityBra_Small.png deleted file mode 100644 index d1fcb4dfc..000000000 Binary files a/Assets/Female3DCG/ItemBreast/MetalChastityBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/MetalChastityBra_XLarge.png b/Assets/Female3DCG/ItemBreast/MetalChastityBra_XLarge.png deleted file mode 100644 index 3073d761f..000000000 Binary files a/Assets/Female3DCG/ItemBreast/MetalChastityBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Large_Bra.png b/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Large_Bra.png deleted file mode 100644 index f19e8e714..000000000 Binary files a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Large_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Large_Gems.png b/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Large_Gems.png deleted file mode 100644 index 1fe3a9c22..000000000 Binary files a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Lock.png b/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Lock.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Normal_Bra.png b/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Normal_Bra.png deleted file mode 100644 index c12939f86..000000000 Binary files a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Normal_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Normal_Gems.png b/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Normal_Gems.png deleted file mode 100644 index 3bd8f683c..000000000 Binary files a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Small_Bra.png b/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Small_Bra.png deleted file mode 100644 index 5360be795..000000000 Binary files a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Small_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Small_Gems.png b/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Small_Gems.png deleted file mode 100644 index d32614f5d..000000000 Binary files a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_XLarge_Bra.png b/Assets/Female3DCG/ItemBreast/OrnateChastityBra_XLarge_Bra.png deleted file mode 100644 index 3b5ea4f58..000000000 Binary files a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_XLarge_Bra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_XLarge_Gems.png b/Assets/Female3DCG/ItemBreast/OrnateChastityBra_XLarge_Gems.png deleted file mode 100644 index 41ca1936f..000000000 Binary files a/Assets/Female3DCG/ItemBreast/OrnateChastityBra_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Large.png b/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Large.png deleted file mode 100644 index db1f9d921..000000000 Binary files a/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Lock.png b/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Lock.png deleted file mode 100644 index c6b88ea72..000000000 Binary files a/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Normal.png b/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Normal.png deleted file mode 100644 index afe356431..000000000 Binary files a/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Small.png b/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Small.png deleted file mode 100644 index 5a5e2402e..000000000 Binary files a/Assets/Female3DCG/ItemBreast/PolishedChastityBra_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/PolishedChastityBra_XLarge.png b/Assets/Female3DCG/ItemBreast/PolishedChastityBra_XLarge.png deleted file mode 100644 index 84dd01c63..000000000 Binary files a/Assets/Female3DCG/ItemBreast/PolishedChastityBra_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Preview/FuturisticBra.png b/Assets/Female3DCG/ItemBreast/Preview/FuturisticBra.png deleted file mode 100644 index bb321d335..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Preview/FuturisticBra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Preview/FuturisticBra2.png b/Assets/Female3DCG/ItemBreast/Preview/FuturisticBra2.png deleted file mode 100644 index 6925b2f8c..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Preview/FuturisticBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Preview/LeatherBreastBinder.png b/Assets/Female3DCG/ItemBreast/Preview/LeatherBreastBinder.png deleted file mode 100644 index 42641bed1..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Preview/LeatherBreastBinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Preview/MetalChastityBra.png b/Assets/Female3DCG/ItemBreast/Preview/MetalChastityBra.png deleted file mode 100644 index 0f625a18a..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Preview/MetalChastityBra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Preview/OrnateChastityBra.png b/Assets/Female3DCG/ItemBreast/Preview/OrnateChastityBra.png deleted file mode 100644 index 254286488..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Preview/OrnateChastityBra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Preview/PolishedChastityBra.png b/Assets/Female3DCG/ItemBreast/Preview/PolishedChastityBra.png deleted file mode 100644 index b70be1993..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Preview/PolishedChastityBra.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Preview/Ribbons.png b/Assets/Female3DCG/ItemBreast/Preview/Ribbons.png deleted file mode 100644 index 7d3f73b67..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Preview/Ribbons.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_Large.png b/Assets/Female3DCG/ItemBreast/Ribbons_Large.png deleted file mode 100644 index d62f9ee62..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_LargeLightWrapBow.png b/Assets/Female3DCG/ItemBreast/Ribbons_LargeLightWrapBow.png deleted file mode 100644 index e55367773..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_LargeLightWrapBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_LargeWrap.png b/Assets/Female3DCG/ItemBreast/Ribbons_LargeWrap.png deleted file mode 100644 index caf390eda..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_LargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_Normal.png b/Assets/Female3DCG/ItemBreast/Ribbons_Normal.png deleted file mode 100644 index 2e562d040..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_NormalLightWrapBow.png b/Assets/Female3DCG/ItemBreast/Ribbons_NormalLightWrapBow.png deleted file mode 100644 index a3d04b834..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_NormalLightWrapBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_NormalWrap.png b/Assets/Female3DCG/ItemBreast/Ribbons_NormalWrap.png deleted file mode 100644 index c98c3b3d6..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_NormalWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_Small.png b/Assets/Female3DCG/ItemBreast/Ribbons_Small.png deleted file mode 100644 index 9fbd25bff..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_SmallLightWrapBow.png b/Assets/Female3DCG/ItemBreast/Ribbons_SmallLightWrapBow.png deleted file mode 100644 index e73e96e19..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_SmallLightWrapBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_SmallWrap.png b/Assets/Female3DCG/ItemBreast/Ribbons_SmallWrap.png deleted file mode 100644 index e4a8e97d4..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_SmallWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_XLarge.png b/Assets/Female3DCG/ItemBreast/Ribbons_XLarge.png deleted file mode 100644 index eb8ec0398..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_XLargeLightWrapBow.png b/Assets/Female3DCG/ItemBreast/Ribbons_XLargeLightWrapBow.png deleted file mode 100644 index 20d5034da..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_XLargeLightWrapBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemBreast/Ribbons_XLargeWrap.png b/Assets/Female3DCG/ItemBreast/Ribbons_XLargeWrap.png deleted file mode 100644 index 2f3f88bfc..000000000 Binary files a/Assets/Female3DCG/ItemBreast/Ribbons_XLargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLock.png b/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainLong.png b/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainLong.png deleted file mode 100644 index a5d42995d..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainLong_Lock.png b/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainLong_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainLong_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainShort.png b/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainShort.png deleted file mode 100644 index 67a81f814..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainShort.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainShort_Lock.png b/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainShort_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLockChainShort_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLock_Lock.png b/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLock_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/ButtPlugLock_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/Cowtail.png b/Assets/Female3DCG/ItemButt/AllFours/Cowtail.png deleted file mode 100644 index 86a99820f..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/Cowtail.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/HorsetailPlug.png b/Assets/Female3DCG/ItemButt/AllFours/HorsetailPlug.png deleted file mode 100644 index ad1a86acc..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/HorsetailPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/HorsetailPlug1.png b/Assets/Female3DCG/ItemButt/AllFours/HorsetailPlug1.png deleted file mode 100644 index 98ff87b99..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/HorsetailPlug1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/KittenTail1.png b/Assets/Female3DCG/ItemButt/AllFours/KittenTail1.png deleted file mode 100644 index 46b2f0e0e..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/KittenTail1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/KittenTail2.png b/Assets/Female3DCG/ItemButt/AllFours/KittenTail2.png deleted file mode 100644 index 98ff684db..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/KittenTail2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/MouseTail1.png b/Assets/Female3DCG/ItemButt/AllFours/MouseTail1.png deleted file mode 100644 index f1852b8aa..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/MouseTail1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/MouseTail2.png b/Assets/Female3DCG/ItemButt/AllFours/MouseTail2.png deleted file mode 100644 index 67dbed132..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/MouseTail2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/PuppyTailPlug.png b/Assets/Female3DCG/ItemButt/AllFours/PuppyTailPlug.png deleted file mode 100644 index d72069124..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/PuppyTailPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/SuccubusButtPlug.png b/Assets/Female3DCG/ItemButt/AllFours/SuccubusButtPlug.png deleted file mode 100644 index 22bd36319..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/SuccubusButtPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/TailButtPlug.png b/Assets/Female3DCG/ItemButt/AllFours/TailButtPlug.png deleted file mode 100644 index 91834d4bc..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/TailButtPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/WolfTail2.png b/Assets/Female3DCG/ItemButt/AllFours/WolfTail2.png deleted file mode 100644 index d819d5c94..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/WolfTail2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AllFours/WolfTail3.png b/Assets/Female3DCG/ItemButt/AllFours/WolfTail3.png deleted file mode 100644 index b6c049f74..000000000 Binary files a/Assets/Female3DCG/ItemButt/AllFours/WolfTail3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AnalBeads2.png b/Assets/Female3DCG/ItemButt/AnalBeads2.png deleted file mode 100644 index 1d392d581..000000000 Binary files a/Assets/Female3DCG/ItemButt/AnalBeads2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AnalBeads2Base.png b/Assets/Female3DCG/ItemButt/AnalBeads2Base.png deleted file mode 100644 index 1d392d581..000000000 Binary files a/Assets/Female3DCG/ItemButt/AnalBeads2Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AnalBeads2_2in.png b/Assets/Female3DCG/ItemButt/AnalBeads2_2in.png deleted file mode 100644 index 1391bcfce..000000000 Binary files a/Assets/Female3DCG/ItemButt/AnalBeads2_2in.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AnalBeads2_3in.png b/Assets/Female3DCG/ItemButt/AnalBeads2_3in.png deleted file mode 100644 index 0d0914312..000000000 Binary files a/Assets/Female3DCG/ItemButt/AnalBeads2_3in.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AnalBeads2_4in.png b/Assets/Female3DCG/ItemButt/AnalBeads2_4in.png deleted file mode 100644 index 7b7d40de8..000000000 Binary files a/Assets/Female3DCG/ItemButt/AnalBeads2_4in.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AnalBeads2_5in.png b/Assets/Female3DCG/ItemButt/AnalBeads2_5in.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemButt/AnalBeads2_5in.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AnalHook.png b/Assets/Female3DCG/ItemButt/AnalHook.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemButt/AnalHook.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AnalHookChain.png b/Assets/Female3DCG/ItemButt/AnalHookChain.png deleted file mode 100644 index bb33c09c9..000000000 Binary files a/Assets/Female3DCG/ItemButt/AnalHookChain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/AnalHookHair.png b/Assets/Female3DCG/ItemButt/AnalHookHair.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemButt/AnalHookHair.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/ButtPlugLock.png b/Assets/Female3DCG/ItemButt/ButtPlugLock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemButt/ButtPlugLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/ButtPlugLockChainLong.png b/Assets/Female3DCG/ItemButt/ButtPlugLockChainLong.png deleted file mode 100644 index b34f519a1..000000000 Binary files a/Assets/Female3DCG/ItemButt/ButtPlugLockChainLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/ButtPlugLockChainLong_Lock.png b/Assets/Female3DCG/ItemButt/ButtPlugLockChainLong_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemButt/ButtPlugLockChainLong_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/ButtPlugLockChainShort.png b/Assets/Female3DCG/ItemButt/ButtPlugLockChainShort.png deleted file mode 100644 index c31909790..000000000 Binary files a/Assets/Female3DCG/ItemButt/ButtPlugLockChainShort.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/ButtPlugLockChainShort_Lock.png b/Assets/Female3DCG/ItemButt/ButtPlugLockChainShort_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemButt/ButtPlugLockChainShort_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/ButtPlugLock_Lock.png b/Assets/Female3DCG/ItemButt/ButtPlugLock_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemButt/ButtPlugLock_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Cowtail.png b/Assets/Female3DCG/ItemButt/Cowtail.png deleted file mode 100644 index b1569f55c..000000000 Binary files a/Assets/Female3DCG/ItemButt/Cowtail.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/DemonPlug.png b/Assets/Female3DCG/ItemButt/DemonPlug.png deleted file mode 100644 index a0c8e7056..000000000 Binary files a/Assets/Female3DCG/ItemButt/DemonPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/FoxTail1_Base.png b/Assets/Female3DCG/ItemButt/FoxTail1_Base.png deleted file mode 100644 index 642d0a86c..000000000 Binary files a/Assets/Female3DCG/ItemButt/FoxTail1_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/FoxTail1_Tip.png b/Assets/Female3DCG/ItemButt/FoxTail1_Tip.png deleted file mode 100644 index 0e3342ec0..000000000 Binary files a/Assets/Female3DCG/ItemButt/FoxTail1_Tip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/FoxTail2_Base.png b/Assets/Female3DCG/ItemButt/FoxTail2_Base.png deleted file mode 100644 index cd26b9351..000000000 Binary files a/Assets/Female3DCG/ItemButt/FoxTail2_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/FoxTail2_Tip.png b/Assets/Female3DCG/ItemButt/FoxTail2_Tip.png deleted file mode 100644 index 948f6ea99..000000000 Binary files a/Assets/Female3DCG/ItemButt/FoxTail2_Tip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/FoxTails_Bases.png b/Assets/Female3DCG/ItemButt/FoxTails_Bases.png deleted file mode 100644 index b9a783fd8..000000000 Binary files a/Assets/Female3DCG/ItemButt/FoxTails_Bases.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/FoxTails_Tips.png b/Assets/Female3DCG/ItemButt/FoxTails_Tips.png deleted file mode 100644 index 65bffc6b1..000000000 Binary files a/Assets/Female3DCG/ItemButt/FoxTails_Tips.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/HorsetailPlug.png b/Assets/Female3DCG/ItemButt/HorsetailPlug.png deleted file mode 100644 index b26a6390c..000000000 Binary files a/Assets/Female3DCG/ItemButt/HorsetailPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/HorsetailPlug1.png b/Assets/Female3DCG/ItemButt/HorsetailPlug1.png deleted file mode 100644 index 33781d3f5..000000000 Binary files a/Assets/Female3DCG/ItemButt/HorsetailPlug1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/KittenTail1.png b/Assets/Female3DCG/ItemButt/KittenTail1.png deleted file mode 100644 index 3cf915e38..000000000 Binary files a/Assets/Female3DCG/ItemButt/KittenTail1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/KittenTail2.png b/Assets/Female3DCG/ItemButt/KittenTail2.png deleted file mode 100644 index f02577ca3..000000000 Binary files a/Assets/Female3DCG/ItemButt/KittenTail2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/MouseTail1.png b/Assets/Female3DCG/ItemButt/MouseTail1.png deleted file mode 100644 index f1852b8aa..000000000 Binary files a/Assets/Female3DCG/ItemButt/MouseTail1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/MouseTail2.png b/Assets/Female3DCG/ItemButt/MouseTail2.png deleted file mode 100644 index 67dbed132..000000000 Binary files a/Assets/Female3DCG/ItemButt/MouseTail2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/AnalBeads.png b/Assets/Female3DCG/ItemButt/Preview/AnalBeads.png deleted file mode 100644 index b8354840e..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/AnalBeads.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/AnalBeads2.png b/Assets/Female3DCG/ItemButt/Preview/AnalBeads2.png deleted file mode 100644 index 8ae8e4120..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/AnalBeads2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/AnalHook.png b/Assets/Female3DCG/ItemButt/Preview/AnalHook.png deleted file mode 100644 index 857e8657b..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/AnalHook.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/BlackButtPlug.png b/Assets/Female3DCG/ItemButt/Preview/BlackButtPlug.png deleted file mode 100644 index 57b8b1ed4..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/BlackButtPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/BunnyTailPlug1.png b/Assets/Female3DCG/ItemButt/Preview/BunnyTailPlug1.png deleted file mode 100644 index 97baae67f..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/BunnyTailPlug1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/BunnyTailPlug2.png b/Assets/Female3DCG/ItemButt/Preview/BunnyTailPlug2.png deleted file mode 100644 index e48515f6e..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/BunnyTailPlug2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/BunnyTailVibePlug.png b/Assets/Female3DCG/ItemButt/Preview/BunnyTailVibePlug.png deleted file mode 100644 index 9b886d8d6..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/BunnyTailVibePlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/ButtPlugLock.png b/Assets/Female3DCG/ItemButt/Preview/ButtPlugLock.png deleted file mode 100644 index bca8ad095..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/ButtPlugLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/ButtPump.png b/Assets/Female3DCG/ItemButt/Preview/ButtPump.png deleted file mode 100644 index d3e989173..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/ButtPump.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/Cowtail.png b/Assets/Female3DCG/ItemButt/Preview/Cowtail.png deleted file mode 100644 index 5bd902efe..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/Cowtail.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/DemonPlug.png b/Assets/Female3DCG/ItemButt/Preview/DemonPlug.png deleted file mode 100644 index 0a053dfcf..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/DemonPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/EggVibePlugXXL.png b/Assets/Female3DCG/ItemButt/Preview/EggVibePlugXXL.png deleted file mode 100644 index bd9c30ee8..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/EggVibePlugXXL.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/FoxTail1.png b/Assets/Female3DCG/ItemButt/Preview/FoxTail1.png deleted file mode 100644 index c8e64b35d..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/FoxTail1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/FoxTail2.png b/Assets/Female3DCG/ItemButt/Preview/FoxTail2.png deleted file mode 100644 index 5fa8a22f9..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/FoxTail2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/FoxTails.png b/Assets/Female3DCG/ItemButt/Preview/FoxTails.png deleted file mode 100644 index 52907d53a..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/FoxTails.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/HollowButtPlug.png b/Assets/Female3DCG/ItemButt/Preview/HollowButtPlug.png deleted file mode 100644 index 861da5ba0..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/HollowButtPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/HorsetailPlug.png b/Assets/Female3DCG/ItemButt/Preview/HorsetailPlug.png deleted file mode 100644 index 90b437d21..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/HorsetailPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/HorsetailPlug1.png b/Assets/Female3DCG/ItemButt/Preview/HorsetailPlug1.png deleted file mode 100644 index d32a01fc1..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/HorsetailPlug1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/InflVibeButtPlug.png b/Assets/Female3DCG/ItemButt/Preview/InflVibeButtPlug.png deleted file mode 100644 index 7b1613850..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/InflVibeButtPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/KittenTail1.png b/Assets/Female3DCG/ItemButt/Preview/KittenTail1.png deleted file mode 100644 index 60faf34cb..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/KittenTail1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/KittenTail2.png b/Assets/Female3DCG/ItemButt/Preview/KittenTail2.png deleted file mode 100644 index fb5579503..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/KittenTail2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/LockingVibePlug.png b/Assets/Female3DCG/ItemButt/Preview/LockingVibePlug.png deleted file mode 100644 index d17ef0cd2..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/LockingVibePlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/MouseTail1.png b/Assets/Female3DCG/ItemButt/Preview/MouseTail1.png deleted file mode 100644 index 4e00ee09b..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/MouseTail1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/MouseTail2.png b/Assets/Female3DCG/ItemButt/Preview/MouseTail2.png deleted file mode 100644 index 55f6d3022..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/MouseTail2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/PenisPlug.png b/Assets/Female3DCG/ItemButt/Preview/PenisPlug.png deleted file mode 100644 index 444c022bf..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/PenisPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/PuppyTailPlug.png b/Assets/Female3DCG/ItemButt/Preview/PuppyTailPlug.png deleted file mode 100644 index 878fb405e..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/PuppyTailPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/PuppyTailPlug1.png b/Assets/Female3DCG/ItemButt/Preview/PuppyTailPlug1.png deleted file mode 100644 index 24b6e523b..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/PuppyTailPlug1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/RaccoonButtPlug.png b/Assets/Female3DCG/ItemButt/Preview/RaccoonButtPlug.png deleted file mode 100644 index f93251c93..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/RaccoonButtPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/RaccoonTailPlug.png b/Assets/Female3DCG/ItemButt/Preview/RaccoonTailPlug.png deleted file mode 100644 index 9fdb29f7e..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/RaccoonTailPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/ShockPlug.png b/Assets/Female3DCG/ItemButt/Preview/ShockPlug.png deleted file mode 100644 index ed6766823..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/ShockPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/Stitches.png b/Assets/Female3DCG/ItemButt/Preview/Stitches.png deleted file mode 100644 index 6b829ac48..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/Stitches.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/SuccubusButtPlug.png b/Assets/Female3DCG/ItemButt/Preview/SuccubusButtPlug.png deleted file mode 100644 index 685fe3595..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/SuccubusButtPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/SuccubusHeartButtPlug.png b/Assets/Female3DCG/ItemButt/Preview/SuccubusHeartButtPlug.png deleted file mode 100644 index 3cbd3f5b5..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/SuccubusHeartButtPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/TailButtPlug.png b/Assets/Female3DCG/ItemButt/Preview/TailButtPlug.png deleted file mode 100644 index 6cb9fc6ba..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/TailButtPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/VibratingButtplug.png b/Assets/Female3DCG/ItemButt/Preview/VibratingButtplug.png deleted file mode 100644 index de4b4cdd2..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/VibratingButtplug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/VibratingDildoPlug.png b/Assets/Female3DCG/ItemButt/Preview/VibratingDildoPlug.png deleted file mode 100644 index a7394506c..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/VibratingDildoPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/WolfTail1.png b/Assets/Female3DCG/ItemButt/Preview/WolfTail1.png deleted file mode 100644 index ba0b43839..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/WolfTail1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/WolfTail2.png b/Assets/Female3DCG/ItemButt/Preview/WolfTail2.png deleted file mode 100644 index 50025f3f3..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/WolfTail2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/Preview/WolfTail3.png b/Assets/Female3DCG/ItemButt/Preview/WolfTail3.png deleted file mode 100644 index 3377d452f..000000000 Binary files a/Assets/Female3DCG/ItemButt/Preview/WolfTail3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/PuppyTailPlug.png b/Assets/Female3DCG/ItemButt/PuppyTailPlug.png deleted file mode 100644 index 146d4c91f..000000000 Binary files a/Assets/Female3DCG/ItemButt/PuppyTailPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/PuppyTailPlug1.png b/Assets/Female3DCG/ItemButt/PuppyTailPlug1.png deleted file mode 100644 index 9e7b6db1f..000000000 Binary files a/Assets/Female3DCG/ItemButt/PuppyTailPlug1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/RaccoonButtPlug.png b/Assets/Female3DCG/ItemButt/RaccoonButtPlug.png deleted file mode 100644 index a492c2490..000000000 Binary files a/Assets/Female3DCG/ItemButt/RaccoonButtPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/RaccoonTailPlug.png b/Assets/Female3DCG/ItemButt/RaccoonTailPlug.png deleted file mode 100644 index b7570862b..000000000 Binary files a/Assets/Female3DCG/ItemButt/RaccoonTailPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/SuccubusButtPlug.png b/Assets/Female3DCG/ItemButt/SuccubusButtPlug.png deleted file mode 100644 index f9fb341b4..000000000 Binary files a/Assets/Female3DCG/ItemButt/SuccubusButtPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/SuccubusHeartButtPlug_Heart.png b/Assets/Female3DCG/ItemButt/SuccubusHeartButtPlug_Heart.png deleted file mode 100644 index 885fe1e01..000000000 Binary files a/Assets/Female3DCG/ItemButt/SuccubusHeartButtPlug_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/SuccubusHeartButtPlug_Tail.png b/Assets/Female3DCG/ItemButt/SuccubusHeartButtPlug_Tail.png deleted file mode 100644 index 39b1e99f8..000000000 Binary files a/Assets/Female3DCG/ItemButt/SuccubusHeartButtPlug_Tail.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/TailButtPlug_Bell.png b/Assets/Female3DCG/ItemButt/TailButtPlug_Bell.png deleted file mode 100644 index 432b8d1cc..000000000 Binary files a/Assets/Female3DCG/ItemButt/TailButtPlug_Bell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/TailButtPlug_Ribbon.png b/Assets/Female3DCG/ItemButt/TailButtPlug_Ribbon.png deleted file mode 100644 index ee8b68268..000000000 Binary files a/Assets/Female3DCG/ItemButt/TailButtPlug_Ribbon.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/TailButtPlug_Tail.png b/Assets/Female3DCG/ItemButt/TailButtPlug_Tail.png deleted file mode 100644 index 82e2d0c67..000000000 Binary files a/Assets/Female3DCG/ItemButt/TailButtPlug_Tail.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/WolfTail1.png b/Assets/Female3DCG/ItemButt/WolfTail1.png deleted file mode 100644 index 08b1de867..000000000 Binary files a/Assets/Female3DCG/ItemButt/WolfTail1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/WolfTail2.png b/Assets/Female3DCG/ItemButt/WolfTail2.png deleted file mode 100644 index 2b2f15ffd..000000000 Binary files a/Assets/Female3DCG/ItemButt/WolfTail2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemButt/WolfTail3.png b/Assets/Female3DCG/ItemButt/WolfTail3.png deleted file mode 100644 index 7b6cbbc8a..000000000 Binary files a/Assets/Female3DCG/ItemButt/WolfTail3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/Cushion.png b/Assets/Female3DCG/ItemDevices/AllFours/Cushion.png deleted file mode 100644 index 2101e6694..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/Cushion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/CushionKneel.png b/Assets/Female3DCG/ItemDevices/AllFours/CushionKneel.png deleted file mode 100644 index 2101e6694..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/CushionKneel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/Familiar.png b/Assets/Female3DCG/ItemDevices/AllFours/Familiar.png deleted file mode 100644 index 3f2dbfa79..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/Familiar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/FamiliarCat.png b/Assets/Female3DCG/ItemDevices/AllFours/FamiliarCat.png deleted file mode 100644 index d413fdc32..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/FamiliarCat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/FamiliarParrot.png b/Assets/Female3DCG/ItemDevices/AllFours/FamiliarParrot.png deleted file mode 100644 index 35b824843..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/FamiliarParrot.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/FamiliarSkeleton.png b/Assets/Female3DCG/ItemDevices/AllFours/FamiliarSkeleton.png deleted file mode 100644 index 52cf7e9fe..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/FamiliarSkeleton.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/LittleMonster.png b/Assets/Female3DCG/ItemDevices/AllFours/LittleMonster.png deleted file mode 100644 index b74f0c8ee..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/LittleMonster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/LittleMonsterBlue.png b/Assets/Female3DCG/ItemDevices/AllFours/LittleMonsterBlue.png deleted file mode 100644 index b600c7ad8..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/LittleMonsterBlue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/LittleMonsterGreen.png b/Assets/Female3DCG/ItemDevices/AllFours/LittleMonsterGreen.png deleted file mode 100644 index 7754b8ea6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/LittleMonsterGreen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/LittleMonsterRed.png b/Assets/Female3DCG/ItemDevices/AllFours/LittleMonsterRed.png deleted file mode 100644 index 0d03e5a96..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/LittleMonsterRed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_Back.png b/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_Back.png deleted file mode 100644 index 4172d84a5..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_Front.png b/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_Front.png deleted file mode 100644 index bdb8d6454..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_WeightsBack.png b/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_WeightsBack.png deleted file mode 100644 index 0038b41a3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_WeightsBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_WeightsFront.png b/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_WeightsFront.png deleted file mode 100644 index 05f14157f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/AllFours/NetAllFours_WeightsFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BBQ.png b/Assets/Female3DCG/ItemDevices/BBQ.png deleted file mode 100644 index ef0356fea..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BBQ.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackBoxTie/Cushion.png b/Assets/Female3DCG/ItemDevices/BackBoxTie/Cushion.png deleted file mode 100644 index acbc0b830..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackBoxTie/Cushion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackBoxTie/CushionKneel.png b/Assets/Female3DCG/ItemDevices/BackBoxTie/CushionKneel.png deleted file mode 100644 index 8d3a4e7e3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackBoxTie/CushionKneel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackBoxTie/Familiar.png b/Assets/Female3DCG/ItemDevices/BackBoxTie/Familiar.png deleted file mode 100644 index ab2531657..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackBoxTie/Familiar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackBoxTie/FamiliarCat.png b/Assets/Female3DCG/ItemDevices/BackBoxTie/FamiliarCat.png deleted file mode 100644 index ab917cc3a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackBoxTie/FamiliarCat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackBoxTie/FamiliarParrot.png b/Assets/Female3DCG/ItemDevices/BackBoxTie/FamiliarParrot.png deleted file mode 100644 index 8f5124533..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackBoxTie/FamiliarParrot.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackBoxTie/FamiliarSkeleton.png b/Assets/Female3DCG/ItemDevices/BackBoxTie/FamiliarSkeleton.png deleted file mode 100644 index 2ebe2c260..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackBoxTie/FamiliarSkeleton.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonster.png b/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonster.png deleted file mode 100644 index 29e1fdd69..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonsterBlue.png b/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonsterBlue.png deleted file mode 100644 index 93d0c5f3e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonsterBlue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonsterGreen.png b/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonsterGreen.png deleted file mode 100644 index 62d2cba53..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonsterGreen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonsterRed.png b/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonsterRed.png deleted file mode 100644 index 94bc36e41..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackBoxTie/LittleMonsterRed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackCuffs/Cushion.png b/Assets/Female3DCG/ItemDevices/BackCuffs/Cushion.png deleted file mode 100644 index acbc0b830..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackCuffs/Cushion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackCuffs/CushionKneel.png b/Assets/Female3DCG/ItemDevices/BackCuffs/CushionKneel.png deleted file mode 100644 index 8d3a4e7e3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackCuffs/CushionKneel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackCuffs/Familiar.png b/Assets/Female3DCG/ItemDevices/BackCuffs/Familiar.png deleted file mode 100644 index ab2531657..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackCuffs/Familiar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackCuffs/FamiliarCat.png b/Assets/Female3DCG/ItemDevices/BackCuffs/FamiliarCat.png deleted file mode 100644 index ab917cc3a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackCuffs/FamiliarCat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackCuffs/FamiliarParrot.png b/Assets/Female3DCG/ItemDevices/BackCuffs/FamiliarParrot.png deleted file mode 100644 index 8f5124533..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackCuffs/FamiliarParrot.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackCuffs/FamiliarSkeleton.png b/Assets/Female3DCG/ItemDevices/BackCuffs/FamiliarSkeleton.png deleted file mode 100644 index 2ebe2c260..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackCuffs/FamiliarSkeleton.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonster.png b/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonster.png deleted file mode 100644 index 29e1fdd69..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonsterBlue.png b/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonsterBlue.png deleted file mode 100644 index 93d0c5f3e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonsterBlue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonsterGreen.png b/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonsterGreen.png deleted file mode 100644 index 62d2cba53..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonsterGreen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonsterRed.png b/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonsterRed.png deleted file mode 100644 index 94bc36e41..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackCuffs/LittleMonsterRed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackElbowTouch/Cushion.png b/Assets/Female3DCG/ItemDevices/BackElbowTouch/Cushion.png deleted file mode 100644 index acbc0b830..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackElbowTouch/Cushion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackElbowTouch/CushionKneel.png b/Assets/Female3DCG/ItemDevices/BackElbowTouch/CushionKneel.png deleted file mode 100644 index 8d3a4e7e3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackElbowTouch/CushionKneel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackElbowTouch/Familiar.png b/Assets/Female3DCG/ItemDevices/BackElbowTouch/Familiar.png deleted file mode 100644 index ab2531657..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackElbowTouch/Familiar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackElbowTouch/FamiliarCat.png b/Assets/Female3DCG/ItemDevices/BackElbowTouch/FamiliarCat.png deleted file mode 100644 index ab917cc3a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackElbowTouch/FamiliarCat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackElbowTouch/FamiliarParrot.png b/Assets/Female3DCG/ItemDevices/BackElbowTouch/FamiliarParrot.png deleted file mode 100644 index 8f5124533..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackElbowTouch/FamiliarParrot.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackElbowTouch/FamiliarSkeleton.png b/Assets/Female3DCG/ItemDevices/BackElbowTouch/FamiliarSkeleton.png deleted file mode 100644 index 2ebe2c260..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackElbowTouch/FamiliarSkeleton.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonster.png b/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonster.png deleted file mode 100644 index 29e1fdd69..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonsterBlue.png b/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonsterBlue.png deleted file mode 100644 index 93d0c5f3e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonsterBlue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonsterGreen.png b/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonsterGreen.png deleted file mode 100644 index 62d2cba53..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonsterGreen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonsterRed.png b/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonsterRed.png deleted file mode 100644 index 94bc36e41..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BackElbowTouch/LittleMonsterRed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxeArmsUpLegsSpread_Frame.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxeArmsUpLegsSpread_Frame.png deleted file mode 100644 index 0110a9812..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxeArmsUpLegsSpread_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxeArmsUpLegsSpread_SheetBack.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxeArmsUpLegsSpread_SheetBack.png deleted file mode 100644 index c334240f7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxeArmsUpLegsSpread_SheetBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxeArmsUpLegsSpread_SheetFront.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxeArmsUpLegsSpread_SheetFront.png deleted file mode 100644 index c334240f7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxeArmsUpLegsSpread_SheetFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Frame.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Frame.png deleted file mode 100644 index 0110a9812..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_LargeArmsUpLegsSpread_Lower.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_LargeArmsUpLegsSpread_Lower.png deleted file mode 100644 index b5a2058a2..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_LargeArmsUpLegsSpread_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_LargeArmsUpLegsSpread_Upper.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_LargeArmsUpLegsSpread_Upper.png deleted file mode 100644 index b7cf03ae8..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_LargeArmsUpLegsSpread_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Large_Lower.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Large_Lower.png deleted file mode 100644 index b5a2058a2..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Large_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Large_Upper.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Large_Upper.png deleted file mode 100644 index b0e841297..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Large_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_NormalArmsUpLegsSpread_Lower.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_NormalArmsUpLegsSpread_Lower.png deleted file mode 100644 index 2c9e8220e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_NormalArmsUpLegsSpread_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_NormalArmsUpLegsSpread_Upper.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_NormalArmsUpLegsSpread_Upper.png deleted file mode 100644 index 5b3593ff4..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_NormalArmsUpLegsSpread_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Normal_Lower.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Normal_Lower.png deleted file mode 100644 index 2c9e8220e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Normal_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Normal_Upper.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Normal_Upper.png deleted file mode 100644 index 2bfbc6f72..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Normal_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SheetBack.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SheetBack.png deleted file mode 100644 index c334240f7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SheetBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SheetFront.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SheetFront.png deleted file mode 100644 index c334240f7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SheetFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SmallArmsUpLegsSpread_Lower.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SmallArmsUpLegsSpread_Lower.png deleted file mode 100644 index 22bdd3879..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SmallArmsUpLegsSpread_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SmallArmsUpLegsSpread_Upper.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SmallArmsUpLegsSpread_Upper.png deleted file mode 100644 index a9f3ae60e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_SmallArmsUpLegsSpread_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Small_Lower.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Small_Lower.png deleted file mode 100644 index 22bdd3879..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Small_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Small_Upper.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Small_Upper.png deleted file mode 100644 index 1b9e5725f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_Small_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLargeArmsUpLegsSpread_Lower.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLargeArmsUpLegsSpread_Lower.png deleted file mode 100644 index ef2150bfe..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLargeArmsUpLegsSpread_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLargeArmsUpLegsSpread_Upper.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLargeArmsUpLegsSpread_Upper.png deleted file mode 100644 index 06d42c8db..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLargeArmsUpLegsSpread_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLarge_Lower.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLarge_Lower.png deleted file mode 100644 index ef2150bfe..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLarge_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLarge_Upper.png b/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLarge_Upper.png deleted file mode 100644 index 758af174f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BaseLower/VacBedDeluxe_XLarge_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Bed_BedFrame.png b/Assets/Female3DCG/ItemDevices/Bed_BedFrame.png deleted file mode 100644 index 01fc2555a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Bed_BedFrame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Bed_Mattress.png b/Assets/Female3DCG/ItemDevices/Bed_Mattress.png deleted file mode 100644 index f412caae7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Bed_Mattress.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Bed_Pillow.png b/Assets/Female3DCG/ItemDevices/Bed_Pillow.png deleted file mode 100644 index 0c106b79a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Bed_Pillow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BondageBenchFull_Lock.png b/Assets/Female3DCG/ItemDevices/BondageBenchFull_Lock.png deleted file mode 100644 index 1f77b4296..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BondageBenchFull_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BondageBenchFull_Straps.png b/Assets/Female3DCG/ItemDevices/BondageBenchFull_Straps.png deleted file mode 100644 index c65f72c1d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BondageBenchFull_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BondageBenchHeavy_Lock.png b/Assets/Female3DCG/ItemDevices/BondageBenchHeavy_Lock.png deleted file mode 100644 index b1275086b..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BondageBenchHeavy_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BondageBenchHeavy_Straps.png b/Assets/Female3DCG/ItemDevices/BondageBenchHeavy_Straps.png deleted file mode 100644 index dc2f98381..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BondageBenchHeavy_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BondageBenchLight_Lock.png b/Assets/Female3DCG/ItemDevices/BondageBenchLight_Lock.png deleted file mode 100644 index bbf1e7817..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BondageBenchLight_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BondageBenchLight_Straps.png b/Assets/Female3DCG/ItemDevices/BondageBenchLight_Straps.png deleted file mode 100644 index 2281f123d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BondageBenchLight_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BondageBenchNormal_Lock.png b/Assets/Female3DCG/ItemDevices/BondageBenchNormal_Lock.png deleted file mode 100644 index fd02e5350..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BondageBenchNormal_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BondageBenchNormal_Straps.png b/Assets/Female3DCG/ItemDevices/BondageBenchNormal_Straps.png deleted file mode 100644 index 2d260af31..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BondageBenchNormal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BondageBench_Bench.png b/Assets/Female3DCG/ItemDevices/BondageBench_Bench.png deleted file mode 100644 index d7887b010..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BondageBench_Bench.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BondageBench_Straps.png b/Assets/Female3DCG/ItemDevices/BondageBench_Straps.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BondageBench_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/BurlapSack.png b/Assets/Female3DCG/ItemDevices/BurlapSack.png deleted file mode 100644 index 43e598430..000000000 Binary files a/Assets/Female3DCG/ItemDevices/BurlapSack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Cage_Frame.png b/Assets/Female3DCG/ItemDevices/Cage_Frame.png deleted file mode 100644 index a08a209eb..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Cage_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Cage_Lock.png b/Assets/Female3DCG/ItemDevices/Cage_Lock.png deleted file mode 100644 index 33213749d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Cage_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Cage_Mesh.png b/Assets/Female3DCG/ItemDevices/Cage_Mesh.png deleted file mode 100644 index 84baba144..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Cage_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Cage_Tint.png b/Assets/Female3DCG/ItemDevices/Cage_Tint.png deleted file mode 100644 index 4bb5f7401..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Cage_Tint.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/ChangingTable_Frame.png b/Assets/Female3DCG/ItemDevices/ChangingTable_Frame.png deleted file mode 100644 index b59fed62a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/ChangingTable_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/ChangingTable_Table.png b/Assets/Female3DCG/ItemDevices/ChangingTable_Table.png deleted file mode 100644 index 0a95d2988..000000000 Binary files a/Assets/Female3DCG/ItemDevices/ChangingTable_Table.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/CoffinClosed_Closed.png b/Assets/Female3DCG/ItemDevices/CoffinClosed_Closed.png deleted file mode 100644 index 64f259ea4..000000000 Binary files a/Assets/Female3DCG/ItemDevices/CoffinClosed_Closed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/CoffinClosed_Lock.png b/Assets/Female3DCG/ItemDevices/CoffinClosed_Lock.png deleted file mode 100644 index ec27259e2..000000000 Binary files a/Assets/Female3DCG/ItemDevices/CoffinClosed_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Coffin_Frame.png b/Assets/Female3DCG/ItemDevices/Coffin_Frame.png deleted file mode 100644 index ec260699d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Coffin_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Coffin_Inside.png b/Assets/Female3DCG/ItemDevices/Coffin_Inside.png deleted file mode 100644 index cb5c49546..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Coffin_Inside.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Coffin_Lock.png b/Assets/Female3DCG/ItemDevices/Coffin_Lock.png deleted file mode 100644 index daa3502e6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Coffin_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Coffin_Open.png b/Assets/Female3DCG/ItemDevices/Coffin_Open.png deleted file mode 100644 index c85708c8e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Coffin_Open.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/ConcealingCloak_Back.png b/Assets/Female3DCG/ItemDevices/ConcealingCloak_Back.png deleted file mode 100644 index 112866c34..000000000 Binary files a/Assets/Female3DCG/ItemDevices/ConcealingCloak_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/ConcealingCloak_Front.png b/Assets/Female3DCG/ItemDevices/ConcealingCloak_Front.png deleted file mode 100644 index f7ba1ea46..000000000 Binary files a/Assets/Female3DCG/ItemDevices/ConcealingCloak_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/ConcealingCloak_Lock.png b/Assets/Female3DCG/ItemDevices/ConcealingCloak_Lock.png deleted file mode 100644 index 1dbe1bdc3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/ConcealingCloak_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/ConcealingCloak_Strap.png b/Assets/Female3DCG/ItemDevices/ConcealingCloak_Strap.png deleted file mode 100644 index cd75c29b1..000000000 Binary files a/Assets/Female3DCG/ItemDevices/ConcealingCloak_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Crib_Frame.png b/Assets/Female3DCG/ItemDevices/Crib_Frame.png deleted file mode 100644 index acdf6a535..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Crib_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Crib_GateClosed.png b/Assets/Female3DCG/ItemDevices/Crib_GateClosed.png deleted file mode 100644 index edc876117..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Crib_GateClosed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Crib_GateOpen.png b/Assets/Female3DCG/ItemDevices/Crib_GateOpen.png deleted file mode 100644 index 85463d8f7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Crib_GateOpen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Crib_Mattress.png b/Assets/Female3DCG/ItemDevices/Crib_Mattress.png deleted file mode 100644 index 96641b922..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Crib_Mattress.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Crib_Pillow.png b/Assets/Female3DCG/ItemDevices/Crib_Pillow.png deleted file mode 100644 index c2c7969df..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Crib_Pillow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Crib_PillowTrim.png b/Assets/Female3DCG/ItemDevices/Crib_PillowTrim.png deleted file mode 100644 index fdf3dd171..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Crib_PillowTrim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Crib_Plushies.png b/Assets/Female3DCG/ItemDevices/Crib_Plushies.png deleted file mode 100644 index 893773734..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Crib_Plushies.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Cribg0p0_Lock.png b/Assets/Female3DCG/ItemDevices/Cribg0p0_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Cribg0p0_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Cribg0p1_Lock.png b/Assets/Female3DCG/ItemDevices/Cribg0p1_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Cribg0p1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Cribg1p0_Lock.png b/Assets/Female3DCG/ItemDevices/Cribg1p0_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Cribg1p0_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Cribg1p1_Lock.png b/Assets/Female3DCG/ItemDevices/Cribg1p1_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Cribg1p1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/CryoCapsuleClosed_Closed.png b/Assets/Female3DCG/ItemDevices/CryoCapsuleClosed_Closed.png deleted file mode 100644 index 0ba6fdd27..000000000 Binary files a/Assets/Female3DCG/ItemDevices/CryoCapsuleClosed_Closed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/CryoCapsuleClosed_Lock.png b/Assets/Female3DCG/ItemDevices/CryoCapsuleClosed_Lock.png deleted file mode 100644 index a15a01c03..000000000 Binary files a/Assets/Female3DCG/ItemDevices/CryoCapsuleClosed_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/CryoCapsule_Frame.png b/Assets/Female3DCG/ItemDevices/CryoCapsule_Frame.png deleted file mode 100644 index 8c5cff347..000000000 Binary files a/Assets/Female3DCG/ItemDevices/CryoCapsule_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/CryoCapsule_Inside.png b/Assets/Female3DCG/ItemDevices/CryoCapsule_Inside.png deleted file mode 100644 index c3e594767..000000000 Binary files a/Assets/Female3DCG/ItemDevices/CryoCapsule_Inside.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/CryoCapsule_Lock.png b/Assets/Female3DCG/ItemDevices/CryoCapsule_Lock.png deleted file mode 100644 index aafec4c66..000000000 Binary files a/Assets/Female3DCG/ItemDevices/CryoCapsule_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/CryoCapsule_Open.png b/Assets/Female3DCG/ItemDevices/CryoCapsule_Open.png deleted file mode 100644 index 8523af00f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/CryoCapsule_Open.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Cushion.png b/Assets/Female3DCG/ItemDevices/Cushion.png deleted file mode 100644 index e205e93ef..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Cushion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/CushionKneel.png b/Assets/Female3DCG/ItemDevices/CushionKneel.png deleted file mode 100644 index 8d3a4e7e3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/CushionKneel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/DisplayCase.png b/Assets/Female3DCG/ItemDevices/DisplayCase.png deleted file mode 100644 index 8dd4a247c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/DisplayCase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/DisplayCase_Lock.png b/Assets/Female3DCG/ItemDevices/DisplayCase_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemDevices/DisplayCase_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/DollBox_Back.png b/Assets/Female3DCG/ItemDevices/DollBox_Back.png deleted file mode 100644 index 9563bb577..000000000 Binary files a/Assets/Female3DCG/ItemDevices/DollBox_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/DollBox_Cover.png b/Assets/Female3DCG/ItemDevices/DollBox_Cover.png deleted file mode 100644 index 6df783516..000000000 Binary files a/Assets/Female3DCG/ItemDevices/DollBox_Cover.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/DollBox_DollText.png b/Assets/Female3DCG/ItemDevices/DollBox_DollText.png deleted file mode 100644 index 0bf99e38c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/DollBox_DollText.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/DollBox_Glass.png b/Assets/Female3DCG/ItemDevices/DollBox_Glass.png deleted file mode 100644 index c353a39eb..000000000 Binary files a/Assets/Female3DCG/ItemDevices/DollBox_Glass.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/DollBox_Heart.png b/Assets/Female3DCG/ItemDevices/DollBox_Heart.png deleted file mode 100644 index df8be3a2e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/DollBox_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Familiar.png b/Assets/Female3DCG/ItemDevices/Familiar.png deleted file mode 100644 index e82760280..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Familiar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FamiliarBat.png b/Assets/Female3DCG/ItemDevices/FamiliarBat.png deleted file mode 100644 index e82760280..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FamiliarBat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FamiliarCat.png b/Assets/Female3DCG/ItemDevices/FamiliarCat.png deleted file mode 100644 index 6851b615d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FamiliarCat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FamiliarParrot.png b/Assets/Female3DCG/ItemDevices/FamiliarParrot.png deleted file mode 100644 index bc3d6b7d7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FamiliarParrot.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FamiliarSkeleton.png b/Assets/Female3DCG/ItemDevices/FamiliarSkeleton.png deleted file mode 100644 index 5060cbb3a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FamiliarSkeleton.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuckMachine_Caps.png b/Assets/Female3DCG/ItemDevices/FuckMachine_Caps.png deleted file mode 100644 index 68fe3ca97..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuckMachine_Caps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuckMachine_Dildo.png b/Assets/Female3DCG/ItemDevices/FuckMachine_Dildo.png deleted file mode 100644 index 2f5248189..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuckMachine_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuckMachine_Metal.png b/Assets/Female3DCG/ItemDevices/FuckMachine_Metal.png deleted file mode 100644 index 7fa4a649f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuckMachine_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuckMachine_Plastic.png b/Assets/Female3DCG/ItemDevices/FuckMachine_Plastic.png deleted file mode 100644 index e62069c8a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuckMachine_Plastic.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuckMachine_Pole.png b/Assets/Female3DCG/ItemDevices/FuckMachine_Pole.png deleted file mode 100644 index 5cbae4655..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuckMachine_Pole.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuckMachine_Pussy.png b/Assets/Female3DCG/ItemDevices/FuckMachine_Pussy.png deleted file mode 100644 index 5448ecd5b..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuckMachine_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FurBlanketWrapBelts_Belts.png b/Assets/Female3DCG/ItemDevices/FurBlanketWrapBelts_Belts.png deleted file mode 100644 index fc2c41d1a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FurBlanketWrapBelts_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FurBlanketWrapBelts_Blanket.png b/Assets/Female3DCG/ItemDevices/FurBlanketWrapBelts_Blanket.png deleted file mode 100644 index ff071ab10..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FurBlanketWrapBelts_Blanket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FurBlanketWrapTight_Blanket.png b/Assets/Female3DCG/ItemDevices/FurBlanketWrapTight_Blanket.png deleted file mode 100644 index ff071ab10..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FurBlanketWrapTight_Blanket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FurBlanketWrap_Blanket.png b/Assets/Female3DCG/ItemDevices/FurBlanketWrap_Blanket.png deleted file mode 100644 index db638683e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FurBlanketWrap_Blanket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_Body.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_Body.png deleted file mode 100644 index c8b8ea80d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_DevicePleasure.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_DevicePleasure.png deleted file mode 100644 index e1814d833..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_DevicePleasure.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_DevicePleasureHolder.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_DevicePleasureHolder.png deleted file mode 100644 index c2af89a3c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_DevicePleasureHolder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_DevicePleasurePlug.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_DevicePleasurePlug.png deleted file mode 100644 index ad08a4d0a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_DevicePleasurePlug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_Display.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_Display.png deleted file mode 100644 index 33d74d2d0..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_Frame.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_Frame.png deleted file mode 100644 index 3a7c69024..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_Lid.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_Lid.png deleted file mode 100644 index a2f776c07..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_Lid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_Lock.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_Lock.png deleted file mode 100644 index 0a55a8aee..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsArms.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsArms.png deleted file mode 100644 index b07ac2495..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsArms.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsArmsMesh.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsArmsMesh.png deleted file mode 100644 index 285668047..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsArmsMesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsLegs.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsLegs.png deleted file mode 100644 index 0a951df5c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsLegsClosed.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsLegsClosed.png deleted file mode 100644 index d5ab29342..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsLegsClosed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsLegsMesh.png b/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsLegsMesh.png deleted file mode 100644 index 9919bba89..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrate_StrapsLegsMesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrateh0_Device.png b/Assets/Female3DCG/ItemDevices/FuturisticCrateh0_Device.png deleted file mode 100644 index 4125f3d5a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrateh0_Device.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrateh1_ClampsHarness.png b/Assets/Female3DCG/ItemDevices/FuturisticCrateh1_ClampsHarness.png deleted file mode 100644 index 6c274602a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrateh1_ClampsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrateh1_StrapsHarness.png b/Assets/Female3DCG/ItemDevices/FuturisticCrateh1_StrapsHarness.png deleted file mode 100644 index 82f955849..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrateh1_StrapsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrateh2_ClampsHarness.png b/Assets/Female3DCG/ItemDevices/FuturisticCrateh2_ClampsHarness.png deleted file mode 100644 index 136b3090a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrateh2_ClampsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrateh2_StrapsHarness.png b/Assets/Female3DCG/ItemDevices/FuturisticCrateh2_StrapsHarness.png deleted file mode 100644 index 731c34254..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrateh2_StrapsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrateh3_ClampsHarness.png b/Assets/Female3DCG/ItemDevices/FuturisticCrateh3_ClampsHarness.png deleted file mode 100644 index 3839daca0..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrateh3_ClampsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrateh3_StrapsHarness.png b/Assets/Female3DCG/ItemDevices/FuturisticCrateh3_StrapsHarness.png deleted file mode 100644 index 2e28b8b73..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrateh3_StrapsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrateh4_ClampsHarness.png b/Assets/Female3DCG/ItemDevices/FuturisticCrateh4_ClampsHarness.png deleted file mode 100644 index 9b81262da..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrateh4_ClampsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCrateh4_StrapsHarness.png b/Assets/Female3DCG/ItemDevices/FuturisticCrateh4_StrapsHarness.png deleted file mode 100644 index 8787ab576..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCrateh4_StrapsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCratet0_DevicePleasureStructure.png b/Assets/Female3DCG/ItemDevices/FuturisticCratet0_DevicePleasureStructure.png deleted file mode 100644 index 4125f3d5a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCratet0_DevicePleasureStructure.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCratet1_DevicePleasureStructure.png b/Assets/Female3DCG/ItemDevices/FuturisticCratet1_DevicePleasureStructure.png deleted file mode 100644 index 3498343f5..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCratet1_DevicePleasureStructure.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCratet2_DevicePleasureStructure.png b/Assets/Female3DCG/ItemDevices/FuturisticCratet2_DevicePleasureStructure.png deleted file mode 100644 index 7a89c996d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCratet2_DevicePleasureStructure.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCratet3_DevicePleasureStructure.png b/Assets/Female3DCG/ItemDevices/FuturisticCratet3_DevicePleasureStructure.png deleted file mode 100644 index 56708a6fe..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCratet3_DevicePleasureStructure.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCratew1_Glass.png b/Assets/Female3DCG/ItemDevices/FuturisticCratew1_Glass.png deleted file mode 100644 index dd3f838db..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCratew1_Glass.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCratew2_Glass.png b/Assets/Female3DCG/ItemDevices/FuturisticCratew2_Glass.png deleted file mode 100644 index 7755c6511..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCratew2_Glass.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCratew2_Lid_Window.png b/Assets/Female3DCG/ItemDevices/FuturisticCratew2_Lid_Window.png deleted file mode 100644 index a453dde16..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCratew2_Lid_Window.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCratew3_Glass.png b/Assets/Female3DCG/ItemDevices/FuturisticCratew3_Glass.png deleted file mode 100644 index 8551e3d34..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCratew3_Glass.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/FuturisticCratew3_Lid_Window.png b/Assets/Female3DCG/ItemDevices/FuturisticCratew3_Lid_Window.png deleted file mode 100644 index 97e1a1017..000000000 Binary files a/Assets/Female3DCG/ItemDevices/FuturisticCratew3_Lid_Window.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/Cushion.png b/Assets/Female3DCG/ItemDevices/Hogtied/Cushion.png deleted file mode 100644 index 2101e6694..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/Cushion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/CushionKneel.png b/Assets/Female3DCG/ItemDevices/Hogtied/CushionKneel.png deleted file mode 100644 index 6d04d47bf..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/CushionKneel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/Familiar.png b/Assets/Female3DCG/ItemDevices/Hogtied/Familiar.png deleted file mode 100644 index 3f2dbfa79..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/Familiar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/FamiliarCat.png b/Assets/Female3DCG/ItemDevices/Hogtied/FamiliarCat.png deleted file mode 100644 index d413fdc32..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/FamiliarCat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/FamiliarParrot.png b/Assets/Female3DCG/ItemDevices/Hogtied/FamiliarParrot.png deleted file mode 100644 index 35b824843..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/FamiliarParrot.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/FamiliarSkeleton.png b/Assets/Female3DCG/ItemDevices/Hogtied/FamiliarSkeleton.png deleted file mode 100644 index 52cf7e9fe..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/FamiliarSkeleton.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonster.png b/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonster.png deleted file mode 100644 index b74f0c8ee..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonsterBlue.png b/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonsterBlue.png deleted file mode 100644 index b600c7ad8..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonsterBlue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonsterGreen.png b/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonsterGreen.png deleted file mode 100644 index 7754b8ea6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonsterGreen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonsterRed.png b/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonsterRed.png deleted file mode 100644 index 0d03e5a96..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/LittleMonsterRed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/NetSuspended_Back.png b/Assets/Female3DCG/ItemDevices/Hogtied/NetSuspended_Back.png deleted file mode 100644 index e570a30f9..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/NetSuspended_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Hogtied/NetSuspended_Front.png b/Assets/Female3DCG/ItemDevices/Hogtied/NetSuspended_Front.png deleted file mode 100644 index 6f67f12ba..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Hogtied/NetSuspended_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/InflatableBodyBag.png b/Assets/Female3DCG/ItemDevices/InflatableBodyBag.png deleted file mode 100644 index 326258224..000000000 Binary files a/Assets/Female3DCG/ItemDevices/InflatableBodyBag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/InflatableBodyBagBloated.png b/Assets/Female3DCG/ItemDevices/InflatableBodyBagBloated.png deleted file mode 100644 index 66326725b..000000000 Binary files a/Assets/Female3DCG/ItemDevices/InflatableBodyBagBloated.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/InflatableBodyBagBloated_Lock.png b/Assets/Female3DCG/ItemDevices/InflatableBodyBagBloated_Lock.png deleted file mode 100644 index 8819d4a38..000000000 Binary files a/Assets/Female3DCG/ItemDevices/InflatableBodyBagBloated_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/InflatableBodyBagInflated.png b/Assets/Female3DCG/ItemDevices/InflatableBodyBagInflated.png deleted file mode 100644 index 80b71e234..000000000 Binary files a/Assets/Female3DCG/ItemDevices/InflatableBodyBagInflated.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/InflatableBodyBagInflated_Lock.png b/Assets/Female3DCG/ItemDevices/InflatableBodyBagInflated_Lock.png deleted file mode 100644 index 8819d4a38..000000000 Binary files a/Assets/Female3DCG/ItemDevices/InflatableBodyBagInflated_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/InflatableBodyBagMax.png b/Assets/Female3DCG/ItemDevices/InflatableBodyBagMax.png deleted file mode 100644 index 509ccd662..000000000 Binary files a/Assets/Female3DCG/ItemDevices/InflatableBodyBagMax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/InflatableBodyBagMax_Lock.png b/Assets/Female3DCG/ItemDevices/InflatableBodyBagMax_Lock.png deleted file mode 100644 index 8819d4a38..000000000 Binary files a/Assets/Female3DCG/ItemDevices/InflatableBodyBagMax_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/InflatableBodyBag_Lock.png b/Assets/Female3DCG/ItemDevices/InflatableBodyBag_Lock.png deleted file mode 100644 index 8819d4a38..000000000 Binary files a/Assets/Female3DCG/ItemDevices/InflatableBodyBag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelA10_Door.png b/Assets/Female3DCG/ItemDevices/KennelA10_Door.png deleted file mode 100644 index 58de70af7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelA10_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelA2_Door.png b/Assets/Female3DCG/ItemDevices/KennelA2_Door.png deleted file mode 100644 index b5d925c92..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelA2_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelA3_Door.png b/Assets/Female3DCG/ItemDevices/KennelA3_Door.png deleted file mode 100644 index 9c6f0b715..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelA3_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelA4_Door.png b/Assets/Female3DCG/ItemDevices/KennelA4_Door.png deleted file mode 100644 index 4b02e347d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelA4_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelA5_Door.png b/Assets/Female3DCG/ItemDevices/KennelA5_Door.png deleted file mode 100644 index bb77fbd68..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelA5_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelA6_Door.png b/Assets/Female3DCG/ItemDevices/KennelA6_Door.png deleted file mode 100644 index 24bedfef6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelA6_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelA7_Door.png b/Assets/Female3DCG/ItemDevices/KennelA7_Door.png deleted file mode 100644 index f07767ea3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelA7_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelA8_Door.png b/Assets/Female3DCG/ItemDevices/KennelA8_Door.png deleted file mode 100644 index 1a49c6f54..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelA8_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelA9_Door.png b/Assets/Female3DCG/ItemDevices/KennelA9_Door.png deleted file mode 100644 index 558eb8176..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelA9_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelClosedPadding_Door.png b/Assets/Female3DCG/ItemDevices/KennelClosedPadding_Door.png deleted file mode 100644 index 32c063c2c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelClosedPadding_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelClosedPadding_Lock.png b/Assets/Female3DCG/ItemDevices/KennelClosedPadding_Lock.png deleted file mode 100644 index 073bf6c34..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelClosedPadding_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelClosed_Door.png b/Assets/Female3DCG/ItemDevices/KennelClosed_Door.png deleted file mode 100644 index b5b71f0b1..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelClosed_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelClosed_Lock.png b/Assets/Female3DCG/ItemDevices/KennelClosed_Lock.png deleted file mode 100644 index 525b2de25..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelClosed_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelOpenPadding_Door.png b/Assets/Female3DCG/ItemDevices/KennelOpenPadding_Door.png deleted file mode 100644 index c64af4698..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelOpenPadding_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/KennelOpenPadding_Lock.png b/Assets/Female3DCG/ItemDevices/KennelOpenPadding_Lock.png deleted file mode 100644 index 761f5fa8a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/KennelOpenPadding_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kennel_Door.png b/Assets/Female3DCG/ItemDevices/Kennel_Door.png deleted file mode 100644 index 50466a43e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kennel_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kennel_Frame.png b/Assets/Female3DCG/ItemDevices/Kennel_Frame.png deleted file mode 100644 index 55cd5daae..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kennel_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kennel_Kennel.png b/Assets/Female3DCG/ItemDevices/Kennel_Kennel.png deleted file mode 100644 index a70eb45c8..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kennel_Kennel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kennel_Lock.png b/Assets/Female3DCG/ItemDevices/Kennel_Lock.png deleted file mode 100644 index f4e28fb78..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kennel_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kennel_Padding.png b/Assets/Female3DCG/ItemDevices/Kennel_Padding.png deleted file mode 100644 index 36809ed66..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kennel_Padding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrapBelts_Belts.png b/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrapBelts_Belts.png deleted file mode 100644 index 68675c695..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrapBelts_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrapBelts_Blanket.png b/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrapBelts_Blanket.png deleted file mode 100644 index b28ac8218..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrapBelts_Blanket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrapTight_Blanket.png b/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrapTight_Blanket.png deleted file mode 100644 index b28ac8218..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrapTight_Blanket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrap_Blanket.png b/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrap_Blanket.png deleted file mode 100644 index 1ec135185..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/FurBlanketWrap_Blanket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBag.png b/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBag.png deleted file mode 100644 index b7a1383c9..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagBloated.png b/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagBloated.png deleted file mode 100644 index ad0beb410..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagBloated.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagBloated_Lock.png b/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagBloated_Lock.png deleted file mode 100644 index e95664c80..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagBloated_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagInflated.png b/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagInflated.png deleted file mode 100644 index 501adc563..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagInflated.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagInflated_Lock.png b/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagInflated_Lock.png deleted file mode 100644 index 5128c50e7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagInflated_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagMax.png b/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagMax.png deleted file mode 100644 index 07882aec5..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagMax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagMax_Lock.png b/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagMax_Lock.png deleted file mode 100644 index 74f8c3fc6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBagMax_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBag_Lock.png b/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBag_Lock.png deleted file mode 100644 index e47024e4c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/InflatableBodyBag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_Back.png b/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_Back.png deleted file mode 100644 index 03c20624d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_Front.png b/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_Front.png deleted file mode 100644 index a0952ad15..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_WeightsBack.png b/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_WeightsBack.png deleted file mode 100644 index 7a6a87069..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_WeightsBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_WeightsFront.png b/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_WeightsFront.png deleted file mode 100644 index 39e411829..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/NetKneel_WeightsFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/Net_Back.png b/Assets/Female3DCG/ItemDevices/Kneel/Net_Back.png deleted file mode 100644 index 03c20624d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/Net_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/Net_Front.png b/Assets/Female3DCG/ItemDevices/Kneel/Net_Front.png deleted file mode 100644 index a0952ad15..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/Net_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/Net_WeightsBack.png b/Assets/Female3DCG/ItemDevices/Kneel/Net_WeightsBack.png deleted file mode 100644 index 7a6a87069..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/Net_WeightsBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Kneel/Net_WeightsFront.png b/Assets/Female3DCG/ItemDevices/Kneel/Net_WeightsFront.png deleted file mode 100644 index 39e411829..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Kneel/Net_WeightsFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsDownLegsTogether_Frame.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsDownLegsTogether_Frame.png deleted file mode 100644 index 0110a9812..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsDownLegsTogether_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsDownLegsTogether_SheetBack.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsDownLegsTogether_SheetBack.png deleted file mode 100644 index c334240f7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsDownLegsTogether_SheetBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsDownLegsTogether_SheetFront.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsDownLegsTogether_SheetFront.png deleted file mode 100644 index c334240f7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsDownLegsTogether_SheetFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsUpLegsTogether_Frame.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsUpLegsTogether_Frame.png deleted file mode 100644 index 0110a9812..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsUpLegsTogether_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsUpLegsTogether_SheetBack.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsUpLegsTogether_SheetBack.png deleted file mode 100644 index c334240f7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsUpLegsTogether_SheetBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsUpLegsTogether_SheetFront.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsUpLegsTogether_SheetFront.png deleted file mode 100644 index c334240f7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxeArmsUpLegsTogether_SheetFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsDownLegsTogether_Lower.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsDownLegsTogether_Lower.png deleted file mode 100644 index 10f4a5fb6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsDownLegsTogether_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsDownLegsTogether_Upper.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsDownLegsTogether_Upper.png deleted file mode 100644 index b0e841297..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsDownLegsTogether_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsUpLegsTogether_Lower.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsUpLegsTogether_Lower.png deleted file mode 100644 index 10f4a5fb6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsUpLegsTogether_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsUpLegsTogether_Upper.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsUpLegsTogether_Upper.png deleted file mode 100644 index b7cf03ae8..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_LargeArmsUpLegsTogether_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsDownLegsTogether_Lower.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsDownLegsTogether_Lower.png deleted file mode 100644 index b7715674c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsDownLegsTogether_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsDownLegsTogether_Upper.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsDownLegsTogether_Upper.png deleted file mode 100644 index 2bfbc6f72..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsDownLegsTogether_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsUpLegsTogether_Lower.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsUpLegsTogether_Lower.png deleted file mode 100644 index b7715674c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsUpLegsTogether_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsUpLegsTogether_Upper.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsUpLegsTogether_Upper.png deleted file mode 100644 index 5b3593ff4..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_NormalArmsUpLegsTogether_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsDownLegsTogether_Lower.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsDownLegsTogether_Lower.png deleted file mode 100644 index 3134ba146..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsDownLegsTogether_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsDownLegsTogether_Upper.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsDownLegsTogether_Upper.png deleted file mode 100644 index 1b9e5725f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsDownLegsTogether_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsUpLegsTogether_Lower.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsUpLegsTogether_Lower.png deleted file mode 100644 index 3134ba146..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsUpLegsTogether_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsUpLegsTogether_Upper.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsUpLegsTogether_Upper.png deleted file mode 100644 index a9f3ae60e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_SmallArmsUpLegsTogether_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsDownLegsTogether_Lower.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsDownLegsTogether_Lower.png deleted file mode 100644 index e7e16471d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsDownLegsTogether_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsDownLegsTogether_Upper.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsDownLegsTogether_Upper.png deleted file mode 100644 index 758af174f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsDownLegsTogether_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsUpLegsTogether_Lower.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsUpLegsTogether_Lower.png deleted file mode 100644 index e7e16471d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsUpLegsTogether_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsUpLegsTogether_Upper.png b/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsUpLegsTogether_Upper.png deleted file mode 100644 index 06d42c8db..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LegsClosed/VacBedDeluxe_XLargeArmsUpLegsTogether_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LittleMonster.png b/Assets/Female3DCG/ItemDevices/LittleMonster.png deleted file mode 100644 index 469b81311..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LittleMonster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LittleMonsterBlack.png b/Assets/Female3DCG/ItemDevices/LittleMonsterBlack.png deleted file mode 100644 index 469b81311..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LittleMonsterBlack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LittleMonsterBlue.png b/Assets/Female3DCG/ItemDevices/LittleMonsterBlue.png deleted file mode 100644 index 531ac2a3c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LittleMonsterBlue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LittleMonsterGreen.png b/Assets/Female3DCG/ItemDevices/LittleMonsterGreen.png deleted file mode 100644 index dff23ae29..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LittleMonsterGreen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LittleMonsterRed.png b/Assets/Female3DCG/ItemDevices/LittleMonsterRed.png deleted file mode 100644 index f85b0f172..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LittleMonsterRed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LockerVentless_Lock.png b/Assets/Female3DCG/ItemDevices/LockerVentless_Lock.png deleted file mode 100644 index 9bf2e9ce3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LockerVentless_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LockerVentless_VentCovers.png b/Assets/Female3DCG/ItemDevices/LockerVentless_VentCovers.png deleted file mode 100644 index 459352362..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LockerVentless_VentCovers.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Locker_Back.png b/Assets/Female3DCG/ItemDevices/Locker_Back.png deleted file mode 100644 index 1c3029f1d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Locker_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Locker_Door.png b/Assets/Female3DCG/ItemDevices/Locker_Door.png deleted file mode 100644 index 4f59b9594..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Locker_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Locker_Frame.png b/Assets/Female3DCG/ItemDevices/Locker_Frame.png deleted file mode 100644 index 0f109a4b7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Locker_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Locker_Handle.png b/Assets/Female3DCG/ItemDevices/Locker_Handle.png deleted file mode 100644 index 24f5ebe88..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Locker_Handle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Locker_Lock.png b/Assets/Female3DCG/ItemDevices/Locker_Lock.png deleted file mode 100644 index d821574b5..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Locker_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LowCage.png b/Assets/Female3DCG/ItemDevices/LowCage.png deleted file mode 100644 index 6fe422850..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LowCage.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/LowCage_Lock.png b/Assets/Female3DCG/ItemDevices/LowCage_Lock.png deleted file mode 100644 index cae7cddc1..000000000 Binary files a/Assets/Female3DCG/ItemDevices/LowCage_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/MedicalBed_BedFrame.png b/Assets/Female3DCG/ItemDevices/MedicalBed_BedFrame.png deleted file mode 100644 index 4b3d5ca7a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/MedicalBed_BedFrame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/MedicalBed_Mattress.png b/Assets/Female3DCG/ItemDevices/MedicalBed_Mattress.png deleted file mode 100644 index fbf8ba82e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/MedicalBed_Mattress.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/MedicalBed_Pillow.png b/Assets/Female3DCG/ItemDevices/MedicalBed_Pillow.png deleted file mode 100644 index 8fb323dca..000000000 Binary files a/Assets/Female3DCG/ItemDevices/MedicalBed_Pillow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/MilkCan.png b/Assets/Female3DCG/ItemDevices/MilkCan.png deleted file mode 100644 index e0b4520bc..000000000 Binary files a/Assets/Female3DCG/ItemDevices/MilkCan.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Net_Back.png b/Assets/Female3DCG/ItemDevices/Net_Back.png deleted file mode 100644 index 03c20624d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Net_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Net_Front.png b/Assets/Female3DCG/ItemDevices/Net_Front.png deleted file mode 100644 index a0952ad15..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Net_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OneBarPrison_Bar.png b/Assets/Female3DCG/ItemDevices/OneBarPrison_Bar.png deleted file mode 100644 index 54c69eade..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OneBarPrison_Bar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OneBarPrison_Lock.png b/Assets/Female3DCG/ItemDevices/OneBarPrison_Lock.png deleted file mode 100644 index acd39c1bc..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OneBarPrison_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OneBarPrison_Pussy.png b/Assets/Female3DCG/ItemDevices/OneBarPrison_Pussy.png deleted file mode 100644 index 50947db73..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OneBarPrison_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/BondageBench.png b/Assets/Female3DCG/ItemDevices/Orig/BondageBench.png deleted file mode 100644 index d7887b010..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/BondageBench.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/BondageBenchstraps.png b/Assets/Female3DCG/ItemDevices/Orig/BondageBenchstraps.png deleted file mode 100644 index 2a5e2067b..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/BondageBenchstraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/BurlapSack.png b/Assets/Female3DCG/ItemDevices/Orig/BurlapSack.png deleted file mode 100644 index 43e598430..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/BurlapSack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/Cage.png b/Assets/Female3DCG/ItemDevices/Orig/Cage.png deleted file mode 100644 index 4873fff1a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/Cage.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/DisplayCase.png b/Assets/Female3DCG/ItemDevices/Orig/DisplayCase.png deleted file mode 100644 index 8dd4a247c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/DisplayCase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/Familiar.png b/Assets/Female3DCG/ItemDevices/Orig/Familiar.png deleted file mode 100644 index e82760280..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/Familiar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/FamiliarBat.png b/Assets/Female3DCG/ItemDevices/Orig/FamiliarBat.png deleted file mode 100644 index e82760280..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/FamiliarBat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/FamiliarCat.png b/Assets/Female3DCG/ItemDevices/Orig/FamiliarCat.png deleted file mode 100644 index 6851b615d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/FamiliarCat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/FamiliarParrot.png b/Assets/Female3DCG/ItemDevices/Orig/FamiliarParrot.png deleted file mode 100644 index bc3d6b7d7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/FamiliarParrot.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/FamiliarSkeleton.png b/Assets/Female3DCG/ItemDevices/Orig/FamiliarSkeleton.png deleted file mode 100644 index 5060cbb3a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/FamiliarSkeleton.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBag.png b/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBag.png deleted file mode 100644 index 797293e63..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBagBloated.png b/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBagBloated.png deleted file mode 100644 index 27a250a3b..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBagBloated.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBagInflated.png b/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBagInflated.png deleted file mode 100644 index f553fe5a9..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBagInflated.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBagMax.png b/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBagMax.png deleted file mode 100644 index dfdb0c04f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/InflatableBodyBagMax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/LittleMonster.png b/Assets/Female3DCG/ItemDevices/Orig/LittleMonster.png deleted file mode 100644 index 469b81311..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/LittleMonster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterBlack.png b/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterBlack.png deleted file mode 100644 index 469b81311..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterBlack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterBlue.png b/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterBlue.png deleted file mode 100644 index 531ac2a3c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterBlue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterGreen.png b/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterGreen.png deleted file mode 100644 index dff23ae29..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterGreen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterRed.png b/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterRed.png deleted file mode 100644 index f85b0f172..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/LittleMonsterRed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/LowCage.png b/Assets/Female3DCG/ItemDevices/Orig/LowCage.png deleted file mode 100644 index 6fe422850..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/LowCage.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/MilkCan.png b/Assets/Female3DCG/ItemDevices/Orig/MilkCan.png deleted file mode 100644 index e0b4520bc..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/MilkCan.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/OneBarPrison_Bar.png b/Assets/Female3DCG/ItemDevices/Orig/OneBarPrison_Bar.png deleted file mode 100644 index 54c69eade..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/OneBarPrison_Bar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/OneBarPrison_Pussy.png b/Assets/Female3DCG/ItemDevices/Orig/OneBarPrison_Pussy.png deleted file mode 100644 index 50947db73..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/OneBarPrison_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/SaddleStand.png b/Assets/Female3DCG/ItemDevices/Orig/SaddleStand.png deleted file mode 100644 index adb040e7a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/SaddleStand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/SmallDisplayCase.png b/Assets/Female3DCG/ItemDevices/Orig/SmallDisplayCase.png deleted file mode 100644 index b386a4ea5..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/SmallDisplayCase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/SmallWoodenBox.png b/Assets/Female3DCG/ItemDevices/Orig/SmallWoodenBox.png deleted file mode 100644 index b103615bd..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/SmallWoodenBox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/SmallWoodenBoxOpenHead.png b/Assets/Female3DCG/ItemDevices/Orig/SmallWoodenBoxOpenHead.png deleted file mode 100644 index 144435df2..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/SmallWoodenBoxOpenHead.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/StrapOnSmooth.png b/Assets/Female3DCG/ItemDevices/Orig/StrapOnSmooth.png deleted file mode 100644 index da1f3f161..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/StrapOnSmooth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/StrapOnStuds.png b/Assets/Female3DCG/ItemDevices/Orig/StrapOnStuds.png deleted file mode 100644 index bf6fe58fd..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/StrapOnStuds.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/Sybian.png b/Assets/Female3DCG/ItemDevices/Orig/Sybian.png deleted file mode 100644 index 75787b0c6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/Sybian.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/TheDisplayFrame.png b/Assets/Female3DCG/ItemDevices/Orig/TheDisplayFrame.png deleted file mode 100644 index b670868fd..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/TheDisplayFrame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/WaterCell.png b/Assets/Female3DCG/ItemDevices/Orig/WaterCell.png deleted file mode 100644 index 9d47eca8f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/WaterCell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/WoodenBox.png b/Assets/Female3DCG/ItemDevices/Orig/WoodenBox.png deleted file mode 100644 index ac5c61ce6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/WoodenBox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/WoodenBoxOpenHead.png b/Assets/Female3DCG/ItemDevices/Orig/WoodenBoxOpenHead.png deleted file mode 100644 index cd2211bd8..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/WoodenBoxOpenHead.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Orig/WoodenStocks.png b/Assets/Female3DCG/ItemDevices/Orig/WoodenStocks.png deleted file mode 100644 index 0732d537e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Orig/WoodenStocks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OverTheHead/Cushion.png b/Assets/Female3DCG/ItemDevices/OverTheHead/Cushion.png deleted file mode 100644 index acbc0b830..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OverTheHead/Cushion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OverTheHead/CushionKneel.png b/Assets/Female3DCG/ItemDevices/OverTheHead/CushionKneel.png deleted file mode 100644 index 8d3a4e7e3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OverTheHead/CushionKneel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OverTheHead/Familiar.png b/Assets/Female3DCG/ItemDevices/OverTheHead/Familiar.png deleted file mode 100644 index ab2531657..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OverTheHead/Familiar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OverTheHead/FamiliarCat.png b/Assets/Female3DCG/ItemDevices/OverTheHead/FamiliarCat.png deleted file mode 100644 index ab917cc3a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OverTheHead/FamiliarCat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OverTheHead/FamiliarParrot.png b/Assets/Female3DCG/ItemDevices/OverTheHead/FamiliarParrot.png deleted file mode 100644 index 8f5124533..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OverTheHead/FamiliarParrot.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OverTheHead/FamiliarSkeleton.png b/Assets/Female3DCG/ItemDevices/OverTheHead/FamiliarSkeleton.png deleted file mode 100644 index 2ebe2c260..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OverTheHead/FamiliarSkeleton.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonster.png b/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonster.png deleted file mode 100644 index 29e1fdd69..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonsterBlue.png b/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonsterBlue.png deleted file mode 100644 index 93d0c5f3e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonsterBlue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonsterGreen.png b/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonsterGreen.png deleted file mode 100644 index 62d2cba53..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonsterGreen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonsterRed.png b/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonsterRed.png deleted file mode 100644 index 94bc36e41..000000000 Binary files a/Assets/Female3DCG/ItemDevices/OverTheHead/LittleMonsterRed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/PetBed_Bed.png b/Assets/Female3DCG/ItemDevices/PetBed_Bed.png deleted file mode 100644 index dd65290ef..000000000 Binary files a/Assets/Female3DCG/ItemDevices/PetBed_Bed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/PetBed_Blanket.png b/Assets/Female3DCG/ItemDevices/PetBed_Blanket.png deleted file mode 100644 index c3c5bc159..000000000 Binary files a/Assets/Female3DCG/ItemDevices/PetBed_Blanket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/PetBed_Inner.png b/Assets/Female3DCG/ItemDevices/PetBed_Inner.png deleted file mode 100644 index 0ef4bf6e4..000000000 Binary files a/Assets/Female3DCG/ItemDevices/PetBed_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/PetBed_Lining.png b/Assets/Female3DCG/ItemDevices/PetBed_Lining.png deleted file mode 100644 index 4a56f1dbf..000000000 Binary files a/Assets/Female3DCG/ItemDevices/PetBed_Lining.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/PetBowl_Bowl.png b/Assets/Female3DCG/ItemDevices/PetBowl_Bowl.png deleted file mode 100644 index 53b352bb2..000000000 Binary files a/Assets/Female3DCG/ItemDevices/PetBowl_Bowl.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Pole.png b/Assets/Female3DCG/ItemDevices/Pole.png deleted file mode 100644 index 43cda81a9..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Pole.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/BBQ.png b/Assets/Female3DCG/ItemDevices/Preview/BBQ.png deleted file mode 100644 index ef495b5dc..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/BBQ.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Bed.png b/Assets/Female3DCG/ItemDevices/Preview/Bed.png deleted file mode 100644 index 7be0263e7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Bed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/BondageBench.png b/Assets/Female3DCG/ItemDevices/Preview/BondageBench.png deleted file mode 100644 index dbc02f5d7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/BondageBench.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/BurlapSack.png b/Assets/Female3DCG/ItemDevices/Preview/BurlapSack.png deleted file mode 100644 index 595da5aac..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/BurlapSack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Cage.png b/Assets/Female3DCG/ItemDevices/Preview/Cage.png deleted file mode 100644 index 43461a694..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Cage.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/ChangingTable.png b/Assets/Female3DCG/ItemDevices/Preview/ChangingTable.png deleted file mode 100644 index 293faa682..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/ChangingTable.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Coffin.png b/Assets/Female3DCG/ItemDevices/Preview/Coffin.png deleted file mode 100644 index a0ce8ec70..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Coffin.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/ConcealingCloak.png b/Assets/Female3DCG/ItemDevices/Preview/ConcealingCloak.png deleted file mode 100644 index 1bae79ed8..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/ConcealingCloak.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Crib.png b/Assets/Female3DCG/ItemDevices/Preview/Crib.png deleted file mode 100644 index e0d86e078..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Crib.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/CryoCapsule.png b/Assets/Female3DCG/ItemDevices/Preview/CryoCapsule.png deleted file mode 100644 index 9030da399..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/CryoCapsule.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Cushion.png b/Assets/Female3DCG/ItemDevices/Preview/Cushion.png deleted file mode 100644 index cf69ee59c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Cushion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/DisplayCase.png b/Assets/Female3DCG/ItemDevices/Preview/DisplayCase.png deleted file mode 100644 index 755e04168..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/DisplayCase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/DollBox.png b/Assets/Female3DCG/ItemDevices/Preview/DollBox.png deleted file mode 100644 index 5d127478d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/DollBox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Familiar.png b/Assets/Female3DCG/ItemDevices/Preview/Familiar.png deleted file mode 100644 index 5800b7cd5..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Familiar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/FuckMachine.png b/Assets/Female3DCG/ItemDevices/Preview/FuckMachine.png deleted file mode 100644 index 7b18357ef..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/FuckMachine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/FurBlanketWrap.png b/Assets/Female3DCG/ItemDevices/Preview/FurBlanketWrap.png deleted file mode 100644 index 599afb04c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/FurBlanketWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/FuturisticCrate.png b/Assets/Female3DCG/ItemDevices/Preview/FuturisticCrate.png deleted file mode 100644 index ee247059f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/FuturisticCrate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/InflatableBodyBag.png b/Assets/Female3DCG/ItemDevices/Preview/InflatableBodyBag.png deleted file mode 100644 index 62c01c8a6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/InflatableBodyBag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Kennel.png b/Assets/Female3DCG/ItemDevices/Preview/Kennel.png deleted file mode 100644 index 372584e61..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Kennel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/LittleMonster.png b/Assets/Female3DCG/ItemDevices/Preview/LittleMonster.png deleted file mode 100644 index 68c0e3124..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/LittleMonster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Locker.png b/Assets/Female3DCG/ItemDevices/Preview/Locker.png deleted file mode 100644 index 879a5c119..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Locker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/LowCage.png b/Assets/Female3DCG/ItemDevices/Preview/LowCage.png deleted file mode 100644 index 9a4093a6b..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/LowCage.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/MedicalBed.png b/Assets/Female3DCG/ItemDevices/Preview/MedicalBed.png deleted file mode 100644 index 815eb1216..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/MedicalBed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/MilkCan.png b/Assets/Female3DCG/ItemDevices/Preview/MilkCan.png deleted file mode 100644 index 51a88e6c9..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/MilkCan.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Net.png b/Assets/Female3DCG/ItemDevices/Preview/Net.png deleted file mode 100644 index c61321558..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Net.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/OneBarPrison.png b/Assets/Female3DCG/ItemDevices/Preview/OneBarPrison.png deleted file mode 100644 index e11fe7ce1..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/OneBarPrison.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/PetBed.png b/Assets/Female3DCG/ItemDevices/Preview/PetBed.png deleted file mode 100644 index 24f4a47f4..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/PetBed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/PetBowl.png b/Assets/Female3DCG/ItemDevices/Preview/PetBowl.png deleted file mode 100644 index b9438d4a7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/PetBowl.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Pole.png b/Assets/Female3DCG/ItemDevices/Preview/Pole.png deleted file mode 100644 index e1fb08bca..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Pole.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/SaddleStand.png b/Assets/Female3DCG/ItemDevices/Preview/SaddleStand.png deleted file mode 100644 index eb8a6e89f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/SaddleStand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/SmallDisplayCase.png b/Assets/Female3DCG/ItemDevices/Preview/SmallDisplayCase.png deleted file mode 100644 index 755e04168..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/SmallDisplayCase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/SmallLocker.png b/Assets/Female3DCG/ItemDevices/Preview/SmallLocker.png deleted file mode 100644 index 7f65e737e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/SmallLocker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/SmallVentlessLocker.png b/Assets/Female3DCG/ItemDevices/Preview/SmallVentlessLocker.png deleted file mode 100644 index b5cd51b20..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/SmallVentlessLocker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/SmallWoodenBox.png b/Assets/Female3DCG/ItemDevices/Preview/SmallWoodenBox.png deleted file mode 100644 index b80123443..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/SmallWoodenBox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/SmallWoodenBoxOpenHead.png b/Assets/Female3DCG/ItemDevices/Preview/SmallWoodenBoxOpenHead.png deleted file mode 100644 index b80123443..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/SmallWoodenBoxOpenHead.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Snowman.png b/Assets/Female3DCG/ItemDevices/Preview/Snowman.png deleted file mode 100644 index dbd633a60..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Snowman.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/StrapOnSmooth.png b/Assets/Female3DCG/ItemDevices/Preview/StrapOnSmooth.png deleted file mode 100644 index 31f2593e0..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/StrapOnSmooth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/StrapOnStuds.png b/Assets/Female3DCG/ItemDevices/Preview/StrapOnStuds.png deleted file mode 100644 index 042ef3e27..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/StrapOnStuds.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Sybian.png b/Assets/Female3DCG/ItemDevices/Preview/Sybian.png deleted file mode 100644 index 2c6e1d823..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Sybian.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/TheDisplayFrame.png b/Assets/Female3DCG/ItemDevices/Preview/TheDisplayFrame.png deleted file mode 100644 index fcfdfb475..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/TheDisplayFrame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/TransportWoodenBox.png b/Assets/Female3DCG/ItemDevices/Preview/TransportWoodenBox.png deleted file mode 100644 index d48f67c90..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/TransportWoodenBox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/VacBedDeluxe.png b/Assets/Female3DCG/ItemDevices/Preview/VacBedDeluxe.png deleted file mode 100644 index 86c77a3ad..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/VacBedDeluxe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/VacCube.png b/Assets/Female3DCG/ItemDevices/Preview/VacCube.png deleted file mode 100644 index c0b52571c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/VacCube.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/Vacbed.png b/Assets/Female3DCG/ItemDevices/Preview/Vacbed.png deleted file mode 100644 index 3a829e493..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/Vacbed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/VacbedClear.png b/Assets/Female3DCG/ItemDevices/Preview/VacbedClear.png deleted file mode 100644 index d86e0bece..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/VacbedClear.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/VentlessLocker.png b/Assets/Female3DCG/ItemDevices/Preview/VentlessLocker.png deleted file mode 100644 index fe565118a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/VentlessLocker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/WaterCell.png b/Assets/Female3DCG/ItemDevices/Preview/WaterCell.png deleted file mode 100644 index 1904abd87..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/WaterCell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/WetFloor.png b/Assets/Female3DCG/ItemDevices/Preview/WetFloor.png deleted file mode 100644 index 8868aa637..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/WetFloor.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/WoodenBox.png b/Assets/Female3DCG/ItemDevices/Preview/WoodenBox.png deleted file mode 100644 index d6e39b646..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/WoodenBox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/WoodenBoxOpenHead.png b/Assets/Female3DCG/ItemDevices/Preview/WoodenBoxOpenHead.png deleted file mode 100644 index d6e39b646..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/WoodenBoxOpenHead.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/WoodenHorse.png b/Assets/Female3DCG/ItemDevices/Preview/WoodenHorse.png deleted file mode 100644 index aaa83efcb..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/WoodenHorse.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/WoodenRack.png b/Assets/Female3DCG/ItemDevices/Preview/WoodenRack.png deleted file mode 100644 index 07dbaa109..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/WoodenRack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/WoodenStocks.png b/Assets/Female3DCG/ItemDevices/Preview/WoodenStocks.png deleted file mode 100644 index 8901fba33..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/WoodenStocks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Preview/X-Cross.png b/Assets/Female3DCG/ItemDevices/Preview/X-Cross.png deleted file mode 100644 index 600f9e009..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Preview/X-Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SaddleStand.png b/Assets/Female3DCG/ItemDevices/SaddleStand.png deleted file mode 100644 index adb040e7a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SaddleStand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SaddleStand_Lock.png b/Assets/Female3DCG/ItemDevices/SaddleStand_Lock.png deleted file mode 100644 index 0f7a0143e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SaddleStand_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallDisplayCase.png b/Assets/Female3DCG/ItemDevices/SmallDisplayCase.png deleted file mode 100644 index b386a4ea5..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallDisplayCase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallDisplayCase_Lock.png b/Assets/Female3DCG/ItemDevices/SmallDisplayCase_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallDisplayCase_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallLockerVentless_Lock.png b/Assets/Female3DCG/ItemDevices/SmallLockerVentless_Lock.png deleted file mode 100644 index 62e77245f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallLockerVentless_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallLockerVentless_VentCovers.png b/Assets/Female3DCG/ItemDevices/SmallLockerVentless_VentCovers.png deleted file mode 100644 index 4eb4003aa..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallLockerVentless_VentCovers.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallLocker_Back.png b/Assets/Female3DCG/ItemDevices/SmallLocker_Back.png deleted file mode 100644 index 00ff42baf..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallLocker_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallLocker_Door.png b/Assets/Female3DCG/ItemDevices/SmallLocker_Door.png deleted file mode 100644 index 8a12d83c7..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallLocker_Door.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallLocker_Frame.png b/Assets/Female3DCG/ItemDevices/SmallLocker_Frame.png deleted file mode 100644 index be534b315..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallLocker_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallLocker_Handle.png b/Assets/Female3DCG/ItemDevices/SmallLocker_Handle.png deleted file mode 100644 index 92a8a3920..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallLocker_Handle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallLocker_Lock.png b/Assets/Female3DCG/ItemDevices/SmallLocker_Lock.png deleted file mode 100644 index 62e77245f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallLocker_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallWoodenBox.png b/Assets/Female3DCG/ItemDevices/SmallWoodenBox.png deleted file mode 100644 index b103615bd..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallWoodenBox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallWoodenBoxOpenHead.png b/Assets/Female3DCG/ItemDevices/SmallWoodenBoxOpenHead.png deleted file mode 100644 index 144435df2..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallWoodenBoxOpenHead.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallWoodenBoxOpenHead_Lock.png b/Assets/Female3DCG/ItemDevices/SmallWoodenBoxOpenHead_Lock.png deleted file mode 100644 index 36ba4047a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallWoodenBoxOpenHead_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/SmallWoodenBox_Lock.png b/Assets/Female3DCG/ItemDevices/SmallWoodenBox_Lock.png deleted file mode 100644 index 36ba4047a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/SmallWoodenBox_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Snowman_Buttons.png b/Assets/Female3DCG/ItemDevices/Snowman_Buttons.png deleted file mode 100644 index a3661503e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Snowman_Buttons.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Snowman_Snow.png b/Assets/Female3DCG/ItemDevices/Snowman_Snow.png deleted file mode 100644 index 3292b1b1b..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Snowman_Snow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Snowman_StickHands.png b/Assets/Female3DCG/ItemDevices/Snowman_StickHands.png deleted file mode 100644 index 82a80b24d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Snowman_StickHands.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/StrapOnSmooth.png b/Assets/Female3DCG/ItemDevices/StrapOnSmooth.png deleted file mode 100644 index da1f3f161..000000000 Binary files a/Assets/Female3DCG/ItemDevices/StrapOnSmooth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/StrapOnStuds.png b/Assets/Female3DCG/ItemDevices/StrapOnStuds.png deleted file mode 100644 index bf6fe58fd..000000000 Binary files a/Assets/Female3DCG/ItemDevices/StrapOnStuds.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Sybian.png b/Assets/Female3DCG/ItemDevices/Sybian.png deleted file mode 100644 index c1a70fe74..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Sybian.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TapedHands/Cushion.png b/Assets/Female3DCG/ItemDevices/TapedHands/Cushion.png deleted file mode 100644 index acbc0b830..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TapedHands/Cushion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TapedHands/CushionKneel.png b/Assets/Female3DCG/ItemDevices/TapedHands/CushionKneel.png deleted file mode 100644 index 8d3a4e7e3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TapedHands/CushionKneel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TapedHands/Familiar.png b/Assets/Female3DCG/ItemDevices/TapedHands/Familiar.png deleted file mode 100644 index ab2531657..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TapedHands/Familiar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TapedHands/FamiliarCat.png b/Assets/Female3DCG/ItemDevices/TapedHands/FamiliarCat.png deleted file mode 100644 index ab917cc3a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TapedHands/FamiliarCat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TapedHands/FamiliarParrot.png b/Assets/Female3DCG/ItemDevices/TapedHands/FamiliarParrot.png deleted file mode 100644 index 8f5124533..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TapedHands/FamiliarParrot.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TapedHands/FamiliarSkeleton.png b/Assets/Female3DCG/ItemDevices/TapedHands/FamiliarSkeleton.png deleted file mode 100644 index 2ebe2c260..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TapedHands/FamiliarSkeleton.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonster.png b/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonster.png deleted file mode 100644 index 29e1fdd69..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonsterBlue.png b/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonsterBlue.png deleted file mode 100644 index 93d0c5f3e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonsterBlue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonsterGreen.png b/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonsterGreen.png deleted file mode 100644 index 62d2cba53..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonsterGreen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonsterRed.png b/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonsterRed.png deleted file mode 100644 index 94bc36e41..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TapedHands/LittleMonsterRed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TheDisplayFrame.png b/Assets/Female3DCG/ItemDevices/TheDisplayFrame.png deleted file mode 100644 index 252cafd1b..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TheDisplayFrame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TheDisplayFrame_Lock.png b/Assets/Female3DCG/ItemDevices/TheDisplayFrame_Lock.png deleted file mode 100644 index 42b0cd421..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TheDisplayFrame_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TransportWoodenBoxNWSE_Lock.png b/Assets/Female3DCG/ItemDevices/TransportWoodenBoxNWSE_Lock.png deleted file mode 100644 index 6d85305ae..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TransportWoodenBoxNWSE_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Back.png b/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Back.png deleted file mode 100644 index 51a21bc40..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Frame.png b/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Frame.png deleted file mode 100644 index de7111ecd..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Lock.png b/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Lock.png deleted file mode 100644 index 6d85305ae..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Panel.png b/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Panel.png deleted file mode 100644 index 463fd49b9..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Panel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Wheelholders.png b/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Wheelholders.png deleted file mode 100644 index b749fed03..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Wheelholders.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Wheels.png b/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Wheels.png deleted file mode 100644 index 8294717ef..000000000 Binary files a/Assets/Female3DCG/ItemDevices/TransportWoodenBox_Wheels.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/VacCube_Highlights.png b/Assets/Female3DCG/ItemDevices/VacCube_Highlights.png deleted file mode 100644 index 51b8561c0..000000000 Binary files a/Assets/Female3DCG/ItemDevices/VacCube_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/VacCube_Large_Latex.png b/Assets/Female3DCG/ItemDevices/VacCube_Large_Latex.png deleted file mode 100644 index fe1d95516..000000000 Binary files a/Assets/Female3DCG/ItemDevices/VacCube_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/VacCube_Normal_Latex.png b/Assets/Female3DCG/ItemDevices/VacCube_Normal_Latex.png deleted file mode 100644 index 8d354d796..000000000 Binary files a/Assets/Female3DCG/ItemDevices/VacCube_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/VacCube_Small_Latex.png b/Assets/Female3DCG/ItemDevices/VacCube_Small_Latex.png deleted file mode 100644 index a8a0be668..000000000 Binary files a/Assets/Female3DCG/ItemDevices/VacCube_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/VacCube_XLarge_Latex.png b/Assets/Female3DCG/ItemDevices/VacCube_XLarge_Latex.png deleted file mode 100644 index 68889fee9..000000000 Binary files a/Assets/Female3DCG/ItemDevices/VacCube_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/VacbedClear_Large.png b/Assets/Female3DCG/ItemDevices/VacbedClear_Large.png deleted file mode 100644 index 38896165c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/VacbedClear_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/VacbedClear_Normal.png b/Assets/Female3DCG/ItemDevices/VacbedClear_Normal.png deleted file mode 100644 index 38896165c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/VacbedClear_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/VacbedClear_Small.png b/Assets/Female3DCG/ItemDevices/VacbedClear_Small.png deleted file mode 100644 index 38896165c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/VacbedClear_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/VacbedClear_XLarge.png b/Assets/Female3DCG/ItemDevices/VacbedClear_XLarge.png deleted file mode 100644 index 38896165c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/VacbedClear_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Vacbed_Large.png b/Assets/Female3DCG/ItemDevices/Vacbed_Large.png deleted file mode 100644 index c62fcea27..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Vacbed_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Vacbed_LargeNohair.png b/Assets/Female3DCG/ItemDevices/Vacbed_LargeNohair.png deleted file mode 100644 index d3ee5e820..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Vacbed_LargeNohair.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Vacbed_Normal.png b/Assets/Female3DCG/ItemDevices/Vacbed_Normal.png deleted file mode 100644 index 8effb8bb5..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Vacbed_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Vacbed_NormalNohair.png b/Assets/Female3DCG/ItemDevices/Vacbed_NormalNohair.png deleted file mode 100644 index e5f710139..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Vacbed_NormalNohair.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Vacbed_Small.png b/Assets/Female3DCG/ItemDevices/Vacbed_Small.png deleted file mode 100644 index ad169dbb3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Vacbed_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Vacbed_SmallNohair.png b/Assets/Female3DCG/ItemDevices/Vacbed_SmallNohair.png deleted file mode 100644 index 8c4e910ca..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Vacbed_SmallNohair.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Vacbed_XLarge.png b/Assets/Female3DCG/ItemDevices/Vacbed_XLarge.png deleted file mode 100644 index 8e0ce5f1b..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Vacbed_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Vacbed_XLargeNohair.png b/Assets/Female3DCG/ItemDevices/Vacbed_XLargeNohair.png deleted file mode 100644 index 4e6983ec0..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Vacbed_XLargeNohair.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WaterCell.png b/Assets/Female3DCG/ItemDevices/WaterCell.png deleted file mode 100644 index 9d47eca8f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WaterCell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WetFloor_Sign.png b/Assets/Female3DCG/ItemDevices/WetFloor_Sign.png deleted file mode 100644 index fd1f674be..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WetFloor_Sign.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WetFloor_Text.png b/Assets/Female3DCG/ItemDevices/WetFloor_Text.png deleted file mode 100644 index 9895fb9fb..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WetFloor_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenBoxNWSE_Lock.png b/Assets/Female3DCG/ItemDevices/WoodenBoxNWSE_Lock.png deleted file mode 100644 index 6d85305ae..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenBoxNWSE_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenBoxOpenHead.png b/Assets/Female3DCG/ItemDevices/WoodenBoxOpenHead.png deleted file mode 100644 index cd2211bd8..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenBoxOpenHead.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenBoxOpenHead_Lock.png b/Assets/Female3DCG/ItemDevices/WoodenBoxOpenHead_Lock.png deleted file mode 100644 index 6d85305ae..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenBoxOpenHead_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenBox_Back.png b/Assets/Female3DCG/ItemDevices/WoodenBox_Back.png deleted file mode 100644 index 51a21bc40..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenBox_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenBox_Frame.png b/Assets/Female3DCG/ItemDevices/WoodenBox_Frame.png deleted file mode 100644 index de7111ecd..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenBox_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenBox_Lock.png b/Assets/Female3DCG/ItemDevices/WoodenBox_Lock.png deleted file mode 100644 index 6d85305ae..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenBox_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenBox_Panel.png b/Assets/Female3DCG/ItemDevices/WoodenBox_Panel.png deleted file mode 100644 index 463fd49b9..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenBox_Panel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenHorse_Frame.png b/Assets/Female3DCG/ItemDevices/WoodenHorse_Frame.png deleted file mode 100644 index 12b47af3f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenHorse_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenHorse_Wood.png b/Assets/Female3DCG/ItemDevices/WoodenHorse_Wood.png deleted file mode 100644 index daa4ea186..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenHorse_Wood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_Back.png b/Assets/Female3DCG/ItemDevices/WoodenRack_Back.png deleted file mode 100644 index 54cf44d3a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_BotChains.png b/Assets/Female3DCG/ItemDevices/WoodenRack_BotChains.png deleted file mode 100644 index 4dde4e228..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_BotChains.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_BotChainsTogether.png b/Assets/Female3DCG/ItemDevices/WoodenRack_BotChainsTogether.png deleted file mode 100644 index 6e1f47bd6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_BotChainsTogether.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_BotRings.png b/Assets/Female3DCG/ItemDevices/WoodenRack_BotRings.png deleted file mode 100644 index d973e03bb..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_BotRings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_BotRopes.png b/Assets/Female3DCG/ItemDevices/WoodenRack_BotRopes.png deleted file mode 100644 index 19073a651..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_BotRopes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_BotRopesTogether.png b/Assets/Female3DCG/ItemDevices/WoodenRack_BotRopesTogether.png deleted file mode 100644 index f811820c6..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_BotRopesTogether.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_BotStocks.png b/Assets/Female3DCG/ItemDevices/WoodenRack_BotStocks.png deleted file mode 100644 index dac8ceec1..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_BotStocks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_BotStocksBack.png b/Assets/Female3DCG/ItemDevices/WoodenRack_BotStocksBack.png deleted file mode 100644 index 19077ad07..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_BotStocksBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_FrameMetal.png b/Assets/Female3DCG/ItemDevices/WoodenRack_FrameMetal.png deleted file mode 100644 index f534a12d2..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_FrameMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_FrameStains.png b/Assets/Female3DCG/ItemDevices/WoodenRack_FrameStains.png deleted file mode 100644 index 780cc7aac..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_FrameStains.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_FrameWood.png b/Assets/Female3DCG/ItemDevices/WoodenRack_FrameWood.png deleted file mode 100644 index cedc7b541..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_FrameWood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_HalfBack.png b/Assets/Female3DCG/ItemDevices/WoodenRack_HalfBack.png deleted file mode 100644 index 34b119f13..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_HalfBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_TopChains.png b/Assets/Female3DCG/ItemDevices/WoodenRack_TopChains.png deleted file mode 100644 index 56b63614d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_TopChains.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_TopChainsTight.png b/Assets/Female3DCG/ItemDevices/WoodenRack_TopChainsTight.png deleted file mode 100644 index 6fab53245..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_TopChainsTight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_TopRopes.png b/Assets/Female3DCG/ItemDevices/WoodenRack_TopRopes.png deleted file mode 100644 index bc51899e0..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_TopRopes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_TopRopesTight.png b/Assets/Female3DCG/ItemDevices/WoodenRack_TopRopesTight.png deleted file mode 100644 index c11a9f39d..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_TopRopesTight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_TopStocks.png b/Assets/Female3DCG/ItemDevices/WoodenRack_TopStocks.png deleted file mode 100644 index 0c911a19f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_TopStocks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenRack_TopStocksBack.png b/Assets/Female3DCG/ItemDevices/WoodenRack_TopStocksBack.png deleted file mode 100644 index 1fa0ecc21..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenRack_TopStocksBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenStocks.png b/Assets/Female3DCG/ItemDevices/WoodenStocks.png deleted file mode 100644 index 0732d537e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenStocks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/WoodenStocks_Lock.png b/Assets/Female3DCG/ItemDevices/WoodenStocks_Lock.png deleted file mode 100644 index 0b992364f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/WoodenStocks_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/X-Cross_Cross.png b/Assets/Female3DCG/ItemDevices/X-Cross_Cross.png deleted file mode 100644 index 64df54fa0..000000000 Binary files a/Assets/Female3DCG/ItemDevices/X-Cross_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/X-Cross_Lock.png b/Assets/Female3DCG/ItemDevices/X-Cross_Lock.png deleted file mode 100644 index 0a3b386a8..000000000 Binary files a/Assets/Female3DCG/ItemDevices/X-Cross_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/X-Cross_Padding.png b/Assets/Female3DCG/ItemDevices/X-Cross_Padding.png deleted file mode 100644 index df463f45f..000000000 Binary files a/Assets/Female3DCG/ItemDevices/X-Cross_Padding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/Cushion.png b/Assets/Female3DCG/ItemDevices/Yoked/Cushion.png deleted file mode 100644 index acbc0b830..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/Cushion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/CushionKneel.png b/Assets/Female3DCG/ItemDevices/Yoked/CushionKneel.png deleted file mode 100644 index 8d3a4e7e3..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/CushionKneel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/Familiar.png b/Assets/Female3DCG/ItemDevices/Yoked/Familiar.png deleted file mode 100644 index ab2531657..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/Familiar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/FamiliarCat.png b/Assets/Female3DCG/ItemDevices/Yoked/FamiliarCat.png deleted file mode 100644 index ab917cc3a..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/FamiliarCat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/FamiliarParrot.png b/Assets/Female3DCG/ItemDevices/Yoked/FamiliarParrot.png deleted file mode 100644 index 8f5124533..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/FamiliarParrot.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/FamiliarSkeleton.png b/Assets/Female3DCG/ItemDevices/Yoked/FamiliarSkeleton.png deleted file mode 100644 index 2ebe2c260..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/FamiliarSkeleton.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/LittleMonster.png b/Assets/Female3DCG/ItemDevices/Yoked/LittleMonster.png deleted file mode 100644 index 29e1fdd69..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/LittleMonster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/LittleMonsterBlue.png b/Assets/Female3DCG/ItemDevices/Yoked/LittleMonsterBlue.png deleted file mode 100644 index 93d0c5f3e..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/LittleMonsterBlue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/LittleMonsterGreen.png b/Assets/Female3DCG/ItemDevices/Yoked/LittleMonsterGreen.png deleted file mode 100644 index 62d2cba53..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/LittleMonsterGreen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/LittleMonsterRed.png b/Assets/Female3DCG/ItemDevices/Yoked/LittleMonsterRed.png deleted file mode 100644 index 94bc36e41..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/LittleMonsterRed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_Back.png b/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_Back.png deleted file mode 100644 index 019e7c71c..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_Front.png b/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_Front.png deleted file mode 100644 index f07b44f97..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_WeightsBack.png b/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_WeightsBack.png deleted file mode 100644 index 7a6a87069..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_WeightsBack.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_WeightsFront.png b/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_WeightsFront.png deleted file mode 100644 index 39e411829..000000000 Binary files a/Assets/Female3DCG/ItemDevices/Yoked/NetKneel_WeightsFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemEars/FuturisticEarphones_Band.png b/Assets/Female3DCG/ItemEars/FuturisticEarphones_Band.png deleted file mode 100644 index 7cd653813..000000000 Binary files a/Assets/Female3DCG/ItemEars/FuturisticEarphones_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemEars/FuturisticEarphones_Display.png b/Assets/Female3DCG/ItemEars/FuturisticEarphones_Display.png deleted file mode 100644 index 709a6bbab..000000000 Binary files a/Assets/Female3DCG/ItemEars/FuturisticEarphones_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemEars/FuturisticEarphones_Lock.png b/Assets/Female3DCG/ItemEars/FuturisticEarphones_Lock.png deleted file mode 100644 index 9fd09899c..000000000 Binary files a/Assets/Female3DCG/ItemEars/FuturisticEarphones_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemEars/Headphones_Dark.png b/Assets/Female3DCG/ItemEars/Headphones_Dark.png deleted file mode 100644 index 49ec0c427..000000000 Binary files a/Assets/Female3DCG/ItemEars/Headphones_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemEars/Headphones_Light.png b/Assets/Female3DCG/ItemEars/Headphones_Light.png deleted file mode 100644 index 76dc9e01a..000000000 Binary files a/Assets/Female3DCG/ItemEars/Headphones_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemEars/Preview/BluetoothEarbuds.png b/Assets/Female3DCG/ItemEars/Preview/BluetoothEarbuds.png deleted file mode 100644 index 1cc100141..000000000 Binary files a/Assets/Female3DCG/ItemEars/Preview/BluetoothEarbuds.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemEars/Preview/FuturisticEarphones.png b/Assets/Female3DCG/ItemEars/Preview/FuturisticEarphones.png deleted file mode 100644 index 33b6e3d69..000000000 Binary files a/Assets/Female3DCG/ItemEars/Preview/FuturisticEarphones.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemEars/Preview/HeadphoneEarPlugs.png b/Assets/Female3DCG/ItemEars/Preview/HeadphoneEarPlugs.png deleted file mode 100644 index e4364fda9..000000000 Binary files a/Assets/Female3DCG/ItemEars/Preview/HeadphoneEarPlugs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemEars/Preview/Headphones.png b/Assets/Female3DCG/ItemEars/Preview/Headphones.png deleted file mode 100644 index fe118c7f7..000000000 Binary files a/Assets/Female3DCG/ItemEars/Preview/Headphones.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemEars/Preview/HeavyDutyEarPlugs.png b/Assets/Female3DCG/ItemEars/Preview/HeavyDutyEarPlugs.png deleted file mode 100644 index 263860ff6..000000000 Binary files a/Assets/Female3DCG/ItemEars/Preview/HeavyDutyEarPlugs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemEars/Preview/LightDutyEarPlugs.png b/Assets/Female3DCG/ItemEars/Preview/LightDutyEarPlugs.png deleted file mode 100644 index 7739698cf..000000000 Binary files a/Assets/Female3DCG/ItemEars/Preview/LightDutyEarPlugs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/AnkleShackles_Large.png b/Assets/Female3DCG/ItemFeet/AnkleShackles_Large.png deleted file mode 100644 index 118af9d8b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/AnkleShackles_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/AnkleShackles_Lock.png b/Assets/Female3DCG/ItemFeet/AnkleShackles_Lock.png deleted file mode 100644 index 239d75d3a..000000000 Binary files a/Assets/Female3DCG/ItemFeet/AnkleShackles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/AnkleShackles_Normal.png b/Assets/Female3DCG/ItemFeet/AnkleShackles_Normal.png deleted file mode 100644 index 1a0ed49a7..000000000 Binary files a/Assets/Female3DCG/ItemFeet/AnkleShackles_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/AnkleShackles_Small.png b/Assets/Female3DCG/ItemFeet/AnkleShackles_Small.png deleted file mode 100644 index 1a0ed49a7..000000000 Binary files a/Assets/Female3DCG/ItemFeet/AnkleShackles_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/AnkleShackles_XLarge.png b/Assets/Female3DCG/ItemFeet/AnkleShackles_XLarge.png deleted file mode 100644 index 118af9d8b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/AnkleShackles_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/BallChain_Large.png b/Assets/Female3DCG/ItemFeet/BallChain_Large.png deleted file mode 100644 index 53f7ecd7b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/BallChain_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/BallChain_Lock.png b/Assets/Female3DCG/ItemFeet/BallChain_Lock.png deleted file mode 100644 index 05d863a5a..000000000 Binary files a/Assets/Female3DCG/ItemFeet/BallChain_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/BallChain_Normal.png b/Assets/Female3DCG/ItemFeet/BallChain_Normal.png deleted file mode 100644 index 9fc6cad92..000000000 Binary files a/Assets/Female3DCG/ItemFeet/BallChain_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/BallChain_Small.png b/Assets/Female3DCG/ItemFeet/BallChain_Small.png deleted file mode 100644 index a58d331a8..000000000 Binary files a/Assets/Female3DCG/ItemFeet/BallChain_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/BallChain_XLarge.png b/Assets/Female3DCG/ItemFeet/BallChain_XLarge.png deleted file mode 100644 index 0a9e6049c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/BallChain_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/ChainsStrict_Lock.png b/Assets/Female3DCG/ItemFeet/ChainsStrict_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemFeet/ChainsStrict_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/ChainsSuspension_Lock.png b/Assets/Female3DCG/ItemFeet/ChainsSuspension_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemFeet/ChainsSuspension_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_Large.png b/Assets/Female3DCG/ItemFeet/Chains_Large.png deleted file mode 100644 index a91450d3f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_LargeStrict.png b/Assets/Female3DCG/ItemFeet/Chains_LargeStrict.png deleted file mode 100644 index de11d22f5..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_LargeStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_LargeSuspension.png b/Assets/Female3DCG/ItemFeet/Chains_LargeSuspension.png deleted file mode 100644 index a91450d3f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_LargeSuspension.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_Lock.png b/Assets/Female3DCG/ItemFeet/Chains_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_Normal.png b/Assets/Female3DCG/ItemFeet/Chains_Normal.png deleted file mode 100644 index b1cea03f3..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_NormalStrict.png b/Assets/Female3DCG/ItemFeet/Chains_NormalStrict.png deleted file mode 100644 index 55b7687f5..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_NormalStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_NormalSuspension.png b/Assets/Female3DCG/ItemFeet/Chains_NormalSuspension.png deleted file mode 100644 index b1cea03f3..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_NormalSuspension.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_Small.png b/Assets/Female3DCG/ItemFeet/Chains_Small.png deleted file mode 100644 index 049ab66b5..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_SmallStrict.png b/Assets/Female3DCG/ItemFeet/Chains_SmallStrict.png deleted file mode 100644 index 1bd903dfa..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_SmallStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_SmallSuspension.png b/Assets/Female3DCG/ItemFeet/Chains_SmallSuspension.png deleted file mode 100644 index 049ab66b5..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_SmallSuspension.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_XLarge.png b/Assets/Female3DCG/ItemFeet/Chains_XLarge.png deleted file mode 100644 index 867a74d1e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_XLargeStrict.png b/Assets/Female3DCG/ItemFeet/Chains_XLargeStrict.png deleted file mode 100644 index b11764b1a..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_XLargeStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Chains_XLargeSuspension.png b/Assets/Female3DCG/ItemFeet/Chains_XLargeSuspension.png deleted file mode 100644 index 867a74d1e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Chains_XLargeSuspension.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_Large.png b/Assets/Female3DCG/ItemFeet/DuctTape_Large.png deleted file mode 100644 index 8d53ef5eb..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_LargeCompleteFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_LargeCompleteFeet.png deleted file mode 100644 index b9cc12512..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_LargeCompleteFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_LargeHalfFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_LargeHalfFeet.png deleted file mode 100644 index a717e0306..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_LargeHalfFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_LargeMostFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_LargeMostFeet.png deleted file mode 100644 index 593ec32a0..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_LargeMostFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_Normal.png b/Assets/Female3DCG/ItemFeet/DuctTape_Normal.png deleted file mode 100644 index 637958524..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_NormalCompleteFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_NormalCompleteFeet.png deleted file mode 100644 index 38c926d98..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_NormalCompleteFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_NormalHalfFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_NormalHalfFeet.png deleted file mode 100644 index 7d54e7173..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_NormalHalfFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_NormalMostFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_NormalMostFeet.png deleted file mode 100644 index be382a5c4..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_NormalMostFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_Small.png b/Assets/Female3DCG/ItemFeet/DuctTape_Small.png deleted file mode 100644 index ed1074a0d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_SmallCompleteFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_SmallCompleteFeet.png deleted file mode 100644 index 6f4ed8d22..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_SmallCompleteFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_SmallHalfFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_SmallHalfFeet.png deleted file mode 100644 index 32d6ebb99..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_SmallHalfFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_SmallMostFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_SmallMostFeet.png deleted file mode 100644 index 7ef839366..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_SmallMostFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_XLarge.png b/Assets/Female3DCG/ItemFeet/DuctTape_XLarge.png deleted file mode 100644 index 9ed727804..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_XLargeCompleteFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_XLargeCompleteFeet.png deleted file mode 100644 index d680286d6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_XLargeCompleteFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_XLargeHalfFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_XLargeHalfFeet.png deleted file mode 100644 index a87fc6908..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_XLargeHalfFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/DuctTape_XLargeMostFeet.png b/Assets/Female3DCG/ItemFeet/DuctTape_XLargeMostFeet.png deleted file mode 100644 index db6d4304f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/DuctTape_XLargeMostFeet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FloorShackles_Large_Chain.png b/Assets/Female3DCG/ItemFeet/FloorShackles_Large_Chain.png deleted file mode 100644 index 1e3788380..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FloorShackles_Large_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FloorShackles_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/FloorShackles_Large_Cuffs.png deleted file mode 100644 index 48f441757..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FloorShackles_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FloorShackles_Lock.png b/Assets/Female3DCG/ItemFeet/FloorShackles_Lock.png deleted file mode 100644 index 1ea272f78..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FloorShackles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FloorShackles_Normal_Chain.png b/Assets/Female3DCG/ItemFeet/FloorShackles_Normal_Chain.png deleted file mode 100644 index 1e3788380..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FloorShackles_Normal_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FloorShackles_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/FloorShackles_Normal_Cuffs.png deleted file mode 100644 index f7301d3eb..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FloorShackles_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FloorShackles_Small_Chain.png b/Assets/Female3DCG/ItemFeet/FloorShackles_Small_Chain.png deleted file mode 100644 index 1e3788380..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FloorShackles_Small_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FloorShackles_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/FloorShackles_Small_Cuffs.png deleted file mode 100644 index 21692b5b0..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FloorShackles_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FloorShackles_XLarge_Chain.png b/Assets/Female3DCG/ItemFeet/FloorShackles_XLarge_Chain.png deleted file mode 100644 index 1e3788380..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FloorShackles_XLarge_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FloorShackles_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/FloorShackles_XLarge_Cuffs.png deleted file mode 100644 index 48f441757..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FloorShackles_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Chain.png deleted file mode 100644 index 59216acf8..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Display.png b/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Display.png deleted file mode 100644 index 91f031258..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index a89227545..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Lock.png deleted file mode 100644 index 90b81e17c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index bea71154d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index f65618675..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index 861f3eba9..000000000 Binary files a/Assets/Female3DCG/ItemFeet/FuturisticAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_Large.png b/Assets/Female3DCG/ItemFeet/HempRope_Large.png deleted file mode 100644 index 627f2b450..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_LargeBedSpreadEagle.png b/Assets/Female3DCG/ItemFeet/HempRope_LargeBedSpreadEagle.png deleted file mode 100644 index 0f420d99e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_LargeBedSpreadEagle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_LargeDiamond.png b/Assets/Female3DCG/ItemFeet/HempRope_LargeDiamond.png deleted file mode 100644 index 4fb0ef685..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_LargeDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_LargeFullBinding.png b/Assets/Female3DCG/ItemFeet/HempRope_LargeFullBinding.png deleted file mode 100644 index b74444160..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_LargeFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_LargeLink.png b/Assets/Female3DCG/ItemFeet/HempRope_LargeLink.png deleted file mode 100644 index e61b72499..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_LargeLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_LargeMermaid.png b/Assets/Female3DCG/ItemFeet/HempRope_LargeMermaid.png deleted file mode 100644 index c91efa675..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_LargeMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_LargeSuspension.png b/Assets/Female3DCG/ItemFeet/HempRope_LargeSuspension.png deleted file mode 100644 index 627f2b450..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_LargeSuspension.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_Normal.png b/Assets/Female3DCG/ItemFeet/HempRope_Normal.png deleted file mode 100644 index 8954dbea2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_NormalBedSpreadEagle.png b/Assets/Female3DCG/ItemFeet/HempRope_NormalBedSpreadEagle.png deleted file mode 100644 index 85ad6bd72..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_NormalBedSpreadEagle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_NormalDiamond.png b/Assets/Female3DCG/ItemFeet/HempRope_NormalDiamond.png deleted file mode 100644 index b2e977721..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_NormalDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_NormalFullBinding.png b/Assets/Female3DCG/ItemFeet/HempRope_NormalFullBinding.png deleted file mode 100644 index 7021b1fd0..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_NormalFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_NormalLink.png b/Assets/Female3DCG/ItemFeet/HempRope_NormalLink.png deleted file mode 100644 index 0f52c8607..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_NormalLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_NormalMermaid.png b/Assets/Female3DCG/ItemFeet/HempRope_NormalMermaid.png deleted file mode 100644 index 492ab8b79..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_NormalMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_NormalSuspension.png b/Assets/Female3DCG/ItemFeet/HempRope_NormalSuspension.png deleted file mode 100644 index 837210a33..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_NormalSuspension.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_Small.png b/Assets/Female3DCG/ItemFeet/HempRope_Small.png deleted file mode 100644 index ff41b3da6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_SmallBedSpreadEagle.png b/Assets/Female3DCG/ItemFeet/HempRope_SmallBedSpreadEagle.png deleted file mode 100644 index 858c5811f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_SmallBedSpreadEagle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_SmallDiamond.png b/Assets/Female3DCG/ItemFeet/HempRope_SmallDiamond.png deleted file mode 100644 index 7d3785c26..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_SmallDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_SmallFullBinding.png b/Assets/Female3DCG/ItemFeet/HempRope_SmallFullBinding.png deleted file mode 100644 index 1ec18a924..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_SmallFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_SmallLink.png b/Assets/Female3DCG/ItemFeet/HempRope_SmallLink.png deleted file mode 100644 index cc9a27d76..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_SmallLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_SmallMermaid.png b/Assets/Female3DCG/ItemFeet/HempRope_SmallMermaid.png deleted file mode 100644 index 2d30b9cea..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_SmallMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_SmallSuspension.png b/Assets/Female3DCG/ItemFeet/HempRope_SmallSuspension.png deleted file mode 100644 index 1960d58d2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_SmallSuspension.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_XLarge.png b/Assets/Female3DCG/ItemFeet/HempRope_XLarge.png deleted file mode 100644 index d68e27a61..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_XLargeBedSpreadEagle.png b/Assets/Female3DCG/ItemFeet/HempRope_XLargeBedSpreadEagle.png deleted file mode 100644 index e418d2c1b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_XLargeBedSpreadEagle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_XLargeDiamond.png b/Assets/Female3DCG/ItemFeet/HempRope_XLargeDiamond.png deleted file mode 100644 index 10336638e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_XLargeDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_XLargeFullBinding.png b/Assets/Female3DCG/ItemFeet/HempRope_XLargeFullBinding.png deleted file mode 100644 index f66d2062c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_XLargeFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_XLargeLink.png b/Assets/Female3DCG/ItemFeet/HempRope_XLargeLink.png deleted file mode 100644 index e29ae8660..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_XLargeLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_XLargeMermaid.png b/Assets/Female3DCG/ItemFeet/HempRope_XLargeMermaid.png deleted file mode 100644 index f9291d74a..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_XLargeMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/HempRope_XLargeSuspension.png b/Assets/Female3DCG/ItemFeet/HempRope_XLargeSuspension.png deleted file mode 100644 index 2e1635ee2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/HempRope_XLargeSuspension.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Large.png b/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Large.png deleted file mode 100644 index 02e33f0b2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Lock.png b/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Lock.png deleted file mode 100644 index 326b444c8..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Normal.png b/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Normal.png deleted file mode 100644 index f24f8c980..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Small.png b/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Small.png deleted file mode 100644 index b4f241f62..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Irish8Cuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Irish8Cuffs_XLarge.png b/Assets/Female3DCG/ItemFeet/Irish8Cuffs_XLarge.png deleted file mode 100644 index d63abe400..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Irish8Cuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Chain.png deleted file mode 100644 index fe18472eb..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index 265bc5916..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Large_Rings.png b/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Large_Rings.png deleted file mode 100644 index f386bbee0..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Lock.png deleted file mode 100644 index b27eef963..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index 807963727..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Normal_Rings.png deleted file mode 100644 index 32f0f79a3..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index f55532450..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Small_Rings.png b/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Small_Rings.png deleted file mode 100644 index 83da76d81..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index ba2fdbcb9..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_XLarge_Rings.png deleted file mode 100644 index d345195c3..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherAnkleCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherBelt_Large.png b/Assets/Female3DCG/ItemFeet/LeatherBelt_Large.png deleted file mode 100644 index 9eb5dce9e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherBelt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherBelt_Lock.png b/Assets/Female3DCG/ItemFeet/LeatherBelt_Lock.png deleted file mode 100644 index 52e9a8a98..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherBelt_Normal.png b/Assets/Female3DCG/ItemFeet/LeatherBelt_Normal.png deleted file mode 100644 index 730061bf4..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherBelt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherBelt_Small.png b/Assets/Female3DCG/ItemFeet/LeatherBelt_Small.png deleted file mode 100644 index 490b55eb6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherBelt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LeatherBelt_XLarge.png b/Assets/Female3DCG/ItemFeet/LeatherBelt_XLarge.png deleted file mode 100644 index 1940a2041..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LeatherBelt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Large.png b/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Large.png deleted file mode 100644 index de19c7f3d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Lock.png b/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Lock.png deleted file mode 100644 index 239d75d3a..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Normal.png b/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Normal.png deleted file mode 100644 index de19c7f3d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Small.png b/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Small.png deleted file mode 100644 index de19c7f3d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_XLarge.png b/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_XLarge.png deleted file mode 100644 index de19c7f3d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/AnkleShackles_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Large.png b/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Large.png deleted file mode 100644 index 7a1e65c7c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Lock.png b/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Lock.png deleted file mode 100644 index 092c31426..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Normal.png b/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Normal.png deleted file mode 100644 index ad22d351e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Small.png b/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Small.png deleted file mode 100644 index b481e29ff..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_XLarge.png b/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_XLarge.png deleted file mode 100644 index 175d62064..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/BallChain_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Chain.png deleted file mode 100644 index 61feabe2f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Display.png b/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Display.png deleted file mode 100644 index 6d9013643..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index 6fdd54b5c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Lock.png deleted file mode 100644 index ce0015fee..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index 2b4f5abf6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index 3d967c458..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index 2910ce2ab..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/FuturisticAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Chain.png deleted file mode 100644 index 61feabe2f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index 38a039aa2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Large_Rings.png b/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Large_Rings.png deleted file mode 100644 index deb3b072e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Lock.png deleted file mode 100644 index 8051f5ea5..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index 8867b8f1e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Normal_Rings.png deleted file mode 100644 index 471aea347..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index 3fc133ed3..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Small_Rings.png b/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Small_Rings.png deleted file mode 100644 index c1921ab8c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index 1db3ca10b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_XLarge_Rings.png deleted file mode 100644 index 2046cd513..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/LeatherAnkleCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Chain.png deleted file mode 100644 index 61feabe2f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index c29e2b929..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Large_Gems.png b/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Large_Gems.png deleted file mode 100644 index de85b8bfb..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index 09a144b4d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Normal_Gems.png deleted file mode 100644 index e0cb02159..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index b0da8784d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Small_Gems.png b/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Small_Gems.png deleted file mode 100644 index 224c9d1ad..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index 06a83bf0e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_XLarge_Gems.png deleted file mode 100644 index 713d4f4d6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/OrnateAnkleCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Chain.png deleted file mode 100644 index 61feabe2f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index 2e57f44da..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index 74b74f6cd..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index adf21aeab..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index 804a9c951..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/SteelAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Large.png b/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Large.png deleted file mode 100644 index d951a7c72..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Lock.png deleted file mode 100644 index 50c94c27c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Normal.png b/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Normal.png deleted file mode 100644 index 157d38ac6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Small.png b/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Small.png deleted file mode 100644 index 9a98fcc58..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_XLarge.png b/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_XLarge.png deleted file mode 100644 index 882b663e2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/LegsClosed/WoodenCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Base.png b/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Base.png deleted file mode 100644 index f12a262b1..000000000 Binary files a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Large_Straps.png b/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Large_Straps.png deleted file mode 100644 index 0e1d95c7f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Lock.png b/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Normal_Straps.png b/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Normal_Straps.png deleted file mode 100644 index 5c5ffaf47..000000000 Binary files a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Small_Straps.png b/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Small_Straps.png deleted file mode 100644 index 91febb5c1..000000000 Binary files a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_XLarge_Straps.png b/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_XLarge_Straps.png deleted file mode 100644 index ab6df91d2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/MedicalBedRestraints_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Large_BedSpreadEagleRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_Large_BedSpreadEagleRope.png deleted file mode 100644 index 5766d0024..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Large_BedSpreadEagleRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Large_BedSpreadEagleShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_Large_BedSpreadEagleShine.png deleted file mode 100644 index 05d550337..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Large_BedSpreadEagleShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Large_LowerRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_Large_LowerRope.png deleted file mode 100644 index 198dff4ec..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Large_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Large_LowerShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_Large_LowerShine.png deleted file mode 100644 index 95dc69905..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Large_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Large_UpperRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_Large_UpperRope.png deleted file mode 100644 index 3d74a23ea..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Large_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Large_UpperShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_Large_UpperShine.png deleted file mode 100644 index 1504e6556..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Large_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_BedSpreadEagleRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_Normal_BedSpreadEagleRope.png deleted file mode 100644 index 23431c855..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_BedSpreadEagleRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_BedSpreadEagleShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_Normal_BedSpreadEagleShine.png deleted file mode 100644 index 5b0354c38..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_BedSpreadEagleShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_LowerRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_Normal_LowerRope.png deleted file mode 100644 index b34f3a0f6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_LowerShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_Normal_LowerShine.png deleted file mode 100644 index 55c31955f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_UpperRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_Normal_UpperRope.png deleted file mode 100644 index 03364a926..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_UpperShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_Normal_UpperShine.png deleted file mode 100644 index e0d3f4cf5..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Normal_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Small_BedSpreadEagleRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_Small_BedSpreadEagleRope.png deleted file mode 100644 index db640b12f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Small_BedSpreadEagleRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Small_BedSpreadEagleShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_Small_BedSpreadEagleShine.png deleted file mode 100644 index 5146b2574..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Small_BedSpreadEagleShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Small_LowerRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_Small_LowerRope.png deleted file mode 100644 index 1ecbb2ebd..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Small_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Small_LowerShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_Small_LowerShine.png deleted file mode 100644 index 0f47f9d69..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Small_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Small_UpperRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_Small_UpperRope.png deleted file mode 100644 index 120213eb8..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Small_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_Small_UpperShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_Small_UpperShine.png deleted file mode 100644 index fda38dcc0..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_Small_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_BedSpreadEagleRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_BedSpreadEagleRope.png deleted file mode 100644 index aaea8dfb2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_BedSpreadEagleRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_BedSpreadEagleShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_BedSpreadEagleShine.png deleted file mode 100644 index e8318b510..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_BedSpreadEagleShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_LowerRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_LowerRope.png deleted file mode 100644 index 512233771..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_LowerShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_LowerShine.png deleted file mode 100644 index c1f17f976..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_UpperRope.png b/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_UpperRope.png deleted file mode 100644 index 5fdbb2696..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_UpperShine.png b/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_UpperShine.png deleted file mode 100644 index caba5ff13..000000000 Binary files a/Assets/Female3DCG/ItemFeet/NylonRope_XLarge_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Chain.png deleted file mode 100644 index fe18472eb..000000000 Binary files a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index 864d7f589..000000000 Binary files a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Large_Gems.png b/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Large_Gems.png deleted file mode 100644 index 8ce15274b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index 655b6770f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Normal_Gems.png deleted file mode 100644 index 0c0391a9a..000000000 Binary files a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index 1283a03f7..000000000 Binary files a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Small_Gems.png b/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Small_Gems.png deleted file mode 100644 index 68d48936d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index f457cfce4..000000000 Binary files a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_XLarge_Gems.png deleted file mode 100644 index 142e320a6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/OrnateAnkleCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/PlasticWrap_Large.png b/Assets/Female3DCG/ItemFeet/PlasticWrap_Large.png deleted file mode 100644 index 66494f277..000000000 Binary files a/Assets/Female3DCG/ItemFeet/PlasticWrap_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/PlasticWrap_Normal.png b/Assets/Female3DCG/ItemFeet/PlasticWrap_Normal.png deleted file mode 100644 index 9b5ccdb0c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/PlasticWrap_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/PlasticWrap_Small.png b/Assets/Female3DCG/ItemFeet/PlasticWrap_Small.png deleted file mode 100644 index ce74b7de1..000000000 Binary files a/Assets/Female3DCG/ItemFeet/PlasticWrap_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/PlasticWrap_XLarge.png b/Assets/Female3DCG/ItemFeet/PlasticWrap_XLarge.png deleted file mode 100644 index 675b93d3d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/PlasticWrap_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/AnkleShackles.png b/Assets/Female3DCG/ItemFeet/Preview/AnkleShackles.png deleted file mode 100644 index ec53ed4da..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/AnkleShackles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/BallChain.png b/Assets/Female3DCG/ItemFeet/Preview/BallChain.png deleted file mode 100644 index 713dd9300..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/BallChain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/Chains.png b/Assets/Female3DCG/ItemFeet/Preview/Chains.png deleted file mode 100644 index 0617c1adb..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/DuctTape.png b/Assets/Female3DCG/ItemFeet/Preview/DuctTape.png deleted file mode 100644 index f86bb58bc..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/DuctTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/FloorShackles.png b/Assets/Female3DCG/ItemFeet/Preview/FloorShackles.png deleted file mode 100644 index ae7eb32bf..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/FloorShackles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/FuturisticAnkleCuffs.png b/Assets/Female3DCG/ItemFeet/Preview/FuturisticAnkleCuffs.png deleted file mode 100644 index f70c56a26..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/FuturisticAnkleCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/HempRope.png b/Assets/Female3DCG/ItemFeet/Preview/HempRope.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/HempRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/Irish8Cuffs.png b/Assets/Female3DCG/ItemFeet/Preview/Irish8Cuffs.png deleted file mode 100644 index e31fb04cb..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/Irish8Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/LeatherAnkleCuffs.png b/Assets/Female3DCG/ItemFeet/Preview/LeatherAnkleCuffs.png deleted file mode 100644 index 59f4ca921..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/LeatherAnkleCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/LeatherBelt.png b/Assets/Female3DCG/ItemFeet/Preview/LeatherBelt.png deleted file mode 100644 index 087de8834..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/LeatherBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/MedicalBedRestraints.png b/Assets/Female3DCG/ItemFeet/Preview/MedicalBedRestraints.png deleted file mode 100644 index 850e69161..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/MedicalBedRestraints.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/NylonRope.png b/Assets/Female3DCG/ItemFeet/Preview/NylonRope.png deleted file mode 100644 index d3c1fd4d2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/NylonRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/OrnateAnkleCuffs.png b/Assets/Female3DCG/ItemFeet/Preview/OrnateAnkleCuffs.png deleted file mode 100644 index d20ba90fb..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/OrnateAnkleCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/PlasticWrap.png b/Assets/Female3DCG/ItemFeet/Preview/PlasticWrap.png deleted file mode 100644 index f559dac76..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/PlasticWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/Slime.png b/Assets/Female3DCG/ItemFeet/Preview/Slime.png deleted file mode 100644 index 2f1b835e0..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/Slime.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/SpreaderDildoBar.png b/Assets/Female3DCG/ItemFeet/Preview/SpreaderDildoBar.png deleted file mode 100644 index 61d1d1880..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/SpreaderDildoBar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/SpreaderMetal.png b/Assets/Female3DCG/ItemFeet/Preview/SpreaderMetal.png deleted file mode 100644 index 4575367cf..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/SpreaderMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/SpreaderVibratingDildoBar.png b/Assets/Female3DCG/ItemFeet/Preview/SpreaderVibratingDildoBar.png deleted file mode 100644 index dc90128ba..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/SpreaderVibratingDildoBar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/SteelAnkleCuffs.png b/Assets/Female3DCG/ItemFeet/Preview/SteelAnkleCuffs.png deleted file mode 100644 index 70e66e510..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/SteelAnkleCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/SturdyLeatherBelts.png b/Assets/Female3DCG/ItemFeet/Preview/SturdyLeatherBelts.png deleted file mode 100644 index 8f6dd41d4..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/SturdyLeatherBelts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/SuspensionCuffs.png b/Assets/Female3DCG/ItemFeet/Preview/SuspensionCuffs.png deleted file mode 100644 index 58824e87b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/SuspensionCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/SuspensionHempRope.png b/Assets/Female3DCG/ItemFeet/Preview/SuspensionHempRope.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/SuspensionHempRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/Tentacles.png b/Assets/Female3DCG/ItemFeet/Preview/Tentacles.png deleted file mode 100644 index 510ea7c8a..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/Tentacles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/WoodenCuffs.png b/Assets/Female3DCG/ItemFeet/Preview/WoodenCuffs.png deleted file mode 100644 index 94d3406a7..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/WoodenCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Preview/Zipties.png b/Assets/Female3DCG/ItemFeet/Preview/Zipties.png deleted file mode 100644 index 781403069..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Preview/Zipties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Slime_One.png b/Assets/Female3DCG/ItemFeet/Slime_One.png deleted file mode 100644 index 0c93c040d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Slime_One.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Slime_Two.png b/Assets/Female3DCG/ItemFeet/Slime_Two.png deleted file mode 100644 index d14287a75..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Slime_Two.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpeaderMetal_NormalWide.png b/Assets/Female3DCG/ItemFeet/SpeaderMetal_NormalWide.png deleted file mode 100644 index 6199917b3..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpeaderMetal_NormalWide.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Chain.png deleted file mode 100644 index 7fef270b7..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Display.png b/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Display.png deleted file mode 100644 index 44c39b722..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index 2516d65a5..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Lock.png deleted file mode 100644 index aa32b1913..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index d395aff2c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index fbdc33e08..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index 5891974b4..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/FuturisticAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Chain.png deleted file mode 100644 index 6c94c93d6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index 04fbcb4d3..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Large_Rings.png b/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Large_Rings.png deleted file mode 100644 index 1adbe223c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Lock.png deleted file mode 100644 index 01eda51ab..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index b9e65a0f9..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Normal_Rings.png deleted file mode 100644 index 4e0e76aa3..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index 1c3e3fcbc..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Small_Rings.png b/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Small_Rings.png deleted file mode 100644 index 607ffa1d0..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index 8b8836e82..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_XLarge_Rings.png deleted file mode 100644 index 5bece0c23..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/LeatherAnkleCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Chain.png deleted file mode 100644 index 6c94c93d6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index 9df1a42af..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Large_Gems.png b/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Large_Gems.png deleted file mode 100644 index 3f9a86f40..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index 44c9288cf..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Normal_Gems.png deleted file mode 100644 index 63707d0a3..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index 634154619..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Small_Gems.png b/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Small_Gems.png deleted file mode 100644 index f910d8163..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index 7eb5f67fc..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_XLarge_Gems.png deleted file mode 100644 index 187bdef06..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/OrnateAnkleCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Chain.png deleted file mode 100644 index 6c94c93d6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index 7fd04db4e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index bed792696..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index b9302f8d5..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index c1d6f9fd4..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/SteelAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Large_Inner.png b/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Large_Inner.png deleted file mode 100644 index c825c9513..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Large_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Large_Outer.png b/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Large_Outer.png deleted file mode 100644 index 89f167cd8..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Large_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Normal_Inner.png b/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Normal_Inner.png deleted file mode 100644 index c2092fb10..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Normal_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Normal_Outer.png b/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Normal_Outer.png deleted file mode 100644 index 130570829..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Normal_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_ShineSpread.png b/Assets/Female3DCG/ItemFeet/Spread/Tentacles_ShineSpread.png deleted file mode 100644 index ea7eaa1ac..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_ShineSpread.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Small_Inner.png b/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Small_Inner.png deleted file mode 100644 index 0ba2b66b4..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Small_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Small_Outer.png b/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Small_Outer.png deleted file mode 100644 index 3067976d1..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_Small_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_SuckerSpread.png b/Assets/Female3DCG/ItemFeet/Spread/Tentacles_SuckerSpread.png deleted file mode 100644 index c434d7eb2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_SuckerSpread.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_XLarge_Inner.png b/Assets/Female3DCG/ItemFeet/Spread/Tentacles_XLarge_Inner.png deleted file mode 100644 index fc808c39b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_XLarge_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_XLarge_Outer.png b/Assets/Female3DCG/ItemFeet/Spread/Tentacles_XLarge_Outer.png deleted file mode 100644 index 8729541d0..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/Tentacles_XLarge_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Large.png b/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Large.png deleted file mode 100644 index 050a39856..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Lock.png deleted file mode 100644 index 84c7a4d12..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Normal.png b/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Normal.png deleted file mode 100644 index 5be16f060..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Small.png b/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Small.png deleted file mode 100644 index c1e30671b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_XLarge.png b/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_XLarge.png deleted file mode 100644 index 5537fc5b1..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Spread/WoodenCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Large_DildoBar.png b/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Large_DildoBar.png deleted file mode 100644 index d24c4ef42..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Large_DildoBar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Large_Pussy.png b/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Large_Pussy.png deleted file mode 100644 index c0c204f98..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Large_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Lock.png b/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Lock.png deleted file mode 100644 index 8331b0a52..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Normal_DildoBar.png b/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Normal_DildoBar.png deleted file mode 100644 index 3d063eec3..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Normal_DildoBar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Normal_Pussy.png b/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Normal_Pussy.png deleted file mode 100644 index d39d6c201..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Normal_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Small_DildoBar.png b/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Small_DildoBar.png deleted file mode 100644 index 581ed9bc8..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Small_DildoBar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Small_Pussy.png b/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Small_Pussy.png deleted file mode 100644 index 3d95cd937..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_Small_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_XLarge_DildoBar.png b/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_XLarge_DildoBar.png deleted file mode 100644 index dc7ac0add..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_XLarge_DildoBar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_XLarge_Pussy.png b/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_XLarge_Pussy.png deleted file mode 100644 index 3d95cd937..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderDildoBar_XLarge_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderMetalWide_Lock.png b/Assets/Female3DCG/ItemFeet/SpreaderMetalWide_Lock.png deleted file mode 100644 index 01eda51ab..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderMetalWide_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderMetal_Large.png b/Assets/Female3DCG/ItemFeet/SpreaderMetal_Large.png deleted file mode 100644 index 54f244e0a..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderMetal_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderMetal_LargeWide.png b/Assets/Female3DCG/ItemFeet/SpreaderMetal_LargeWide.png deleted file mode 100644 index d43fd2d23..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderMetal_LargeWide.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderMetal_Lock.png b/Assets/Female3DCG/ItemFeet/SpreaderMetal_Lock.png deleted file mode 100644 index ad7575e88..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderMetal_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderMetal_Normal.png b/Assets/Female3DCG/ItemFeet/SpreaderMetal_Normal.png deleted file mode 100644 index 3734483a7..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderMetal_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderMetal_NormalWide.png b/Assets/Female3DCG/ItemFeet/SpreaderMetal_NormalWide.png deleted file mode 100644 index 7383dd318..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderMetal_NormalWide.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderMetal_Small.png b/Assets/Female3DCG/ItemFeet/SpreaderMetal_Small.png deleted file mode 100644 index 80104573e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderMetal_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderMetal_SmallWide.png b/Assets/Female3DCG/ItemFeet/SpreaderMetal_SmallWide.png deleted file mode 100644 index 07edd2cbf..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderMetal_SmallWide.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderMetal_XLarge.png b/Assets/Female3DCG/ItemFeet/SpreaderMetal_XLarge.png deleted file mode 100644 index ac1853d28..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderMetal_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderMetal_XLargeWide.png b/Assets/Female3DCG/ItemFeet/SpreaderMetal_XLargeWide.png deleted file mode 100644 index c24714fd7..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderMetal_XLargeWide.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Large_DildoBar.png b/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Large_DildoBar.png deleted file mode 100644 index 6f3c6b434..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Large_DildoBar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Large_Pussy.png b/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Large_Pussy.png deleted file mode 100644 index c0c204f98..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Large_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Lock.png b/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Lock.png deleted file mode 100644 index 8331b0a52..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Normal_DildoBar.png b/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Normal_DildoBar.png deleted file mode 100644 index 0f7cdc931..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Normal_DildoBar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Normal_Pussy.png b/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Normal_Pussy.png deleted file mode 100644 index d39d6c201..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Normal_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Small_DildoBar.png b/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Small_DildoBar.png deleted file mode 100644 index 680f255e7..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Small_DildoBar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Small_Pussy.png b/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Small_Pussy.png deleted file mode 100644 index 3d95cd937..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_Small_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_XLarge_DildoBar.png b/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_XLarge_DildoBar.png deleted file mode 100644 index 152d8cb4a..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_XLarge_DildoBar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_XLarge_Pussy.png b/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_XLarge_Pussy.png deleted file mode 100644 index 3d95cd937..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SpreaderVibratingDildoBar_XLarge_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Chain.png b/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Chain.png deleted file mode 100644 index 033225319..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Large_Cuffs.png deleted file mode 100644 index 1dbd14370..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Normal_Cuffs.png deleted file mode 100644 index 1b737c703..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Small_Cuffs.png deleted file mode 100644 index 50d642b7b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_XLarge_Cuffs.png deleted file mode 100644 index 3b747cf7c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SteelAnkleCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBeltsThree_Lock.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBeltsThree_Lock.png deleted file mode 100644 index 4b1bdbcfc..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBeltsThree_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBeltsTwo_Lock.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBeltsTwo_Lock.png deleted file mode 100644 index c8aa7174c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBeltsTwo_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_FeetBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_FeetBelt.png deleted file mode 100644 index 9129241cf..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_FeetBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_FeetMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_FeetMetal.png deleted file mode 100644 index 20e90f07d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_FeetMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_LowerBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_LowerBelt.png deleted file mode 100644 index 0a55ed83b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_LowerMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_LowerMetal.png deleted file mode 100644 index 8045bdeb9..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_UpperBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_UpperBelt.png deleted file mode 100644 index d460468a2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_UpperMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_UpperMetal.png deleted file mode 100644 index 718b32bd4..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Large_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Lock.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Lock.png deleted file mode 100644 index e94aba2c4..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_FeetBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_FeetBelt.png deleted file mode 100644 index a0addff84..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_FeetBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_FeetMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_FeetMetal.png deleted file mode 100644 index cc818fe3f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_FeetMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_LowerBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_LowerBelt.png deleted file mode 100644 index 012f4d186..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_LowerMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_LowerMetal.png deleted file mode 100644 index 95f43f233..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_UpperBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_UpperBelt.png deleted file mode 100644 index ab91a96f0..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_UpperMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_UpperMetal.png deleted file mode 100644 index a52bd1f3f..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Normal_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_FeetBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_FeetBelt.png deleted file mode 100644 index 34ae78212..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_FeetBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_FeetMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_FeetMetal.png deleted file mode 100644 index e57094baf..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_FeetMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_LowerBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_LowerBelt.png deleted file mode 100644 index 4c3cd500e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_LowerMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_LowerMetal.png deleted file mode 100644 index 6f964422d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_UpperBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_UpperBelt.png deleted file mode 100644 index b67d2d2ce..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_UpperMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_UpperMetal.png deleted file mode 100644 index f91ab2a3a..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_Small_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_FeetBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_FeetBelt.png deleted file mode 100644 index 97c580fe6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_FeetBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_FeetMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_FeetMetal.png deleted file mode 100644 index 967277826..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_FeetMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_LowerBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_LowerBelt.png deleted file mode 100644 index 53bff7f28..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_LowerMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_LowerMetal.png deleted file mode 100644 index 57830912e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_UpperBelt.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_UpperBelt.png deleted file mode 100644 index 4f39e4021..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_UpperMetal.png b/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_UpperMetal.png deleted file mode 100644 index 3e4be125c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SturdyLeatherBelts_XLarge_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Large.png b/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Large.png deleted file mode 100644 index 7a1349bc9..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Lock.png deleted file mode 100644 index d07499b44..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Normal.png b/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Normal.png deleted file mode 100644 index 7a1349bc9..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Small.png b/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Small.png deleted file mode 100644 index 7a1349bc9..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SuspensionCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/SuspensionCuffs_XLarge.png b/Assets/Female3DCG/ItemFeet/SuspensionCuffs_XLarge.png deleted file mode 100644 index 7a1349bc9..000000000 Binary files a/Assets/Female3DCG/ItemFeet/SuspensionCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Large_Inner.png b/Assets/Female3DCG/ItemFeet/Tentacles_Large_Inner.png deleted file mode 100644 index 0483f81ad..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Large_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Large_Outer.png b/Assets/Female3DCG/ItemFeet/Tentacles_Large_Outer.png deleted file mode 100644 index 16814cc7d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Large_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Large_Shine.png b/Assets/Female3DCG/ItemFeet/Tentacles_Large_Shine.png deleted file mode 100644 index e407aa782..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Large_Sucker.png b/Assets/Female3DCG/ItemFeet/Tentacles_Large_Sucker.png deleted file mode 100644 index 93d0e6282..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Large_Sucker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Inner.png b/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Inner.png deleted file mode 100644 index c8dddabf5..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Outer.png b/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Outer.png deleted file mode 100644 index 49c218ec0..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Shine.png b/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Shine.png deleted file mode 100644 index a53a55494..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Sucker.png b/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Sucker.png deleted file mode 100644 index 3c8067d6d..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Normal_Sucker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Small_Inner.png b/Assets/Female3DCG/ItemFeet/Tentacles_Small_Inner.png deleted file mode 100644 index 3fbf51643..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Small_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Small_Outer.png b/Assets/Female3DCG/ItemFeet/Tentacles_Small_Outer.png deleted file mode 100644 index 11f583045..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Small_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Small_Shine.png b/Assets/Female3DCG/ItemFeet/Tentacles_Small_Shine.png deleted file mode 100644 index b535345b2..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_Small_Sucker.png b/Assets/Female3DCG/ItemFeet/Tentacles_Small_Sucker.png deleted file mode 100644 index b95fac8be..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_Small_Sucker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Inner.png b/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Inner.png deleted file mode 100644 index 5ad52acd3..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Outer.png b/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Outer.png deleted file mode 100644 index 32e208343..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Shine.png b/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Shine.png deleted file mode 100644 index 42a04a09c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Sucker.png b/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Sucker.png deleted file mode 100644 index 17fc3c7d1..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Tentacles_XLarge_Sucker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/WoodenCuffs_Large.png b/Assets/Female3DCG/ItemFeet/WoodenCuffs_Large.png deleted file mode 100644 index aaf15ef6e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/WoodenCuffs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/WoodenCuffs_Lock.png b/Assets/Female3DCG/ItemFeet/WoodenCuffs_Lock.png deleted file mode 100644 index abe45b08b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/WoodenCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/WoodenCuffs_Normal.png b/Assets/Female3DCG/ItemFeet/WoodenCuffs_Normal.png deleted file mode 100644 index 12ad6cc05..000000000 Binary files a/Assets/Female3DCG/ItemFeet/WoodenCuffs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/WoodenCuffs_Small.png b/Assets/Female3DCG/ItemFeet/WoodenCuffs_Small.png deleted file mode 100644 index 36fd19695..000000000 Binary files a/Assets/Female3DCG/ItemFeet/WoodenCuffs_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/WoodenCuffs_XLarge.png b/Assets/Female3DCG/ItemFeet/WoodenCuffs_XLarge.png deleted file mode 100644 index 9fd57d70e..000000000 Binary files a/Assets/Female3DCG/ItemFeet/WoodenCuffs_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_Large.png b/Assets/Female3DCG/ItemFeet/Zipties_Large.png deleted file mode 100644 index 4780544cd..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_LargeZipFeetFull.png b/Assets/Female3DCG/ItemFeet/Zipties_LargeZipFeetFull.png deleted file mode 100644 index d98a9c959..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_LargeZipFeetFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_LargeZipFeetMedium.png b/Assets/Female3DCG/ItemFeet/Zipties_LargeZipFeetMedium.png deleted file mode 100644 index df870c83b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_LargeZipFeetMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_Normal.png b/Assets/Female3DCG/ItemFeet/Zipties_Normal.png deleted file mode 100644 index ab0752c33..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_NormalZipFeetFull.png b/Assets/Female3DCG/ItemFeet/Zipties_NormalZipFeetFull.png deleted file mode 100644 index 80b6eff71..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_NormalZipFeetFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_NormalZipFeetMedium.png b/Assets/Female3DCG/ItemFeet/Zipties_NormalZipFeetMedium.png deleted file mode 100644 index 257607c60..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_NormalZipFeetMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_Small.png b/Assets/Female3DCG/ItemFeet/Zipties_Small.png deleted file mode 100644 index 16ad54941..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_SmallZipFeetFull.png b/Assets/Female3DCG/ItemFeet/Zipties_SmallZipFeetFull.png deleted file mode 100644 index cc6e4a1f6..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_SmallZipFeetFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_SmallZipFeetMedium.png b/Assets/Female3DCG/ItemFeet/Zipties_SmallZipFeetMedium.png deleted file mode 100644 index daf3ae752..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_SmallZipFeetMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_XLarge.png b/Assets/Female3DCG/ItemFeet/Zipties_XLarge.png deleted file mode 100644 index 93662c568..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_XLargeZipFeetFull.png b/Assets/Female3DCG/ItemFeet/Zipties_XLargeZipFeetFull.png deleted file mode 100644 index 81a7eaa5b..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_XLargeZipFeetFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemFeet/Zipties_XLargeZipFeetMedium.png b/Assets/Female3DCG/ItemFeet/Zipties_XLargeZipFeetMedium.png deleted file mode 100644 index 957df4c3c..000000000 Binary files a/Assets/Female3DCG/ItemFeet/Zipties_XLargeZipFeetMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/DuctTape_Large.png b/Assets/Female3DCG/ItemHands/AllFours/DuctTape_Large.png deleted file mode 100644 index 89d8cdd03..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/DuctTape_Normal.png b/Assets/Female3DCG/ItemHands/AllFours/DuctTape_Normal.png deleted file mode 100644 index 4d4d94d58..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/DuctTape_Small.png b/Assets/Female3DCG/ItemHands/AllFours/DuctTape_Small.png deleted file mode 100644 index df5226dc5..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/DuctTape_XLarge.png b/Assets/Female3DCG/ItemHands/AllFours/DuctTape_XLarge.png deleted file mode 100644 index 4b4593509..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Body.png b/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Body.png deleted file mode 100644 index 882a98d76..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Display.png b/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Display.png deleted file mode 100644 index 17cf89075..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Lock.png b/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Lock.png deleted file mode 100644 index c31de3a77..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Mesh.png b/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Mesh.png deleted file mode 100644 index 734814e14..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittensGloves_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Body.png b/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Body.png deleted file mode 100644 index 4036a19a4..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Display.png b/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Display.png deleted file mode 100644 index 5c4747706..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Lock.png b/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Lock.png deleted file mode 100644 index 48f47de81..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Mesh.png b/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Mesh.png deleted file mode 100644 index 6bf5ea704..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/FuturisticMittens_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_Large.png b/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_Large.png deleted file mode 100644 index e292ab8eb..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_Normal.png b/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_Normal.png deleted file mode 100644 index e292ab8eb..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_Small.png b/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_Small.png deleted file mode 100644 index e292ab8eb..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_XLarge.png b/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_XLarge.png deleted file mode 100644 index e292ab8eb..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/HoofMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/KeyProp_Large.png b/Assets/Female3DCG/ItemHands/AllFours/KeyProp_Large.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/KeyProp_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/KeyProp_Normal.png b/Assets/Female3DCG/ItemHands/AllFours/KeyProp_Normal.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/KeyProp_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/KeyProp_Small.png b/Assets/Female3DCG/ItemHands/AllFours/KeyProp_Small.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/KeyProp_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/KeyProp_XLarge.png b/Assets/Female3DCG/ItemHands/AllFours/KeyProp_XLarge.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/KeyProp_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Large.png deleted file mode 100644 index 3cb25a121..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Normal.png deleted file mode 100644 index 3728601d4..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Small.png deleted file mode 100644 index bceae4da2..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_XLarge.png deleted file mode 100644 index d6596acd4..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/LeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Large.png deleted file mode 100644 index 4b034fd22..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Normal.png deleted file mode 100644 index a9807ffc9..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Small.png deleted file mode 100644 index 7cbe0602e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_XLarge.png deleted file mode 100644 index b25c7b2ea..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedLeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Large_Gloves.png deleted file mode 100644 index 980926d18..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Large_Straps.png deleted file mode 100644 index af572620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Lock.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Lock.png deleted file mode 100644 index 3001c40be..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Normal_Gloves.png deleted file mode 100644 index 980926d18..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Normal_Straps.png deleted file mode 100644 index af572620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Small_Gloves.png deleted file mode 100644 index 9d44527d9..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Small_Straps.png deleted file mode 100644 index af572620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_XLarge_Gloves.png deleted file mode 100644 index 980926d18..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_XLarge_Straps.png deleted file mode 100644 index af572620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PaddedMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Gloves.png deleted file mode 100644 index 7ce69fa03..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Paws.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Paws.png deleted file mode 100644 index 75677b742..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Straps.png deleted file mode 100644 index af572620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Lock.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Lock.png deleted file mode 100644 index 3001c40be..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Gloves.png deleted file mode 100644 index 7ce69fa03..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Paws.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Paws.png deleted file mode 100644 index 75677b742..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Straps.png deleted file mode 100644 index af572620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Gloves.png deleted file mode 100644 index 7ce69fa03..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Paws.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Paws.png deleted file mode 100644 index 75677b742..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Straps.png deleted file mode 100644 index af572620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Gloves.png deleted file mode 100644 index 7ce69fa03..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Paws.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Paws.png deleted file mode 100644 index 75677b742..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Straps.png deleted file mode 100644 index af572620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PawMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Large.png b/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Large.png deleted file mode 100644 index e234c32f1..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Lock.png b/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Lock.png deleted file mode 100644 index 74efb7e8e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Normal.png b/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Normal.png deleted file mode 100644 index 6a5087a49..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Small.png b/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Small.png deleted file mode 100644 index 7a03a9e03..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_XLarge.png b/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_XLarge.png deleted file mode 100644 index c4428f266..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/PolishedMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToys.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToys.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToys.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysBelt.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysBelt.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysBroom.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysBroom.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysBroom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCandleWax.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCandleWax.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCandleWax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCane.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCane.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCane.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCattleProd.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCattleProd.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCattleProd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCrop.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysElectricToothbrush.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysElectricToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysElectricToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysFeather.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysFeather.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysFeatherDuster.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysFeatherDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysFeatherDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysFlogger.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysFlogger.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysFlogger.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysGavel.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysGavel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysGavel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysGlassEmpty.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysGlassEmpty.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysGlassEmpty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysGlassFilled.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysGlassFilled.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysGlassFilled.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysHairbrush.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysHairbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysHairbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysHeartCrop.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysHeartCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysHeartCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysIceCube.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysIceCube.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysIceCube.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysLargeDildo.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysLargeDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysLargeDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysLongDuster.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysLongDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysLongDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysLotion.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysLotion.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysLotion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPaddle.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPetToy.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPetToy.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPetToy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPhone1.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPhone1.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPhone1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPhone2.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPhone2.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPhone2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPotionBottle.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPotionBottle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysPotionBottle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysRainbowWand.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysRainbowWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysRainbowWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysRuler.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysRuler.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysRuler.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysScissors.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysScissors.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysScissors.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysShockWand.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysShockWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysShockWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysSmallDildo.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysSmallDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysSmallDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysSmallVibratingWand.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysSmallVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysSmallVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysSword.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysSword.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysSword.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysTennisRacket.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysTennisRacket.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysTennisRacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysToothbrush.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysVibratingWand.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysVibrator.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysVibrator.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysWartenbergWheel.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysWartenbergWheel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysWartenbergWheel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysWhip.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysWhip.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysWhip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysWhipPaddle.png b/Assets/Female3DCG/ItemHands/AllFours/SpankingToysWhipPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/AllFours/SpankingToysWhipPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_Large.png b/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_Large.png deleted file mode 100644 index f6afe58a1..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_Normal.png b/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_Normal.png deleted file mode 100644 index 0bcead060..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_Small.png b/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_Small.png deleted file mode 100644 index 8fcb1cd4f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_XLarge.png b/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_XLarge.png deleted file mode 100644 index b31cb655a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Body.png b/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Body.png deleted file mode 100644 index 3046e2454..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Display.png b/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Display.png deleted file mode 100644 index 205de03ba..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Lock.png b/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Lock.png deleted file mode 100644 index 91c28fee0..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Mesh.png b/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Mesh.png deleted file mode 100644 index 5c9c884cb..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittensGloves_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Body.png b/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Body.png deleted file mode 100644 index 36921cf72..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Display.png b/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Display.png deleted file mode 100644 index 42ff4431f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Lock.png deleted file mode 100644 index fa95a89de..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Mesh.png b/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Mesh.png deleted file mode 100644 index da66ebd6f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/FuturisticMittens_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_Large.png b/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_Large.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_Normal.png b/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_Normal.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_Small.png b/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_Small.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_XLarge.png b/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_XLarge.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/KeyProp_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Large.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Normal.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Small.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_XLarge.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/LeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Large.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Normal.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Small.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_XLarge.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedLeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Large_Gloves.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Large_Straps.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Normal_Gloves.png deleted file mode 100644 index 94fa14b39..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Normal_Straps.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Small_Gloves.png deleted file mode 100644 index ae0cafd3d..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Small_Straps.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_XLarge_Gloves.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_XLarge_Straps.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PaddedMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Gloves.png deleted file mode 100644 index f71b6f638..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Paws.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Straps.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Lock.png deleted file mode 100644 index 31a0ebe47..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Gloves.png deleted file mode 100644 index c7ac303af..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Paws.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Straps.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Gloves.png deleted file mode 100644 index 35cb78165..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Paws.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Straps.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Gloves.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Paws.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Straps.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PawMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Large.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Large.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Normal.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Normal.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Small.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Small.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_XLarge.png b/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_XLarge.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/PolishedMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToys.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToys.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToys.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysBelt.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysBelt.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysBroom.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysBroom.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysBroom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCandleWax.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCandleWax.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCandleWax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCane.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCane.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCane.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCattleProd.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCattleProd.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCattleProd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCrop.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysElectricToothbrush.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysElectricToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysElectricToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysFeather.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysFeather.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysFeatherDuster.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysFeatherDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysFeatherDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysFlogger.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysFlogger.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysFlogger.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysGavel.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysGavel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysGavel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysGlassEmpty.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysGlassEmpty.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysGlassEmpty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysGlassFilled.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysGlassFilled.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysGlassFilled.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysHairbrush.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysHairbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysHairbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysHeartCrop.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysHeartCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysHeartCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysIceCube.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysIceCube.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysIceCube.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysLargeDildo.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysLargeDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysLargeDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysLongDuster.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysLongDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysLongDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysLotion.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysLotion.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysLotion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPaddle.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPetToy.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPetToy.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPetToy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPhone1.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPhone1.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPhone1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPhone2.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPhone2.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPhone2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPotionBottle.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPotionBottle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysPotionBottle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysRainbowWand.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysRainbowWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysRainbowWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysRuler.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysRuler.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysRuler.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysScissors.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysScissors.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysScissors.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysShockWand.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysShockWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysShockWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysSmallDildo.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysSmallDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysSmallDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysSmallVibratingWand.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysSmallVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysSmallVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysSword.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysSword.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysSword.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysTennisRacket.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysTennisRacket.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysTennisRacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysToothbrush.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysVibratingWand.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysVibrator.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysVibrator.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysWartenbergWheel.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysWartenbergWheel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysWartenbergWheel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysWhip.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysWhip.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysWhip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysWhipPaddle.png b/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysWhipPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackBoxTie/SpankingToysWhipPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_Large.png b/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_Large.png deleted file mode 100644 index 7af0f618f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_Normal.png b/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_Normal.png deleted file mode 100644 index 1189abe75..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_Small.png b/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_Small.png deleted file mode 100644 index e49b21439..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_XLarge.png b/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_XLarge.png deleted file mode 100644 index c4efd178a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Body.png b/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Body.png deleted file mode 100644 index d1591707a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Display.png b/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Display.png deleted file mode 100644 index 762697378..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Lock.png b/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Lock.png deleted file mode 100644 index 31138550c..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Mesh.png b/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Mesh.png deleted file mode 100644 index b4130b31e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittensGloves_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Body.png b/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Body.png deleted file mode 100644 index f76e2a9f1..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Display.png b/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Display.png deleted file mode 100644 index 34e630c29..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Lock.png deleted file mode 100644 index 435488ac0..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Mesh.png b/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Mesh.png deleted file mode 100644 index 0126dea88..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/FuturisticMittens_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_Large.png b/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_Large.png deleted file mode 100644 index 0e5aed11c..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_Normal.png b/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_Normal.png deleted file mode 100644 index 0e5aed11c..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_Small.png b/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_Small.png deleted file mode 100644 index 0e5aed11c..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_XLarge.png b/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_XLarge.png deleted file mode 100644 index 0e5aed11c..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/HoofMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_Large.png b/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_Large.png deleted file mode 100644 index aaf8f63da..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_Normal.png b/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_Normal.png deleted file mode 100644 index aaf8f63da..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_Small.png b/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_Small.png deleted file mode 100644 index aaf8f63da..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_XLarge.png b/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_XLarge.png deleted file mode 100644 index aaf8f63da..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/KeyProp_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Large.png deleted file mode 100644 index 59d047a64..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Normal.png deleted file mode 100644 index 642a24e1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Small.png deleted file mode 100644 index 5b4513ff0..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_XLarge.png deleted file mode 100644 index 1c82861f3..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/LeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Large.png deleted file mode 100644 index 3caa49574..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Normal.png deleted file mode 100644 index 09a94b6e2..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Small.png deleted file mode 100644 index cab048653..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_XLarge.png deleted file mode 100644 index 32937eda9..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedLeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Large_Gloves.png deleted file mode 100644 index 7c42f3696..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Large_Straps.png deleted file mode 100644 index 2c84f6c96..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Normal_Gloves.png deleted file mode 100644 index 7c42f3696..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Normal_Straps.png deleted file mode 100644 index 79b73c409..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Small_Gloves.png deleted file mode 100644 index 7c42f3696..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Small_Straps.png deleted file mode 100644 index 79b73c409..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_XLarge_Gloves.png deleted file mode 100644 index 7c42f3696..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_XLarge_Straps.png deleted file mode 100644 index 2c84f6c96..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PaddedMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Gloves.png deleted file mode 100644 index 1692557da..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Paws.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Paws.png deleted file mode 100644 index 1772b533f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Straps.png deleted file mode 100644 index 2c84f6c96..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Lock.png deleted file mode 100644 index 31a0ebe47..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Gloves.png deleted file mode 100644 index 1692557da..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Paws.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Paws.png deleted file mode 100644 index 1772b533f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Straps.png deleted file mode 100644 index 2c84f6c96..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Gloves.png deleted file mode 100644 index 1692557da..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Paws.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Paws.png deleted file mode 100644 index 1772b533f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Straps.png deleted file mode 100644 index 2c84f6c96..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Gloves.png deleted file mode 100644 index 1692557da..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Paws.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Paws.png deleted file mode 100644 index 1772b533f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Straps.png deleted file mode 100644 index 2c84f6c96..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PawMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Large.png b/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Large.png deleted file mode 100644 index 71075d0d4..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Normal.png b/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Normal.png deleted file mode 100644 index 13f9d7a8f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Small.png b/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Small.png deleted file mode 100644 index 62d4b38d6..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_XLarge.png b/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_XLarge.png deleted file mode 100644 index 455b7a8b8..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/PolishedMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToys.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToys.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToys.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysBelt.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysBelt.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysBroom.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysBroom.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysBroom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCandleWax.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCandleWax.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCandleWax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCane.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCane.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCane.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCattleProd.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCattleProd.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCattleProd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCrop.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysElectricToothbrush.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysElectricToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysElectricToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysFeather.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysFeather.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysFeatherDuster.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysFeatherDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysFeatherDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysFlogger.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysFlogger.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysFlogger.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysGavel.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysGavel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysGavel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysGlassEmpty.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysGlassEmpty.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysGlassEmpty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysGlassFilled.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysGlassFilled.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysGlassFilled.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysHairbrush.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysHairbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysHairbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysHeartCrop.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysHeartCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysHeartCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysIceCube.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysIceCube.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysIceCube.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysLargeDildo.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysLargeDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysLargeDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysLongDuster.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysLongDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysLongDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysLotion.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysLotion.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysLotion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPaddle.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPetToy.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPetToy.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPetToy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPhone1.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPhone1.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPhone1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPhone2.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPhone2.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPhone2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPotionBottle.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPotionBottle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysPotionBottle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysRainbowWand.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysRainbowWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysRainbowWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysRuler.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysRuler.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysRuler.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysScissors.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysScissors.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysScissors.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysShockWand.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysShockWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysShockWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysSmallDildo.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysSmallDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysSmallDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysSmallVibratingWand.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysSmallVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysSmallVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysSword.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysSword.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysSword.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysTennisRacket.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysTennisRacket.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysTennisRacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysToothbrush.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysVibratingWand.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysVibrator.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysVibrator.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysWartenbergWheel.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysWartenbergWheel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysWartenbergWheel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysWhip.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysWhip.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysWhip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysWhipPaddle.png b/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysWhipPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackCuffs/SpankingToysWhipPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_Large.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_Large.png deleted file mode 100644 index f6afe58a1..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_Normal.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_Normal.png deleted file mode 100644 index 0bcead060..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_Small.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_Small.png deleted file mode 100644 index 8fcb1cd4f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_XLarge.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_XLarge.png deleted file mode 100644 index b31cb655a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Body.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Body.png deleted file mode 100644 index 3046e2454..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Display.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Display.png deleted file mode 100644 index 205de03ba..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Lock.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Lock.png deleted file mode 100644 index 91c28fee0..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Mesh.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Mesh.png deleted file mode 100644 index 5c9c884cb..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittensGloves_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Body.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Body.png deleted file mode 100644 index 36921cf72..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Display.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Display.png deleted file mode 100644 index 42ff4431f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Lock.png deleted file mode 100644 index fa95a89de..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Mesh.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Mesh.png deleted file mode 100644 index da66ebd6f..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/FuturisticMittens_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_Large.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_Large.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_Normal.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_Normal.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_Small.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_Small.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_XLarge.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_XLarge.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/KeyProp_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Large.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Normal.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Small.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_XLarge.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/LeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Large.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Normal.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Small.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_XLarge.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedLeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Large_Gloves.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Large_Straps.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Normal_Gloves.png deleted file mode 100644 index 94fa14b39..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Normal_Straps.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Small_Gloves.png deleted file mode 100644 index ae0cafd3d..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Small_Straps.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_XLarge_Gloves.png deleted file mode 100644 index 0ff340e98..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_XLarge_Straps.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PaddedMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Gloves.png deleted file mode 100644 index f71b6f638..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Paws.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Straps.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Lock.png deleted file mode 100644 index 31a0ebe47..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Gloves.png deleted file mode 100644 index c7ac303af..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Paws.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Straps.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Gloves.png deleted file mode 100644 index 35cb78165..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Paws.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Straps.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Gloves.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Paws.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Straps.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PawMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Large.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Large.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Lock.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Normal.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Normal.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Small.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Small.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_XLarge.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_XLarge.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/PolishedMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToys.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToys.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToys.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysBelt.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysBelt.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysBroom.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysBroom.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysBroom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCandleWax.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCandleWax.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCandleWax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCane.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCane.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCane.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCattleProd.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCattleProd.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCattleProd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCrop.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysElectricToothbrush.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysElectricToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysElectricToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysFeather.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysFeather.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysFeatherDuster.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysFeatherDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysFeatherDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysFlogger.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysFlogger.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysFlogger.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysGavel.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysGavel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysGavel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysGlassEmpty.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysGlassEmpty.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysGlassEmpty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysGlassFilled.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysGlassFilled.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysGlassFilled.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysHairbrush.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysHairbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysHairbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysHeartCrop.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysHeartCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysHeartCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysIceCube.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysIceCube.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysIceCube.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysLargeDildo.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysLargeDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysLargeDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysLongDuster.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysLongDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysLongDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysLotion.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysLotion.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysLotion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPaddle.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPetToy.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPetToy.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPetToy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPhone1.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPhone1.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPhone1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPhone2.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPhone2.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPhone2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPotionBottle.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPotionBottle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysPotionBottle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysRainbowWand.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysRainbowWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysRainbowWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysRuler.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysRuler.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysRuler.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysScissors.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysScissors.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysScissors.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysShockWand.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysShockWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysShockWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysSmallDildo.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysSmallDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysSmallDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysSmallVibratingWand.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysSmallVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysSmallVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysSword.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysSword.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysSword.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysTennisRacket.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysTennisRacket.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysTennisRacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysToothbrush.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysVibratingWand.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysVibrator.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysVibrator.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysWartenbergWheel.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysWartenbergWheel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysWartenbergWheel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysWhip.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysWhip.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysWhip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysWhipPaddle.png b/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysWhipPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/BackElbowTouch/SpankingToysWhipPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/DuctTape_Large.png b/Assets/Female3DCG/ItemHands/DuctTape_Large.png deleted file mode 100644 index 93cb4919b..000000000 Binary files a/Assets/Female3DCG/ItemHands/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/DuctTape_Normal.png b/Assets/Female3DCG/ItemHands/DuctTape_Normal.png deleted file mode 100644 index 99038b438..000000000 Binary files a/Assets/Female3DCG/ItemHands/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/DuctTape_Small.png b/Assets/Female3DCG/ItemHands/DuctTape_Small.png deleted file mode 100644 index be267c7c8..000000000 Binary files a/Assets/Female3DCG/ItemHands/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/DuctTape_XLarge.png b/Assets/Female3DCG/ItemHands/DuctTape_XLarge.png deleted file mode 100644 index 7d43976ac..000000000 Binary files a/Assets/Female3DCG/ItemHands/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Body.png b/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Body.png deleted file mode 100644 index cc39055f5..000000000 Binary files a/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Display.png b/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Display.png deleted file mode 100644 index e46d29542..000000000 Binary files a/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Lock.png b/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Lock.png deleted file mode 100644 index 0787e66a5..000000000 Binary files a/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Mesh.png b/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Mesh.png deleted file mode 100644 index 2a2908ae8..000000000 Binary files a/Assets/Female3DCG/ItemHands/FuturisticMittensGloves_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/FuturisticMittens_Body.png b/Assets/Female3DCG/ItemHands/FuturisticMittens_Body.png deleted file mode 100644 index f48757e05..000000000 Binary files a/Assets/Female3DCG/ItemHands/FuturisticMittens_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/FuturisticMittens_Display.png b/Assets/Female3DCG/ItemHands/FuturisticMittens_Display.png deleted file mode 100644 index 30811ab93..000000000 Binary files a/Assets/Female3DCG/ItemHands/FuturisticMittens_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/FuturisticMittens_Lock.png b/Assets/Female3DCG/ItemHands/FuturisticMittens_Lock.png deleted file mode 100644 index 11d653eed..000000000 Binary files a/Assets/Female3DCG/ItemHands/FuturisticMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/FuturisticMittens_Mesh.png b/Assets/Female3DCG/ItemHands/FuturisticMittens_Mesh.png deleted file mode 100644 index 29b75d038..000000000 Binary files a/Assets/Female3DCG/ItemHands/FuturisticMittens_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/HoofMittens_Large.png b/Assets/Female3DCG/ItemHands/HoofMittens_Large.png deleted file mode 100644 index 1c3f4a247..000000000 Binary files a/Assets/Female3DCG/ItemHands/HoofMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/HoofMittens_Normal.png b/Assets/Female3DCG/ItemHands/HoofMittens_Normal.png deleted file mode 100644 index 07cdce018..000000000 Binary files a/Assets/Female3DCG/ItemHands/HoofMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/HoofMittens_Small.png b/Assets/Female3DCG/ItemHands/HoofMittens_Small.png deleted file mode 100644 index 2060422f0..000000000 Binary files a/Assets/Female3DCG/ItemHands/HoofMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/HoofMittens_XLarge.png b/Assets/Female3DCG/ItemHands/HoofMittens_XLarge.png deleted file mode 100644 index b1c612588..000000000 Binary files a/Assets/Female3DCG/ItemHands/HoofMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/KeyProp_Large.png b/Assets/Female3DCG/ItemHands/KeyProp_Large.png deleted file mode 100644 index 2764edef3..000000000 Binary files a/Assets/Female3DCG/ItemHands/KeyProp_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/KeyProp_Normal.png b/Assets/Female3DCG/ItemHands/KeyProp_Normal.png deleted file mode 100644 index 2764edef3..000000000 Binary files a/Assets/Female3DCG/ItemHands/KeyProp_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/KeyProp_Small.png b/Assets/Female3DCG/ItemHands/KeyProp_Small.png deleted file mode 100644 index 2764edef3..000000000 Binary files a/Assets/Female3DCG/ItemHands/KeyProp_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/KeyProp_XLarge.png b/Assets/Female3DCG/ItemHands/KeyProp_XLarge.png deleted file mode 100644 index 2764edef3..000000000 Binary files a/Assets/Female3DCG/ItemHands/KeyProp_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/LeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/LeatherMittens_Large.png deleted file mode 100644 index 8b6d7330f..000000000 Binary files a/Assets/Female3DCG/ItemHands/LeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/LeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/LeatherMittens_Lock.png deleted file mode 100644 index 73ffc801b..000000000 Binary files a/Assets/Female3DCG/ItemHands/LeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/LeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/LeatherMittens_Normal.png deleted file mode 100644 index 8b6d7330f..000000000 Binary files a/Assets/Female3DCG/ItemHands/LeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/LeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/LeatherMittens_Small.png deleted file mode 100644 index 8b6d7330f..000000000 Binary files a/Assets/Female3DCG/ItemHands/LeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/LeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/LeatherMittens_XLarge.png deleted file mode 100644 index 8b6d7330f..000000000 Binary files a/Assets/Female3DCG/ItemHands/LeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/MedicalInjector_Large.png b/Assets/Female3DCG/ItemHands/MedicalInjector_Large.png deleted file mode 100644 index 7c0e00ce9..000000000 Binary files a/Assets/Female3DCG/ItemHands/MedicalInjector_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/MedicalInjector_Normal.png b/Assets/Female3DCG/ItemHands/MedicalInjector_Normal.png deleted file mode 100644 index 7c0e00ce9..000000000 Binary files a/Assets/Female3DCG/ItemHands/MedicalInjector_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/MedicalInjector_Small.png b/Assets/Female3DCG/ItemHands/MedicalInjector_Small.png deleted file mode 100644 index 7c0e00ce9..000000000 Binary files a/Assets/Female3DCG/ItemHands/MedicalInjector_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/MedicalInjector_XLarge.png b/Assets/Female3DCG/ItemHands/MedicalInjector_XLarge.png deleted file mode 100644 index 7c0e00ce9..000000000 Binary files a/Assets/Female3DCG/ItemHands/MedicalInjector_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_Large.png b/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_Large.png deleted file mode 100644 index 3a362c7bd..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_Normal.png b/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_Normal.png deleted file mode 100644 index 3a362c7bd..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_Small.png b/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_Small.png deleted file mode 100644 index 3a362c7bd..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_XLarge.png b/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_XLarge.png deleted file mode 100644 index 3a362c7bd..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Body.png b/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Body.png deleted file mode 100644 index ff52ee8ef..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Display.png b/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Display.png deleted file mode 100644 index 0c579e0e8..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Lock.png b/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Lock.png deleted file mode 100644 index a8bb25b73..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Mesh.png b/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Mesh.png deleted file mode 100644 index df576c6bb..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittensGloves_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Body.png b/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Body.png deleted file mode 100644 index 4260e8fa7..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Display.png b/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Display.png deleted file mode 100644 index 6f5620802..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Lock.png b/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Lock.png deleted file mode 100644 index 690ca3425..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Mesh.png b/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Mesh.png deleted file mode 100644 index 3b8ca660b..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/FuturisticMittens_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_Large.png b/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_Large.png deleted file mode 100644 index b2d8ee163..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_Normal.png b/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_Normal.png deleted file mode 100644 index 804ece536..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_Small.png b/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_Small.png deleted file mode 100644 index 615a1bbe1..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_XLarge.png b/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_XLarge.png deleted file mode 100644 index d4822fedf..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/HoofMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_Large.png b/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_Large.png deleted file mode 100644 index bed161e3b..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_Normal.png b/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_Normal.png deleted file mode 100644 index bed161e3b..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_Small.png b/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_Small.png deleted file mode 100644 index bed161e3b..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_XLarge.png b/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_XLarge.png deleted file mode 100644 index bed161e3b..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/KeyProp_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Large.png deleted file mode 100644 index a72fecfba..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Normal.png deleted file mode 100644 index a72fecfba..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Small.png deleted file mode 100644 index 689fbfd62..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_XLarge.png deleted file mode 100644 index a72fecfba..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/LeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Large.png deleted file mode 100644 index 296b8d2b0..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Normal.png deleted file mode 100644 index 296b8d2b0..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Small.png deleted file mode 100644 index 296b8d2b0..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_XLarge.png deleted file mode 100644 index 296b8d2b0..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedLeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Large_Gloves.png deleted file mode 100644 index 1d5448d1f..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Large_Straps.png deleted file mode 100644 index d3b1ca001..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Lock.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Lock.png deleted file mode 100644 index 3001c40be..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Normal_Gloves.png deleted file mode 100644 index 1d5448d1f..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Normal_Straps.png deleted file mode 100644 index d3b1ca001..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Small_Gloves.png deleted file mode 100644 index 1d5448d1f..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Small_Straps.png deleted file mode 100644 index d3b1ca001..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_XLarge_Gloves.png deleted file mode 100644 index 1d5448d1f..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_XLarge_Straps.png deleted file mode 100644 index d3b1ca001..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PaddedMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Gloves.png deleted file mode 100644 index 9fb829828..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Paws.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Paws.png deleted file mode 100644 index 5af0f614c..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Straps.png deleted file mode 100644 index d3b1ca001..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Lock.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Lock.png deleted file mode 100644 index 3001c40be..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Gloves.png deleted file mode 100644 index 9fb829828..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Paws.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Paws.png deleted file mode 100644 index 5af0f614c..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Straps.png deleted file mode 100644 index d3b1ca001..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Gloves.png deleted file mode 100644 index 9fb829828..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Paws.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Paws.png deleted file mode 100644 index 5af0f614c..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Straps.png deleted file mode 100644 index d3b1ca001..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Gloves.png deleted file mode 100644 index 9fb829828..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Paws.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Paws.png deleted file mode 100644 index 5af0f614c..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Straps.png deleted file mode 100644 index d3b1ca001..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PawMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Large.png b/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Large.png deleted file mode 100644 index 6d251252e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Lock.png b/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Lock.png deleted file mode 100644 index 4218c1383..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Normal.png b/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Normal.png deleted file mode 100644 index 6d251252e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Small.png b/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Small.png deleted file mode 100644 index 6d251252e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_XLarge.png b/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_XLarge.png deleted file mode 100644 index eeccecf57..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/PolishedMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToys.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToys.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToys.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysBelt.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysBelt.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysBroom.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysBroom.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysBroom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCandleWax.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCandleWax.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCandleWax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCane.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCane.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCane.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCattleProd.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCattleProd.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCattleProd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCrop.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysElectricToothbrush.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysElectricToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysElectricToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysFeather.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysFeather.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysFeatherDuster.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysFeatherDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysFeatherDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysFlogger.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysFlogger.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysFlogger.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysGavel.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysGavel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysGavel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysGlassEmpty.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysGlassEmpty.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysGlassEmpty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysGlassFilled.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysGlassFilled.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysGlassFilled.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysHairbrush.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysHairbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysHairbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysHeartCrop.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysHeartCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysHeartCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysIceCube.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysIceCube.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysIceCube.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysLargeDildo.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysLargeDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysLargeDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysLongDuster.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysLongDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysLongDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysLotion.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysLotion.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysLotion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPaddle.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPetToy.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPetToy.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPetToy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPhone1.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPhone1.png deleted file mode 100644 index 1b30c4927..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPhone1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPhone2.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPhone2.png deleted file mode 100644 index 863e1d0e0..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPhone2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPotionBottle.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPotionBottle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysPotionBottle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysRainbowWand.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysRainbowWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysRainbowWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysRuler.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysRuler.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysRuler.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysScissors.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysScissors.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysScissors.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysShockWand.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysShockWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysShockWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysSmallDildo.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysSmallDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysSmallDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysSmallVibratingWand.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysSmallVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysSmallVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysSword.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysSword.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysSword.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysTennisRacket.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysTennisRacket.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysTennisRacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysToothbrush.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysVibratingWand.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysVibrator.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysVibrator.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysWartenbergWheel.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysWartenbergWheel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysWartenbergWheel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysWhip.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysWhip.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysWhip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysWhipPaddle.png b/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysWhipPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/OverTheHead/SpankingToysWhipPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Large.png deleted file mode 100644 index 702d76e8b..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Lock.png deleted file mode 100644 index af9f00367..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Normal.png deleted file mode 100644 index 702d76e8b..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Small.png deleted file mode 100644 index 702d76e8b..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_XLarge.png deleted file mode 100644 index 702d76e8b..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedLeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/PaddedMittens_Large_Buckles.png deleted file mode 100644 index c7a3d9e47..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/PaddedMittens_Large_Gloves.png deleted file mode 100644 index c35ccb760..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/PaddedMittens_Large_Straps.png deleted file mode 100644 index 8294acd46..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_Lock.png b/Assets/Female3DCG/ItemHands/PaddedMittens_Lock.png deleted file mode 100644 index b77b37880..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/PaddedMittens_Normal_Buckles.png deleted file mode 100644 index c7a3d9e47..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/PaddedMittens_Normal_Gloves.png deleted file mode 100644 index 8a0529c9c..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/PaddedMittens_Normal_Straps.png deleted file mode 100644 index 8294acd46..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/PaddedMittens_Small_Buckles.png deleted file mode 100644 index c7a3d9e47..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/PaddedMittens_Small_Gloves.png deleted file mode 100644 index 154560f1c..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/PaddedMittens_Small_Straps.png deleted file mode 100644 index 8294acd46..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/PaddedMittens_XLarge_Buckles.png deleted file mode 100644 index c7a3d9e47..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/PaddedMittens_XLarge_Gloves.png deleted file mode 100644 index 7b9287e86..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PaddedMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/PaddedMittens_XLarge_Straps.png deleted file mode 100644 index 8294acd46..000000000 Binary files a/Assets/Female3DCG/ItemHands/PaddedMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/PawMittens_Large_Buckles.png deleted file mode 100644 index c7a3d9e47..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/PawMittens_Large_Gloves.png deleted file mode 100644 index 2a264112f..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Large_Paws.png b/Assets/Female3DCG/ItemHands/PawMittens_Large_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Large_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/PawMittens_Large_Straps.png deleted file mode 100644 index 8294acd46..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Lock.png b/Assets/Female3DCG/ItemHands/PawMittens_Lock.png deleted file mode 100644 index 1ab986134..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/PawMittens_Normal_Buckles.png deleted file mode 100644 index c7a3d9e47..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/PawMittens_Normal_Gloves.png deleted file mode 100644 index 82bca777f..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Normal_Paws.png b/Assets/Female3DCG/ItemHands/PawMittens_Normal_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Normal_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/PawMittens_Normal_Straps.png deleted file mode 100644 index 8294acd46..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/PawMittens_Small_Buckles.png deleted file mode 100644 index c7a3d9e47..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/PawMittens_Small_Gloves.png deleted file mode 100644 index 76ad4167d..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Small_Paws.png b/Assets/Female3DCG/ItemHands/PawMittens_Small_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Small_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/PawMittens_Small_Straps.png deleted file mode 100644 index 8294acd46..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Buckles.png deleted file mode 100644 index c7a3d9e47..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Gloves.png deleted file mode 100644 index f72cf844c..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Paws.png b/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Paws.png deleted file mode 100644 index c5b55531b..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Straps.png deleted file mode 100644 index 8294acd46..000000000 Binary files a/Assets/Female3DCG/ItemHands/PawMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PolishedMittens_Large.png b/Assets/Female3DCG/ItemHands/PolishedMittens_Large.png deleted file mode 100644 index bca39bf72..000000000 Binary files a/Assets/Female3DCG/ItemHands/PolishedMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PolishedMittens_Lock.png b/Assets/Female3DCG/ItemHands/PolishedMittens_Lock.png deleted file mode 100644 index 70faa172d..000000000 Binary files a/Assets/Female3DCG/ItemHands/PolishedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PolishedMittens_Normal.png b/Assets/Female3DCG/ItemHands/PolishedMittens_Normal.png deleted file mode 100644 index f5d6400de..000000000 Binary files a/Assets/Female3DCG/ItemHands/PolishedMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PolishedMittens_Small.png b/Assets/Female3DCG/ItemHands/PolishedMittens_Small.png deleted file mode 100644 index 61a9df9d3..000000000 Binary files a/Assets/Female3DCG/ItemHands/PolishedMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/PolishedMittens_XLarge.png b/Assets/Female3DCG/ItemHands/PolishedMittens_XLarge.png deleted file mode 100644 index e58f00d78..000000000 Binary files a/Assets/Female3DCG/ItemHands/PolishedMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/DuctTape.png b/Assets/Female3DCG/ItemHands/Preview/DuctTape.png deleted file mode 100644 index f86bb58bc..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/DuctTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/FuturisticMittens.png b/Assets/Female3DCG/ItemHands/Preview/FuturisticMittens.png deleted file mode 100644 index a9e9a082c..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/FuturisticMittens.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/HoofMittens.png b/Assets/Female3DCG/ItemHands/Preview/HoofMittens.png deleted file mode 100644 index b93cc0a69..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/HoofMittens.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/KeyProp.png b/Assets/Female3DCG/ItemHands/Preview/KeyProp.png deleted file mode 100644 index 3173fbd2f..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/KeyProp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/LeatherMittens.png b/Assets/Female3DCG/ItemHands/Preview/LeatherMittens.png deleted file mode 100644 index 18463ae84..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/LeatherMittens.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/MedicalInjector.png b/Assets/Female3DCG/ItemHands/Preview/MedicalInjector.png deleted file mode 100644 index bca439bdf..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/MedicalInjector.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/PaddedLeatherMittens.png b/Assets/Female3DCG/ItemHands/Preview/PaddedLeatherMittens.png deleted file mode 100644 index 5b1cb8aed..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/PaddedLeatherMittens.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/PaddedMittens.png b/Assets/Female3DCG/ItemHands/Preview/PaddedMittens.png deleted file mode 100644 index 3cec6c1d6..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/PaddedMittens.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/PawMittens.png b/Assets/Female3DCG/ItemHands/Preview/PawMittens.png deleted file mode 100644 index b3119ebcf..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/PawMittens.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/PolishedMittens.png b/Assets/Female3DCG/ItemHands/Preview/PolishedMittens.png deleted file mode 100644 index 55064d48c..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/PolishedMittens.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToys.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToys.png deleted file mode 100644 index 813ed306f..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToys.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysBaguette.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysBaguette.png deleted file mode 100644 index 12a08aafb..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysBaguette.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysBallgag.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysBallgag.png deleted file mode 100644 index fcef982f9..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysBallgag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysBelt.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysBelt.png deleted file mode 100644 index d57bb1a2e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysBroom.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysBroom.png deleted file mode 100644 index 189c63dfc..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysBroom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysCandleWax.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysCandleWax.png deleted file mode 100644 index 4bdf1a1b1..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysCandleWax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysCane.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysCane.png deleted file mode 100644 index f49cddf40..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysCane.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysCattleProd.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysCattleProd.png deleted file mode 100644 index f5c8fd812..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysCattleProd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysCrop.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysCrop.png deleted file mode 100644 index d4f35bff8..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysElectricToothbrush.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysElectricToothbrush.png deleted file mode 100644 index 9dc02668c..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysElectricToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysFeather.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysFeather.png deleted file mode 100644 index 0237ed6b6..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysFeatherDuster.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysFeatherDuster.png deleted file mode 100644 index 3d965d047..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysFeatherDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysFlogger.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysFlogger.png deleted file mode 100644 index 11b2f6431..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysFlogger.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysGavel.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysGavel.png deleted file mode 100644 index 97dfefc08..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysGavel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysGlassEmpty.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysGlassEmpty.png deleted file mode 100644 index 2a7bdd20a..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysGlassEmpty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysGlassFilled.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysGlassFilled.png deleted file mode 100644 index 81b3f0f79..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysGlassFilled.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysHairbrush.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysHairbrush.png deleted file mode 100644 index 693ee7dda..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysHairbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysHeartCrop.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysHeartCrop.png deleted file mode 100644 index 74243205f..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysHeartCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysIceCube.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysIceCube.png deleted file mode 100644 index dfafc4104..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysIceCube.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysLargeDildo.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysLargeDildo.png deleted file mode 100644 index ce99cab76..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysLargeDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysLongDuster.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysLongDuster.png deleted file mode 100644 index 4e295260e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysLongDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysLongSock.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysLongSock.png deleted file mode 100644 index 44a9a99ab..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysLongSock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysLotion.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysLotion.png deleted file mode 100644 index 80bc4d65f..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysLotion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPaddle.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysPaddle.png deleted file mode 100644 index 6332ee3fc..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPanties.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysPanties.png deleted file mode 100644 index 341b45696..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPetToy.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysPetToy.png deleted file mode 100644 index 364f2adf6..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPetToy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPhone1.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysPhone1.png deleted file mode 100644 index 4a5f8ab6f..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPhone1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPhone2.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysPhone2.png deleted file mode 100644 index 4f9452308..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPhone2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPlasticWrap.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysPlasticWrap.png deleted file mode 100644 index bc1dcc82b..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPlasticWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPotionBottle.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysPotionBottle.png deleted file mode 100644 index e65736eb5..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysPotionBottle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysRainbowWand.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysRainbowWand.png deleted file mode 100644 index 8f2dd72e1..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysRainbowWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysRopeCoilLong.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysRopeCoilLong.png deleted file mode 100644 index fed45e03d..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysRopeCoilLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysRopeCoilShort.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysRopeCoilShort.png deleted file mode 100644 index 8c86747a0..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysRopeCoilShort.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysRuler.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysRuler.png deleted file mode 100644 index bef3cd61a..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysRuler.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysScissors.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysScissors.png deleted file mode 100644 index 6abd59220..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysScissors.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysShockRemote.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysShockRemote.png deleted file mode 100644 index 11045ab89..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysShockRemote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysShockWand.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysShockWand.png deleted file mode 100644 index 1eb5dd2e0..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysShockWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysSmallDildo.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysSmallDildo.png deleted file mode 100644 index c67859530..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysSmallDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysSmallVibratingWand.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysSmallVibratingWand.png deleted file mode 100644 index af0ee968d..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysSmallVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysSpatula.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysSpatula.png deleted file mode 100644 index 04ac78488..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysSpatula.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysSword.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysSword.png deleted file mode 100644 index d04dfbef3..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysSword.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysTapeRoll.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysTapeRoll.png deleted file mode 100644 index 33caa32b6..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysTapeRoll.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysTennisRacket.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysTennisRacket.png deleted file mode 100644 index 8f4d1f71b..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysTennisRacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysToothbrush.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysToothbrush.png deleted file mode 100644 index 4191ff9d5..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysTowel.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysTowel.png deleted file mode 100644 index 023bef1a0..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysTowel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysVibeRemote.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysVibeRemote.png deleted file mode 100644 index 04fa6a732..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysVibeRemote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysVibratingWand.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysVibratingWand.png deleted file mode 100644 index f20eac559..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysVibrator.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysVibrator.png deleted file mode 100644 index a1b3b30bc..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysWartenbergWheel.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysWartenbergWheel.png deleted file mode 100644 index 051d61782..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysWartenbergWheel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysWhip.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysWhip.png deleted file mode 100644 index 8a442fb13..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysWhip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Preview/SpankingToysWhipPaddle.png b/Assets/Female3DCG/ItemHands/Preview/SpankingToysWhipPaddle.png deleted file mode 100644 index 1aca5ec1f..000000000 Binary files a/Assets/Female3DCG/ItemHands/Preview/SpankingToysWhipPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToyBallgag.png b/Assets/Female3DCG/ItemHands/SpankingToyBallgag.png deleted file mode 100644 index 0f3fae1a3..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToyBallgag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToys.png b/Assets/Female3DCG/ItemHands/SpankingToys.png deleted file mode 100644 index 9a5c7262b..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToys.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysBaguette.png b/Assets/Female3DCG/ItemHands/SpankingToysBaguette.png deleted file mode 100644 index 5047ecd26..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysBaguette.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysBallgag.png b/Assets/Female3DCG/ItemHands/SpankingToysBallgag.png deleted file mode 100644 index 3de1e0629..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysBallgag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysBelt.png b/Assets/Female3DCG/ItemHands/SpankingToysBelt.png deleted file mode 100644 index cbcea4858..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysBroom.png b/Assets/Female3DCG/ItemHands/SpankingToysBroom.png deleted file mode 100644 index 81a95164f..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysBroom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysCandleWax.png b/Assets/Female3DCG/ItemHands/SpankingToysCandleWax.png deleted file mode 100644 index c810aaa70..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysCandleWax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysCane.png b/Assets/Female3DCG/ItemHands/SpankingToysCane.png deleted file mode 100644 index f69581270..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysCane.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysCattleProd.png b/Assets/Female3DCG/ItemHands/SpankingToysCattleProd.png deleted file mode 100644 index b87739dae..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysCattleProd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysCrop.png b/Assets/Female3DCG/ItemHands/SpankingToysCrop.png deleted file mode 100644 index 9a5c7262b..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysElectricToothbrush.png b/Assets/Female3DCG/ItemHands/SpankingToysElectricToothbrush.png deleted file mode 100644 index d3bf420b9..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysElectricToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysFeather.png b/Assets/Female3DCG/ItemHands/SpankingToysFeather.png deleted file mode 100644 index 5a4096dfc..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysFeatherDuster.png b/Assets/Female3DCG/ItemHands/SpankingToysFeatherDuster.png deleted file mode 100644 index 9fcf23d57..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysFeatherDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysFlogger.png b/Assets/Female3DCG/ItemHands/SpankingToysFlogger.png deleted file mode 100644 index 0e615558c..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysFlogger.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysGavel.png b/Assets/Female3DCG/ItemHands/SpankingToysGavel.png deleted file mode 100644 index 5fc0c42c5..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysGavel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysGlassEmpty.png b/Assets/Female3DCG/ItemHands/SpankingToysGlassEmpty.png deleted file mode 100644 index e2302d10c..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysGlassEmpty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysGlassFilled.png b/Assets/Female3DCG/ItemHands/SpankingToysGlassFilled.png deleted file mode 100644 index 9cf6c7bb2..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysGlassFilled.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysHairbrush.png b/Assets/Female3DCG/ItemHands/SpankingToysHairbrush.png deleted file mode 100644 index 1a093a474..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysHairbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysHeartCrop.png b/Assets/Female3DCG/ItemHands/SpankingToysHeartCrop.png deleted file mode 100644 index ed4653515..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysHeartCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysIceCube.png b/Assets/Female3DCG/ItemHands/SpankingToysIceCube.png deleted file mode 100644 index e15339087..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysIceCube.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysLargeDildo.png b/Assets/Female3DCG/ItemHands/SpankingToysLargeDildo.png deleted file mode 100644 index d756d7b53..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysLargeDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysLongDuster.png b/Assets/Female3DCG/ItemHands/SpankingToysLongDuster.png deleted file mode 100644 index a93ad2e1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysLongDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysLongSock.png b/Assets/Female3DCG/ItemHands/SpankingToysLongSock.png deleted file mode 100644 index e37166fa4..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysLongSock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysLotion.png b/Assets/Female3DCG/ItemHands/SpankingToysLotion.png deleted file mode 100644 index 606c2bae3..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysLotion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysPaddle.png b/Assets/Female3DCG/ItemHands/SpankingToysPaddle.png deleted file mode 100644 index 64a2b97f3..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysPanties.png b/Assets/Female3DCG/ItemHands/SpankingToysPanties.png deleted file mode 100644 index ad7de55dc..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysPetToy.png b/Assets/Female3DCG/ItemHands/SpankingToysPetToy.png deleted file mode 100644 index d2c64e8c5..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysPetToy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysPhone1.png b/Assets/Female3DCG/ItemHands/SpankingToysPhone1.png deleted file mode 100644 index d1f75fbd4..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysPhone1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysPhone2.png b/Assets/Female3DCG/ItemHands/SpankingToysPhone2.png deleted file mode 100644 index e6e3c389f..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysPhone2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysPlasticWrap.png b/Assets/Female3DCG/ItemHands/SpankingToysPlasticWrap.png deleted file mode 100644 index cfa619ff1..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysPlasticWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysPotionBottle.png b/Assets/Female3DCG/ItemHands/SpankingToysPotionBottle.png deleted file mode 100644 index de991ab15..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysPotionBottle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysRainbowWand.png b/Assets/Female3DCG/ItemHands/SpankingToysRainbowWand.png deleted file mode 100644 index d1962aef0..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysRainbowWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysRopeCoilLong.png b/Assets/Female3DCG/ItemHands/SpankingToysRopeCoilLong.png deleted file mode 100644 index 187b5fc95..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysRopeCoilLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysRopeCoilShort.png b/Assets/Female3DCG/ItemHands/SpankingToysRopeCoilShort.png deleted file mode 100644 index a817a854b..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysRopeCoilShort.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysRuler.png b/Assets/Female3DCG/ItemHands/SpankingToysRuler.png deleted file mode 100644 index 7a37713e6..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysRuler.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysScissors.png b/Assets/Female3DCG/ItemHands/SpankingToysScissors.png deleted file mode 100644 index 5f58fedaf..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysScissors.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysShockRemote.png b/Assets/Female3DCG/ItemHands/SpankingToysShockRemote.png deleted file mode 100644 index 07c2dc31f..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysShockRemote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysShockWand.png b/Assets/Female3DCG/ItemHands/SpankingToysShockWand.png deleted file mode 100644 index 27a4574ca..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysShockWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysSmallDildo.png b/Assets/Female3DCG/ItemHands/SpankingToysSmallDildo.png deleted file mode 100644 index 1c15b6576..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysSmallDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysSmallVibratingWand.png b/Assets/Female3DCG/ItemHands/SpankingToysSmallVibratingWand.png deleted file mode 100644 index c526fffa2..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysSmallVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysSpatula.png b/Assets/Female3DCG/ItemHands/SpankingToysSpatula.png deleted file mode 100644 index 9492cabd4..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysSpatula.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysSword.png b/Assets/Female3DCG/ItemHands/SpankingToysSword.png deleted file mode 100644 index c15ee2d90..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysSword.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysTapeRoll.png b/Assets/Female3DCG/ItemHands/SpankingToysTapeRoll.png deleted file mode 100644 index 6793be235..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysTapeRoll.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysTennisRacket.png b/Assets/Female3DCG/ItemHands/SpankingToysTennisRacket.png deleted file mode 100644 index 4be1fc504..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysTennisRacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysToothbrush.png b/Assets/Female3DCG/ItemHands/SpankingToysToothbrush.png deleted file mode 100644 index 5bb43cffa..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysTowel.png b/Assets/Female3DCG/ItemHands/SpankingToysTowel.png deleted file mode 100644 index e1d7c3eb2..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysTowel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysVibeRemote.png b/Assets/Female3DCG/ItemHands/SpankingToysVibeRemote.png deleted file mode 100644 index 9c29c4edf..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysVibeRemote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysVibratingWand.png b/Assets/Female3DCG/ItemHands/SpankingToysVibratingWand.png deleted file mode 100644 index c6576da66..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysVibrator.png b/Assets/Female3DCG/ItemHands/SpankingToysVibrator.png deleted file mode 100644 index 1454e93cd..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysWartenbergWheel.png b/Assets/Female3DCG/ItemHands/SpankingToysWartenbergWheel.png deleted file mode 100644 index 022021bd9..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysWartenbergWheel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysWhip.png b/Assets/Female3DCG/ItemHands/SpankingToysWhip.png deleted file mode 100644 index 80e5555a0..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysWhip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/SpankingToysWhipPaddle.png b/Assets/Female3DCG/ItemHands/SpankingToysWhipPaddle.png deleted file mode 100644 index 3dc21aaf3..000000000 Binary files a/Assets/Female3DCG/ItemHands/SpankingToysWhipPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/DuctTape_Large.png b/Assets/Female3DCG/ItemHands/Yoked/DuctTape_Large.png deleted file mode 100644 index d138c90ba..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/DuctTape_Normal.png b/Assets/Female3DCG/ItemHands/Yoked/DuctTape_Normal.png deleted file mode 100644 index 55d1673b0..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/DuctTape_Small.png b/Assets/Female3DCG/ItemHands/Yoked/DuctTape_Small.png deleted file mode 100644 index 5bace654c..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/DuctTape_XLarge.png b/Assets/Female3DCG/ItemHands/Yoked/DuctTape_XLarge.png deleted file mode 100644 index fd327b77b..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Body.png b/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Body.png deleted file mode 100644 index f5b1a7e34..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Display.png b/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Display.png deleted file mode 100644 index 84e907269..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Lock.png b/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Lock.png deleted file mode 100644 index 93b38cdb0..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Mesh.png b/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Mesh.png deleted file mode 100644 index fdf658840..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittensGloves_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Body.png b/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Body.png deleted file mode 100644 index 36488f3d2..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Display.png b/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Display.png deleted file mode 100644 index e78ca1b79..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Lock.png b/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Lock.png deleted file mode 100644 index bb60c3b85..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Mesh.png b/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Mesh.png deleted file mode 100644 index b92c48f6e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/FuturisticMittens_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_Large.png b/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_Large.png deleted file mode 100644 index 8d7716e65..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_Normal.png b/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_Normal.png deleted file mode 100644 index 8d7716e65..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_Small.png b/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_Small.png deleted file mode 100644 index 8d7716e65..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_XLarge.png b/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_XLarge.png deleted file mode 100644 index 8d7716e65..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/HoofMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/KeyProp_Large.png b/Assets/Female3DCG/ItemHands/Yoked/KeyProp_Large.png deleted file mode 100644 index e9fe97aac..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/KeyProp_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/KeyProp_Normal.png b/Assets/Female3DCG/ItemHands/Yoked/KeyProp_Normal.png deleted file mode 100644 index e9fe97aac..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/KeyProp_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/KeyProp_Small.png b/Assets/Female3DCG/ItemHands/Yoked/KeyProp_Small.png deleted file mode 100644 index e9fe97aac..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/KeyProp_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/KeyProp_XLarge.png b/Assets/Female3DCG/ItemHands/Yoked/KeyProp_XLarge.png deleted file mode 100644 index e9fe97aac..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/KeyProp_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Large.png deleted file mode 100644 index 98f44136e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Normal.png deleted file mode 100644 index 98f44136e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Small.png deleted file mode 100644 index 98f44136e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_XLarge.png deleted file mode 100644 index 98f44136e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/LeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_Large.png b/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_Large.png deleted file mode 100644 index 89e43e24a..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_Normal.png b/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_Normal.png deleted file mode 100644 index 89e43e24a..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_Small.png b/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_Small.png deleted file mode 100644 index 89e43e24a..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_XLarge.png b/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_XLarge.png deleted file mode 100644 index 89e43e24a..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/MedicalInjector_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Large.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Large.png deleted file mode 100644 index 3253b6f89..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Lock.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Lock.png deleted file mode 100644 index ffb596b1a..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Normal.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Normal.png deleted file mode 100644 index 3253b6f89..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Small.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Small.png deleted file mode 100644 index 3253b6f89..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_XLarge.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_XLarge.png deleted file mode 100644 index 3253b6f89..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedLeatherMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Large_Gloves.png deleted file mode 100644 index 1b645b475..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Large_Straps.png deleted file mode 100644 index cc562b026..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Lock.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Lock.png deleted file mode 100644 index 3001c40be..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Normal_Gloves.png deleted file mode 100644 index 09217fc35..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Normal_Straps.png deleted file mode 100644 index cc562b026..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Small_Gloves.png deleted file mode 100644 index a78b6fbef..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Small_Straps.png deleted file mode 100644 index cc562b026..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_XLarge_Gloves.png deleted file mode 100644 index f43a58a37..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_XLarge_Straps.png deleted file mode 100644 index cc562b026..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PaddedMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Buckles.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Gloves.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Gloves.png deleted file mode 100644 index 1cc31c59d..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Paws.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Paws.png deleted file mode 100644 index ebdbb791c..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Straps.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Straps.png deleted file mode 100644 index cc562b026..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Lock.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Lock.png deleted file mode 100644 index 3001c40be..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Buckles.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Gloves.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Gloves.png deleted file mode 100644 index 1cc31c59d..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Paws.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Paws.png deleted file mode 100644 index ebdbb791c..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Straps.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Straps.png deleted file mode 100644 index cc562b026..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Buckles.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Gloves.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Gloves.png deleted file mode 100644 index 1cc31c59d..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Paws.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Paws.png deleted file mode 100644 index ebdbb791c..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Straps.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Straps.png deleted file mode 100644 index cc562b026..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Buckles.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Buckles.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Gloves.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Gloves.png deleted file mode 100644 index 1cc31c59d..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Paws.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Paws.png deleted file mode 100644 index ebdbb791c..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Paws.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Straps.png b/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Straps.png deleted file mode 100644 index cc562b026..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PawMittens_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Large.png b/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Large.png deleted file mode 100644 index e70411e87..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Lock.png b/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Lock.png deleted file mode 100644 index 7d81df904..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Normal.png b/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Normal.png deleted file mode 100644 index 83a4463bb..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Small.png b/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Small.png deleted file mode 100644 index 58ab01dca..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_XLarge.png b/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_XLarge.png deleted file mode 100644 index 8562807cc..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/PolishedMittens_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToys.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToys.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToys.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysBelt.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysBelt.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysBroom.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysBroom.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysBroom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCandleWax.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCandleWax.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCandleWax.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCane.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCane.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCane.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCattleProd.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCattleProd.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCattleProd.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCrop.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysElectricToothbrush.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysElectricToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysElectricToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysFeather.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysFeather.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysFeatherDuster.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysFeatherDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysFeatherDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysFlogger.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysFlogger.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysFlogger.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysGavel.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysGavel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysGavel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysGlassEmpty.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysGlassEmpty.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysGlassEmpty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysGlassFilled.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysGlassFilled.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysGlassFilled.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysHairbrush.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysHairbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysHairbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysHeartCrop.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysHeartCrop.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysHeartCrop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysIceCube.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysIceCube.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysIceCube.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysLargeDildo.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysLargeDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysLargeDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysLongDuster.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysLongDuster.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysLongDuster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysLotion.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysLotion.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysLotion.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPaddle.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPetToy.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPetToy.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPetToy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPhone1.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPhone1.png deleted file mode 100644 index 5c22fe0c2..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPhone1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPhone2.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPhone2.png deleted file mode 100644 index 684f1508e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPhone2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPotionBottle.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPotionBottle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysPotionBottle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysRainbowWand.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysRainbowWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysRainbowWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysRuler.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysRuler.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysRuler.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysScissors.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysScissors.png deleted file mode 100644 index e044a620a..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysScissors.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysShockWand.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysShockWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysShockWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysSmallDildo.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysSmallDildo.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysSmallDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysSmallVibratingWand.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysSmallVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysSmallVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysSword.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysSword.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysSword.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysTennisRacket.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysTennisRacket.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysTennisRacket.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysToothbrush.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysToothbrush.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysToothbrush.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysVibratingWand.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysVibratingWand.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysVibratingWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysVibrator.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysVibrator.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysWartenbergWheel.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysWartenbergWheel.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysWartenbergWheel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysWhip.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysWhip.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysWhip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysWhipPaddle.png b/Assets/Female3DCG/ItemHands/Yoked/SpankingToysWhipPaddle.png deleted file mode 100644 index 3c0a7789e..000000000 Binary files a/Assets/Female3DCG/ItemHands/Yoked/SpankingToysWhipPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Angry/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Angry/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Angry/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Angry/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Angry/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Angry/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Angry/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Angry/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Angry/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Angry/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Angry/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Angry/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Angry/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Angry/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Angry/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Angry/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Angry/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Angry/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Angry/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Angry/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Angry/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Angry/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Angry/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Angry/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Angry/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Angry/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Angry/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Angry/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Angry/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Angry/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/BlackoutLenses_Left.png b/Assets/Female3DCG/ItemHead/BlackoutLenses_Left.png deleted file mode 100644 index 7cb586e63..000000000 Binary files a/Assets/Female3DCG/ItemHead/BlackoutLenses_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/BlackoutLenses_Right.png b/Assets/Female3DCG/ItemHead/BlackoutLenses_Right.png deleted file mode 100644 index 9baf21268..000000000 Binary files a/Assets/Female3DCG/ItemHead/BlackoutLenses_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/BlackoutLenses_Left.png b/Assets/Female3DCG/ItemHead/Closed/BlackoutLenses_Left.png deleted file mode 100644 index 5acfbb7ac..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/BlackoutLenses_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/BlackoutLenses_Right.png b/Assets/Female3DCG/ItemHead/Closed/BlackoutLenses_Right.png deleted file mode 100644 index 9ed3c1cfc..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/BlackoutLenses_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Closed/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Closed/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Closed/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Closed/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Closed/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Closed/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Closed/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Closed/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Closed/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Closed/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Closed/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Closed/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ClothBlindfold.png b/Assets/Female3DCG/ItemHead/ClothBlindfold.png deleted file mode 100644 index a28d582ca..000000000 Binary files a/Assets/Female3DCG/ItemHead/ClothBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Daydream/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Daydream/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Daydream/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Daydream/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Daydream/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Daydream/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Daydream/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Daydream/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Daydream/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Daydream/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Daydream/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Daydream/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Daydream/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Daydream/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Daydream/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Daydream/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Daydream/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Daydream/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Daydream/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Dazed/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Dazed/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dazed/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Dazed/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dazed/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dazed/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Dazed/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dazed/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Dazed/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Dazed/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Dazed/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Dazed/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dazed/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dazed/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Dazed/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dazed/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dazed/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Dazed/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dazed/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Dizzy/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Dizzy/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Dizzy/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Dizzy/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Dizzy/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_Barcode.png b/Assets/Female3DCG/ItemHead/DroneMask_Barcode.png deleted file mode 100644 index 95a982f62..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_Barcode.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_Base.png b/Assets/Female3DCG/ItemHead/DroneMask_Base.png deleted file mode 100644 index 4b80db6ab..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_BaseHelm.png b/Assets/Female3DCG/ItemHead/DroneMask_BaseHelm.png deleted file mode 100644 index 804e79288..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_BaseHelm.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeConcave.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeConcave.png deleted file mode 100644 index 4ca0ed4fb..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeConcave.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeConcaveShine.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeConcaveShine.png deleted file mode 100644 index 437791001..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeConcaveShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeHoles.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeHoles.png deleted file mode 100644 index 15b1e9427..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeHoles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeHolesShine.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeHolesShine.png deleted file mode 100644 index e729280fa..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeHolesShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeRegular.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeRegular.png deleted file mode 100644 index 19e0adf83..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeRegular.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeRegularGlow.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeRegularGlow.png deleted file mode 100644 index 79b6bdec2..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeRegularGlow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeRegularShine.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeRegularShine.png deleted file mode 100644 index b437ede30..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeRegularShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeSculpted.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeSculpted.png deleted file mode 100644 index 874807f29..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeSculpted.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeSculptedGlow.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeSculptedGlow.png deleted file mode 100644 index 99beda670..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeSculptedGlow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeSculptedShine.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeSculptedShine.png deleted file mode 100644 index 310e4336c..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeSculptedShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeSmile.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeSmile.png deleted file mode 100644 index 5b1bc2191..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeSmile.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeSmileGlow.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeSmileGlow.png deleted file mode 100644 index 7c6a1a907..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeSmileGlow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeSmileShine.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeSmileShine.png deleted file mode 100644 index 35ece62b7..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeSmileShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeSpiral.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeSpiral.png deleted file mode 100644 index f76e728bb..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeSpiral.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeSpiralGlow.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeSpiralGlow.png deleted file mode 100644 index 85ebd8b6e..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeSpiralGlow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_EyeSpiralShine.png b/Assets/Female3DCG/ItemHead/DroneMask_EyeSpiralShine.png deleted file mode 100644 index 0bf7ce940..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_EyeSpiralShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_Hexagon.png b/Assets/Female3DCG/ItemHead/DroneMask_Hexagon.png deleted file mode 100644 index 703d32d60..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_Hexagon.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_MouthFleshlight.png b/Assets/Female3DCG/ItemHead/DroneMask_MouthFleshlight.png deleted file mode 100644 index 4389d2126..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_MouthFleshlight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_MouthFleshlightShine.png b/Assets/Female3DCG/ItemHead/DroneMask_MouthFleshlightShine.png deleted file mode 100644 index 766c688a4..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_MouthFleshlightShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_MouthHoles.png b/Assets/Female3DCG/ItemHead/DroneMask_MouthHoles.png deleted file mode 100644 index e33cac3de..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_MouthHoles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_MouthHolesShine.png b/Assets/Female3DCG/ItemHead/DroneMask_MouthHolesShine.png deleted file mode 100644 index 7483f73b6..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_MouthHolesShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_MouthOnahole.png b/Assets/Female3DCG/ItemHead/DroneMask_MouthOnahole.png deleted file mode 100644 index 375bb78ee..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_MouthOnahole.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_MouthSculpted.png b/Assets/Female3DCG/ItemHead/DroneMask_MouthSculpted.png deleted file mode 100644 index 3b4aea5ae..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_MouthSculpted.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_MouthSmile.png b/Assets/Female3DCG/ItemHead/DroneMask_MouthSmile.png deleted file mode 100644 index 2b174d4bd..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_MouthSmile.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_MouthSmileGlow.png b/Assets/Female3DCG/ItemHead/DroneMask_MouthSmileGlow.png deleted file mode 100644 index 1676cf495..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_MouthSmileGlow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_MouthSmileShine.png b/Assets/Female3DCG/ItemHead/DroneMask_MouthSmileShine.png deleted file mode 100644 index f32973432..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_MouthSmileShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_Scarab.png b/Assets/Female3DCG/ItemHead/DroneMask_Scarab.png deleted file mode 100644 index 2faf84c6b..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_Scarab.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_Shine.png b/Assets/Female3DCG/ItemHead/DroneMask_Shine.png deleted file mode 100644 index 44414e85f..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_ShineHelm.png b/Assets/Female3DCG/ItemHead/DroneMask_ShineHelm.png deleted file mode 100644 index 5c4fabdb3..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_ShineHelm.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DroneMask_TwoLines.png b/Assets/Female3DCG/ItemHead/DroneMask_TwoLines.png deleted file mode 100644 index 0a6510f0b..000000000 Binary files a/Assets/Female3DCG/ItemHead/DroneMask_TwoLines.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DuctTape.png b/Assets/Female3DCG/ItemHead/DuctTape.png deleted file mode 100644 index 4fd9d9402..000000000 Binary files a/Assets/Female3DCG/ItemHead/DuctTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DuctTapeMummy.png b/Assets/Female3DCG/ItemHead/DuctTapeMummy.png deleted file mode 100644 index a323b245d..000000000 Binary files a/Assets/Female3DCG/ItemHead/DuctTapeMummy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DuctTapeOpen.png b/Assets/Female3DCG/ItemHead/DuctTapeOpen.png deleted file mode 100644 index 2bcf2d278..000000000 Binary files a/Assets/Female3DCG/ItemHead/DuctTapeOpen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/DuctTapeWrap.png b/Assets/Female3DCG/ItemHead/DuctTapeWrap.png deleted file mode 100644 index d7464d499..000000000 Binary files a/Assets/Female3DCG/ItemHead/DuctTapeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FrilledSleepMask_Frills.png b/Assets/Female3DCG/ItemHead/FrilledSleepMask_Frills.png deleted file mode 100644 index 45c4fe219..000000000 Binary files a/Assets/Female3DCG/ItemHead/FrilledSleepMask_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FrilledSleepMask_Mask.png b/Assets/Female3DCG/ItemHead/FrilledSleepMask_Mask.png deleted file mode 100644 index ec06354ad..000000000 Binary files a/Assets/Female3DCG/ItemHead/FrilledSleepMask_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FullBlindfold.png b/Assets/Female3DCG/ItemHead/FullBlindfold.png deleted file mode 100644 index dc0f57577..000000000 Binary files a/Assets/Female3DCG/ItemHead/FullBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FullBlindfold_Lock.png b/Assets/Female3DCG/ItemHead/FullBlindfold_Lock.png deleted file mode 100644 index 55084a8d5..000000000 Binary files a/Assets/Female3DCG/ItemHead/FullBlindfold_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FurScarf.png b/Assets/Female3DCG/ItemHead/FurScarf.png deleted file mode 100644 index 3469cd985..000000000 Binary files a/Assets/Female3DCG/ItemHead/FurScarf.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FuturisticMaskBlind_Display.png b/Assets/Female3DCG/ItemHead/FuturisticMaskBlind_Display.png deleted file mode 100644 index 4698d383c..000000000 Binary files a/Assets/Female3DCG/ItemHead/FuturisticMaskBlind_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FuturisticMaskBlind_Text.png b/Assets/Female3DCG/ItemHead/FuturisticMaskBlind_Text.png deleted file mode 100644 index 5afae7966..000000000 Binary files a/Assets/Female3DCG/ItemHead/FuturisticMaskBlind_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FuturisticMaskHeavyTint_Display.png b/Assets/Female3DCG/ItemHead/FuturisticMaskHeavyTint_Display.png deleted file mode 100644 index 36ffd4370..000000000 Binary files a/Assets/Female3DCG/ItemHead/FuturisticMaskHeavyTint_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FuturisticMaskHeavyTint_Text.png b/Assets/Female3DCG/ItemHead/FuturisticMaskHeavyTint_Text.png deleted file mode 100644 index 060885e6b..000000000 Binary files a/Assets/Female3DCG/ItemHead/FuturisticMaskHeavyTint_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FuturisticMaskLightTint_Display.png b/Assets/Female3DCG/ItemHead/FuturisticMaskLightTint_Display.png deleted file mode 100644 index ada8c942f..000000000 Binary files a/Assets/Female3DCG/ItemHead/FuturisticMaskLightTint_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FuturisticMaskLightTint_Text.png b/Assets/Female3DCG/ItemHead/FuturisticMaskLightTint_Text.png deleted file mode 100644 index d7a5b6bbe..000000000 Binary files a/Assets/Female3DCG/ItemHead/FuturisticMaskLightTint_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FuturisticMask_Display.png b/Assets/Female3DCG/ItemHead/FuturisticMask_Display.png deleted file mode 100644 index ac46f51d1..000000000 Binary files a/Assets/Female3DCG/ItemHead/FuturisticMask_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/FuturisticMask_Lock.png b/Assets/Female3DCG/ItemHead/FuturisticMask_Lock.png deleted file mode 100644 index bd2182ff9..000000000 Binary files a/Assets/Female3DCG/ItemHead/FuturisticMask_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Heart/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Heart/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Heart/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Heart/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Heart/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Heart/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Heart/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Heart/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Heart/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Heart/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Heart/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Heart/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Heart/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Heart/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Heart/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Heart/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Heart/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Heart/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Heart/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Heart/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Heart/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Heart/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Heart/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Heart/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Heart/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Heart/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Heart/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Heart/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Heart/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Heart/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/HeartPink/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/HeartPink/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/HeartPink/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/HeartPink/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/HeartPink/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Horny/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Horny/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Horny/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Horny/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Horny/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Horny/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Horny/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Horny/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Horny/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Horny/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Horny/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Horny/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Horny/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Horny/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Horny/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Horny/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Horny/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Horny/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Horny/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Horny/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Horny/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Horny/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Horny/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Horny/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Horny/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Horny/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Horny/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Horny/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Horny/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Horny/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVRHeadset_Body.png b/Assets/Female3DCG/ItemHead/InteractiveVRHeadset_Body.png deleted file mode 100644 index a95b9d918..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVRHeadset_Body.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVRHeadset_Display.png b/Assets/Female3DCG/ItemHead/InteractiveVRHeadset_Display.png deleted file mode 100644 index c6b54e718..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVRHeadset_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVisor.png b/Assets/Female3DCG/ItemHead/InteractiveVisor.png deleted file mode 100644 index d617d57f3..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVisor.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVisorBlind.png b/Assets/Female3DCG/ItemHead/InteractiveVisorBlind.png deleted file mode 100644 index 1b3d95fa4..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVisorBlind.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVisorBlind_Lock.png b/Assets/Female3DCG/ItemHead/InteractiveVisorBlind_Lock.png deleted file mode 100644 index d45302a10..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVisorBlind_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVisorFace.png b/Assets/Female3DCG/ItemHead/InteractiveVisorFace.png deleted file mode 100644 index 1b3d95fa4..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVisorFace.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVisorFace_Lock.png b/Assets/Female3DCG/ItemHead/InteractiveVisorFace_Lock.png deleted file mode 100644 index d45302a10..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVisorFace_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVisorHeavyTint.png b/Assets/Female3DCG/ItemHead/InteractiveVisorHeavyTint.png deleted file mode 100644 index ae71e5b53..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVisorHeavyTint.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVisorHeavyTint_Lock.png b/Assets/Female3DCG/ItemHead/InteractiveVisorHeavyTint_Lock.png deleted file mode 100644 index d45302a10..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVisorHeavyTint_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVisorLightTint.png b/Assets/Female3DCG/ItemHead/InteractiveVisorLightTint.png deleted file mode 100644 index fe37fe02b..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVisorLightTint.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVisorLightTint_Lock.png b/Assets/Female3DCG/ItemHead/InteractiveVisorLightTint_Lock.png deleted file mode 100644 index d45302a10..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVisorLightTint_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVisorLightTint_Mask.png b/Assets/Female3DCG/ItemHead/InteractiveVisorLightTint_Mask.png deleted file mode 100644 index fe37fe02b..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVisorLightTint_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/InteractiveVisor_Lock.png b/Assets/Female3DCG/ItemHead/InteractiveVisor_Lock.png deleted file mode 100644 index d45302a10..000000000 Binary files a/Assets/Female3DCG/ItemHead/InteractiveVisor_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/KittyBlindfold_Base.png b/Assets/Female3DCG/ItemHead/KittyBlindfold_Base.png deleted file mode 100644 index a9a108fe3..000000000 Binary files a/Assets/Female3DCG/ItemHead/KittyBlindfold_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/KittyBlindfold_Ears.png b/Assets/Female3DCG/ItemHead/KittyBlindfold_Ears.png deleted file mode 100644 index 838b5b476..000000000 Binary files a/Assets/Female3DCG/ItemHead/KittyBlindfold_Ears.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/KittyBlindfold_Eyes.png b/Assets/Female3DCG/ItemHead/KittyBlindfold_Eyes.png deleted file mode 100644 index 533eaf8a1..000000000 Binary files a/Assets/Female3DCG/ItemHead/KittyBlindfold_Eyes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/KittyBlindfold_Lock.png b/Assets/Female3DCG/ItemHead/KittyBlindfold_Lock.png deleted file mode 100644 index 55084a8d5..000000000 Binary files a/Assets/Female3DCG/ItemHead/KittyBlindfold_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LatexBlindfold.png b/Assets/Female3DCG/ItemHead/LatexBlindfold.png deleted file mode 100644 index 0f94142c5..000000000 Binary files a/Assets/Female3DCG/ItemHead/LatexBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LatexBlindfold_Lock.png b/Assets/Female3DCG/ItemHead/LatexBlindfold_Lock.png deleted file mode 100644 index 55084a8d5..000000000 Binary files a/Assets/Female3DCG/ItemHead/LatexBlindfold_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LeatherBlindfold.png b/Assets/Female3DCG/ItemHead/LeatherBlindfold.png deleted file mode 100644 index 710aaf974..000000000 Binary files a/Assets/Female3DCG/ItemHead/LeatherBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LeatherBlindfold_Lock.png b/Assets/Female3DCG/ItemHead/LeatherBlindfold_Lock.png deleted file mode 100644 index 55084a8d5..000000000 Binary files a/Assets/Female3DCG/ItemHead/LeatherBlindfold_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LeatherSlimMask.png b/Assets/Female3DCG/ItemHead/LeatherSlimMask.png deleted file mode 100644 index f145158a3..000000000 Binary files a/Assets/Female3DCG/ItemHead/LeatherSlimMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenEyes.png b/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenEyes.png deleted file mode 100644 index 83956b737..000000000 Binary files a/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenEyes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenEyes_Lock.png b/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenEyes_Lock.png deleted file mode 100644 index 55084a8d5..000000000 Binary files a/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenEyes_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenMouth.png b/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenMouth.png deleted file mode 100644 index 18ec7dc9d..000000000 Binary files a/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenMouth_Lock.png b/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenMouth_Lock.png deleted file mode 100644 index 55084a8d5..000000000 Binary files a/Assets/Female3DCG/ItemHead/LeatherSlimMaskOpenMouth_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LeatherSlimMask_Lock.png b/Assets/Female3DCG/ItemHead/LeatherSlimMask_Lock.png deleted file mode 100644 index 55084a8d5..000000000 Binary files a/Assets/Female3DCG/ItemHead/LeatherSlimMask_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Lewd/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Lewd/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Lewd/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Lewd/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Lewd/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Lewd/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Lewd/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Lewd/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Lewd/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Lewd/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Lewd/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Lewd/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Lewd/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Lewd/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Lewd/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Lewd/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Lewd/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Lewd/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Lewd/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdBlindfold.png b/Assets/Female3DCG/ItemHead/LewdBlindfold.png deleted file mode 100644 index 77a07109c..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdBlindfold_Lock.png b/Assets/Female3DCG/ItemHead/LewdBlindfold_Lock.png deleted file mode 100644 index 77244acd7..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdBlindfold_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeart/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/LewdHeartPink/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/MedicalPatch_Left.png b/Assets/Female3DCG/ItemHead/MedicalPatch_Left.png deleted file mode 100644 index 27ae9e461..000000000 Binary files a/Assets/Female3DCG/ItemHead/MedicalPatch_Left.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/MedicalPatch_LeftHeart.png b/Assets/Female3DCG/ItemHead/MedicalPatch_LeftHeart.png deleted file mode 100644 index 5797da31a..000000000 Binary files a/Assets/Female3DCG/ItemHead/MedicalPatch_LeftHeart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/MedicalPatch_LeftStripes.png b/Assets/Female3DCG/ItemHead/MedicalPatch_LeftStripes.png deleted file mode 100644 index 38fdb85f8..000000000 Binary files a/Assets/Female3DCG/ItemHead/MedicalPatch_LeftStripes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/MedicalPatch_LeftTeddy.png b/Assets/Female3DCG/ItemHead/MedicalPatch_LeftTeddy.png deleted file mode 100644 index 00e457af1..000000000 Binary files a/Assets/Female3DCG/ItemHead/MedicalPatch_LeftTeddy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/MedicalPatch_LeftX.png b/Assets/Female3DCG/ItemHead/MedicalPatch_LeftX.png deleted file mode 100644 index 3bf1f5fc0..000000000 Binary files a/Assets/Female3DCG/ItemHead/MedicalPatch_LeftX.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/MedicalPatch_Right.png b/Assets/Female3DCG/ItemHead/MedicalPatch_Right.png deleted file mode 100644 index 44f491039..000000000 Binary files a/Assets/Female3DCG/ItemHead/MedicalPatch_Right.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/MedicalPatch_RightHeart.png b/Assets/Female3DCG/ItemHead/MedicalPatch_RightHeart.png deleted file mode 100644 index 242ab9a8e..000000000 Binary files a/Assets/Female3DCG/ItemHead/MedicalPatch_RightHeart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/MedicalPatch_RightStripes.png b/Assets/Female3DCG/ItemHead/MedicalPatch_RightStripes.png deleted file mode 100644 index bae1dbdfd..000000000 Binary files a/Assets/Female3DCG/ItemHead/MedicalPatch_RightStripes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/MedicalPatch_RightTeddy.png b/Assets/Female3DCG/ItemHead/MedicalPatch_RightTeddy.png deleted file mode 100644 index b8820fef3..000000000 Binary files a/Assets/Female3DCG/ItemHead/MedicalPatch_RightTeddy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/MedicalPatch_RightX.png b/Assets/Female3DCG/ItemHead/MedicalPatch_RightX.png deleted file mode 100644 index 8d8467f17..000000000 Binary files a/Assets/Female3DCG/ItemHead/MedicalPatch_RightX.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Orig/1.png b/Assets/Female3DCG/ItemHead/Orig/1.png deleted file mode 100644 index fccd39e1f..000000000 Binary files a/Assets/Female3DCG/ItemHead/Orig/1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Orig/Hood.jpg b/Assets/Female3DCG/ItemHead/Orig/Hood.jpg deleted file mode 100644 index e115eec0a..000000000 Binary files a/Assets/Female3DCG/ItemHead/Orig/Hood.jpg and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Orig/LeatherHood - Copy.png b/Assets/Female3DCG/ItemHead/Orig/LeatherHood - Copy.png deleted file mode 100644 index a02121e37..000000000 Binary files a/Assets/Female3DCG/ItemHead/Orig/LeatherHood - Copy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Orig/LeatherHoodFULL.png b/Assets/Female3DCG/ItemHead/Orig/LeatherHoodFULL.png deleted file mode 100644 index c340ec802..000000000 Binary files a/Assets/Female3DCG/ItemHead/Orig/LeatherHoodFULL.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Orig/LeatherHoodOrig.png b/Assets/Female3DCG/ItemHead/Orig/LeatherHoodOrig.png deleted file mode 100644 index 5762c6179..000000000 Binary files a/Assets/Female3DCG/ItemHead/Orig/LeatherHoodOrig.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/PaddedBlindfold_Base.png b/Assets/Female3DCG/ItemHead/PaddedBlindfold_Base.png deleted file mode 100644 index 525814f0b..000000000 Binary files a/Assets/Female3DCG/ItemHead/PaddedBlindfold_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/PaddedBlindfold_Lock.png b/Assets/Female3DCG/ItemHead/PaddedBlindfold_Lock.png deleted file mode 100644 index 55084a8d5..000000000 Binary files a/Assets/Female3DCG/ItemHead/PaddedBlindfold_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/PaddedBlindfold_Trim.png b/Assets/Female3DCG/ItemHead/PaddedBlindfold_Trim.png deleted file mode 100644 index 82b812af6..000000000 Binary files a/Assets/Female3DCG/ItemHead/PaddedBlindfold_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Pantyhose.png b/Assets/Female3DCG/ItemHead/Pantyhose.png deleted file mode 100644 index 67a8edb5a..000000000 Binary files a/Assets/Female3DCG/ItemHead/Pantyhose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/BlackoutLenses.png b/Assets/Female3DCG/ItemHead/Preview/BlackoutLenses.png deleted file mode 100644 index 6d50a8b6c..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/BlackoutLenses.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/ClothBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/ClothBlindfold.png deleted file mode 100644 index 30bf96fce..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/ClothBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/DroneMask.png b/Assets/Female3DCG/ItemHead/Preview/DroneMask.png deleted file mode 100644 index c25d5eca6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/DroneMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/DuctTape.png b/Assets/Female3DCG/ItemHead/Preview/DuctTape.png deleted file mode 100644 index f86bb58bc..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/DuctTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/FrilledSleepMask.png b/Assets/Female3DCG/ItemHead/Preview/FrilledSleepMask.png deleted file mode 100644 index e9601c764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/FrilledSleepMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/FullBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/FullBlindfold.png deleted file mode 100644 index 9903b7e19..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/FullBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/FurScarf.png b/Assets/Female3DCG/ItemHead/Preview/FurScarf.png deleted file mode 100644 index e049066fe..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/FurScarf.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/FuturisticMask.pdn b/Assets/Female3DCG/ItemHead/Preview/FuturisticMask.pdn deleted file mode 100644 index cbb5df3d2..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/FuturisticMask.pdn and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/FuturisticMask.png b/Assets/Female3DCG/ItemHead/Preview/FuturisticMask.png deleted file mode 100644 index b0208a20b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/FuturisticMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/InteractiveVRHeadset.png b/Assets/Female3DCG/ItemHead/Preview/InteractiveVRHeadset.png deleted file mode 100644 index bc06796bd..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/InteractiveVRHeadset.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/InteractiveVisor.png b/Assets/Female3DCG/ItemHead/Preview/InteractiveVisor.png deleted file mode 100644 index 0ae9beae9..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/InteractiveVisor.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/KittyBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/KittyBlindfold.png deleted file mode 100644 index 820c1e65c..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/KittyBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/LatexBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/LatexBlindfold.png deleted file mode 100644 index 89e4f3821..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/LatexBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/LeatherBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/LeatherBlindfold.png deleted file mode 100644 index 59ceb8cea..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/LeatherBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/LeatherSlimMask.png b/Assets/Female3DCG/ItemHead/Preview/LeatherSlimMask.png deleted file mode 100644 index f145158a3..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/LeatherSlimMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/LeatherSlimMaskOpenEyes.png b/Assets/Female3DCG/ItemHead/Preview/LeatherSlimMaskOpenEyes.png deleted file mode 100644 index 83956b737..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/LeatherSlimMaskOpenEyes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/LeatherSlimMaskOpenMouth.png b/Assets/Female3DCG/ItemHead/Preview/LeatherSlimMaskOpenMouth.png deleted file mode 100644 index 18ec7dc9d..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/LeatherSlimMaskOpenMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/LewdBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/LewdBlindfold.png deleted file mode 100644 index c3c9feb22..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/LewdBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/MedicalPatch.png b/Assets/Female3DCG/ItemHead/Preview/MedicalPatch.png deleted file mode 100644 index 4156eba0d..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/MedicalPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/PaddedBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/PaddedBlindfold.png deleted file mode 100644 index 21fe822c9..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/PaddedBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/Pantyhose.png b/Assets/Female3DCG/ItemHead/Preview/Pantyhose.png deleted file mode 100644 index 423b857f6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/Pantyhose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/PrisonLockdownBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/PrisonLockdownBlindfold.png deleted file mode 100644 index a1e09d8f7..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/PrisonLockdownBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/Ribbons.png b/Assets/Female3DCG/ItemHead/Preview/Ribbons.png deleted file mode 100644 index 7d3f73b67..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/Ribbons.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/RopeBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/RopeBlindfold.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/RopeBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/ScarfBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/ScarfBlindfold.png deleted file mode 100644 index 1784fb4ad..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/ScarfBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/SleepMask.png b/Assets/Female3DCG/ItemHead/Preview/SleepMask.png deleted file mode 100644 index 3702a4aa1..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/SleepMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/Slime.png b/Assets/Female3DCG/ItemHead/Preview/Slime.png deleted file mode 100644 index 2f1b835e0..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/Slime.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/SmallBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/SmallBlindfold.png deleted file mode 100644 index 079d64881..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/SmallBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/Snorkel.png b/Assets/Female3DCG/ItemHead/Preview/Snorkel.png deleted file mode 100644 index a1534a80d..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/Snorkel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/Stitches.png b/Assets/Female3DCG/ItemHead/Preview/Stitches.png deleted file mode 100644 index 6b829ac48..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/Stitches.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/StuddedBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/StuddedBlindfold.png deleted file mode 100644 index cc5b3b598..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/StuddedBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/Tentacles.png b/Assets/Female3DCG/ItemHead/Preview/Tentacles.png deleted file mode 100644 index 510ea7c8a..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/Tentacles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Preview/WebBlindfold.png b/Assets/Female3DCG/ItemHead/Preview/WebBlindfold.png deleted file mode 100644 index 2245ac1f6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Preview/WebBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/PrisonLockdownBlindfold.png b/Assets/Female3DCG/ItemHead/PrisonLockdownBlindfold.png deleted file mode 100644 index 362683bc3..000000000 Binary files a/Assets/Female3DCG/ItemHead/PrisonLockdownBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Ribbons.png b/Assets/Female3DCG/ItemHead/Ribbons.png deleted file mode 100644 index ba64a61fd..000000000 Binary files a/Assets/Female3DCG/ItemHead/Ribbons.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/RibbonsWrap.png b/Assets/Female3DCG/ItemHead/RibbonsWrap.png deleted file mode 100644 index b4f33379b..000000000 Binary files a/Assets/Female3DCG/ItemHead/RibbonsWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/RopeBlindfold.png b/Assets/Female3DCG/ItemHead/RopeBlindfold.png deleted file mode 100644 index 1fd4dd5db..000000000 Binary files a/Assets/Female3DCG/ItemHead/RopeBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Sad/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Sad/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Sad/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Sad/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Sad/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Sad/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Sad/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Sad/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Sad/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Sad/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Sad/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Sad/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Sad/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Sad/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Sad/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Sad/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Sad/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Sad/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Sad/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Sad/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Sad/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Sad/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Sad/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Sad/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Sad/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Sad/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Sad/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Sad/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Sad/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Sad/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Scared/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Scared/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Scared/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Scared/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Scared/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Scared/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Scared/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Scared/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Scared/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Scared/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Scared/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Scared/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Scared/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Scared/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Scared/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Scared/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Scared/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Scared/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Scared/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Scared/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Scared/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Scared/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Scared/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Scared/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Scared/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Scared/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Scared/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Scared/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Scared/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Scared/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ScarfBlindfold.png b/Assets/Female3DCG/ItemHead/ScarfBlindfold.png deleted file mode 100644 index 50ea8adab..000000000 Binary files a/Assets/Female3DCG/ItemHead/ScarfBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Shy/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Shy/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Shy/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Shy/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Shy/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Shy/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Shy/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Shy/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Shy/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Shy/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Shy/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Shy/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Shy/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Shy/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Shy/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Shy/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Shy/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Shy/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Shy/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Shy/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Shy/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Shy/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Shy/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Shy/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Shy/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Shy/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Shy/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Shy/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Shy/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Shy/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/ShylyHappy/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/SleepMask.png b/Assets/Female3DCG/ItemHead/SleepMask.png deleted file mode 100644 index be3c238b6..000000000 Binary files a/Assets/Female3DCG/ItemHead/SleepMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Slime.png b/Assets/Female3DCG/ItemHead/Slime.png deleted file mode 100644 index 5533a7511..000000000 Binary files a/Assets/Female3DCG/ItemHead/Slime.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/SmallBlindfold.png b/Assets/Female3DCG/ItemHead/SmallBlindfold.png deleted file mode 100644 index 276578c08..000000000 Binary files a/Assets/Female3DCG/ItemHead/SmallBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/SmallBlindfold_Lock.png b/Assets/Female3DCG/ItemHead/SmallBlindfold_Lock.png deleted file mode 100644 index 55084a8d5..000000000 Binary files a/Assets/Female3DCG/ItemHead/SmallBlindfold_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Snorkel.png b/Assets/Female3DCG/ItemHead/Snorkel.png deleted file mode 100644 index a1534a80d..000000000 Binary files a/Assets/Female3DCG/ItemHead/Snorkel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Snorkel_Mask.png b/Assets/Female3DCG/ItemHead/Snorkel_Mask.png deleted file mode 100644 index e1e7db08c..000000000 Binary files a/Assets/Female3DCG/ItemHead/Snorkel_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Snorkel_Tube.png b/Assets/Female3DCG/ItemHead/Snorkel_Tube.png deleted file mode 100644 index b6271c0f2..000000000 Binary files a/Assets/Female3DCG/ItemHead/Snorkel_Tube.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Stitches_Cross.png deleted file mode 100644 index 8d009b3bc..000000000 Binary files a/Assets/Female3DCG/ItemHead/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Stitches_Skewed.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/StrictLatexBlindfold.png b/Assets/Female3DCG/ItemHead/StrictLatexBlindfold.png deleted file mode 100644 index 62e658303..000000000 Binary files a/Assets/Female3DCG/ItemHead/StrictLatexBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/StuddedBlindfold.png b/Assets/Female3DCG/ItemHead/StuddedBlindfold.png deleted file mode 100644 index 3e0adcaa1..000000000 Binary files a/Assets/Female3DCG/ItemHead/StuddedBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/StuddedBlindfold_Lock.png b/Assets/Female3DCG/ItemHead/StuddedBlindfold_Lock.png deleted file mode 100644 index 77244acd7..000000000 Binary files a/Assets/Female3DCG/ItemHead/StuddedBlindfold_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/Surprised/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/Surprised/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Surprised/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/Surprised/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/Surprised/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Surprised/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/Surprised/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/Surprised/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/Surprised/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/Surprised/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/Surprised/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/Surprised/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/Surprised/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Surprised/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/Surprised/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/Surprised/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Surprised/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/Surprised/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/Surprised/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Tentacles_Shine.png b/Assets/Female3DCG/ItemHead/Tentacles_Shine.png deleted file mode 100644 index 93e57b26a..000000000 Binary files a/Assets/Female3DCG/ItemHead/Tentacles_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/Tentacles_Tentacles.png b/Assets/Female3DCG/ItemHead/Tentacles_Tentacles.png deleted file mode 100644 index ffa61ad0f..000000000 Binary files a/Assets/Female3DCG/ItemHead/Tentacles_Tentacles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Cross.png b/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Cross.png deleted file mode 100644 index 247d3b764..000000000 Binary files a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Cross2.png b/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Cross2.png deleted file mode 100644 index efcacaedb..000000000 Binary files a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Cross2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_FakeEye.png b/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_FakeEye.png deleted file mode 100644 index cfeaec789..000000000 Binary files a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_FakeEye.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_FakeEye2.png b/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_FakeEye2.png deleted file mode 100644 index 8e893d712..000000000 Binary files a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_FakeEye2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Skewed.png b/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Skewed.png deleted file mode 100644 index cd88a4e91..000000000 Binary files a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Skewed2.png b/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Skewed2.png deleted file mode 100644 index c8e0fbb97..000000000 Binary files a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Skewed2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Straight.png b/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Straight.png deleted file mode 100644 index 032393b33..000000000 Binary files a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Straight2.png b/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Straight2.png deleted file mode 100644 index 758820da6..000000000 Binary files a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_Straight2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_ZigZag.png b/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_ZigZag.png deleted file mode 100644 index c590f8f5b..000000000 Binary files a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_ZigZag2.png b/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_ZigZag2.png deleted file mode 100644 index 49329a470..000000000 Binary files a/Assets/Female3DCG/ItemHead/VeryLewd/Stitches_ZigZag2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/WebBlindfold.png b/Assets/Female3DCG/ItemHead/WebBlindfold.png deleted file mode 100644 index 31113b61e..000000000 Binary files a/Assets/Female3DCG/ItemHead/WebBlindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHead/WebBlindfoldCocoon.png b/Assets/Female3DCG/ItemHead/WebBlindfoldCocoon.png deleted file mode 100644 index ad54c8d75..000000000 Binary files a/Assets/Female3DCG/ItemHead/WebBlindfoldCocoon.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/AccentHood.png b/Assets/Female3DCG/ItemHood/AccentHood.png deleted file mode 100644 index 6d091192d..000000000 Binary files a/Assets/Female3DCG/ItemHood/AccentHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/AccentHood_Lock.png b/Assets/Female3DCG/ItemHood/AccentHood_Lock.png deleted file mode 100644 index 7324c6ab8..000000000 Binary files a/Assets/Female3DCG/ItemHood/AccentHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/BlanketHood.png b/Assets/Female3DCG/ItemHood/BlanketHood.png deleted file mode 100644 index dcae6b2b5..000000000 Binary files a/Assets/Female3DCG/ItemHood/BlanketHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/CanvasHood_Hood.png b/Assets/Female3DCG/ItemHood/CanvasHood_Hood.png deleted file mode 100644 index b9984211f..000000000 Binary files a/Assets/Female3DCG/ItemHood/CanvasHood_Hood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/CanvasHood_Lock.png b/Assets/Female3DCG/ItemHood/CanvasHood_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemHood/CanvasHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/CanvasHood_Text.png b/Assets/Female3DCG/ItemHood/CanvasHood_Text.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemHood/CanvasHood_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/CollarHood.png b/Assets/Female3DCG/ItemHood/CollarHood.png deleted file mode 100644 index 06a85d5a8..000000000 Binary files a/Assets/Female3DCG/ItemHood/CollarHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/CollarHood_Collar.png b/Assets/Female3DCG/ItemHood/CollarHood_Collar.png deleted file mode 100644 index 227188944..000000000 Binary files a/Assets/Female3DCG/ItemHood/CollarHood_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/CollarHood_Hood.png b/Assets/Female3DCG/ItemHood/CollarHood_Hood.png deleted file mode 100644 index 926296955..000000000 Binary files a/Assets/Female3DCG/ItemHood/CollarHood_Hood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/CollarHood_Lock.png b/Assets/Female3DCG/ItemHood/CollarHood_Lock.png deleted file mode 100644 index 27c135b19..000000000 Binary files a/Assets/Female3DCG/ItemHood/CollarHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/CowHood_Base.png b/Assets/Female3DCG/ItemHood/CowHood_Base.png deleted file mode 100644 index aa9796d94..000000000 Binary files a/Assets/Female3DCG/ItemHood/CowHood_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/CowHood_Spots.png b/Assets/Female3DCG/ItemHood/CowHood_Spots.png deleted file mode 100644 index 49c678b93..000000000 Binary files a/Assets/Female3DCG/ItemHood/CowHood_Spots.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/DogHood.png b/Assets/Female3DCG/ItemHood/DogHood.png deleted file mode 100644 index 71a214a7c..000000000 Binary files a/Assets/Female3DCG/ItemHood/DogHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/DogHood_Lock.png b/Assets/Female3DCG/ItemHood/DogHood_Lock.png deleted file mode 100644 index 17fee1552..000000000 Binary files a/Assets/Female3DCG/ItemHood/DogHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/FoxyMask_Lock.png b/Assets/Female3DCG/ItemHood/FoxyMask_Lock.png deleted file mode 100644 index 2c75ea15a..000000000 Binary files a/Assets/Female3DCG/ItemHood/FoxyMask_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/FoxyMask_Lower.png b/Assets/Female3DCG/ItemHood/FoxyMask_Lower.png deleted file mode 100644 index ac6456ef5..000000000 Binary files a/Assets/Female3DCG/ItemHood/FoxyMask_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/FoxyMask_Upper.png b/Assets/Female3DCG/ItemHood/FoxyMask_Upper.png deleted file mode 100644 index d2da9b396..000000000 Binary files a/Assets/Female3DCG/ItemHood/FoxyMask_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/FuturisticHelmet.png b/Assets/Female3DCG/ItemHood/FuturisticHelmet.png deleted file mode 100644 index cd1d5c743..000000000 Binary files a/Assets/Female3DCG/ItemHood/FuturisticHelmet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/GP9GasMask_Edges.png b/Assets/Female3DCG/ItemHood/GP9GasMask_Edges.png deleted file mode 100644 index 77f616942..000000000 Binary files a/Assets/Female3DCG/ItemHood/GP9GasMask_Edges.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/GP9GasMask_Lens.png b/Assets/Female3DCG/ItemHood/GP9GasMask_Lens.png deleted file mode 100644 index 4051cc0cc..000000000 Binary files a/Assets/Female3DCG/ItemHood/GP9GasMask_Lens.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/GP9GasMask_Lock.png b/Assets/Female3DCG/ItemHood/GP9GasMask_Lock.png deleted file mode 100644 index dcec195bf..000000000 Binary files a/Assets/Female3DCG/ItemHood/GP9GasMask_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/GP9GasMask_Mask.png b/Assets/Female3DCG/ItemHood/GP9GasMask_Mask.png deleted file mode 100644 index e58021835..000000000 Binary files a/Assets/Female3DCG/ItemHood/GP9GasMask_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/GP9GasMask_Mouth.png b/Assets/Female3DCG/ItemHood/GP9GasMask_Mouth.png deleted file mode 100644 index 3920a3ac4..000000000 Binary files a/Assets/Female3DCG/ItemHood/GP9GasMask_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/GasMask.png b/Assets/Female3DCG/ItemHood/GasMask.png deleted file mode 100644 index be8b02501..000000000 Binary files a/Assets/Female3DCG/ItemHood/GasMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/GasMask_Lock.png b/Assets/Female3DCG/ItemHood/GasMask_Lock.png deleted file mode 100644 index a886530e1..000000000 Binary files a/Assets/Female3DCG/ItemHood/GasMask_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/GwenHood.png b/Assets/Female3DCG/ItemHood/GwenHood.png deleted file mode 100644 index 534082157..000000000 Binary files a/Assets/Female3DCG/ItemHood/GwenHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/GwenHood_Lock.png b/Assets/Female3DCG/ItemHood/GwenHood_Lock.png deleted file mode 100644 index 925d91792..000000000 Binary files a/Assets/Female3DCG/ItemHood/GwenHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/HeadboxSeethroughOpaque_Glass.png b/Assets/Female3DCG/ItemHood/HeadboxSeethroughOpaque_Glass.png deleted file mode 100644 index d61a8d639..000000000 Binary files a/Assets/Female3DCG/ItemHood/HeadboxSeethroughOpaque_Glass.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/HeadboxSeethroughOpaque_Lock.png b/Assets/Female3DCG/ItemHood/HeadboxSeethroughOpaque_Lock.png deleted file mode 100644 index 82c47d062..000000000 Binary files a/Assets/Female3DCG/ItemHood/HeadboxSeethroughOpaque_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/HeadboxSeethrough_Frame.png b/Assets/Female3DCG/ItemHood/HeadboxSeethrough_Frame.png deleted file mode 100644 index 337c98e4e..000000000 Binary files a/Assets/Female3DCG/ItemHood/HeadboxSeethrough_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/HeadboxSeethrough_Glass.png b/Assets/Female3DCG/ItemHood/HeadboxSeethrough_Glass.png deleted file mode 100644 index 0e20272a5..000000000 Binary files a/Assets/Female3DCG/ItemHood/HeadboxSeethrough_Glass.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/HeadboxSeethrough_GlassInside.png b/Assets/Female3DCG/ItemHood/HeadboxSeethrough_GlassInside.png deleted file mode 100644 index 89b5e505e..000000000 Binary files a/Assets/Female3DCG/ItemHood/HeadboxSeethrough_GlassInside.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/HeadboxSeethrough_LEDs.png b/Assets/Female3DCG/ItemHood/HeadboxSeethrough_LEDs.png deleted file mode 100644 index 211c04a1d..000000000 Binary files a/Assets/Female3DCG/ItemHood/HeadboxSeethrough_LEDs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/HeadboxSeethrough_Lock.png b/Assets/Female3DCG/ItemHood/HeadboxSeethrough_Lock.png deleted file mode 100644 index 82c47d062..000000000 Binary files a/Assets/Female3DCG/ItemHood/HeadboxSeethrough_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/InflatedBallHood.png b/Assets/Female3DCG/ItemHood/InflatedBallHood.png deleted file mode 100644 index 893ddb267..000000000 Binary files a/Assets/Female3DCG/ItemHood/InflatedBallHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/InflatedBallHood_Lock.png b/Assets/Female3DCG/ItemHood/InflatedBallHood_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemHood/InflatedBallHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Blush1.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Blush1.png deleted file mode 100644 index f3e28b516..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Blush1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Blush2.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Blush2.png deleted file mode 100644 index fb6ac248b..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Blush2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Blush3.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Blush3.png deleted file mode 100644 index fdbec8808..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Blush3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Blush4.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Blush4.png deleted file mode 100644 index a3a153263..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Blush4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Brows1.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Brows1.png deleted file mode 100644 index e2a65399b..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Brows1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Brows2.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Brows2.png deleted file mode 100644 index ef2d4dbe7..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Brows2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Brows3.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Brows3.png deleted file mode 100644 index ae6c63e82..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Brows3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Brows4.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Brows4.png deleted file mode 100644 index 253dfae44..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Brows4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes1.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes1.png deleted file mode 100644 index f7c5cc0c8..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes2.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes2.png deleted file mode 100644 index 939f1eaa0..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes3.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes3.png deleted file mode 100644 index 9d18fc27d..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes4.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes4.png deleted file mode 100644 index de6976336..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Eyes4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Mask.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Mask.png deleted file mode 100644 index 64d3d912e..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth1.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth1.png deleted file mode 100644 index 147429cc4..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth2.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth2.png deleted file mode 100644 index 1632fbbc0..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth3.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth3.png deleted file mode 100644 index 729c69719..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth4.png b/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth4.png deleted file mode 100644 index b6b99ab69..000000000 Binary files a/Assets/Female3DCG/ItemHood/KirugumiMask_Mouth4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_Base.png b/Assets/Female3DCG/ItemHood/KittyHood_Base.png deleted file mode 100644 index ed7ce5196..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_Blindfold.png b/Assets/Female3DCG/ItemHood/KittyHood_Blindfold.png deleted file mode 100644 index 339af744f..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_Blindfold.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_BlindfoldNeutral.png b/Assets/Female3DCG/ItemHood/KittyHood_BlindfoldNeutral.png deleted file mode 100644 index 1a381c1c6..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_BlindfoldNeutral.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_BlindfoldOwO.png b/Assets/Female3DCG/ItemHood/KittyHood_BlindfoldOwO.png deleted file mode 100644 index 3425d3379..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_BlindfoldOwO.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_BlindfoldUwU.png b/Assets/Female3DCG/ItemHood/KittyHood_BlindfoldUwU.png deleted file mode 100644 index 39df9379c..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_BlindfoldUwU.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_Display.png b/Assets/Female3DCG/ItemHood/KittyHood_Display.png deleted file mode 100644 index fa0d216ec..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_Gag.png b/Assets/Female3DCG/ItemHood/KittyHood_Gag.png deleted file mode 100644 index e467e9546..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_Gag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_GagNeutral.png b/Assets/Female3DCG/ItemHood/KittyHood_GagNeutral.png deleted file mode 100644 index ca652d15e..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_GagNeutral.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_GagOwO.png b/Assets/Female3DCG/ItemHood/KittyHood_GagOwO.png deleted file mode 100644 index f987b1736..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_GagOwO.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_GagUwU.png b/Assets/Female3DCG/ItemHood/KittyHood_GagUwU.png deleted file mode 100644 index e15e856fb..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_GagUwU.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_Linings.png b/Assets/Female3DCG/ItemHood/KittyHood_Linings.png deleted file mode 100644 index 668d068c6..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_Linings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_Lock.png b/Assets/Female3DCG/ItemHood/KittyHood_Lock.png deleted file mode 100644 index 5a93a2d99..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_Openings.png b/Assets/Female3DCG/ItemHood/KittyHood_Openings.png deleted file mode 100644 index 454559568..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_Openings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/KittyHood_Panel.png b/Assets/Female3DCG/ItemHood/KittyHood_Panel.png deleted file mode 100644 index 479885d2e..000000000 Binary files a/Assets/Female3DCG/ItemHood/KittyHood_Panel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LampHeadHood_Cord.png b/Assets/Female3DCG/ItemHood/LampHeadHood_Cord.png deleted file mode 100644 index 496cb7b7e..000000000 Binary files a/Assets/Female3DCG/ItemHood/LampHeadHood_Cord.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LampHeadHood_Inside.png b/Assets/Female3DCG/ItemHood/LampHeadHood_Inside.png deleted file mode 100644 index 28a93ddef..000000000 Binary files a/Assets/Female3DCG/ItemHood/LampHeadHood_Inside.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LampHeadHood_Lamp.png b/Assets/Female3DCG/ItemHood/LampHeadHood_Lamp.png deleted file mode 100644 index 5323f0c8e..000000000 Binary files a/Assets/Female3DCG/ItemHood/LampHeadHood_Lamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LampHeadHood_Switch.png b/Assets/Female3DCG/ItemHood/LampHeadHood_Switch.png deleted file mode 100644 index f6f4b707f..000000000 Binary files a/Assets/Female3DCG/ItemHood/LampHeadHood_Switch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexDogHood.png b/Assets/Female3DCG/ItemHood/LatexDogHood.png deleted file mode 100644 index a1fd57bab..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexDogHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexDogHood_Lock.png b/Assets/Female3DCG/ItemHood/LatexDogHood_Lock.png deleted file mode 100644 index 3ad727724..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexDogHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexHabit.png b/Assets/Female3DCG/ItemHood/LatexHabit.png deleted file mode 100644 index 2f5127e90..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexHabit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexHabit_Back.png b/Assets/Female3DCG/ItemHood/LatexHabit_Back.png deleted file mode 100644 index 49fac5b20..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexHabit_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexHabit_Base.png b/Assets/Female3DCG/ItemHood/LatexHabit_Base.png deleted file mode 100644 index 6748584e2..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexHabit_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexHabit_Cape.png b/Assets/Female3DCG/ItemHood/LatexHabit_Cape.png deleted file mode 100644 index 2848e6e25..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexHabit_Cape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexHabit_Collar.png b/Assets/Female3DCG/ItemHood/LatexHabit_Collar.png deleted file mode 100644 index b105412e3..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexHabit_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexHabit_Cowl.png b/Assets/Female3DCG/ItemHood/LatexHabit_Cowl.png deleted file mode 100644 index 081479808..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexHabit_Cowl.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexHabit_Lock.png b/Assets/Female3DCG/ItemHood/LatexHabit_Lock.png deleted file mode 100644 index 98251482b..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexHabit_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexHoodOpenHair_Hair.png b/Assets/Female3DCG/ItemHood/LatexHoodOpenHair_Hair.png deleted file mode 100644 index bcc4cff54..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexHoodOpenHair_Hair.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexHoodOpenHair_Hood.png b/Assets/Female3DCG/ItemHood/LatexHoodOpenHair_Hood.png deleted file mode 100644 index 55a54aeb8..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexHoodOpenHair_Hood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LatexHoodOpenHair_Lock.png b/Assets/Female3DCG/ItemHood/LatexHoodOpenHair_Lock.png deleted file mode 100644 index 27a31033c..000000000 Binary files a/Assets/Female3DCG/ItemHood/LatexHoodOpenHair_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHoodOpenEyes.png b/Assets/Female3DCG/ItemHood/LeatherHoodOpenEyes.png deleted file mode 100644 index 042c45a3b..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHoodOpenEyes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHoodOpenEyes_Lock.png b/Assets/Female3DCG/ItemHood/LeatherHoodOpenEyes_Lock.png deleted file mode 100644 index bd9d54221..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHoodOpenEyes_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHoodOpenMouth.png b/Assets/Female3DCG/ItemHood/LeatherHoodOpenMouth.png deleted file mode 100644 index 8ae990f50..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHoodOpenMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHoodOpenMouth_Lock.png b/Assets/Female3DCG/ItemHood/LeatherHoodOpenMouth_Lock.png deleted file mode 100644 index 61aac1ae9..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHoodOpenMouth_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHoodSealed.png b/Assets/Female3DCG/ItemHood/LeatherHoodSealed.png deleted file mode 100644 index d1c084f38..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHoodSealed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHoodSealed_Lock.png b/Assets/Female3DCG/ItemHood/LeatherHoodSealed_Lock.png deleted file mode 100644 index c221b0026..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHoodSealed_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHoodSensDep.png b/Assets/Female3DCG/ItemHood/LeatherHoodSensDep.png deleted file mode 100644 index 66c99349e..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHoodSensDep.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHoodSensDep_Lock.png b/Assets/Female3DCG/ItemHood/LeatherHoodSensDep_Lock.png deleted file mode 100644 index f369180c6..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHoodSensDep_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHood_Collar.png b/Assets/Female3DCG/ItemHood/LeatherHood_Collar.png deleted file mode 100644 index 2018c933b..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHood_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHood_Hood.png b/Assets/Female3DCG/ItemHood/LeatherHood_Hood.png deleted file mode 100644 index 9614a9a75..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHood_Hood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHood_Lock.png b/Assets/Female3DCG/ItemHood/LeatherHood_Lock.png deleted file mode 100644 index 069d28c8c..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/LeatherHood_Snaps.png b/Assets/Female3DCG/ItemHood/LeatherHood_Snaps.png deleted file mode 100644 index 267ed6132..000000000 Binary files a/Assets/Female3DCG/ItemHood/LeatherHood_Snaps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OldGasMask_Lenses.png b/Assets/Female3DCG/ItemHood/OldGasMask_Lenses.png deleted file mode 100644 index 7855e29a0..000000000 Binary files a/Assets/Female3DCG/ItemHood/OldGasMask_Lenses.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OldGasMask_Light.png b/Assets/Female3DCG/ItemHood/OldGasMask_Light.png deleted file mode 100644 index afb5d38c5..000000000 Binary files a/Assets/Female3DCG/ItemHood/OldGasMask_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OldGasMask_Lock.png b/Assets/Female3DCG/ItemHood/OldGasMask_Lock.png deleted file mode 100644 index 2d2d25c4f..000000000 Binary files a/Assets/Female3DCG/ItemHood/OldGasMask_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OldGasMask_Mask.png b/Assets/Female3DCG/ItemHood/OldGasMask_Mask.png deleted file mode 100644 index 571bee2fa..000000000 Binary files a/Assets/Female3DCG/ItemHood/OldGasMask_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OldGasMask_Rebreather.png b/Assets/Female3DCG/ItemHood/OldGasMask_Rebreather.png deleted file mode 100644 index 90092788c..000000000 Binary files a/Assets/Female3DCG/ItemHood/OldGasMask_Rebreather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OldGasMask_TubeA.png b/Assets/Female3DCG/ItemHood/OldGasMask_TubeA.png deleted file mode 100644 index 8f9c078c3..000000000 Binary files a/Assets/Female3DCG/ItemHood/OldGasMask_TubeA.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OldGasMask_TubeB.png b/Assets/Female3DCG/ItemHood/OldGasMask_TubeB.png deleted file mode 100644 index 63b70ce95..000000000 Binary files a/Assets/Female3DCG/ItemHood/OldGasMask_TubeB.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OpenFaceHood.png b/Assets/Female3DCG/ItemHood/OpenFaceHood.png deleted file mode 100644 index 132140c66..000000000 Binary files a/Assets/Female3DCG/ItemHood/OpenFaceHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_FakeMouth.png b/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_FakeMouth.png deleted file mode 100644 index ddd674cde..000000000 Binary files a/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_Hood.png b/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_Hood.png deleted file mode 100644 index 92871aeaf..000000000 Binary files a/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_Hood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_Lenses.png b/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_Lenses.png deleted file mode 100644 index a27c8455d..000000000 Binary files a/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_Lenses.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_Plug.png b/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_Plug.png deleted file mode 100644 index 0f39785cd..000000000 Binary files a/Assets/Female3DCG/ItemHood/OpenMouthPlugHood_Plug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Pantyhose.png b/Assets/Female3DCG/ItemHood/Pantyhose.png deleted file mode 100644 index 67a8edb5a..000000000 Binary files a/Assets/Female3DCG/ItemHood/Pantyhose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/PolishedSteelHood.png b/Assets/Female3DCG/ItemHood/PolishedSteelHood.png deleted file mode 100644 index b297156b3..000000000 Binary files a/Assets/Female3DCG/ItemHood/PolishedSteelHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/PolishedSteelHood_Lock.png b/Assets/Female3DCG/ItemHood/PolishedSteelHood_Lock.png deleted file mode 100644 index 7532e8fb5..000000000 Binary files a/Assets/Female3DCG/ItemHood/PolishedSteelHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/PonyHood.png b/Assets/Female3DCG/ItemHood/PonyHood.png deleted file mode 100644 index 16513c14b..000000000 Binary files a/Assets/Female3DCG/ItemHood/PonyHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/PonyHood_Lock.png b/Assets/Female3DCG/ItemHood/PonyHood_Lock.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ItemHood/PonyHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/AccentHood.png b/Assets/Female3DCG/ItemHood/Preview/AccentHood.png deleted file mode 100644 index 761e1d050..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/AccentHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/BlanketHood.png b/Assets/Female3DCG/ItemHood/Preview/BlanketHood.png deleted file mode 100644 index 47745f783..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/BlanketHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/CanvasHood.png b/Assets/Female3DCG/ItemHood/Preview/CanvasHood.png deleted file mode 100644 index 1858b0c05..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/CanvasHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/CollarHood.png b/Assets/Female3DCG/ItemHood/Preview/CollarHood.png deleted file mode 100644 index 7c42d3bbe..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/CollarHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/CowHood.png b/Assets/Female3DCG/ItemHood/Preview/CowHood.png deleted file mode 100644 index 35cdb0e84..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/CowHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/DogHood.png b/Assets/Female3DCG/ItemHood/Preview/DogHood.png deleted file mode 100644 index f1b4ebd64..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/DogHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/FoxyMask.png b/Assets/Female3DCG/ItemHood/Preview/FoxyMask.png deleted file mode 100644 index 6293eb275..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/FoxyMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/FuturisticHelmet.png b/Assets/Female3DCG/ItemHood/Preview/FuturisticHelmet.png deleted file mode 100644 index 7fa88c6be..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/FuturisticHelmet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/GP9GasMask.png b/Assets/Female3DCG/ItemHood/Preview/GP9GasMask.png deleted file mode 100644 index 74d0cb712..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/GP9GasMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/GasMask.png b/Assets/Female3DCG/ItemHood/Preview/GasMask.png deleted file mode 100644 index 63dd9a4bf..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/GasMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/GwenHood.png b/Assets/Female3DCG/ItemHood/Preview/GwenHood.png deleted file mode 100644 index ca268f9ee..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/GwenHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/HeadboxSeethrough.png b/Assets/Female3DCG/ItemHood/Preview/HeadboxSeethrough.png deleted file mode 100644 index d38782f86..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/HeadboxSeethrough.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/InflatedBallHood.png b/Assets/Female3DCG/ItemHood/Preview/InflatedBallHood.png deleted file mode 100644 index e74b79c48..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/InflatedBallHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/KirugumiMask.png b/Assets/Female3DCG/ItemHood/Preview/KirugumiMask.png deleted file mode 100644 index 4b4daeb16..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/KirugumiMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/KittyHood.png b/Assets/Female3DCG/ItemHood/Preview/KittyHood.png deleted file mode 100644 index 0ab548320..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/KittyHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/LampHeadHood.png b/Assets/Female3DCG/ItemHood/Preview/LampHeadHood.png deleted file mode 100644 index e643f5fe8..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/LampHeadHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/LatexDogHood.png b/Assets/Female3DCG/ItemHood/Preview/LatexDogHood.png deleted file mode 100644 index a1fd57bab..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/LatexDogHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/LatexHabit.png b/Assets/Female3DCG/ItemHood/Preview/LatexHabit.png deleted file mode 100644 index 2ab348db5..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/LatexHabit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/LatexHoodOpenHair.png b/Assets/Female3DCG/ItemHood/Preview/LatexHoodOpenHair.png deleted file mode 100644 index 16843aafa..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/LatexHoodOpenHair.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/LeatherHood.png b/Assets/Female3DCG/ItemHood/Preview/LeatherHood.png deleted file mode 100644 index 3ddf141a0..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/LeatherHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/LeatherHoodOpenEyes.png b/Assets/Female3DCG/ItemHood/Preview/LeatherHoodOpenEyes.png deleted file mode 100644 index f58fffe11..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/LeatherHoodOpenEyes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/LeatherHoodOpenMouth.png b/Assets/Female3DCG/ItemHood/Preview/LeatherHoodOpenMouth.png deleted file mode 100644 index 8cb8a0039..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/LeatherHoodOpenMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/LeatherHoodSealed.png b/Assets/Female3DCG/ItemHood/Preview/LeatherHoodSealed.png deleted file mode 100644 index 19b3b7713..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/LeatherHoodSealed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/LeatherHoodSensDep.png b/Assets/Female3DCG/ItemHood/Preview/LeatherHoodSensDep.png deleted file mode 100644 index 985e86b74..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/LeatherHoodSensDep.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/OldGasMask.png b/Assets/Female3DCG/ItemHood/Preview/OldGasMask.png deleted file mode 100644 index 8bd1be6e0..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/OldGasMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/OpenFaceHood.png b/Assets/Female3DCG/ItemHood/Preview/OpenFaceHood.png deleted file mode 100644 index a4a6fa110..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/OpenFaceHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/OpenMouthPlugHood.png b/Assets/Female3DCG/ItemHood/Preview/OpenMouthPlugHood.png deleted file mode 100644 index 5446a53bb..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/OpenMouthPlugHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/Pantyhose.png b/Assets/Female3DCG/ItemHood/Preview/Pantyhose.png deleted file mode 100644 index 423b857f6..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/Pantyhose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/PolishedSteelHood.png b/Assets/Female3DCG/ItemHood/Preview/PolishedSteelHood.png deleted file mode 100644 index 7b96ccd1c..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/PolishedSteelHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/PonyHood.png b/Assets/Female3DCG/ItemHood/Preview/PonyHood.png deleted file mode 100644 index d96941ad6..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/PonyHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/PumpkinHead.png b/Assets/Female3DCG/ItemHood/Preview/PumpkinHead.png deleted file mode 100644 index cbe4450c8..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/PumpkinHead.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/SackHood.png b/Assets/Female3DCG/ItemHood/Preview/SackHood.png deleted file mode 100644 index 635ed344e..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/SackHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/Slime.png b/Assets/Female3DCG/ItemHood/Preview/Slime.png deleted file mode 100644 index 2f1b835e0..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/Slime.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/TechnoHelmet1.png b/Assets/Female3DCG/ItemHood/Preview/TechnoHelmet1.png deleted file mode 100644 index fd8b74cbd..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/TechnoHelmet1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Preview/ZipperHood.png b/Assets/Female3DCG/ItemHood/Preview/ZipperHood.png deleted file mode 100644 index b7e3c3d08..000000000 Binary files a/Assets/Female3DCG/ItemHood/Preview/ZipperHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/PumpkinHead_Back.png b/Assets/Female3DCG/ItemHood/PumpkinHead_Back.png deleted file mode 100644 index 93d01ff31..000000000 Binary files a/Assets/Female3DCG/ItemHood/PumpkinHead_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/PumpkinHead_Front.png b/Assets/Female3DCG/ItemHood/PumpkinHead_Front.png deleted file mode 100644 index df7108b58..000000000 Binary files a/Assets/Female3DCG/ItemHood/PumpkinHead_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/SackHood.png b/Assets/Female3DCG/ItemHood/SackHood.png deleted file mode 100644 index 7693b35f7..000000000 Binary files a/Assets/Female3DCG/ItemHood/SackHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Slime_One.png b/Assets/Female3DCG/ItemHood/Slime_One.png deleted file mode 100644 index 0a3468191..000000000 Binary files a/Assets/Female3DCG/ItemHood/Slime_One.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/Slime_Two.png b/Assets/Female3DCG/ItemHood/Slime_Two.png deleted file mode 100644 index e1fcfd0e7..000000000 Binary files a/Assets/Female3DCG/ItemHood/Slime_Two.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/TechnoHelmet1_ChinStrap.png b/Assets/Female3DCG/ItemHood/TechnoHelmet1_ChinStrap.png deleted file mode 100644 index cebcb3043..000000000 Binary files a/Assets/Female3DCG/ItemHood/TechnoHelmet1_ChinStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/TechnoHelmet1_HeavilyTintedVisor.png b/Assets/Female3DCG/ItemHood/TechnoHelmet1_HeavilyTintedVisor.png deleted file mode 100644 index 01081c0b2..000000000 Binary files a/Assets/Female3DCG/ItemHood/TechnoHelmet1_HeavilyTintedVisor.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/TechnoHelmet1_HelmetMain.png b/Assets/Female3DCG/ItemHood/TechnoHelmet1_HelmetMain.png deleted file mode 100644 index e14e0fe5f..000000000 Binary files a/Assets/Female3DCG/ItemHood/TechnoHelmet1_HelmetMain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/TechnoHelmet1_HelmetSecondary.png b/Assets/Female3DCG/ItemHood/TechnoHelmet1_HelmetSecondary.png deleted file mode 100644 index 791aabc2d..000000000 Binary files a/Assets/Female3DCG/ItemHood/TechnoHelmet1_HelmetSecondary.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/TechnoHelmet1_HypnoSpiral.png b/Assets/Female3DCG/ItemHood/TechnoHelmet1_HypnoSpiral.png deleted file mode 100644 index bfe63492d..000000000 Binary files a/Assets/Female3DCG/ItemHood/TechnoHelmet1_HypnoSpiral.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/TechnoHelmet1_LightlyTintedVisor.png b/Assets/Female3DCG/ItemHood/TechnoHelmet1_LightlyTintedVisor.png deleted file mode 100644 index ca10ad31c..000000000 Binary files a/Assets/Female3DCG/ItemHood/TechnoHelmet1_LightlyTintedVisor.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/TechnoHelmet1_OpaqueVisor.png b/Assets/Female3DCG/ItemHood/TechnoHelmet1_OpaqueVisor.png deleted file mode 100644 index 83ade1e44..000000000 Binary files a/Assets/Female3DCG/ItemHood/TechnoHelmet1_OpaqueVisor.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/TechnoHelmet1_Shine.png b/Assets/Female3DCG/ItemHood/TechnoHelmet1_Shine.png deleted file mode 100644 index da98c79f9..000000000 Binary files a/Assets/Female3DCG/ItemHood/TechnoHelmet1_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/TechnoHelmet1_TransparentVisor.png b/Assets/Female3DCG/ItemHood/TechnoHelmet1_TransparentVisor.png deleted file mode 100644 index d6eb72034..000000000 Binary files a/Assets/Female3DCG/ItemHood/TechnoHelmet1_TransparentVisor.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/ZipperHood.png b/Assets/Female3DCG/ItemHood/ZipperHood.png deleted file mode 100644 index 38aeeb488..000000000 Binary files a/Assets/Female3DCG/ItemHood/ZipperHood.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/ZipperHoodZippersClosed.png b/Assets/Female3DCG/ItemHood/ZipperHoodZippersClosed.png deleted file mode 100644 index df602d345..000000000 Binary files a/Assets/Female3DCG/ItemHood/ZipperHoodZippersClosed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/ZipperHoodZippersClosedEyes.png b/Assets/Female3DCG/ItemHood/ZipperHoodZippersClosedEyes.png deleted file mode 100644 index a043cb9aa..000000000 Binary files a/Assets/Female3DCG/ItemHood/ZipperHoodZippersClosedEyes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/ZipperHoodZippersClosedMouth.png b/Assets/Female3DCG/ItemHood/ZipperHoodZippersClosedMouth.png deleted file mode 100644 index 6e0b83e2e..000000000 Binary files a/Assets/Female3DCG/ItemHood/ZipperHoodZippersClosedMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemHood/ZipperHood_Lock.png b/Assets/Female3DCG/ItemHood/ZipperHood_Lock.png deleted file mode 100644 index b853dda3d..000000000 Binary files a/Assets/Female3DCG/ItemHood/ZipperHood_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_Large.png b/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_Large.png deleted file mode 100644 index fe084faae..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_Normal.png b/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_Normal.png deleted file mode 100644 index 9e2c42004..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_Small.png b/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_Small.png deleted file mode 100644 index 9ae1ddc28..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_XLarge.png b/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_XLarge.png deleted file mode 100644 index b1be17aa6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackBoxTie/MermaidTail_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_Large.png b/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_Large.png deleted file mode 100644 index fe084faae..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_Normal.png b/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_Normal.png deleted file mode 100644 index 9e2c42004..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_Small.png b/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_Small.png deleted file mode 100644 index 9ae1ddc28..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_XLarge.png b/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_XLarge.png deleted file mode 100644 index b1be17aa6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackCuffs/MermaidTail_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_Large.png b/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_Large.png deleted file mode 100644 index fe084faae..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_Normal.png b/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_Normal.png deleted file mode 100644 index 9e2c42004..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_Small.png b/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_Small.png deleted file mode 100644 index 9ae1ddc28..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_XLarge.png b/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_XLarge.png deleted file mode 100644 index b1be17aa6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/BackElbowTouch/MermaidTail_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/ChainsStrict_Lock.png b/Assets/Female3DCG/ItemLegs/ChainsStrict_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemLegs/ChainsStrict_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Chains_Large.png b/Assets/Female3DCG/ItemLegs/Chains_Large.png deleted file mode 100644 index c86826c29..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Chains_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Chains_LargeStrict.png b/Assets/Female3DCG/ItemLegs/Chains_LargeStrict.png deleted file mode 100644 index 161f5b358..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Chains_LargeStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Chains_Lock.png b/Assets/Female3DCG/ItemLegs/Chains_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Chains_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Chains_Normal.png b/Assets/Female3DCG/ItemLegs/Chains_Normal.png deleted file mode 100644 index e082f57ce..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Chains_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Chains_NormalStrict.png b/Assets/Female3DCG/ItemLegs/Chains_NormalStrict.png deleted file mode 100644 index 9270a41a6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Chains_NormalStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Chains_Small.png b/Assets/Female3DCG/ItemLegs/Chains_Small.png deleted file mode 100644 index fe885a877..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Chains_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Chains_SmallStrict.png b/Assets/Female3DCG/ItemLegs/Chains_SmallStrict.png deleted file mode 100644 index b21c4dfd2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Chains_SmallStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Chains_XLarge.png b/Assets/Female3DCG/ItemLegs/Chains_XLarge.png deleted file mode 100644 index 324c9ae06..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Chains_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Chains_XLargeStrict.png b/Assets/Female3DCG/ItemLegs/Chains_XLargeStrict.png deleted file mode 100644 index bc09baf8c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Chains_XLargeStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_Large.png b/Assets/Female3DCG/ItemLegs/DuctTape_Large.png deleted file mode 100644 index 435b1797a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_LargeCompleteLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_LargeCompleteLegs.png deleted file mode 100644 index fea26b1d6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_LargeCompleteLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_LargeCutOut.png b/Assets/Female3DCG/ItemLegs/DuctTape_LargeCutOut.png deleted file mode 100644 index 5515e5205..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_LargeCutOut.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_LargeHalfLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_LargeHalfLegs.png deleted file mode 100644 index c2bcb845a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_LargeHalfLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_LargeMostLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_LargeMostLegs.png deleted file mode 100644 index fbc2a07f6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_LargeMostLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_LargePetLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_LargePetLegs.png deleted file mode 100644 index d03e61356..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_LargePetLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_Normal.png b/Assets/Female3DCG/ItemLegs/DuctTape_Normal.png deleted file mode 100644 index ecde74452..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_NormalCompleteLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_NormalCompleteLegs.png deleted file mode 100644 index 3a42d65a9..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_NormalCompleteLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_NormalCutOut.png b/Assets/Female3DCG/ItemLegs/DuctTape_NormalCutOut.png deleted file mode 100644 index 6a8185cf0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_NormalCutOut.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_NormalHalfLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_NormalHalfLegs.png deleted file mode 100644 index 65948a3f5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_NormalHalfLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_NormalMostLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_NormalMostLegs.png deleted file mode 100644 index 77864165c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_NormalMostLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_NormalPetLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_NormalPetLegs.png deleted file mode 100644 index 62de7236f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_NormalPetLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_Small.png b/Assets/Female3DCG/ItemLegs/DuctTape_Small.png deleted file mode 100644 index c5c4cf766..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_SmallCompleteLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_SmallCompleteLegs.png deleted file mode 100644 index 22e690066..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_SmallCompleteLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_SmallCutOut.png b/Assets/Female3DCG/ItemLegs/DuctTape_SmallCutOut.png deleted file mode 100644 index 978aed981..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_SmallCutOut.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_SmallHalfLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_SmallHalfLegs.png deleted file mode 100644 index c2e3a1d59..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_SmallHalfLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_SmallMostLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_SmallMostLegs.png deleted file mode 100644 index e16035ccc..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_SmallMostLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_SmallPetLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_SmallPetLegs.png deleted file mode 100644 index 8140a4221..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_SmallPetLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_XLarge.png b/Assets/Female3DCG/ItemLegs/DuctTape_XLarge.png deleted file mode 100644 index ea6608746..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_XLargeCompleteLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_XLargeCompleteLegs.png deleted file mode 100644 index 9bb07e5d2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_XLargeCompleteLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_XLargeCutOut.png b/Assets/Female3DCG/ItemLegs/DuctTape_XLargeCutOut.png deleted file mode 100644 index a7bcfe5f2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_XLargeCutOut.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_XLargeHalfLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_XLargeHalfLegs.png deleted file mode 100644 index 24aa0b58b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_XLargeHalfLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_XLargeMostLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_XLargeMostLegs.png deleted file mode 100644 index 79d086454..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_XLargeMostLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/DuctTape_XLargePetLegs.png b/Assets/Female3DCG/ItemLegs/DuctTape_XLargePetLegs.png deleted file mode 100644 index 076fd31d4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/DuctTape_XLargePetLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Chain.png deleted file mode 100644 index 0d2b60320..000000000 Binary files a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Display.png b/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Display.png deleted file mode 100644 index ce4878452..000000000 Binary files a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Large_Cuffs.png deleted file mode 100644 index 0afcdf823..000000000 Binary files a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Lock.png b/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Lock.png deleted file mode 100644 index b181b9dd4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Normal_Cuffs.png deleted file mode 100644 index 3e98d41a3..000000000 Binary files a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Small_Cuffs.png deleted file mode 100644 index 14a67a5a3..000000000 Binary files a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_XLarge_Cuffs.png deleted file mode 100644 index eb4e3c1f2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/FuturisticLegCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_Large.png b/Assets/Female3DCG/ItemLegs/HempRope_Large.png deleted file mode 100644 index 528a9e399..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_LargeCrossed.png b/Assets/Female3DCG/ItemLegs/HempRope_LargeCrossed.png deleted file mode 100644 index 2ece58f59..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_LargeCrossed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_LargeFullBinding.png b/Assets/Female3DCG/ItemLegs/HempRope_LargeFullBinding.png deleted file mode 100644 index d9d292ed2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_LargeFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_LargeLink.png b/Assets/Female3DCG/ItemLegs/HempRope_LargeLink.png deleted file mode 100644 index 0d5715def..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_LargeLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_LargeMermaid.png b/Assets/Female3DCG/ItemLegs/HempRope_LargeMermaid.png deleted file mode 100644 index 2e90f91a2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_LargeMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_Normal.png b/Assets/Female3DCG/ItemLegs/HempRope_Normal.png deleted file mode 100644 index 473c038a2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_NormalCrossed.png b/Assets/Female3DCG/ItemLegs/HempRope_NormalCrossed.png deleted file mode 100644 index 40bd9a5d8..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_NormalCrossed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_NormalFullBinding.png b/Assets/Female3DCG/ItemLegs/HempRope_NormalFullBinding.png deleted file mode 100644 index 07c38bb80..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_NormalFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_NormalLink.png b/Assets/Female3DCG/ItemLegs/HempRope_NormalLink.png deleted file mode 100644 index 1d2ad7be4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_NormalLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_NormalMermaid.png b/Assets/Female3DCG/ItemLegs/HempRope_NormalMermaid.png deleted file mode 100644 index 4272aeb1f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_NormalMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_Small.png b/Assets/Female3DCG/ItemLegs/HempRope_Small.png deleted file mode 100644 index 8d653b726..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_SmallCrossed.png b/Assets/Female3DCG/ItemLegs/HempRope_SmallCrossed.png deleted file mode 100644 index b0c5bb563..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_SmallCrossed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_SmallFullBinding.png b/Assets/Female3DCG/ItemLegs/HempRope_SmallFullBinding.png deleted file mode 100644 index e8d342026..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_SmallFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_SmallLink.png b/Assets/Female3DCG/ItemLegs/HempRope_SmallLink.png deleted file mode 100644 index f05225200..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_SmallLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_SmallMermaid.png b/Assets/Female3DCG/ItemLegs/HempRope_SmallMermaid.png deleted file mode 100644 index c0b0cadab..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_SmallMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_XLarge.png b/Assets/Female3DCG/ItemLegs/HempRope_XLarge.png deleted file mode 100644 index 436f26485..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_XLargeCrossed.png b/Assets/Female3DCG/ItemLegs/HempRope_XLargeCrossed.png deleted file mode 100644 index 717294ce0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_XLargeCrossed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_XLargeFullBinding.png b/Assets/Female3DCG/ItemLegs/HempRope_XLargeFullBinding.png deleted file mode 100644 index 78e7a31c4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_XLargeFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_XLargeLink.png b/Assets/Female3DCG/ItemLegs/HempRope_XLargeLink.png deleted file mode 100644 index 6c5ff2838..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_XLargeLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HempRope_XLargeMermaid.png b/Assets/Female3DCG/ItemLegs/HempRope_XLargeMermaid.png deleted file mode 100644 index a7581ecd2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HempRope_XLargeMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Large_Belts.png b/Assets/Female3DCG/ItemLegs/HobbleSkirt_Large_Belts.png deleted file mode 100644 index e8f40729d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Large_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Large_Latex.png b/Assets/Female3DCG/ItemLegs/HobbleSkirt_Large_Latex.png deleted file mode 100644 index 997603363..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Lock.png b/Assets/Female3DCG/ItemLegs/HobbleSkirt_Lock.png deleted file mode 100644 index 77c8cdb52..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Normal_Belts.png b/Assets/Female3DCG/ItemLegs/HobbleSkirt_Normal_Belts.png deleted file mode 100644 index 1e2f72345..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Normal_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Normal_Latex.png b/Assets/Female3DCG/ItemLegs/HobbleSkirt_Normal_Latex.png deleted file mode 100644 index 37bcb791f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Small_Belts.png b/Assets/Female3DCG/ItemLegs/HobbleSkirt_Small_Belts.png deleted file mode 100644 index 477a1b693..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Small_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Small_Latex.png b/Assets/Female3DCG/ItemLegs/HobbleSkirt_Small_Latex.png deleted file mode 100644 index 86e3c1f82..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HobbleSkirt_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HobbleSkirt_XLarge_Belts.png b/Assets/Female3DCG/ItemLegs/HobbleSkirt_XLarge_Belts.png deleted file mode 100644 index d9c8f6e93..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HobbleSkirt_XLarge_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/HobbleSkirt_XLarge_Latex.png b/Assets/Female3DCG/ItemLegs/HobbleSkirt_XLarge_Latex.png deleted file mode 100644 index a72a568b9..000000000 Binary files a/Assets/Female3DCG/ItemLegs/HobbleSkirt_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/ChainsStrict_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/ChainsStrict_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/ChainsStrict_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Chains_Large.png b/Assets/Female3DCG/ItemLegs/Kneel/Chains_Large.png deleted file mode 100644 index c86826c29..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Chains_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Chains_LargeStrict.png b/Assets/Female3DCG/ItemLegs/Kneel/Chains_LargeStrict.png deleted file mode 100644 index 89e88e000..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Chains_LargeStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Chains_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/Chains_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Chains_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Chains_Normal.png b/Assets/Female3DCG/ItemLegs/Kneel/Chains_Normal.png deleted file mode 100644 index e082f57ce..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Chains_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Chains_NormalStrict.png b/Assets/Female3DCG/ItemLegs/Kneel/Chains_NormalStrict.png deleted file mode 100644 index a03ba5b63..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Chains_NormalStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Chains_Small.png b/Assets/Female3DCG/ItemLegs/Kneel/Chains_Small.png deleted file mode 100644 index fe885a877..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Chains_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Chains_SmallStrict.png b/Assets/Female3DCG/ItemLegs/Kneel/Chains_SmallStrict.png deleted file mode 100644 index 020c297fc..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Chains_SmallStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Chains_XLarge.png b/Assets/Female3DCG/ItemLegs/Kneel/Chains_XLarge.png deleted file mode 100644 index 324c9ae06..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Chains_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Chains_XLargeStrict.png b/Assets/Female3DCG/ItemLegs/Kneel/Chains_XLargeStrict.png deleted file mode 100644 index d2176ff34..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Chains_XLargeStrict.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_Large.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_Large.png deleted file mode 100644 index 61cb10316..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargeCompleteLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargeCompleteLegs.png deleted file mode 100644 index bd0614f0e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargeCompleteLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargeHalfLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargeHalfLegs.png deleted file mode 100644 index d74436a0c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargeHalfLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargeMostLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargeMostLegs.png deleted file mode 100644 index ef817cb97..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargeMostLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargePetLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargePetLegs.png deleted file mode 100644 index d03e61356..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_LargePetLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_Normal.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_Normal.png deleted file mode 100644 index 859ea2139..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalCompleteLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalCompleteLegs.png deleted file mode 100644 index 6db6b21bb..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalCompleteLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalHalfLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalHalfLegs.png deleted file mode 100644 index 58c8e1db5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalHalfLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalMostLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalMostLegs.png deleted file mode 100644 index 6c9a771e5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalMostLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalPetLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalPetLegs.png deleted file mode 100644 index 62de7236f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_NormalPetLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_Small.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_Small.png deleted file mode 100644 index 70997ffc7..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallCompleteLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallCompleteLegs.png deleted file mode 100644 index 3d7f06057..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallCompleteLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallHalfLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallHalfLegs.png deleted file mode 100644 index c2e4e12b1..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallHalfLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallMostLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallMostLegs.png deleted file mode 100644 index 87b82f358..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallMostLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallPetLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallPetLegs.png deleted file mode 100644 index 8140a4221..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_SmallPetLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLarge.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLarge.png deleted file mode 100644 index 30250d729..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargeCompleteLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargeCompleteLegs.png deleted file mode 100644 index 011b5e4bd..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargeCompleteLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargeHalfLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargeHalfLegs.png deleted file mode 100644 index 117d40f6f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargeHalfLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargeMostLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargeMostLegs.png deleted file mode 100644 index 936077e25..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargeMostLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargePetLegs.png b/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargePetLegs.png deleted file mode 100644 index 076fd31d4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/DuctTape_XLargePetLegs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Large.png b/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Large.png deleted file mode 100644 index 0670c86c0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Lock.png deleted file mode 100644 index a9cb7ea1f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Normal.png b/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Normal.png deleted file mode 100644 index cd75662cf..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Small.png b/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Small.png deleted file mode 100644 index fdc4b0cf1..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_XLarge.png b/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_XLarge.png deleted file mode 100644 index f47802f34..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FrogtieStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Chain.png deleted file mode 100644 index 6661b7cc2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Display.png b/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Display.png deleted file mode 100644 index 4588a5e25..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Large_Cuffs.png deleted file mode 100644 index 6fbcbc52b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Lock.png deleted file mode 100644 index 2a920532c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Normal_Cuffs.png deleted file mode 100644 index 3f3a96308..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Small_Cuffs.png deleted file mode 100644 index 7f6ad6f0b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_XLarge_Cuffs.png deleted file mode 100644 index fc46527cb..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/FuturisticLegCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_Large.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_Large.png deleted file mode 100644 index 36ef472d4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeCrossed.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeCrossed.png deleted file mode 100644 index 3e0904f2f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeCrossed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeFrogtie.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeFrogtie.png deleted file mode 100644 index 7b4e04cf0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeFullBinding.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeFullBinding.png deleted file mode 100644 index 21cee76ba..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeLink.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeLink.png deleted file mode 100644 index 21f614568..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeMermaid.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeMermaid.png deleted file mode 100644 index 0a51edda7..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_LargeMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_Normal.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_Normal.png deleted file mode 100644 index ad0ab070c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalCrossed.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalCrossed.png deleted file mode 100644 index 0b8dfbf11..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalCrossed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalFrogtie.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalFrogtie.png deleted file mode 100644 index df5be14cc..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalFullBinding.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalFullBinding.png deleted file mode 100644 index 709885ac5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalLink.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalLink.png deleted file mode 100644 index 83b60db2e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalMermaid.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalMermaid.png deleted file mode 100644 index 51eba7f2c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_NormalMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_Small.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_Small.png deleted file mode 100644 index 5a8181c23..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallCrossed.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallCrossed.png deleted file mode 100644 index d9dc86591..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallCrossed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallFrogtie.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallFrogtie.png deleted file mode 100644 index 7b5f6c2f1..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallFullBinding.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallFullBinding.png deleted file mode 100644 index 0670dcb08..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallLink.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallLink.png deleted file mode 100644 index fa38d27bf..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallMermaid.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallMermaid.png deleted file mode 100644 index eb10a94d5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_SmallMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLarge.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLarge.png deleted file mode 100644 index 0514ea10b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeCrossed.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeCrossed.png deleted file mode 100644 index 3efca758d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeCrossed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeFrogtie.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeFrogtie.png deleted file mode 100644 index f945f5af2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeFullBinding.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeFullBinding.png deleted file mode 100644 index 29f05066e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeFullBinding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeLink.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeLink.png deleted file mode 100644 index 54e35fd3a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeMermaid.png b/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeMermaid.png deleted file mode 100644 index e67b20661..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HempRope_XLargeMermaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Large_Belts.png b/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Large_Belts.png deleted file mode 100644 index a8c4ab8e4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Large_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Large_Latex.png b/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Large_Latex.png deleted file mode 100644 index 5a04d2667..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Lock.png deleted file mode 100644 index 54f574495..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Normal_Belts.png b/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Normal_Belts.png deleted file mode 100644 index 35b9802bd..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Normal_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Normal_Latex.png b/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Normal_Latex.png deleted file mode 100644 index edc64b459..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Small_Belts.png b/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Small_Belts.png deleted file mode 100644 index 16f3fc0b2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Small_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Small_Latex.png b/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Small_Latex.png deleted file mode 100644 index 7576dd349..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_XLarge_Belts.png b/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_XLarge_Belts.png deleted file mode 100644 index 0873a7563..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_XLarge_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_XLarge_Latex.png b/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_XLarge_Latex.png deleted file mode 100644 index 1dcc054c8..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/HobbleSkirt_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Large.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Large.png deleted file mode 100644 index 5ff5badf1..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Lock.png deleted file mode 100644 index 669d097c6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Normal.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Normal.png deleted file mode 100644 index 4e0d3cdf0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Small.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Small.png deleted file mode 100644 index 74a810ac4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_XLarge.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_XLarge.png deleted file mode 100644 index b369f4de6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherBelt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Chain.png deleted file mode 100644 index 6661b7cc2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Large_Cuffs.png deleted file mode 100644 index faaab828b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Large_Rings.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Large_Rings.png deleted file mode 100644 index 75e17c5d2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Lock.png deleted file mode 100644 index b39484c1f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Normal_Cuffs.png deleted file mode 100644 index 53007757d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Normal_Rings.png deleted file mode 100644 index f6f422832..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Small_Cuffs.png deleted file mode 100644 index d7fa6d382..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Small_Rings.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Small_Rings.png deleted file mode 100644 index f7517628b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_XLarge_Cuffs.png deleted file mode 100644 index ddef160db..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_XLarge_Rings.png deleted file mode 100644 index 728409c56..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LeatherLegCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Large_Belts.png b/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Large_Belts.png deleted file mode 100644 index f77f8d994..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Large_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Large_Latex.png b/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Large_Latex.png deleted file mode 100644 index 5ac354479..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Lock.png deleted file mode 100644 index c9b45f5c6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Normal_Belts.png b/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Normal_Belts.png deleted file mode 100644 index 831e22d2d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Normal_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Normal_Latex.png b/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Normal_Latex.png deleted file mode 100644 index b66e19049..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Small_Belts.png b/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Small_Belts.png deleted file mode 100644 index 9c064c90e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Small_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Small_Latex.png b/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Small_Latex.png deleted file mode 100644 index bbcd16421..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_XLarge_Belts.png b/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_XLarge_Belts.png deleted file mode 100644 index 37b10a0fd..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_XLarge_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_XLarge_Latex.png b/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_XLarge_Latex.png deleted file mode 100644 index bc304a9dc..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/LegBinder_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_FrogtieRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_FrogtieRope.png deleted file mode 100644 index 4fad10760..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_FrogtieRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_FrogtieShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_FrogtieShine.png deleted file mode 100644 index 8f997bd7f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_FrogtieShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_LowerRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_LowerRope.png deleted file mode 100644 index 9cbf00db9..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_LowerShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_LowerShine.png deleted file mode 100644 index beccca740..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_UpperRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_UpperRope.png deleted file mode 100644 index 3c1a31936..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_UpperShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_UpperShine.png deleted file mode 100644 index 1b3d474d6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Large_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_FrogtieRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_FrogtieRope.png deleted file mode 100644 index 4ec174f5b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_FrogtieRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_FrogtieShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_FrogtieShine.png deleted file mode 100644 index 231e70c8c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_FrogtieShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_LowerRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_LowerRope.png deleted file mode 100644 index b538289a4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_LowerShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_LowerShine.png deleted file mode 100644 index 1d8d1f53d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_UpperRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_UpperRope.png deleted file mode 100644 index d940970da..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_UpperShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_UpperShine.png deleted file mode 100644 index 6004b51b8..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Normal_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_FrogtieRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_FrogtieRope.png deleted file mode 100644 index 994d73101..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_FrogtieRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_FrogtieShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_FrogtieShine.png deleted file mode 100644 index e3911740a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_FrogtieShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_LowerRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_LowerRope.png deleted file mode 100644 index 81268f22d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_LowerShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_LowerShine.png deleted file mode 100644 index 3bc48fbd2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_UpperRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_UpperRope.png deleted file mode 100644 index 7518c4450..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_UpperShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_UpperShine.png deleted file mode 100644 index 44adc4de6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_Small_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_FrogtieRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_FrogtieRope.png deleted file mode 100644 index d6dd7dbb5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_FrogtieRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_FrogtieShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_FrogtieShine.png deleted file mode 100644 index a3fe6518e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_FrogtieShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_LowerRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_LowerRope.png deleted file mode 100644 index 19208c728..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_LowerShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_LowerShine.png deleted file mode 100644 index 827ea8f43..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_UpperRope.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_UpperRope.png deleted file mode 100644 index 3e9da5a2f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_UpperShine.png b/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_UpperShine.png deleted file mode 100644 index b103963e3..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/NylonRope_XLarge_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Chain.png deleted file mode 100644 index 6661b7cc2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Large_Cuffs.png deleted file mode 100644 index c254dfe8a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Large_Gems.png b/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Large_Gems.png deleted file mode 100644 index f8fb7c515..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Normal_Cuffs.png deleted file mode 100644 index 38ec099e4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Normal_Gems.png deleted file mode 100644 index 5af8919fb..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Small_Cuffs.png deleted file mode 100644 index 474e6b3e5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Small_Gems.png b/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Small_Gems.png deleted file mode 100644 index 46e07095d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_XLarge_Cuffs.png deleted file mode 100644 index 50d14c629..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_XLarge_Gems.png deleted file mode 100644 index 5432eb8fa..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/OrnateLegCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_Large.png b/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_Large.png deleted file mode 100644 index 486d680b9..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_Normal.png b/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_Normal.png deleted file mode 100644 index 03f4f01c6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_Small.png b/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_Small.png deleted file mode 100644 index bec68b264..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_XLarge.png b/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_XLarge.png deleted file mode 100644 index f5fd547be..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/PlasticWrap_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_Large.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_Large.png deleted file mode 100644 index 53de98e07..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_LargeCross.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_LargeCross.png deleted file mode 100644 index b40c73c32..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_LargeCross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_LargeMessyWrap.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_LargeMessyWrap.png deleted file mode 100644 index 70cefcd41..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_LargeMessyWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_Normal.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_Normal.png deleted file mode 100644 index 5699d3404..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_NormalCross.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_NormalCross.png deleted file mode 100644 index 73a4dc768..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_NormalCross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_NormalMessyWrap.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_NormalMessyWrap.png deleted file mode 100644 index aa3e54839..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_NormalMessyWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_Small.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_Small.png deleted file mode 100644 index df5eec2ee..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_SmallCross.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_SmallCross.png deleted file mode 100644 index bccee1360..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_SmallCross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_SmallMessyWrap.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_SmallMessyWrap.png deleted file mode 100644 index 473889d53..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_SmallMessyWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_XLarge.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_XLarge.png deleted file mode 100644 index d79608bf6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_XLargeCross.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_XLargeCross.png deleted file mode 100644 index 311552744..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_XLargeCross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_XLargeMessyWrap.png b/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_XLargeMessyWrap.png deleted file mode 100644 index 61185e95a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Ribbons_XLargeMessyWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Large.png b/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Large.png deleted file mode 100644 index a635b873a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Normal.png b/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Normal.png deleted file mode 100644 index ea29d6425..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Small.png b/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Small.png deleted file mode 100644 index a44325fef..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_XLarge.png b/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_XLarge.png deleted file mode 100644 index fb57a1b57..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessHobbleSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Large.png b/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Large.png deleted file mode 100644 index 5ac354479..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Normal.png b/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Normal.png deleted file mode 100644 index b66e19049..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Small.png b/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Small.png deleted file mode 100644 index bbcd16421..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_XLarge.png b/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_XLarge.png deleted file mode 100644 index bc304a9dc..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SeamlessLegBinder_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBeltsTwo_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBeltsTwo_Lock.png deleted file mode 100644 index c45049bc7..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBeltsTwo_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_LowerBelt.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_LowerBelt.png deleted file mode 100644 index 13f9105a0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_LowerMetal.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_LowerMetal.png deleted file mode 100644 index 53b5b9e75..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_UpperBelt.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_UpperBelt.png deleted file mode 100644 index cf3ce02dc..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_UpperMetal.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_UpperMetal.png deleted file mode 100644 index 2aace9455..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Large_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Lock.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Lock.png deleted file mode 100644 index 62f51ab9a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_LowerBelt.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_LowerBelt.png deleted file mode 100644 index c059a8d7a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_LowerMetal.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_LowerMetal.png deleted file mode 100644 index 75737002e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_UpperBelt.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_UpperBelt.png deleted file mode 100644 index 66cf6c2f9..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_UpperMetal.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_UpperMetal.png deleted file mode 100644 index cecb53290..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Normal_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_LowerBelt.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_LowerBelt.png deleted file mode 100644 index e89ea212a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_LowerMetal.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_LowerMetal.png deleted file mode 100644 index fdccaa032..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_UpperBelt.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_UpperBelt.png deleted file mode 100644 index b2977e1f5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_UpperMetal.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_UpperMetal.png deleted file mode 100644 index b9334078f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_Small_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_LowerBelt.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_LowerBelt.png deleted file mode 100644 index 83255b346..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_LowerMetal.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_LowerMetal.png deleted file mode 100644 index 80ece4530..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_UpperBelt.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_UpperBelt.png deleted file mode 100644 index b556cc042..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_UpperMetal.png b/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_UpperMetal.png deleted file mode 100644 index 1a30316c8..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/SturdyLeatherBelts_XLarge_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_Large.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_Large.png deleted file mode 100644 index dc636470e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_LargeZipFrogtie.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_LargeZipFrogtie.png deleted file mode 100644 index f9274b175..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_LargeZipFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_LargeZipLegFull.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_LargeZipLegFull.png deleted file mode 100644 index 1769ea9f7..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_LargeZipLegFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_LargeZipLegMedium.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_LargeZipLegMedium.png deleted file mode 100644 index 5471e63de..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_LargeZipLegMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_Normal.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_Normal.png deleted file mode 100644 index 55a61b353..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_NormalZipFrogtie.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_NormalZipFrogtie.png deleted file mode 100644 index 932b9347e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_NormalZipFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_NormalZipLegFull.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_NormalZipLegFull.png deleted file mode 100644 index 75d310351..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_NormalZipLegFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_NormalZipLegMedium.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_NormalZipLegMedium.png deleted file mode 100644 index ab3c66ea9..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_NormalZipLegMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_Small.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_Small.png deleted file mode 100644 index 5098236e8..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_SmallZipFrogtie.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_SmallZipFrogtie.png deleted file mode 100644 index a09aef7ca..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_SmallZipFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_SmallZipLegFull.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_SmallZipLegFull.png deleted file mode 100644 index ffa0ca7c5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_SmallZipLegFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_SmallZipLegMedium.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_SmallZipLegMedium.png deleted file mode 100644 index 5edaad9a8..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_SmallZipLegMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLarge.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLarge.png deleted file mode 100644 index 1210aec66..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLargeZipFrogtie.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLargeZipFrogtie.png deleted file mode 100644 index 12ba8e56e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLargeZipFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLargeZipLegFull.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLargeZipLegFull.png deleted file mode 100644 index 9450e6244..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLargeZipLegFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLargeZipLegMedium.png b/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLargeZipLegMedium.png deleted file mode 100644 index cf94d6615..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Kneel/Zipties_XLargeZipLegMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Large.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Large.png deleted file mode 100644 index a62a94e8c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Lock.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Lock.png deleted file mode 100644 index 90515928c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Normal.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Normal.png deleted file mode 100644 index b9dc12c3a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Small.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Small.png deleted file mode 100644 index 2d533d59c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_XLarge.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_XLarge.png deleted file mode 100644 index 108895415..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/FrogtieStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/FuturisticLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/FuturisticLegCuffs_Chain.png deleted file mode 100644 index c3b9d8d31..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/FuturisticLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_LargeFrogtie.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_LargeFrogtie.png deleted file mode 100644 index 3ae2538d5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_LargeFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_NormalFrogtie.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_NormalFrogtie.png deleted file mode 100644 index e442d8add..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_NormalFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_SmallFrogtie.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_SmallFrogtie.png deleted file mode 100644 index 4034f5807..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_SmallFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_XLargeFrogtie.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_XLargeFrogtie.png deleted file mode 100644 index 1bfb312d9..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/HempRope_XLargeFrogtie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Chain.png deleted file mode 100644 index 972d36dca..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Large_Cuffs.png deleted file mode 100644 index f2eb2ec83..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Large_Rings.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Large_Rings.png deleted file mode 100644 index 8efb0d309..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Lock.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Lock.png deleted file mode 100644 index a61e4e005..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Normal_Cuffs.png deleted file mode 100644 index 16d03d576..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Normal_Rings.png deleted file mode 100644 index 7b423c957..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Small_Cuffs.png deleted file mode 100644 index 31e47c315..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Small_Rings.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Small_Rings.png deleted file mode 100644 index 33970b7d0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_XLarge_Cuffs.png deleted file mode 100644 index 547bc6358..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_XLarge_Rings.png deleted file mode 100644 index a3406995d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/LeatherLegCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Large_FrogtieRope.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Large_FrogtieRope.png deleted file mode 100644 index 7b8122a02..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Large_FrogtieRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Large_FrogtieShine.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Large_FrogtieShine.png deleted file mode 100644 index 0a7a41d0e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Large_FrogtieShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Normal_FrogtieRope.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Normal_FrogtieRope.png deleted file mode 100644 index 65fc1eec3..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Normal_FrogtieRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Normal_FrogtieShine.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Normal_FrogtieShine.png deleted file mode 100644 index 08c52443d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Normal_FrogtieShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Small_FrogtieRope.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Small_FrogtieRope.png deleted file mode 100644 index 42a67efe4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Small_FrogtieRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Small_FrogtieShine.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Small_FrogtieShine.png deleted file mode 100644 index ee49934d5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_Small_FrogtieShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_XLarge_FrogtieRope.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_XLarge_FrogtieRope.png deleted file mode 100644 index 4f904a5ad..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_XLarge_FrogtieRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_XLarge_FrogtieShine.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_XLarge_FrogtieShine.png deleted file mode 100644 index ce85d2955..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/NylonRope_XLarge_FrogtieShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Chain.png deleted file mode 100644 index 972d36dca..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Large_Cuffs.png deleted file mode 100644 index e79a430a7..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Large_Gems.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Large_Gems.png deleted file mode 100644 index c5c998e9a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Lock.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Normal_Cuffs.png deleted file mode 100644 index 68ae8d8b0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Normal_Gems.png deleted file mode 100644 index a129e5394..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Small_Cuffs.png deleted file mode 100644 index 6da8ecdde..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Small_Gems.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Small_Gems.png deleted file mode 100644 index f1afb711d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_XLarge_Cuffs.png deleted file mode 100644 index 0371a05ca..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_XLarge_Gems.png deleted file mode 100644 index 5b6b501d7..000000000 Binary files a/Assets/Female3DCG/ItemLegs/KneelingSpread/OrnateLegCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherBelt_Large.png b/Assets/Female3DCG/ItemLegs/LeatherBelt_Large.png deleted file mode 100644 index f4b19d545..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherBelt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherBelt_Lock.png b/Assets/Female3DCG/ItemLegs/LeatherBelt_Lock.png deleted file mode 100644 index 2c47f9c75..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherBelt_Normal.png b/Assets/Female3DCG/ItemLegs/LeatherBelt_Normal.png deleted file mode 100644 index f16534fc2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherBelt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherBelt_Small.png b/Assets/Female3DCG/ItemLegs/LeatherBelt_Small.png deleted file mode 100644 index 081f1471f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherBelt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherBelt_XLarge.png b/Assets/Female3DCG/ItemLegs/LeatherBelt_XLarge.png deleted file mode 100644 index ddf6fac02..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherBelt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Chain.png deleted file mode 100644 index e27fae9f7..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Large_Cuffs.png deleted file mode 100644 index fc2af0a6c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Large_Rings.png b/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Large_Rings.png deleted file mode 100644 index 86a7be50a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Lock.png b/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Lock.png deleted file mode 100644 index b6163c4dd..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Normal_Cuffs.png deleted file mode 100644 index 2aa3b0977..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Normal_Rings.png deleted file mode 100644 index 0c5f8519b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Small_Cuffs.png deleted file mode 100644 index c5bd2ad91..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Small_Rings.png b/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Small_Rings.png deleted file mode 100644 index 3bb7d1a16..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_XLarge_Cuffs.png deleted file mode 100644 index 7acda47e7..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_XLarge_Rings.png deleted file mode 100644 index 4bae125b3..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LeatherLegCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegBinder_Large_Belts.png b/Assets/Female3DCG/ItemLegs/LegBinder_Large_Belts.png deleted file mode 100644 index cda7b790b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegBinder_Large_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegBinder_Large_Latex.png b/Assets/Female3DCG/ItemLegs/LegBinder_Large_Latex.png deleted file mode 100644 index 2e4ba096d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegBinder_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegBinder_Lock.png b/Assets/Female3DCG/ItemLegs/LegBinder_Lock.png deleted file mode 100644 index 8b933c3d6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegBinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegBinder_Normal_Belts.png b/Assets/Female3DCG/ItemLegs/LegBinder_Normal_Belts.png deleted file mode 100644 index c380c600a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegBinder_Normal_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegBinder_Normal_Latex.png b/Assets/Female3DCG/ItemLegs/LegBinder_Normal_Latex.png deleted file mode 100644 index 5c8778747..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegBinder_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegBinder_Small_Belts.png b/Assets/Female3DCG/ItemLegs/LegBinder_Small_Belts.png deleted file mode 100644 index f2dd43420..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegBinder_Small_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegBinder_Small_Latex.png b/Assets/Female3DCG/ItemLegs/LegBinder_Small_Latex.png deleted file mode 100644 index f5d28586f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegBinder_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegBinder_XLarge_Belts.png b/Assets/Female3DCG/ItemLegs/LegBinder_XLarge_Belts.png deleted file mode 100644 index 5b3b604ab..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegBinder_XLarge_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegBinder_XLarge_Latex.png b/Assets/Female3DCG/ItemLegs/LegBinder_XLarge_Latex.png deleted file mode 100644 index 7dabf0a39..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegBinder_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Chain.png deleted file mode 100644 index 6661b7cc2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Display.png b/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Display.png deleted file mode 100644 index 4588a5e25..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Large_Cuffs.png deleted file mode 100644 index c6e2b83cc..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Lock.png b/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Lock.png deleted file mode 100644 index 2a920532c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Normal_Cuffs.png deleted file mode 100644 index 3f3a96308..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Small_Cuffs.png deleted file mode 100644 index 7f6ad6f0b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_XLarge_Cuffs.png deleted file mode 100644 index 24cbb3554..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/FuturisticLegCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Chain.png deleted file mode 100644 index 6661b7cc2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Large_Cuffs.png deleted file mode 100644 index c0a162569..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Large_Rings.png b/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Large_Rings.png deleted file mode 100644 index 818958ff2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Large_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Lock.png b/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Lock.png deleted file mode 100644 index 93e7cfe74..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Normal_Cuffs.png deleted file mode 100644 index eccab27e3..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Normal_Rings.png b/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Normal_Rings.png deleted file mode 100644 index 41c09a225..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Normal_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Small_Cuffs.png deleted file mode 100644 index 7379bbc5f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Small_Rings.png b/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Small_Rings.png deleted file mode 100644 index 34f1e678e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_Small_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_XLarge_Cuffs.png deleted file mode 100644 index cd5e09da7..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_XLarge_Rings.png b/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_XLarge_Rings.png deleted file mode 100644 index ec5401753..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/LeatherLegCuffs_XLarge_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Chain.png deleted file mode 100644 index 6661b7cc2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Large_Cuffs.png deleted file mode 100644 index c254dfe8a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Large_Gems.png b/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Large_Gems.png deleted file mode 100644 index f8fb7c515..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Lock.png b/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Normal_Cuffs.png deleted file mode 100644 index 38ec099e4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Normal_Gems.png deleted file mode 100644 index 5af8919fb..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Small_Cuffs.png deleted file mode 100644 index 474e6b3e5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Small_Gems.png b/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Small_Gems.png deleted file mode 100644 index 46e07095d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_XLarge_Cuffs.png deleted file mode 100644 index 50d14c629..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_XLarge_Gems.png deleted file mode 100644 index 5432eb8fa..000000000 Binary files a/Assets/Female3DCG/ItemLegs/LegsClosed/OrnateLegCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Base.png b/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Base.png deleted file mode 100644 index 1d2c79c97..000000000 Binary files a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Large_Straps.png b/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Large_Straps.png deleted file mode 100644 index bb6b39276..000000000 Binary files a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Lock.png b/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Normal_Straps.png b/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Normal_Straps.png deleted file mode 100644 index 9c0395da6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Small_Straps.png b/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Small_Straps.png deleted file mode 100644 index fc69c1069..000000000 Binary files a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_XLarge_Straps.png b/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_XLarge_Straps.png deleted file mode 100644 index 9c16ae6b4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/MedicalBedRestraints_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/MermaidTail_Large.png b/Assets/Female3DCG/ItemLegs/MermaidTail_Large.png deleted file mode 100644 index 3499f25f3..000000000 Binary files a/Assets/Female3DCG/ItemLegs/MermaidTail_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/MermaidTail_Lock.png b/Assets/Female3DCG/ItemLegs/MermaidTail_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemLegs/MermaidTail_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/MermaidTail_Normal.png b/Assets/Female3DCG/ItemLegs/MermaidTail_Normal.png deleted file mode 100644 index db61b367d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/MermaidTail_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/MermaidTail_Small.png b/Assets/Female3DCG/ItemLegs/MermaidTail_Small.png deleted file mode 100644 index a058174cf..000000000 Binary files a/Assets/Female3DCG/ItemLegs/MermaidTail_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/MermaidTail_XLarge.png b/Assets/Female3DCG/ItemLegs/MermaidTail_XLarge.png deleted file mode 100644 index 1dd0d3409..000000000 Binary files a/Assets/Female3DCG/ItemLegs/MermaidTail_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Large_LowerRope.png b/Assets/Female3DCG/ItemLegs/NylonRope_Large_LowerRope.png deleted file mode 100644 index cdbd98374..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Large_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Large_LowerShine.png b/Assets/Female3DCG/ItemLegs/NylonRope_Large_LowerShine.png deleted file mode 100644 index d4cb288d0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Large_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Large_UpperRope.png b/Assets/Female3DCG/ItemLegs/NylonRope_Large_UpperRope.png deleted file mode 100644 index 3c1a31936..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Large_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Large_UpperShine.png b/Assets/Female3DCG/ItemLegs/NylonRope_Large_UpperShine.png deleted file mode 100644 index 137c40795..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Large_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Normal_LowerRope.png b/Assets/Female3DCG/ItemLegs/NylonRope_Normal_LowerRope.png deleted file mode 100644 index b538289a4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Normal_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Normal_LowerShine.png b/Assets/Female3DCG/ItemLegs/NylonRope_Normal_LowerShine.png deleted file mode 100644 index 1d8d1f53d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Normal_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Normal_UpperRope.png b/Assets/Female3DCG/ItemLegs/NylonRope_Normal_UpperRope.png deleted file mode 100644 index d940970da..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Normal_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Normal_UpperShine.png b/Assets/Female3DCG/ItemLegs/NylonRope_Normal_UpperShine.png deleted file mode 100644 index 6004b51b8..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Normal_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Small_LowerRope.png b/Assets/Female3DCG/ItemLegs/NylonRope_Small_LowerRope.png deleted file mode 100644 index 81268f22d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Small_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Small_LowerShine.png b/Assets/Female3DCG/ItemLegs/NylonRope_Small_LowerShine.png deleted file mode 100644 index 3bc48fbd2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Small_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Small_UpperRope.png b/Assets/Female3DCG/ItemLegs/NylonRope_Small_UpperRope.png deleted file mode 100644 index 7518c4450..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Small_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_Small_UpperShine.png b/Assets/Female3DCG/ItemLegs/NylonRope_Small_UpperShine.png deleted file mode 100644 index 44adc4de6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_Small_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_LowerRope.png b/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_LowerRope.png deleted file mode 100644 index d83dc9988..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_LowerRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_LowerShine.png b/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_LowerShine.png deleted file mode 100644 index 89ee0780b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_LowerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_UpperRope.png b/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_UpperRope.png deleted file mode 100644 index 3e9da5a2f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_UpperRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_UpperShine.png b/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_UpperShine.png deleted file mode 100644 index b103963e3..000000000 Binary files a/Assets/Female3DCG/ItemLegs/NylonRope_XLarge_UpperShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Chain.png b/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Chain.png deleted file mode 100644 index e27fae9f7..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Large_Cuffs.png b/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Large_Cuffs.png deleted file mode 100644 index 8e3995491..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Large_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Large_Gems.png b/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Large_Gems.png deleted file mode 100644 index 88c95b418..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Lock.png b/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Normal_Cuffs.png b/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Normal_Cuffs.png deleted file mode 100644 index cfdd8fd5e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Normal_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Normal_Gems.png b/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Normal_Gems.png deleted file mode 100644 index ceba0509b..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Small_Cuffs.png b/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Small_Cuffs.png deleted file mode 100644 index c2067c65c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Small_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Small_Gems.png b/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Small_Gems.png deleted file mode 100644 index 2d2e457ba..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_XLarge_Cuffs.png b/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_XLarge_Cuffs.png deleted file mode 100644 index 67a3d2fac..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_XLarge_Cuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_XLarge_Gems.png b/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_XLarge_Gems.png deleted file mode 100644 index 5d8a0f99d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OrnateLegCuffs_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_Large.png b/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_Large.png deleted file mode 100644 index fe084faae..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_Normal.png b/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_Normal.png deleted file mode 100644 index 9e2c42004..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_Small.png b/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_Small.png deleted file mode 100644 index 9ae1ddc28..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_XLarge.png b/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_XLarge.png deleted file mode 100644 index b1be17aa6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/OverTheHead/MermaidTail_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/PlasticWrap_Large.png b/Assets/Female3DCG/ItemLegs/PlasticWrap_Large.png deleted file mode 100644 index 2650c1184..000000000 Binary files a/Assets/Female3DCG/ItemLegs/PlasticWrap_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/PlasticWrap_Normal.png b/Assets/Female3DCG/ItemLegs/PlasticWrap_Normal.png deleted file mode 100644 index 2c9da729f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/PlasticWrap_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/PlasticWrap_Small.png b/Assets/Female3DCG/ItemLegs/PlasticWrap_Small.png deleted file mode 100644 index e132d87de..000000000 Binary files a/Assets/Female3DCG/ItemLegs/PlasticWrap_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/PlasticWrap_XLarge.png b/Assets/Female3DCG/ItemLegs/PlasticWrap_XLarge.png deleted file mode 100644 index 5e8b8adb4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/PlasticWrap_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/Chains.png b/Assets/Female3DCG/ItemLegs/Preview/Chains.png deleted file mode 100644 index 0617c1adb..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/DuctTape.png b/Assets/Female3DCG/ItemLegs/Preview/DuctTape.png deleted file mode 100644 index f86bb58bc..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/DuctTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/FrogtieStraps.png b/Assets/Female3DCG/ItemLegs/Preview/FrogtieStraps.png deleted file mode 100644 index 61b2457d1..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/FrogtieStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/FuturisticLegCuffs.png b/Assets/Female3DCG/ItemLegs/Preview/FuturisticLegCuffs.png deleted file mode 100644 index adb63442e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/FuturisticLegCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/HempRope.png b/Assets/Female3DCG/ItemLegs/Preview/HempRope.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/HempRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/HobbleSkirt.png b/Assets/Female3DCG/ItemLegs/Preview/HobbleSkirt.png deleted file mode 100644 index 219a5c7be..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/HobbleSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/LeatherBelt.png b/Assets/Female3DCG/ItemLegs/Preview/LeatherBelt.png deleted file mode 100644 index 087de8834..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/LeatherBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/LeatherLegCuffs.png b/Assets/Female3DCG/ItemLegs/Preview/LeatherLegCuffs.png deleted file mode 100644 index 59f4ca921..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/LeatherLegCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/LegBinder.png b/Assets/Female3DCG/ItemLegs/Preview/LegBinder.png deleted file mode 100644 index 3253e79bf..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/LegBinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/MedicalBedRestraints.png b/Assets/Female3DCG/ItemLegs/Preview/MedicalBedRestraints.png deleted file mode 100644 index 850e69161..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/MedicalBedRestraints.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/MermaidTail.png b/Assets/Female3DCG/ItemLegs/Preview/MermaidTail.png deleted file mode 100644 index 8ce69f3c9..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/MermaidTail.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/NylonRope.png b/Assets/Female3DCG/ItemLegs/Preview/NylonRope.png deleted file mode 100644 index d3c1fd4d2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/NylonRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/OrnateLegCuffs.png b/Assets/Female3DCG/ItemLegs/Preview/OrnateLegCuffs.png deleted file mode 100644 index 5e26fe2f7..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/OrnateLegCuffs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/PlasticWrap.png b/Assets/Female3DCG/ItemLegs/Preview/PlasticWrap.png deleted file mode 100644 index f559dac76..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/PlasticWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/Ribbons.png b/Assets/Female3DCG/ItemLegs/Preview/Ribbons.png deleted file mode 100644 index 7d3f73b67..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/Ribbons.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/SeamlessHobbleSkirt.png b/Assets/Female3DCG/ItemLegs/Preview/SeamlessHobbleSkirt.png deleted file mode 100644 index cbcaebed1..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/SeamlessHobbleSkirt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/SeamlessLegBinder.png b/Assets/Female3DCG/ItemLegs/Preview/SeamlessLegBinder.png deleted file mode 100644 index 5b88ba30f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/SeamlessLegBinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/Slime.png b/Assets/Female3DCG/ItemLegs/Preview/Slime.png deleted file mode 100644 index 2f1b835e0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/Slime.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/SturdyLeatherBelts.png b/Assets/Female3DCG/ItemLegs/Preview/SturdyLeatherBelts.png deleted file mode 100644 index 8f6dd41d4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/SturdyLeatherBelts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/Tentacles.png b/Assets/Female3DCG/ItemLegs/Preview/Tentacles.png deleted file mode 100644 index 510ea7c8a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/Tentacles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Preview/Zipties.png b/Assets/Female3DCG/ItemLegs/Preview/Zipties.png deleted file mode 100644 index 781403069..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Preview/Zipties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_Large.png b/Assets/Female3DCG/ItemLegs/Ribbons_Large.png deleted file mode 100644 index d4e78b041..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_LargeCross.png b/Assets/Female3DCG/ItemLegs/Ribbons_LargeCross.png deleted file mode 100644 index 0563d928c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_LargeCross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_LargeMessyWrap.png b/Assets/Female3DCG/ItemLegs/Ribbons_LargeMessyWrap.png deleted file mode 100644 index 963287a42..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_LargeMessyWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_Normal.png b/Assets/Female3DCG/ItemLegs/Ribbons_Normal.png deleted file mode 100644 index 17718e8ee..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_NormalCross.png b/Assets/Female3DCG/ItemLegs/Ribbons_NormalCross.png deleted file mode 100644 index d7a21b48a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_NormalCross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_NormalMessyWrap.png b/Assets/Female3DCG/ItemLegs/Ribbons_NormalMessyWrap.png deleted file mode 100644 index ab886fc5e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_NormalMessyWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_Small.png b/Assets/Female3DCG/ItemLegs/Ribbons_Small.png deleted file mode 100644 index 13eca31b0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_SmallCross.png b/Assets/Female3DCG/ItemLegs/Ribbons_SmallCross.png deleted file mode 100644 index 2856b0004..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_SmallCross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_SmallMessyWrap.png b/Assets/Female3DCG/ItemLegs/Ribbons_SmallMessyWrap.png deleted file mode 100644 index 0d6736f2e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_SmallMessyWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_XLarge.png b/Assets/Female3DCG/ItemLegs/Ribbons_XLarge.png deleted file mode 100644 index 8e2993301..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_XLargeCross.png b/Assets/Female3DCG/ItemLegs/Ribbons_XLargeCross.png deleted file mode 100644 index a0a6e3f15..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_XLargeCross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Ribbons_XLargeMessyWrap.png b/Assets/Female3DCG/ItemLegs/Ribbons_XLargeMessyWrap.png deleted file mode 100644 index df0882064..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Ribbons_XLargeMessyWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Large.png b/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Large.png deleted file mode 100644 index 28961c2ef..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Lock.png b/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Normal.png b/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Normal.png deleted file mode 100644 index 16740b6cc..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Small.png b/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Small.png deleted file mode 100644 index 575d6efd2..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_XLarge.png b/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_XLarge.png deleted file mode 100644 index 0c429e783..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SeamlessHobbleSkirt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Large.png b/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Large.png deleted file mode 100644 index eb811de76..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Lock.png b/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Lock.png deleted file mode 100644 index 195e57571..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Normal.png b/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Normal.png deleted file mode 100644 index 5c8778747..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Small.png b/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Small.png deleted file mode 100644 index f40a6de06..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_XLarge.png b/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_XLarge.png deleted file mode 100644 index 7dabf0a39..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SeamlessLegBinder_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Slime_One.png b/Assets/Female3DCG/ItemLegs/Slime_One.png deleted file mode 100644 index 990d94418..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Slime_One.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Slime_Two.png b/Assets/Female3DCG/ItemLegs/Slime_Two.png deleted file mode 100644 index 46f6aa25f..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Slime_Two.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBeltsTwo_Lock.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBeltsTwo_Lock.png deleted file mode 100644 index 40dc01365..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBeltsTwo_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_LowerBelt.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_LowerBelt.png deleted file mode 100644 index f492ccd31..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_LowerMetal.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_LowerMetal.png deleted file mode 100644 index 72422957d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_UpperBelt.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_UpperBelt.png deleted file mode 100644 index a6699ecc5..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_UpperMetal.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_UpperMetal.png deleted file mode 100644 index 4ba90b37a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Large_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Lock.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Lock.png deleted file mode 100644 index e97ff094d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_LowerBelt.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_LowerBelt.png deleted file mode 100644 index da6715c28..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_LowerMetal.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_LowerMetal.png deleted file mode 100644 index 82b7e4d88..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_UpperBelt.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_UpperBelt.png deleted file mode 100644 index 6f7b5f577..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_UpperMetal.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_UpperMetal.png deleted file mode 100644 index 63ec3f254..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Normal_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_LowerBelt.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_LowerBelt.png deleted file mode 100644 index 7934589dc..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_LowerMetal.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_LowerMetal.png deleted file mode 100644 index 7b4dd67f0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_UpperBelt.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_UpperBelt.png deleted file mode 100644 index b59add52d..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_UpperMetal.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_UpperMetal.png deleted file mode 100644 index 29588e3c0..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_Small_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_LowerBelt.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_LowerBelt.png deleted file mode 100644 index 9ba0a8d7c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_LowerBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_LowerMetal.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_LowerMetal.png deleted file mode 100644 index 253205126..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_LowerMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_UpperBelt.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_UpperBelt.png deleted file mode 100644 index be878cf09..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_UpperBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_UpperMetal.png b/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_UpperMetal.png deleted file mode 100644 index 64b20fe4a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/SturdyLeatherBelts_XLarge_UpperMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_Large.png b/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_Large.png deleted file mode 100644 index fe084faae..000000000 Binary files a/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_Normal.png b/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_Normal.png deleted file mode 100644 index 9e2c42004..000000000 Binary files a/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_Small.png b/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_Small.png deleted file mode 100644 index 9ae1ddc28..000000000 Binary files a/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_XLarge.png b/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_XLarge.png deleted file mode 100644 index b1be17aa6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/TapedHands/MermaidTail_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Large_Inner.png b/Assets/Female3DCG/ItemLegs/Tentacles_Large_Inner.png deleted file mode 100644 index bdf8da448..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Large_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Large_Outer.png b/Assets/Female3DCG/ItemLegs/Tentacles_Large_Outer.png deleted file mode 100644 index 2df08cb92..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Large_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Large_Shine.png b/Assets/Female3DCG/ItemLegs/Tentacles_Large_Shine.png deleted file mode 100644 index ae89ee990..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Large_Sucker.png b/Assets/Female3DCG/ItemLegs/Tentacles_Large_Sucker.png deleted file mode 100644 index 8e5c66edf..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Large_Sucker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Inner.png b/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Inner.png deleted file mode 100644 index 465779d76..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Outer.png b/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Outer.png deleted file mode 100644 index 96a1d7b27..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Shine.png b/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Shine.png deleted file mode 100644 index 36a78cf64..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Sucker.png b/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Sucker.png deleted file mode 100644 index 0302ba142..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Normal_Sucker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Small_Inner.png b/Assets/Female3DCG/ItemLegs/Tentacles_Small_Inner.png deleted file mode 100644 index d54c9dd64..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Small_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Small_Outer.png b/Assets/Female3DCG/ItemLegs/Tentacles_Small_Outer.png deleted file mode 100644 index a0b136d95..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Small_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Small_Shine.png b/Assets/Female3DCG/ItemLegs/Tentacles_Small_Shine.png deleted file mode 100644 index 74e930baa..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_Small_Sucker.png b/Assets/Female3DCG/ItemLegs/Tentacles_Small_Sucker.png deleted file mode 100644 index b35791deb..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_Small_Sucker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Inner.png b/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Inner.png deleted file mode 100644 index ce1bb3bb8..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Outer.png b/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Outer.png deleted file mode 100644 index 2e142c13a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Shine.png b/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Shine.png deleted file mode 100644 index b61e95536..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Sucker.png b/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Sucker.png deleted file mode 100644 index de974188e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Tentacles_XLarge_Sucker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_Large.png b/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_Large.png deleted file mode 100644 index fe084faae..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_Normal.png b/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_Normal.png deleted file mode 100644 index 9e2c42004..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_Small.png b/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_Small.png deleted file mode 100644 index 9ae1ddc28..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_XLarge.png b/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_XLarge.png deleted file mode 100644 index b1be17aa6..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Yoked/MermaidTail_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_Large.png b/Assets/Female3DCG/ItemLegs/Zipties_Large.png deleted file mode 100644 index cb9469495..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_LargeZipLegFull.png b/Assets/Female3DCG/ItemLegs/Zipties_LargeZipLegFull.png deleted file mode 100644 index e196c2c59..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_LargeZipLegFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_LargeZipLegMedium.png b/Assets/Female3DCG/ItemLegs/Zipties_LargeZipLegMedium.png deleted file mode 100644 index e230a214c..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_LargeZipLegMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_Normal.png b/Assets/Female3DCG/ItemLegs/Zipties_Normal.png deleted file mode 100644 index 04856fd92..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_NormalZipLegFull.png b/Assets/Female3DCG/ItemLegs/Zipties_NormalZipLegFull.png deleted file mode 100644 index cc2a48f79..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_NormalZipLegFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_NormalZipLegMedium.png b/Assets/Female3DCG/ItemLegs/Zipties_NormalZipLegMedium.png deleted file mode 100644 index 4b806280e..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_NormalZipLegMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_Small.png b/Assets/Female3DCG/ItemLegs/Zipties_Small.png deleted file mode 100644 index 8bb100e99..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_SmallZipLegFull.png b/Assets/Female3DCG/ItemLegs/Zipties_SmallZipLegFull.png deleted file mode 100644 index dd184827a..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_SmallZipLegFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_SmallZipLegMedium.png b/Assets/Female3DCG/ItemLegs/Zipties_SmallZipLegMedium.png deleted file mode 100644 index d045fb3dd..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_SmallZipLegMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_XLarge.png b/Assets/Female3DCG/ItemLegs/Zipties_XLarge.png deleted file mode 100644 index 5c942a451..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_XLargeZipLegFull.png b/Assets/Female3DCG/ItemLegs/Zipties_XLargeZipLegFull.png deleted file mode 100644 index e98796f89..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_XLargeZipLegFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemLegs/Zipties_XLargeZipLegMedium.png b/Assets/Female3DCG/ItemLegs/Zipties_XLargeZipLegMedium.png deleted file mode 100644 index f48dea6a4..000000000 Binary files a/Assets/Female3DCG/ItemLegs/Zipties_XLargeZipLegMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBear.png b/Assets/Female3DCG/ItemMisc/AllFours/TeddyBear.png deleted file mode 100644 index 70f8bc430..000000000 Binary files a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBear.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearBunny.png b/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearBunny.png deleted file mode 100644 index ba8772609..000000000 Binary files a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearBunny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearFox.png b/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearFox.png deleted file mode 100644 index 5c3cf5f24..000000000 Binary files a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearFox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearKitty.png b/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearKitty.png deleted file mode 100644 index f3ab32c48..000000000 Binary files a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearKitty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearPony.png b/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearPony.png deleted file mode 100644 index af33cd14b..000000000 Binary files a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearPony.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearPup.png b/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearPup.png deleted file mode 100644 index 78b771742..000000000 Binary files a/Assets/Female3DCG/ItemMisc/AllFours/TeddyBearPup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBear.png b/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBear.png deleted file mode 100644 index a20f65077..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBear.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearBunny.png b/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearBunny.png deleted file mode 100644 index 096ff2610..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearBunny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearFox.png b/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearFox.png deleted file mode 100644 index c31d32c50..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearFox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearKitty.png b/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearKitty.png deleted file mode 100644 index f9d31ea17..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearKitty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearPony.png b/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearPony.png deleted file mode 100644 index d739213ac..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearPony.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearPup.png b/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearPup.png deleted file mode 100644 index 03538c74f..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackBoxTie/TeddyBearPup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBear.png b/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBear.png deleted file mode 100644 index a20f65077..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBear.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearBunny.png b/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearBunny.png deleted file mode 100644 index 096ff2610..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearBunny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearFox.png b/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearFox.png deleted file mode 100644 index c31d32c50..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearFox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearKitty.png b/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearKitty.png deleted file mode 100644 index f9d31ea17..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearKitty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearPony.png b/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearPony.png deleted file mode 100644 index d739213ac..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearPony.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearPup.png b/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearPup.png deleted file mode 100644 index 03538c74f..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackCuffs/TeddyBearPup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBear.png b/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBear.png deleted file mode 100644 index a20f65077..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBear.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearBunny.png b/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearBunny.png deleted file mode 100644 index 096ff2610..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearBunny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearFox.png b/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearFox.png deleted file mode 100644 index c31d32c50..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearFox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearKitty.png b/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearKitty.png deleted file mode 100644 index f9d31ea17..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearKitty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearPony.png b/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearPony.png deleted file mode 100644 index d739213ac..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearPony.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearPup.png b/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearPup.png deleted file mode 100644 index 03538c74f..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BackElbowTouch/TeddyBearPup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BountySuitcase.png b/Assets/Female3DCG/ItemMisc/BountySuitcase.png deleted file mode 100644 index 974343f60..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BountySuitcase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/BountySuitcaseEmpty.png b/Assets/Female3DCG/ItemMisc/BountySuitcaseEmpty.png deleted file mode 100644 index 974343f60..000000000 Binary files a/Assets/Female3DCG/ItemMisc/BountySuitcaseEmpty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBear.png b/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBear.png deleted file mode 100644 index 70f8bc430..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBear.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearBunny.png b/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearBunny.png deleted file mode 100644 index ba8772609..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearBunny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearFox.png b/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearFox.png deleted file mode 100644 index 5c3cf5f24..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearFox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearKitty.png b/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearKitty.png deleted file mode 100644 index f3ab32c48..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearKitty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearPony.png b/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearPony.png deleted file mode 100644 index af33cd14b..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearPony.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearPup.png b/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearPup.png deleted file mode 100644 index 78b771742..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Hogtied/TeddyBearPup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/MilkCan.png b/Assets/Female3DCG/ItemMisc/MilkCan.png deleted file mode 100644 index 04e405912..000000000 Binary files a/Assets/Female3DCG/ItemMisc/MilkCan.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Orig/LoversPadlock.png b/Assets/Female3DCG/ItemMisc/Orig/LoversPadlock.png deleted file mode 100644 index ea229e507..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Orig/LoversPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Orig/LoversPadlockKey.png b/Assets/Female3DCG/ItemMisc/Orig/LoversPadlockKey.png deleted file mode 100644 index 82a4c4019..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Orig/LoversPadlockKey.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Orig/LoversPadlockKey_original.jpg b/Assets/Female3DCG/ItemMisc/Orig/LoversPadlockKey_original.jpg deleted file mode 100644 index fc47c88e3..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Orig/LoversPadlockKey_original.jpg and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Orig/LoversPadlock_original.jpg b/Assets/Female3DCG/ItemMisc/Orig/LoversPadlock_original.jpg deleted file mode 100644 index 878a84432..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Orig/LoversPadlock_original.jpg and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Orig/TeddyBear.png b/Assets/Female3DCG/ItemMisc/Orig/TeddyBear.png deleted file mode 100644 index e79614c32..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Orig/TeddyBear.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Orig/TeddyBearBunny.png b/Assets/Female3DCG/ItemMisc/Orig/TeddyBearBunny.png deleted file mode 100644 index d97eed6fc..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Orig/TeddyBearBunny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Orig/TeddyBearFox.png b/Assets/Female3DCG/ItemMisc/Orig/TeddyBearFox.png deleted file mode 100644 index fa10b63b1..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Orig/TeddyBearFox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Orig/TeddyBearKitty.png b/Assets/Female3DCG/ItemMisc/Orig/TeddyBearKitty.png deleted file mode 100644 index 7522c0f67..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Orig/TeddyBearKitty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Orig/TeddyBearPony.png b/Assets/Female3DCG/ItemMisc/Orig/TeddyBearPony.png deleted file mode 100644 index dd66c5ca3..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Orig/TeddyBearPony.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Orig/TeddyBearPup.png b/Assets/Female3DCG/ItemMisc/Orig/TeddyBearPup.png deleted file mode 100644 index 68e14e5b5..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Orig/TeddyBearPup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Orig/TimerPadlock.png b/Assets/Female3DCG/ItemMisc/Orig/TimerPadlock.png deleted file mode 100644 index a3a2360b1..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Orig/TimerPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBear.PNG b/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBear.PNG deleted file mode 100644 index a20f65077..000000000 Binary files a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBear.PNG and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearBunny.png b/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearBunny.png deleted file mode 100644 index 096ff2610..000000000 Binary files a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearBunny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearFox.png b/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearFox.png deleted file mode 100644 index c31d32c50..000000000 Binary files a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearFox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearKitty.png b/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearKitty.png deleted file mode 100644 index f9d31ea17..000000000 Binary files a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearKitty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearPony.png b/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearPony.png deleted file mode 100644 index d739213ac..000000000 Binary files a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearPony.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearPup.png b/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearPup.png deleted file mode 100644 index 03538c74f..000000000 Binary files a/Assets/Female3DCG/ItemMisc/OverTheHead/TeddyBearPup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/BountySuitcase.png b/Assets/Female3DCG/ItemMisc/Preview/BountySuitcase.png deleted file mode 100644 index 5b7ed737f..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/BountySuitcase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/BountySuitcaseEmpty.png b/Assets/Female3DCG/ItemMisc/Preview/BountySuitcaseEmpty.png deleted file mode 100644 index e08eccdfb..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/BountySuitcaseEmpty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/CombinationPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/CombinationPadlock.png deleted file mode 100644 index 1ab56d83b..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/CombinationPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/ExclusivePadlock.png b/Assets/Female3DCG/ItemMisc/Preview/ExclusivePadlock.png deleted file mode 100644 index a77843335..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/ExclusivePadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/HighSecurityPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/HighSecurityPadlock.png deleted file mode 100644 index 1ad01116d..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/HighSecurityPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/HighSecurityPadlockKey.png b/Assets/Female3DCG/ItemMisc/Preview/HighSecurityPadlockKey.png deleted file mode 100644 index f11d219cb..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/HighSecurityPadlockKey.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/IntricatePadlock.png b/Assets/Female3DCG/ItemMisc/Preview/IntricatePadlock.png deleted file mode 100644 index d32a1952b..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/IntricatePadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/IntricatePadlockKey.png b/Assets/Female3DCG/ItemMisc/Preview/IntricatePadlockKey.png deleted file mode 100644 index 1f4a67ba1..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/IntricatePadlockKey.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/Lockpicks.png b/Assets/Female3DCG/ItemMisc/Preview/Lockpicks.png deleted file mode 100644 index f5c1ef8ae..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/Lockpicks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/LoversPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/LoversPadlock.png deleted file mode 100644 index 97e29cdc5..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/LoversPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/LoversPadlockKey.png b/Assets/Female3DCG/ItemMisc/Preview/LoversPadlockKey.png deleted file mode 100644 index 38be3940c..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/LoversPadlockKey.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/LoversTimerPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/LoversTimerPadlock.png deleted file mode 100644 index a95c94097..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/LoversTimerPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/MetalCuffsKey.png b/Assets/Female3DCG/ItemMisc/Preview/MetalCuffsKey.png deleted file mode 100644 index 4e468ee60..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/MetalCuffsKey.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/MetalPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/MetalPadlock.png deleted file mode 100644 index 0055d1f35..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/MetalPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/MetalPadlockKey.png b/Assets/Female3DCG/ItemMisc/Preview/MetalPadlockKey.png deleted file mode 100644 index 51e4d45d9..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/MetalPadlockKey.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/MilkCan.png b/Assets/Female3DCG/ItemMisc/Preview/MilkCan.png deleted file mode 100644 index 51a88e6c9..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/MilkCan.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/MistressPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/MistressPadlock.png deleted file mode 100644 index c97950036..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/MistressPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/MistressPadlockKey.png b/Assets/Female3DCG/ItemMisc/Preview/MistressPadlockKey.png deleted file mode 100644 index 65077429a..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/MistressPadlockKey.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/MistressTimerPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/MistressTimerPadlock.png deleted file mode 100644 index 0283f2c35..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/MistressTimerPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/OwnerPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/OwnerPadlock.png deleted file mode 100644 index d093856c2..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/OwnerPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/OwnerPadlockKey.png b/Assets/Female3DCG/ItemMisc/Preview/OwnerPadlockKey.png deleted file mode 100644 index ed9d76b7b..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/OwnerPadlockKey.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/OwnerTimerPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/OwnerTimerPadlock.png deleted file mode 100644 index 13a53e2ac..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/OwnerTimerPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/PandoraPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/PandoraPadlock.png deleted file mode 100644 index bc69ae73b..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/PandoraPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/PandoraPadlockKey.png b/Assets/Female3DCG/ItemMisc/Preview/PandoraPadlockKey.png deleted file mode 100644 index e909b2520..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/PandoraPadlockKey.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/PasswordPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/PasswordPadlock.png deleted file mode 100644 index f6511b5fc..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/PasswordPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/SafewordPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/SafewordPadlock.png deleted file mode 100644 index 0534d2e6a..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/SafewordPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/ServingTray.png b/Assets/Female3DCG/ItemMisc/Preview/ServingTray.png deleted file mode 100644 index 766bc7de7..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/ServingTray.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/TeddyBear.png b/Assets/Female3DCG/ItemMisc/Preview/TeddyBear.png deleted file mode 100644 index ae113b68c..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/TeddyBear.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/TimerPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/TimerPadlock.png deleted file mode 100644 index 3896d42c6..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/TimerPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/TimerPasswordPadlock.png b/Assets/Female3DCG/ItemMisc/Preview/TimerPasswordPadlock.png deleted file mode 100644 index f5bf336a4..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/TimerPasswordPadlock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/WaterCell.png b/Assets/Female3DCG/ItemMisc/Preview/WaterCell.png deleted file mode 100644 index 1904abd87..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/WaterCell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/WoodenBox.png b/Assets/Female3DCG/ItemMisc/Preview/WoodenBox.png deleted file mode 100644 index d6e39b646..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/WoodenBox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/WoodenMaidTray.png b/Assets/Female3DCG/ItemMisc/Preview/WoodenMaidTray.png deleted file mode 100644 index 85d77c39a..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/WoodenMaidTray.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/WoodenMaidTrayFull.png b/Assets/Female3DCG/ItemMisc/Preview/WoodenMaidTrayFull.png deleted file mode 100644 index 766bc7de7..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/WoodenMaidTrayFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/WoodenPaddle.png b/Assets/Female3DCG/ItemMisc/Preview/WoodenPaddle.png deleted file mode 100644 index 64bf38d87..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/WoodenPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Preview/WoodenSign.png b/Assets/Female3DCG/ItemMisc/Preview/WoodenSign.png deleted file mode 100644 index 9d916fe78..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Preview/WoodenSign.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTray.png b/Assets/Female3DCG/ItemMisc/ServingTray.png deleted file mode 100644 index 775c617e9..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTray.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayCake_Details.png b/Assets/Female3DCG/ItemMisc/ServingTrayCake_Details.png deleted file mode 100644 index 078524ec5..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayCake_Details.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayCake_Objects.png b/Assets/Female3DCG/ItemMisc/ServingTrayCake_Objects.png deleted file mode 100644 index f6816a32d..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayCake_Objects.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayCake_Tray.png b/Assets/Female3DCG/ItemMisc/ServingTrayCake_Tray.png deleted file mode 100644 index 085f63482..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayCake_Tray.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayCookies_Objects.png b/Assets/Female3DCG/ItemMisc/ServingTrayCookies_Objects.png deleted file mode 100644 index 898196ac5..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayCookies_Objects.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayCookies_Tray.png b/Assets/Female3DCG/ItemMisc/ServingTrayCookies_Tray.png deleted file mode 100644 index e9e059784..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayCookies_Tray.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayDrinks_Details.png b/Assets/Female3DCG/ItemMisc/ServingTrayDrinks_Details.png deleted file mode 100644 index 827673bca..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayDrinks_Details.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayDrinks_Objects.png b/Assets/Female3DCG/ItemMisc/ServingTrayDrinks_Objects.png deleted file mode 100644 index b8e1bd31a..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayDrinks_Objects.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayDrinks_Tray.png b/Assets/Female3DCG/ItemMisc/ServingTrayDrinks_Tray.png deleted file mode 100644 index 56b9a4159..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayDrinks_Tray.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayFull.png b/Assets/Female3DCG/ItemMisc/ServingTrayFull.png deleted file mode 100644 index e2facb13d..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayToys_Details.png b/Assets/Female3DCG/ItemMisc/ServingTrayToys_Details.png deleted file mode 100644 index 4d6e1c1a4..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayToys_Details.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayToys_Objects.png b/Assets/Female3DCG/ItemMisc/ServingTrayToys_Objects.png deleted file mode 100644 index da46a3f6e..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayToys_Objects.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTrayToys_Tray.png b/Assets/Female3DCG/ItemMisc/ServingTrayToys_Tray.png deleted file mode 100644 index e9e059784..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTrayToys_Tray.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/ServingTray_Tray.png b/Assets/Female3DCG/ItemMisc/ServingTray_Tray.png deleted file mode 100644 index e9e059784..000000000 Binary files a/Assets/Female3DCG/ItemMisc/ServingTray_Tray.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Suspension/WoodenSign_Rope.png b/Assets/Female3DCG/ItemMisc/Suspension/WoodenSign_Rope.png deleted file mode 100644 index ed88024d2..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Suspension/WoodenSign_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Suspension/WoodenSign_Sign.png b/Assets/Female3DCG/ItemMisc/Suspension/WoodenSign_Sign.png deleted file mode 100644 index 2e9b46967..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Suspension/WoodenSign_Sign.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Suspension/WoodenSign_Text.png b/Assets/Female3DCG/ItemMisc/Suspension/WoodenSign_Text.png deleted file mode 100644 index fdf950d0d..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Suspension/WoodenSign_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBear.png b/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBear.png deleted file mode 100644 index a20f65077..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBear.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearBunny.png b/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearBunny.png deleted file mode 100644 index 096ff2610..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearBunny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearFox.png b/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearFox.png deleted file mode 100644 index c31d32c50..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearFox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearKitty.png b/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearKitty.png deleted file mode 100644 index f9d31ea17..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearKitty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearPony.png b/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearPony.png deleted file mode 100644 index d739213ac..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearPony.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearPup.png b/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearPup.png deleted file mode 100644 index 03538c74f..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TapedHands/TeddyBearPup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TeddyBear.png b/Assets/Female3DCG/ItemMisc/TeddyBear.png deleted file mode 100644 index e79614c32..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TeddyBear.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TeddyBearBunny.png b/Assets/Female3DCG/ItemMisc/TeddyBearBunny.png deleted file mode 100644 index d97eed6fc..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TeddyBearBunny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TeddyBearFox.png b/Assets/Female3DCG/ItemMisc/TeddyBearFox.png deleted file mode 100644 index fa10b63b1..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TeddyBearFox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TeddyBearKitty.png b/Assets/Female3DCG/ItemMisc/TeddyBearKitty.png deleted file mode 100644 index 7522c0f67..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TeddyBearKitty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TeddyBearPony.png b/Assets/Female3DCG/ItemMisc/TeddyBearPony.png deleted file mode 100644 index dd66c5ca3..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TeddyBearPony.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/TeddyBearPup.png b/Assets/Female3DCG/ItemMisc/TeddyBearPup.png deleted file mode 100644 index 68e14e5b5..000000000 Binary files a/Assets/Female3DCG/ItemMisc/TeddyBearPup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/WaterCell.png b/Assets/Female3DCG/ItemMisc/WaterCell.png deleted file mode 100644 index 8d199550e..000000000 Binary files a/Assets/Female3DCG/ItemMisc/WaterCell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/WoodenBox.png b/Assets/Female3DCG/ItemMisc/WoodenBox.png deleted file mode 100644 index a1d844e8d..000000000 Binary files a/Assets/Female3DCG/ItemMisc/WoodenBox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/WoodenMaidTray.png b/Assets/Female3DCG/ItemMisc/WoodenMaidTray.png deleted file mode 100644 index 775c617e9..000000000 Binary files a/Assets/Female3DCG/ItemMisc/WoodenMaidTray.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/WoodenMaidTrayFull.png b/Assets/Female3DCG/ItemMisc/WoodenMaidTrayFull.png deleted file mode 100644 index e2facb13d..000000000 Binary files a/Assets/Female3DCG/ItemMisc/WoodenMaidTrayFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/WoodenPaddle.png b/Assets/Female3DCG/ItemMisc/WoodenPaddle.png deleted file mode 100644 index f1f24c792..000000000 Binary files a/Assets/Female3DCG/ItemMisc/WoodenPaddle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/WoodenPaddleFull.png b/Assets/Female3DCG/ItemMisc/WoodenPaddleFull.png deleted file mode 100644 index e95db6e64..000000000 Binary files a/Assets/Female3DCG/ItemMisc/WoodenPaddleFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/WoodenSign_Rope.png b/Assets/Female3DCG/ItemMisc/WoodenSign_Rope.png deleted file mode 100644 index 3ff200b86..000000000 Binary files a/Assets/Female3DCG/ItemMisc/WoodenSign_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/WoodenSign_Sign.png b/Assets/Female3DCG/ItemMisc/WoodenSign_Sign.png deleted file mode 100644 index 4c380db0b..000000000 Binary files a/Assets/Female3DCG/ItemMisc/WoodenSign_Sign.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/WoodenSign_Text.png b/Assets/Female3DCG/ItemMisc/WoodenSign_Text.png deleted file mode 100644 index fdf950d0d..000000000 Binary files a/Assets/Female3DCG/ItemMisc/WoodenSign_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBear.PNG b/Assets/Female3DCG/ItemMisc/Yoked/TeddyBear.PNG deleted file mode 100644 index a20f65077..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBear.PNG and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearBunny.png b/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearBunny.png deleted file mode 100644 index 096ff2610..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearBunny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearFox.png b/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearFox.png deleted file mode 100644 index c31d32c50..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearFox.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearKitty.png b/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearKitty.png deleted file mode 100644 index f9d31ea17..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearKitty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearPony.png b/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearPony.png deleted file mode 100644 index d739213ac..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearPony.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearPup.png b/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearPup.png deleted file mode 100644 index 03538c74f..000000000 Binary files a/Assets/Female3DCG/ItemMisc/Yoked/TeddyBearPup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ahegao/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Ahegao/LatexSheathGag_Base.png deleted file mode 100644 index a7dfe0b0b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ahegao/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ahegao/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Ahegao/LatexSheathGag_Shine.png deleted file mode 100644 index da65f51db..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ahegao/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_Base.png deleted file mode 100644 index 48ad09adf..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_Lip.png deleted file mode 100644 index 30ddcdfff..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_LipShine.png deleted file mode 100644 index da275cd11..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_Shine.png deleted file mode 100644 index e69544fed..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ahegao/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_FakeMouth.png deleted file mode 100644 index ed24062bc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ahegao/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Angry/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Angry/LatexSheathGag_Base.png deleted file mode 100644 index 207f02d44..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Angry/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Angry/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Angry/LatexSheathGag_Shine.png deleted file mode 100644 index 56030ffd8..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Angry/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_Base.png deleted file mode 100644 index cc1b813df..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_Lip.png deleted file mode 100644 index d89d8c2be..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_LipShine.png deleted file mode 100644 index 714e63922..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_Shine.png deleted file mode 100644 index 3f8146cc3..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Angry/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Angry/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Angry/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Angry/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Angry/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Angry/Stitches_FakeMouth.png deleted file mode 100644 index 40f645d53..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Angry/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Angry/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Angry/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Angry/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Angry/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Angry/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Angry/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Angry/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Angry/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Angry/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BallGagMask_Ball.png b/Assets/Female3DCG/ItemMouth/BallGagMask_Ball.png deleted file mode 100644 index 66cf6fa08..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BallGagMask_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BallGagMask_Lock.png b/Assets/Female3DCG/ItemMouth/BallGagMask_Lock.png deleted file mode 100644 index b9cd5e4dc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BallGagMask_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BallGagMask_Strap.png b/Assets/Female3DCG/ItemMouth/BallGagMask_Strap.png deleted file mode 100644 index 25a9c3eb1..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BallGagMask_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BallGagShiny_Ball.png b/Assets/Female3DCG/ItemMouth/BallGagShiny_Ball.png deleted file mode 100644 index 858bb1d9a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BallGagShiny_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BallGagShiny_Lock.png b/Assets/Female3DCG/ItemMouth/BallGagShiny_Lock.png deleted file mode 100644 index f80a21ef6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BallGagShiny_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BallGagTight_Ball.png b/Assets/Female3DCG/ItemMouth/BallGagTight_Ball.png deleted file mode 100644 index 6fe88007c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BallGagTight_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BallGagTight_Lock.png b/Assets/Female3DCG/ItemMouth/BallGagTight_Lock.png deleted file mode 100644 index f80a21ef6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BallGagTight_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BallGag_Ball.png b/Assets/Female3DCG/ItemMouth/BallGag_Ball.png deleted file mode 100644 index 8ff3eb488..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BallGag_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BallGag_Lock.png b/Assets/Female3DCG/ItemMouth/BallGag_Lock.png deleted file mode 100644 index f80a21ef6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BallGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BallGag_Strap.png b/Assets/Female3DCG/ItemMouth/BallGag_Strap.png deleted file mode 100644 index b3fed773e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BallGag_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ball_Base.png b/Assets/Female3DCG/ItemMouth/Ball_Base.png deleted file mode 100644 index cef24435f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ball_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ball_Stripes.png b/Assets/Female3DCG/ItemMouth/Ball_Stripes.png deleted file mode 100644 index 4abf8be80..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ball_Stripes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BambooGag_Rod.png b/Assets/Female3DCG/ItemMouth/BambooGag_Rod.png deleted file mode 100644 index 37f9911e9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BambooGag_Rod.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BambooGag_Rope.png b/Assets/Female3DCG/ItemMouth/BambooGag_Rope.png deleted file mode 100644 index 670b3e4f8..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BambooGag_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BitGag_Bit.png b/Assets/Female3DCG/ItemMouth/BitGag_Bit.png deleted file mode 100644 index 41355da5b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BitGag_Bit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BitGag_Lock.png b/Assets/Female3DCG/ItemMouth/BitGag_Lock.png deleted file mode 100644 index 501a9f1f9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BitGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BitGag_Straps.png b/Assets/Female3DCG/ItemMouth/BitGag_Straps.png deleted file mode 100644 index 2ac2eaf60..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BitGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BoneGag_Bone.png b/Assets/Female3DCG/ItemMouth/BoneGag_Bone.png deleted file mode 100644 index e34f07921..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BoneGag_Bone.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BoneGag_Lock.png b/Assets/Female3DCG/ItemMouth/BoneGag_Lock.png deleted file mode 100644 index 5687426bf..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BoneGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/BoneGag_Straps.png b/Assets/Female3DCG/ItemMouth/BoneGag_Straps.png deleted file mode 100644 index 977db0c70..000000000 Binary files a/Assets/Female3DCG/ItemMouth/BoneGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CageMuzzle_Lock.png b/Assets/Female3DCG/ItemMouth/CageMuzzle_Lock.png deleted file mode 100644 index 26bb28045..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CageMuzzle_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CageMuzzle_Muzzle.png b/Assets/Female3DCG/ItemMouth/CageMuzzle_Muzzle.png deleted file mode 100644 index a1e3e049f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CageMuzzle_Muzzle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CageMuzzle_Strap.png b/Assets/Female3DCG/ItemMouth/CageMuzzle_Strap.png deleted file mode 100644 index 3b2bfa134..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CageMuzzle_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CaneGag_Cane.png b/Assets/Female3DCG/ItemMouth/CaneGag_Cane.png deleted file mode 100644 index 4f2486058..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CaneGag_Cane.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CaneGag_Mouth.png b/Assets/Female3DCG/ItemMouth/CaneGag_Mouth.png deleted file mode 100644 index b029b6f53..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CaneGag_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CarrotGag_Carrot.png b/Assets/Female3DCG/ItemMouth/CarrotGag_Carrot.png deleted file mode 100644 index d0a61f8cd..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CarrotGag_Carrot.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CarrotGag_Lock.png b/Assets/Female3DCG/ItemMouth/CarrotGag_Lock.png deleted file mode 100644 index f80a21ef6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CarrotGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CarrotGag_Straps.png b/Assets/Female3DCG/ItemMouth/CarrotGag_Straps.png deleted file mode 100644 index cae85788d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CarrotGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ChloroformCloth.png b/Assets/Female3DCG/ItemMouth/ChloroformCloth.png deleted file mode 100644 index 2efe76b36..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ChloroformCloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ChopstickGag_Chopsticks.png b/Assets/Female3DCG/ItemMouth/ChopstickGag_Chopsticks.png deleted file mode 100644 index 952948df0..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ChopstickGag_Chopsticks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ChopstickGag_Tongue.png b/Assets/Female3DCG/ItemMouth/ChopstickGag_Tongue.png deleted file mode 100644 index 4acd99a8a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ChopstickGag_Tongue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ClothGag.png b/Assets/Female3DCG/ItemMouth/ClothGag.png deleted file mode 100644 index 27420f637..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ClothGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ClothGagCleave.png b/Assets/Female3DCG/ItemMouth/ClothGagCleave.png deleted file mode 100644 index 84bba0730..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ClothGagCleave.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ClothGagKnotted.png b/Assets/Female3DCG/ItemMouth/ClothGagKnotted.png deleted file mode 100644 index 7626ca9fc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ClothGagKnotted.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ClothGagOTM.png b/Assets/Female3DCG/ItemMouth/ClothGagOTM.png deleted file mode 100644 index a61b89a01..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ClothGagOTM.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ClothGagOTN.png b/Assets/Female3DCG/ItemMouth/ClothGagOTN.png deleted file mode 100644 index 9b6a2bab1..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ClothGagOTN.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ClothStuffing_Cheeks.png b/Assets/Female3DCG/ItemMouth/ClothStuffing_Cheeks.png deleted file mode 100644 index 1d82951ea..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ClothStuffing_Cheeks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ClothStuffing_Cloth.png b/Assets/Female3DCG/ItemMouth/ClothStuffing_Cloth.png deleted file mode 100644 index e627be157..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ClothStuffing_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CropGag_Crop.png b/Assets/Female3DCG/ItemMouth/CropGag_Crop.png deleted file mode 100644 index 2b783946c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CropGag_Crop.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CropGag_Mouth.png b/Assets/Female3DCG/ItemMouth/CropGag_Mouth.png deleted file mode 100644 index b029b6f53..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CropGag_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CupholderGag_Cup.png b/Assets/Female3DCG/ItemMouth/CupholderGag_Cup.png deleted file mode 100644 index a2fd6b5c3..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CupholderGag_Cup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CupholderGag_Gag.png b/Assets/Female3DCG/ItemMouth/CupholderGag_Gag.png deleted file mode 100644 index 7c0f47c65..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CupholderGag_Gag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CupholderGag_Holder.png b/Assets/Female3DCG/ItemMouth/CupholderGag_Holder.png deleted file mode 100644 index 4787e2a83..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CupholderGag_Holder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/CupholderGag_Lock.png b/Assets/Female3DCG/ItemMouth/CupholderGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/CupholderGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DeepthroatGag.png b/Assets/Female3DCG/ItemMouth/DeepthroatGag.png deleted file mode 100644 index b74a464cb..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DeepthroatGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DeepthroatGag_Lock.png b/Assets/Female3DCG/ItemMouth/DeepthroatGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DeepthroatGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DentalGagClosed_Gag.png b/Assets/Female3DCG/ItemMouth/DentalGagClosed_Gag.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DentalGagClosed_Gag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DentalGagClosed_Lock.png b/Assets/Female3DCG/ItemMouth/DentalGagClosed_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DentalGagClosed_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DentalGagClosed_Mouth.png b/Assets/Female3DCG/ItemMouth/DentalGagClosed_Mouth.png deleted file mode 100644 index 28c252edb..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DentalGagClosed_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DentalGag_Gag.png b/Assets/Female3DCG/ItemMouth/DentalGag_Gag.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DentalGag_Gag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DentalGag_Lock.png b/Assets/Female3DCG/ItemMouth/DentalGag_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DentalGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DentalGag_Mouth.png b/Assets/Female3DCG/ItemMouth/DentalGag_Mouth.png deleted file mode 100644 index 55a910130..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DentalGag_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Devious/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Devious/LatexSheathGag_Base.png deleted file mode 100644 index fb84e7e4d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Devious/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Devious/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Devious/LatexSheathGag_Shine.png deleted file mode 100644 index c10d4b33e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Devious/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_Base.png deleted file mode 100644 index 777679483..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_Lip.png deleted file mode 100644 index fa66b1e38..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_LipShine.png deleted file mode 100644 index 1e1c14419..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_Shine.png deleted file mode 100644 index f619a4b62..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Devious/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Devious/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Devious/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Devious/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Devious/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Devious/Stitches_FakeMouth.png deleted file mode 100644 index ed24062bc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Devious/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Devious/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Devious/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Devious/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Devious/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Devious/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Devious/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Devious/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Devious/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Devious/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DildoGag_Dildo.png b/Assets/Female3DCG/ItemMouth/DildoGag_Dildo.png deleted file mode 100644 index 459820a3b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DildoGag_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DildoGag_Lock.png b/Assets/Female3DCG/ItemMouth/DildoGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DildoGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DildoGag_Strap.png b/Assets/Female3DCG/ItemMouth/DildoGag_Strap.png deleted file mode 100644 index a663794e2..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DildoGag_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DildoPlugGagPlug_Close.png b/Assets/Female3DCG/ItemMouth/DildoPlugGagPlug_Close.png deleted file mode 100644 index 25312cc9e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DildoPlugGagPlug_Close.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DildoPlugGagPlug_Lock.png b/Assets/Female3DCG/ItemMouth/DildoPlugGagPlug_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DildoPlugGagPlug_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DildoPlugGag_Lock.png b/Assets/Female3DCG/ItemMouth/DildoPlugGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DildoPlugGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DildoPlugGag_Strap.png b/Assets/Female3DCG/ItemMouth/DildoPlugGag_Strap.png deleted file mode 100644 index 199e4cbd0..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DildoPlugGag_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DildoPlugGag_Tongue.png b/Assets/Female3DCG/ItemMouth/DildoPlugGag_Tongue.png deleted file mode 100644 index 7a1ae2454..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DildoPlugGag_Tongue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DogMuzzleExposed.png b/Assets/Female3DCG/ItemMouth/DogMuzzleExposed.png deleted file mode 100644 index 444efe1ef..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DogMuzzleExposed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DogMuzzleExposed_Lock.png b/Assets/Female3DCG/ItemMouth/DogMuzzleExposed_Lock.png deleted file mode 100644 index fa9e50ec8..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DogMuzzleExposed_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DuctTape.png b/Assets/Female3DCG/ItemMouth/DuctTape.png deleted file mode 100644 index fd247fc01..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DuctTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DuctTapeCover.png b/Assets/Female3DCG/ItemMouth/DuctTapeCover.png deleted file mode 100644 index 9c6301195..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DuctTapeCover.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DuctTapeCrossed.png b/Assets/Female3DCG/ItemMouth/DuctTapeCrossed.png deleted file mode 100644 index b62f2c572..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DuctTapeCrossed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DuctTapeDouble.png b/Assets/Female3DCG/ItemMouth/DuctTapeDouble.png deleted file mode 100644 index dd8fb70ad..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DuctTapeDouble.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DuctTapeFull.png b/Assets/Female3DCG/ItemMouth/DuctTapeFull.png deleted file mode 100644 index 1bc2e995b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DuctTapeFull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DusterGag_Duster.png b/Assets/Female3DCG/ItemMouth/DusterGag_Duster.png deleted file mode 100644 index 9222e678d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DusterGag_Duster.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DusterGag_Lock.png b/Assets/Female3DCG/ItemMouth/DusterGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DusterGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/DusterGag_Panel.png b/Assets/Female3DCG/ItemMouth/DusterGag_Panel.png deleted file mode 100644 index fa325805e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/DusterGag_Panel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FoxyHarnessPanelGag_Lock.png b/Assets/Female3DCG/ItemMouth/FoxyHarnessPanelGag_Lock.png deleted file mode 100644 index 6bf46899b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FoxyHarnessPanelGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FoxyHarnessPanelGag_Panel.png b/Assets/Female3DCG/ItemMouth/FoxyHarnessPanelGag_Panel.png deleted file mode 100644 index acf5f99f0..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FoxyHarnessPanelGag_Panel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FoxyHarnessPanelGag_Straps.png b/Assets/Female3DCG/ItemMouth/FoxyHarnessPanelGag_Straps.png deleted file mode 100644 index 18e5ba02e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FoxyHarnessPanelGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Frown/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Frown/LatexSheathGag_Base.png deleted file mode 100644 index 8e8232117..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Frown/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Frown/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Frown/LatexSheathGag_Shine.png deleted file mode 100644 index 5a81c6679..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Frown/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_Base.png deleted file mode 100644 index 213ce209b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_Lip.png deleted file mode 100644 index 00c952f82..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_LipShine.png deleted file mode 100644 index c3e8d4c5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_Shine.png deleted file mode 100644 index 1e4515a6b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Frown/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Frown/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Frown/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Frown/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Frown/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Frown/Stitches_FakeMouth.png deleted file mode 100644 index 40f645d53..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Frown/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Frown/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Frown/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Frown/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Frown/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Frown/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Frown/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Frown/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Frown/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Frown/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FunnelGagFunnel_Funnel.png b/Assets/Female3DCG/ItemMouth/FunnelGagFunnel_Funnel.png deleted file mode 100644 index 3378b7243..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FunnelGagFunnel_Funnel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FunnelGag_Base.png b/Assets/Female3DCG/ItemMouth/FunnelGag_Base.png deleted file mode 100644 index 76a1bc585..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FunnelGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FunnelGag_Straps.png b/Assets/Female3DCG/ItemMouth/FunnelGag_Straps.png deleted file mode 100644 index f0ebf5e97..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FunnelGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FurScarf.png b/Assets/Female3DCG/ItemMouth/FurScarf.png deleted file mode 100644 index 4af32a3ed..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FurScarf.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag.png deleted file mode 100644 index c73bec9d2..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagBall_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagBall_Light.png deleted file mode 100644 index de0bec10d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagBall_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagBall_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagBall_Lock.png deleted file mode 100644 index d84bb0bc6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagBall_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagBlink_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagBlink_Light.png deleted file mode 100644 index e12f8ab2c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagBlink_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagLightBall_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagLightBall_Lock.png deleted file mode 100644 index 1f4d5d64c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagLightBall_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagPlug_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagPlug_Light.png deleted file mode 100644 index de0bec10d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagPlug_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagPlug_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagPlug_Lock.png deleted file mode 100644 index 7a84407a0..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGagPlug_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Ball.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Ball.png deleted file mode 100644 index 6f88404c1..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_BallHighlights.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_BallHighlights.png deleted file mode 100644 index a1a8f9c38..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_BallHighlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Light.png deleted file mode 100644 index de0bec10d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Lock.png deleted file mode 100644 index 1f4d5d64c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Mask.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Mask.png deleted file mode 100644 index 28716e96c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Straps.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Straps.png deleted file mode 100644 index ff004a31d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessBallGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag.png deleted file mode 100644 index 3f2396f48..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagBall_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagBall_Light.png deleted file mode 100644 index de0bec10d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagBall_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagBall_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagBall_Lock.png deleted file mode 100644 index ccbd7aca4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagBall_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagBlink_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagBlink_Light.png deleted file mode 100644 index e12f8ab2c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagBlink_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagLightBall_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagLightBall_Light.png deleted file mode 100644 index de0bec10d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagLightBall_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagLightBall_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagLightBall_Lock.png deleted file mode 100644 index 754edc2ca..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagLightBall_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagPlug_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagPlug_Light.png deleted file mode 100644 index de0bec10d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagPlug_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagPlug_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagPlug_Lock.png deleted file mode 100644 index e74b82af6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGagPlug_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Ball.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Ball.png deleted file mode 100644 index 25f60b9e4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Light.png deleted file mode 100644 index de0bec10d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Lock.png deleted file mode 100644 index 9f4ec348a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Mask.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Mask.png deleted file mode 100644 index d756fa3c3..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Straps.png b/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Straps.png deleted file mode 100644 index 861790ae3..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticHarnessPanelGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_IconLock.png b/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_IconLock.png deleted file mode 100644 index 2accc1000..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_IconLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_IconMute.png b/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_IconMute.png deleted file mode 100644 index 14cb6b3b4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_IconMute.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_IconX.png b/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_IconX.png deleted file mode 100644 index 6bcfc9c82..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_IconX.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_Mask.png b/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_Mask.png deleted file mode 100644 index 286d176e9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_Nose.png b/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_Nose.png deleted file mode 100644 index 4df7a5046..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_Nose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_Straps.png b/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_Straps.png deleted file mode 100644 index 224854ea3..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticMuzzle_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGag.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGag.png deleted file mode 100644 index eaf0c51ee..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagBall_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGagBall_Light.png deleted file mode 100644 index de0bec10d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagBall_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagBall_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGagBall_Lock.png deleted file mode 100644 index ccbd7aca4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagBall_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagBlink_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGagBlink_Light.png deleted file mode 100644 index e12f8ab2c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagBlink_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagLightBall_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGagLightBall_Light.png deleted file mode 100644 index de0bec10d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagLightBall_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagLightBall_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGagLightBall_Lock.png deleted file mode 100644 index 36e28ecfb..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagLightBall_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagPlug_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGagPlug_Light.png deleted file mode 100644 index de0bec10d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagPlug_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagPlug_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGagPlug_Lock.png deleted file mode 100644 index e74b82af6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGagPlug_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Ball.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Ball.png deleted file mode 100644 index 25f60b9e4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Light.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Light.png deleted file mode 100644 index de0bec10d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Lock.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Lock.png deleted file mode 100644 index 32249867e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Mask.png b/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Mask.png deleted file mode 100644 index d756fa3c3..000000000 Binary files a/Assets/Female3DCG/ItemMouth/FuturisticPanelGag_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/GasMaskGag_Highlights.png b/Assets/Female3DCG/ItemMouth/GasMaskGag_Highlights.png deleted file mode 100644 index dab5c7a88..000000000 Binary files a/Assets/Female3DCG/ItemMouth/GasMaskGag_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/GasMaskGag_Lock.png b/Assets/Female3DCG/ItemMouth/GasMaskGag_Lock.png deleted file mode 100644 index 7760e7784..000000000 Binary files a/Assets/Female3DCG/ItemMouth/GasMaskGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/GasMaskGag_Mask.png b/Assets/Female3DCG/ItemMouth/GasMaskGag_Mask.png deleted file mode 100644 index 41bb11b79..000000000 Binary files a/Assets/Female3DCG/ItemMouth/GasMaskGag_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/GasMaskGag_Sides.png b/Assets/Female3DCG/ItemMouth/GasMaskGag_Sides.png deleted file mode 100644 index 93b61e2cc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/GasMaskGag_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Grin/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Grin/LatexSheathGag_Base.png deleted file mode 100644 index 8e8232117..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Grin/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Grin/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Grin/LatexSheathGag_Shine.png deleted file mode 100644 index 5a81c6679..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Grin/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_Base.png deleted file mode 100644 index 298046f43..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_Lip.png deleted file mode 100644 index 14620b027..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_LipShine.png deleted file mode 100644 index 946477135..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_Shine.png deleted file mode 100644 index 3c143003b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Grin/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Grin/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Grin/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Grin/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Grin/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Grin/Stitches_FakeMouth.png deleted file mode 100644 index ed24062bc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Grin/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Grin/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Grin/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Grin/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Grin/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Grin/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Grin/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Grin/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Grin/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Grin/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HalfOpen/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/HalfOpen/LatexSheathGag_Base.png deleted file mode 100644 index c915ac596..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HalfOpen/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HalfOpen/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/HalfOpen/LatexSheathGag_Shine.png deleted file mode 100644 index 9d41c69d7..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HalfOpen/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_Base.png deleted file mode 100644 index 5bcb62e66..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_Lip.png deleted file mode 100644 index e01baab16..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_LipShine.png deleted file mode 100644 index abf9647fc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_Shine.png deleted file mode 100644 index 3ab896c97..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HalfOpen/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_FakeMouth.png deleted file mode 100644 index ed24062bc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HalfOpen/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Happy/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Happy/LatexSheathGag_Base.png deleted file mode 100644 index e70c5b299..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Happy/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Happy/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Happy/LatexSheathGag_Shine.png deleted file mode 100644 index d05d2b8dd..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Happy/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_Base.png deleted file mode 100644 index 363894c22..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_Lip.png deleted file mode 100644 index 2599ed4fb..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_LipShine.png deleted file mode 100644 index e5d551bfc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_Shine.png deleted file mode 100644 index 41a936e46..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Happy/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Happy/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Happy/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Happy/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Happy/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Happy/Stitches_FakeMouth.png deleted file mode 100644 index ed24062bc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Happy/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Happy/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Happy/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Happy/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Happy/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Happy/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Happy/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Happy/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Happy/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Happy/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessBallGag1_Ball.png b/Assets/Female3DCG/ItemMouth/HarnessBallGag1_Ball.png deleted file mode 100644 index e61b829f6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessBallGag1_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessBallGag1_Lock.png b/Assets/Female3DCG/ItemMouth/HarnessBallGag1_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessBallGag1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessBallGag1_Strap.png b/Assets/Female3DCG/ItemMouth/HarnessBallGag1_Strap.png deleted file mode 100644 index 56a4c06ee..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessBallGag1_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessBallGagShiny_Ball.png b/Assets/Female3DCG/ItemMouth/HarnessBallGagShiny_Ball.png deleted file mode 100644 index 858bb1d9a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessBallGagShiny_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessBallGagShiny_Lock.png b/Assets/Female3DCG/ItemMouth/HarnessBallGagShiny_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessBallGagShiny_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessBallGagTight_Ball.png b/Assets/Female3DCG/ItemMouth/HarnessBallGagTight_Ball.png deleted file mode 100644 index 6fe88007c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessBallGagTight_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessBallGagTight_Lock.png b/Assets/Female3DCG/ItemMouth/HarnessBallGagTight_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessBallGagTight_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessBallGag_Ball.png b/Assets/Female3DCG/ItemMouth/HarnessBallGag_Ball.png deleted file mode 100644 index 8ff3eb488..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessBallGag_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessBallGag_Harness.png b/Assets/Female3DCG/ItemMouth/HarnessBallGag_Harness.png deleted file mode 100644 index 7ac931d97..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessBallGag_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessBallGag_Lock.png b/Assets/Female3DCG/ItemMouth/HarnessBallGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessBallGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_Harness.png b/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_Harness.png deleted file mode 100644 index fd017fd2a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_Lock.png b/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_Metal.png b/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_Metal.png deleted file mode 100644 index db917c189..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_PacifierInner.png b/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_PacifierInner.png deleted file mode 100644 index 98df15363..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_PacifierInner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_PacifierOuter.png b/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_PacifierOuter.png deleted file mode 100644 index 1c35f6ccf..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPacifierGag_PacifierOuter.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Lock.png b/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Metal.png b/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Metal.png deleted file mode 100644 index 76e9e1057..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Panel.png b/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Panel.png deleted file mode 100644 index 83b25c74c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Panel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Straps.png b/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Straps.png deleted file mode 100644 index 11ca43511..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPanelGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPonyBitsDetached_Lock.png b/Assets/Female3DCG/ItemMouth/HarnessPonyBitsDetached_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPonyBitsDetached_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPonyBitsDetached_Metal.png b/Assets/Female3DCG/ItemMouth/HarnessPonyBitsDetached_Metal.png deleted file mode 100644 index cb62cf843..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPonyBitsDetached_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Bobble.png b/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Bobble.png deleted file mode 100644 index a44020ff5..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Bobble.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Lock.png b/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Metal.png b/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Metal.png deleted file mode 100644 index 5d94668e9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Straps.png b/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Straps.png deleted file mode 100644 index 4001688a9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HarnessPonyBits_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HookGagMask_Gag.png b/Assets/Female3DCG/ItemMouth/HookGagMask_Gag.png deleted file mode 100644 index d72d0da7b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HookGagMask_Gag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HookGagMask_Lock.png b/Assets/Female3DCG/ItemMouth/HookGagMask_Lock.png deleted file mode 100644 index 9a402208f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HookGagMask_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/HookGagMask_Mouth.png b/Assets/Female3DCG/ItemMouth/HookGagMask_Mouth.png deleted file mode 100644 index 9d7ea7da4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/HookGagMask_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyGag_Base.png b/Assets/Female3DCG/ItemMouth/KittyGag_Base.png deleted file mode 100644 index c5c990502..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyGag_Lines.png b/Assets/Female3DCG/ItemMouth/KittyGag_Lines.png deleted file mode 100644 index e115ab216..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyGag_Lines.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyGag_Mouth.png b/Assets/Female3DCG/ItemMouth/KittyGag_Mouth.png deleted file mode 100644 index 5967ca241..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyGag_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Lines.png b/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Lines.png deleted file mode 100644 index dfeff82e2..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Lines.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Lock.png b/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Mouth.png b/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Mouth.png deleted file mode 100644 index 03e695b52..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Panel.png b/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Panel.png deleted file mode 100644 index 016ab6477..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Panel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Straps.png b/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Straps.png deleted file mode 100644 index 20a4c5700..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyHarnessPanelGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Lines.png b/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Lines.png deleted file mode 100644 index 19a7e052a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Lines.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Mouth.png b/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Mouth.png deleted file mode 100644 index 2ab56c437..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Muzzle.png b/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Muzzle.png deleted file mode 100644 index 724fd402a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Muzzle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Straps.png b/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Straps.png deleted file mode 100644 index e4d4daccf..000000000 Binary files a/Assets/Female3DCG/ItemMouth/KittyMuzzleGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LargeDildo_Dildo.png b/Assets/Female3DCG/ItemMouth/LargeDildo_Dildo.png deleted file mode 100644 index 60f2c59ca..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LargeDildo_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LargeDildo_Lips.png b/Assets/Female3DCG/ItemMouth/LargeDildo_Lips.png deleted file mode 100644 index e808d4461..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LargeDildo_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LatexBallMuzzleGag.png b/Assets/Female3DCG/ItemMouth/LatexBallMuzzleGag.png deleted file mode 100644 index 3a690aef8..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LatexBallMuzzleGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LatexBallMuzzleGag_Lock.png b/Assets/Female3DCG/ItemMouth/LatexBallMuzzleGag_Lock.png deleted file mode 100644 index 4b2a21ddf..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LatexBallMuzzleGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LatexPostureCollar.png b/Assets/Female3DCG/ItemMouth/LatexPostureCollar.png deleted file mode 100644 index 3dce9cdf4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LatexPostureCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LatexPostureCollar_Lock.png b/Assets/Female3DCG/ItemMouth/LatexPostureCollar_Lock.png deleted file mode 100644 index a98832a06..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LatexPostureCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/LatexSheathGag_Base.png deleted file mode 100644 index ca871928b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/LatexSheathGag_Shine.png deleted file mode 100644 index b4c11c8ad..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Laughing/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Laughing/LatexSheathGag_Base.png deleted file mode 100644 index cb92f4e65..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Laughing/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Laughing/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Laughing/LatexSheathGag_Shine.png deleted file mode 100644 index 87b993e5b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Laughing/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_Base.png deleted file mode 100644 index 5d6a1607d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_Lip.png deleted file mode 100644 index 52b0a33fe..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_LipShine.png deleted file mode 100644 index 72189a89d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_Shine.png deleted file mode 100644 index 94c88d2a3..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Laughing/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Laughing/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Laughing/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Laughing/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Laughing/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Laughing/Stitches_FakeMouth.png deleted file mode 100644 index ed24062bc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Laughing/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Laughing/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Laughing/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Laughing/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Laughing/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Laughing/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Laughing/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Laughing/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Laughing/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Laughing/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LeatherCorsetCollar.png b/Assets/Female3DCG/ItemMouth/LeatherCorsetCollar.png deleted file mode 100644 index 1be31147e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LeatherCorsetCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LeatherCorsetCollar_Lock.png b/Assets/Female3DCG/ItemMouth/LeatherCorsetCollar_Lock.png deleted file mode 100644 index 4192ccea6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LeatherCorsetCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LewdGag.png b/Assets/Female3DCG/ItemMouth/LewdGag.png deleted file mode 100644 index a518d2079..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LewdGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LewdGag_Lock.png b/Assets/Female3DCG/ItemMouth/LewdGag_Lock.png deleted file mode 100644 index 4ebe39b2e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LewdGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipBite/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/LipBite/LatexSheathGag_Base.png deleted file mode 100644 index 386f1358a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipBite/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipBite/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/LipBite/LatexSheathGag_Shine.png deleted file mode 100644 index d2393a407..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipBite/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_Base.png deleted file mode 100644 index 9b6c83c30..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_Lip.png deleted file mode 100644 index 9066f5703..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_LipShine.png deleted file mode 100644 index 49199a430..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_Shine.png deleted file mode 100644 index 4a76f203c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipBite/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipBite/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/LipBite/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipBite/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipBite/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/LipBite/Stitches_FakeMouth.png deleted file mode 100644 index 40f645d53..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipBite/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipBite/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/LipBite/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipBite/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipBite/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/LipBite/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipBite/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipBite/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/LipBite/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipBite/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipGag_Lips.png b/Assets/Female3DCG/ItemMouth/LipGag_Lips.png deleted file mode 100644 index 6950aaa3d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipGag_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipGag_Lock.png b/Assets/Female3DCG/ItemMouth/LipGag_Lock.png deleted file mode 100644 index 778cb9626..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipGag_Mouth.png b/Assets/Female3DCG/ItemMouth/LipGag_Mouth.png deleted file mode 100644 index 82d09c615..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipGag_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipGag_Rings.png b/Assets/Female3DCG/ItemMouth/LipGag_Rings.png deleted file mode 100644 index 069d4a884..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipGag_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/LipGag_Straps.png b/Assets/Female3DCG/ItemMouth/LipGag_Straps.png deleted file mode 100644 index cbc31b14b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/LipGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MedicalMask_Inner.png b/Assets/Female3DCG/ItemMouth/MedicalMask_Inner.png deleted file mode 100644 index 24a319c2a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MedicalMask_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MedicalMask_Outer.png b/Assets/Female3DCG/ItemMouth/MedicalMask_Outer.png deleted file mode 100644 index 7a21de213..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MedicalMask_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MilkBottle.png b/Assets/Female3DCG/ItemMouth/MilkBottle.png deleted file mode 100644 index 2d75c7506..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MilkBottle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MilkBottleChug.png b/Assets/Female3DCG/ItemMouth/MilkBottleChug.png deleted file mode 100644 index 789602c48..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MilkBottleChug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MilkBottleRaised.png b/Assets/Female3DCG/ItemMouth/MilkBottleRaised.png deleted file mode 100644 index 5e3168154..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MilkBottleRaised.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Moan/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Moan/LatexSheathGag_Base.png deleted file mode 100644 index 02f85b241..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Moan/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Moan/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Moan/LatexSheathGag_Shine.png deleted file mode 100644 index e231495a8..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Moan/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_Base.png deleted file mode 100644 index b4718025f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_Lip.png deleted file mode 100644 index 57e8c0c82..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_LipShine.png deleted file mode 100644 index 637fbdd6f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_Shine.png deleted file mode 100644 index c55863310..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Moan/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Moan/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Moan/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Moan/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Moan/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Moan/Stitches_FakeMouth.png deleted file mode 100644 index 40f645d53..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Moan/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Moan/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Moan/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Moan/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Moan/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Moan/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Moan/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Moan/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Moan/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Moan/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Base.png deleted file mode 100644 index ec7cea2f8..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Lip.png deleted file mode 100644 index cd0a7f07e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/MouthFeatureGag_LipShine.png deleted file mode 100644 index c657746d0..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Panel.png b/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Panel.png deleted file mode 100644 index 8e7d41a54..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Panel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_PanelShine.png b/Assets/Female3DCG/ItemMouth/MouthFeatureGag_PanelShine.png deleted file mode 100644 index 4db5338ec..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_PanelShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Shine.png deleted file mode 100644 index bd565fc7e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MuzzleGag_Lock.png b/Assets/Female3DCG/ItemMouth/MuzzleGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MuzzleGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MuzzleGag_Muzzle.png b/Assets/Female3DCG/ItemMouth/MuzzleGag_Muzzle.png deleted file mode 100644 index 0b3477999..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MuzzleGag_Muzzle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/MuzzleGag_Straps.png b/Assets/Female3DCG/ItemMouth/MuzzleGag_Straps.png deleted file mode 100644 index 3954d65b2..000000000 Binary files a/Assets/Female3DCG/ItemMouth/MuzzleGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/OTNPlugGagPlug_Plug.png b/Assets/Female3DCG/ItemMouth/OTNPlugGagPlug_Plug.png deleted file mode 100644 index 6785249de..000000000 Binary files a/Assets/Female3DCG/ItemMouth/OTNPlugGagPlug_Plug.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/OTNPlugGag_Base.png b/Assets/Female3DCG/ItemMouth/OTNPlugGag_Base.png deleted file mode 100644 index 1d8e262ba..000000000 Binary files a/Assets/Female3DCG/ItemMouth/OTNPlugGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/OTNPlugGag_Metal.png b/Assets/Female3DCG/ItemMouth/OTNPlugGag_Metal.png deleted file mode 100644 index 9fa4686c4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/OTNPlugGag_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/OTNPlugGag_Straps.png b/Assets/Female3DCG/ItemMouth/OTNPlugGag_Straps.png deleted file mode 100644 index 9a20b0e0d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/OTNPlugGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/OTNPlugGag_Tongue.png b/Assets/Female3DCG/ItemMouth/OTNPlugGag_Tongue.png deleted file mode 100644 index 1916d9c32..000000000 Binary files a/Assets/Female3DCG/ItemMouth/OTNPlugGag_Tongue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Open/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Open/LatexSheathGag_Base.png deleted file mode 100644 index 127fde465..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Open/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Open/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Open/LatexSheathGag_Shine.png deleted file mode 100644 index 179562ee3..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Open/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_Base.png deleted file mode 100644 index f35c6d2be..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_Lip.png deleted file mode 100644 index 433b53f36..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_LipShine.png deleted file mode 100644 index 619c254ef..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_Shine.png deleted file mode 100644 index be9a4a809..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Open/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Open/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Open/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Open/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Open/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Open/Stitches_FakeMouth.png deleted file mode 100644 index 40f645d53..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Open/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Open/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Open/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Open/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Open/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Open/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Open/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Open/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Open/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Open/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PaciGag_Base.png b/Assets/Female3DCG/ItemMouth/PaciGag_Base.png deleted file mode 100644 index 68ba657f3..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PaciGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PaciGag_Metal.png b/Assets/Female3DCG/ItemMouth/PaciGag_Metal.png deleted file mode 100644 index c12500c1f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PaciGag_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PaciGag_Straps.png b/Assets/Female3DCG/ItemMouth/PaciGag_Straps.png deleted file mode 100644 index 8ad0877ed..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PaciGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PacifierGag.png b/Assets/Female3DCG/ItemMouth/PacifierGag.png deleted file mode 100644 index c162dd385..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PacifierGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pained/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Pained/LatexSheathGag_Base.png deleted file mode 100644 index 2ed5d87fd..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pained/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pained/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Pained/LatexSheathGag_Shine.png deleted file mode 100644 index 9cd6720d9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pained/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_Base.png deleted file mode 100644 index 2bf94f7cd..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_Lip.png deleted file mode 100644 index 056932e27..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_LipShine.png deleted file mode 100644 index 607e3e53f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_Shine.png deleted file mode 100644 index 92569f490..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pained/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pained/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Pained/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pained/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pained/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Pained/Stitches_FakeMouth.png deleted file mode 100644 index 40f645d53..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pained/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pained/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Pained/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pained/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pained/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Pained/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pained/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pained/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Pained/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pained/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PantiesMask_DarkStripes.png b/Assets/Female3DCG/ItemMouth/PantiesMask_DarkStripes.png deleted file mode 100644 index 4e26d5421..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PantiesMask_DarkStripes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PantiesMask_LightStripes.png b/Assets/Female3DCG/ItemMouth/PantiesMask_LightStripes.png deleted file mode 100644 index 2d49cb0c9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PantiesMask_LightStripes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PantyStuffing_Cloth.png b/Assets/Female3DCG/ItemMouth/PantyStuffing_Cloth.png deleted file mode 100644 index 65ad8b4ad..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PantyStuffing_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PantyStuffing_Lips.png b/Assets/Female3DCG/ItemMouth/PantyStuffing_Lips.png deleted file mode 100644 index 31cd3cb8c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PantyStuffing_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PlasticWrap.png b/Assets/Female3DCG/ItemMouth/PlasticWrap.png deleted file mode 100644 index 55ffceae4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PlasticWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PlugGagPlug_Close.png b/Assets/Female3DCG/ItemMouth/PlugGagPlug_Close.png deleted file mode 100644 index 54756fa95..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PlugGagPlug_Close.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PlugGagPlug_Lock.png b/Assets/Female3DCG/ItemMouth/PlugGagPlug_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PlugGagPlug_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PlugGag_Lock.png b/Assets/Female3DCG/ItemMouth/PlugGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PlugGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PlugGag_Strap.png b/Assets/Female3DCG/ItemMouth/PlugGag_Strap.png deleted file mode 100644 index f7922ac2f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PlugGag_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PlugGag_Tongue.png b/Assets/Female3DCG/ItemMouth/PlugGag_Tongue.png deleted file mode 100644 index 0eae25d18..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PlugGag_Tongue.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_BallLips.png b/Assets/Female3DCG/ItemMouth/PonyGag_BallLips.png deleted file mode 100644 index c311a8bef..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_BallLips.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_BallStraps.png b/Assets/Female3DCG/ItemMouth/PonyGag_BallStraps.png deleted file mode 100644 index f902b2401..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_BallStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Ballgag.png b/Assets/Female3DCG/ItemMouth/PonyGag_Ballgag.png deleted file mode 100644 index 231ed6c19..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Ballgag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_BaseMetal.png b/Assets/Female3DCG/ItemMouth/PonyGag_BaseMetal.png deleted file mode 100644 index 5167a7d32..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_BaseMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_BaseStraps.png b/Assets/Female3DCG/ItemMouth/PonyGag_BaseStraps.png deleted file mode 100644 index 4ab058ce8..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_BaseStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Bit.png b/Assets/Female3DCG/ItemMouth/PonyGag_Bit.png deleted file mode 100644 index 62040d06e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Bit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_BitDepressor.png b/Assets/Female3DCG/ItemMouth/PonyGag_BitDepressor.png deleted file mode 100644 index 439d0ed43..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_BitDepressor.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_BitLarge.png b/Assets/Female3DCG/ItemMouth/PonyGag_BitLarge.png deleted file mode 100644 index c3f9c0676..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_BitLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Blinders.png b/Assets/Female3DCG/ItemMouth/PonyGag_Blinders.png deleted file mode 100644 index defc2a51b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Blinders.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Dildo.png b/Assets/Female3DCG/ItemMouth/PonyGag_Dildo.png deleted file mode 100644 index deb4cfd18..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_DildoLips.png b/Assets/Female3DCG/ItemMouth/PonyGag_DildoLips.png deleted file mode 100644 index 64a035ece..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_DildoLips.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_DildoMetal.png b/Assets/Female3DCG/ItemMouth/PonyGag_DildoMetal.png deleted file mode 100644 index 62fb2e06f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_DildoMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_ExtraMetal.png b/Assets/Female3DCG/ItemMouth/PonyGag_ExtraMetal.png deleted file mode 100644 index 475afe054..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_ExtraMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_ExtraStraps.png b/Assets/Female3DCG/ItemMouth/PonyGag_ExtraStraps.png deleted file mode 100644 index 7980fffb0..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_ExtraStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_FlagPoles.png b/Assets/Female3DCG/ItemMouth/PonyGag_FlagPoles.png deleted file mode 100644 index e48cea6bf..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_FlagPoles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Flags.png b/Assets/Female3DCG/ItemMouth/PonyGag_Flags.png deleted file mode 100644 index af171a5ad..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Flags.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Horn.png b/Assets/Female3DCG/ItemMouth/PonyGag_Horn.png deleted file mode 100644 index 1886577f0..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Horn.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Horn2.png b/Assets/Female3DCG/ItemMouth/PonyGag_Horn2.png deleted file mode 100644 index 5654d2764..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Horn2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Horn2Shine.png b/Assets/Female3DCG/ItemMouth/PonyGag_Horn2Shine.png deleted file mode 100644 index 96383a077..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Horn2Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_HornShine.png b/Assets/Female3DCG/ItemMouth/PonyGag_HornShine.png deleted file mode 100644 index 7ed2de306..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_HornShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_ManeB.png b/Assets/Female3DCG/ItemMouth/PonyGag_ManeB.png deleted file mode 100644 index e257b0e51..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_ManeB.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_ManeL.png b/Assets/Female3DCG/ItemMouth/PonyGag_ManeL.png deleted file mode 100644 index 4b1b20610..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_ManeL.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_ManeLFront.png b/Assets/Female3DCG/ItemMouth/PonyGag_ManeLFront.png deleted file mode 100644 index ff8c8ff2c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_ManeLFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_ManeR.png b/Assets/Female3DCG/ItemMouth/PonyGag_ManeR.png deleted file mode 100644 index 906da7b81..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_ManeR.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_ManeRFront.png b/Assets/Female3DCG/ItemMouth/PonyGag_ManeRFront.png deleted file mode 100644 index d7d1e7200..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_ManeRFront.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Mohawk.png b/Assets/Female3DCG/ItemMouth/PonyGag_Mohawk.png deleted file mode 100644 index 678af55b7..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Mohawk.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_MohawkBase.png b/Assets/Female3DCG/ItemMouth/PonyGag_MohawkBase.png deleted file mode 100644 index 8226126d0..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_MohawkBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PanelBase.png b/Assets/Female3DCG/ItemMouth/PonyGag_PanelBase.png deleted file mode 100644 index a0469ef1f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PanelBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PanelHeart.png b/Assets/Female3DCG/ItemMouth/PonyGag_PanelHeart.png deleted file mode 100644 index b770a1f76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PanelHeart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PanelHex.png b/Assets/Female3DCG/ItemMouth/PonyGag_PanelHex.png deleted file mode 100644 index c8ac4f51f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PanelHex.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PanelHorse.png b/Assets/Female3DCG/ItemMouth/PonyGag_PanelHorse.png deleted file mode 100644 index 2ee3f5467..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PanelHorse.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PanelMoon.png b/Assets/Female3DCG/ItemMouth/PonyGag_PanelMoon.png deleted file mode 100644 index ec56c0151..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PanelMoon.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PanelPentacle.png b/Assets/Female3DCG/ItemMouth/PonyGag_PanelPentacle.png deleted file mode 100644 index 1f3ce7edf..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PanelPentacle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PanelShield.png b/Assets/Female3DCG/ItemMouth/PonyGag_PanelShield.png deleted file mode 100644 index 9df15133e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PanelShield.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PanelStuds.png b/Assets/Female3DCG/ItemMouth/PonyGag_PanelStuds.png deleted file mode 100644 index a7b8a17b6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PanelStuds.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PanelSun.png b/Assets/Female3DCG/ItemMouth/PonyGag_PanelSun.png deleted file mode 100644 index cbcc51b0e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PanelSun.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PanelTriskel.png b/Assets/Female3DCG/ItemMouth/PonyGag_PanelTriskel.png deleted file mode 100644 index b156ecc5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PanelTriskel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Plume.png b/Assets/Female3DCG/ItemMouth/PonyGag_Plume.png deleted file mode 100644 index f505349e9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Plume.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PlumeBase.png b/Assets/Female3DCG/ItemMouth/PonyGag_PlumeBase.png deleted file mode 100644 index 89c28218f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PlumeBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Post.png b/Assets/Female3DCG/ItemMouth/PonyGag_Post.png deleted file mode 100644 index cca9efdd5..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Post.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PostReins.png b/Assets/Female3DCG/ItemMouth/PonyGag_PostReins.png deleted file mode 100644 index df74a6395..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PostReins.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_PostReinsDetail.png b/Assets/Female3DCG/ItemMouth/PonyGag_PostReinsDetail.png deleted file mode 100644 index adcb843e1..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_PostReinsDetail.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Reins.png b/Assets/Female3DCG/ItemMouth/PonyGag_Reins.png deleted file mode 100644 index 01b3dcc48..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Reins.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PonyGag_Rope.png b/Assets/Female3DCG/ItemMouth/PonyGag_Rope.png deleted file mode 100644 index 0e6461d18..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PonyGag_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pout/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Pout/LatexSheathGag_Base.png deleted file mode 100644 index e1c244231..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pout/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pout/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Pout/LatexSheathGag_Shine.png deleted file mode 100644 index a6a5ded8b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pout/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_Base.png deleted file mode 100644 index 891a9dba3..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_Lip.png deleted file mode 100644 index 074b0f946..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_LipShine.png deleted file mode 100644 index 64e9a1317..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_Shine.png deleted file mode 100644 index 3a1f6a9b4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pout/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pout/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Pout/Stitches_Cross.png deleted file mode 100644 index e6074f025..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pout/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pout/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Pout/Stitches_FakeMouth.png deleted file mode 100644 index e6a1bc641..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pout/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pout/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Pout/Stitches_Skewed.png deleted file mode 100644 index 20ae61a3b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pout/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pout/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Pout/Stitches_Straight.png deleted file mode 100644 index d56c7414c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pout/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Pout/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Pout/Stitches_ZigZag.png deleted file mode 100644 index f37603572..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Pout/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/Ball.png b/Assets/Female3DCG/ItemMouth/Preview/Ball.png deleted file mode 100644 index dbb47cef6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/BallGag.png b/Assets/Female3DCG/ItemMouth/Preview/BallGag.png deleted file mode 100644 index c62fe52cf..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/BallGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/BallGagMask.png b/Assets/Female3DCG/ItemMouth/Preview/BallGagMask.png deleted file mode 100644 index 03dee204f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/BallGagMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/BambooGag.png b/Assets/Female3DCG/ItemMouth/Preview/BambooGag.png deleted file mode 100644 index 4707170eb..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/BambooGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/BitGag.png b/Assets/Female3DCG/ItemMouth/Preview/BitGag.png deleted file mode 100644 index 2a12765cd..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/BitGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/BoneGag.png b/Assets/Female3DCG/ItemMouth/Preview/BoneGag.png deleted file mode 100644 index a70160b9d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/BoneGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/CageMuzzle.png b/Assets/Female3DCG/ItemMouth/Preview/CageMuzzle.png deleted file mode 100644 index 117120f43..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/CageMuzzle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/CaneGag.png b/Assets/Female3DCG/ItemMouth/Preview/CaneGag.png deleted file mode 100644 index f49cddf40..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/CaneGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/CarrotGag.png b/Assets/Female3DCG/ItemMouth/Preview/CarrotGag.png deleted file mode 100644 index e3ade6b1c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/CarrotGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/ChloroformCloth.png b/Assets/Female3DCG/ItemMouth/Preview/ChloroformCloth.png deleted file mode 100644 index 2b3494da5..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/ChloroformCloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/ChopstickGag.png b/Assets/Female3DCG/ItemMouth/Preview/ChopstickGag.png deleted file mode 100644 index 29efc7001..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/ChopstickGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/ClothGag.png b/Assets/Female3DCG/ItemMouth/Preview/ClothGag.png deleted file mode 100644 index 3e0ae2acb..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/ClothGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/ClothStuffing.png b/Assets/Female3DCG/ItemMouth/Preview/ClothStuffing.png deleted file mode 100644 index 183977ca1..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/ClothStuffing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/CropGag.png b/Assets/Female3DCG/ItemMouth/Preview/CropGag.png deleted file mode 100644 index d4f35bff8..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/CropGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/CupholderGag.png b/Assets/Female3DCG/ItemMouth/Preview/CupholderGag.png deleted file mode 100644 index a1ec66b6c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/CupholderGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/DeepthroatGag.png b/Assets/Female3DCG/ItemMouth/Preview/DeepthroatGag.png deleted file mode 100644 index 8291a1548..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/DeepthroatGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/DentalGag.png b/Assets/Female3DCG/ItemMouth/Preview/DentalGag.png deleted file mode 100644 index ff5c16407..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/DentalGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/DildoGag.png b/Assets/Female3DCG/ItemMouth/Preview/DildoGag.png deleted file mode 100644 index 94ba7c060..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/DildoGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/DildoPlugGag.png b/Assets/Female3DCG/ItemMouth/Preview/DildoPlugGag.png deleted file mode 100644 index 879f3d80d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/DildoPlugGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/DogMuzzleExposed.png b/Assets/Female3DCG/ItemMouth/Preview/DogMuzzleExposed.png deleted file mode 100644 index a73dbeca9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/DogMuzzleExposed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/DuctTape.png b/Assets/Female3DCG/ItemMouth/Preview/DuctTape.png deleted file mode 100644 index f86bb58bc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/DuctTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/DusterGag.png b/Assets/Female3DCG/ItemMouth/Preview/DusterGag.png deleted file mode 100644 index 2f67aaeab..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/DusterGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/FoxyHarnessPanelGag.png b/Assets/Female3DCG/ItemMouth/Preview/FoxyHarnessPanelGag.png deleted file mode 100644 index c141b70d7..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/FoxyHarnessPanelGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/FunnelGag.png b/Assets/Female3DCG/ItemMouth/Preview/FunnelGag.png deleted file mode 100644 index e9de69118..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/FunnelGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/FurScarf.png b/Assets/Female3DCG/ItemMouth/Preview/FurScarf.png deleted file mode 100644 index e049066fe..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/FurScarf.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/FuturisticHarnessBallGag.png b/Assets/Female3DCG/ItemMouth/Preview/FuturisticHarnessBallGag.png deleted file mode 100644 index 818e634cb..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/FuturisticHarnessBallGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/FuturisticHarnessPanelGag.png b/Assets/Female3DCG/ItemMouth/Preview/FuturisticHarnessPanelGag.png deleted file mode 100644 index d95853763..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/FuturisticHarnessPanelGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/FuturisticMuzzle.png b/Assets/Female3DCG/ItemMouth/Preview/FuturisticMuzzle.png deleted file mode 100644 index ccb4e3538..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/FuturisticMuzzle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/FuturisticPanelGag.png b/Assets/Female3DCG/ItemMouth/Preview/FuturisticPanelGag.png deleted file mode 100644 index 35bfbab6d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/FuturisticPanelGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/GasMaskGag.png b/Assets/Female3DCG/ItemMouth/Preview/GasMaskGag.png deleted file mode 100644 index 6e0bfb454..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/GasMaskGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/HarnessBallGag.png b/Assets/Female3DCG/ItemMouth/Preview/HarnessBallGag.png deleted file mode 100644 index 3174f04cc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/HarnessBallGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/HarnessBallGag1.png b/Assets/Female3DCG/ItemMouth/Preview/HarnessBallGag1.png deleted file mode 100644 index da714887e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/HarnessBallGag1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/HarnessPacifierGag.png b/Assets/Female3DCG/ItemMouth/Preview/HarnessPacifierGag.png deleted file mode 100644 index ded6ed88e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/HarnessPacifierGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/HarnessPanelGag.png b/Assets/Female3DCG/ItemMouth/Preview/HarnessPanelGag.png deleted file mode 100644 index a5ecf7638..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/HarnessPanelGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/HarnessPonyBits.png b/Assets/Female3DCG/ItemMouth/Preview/HarnessPonyBits.png deleted file mode 100644 index 59a498f07..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/HarnessPonyBits.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/HookGagMask.png b/Assets/Female3DCG/ItemMouth/Preview/HookGagMask.png deleted file mode 100644 index a93c1a914..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/HookGagMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/KittyGag.png b/Assets/Female3DCG/ItemMouth/Preview/KittyGag.png deleted file mode 100644 index ccecfccc5..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/KittyGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/KittyHarnessPanelGag.png b/Assets/Female3DCG/ItemMouth/Preview/KittyHarnessPanelGag.png deleted file mode 100644 index e56afe6d4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/KittyHarnessPanelGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/KittyMuzzleGag.png b/Assets/Female3DCG/ItemMouth/Preview/KittyMuzzleGag.png deleted file mode 100644 index e2ddb8040..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/KittyMuzzleGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/LargeDildo.png b/Assets/Female3DCG/ItemMouth/Preview/LargeDildo.png deleted file mode 100644 index 34bfe2764..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/LargeDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/LatexBallMuzzleGag.png b/Assets/Female3DCG/ItemMouth/Preview/LatexBallMuzzleGag.png deleted file mode 100644 index 0cdf7de16..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/LatexBallMuzzleGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/LatexPostureCollar.png b/Assets/Female3DCG/ItemMouth/Preview/LatexPostureCollar.png deleted file mode 100644 index e3ba89227..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/LatexPostureCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/LatexSheathGag.png b/Assets/Female3DCG/ItemMouth/Preview/LatexSheathGag.png deleted file mode 100644 index c5365f02c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/LatexSheathGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/LeatherCorsetCollar.png b/Assets/Female3DCG/ItemMouth/Preview/LeatherCorsetCollar.png deleted file mode 100644 index 42636b87a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/LeatherCorsetCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/LewdGag.png b/Assets/Female3DCG/ItemMouth/Preview/LewdGag.png deleted file mode 100644 index d892561ab..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/LewdGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/LipGag.png b/Assets/Female3DCG/ItemMouth/Preview/LipGag.png deleted file mode 100644 index f1afadb2d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/LipGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/MedicalMask.png b/Assets/Female3DCG/ItemMouth/Preview/MedicalMask.png deleted file mode 100644 index db8106bc9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/MedicalMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/MilkBottle.png b/Assets/Female3DCG/ItemMouth/Preview/MilkBottle.png deleted file mode 100644 index 939c7fe6c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/MilkBottle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/MouthFeatureGag.png b/Assets/Female3DCG/ItemMouth/Preview/MouthFeatureGag.png deleted file mode 100644 index ae16504bd..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/MouthFeatureGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/MuzzleGag.png b/Assets/Female3DCG/ItemMouth/Preview/MuzzleGag.png deleted file mode 100644 index e53c8d4b7..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/MuzzleGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/OTNPlugGag.png b/Assets/Female3DCG/ItemMouth/Preview/OTNPlugGag.png deleted file mode 100644 index 4344dc754..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/OTNPlugGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/PaciGag.png b/Assets/Female3DCG/ItemMouth/Preview/PaciGag.png deleted file mode 100644 index 5f35dc748..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/PaciGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/PacifierGag.png b/Assets/Female3DCG/ItemMouth/Preview/PacifierGag.png deleted file mode 100644 index 0d73e112a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/PacifierGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/PantiesMask.png b/Assets/Female3DCG/ItemMouth/Preview/PantiesMask.png deleted file mode 100644 index 1246a5439..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/PantiesMask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/PantyStuffing.png b/Assets/Female3DCG/ItemMouth/Preview/PantyStuffing.png deleted file mode 100644 index c62aacc0b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/PantyStuffing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/PlasticWrap.png b/Assets/Female3DCG/ItemMouth/Preview/PlasticWrap.png deleted file mode 100644 index f559dac76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/PlasticWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/PlugGag.png b/Assets/Female3DCG/ItemMouth/Preview/PlugGag.png deleted file mode 100644 index bb0ed1792..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/PlugGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/PonyGag.png b/Assets/Female3DCG/ItemMouth/Preview/PonyGag.png deleted file mode 100644 index 73236ae0a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/PonyGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/PrisonLockdownGag.png b/Assets/Female3DCG/ItemMouth/Preview/PrisonLockdownGag.png deleted file mode 100644 index 64c07d596..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/PrisonLockdownGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/PumpGag.png b/Assets/Female3DCG/ItemMouth/Preview/PumpGag.png deleted file mode 100644 index 8b9d953ac..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/PumpGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/PumpkinGag.png b/Assets/Female3DCG/ItemMouth/Preview/PumpkinGag.png deleted file mode 100644 index eee73f581..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/PumpkinGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/RegressedMilk.png b/Assets/Female3DCG/ItemMouth/Preview/RegressedMilk.png deleted file mode 100644 index 961890f4f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/RegressedMilk.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/RegularSleepingPill.png b/Assets/Female3DCG/ItemMouth/Preview/RegularSleepingPill.png deleted file mode 100644 index 0ad44d88b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/RegularSleepingPill.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/Ribbons.png b/Assets/Female3DCG/ItemMouth/Preview/Ribbons.png deleted file mode 100644 index 7d3f73b67..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/Ribbons.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/RingGag.png b/Assets/Female3DCG/ItemMouth/Preview/RingGag.png deleted file mode 100644 index eb78da0d7..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/RingGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/RopeBallGag.png b/Assets/Female3DCG/ItemMouth/Preview/RopeBallGag.png deleted file mode 100644 index 638259743..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/RopeBallGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/RopeGag.png b/Assets/Female3DCG/ItemMouth/Preview/RopeGag.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/RopeGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/ScarfGag.png b/Assets/Female3DCG/ItemMouth/Preview/ScarfGag.png deleted file mode 100644 index ea58e9295..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/ScarfGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/ShoeGag.png b/Assets/Female3DCG/ItemMouth/Preview/ShoeGag.png deleted file mode 100644 index 8257eafd0..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/ShoeGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/Slime.png b/Assets/Female3DCG/ItemMouth/Preview/Slime.png deleted file mode 100644 index 2f1b835e0..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/Slime.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/SockStuffing.png b/Assets/Female3DCG/ItemMouth/Preview/SockStuffing.png deleted file mode 100644 index b75ae8f27..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/SockStuffing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/SpiderGag.png b/Assets/Female3DCG/ItemMouth/Preview/SpiderGag.png deleted file mode 100644 index d278f2760..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/SpiderGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/SteelMuzzleGag.png b/Assets/Female3DCG/ItemMouth/Preview/SteelMuzzleGag.png deleted file mode 100644 index b0946e7d2..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/SteelMuzzleGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/StitchedMuzzleGag.png b/Assets/Female3DCG/ItemMouth/Preview/StitchedMuzzleGag.png deleted file mode 100644 index 908678e00..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/StitchedMuzzleGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/Stitches.png b/Assets/Female3DCG/ItemMouth/Preview/Stitches.png deleted file mode 100644 index 6b829ac48..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/Stitches.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/Tentacles.png b/Assets/Female3DCG/ItemMouth/Preview/Tentacles.png deleted file mode 100644 index 510ea7c8a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/Tentacles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/TongueStrapGag.png b/Assets/Female3DCG/ItemMouth/Preview/TongueStrapGag.png deleted file mode 100644 index b7e81f4ed..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/TongueStrapGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/WebGag.png b/Assets/Female3DCG/ItemMouth/Preview/WebGag.png deleted file mode 100644 index 2245ac1f6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/WebGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/WiffleGag.png b/Assets/Female3DCG/ItemMouth/Preview/WiffleGag.png deleted file mode 100644 index 2219868c5..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/WiffleGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Preview/XLBoneGag.png b/Assets/Female3DCG/ItemMouth/Preview/XLBoneGag.png deleted file mode 100644 index a70160b9d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Preview/XLBoneGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Belts.png b/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Belts.png deleted file mode 100644 index ff7e0efcc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Belts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Lock.png b/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Mask.png b/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Mask.png deleted file mode 100644 index e9978ae6f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Straps.png b/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Straps.png deleted file mode 100644 index b93c47cea..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PrisonLockdownGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PumpGag.png b/Assets/Female3DCG/ItemMouth/PumpGag.png deleted file mode 100644 index 9870dbb7a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PumpGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PumpGag_Lock.png b/Assets/Female3DCG/ItemMouth/PumpGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PumpGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PumpkinGag_Lock.png b/Assets/Female3DCG/ItemMouth/PumpkinGag_Lock.png deleted file mode 100644 index 8aec4d8fc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PumpkinGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PumpkinGag_Pumpkin.png b/Assets/Female3DCG/ItemMouth/PumpkinGag_Pumpkin.png deleted file mode 100644 index 4db011eec..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PumpkinGag_Pumpkin.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PumpkinGag_Rings.png b/Assets/Female3DCG/ItemMouth/PumpkinGag_Rings.png deleted file mode 100644 index d186581ee..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PumpkinGag_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/PumpkinGag_Straps.png b/Assets/Female3DCG/ItemMouth/PumpkinGag_Straps.png deleted file mode 100644 index f59fbe504..000000000 Binary files a/Assets/Female3DCG/ItemMouth/PumpkinGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/RegularSleepingPill.png b/Assets/Female3DCG/ItemMouth/RegularSleepingPill.png deleted file mode 100644 index 0ad44d88b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/RegularSleepingPill.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Ribbons.png b/Assets/Female3DCG/ItemMouth/Ribbons.png deleted file mode 100644 index 56015615e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Ribbons.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/RibbonsBow.png b/Assets/Female3DCG/ItemMouth/RibbonsBow.png deleted file mode 100644 index 61b567489..000000000 Binary files a/Assets/Female3DCG/ItemMouth/RibbonsBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/RingGag.png b/Assets/Female3DCG/ItemMouth/RingGag.png deleted file mode 100644 index bbdb7348b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/RingGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/RingGag_Gag.png b/Assets/Female3DCG/ItemMouth/RingGag_Gag.png deleted file mode 100644 index a371a597b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/RingGag_Gag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/RingGag_Lock.png b/Assets/Female3DCG/ItemMouth/RingGag_Lock.png deleted file mode 100644 index dfd86ee74..000000000 Binary files a/Assets/Female3DCG/ItemMouth/RingGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/RingGag_Mouth.png b/Assets/Female3DCG/ItemMouth/RingGag_Mouth.png deleted file mode 100644 index 552d56dcf..000000000 Binary files a/Assets/Female3DCG/ItemMouth/RingGag_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/RopeBallGag.png b/Assets/Female3DCG/ItemMouth/RopeBallGag.png deleted file mode 100644 index 085021486..000000000 Binary files a/Assets/Female3DCG/ItemMouth/RopeBallGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/RopeBallGagTight.png b/Assets/Female3DCG/ItemMouth/RopeBallGagTight.png deleted file mode 100644 index 3dca75ed0..000000000 Binary files a/Assets/Female3DCG/ItemMouth/RopeBallGagTight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/RopeGag.png b/Assets/Female3DCG/ItemMouth/RopeGag.png deleted file mode 100644 index 558ffc169..000000000 Binary files a/Assets/Female3DCG/ItemMouth/RopeGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Sad/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Sad/LatexSheathGag_Base.png deleted file mode 100644 index b61b3019d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Sad/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Sad/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Sad/LatexSheathGag_Shine.png deleted file mode 100644 index cf6fbcd26..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Sad/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_Base.png deleted file mode 100644 index 073b31e2c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_Lip.png deleted file mode 100644 index 283be7284..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_LipShine.png deleted file mode 100644 index 189c2ca85..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_Shine.png deleted file mode 100644 index a4242d00b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Sad/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Sad/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Sad/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Sad/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Sad/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Sad/Stitches_FakeMouth.png deleted file mode 100644 index 40f645d53..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Sad/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Sad/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Sad/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Sad/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Sad/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Sad/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Sad/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Sad/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Sad/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Sad/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ScarfGag.png b/Assets/Female3DCG/ItemMouth/ScarfGag.png deleted file mode 100644 index fc2315318..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ScarfGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ScarfGagOTN.png b/Assets/Female3DCG/ItemMouth/ScarfGagOTN.png deleted file mode 100644 index 7af3dfb78..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ScarfGagOTN.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ShoeGag_Shoe.png b/Assets/Female3DCG/ItemMouth/ShoeGag_Shoe.png deleted file mode 100644 index 13d82b5e5..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ShoeGag_Shoe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/ShoeGag_Strap.png b/Assets/Female3DCG/ItemMouth/ShoeGag_Strap.png deleted file mode 100644 index 97540664f..000000000 Binary files a/Assets/Female3DCG/ItemMouth/ShoeGag_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Slime.png b/Assets/Female3DCG/ItemMouth/Slime.png deleted file mode 100644 index d59bf6fe1..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Slime.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Smirk/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/Smirk/LatexSheathGag_Base.png deleted file mode 100644 index 9024ec3e8..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Smirk/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Smirk/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/Smirk/LatexSheathGag_Shine.png deleted file mode 100644 index 5264ba042..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Smirk/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_Base.png deleted file mode 100644 index 3f4487900..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_Lip.png deleted file mode 100644 index 50c035902..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_LipShine.png deleted file mode 100644 index e3debf43b..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_Shine.png deleted file mode 100644 index 8b9b8fbef..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Smirk/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Smirk/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Smirk/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Smirk/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Smirk/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Smirk/Stitches_FakeMouth.png deleted file mode 100644 index ed24062bc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Smirk/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Smirk/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Smirk/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Smirk/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Smirk/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Smirk/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Smirk/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Smirk/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Smirk/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Smirk/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/SockStuffing_Cloth.png b/Assets/Female3DCG/ItemMouth/SockStuffing_Cloth.png deleted file mode 100644 index 65ad8b4ad..000000000 Binary files a/Assets/Female3DCG/ItemMouth/SockStuffing_Cloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/SockStuffing_Lips.png b/Assets/Female3DCG/ItemMouth/SockStuffing_Lips.png deleted file mode 100644 index 31cd3cb8c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/SockStuffing_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/SpiderGag_Gag.png b/Assets/Female3DCG/ItemMouth/SpiderGag_Gag.png deleted file mode 100644 index aaf5601e8..000000000 Binary files a/Assets/Female3DCG/ItemMouth/SpiderGag_Gag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/SpiderGag_Lock.png b/Assets/Female3DCG/ItemMouth/SpiderGag_Lock.png deleted file mode 100644 index a9e37f619..000000000 Binary files a/Assets/Female3DCG/ItemMouth/SpiderGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/SpiderGag_Mouth.png b/Assets/Female3DCG/ItemMouth/SpiderGag_Mouth.png deleted file mode 100644 index b027e0ed5..000000000 Binary files a/Assets/Female3DCG/ItemMouth/SpiderGag_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/SteelMuzzleGag.png b/Assets/Female3DCG/ItemMouth/SteelMuzzleGag.png deleted file mode 100644 index 5c37e1712..000000000 Binary files a/Assets/Female3DCG/ItemMouth/SteelMuzzleGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/SteelMuzzleGag_Lock.png b/Assets/Female3DCG/ItemMouth/SteelMuzzleGag_Lock.png deleted file mode 100644 index adde9cd0e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/SteelMuzzleGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/StitchedMuzzleGag.png b/Assets/Female3DCG/ItemMouth/StitchedMuzzleGag.png deleted file mode 100644 index 26cf7fe22..000000000 Binary files a/Assets/Female3DCG/ItemMouth/StitchedMuzzleGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/StitchedMuzzleGag_Lock.png b/Assets/Female3DCG/ItemMouth/StitchedMuzzleGag_Lock.png deleted file mode 100644 index c30e8fdbb..000000000 Binary files a/Assets/Female3DCG/ItemMouth/StitchedMuzzleGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/Stitches_FakeMouth.png deleted file mode 100644 index ed24062bc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Tentacles_Base.png b/Assets/Female3DCG/ItemMouth/Tentacles_Base.png deleted file mode 100644 index 2f2cd51bc..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Tentacles_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/Tentacles_Shine.png b/Assets/Female3DCG/ItemMouth/Tentacles_Shine.png deleted file mode 100644 index 5b446786c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/Tentacles_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TonguePinch/LatexSheathGag_Base.png b/Assets/Female3DCG/ItemMouth/TonguePinch/LatexSheathGag_Base.png deleted file mode 100644 index 75acc48a7..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TonguePinch/LatexSheathGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TonguePinch/LatexSheathGag_Shine.png b/Assets/Female3DCG/ItemMouth/TonguePinch/LatexSheathGag_Shine.png deleted file mode 100644 index ffa065c6e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TonguePinch/LatexSheathGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_Base.png b/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_Base.png deleted file mode 100644 index 6feda906d..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_Lip.png b/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_Lip.png deleted file mode 100644 index d8f8823bd..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_Lip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_LipShine.png b/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_LipShine.png deleted file mode 100644 index e94cdc0e4..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_LipShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_Shine.png b/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_Shine.png deleted file mode 100644 index 36cf86a6a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TonguePinch/MouthFeatureGag_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_Cross.png b/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_Cross.png deleted file mode 100644 index 298f4d285..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_FakeMouth.png b/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_FakeMouth.png deleted file mode 100644 index 40f645d53..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_FakeMouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_Skewed.png b/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_Skewed.png deleted file mode 100644 index 05805ed5c..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_Straight.png b/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_Straight.png deleted file mode 100644 index fd383bc76..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_ZigZag.png b/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_ZigZag.png deleted file mode 100644 index 6bc968b94..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TonguePinch/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TongueStrapGag_Gag.png b/Assets/Female3DCG/ItemMouth/TongueStrapGag_Gag.png deleted file mode 100644 index e5eb5148a..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TongueStrapGag_Gag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TongueStrapGag_Lock.png b/Assets/Female3DCG/ItemMouth/TongueStrapGag_Lock.png deleted file mode 100644 index a832a37fd..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TongueStrapGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/TongueStrapGag_Mouth.png b/Assets/Female3DCG/ItemMouth/TongueStrapGag_Mouth.png deleted file mode 100644 index a9a4741ec..000000000 Binary files a/Assets/Female3DCG/ItemMouth/TongueStrapGag_Mouth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/WebGag.png b/Assets/Female3DCG/ItemMouth/WebGag.png deleted file mode 100644 index fe7f78870..000000000 Binary files a/Assets/Female3DCG/ItemMouth/WebGag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/WiffleGagTight_Ball.png b/Assets/Female3DCG/ItemMouth/WiffleGagTight_Ball.png deleted file mode 100644 index 7aa2638fd..000000000 Binary files a/Assets/Female3DCG/ItemMouth/WiffleGagTight_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/WiffleGagTight_Lock.png b/Assets/Female3DCG/ItemMouth/WiffleGagTight_Lock.png deleted file mode 100644 index f80a21ef6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/WiffleGagTight_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/WiffleGag_Ball.png b/Assets/Female3DCG/ItemMouth/WiffleGag_Ball.png deleted file mode 100644 index 742723541..000000000 Binary files a/Assets/Female3DCG/ItemMouth/WiffleGag_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/WiffleGag_Lock.png b/Assets/Female3DCG/ItemMouth/WiffleGag_Lock.png deleted file mode 100644 index f80a21ef6..000000000 Binary files a/Assets/Female3DCG/ItemMouth/WiffleGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/WiffleGag_Strap.png b/Assets/Female3DCG/ItemMouth/WiffleGag_Strap.png deleted file mode 100644 index b3fed773e..000000000 Binary files a/Assets/Female3DCG/ItemMouth/WiffleGag_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/XLBoneGag_Bone.png b/Assets/Female3DCG/ItemMouth/XLBoneGag_Bone.png deleted file mode 100644 index 082895db9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/XLBoneGag_Bone.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/XLBoneGag_Lock.png b/Assets/Female3DCG/ItemMouth/XLBoneGag_Lock.png deleted file mode 100644 index 501a9f1f9..000000000 Binary files a/Assets/Female3DCG/ItemMouth/XLBoneGag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemMouth/XLBoneGag_Straps.png b/Assets/Female3DCG/ItemMouth/XLBoneGag_Straps.png deleted file mode 100644 index bbba63d24..000000000 Binary files a/Assets/Female3DCG/ItemMouth/XLBoneGag_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/AutoShockCollarBlink_Light.png b/Assets/Female3DCG/ItemNeck/AutoShockCollarBlink_Light.png deleted file mode 100644 index b96c8e1cc..000000000 Binary files a/Assets/Female3DCG/ItemNeck/AutoShockCollarBlink_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/AutoShockCollarBlink_Lock.png b/Assets/Female3DCG/ItemNeck/AutoShockCollarBlink_Lock.png deleted file mode 100644 index 317a745dc..000000000 Binary files a/Assets/Female3DCG/ItemNeck/AutoShockCollarBlink_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/AutoShockCollar_Collar.png b/Assets/Female3DCG/ItemNeck/AutoShockCollar_Collar.png deleted file mode 100644 index 6c0632665..000000000 Binary files a/Assets/Female3DCG/ItemNeck/AutoShockCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/AutoShockCollar_Lock.png b/Assets/Female3DCG/ItemNeck/AutoShockCollar_Lock.png deleted file mode 100644 index 317a745dc..000000000 Binary files a/Assets/Female3DCG/ItemNeck/AutoShockCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/BatCollar.png b/Assets/Female3DCG/ItemNeck/BatCollar.png deleted file mode 100644 index 7759436d3..000000000 Binary files a/Assets/Female3DCG/ItemNeck/BatCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/BatCollar_Lock.png b/Assets/Female3DCG/ItemNeck/BatCollar_Lock.png deleted file mode 100644 index cb96b2a9e..000000000 Binary files a/Assets/Female3DCG/ItemNeck/BatCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Base.png b/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Base.png deleted file mode 100644 index 31105866c..000000000 Binary files a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Bump.png b/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Bump.png deleted file mode 100644 index 0960e40dd..000000000 Binary files a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Bump.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Ring.png b/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Ring.png deleted file mode 100644 index 98471a208..000000000 Binary files a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_RingShadow.png b/Assets/Female3DCG/ItemNeck/BonedNeckCorset_RingShadow.png deleted file mode 100644 index 66452060f..000000000 Binary files a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_RingShadow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Shine.png b/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Shine.png deleted file mode 100644 index 0e42903b3..000000000 Binary files a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Stripes.png b/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Stripes.png deleted file mode 100644 index cdc331782..000000000 Binary files a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_Stripes.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_StripesShine.png b/Assets/Female3DCG/ItemNeck/BonedNeckCorset_StripesShine.png deleted file mode 100644 index 6549aaa74..000000000 Binary files a/Assets/Female3DCG/ItemNeck/BonedNeckCorset_StripesShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/BordelleCollar.png b/Assets/Female3DCG/ItemNeck/BordelleCollar.png deleted file mode 100644 index accf9c19c..000000000 Binary files a/Assets/Female3DCG/ItemNeck/BordelleCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/BordelleCollar_Lock.png b/Assets/Female3DCG/ItemNeck/BordelleCollar_Lock.png deleted file mode 100644 index 5890fc170..000000000 Binary files a/Assets/Female3DCG/ItemNeck/BordelleCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ClubSlaveCollar.png b/Assets/Female3DCG/ItemNeck/ClubSlaveCollar.png deleted file mode 100644 index f714b20a9..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ClubSlaveCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ComboHarnessShiny_Ball.png b/Assets/Female3DCG/ItemNeck/ComboHarnessShiny_Ball.png deleted file mode 100644 index 858bb1d9a..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ComboHarnessShiny_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ComboHarnessShiny_Lock.png b/Assets/Female3DCG/ItemNeck/ComboHarnessShiny_Lock.png deleted file mode 100644 index 54ba9e8d9..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ComboHarnessShiny_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ComboHarnessTight_Ball.png b/Assets/Female3DCG/ItemNeck/ComboHarnessTight_Ball.png deleted file mode 100644 index 6fe88007c..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ComboHarnessTight_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ComboHarnessTight_Lock.png b/Assets/Female3DCG/ItemNeck/ComboHarnessTight_Lock.png deleted file mode 100644 index b4b2599ba..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ComboHarnessTight_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ComboHarness_Ball.png b/Assets/Female3DCG/ItemNeck/ComboHarness_Ball.png deleted file mode 100644 index 8ff3eb488..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ComboHarness_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ComboHarness_Buckles.png b/Assets/Female3DCG/ItemNeck/ComboHarness_Buckles.png deleted file mode 100644 index ce7e8d2c0..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ComboHarness_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ComboHarness_Harness.png b/Assets/Female3DCG/ItemNeck/ComboHarness_Harness.png deleted file mode 100644 index e6b470687..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ComboHarness_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ComboHarness_Lock.png b/Assets/Female3DCG/ItemNeck/ComboHarness_Lock.png deleted file mode 100644 index bb1d89ddf..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ComboHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ComboHarness_Ring.png b/Assets/Female3DCG/ItemNeck/ComboHarness_Ring.png deleted file mode 100644 index 8496f8a89..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ComboHarness_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ComboHarness_Studs.png b/Assets/Female3DCG/ItemNeck/ComboHarness_Studs.png deleted file mode 100644 index 25e28c5b2..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ComboHarness_Studs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/DogCollar.png b/Assets/Female3DCG/ItemNeck/DogCollar.png deleted file mode 100644 index 624bb62ab..000000000 Binary files a/Assets/Female3DCG/ItemNeck/DogCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/DogCollar_Lock.png b/Assets/Female3DCG/ItemNeck/DogCollar_Lock.png deleted file mode 100644 index a4043c4e2..000000000 Binary files a/Assets/Female3DCG/ItemNeck/DogCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/FuturisticCollar_Band.png b/Assets/Female3DCG/ItemNeck/FuturisticCollar_Band.png deleted file mode 100644 index 8e6a2f5e3..000000000 Binary files a/Assets/Female3DCG/ItemNeck/FuturisticCollar_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/FuturisticCollar_Display.png b/Assets/Female3DCG/ItemNeck/FuturisticCollar_Display.png deleted file mode 100644 index 12af30193..000000000 Binary files a/Assets/Female3DCG/ItemNeck/FuturisticCollar_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/FuturisticCollar_Lock.png b/Assets/Female3DCG/ItemNeck/FuturisticCollar_Lock.png deleted file mode 100644 index ae760b92e..000000000 Binary files a/Assets/Female3DCG/ItemNeck/FuturisticCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/FuturisticCollar_Mesh.png b/Assets/Female3DCG/ItemNeck/FuturisticCollar_Mesh.png deleted file mode 100644 index c8d4066be..000000000 Binary files a/Assets/Female3DCG/ItemNeck/FuturisticCollar_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/GothicCollar_Collar.png b/Assets/Female3DCG/ItemNeck/GothicCollar_Collar.png deleted file mode 100644 index 4e21e72e4..000000000 Binary files a/Assets/Female3DCG/ItemNeck/GothicCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/GothicCollar_Flowers.png b/Assets/Female3DCG/ItemNeck/GothicCollar_Flowers.png deleted file mode 100644 index 3b1cf738e..000000000 Binary files a/Assets/Female3DCG/ItemNeck/GothicCollar_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/GothicCollar_Jewels.png b/Assets/Female3DCG/ItemNeck/GothicCollar_Jewels.png deleted file mode 100644 index 4638e874c..000000000 Binary files a/Assets/Female3DCG/ItemNeck/GothicCollar_Jewels.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/GothicCollar_Lock.png b/Assets/Female3DCG/ItemNeck/GothicCollar_Lock.png deleted file mode 100644 index 9a4924ca9..000000000 Binary files a/Assets/Female3DCG/ItemNeck/GothicCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/GothicCollar_Metal.png b/Assets/Female3DCG/ItemNeck/GothicCollar_Metal.png deleted file mode 100644 index 51032a2d1..000000000 Binary files a/Assets/Female3DCG/ItemNeck/GothicCollar_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/GothicCollar_Ornaments.png b/Assets/Female3DCG/ItemNeck/GothicCollar_Ornaments.png deleted file mode 100644 index 6d3fd17da..000000000 Binary files a/Assets/Female3DCG/ItemNeck/GothicCollar_Ornaments.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/HeartCollar.png b/Assets/Female3DCG/ItemNeck/HeartCollar.png deleted file mode 100644 index 3235b4c65..000000000 Binary files a/Assets/Female3DCG/ItemNeck/HeartCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/HeartCollar_Lock.png b/Assets/Female3DCG/ItemNeck/HeartCollar_Lock.png deleted file mode 100644 index 9d8380807..000000000 Binary files a/Assets/Female3DCG/ItemNeck/HeartCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/HeartLinkChoker.png b/Assets/Female3DCG/ItemNeck/HeartLinkChoker.png deleted file mode 100644 index 71b7132b7..000000000 Binary files a/Assets/Female3DCG/ItemNeck/HeartLinkChoker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/HeartLinkChoker_HeartLink.png b/Assets/Female3DCG/ItemNeck/HeartLinkChoker_HeartLink.png deleted file mode 100644 index c7d2e35e3..000000000 Binary files a/Assets/Female3DCG/ItemNeck/HeartLinkChoker_HeartLink.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/HeartLinkChoker_LeatherStrap.png b/Assets/Female3DCG/ItemNeck/HeartLinkChoker_LeatherStrap.png deleted file mode 100644 index 040db86ca..000000000 Binary files a/Assets/Female3DCG/ItemNeck/HeartLinkChoker_LeatherStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/HeartLinkChoker_Lock.png b/Assets/Female3DCG/ItemNeck/HeartLinkChoker_Lock.png deleted file mode 100644 index 5e9df662d..000000000 Binary files a/Assets/Female3DCG/ItemNeck/HeartLinkChoker_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/HighCollar_Leather.png b/Assets/Female3DCG/ItemNeck/HighCollar_Leather.png deleted file mode 100644 index ffa5c4fd5..000000000 Binary files a/Assets/Female3DCG/ItemNeck/HighCollar_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/HighCollar_Lock.png b/Assets/Female3DCG/ItemNeck/HighCollar_Lock.png deleted file mode 100644 index 76b0ddf7e..000000000 Binary files a/Assets/Female3DCG/ItemNeck/HighCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/HighCollar_Rings.png b/Assets/Female3DCG/ItemNeck/HighCollar_Rings.png deleted file mode 100644 index dff39a78d..000000000 Binary files a/Assets/Female3DCG/ItemNeck/HighCollar_Rings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/HighSecurityCollar.png b/Assets/Female3DCG/ItemNeck/HighSecurityCollar.png deleted file mode 100644 index 5d51a617b..000000000 Binary files a/Assets/Female3DCG/ItemNeck/HighSecurityCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/HighSecurityCollar_Lock.png b/Assets/Female3DCG/ItemNeck/HighSecurityCollar_Lock.png deleted file mode 100644 index 99f98f4c4..000000000 Binary files a/Assets/Female3DCG/ItemNeck/HighSecurityCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LatexCollar1.png b/Assets/Female3DCG/ItemNeck/LatexCollar1.png deleted file mode 100644 index d035b4d9b..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LatexCollar1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LatexCollar2.png b/Assets/Female3DCG/ItemNeck/LatexCollar2.png deleted file mode 100644 index 3ce54e30a..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LatexCollar2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LatexCollar2_Lock.png b/Assets/Female3DCG/ItemNeck/LatexCollar2_Lock.png deleted file mode 100644 index 478af0860..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LatexCollar2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LatexPostureCollar.png b/Assets/Female3DCG/ItemNeck/LatexPostureCollar.png deleted file mode 100644 index d4b49ba34..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LatexPostureCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LatexPostureCollar_Lock.png b/Assets/Female3DCG/ItemNeck/LatexPostureCollar_Lock.png deleted file mode 100644 index 66c49765b..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LatexPostureCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherChoker.png b/Assets/Female3DCG/ItemNeck/LeatherChoker.png deleted file mode 100644 index 3d4a02495..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherChoker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherChoker_Leather.png b/Assets/Female3DCG/ItemNeck/LeatherChoker_Leather.png deleted file mode 100644 index 52926e45c..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherChoker_Leather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherChoker_Lock.png b/Assets/Female3DCG/ItemNeck/LeatherChoker_Lock.png deleted file mode 100644 index 0c2296878..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherChoker_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherChoker_Metal.png b/Assets/Female3DCG/ItemNeck/LeatherChoker_Metal.png deleted file mode 100644 index f426c8d21..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherChoker_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherCollarBell.png b/Assets/Female3DCG/ItemNeck/LeatherCollarBell.png deleted file mode 100644 index 444075d78..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherCollarBell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherCollarBell_Lock.png b/Assets/Female3DCG/ItemNeck/LeatherCollarBell_Lock.png deleted file mode 100644 index ff7840d30..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherCollarBell_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherCollarBow.png b/Assets/Female3DCG/ItemNeck/LeatherCollarBow.png deleted file mode 100644 index b3903c9b6..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherCollarBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherCollarBow_Lock.png b/Assets/Female3DCG/ItemNeck/LeatherCollarBow_Lock.png deleted file mode 100644 index 790142478..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherCollarBow_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherCollar_Collar.png b/Assets/Female3DCG/ItemNeck/LeatherCollar_Collar.png deleted file mode 100644 index 245e2111c..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherCollar_Lock.png b/Assets/Female3DCG/ItemNeck/LeatherCollar_Lock.png deleted file mode 100644 index 203e34dd3..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherCollar_Ring.png b/Assets/Female3DCG/ItemNeck/LeatherCollar_Ring.png deleted file mode 100644 index 2e7ffea68..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherCollar_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherCorsetCollar.png b/Assets/Female3DCG/ItemNeck/LeatherCorsetCollar.png deleted file mode 100644 index 35cd0a532..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherCorsetCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LeatherCorsetCollar_Lock.png b/Assets/Female3DCG/ItemNeck/LeatherCorsetCollar_Lock.png deleted file mode 100644 index 8f5489f9b..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LeatherCorsetCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LoveLeatherCollar.png b/Assets/Female3DCG/ItemNeck/LoveLeatherCollar.png deleted file mode 100644 index 5617a3474..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LoveLeatherCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/LoveLeatherCollar_Lock.png b/Assets/Female3DCG/ItemNeck/LoveLeatherCollar_Lock.png deleted file mode 100644 index feef0c1fe..000000000 Binary files a/Assets/Female3DCG/ItemNeck/LoveLeatherCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/MaidCollar_Brooch.png b/Assets/Female3DCG/ItemNeck/MaidCollar_Brooch.png deleted file mode 100644 index 507d6791d..000000000 Binary files a/Assets/Female3DCG/ItemNeck/MaidCollar_Brooch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/MaidCollar_Collar.png b/Assets/Female3DCG/ItemNeck/MaidCollar_Collar.png deleted file mode 100644 index e4742d2b9..000000000 Binary files a/Assets/Female3DCG/ItemNeck/MaidCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/MaidCollar_Frills.png b/Assets/Female3DCG/ItemNeck/MaidCollar_Frills.png deleted file mode 100644 index d27edf51e..000000000 Binary files a/Assets/Female3DCG/ItemNeck/MaidCollar_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/MaidCollar_Lock.png b/Assets/Female3DCG/ItemNeck/MaidCollar_Lock.png deleted file mode 100644 index 2268e7f89..000000000 Binary files a/Assets/Female3DCG/ItemNeck/MaidCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/NeckRope.png b/Assets/Female3DCG/ItemNeck/NeckRope.png deleted file mode 100644 index 96984fb33..000000000 Binary files a/Assets/Female3DCG/ItemNeck/NeckRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/NobleCorsetCollar.png b/Assets/Female3DCG/ItemNeck/NobleCorsetCollar.png deleted file mode 100644 index fbe46ad32..000000000 Binary files a/Assets/Female3DCG/ItemNeck/NobleCorsetCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/NobleCorsetCollar_Lock.png b/Assets/Female3DCG/ItemNeck/NobleCorsetCollar_Lock.png deleted file mode 100644 index f640c6b1a..000000000 Binary files a/Assets/Female3DCG/ItemNeck/NobleCorsetCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/NylonCollar.png b/Assets/Female3DCG/ItemNeck/NylonCollar.png deleted file mode 100644 index 1a62e32ab..000000000 Binary files a/Assets/Female3DCG/ItemNeck/NylonCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/NylonCollar_Lock.png b/Assets/Female3DCG/ItemNeck/NylonCollar_Lock.png deleted file mode 100644 index 4f9376a5f..000000000 Binary files a/Assets/Female3DCG/ItemNeck/NylonCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/OrnateCollar_Collar.png b/Assets/Female3DCG/ItemNeck/OrnateCollar_Collar.png deleted file mode 100644 index 9d6e2f509..000000000 Binary files a/Assets/Female3DCG/ItemNeck/OrnateCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/OrnateCollar_Gem.png b/Assets/Female3DCG/ItemNeck/OrnateCollar_Gem.png deleted file mode 100644 index 4f60b8dfc..000000000 Binary files a/Assets/Female3DCG/ItemNeck/OrnateCollar_Gem.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/OrnateCollar_Lock.png b/Assets/Female3DCG/ItemNeck/OrnateCollar_Lock.png deleted file mode 100644 index 063be683f..000000000 Binary files a/Assets/Female3DCG/ItemNeck/OrnateCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/PetCollar.png b/Assets/Female3DCG/ItemNeck/PetCollar.png deleted file mode 100644 index 5a6b8259d..000000000 Binary files a/Assets/Female3DCG/ItemNeck/PetCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/PetCollar_Lock.png b/Assets/Female3DCG/ItemNeck/PetCollar_Lock.png deleted file mode 100644 index f3b8d49a7..000000000 Binary files a/Assets/Female3DCG/ItemNeck/PetCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/PostureCollar_Collar.png b/Assets/Female3DCG/ItemNeck/PostureCollar_Collar.png deleted file mode 100644 index 2dfbcef63..000000000 Binary files a/Assets/Female3DCG/ItemNeck/PostureCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/PostureCollar_Lock.png b/Assets/Female3DCG/ItemNeck/PostureCollar_Lock.png deleted file mode 100644 index 0dc93df1d..000000000 Binary files a/Assets/Female3DCG/ItemNeck/PostureCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/PostureCollar_Ring1.png b/Assets/Female3DCG/ItemNeck/PostureCollar_Ring1.png deleted file mode 100644 index 473ebebb5..000000000 Binary files a/Assets/Female3DCG/ItemNeck/PostureCollar_Ring1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/PostureCollar_Ring2.png b/Assets/Female3DCG/ItemNeck/PostureCollar_Ring2.png deleted file mode 100644 index e120cf6cb..000000000 Binary files a/Assets/Female3DCG/ItemNeck/PostureCollar_Ring2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/PostureCollar_Ring3.png b/Assets/Female3DCG/ItemNeck/PostureCollar_Ring3.png deleted file mode 100644 index 1759ff46d..000000000 Binary files a/Assets/Female3DCG/ItemNeck/PostureCollar_Ring3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/AutoShockCollar.png b/Assets/Female3DCG/ItemNeck/Preview/AutoShockCollar.png deleted file mode 100644 index f2a6889ce..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/AutoShockCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/BatCollar.png b/Assets/Female3DCG/ItemNeck/Preview/BatCollar.png deleted file mode 100644 index 7d259c057..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/BatCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/BonedNeckCorset.png b/Assets/Female3DCG/ItemNeck/Preview/BonedNeckCorset.png deleted file mode 100644 index ce8938b5b..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/BonedNeckCorset.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/BordelleCollar.png b/Assets/Female3DCG/ItemNeck/Preview/BordelleCollar.png deleted file mode 100644 index 88b97969e..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/BordelleCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/ClubSlaveCollar.png b/Assets/Female3DCG/ItemNeck/Preview/ClubSlaveCollar.png deleted file mode 100644 index 2e79a56f2..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/ClubSlaveCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/ComboHarness.png b/Assets/Female3DCG/ItemNeck/Preview/ComboHarness.png deleted file mode 100644 index 26826d45d..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/ComboHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/DogCollar.png b/Assets/Female3DCG/ItemNeck/Preview/DogCollar.png deleted file mode 100644 index b69c3098a..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/DogCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/FuturisticCollar.png b/Assets/Female3DCG/ItemNeck/Preview/FuturisticCollar.png deleted file mode 100644 index 7001b55a0..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/FuturisticCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/GothicCollar.png b/Assets/Female3DCG/ItemNeck/Preview/GothicCollar.png deleted file mode 100644 index 9fa0a74f4..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/GothicCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/HeartCollar.png b/Assets/Female3DCG/ItemNeck/Preview/HeartCollar.png deleted file mode 100644 index 74e1bb7dd..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/HeartCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/HeartLinkChoker.png b/Assets/Female3DCG/ItemNeck/Preview/HeartLinkChoker.png deleted file mode 100644 index 2b1aad871..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/HeartLinkChoker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/HighCollar.png b/Assets/Female3DCG/ItemNeck/Preview/HighCollar.png deleted file mode 100644 index 260b329a1..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/HighCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/HighSecurityCollar.png b/Assets/Female3DCG/ItemNeck/Preview/HighSecurityCollar.png deleted file mode 100644 index 5f7982744..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/HighSecurityCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/LatexCollar1.png b/Assets/Female3DCG/ItemNeck/Preview/LatexCollar1.png deleted file mode 100644 index 2cfcba2e5..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/LatexCollar1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/LatexCollar2.png b/Assets/Female3DCG/ItemNeck/Preview/LatexCollar2.png deleted file mode 100644 index e5395a9c5..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/LatexCollar2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/LatexPostureCollar.png b/Assets/Female3DCG/ItemNeck/Preview/LatexPostureCollar.png deleted file mode 100644 index e3ba89227..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/LatexPostureCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/LeatherChoker.png b/Assets/Female3DCG/ItemNeck/Preview/LeatherChoker.png deleted file mode 100644 index dab551221..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/LeatherChoker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/LeatherCollar.png b/Assets/Female3DCG/ItemNeck/Preview/LeatherCollar.png deleted file mode 100644 index b9ff368df..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/LeatherCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/LeatherCollarBell.png b/Assets/Female3DCG/ItemNeck/Preview/LeatherCollarBell.png deleted file mode 100644 index ad1178490..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/LeatherCollarBell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/LeatherCollarBow.png b/Assets/Female3DCG/ItemNeck/Preview/LeatherCollarBow.png deleted file mode 100644 index 0697a7135..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/LeatherCollarBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/LeatherCorsetCollar.png b/Assets/Female3DCG/ItemNeck/Preview/LeatherCorsetCollar.png deleted file mode 100644 index 42636b87a..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/LeatherCorsetCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/LoveLeatherCollar.png b/Assets/Female3DCG/ItemNeck/Preview/LoveLeatherCollar.png deleted file mode 100644 index a87fed6fe..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/LoveLeatherCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/MaidCollar.png b/Assets/Female3DCG/ItemNeck/Preview/MaidCollar.png deleted file mode 100644 index 8f5d6518b..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/MaidCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/NeckRope.png b/Assets/Female3DCG/ItemNeck/Preview/NeckRope.png deleted file mode 100644 index c2418f8bc..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/NeckRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/NobleCorsetCollar.png b/Assets/Female3DCG/ItemNeck/Preview/NobleCorsetCollar.png deleted file mode 100644 index d11aabd21..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/NobleCorsetCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/NylonCollar.png b/Assets/Female3DCG/ItemNeck/Preview/NylonCollar.png deleted file mode 100644 index fb19a584c..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/NylonCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/OrnateCollar.png b/Assets/Female3DCG/ItemNeck/Preview/OrnateCollar.png deleted file mode 100644 index 686fc0c53..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/OrnateCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/PetCollar.png b/Assets/Female3DCG/ItemNeck/Preview/PetCollar.png deleted file mode 100644 index 0a2494dc3..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/PetCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/PostureCollar.png b/Assets/Female3DCG/ItemNeck/Preview/PostureCollar.png deleted file mode 100644 index c0d4b2dbe..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/PostureCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/ShinySteelCollar.png b/Assets/Female3DCG/ItemNeck/Preview/ShinySteelCollar.png deleted file mode 100644 index 9a9e629dd..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/ShinySteelCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/ShockCollar.png b/Assets/Female3DCG/ItemNeck/Preview/ShockCollar.png deleted file mode 100644 index 0924cbcd8..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/ShockCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/ShockCollarRemote.png b/Assets/Female3DCG/ItemNeck/Preview/ShockCollarRemote.png deleted file mode 100644 index 2e79ad252..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/ShockCollarRemote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/SlaveCollar.png b/Assets/Female3DCG/ItemNeck/Preview/SlaveCollar.png deleted file mode 100644 index f950c59a2..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/SlaveCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/SlaveCollarHighSecurityCollar.png b/Assets/Female3DCG/ItemNeck/Preview/SlaveCollarHighSecurityCollar.png deleted file mode 100644 index 78508c82e..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/SlaveCollarHighSecurityCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/SlenderSteelCollar.png b/Assets/Female3DCG/ItemNeck/Preview/SlenderSteelCollar.png deleted file mode 100644 index 7409485ad..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/SlenderSteelCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/SpikeCollar.png b/Assets/Female3DCG/ItemNeck/Preview/SpikeCollar.png deleted file mode 100644 index 392447c22..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/SpikeCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/SteelPostureCollar.png b/Assets/Female3DCG/ItemNeck/Preview/SteelPostureCollar.png deleted file mode 100644 index 97a98abea..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/SteelPostureCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/StrictPostureCollar.png b/Assets/Female3DCG/ItemNeck/Preview/StrictPostureCollar.png deleted file mode 100644 index f1acc9ec7..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/StrictPostureCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/Preview/TechnoCollar.png b/Assets/Female3DCG/ItemNeck/Preview/TechnoCollar.png deleted file mode 100644 index c5e3f52da..000000000 Binary files a/Assets/Female3DCG/ItemNeck/Preview/TechnoCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ShinySteelCollar_Collar.png b/Assets/Female3DCG/ItemNeck/ShinySteelCollar_Collar.png deleted file mode 100644 index 4ab8fe6e7..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ShinySteelCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ShinySteelCollar_Ring.png b/Assets/Female3DCG/ItemNeck/ShinySteelCollar_Ring.png deleted file mode 100644 index 46e244d7e..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ShinySteelCollar_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ShockCollarBlink_Light.png b/Assets/Female3DCG/ItemNeck/ShockCollarBlink_Light.png deleted file mode 100644 index b96c8e1cc..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ShockCollarBlink_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ShockCollarBlink_Lock.png b/Assets/Female3DCG/ItemNeck/ShockCollarBlink_Lock.png deleted file mode 100644 index 317a745dc..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ShockCollarBlink_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ShockCollar_Collar.png b/Assets/Female3DCG/ItemNeck/ShockCollar_Collar.png deleted file mode 100644 index 6c0632665..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ShockCollar_Collar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/ShockCollar_Lock.png b/Assets/Female3DCG/ItemNeck/ShockCollar_Lock.png deleted file mode 100644 index 317a745dc..000000000 Binary files a/Assets/Female3DCG/ItemNeck/ShockCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollar.png deleted file mode 100644 index aaf472ef6..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarBatCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarBatCollar.png deleted file mode 100644 index 5ddae2387..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarBatCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarBordelleCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarBordelleCollar.png deleted file mode 100644 index 4ef11489a..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarBordelleCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarHeartCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarHeartCollar.png deleted file mode 100644 index 3235b4c65..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarHeartCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarHeartLinkChoker.png b/Assets/Female3DCG/ItemNeck/SlaveCollarHeartLinkChoker.png deleted file mode 100644 index 9b66de793..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarHeartLinkChoker.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarHighCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarHighCollar.png deleted file mode 100644 index 6e10465b5..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarHighCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarHighSecurityCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarHighSecurityCollar.png deleted file mode 100644 index 9eca121ad..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarHighSecurityCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarLatexPostureCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarLatexPostureCollar.png deleted file mode 100644 index d4b49ba34..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarLatexPostureCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherCollarBell.png b/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherCollarBell.png deleted file mode 100644 index f780d72ad..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherCollarBell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherCollarBow.png b/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherCollarBow.png deleted file mode 100644 index 8f5721d32..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherCollarBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherCorsetCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherCorsetCollar.png deleted file mode 100644 index 35cd0a532..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherCorsetCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherPosture.png b/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherPosture.png deleted file mode 100644 index 9cf110748..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarLeatherPosture.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarLoveLeatherCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarLoveLeatherCollar.png deleted file mode 100644 index a2568899c..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarLoveLeatherCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarMaidCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarMaidCollar.png deleted file mode 100644 index 5ef2c11fe..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarMaidCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarNeckRope.png b/Assets/Female3DCG/ItemNeck/SlaveCollarNeckRope.png deleted file mode 100644 index 15aa06d9f..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarNeckRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarNobleCorsetCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarNobleCorsetCollar.png deleted file mode 100644 index fbe46ad32..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarNobleCorsetCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarOrnateCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarOrnateCollar.png deleted file mode 100644 index d988780c2..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarOrnateCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarPetCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarPetCollar.png deleted file mode 100644 index f6c9be239..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarPetCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarShinySteelCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarShinySteelCollar.png deleted file mode 100644 index 4ab8fe6e7..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarShinySteelCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarSlenderSteelCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarSlenderSteelCollar.png deleted file mode 100644 index 960c0225f..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarSlenderSteelCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarSpikeCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarSpikeCollar.png deleted file mode 100644 index 2fcf11add..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarSpikeCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarSteelPosture.png b/Assets/Female3DCG/ItemNeck/SlaveCollarSteelPosture.png deleted file mode 100644 index df2b70932..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarSteelPosture.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlaveCollarStrictPostureCollar.png b/Assets/Female3DCG/ItemNeck/SlaveCollarStrictPostureCollar.png deleted file mode 100644 index 78af89048..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlaveCollarStrictPostureCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlenderSteelCollar.png b/Assets/Female3DCG/ItemNeck/SlenderSteelCollar.png deleted file mode 100644 index b11cd0302..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlenderSteelCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SlenderSteelCollar_Lock.png b/Assets/Female3DCG/ItemNeck/SlenderSteelCollar_Lock.png deleted file mode 100644 index b76bd9f92..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SlenderSteelCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SpikeCollar.png b/Assets/Female3DCG/ItemNeck/SpikeCollar.png deleted file mode 100644 index acef12a5d..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SpikeCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SpikeCollar_Lock.png b/Assets/Female3DCG/ItemNeck/SpikeCollar_Lock.png deleted file mode 100644 index 167661c83..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SpikeCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SteelPostureCollar.png b/Assets/Female3DCG/ItemNeck/SteelPostureCollar.png deleted file mode 100644 index 8e9e31e17..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SteelPostureCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/SteelPostureCollar_Lock.png b/Assets/Female3DCG/ItemNeck/SteelPostureCollar_Lock.png deleted file mode 100644 index 2a0990920..000000000 Binary files a/Assets/Female3DCG/ItemNeck/SteelPostureCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/StrictPostureCollar.png b/Assets/Female3DCG/ItemNeck/StrictPostureCollar.png deleted file mode 100644 index 78af89048..000000000 Binary files a/Assets/Female3DCG/ItemNeck/StrictPostureCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/StrictPostureCollar_Lock.png b/Assets/Female3DCG/ItemNeck/StrictPostureCollar_Lock.png deleted file mode 100644 index ded598b74..000000000 Binary files a/Assets/Female3DCG/ItemNeck/StrictPostureCollar_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_ChokerCollarBase.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_ChokerCollarBase.png deleted file mode 100644 index ccc2c8d09..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_ChokerCollarBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_ChokerCollarShine.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_ChokerCollarShine.png deleted file mode 100644 index c0590c065..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_ChokerCollarShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_ChokerCollarSides.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_ChokerCollarSides.png deleted file mode 100644 index c9cc8695f..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_ChokerCollarSides.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_FullCollarBase.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_FullCollarBase.png deleted file mode 100644 index a6cf8c462..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_FullCollarBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_FullCollarShine.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_FullCollarShine.png deleted file mode 100644 index 117165c2d..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_FullCollarShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_FullCollarSides.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_FullCollarSides.png deleted file mode 100644 index 1f3ba833a..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_FullCollarSides.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_PostureCollarBase.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_PostureCollarBase.png deleted file mode 100644 index 9e1bfd46a..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_PostureCollarBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_PostureCollarShine.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_PostureCollarShine.png deleted file mode 100644 index 29d61ba85..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_PostureCollarShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_PostureCollarSides.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_PostureCollarSides.png deleted file mode 100644 index 348297c06..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_PostureCollarSides.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_SlenderCollarBase.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_SlenderCollarBase.png deleted file mode 100644 index 86587efdf..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_SlenderCollarBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_SlenderCollarShine.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_SlenderCollarShine.png deleted file mode 100644 index 13b9e042b..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_SlenderCollarShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_SlenderCollarSides.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_SlenderCollarSides.png deleted file mode 100644 index 26d79c723..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_SlenderCollarSides.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_StrictPostureCollarBase.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_StrictPostureCollarBase.png deleted file mode 100644 index fc55aec9d..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_StrictPostureCollarBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_StrictPostureCollarShine.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_StrictPostureCollarShine.png deleted file mode 100644 index 6f958b037..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_StrictPostureCollarShine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeck/TechnoCollar_StrictPostureCollarSides.png b/Assets/Female3DCG/ItemNeck/TechnoCollar_StrictPostureCollarSides.png deleted file mode 100644 index f604545ce..000000000 Binary files a/Assets/Female3DCG/ItemNeck/TechnoCollar_StrictPostureCollarSides.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnitBlink_Light.png b/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnitBlink_Light.png deleted file mode 100644 index ce3f9b61a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnitBlink_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnitBlink_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnitBlink_Lock.png deleted file mode 100644 index 069752301..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnitBlink_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnit_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnit_Lock.png deleted file mode 100644 index 069752301..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnit_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnit_Unit.png b/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnit_Unit.png deleted file mode 100644 index abe908f17..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarAutoShockUnit_Unit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarBell.png b/Assets/Female3DCG/ItemNeckAccessories/CollarBell.png deleted file mode 100644 index 419a7bbd3..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarBell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarBell_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarBell_Lock.png deleted file mode 100644 index e0d9009f6..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarBell_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarBow.png b/Assets/Female3DCG/ItemNeckAccessories/CollarBow.png deleted file mode 100644 index e94001993..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarCowBell.png b/Assets/Female3DCG/ItemNeckAccessories/CollarCowBell.png deleted file mode 100644 index e37e729ed..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarCowBell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarCowBell_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarCowBell_Lock.png deleted file mode 100644 index e0d9009f6..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarCowBell_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarFlower.png b/Assets/Female3DCG/ItemNeckAccessories/CollarFlower.png deleted file mode 100644 index 1df31cb32..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarFlower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarLapis.png b/Assets/Female3DCG/ItemNeckAccessories/CollarLapis.png deleted file mode 100644 index 06c98f502..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarLapis.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarMoon.png b/Assets/Female3DCG/ItemNeckAccessories/CollarMoon.png deleted file mode 100644 index a423dd51f..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarMoon.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarMoon_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarMoon_Lock.png deleted file mode 100644 index da7c6477f..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarMoon_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTag.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTag.png deleted file mode 100644 index 3073dbde1..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagAngel.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagAngel.png deleted file mode 100644 index 1977138a7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagAngel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagAngel_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagAngel_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagAngel_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBadGirl.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBadGirl.png deleted file mode 100644 index ce5cbf709..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBadGirl.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBadGirl_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBadGirl_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBadGirl_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBindMe.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBindMe.png deleted file mode 100644 index fd0d12fe5..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBindMe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBindMe_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBindMe_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBindMe_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBitch.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBitch.png deleted file mode 100644 index 7a228ba55..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBitch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBitch_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBitch_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBitch_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBoobs.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBoobs.png deleted file mode 100644 index 047cb0872..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBoobs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBoobs_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBoobs_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagBoobs_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagCupcake.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagCupcake.png deleted file mode 100644 index f3a44cb4f..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagCupcake.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagCupcake_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagCupcake_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagCupcake_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDevil.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDevil.png deleted file mode 100644 index ba4ea9a8b..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDevil.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDevil_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDevil_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDevil_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDom.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDom.png deleted file mode 100644 index 5f3650c56..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDom.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDom_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDom_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagDom_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFree.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFree.png deleted file mode 100644 index ca5d0094b..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFree.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFree_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFree_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFree_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFuckMe.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFuckMe.png deleted file mode 100644 index 3c3b198d7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFuckMe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFuckMe_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFuckMe_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagFuckMe_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGagMe.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGagMe.png deleted file mode 100644 index 6d141da36..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGagMe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGagMe_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGagMe_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGagMe_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoddess.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoddess.png deleted file mode 100644 index 4854415c4..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoddess.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoddess_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoddess_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoddess_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoodGirl.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoodGirl.png deleted file mode 100644 index 1e0a8152a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoodGirl.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoodGirl_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoodGirl_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagGoodGirl_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagHoldMe.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagHoldMe.png deleted file mode 100644 index 8f305dc4d..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagHoldMe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagHoldMe_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagHoldMe_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagHoldMe_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagJewel.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagJewel.png deleted file mode 100644 index 6df8dbc7a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagJewel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagJewel_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagJewel_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagJewel_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestock.png deleted file mode 100644 index 7e437c303..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockAnimal.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockAnimal.png deleted file mode 100644 index b41351db0..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockAnimal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockAnimal_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockAnimal_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockAnimal_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockBreedMe.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockBreedMe.png deleted file mode 100644 index e6a5ad8a0..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockBreedMe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockBreedMe_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockBreedMe_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockBreedMe_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockCow.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockCow.png deleted file mode 100644 index bf8d6180f..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockCow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockCow_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockCow_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockCow_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMeat.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMeat.png deleted file mode 100644 index cd334c3a7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMeat_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMeat_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMeat_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMilkMe.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMilkMe.png deleted file mode 100644 index 8714b5923..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMilkMe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMilkMe_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMilkMe_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockMilkMe_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockPig.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockPig.png deleted file mode 100644 index 311afe3ca..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockPig.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockPig_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockPig_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestockPig_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestock_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestock_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLivestock_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLove.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLove.png deleted file mode 100644 index 1ceda97b2..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLove.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLove_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLove_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLove_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLover.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLover.png deleted file mode 100644 index cc0cd134b..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLover.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverCookie.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverCookie.png deleted file mode 100644 index 9fb52ee7a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverCookie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverCookie_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverCookie_Lock.png deleted file mode 100644 index 1bc163247..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverCookie_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverFeather.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverFeather.png deleted file mode 100644 index 6d98a94d1..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverFeather_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverFeather_Lock.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverFeather_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverLover.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverLover.png deleted file mode 100644 index 61b414e70..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverLover.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverLover_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverLover_Lock.png deleted file mode 100644 index 1bc163247..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverLover_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverMuffin.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverMuffin.png deleted file mode 100644 index c35b4e25e..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverMuffin.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverMuffin_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverMuffin_Lock.png deleted file mode 100644 index 1bc163247..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLoverMuffin_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLover_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLover_Lock.png deleted file mode 100644 index 1bc163247..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagLover_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMaid.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMaid.png deleted file mode 100644 index 8eb9238f7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMaid.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMaid_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMaid_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMaid_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMeat.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMeat.png deleted file mode 100644 index 60320cc0a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMeat_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMeat_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMeat_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMiss.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMiss.png deleted file mode 100644 index 8fb6c0e84..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMiss.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMiss_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMiss_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMiss_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMummy.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMummy.png deleted file mode 100644 index 949447da0..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMummy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMummy_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMummy_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagMummy_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNeedy.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNeedy.png deleted file mode 100644 index c8afbdb32..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNeedy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNeedy_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNeedy_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNeedy_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNice.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNice.png deleted file mode 100644 index 1be41a00e..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNice.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNice_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNice_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagNice_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOval.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOval.png deleted file mode 100644 index e38f2f10a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOval.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalAnalSlut.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalAnalSlut.png deleted file mode 100644 index 830d11526..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalAnalSlut.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalAnalSlut_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalAnalSlut_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalAnalSlut_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBabe.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBabe.png deleted file mode 100644 index 7d2ff1967..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBabe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBabe_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBabe_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBabe_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBandit.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBandit.png deleted file mode 100644 index ce060086f..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBandit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBandit_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBandit_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBandit_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBimbo.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBimbo.png deleted file mode 100644 index 6909ef2a6..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBimbo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBimbo_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBimbo_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBimbo_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBratty.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBratty.png deleted file mode 100644 index 925f31b89..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBratty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBratty_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBratty_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalBratty_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalButtSlut.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalButtSlut.png deleted file mode 100644 index 424f2e0d9..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalButtSlut.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalButtSlut_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalButtSlut_Lock.png deleted file mode 100644 index fa3908013..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalButtSlut_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChair.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChair.png deleted file mode 100644 index 864a82d7a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChair.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChair_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChair_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChair_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChaste.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChaste.png deleted file mode 100644 index 0504583f8..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChaste.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChaste_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChaste_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalChaste_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCrazy.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCrazy.png deleted file mode 100644 index 63be0e151..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCrazy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCrazy_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCrazy_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCrazy_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCumslut.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCumslut.png deleted file mode 100644 index dcb014448..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCumslut.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCumslut_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCumslut_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCumslut_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCutie.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCutie.png deleted file mode 100644 index 40ea4b2d9..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCutie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCutie_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCutie_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalCutie_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDamsel.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDamsel.png deleted file mode 100644 index 5f4bee9a8..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDamsel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDamsel_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDamsel_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDamsel_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDoll.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDoll.png deleted file mode 100644 index 52efc35e3..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDoll.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDoll_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDoll_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalDoll_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEdgeMe.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEdgeMe.png deleted file mode 100644 index 50ded88e8..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEdgeMe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEdgeMe_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEdgeMe_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEdgeMe_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEvil.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEvil.png deleted file mode 100644 index 043a6c726..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEvil.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEvil_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEvil_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalEvil_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalForSale.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalForSale.png deleted file mode 100644 index f67c87700..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalForSale.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalForSale_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalForSale_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalForSale_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalGreedy.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalGreedy.png deleted file mode 100644 index 782c80526..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalGreedy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalGreedy_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalGreedy_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalGreedy_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHappy.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHappy.png deleted file mode 100644 index 53f3dd025..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHappy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHappy_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHappy_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHappy_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHorny.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHorny.png deleted file mode 100644 index 16e9a6974..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHorny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHorny_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHorny_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalHorny_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalKinky.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalKinky.png deleted file mode 100644 index b27d985ff..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalKinky.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalKinky_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalKinky_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalKinky_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLady.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLady.png deleted file mode 100644 index 46faf953e..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLady.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLady_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLady_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLady_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLockMe.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLockMe.png deleted file mode 100644 index 52ac3f7ff..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLockMe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLockMe_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLockMe_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalLockMe_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNude.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNude.png deleted file mode 100644 index 5ba2b4e59..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNude.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNude_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNude_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNude_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNurse.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNurse.png deleted file mode 100644 index 9db258620..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNurse.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNurse_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNurse_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNurse_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNympho.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNympho.png deleted file mode 100644 index 4655ebc88..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNympho.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNympho_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNympho_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalNympho_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPainslut.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPainslut.png deleted file mode 100644 index 2b9cb1b25..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPainslut.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPainslut_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPainslut_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPainslut_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPillow.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPillow.png deleted file mode 100644 index 6edfa5f42..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPillow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPillow_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPillow_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPillow_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPunish.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPunish.png deleted file mode 100644 index 623db3889..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPunish.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPunish_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPunish_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalPunish_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalRobber.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalRobber.png deleted file mode 100644 index fa828e681..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalRobber.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalRobber_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalRobber_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalRobber_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSad.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSad.png deleted file mode 100644 index 4937b8f98..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSad.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSad_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSad_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSad_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSwitch.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSwitch.png deleted file mode 100644 index 6edac60bd..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSwitch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSwitch_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSwitch_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalSwitch_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTable.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTable.png deleted file mode 100644 index 03e0545cf..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTable.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTable_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTable_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTable_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTicklish.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTicklish.png deleted file mode 100644 index 5ee698fc9..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTicklish.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTicklish_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTicklish_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalTicklish_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalUndress.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalUndress.png deleted file mode 100644 index cf65b2ff4..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalUndress.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalUndress_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalUndress_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalUndress_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalVictim.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalVictim.png deleted file mode 100644 index 0fe74dc49..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalVictim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalVictim_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalVictim_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalVictim_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalViolent.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalViolent.png deleted file mode 100644 index ab798fbbc..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalViolent.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalViolent_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalViolent_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalViolent_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalWorm.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalWorm.png deleted file mode 100644 index 449cc277b..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalWorm.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalWorm_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalWorm_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOvalWorm_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOval_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOval_Lock.png deleted file mode 100644 index 8e2475965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOval_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOwned.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOwned.png deleted file mode 100644 index 868540a75..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOwned.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOwned_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOwned_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagOwned_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPet.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPet.png deleted file mode 100644 index bb058c391..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetBunny.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetBunny.png deleted file mode 100644 index aa9da5820..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetBunny.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetBunny_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetBunny_Lock.png deleted file mode 100644 index 40bed1a2e..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetBunny_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetCat.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetCat.png deleted file mode 100644 index c5438e7cf..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetCat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetCat_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetCat_Lock.png deleted file mode 100644 index 1e8bcf081..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetCat_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetDog.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetDog.png deleted file mode 100644 index 717232a06..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetDog.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetDog_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetDog_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetDog_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetFoxy.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetFoxy.png deleted file mode 100644 index 774da4457..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetFoxy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetFoxy_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetFoxy_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetFoxy_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitten.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitten.png deleted file mode 100644 index df1d559a4..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitten.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitten_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitten_Lock.png deleted file mode 100644 index 1e8bcf081..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitten_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitty.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitty.png deleted file mode 100644 index c5fd2da03..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitty.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitty_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitty_Lock.png deleted file mode 100644 index 1e8bcf081..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetKitty_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetMochi.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetMochi.png deleted file mode 100644 index 8c540fa70..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetMochi.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetMochi_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetMochi_Lock.png deleted file mode 100644 index 1e8bcf081..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetMochi_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetMummy.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetMummy.png deleted file mode 100644 index 9c0b05e52..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetMummy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPanda.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPanda.png deleted file mode 100644 index 5ffc774d3..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPanda.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPanda_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPanda_Lock.png deleted file mode 100644 index 1e8bcf081..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPanda_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPet.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPet.png deleted file mode 100644 index 678a892e6..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPetMe.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPetMe.png deleted file mode 100644 index 131947711..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPetMe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPetMe_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPetMe_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPetMe_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPet_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPet_Lock.png deleted file mode 100644 index 1e8bcf081..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPet_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPixie.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPixie.png deleted file mode 100644 index d7ece71bc..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPixie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPixie_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPixie_Lock.png deleted file mode 100644 index 1e8bcf081..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPixie_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPony.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPony.png deleted file mode 100644 index 18c41a71b..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPony.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPony_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPony_Lock.png deleted file mode 100644 index 40bed1a2e..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPony_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPuppy.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPuppy.png deleted file mode 100644 index 8b21d7b7f..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPuppy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPuppy_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPuppy_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetPuppy_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetRacoon.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetRacoon.png deleted file mode 100644 index ca7b37427..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetRacoon.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetRacoon_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetRacoon_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetRacoon_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetSloth.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetSloth.png deleted file mode 100644 index 19822e4b9..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetSloth.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetSloth_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetSloth_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPetSloth_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPet_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPet_Lock.png deleted file mode 100644 index e02c45513..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPet_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPrecious.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPrecious.png deleted file mode 100644 index cfd997965..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPrecious.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPrecious_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPrecious_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPrecious_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPudding.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPudding.png deleted file mode 100644 index a9a9ecdff..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPudding.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPudding_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPudding_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagPudding_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagQueen.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagQueen.png deleted file mode 100644 index d9f943de6..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagQueen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagQueen_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagQueen_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagQueen_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlave.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlave.png deleted file mode 100644 index 789489e9c..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlave.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlave_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlave_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlave_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlut.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlut.png deleted file mode 100644 index d2407ea62..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlut.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlut_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlut_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSlut_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSub.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSub.png deleted file mode 100644 index ae327050c..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSub.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSub_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSub_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSub_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSweetie.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSweetie.png deleted file mode 100644 index 0acd10800..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSweetie.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSweetie_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSweetie_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagSweetie_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagTaken.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagTaken.png deleted file mode 100644 index bc776cfbf..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagTaken.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagTaken_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagTaken_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagTaken_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagToy.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagToy.png deleted file mode 100644 index cd77de39a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagToy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagToy_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagToy_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagToy_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseMe.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseMe.png deleted file mode 100644 index 359103bbc..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseMe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseMe_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseMe_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseMe_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseless.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseless.png deleted file mode 100644 index 4ee075f0f..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseless.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseless_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseless_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagUseless_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagWhore.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagWhore.png deleted file mode 100644 index 137048f14..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagWhore.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagWhore_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagWhore_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTagWhore_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTag_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarNameTag_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarNameTag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarPentagram.png b/Assets/Female3DCG/ItemNeckAccessories/CollarPentagram.png deleted file mode 100644 index 380eda4d4..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarPentagram.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarPupBone.png b/Assets/Female3DCG/ItemNeckAccessories/CollarPupBone.png deleted file mode 100644 index 9a6d3becd..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarPupBone.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarRose.png b/Assets/Female3DCG/ItemNeckAccessories/CollarRose.png deleted file mode 100644 index 927759211..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarRose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnitBlink_Light.png b/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnitBlink_Light.png deleted file mode 100644 index ce3f9b61a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnitBlink_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnitBlink_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnitBlink_Lock.png deleted file mode 100644 index 069752301..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnitBlink_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnit_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnit_Lock.png deleted file mode 100644 index 069752301..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnit_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnit_Unit.png b/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnit_Unit.png deleted file mode 100644 index abe908f17..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnit_Unit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CollarSun.png b/Assets/Female3DCG/ItemNeckAccessories/CollarSun.png deleted file mode 100644 index 91b1f480a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CollarSun.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTag_Lock.png b/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTag_Lock.png deleted file mode 100644 index 95a3853b7..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTag_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt0_Tag.png b/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt0_Tag.png deleted file mode 100644 index 3073dbde1..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt0_Tag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt1_Tag.png b/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt1_Tag.png deleted file mode 100644 index 7e437c303..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt1_Tag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt2_Tag.png b/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt2_Tag.png deleted file mode 100644 index bb058c391..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt2_Tag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt3_Tag.png b/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt3_Tag.png deleted file mode 100644 index e38f2f10a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt3_Tag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt4_Tag.png b/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt4_Tag.png deleted file mode 100644 index 228732fdd..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt4_Tag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt5_Tag.png b/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt5_Tag.png deleted file mode 100644 index f8fc5b1e3..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/CustomCollarTagt5_Tag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/ElectronicTag_Display.png b/Assets/Female3DCG/ItemNeckAccessories/ElectronicTag_Display.png deleted file mode 100644 index e71f946fc..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/ElectronicTag_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/ElectronicTag_Tag.png b/Assets/Female3DCG/ItemNeckAccessories/ElectronicTag_Tag.png deleted file mode 100644 index c49df76d6..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/ElectronicTag_Tag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/ElectronicTag_Text.png b/Assets/Female3DCG/ItemNeckAccessories/ElectronicTag_Text.png deleted file mode 100644 index d57eccd40..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/ElectronicTag_Text.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Key.png b/Assets/Female3DCG/ItemNeckAccessories/Key.png deleted file mode 100644 index cfcfc8b78..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Key.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarAutoShockUnit.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarAutoShockUnit.png deleted file mode 100644 index 81b39a914..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarAutoShockUnit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarBell.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarBell.png deleted file mode 100644 index ad1178490..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarBell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarBow.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarBow.png deleted file mode 100644 index 0697a7135..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarBow.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarCowBell.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarCowBell.png deleted file mode 100644 index ec3a9ce34..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarCowBell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarFlower.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarFlower.png deleted file mode 100644 index 5b805e00f..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarFlower.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarLapis.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarLapis.png deleted file mode 100644 index c0e0017b3..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarLapis.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarMoon.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarMoon.png deleted file mode 100644 index f58f0b837..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarMoon.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTag.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTag.png deleted file mode 100644 index 91f0500db..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagLivestock.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagLivestock.png deleted file mode 100644 index 4dacbe10c..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagLivestock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagLover.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagLover.png deleted file mode 100644 index 7d4715312..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagLover.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagOval.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagOval.png deleted file mode 100644 index b759f2039..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagOval.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagPet.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagPet.png deleted file mode 100644 index b64ca9faa..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarNameTagPet.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarPentagram.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarPentagram.png deleted file mode 100644 index d7fd39138..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarPentagram.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarPupBone.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarPupBone.png deleted file mode 100644 index 685fe82d5..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarPupBone.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarRose.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarRose.png deleted file mode 100644 index 192c3fc08..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarRose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarShockUnit.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarShockUnit.png deleted file mode 100644 index 0924cbcd8..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarShockUnit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarSun.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarSun.png deleted file mode 100644 index 7fc60642a..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CollarSun.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/CustomCollarTag.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/CustomCollarTag.png deleted file mode 100644 index 91f0500db..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/CustomCollarTag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/ElectronicTag.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/ElectronicTag.png deleted file mode 100644 index 47f50d33e..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/ElectronicTag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/Key.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/Key.png deleted file mode 100644 index e614eb703..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/Key.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckAccessories/Preview/ShockCollarRemote.png b/Assets/Female3DCG/ItemNeckAccessories/Preview/ShockCollarRemote.png deleted file mode 100644 index 2e79ad252..000000000 Binary files a/Assets/Female3DCG/ItemNeckAccessories/Preview/ShockCollarRemote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeash.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeash.png deleted file mode 100644 index 06b9927ca..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeashTaken.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeashTaken.png deleted file mode 100644 index 0e814c6d0..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeashTaken.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeashTaken_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeashTaken_Lock.png deleted file mode 100644 index ab5d2b326..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeashTaken_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeash_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeash_Lock.png deleted file mode 100644 index 365946645..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/ChainLeash_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainLong.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainLong.png deleted file mode 100644 index 8e2487dbf..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainLong_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainLong_Lock.png deleted file mode 100644 index 3eaa82626..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainLong_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainMedium.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainMedium.png deleted file mode 100644 index 8e2487dbf..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainMedium_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainMedium_Lock.png deleted file mode 100644 index 3eaa82626..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainMedium_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainShort.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainShort.png deleted file mode 100644 index a6019a531..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainShort.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainShort_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainShort_Lock.png deleted file mode 100644 index c2eba56ab..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarChainShort_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeash.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeash.png deleted file mode 100644 index 6db2ee460..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeashTaken.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeashTaken.png deleted file mode 100644 index d22af0ee4..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeashTaken.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeashTaken_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeashTaken_Lock.png deleted file mode 100644 index ab5d2b326..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeashTaken_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeash_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeash_Lock.png deleted file mode 100644 index 365946645..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarLeash_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeLong_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeLong_Plate.png deleted file mode 100644 index 794f3fe8e..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeLong_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeLong_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeLong_Rope.png deleted file mode 100644 index 4696a4135..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeLong_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeMedium_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeMedium_Plate.png deleted file mode 100644 index 9271c3bb3..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeMedium_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeMedium_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeMedium_Rope.png deleted file mode 100644 index 4696a4135..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeMedium_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeShort_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeShort_Plate.png deleted file mode 100644 index 083043874..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeShort_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeShort_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeShort_Rope.png deleted file mode 100644 index 4696a4135..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/CollarRopeShort_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/PetPost_Chain.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/PetPost_Chain.png deleted file mode 100644 index f742400de..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/PetPost_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/PetPost_Leash.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/PetPost_Leash.png deleted file mode 100644 index 20992accd..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/PetPost_Leash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/PetPost_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/PetPost_Rope.png deleted file mode 100644 index 7a25e52f5..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/PetPost_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Base.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Base.png deleted file mode 100644 index 8993de73e..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Chain.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Chain.png deleted file mode 100644 index 0c8ef4005..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Head.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Head.png deleted file mode 100644 index 4b568a9b4..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Head.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Lock.png deleted file mode 100644 index c2eba56ab..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Post.png b/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Post.png deleted file mode 100644 index 35173dfcd..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/AllFours/Post_Post.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/ChainLeash.png b/Assets/Female3DCG/ItemNeckRestraints/ChainLeash.png deleted file mode 100644 index 63ced3444..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/ChainLeash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/ChainLeashTaken.png b/Assets/Female3DCG/ItemNeckRestraints/ChainLeashTaken.png deleted file mode 100644 index 29433c487..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/ChainLeashTaken.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/ChainLeashTaken_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/ChainLeashTaken_Lock.png deleted file mode 100644 index ab5d2b326..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/ChainLeashTaken_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/ChainLeash_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/ChainLeash_Lock.png deleted file mode 100644 index 365946645..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/ChainLeash_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarChainLong.png b/Assets/Female3DCG/ItemNeckRestraints/CollarChainLong.png deleted file mode 100644 index 2ac3d98b6..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarChainLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarChainLong_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/CollarChainLong_Lock.png deleted file mode 100644 index 3eaa82626..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarChainLong_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarChainMedium.png b/Assets/Female3DCG/ItemNeckRestraints/CollarChainMedium.png deleted file mode 100644 index 0be7fc5d5..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarChainMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarChainMedium_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/CollarChainMedium_Lock.png deleted file mode 100644 index fba9e4bd9..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarChainMedium_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarChainShort.png b/Assets/Female3DCG/ItemNeckRestraints/CollarChainShort.png deleted file mode 100644 index da083ae53..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarChainShort.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarChainShort_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/CollarChainShort_Lock.png deleted file mode 100644 index c2eba56ab..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarChainShort_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarLeash.png b/Assets/Female3DCG/ItemNeckRestraints/CollarLeash.png deleted file mode 100644 index d1b9d680e..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarLeash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarLeashTaken.png b/Assets/Female3DCG/ItemNeckRestraints/CollarLeashTaken.png deleted file mode 100644 index e4e6e93bc..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarLeashTaken.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarLeashTaken_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/CollarLeashTaken_Lock.png deleted file mode 100644 index ab5d2b326..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarLeashTaken_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarLeash_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/CollarLeash_Lock.png deleted file mode 100644 index 365946645..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarLeash_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeLong_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/CollarRopeLong_Plate.png deleted file mode 100644 index 7da797027..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeLong_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeLong_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/CollarRopeLong_Rope.png deleted file mode 100644 index 0ce3b58f3..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeLong_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeMedium_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/CollarRopeMedium_Plate.png deleted file mode 100644 index 9caed940c..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeMedium_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeMedium_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/CollarRopeMedium_Rope.png deleted file mode 100644 index dede50eed..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeMedium_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeShort_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/CollarRopeShort_Plate.png deleted file mode 100644 index 72f32ea18..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeShort_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeShort_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/CollarRopeShort_Rope.png deleted file mode 100644 index 97cd7fd87..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/CollarRopeShort_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeash.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeash.png deleted file mode 100644 index 06b9927ca..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeashTaken.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeashTaken.png deleted file mode 100644 index 0e814c6d0..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeashTaken.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeashTaken_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeashTaken_Lock.png deleted file mode 100644 index ab5d2b326..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeashTaken_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeash_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeash_Lock.png deleted file mode 100644 index 365946645..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/ChainLeash_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainLong.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainLong.png deleted file mode 100644 index 8e2487dbf..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainLong_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainLong_Lock.png deleted file mode 100644 index 3eaa82626..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainLong_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainMedium.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainMedium.png deleted file mode 100644 index 8e2487dbf..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainMedium_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainMedium_Lock.png deleted file mode 100644 index 3eaa82626..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainMedium_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainShort.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainShort.png deleted file mode 100644 index a6019a531..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainShort.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainShort_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainShort_Lock.png deleted file mode 100644 index c2eba56ab..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarChainShort_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeash.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeash.png deleted file mode 100644 index 6db2ee460..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeashTaken.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeashTaken.png deleted file mode 100644 index d22af0ee4..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeashTaken.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeashTaken_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeashTaken_Lock.png deleted file mode 100644 index ab5d2b326..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeashTaken_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeash_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeash_Lock.png deleted file mode 100644 index 365946645..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarLeash_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeLong_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeLong_Plate.png deleted file mode 100644 index 794f3fe8e..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeLong_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeLong_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeLong_Rope.png deleted file mode 100644 index 4696a4135..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeLong_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeMedium_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeMedium_Plate.png deleted file mode 100644 index 9271c3bb3..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeMedium_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeMedium_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeMedium_Rope.png deleted file mode 100644 index 4696a4135..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeMedium_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeShort_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeShort_Plate.png deleted file mode 100644 index 083043874..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeShort_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeShort_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeShort_Rope.png deleted file mode 100644 index 4696a4135..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/CollarRopeShort_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/PetPost_Chain.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/PetPost_Chain.png deleted file mode 100644 index 847beafa8..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/PetPost_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/PetPost_Leash.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/PetPost_Leash.png deleted file mode 100644 index f87c5e237..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/PetPost_Leash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/PetPost_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/PetPost_Rope.png deleted file mode 100644 index b461e193e..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/PetPost_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Base.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Base.png deleted file mode 100644 index 8993de73e..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Chain.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Chain.png deleted file mode 100644 index 0c8ef4005..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Head.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Head.png deleted file mode 100644 index 4b568a9b4..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Head.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Lock.png deleted file mode 100644 index c2eba56ab..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Post.png b/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Post.png deleted file mode 100644 index 35173dfcd..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Hogtied/Post_Post.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainLong.png b/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainLong.png deleted file mode 100644 index f00144119..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainLong_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainLong_Lock.png deleted file mode 100644 index fba9e4bd9..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainLong_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainMedium.png b/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainMedium.png deleted file mode 100644 index 7eb4762cd..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainMedium_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainMedium_Lock.png deleted file mode 100644 index fba9e4bd9..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarChainMedium_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeLong_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeLong_Plate.png deleted file mode 100644 index 9d08e4551..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeLong_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeLong_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeLong_Rope.png deleted file mode 100644 index 90c6a2739..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeLong_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeMedium_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeMedium_Plate.png deleted file mode 100644 index f1aa2ebf2..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeMedium_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeMedium_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeMedium_Rope.png deleted file mode 100644 index 5c9d2f267..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Kneel/CollarRopeMedium_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Kneel/PetPost_Chain.png b/Assets/Female3DCG/ItemNeckRestraints/Kneel/PetPost_Chain.png deleted file mode 100644 index e8366228e..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Kneel/PetPost_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Kneel/PetPost_Leash.png b/Assets/Female3DCG/ItemNeckRestraints/Kneel/PetPost_Leash.png deleted file mode 100644 index 5b5d366f4..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Kneel/PetPost_Leash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Kneel/PetPost_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/Kneel/PetPost_Rope.png deleted file mode 100644 index 444f70b1f..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Kneel/PetPost_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainLong.png b/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainLong.png deleted file mode 100644 index 9b5e93135..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainLong_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainLong_Lock.png deleted file mode 100644 index 2c265deab..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainLong_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainMedium.png b/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainMedium.png deleted file mode 100644 index c75384f5d..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainMedium_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainMedium_Lock.png deleted file mode 100644 index fba9e4bd9..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarChainMedium_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeLong_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeLong_Plate.png deleted file mode 100644 index 5764ec900..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeLong_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeLong_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeLong_Rope.png deleted file mode 100644 index 02fc0df91..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeLong_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeMedium_Plate.png b/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeMedium_Plate.png deleted file mode 100644 index 90f6cb3dc..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeMedium_Plate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeMedium_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeMedium_Rope.png deleted file mode 100644 index 5c9d2f267..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/CollarRopeMedium_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/PetPost_Chain.png b/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/PetPost_Chain.png deleted file mode 100644 index 926a90f41..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/PetPost_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/PetPost_Leash.png b/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/PetPost_Leash.png deleted file mode 100644 index 5b5d366f4..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/PetPost_Leash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/PetPost_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/PetPost_Rope.png deleted file mode 100644 index 444f70b1f..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/KneelingSpread/PetPost_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Bi.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_Bi.png deleted file mode 100644 index 5ed5210ef..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Bi.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Chain.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_Chain.png deleted file mode 100644 index c82d1602f..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_LGBT.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_LGBT.png deleted file mode 100644 index f24f89726..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_LGBT.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Leash.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_Leash.png deleted file mode 100644 index 20d2b448f..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Leash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Moon.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_Moon.png deleted file mode 100644 index 3268b60eb..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Moon.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_NoSwim.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_NoSwim.png deleted file mode 100644 index df5235c32..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_NoSwim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Paw.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_Paw.png deleted file mode 100644 index 61545f64a..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Paw.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Plaque.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_Plaque.png deleted file mode 100644 index c8aacc026..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Plaque.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueBolts.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueBolts.png deleted file mode 100644 index c46deda39..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueBolts.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueBorder.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueBorder.png deleted file mode 100644 index 4bb5faaed..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueBorder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueBorderClean.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueBorderClean.png deleted file mode 100644 index d7a1d40b6..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueBorderClean.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueClean.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueClean.png deleted file mode 100644 index 7b8c904b4..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PlaqueClean.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Pole.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_Pole.png deleted file mode 100644 index fd13f0055..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Pole.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PoleClean.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_PoleClean.png deleted file mode 100644 index 065591997..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PoleClean.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PoleShade.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_PoleShade.png deleted file mode 100644 index aca88ff97..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_PoleShade.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Postit.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_Postit.png deleted file mode 100644 index 0dffae5f2..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Postit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Rope.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_Rope.png deleted file mode 100644 index 6ba64dbe6..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Trans.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_Trans.png deleted file mode 100644 index 3db023e4d..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Trans.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Triskel.png b/Assets/Female3DCG/ItemNeckRestraints/PetPost_Triskel.png deleted file mode 100644 index b2cc7d129..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/PetPost_Triskel.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Post_Base.png b/Assets/Female3DCG/ItemNeckRestraints/Post_Base.png deleted file mode 100644 index 68e0c38fb..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Post_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Post_Chain.png b/Assets/Female3DCG/ItemNeckRestraints/Post_Chain.png deleted file mode 100644 index c2d89b023..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Post_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Post_Head.png b/Assets/Female3DCG/ItemNeckRestraints/Post_Head.png deleted file mode 100644 index f9cc5115a..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Post_Head.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Post_Lock.png b/Assets/Female3DCG/ItemNeckRestraints/Post_Lock.png deleted file mode 100644 index c2eba56ab..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Post_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Post_Post.png b/Assets/Female3DCG/ItemNeckRestraints/Post_Post.png deleted file mode 100644 index 5ffa4958d..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Post_Post.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/ChainLeash.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/ChainLeash.png deleted file mode 100644 index 1c949e20f..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/ChainLeash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/ChainLeashTaken.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/ChainLeashTaken.png deleted file mode 100644 index 1c949e20f..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/ChainLeashTaken.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarChainLong.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarChainLong.png deleted file mode 100644 index 0cb339e89..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarChainLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarChainMedium.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarChainMedium.png deleted file mode 100644 index 0cb339e89..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarChainMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarChainShort.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarChainShort.png deleted file mode 100644 index 0cb339e89..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarChainShort.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarLeash.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarLeash.png deleted file mode 100644 index ba1129447..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarLeash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarLeashTaken.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarLeashTaken.png deleted file mode 100644 index ba1129447..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarLeashTaken.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarRopeLong.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarRopeLong.png deleted file mode 100644 index b1bcd9b8f..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarRopeLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarRopeMedium.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarRopeMedium.png deleted file mode 100644 index b1bcd9b8f..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarRopeMedium.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarRopeShort.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarRopeShort.png deleted file mode 100644 index b1bcd9b8f..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/CollarRopeShort.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/PetPost.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/PetPost.png deleted file mode 100644 index 3c9da8320..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/PetPost.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNeckRestraints/Preview/Post.png b/Assets/Female3DCG/ItemNeckRestraints/Preview/Post.png deleted file mode 100644 index 49fdf3e67..000000000 Binary files a/Assets/Female3DCG/ItemNeckRestraints/Preview/Post.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_Large.png deleted file mode 100644 index 9a35d1377..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_Normal.png deleted file mode 100644 index fba3afd92..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_Small.png deleted file mode 100644 index bb83ac3c0..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_XLarge.png deleted file mode 100644 index e58c5a680..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/BellClamps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Chain.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Chain.png deleted file mode 100644 index 8fc3ae7de..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Chain2.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Chain2.png deleted file mode 100644 index 90786b364..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Chain2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Clamp.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Clamp.png deleted file mode 100644 index da41026f2..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Clamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Metal.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Metal.png deleted file mode 100644 index 8c010c2e2..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Large_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Chain.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Chain.png deleted file mode 100644 index 560cb27bc..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Chain2.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Chain2.png deleted file mode 100644 index 175eed4f7..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Chain2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Clamp.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Clamp.png deleted file mode 100644 index 4eda2a99f..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Clamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Metal.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Metal.png deleted file mode 100644 index ee0a1d982..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Normal_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Chain.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Chain.png deleted file mode 100644 index 51bdf0909..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Chain2.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Chain2.png deleted file mode 100644 index 9f72447b1..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Chain2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Clamp.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Clamp.png deleted file mode 100644 index 85e2cb086..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Clamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Metal.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Metal.png deleted file mode 100644 index d0eccc7b3..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_Small_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Chain.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Chain.png deleted file mode 100644 index 7eaf4c0cd..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Chain2.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Chain2.png deleted file mode 100644 index 439efb3ce..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Chain2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Clamp.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Clamp.png deleted file mode 100644 index b4b6ee322..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Clamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Metal.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Metal.png deleted file mode 100644 index 8cf86f040..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainClamp_XLarge_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_Large.png deleted file mode 100644 index 4b0b10196..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_Normal.png deleted file mode 100644 index a91b7edeb..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_Small.png deleted file mode 100644 index 68e6952a8..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_XLarge.png deleted file mode 100644 index aeca89cb7..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChainTassles_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_Large.png deleted file mode 100644 index 0aadd9143..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_Normal.png deleted file mode 100644 index 95861c408..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_Small.png deleted file mode 100644 index 9423c6af9..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_XLarge.png deleted file mode 100644 index 03d015200..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ChopStickNippleClamps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_Large.png deleted file mode 100644 index a2581e519..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_Normal.png deleted file mode 100644 index e82c1f042..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_Small.png deleted file mode 100644 index f57c44583..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_XLarge.png deleted file mode 100644 index eefe839f5..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/Clothespins_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_Large.png deleted file mode 100644 index 832596025..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_Normal.png deleted file mode 100644 index 285205dd8..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_Small.png deleted file mode 100644 index d2c993b40..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_XLarge.png deleted file mode 100644 index 99219a245..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/HeartPasties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_Large.png deleted file mode 100644 index 25401c4d9..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_Normal.png deleted file mode 100644 index c46a4b370..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_Small.png deleted file mode 100644 index edd06b6eb..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_XLarge.png deleted file mode 100644 index 847f89dce..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/KittyPasties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_Large.png deleted file mode 100644 index fd16ba62e..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_Normal.png deleted file mode 100644 index dafa84b92..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_Small.png deleted file mode 100644 index ad2639332..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_XLarge.png deleted file mode 100644 index 6b55ef433..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/LactationPump_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_Large.png deleted file mode 100644 index e07217da7..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_Normal.png deleted file mode 100644 index 756a28ad1..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_Small.png deleted file mode 100644 index 2095d641e..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_XLarge.png deleted file mode 100644 index 583038963..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleClamp_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_Large.png deleted file mode 100644 index 668dd62d8..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_Normal.png deleted file mode 100644 index 9fe89ea8e..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_Small.png deleted file mode 100644 index e3f9fb4b2..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_XLarge.png deleted file mode 100644 index 56fc845b0..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleSuctionCups_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_Large.png deleted file mode 100644 index 34cda2309..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_Normal.png deleted file mode 100644 index 7b4cebbdc..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_Small.png deleted file mode 100644 index 08a1acb76..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_XLarge.png deleted file mode 100644 index abe173658..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_Large.png deleted file mode 100644 index eceea10fd..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_Normal.png deleted file mode 100644 index 05eb62afc..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_Small.png deleted file mode 100644 index 09e5aa667..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_XLarge.png deleted file mode 100644 index 123a87d50..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/NippleWeightClamps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_Large.png deleted file mode 100644 index 0445eea6a..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_Normal.png deleted file mode 100644 index ce2e5ea20..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_Small.png deleted file mode 100644 index d4bd6abc7..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_XLarge.png deleted file mode 100644 index 4273bfc53..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ScrewClamps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_Large.png deleted file mode 100644 index e70680e34..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_Normal.png deleted file mode 100644 index 833a90bf2..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_Small.png deleted file mode 100644 index 3cdb3f3b6..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_XLarge.png deleted file mode 100644 index ac7d05052..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/ShockClamps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Egg1.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Egg1.png deleted file mode 100644 index cdb443035..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Egg1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Egg2.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Egg2.png deleted file mode 100644 index 78fe456ef..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Egg2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Tape1.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Tape1.png deleted file mode 100644 index 404a52ea0..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Tape1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Tape2.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Tape2.png deleted file mode 100644 index 8fad04cc1..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Large_Tape2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Egg1.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Egg1.png deleted file mode 100644 index 256a4f112..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Egg1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Egg2.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Egg2.png deleted file mode 100644 index 1bc09abca..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Egg2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Tape1.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Tape1.png deleted file mode 100644 index 05753b7e7..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Tape1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Tape2.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Tape2.png deleted file mode 100644 index 48f2bbacf..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Normal_Tape2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Egg1.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Egg1.png deleted file mode 100644 index 2a0acab4b..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Egg1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Egg2.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Egg2.png deleted file mode 100644 index 8fe6eec36..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Egg2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Tape1.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Tape1.png deleted file mode 100644 index ffe752f3b..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Tape1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Tape2.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Tape2.png deleted file mode 100644 index 3554e6d71..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_Small_Tape2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Egg1.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Egg1.png deleted file mode 100644 index fc08df967..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Egg1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Egg2.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Egg2.png deleted file mode 100644 index e794f73c1..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Egg2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Tape1.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Tape1.png deleted file mode 100644 index d4e360840..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Tape1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Tape2.png b/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Tape2.png deleted file mode 100644 index 89cd475f3..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/TapedVibeEggs_XLarge_Tape2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_Large.png b/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_Large.png deleted file mode 100644 index 46a9ebcee..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_Normal.png b/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_Normal.png deleted file mode 100644 index ce918d250..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_Small.png b/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_Small.png deleted file mode 100644 index 1c6e50395..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_XLarge.png b/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_XLarge.png deleted file mode 100644 index a806e4e3c..000000000 Binary files a/Assets/Female3DCG/ItemNipples/AllFours/VibeNippleClamp_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/BellClamps_Large.png b/Assets/Female3DCG/ItemNipples/BellClamps_Large.png deleted file mode 100644 index 672d348b3..000000000 Binary files a/Assets/Female3DCG/ItemNipples/BellClamps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/BellClamps_Normal.png b/Assets/Female3DCG/ItemNipples/BellClamps_Normal.png deleted file mode 100644 index ef1c4ff2e..000000000 Binary files a/Assets/Female3DCG/ItemNipples/BellClamps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/BellClamps_Small.png b/Assets/Female3DCG/ItemNipples/BellClamps_Small.png deleted file mode 100644 index 98f9d5192..000000000 Binary files a/Assets/Female3DCG/ItemNipples/BellClamps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/BellClamps_XLarge.png b/Assets/Female3DCG/ItemNipples/BellClamps_XLarge.png deleted file mode 100644 index 26baa15b7..000000000 Binary files a/Assets/Female3DCG/ItemNipples/BellClamps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Chain.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Chain.png deleted file mode 100644 index a26a61ff2..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Chain2.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Chain2.png deleted file mode 100644 index 31e513bcd..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Chain2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Clamp.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Clamp.png deleted file mode 100644 index 3c0972993..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Clamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Metal.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Metal.png deleted file mode 100644 index a50437f88..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Large_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Chain.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Chain.png deleted file mode 100644 index 413ffa89e..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Chain2.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Chain2.png deleted file mode 100644 index 52bbee6b9..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Chain2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Clamp.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Clamp.png deleted file mode 100644 index 060709794..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Clamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Metal.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Metal.png deleted file mode 100644 index fe7530536..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Normal_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Chain.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Chain.png deleted file mode 100644 index 061214d7d..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Chain2.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Chain2.png deleted file mode 100644 index 9a50fc437..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Chain2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Clamp.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Clamp.png deleted file mode 100644 index 2305a946d..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Clamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Metal.png b/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Metal.png deleted file mode 100644 index db83a9fa9..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_Small_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Chain.png b/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Chain.png deleted file mode 100644 index bf86725c1..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Chain2.png b/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Chain2.png deleted file mode 100644 index c338de3d1..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Chain2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Clamp.png b/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Clamp.png deleted file mode 100644 index 7ba134be7..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Clamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Metal.png b/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Metal.png deleted file mode 100644 index 103f7fb65..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainClamp_XLarge_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainTassles_Large.png b/Assets/Female3DCG/ItemNipples/ChainTassles_Large.png deleted file mode 100644 index 4b0b10196..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainTassles_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainTassles_Normal.png b/Assets/Female3DCG/ItemNipples/ChainTassles_Normal.png deleted file mode 100644 index a91b7edeb..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainTassles_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainTassles_Small.png b/Assets/Female3DCG/ItemNipples/ChainTassles_Small.png deleted file mode 100644 index 68e6952a8..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainTassles_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChainTassles_XLarge.png b/Assets/Female3DCG/ItemNipples/ChainTassles_XLarge.png deleted file mode 100644 index aeca89cb7..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChainTassles_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_Large.png b/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_Large.png deleted file mode 100644 index 6e1f6ae16..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_Normal.png b/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_Normal.png deleted file mode 100644 index c57005415..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_Small.png b/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_Small.png deleted file mode 100644 index a553b659a..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_XLarge.png b/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_XLarge.png deleted file mode 100644 index 962315fa0..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ChopStickNippleClamps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Clothespins_Large.png b/Assets/Female3DCG/ItemNipples/Clothespins_Large.png deleted file mode 100644 index 9c435f0b8..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Clothespins_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Clothespins_Normal.png b/Assets/Female3DCG/ItemNipples/Clothespins_Normal.png deleted file mode 100644 index ff37599e8..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Clothespins_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Clothespins_Small.png b/Assets/Female3DCG/ItemNipples/Clothespins_Small.png deleted file mode 100644 index 29fb821c1..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Clothespins_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Clothespins_XLarge.png b/Assets/Female3DCG/ItemNipples/Clothespins_XLarge.png deleted file mode 100644 index a01bde45f..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Clothespins_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/HeartPasties_Large.png b/Assets/Female3DCG/ItemNipples/HeartPasties_Large.png deleted file mode 100644 index 832596025..000000000 Binary files a/Assets/Female3DCG/ItemNipples/HeartPasties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/HeartPasties_Normal.png b/Assets/Female3DCG/ItemNipples/HeartPasties_Normal.png deleted file mode 100644 index 285205dd8..000000000 Binary files a/Assets/Female3DCG/ItemNipples/HeartPasties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/HeartPasties_Small.png b/Assets/Female3DCG/ItemNipples/HeartPasties_Small.png deleted file mode 100644 index d2c993b40..000000000 Binary files a/Assets/Female3DCG/ItemNipples/HeartPasties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/HeartPasties_XLarge.png b/Assets/Female3DCG/ItemNipples/HeartPasties_XLarge.png deleted file mode 100644 index 99219a245..000000000 Binary files a/Assets/Female3DCG/ItemNipples/HeartPasties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_Large.png b/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_Large.png deleted file mode 100644 index e36eb0055..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_Normal.png b/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_Normal.png deleted file mode 100644 index c4e4e2a6b..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_Small.png b/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_Small.png deleted file mode 100644 index da0430607..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_XLarge.png b/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_XLarge.png deleted file mode 100644 index fd4d47c42..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Hogtied/LactationPump_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/KittyPasties_Large.png b/Assets/Female3DCG/ItemNipples/KittyPasties_Large.png deleted file mode 100644 index 25401c4d9..000000000 Binary files a/Assets/Female3DCG/ItemNipples/KittyPasties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/KittyPasties_Normal.png b/Assets/Female3DCG/ItemNipples/KittyPasties_Normal.png deleted file mode 100644 index c46a4b370..000000000 Binary files a/Assets/Female3DCG/ItemNipples/KittyPasties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/KittyPasties_Small.png b/Assets/Female3DCG/ItemNipples/KittyPasties_Small.png deleted file mode 100644 index edd06b6eb..000000000 Binary files a/Assets/Female3DCG/ItemNipples/KittyPasties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/KittyPasties_XLarge.png b/Assets/Female3DCG/ItemNipples/KittyPasties_XLarge.png deleted file mode 100644 index 847f89dce..000000000 Binary files a/Assets/Female3DCG/ItemNipples/KittyPasties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_Large.png b/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_Large.png deleted file mode 100644 index 6a2a6ced3..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_Normal.png b/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_Normal.png deleted file mode 100644 index af275e623..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_Small.png b/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_Small.png deleted file mode 100644 index fac71252c..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_XLarge.png b/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_XLarge.png deleted file mode 100644 index 5006b4707..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Kneel/LactationPump_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_Large.png b/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_Large.png deleted file mode 100644 index ab6ca9490..000000000 Binary files a/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_Normal.png b/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_Normal.png deleted file mode 100644 index c9459d48c..000000000 Binary files a/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_Small.png b/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_Small.png deleted file mode 100644 index 1a501edd8..000000000 Binary files a/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_XLarge.png b/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_XLarge.png deleted file mode 100644 index 4dd22313c..000000000 Binary files a/Assets/Female3DCG/ItemNipples/KneelingSpread/LactationPump_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/LactationPump_Large.png b/Assets/Female3DCG/ItemNipples/LactationPump_Large.png deleted file mode 100644 index 5ad7187fe..000000000 Binary files a/Assets/Female3DCG/ItemNipples/LactationPump_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/LactationPump_Normal.png b/Assets/Female3DCG/ItemNipples/LactationPump_Normal.png deleted file mode 100644 index c1c837eb4..000000000 Binary files a/Assets/Female3DCG/ItemNipples/LactationPump_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/LactationPump_Small.png b/Assets/Female3DCG/ItemNipples/LactationPump_Small.png deleted file mode 100644 index 7b576f172..000000000 Binary files a/Assets/Female3DCG/ItemNipples/LactationPump_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/LactationPump_XLarge.png b/Assets/Female3DCG/ItemNipples/LactationPump_XLarge.png deleted file mode 100644 index 20f2d6485..000000000 Binary files a/Assets/Female3DCG/ItemNipples/LactationPump_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleClamp_Large.png b/Assets/Female3DCG/ItemNipples/NippleClamp_Large.png deleted file mode 100644 index 7d231f6a5..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleClamp_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleClamp_Normal.png b/Assets/Female3DCG/ItemNipples/NippleClamp_Normal.png deleted file mode 100644 index e7aecbbd5..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleClamp_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleClamp_Small.png b/Assets/Female3DCG/ItemNipples/NippleClamp_Small.png deleted file mode 100644 index d875fee79..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleClamp_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleClamp_XLarge.png b/Assets/Female3DCG/ItemNipples/NippleClamp_XLarge.png deleted file mode 100644 index 0191a9632..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleClamp_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleSuctionCups_Large.png b/Assets/Female3DCG/ItemNipples/NippleSuctionCups_Large.png deleted file mode 100644 index 9739ebbc0..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleSuctionCups_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleSuctionCups_Normal.png b/Assets/Female3DCG/ItemNipples/NippleSuctionCups_Normal.png deleted file mode 100644 index b9813d63a..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleSuctionCups_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleSuctionCups_Small.png b/Assets/Female3DCG/ItemNipples/NippleSuctionCups_Small.png deleted file mode 100644 index 4858d4d91..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleSuctionCups_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleSuctionCups_XLarge.png b/Assets/Female3DCG/ItemNipples/NippleSuctionCups_XLarge.png deleted file mode 100644 index 6fd2e1dc2..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleSuctionCups_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleTape_Large.png b/Assets/Female3DCG/ItemNipples/NippleTape_Large.png deleted file mode 100644 index 0e63e038d..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleTape_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleTape_Normal.png b/Assets/Female3DCG/ItemNipples/NippleTape_Normal.png deleted file mode 100644 index 7b4cebbdc..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleTape_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleTape_Small.png b/Assets/Female3DCG/ItemNipples/NippleTape_Small.png deleted file mode 100644 index 08a1acb76..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleTape_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleTape_XLarge.png b/Assets/Female3DCG/ItemNipples/NippleTape_XLarge.png deleted file mode 100644 index abe173658..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleTape_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleWeightClamps_Large.png b/Assets/Female3DCG/ItemNipples/NippleWeightClamps_Large.png deleted file mode 100644 index 8daa3cb8e..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleWeightClamps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleWeightClamps_Normal.png b/Assets/Female3DCG/ItemNipples/NippleWeightClamps_Normal.png deleted file mode 100644 index 074bbec8a..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleWeightClamps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleWeightClamps_Small.png b/Assets/Female3DCG/ItemNipples/NippleWeightClamps_Small.png deleted file mode 100644 index 17ee2a054..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleWeightClamps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/NippleWeightClamps_XLarge.png b/Assets/Female3DCG/ItemNipples/NippleWeightClamps_XLarge.png deleted file mode 100644 index ce31d6ff6..000000000 Binary files a/Assets/Female3DCG/ItemNipples/NippleWeightClamps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/PlateClamps_Large.png b/Assets/Female3DCG/ItemNipples/PlateClamps_Large.png deleted file mode 100644 index 51d1bf6db..000000000 Binary files a/Assets/Female3DCG/ItemNipples/PlateClamps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/PlateClamps_LargeTight.png b/Assets/Female3DCG/ItemNipples/PlateClamps_LargeTight.png deleted file mode 100644 index 47e909861..000000000 Binary files a/Assets/Female3DCG/ItemNipples/PlateClamps_LargeTight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/PlateClamps_Normal.png b/Assets/Female3DCG/ItemNipples/PlateClamps_Normal.png deleted file mode 100644 index 6fd132cd4..000000000 Binary files a/Assets/Female3DCG/ItemNipples/PlateClamps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/PlateClamps_NormalTight.png b/Assets/Female3DCG/ItemNipples/PlateClamps_NormalTight.png deleted file mode 100644 index 12af3df1e..000000000 Binary files a/Assets/Female3DCG/ItemNipples/PlateClamps_NormalTight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/PlateClamps_Small.png b/Assets/Female3DCG/ItemNipples/PlateClamps_Small.png deleted file mode 100644 index 662667683..000000000 Binary files a/Assets/Female3DCG/ItemNipples/PlateClamps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/PlateClamps_SmallTight.png b/Assets/Female3DCG/ItemNipples/PlateClamps_SmallTight.png deleted file mode 100644 index a628a9ff0..000000000 Binary files a/Assets/Female3DCG/ItemNipples/PlateClamps_SmallTight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/PlateClamps_XLarge.png b/Assets/Female3DCG/ItemNipples/PlateClamps_XLarge.png deleted file mode 100644 index 425af290b..000000000 Binary files a/Assets/Female3DCG/ItemNipples/PlateClamps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/PlateClamps_XLargeTight.png b/Assets/Female3DCG/ItemNipples/PlateClamps_XLargeTight.png deleted file mode 100644 index f35b1745e..000000000 Binary files a/Assets/Female3DCG/ItemNipples/PlateClamps_XLargeTight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/BellClamps.png b/Assets/Female3DCG/ItemNipples/Preview/BellClamps.png deleted file mode 100644 index 26baa15b7..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/BellClamps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/ChainClamp.png b/Assets/Female3DCG/ItemNipples/Preview/ChainClamp.png deleted file mode 100644 index b06e03919..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/ChainClamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/ChainTassles.png b/Assets/Female3DCG/ItemNipples/Preview/ChainTassles.png deleted file mode 100644 index 32c165c1a..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/ChainTassles.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/ChopStickNippleClamps.png b/Assets/Female3DCG/ItemNipples/Preview/ChopStickNippleClamps.png deleted file mode 100644 index 781f3dcc9..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/ChopStickNippleClamps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/Clothespins.png b/Assets/Female3DCG/ItemNipples/Preview/Clothespins.png deleted file mode 100644 index 72636ee77..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/Clothespins.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/HeartPasties.png b/Assets/Female3DCG/ItemNipples/Preview/HeartPasties.png deleted file mode 100644 index 1484d21b1..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/HeartPasties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/KittyPasties.png b/Assets/Female3DCG/ItemNipples/Preview/KittyPasties.png deleted file mode 100644 index 99c86a398..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/KittyPasties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/LactationPump.png b/Assets/Female3DCG/ItemNipples/Preview/LactationPump.png deleted file mode 100644 index 71be8e514..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/LactationPump.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/NippleClamp.png b/Assets/Female3DCG/ItemNipples/Preview/NippleClamp.png deleted file mode 100644 index 8ad22a49b..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/NippleClamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/NippleSuctionCups.png b/Assets/Female3DCG/ItemNipples/Preview/NippleSuctionCups.png deleted file mode 100644 index c79824bc3..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/NippleSuctionCups.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/NippleTape.png b/Assets/Female3DCG/ItemNipples/Preview/NippleTape.png deleted file mode 100644 index 725f147d0..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/NippleTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/NippleWeightClamps.png b/Assets/Female3DCG/ItemNipples/Preview/NippleWeightClamps.png deleted file mode 100644 index 16ec711ab..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/NippleWeightClamps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/PlateClamps.png b/Assets/Female3DCG/ItemNipples/Preview/PlateClamps.png deleted file mode 100644 index 6faa38f97..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/PlateClamps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/ScrewClamps.png b/Assets/Female3DCG/ItemNipples/Preview/ScrewClamps.png deleted file mode 100644 index 92025f71b..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/ScrewClamps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/ShockClamps.png b/Assets/Female3DCG/ItemNipples/Preview/ShockClamps.png deleted file mode 100644 index a62ec5225..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/ShockClamps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/StretchClovers.png b/Assets/Female3DCG/ItemNipples/Preview/StretchClovers.png deleted file mode 100644 index da3e0b94a..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/StretchClovers.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/TapedVibeEggs.png b/Assets/Female3DCG/ItemNipples/Preview/TapedVibeEggs.png deleted file mode 100644 index 084791bd6..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/TapedVibeEggs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/VibeNippleClamp.png b/Assets/Female3DCG/ItemNipples/Preview/VibeNippleClamp.png deleted file mode 100644 index a44a2b013..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/VibeNippleClamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/Preview/VibratorRemote.png b/Assets/Female3DCG/ItemNipples/Preview/VibratorRemote.png deleted file mode 100644 index 47465a6f7..000000000 Binary files a/Assets/Female3DCG/ItemNipples/Preview/VibratorRemote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ScrewClamps_Large.png b/Assets/Female3DCG/ItemNipples/ScrewClamps_Large.png deleted file mode 100644 index cdcfaf5bc..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ScrewClamps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ScrewClamps_Normal.png b/Assets/Female3DCG/ItemNipples/ScrewClamps_Normal.png deleted file mode 100644 index 80a4980ab..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ScrewClamps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ScrewClamps_Small.png b/Assets/Female3DCG/ItemNipples/ScrewClamps_Small.png deleted file mode 100644 index eab2565a0..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ScrewClamps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ScrewClamps_XLarge.png b/Assets/Female3DCG/ItemNipples/ScrewClamps_XLarge.png deleted file mode 100644 index b77ea4385..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ScrewClamps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ShockClamps_Large.png b/Assets/Female3DCG/ItemNipples/ShockClamps_Large.png deleted file mode 100644 index e70680e34..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ShockClamps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ShockClamps_Normal.png b/Assets/Female3DCG/ItemNipples/ShockClamps_Normal.png deleted file mode 100644 index 833a90bf2..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ShockClamps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ShockClamps_Small.png b/Assets/Female3DCG/ItemNipples/ShockClamps_Small.png deleted file mode 100644 index 3cdb3f3b6..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ShockClamps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/ShockClamps_XLarge.png b/Assets/Female3DCG/ItemNipples/ShockClamps_XLarge.png deleted file mode 100644 index ac7d05052..000000000 Binary files a/Assets/Female3DCG/ItemNipples/ShockClamps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/StretchClovers_Large_Clamps.png b/Assets/Female3DCG/ItemNipples/StretchClovers_Large_Clamps.png deleted file mode 100644 index 16986b602..000000000 Binary files a/Assets/Female3DCG/ItemNipples/StretchClovers_Large_Clamps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/StretchClovers_Large_Frame.png b/Assets/Female3DCG/ItemNipples/StretchClovers_Large_Frame.png deleted file mode 100644 index 613924482..000000000 Binary files a/Assets/Female3DCG/ItemNipples/StretchClovers_Large_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/StretchClovers_Normal_Clamps.png b/Assets/Female3DCG/ItemNipples/StretchClovers_Normal_Clamps.png deleted file mode 100644 index 7d0d6106d..000000000 Binary files a/Assets/Female3DCG/ItemNipples/StretchClovers_Normal_Clamps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/StretchClovers_Normal_Frame.png b/Assets/Female3DCG/ItemNipples/StretchClovers_Normal_Frame.png deleted file mode 100644 index 27237eb3a..000000000 Binary files a/Assets/Female3DCG/ItemNipples/StretchClovers_Normal_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/StretchClovers_Small_Clamps.png b/Assets/Female3DCG/ItemNipples/StretchClovers_Small_Clamps.png deleted file mode 100644 index 774d7c5a1..000000000 Binary files a/Assets/Female3DCG/ItemNipples/StretchClovers_Small_Clamps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/StretchClovers_Small_Frame.png b/Assets/Female3DCG/ItemNipples/StretchClovers_Small_Frame.png deleted file mode 100644 index c1a6bdf3d..000000000 Binary files a/Assets/Female3DCG/ItemNipples/StretchClovers_Small_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/StretchClovers_XLarge_Clamps.png b/Assets/Female3DCG/ItemNipples/StretchClovers_XLarge_Clamps.png deleted file mode 100644 index b80c2c175..000000000 Binary files a/Assets/Female3DCG/ItemNipples/StretchClovers_XLarge_Clamps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/StretchClovers_XLarge_Frame.png b/Assets/Female3DCG/ItemNipples/StretchClovers_XLarge_Frame.png deleted file mode 100644 index c43598292..000000000 Binary files a/Assets/Female3DCG/ItemNipples/StretchClovers_XLarge_Frame.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large.png deleted file mode 100644 index ee68578c5..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Egg1.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Egg1.png deleted file mode 100644 index ed9500094..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Egg1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Egg2.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Egg2.png deleted file mode 100644 index cca7f40dc..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Egg2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Tape1.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Tape1.png deleted file mode 100644 index 879a7776a..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Tape1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Tape2.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Tape2.png deleted file mode 100644 index 4af254c5f..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Large_Tape2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal.png deleted file mode 100644 index ece164ba9..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Egg1.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Egg1.png deleted file mode 100644 index 9bb7f5422..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Egg1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Egg2.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Egg2.png deleted file mode 100644 index 108bfd1f3..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Egg2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Tape1.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Tape1.png deleted file mode 100644 index 550e70e49..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Tape1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Tape2.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Tape2.png deleted file mode 100644 index e27dc7a26..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Normal_Tape2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Egg1.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Egg1.png deleted file mode 100644 index 136b6fa98..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Egg1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Egg2.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Egg2.png deleted file mode 100644 index 6f44c7f52..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Egg2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Tape1.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Tape1.png deleted file mode 100644 index d62c73719..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Tape1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Tape2.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Tape2.png deleted file mode 100644 index 2d3b24501..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_Small_Tape2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Egg1.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Egg1.png deleted file mode 100644 index d3d685ed8..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Egg1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Egg2.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Egg2.png deleted file mode 100644 index 185253a83..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Egg2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Tape1.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Tape1.png deleted file mode 100644 index e3571f357..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Tape1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Tape2.png b/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Tape2.png deleted file mode 100644 index 1bdc5b97c..000000000 Binary files a/Assets/Female3DCG/ItemNipples/TapedVibeEggs_XLarge_Tape2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/VibeNippleClamp_Large.png b/Assets/Female3DCG/ItemNipples/VibeNippleClamp_Large.png deleted file mode 100644 index e85be2c83..000000000 Binary files a/Assets/Female3DCG/ItemNipples/VibeNippleClamp_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/VibeNippleClamp_Normal.png b/Assets/Female3DCG/ItemNipples/VibeNippleClamp_Normal.png deleted file mode 100644 index 57f3dd3d2..000000000 Binary files a/Assets/Female3DCG/ItemNipples/VibeNippleClamp_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/VibeNippleClamp_Small.png b/Assets/Female3DCG/ItemNipples/VibeNippleClamp_Small.png deleted file mode 100644 index 0c556fe0b..000000000 Binary files a/Assets/Female3DCG/ItemNipples/VibeNippleClamp_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipples/VibeNippleClamp_XLarge.png b/Assets/Female3DCG/ItemNipples/VibeNippleClamp_XLarge.png deleted file mode 100644 index dd0b6f534..000000000 Binary files a/Assets/Female3DCG/ItemNipples/VibeNippleClamp_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Large.png deleted file mode 100644 index e85eb76e2..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Normal.png deleted file mode 100644 index 1b8182521..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Small.png deleted file mode 100644 index 897ef11c5..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_XLarge.png deleted file mode 100644 index 23b9c5899..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BarbellPiercing_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Large.png deleted file mode 100644 index 1c09f4b36..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Normal.png deleted file mode 100644 index f1cfedbef..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Small.png deleted file mode 100644 index a07ff42d8..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_XLarge.png deleted file mode 100644 index d2feb7b86..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/BellPiercing_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Large.png deleted file mode 100644 index 9b295a45d..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Normal.png deleted file mode 100644 index 3faa878b3..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Small.png deleted file mode 100644 index 57fb4d1ce..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_XLarge.png deleted file mode 100644 index 1f6eadbb1..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/CrossedStraightPiercing_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Large.png deleted file mode 100644 index d76ee337f..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Normal.png deleted file mode 100644 index 6ffe58931..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Small.png deleted file mode 100644 index 11222ca8b..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_XLarge.png deleted file mode 100644 index 44b28b167..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Large.png deleted file mode 100644 index dbc7096dd..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Normal.png deleted file mode 100644 index f865cfa68..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Small.png deleted file mode 100644 index 084e453a8..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_XLarge.png deleted file mode 100644 index 5da6db903..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Large.png deleted file mode 100644 index 8b60b96e4..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Normal.png deleted file mode 100644 index 30f8499cd..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Small.png deleted file mode 100644 index 0b1cf3960..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_XLarge.png deleted file mode 100644 index 8ec4d6721..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleAccessory3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Large.png deleted file mode 100644 index cb5e408bb..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Normal.png deleted file mode 100644 index 803ba409e..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Small.png deleted file mode 100644 index d7b2784e4..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_XLarge.png deleted file mode 100644 index d0831e860..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Large.png deleted file mode 100644 index ea6ce9e48..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Normal.png deleted file mode 100644 index 3b0963231..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Small.png deleted file mode 100644 index eefed4165..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_XLarge.png deleted file mode 100644 index df1cf1b98..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/NippleChastityPiercing2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_Chain.png deleted file mode 100644 index 0b246eb92..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_Piercings.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_Piercings.png deleted file mode 100644 index 5fbb2ffb7..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_Piercings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_PiercingsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_PiercingsChained.png deleted file mode 100644 index 40604ae96..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_PiercingsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_Weights.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_Weights.png deleted file mode 100644 index 08a05c403..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_Weights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_WeightsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_WeightsChained.png deleted file mode 100644 index eb0860fff..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Large_WeightsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_Chain.png deleted file mode 100644 index ba1a7808c..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_Piercings.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_Piercings.png deleted file mode 100644 index 8a8d39cb1..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_Piercings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_PiercingsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_PiercingsChained.png deleted file mode 100644 index 5bfba31f1..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_PiercingsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_Weights.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_Weights.png deleted file mode 100644 index aa856ef8d..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_Weights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_WeightsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_WeightsChained.png deleted file mode 100644 index 6732db272..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Normal_WeightsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_Chain.png deleted file mode 100644 index 16b98c527..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_Piercings.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_Piercings.png deleted file mode 100644 index 2e836b33a..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_Piercings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_PiercingsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_PiercingsChained.png deleted file mode 100644 index fda981725..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_PiercingsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_Weights.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_Weights.png deleted file mode 100644 index 80c1c60d0..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_Weights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_WeightsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_WeightsChained.png deleted file mode 100644 index f8d831732..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_Small_WeightsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_Chain.png deleted file mode 100644 index b465b63eb..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_Piercings.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_Piercings.png deleted file mode 100644 index c66261422..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_Piercings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_PiercingsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_PiercingsChained.png deleted file mode 100644 index 81923871f..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_PiercingsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_Weights.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_Weights.png deleted file mode 100644 index 39fb2239b..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_Weights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_WeightsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_WeightsChained.png deleted file mode 100644 index 02570597f..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/RoundPiercing_XLarge_WeightsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Large.png deleted file mode 100644 index 700e2c984..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Normal.png deleted file mode 100644 index 5c56737e5..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Small.png deleted file mode 100644 index 18f2c9763..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_XLarge.png deleted file mode 100644 index 3d89a2660..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/StraightPiercing_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Large_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Large_Heart.png deleted file mode 100644 index 869ab47e5..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Large_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Large_Ring.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Large_Ring.png deleted file mode 100644 index dcf9c00f8..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Large_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Normal_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Normal_Heart.png deleted file mode 100644 index f9fb3c8fd..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Normal_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Normal_Ring.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Normal_Ring.png deleted file mode 100644 index d25db9830..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Normal_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Small_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Small_Heart.png deleted file mode 100644 index a55f994e2..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Small_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Small_Ring.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Small_Ring.png deleted file mode 100644 index 0843f9e99..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_Small_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_XLarge_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_XLarge_Heart.png deleted file mode 100644 index d5eb4f5be..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_XLarge_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_XLarge_Ring.png b/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_XLarge_Ring.png deleted file mode 100644 index 46cb0260f..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/AllFours/VibeHeartPiercings_XLarge_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Large.png deleted file mode 100644 index 122ea8081..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Normal.png deleted file mode 100644 index 039f9e2ea..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Small.png deleted file mode 100644 index 2e67488bf..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_XLarge.png deleted file mode 100644 index 1570e6d1f..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/BarbellPiercing_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Large.png deleted file mode 100644 index d3ab2f396..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Normal.png deleted file mode 100644 index d49d93582..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Small.png deleted file mode 100644 index f0799dc34..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_XLarge.png deleted file mode 100644 index 6e61ad2aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/BellPiercing_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Large.png deleted file mode 100644 index ce859e0be..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Normal.png deleted file mode 100644 index ebc5d58d3..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Small.png deleted file mode 100644 index 3eb92c1fd..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_XLarge.png deleted file mode 100644 index f48135a21..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/CrossedStraightPiercing_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Large_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Large_Chain.png deleted file mode 100644 index b73ba248a..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Large_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Large_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Large_Heart.png deleted file mode 100644 index 59a7fef2f..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Large_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Large_Piercing.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Large_Piercing.png deleted file mode 100644 index f397e5c8a..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Large_Piercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Normal_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Normal_Chain.png deleted file mode 100644 index b416bc842..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Normal_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Normal_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Normal_Heart.png deleted file mode 100644 index a8080be52..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Normal_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Normal_Piercing.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Normal_Piercing.png deleted file mode 100644 index 2e99b8c8f..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Normal_Piercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Small_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Small_Chain.png deleted file mode 100644 index 0d32a3e94..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Small_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Small_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Small_Heart.png deleted file mode 100644 index 48b97cdcd..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Small_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Small_Piercing.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Small_Piercing.png deleted file mode 100644 index 60271247a..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_Small_Piercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_XLarge_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_XLarge_Chain.png deleted file mode 100644 index 2390d70ec..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_XLarge_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_XLarge_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_XLarge_Heart.png deleted file mode 100644 index cbc38ceca..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_XLarge_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_XLarge_Piercing.png b/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_XLarge_Piercing.png deleted file mode 100644 index 54464d916..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NecklacePiercingChain_XLarge_Piercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Large.png deleted file mode 100644 index f12903891..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Normal.png deleted file mode 100644 index 8227cb29d..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Small.png deleted file mode 100644 index 387c98c8f..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_XLarge.png deleted file mode 100644 index 10f9da0df..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Large.png deleted file mode 100644 index fa88bf36c..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Normal.png deleted file mode 100644 index aaafdd916..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Small.png deleted file mode 100644 index 506e81678..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_XLarge.png deleted file mode 100644 index 6d1cad67a..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Large.png deleted file mode 100644 index 19dd39543..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Normal.png deleted file mode 100644 index e16a0d25b..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Small.png deleted file mode 100644 index 0e5ecd4e4..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_XLarge.png deleted file mode 100644 index fdb7e463d..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleAccessory3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Large.png deleted file mode 100644 index cb5e408bb..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Normal.png deleted file mode 100644 index 803ba409e..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Small.png deleted file mode 100644 index d7b2784e4..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_XLarge.png deleted file mode 100644 index d0831e860..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Large.png deleted file mode 100644 index ea6ce9e48..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Normal.png deleted file mode 100644 index 3b0963231..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Small.png deleted file mode 100644 index eefed4165..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_XLarge.png deleted file mode 100644 index df1cf1b98..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/NippleChastityPiercing2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/BarbellPiercing.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/BarbellPiercing.png deleted file mode 100644 index c90755025..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/BarbellPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/BellPiercing.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/BellPiercing.png deleted file mode 100644 index 6e61ad2aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/BellPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/CrossedStraightPiercing.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/CrossedStraightPiercing.png deleted file mode 100644 index 6d9e78e56..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/CrossedStraightPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NecklacePiercingChain.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/NecklacePiercingChain.png deleted file mode 100644 index 6308e7382..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NecklacePiercingChain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleAccessory1.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleAccessory1.png deleted file mode 100644 index c6cdeb63d..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleAccessory1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleAccessory2.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleAccessory2.png deleted file mode 100644 index b76e26e43..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleAccessory2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleAccessory3.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleAccessory3.png deleted file mode 100644 index 5bcee7d09..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleAccessory3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleChastityPiercing1.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleChastityPiercing1.png deleted file mode 100644 index f929f7adc..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleChastityPiercing1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleChastityPiercing2.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleChastityPiercing2.png deleted file mode 100644 index 8bb7f77db..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/NippleChastityPiercing2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/RoundPiercing.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/RoundPiercing.png deleted file mode 100644 index 834341152..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/RoundPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/StraightPiercing.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/StraightPiercing.png deleted file mode 100644 index 6d9e78e56..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/StraightPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/VibeHeartPiercings.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/VibeHeartPiercings.png deleted file mode 100644 index 706c306b9..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/VibeHeartPiercings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/Preview/WeightedPiercing.png b/Assets/Female3DCG/ItemNipplesPiercings/Preview/WeightedPiercing.png deleted file mode 100644 index 72cfeaddd..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/Preview/WeightedPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_Chain.png deleted file mode 100644 index e901fc094..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_Piercings.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_Piercings.png deleted file mode 100644 index 32f3b9864..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_Piercings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_PiercingsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_PiercingsChained.png deleted file mode 100644 index 81b9b3af1..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_PiercingsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_Weights.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_Weights.png deleted file mode 100644 index 079117242..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_Weights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_WeightsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_WeightsChained.png deleted file mode 100644 index 0d1f0ca59..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Large_WeightsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_Chain.png deleted file mode 100644 index 05e853a37..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_Piercings.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_Piercings.png deleted file mode 100644 index 6f2d9c515..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_Piercings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_PiercingsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_PiercingsChained.png deleted file mode 100644 index 6bf9e1a03..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_PiercingsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_Weights.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_Weights.png deleted file mode 100644 index 6986a2ad9..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_Weights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_WeightsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_WeightsChained.png deleted file mode 100644 index c355d5d82..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Normal_WeightsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_Chain.png deleted file mode 100644 index 381092162..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_Piercings.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_Piercings.png deleted file mode 100644 index c60e9ef01..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_Piercings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_PiercingsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_PiercingsChained.png deleted file mode 100644 index 96dd8a4f1..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_PiercingsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_Weights.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_Weights.png deleted file mode 100644 index a2f351d02..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_Weights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_WeightsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_WeightsChained.png deleted file mode 100644 index 8fedbafe9..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_Small_WeightsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_Chain.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_Chain.png deleted file mode 100644 index 6f7dedb83..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_Piercings.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_Piercings.png deleted file mode 100644 index 15b3826f5..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_Piercings.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_PiercingsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_PiercingsChained.png deleted file mode 100644 index 30e02c5e0..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_PiercingsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_Weights.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_Weights.png deleted file mode 100644 index 4885556e5..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_Weights.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_WeightsChained.png b/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_WeightsChained.png deleted file mode 100644 index b22f7a223..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/RoundPiercing_XLarge_WeightsChained.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Large.png b/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Large.png deleted file mode 100644 index 0b8dc1f7c..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Normal.png b/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Normal.png deleted file mode 100644 index a4d0fbdd3..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Small.png b/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Small.png deleted file mode 100644 index ac3c93502..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_XLarge.png b/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_XLarge.png deleted file mode 100644 index 1b5913e97..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/StraightPiercing_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Large_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Large_Heart.png deleted file mode 100644 index f90a4b650..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Large_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Large_Ring.png b/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Large_Ring.png deleted file mode 100644 index 47adca209..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Large_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Normal_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Normal_Heart.png deleted file mode 100644 index d9a4ea3a0..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Normal_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Normal_Ring.png b/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Normal_Ring.png deleted file mode 100644 index 3f3dfab7e..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Normal_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Small_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Small_Heart.png deleted file mode 100644 index 681a35d9a..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Small_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Small_Ring.png b/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Small_Ring.png deleted file mode 100644 index 505f1d043..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_Small_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_XLarge_Heart.png b/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_XLarge_Heart.png deleted file mode 100644 index 287b4da8b..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_XLarge_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_XLarge_Ring.png b/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_XLarge_Ring.png deleted file mode 100644 index 9ffeb2ce4..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/VibeHeartPiercings_XLarge_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/WeightedPiercingChain_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/WeightedPiercingChain_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/WeightedPiercingChain_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNipplesPiercings/WeightedPiercing_Lock.png b/Assets/Female3DCG/ItemNipplesPiercings/WeightedPiercing_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNipplesPiercings/WeightedPiercing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/BarbelPiercing.png b/Assets/Female3DCG/ItemNose/BarbelPiercing.png deleted file mode 100644 index 1d5f6a506..000000000 Binary files a/Assets/Female3DCG/ItemNose/BarbelPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/DuctTape.png b/Assets/Female3DCG/ItemNose/DuctTape.png deleted file mode 100644 index 21f37e4a7..000000000 Binary files a/Assets/Female3DCG/ItemNose/DuctTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Kneel/NoseRing.png b/Assets/Female3DCG/ItemNose/Kneel/NoseRing.png deleted file mode 100644 index e5141955b..000000000 Binary files a/Assets/Female3DCG/ItemNose/Kneel/NoseRing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainLong.png b/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainLong.png deleted file mode 100644 index ad77d71b5..000000000 Binary files a/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainLong_Lock.png b/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainLong_Lock.png deleted file mode 100644 index c85589a57..000000000 Binary files a/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainLong_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainShort.png b/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainShort.png deleted file mode 100644 index 8f3f36165..000000000 Binary files a/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainShort.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainShort_Lock.png b/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainShort_Lock.png deleted file mode 100644 index 52482beca..000000000 Binary files a/Assets/Female3DCG/ItemNose/Kneel/NoseRingChainShort_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Kneel/NoseRingLeash.png b/Assets/Female3DCG/ItemNose/Kneel/NoseRingLeash.png deleted file mode 100644 index 371adea06..000000000 Binary files a/Assets/Female3DCG/ItemNose/Kneel/NoseRingLeash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Kneel/NoseRingLeash_Lock.png b/Assets/Female3DCG/ItemNose/Kneel/NoseRingLeash_Lock.png deleted file mode 100644 index 132d621db..000000000 Binary files a/Assets/Female3DCG/ItemNose/Kneel/NoseRingLeash_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Kneel/NoseRing_Lock.png b/Assets/Female3DCG/ItemNose/Kneel/NoseRing_Lock.png deleted file mode 100644 index 55084a8d5..000000000 Binary files a/Assets/Female3DCG/ItemNose/Kneel/NoseRing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NoseHook_Band.png b/Assets/Female3DCG/ItemNose/NoseHook_Band.png deleted file mode 100644 index 46e246eea..000000000 Binary files a/Assets/Female3DCG/ItemNose/NoseHook_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NoseHook_Hook.png b/Assets/Female3DCG/ItemNose/NoseHook_Hook.png deleted file mode 100644 index 276a82df8..000000000 Binary files a/Assets/Female3DCG/ItemNose/NoseHook_Hook.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NoseHook_Lock.png b/Assets/Female3DCG/ItemNose/NoseHook_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemNose/NoseHook_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NosePlugs.png b/Assets/Female3DCG/ItemNose/NosePlugs.png deleted file mode 100644 index 2a7188711..000000000 Binary files a/Assets/Female3DCG/ItemNose/NosePlugs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NoseRing.png b/Assets/Female3DCG/ItemNose/NoseRing.png deleted file mode 100644 index e5141955b..000000000 Binary files a/Assets/Female3DCG/ItemNose/NoseRing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NoseRingChainLong.png b/Assets/Female3DCG/ItemNose/NoseRingChainLong.png deleted file mode 100644 index bc057ba88..000000000 Binary files a/Assets/Female3DCG/ItemNose/NoseRingChainLong.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NoseRingChainLong_Lock.png b/Assets/Female3DCG/ItemNose/NoseRingChainLong_Lock.png deleted file mode 100644 index 862762805..000000000 Binary files a/Assets/Female3DCG/ItemNose/NoseRingChainLong_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NoseRingChainShort.png b/Assets/Female3DCG/ItemNose/NoseRingChainShort.png deleted file mode 100644 index 8f3f36165..000000000 Binary files a/Assets/Female3DCG/ItemNose/NoseRingChainShort.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NoseRingChainShort_Lock.png b/Assets/Female3DCG/ItemNose/NoseRingChainShort_Lock.png deleted file mode 100644 index 52482beca..000000000 Binary files a/Assets/Female3DCG/ItemNose/NoseRingChainShort_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NoseRingLeash.png b/Assets/Female3DCG/ItemNose/NoseRingLeash.png deleted file mode 100644 index 371adea06..000000000 Binary files a/Assets/Female3DCG/ItemNose/NoseRingLeash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NoseRingLeash_Lock.png b/Assets/Female3DCG/ItemNose/NoseRingLeash_Lock.png deleted file mode 100644 index 132d621db..000000000 Binary files a/Assets/Female3DCG/ItemNose/NoseRingLeash_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/NoseRing_Lock.png b/Assets/Female3DCG/ItemNose/NoseRing_Lock.png deleted file mode 100644 index 55084a8d5..000000000 Binary files a/Assets/Female3DCG/ItemNose/NoseRing_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/PigNoseHook_Band.png b/Assets/Female3DCG/ItemNose/PigNoseHook_Band.png deleted file mode 100644 index 09a100332..000000000 Binary files a/Assets/Female3DCG/ItemNose/PigNoseHook_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/PigNoseHook_Hook.png b/Assets/Female3DCG/ItemNose/PigNoseHook_Hook.png deleted file mode 100644 index 08f59270c..000000000 Binary files a/Assets/Female3DCG/ItemNose/PigNoseHook_Hook.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/PigNose_Nose.png b/Assets/Female3DCG/ItemNose/PigNose_Nose.png deleted file mode 100644 index b1a4b94cf..000000000 Binary files a/Assets/Female3DCG/ItemNose/PigNose_Nose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/PigNose_Strap.png b/Assets/Female3DCG/ItemNose/PigNose_Strap.png deleted file mode 100644 index d8a800639..000000000 Binary files a/Assets/Female3DCG/ItemNose/PigNose_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Preview/BarbelPiercing.png b/Assets/Female3DCG/ItemNose/Preview/BarbelPiercing.png deleted file mode 100644 index c90755025..000000000 Binary files a/Assets/Female3DCG/ItemNose/Preview/BarbelPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Preview/DuctTape.png b/Assets/Female3DCG/ItemNose/Preview/DuctTape.png deleted file mode 100644 index f86bb58bc..000000000 Binary files a/Assets/Female3DCG/ItemNose/Preview/DuctTape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Preview/NoseHook.png b/Assets/Female3DCG/ItemNose/Preview/NoseHook.png deleted file mode 100644 index 85a525f46..000000000 Binary files a/Assets/Female3DCG/ItemNose/Preview/NoseHook.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Preview/NosePlugs.png b/Assets/Female3DCG/ItemNose/Preview/NosePlugs.png deleted file mode 100644 index 7739698cf..000000000 Binary files a/Assets/Female3DCG/ItemNose/Preview/NosePlugs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Preview/NoseRing.png b/Assets/Female3DCG/ItemNose/Preview/NoseRing.png deleted file mode 100644 index ca4942ccf..000000000 Binary files a/Assets/Female3DCG/ItemNose/Preview/NoseRing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Preview/PigNose.png b/Assets/Female3DCG/ItemNose/Preview/PigNose.png deleted file mode 100644 index b01baeef8..000000000 Binary files a/Assets/Female3DCG/ItemNose/Preview/PigNose.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemNose/Preview/PigNoseHook.png b/Assets/Female3DCG/ItemNose/Preview/PigNoseHook.png deleted file mode 100644 index 5fa010569..000000000 Binary files a/Assets/Female3DCG/ItemNose/Preview/PigNoseHook.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Back.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Back.png deleted file mode 100644 index 38ab8591c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Large_Base.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Large_Base.png deleted file mode 100644 index 18d7e8117..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Large_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Large_CrotchPiece.png deleted file mode 100644 index b555182ac..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Large_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Large_WaistBand.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Large_WaistBand.png deleted file mode 100644 index 94dc18de6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Large_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Normal_Base.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Normal_Base.png deleted file mode 100644 index 8c7ba9a0f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Normal_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Normal_CrotchPiece.png deleted file mode 100644 index 253e619f2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Normal_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Normal_WaistBand.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Normal_WaistBand.png deleted file mode 100644 index 94c60b1a6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Normal_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Small_Base.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Small_Base.png deleted file mode 100644 index 5ee4e645c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Small_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Small_CrotchPiece.png deleted file mode 100644 index 902341382..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Small_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Small_WaistBand.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Small_WaistBand.png deleted file mode 100644 index 5c04ad09c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Small_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Tape.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Tape.png deleted file mode 100644 index 091b02942..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_XLarge_Base.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_XLarge_Base.png deleted file mode 100644 index dcc12792d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_XLarge_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_XLarge_CrotchPiece.png deleted file mode 100644 index 237605887..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_XLarge_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_XLarge_WaistBand.png b/Assets/Female3DCG/ItemPelvis/BulkyDiaper_XLarge_WaistBand.png deleted file mode 100644 index 3254e7c29..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/BulkyDiaper_XLarge_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/DiaperHarness_Large.png b/Assets/Female3DCG/ItemPelvis/DiaperHarness_Large.png deleted file mode 100644 index 63b8fb302..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/DiaperHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/DiaperHarness_Lock.png b/Assets/Female3DCG/ItemPelvis/DiaperHarness_Lock.png deleted file mode 100644 index f61cf6754..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/DiaperHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/DiaperHarness_Normal.png b/Assets/Female3DCG/ItemPelvis/DiaperHarness_Normal.png deleted file mode 100644 index 2e3f030a1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/DiaperHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/DiaperHarness_Small.png b/Assets/Female3DCG/ItemPelvis/DiaperHarness_Small.png deleted file mode 100644 index 5b9de9aee..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/DiaperHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/DiaperHarness_XLarge.png b/Assets/Female3DCG/ItemPelvis/DiaperHarness_XLarge.png deleted file mode 100644 index 107808b9d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/DiaperHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Belt_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Belt_3.png deleted file mode 100644 index 062f0ae91..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Belt_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Belt_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Belt_4.png deleted file mode 100644 index 8a25e672a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Belt_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Display_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Display_3.png deleted file mode 100644 index 853a3f5c8..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Display_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Display_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Display_4.png deleted file mode 100644 index bb72fe036..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Display_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Band_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Band_2.png deleted file mode 100644 index 743ce793d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Band_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Band_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Band_3.png deleted file mode 100644 index 508ca6f18..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Band_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Band_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Band_4.png deleted file mode 100644 index 367390a3f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Band_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Belt.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Belt.png deleted file mode 100644 index 4b77db14c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Belt_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Belt_2.png deleted file mode 100644 index 1b5157660..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Belt_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh.png deleted file mode 100644 index 2154e86e3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh2_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh2_3.png deleted file mode 100644 index 5b5aaf87c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh2_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh2_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh2_4.png deleted file mode 100644 index 7cb98081b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh2_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_2.png deleted file mode 100644 index 0a50a7fec..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_3.png deleted file mode 100644 index 5d4d9fad2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_4.pdn b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_4.pdn deleted file mode 100644 index 471c3a4f6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_4.pdn and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_4.png deleted file mode 100644 index 32e772f8b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Large_Mesh_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem0_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem0_PlugCap.png deleted file mode 100644 index ab1b333e0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem0_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem1_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem1_PlugCap.png deleted file mode 100644 index d5677ffa7..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem1_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem2_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem2_PlugCap.png deleted file mode 100644 index ab58d51a4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem2_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem3_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem3_PlugCap.png deleted file mode 100644 index 0f3f6b6aa..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Largem3_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock.png deleted file mode 100644 index 4553ecd5a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock_2.png deleted file mode 100644 index e5e88ef93..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock_3.png deleted file mode 100644 index a309a0be3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock_4.png deleted file mode 100644 index 558f117fd..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Lock_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Band_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Band_2.png deleted file mode 100644 index cbb57f39d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Band_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Band_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Band_3.png deleted file mode 100644 index 512b07c59..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Band_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Band_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Band_4.png deleted file mode 100644 index a098969d1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Band_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Belt.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Belt.png deleted file mode 100644 index 4b77db14c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Belt_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Belt_2.png deleted file mode 100644 index d82c68d00..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Belt_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh.png deleted file mode 100644 index 2154e86e3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh2_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh2_3.png deleted file mode 100644 index ab62a2069..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh2_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh2_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh2_4.png deleted file mode 100644 index 83b6b82fa..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh2_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh_2.png deleted file mode 100644 index a573cd8e3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh_3.png deleted file mode 100644 index e70eca996..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh_4.png deleted file mode 100644 index 4925d86e4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normal_Mesh_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm0_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm0_PlugCap.png deleted file mode 100644 index ab1b333e0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm0_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm1_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm1_PlugCap.png deleted file mode 100644 index 6b3c77ab3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm1_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm2_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm2_PlugCap.png deleted file mode 100644 index ab58d51a4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm2_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm3_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm3_PlugCap.png deleted file mode 100644 index 0f3f6b6aa..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Normalm3_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Plug_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Plug_4.png deleted file mode 100644 index f4769bb4e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Plug_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Screen.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Screen.png deleted file mode 100644 index 944d4981e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Screen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Screen_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Screen_2.png deleted file mode 100644 index 3d34a5457..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Screen_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Band_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Band_2.png deleted file mode 100644 index ca9f3ca31..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Band_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Band_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Band_3.png deleted file mode 100644 index cd4260261..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Band_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Band_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Band_4.png deleted file mode 100644 index 887c71f22..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Band_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Belt.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Belt.png deleted file mode 100644 index 4b77db14c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Belt_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Belt_2.png deleted file mode 100644 index 45f3ead02..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Belt_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh.png deleted file mode 100644 index 2154e86e3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh2_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh2_3.png deleted file mode 100644 index fb856980c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh2_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh2_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh2_4.png deleted file mode 100644 index 0e81af062..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh2_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh_2.png deleted file mode 100644 index a8bc2fbae..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh_3.png deleted file mode 100644 index 4e37bc1c3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh_4.png deleted file mode 100644 index 176fab1d8..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Small_Mesh_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm0_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm0_PlugCap.png deleted file mode 100644 index ab1b333e0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm0_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm1_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm1_PlugCap.png deleted file mode 100644 index fda1da4c2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm1_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm2_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm2_PlugCap.png deleted file mode 100644 index ab58d51a4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm2_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm3_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm3_PlugCap.png deleted file mode 100644 index 0f3f6b6aa..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Smallm3_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Strap_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Strap_4.png deleted file mode 100644 index 18226f28f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_Strap_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Band_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Band_2.png deleted file mode 100644 index 19066a03d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Band_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Band_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Band_3.png deleted file mode 100644 index 6f15c9dc0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Band_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Band_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Band_4.png deleted file mode 100644 index bac8be0b0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Band_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Belt.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Belt.png deleted file mode 100644 index 4b77db14c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Belt_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Belt_2.png deleted file mode 100644 index 2310bdfba..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Belt_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh.png deleted file mode 100644 index 2154e86e3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh2_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh2_3.png deleted file mode 100644 index 8b0aca7fd..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh2_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh2_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh2_4.png deleted file mode 100644 index 712669580..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh2_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh_2.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh_2.png deleted file mode 100644 index c799d6633..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh_2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh_3.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh_3.png deleted file mode 100644 index 743442636..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh_3.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh_4.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh_4.png deleted file mode 100644 index abcca4b81..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLarge_Mesh_4.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem0_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem0_PlugCap.png deleted file mode 100644 index ab1b333e0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem0_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem1_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem1_PlugCap.png deleted file mode 100644 index 7bd020851..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem1_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem2_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem2_PlugCap.png deleted file mode 100644 index ab58d51a4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem2_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem3_PlugCap.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem3_PlugCap.png deleted file mode 100644 index 0f3f6b6aa..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBelt_XLargem3_PlugCap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm0_OLock.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm0_OLock.png deleted file mode 100644 index 302dd2a9f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm0_OLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm0_TLock.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm0_TLock.png deleted file mode 100644 index 97e9e438f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm0_TLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm1_OLock.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm1_OLock.png deleted file mode 100644 index ec5bb15c9..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm1_OLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm1_TLock.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm1_TLock.png deleted file mode 100644 index 4591c8f79..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm1_TLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm2_OLock.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm2_OLock.png deleted file mode 100644 index 4cef98074..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm2_OLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm2_TLock.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm2_TLock.png deleted file mode 100644 index d0ece3422..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm2_TLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm3_OLock.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm3_OLock.png deleted file mode 100644 index 57fe95e59..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm3_OLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm3_TLock.png b/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm3_TLock.png deleted file mode 100644 index 3db52c143..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticChastityBeltm3_TLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Belt.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Belt.png deleted file mode 100644 index e75774519..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Display.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Display.png deleted file mode 100644 index 853a3f5c8..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Band.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Band.png deleted file mode 100644 index 508ca6f18..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Belt.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Belt.png deleted file mode 100644 index f579067ef..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Mesh.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Mesh.png deleted file mode 100644 index 5d4d9fad2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Mesh2.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Mesh2.png deleted file mode 100644 index 5b5aaf87c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Large_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Lock.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Lock.png deleted file mode 100644 index a309a0be3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Normal_Band.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Normal_Band.png deleted file mode 100644 index 512b07c59..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Normal_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Normal_Mesh.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Normal_Mesh.png deleted file mode 100644 index e70eca996..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Normal_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Normal_Mesh2.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Normal_Mesh2.png deleted file mode 100644 index ab62a2069..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Normal_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Small_Band.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Small_Band.png deleted file mode 100644 index cd4260261..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Small_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Small_Mesh.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Small_Mesh.png deleted file mode 100644 index 4e37bc1c3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Small_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Small_Mesh2.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Small_Mesh2.png deleted file mode 100644 index fb856980c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_Small_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_XLarge_Band.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_XLarge_Band.png deleted file mode 100644 index 6f15c9dc0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_XLarge_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_XLarge_Mesh.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_XLarge_Mesh.png deleted file mode 100644 index 743442636..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_XLarge_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_XLarge_Mesh2.png b/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_XLarge_Mesh2.png deleted file mode 100644 index 8b0aca7fd..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/FuturisticTrainingBelt_XLarge_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Large.png b/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Large.png deleted file mode 100644 index 5d4ea070c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Lock.png b/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Lock.png deleted file mode 100644 index 5099553b6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Normal.png b/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Normal.png deleted file mode 100644 index 3229851c8..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Small.png b/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Small.png deleted file mode 100644 index d8757b16f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HarnessPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HarnessPanties1_XLarge.png b/Assets/Female3DCG/ItemPelvis/HarnessPanties1_XLarge.png deleted file mode 100644 index 193931b31..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HarnessPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HarnessPanties2_Large.png b/Assets/Female3DCG/ItemPelvis/HarnessPanties2_Large.png deleted file mode 100644 index 59bfbff89..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HarnessPanties2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HarnessPanties2_Normal.png b/Assets/Female3DCG/ItemPelvis/HarnessPanties2_Normal.png deleted file mode 100644 index 16e99729d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HarnessPanties2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HarnessPanties2_Small.png b/Assets/Female3DCG/ItemPelvis/HarnessPanties2_Small.png deleted file mode 100644 index e572258c4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HarnessPanties2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HarnessPanties2_XLarge.png b/Assets/Female3DCG/ItemPelvis/HarnessPanties2_XLarge.png deleted file mode 100644 index bc8890434..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HarnessPanties2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_Large.png b/Assets/Female3DCG/ItemPelvis/HempRope_Large.png deleted file mode 100644 index 82a6d1aa2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_LargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/HempRope_LargeKikkouHip.png deleted file mode 100644 index 794c0aff6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_LargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_LargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/HempRope_LargeOverPanties.png deleted file mode 100644 index 31ce857c5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_LargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_LargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/HempRope_LargeSwissSeat.png deleted file mode 100644 index 0c15cb315..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_LargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_Normal.png b/Assets/Female3DCG/ItemPelvis/HempRope_Normal.png deleted file mode 100644 index a3699ac8a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_NormalKikkouHip.png b/Assets/Female3DCG/ItemPelvis/HempRope_NormalKikkouHip.png deleted file mode 100644 index 5f7abcff5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_NormalKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_NormalOverPanties.png b/Assets/Female3DCG/ItemPelvis/HempRope_NormalOverPanties.png deleted file mode 100644 index 26d0c0d52..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_NormalOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_NormalSwissSeat.png b/Assets/Female3DCG/ItemPelvis/HempRope_NormalSwissSeat.png deleted file mode 100644 index 88655ddc0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_NormalSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_Small.png b/Assets/Female3DCG/ItemPelvis/HempRope_Small.png deleted file mode 100644 index 056849d5b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_SmallKikkouHip.png b/Assets/Female3DCG/ItemPelvis/HempRope_SmallKikkouHip.png deleted file mode 100644 index 15d3c1c26..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_SmallKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_SmallOverPanties.png b/Assets/Female3DCG/ItemPelvis/HempRope_SmallOverPanties.png deleted file mode 100644 index ce93b72b4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_SmallOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_SmallSwissSeat.png b/Assets/Female3DCG/ItemPelvis/HempRope_SmallSwissSeat.png deleted file mode 100644 index 0abdfb09f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_SmallSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_XLarge.png b/Assets/Female3DCG/ItemPelvis/HempRope_XLarge.png deleted file mode 100644 index 414ca8f62..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_XLargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/HempRope_XLargeKikkouHip.png deleted file mode 100644 index 59a885052..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_XLargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_XLargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/HempRope_XLargeOverPanties.png deleted file mode 100644 index 26d0c0d52..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_XLargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HempRope_XLargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/HempRope_XLargeSwissSeat.png deleted file mode 100644 index 43d9b77ac..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HempRope_XLargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_Belt.png b/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_Belt.png deleted file mode 100644 index ae95cddc4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_CrotchPlate.png b/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_CrotchPlate.png deleted file mode 100644 index 2bc365f4e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_CrotchPlate.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_Lock.png b/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_Lock.png deleted file mode 100644 index 1a1b26d3c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_Rivets.png b/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_Rivets.png deleted file mode 100644 index 8bd2c8105..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/HybridChastityBelt_Rivets.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Back.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Back.png deleted file mode 100644 index 38ab8591c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Large_Base.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Large_Base.png deleted file mode 100644 index 27e4b969b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Large_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Large_CrotchPiece.png deleted file mode 100644 index b555182ac..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Large_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Large_WaistBand.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Large_WaistBand.png deleted file mode 100644 index 94dc18de6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Large_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Normal_Base.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Normal_Base.png deleted file mode 100644 index 9341703da..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Normal_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Normal_CrotchPiece.png deleted file mode 100644 index 253e619f2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Normal_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Normal_WaistBand.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Normal_WaistBand.png deleted file mode 100644 index 94c60b1a6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Normal_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Small_Base.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Small_Base.png deleted file mode 100644 index 258cdaa70..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Small_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Small_CrotchPiece.png deleted file mode 100644 index 902341382..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Small_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Small_WaistBand.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Small_WaistBand.png deleted file mode 100644 index 5c04ad09c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Small_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Tape.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Tape.png deleted file mode 100644 index 091b02942..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_XLarge_Base.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_XLarge_Base.png deleted file mode 100644 index 6d7070560..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_XLarge_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_XLarge_CrotchPiece.png deleted file mode 100644 index 237605887..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_XLarge_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_XLarge_WaistBand.png b/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_XLarge_WaistBand.png deleted file mode 100644 index 3254e7c29..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/BulkyDiaper_XLarge_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Large.png b/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Large.png deleted file mode 100644 index 060542216..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Lock.png b/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Lock.png deleted file mode 100644 index 5099553b6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Normal.png b/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Normal.png deleted file mode 100644 index 077fe69d8..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Small.png b/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Small.png deleted file mode 100644 index 5d51c44a1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_XLarge.png b/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_XLarge.png deleted file mode 100644 index 0ec2d9640..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_Large.png b/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_Large.png deleted file mode 100644 index e9d268a94..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_Normal.png b/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_Normal.png deleted file mode 100644 index 46e4e25cb..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_Small.png b/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_Small.png deleted file mode 100644 index 038207344..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_XLarge.png b/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_XLarge.png deleted file mode 100644 index 2cd0ca0ee..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HarnessPanties2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_Large.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_Large.png deleted file mode 100644 index 82a6d1aa2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_LargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_LargeKikkouHip.png deleted file mode 100644 index 38560e632..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_LargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_LargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_LargeOverPanties.png deleted file mode 100644 index 31ce857c5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_LargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_LargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_LargeSwissSeat.png deleted file mode 100644 index 08537a532..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_LargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_Normal.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_Normal.png deleted file mode 100644 index a3699ac8a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_NormalKikkouHip.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_NormalKikkouHip.png deleted file mode 100644 index 52af032d2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_NormalKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_NormalOverPanties.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_NormalOverPanties.png deleted file mode 100644 index 26d0c0d52..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_NormalOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_NormalSwissSeat.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_NormalSwissSeat.png deleted file mode 100644 index 153ee1300..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_NormalSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_Small.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_Small.png deleted file mode 100644 index 056849d5b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_SmallKikkouHip.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_SmallKikkouHip.png deleted file mode 100644 index 0ea09d37e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_SmallKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_SmallOverPanties.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_SmallOverPanties.png deleted file mode 100644 index ce93b72b4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_SmallOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_SmallSwissSeat.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_SmallSwissSeat.png deleted file mode 100644 index 2d36efc63..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_SmallSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLarge.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLarge.png deleted file mode 100644 index 414ca8f62..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLargeKikkouHip.png deleted file mode 100644 index 053941188..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLargeOverPanties.png deleted file mode 100644 index 26d0c0d52..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLargeSwissSeat.png deleted file mode 100644 index ead1ae9a6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/HempRope_XLargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Back.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Back.png deleted file mode 100644 index 7adf49cad..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_Base.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_Base.png deleted file mode 100644 index 5a2882025..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_Frills.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_PoofyBase.png deleted file mode 100644 index b822bb023..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Large_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_Base.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_Base.png deleted file mode 100644 index b3b8deba6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_Frills.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_PoofyBase.png deleted file mode 100644 index f440bdf19..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Normal_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_Base.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_Base.png deleted file mode 100644 index eeadb1ce0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_Frills.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_PoofyBase.png deleted file mode 100644 index f92419df5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Small_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Tape.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Tape.png deleted file mode 100644 index 1f5ff808a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_Base.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_Base.png deleted file mode 100644 index 6662b7f3c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_Frills.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_PoofyBase.png deleted file mode 100644 index f4ab2dece..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/PoofyDiaper_XLarge_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_LargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_LargeKikkouHip.png deleted file mode 100644 index 6a67453da..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_LargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_LargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_LargeSwissSeat.png deleted file mode 100644 index e1b7ea491..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_LargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_Normal.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_Normal.png deleted file mode 100644 index e26d843d2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_NormalKikkouHip.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_NormalKikkouHip.png deleted file mode 100644 index 281be4be4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_NormalKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_NormalOverPanties.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_NormalOverPanties.png deleted file mode 100644 index 5f5ce441c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_NormalOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_NormalSwissSeat.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_NormalSwissSeat.png deleted file mode 100644 index 3f52ae1dc..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_NormalSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_Small.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_Small.png deleted file mode 100644 index 1cf3f0bb1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_SmallKikkouHip.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_SmallKikkouHip.png deleted file mode 100644 index b99c9bc5d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_SmallKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_SmallOverPanties.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_SmallOverPanties.png deleted file mode 100644 index 18fc4efde..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_SmallOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_SmallSwissSeat.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_SmallSwissSeat.png deleted file mode 100644 index ff9e28619..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_SmallSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLarge.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLarge.png deleted file mode 100644 index 9f53f5586..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLargeKikkouHip.png deleted file mode 100644 index 883b2583b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLargeOverPanties.png deleted file mode 100644 index c01b5824a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLargeSwissSeat.png deleted file mode 100644 index 65d91b8d4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Kneel/SilkStraps_XLargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_Large.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_Large.png deleted file mode 100644 index cfee19225..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_Normal.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_Normal.png deleted file mode 100644 index 3655dfc7d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_Small.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_Small.png deleted file mode 100644 index 058b2c193..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_XLarge.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_XLarge.png deleted file mode 100644 index c042d6c42..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HarnessPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_Large.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_Large.png deleted file mode 100644 index 82a6d1aa2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_LargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_LargeKikkouHip.png deleted file mode 100644 index e2abdb09e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_LargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_LargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_LargeOverPanties.png deleted file mode 100644 index 31ce857c5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_LargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_LargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_LargeSwissSeat.png deleted file mode 100644 index 013c242ee..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_LargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_Normal.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_Normal.png deleted file mode 100644 index a3699ac8a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_NormalKikkouHip.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_NormalKikkouHip.png deleted file mode 100644 index 0a6f7e95e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_NormalKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_NormalOverPanties.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_NormalOverPanties.png deleted file mode 100644 index 26d0c0d52..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_NormalOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_NormalSwissSeat.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_NormalSwissSeat.png deleted file mode 100644 index 0d329996e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_NormalSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_Small.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_Small.png deleted file mode 100644 index 056849d5b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_SmallKikkouHip.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_SmallKikkouHip.png deleted file mode 100644 index 43ad8ea7f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_SmallKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_SmallOverPanties.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_SmallOverPanties.png deleted file mode 100644 index ce93b72b4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_SmallOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_SmallSwissSeat.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_SmallSwissSeat.png deleted file mode 100644 index ba5da8283..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_SmallSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLarge.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLarge.png deleted file mode 100644 index 414ca8f62..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLargeKikkouHip.png deleted file mode 100644 index e66370a86..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLargeOverPanties.png deleted file mode 100644 index 26d0c0d52..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLargeSwissSeat.png deleted file mode 100644 index 545de1185..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/HempRope_XLargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_Large.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_Large.png deleted file mode 100644 index 6f1cafdf1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_LargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_LargeKikkouHip.png deleted file mode 100644 index f22a581c0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_LargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_LargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_LargeOverPanties.png deleted file mode 100644 index c85b87f7b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_LargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_LargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_LargeSwissSeat.png deleted file mode 100644 index 20239c749..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_LargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_Normal.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_Normal.png deleted file mode 100644 index e26d843d2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_NormalKikkouHip.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_NormalKikkouHip.png deleted file mode 100644 index caa17f3c4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_NormalKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_NormalOverPanties.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_NormalOverPanties.png deleted file mode 100644 index 5f5ce441c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_NormalOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_NormalSwissSeat.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_NormalSwissSeat.png deleted file mode 100644 index 3e9d3eeae..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_NormalSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_Small.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_Small.png deleted file mode 100644 index 1cf3f0bb1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_SmallKikkouHip.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_SmallKikkouHip.png deleted file mode 100644 index 87bc3fcc5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_SmallKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_SmallOverPanties.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_SmallOverPanties.png deleted file mode 100644 index 18fc4efde..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_SmallOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_SmallSwissSeat.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_SmallSwissSeat.png deleted file mode 100644 index b4254e53b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_SmallSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLarge.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLarge.png deleted file mode 100644 index 9f53f5586..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLargeKikkouHip.png deleted file mode 100644 index 29a1a2784..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLargeOverPanties.png deleted file mode 100644 index c01b5824a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLargeSwissSeat.png deleted file mode 100644 index c258bcfad..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/KneelingSpread/SilkStraps_XLargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LeatherChastityBelt_Belt.png b/Assets/Female3DCG/ItemPelvis/LeatherChastityBelt_Belt.png deleted file mode 100644 index c698f7265..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LeatherChastityBelt_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LeatherChastityBelt_Lock.png b/Assets/Female3DCG/ItemPelvis/LeatherChastityBelt_Lock.png deleted file mode 100644 index f3175aea2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LeatherChastityBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LeatherChastityBelt_Studs.png b/Assets/Female3DCG/ItemPelvis/LeatherChastityBelt_Studs.png deleted file mode 100644 index 9d264c70b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LeatherChastityBelt_Studs.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Large.png b/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Large.png deleted file mode 100644 index 11fcf33ce..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Lock.png b/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Normal.png b/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Normal.png deleted file mode 100644 index 3a5fce6e1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Small.png b/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Small.png deleted file mode 100644 index feeaa996d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_XLarge.png b/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_XLarge.png deleted file mode 100644 index a54b87f9a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LeatherStrapPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Back.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Back.png deleted file mode 100644 index 38ab8591c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Large_Base.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Large_Base.png deleted file mode 100644 index 27e4b969b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Large_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Large_CrotchPiece.png deleted file mode 100644 index b555182ac..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Large_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Large_WaistBand.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Large_WaistBand.png deleted file mode 100644 index 94dc18de6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Large_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Normal_Base.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Normal_Base.png deleted file mode 100644 index 9341703da..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Normal_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Normal_CrotchPiece.png deleted file mode 100644 index 253e619f2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Normal_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Normal_WaistBand.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Normal_WaistBand.png deleted file mode 100644 index 94c60b1a6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Normal_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Small_Base.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Small_Base.png deleted file mode 100644 index 258cdaa70..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Small_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Small_CrotchPiece.png deleted file mode 100644 index 902341382..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Small_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Small_WaistBand.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Small_WaistBand.png deleted file mode 100644 index 5c04ad09c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Small_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Tape.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Tape.png deleted file mode 100644 index 091b02942..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_XLarge_Base.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_XLarge_Base.png deleted file mode 100644 index 6d7070560..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_XLarge_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_XLarge_CrotchPiece.png deleted file mode 100644 index 237605887..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_XLarge_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_XLarge_WaistBand.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_XLarge_WaistBand.png deleted file mode 100644 index 3254e7c29..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/BulkyDiaper_XLarge_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Large.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Large.png deleted file mode 100644 index 9d4c13dc3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Lock.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Lock.png deleted file mode 100644 index 5099553b6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Normal.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Normal.png deleted file mode 100644 index 6dd3717d1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Small.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Small.png deleted file mode 100644 index 8f7a3fca5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_XLarge.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_XLarge.png deleted file mode 100644 index 93538709a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_Large.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_Large.png deleted file mode 100644 index d9bf30dcf..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_Normal.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_Normal.png deleted file mode 100644 index 2de445ba0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_Small.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_Small.png deleted file mode 100644 index 1f7e4b607..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_XLarge.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_XLarge.png deleted file mode 100644 index 8a0edeec1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HarnessPanties2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_Large.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_Large.png deleted file mode 100644 index 82a6d1aa2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_LargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_LargeKikkouHip.png deleted file mode 100644 index 667825d3e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_LargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_LargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_LargeOverPanties.png deleted file mode 100644 index 31ce857c5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_LargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_LargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_LargeSwissSeat.png deleted file mode 100644 index 19b3b9f8e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_LargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_Normal.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_Normal.png deleted file mode 100644 index a3699ac8a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_NormalKikkouHip.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_NormalKikkouHip.png deleted file mode 100644 index 52af032d2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_NormalKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_NormalOverPanties.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_NormalOverPanties.png deleted file mode 100644 index 26d0c0d52..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_NormalOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_NormalSwissSeat.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_NormalSwissSeat.png deleted file mode 100644 index 153ee1300..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_NormalSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_Small.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_Small.png deleted file mode 100644 index 056849d5b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_SmallKikkouHip.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_SmallKikkouHip.png deleted file mode 100644 index 0ea09d37e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_SmallKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_SmallOverPanties.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_SmallOverPanties.png deleted file mode 100644 index ce93b72b4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_SmallOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_SmallSwissSeat.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_SmallSwissSeat.png deleted file mode 100644 index 2d36efc63..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_SmallSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLarge.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLarge.png deleted file mode 100644 index 414ca8f62..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLargeKikkouHip.png deleted file mode 100644 index 7311bb434..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLargeOverPanties.png deleted file mode 100644 index 26d0c0d52..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLargeSwissSeat.png deleted file mode 100644 index d1115e1e5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/HempRope_XLargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Back.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Back.png deleted file mode 100644 index 7adf49cad..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_Base.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_Base.png deleted file mode 100644 index 5a2882025..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_Frills.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_PoofyBase.png deleted file mode 100644 index b822bb023..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Large_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_Base.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_Base.png deleted file mode 100644 index b3b8deba6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_Frills.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_PoofyBase.png deleted file mode 100644 index f440bdf19..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Normal_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_Base.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_Base.png deleted file mode 100644 index eeadb1ce0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_Frills.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_PoofyBase.png deleted file mode 100644 index f92419df5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Small_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Tape.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Tape.png deleted file mode 100644 index 1f5ff808a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_Base.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_Base.png deleted file mode 100644 index 6662b7f3c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_Frills.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_PoofyBase.png deleted file mode 100644 index f4ab2dece..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/PoofyDiaper_XLarge_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_LargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_LargeKikkouHip.png deleted file mode 100644 index 3ca5f6a0c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_LargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_LargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_LargeSwissSeat.png deleted file mode 100644 index 3d7f8afa9..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_LargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_Normal.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_Normal.png deleted file mode 100644 index e26d843d2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_NormalKikkouHip.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_NormalKikkouHip.png deleted file mode 100644 index eddd3fcce..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_NormalKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_NormalOverPanties.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_NormalOverPanties.png deleted file mode 100644 index 5f5ce441c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_NormalOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_NormalSwissSeat.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_NormalSwissSeat.png deleted file mode 100644 index 27ee19fc9..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_NormalSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_Small.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_Small.png deleted file mode 100644 index 1cf3f0bb1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_SmallKikkouHip.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_SmallKikkouHip.png deleted file mode 100644 index 122573ccc..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_SmallKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_SmallOverPanties.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_SmallOverPanties.png deleted file mode 100644 index 18fc4efde..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_SmallOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_SmallSwissSeat.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_SmallSwissSeat.png deleted file mode 100644 index 051317a2d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_SmallSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLarge.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLarge.png deleted file mode 100644 index 9f53f5586..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLargeKikkouHip.png deleted file mode 100644 index 1bdb171ba..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLargeOverPanties.png deleted file mode 100644 index c01b5824a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLargeSwissSeat.png deleted file mode 100644 index 7e8c27163..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LegsClosed/SilkStraps_XLargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Closed.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Closed.png deleted file mode 100644 index 42c2ebf70..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Closed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Lock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Lock.png deleted file mode 100644 index a9db74780..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Open.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Open.png deleted file mode 100644 index a7b01ee00..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Open.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_ShieldLock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_ShieldLock.png deleted file mode 100644 index 031da347b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_ShieldLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Shock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Shock.png deleted file mode 100644 index f98717589..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Shock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Vibe.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Vibe.png deleted file mode 100644 index c3fdc86c2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Large_Vibe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Lock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Lock.png deleted file mode 100644 index a9db74780..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Closed.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Closed.png deleted file mode 100644 index 42c2ebf70..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Closed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Lock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Lock.png deleted file mode 100644 index a9db74780..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Open.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Open.png deleted file mode 100644 index a7b01ee00..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Open.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_ShieldLock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_ShieldLock.png deleted file mode 100644 index 031da347b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_ShieldLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Shock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Shock.png deleted file mode 100644 index f98717589..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Shock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Vibe.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Vibe.png deleted file mode 100644 index c3fdc86c2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Normal_Vibe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_ShieldLock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_ShieldLock.png deleted file mode 100644 index 031da347b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_ShieldLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Shock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Shock.png deleted file mode 100644 index f98717589..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Shock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Closed.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Closed.png deleted file mode 100644 index 42c2ebf70..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Closed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Lock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Lock.png deleted file mode 100644 index a9db74780..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Open.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Open.png deleted file mode 100644 index a7b01ee00..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Open.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_ShieldLock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_ShieldLock.png deleted file mode 100644 index 031da347b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_ShieldLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Shock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Shock.png deleted file mode 100644 index f98717589..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Shock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Vibe.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Vibe.png deleted file mode 100644 index c3fdc86c2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Small_Vibe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Vibe.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Vibe.png deleted file mode 100644 index c3fdc86c2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_Vibe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Closed.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Closed.png deleted file mode 100644 index 42c2ebf70..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Closed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Lock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Lock.png deleted file mode 100644 index a9db74780..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Open.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Open.png deleted file mode 100644 index a7b01ee00..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Open.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_ShieldLock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_ShieldLock.png deleted file mode 100644 index 031da347b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_ShieldLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Shock.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Shock.png deleted file mode 100644 index f98717589..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Shock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Vibe.png b/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Vibe.png deleted file mode 100644 index c3fdc86c2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/LoveChastityBelt_XLarge_Vibe.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/MetalChastityBelt_Belt.png b/Assets/Female3DCG/ItemPelvis/MetalChastityBelt_Belt.png deleted file mode 100644 index 1099d651d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/MetalChastityBelt_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/MetalChastityBelt_Keyhole.png b/Assets/Female3DCG/ItemPelvis/MetalChastityBelt_Keyhole.png deleted file mode 100644 index 49ef83c60..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/MetalChastityBelt_Keyhole.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/MetalChastityBelt_Lock.png b/Assets/Female3DCG/ItemPelvis/MetalChastityBelt_Lock.png deleted file mode 100644 index 8605436d6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/MetalChastityBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_Base.png b/Assets/Female3DCG/ItemPelvis/ObedienceBelt_Base.png deleted file mode 100644 index 340be7864..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_CrotchLock.png b/Assets/Female3DCG/ItemPelvis/ObedienceBelt_CrotchLock.png deleted file mode 100644 index ea1b428df..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_CrotchLock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_CrotchShield.png b/Assets/Female3DCG/ItemPelvis/ObedienceBelt_CrotchShield.png deleted file mode 100644 index a69b074f4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_CrotchShield.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_Locks.png b/Assets/Female3DCG/ItemPelvis/ObedienceBelt_Locks.png deleted file mode 100644 index 0418893ea..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_NegativeWire.png b/Assets/Female3DCG/ItemPelvis/ObedienceBelt_NegativeWire.png deleted file mode 100644 index dbe259b42..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_NegativeWire.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_PositiveWire.png b/Assets/Female3DCG/ItemPelvis/ObedienceBelt_PositiveWire.png deleted file mode 100644 index d7de4eccb..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_PositiveWire.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_Trim.png b/Assets/Female3DCG/ItemPelvis/ObedienceBelt_Trim.png deleted file mode 100644 index 3ef94b83f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_Trim.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_WireOutline.png b/Assets/Female3DCG/ItemPelvis/ObedienceBelt_WireOutline.png deleted file mode 100644 index bdc71517f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/ObedienceBelt_WireOutline.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Large_Belt.png b/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Large_Belt.png deleted file mode 100644 index 58d0e65d0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Large_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Large_Gems.png b/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Large_Gems.png deleted file mode 100644 index a60972a58..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Large_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Lock.png b/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Normal_Belt.png b/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Normal_Belt.png deleted file mode 100644 index 58d0e65d0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Normal_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Normal_Gems.png b/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Normal_Gems.png deleted file mode 100644 index a60972a58..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Normal_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Small_Belt.png b/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Small_Belt.png deleted file mode 100644 index 58d0e65d0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Small_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Small_Gems.png b/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Small_Gems.png deleted file mode 100644 index a60972a58..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_Small_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_XLarge_Belt.png b/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_XLarge_Belt.png deleted file mode 100644 index 58d0e65d0..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_XLarge_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_XLarge_Gems.png b/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_XLarge_Gems.png deleted file mode 100644 index a60972a58..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/OrnateChastityBelt_XLarge_Gems.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Large.png b/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Large.png deleted file mode 100644 index 578921ca3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Lock.png b/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Lock.png deleted file mode 100644 index 539bf3cb9..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Normal.png b/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Normal.png deleted file mode 100644 index 578921ca3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Small.png b/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Small.png deleted file mode 100644 index 578921ca3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_XLarge.png b/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_XLarge.png deleted file mode 100644 index 578921ca3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PelvisChainLeash_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Large.png b/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Large.png deleted file mode 100644 index 90d27d7bd..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Lock.png b/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Lock.png deleted file mode 100644 index 045508f4a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Normal.png b/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Normal.png deleted file mode 100644 index 90d27d7bd..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Small.png b/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Small.png deleted file mode 100644 index 90d27d7bd..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_XLarge.png b/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_XLarge.png deleted file mode 100644 index 90d27d7bd..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PolishedChastityBelt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Back.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Back.png deleted file mode 100644 index 7adf49cad..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_Base.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_Base.png deleted file mode 100644 index f8bb341e5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_Frills.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_PoofyBase.png deleted file mode 100644 index 7f60e3cf1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Large_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_Base.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_Base.png deleted file mode 100644 index dc3d5166e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_Frills.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_PoofyBase.png deleted file mode 100644 index 43eacf0b8..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Normal_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_Base.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_Base.png deleted file mode 100644 index 5de80b6c9..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_Frills.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_PoofyBase.png deleted file mode 100644 index 6e2bf692e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Small_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Tape.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Tape.png deleted file mode 100644 index 1f5ff808a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_Base.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_Base.png deleted file mode 100644 index 552f9009f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_Frills.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_PoofyBase.png deleted file mode 100644 index 3d3dcb573..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/PoofyDiaper_XLarge_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/BulkyDiaper.png b/Assets/Female3DCG/ItemPelvis/Preview/BulkyDiaper.png deleted file mode 100644 index d68c78d51..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/BulkyDiaper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/DiaperHarness.png b/Assets/Female3DCG/ItemPelvis/Preview/DiaperHarness.png deleted file mode 100644 index 16645da80..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/DiaperHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/FuturisticChastityBelt.png b/Assets/Female3DCG/ItemPelvis/Preview/FuturisticChastityBelt.png deleted file mode 100644 index 8858d2bd8..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/FuturisticChastityBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/FuturisticTrainingBelt.png b/Assets/Female3DCG/ItemPelvis/Preview/FuturisticTrainingBelt.png deleted file mode 100644 index 64ddd028c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/FuturisticTrainingBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/HarnessPanties1.png b/Assets/Female3DCG/ItemPelvis/Preview/HarnessPanties1.png deleted file mode 100644 index c9c1e7ad5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/HarnessPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/HarnessPanties2.png b/Assets/Female3DCG/ItemPelvis/Preview/HarnessPanties2.png deleted file mode 100644 index 00a89f82a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/HarnessPanties2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/HempRope.png b/Assets/Female3DCG/ItemPelvis/Preview/HempRope.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/HempRope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/HybridChastityBelt.png b/Assets/Female3DCG/ItemPelvis/Preview/HybridChastityBelt.png deleted file mode 100644 index 0c7c0e224..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/HybridChastityBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/LeatherChastityBelt.png b/Assets/Female3DCG/ItemPelvis/Preview/LeatherChastityBelt.png deleted file mode 100644 index 4f35fca54..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/LeatherChastityBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/LeatherStrapPanties1.png b/Assets/Female3DCG/ItemPelvis/Preview/LeatherStrapPanties1.png deleted file mode 100644 index 9fa71545e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/LeatherStrapPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/LoveChastityBelt.png b/Assets/Female3DCG/ItemPelvis/Preview/LoveChastityBelt.png deleted file mode 100644 index 819005254..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/LoveChastityBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/MetalChastityBelt.png b/Assets/Female3DCG/ItemPelvis/Preview/MetalChastityBelt.png deleted file mode 100644 index 5534d5703..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/MetalChastityBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/ObedienceBelt.png b/Assets/Female3DCG/ItemPelvis/Preview/ObedienceBelt.png deleted file mode 100644 index 154584c0e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/ObedienceBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/OrnateChastityBelt.png b/Assets/Female3DCG/ItemPelvis/Preview/OrnateChastityBelt.png deleted file mode 100644 index 84337bf97..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/OrnateChastityBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/PelvisChainLeash.png b/Assets/Female3DCG/ItemPelvis/Preview/PelvisChainLeash.png deleted file mode 100644 index 1c949e20f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/PelvisChainLeash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/PlasticWrap.png b/Assets/Female3DCG/ItemPelvis/Preview/PlasticWrap.png deleted file mode 100644 index f559dac76..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/PlasticWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/PolishedChastityBelt.png b/Assets/Female3DCG/ItemPelvis/Preview/PolishedChastityBelt.png deleted file mode 100644 index 1825100e8..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/PolishedChastityBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/PoofyDiaper.png b/Assets/Female3DCG/ItemPelvis/Preview/PoofyDiaper.png deleted file mode 100644 index 34c124a34..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/PoofyDiaper.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/Ribbons.png b/Assets/Female3DCG/ItemPelvis/Preview/Ribbons.png deleted file mode 100644 index 7d3f73b67..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/Ribbons.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/SciFiPleasurePanties.png b/Assets/Female3DCG/ItemPelvis/Preview/SciFiPleasurePanties.png deleted file mode 100644 index 8b57c44ed..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/SciFiPleasurePanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/SilkStraps.png b/Assets/Female3DCG/ItemPelvis/Preview/SilkStraps.png deleted file mode 100644 index 1502f19b5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/SilkStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/SleekLeatherChastityBelt.png b/Assets/Female3DCG/ItemPelvis/Preview/SleekLeatherChastityBelt.png deleted file mode 100644 index 6930c0eae..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/SleekLeatherChastityBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/SteelChastityPanties.png b/Assets/Female3DCG/ItemPelvis/Preview/SteelChastityPanties.png deleted file mode 100644 index dbe5832d6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/SteelChastityPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/StraponPanties.png b/Assets/Female3DCG/ItemPelvis/Preview/StraponPanties.png deleted file mode 100644 index 2f6451dec..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/StraponPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Preview/StuddedChastityBelt.png b/Assets/Female3DCG/ItemPelvis/Preview/StuddedChastityBelt.png deleted file mode 100644 index 68651b4c5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Preview/StuddedChastityBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Ribbons_Large.png b/Assets/Female3DCG/ItemPelvis/Ribbons_Large.png deleted file mode 100644 index 30d1dcf6d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Ribbons_LargeCrotchWrapping.png b/Assets/Female3DCG/ItemPelvis/Ribbons_LargeCrotchWrapping.png deleted file mode 100644 index 2ceb51a5e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Ribbons_LargeCrotchWrapping.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Ribbons_Normal.png b/Assets/Female3DCG/ItemPelvis/Ribbons_Normal.png deleted file mode 100644 index 20086327f..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Ribbons_NormalCrotchWrapping.png b/Assets/Female3DCG/ItemPelvis/Ribbons_NormalCrotchWrapping.png deleted file mode 100644 index 9139bb6e4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Ribbons_NormalCrotchWrapping.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Ribbons_Small.png b/Assets/Female3DCG/ItemPelvis/Ribbons_Small.png deleted file mode 100644 index f67cac5ab..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Ribbons_SmallCrotchWrapping.png b/Assets/Female3DCG/ItemPelvis/Ribbons_SmallCrotchWrapping.png deleted file mode 100644 index c78b0d381..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Ribbons_SmallCrotchWrapping.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Ribbons_XLarge.png b/Assets/Female3DCG/ItemPelvis/Ribbons_XLarge.png deleted file mode 100644 index 12a79f120..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Ribbons_XLargeCrotchWrapping.png b/Assets/Female3DCG/ItemPelvis/Ribbons_XLargeCrotchWrapping.png deleted file mode 100644 index e06828270..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Ribbons_XLargeCrotchWrapping.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Band.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Band.png deleted file mode 100644 index 864756856..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Large_Mesh1.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Large_Mesh1.png deleted file mode 100644 index 8fd11e0fa..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Large_Mesh1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Large_Mesh2.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Large_Mesh2.png deleted file mode 100644 index 67454c1f5..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Large_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Lock.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Lock.png deleted file mode 100644 index 1d287dfd4..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Normal_Mesh1.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Normal_Mesh1.png deleted file mode 100644 index 6676c7483..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Normal_Mesh1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Normal_Mesh2.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Normal_Mesh2.png deleted file mode 100644 index 3f821d208..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Normal_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Plug1.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Plug1.png deleted file mode 100644 index 2f233f5fc..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Plug1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Plug2.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Plug2.png deleted file mode 100644 index e14d74230..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Plug2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Screen.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Screen.png deleted file mode 100644 index 1dc40f0eb..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Screen.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Small_Mesh1.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Small_Mesh1.png deleted file mode 100644 index 0c095d19d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Small_Mesh1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Small_Mesh2.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Small_Mesh2.png deleted file mode 100644 index b089a4329..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_Small_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_XLarge_Mesh1.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_XLarge_Mesh1.png deleted file mode 100644 index 3eaeb3689..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_XLarge_Mesh1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_XLarge_Mesh2.png b/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_XLarge_Mesh2.png deleted file mode 100644 index c9c7899e7..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SciFiPleasurePanties_XLarge_Mesh2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_Large.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_Large.png deleted file mode 100644 index 6f1cafdf1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_LargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_LargeKikkouHip.png deleted file mode 100644 index 27a2298dc..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_LargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_LargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_LargeOverPanties.png deleted file mode 100644 index c85b87f7b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_LargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_LargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_LargeSwissSeat.png deleted file mode 100644 index 1cadc5df1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_LargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_Normal.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_Normal.png deleted file mode 100644 index e26d843d2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_NormalKikkouHip.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_NormalKikkouHip.png deleted file mode 100644 index e53dc3417..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_NormalKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_NormalOverPanties.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_NormalOverPanties.png deleted file mode 100644 index 5f5ce441c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_NormalOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_NormalSwissSeat.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_NormalSwissSeat.png deleted file mode 100644 index 123ba2dd9..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_NormalSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_Small.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_Small.png deleted file mode 100644 index 1cf3f0bb1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_SmallKikkouHip.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_SmallKikkouHip.png deleted file mode 100644 index 5ee68c96d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_SmallKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_SmallOverPanties.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_SmallOverPanties.png deleted file mode 100644 index 18fc4efde..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_SmallOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_SmallSwissSeat.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_SmallSwissSeat.png deleted file mode 100644 index 3a3c720fe..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_SmallSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_XLarge.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_XLarge.png deleted file mode 100644 index 9f53f5586..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_XLargeKikkouHip.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_XLargeKikkouHip.png deleted file mode 100644 index c0a8ddbc1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_XLargeKikkouHip.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_XLargeOverPanties.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_XLargeOverPanties.png deleted file mode 100644 index c01b5824a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_XLargeOverPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SilkStraps_XLargeSwissSeat.png b/Assets/Female3DCG/ItemPelvis/SilkStraps_XLargeSwissSeat.png deleted file mode 100644 index 91800b49b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SilkStraps_XLargeSwissSeat.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Large.png b/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Large.png deleted file mode 100644 index 0e357cb89..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Lock.png b/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Lock.png deleted file mode 100644 index bef0368c1..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Normal.png b/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Normal.png deleted file mode 100644 index 6ea6d9af3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Small.png b/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Small.png deleted file mode 100644 index aaea1a4e3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_XLarge.png b/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_XLarge.png deleted file mode 100644 index bfd833027..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SleekLeatherChastityBelt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Back.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Back.png deleted file mode 100644 index 38ab8591c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Large_Base.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Large_Base.png deleted file mode 100644 index 5b5162a59..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Large_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Large_CrotchPiece.png deleted file mode 100644 index b555182ac..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Large_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Large_WaistBand.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Large_WaistBand.png deleted file mode 100644 index 94dc18de6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Large_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Normal_Base.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Normal_Base.png deleted file mode 100644 index 0754bf63d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Normal_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Normal_CrotchPiece.png deleted file mode 100644 index 253e619f2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Normal_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Normal_WaistBand.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Normal_WaistBand.png deleted file mode 100644 index 94c60b1a6..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Normal_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Small_Base.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Small_Base.png deleted file mode 100644 index 65aeff525..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Small_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Small_CrotchPiece.png deleted file mode 100644 index 902341382..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Small_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Small_WaistBand.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Small_WaistBand.png deleted file mode 100644 index 5c04ad09c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Small_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Tape.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Tape.png deleted file mode 100644 index 091b02942..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_XLarge_Base.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_XLarge_Base.png deleted file mode 100644 index 8b0b5d455..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_XLarge_CrotchPiece.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_XLarge_CrotchPiece.png deleted file mode 100644 index 237605887..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_XLarge_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_XLarge_WaistBand.png b/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_XLarge_WaistBand.png deleted file mode 100644 index 3254e7c29..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/BulkyDiaper_XLarge_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_Large.png b/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_Large.png deleted file mode 100644 index 8bf355a58..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_Normal.png b/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_Normal.png deleted file mode 100644 index caa827ff3..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_Small.png b/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_Small.png deleted file mode 100644 index fe0908515..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_XLarge.png b/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_XLarge.png deleted file mode 100644 index d8c991f70..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/HarnessPanties2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Back.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Back.png deleted file mode 100644 index 7adf49cad..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_Base.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_Base.png deleted file mode 100644 index e624dd83e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_Frills.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_PoofyBase.png deleted file mode 100644 index 065857443..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Large_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_Base.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_Base.png deleted file mode 100644 index a8644569c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_Frills.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_PoofyBase.png deleted file mode 100644 index e4eb3045b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Normal_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_Base.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_Base.png deleted file mode 100644 index 444dcda2d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_Frills.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_PoofyBase.png deleted file mode 100644 index 7fce50599..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Small_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Tape.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Tape.png deleted file mode 100644 index 1f5ff808a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_Base.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_Base.png deleted file mode 100644 index 2a43fb6bc..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_CrotchPatch.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_Frills.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_PoofyBase.png b/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_PoofyBase.png deleted file mode 100644 index 2c83abd9a..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/Spread/PoofyDiaper_XLarge_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Large.png b/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Large.png deleted file mode 100644 index 7d5aedd2b..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Lock.png b/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Normal.png b/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Normal.png deleted file mode 100644 index abc10c521..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Small.png b/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Small.png deleted file mode 100644 index a7b3c012e..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_XLarge.png b/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_XLarge.png deleted file mode 100644 index 5226631d2..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/SteelChastityPanties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/StraponPanties_Large.png b/Assets/Female3DCG/ItemPelvis/StraponPanties_Large.png deleted file mode 100644 index 85313a23c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/StraponPanties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/StraponPanties_Normal.png b/Assets/Female3DCG/ItemPelvis/StraponPanties_Normal.png deleted file mode 100644 index 85313a23c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/StraponPanties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/StraponPanties_Small.png b/Assets/Female3DCG/ItemPelvis/StraponPanties_Small.png deleted file mode 100644 index 85313a23c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/StraponPanties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/StraponPanties_XLarge.png b/Assets/Female3DCG/ItemPelvis/StraponPanties_XLarge.png deleted file mode 100644 index 85313a23c..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/StraponPanties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Large.png b/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Large.png deleted file mode 100644 index 3670e9730..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Lock.png b/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Lock.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Normal.png b/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Normal.png deleted file mode 100644 index 3670e9730..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Small.png b/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Small.png deleted file mode 100644 index 3670e9730..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_XLarge.png b/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_XLarge.png deleted file mode 100644 index 3670e9730..000000000 Binary files a/Assets/Female3DCG/ItemPelvis/StuddedChastityBelt_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Large.png b/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Large.png deleted file mode 100644 index 98f7984f7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Lock.png b/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Normal.png b/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Normal.png deleted file mode 100644 index 892e47ac6..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Small.png b/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Small.png deleted file mode 100644 index fbc5eafbb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AdultBabyHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AdultBabyHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/AdultBabyHarness_XLarge.png deleted file mode 100644 index 80a2f8380..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AdultBabyHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Large.png b/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Large.png deleted file mode 100644 index 98f7984f7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Lock.png b/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Normal.png b/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Normal.png deleted file mode 100644 index 892e47ac6..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Small.png b/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Small.png deleted file mode 100644 index fbc5eafbb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_XLarge.png deleted file mode 100644 index 80a2f8380..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/AdultBabyHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Large.png b/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Large.png deleted file mode 100644 index 89603c557..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Lock.png b/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Normal.png b/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Normal.png deleted file mode 100644 index 9c7341a96..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Small.png b/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Small.png deleted file mode 100644 index ca0a1e2f0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_XLarge.png b/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_XLarge.png deleted file mode 100644 index e458cd4c0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Large.png b/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Large.png deleted file mode 100644 index 373d044b5..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Lock.png b/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Lock.png deleted file mode 100644 index 9dfca48af..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Normal.png b/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Normal.png deleted file mode 100644 index caa1c55ee..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Small.png b/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Small.png deleted file mode 100644 index 5338c26ca..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_XLarge.png b/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_XLarge.png deleted file mode 100644 index cbf361ad8..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HarnessBra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_Large.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_Large.png deleted file mode 100644 index 0f6e5450c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_LargeDiamond.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_LargeDiamond.png deleted file mode 100644 index 42bf5ed49..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_LargeDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_LargeHarness.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_LargeHarness.png deleted file mode 100644 index d048d9905..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_LargeHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_LargeStar.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_LargeStar.png deleted file mode 100644 index 5a34b6c5a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_LargeStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_Normal.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_Normal.png deleted file mode 100644 index dcbe740bc..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_NormalDiamond.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_NormalDiamond.png deleted file mode 100644 index fd77550c5..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_NormalDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_NormalHarness.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_NormalHarness.png deleted file mode 100644 index 2156bd727..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_NormalHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_NormalStar.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_NormalStar.png deleted file mode 100644 index 3c7adfccd..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_NormalStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_Small.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_Small.png deleted file mode 100644 index e69e64b03..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_SmallDiamond.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_SmallDiamond.png deleted file mode 100644 index dfbe98f27..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_SmallDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_SmallHarness.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_SmallHarness.png deleted file mode 100644 index 0f6f1c11f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_SmallHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_SmallStar.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_SmallStar.png deleted file mode 100644 index 035ba2814..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_SmallStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLarge.png deleted file mode 100644 index 3a00e7573..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLargeDiamond.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLargeDiamond.png deleted file mode 100644 index 8a5c87390..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLargeDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLargeHarness.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLargeHarness.png deleted file mode 100644 index db8e900ca..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLargeHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLargeStar.png b/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLargeStar.png deleted file mode 100644 index 6c04adb8f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/HempRopeHarness_XLargeStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Large.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Large.png deleted file mode 100644 index e48b0ccf1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Lock.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Lock.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Normal.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Normal.png deleted file mode 100644 index 5052ad328..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Small.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Small.png deleted file mode 100644 index 402460174..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_XLarge.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_XLarge.png deleted file mode 100644 index d826a300a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherBreastBinder_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Large.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Large.png deleted file mode 100644 index d30748116..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Lock.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Lock.png deleted file mode 100644 index 98f16c968..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Normal.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Normal.png deleted file mode 100644 index e5c91d1f6..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Small.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Small.png deleted file mode 100644 index 5bc7239d8..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_XLarge.png deleted file mode 100644 index 2890340c7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_Large.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_Large.png deleted file mode 100644 index b4154649f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_Normal.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_Normal.png deleted file mode 100644 index f7b52aa32..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_Small.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_Small.png deleted file mode 100644 index 7385d67f7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_XLarge.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_XLarge.png deleted file mode 100644 index e45cd520a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Large.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Large.png deleted file mode 100644 index c8b0b5f0c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Lock.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Lock.png deleted file mode 100644 index 98f16c968..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Normal.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Normal.png deleted file mode 100644 index bb1048993..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Small.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Small.png deleted file mode 100644 index 6730e1417..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_XLarge.png deleted file mode 100644 index 323b92b9f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/LeatherStrapHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeDiamond_Rope.png deleted file mode 100644 index caf9f19ed..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeDiamond_Shine.png deleted file mode 100644 index d06e60d1a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeHarness_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeHarness_Rope.png deleted file mode 100644 index a487a8052..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeHarness_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeHarness_Shine.png deleted file mode 100644 index c97e4f9b9..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeStar_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeStar_Rope.png deleted file mode 100644 index 183d0eec5..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeStar_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeStar_Shine.png deleted file mode 100644 index 5ed3a9c96..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeWaist_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeWaist_Rope.png deleted file mode 100644 index e7c781a8b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeWaist_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeWaist_Shine.png deleted file mode 100644 index e7c781a8b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_LargeWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Large_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Large_Rope.png deleted file mode 100644 index 22189bd04..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Large_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Large_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Large_Shine.png deleted file mode 100644 index 22189bd04..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalDiamond_Rope.png deleted file mode 100644 index 12191512a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalDiamond_Shine.png deleted file mode 100644 index e661661e4..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalHarness_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalHarness_Rope.png deleted file mode 100644 index 9086066f6..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalHarness_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalHarness_Shine.png deleted file mode 100644 index 8eea075b1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalStar_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalStar_Rope.png deleted file mode 100644 index b7820997c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalStar_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalStar_Shine.png deleted file mode 100644 index 0210422c6..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalWaist_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalWaist_Rope.png deleted file mode 100644 index 93e2a7c27..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalWaist_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalWaist_Shine.png deleted file mode 100644 index 93e2a7c27..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_NormalWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Normal_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Normal_Rope.png deleted file mode 100644 index e276fa2d0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Normal_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Normal_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Normal_Shine.png deleted file mode 100644 index e276fa2d0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallDiamond_Rope.png deleted file mode 100644 index d34409ed5..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallDiamond_Shine.png deleted file mode 100644 index e1e2ee653..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallHarness_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallHarness_Rope.png deleted file mode 100644 index 305359dbf..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallHarness_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallHarness_Shine.png deleted file mode 100644 index 371f75db9..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallStar_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallStar_Rope.png deleted file mode 100644 index 1dc735561..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallStar_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallStar_Shine.png deleted file mode 100644 index bae36aebb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallWaist_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallWaist_Rope.png deleted file mode 100644 index ce0f7b145..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallWaist_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallWaist_Shine.png deleted file mode 100644 index ce0f7b145..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_SmallWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Small_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Small_Rope.png deleted file mode 100644 index a0054fc8f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Small_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Small_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Small_Shine.png deleted file mode 100644 index a0054fc8f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeDiamond_Rope.png deleted file mode 100644 index a5521bc1f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeDiamond_Shine.png deleted file mode 100644 index c30e767a8..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeHarness_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeHarness_Rope.png deleted file mode 100644 index 40be4d945..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeHarness_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeHarness_Shine.png deleted file mode 100644 index 3a38750a0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeStar_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeStar_Rope.png deleted file mode 100644 index e6a8eacad..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeStar_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeStar_Shine.png deleted file mode 100644 index d79067e29..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeWaist_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeWaist_Rope.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeWaist_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeWaist_Shine.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLargeWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLarge_Rope.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLarge_Rope.png deleted file mode 100644 index 7508e1b5c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLarge_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLarge_Shine.png b/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLarge_Shine.png deleted file mode 100644 index 7508e1b5c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/NylonRopeHarness_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_Large.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_Large.png deleted file mode 100644 index ec655d489..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_Normal.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_Normal.png deleted file mode 100644 index a613458f1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_Small.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_Small.png deleted file mode 100644 index 17d411e06..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_XLarge.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_XLarge.png deleted file mode 100644 index 7788528bb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbon_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_Large.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_Large.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_LargeHarness1.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_LargeHarness1.png deleted file mode 100644 index abd49671f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_LargeHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_LargeHarness2.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_LargeHarness2.png deleted file mode 100644 index 740eb1191..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_LargeHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_Normal.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_Normal.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_NormalHarness1.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_NormalHarness1.png deleted file mode 100644 index 63f7e839e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_NormalHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_NormalHarness2.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_NormalHarness2.png deleted file mode 100644 index a08feccc1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_NormalHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_Small.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_Small.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_SmallHarness1.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_SmallHarness1.png deleted file mode 100644 index 5a11cfdf3..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_SmallHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_SmallHarness2.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_SmallHarness2.png deleted file mode 100644 index 176f694ad..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_SmallHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_XLarge.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_XLarge.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_XLargeHarness1.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_XLargeHarness1.png deleted file mode 100644 index edb4ddda4..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_XLargeHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_XLargeHarness2.png b/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_XLargeHarness2.png deleted file mode 100644 index d9cdb7cdf..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/Ribbons_XLargeHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Large_Harness.png b/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Large_Harness.png deleted file mode 100644 index b800d7425..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Large_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Large_Metal.png b/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Large_Metal.png deleted file mode 100644 index 2c452a151..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Large_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Lock.png b/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Lock.png deleted file mode 100644 index 3013f47a5..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Normal_Harness.png b/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Normal_Harness.png deleted file mode 100644 index 7da7eb080..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Normal_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Normal_Metal.png b/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Normal_Metal.png deleted file mode 100644 index 0bdc3bb38..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Normal_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Small_Harness.png b/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Small_Harness.png deleted file mode 100644 index 6effc0577..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Small_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Small_Metal.png b/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Small_Metal.png deleted file mode 100644 index f5f6cd9cb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_Small_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_XLarge_Harness.png b/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_XLarge_Harness.png deleted file mode 100644 index 52c82e69c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_XLarge_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_XLarge_Metal.png b/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_XLarge_Metal.png deleted file mode 100644 index 867c13eb8..000000000 Binary files a/Assets/Female3DCG/ItemTorso/AllFours/StuddedHarness_XLarge_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/CrotchChain_Large.png b/Assets/Female3DCG/ItemTorso/CrotchChain_Large.png deleted file mode 100644 index e95e457a0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/CrotchChain_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/CrotchChain_Lock.png b/Assets/Female3DCG/ItemTorso/CrotchChain_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemTorso/CrotchChain_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/CrotchChain_Normal.png b/Assets/Female3DCG/ItemTorso/CrotchChain_Normal.png deleted file mode 100644 index 9bc846854..000000000 Binary files a/Assets/Female3DCG/ItemTorso/CrotchChain_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/CrotchChain_Small.png b/Assets/Female3DCG/ItemTorso/CrotchChain_Small.png deleted file mode 100644 index 0c9d19b2c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/CrotchChain_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/CrotchChain_XLarge.png b/Assets/Female3DCG/ItemTorso/CrotchChain_XLarge.png deleted file mode 100644 index 0bac90911..000000000 Binary files a/Assets/Female3DCG/ItemTorso/CrotchChain_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Display.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_Display.png deleted file mode 100644 index 129fcadee..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Display2.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_Display2.png deleted file mode 100644 index d5c0a3eb0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Display2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Large_Band.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_Large_Band.png deleted file mode 100644 index 4725a025e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Large_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Large_Band2.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_Large_Band2.png deleted file mode 100644 index b4e62010e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Large_Band2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Lock.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_Lock.png deleted file mode 100644 index d819f3657..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Lock2.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_Lock2.png deleted file mode 100644 index d6e048b60..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Lock2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Mesh.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_Mesh.png deleted file mode 100644 index e5df883cf..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Normal_Band.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_Normal_Band.png deleted file mode 100644 index 84331be20..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Normal_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Normal_Band2.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_Normal_Band2.png deleted file mode 100644 index e0277056b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Normal_Band2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Small_Band.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_Small_Band.png deleted file mode 100644 index 7b74eb7c6..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Small_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Small_Band2.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_Small_Band2.png deleted file mode 100644 index 9e02fa94d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_Small_Band2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_XLarge_Band.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_XLarge_Band.png deleted file mode 100644 index 67233b0cf..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_XLarge_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/FuturisticHarness_XLarge_Band2.png b/Assets/Female3DCG/ItemTorso/FuturisticHarness_XLarge_Band2.png deleted file mode 100644 index 3ee3df754..000000000 Binary files a/Assets/Female3DCG/ItemTorso/FuturisticHarness_XLarge_Band2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HarnessBra1_Large.png b/Assets/Female3DCG/ItemTorso/HarnessBra1_Large.png deleted file mode 100644 index 9654622de..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HarnessBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HarnessBra1_Lock.png b/Assets/Female3DCG/ItemTorso/HarnessBra1_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HarnessBra1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HarnessBra1_Normal.png b/Assets/Female3DCG/ItemTorso/HarnessBra1_Normal.png deleted file mode 100644 index 10a30c50a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HarnessBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HarnessBra1_Small.png b/Assets/Female3DCG/ItemTorso/HarnessBra1_Small.png deleted file mode 100644 index 56483c344..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HarnessBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HarnessBra1_XLarge.png b/Assets/Female3DCG/ItemTorso/HarnessBra1_XLarge.png deleted file mode 100644 index ea5c90a50..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HarnessBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HarnessBra2_Large.png b/Assets/Female3DCG/ItemTorso/HarnessBra2_Large.png deleted file mode 100644 index 1efb0692b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HarnessBra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HarnessBra2_Lock.png b/Assets/Female3DCG/ItemTorso/HarnessBra2_Lock.png deleted file mode 100644 index f580590df..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HarnessBra2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HarnessBra2_Normal.png b/Assets/Female3DCG/ItemTorso/HarnessBra2_Normal.png deleted file mode 100644 index 3cbdfbe58..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HarnessBra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HarnessBra2_Small.png b/Assets/Female3DCG/ItemTorso/HarnessBra2_Small.png deleted file mode 100644 index e0311128c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HarnessBra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HarnessBra2_XLarge.png b/Assets/Female3DCG/ItemTorso/HarnessBra2_XLarge.png deleted file mode 100644 index ce69b8770..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HarnessBra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_Large.png b/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_Large.png deleted file mode 100644 index 29f40814b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_LargeStraps.png b/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_LargeStraps.png deleted file mode 100644 index ecc088f8e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_LargeStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_Normal.png b/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_Normal.png deleted file mode 100644 index ee6d4aa9a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_NormalStraps.png b/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_NormalStraps.png deleted file mode 100644 index 64d82a6bd..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_NormalStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_Small.png b/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_Small.png deleted file mode 100644 index e672f0d84..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_SmallStraps.png b/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_SmallStraps.png deleted file mode 100644 index 368c1c273..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_SmallStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_XLarge.png b/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_XLarge.png deleted file mode 100644 index 2bdee7fa3..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_XLargeStraps.png b/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_XLargeStraps.png deleted file mode 100644 index dee599925..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HeavyLatexCorset_XLargeStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_Large.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_Large.png deleted file mode 100644 index c4cc5b0ec..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeDiamond.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeDiamond.png deleted file mode 100644 index 9b46745f1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeHarness.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeHarness.png deleted file mode 100644 index 494f7c963..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeStar.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeStar.png deleted file mode 100644 index 9c20f113f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeWaist.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeWaist.png deleted file mode 100644 index fc5b53ee4..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_LargeWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_Normal.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_Normal.png deleted file mode 100644 index 966b64d1a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalDiamond.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalDiamond.png deleted file mode 100644 index 38c53f3aa..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalHarness.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalHarness.png deleted file mode 100644 index 44b648afd..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalStar.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalStar.png deleted file mode 100644 index cf4165896..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalWaist.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalWaist.png deleted file mode 100644 index dc83ebbf4..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_NormalWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_Small.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_Small.png deleted file mode 100644 index ed615ddea..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallDiamond.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallDiamond.png deleted file mode 100644 index 2d6994ebc..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallHarness.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallHarness.png deleted file mode 100644 index b0a0be973..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallStar.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallStar.png deleted file mode 100644 index f14f437de..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallWaist.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallWaist.png deleted file mode 100644 index 312d7ece3..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_SmallWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLarge.png deleted file mode 100644 index 650ba2949..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeDiamond.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeDiamond.png deleted file mode 100644 index f5ab43ba9..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeHarness.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeHarness.png deleted file mode 100644 index 1770aec6e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeStar.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeStar.png deleted file mode 100644 index a801e2703..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeWaist.png b/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeWaist.png deleted file mode 100644 index 30101abc4..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HempRopeHarness_XLargeWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HighSecurityHarness_ClampsHarness.png b/Assets/Female3DCG/ItemTorso/HighSecurityHarness_ClampsHarness.png deleted file mode 100644 index 989131dbe..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HighSecurityHarness_ClampsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HighSecurityHarness_StrapsHarness.png b/Assets/Female3DCG/ItemTorso/HighSecurityHarness_StrapsHarness.png deleted file mode 100644 index 38513b13a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HighSecurityHarness_StrapsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh2_ClampsHarness.png b/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh2_ClampsHarness.png deleted file mode 100644 index a07c379e4..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh2_ClampsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh2_StrapsHarness.png b/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh2_StrapsHarness.png deleted file mode 100644 index 7b1a7cf2b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh2_StrapsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh3_ClampsHarness.png b/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh3_ClampsHarness.png deleted file mode 100644 index 99bd5a8ca..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh3_ClampsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh3_StrapsHarness.png b/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh3_StrapsHarness.png deleted file mode 100644 index af1edd14c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh3_StrapsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh4_ClampsHarness.png b/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh4_ClampsHarness.png deleted file mode 100644 index c7809c4a2..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh4_ClampsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh4_StrapsHarness.png b/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh4_StrapsHarness.png deleted file mode 100644 index 4d771a388..000000000 Binary files a/Assets/Female3DCG/ItemTorso/HighSecurityHarnessh4_StrapsHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Large.png b/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Large.png deleted file mode 100644 index 98f7984f7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Lock.png b/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Normal.png b/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Normal.png deleted file mode 100644 index 892e47ac6..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Small.png b/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Small.png deleted file mode 100644 index fbc5eafbb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_XLarge.png deleted file mode 100644 index 80a2f8380..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/AdultBabyHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Display.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Display.png deleted file mode 100644 index ce5c7c126..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Display2.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Display2.png deleted file mode 100644 index d5c0a3eb0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Display2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Large_Band.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Large_Band.png deleted file mode 100644 index 7e26fe872..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Large_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Large_Band2.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Large_Band2.png deleted file mode 100644 index b4e62010e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Large_Band2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Lock.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Lock.png deleted file mode 100644 index 4f79a5a10..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Lock2.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Lock2.png deleted file mode 100644 index f6e14c32b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Lock2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Mesh.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Mesh.png deleted file mode 100644 index 99e3d266c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Mesh.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Normal_Band.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Normal_Band.png deleted file mode 100644 index 52db9edc2..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Normal_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Normal_Band2.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Normal_Band2.png deleted file mode 100644 index e0277056b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Normal_Band2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Small_Band.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Small_Band.png deleted file mode 100644 index be68d525e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Small_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Small_Band2.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Small_Band2.png deleted file mode 100644 index 9e02fa94d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_Small_Band2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_XLarge_Band.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_XLarge_Band.png deleted file mode 100644 index f3ccd4e1d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_XLarge_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_XLarge_Band2.png b/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_XLarge_Band2.png deleted file mode 100644 index 3ee3df754..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/FuturisticHarness_XLarge_Band2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Large.png b/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Large.png deleted file mode 100644 index 9654622de..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Lock.png b/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Lock.png deleted file mode 100644 index 2f11cb378..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Normal.png b/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Normal.png deleted file mode 100644 index 10a30c50a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Small.png b/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Small.png deleted file mode 100644 index 56483c344..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_XLarge.png b/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_XLarge.png deleted file mode 100644 index ea5c90a50..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Large.png b/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Large.png deleted file mode 100644 index 9bc2a9c42..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Lock.png b/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Lock.png deleted file mode 100644 index f580590df..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Normal.png b/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Normal.png deleted file mode 100644 index f73817b91..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Small.png b/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Small.png deleted file mode 100644 index 7b3045f84..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_XLarge.png b/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_XLarge.png deleted file mode 100644 index 98ea6da86..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HarnessBra2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_Large.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_Large.png deleted file mode 100644 index 58b79ad68..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeDiamond.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeDiamond.png deleted file mode 100644 index ae71ac150..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeHarness.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeHarness.png deleted file mode 100644 index 67d8a6c09..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeStar.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeStar.png deleted file mode 100644 index 9259b7c61..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeWaist.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeWaist.png deleted file mode 100644 index e7c781a8b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_LargeWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_Normal.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_Normal.png deleted file mode 100644 index 9c36e9719..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalDiamond.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalDiamond.png deleted file mode 100644 index eefa70d75..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalHarness.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalHarness.png deleted file mode 100644 index 5f6959649..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalStar.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalStar.png deleted file mode 100644 index bfed2f978..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalWaist.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalWaist.png deleted file mode 100644 index 93e2a7c27..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_NormalWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_Small.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_Small.png deleted file mode 100644 index 8a94052dc..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallDiamond.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallDiamond.png deleted file mode 100644 index 81e41f830..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallHarness.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallHarness.png deleted file mode 100644 index 4a0e3aa82..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallStar.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallStar.png deleted file mode 100644 index d78248dc3..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallWaist.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallWaist.png deleted file mode 100644 index ce0f7b145..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_SmallWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLarge.png deleted file mode 100644 index ff8464f4c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeDiamond.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeDiamond.png deleted file mode 100644 index d9c71cea7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeHarness.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeHarness.png deleted file mode 100644 index 815852aac..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeStar.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeStar.png deleted file mode 100644 index 9a4e11337..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeWaist.png b/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeWaist.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/HempRopeHarness_XLargeWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Large.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Large.png deleted file mode 100644 index 7099e2b66..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Lock.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Lock.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Normal.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Normal.png deleted file mode 100644 index f76921020..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Small.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Small.png deleted file mode 100644 index ed94ed23b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_XLarge.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_XLarge.png deleted file mode 100644 index 25d5c11df..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherBreastBinder_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Large.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Large.png deleted file mode 100644 index 030f5ae4e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Lock.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Lock.png deleted file mode 100644 index 98f16c968..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Normal.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Normal.png deleted file mode 100644 index 4d9c69ab2..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Small.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Small.png deleted file mode 100644 index 8cf2ed2c1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_XLarge.png deleted file mode 100644 index 92eac99a9..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Large.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Large.png deleted file mode 100644 index 706522f9a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Lock.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Lock.png deleted file mode 100644 index 98f16c968..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Normal.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Normal.png deleted file mode 100644 index ed273d4b5..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Small.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Small.png deleted file mode 100644 index 0b9c0512f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_XLarge.png deleted file mode 100644 index a3594914f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LeatherStrapHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_Large.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_Large.png deleted file mode 100644 index 549d33523..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_Normal.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_Normal.png deleted file mode 100644 index 2a21c28e0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_Small.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_Small.png deleted file mode 100644 index 16d07d68e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_XLarge.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_XLarge.png deleted file mode 100644 index e6ac44d1c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_Large.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_Large.png deleted file mode 100644 index f9763dc64..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_LargeDull.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_LargeDull.png deleted file mode 100644 index 0a94113ed..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_LargeDull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_Normal.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_Normal.png deleted file mode 100644 index b5b9c0cfc..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_NormalDull.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_NormalDull.png deleted file mode 100644 index 83e75c6b3..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_NormalDull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_Small.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_Small.png deleted file mode 100644 index 3cd688acd..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_SmallDull.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_SmallDull.png deleted file mode 100644 index 51e443c48..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_SmallDull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_XLarge.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_XLarge.png deleted file mode 100644 index 315f6d7ad..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_XLargeDull.png b/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_XLargeDull.png deleted file mode 100644 index 7410d0fcb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/LockingSwimsuit_XLargeDull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeDiamond_Rope.png deleted file mode 100644 index 696677f78..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeDiamond_Shine.png deleted file mode 100644 index 5ebbad150..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeHarness_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeHarness_Rope.png deleted file mode 100644 index d80c4943c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeHarness_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeHarness_Shine.png deleted file mode 100644 index 776061148..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeStar_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeStar_Rope.png deleted file mode 100644 index bfbe44452..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeStar_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeStar_Shine.png deleted file mode 100644 index 7c767bfbe..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeWaist_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeWaist_Rope.png deleted file mode 100644 index e7c781a8b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeWaist_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeWaist_Shine.png deleted file mode 100644 index e7c781a8b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_LargeWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Large_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Large_Rope.png deleted file mode 100644 index 362f46dc2..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Large_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Large_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Large_Shine.png deleted file mode 100644 index 362f46dc2..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalDiamond_Rope.png deleted file mode 100644 index 5f6f84780..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalDiamond_Shine.png deleted file mode 100644 index 7f968e74d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalHarness_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalHarness_Rope.png deleted file mode 100644 index c8a73001b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalHarness_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalHarness_Shine.png deleted file mode 100644 index 32222445c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalStar_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalStar_Rope.png deleted file mode 100644 index ba35e7e21..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalStar_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalStar_Shine.png deleted file mode 100644 index a6d0d913a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalWaist_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalWaist_Rope.png deleted file mode 100644 index 93e2a7c27..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalWaist_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalWaist_Shine.png deleted file mode 100644 index 93e2a7c27..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_NormalWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Normal_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Normal_Rope.png deleted file mode 100644 index 9690e254f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Normal_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Normal_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Normal_Shine.png deleted file mode 100644 index 9690e254f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallDiamond_Rope.png deleted file mode 100644 index e8867c567..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallDiamond_Shine.png deleted file mode 100644 index a1492abb7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallHarness_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallHarness_Rope.png deleted file mode 100644 index 4df42ecc0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallHarness_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallHarness_Shine.png deleted file mode 100644 index 15bfd9a71..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallStar_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallStar_Rope.png deleted file mode 100644 index 6dd8964a3..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallStar_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallStar_Shine.png deleted file mode 100644 index 1ee9dd7c2..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallWaist_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallWaist_Rope.png deleted file mode 100644 index ce0f7b145..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallWaist_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallWaist_Shine.png deleted file mode 100644 index ce0f7b145..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_SmallWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Small_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Small_Rope.png deleted file mode 100644 index 5844197d0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Small_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Small_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Small_Shine.png deleted file mode 100644 index 5844197d0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeDiamond_Rope.png deleted file mode 100644 index 609098d5d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeDiamond_Shine.png deleted file mode 100644 index b7cce5f73..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeHarness_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeHarness_Rope.png deleted file mode 100644 index 6b5914659..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeHarness_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeHarness_Shine.png deleted file mode 100644 index d2f4c8cbc..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeStar_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeStar_Rope.png deleted file mode 100644 index a04c17834..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeStar_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeStar_Shine.png deleted file mode 100644 index 154268483..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeWaist_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeWaist_Rope.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeWaist_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeWaist_Shine.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLargeWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLarge_Rope.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLarge_Rope.png deleted file mode 100644 index 30be538ab..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLarge_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLarge_Shine.png b/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLarge_Shine.png deleted file mode 100644 index 30be538ab..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/NylonRopeHarness_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_Large.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_Large.png deleted file mode 100644 index ec655d489..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_Normal.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_Normal.png deleted file mode 100644 index a613458f1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_Small.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_Small.png deleted file mode 100644 index 17d411e06..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_XLarge.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_XLarge.png deleted file mode 100644 index 7788528bb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbon_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_Large.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_Large.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_LargeHarness1.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_LargeHarness1.png deleted file mode 100644 index 5514e4e3a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_LargeHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_LargeHarness2.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_LargeHarness2.png deleted file mode 100644 index 14981ea8c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_LargeHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_Normal.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_Normal.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_NormalHarness1.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_NormalHarness1.png deleted file mode 100644 index 93f1ef905..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_NormalHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_NormalHarness2.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_NormalHarness2.png deleted file mode 100644 index 5febe3a74..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_NormalHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_Small.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_Small.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_SmallHarness1.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_SmallHarness1.png deleted file mode 100644 index 4cdf56e10..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_SmallHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_SmallHarness2.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_SmallHarness2.png deleted file mode 100644 index 76dbceba4..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_SmallHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_XLarge.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_XLarge.png deleted file mode 100644 index 214cbcaa1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_XLargeHarness1.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_XLargeHarness1.png deleted file mode 100644 index abccf48ff..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_XLargeHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_XLargeHarness2.png b/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_XLargeHarness2.png deleted file mode 100644 index 50461b046..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/Ribbons_XLargeHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Large_Harness.png b/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Large_Harness.png deleted file mode 100644 index 448b66bcf..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Large_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Large_Metal.png b/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Large_Metal.png deleted file mode 100644 index 9e4954f4f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Large_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Lock.png b/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Lock.png deleted file mode 100644 index 174dc5391..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Normal_Harness.png b/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Normal_Harness.png deleted file mode 100644 index 48d65065e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Normal_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Normal_Metal.png b/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Normal_Metal.png deleted file mode 100644 index 5f5c7ad43..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Normal_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Small_Harness.png b/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Small_Harness.png deleted file mode 100644 index ab7e47372..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Small_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Small_Metal.png b/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Small_Metal.png deleted file mode 100644 index d8e7fde84..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_Small_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_XLarge_Harness.png b/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_XLarge_Harness.png deleted file mode 100644 index da5b71568..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_XLarge_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_XLarge_Metal.png b/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_XLarge_Metal.png deleted file mode 100644 index aa38a368c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Hogtied/StuddedHarness_XLarge_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Large.png b/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Large.png deleted file mode 100644 index 7099e2b66..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Lock.png b/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Lock.png deleted file mode 100644 index 2ecc7ef56..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Normal.png b/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Normal.png deleted file mode 100644 index f76921020..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Small.png b/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Small.png deleted file mode 100644 index ed94ed23b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_XLarge.png b/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_XLarge.png deleted file mode 100644 index 25d5c11df..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherBreastBinder_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherHarness_Large.png b/Assets/Female3DCG/ItemTorso/LeatherHarness_Large.png deleted file mode 100644 index 630935b6c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherHarness_Lock.png b/Assets/Female3DCG/ItemTorso/LeatherHarness_Lock.png deleted file mode 100644 index 98f16c968..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherHarness_Normal.png b/Assets/Female3DCG/ItemTorso/LeatherHarness_Normal.png deleted file mode 100644 index c85f3376e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherHarness_Small.png b/Assets/Female3DCG/ItemTorso/LeatherHarness_Small.png deleted file mode 100644 index 5e3d9860a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/LeatherHarness_XLarge.png deleted file mode 100644 index 52d9f3c74..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_Large.png b/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_Large.png deleted file mode 100644 index 3850a1f00..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_Normal.png b/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_Normal.png deleted file mode 100644 index a5c1a0e56..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_Small.png b/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_Small.png deleted file mode 100644 index b36fdfcec..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_XLarge.png b/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_XLarge.png deleted file mode 100644 index 835068431..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherStrapBra1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Large.png b/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Large.png deleted file mode 100644 index 25346c42c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Lock.png b/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Lock.png deleted file mode 100644 index 98f16c968..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Normal.png b/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Normal.png deleted file mode 100644 index 574e9bca3..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Small.png b/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Small.png deleted file mode 100644 index 9e6c65324..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_XLarge.png b/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_XLarge.png deleted file mode 100644 index 25346c42c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LeatherStrapHarness_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_Large.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_Large.png deleted file mode 100644 index 4877d92e1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_Normal.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_Normal.png deleted file mode 100644 index d875a5137..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_Small.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_Small.png deleted file mode 100644 index 4a1dda9bb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_XLarge.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_XLarge.png deleted file mode 100644 index dd950360a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_Large.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit_Large.png deleted file mode 100644 index 083c15965..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_LargeDull.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit_LargeDull.png deleted file mode 100644 index b11462016..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_LargeDull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_Normal.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit_Normal.png deleted file mode 100644 index 30011de9c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_NormalDull.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit_NormalDull.png deleted file mode 100644 index 9a5593768..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_NormalDull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_Small.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit_Small.png deleted file mode 100644 index 39a874a5c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_SmallDull.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit_SmallDull.png deleted file mode 100644 index cb87d5bcb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_SmallDull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_XLarge.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit_XLarge.png deleted file mode 100644 index 1d9c9006a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_XLargeDull.png b/Assets/Female3DCG/ItemTorso/LockingSwimsuit_XLargeDull.png deleted file mode 100644 index 078fe918e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/LockingSwimsuit_XLargeDull.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeDiamond_Rope.png deleted file mode 100644 index c77e0c467..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeDiamond_Shine.png deleted file mode 100644 index cddaec507..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeHarness_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeHarness_Rope.png deleted file mode 100644 index 4e2827076..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeHarness_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeHarness_Shine.png deleted file mode 100644 index 6f0bf9ff6..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeStar_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeStar_Rope.png deleted file mode 100644 index 48bc0912d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeStar_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeStar_Shine.png deleted file mode 100644 index 4f2d2bc50..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeWaist_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeWaist_Rope.png deleted file mode 100644 index b075de255..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeWaist_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeWaist_Shine.png deleted file mode 100644 index f969f1261..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_LargeWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Large_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Large_Rope.png deleted file mode 100644 index 0744e39f6..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Large_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Large_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Large_Shine.png deleted file mode 100644 index bc06fbf91..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalDiamond_Rope.png deleted file mode 100644 index 2bc930f01..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalDiamond_Shine.png deleted file mode 100644 index 562fe4ff7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalHarness_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalHarness_Rope.png deleted file mode 100644 index b02fe0c61..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalHarness_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalHarness_Shine.png deleted file mode 100644 index 6b07f3a26..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalStar_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalStar_Rope.png deleted file mode 100644 index 0a60ce44d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalStar_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalStar_Shine.png deleted file mode 100644 index 8e3d4fc34..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalWaist_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalWaist_Rope.png deleted file mode 100644 index 2b853ee1b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalWaist_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalWaist_Shine.png deleted file mode 100644 index e071d796d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_NormalWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Normal_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Normal_Rope.png deleted file mode 100644 index c81fcf489..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Normal_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Normal_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Normal_Shine.png deleted file mode 100644 index 499766bd7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallDiamond_Rope.png deleted file mode 100644 index c4a04a02c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallDiamond_Shine.png deleted file mode 100644 index 2f809e2e6..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallHarness_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallHarness_Rope.png deleted file mode 100644 index 64e3ab383..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallHarness_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallHarness_Shine.png deleted file mode 100644 index 595101f1e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallStar_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallStar_Rope.png deleted file mode 100644 index c720860b1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallStar_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallStar_Shine.png deleted file mode 100644 index c596c0a9f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallWaist_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallWaist_Rope.png deleted file mode 100644 index 9284f8d35..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallWaist_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallWaist_Shine.png deleted file mode 100644 index c1b5ee071..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_SmallWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Small_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Small_Rope.png deleted file mode 100644 index 4e76d7bfb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Small_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Small_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Small_Shine.png deleted file mode 100644 index 26bb0c09d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeDiamond_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeDiamond_Rope.png deleted file mode 100644 index a37025258..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeDiamond_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeDiamond_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeDiamond_Shine.png deleted file mode 100644 index 52e322da4..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeDiamond_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeHarness_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeHarness_Rope.png deleted file mode 100644 index d26a59387..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeHarness_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeHarness_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeHarness_Shine.png deleted file mode 100644 index dc6a96910..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeHarness_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeStar_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeStar_Rope.png deleted file mode 100644 index 95a78e219..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeStar_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeStar_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeStar_Shine.png deleted file mode 100644 index 59d695da1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeStar_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeWaist_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeWaist_Rope.png deleted file mode 100644 index 1e4db51c1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeWaist_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeWaist_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeWaist_Shine.png deleted file mode 100644 index 400342bb7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLargeWaist_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLarge_Rope.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLarge_Rope.png deleted file mode 100644 index ec17c2f33..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLarge_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLarge_Shine.png b/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLarge_Shine.png deleted file mode 100644 index 589c3f173..000000000 Binary files a/Assets/Female3DCG/ItemTorso/NylonRopeHarness_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_Large.png b/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_Large.png deleted file mode 100644 index ce2ce535b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_LargeStraps.png b/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_LargeStraps.png deleted file mode 100644 index 10bfe6738..000000000 Binary files a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_LargeStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_Normal.png b/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_Normal.png deleted file mode 100644 index ad666cf27..000000000 Binary files a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_NormalStraps.png b/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_NormalStraps.png deleted file mode 100644 index 368c1c273..000000000 Binary files a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_NormalStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_Small.png b/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_Small.png deleted file mode 100644 index ad666cf27..000000000 Binary files a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_SmallStraps.png b/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_SmallStraps.png deleted file mode 100644 index 6dec248c4..000000000 Binary files a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_SmallStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_XLarge.png b/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_XLarge.png deleted file mode 100644 index ee6d4aa9a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_XLargeStraps.png b/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_XLargeStraps.png deleted file mode 100644 index 64d82a6bd..000000000 Binary files a/Assets/Female3DCG/ItemTorso/OverTheHead/HeavyLatexCorset_XLargeStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/OverTheHead/HempRopeHarness_Large.png b/Assets/Female3DCG/ItemTorso/OverTheHead/HempRopeHarness_Large.png deleted file mode 100644 index c4cc5b0ec..000000000 Binary files a/Assets/Female3DCG/ItemTorso/OverTheHead/HempRopeHarness_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/AdultBabyHarness.png b/Assets/Female3DCG/ItemTorso/Preview/AdultBabyHarness.png deleted file mode 100644 index 25bcac3a7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/AdultBabyHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/CrotchChain.png b/Assets/Female3DCG/ItemTorso/Preview/CrotchChain.png deleted file mode 100644 index 0617c1adb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/CrotchChain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/FuturisticHarness.png b/Assets/Female3DCG/ItemTorso/Preview/FuturisticHarness.png deleted file mode 100644 index 1c4b8e090..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/FuturisticHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/HarnessBra1.png b/Assets/Female3DCG/ItemTorso/Preview/HarnessBra1.png deleted file mode 100644 index 08be788a3..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/HarnessBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/HarnessBra2.png b/Assets/Female3DCG/ItemTorso/Preview/HarnessBra2.png deleted file mode 100644 index c7f7f51f6..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/HarnessBra2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/HeavyLatexCorset.png b/Assets/Female3DCG/ItemTorso/Preview/HeavyLatexCorset.png deleted file mode 100644 index 3552d3c6c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/HeavyLatexCorset.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/HempRopeHarness.png b/Assets/Female3DCG/ItemTorso/Preview/HempRopeHarness.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/HempRopeHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/HighSecurityHarness.png b/Assets/Female3DCG/ItemTorso/Preview/HighSecurityHarness.png deleted file mode 100644 index 2782e6e4f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/HighSecurityHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/LeatherBreastBinder.png b/Assets/Female3DCG/ItemTorso/Preview/LeatherBreastBinder.png deleted file mode 100644 index abdc1a90b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/LeatherBreastBinder.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/LeatherHarness.png b/Assets/Female3DCG/ItemTorso/Preview/LeatherHarness.png deleted file mode 100644 index 5d50755f2..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/LeatherHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/LeatherStrapBra1.png b/Assets/Female3DCG/ItemTorso/Preview/LeatherStrapBra1.png deleted file mode 100644 index 366788104..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/LeatherStrapBra1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/LeatherStrapHarness.png b/Assets/Female3DCG/ItemTorso/Preview/LeatherStrapHarness.png deleted file mode 100644 index 5d0604b0b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/LeatherStrapHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/LockingSwimsuit.png b/Assets/Female3DCG/ItemTorso/Preview/LockingSwimsuit.png deleted file mode 100644 index 465ba711b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/LockingSwimsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/LockingSwimsuit2.png b/Assets/Female3DCG/ItemTorso/Preview/LockingSwimsuit2.png deleted file mode 100644 index 36a51f464..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/LockingSwimsuit2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/NylonRopeHarness.png b/Assets/Female3DCG/ItemTorso/Preview/NylonRopeHarness.png deleted file mode 100644 index d3c1fd4d2..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/NylonRopeHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/PlasticWrap.png b/Assets/Female3DCG/ItemTorso/Preview/PlasticWrap.png deleted file mode 100644 index f559dac76..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/PlasticWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/Ribbons.png b/Assets/Female3DCG/ItemTorso/Preview/Ribbons.png deleted file mode 100644 index 7d3f73b67..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/Ribbons.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/SilkStraps.png b/Assets/Female3DCG/ItemTorso/Preview/SilkStraps.png deleted file mode 100644 index 1502f19b5..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/SilkStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/StuddedHarness.png b/Assets/Female3DCG/ItemTorso/Preview/StuddedHarness.png deleted file mode 100644 index f26c01300..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/StuddedHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Preview/ThinLeatherStraps.png b/Assets/Female3DCG/ItemTorso/Preview/ThinLeatherStraps.png deleted file mode 100644 index bd4544184..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Preview/ThinLeatherStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_Large.png b/Assets/Female3DCG/ItemTorso/Ribbons_Large.png deleted file mode 100644 index e0747b778..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_LargeHarness1.png b/Assets/Female3DCG/ItemTorso/Ribbons_LargeHarness1.png deleted file mode 100644 index d7679a9e1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_LargeHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_LargeHarness2.png b/Assets/Female3DCG/ItemTorso/Ribbons_LargeHarness2.png deleted file mode 100644 index c9ed8ad23..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_LargeHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_Normal.png b/Assets/Female3DCG/ItemTorso/Ribbons_Normal.png deleted file mode 100644 index 0c5ad84f3..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_NormalHarness1.png b/Assets/Female3DCG/ItemTorso/Ribbons_NormalHarness1.png deleted file mode 100644 index e723bf306..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_NormalHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_NormalHarness2.png b/Assets/Female3DCG/ItemTorso/Ribbons_NormalHarness2.png deleted file mode 100644 index 3d9387924..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_NormalHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_Small.png b/Assets/Female3DCG/ItemTorso/Ribbons_Small.png deleted file mode 100644 index 332a88348..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_SmallHarness1.png b/Assets/Female3DCG/ItemTorso/Ribbons_SmallHarness1.png deleted file mode 100644 index d334a6754..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_SmallHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_SmallHarness2.png b/Assets/Female3DCG/ItemTorso/Ribbons_SmallHarness2.png deleted file mode 100644 index 23201a949..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_SmallHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_XLarge.png b/Assets/Female3DCG/ItemTorso/Ribbons_XLarge.png deleted file mode 100644 index c89afaf68..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_XLargeHarness1.png b/Assets/Female3DCG/ItemTorso/Ribbons_XLargeHarness1.png deleted file mode 100644 index bdbdcd343..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_XLargeHarness1.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Ribbons_XLargeHarness2.png b/Assets/Female3DCG/ItemTorso/Ribbons_XLargeHarness2.png deleted file mode 100644 index 66c0d23b9..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Ribbons_XLargeHarness2.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_Large.png b/Assets/Female3DCG/ItemTorso/SilkStraps_Large.png deleted file mode 100644 index 27435467b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_LargeDiamond.png b/Assets/Female3DCG/ItemTorso/SilkStraps_LargeDiamond.png deleted file mode 100644 index 4bf0310b0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_LargeDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_LargeHarness.png b/Assets/Female3DCG/ItemTorso/SilkStraps_LargeHarness.png deleted file mode 100644 index 43b6438b8..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_LargeHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_LargeStar.png b/Assets/Female3DCG/ItemTorso/SilkStraps_LargeStar.png deleted file mode 100644 index a351f776a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_LargeStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_LargeWaist.png b/Assets/Female3DCG/ItemTorso/SilkStraps_LargeWaist.png deleted file mode 100644 index 357d68e8d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_LargeWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_Normal.png b/Assets/Female3DCG/ItemTorso/SilkStraps_Normal.png deleted file mode 100644 index e548f6633..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_NormalDiamond.png b/Assets/Female3DCG/ItemTorso/SilkStraps_NormalDiamond.png deleted file mode 100644 index db5038e64..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_NormalDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_NormalHarness.png b/Assets/Female3DCG/ItemTorso/SilkStraps_NormalHarness.png deleted file mode 100644 index 195323283..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_NormalHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_NormalStar.png b/Assets/Female3DCG/ItemTorso/SilkStraps_NormalStar.png deleted file mode 100644 index f6498aec0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_NormalStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_NormalWaist.png b/Assets/Female3DCG/ItemTorso/SilkStraps_NormalWaist.png deleted file mode 100644 index 2beac22fb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_NormalWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_Small.png b/Assets/Female3DCG/ItemTorso/SilkStraps_Small.png deleted file mode 100644 index 03c16d0ea..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_SmallDiamond.png b/Assets/Female3DCG/ItemTorso/SilkStraps_SmallDiamond.png deleted file mode 100644 index 61e1dfce5..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_SmallDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_SmallHarness.png b/Assets/Female3DCG/ItemTorso/SilkStraps_SmallHarness.png deleted file mode 100644 index e89447722..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_SmallHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_SmallStar.png b/Assets/Female3DCG/ItemTorso/SilkStraps_SmallStar.png deleted file mode 100644 index 009c9e355..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_SmallStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_SmallWaist.png b/Assets/Female3DCG/ItemTorso/SilkStraps_SmallWaist.png deleted file mode 100644 index d4b2fa205..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_SmallWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_XLarge.png b/Assets/Female3DCG/ItemTorso/SilkStraps_XLarge.png deleted file mode 100644 index c25200dfb..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeDiamond.png b/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeDiamond.png deleted file mode 100644 index 60df2b2ee..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeDiamond.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeHarness.png b/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeHarness.png deleted file mode 100644 index 1785ee674..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeStar.png b/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeStar.png deleted file mode 100644 index 005948a46..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeStar.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeWaist.png b/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeWaist.png deleted file mode 100644 index 70aee687d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/SilkStraps_XLargeWaist.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/StuddedHarness_Large_Harness.png b/Assets/Female3DCG/ItemTorso/StuddedHarness_Large_Harness.png deleted file mode 100644 index d0c154ace..000000000 Binary files a/Assets/Female3DCG/ItemTorso/StuddedHarness_Large_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/StuddedHarness_Large_Metal.png b/Assets/Female3DCG/ItemTorso/StuddedHarness_Large_Metal.png deleted file mode 100644 index ffaf2e414..000000000 Binary files a/Assets/Female3DCG/ItemTorso/StuddedHarness_Large_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/StuddedHarness_Lock.png b/Assets/Female3DCG/ItemTorso/StuddedHarness_Lock.png deleted file mode 100644 index 28af52040..000000000 Binary files a/Assets/Female3DCG/ItemTorso/StuddedHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/StuddedHarness_Normal_Harness.png b/Assets/Female3DCG/ItemTorso/StuddedHarness_Normal_Harness.png deleted file mode 100644 index 93ef32fe4..000000000 Binary files a/Assets/Female3DCG/ItemTorso/StuddedHarness_Normal_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/StuddedHarness_Normal_Metal.png b/Assets/Female3DCG/ItemTorso/StuddedHarness_Normal_Metal.png deleted file mode 100644 index 1aeb52664..000000000 Binary files a/Assets/Female3DCG/ItemTorso/StuddedHarness_Normal_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/StuddedHarness_Small_Harness.png b/Assets/Female3DCG/ItemTorso/StuddedHarness_Small_Harness.png deleted file mode 100644 index 91e81b72a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/StuddedHarness_Small_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/StuddedHarness_Small_Metal.png b/Assets/Female3DCG/ItemTorso/StuddedHarness_Small_Metal.png deleted file mode 100644 index 49ccefde9..000000000 Binary files a/Assets/Female3DCG/ItemTorso/StuddedHarness_Small_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/StuddedHarness_XLarge_Harness.png b/Assets/Female3DCG/ItemTorso/StuddedHarness_XLarge_Harness.png deleted file mode 100644 index 93306d660..000000000 Binary files a/Assets/Female3DCG/ItemTorso/StuddedHarness_XLarge_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/StuddedHarness_XLarge_Metal.png b/Assets/Female3DCG/ItemTorso/StuddedHarness_XLarge_Metal.png deleted file mode 100644 index 73bf46fdc..000000000 Binary files a/Assets/Female3DCG/ItemTorso/StuddedHarness_XLarge_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeHarness_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeHarness_Buckle.png deleted file mode 100644 index 0e62d0d01..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeHarness_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeHarness_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeHarness_Locks.png deleted file mode 100644 index 8a250d816..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeHarness_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeHarness_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeHarness_Strap.png deleted file mode 100644 index ed48e985d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeHarness_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeWaist_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeWaist_Buckle.png deleted file mode 100644 index 63ac1675f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeWaist_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeWaist_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeWaist_Locks.png deleted file mode 100644 index 964131d50..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeWaist_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeWaist_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeWaist_Strap.png deleted file mode 100644 index 27b7b4239..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_LargeWaist_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Large_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Large_Buckle.png deleted file mode 100644 index 9cd29b991..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Large_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Large_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Large_Locks.png deleted file mode 100644 index 010fab79d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Large_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Large_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Large_Strap.png deleted file mode 100644 index 23bf28149..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Large_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalHarness_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalHarness_Buckle.png deleted file mode 100644 index 6bdcc4978..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalHarness_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalHarness_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalHarness_Locks.png deleted file mode 100644 index 7a29d7d4f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalHarness_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalHarness_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalHarness_Strap.png deleted file mode 100644 index 1dde64c69..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalHarness_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalWaist_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalWaist_Buckle.png deleted file mode 100644 index 9cc3e0a13..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalWaist_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalWaist_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalWaist_Locks.png deleted file mode 100644 index ff1d77d3e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalWaist_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalWaist_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalWaist_Strap.png deleted file mode 100644 index 82f958e19..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_NormalWaist_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Normal_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Normal_Buckle.png deleted file mode 100644 index 68eda39b0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Normal_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Normal_Locks.png deleted file mode 100644 index c816a4a1c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Normal_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Normal_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Normal_Strap.png deleted file mode 100644 index ea80e4c4d..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Normal_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallHarness_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallHarness_Buckle.png deleted file mode 100644 index 2d0e1f7a0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallHarness_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallHarness_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallHarness_Locks.png deleted file mode 100644 index 1a88e69a4..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallHarness_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallHarness_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallHarness_Strap.png deleted file mode 100644 index 210eb9c30..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallHarness_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallWaist_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallWaist_Buckle.png deleted file mode 100644 index 699ba0d9b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallWaist_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallWaist_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallWaist_Locks.png deleted file mode 100644 index de25fe32c..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallWaist_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallWaist_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallWaist_Strap.png deleted file mode 100644 index fc5baaff7..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_SmallWaist_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Small_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Small_Buckle.png deleted file mode 100644 index dc37e6d51..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Small_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Small_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Small_Locks.png deleted file mode 100644 index f7e9c0f84..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Small_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Small_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Small_Strap.png deleted file mode 100644 index 1884a090f..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_Small_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeHarness_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeHarness_Buckle.png deleted file mode 100644 index 2d0e1f7a0..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeHarness_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeHarness_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeHarness_Locks.png deleted file mode 100644 index 1fefc1b88..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeHarness_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeHarness_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeHarness_Strap.png deleted file mode 100644 index 07d844488..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeHarness_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeWaist_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeWaist_Buckle.png deleted file mode 100644 index 2b33ba5b8..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeWaist_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeWaist_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeWaist_Locks.png deleted file mode 100644 index 06ab5f382..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeWaist_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeWaist_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeWaist_Strap.png deleted file mode 100644 index 95c6ef65b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLargeWaist_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLarge_Buckle.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLarge_Buckle.png deleted file mode 100644 index 369de9ae5..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLarge_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLarge_Locks.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLarge_Locks.png deleted file mode 100644 index f50c94cff..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLarge_Locks.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLarge_Strap.png b/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLarge_Strap.png deleted file mode 100644 index 26b908dc2..000000000 Binary files a/Assets/Female3DCG/ItemTorso/ThinLeatherStraps_XLarge_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Large_Harness.png b/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Large_Harness.png deleted file mode 100644 index a679172ce..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Large_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Large_Metal.png b/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Large_Metal.png deleted file mode 100644 index 1fa8f63a8..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Large_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Lock.png b/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Lock.png deleted file mode 100644 index 28af52040..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Normal_Harness.png b/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Normal_Harness.png deleted file mode 100644 index 101143861..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Normal_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Normal_Metal.png b/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Normal_Metal.png deleted file mode 100644 index e1fd69ef1..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Normal_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Small_Harness.png b/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Small_Harness.png deleted file mode 100644 index 1ac2d2990..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Small_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Small_Metal.png b/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Small_Metal.png deleted file mode 100644 index 967edd37e..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_Small_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_XLarge_Harness.png b/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_XLarge_Harness.png deleted file mode 100644 index 6f89f478b..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_XLarge_Harness.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_XLarge_Metal.png b/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_XLarge_Metal.png deleted file mode 100644 index e8639138a..000000000 Binary files a/Assets/Female3DCG/ItemTorso/Yoked/StuddedHarness_XLarge_Metal.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/ClitAndDildoVibratorbelt_Belt.png b/Assets/Female3DCG/ItemVulva/ClitAndDildoVibratorbelt_Belt.png deleted file mode 100644 index 2d284953f..000000000 Binary files a/Assets/Female3DCG/ItemVulva/ClitAndDildoVibratorbelt_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/ClitAndDildoVibratorbelt_Crotch.png b/Assets/Female3DCG/ItemVulva/ClitAndDildoVibratorbelt_Crotch.png deleted file mode 100644 index 23f194347..000000000 Binary files a/Assets/Female3DCG/ItemVulva/ClitAndDildoVibratorbelt_Crotch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/ClitAndDildoVibratorbelt_Lock.png b/Assets/Female3DCG/ItemVulva/ClitAndDildoVibratorbelt_Lock.png deleted file mode 100644 index e71e65730..000000000 Binary files a/Assets/Female3DCG/ItemVulva/ClitAndDildoVibratorbelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/ClitSuctionCup.png b/Assets/Female3DCG/ItemVulva/ClitSuctionCup.png deleted file mode 100644 index 25d643a4d..000000000 Binary files a/Assets/Female3DCG/ItemVulva/ClitSuctionCup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/ClitoralStimulator_Pussy.png b/Assets/Female3DCG/ItemVulva/ClitoralStimulator_Pussy.png deleted file mode 100644 index 5448ecd5b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/ClitoralStimulator_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/ClitoralStimulator_Stimulator.png b/Assets/Female3DCG/ItemVulva/ClitoralStimulator_Stimulator.png deleted file mode 100644 index 4ce2c0c9e..000000000 Binary files a/Assets/Female3DCG/ItemVulva/ClitoralStimulator_Stimulator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/DoubleEndDildo.png b/Assets/Female3DCG/ItemVulva/DoubleEndDildo.png deleted file mode 100644 index 4731d0064..000000000 Binary files a/Assets/Female3DCG/ItemVulva/DoubleEndDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/DoubleEndDildoLarge.png b/Assets/Female3DCG/ItemVulva/DoubleEndDildoLarge.png deleted file mode 100644 index 9fdf8473e..000000000 Binary files a/Assets/Female3DCG/ItemVulva/DoubleEndDildoLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/FullLatexSuitWand.png b/Assets/Female3DCG/ItemVulva/FullLatexSuitWand.png deleted file mode 100644 index 7687f6504..000000000 Binary files a/Assets/Female3DCG/ItemVulva/FullLatexSuitWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/FullLatexSuitWand_Lock.png b/Assets/Female3DCG/ItemVulva/FullLatexSuitWand_Lock.png deleted file mode 100644 index 5d330169a..000000000 Binary files a/Assets/Female3DCG/ItemVulva/FullLatexSuitWand_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/FuturisticVibrator_Band.png b/Assets/Female3DCG/ItemVulva/FuturisticVibrator_Band.png deleted file mode 100644 index 1a265d3af..000000000 Binary files a/Assets/Female3DCG/ItemVulva/FuturisticVibrator_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/FuturisticVibrator_Display.png b/Assets/Female3DCG/ItemVulva/FuturisticVibrator_Display.png deleted file mode 100644 index 3fa947fdd..000000000 Binary files a/Assets/Female3DCG/ItemVulva/FuturisticVibrator_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/FuturisticVibrator_Lock.png b/Assets/Female3DCG/ItemVulva/FuturisticVibrator_Lock.png deleted file mode 100644 index 389c7462b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/FuturisticVibrator_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/HeavyWeightClamp.png b/Assets/Female3DCG/ItemVulva/HeavyWeightClamp.png deleted file mode 100644 index 0422ac2ea..000000000 Binary files a/Assets/Female3DCG/ItemVulva/HeavyWeightClamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/HempRopeBelt_Rope.png b/Assets/Female3DCG/ItemVulva/HempRopeBelt_Rope.png deleted file mode 100644 index c1c8656f4..000000000 Binary files a/Assets/Female3DCG/ItemVulva/HempRopeBelt_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/HempRopeBelt_Wand.png b/Assets/Female3DCG/ItemVulva/HempRopeBelt_Wand.png deleted file mode 100644 index 7d8d95106..000000000 Binary files a/Assets/Female3DCG/ItemVulva/HempRopeBelt_Wand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/InflatableVibeDildo_Dildo.png b/Assets/Female3DCG/ItemVulva/InflatableVibeDildo_Dildo.png deleted file mode 100644 index 1ec1b38ba..000000000 Binary files a/Assets/Female3DCG/ItemVulva/InflatableVibeDildo_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/InflatableVibeDildo_Pussy.png b/Assets/Female3DCG/ItemVulva/InflatableVibeDildo_Pussy.png deleted file mode 100644 index 5448ecd5b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/InflatableVibeDildo_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/ClitAndDildoVibratorbelt_Belt.png b/Assets/Female3DCG/ItemVulva/Kneel/ClitAndDildoVibratorbelt_Belt.png deleted file mode 100644 index 2d284953f..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/ClitAndDildoVibratorbelt_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/ClitAndDildoVibratorbelt_Crotch.png b/Assets/Female3DCG/ItemVulva/Kneel/ClitAndDildoVibratorbelt_Crotch.png deleted file mode 100644 index 23f194347..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/ClitAndDildoVibratorbelt_Crotch.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/ClitAndDildoVibratorbelt_Lock.png b/Assets/Female3DCG/ItemVulva/Kneel/ClitAndDildoVibratorbelt_Lock.png deleted file mode 100644 index e71e65730..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/ClitAndDildoVibratorbelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/ClitSuctionCup.png b/Assets/Female3DCG/ItemVulva/Kneel/ClitSuctionCup.png deleted file mode 100644 index 25d643a4d..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/ClitSuctionCup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/ClitoralStimulator_Pussy.png b/Assets/Female3DCG/ItemVulva/Kneel/ClitoralStimulator_Pussy.png deleted file mode 100644 index 5448ecd5b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/ClitoralStimulator_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/ClitoralStimulator_Stimulator.png b/Assets/Female3DCG/ItemVulva/Kneel/ClitoralStimulator_Stimulator.png deleted file mode 100644 index 4ce2c0c9e..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/ClitoralStimulator_Stimulator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/FullLatexSuitWand.png b/Assets/Female3DCG/ItemVulva/Kneel/FullLatexSuitWand.png deleted file mode 100644 index 7687f6504..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/FullLatexSuitWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/FullLatexSuitWand_Lock.png b/Assets/Female3DCG/ItemVulva/Kneel/FullLatexSuitWand_Lock.png deleted file mode 100644 index 5d330169a..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/FullLatexSuitWand_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/FuturisticVibrator_Band.png b/Assets/Female3DCG/ItemVulva/Kneel/FuturisticVibrator_Band.png deleted file mode 100644 index 1a265d3af..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/FuturisticVibrator_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/FuturisticVibrator_Display.png b/Assets/Female3DCG/ItemVulva/Kneel/FuturisticVibrator_Display.png deleted file mode 100644 index 3fa947fdd..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/FuturisticVibrator_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/FuturisticVibrator_Lock.png b/Assets/Female3DCG/ItemVulva/Kneel/FuturisticVibrator_Lock.png deleted file mode 100644 index 389c7462b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/FuturisticVibrator_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/HeavyWeightClamp.png b/Assets/Female3DCG/ItemVulva/Kneel/HeavyWeightClamp.png deleted file mode 100644 index 0422ac2ea..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/HeavyWeightClamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/HempRopeBelt_Rope.png b/Assets/Female3DCG/ItemVulva/Kneel/HempRopeBelt_Rope.png deleted file mode 100644 index c1c8656f4..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/HempRopeBelt_Rope.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/HempRopeBelt_Wand.png b/Assets/Female3DCG/ItemVulva/Kneel/HempRopeBelt_Wand.png deleted file mode 100644 index 7d8d95106..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/HempRopeBelt_Wand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/InflatableVibeDildo_Dildo.png b/Assets/Female3DCG/ItemVulva/Kneel/InflatableVibeDildo_Dildo.png deleted file mode 100644 index 1ec1b38ba..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/InflatableVibeDildo_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/InflatableVibeDildo_Pussy.png b/Assets/Female3DCG/ItemVulva/Kneel/InflatableVibeDildo_Pussy.png deleted file mode 100644 index 5448ecd5b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/InflatableVibeDildo_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/LoversVibrator.png b/Assets/Female3DCG/ItemVulva/Kneel/LoversVibrator.png deleted file mode 100644 index 5bfa4af9b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/LoversVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/PenisDildo_Dildo.png b/Assets/Female3DCG/ItemVulva/Kneel/PenisDildo_Dildo.png deleted file mode 100644 index acac83ba3..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/PenisDildo_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/PenisDildo_Pussy.png b/Assets/Female3DCG/ItemVulva/Kneel/PenisDildo_Pussy.png deleted file mode 100644 index 5448ecd5b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/PenisDildo_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/ShockDildo_Dildo.png b/Assets/Female3DCG/ItemVulva/Kneel/ShockDildo_Dildo.png deleted file mode 100644 index 142ab1172..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/ShockDildo_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/ShockDildo_Pussy.png b/Assets/Female3DCG/ItemVulva/Kneel/ShockDildo_Pussy.png deleted file mode 100644 index 5448ecd5b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/ShockDildo_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/Stitches_Cross.png b/Assets/Female3DCG/ItemVulva/Kneel/Stitches_Cross.png deleted file mode 100644 index 5cf49fe86..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/Stitches_Skewed.png b/Assets/Female3DCG/ItemVulva/Kneel/Stitches_Skewed.png deleted file mode 100644 index 79da50f04..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/Stitches_Straight.png b/Assets/Female3DCG/ItemVulva/Kneel/Stitches_Straight.png deleted file mode 100644 index 8d1569c60..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/Stitches_ZigZag.png b/Assets/Female3DCG/ItemVulva/Kneel/Stitches_ZigZag.png deleted file mode 100644 index 55bc7b131..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/TapeStrips.png b/Assets/Female3DCG/ItemVulva/Kneel/TapeStrips.png deleted file mode 100644 index 4ce239f09..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/TapeStrips.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/VibratingDildo_Dildo.png b/Assets/Female3DCG/ItemVulva/Kneel/VibratingDildo_Dildo.png deleted file mode 100644 index 985d48361..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/VibratingDildo_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/VibratingDildo_End.png b/Assets/Female3DCG/ItemVulva/Kneel/VibratingDildo_End.png deleted file mode 100644 index 6b350e177..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/VibratingDildo_End.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/VibratingDildo_Pussy.png b/Assets/Female3DCG/ItemVulva/Kneel/VibratingDildo_Pussy.png deleted file mode 100644 index 5448ecd5b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/VibratingDildo_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/VibratingLatexPanties.png b/Assets/Female3DCG/ItemVulva/Kneel/VibratingLatexPanties.png deleted file mode 100644 index ba55f04af..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/VibratingLatexPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/VibratingLatexPanties_Lock.png b/Assets/Female3DCG/ItemVulva/Kneel/VibratingLatexPanties_Lock.png deleted file mode 100644 index e1dd7b45a..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/VibratingLatexPanties_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/WandBelt_Belt.png b/Assets/Female3DCG/ItemVulva/Kneel/WandBelt_Belt.png deleted file mode 100644 index 2d4852bfd..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/WandBelt_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/WandBelt_Lock.png b/Assets/Female3DCG/ItemVulva/Kneel/WandBelt_Lock.png deleted file mode 100644 index 1d0a41b1a..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/WandBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/WandBelt_Wand.png b/Assets/Female3DCG/ItemVulva/Kneel/WandBelt_Wand.png deleted file mode 100644 index 7d8d95106..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/WandBelt_Wand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Large_Remote.png b/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Large_Remote.png deleted file mode 100644 index 799f01027..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Large_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Large_Strap.png b/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Large_Strap.png deleted file mode 100644 index 8050dca0b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Large_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Normal_Remote.png b/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Normal_Remote.png deleted file mode 100644 index dfa789c48..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Normal_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Normal_Strap.png b/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Normal_Strap.png deleted file mode 100644 index 0d6fcecae..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Normal_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Small_Remote.png b/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Small_Remote.png deleted file mode 100644 index dfa789c48..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Small_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Small_Strap.png b/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Small_Strap.png deleted file mode 100644 index 2f1edb49f..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_Small_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_XLarge_Remote.png b/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_XLarge_Remote.png deleted file mode 100644 index e394cd781..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_XLarge_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_XLarge_Strap.png b/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_XLarge_Strap.png deleted file mode 100644 index be5a7e72d..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Kneel/WiredEgg_XLarge_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/FuturisticVibrator_Band.png b/Assets/Female3DCG/ItemVulva/LegsClosed/FuturisticVibrator_Band.png deleted file mode 100644 index 1a265d3af..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/FuturisticVibrator_Band.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/FuturisticVibrator_Display.png b/Assets/Female3DCG/ItemVulva/LegsClosed/FuturisticVibrator_Display.png deleted file mode 100644 index 3fa947fdd..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/FuturisticVibrator_Display.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/FuturisticVibrator_Lock.png b/Assets/Female3DCG/ItemVulva/LegsClosed/FuturisticVibrator_Lock.png deleted file mode 100644 index 389c7462b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/FuturisticVibrator_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/LoversVibrator.png b/Assets/Female3DCG/ItemVulva/LegsClosed/LoversVibrator.png deleted file mode 100644 index 5bfa4af9b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/LoversVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Large_Remote.png b/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Large_Remote.png deleted file mode 100644 index 799f01027..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Large_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Large_Strap.png b/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Large_Strap.png deleted file mode 100644 index 8050dca0b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Large_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Normal_Remote.png b/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Normal_Remote.png deleted file mode 100644 index dfa789c48..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Normal_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Normal_Strap.png b/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Normal_Strap.png deleted file mode 100644 index 2f1edb49f..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Normal_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Small_Remote.png b/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Small_Remote.png deleted file mode 100644 index dfa789c48..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Small_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Small_Strap.png b/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Small_Strap.png deleted file mode 100644 index 2f1edb49f..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_Small_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_XLarge_Remote.png b/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_XLarge_Remote.png deleted file mode 100644 index e394cd781..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_XLarge_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_XLarge_Strap.png b/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_XLarge_Strap.png deleted file mode 100644 index be5a7e72d..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LegsClosed/WiredEgg_XLarge_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/LoversVibrator.png b/Assets/Female3DCG/ItemVulva/LoversVibrator.png deleted file mode 100644 index 5bfa4af9b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/LoversVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/PenisDildo_Dildo.png b/Assets/Female3DCG/ItemVulva/PenisDildo_Dildo.png deleted file mode 100644 index acac83ba3..000000000 Binary files a/Assets/Female3DCG/ItemVulva/PenisDildo_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/PenisDildo_Pussy.png b/Assets/Female3DCG/ItemVulva/PenisDildo_Pussy.png deleted file mode 100644 index 5448ecd5b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/PenisDildo_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/BenWaBalls.png b/Assets/Female3DCG/ItemVulva/Preview/BenWaBalls.png deleted file mode 100644 index 05e09ff8b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/BenWaBalls.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/ClitAndDildoVibratorbelt.png b/Assets/Female3DCG/ItemVulva/Preview/ClitAndDildoVibratorbelt.png deleted file mode 100644 index 2d284953f..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/ClitAndDildoVibratorbelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/ClitSuctionCup.png b/Assets/Female3DCG/ItemVulva/Preview/ClitSuctionCup.png deleted file mode 100644 index 9569fc803..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/ClitSuctionCup.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/ClitoralStimulator.png b/Assets/Female3DCG/ItemVulva/Preview/ClitoralStimulator.png deleted file mode 100644 index a03c878d1..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/ClitoralStimulator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/DoubleEndDildo.png b/Assets/Female3DCG/ItemVulva/Preview/DoubleEndDildo.png deleted file mode 100644 index f18564e85..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/DoubleEndDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/FullLatexSuitWand.png b/Assets/Female3DCG/ItemVulva/Preview/FullLatexSuitWand.png deleted file mode 100644 index 010a3207b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/FullLatexSuitWand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/FuturisticVibrator.png b/Assets/Female3DCG/ItemVulva/Preview/FuturisticVibrator.png deleted file mode 100644 index e1460f15d..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/FuturisticVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/HeavyWeightClamp.png b/Assets/Female3DCG/ItemVulva/Preview/HeavyWeightClamp.png deleted file mode 100644 index 8d8d1f2f1..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/HeavyWeightClamp.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/HempRopeBelt.png b/Assets/Female3DCG/ItemVulva/Preview/HempRopeBelt.png deleted file mode 100644 index 2ad4cea13..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/HempRopeBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/InflatableVibeDildo.png b/Assets/Female3DCG/ItemVulva/Preview/InflatableVibeDildo.png deleted file mode 100644 index 5affc2d15..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/InflatableVibeDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/LoversVibrator.png b/Assets/Female3DCG/ItemVulva/Preview/LoversVibrator.png deleted file mode 100644 index d62e60d01..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/LoversVibrator.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/LoversVibratorRemote.png b/Assets/Female3DCG/ItemVulva/Preview/LoversVibratorRemote.png deleted file mode 100644 index 9c96b2b44..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/LoversVibratorRemote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/PenisDildo.png b/Assets/Female3DCG/ItemVulva/Preview/PenisDildo.png deleted file mode 100644 index 2aa520908..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/PenisDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/ShockDildo.png b/Assets/Female3DCG/ItemVulva/Preview/ShockDildo.png deleted file mode 100644 index 8431704f1..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/ShockDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/Stitches.png b/Assets/Female3DCG/ItemVulva/Preview/Stitches.png deleted file mode 100644 index 6b829ac48..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/Stitches.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/TapeStrips.png b/Assets/Female3DCG/ItemVulva/Preview/TapeStrips.png deleted file mode 100644 index 725f147d0..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/TapeStrips.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/VibratingDildo.png b/Assets/Female3DCG/ItemVulva/Preview/VibratingDildo.png deleted file mode 100644 index a7394506c..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/VibratingDildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/VibratingEgg.png b/Assets/Female3DCG/ItemVulva/Preview/VibratingEgg.png deleted file mode 100644 index 4c97942ab..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/VibratingEgg.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/VibratingLatexPanties.png b/Assets/Female3DCG/ItemVulva/Preview/VibratingLatexPanties.png deleted file mode 100644 index 85023f353..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/VibratingLatexPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/VibratorRemote.png b/Assets/Female3DCG/ItemVulva/Preview/VibratorRemote.png deleted file mode 100644 index 47465a6f7..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/VibratorRemote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/WandBelt.png b/Assets/Female3DCG/ItemVulva/Preview/WandBelt.png deleted file mode 100644 index 8e37ef7d5..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/WandBelt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Preview/WiredEgg.png b/Assets/Female3DCG/ItemVulva/Preview/WiredEgg.png deleted file mode 100644 index 98d7e7c57..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Preview/WiredEgg.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/ShockDildo_Dildo.png b/Assets/Female3DCG/ItemVulva/ShockDildo_Dildo.png deleted file mode 100644 index 142ab1172..000000000 Binary files a/Assets/Female3DCG/ItemVulva/ShockDildo_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/ShockDildo_Pussy.png b/Assets/Female3DCG/ItemVulva/ShockDildo_Pussy.png deleted file mode 100644 index 5448ecd5b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/ShockDildo_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Spread/Stitches_Cross.png b/Assets/Female3DCG/ItemVulva/Spread/Stitches_Cross.png deleted file mode 100644 index 640ec5780..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Spread/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Spread/Stitches_Skewed.png b/Assets/Female3DCG/ItemVulva/Spread/Stitches_Skewed.png deleted file mode 100644 index afd2a2d33..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Spread/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Spread/Stitches_Straight.png b/Assets/Female3DCG/ItemVulva/Spread/Stitches_Straight.png deleted file mode 100644 index bdf4297f5..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Spread/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Spread/Stitches_ZigZag.png b/Assets/Female3DCG/ItemVulva/Spread/Stitches_ZigZag.png deleted file mode 100644 index db2c35808..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Spread/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Stitches_Cross.png b/Assets/Female3DCG/ItemVulva/Stitches_Cross.png deleted file mode 100644 index 5cf49fe86..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Stitches_Cross.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Stitches_Skewed.png b/Assets/Female3DCG/ItemVulva/Stitches_Skewed.png deleted file mode 100644 index 79da50f04..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Stitches_Skewed.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Stitches_Straight.png b/Assets/Female3DCG/ItemVulva/Stitches_Straight.png deleted file mode 100644 index 8d1569c60..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Stitches_Straight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/Stitches_ZigZag.png b/Assets/Female3DCG/ItemVulva/Stitches_ZigZag.png deleted file mode 100644 index 55bc7b131..000000000 Binary files a/Assets/Female3DCG/ItemVulva/Stitches_ZigZag.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/TapeStrips.png b/Assets/Female3DCG/ItemVulva/TapeStrips.png deleted file mode 100644 index 4ce239f09..000000000 Binary files a/Assets/Female3DCG/ItemVulva/TapeStrips.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/VibratingDildo_Dildo.png b/Assets/Female3DCG/ItemVulva/VibratingDildo_Dildo.png deleted file mode 100644 index c6bd17d33..000000000 Binary files a/Assets/Female3DCG/ItemVulva/VibratingDildo_Dildo.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/VibratingDildo_End.png b/Assets/Female3DCG/ItemVulva/VibratingDildo_End.png deleted file mode 100644 index 6b350e177..000000000 Binary files a/Assets/Female3DCG/ItemVulva/VibratingDildo_End.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/VibratingDildo_Pussy.png b/Assets/Female3DCG/ItemVulva/VibratingDildo_Pussy.png deleted file mode 100644 index 5448ecd5b..000000000 Binary files a/Assets/Female3DCG/ItemVulva/VibratingDildo_Pussy.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/VibratingLatexPanties.png b/Assets/Female3DCG/ItemVulva/VibratingLatexPanties.png deleted file mode 100644 index ba55f04af..000000000 Binary files a/Assets/Female3DCG/ItemVulva/VibratingLatexPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/VibratingLatexPanties_Lock.png b/Assets/Female3DCG/ItemVulva/VibratingLatexPanties_Lock.png deleted file mode 100644 index e1dd7b45a..000000000 Binary files a/Assets/Female3DCG/ItemVulva/VibratingLatexPanties_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/WandBelt_Belt.png b/Assets/Female3DCG/ItemVulva/WandBelt_Belt.png deleted file mode 100644 index 2d4852bfd..000000000 Binary files a/Assets/Female3DCG/ItemVulva/WandBelt_Belt.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/WandBelt_Lock.png b/Assets/Female3DCG/ItemVulva/WandBelt_Lock.png deleted file mode 100644 index 1d0a41b1a..000000000 Binary files a/Assets/Female3DCG/ItemVulva/WandBelt_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/WandBelt_Wand.png b/Assets/Female3DCG/ItemVulva/WandBelt_Wand.png deleted file mode 100644 index 7d8d95106..000000000 Binary files a/Assets/Female3DCG/ItemVulva/WandBelt_Wand.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/WiredEgg_Large_Remote.png b/Assets/Female3DCG/ItemVulva/WiredEgg_Large_Remote.png deleted file mode 100644 index 84ea5f816..000000000 Binary files a/Assets/Female3DCG/ItemVulva/WiredEgg_Large_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/WiredEgg_Large_Strap.png b/Assets/Female3DCG/ItemVulva/WiredEgg_Large_Strap.png deleted file mode 100644 index 5cb591db9..000000000 Binary files a/Assets/Female3DCG/ItemVulva/WiredEgg_Large_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/WiredEgg_Normal_Remote.png b/Assets/Female3DCG/ItemVulva/WiredEgg_Normal_Remote.png deleted file mode 100644 index 31c6c8994..000000000 Binary files a/Assets/Female3DCG/ItemVulva/WiredEgg_Normal_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/WiredEgg_Normal_Strap.png b/Assets/Female3DCG/ItemVulva/WiredEgg_Normal_Strap.png deleted file mode 100644 index 7e018e113..000000000 Binary files a/Assets/Female3DCG/ItemVulva/WiredEgg_Normal_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/WiredEgg_Small_Remote.png b/Assets/Female3DCG/ItemVulva/WiredEgg_Small_Remote.png deleted file mode 100644 index 31c6c8994..000000000 Binary files a/Assets/Female3DCG/ItemVulva/WiredEgg_Small_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/WiredEgg_Small_Strap.png b/Assets/Female3DCG/ItemVulva/WiredEgg_Small_Strap.png deleted file mode 100644 index 7e018e113..000000000 Binary files a/Assets/Female3DCG/ItemVulva/WiredEgg_Small_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/WiredEgg_XLarge_Remote.png b/Assets/Female3DCG/ItemVulva/WiredEgg_XLarge_Remote.png deleted file mode 100644 index bee269ac8..000000000 Binary files a/Assets/Female3DCG/ItemVulva/WiredEgg_XLarge_Remote.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulva/WiredEgg_XLarge_Strap.png b/Assets/Female3DCG/ItemVulva/WiredEgg_XLarge_Strap.png deleted file mode 100644 index 6aac80bcc..000000000 Binary files a/Assets/Female3DCG/ItemVulva/WiredEgg_XLarge_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/AdornedClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/AdornedClitPiercing.png deleted file mode 100644 index 10b6d5553..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/AdornedClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/BarbellClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/BarbellClitPiercing.png deleted file mode 100644 index d37bab6f8..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/BarbellClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/ChastityClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/ChastityClitPiercing.png deleted file mode 100644 index 356818a30..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/ChastityClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/ChastityClitShield.png b/Assets/Female3DCG/ItemVulvaPiercings/ChastityClitShield.png deleted file mode 100644 index 7b2dc8985..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/ChastityClitShield.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/ClitRing_Leash.png b/Assets/Female3DCG/ItemVulvaPiercings/ClitRing_Leash.png deleted file mode 100644 index 152218604..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/ClitRing_Leash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/ClitRing_Ring.png b/Assets/Female3DCG/ItemVulvaPiercings/ClitRing_Ring.png deleted file mode 100644 index 1af3675d7..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/ClitRing_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/HighSecurityVulvaShield.png b/Assets/Female3DCG/ItemVulvaPiercings/HighSecurityVulvaShield.png deleted file mode 100644 index 9b3b79f25..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/HighSecurityVulvaShield.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/JewelClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/JewelClitPiercing.png deleted file mode 100644 index acda1111c..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/JewelClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Kneel/ClitRing_Leash.png b/Assets/Female3DCG/ItemVulvaPiercings/Kneel/ClitRing_Leash.png deleted file mode 100644 index 004057237..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Kneel/ClitRing_Leash.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Kneel/ClitRing_Ring.png b/Assets/Female3DCG/ItemVulvaPiercings/Kneel/ClitRing_Ring.png deleted file mode 100644 index 1af3675d7..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Kneel/ClitRing_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Preview/AdornedClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/Preview/AdornedClitPiercing.png deleted file mode 100644 index 47f011fba..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Preview/AdornedClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Preview/BarbellClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/Preview/BarbellClitPiercing.png deleted file mode 100644 index c90755025..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Preview/BarbellClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Preview/ChastityClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/Preview/ChastityClitPiercing.png deleted file mode 100644 index 00eb8cba4..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Preview/ChastityClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Preview/ChastityClitShield.png b/Assets/Female3DCG/ItemVulvaPiercings/Preview/ChastityClitShield.png deleted file mode 100644 index b04169cda..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Preview/ChastityClitShield.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Preview/ClitRing.png b/Assets/Female3DCG/ItemVulvaPiercings/Preview/ClitRing.png deleted file mode 100644 index ca4942ccf..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Preview/ClitRing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Preview/HighSecurityVulvaShield.png b/Assets/Female3DCG/ItemVulvaPiercings/Preview/HighSecurityVulvaShield.png deleted file mode 100644 index 2637ef38d..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Preview/HighSecurityVulvaShield.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Preview/JewelClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/Preview/JewelClitPiercing.png deleted file mode 100644 index db343b1dd..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Preview/JewelClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Preview/RoundClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/Preview/RoundClitPiercing.png deleted file mode 100644 index 834341152..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Preview/RoundClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Preview/StraightClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/Preview/StraightClitPiercing.png deleted file mode 100644 index 6d9e78e56..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Preview/StraightClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Preview/TapedClitEgg.png b/Assets/Female3DCG/ItemVulvaPiercings/Preview/TapedClitEgg.png deleted file mode 100644 index 4c97942ab..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Preview/TapedClitEgg.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/Preview/VibeHeartClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/Preview/VibeHeartClitPiercing.png deleted file mode 100644 index 45a4d0356..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/Preview/VibeHeartClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Bell.png b/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Bell.png deleted file mode 100644 index 6dd122a43..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Bell.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Chain.png b/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Chain.png deleted file mode 100644 index a7c0bcc27..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_HaremChain.png b/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_HaremChain.png deleted file mode 100644 index 56f134775..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_HaremChain.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_HaremVeil.png b/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_HaremVeil.png deleted file mode 100644 index da77b12fb..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_HaremVeil.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_PulledRing.png b/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_PulledRing.png deleted file mode 100644 index 9460b1252..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_PulledRing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Ring.png b/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Ring.png deleted file mode 100644 index a569e9692..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Weight.png b/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Weight.png deleted file mode 100644 index 8492452b9..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/RoundClitPiercing_Weight.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/StraightClitPiercing.png b/Assets/Female3DCG/ItemVulvaPiercings/StraightClitPiercing.png deleted file mode 100644 index 39f87791d..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/StraightClitPiercing.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/TapedClitEgg_Egg.png b/Assets/Female3DCG/ItemVulvaPiercings/TapedClitEgg_Egg.png deleted file mode 100644 index ba245f6d1..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/TapedClitEgg_Egg.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/TapedClitEgg_Tape.png b/Assets/Female3DCG/ItemVulvaPiercings/TapedClitEgg_Tape.png deleted file mode 100644 index dbf92db85..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/TapedClitEgg_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/VibeHeartClitPiercing_Heart.png b/Assets/Female3DCG/ItemVulvaPiercings/VibeHeartClitPiercing_Heart.png deleted file mode 100644 index 256d030b8..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/VibeHeartClitPiercing_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/ItemVulvaPiercings/VibeHeartClitPiercing_Ring.png b/Assets/Female3DCG/ItemVulvaPiercings/VibeHeartClitPiercing_Ring.png deleted file mode 100644 index bef1697b1..000000000 Binary files a/Assets/Female3DCG/ItemVulvaPiercings/VibeHeartClitPiercing_Ring.png and /dev/null differ diff --git a/Assets/Female3DCG/LayerNames.csv b/Assets/Female3DCG/LayerNames.csv deleted file mode 100644 index be727c6e4..000000000 --- a/Assets/Female3DCG/LayerNames.csv +++ /dev/null @@ -1,1241 +0,0 @@ -ClothStudentOutfit1Dress,Dress -ClothStudentOutfit1Buckle,Buckle -ClothStudentOutfit1Shirt,Shirt -ClothStudentOutfit1Bow,Bow -ClothStudentOutfit3White,Shirt -ClothStudentOutfit3Color,Trim -ClothBabydollDress1Dress,Dress -ClothBabydollDress1Trim,Trim -ClothAdultBabyDress1Dress,Dress -ClothAdultBabyDress1Sash,Sash -ClothAdultBabyDress1Trim,Trim -ClothDressFurFabric,Dress -ClothDressFurFur,Fur -ClothCorsetShirtShirt,Shirt -ClothCorsetShirtCorset,Corset -ClothChineseDress2Dress,Main -ClothChineseDress2Edges,Trim -ClothCollegeOutfit1Shirt,Shirt -ClothCollegeOutfit1Tie,Tie -ClothBodice1Base,Main -ClothBodice1Trim,Trim -ClothBodice1Pattern,Pattern -ClothAdmiralTopJacket,Jacket -ClothAdmiralTopTrim,Trim -ClothAdmiralTopShirt,Shirt -ClothSummerDressLayer1,Chest -ClothSummerDressLayer2,Buttons -ClothSummerDressLayer3,Arm Puffs -ClothSummerDressLayer4,Trim -ClothSummerDressBase,Dress -ClothGrandMageBase,Main Dress -ClothGrandMageBackSkirt,Inside Skirt -ClothGrandMageTrim,Dress Trim -ClothGrandMageBelt,Belts -ClothGrandMageBuckle,Buckle -ClothMaidOutfit1Dress,Dress -ClothMaidOutfit1Apron,Apron -ClothMaidOutfit1Frills,Frills -ClothMaidOutfit2Dress,Dress -ClothMaidOutfit2Apron,Apron -ClothMaidOutfit2Frills,Frills -ClothTShirt2Shirt,Shirt -ClothTShirt2Print,Print -ClothAdultBabyDress2Dress,Dress -ClothAdultBabyDress2Lace,Lace -ClothAdultBabyDress2Bow,Bow -ClothAdultBabyDress3Dress,Dress -ClothAdultBabyDress3Belt,Belt -ClothAdultBabyDress3Collar,Collar -ClothReverseBunnySuitSuit,Suit -ClothReverseBunnySuitGloves,Gloves -ClothFuzzyDressDress,Dress -ClothFuzzyDressTopFur,Fur -ClothCropTopBlouse,Top -ClothCropTopDesign,Design -ClothLaurelBase,Top -ClothLaurelDesign,Design -ClothLaurelLace,Lace -ClothSeethroughTopLace,Lace -ClothSeethroughTopDesign,Design -ClothJacketBase,Jacket -ClothAccessoryBouquetBase,Holder -ClothAccessoryBouquetFlowers,Flowers -ClothAccessoryCapeFront,Front -ClothAccessoryCapeBack,Back -ClothAccessoryBibBase,Bib -ClothAccessoryBibTrim,Trim -ClothAccessoryBibPacis,Pattern -ClothAccessoryBibText,Text -NecklaceNecklaceLockChain,Chain -NecklaceNecklaceLockLock,Lock -NecklaceNecklaceKeyChain,Chain -NecklaceNecklaceKeyKey,Key -NecklaceIDCardString,Lanyard -NecklaceIDCardCard,Card -NecklaceElegantHeartNecklaceNecklace,Necklace -NecklaceElegantHeartNecklaceJewels,Jewels -NecklaceFlowerGarlandCenter,Center -NecklaceFlowerGarlandPetals,Petals -NecklaceNecklaceBallGagBall,Ball -NecklaceNecklaceBallGagStrap,Strap -NecklaceBodyChainNecklaceChains,Chains -NecklaceBodyChainNecklaceChoker,Choker -SuitCatsuitBase,Suit -SuitCatsuitZip,Zip -SuitCatsuitGloves,Gloves -SuitSeethroughSuitZipBase,Suit -SuitSeethroughSuitZipZip,Zip -SuitSeethroughSuitZipGloves,Gloves -SuitSeamlessCatsuitSuit,Suit -SuitSeamlessCatsuitGloves,Gloves -SuitSeethroughSuitSuit,Suit -SuitSeethroughSuitGloves,Gloves -SuitReverseBunnySuitSuit,Suit -SuitReverseBunnySuitGloves,Gloves -BraHaremBraFabric,Fabric -BraHaremBraStraps,Straps -BraHaremBraJewel,Jewel -BraFlowerBraBra,Bra -BraFlowerBraFlowers,Flowers -BraFullLatexBra2Shine,Shine -BraFullLatexBra2Bra,Bra -BraMaidBra1Bra,Bra -BraMaidBra1Frills,Frills -ClothLowerSkirt2Color,Skirt -ClothLowerSkirt2Stripe,Trim -ClothLowerSkirt3Color,Skirt -ClothLowerSkirt3Stripe,Trim -ClothLowerLeggings1Cloth,Cloth -ClothLowerLeggings1Stripe,Stripe -ClothLowerLeggings2Cloth,Cloth -ClothLowerLeggings2Stripe,Stripe -ClothLowerTennisSkirt1Stripe,Trim -ClothLowerTennisSkirt1Color,Cloth -ClothLowerPajama1Cloth, Pants -ClothLowerPajama1Stripe, Trim -ClothLowerAdmiralSkirtCloth,Skirt -ClothLowerAdmiralSkirtStripe,Trim -ClothLowerHaremPantsPanty,Panty -ClothLowerHaremPantsVeil,Veil -ClothLowerHaremPantsPantyline,Panty Line -ClothLowerHaremPants2Panty,Panty -ClothLowerHaremPants2Fabric,Fabric -ClothLowerHaremPants2Veil,Veil -ClothLowerHaremPants2Pantyline,Panty Line -ClothLowerHaremPants2Buttons,Buttons -ClothLowerMageSkirtSkirt,Skirt -ClothLowerMageSkirtWaist,Waistband -ClothLowerPleatedSkirtDress,Skirt -ClothLowerPleatedSkirtStripe,Waistband -ClothLowerTutuBelt,Belt -ClothLowerTutuLayer1,Layer 1 -ClothLowerTutuLayer2,Layer 2 -ClothLowerTutuLayer3,Layer 3 -ClothLowerTutuLayer4,Layer 4 -ClothLowerHulaSkirtBackLeaves,Leaves -ClothLowerHulaSkirtFlowers,Flowers -ClothLowerHulaSkirtPollen,Pollen -ClothLowerElegantSkirtSkirt,Skirt -ClothLowerElegantSkirtDesign,Design -ClothLowerBondageSkirtSkirt,Skirt -ClothLowerBondageSkirtFrill,Frill -ClothLowerBondageSkirtStraps,Straps -SuitLowerCatsuitBase,Suit -SuitLowerCatsuitZip,Zip -SuitLowerSeethroughSuitZipBase,Suit -SuitLowerSeethroughSuitZipZip,Zip -PantiesDiapers2Diaper,Diaper -PantiesDiapers2Cover,Plastic Cover -PantiesDiapers4Diaper,Diaper -PantiesDiapers4Tape,Tape -PantiesDiapers4Pattern,Pattern -PantiesBulkyDiaperBase,Diaper -PantiesBulkyDiaperCrotchPiece,Crotch Padding -PantiesBulkyDiaperWaistBand,Waist Band -PantiesBulkyDiaperTape,Tape -PantiesPoofyDiaperBase,Diaper -PantiesPoofyDiaperCrotchPatch,Crotch Padding -PantiesPoofyDiaperFrills,Frills -PantiesPoofyDiaperTape,Tape -PantiesFlowerPantiesPanties,Panties -PantiesFlowerPantiesFlowers,Flowers -PantiesFloralPanties2Base,Base -PantiesFloralPanties2Flowers,Pattern -PantiesMaidPanties2Frills,Frills -PantiesMaidPanties2Panties,Panties -SocksSocks6Sock,Sock -SocksSocks6Frill,Trim -SocksSocksFurFabric,Sock -SocksSocksFurFur,Fur -SocksSocksStriped1Light,Light Stripes -SocksSocksStriped1Dark,Dark Stripes -SocksHaremStockingsFabric,Fabric -SocksHaremStockingsBands,Bands -HatSanta1Fabric,Hat -HatSanta1Fur,Fur -HatBonnet1Base,Bonnet -HatBonnet1Lace,Lace -HatWitchHat1Hat,Hat -HatWitchHat1Band,Band -HatPirateBandana1Bandana,Bandana -HatPirateBandana1Skull,Skull -HatPirateBandana1Dots,Dots -HatBandanaBow,Bandana -HatBandanaBowPattern,Patterns -HatCrown2Crown,Crown -HatCrown2Jewels,Jewels -HatCrown3Crown,Crown -HatCrown3Jewels,Jewels -HatPoliceWomanHatBadge,Badge -HatPoliceWomanHatHat,Hat -HatCaptainHat1Top,Top -HatCaptainHat1Insignia,Insignia -HatCaptainHat1Rope,Rope -HatCaptainHat1Brim,Brim -HatRoseCrownLeaves,Leaves -HatRoseCrownRoses,Roses -HatFlowerCrownMainFlowers,Main Flowers -HatFlowerCrownPetals,Petals -HatPoppyCrownEndFlowers,End Flowers -HatPoppyCrownMainFlower,Main Flower -HatPoppyCrownSideFlowers,Side Flowers -HatPoppyCrownLeaves,Leaves -HatPoppyCrownCenter,Flower Center -HatLatexHabitCape,Shoulders -HatLatexHabitCollar,Collar -HatLatexHabitBase,Shawl -HatLatexHabitCowl,Cowl -HatBallCapBackButton,Button -HatBallCapBackPanelLeft,Panel -HatBallCapBackSideLeft,Side -HatBallCapBackStrap,Strap -HatBallCapFrontPanel,Panel -HatBallCapFrontPanelLeft,Left Panel -HatBallCapFrontPanelRight,Right Panel -HatBallCapFrontButton,Button -HatBallCapFrontVisor,Visor -HatBallCapFrontPrint,Print -HairAccessory1KittenEars1Outer,Outer Ear -HairAccessory1KittenEars1Inner,Inner Ear -HairAccessory1FoxEars2Inner,Inner Ear -HairAccessory1FoxEars2Outer,Outer Ear -HairAccessory1FoxEars3EarOuter,Outer Ear -HairAccessory1FoxEars3EarInner,Inner Ear -HairAccessory1FoxEars3Strap,Strap -HairAccessory1FoxEars3Bell,Bell -HairAccessory1BunnyEars2Outer,Outer -HairAccessory1BunnyEars2Inner,Inner -HairAccessory1HaloGlow,Glow -HairAccessory1HaloBase,Body -HairAccessory1HaloCore,Core -HairAccessory2KittenEars1Outer,Outer Ear -HairAccessory2KittenEars1Inner,Inner Ear -HairAccessory2FoxEars2Inner,Inner Ear -HairAccessory2FoxEars2Outer,Outer Ear -HairAccessory2FoxEars3EarOuter,Outer Ear -HairAccessory2FoxEars3EarInner,Inner Ear -HairAccessory2FoxEars3Strap,Strap -HairAccessory2FoxEars3Bell,Bell -HairAccessory2BunnyEars2Outer,Outer -HairAccessory2BunnyEars2Inner,Inner -HairAccessory3HaloGlow,Glow -HairAccessory3HaloBase,Body -HairAccessory3HaloCore,Core -HairFrontHairFront22Fluff, Fluff -HairFrontHairFront22Base, Base -HairFrontHairFront22Tip, Tip -HairFrontHairFront22bFluff, Fluff -HairFrontHairFront22bBase, Base -HairFrontHairFront22bTip, Tip -HairFrontHairFront23Fluff, Fluff -HairFrontHairFront23Base, Base -HairFrontHairFront23Tip, Tip -HairFrontHairFront23bFluff, Fluff -HairFrontHairFront23bBase, Base -HairFrontHairFront23bTip, Tip -HairFrontHairFront27Base,Base -HairFrontHairFront27Bangs,Bangs -HairFrontHairFront27BangsTip,Tips -HairFrontHairFront28Base,Base -HairFrontHairFront28Bangs,Bangs -HairFrontHairFront28Tips,Tips -HairFrontHairFront29Left,Left -HairFrontHairFront29Right,Right -HairBackHairBack53Base,Base -HairBackHairBack53Tip,Tips -HairBackHairBack54Left,Left -HairBackHairBack54Right,Right -GlovesGlovesFurFabric,Glove -GlovesGlovesFurFur,Fur -GlovesHaremGloveFabric,Fabric -GlovesHaremGloveBands,Bands -MaskFaceVeilFabric,Fabric -MaskFaceVeilString,String -TailStrapsTailStrapTail,Tail -TailStrapsTailStrapRibbon,Ribbon -TailStrapsTailStrapBell,Bell -TailStrapsFoxTailsStrapBases,Tails -TailStrapsFoxTailsStrapTips,Tips -TailStrapsSuccubusHeartTailStrapTail,Tail -TailStrapsSuccubusHeartTailStrapHeart,Heart -TailStrapsFoxTailStrap1Base,Tail -TailStrapsFoxTailStrap1Tip,Tip -TailStrapsFoxTailStrap2Base,Tail -TailStrapsFoxTailStrap2Tip,Tip -TailStrapsDragonTailStrap1Primary,Primary -TailStrapsDragonTailStrap1Secondary,Secondary -TailStrapsTentaclesInner,Inner -TailStrapsTentaclesOuter,Outer -TailStrapsTentaclesSucker,Suckers -ItemFeetSteelAnkleCuffsCuffs,Cuffs -ItemFeetSteelAnkleCuffsChain,Chain -ItemFeetOrnateAnkleCuffsCuffs,Cuffs -ItemFeetOrnateAnkleCuffsGems,Gems -ItemFeetOrnateAnkleCuffsChain,Chain -ItemFeetFloorShacklesChain,Chain -ItemFeetFloorShacklesCuffs,Cuffs -ItemFeetFuturisticAnkleCuffsChain,Chain -ItemFeetFuturisticAnkleCuffsCuffs,Cuffs -ItemFeetFuturisticAnkleCuffsDisplay,Display -ItemFeetFuturisticAnkleCuffsLock,Lock -ItemFeetLeatherAnkleCuffsCuffs,Cuffs -ItemFeetLeatherAnkleCuffsRings,Rings -ItemFeetLeatherAnkleCuffsChain,Chain -ItemFeetMedicalBedRestraintsBase,Bed Straps -ItemFeetMedicalBedRestraintsStraps,Cuffs -ItemFeetSturdyLeatherBeltsLowerBelt,Lower Belt -ItemFeetSturdyLeatherBeltsLowerMetal,Lower Belt -ItemFeetSturdyLeatherBeltsUpperBelt,Upper Belt -ItemFeetSturdyLeatherBeltsUpperMetal,Upper Belt -ItemFeetSturdyLeatherBeltsFeetBelt,Feet Belt -ItemFeetSturdyLeatherBeltsFeetMetal,Feet Belt -ItemFeetTentaclesInner,Inner -ItemFeetTentaclesOuter,Outer -ItemFeetTentaclesSucker,Suckers -ItemFeetNylonRopeLowerRope,Lower Rope -ItemFeetNylonRopeUpperRope,Upper Rope -ItemFeetSlimeOne,Color 1 -ItemFeetSlimeTwo,Color 2 -ItemLegsFuturisticLegCuffsChain,Chain -ItemLegsFuturisticLegCuffsCuffs,Cuffs -ItemLegsFuturisticLegCuffsDisplay,Display -ItemLegsFuturisticLegCuffsLock,Lock -ItemLegsOrnateLegCuffsCuffs,Cuffs -ItemLegsOrnateLegCuffsGems,Gems -ItemLegsOrnateLegCuffsChain,Chain -ItemLegsLeatherLegCuffsCuffs,Cuffs -ItemLegsLeatherLegCuffsRings,Rings -ItemLegsLeatherLegCuffsChain,Chain -ItemLegsLegBinderLatex,Binder -ItemLegsLegBinderBelts,Belts -ItemLegsHobbleSkirtLatex,Skirt -ItemLegsHobbleSkirtBelts,Belts -ItemLegsMedicalBedRestraintsBase,Bed Straps -ItemLegsMedicalBedRestraintsStraps,Cuffs -ItemLegsSturdyLeatherBeltsLowerBelt,Lower Belt -ItemLegsSturdyLeatherBeltsLowerMetal,Lower Belt -ItemLegsSturdyLeatherBeltsUpperBelt,Upper Belt -ItemLegsSturdyLeatherBeltsUpperMetal,Upper Belt -ItemLegsTentaclesInner,Inner -ItemLegsTentaclesOuter,Outer -ItemLegsTentaclesSucker,Suckers -ItemLegsNylonRopeLowerRope,Lower Rope -ItemLegsNylonRopeUpperRope,Upper Rope -ItemLegsSlimeOne,Color 1 -ItemLegsSlimeTwo,Color 2 -ItemVulvaWandBeltBelt,Belt -ItemVulvaWandBeltWand,Wand -ItemVulvaHempRopeBeltRope,Rope -ItemVulvaHempRopeBeltWand,Wand -ItemVulvaWiredEggRemote,Remote -ItemVulvaWiredEggStrap,Strap -ItemVulvaVibratingDildoDildo,Dildo -ItemVulvaVibratingDildoEnd,End -ItemVulvaFuturisticVibratorBand,Body -ItemVulvaFuturisticVibratorDisplay,Display -ItemVulvaFuturisticVibratorLock,Lock -ItemVulvaStitchesThread,Thread -ItemVulvaPiercingsVibeHeartClitPiercingHeart,Heart -ItemVulvaPiercingsVibeHeartClitPiercingRing,Ring -ItemVulvaPiercingsTapedClitEggEgg,Egg -ItemVulvaPiercingsTapedClitEggTape,Tape -ItemVulvaPiercingsClitRingRing,Ring -ItemVulvaPiercingsClitRingLeash,Leash -ItemVulvaPiercingsRoundClitPiercingRing,Ring -ItemVulvaPiercingsRoundClitPiercingWeight,Weight -ItemVulvaPiercingsRoundClitPiercingBell,Bell -ItemVulvaPiercingsRoundClitPiercingChain,Chain -ItemVulvaPiercingsRoundClitPiercingHaremChain,Harem Chain -ItemVulvaPiercingsRoundClitPiercingHaremVeil,Harem Veil -ItemButtFoxTail1Base,Tail -ItemButtFoxTail1Tip,Tip -ItemButtFoxTail2Base,Tail -ItemButtFoxTail2Tip,Tip -ItemButtSuccubusHeartButtPlugTail,Tail -ItemButtSuccubusHeartButtPlugHeart,Heart -ItemButtTailButtPlugTail,Tail -ItemButtTailButtPlugRibbon,Ribbon -ItemButtTailButtPlugBell,Bell -ItemButtFoxTailsBases,Tails -ItemButtFoxTailsTips,Tips -ItemButtTentaclesInner,Inner -ItemButtTentaclesOuter,Outer -ItemButtTentaclesSucker,Suckers -ItemPelvisOrnateChastityBeltBelt,Belt -ItemPelvisOrnateChastityBeltGems,Gems -ItemPelvisBulkyDiaperBase,Diaper -ItemPelvisBulkyDiaperCrotchPiece,Crotch Padding -ItemPelvisBulkyDiaperWaistBand,Waist Band -ItemPelvisBulkyDiaperTape,Tape -ItemPelvisPoofyDiaperBase,Diaper -ItemPelvisPoofyDiaperCrotchPatch,Crotch Padding -ItemPelvisPoofyDiaperFrills,Frills -ItemPelvisPoofyDiaperTape,Tape -ItemPelvisMetalChastityBeltBelt,Belt -ItemPelvisMetalChastityBeltLock,Lock -ItemPelvisLeatherChastityBeltBelt,Belt -ItemPelvisLeatherChastityBeltStuds,Studs -ItemPelvisLeatherChastityBeltLocks,Locks -ItemPelvisHybridChastityBeltBelt,Belt -ItemPelvisHybridChastityBeltCrotchPlate,Crotch Plate -ItemPelvisHybridChastityBeltRivets,Rivets -ItemPelvisHybridChastityBeltLock,Lock -ItemPelvisObedienceBeltBase,Base -ItemPelvisObedienceBeltTrim,Trim -ItemPelvisObedienceBeltText,Engraving -ItemPelvisObedienceBeltCrotchShield,Crotch Shield -ItemPelvisObedienceBeltPositiveWire,Positive Wire -ItemPelvisObedienceBeltNegativeWire,Negative Wire -ItemNipplesChainClampChain,Chain -ItemNipplesChainClampMetal,Metal -ItemNipplesChainClampClamp,Clamps -ItemNipplesTapedVibeEggsEgg1,Left Vibe Egg -ItemNipplesTapedVibeEggsEgg2,Right Vibe Egg -ItemNipplesTapedVibeEggsTape1,Left Tape Strip -ItemNipplesTapedVibeEggsTape2,Right Tape Strip -ItemNipplesStretchCloversFrame,Frame -ItemNipplesStretchCloversClamps,Clamps -ItemNipplesPiercingsRoundPiercingPiercings,Piercings -ItemNipplesPiercingsRoundPiercingWeights,Weights -ItemNipplesPiercingsRoundPiercingChain,Chain -ItemNipplesPiercingsVibeHeartPiercingsHeart,Heart -ItemNipplesPiercingsVibeHeartPiercingsRing,Ring -ItemNipplesPiercingsNecklacePiercingChainChain,Chain -ItemNipplesPiercingsNecklacePiercingChainHeart,Heart -ItemNipplesPiercingsNecklacePiercingChainPiercing,Piercing -ItemBreastOrnateChastityBraBra,Bra -ItemBreastOrnateChastityBraGems,Gems -ItemArmsBoxTieArmbinderBase,Base -ItemArmsBoxTieArmbinderShine,Shine -ItemArmsLeatherCuffsCuffs,Cuffs -ItemArmsLeatherCuffsRings,Rings -ItemArmsOrnateCuffsCuffs,Cuffs -ItemArmsOrnateCuffsGems,Gems -ItemArmsStraitLeotardLower,Lower Half -ItemArmsStraitLeotardGloves,Gloves -ItemArmsStraitLeotardUpper,Upper Half -ItemArmsBoleroLeather,Jacket -ItemArmsBoleroBelts,Straps -ItemArmsStraitDressLatex,Dress -ItemArmsStraitDressBelts,Straps -ItemArmsStraitDressOpenLatex,Dress -ItemArmsStraitDressOpenBelts,Straps -ItemArmsFullLatexSuitLatex,Suit -ItemArmsFullLatexSuitBase,Straps -ItemArmsBondageBouquetBase,Holder -ItemArmsBondageBouquetFlowers,Flowers -ItemArmsLatexArmbinderLatex,Binder -ItemArmsLatexArmbinderLaces,Laces -ItemArmsLatexArmbinderStrap1,Strap -ItemArmsLatexArmbinderBuckle1,Buckle -ItemArmsLatexArmbinderHole1,Buckle Hole -ItemArmsLatexArmbinderStrap2,Strap -ItemArmsLatexArmbinderBuckle2,Buckle -ItemArmsLatexArmbinderHole2,Buckle Hole -ItemArmsPrisonLockdownSuitSuit,Suit -ItemArmsPrisonLockdownSuitBelts,Straps -ItemArmsHighSecurityStraitJacketCrotch,Crotch Panel -ItemArmsHighSecurityStraitJacketJacketLoose,Jacket -ItemArmsHighSecurityStraitJacketStrapsLoose,Jacket -ItemArmsHighSecurityStraitJacketCrotchStrapsSingle,Crotch -ItemArmsYokeStraps,Straps -ItemArmsYokeBars,Bars -ItemArmsWristShacklesCuffs,Cuffs -ItemArmsWristShacklesChain,Chain -ItemArmsPilloryWood,Wood -ItemArmsPilloryMetal,Metal -ItemArmsLeatherArmbinderBinder,Binder -ItemArmsLeatherArmbinderStrap,Straps -ItemArmsArmbinderJacketJacket,Jacket -ItemArmsArmbinderJacketStraps,Straps -ItemArmsArmbinderJacketRings,Buckles -ItemArmsHempRope,Ropes -ItemArmsHempRopeSuspension,Suspension Rope -ItemArmsChains,Chains -ItemArmsChainsSuspension,Suspension Chain -ItemArmsFuturisticArmbinderDisplay,Display -ItemArmsFuturisticArmbinderBinder,Binder -ItemArmsFuturisticArmbinderBand,Band -ItemArmsFuturisticArmbinderStraps,Straps -ItemArmsFuturisticArmbinderLock,Lock -ItemArmsFuturisticStraitjacketBand,Band -ItemArmsFuturisticStraitjacketDisplay,Display -ItemArmsFuturisticStraitjacketMesh,Mesh -ItemArmsFuturisticStraitjacketLower,Material -ItemArmsFuturisticStraitjacketSides,Sides -ItemArmsFuturisticStraitjacketLock,Lock -ItemArmsMedicalBedRestraintsBase,Bed Straps -ItemArmsMedicalBedRestraintsStraps,Cuffs -ItemArmsCeilingShacklesChain,Chain -ItemArmsCeilingShacklesCuffs,Cuffs -ItemArmsFuturisticCuffsCuffs,Cuffs -ItemArmsFuturisticCuffsLock,Lock -ItemArmsFuturisticCuffsDisplay,Display -ItemArmsSturdyLeatherBeltsWaistBelt,Waist Belt -ItemArmsSturdyLeatherBeltsWaistMetal,Waist Belt -ItemArmsSturdyLeatherBeltsUpperTorsoBelt,Above Breast Belt -ItemArmsSturdyLeatherBeltsUpperTorsoMetal,Above Breast Belt -ItemArmsSturdyLeatherBeltsLowerTorsoBelt,Below Breast Belt -ItemArmsSturdyLeatherBeltsLowerTorsoMetal,Below Breast Belt -ItemArmsTransportJacketShorts,Shorts -ItemArmsTransportJacketJacket,Jacket -ItemArmsTransportJacketText,Text -ItemArmsTransportJacketStripes,Jacket -ItemArmsTransportJacketStripesLegs,Shorts -ItemArmsTransportJacketStraps,Straps -ItemArmsBitchSuitLatex,Suit -ItemArmsBitchSuitLock,Locks -ItemArmsBitchSuitExposedLatex,Suit -ItemArmsBitchSuitExposedLock,Locks -ItemArmsTentaclesLowerInner,Inner -ItemArmsTentaclesLowerSucker,Suckers -ItemArmsTentaclesLowerOuter,Outer -ItemArmsTentaclesInner,Inner -ItemArmsTentaclesOuter,Outer -ItemArmsTentaclesSucker,Suckers -ItemArmsSlimeBaseOne,Color 1 -ItemArmsSlimeBaseTwo,Color 2 -ItemArmsSlimeGirlBack,Slime Girl -ItemHandsFuturisticMittensBody,Body -ItemHandsFuturisticMittensMesh,Mesh -ItemHandsFuturisticMittensDisplay,Display -ItemHandsFuturisticMittensLock,Lock -ItemNeckHighCollarLeather,Leather -ItemNeckHighCollarRings,Rings -ItemNeckPostureCollarCollar,Collar -ItemNeckPostureCollarRing1,Middle Ring -ItemNeckPostureCollarRing2,Left Ring -ItemNeckPostureCollarRing3,Right Ring -ItemNeckLeatherCollarCollar,Collar -ItemNeckLeatherCollarRing,Ring -ItemNeckLeatherChokerLeather,Leather -ItemNeckLeatherChokerMetal,Metal -ItemNeckMaidCollarFrills,Frills -ItemNeckMaidCollarCollar,Collar -ItemNeckMaidCollarBrooch,Brooch -ItemNeckFuturisticCollarBand,Band -ItemNeckFuturisticCollarMesh,Mesh (for copying to items) -ItemNeckFuturisticCollarDisplay,Display -ItemNeckFuturisticCollarLock,Lock -ItemNeckOrnateCollarCollar,Collar -ItemNeckOrnateCollarGem,Gems -ItemNeckShinySteelCollarCollar,Collar -ItemNeckShinySteelCollarRing,Ring -ItemNeckGothicCollarCollar,Collar -ItemNeckGothicCollarOrnaments,Ornaments -ItemNeckGothicCollarJewels,Jewels -ItemNeckGothicCollarMetal,Metal -ItemNeckGothicCollarFlowers,Flowers -ItemNeckTechnoCollarSlenderCollarBase,Collar -ItemNeckTechnoCollarSlenderCollarSides,Side Plates -ItemNeckHeartLinkChokerLeatherStrap,Leather Strap -ItemNeckHeartLinkChokerHeartLink,Heart Link -ItemNeckAccessoriesCustomCollarTagTag,Tag -ItemNeckAccessoriesCustomCollarTagText,Text -ItemNeckAccessoriesElectronicTagTag,Tag -ItemNeckAccessoriesElectronicTagDisplay,Display -ItemNeckAccessoriesElectronicTagText,Text -ItemNeckRestraintsCollarRopeShortRope,Rope -ItemNeckRestraintsCollarRopeShortPlate,Plate -ItemNeckRestraintsCollarRopeMediumRope,Rope -ItemNeckRestraintsCollarRopeMediumPlate,Plate -ItemNeckRestraintsCollarRopeLongRope,Rope -ItemNeckRestraintsCollarRopeLongPlate,Plate -ItemNeckRestraintsPostChain,Chain -ItemNeckRestraintsPostHead,Cap -ItemNeckRestraintsPostPost,Post -ItemNeckRestraintsPostBase,Baseplate -ItemNeckRestraintsPetPostPole,Pole -ItemNeckRestraintsPetPostPlaque,Plaque -ItemNeckRestraintsPetPostPlaqueBorder,PlaqueBorder -ItemNeckRestraintsPetPostPostit,Postit -ItemNeckRestraintsPetPostPaw,Sticker -ItemNeckRestraintsPetPostPlaqueBolts,PlaqueBolts -ItemNeckRestraintsPetPostLeash,Leash -ItemNeckRestraintsPetPostRope,Rope -ItemNeckRestraintsPetPostChain,Chain -ItemNeckRestraintsPetPostText,Text -ItemNeckComboHarnessRing,Ring -ItemNeckComboHarnessStuds,Studs -ItemNeckComboHarnessBall,Ball -ItemNeckComboHarnessBuckles,Buckles -ItemNeckComboHarnessHarness,Harness -ItemNeckBonedNeckCorsetBase,Base -ItemNeckBonedNeckCorsetShine,Shine -ItemNeckBonedNeckCorsetStripes,Stripes -ItemNeckBonedNeckCorsetStripesShine,Stripes Shine -ItemNeckBonedNeckCorsetRing,Ring -ItemMiscWoodenSignSign,Sign -ItemMiscWoodenSignRope,Rope -ItemMiscWoodenSignText,Text -ItemMiscWoodenSignRope,Rope -ItemMiscWoodenSignText,Text -ItemDevicesBedPillow,Pillow -ItemDevicesBedMattress,Mattress -ItemDevicesBedHeadboard,Headboard -ItemDevicesBedBedFrame,Frame -ItemDevicesBondageBenchBench,Bench -ItemDevicesBondageBenchStraps,Straps -ItemDevicesCoffinInside,Velvet -ItemDevicesCoffinFrame,Frame -ItemDevicesCoffinOpen,Lid (open) -ItemDevicesCoffinClosed,Lid (closed) -ItemDevicesCryoCapsuleInside,Bottom -ItemDevicesCryoCapsuleFrame,Frame -ItemDevicesCryoCapsuleOpen,Lid (open) -ItemDevicesCryoCapsuleClosed,Lid (closed) -ItemDevicesCageFrame,Frame -ItemDevicesCageMesh,Mesh -ItemDevicesCageTint,Tint -ItemDevicesX-CrossCross,Frame -ItemDevicesX-CrossPadding,Padding -ItemDevicesChangingTableFrame,Frame -ItemDevicesChangingTableTable,Tabletop -ItemDevicesCribFrame,Frame -ItemDevicesCribMattress,Mattress -ItemDevicesCribPillow,Pillow -ItemDevicesCribPillowTrim,Pillow Trim -ItemDevicesCribPlushies,Plushies -ItemDevicesConcealingCloakFront,Cloak -ItemDevicesConcealingCloakStrap,Straps -ItemDevicesKennelKennel,Kennel -ItemDevicesKennelFrame,Front Frame -ItemDevicesKennelDoor,Door -ItemDevicesKennelPadding,Padding -ItemDevicesPetBedBed,Bed -ItemDevicesPetBedLining,Bed Lining -ItemDevicesPetBedBlanket,Blanket -ItemDevicesPetBedInner,Blanket Lining -ItemDevicesTransportWoodenBoxBack,Wood -ItemDevicesTransportWoodenBoxWheelholders,Wheel Holders -ItemDevicesTransportWoodenBoxWheels,Wheels -ItemDevicesTransportWoodenBoxText,Text -ItemDevicesWoodenBoxBack,Wood -ItemDevicesWoodenBoxText,Text -ItemDevicesPetBowlBowl,Bowl -ItemDevicesPetBowlText,Text -ItemDevicesVacBedDeluxeSheetBack,Sheet Back -ItemDevicesVacBedDeluxeSheetFront,Sheet Front -ItemDevicesVacBedDeluxeSheet,Sheet -ItemDevicesVacBedDeluxeUpper,Upper -ItemDevicesVacBedDeluxeLower,Lower -ItemDevicesVacBedDeluxeBody,Body -ItemDevicesVacBedDeluxeFrame,Frame -ItemDevicesFuckMachineCaps,Caps -ItemDevicesFuckMachinePlastic,Plastic -ItemDevicesFuckMachineMetal,Metal -ItemDevicesFuckMachinePole,Pole -ItemDevicesFuckMachineDildo,Dildo -ItemDevicesFurBlanketWrapBlanket,Blanket -ItemDevicesFurBlanketWrapBelts,Belts -ItemDevicesNetFront,Net -ItemDevicesNetWeightsFront,Weights -ItemDevicesSnowmanButtons,Buttons -ItemDevicesSnowmanStickHands,Arms -ItemDevicesWoodenHorseFrame,Frame -ItemDevicesWoodenHorseWood,Wood -ItemAddonCoversOuter,Outer -ItemAddonCoversInner,Inner -ItemNoseNoseHookBand,Strap -ItemNoseNoseHookHook,Hook -ItemNosePigNoseNose,Nose -ItemNosePigNoseStrap,Strap -ItemHoodPumpkinHeadFront,Front -ItemHoodPumpkinHeadBack,Back -ItemHoodLatexHoodOpenHairHair,Hair -ItemHoodLatexHoodOpenHairHood,Hood -ItemHoodLeatherHoodHood,Hood -ItemHoodLeatherHoodCollar,Collar -ItemHoodLeatherHoodSnaps,Snaps -ItemHoodKirugumiMaskMask,Face -ItemHoodKirugumiMaskEyes1,Eyes -ItemHoodKirugumiMaskMouth1,Mouth -ItemHoodKirugumiMaskBlush1,Blush -ItemHoodGP9GasMaskMouth,Mouthpiece -ItemHoodGP9GasMaskLens,Lens -ItemHoodGP9GasMaskMask,Mask -ItemHoodGP9GasMaskEdges,Edges -ItemHoodCanvasHoodHood,Canvas -ItemHoodCanvasHoodText,Text -ItemHoodOldGasMaskMask,Mask -ItemHoodOldGasMaskLenses,Blinding Lenses -ItemHoodOldGasMaskTubeA,Breathing Attachment -ItemHoodTechnoHelmet1TransparentVisor,Visor -ItemHoodTechnoHelmet1ChinStrap,Chin Strap -ItemHoodTechnoHelmet1HelmetMain,Helmet -ItemHoodTechnoHelmet1HelmetSecondary,Side Pieces -ItemHoodTechnoHelmet1HypnoSpiral,Hypno Spiral Icon -ItemHoodFoxyMaskUpper,Upper -ItemHoodFoxyMaskLower,Lower -ItemHoodLampHeadHoodInside,Interior -ItemHoodLampHeadHoodSwitch,Switch -ItemHoodLampHeadHoodLamp,Exterior -ItemHoodCollarHoodHood,Hood -ItemHoodCollarHoodCollar,Collar -ItemHoodCowHoodBase,Hood -ItemHoodCowHoodSpots,Spots -ItemHoodLatexHabitBase,Shawl -ItemHoodLatexHabitCowl,Cowl -ItemHoodLatexHabitCape,Shoulders -ItemHoodLatexHabitCollar,Collar -ItemHoodHeadboxSeethroughGlassInside,Inside -ItemHoodHeadboxSeethroughFrame,Outside -ItemHoodSlimeOne,Color 1 -ItemHoodSlimeTwo,Color 2 -ItemHoodKittyHoodBase,Base -ItemHoodKittyHoodLinings,Linings -ItemHoodKittyHoodPanel,Forehead Panel -ItemHoodKittyHoodDisplay,Display -ItemHoodKittyHoodOpenings,Openings -ItemHoodKittyHoodBlindfold,Blindfold -ItemHoodKittyHoodGag,Gag -ItemHoodKittyHoodDrawings,Drawings -ItemHoodKittyHoodLock,Lock -ItemHoodOpenMouthPlugHoodLenses,Lenses -ItemHoodOpenMouthPlugHoodHood,Hood -ItemHoodOpenMouthPlugHoodPlug,Plug -ItemHoodDroneMaskBase,Mask -ItemHoodDroneMaskShine,Shine -ItemHoodDroneMaskEyeRegular,Eyes -ItemHoodDroneMaskMouthOnahole,Mouth -ItemHoodDroneMaskBarcode,Pattern -ItemBootsLockingBoots1Boots,Boots -ItemBootsLockingBoots1Straps,Straps -ItemBootsFuturisticHeelsShoes,Body -ItemBootsFuturisticHeelsDisplay,Display -ItemBootsFuturisticHeelsLock,Lock -ItemBootsFuturisticHeels2Mesh,Body -ItemBootsFuturisticHeels2Shine,Shine -ItemBootsFuturisticHeels2Cuffs,Cuffs -ItemBootsFuturisticHeels2Trim,Trim -ItemBootsFuturisticHeels2Soles,Heels -ItemBootsFuturisticHeels2Display,Display -ItemBootsFuturisticHeels2Lock,Lock -ItemBootsLeatherFootMitts1Mitts,Mittens -ItemBootsLeatherFootMitts1Straps,Straps -ItemBootsSlimeOne,Color 1 -ItemBootsSlimeTwo,Color 2 -ItemBootsMonoHeelBinder,Binder -ItemBootsMonoHeelVamp,Vamp -ItemBootsMonoHeelTrim,Trim -GartersGarterBeltLeft,Left -GartersGarterBeltRight,Right -ShoesSneakers1Main,Main -ShoesSneakers1Front,Front -ShoesSneakers1Laces,Laces -ShoesSneakers2Shoes,Shoes -ShoesSneakers2Laces,Laces -ShoesFuturisticHeels2Mesh,Body -ShoesFuturisticHeels2Shine,Shine -ShoesFuturisticHeels2Cuffs,Cuffs -ShoesFuturisticHeels2Trim,Trim -ShoesFuturisticHeels2Soles,Heels -ShoesFuturisticHeels2Lock,Lock -ShoesBoots1Shoes,Inner -ShoesBoots1Sides,Outer -ShoesBoots1Laces,Laces -ShoesSandalsRSTop,Top -ShoesSandalsRSSoles,Soles -ShoesFlippersShoes,Shoes -ShoesFlippersFins,Fins -ShoesDeluxeBootsBoots,Outer -ShoesDeluxeBootsLaces,Inner & Laces -ShoesDeluxeBootsHeels,Heels -ShoesDeluxeBootsStraps,Straps -ShoesDeluxeBootsBuckles,Buckles -ShoesFuzzyBootsHeels,Heels -ShoesFuzzyBootsBoots,Boots -ShoesFuzzyBootsFur,Fur -ItemMouthWiffleGagStrap,Strap -ItemMouthWiffleGagBall,Ball -ItemMouthHarnessBallGagBall,Ball -ItemMouthHarnessBallGagHarness,Harness -ItemMouthHarnessPonyBitsMetal, Metal -ItemMouthHarnessPonyBitsStraps, Straps -ItemMouthHarnessPonyBitsBobble, Bobble -ItemMouthCupholderGagGag,Gag -ItemMouthCupholderGagHolder,Holder -ItemMouthCupholderGagCup,Cup -ItemMouthDildoGagStrap,Strap -ItemMouthDildoGagDildo,Dildo -ItemMouthDildoPlugGagStrap,Strap -ItemMouthDildoPlugGagClose,Close -ItemMouthBambooGagRod,Rod -ItemMouthBambooGagRope,Rope -ItemMouthHarnessBallGag1Ball,Ball -ItemMouthHarnessBallGag1Strap,Strap -ItemMouthBallGagBall,Ball -ItemMouthBallGagStrap,Strap -ItemMouthBallBase,Ball -ItemMouthBallStripes,Stripes -ItemMouthBallGagMaskStrap,Strap -ItemMouthBallGagMaskBall,Ball -ItemMouthMedicalMaskInner,Inner -ItemMouthMedicalMaskOuter,Outer -ItemMouthPrisonLockdownGagMask,Mask -ItemMouthPrisonLockdownGagStraps,Straps -ItemMouthPrisonLockdownGagBelts,Belts -ItemMouthCarrotGagCarrot,Carrot -ItemMouthCarrotGagStraps,Straps -ItemMouthPumpkinGagPumpkin,Pumpkin -ItemMouthPumpkinGagStraps,Straps -ItemMouthPumpkinGagRings,Rings -ItemMouthFoxyHarnessPanelGagPanel,Panel -ItemMouthFoxyHarnessPanelGagStraps,Straps -ItemMouthBitGagBit,Bit -ItemMouthBitGagStraps,Straps -ItemMouthBoneGagBone,Bone -ItemMouthBoneGagStraps,Straps -ItemMouthXLBoneGagBone,Bone -ItemMouthXLBoneGagStraps,Straps -ItemMouthHarnessPacifierGagHarness,Harness Straps -ItemMouthHarnessPacifierGagMetal,Metal Parts -ItemMouthHarnessPacifierGagPacifierOuter,Pacifier -ItemMouthHarnessPacifierGagPacifierInner,Pacifier Ring -ItemMouthDusterGagDuster,Duster -ItemMouthDusterGagPanel,Panel -ItemMouthPantiesMaskDarkStripes,Dark Stripes -ItemMouthPantiesMaskLightStripes,Light Stripes -ItemMouthShoeGagShoe,Shoe -ItemMouthShoeGagStrap,Strap -ItemMouthHarnessPanelGagPanel,Panel -ItemMouthHarnessPanelGagStraps,Straps -ItemMouthHarnessPanelGagMetal,Metal -ItemMouthLipGagLips,Lips -ItemMouthLipGagStraps,Straps -ItemMouthLipGagRings,Rings -ItemMouthMuzzleGagMuzzle,Muzzle -ItemMouthMuzzleGagStraps,Straps -ItemMouthFuturisticMuzzleMask,Muzzle -ItemMouthFuturisticMuzzleNose,Nose -ItemMouthFuturisticMuzzleStraps,Harness -ItemMouthFuturisticMuzzleIconLock,Icon -ItemMouth2FuturisticMuzzleMask,Muzzle -ItemMouth2FuturisticMuzzleNose,Nose -ItemMouth2FuturisticMuzzleStraps,Harness -ItemMouth2FuturisticMuzzleIconLock,Icon -ItemMouth3FuturisticMuzzleMask,Muzzle -ItemMouth3FuturisticMuzzleNose,Nose -ItemMouth3FuturisticMuzzleStraps,Harness -ItemMouth3FuturisticMuzzleIconLock,Icon -ItemMouthFuturisticPanelGagMask,Muzzle -ItemMouthFuturisticPanelGagBall,Display -ItemMouthFuturisticPanelGagLight,Light -ItemMouthFuturisticPanelGagLock,Lock -ItemMouthFuturisticHarnessPanelGagStraps,Straps -ItemMouthFuturisticHarnessPanelGagMask,Muzzle -ItemMouthFuturisticHarnessPanelGagBall,Display -ItemMouthFuturisticHarnessPanelGagLock,Lock -ItemMouthFuturisticHarnessPanelGagLight,Light -ItemMouthFuturisticHarnessBallGagStraps,Straps -ItemMouthFuturisticHarnessBallGagMask,Ball -ItemMouthFuturisticHarnessBallGagBall,Display -ItemMouthFuturisticHarnessBallGagLight,Light -ItemMouthFuturisticHarnessBallGagLock,Lock -ItemMouthGasMaskGagMask,Mask -ItemMouthGasMaskGagSides,Sides -ItemMouthGasMaskGagHighlights,Highlights -ItemMouthCageMuzzleStrap,Straps -ItemMouthCageMuzzleMuzzle,Cage -ItemMouthPaciGagBase,Pacifier -ItemMouthPaciGagStraps,Straps -ItemMouthPaciGagMetal,Buckles -ItemMouthOTNPlugGagBase,Base -ItemMouthOTNPlugGagStraps,Straps -ItemMouthOTNPlugGagPlug,Plug -ItemMouthKittyGagBase,Base -ItemMouthKittyGagLines,Lines -ItemMouthKittyGagMouth,Mouth -ItemMouthKittyHarnessPanelGagPanel,Panel -ItemMouthKittyHarnessPanelGagStraps,Straps -ItemMouthKittyHarnessPanelGagLines,Lines -ItemMouthKittyHarnessPanelGagMouth,Mouth -ItemMouthKittyMuzzleGagMuzzle,Muzzle -ItemMouthKittyMuzzleGagStraps,Straps -ItemMouthKittyMuzzleGagLines,Lines -ItemMouthKittyMuzzleGagMouth,Mouth -ItemMouthPonyGagBaseMetal,Metal -ItemMouthPonyGagBaseStraps,Straps -ItemMouthPonyGagBitLarge,Gag -ItemMouthPonyGagPlume,Plume -ItemMouthPonyGagManeB,ManeBase -ItemMouthPonyGagManeL,Mane -ItemMouthPonyGagHorn,Horn -ItemMouthPonyGagPanelBase,Panel -ItemMouthPonyGagPanelHex,Ornament -ItemMouthPonyGagReins,Reins -ItemMouthPonyGagFlags,Flags -ItemMouthPonyGagRope,Rope -ItemMouthPonyGagBlinders,Blinders -ItemMouthPonyGagPost,Post -ItemMouthLatexSheathGagBase,Mouth -ItemMouthLatexSheathGagShine,Mouth Shine -ItemMouth2WiffleGagStrap,Strap -ItemMouth2WiffleGagBall,Ball -ItemMouth2HarnessBallGagBall,Ball -ItemMouth2HarnessBallGagHarness,Harness -ItemMouth2HarnessPonyBitsMetal, Metal -ItemMouth2HarnessPonyBitsStraps, Straps -ItemMouth2HarnessPonyBitsBobble, Bobble -ItemMouth2CupholderGagGag,Gag -ItemMouth2CupholderGagHolder,Holder -ItemMouth2CupholderGagCup,Cup -ItemMouth2DildoGagStrap,Strap -ItemMouth2DildoGagDildo,Dildo -ItemMouth2HarnessBallGag1Ball,Ball -ItemMouth2HarnessBallGag1Strap,Strap -ItemMouth2BallGagBall,Ball -ItemMouth2BallGagStrap,Strap -ItemMouth2BallGagMaskStrap,Strap -ItemMouth2BallGagMaskBall,Ball -ItemMouth2MedicalMaskInner,Inner -ItemMouth2MedicalMaskOuter,Outer -ItemMouth2PrisonLockdownGagMask,Mask -ItemMouth2PrisonLockdownGagStraps,Straps -ItemMouth2PrisonLockdownGagBelts,Belts -ItemMouth2CarrotGagCarrot,Carrot -ItemMouth2CarrotGagStraps,Straps -ItemMouth2PumpkinGagPumpkin,Pumpkin -ItemMouth2PumpkinGagStraps,Straps -ItemMouth2PumpkinGagRings,Rings -ItemMouth2FoxyHarnessPanelGagPanel,Panel -ItemMouth2FoxyHarnessPanelGagStraps,Straps -ItemMouth2BitGagBit,Bit -ItemMouth2BitGagStraps,Straps -ItemMouth2BoneGagBone,Bone -ItemMouth2BoneGagStraps,Straps -ItemMouth2XLBoneGagBone,Bone -ItemMouth2XLBoneGagStraps,Straps -ItemMouth2HarnessPacifierGagHarness,Harness Straps -ItemMouth2HarnessPacifierGagMetal,Metal Parts -ItemMouth2HarnessPacifierGagPacifierOuter,Pacifier -ItemMouth2HarnessPacifierGagPacifierInner,Pacifier Ring -ItemMouth2DusterGagDuster,Duster -ItemMouth2DusterGagPanel,Panel -ItemMouth2PantiesMaskDarkStripes,Dark Stripes -ItemMouth2PantiesMaskLightStripes,Light Stripes -ItemMouth2ShoeGagShoe,Shoe -ItemMouth2ShoeGagStrap,Strap -ItemMouth2HarnessPanelGagPanel,Panel -ItemMouth2HarnessPanelGagStraps,Straps -ItemMouth2HarnessPanelGagMetal,Metal -ItemMouth2LipGagLips,Lips -ItemMouth2LipGagStraps,Straps -ItemMouth2LipGagRings,Rings -ItemMouth2MuzzleGagMuzzle,Muzzle -ItemMouth2MuzzleGagStraps,Straps -ItemMouth2GasMaskGagMask,Mask -ItemMouth2GasMaskGagSides,Sides -ItemMouth2GasMaskGagHighlights,Highlights -ItemMouth2CageMuzzleStrap,Straps -ItemMouth2CageMuzzleMuzzle,Cage -ItemMouth2PaciGagBase,Pacifier -ItemMouth2PaciGagStraps,Straps -ItemMouth2PaciGagMetal,Buckles -ItemMouth2KittyGagBase,Base -ItemMouth2KittyGagLines,Lines -ItemMouth2KittyGagMouth,Mouth -ItemMouth2KittyHarnessPanelGagPanel,Panel -ItemMouth2KittyHarnessPanelGagStraps,Straps -ItemMouth2KittyHarnessPanelGagLines,Lines -ItemMouth2KittyHarnessPanelGagMouth,Mouth -ItemMouth2KittyMuzzleGagMuzzle,Muzzle -ItemMouth2KittyMuzzleGagStraps,Straps -ItemMouth2KittyMuzzleGagLines,Lines -ItemMouth2KittyMuzzleGagMouth,Mouth -ItemMouth2PonyGagBaseMetal,Metal -ItemMouth2PonyGagBaseStraps,Straps -ItemMouth2PonyGagBitLarge,Gag -ItemMouth2PonyGagPlume,Plume -ItemMouth2PonyGagManeB,ManeBase -ItemMouth2PonyGagManeL,Mane -ItemMouth2PonyGagHorn,Horn -ItemMouth2PonyGagPanelBase,Panel -ItemMouth2PonyGagPanelHex,Ornament -ItemMouth2PonyGagReins,Reins -ItemMouth2PonyGagFlags,Flags -ItemMouth2PonyGagRope,Rope -ItemMouth2PonyGagBlinders,Blinders -ItemMouth2PonyGagPost,Post -ItemMouth2MouthFeatureGagBase,Mouth -ItemMouth2MouthFeatureGagShine,Mouth Shine -ItemMouth2MouthFeatureGagPanel,Panel -ItemMouth2MouthFeatureGagPanelShine,Panel Shine -ItemMouth3WiffleGagStrap,Strap -ItemMouth3WiffleGagBall,Ball -ItemMouth3HarnessBallGagBall,Ball -ItemMouth3HarnessBallGagHarness,Harness -ItemMouth3CupholderGagGag,Gag -ItemMouth3CupholderGagHolder,Holder -ItemMouth3CupholderGagCup,Cup -ItemMouth3DildoGagStrap,Strap -ItemMouth3DildoGagDildo,Dildo -ItemMouth3HarnessBallGag1Ball,Ball -ItemMouth3HarnessBallGag1Strap,Strap -ItemMouth3HarnessPonyBitsMetal, Metal -ItemMouth3HarnessPonyBitsStraps, Straps -ItemMouth3HarnessPonyBitsBobble, Bobble -ItemMouth3BallGagBall,Ball -ItemMouth3BallGagStrap,Strap -ItemMouth3BallGagMaskStrap,Strap -ItemMouth3BallGagMaskBall,Ball -ItemMouth3MedicalMaskInner,Inner -ItemMouth3MedicalMaskOuter,Outer -ItemMouth3PrisonLockdownGagMask,Mask -ItemMouth3PrisonLockdownGagStraps,Straps -ItemMouth3PrisonLockdownGagBelts,Belts -ItemMouth3CarrotGagCarrot,Carrot -ItemMouth3CarrotGagStraps,Straps -ItemMouth3PumpkinGagPumpkin,Pumpkin -ItemMouth3PumpkinGagStraps,Straps -ItemMouth3PumpkinGagRings,Rings -ItemMouth3FoxyHarnessPanelGagPanel,Panel -ItemMouth3FoxyHarnessPanelGagStraps,Straps -ItemMouth3BitGagBit,Bit -ItemMouth3BitGagStraps,Straps -ItemMouth3BoneGagBone,Bone -ItemMouth3BoneGagStraps,Straps -ItemMouth3XLBoneGagBone,Bone -ItemMouth3XLBoneGagStraps,Straps -ItemMouth3HarnessPacifierGagHarness,Harness Straps -ItemMouth3HarnessPacifierGagMetal,Metal Parts -ItemMouth3HarnessPacifierGagPacifierOuter,Pacifier -ItemMouth3HarnessPacifierGagPacifierInner,Pacifier Ring -ItemMouth3DusterGagDuster,Duster -ItemMouth3DusterGagPanel,Panel -ItemMouth3PantiesMaskDarkStripes,Dark Stripes -ItemMouth3PantiesMaskLightStripes,Light Stripes -ItemMouth3ShoeGagShoe,Shoe -ItemMouth3ShoeGagStrap,Strap -ItemMouth3HarnessPanelGagPanel,Panel -ItemMouth3HarnessPanelGagStraps,Straps -ItemMouth3HarnessPanelGagMetal,Metal -ItemMouth3LipGagLips,Lips -ItemMouth3LipGagStraps,Straps -ItemMouth3LipGagRings,Rings -ItemMouth3MuzzleGagMuzzle,Muzzle -ItemMouth3MuzzleGagStraps,Straps -ItemMouth3CageMuzzleStrap,Straps -ItemMouth3CageMuzzleMuzzle,Cage -ItemMouth3GasMaskGagMask,Mask -ItemMouth3GasMaskGagSides,Sides -ItemMouth3GasMaskGagHighlights,Highlights -ItemMouth3PaciGagBase,Pacifier -ItemMouth3PaciGagStraps,Straps -ItemMouth3PaciGagMetal,Buckles -ItemMouth3KittyGagBase,Base -ItemMouth3KittyGagLines,Lines -ItemMouth3KittyGagMouth,Mouth -ItemMouth3KittyHarnessPanelGagPanel,Panel -ItemMouth3KittyHarnessPanelGagStraps,Straps -ItemMouth3KittyHarnessPanelGagLines,Lines -ItemMouth3KittyHarnessPanelGagMouth,Mouth -ItemMouth3KittyMuzzleGagMuzzle,Muzzle -ItemMouth3KittyMuzzleGagStraps,Straps -ItemMouth3KittyMuzzleGagLines,Lines -ItemMouth3KittyMuzzleGagMouth,Mouth -ItemMouth3PonyGagBaseMetal,Metal -ItemMouth3PonyGagBaseStraps,Straps -ItemMouth3PonyGagBitLarge,Gag -ItemMouth3PonyGagPlume,Plume -ItemMouth3PonyGagManeB,ManeBase -ItemMouth3PonyGagManeL,Mane -ItemMouth3PonyGagHorn,Horn -ItemMouth3PonyGagPanelBase,Panel -ItemMouth3PonyGagPanelHex,Ornament -ItemMouth3PonyGagReins,Reins -ItemMouth3PonyGagFlags,Flags -ItemMouth3PonyGagRope,Rope -ItemMouth3PonyGagBlinders,Blinders -ItemMouth3PonyGagPost,Post -ItemMouth3StitchesFakeMouth,Lips -ItemMouth3StitchesStraight,Thread -MaskFoxMaskUpper,Upper -MaskFoxMaskLower,Lower -MaskKittyMask3Highlights,Highlights -MaskKittyMask3Mask,Mask -MaskPetNoseCheeks,Cheeks -MaskPetNoseNose,Nose -MaskPetNoseGloss,Nose Gloss -MaskPetNoseWhiskers,Whiskers -MaskGlitterFreckles,Color One -MaskGlitterFreckles2,Color Two -ItemTorsoHighSecurityHarnessStrapsHarness,Straps -ItemTorsoHighSecurityHarnessClampsHarness,Clasps -ItemTorsoFuturisticHarnessBand,Straps -ItemTorsoFuturisticHarnessDisplay,Display -ItemTorsoFuturisticHarnessMesh,Module -ItemTorsoFuturisticHarnessLock,Lock -ItemBreastFuturisticBraBra,Body -ItemBreastFuturisticBraDisplay,Display -ItemBreastFuturisticBraMesh,Mesh -ItemBreastFuturisticBraLock,Lock -ItemBreastFuturisticBraText,Text -ItemBreastFuturisticBra2Bra,Body -ItemBreastFuturisticBra2Display,Display -ItemBreastFuturisticBra2Mesh,Mesh -ItemBreastFuturisticBra2Shine,Shine -ItemBreastFuturisticBra2Lock,Lock -ItemBreastFuturisticBra2Straps,Straps -ItemPelvisFuturisticChastityBeltScreen,Screen -ItemPelvisFuturisticChastityBeltMesh,Mesh -ItemPelvisFuturisticChastityBeltMesh2_3,Padding -ItemPelvisFuturisticChastityBeltPlugCap,Plug Cap -ItemPelvisFuturisticChastityBeltPlug_4,Plug -ItemPelvisFuturisticChastityBeltBelt,Front -ItemPelvisFuturisticChastityBeltLock,Lock -ItemPelvisFuturisticChastityBeltBand_2,Band -ItemPelvisFuturisticChastityBeltStrap_4,Strap -ItemPelvisFuturisticTrainingBeltDisplay,Screen -ItemPelvisFuturisticTrainingBeltMesh,Body -ItemPelvisFuturisticTrainingBeltMesh2,Padding -ItemPelvisFuturisticTrainingBeltBelt,Front -ItemPelvisFuturisticTrainingBeltBand,Band -ItemPelvisFuturisticTrainingBeltLock,Lock -ItemPelvisSciFiPleasurePantiesScreen,Interface -ItemPelvisSciFiPleasurePantiesMesh2,Panty Base -ItemPelvisSciFiPleasurePantiesMesh1,Wires -ItemPelvisSciFiPleasurePantiesBand,Metal Band -ItemPelvisSciFiPleasurePantiesPlug2,Pussy Toy -ItemPelvisSciFiPleasurePantiesPlug1,Clitoris Toy -ItemPelvisSciFiPleasurePantiesLock,Lock Icon -ItemDevicesFuturisticCrateDisplay,Screen -ItemDevicesFuturisticCrateLock,Lock -ItemDevicesFuturisticCrateFrame,Frame -ItemDevicesFuturisticCrateLid,Lid -ItemDevicesFuturisticCrateLid_Closed,Lid -ItemDevicesFuturisticCrateBody,Padding -ItemDevicesFuturisticCrateStrapsArms,Restraint Frame -ItemDevicesFuturisticCrateStrapsHarness,Harness Straps -ItemDevicesFuturisticCrateClampsHarness,Harness Clamps -ItemDevicesFuturisticCrateStrapsArmsMesh,Restraint Padding -ItemDevicesFuturisticCrateDevicePleasure,Harness -ItemDevicesFuturisticCrateDevicePleasureHolder,Actuator -ItemDevicesFuturisticCrateDevicePleasurePlug,Dildo -ItemDevicesFuturisticCrateDevicePleasureStructure,Structure -ItemDevicesFuturisticCrateGlass,Window -ItemDevicesDollBoxCover,Outside -ItemDevicesDollBoxBack,Inside -ItemDevicesDollBoxDollText,Label -ItemDevicesDollBoxText,Custom Text -ItemDevicesDollBoxHeart,Heart -ItemDevicesDollBoxGlass,Glass -ItemDevicesWoodenRackBack,Back -ItemDevicesWoodenRackFrameWood,Wooden Frame -ItemDevicesWoodenRackFrameMetal,Metal -ItemDevicesWoodenRackFrameStains,Stains -ItemDevicesWoodenRackTopRopes, Ropes -ItemDevicesWoodenRackTopChains,Chains -ItemDevicesWoodenRackTopStocksBack,Arm Stocks -ItemDevicesWoodenRackBotStocksBack,Feet Stocks -PantiesPilotPantiesLayer1,Suit -PantiesPilotPantiesLayer2,Highlights -PantiesPilotPantiesLayer3,Center -PantiesRedBowPantiesPanties,Panties -PantiesRedBowPantiesBow,Bow -SuitLowerPilotSuitLayer1,Suit -SuitLowerPilotSuitLayer2,Highlights -SuitLowerPilotSuitLayer3,Center -SuitLowerPilotSuitLayer4,Underlayment -SuitPilotSuitLayer1,Suit -SuitPilotSuitLayer2,Highlights -SuitPilotSuitLayer3,Center -SuitPilotSuitLayer4,Arms -SuitPilotSuitGloves,Gloves -SuitPilotSuitFeet,Feet -CorsetCorset6Cloth,Cloth -CorsetCorset6Leather,Leather -CorsetCorset6Buttons,Buttons -ItemEarsHeadphonesDark,Dark -ItemEarsHeadphonesLight,Light -ItemEarsFuturisticEarphonesBand,Band -ItemEarsFuturisticEarphonesDisplay,Display -ItemEarsFuturisticEarphonesLock,Lock -ItemHandsPaddedMittensGloves,Gloves -ItemHandsPaddedMittensStraps,Straps -ItemHandsPaddedMittensBuckles,Buckles -ItemHandsPawMittensGloves,Gloves -ItemHandsPawMittensStraps,Straps -ItemHandsPawMittensBuckles,Buckles -ItemHandsPawMittensPaws,Paws -ItemHeadBlackoutLensesLeft,Left Lens -ItemHeadBlackoutLensesRight,Right Lens -ItemHeadInteractiveVRHeadsetDisplay,Display -ItemHeadInteractiveVRHeadsetBody,Body -ItemHeadFrilledSleepMaskFrills,Frills -ItemHeadFrilledSleepMaskMask,Mask -ItemHeadFuturisticMaskDisplay,Tint -ItemHeadFuturisticMaskText,HUD -ItemHeadFuturisticMaskLock,Lock Icon -ItemHeadStitchesStraight,Thread Right -ItemHeadStitchesStraight2,Thread Left -ClothAccessoryBunnyCollarCuffsCuffs,Cuffs -ClothAccessoryBunnyCollarCuffsCollar,Collar -ClothAccessoryBunnyCollarCuffsBow,Bow -ClothAccessoryGlitterFreckles,Color One -ClothAccessoryGlitterFreckles2,Color Two -ItemHeadPaddedBlindfoldBase,Blindfold -ItemHeadPaddedBlindfoldTrim,Trim -ItemHeadKittyBlindfoldBase,Base -ItemHeadKittyBlindfoldEyes,Eyes -ItemHeadKittyBlindfoldEars,Ears -ItemHeadMedicalPatchRight,Right Eye -ItemHeadMedicalPatchLeft,Left Eye -ItemHeadMedicalPatchRightHeart,Right Eye Sticker -ItemHeadMedicalPatchLeftHeart,Left Eye Sticker -ItemHeadDroneMaskBase,Mask -ItemHeadDroneMaskShine,Shine -ItemHeadDroneMaskEyeRegular,Eyes -ItemHeadDroneMaskMouthOnahole,Mouth -ItemHeadDroneMaskBarcode,Pattern -ItemDevicesWetFloorSign,Sign -ItemDevicesWetFloorText,Text -BraCuteBikini1Main,Main -BraCuteBikini1Sides,Sides -BraSexyBikini1Main,Main -BraSexyBikini1Sides,Sides -ItemMiscServingTrayTray,Tray -ItemMiscServingTrayObjects,Refreshments -ItemMiscServingTrayDetails,Details -BraceletSpikeBandsBands,Bands -BraceletSpikeBandsSpikes,Spikes -BraceletLaceBandsLace,Lace -BraceletLaceBandsBands,Bands -WingsSteampunkWingsGears,Gears -WingsSteampunkWingsWings,Wings -WingsSteampunkWingsWingFrames,Frame -WingsBeeWingsWings,Wings -WingsBeeWingsVeins,Veins -WingsBeeWingsBone,Bone -WingsCyberWingsBase,Base -WingsCyberWingsShade,Shade -WingsCyberWingsHighlights,Highlights -WingsPixieWingsWings,Wings -WingsPixieWingsVeins,Veins -GlassesVGlassesFrame,Frame -GlassesVGlassesGlass,Lenses -GlassesGradientSunglassesFrame,Frame -GlassesGradientSunglassesGlass,Glass -GlovesBikerGlovesHands,Gloves -GlovesBikerGlovesStraps,Straps diff --git a/Assets/Female3DCG/LayerNames_CN.txt b/Assets/Female3DCG/LayerNames_CN.txt deleted file mode 100644 index e42d49159..000000000 --- a/Assets/Female3DCG/LayerNames_CN.txt +++ /dev/null @@ -1,762 +0,0 @@ -Dress -裙子 -Buckle -皮带扣 -Shirt -衬衫 -Bow -领结 -Trim -装饰 -Sash -腰带 -Fur -绒毛 -Corset -束腰 -Main -主体 -Tie -领带 -Pattern -图案 -Jacket -外套 -Chest -胸部 -Buttons -扣子 -Arm Puffs -肩部蓬松 -Main Dress -裙子主体 -Inside Skirt -裙子内侧 -Dress Trim -裙边 -Belts -皮带 -Apron -围裙 -Frills -花边 -Print -图案 -Lace -蕾丝 -Belt -皮带 -Collar -领子 -Suit -套装 -Gloves -手套 -Top -上部 -Design -样式 -Holder -包装 -Flowers -花朵 -Front -前部 -Back -后部 -Bib -围嘴 -Text -文字 -Chain -锁链 -Lock -锁 -Key -钥匙 -Lanyard -挂带 -Card -卡 -Necklace -项链 -Jewels -珠宝 -Center -中部 -Petals -花瓣 -Ball -球 -Strap -束带 -Chains -锁链 -Choker -颈环 -Zip -拉链 -Fabric -布料 -Straps -束带 -Jewel -珠宝 -Bra -胸罩 -Shine -高光 -Skirt -裙子 -Cloth -布料 -Stripe -条纹 - Pants -裤子 - Trim -剪裁 -Panty -内裤 -Veil -面纱 -Panty Line -内裤绳 -Waistband -腕带 -Layer 1 -第1层 -Layer 2 -第2层 -Layer 3 -第2层 -Layer 4 -第4层 -Leaves -叶子 -Pollen -花蕊 -Frill -褶边 -Diaper -尿裤 -Plastic Cover -塑料外层 -Tape -胶带 -Crotch Padding -跨部垫子 -Waist Band -腰带 -Panties -内裤 -Base -打底 -Sock -袜子 -Light Stripes -亮条纹 -Dark Stripes -暗条纹 -Bands -束带 -Hat -帽子 -Bonnet -童帽 -Band -束带 -Bandana -大头巾 -Skull -头骨 -Dots -圆点 -Patterns -样式 -Crown -王冠 -Badge -徽记 -Insignia -徽章 -Rope -绳子 -Brim -帽檐 -Roses -玫瑰 -Main Flowers -主要花朵 -End Flowers -边缘花朵 -Main Flower -主要花朵 -Side Flowers -两侧花朵 -Flower Center -中央花朵 -Shoulders -肩膀 -Shawl -头巾 -Cowl -面巾 -Button -扣子 -Panel -嵌板 -Side -侧边 -Left Panel -左面板 -Right Panel -右面板 -Visor -面罩 -Outer Ear -耳朵外侧 -Inner Ear -耳朵内侧 -Bell -铃铛 -Outer -外部 -Inner -内部 -Glow -亮光 -Body -主体 -Core -核心 - Fluff -绒毛 - Base -基础 - Tip -顶端 -Bangs -刘海 -Tips -顶端 -Left -左侧 -Right -右侧 -Glove -手套 -String -系绳 -Tail -尾巴 -Ribbon -丝带 -Tails -尾巴 -Heart -心 -Tip -顶端 -Primary -主要 -Secondary -次要 -Suckers -吸盘 -Cuffs -锁铐 -Gems -珠宝 -Display -显示屏 -Rings -环圈 -Bed Straps -床束带 -Lower Belt -下部皮带 -Upper Belt -上部皮带 -Feet Belt -脚部皮带 -Lower Rope -下部绳子 -Upper Rope -上部绳子 -Color 1 -颜色1 -Color 2 -颜色2 -Binder -束缚 -Wand -振动棒 -Remote -遥控器 -Dildo -假阳具 -End -顶端 -Thread -线条 -Ring -环圈 -Egg -跳蛋 -Leash -牵绳 -Weight -配重 -Harem Chain -后宫链 -Harem Veil -后宫纱 -Studs -嵌钉 -Locks -锁 -Crotch Plate -胯部挡板 -Rivets -铆钉 -Engraving -刻字 -Crotch Shield -胯部护盾 -Positive Wire -阳极线 -Negative Wire -阴极线 -Metal -金属 -Clamps -夹子 -Left Vibe Egg -左侧跳弹 -Right Vibe Egg -右侧跳弹 -Left Tape Strip -左侧胶带 -Right Tape Strip -右侧胶带 -Frame -框架 -Piercings -穿刺 -Weights -配重 -Piercing -穿刺 -Lower Half -下半部 -Upper Half -上半部 -Laces -系带 -Buckle Hole -搭扣孔 -Crotch Panel -胯部遮挡 -Crotch -胯部 -Bars -杆子 -Wood -木质 -Buckles -搭扣 -Ropes -绳子 -Suspension Rope -悬挂绳 -Suspension Chain -悬挂锁链 -Mesh -色调 -Material -材质 -Sides -两侧 -Waist Belt -腰带 -Above Breast Belt -胸上皮带 -Below Breast Belt -胸下皮带 -Shorts -短裤 -Slime Girl -史莱姆女孩 -Leather -皮革 -Middle Ring -中间环 -Left Ring -左边环 -Right Ring -右边环 -Brooch -饰针 -Mesh (for copying to items) -色调(用于复制到其他物品) -Ornaments -饰物 -Side Plates -两侧面板 -Leather Strap -皮束带 -Heart Link -心形环 -Tag -标签 -Plate -底板 -Cap -柱子顶盖 -Post -柱子 -Baseplate -底板 -Pole -杆子 -Plaque -标牌 -PlaqueBorder -标牌边框 -Postit -便条纸 -Sticker -贴纸 -PlaqueBolts -标牌螺栓 -Harness -束带 -Stripes -条带 -Stripes Shine -条带高光 -Sign -牌子 -Pillow -枕头 -Mattress -床垫 -Headboard -床头板 -Bench -长椅 -Velvet -绒垫 -Lid (open) -盖子(打开) -Lid (closed) -盖子(关闭) -Bottom -底部 -Tint -色调 -Padding -垫子 -Tabletop -桌面 -Pillow Trim -枕头装饰 -Plushies -毛绒玩具 -Cloak -斗篷 -Kennel -狗笼 -Front Frame -前部框架 -Door -门 -Bed -床 -Bed Lining -床内衬 -Blanket -毛毯 -Blanket Lining -毛毯内衬 -Wheel Holders -轮子挡板 -Wheels -轮子 -Bowl -碗 -Sheet Back -后部覆盖物 -Sheet Front -前部覆盖物 -Sheet -覆盖物 -Upper -上半 -Lower -下半 -Caps -盖子 -Plastic -塑料 -Net -网子 -Arms -手臂 -Hook -钩子 -Nose -鼻子 -Hair -头发 -Hood -头套 -Snaps -皮带扣 -Face -面部 -Eyes -眼睛 -Mouth -嘴巴 -Blush -腮红 -Mouthpiece -滤嘴 -Lens -镜片 -Mask -面罩 -Edges -边缘 -Canvas -画布 -Blinding Lenses -遮眼镜片 -Breathing Attachment -呼吸附件 -Chin Strap -下巴束带 -Helmet -头盔 -Side Pieces -两侧组件 -Hypno Spiral Icon -催眠旋涡标志 -Interior -内侧 -Switch -开关 -Exterior -外部 -Spots -斑点 -Inside -内部 -Outside -外部 -Linings -内衬 -Forehead Panel -额头嵌板 -Openings -开口 -Blindfold -眼罩 -Gag -口塞 -Drawings -图画 -Lenses -镜片 -Plug -塞子 -Boots -靴子 -Heels -鞋跟 -Mittens -手套 -Vamp -防水台 -Shoes -鞋 -Soles -脚底 -Fins -鳍 -Inner & Laces -内侧和系带 - Metal -金属 - Straps -束带 - Bobble -小绒球 -Cup -杯子 -Close -关闭 -Rod -杆 -Carrot -萝卜 -Pumpkin -南瓜 -Bit -嚼子 -Bone -骨头 -Harness Straps -束带带子 -Metal Parts -金属组件 -Pacifier -奶嘴 -Pacifier Ring -奶嘴环 -Duster -掸子 -Shoe -鞋 -Lips -嘴唇 -Muzzle -口套 -Icon -标志 -Light -亮色 -Highlights -高光 -Cage -笼子 -Lines -线条 -Plume -羽饰 -ManeBase -鬃毛基部 -Mane -鬃毛 -Horn -角 -Ornament -装饰 -Reins -系绳 -Flags -旗帜 -Blinders -视野遮蔽 -Mouth Shine -嘴部高光 -Panel Shine -嵌板高光 -Cheeks -面颊 -Nose Gloss -鼻子光泽 -Whiskers -胡子 -Color One -颜色1 -Color Two -颜色2 -Clasps -扣环 -Module -模块 -Screen -屏幕 -Plug Cap -塞子盖 -Interface -屏幕 -Panty Base -内裤打底 -Wires -线路 -Metal Band -金属带 -Pussy Toy -阴部玩具 -Clitoris Toy -阴蒂玩具 -Lock Icon -锁标志 -Lid -盖子 -Restraint Frame -束缚框架 -Harness Clamps -束带扣环 -Restraint Padding -束缚垫子 -Actuator -作动器 -Structure -结构 -Window -窗户 -Label -标签 -Custom Text -自定义文本 -Glass -玻璃 -Wooden Frame -木质框架 -Stains -污渍 - Ropes -绳子 -Arm Stocks -手枷 -Feet Stocks -脚枷 -Underlayment -衬底层 -Feet -脚 -Dark -深色 -Paws -爪子 -Left Lens -左镜片 -Right Lens -右镜片 -HUD -显示器 -Thread Right -右侧线条 -Thread Left -左侧线条 -Ears -耳朵 -Right Eye -右眼 -Left Eye -左眼 -Right Eye Sticker -右眼贴 -Left Eye Sticker -左眼贴 -Tray -托盘 -Refreshments -物件 -Details -细节 -Spikes -尖刺 -Gears -齿轮 -Wings -翅膀 -Veins -脉络 -Shade -阴影 diff --git a/Assets/Female3DCG/LayerNames_FR.txt b/Assets/Female3DCG/LayerNames_FR.txt deleted file mode 100644 index 10c8bd6e7..000000000 --- a/Assets/Female3DCG/LayerNames_FR.txt +++ /dev/null @@ -1,166 +0,0 @@ -Shirt -Chemise -Trim -Coupe -Dress -Robe -Fur -Fourrure -Corset -Corset -Holder -Porteur -Flowers -Fleurs -Chain -Chaîne -Lock -Cadenas -Key -Clef -Lanyard -Cordon -Card -Carte -Suit -Habit -Zip -Fermeture -Skirt -Jupe -Cloth -Habit -Stripe -Bande -Diaper -Couche -Plastic Cover -Plastique -Sock -Bas -Hat -Chapeau -Bonnet -Bonnet -Lace -Dentelle -Outer Ear -Oreille externe -Inner Ear -Oreille interne -Strap -Sangle -Bell -Cloche -Glove -Gant -Tail -Queue -Ribbon -Ruban -Tails -Queues -Tips -Bouts -Heart -Coeurs -Tip -Bout -Cuffs -Manchette -Gems -Pierre -Binder -Lien -Belts -Ceintures -Frame -Cadre -Wood -Bois -Belt -Ceinture -Wand -Baguette -Rope -Corde -Remote -Télécommande -Ring -Anneau -Bra -Soutien-gorge -Jacket -Veste -Straps -Bretelles -Crotch Panel -Panneau d'entrejambe -Crotch -Entrejambe -Bars -Barres -Metal -Métal -Buckles -Boucles -Leather -Cuir -Rings -Anneaux -Collar -Collier -Pillow -Oreiller -Mattress -Matelas -Outer -Extérieur -Inner -Intérieur -Mesh -Filet -Tint -Teinte -Hook -Crochet -Padding -Rembourrage -Tabletop -Dessus de table -Cloak -Manteau -Lenses -Lentilles -Tube -Tube -Boots -Bottes -Mittens -Mitaines -Ball -Boule -Harness -Harnais -Gag -Bâillon -Cup -Verre -Dildo -Gode -Rod -Barre -Mask -Masque -Carrot -Carotte -Pumpkin -Citrouille -Panel -Panneau -Bit -Mors -Bone -Os -Duster -Chiffon \ No newline at end of file diff --git a/Assets/Female3DCG/LayerNames_RU.txt b/Assets/Female3DCG/LayerNames_RU.txt deleted file mode 100644 index 1f085c369..000000000 --- a/Assets/Female3DCG/LayerNames_RU.txt +++ /dev/null @@ -1,702 +0,0 @@ -Dress -Платье -Buckle -Пряжка -Shirt -Рубашка -Bow -Бант -Trim -Отделка -Sash -Cтворка -Fur -Мех -Corset -Корсет -Main -Главный -Tie -Галстук -Pattern -Узор -Jacket -Пиджак -Chest -Грудь -Buttons -Кнопки -Arm Puffs -Пуфы рук -Main Dress -Основное платье -Inside Skirt -Внутренняя юбка -Dress Trim -Отделка платья -Belts -Ремни -Apron -Фартук -Frills -Оборки -Print -Распечатать -Lace -Кружева -Belt -Пояс -Collar -Ошейник -Suit -Костюм -Gloves -Перчатки -Top -Верх -Design -Дизайн -Holder -Держатель -Flowers -Цветы -Front -Спереди -Back -Спина -Bib -Cлюнявчик -Text -Текст -Chain -Цепь -Lock -Замок -Key -Ключ -Lanyard -Ремешок -Card -Карточка -Necklace -Ожерелье -Jewels -Драгоценности -Center -Центр -Petals -Лепестки -Ball -Мяч -Strap -Ремень -Chains -Цепи -Choker -Чокер -Zip -Застежка-молния -Fabric -Ткань -Straps -Ремни -Jewel -Драгоценность -Bra -Бюстгальтер -Shine -Блеск -Skirt -Юбка -Cloth -Ткань -Stripe -Полоса - Pants - Брюки - Trim - Отделка -Panty -Трусы -Veil -Вуаль -Panty Line -Линия трусиков -Waistband -Пояс -Layer 1 -Слой 1 -Layer 2 -Слой 2 -Layer 3 -Слой 3 -Layer 4 -Слой 4 -Leaves -Уходит -Pollen -Пыльца -Frill -Оборка -Diaper -Подгузник -Plastic Cover -Пластиковое покрытие -Tape -Лента -Crotch Padding -Подкладка промежности -Waist Band -Поясной ремень -Panties -Трусики -Base -База -Sock -Носок -Light Stripes -Светлые полосы -Dark Stripes -Темные полосы -Bands -Группы -Hat -Шляпа -Bonnet -Чепчик -Band -Группа -Bandana -Бандана -Skull -Череп -Dots -Точки -Patterns -Узоры -Crown -Корона -Badge -Значок -Insignia -Знаки различия -Rope -Веревка -Brim -Поля -Roses -Розы -Main Flowers -Основные цветы -End Flowers -Конечные цветы -Main Flower -Главный цветок -Side Flowers -Боковые цветы -Flower Center -Центр цветов -Shoulders -Плечи -Shawl -Шаль -Cowl -Капюшон -Outer Ear -Наружное ухо -Inner Ear -Внутреннее ухо -Bell -Колокольчик -Outer -Внешний -Inner -Внутренний -Glow -Свечение -Body -Тело -Core -Основной - Fluff - Пух - Base - База -Glove -Перчатка -String -Нить -Tail -Хвост -Ribbon -Лента -Tails -Хвосты -Tips -Подсказки -Heart -Сердце -Tip -Подсказка -Primary -Первичный -Secondary -Вторичный -Suckers -Присоски -Cuffs -Манжеты -Gems -Драгоценные камни -Display -Дисплей -Rings -Кольца -Bed Straps -Ремни для кровати -Lower Rope -Нижняя веревка -Upper Rope -Верхняя веревка -Color 1 -цвет 1 -Color 2 -цвет 2 -Binder -Связующее -Wand -Палочка -Remote -Удаленный -Dildo -Фаллоимитатор -End -Конец -Ring -Кольцо -Egg -Яйцо -Leash -Поводок -Studs -Шпильки -Locks -Замки -Crotch Plate -Промежностная пластина -Rivets -Заклёпки -Left Vibe Egg -Левое вибрирующее яйцо -Right Vibe Egg -Правое вибрирующее яйцо -Left Tape Strip -Левая клейкая лента -Right Tape Strip -Правая клейкая лента -Frame -Рамка -Clamps -Зажимы -Piercings -Пирсинги -Weights -Веса -Piercing -Пирсинг -Lower Half -Нижняя половина -Upper Half -Верхняя половина -Laces -Шнурки -Buckle Hole -Отверстие для пряжки -Crotch Panel -Промежностная панель -Crotch -Промежность -Bars -Планки -Wood -Дерево -Metal -Металл -Buckles -Пряжки -Ropes -Веревки -Suspension Rope -Подвесной канат -Suspension Chain -Подвесная цепь -Mesh -Сетка -Material -Материал -Sides -Боковые стороны -Shorts -Шорты -Slime Girl -Девушка-слизь -Leather -Кожа -Middle Ring -Среднее кольцо -Left Ring -Левое кольцо -Right Ring -Правое кольцо -Brooch -Брошь -Mesh (for copying to items) -Сетка (для копирования на предметы) -Ornaments -Орнаменты -Side Plates -Боковые пластины -Leather Strap -Кожаный ремешок -Heart Link -Сердечная связь -Tag -Ярлык -Plate -Плита -Cap -Кепка -Post -Пост -Baseplate -Базовая плита -Harness -Упряжь -Stripes -Полоски -Stripes Shine -Полосы сияют -Sign -Символ -Pillow -Подушка -Mattress -Матрас -Headboard -Изголовье кровати -Bench -Скамья -Velvet -Бархат -Lid (open) -Крышка (открытая) -Lid (closed) -Крышка (закрыта) -Bottom -Низ -Tint -Оттенок -Padding -Прокладка -Tabletop -Стол -Pillow Trim -Отделка подушки -Plushies -Плюшевые -Cloak -Плащ -Kennel -Конура -Front Frame -Передняя рама -Door -Дверь -Bed -Кровать -Bed Lining -Подкладка кровати -Blanket -Одеяло -Blanket Lining -Подкладка одеяла -Wheel Holders -Держатели колес -Wheels -Колеса -Bowl -Миска -Sheet Back -Простынь Назад -Sheet Front -Простынь вперёд -Sheet -Простынь -Upper -Выше -Lower -Ниже -Caps -Кепки -Plastic -Пластик -Pole -Шест -Net -Сеть -Arms -Руки -Hook -Крюк -Nose -Нос -Hair -Волосы -Hood -Капюшон -Snaps -Защелка -Face -Лицо -Eyes -Глаза -Mouth -Рот -Blush -Румянец -Mouthpiece -Мундштук -Lens -Линзы -Mask -Маска -Edges -Края -Canvas -Холст -Blinding Lenses -Ослепляющие линзы -Breathing Attachment -Дыхательная насадка -Visor -Визор -Chin Strap -Ремешок для подбородка -Helmet -Шлем -Side Pieces -Боковые части -Hypno Spiral Icon -Гипнотическая спиральная иконка -Interior -Интерьер -Switch -Переключать -Exterior -Внешний вид -Spots -Пятна -Inside -Внутри -Outside -Снаружи -Linings -Подкладки -Forehead Panel -Панель лба -Openings -Отверстия -Blindfold -Повязка на глаза -Gag -Кляп -Drawings -Рисунки -Boots -Сапоги -Heels -Каблуки -Mittens -Варежки -Vamp -Вамп -Left -Лево -Right -Право -Shoes -Обувь -Soles -Подошвы -Fins -Плавники -Inner & Laces -Внутренняя часть и шнурки - Metal - Металл - Straps - Ремни - Bobble - Бурлить -Cup -Кубок -Close -Закрывать -Rod -Стержень -Carrot -Морковь -Pumpkin -Тыква -Panel -Панель -Bit -Бит -Bone -Кость -Harness Straps -Ремни безопасности -Metal Parts -Металлические части -Pacifier -Пустышка -Pacifier Ring -Кольцо для соски -Duster -Пыльник -Shoe -Ббувь -Lips -Губы -Muzzle -Намордник -Icon -Значок -Light -Легкий -Highlights -Основные моменты -Cage -Клетка -Plug -Пробка -Lines -Линии -Plume -Шлейф -ManeBase -Основа гривы -Mane -Грива -Horn -Рог -Ornament -Орнамент -Reins -Поводья -Flags -Флаги -Blinders -Шоры -Mouth Shine -Блеск рта -Panel Shine -Блеск панели -Cheeks -Щеки -Nose Gloss -Блеск носа -Whiskers -Усы -Color One -Цвет Один -Color Two -Цвет два -Clasps -Застежки -Module -Модуль -Screen -Экран -Plug Cap -Пробка Cap -Interface -Интерфейс -Panty Base -Основа трусиков -Wires -Провода -Metal Band -Металлическая группа -Pussy Toy -киска игрушка -Clitoris Toy -клитор игрушка -Lock Icon -Значок замка -Lid -крышка -Restraint Frame -Ограничительная рама -Harness Clamps -Зажимы для жгутов -Restraint Padding -Удерживающая прокладка -Actuator -Актуатор -Structure -Структура -Window -Окно -Label -Этикетка -Custom Text -Пользовательский текст -Glass -Стакан -Stains -Пятна - Ropes - Веревки -Underlayment -Подложка -Feet -Ноги -Dark -Темный -Paws -Лапы -Left Lens -Левая линза -Right Lens -Правая линза -HUD -HUD -Ears -Уши -Right Eye -Правый глаз -Left Eye -Левый глаз -Right Eye Sticker -Наклейка для правого глаза -Left Eye Sticker -Наклейка для левого глаза -Tray -Поднос -Refreshments -Закуски -Details -Подробности -Spikes -Шипы -Gears -Шестерни -Wings -Крылья -Veins -Вены -Shade -Оттенок -Lenses -Линзы \ No newline at end of file diff --git a/Assets/Female3DCG/LeftAnklet/BandAnklet_Large.png b/Assets/Female3DCG/LeftAnklet/BandAnklet_Large.png deleted file mode 100644 index 4ab471505..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/BandAnklet_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/BandAnklet_Normal.png b/Assets/Female3DCG/LeftAnklet/BandAnklet_Normal.png deleted file mode 100644 index 0279c5583..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/BandAnklet_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/BandAnklet_Small.png b/Assets/Female3DCG/LeftAnklet/BandAnklet_Small.png deleted file mode 100644 index 347fc2d8e..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/BandAnklet_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/BandAnklet_XLarge.png b/Assets/Female3DCG/LeftAnklet/BandAnklet_XLarge.png deleted file mode 100644 index 20f609bba..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/BandAnklet_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_Large.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_Large.png deleted file mode 100644 index 0f70cfa03..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_Normal.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_Normal.png deleted file mode 100644 index c7c3be4d4..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_Small.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_Small.png deleted file mode 100644 index 0d40253ed..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_XLarge.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_XLarge.png deleted file mode 100644 index 4ca780eb5..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/BandAnklet_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_Large.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_Large.png deleted file mode 100644 index 48d46f8c4..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_Normal.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_Normal.png deleted file mode 100644 index bed15e429..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_Small.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_Small.png deleted file mode 100644 index 3bf75298b..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_XLarge.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_XLarge.png deleted file mode 100644 index ed075c73a..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_Large.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_Large.png deleted file mode 100644 index 5095b7df3..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_Normal.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_Normal.png deleted file mode 100644 index 16d938c1a..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_Small.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_Small.png deleted file mode 100644 index 0bb9c7998..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_XLarge.png b/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_XLarge.png deleted file mode 100644 index 822b022ae..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/LegsClosed/Ribbon_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Preview/BandAnklet.png b/Assets/Female3DCG/LeftAnklet/Preview/BandAnklet.png deleted file mode 100644 index fc4cacf12..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Preview/BandAnklet.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Preview/Ribbon.png b/Assets/Female3DCG/LeftAnklet/Preview/Ribbon.png deleted file mode 100644 index 7d3f73b67..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Preview/Ribbon.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Preview/Ribbon1.png b/Assets/Female3DCG/LeftAnklet/Preview/Ribbon1.png deleted file mode 100644 index 0ff26e19c..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Preview/Ribbon1.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Ribbon1_Large.png b/Assets/Female3DCG/LeftAnklet/Ribbon1_Large.png deleted file mode 100644 index 4a6ab5bfa..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Ribbon1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Ribbon1_Normal.png b/Assets/Female3DCG/LeftAnklet/Ribbon1_Normal.png deleted file mode 100644 index 43a13c5c5..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Ribbon1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Ribbon1_Small.png b/Assets/Female3DCG/LeftAnklet/Ribbon1_Small.png deleted file mode 100644 index 3281931c6..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Ribbon1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Ribbon1_XLarge.png b/Assets/Female3DCG/LeftAnklet/Ribbon1_XLarge.png deleted file mode 100644 index 44c959a2d..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Ribbon1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Ribbon_Large.png b/Assets/Female3DCG/LeftAnklet/Ribbon_Large.png deleted file mode 100644 index 6f53575a7..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Ribbon_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Ribbon_Normal.png b/Assets/Female3DCG/LeftAnklet/Ribbon_Normal.png deleted file mode 100644 index c97191d17..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Ribbon_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Ribbon_Small.png b/Assets/Female3DCG/LeftAnklet/Ribbon_Small.png deleted file mode 100644 index 66b4461ed..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Ribbon_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Ribbon_XLarge.png b/Assets/Female3DCG/LeftAnklet/Ribbon_XLarge.png deleted file mode 100644 index b601e5770..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Ribbon_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_Large.png b/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_Large.png deleted file mode 100644 index 716ec0fc6..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_Normal.png b/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_Normal.png deleted file mode 100644 index d04f7c9ad..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_Small.png b/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_Small.png deleted file mode 100644 index e9373ec4b..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_XLarge.png b/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_XLarge.png deleted file mode 100644 index 5bed6b380..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/BandAnklet_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_Large.png b/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_Large.png deleted file mode 100644 index 28bc0fbe9..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_Normal.png b/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_Normal.png deleted file mode 100644 index 560739a0b..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_Small.png b/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_Small.png deleted file mode 100644 index a4edb629a..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_XLarge.png b/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_XLarge.png deleted file mode 100644 index adc0e833e..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_Large.png b/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_Large.png deleted file mode 100644 index 500b23e71..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_Normal.png b/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_Normal.png deleted file mode 100644 index a10ea9b60..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_Small.png b/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_Small.png deleted file mode 100644 index d403d52ae..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_XLarge.png b/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_XLarge.png deleted file mode 100644 index d6ff3fb06..000000000 Binary files a/Assets/Female3DCG/LeftAnklet/Spread/Ribbon_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/BunnyMask1_Base.png b/Assets/Female3DCG/Mask/BunnyMask1_Base.png deleted file mode 100644 index 00dc0d6a0..000000000 Binary files a/Assets/Female3DCG/Mask/BunnyMask1_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/BunnyMask1_Ears.png b/Assets/Female3DCG/Mask/BunnyMask1_Ears.png deleted file mode 100644 index 3af4bc4f5..000000000 Binary files a/Assets/Female3DCG/Mask/BunnyMask1_Ears.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/BunnyMask2.png b/Assets/Female3DCG/Mask/BunnyMask2.png deleted file mode 100644 index 9e13b4aee..000000000 Binary files a/Assets/Female3DCG/Mask/BunnyMask2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/BunnyMask3.png b/Assets/Female3DCG/Mask/BunnyMask3.png deleted file mode 100644 index 14b4d4830..000000000 Binary files a/Assets/Female3DCG/Mask/BunnyMask3.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/ButterflyMask.png b/Assets/Female3DCG/Mask/ButterflyMask.png deleted file mode 100644 index e22025aa7..000000000 Binary files a/Assets/Female3DCG/Mask/ButterflyMask.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/DominoMask.png b/Assets/Female3DCG/Mask/DominoMask.png deleted file mode 100644 index e675d06aa..000000000 Binary files a/Assets/Female3DCG/Mask/DominoMask.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/FacePaint.png b/Assets/Female3DCG/Mask/FacePaint.png deleted file mode 100644 index 64d3d912e..000000000 Binary files a/Assets/Female3DCG/Mask/FacePaint.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/FaceVeil_Fabric.png b/Assets/Female3DCG/Mask/FaceVeil_Fabric.png deleted file mode 100644 index 1e55c421c..000000000 Binary files a/Assets/Female3DCG/Mask/FaceVeil_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/FaceVeil_String.png b/Assets/Female3DCG/Mask/FaceVeil_String.png deleted file mode 100644 index fc3aa3950..000000000 Binary files a/Assets/Female3DCG/Mask/FaceVeil_String.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/FoxMask_Lower.png b/Assets/Female3DCG/Mask/FoxMask_Lower.png deleted file mode 100644 index ac6456ef5..000000000 Binary files a/Assets/Female3DCG/Mask/FoxMask_Lower.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/FoxMask_Upper.png b/Assets/Female3DCG/Mask/FoxMask_Upper.png deleted file mode 100644 index d2da9b396..000000000 Binary files a/Assets/Female3DCG/Mask/FoxMask_Upper.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/FuturisticVisor.png b/Assets/Female3DCG/Mask/FuturisticVisor.png deleted file mode 100644 index 762a0d169..000000000 Binary files a/Assets/Female3DCG/Mask/FuturisticVisor.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_DotsLeft.png b/Assets/Female3DCG/Mask/Glitter_DotsLeft.png deleted file mode 100644 index 8ae72fbab..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_DotsLeft.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_DotsLeft2.png b/Assets/Female3DCG/Mask/Glitter_DotsLeft2.png deleted file mode 100644 index 02317cbd6..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_DotsLeft2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_DotsRight.png b/Assets/Female3DCG/Mask/Glitter_DotsRight.png deleted file mode 100644 index 2891703bc..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_DotsRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_DotsRight2.png b/Assets/Female3DCG/Mask/Glitter_DotsRight2.png deleted file mode 100644 index 1f3337703..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_DotsRight2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_Freckles.png b/Assets/Female3DCG/Mask/Glitter_Freckles.png deleted file mode 100644 index 0df4eebfa..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_Freckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_Freckles2.png b/Assets/Female3DCG/Mask/Glitter_Freckles2.png deleted file mode 100644 index 22dbfce03..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_Freckles2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_Freckles2Small.png b/Assets/Female3DCG/Mask/Glitter_Freckles2Small.png deleted file mode 100644 index f59285633..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_Freckles2Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_FrecklesSmall.png b/Assets/Female3DCG/Mask/Glitter_FrecklesSmall.png deleted file mode 100644 index a027896c0..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_FrecklesSmall.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_MidFreckles.png b/Assets/Female3DCG/Mask/Glitter_MidFreckles.png deleted file mode 100644 index 68001bd23..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_MidFreckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_MidFrecklesSmall.png b/Assets/Female3DCG/Mask/Glitter_MidFrecklesSmall.png deleted file mode 100644 index d232a09d5..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_MidFrecklesSmall.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_SplitFreckles.png b/Assets/Female3DCG/Mask/Glitter_SplitFreckles.png deleted file mode 100644 index 76454381c..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_SplitFreckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_SplitFreckles2.png b/Assets/Female3DCG/Mask/Glitter_SplitFreckles2.png deleted file mode 100644 index 9d6bd33ef..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_SplitFreckles2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_SplitFreckles2Small.png b/Assets/Female3DCG/Mask/Glitter_SplitFreckles2Small.png deleted file mode 100644 index 500515ee1..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_SplitFreckles2Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_SplitFrecklesSmall.png b/Assets/Female3DCG/Mask/Glitter_SplitFrecklesSmall.png deleted file mode 100644 index dcd454675..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_SplitFrecklesSmall.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_StarsLeft.png b/Assets/Female3DCG/Mask/Glitter_StarsLeft.png deleted file mode 100644 index bfe5e31c4..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_StarsLeft.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_StarsLeft2.png b/Assets/Female3DCG/Mask/Glitter_StarsLeft2.png deleted file mode 100644 index 85e37df0a..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_StarsLeft2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_StarsRight.png b/Assets/Female3DCG/Mask/Glitter_StarsRight.png deleted file mode 100644 index daf7a9f2a..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_StarsRight.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Glitter_StarsRight2.png b/Assets/Female3DCG/Mask/Glitter_StarsRight2.png deleted file mode 100644 index f0fe7a362..000000000 Binary files a/Assets/Female3DCG/Mask/Glitter_StarsRight2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/HeadHarness_Base.png b/Assets/Female3DCG/Mask/HeadHarness_Base.png deleted file mode 100644 index 5c6579fce..000000000 Binary files a/Assets/Female3DCG/Mask/HeadHarness_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/HeadHarness_BaseMetal.png b/Assets/Female3DCG/Mask/HeadHarness_BaseMetal.png deleted file mode 100644 index a897b1e17..000000000 Binary files a/Assets/Female3DCG/Mask/HeadHarness_BaseMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/HeadHarness_Heavy.png b/Assets/Female3DCG/Mask/HeadHarness_Heavy.png deleted file mode 100644 index 7123d8d03..000000000 Binary files a/Assets/Female3DCG/Mask/HeadHarness_Heavy.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/HeadHarness_HeavyMetal.png b/Assets/Female3DCG/Mask/HeadHarness_HeavyMetal.png deleted file mode 100644 index 9b190e409..000000000 Binary files a/Assets/Female3DCG/Mask/HeadHarness_HeavyMetal.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/KittyMask1.png b/Assets/Female3DCG/Mask/KittyMask1.png deleted file mode 100644 index 0a9a09005..000000000 Binary files a/Assets/Female3DCG/Mask/KittyMask1.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/KittyMask2.png b/Assets/Female3DCG/Mask/KittyMask2.png deleted file mode 100644 index 83e3dac0b..000000000 Binary files a/Assets/Female3DCG/Mask/KittyMask2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/KittyMask3_Highlights.png b/Assets/Female3DCG/Mask/KittyMask3_Highlights.png deleted file mode 100644 index ddda02184..000000000 Binary files a/Assets/Female3DCG/Mask/KittyMask3_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/KittyMask3_Mask.png b/Assets/Female3DCG/Mask/KittyMask3_Mask.png deleted file mode 100644 index 10941cf7f..000000000 Binary files a/Assets/Female3DCG/Mask/KittyMask3_Mask.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/LaceMask1.png b/Assets/Female3DCG/Mask/LaceMask1.png deleted file mode 100644 index 0638cfed2..000000000 Binary files a/Assets/Female3DCG/Mask/LaceMask1.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/LaceMask2.png b/Assets/Female3DCG/Mask/LaceMask2.png deleted file mode 100644 index 44a5d97f6..000000000 Binary files a/Assets/Female3DCG/Mask/LaceMask2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/OpenFaceHood.png b/Assets/Female3DCG/Mask/OpenFaceHood.png deleted file mode 100644 index 132140c66..000000000 Binary files a/Assets/Female3DCG/Mask/OpenFaceHood.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/PetNose_Cheeks.png b/Assets/Female3DCG/Mask/PetNose_Cheeks.png deleted file mode 100644 index 968adc066..000000000 Binary files a/Assets/Female3DCG/Mask/PetNose_Cheeks.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/PetNose_CheeksBig.png b/Assets/Female3DCG/Mask/PetNose_CheeksBig.png deleted file mode 100644 index 8eb75370b..000000000 Binary files a/Assets/Female3DCG/Mask/PetNose_CheeksBig.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/PetNose_CheeksNone.png b/Assets/Female3DCG/Mask/PetNose_CheeksNone.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/Mask/PetNose_CheeksNone.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/PetNose_CheeksSmall.png b/Assets/Female3DCG/Mask/PetNose_CheeksSmall.png deleted file mode 100644 index 968adc066..000000000 Binary files a/Assets/Female3DCG/Mask/PetNose_CheeksSmall.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/PetNose_Gloss.png b/Assets/Female3DCG/Mask/PetNose_Gloss.png deleted file mode 100644 index b36838e7a..000000000 Binary files a/Assets/Female3DCG/Mask/PetNose_Gloss.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/PetNose_Nose.png b/Assets/Female3DCG/Mask/PetNose_Nose.png deleted file mode 100644 index fd54a0b42..000000000 Binary files a/Assets/Female3DCG/Mask/PetNose_Nose.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/PetNose_NoseNone.png b/Assets/Female3DCG/Mask/PetNose_NoseNone.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/Mask/PetNose_NoseNone.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/PetNose_WhiskersLong.png b/Assets/Female3DCG/Mask/PetNose_WhiskersLong.png deleted file mode 100644 index 911da8bb5..000000000 Binary files a/Assets/Female3DCG/Mask/PetNose_WhiskersLong.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/PetNose_WhiskersNone.png b/Assets/Female3DCG/Mask/PetNose_WhiskersNone.png deleted file mode 100644 index 8ab97c92e..000000000 Binary files a/Assets/Female3DCG/Mask/PetNose_WhiskersNone.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/PetNose_WhiskersShort.png b/Assets/Female3DCG/Mask/PetNose_WhiskersShort.png deleted file mode 100644 index e1de6d07b..000000000 Binary files a/Assets/Female3DCG/Mask/PetNose_WhiskersShort.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/BunnyMask1.png b/Assets/Female3DCG/Mask/Preview/BunnyMask1.png deleted file mode 100644 index ad2cd40a8..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/BunnyMask1.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/BunnyMask2.png b/Assets/Female3DCG/Mask/Preview/BunnyMask2.png deleted file mode 100644 index 32be72c52..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/BunnyMask2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/BunnyMask3.png b/Assets/Female3DCG/Mask/Preview/BunnyMask3.png deleted file mode 100644 index 5cc974f99..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/BunnyMask3.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/ButterflyMask.png b/Assets/Female3DCG/Mask/Preview/ButterflyMask.png deleted file mode 100644 index 5a5872410..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/ButterflyMask.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/DominoMask.png b/Assets/Female3DCG/Mask/Preview/DominoMask.png deleted file mode 100644 index edd5ef248..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/DominoMask.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/FacePaint.png b/Assets/Female3DCG/Mask/Preview/FacePaint.png deleted file mode 100644 index 1f6f4e6ed..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/FacePaint.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/FaceVeil.png b/Assets/Female3DCG/Mask/Preview/FaceVeil.png deleted file mode 100644 index 57240719f..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/FaceVeil.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/FoxMask.png b/Assets/Female3DCG/Mask/Preview/FoxMask.png deleted file mode 100644 index 6293eb275..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/FoxMask.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/FuturisticVisor.png b/Assets/Female3DCG/Mask/Preview/FuturisticVisor.png deleted file mode 100644 index 0ae9beae9..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/FuturisticVisor.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/Glitter.png b/Assets/Female3DCG/Mask/Preview/Glitter.png deleted file mode 100644 index 5d47728a3..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/Glitter.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/HeadHarness.png b/Assets/Female3DCG/Mask/Preview/HeadHarness.png deleted file mode 100644 index d395379f0..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/HeadHarness.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/KittyMask1.png b/Assets/Female3DCG/Mask/Preview/KittyMask1.png deleted file mode 100644 index 36a44c83c..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/KittyMask1.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/KittyMask2.png b/Assets/Female3DCG/Mask/Preview/KittyMask2.png deleted file mode 100644 index eafd23530..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/KittyMask2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/KittyMask3.png b/Assets/Female3DCG/Mask/Preview/KittyMask3.png deleted file mode 100644 index 2750a103e..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/KittyMask3.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/LaceMask1.png b/Assets/Female3DCG/Mask/Preview/LaceMask1.png deleted file mode 100644 index 156752873..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/LaceMask1.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/LaceMask2.png b/Assets/Female3DCG/Mask/Preview/LaceMask2.png deleted file mode 100644 index 68bd0598b..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/LaceMask2.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/OpenFaceHood.png b/Assets/Female3DCG/Mask/Preview/OpenFaceHood.png deleted file mode 100644 index a4a6fa110..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/OpenFaceHood.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/PetNose.png b/Assets/Female3DCG/Mask/Preview/PetNose.png deleted file mode 100644 index cf690ae69..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/PetNose.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/ShinobiMask.png b/Assets/Female3DCG/Mask/Preview/ShinobiMask.png deleted file mode 100644 index 260070f5f..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/ShinobiMask.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/Preview/VenetianMask.png b/Assets/Female3DCG/Mask/Preview/VenetianMask.png deleted file mode 100644 index 5dafb4699..000000000 Binary files a/Assets/Female3DCG/Mask/Preview/VenetianMask.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/ShinobiMask.png b/Assets/Female3DCG/Mask/ShinobiMask.png deleted file mode 100644 index 2f6d11f7a..000000000 Binary files a/Assets/Female3DCG/Mask/ShinobiMask.png and /dev/null differ diff --git a/Assets/Female3DCG/Mask/VenetianMask.png b/Assets/Female3DCG/Mask/VenetianMask.png deleted file mode 100644 index 459d093d9..000000000 Binary files a/Assets/Female3DCG/Mask/VenetianMask.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Ahegao/Discreet.png b/Assets/Female3DCG/Mouth/Ahegao/Discreet.png deleted file mode 100644 index 60ebe747e..000000000 Binary files a/Assets/Female3DCG/Mouth/Ahegao/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Ahegao/Icon.png b/Assets/Female3DCG/Mouth/Ahegao/Icon.png deleted file mode 100644 index d57bd73ed..000000000 Binary files a/Assets/Female3DCG/Mouth/Ahegao/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Ahegao/Regular_Inner.png b/Assets/Female3DCG/Mouth/Ahegao/Regular_Inner.png deleted file mode 100644 index 50516c37d..000000000 Binary files a/Assets/Female3DCG/Mouth/Ahegao/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Ahegao/Regular_Lips.png b/Assets/Female3DCG/Mouth/Ahegao/Regular_Lips.png deleted file mode 100644 index 6959da6b3..000000000 Binary files a/Assets/Female3DCG/Mouth/Ahegao/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Angry/Discreet.png b/Assets/Female3DCG/Mouth/Angry/Discreet.png deleted file mode 100644 index d370958cd..000000000 Binary files a/Assets/Female3DCG/Mouth/Angry/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Angry/Icon.png b/Assets/Female3DCG/Mouth/Angry/Icon.png deleted file mode 100644 index 806d40df8..000000000 Binary files a/Assets/Female3DCG/Mouth/Angry/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Angry/Regular_Inner.png b/Assets/Female3DCG/Mouth/Angry/Regular_Inner.png deleted file mode 100644 index 88f574a94..000000000 Binary files a/Assets/Female3DCG/Mouth/Angry/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Angry/Regular_Lips.png b/Assets/Female3DCG/Mouth/Angry/Regular_Lips.png deleted file mode 100644 index b3caed028..000000000 Binary files a/Assets/Female3DCG/Mouth/Angry/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Devious/Discreet.png b/Assets/Female3DCG/Mouth/Devious/Discreet.png deleted file mode 100644 index 65563e5e4..000000000 Binary files a/Assets/Female3DCG/Mouth/Devious/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Devious/Icon.png b/Assets/Female3DCG/Mouth/Devious/Icon.png deleted file mode 100644 index 1375bd520..000000000 Binary files a/Assets/Female3DCG/Mouth/Devious/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Devious/Regular_Inner.png b/Assets/Female3DCG/Mouth/Devious/Regular_Inner.png deleted file mode 100644 index 84eb352a1..000000000 Binary files a/Assets/Female3DCG/Mouth/Devious/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Devious/Regular_Lips.png b/Assets/Female3DCG/Mouth/Devious/Regular_Lips.png deleted file mode 100644 index d710200ea..000000000 Binary files a/Assets/Female3DCG/Mouth/Devious/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Discreet.png b/Assets/Female3DCG/Mouth/Discreet.png deleted file mode 100644 index c4a8d2b52..000000000 Binary files a/Assets/Female3DCG/Mouth/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Frown/Discreet.png b/Assets/Female3DCG/Mouth/Frown/Discreet.png deleted file mode 100644 index 0537c5be5..000000000 Binary files a/Assets/Female3DCG/Mouth/Frown/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Frown/Icon.png b/Assets/Female3DCG/Mouth/Frown/Icon.png deleted file mode 100644 index 7fbd4cb1b..000000000 Binary files a/Assets/Female3DCG/Mouth/Frown/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Frown/Regular_Inner.png b/Assets/Female3DCG/Mouth/Frown/Regular_Inner.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/Mouth/Frown/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Frown/Regular_Lips.png b/Assets/Female3DCG/Mouth/Frown/Regular_Lips.png deleted file mode 100644 index 40f645d53..000000000 Binary files a/Assets/Female3DCG/Mouth/Frown/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Grin/Discreet.png b/Assets/Female3DCG/Mouth/Grin/Discreet.png deleted file mode 100644 index fbd10e597..000000000 Binary files a/Assets/Female3DCG/Mouth/Grin/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Grin/Icon.png b/Assets/Female3DCG/Mouth/Grin/Icon.png deleted file mode 100644 index f798e198c..000000000 Binary files a/Assets/Female3DCG/Mouth/Grin/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Grin/Regular_Inner.png b/Assets/Female3DCG/Mouth/Grin/Regular_Inner.png deleted file mode 100644 index 1e95643c5..000000000 Binary files a/Assets/Female3DCG/Mouth/Grin/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Grin/Regular_Lips.png b/Assets/Female3DCG/Mouth/Grin/Regular_Lips.png deleted file mode 100644 index 38ff11257..000000000 Binary files a/Assets/Female3DCG/Mouth/Grin/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/HalfOpen/Discreet.png b/Assets/Female3DCG/Mouth/HalfOpen/Discreet.png deleted file mode 100644 index 678917eee..000000000 Binary files a/Assets/Female3DCG/Mouth/HalfOpen/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/HalfOpen/Icon.png b/Assets/Female3DCG/Mouth/HalfOpen/Icon.png deleted file mode 100644 index 8bb1400e7..000000000 Binary files a/Assets/Female3DCG/Mouth/HalfOpen/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/HalfOpen/Regular_Inner.png b/Assets/Female3DCG/Mouth/HalfOpen/Regular_Inner.png deleted file mode 100644 index 501a1174d..000000000 Binary files a/Assets/Female3DCG/Mouth/HalfOpen/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/HalfOpen/Regular_Lips.png b/Assets/Female3DCG/Mouth/HalfOpen/Regular_Lips.png deleted file mode 100644 index 474ee137c..000000000 Binary files a/Assets/Female3DCG/Mouth/HalfOpen/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Happy/Discreet.png b/Assets/Female3DCG/Mouth/Happy/Discreet.png deleted file mode 100644 index c4a8d2b52..000000000 Binary files a/Assets/Female3DCG/Mouth/Happy/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Happy/Icon.png b/Assets/Female3DCG/Mouth/Happy/Icon.png deleted file mode 100644 index fa4c02350..000000000 Binary files a/Assets/Female3DCG/Mouth/Happy/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Happy/Regular_Inner.png b/Assets/Female3DCG/Mouth/Happy/Regular_Inner.png deleted file mode 100644 index e2600ddd0..000000000 Binary files a/Assets/Female3DCG/Mouth/Happy/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Happy/Regular_Lips.png b/Assets/Female3DCG/Mouth/Happy/Regular_Lips.png deleted file mode 100644 index b2a02bbd4..000000000 Binary files a/Assets/Female3DCG/Mouth/Happy/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Icon.png b/Assets/Female3DCG/Mouth/Icon.png deleted file mode 100644 index 2d36d33a7..000000000 Binary files a/Assets/Female3DCG/Mouth/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Laughing/Discreet.png b/Assets/Female3DCG/Mouth/Laughing/Discreet.png deleted file mode 100644 index 65563e5e4..000000000 Binary files a/Assets/Female3DCG/Mouth/Laughing/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Laughing/Icon.png b/Assets/Female3DCG/Mouth/Laughing/Icon.png deleted file mode 100644 index c5a46aa33..000000000 Binary files a/Assets/Female3DCG/Mouth/Laughing/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Laughing/Regular_Inner.png b/Assets/Female3DCG/Mouth/Laughing/Regular_Inner.png deleted file mode 100644 index 4c26e2efc..000000000 Binary files a/Assets/Female3DCG/Mouth/Laughing/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Laughing/Regular_Lips.png b/Assets/Female3DCG/Mouth/Laughing/Regular_Lips.png deleted file mode 100644 index 84edda297..000000000 Binary files a/Assets/Female3DCG/Mouth/Laughing/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/LipBite/Discreet.png b/Assets/Female3DCG/Mouth/LipBite/Discreet.png deleted file mode 100644 index 3b135c313..000000000 Binary files a/Assets/Female3DCG/Mouth/LipBite/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/LipBite/Icon.png b/Assets/Female3DCG/Mouth/LipBite/Icon.png deleted file mode 100644 index df5732d9a..000000000 Binary files a/Assets/Female3DCG/Mouth/LipBite/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/LipBite/Regular_Inner.png b/Assets/Female3DCG/Mouth/LipBite/Regular_Inner.png deleted file mode 100644 index 7ad830aa5..000000000 Binary files a/Assets/Female3DCG/Mouth/LipBite/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/LipBite/Regular_Lips.png b/Assets/Female3DCG/Mouth/LipBite/Regular_Lips.png deleted file mode 100644 index 198328688..000000000 Binary files a/Assets/Female3DCG/Mouth/LipBite/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Moan/Discreet.png b/Assets/Female3DCG/Mouth/Moan/Discreet.png deleted file mode 100644 index 91a546458..000000000 Binary files a/Assets/Female3DCG/Mouth/Moan/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Moan/Icon.png b/Assets/Female3DCG/Mouth/Moan/Icon.png deleted file mode 100644 index 0fbcd53e6..000000000 Binary files a/Assets/Female3DCG/Mouth/Moan/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Moan/Regular_Inner.png b/Assets/Female3DCG/Mouth/Moan/Regular_Inner.png deleted file mode 100644 index 12729618f..000000000 Binary files a/Assets/Female3DCG/Mouth/Moan/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Moan/Regular_Lips.png b/Assets/Female3DCG/Mouth/Moan/Regular_Lips.png deleted file mode 100644 index ec9775536..000000000 Binary files a/Assets/Female3DCG/Mouth/Moan/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Open/Discreet.png b/Assets/Female3DCG/Mouth/Open/Discreet.png deleted file mode 100644 index 602ee5950..000000000 Binary files a/Assets/Female3DCG/Mouth/Open/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Open/Icon.png b/Assets/Female3DCG/Mouth/Open/Icon.png deleted file mode 100644 index 9a902bdc9..000000000 Binary files a/Assets/Female3DCG/Mouth/Open/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Open/Regular_Inner.png b/Assets/Female3DCG/Mouth/Open/Regular_Inner.png deleted file mode 100644 index e1844122c..000000000 Binary files a/Assets/Female3DCG/Mouth/Open/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Open/Regular_Lips.png b/Assets/Female3DCG/Mouth/Open/Regular_Lips.png deleted file mode 100644 index 96a1e08b0..000000000 Binary files a/Assets/Female3DCG/Mouth/Open/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Pained/Discreet.png b/Assets/Female3DCG/Mouth/Pained/Discreet.png deleted file mode 100644 index 85a30b72b..000000000 Binary files a/Assets/Female3DCG/Mouth/Pained/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Pained/Icon.png b/Assets/Female3DCG/Mouth/Pained/Icon.png deleted file mode 100644 index f2080733e..000000000 Binary files a/Assets/Female3DCG/Mouth/Pained/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Pained/Regular_Inner.png b/Assets/Female3DCG/Mouth/Pained/Regular_Inner.png deleted file mode 100644 index d99ae4d85..000000000 Binary files a/Assets/Female3DCG/Mouth/Pained/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Pained/Regular_Lips.png b/Assets/Female3DCG/Mouth/Pained/Regular_Lips.png deleted file mode 100644 index 096e7e2b7..000000000 Binary files a/Assets/Female3DCG/Mouth/Pained/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Pout/Discreet.png b/Assets/Female3DCG/Mouth/Pout/Discreet.png deleted file mode 100644 index 85a30b72b..000000000 Binary files a/Assets/Female3DCG/Mouth/Pout/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Pout/Icon.png b/Assets/Female3DCG/Mouth/Pout/Icon.png deleted file mode 100644 index 672c4ccd4..000000000 Binary files a/Assets/Female3DCG/Mouth/Pout/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Pout/Regular_Inner.png b/Assets/Female3DCG/Mouth/Pout/Regular_Inner.png deleted file mode 100644 index 5445c6827..000000000 Binary files a/Assets/Female3DCG/Mouth/Pout/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Pout/Regular_Lips.png b/Assets/Female3DCG/Mouth/Pout/Regular_Lips.png deleted file mode 100644 index c61d2e999..000000000 Binary files a/Assets/Female3DCG/Mouth/Pout/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Regular_Inner.png b/Assets/Female3DCG/Mouth/Regular_Inner.png deleted file mode 100644 index 11a0602aa..000000000 Binary files a/Assets/Female3DCG/Mouth/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Regular_Lips.png b/Assets/Female3DCG/Mouth/Regular_Lips.png deleted file mode 100644 index ed24062bc..000000000 Binary files a/Assets/Female3DCG/Mouth/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Sad/Discreet.png b/Assets/Female3DCG/Mouth/Sad/Discreet.png deleted file mode 100644 index 0537c5be5..000000000 Binary files a/Assets/Female3DCG/Mouth/Sad/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Sad/Icon.png b/Assets/Female3DCG/Mouth/Sad/Icon.png deleted file mode 100644 index 2b6c9a6e5..000000000 Binary files a/Assets/Female3DCG/Mouth/Sad/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Sad/Regular_Inner.png b/Assets/Female3DCG/Mouth/Sad/Regular_Inner.png deleted file mode 100644 index ab3fcc963..000000000 Binary files a/Assets/Female3DCG/Mouth/Sad/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Sad/Regular_Lips.png b/Assets/Female3DCG/Mouth/Sad/Regular_Lips.png deleted file mode 100644 index dc228141b..000000000 Binary files a/Assets/Female3DCG/Mouth/Sad/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Smirk/Discreet.png b/Assets/Female3DCG/Mouth/Smirk/Discreet.png deleted file mode 100644 index c4a8d2b52..000000000 Binary files a/Assets/Female3DCG/Mouth/Smirk/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Smirk/Icon.png b/Assets/Female3DCG/Mouth/Smirk/Icon.png deleted file mode 100644 index 8823dcef8..000000000 Binary files a/Assets/Female3DCG/Mouth/Smirk/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Smirk/Regular_Inner.png b/Assets/Female3DCG/Mouth/Smirk/Regular_Inner.png deleted file mode 100644 index 5ff2c84b5..000000000 Binary files a/Assets/Female3DCG/Mouth/Smirk/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/Smirk/Regular_Lips.png b/Assets/Female3DCG/Mouth/Smirk/Regular_Lips.png deleted file mode 100644 index b694c3e50..000000000 Binary files a/Assets/Female3DCG/Mouth/Smirk/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/TonguePinch/Discreet.png b/Assets/Female3DCG/Mouth/TonguePinch/Discreet.png deleted file mode 100644 index 65563e5e4..000000000 Binary files a/Assets/Female3DCG/Mouth/TonguePinch/Discreet.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/TonguePinch/Icon.png b/Assets/Female3DCG/Mouth/TonguePinch/Icon.png deleted file mode 100644 index 8d01db7b2..000000000 Binary files a/Assets/Female3DCG/Mouth/TonguePinch/Icon.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/TonguePinch/Regular_Inner.png b/Assets/Female3DCG/Mouth/TonguePinch/Regular_Inner.png deleted file mode 100644 index 30e8c9d6d..000000000 Binary files a/Assets/Female3DCG/Mouth/TonguePinch/Regular_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/Mouth/TonguePinch/Regular_Lips.png b/Assets/Female3DCG/Mouth/TonguePinch/Regular_Lips.png deleted file mode 100644 index 81b13535c..000000000 Binary files a/Assets/Female3DCG/Mouth/TonguePinch/Regular_Lips.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_Large_Chains.png b/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_Large_Chains.png deleted file mode 100644 index 6d0d9e684..000000000 Binary files a/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_Large_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_Normal_Chains.png b/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_Normal_Chains.png deleted file mode 100644 index a24b9ac4f..000000000 Binary files a/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_Normal_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_Small_Chains.png b/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_Small_Chains.png deleted file mode 100644 index 071b3545c..000000000 Binary files a/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_Small_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_XLarge_Chains.png b/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_XLarge_Chains.png deleted file mode 100644 index be7d3f07e..000000000 Binary files a/Assets/Female3DCG/Necklace/BackCuffs/BodyChainNecklace_XLarge_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_Large_Chains.png b/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_Large_Chains.png deleted file mode 100644 index 4f5eb452a..000000000 Binary files a/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_Large_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_Normal_Chains.png b/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_Normal_Chains.png deleted file mode 100644 index 416163995..000000000 Binary files a/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_Normal_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_Small_Chains.png b/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_Small_Chains.png deleted file mode 100644 index 21d029a22..000000000 Binary files a/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_Small_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_XLarge_Chains.png b/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_XLarge_Chains.png deleted file mode 100644 index fca1ceb82..000000000 Binary files a/Assets/Female3DCG/Necklace/BackElbowTouch/BodyChainNecklace_XLarge_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Bandana.png b/Assets/Female3DCG/Necklace/Bandana.png deleted file mode 100644 index d08987740..000000000 Binary files a/Assets/Female3DCG/Necklace/Bandana.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BlackHeart.png b/Assets/Female3DCG/Necklace/BlackHeart.png deleted file mode 100644 index 4470bc7ef..000000000 Binary files a/Assets/Female3DCG/Necklace/BlackHeart.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BodyChainNecklace_Choker.png b/Assets/Female3DCG/Necklace/BodyChainNecklace_Choker.png deleted file mode 100644 index a97ab0c9e..000000000 Binary files a/Assets/Female3DCG/Necklace/BodyChainNecklace_Choker.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BodyChainNecklace_Large_Chains.png b/Assets/Female3DCG/Necklace/BodyChainNecklace_Large_Chains.png deleted file mode 100644 index 4ba0dd27f..000000000 Binary files a/Assets/Female3DCG/Necklace/BodyChainNecklace_Large_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BodyChainNecklace_Normal_Chains.png b/Assets/Female3DCG/Necklace/BodyChainNecklace_Normal_Chains.png deleted file mode 100644 index 98d492395..000000000 Binary files a/Assets/Female3DCG/Necklace/BodyChainNecklace_Normal_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BodyChainNecklace_Small_Chains.png b/Assets/Female3DCG/Necklace/BodyChainNecklace_Small_Chains.png deleted file mode 100644 index 3c634d606..000000000 Binary files a/Assets/Female3DCG/Necklace/BodyChainNecklace_Small_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/BodyChainNecklace_XLarge_Chains.png b/Assets/Female3DCG/Necklace/BodyChainNecklace_XLarge_Chains.png deleted file mode 100644 index b29882f8a..000000000 Binary files a/Assets/Female3DCG/Necklace/BodyChainNecklace_XLarge_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/CatsuitCollar.png b/Assets/Female3DCG/Necklace/CatsuitCollar.png deleted file mode 100644 index 0559642fd..000000000 Binary files a/Assets/Female3DCG/Necklace/CatsuitCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/ChokerTattoo.png b/Assets/Female3DCG/Necklace/ChokerTattoo.png deleted file mode 100644 index 9ee2aa7a7..000000000 Binary files a/Assets/Female3DCG/Necklace/ChokerTattoo.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/ChokerTattooFlowers.png b/Assets/Female3DCG/Necklace/ChokerTattooFlowers.png deleted file mode 100644 index 13324245b..000000000 Binary files a/Assets/Female3DCG/Necklace/ChokerTattooFlowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/ElegantHeartNecklace_Jewels.png b/Assets/Female3DCG/Necklace/ElegantHeartNecklace_Jewels.png deleted file mode 100644 index 7b1f8fab7..000000000 Binary files a/Assets/Female3DCG/Necklace/ElegantHeartNecklace_Jewels.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/ElegantHeartNecklace_Necklace.png b/Assets/Female3DCG/Necklace/ElegantHeartNecklace_Necklace.png deleted file mode 100644 index c1f38bb05..000000000 Binary files a/Assets/Female3DCG/Necklace/ElegantHeartNecklace_Necklace.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/FlowerGarland_Center.png b/Assets/Female3DCG/Necklace/FlowerGarland_Center.png deleted file mode 100644 index f82c286ff..000000000 Binary files a/Assets/Female3DCG/Necklace/FlowerGarland_Center.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/FlowerGarland_Petals.png b/Assets/Female3DCG/Necklace/FlowerGarland_Petals.png deleted file mode 100644 index a7ea465c9..000000000 Binary files a/Assets/Female3DCG/Necklace/FlowerGarland_Petals.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/FurScarf.png b/Assets/Female3DCG/Necklace/FurScarf.png deleted file mode 100644 index ba7e00fc0..000000000 Binary files a/Assets/Female3DCG/Necklace/FurScarf.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/IDCard_Card.png b/Assets/Female3DCG/Necklace/IDCard_Card.png deleted file mode 100644 index 88f376d9a..000000000 Binary files a/Assets/Female3DCG/Necklace/IDCard_Card.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/IDCard_String.png b/Assets/Female3DCG/Necklace/IDCard_String.png deleted file mode 100644 index 9bdd5554c..000000000 Binary files a/Assets/Female3DCG/Necklace/IDCard_String.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Necklace1.png b/Assets/Female3DCG/Necklace/Necklace1.png deleted file mode 100644 index 3cba4b869..000000000 Binary files a/Assets/Female3DCG/Necklace/Necklace1.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Necklace2.png b/Assets/Female3DCG/Necklace/Necklace2.png deleted file mode 100644 index 5093326f2..000000000 Binary files a/Assets/Female3DCG/Necklace/Necklace2.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Necklace3.png b/Assets/Female3DCG/Necklace/Necklace3.png deleted file mode 100644 index 5ce040ff7..000000000 Binary files a/Assets/Female3DCG/Necklace/Necklace3.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Necklace4.png b/Assets/Female3DCG/Necklace/Necklace4.png deleted file mode 100644 index a8baa4e04..000000000 Binary files a/Assets/Female3DCG/Necklace/Necklace4.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/NecklaceBallGag_Ball.png b/Assets/Female3DCG/Necklace/NecklaceBallGag_Ball.png deleted file mode 100644 index 639bb6a75..000000000 Binary files a/Assets/Female3DCG/Necklace/NecklaceBallGag_Ball.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/NecklaceBallGag_Strap.png b/Assets/Female3DCG/Necklace/NecklaceBallGag_Strap.png deleted file mode 100644 index 1639a8099..000000000 Binary files a/Assets/Female3DCG/Necklace/NecklaceBallGag_Strap.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/NecklaceKey_Chain.png b/Assets/Female3DCG/Necklace/NecklaceKey_Chain.png deleted file mode 100644 index 88ee51be5..000000000 Binary files a/Assets/Female3DCG/Necklace/NecklaceKey_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/NecklaceKey_Key.png b/Assets/Female3DCG/Necklace/NecklaceKey_Key.png deleted file mode 100644 index f0b56e491..000000000 Binary files a/Assets/Female3DCG/Necklace/NecklaceKey_Key.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/NecklaceLock_Chain.png b/Assets/Female3DCG/Necklace/NecklaceLock_Chain.png deleted file mode 100644 index 2b2662942..000000000 Binary files a/Assets/Female3DCG/Necklace/NecklaceLock_Chain.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/NecklaceLock_Lock.png b/Assets/Female3DCG/Necklace/NecklaceLock_Lock.png deleted file mode 100644 index fd785139f..000000000 Binary files a/Assets/Female3DCG/Necklace/NecklaceLock_Lock.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/NecklaceRope.png b/Assets/Female3DCG/Necklace/NecklaceRope.png deleted file mode 100644 index d0bc4db95..000000000 Binary files a/Assets/Female3DCG/Necklace/NecklaceRope.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/NecklaceRopeLong.png b/Assets/Female3DCG/Necklace/NecklaceRopeLong.png deleted file mode 100644 index e7e5ac768..000000000 Binary files a/Assets/Female3DCG/Necklace/NecklaceRopeLong.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_Large_Chains.png b/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_Large_Chains.png deleted file mode 100644 index 45b7c3f7d..000000000 Binary files a/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_Large_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_Normal_Chains.png b/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_Normal_Chains.png deleted file mode 100644 index ac7c76895..000000000 Binary files a/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_Normal_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_Small_Chains.png b/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_Small_Chains.png deleted file mode 100644 index f91bc6603..000000000 Binary files a/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_Small_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_XLarge_Chains.png b/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_XLarge_Chains.png deleted file mode 100644 index 0739831d0..000000000 Binary files a/Assets/Female3DCG/Necklace/OverTheHead/BodyChainNecklace_XLarge_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/Bandana.png b/Assets/Female3DCG/Necklace/Preview/Bandana.png deleted file mode 100644 index ea58e9295..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/Bandana.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/BlackHeart.png b/Assets/Female3DCG/Necklace/Preview/BlackHeart.png deleted file mode 100644 index 2a76a8f1e..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/BlackHeart.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/BodyChainNecklace.png b/Assets/Female3DCG/Necklace/Preview/BodyChainNecklace.png deleted file mode 100644 index 45add9063..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/BodyChainNecklace.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/CatsuitCollar.png b/Assets/Female3DCG/Necklace/Preview/CatsuitCollar.png deleted file mode 100644 index 15f31e40a..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/CatsuitCollar.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/ChokerTattoo.png b/Assets/Female3DCG/Necklace/Preview/ChokerTattoo.png deleted file mode 100644 index f1fbe4b58..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/ChokerTattoo.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/ElegantHeartNecklace.png b/Assets/Female3DCG/Necklace/Preview/ElegantHeartNecklace.png deleted file mode 100644 index 5ce25c915..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/ElegantHeartNecklace.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/FlowerGarland.png b/Assets/Female3DCG/Necklace/Preview/FlowerGarland.png deleted file mode 100644 index 9c05aafc6..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/FlowerGarland.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/FurScarf.png b/Assets/Female3DCG/Necklace/Preview/FurScarf.png deleted file mode 100644 index e049066fe..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/FurScarf.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/IDCard.png b/Assets/Female3DCG/Necklace/Preview/IDCard.png deleted file mode 100644 index 2d1bf9055..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/IDCard.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/Necklace1.png b/Assets/Female3DCG/Necklace/Preview/Necklace1.png deleted file mode 100644 index c1dca855b..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/Necklace1.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/Necklace2.png b/Assets/Female3DCG/Necklace/Preview/Necklace2.png deleted file mode 100644 index 019563aa7..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/Necklace2.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/Necklace3.png b/Assets/Female3DCG/Necklace/Preview/Necklace3.png deleted file mode 100644 index 8852f0069..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/Necklace3.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/Necklace4.png b/Assets/Female3DCG/Necklace/Preview/Necklace4.png deleted file mode 100644 index 1e85efce0..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/Necklace4.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/NecklaceBallGag.png b/Assets/Female3DCG/Necklace/Preview/NecklaceBallGag.png deleted file mode 100644 index 86d71acc9..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/NecklaceBallGag.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/NecklaceKey.png b/Assets/Female3DCG/Necklace/Preview/NecklaceKey.png deleted file mode 100644 index 056344597..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/NecklaceKey.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/NecklaceLock.png b/Assets/Female3DCG/Necklace/Preview/NecklaceLock.png deleted file mode 100644 index de3996abc..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/NecklaceLock.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Preview/NecklaceRope.png b/Assets/Female3DCG/Necklace/Preview/NecklaceRope.png deleted file mode 100644 index e736487ff..000000000 Binary files a/Assets/Female3DCG/Necklace/Preview/NecklaceRope.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_Large_Chains.png b/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_Large_Chains.png deleted file mode 100644 index 5439acb5e..000000000 Binary files a/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_Large_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_Normal_Chains.png b/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_Normal_Chains.png deleted file mode 100644 index 8246099d1..000000000 Binary files a/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_Normal_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_Small_Chains.png b/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_Small_Chains.png deleted file mode 100644 index 180e0a40e..000000000 Binary files a/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_Small_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_XLarge_Chains.png b/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_XLarge_Chains.png deleted file mode 100644 index e3b46b529..000000000 Binary files a/Assets/Female3DCG/Necklace/Yoked/BodyChainNecklace_XLarge_Chains.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples1_Large.png b/Assets/Female3DCG/Nipples/Nipples1_Large.png deleted file mode 100644 index ad7640be3..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples1_Normal.png b/Assets/Female3DCG/Nipples/Nipples1_Normal.png deleted file mode 100644 index b4103e041..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples1_Small.png b/Assets/Female3DCG/Nipples/Nipples1_Small.png deleted file mode 100644 index 777c3e489..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples1_XLarge.png b/Assets/Female3DCG/Nipples/Nipples1_XLarge.png deleted file mode 100644 index d949362ce..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples2_Large.png b/Assets/Female3DCG/Nipples/Nipples2_Large.png deleted file mode 100644 index c6c49dd02..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples2_Normal.png b/Assets/Female3DCG/Nipples/Nipples2_Normal.png deleted file mode 100644 index bf5173fbf..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples2_Small.png b/Assets/Female3DCG/Nipples/Nipples2_Small.png deleted file mode 100644 index d34a2d270..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples2_XLarge.png b/Assets/Female3DCG/Nipples/Nipples2_XLarge.png deleted file mode 100644 index 931090985..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples3_Large.png b/Assets/Female3DCG/Nipples/Nipples3_Large.png deleted file mode 100644 index 6c498272c..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples3_Normal.png b/Assets/Female3DCG/Nipples/Nipples3_Normal.png deleted file mode 100644 index b75cc983a..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples3_Small.png b/Assets/Female3DCG/Nipples/Nipples3_Small.png deleted file mode 100644 index 346214371..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Nipples/Nipples3_XLarge.png b/Assets/Female3DCG/Nipples/Nipples3_XLarge.png deleted file mode 100644 index ff5cfb819..000000000 Binary files a/Assets/Female3DCG/Nipples/Nipples3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Bikini1_Large.png b/Assets/Female3DCG/Panties/Bikini1_Large.png deleted file mode 100644 index 84ece7d3d..000000000 Binary files a/Assets/Female3DCG/Panties/Bikini1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Bikini1_Normal.png b/Assets/Female3DCG/Panties/Bikini1_Normal.png deleted file mode 100644 index f44f01846..000000000 Binary files a/Assets/Female3DCG/Panties/Bikini1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Bikini1_Small.png b/Assets/Female3DCG/Panties/Bikini1_Small.png deleted file mode 100644 index 4050055a4..000000000 Binary files a/Assets/Female3DCG/Panties/Bikini1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Bikini1_XLarge.png b/Assets/Female3DCG/Panties/Bikini1_XLarge.png deleted file mode 100644 index 70751cdd8..000000000 Binary files a/Assets/Female3DCG/Panties/Bikini1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_Back.png b/Assets/Female3DCG/Panties/BulkyDiaper_Back.png deleted file mode 100644 index 38ab8591c..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_Large_Base.png b/Assets/Female3DCG/Panties/BulkyDiaper_Large_Base.png deleted file mode 100644 index 18d7e8117..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_Large_CrotchPiece.png b/Assets/Female3DCG/Panties/BulkyDiaper_Large_CrotchPiece.png deleted file mode 100644 index b555182ac..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_Large_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_Large_WaistBand.png b/Assets/Female3DCG/Panties/BulkyDiaper_Large_WaistBand.png deleted file mode 100644 index 94dc18de6..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_Large_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_Normal_Base.png b/Assets/Female3DCG/Panties/BulkyDiaper_Normal_Base.png deleted file mode 100644 index 8c7ba9a0f..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_Normal_CrotchPiece.png b/Assets/Female3DCG/Panties/BulkyDiaper_Normal_CrotchPiece.png deleted file mode 100644 index 253e619f2..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_Normal_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_Normal_WaistBand.png b/Assets/Female3DCG/Panties/BulkyDiaper_Normal_WaistBand.png deleted file mode 100644 index 94c60b1a6..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_Normal_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_Small_Base.png b/Assets/Female3DCG/Panties/BulkyDiaper_Small_Base.png deleted file mode 100644 index 5ee4e645c..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_Small_CrotchPiece.png b/Assets/Female3DCG/Panties/BulkyDiaper_Small_CrotchPiece.png deleted file mode 100644 index 902341382..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_Small_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_Small_WaistBand.png b/Assets/Female3DCG/Panties/BulkyDiaper_Small_WaistBand.png deleted file mode 100644 index 5c04ad09c..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_Small_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_Tape.png b/Assets/Female3DCG/Panties/BulkyDiaper_Tape.png deleted file mode 100644 index 091b02942..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_XLarge_Base.png b/Assets/Female3DCG/Panties/BulkyDiaper_XLarge_Base.png deleted file mode 100644 index dcc12792d..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_XLarge_CrotchPiece.png b/Assets/Female3DCG/Panties/BulkyDiaper_XLarge_CrotchPiece.png deleted file mode 100644 index 237605887..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_XLarge_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/BulkyDiaper_XLarge_WaistBand.png b/Assets/Female3DCG/Panties/BulkyDiaper_XLarge_WaistBand.png deleted file mode 100644 index 3254e7c29..000000000 Binary files a/Assets/Female3DCG/Panties/BulkyDiaper_XLarge_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/ChinesePanties1_Large.png b/Assets/Female3DCG/Panties/ChinesePanties1_Large.png deleted file mode 100644 index a6aabaa14..000000000 Binary files a/Assets/Female3DCG/Panties/ChinesePanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/ChinesePanties1_Normal.png b/Assets/Female3DCG/Panties/ChinesePanties1_Normal.png deleted file mode 100644 index b3e7c8b1f..000000000 Binary files a/Assets/Female3DCG/Panties/ChinesePanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/ChinesePanties1_Small.png b/Assets/Female3DCG/Panties/ChinesePanties1_Small.png deleted file mode 100644 index 5c35f362c..000000000 Binary files a/Assets/Female3DCG/Panties/ChinesePanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/ChinesePanties1_XLarge.png b/Assets/Female3DCG/Panties/ChinesePanties1_XLarge.png deleted file mode 100644 index a40147c25..000000000 Binary files a/Assets/Female3DCG/Panties/ChinesePanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/CowPrintedPanties_Large.png b/Assets/Female3DCG/Panties/CowPrintedPanties_Large.png deleted file mode 100644 index 7e432bddf..000000000 Binary files a/Assets/Female3DCG/Panties/CowPrintedPanties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/CowPrintedPanties_Normal.png b/Assets/Female3DCG/Panties/CowPrintedPanties_Normal.png deleted file mode 100644 index 30f17a910..000000000 Binary files a/Assets/Female3DCG/Panties/CowPrintedPanties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/CowPrintedPanties_Small.png b/Assets/Female3DCG/Panties/CowPrintedPanties_Small.png deleted file mode 100644 index 7b66fa1b6..000000000 Binary files a/Assets/Female3DCG/Panties/CowPrintedPanties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/CowPrintedPanties_XLarge.png b/Assets/Female3DCG/Panties/CowPrintedPanties_XLarge.png deleted file mode 100644 index beb5219e6..000000000 Binary files a/Assets/Female3DCG/Panties/CowPrintedPanties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/CrotchPanties1_Large.png b/Assets/Female3DCG/Panties/CrotchPanties1_Large.png deleted file mode 100644 index 91456b882..000000000 Binary files a/Assets/Female3DCG/Panties/CrotchPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/CrotchPanties1_Normal.png b/Assets/Female3DCG/Panties/CrotchPanties1_Normal.png deleted file mode 100644 index 59650e965..000000000 Binary files a/Assets/Female3DCG/Panties/CrotchPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/CrotchPanties1_Small.png b/Assets/Female3DCG/Panties/CrotchPanties1_Small.png deleted file mode 100644 index e546fd16b..000000000 Binary files a/Assets/Female3DCG/Panties/CrotchPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/CrotchPanties1_XLarge.png b/Assets/Female3DCG/Panties/CrotchPanties1_XLarge.png deleted file mode 100644 index e95ae8fa9..000000000 Binary files a/Assets/Female3DCG/Panties/CrotchPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers1_Large.png b/Assets/Female3DCG/Panties/Diapers1_Large.png deleted file mode 100644 index d0615e05c..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers1_Normal.png b/Assets/Female3DCG/Panties/Diapers1_Normal.png deleted file mode 100644 index 4cb9dcfd0..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers1_Small.png b/Assets/Female3DCG/Panties/Diapers1_Small.png deleted file mode 100644 index bfcf5e90c..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers1_XLarge.png b/Assets/Female3DCG/Panties/Diapers1_XLarge.png deleted file mode 100644 index e8b32bfdc..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers2_Large_Cover.png b/Assets/Female3DCG/Panties/Diapers2_Large_Cover.png deleted file mode 100644 index c6172fb49..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers2_Large_Cover.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers2_Large_Diaper.png b/Assets/Female3DCG/Panties/Diapers2_Large_Diaper.png deleted file mode 100644 index 7c36681c3..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers2_Large_Diaper.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers2_Normal_Cover.png b/Assets/Female3DCG/Panties/Diapers2_Normal_Cover.png deleted file mode 100644 index cbe55a344..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers2_Normal_Cover.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers2_Normal_Diaper.png b/Assets/Female3DCG/Panties/Diapers2_Normal_Diaper.png deleted file mode 100644 index 913a78650..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers2_Normal_Diaper.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers2_Small_Cover.png b/Assets/Female3DCG/Panties/Diapers2_Small_Cover.png deleted file mode 100644 index 4501f8b6c..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers2_Small_Cover.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers2_Small_Diaper.png b/Assets/Female3DCG/Panties/Diapers2_Small_Diaper.png deleted file mode 100644 index 2f68ac03e..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers2_Small_Diaper.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers2_XLarge_Cover.png b/Assets/Female3DCG/Panties/Diapers2_XLarge_Cover.png deleted file mode 100644 index 3ce1675a3..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers2_XLarge_Cover.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers2_XLarge_Diaper.png b/Assets/Female3DCG/Panties/Diapers2_XLarge_Diaper.png deleted file mode 100644 index a4da30638..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers2_XLarge_Diaper.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers3_Large.png b/Assets/Female3DCG/Panties/Diapers3_Large.png deleted file mode 100644 index 6581f53dc..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers3_Normal.png b/Assets/Female3DCG/Panties/Diapers3_Normal.png deleted file mode 100644 index 7eb901c20..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers3_Small.png b/Assets/Female3DCG/Panties/Diapers3_Small.png deleted file mode 100644 index cdfb43843..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers3_XLarge.png b/Assets/Female3DCG/Panties/Diapers3_XLarge.png deleted file mode 100644 index b6308943c..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_LargeButterfly_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_LargeButterfly_Pattern.png deleted file mode 100644 index ce8bc3b05..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_LargeButterfly_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_LargeFlower_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_LargeFlower_Pattern.png deleted file mode 100644 index 6881aa9c2..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_LargeFlower_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_LargeSpots_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_LargeSpots_Pattern.png deleted file mode 100644 index ea790cfd8..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_LargeSpots_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_LargeStrawBerry_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_LargeStrawBerry_Pattern.png deleted file mode 100644 index d7a5a089a..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_LargeStrawBerry_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_Large_Diaper.png b/Assets/Female3DCG/Panties/Diapers4_Large_Diaper.png deleted file mode 100644 index 5304e9ca4..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_Large_Diaper.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_Large_Tape.png b/Assets/Female3DCG/Panties/Diapers4_Large_Tape.png deleted file mode 100644 index bd8938229..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_Large_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_NormalButterfly_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_NormalButterfly_Pattern.png deleted file mode 100644 index ce8bc3b05..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_NormalButterfly_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_NormalFlower_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_NormalFlower_Pattern.png deleted file mode 100644 index 6881aa9c2..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_NormalFlower_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_NormalSpots_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_NormalSpots_Pattern.png deleted file mode 100644 index ea790cfd8..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_NormalSpots_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_NormalStrawBerry_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_NormalStrawBerry_Pattern.png deleted file mode 100644 index d7a5a089a..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_NormalStrawBerry_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_Normal_Diaper.png b/Assets/Female3DCG/Panties/Diapers4_Normal_Diaper.png deleted file mode 100644 index 603fe7784..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_Normal_Diaper.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_Normal_Tape.png b/Assets/Female3DCG/Panties/Diapers4_Normal_Tape.png deleted file mode 100644 index 4a6be2424..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_Normal_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_SmallButterfly_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_SmallButterfly_Pattern.png deleted file mode 100644 index ce8bc3b05..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_SmallButterfly_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_SmallFlower_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_SmallFlower_Pattern.png deleted file mode 100644 index 6881aa9c2..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_SmallFlower_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_SmallSpots_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_SmallSpots_Pattern.png deleted file mode 100644 index ea790cfd8..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_SmallSpots_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_SmallStrawBerry_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_SmallStrawBerry_Pattern.png deleted file mode 100644 index d7a5a089a..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_SmallStrawBerry_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_Small_Diaper.png b/Assets/Female3DCG/Panties/Diapers4_Small_Diaper.png deleted file mode 100644 index 849752525..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_Small_Diaper.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_Small_Tape.png b/Assets/Female3DCG/Panties/Diapers4_Small_Tape.png deleted file mode 100644 index 164268e09..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_Small_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_XLargeButterfly_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_XLargeButterfly_Pattern.png deleted file mode 100644 index ce8bc3b05..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_XLargeButterfly_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_XLargeFlower_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_XLargeFlower_Pattern.png deleted file mode 100644 index 6881aa9c2..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_XLargeFlower_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_XLargeSpots_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_XLargeSpots_Pattern.png deleted file mode 100644 index ea790cfd8..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_XLargeSpots_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_XLargeStrawBerry_Pattern.png b/Assets/Female3DCG/Panties/Diapers4_XLargeStrawBerry_Pattern.png deleted file mode 100644 index d7a5a089a..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_XLargeStrawBerry_Pattern.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_XLarge_Diaper.png b/Assets/Female3DCG/Panties/Diapers4_XLarge_Diaper.png deleted file mode 100644 index 8cfe10d31..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_XLarge_Diaper.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Diapers4_XLarge_Tape.png b/Assets/Female3DCG/Panties/Diapers4_XLarge_Tape.png deleted file mode 100644 index b4e62c1c2..000000000 Binary files a/Assets/Female3DCG/Panties/Diapers4_XLarge_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FloralPanties2_Large_Base.png b/Assets/Female3DCG/Panties/FloralPanties2_Large_Base.png deleted file mode 100644 index 6d729c67d..000000000 Binary files a/Assets/Female3DCG/Panties/FloralPanties2_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FloralPanties2_Large_Flowers.png b/Assets/Female3DCG/Panties/FloralPanties2_Large_Flowers.png deleted file mode 100644 index 2b6673737..000000000 Binary files a/Assets/Female3DCG/Panties/FloralPanties2_Large_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FloralPanties2_Normal_Base.png b/Assets/Female3DCG/Panties/FloralPanties2_Normal_Base.png deleted file mode 100644 index af91bf0bf..000000000 Binary files a/Assets/Female3DCG/Panties/FloralPanties2_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FloralPanties2_Normal_Flowers.png b/Assets/Female3DCG/Panties/FloralPanties2_Normal_Flowers.png deleted file mode 100644 index 2b6673737..000000000 Binary files a/Assets/Female3DCG/Panties/FloralPanties2_Normal_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FloralPanties2_Small_Base.png b/Assets/Female3DCG/Panties/FloralPanties2_Small_Base.png deleted file mode 100644 index 4db7f1a9a..000000000 Binary files a/Assets/Female3DCG/Panties/FloralPanties2_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FloralPanties2_Small_Flowers.png b/Assets/Female3DCG/Panties/FloralPanties2_Small_Flowers.png deleted file mode 100644 index 2b6673737..000000000 Binary files a/Assets/Female3DCG/Panties/FloralPanties2_Small_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FloralPanties2_XLarge_Base.png b/Assets/Female3DCG/Panties/FloralPanties2_XLarge_Base.png deleted file mode 100644 index 55b33e367..000000000 Binary files a/Assets/Female3DCG/Panties/FloralPanties2_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FloralPanties2_XLarge_Flowers.png b/Assets/Female3DCG/Panties/FloralPanties2_XLarge_Flowers.png deleted file mode 100644 index 2b6673737..000000000 Binary files a/Assets/Female3DCG/Panties/FloralPanties2_XLarge_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FlowerPanties_Large_Flowers.png b/Assets/Female3DCG/Panties/FlowerPanties_Large_Flowers.png deleted file mode 100644 index f07bda96e..000000000 Binary files a/Assets/Female3DCG/Panties/FlowerPanties_Large_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FlowerPanties_Large_Panties.png b/Assets/Female3DCG/Panties/FlowerPanties_Large_Panties.png deleted file mode 100644 index f6e46bb56..000000000 Binary files a/Assets/Female3DCG/Panties/FlowerPanties_Large_Panties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FlowerPanties_Normal_Flowers.png b/Assets/Female3DCG/Panties/FlowerPanties_Normal_Flowers.png deleted file mode 100644 index e8fd8e011..000000000 Binary files a/Assets/Female3DCG/Panties/FlowerPanties_Normal_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FlowerPanties_Normal_Panties.png b/Assets/Female3DCG/Panties/FlowerPanties_Normal_Panties.png deleted file mode 100644 index b3801a74d..000000000 Binary files a/Assets/Female3DCG/Panties/FlowerPanties_Normal_Panties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FlowerPanties_Small_Flowers.png b/Assets/Female3DCG/Panties/FlowerPanties_Small_Flowers.png deleted file mode 100644 index 599856269..000000000 Binary files a/Assets/Female3DCG/Panties/FlowerPanties_Small_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FlowerPanties_Small_Panties.png b/Assets/Female3DCG/Panties/FlowerPanties_Small_Panties.png deleted file mode 100644 index 87df39529..000000000 Binary files a/Assets/Female3DCG/Panties/FlowerPanties_Small_Panties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FlowerPanties_XLarge_Flowers.png b/Assets/Female3DCG/Panties/FlowerPanties_XLarge_Flowers.png deleted file mode 100644 index 5681b1112..000000000 Binary files a/Assets/Female3DCG/Panties/FlowerPanties_XLarge_Flowers.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/FlowerPanties_XLarge_Panties.png b/Assets/Female3DCG/Panties/FlowerPanties_XLarge_Panties.png deleted file mode 100644 index 2d3a522a8..000000000 Binary files a/Assets/Female3DCG/Panties/FlowerPanties_XLarge_Panties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/KittyPanties1_Large.png b/Assets/Female3DCG/Panties/KittyPanties1_Large.png deleted file mode 100644 index 72b5efed1..000000000 Binary files a/Assets/Female3DCG/Panties/KittyPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/KittyPanties1_Normal.png b/Assets/Female3DCG/Panties/KittyPanties1_Normal.png deleted file mode 100644 index 4d0e7176e..000000000 Binary files a/Assets/Female3DCG/Panties/KittyPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/KittyPanties1_Small.png b/Assets/Female3DCG/Panties/KittyPanties1_Small.png deleted file mode 100644 index e497bd93f..000000000 Binary files a/Assets/Female3DCG/Panties/KittyPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/KittyPanties1_XLarge.png b/Assets/Female3DCG/Panties/KittyPanties1_XLarge.png deleted file mode 100644 index 1d20863cf..000000000 Binary files a/Assets/Female3DCG/Panties/KittyPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Back.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Back.png deleted file mode 100644 index 38ab8591c..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Large_Base.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Large_Base.png deleted file mode 100644 index 27e4b969b..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Large_CrotchPiece.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Large_CrotchPiece.png deleted file mode 100644 index b555182ac..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Large_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Large_WaistBand.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Large_WaistBand.png deleted file mode 100644 index 94dc18de6..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Large_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Normal_Base.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Normal_Base.png deleted file mode 100644 index 9341703da..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Normal_CrotchPiece.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Normal_CrotchPiece.png deleted file mode 100644 index 253e619f2..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Normal_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Normal_WaistBand.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Normal_WaistBand.png deleted file mode 100644 index 94c60b1a6..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Normal_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Small_Base.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Small_Base.png deleted file mode 100644 index 258cdaa70..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Small_CrotchPiece.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Small_CrotchPiece.png deleted file mode 100644 index 902341382..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Small_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Small_WaistBand.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Small_WaistBand.png deleted file mode 100644 index 5c04ad09c..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Small_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Tape.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Tape.png deleted file mode 100644 index 091b02942..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_XLarge_Base.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_XLarge_Base.png deleted file mode 100644 index 6d7070560..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_XLarge_CrotchPiece.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_XLarge_CrotchPiece.png deleted file mode 100644 index 237605887..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_XLarge_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_XLarge_WaistBand.png b/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_XLarge_WaistBand.png deleted file mode 100644 index 3254e7c29..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/BulkyDiaper_XLarge_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Back.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Back.png deleted file mode 100644 index 7adf49cad..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_Base.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_Base.png deleted file mode 100644 index 5a2882025..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_CrotchPatch.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_Frills.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_PoofyBase.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_PoofyBase.png deleted file mode 100644 index b822bb023..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Large_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_Base.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_Base.png deleted file mode 100644 index b3b8deba6..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_CrotchPatch.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_Frills.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_PoofyBase.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_PoofyBase.png deleted file mode 100644 index f440bdf19..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Normal_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_Base.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_Base.png deleted file mode 100644 index eeadb1ce0..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_CrotchPatch.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_Frills.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_PoofyBase.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_PoofyBase.png deleted file mode 100644 index f92419df5..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Small_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Tape.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Tape.png deleted file mode 100644 index 1f5ff808a..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_Base.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_Base.png deleted file mode 100644 index 6662b7f3c..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_CrotchPatch.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_Frills.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_PoofyBase.png b/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_PoofyBase.png deleted file mode 100644 index f4ab2dece..000000000 Binary files a/Assets/Female3DCG/Panties/Kneel/PoofyDiaper_XLarge_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_Large.png b/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_Large.png deleted file mode 100644 index 402f53862..000000000 Binary files a/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_Normal.png b/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_Normal.png deleted file mode 100644 index cc8ea42d4..000000000 Binary files a/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_Small.png b/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_Small.png deleted file mode 100644 index 606f89079..000000000 Binary files a/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_XLarge.png b/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_XLarge.png deleted file mode 100644 index 402f53862..000000000 Binary files a/Assets/Female3DCG/Panties/KneelingSpread/CrotchPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexCrotchlessPanties_Large.png b/Assets/Female3DCG/Panties/LatexCrotchlessPanties_Large.png deleted file mode 100644 index 53780446f..000000000 Binary files a/Assets/Female3DCG/Panties/LatexCrotchlessPanties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexCrotchlessPanties_Normal.png b/Assets/Female3DCG/Panties/LatexCrotchlessPanties_Normal.png deleted file mode 100644 index d0b7a281d..000000000 Binary files a/Assets/Female3DCG/Panties/LatexCrotchlessPanties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexCrotchlessPanties_Small.png b/Assets/Female3DCG/Panties/LatexCrotchlessPanties_Small.png deleted file mode 100644 index 2e9c5efb7..000000000 Binary files a/Assets/Female3DCG/Panties/LatexCrotchlessPanties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexCrotchlessPanties_XLarge.png b/Assets/Female3DCG/Panties/LatexCrotchlessPanties_XLarge.png deleted file mode 100644 index 34f83deb9..000000000 Binary files a/Assets/Female3DCG/Panties/LatexCrotchlessPanties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexPanties1_Large.png b/Assets/Female3DCG/Panties/LatexPanties1_Large.png deleted file mode 100644 index 826b1827f..000000000 Binary files a/Assets/Female3DCG/Panties/LatexPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexPanties1_Normal.png b/Assets/Female3DCG/Panties/LatexPanties1_Normal.png deleted file mode 100644 index beea1c2bd..000000000 Binary files a/Assets/Female3DCG/Panties/LatexPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexPanties1_Small.png b/Assets/Female3DCG/Panties/LatexPanties1_Small.png deleted file mode 100644 index d0e00018d..000000000 Binary files a/Assets/Female3DCG/Panties/LatexPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexPanties1_XLarge.png b/Assets/Female3DCG/Panties/LatexPanties1_XLarge.png deleted file mode 100644 index d634c4057..000000000 Binary files a/Assets/Female3DCG/Panties/LatexPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexPanties2_Large.png b/Assets/Female3DCG/Panties/LatexPanties2_Large.png deleted file mode 100644 index 63085cea1..000000000 Binary files a/Assets/Female3DCG/Panties/LatexPanties2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexPanties2_Normal.png b/Assets/Female3DCG/Panties/LatexPanties2_Normal.png deleted file mode 100644 index 09633f5d0..000000000 Binary files a/Assets/Female3DCG/Panties/LatexPanties2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexPanties2_Small.png b/Assets/Female3DCG/Panties/LatexPanties2_Small.png deleted file mode 100644 index 2ae9efb9c..000000000 Binary files a/Assets/Female3DCG/Panties/LatexPanties2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LatexPanties2_XLarge.png b/Assets/Female3DCG/Panties/LatexPanties2_XLarge.png deleted file mode 100644 index d6bb21cb1..000000000 Binary files a/Assets/Female3DCG/Panties/LatexPanties2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LeatherStrapPanties1_Large.png b/Assets/Female3DCG/Panties/LeatherStrapPanties1_Large.png deleted file mode 100644 index 11fcf33ce..000000000 Binary files a/Assets/Female3DCG/Panties/LeatherStrapPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LeatherStrapPanties1_Normal.png b/Assets/Female3DCG/Panties/LeatherStrapPanties1_Normal.png deleted file mode 100644 index 3a5fce6e1..000000000 Binary files a/Assets/Female3DCG/Panties/LeatherStrapPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LeatherStrapPanties1_Small.png b/Assets/Female3DCG/Panties/LeatherStrapPanties1_Small.png deleted file mode 100644 index feeaa996d..000000000 Binary files a/Assets/Female3DCG/Panties/LeatherStrapPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LeatherStrapPanties1_XLarge.png b/Assets/Female3DCG/Panties/LeatherStrapPanties1_XLarge.png deleted file mode 100644 index a54b87f9a..000000000 Binary files a/Assets/Female3DCG/Panties/LeatherStrapPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Back.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Back.png deleted file mode 100644 index 38ab8591c..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Large_Base.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Large_Base.png deleted file mode 100644 index 27e4b969b..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Large_CrotchPiece.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Large_CrotchPiece.png deleted file mode 100644 index b555182ac..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Large_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Large_WaistBand.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Large_WaistBand.png deleted file mode 100644 index 94dc18de6..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Large_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Normal_Base.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Normal_Base.png deleted file mode 100644 index 9341703da..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Normal_CrotchPiece.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Normal_CrotchPiece.png deleted file mode 100644 index 253e619f2..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Normal_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Normal_WaistBand.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Normal_WaistBand.png deleted file mode 100644 index 94c60b1a6..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Normal_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Small_Base.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Small_Base.png deleted file mode 100644 index 258cdaa70..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Small_CrotchPiece.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Small_CrotchPiece.png deleted file mode 100644 index 902341382..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Small_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Small_WaistBand.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Small_WaistBand.png deleted file mode 100644 index 5c04ad09c..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Small_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Tape.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Tape.png deleted file mode 100644 index 091b02942..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_XLarge_Base.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_XLarge_Base.png deleted file mode 100644 index 6d7070560..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_XLarge_CrotchPiece.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_XLarge_CrotchPiece.png deleted file mode 100644 index 237605887..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_XLarge_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_XLarge_WaistBand.png b/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_XLarge_WaistBand.png deleted file mode 100644 index 3254e7c29..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/BulkyDiaper_XLarge_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Back.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Back.png deleted file mode 100644 index 7adf49cad..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_Base.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_Base.png deleted file mode 100644 index 5a2882025..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_CrotchPatch.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_Frills.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_PoofyBase.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_PoofyBase.png deleted file mode 100644 index b822bb023..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Large_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_Base.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_Base.png deleted file mode 100644 index b3b8deba6..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_CrotchPatch.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_Frills.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_PoofyBase.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_PoofyBase.png deleted file mode 100644 index f440bdf19..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Normal_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_Base.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_Base.png deleted file mode 100644 index eeadb1ce0..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_CrotchPatch.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_Frills.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_PoofyBase.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_PoofyBase.png deleted file mode 100644 index f92419df5..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Small_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Tape.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Tape.png deleted file mode 100644 index 1f5ff808a..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_Base.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_Base.png deleted file mode 100644 index 6662b7f3c..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_CrotchPatch.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_Frills.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_PoofyBase.png b/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_PoofyBase.png deleted file mode 100644 index f4ab2dece..000000000 Binary files a/Assets/Female3DCG/Panties/LegsClosed/PoofyDiaper_XLarge_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties1_Large.png b/Assets/Female3DCG/Panties/MaidPanties1_Large.png deleted file mode 100644 index a8aafd328..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties1_Normal.png b/Assets/Female3DCG/Panties/MaidPanties1_Normal.png deleted file mode 100644 index 7d574b286..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties1_Small.png b/Assets/Female3DCG/Panties/MaidPanties1_Small.png deleted file mode 100644 index 12d617e92..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties1_XLarge.png b/Assets/Female3DCG/Panties/MaidPanties1_XLarge.png deleted file mode 100644 index 6247441ea..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties2_Large_Frills.png b/Assets/Female3DCG/Panties/MaidPanties2_Large_Frills.png deleted file mode 100644 index b398a00cf..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties2_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties2_Large_Panties.png b/Assets/Female3DCG/Panties/MaidPanties2_Large_Panties.png deleted file mode 100644 index f636df7f4..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties2_Large_Panties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties2_Normal_Frills.png b/Assets/Female3DCG/Panties/MaidPanties2_Normal_Frills.png deleted file mode 100644 index 8c5cd1279..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties2_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties2_Normal_Panties.png b/Assets/Female3DCG/Panties/MaidPanties2_Normal_Panties.png deleted file mode 100644 index 35f74b738..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties2_Normal_Panties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties2_Small_Frills.png b/Assets/Female3DCG/Panties/MaidPanties2_Small_Frills.png deleted file mode 100644 index 47b3e1761..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties2_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties2_Small_Panties.png b/Assets/Female3DCG/Panties/MaidPanties2_Small_Panties.png deleted file mode 100644 index 43bbcb139..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties2_Small_Panties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties2_XLarge_Frills.png b/Assets/Female3DCG/Panties/MaidPanties2_XLarge_Frills.png deleted file mode 100644 index 27d4afc07..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties2_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MaidPanties2_XLarge_Panties.png b/Assets/Female3DCG/Panties/MaidPanties2_XLarge_Panties.png deleted file mode 100644 index 971d1c4b6..000000000 Binary files a/Assets/Female3DCG/Panties/MaidPanties2_XLarge_Panties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MicroThong_Large.png b/Assets/Female3DCG/Panties/MicroThong_Large.png deleted file mode 100644 index cfb73f8c6..000000000 Binary files a/Assets/Female3DCG/Panties/MicroThong_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MicroThong_Normal.png b/Assets/Female3DCG/Panties/MicroThong_Normal.png deleted file mode 100644 index 5b9ff9e30..000000000 Binary files a/Assets/Female3DCG/Panties/MicroThong_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MicroThong_Small.png b/Assets/Female3DCG/Panties/MicroThong_Small.png deleted file mode 100644 index 7ea88cd72..000000000 Binary files a/Assets/Female3DCG/Panties/MicroThong_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/MicroThong_XLarge.png b/Assets/Female3DCG/Panties/MicroThong_XLarge.png deleted file mode 100644 index 92ff9ce0b..000000000 Binary files a/Assets/Female3DCG/Panties/MicroThong_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties11_Large.png b/Assets/Female3DCG/Panties/Panties11_Large.png deleted file mode 100644 index adc2a63ec..000000000 Binary files a/Assets/Female3DCG/Panties/Panties11_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties11_Normal.png b/Assets/Female3DCG/Panties/Panties11_Normal.png deleted file mode 100644 index ca74be22c..000000000 Binary files a/Assets/Female3DCG/Panties/Panties11_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties11_Small.png b/Assets/Female3DCG/Panties/Panties11_Small.png deleted file mode 100644 index a0325cebd..000000000 Binary files a/Assets/Female3DCG/Panties/Panties11_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties11_XLarge.png b/Assets/Female3DCG/Panties/Panties11_XLarge.png deleted file mode 100644 index fd9b71903..000000000 Binary files a/Assets/Female3DCG/Panties/Panties11_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties12_Large.png b/Assets/Female3DCG/Panties/Panties12_Large.png deleted file mode 100644 index 1d8b9b02f..000000000 Binary files a/Assets/Female3DCG/Panties/Panties12_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties12_Normal.png b/Assets/Female3DCG/Panties/Panties12_Normal.png deleted file mode 100644 index a4516d1ea..000000000 Binary files a/Assets/Female3DCG/Panties/Panties12_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties12_Small.png b/Assets/Female3DCG/Panties/Panties12_Small.png deleted file mode 100644 index 45ea65510..000000000 Binary files a/Assets/Female3DCG/Panties/Panties12_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties12_XLarge.png b/Assets/Female3DCG/Panties/Panties12_XLarge.png deleted file mode 100644 index 150352a68..000000000 Binary files a/Assets/Female3DCG/Panties/Panties12_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties13_Large.png b/Assets/Female3DCG/Panties/Panties13_Large.png deleted file mode 100644 index 206de51ed..000000000 Binary files a/Assets/Female3DCG/Panties/Panties13_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties13_Normal.png b/Assets/Female3DCG/Panties/Panties13_Normal.png deleted file mode 100644 index fbcc4b7e3..000000000 Binary files a/Assets/Female3DCG/Panties/Panties13_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties13_Small.png b/Assets/Female3DCG/Panties/Panties13_Small.png deleted file mode 100644 index 0b0cb0942..000000000 Binary files a/Assets/Female3DCG/Panties/Panties13_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties13_XLarge.png b/Assets/Female3DCG/Panties/Panties13_XLarge.png deleted file mode 100644 index d90ac8d40..000000000 Binary files a/Assets/Female3DCG/Panties/Panties13_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties14_Large.png b/Assets/Female3DCG/Panties/Panties14_Large.png deleted file mode 100644 index f7b6d7e66..000000000 Binary files a/Assets/Female3DCG/Panties/Panties14_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties14_Normal.png b/Assets/Female3DCG/Panties/Panties14_Normal.png deleted file mode 100644 index 4f8d372cd..000000000 Binary files a/Assets/Female3DCG/Panties/Panties14_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties14_Small.png b/Assets/Female3DCG/Panties/Panties14_Small.png deleted file mode 100644 index 8bca91221..000000000 Binary files a/Assets/Female3DCG/Panties/Panties14_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties14_XLarge.png b/Assets/Female3DCG/Panties/Panties14_XLarge.png deleted file mode 100644 index f9a87b882..000000000 Binary files a/Assets/Female3DCG/Panties/Panties14_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties15_Large.png b/Assets/Female3DCG/Panties/Panties15_Large.png deleted file mode 100644 index 5f0cd7396..000000000 Binary files a/Assets/Female3DCG/Panties/Panties15_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties15_Normal.png b/Assets/Female3DCG/Panties/Panties15_Normal.png deleted file mode 100644 index 2615e4e22..000000000 Binary files a/Assets/Female3DCG/Panties/Panties15_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties15_Small.png b/Assets/Female3DCG/Panties/Panties15_Small.png deleted file mode 100644 index 0f2bff1d3..000000000 Binary files a/Assets/Female3DCG/Panties/Panties15_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties15_XLarge.png b/Assets/Female3DCG/Panties/Panties15_XLarge.png deleted file mode 100644 index 59150facc..000000000 Binary files a/Assets/Female3DCG/Panties/Panties15_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties16_Large.png b/Assets/Female3DCG/Panties/Panties16_Large.png deleted file mode 100644 index c365d2289..000000000 Binary files a/Assets/Female3DCG/Panties/Panties16_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties16_Normal.png b/Assets/Female3DCG/Panties/Panties16_Normal.png deleted file mode 100644 index 6b594c998..000000000 Binary files a/Assets/Female3DCG/Panties/Panties16_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties16_Small.png b/Assets/Female3DCG/Panties/Panties16_Small.png deleted file mode 100644 index 28356e5fc..000000000 Binary files a/Assets/Female3DCG/Panties/Panties16_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties16_XLarge.png b/Assets/Female3DCG/Panties/Panties16_XLarge.png deleted file mode 100644 index 0f3ff82fb..000000000 Binary files a/Assets/Female3DCG/Panties/Panties16_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties1_Large.png b/Assets/Female3DCG/Panties/Panties1_Large.png deleted file mode 100644 index f18c920b4..000000000 Binary files a/Assets/Female3DCG/Panties/Panties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties1_Normal.png b/Assets/Female3DCG/Panties/Panties1_Normal.png deleted file mode 100644 index 2e3d6613b..000000000 Binary files a/Assets/Female3DCG/Panties/Panties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties1_Small.png b/Assets/Female3DCG/Panties/Panties1_Small.png deleted file mode 100644 index 2f918a009..000000000 Binary files a/Assets/Female3DCG/Panties/Panties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties1_XLarge.png b/Assets/Female3DCG/Panties/Panties1_XLarge.png deleted file mode 100644 index ddf2065b2..000000000 Binary files a/Assets/Female3DCG/Panties/Panties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties7_Large.png b/Assets/Female3DCG/Panties/Panties7_Large.png deleted file mode 100644 index aae37bc3b..000000000 Binary files a/Assets/Female3DCG/Panties/Panties7_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties7_Normal.png b/Assets/Female3DCG/Panties/Panties7_Normal.png deleted file mode 100644 index 9063b0f5b..000000000 Binary files a/Assets/Female3DCG/Panties/Panties7_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties7_Small.png b/Assets/Female3DCG/Panties/Panties7_Small.png deleted file mode 100644 index c8ceb0e4e..000000000 Binary files a/Assets/Female3DCG/Panties/Panties7_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties7_XLarge.png b/Assets/Female3DCG/Panties/Panties7_XLarge.png deleted file mode 100644 index 1c4d3c7f4..000000000 Binary files a/Assets/Female3DCG/Panties/Panties7_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties8_Large.png b/Assets/Female3DCG/Panties/Panties8_Large.png deleted file mode 100644 index 10df57edb..000000000 Binary files a/Assets/Female3DCG/Panties/Panties8_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties8_Normal.png b/Assets/Female3DCG/Panties/Panties8_Normal.png deleted file mode 100644 index 93fce2b00..000000000 Binary files a/Assets/Female3DCG/Panties/Panties8_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties8_Small.png b/Assets/Female3DCG/Panties/Panties8_Small.png deleted file mode 100644 index c2382e3f7..000000000 Binary files a/Assets/Female3DCG/Panties/Panties8_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Panties8_XLarge.png b/Assets/Female3DCG/Panties/Panties8_XLarge.png deleted file mode 100644 index 1e085f462..000000000 Binary files a/Assets/Female3DCG/Panties/Panties8_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PearlPanties1_Large.png b/Assets/Female3DCG/Panties/PearlPanties1_Large.png deleted file mode 100644 index 301ede89b..000000000 Binary files a/Assets/Female3DCG/Panties/PearlPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PearlPanties1_Normal.png b/Assets/Female3DCG/Panties/PearlPanties1_Normal.png deleted file mode 100644 index 716250181..000000000 Binary files a/Assets/Female3DCG/Panties/PearlPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PearlPanties1_Small.png b/Assets/Female3DCG/Panties/PearlPanties1_Small.png deleted file mode 100644 index 4cae513e9..000000000 Binary files a/Assets/Female3DCG/Panties/PearlPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PearlPanties1_XLarge.png b/Assets/Female3DCG/Panties/PearlPanties1_XLarge.png deleted file mode 100644 index fe3dfd3fa..000000000 Binary files a/Assets/Female3DCG/Panties/PearlPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_Large_Layer1.png b/Assets/Female3DCG/Panties/PilotPanties_Large_Layer1.png deleted file mode 100644 index 777fc6596..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_Large_Layer2.png b/Assets/Female3DCG/Panties/PilotPanties_Large_Layer2.png deleted file mode 100644 index 152097e49..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_Large_Layer3.png b/Assets/Female3DCG/Panties/PilotPanties_Large_Layer3.png deleted file mode 100644 index bce7a6f5e..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_Normal_Layer1.png b/Assets/Female3DCG/Panties/PilotPanties_Normal_Layer1.png deleted file mode 100644 index 7ac2b3a29..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_Normal_Layer2.png b/Assets/Female3DCG/Panties/PilotPanties_Normal_Layer2.png deleted file mode 100644 index f1b1d6290..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_Normal_Layer3.png b/Assets/Female3DCG/Panties/PilotPanties_Normal_Layer3.png deleted file mode 100644 index cec6a13d2..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_Small_Layer1.png b/Assets/Female3DCG/Panties/PilotPanties_Small_Layer1.png deleted file mode 100644 index 877ef87bb..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_Small_Layer2.png b/Assets/Female3DCG/Panties/PilotPanties_Small_Layer2.png deleted file mode 100644 index 79da9cfd9..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_Small_Layer3.png b/Assets/Female3DCG/Panties/PilotPanties_Small_Layer3.png deleted file mode 100644 index cec6a13d2..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_XLarge_Layer1.png b/Assets/Female3DCG/Panties/PilotPanties_XLarge_Layer1.png deleted file mode 100644 index dc7516837..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_XLarge_Layer2.png b/Assets/Female3DCG/Panties/PilotPanties_XLarge_Layer2.png deleted file mode 100644 index c5a613dbe..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PilotPanties_XLarge_Layer3.png b/Assets/Female3DCG/Panties/PilotPanties_XLarge_Layer3.png deleted file mode 100644 index cec6a13d2..000000000 Binary files a/Assets/Female3DCG/Panties/PilotPanties_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Back.png b/Assets/Female3DCG/Panties/PoofyDiaper_Back.png deleted file mode 100644 index 7adf49cad..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Large_Base.png b/Assets/Female3DCG/Panties/PoofyDiaper_Large_Base.png deleted file mode 100644 index f8bb341e5..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Large_CrotchPatch.png b/Assets/Female3DCG/Panties/PoofyDiaper_Large_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Large_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Large_Frills.png b/Assets/Female3DCG/Panties/PoofyDiaper_Large_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Large_PoofyBase.png b/Assets/Female3DCG/Panties/PoofyDiaper_Large_PoofyBase.png deleted file mode 100644 index 7f60e3cf1..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Large_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Normal_Base.png b/Assets/Female3DCG/Panties/PoofyDiaper_Normal_Base.png deleted file mode 100644 index dc3d5166e..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Normal_CrotchPatch.png b/Assets/Female3DCG/Panties/PoofyDiaper_Normal_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Normal_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Normal_Frills.png b/Assets/Female3DCG/Panties/PoofyDiaper_Normal_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Normal_PoofyBase.png b/Assets/Female3DCG/Panties/PoofyDiaper_Normal_PoofyBase.png deleted file mode 100644 index 43eacf0b8..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Normal_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Small_Base.png b/Assets/Female3DCG/Panties/PoofyDiaper_Small_Base.png deleted file mode 100644 index 5de80b6c9..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Small_CrotchPatch.png b/Assets/Female3DCG/Panties/PoofyDiaper_Small_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Small_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Small_Frills.png b/Assets/Female3DCG/Panties/PoofyDiaper_Small_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Small_PoofyBase.png b/Assets/Female3DCG/Panties/PoofyDiaper_Small_PoofyBase.png deleted file mode 100644 index 6e2bf692e..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Small_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_Tape.png b/Assets/Female3DCG/Panties/PoofyDiaper_Tape.png deleted file mode 100644 index 1f5ff808a..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_Base.png b/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_Base.png deleted file mode 100644 index 552f9009f..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_CrotchPatch.png b/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_Frills.png b/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_PoofyBase.png b/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_PoofyBase.png deleted file mode 100644 index 3d3dcb573..000000000 Binary files a/Assets/Female3DCG/Panties/PoofyDiaper_XLarge_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Bikini1.png b/Assets/Female3DCG/Panties/Preview/Bikini1.png deleted file mode 100644 index fc0a76f4d..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Bikini1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/BulkyDiaper.png b/Assets/Female3DCG/Panties/Preview/BulkyDiaper.png deleted file mode 100644 index d68c78d51..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/BulkyDiaper.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/ChinesePanties1.png b/Assets/Female3DCG/Panties/Preview/ChinesePanties1.png deleted file mode 100644 index 39825050b..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/ChinesePanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/CowPrintedPanties.png b/Assets/Female3DCG/Panties/Preview/CowPrintedPanties.png deleted file mode 100644 index ec6ffde02..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/CowPrintedPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/CrotchPanties1.png b/Assets/Female3DCG/Panties/Preview/CrotchPanties1.png deleted file mode 100644 index 7166283c8..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/CrotchPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Diapers1.png b/Assets/Female3DCG/Panties/Preview/Diapers1.png deleted file mode 100644 index 9562aa442..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Diapers1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Diapers2.png b/Assets/Female3DCG/Panties/Preview/Diapers2.png deleted file mode 100644 index 0971d89aa..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Diapers2.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Diapers3.png b/Assets/Female3DCG/Panties/Preview/Diapers3.png deleted file mode 100644 index c793044ab..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Diapers3.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Diapers4.png b/Assets/Female3DCG/Panties/Preview/Diapers4.png deleted file mode 100644 index 71c31bcc5..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Diapers4.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/FloralPanties2.png b/Assets/Female3DCG/Panties/Preview/FloralPanties2.png deleted file mode 100644 index cbbc04ad8..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/FloralPanties2.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/FlowerPanties.png b/Assets/Female3DCG/Panties/Preview/FlowerPanties.png deleted file mode 100644 index c0bf6206e..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/FlowerPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/KittyPanties1.png b/Assets/Female3DCG/Panties/Preview/KittyPanties1.png deleted file mode 100644 index 76eb8af5f..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/KittyPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/LatexCrotchlessPanties.png b/Assets/Female3DCG/Panties/Preview/LatexCrotchlessPanties.png deleted file mode 100644 index 0b268d74b..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/LatexCrotchlessPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/LatexPanties1.png b/Assets/Female3DCG/Panties/Preview/LatexPanties1.png deleted file mode 100644 index 008c42512..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/LatexPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/LatexPanties2.png b/Assets/Female3DCG/Panties/Preview/LatexPanties2.png deleted file mode 100644 index f6b544880..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/LatexPanties2.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/LeatherStrapPanties1.png b/Assets/Female3DCG/Panties/Preview/LeatherStrapPanties1.png deleted file mode 100644 index 9fa71545e..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/LeatherStrapPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/MaidPanties1.png b/Assets/Female3DCG/Panties/Preview/MaidPanties1.png deleted file mode 100644 index de60a8322..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/MaidPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/MaidPanties2.png b/Assets/Female3DCG/Panties/Preview/MaidPanties2.png deleted file mode 100644 index 953c31b8b..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/MaidPanties2.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/MicroThong.png b/Assets/Female3DCG/Panties/Preview/MicroThong.png deleted file mode 100644 index c01a4efb9..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/MicroThong.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Panties1.png b/Assets/Female3DCG/Panties/Preview/Panties1.png deleted file mode 100644 index f18c920b4..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Panties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Panties11.png b/Assets/Female3DCG/Panties/Preview/Panties11.png deleted file mode 100644 index adc2a63ec..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Panties11.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Panties12.png b/Assets/Female3DCG/Panties/Preview/Panties12.png deleted file mode 100644 index cf695ae2c..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Panties12.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Panties13.png b/Assets/Female3DCG/Panties/Preview/Panties13.png deleted file mode 100644 index 39c1c74d0..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Panties13.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Panties14.png b/Assets/Female3DCG/Panties/Preview/Panties14.png deleted file mode 100644 index 08d88f166..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Panties14.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Panties15.png b/Assets/Female3DCG/Panties/Preview/Panties15.png deleted file mode 100644 index 0b091bca9..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Panties15.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Panties16.png b/Assets/Female3DCG/Panties/Preview/Panties16.png deleted file mode 100644 index 457e27d0b..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Panties16.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Panties7.png b/Assets/Female3DCG/Panties/Preview/Panties7.png deleted file mode 100644 index aae37bc3b..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Panties7.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Panties8.png b/Assets/Female3DCG/Panties/Preview/Panties8.png deleted file mode 100644 index 10df57edb..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Panties8.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/PearlPanties1.png b/Assets/Female3DCG/Panties/Preview/PearlPanties1.png deleted file mode 100644 index 65118d719..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/PearlPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/PilotPanties.png b/Assets/Female3DCG/Panties/Preview/PilotPanties.png deleted file mode 100644 index 1ae35ae0d..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/PilotPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/PoofyDiaper.png b/Assets/Female3DCG/Panties/Preview/PoofyDiaper.png deleted file mode 100644 index 34c124a34..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/PoofyDiaper.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/RedBowPanties.png b/Assets/Female3DCG/Panties/Preview/RedBowPanties.png deleted file mode 100644 index e9b40d3e6..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/RedBowPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/SexyBeachPanties1.png b/Assets/Female3DCG/Panties/Preview/SexyBeachPanties1.png deleted file mode 100644 index b2756b2b5..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/SexyBeachPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/SilkStraps.png b/Assets/Female3DCG/Panties/Preview/SilkStraps.png deleted file mode 100644 index 1502f19b5..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/SilkStraps.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/StringPanties1.png b/Assets/Female3DCG/Panties/Preview/StringPanties1.png deleted file mode 100644 index da06fc056..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/StringPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/StringPasty1.png b/Assets/Female3DCG/Panties/Preview/StringPasty1.png deleted file mode 100644 index dae6a154c..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/StringPasty1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/StringThong.png b/Assets/Female3DCG/Panties/Preview/StringThong.png deleted file mode 100644 index 3c91162b3..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/StringThong.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/SunstripePanties1.png b/Assets/Female3DCG/Panties/Preview/SunstripePanties1.png deleted file mode 100644 index dedabbfde..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/SunstripePanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/Thong.png b/Assets/Female3DCG/Panties/Preview/Thong.png deleted file mode 100644 index 21ae9df43..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/Thong.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/WrapPanties1.png b/Assets/Female3DCG/Panties/Preview/WrapPanties1.png deleted file mode 100644 index e770f0570..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/WrapPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Preview/ZipPanties1.png b/Assets/Female3DCG/Panties/Preview/ZipPanties1.png deleted file mode 100644 index 0594b7eb2..000000000 Binary files a/Assets/Female3DCG/Panties/Preview/ZipPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/RedBowPanties_Bow.png b/Assets/Female3DCG/Panties/RedBowPanties_Bow.png deleted file mode 100644 index 59b87f074..000000000 Binary files a/Assets/Female3DCG/Panties/RedBowPanties_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/RedBowPanties_Large_Bow.png b/Assets/Female3DCG/Panties/RedBowPanties_Large_Bow.png deleted file mode 100644 index c43a216d0..000000000 Binary files a/Assets/Female3DCG/Panties/RedBowPanties_Large_Bow.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/RedBowPanties_Large_Panties.png b/Assets/Female3DCG/Panties/RedBowPanties_Large_Panties.png deleted file mode 100644 index 7e803fbb5..000000000 Binary files a/Assets/Female3DCG/Panties/RedBowPanties_Large_Panties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/RedBowPanties_Panties.png b/Assets/Female3DCG/Panties/RedBowPanties_Panties.png deleted file mode 100644 index 45be39bee..000000000 Binary files a/Assets/Female3DCG/Panties/RedBowPanties_Panties.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SexyBeachPanties1_Large.png b/Assets/Female3DCG/Panties/SexyBeachPanties1_Large.png deleted file mode 100644 index a62f4a257..000000000 Binary files a/Assets/Female3DCG/Panties/SexyBeachPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SexyBeachPanties1_Normal.png b/Assets/Female3DCG/Panties/SexyBeachPanties1_Normal.png deleted file mode 100644 index 780f25b5e..000000000 Binary files a/Assets/Female3DCG/Panties/SexyBeachPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SexyBeachPanties1_Small.png b/Assets/Female3DCG/Panties/SexyBeachPanties1_Small.png deleted file mode 100644 index 8a6c5ab7a..000000000 Binary files a/Assets/Female3DCG/Panties/SexyBeachPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SexyBeachPanties1_XLarge.png b/Assets/Female3DCG/Panties/SexyBeachPanties1_XLarge.png deleted file mode 100644 index d75eabd93..000000000 Binary files a/Assets/Female3DCG/Panties/SexyBeachPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_Large.png b/Assets/Female3DCG/Panties/SilkStraps_Large.png deleted file mode 100644 index 2efb2d6f0..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_LargePanties1.png b/Assets/Female3DCG/Panties/SilkStraps_LargePanties1.png deleted file mode 100644 index d15e313a8..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_LargePanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_LargeThong.png b/Assets/Female3DCG/Panties/SilkStraps_LargeThong.png deleted file mode 100644 index 346111641..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_LargeThong.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_LargeWrap.png b/Assets/Female3DCG/Panties/SilkStraps_LargeWrap.png deleted file mode 100644 index a424c50fb..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_LargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_Normal.png b/Assets/Female3DCG/Panties/SilkStraps_Normal.png deleted file mode 100644 index 4a7480f92..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_NormalPanties1.png b/Assets/Female3DCG/Panties/SilkStraps_NormalPanties1.png deleted file mode 100644 index 3c5fabc5a..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_NormalPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_NormalThong.png b/Assets/Female3DCG/Panties/SilkStraps_NormalThong.png deleted file mode 100644 index 6b812179b..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_NormalThong.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_NormalWrap.png b/Assets/Female3DCG/Panties/SilkStraps_NormalWrap.png deleted file mode 100644 index 236c48614..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_NormalWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_Small.png b/Assets/Female3DCG/Panties/SilkStraps_Small.png deleted file mode 100644 index eab5e553c..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_SmallPanties1.png b/Assets/Female3DCG/Panties/SilkStraps_SmallPanties1.png deleted file mode 100644 index 86056615f..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_SmallPanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_SmallThong.png b/Assets/Female3DCG/Panties/SilkStraps_SmallThong.png deleted file mode 100644 index e68684e4c..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_SmallThong.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_SmallWrap.png b/Assets/Female3DCG/Panties/SilkStraps_SmallWrap.png deleted file mode 100644 index 32969646f..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_SmallWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_XLarge.png b/Assets/Female3DCG/Panties/SilkStraps_XLarge.png deleted file mode 100644 index a0eb589af..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_XLargePanties1.png b/Assets/Female3DCG/Panties/SilkStraps_XLargePanties1.png deleted file mode 100644 index 010fcc636..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_XLargePanties1.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_XLargeThong.png b/Assets/Female3DCG/Panties/SilkStraps_XLargeThong.png deleted file mode 100644 index c2912c8dd..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_XLargeThong.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SilkStraps_XLargeWrap.png b/Assets/Female3DCG/Panties/SilkStraps_XLargeWrap.png deleted file mode 100644 index cb94cd204..000000000 Binary files a/Assets/Female3DCG/Panties/SilkStraps_XLargeWrap.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Back.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Back.png deleted file mode 100644 index 38ab8591c..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Large_Base.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Large_Base.png deleted file mode 100644 index 5b5162a59..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Large_CrotchPiece.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Large_CrotchPiece.png deleted file mode 100644 index b555182ac..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Large_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Large_WaistBand.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Large_WaistBand.png deleted file mode 100644 index 94dc18de6..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Large_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Normal_Base.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Normal_Base.png deleted file mode 100644 index 0754bf63d..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Normal_CrotchPiece.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Normal_CrotchPiece.png deleted file mode 100644 index 253e619f2..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Normal_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Normal_WaistBand.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Normal_WaistBand.png deleted file mode 100644 index 94c60b1a6..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Normal_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Small_Base.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Small_Base.png deleted file mode 100644 index 65aeff525..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Small_CrotchPiece.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Small_CrotchPiece.png deleted file mode 100644 index 902341382..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Small_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Small_WaistBand.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Small_WaistBand.png deleted file mode 100644 index 5c04ad09c..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Small_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Tape.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Tape.png deleted file mode 100644 index 091b02942..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_XLarge_Base.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_XLarge_Base.png deleted file mode 100644 index 8b0b5d455..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_XLarge_CrotchPiece.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_XLarge_CrotchPiece.png deleted file mode 100644 index 237605887..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_XLarge_CrotchPiece.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_XLarge_WaistBand.png b/Assets/Female3DCG/Panties/Spread/BulkyDiaper_XLarge_WaistBand.png deleted file mode 100644 index 3254e7c29..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/BulkyDiaper_XLarge_WaistBand.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Back.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Back.png deleted file mode 100644 index 7adf49cad..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Back.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_Base.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_Base.png deleted file mode 100644 index e624dd83e..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_CrotchPatch.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_Frills.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_PoofyBase.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_PoofyBase.png deleted file mode 100644 index 065857443..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Large_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_Base.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_Base.png deleted file mode 100644 index a8644569c..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_CrotchPatch.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_Frills.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_PoofyBase.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_PoofyBase.png deleted file mode 100644 index e4eb3045b..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Normal_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_Base.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_Base.png deleted file mode 100644 index 444dcda2d..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_CrotchPatch.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_CrotchPatch.png deleted file mode 100644 index 0c7ad755d..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_Frills.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_Frills.png deleted file mode 100644 index 49d870929..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_PoofyBase.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_PoofyBase.png deleted file mode 100644 index 7fce50599..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Small_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Tape.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Tape.png deleted file mode 100644 index 1f5ff808a..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_Tape.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_Base.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_Base.png deleted file mode 100644 index 2a43fb6bc..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_CrotchPatch.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_CrotchPatch.png deleted file mode 100644 index f5798f755..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_CrotchPatch.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_Frills.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_Frills.png deleted file mode 100644 index ac1aee3ed..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_Frills.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_PoofyBase.png b/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_PoofyBase.png deleted file mode 100644 index 2c83abd9a..000000000 Binary files a/Assets/Female3DCG/Panties/Spread/PoofyDiaper_XLarge_PoofyBase.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringPanties1_Large.png b/Assets/Female3DCG/Panties/StringPanties1_Large.png deleted file mode 100644 index 077907179..000000000 Binary files a/Assets/Female3DCG/Panties/StringPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringPanties1_Normal.png b/Assets/Female3DCG/Panties/StringPanties1_Normal.png deleted file mode 100644 index b51f73048..000000000 Binary files a/Assets/Female3DCG/Panties/StringPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringPanties1_Small.png b/Assets/Female3DCG/Panties/StringPanties1_Small.png deleted file mode 100644 index 2785fdad2..000000000 Binary files a/Assets/Female3DCG/Panties/StringPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringPanties1_XLarge.png b/Assets/Female3DCG/Panties/StringPanties1_XLarge.png deleted file mode 100644 index 57f039efe..000000000 Binary files a/Assets/Female3DCG/Panties/StringPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringPasty1_Large.png b/Assets/Female3DCG/Panties/StringPasty1_Large.png deleted file mode 100644 index 5292d0e89..000000000 Binary files a/Assets/Female3DCG/Panties/StringPasty1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringPasty1_Normal.png b/Assets/Female3DCG/Panties/StringPasty1_Normal.png deleted file mode 100644 index 5292d0e89..000000000 Binary files a/Assets/Female3DCG/Panties/StringPasty1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringPasty1_Small.png b/Assets/Female3DCG/Panties/StringPasty1_Small.png deleted file mode 100644 index 5292d0e89..000000000 Binary files a/Assets/Female3DCG/Panties/StringPasty1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringPasty1_XLarge.png b/Assets/Female3DCG/Panties/StringPasty1_XLarge.png deleted file mode 100644 index 5292d0e89..000000000 Binary files a/Assets/Female3DCG/Panties/StringPasty1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringThong_Large.png b/Assets/Female3DCG/Panties/StringThong_Large.png deleted file mode 100644 index 8e2ce42e4..000000000 Binary files a/Assets/Female3DCG/Panties/StringThong_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringThong_Normal.png b/Assets/Female3DCG/Panties/StringThong_Normal.png deleted file mode 100644 index dab803fc8..000000000 Binary files a/Assets/Female3DCG/Panties/StringThong_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringThong_Small.png b/Assets/Female3DCG/Panties/StringThong_Small.png deleted file mode 100644 index fc177e18c..000000000 Binary files a/Assets/Female3DCG/Panties/StringThong_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/StringThong_XLarge.png b/Assets/Female3DCG/Panties/StringThong_XLarge.png deleted file mode 100644 index 965d7cee2..000000000 Binary files a/Assets/Female3DCG/Panties/StringThong_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SunstripePanties1_Large.png b/Assets/Female3DCG/Panties/SunstripePanties1_Large.png deleted file mode 100644 index c1440ae7c..000000000 Binary files a/Assets/Female3DCG/Panties/SunstripePanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SunstripePanties1_Normal.png b/Assets/Female3DCG/Panties/SunstripePanties1_Normal.png deleted file mode 100644 index a08669280..000000000 Binary files a/Assets/Female3DCG/Panties/SunstripePanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SunstripePanties1_Small.png b/Assets/Female3DCG/Panties/SunstripePanties1_Small.png deleted file mode 100644 index 396fb0b4a..000000000 Binary files a/Assets/Female3DCG/Panties/SunstripePanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/SunstripePanties1_XLarge.png b/Assets/Female3DCG/Panties/SunstripePanties1_XLarge.png deleted file mode 100644 index a016860fb..000000000 Binary files a/Assets/Female3DCG/Panties/SunstripePanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Thong_Large.png b/Assets/Female3DCG/Panties/Thong_Large.png deleted file mode 100644 index 0e72d2cc8..000000000 Binary files a/Assets/Female3DCG/Panties/Thong_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Thong_Normal.png b/Assets/Female3DCG/Panties/Thong_Normal.png deleted file mode 100644 index cbbb169e1..000000000 Binary files a/Assets/Female3DCG/Panties/Thong_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Thong_Small.png b/Assets/Female3DCG/Panties/Thong_Small.png deleted file mode 100644 index 4dff565b6..000000000 Binary files a/Assets/Female3DCG/Panties/Thong_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/Thong_XLarge.png b/Assets/Female3DCG/Panties/Thong_XLarge.png deleted file mode 100644 index 062532149..000000000 Binary files a/Assets/Female3DCG/Panties/Thong_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/WrapPanties1_Large.png b/Assets/Female3DCG/Panties/WrapPanties1_Large.png deleted file mode 100644 index becde1338..000000000 Binary files a/Assets/Female3DCG/Panties/WrapPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/WrapPanties1_Normal.png b/Assets/Female3DCG/Panties/WrapPanties1_Normal.png deleted file mode 100644 index 33cc69d16..000000000 Binary files a/Assets/Female3DCG/Panties/WrapPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/WrapPanties1_Small.png b/Assets/Female3DCG/Panties/WrapPanties1_Small.png deleted file mode 100644 index 20706ce2f..000000000 Binary files a/Assets/Female3DCG/Panties/WrapPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/WrapPanties1_XLarge.png b/Assets/Female3DCG/Panties/WrapPanties1_XLarge.png deleted file mode 100644 index 2572e21ac..000000000 Binary files a/Assets/Female3DCG/Panties/WrapPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/ZipPanties1_Large.png b/Assets/Female3DCG/Panties/ZipPanties1_Large.png deleted file mode 100644 index a615849a7..000000000 Binary files a/Assets/Female3DCG/Panties/ZipPanties1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/ZipPanties1_Normal.png b/Assets/Female3DCG/Panties/ZipPanties1_Normal.png deleted file mode 100644 index 2bd4ad283..000000000 Binary files a/Assets/Female3DCG/Panties/ZipPanties1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/ZipPanties1_Small.png b/Assets/Female3DCG/Panties/ZipPanties1_Small.png deleted file mode 100644 index b23df3e5c..000000000 Binary files a/Assets/Female3DCG/Panties/ZipPanties1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Panties/ZipPanties1_XLarge.png b/Assets/Female3DCG/Panties/ZipPanties1_XLarge.png deleted file mode 100644 index e167a30eb..000000000 Binary files a/Assets/Female3DCG/Panties/ZipPanties1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Pussy/PussyDark1.png b/Assets/Female3DCG/Pussy/PussyDark1.png deleted file mode 100644 index 6bf113f93..000000000 Binary files a/Assets/Female3DCG/Pussy/PussyDark1.png and /dev/null differ diff --git a/Assets/Female3DCG/Pussy/PussyDark2.png b/Assets/Female3DCG/Pussy/PussyDark2.png deleted file mode 100644 index 38bf1fe94..000000000 Binary files a/Assets/Female3DCG/Pussy/PussyDark2.png and /dev/null differ diff --git a/Assets/Female3DCG/Pussy/PussyDark3.png b/Assets/Female3DCG/Pussy/PussyDark3.png deleted file mode 100644 index 5047abd4c..000000000 Binary files a/Assets/Female3DCG/Pussy/PussyDark3.png and /dev/null differ diff --git a/Assets/Female3DCG/Pussy/PussyLight1.png b/Assets/Female3DCG/Pussy/PussyLight1.png deleted file mode 100644 index 76d9cd185..000000000 Binary files a/Assets/Female3DCG/Pussy/PussyLight1.png and /dev/null differ diff --git a/Assets/Female3DCG/Pussy/PussyLight2.png b/Assets/Female3DCG/Pussy/PussyLight2.png deleted file mode 100644 index 64b9a8510..000000000 Binary files a/Assets/Female3DCG/Pussy/PussyLight2.png and /dev/null differ diff --git a/Assets/Female3DCG/Pussy/PussyLight3.png b/Assets/Female3DCG/Pussy/PussyLight3.png deleted file mode 100644 index f4a468f74..000000000 Binary files a/Assets/Female3DCG/Pussy/PussyLight3.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/BandAnklet_Large.png b/Assets/Female3DCG/RightAnklet/BandAnklet_Large.png deleted file mode 100644 index dcfdd4a9b..000000000 Binary files a/Assets/Female3DCG/RightAnklet/BandAnklet_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/BandAnklet_Normal.png b/Assets/Female3DCG/RightAnklet/BandAnklet_Normal.png deleted file mode 100644 index da8a9cb5b..000000000 Binary files a/Assets/Female3DCG/RightAnklet/BandAnklet_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/BandAnklet_Small.png b/Assets/Female3DCG/RightAnklet/BandAnklet_Small.png deleted file mode 100644 index d6798c672..000000000 Binary files a/Assets/Female3DCG/RightAnklet/BandAnklet_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/BandAnklet_XLarge.png b/Assets/Female3DCG/RightAnklet/BandAnklet_XLarge.png deleted file mode 100644 index f6135160d..000000000 Binary files a/Assets/Female3DCG/RightAnklet/BandAnklet_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_Large.png b/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_Large.png deleted file mode 100644 index 7ba6aa27e..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_Normal.png b/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_Normal.png deleted file mode 100644 index cb0ae9e9e..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_Small.png b/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_Small.png deleted file mode 100644 index b77e1c000..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_XLarge.png b/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_XLarge.png deleted file mode 100644 index e7d3264a6..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/BandAnklet_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_Large.png b/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_Large.png deleted file mode 100644 index 8958ab09d..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_Normal.png b/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_Normal.png deleted file mode 100644 index 41d796ac0..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_Small.png b/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_Small.png deleted file mode 100644 index 8f5bc90e7..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_XLarge.png b/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_XLarge.png deleted file mode 100644 index 2b81bda5f..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_Large.png b/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_Large.png deleted file mode 100644 index d5f32f0bc..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_Normal.png b/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_Normal.png deleted file mode 100644 index 78ee0734c..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_Small.png b/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_Small.png deleted file mode 100644 index bf7bb0204..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_XLarge.png b/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_XLarge.png deleted file mode 100644 index 8c6af992e..000000000 Binary files a/Assets/Female3DCG/RightAnklet/LegsClosed/Ribbon_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Preview/BandAnklet.png b/Assets/Female3DCG/RightAnklet/Preview/BandAnklet.png deleted file mode 100644 index fc4cacf12..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Preview/BandAnklet.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Preview/Ribbon.png b/Assets/Female3DCG/RightAnklet/Preview/Ribbon.png deleted file mode 100644 index 7d3f73b67..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Preview/Ribbon.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Preview/Ribbon1.png b/Assets/Female3DCG/RightAnklet/Preview/Ribbon1.png deleted file mode 100644 index 0ff26e19c..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Preview/Ribbon1.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Ribbon1_Large.png b/Assets/Female3DCG/RightAnklet/Ribbon1_Large.png deleted file mode 100644 index 90b4f1816..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Ribbon1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Ribbon1_Normal.png b/Assets/Female3DCG/RightAnklet/Ribbon1_Normal.png deleted file mode 100644 index 8908abab7..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Ribbon1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Ribbon1_Small.png b/Assets/Female3DCG/RightAnklet/Ribbon1_Small.png deleted file mode 100644 index 0d5f709e8..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Ribbon1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Ribbon1_XLarge.png b/Assets/Female3DCG/RightAnklet/Ribbon1_XLarge.png deleted file mode 100644 index bf5188551..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Ribbon1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Ribbon_Large.png b/Assets/Female3DCG/RightAnklet/Ribbon_Large.png deleted file mode 100644 index a10fa9296..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Ribbon_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Ribbon_Normal.png b/Assets/Female3DCG/RightAnklet/Ribbon_Normal.png deleted file mode 100644 index 15dc1d46c..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Ribbon_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Ribbon_Small.png b/Assets/Female3DCG/RightAnklet/Ribbon_Small.png deleted file mode 100644 index 6fb8163bd..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Ribbon_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Ribbon_XLarge.png b/Assets/Female3DCG/RightAnklet/Ribbon_XLarge.png deleted file mode 100644 index 857666cdf..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Ribbon_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_Large.png b/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_Large.png deleted file mode 100644 index 6f899f495..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_Normal.png b/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_Normal.png deleted file mode 100644 index b1348eacf..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_Small.png b/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_Small.png deleted file mode 100644 index b065fa634..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_XLarge.png b/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_XLarge.png deleted file mode 100644 index 8ffc9ff36..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/BandAnklet_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_Large.png b/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_Large.png deleted file mode 100644 index 279ec1bee..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_Normal.png b/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_Normal.png deleted file mode 100644 index b847201c1..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_Small.png b/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_Small.png deleted file mode 100644 index f9b31dd59..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_XLarge.png b/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_XLarge.png deleted file mode 100644 index e30833cf9..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/Ribbon1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/Ribbon_Large.png b/Assets/Female3DCG/RightAnklet/Spread/Ribbon_Large.png deleted file mode 100644 index 5aa18dab4..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/Ribbon_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/Ribbon_Normal.png b/Assets/Female3DCG/RightAnklet/Spread/Ribbon_Normal.png deleted file mode 100644 index d768b8112..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/Ribbon_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/Ribbon_Small.png b/Assets/Female3DCG/RightAnklet/Spread/Ribbon_Small.png deleted file mode 100644 index f9df92197..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/Ribbon_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/RightAnklet/Spread/Ribbon_XLarge.png b/Assets/Female3DCG/RightAnklet/Spread/Ribbon_XLarge.png deleted file mode 100644 index 12e7f0db8..000000000 Binary files a/Assets/Female3DCG/RightAnklet/Spread/Ribbon_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/AnkleStrapShoes_Large.png b/Assets/Female3DCG/Shoes/AnkleStrapShoes_Large.png deleted file mode 100644 index b45185954..000000000 Binary files a/Assets/Female3DCG/Shoes/AnkleStrapShoes_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/AnkleStrapShoes_Normal.png b/Assets/Female3DCG/Shoes/AnkleStrapShoes_Normal.png deleted file mode 100644 index 1c656f14f..000000000 Binary files a/Assets/Female3DCG/Shoes/AnkleStrapShoes_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/AnkleStrapShoes_Small.png b/Assets/Female3DCG/Shoes/AnkleStrapShoes_Small.png deleted file mode 100644 index 3d7b0f913..000000000 Binary files a/Assets/Female3DCG/Shoes/AnkleStrapShoes_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/AnkleStrapShoes_XLarge.png b/Assets/Female3DCG/Shoes/AnkleStrapShoes_XLarge.png deleted file mode 100644 index 23c708f49..000000000 Binary files a/Assets/Female3DCG/Shoes/AnkleStrapShoes_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/BarefootSandals1_Large.png b/Assets/Female3DCG/Shoes/BarefootSandals1_Large.png deleted file mode 100644 index 4d5c74995..000000000 Binary files a/Assets/Female3DCG/Shoes/BarefootSandals1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/BarefootSandals1_Normal.png b/Assets/Female3DCG/Shoes/BarefootSandals1_Normal.png deleted file mode 100644 index bd8a11524..000000000 Binary files a/Assets/Female3DCG/Shoes/BarefootSandals1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/BarefootSandals1_Small.png b/Assets/Female3DCG/Shoes/BarefootSandals1_Small.png deleted file mode 100644 index 3946ccf78..000000000 Binary files a/Assets/Female3DCG/Shoes/BarefootSandals1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/BarefootSandals1_XLarge.png b/Assets/Female3DCG/Shoes/BarefootSandals1_XLarge.png deleted file mode 100644 index fba2c29c6..000000000 Binary files a/Assets/Female3DCG/Shoes/BarefootSandals1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_Large_Laces.png b/Assets/Female3DCG/Shoes/Boots1_Large_Laces.png deleted file mode 100644 index f843a7e37..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_Large_Shoes.png b/Assets/Female3DCG/Shoes/Boots1_Large_Shoes.png deleted file mode 100644 index 3749e6139..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_Large_Sides.png b/Assets/Female3DCG/Shoes/Boots1_Large_Sides.png deleted file mode 100644 index f00cb57a0..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_Large_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_Normal_Laces.png b/Assets/Female3DCG/Shoes/Boots1_Normal_Laces.png deleted file mode 100644 index e10ca34b8..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_Normal_Shoes.png b/Assets/Female3DCG/Shoes/Boots1_Normal_Shoes.png deleted file mode 100644 index 4c3d18502..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_Normal_Sides.png b/Assets/Female3DCG/Shoes/Boots1_Normal_Sides.png deleted file mode 100644 index 59c9dcf4c..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_Normal_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_Small_Laces.png b/Assets/Female3DCG/Shoes/Boots1_Small_Laces.png deleted file mode 100644 index e10ca34b8..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_Small_Shoes.png b/Assets/Female3DCG/Shoes/Boots1_Small_Shoes.png deleted file mode 100644 index 4c3d18502..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_Small_Sides.png b/Assets/Female3DCG/Shoes/Boots1_Small_Sides.png deleted file mode 100644 index 59c9dcf4c..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_Small_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_XLarge_Laces.png b/Assets/Female3DCG/Shoes/Boots1_XLarge_Laces.png deleted file mode 100644 index f843a7e37..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/Boots1_XLarge_Shoes.png deleted file mode 100644 index 3749e6139..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Boots1_XLarge_Sides.png b/Assets/Female3DCG/Shoes/Boots1_XLarge_Sides.png deleted file mode 100644 index f00cb57a0..000000000 Binary files a/Assets/Female3DCG/Shoes/Boots1_XLarge_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Boots.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Boots.png deleted file mode 100644 index 738d11948..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Buckles.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Buckles.png deleted file mode 100644 index 5bde7f9dc..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Heels.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Heels.png deleted file mode 100644 index 32a081294..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Laces.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Laces.png deleted file mode 100644 index 5b76e71bf..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Straps.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Straps.png deleted file mode 100644 index f3bca906e..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Boots.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Boots.png deleted file mode 100644 index 4a333067e..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Buckles.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Buckles.png deleted file mode 100644 index fef9a3cea..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Heels.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Heels.png deleted file mode 100644 index 1eaf7c9c4..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Laces.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Laces.png deleted file mode 100644 index 512934fe8..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Laces2.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Laces2.png deleted file mode 100644 index 496b6fc39..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Laces2.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Straps.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Straps.png deleted file mode 100644 index ef2dd7bf6..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Boots.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Boots.png deleted file mode 100644 index c951cfcf7..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Buckles.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Buckles.png deleted file mode 100644 index f9349350a..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Heels.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Heels.png deleted file mode 100644 index e10c43f23..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Laces.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Laces.png deleted file mode 100644 index 73959b661..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Straps.png b/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Straps.png deleted file mode 100644 index 8dfb3875f..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Boots.png b/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Boots.png deleted file mode 100644 index d43e04e24..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Buckles.png b/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Buckles.png deleted file mode 100644 index ce09185b0..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Heels.png b/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Heels.png deleted file mode 100644 index 6fc7045ef..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Laces.png b/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Laces.png deleted file mode 100644 index 0cae7698e..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Straps.png b/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Straps.png deleted file mode 100644 index dba6f2b76..000000000 Binary files a/Assets/Female3DCG/Shoes/DeluxeBoots_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_Large.png b/Assets/Female3DCG/Shoes/Flippers_Large.png deleted file mode 100644 index 8a5fff516..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_Large_Fins.png b/Assets/Female3DCG/Shoes/Flippers_Large_Fins.png deleted file mode 100644 index 8a5fff516..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_Large_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_Large_Shoes.png b/Assets/Female3DCG/Shoes/Flippers_Large_Shoes.png deleted file mode 100644 index f15bb3820..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_Normal.png b/Assets/Female3DCG/Shoes/Flippers_Normal.png deleted file mode 100644 index 8a5fff516..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_Normal_Fins.png b/Assets/Female3DCG/Shoes/Flippers_Normal_Fins.png deleted file mode 100644 index 8a5fff516..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_Normal_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_Normal_Shoes.png b/Assets/Female3DCG/Shoes/Flippers_Normal_Shoes.png deleted file mode 100644 index f15bb3820..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_Small.png b/Assets/Female3DCG/Shoes/Flippers_Small.png deleted file mode 100644 index 8a5fff516..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_Small_Fins.png b/Assets/Female3DCG/Shoes/Flippers_Small_Fins.png deleted file mode 100644 index 8a5fff516..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_Small_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_Small_Shoes.png b/Assets/Female3DCG/Shoes/Flippers_Small_Shoes.png deleted file mode 100644 index f15bb3820..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_XLarge.png b/Assets/Female3DCG/Shoes/Flippers_XLarge.png deleted file mode 100644 index 8a5fff516..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_XLarge_Fins.png b/Assets/Female3DCG/Shoes/Flippers_XLarge_Fins.png deleted file mode 100644 index 8a5fff516..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_XLarge_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Flippers_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/Flippers_XLarge_Shoes.png deleted file mode 100644 index f15bb3820..000000000 Binary files a/Assets/Female3DCG/Shoes/Flippers_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/FuzzyBoots_Heels.png b/Assets/Female3DCG/Shoes/FuzzyBoots_Heels.png deleted file mode 100644 index 13a58e714..000000000 Binary files a/Assets/Female3DCG/Shoes/FuzzyBoots_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/FuzzyBoots_Large_Boots.png b/Assets/Female3DCG/Shoes/FuzzyBoots_Large_Boots.png deleted file mode 100644 index 65a2bf99c..000000000 Binary files a/Assets/Female3DCG/Shoes/FuzzyBoots_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/FuzzyBoots_Large_Fur.png b/Assets/Female3DCG/Shoes/FuzzyBoots_Large_Fur.png deleted file mode 100644 index e18473285..000000000 Binary files a/Assets/Female3DCG/Shoes/FuzzyBoots_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/FuzzyBoots_Normal_Boots.png b/Assets/Female3DCG/Shoes/FuzzyBoots_Normal_Boots.png deleted file mode 100644 index 73b8d2796..000000000 Binary files a/Assets/Female3DCG/Shoes/FuzzyBoots_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/FuzzyBoots_Normal_Fur.png b/Assets/Female3DCG/Shoes/FuzzyBoots_Normal_Fur.png deleted file mode 100644 index ce164248e..000000000 Binary files a/Assets/Female3DCG/Shoes/FuzzyBoots_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/FuzzyBoots_Small_Boots.png b/Assets/Female3DCG/Shoes/FuzzyBoots_Small_Boots.png deleted file mode 100644 index 6ddbf724b..000000000 Binary files a/Assets/Female3DCG/Shoes/FuzzyBoots_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/FuzzyBoots_Small_Fur.png b/Assets/Female3DCG/Shoes/FuzzyBoots_Small_Fur.png deleted file mode 100644 index 12f5f4596..000000000 Binary files a/Assets/Female3DCG/Shoes/FuzzyBoots_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/FuzzyBoots_XLarge_Boots.png b/Assets/Female3DCG/Shoes/FuzzyBoots_XLarge_Boots.png deleted file mode 100644 index 28524c7e1..000000000 Binary files a/Assets/Female3DCG/Shoes/FuzzyBoots_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/FuzzyBoots_XLarge_Fur.png b/Assets/Female3DCG/Shoes/FuzzyBoots_XLarge_Fur.png deleted file mode 100644 index daefc41db..000000000 Binary files a/Assets/Female3DCG/Shoes/FuzzyBoots_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels1_Large.png b/Assets/Female3DCG/Shoes/Heels1_Large.png deleted file mode 100644 index 87a7ba797..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels1_Normal.png b/Assets/Female3DCG/Shoes/Heels1_Normal.png deleted file mode 100644 index a8daff1a9..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels1_Small.png b/Assets/Female3DCG/Shoes/Heels1_Small.png deleted file mode 100644 index c35433de0..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels1_XLarge.png b/Assets/Female3DCG/Shoes/Heels1_XLarge.png deleted file mode 100644 index e579f0167..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels2_Large.png b/Assets/Female3DCG/Shoes/Heels2_Large.png deleted file mode 100644 index 53a99cd31..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels2_Normal.png b/Assets/Female3DCG/Shoes/Heels2_Normal.png deleted file mode 100644 index a95b77b9a..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels2_Small.png b/Assets/Female3DCG/Shoes/Heels2_Small.png deleted file mode 100644 index 065e18d59..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels2_XLarge.png b/Assets/Female3DCG/Shoes/Heels2_XLarge.png deleted file mode 100644 index 3ae692fcf..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels3_Large.png b/Assets/Female3DCG/Shoes/Heels3_Large.png deleted file mode 100644 index d50d21568..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels3_Normal.png b/Assets/Female3DCG/Shoes/Heels3_Normal.png deleted file mode 100644 index d50d21568..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels3_Small.png b/Assets/Female3DCG/Shoes/Heels3_Small.png deleted file mode 100644 index d50d21568..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Heels3_XLarge.png b/Assets/Female3DCG/Shoes/Heels3_XLarge.png deleted file mode 100644 index d50d21568..000000000 Binary files a/Assets/Female3DCG/Shoes/Heels3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_Large.png b/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_Large.png deleted file mode 100644 index e382a7991..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_Normal.png deleted file mode 100644 index 1ea703b83..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_Small.png b/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_Small.png deleted file mode 100644 index 1215e52ad..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_XLarge.png deleted file mode 100644 index e0fddd179..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/AnkleStrapShoes_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_Large.png b/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_Large.png deleted file mode 100644 index 21b81183e..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_Normal.png deleted file mode 100644 index 21b81183e..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_Small.png b/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_Small.png deleted file mode 100644 index 21b81183e..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_XLarge.png deleted file mode 100644 index 21b81183e..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/BarefootSandals1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Large_Laces.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_Large_Laces.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Large_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_Large_Shoes.png deleted file mode 100644 index 55fad40fc..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Large_Sides.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_Large_Sides.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Large_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Normal_Laces.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_Normal_Laces.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Normal_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_Normal_Shoes.png deleted file mode 100644 index 55fad40fc..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Normal_Sides.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_Normal_Sides.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Normal_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Small_Laces.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_Small_Laces.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Small_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_Small_Shoes.png deleted file mode 100644 index 55fad40fc..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Small_Sides.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_Small_Sides.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_Small_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_XLarge_Laces.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_XLarge_Laces.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_XLarge_Shoes.png deleted file mode 100644 index 55fad40fc..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Boots1_XLarge_Sides.png b/Assets/Female3DCG/Shoes/Hogtied/Boots1_XLarge_Sides.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Boots1_XLarge_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Boots.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Boots.png deleted file mode 100644 index 4141b71b1..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Buckles.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Buckles.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Heels.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Heels.png deleted file mode 100644 index 3b6672308..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Straps.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Straps.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Boots.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Boots.png deleted file mode 100644 index 4141b71b1..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Buckles.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Buckles.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Heels.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Heels.png deleted file mode 100644 index 3b6672308..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Straps.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Straps.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Boots.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Boots.png deleted file mode 100644 index 4141b71b1..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Buckles.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Buckles.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Heels.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Heels.png deleted file mode 100644 index 3b6672308..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Straps.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Straps.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Boots.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Boots.png deleted file mode 100644 index 4141b71b1..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Buckles.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Buckles.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Heels.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Heels.png deleted file mode 100644 index 3b6672308..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Straps.png b/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Straps.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/DeluxeBoots_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Large.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_Large.png deleted file mode 100644 index 2a412e9e2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Large_Fins.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_Large_Fins.png deleted file mode 100644 index 2a412e9e2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Large_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Large_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_Large_Shoes.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_Normal.png deleted file mode 100644 index 2a412e9e2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Normal_Fins.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_Normal_Fins.png deleted file mode 100644 index 2a412e9e2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Normal_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Normal_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_Normal_Shoes.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Small.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_Small.png deleted file mode 100644 index 2a412e9e2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Small_Fins.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_Small_Fins.png deleted file mode 100644 index 2a412e9e2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Small_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Small_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_Small_Shoes.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_XLarge.png deleted file mode 100644 index 2a412e9e2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_XLarge_Fins.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_XLarge_Fins.png deleted file mode 100644 index 2a412e9e2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_XLarge_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Flippers_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Flippers_XLarge_Shoes.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Flippers_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels1_Large.png b/Assets/Female3DCG/Shoes/Hogtied/Heels1_Large.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels1_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/Heels1_Normal.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels1_Small.png b/Assets/Female3DCG/Shoes/Hogtied/Heels1_Small.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels1_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/Heels1_XLarge.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels2_Large.png b/Assets/Female3DCG/Shoes/Hogtied/Heels2_Large.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels2_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/Heels2_Normal.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels2_Small.png b/Assets/Female3DCG/Shoes/Hogtied/Heels2_Small.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels2_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/Heels2_XLarge.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels3_Large.png b/Assets/Female3DCG/Shoes/Hogtied/Heels3_Large.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels3_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/Heels3_Normal.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels3_Small.png b/Assets/Female3DCG/Shoes/Hogtied/Heels3_Small.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Heels3_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/Heels3_XLarge.png deleted file mode 100644 index 8a1fd70f2..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Heels3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_Large.png b/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_Large.png deleted file mode 100644 index 2a95c9a4b..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_Normal.png deleted file mode 100644 index 2a95c9a4b..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_Small.png b/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_Small.png deleted file mode 100644 index 2a95c9a4b..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_XLarge.png deleted file mode 100644 index 2a95c9a4b..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/LatexAnkleShoes_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_Large.png b/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_Large.png deleted file mode 100644 index c78283f81..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_Normal.png deleted file mode 100644 index c78283f81..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_Small.png b/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_Small.png deleted file mode 100644 index c78283f81..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_XLarge.png deleted file mode 100644 index c78283f81..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/MistressBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/PawBoots_Large.png b/Assets/Female3DCG/Shoes/Hogtied/PawBoots_Large.png deleted file mode 100644 index 6090db99e..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/PawBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/PawBoots_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/PawBoots_Normal.png deleted file mode 100644 index 6090db99e..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/PawBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/PawBoots_Small.png b/Assets/Female3DCG/Shoes/Hogtied/PawBoots_Small.png deleted file mode 100644 index 6090db99e..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/PawBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/PawBoots_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/PawBoots_XLarge.png deleted file mode 100644 index 6090db99e..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/PawBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_Large.png b/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_Large.png deleted file mode 100644 index a2688765a..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_Normal.png deleted file mode 100644 index 51ffcb999..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_Small.png b/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_Small.png deleted file mode 100644 index 3148a38ea..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_XLarge.png deleted file mode 100644 index 6ba6120a7..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/PonyBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Large_Soles.png b/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Large_Soles.png deleted file mode 100644 index 662f34bfe..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Large_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Large_Top.png b/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Large_Top.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Large_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Normal_Soles.png b/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Normal_Soles.png deleted file mode 100644 index 662f34bfe..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Normal_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Normal_Top.png b/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Normal_Top.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Normal_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Small_Soles.png b/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Small_Soles.png deleted file mode 100644 index 662f34bfe..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Small_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Small_Top.png b/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Small_Top.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_Small_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_XLarge_Soles.png b/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_XLarge_Soles.png deleted file mode 100644 index 662f34bfe..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_XLarge_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_XLarge_Top.png b/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_XLarge_Top.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/SandalsRS_XLarge_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sandals_Large.png b/Assets/Female3DCG/Shoes/Hogtied/Sandals_Large.png deleted file mode 100644 index 55fad40fc..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sandals_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sandals_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/Sandals_Normal.png deleted file mode 100644 index 55fad40fc..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sandals_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sandals_Small.png b/Assets/Female3DCG/Shoes/Hogtied/Sandals_Small.png deleted file mode 100644 index 55fad40fc..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sandals_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sandals_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/Sandals_XLarge.png deleted file mode 100644 index 55fad40fc..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sandals_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes1_Large.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes1_Large.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes1_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes1_Normal.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes1_Small.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes1_Small.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes1_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes1_XLarge.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes2_Large.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes2_Large.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes2_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes2_Normal.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes2_Small.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes2_Small.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes2_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes2_XLarge.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes4_Large.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes4_Large.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes4_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes4_Normal.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes4_Small.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes4_Small.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes4_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes4_XLarge.png deleted file mode 100644 index 583559372..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes5_Large.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes5_Large.png deleted file mode 100644 index e382a7991..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes5_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes5_Normal.png deleted file mode 100644 index 1ea703b83..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes5_Small.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes5_Small.png deleted file mode 100644 index 1215e52ad..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Shoes5_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/Shoes5_XLarge.png deleted file mode 100644 index e0fddd179..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Shoes5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_Large_Main.png b/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_Large_Main.png deleted file mode 100644 index 2005f71e9..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_Large_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_Normal_Main.png b/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_Normal_Main.png deleted file mode 100644 index 2005f71e9..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_Normal_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_Small_Main.png b/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_Small_Main.png deleted file mode 100644 index 2005f71e9..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_Small_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_XLarge_Main.png b/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_XLarge_Main.png deleted file mode 100644 index 2005f71e9..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sneakers1_XLarge_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_Large_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_Large_Shoes.png deleted file mode 100644 index 2005f71e9..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_Normal_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_Normal_Shoes.png deleted file mode 100644 index 2005f71e9..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_Small_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_Small_Shoes.png deleted file mode 100644 index 2005f71e9..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_XLarge_Shoes.png deleted file mode 100644 index 2005f71e9..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/Sneakers2_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_Large.png b/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_Large.png deleted file mode 100644 index 77aa2f8bc..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_Normal.png deleted file mode 100644 index 155eb5a1a..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_Small.png b/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_Small.png deleted file mode 100644 index 5d8e43e1f..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_XLarge.png deleted file mode 100644 index 2a2a3caac..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/ThighHighLatexHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_Large.png b/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_Large.png deleted file mode 100644 index 41aa83280..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_Normal.png b/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_Normal.png deleted file mode 100644 index 41aa83280..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_Small.png b/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_Small.png deleted file mode 100644 index 41aa83280..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_XLarge.png b/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_XLarge.png deleted file mode 100644 index 41aa83280..000000000 Binary files a/Assets/Female3DCG/Shoes/Hogtied/WoollyBootsTall_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Boots.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Boots.png deleted file mode 100644 index a013b83ab..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Buckles.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Buckles.png deleted file mode 100644 index 323c0e8d5..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Heels.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Heels.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Laces.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Laces.png deleted file mode 100644 index e43e61eb7..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Straps.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Straps.png deleted file mode 100644 index e98c2774e..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Boots.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Boots.png deleted file mode 100644 index f49b33bcd..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Buckles.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Buckles.png deleted file mode 100644 index de7ca52ee..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Heels.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Heels.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Laces.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Laces.png deleted file mode 100644 index 21d5b63cf..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Straps.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Straps.png deleted file mode 100644 index 13c08c195..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Boots.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Boots.png deleted file mode 100644 index 7ffafc525..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Buckles.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Buckles.png deleted file mode 100644 index e70700b47..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Heels.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Heels.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Laces.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Laces.png deleted file mode 100644 index feda5076d..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Straps.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Straps.png deleted file mode 100644 index cad531846..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Boots.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Boots.png deleted file mode 100644 index e47580610..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Buckles.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Buckles.png deleted file mode 100644 index 3085a3f27..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Heels.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Heels.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Laces.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Laces.png deleted file mode 100644 index b48ddcf96..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Straps.png b/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Straps.png deleted file mode 100644 index 3bc98da51..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/DeluxeBoots_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/MistressBoots_Large.png b/Assets/Female3DCG/Shoes/Kneel/MistressBoots_Large.png deleted file mode 100644 index 7d0c3330e..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/MistressBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/MistressBoots_Normal.png b/Assets/Female3DCG/Shoes/Kneel/MistressBoots_Normal.png deleted file mode 100644 index 6b6e5f5a2..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/MistressBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/MistressBoots_Small.png b/Assets/Female3DCG/Shoes/Kneel/MistressBoots_Small.png deleted file mode 100644 index 83bca36b6..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/MistressBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/MistressBoots_XLarge.png b/Assets/Female3DCG/Shoes/Kneel/MistressBoots_XLarge.png deleted file mode 100644 index e36fdd29d..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/MistressBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_Large.png b/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_Large.png deleted file mode 100644 index c37da9229..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_Normal.png b/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_Normal.png deleted file mode 100644 index d2d02c27e..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_Small.png b/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_Small.png deleted file mode 100644 index 4847a5219..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_XLarge.png b/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_XLarge.png deleted file mode 100644 index ffb938274..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/Orig/MistressBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_Large.png b/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_Large.png deleted file mode 100644 index 7b7b3371a..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_Normal.png b/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_Normal.png deleted file mode 100644 index 00345ed85..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_Small.png b/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_Small.png deleted file mode 100644 index 8c985447c..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_XLarge.png b/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_XLarge.png deleted file mode 100644 index 6cac0e63a..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/ThighHighLatexHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_Large.png b/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_Large.png deleted file mode 100644 index 352e85ff5..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_Normal.png b/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_Normal.png deleted file mode 100644 index 3e02ad317..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_Small.png b/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_Small.png deleted file mode 100644 index a2a7a8fc4..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_XLarge.png b/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_XLarge.png deleted file mode 100644 index d7c501c8d..000000000 Binary files a/Assets/Female3DCG/Shoes/Kneel/WoollyBootsTall_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LatexAnkleShoes_Large.png b/Assets/Female3DCG/Shoes/LatexAnkleShoes_Large.png deleted file mode 100644 index b3b02984d..000000000 Binary files a/Assets/Female3DCG/Shoes/LatexAnkleShoes_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LatexAnkleShoes_Normal.png b/Assets/Female3DCG/Shoes/LatexAnkleShoes_Normal.png deleted file mode 100644 index a09a3211f..000000000 Binary files a/Assets/Female3DCG/Shoes/LatexAnkleShoes_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LatexAnkleShoes_Small.png b/Assets/Female3DCG/Shoes/LatexAnkleShoes_Small.png deleted file mode 100644 index a09a3211f..000000000 Binary files a/Assets/Female3DCG/Shoes/LatexAnkleShoes_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LatexAnkleShoes_XLarge.png b/Assets/Female3DCG/Shoes/LatexAnkleShoes_XLarge.png deleted file mode 100644 index bf1cf5b6a..000000000 Binary files a/Assets/Female3DCG/Shoes/LatexAnkleShoes_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_Large.png deleted file mode 100644 index d86ddc200..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_Normal.png deleted file mode 100644 index 8f5238f0b..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_Small.png deleted file mode 100644 index 49cd414e7..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_XLarge.png deleted file mode 100644 index fad4c0fb7..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/AnkleStrapShoes_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_Large.png deleted file mode 100644 index 2cc4c6ce7..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_Normal.png deleted file mode 100644 index ad56cb783..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_Small.png deleted file mode 100644 index 765761374..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_XLarge.png deleted file mode 100644 index 9aa7d59ed..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/BarefootSandals1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Large_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Large_Laces.png deleted file mode 100644 index 977542eae..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Large_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Large_Shoes.png deleted file mode 100644 index dfac89831..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Large_Sides.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Large_Sides.png deleted file mode 100644 index d13c56df2..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Large_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Normal_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Normal_Laces.png deleted file mode 100644 index a4599189f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Normal_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Normal_Shoes.png deleted file mode 100644 index 787005fef..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Normal_Sides.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Normal_Sides.png deleted file mode 100644 index fc604f50b..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Normal_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Small_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Small_Laces.png deleted file mode 100644 index a4599189f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Small_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Small_Shoes.png deleted file mode 100644 index 10c7bc273..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Small_Sides.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Small_Sides.png deleted file mode 100644 index 407c75df2..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_Small_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_XLarge_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_XLarge_Laces.png deleted file mode 100644 index 8d83f27d6..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_XLarge_Shoes.png deleted file mode 100644 index 5618c30b0..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_XLarge_Sides.png b/Assets/Female3DCG/Shoes/LegsClosed/Boots1_XLarge_Sides.png deleted file mode 100644 index 66ddfe3d8..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Boots1_XLarge_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Boots.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Boots.png deleted file mode 100644 index 8915d1e21..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Buckles.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Buckles.png deleted file mode 100644 index 4b7f7c88a..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Heels.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Heels.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Laces.png deleted file mode 100644 index fadf3f8eb..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Straps.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Straps.png deleted file mode 100644 index 0c8cae1d8..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Boots.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Boots.png deleted file mode 100644 index e13089cf6..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Buckle.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Buckle.png deleted file mode 100644 index 26dd1fd2c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Buckle.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Buckles.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Buckles.png deleted file mode 100644 index 26dd1fd2c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Heels.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Heels.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Laces.png deleted file mode 100644 index 762e05692..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Straps.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Straps.png deleted file mode 100644 index c5dead985..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Boots.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Boots.png deleted file mode 100644 index cd236163a..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Buckles.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Buckles.png deleted file mode 100644 index 7addd554f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Heels.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Heels.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Laces.png deleted file mode 100644 index 3a5f77f62..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Straps.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Straps.png deleted file mode 100644 index 20ad04367..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Boots.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Boots.png deleted file mode 100644 index b7051bf38..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Buckles.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Buckles.png deleted file mode 100644 index 86f3f1ca9..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Heels.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Heels.png deleted file mode 100644 index 16214f1d4..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Laces.png deleted file mode 100644 index 581c03fe2..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Laces1.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Laces1.png deleted file mode 100644 index ec0dc63d1..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Laces1.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Straps.png b/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Straps.png deleted file mode 100644 index b5cd8c873..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/DeluxeBoots_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Large.png deleted file mode 100644 index 5e3e01afe..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Large_Fins.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Large_Fins.png deleted file mode 100644 index 5e3e01afe..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Large_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Large_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Large_Shoes.png deleted file mode 100644 index f23692b40..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Normal.png deleted file mode 100644 index 5e3e01afe..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Normal_Fins.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Normal_Fins.png deleted file mode 100644 index 5e3e01afe..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Normal_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Normal_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Normal_Shoes.png deleted file mode 100644 index f23692b40..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Small.png deleted file mode 100644 index 5e3e01afe..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Small_Fins.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Small_Fins.png deleted file mode 100644 index 5e3e01afe..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Small_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Small_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Small_Shoes.png deleted file mode 100644 index f23692b40..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_XLarge.png deleted file mode 100644 index 5e3e01afe..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_XLarge_Fins.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_XLarge_Fins.png deleted file mode 100644 index 5e3e01afe..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_XLarge_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Flippers_XLarge_Shoes.png deleted file mode 100644 index f23692b40..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Flippers_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Heels.png b/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Heels.png deleted file mode 100644 index 2a804c74d..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Large_Boots.png b/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Large_Boots.png deleted file mode 100644 index a5a8d70e7..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Large_Fur.png b/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Large_Fur.png deleted file mode 100644 index b3dd04501..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Normal_Boots.png b/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Normal_Boots.png deleted file mode 100644 index a5a8d70e7..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Normal_Fur.png b/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Normal_Fur.png deleted file mode 100644 index b3dd04501..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Small_Boots.png b/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Small_Boots.png deleted file mode 100644 index 2992a4f0a..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Small_Fur.png b/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Small_Fur.png deleted file mode 100644 index 2cdaf2a1c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_XLarge_Boots.png b/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_XLarge_Boots.png deleted file mode 100644 index 0906ae26e..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_XLarge_Fur.png b/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_XLarge_Fur.png deleted file mode 100644 index 4816e0910..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/FuzzyBoots_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels1_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels1_Large.png deleted file mode 100644 index cd717ded9..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels1_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels1_Normal.png deleted file mode 100644 index cd717ded9..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels1_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels1_Small.png deleted file mode 100644 index 5c74ae817..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels1_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels1_XLarge.png deleted file mode 100644 index 752b0e7f5..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels2_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels2_Large.png deleted file mode 100644 index 535260b52..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels2_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels2_Normal.png deleted file mode 100644 index 881e8e960..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels2_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels2_Small.png deleted file mode 100644 index 512742afc..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels2_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels2_XLarge.png deleted file mode 100644 index e2a8c7b79..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels3_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels3_Large.png deleted file mode 100644 index d10ee3671..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels3_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels3_Normal.png deleted file mode 100644 index d10ee3671..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels3_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels3_Small.png deleted file mode 100644 index d10ee3671..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Heels3_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/Heels3_XLarge.png deleted file mode 100644 index d10ee3671..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Heels3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_Large.png deleted file mode 100644 index f3a340ea4..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_Normal.png deleted file mode 100644 index 026e0b2c4..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_Small.png deleted file mode 100644 index 85f32c85d..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_XLarge.png deleted file mode 100644 index b144e05b9..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/LatexAnkleShoes_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_Large.png deleted file mode 100644 index 948962755..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_Normal.png deleted file mode 100644 index 0dc167468..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_Small.png deleted file mode 100644 index db76c69e7..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_XLarge.png deleted file mode 100644 index 3643841b0..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/MistressBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_Large.png deleted file mode 100644 index 2077d75fd..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_Normal.png deleted file mode 100644 index 1f7aff45e..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_Small.png deleted file mode 100644 index c731e444c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_XLarge.png deleted file mode 100644 index 220c93a13..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Orig/MistressBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_Large.png deleted file mode 100644 index 701093b1c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_Normal.png deleted file mode 100644 index 45d871e4d..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_Small.png deleted file mode 100644 index 2e75f8018..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_XLarge.png deleted file mode 100644 index f350411ef..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/PawBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_Large.png deleted file mode 100644 index a82139f85..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_Normal.png deleted file mode 100644 index 0288a7454..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_Small.png deleted file mode 100644 index 13b406b0f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_XLarge.png deleted file mode 100644 index 0e66f056c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/PonyBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Large_Soles.png b/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Large_Soles.png deleted file mode 100644 index 6e74ff868..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Large_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Large_Top.png b/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Large_Top.png deleted file mode 100644 index 1a3743198..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Large_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Normal_Soles.png b/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Normal_Soles.png deleted file mode 100644 index 576f15378..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Normal_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Normal_Top.png b/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Normal_Top.png deleted file mode 100644 index 7c6a480a9..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Normal_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Small_Soles.png b/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Small_Soles.png deleted file mode 100644 index e188412d2..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Small_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Small_Top.png b/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Small_Top.png deleted file mode 100644 index 95faf089f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_Small_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_XLarge_Soles.png b/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_XLarge_Soles.png deleted file mode 100644 index cb5ff061c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_XLarge_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_XLarge_Top.png b/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_XLarge_Top.png deleted file mode 100644 index bdc30f6c8..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/SandalsRS_XLarge_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sandals_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/Sandals_Large.png deleted file mode 100644 index 3773570c2..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sandals_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sandals_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/Sandals_Normal.png deleted file mode 100644 index 38624eb7c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sandals_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sandals_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/Sandals_Small.png deleted file mode 100644 index a54af0cf7..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sandals_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sandals_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/Sandals_XLarge.png deleted file mode 100644 index 05aaed286..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sandals_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_Large.png deleted file mode 100644 index 7beed3714..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_Normal.png deleted file mode 100644 index 0ac568f7b..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_Small.png deleted file mode 100644 index ea19de540..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_XLarge.png deleted file mode 100644 index cbae32985..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_Large.png deleted file mode 100644 index 452bdefc1..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_Normal.png deleted file mode 100644 index 452bdefc1..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_Small.png deleted file mode 100644 index 452bdefc1..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_XLarge.png deleted file mode 100644 index 452bdefc1..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_Large.png deleted file mode 100644 index d9d216846..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_Normal.png deleted file mode 100644 index e7697347c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_Small.png deleted file mode 100644 index e7697347c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_XLarge.png deleted file mode 100644 index d9d216846..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_Large.png deleted file mode 100644 index d17caedeb..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_Normal.png deleted file mode 100644 index baff8bd0e..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_Small.png deleted file mode 100644 index 7f48c279c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_XLarge.png deleted file mode 100644 index 97d977853..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Shoes5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Large_Front.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Large_Front.png deleted file mode 100644 index 77514ce0a..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Large_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Large_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Large_Laces.png deleted file mode 100644 index 51c2eb81f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Large_Main.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Large_Main.png deleted file mode 100644 index c90a4bd04..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Large_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Normal_Front.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Normal_Front.png deleted file mode 100644 index 0fab65fc9..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Normal_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Normal_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Normal_Laces.png deleted file mode 100644 index 763bfeb3c..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Normal_Main.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Normal_Main.png deleted file mode 100644 index 368b62778..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Normal_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Small_Front.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Small_Front.png deleted file mode 100644 index c0bd0cbf9..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Small_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Small_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Small_Laces.png deleted file mode 100644 index bc8760a7f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Small_Main.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Small_Main.png deleted file mode 100644 index 7070c2e28..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_Small_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_XLarge_Front.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_XLarge_Front.png deleted file mode 100644 index 77514ce0a..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_XLarge_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_XLarge_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_XLarge_Laces.png deleted file mode 100644 index 51c2eb81f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_XLarge_Main.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_XLarge_Main.png deleted file mode 100644 index 5dad5b505..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers1_XLarge_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Large_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Large_Laces.png deleted file mode 100644 index 51c2eb81f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Large_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Large_Shoes.png deleted file mode 100644 index 9b00789a2..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Normal_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Normal_Laces.png deleted file mode 100644 index bc8760a7f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Normal_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Normal_Shoes.png deleted file mode 100644 index f316803f9..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Small_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Small_Laces.png deleted file mode 100644 index bc8760a7f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Small_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Small_Shoes.png deleted file mode 100644 index a12fef767..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_XLarge_Laces.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_XLarge_Laces.png deleted file mode 100644 index 51c2eb81f..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_XLarge_Shoes.png deleted file mode 100644 index 9b00789a2..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/Sneakers2_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_Large.png deleted file mode 100644 index 516522c20..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_Normal.png deleted file mode 100644 index a12e4a73e..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_Small.png deleted file mode 100644 index ddad60cac..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_XLarge.png deleted file mode 100644 index a56f12d82..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/ThighHighLatexHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_Large.png b/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_Large.png deleted file mode 100644 index 8dec516c0..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_Normal.png b/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_Normal.png deleted file mode 100644 index 17c9dc7b0..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_Small.png b/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_Small.png deleted file mode 100644 index 6eaa41450..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_XLarge.png b/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_XLarge.png deleted file mode 100644 index 7f3ac0a21..000000000 Binary files a/Assets/Female3DCG/Shoes/LegsClosed/WoollyBootsTall_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/MistressBoots_Large.png b/Assets/Female3DCG/Shoes/MistressBoots_Large.png deleted file mode 100644 index d78808d40..000000000 Binary files a/Assets/Female3DCG/Shoes/MistressBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/MistressBoots_Normal.png b/Assets/Female3DCG/Shoes/MistressBoots_Normal.png deleted file mode 100644 index 8a6d59c96..000000000 Binary files a/Assets/Female3DCG/Shoes/MistressBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/MistressBoots_Small.png b/Assets/Female3DCG/Shoes/MistressBoots_Small.png deleted file mode 100644 index 93f7cd37b..000000000 Binary files a/Assets/Female3DCG/Shoes/MistressBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/MistressBoots_XLarge.png b/Assets/Female3DCG/Shoes/MistressBoots_XLarge.png deleted file mode 100644 index a2d8b2d26..000000000 Binary files a/Assets/Female3DCG/Shoes/MistressBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Orig/MistressBoots_Large.png b/Assets/Female3DCG/Shoes/Orig/MistressBoots_Large.png deleted file mode 100644 index f4b76f299..000000000 Binary files a/Assets/Female3DCG/Shoes/Orig/MistressBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Orig/MistressBoots_Normal.png b/Assets/Female3DCG/Shoes/Orig/MistressBoots_Normal.png deleted file mode 100644 index 330970f57..000000000 Binary files a/Assets/Female3DCG/Shoes/Orig/MistressBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Orig/MistressBoots_Small.png b/Assets/Female3DCG/Shoes/Orig/MistressBoots_Small.png deleted file mode 100644 index b72d176b6..000000000 Binary files a/Assets/Female3DCG/Shoes/Orig/MistressBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Orig/MistressBoots_XLarge.png b/Assets/Female3DCG/Shoes/Orig/MistressBoots_XLarge.png deleted file mode 100644 index 909ceab5a..000000000 Binary files a/Assets/Female3DCG/Shoes/Orig/MistressBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/PawBoots_Large.png b/Assets/Female3DCG/Shoes/PawBoots_Large.png deleted file mode 100644 index 1bee753ea..000000000 Binary files a/Assets/Female3DCG/Shoes/PawBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/PawBoots_Normal.png b/Assets/Female3DCG/Shoes/PawBoots_Normal.png deleted file mode 100644 index 4ad842c64..000000000 Binary files a/Assets/Female3DCG/Shoes/PawBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/PawBoots_Small.png b/Assets/Female3DCG/Shoes/PawBoots_Small.png deleted file mode 100644 index b294eebd5..000000000 Binary files a/Assets/Female3DCG/Shoes/PawBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/PawBoots_XLarge.png b/Assets/Female3DCG/Shoes/PawBoots_XLarge.png deleted file mode 100644 index f4072976c..000000000 Binary files a/Assets/Female3DCG/Shoes/PawBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/PonyBoots_Large.png b/Assets/Female3DCG/Shoes/PonyBoots_Large.png deleted file mode 100644 index 0d3dc94f5..000000000 Binary files a/Assets/Female3DCG/Shoes/PonyBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/PonyBoots_Normal.png b/Assets/Female3DCG/Shoes/PonyBoots_Normal.png deleted file mode 100644 index 3a7b7f16a..000000000 Binary files a/Assets/Female3DCG/Shoes/PonyBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/PonyBoots_Small.png b/Assets/Female3DCG/Shoes/PonyBoots_Small.png deleted file mode 100644 index a765229b4..000000000 Binary files a/Assets/Female3DCG/Shoes/PonyBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/PonyBoots_XLarge.png b/Assets/Female3DCG/Shoes/PonyBoots_XLarge.png deleted file mode 100644 index 13ff64134..000000000 Binary files a/Assets/Female3DCG/Shoes/PonyBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/AnkleStrapShoes.png b/Assets/Female3DCG/Shoes/Preview/AnkleStrapShoes.png deleted file mode 100644 index 057cf8836..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/AnkleStrapShoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/BarefootSandals1.png b/Assets/Female3DCG/Shoes/Preview/BarefootSandals1.png deleted file mode 100644 index ffe1dbd46..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/BarefootSandals1.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Boots1.png b/Assets/Female3DCG/Shoes/Preview/Boots1.png deleted file mode 100644 index 01b3631a5..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Boots1.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/DeluxeBoots.png b/Assets/Female3DCG/Shoes/Preview/DeluxeBoots.png deleted file mode 100644 index d44d4620c..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/DeluxeBoots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Flippers.png b/Assets/Female3DCG/Shoes/Preview/Flippers.png deleted file mode 100644 index ad052a08e..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Flippers.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/FuzzyBoots.png b/Assets/Female3DCG/Shoes/Preview/FuzzyBoots.png deleted file mode 100644 index 74e1b479a..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/FuzzyBoots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Heels1.png b/Assets/Female3DCG/Shoes/Preview/Heels1.png deleted file mode 100644 index 7b87b470c..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Heels1.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Heels2.png b/Assets/Female3DCG/Shoes/Preview/Heels2.png deleted file mode 100644 index 7710bf27d..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Heels2.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Heels3.png b/Assets/Female3DCG/Shoes/Preview/Heels3.png deleted file mode 100644 index 7fbc28863..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Heels3.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/LatexAnkleShoes.png b/Assets/Female3DCG/Shoes/Preview/LatexAnkleShoes.png deleted file mode 100644 index 8b06a4521..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/LatexAnkleShoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/MistressBoots.png b/Assets/Female3DCG/Shoes/Preview/MistressBoots.png deleted file mode 100644 index cc600444b..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/MistressBoots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/PawBoots.png b/Assets/Female3DCG/Shoes/Preview/PawBoots.png deleted file mode 100644 index c64326004..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/PawBoots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/PonyBoots.png b/Assets/Female3DCG/Shoes/Preview/PonyBoots.png deleted file mode 100644 index c12afe14c..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/PonyBoots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Sandals.png b/Assets/Female3DCG/Shoes/Preview/Sandals.png deleted file mode 100644 index 61157dd19..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Sandals.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/SandalsRS.png b/Assets/Female3DCG/Shoes/Preview/SandalsRS.png deleted file mode 100644 index 1d6061799..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/SandalsRS.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Shoes1.png b/Assets/Female3DCG/Shoes/Preview/Shoes1.png deleted file mode 100644 index 7fc9f2ec5..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Shoes1.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Shoes2.png b/Assets/Female3DCG/Shoes/Preview/Shoes2.png deleted file mode 100644 index a6d5fa7fc..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Shoes2.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Shoes4.png b/Assets/Female3DCG/Shoes/Preview/Shoes4.png deleted file mode 100644 index 2d4ec7660..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Shoes4.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Shoes5.png b/Assets/Female3DCG/Shoes/Preview/Shoes5.png deleted file mode 100644 index 393587f4c..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Shoes5.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Sneakers1.png b/Assets/Female3DCG/Shoes/Preview/Sneakers1.png deleted file mode 100644 index 628f3e814..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Sneakers1.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/Sneakers2.png b/Assets/Female3DCG/Shoes/Preview/Sneakers2.png deleted file mode 100644 index 19b446e71..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/Sneakers2.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/ThighHighLatexHeels.png b/Assets/Female3DCG/Shoes/Preview/ThighHighLatexHeels.png deleted file mode 100644 index bc6c0dc94..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/ThighHighLatexHeels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Preview/WoollyBootsTall.png b/Assets/Female3DCG/Shoes/Preview/WoollyBootsTall.png deleted file mode 100644 index 33f40f896..000000000 Binary files a/Assets/Female3DCG/Shoes/Preview/WoollyBootsTall.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/SandalsRS_Large_Soles.png b/Assets/Female3DCG/Shoes/SandalsRS_Large_Soles.png deleted file mode 100644 index 6b5ced7b1..000000000 Binary files a/Assets/Female3DCG/Shoes/SandalsRS_Large_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/SandalsRS_Large_Top.png b/Assets/Female3DCG/Shoes/SandalsRS_Large_Top.png deleted file mode 100644 index 6143f552f..000000000 Binary files a/Assets/Female3DCG/Shoes/SandalsRS_Large_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/SandalsRS_Normal_Soles.png b/Assets/Female3DCG/Shoes/SandalsRS_Normal_Soles.png deleted file mode 100644 index 1e1d72061..000000000 Binary files a/Assets/Female3DCG/Shoes/SandalsRS_Normal_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/SandalsRS_Normal_Top.png b/Assets/Female3DCG/Shoes/SandalsRS_Normal_Top.png deleted file mode 100644 index d2e843c66..000000000 Binary files a/Assets/Female3DCG/Shoes/SandalsRS_Normal_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/SandalsRS_Small_Soles.png b/Assets/Female3DCG/Shoes/SandalsRS_Small_Soles.png deleted file mode 100644 index e1cad1f8b..000000000 Binary files a/Assets/Female3DCG/Shoes/SandalsRS_Small_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/SandalsRS_Small_Top.png b/Assets/Female3DCG/Shoes/SandalsRS_Small_Top.png deleted file mode 100644 index 5a87c249c..000000000 Binary files a/Assets/Female3DCG/Shoes/SandalsRS_Small_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/SandalsRS_XLarge_Soles.png b/Assets/Female3DCG/Shoes/SandalsRS_XLarge_Soles.png deleted file mode 100644 index cfa9d2803..000000000 Binary files a/Assets/Female3DCG/Shoes/SandalsRS_XLarge_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/SandalsRS_XLarge_Top.png b/Assets/Female3DCG/Shoes/SandalsRS_XLarge_Top.png deleted file mode 100644 index a0d72bd80..000000000 Binary files a/Assets/Female3DCG/Shoes/SandalsRS_XLarge_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sandals_Large.png b/Assets/Female3DCG/Shoes/Sandals_Large.png deleted file mode 100644 index c7999717e..000000000 Binary files a/Assets/Female3DCG/Shoes/Sandals_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sandals_Normal.png b/Assets/Female3DCG/Shoes/Sandals_Normal.png deleted file mode 100644 index 61d27d187..000000000 Binary files a/Assets/Female3DCG/Shoes/Sandals_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sandals_Small.png b/Assets/Female3DCG/Shoes/Sandals_Small.png deleted file mode 100644 index 928835e87..000000000 Binary files a/Assets/Female3DCG/Shoes/Sandals_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sandals_XLarge.png b/Assets/Female3DCG/Shoes/Sandals_XLarge.png deleted file mode 100644 index 10a5166df..000000000 Binary files a/Assets/Female3DCG/Shoes/Sandals_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes1_Large.png b/Assets/Female3DCG/Shoes/Shoes1_Large.png deleted file mode 100644 index aa5f0bb66..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes1_Normal.png b/Assets/Female3DCG/Shoes/Shoes1_Normal.png deleted file mode 100644 index d3c9cc20f..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes1_Small.png b/Assets/Female3DCG/Shoes/Shoes1_Small.png deleted file mode 100644 index 0aa98f10d..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes1_XLarge.png b/Assets/Female3DCG/Shoes/Shoes1_XLarge.png deleted file mode 100644 index 2b549ba5f..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes2_Large.png b/Assets/Female3DCG/Shoes/Shoes2_Large.png deleted file mode 100644 index aae8a4048..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes2_Normal.png b/Assets/Female3DCG/Shoes/Shoes2_Normal.png deleted file mode 100644 index ad3c33985..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes2_Small.png b/Assets/Female3DCG/Shoes/Shoes2_Small.png deleted file mode 100644 index ad3c33985..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes2_XLarge.png b/Assets/Female3DCG/Shoes/Shoes2_XLarge.png deleted file mode 100644 index aae8a4048..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes4_Large.png b/Assets/Female3DCG/Shoes/Shoes4_Large.png deleted file mode 100644 index 5059d62b5..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes4_Normal.png b/Assets/Female3DCG/Shoes/Shoes4_Normal.png deleted file mode 100644 index e887c3e29..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes4_Small.png b/Assets/Female3DCG/Shoes/Shoes4_Small.png deleted file mode 100644 index e887c3e29..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes4_XLarge.png b/Assets/Female3DCG/Shoes/Shoes4_XLarge.png deleted file mode 100644 index 5059d62b5..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes5_Large.png b/Assets/Female3DCG/Shoes/Shoes5_Large.png deleted file mode 100644 index 9b7aee590..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes5_Normal.png b/Assets/Female3DCG/Shoes/Shoes5_Normal.png deleted file mode 100644 index 05703562f..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes5_Small.png b/Assets/Female3DCG/Shoes/Shoes5_Small.png deleted file mode 100644 index 6b1a2614f..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Shoes5_XLarge.png b/Assets/Female3DCG/Shoes/Shoes5_XLarge.png deleted file mode 100644 index 558fbf225..000000000 Binary files a/Assets/Female3DCG/Shoes/Shoes5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_Large.png b/Assets/Female3DCG/Shoes/Sneakers1_Large.png deleted file mode 100644 index 072068548..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_Large_Front.png b/Assets/Female3DCG/Shoes/Sneakers1_Large_Front.png deleted file mode 100644 index da4f017a2..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_Large_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_Large_Laces.png b/Assets/Female3DCG/Shoes/Sneakers1_Large_Laces.png deleted file mode 100644 index 780883b22..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_Large_Main.png b/Assets/Female3DCG/Shoes/Sneakers1_Large_Main.png deleted file mode 100644 index 32c88b1e5..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_Large_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_Normal_Front.png b/Assets/Female3DCG/Shoes/Sneakers1_Normal_Front.png deleted file mode 100644 index 99ceb4cd2..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_Normal_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_Normal_Laces.png b/Assets/Female3DCG/Shoes/Sneakers1_Normal_Laces.png deleted file mode 100644 index ccb678ec2..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_Normal_Main.png b/Assets/Female3DCG/Shoes/Sneakers1_Normal_Main.png deleted file mode 100644 index a1d1d0e82..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_Normal_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_Small_Front.png b/Assets/Female3DCG/Shoes/Sneakers1_Small_Front.png deleted file mode 100644 index 99ceb4cd2..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_Small_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_Small_Laces.png b/Assets/Female3DCG/Shoes/Sneakers1_Small_Laces.png deleted file mode 100644 index ccb678ec2..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_Small_Main.png b/Assets/Female3DCG/Shoes/Sneakers1_Small_Main.png deleted file mode 100644 index a1d1d0e82..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_Small_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_XLarge_Front.png b/Assets/Female3DCG/Shoes/Sneakers1_XLarge_Front.png deleted file mode 100644 index da4f017a2..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_XLarge_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_XLarge_Laces.png b/Assets/Female3DCG/Shoes/Sneakers1_XLarge_Laces.png deleted file mode 100644 index 780883b22..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers1_XLarge_Main.png b/Assets/Female3DCG/Shoes/Sneakers1_XLarge_Main.png deleted file mode 100644 index 32c88b1e5..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers1_XLarge_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers2_Large_Laces.png b/Assets/Female3DCG/Shoes/Sneakers2_Large_Laces.png deleted file mode 100644 index 780883b22..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers2_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers2_Large_Shoes.png b/Assets/Female3DCG/Shoes/Sneakers2_Large_Shoes.png deleted file mode 100644 index d92005318..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers2_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers2_Normal_Laces.png b/Assets/Female3DCG/Shoes/Sneakers2_Normal_Laces.png deleted file mode 100644 index ccb678ec2..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers2_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers2_Normal_Shoes.png b/Assets/Female3DCG/Shoes/Sneakers2_Normal_Shoes.png deleted file mode 100644 index 9faf773f0..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers2_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers2_Small_Laces.png b/Assets/Female3DCG/Shoes/Sneakers2_Small_Laces.png deleted file mode 100644 index ccb678ec2..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers2_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers2_Small_Shoes.png b/Assets/Female3DCG/Shoes/Sneakers2_Small_Shoes.png deleted file mode 100644 index 9faf773f0..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers2_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers2_XLarge_Laces.png b/Assets/Female3DCG/Shoes/Sneakers2_XLarge_Laces.png deleted file mode 100644 index 780883b22..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers2_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Sneakers2_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/Sneakers2_XLarge_Shoes.png deleted file mode 100644 index d92005318..000000000 Binary files a/Assets/Female3DCG/Shoes/Sneakers2_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_Large.png b/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_Large.png deleted file mode 100644 index 6802e93b4..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_Normal.png b/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_Normal.png deleted file mode 100644 index c81eaddfd..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_Small.png b/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_Small.png deleted file mode 100644 index 428b171d4..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_XLarge.png b/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_XLarge.png deleted file mode 100644 index 684b1ed74..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/AnkleStrapShoes_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_Large.png b/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_Large.png deleted file mode 100644 index b7adcff67..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_Normal.png b/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_Normal.png deleted file mode 100644 index 355d49697..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_Small.png b/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_Small.png deleted file mode 100644 index 99bf3774e..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_XLarge.png b/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_XLarge.png deleted file mode 100644 index 1ee5fc743..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/BarefootSandals1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_Large_Laces.png b/Assets/Female3DCG/Shoes/Spread/Boots1_Large_Laces.png deleted file mode 100644 index d067a474b..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_Large_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Boots1_Large_Shoes.png deleted file mode 100644 index 6de2fbbd2..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_Large_Sides.png b/Assets/Female3DCG/Shoes/Spread/Boots1_Large_Sides.png deleted file mode 100644 index ea6ed6fa2..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_Large_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_Normal_Laces.png b/Assets/Female3DCG/Shoes/Spread/Boots1_Normal_Laces.png deleted file mode 100644 index 54c766652..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_Normal_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Boots1_Normal_Shoes.png deleted file mode 100644 index 5ebee18da..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_Normal_Sides.png b/Assets/Female3DCG/Shoes/Spread/Boots1_Normal_Sides.png deleted file mode 100644 index 15cb66cf8..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_Normal_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_Small_Laces.png b/Assets/Female3DCG/Shoes/Spread/Boots1_Small_Laces.png deleted file mode 100644 index 54c766652..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_Small_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Boots1_Small_Shoes.png deleted file mode 100644 index 5ebee18da..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_Small_Sides.png b/Assets/Female3DCG/Shoes/Spread/Boots1_Small_Sides.png deleted file mode 100644 index 15cb66cf8..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_Small_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_XLarge_Laces.png b/Assets/Female3DCG/Shoes/Spread/Boots1_XLarge_Laces.png deleted file mode 100644 index d067a474b..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Boots1_XLarge_Shoes.png deleted file mode 100644 index 6de2fbbd2..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Boots1_XLarge_Sides.png b/Assets/Female3DCG/Shoes/Spread/Boots1_XLarge_Sides.png deleted file mode 100644 index ea6ed6fa2..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Boots1_XLarge_Sides.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Boots.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Boots.png deleted file mode 100644 index f71751595..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Buckles.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Buckles.png deleted file mode 100644 index abf32e463..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Heels.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Heels.png deleted file mode 100644 index bd6b7a14c..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Laces.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Laces.png deleted file mode 100644 index 05d5481d7..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Straps.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Straps.png deleted file mode 100644 index 6041b10b6..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Large_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Boots.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Boots.png deleted file mode 100644 index a01897c37..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Buckles.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Buckles.png deleted file mode 100644 index 768082b37..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Heels.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Heels.png deleted file mode 100644 index 7ae99f059..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Laces.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Laces.png deleted file mode 100644 index b0a88f92f..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Straps.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Straps.png deleted file mode 100644 index 425941e97..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Normal_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Boots.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Boots.png deleted file mode 100644 index 5675fb9d9..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Buckles.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Buckles.png deleted file mode 100644 index 3b5cab210..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Heels.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Heels.png deleted file mode 100644 index 6caad1ffe..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Laces.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Laces.png deleted file mode 100644 index 90fee2d2b..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Straps.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Straps.png deleted file mode 100644 index 4948b0238..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_Small_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Boots.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Boots.png deleted file mode 100644 index 83d41c4e3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Buckles.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Buckles.png deleted file mode 100644 index f1ded765f..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Buckles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Heels.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Heels.png deleted file mode 100644 index c0020d5b2..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Laces.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Laces.png deleted file mode 100644 index fd4c70f82..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Straps.png b/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Straps.png deleted file mode 100644 index fc6550ca7..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/DeluxeBoots_XLarge_Straps.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_Large.png b/Assets/Female3DCG/Shoes/Spread/Flippers_Large.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_Large_Fins.png b/Assets/Female3DCG/Shoes/Spread/Flippers_Large_Fins.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_Large_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_Large_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Flippers_Large_Shoes.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_Normal.png b/Assets/Female3DCG/Shoes/Spread/Flippers_Normal.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_Normal_Fins.png b/Assets/Female3DCG/Shoes/Spread/Flippers_Normal_Fins.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_Normal_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_Normal_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Flippers_Normal_Shoes.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_Small.png b/Assets/Female3DCG/Shoes/Spread/Flippers_Small.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_Small_Fins.png b/Assets/Female3DCG/Shoes/Spread/Flippers_Small_Fins.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_Small_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_Small_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Flippers_Small_Shoes.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_XLarge.png b/Assets/Female3DCG/Shoes/Spread/Flippers_XLarge.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_XLarge_Fins.png b/Assets/Female3DCG/Shoes/Spread/Flippers_XLarge_Fins.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_XLarge_Fins.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Flippers_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Flippers_XLarge_Shoes.png deleted file mode 100644 index d8fb80fe3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Flippers_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Heels.png b/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Heels.png deleted file mode 100644 index 20555bb12..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Heels.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Large_Boots.png b/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Large_Boots.png deleted file mode 100644 index b20f447a1..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Large_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Large_Fur.png b/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Large_Fur.png deleted file mode 100644 index ae6fbee58..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Normal_Boots.png b/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Normal_Boots.png deleted file mode 100644 index d59df2770..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Normal_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Normal_Fur.png b/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Normal_Fur.png deleted file mode 100644 index a1f790f6a..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Small_Boots.png b/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Small_Boots.png deleted file mode 100644 index 92bc521c9..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Small_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Small_Fur.png b/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Small_Fur.png deleted file mode 100644 index 9491af9dd..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_XLarge_Boots.png b/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_XLarge_Boots.png deleted file mode 100644 index 21ec5de75..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_XLarge_Boots.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_XLarge_Fur.png b/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_XLarge_Fur.png deleted file mode 100644 index 6dded8d70..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/FuzzyBoots_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels1_Large.png b/Assets/Female3DCG/Shoes/Spread/Heels1_Large.png deleted file mode 100644 index 2aa756327..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels1_Normal.png b/Assets/Female3DCG/Shoes/Spread/Heels1_Normal.png deleted file mode 100644 index 5b5b5ae07..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels1_Small.png b/Assets/Female3DCG/Shoes/Spread/Heels1_Small.png deleted file mode 100644 index 367e4a2a6..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels1_XLarge.png b/Assets/Female3DCG/Shoes/Spread/Heels1_XLarge.png deleted file mode 100644 index 164e44125..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels2_Large.png b/Assets/Female3DCG/Shoes/Spread/Heels2_Large.png deleted file mode 100644 index 5e350e384..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels2_Normal.png b/Assets/Female3DCG/Shoes/Spread/Heels2_Normal.png deleted file mode 100644 index 1727a4878..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels2_Small.png b/Assets/Female3DCG/Shoes/Spread/Heels2_Small.png deleted file mode 100644 index 10a0126c5..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels2_XLarge.png b/Assets/Female3DCG/Shoes/Spread/Heels2_XLarge.png deleted file mode 100644 index f06598c24..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels3_Large.png b/Assets/Female3DCG/Shoes/Spread/Heels3_Large.png deleted file mode 100644 index 570a5d455..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels3_Normal.png b/Assets/Female3DCG/Shoes/Spread/Heels3_Normal.png deleted file mode 100644 index 570a5d455..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels3_Small.png b/Assets/Female3DCG/Shoes/Spread/Heels3_Small.png deleted file mode 100644 index 570a5d455..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Heels3_XLarge.png b/Assets/Female3DCG/Shoes/Spread/Heels3_XLarge.png deleted file mode 100644 index 570a5d455..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Heels3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_Large.png b/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_Large.png deleted file mode 100644 index c090d5c03..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_Normal.png b/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_Normal.png deleted file mode 100644 index b36fec15f..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_Small.png b/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_Small.png deleted file mode 100644 index ea5146244..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_XLarge.png b/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_XLarge.png deleted file mode 100644 index 4b340f4f4..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/LatexAnkleShoes_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/MistressBoots_Large.png b/Assets/Female3DCG/Shoes/Spread/MistressBoots_Large.png deleted file mode 100644 index 1d4c0af8b..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/MistressBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/MistressBoots_Normal.png b/Assets/Female3DCG/Shoes/Spread/MistressBoots_Normal.png deleted file mode 100644 index 3477ffc96..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/MistressBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/MistressBoots_Small.png b/Assets/Female3DCG/Shoes/Spread/MistressBoots_Small.png deleted file mode 100644 index c2e3206fe..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/MistressBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/MistressBoots_XLarge.png b/Assets/Female3DCG/Shoes/Spread/MistressBoots_XLarge.png deleted file mode 100644 index 444ba59ac..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/MistressBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/PawBoots_Large.png b/Assets/Female3DCG/Shoes/Spread/PawBoots_Large.png deleted file mode 100644 index bc88671c1..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/PawBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/PawBoots_Normal.png b/Assets/Female3DCG/Shoes/Spread/PawBoots_Normal.png deleted file mode 100644 index 0000bdb5b..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/PawBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/PawBoots_Small.png b/Assets/Female3DCG/Shoes/Spread/PawBoots_Small.png deleted file mode 100644 index 97bf4d87d..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/PawBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/PawBoots_XLarge.png b/Assets/Female3DCG/Shoes/Spread/PawBoots_XLarge.png deleted file mode 100644 index a0cd234ef..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/PawBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/PonyBoots_Large.png b/Assets/Female3DCG/Shoes/Spread/PonyBoots_Large.png deleted file mode 100644 index 641ec828b..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/PonyBoots_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/PonyBoots_Normal.png b/Assets/Female3DCG/Shoes/Spread/PonyBoots_Normal.png deleted file mode 100644 index fbc74e058..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/PonyBoots_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/PonyBoots_Small.png b/Assets/Female3DCG/Shoes/Spread/PonyBoots_Small.png deleted file mode 100644 index fe7a75ef1..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/PonyBoots_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/PonyBoots_XLarge.png b/Assets/Female3DCG/Shoes/Spread/PonyBoots_XLarge.png deleted file mode 100644 index 9e7e052c9..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/PonyBoots_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Large_Soles.png b/Assets/Female3DCG/Shoes/Spread/SandalsRS_Large_Soles.png deleted file mode 100644 index bee9a0b16..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Large_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Large_Top.png b/Assets/Female3DCG/Shoes/Spread/SandalsRS_Large_Top.png deleted file mode 100644 index 84d430ea2..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Large_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Normal_Soles.png b/Assets/Female3DCG/Shoes/Spread/SandalsRS_Normal_Soles.png deleted file mode 100644 index cb171a2ed..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Normal_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Normal_Top.png b/Assets/Female3DCG/Shoes/Spread/SandalsRS_Normal_Top.png deleted file mode 100644 index 4482707f4..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Normal_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Small_Soles.png b/Assets/Female3DCG/Shoes/Spread/SandalsRS_Small_Soles.png deleted file mode 100644 index f4de66532..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Small_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Small_Top.png b/Assets/Female3DCG/Shoes/Spread/SandalsRS_Small_Top.png deleted file mode 100644 index 7d8542766..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/SandalsRS_Small_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/SandalsRS_XLarge_Soles.png b/Assets/Female3DCG/Shoes/Spread/SandalsRS_XLarge_Soles.png deleted file mode 100644 index ab2eebe13..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/SandalsRS_XLarge_Soles.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/SandalsRS_XLarge_Top.png b/Assets/Female3DCG/Shoes/Spread/SandalsRS_XLarge_Top.png deleted file mode 100644 index 5f3faa34a..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/SandalsRS_XLarge_Top.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sandals_Large.png b/Assets/Female3DCG/Shoes/Spread/Sandals_Large.png deleted file mode 100644 index 1d93e774c..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sandals_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sandals_Normal.png b/Assets/Female3DCG/Shoes/Spread/Sandals_Normal.png deleted file mode 100644 index 51f5e5ce4..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sandals_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sandals_Small.png b/Assets/Female3DCG/Shoes/Spread/Sandals_Small.png deleted file mode 100644 index 23e195d58..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sandals_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sandals_XLarge.png b/Assets/Female3DCG/Shoes/Spread/Sandals_XLarge.png deleted file mode 100644 index f9049635c..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sandals_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes1_Large.png b/Assets/Female3DCG/Shoes/Spread/Shoes1_Large.png deleted file mode 100644 index d789593c1..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes1_Normal.png b/Assets/Female3DCG/Shoes/Spread/Shoes1_Normal.png deleted file mode 100644 index 0f4c58d27..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes1_Small.png b/Assets/Female3DCG/Shoes/Spread/Shoes1_Small.png deleted file mode 100644 index 8d626bec3..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes1_XLarge.png b/Assets/Female3DCG/Shoes/Spread/Shoes1_XLarge.png deleted file mode 100644 index 23936ffb8..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes2_Large.png b/Assets/Female3DCG/Shoes/Spread/Shoes2_Large.png deleted file mode 100644 index b64bcac29..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes2_Normal.png b/Assets/Female3DCG/Shoes/Spread/Shoes2_Normal.png deleted file mode 100644 index 4fb689d68..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes2_Small.png b/Assets/Female3DCG/Shoes/Spread/Shoes2_Small.png deleted file mode 100644 index 4fb689d68..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes2_XLarge.png b/Assets/Female3DCG/Shoes/Spread/Shoes2_XLarge.png deleted file mode 100644 index b64bcac29..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes4_Large.png b/Assets/Female3DCG/Shoes/Spread/Shoes4_Large.png deleted file mode 100644 index 9fe1240cd..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes4_Normal.png b/Assets/Female3DCG/Shoes/Spread/Shoes4_Normal.png deleted file mode 100644 index ebd01ab9d..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes4_Small.png b/Assets/Female3DCG/Shoes/Spread/Shoes4_Small.png deleted file mode 100644 index ebd01ab9d..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes4_XLarge.png b/Assets/Female3DCG/Shoes/Spread/Shoes4_XLarge.png deleted file mode 100644 index 9fe1240cd..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes5_Large.png b/Assets/Female3DCG/Shoes/Spread/Shoes5_Large.png deleted file mode 100644 index 337742886..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes5_Normal.png b/Assets/Female3DCG/Shoes/Spread/Shoes5_Normal.png deleted file mode 100644 index 484a5a834..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes5_Small.png b/Assets/Female3DCG/Shoes/Spread/Shoes5_Small.png deleted file mode 100644 index 5b5d117d8..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Shoes5_XLarge.png b/Assets/Female3DCG/Shoes/Spread/Shoes5_XLarge.png deleted file mode 100644 index ef79c48aa..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Shoes5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Large_Front.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_Large_Front.png deleted file mode 100644 index 90331274e..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Large_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Large_Laces.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_Large_Laces.png deleted file mode 100644 index 683366fe7..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Large_Main.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_Large_Main.png deleted file mode 100644 index 14bb8be91..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Large_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Normal_Front.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_Normal_Front.png deleted file mode 100644 index 90331274e..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Normal_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Normal_Laces.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_Normal_Laces.png deleted file mode 100644 index 683366fe7..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Normal_Main.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_Normal_Main.png deleted file mode 100644 index 108f244bd..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Normal_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Small_Front.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_Small_Front.png deleted file mode 100644 index 90331274e..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Small_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Small_Laces.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_Small_Laces.png deleted file mode 100644 index 683366fe7..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Small_Main.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_Small_Main.png deleted file mode 100644 index 108f244bd..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_Small_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_XLarge_Front.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_XLarge_Front.png deleted file mode 100644 index 90331274e..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_XLarge_Front.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_XLarge_Laces.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_XLarge_Laces.png deleted file mode 100644 index 683366fe7..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers1_XLarge_Main.png b/Assets/Female3DCG/Shoes/Spread/Sneakers1_XLarge_Main.png deleted file mode 100644 index 14bb8be91..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers1_XLarge_Main.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Large_Laces.png b/Assets/Female3DCG/Shoes/Spread/Sneakers2_Large_Laces.png deleted file mode 100644 index 683366fe7..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Large_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Large_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Sneakers2_Large_Shoes.png deleted file mode 100644 index 9f4add1ef..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Large_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Normal_Laces.png b/Assets/Female3DCG/Shoes/Spread/Sneakers2_Normal_Laces.png deleted file mode 100644 index 12b7ddcc2..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Normal_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Normal_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Sneakers2_Normal_Shoes.png deleted file mode 100644 index 0f09f26ea..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Normal_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Small_Laces.png b/Assets/Female3DCG/Shoes/Spread/Sneakers2_Small_Laces.png deleted file mode 100644 index 12b7ddcc2..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Small_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Small_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Sneakers2_Small_Shoes.png deleted file mode 100644 index 0f09f26ea..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers2_Small_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers2_XLarge_Laces.png b/Assets/Female3DCG/Shoes/Spread/Sneakers2_XLarge_Laces.png deleted file mode 100644 index 683366fe7..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers2_XLarge_Laces.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/Sneakers2_XLarge_Shoes.png b/Assets/Female3DCG/Shoes/Spread/Sneakers2_XLarge_Shoes.png deleted file mode 100644 index 9f4add1ef..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/Sneakers2_XLarge_Shoes.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_Large.png b/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_Large.png deleted file mode 100644 index 23e62fe2a..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_Normal.png b/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_Normal.png deleted file mode 100644 index a62194043..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_Small.png b/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_Small.png deleted file mode 100644 index 79c446e47..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_XLarge.png b/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_XLarge.png deleted file mode 100644 index d0b43d613..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/ThighHighLatexHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_Large.png b/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_Large.png deleted file mode 100644 index 2585e2812..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_Normal.png b/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_Normal.png deleted file mode 100644 index 8fceb407f..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_Small.png b/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_Small.png deleted file mode 100644 index 49032c52e..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_XLarge.png b/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_XLarge.png deleted file mode 100644 index f455aedef..000000000 Binary files a/Assets/Female3DCG/Shoes/Spread/WoollyBootsTall_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/ThighHighLatexHeels_Large.png b/Assets/Female3DCG/Shoes/ThighHighLatexHeels_Large.png deleted file mode 100644 index 5c58be7b5..000000000 Binary files a/Assets/Female3DCG/Shoes/ThighHighLatexHeels_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/ThighHighLatexHeels_Normal.png b/Assets/Female3DCG/Shoes/ThighHighLatexHeels_Normal.png deleted file mode 100644 index 879fff1af..000000000 Binary files a/Assets/Female3DCG/Shoes/ThighHighLatexHeels_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/ThighHighLatexHeels_Small.png b/Assets/Female3DCG/Shoes/ThighHighLatexHeels_Small.png deleted file mode 100644 index d7720b09c..000000000 Binary files a/Assets/Female3DCG/Shoes/ThighHighLatexHeels_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/ThighHighLatexHeels_XLarge.png b/Assets/Female3DCG/Shoes/ThighHighLatexHeels_XLarge.png deleted file mode 100644 index 7b20f878e..000000000 Binary files a/Assets/Female3DCG/Shoes/ThighHighLatexHeels_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/WoollyBootsTall_Large.png b/Assets/Female3DCG/Shoes/WoollyBootsTall_Large.png deleted file mode 100644 index ff7cd819f..000000000 Binary files a/Assets/Female3DCG/Shoes/WoollyBootsTall_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/WoollyBootsTall_Normal.png b/Assets/Female3DCG/Shoes/WoollyBootsTall_Normal.png deleted file mode 100644 index db06ad9a8..000000000 Binary files a/Assets/Female3DCG/Shoes/WoollyBootsTall_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/WoollyBootsTall_Small.png b/Assets/Female3DCG/Shoes/WoollyBootsTall_Small.png deleted file mode 100644 index 5f356f36b..000000000 Binary files a/Assets/Female3DCG/Shoes/WoollyBootsTall_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Shoes/WoollyBootsTall_XLarge.png b/Assets/Female3DCG/Shoes/WoollyBootsTall_XLarge.png deleted file mode 100644 index 3f6a2b10a..000000000 Binary files a/Assets/Female3DCG/Shoes/WoollyBootsTall_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/CowPrintedSocks_Large.png b/Assets/Female3DCG/Socks/CowPrintedSocks_Large.png deleted file mode 100644 index a267ad5cf..000000000 Binary files a/Assets/Female3DCG/Socks/CowPrintedSocks_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/CowPrintedSocks_Normal.png b/Assets/Female3DCG/Socks/CowPrintedSocks_Normal.png deleted file mode 100644 index 388706204..000000000 Binary files a/Assets/Female3DCG/Socks/CowPrintedSocks_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/CowPrintedSocks_Small.png b/Assets/Female3DCG/Socks/CowPrintedSocks_Small.png deleted file mode 100644 index 7760d09ef..000000000 Binary files a/Assets/Female3DCG/Socks/CowPrintedSocks_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/CowPrintedSocks_XLarge.png b/Assets/Female3DCG/Socks/CowPrintedSocks_XLarge.png deleted file mode 100644 index 9c108a9b7..000000000 Binary files a/Assets/Female3DCG/Socks/CowPrintedSocks_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/FootlessSocks1_Large.png b/Assets/Female3DCG/Socks/FootlessSocks1_Large.png deleted file mode 100644 index 30f86429a..000000000 Binary files a/Assets/Female3DCG/Socks/FootlessSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/FootlessSocks1_Normal.png b/Assets/Female3DCG/Socks/FootlessSocks1_Normal.png deleted file mode 100644 index 30d4cf7bb..000000000 Binary files a/Assets/Female3DCG/Socks/FootlessSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/FootlessSocks1_Small.png b/Assets/Female3DCG/Socks/FootlessSocks1_Small.png deleted file mode 100644 index b1e82fa2f..000000000 Binary files a/Assets/Female3DCG/Socks/FootlessSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/FootlessSocks1_XLarge.png b/Assets/Female3DCG/Socks/FootlessSocks1_XLarge.png deleted file mode 100644 index 6e6f98797..000000000 Binary files a/Assets/Female3DCG/Socks/FootlessSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/HaremStockings_Large_Bands.png b/Assets/Female3DCG/Socks/HaremStockings_Large_Bands.png deleted file mode 100644 index 22c514ba2..000000000 Binary files a/Assets/Female3DCG/Socks/HaremStockings_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/HaremStockings_Large_Fabric.png b/Assets/Female3DCG/Socks/HaremStockings_Large_Fabric.png deleted file mode 100644 index 5bdc5ae2b..000000000 Binary files a/Assets/Female3DCG/Socks/HaremStockings_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/HaremStockings_Normal_Bands.png b/Assets/Female3DCG/Socks/HaremStockings_Normal_Bands.png deleted file mode 100644 index b16149aa9..000000000 Binary files a/Assets/Female3DCG/Socks/HaremStockings_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/HaremStockings_Normal_Fabric.png b/Assets/Female3DCG/Socks/HaremStockings_Normal_Fabric.png deleted file mode 100644 index 4aec61bde..000000000 Binary files a/Assets/Female3DCG/Socks/HaremStockings_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/HaremStockings_Small_Bands.png b/Assets/Female3DCG/Socks/HaremStockings_Small_Bands.png deleted file mode 100644 index cbe60bb36..000000000 Binary files a/Assets/Female3DCG/Socks/HaremStockings_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/HaremStockings_Small_Fabric.png b/Assets/Female3DCG/Socks/HaremStockings_Small_Fabric.png deleted file mode 100644 index cf8167503..000000000 Binary files a/Assets/Female3DCG/Socks/HaremStockings_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/HaremStockings_XLarge_Bands.png b/Assets/Female3DCG/Socks/HaremStockings_XLarge_Bands.png deleted file mode 100644 index ff897f112..000000000 Binary files a/Assets/Female3DCG/Socks/HaremStockings_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/HaremStockings_XLarge_Fabric.png b/Assets/Female3DCG/Socks/HaremStockings_XLarge_Fabric.png deleted file mode 100644 index 1d6e2959b..000000000 Binary files a/Assets/Female3DCG/Socks/HaremStockings_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_Large.png b/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_Large.png deleted file mode 100644 index 7d69a7648..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_Normal.png b/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_Normal.png deleted file mode 100644 index 006748346..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_Small.png b/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_Small.png deleted file mode 100644 index a1348b040..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_XLarge.png deleted file mode 100644 index a29d7a63d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/CowPrintedSocks_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_Large.png b/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_Large.png deleted file mode 100644 index 5527eb5df..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_Normal.png b/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_Normal.png deleted file mode 100644 index 5527eb5df..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_Small.png b/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_Small.png deleted file mode 100644 index 5527eb5df..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_XLarge.png deleted file mode 100644 index 5527eb5df..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/FootlessSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_Large.png b/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_Large.png deleted file mode 100644 index 576f19992..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_Normal.png b/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_Normal.png deleted file mode 100644 index f58f0b4d0..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_Small.png b/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_Small.png deleted file mode 100644 index f58f0b4d0..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_XLarge.png deleted file mode 100644 index f58f0b4d0..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/LatexSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_Large.png b/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_Large.png deleted file mode 100644 index 3f0b49398..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_Normal.png b/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_Normal.png deleted file mode 100644 index 3f0b49398..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_Small.png b/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_Small.png deleted file mode 100644 index 3f0b49398..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_XLarge.png deleted file mode 100644 index 3f0b49398..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/LeatherSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_Large.png b/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_Large.png deleted file mode 100644 index 7b85db32c..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_Normal.png deleted file mode 100644 index 7b85db32c..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_Small.png b/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_Small.png deleted file mode 100644 index 7b85db32c..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_XLarge.png deleted file mode 100644 index 7b85db32c..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Pantyhose1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_Large.png b/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_Large.png deleted file mode 100644 index 7b85db32c..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_Normal.png deleted file mode 100644 index 7b85db32c..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_Small.png b/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_Small.png deleted file mode 100644 index 7b85db32c..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_XLarge.png deleted file mode 100644 index 7b85db32c..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Pantyhose2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks0_Large.png b/Assets/Female3DCG/Socks/Hogtied/Socks0_Large.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks0_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks0_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Socks0_Normal.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks0_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks0_Small.png b/Assets/Female3DCG/Socks/Hogtied/Socks0_Small.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks0_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks0_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Socks0_XLarge.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks0_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks1_Large.png b/Assets/Female3DCG/Socks/Hogtied/Socks1_Large.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks1_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Socks1_Normal.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks1_Small.png b/Assets/Female3DCG/Socks/Hogtied/Socks1_Small.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks1_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Socks1_XLarge.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks2_Large.png b/Assets/Female3DCG/Socks/Hogtied/Socks2_Large.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks2_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Socks2_Normal.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks2_Small.png b/Assets/Female3DCG/Socks/Hogtied/Socks2_Small.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks2_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Socks2_XLarge.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks3_Large.png b/Assets/Female3DCG/Socks/Hogtied/Socks3_Large.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks3_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Socks3_Normal.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks3_Small.png b/Assets/Female3DCG/Socks/Hogtied/Socks3_Small.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks3_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Socks3_XLarge.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks4_Large.png b/Assets/Female3DCG/Socks/Hogtied/Socks4_Large.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks4_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Socks4_Normal.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks4_Small.png b/Assets/Female3DCG/Socks/Hogtied/Socks4_Small.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks4_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Socks4_XLarge.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks5_Large.png b/Assets/Female3DCG/Socks/Hogtied/Socks5_Large.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks5_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Socks5_Normal.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks5_Small.png b/Assets/Female3DCG/Socks/Hogtied/Socks5_Small.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks5_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Socks5_XLarge.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks6_Large_Frill.png b/Assets/Female3DCG/Socks/Hogtied/Socks6_Large_Frill.png deleted file mode 100644 index 95201fdbb..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks6_Large_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks6_Large_Sock.png b/Assets/Female3DCG/Socks/Hogtied/Socks6_Large_Sock.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks6_Large_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks6_Normal_Frill.png b/Assets/Female3DCG/Socks/Hogtied/Socks6_Normal_Frill.png deleted file mode 100644 index f844a43c3..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks6_Normal_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks6_Normal_Sock.png b/Assets/Female3DCG/Socks/Hogtied/Socks6_Normal_Sock.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks6_Normal_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks6_Small_Frill.png b/Assets/Female3DCG/Socks/Hogtied/Socks6_Small_Frill.png deleted file mode 100644 index 93724c70f..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks6_Small_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks6_Small_Sock.png b/Assets/Female3DCG/Socks/Hogtied/Socks6_Small_Sock.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks6_Small_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks6_XLarge_Frill.png b/Assets/Female3DCG/Socks/Hogtied/Socks6_XLarge_Frill.png deleted file mode 100644 index 1c194ef23..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks6_XLarge_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Socks6_XLarge_Sock.png b/Assets/Female3DCG/Socks/Hogtied/Socks6_XLarge_Sock.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Socks6_XLarge_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Large_Fabric.png b/Assets/Female3DCG/Socks/Hogtied/SocksFur_Large_Fabric.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Large_Fur.png b/Assets/Female3DCG/Socks/Hogtied/SocksFur_Large_Fur.png deleted file mode 100644 index 7beb97ca1..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Normal_Fabric.png b/Assets/Female3DCG/Socks/Hogtied/SocksFur_Normal_Fabric.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Normal_Fur.png b/Assets/Female3DCG/Socks/Hogtied/SocksFur_Normal_Fur.png deleted file mode 100644 index 5527eb5df..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Small_Fabric.png b/Assets/Female3DCG/Socks/Hogtied/SocksFur_Small_Fabric.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Small_Fur.png b/Assets/Female3DCG/Socks/Hogtied/SocksFur_Small_Fur.png deleted file mode 100644 index 8a63630b2..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksFur_XLarge_Fabric.png b/Assets/Female3DCG/Socks/Hogtied/SocksFur_XLarge_Fabric.png deleted file mode 100644 index d3cabae4d..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksFur_XLarge_Fur.png b/Assets/Female3DCG/Socks/Hogtied/SocksFur_XLarge_Fur.png deleted file mode 100644 index 7acce49a0..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Large_Dark.png b/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Large_Dark.png deleted file mode 100644 index 3c9dc6ab0..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Large_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Large_Light.png b/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Large_Light.png deleted file mode 100644 index 38b8b8d52..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Large_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Normal_Dark.png b/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Normal_Dark.png deleted file mode 100644 index ad0022aea..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Normal_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Normal_Light.png b/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Normal_Light.png deleted file mode 100644 index a6d81754a..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Normal_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Small_Dark.png b/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Small_Dark.png deleted file mode 100644 index 0bac683f4..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Small_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Small_Light.png b/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Small_Light.png deleted file mode 100644 index 8170246c7..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_Small_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_XLarge_Dark.png b/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_XLarge_Dark.png deleted file mode 100644 index 5e0a7fe08..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_XLarge_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_XLarge_Light.png b/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_XLarge_Light.png deleted file mode 100644 index 0bb5c3c98..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/SocksStriped1_XLarge_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings1_Large.png b/Assets/Female3DCG/Socks/Hogtied/Stockings1_Large.png deleted file mode 100644 index a77e1d57b..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings1_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Stockings1_Normal.png deleted file mode 100644 index a77e1d57b..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings1_Small.png b/Assets/Female3DCG/Socks/Hogtied/Stockings1_Small.png deleted file mode 100644 index a77e1d57b..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings1_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Stockings1_XLarge.png deleted file mode 100644 index a77e1d57b..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings2_Large.png b/Assets/Female3DCG/Socks/Hogtied/Stockings2_Large.png deleted file mode 100644 index a8a3e39c4..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings2_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Stockings2_Normal.png deleted file mode 100644 index a8a3e39c4..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings2_Small.png b/Assets/Female3DCG/Socks/Hogtied/Stockings2_Small.png deleted file mode 100644 index a8a3e39c4..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings2_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Stockings2_XLarge.png deleted file mode 100644 index a8a3e39c4..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings3_Large.png b/Assets/Female3DCG/Socks/Hogtied/Stockings3_Large.png deleted file mode 100644 index d96c3d5cd..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings3_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Stockings3_Normal.png deleted file mode 100644 index d96c3d5cd..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings3_Small.png b/Assets/Female3DCG/Socks/Hogtied/Stockings3_Small.png deleted file mode 100644 index d96c3d5cd..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings3_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Stockings3_XLarge.png deleted file mode 100644 index d96c3d5cd..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings4_Large.png b/Assets/Female3DCG/Socks/Hogtied/Stockings4_Large.png deleted file mode 100644 index d62e7ef18..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings4_Normal.png b/Assets/Female3DCG/Socks/Hogtied/Stockings4_Normal.png deleted file mode 100644 index d62e7ef18..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings4_Small.png b/Assets/Female3DCG/Socks/Hogtied/Stockings4_Small.png deleted file mode 100644 index d62e7ef18..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Hogtied/Stockings4_XLarge.png b/Assets/Female3DCG/Socks/Hogtied/Stockings4_XLarge.png deleted file mode 100644 index d62e7ef18..000000000 Binary files a/Assets/Female3DCG/Socks/Hogtied/Stockings4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_Large.png b/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_Large.png deleted file mode 100644 index dde13f907..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_Normal.png b/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_Normal.png deleted file mode 100644 index bcd712455..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_Small.png b/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_Small.png deleted file mode 100644 index 56f0687a7..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_XLarge.png b/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_XLarge.png deleted file mode 100644 index c75c8591d..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/CowPrintedSocks_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_Large.png b/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_Large.png deleted file mode 100644 index 23b00856d..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_Normal.png b/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_Normal.png deleted file mode 100644 index cb19ef793..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_Small.png b/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_Small.png deleted file mode 100644 index 3bcd4db3d..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_XLarge.png b/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_XLarge.png deleted file mode 100644 index 055a6a70a..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/FootlessSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Large_Bands.png b/Assets/Female3DCG/Socks/Kneel/HaremStockings_Large_Bands.png deleted file mode 100644 index fe7266fbf..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Large_Fabric.png b/Assets/Female3DCG/Socks/Kneel/HaremStockings_Large_Fabric.png deleted file mode 100644 index d7fc78c5d..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Normal_Bands.png b/Assets/Female3DCG/Socks/Kneel/HaremStockings_Normal_Bands.png deleted file mode 100644 index f3e0a217c..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Normal_Fabric.png b/Assets/Female3DCG/Socks/Kneel/HaremStockings_Normal_Fabric.png deleted file mode 100644 index 16a8649ab..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Small_Bands.png b/Assets/Female3DCG/Socks/Kneel/HaremStockings_Small_Bands.png deleted file mode 100644 index 884f3e0e3..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Small_Fabric.png b/Assets/Female3DCG/Socks/Kneel/HaremStockings_Small_Fabric.png deleted file mode 100644 index 88500698c..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/HaremStockings_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/HaremStockings_XLarge_Bands.png b/Assets/Female3DCG/Socks/Kneel/HaremStockings_XLarge_Bands.png deleted file mode 100644 index c2b6c8ead..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/HaremStockings_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/HaremStockings_XLarge_Fabric.png b/Assets/Female3DCG/Socks/Kneel/HaremStockings_XLarge_Fabric.png deleted file mode 100644 index 35e312f49..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/HaremStockings_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/LatexSocks1_Large.png b/Assets/Female3DCG/Socks/Kneel/LatexSocks1_Large.png deleted file mode 100644 index bcb85015d..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/LatexSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/LatexSocks1_Normal.png b/Assets/Female3DCG/Socks/Kneel/LatexSocks1_Normal.png deleted file mode 100644 index c0641a402..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/LatexSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/LatexSocks1_Small.png b/Assets/Female3DCG/Socks/Kneel/LatexSocks1_Small.png deleted file mode 100644 index 37c9b37e2..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/LatexSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/LatexSocks1_XLarge.png b/Assets/Female3DCG/Socks/Kneel/LatexSocks1_XLarge.png deleted file mode 100644 index 2e3a6c192..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/LatexSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_Large.png b/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_Large.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_Normal.png b/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_Normal.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_Small.png b/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_Small.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_XLarge.png b/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_XLarge.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/LeatherSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Pantyhose1_Large.png b/Assets/Female3DCG/Socks/Kneel/Pantyhose1_Large.png deleted file mode 100644 index 34ddedf96..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Pantyhose1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Pantyhose1_Normal.png b/Assets/Female3DCG/Socks/Kneel/Pantyhose1_Normal.png deleted file mode 100644 index 1be78ed24..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Pantyhose1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Pantyhose1_Small.png b/Assets/Female3DCG/Socks/Kneel/Pantyhose1_Small.png deleted file mode 100644 index 2c9cda000..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Pantyhose1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Pantyhose1_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Pantyhose1_XLarge.png deleted file mode 100644 index d568b490c..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Pantyhose1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Pantyhose2_Large.png b/Assets/Female3DCG/Socks/Kneel/Pantyhose2_Large.png deleted file mode 100644 index 745383c20..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Pantyhose2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Pantyhose2_Normal.png b/Assets/Female3DCG/Socks/Kneel/Pantyhose2_Normal.png deleted file mode 100644 index fe76707e2..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Pantyhose2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Pantyhose2_Small.png b/Assets/Female3DCG/Socks/Kneel/Pantyhose2_Small.png deleted file mode 100644 index 71747114c..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Pantyhose2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Pantyhose2_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Pantyhose2_XLarge.png deleted file mode 100644 index 1c6c1a6ea..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Pantyhose2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks0_Large.png b/Assets/Female3DCG/Socks/Kneel/Socks0_Large.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks0_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks0_Normal.png b/Assets/Female3DCG/Socks/Kneel/Socks0_Normal.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks0_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks0_Small.png b/Assets/Female3DCG/Socks/Kneel/Socks0_Small.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks0_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks0_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Socks0_XLarge.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks0_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks1_Large.png b/Assets/Female3DCG/Socks/Kneel/Socks1_Large.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks1_Normal.png b/Assets/Female3DCG/Socks/Kneel/Socks1_Normal.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks1_Small.png b/Assets/Female3DCG/Socks/Kneel/Socks1_Small.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks1_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Socks1_XLarge.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks2_Large.png b/Assets/Female3DCG/Socks/Kneel/Socks2_Large.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks2_Normal.png b/Assets/Female3DCG/Socks/Kneel/Socks2_Normal.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks2_Small.png b/Assets/Female3DCG/Socks/Kneel/Socks2_Small.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks2_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Socks2_XLarge.png deleted file mode 100644 index 06aaa7173..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks3_Large.png b/Assets/Female3DCG/Socks/Kneel/Socks3_Large.png deleted file mode 100644 index ec8e96777..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks3_Normal.png b/Assets/Female3DCG/Socks/Kneel/Socks3_Normal.png deleted file mode 100644 index 240960682..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks3_Small.png b/Assets/Female3DCG/Socks/Kneel/Socks3_Small.png deleted file mode 100644 index 426275903..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks3_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Socks3_XLarge.png deleted file mode 100644 index 3cb421e7b..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks4_Large.png b/Assets/Female3DCG/Socks/Kneel/Socks4_Large.png deleted file mode 100644 index be753ff2c..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks4_Normal.png b/Assets/Female3DCG/Socks/Kneel/Socks4_Normal.png deleted file mode 100644 index d80ba9f9f..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks4_Small.png b/Assets/Female3DCG/Socks/Kneel/Socks4_Small.png deleted file mode 100644 index 91c10e235..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks4_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Socks4_XLarge.png deleted file mode 100644 index 09152dff7..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks5_Large.png b/Assets/Female3DCG/Socks/Kneel/Socks5_Large.png deleted file mode 100644 index 4dec36530..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks5_Normal.png b/Assets/Female3DCG/Socks/Kneel/Socks5_Normal.png deleted file mode 100644 index 0c7dc7bca..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks5_Small.png b/Assets/Female3DCG/Socks/Kneel/Socks5_Small.png deleted file mode 100644 index bb1e092a0..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks5_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Socks5_XLarge.png deleted file mode 100644 index 1e9369511..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks6_Large_Frill.png b/Assets/Female3DCG/Socks/Kneel/Socks6_Large_Frill.png deleted file mode 100644 index e370b0c59..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks6_Large_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks6_Large_Sock.png b/Assets/Female3DCG/Socks/Kneel/Socks6_Large_Sock.png deleted file mode 100644 index 023dc6434..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks6_Large_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks6_Normal_Frill.png b/Assets/Female3DCG/Socks/Kneel/Socks6_Normal_Frill.png deleted file mode 100644 index 68c3db198..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks6_Normal_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks6_Normal_Sock.png b/Assets/Female3DCG/Socks/Kneel/Socks6_Normal_Sock.png deleted file mode 100644 index 4ae7fde3f..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks6_Normal_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks6_Small_Frill.png b/Assets/Female3DCG/Socks/Kneel/Socks6_Small_Frill.png deleted file mode 100644 index cec53ce90..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks6_Small_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks6_Small_Sock.png b/Assets/Female3DCG/Socks/Kneel/Socks6_Small_Sock.png deleted file mode 100644 index 4165692f9..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks6_Small_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks6_XLarge_Frill.png b/Assets/Female3DCG/Socks/Kneel/Socks6_XLarge_Frill.png deleted file mode 100644 index 540211463..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks6_XLarge_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Socks6_XLarge_Sock.png b/Assets/Female3DCG/Socks/Kneel/Socks6_XLarge_Sock.png deleted file mode 100644 index 824c261d0..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Socks6_XLarge_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksFur_Large_Fabric.png b/Assets/Female3DCG/Socks/Kneel/SocksFur_Large_Fabric.png deleted file mode 100644 index be753ff2c..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksFur_Large_Fur.png b/Assets/Female3DCG/Socks/Kneel/SocksFur_Large_Fur.png deleted file mode 100644 index 260108995..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksFur_Normal_Fabric.png b/Assets/Female3DCG/Socks/Kneel/SocksFur_Normal_Fabric.png deleted file mode 100644 index d80ba9f9f..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksFur_Normal_Fur.png b/Assets/Female3DCG/Socks/Kneel/SocksFur_Normal_Fur.png deleted file mode 100644 index 8c2b7c3ad..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksFur_Small_Fabric.png b/Assets/Female3DCG/Socks/Kneel/SocksFur_Small_Fabric.png deleted file mode 100644 index 91c10e235..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksFur_Small_Fur.png b/Assets/Female3DCG/Socks/Kneel/SocksFur_Small_Fur.png deleted file mode 100644 index 0d815a1df..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksFur_XLarge_Fabric.png b/Assets/Female3DCG/Socks/Kneel/SocksFur_XLarge_Fabric.png deleted file mode 100644 index 09152dff7..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksFur_XLarge_Fur.png b/Assets/Female3DCG/Socks/Kneel/SocksFur_XLarge_Fur.png deleted file mode 100644 index fbf75204a..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Large_Dark.png b/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Large_Dark.png deleted file mode 100644 index ac47eca43..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Large_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Large_Light.png b/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Large_Light.png deleted file mode 100644 index 484e4a9c8..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Large_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Normal_Dark.png b/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Normal_Dark.png deleted file mode 100644 index 4cd901247..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Normal_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Normal_Light.png b/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Normal_Light.png deleted file mode 100644 index 3ba82e7f1..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Normal_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Small_Dark.png b/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Small_Dark.png deleted file mode 100644 index 8bfe46994..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Small_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Small_Light.png b/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Small_Light.png deleted file mode 100644 index 27fb86232..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_Small_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_XLarge_Dark.png b/Assets/Female3DCG/Socks/Kneel/SocksStriped1_XLarge_Dark.png deleted file mode 100644 index 65a37d823..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_XLarge_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_XLarge_Light.png b/Assets/Female3DCG/Socks/Kneel/SocksStriped1_XLarge_Light.png deleted file mode 100644 index 15009ea61..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/SocksStriped1_XLarge_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings1_Large.png b/Assets/Female3DCG/Socks/Kneel/Stockings1_Large.png deleted file mode 100644 index f48e8657d..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings1_Normal.png b/Assets/Female3DCG/Socks/Kneel/Stockings1_Normal.png deleted file mode 100644 index 39c8f96fb..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings1_Small.png b/Assets/Female3DCG/Socks/Kneel/Stockings1_Small.png deleted file mode 100644 index 678c174e5..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings1_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Stockings1_XLarge.png deleted file mode 100644 index 14c012e75..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings2_Large.png b/Assets/Female3DCG/Socks/Kneel/Stockings2_Large.png deleted file mode 100644 index 76f56d1b5..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings2_Normal.png b/Assets/Female3DCG/Socks/Kneel/Stockings2_Normal.png deleted file mode 100644 index a9fa6b88b..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings2_Small.png b/Assets/Female3DCG/Socks/Kneel/Stockings2_Small.png deleted file mode 100644 index 2da659bf0..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings2_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Stockings2_XLarge.png deleted file mode 100644 index 591162f7b..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings3_Large.png b/Assets/Female3DCG/Socks/Kneel/Stockings3_Large.png deleted file mode 100644 index 9f2391b54..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings3_Normal.png b/Assets/Female3DCG/Socks/Kneel/Stockings3_Normal.png deleted file mode 100644 index e84489cda..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings3_Small.png b/Assets/Female3DCG/Socks/Kneel/Stockings3_Small.png deleted file mode 100644 index 3cd067760..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings3_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Stockings3_XLarge.png deleted file mode 100644 index 9039fcd39..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings4_Large.png b/Assets/Female3DCG/Socks/Kneel/Stockings4_Large.png deleted file mode 100644 index ceca31bf7..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings4_Normal.png b/Assets/Female3DCG/Socks/Kneel/Stockings4_Normal.png deleted file mode 100644 index 0791e4598..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings4_Small.png b/Assets/Female3DCG/Socks/Kneel/Stockings4_Small.png deleted file mode 100644 index 19c364f2d..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Kneel/Stockings4_XLarge.png b/Assets/Female3DCG/Socks/Kneel/Stockings4_XLarge.png deleted file mode 100644 index 91eafb986..000000000 Binary files a/Assets/Female3DCG/Socks/Kneel/Stockings4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_Large.png deleted file mode 100644 index 0f1db625e..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_Normal.png deleted file mode 100644 index 8e13d16d8..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_Small.png deleted file mode 100644 index b39b28a2c..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_XLarge.png deleted file mode 100644 index 6ae080331..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/CowPrintedSocks_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_Large.png deleted file mode 100644 index 2e0c36c9a..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_Normal.png deleted file mode 100644 index 723f77880..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_Small.png deleted file mode 100644 index 645655b37..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_XLarge.png deleted file mode 100644 index b76252c2a..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/FootlessSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Large_Bands.png b/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Large_Bands.png deleted file mode 100644 index 437e071f1..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Large_Fabric.png b/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Large_Fabric.png deleted file mode 100644 index 887cbbdf5..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Normal_Bands.png b/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Normal_Bands.png deleted file mode 100644 index 6ecab9d72..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Normal_Fabric.png b/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Normal_Fabric.png deleted file mode 100644 index 1026663bc..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Small_Bands.png b/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Small_Bands.png deleted file mode 100644 index e4144f7a4..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Small_Fabric.png b/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Small_Fabric.png deleted file mode 100644 index 76735de76..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_XLarge_Bands.png b/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_XLarge_Bands.png deleted file mode 100644 index 1bb98c7fd..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_XLarge_Fabric.png b/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_XLarge_Fabric.png deleted file mode 100644 index 9f832c16d..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/HaremStockings_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_Large.png deleted file mode 100644 index fd185882a..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_Normal.png deleted file mode 100644 index f9114219e..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_Small.png deleted file mode 100644 index c5d528836..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_XLarge.png deleted file mode 100644 index 2d0bb4030..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/LatexSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_Large.png deleted file mode 100644 index cba9b4a30..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_Normal.png deleted file mode 100644 index b1e3dbed6..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_Small.png deleted file mode 100644 index 8c74121d2..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_XLarge.png deleted file mode 100644 index 633f9f72f..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_Large.png deleted file mode 100644 index ba4944355..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_Normal.png deleted file mode 100644 index 9a5e7241b..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_Small.png deleted file mode 100644 index cf8bd3634..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_XLarge.png deleted file mode 100644 index 1e769a940..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Pantyhose2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_Large.png deleted file mode 100644 index ea988bdca..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_Normal.png deleted file mode 100644 index 24225c69a..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_Small.png deleted file mode 100644 index d869f4068..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_XLarge.png deleted file mode 100644 index 9a774e214..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/ReverseBunnySuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks3_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks3_Large.png deleted file mode 100644 index 803de6d38..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks3_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks3_Normal.png deleted file mode 100644 index f567abbd0..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks3_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks3_Small.png deleted file mode 100644 index 36a29c0b0..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks3_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks3_XLarge.png deleted file mode 100644 index ad363a5fb..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks4_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks4_Large.png deleted file mode 100644 index 50fd93dfc..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks4_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks4_Normal.png deleted file mode 100644 index bd1566521..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks4_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks4_Small.png deleted file mode 100644 index 05d2bccdb..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks4_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks4_XLarge.png deleted file mode 100644 index 174779da8..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks5_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks5_Large.png deleted file mode 100644 index dc9e96b9a..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks5_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks5_Normal.png deleted file mode 100644 index 1e98c57ae..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks5_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks5_Small.png deleted file mode 100644 index cbce0c06f..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks5_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks5_XLarge.png deleted file mode 100644 index 6724f92cd..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Large_Frill.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Large_Frill.png deleted file mode 100644 index 594ddd408..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Large_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Large_Sock.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Large_Sock.png deleted file mode 100644 index cdd0d4702..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Large_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Normal_Frill.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Normal_Frill.png deleted file mode 100644 index 0f730eb8d..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Normal_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Normal_Sock.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Normal_Sock.png deleted file mode 100644 index 20434c769..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Normal_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Small_Frill.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Small_Frill.png deleted file mode 100644 index d8b15059a..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Small_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Small_Sock.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Small_Sock.png deleted file mode 100644 index e35de5d75..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_Small_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_XLarge_Frill.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks6_XLarge_Frill.png deleted file mode 100644 index 6ed14a3e4..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_XLarge_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_XLarge_Sock.png b/Assets/Female3DCG/Socks/KneelingSpread/Socks6_XLarge_Sock.png deleted file mode 100644 index 69985c589..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Socks6_XLarge_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_Large.png deleted file mode 100644 index f790ce147..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_Normal.png deleted file mode 100644 index 0138a2097..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_Small.png deleted file mode 100644 index c7f47ba67..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_XLarge.png deleted file mode 100644 index fb008b1da..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_Large.png deleted file mode 100644 index 21291f485..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_Normal.png deleted file mode 100644 index eb05483ef..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_Small.png deleted file mode 100644 index c2190e500..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_XLarge.png deleted file mode 100644 index 396651cf7..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_Large.png deleted file mode 100644 index d02c1d575..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_Normal.png deleted file mode 100644 index 8cf79a811..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_Small.png deleted file mode 100644 index 303bc39d0..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_XLarge.png deleted file mode 100644 index 2d76cc420..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_Large.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_Large.png deleted file mode 100644 index 007c675fd..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_Normal.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_Normal.png deleted file mode 100644 index 46d8bdb1c..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_Small.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_Small.png deleted file mode 100644 index 15dcbc0b0..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_XLarge.png b/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_XLarge.png deleted file mode 100644 index cf1e83cb9..000000000 Binary files a/Assets/Female3DCG/Socks/KneelingSpread/Stockings4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LatexSocks1_Large.png b/Assets/Female3DCG/Socks/LatexSocks1_Large.png deleted file mode 100644 index 6ca38292c..000000000 Binary files a/Assets/Female3DCG/Socks/LatexSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LatexSocks1_Normal.png b/Assets/Female3DCG/Socks/LatexSocks1_Normal.png deleted file mode 100644 index 1ebce900e..000000000 Binary files a/Assets/Female3DCG/Socks/LatexSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LatexSocks1_Small.png b/Assets/Female3DCG/Socks/LatexSocks1_Small.png deleted file mode 100644 index 3fb82d0e6..000000000 Binary files a/Assets/Female3DCG/Socks/LatexSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LatexSocks1_XLarge.png b/Assets/Female3DCG/Socks/LatexSocks1_XLarge.png deleted file mode 100644 index 13fa3b936..000000000 Binary files a/Assets/Female3DCG/Socks/LatexSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LeatherSocks1_Large.png b/Assets/Female3DCG/Socks/LeatherSocks1_Large.png deleted file mode 100644 index 0f38959b1..000000000 Binary files a/Assets/Female3DCG/Socks/LeatherSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LeatherSocks1_Normal.png b/Assets/Female3DCG/Socks/LeatherSocks1_Normal.png deleted file mode 100644 index 36a6b2fe2..000000000 Binary files a/Assets/Female3DCG/Socks/LeatherSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LeatherSocks1_Small.png b/Assets/Female3DCG/Socks/LeatherSocks1_Small.png deleted file mode 100644 index 8fbd6b355..000000000 Binary files a/Assets/Female3DCG/Socks/LeatherSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LeatherSocks1_XLarge.png b/Assets/Female3DCG/Socks/LeatherSocks1_XLarge.png deleted file mode 100644 index 05d67d974..000000000 Binary files a/Assets/Female3DCG/Socks/LeatherSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_Large.png b/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_Large.png deleted file mode 100644 index 6dcbf9833..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_Normal.png deleted file mode 100644 index 159264fd6..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_Small.png b/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_Small.png deleted file mode 100644 index 630478540..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_XLarge.png deleted file mode 100644 index 4726a2ebf..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/CowPrintedSocks_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_Large.png b/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_Large.png deleted file mode 100644 index 96d7ac68a..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_Normal.png deleted file mode 100644 index 76d57d784..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_Small.png b/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_Small.png deleted file mode 100644 index df689389e..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_XLarge.png deleted file mode 100644 index 4a9cdec47..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/FootlessSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Large_Bands.png b/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Large_Bands.png deleted file mode 100644 index baf230134..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Large_Fabric.png b/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Large_Fabric.png deleted file mode 100644 index f35ec8fcc..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Normal_Bands.png b/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Normal_Bands.png deleted file mode 100644 index f49807cad..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Normal_Fabric.png b/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Normal_Fabric.png deleted file mode 100644 index 69c72a21e..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Small_Bands.png b/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Small_Bands.png deleted file mode 100644 index 2a37108b2..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Small_Fabric.png b/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Small_Fabric.png deleted file mode 100644 index c22cfd3cd..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_XLarge_Bands.png b/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_XLarge_Bands.png deleted file mode 100644 index 8301861d9..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_XLarge_Fabric.png b/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_XLarge_Fabric.png deleted file mode 100644 index cb1c606c7..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/HaremStockings_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_Large.png b/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_Large.png deleted file mode 100644 index 4f17cdab4..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_Normal.png deleted file mode 100644 index 034a65b2d..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_Small.png b/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_Small.png deleted file mode 100644 index 537cb3bbc..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_XLarge.png deleted file mode 100644 index 8f8c05f1b..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/LatexSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_Large.png b/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_Large.png deleted file mode 100644 index c5a15b145..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_Normal.png deleted file mode 100644 index 0f9cea4f6..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_Small.png b/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_Small.png deleted file mode 100644 index 930b91cc4..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_XLarge.png deleted file mode 100644 index db4897b40..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/LeatherSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_Large.png deleted file mode 100644 index 7e1461124..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_Normal.png deleted file mode 100644 index 33f8f67a2..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_Small.png deleted file mode 100644 index de4f17d27..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_XLarge.png deleted file mode 100644 index d0279086b..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_Large.png deleted file mode 100644 index bf43fb6aa..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_Normal.png deleted file mode 100644 index f6e5c1f23..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_Small.png deleted file mode 100644 index 7b0c40816..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_XLarge.png deleted file mode 100644 index cfae3cd74..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Pantyhose2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks0_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Socks0_Large.png deleted file mode 100644 index 5a5f3137b..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks0_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks0_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Socks0_Normal.png deleted file mode 100644 index ee454e329..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks0_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks0_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Socks0_Small.png deleted file mode 100644 index 89febe5e6..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks0_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks0_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Socks0_XLarge.png deleted file mode 100644 index 24e5e11ba..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks0_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks1_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Socks1_Large.png deleted file mode 100644 index e646db18e..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks1_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Socks1_Normal.png deleted file mode 100644 index 3ff7fd697..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks1_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Socks1_Small.png deleted file mode 100644 index 1ddc29daf..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks1_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Socks1_XLarge.png deleted file mode 100644 index 524dd67be..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks2_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Socks2_Large.png deleted file mode 100644 index 769c12fac..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks2_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Socks2_Normal.png deleted file mode 100644 index a26854f74..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks2_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Socks2_Small.png deleted file mode 100644 index 5790a1baa..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks2_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Socks2_XLarge.png deleted file mode 100644 index 316f6757a..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks3_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Socks3_Large.png deleted file mode 100644 index 3ac851548..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks3_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Socks3_Normal.png deleted file mode 100644 index 1e9e34ebc..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks3_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Socks3_Small.png deleted file mode 100644 index 74791fb79..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks3_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Socks3_XLarge.png deleted file mode 100644 index 161575179..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks4_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Socks4_Large.png deleted file mode 100644 index 6e36307e2..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks4_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Socks4_Normal.png deleted file mode 100644 index 6b7713b7e..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks4_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Socks4_Small.png deleted file mode 100644 index b070a4dff..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks4_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Socks4_XLarge.png deleted file mode 100644 index c0cae7c46..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks5_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Socks5_Large.png deleted file mode 100644 index 8927bd482..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks5_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Socks5_Normal.png deleted file mode 100644 index 63b4a9cc2..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks5_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Socks5_Small.png deleted file mode 100644 index 81f9ebe8d..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks5_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Socks5_XLarge.png deleted file mode 100644 index 46932bdea..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Large_Frill.png b/Assets/Female3DCG/Socks/LegsClosed/Socks6_Large_Frill.png deleted file mode 100644 index a87e92dd7..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Large_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Large_Sock.png b/Assets/Female3DCG/Socks/LegsClosed/Socks6_Large_Sock.png deleted file mode 100644 index beb875e88..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Large_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Normal_Frill.png b/Assets/Female3DCG/Socks/LegsClosed/Socks6_Normal_Frill.png deleted file mode 100644 index e9d4f013b..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Normal_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Normal_Sock.png b/Assets/Female3DCG/Socks/LegsClosed/Socks6_Normal_Sock.png deleted file mode 100644 index c40fe4057..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Normal_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Small_Frill.png b/Assets/Female3DCG/Socks/LegsClosed/Socks6_Small_Frill.png deleted file mode 100644 index cb89415a1..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Small_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Small_Sock.png b/Assets/Female3DCG/Socks/LegsClosed/Socks6_Small_Sock.png deleted file mode 100644 index e4bd18b82..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks6_Small_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks6_XLarge_Frill.png b/Assets/Female3DCG/Socks/LegsClosed/Socks6_XLarge_Frill.png deleted file mode 100644 index ac315081e..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks6_XLarge_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Socks6_XLarge_Sock.png b/Assets/Female3DCG/Socks/LegsClosed/Socks6_XLarge_Sock.png deleted file mode 100644 index ba4719242..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Socks6_XLarge_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Large_Fabric.png b/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Large_Fabric.png deleted file mode 100644 index 6e36307e2..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Large_Fur.png b/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Large_Fur.png deleted file mode 100644 index 0949bd5e7..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Normal_Fabric.png b/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Normal_Fabric.png deleted file mode 100644 index 6b7713b7e..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Normal_Fur.png b/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Normal_Fur.png deleted file mode 100644 index 7553bbbd3..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Small_Fabric.png b/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Small_Fabric.png deleted file mode 100644 index b070a4dff..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Small_Fur.png b/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Small_Fur.png deleted file mode 100644 index 99958fc9a..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_XLarge_Fabric.png b/Assets/Female3DCG/Socks/LegsClosed/SocksFur_XLarge_Fabric.png deleted file mode 100644 index c0cae7c46..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_XLarge_Fur.png b/Assets/Female3DCG/Socks/LegsClosed/SocksFur_XLarge_Fur.png deleted file mode 100644 index 9ae7cbdfc..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Large_Dark.png b/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Large_Dark.png deleted file mode 100644 index cdef3938b..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Large_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Large_Light.png b/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Large_Light.png deleted file mode 100644 index 09a240469..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Large_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Normal_Dark.png b/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Normal_Dark.png deleted file mode 100644 index 6b63f99ce..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Normal_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Normal_Light.png b/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Normal_Light.png deleted file mode 100644 index d78d373c6..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Normal_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Small_Dark.png b/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Small_Dark.png deleted file mode 100644 index 54cbd9d73..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Small_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Small_Light.png b/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Small_Light.png deleted file mode 100644 index 21c40a5de..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_Small_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_XLarge_Dark.png b/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_XLarge_Dark.png deleted file mode 100644 index 7fc4b9f8e..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_XLarge_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_XLarge_Light.png b/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_XLarge_Light.png deleted file mode 100644 index 0aafaec92..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/SocksStriped1_XLarge_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings1_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings1_Large.png deleted file mode 100644 index a0151c959..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings1_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings1_Normal.png deleted file mode 100644 index dc78978d6..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings1_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings1_Small.png deleted file mode 100644 index 0b71802ea..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings1_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings1_XLarge.png deleted file mode 100644 index 7629e317c..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings2_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings2_Large.png deleted file mode 100644 index 8c8092949..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings2_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings2_Normal.png deleted file mode 100644 index 56a0b178e..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings2_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings2_Small.png deleted file mode 100644 index 699356671..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings2_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings2_XLarge.png deleted file mode 100644 index f128585e3..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings3_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings3_Large.png deleted file mode 100644 index f90e6143c..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings3_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings3_Normal.png deleted file mode 100644 index de2c82a50..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings3_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings3_Small.png deleted file mode 100644 index 4a293265e..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings3_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings3_XLarge.png deleted file mode 100644 index f8ec7c3a3..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings4_Large.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings4_Large.png deleted file mode 100644 index b711484dc..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings4_Normal.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings4_Normal.png deleted file mode 100644 index 8025eb57e..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings4_Small.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings4_Small.png deleted file mode 100644 index 1327118b5..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/LegsClosed/Stockings4_XLarge.png b/Assets/Female3DCG/Socks/LegsClosed/Stockings4_XLarge.png deleted file mode 100644 index 8cdbd0483..000000000 Binary files a/Assets/Female3DCG/Socks/LegsClosed/Stockings4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Pantyhose1_Large.png b/Assets/Female3DCG/Socks/Pantyhose1_Large.png deleted file mode 100644 index 955cfac3f..000000000 Binary files a/Assets/Female3DCG/Socks/Pantyhose1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Pantyhose1_Normal.png b/Assets/Female3DCG/Socks/Pantyhose1_Normal.png deleted file mode 100644 index ce4559acb..000000000 Binary files a/Assets/Female3DCG/Socks/Pantyhose1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Pantyhose1_Small.png b/Assets/Female3DCG/Socks/Pantyhose1_Small.png deleted file mode 100644 index 9645d47a4..000000000 Binary files a/Assets/Female3DCG/Socks/Pantyhose1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Pantyhose1_XLarge.png b/Assets/Female3DCG/Socks/Pantyhose1_XLarge.png deleted file mode 100644 index fa1055510..000000000 Binary files a/Assets/Female3DCG/Socks/Pantyhose1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Pantyhose2_Large.png b/Assets/Female3DCG/Socks/Pantyhose2_Large.png deleted file mode 100644 index 4a2d0b47e..000000000 Binary files a/Assets/Female3DCG/Socks/Pantyhose2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Pantyhose2_Normal.png b/Assets/Female3DCG/Socks/Pantyhose2_Normal.png deleted file mode 100644 index a4edca0f0..000000000 Binary files a/Assets/Female3DCG/Socks/Pantyhose2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Pantyhose2_Small.png b/Assets/Female3DCG/Socks/Pantyhose2_Small.png deleted file mode 100644 index 0d0734044..000000000 Binary files a/Assets/Female3DCG/Socks/Pantyhose2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Pantyhose2_XLarge.png b/Assets/Female3DCG/Socks/Pantyhose2_XLarge.png deleted file mode 100644 index 5a79cccf2..000000000 Binary files a/Assets/Female3DCG/Socks/Pantyhose2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/CowPrintedSocks.png b/Assets/Female3DCG/Socks/Preview/CowPrintedSocks.png deleted file mode 100644 index 2d0a258bd..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/CowPrintedSocks.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/FootlessSocks1.png b/Assets/Female3DCG/Socks/Preview/FootlessSocks1.png deleted file mode 100644 index e0c235488..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/FootlessSocks1.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/HaremStockings.png b/Assets/Female3DCG/Socks/Preview/HaremStockings.png deleted file mode 100644 index 55d1546f4..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/HaremStockings.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/LatexSocks1.png b/Assets/Female3DCG/Socks/Preview/LatexSocks1.png deleted file mode 100644 index 8589bed8f..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/LatexSocks1.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/LeatherSocks1.png b/Assets/Female3DCG/Socks/Preview/LeatherSocks1.png deleted file mode 100644 index e20eb61a9..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/LeatherSocks1.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Pantyhose1.png b/Assets/Female3DCG/Socks/Preview/Pantyhose1.png deleted file mode 100644 index 5d20d8bbf..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Pantyhose1.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Pantyhose2.png b/Assets/Female3DCG/Socks/Preview/Pantyhose2.png deleted file mode 100644 index 57ea5e399..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Pantyhose2.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Socks0.png b/Assets/Female3DCG/Socks/Preview/Socks0.png deleted file mode 100644 index 39a6774f0..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Socks0.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Socks1.png b/Assets/Female3DCG/Socks/Preview/Socks1.png deleted file mode 100644 index b511e0231..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Socks1.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Socks2.png b/Assets/Female3DCG/Socks/Preview/Socks2.png deleted file mode 100644 index 6094daf23..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Socks2.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Socks3.png b/Assets/Female3DCG/Socks/Preview/Socks3.png deleted file mode 100644 index 62a54105b..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Socks3.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Socks4.png b/Assets/Female3DCG/Socks/Preview/Socks4.png deleted file mode 100644 index 99fc781e1..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Socks4.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Socks5.png b/Assets/Female3DCG/Socks/Preview/Socks5.png deleted file mode 100644 index e931a8a54..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Socks5.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Socks6.png b/Assets/Female3DCG/Socks/Preview/Socks6.png deleted file mode 100644 index 5daffba95..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Socks6.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/SocksFur.png b/Assets/Female3DCG/Socks/Preview/SocksFur.png deleted file mode 100644 index 8bc1ee878..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/SocksFur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/SocksStriped1.png b/Assets/Female3DCG/Socks/Preview/SocksStriped1.png deleted file mode 100644 index 6437424c5..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/SocksStriped1.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Stockings1.png b/Assets/Female3DCG/Socks/Preview/Stockings1.png deleted file mode 100644 index b9a7230f8..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Stockings1.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Stockings2.png b/Assets/Female3DCG/Socks/Preview/Stockings2.png deleted file mode 100644 index c565174e6..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Stockings2.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Stockings3.png b/Assets/Female3DCG/Socks/Preview/Stockings3.png deleted file mode 100644 index a920a6ccb..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Stockings3.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Preview/Stockings4.png b/Assets/Female3DCG/Socks/Preview/Stockings4.png deleted file mode 100644 index fad21ea0a..000000000 Binary files a/Assets/Female3DCG/Socks/Preview/Stockings4.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks0_Large.png b/Assets/Female3DCG/Socks/Socks0_Large.png deleted file mode 100644 index e73653dbd..000000000 Binary files a/Assets/Female3DCG/Socks/Socks0_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks0_Normal.png b/Assets/Female3DCG/Socks/Socks0_Normal.png deleted file mode 100644 index 773d272de..000000000 Binary files a/Assets/Female3DCG/Socks/Socks0_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks0_Small.png b/Assets/Female3DCG/Socks/Socks0_Small.png deleted file mode 100644 index d63b0c180..000000000 Binary files a/Assets/Female3DCG/Socks/Socks0_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks0_XLarge.png b/Assets/Female3DCG/Socks/Socks0_XLarge.png deleted file mode 100644 index dd3095d0a..000000000 Binary files a/Assets/Female3DCG/Socks/Socks0_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks1_Large.png b/Assets/Female3DCG/Socks/Socks1_Large.png deleted file mode 100644 index e6243782a..000000000 Binary files a/Assets/Female3DCG/Socks/Socks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks1_Normal.png b/Assets/Female3DCG/Socks/Socks1_Normal.png deleted file mode 100644 index 17a1e2239..000000000 Binary files a/Assets/Female3DCG/Socks/Socks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks1_Small.png b/Assets/Female3DCG/Socks/Socks1_Small.png deleted file mode 100644 index 22af02f4f..000000000 Binary files a/Assets/Female3DCG/Socks/Socks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks1_XLarge.png b/Assets/Female3DCG/Socks/Socks1_XLarge.png deleted file mode 100644 index 3716c5940..000000000 Binary files a/Assets/Female3DCG/Socks/Socks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks2_Large.png b/Assets/Female3DCG/Socks/Socks2_Large.png deleted file mode 100644 index 832386db9..000000000 Binary files a/Assets/Female3DCG/Socks/Socks2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks2_Normal.png b/Assets/Female3DCG/Socks/Socks2_Normal.png deleted file mode 100644 index daa9c76db..000000000 Binary files a/Assets/Female3DCG/Socks/Socks2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks2_Small.png b/Assets/Female3DCG/Socks/Socks2_Small.png deleted file mode 100644 index 5e46235f1..000000000 Binary files a/Assets/Female3DCG/Socks/Socks2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks2_XLarge.png b/Assets/Female3DCG/Socks/Socks2_XLarge.png deleted file mode 100644 index 106e9a67f..000000000 Binary files a/Assets/Female3DCG/Socks/Socks2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks3_Large.png b/Assets/Female3DCG/Socks/Socks3_Large.png deleted file mode 100644 index e9bcedcb0..000000000 Binary files a/Assets/Female3DCG/Socks/Socks3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks3_Normal.png b/Assets/Female3DCG/Socks/Socks3_Normal.png deleted file mode 100644 index afd5d6baa..000000000 Binary files a/Assets/Female3DCG/Socks/Socks3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks3_Small.png b/Assets/Female3DCG/Socks/Socks3_Small.png deleted file mode 100644 index 55842859a..000000000 Binary files a/Assets/Female3DCG/Socks/Socks3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks3_XLarge.png b/Assets/Female3DCG/Socks/Socks3_XLarge.png deleted file mode 100644 index d55fa26f7..000000000 Binary files a/Assets/Female3DCG/Socks/Socks3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks4_Large.png b/Assets/Female3DCG/Socks/Socks4_Large.png deleted file mode 100644 index e878e17ed..000000000 Binary files a/Assets/Female3DCG/Socks/Socks4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks4_Normal.png b/Assets/Female3DCG/Socks/Socks4_Normal.png deleted file mode 100644 index 81c3e6146..000000000 Binary files a/Assets/Female3DCG/Socks/Socks4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks4_Small.png b/Assets/Female3DCG/Socks/Socks4_Small.png deleted file mode 100644 index b66292960..000000000 Binary files a/Assets/Female3DCG/Socks/Socks4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks4_XLarge.png b/Assets/Female3DCG/Socks/Socks4_XLarge.png deleted file mode 100644 index 156188551..000000000 Binary files a/Assets/Female3DCG/Socks/Socks4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks5_Large.png b/Assets/Female3DCG/Socks/Socks5_Large.png deleted file mode 100644 index 18a8989d8..000000000 Binary files a/Assets/Female3DCG/Socks/Socks5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks5_Normal.png b/Assets/Female3DCG/Socks/Socks5_Normal.png deleted file mode 100644 index 12f7c81b4..000000000 Binary files a/Assets/Female3DCG/Socks/Socks5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks5_Small.png b/Assets/Female3DCG/Socks/Socks5_Small.png deleted file mode 100644 index 3e37b4913..000000000 Binary files a/Assets/Female3DCG/Socks/Socks5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks5_XLarge.png b/Assets/Female3DCG/Socks/Socks5_XLarge.png deleted file mode 100644 index 5376ced69..000000000 Binary files a/Assets/Female3DCG/Socks/Socks5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks6_Large_Frill.png b/Assets/Female3DCG/Socks/Socks6_Large_Frill.png deleted file mode 100644 index b84721cba..000000000 Binary files a/Assets/Female3DCG/Socks/Socks6_Large_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks6_Large_Sock.png b/Assets/Female3DCG/Socks/Socks6_Large_Sock.png deleted file mode 100644 index 4bae390f5..000000000 Binary files a/Assets/Female3DCG/Socks/Socks6_Large_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks6_Normal_Frill.png b/Assets/Female3DCG/Socks/Socks6_Normal_Frill.png deleted file mode 100644 index 2bcfaf7e4..000000000 Binary files a/Assets/Female3DCG/Socks/Socks6_Normal_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks6_Normal_Sock.png b/Assets/Female3DCG/Socks/Socks6_Normal_Sock.png deleted file mode 100644 index a266e67a6..000000000 Binary files a/Assets/Female3DCG/Socks/Socks6_Normal_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks6_Small_Frill.png b/Assets/Female3DCG/Socks/Socks6_Small_Frill.png deleted file mode 100644 index 82109fc52..000000000 Binary files a/Assets/Female3DCG/Socks/Socks6_Small_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks6_Small_Sock.png b/Assets/Female3DCG/Socks/Socks6_Small_Sock.png deleted file mode 100644 index 594708b3e..000000000 Binary files a/Assets/Female3DCG/Socks/Socks6_Small_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks6_XLarge_Frill.png b/Assets/Female3DCG/Socks/Socks6_XLarge_Frill.png deleted file mode 100644 index 51b262a5c..000000000 Binary files a/Assets/Female3DCG/Socks/Socks6_XLarge_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Socks6_XLarge_Sock.png b/Assets/Female3DCG/Socks/Socks6_XLarge_Sock.png deleted file mode 100644 index 6e154ff39..000000000 Binary files a/Assets/Female3DCG/Socks/Socks6_XLarge_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksFur_Large_Fabric.png b/Assets/Female3DCG/Socks/SocksFur_Large_Fabric.png deleted file mode 100644 index e878e17ed..000000000 Binary files a/Assets/Female3DCG/Socks/SocksFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksFur_Large_Fur.png b/Assets/Female3DCG/Socks/SocksFur_Large_Fur.png deleted file mode 100644 index 310b88574..000000000 Binary files a/Assets/Female3DCG/Socks/SocksFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksFur_Normal_Fabric.png b/Assets/Female3DCG/Socks/SocksFur_Normal_Fabric.png deleted file mode 100644 index 81c3e6146..000000000 Binary files a/Assets/Female3DCG/Socks/SocksFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksFur_Normal_Fur.png b/Assets/Female3DCG/Socks/SocksFur_Normal_Fur.png deleted file mode 100644 index 2b0b1716f..000000000 Binary files a/Assets/Female3DCG/Socks/SocksFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksFur_Small_Fabric.png b/Assets/Female3DCG/Socks/SocksFur_Small_Fabric.png deleted file mode 100644 index b66292960..000000000 Binary files a/Assets/Female3DCG/Socks/SocksFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksFur_Small_Fur.png b/Assets/Female3DCG/Socks/SocksFur_Small_Fur.png deleted file mode 100644 index dd4aa1c8b..000000000 Binary files a/Assets/Female3DCG/Socks/SocksFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksFur_XLarge_Fabric.png b/Assets/Female3DCG/Socks/SocksFur_XLarge_Fabric.png deleted file mode 100644 index 156188551..000000000 Binary files a/Assets/Female3DCG/Socks/SocksFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksFur_XLarge_Fur.png b/Assets/Female3DCG/Socks/SocksFur_XLarge_Fur.png deleted file mode 100644 index baab9bbbe..000000000 Binary files a/Assets/Female3DCG/Socks/SocksFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksStriped1_Large_Dark.png b/Assets/Female3DCG/Socks/SocksStriped1_Large_Dark.png deleted file mode 100644 index 48e945229..000000000 Binary files a/Assets/Female3DCG/Socks/SocksStriped1_Large_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksStriped1_Large_Light.png b/Assets/Female3DCG/Socks/SocksStriped1_Large_Light.png deleted file mode 100644 index f9fdfeab7..000000000 Binary files a/Assets/Female3DCG/Socks/SocksStriped1_Large_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksStriped1_Normal_Dark.png b/Assets/Female3DCG/Socks/SocksStriped1_Normal_Dark.png deleted file mode 100644 index c0f957130..000000000 Binary files a/Assets/Female3DCG/Socks/SocksStriped1_Normal_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksStriped1_Normal_Light.png b/Assets/Female3DCG/Socks/SocksStriped1_Normal_Light.png deleted file mode 100644 index b779d3bf2..000000000 Binary files a/Assets/Female3DCG/Socks/SocksStriped1_Normal_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksStriped1_Small_Dark.png b/Assets/Female3DCG/Socks/SocksStriped1_Small_Dark.png deleted file mode 100644 index fb93d73a3..000000000 Binary files a/Assets/Female3DCG/Socks/SocksStriped1_Small_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksStriped1_Small_Light.png b/Assets/Female3DCG/Socks/SocksStriped1_Small_Light.png deleted file mode 100644 index 436f48cf4..000000000 Binary files a/Assets/Female3DCG/Socks/SocksStriped1_Small_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksStriped1_XLarge_Dark.png b/Assets/Female3DCG/Socks/SocksStriped1_XLarge_Dark.png deleted file mode 100644 index 318ce9702..000000000 Binary files a/Assets/Female3DCG/Socks/SocksStriped1_XLarge_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/SocksStriped1_XLarge_Light.png b/Assets/Female3DCG/Socks/SocksStriped1_XLarge_Light.png deleted file mode 100644 index d35c70b30..000000000 Binary files a/Assets/Female3DCG/Socks/SocksStriped1_XLarge_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_Large.png b/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_Large.png deleted file mode 100644 index 300cc700f..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_Normal.png b/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_Normal.png deleted file mode 100644 index 486ab04bf..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_Small.png b/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_Small.png deleted file mode 100644 index ebd9c0270..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_XLarge.png b/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_XLarge.png deleted file mode 100644 index 454bb3a62..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/CowPrintedSocks_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/FootlessSocks1_Large.png b/Assets/Female3DCG/Socks/Spread/FootlessSocks1_Large.png deleted file mode 100644 index 12e78230f..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/FootlessSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/FootlessSocks1_Normal.png b/Assets/Female3DCG/Socks/Spread/FootlessSocks1_Normal.png deleted file mode 100644 index 30f25b0eb..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/FootlessSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/FootlessSocks1_Small.png b/Assets/Female3DCG/Socks/Spread/FootlessSocks1_Small.png deleted file mode 100644 index 7aa2bc36e..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/FootlessSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/FootlessSocks1_XLarge.png b/Assets/Female3DCG/Socks/Spread/FootlessSocks1_XLarge.png deleted file mode 100644 index a8ebe1683..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/FootlessSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/HaremStockings_Large_Bands.png b/Assets/Female3DCG/Socks/Spread/HaremStockings_Large_Bands.png deleted file mode 100644 index c88d2021a..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/HaremStockings_Large_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/HaremStockings_Large_Fabric.png b/Assets/Female3DCG/Socks/Spread/HaremStockings_Large_Fabric.png deleted file mode 100644 index 94b9e8daf..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/HaremStockings_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/HaremStockings_Normal_Bands.png b/Assets/Female3DCG/Socks/Spread/HaremStockings_Normal_Bands.png deleted file mode 100644 index 6e694ee1d..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/HaremStockings_Normal_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/HaremStockings_Normal_Fabric.png b/Assets/Female3DCG/Socks/Spread/HaremStockings_Normal_Fabric.png deleted file mode 100644 index 5654f876c..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/HaremStockings_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/HaremStockings_Small_Bands.png b/Assets/Female3DCG/Socks/Spread/HaremStockings_Small_Bands.png deleted file mode 100644 index 870cb3566..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/HaremStockings_Small_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/HaremStockings_Small_Fabric.png b/Assets/Female3DCG/Socks/Spread/HaremStockings_Small_Fabric.png deleted file mode 100644 index 90094ea2f..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/HaremStockings_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/HaremStockings_XLarge_Bands.png b/Assets/Female3DCG/Socks/Spread/HaremStockings_XLarge_Bands.png deleted file mode 100644 index dac9543ff..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/HaremStockings_XLarge_Bands.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/HaremStockings_XLarge_Fabric.png b/Assets/Female3DCG/Socks/Spread/HaremStockings_XLarge_Fabric.png deleted file mode 100644 index aecea77d0..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/HaremStockings_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/LatexSocks1_Large.png b/Assets/Female3DCG/Socks/Spread/LatexSocks1_Large.png deleted file mode 100644 index 607988173..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/LatexSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/LatexSocks1_Normal.png b/Assets/Female3DCG/Socks/Spread/LatexSocks1_Normal.png deleted file mode 100644 index 747523a5c..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/LatexSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/LatexSocks1_Small.png b/Assets/Female3DCG/Socks/Spread/LatexSocks1_Small.png deleted file mode 100644 index 14a6533c6..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/LatexSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/LatexSocks1_XLarge.png b/Assets/Female3DCG/Socks/Spread/LatexSocks1_XLarge.png deleted file mode 100644 index d0d252892..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/LatexSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/LeatherSocks1_Large.png b/Assets/Female3DCG/Socks/Spread/LeatherSocks1_Large.png deleted file mode 100644 index d1d945260..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/LeatherSocks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/LeatherSocks1_Normal.png b/Assets/Female3DCG/Socks/Spread/LeatherSocks1_Normal.png deleted file mode 100644 index 134adcba0..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/LeatherSocks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/LeatherSocks1_Small.png b/Assets/Female3DCG/Socks/Spread/LeatherSocks1_Small.png deleted file mode 100644 index f588d848a..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/LeatherSocks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/LeatherSocks1_XLarge.png b/Assets/Female3DCG/Socks/Spread/LeatherSocks1_XLarge.png deleted file mode 100644 index 0fe9c8c82..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/LeatherSocks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Pantyhose1_Large.png b/Assets/Female3DCG/Socks/Spread/Pantyhose1_Large.png deleted file mode 100644 index 780cc6373..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Pantyhose1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Pantyhose1_Normal.png b/Assets/Female3DCG/Socks/Spread/Pantyhose1_Normal.png deleted file mode 100644 index 6bbcda5a9..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Pantyhose1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Pantyhose1_Small.png b/Assets/Female3DCG/Socks/Spread/Pantyhose1_Small.png deleted file mode 100644 index 8d347d0d5..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Pantyhose1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Pantyhose1_XLarge.png b/Assets/Female3DCG/Socks/Spread/Pantyhose1_XLarge.png deleted file mode 100644 index 004eb9192..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Pantyhose1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Pantyhose2_Large.png b/Assets/Female3DCG/Socks/Spread/Pantyhose2_Large.png deleted file mode 100644 index c12698e79..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Pantyhose2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Pantyhose2_Normal.png b/Assets/Female3DCG/Socks/Spread/Pantyhose2_Normal.png deleted file mode 100644 index 883fad98c..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Pantyhose2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Pantyhose2_Small.png b/Assets/Female3DCG/Socks/Spread/Pantyhose2_Small.png deleted file mode 100644 index 6d7382f0e..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Pantyhose2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Pantyhose2_XLarge.png b/Assets/Female3DCG/Socks/Spread/Pantyhose2_XLarge.png deleted file mode 100644 index f32889c9c..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Pantyhose2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks0_Large.png b/Assets/Female3DCG/Socks/Spread/Socks0_Large.png deleted file mode 100644 index 350acd6da..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks0_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks0_Normal.png b/Assets/Female3DCG/Socks/Spread/Socks0_Normal.png deleted file mode 100644 index 9970990a0..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks0_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks0_Small.png b/Assets/Female3DCG/Socks/Spread/Socks0_Small.png deleted file mode 100644 index 6c5655444..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks0_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks0_XLarge.png b/Assets/Female3DCG/Socks/Spread/Socks0_XLarge.png deleted file mode 100644 index 38debe3b0..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks0_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks1_Large.png b/Assets/Female3DCG/Socks/Spread/Socks1_Large.png deleted file mode 100644 index 1d79d2116..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks1_Normal.png b/Assets/Female3DCG/Socks/Spread/Socks1_Normal.png deleted file mode 100644 index 5bc112a4a..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks1_Small.png b/Assets/Female3DCG/Socks/Spread/Socks1_Small.png deleted file mode 100644 index 94a28502e..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks1_XLarge.png b/Assets/Female3DCG/Socks/Spread/Socks1_XLarge.png deleted file mode 100644 index 8ce2834ff..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks2_Large.png b/Assets/Female3DCG/Socks/Spread/Socks2_Large.png deleted file mode 100644 index 13fc964e3..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks2_Normal.png b/Assets/Female3DCG/Socks/Spread/Socks2_Normal.png deleted file mode 100644 index 2e1ce638c..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks2_Small.png b/Assets/Female3DCG/Socks/Spread/Socks2_Small.png deleted file mode 100644 index 08c503105..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks2_XLarge.png b/Assets/Female3DCG/Socks/Spread/Socks2_XLarge.png deleted file mode 100644 index e6ac14ca2..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks3_Large.png b/Assets/Female3DCG/Socks/Spread/Socks3_Large.png deleted file mode 100644 index a4124ac28..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks3_Normal.png b/Assets/Female3DCG/Socks/Spread/Socks3_Normal.png deleted file mode 100644 index 7031e0bed..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks3_Small.png b/Assets/Female3DCG/Socks/Spread/Socks3_Small.png deleted file mode 100644 index 70d15e050..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks3_XLarge.png b/Assets/Female3DCG/Socks/Spread/Socks3_XLarge.png deleted file mode 100644 index d8131d099..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks4_Large.png b/Assets/Female3DCG/Socks/Spread/Socks4_Large.png deleted file mode 100644 index 670d1be67..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks4_Normal.png b/Assets/Female3DCG/Socks/Spread/Socks4_Normal.png deleted file mode 100644 index d689db47c..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks4_Small.png b/Assets/Female3DCG/Socks/Spread/Socks4_Small.png deleted file mode 100644 index de632bf2e..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks4_XLarge.png b/Assets/Female3DCG/Socks/Spread/Socks4_XLarge.png deleted file mode 100644 index 6c5e57c7b..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks5_Large.png b/Assets/Female3DCG/Socks/Spread/Socks5_Large.png deleted file mode 100644 index 9cfc2a8e5..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks5_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks5_Normal.png b/Assets/Female3DCG/Socks/Spread/Socks5_Normal.png deleted file mode 100644 index 691030bb0..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks5_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks5_Small.png b/Assets/Female3DCG/Socks/Spread/Socks5_Small.png deleted file mode 100644 index c9d30d1df..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks5_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks5_XLarge.png b/Assets/Female3DCG/Socks/Spread/Socks5_XLarge.png deleted file mode 100644 index f62a0f274..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks5_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks6_Large_Frill.png b/Assets/Female3DCG/Socks/Spread/Socks6_Large_Frill.png deleted file mode 100644 index f39a833aa..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks6_Large_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks6_Large_Sock.png b/Assets/Female3DCG/Socks/Spread/Socks6_Large_Sock.png deleted file mode 100644 index b7b65558a..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks6_Large_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks6_Normal_Frill.png b/Assets/Female3DCG/Socks/Spread/Socks6_Normal_Frill.png deleted file mode 100644 index 94382d9f2..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks6_Normal_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks6_Normal_Sock.png b/Assets/Female3DCG/Socks/Spread/Socks6_Normal_Sock.png deleted file mode 100644 index 8dc610955..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks6_Normal_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks6_Small_Frill.png b/Assets/Female3DCG/Socks/Spread/Socks6_Small_Frill.png deleted file mode 100644 index b1c656463..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks6_Small_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks6_Small_Sock.png b/Assets/Female3DCG/Socks/Spread/Socks6_Small_Sock.png deleted file mode 100644 index 4405e6189..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks6_Small_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks6_XLarge_Frill.png b/Assets/Female3DCG/Socks/Spread/Socks6_XLarge_Frill.png deleted file mode 100644 index 6beed31a6..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks6_XLarge_Frill.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Socks6_XLarge_Sock.png b/Assets/Female3DCG/Socks/Spread/Socks6_XLarge_Sock.png deleted file mode 100644 index be84c0155..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Socks6_XLarge_Sock.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksFur_Large_Fabric.png b/Assets/Female3DCG/Socks/Spread/SocksFur_Large_Fabric.png deleted file mode 100644 index 670d1be67..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksFur_Large_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksFur_Large_Fur.png b/Assets/Female3DCG/Socks/Spread/SocksFur_Large_Fur.png deleted file mode 100644 index 022357990..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksFur_Large_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksFur_Normal_Fabric.png b/Assets/Female3DCG/Socks/Spread/SocksFur_Normal_Fabric.png deleted file mode 100644 index d689db47c..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksFur_Normal_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksFur_Normal_Fur.png b/Assets/Female3DCG/Socks/Spread/SocksFur_Normal_Fur.png deleted file mode 100644 index c5705d829..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksFur_Normal_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksFur_Small_Fabric.png b/Assets/Female3DCG/Socks/Spread/SocksFur_Small_Fabric.png deleted file mode 100644 index de632bf2e..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksFur_Small_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksFur_Small_Fur.png b/Assets/Female3DCG/Socks/Spread/SocksFur_Small_Fur.png deleted file mode 100644 index d74833d2f..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksFur_Small_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksFur_XLarge_Fabric.png b/Assets/Female3DCG/Socks/Spread/SocksFur_XLarge_Fabric.png deleted file mode 100644 index 6c5e57c7b..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksFur_XLarge_Fabric.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksFur_XLarge_Fur.png b/Assets/Female3DCG/Socks/Spread/SocksFur_XLarge_Fur.png deleted file mode 100644 index 2499aff75..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksFur_XLarge_Fur.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Large_Dark.png b/Assets/Female3DCG/Socks/Spread/SocksStriped1_Large_Dark.png deleted file mode 100644 index ab2d1166f..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Large_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Large_Light.png b/Assets/Female3DCG/Socks/Spread/SocksStriped1_Large_Light.png deleted file mode 100644 index 787bc5397..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Large_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Normal_Dark.png b/Assets/Female3DCG/Socks/Spread/SocksStriped1_Normal_Dark.png deleted file mode 100644 index 67bd00612..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Normal_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Normal_Light.png b/Assets/Female3DCG/Socks/Spread/SocksStriped1_Normal_Light.png deleted file mode 100644 index f9b6f1d70..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Normal_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Small_Dark.png b/Assets/Female3DCG/Socks/Spread/SocksStriped1_Small_Dark.png deleted file mode 100644 index 7c698d588..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Small_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Small_Light.png b/Assets/Female3DCG/Socks/Spread/SocksStriped1_Small_Light.png deleted file mode 100644 index a065515be..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksStriped1_Small_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksStriped1_XLarge_Dark.png b/Assets/Female3DCG/Socks/Spread/SocksStriped1_XLarge_Dark.png deleted file mode 100644 index 88ad67fb9..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksStriped1_XLarge_Dark.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/SocksStriped1_XLarge_Light.png b/Assets/Female3DCG/Socks/Spread/SocksStriped1_XLarge_Light.png deleted file mode 100644 index 2354af4ed..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/SocksStriped1_XLarge_Light.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings1_Large.png b/Assets/Female3DCG/Socks/Spread/Stockings1_Large.png deleted file mode 100644 index ec38d4403..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings1_Normal.png b/Assets/Female3DCG/Socks/Spread/Stockings1_Normal.png deleted file mode 100644 index 6098b5b60..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings1_Small.png b/Assets/Female3DCG/Socks/Spread/Stockings1_Small.png deleted file mode 100644 index 4d2c511f7..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings1_XLarge.png b/Assets/Female3DCG/Socks/Spread/Stockings1_XLarge.png deleted file mode 100644 index 3811ec145..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings2_Large.png b/Assets/Female3DCG/Socks/Spread/Stockings2_Large.png deleted file mode 100644 index 9a2912a60..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings2_Normal.png b/Assets/Female3DCG/Socks/Spread/Stockings2_Normal.png deleted file mode 100644 index acaa3ca82..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings2_Small.png b/Assets/Female3DCG/Socks/Spread/Stockings2_Small.png deleted file mode 100644 index dedb257d8..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings2_XLarge.png b/Assets/Female3DCG/Socks/Spread/Stockings2_XLarge.png deleted file mode 100644 index 45558f34c..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings3_Large.png b/Assets/Female3DCG/Socks/Spread/Stockings3_Large.png deleted file mode 100644 index cf8e402a0..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings3_Normal.png b/Assets/Female3DCG/Socks/Spread/Stockings3_Normal.png deleted file mode 100644 index 697260c01..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings3_Small.png b/Assets/Female3DCG/Socks/Spread/Stockings3_Small.png deleted file mode 100644 index 2e9f5b128..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings3_XLarge.png b/Assets/Female3DCG/Socks/Spread/Stockings3_XLarge.png deleted file mode 100644 index 7c498dc0e..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings4_Large.png b/Assets/Female3DCG/Socks/Spread/Stockings4_Large.png deleted file mode 100644 index bb4ebca5e..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings4_Normal.png b/Assets/Female3DCG/Socks/Spread/Stockings4_Normal.png deleted file mode 100644 index 076621ac4..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings4_Small.png b/Assets/Female3DCG/Socks/Spread/Stockings4_Small.png deleted file mode 100644 index 046ec7f2e..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Spread/Stockings4_XLarge.png b/Assets/Female3DCG/Socks/Spread/Stockings4_XLarge.png deleted file mode 100644 index d01c0896a..000000000 Binary files a/Assets/Female3DCG/Socks/Spread/Stockings4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings1_Large.png b/Assets/Female3DCG/Socks/Stockings1_Large.png deleted file mode 100644 index dfe937f28..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings1_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings1_Normal.png b/Assets/Female3DCG/Socks/Stockings1_Normal.png deleted file mode 100644 index eb10826ad..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings1_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings1_Small.png b/Assets/Female3DCG/Socks/Stockings1_Small.png deleted file mode 100644 index 3f8cc9221..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings1_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings1_XLarge.png b/Assets/Female3DCG/Socks/Stockings1_XLarge.png deleted file mode 100644 index 6396c9019..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings1_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings2_Large.png b/Assets/Female3DCG/Socks/Stockings2_Large.png deleted file mode 100644 index 5f2915045..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings2_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings2_Normal.png b/Assets/Female3DCG/Socks/Stockings2_Normal.png deleted file mode 100644 index b9c28e854..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings2_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings2_Small.png b/Assets/Female3DCG/Socks/Stockings2_Small.png deleted file mode 100644 index ef302a4c5..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings2_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings2_XLarge.png b/Assets/Female3DCG/Socks/Stockings2_XLarge.png deleted file mode 100644 index c6e4e3ae1..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings2_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings3_Large.png b/Assets/Female3DCG/Socks/Stockings3_Large.png deleted file mode 100644 index dc0504c6c..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings3_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings3_Normal.png b/Assets/Female3DCG/Socks/Stockings3_Normal.png deleted file mode 100644 index c4f97df9b..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings3_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings3_Small.png b/Assets/Female3DCG/Socks/Stockings3_Small.png deleted file mode 100644 index 06e3a1932..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings3_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings3_XLarge.png b/Assets/Female3DCG/Socks/Stockings3_XLarge.png deleted file mode 100644 index 113505415..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings3_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings4_Large.png b/Assets/Female3DCG/Socks/Stockings4_Large.png deleted file mode 100644 index 0ed691eb6..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings4_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings4_Normal.png b/Assets/Female3DCG/Socks/Stockings4_Normal.png deleted file mode 100644 index 06782b0fe..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings4_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings4_Small.png b/Assets/Female3DCG/Socks/Stockings4_Small.png deleted file mode 100644 index fb9151730..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings4_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Socks/Stockings4_XLarge.png b/Assets/Female3DCG/Socks/Stockings4_XLarge.png deleted file mode 100644 index 138303c6d..000000000 Binary files a/Assets/Female3DCG/Socks/Stockings4_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_Base.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_Base.png deleted file mode 100644 index c0a86e900..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_Zip.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_Base.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_Base.png deleted file mode 100644 index b8611afb9..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_Zip.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_Base.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_Base.png deleted file mode 100644 index c1b84d291..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_Zip.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_Zip.png deleted file mode 100644 index 0d3184901..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_Base.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_Base.png deleted file mode 100644 index 1da42d853..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer1.png deleted file mode 100644 index efa9cfade..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer2.png deleted file mode 100644 index f7e8ff075..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer3.png deleted file mode 100644 index 832eb4d3e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer4.png deleted file mode 100644 index 48319289e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 555a2c421..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer2.png deleted file mode 100644 index 2f19e7c8b..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer3.png deleted file mode 100644 index 0abb42997..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer4.png deleted file mode 100644 index 4ca34d140..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer1.png deleted file mode 100644 index aae358ec2..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer2.png deleted file mode 100644 index 1af067a22..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer3.png deleted file mode 100644 index 4b872608f..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer4.png deleted file mode 100644 index c2bf0ce0a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index 77f7653fe..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index 5c0bb2d8c..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index 52892b933..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index 5d0f38dd6..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Large_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Large_Suit.png deleted file mode 100644 index 73f439022..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Normal_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Normal_Suit.png deleted file mode 100644 index b62e11863..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Small_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Small_Suit.png deleted file mode 100644 index be752c22b..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_XLarge_Suit.png deleted file mode 100644 index 6e3aab5d2..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/ReverseBunnySuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Large_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Large_Suit.png deleted file mode 100644 index c0a86e900..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Normal_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Normal_Suit.png deleted file mode 100644 index b8611afb9..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Small_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Small_Suit.png deleted file mode 100644 index c1b84d291..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_XLarge_Suit.png deleted file mode 100644 index 1da42d853..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeamlessCatsuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index cd60d9b77..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index cc58d2a59..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index 48197093d..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index 0d3184901..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index 3b12dc665..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Large_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Large_Suit.png deleted file mode 100644 index cd60d9b77..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Normal_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Normal_Suit.png deleted file mode 100644 index cc58d2a59..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Small_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Small_Suit.png deleted file mode 100644 index 48197093d..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_XLarge_Suit.png deleted file mode 100644 index 3b12dc665..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SeethroughSuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_Large.png b/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_Large.png deleted file mode 100644 index b82236686..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_Normal.png b/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_Normal.png deleted file mode 100644 index bb072de05..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_Small.png b/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_Small.png deleted file mode 100644 index c215e0775..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_XLarge.png b/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_XLarge.png deleted file mode 100644 index ba0c26571..000000000 Binary files a/Assets/Female3DCG/Suit/BackBoxTie/SleevelessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_AltGloves.png deleted file mode 100644 index da9cc24b5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_Base.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_Base.png deleted file mode 100644 index c4c50beab..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_Gloves.png deleted file mode 100644 index 096ac86c0..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_Zip.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_AltGloves.png deleted file mode 100644 index 6f867c473..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_Base.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_Base.png deleted file mode 100644 index 1da94442c..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_Gloves.png deleted file mode 100644 index 9e7fecf0f..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_Zip.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_AltGloves.png deleted file mode 100644 index a14f1fcd6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_Base.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_Base.png deleted file mode 100644 index 7067265ae..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_Gloves.png deleted file mode 100644 index 8bcadaca6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_Zip.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_Zip.png deleted file mode 100644 index a6f6c177c..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_AltGloves.png deleted file mode 100644 index d9de49d3a..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_Base.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_Base.png deleted file mode 100644 index 586a32c67..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_Gloves.png deleted file mode 100644 index 0ce9b26f5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_AltGloves.png deleted file mode 100644 index da9cc24b5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Gloves.png deleted file mode 100644 index 096ac86c0..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer1.png deleted file mode 100644 index efa9cfade..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer2.png deleted file mode 100644 index f7e8ff075..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer3.png deleted file mode 100644 index 832eb4d3e..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer4.png deleted file mode 100644 index e3c79c428..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_AltGloves.png deleted file mode 100644 index 6f867c473..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Gloves.png deleted file mode 100644 index 9e7fecf0f..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 555a2c421..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer2.png deleted file mode 100644 index 2f19e7c8b..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer3.png deleted file mode 100644 index 0abb42997..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer4.png deleted file mode 100644 index 014a390c5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_AltGloves.png deleted file mode 100644 index a14f1fcd6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Gloves.png deleted file mode 100644 index 8bcadaca6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer1.png deleted file mode 100644 index aae358ec2..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer2.png deleted file mode 100644 index 1af067a22..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer3.png deleted file mode 100644 index 4b872608f..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer4.png deleted file mode 100644 index 9f5d2dd0c..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_AltGloves.png deleted file mode 100644 index d9de49d3a..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Gloves.png deleted file mode 100644 index 0ce9b26f5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index 77f7653fe..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index 5c0bb2d8c..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index 52892b933..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index dd3febee7..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Large_AltGloves.png deleted file mode 100644 index da9cc24b5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Large_Gloves.png deleted file mode 100644 index 096ac86c0..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Large_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Large_Suit.png deleted file mode 100644 index 4ea0219c2..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Normal_AltGloves.png deleted file mode 100644 index 6f867c473..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Normal_Gloves.png deleted file mode 100644 index 9e7fecf0f..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Normal_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Normal_Suit.png deleted file mode 100644 index e56001358..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Small_AltGloves.png deleted file mode 100644 index a14f1fcd6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Small_Gloves.png deleted file mode 100644 index 8bcadaca6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Small_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Small_Suit.png deleted file mode 100644 index 2d235e0ea..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_XLarge_AltGloves.png deleted file mode 100644 index d9de49d3a..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_XLarge_Gloves.png deleted file mode 100644 index 0ce9b26f5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_XLarge_Suit.png deleted file mode 100644 index 126d683e2..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/ReverseBunnySuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Large_AltGloves.png deleted file mode 100644 index da9cc24b5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Large_Gloves.png deleted file mode 100644 index 096ac86c0..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Large_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Large_Suit.png deleted file mode 100644 index c4c50beab..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Normal_AltGloves.png deleted file mode 100644 index 6f867c473..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Normal_Gloves.png deleted file mode 100644 index 9e7fecf0f..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Normal_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Normal_Suit.png deleted file mode 100644 index a41363150..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Small_AltGloves.png deleted file mode 100644 index a14f1fcd6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Small_Gloves.png deleted file mode 100644 index 8bcadaca6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Small_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Small_Suit.png deleted file mode 100644 index 4030c8df8..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_XLarge_AltGloves.png deleted file mode 100644 index d9de49d3a..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_XLarge_Gloves.png deleted file mode 100644 index 0ce9b26f5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_XLarge_Suit.png deleted file mode 100644 index 586a32c67..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeamlessCatsuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_AltGloves.png deleted file mode 100644 index 096ac86c0..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index 4a1165093..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_Gloves.png deleted file mode 100644 index da9cc24b5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_AltGloves.png deleted file mode 100644 index 9e7fecf0f..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index 17765cb95..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_Gloves.png deleted file mode 100644 index 6f867c473..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_AltGloves.png deleted file mode 100644 index 8bcadaca6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index f5d268b1c..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_Gloves.png deleted file mode 100644 index a14f1fcd6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index a6f6c177c..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_AltGloves.png deleted file mode 100644 index 0ce9b26f5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index c1bca46fb..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_Gloves.png deleted file mode 100644 index d9de49d3a..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Large_AltGloves.png deleted file mode 100644 index 096ac86c0..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Large_Gloves.png deleted file mode 100644 index da9cc24b5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Large_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Large_Suit.png deleted file mode 100644 index 4a1165093..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Normal_AltGloves.png deleted file mode 100644 index 9e7fecf0f..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Normal_Gloves.png deleted file mode 100644 index 6f867c473..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Normal_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Normal_Suit.png deleted file mode 100644 index 838d2a372..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Small_AltGloves.png deleted file mode 100644 index 8bcadaca6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Small_Gloves.png deleted file mode 100644 index a14f1fcd6..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Small_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Small_Suit.png deleted file mode 100644 index c5a63da0e..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_XLarge_AltGloves.png deleted file mode 100644 index 0ce9b26f5..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_XLarge_Gloves.png deleted file mode 100644 index d9de49d3a..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_XLarge_Suit.png deleted file mode 100644 index c1bca46fb..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SeethroughSuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_Large.png b/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_Large.png deleted file mode 100644 index 2c2bd018e..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_Normal.png b/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_Normal.png deleted file mode 100644 index bb072de05..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_Small.png b/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_Small.png deleted file mode 100644 index c215e0775..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_XLarge.png b/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_XLarge.png deleted file mode 100644 index ba0c26571..000000000 Binary files a/Assets/Female3DCG/Suit/BackCuffs/SleevelessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_Base.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_Base.png deleted file mode 100644 index 5c7f2afff..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_Zip.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_Base.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_Base.png deleted file mode 100644 index 63ad99c5e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_Zip.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_Base.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_Base.png deleted file mode 100644 index 215a7f8a5..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_Zip.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_Zip.png deleted file mode 100644 index a6f6c177c..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_Base.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_Base.png deleted file mode 100644 index c43902421..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer1.png deleted file mode 100644 index 5866ecb50..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer2.png deleted file mode 100644 index f7e8ff075..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer3.png deleted file mode 100644 index 832eb4d3e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer4.png deleted file mode 100644 index 926346a54..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 353e3193f..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer2.png deleted file mode 100644 index 2f19e7c8b..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer3.png deleted file mode 100644 index 0abb42997..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer4.png deleted file mode 100644 index 9cf85be5b..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer1.png deleted file mode 100644 index 1285f9cc1..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer2.png deleted file mode 100644 index 1af067a22..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer3.png deleted file mode 100644 index 4b872608f..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer4.png deleted file mode 100644 index d13a789d4..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index 1af3d2524..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index 5c0bb2d8c..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index 52892b933..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index aebc99adf..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Large_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Large_Suit.png deleted file mode 100644 index baa3b714a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Normal_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Normal_Suit.png deleted file mode 100644 index 9be9026e4..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Small_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Small_Suit.png deleted file mode 100644 index c4ddc4764..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_XLarge_Suit.png deleted file mode 100644 index 4641f3487..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/ReverseBunnySuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Large_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Large_Suit.png deleted file mode 100644 index 5c7f2afff..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Normal_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Normal_Suit.png deleted file mode 100644 index 1bcf40061..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Small_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Small_Suit.png deleted file mode 100644 index 215a7f8a5..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_XLarge_Suit.png deleted file mode 100644 index c43902421..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeamlessCatsuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index 675e203df..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index c5350237c..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index b41f3e0de..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index a6f6c177c..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index ba093a3d9..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Large_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Large_Suit.png deleted file mode 100644 index 675e203df..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Normal_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Normal_Suit.png deleted file mode 100644 index 893742fdc..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Small_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Small_Suit.png deleted file mode 100644 index b41f3e0de..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_XLarge_Suit.png deleted file mode 100644 index ba093a3d9..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SeethroughSuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_Large.png b/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_Large.png deleted file mode 100644 index 2c2bd018e..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_Normal.png b/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_Normal.png deleted file mode 100644 index bb072de05..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_Small.png b/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_Small.png deleted file mode 100644 index c215e0775..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_XLarge.png b/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_XLarge.png deleted file mode 100644 index ba0c26571..000000000 Binary files a/Assets/Female3DCG/Suit/BackElbowTouch/SleevelessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/Catsuit_Large_AltGloves.png deleted file mode 100644 index e6c8ec440..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Large_Base.png b/Assets/Female3DCG/Suit/Catsuit_Large_Base.png deleted file mode 100644 index 600176316..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/Catsuit_Large_Gloves.png deleted file mode 100644 index 5977a2d5a..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Large_Zip.png b/Assets/Female3DCG/Suit/Catsuit_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Catsuit_Normal_AltGloves.png deleted file mode 100644 index c5a45abbf..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Normal_Base.png b/Assets/Female3DCG/Suit/Catsuit_Normal_Base.png deleted file mode 100644 index 79a31e24e..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/Catsuit_Normal_Gloves.png deleted file mode 100644 index 0902bde01..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Normal_Zip.png b/Assets/Female3DCG/Suit/Catsuit_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/Catsuit_Small_AltGloves.png deleted file mode 100644 index 82328ad30..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Small_Base.png b/Assets/Female3DCG/Suit/Catsuit_Small_Base.png deleted file mode 100644 index c7869cae6..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/Catsuit_Small_Gloves.png deleted file mode 100644 index 447179e4f..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_Small_Zip.png b/Assets/Female3DCG/Suit/Catsuit_Small_Zip.png deleted file mode 100644 index a6f6c177c..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Catsuit_XLarge_AltGloves.png deleted file mode 100644 index 23459156a..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_XLarge_Base.png b/Assets/Female3DCG/Suit/Catsuit_XLarge_Base.png deleted file mode 100644 index b50525a01..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Catsuit_XLarge_Gloves.png deleted file mode 100644 index 08c70a075..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/Suit/Catsuit_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_Base.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_Base.png deleted file mode 100644 index af49c79b3..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_Zip.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_Zip.png deleted file mode 100644 index 549ca87d7..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_Base.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_Base.png deleted file mode 100644 index 566637620..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_Zip.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_Zip.png deleted file mode 100644 index a6d0d18fd..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_Base.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_Base.png deleted file mode 100644 index 093c92f46..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_Zip.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_Zip.png deleted file mode 100644 index 532da2878..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_Base.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_Base.png deleted file mode 100644 index 3417cfa46..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_Zip.png deleted file mode 100644 index 2a605892d..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer1.png deleted file mode 100644 index e30bb6775..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer2.png deleted file mode 100644 index 0caf45d91..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer3.png deleted file mode 100644 index 5fa9460e3..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer4.png deleted file mode 100644 index 926346a54..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 78acc3b0d..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer2.png deleted file mode 100644 index a1997693a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer3.png deleted file mode 100644 index c1e379ea0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer4.png deleted file mode 100644 index 9cf85be5b..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer1.png deleted file mode 100644 index ad77cc9c2..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer2.png deleted file mode 100644 index 574941e7c..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer3.png deleted file mode 100644 index a6be242c6..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer4.png deleted file mode 100644 index d13a789d4..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index 5a79f0488..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index dbd7ad6af..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index d0173c171..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index aebc99adf..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Large_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Large_Suit.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Large_Suit.png deleted file mode 100644 index f4d4963d7..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Normal_Suit.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Normal_Suit.png deleted file mode 100644 index c00e35a69..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Small_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Small_Suit.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Small_Suit.png deleted file mode 100644 index 288bedb83..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_XLarge_Suit.png deleted file mode 100644 index 661772a34..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/ReverseBunnySuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Large_Suit.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Large_Suit.png deleted file mode 100644 index 0d50a794a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Normal_Suit.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Normal_Suit.png deleted file mode 100644 index 58ee7c135..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Small_Suit.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Small_Suit.png deleted file mode 100644 index d8de18bc7..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_XLarge_Suit.png deleted file mode 100644 index 9d1b4b2c7..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeamlessCatsuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index 52fdc8c98..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index 549ca87d7..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index f4acdc2e9..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index a6d0d18fd..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index 41b6042a5..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index 532da2878..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index 9f255c5df..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 2a605892d..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Large_AltGloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Large_Gloves.png deleted file mode 100644 index b95e6128a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Large_Suit.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Large_Suit.png deleted file mode 100644 index 3d542be3a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Normal_AltGloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Normal_Gloves.png deleted file mode 100644 index 55210e529..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Normal_Suit.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Normal_Suit.png deleted file mode 100644 index 8154639fb..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Small_AltGloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Small_Gloves.png deleted file mode 100644 index 80985258e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Small_Suit.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Small_Suit.png deleted file mode 100644 index 197d799ca..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_XLarge_AltGloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_XLarge_Gloves.png deleted file mode 100644 index 780b667e0..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_XLarge_Suit.png deleted file mode 100644 index bc3d70e27..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SeethroughSuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_Large.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_Large.png deleted file mode 100644 index db1bf90e6..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_Normal.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_Normal.png deleted file mode 100644 index 081a5c7e5..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_Small.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_Small.png deleted file mode 100644 index 959d3de4e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_XLarge.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_XLarge.png deleted file mode 100644 index af4acbb02..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Large_BreastShade.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Large_BreastShade.png deleted file mode 100644 index 98b97b6e6..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Large_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Large_Latex.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Large_Latex.png deleted file mode 100644 index a47257b11..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Large_Shine.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Large_Shine.png deleted file mode 100644 index 4662fa480..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Normal_BreastShade.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Normal_BreastShade.png deleted file mode 100644 index 6d8d35b45..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Normal_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Normal_Latex.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Normal_Latex.png deleted file mode 100644 index 4064bf88b..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Normal_Shine.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Normal_Shine.png deleted file mode 100644 index 11f7cc82a..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Small_BreastShade.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Small_BreastShade.png deleted file mode 100644 index d78c5318e..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Small_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Small_Latex.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Small_Latex.png deleted file mode 100644 index 026531027..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Small_Shine.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Small_Shine.png deleted file mode 100644 index d3d63662f..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_XLarge_BreastShade.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_XLarge_BreastShade.png deleted file mode 100644 index 92c1bb0d4..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_XLarge_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_XLarge_Latex.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_XLarge_Latex.png deleted file mode 100644 index 9c2713147..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_XLarge_Shine.png b/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_XLarge_Shine.png deleted file mode 100644 index b4401785d..000000000 Binary files a/Assets/Female3DCG/Suit/Hogtied/SleevelessSlimLatexLeotard_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_AltGloves.png deleted file mode 100644 index 75011ea2e..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_Base.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_Base.png deleted file mode 100644 index 5d186beaa..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_Gloves.png deleted file mode 100644 index 64126b897..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_Zip.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_AltGloves.png deleted file mode 100644 index 59e93bc08..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_Base.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_Base.png deleted file mode 100644 index 902dad133..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_Gloves.png deleted file mode 100644 index 5296141cb..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_Zip.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_AltGloves.png deleted file mode 100644 index d0f98f293..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_Base.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_Base.png deleted file mode 100644 index 0f80fc0a3..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_Gloves.png deleted file mode 100644 index fd72a99be..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_Zip.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_Zip.png deleted file mode 100644 index a6f6c177c..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_AltGloves.png deleted file mode 100644 index 50c86c325..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_Base.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_Base.png deleted file mode 100644 index f19727844..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_Gloves.png deleted file mode 100644 index ff8e8161f..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_AltGloves.png deleted file mode 100644 index 75011ea2e..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Gloves.png deleted file mode 100644 index 64126b897..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer1.png deleted file mode 100644 index efa9cfade..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer2.png deleted file mode 100644 index f7e8ff075..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer3.png deleted file mode 100644 index 832eb4d3e..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer4.png deleted file mode 100644 index 2ee4c31f2..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_AltGloves.png deleted file mode 100644 index 59e93bc08..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Gloves.png deleted file mode 100644 index 5296141cb..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 555a2c421..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer2.png deleted file mode 100644 index 2f19e7c8b..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer3.png deleted file mode 100644 index 0abb42997..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer4.png deleted file mode 100644 index 777f8a3bd..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_AltGloves.png deleted file mode 100644 index d0f98f293..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Gloves.png deleted file mode 100644 index fd72a99be..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer1.png deleted file mode 100644 index aae358ec2..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer2.png deleted file mode 100644 index 1af067a22..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer3.png deleted file mode 100644 index 4b872608f..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer4.png deleted file mode 100644 index 9fb64e47c..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_AltGloves.png deleted file mode 100644 index 50c86c325..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Gloves.png deleted file mode 100644 index ff8e8161f..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index 77f7653fe..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index 5c0bb2d8c..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index 52892b933..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index 40daf10fa..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Large_AltGloves.png deleted file mode 100644 index 75011ea2e..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Large_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Large_Gloves.png deleted file mode 100644 index 64126b897..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Large_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Large_Suit.png deleted file mode 100644 index 4319269cf..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Normal_AltGloves.png deleted file mode 100644 index 59e93bc08..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Normal_Gloves.png deleted file mode 100644 index 5296141cb..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Normal_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Normal_Suit.png deleted file mode 100644 index dd5859a4a..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Small_AltGloves.png deleted file mode 100644 index d0f98f293..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Small_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Small_Gloves.png deleted file mode 100644 index fd72a99be..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Small_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Small_Suit.png deleted file mode 100644 index 84c12a7c8..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_XLarge_AltGloves.png deleted file mode 100644 index 50c86c325..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_XLarge_Gloves.png deleted file mode 100644 index ff8e8161f..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_XLarge_Suit.png deleted file mode 100644 index d28e5627f..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/ReverseBunnySuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Large_AltGloves.png deleted file mode 100644 index 75011ea2e..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Large_Gloves.png deleted file mode 100644 index 64126b897..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Large_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Large_Suit.png deleted file mode 100644 index 5d186beaa..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Normal_AltGloves.png deleted file mode 100644 index 59e93bc08..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Normal_Gloves.png deleted file mode 100644 index 5296141cb..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Normal_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Normal_Suit.png deleted file mode 100644 index 902dad133..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Small_AltGloves.png deleted file mode 100644 index d0f98f293..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Small_Gloves.png deleted file mode 100644 index fd72a99be..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Small_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Small_Suit.png deleted file mode 100644 index 0f80fc0a3..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_XLarge_AltGloves.png deleted file mode 100644 index 50c86c325..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_XLarge_Gloves.png deleted file mode 100644 index ff8e8161f..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_XLarge_Suit.png deleted file mode 100644 index f19727844..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeamlessCatsuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_AltGloves.png deleted file mode 100644 index 64126b897..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index 46298fc31..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_Gloves.png deleted file mode 100644 index 75011ea2e..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_AltGloves.png deleted file mode 100644 index 5296141cb..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index 9ffd33697..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_Gloves.png deleted file mode 100644 index 59e93bc08..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_AltGloves.png deleted file mode 100644 index fd72a99be..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index 17a06e969..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_Gloves.png deleted file mode 100644 index d0f98f293..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index a6f6c177c..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_AltGloves.png deleted file mode 100644 index ff8e8161f..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index 9e2b30492..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_Gloves.png deleted file mode 100644 index 50c86c325..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Large_AltGloves.png deleted file mode 100644 index 64126b897..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Large_Gloves.png deleted file mode 100644 index 75011ea2e..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Large_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Large_Suit.png deleted file mode 100644 index 46298fc31..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Normal_AltGloves.png deleted file mode 100644 index 5296141cb..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Normal_Gloves.png deleted file mode 100644 index 59e93bc08..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Normal_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Normal_Suit.png deleted file mode 100644 index 9ffd33697..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Small_AltGloves.png deleted file mode 100644 index fd72a99be..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Small_Gloves.png deleted file mode 100644 index d0f98f293..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Small_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Small_Suit.png deleted file mode 100644 index 17a06e969..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_XLarge_AltGloves.png deleted file mode 100644 index ff8e8161f..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_XLarge_Gloves.png deleted file mode 100644 index 50c86c325..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_XLarge_Suit.png deleted file mode 100644 index 9e2b30492..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SeethroughSuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_Large.png b/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_Large.png deleted file mode 100644 index 99a119b44..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_Normal.png b/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_Normal.png deleted file mode 100644 index 2e4e9e7e6..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_Small.png b/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_Small.png deleted file mode 100644 index 4de5d6e1a..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_XLarge.png b/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_XLarge.png deleted file mode 100644 index 7380facb4..000000000 Binary files a/Assets/Female3DCG/Suit/OverTheHead/SleevelessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/PilotSuit_Large_AltGloves.png deleted file mode 100644 index e6c8ec440..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/PilotSuit_Large_Gloves.png deleted file mode 100644 index 5977a2d5a..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/Suit/PilotSuit_Large_Layer1.png deleted file mode 100644 index 7ba2cf5e7..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/Suit/PilotSuit_Large_Layer2.png deleted file mode 100644 index 49ac1dbf6..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/Suit/PilotSuit_Large_Layer3.png deleted file mode 100644 index 832eb4d3e..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/Suit/PilotSuit_Large_Layer4.png deleted file mode 100644 index ada5550e5..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/PilotSuit_Normal_AltGloves.png deleted file mode 100644 index c5a45abbf..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/PilotSuit_Normal_Gloves.png deleted file mode 100644 index 0902bde01..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 8ba536380..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer2.png deleted file mode 100644 index 5d587db1d..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer3.png deleted file mode 100644 index 0abb42997..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer4.png deleted file mode 100644 index 30041c97d..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/PilotSuit_Small_AltGloves.png deleted file mode 100644 index 82328ad30..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/PilotSuit_Small_Gloves.png deleted file mode 100644 index 447179e4f..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/Suit/PilotSuit_Small_Layer1.png deleted file mode 100644 index 8cbb0b83c..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/Suit/PilotSuit_Small_Layer2.png deleted file mode 100644 index 1fb96981a..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/Suit/PilotSuit_Small_Layer3.png deleted file mode 100644 index 4b872608f..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/Suit/PilotSuit_Small_Layer4.png deleted file mode 100644 index b3d9c0f26..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/PilotSuit_XLarge_AltGloves.png deleted file mode 100644 index 23459156a..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/PilotSuit_XLarge_Gloves.png deleted file mode 100644 index 08c70a075..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index 9212bd54a..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index a5a9e7b9d..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index 52892b933..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index d4cdc0b26..000000000 Binary files a/Assets/Female3DCG/Suit/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Preview/Catsuit.png b/Assets/Female3DCG/Suit/Preview/Catsuit.png deleted file mode 100644 index 788582ea8..000000000 Binary files a/Assets/Female3DCG/Suit/Preview/Catsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Preview/PilotSuit.png b/Assets/Female3DCG/Suit/Preview/PilotSuit.png deleted file mode 100644 index 785a4eed6..000000000 Binary files a/Assets/Female3DCG/Suit/Preview/PilotSuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Preview/ReverseBunnySuit.png b/Assets/Female3DCG/Suit/Preview/ReverseBunnySuit.png deleted file mode 100644 index fd18bb52a..000000000 Binary files a/Assets/Female3DCG/Suit/Preview/ReverseBunnySuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Preview/SeamlessCatsuit.png b/Assets/Female3DCG/Suit/Preview/SeamlessCatsuit.png deleted file mode 100644 index 788582ea8..000000000 Binary files a/Assets/Female3DCG/Suit/Preview/SeamlessCatsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Preview/SeethroughSuit.png b/Assets/Female3DCG/Suit/Preview/SeethroughSuit.png deleted file mode 100644 index 0039ffe6f..000000000 Binary files a/Assets/Female3DCG/Suit/Preview/SeethroughSuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Preview/SeethroughSuitZip.png b/Assets/Female3DCG/Suit/Preview/SeethroughSuitZip.png deleted file mode 100644 index 0039ffe6f..000000000 Binary files a/Assets/Female3DCG/Suit/Preview/SeethroughSuitZip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Preview/SleevelessCatsuit.png b/Assets/Female3DCG/Suit/Preview/SleevelessCatsuit.png deleted file mode 100644 index 09b95fe11..000000000 Binary files a/Assets/Female3DCG/Suit/Preview/SleevelessCatsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Preview/SleevelessSlimLatexLeotard.png b/Assets/Female3DCG/Suit/Preview/SleevelessSlimLatexLeotard.png deleted file mode 100644 index 80b90193f..000000000 Binary files a/Assets/Female3DCG/Suit/Preview/SleevelessSlimLatexLeotard.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_Large_AltGloves.png deleted file mode 100644 index e6c8ec440..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_Large_Gloves.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_Large_Gloves.png deleted file mode 100644 index 5977a2d5a..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_Large_Suit.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_Large_Suit.png deleted file mode 100644 index 6749ed291..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_Normal_AltGloves.png deleted file mode 100644 index c5a45abbf..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_Normal_Gloves.png deleted file mode 100644 index 0902bde01..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_Normal_Suit.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_Normal_Suit.png deleted file mode 100644 index ecbc22dff..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_Small_AltGloves.png deleted file mode 100644 index 82328ad30..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_Small_Gloves.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_Small_Gloves.png deleted file mode 100644 index 447179e4f..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_Small_Suit.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_Small_Suit.png deleted file mode 100644 index 647e854af..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_XLarge_AltGloves.png deleted file mode 100644 index 23459156a..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_XLarge_Gloves.png deleted file mode 100644 index 08c70a075..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/ReverseBunnySuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/ReverseBunnySuit_XLarge_Suit.png deleted file mode 100644 index 9f1d69490..000000000 Binary files a/Assets/Female3DCG/Suit/ReverseBunnySuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_Large_AltGloves.png deleted file mode 100644 index e6c8ec440..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_Large_Gloves.png deleted file mode 100644 index 5977a2d5a..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_Large_Suit.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_Large_Suit.png deleted file mode 100644 index 600176316..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_Normal_AltGloves.png deleted file mode 100644 index c5a45abbf..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_Normal_Gloves.png deleted file mode 100644 index 0902bde01..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_Normal_Suit.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_Normal_Suit.png deleted file mode 100644 index 79a31e24e..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_Small_AltGloves.png deleted file mode 100644 index 82328ad30..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_Small_Gloves.png deleted file mode 100644 index 447179e4f..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_Small_Suit.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_Small_Suit.png deleted file mode 100644 index c7869cae6..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_XLarge_AltGloves.png deleted file mode 100644 index 23459156a..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_XLarge_Gloves.png deleted file mode 100644 index 08c70a075..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeamlessCatsuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/SeamlessCatsuit_XLarge_Suit.png deleted file mode 100644 index b50525a01..000000000 Binary files a/Assets/Female3DCG/Suit/SeamlessCatsuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_AltGloves.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_AltGloves.png deleted file mode 100644 index 5977a2d5a..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index 7726db4b5..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_Gloves.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_Gloves.png deleted file mode 100644 index e6c8ec440..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_AltGloves.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_AltGloves.png deleted file mode 100644 index 0902bde01..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index b39882093..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_Gloves.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_Gloves.png deleted file mode 100644 index c5a45abbf..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_AltGloves.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_AltGloves.png deleted file mode 100644 index 447179e4f..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index 5f6f27539..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_Gloves.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_Gloves.png deleted file mode 100644 index 82328ad30..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index a6f6c177c..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_AltGloves.png deleted file mode 100644 index 08c70a075..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index 708d15f52..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_Gloves.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_Gloves.png deleted file mode 100644 index 23459156a..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/SeethroughSuit_Large_AltGloves.png deleted file mode 100644 index 5977a2d5a..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/SeethroughSuit_Large_Gloves.png deleted file mode 100644 index e6c8ec440..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_Large_Suit.png b/Assets/Female3DCG/Suit/SeethroughSuit_Large_Suit.png deleted file mode 100644 index a797e5b43..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/SeethroughSuit_Normal_AltGloves.png deleted file mode 100644 index 0902bde01..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/SeethroughSuit_Normal_Gloves.png deleted file mode 100644 index c5a45abbf..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_Normal_Suit.png b/Assets/Female3DCG/Suit/SeethroughSuit_Normal_Suit.png deleted file mode 100644 index 9a76f04e6..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/SeethroughSuit_Small_AltGloves.png deleted file mode 100644 index 447179e4f..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/SeethroughSuit_Small_Gloves.png deleted file mode 100644 index 82328ad30..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_Small_Suit.png b/Assets/Female3DCG/Suit/SeethroughSuit_Small_Suit.png deleted file mode 100644 index 014b597b0..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/SeethroughSuit_XLarge_AltGloves.png deleted file mode 100644 index 08c70a075..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/SeethroughSuit_XLarge_Gloves.png deleted file mode 100644 index 23459156a..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SeethroughSuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/SeethroughSuit_XLarge_Suit.png deleted file mode 100644 index 9c50689a6..000000000 Binary files a/Assets/Female3DCG/Suit/SeethroughSuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessCatsuit_Large.png b/Assets/Female3DCG/Suit/SleevelessCatsuit_Large.png deleted file mode 100644 index 4f7787849..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessCatsuit_Normal.png b/Assets/Female3DCG/Suit/SleevelessCatsuit_Normal.png deleted file mode 100644 index bb072de05..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessCatsuit_Small.png b/Assets/Female3DCG/Suit/SleevelessCatsuit_Small.png deleted file mode 100644 index c215e0775..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessCatsuit_XLarge.png b/Assets/Female3DCG/Suit/SleevelessCatsuit_XLarge.png deleted file mode 100644 index ba0c26571..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Large_BreastShade.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Large_BreastShade.png deleted file mode 100644 index 868271142..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Large_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Large_Latex.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Large_Latex.png deleted file mode 100644 index e9e03829e..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Large_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Large_Shine.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Large_Shine.png deleted file mode 100644 index a156af5d3..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Large_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Normal_BreastShade.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Normal_BreastShade.png deleted file mode 100644 index 226464213..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Normal_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Normal_Latex.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Normal_Latex.png deleted file mode 100644 index 4ae5d3d85..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Normal_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Normal_Shine.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Normal_Shine.png deleted file mode 100644 index 19af6bc6b..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Normal_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Small_BreastShade.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Small_BreastShade.png deleted file mode 100644 index 71628608f..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Small_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Small_Latex.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Small_Latex.png deleted file mode 100644 index b6adf8365..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Small_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Small_Shine.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Small_Shine.png deleted file mode 100644 index b486a3091..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_Small_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_XLarge_BreastShade.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_XLarge_BreastShade.png deleted file mode 100644 index 93dd9fff3..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_XLarge_BreastShade.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_XLarge_Latex.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_XLarge_Latex.png deleted file mode 100644 index 7a6397a5b..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_XLarge_Latex.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_XLarge_Shine.png b/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_XLarge_Shine.png deleted file mode 100644 index 383d9f2cf..000000000 Binary files a/Assets/Female3DCG/Suit/SleevelessSlimLatexLeotard_XLarge_Shine.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_AltGloves.png deleted file mode 100644 index eb0c45eca..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_Base.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_Base.png deleted file mode 100644 index ee3940665..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_Gloves.png deleted file mode 100644 index 84b637b8f..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_Zip.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_AltGloves.png deleted file mode 100644 index c68513400..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_Base.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_Base.png deleted file mode 100644 index 9b3226925..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_Gloves.png deleted file mode 100644 index 9f7026123..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_Zip.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_AltGloves.png deleted file mode 100644 index 2a86c8594..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_Base.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_Base.png deleted file mode 100644 index 3c926afd7..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_Gloves.png deleted file mode 100644 index 75ce09e98..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_Zip.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_Zip.png deleted file mode 100644 index a6f6c177c..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_AltGloves.png deleted file mode 100644 index 51465518b..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_Base.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_Base.png deleted file mode 100644 index b40632b5a..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_Gloves.png deleted file mode 100644 index a21bfcc40..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_AltGloves.png deleted file mode 100644 index eb0c45eca..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Gloves.png deleted file mode 100644 index 84b637b8f..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer1.png deleted file mode 100644 index efa9cfade..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer2.png deleted file mode 100644 index 49ac1dbf6..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer3.png deleted file mode 100644 index 832eb4d3e..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer4.png deleted file mode 100644 index ada5550e5..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_AltGloves.png deleted file mode 100644 index c68513400..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Gloves.png deleted file mode 100644 index 9f7026123..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 555a2c421..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer2.png deleted file mode 100644 index 5d587db1d..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer3.png deleted file mode 100644 index 0abb42997..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer4.png deleted file mode 100644 index 30041c97d..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_AltGloves.png deleted file mode 100644 index 2a86c8594..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Gloves.png deleted file mode 100644 index 75ce09e98..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer1.png deleted file mode 100644 index aae358ec2..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer2.png deleted file mode 100644 index 1fb96981a..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer3.png deleted file mode 100644 index 4b872608f..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer4.png deleted file mode 100644 index b3d9c0f26..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_AltGloves.png deleted file mode 100644 index 51465518b..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Gloves.png deleted file mode 100644 index a21bfcc40..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index 77f7653fe..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index a5a9e7b9d..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index 52892b933..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index d4cdc0b26..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Large_AltGloves.png deleted file mode 100644 index eb0c45eca..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Large_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Large_Gloves.png deleted file mode 100644 index 84b637b8f..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Large_Suit.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Large_Suit.png deleted file mode 100644 index a10a54c7b..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Normal_AltGloves.png deleted file mode 100644 index c68513400..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Normal_Gloves.png deleted file mode 100644 index 9f7026123..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Normal_Suit.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Normal_Suit.png deleted file mode 100644 index 881d7ae7d..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Small_AltGloves.png deleted file mode 100644 index 2a86c8594..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Small_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Small_Gloves.png deleted file mode 100644 index 75ce09e98..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Small_Suit.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Small_Suit.png deleted file mode 100644 index 3babbec0c..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_XLarge_AltGloves.png deleted file mode 100644 index 51465518b..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_XLarge_Gloves.png deleted file mode 100644 index a21bfcc40..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_XLarge_Suit.png deleted file mode 100644 index aaf339df0..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/ReverseBunnySuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Large_AltGloves.png deleted file mode 100644 index eb0c45eca..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Large_Gloves.png deleted file mode 100644 index 84b637b8f..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Large_Suit.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Large_Suit.png deleted file mode 100644 index ee3940665..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Normal_AltGloves.png deleted file mode 100644 index c68513400..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Normal_Gloves.png deleted file mode 100644 index 9f7026123..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Normal_Suit.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Normal_Suit.png deleted file mode 100644 index 9b3226925..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Small_AltGloves.png deleted file mode 100644 index 2a86c8594..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Small_Gloves.png deleted file mode 100644 index 75ce09e98..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Small_Suit.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Small_Suit.png deleted file mode 100644 index 3c926afd7..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_XLarge_AltGloves.png deleted file mode 100644 index 51465518b..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_XLarge_Gloves.png deleted file mode 100644 index a21bfcc40..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_XLarge_Suit.png deleted file mode 100644 index b40632b5a..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeamlessCatsuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_AltGloves.png deleted file mode 100644 index 84b637b8f..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index 0a68f4ab1..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_Gloves.png deleted file mode 100644 index eb0c45eca..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index 23d31e5a1..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_AltGloves.png deleted file mode 100644 index 9f7026123..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index b416cb4ba..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_Gloves.png deleted file mode 100644 index c68513400..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index d192b7ffb..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_AltGloves.png deleted file mode 100644 index 75ce09e98..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index 2a83b0b35..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_Gloves.png deleted file mode 100644 index 2a86c8594..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index a6f6c177c..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_AltGloves.png deleted file mode 100644 index a21bfcc40..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index 686a5e940..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_Gloves.png deleted file mode 100644 index 51465518b..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 0bd9d3cd3..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Large_AltGloves.png deleted file mode 100644 index 84b637b8f..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Large_Gloves.png deleted file mode 100644 index eb0c45eca..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Large_Suit.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Large_Suit.png deleted file mode 100644 index 0a68f4ab1..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Normal_AltGloves.png deleted file mode 100644 index 9f7026123..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Normal_Gloves.png deleted file mode 100644 index c68513400..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Normal_Suit.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Normal_Suit.png deleted file mode 100644 index b416cb4ba..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Small_AltGloves.png deleted file mode 100644 index 75ce09e98..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Small_Gloves.png deleted file mode 100644 index 2a86c8594..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Small_Suit.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Small_Suit.png deleted file mode 100644 index 2a83b0b35..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_XLarge_AltGloves.png deleted file mode 100644 index a21bfcc40..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_XLarge_Gloves.png deleted file mode 100644 index 51465518b..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_XLarge_Suit.png deleted file mode 100644 index 686a5e940..000000000 Binary files a/Assets/Female3DCG/Suit/TapedHands/SeethroughSuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_AltGloves.png deleted file mode 100644 index 40f8351bc..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_Base.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_Base.png deleted file mode 100644 index 7fdd9a4d2..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_Gloves.png deleted file mode 100644 index a0447dd7a..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_Zip.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_Zip.png deleted file mode 100644 index 0ed236a4f..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_AltGloves.png deleted file mode 100644 index 564a0cd59..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_Base.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_Base.png deleted file mode 100644 index 2c559f687..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_Gloves.png deleted file mode 100644 index 0e064ebc5..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_Zip.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_Zip.png deleted file mode 100644 index b89a181e6..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_AltGloves.png deleted file mode 100644 index 13959e694..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_Base.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_Base.png deleted file mode 100644 index c956bff94..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_Gloves.png deleted file mode 100644 index 3c930c2c4..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_Zip.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_Zip.png deleted file mode 100644 index d4f355a61..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_AltGloves.png deleted file mode 100644 index e41831e6c..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_Base.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_Base.png deleted file mode 100644 index 9db65daff..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_Gloves.png deleted file mode 100644 index fef97665b..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_Zip.png deleted file mode 100644 index 20981d12a..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_AltGloves.png deleted file mode 100644 index 40f8351bc..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Gloves.png deleted file mode 100644 index a0447dd7a..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer1.png deleted file mode 100644 index efa9cfade..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer2.png deleted file mode 100644 index f7e8ff075..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer3.png deleted file mode 100644 index 832eb4d3e..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer4.png deleted file mode 100644 index 9ae0e33bc..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_AltGloves.png deleted file mode 100644 index 564a0cd59..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Gloves.png deleted file mode 100644 index 0e064ebc5..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 555a2c421..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer2.png deleted file mode 100644 index 2f19e7c8b..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer3.png deleted file mode 100644 index 0abb42997..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer4.png deleted file mode 100644 index 99645a164..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_AltGloves.png deleted file mode 100644 index 13959e694..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Gloves.png deleted file mode 100644 index 3c930c2c4..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer1.png deleted file mode 100644 index aae358ec2..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer2.png deleted file mode 100644 index 1af067a22..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer3.png deleted file mode 100644 index 4b872608f..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer4.png deleted file mode 100644 index e13b49eb3..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_AltGloves.png deleted file mode 100644 index e41831e6c..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Gloves.png deleted file mode 100644 index fef97665b..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index 77f7653fe..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index 5c0bb2d8c..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index 52892b933..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index e6c618df8..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Large_AltGloves.png deleted file mode 100644 index 40f8351bc..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Large_Gloves.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Large_Gloves.png deleted file mode 100644 index a0447dd7a..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Large_Suit.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Large_Suit.png deleted file mode 100644 index 5f398b939..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Normal_AltGloves.png deleted file mode 100644 index 564a0cd59..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Normal_Gloves.png deleted file mode 100644 index 0e064ebc5..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Normal_Suit.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Normal_Suit.png deleted file mode 100644 index 434990a32..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Small_AltGloves.png deleted file mode 100644 index 13959e694..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Small_Gloves.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Small_Gloves.png deleted file mode 100644 index 3c930c2c4..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Small_Suit.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Small_Suit.png deleted file mode 100644 index 4c9934b80..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_XLarge_AltGloves.png deleted file mode 100644 index e41831e6c..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_XLarge_Gloves.png deleted file mode 100644 index fef97665b..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_XLarge_Suit.png deleted file mode 100644 index 167117abc..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/ReverseBunnySuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Large_AltGloves.png deleted file mode 100644 index 40f8351bc..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Large_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Large_Gloves.png deleted file mode 100644 index a0447dd7a..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Large_Suit.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Large_Suit.png deleted file mode 100644 index 7fdd9a4d2..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Normal_AltGloves.png deleted file mode 100644 index 564a0cd59..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Normal_Gloves.png deleted file mode 100644 index 0e064ebc5..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Normal_Suit.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Normal_Suit.png deleted file mode 100644 index 2c559f687..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Small_AltGloves.png deleted file mode 100644 index 13959e694..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Small_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Small_Gloves.png deleted file mode 100644 index 3c930c2c4..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Small_Suit.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Small_Suit.png deleted file mode 100644 index c956bff94..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_XLarge_AltGloves.png deleted file mode 100644 index e41831e6c..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_XLarge_Gloves.png deleted file mode 100644 index fef97665b..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_XLarge_Suit.png deleted file mode 100644 index 9db65daff..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeamlessCatsuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_AltGloves.png deleted file mode 100644 index a0447dd7a..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index 8a46ab4f6..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_Gloves.png deleted file mode 100644 index 40f8351bc..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index 0ed236a4f..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_AltGloves.png deleted file mode 100644 index 0e064ebc5..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index a510ca857..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_Gloves.png deleted file mode 100644 index 564a0cd59..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index b89a181e6..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_AltGloves.png deleted file mode 100644 index 3c930c2c4..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index cdf0cd580..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_Gloves.png deleted file mode 100644 index 13959e694..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index d4f355a61..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_AltGloves.png deleted file mode 100644 index fef97665b..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index 9a563c048..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_Gloves.png deleted file mode 100644 index e41831e6c..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 20981d12a..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Large_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Large_AltGloves.png deleted file mode 100644 index a0447dd7a..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Large_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Large_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Large_Gloves.png deleted file mode 100644 index 40f8351bc..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Large_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Large_Suit.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Large_Suit.png deleted file mode 100644 index 6c4bc1751..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Large_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Normal_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Normal_AltGloves.png deleted file mode 100644 index 0e064ebc5..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Normal_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Normal_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Normal_Gloves.png deleted file mode 100644 index 564a0cd59..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Normal_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Normal_Suit.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Normal_Suit.png deleted file mode 100644 index b6c649cb7..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Normal_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Small_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Small_AltGloves.png deleted file mode 100644 index 3c930c2c4..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Small_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Small_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Small_Gloves.png deleted file mode 100644 index 13959e694..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Small_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Small_Suit.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Small_Suit.png deleted file mode 100644 index b7c39407f..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_Small_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_XLarge_AltGloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_XLarge_AltGloves.png deleted file mode 100644 index fef97665b..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_XLarge_AltGloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_XLarge_Gloves.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_XLarge_Gloves.png deleted file mode 100644 index e41831e6c..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_XLarge_Gloves.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_XLarge_Suit.png b/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_XLarge_Suit.png deleted file mode 100644 index 00180c8bd..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SeethroughSuit_XLarge_Suit.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_Large.png b/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_Large.png deleted file mode 100644 index 2c2bd018e..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_Normal.png b/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_Normal.png deleted file mode 100644 index bb072de05..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_Small.png b/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_Small.png deleted file mode 100644 index c215e0775..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_XLarge.png b/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_XLarge.png deleted file mode 100644 index ba0c26571..000000000 Binary files a/Assets/Female3DCG/Suit/Yoked/SleevelessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/CatsuitPanties_Large.png b/Assets/Female3DCG/SuitLower/CatsuitPanties_Large.png deleted file mode 100644 index 7f7df3c7a..000000000 Binary files a/Assets/Female3DCG/SuitLower/CatsuitPanties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/CatsuitPanties_Normal.png b/Assets/Female3DCG/SuitLower/CatsuitPanties_Normal.png deleted file mode 100644 index 68a5eba8b..000000000 Binary files a/Assets/Female3DCG/SuitLower/CatsuitPanties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/CatsuitPanties_Small.png b/Assets/Female3DCG/SuitLower/CatsuitPanties_Small.png deleted file mode 100644 index 570e37d09..000000000 Binary files a/Assets/Female3DCG/SuitLower/CatsuitPanties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/CatsuitPanties_XLarge.png b/Assets/Female3DCG/SuitLower/CatsuitPanties_XLarge.png deleted file mode 100644 index 47daa4405..000000000 Binary files a/Assets/Female3DCG/SuitLower/CatsuitPanties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Catsuit_Large_Base.png b/Assets/Female3DCG/SuitLower/Catsuit_Large_Base.png deleted file mode 100644 index 9e0d7ef31..000000000 Binary files a/Assets/Female3DCG/SuitLower/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Catsuit_Large_Zip.png b/Assets/Female3DCG/SuitLower/Catsuit_Large_Zip.png deleted file mode 100644 index 5e7025783..000000000 Binary files a/Assets/Female3DCG/SuitLower/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Catsuit_Normal_Base.png b/Assets/Female3DCG/SuitLower/Catsuit_Normal_Base.png deleted file mode 100644 index 3c6634fe8..000000000 Binary files a/Assets/Female3DCG/SuitLower/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Catsuit_Normal_Zip.png b/Assets/Female3DCG/SuitLower/Catsuit_Normal_Zip.png deleted file mode 100644 index 509b75297..000000000 Binary files a/Assets/Female3DCG/SuitLower/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Catsuit_Small_Base.png b/Assets/Female3DCG/SuitLower/Catsuit_Small_Base.png deleted file mode 100644 index b6c7e2538..000000000 Binary files a/Assets/Female3DCG/SuitLower/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Catsuit_Small_Zip.png b/Assets/Female3DCG/SuitLower/Catsuit_Small_Zip.png deleted file mode 100644 index 946c8af26..000000000 Binary files a/Assets/Female3DCG/SuitLower/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Catsuit_XLarge_Base.png b/Assets/Female3DCG/SuitLower/Catsuit_XLarge_Base.png deleted file mode 100644 index d74326f0d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/Catsuit_XLarge_Zip.png deleted file mode 100644 index 4b4f3d724..000000000 Binary files a/Assets/Female3DCG/SuitLower/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_Large.png b/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_Large.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_Normal.png b/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_Normal.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_Small.png b/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_Small.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_XLarge.png b/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_XLarge.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/CatsuitPanties_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Large_Base.png b/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Large_Base.png deleted file mode 100644 index b2b0711e7..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Large_Zip.png b/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Large_Zip.png deleted file mode 100644 index 9d89799ce..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Normal_Base.png b/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Normal_Base.png deleted file mode 100644 index bd97a283c..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Normal_Zip.png b/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Normal_Zip.png deleted file mode 100644 index fdf950d0d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Small_Base.png b/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Small_Base.png deleted file mode 100644 index a9f471489..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Small_Zip.png b/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Small_Zip.png deleted file mode 100644 index dd1086777..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_XLarge_Base.png b/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_XLarge_Base.png deleted file mode 100644 index 1dabbe5a4..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_XLarge_Zip.png deleted file mode 100644 index fdf950d0d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer1.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer2.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer3.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer4.png deleted file mode 100644 index a500e5368..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer1.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer2.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer3.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer4.png deleted file mode 100644 index e8bfabc54..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer1.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer2.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer3.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer4.png deleted file mode 100644 index ab357c723..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index ba85e0506..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index 35e3540dc..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_Large.png b/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_Large.png deleted file mode 100644 index f74360cfa..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_Normal.png b/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_Normal.png deleted file mode 100644 index 38072278e..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_Small.png b/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_Small.png deleted file mode 100644 index 60ffc36e5..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_XLarge.png b/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_XLarge.png deleted file mode 100644 index 71bf76e6a..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/ReverseBunnySuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_Large.png b/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_Large.png deleted file mode 100644 index bc0d1a4c4..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_Normal.png b/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_Normal.png deleted file mode 100644 index 3dba1f077..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_Small.png b/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_Small.png deleted file mode 100644 index 61f76300c..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_XLarge.png b/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_XLarge.png deleted file mode 100644 index c4b383a7c..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeamlessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index 1ea657cb3..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index fdf950d0d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index 2fd18c279..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index fdf950d0d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index 30b198559..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index fdf950d0d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index 1b78aa91c..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index fdf950d0d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_Large.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_Large.png deleted file mode 100644 index ff6948678..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_Normal.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_Normal.png deleted file mode 100644 index e41a12a08..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_Small.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_Small.png deleted file mode 100644 index c0278cc91..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_XLarge.png b/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_XLarge.png deleted file mode 100644 index 9dd36012f..000000000 Binary files a/Assets/Female3DCG/SuitLower/Hogtied/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Large_Base.png b/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Large_Base.png deleted file mode 100644 index 89a8c484c..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Large_Zip.png b/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Large_Zip.png deleted file mode 100644 index f8432e9de..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Normal_Base.png b/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Normal_Base.png deleted file mode 100644 index 2f880e62d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Normal_Zip.png b/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Normal_Zip.png deleted file mode 100644 index 8a4489640..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Small_Base.png b/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Small_Base.png deleted file mode 100644 index 1081f0918..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Small_Zip.png b/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Small_Zip.png deleted file mode 100644 index 4cafc2958..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_XLarge_Base.png b/Assets/Female3DCG/SuitLower/Kneel/Catsuit_XLarge_Base.png deleted file mode 100644 index 80f3cdaac..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/Kneel/Catsuit_XLarge_Zip.png deleted file mode 100644 index 86e08302c..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer1.png deleted file mode 100644 index 0b69e74cd..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer2.png deleted file mode 100644 index f32ea46c2..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer3.png deleted file mode 100644 index 18f6f4961..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer4.png deleted file mode 100644 index ce34f668b..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 75e3b5bdb..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer2.png deleted file mode 100644 index 04223b265..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer3.png deleted file mode 100644 index eb1ef35f9..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer4.png deleted file mode 100644 index 28aa353ab..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer1.png deleted file mode 100644 index ec8f818de..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer2.png deleted file mode 100644 index cb8bd6ee7..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer3.png deleted file mode 100644 index f7e94a741..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer4.png deleted file mode 100644 index f897162e2..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index 99f0abfc6..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index 64cb70678..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index be4c8dd27..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index 4e943e177..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_Large.png b/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_Large.png deleted file mode 100644 index acf62ba73..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_Normal.png b/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_Normal.png deleted file mode 100644 index 3330cbaed..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_Small.png b/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_Small.png deleted file mode 100644 index a5530e8a8..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_XLarge.png b/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_XLarge.png deleted file mode 100644 index a602a54ef..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/ReverseBunnySuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_Large.png b/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_Large.png deleted file mode 100644 index 89a8c484c..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_Normal.png b/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_Normal.png deleted file mode 100644 index 2f880e62d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_Small.png b/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_Small.png deleted file mode 100644 index 1081f0918..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_XLarge.png b/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_XLarge.png deleted file mode 100644 index 80f3cdaac..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeamlessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index 83bf27697..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index f8432e9de..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index 7936a61af..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index 8a4489640..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index efd4c6637..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index 4cafc2958..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index b86db5a76..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 86e08302c..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_Large.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_Large.png deleted file mode 100644 index 83bf27697..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_Normal.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_Normal.png deleted file mode 100644 index 7936a61af..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_Small.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_Small.png deleted file mode 100644 index efd4c6637..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_XLarge.png b/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_XLarge.png deleted file mode 100644 index b86db5a76..000000000 Binary files a/Assets/Female3DCG/SuitLower/Kneel/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Large_Base.png b/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Large_Base.png deleted file mode 100644 index 638d75e85..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Large_Zip.png b/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Large_Zip.png deleted file mode 100644 index 7fa90ce46..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Normal_Base.png b/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Normal_Base.png deleted file mode 100644 index 6586eb6b6..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Normal_Zip.png b/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Normal_Zip.png deleted file mode 100644 index 4379a62a7..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Small_Base.png b/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Small_Base.png deleted file mode 100644 index 036ecf4d0..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Small_Zip.png b/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Small_Zip.png deleted file mode 100644 index a2b2a36d1..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_XLarge_Base.png b/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_XLarge_Base.png deleted file mode 100644 index 0979c33b1..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_XLarge_Zip.png deleted file mode 100644 index dc9654197..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer1.png deleted file mode 100644 index ad072593b..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer2.png deleted file mode 100644 index 5315610a3..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer3.png deleted file mode 100644 index f6247113a..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer4.png deleted file mode 100644 index fd6558f58..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 25e9f6c4c..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer2.png deleted file mode 100644 index b36d44fed..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer3.png deleted file mode 100644 index ed698b0e3..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer4.png deleted file mode 100644 index a3fef7a01..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer1.png deleted file mode 100644 index 00d5ff00b..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer2.png deleted file mode 100644 index ff9594c23..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer3.png deleted file mode 100644 index d235c57a7..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer4.png deleted file mode 100644 index 3dffbbf58..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index 0aff39ec3..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index fd378b55c..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index 8a9ce0219..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index fd6558f58..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_Large.png b/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_Large.png deleted file mode 100644 index 82063fd66..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_Normal.png b/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_Normal.png deleted file mode 100644 index acc2d65df..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_Small.png b/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_Small.png deleted file mode 100644 index 89cc2648f..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_XLarge.png b/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_XLarge.png deleted file mode 100644 index de1b8ab8f..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/ReverseBunnySuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_Large.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_Large.png deleted file mode 100644 index 638d75e85..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_Normal.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_Normal.png deleted file mode 100644 index 6586eb6b6..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_Small.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_Small.png deleted file mode 100644 index 036ecf4d0..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_XLarge.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_XLarge.png deleted file mode 100644 index 0979c33b1..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeamlessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index eef36bbb2..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index d25cde663..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index b4025f690..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index 75c543651..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index d60760b14..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index 2cb21854c..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index 033a8fad1..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index ac682e987..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_Large.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_Large.png deleted file mode 100644 index eef36bbb2..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_Normal.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_Normal.png deleted file mode 100644 index b4025f690..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_Small.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_Small.png deleted file mode 100644 index d60760b14..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_XLarge.png b/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_XLarge.png deleted file mode 100644 index 033a8fad1..000000000 Binary files a/Assets/Female3DCG/SuitLower/KneelingSpread/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Large_Base.png b/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Large_Base.png deleted file mode 100644 index 0f53bf5e4..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Large_Zip.png b/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Large_Zip.png deleted file mode 100644 index c618c94e2..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Normal_Base.png b/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Normal_Base.png deleted file mode 100644 index 2d08db220..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Normal_Zip.png b/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Normal_Zip.png deleted file mode 100644 index b8f39037a..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Small_Base.png b/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Small_Base.png deleted file mode 100644 index a1b8c991f..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Small_Zip.png b/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Small_Zip.png deleted file mode 100644 index da73bc810..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_XLarge_Base.png b/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_XLarge_Base.png deleted file mode 100644 index a72ff3fa5..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_XLarge_Zip.png deleted file mode 100644 index 847c8cbe2..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer1.png deleted file mode 100644 index 56e9f2bb0..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer2.png deleted file mode 100644 index c77852bc3..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer3.png deleted file mode 100644 index f52738654..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer4.png deleted file mode 100644 index dd1824aab..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 0b08a1ed7..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer2.png deleted file mode 100644 index 5066f8daa..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer3.png deleted file mode 100644 index 8794a82a1..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer4.png deleted file mode 100644 index 3938317fb..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer1.pdn b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer1.pdn deleted file mode 100644 index 09b81131a..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer1.pdn and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer1.png deleted file mode 100644 index 702e3d186..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer2.png deleted file mode 100644 index 7a8a47c9d..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer3.png deleted file mode 100644 index d096f92f7..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer4.png deleted file mode 100644 index 8abf6e6ff..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index b08a5a954..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index 15b4cff7e..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index 30022655f..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index 7e21d2410..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_Large.png b/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_Large.png deleted file mode 100644 index 9ade3ba1a..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_Normal.png b/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_Normal.png deleted file mode 100644 index 075cbdbe2..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_Small.png b/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_Small.png deleted file mode 100644 index 1c030d245..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_XLarge.png b/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_XLarge.png deleted file mode 100644 index 5636f27c2..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/ReverseBunnySuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_Large.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_Large.png deleted file mode 100644 index 0f53bf5e4..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_Normal.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_Normal.png deleted file mode 100644 index 2d08db220..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_Small.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_Small.png deleted file mode 100644 index a1b8c991f..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_XLarge.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_XLarge.png deleted file mode 100644 index a72ff3fa5..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeamlessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index e24ba2b22..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index c618c94e2..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index 5fae00c22..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index b8f39037a..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index a758d8b38..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index da73bc810..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index 3a7bac7a3..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 847c8cbe2..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_Large.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_Large.png deleted file mode 100644 index e24ba2b22..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_Normal.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_Normal.png deleted file mode 100644 index 5fae00c22..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_Small.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_Small.png deleted file mode 100644 index a758d8b38..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_XLarge.png b/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_XLarge.png deleted file mode 100644 index 3a7bac7a3..000000000 Binary files a/Assets/Female3DCG/SuitLower/LegsClosed/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer1.png deleted file mode 100644 index c1cd71cb6..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer2.png deleted file mode 100644 index 0167d6a8e..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer3.png deleted file mode 100644 index 6a5c6fe74..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer4.png deleted file mode 100644 index 264cba770..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 82fbea452..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer2.png deleted file mode 100644 index 8acae2623..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer3.png deleted file mode 100644 index 6a5c6fe74..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer4.png deleted file mode 100644 index 768955412..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer1.png deleted file mode 100644 index f3b05216c..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer2.png deleted file mode 100644 index 53fc293b8..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer3.png deleted file mode 100644 index 6a5c6fe74..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer4.png deleted file mode 100644 index 3479b16a1..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index 22e335340..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index fc53fe677..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index 6a5c6fe74..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index bb4fca6f7..000000000 Binary files a/Assets/Female3DCG/SuitLower/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Preview/Catsuit.png b/Assets/Female3DCG/SuitLower/Preview/Catsuit.png deleted file mode 100644 index 788582ea8..000000000 Binary files a/Assets/Female3DCG/SuitLower/Preview/Catsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Preview/CatsuitPanties.png b/Assets/Female3DCG/SuitLower/Preview/CatsuitPanties.png deleted file mode 100644 index dd38468db..000000000 Binary files a/Assets/Female3DCG/SuitLower/Preview/CatsuitPanties.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Preview/PilotSuit.png b/Assets/Female3DCG/SuitLower/Preview/PilotSuit.png deleted file mode 100644 index 785a4eed6..000000000 Binary files a/Assets/Female3DCG/SuitLower/Preview/PilotSuit.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Preview/ReverseBunnySuit.png b/Assets/Female3DCG/SuitLower/Preview/ReverseBunnySuit.png deleted file mode 100644 index fd18bb52a..000000000 Binary files a/Assets/Female3DCG/SuitLower/Preview/ReverseBunnySuit.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Preview/SeamlessCatsuit.png b/Assets/Female3DCG/SuitLower/Preview/SeamlessCatsuit.png deleted file mode 100644 index 788582ea8..000000000 Binary files a/Assets/Female3DCG/SuitLower/Preview/SeamlessCatsuit.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Preview/SeethroughSuit.png b/Assets/Female3DCG/SuitLower/Preview/SeethroughSuit.png deleted file mode 100644 index f04f6e377..000000000 Binary files a/Assets/Female3DCG/SuitLower/Preview/SeethroughSuit.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Preview/SeethroughSuitZip.png b/Assets/Female3DCG/SuitLower/Preview/SeethroughSuitZip.png deleted file mode 100644 index 0039ffe6f..000000000 Binary files a/Assets/Female3DCG/SuitLower/Preview/SeethroughSuitZip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/ReverseBunnySuit_Large.png b/Assets/Female3DCG/SuitLower/ReverseBunnySuit_Large.png deleted file mode 100644 index 8b17a643e..000000000 Binary files a/Assets/Female3DCG/SuitLower/ReverseBunnySuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/ReverseBunnySuit_Normal.png b/Assets/Female3DCG/SuitLower/ReverseBunnySuit_Normal.png deleted file mode 100644 index 93d42fdf7..000000000 Binary files a/Assets/Female3DCG/SuitLower/ReverseBunnySuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/ReverseBunnySuit_Small.png b/Assets/Female3DCG/SuitLower/ReverseBunnySuit_Small.png deleted file mode 100644 index 904f1f0df..000000000 Binary files a/Assets/Female3DCG/SuitLower/ReverseBunnySuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/ReverseBunnySuit_XLarge.png b/Assets/Female3DCG/SuitLower/ReverseBunnySuit_XLarge.png deleted file mode 100644 index 6d47b2209..000000000 Binary files a/Assets/Female3DCG/SuitLower/ReverseBunnySuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeamlessCatsuit_Large.png b/Assets/Female3DCG/SuitLower/SeamlessCatsuit_Large.png deleted file mode 100644 index 9e0d7ef31..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeamlessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeamlessCatsuit_Normal.png b/Assets/Female3DCG/SuitLower/SeamlessCatsuit_Normal.png deleted file mode 100644 index 3c6634fe8..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeamlessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeamlessCatsuit_Small.png b/Assets/Female3DCG/SuitLower/SeamlessCatsuit_Small.png deleted file mode 100644 index b6c7e2538..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeamlessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeamlessCatsuit_XLarge.png b/Assets/Female3DCG/SuitLower/SeamlessCatsuit_XLarge.png deleted file mode 100644 index d74326f0d..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeamlessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index f6e35f6e9..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index 5e7025783..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index fcd74a4cf..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index 509b75297..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index 06d80c178..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index 946c8af26..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/SuitLower/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index 034b44e91..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 4b4f3d724..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuit_Large.png b/Assets/Female3DCG/SuitLower/SeethroughSuit_Large.png deleted file mode 100644 index f6e35f6e9..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuit_Normal.png b/Assets/Female3DCG/SuitLower/SeethroughSuit_Normal.png deleted file mode 100644 index fcd74a4cf..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuit_Small.png b/Assets/Female3DCG/SuitLower/SeethroughSuit_Small.png deleted file mode 100644 index 06d80c178..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/SeethroughSuit_XLarge.png b/Assets/Female3DCG/SuitLower/SeethroughSuit_XLarge.png deleted file mode 100644 index 034b44e91..000000000 Binary files a/Assets/Female3DCG/SuitLower/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Large_Base.png b/Assets/Female3DCG/SuitLower/Spread/Catsuit_Large_Base.png deleted file mode 100644 index 905308a3a..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Large_Zip.png b/Assets/Female3DCG/SuitLower/Spread/Catsuit_Large_Zip.png deleted file mode 100644 index 5e7025783..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Normal_Base.png b/Assets/Female3DCG/SuitLower/Spread/Catsuit_Normal_Base.png deleted file mode 100644 index 2239a33a3..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Normal_Zip.png b/Assets/Female3DCG/SuitLower/Spread/Catsuit_Normal_Zip.png deleted file mode 100644 index 509b75297..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Small_Base.png b/Assets/Female3DCG/SuitLower/Spread/Catsuit_Small_Base.png deleted file mode 100644 index 37d1c6e55..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Small_Zip.png b/Assets/Female3DCG/SuitLower/Spread/Catsuit_Small_Zip.png deleted file mode 100644 index 946c8af26..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/Catsuit_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/Catsuit_XLarge_Base.png b/Assets/Female3DCG/SuitLower/Spread/Catsuit_XLarge_Base.png deleted file mode 100644 index 2c703d78d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/Catsuit_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/Catsuit_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/Spread/Catsuit_XLarge_Zip.png deleted file mode 100644 index 4b4f3d724..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/Catsuit_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer1.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer1.png deleted file mode 100644 index 58627f9c8..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer2.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer2.png deleted file mode 100644 index 9f2cbbc55..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer3.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer3.png deleted file mode 100644 index 8432c6c07..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer4.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer4.png deleted file mode 100644 index a3b5aee42..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Large_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer1.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer1.png deleted file mode 100644 index 22d48e1f1..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer2.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer2.png deleted file mode 100644 index 327ee570d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer3.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer3.png deleted file mode 100644 index 8432c6c07..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer4.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer4.png deleted file mode 100644 index ee1f0730e..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Normal_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer1.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer1.png deleted file mode 100644 index 59a555cec..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer2.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer2.png deleted file mode 100644 index 2e5a84579..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer3.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer3.png deleted file mode 100644 index 8432c6c07..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer4.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer4.png deleted file mode 100644 index 061a7556e..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_Small_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer1.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer1.png deleted file mode 100644 index dc2e17786..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer1.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer2.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer2.png deleted file mode 100644 index 07c803cda..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer2.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer3.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer3.png deleted file mode 100644 index 8432c6c07..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer3.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer4.png b/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer4.png deleted file mode 100644 index 5228c03e1..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/PilotSuit_XLarge_Layer4.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_Large.png b/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_Large.png deleted file mode 100644 index 6b0bbed4c..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_Normal.png b/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_Normal.png deleted file mode 100644 index 5eedb51ac..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_Small.png b/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_Small.png deleted file mode 100644 index 48871bd15..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_XLarge.png b/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_XLarge.png deleted file mode 100644 index 299c45e70..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/ReverseBunnySuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_Large.png b/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_Large.png deleted file mode 100644 index 905308a3a..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_Normal.png b/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_Normal.png deleted file mode 100644 index 2239a33a3..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_Small.png b/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_Small.png deleted file mode 100644 index 37d1c6e55..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_XLarge.png b/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_XLarge.png deleted file mode 100644 index 2c703d78d..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeamlessCatsuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Large_Base.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Large_Base.png deleted file mode 100644 index f08476972..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Large_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Large_Zip.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Large_Zip.png deleted file mode 100644 index 5e7025783..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Large_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Normal_Base.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Normal_Base.png deleted file mode 100644 index 391b26781..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Normal_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Normal_Zip.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Normal_Zip.png deleted file mode 100644 index 509b75297..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Normal_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Small_Base.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Small_Base.png deleted file mode 100644 index 8150884fc..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Small_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Small_Zip.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Small_Zip.png deleted file mode 100644 index 946c8af26..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_Small_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_XLarge_Base.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_XLarge_Base.png deleted file mode 100644 index 8369dd2cf..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_XLarge_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_XLarge_Zip.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_XLarge_Zip.png deleted file mode 100644 index 4b4f3d724..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuitZip_XLarge_Zip.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_Large.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_Large.png deleted file mode 100644 index f08476972..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_Large.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_Normal.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_Normal.png deleted file mode 100644 index 391b26781..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_Normal.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_Small.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_Small.png deleted file mode 100644 index 8150884fc..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_Small.png and /dev/null differ diff --git a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_XLarge.png b/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_XLarge.png deleted file mode 100644 index 8369dd2cf..000000000 Binary files a/Assets/Female3DCG/SuitLower/Spread/SeethroughSuit_XLarge.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/AllFours/CowtailStrap.png b/Assets/Female3DCG/TailStraps/AllFours/CowtailStrap.png deleted file mode 100644 index ac67a2404..000000000 Binary files a/Assets/Female3DCG/TailStraps/AllFours/CowtailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/AllFours/DemonPlug.png b/Assets/Female3DCG/TailStraps/AllFours/DemonPlug.png deleted file mode 100644 index a1cf2a1c6..000000000 Binary files a/Assets/Female3DCG/TailStraps/AllFours/DemonPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/AllFours/HorseTailStrap.png b/Assets/Female3DCG/TailStraps/AllFours/HorseTailStrap.png deleted file mode 100644 index f3fb9ca74..000000000 Binary files a/Assets/Female3DCG/TailStraps/AllFours/HorseTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/AllFours/HorseTailStrap1.png b/Assets/Female3DCG/TailStraps/AllFours/HorseTailStrap1.png deleted file mode 100644 index 690fd9f79..000000000 Binary files a/Assets/Female3DCG/TailStraps/AllFours/HorseTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/AllFours/KittenTailStrap2.png b/Assets/Female3DCG/TailStraps/AllFours/KittenTailStrap2.png deleted file mode 100644 index 797191159..000000000 Binary files a/Assets/Female3DCG/TailStraps/AllFours/KittenTailStrap2.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/AllFours/PuppyTailStrap.png b/Assets/Female3DCG/TailStraps/AllFours/PuppyTailStrap.png deleted file mode 100644 index e67991fca..000000000 Binary files a/Assets/Female3DCG/TailStraps/AllFours/PuppyTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/AllFours/PuppyTailStrap1.png b/Assets/Female3DCG/TailStraps/AllFours/PuppyTailStrap1.png deleted file mode 100644 index a4d09a1ef..000000000 Binary files a/Assets/Female3DCG/TailStraps/AllFours/PuppyTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/AllFours/RaccoonStrap.png b/Assets/Female3DCG/TailStraps/AllFours/RaccoonStrap.png deleted file mode 100644 index 2eb92cf6e..000000000 Binary files a/Assets/Female3DCG/TailStraps/AllFours/RaccoonStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/AllFours/SuccubusTailStrap.png b/Assets/Female3DCG/TailStraps/AllFours/SuccubusTailStrap.png deleted file mode 100644 index 62ff67a23..000000000 Binary files a/Assets/Female3DCG/TailStraps/AllFours/SuccubusTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/AllFours/WolfTailStrap2.png b/Assets/Female3DCG/TailStraps/AllFours/WolfTailStrap2.png deleted file mode 100644 index 70ce93583..000000000 Binary files a/Assets/Female3DCG/TailStraps/AllFours/WolfTailStrap2.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/AllFours/WolfTailStrap3.png b/Assets/Female3DCG/TailStraps/AllFours/WolfTailStrap3.png deleted file mode 100644 index 3eab44737..000000000 Binary files a/Assets/Female3DCG/TailStraps/AllFours/WolfTailStrap3.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/CowtailStrap.png b/Assets/Female3DCG/TailStraps/CowtailStrap.png deleted file mode 100644 index b628c348b..000000000 Binary files a/Assets/Female3DCG/TailStraps/CowtailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/DemonPlug.png b/Assets/Female3DCG/TailStraps/DemonPlug.png deleted file mode 100644 index ca30cef95..000000000 Binary files a/Assets/Female3DCG/TailStraps/DemonPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/DragonTailStrap1_Primary.png b/Assets/Female3DCG/TailStraps/DragonTailStrap1_Primary.png deleted file mode 100644 index ead42ae6d..000000000 Binary files a/Assets/Female3DCG/TailStraps/DragonTailStrap1_Primary.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/DragonTailStrap1_Secondary.png b/Assets/Female3DCG/TailStraps/DragonTailStrap1_Secondary.png deleted file mode 100644 index b9367247e..000000000 Binary files a/Assets/Female3DCG/TailStraps/DragonTailStrap1_Secondary.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/FoxTailStrap1_Base.png b/Assets/Female3DCG/TailStraps/FoxTailStrap1_Base.png deleted file mode 100644 index f246481cd..000000000 Binary files a/Assets/Female3DCG/TailStraps/FoxTailStrap1_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/FoxTailStrap1_Tip.png b/Assets/Female3DCG/TailStraps/FoxTailStrap1_Tip.png deleted file mode 100644 index dd32dcebb..000000000 Binary files a/Assets/Female3DCG/TailStraps/FoxTailStrap1_Tip.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/FoxTailStrap2_Base.png b/Assets/Female3DCG/TailStraps/FoxTailStrap2_Base.png deleted file mode 100644 index b5cf70cd2..000000000 Binary files a/Assets/Female3DCG/TailStraps/FoxTailStrap2_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/FoxTailStrap2_Tip.png b/Assets/Female3DCG/TailStraps/FoxTailStrap2_Tip.png deleted file mode 100644 index 1bbe9e075..000000000 Binary files a/Assets/Female3DCG/TailStraps/FoxTailStrap2_Tip.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/FoxTailsStrap_Bases.png b/Assets/Female3DCG/TailStraps/FoxTailsStrap_Bases.png deleted file mode 100644 index 157e33f22..000000000 Binary files a/Assets/Female3DCG/TailStraps/FoxTailsStrap_Bases.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/FoxTailsStrap_Tips.png b/Assets/Female3DCG/TailStraps/FoxTailsStrap_Tips.png deleted file mode 100644 index 9d3b61164..000000000 Binary files a/Assets/Female3DCG/TailStraps/FoxTailsStrap_Tips.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/HorseTailStrap.png b/Assets/Female3DCG/TailStraps/HorseTailStrap.png deleted file mode 100644 index 16eeab134..000000000 Binary files a/Assets/Female3DCG/TailStraps/HorseTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/HorseTailStrap1.png b/Assets/Female3DCG/TailStraps/HorseTailStrap1.png deleted file mode 100644 index 0f3570dd3..000000000 Binary files a/Assets/Female3DCG/TailStraps/HorseTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/KittenTailStrap1.png b/Assets/Female3DCG/TailStraps/KittenTailStrap1.png deleted file mode 100644 index 10c70c0fe..000000000 Binary files a/Assets/Female3DCG/TailStraps/KittenTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/KittenTailStrap2.png b/Assets/Female3DCG/TailStraps/KittenTailStrap2.png deleted file mode 100644 index a1effd2af..000000000 Binary files a/Assets/Female3DCG/TailStraps/KittenTailStrap2.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/MouseTailStrap1.png b/Assets/Female3DCG/TailStraps/MouseTailStrap1.png deleted file mode 100644 index f1852b8aa..000000000 Binary files a/Assets/Female3DCG/TailStraps/MouseTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/MouseTailStrap2.png b/Assets/Female3DCG/TailStraps/MouseTailStrap2.png deleted file mode 100644 index 67dbed132..000000000 Binary files a/Assets/Female3DCG/TailStraps/MouseTailStrap2.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/BunnyTailStrap.png b/Assets/Female3DCG/TailStraps/Preview/BunnyTailStrap.png deleted file mode 100644 index aeedd057a..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/BunnyTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/CowtailStrap.png b/Assets/Female3DCG/TailStraps/Preview/CowtailStrap.png deleted file mode 100644 index 5bd902efe..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/CowtailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/DemonPlug.png b/Assets/Female3DCG/TailStraps/Preview/DemonPlug.png deleted file mode 100644 index 0a053dfcf..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/DemonPlug.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/DragonTailStrap1.png b/Assets/Female3DCG/TailStraps/Preview/DragonTailStrap1.png deleted file mode 100644 index 85f3be5a0..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/DragonTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/FoxTailStrap1.png b/Assets/Female3DCG/TailStraps/Preview/FoxTailStrap1.png deleted file mode 100644 index c8e64b35d..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/FoxTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/FoxTailStrap2.png b/Assets/Female3DCG/TailStraps/Preview/FoxTailStrap2.png deleted file mode 100644 index 5fa8a22f9..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/FoxTailStrap2.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/FoxTailsStrap.png b/Assets/Female3DCG/TailStraps/Preview/FoxTailsStrap.png deleted file mode 100644 index 52907d53a..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/FoxTailsStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/HorseTailStrap.png b/Assets/Female3DCG/TailStraps/Preview/HorseTailStrap.png deleted file mode 100644 index 885af19cb..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/HorseTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/HorseTailStrap1.png b/Assets/Female3DCG/TailStraps/Preview/HorseTailStrap1.png deleted file mode 100644 index 3a7fe468d..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/HorseTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/KittenTailStrap1.png b/Assets/Female3DCG/TailStraps/Preview/KittenTailStrap1.png deleted file mode 100644 index 60faf34cb..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/KittenTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/KittenTailStrap2.png b/Assets/Female3DCG/TailStraps/Preview/KittenTailStrap2.png deleted file mode 100644 index fb5579503..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/KittenTailStrap2.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/MouseTailStrap1.png b/Assets/Female3DCG/TailStraps/Preview/MouseTailStrap1.png deleted file mode 100644 index 4e00ee09b..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/MouseTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/MouseTailStrap2.png b/Assets/Female3DCG/TailStraps/Preview/MouseTailStrap2.png deleted file mode 100644 index 55f6d3022..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/MouseTailStrap2.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/PuppyTailStrap.png b/Assets/Female3DCG/TailStraps/Preview/PuppyTailStrap.png deleted file mode 100644 index 6f2d0277f..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/PuppyTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/PuppyTailStrap1.png b/Assets/Female3DCG/TailStraps/Preview/PuppyTailStrap1.png deleted file mode 100644 index ad8837939..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/PuppyTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/RaccoonStrap.png b/Assets/Female3DCG/TailStraps/Preview/RaccoonStrap.png deleted file mode 100644 index f93251c93..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/RaccoonStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/RaccoonTailStrap.png b/Assets/Female3DCG/TailStraps/Preview/RaccoonTailStrap.png deleted file mode 100644 index 9fdb29f7e..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/RaccoonTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/SuccubusHeartTailStrap.png b/Assets/Female3DCG/TailStraps/Preview/SuccubusHeartTailStrap.png deleted file mode 100644 index 3cbd3f5b5..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/SuccubusHeartTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/SuccubusTailStrap.png b/Assets/Female3DCG/TailStraps/Preview/SuccubusTailStrap.png deleted file mode 100644 index 685fe3595..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/SuccubusTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/TailStrap.png b/Assets/Female3DCG/TailStraps/Preview/TailStrap.png deleted file mode 100644 index 6cb9fc6ba..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/TailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/Tentacles.png b/Assets/Female3DCG/TailStraps/Preview/Tentacles.png deleted file mode 100644 index 510ea7c8a..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/Tentacles.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/WolfTailStrap1.png b/Assets/Female3DCG/TailStraps/Preview/WolfTailStrap1.png deleted file mode 100644 index ba0b43839..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/WolfTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/WolfTailStrap2.png b/Assets/Female3DCG/TailStraps/Preview/WolfTailStrap2.png deleted file mode 100644 index 50025f3f3..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/WolfTailStrap2.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Preview/WolfTailStrap3.png b/Assets/Female3DCG/TailStraps/Preview/WolfTailStrap3.png deleted file mode 100644 index 3377d452f..000000000 Binary files a/Assets/Female3DCG/TailStraps/Preview/WolfTailStrap3.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/PuppyTailStrap.png b/Assets/Female3DCG/TailStraps/PuppyTailStrap.png deleted file mode 100644 index 26c451f87..000000000 Binary files a/Assets/Female3DCG/TailStraps/PuppyTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/PuppyTailStrap1.png b/Assets/Female3DCG/TailStraps/PuppyTailStrap1.png deleted file mode 100644 index 80e4d6c9a..000000000 Binary files a/Assets/Female3DCG/TailStraps/PuppyTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/RaccoonStrap.png b/Assets/Female3DCG/TailStraps/RaccoonStrap.png deleted file mode 100644 index 2eb92cf6e..000000000 Binary files a/Assets/Female3DCG/TailStraps/RaccoonStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/RaccoonTailStrap.png b/Assets/Female3DCG/TailStraps/RaccoonTailStrap.png deleted file mode 100644 index 31106916a..000000000 Binary files a/Assets/Female3DCG/TailStraps/RaccoonTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/SuccubusHeartTailStrap_Heart.png b/Assets/Female3DCG/TailStraps/SuccubusHeartTailStrap_Heart.png deleted file mode 100644 index df27f529d..000000000 Binary files a/Assets/Female3DCG/TailStraps/SuccubusHeartTailStrap_Heart.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/SuccubusHeartTailStrap_Tail.png b/Assets/Female3DCG/TailStraps/SuccubusHeartTailStrap_Tail.png deleted file mode 100644 index 22570b0c4..000000000 Binary files a/Assets/Female3DCG/TailStraps/SuccubusHeartTailStrap_Tail.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/SuccubusTailStrap.png b/Assets/Female3DCG/TailStraps/SuccubusTailStrap.png deleted file mode 100644 index b22ce6f00..000000000 Binary files a/Assets/Female3DCG/TailStraps/SuccubusTailStrap.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/TailStrap_Bell.png b/Assets/Female3DCG/TailStraps/TailStrap_Bell.png deleted file mode 100644 index 17f5b49ad..000000000 Binary files a/Assets/Female3DCG/TailStraps/TailStrap_Bell.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/TailStrap_Ribbon.png b/Assets/Female3DCG/TailStraps/TailStrap_Ribbon.png deleted file mode 100644 index 5a436253e..000000000 Binary files a/Assets/Female3DCG/TailStraps/TailStrap_Ribbon.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/TailStrap_Tail.png b/Assets/Female3DCG/TailStraps/TailStrap_Tail.png deleted file mode 100644 index 1fbaa0fee..000000000 Binary files a/Assets/Female3DCG/TailStraps/TailStrap_Tail.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Tentacles_Inner.png b/Assets/Female3DCG/TailStraps/Tentacles_Inner.png deleted file mode 100644 index d231244f2..000000000 Binary files a/Assets/Female3DCG/TailStraps/Tentacles_Inner.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Tentacles_InnerShine.png b/Assets/Female3DCG/TailStraps/Tentacles_InnerShine.png deleted file mode 100644 index b54ca0f64..000000000 Binary files a/Assets/Female3DCG/TailStraps/Tentacles_InnerShine.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Tentacles_Outer.png b/Assets/Female3DCG/TailStraps/Tentacles_Outer.png deleted file mode 100644 index 4787771ab..000000000 Binary files a/Assets/Female3DCG/TailStraps/Tentacles_Outer.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Tentacles_OuterShine.png b/Assets/Female3DCG/TailStraps/Tentacles_OuterShine.png deleted file mode 100644 index d3335adac..000000000 Binary files a/Assets/Female3DCG/TailStraps/Tentacles_OuterShine.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/Tentacles_Sucker.png b/Assets/Female3DCG/TailStraps/Tentacles_Sucker.png deleted file mode 100644 index 085fe00a2..000000000 Binary files a/Assets/Female3DCG/TailStraps/Tentacles_Sucker.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/WolfTailStrap1.png b/Assets/Female3DCG/TailStraps/WolfTailStrap1.png deleted file mode 100644 index 77c511444..000000000 Binary files a/Assets/Female3DCG/TailStraps/WolfTailStrap1.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/WolfTailStrap2.png b/Assets/Female3DCG/TailStraps/WolfTailStrap2.png deleted file mode 100644 index aec38c056..000000000 Binary files a/Assets/Female3DCG/TailStraps/WolfTailStrap2.png and /dev/null differ diff --git a/Assets/Female3DCG/TailStraps/WolfTailStrap3.png b/Assets/Female3DCG/TailStraps/WolfTailStrap3.png deleted file mode 100644 index 2305fd6e5..000000000 Binary files a/Assets/Female3DCG/TailStraps/WolfTailStrap3.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/AngelFeather.png b/Assets/Female3DCG/Wings/AngelFeather.png deleted file mode 100644 index 1e5e9f5d0..000000000 Binary files a/Assets/Female3DCG/Wings/AngelFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/AngelWings.png b/Assets/Female3DCG/Wings/AngelWings.png deleted file mode 100644 index 787b6e726..000000000 Binary files a/Assets/Female3DCG/Wings/AngelWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/BatWings.png b/Assets/Female3DCG/Wings/BatWings.png deleted file mode 100644 index 39170a7b1..000000000 Binary files a/Assets/Female3DCG/Wings/BatWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/BeeWings_Bone.png b/Assets/Female3DCG/Wings/BeeWings_Bone.png deleted file mode 100644 index 164ff6e58..000000000 Binary files a/Assets/Female3DCG/Wings/BeeWings_Bone.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/BeeWings_Veins.png b/Assets/Female3DCG/Wings/BeeWings_Veins.png deleted file mode 100644 index b96c1aab1..000000000 Binary files a/Assets/Female3DCG/Wings/BeeWings_Veins.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/BeeWings_Wings.png b/Assets/Female3DCG/Wings/BeeWings_Wings.png deleted file mode 100644 index 89ac1e01b..000000000 Binary files a/Assets/Female3DCG/Wings/BeeWings_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/CyberWings_Base.png b/Assets/Female3DCG/Wings/CyberWings_Base.png deleted file mode 100644 index 93afdb16c..000000000 Binary files a/Assets/Female3DCG/Wings/CyberWings_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/CyberWings_Highlights.png b/Assets/Female3DCG/Wings/CyberWings_Highlights.png deleted file mode 100644 index 6729ac32d..000000000 Binary files a/Assets/Female3DCG/Wings/CyberWings_Highlights.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/CyberWings_Shade.png b/Assets/Female3DCG/Wings/CyberWings_Shade.png deleted file mode 100644 index 269a21805..000000000 Binary files a/Assets/Female3DCG/Wings/CyberWings_Shade.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/DevilWings.png b/Assets/Female3DCG/Wings/DevilWings.png deleted file mode 100644 index e749f94fc..000000000 Binary files a/Assets/Female3DCG/Wings/DevilWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/FairyWings.png b/Assets/Female3DCG/Wings/FairyWings.png deleted file mode 100644 index a2ca74197..000000000 Binary files a/Assets/Female3DCG/Wings/FairyWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/FallenAngelWings.png b/Assets/Female3DCG/Wings/FallenAngelWings.png deleted file mode 100644 index 4d5fda1eb..000000000 Binary files a/Assets/Female3DCG/Wings/FallenAngelWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/PixieWings_Veins.png b/Assets/Female3DCG/Wings/PixieWings_Veins.png deleted file mode 100644 index 33b0720fa..000000000 Binary files a/Assets/Female3DCG/Wings/PixieWings_Veins.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/PixieWings_Wings.png b/Assets/Female3DCG/Wings/PixieWings_Wings.png deleted file mode 100644 index 471b79b1f..000000000 Binary files a/Assets/Female3DCG/Wings/PixieWings_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/AngelFeather.png b/Assets/Female3DCG/Wings/Preview/AngelFeather.png deleted file mode 100644 index 44a19ada7..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/AngelFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/AngelWings.png b/Assets/Female3DCG/Wings/Preview/AngelWings.png deleted file mode 100644 index cbc7cf8b1..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/AngelWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/BatWings.png b/Assets/Female3DCG/Wings/Preview/BatWings.png deleted file mode 100644 index 523739c49..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/BatWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/BeeWings.png b/Assets/Female3DCG/Wings/Preview/BeeWings.png deleted file mode 100644 index 702a36a97..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/BeeWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/CyberWings.png b/Assets/Female3DCG/Wings/Preview/CyberWings.png deleted file mode 100644 index 357688847..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/CyberWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/DevilWings.png b/Assets/Female3DCG/Wings/Preview/DevilWings.png deleted file mode 100644 index 2c5493de3..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/DevilWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/FairyWings.png b/Assets/Female3DCG/Wings/Preview/FairyWings.png deleted file mode 100644 index dd43d114c..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/FairyWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/FallenAngelWings.png b/Assets/Female3DCG/Wings/Preview/FallenAngelWings.png deleted file mode 100644 index 9a8e7deff..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/FallenAngelWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/PixieWings.png b/Assets/Female3DCG/Wings/Preview/PixieWings.png deleted file mode 100644 index 113fee71b..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/PixieWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/SteampunkWings.png b/Assets/Female3DCG/Wings/Preview/SteampunkWings.png deleted file mode 100644 index 15e7f3fec..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/SteampunkWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/SuccubusFeather.png b/Assets/Female3DCG/Wings/Preview/SuccubusFeather.png deleted file mode 100644 index c0cd85de1..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/SuccubusFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/Preview/SuccubusWings.png b/Assets/Female3DCG/Wings/Preview/SuccubusWings.png deleted file mode 100644 index fe6c49167..000000000 Binary files a/Assets/Female3DCG/Wings/Preview/SuccubusWings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings0_Gears.png b/Assets/Female3DCG/Wings/SteampunkWings0_Gears.png deleted file mode 100644 index ae89b2b64..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings0_Gears.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings0_WingFrames.png b/Assets/Female3DCG/Wings/SteampunkWings0_WingFrames.png deleted file mode 100644 index 290b9b72e..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings0_WingFrames.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings0_Wings.png b/Assets/Female3DCG/Wings/SteampunkWings0_Wings.png deleted file mode 100644 index b8b0c2deb..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings0_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings1_Gears.png b/Assets/Female3DCG/Wings/SteampunkWings1_Gears.png deleted file mode 100644 index fd0a18093..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings1_Gears.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings1_WingFrames.png b/Assets/Female3DCG/Wings/SteampunkWings1_WingFrames.png deleted file mode 100644 index 67d634920..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings1_WingFrames.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings1_Wings.png b/Assets/Female3DCG/Wings/SteampunkWings1_Wings.png deleted file mode 100644 index be5ad2b3b..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings1_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings2_Gears.png b/Assets/Female3DCG/Wings/SteampunkWings2_Gears.png deleted file mode 100644 index 673899ad3..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings2_Gears.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings2_WingFrames.png b/Assets/Female3DCG/Wings/SteampunkWings2_WingFrames.png deleted file mode 100644 index 2b38d2a8a..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings2_WingFrames.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings2_Wings.png b/Assets/Female3DCG/Wings/SteampunkWings2_Wings.png deleted file mode 100644 index 62c786070..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings2_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings3_WingFrames.png b/Assets/Female3DCG/Wings/SteampunkWings3_WingFrames.png deleted file mode 100644 index d101aa7ae..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings3_WingFrames.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings3_Wings.png b/Assets/Female3DCG/Wings/SteampunkWings3_Wings.png deleted file mode 100644 index 8bb073b79..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings3_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings4_WingFrames.png b/Assets/Female3DCG/Wings/SteampunkWings4_WingFrames.png deleted file mode 100644 index cf5d3440d..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings4_WingFrames.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings4_Wings.png b/Assets/Female3DCG/Wings/SteampunkWings4_Wings.png deleted file mode 100644 index d72caa4e6..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings4_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings5_WingFrames.png b/Assets/Female3DCG/Wings/SteampunkWings5_WingFrames.png deleted file mode 100644 index 1e771a32f..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings5_WingFrames.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings5_Wings.png b/Assets/Female3DCG/Wings/SteampunkWings5_Wings.png deleted file mode 100644 index bee30237a..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings5_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings6_WingFrames.png b/Assets/Female3DCG/Wings/SteampunkWings6_WingFrames.png deleted file mode 100644 index ecbb2d987..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings6_WingFrames.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings6_Wings.png b/Assets/Female3DCG/Wings/SteampunkWings6_Wings.png deleted file mode 100644 index 8a879f561..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings6_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings7_WingFrames.png b/Assets/Female3DCG/Wings/SteampunkWings7_WingFrames.png deleted file mode 100644 index f44be86df..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings7_WingFrames.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings7_Wings.png b/Assets/Female3DCG/Wings/SteampunkWings7_Wings.png deleted file mode 100644 index 07d441257..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings7_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings8_WingFrames.png b/Assets/Female3DCG/Wings/SteampunkWings8_WingFrames.png deleted file mode 100644 index 07cd8b3b2..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings8_WingFrames.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings8_Wings.png b/Assets/Female3DCG/Wings/SteampunkWings8_Wings.png deleted file mode 100644 index 411018850..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings8_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings_Base.png b/Assets/Female3DCG/Wings/SteampunkWings_Base.png deleted file mode 100644 index f0d091353..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings_Base.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings_Gears.png b/Assets/Female3DCG/Wings/SteampunkWings_Gears.png deleted file mode 100644 index b3f6bd57f..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings_Gears.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings_WingFrames.png b/Assets/Female3DCG/Wings/SteampunkWings_WingFrames.png deleted file mode 100644 index 290b9b72e..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings_WingFrames.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SteampunkWings_Wings.png b/Assets/Female3DCG/Wings/SteampunkWings_Wings.png deleted file mode 100644 index b8b0c2deb..000000000 Binary files a/Assets/Female3DCG/Wings/SteampunkWings_Wings.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SuccubusFeather.png b/Assets/Female3DCG/Wings/SuccubusFeather.png deleted file mode 100644 index 9eeefc9b1..000000000 Binary files a/Assets/Female3DCG/Wings/SuccubusFeather.png and /dev/null differ diff --git a/Assets/Female3DCG/Wings/SuccubusWings.png b/Assets/Female3DCG/Wings/SuccubusWings.png deleted file mode 100644 index 685613701..000000000 Binary files a/Assets/Female3DCG/Wings/SuccubusWings.png and /dev/null differ diff --git a/Backgrounds/BrickWall.jpg b/Backgrounds/BrickWall.jpg deleted file mode 100644 index 5c1384e59..000000000 Binary files a/Backgrounds/BrickWall.jpg and /dev/null differ diff --git a/Backgrounds/BrickWall.png b/Backgrounds/BrickWall.png new file mode 100644 index 000000000..cfa466d16 Binary files /dev/null and b/Backgrounds/BrickWall.png differ diff --git a/Backgrounds/BrickWallOld.png b/Backgrounds/BrickWallOld.png new file mode 100644 index 000000000..aaa53f276 Binary files /dev/null and b/Backgrounds/BrickWallOld.png differ diff --git a/Backgrounds/Dressing.jpg b/Backgrounds/Dressing.jpg deleted file mode 100644 index fbf9bfc00..000000000 Binary files a/Backgrounds/Dressing.jpg and /dev/null differ diff --git a/Backgrounds/Logo.png b/Backgrounds/Logo.png new file mode 100644 index 000000000..845edd83c Binary files /dev/null and b/Backgrounds/Logo.png differ diff --git a/Backgrounds/Mountain.png b/Backgrounds/Mountain.png new file mode 100644 index 000000000..da70d6e44 Binary files /dev/null and b/Backgrounds/Mountain.png differ diff --git a/Data/Defs.ts b/Data/Defs.ts new file mode 100644 index 000000000..607e44bbf --- /dev/null +++ b/Data/Defs.ts @@ -0,0 +1,2091 @@ +let LAYERS_BASE = [ + "Weapon", + "FurnitureFront", + "FurnitureLinked", + + // These are in front b/c the collar acc goes over the leash for visibility + // and the leash shouldnt go thru the head when hogtied + "CollarAcc", + "Leash", + // Collar ring is meant to go under the leash + "CollarRing", + + "AnimalEarsFront", + "HatDeco", + "Hat", + "InflatableHead", + "Brows", // Brows should get hidden with mask + "Ahoge", + "Circlet", + "HeadbandDeco", + "Headband", + "MouthProp", + "HairFront", + "HairOver", + "Hood", // For Kigu + // Head items + "Blindfold", + "GagOver", + "GagMuzzleStraps", + "GagMuzzle", + "GagFlatStraps", + "GagFlat", + "GagStraps", + "Gag", + "GagUnder", + // Hair mid + "ChestOverHair", + "Hair", + "AnimalEars", + "GagStrapsUnder", + "MaskOver", + "CircletUnder", + "Mask", + "Goggles", + "Glasses", + "BlindfoldWrap", + "GagWrap", + // Head + "Eyes", + "Mouth", + "Blush", + "Fear", + "Head", + + + "InflatableArms", + "InflatableLegs", + "FiddleFront", + + + // Bondage + "WrapForeArms", + "BindForeArms", + "BindForeWristLeft", + "BindForeWristRight", + "BindForeHandLeft", + "BindForeHandRight", + "BindForeArmLeft", + "BindForeArmRight", + + "ForeWrists", + + + // Forearms (only in HandsFront) + "ForeWristLeft", + + "ForeSleeveDecoLeft", + "ForeSleeveLeft", + "ForeMittenLeft", + "ForeGloveLeft", + "ForeHandLeft", + "ForeArmLeft", + + "ForeWristRight", + + "ForeSleeveDecoRight", + "ForeSleeveRight", + "ForeMittenRight", + "ForeGloveRight", + "ForeHandRight", + "ForeArmRight", + + "Yoke", + + // Clothes that go over the chest and hang down + "Shoulders", + + // Hair mid + "HairMid", + + "ChestplateOver", + + // Collar and collar accessories + "Collar", + + + + + // This slot is for things like breastplates and things that go over + "WrappingChest", + "UpperArmStraps", + + "WrapArms", + + "Jacket", + "Chestplate", + + // Bondage + "WrapArms", + "BindArms", + + + "ChestDeco", + "ChestStraps", + + "UpperArmStrapsBack", + + // Chest is breasts, should only intersect on bottom and side edges, top is indeterminate + "Straps", + "NecklaceCharm", + "Necklace", + + + "WrapChest", + "HarnessOver", + "BindChest", + "BustierCollar", + "BustierChest", + "ShirtCollar", + "ShirtChest", + "Option_BindChestLower", + "NippleToysOption", + "NeckCorset", + "SuitChestOver", + "BraChest", + "BindChestLower", + "SuitChest", + "CatsuitChest", + "NippleToys", + "Nipples", + "Chest", + + "WrappingTorsoUpper", + "StrapsUnderbustOver", + "WrappingTorsoOver", + + // Crossed arms bondage -- left arm is mostly hidden, no hands + "WrapCrossArms", + "BindCrossArms", + "BindCrossWristRight", + "BindCrossArmLeft", + "BindCrossArmRight", + + // Crossed arms -- order is inverted + "SleevesCrossArms", + "CrossSleeveDecoRight", + "CrossSleeveRight", + "CrossMittenRight", + "CrossGloveRight", + "CrossArmRight", + "CrossSleeveDecoLeft", + "CrossSleeveLeft", + "CrossMittenLeft", + "CrossGloveLeft", + "CrossArmLeft", + + + // Certain pieces of armor go over the shirt + "BeltBondage", + "BeltCharmSide", + "BeltArmor", + "BeltCharm", + "BeltDeco", + "Belt", + + + "OverCorset", + + "BaggyShirt", + + "Apron", + + // Skirts that dont follow shilhouette + "OverSkirtDeco", + "OverSkirt", + "WrappingLegsOver2", + "LegbinderLegsOver2", + "Greaves", + + "WrappingTorsoMid", // For stuff that goes over a shirt and clothes but under restraints, e.g. tape + + "StrapsUnderbust", + + "WrappingTorsoLower", + + "OverCrotchStrapMid", + "Option2_ChastityBelt", + "HarnessMid", + + "BeltUnder", + + "CrotchPanelMid", + + + + // For form-fitting stuff that nonetheless goes over a shirt + "Bustier", + + "ShirtOver", + + // Skirt part that goes in front of corsets, shirts, etc + "SkirtOverDeco", + "SkirtOver", + + // Belts and corsets that only go over + "Cincher", + + "Shirt", + // For things that go directly under the breasts + "Underbust", + // For things that go around armpit area--mainly ropes and stuff that goes under the breasts + "Underarms", + + + + + + // Corsets that go under harness and poofy skirt + "Corset", + + "Bra", + + // Skirts that are slim and follow the shilhouette + "SkirtDeco", + "Skirt", + + + "WrappingLegsOver", + "LegbinderLegsOver", + "PetsuitLegs", + + "WrappingTorsoUnder",// For skintight stuff + + // Left Leg + "KneeAccLeft", + "ThighsOver", + "Thighs", + "Thighs3", + "Thighs2", + "Thighs1", + "ThighLeftOver", + "ThighLeft", + + "WrappingAnklesOver", + "LegbinderAnklesOver", + + "AnklesOver", + "Ankles", + "Ankles3", + "Ankles2", + "Ankles1", + "AnkleLeftOver", + "AnkleLeft", + + "WrappingLegs2", + "WrappingLegs", + + "PantsAccLeft", + "ShortsLeft", + "PantLeft", + + "BindFeet", + "OverShoes", + "ShoeLeftOver", + "ShoeLeftDeco", + "ShoeLeft", + "ShoeLeftUnder", + + + + "WrappingLegsUnder", + + "Shorts", + + "OverSocks", + "StockingLeftKneel", "StockingLeft", + "FootLeft", + "LegLeft", + + // Lower harness + "Option2_ChastityBeltLower", + "HarnessLower", + "CrotchPanelLower", + + "WrappingTorso", + "OverCrotchStrap", + + "Option_ChastityBelt", + "Option_CrotchRope", + "BodysuitOver", + + // Panties go here when standing + "Panties", + + // Upper body underwear and bodysuits + "CorsetLiner", + "Bodysuit", + + "ChastityBelt", + "CrotchRope", + + + + // These are for the base skirt layer when kneeling + // The over layer is for kneeling + // Skirts that dont follow shilhouette and are puffy + "SkirtOverLowerDeco", + "SkirtOverLower", + + // Skirts that are slim and follow the shilhouette + "SkirtLowerDeco", + "SkirtLower", + + // Right leg + "WrappingLegsRightOver", + "BindThighRight", + "RightThighs3", + "RightThighs2", + "RightThighs1", + "KneeAccRight", + "ThighRight", + "AnkleRight", + "ThighRightOver", + "AnkleRightOver", + "PantsAccRight", + "PantRight", + "PantLegs", + + "HarnessUnder", + + + + // For waist belt + "BeltBack", + + // Left arm clothes + + "BindWristLeft", + "WrapArmLeft", + "BindArmLeft", + "BindCrossElbowLeft", + "BindForeElbowLeft", + "BindElbowLeft", + "BindHandLeft", + + "LowerArmBondageLeft", + + "SleeveDecoLeft", + "SleeveLeft", + + // Left arm body - reserved for body and catsuits + "WristLeft", + "MittenLeft", + "GloveLeft", + "TightSleeveLeft", + "HandLeft", + "ArmLeft", + + // Right Shoes + "ShoeRightOver", + "ShoeRightDeco", + + "ShoeRight", + "ShoeRightUnder", + "WrappingLegsRight", + + + + // Lower body underwear + "StockingRight", + + "CorsetUnder", // Corsets go here when wearing pants + + "Option_ChastityBeltLower", + + // Panties go here when kneeling + "PantiesLower", + + // Upper body underwear and bodysuits + "CorsetLinerLower", + "BodysuitLower", + + "ChastityBeltLower", + + + // Lower body body - reserved for body and catsuits + // Note that the lower torso is complex, you should avoid internal overlaps as much as possible + // External overlaps are fine, e.g. right leg goes over + "FootRight", + "LegRight", + "ShoulderLeft", + "UpSleeveRight", + "ShoulderRight", + "TorsoUpper", + "Butt", + "TorsoLower", + "Torso", + + // Feet behind the body + "AnkleLeftHogtie", + "ShoeLeftHogtie", + "SockLeftHogtie", + "FootLeftHogtie", + "LegLeftHogtie", + "AnkleRightKneel", + "ShoeRightKneel", + "SockRightKneel", + "FootRightKneel", + + // Right arm specific bondage + "WrapArmRight", + "BindWristRight", + "BindArmRight", + "BindCrossElbowRight", + "BindForeElbowRight", + "BindElbowRight", + "BindHandRight", + + // Right arm clothes + "SleeveDecoRight", + "SleeveRight", + + // Right arm body - reserved for body and catsuits + "WristRight", + "MittenRight", + "GloveRight", + "TightSleeveRight", + "HandRight", + "ArmRight", + + // Chain links for leg cuffs + "BindChainLinksUnder", + + // Clothes that go behind + "SkirtBack", + "BeltFarBack", + "Coat", + + // Hair and hat back + "HairBack", + "HairPonytail", + "HatBack", + + "Tail", + "Wings", + "Cape", + + "FurnitureBackLinked", + "FurnitureBack", + "BG", +]; + + +interface metaLayerBound { + id: string, + start: string, + end: string, +} +/** start is inclusive, end is exclusive */ +let metaLayerBoundaries: metaLayerBound[] = [ + {id: "FurnitureFront", start: "FurnitureFront", end: "CollarAcc"}, + {id: "HatEars", start: "AnimalEarsFront", end: "AnimalEarsFront"}, + {id: "Hat", start: "HatDeco", end: "InflatableHead"}, + {id: "Forehead", start: "Brows", end: "HairFront"}, + {id: "HairFront", start: "HairFront", end: "Hood"}, + {id: "Head", start: "Hood", end: "InflatableArms"}, + {id: "Inflatable", start: "InflatableArms", end: "FiddleFront"}, + {id: "ArmsFront", start: "FiddleFront", end: "Yoke"}, + {id: "Shoulders", start: "Yoke", end: "WrappingChest"}, + {id: "UpperTorso", start: "WrappingChest", end: "Straps"}, + {id: "Chest", start: "Straps", end: "WrappingTorsoUpper"}, + {id: "ClothMid", start: "WrappingTorsoUpper", end: "WrapCrossArms"}, + {id: "ArmsCross", start: "WrapCrossArms", end: "BeltBondage"}, + {id: "ClothLower", start: "BeltBondage", end: "SkirtDeco"}, + {id: "Skirt", start: "SkirtDeco", end: "WrappingLegsOver"}, + {id: "Pants", start: "WrappingLegsOver", end: "ShoeLeftOver"}, + {id: "PantLeft", start: "ShoeLeftOver", end: "Option2_ChastityBeltLower"}, + {id: "BikiniZone", start: "Option2_ChastityBeltLower", end: "SkirtOverLowerDeco"}, + {id: "SkirtLower", start: "SkirtOverLowerDeco", end: "WrappingLegsRightOver"}, + {id: "PantRight", start: "WrappingLegsRightOver", end: "HarnessUnder"}, + {id: "ArmLeft", start: "BindWristLeft", end: "ShoeRightOver"}, + {id: "Shoes", start: "ShoeRightOver", end: "CorsetUnder"}, + {id: "Pelvis", start: "CorsetUnder", end: "FootRight"}, + {id: "Torso", start: "ShoulderLeft", end: "AnkleLeftHogtie"}, + {id: "FeetBack", start: "AnkleLeftHogtie", end: "WrapArmRight"}, + {id: "ArmRight", start: "WrapArmRight", end: "BindChainLinksUnder"}, + {id: "ClothesBack", start: "SkirtBack", end: "FurnitureBackLinked"}, + {id: "Furniture", start: "FurnitureBackLinked", end: "BG"}, + {id: "BG", start: "BG", end: "BG"}, +]; + +/** Handy way of referencing multiple layers */ +let LayerGroups = { + "Breastplate": ToMap([ + "Chest", + "Shirt", + "ShirtOver", + ]), + "ChestBinding": ToMap([ + "Chest", + //"Shirt", + //"ShirtOver", + ]), + "TopBinding": ToMap([ + "Shirt", + "ShirtOver", + ]), + "CrotchRope": ToMap([ + "HarnessLower", + ]), + ButtSleeves: ToMap([ + "SleeveLeft", + "TightSleeveLeft", + "TightSleeveRight", + "SleeveDecoLeft", + "SleeveRight", + "SleeveDecoRight", + "BeltBack", + "ShoeLeft", + ]), + BustierPoses: ToMap([ + "Bustier", + "Corset", + "OverCorset", + + "Apron", + "CorsetLiner", + "HarnessLower", + "HarnessMid", + "ChastityBelt", + "CrotchRope", + "Option_ChastityBelt", + "Option2_ChastityBelt", + "Option_CrotchRope", + "Panties", + "CrotchPanelMid", + "Bodysuit", + //"Skirt", + //"WrappingTorsoMid", + ]), + BustierPoses2: ToMap([ + "Bustier", + "Corset", + "OverCorset", + "Apron", + "CorsetLiner", + "HarnessLower", + "HarnessMid", + "ChastityBelt", + "CrotchRope", + "Option_ChastityBelt", + "Option2_ChastityBelt", + "Option_CrotchRope", + "Panties", + "CrotchPanelMid", + "Bodysuit", + "WrappingTorsoMid", + "WrappingTorsoLower", + ]), + BustSize: ToMap([ + "WrapChest", + "HarnessOver", + "BindChest", + "BustierCollar", + "BustierChest", + "ShirtCollar", + "ShirtChest", + "Option_BindChestLower", + "NippleToysOption", + "SuitChestOver", + "BraChest", + "BindChestLower", + "SuitChest", + "CatsuitChest", + "NippleToys", + "Nipples", + "Chest", + ]), + + // region slime + "SlimeLegs": ToMap([ + "Thighs", + "Thighs3", + "Thighs2", + "Thighs1", + "PantLeft", + "PantRight", + ]), + "SlimeFeet": ToMap([ + "Ankles", + "Ankles3", + "Ankles2", + "Ankles1", + "AnkleLeft", + "AnkleRight", + ]), + "Shoes": ToMap([ + "ShoeLeft", + "ShoeLeftUnder", + "ShoeRight", + "ShoeRightUnder", + "ShoeLeftOver", + "ShoeRightOver", + "SockLeft", + "SockRight", + "AnkleRightKneel", + "ShoeRightKneel", + "ShoeLeftHogtie", + ]), + "BelowShoes": ToMap([ // Same as above but without shoeover + "ShoeLeft", + "ShoeLeftUnder", + "ShoeRight", + "ShoeRightUnder", + "SockLeft", + "SockRight", + "AnkleRightKneel", + "ShoeRightKneel", + "ShoeLeftHogtie", + ]), + "SlimeAnkles": ToMap([ + "Ankles", + "Ankles3", + "Ankles2", + "Ankles1", + "AnkleLeft", + "AnkleRight", + ]), + "SlimeTorsoLower": ToMap([ + "OverSkirt", + "Pants", + "ShortsLeft", + "Shorts", + ]), + // endregion + + // region armor + "Petsuit": ToMap([ + "AnklesOver", + "Ankles", + "Ankles3", + "Ankles2", + "Ankles1", + "AnkleLeft", + "AnkleRight", + "AnkleLeftOver", + "AnkleRightOver", + "BindFeet", + "OverShoes", + "ShoeLeftUnder", + "ShoeRightUnder", + "WrappingLegsUnder", + "WrappingLegsRight", + ]), + "Legbinder": ToMap([ + "AnklesOver", + "Ankles", + "Ankles3", + "Ankles2", + "Ankles1", + "AnkleLeft", + "AnkleRight", + "AnkleLeftOver", + "AnkleRightOver", + "BindFeet", + "OverShoes", + "ShoeLeftUnder", + "ShoeRightUnder", + "WrappingLegsUnder", + "WrappingLegsRight", + "PetsuitLegs", + ]), + "SlimeThighs": ToMap([ + "AnklesOver", + "Ankles", + "Ankles3", + "Ankles2", + "Ankles1", + "AnkleLeft", + "AnkleRight", + "AnkleLeftOver", + "AnkleRightOver", + "BindFeet", + "OverShoes", + "ShoeLeftUnder", + "ShoeRightUnder", + "WrappingLegsUnder", + "WrappingLegsRight", + "LegbinderLegsOver", + "LegbinderAnklesOver", + "PetsuitLegs", + ]), + "Boots": ToMap([ + "AnklesOver", + "Ankles", + "Ankles3", + "Ankles2", + "Ankles1", + "AnkleLeft", + "AnkleRight", + "AnkleLeftOver", + "AnkleRightOver", + "BindFeet", + "OverShoes", + "ShoeLeftUnder", + "ShoeRightUnder", + "WrappingLegsUnder", + "WrappingLegsRight", + ]), + "Heels": ToMap([ + "OverShoes", + "OverSocks", + "FootLeft", + "StockingLeftKneel", "StockingLeft", + "FootLeft", + "LegLeft", + "FootRight", + "StockingRight", + "FootRight", + "LegRight", + "ShoeLeftUnder", + "ShoeRightUnder", + "WrappingLegsUnder", + "WrappingLegsRight", + ]), + "BalletHeels": ToMap([ + "OverShoes", + "OverSocks", + "FootLeft", + "StockingLeftKneel", "StockingLeft", + "LegLeft", + "FootRight", + "StockingRight", + "LegRight", + "ShoeLeftUnder", + "ShoeRightUnder", + "ShoeLeft", + "ShoeRight", + "WrappingLegsUnder", + "WrappingLegsRight", + ]), + "BalletHeelsCuffs": ToMap([ + "AnkleLeft", + "AnkleRight", + ]), + "HeelRight": ToMap([ + "FootLeft", + "FootRightKneel", + "StockingLeftKneel", "StockingLeft", + "FootLeftKneel", + "LegLeft", + "FootRight", + "StockingRight", + "FootRight", + "LegRight", + "ShoeLeftUnder", + "ShoeRightUnder", + "WrappingLegsRight", + "WrappingLegsUnder", + + ]), + "BalletHeelRight": ToMap([ + "FootLeft", + "FootRightKneel", + "StockingLeftKneel", "StockingLeft", + "StockingLeftKneel", "StockingLeft", + "FootLeft", + "LegLeft", + "FootRight", + "StockingRight", + "FootRight", + "LegRight", + "ShoeLeftUnder", + "ShoeRightUnder", + "ShoeLeft", + "ShoeRight", + "WrappingLegsUnder", + "WrappingLegsRight", + + ]), + // endregion + + //region generic + "Arms": ToMap([ + //"Shirt", + "SleeveLeft", + "TightSleeveLeft", + "TightSleeveRight", + "SleeveDecoLeft", + "SleeveRight", + "SleeveDecoRight", + "UpSleeveRight", + "ArmLeft", + "ArmRight", + //"TorsoUpper", + + "CrossMittenLeft", + "CrossMittenRight", + + "CrossGloveRight", + "CrossArmRight", + "CrossGloveLeft", + "CrossArmLeft", + /*"BindCrossElbowLeft", + "BindCrossElbowRight", + "BindCrossWristRight", + "BindForeArmLeft", + "BindForeArmRight",*/ + ]), + "ArmsAll": ToMap([ + "Shirt", + "ShirtOver", + "SleeveLeft", + "TightSleeveLeft", + "TightSleeveRight", + "SleeveDecoLeft", + "SleeveRight", + "SleeveDecoRight", + "UpSleeveRight", + "ArmLeft", + "ArmRight", + "TorsoUpper", + + "ChestStraps", + "StrapsUnderbust", + "StrapsUnderbustOver", + + "ForeSleeveLeft", + "ForeSleeveDecoLeft", + "GloveLeft", + "ForeHandLeft", + + "ForeWristRight", + "ForeArmRight", + "ForeGloveLeft", + "ForeGloveRight", + + "ForeSleeveRight", + "ForeSleeveDecoRight", + "GloveRight", + "ForeHandRight", + + "MittenLeft", + "MittenRight", + "CrossMittenLeft", + "CrossMittenRight", + "ForeMittenLeft", + "ForeMittenRight", + + "CrossGloveRight", + "CrossArmRight", + "CrossGloveLeft", + "CrossArmLeft", + + + // Bindings too + + "BindWristLeft", + "BindWristRight", + "WrapArmLeft", + "WrapArms", + "WrapArmRight", + "BindArmLeft", + "BindArmRight", + "BindElbowLeft", + "BindElbowRight", + "BindHandLeft", + "BindHandRight", + + + "BindForeElbowLeft", + "BindForeElbowRight", + "BindForeWristLeft", + "BindForeWristRight", + "BindForeHandLeft", + "BindForeHandRight", + "BindForeArmLeft", + "BindForeArmRight", + + + "BindCrossElbowLeft", + "BindCrossElbowRight", + "BindCrossWristRight", + "BindForeArmLeft", + "BindForeArmRight", + ]), + "ArmsAllAndHarness": ToMap([ + "HarnessLower", + + "Shirt", + "ShirtOver", + "SleeveLeft", + "TightSleeveLeft", + "TightSleeveRight", + "SleeveDecoLeft", + "SleeveRight", + "SleeveDecoRight", + "UpSleeveRight", + "ArmLeft", + "ArmRight", + "TorsoUpper", + + "ChestStraps", + "StrapsUnderbust", + "StrapsUnderbustOver", + + "ForeSleeveLeft", + "ForeSleeveDecoLeft", + "GloveLeft", + "ForeHandLeft", + + "ForeWristRight", + "ForeArmRight", + "ForeGloveLeft", + "ForeGloveRight", + + "ForeSleeveRight", + "ForeSleeveDecoRight", + "GloveRight", + "ForeHandRight", + + "MittenLeft", + "MittenRight", + "CrossMittenLeft", + "CrossMittenRight", + "ForeMittenLeft", + "ForeMittenRight", + + "CrossGloveRight", + "CrossArmRight", + "CrossGloveLeft", + "CrossArmLeft", + + + // Bindings too + + "BindWristLeft", + "BindWristRight", + "WrapArmLeft", + "WrapArms", + "WrapArmRight", + "BindArmLeft", + "BindArmRight", + "BindElbowLeft", + "BindElbowRight", + "BindHandLeft", + "BindHandRight", + + + "BindForeElbowLeft", + "BindForeElbowRight", + "BindForeWristLeft", + "BindForeWristRight", + "BindForeHandLeft", + "BindForeHandRight", + "BindForeArmLeft", + "BindForeArmRight", + + + "BindCrossElbowLeft", + "BindCrossElbowRight", + "BindCrossWristRight", + "BindForeArmLeft", + "BindForeArmRight", + ]), + // endregion + + // Region rope + "Rope1": ToMap([ + "Shirt", + "ShirtOver", + "SleeveLeft", + "TightSleeveLeft", + "TightSleeveRight", + "SleeveDecoLeft", + "SleeveRight", + "SleeveDecoRight", + "UpSleeveRight", + "ArmLeft", + "ArmRight", + "TorsoUpper", + + "CrossGloveRight", + "CrossArmRight", + "CrossGloveLeft", + "CrossMittenLeft", + "CrossMittenRight", + "CrossArmLeft", + ]), + "RopeTorso": ToMap([ + "Shirt", + "ShirtOver", + "CorsetLiner", + // Skirts that dont follow shilhouette and are puffy + "SkirtOverDeco", + "SkirtOver", + "SkirtOverLower", + // Skirts that are slim and follow the shilhouette + "SkirtDeco", + "Skirt", + "SkirtLower", + + "PantLeft", + "PantRight", + "Pants", + "ShortsLeft", + "Shorts", + + "OverSocks", + "StockingLeftKneel", "StockingLeft", + "StockingRight", + + "Bodysuit", + "Panties", + "Torso", + "TorsoUpper", + "Butt", + "TorsoLower", + "Torso", + ]), + "CorsetTorso": ToMap([ + "Shirt", + "ShirtOver", + "CorsetLiner", + // Skirts that dont follow shilhouette and are puffy + "SkirtOverDeco", + "SkirtOver", + "SkirtOverLower", + // Skirts that are slim and follow the shilhouette + "SkirtDeco", + "Skirt", + "SkirtLower", + + "PantLeft", + "PantRight", + "Pants", + "ShortsLeft", + "Shorts", + + "OverSocks", + "StockingLeftKneel", "StockingLeft", + "StockingRight", + + "Bodysuit", + "Panties", + "Torso", + "TorsoUpper", + "Butt", + "TorsoLower", + "Torso", + ]), + "TightChastityBelt": ToMap([ + "CorsetLiner", + // Skirts that dont follow shilhouette and are puffy + "SkirtOverDeco", + "SkirtOver", + "SkirtOverLower", + // Skirts that are slim and follow the shilhouette + "SkirtDeco", + "Skirt", + "SkirtLower", + + "PantLeft", + "PantRight", + "Pants", + "ShortsLeft", + "Shorts", + + "OverSocks", + "StockingLeftKneel", "StockingLeft", + "StockingRight", + + "Bodysuit", + "BodysuitLower", + "Panties", + "Torso", + "TorsoUpper", + "Butt", + "TorsoLower", + "Torso", + ]), + + "PetsuitArms": ToMap([ + "BindForeElbowLeft", + "BindForeWristLeft", + "BindForeWristRight", + "BindForeHandLeft", + "BindForeHandRight", + "BindForeArmLeft", + "BindForeArmRight", + + "ForeWrists", + + + // Forearms (only in HandsFront) + "ForeWristLeft", + + "ForeSleeveDecoLeft", + "ForeSleeveLeft", + "ForeMittenLeft", + "ForeGloveLeft", + "ForeHandLeft", + "ForeArmLeft", + + "ForeWristRight", + + "ForeSleeveDecoRight", + "ForeSleeveRight", + "ForeMittenRight", + "ForeGloveRight", + "ForeHandRight", + "ForeArmRight", + + "GloveLeft", + "GloveRight", + + "MittenRight", + "MittenLeft", + ]), + + "RopeFore": ToMap([ + "ForeSleeveLeft", + "ForeSleeveDecoLeft", + "GloveLeft", + "ForeHandLeft", + + "ForeWristRight", + "ForeArmRight", + + "ForeSleeveRight", + "ForeSleeveDecoRight", + "GloveRight", + "MittenLeft", + "MittenRight", + "ForeHandRight", + ]), + + "RopeThighs": ToMap([ + "PantLeft", + "PantRight", + "Pants", + "ShortsLeft", + "Shorts", + + "OverSocks", + "StockingLeftKneel", "StockingLeft", + "StockingRight", + + "ShoeLeftDeco", + "ShoeLeft", + "ShoeLeftUnder", + "ShoeRightDeco", + "ShoeRight", + "ShoeRightUnder", + + "Panties", + + "TorsoUpper", + "Butt", + "TorsoLower", + "Torso", + "LegLeft", + "LegRight", + + "AnkleLeftHogtie", + "ShoeLeftHogtie", + "SockLeftHogtie", + "FootLeftHogtie", + "LegLeftHogtie", + "AnkleRightKneel", + "ShoeRightKneel", + "SockRightKneel", + "FootRightKneel", + ]), + + "RopeCalf": ToMap([ + "PantLeft", + "PantRight", + "Pants", + "ShortsLeft", + "Shorts", + + // Shoes + "ShoeLeftDeco", + "ShoeLeft", + "ShoeLeftUnder", + "ShoeRightDeco", + "ShoeRight", + "ShoeRightUnder", + + "OverSocks", + "StockingLeftKneel", "StockingLeft", + "StockingRight", + + "LegLeft", + "LegRight", + + "AnkleLeftHogtie", + "ShoeLeftHogtie", + "SockLeftHogtie", + "FootLeftHogtie", + "LegLeftHogtie", + "AnkleRightKneel", + "ShoeRightKneel", + "SockRightKneel", + "FootRightKneel", + ]), + + "Stockings": ToMap([ + + // Shoes + "StockingLeftKneel", "StockingLeft", + "StockingRight", + + "LegLeft", + "LegRight", + ]), + "StockingLeft": ToMap([ + // Shoes + "StockingLeft", + "LegLeft", + "FootLeft", + ]), + "StockingRight": ToMap([ + // Shoes + "StockingRight", + "LegRight", + "FootRight", + ]), + "ShoeLeft": ToMap([ + // Shoes + "StockingLeft", + "LegLeft", + "ShoeLeft", + "ShoeLeftUnder", + "WrappingLegsUnder", + "Shorts", + "OverSocks", + "FootLeft", + ]), + "ShoeRight": ToMap([ + // Shoes + "StockingRight", + "FootRight", + "LegRight", + "ShoeRight", + "ShoeRightUnder", + "WrappingLegsUnder", + "Shorts", + "OverSocks", + ]), + + + + + "ToeTie": ToMap([ + + "ShoeLeft", + "ShoeLeftUnder", + "ShoeRight", + "ShoeRightUnder", + "ShoeLeftHogtie", "ShoeRightKneel", + "AnkleLeftHogtie", + "AnkleRightKneel", + ]), + // endregion + + + // Region Ribbon + "Ribbon1": ToMap([ + "Shirt", + "ShirtOver", + "SleeveLeft", + "TightSleeveLeft", + "TightSleeveRight", + "SleeveDecoLeft", + "SleeveRight", + "SleeveDecoRight", + "UpSleeveRight", + "ArmLeft", + "ArmRight", + "TorsoUpper", + + "CrossGloveRight", + "CrossMittenLeft", + "CrossMittenRight", + "CrossArmRight", + "CrossGloveLeft", + "CrossArmLeft", + ]), + "RibbonTorso": ToMap([ + "Shirt", + "ShirtOver", + "CorsetLiner", + // Skirts that dont follow shilhouette and are puffy + "SkirtOverDeco", + "SkirtOver", + // Skirts that are slim and follow the shilhouette + "SkirtDeco", + "Skirt", + + "PantLeft", + "PantRight", + "Pants", + "ShortsLeft", + "Shorts", + + "OverSocks", + "StockingLeftKneel", "StockingLeft", + "StockingRight", + + "Panties", + + "TorsoUpper", + "Butt", + "TorsoLower", + "Torso", + ]), + + "RibbonFore": ToMap([ + "ForeSleeveLeft", + "ForeSleeveDecoLeft", + "MittenLeft", + "GloveLeft", + "ForeHandLeft", + + "ForeWristRight", + "ForeArmRight", + + "ForeSleeveRight", + "ForeSleeveDecoRight", + "MittenRight", + "GloveRight", + "ForeHandRight", + ]), + + "CorsetBra": ToMap([ + "Chest", + "ShirtChest", + "SuitChestOver", + "SuitChest", + "BraChest", + "BindChestLower", + ]), + "ShirtCutoffBra": ToMap([ + "Chest", + "SuitChestOver", + "SuitChest", + "BraChest", + "BindChestLower", + "Option_BindChestLower", + ]), + + "MaidArmPoofRight": ToMap([ + "TorsoUpper", + "Torso", + "SleeveRight", + "ArmRight", + "GloveRight", + ]), + + "RibbonThighs": ToMap([ + "PantLeft", + "PantRight", + "Pants", + "ShortsLeft", + "Shorts", + + "OverSocks", + "StockingLeftKneel", "StockingLeft", + "StockingRight", + + "Panties", + + "TorsoUpper", + "Butt", + "TorsoLower", + "Torso", + "LegLeft", + "LegRight", + + "AnkleLeftHogtie", + "ShoeLeftHogtie", + "SockLeftHogtie", + "FootLeftHogtie", + "LegLeftHogtie", + "AnkleRightKneel", + "ShoeRightKneel", + "SockRightKneel", + "FootRightKneel", + ]), + + "RibbonCalf": ToMap([ + "PantLeft", + "PantRight", + "Pants", + "ShortsLeft", + "Shorts", + + // Shoes + "ShoeLeftDeco", + + "ShoeLeft", + "ShoeLeftUnder", + "ShoeRightDeco", + + "ShoeRight", + "ShoeRightUnder", + + "OverSocks", + "StockingLeftKneel", "StockingLeft", + "StockingRight", + + "LegLeft", + "LegRight", + + "ShoeLeftHogtie", + "SockLeftHogtie", + "FootLeftHogtie", + "AnkleLeftHogtie", + "LegLeftHogtie", + "AnkleRightKneel", + "ShoeRightKneel", + "SockRightKneel", + "FootRightKneel", + ]), + "RibbonToeTie": ToMap([ + + "ShoeLeft", + "ShoeLeftUnder", + "ShoeRight", + "ShoeRightUnder", + "ShoeLeftHogtie", + "ShoeRightKneel", + "AnkleLeftHogtie", + "AnkleRightKneel", + ]), + // endregion + + // region metal + + + "LegCuffs": ToMap([ + "PantLeft", + "PantRight", + "Pants", + "ShortsLeft", + "Shorts", + + // Shoes + "ShoeLeftDeco", + + "ShoeLeft", + "ShoeLeftUnder", + "ShoeRightDeco", + + "ShoeRight", + "ShoeRightUnder", + + "OverSocks", + "StockingLeftKneel", "StockingLeft", + "StockingRight", + + "LegLeft", + "LegRight", + + "ShoeLeftHogtie", + "SockLeftHogtie", + "FootLeftHogtie", + "AnkleLeftHogtie", + "LegLeftHogtie", + "AnkleRightKneel", + "ShoeRightKneel", + "SockRightKneel", + "FootRightKneel", + ]), + + "Yoke": ToMap([ + "Shirt", + "ShirtOver", + "MittenLeft", + "MittenRight", + "GloveLeft", + "GloveRight", + "SleeveLeft", + "TightSleeveLeft", + "TightSleeveRight", + "SleeveDecoLeft", + "SleeveRight", + "SleeveDecoRight", + "UpSleeveRight", + "ArmLeft", + "ArmRight", + ]), + "Fiddle": ToMap([ + + "GloveLeft", + "GloveRight", + "SleeveLeft", + "TightSleeveLeft", + "TightSleeveRight", + "SleeveDecoLeft", + "SleeveRight", + "SleeveDecoRight", + "ArmLeft", + "ArmRight", + + + "WrapForeArms", + "BindForeArms", + "BindForeElbowLeft", + "BindForeWristLeft", + "BindForeWristRight", + "BindForeHandLeft", + "BindForeHandRight", + "BindForeArmLeft", + "BindForeArmRight", + + "ForeWrists", + + + // Forearms (only in HandsFront) + "ForeWristLeft", + + "ForeSleeveDecoLeft", + "ForeSleeveLeft", + "ForeMittenLeft", + "ForeGloveLeft", + "ForeHandLeft", + "ForeArmLeft", + + "ForeWristRight", + + "ForeSleeveDecoRight", + "ForeSleeveRight", + "ForeMittenRight", + "ForeGloveRight", + "ForeHandRight", + "ForeArmRight", + ]), + "Cuffs": ToMap([ + // Affect clothes only not skintight + "Shirt", + "ShirtOver", + //"MittenLeft", + //"MittenRight", + //"GloveLeft", + //"GloveRight", + "SleeveLeft", + "TightSleeveLeft", + "TightSleeveRight", + "SleeveDecoLeft", + "SleeveRight", + "SleeveDecoRight", + "UpSleeveRight", + //"ArmLeft", + //"ArmRight", + ]), + "Mitts": ToMap([ + "CrossGloveRight", + "CrossHandRight", + "CrossGloveLeft", + "CrossHandLeft", + "GloveRight", + "HandRight", + "GloveLeft", + "HandLeft", + "ForeGloveRight", + "ForeHandRight", + "ForeGloveLeft", + "ForeHandLeft", + ]), + "MittL": ToMap([ + "CrossGloveLeft", + "CrossHandLeft", + "GloveLeft", + "HandLeft", + "ForeGloveLeft", + "ForeHandLeft", + ]), + "MittR": ToMap([ + "CrossGloveRight", + "CrossHandRight", + "GloveRight", + "HandRight", + "ForeGloveRight", + "ForeHandRight", + ]), + "RightHand": ToMap([ + "GloveRight", + "HandRight", + "ArmRight", + "MittenRight", + ]), + // endregion + + HairHelmet: ToMap( + [ + + "AnimalEars", + "AnimalEarsFront", + "Ahoge", + "MouthProp", + "HairFront", + "HairOver", + "HairBack", + "Hood", + "Hair", + "Head", + ] + ), + EarsHelmet: ToMap( + [ + "AnimalEars", + "Circlet", + ] + ), + // region Xray + Xray: ToMap( + [ + "FurnitureFront", + "FurnitureLinked", + + "InflatableHead", + "InflatableArms", + "InflatableLegs", + "MouthProp", + "Hood", // For Kigu + "MaskOver", + "OverCrotchStrapMid", + + "NeckCorset", + // Hair mid + "Mask", + "BlindfoldWrap", + "GagWrap", + + // Clothes that go over the chest and hang down + "Shoulders", + + // Forearms (only in HandsFront) + "ForeSleeveLeft", + "ForeSleeveDecoLeft", + + "ForeSleeveRight", + "ForeSleeveDecoRight", + + + + // This slot is for things like breastplates and things that go over + "WrappingChest", + + "UpperArmStraps", + "UpperArmStrapsBack", + + "Jacket", + "ChestDeco", + "Chestplate", + "ChestplateOver", + "WrapChest", + + // Bondage + + + + + // Chest is breasts, should only intersect on bottom and side edges, top is indeterminate + //"NecklaceCharm", + //"Necklace", + + "BustierCollar", + "BustierChest", + "ShirtCollar", + "ShirtChest", + + //"StrapsUnderbustOver", + "WrappingTorsoUpper", + "WrappingTorsoOver", + + "WrapForeArms", + "WrapCrossArms", + + // Crossed arms -- order is inverted + "SleevesCrossArms", + "CrossSleeveDecoRight", + "CrossSleeveRight", + "CrossSleeveDecoLeft", + "CrossSleeveLeft", + "WrapArmLeft", + "WrapArms", + "WrapArmRight", + + // Certain pieces of armor go over the shirt + "BeltBondage", + "BeltCharm", + "BeltCharmSide", + "BeltArmor", + "Belt", + "BeltDeco", + "BeltUnder", + + "OverCorset", + "Apron", + + "BaggyShirt", + + // Skirts that dont follow shilhouette + "WrappingLegsOver2", + "LegbinderLegsOver2", + "WrappingLegsOver", + "LegbinderLegsOver", + "OverSkirtDeco", + "OverSkirt", + "Greaves", + + "WrappingTorsoMid", // For stuff that covers a shirt + "WrappingTorsoLower", + + // For form-fitting stuff that nonetheless goes over a shirt + "Bustier", + "Shirt", + "ShirtOver", + + "WrappingTorsoUnder", // For skintight stuff + + // Skirts that dont follow shilhouette and are puffy + "SkirtOverDeco", + "SkirtOver", + + "WrappingLegsOver", + "LegbinderLegsOver", + "PetsuitLegs", + "WrappingAnklesOver", + "LegbinderAnklesOver", + + // Corsets that go under harness and poofy skirt + //"Corset", + + // Skirts that are slim and follow the shilhouette + "SkirtDeco", + "Skirt", + + + // Left Leg + "ThighsOver", + "ThighLeftOver", + //"ThighLeft", + "AnklesOver", + "AnkleLeftOver", + "ThighRightOver", + "AnkleRightOver", + + "WrappingLegs2", + "WrappingLegs", + "WrappingLegsUnder", + + "PantsAccLeft", + "PantLeft", + + "OverShoes", + "ShoeLeftOver", + "OverSocks", + + // Lower harness + "OverCrotchStrap", + "WrappingTorso", + + // These are for the base skirt layer when kneeling + // The over layer is for kneeling + // Skirts that dont follow shilhouette and are puffy + "SkirtOverLowerDeco", + "SkirtOverLower", + + // Skirts that are slim and follow the shilhouette + "SkirtLowerDeco", + "SkirtLower", + + // Right leg + "WrappingLegsRightOver", + "WrappingLegsRight", + "KneeAccRight", + "PantsAccRight", + "PantRight", + "Pants", + "ShortsLeft", + "Shorts", + + "SleeveDecoLeft", + "SleeveLeft", + "TightSleeveLeft", + "TightSleeveRight", + "SuitChestOver", + "UpSleeveRight", + + // Right Shoes + "ShoeRightOver", + + "CorsetUnder", // Corsets go here when wearing pants + + // Upper body underwear and bodysuits + "CorsetLiner", + "CorsetLinerLower", + "BodysuitOver", + + // Right arm clothes + "SleeveDecoRight", + "SleeveRight", + ] + ), + + WrappingLegsOver: { + "WrappingLegsOver2": true, + "LegbinderLegsOver2": true, + "WrappingLegsOver": true, + "LegbinderLegsOver": true, + "WrappingLegs": true, + "WrappingLegs2": true, + }, + BindWristLeft: { + "BindWristLeft": true, + "BindForeWristLeft": true, + "BindCrossWristLeft": true, + }, + BindWristRight: { + "BindWristRight": true, + "BindForeWristRight": true, + "BindCrossWristRight": true, + }, + // Extra layer of unpeeling over the head if we are wearing a blindfold or harness gag + XrayFace: ToMap( + [ + // Head items + "Blindfold", + "GagOver", + "GagMuzzleStraps", + "GagMuzzle", + "GagFlatStraps", + "GagFlat", + ] + ), + // Panty xray only if we are wearing a chastity belt + XrayPanties: ToMap( + [ + //"BraChest", + //"SuitChest", + "PantiesLower", + "Bodysuit", + "BodysuitLower", + "CrotchPanelMid", + "CrotchPanelLower", + "Panties", + //"Bra", + ] + ), + // Bra xray only if we are wearing a chastity bra + XrayBra: ToMap( + [ + "BraChest", + "SuitChest", + "Bodysuit", + "Bra", + ] + ), + // endregion + + Bubble: ToMap( + [ + "Coat", + "AnimalEars", + + // Hair and hat back + "HairBack", + "HatBack", + + "Tail", + "Wings", + "Cape", + "HatDeco", + "Hat", + "Weapon", + "InflatableHead", + "Brows", // Brows should get hidden with mask + "Ahoge", + "Circlet", + "HeadbandDeco", + "Headband", + "MouthProp", + "HairFront", + "Hair", + "HairOver", + "Head", + "Hood", // For Kigu + + "Skirt", + "SkirtOver", + + + "WrappingLegsUnder", + "WrappingLegs", + + + "LegbinderLegsOver2", + "LegbinderLegsOver", + "LegbinderAnklesOver", + "WrappingAnklesOver", + + "WrappingLegsOver2", + "WrappingLegsOver", + "WrappingLegs", + "WrappingLegs2", + "WrappingLegsUnder", + + "OverSocks", + "StockingRightKneel", "StockingRight", + "FootRight", + "LegRight", + "StockingLeftKneel", "StockingLeft", + "FootLeft", + "LegLeft", + + ] + ), + + // region ALL + "All": ToMap( + LAYERS_BASE + ), + // endregion +}; + + + +let LayerProperties = { + ShoeLeftOver: { + Parent: "ShoeLeft", + }, + ShoeLeftUnder: { + Parent: "ShoeLeft", + }, + ShoeRightOver: { + Parent: "ShoeRight", + }, + ShoeRightUnder: { + Parent: "ShoeRight", + }, + FurnitureFront: { + Parent: "BG", + }, + FurnitureBack: { + Parent: "BG", + }, + Glasses: { + Parent: "Head", + }, + Eyes: { + Parent: "Head", + }, + Hair: { + Parent: "Head", + }, + HairFront: { + Parent: "Head", + }, + HairOver: { + Parent: "Head", + }, + HairMiddle: { + Parent: "Head", + }, + HairBack: { + Parent: "Head", + }, + HairPonytail: { + Parent: "Head", + }, + Mouth: { + Parent: "Head", + }, + Blush: { + Parent: "Head", + }, + Fear: { + Parent: "Head", + }, + Brows: { + Parent: "Head", + }, + Ears: { + Parent: "Head", + }, + Nose: { + Parent: "Head", + }, + InflatableHead: {Parent: "Head",}, + Hat: {Parent: "Head",}, + Hood: {Parent: "Head",}, + HeadbandDeco: {Parent: "Head"}, + Headband: {Parent: "Head"}, + Mask: {Parent: "Head"}, + MaskOver: {Parent: "Head"}, + MouthProp: {Parent: "Head"}, + Goggles: {Parent: "Head"}, + BlindfoldWrap: {Parent: "Head"}, + Blindfold: {Parent: "Head"}, + GagOver: {Parent: "Head"}, + GagMuzzleStraps: {Parent: "Head"}, + GagMuzzle: {Parent: "Head"}, + GagFlatStraps: {Parent: "Head"}, + GagFlat: {Parent: "Head"}, + GagStraps: {Parent: "Head"}, + Gag: {Parent: "Head"}, + GagUnder: {Parent: "Head"}, + Circlet: {Parent: "Head"}, + CircletUnder: {Parent: "Head"}, + HatBack: {Parent: "Head"}, + AnimalEars: {Parent: "Head"}, + AnimalEarsFront: {Parent: "Head"}, + Tail: {Parent: "Torso"}, + + + +}; + +let Hardpoints: Record = { + Front: { + Parent: "Torso", + X: 1162, + Y: 1790, + Angle: Math.PI*1.5, + }, + Mouth: { + Parent: "Head", + X: 1227, + Y: 690, + Angle: 0, + }, + Rear: { + Parent: "Torso", + X: 1127, + Y: 1799, + Angle: Math.PI*1.5, + }, + Chest: { + Parent: "Torso", + X: 1144, + Y: 1127, + Angle: Math.PI*1.0, + }, + BreastLeft: { + Parent: "Chest", + X: 950, + Y: 1127, + Angle: Math.PI*1.0, + }, + BreastRight: { + Parent: "Chest", + X: 1350, + Y: 1127, + Angle: Math.PI*1.0, + }, +}; + +// Constants +/** Internal value for layering */ +let LAYER_INCREMENT = 500; + +let MODELHEIGHT = 3500; +let MODELWIDTH = 2480; +/** Model scale to UI scalee */ +let MODEL_SCALE = 1000/MODELHEIGHT; +let MODEL_XOFFSET = Math.floor((- MODELWIDTH * MODEL_SCALE)/2); \ No newline at end of file diff --git a/Data/Filters.ts b/Data/Filters.ts new file mode 100644 index 000000000..1ffa07810 --- /dev/null +++ b/Data/Filters.ts @@ -0,0 +1,462 @@ +// This is based on DisplacementFilter + +let erasefragment = ` + +varying vec2 vFilterCoord; +varying vec2 vTextureCoord; + +uniform mat2 rotation; +uniform sampler2D uSampler; +uniform sampler2D mapSampler; + +uniform highp vec4 inputSize; +uniform vec4 inputClamp; + +void main(void) +{ + vec4 map = texture2D(mapSampler, vFilterCoord); + vec4 color = texture2D(uSampler, vTextureCoord); + + // If map.a == 0 then it will always be 100% alpha + // If map.a == 1 then it will be map.r alpha + color.rgba *= clamp(map.r + 1. - map.a, 0., 1.); + + gl_FragColor = color; +} +`; + +let erasevertex = ` +attribute vec2 aVertexPosition; + +uniform mat3 projectionMatrix; +uniform mat3 filterMatrix; + +varying vec2 vTextureCoord; +varying vec2 vFilterCoord; + +uniform vec4 inputSize; +uniform vec4 outputFrame; + +vec4 filterVertexPosition( void ) +{ + vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy; + + return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0); +} + +vec2 filterTextureCoord( void ) +{ + return aVertexPosition * (outputFrame.zw * inputSize.zw); +} + +void main(void) +{ + gl_Position = filterVertexPosition(); + vTextureCoord = filterTextureCoord(); + vFilterCoord = ( filterMatrix * vec3( vTextureCoord, 1.0) ).xy; +} +`; + + + +let occlusionfragment = ` + +varying vec2 vFilterCoord; +varying vec2 vTextureCoord; + +uniform mat2 rotation; +uniform sampler2D uSampler; +uniform sampler2D mapSampler; + +uniform vec2 scale; +uniform highp vec4 inputSize; +uniform vec4 inputClamp; + +void main(void) +{ + vec4 map = texture2D(mapSampler, vFilterCoord); + vec4 mapL = texture2D(mapSampler, clamp(vec2(vFilterCoord.x - 0.01 * scale.x, vFilterCoord.y - 0.005 * scale.y), + inputClamp.xy, + inputClamp.zw)); + vec4 mapR = texture2D(mapSampler, clamp(vec2(vFilterCoord.x + 0.01 * scale.x, vFilterCoord.y - 0.005 * scale.y), + inputClamp.xy, + inputClamp.zw)); + vec4 colorL = texture2D(uSampler, clamp(vec2(vTextureCoord.x - 0.015 * scale.x, vTextureCoord.y - 0.01 * scale.y), + inputClamp.xy, + inputClamp.zw)); + vec4 colorR = texture2D(uSampler, clamp(vec2(vTextureCoord.x + 0.015 * scale.x, vTextureCoord.y - 0.01 * scale.y), + inputClamp.xy, + inputClamp.zw)); + + + vec4 mapU = texture2D(mapSampler, clamp(vec2(vFilterCoord.x, vFilterCoord.y - 0.01 * scale.y), + inputClamp.xy, + inputClamp.zw)); + vec4 mapD = texture2D(mapSampler, clamp(vec2(vFilterCoord.x, vFilterCoord.y + 0.01 * scale.y), + inputClamp.xy, + inputClamp.zw)); + vec4 colorU = texture2D(uSampler, clamp(vec2(vTextureCoord.x, vTextureCoord.y - 0.015 * scale.y), + inputClamp.xy, + inputClamp.zw)); + vec4 colorD = texture2D(uSampler, clamp(vec2(vTextureCoord.x, vTextureCoord.y + 0.015 * scale.y), + inputClamp.xy, + inputClamp.zw)); + + vec4 color = texture2D(uSampler, vTextureCoord); + // sorcery + // I dont even know how this works myself + color.rgba *= clamp(1. + - clamp((mapL.a - mapR.a) * abs(1. - colorR.a), 0., 1.) + - clamp((mapR.a - mapL.a) * abs(1. - colorL.a), 0., 1.) + - 0.5*clamp((mapU.a - mapD.a) * abs(1. - colorD.a), 0., 1.) + - 0.5*clamp((mapD.a - mapU.a) * abs(1. - colorU.a), 0., 1.) + , 0., 1.); + + gl_FragColor = color; +} +`; + +let occlusionvertex = ` +attribute vec2 aVertexPosition; + +uniform mat3 projectionMatrix; +uniform mat3 filterMatrix; + +varying vec2 vTextureCoord; +varying vec2 vFilterCoord; + +uniform vec4 inputSize; +uniform vec4 outputFrame; + +vec4 filterVertexPosition( void ) +{ + vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy; + + return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0); +} + +vec2 filterTextureCoord( void ) +{ + return aVertexPosition * (outputFrame.zw * inputSize.zw); +} + +void main(void) +{ + gl_Position = filterVertexPosition(); + vTextureCoord = filterTextureCoord(); + vFilterCoord = ( filterMatrix * vec3( vTextureCoord, 1.0) ).xy; +} +`; + + + +let displacefragment = ` +varying vec2 vFilterCoord; +varying vec2 vTextureCoord; + +uniform vec2 scale; +uniform mat2 rotation; +uniform sampler2D uSampler; +uniform sampler2D mapSampler; + +uniform highp vec4 inputSize; +uniform vec4 inputClamp; + +void main(void) +{ + vec4 map = texture2D(mapSampler, vFilterCoord); + + map.xy -= 0.5; + map.xy = scale * inputSize.zw * (rotation * map.xy); + + gl_FragColor = texture2D(uSampler, + clamp(vec2(vTextureCoord.x + (map.x + 1. - map.a), vTextureCoord.y + (map.y + 1. - map.a)), + inputClamp.xy, + inputClamp.zw)); +} +`; + +let displacevertex = ` +attribute vec2 aVertexPosition; + +uniform mat3 projectionMatrix; +uniform mat3 filterMatrix; + +varying vec2 vTextureCoord; +varying vec2 vFilterCoord; + +uniform vec4 inputSize; +uniform vec4 outputFrame; + +vec4 filterVertexPosition( void ) +{ + vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy; + + return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0); +} + +vec2 filterTextureCoord( void ) +{ + return aVertexPosition * (outputFrame.zw * inputSize.zw); +} + +void main(void) +{ + gl_Position = filterVertexPosition(); + vTextureCoord = filterTextureCoord(); + vFilterCoord = ( filterMatrix * vec3( vTextureCoord, 1.0) ).xy; +} +`; + + + +class EraseFilter extends PIXI.Filter +{ + public maskSprite: ISpriteMaskTarget; + public maskMatrix: PIXIMatrix; + + /** + * @param {PIXI.Sprite} sprite - The sprite used for the displacement map. (make sure its added to the scene!) + * @param scale - The scale of the displacement + */ + constructor(sprite: ISpriteMaskTarget) + { + const maskMatrix = new PIXI.Matrix(); + + sprite.renderable = false; + + super(erasevertex, erasefragment, { + mapSampler: sprite._texture, + filterMatrix: maskMatrix, + scale: { x: 1, y: 1 }, + rotation: new Float32Array([1, 0, 0, 1]), + }); + + this.maskSprite = sprite; + this.maskMatrix = maskMatrix; + } + + /** + * Applies the filter. + * @param filterManager - The manager. + * @param input - The input target. + * @param output - The output target. + * @param clearMode - clearMode. + */ + public apply( + filterManager: PIXIFilterSystem, + input: PIXIRenderTexture, + output: PIXIRenderTexture, + clearMode: PIXICLEAR_MODES + ): void + { + if (!this.uniformGroup?.uniforms || !this.uniforms) { + KDFilterCacheToDestroy.push(this); + return; + } + // fill maskMatrix with _normalized sprite texture coords_ + this.uniforms.filterMatrix = filterManager.calculateSpriteMatrix(this.maskMatrix, this.maskSprite); + + // Extract rotation from world transform + const wt = this.maskSprite.worldTransform; + const lenX = Math.sqrt((wt.a * wt.a) + (wt.b * wt.b)); + const lenY = Math.sqrt((wt.c * wt.c) + (wt.d * wt.d)); + + if (lenX !== 0 && lenY !== 0) + { + this.uniforms.rotation[0] = wt.a / lenX; + this.uniforms.rotation[1] = wt.b / lenX; + this.uniforms.rotation[2] = wt.c / lenY; + this.uniforms.rotation[3] = wt.d / lenY; + } + + // draw the filter... + filterManager.applyFilter(this, input, output, clearMode); + } + + /** The texture used for the displacement map. Must be power of 2 sized texture. */ + get map(): PIXITexture + { + return this.uniforms.mapSampler; + } + + set map(value: PIXITexture) + { + this.uniforms.mapSampler = value; + } +} + +class DisplaceFilter extends PIXI.Filter +{ + public maskSprite: ISpriteMaskTarget; + public maskMatrix: PIXIMatrix; + public scale: PIXIPoint; + + /** + * @param {PIXI.Sprite} sprite - The sprite used for the displacement map. (make sure its added to the scene!) + * @param scale - The scale of the displacement + */ + constructor(sprite: ISpriteMaskTarget, scale?: number) + { + const maskMatrix = new PIXI.Matrix(); + + sprite.renderable = false; + + super(displacevertex, displacefragment, { + mapSampler: sprite._texture, + filterMatrix: maskMatrix, + scale: { x: 1, y: 1 }, + rotation: new Float32Array([1, 0, 0, 1]), + }); + + this.maskSprite = sprite; + this.maskMatrix = maskMatrix; + + if (scale === null || scale === undefined) + { + scale = 20; + } + + /** + * scaleX, scaleY for displacements + * @member {PIXI.Point} + */ + this.scale = new PIXI.Point(scale, scale); + } + + /** + * Applies the filter. + * @param filterManager - The manager. + * @param input - The input target. + * @param output - The output target. + * @param clearMode - clearMode. + */ + public apply( + filterManager: PIXIFilterSystem, + input: PIXIRenderTexture, + output: PIXIRenderTexture, + clearMode: PIXICLEAR_MODES + ): void + { + if (!this.uniformGroup?.uniforms || !this.uniforms) { + KDFilterCacheToDestroy.push(this); + return; + } + // fill maskMatrix with _normalized sprite texture coords_ + this.uniforms.filterMatrix = + filterManager.calculateSpriteMatrix(this.maskMatrix, this.maskSprite); + this.uniforms.scale.x = this.scale.x; + this.uniforms.scale.y = this.scale.y; + + // Extract rotation from world transform + const wt = this.maskSprite.worldTransform; + const lenX = Math.sqrt((wt.a * wt.a) + (wt.b * wt.b)); + const lenY = Math.sqrt((wt.c * wt.c) + (wt.d * wt.d)); + + if (lenX !== 0 && lenY !== 0) + { + this.uniforms.rotation[0] = wt.a / lenX; + this.uniforms.rotation[1] = wt.b / lenX; + this.uniforms.rotation[2] = wt.c / lenY; + this.uniforms.rotation[3] = wt.d / lenY; + } + + // draw the filter... + filterManager.applyFilter(this, input, output, clearMode); + } + + /** The texture used for the displacement map. Must be power of 2 sized texture. */ + get map(): PIXITexture + { + return this.uniforms.mapSampler; + } + + set map(value: PIXITexture) + { + this.uniforms.mapSampler = value; + } +} + + + +class OcclusionFilter extends PIXI.Filter +{ + public maskSprite: ISpriteMaskTarget; + public maskMatrix: PIXIMatrix; + public scale: PIXIPoint; + + /** + * @param {PIXI.Sprite} sprite - The sprite used for the displacement map. (make sure its added to the scene!) + * @param scale - The scale of the displacement + */ + constructor(sprite: ISpriteMaskTarget, scale?: number) + { + const maskMatrix = new PIXI.Matrix(); + + sprite.renderable = false; + + super(occlusionvertex, occlusionfragment, { + mapSampler: sprite._texture, + filterMatrix: maskMatrix, + scale: { x: 1, y: 1 }, + rotation: new Float32Array([1, 0, 0, 1]), + }); + if (scale === null || scale === undefined) + { + scale = 20; + } + /** + * scaleX, scaleY for displacements + * @member {PIXI.Point} + */ + this.scale = new PIXI.Point(scale, scale); + + this.maskSprite = sprite; + this.maskMatrix = maskMatrix; + } + + /** + * Applies the filter. + * @param filterManager - The manager. + * @param input - The input target. + * @param output - The output target. + * @param clearMode - clearMode. + */ + public apply( + filterManager: PIXIFilterSystem, + input: PIXIRenderTexture, + output: PIXIRenderTexture, + clearMode: PIXICLEAR_MODES + ): void + { + // fill maskMatrix with _normalized sprite texture coords_ + this.uniforms.filterMatrix = filterManager.calculateSpriteMatrix(this.maskMatrix, this.maskSprite); + + // Extract rotation from world transform + const wt = this.maskSprite.worldTransform; + const lenX = Math.sqrt((wt.a * wt.a) + (wt.b * wt.b)); + const lenY = Math.sqrt((wt.c * wt.c) + (wt.d * wt.d)); + + if (lenX !== 0 && lenY !== 0) + { + this.uniforms.rotation[0] = wt.a / lenX; + this.uniforms.rotation[1] = wt.b / lenX; + this.uniforms.rotation[2] = wt.c / lenY; + this.uniforms.rotation[3] = wt.d / lenY; + } + + // draw the filter... + filterManager.applyFilter(this, input, output, clearMode); + } + + /** The texture used for the displacement map. Must be power of 2 sized texture. */ + get map(): PIXITexture + { + return this.uniforms.mapSampler; + } + + set map(value: PIXITexture) + { + this.uniforms.mapSampler = value; + } +} \ No newline at end of file diff --git a/Data/ModelDresses.ts b/Data/ModelDresses.ts new file mode 100644 index 000000000..47855624e --- /dev/null +++ b/Data/ModelDresses.ts @@ -0,0 +1,264 @@ +/** + * List off all dresses items + */ +let KDModelDresses: {[_: string]: KinkyDungeonDress} = { + "Default" : KinkyDungeonDefaultDefaultDress, + "Prisoner" : [ + {Item: "Swimsuit", Group: "Suit", Color: "#8A120C", Lost: false, Filters: { + Swimsuit: {"gamma":1.5333333333333332,"saturation":0,"contrast":1.7666666666666666,"brightness":1.0166666666666666,"red":2.8000000000000003,"green":1,"blue":1,"alpha":1}, + }}, + ], + "Bandit" : [ + {Item: "StrappyBikini", Group: "Panties", Color: "#53428D", Lost: false, + Filters: { + StrappyLower: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.55,"red":1,"green":1,"blue":1,"alpha":1}, + }}, + {Item: "StrappyBra", Group: "Bra", Color: "#53428D", Lost: false, + Filters: { + Bra: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.55,"red":1,"green":1,"blue":1,"alpha":1}, + }}, + {Item: "Bandit", Group: "Suit", Color: "Default", Lost: false}, + ], + "GreenLeotard" : [ + {Item: "Swimsuit", Group: "Suit", Color: "#8A120C", Lost: false, Filters: { + Swimsuit: {"gamma":1.5333333333333332,"saturation":0,"contrast":1.7666666666666666,"brightness":1.0166666666666666,"green":2.8000000000000003,"red":1,"blue":1,"alpha":1}, + }}, + ], + "Leotard" : [ + {Item: "BunnyLeotard", Group: "Suit", Color: "#53428D", Lost: false}, + ], + "Bikini" : [ + {Item: "StrappyBikini", Group: "Panties", Color: "#53428D", Lost: false, + Filters: { + StrappyLower: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.55,"red":1,"green":1,"blue":1,"alpha":1}, + }}, + {Item: "StrappyBra", Group: "Bra", Color: "#53428D", Lost: false, + Filters: { + Bra: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.55,"red":1,"green":1,"blue":1,"alpha":1}, + }}, + ], + "None" : [ + + ], + "Lingerie" : [ + {Item: "LacePanties", Group: "Panties", Color: "#53428D", Lost: false}, + {Item: "LaceBra", Group: "Bra", Color: "#53428D", Lost: false}, + ], + "LatexPrisoner" : [{"Item":"Catsuit","Group":"Catsuit","Color":"#ffffff","Lost":false},{"Item":"LatexCorset","Group":"LatexCorset","Color":"#ffffff","Lost":false,"Filters":{"HeavyCorset":{"gamma":1,"saturation":0.41666666666666663,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Corset":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LatexBra","Group":"LatexBra","Color":"#ffffff","Lost":false},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"CrystalShoeLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.18333333333333335,"red":1,"green":1,"blue":1,"alpha":1},"CrystalShoeRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.26666666666666666,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BanditWrist","Group":"BanditWrist","Color":"#ffffff","Lost":false,"Filters":{"WristLeft":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1.8166666666666667,"red":1,"green":1,"blue":1,"alpha":1},"WristRight":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1.8166666666666667,"red":1,"green":1,"blue":1,"alpha":1}}}], + "Dungeon" : [ + {Item: "LacePanties", Group: "Panties", Color: "#53428D", Lost: false}, + {Item: "LaceBra", Group: "Bra", Color: "#53428D", Lost: false}, + ], + Worshipper: [{"Item":"LeatherLeotardTop","Group":"LeatherLeotardTop","Color":"#ffffff","Lost":false,"Filters":{"Leather":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.7999999999999998,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LeatherLeotardCorset","Group":"LeatherLeotardCorset","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":1,"contrast":1,"brightness":2.7,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LeatherLeotardBottom","Group":"LeatherLeotardBottom","Color":"#ffffff","Lost":false,"Filters":{"Leather":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.7999999999999998,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionCrystalBelt","Group":"FashionCrystalBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1333333333333333,"alpha":1},"BaseMetal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7000000000000002,"alpha":1}}},{"Item":"FashionCrystalCollar","Group":"FashionCrystalCollar","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7000000000000002,"alpha":1}}},{"Item":"FashionCrystalCuffsWrists","Group":"FashionCrystalCuffsWrists","Color":"#ffffff","Lost":false},{"Item":"FashionCrystalCuffsArms","Group":"FashionCrystalCuffsArms","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7000000000000002,"alpha":1}}},{"Item":"FashionCrystalCuffsThigh","Group":"FashionCrystalCuffsThigh","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7000000000000002,"alpha":1}}},{"Item":"FashionCrystalCuffsAnkles","Group":"FashionCrystalCuffsAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7000000000000002,"alpha":1}}},{"Item":"ShinyBalletHeels","Group":"ShinyBalletHeels","Color":"#ffffff","Lost":false,"Filters":{"Sole":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7000000000000002,"alpha":1},"Shoe":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.3,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionThighLink","Group":"FashionThighLink","Color":"#ffffff","Lost":false},{"Item":"FashionAnkleLink","Group":"FashionAnkleLink","Color":"#ffffff","Lost":false},{"Item":"FashionLeash","Group":"FashionLeash","Color":"#ffffff","Lost":false,"Filters":{"Leash":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1.7999999999999998,"red":1.3,"green":1,"blue":1.7666666666666666,"alpha":0.8166666666666667}},"Properties":{"Leash":{"YOffset":-60,"XOffset":8}}},{"Item":"LaceDeco","Group":"LaceDeco","Color":"#ffffff","Lost":false,"Filters":{"DecoCrystal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1,"red":3.95,"green":0.6333333333333334,"blue":1.9500000000000002,"alpha":1},"DecoHardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.4666666666666667,"red":1,"green":1,"blue":2.45,"alpha":1},"DecoBase":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.8333333333333333,"alpha":1}},"Properties":{"DecoBase":{"XOffset":60,"YOffset":-300,"LayerBonus":40000},"DecoCrystal":{"XOffset":60,"YOffset":-300,"LayerBonus":40000},"DecoHardware":{"XOffset":60,"YOffset":-300,"LayerBonus":40000}}},{"Item":"FashionBallGag","Group":"FashionBallGag","Color":"#ffffff","Lost":false,"Filters":{"Strap":{"gamma":2.2,"saturation":0.03333333333333333,"contrast":1.25,"brightness":0.7666666666666666,"red":1.2,"green":1,"blue":2.183333333333333,"alpha":1},"Ball":{"gamma":1.45,"saturation":0.06666666666666667,"contrast":1.0333333333333332,"brightness":1.7833333333333334,"red":1,"green":1,"blue":1,"alpha":1}}}], + + "Bast" : [{"Item":"ElfSkirt","Group":"ElfSkirt","Color":"#ffffff","Lost":false,"Filters":{"SkirtBand":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.55,"red":1,"green":2.15,"blue":1,"alpha":1},"Skirt":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.6666666666666666,"red":1,"green":1,"blue":1,"alpha":1},"SkirtBack":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.6666666666666666,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ElfTop","Group":"ElfTop","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.6666666666666666,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ElfBra","Group":"ElfBra","Color":"#ffffff","Lost":false},{"Item":"RobeBra","Group":"RobeBra","Color":"#ffffff","Lost":false},{"Item":"ElfPanties","Group":"ElfPanties","Color":"#ffffff","Lost":false},{"Item":"WarriorBoots","Group":"WarriorBoots","Color":"#ffffff","Lost":false}], + /*"Dragon" : [ + {Item: "Dragonheart", Group: "Uniform", Color: "#444444", Lost: false}, + ],*/ + "DollSuit" : [ + {Item: "Catsuit", Group: "Catsuit", Color: "#7F3C9B", Lost: false, Filters: { + TorsoUpper: {"gamma":1,"saturation":0,"contrast":0.8300000000000001,"brightness":1,"red":1.2549019607843137,"green":1,"blue":4,"alpha":1}, + TorsoLower: {"gamma":1,"saturation":0,"contrast":0.8300000000000001,"brightness":1,"red":1.2549019607843137,"green":1,"blue":4,"alpha":1}, + }}, + ], + "SlimeSuit" : [ + {Item: "Catsuit", Group: "Catsuit", Color: "#7F3C9B", Lost: false, Filters: { + TorsoUpper: {"gamma":0.8333333333333333,"saturation":1,"contrast":0.75,"brightness":1.2333333333333334,"red":3.7166666666666663,"green":1,"blue":3.283333333333333,"alpha":1}, + TorsoLower: {"gamma":0.8333333333333333,"saturation":1,"contrast":0.75,"brightness":1.2333333333333334,"red":3.7166666666666663,"green":1,"blue":3.283333333333333,"alpha":1}, + }}, + ], + "CyberDoll" : [ + {Item: "Catsuit", Group: "Catsuit", Color: "#7F3C9B", Lost: false, Filters: { + TorsoUpper: {"gamma":1.0166666666666666,"saturation":0,"contrast":0.8999999999999999,"brightness":1.4000000000000001,"red":0.7666666666666666,"green":1,"blue":4.833333333333333,"alpha":1}, + TorsoLower: {"gamma":1.0166666666666666,"saturation":0,"contrast":0.8999999999999999,"brightness":1.4000000000000001,"red":0.7666666666666666,"green":1,"blue":4.833333333333333,"alpha":1}, + }}, + ], + "ProtoSlimeSuit" : [ + {Item: "Catsuit", Group: "Catsuit", Color: "#7F3C9B", Lost: false, Filters: { + TorsoUpper: {"gamma":0.8333333333333333,"saturation":1,"contrast":0.75,"brightness":0.5333333333333334,"blue":3.7166666666666663,"red":1,"green":3.283333333333333,"alpha":1}, + TorsoLower: {"gamma":0.8333333333333333,"saturation":1,"contrast":0.75,"brightness":0.5333333333333334,"blue":3.7166666666666663,"red":1,"green":3.283333333333333,"alpha":1}, + }}, + ], + "CaptureFoamSuit" : [ + {Item: "Catsuit", Group: "Catsuit", Color: "#7F3C9B", Lost: false, Filters: { + TorsoUpper: {"gamma":0.8333333333333333,"saturation":1,"contrast":0.75,"brightness":0.5333333333333334,"blue":3.7166666666666663,"red":1,"green":3.283333333333333,"alpha":1}, + TorsoLower: {"gamma":0.8333333333333333,"saturation":1,"contrast":0.75,"brightness":0.5333333333333334,"blue":3.7166666666666663,"red":1,"green":3.283333333333333,"alpha":1}, + }}, + ], + "BlueSuit" : [ + {Item: "Catsuit", Group: "Catsuit", Color: "#7F3C9B", Lost: false, Filters: { + TorsoUpper: {"gamma":0.8333333333333333,"saturation":1,"contrast":0.75,"brightness":1.2333333333333334,"blue":3.7166666666666663,"red":1,"green":3.283333333333333,"alpha":1}, + TorsoLower: {"gamma":0.8333333333333333,"saturation":1,"contrast":0.75,"brightness":1.2333333333333334,"blue":3.7166666666666663,"red":1,"green":3.283333333333333,"alpha":1}, + }}, + ], + "Bountyhunter" : [ + {Item: "Catsuit", Group: "Suit", Color: "#444444", Lost: false}, + {Item: "BanditBoots", Group: "Shoes", Color: "#444444", Lost: false}, + ], + "BlueSuitPrison" : [ + {Item: "Catsuit", Group: "Catsuit", Color: "#7F3C9B", Lost: false, Filters: { + TorsoUpper: {"gamma":0.8333333333333333,"saturation":1,"contrast":0.75,"brightness":1.2333333333333334,"blue":3.7166666666666663,"red":1,"green":3.283333333333333,"alpha":1}, + TorsoLower: {"gamma":0.8333333333333333,"saturation":1,"contrast":0.75,"brightness":1.2333333333333334,"blue":3.7166666666666663,"red":1,"green":3.283333333333333,"alpha":1}, + }}, + ], + "Wolfgirl" : [ + {Item: "Wolf", Group: "Uniform", Color: "#444444", Lost: false}, + ], + "Maid" : [{"Item":"MaidShoes","Group":"MaidShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}}},{"Item":"LaceBra","Group":"LaceBra","Color":"#ffffff","Lost":false,"Filters":{"BraBase":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"BraCups":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"BraStripes":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LacePanties","Group":"LacePanties","Color":"#ffffff","Lost":false,"Filters":{"LaceCrotchPanel":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Panties":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Trim":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Lace":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BunnySocks","Group":"BunnySocks","Color":"#ffffff","Lost":false,"Filters":{"SockRight":{"gamma":1.2,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.0980392156862746,"alpha":1},"SockLeft":{"gamma":1.2,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.0980392156862746,"alpha":1}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"BandRight":{"gamma":1,"saturation":0,"contrast":0.9833333333333333,"brightness":0.5,"red":1.05,"green":1,"blue":1,"alpha":1},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"RimRight":{"gamma":2,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1},"RimLeft":{"gamma":2,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1},"BandLeft":{"gamma":1,"saturation":0,"contrast":0.9833333333333333,"brightness":0.5,"red":1.05,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidBow","Group":"MaidBow","Color":"#ffffff","Lost":false,"Filters":{"Bow":{"gamma":1.4000000000000001,"saturation":1,"contrast":1,"brightness":1.25,"red":1,"green":1,"blue":1.1,"alpha":1}}},{"Item":"BowCorsetLongOverbust","Group":"BowCorsetLongOverbust","Color":"#ffffff","Lost":false,"Filters":{"CorsetBust":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1},"RuffleBust":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1},"Corset":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1.2,"red":1,"green":1,"blue":1.1,"alpha":1},"Ruffle":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1.2,"red":1,"green":1,"blue":1.1,"alpha":1}}},{"Item":"DressBlouseBust","Group":"DressBlouseBust","Color":"#ffffff","Lost":false,"Filters":{"BlouseSkirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1},"Neck":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1},"Collar":{"gamma":1.9,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1},"Blouse":{"gamma":1.9,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1},"BlouseLiner":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1},"Blouse":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}}},{"Item":"BowCorsetBow","Group":"BowCorsetBow","Color":"#ffffff","Lost":false,"Filters":{"Bow":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1}}},{"Item":"Ribbon","Group":"Ribbon","Color":"#ffffff","Lost":false,"Filters":{"RibbonBelt":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1.5666666666666669,"red":1,"green":1,"blue":1.1,"alpha":1},"RibbonBack":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1.5666666666666669,"red":1,"green":1,"blue":1.1,"alpha":1}}},{"Item":"StrappyBikini","Group":"StrappyBikini","Color":"#ffffff","Lost":false,"Filters":{"StrappyLower":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.55,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"StrappyBra","Group":"StrappyBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.55,"red":1,"green":1,"blue":1,"alpha":1}}}], + + DragonGirlShadow: [{"Item":"FashionFutureHarnessChest","Group":"FashionFutureHarnessChest","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1.0666666666666667,"saturation":0,"contrast":1,"brightness":1.4333333333333333,"red":1.3,"green":0.5666666666666667,"blue":1.4833333333333334,"alpha":1.05},"Metal":{"gamma":1.0166666666666666,"saturation":0.016666666666666666,"contrast":1,"brightness":1.1666666666666667,"red":0.3666666666666667,"green":0.3833333333333333,"blue":1.4833333333333334,"alpha":0.65},"Straps":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.2333333333333334,"brightness":3.1833333333333336,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Lock":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666}}},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":1,"contrast":1.6,"brightness":1.2666666666666668,"red":0.48333333333333334,"green":1,"blue":1,"alpha":0},"CorsetStraps":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.65,"brightness":1,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":1}}},{"Item":"MageCollar","Group":"MageCollar","Color":"#ffffff","Lost":false,"Filters":{"Hardware":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.2333333333333334,"brightness":1.2,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Crystal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1.6,"brightness":0.7833333333333334,"red":1.5666666666666669,"green":1.1,"blue":0.95,"alpha":1}}},{"Item":"LatexTop","Group":"LatexTop","Color":"#ffffff","Lost":false,"Filters":{"Hem":{"gamma":1.05,"saturation":0.016666666666666666,"contrast":1.2,"brightness":4.866666666666667,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Latex":{"gamma":1,"saturation":0.016666666666666666,"contrast":2.3833333333333333,"brightness":0.3333333333333333,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":0.9166666666666666}}},{"Item":"PlateBoots","Group":"PlateBoots","Color":"#ffffff","Lost":false,"Filters":{"BootLeft":{"gamma":0.2833333333333333,"saturation":0,"contrast":1,"brightness":1.5166666666666666,"red":0.3833333333333333,"green":0.3666666666666667,"blue":1.4833333333333334,"alpha":0.65},"BootRight":{"gamma":0.2833333333333333,"saturation":0,"contrast":1,"brightness":1.5166666666666666,"red":0.3833333333333333,"green":0.3666666666666667,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"FashionShacklesElbowLeft","Group":"FashionShacklesElbowLeft","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1.0666666666666667,"saturation":0,"contrast":1,"brightness":1.6500000000000001,"red":1.3,"green":0.5666666666666667,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.9166666666666666,"brightness":1.2333333333333334,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":0.9166666666666666}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.0833333333333335,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.0833333333333335,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333}}},{"Item":"SuccubusTail","Group":"SuccubusTail","Color":"#ffffff","Lost":false,"Filters":{"SuccubusTail":{"gamma":0.7666666666666666,"saturation":0,"contrast":0.7666666666666666,"brightness":4.9,"red":1.3,"green":0.5166666666666666,"blue":1.4833333333333334,"alpha":0.65},"SuccubusTailLight":{"gamma":1.0166666666666666,"saturation":0.016666666666666666,"contrast":1,"brightness":2.166666666666667,"red":0.3666666666666667,"green":0.3833333333333333,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"FashionShacklesThighRight","Group":"FashionShacklesThighRight","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1.0666666666666667,"saturation":0,"contrast":1,"brightness":1.6500000000000001,"red":1.3,"green":0.5666666666666667,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"FashionShacklesThighLeft","Group":"FashionShacklesThighLeft","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1.0666666666666667,"saturation":0,"contrast":1,"brightness":1.6500000000000001,"red":1.3,"green":0.5666666666666667,"blue":1.4833333333333334,"alpha":0.65},"ThighLeft":{"gamma":1.0166666666666666,"saturation":0.016666666666666666,"contrast":1,"brightness":2.166666666666667,"red":0.3666666666666667,"green":0.3833333333333333,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"GauntletRight","Group":"GauntletRight","Color":"#ffffff","Lost":false,"Filters":{"GauntletRight":{"gamma":0.2833333333333333,"saturation":0,"contrast":1,"brightness":1.5166666666666666,"red":0.3833333333333333,"green":0.3666666666666667,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"GauntletLeft","Group":"GauntletLeft","Color":"#ffffff","Lost":false,"Filters":{"GauntletLeft":{"gamma":0.2833333333333333,"saturation":0,"contrast":1,"brightness":1.5166666666666666,"red":0.3833333333333333,"green":0.3666666666666667,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"FashionShacklesElbowRight","Group":"FashionShacklesElbowRight","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1.0666666666666667,"saturation":0,"contrast":1,"brightness":1.6500000000000001,"red":1.3,"green":0.5666666666666667,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"SuccubusHorn","Group":"SuccubusHorn","Color":"#ffffff","Lost":false,"Filters":{"SuccubusHornRight":{"gamma":1,"saturation":0,"contrast":0.5166666666666666,"brightness":0.7333333333333334,"red":1.5666666666666669,"green":1.1,"blue":0.95,"alpha":1},"SuccubusHornLeft":{"gamma":1,"saturation":0,"contrast":0.5166666666666666,"brightness":0.7333333333333334,"red":1.5666666666666669,"green":1.1,"blue":0.95,"alpha":1}}}], + DragonGirlCrystal: [{"Item":"FashionFutureHarnessChest","Group":"FashionFutureHarnessChest","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":0,"contrast":1.0166666666666666,"brightness":2.0833333333333335,"red":0.3,"green":0.8500000000000001,"blue":1,"alpha":1.0166666666666666},"Metal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1.1500000000000001,"red":1.3833333333333333,"green":0.6666666666666666,"blue":0.9166666666666666,"alpha":1},"Straps":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.2333333333333334,"brightness":3.1833333333333336,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Lock":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666}}},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":1,"contrast":1.6,"brightness":1.2666666666666668,"red":0.48333333333333334,"green":1,"blue":1,"alpha":0},"CorsetStraps":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.65,"brightness":1,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":1}}},{"Item":"MageCollar","Group":"MageCollar","Color":"#ffffff","Lost":false,"Filters":{"Hardware":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.2333333333333334,"brightness":1.2,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Crystal":{"gamma":1,"saturation":0,"contrast":0.9166666666666666,"brightness":3.1,"red":0.41666666666666663,"green":0.43333333333333335,"blue":1,"alpha":1.0166666666666666}}},{"Item":"FashionShacklesThighRight","Group":"FashionShacklesThighRight","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":2.783333333333333,"red":1.3833333333333333,"green":0.6666666666666666,"blue":0.9166666666666666,"alpha":0.6}}},{"Item":"LatexTop","Group":"LatexTop","Color":"#ffffff","Lost":false,"Filters":{"Hem":{"gamma":1.05,"saturation":0.016666666666666666,"contrast":1.2,"brightness":4.866666666666667,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Latex":{"gamma":1,"saturation":0.016666666666666666,"contrast":2.3833333333333333,"brightness":0.3333333333333333,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":0.9166666666666666}}},{"Item":"GauntletLeft","Group":"GauntletLeft","Color":"#ffffff","Lost":false,"Filters":{"GauntletLeft":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":1.4833333333333334,"red":0.3666666666666667,"green":1,"blue":1,"alpha":0.6}}},{"Item":"GauntletRight","Group":"GauntletRight","Color":"#ffffff","Lost":false,"Filters":{"GauntletRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.9166666666666666,"brightness":1.2166666666666668,"red":1.3833333333333333,"green":0.6666666666666666,"blue":0.9166666666666666,"alpha":0.6}}},{"Item":"FashionShacklesElbowRight","Group":"FashionShacklesElbowRight","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":2.783333333333333,"red":1.3833333333333333,"green":0.6666666666666666,"blue":0.9166666666666666,"alpha":0.6}}},{"Item":"PlateBoots","Group":"PlateBoots","Color":"#ffffff","Lost":false,"Filters":{"BootLeft":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":1.4833333333333334,"red":0.3666666666666667,"green":1,"blue":1,"alpha":0.6},"BootRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.9166666666666666,"brightness":1.2166666666666668,"red":1.3833333333333333,"green":0.6666666666666666,"blue":0.9166666666666666,"alpha":0.6}}},{"Item":"FashionShacklesElbowLeft","Group":"FashionShacklesElbowLeft","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":3.25,"red":0.3666666666666667,"green":1,"blue":1,"alpha":0.6}}},{"Item":"FashionShacklesThighLeft","Group":"FashionShacklesThighLeft","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":3.25,"red":0.3666666666666667,"green":1,"blue":1,"alpha":0.6}}},{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.9166666666666666,"brightness":1.2333333333333334,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":0.9166666666666666}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.0833333333333335,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.0833333333333335,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333}}},{"Item":"SuccubusTail","Group":"SuccubusTail","Color":"#ffffff","Lost":false,"Filters":{"SuccubusTail":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.8,"brightness":2.1,"red":0.5166666666666666,"green":0.65,"blue":1,"alpha":1},"SuccubusTailLight":{"gamma":1,"saturation":0,"contrast":2.5,"brightness":1.4166666666666665,"red":0.3666666666666667,"green":1,"blue":1,"alpha":0.9333333333333333}}}], + DragonGirlIce: [{"Item":"FashionFutureHarnessChest","Group":"FashionFutureHarnessChest","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":0,"contrast":1.0166666666666666,"brightness":2.216666666666667,"red":0.3,"green":0.41666666666666663,"blue":1,"alpha":1.0166666666666666},"Straps":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.2333333333333334,"brightness":3.1833333333333336,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Lock":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666},"Metal":{"gamma":1,"saturation":0,"contrast":1.1666666666666667,"brightness":1.4833333333333334,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":1,"contrast":1.6,"brightness":1.2666666666666668,"red":0.48333333333333334,"green":1,"blue":1,"alpha":0},"CorsetStraps":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.65,"brightness":1,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":1}}},{"Item":"MageCollar","Group":"MageCollar","Color":"#ffffff","Lost":false,"Filters":{"Hardware":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.2333333333333334,"brightness":1.2,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Crystal":{"gamma":1,"saturation":0,"contrast":1,"brightness":2.0666666666666664,"red":1,"green":0.65,"blue":0.3666666666666667,"alpha":1}}},{"Item":"LatexTop","Group":"LatexTop","Color":"#ffffff","Lost":false,"Filters":{"Hem":{"gamma":1.05,"saturation":0.016666666666666666,"contrast":1.2,"brightness":4.866666666666667,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Latex":{"gamma":1,"saturation":0.016666666666666666,"contrast":2.3833333333333333,"brightness":0.3333333333333333,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":0.9166666666666666}}},{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.9166666666666666,"brightness":1.2333333333333334,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":0.9166666666666666}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.0833333333333335,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.0833333333333335,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333}}},{"Item":"SuccubusTail","Group":"SuccubusTail","Color":"#ffffff","Lost":false,"Filters":{"SuccubusTail":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.8,"brightness":2.8666666666666667,"red":0.5166666666666666,"green":0.7333333333333334,"blue":1,"alpha":1},"SuccubusTailLight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1.7000000000000002,"red":0.6333333333333334,"green":0.7333333333333334,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":2.8000000000000003,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"CrystalShoeLeft":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":2.1,"red":0.3666666666666667,"green":0.48333333333333334,"blue":1,"alpha":1.0833333333333335},"CrystalShoeRight":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":2.1,"red":0.3666666666666667,"green":0.48333333333333334,"blue":1,"alpha":1.0833333333333335},"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.8833333333333333,"red":0.8666666666666667,"green":0.55,"blue":0.44999999999999996,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.8833333333333333,"red":0.8666666666666667,"green":0.55,"blue":0.44999999999999996,"alpha":1}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":2.8000000000000003,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"FashionShacklesElbowLeft","Group":"FashionShacklesElbowLeft","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":2.8000000000000003,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"FashionShacklesElbowRight","Group":"FashionShacklesElbowRight","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":2.8000000000000003,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65},"ElbowRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":2.8000000000000003,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"FashionShacklesThigh","Group":"FashionShacklesThigh","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":2.8000000000000003,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"SuccubusHorn","Group":"SuccubusHorn","Color":"#ffffff","Lost":false,"Filters":{"SuccubusHornRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.55,"brightness":2.9499999999999997,"red":0.7333333333333334,"green":0.7333333333333334,"blue":1,"alpha":1},"SuccubusHornLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.55,"brightness":2.9499999999999997,"red":0.7333333333333334,"green":0.7333333333333334,"blue":1,"alpha":1},"SuccubusHornLight":{"gamma":1,"saturation":0,"contrast":2.5,"brightness":1.4166666666666665,"red":0.3666666666666667,"green":1,"blue":1,"alpha":0.9333333333333333}}}], + DragonGirlPoison: [{"Item":"FashionFutureHarnessChest","Group":"FashionFutureHarnessChest","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":0,"contrast":1.0166666666666666,"brightness":1.35,"red":0.43333333333333335,"green":0.8500000000000001,"blue":0.43333333333333335,"alpha":1.0166666666666666},"Straps":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.2333333333333334,"brightness":3.1833333333333336,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Lock":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666},"Metal":{"gamma":1,"saturation":0,"contrast":1.1666666666666667,"brightness":2.3833333333333333,"red":0.5666666666666667,"green":0.6333333333333334,"blue":1,"alpha":1}}},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":1,"contrast":1.6,"brightness":1.2666666666666668,"red":0.48333333333333334,"green":1,"blue":1,"alpha":0},"CorsetStraps":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.65,"brightness":1,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":1}}},{"Item":"MageCollar","Group":"MageCollar","Color":"#ffffff","Lost":false,"Filters":{"Hardware":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.2333333333333334,"brightness":1.2,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Crystal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.5,"red":1,"green":0.5166666666666666,"blue":1.05,"alpha":1}}},{"Item":"LatexTop","Group":"LatexTop","Color":"#ffffff","Lost":false,"Filters":{"Hem":{"gamma":1.05,"saturation":0.016666666666666666,"contrast":1.2,"brightness":4.866666666666667,"red":1,"green":0.8,"blue":0.3666666666666667,"alpha":1},"Latex":{"gamma":1,"saturation":0.016666666666666666,"contrast":2.3833333333333333,"brightness":0.3333333333333333,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":0.9166666666666666}}},{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.9166666666666666,"brightness":1.2333333333333334,"red":1,"green":0.6333333333333334,"blue":0.7166666666666667,"alpha":0.9166666666666666}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.0833333333333335,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.0833333333333335,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333}}},{"Item":"SuccubusTail","Group":"SuccubusTail","Color":"#ffffff","Lost":false,"Filters":{"SuccubusTail":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.8,"brightness":3.016666666666667,"red":0.5166666666666666,"green":0.7000000000000001,"blue":1,"alpha":1},"SuccubusTailLight":{"gamma":1,"saturation":0,"contrast":1.2,"brightness":1.7166666666666666,"red":0.41666666666666663,"green":1,"blue":0.41666666666666663,"alpha":0.9333333333333333}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":3.433333333333333,"red":0.43333333333333335,"green":1,"blue":0.43333333333333335,"alpha":0.6}}},{"Item":"FashionShacklesElbowLeft","Group":"FashionShacklesElbowLeft","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":3.433333333333333,"red":0.43333333333333335,"green":1,"blue":0.43333333333333335,"alpha":0.6}}},{"Item":"FashionShacklesElbowRight","Group":"FashionShacklesElbowRight","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":3.25,"red":0.3666666666666667,"green":1,"blue":1,"alpha":0.6}}},{"Item":"FashionShacklesThigh","Group":"FashionShacklesThigh","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":3.433333333333333,"red":0.43333333333333335,"green":1,"blue":0.43333333333333335,"alpha":0.6}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.3333333333333333,"red":1.5666666666666669,"green":1.1,"blue":0.95,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.3333333333333333,"red":1.5666666666666669,"green":1.1,"blue":0.95,"alpha":1},"CrystalShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.8166666666666667,"red":1,"green":0.65,"blue":0.44999999999999996,"alpha":1},"CrystalShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.8166666666666667,"red":1,"green":0.65,"blue":0.44999999999999996,"alpha":1}}},{"Item":"RobeSleevesDeco","Group":"RobeSleevesDeco","Color":"#ffffff","Lost":false,"Filters":{"SleeveDecoLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.44999999999999996,"red":1.5,"green":1.1,"blue":0.95,"alpha":1},"SleeveDecoRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.44999999999999996,"red":1.5,"green":1.1,"blue":0.95,"alpha":1}}},{"Item":"BanditWrist","Group":"BanditWrist","Color":"#ffffff","Lost":false,"Filters":{"WristLeft":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":4.966666666666667,"red":0.43333333333333335,"green":1,"blue":0.43333333333333335,"alpha":0.6},"WristRight":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":4.966666666666667,"red":0.43333333333333335,"green":1,"blue":0.43333333333333335,"alpha":0.6}}}], + + MaidKnightLight: [{"Item":"LightMaidKnight_Boots","Group":"LightMaidKnight_Boots","Color":"#ffffff","Lost":false,"Filters":{"BootLeft":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"BootRight":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"ShoeLeft":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LightMaidKnight_Apron","Group":"LightMaidKnight_Apron","Color":"#ffffff","Lost":false},{"Item":"LightMaidKnight_Sleeves","Group":"LightMaidKnight_Sleeves","Color":"#ffffff","Lost":false,"Filters":{"SleeveLeft":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1},"SleeveRight":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LightMaidKnight_SockRight","Group":"LightMaidKnight_SockRight","Color":"#ffffff","Lost":false},{"Item":"LightMaidKnight_SockLeft","Group":"LightMaidKnight_SockLeft","Color":"#ffffff","Lost":false},{"Item":"LightMaidKnight_GloveLeft","Group":"LightMaidKnight_GloveLeft","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LightMaidKnight_GloveRight","Group":"LightMaidKnight_GloveRight","Color":"#ffffff","Lost":false},{"Item":"LightMaidKnight_GuardLeft","Group":"LightMaidKnight_GuardLeft","Color":"#ffffff","Lost":false,"Filters":{"GuardLeft":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LightMaidKnight_GuardRight","Group":"LightMaidKnight_GuardRight","Color":"#ffffff","Lost":false,"Filters":{"GuardRight":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LightMaidKnight_Pauldron","Group":"LightMaidKnight_Pauldron","Color":"#ffffff","Lost":false,"Filters":{"PauldronLeft":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"PauldronStrap":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LightMaidKnight_Dress","Group":"LightMaidKnight_Dress","Color":"#ffffff","Lost":false,"Filters":{"Dress":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1},"Skirt":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1},"DressDeco":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1},"DressDecoBack":{"gamma":1,"saturation":0.4,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionLeatherCollarBell","Group":"FashionLeatherCollarBell","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2,"green":1,"blue":1,"alpha":1},"Cuff":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Band":{"gamma":1,"saturation":0.1,"contrast":1,"brightness":1.1,"red":1.35,"green":1.35,"blue":1.35,"alpha":2}}},{"Item":"CyberCuffsElbowLeft","Group":"CyberCuffsElbowLeft","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"CyberCuffsElbowRight","Group":"CyberCuffsElbowRight","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"CyberCuffsThighRight","Group":"CyberCuffsThighRight","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"CyberCuffsThighLeft","Group":"CyberCuffsThighLeft","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"CyberCuffsWrists","Group":"CyberCuffsWrists","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}}}], + MaidKnightHeavy: [{"Item":"HeavyMaidKnight_Boots","Group":"HeavyMaidKnight_Boots","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_Dress","Group":"HeavyMaidKnight_Dress","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_SleeveLeft","Group":"HeavyMaidKnight_SleeveLeft","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_SleeveRight","Group":"HeavyMaidKnight_SleeveRight","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_ChestArmor","Group":"HeavyMaidKnight_ChestArmor","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_GloveLeft","Group":"HeavyMaidKnight_GloveLeft","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_GloveRight","Group":"HeavyMaidKnight_GloveRight","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_GauntletLeft","Group":"HeavyMaidKnight_GauntletLeft","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_GauntletRight","Group":"HeavyMaidKnight_GauntletRight","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_PauldronLeft","Group":"HeavyMaidKnight_PauldronLeft","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_PauldronRight","Group":"HeavyMaidKnight_PauldronRight","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_SideArmor","Group":"HeavyMaidKnight_SideArmor","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_Corset","Group":"HeavyMaidKnight_Corset","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_ApronBottom","Group":"HeavyMaidKnight_ApronBottom","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_ApronTop","Group":"HeavyMaidKnight_ApronTop","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_WaistBelts","Group":"HeavyMaidKnight_WaistBelts","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_WaistPouches","Group":"HeavyMaidKnight_WaistPouches","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_PantyhoseShorts","Group":"HeavyMaidKnight_PantyhoseShorts","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_SockLeft","Group":"HeavyMaidKnight_SockLeft","Color":"#ffffff","Lost":false},{"Item":"HeavyMaidKnight_SockRight","Group":"HeavyMaidKnight_SockRight","Color":"#ffffff","Lost":false}], + + Nara: [{"Item":"TransparentCatsuitUpperCropped","Group":"TransparentCatsuitUpperCropped","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":1,"blue":2.8000000000000003,"alpha":0.2},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}}},{"Item":"TransparentCatsuitLowerLowRise","Group":"TransparentCatsuitLowerLowRise","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333},"TorsoLower":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":0.7058823529411765,"blue":2.8000000000000003,"alpha":0.2},"TorsoLowerLowRise":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.6470588235294117,"green":1.3333333333333333,"blue":2.1372549019607843,"alpha":1.4333333333333333}}},{"Item":"LeatherLeotard","Group":"LeatherLeotard","Color":"#ffffff","Lost":false,"Filters":{"Leather":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.8999999999999999},"Corset":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":1.3333333333333333,"blue":2.8000000000000003,"alpha":0.8},"Laces":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.6470588235294117,"green":1.3333333333333333,"blue":2.1372549019607843,"alpha":0}}},{"Item":"LatexBra","Group":"LatexBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.6470588235294117,"green":1.3333333333333333,"blue":2.1372549019607843,"alpha":1}}},{"Item":"RobeSleeves","Group":"RobeSleeves","Color":"#ffffff","Lost":false,"Filters":{"SleeveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":1.3333333333333333,"blue":2.8000000000000003,"alpha":0.7000000000000001},"SleeveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":1.3333333333333333,"blue":2.8000000000000003,"alpha":0.7000000000000001}}},{"Item":"ElfPanties","Group":"ElfPanties","Color":"#ffffff","Lost":false,"Filters":{"Panties":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5,"green":0.5,"blue":0.5,"alpha":1}}},{"Item":"DressSkirtSplit","Group":"DressSkirtSplit","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5,"green":0.5,"blue":0.5,"alpha":0.7000000000000001},"SkirtBack":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":1.3333333333333333,"blue":2.8000000000000003,"alpha":0.2}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"DragonCollar","Group":"DragonCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ElfCirclet","Group":"ElfCirclet","Color":"#ffffff","Lost":false,"Filters":{"Circlet":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Gem":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.3333333333333333,"green":1.3333333333333333,"blue":2.5,"alpha":1}}},{"Item":"NinjaKneeLeft","Group":"NinjaKneeLeft","Color":"#ffffff","Lost":false,"Filters":{"KneeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5,"green":0.5,"blue":0.5,"alpha":1}}},{"Item":"NinjaSockLeft","Group":"NinjaSockLeft","Color":"#ffffff","Lost":false,"Filters":{"SockLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1,"green":1.1,"blue":1.1,"alpha":1}}},{"Item":"PlateBoots","Group":"PlateBoots","Color":"#ffffff","Lost":false,"Filters":{"BootRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.2,"green":0.2,"blue":0.2,"alpha":1},"BootLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.6470588235294117,"green":1.3333333333333333,"blue":2.1372549019607843,"alpha":0}}},{"Item":"MaidSockRight","Group":"MaidSockRight","Color":"#ffffff","Lost":false,"Filters":{"SockRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":1.3333333333333333,"blue":2.8000000000000003,"alpha":1},"StripeSockRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.3,"green":0.3,"blue":0.3,"alpha":1}},"Properties":{}},{"Item":"DivineCuffsThighRight","Group":"DivineCuffsThighRight","Color":"#ffffff","Lost":false,"Filters":{"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"LockPlate":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"LockBand":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"Band":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5,"green":0.5,"blue":0.5,"alpha":1},"BaseMetal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.3,"green":0.3,"blue":0.3,"alpha":1}}},{"Item":"DivineCuffsAnklesRight","Group":"DivineCuffsAnklesRight","Color":"#ffffff","Lost":false,"Filters":{"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.05,"green":1,"blue":1,"alpha":0},"LockPlate":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.3833333333333333,"green":1,"blue":1,"alpha":0},"LockBand":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":3.65,"blue":1.2833333333333332,"alpha":0},"Band":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5,"green":0.5,"blue":0.5,"alpha":1},"BaseMetal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.3,"green":0.3,"blue":0.3,"alpha":1}}},{"Item":"DivineCuffsWristLeft","Group":"DivineCuffsWristLeft","Color":"#ffffff","Lost":false,"Filters":{"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"LockPlate":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"LockBand":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"Band":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5166666666666666,"green":0.5,"blue":0.5,"alpha":1},"BaseMetal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.3,"green":0.3,"blue":0.3,"alpha":1}}},{"Item":"Gauntlets","Group":"Gauntlets","Color":"#ffffff","Lost":false,"Filters":{"GauntletLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.3,"green":0.3,"blue":0.3,"alpha":1},"GauntletRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}}], + Melissa: [{"Item":"LacePanties","Group":"LacePanties","Color":"#ffffff","Lost":false,"Filters":{"LaceCrotchPanel":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.7166666666666666,"green":0.5833333333333334,"blue":4.983333333333333,"alpha":1},"Panties":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.7166666666666666,"green":0.5833333333333334,"blue":4.983333333333333,"alpha":1},"Trim":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.7166666666666666,"green":0.5833333333333334,"blue":4.983333333333333,"alpha":1},"Lace":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":4.983333333333333,"green":4.983333333333333,"blue":4.983333333333333,"alpha":1}}},{"Item":"StockingLeft","Group":"StockingLeft","Color":"#ffffff","Lost":false,"Filters":{"SockLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.6,"red":5,"green":4.966666666666667,"blue":4.983333333333333,"alpha":1},"StripeSockRight":{"gamma":1,"saturation":2.9833333333333334,"contrast":1,"brightness":0.8666666666666667,"red":3.3833333333333333,"green":4.966666666666667,"blue":4.983333333333333,"alpha":1},"StripeSockLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.9833333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"StockingRight","Group":"StockingRight","Color":"#ffffff","Lost":false,"Filters":{"SockRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.6,"red":5,"green":4.966666666666667,"blue":4.983333333333333,"alpha":1},"StripeSockRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.15,"red":5,"green":4.966666666666667,"blue":4.983333333333333,"alpha":1}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.13333333333333333,"red":4.883333333333334,"green":4.983333333333333,"blue":4.95,"alpha":1}}},{"Item":"DressBlouseSleeves","Group":"DressBlouseSleeves","Color":"#ffffff","Lost":false,"Filters":{"BlouseArmLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.7166666666666666,"green":0.5833333333333334,"blue":4.983333333333333,"alpha":1},"SleeveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.75,"green":0.5833333333333334,"blue":4.983333333333333,"alpha":1},"SleeveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.75,"green":0.5833333333333334,"blue":4.983333333333333,"alpha":1}}},{"Item":"SportsBra","Group":"SportsBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.7166666666666667,"red":5,"green":4.966666666666667,"blue":4.983333333333333,"alpha":1}}},{"Item":"MaidBlouse","Group":"MaidBlouse","Color":"#ffffff","Lost":false,"Filters":{"Blouse":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.75,"green":0.5833333333333334,"blue":4.983333333333333,"alpha":1}}},{"Item":"BanditChoker","Group":"BanditChoker","Color":"#ffffff","Lost":false,"Filters":{"Choker":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1,"alpha":1}}}], + MelissaBound: [{"Item":"LacePanties","Group":"LacePanties","Color":"#ffffff","Lost":false,"Filters":{"LaceCrotchPanel":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.7166666666666666,"green":0.5833333333333334,"blue":4.983333333333333,"alpha":1},"Panties":{"gamma":1,"saturation":1,"contrast":1,"brightness":2.833333333333333,"red":0.5666666666666667,"green":0.5833333333333334,"blue":4.983333333333333,"alpha":1},"Trim":{"gamma":1,"saturation":1,"contrast":1,"brightness":2.833333333333333,"red":0.5666666666666667,"green":0.5833333333333334,"blue":4.983333333333333,"alpha":1},"Lace":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":4.983333333333333,"green":4.983333333333333,"blue":4.983333333333333,"alpha":1}}},{"Item":"StockingLeft","Group":"StockingLeft","Color":"#ffffff","Lost":false,"Filters":{"SockLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.6,"red":5,"green":4.966666666666667,"blue":4.983333333333333,"alpha":1},"StripeSockRight":{"gamma":1,"saturation":2.9833333333333334,"contrast":1,"brightness":0.8666666666666667,"red":3.3833333333333333,"green":4.966666666666667,"blue":4.983333333333333,"alpha":1},"StripeSockLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.9833333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"StockingRight","Group":"StockingRight","Color":"#ffffff","Lost":false,"Filters":{"SockRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.6,"red":5,"green":4.966666666666667,"blue":4.983333333333333,"alpha":1},"StripeSockRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.15,"red":5,"green":4.966666666666667,"blue":4.983333333333333,"alpha":1}}},{"Item":"SportsBra","Group":"SportsBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.7166666666666667,"red":5,"green":4.966666666666667,"blue":4.983333333333333,"alpha":1}}},{"Item":"BanditChoker","Group":"BanditChoker","Color":"#ffffff","Lost":false,"Filters":{"Choker":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1,"alpha":1}}}], + Myrtrice: [{"Item":"VBikini","Group":"VBikini","Color":"#ffffff","Lost":false,"Filters":{"VBikini":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.5,"green":0.4,"blue":0.4,"alpha":1}}},{"Item":"MaidShoes","Group":"MaidShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.4,"red":0.5294117647058824,"green":0.5098039215686274,"blue":0.5098039215686274,"alpha":1},"ShoeRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.3833333333333333,"red":0.5294117647058824,"green":0.5098039215686274,"blue":0.5098039215686274,"alpha":1}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":0.5333333333333333,"green":0.5,"blue":0.5,"alpha":1}}},{"Item":"MaidSockLeft","Group":"MaidSockLeft","Color":"#ffffff","Lost":false,"Filters":{"SockLeft":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1,"red":4.216666666666667,"green":4.3,"blue":4.266666666666667,"alpha":1},"SockRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":4.392156862745098,"green":4.431372549019608,"blue":4.431372549019608,"alpha":1},"StripeSockLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.41666666666666663,"green":0.3666666666666667,"blue":0.3833333333333333,"alpha":1}}},{"Item":"MaidSockRight","Group":"MaidSockRight","Color":"#ffffff","Lost":false,"Filters":{"SockRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1,"red":4.216666666666667,"green":4.266666666666667,"blue":4.266666666666667,"alpha":1},"StripeSockRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.3666666666666667,"green":0.3666666666666667,"blue":0.4,"alpha":1}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"BandRight":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":3.433333333333333,"green":3,"blue":0.08333333333333333,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.9166666666666666,"red":0.5294117647058824,"green":0.5098039215686274,"blue":0.5098039215686274,"alpha":1},"RimRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.9,"green":2.2333333333333334,"blue":0,"alpha":1},"GloveLeft":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":2.0666666666666664,"red":0.5294117647058824,"green":0.5098039215686274,"blue":0.5098039215686274,"alpha":1},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":2.0833333333333335,"red":0.5294117647058824,"green":0.5098039215686274,"blue":0.5098039215686274,"alpha":1},"RimLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.2,"red":0.5294117647058824,"green":0.5098039215686274,"blue":0.5098039215686274,"alpha":1}}},{"Item":"BowCorsetBust","Group":"BowCorsetBust","Color":"#ffffff","Lost":false,"Filters":{"BowCorsetBust":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":0,"blue":1,"alpha":1},"CorsetBust":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.6666666666666666,"green":0.2,"blue":0.8166666666666667,"alpha":1},"RuffleBust":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.6833333333333333,"green":0.21666666666666667,"blue":0.8333333333333333,"alpha":1}}},{"Item":"SportsBra","Group":"SportsBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":1.6333333333333333,"red":2.9833333333333334,"green":0.4,"blue":3.7,"alpha":1}}},{"Item":"ElfCollar","Group":"ElfCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.6833333333333333,"red":0.44999999999999996,"green":0.4,"blue":0.41666666666666663,"alpha":1}}},{"Item":"FashionLeatherBelt","Group":"FashionLeatherBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5294117647058824,"green":0.5098039215686274,"blue":0.5098039215686274,"alpha":1},"Band":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.6666666666666666,"red":0.5,"green":0.55,"blue":0.55,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.7,"green":2.2333333333333334,"blue":0.2833333333333333,"alpha":1},"Cuff":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.75,"red":0.5294117647058824,"green":0.5098039215686274,"blue":0.5098039215686274,"alpha":1},"Collar":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.5294117647058824,"green":0.5098039215686274,"blue":0.5098039215686274,"alpha":1}}},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false,"Filters":{"WitchHat":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.1666666666666667,"red":0.5294117647058824,"green":0.5098039215686274,"blue":0.5098039215686274,"alpha":1},"WitchHatBack":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.9333333333333333,"red":0.5294117647058824,"green":0.5098039215686274,"blue":0.5098039215686274,"alpha":1}}}], + Viola: [{"Item":"Stockings","Group":"Stockings","Color":"#ffffff","Lost":false,"Filters":{"SockRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.6,"red":2.683333333333333,"green":1.0666666666666667,"blue":3.5833333333333335,"alpha":1},"SockLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.6,"red":2.683333333333333,"green":1.0666666666666667,"blue":3.5833333333333335,"alpha":1}}},{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1.35,"saturation":0,"contrast":1.35,"brightness":2.4166666666666665,"red":0.15,"green":0.5666666666666667,"blue":3.95,"alpha":1},"ShoeRight":{"gamma":1.35,"saturation":0,"contrast":1.35,"brightness":2.4166666666666665,"red":0.15,"green":0.5666666666666667,"blue":3.95,"alpha":1}}},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false,"Filters":{"WitchHat":{"gamma":1.1333333333333333,"saturation":0.016666666666666666,"contrast":1,"brightness":0.3833333333333333,"red":3.333333333333333,"green":1.25,"blue":4.699999999999999,"alpha":1},"WitchHatBack":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.41666666666666663,"red":1.7999999999999998,"green":1,"blue":1.85,"alpha":1}}},{"Item":"RobeSleeves","Group":"RobeSleeves","Color":"#ffffff","Lost":false,"Filters":{"SleeveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.6,"red":2.683333333333333,"green":1.0666666666666667,"blue":3.5833333333333335,"alpha":1},"SleeveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.6,"red":2.683333333333333,"green":1.0666666666666667,"blue":3.5833333333333335,"alpha":1}}},{"Item":"RobeSkirt","Group":"RobeSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1.0333333333333332,"saturation":0,"contrast":1,"brightness":0.6,"red":2.683333333333333,"green":1.0666666666666667,"blue":3.5833333333333335,"alpha":1}}},{"Item":"ClothBelt","Group":"ClothBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1.1666666666666667,"saturation":0,"contrast":1,"brightness":0.6,"red":2.683333333333333,"green":1.0666666666666667,"blue":3.5833333333333335,"alpha":1}}},{"Item":"ClothTop","Group":"ClothTop","Color":"#ffffff","Lost":false,"Filters":{"TopChest":{"gamma":0.7000000000000001,"saturation":0.016666666666666666,"contrast":1,"brightness":0.3833333333333333,"red":1.2833333333333332,"green":0.8,"blue":3.1666666666666665,"alpha":1.1333333333333333},"Base":{"gamma":1.3,"saturation":0,"contrast":1,"brightness":0.6,"red":2.683333333333333,"green":1.0666666666666667,"blue":3.5833333333333335,"alpha":1},"Shoulders":{"gamma":1.3,"saturation":0,"contrast":1,"brightness":0.6,"red":2.683333333333333,"green":1.0666666666666667,"blue":3.5833333333333335,"alpha":1}}},{"Item":"Cape","Group":"Cape","Color":"#ffffff","Lost":false,"Filters":{"Front":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.6,"red":0.6833333333333333,"green":0.35000000000000003,"blue":0.9666666666666667,"alpha":1},"Back":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.6,"red":0.6862745098039216,"green":0.3529411764705882,"blue":0.9607843137254902,"alpha":1}}},{"Item":"StrappyBra","Group":"StrappyBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":0.3833333333333333,"red":3,"green":2.183333333333333,"blue":4.35,"alpha":1.1333333333333333}}},{"Item":"StrappyBikini","Group":"StrappyBikini","Color":"#ffffff","Lost":false,"Filters":{"StrappyLower":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":0.3833333333333333,"red":3,"green":2.183333333333333,"blue":4.35,"alpha":1.1333333333333333}}}], + + + "AdventurerDom": [{"Item":"ChainSkirt","Group":"ChainSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":0.6666666666666666,"saturation":1,"contrast":1,"brightness":1.2666666666666668,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"PlateBoots","Group":"PlateBoots","Color":"#ffffff","Lost":false,"Filters":{"BootLeft":{"gamma":0.6666666666666666,"saturation":1,"contrast":1,"brightness":1.2666666666666668,"red":1,"green":1,"blue":1,"alpha":1},"BootRight":{"gamma":0.6666666666666666,"saturation":1,"contrast":1,"brightness":1.2666666666666668,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"DressSkirtSplit","Group":"DressSkirtSplit","Color":"#ffffff","Lost":false,"Filters":{"SkirtBack":{"gamma":1,"saturation":0.9333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"Skirt":{"gamma":1,"saturation":0.06666666666666667,"contrast":1.0666666666666667,"brightness":0.65,"red":1.4333333333333333,"green":0.3833333333333333,"blue":0.3833333333333333,"alpha":0.8833333333333333}}},{"Item":"CatsuitLowerLowRise","Group":"CatsuitLowerLowRise","Color":"#ffffff","Lost":false,"Filters":{"TorsoLowerLowRise":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.7166666666666666,"green":1,"blue":1,"alpha":1},"TorsoLower":{"gamma":1,"saturation":0.11666666666666667,"contrast":1,"brightness":1.7833333333333334,"red":2.283333333333333,"green":0.44999999999999996,"blue":0.41666666666666663,"alpha":1}}},{"Item":"BunnyLeotardHighUnder","Group":"BunnyLeotardHighUnder","Color":"#ffffff","Lost":false,"Filters":{"HighLeotard":{"gamma":1,"saturation":0.44999999999999996,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.2833333333333332,"alpha":1},"Leotard":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.2833333333333332,"alpha":1}}},{"Item":"Breastplate","Group":"Breastplate","Color":"#ffffff","Lost":false,"Filters":{"Breastplate":{"gamma":0.6666666666666666,"saturation":1,"contrast":1,"brightness":1.2666666666666668,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ClothCollarTag","Group":"ClothCollarTag","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.0666666666666667,"brightness":2.15,"red":1.4333333333333333,"green":0.3833333333333333,"blue":0.3833333333333333,"alpha":1},"CollarTag":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1.6666666666666665}}},{"Item":"CatsuitTopV","Group":"CatsuitTopV","Color":"#ffffff","Lost":false,"Filters":{"Latex":{"gamma":1,"saturation":0.11666666666666667,"contrast":1,"brightness":1.7833333333333334,"red":2.283333333333333,"green":0.44999999999999996,"blue":0.41666666666666663,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}},{"Item":"FashionCuffsWrists","Group":"FashionCuffsWrists","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.11666666666666667,"contrast":1,"brightness":0.48333333333333334,"red":2.283333333333333,"green":0.44999999999999996,"blue":0.41666666666666663,"alpha":1}}},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.1,"red":1,"green":1,"blue":1,"alpha":1},"BandRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.1,"red":1,"green":1,"blue":1,"alpha":1}}}], + "AdventurerSwitch": [{"Item":"Cape","Group":"Cape","Color":"#ffffff","Lost":false,"Filters":{"Back":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"Front":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.3666666666666667,"red":1.9500000000000002,"green":0.5166666666666666,"blue":0.43333333333333335,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.16666666666666666,"contrast":0.9833333333333333,"brightness":1.85,"red":1.7166666666666666,"green":1.7000000000000002,"blue":1.7333333333333334,"alpha":1}}},{"Item":"BalletHeels","Group":"BalletHeels","Color":"#ffffff","Lost":false,"Filters":{"Shoe":{"gamma":0.8,"saturation":0.6,"contrast":0.9333333333333333,"brightness":0.7333333333333334,"red":0.13333333333333333,"green":0.11666666666666667,"blue":0.13333333333333333,"alpha":0.9333333333333333},"Sole":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.48333333333333334,"red":1,"green":1,"blue":1,"alpha":1},"Laces":{"gamma":1,"saturation":0.3333333333333333,"contrast":1,"brightness":2.216666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionLeatherCollarBell","Group":"FashionLeatherCollarBell","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.2666666666666668,"red":2.033333333333333,"green":2.0833333333333335,"blue":2.0166666666666666,"alpha":1}}},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":2.15,"red":2.033333333333333,"green":2.0833333333333335,"blue":2.0166666666666666,"alpha":1}}},{"Item":"FashionCuffsWrists","Group":"FashionCuffsWrists","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.7999999999999998,"red":2.033333333333333,"green":2.0833333333333335,"blue":2.0166666666666666,"alpha":1}}},{"Item":"DressBlouseBust","Group":"DressBlouseBust","Color":"#ffffff","Lost":false,"Filters":{"Blouse":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.5666666666666667,"red":0.2,"green":0.2,"blue":0.2,"alpha":1},"BlouseSkirt":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.3666666666666667,"red":1.9500000000000002,"green":0.5166666666666666,"blue":0.43333333333333335,"alpha":0},"Collar":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.8500000000000001,"red":1.1333333333333333,"green":1.1333333333333333,"blue":0.8166666666666667,"alpha":0},"Neck":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.8500000000000001,"red":1.1333333333333333,"green":1.1333333333333333,"blue":0.8166666666666667,"alpha":0}}},{"Item":"ElfBra","Group":"ElfBra","Color":"#ffffff","Lost":false,"Filters":{"Chest":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1.4333333333333333,"green":1.4833333333333334,"blue":1,"alpha":1},"Cloth":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.7666666666666666,"red":1.4333333333333333,"green":1.4833333333333334,"blue":1,"alpha":1}}},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":0.3666666666666667,"green":0.35000000000000003,"blue":0.43333333333333335,"alpha":1}}},{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.6500000000000001,"red":1.9500000000000002,"green":0.5166666666666666,"blue":0.43333333333333335,"alpha":1},"Stripe":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1.8666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}}], + "AdventurerSub": [{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandRight":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5833333333333334,"red":1,"green":1.9500000000000002,"blue":1,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5833333333333334,"red":1,"green":1.9500000000000002,"blue":1,"alpha":1}}},{"Item":"ElfSkirt","Group":"ElfSkirt","Color":"#ffffff","Lost":false,"Filters":{"SkirtBack":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.05,"red":0.2833333333333333,"green":0.26666666666666666,"blue":0.48333333333333334,"alpha":1},"SkirtBand":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5833333333333334,"red":1,"green":1.9500000000000002,"blue":1,"alpha":1},"Skirt":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.05,"red":0.2833333333333333,"green":0.26666666666666666,"blue":0.48333333333333334,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333}}},{"Item":"ElfTop","Group":"ElfTop","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.05,"red":0.2833333333333333,"green":0.26666666666666666,"blue":0.48333333333333334,"alpha":1}}},{"Item":"ElfCollar","Group":"ElfCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5833333333333334,"red":1,"green":1.9500000000000002,"blue":1,"alpha":1}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.3,"brightness":1.2,"red":1.6500000000000001,"green":2.2941176470588234,"blue":1.4313725490196079,"alpha":1}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.8833333333333333,"red":0.95,"green":0.6333333333333334,"blue":0.5,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1,"red":0.95,"green":0.6333333333333334,"blue":0.5,"alpha":1}}},{"Item":"ElfPanties","Group":"ElfPanties","Color":"#ffffff","Lost":false}], + "AdventurerBrat": [{"Item":"ChainBikini","Group":"ChainBikini","Color":"#ffffff","Lost":false},{"Item":"Pauldrons","Group":"Pauldrons","Color":"#ffffff","Lost":false},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.05,"contrast":1.1666666666666667,"brightness":3.1,"red":2.25,"green":2.3000000000000003,"blue":2.25,"alpha":1}}},{"Item":"MaidBlouse","Group":"MaidBlouse","Color":"#ffffff","Lost":false,"Filters":{"Blouse":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":0.3833333333333333,"red":1.6500000000000001,"green":0.9166666666666666,"blue":0.5666666666666667,"alpha":1}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.45,"red":1.2166666666666668,"green":0.3833333333333333,"blue":0.55,"alpha":1}}},{"Item":"WarriorBoots","Group":"WarriorBoots","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.45,"red":1.2166666666666668,"green":0.3833333333333333,"blue":0.55,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.45,"red":1.2166666666666668,"green":0.3833333333333333,"blue":0.55,"alpha":1}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.8833333333333333,"red":1.2166666666666668,"green":0.3833333333333333,"blue":0.55,"alpha":1},"GloveRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.8833333333333333,"red":1.2166666666666668,"green":0.3833333333333333,"blue":0.55,"alpha":1},"BandRight":{"gamma":1,"saturation":0.05,"contrast":1.4333333333333333,"brightness":1.6333333333333333,"red":1.2666666666666668,"green":1.2666666666666668,"blue":1.2833333333333332,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.05,"contrast":1.4333333333333333,"brightness":1.0833333333333335,"red":1.2666666666666668,"green":1.2666666666666668,"blue":1.2833333333333332,"alpha":1},"RimLeft":{"gamma":1,"saturation":0.05,"contrast":1.4333333333333333,"brightness":1.3,"red":1.2666666666666668,"green":1.2666666666666668,"blue":1.2833333333333332,"alpha":1},"RimRight":{"gamma":1,"saturation":0.05,"contrast":1.4333333333333333,"brightness":1.4333333333333333,"red":1.2666666666666668,"green":1.2666666666666668,"blue":1.2833333333333332,"alpha":1}}},{"Item":"CatsuitLower","Group":"CatsuitLower","Color":"#ffffff","Lost":false,"Filters":{"TorsoLower":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7833333333333334,"alpha":1}}},{"Item":"CatsuitTop","Group":"CatsuitTop","Color":"#ffffff","Lost":false,"Filters":{"Latex":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7833333333333334,"alpha":1}}},{"Item":"FashionLeatherCollar","Group":"FashionLeatherCollar","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.8500000000000001,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.8500000000000001,"red":1,"green":1,"blue":1,"alpha":1}}}], + + "DragonCrystal": [{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05}}},{"Item":"ElfCirclet","Group":"ElfCirclet","Color":"#ffffff","Lost":false,"Filters":{"Circlet":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":1.1666666666666667,"red":0.6333333333333334,"green":2.033333333333333,"blue":1.5166666666666666,"alpha":0.65},"Gem":{"gamma":1,"saturation":0,"contrast":1.0166666666666666,"brightness":1.1666666666666667,"red":1.3166666666666664,"green":0.8,"blue":1.0833333333333335,"alpha":1}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":1.75,"red":0.6333333333333334,"green":2.033333333333333,"blue":1.5166666666666666,"alpha":0.6333333333333334}}},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":1.4333333333333333,"red":0.6333333333333334,"green":2.033333333333333,"blue":1.5166666666666666,"alpha":0.6333333333333334},"Runes":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.2,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0,"contrast":1.0166666666666666,"brightness":1.5166666666666666,"red":1.3166666666666664,"green":0.8,"blue":1.0833333333333335,"alpha":0.95}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":1.75,"red":0.6333333333333334,"green":2.033333333333333,"blue":1.5166666666666666,"alpha":0.5}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0,"contrast":0.6333333333333334,"brightness":2.033333333333333,"red":0.5,"green":1.5333333333333332,"blue":1.5166666666666666,"alpha":0.5166666666666666}}},{"Item":"ChainBikini","Group":"ChainBikini","Color":"#ffffff","Lost":false,"Filters":{"Bikini":{"gamma":1,"saturation":0,"contrast":1.4000000000000001,"brightness":1.1666666666666667,"red":0.5,"green":1.5333333333333332,"blue":1.5166666666666666,"alpha":0.6666666666666666}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1.0166666666666666,"brightness":0.9833333333333333,"red":1.3166666666666664,"green":0.8,"blue":1.0833333333333335,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1.0166666666666666,"brightness":0.9833333333333333,"red":1.3166666666666664,"green":0.8,"blue":1.0833333333333335,"alpha":1},"CrystalShoeLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.0833333333333335,"red":0.6333333333333334,"green":2.033333333333333,"blue":1.5166666666666666,"alpha":0.5},"CrystalShoeRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.0833333333333335,"red":0.6333333333333334,"green":2.033333333333333,"blue":1.5166666666666666,"alpha":0.5}}},{"Item":"FashionShacklesThigh","Group":"FashionShacklesThigh","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":1.75,"red":0.6333333333333334,"green":2.033333333333333,"blue":1.5166666666666666,"alpha":0.6333333333333334}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":0.6666666666666666,"brightness":0.9333333333333333,"red":2.166666666666667,"green":1.0588235294117647,"blue":1.5166666666666666,"alpha":1}}}], + "DragonLeader": [{"Item":"Dragonheart","Group":"Dragonheart","Color":"#ffffff","Lost":false},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":0},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":0},"BandRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":1.1500000000000001,"brightness":1,"red":2.283333333333333,"green":1.35,"blue":0.08333333333333333,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":1.1500000000000001,"brightness":1,"red":2.283333333333333,"green":1.35,"blue":0.08333333333333333,"alpha":1},"RimLeft":{"gamma":1,"saturation":0.26666666666666666,"contrast":1,"brightness":0.2833333333333333,"red":2.816666666666667,"green":1.2666666666666668,"blue":0.3,"alpha":1},"RimRight":{"gamma":1,"saturation":0.26666666666666666,"contrast":1,"brightness":0.2833333333333333,"red":2.816666666666667,"green":1.2666666666666668,"blue":0.3,"alpha":1}}},{"Item":"ElfCirclet","Group":"ElfCirclet","Color":"#ffffff","Lost":false,"Filters":{"Circlet":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1,"red":2,"green":1,"blue":1,"alpha":1},"Gem":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":1,"red":1,"green":2.6500000000000004,"blue":1,"alpha":1}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1,"red":2.6500000000000004,"green":1.7333333333333334,"blue":0.8166666666666667,"alpha":1}}}], + "Dragon": [{"Item":"Dragonheart","Group":"Dragonheart","Color":"#ffffff","Lost":false},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":0},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":0},"BandRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":1.1500000000000001,"brightness":1,"red":2.283333333333333,"green":1.35,"blue":0.08333333333333333,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":1.1500000000000001,"brightness":1,"red":2.283333333333333,"green":1.35,"blue":0.08333333333333333,"alpha":1},"RimLeft":{"gamma":1,"saturation":0.26666666666666666,"contrast":1,"brightness":0.2833333333333333,"red":2.816666666666667,"green":1.2666666666666668,"blue":0.3,"alpha":1},"RimRight":{"gamma":1,"saturation":0.26666666666666666,"contrast":1,"brightness":0.2833333333333333,"red":2.816666666666667,"green":1.2666666666666668,"blue":0.3,"alpha":1}}}], + "DragonShield": [{"Item":"Dragonheart","Group":"Dragonheart","Color":"#ffffff","Lost":false},{"Item":"DragonArmband","Group":"DragonArmband","Color":"#ffffff","Lost":false},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1,"red":2.6500000000000004,"green":1.7333333333333334,"blue":0.8166666666666667,"alpha":1}}},{"Item":"Gauntlets","Group":"Gauntlets","Color":"#ffffff","Lost":false,"Filters":{"GauntletRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.5333333333333332,"brightness":0.5833333333333334,"red":2.6500000000000004,"green":1.4333333333333333,"blue":0.8166666666666667,"alpha":1},"GauntletLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.5333333333333332,"brightness":0.5833333333333334,"red":2.6500000000000004,"green":1.4333333333333333,"blue":0.8166666666666667,"alpha":1}}},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.5333333333333332,"brightness":0.44999999999999996,"red":2.6500000000000004,"green":1.6500000000000001,"blue":0.8166666666666667,"alpha":1},"BandRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.5333333333333332,"brightness":0.44999999999999996,"red":2.6500000000000004,"green":1.6500000000000001,"blue":0.8166666666666667,"alpha":1}}},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.5333333333333332,"brightness":0.5666666666666667,"red":2.6500000000000004,"green":1.6500000000000001,"blue":0.8166666666666667,"alpha":1},"Runes":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.5333333333333332,"brightness":0.2,"red":2.6500000000000004,"green":1.6500000000000001,"blue":0.8166666666666667,"alpha":1}}},{"Item":"ChainBikini","Group":"ChainBikini","Color":"#ffffff","Lost":false,"Filters":{"Bikini":{"gamma":1,"saturation":0.016666666666666666,"contrast":2.3499999999999996,"brightness":0.5833333333333334,"red":2.6500000000000004,"green":1.6500000000000001,"blue":0.8166666666666667,"alpha":1}}}], + "DragonIce": [{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05}}},{"Item":"ElfCirclet","Group":"ElfCirclet","Color":"#ffffff","Lost":false,"Filters":{"Circlet":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.4166666666666665,"red":0.6470588235294118,"green":1.0166666666666666,"blue":1.8235294117647058,"alpha":1.0166666666666666},"Gem":{"gamma":1,"saturation":0,"contrast":1.2666666666666668,"brightness":1.7000000000000002,"red":0.5666666666666667,"green":0.6666666666666666,"blue":1,"alpha":1}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":2.8000000000000003,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6470588235294118,"green":1.8235294117647058,"blue":1.8235294117647058,"alpha":0.3166666666666667},"Runes":{"gamma":1,"saturation":0,"contrast":2.48,"brightness":1,"red":0,"green":0.11764705882352941,"blue":3.843137254901961,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0,"contrast":0.6666666666666666,"brightness":2.3833333333333333,"red":0.5666666666666667,"green":0.6666666666666666,"blue":1,"alpha":0.8166666666666667}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0,"contrast":0.6333333333333334,"brightness":3.033333333333333,"red":0.5,"green":1.1,"blue":1.7833333333333334,"alpha":0.5166666666666666}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":0.6666666666666666,"brightness":1.05,"red":0.5666666666666667,"green":0.6666666666666666,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":0.6666666666666666,"brightness":1.05,"red":0.5666666666666667,"green":0.6666666666666666,"blue":1,"alpha":1},"CrystalShoeLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.0833333333333335,"red":0.6333333333333334,"green":2.033333333333333,"blue":1.5166666666666666,"alpha":0.5},"CrystalShoeRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.0833333333333335,"red":0.6333333333333334,"green":2.033333333333333,"blue":1.5166666666666666,"alpha":0.5}}},{"Item":"FashionShacklesThigh","Group":"FashionShacklesThigh","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":2.8000000000000003,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":0.6666666666666666,"brightness":1.5333333333333332,"red":0.5666666666666667,"green":0.6666666666666666,"blue":1,"alpha":1}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":3.35,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"ChainBikini","Group":"ChainBikini","Color":"#ffffff","Lost":false,"Filters":{"Bikini":{"gamma":1,"saturation":0,"contrast":1.4000000000000001,"brightness":1.75,"red":0.5,"green":0.9333333333333333,"blue":1.5166666666666666,"alpha":0.6666666666666666}}}], + "DragonPoison": [{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"StripeSockRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"StripeSockLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"SockRight":{"gamma":1,"saturation":0.3333333333333333,"contrast":1,"brightness":0.5,"red":1,"green":1.1666666666666667,"blue":1,"alpha":0.9166666666666666},"SockLeft":{"gamma":1,"saturation":0.3333333333333333,"contrast":1,"brightness":0.5,"red":1,"green":1.1666666666666667,"blue":1,"alpha":0.9166666666666666}}},{"Item":"BunnyGloves","Group":"BunnyGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0.3333333333333333,"contrast":1,"brightness":0.13333333333333333,"red":1,"green":1.1666666666666667,"blue":1,"alpha":0.9166666666666666},"GloveRight":{"gamma":1,"saturation":0.3333333333333333,"contrast":1,"brightness":0.13333333333333333,"red":1,"green":1.1666666666666667,"blue":1,"alpha":0.9166666666666666}}},{"Item":"SportsBra","Group":"SportsBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0.3333333333333333,"contrast":1,"brightness":0.5,"red":1,"green":1.1666666666666667,"blue":1,"alpha":0.9166666666666666}}},{"Item":"WarriorBustier","Group":"WarriorBustier","Color":"#ffffff","Lost":false,"Filters":{"Bustier":{"gamma":1,"saturation":0.5,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.5,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.5,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"WarriorBoots","Group":"WarriorBoots","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.5,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.5,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.3,"contrast":1.4166666666666665,"brightness":1.6,"red":1.7333333333333334,"green":1.45,"blue":1,"alpha":1}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.3,"contrast":1.4166666666666665,"brightness":1.6,"red":1.7333333333333334,"green":1.45,"blue":1,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0.13333333333333333,"contrast":1.4166666666666665,"brightness":0.9333333333333333,"red":1.7333333333333334,"green":1.45,"blue":1,"alpha":1}}},{"Item":"DragonCollar","Group":"DragonCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.13333333333333333,"contrast":1.4166666666666665,"brightness":0.9333333333333333,"red":1.7333333333333334,"green":1.45,"blue":1,"alpha":1}}}], + "DragonShadow": [{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05}}},{"Item":"FashionBlindfoldBasic","Group":"FashionBlindfoldBasic","Color":"#ffffff","Lost":false,"Filters":{"Blindfold":{"gamma":1,"saturation":0.16666666666666666,"contrast":2.15,"brightness":0.48333333333333334,"red":0.95,"green":1,"blue":1.2333333333333334,"alpha":1.0166666666666666}}},{"Item":"SportsBra","Group":"SportsBra","Color":"#ffffff","Lost":false},{"Item":"WarriorBustier","Group":"WarriorBustier","Color":"#ffffff","Lost":false,"Filters":{"Bustier":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":1.5666666666666669,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":1.5666666666666669,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":1.9333333333333333,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1}}},{"Item":"WarriorBoots","Group":"WarriorBoots","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":1.5666666666666669,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":1.5666666666666669,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1}}},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":1.5666666666666669,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1},"BandRight":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":1.5666666666666669,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1}}},{"Item":"DragonCollar","Group":"DragonCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":1.5666666666666669,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":1.5666666666666669,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":2.633333333333333,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1},"GloveRight":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":2.633333333333333,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1},"BandRight":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":0.7666666666666666,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":0.7666666666666666,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1},"RimLeft":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":0.7666666666666666,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1},"RimRight":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":0.7666666666666666,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"AnkleRight":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.2166666666666668,"brightness":1.5666666666666669,"red":0.48333333333333334,"green":0.44999999999999996,"blue":1,"alpha":1},"BaseMetal":{"gamma":1,"saturation":0.13333333333333333,"contrast":1.0666666666666667,"brightness":4.216666666666667,"red":0.48333333333333334,"green":0.35000000000000003,"blue":1,"alpha":1}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.13333333333333333,"contrast":1.0666666666666667,"brightness":4.216666666666667,"red":0.48333333333333334,"green":0.35000000000000003,"blue":1,"alpha":1}}}], + + Hilda: [{"Item":"FashionHarness","Group":"FashionHarness","Color":"#ffffff","Lost":false,"Filters":{"BeltsTop":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.5098039215686274,"green":0.29411764705882354,"blue":1.7058823529411764,"alpha":1},"Straps":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":3.5098039215686274,"green":0.6274509803921569,"blue":4.607843137254902,"alpha":1},"Hardware":{"gamma":1,"saturation":0,"contrast":1.27,"brightness":1,"red":1.6470588235294117,"green":2.0392156862745097,"blue":0,"alpha":1}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"StripeSockRight":{"gamma":1,"saturation":0,"contrast":0.8600000000000001,"brightness":1,"red":1.588235294117647,"green":0.9803921568627451,"blue":0.35294117647058826,"alpha":1},"StripeSockLeft":{"gamma":1,"saturation":0,"contrast":0.8600000000000001,"brightness":1,"red":1.588235294117647,"green":0.9803921568627451,"blue":0.35294117647058826,"alpha":1},"SockLeft":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":3.9215686274509802,"green":1.3137254901960784,"blue":3.392156862745098,"alpha":1},"SockRight":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":3.9215686274509802,"green":1.3137254901960784,"blue":3.392156862745098,"alpha":1}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.5686274509803921,"green":0.3137254901960784,"blue":1.6862745098039216,"alpha":0.2833333333333333},"TorsoLower":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.4901960784313726,"green":0.1568627450980392,"blue":1.8431372549019607,"alpha":0.2833333333333333}}},{"Item":"LatexBra","Group":"LatexBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":4.235294117647059,"green":2.0392156862745097,"blue":3.803921568627451,"alpha":1},"ChestHeavyCorset":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":3.9215686274509802,"green":1.3137254901960784,"blue":3.392156862745098,"alpha":1}}},{"Item":"LatexBraStraps","Group":"LatexBraStraps","Color":"#ffffff","Lost":false,"Filters":{"StrapsHeavyCorset":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.7333333333333334},"Straps":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":3.5098039215686274,"green":0.6274509803921569,"blue":4.607843137254902,"alpha":1}}},{"Item":"FashionCuffsThigh","Group":"FashionCuffsThigh","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0,"contrast":0.8600000000000001,"brightness":1,"red":2.9411764705882355,"green":1.7843137254901962,"blue":0.6470588235294118,"alpha":1}}},{"Item":"LatexBraStrapsCross","Group":"LatexBraStrapsCross","Color":"#ffffff","Lost":false,"Filters":{"Straps":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":3.5098039215686274,"green":0.6274509803921569,"blue":4.607843137254902,"alpha":1}}},{"Item":"FashionGagNecklace","Group":"FashionGagNecklace","Color":"#ffffff","Lost":false,"Filters":{"Ball":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":3.5098039215686274,"green":0.6274509803921569,"blue":4.607843137254902,"alpha":1}}},{"Item":"ElfCollar","Group":"ElfCollar","Color":"#ffffff","Lost":false,"Filters":{}},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false},{"Item":"WolfGloves","Group":"WolfGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":3.9215686274509802,"green":1.3137254901960784,"blue":3.392156862745098,"alpha":1},"GloveRight":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":3.9215686274509802,"green":1.3137254901960784,"blue":3.392156862745098,"alpha":1},"RimLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.2549019607843137,"green":0.29411764705882354,"blue":0.29411764705882354,"alpha":1},"RimRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.2549019607843137,"green":0.29411764705882354,"blue":0.29411764705882354,"alpha":1},"BandRight":{"gamma":1,"saturation":0,"contrast":0.8600000000000001,"brightness":1,"red":2.9411764705882355,"green":1.7843137254901962,"blue":0.6470588235294118,"alpha":1},"BandLeft":{"gamma":1,"saturation":0,"contrast":0.66,"brightness":1,"red":1.8627450980392157,"green":1.392156862745098,"blue":0.27450980392156865,"alpha":1}}},{"Item":"BalletHeels","Group":"BalletHeels","Color":"#ffffff","Lost":false,"Filters":{"Laces":{"gamma":1,"saturation":0,"contrast":0.8600000000000001,"brightness":1,"red":2.9411764705882355,"green":1.7843137254901962,"blue":0.6470588235294118,"alpha":1}}},{"Item":"ElfPanties","Group":"ElfPanties","Color":"#ffffff","Lost":false}], + Yuri: [{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1.0833333333333335,"red":0.8166666666666667,"green":0.8500000000000001,"blue":1.4833333333333334,"alpha":0.9833333333333333},"ShoeRight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1.0833333333333335,"red":0.8166666666666667,"green":0.8500000000000001,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.7000000000000001,"red":1.1500000000000001,"green":0.5666666666666667,"blue":1.4833333333333334,"alpha":0.9833333333333333},"BandRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.7000000000000001,"red":1.1500000000000001,"green":0.5666666666666667,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"Glasses","Group":"Glasses","Color":"#ffffff","Lost":false,"Filters":{"Lens":{"gamma":1,"saturation":0.16666666666666666,"contrast":1.02,"brightness":1,"red":1.0196078431372548,"green":1.0196078431372548,"blue":1.0196078431372548,"alpha":0.4}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1.0833333333333335,"red":0.8166666666666667,"green":0.8500000000000001,"blue":1.4833333333333334,"alpha":0.9833333333333333},"ShoeRight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1.0833333333333335,"red":0.8166666666666667,"green":0.8500000000000001,"blue":1.4833333333333334,"alpha":0.9833333333333333},"CrystalShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":2.7450980392156863,"green":1.0980392156862746,"blue":4.862745098039215,"alpha":1},"CrystalShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":2.7450980392156863,"green":1.0980392156862746,"blue":4.862745098039215,"alpha":1}}},{"Item":"LeatherLeotard","Group":"LeatherLeotard","Color":"#ffffff","Lost":false,"Filters":{"Leather":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":0.55,"red":0.3666666666666667,"green":0.3666666666666667,"blue":0.8166666666666667,"alpha":1},"Corset":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":0.55,"red":0.3666666666666667,"green":0.3666666666666667,"blue":0.8166666666666667,"alpha":1},"Laces":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":0.55,"red":0.3666666666666667,"green":0.3666666666666667,"blue":0.8166666666666667,"alpha":1}}},{"Item":"RobeSleeves","Group":"RobeSleeves","Color":"#ffffff","Lost":false,"Filters":{"SleeveLeft":{"gamma":1,"saturation":0,"contrast":1.01,"brightness":1,"red":0.9411764705882353,"green":0.3333333333333333,"blue":2.627450980392157,"alpha":0.5},"SleeveRight":{"gamma":1,"saturation":0,"contrast":1.01,"brightness":1,"red":0.9411764705882353,"green":0.3333333333333333,"blue":2.627450980392157,"alpha":0.5}}},{"Item":"GothicSkirtLace","Group":"GothicSkirtLace","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":0.55,"red":0.3666666666666667,"green":0.3666666666666667,"blue":0.8166666666666667,"alpha":1},"WaistbandClips":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":0.55,"red":0.3666666666666667,"green":0.3666666666666667,"blue":0.8166666666666667,"alpha":1},"Buttons":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":0.55,"red":0.3666666666666667,"green":0.3666666666666667,"blue":0.8166666666666667,"alpha":1},"Lines":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1,"red":0.3137254901960784,"green":0.3137254901960784,"blue":0.3137254901960784,"alpha":1},"HemLower":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1,"red":0.35294117647058826,"green":0.35294117647058826,"blue":0.6078431372549019,"alpha":0.9833333333333333},"HemUpper":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1,"red":0.35294117647058826,"green":0.37254901960784315,"blue":0.6470588235294118,"alpha":0.9833333333333333},"LaceLower":{"gamma":1,"saturation":0,"contrast":0.97,"brightness":1,"red":1.0588235294117647,"green":0.9215686274509803,"blue":1.0784313725490196,"alpha":1},"LaceUpper":{"gamma":1,"saturation":0,"contrast":0.97,"brightness":1,"red":1.0588235294117647,"green":0.9215686274509803,"blue":1.0784313725490196,"alpha":1}}}], + "ElementalAir": [{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.966666666666667,"red":1,"green":1,"blue":1.1666666666666667,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.966666666666667,"red":1,"green":1,"blue":1.1666666666666667,"alpha":0.05}}},{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.5166666666666666,"contrast":1.1500000000000001,"brightness":2.9499999999999997,"red":1,"green":1.6500000000000001,"blue":1.35,"alpha":0.9333333333333333},"Stripe":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1.4833333333333334,"alpha":1}}},{"Item":"RobeBra","Group":"RobeBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0.5166666666666666,"contrast":1.2333333333333334,"brightness":4.9,"red":1.1,"green":2.3833333333333333,"blue":1.4833333333333334,"alpha":0.7833333333333334}}},{"Item":"BanditChoker","Group":"BanditChoker","Color":"#ffffff","Lost":false,"Filters":{"Choker":{"gamma":1,"saturation":0.13333333333333333,"contrast":1.2333333333333334,"brightness":1.4333333333333333,"red":1.1,"green":2.3833333333333333,"blue":2.4166666666666665,"alpha":0.7833333333333334}}},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.5,"red":1.4166666666666665,"green":1.0833333333333335,"blue":0.7833333333333334,"alpha":0.9833333333333333},"ShoeRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.5,"red":1.4166666666666665,"green":1.0833333333333335,"blue":0.7833333333333334,"alpha":0.9833333333333333}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":2.816666666666667,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.5833333333333334}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":3,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.5666666666666667}}},{"Item":"FashionChastityBra","Group":"FashionChastityBra","Color":"#ffffff","Lost":false,"Filters":{"Metal":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0},"Lining":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0},"Lock":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0},"Chain":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":2.033333333333333,"red":1.9166666666666667,"green":1.0833333333333335,"blue":0.8166666666666667,"alpha":1}}}], + "ChainBeing": [{"Item":"FashionHarness","Group":"FashionHarness","Color":"#ffffff","Lost":false},{"Item":"FashionLeatherCollar","Group":"FashionLeatherCollar","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.44999999999999996,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.5666666666666667,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":3.8166666666666664,"red":1,"green":1,"blue":1,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.44999999999999996,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.5666666666666667,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":3.8166666666666664,"red":1,"green":1,"blue":1,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionCuffsThigh","Group":"FashionCuffsThigh","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.44999999999999996,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.5666666666666667,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":2.9,"red":1,"green":1,"blue":1,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"StripeSockRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666},"StripeSockLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666},"SockLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.3,"red":1,"green":1,"blue":1.0166666666666666,"alpha":0.65},"SockRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.3,"red":1,"green":1,"blue":1.0166666666666666,"alpha":0.65}}},{"Item":"FashionBlindfoldLeather","Group":"FashionBlindfoldLeather","Color":"#ffffff","Lost":false,"Filters":{"Blindfold":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":1,"red":0.6666666666666666,"green":0.5666666666666667,"blue":0.7666666666666666,"alpha":1.05},"Rim":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":2.033333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BalletHeels","Group":"BalletHeels","Color":"#ffffff","Lost":false,"Filters":{"Shoe":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.6333333333333334,"red":0.6666666666666666,"green":0.5666666666666667,"blue":0.7333333333333334,"alpha":1},"Laces":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.9500000000000002,"red":1,"green":1,"blue":1,"alpha":1},"Sole":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1.0833333333333335,"green":1,"blue":1.3,"alpha":0.9833333333333333}}},{"Item":"LatexBra","Group":"LatexBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.4333333333333333,"red":1,"green":1,"blue":1,"alpha":0.8}}},{"Item":"LatexBraStraps","Group":"LatexBraStraps","Color":"#ffffff","Lost":false,"Filters":{"StrapsHeavyCorset":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.4333333333333333,"red":1,"green":1,"blue":1,"alpha":0.8}}},{"Item":"WolfGloves","Group":"WolfGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0.3833333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":0.7833333333333334},"GloveRight":{"gamma":1,"saturation":0.3833333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":0.7833333333333334},"BandLeft":{"gamma":1,"saturation":0,"contrast":1.0166666666666666,"brightness":2.1333333333333333,"red":0.13333333333333333,"green":0.13333333333333333,"blue":0.13333333333333333,"alpha":1},"BandRight":{"gamma":1,"saturation":0,"contrast":1.0166666666666666,"brightness":2.1333333333333333,"red":0.13333333333333333,"green":0.13333333333333333,"blue":0.13333333333333333,"alpha":1},"RimLeft":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1},"RimRight":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":1.3166666666666664,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionCyberBelt","Group":"FashionCyberBelt","Color":"#ffffff","Lost":false,"Filters":{"Lining":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.13333333333333333,"red":1,"green":1,"blue":1,"alpha":0.6333333333333334},"Metal":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":1.3,"red":1,"green":1,"blue":1,"alpha":1},"Display":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"Plug":{"gamma":1,"saturation":1,"contrast":1,"brightness":2.6,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.55,"red":1,"green":1,"blue":1,"alpha":0.15},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.55,"red":1,"green":1,"blue":1,"alpha":0.15}}},{"Item":"FashionLeatherMittens","Group":"FashionLeatherMittens","Color":"#ffffff","Lost":false,"Filters":{"Mitten":{"gamma":0.2,"saturation":0.13333333333333333,"contrast":0.95,"brightness":0.3833333333333333,"red":0.65,"green":0.5666666666666667,"blue":0.7666666666666666,"alpha":1}}},{"Item":"FashionCuffsWrists","Group":"FashionCuffsWrists","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.44999999999999996,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.5666666666666667,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":3.8166666666666664,"red":1,"green":1,"blue":1,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}}], + "ElementalFire": [{"Item":"FashionLeatherCollar","Group":"FashionLeatherCollar","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.8833333333333333,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.8833333333333333,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":2.8000000000000003,"red":1.4333333333333333,"green":0.95,"blue":0.65,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.8833333333333333,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.8833333333333333,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":2.8000000000000003,"red":1.4333333333333333,"green":0.95,"blue":0.65,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":4.983333333333333,"red":4.383333333333334,"green":0.43333333333333335,"blue":0.5833333333333334,"alpha":0.11666666666666667},"TorsoLower":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":4.983333333333333,"red":4.383333333333334,"green":0.43333333333333335,"blue":0.5833333333333334,"alpha":0.11666666666666667},"ArmRight":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.21666666666666667}}},{"Item":"FashionCuffsArms","Group":"FashionCuffsArms","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.8833333333333333,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.8833333333333333,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":2.8000000000000003,"red":1.4333333333333333,"green":0.95,"blue":0.65,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"RobeSkirt","Group":"RobeSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.6333333333333334,"red":1.05,"green":1,"blue":1,"alpha":0.95}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.016666666666666666}}},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":0.95,"brightness":0.41666666666666663,"red":1.35,"green":1,"blue":1.1,"alpha":0.9833333333333333},"ShoeRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":0.95,"brightness":0.41666666666666663,"red":1.35,"green":1,"blue":1.1,"alpha":0.9833333333333333}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"SockRight":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0},"SockLeft":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.016666666666666666},"StripeSockRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.15,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333},"StripeSockLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.15,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"LatexTop","Group":"LatexTop","Color":"#ffffff","Lost":false,"Filters":{"Latex":{"gamma":1,"saturation":0.21666666666666667,"contrast":4.766666666666667,"brightness":0.16666666666666666,"red":0.3333333333333333,"green":0.3333333333333333,"blue":0.48333333333333334,"alpha":0.9166666666666666},"Hem":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1.6,"red":1.2666666666666668,"green":0.65,"blue":0.65,"alpha":0.9833333333333333}}}], + "ElementalWater": [{"Item":"StrappyBikini","Group":"StrappyBikini","Color":"#ffffff","Lost":false,"Filters":{"StrappyLower":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.7254901960784313,"green":1.392156862745098,"blue":1.2156862745098038,"alpha":1.0166666666666666}}},{"Item":"StrappyBra","Group":"StrappyBra","Color":"#ffffff","Lost":false,"Filters":{"ChestStrappy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5882352941176471,"green":1.5294117647058822,"blue":1.4509803921568627,"alpha":0.6},"Bra":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.7254901960784313,"green":1.392156862745098,"blue":1.2156862745098038,"alpha":1.0166666666666666}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.7254901960784313,"green":1.392156862745098,"blue":1.2156862745098038,"alpha":0.6833333333333333}}},{"Item":"FashionLeatherBelt","Group":"FashionLeatherBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.6666666666666667,"green":0.8235294117647058,"blue":0.47058823529411764,"alpha":1.0166666666666666},"Band":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7058823529411764,"green":1.0196078431372548,"blue":0.4117647058823529,"alpha":1.0333333333333332}}},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1176470588235294,"green":1.0196078431372548,"blue":1.0980392156862746,"alpha":1.0166666666666666},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1176470588235294,"green":1.0196078431372548,"blue":1.0980392156862746,"alpha":1.0166666666666666}}},{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7254901960784315,"green":0.9215686274509803,"blue":0.4117647058823529,"alpha":1.0166666666666666},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7254901960784315,"green":0.9215686274509803,"blue":0.4117647058823529,"alpha":1.0166666666666666}}},{"Item":"RobeSleeves","Group":"RobeSleeves","Color":"#ffffff","Lost":false,"Filters":{"SleeveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.23529411764705882,"green":2.0392156862745097,"blue":1.9803921568627452,"alpha":0.7333333333333334},"SleeveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.23529411764705882,"green":2.0392156862745097,"blue":1.9803921568627452,"alpha":0.7333333333333334}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.966666666666667,"red":1,"green":1,"blue":1,"alpha":0.11666666666666667},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.966666666666667,"red":1,"green":1,"blue":1,"alpha":0.11666666666666667}}}], + "ElementalIce": [{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":4.983333333333333,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":4.983333333333333,"alpha":0.05}}},{"Item":"ElfCirclet","Group":"ElfCirclet","Color":"#ffffff","Lost":false,"Filters":{"Circlet":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.4166666666666665,"red":0.6470588235294118,"green":1.0166666666666666,"blue":1.8235294117647058,"alpha":1.0166666666666666},"Gem":{"gamma":1,"saturation":0,"contrast":1.2666666666666668,"brightness":1.7000000000000002,"red":0.5666666666666667,"green":0.6666666666666666,"blue":1,"alpha":1}}},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6470588235294118,"green":1.8235294117647058,"blue":1.8235294117647058,"alpha":0.3166666666666667},"Runes":{"gamma":1,"saturation":0,"contrast":2.48,"brightness":1,"red":0,"green":0.11764705882352941,"blue":3.843137254901961,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0,"contrast":0.6666666666666666,"brightness":2.3833333333333333,"red":0.5666666666666667,"green":0.6666666666666666,"blue":1,"alpha":0.8166666666666667}}},{"Item":"FashionShacklesThigh","Group":"FashionShacklesThigh","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":2.8000000000000003,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"ChainBikini","Group":"ChainBikini","Color":"#ffffff","Lost":false,"Filters":{"Bikini":{"gamma":1,"saturation":0,"contrast":1.4000000000000001,"brightness":1.75,"red":0.5,"green":0.9333333333333333,"blue":1.5166666666666666,"alpha":0.6666666666666666}}},{"Item":"PlateBoots","Group":"PlateBoots","Color":"#ffffff","Lost":false,"Filters":{"BootLeft":{"gamma":0.65,"saturation":0.06666666666666667,"contrast":1,"brightness":1.3,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65},"BootRight":{"gamma":0.65,"saturation":0.06666666666666667,"contrast":1,"brightness":1.3,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"Gauntlets","Group":"Gauntlets","Color":"#ffffff","Lost":false,"Filters":{"GauntletRight":{"gamma":0.65,"saturation":0.06666666666666667,"contrast":0.8166666666666667,"brightness":1.6,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.6500000000000001,"alpha":0.6333333333333334},"GauntletLeft":{"gamma":0.65,"saturation":0.06666666666666667,"contrast":0.8166666666666667,"brightness":1.6,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.6500000000000001,"alpha":0.6333333333333334}}},{"Item":"BunnyLeotardHighUnder","Group":"BunnyLeotardHighUnder","Color":"#ffffff","Lost":false,"Filters":{"Leotard":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"HighLeotard":{"gamma":1,"saturation":0,"contrast":1,"brightness":3.0666666666666664,"red":2.5333333333333337,"green":2.466666666666667,"blue":4.95,"alpha":1.2333333333333334}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1.3,"brightness":1.7000000000000002,"red":2,"green":2.5666666666666664,"blue":4.983333333333333,"alpha":0.7333333333333334}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0,"contrast":0.6333333333333334,"brightness":2.4166666666666665,"red":0.5,"green":0.95,"blue":1.8166666666666667,"alpha":0.44999999999999996}}},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1.2833333333333332,"blue":1.7333333333333334,"alpha":0.6666666666666666},"BandRight":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1.2833333333333332,"blue":1.7333333333333334,"alpha":0.6666666666666666}}}], + "ElementalEarth": [{"Item":"Gauntlets","Group":"Gauntlets","Color":"#ffffff","Lost":false,"Filters":{"GauntletRight":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333},"GauntletLeft":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333}}},{"Item":"Pauldrons","Group":"Pauldrons","Color":"#ffffff","Lost":false,"Filters":{"Pauldrons":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333}}},{"Item":"PlateBoots","Group":"PlateBoots","Color":"#ffffff","Lost":false,"Filters":{"BootLeft":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333},"BootRight":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.983333333333333,"red":1,"green":1,"blue":1,"alpha":0.06666666666666667},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.983333333333333,"red":1,"green":1,"blue":1,"alpha":0.06666666666666667},"ArmRight":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.06666666666666667}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"StripeSockRight":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0},"StripeSockLeft":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0},"SockRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":3.5,"red":1.2666666666666668,"green":1.2833333333333332,"blue":1.4833333333333334,"alpha":0.7000000000000001},"SockLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":3.5,"red":1.2666666666666668,"green":1.2833333333333332,"blue":1.4833333333333334,"alpha":0.7000000000000001}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.016666666666666666}}},{"Item":"ChainSkirt","Group":"ChainSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333}}},{"Item":"FashionSteelCollar","Group":"FashionSteelCollar","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333}}},{"Item":"BunnyLeotardHighUnder","Group":"BunnyLeotardHighUnder","Color":"#ffffff","Lost":false,"Filters":{"HighLeotard":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":3.1833333333333336,"red":4.5,"green":4.516666666666667,"blue":4.816666666666666,"alpha":0.7666666666666666},"Leotard":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}},{"Item":"ElfBra","Group":"ElfBra","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":0.05,"contrast":1.6333333333333333,"brightness":0.8500000000000001,"red":1,"green":1,"blue":1.1500000000000001,"alpha":0.8}}}], + "KeeperEarth": [{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.983333333333333,"red":1,"green":1,"blue":1,"alpha":0.06666666666666667},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.983333333333333,"red":1,"green":1,"blue":1,"alpha":0.06666666666666667}}},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":1,"saturation":0.6666666666666666,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1},"BandRight":{"gamma":1,"saturation":0.6666666666666666,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":3.216666666666667,"red":1.6,"green":1.5666666666666669,"blue":1.6666666666666665,"alpha":0.3833333333333333}}},{"Item":"BunnyLeotardHighUnder","Group":"BunnyLeotardHighUnder","Color":"#ffffff","Lost":false,"Filters":{"HighLeotard":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":3.1,"red":4.5,"green":4.516666666666667,"blue":4.816666666666666,"alpha":1.0166666666666666},"Leotard":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0}}},{"Item":"ElfTop","Group":"ElfTop","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":0.05,"contrast":1.6333333333333333,"brightness":1.2333333333333334,"red":1,"green":1,"blue":1.1500000000000001,"alpha":0.5166666666666666}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.08333333333333333,"contrast":0.65,"brightness":1.3666666666666667,"red":1.6,"green":1.2,"blue":0.5,"alpha":0.8500000000000001}}},{"Item":"ElfCollar","Group":"ElfCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.6666666666666666,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"AnkleRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1,"red":3.156862745098039,"green":2.2941176470588234,"blue":1.4313725490196079,"alpha":1},"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1,"red":3.156862745098039,"green":2.2941176470588234,"blue":1.4313725490196079,"alpha":1}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1,"red":3.156862745098039,"green":2.2941176470588234,"blue":1.4313725490196079,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0.6666666666666666,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":1.5333333333333332,"red":1.3166666666666664,"green":0.8166666666666667,"blue":0.6666666666666666,"alpha":0.9833333333333333},"ShoeRight":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":1.5333333333333332,"red":1.3166666666666664,"green":0.8166666666666667,"blue":0.6666666666666666,"alpha":0.9833333333333333}}},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":0.5166666666666666,"red":1.3166666666666664,"green":0.8166666666666667,"blue":0.6666666666666666,"alpha":0.9833333333333333},"ShoeRight":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":0.5166666666666666,"red":1.3166666666666664,"green":0.8166666666666667,"blue":0.6666666666666666,"alpha":0.9833333333333333}}},{"Item":"ElfCirclet","Group":"ElfCirclet","Color":"#ffffff","Lost":false,"Filters":{"Circlet":{"gamma":1,"saturation":0.6666666666666666,"contrast":1,"brightness":1.0833333333333335,"red":1,"green":1,"blue":1,"alpha":1},"Gem":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.9166666666666666,"red":1.2833333333333332,"green":0.6666666666666666,"blue":1.4833333333333334,"alpha":0.9833333333333333}}}], + "ElementalLatex": [{"Item":"FashionLeatherCollar","Group":"FashionLeatherCollar","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.8833333333333333,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.8833333333333333,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":3.8166666666666664,"red":1,"green":1,"blue":1,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.8833333333333333,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.8833333333333333,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":3.8166666666666664,"red":1,"green":1,"blue":1,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"RobeSkirt","Group":"RobeSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":1.0166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.8833333333333333}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.016666666666666666}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"SockRight":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0},"SockLeft":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.016666666666666666},"StripeSockRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.15,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333},"StripeSockLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.15,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":0,"contrast":1,"brightness":4.983333333333333,"red":1,"green":1,"blue":1.2666666666666668,"alpha":0.3333333333333333},"TorsoLower":{"gamma":1,"saturation":0,"contrast":1,"brightness":4.983333333333333,"red":1,"green":1,"blue":1.2666666666666668,"alpha":0.3333333333333333},"ArmRight":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.16666666666666666}}},{"Item":"LatexTop","Group":"LatexTop","Color":"#ffffff","Lost":false,"Filters":{"Latex":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.0666666666666664,"brightness":0.48333333333333334,"red":0.3333333333333333,"green":0.3333333333333333,"blue":0.48333333333333334,"alpha":0.8166666666666667},"Hem":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.2,"brightness":3,"red":1.2833333333333332,"green":1.2333333333333334,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"WolfGloves","Group":"WolfGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.0666666666666664,"brightness":3.033333333333333,"red":0.3333333333333333,"green":0.3333333333333333,"blue":0.48333333333333334,"alpha":0.6},"GloveRight":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.0666666666666664,"brightness":3.033333333333333,"red":0.3333333333333333,"green":0.3333333333333333,"blue":0.48333333333333334,"alpha":0.6},"BandLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.7000000000000001,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.65,"alpha":1},"BandRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.7000000000000001,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.65,"alpha":1},"RimLeft":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":1.7166666666666666,"red":1,"green":1,"blue":1.1333333333333333,"alpha":0.9833333333333333},"RimRight":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":1.7166666666666666,"red":1,"green":1,"blue":1.1333333333333333,"alpha":0.9833333333333333}}},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.1,"brightness":1.1500000000000001,"red":0.3333333333333333,"green":0.3333333333333333,"blue":0.48333333333333334,"alpha":1.1333333333333333},"ShoeRight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.1,"brightness":1.1500000000000001,"red":0.3333333333333333,"green":0.3333333333333333,"blue":0.48333333333333334,"alpha":1.1333333333333333}}}], + "ElementalRubber": [{"Item":"FashionLeatherCollar","Group":"FashionLeatherCollar","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.5666666666666667,"red":0.7666666666666666,"green":1.4833333333333334,"blue":1.6,"alpha":0.9166666666666666},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":3.8166666666666664,"red":1,"green":1.5166666666666666,"blue":1.5166666666666666,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.8833333333333333,"red":0.7666666666666666,"green":1.4833333333333334,"blue":1.6,"alpha":0.9166666666666666},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":3.8166666666666664,"red":1,"green":1.5166666666666666,"blue":1.5166666666666666,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"RobeSkirt","Group":"RobeSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":2.0833333333333335,"red":0.7666666666666666,"green":1.4833333333333334,"blue":1.6,"alpha":0.9166666666666666}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.016666666666666666}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"SockRight":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0},"SockLeft":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.016666666666666666},"StripeSockRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.3,"red":0.7666666666666666,"green":1.4833333333333334,"blue":1.6,"alpha":0.9166666666666666},"StripeSockLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.3,"red":0.7666666666666666,"green":1.4833333333333334,"blue":1.6,"alpha":0.9166666666666666}}},{"Item":"LatexTop","Group":"LatexTop","Color":"#ffffff","Lost":false,"Filters":{"Latex":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.0666666666666664,"brightness":0.48333333333333334,"red":0.3333333333333333,"green":1,"blue":1.0833333333333335,"alpha":0.8166666666666667},"Hem":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.2,"brightness":1,"red":1.2833333333333332,"green":1.4166666666666665,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"WolfGloves","Group":"WolfGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.0166666666666666,"brightness":1.6333333333333333,"red":0.3666666666666667,"green":1.3,"blue":1.7000000000000002,"alpha":0.6},"GloveRight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.0166666666666666,"brightness":1.6333333333333333,"red":0.3666666666666667,"green":1.3,"blue":1.7000000000000002,"alpha":0.6},"BandLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.7000000000000001,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.65,"alpha":0},"BandRight":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":0.11666666666666667,"red":1,"green":1,"blue":1.1333333333333333,"alpha":0.016666666666666666},"RimLeft":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":0.11666666666666667,"red":1,"green":1,"blue":1.1333333333333333,"alpha":0.8666666666666667},"RimRight":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":0.5166666666666666,"red":1,"green":1,"blue":1.1333333333333333,"alpha":0.8666666666666667}}},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.3,"red":0.7666666666666666,"green":1.4833333333333334,"blue":1.6,"alpha":0.9166666666666666},"ShoeRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.3,"red":0.7666666666666666,"green":1.4833333333333334,"blue":1.6,"alpha":0.9166666666666666}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":4.9,"red":1,"green":1,"blue":1,"alpha":0.23333333333333334},"TorsoLower":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":4.9,"red":1,"green":1,"blue":1,"alpha":0.23333333333333334}}}], + "ElementalLeather": [{"Item":"FashionHarness","Group":"FashionHarness","Color":"#ffffff","Lost":false},{"Item":"FashionLeatherCollar","Group":"FashionLeatherCollar","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.44999999999999996,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.5666666666666667,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":3.8166666666666664,"red":1,"green":1,"blue":1,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.44999999999999996,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.5666666666666667,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":3.8166666666666664,"red":1,"green":1,"blue":1,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionCuffsThigh","Group":"FashionCuffsThigh","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.44999999999999996,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.5666666666666667,"alpha":1},"Cuff":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":2.9,"red":1,"green":1,"blue":1,"alpha":1},"Hardware":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"StripeSockRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666},"StripeSockLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666},"SockLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.3,"red":1,"green":1,"blue":1.0166666666666666,"alpha":0.8},"SockRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.3,"red":1,"green":1,"blue":1.0166666666666666,"alpha":0.8}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":2.9,"red":1,"green":1,"blue":1,"alpha":0.2833333333333333},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":2.9,"red":1,"green":1,"blue":1,"alpha":0.2833333333333333}}},{"Item":"FashionBlindfoldLeather","Group":"FashionBlindfoldLeather","Color":"#ffffff","Lost":false,"Filters":{"Blindfold":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.44999999999999996,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.5666666666666667,"alpha":1},"Rim":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":2.033333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BalletHeels","Group":"BalletHeels","Color":"#ffffff","Lost":false,"Filters":{"Shoe":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.44999999999999996,"red":0.5666666666666667,"green":0.5666666666666667,"blue":0.5666666666666667,"alpha":1},"Laces":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.5833333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LatexBra","Group":"LatexBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.4333333333333333,"red":1,"green":1,"blue":1,"alpha":0.9833333333333333}}},{"Item":"LatexBraStraps","Group":"LatexBraStraps","Color":"#ffffff","Lost":false,"Filters":{"StrapsHeavyCorset":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.7333333333333334}}},{"Item":"WolfGloves","Group":"WolfGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0.3833333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1},"GloveRight":{"gamma":1,"saturation":0.3833333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1},"BandLeft":{"gamma":1,"saturation":0,"contrast":1.0166666666666666,"brightness":2.1333333333333333,"red":0.13333333333333333,"green":0.13333333333333333,"blue":0.13333333333333333,"alpha":1},"BandRight":{"gamma":1,"saturation":0,"contrast":1.0166666666666666,"brightness":2.1333333333333333,"red":0.13333333333333333,"green":0.13333333333333333,"blue":0.13333333333333333,"alpha":1},"RimLeft":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1},"RimRight":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":1.3166666666666664,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionCyberBelt","Group":"FashionCyberBelt","Color":"#ffffff","Lost":false,"Filters":{"Lining":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.13333333333333333,"red":1,"green":1,"blue":1,"alpha":1.05},"Metal":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":1.3,"red":1,"green":1,"blue":1,"alpha":1},"Display":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"Plug":{"gamma":1,"saturation":1,"contrast":1,"brightness":2.6,"red":1,"green":1,"blue":1,"alpha":1}}}], + + "Alchemist": [{"Item":"Labcoat","Group":"Labcoat","Color":"#ffffff","Lost":false},{"Item":"WolfHeels","Group":"WolfHeels","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.41666666666666663,"red":1.6333333333333333,"green":1.3666666666666667,"blue":1.75,"alpha":1.2},"ShoeRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.41666666666666663,"red":1.6333333333333333,"green":1.3666666666666667,"blue":1.75,"alpha":1.2}}},{"Item":"Catsuit","Group":"Catsuit","Color":"#ffffff","Lost":false},{"Item":"WolfPanties","Group":"WolfPanties","Color":"#ffffff","Lost":false,"Filters":{"Panties":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.6666666666666666,"red":1.6333333333333333,"green":1.3666666666666667,"blue":1.75,"alpha":1.2}}},{"Item":"WolfTorsoUpper","Group":"WolfTorsoUpper","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.6666666666666666,"red":1.6333333333333333,"green":1.3666666666666667,"blue":1.75,"alpha":1.2},"Chest":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.6666666666666666,"red":1.6333333333333333,"green":1.3666666666666667,"blue":1.75,"alpha":1.2}}},{"Item":"WolfGloves","Group":"WolfGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"RimRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"BandRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"BandLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.7333333333333334,"red":1.6333333333333333,"green":1.3666666666666667,"blue":1.75,"alpha":1.2},"RimLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.3833333333333333,"red":1.6333333333333333,"green":1.3666666666666667,"blue":1.75,"alpha":1.2}}}], + "Alkhahestor": [{"Item":"Catsuit","Group":"Catsuit","Color":"#ffffff","Lost":false},{"Item":"WolfPanties","Group":"WolfPanties","Color":"#ffffff","Lost":false,"Filters":{"Panties":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.3,"red":1.3666666666666667,"green":1.3666666666666667,"blue":1.75,"alpha":1.2}}},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false,"Filters":{"WitchHat":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.8235294117647058,"green":0.49019607843137253,"blue":0.5490196078431373,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":0,"contrast":0.38,"brightness":1,"red":3.0980392156862746,"green":2.9215686274509802,"blue":1.3725490196078431,"alpha":1}}},{"Item":"Labcoat","Group":"Labcoat","Color":"#ffffff","Lost":false,"Filters":{"Shoulders":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0.5294117647058824,"blue":0.7647058823529411,"alpha":1},"Coat":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.23529411764705882,"green":0.13725490196078433,"blue":0.1568627450980392,"alpha":1},"Cape":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.1568627450980392,"green":0.0784313725490196,"blue":0.0784313725490196,"alpha":1}}},{"Item":"WolfTorsoUpper","Group":"WolfTorsoUpper","Color":"#ffffff","Lost":false,"Filters":{"Chest":{"gamma":1.3,"saturation":0,"contrast":1.5166666666666666,"brightness":1.3166666666666664,"red":0.13725490196078433,"green":0.1568627450980392,"blue":0.23529411764705882,"alpha":1},"Cloth":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.3,"red":1.3666666666666667,"green":1.3666666666666667,"blue":1.75,"alpha":1.2}}},{"Item":"WolfHeels","Group":"WolfHeels","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.3,"red":1.3666666666666667,"green":1.3666666666666667,"blue":1.75,"alpha":1.2},"ShoeRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.3,"red":1.3666666666666667,"green":1.3666666666666667,"blue":1.75,"alpha":1.2}}},{"Item":"WolfGloves","Group":"WolfGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"RimRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"BandRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"BandLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4833333333333334,"brightness":0.3,"red":1.3666666666666667,"green":1.3666666666666667,"blue":1.75,"alpha":1.2}}}], + "AlchemistPet": [{"Item":"Catsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.21568627450980393,"green":2.235294117647059,"blue":4.686274509803922,"alpha":1},"TorsoLower":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.21568627450980393,"green":2.235294117647059,"blue":4.686274509803922,"alpha":1}}},{"Item":"FlatBalletHeels","Group":"FlatBalletHeels","Color":"#ffffff","Lost":false,"Filters":{"FlatBalletLeft":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.21568627450980393,"green":2.235294117647059,"blue":4.686274509803922,"alpha":1},"Shoe":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1.2666666666666668,"red":0.11764705882352941,"green":1.1176470588235294,"blue":2.3137254901960786,"alpha":0.6666666666666666},"Sole":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.11764705882352941,"green":1.1176470588235294,"blue":2.3137254901960786,"alpha":1}}},{"Item":"FashionSmoothBallGag","Group":"FashionSmoothBallGag","Color":"#ffffff","Lost":false,"Filters":{"Ball":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.11764705882352941,"green":1.1176470588235294,"blue":2.3137254901960786,"alpha":1}}},{"Item":"LatexNeckCorsetGag","Group":"LatexNeckCorsetGag","Color":"#ffffff","Lost":false,"Filters":{"NeckCorset":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.11764705882352941,"green":1.1176470588235294,"blue":2.3137254901960786,"alpha":1},"Rim":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.058823529411764705,"green":0.6274509803921569,"blue":1.2745098039215685,"alpha":1},"Latex":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.058823529411764705,"green":0.6274509803921569,"blue":1.2745098039215685,"alpha":1},"Neck":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.058823529411764705,"green":0.6274509803921569,"blue":1.2745098039215685,"alpha":1}}},{"Item":"FashionGagLatexFlatHarnessSecure","Group":"FashionGagLatexFlatHarnessSecure","Color":"#ffffff","Lost":false,"Filters":{"OTNFlat":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.11764705882352941,"green":1.1176470588235294,"blue":2.3137254901960786,"alpha":1}}},{"Item":"FashionLeatherMittens","Group":"FashionLeatherMittens","Color":"#ffffff","Lost":false,"Filters":{"LeatherLeft":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.11764705882352941,"green":1.1176470588235294,"blue":2.3137254901960786,"alpha":1},"Mitten":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.09803921568627451,"green":0.5098039215686274,"blue":1.0392156862745099,"alpha":1}}},{"Item":"LatexCorsetCross","Group":"LatexCorsetCross","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.11764705882352941,"green":1.1176470588235294,"blue":2.3137254901960786,"alpha":1},"Corset":{"gamma":1,"saturation":0,"contrast":0.8900000000000001,"brightness":1,"red":0.11764705882352941,"green":1.1176470588235294,"blue":2.3137254901960786,"alpha":1}}}], + + ApprenticeSlime: [{"Item":"ApprenticeHat","Group":"ApprenticeHat","Color":"#ffffff","Lost":false,"Filters":{"ApprenticeHatPuff":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1}}},{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1}}},{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Ruffle":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1},"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1},"Belt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":0.19607843137254902,"blue":0.4117647058823529,"alpha":0.016666666666666666},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":0.19607843137254902,"blue":0.4117647058823529,"alpha":0},"BlouseLiner":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1},"Blouse":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1}}}], + ApprenticeRed: [{"Item":"ApprenticeHat","Group":"ApprenticeHat","Color":"#ffffff","Lost":false,"Filters":{"ApprenticeHatPuff":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1372549019607843,"green":0.35294117647058826,"blue":0.7647058823529411,"alpha":1}}},{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1372549019607843,"green":0.35294117647058826,"blue":0.7647058823529411,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1372549019607843,"green":0.35294117647058826,"blue":0.7647058823529411,"alpha":1}}},{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Ruffle":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1},"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1372549019607843,"green":0.35294117647058826,"blue":0.7647058823529411,"alpha":1},"Belt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":0.19607843137254902,"blue":0.4117647058823529,"alpha":0.016666666666666666},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":0.19607843137254902,"blue":0.4117647058823529,"alpha":0},"BlouseLiner":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1},"Blouse":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1}}}], + ApprenticeBlue: [{"Item":"ApprenticeHat","Group":"ApprenticeHat","Color":"#ffffff","Lost":false,"Filters":{"ApprenticeHatPuff":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.43137254901960786,"green":0.6666666666666666,"blue":1.0392156862745099,"alpha":1}}},{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.43137254901960786,"green":0.6666666666666666,"blue":1.0392156862745099,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.43137254901960786,"green":0.6666666666666666,"blue":1.0392156862745099,"alpha":1}}},{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Ruffle":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1},"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.43137254901960786,"green":0.6666666666666666,"blue":1.0392156862745099,"alpha":1},"Belt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5098039215686274,"green":0.7843137254901961,"blue":1.392156862745098,"alpha":1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":0},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":0},"BlouseLiner":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1},"Blouse":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1}}}], + + Dressmaker: [{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false},{"Item":"MaidBow","Group":"MaidBow","Color":"#ffffff","Lost":false},{"Item":"DressSkirt","Group":"DressSkirt","Color":"#ffffff","Lost":false},{"Item":"RobeSleevesDeco","Group":"RobeSleevesDeco","Color":"#ffffff","Lost":false},{"Item":"BowCorset","Group":"BowCorset","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0.3,"contrast":0.6,"brightness":0.9166666666666666,"red":1.7000000000000002,"green":1.7000000000000002,"blue":1.8833333333333333,"alpha":1},"Ruffle":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":1.6500000000000001,"red":1.4333333333333333,"green":0.6666666666666666,"blue":0.9333333333333333,"alpha":0.8666666666666667}}},{"Item":"ElfTop","Group":"ElfTop","Color":"#ffffff","Lost":false,"Filters":{"Chest":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.3833333333333333,"red":1,"green":1,"blue":1,"alpha":1},"Cloth":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.2166666666666668,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LaceBustier","Group":"LaceBustier","Color":"#ffffff","Lost":false,"Filters":{"BraBase":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":1.7833333333333334,"red":1.4333333333333333,"green":0.6666666666666666,"blue":0.9333333333333333,"alpha":1.05},"BraCups":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"BraStripes":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":1.7833333333333334,"red":1.4333333333333333,"green":0.6666666666666666,"blue":0.9333333333333333,"alpha":1.05}}}], + Librarian: [{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false},{"Item":"MaidBow","Group":"MaidBow","Color":"#ffffff","Lost":false},{"Item":"DressSkirt","Group":"DressSkirt","Color":"#ffffff","Lost":false},{"Item":"Glasses","Group":"Glasses","Color":"#ffffff","Lost":false,"Filters":{"Glasses":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":2.3000000000000003},"Lens":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":2.3000000000000003}}},{"Item":"BanditWrist","Group":"BanditWrist","Color":"#ffffff","Lost":false,"Filters":{"WristLeft":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":1.7999999999999998,"red":1.2833333333333332,"green":0.6333333333333334,"blue":0.9333333333333333,"alpha":1},"WristRight":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":1.7999999999999998,"red":1.2833333333333332,"green":0.6333333333333334,"blue":0.9333333333333333,"alpha":1}}},{"Item":"LaceCorset","Group":"LaceCorset","Color":"#ffffff","Lost":false,"Filters":{"Base":{"gamma":1,"saturation":0.2833333333333333,"contrast":1,"brightness":1.0833333333333335,"red":1.7000000000000002,"green":0.65,"blue":1.05,"alpha":1},"Stripes":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Crystal":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":1,"red":1.4833333333333334,"green":0.7333333333333334,"blue":1.1333333333333333,"alpha":1}}},{"Item":"DressBlouseBustCropped","Group":"DressBlouseBustCropped","Color":"#ffffff","Lost":false}], + Nurse: [{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.47058823529411764,"green":0.47058823529411764,"blue":0.47058823529411764,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.47058823529411764,"green":0.47058823529411764,"blue":0.47058823529411764,"alpha":1}}},{"Item":"LacePanties","Group":"LacePanties","Color":"#ffffff","Lost":false},{"Item":"RobeSkirt","Group":"RobeSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":0.9166666666666666,"brightness":2.8666666666666667,"red":1.85,"green":1.85,"blue":2.033333333333333,"alpha":1}}},{"Item":"WolfGloves","Group":"WolfGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.47058823529411764,"green":0.47058823529411764,"blue":0.47058823529411764,"alpha":1},"RimLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.47058823529411764,"green":0.47058823529411764,"blue":0.47058823529411764,"alpha":0},"BandLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.47058823529411764,"green":0.47058823529411764,"blue":0.47058823529411764,"alpha":0},"GloveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.47058823529411764,"green":0.47058823529411764,"blue":0.47058823529411764,"alpha":1},"RimRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.47058823529411764,"green":0.47058823529411764,"blue":0.47058823529411764,"alpha":0},"BandRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.47058823529411764,"green":0.47058823529411764,"blue":0.47058823529411764,"alpha":0}}},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":2.8499999999999996,"red":1,"green":1,"blue":1.1,"alpha":1.0833333333333335},"CorsetStraps":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":3.0833333333333335,"red":1.8666666666666667,"green":1.8666666666666667,"blue":1.8666666666666667,"alpha":1}}},{"Item":"ZombieHat","Group":"ZombieHat","Color":"#ffffff","Lost":false,"Filters":{"ZombieHatBand":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.6,"red":1.7000000000000002,"green":1.35,"blue":1.7000000000000002,"alpha":1.05},"ZombieHat":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":0.05}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"SockRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":2.0666666666666664,"red":2.2,"green":2.216666666666667,"blue":2.466666666666667,"alpha":1},"StripeSockRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"StripeSockLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"SockLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":2.0666666666666664,"red":2.2,"green":2.216666666666667,"blue":2.466666666666667,"alpha":1}}},{"Item":"ElfBra","Group":"ElfBra","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.2166666666666668,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ClothCollarTag","Group":"ClothCollarTag","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":2.683333333333333,"red":1.8666666666666667,"green":1.8666666666666667,"blue":1.8666666666666667,"alpha":1},"CollarTag":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.7333333333333334,"red":1.7000000000000002,"green":1.35,"blue":1.7000000000000002,"alpha":1}}}], + + "WitchWater": [{"Item":"WitchCorset","Group":"WitchCorset","Color":"#ffffff","Lost":false},{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false},{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"Blouse":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":1.2352941176470589,"blue":0.7450980392156863,"alpha":1},"BlouseLiner":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":1.2352941176470589,"blue":0.7450980392156863,"alpha":1},"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":1.2352941176470589,"blue":0.7450980392156863,"alpha":1},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":1.2352941176470589,"blue":0.7450980392156863,"alpha":1}}},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false}], + "WitchSlime": [{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1}}},{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Ruffle":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1},"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1},"Belt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":0.19607843137254902,"blue":0.4117647058823529,"alpha":0.016666666666666666},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":0.19607843137254902,"blue":0.4117647058823529,"alpha":0},"BlouseLiner":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1},"Blouse":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1}}},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false},{"Item":"WitchCorset","Group":"WitchCorset","Color":"#ffffff","Lost":false},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1},"BandRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1}}},{"Item":"ElfCirclet","Group":"ElfCirclet","Color":"#ffffff","Lost":false,"Filters":{"Circlet":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1},"Gem":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":2.372549019607843,"green":0,"blue":2.0588235294117645,"alpha":1},"GloveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":2.372549019607843,"green":0,"blue":2.0588235294117645,"alpha":1},"BandRight":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.43333333333333335,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":0},"BandLeft":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.43333333333333335,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":0},"RimLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"RimRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}}], + "WitchShock": [{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.43137254901960786,"green":0.6666666666666666,"blue":1.0392156862745099,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.43137254901960786,"green":0.6666666666666666,"blue":1.0392156862745099,"alpha":1}}},{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Ruffle":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1},"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.6666666666666666,"blue":1.1372549019607843,"alpha":1},"Belt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5098039215686274,"green":0.7843137254901961,"blue":1.392156862745098,"alpha":1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":0},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":0}}},{"Item":"WitchCorset","Group":"WitchCorset","Color":"#ffffff","Lost":false},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false},{"Item":"ClothCollar","Group":"ClothCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.47058823529411764,"green":2.3137254901960786,"blue":3.8627450980392157,"alpha":1}}},{"Item":"StrappyBra","Group":"StrappyBra","Color":"#ffffff","Lost":false,"Filters":{"ChestStrappy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.6666666666666666,"blue":1.1372549019607843,"alpha":1},"Bra":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.29411764705882354,"green":1.392156862745098,"blue":2.372549019607843,"alpha":1}}}], + "WitchRope": [{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":0,"contrast":0.99,"brightness":1,"red":0.23529411764705882,"green":0.23529411764705882,"blue":0.47058823529411764,"alpha":1},"BlouseRight":{"gamma":1,"saturation":0,"contrast":0.99,"brightness":1,"red":0.23529411764705882,"green":0.23529411764705882,"blue":0.47058823529411764,"alpha":1},"Blouse":{"gamma":1,"saturation":0,"contrast":0.99,"brightness":1,"red":0.23529411764705882,"green":0.23529411764705882,"blue":0.47058823529411764,"alpha":1},"BlouseLiner":{"gamma":1,"saturation":0,"contrast":0.99,"brightness":1,"red":0.23529411764705882,"green":0.23529411764705882,"blue":0.47058823529411764,"alpha":1}}},{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false},{"Item":"BlouseCollar","Group":"BlouseCollar","Color":"#ffffff","Lost":false},{"Item":"CatsuitTop","Group":"CatsuitTop","Color":"#ffffff","Lost":false,"Filters":{"SleevelessTop":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.0392156862745098,"green":1.7647058823529411,"blue":1.0980392156862746,"alpha":1},"Latex":{"gamma":1,"saturation":0,"contrast":0.21000000000000002,"brightness":1,"red":0.45098039215686275,"green":0.49019607843137253,"blue":0.9215686274509803,"alpha":1}}},{"Item":"BanditShorts","Group":"BanditShorts","Color":"#ffffff","Lost":false,"Filters":{"Shorts":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.17647058823529413,"blue":0.3333333333333333,"alpha":1},"ShortsLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.17647058823529413,"blue":0.3333333333333333,"alpha":1}}},{"Item":"LaceBra","Group":"LaceBra","Color":"#ffffff","Lost":false},{"Item":"BanditBoots","Group":"BanditBoots","Color":"#ffffff","Lost":false},{"Item":"FashionShacklesThighRight","Group":"FashionShacklesThighRight","Color":"#ffffff","Lost":false,"Filters":{"ThighRight":{"gamma":1,"saturation":0,"contrast":0.99,"brightness":1,"red":0.23529411764705882,"green":0.23529411764705882,"blue":0.47058823529411764,"alpha":1},"BaseMetal":{"gamma":1,"saturation":0,"contrast":0.99,"brightness":1,"red":0.23529411764705882,"green":0.23529411764705882,"blue":0.47058823529411764,"alpha":1}}},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false}], + "WitchMetal": [{"Item":"Pauldrons","Group":"Pauldrons","Color":"#ffffff","Lost":false},{"Item":"FashionShacklesThighRight","Group":"FashionShacklesThighRight","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.2833333333333333,"contrast":1,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}}},{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.5833333333333334,"contrast":1,"brightness":1.2166666666666668,"red":1,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.5833333333333334,"contrast":1,"brightness":1.2166666666666668,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5666666666666667,"red":1.8833333333333333,"green":1,"blue":1.4333333333333333,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5666666666666667,"red":1.8833333333333333,"green":1,"blue":1.4333333333333333,"alpha":1},"CrystalShoeLeft":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1},"CrystalShoeRight":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionShacklesThigh","Group":"FashionShacklesThigh","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.2833333333333333,"contrast":1,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}}},{"Item":"FashionThighLink","Group":"FashionThighLink","Color":"#ffffff","Lost":false,"Filters":{"ThighLink":{"gamma":1,"saturation":0.2833333333333333,"contrast":1,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}}},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.0833333333333335,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"WolfGloves","Group":"WolfGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"BandLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.0833333333333335,"brightness":1.5166666666666666,"red":1,"green":1,"blue":1.05,"alpha":1},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666},"RimLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.0833333333333335,"brightness":1.2333333333333334,"red":1,"green":1,"blue":1.05,"alpha":1},"BandRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.9166666666666666,"brightness":1.7333333333333334,"red":1,"green":1,"blue":1.05,"alpha":1},"RimRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.0833333333333335,"brightness":1.2333333333333334,"red":1,"green":1,"blue":1.05,"alpha":1}}},{"Item":"ElfPanties","Group":"ElfPanties","Color":"#ffffff","Lost":false},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.033333333333333,"red":1,"green":1,"blue":1,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.033333333333333,"red":1,"green":1,"blue":1,"alpha":0.05}}},{"Item":"ChainShirt","Group":"ChainShirt","Color":"#ffffff","Lost":false,"Filters":{"Shirt":{"gamma":1,"saturation":0.3,"contrast":1.9500000000000002,"brightness":0.8166666666666667,"red":0.5,"green":0.55,"blue":0.95,"alpha":1}}},{"Item":"BanditBreastplate","Group":"BanditBreastplate","Color":"#ffffff","Lost":false},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.11666666666666667,"contrast":1,"brightness":1,"red":0.7666666666666666,"green":0.8166666666666667,"blue":1.5333333333333332,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}},{"Item":"ChainBikini","Group":"ChainBikini","Color":"#ffffff","Lost":false,"Filters":{"Bikini":{"gamma":1,"saturation":0.3,"contrast":1.9500000000000002,"brightness":0.8166666666666667,"red":0.5,"green":0.55,"blue":0.95,"alpha":1}}}], + "Conjurer": [{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false,"Filters":{"WitchHat":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.7333333333333334,"red":1,"green":1,"blue":1,"alpha":1},"WitchHatBack":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.7333333333333334,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"Cape","Group":"Cape","Color":"#ffffff","Lost":false,"Filters":{"Front":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.2,"red":0.5,"green":0.2833333333333333,"blue":0.9166666666666666,"alpha":0.95},"Back":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.3666666666666667,"red":1.7833333333333334,"green":0.2833333333333333,"blue":1.1,"alpha":0.8}}},{"Item":"ElfPanties","Group":"ElfPanties","Color":"#ffffff","Lost":false},{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Ruffle":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.7333333333333334,"red":0.5,"green":0.2833333333333333,"blue":0.9166666666666666,"alpha":0.95},"Skirt":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.2,"red":0.5,"green":0.2833333333333333,"blue":0.9166666666666666,"alpha":1},"Belt":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.7333333333333334,"red":0.5,"green":0.2833333333333333,"blue":0.9166666666666666,"alpha":0.95}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"BlouseRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666},"Blouse":{"gamma":1,"saturation":0.05,"contrast":1.8666666666666667,"brightness":0.21666666666666667,"red":0.5,"green":0.2833333333333333,"blue":0.8166666666666667,"alpha":1.0166666666666666},"BlouseLiner":{"gamma":1,"saturation":0.05,"contrast":1.8666666666666667,"brightness":0.21666666666666667,"red":0.5,"green":0.2833333333333333,"blue":0.8166666666666667,"alpha":1.0166666666666666}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.1333333333333333,"red":1.7833333333333334,"green":0.35000000000000003,"blue":1.1,"alpha":0.8},"GloveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.1333333333333333,"red":1.7833333333333334,"green":0.35000000000000003,"blue":1.1,"alpha":0.8},"BandRight":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.7833333333333334,"red":0.5,"green":0.2833333333333333,"blue":0.9166666666666666,"alpha":0.95},"BandLeft":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.7833333333333334,"red":0.5,"green":0.2833333333333333,"blue":0.9166666666666666,"alpha":0.95}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":0.8166666666666667,"red":1,"green":2.25,"blue":1,"alpha":1}}},{"Item":"BlouseCollar","Group":"BlouseCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.05,"contrast":1.0833333333333335,"brightness":0.9333333333333333,"red":0.5,"green":0.2833333333333333,"blue":0.9166666666666666,"alpha":0.95}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}},{"Item":"Glasses","Group":"Glasses","Color":"#ffffff","Lost":false,"Filters":{"Lens":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.48333333333333334}}},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.6666666666666666,"red":0.8666666666666667,"green":1.7333333333333334,"blue":1.2666666666666668,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.7333333333333334,"red":0.8666666666666667,"green":1.7333333333333334,"blue":1.2666666666666668,"alpha":1}}},{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":1.1666666666666667,"red":0.3833333333333333,"green":1.4333333333333333,"blue":2.0666666666666664,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":1.1666666666666667,"red":0.3833333333333333,"green":1.4333333333333333,"blue":2.0666666666666664,"alpha":1}}},{"Item":"SportsBra","Group":"SportsBra","Color":"#ffffff","Lost":false}], + "WitchMagnet": [{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.43137254901960786,"green":0.6666666666666666,"blue":1.0392156862745099,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.43137254901960786,"green":0.6666666666666666,"blue":1.0392156862745099,"alpha":1}}},{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Ruffle":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":1},"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.6666666666666666,"blue":1.1372549019607843,"alpha":1},"Belt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5098039215686274,"green":0.7843137254901961,"blue":1.392156862745098,"alpha":1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":0},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":0},"Blouse":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}},{"Item":"WitchCorset","Group":"WitchCorset","Color":"#ffffff","Lost":false},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"AnkleRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.6666666666666666,"blue":1.1372549019607843,"alpha":1},"BaseMetal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.6666666666666666,"blue":1.1372549019607843,"alpha":1}}},{"Item":"RobeSleeves","Group":"RobeSleeves","Color":"#ffffff","Lost":false,"Filters":{"SleeveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.6,"red":0.19607843137254902,"green":0.9607843137254902,"blue":1.6470588235294117,"alpha":0.8500000000000001},"SleeveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.6,"red":0.19607843137254902,"green":0.9607843137254902,"blue":1.6470588235294117,"alpha":0.8500000000000001}}},{"Item":"ElfBra","Group":"ElfBra","Color":"#ffffff","Lost":false},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"CorsetStraps":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.7000000000000002,"red":0.48333333333333334,"green":1,"blue":1.7166666666666666,"alpha":1}}},{"Item":"ClothCollarTag","Group":"ClothCollarTag","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.47058823529411764,"green":2.3137254901960786,"blue":3.8627450980392157,"alpha":1},"CollarTag":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.4333333333333333,"red":1,"green":1,"blue":1,"alpha":1}}}], + "WitchIce": [{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6470588235294118,"green":1.8235294117647058,"blue":1.8235294117647058,"alpha":0.3166666666666667},"Runes":{"gamma":1,"saturation":0,"contrast":2.48,"brightness":1,"red":0,"green":0.11764705882352941,"blue":3.843137254901961,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0,"contrast":0.6666666666666666,"brightness":2.3833333333333333,"red":0.5666666666666667,"green":0.6666666666666666,"blue":1,"alpha":0.8166666666666667}}},{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1.85,"brightness":0.3833333333333333,"red":2,"green":2.283333333333333,"blue":4.983333333333333,"alpha":0.7333333333333334},"Ruffle":{"gamma":1,"saturation":0,"contrast":1.85,"brightness":0.3833333333333333,"red":2,"green":2.283333333333333,"blue":4.983333333333333,"alpha":0.7333333333333334},"Belt":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":0.3,"red":0.7166666666666667,"green":0.7000000000000001,"blue":1.5,"alpha":1.1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"Blouse":{"gamma":1,"saturation":0,"contrast":1.5166666666666666,"brightness":0.43333333333333335,"red":2,"green":2.5666666666666664,"blue":4.983333333333333,"alpha":0.7333333333333334},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1.5166666666666666,"brightness":0.43333333333333335,"red":2,"green":2.5666666666666664,"blue":4.983333333333333,"alpha":0.7333333333333334},"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1.5166666666666666,"brightness":0.43333333333333335,"red":2,"green":2.5666666666666664,"blue":4.983333333333333,"alpha":0.7333333333333334},"BlouseLiner":{"gamma":1,"saturation":0,"contrast":1.5166666666666666,"brightness":0.43333333333333335,"red":2,"green":2.5666666666666664,"blue":4.983333333333333,"alpha":0}}},{"Item":"BunnyLeotardHighUnder","Group":"BunnyLeotardHighUnder","Color":"#ffffff","Lost":false,"Filters":{"HighLeotard":{"gamma":1,"saturation":0,"contrast":1,"brightness":3.0666666666666664,"red":2.5333333333333337,"green":2.466666666666667,"blue":4.95,"alpha":1.2333333333333334},"Leotard":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":4.983333333333333,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":4.983333333333333,"alpha":0.05}}},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false,"Filters":{"WitchHat":{"gamma":1,"saturation":0,"contrast":1.5166666666666666,"brightness":1.2666666666666668,"red":2,"green":2.0166666666666666,"blue":4.983333333333333,"alpha":0.9166666666666666},"WitchHatBack":{"gamma":1,"saturation":0,"contrast":1.5166666666666666,"brightness":1.2666666666666668,"red":2,"green":2.0166666666666666,"blue":4.983333333333333,"alpha":0.9166666666666666}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"CrystalShoeLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1.3,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":1.0833333333333335},"CrystalShoeRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1.3,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":1.0833333333333335},"ShoeLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":0.9833333333333333,"brightness":1.2666666666666668,"red":0.35000000000000003,"green":0.3666666666666667,"blue":0.7000000000000001,"alpha":0.9833333333333333},"ShoeRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":0.9833333333333333,"brightness":1.2666666666666668,"red":0.35000000000000003,"green":0.3666666666666667,"blue":0.7000000000000001,"alpha":0.9833333333333333}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":2.8000000000000003,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":2.8000000000000003,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"LatexCorset","Group":"LatexCorset","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333}}}], + "WitchFlame": [{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Ruffle":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.9333333333333333,"red":1.3333333333333333,"green":0.13725490196078433,"blue":0.23333333333333334,"alpha":1},"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.9166666666666666,"red":1.3333333333333333,"green":0.35000000000000003,"blue":0.26666666666666666,"alpha":1},"Belt":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.65,"red":1.3333333333333333,"green":0.13725490196078433,"blue":0.15,"alpha":1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":0},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":0}}},{"Item":"WitchCorset","Group":"WitchCorset","Color":"#ffffff","Lost":false},{"Item":"BunnyGloves","Group":"BunnyGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0,"contrast":1.8666666666666667,"brightness":0.5166666666666666,"red":0.7254901960784313,"green":0.13333333333333333,"blue":0.0784313725490196,"alpha":1},"GloveRight":{"gamma":1,"saturation":0,"contrast":1.8666666666666667,"brightness":0.5166666666666666,"red":0.7254901960784313,"green":0.13333333333333333,"blue":0.0784313725490196,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0,"contrast":1,"brightness":4.166666666666667,"red":1.3333333333333333,"green":0.3,"blue":0.2,"alpha":1}}},{"Item":"DragonCollar","Group":"DragonCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.6,"red":1.3333333333333333,"green":0.43333333333333335,"blue":0.15,"alpha":1}}},{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":4.466666666666667,"red":0.7833333333333334,"green":0.26666666666666666,"blue":0.23333333333333334,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":4.466666666666667,"red":0.7833333333333334,"green":0.26666666666666666,"blue":0.23333333333333334,"alpha":1}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.2,"red":0.7833333333333334,"green":0.26666666666666666,"blue":0.23333333333333334,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.2,"red":0.7833333333333334,"green":0.26666666666666666,"blue":0.23333333333333334,"alpha":1},"CrystalShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":4.166666666666667,"red":1.3333333333333333,"green":0.3,"blue":0.2,"alpha":1},"CrystalShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":4.166666666666667,"red":1.3333333333333333,"green":0.3,"blue":0.2,"alpha":1}}},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false}], + "WitchEarth": [{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1.2941176470588236,"green":0.6274509803921569,"blue":0.13725490196078433,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1.2941176470588236,"green":0.6274509803921569,"blue":0.13725490196078433,"alpha":1}}},{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1.2941176470588236,"green":0.6274509803921569,"blue":0.13725490196078433,"alpha":1},"Ruffle":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1.2941176470588236,"green":0.6274509803921569,"blue":0.13725490196078433,"alpha":1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":0},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.2549019607843137,"blue":0.45098039215686275,"alpha":0}}},{"Item":"WitchCorset","Group":"WitchCorset","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":2.0588235294117645,"green":0.9803921568627451,"blue":0.23529411764705882,"alpha":1}}},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false},{"Item":"RobeSleeveLeft","Group":"RobeSleeveLeft","Color":"#ffffff","Lost":false,"Filters":{"Ruffle":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1.2941176470588236,"green":0.6274509803921569,"blue":0.13725490196078433,"alpha":1},"SleeveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.1500000000000001,"red":5,"green":2.5686274509803924,"blue":0.37254901960784315,"alpha":0.65}}},{"Item":"LatexBra","Group":"LatexBra","Color":"#ffffff","Lost":false,"Filters":{"ChestHeavyCorset":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1.2941176470588236,"green":0.6274509803921569,"blue":0.13725490196078433,"alpha":1}}},{"Item":"LatexBraStrapsCross","Group":"LatexBraStrapsCross","Color":"#ffffff","Lost":false,"Filters":{"CrossHeavyCorset":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":0.6274509803921569,"green":0.7450980392156863,"blue":0.058823529411764705,"alpha":1},"Straps":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":3.0588235294117645,"green":1.9607843137254901,"blue":0.3333333333333333,"alpha":1}}},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"SteelCollar":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1.2941176470588236,"green":0.6274509803921569,"blue":0.13725490196078433,"alpha":1},"BaseMetal":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1,"green":0.47058823529411764,"blue":0.09803921568627451,"alpha":0},"Runes":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":4.509803921568627,"green":2.2745098039215685,"blue":0.7058823529411765,"alpha":1}}},{"Item":"RobeSleeveRight","Group":"RobeSleeveRight","Color":"#ffffff","Lost":false,"Filters":{"SleeveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.1500000000000001,"red":5,"green":2.5686274509803924,"blue":0.37254901960784315,"alpha":0.65}}}], + "WitchChain": [{"Item":"ChainBikini","Group":"ChainBikini","Color":"#ffffff","Lost":false},{"Item":"Pauldrons","Group":"Pauldrons","Color":"#ffffff","Lost":false},{"Item":"Breastplate","Group":"Breastplate","Color":"#ffffff","Lost":false},{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":1,"red":0.7666666666666666,"green":0.8166666666666667,"blue":1.5333333333333332,"alpha":1},"Stripe":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":1,"red":0.7833333333333334,"green":0.7833333333333334,"blue":1.5166666666666666,"alpha":1}}},{"Item":"FashionShacklesThighRight","Group":"FashionShacklesThighRight","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.2833333333333333,"contrast":1,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}}},{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.5833333333333334,"contrast":1,"brightness":1.2166666666666668,"red":1,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.5833333333333334,"contrast":1,"brightness":1.2166666666666668,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5666666666666667,"red":1.8833333333333333,"green":1,"blue":1.4333333333333333,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5666666666666667,"red":1.8833333333333333,"green":1,"blue":1.4333333333333333,"alpha":1},"CrystalShoeLeft":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1},"CrystalShoeRight":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionShacklesThigh","Group":"FashionShacklesThigh","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.2833333333333333,"contrast":1,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}}},{"Item":"FashionThighLink","Group":"FashionThighLink","Color":"#ffffff","Lost":false,"Filters":{"ThighLink":{"gamma":1,"saturation":0.2833333333333333,"contrast":1,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}}},{"Item":"WitchHat","Group":"WitchHat","Color":"#ffffff","Lost":false},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":1.1,"red":1,"green":1,"blue":1.1,"alpha":1},"BandRight":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":1.1,"red":1,"green":1,"blue":1.1,"alpha":1}}},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.0833333333333335,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}},{"Item":"WolfGloves","Group":"WolfGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"BandLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.0833333333333335,"brightness":1.5166666666666666,"red":1,"green":1,"blue":1.05,"alpha":1},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666},"RimLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.0833333333333335,"brightness":1.2333333333333334,"red":1,"green":1,"blue":1.05,"alpha":1},"BandRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.9166666666666666,"brightness":1.7333333333333334,"red":1,"green":1,"blue":1.05,"alpha":1},"RimRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.0833333333333335,"brightness":1.2333333333333334,"red":1,"green":1,"blue":1.05,"alpha":1}}},{"Item":"ElfPanties","Group":"ElfPanties","Color":"#ffffff","Lost":false},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.033333333333333,"red":1,"green":1,"blue":1,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.033333333333333,"red":1,"green":1,"blue":1,"alpha":0.05}}}], + "Necromancer": [{"Item":"DressSkirtSplit","Group":"DressSkirtSplit","Color":"#ffffff","Lost":false,"Filters":{"SkirtBack":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":0.55,"red":0.3666666666666667,"green":0.3666666666666667,"blue":0.8166666666666667,"alpha":1},"Skirt":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":0.55,"red":0.3666666666666667,"green":0.3666666666666667,"blue":0.8166666666666667,"alpha":1}}},{"Item":"DressSkirt","Group":"DressSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.16666666666666666,"contrast":1,"brightness":0.7000000000000001,"red":0.3666666666666667,"green":0.3666666666666667,"blue":0.8166666666666667,"alpha":0.7166666666666667}}},{"Item":"LatexCorset","Group":"LatexCorset","Color":"#ffffff","Lost":false,"Filters":{"HeavyCorset":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333},"Corset":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1.2,"red":0.41666666666666663,"green":1,"blue":0.48333333333333334,"alpha":0.9833333333333333},"ShoeRight":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1.2,"red":0.41666666666666663,"green":1,"blue":0.48333333333333334,"alpha":0.9833333333333333}}},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.65,"red":0.7333333333333334,"green":1,"blue":0.8166666666666667,"alpha":0.9833333333333333},"ShoeRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.65,"red":0.7333333333333334,"green":1,"blue":0.8166666666666667,"alpha":0.9833333333333333}}},{"Item":"BunnyLeotardHighUnder","Group":"BunnyLeotardHighUnder","Color":"#ffffff","Lost":false},{"Item":"ElfBra","Group":"ElfBra","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":0.16666666666666666,"contrast":1.0666666666666667,"brightness":0.3,"red":0.3666666666666667,"green":0.3666666666666667,"blue":0.8166666666666667,"alpha":1}}},{"Item":"LatexBustier","Group":"LatexBustier","Color":"#ffffff","Lost":false,"Filters":{"ChestHeavyCorset":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333},"Bra":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":1.5333333333333332,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"LatexNeckCorset","Group":"LatexNeckCorset","Color":"#ffffff","Lost":false,"Filters":{"Neck":{"gamma":1,"saturation":0.06666666666666667,"contrast":1.8666666666666667,"brightness":0.55,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.95},"Rim":{"gamma":1,"saturation":0.06666666666666667,"contrast":1.8666666666666667,"brightness":0.5166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.95}}},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.7000000000000001,"red":1.1500000000000001,"green":0.5666666666666667,"blue":1.4833333333333334,"alpha":0.9833333333333333},"BandRight":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":0.7000000000000001,"red":1.1500000000000001,"green":0.5666666666666667,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"BanditWrist","Group":"BanditWrist","Color":"#ffffff","Lost":false,"Filters":{"WristLeft":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1.0833333333333335,"red":0.8166666666666667,"green":0.8500000000000001,"blue":1.4833333333333334,"alpha":0.9833333333333333},"WristRight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1.0833333333333335,"red":0.8166666666666667,"green":0.8500000000000001,"blue":1.4833333333333334,"alpha":0.9833333333333333}}}], + + Sailor: [{"Item":"Sailor","Group":"Sailor","Color":"#ffffff","Lost":false},{"Item":"MaidShoes","Group":"MaidShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.6166666666666667,"red":0.5666666666666667,"green":0.65,"blue":2.916666666666667,"alpha":1},"ShoeRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.6166666666666667,"red":0.5666666666666667,"green":0.65,"blue":2.916666666666667,"alpha":1}}},{"Item":"NinjaSocks","Group":"NinjaSocks","Color":"#ffffff","Lost":false,"Filters":{"SockLeft":{"gamma":1,"saturation":1,"contrast":0.8500000000000001,"brightness":4.483333333333333,"red":1,"green":1,"blue":1,"alpha":1},"SockRight":{"gamma":1,"saturation":1,"contrast":0.8500000000000001,"brightness":4.483333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LaceBra","Group":"LaceBra","Color":"#ffffff","Lost":false},{"Item":"LacePanties","Group":"LacePanties","Color":"#ffffff","Lost":false,"Filters":{"Panties":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6166666666666667,"green":1,"blue":2.3333333333333335,"alpha":1}}},{"Item":"BanditChoker","Group":"BanditChoker","Color":"#ffffff","Lost":false,"Filters":{"Choker":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BanditLeftWrist","Group":"BanditLeftWrist","Color":"#ffffff","Lost":false}], + + BanditPet: [{"Item":"BanditPouch","Group":"BanditPouch","Color":"#ffffff","Lost":false},{"Item":"BanditKnee","Group":"BanditKnee","Color":"#ffffff","Lost":false},{"Item":"BanditBoots","Group":"BanditBoots","Color":"#ffffff","Lost":false},{"Item":"BanditShorts","Group":"BanditShorts","Color":"#ffffff","Lost":false},{"Item":"FashionBallGag","Group":"FashionBallGag","Color":"#ffffff","Lost":false},{"Item":"FashionLeatherMittens","Group":"FashionLeatherMittens","Color":"#ffffff","Lost":false,"Filters":{"LeatherLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.215686274509804,"green":1.0980392156862746,"blue":0.7843137254901961,"alpha":1},"Mitten":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":1.2156862745098038,"green":0.27450980392156865,"blue":0.29411764705882354,"alpha":1}}},{"Item":"BanditBreastplate","Group":"BanditBreastplate","Color":"#ffffff","Lost":false},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false}], + BanditHunter: [{"Item":"Bandit","Group":"Bandit","Color":"#ffffff","Lost":false},{"Item":"BanditShorts","Group":"BanditShorts","Color":"#ffffff","Lost":false},{"Item":"BanditBoots","Group":"BanditBoots","Color":"#ffffff","Lost":false},{"Item":"FashionClothOTN","Group":"FashionClothOTN","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.3166666666666667,"green":0.25,"blue":0.6333333333333334,"alpha":1.0166666666666666}}},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false}], + BanditChief: [{"Item":"Bandit","Group":"Bandit","Color":"#ffffff","Lost":false},{"Item":"BanditShorts","Group":"BanditShorts","Color":"#ffffff","Lost":false},{"Item":"BanditBoots","Group":"BanditBoots","Color":"#ffffff","Lost":false},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false},{"Item":"Cape","Group":"Cape","Color":"#ffffff","Lost":false,"Filters":{"Front":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":0.23333333333333334,"red":1.75,"green":1.1,"blue":0.6333333333333334,"alpha":1},"Back":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":0.23333333333333334,"red":1.75,"green":1.1,"blue":0.6333333333333334,"alpha":1}}},{"Item":"ClothCollarTag","Group":"ClothCollarTag","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1.2666666666666668,"red":1.75,"green":1.1,"blue":0.6333333333333334,"alpha":1},"CollarTag":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.2833333333333332,"red":1,"green":1,"blue":1,"alpha":1}}}], + BanditGuard: [{"Item":"BanditBoots","Group":"BanditBoots","Color":"#ffffff","Lost":false},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":1},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":1},"BandRight":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.7666666666666666,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.7666666666666666,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":1},"RimLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.6333333333333334,"red":1,"green":1,"blue":1,"alpha":1},"RimRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.6333333333333334,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BanditBreastplate","Group":"BanditBreastplate","Color":"#ffffff","Lost":false},{"Item":"BanditKnee","Group":"BanditKnee","Color":"#ffffff","Lost":false},{"Item":"BanditChoker","Group":"BanditChoker","Color":"#ffffff","Lost":false},{"Item":"Pauldrons","Group":"Pauldrons","Color":"#ffffff","Lost":false,"Filters":{"Pauldrons":{"gamma":1,"saturation":0.06666666666666667,"contrast":0.9166666666666666,"brightness":0.48333333333333334,"red":1,"green":1,"blue":1.3166666666666664,"alpha":1}}},{"Item":"BanditPouch","Group":"BanditPouch","Color":"#ffffff","Lost":false},{"Item":"BanditShorts","Group":"BanditShorts","Color":"#ffffff","Lost":false}], + + Ninja: [{"Item":"Ninja","Group":"Ninja","Color":"#ffffff","Lost":false}], + + Demon: [{"Item":"FlatBalletHeels","Group":"FlatBalletHeels","Color":"#ffffff","Lost":false,"Filters":{"FlatBalletLeft":{"gamma":1,"saturation":0,"contrast":1.44,"brightness":1,"red":0.35294117647058826,"green":0.13725490196078433,"blue":0.6470588235294118,"alpha":1},"Shoe":{"gamma":1,"saturation":0,"contrast":1.44,"brightness":1,"red":0.8431372549019608,"green":0.39215686274509803,"blue":1.607843137254902,"alpha":1},"Sole":{"gamma":1,"saturation":0,"contrast":1.44,"brightness":1,"red":0.5490196078431373,"green":0.19607843137254902,"blue":0.9411764705882353,"alpha":1}}},{"Item":"SportsBra","Group":"SportsBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0,"contrast":1.44,"brightness":1,"red":1.8431372549019607,"green":0.7254901960784313,"blue":3.372549019607843,"alpha":1}}},{"Item":"ClothBelt","Group":"ClothBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0,"contrast":1.27,"brightness":1,"red":1.5294117647058822,"green":0.5490196078431373,"blue":3.784313725490196,"alpha":1}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1.44,"brightness":1,"red":0.7450980392156863,"green":0.3137254901960784,"blue":1.392156862745098,"alpha":1}}},{"Item":"MaidBlouse","Group":"MaidBlouse","Color":"#ffffff","Lost":false,"Filters":{"Blouse":{"gamma":1,"saturation":0,"contrast":1.44,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":0.35294117647058826,"alpha":1}}}], + DemonHeavy: [{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1.5166666666666666,"brightness":3,"red":0.7450980392156863,"green":0.3137254901960784,"blue":1.392156862745098,"alpha":0.9166666666666666}}},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":0.3,"saturation":0.06666666666666667,"contrast":1,"brightness":1.0666666666666667,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.5666666666666667},"BandRight":{"gamma":0.3,"saturation":0.06666666666666667,"contrast":1,"brightness":1.0666666666666667,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.5666666666666667}}},{"Item":"FashionShacklesThigh","Group":"FashionShacklesThigh","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":1.5166666666666666,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"PlateBoots","Group":"PlateBoots","Color":"#ffffff","Lost":false,"Filters":{"BootLeft":{"gamma":0.21666666666666667,"saturation":0.06666666666666667,"contrast":1,"brightness":1.5,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.65},"BootRight":{"gamma":0.21666666666666667,"saturation":0.06666666666666667,"contrast":1,"brightness":1.5,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"GauntletLeft","Group":"GauntletLeft","Color":"#ffffff","Lost":false,"Filters":{"GauntletLeft":{"gamma":0.21666666666666667,"saturation":0.06666666666666667,"contrast":1,"brightness":1.5,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.6}}},{"Item":"GauntletRight","Group":"GauntletRight","Color":"#ffffff","Lost":false,"Filters":{"GauntletRight":{"gamma":0.21666666666666667,"saturation":0.06666666666666667,"contrast":1,"brightness":1.5,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.6}}},{"Item":"ChainBikini","Group":"ChainBikini","Color":"#ffffff","Lost":false,"Filters":{"Bikini":{"gamma":0.21666666666666667,"saturation":0.06666666666666667,"contrast":1,"brightness":4.4,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1.1666666666666667,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"BunnyLeotardHighUnder","Group":"BunnyLeotardHighUnder","Color":"#ffffff","Lost":false,"Filters":{"Leotard":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1.2166666666666668,"red":1,"green":1,"blue":1.35,"alpha":0}}},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":1.2,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.44999999999999996},"Runes":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":0.3833333333333333,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":1.1333333333333333}}}], + + Angel: [{"Item":"Breastplate","Group":"Breastplate","Color":"#ffffff","Lost":false,"Filters":{"Breastplate":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1.2166666666666668,"red":1,"green":1,"blue":1.35,"alpha":1}}},{"Item":"ChainSkirt","Group":"ChainSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1.2166666666666668,"red":1,"green":1,"blue":1.35,"alpha":1}}},{"Item":"FlatBalletHeels","Group":"FlatBalletHeels","Color":"#ffffff","Lost":false,"Filters":{"Shoe":{"gamma":0.95,"saturation":0.2,"contrast":1.0666666666666667,"brightness":1.5166666666666666,"red":2.6,"green":1.7833333333333334,"blue":0.8666666666666667,"alpha":1},"Sole":{"gamma":0.95,"saturation":0.2,"contrast":1.0666666666666667,"brightness":1.5166666666666666,"red":2.6,"green":1.7833333333333334,"blue":0.8666666666666667,"alpha":1}}},{"Item":"PlateBoots","Group":"PlateBoots","Color":"#ffffff","Lost":false,"Filters":{"BootLeft":{"gamma":0.5666666666666667,"saturation":0.21666666666666667,"contrast":1,"brightness":1.2833333333333332,"red":1,"green":1,"blue":2.466666666666667,"alpha":1},"BootRight":{"gamma":0.5666666666666667,"saturation":0.21666666666666667,"contrast":1,"brightness":1.2833333333333332,"red":1,"green":1,"blue":2.466666666666667,"alpha":1}}},{"Item":"BunnyLeotardHighUnder","Group":"BunnyLeotardHighUnder","Color":"#ffffff","Lost":false,"Filters":{"HighLeotard":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":3.1333333333333337,"red":3.7833333333333337,"green":3.7833333333333337,"blue":4.983333333333333,"alpha":1}}},{"Item":"CatsuitTopV","Group":"CatsuitTopV","Color":"#ffffff","Lost":false,"Filters":{"Latex":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.95,"brightness":2.2333333333333334,"red":3.7833333333333337,"green":3.7833333333333337,"blue":4.983333333333333,"alpha":1}}},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false},{"Item":"ElfCirclet","Group":"ElfCirclet","Color":"#ffffff","Lost":false,"Filters":{"Gem":{"gamma":1,"saturation":0.3666666666666667,"contrast":1,"brightness":1,"red":1,"green":1,"blue":4.1,"alpha":1}}},{"Item":"VBikini","Group":"VBikini","Color":"#ffffff","Lost":false,"Filters":{"VBikini":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":1,"red":2.1,"green":1.7166666666666666,"blue":1,"alpha":1}}},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1.2833333333333332,"red":2.5666666666666664,"green":1.2666666666666668,"blue":0.6333333333333334,"alpha":1},"Runes":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":0.7333333333333334,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1,"red":3.156862745098039,"green":2.2941176470588234,"blue":1.1333333333333333,"alpha":1}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.933333333333334,"red":1,"green":1,"blue":1,"alpha":0.06666666666666667},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":4.933333333333334,"red":1,"green":1,"blue":1,"alpha":0.06666666666666667}}}], + + CorrAdv: [{"Item":"ElfPanties","Group":"ElfPanties","Color":"#ffffff","Lost":false},{"Item":"DressBlouse","Group":"DressBlouse","Color":"#ffffff","Lost":false,"Filters":{"SleeveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"SleeveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666},"Blouse":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.9019607843137255,"green":0.9019607843137255,"blue":0.9019607843137255,"alpha":1},"BlouseSkirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.9019607843137255,"green":0.9019607843137255,"blue":0.9019607843137255,"alpha":1},"Neck":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.9019607843137255,"green":0.9019607843137255,"blue":0.9019607843137255,"alpha":1},"Collar":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.9019607843137255,"green":0.9019607843137255,"blue":0.9019607843137255,"alpha":1}}},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":1.4833333333333334,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.44999999999999996},"Runes":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":0.3833333333333333,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":1.1333333333333333}}},{"Item":"FashionShacklesArms","Group":"FashionShacklesArms","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":1.7000000000000002,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.6}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":1.7000000000000002,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.6}}},{"Item":"FashionShacklesThigh","Group":"FashionShacklesThigh","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":1.7000000000000002,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.6}}},{"Item":"FashionThighLink","Group":"FashionThighLink","Color":"#ffffff","Lost":false,"Filters":{"ThighLink":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":1.7000000000000002,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.6}}},{"Item":"FashionAnkleLink","Group":"FashionAnkleLink","Color":"#ffffff","Lost":false,"Filters":{"AnkleLink":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":1.85,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.55}}},{"Item":"DressShoes","Group":"DressShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":2.2333333333333334,"red":0.7333333333333334,"green":0.7333333333333334,"blue":1.3166666666666664,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":2.2333333333333334,"red":0.7333333333333334,"green":0.7333333333333334,"blue":1.3166666666666664,"alpha":1}}},{"Item":"MaidCorset","Group":"MaidCorset","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.3833333333333333,"red":0.6333333333333334,"green":0.65,"blue":0.7333333333333334,"alpha":1}}}], + + Chef: [{"Item":"WarriorBoots","Group":"WarriorBoots","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.55,"contrast":1,"brightness":0.8166666666666667,"red":1,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.55,"contrast":1,"brightness":0.8166666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"RobeSkirt","Group":"RobeSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":4.466666666666667,"red":1.2666666666666668,"green":1.2666666666666668,"blue":1.2833333333333332,"alpha":1}}},{"Item":"DressBlouseBustCropped","Group":"DressBlouseBustCropped","Color":"#ffffff","Lost":false,"Filters":{"Neck":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.8666666666666667,"red":1,"green":1,"blue":1.1,"alpha":1},"Collar":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.8666666666666667,"red":1,"green":1,"blue":1.1,"alpha":1},"Blouse":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.8666666666666667,"red":1,"green":1,"blue":1.1,"alpha":1}}},{"Item":"MaidCorset","Group":"MaidCorset","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0.41666666666666663,"contrast":1,"brightness":0.5166666666666666,"red":1,"green":1,"blue":1.3,"alpha":1}}},{"Item":"ZombieHat","Group":"ZombieHat","Color":"#ffffff","Lost":false,"Filters":{"ZombieHat":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"ZombieHatBand":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":2.466666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidApron","Group":"MaidApron","Color":"#ffffff","Lost":false,"Filters":{"Apron":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BunnyGloves","Group":"BunnyGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.0166666666666666,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.0166666666666666,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}}}], + FunGal: [{"Item":"LaceBustier","Group":"LaceBustier","Color":"#ffffff","Lost":false},{"Item":"ElfTop","Group":"ElfTop","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":0.9166666666666666,"red":1.2166666666666668,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"BalletHeels","Group":"BalletHeels","Color":"#ffffff","Lost":false,"Filters":{"Shoe":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":2,"red":1.4333333333333333,"green":1.0166666666666666,"blue":1.4833333333333334,"alpha":0.9833333333333333},"Sole":{"gamma":1,"saturation":0.13333333333333333,"contrast":1,"brightness":1.1500000000000001,"red":1.2333333333333334,"green":1,"blue":1.7000000000000002,"alpha":0.9833333333333333},"Laces":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":1.7999999999999998,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"BowCorset","Group":"BowCorset","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":1.0833333333333335,"red":1.2166666666666668,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333},"Ruffle":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":0.7333333333333334,"red":1.0833333333333335,"green":0.65,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0},"CorsetStraps":{"gamma":1,"saturation":0.05,"contrast":1.3,"brightness":4.983333333333333,"red":0.41666666666666663,"green":0.43333333333333335,"blue":1.6,"alpha":1.2166666666666668}}},{"Item":"LaceBraDeco","Group":"LaceBraDeco","Color":"#ffffff","Lost":false},{"Item":"ClothCollarTag","Group":"ClothCollarTag","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.05,"contrast":0.8833333333333333,"brightness":1.6500000000000001,"red":0.5666666666666667,"green":0.5666666666666667,"blue":1.8666666666666667,"alpha":0.9833333333333333},"CollarTag":{"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":1.8666666666666667,"red":0.8,"green":0.65,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"LacePanties","Group":"LacePanties","Color":"#ffffff","Lost":false},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":4.983333333333333,"red":1,"green":1,"blue":1,"alpha":0.11666666666666667},"TorsoLower":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":4.983333333333333,"red":1,"green":1,"blue":1,"alpha":0.11666666666666667}}},{"Item":"BanditWrist","Group":"BanditWrist","Color":"#ffffff","Lost":false,"Filters":{"WristLeft":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":1.7000000000000002,"red":0.65,"green":0.5666666666666667,"blue":1.5833333333333333,"alpha":0.9833333333333333},"WristRight":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":1.7000000000000002,"red":0.65,"green":0.5666666666666667,"blue":1.5833333333333333,"alpha":0.9833333333333333}}},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.9166666666666666,"red":1.2666666666666668,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333},"BandRight":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.9166666666666666,"red":1.2666666666666668,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"DressSkirtSplit","Group":"DressSkirtSplit","Color":"#ffffff","Lost":false,"Filters":{"SkirtBack":{"gamma":1,"saturation":0.05,"contrast":1.4333333333333333,"brightness":0.8,"red":0.41666666666666663,"green":0.43333333333333335,"blue":1.1666666666666667,"alpha":1},"Skirt":{"gamma":1,"saturation":0.05,"contrast":1.4333333333333333,"brightness":0.9833333333333333,"red":0.41666666666666663,"green":0.43333333333333335,"blue":1.1666666666666667,"alpha":0.8833333333333333}}},{"Item":"DressSkirt","Group":"DressSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":1.2333333333333334,"red":0.9166666666666666,"green":0.8166666666666667,"blue":1.4833333333333334,"alpha":0.55}}}], + + Pet: [{"Item":"FashionLeatherMittens","Group":"FashionLeatherMittens","Color":"#ffffff","Lost":false,"Filters":{"LeatherLeft":{"gamma":1,"saturation":1,"contrast":1.01,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Mitten":{"gamma":1,"saturation":0,"contrast":0.64,"brightness":1,"red":0.23529411764705882,"green":0.23529411764705882,"blue":0.23529411764705882,"alpha":1}}},{"Item":"StrappyBra","Group":"StrappyBra","Color":"#ffffff","Lost":false,"Filters":{"ChestStrappy":{"gamma":1,"saturation":0,"contrast":0.64,"brightness":1,"red":0.5294117647058824,"green":0.1568627450980392,"blue":0.9215686274509803,"alpha":1},"Bra":{"gamma":1,"saturation":0,"contrast":1.35,"brightness":1,"red":0.8823529411764706,"green":0.803921568627451,"blue":0.8627450980392157,"alpha":1}}},{"Item":"StrappyBikini","Group":"StrappyBikini","Color":"#ffffff","Lost":false,"Filters":{"StrappyLower":{"gamma":1,"saturation":0,"contrast":1.35,"brightness":1,"red":0.8823529411764706,"green":0.803921568627451,"blue":0.8627450980392157,"alpha":1}}},{"Item":"FashionSteelCollar","Group":"FashionSteelCollar","Color":"#ffffff","Lost":false},{"Item":"FashionLeash","Group":"FashionLeash","Color":"#ffffff","Lost":false}], + Jailer: [{"Item":"ZombieHat","Group":"ZombieHat","Color":"#ffffff","Lost":false,"Filters":{"ZombieHat":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"ZombieHatBand":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.7000000000000001,"red":1,"green":1,"blue":1.2833333333333332,"alpha":1}}},{"Item":"WarriorBoots","Group":"WarriorBoots","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.55,"contrast":1,"brightness":0.8166666666666667,"red":1,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.55,"contrast":1,"brightness":0.8166666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"RobeSkirt","Group":"RobeSkirt","Color":"#ffffff","Lost":false},{"Item":"DressBlouseBustCropped","Group":"DressBlouseBustCropped","Color":"#ffffff","Lost":false,"Filters":{"Blouse":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.7333333333333334,"red":0.21666666666666667,"green":0.23333333333333334,"blue":0.3666666666666667,"alpha":1},"Neck":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.7333333333333334,"red":0.21666666666666667,"green":0.23333333333333334,"blue":0.3666666666666667,"alpha":1},"Collar":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.7333333333333334,"red":0.21666666666666667,"green":0.23333333333333334,"blue":0.3666666666666667,"alpha":1}}},{"Item":"MaidCorset","Group":"MaidCorset","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0.41666666666666663,"contrast":1,"brightness":0.5166666666666666,"red":1,"green":1,"blue":1.3,"alpha":1}}},{"Item":"BanditBreastplate","Group":"BanditBreastplate","Color":"#ffffff","Lost":false},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":0},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":0},"BandRight":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.95,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.43333333333333335,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":1},"RimLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.6666666666666666,"red":1,"green":1,"blue":1,"alpha":1},"RimRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.7000000000000001,"red":1,"green":1,"blue":1,"alpha":1}}}], + + MaidforceNinja: [{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Stripe":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidApron","Group":"MaidApron","Color":"#ffffff","Lost":false,"Filters":{"Apron":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.0666666666666667,"alpha":1}}},{"Item":"MaidBlouse","Group":"MaidBlouse","Color":"#ffffff","Lost":false,"Filters":{"Blouse":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.0666666666666667,"alpha":1}}},{"Item":"MaidCorset","Group":"MaidCorset","Color":"#ffffff","Lost":false},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false},{"Item":"MaidBow","Group":"MaidBow","Color":"#ffffff","Lost":false,"Filters":{"Bow":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.95,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionHeartBelt","Group":"FashionHeartBelt","Color":"#ffffff","Lost":false},{"Item":"Cape","Group":"Cape","Color":"#ffffff","Lost":false,"Filters":{"Front":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.26666666666666666,"red":0.9166666666666666,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":1},"Back":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.26666666666666666,"red":0.9166666666666666,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":1}}},{"Item":"ClothCollar","Group":"ClothCollar","Color":"#ffffff","Lost":false},{"Item":"BunnyGloves","Group":"BunnyGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.3,"red":0.7000000000000001,"green":0.7000000000000001,"blue":1.0833333333333335,"alpha":1},"GloveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.3,"red":0.7000000000000001,"green":0.7000000000000001,"blue":1.0833333333333335,"alpha":1}}},{"Item":"FashionGagFabric","Group":"FashionGagFabric","Color":"#ffffff","Lost":false,"Filters":{"Fabric":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.5666666666666667,"red":0.7166666666666667,"green":0.7166666666666667,"blue":1,"alpha":1}}},{"Item":"MaidShoes","Group":"MaidShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.0666666666666667,"alpha":1},"ShoeRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.0666666666666667,"alpha":1}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"StripeSockRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.0666666666666667,"alpha":1},"StripeSockLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.0666666666666667,"alpha":1},"SockRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1},"SockLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}}},{"Item":"FashionChastityBra","Group":"FashionChastityBra","Color":"#ffffff","Lost":false,"Filters":{"Chain":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}}], + Maidforce: [{"Item":"MaidShoes","Group":"MaidShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}}},{"Item":"LaceBra","Group":"LaceBra","Color":"#ffffff","Lost":false,"Filters":{"BraBase":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"BraCups":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"BraStripes":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LacePanties","Group":"LacePanties","Color":"#ffffff","Lost":false,"Filters":{"LaceCrotchPanel":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Panties":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Trim":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Lace":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"BandRight":{"gamma":1,"saturation":0,"contrast":0.9833333333333333,"brightness":0.5,"red":1.05,"green":1,"blue":1,"alpha":1},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"RimRight":{"gamma":2,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1},"RimLeft":{"gamma":2,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1},"BandLeft":{"gamma":1,"saturation":0,"contrast":0.9833333333333333,"brightness":0.5,"red":1.05,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidBow","Group":"MaidBow","Color":"#ffffff","Lost":false,"Filters":{"Bow":{"gamma":1.4000000000000001,"saturation":1,"contrast":1,"brightness":1.25,"red":1,"green":1,"blue":1.1,"alpha":1}}},{"Item":"BowCorsetLongOverbust","Group":"BowCorsetLongOverbust","Color":"#ffffff","Lost":false,"Filters":{"CorsetBust":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1},"RuffleBust":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1},"Corset":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1.2,"red":1,"green":1,"blue":1.1,"alpha":1},"Ruffle":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1.2,"red":1,"green":1,"blue":1.1,"alpha":1}}},{"Item":"DressBlouseBust","Group":"DressBlouseBust","Color":"#ffffff","Lost":false,"Filters":{"BlouseSkirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":0},"Neck":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1},"Collar":{"gamma":1.9,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1},"Blouse":{"gamma":1.9,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false,"Filters":{"BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1},"BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1},"BlouseLiner":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1},"Blouse":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}}},{"Item":"BowCorsetBow","Group":"BowCorsetBow","Color":"#ffffff","Lost":false,"Filters":{"Bow":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1}}},{"Item":"FashionChastityBra","Group":"FashionChastityBra","Color":"#ffffff","Lost":false,"Filters":{"Metal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lining":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Chain":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionHeartBelt","Group":"FashionHeartBelt","Color":"#ffffff","Lost":false,"Filters":{"Metal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lining":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.03333333333333333,"contrast":0.8166666666666667,"brightness":0.65,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"SockLeft":{"gamma":1.5,"saturation":0.016666666666666666,"contrast":1.35,"brightness":3.05,"red":1,"green":1,"blue":1,"alpha":1},"SockRight":{"gamma":1.5,"saturation":0.016666666666666666,"contrast":1.35,"brightness":3.05,"red":1,"green":1,"blue":1,"alpha":1},"StripeSockRight":{"gamma":0.25,"saturation":0.016666666666666666,"contrast":1.25,"brightness":0.6833333333333333,"red":2.8499999999999996,"green":2.1166666666666667,"blue":1,"alpha":1},"StripeSockLeft":{"gamma":0.25,"saturation":0.016666666666666666,"contrast":1.25,"brightness":0.6833333333333333,"red":2.8499999999999996,"green":2.1166666666666667,"blue":1,"alpha":1}}},{"Item":"Cape","Group":"Cape","Color":"#ffffff","Lost":false,"Filters":{"Back":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.23333333333333334,"red":1,"green":1,"blue":1,"alpha":1},"Front":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.23333333333333334,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"Ribbon","Group":"Ribbon","Color":"#ffffff","Lost":false,"Filters":{"RibbonBelt":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.03333333333333333},"RibbonBack":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":2.1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false}], Mummy: [{"Item":"ElfCirclet","Group":"ElfCirclet","Color":"#ffffff","Lost":false},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false},{"Item":"ElfCollar","Group":"ElfCollar","Color":"#ffffff","Lost":false},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.8166666666666667,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.8166666666666667,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333}}},{"Item":"ElfBra","Group":"ElfBra","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.3333333333333333,"red":1,"green":1,"blue":1.7999999999999998,"alpha":0.8666666666666667}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.8166666666666667,"alpha":1}}},{"Item":"ZombieChestTalisman","Group":"ZombieChestTalisman","Color":"#ffffff","Lost":false},{"Item":"FashionBlindfoldBasic","Group":"FashionBlindfoldBasic","Color":"#ffffff","Lost":false,"Filters":{"Blindfold":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.55,"red":1,"green":1,"blue":1.8166666666666667,"alpha":1}}}], + MaidforcePara: [{"Item":"FashionHeartBelt","Group":"FashionHeartBelt","Color":"#ffffff","Lost":false,"Filters":{"Metal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lining":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidApron","Group":"MaidApron","Color":"#ffffff","Lost":false,"Filters":{"Apron":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.3166666666666664,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidCorset","Group":"MaidCorset","Color":"#ffffff","Lost":false},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"StripeSockRight":{"gamma":1,"saturation":1,"contrast":1.9333333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"StripeSockLeft":{"gamma":1,"saturation":1,"contrast":1.9333333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"SockRight":{"gamma":1,"saturation":1,"contrast":1.1500000000000001,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1,"alpha":1},"SockLeft":{"gamma":1,"saturation":1,"contrast":1.1500000000000001,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidBow","Group":"MaidBow","Color":"#ffffff","Lost":false},{"Item":"FashionChastityBra","Group":"FashionChastityBra","Color":"#ffffff","Lost":false,"Filters":{"Chain":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1,"red":1,"green":1,"blue":1,"alpha":0},"Lining":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Metal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidBlouse","Group":"MaidBlouse","Color":"#ffffff","Lost":false,"Filters":{"Blouse":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"RobeSleeveLeft","Group":"RobeSleeveLeft","Color":"#ffffff","Lost":false,"Filters":{"SleeveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":2.9,"red":1.7833333333333334,"green":1.7833333333333334,"blue":1.9500000000000002,"alpha":1}}},{"Item":"RobeSleeveRight","Group":"RobeSleeveRight","Color":"#ffffff","Lost":false,"Filters":{"SleeveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":2.9,"red":1.7833333333333334,"green":1.7833333333333334,"blue":1.9500000000000002,"alpha":1}}},{"Item":"MaidShoes","Group":"MaidShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":1,"contrast":1.1500000000000001,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1,"alpha":1},"Stripe":{"gamma":1,"saturation":1,"contrast":1.1500000000000001,"brightness":1.2666666666666668,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"Glasses","Group":"Glasses","Color":"#ffffff","Lost":false}], + MaidforceHead: [{"Item":"FashionHeartBelt","Group":"FashionHeartBelt","Color":"#ffffff","Lost":false,"Filters":{"Metal":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.1500000000000001,"brightness":1.2666666666666668,"red":1.2833333333333332,"green":1.0833333333333335,"blue":0.7333333333333334,"alpha":1},"Lining":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.0833333333333335,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"RobeSleeveLeft","Group":"RobeSleeveLeft","Color":"#ffffff","Lost":false,"Filters":{"SleeveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":3.25,"red":1.7833333333333334,"green":1.7833333333333334,"blue":1.9500000000000002,"alpha":1}}},{"Item":"RobeSleeveRight","Group":"RobeSleeveRight","Color":"#ffffff","Lost":false,"Filters":{"SleeveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":3.25,"red":1.7833333333333334,"green":1.7833333333333334,"blue":1.9500000000000002,"alpha":1}}},{"Item":"DressSkirtSplit","Group":"DressSkirtSplit","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":0.9166666666666666,"red":1.9500000000000002,"green":1.9500000000000002,"blue":2.25,"alpha":1},"SkirtBack":{"gamma":1,"saturation":0,"contrast":1.5666666666666669,"brightness":0.6666666666666666,"red":1.9500000000000002,"green":1.9500000000000002,"blue":2.3000000000000003,"alpha":1}}},{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":1,"contrast":1.1500000000000001,"brightness":0.6666666666666666,"red":1,"green":1,"blue":1,"alpha":1},"Stripe":{"gamma":1,"saturation":1,"contrast":1.1500000000000001,"brightness":1.2666666666666668,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionChastityBra","Group":"FashionChastityBra","Color":"#ffffff","Lost":false,"Filters":{"Metal":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.1500000000000001,"brightness":1.2666666666666668,"red":1.2833333333333332,"green":1.0833333333333335,"blue":0.7333333333333334,"alpha":1},"Chain":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.1500000000000001,"brightness":2.5,"red":1.2833333333333332,"green":1.0833333333333335,"blue":0.7333333333333334,"alpha":1}}},{"Item":"MaidBlouse","Group":"MaidBlouse","Color":"#ffffff","Lost":false,"Filters":{"Blouse":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ClothCollar","Group":"ClothCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.0166666666666666,"red":1.3833333333333333,"green":0.8,"blue":1,"alpha":1}}},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1.2333333333333334,"red":2.5666666666666664,"green":1.2666666666666668,"blue":0.6333333333333334,"alpha":1},"Runes":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":0.2833333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"CatsuitLowerLowRise","Group":"CatsuitLowerLowRise","Color":"#ffffff","Lost":false,"Filters":{"TorsoLower":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1,"red":0.7666666666666666,"green":0.7666666666666666,"blue":1,"alpha":1}}},{"Item":"Gauntlets","Group":"Gauntlets","Color":"#ffffff","Lost":false,"Filters":{"GauntletRight":{"gamma":0.13333333333333333,"saturation":0.016666666666666666,"contrast":1,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.45,"alpha":1},"GauntletLeft":{"gamma":0.13333333333333333,"saturation":0.016666666666666666,"contrast":1,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.45,"alpha":1}}},{"Item":"MaidShoes","Group":"MaidShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}}], + MaidforceMafia: [{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false},{"Item":"MaidBlouse","Group":"MaidBlouse","Color":"#ffffff","Lost":false},{"Item":"MaidCorset","Group":"MaidCorset","Color":"#ffffff","Lost":false},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false},{"Item":"MaidShoes","Group":"MaidShoes","Color":"#ffffff","Lost":false},{"Item":"Stockings","Group":"Stockings","Color":"#ffffff","Lost":false},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false},{"Item":"MaidBow","Group":"MaidBow","Color":"#ffffff","Lost":false},{"Item":"Maid","Group":"Maid","Color":"#ffffff","Lost":false},{"Item":"FashionHeartBelt","Group":"FashionHeartBelt","Color":"#ffffff","Lost":false,"Filters":{"Metal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lining":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionChastityBra","Group":"FashionChastityBra","Color":"#ffffff","Lost":false,"Filters":{"Metal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lining":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Chain":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1,"red":1,"green":1,"blue":1,"alpha":0},"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.2166666666666668,"red":2.5833333333333335,"green":1.3833333333333333,"blue":1,"alpha":1},"BandRight":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.43333333333333335,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.43333333333333335,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":1},"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.2166666666666668,"red":2.5833333333333335,"green":1.3833333333333333,"blue":1,"alpha":1}}},{"Item":"BanditPouch","Group":"BanditPouch","Color":"#ffffff","Lost":false}], + MaidforceHeavy: [{"Item":"FashionHeartBelt","Group":"FashionHeartBelt","Color":"#ffffff","Lost":false,"Filters":{"Metal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lining":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidApron","Group":"MaidApron","Color":"#ffffff","Lost":false,"Filters":{"Apron":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.3166666666666664,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":1,"contrast":1.1500000000000001,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1,"alpha":1},"Stripe":{"gamma":1,"saturation":1,"contrast":1.1500000000000001,"brightness":1.2666666666666668,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidCorset","Group":"MaidCorset","Color":"#ffffff","Lost":false},{"Item":"MaidCorsetFull","Group":"MaidCorsetFull","Color":"#ffffff","Lost":false},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"StripeSockRight":{"gamma":1,"saturation":1,"contrast":1.9333333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"StripeSockLeft":{"gamma":1,"saturation":1,"contrast":1.9333333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"SockRight":{"gamma":1,"saturation":1,"contrast":1.1500000000000001,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1,"alpha":1},"SockLeft":{"gamma":1,"saturation":1,"contrast":1.1500000000000001,"brightness":1.1666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"Cape","Group":"Cape","Color":"#ffffff","Lost":false,"Filters":{}},{"Item":"ClothCollar","Group":"ClothCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":3.033333333333333,"red":1.7833333333333334,"green":1.7833333333333334,"blue":1.9166666666666667,"alpha":1}}},{"Item":"MaidBow","Group":"MaidBow","Color":"#ffffff","Lost":false},{"Item":"WarriorBoots","Group":"WarriorBoots","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":3.283333333333333,"red":1,"green":1,"blue":1.05,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":3.283333333333333,"red":1,"green":1,"blue":1.05,"alpha":1}}},{"Item":"Goggles","Group":"Goggles","Color":"#ffffff","Lost":false,"Filters":{"Dollmaker":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Goggles":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.7666666666666666,"red":0.3833333333333333,"green":0.3833333333333333,"blue":0.7333333333333334,"alpha":3.0833333333333335}}},{"Item":"FashionCuffsAnkles","Group":"FashionCuffsAnkles","Color":"#ffffff","Lost":false,"Filters":{"Band":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":3.7450980392156863,"green":3.7450980392156863,"blue":3.7450980392156863,"alpha":1}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.05,"brightness":3.5999999999999996,"red":1.4333333333333333,"green":1.4333333333333333,"blue":1.4833333333333334,"alpha":1},"GloveRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.05,"brightness":4.050000000000001,"red":1.4333333333333333,"green":1.4333333333333333,"blue":1.4833333333333334,"alpha":1},"BandRight":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":2,"red":1.3,"green":1.3,"blue":1.35,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1.9666666666666666,"red":1.3,"green":1.3,"blue":1.35,"alpha":1},"RimLeft":{"gamma":1,"saturation":1,"contrast":1.9333333333333333,"brightness":0.55,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionChastityBra","Group":"FashionChastityBra","Color":"#ffffff","Lost":false,"Filters":{"Chain":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1,"red":1,"green":1,"blue":1,"alpha":0},"Lining":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Metal":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1},"Lock":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1500000000000001,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidBlouse","Group":"MaidBlouse","Color":"#ffffff","Lost":false,"Filters":{"Blouse":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.1,"red":1,"green":1,"blue":1,"alpha":1}}}], + + Cleric: [{"Item":"ElfCirclet","Group":"ElfCirclet","Color":"#ffffff","Lost":false},{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false},{"Item":"ElfCollar","Group":"ElfCollar","Color":"#ffffff","Lost":false},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.8166666666666667,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.8166666666666667,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.9333333333333333,"red":0.6333333333333334,"green":0.65,"blue":0.9833333333333333,"alpha":1}}},{"Item":"ElfBra","Group":"ElfBra","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.3333333333333333,"red":1,"green":1,"blue":1.7999999999999998,"alpha":0.8666666666666667}}},{"Item":"Pauldrons","Group":"Pauldrons","Color":"#ffffff","Lost":false},{"Item":"BanditBreastplate","Group":"BanditBreastplate","Color":"#ffffff","Lost":false,"Filters":{"Breastplate":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.65,"red":1,"green":1,"blue":1.7999999999999998,"alpha":0.8666666666666667}}},{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.8166666666666667,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.8166666666666667,"alpha":1}}},{"Item":"ZombieChestTalisman","Group":"ZombieChestTalisman","Color":"#ffffff","Lost":false},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.9333333333333333,"red":0.6333333333333334,"green":0.65,"blue":0.9833333333333333,"alpha":1}}}], + + RebelScum: [{"Item":"Dragonheart","Group":"Dragonheart","Color":"#ffffff","Lost":false},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.933333333333333,"red":1,"green":1,"blue":1,"alpha":0.05}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1.6333333333333333,"red":2.6500000000000004,"green":1.1333333333333333,"blue":0.8166666666666667,"alpha":1}}},{"Item":"Goggles","Group":"Goggles","Color":"#ffffff","Lost":false,"Filters":{"Dollmaker":{"gamma":1,"saturation":0.2833333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Goggles":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.7833333333333334,"red":1.0833333333333335,"green":0.6333333333333334,"blue":0.6333333333333334,"alpha":2.5666666666666664}}},{"Item":"LeatherGloves","Group":"LeatherGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":1},"GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":1},"BandRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1.2833333333333332,"red":2.6500000000000004,"green":1.1333333333333333,"blue":0.8166666666666667,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1.2833333333333332,"red":2.6500000000000004,"green":1.1333333333333333,"blue":0.8166666666666667,"alpha":1}}},{"Item":"DragonCollar","Group":"DragonCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.65,"red":3.033333333333333,"green":1.3,"blue":1,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.95,"red":3.033333333333333,"green":1.3,"blue":1,"alpha":1}}}], + + Fuuka: [{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2352941176470589,"green":0.1568627450980392,"blue":0.19607843137254902,"alpha":1},"Ruffle":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0,"green":0,"blue":0,"alpha":1},"Belt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.8431372549019608,"green":0.058823529411764705,"blue":0.09803921568627451,"alpha":1}}},{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.7058823529411765,"green":0.3137254901960784,"blue":0.21568627450980393,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.7058823529411765,"green":0.3137254901960784,"blue":0.21568627450980393,"alpha":1}}},{"Item":"RobeBra","Group":"RobeBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.450980392156863,"green":0.9803921568627451,"blue":1.0196078431372548,"alpha":1}}},{"Item":"SwimsuitUnder","Group":"SwimsuitUnder","Color":"#ffffff","Lost":false,"Filters":{"Swimsuit":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":3.4901960784313726,"green":3.4313725490196076,"blue":3.5294117647058822,"alpha":0.8999999999999999}}},{"Item":"BlouseCollar","Group":"BlouseCollar","Color":"#ffffff","Lost":false,"Filters":{"BlouseCollar":{"gamma":1,"saturation":0,"contrast":0.71,"brightness":1,"red":2.7254901960784315,"green":2.7254901960784315,"blue":2.7254901960784315,"alpha":1},"Collar":{"gamma":1,"saturation":0,"contrast":0.71,"brightness":1,"red":1.5098039215686274,"green":1.5098039215686274,"blue":1.5098039215686274,"alpha":1}}},{"Item":"RobeSleevesDeco","Group":"RobeSleevesDeco","Color":"#ffffff","Lost":false,"Filters":{"SleeveDecoLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7450980392156863,"green":0.29411764705882354,"blue":0.23529411764705882,"alpha":1},"SleeveDecoRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7450980392156863,"green":0.29411764705882354,"blue":0.23529411764705882,"alpha":1}}},{"Item":"CatsuitTop","Group":"CatsuitTop","Color":"#ffffff","Lost":false},{"Item":"Pauldrons","Group":"Pauldrons","Color":"#ffffff","Lost":false,"Filters":{"Pauldrons":{"gamma":1,"saturation":0,"contrast":0.71,"brightness":1,"red":1.5098039215686274,"green":1.5098039215686274,"blue":1.5098039215686274,"alpha":1}}}], + Fuuka2: [{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2352941176470589,"green":0.1568627450980392,"blue":0.19607843137254902,"alpha":1},"Ruffle":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0,"green":0,"blue":0,"alpha":1},"Belt":{"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1,"red":1.0166666666666666,"green":0.3666666666666667,"blue":0.5666666666666667,"alpha":1}}},{"Item":"WitchShoes","Group":"WitchShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.7058823529411765,"green":0.3137254901960784,"blue":0.21568627450980393,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.7058823529411765,"green":0.3137254901960784,"blue":0.21568627450980393,"alpha":1}}},{"Item":"RobeBra","Group":"RobeBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.1500000000000001,"red":4.450980392156863,"green":0.9803921568627451,"blue":1.0196078431372548,"alpha":1}}},{"Item":"SwimsuitUnder","Group":"SwimsuitUnder","Color":"#ffffff","Lost":false,"Filters":{"Swimsuit":{"gamma":1,"saturation":0,"contrast":0.9333333333333333,"brightness":3.0666666666666664,"red":0.3833333333333333,"green":0.3833333333333333,"blue":0.5833333333333334,"alpha":1.05}}},{"Item":"RobeSleevesDeco","Group":"RobeSleevesDeco","Color":"#ffffff","Lost":false,"Filters":{"SleeveDecoLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7450980392156863,"green":0.29411764705882354,"blue":0.23529411764705882,"alpha":1},"SleeveDecoRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7450980392156863,"green":0.29411764705882354,"blue":0.23529411764705882,"alpha":1}}},{"Item":"CatsuitTop","Group":"CatsuitTop","Color":"#ffffff","Lost":false,"Filters":{"Latex":{"gamma":1.05,"saturation":0.3,"contrast":1,"brightness":2.2,"red":1,"green":1,"blue":1.3666666666666667,"alpha":1}}},{"Item":"Pauldrons","Group":"Pauldrons","Color":"#ffffff","Lost":false,"Filters":{"Pauldrons":{"gamma":1,"saturation":0,"contrast":0.71,"brightness":1,"red":1.5098039215686274,"green":1.5098039215686274,"blue":1.5098039215686274,"alpha":1}}},{"Item":"BlouseCollar","Group":"BlouseCollar","Color":"#ffffff","Lost":false}], + + Dryad: [{"Item":"StrappyBikini","Group":"StrappyBikini","Color":"#ffffff","Lost":false,"Filters":{"StrappyLower":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.21568627450980393,"green":1.392156862745098,"blue":0.17647058823529413,"alpha":1}}},{"Item":"StrappyBra","Group":"StrappyBra","Color":"#ffffff","Lost":false,"Filters":{"ChestStrappy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.49019607843137253,"green":1.2352941176470589,"blue":0.3333333333333333,"alpha":1},"Bra":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.21568627450980393,"green":1.392156862745098,"blue":0.17647058823529413,"alpha":1}}},{"Item":"StrappyHarness","Group":"StrappyHarness","Color":"#ffffff","Lost":false,"Filters":{"Strappy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.21568627450980393,"green":1.392156862745098,"blue":0.17647058823529413,"alpha":1}}},{"Item":"RobeSleevesDeco","Group":"RobeSleevesDeco","Color":"#ffffff","Lost":false,"Filters":{"SleeveDecoLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.21568627450980393,"green":1.392156862745098,"blue":0.17647058823529413,"alpha":1},"SleeveDecoRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.21568627450980393,"green":1.392156862745098,"blue":0.17647058823529413,"alpha":1}}},{"Item":"BanditChoker","Group":"BanditChoker","Color":"#ffffff","Lost":false,"Filters":{"Choker":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.21568627450980393,"green":1.392156862745098,"blue":0.17647058823529413,"alpha":1}}},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.8166666666666667,"red":1,"green":0.6274509803921569,"blue":0.27450980392156865,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.8166666666666667,"red":1,"green":0.6274509803921569,"blue":0.27450980392156865,"alpha":1}}}], + + Dollsmith: [{"Item":"FullVisor","Group":"FullVisor","Color":"#ffffff","Lost":false,"Filters":{"FullVisor":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":3.1833333333333336}}},{"Item":"LatexBra","Group":"LatexBra","Color":"#ffffff","Lost":false,"Filters":{"ChestHeavyCorset":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Bra":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1}}},{"Item":"CatsuitLower","Group":"CatsuitLower","Color":"#ffffff","Lost":false},{"Item":"CatsuitUpper","Group":"CatsuitUpper","Color":"#ffffff","Lost":false},{"Item":"LatexNeckCorset","Group":"LatexNeckCorset","Color":"#ffffff","Lost":false,"Filters":{"NeckCorset":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.8431372549019608,"green":0.8431372549019608,"blue":0.8431372549019608,"alpha":1},"Neck":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.4117647058823529,"green":1.2549019607843137,"blue":1.0784313725490196,"alpha":1}}},{"Item":"LatexCorset","Group":"LatexCorset","Color":"#ffffff","Lost":false,"Filters":{"HeavyCorset":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.607843137254902,"green":0.39215686274509803,"blue":3.0980392156862746,"alpha":1},"Corset":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0,"contrast":0.85,"brightness":1,"red":5,"green":5,"blue":5,"alpha":1}}},{"Item":"DressSkirtSplit","Group":"DressSkirtSplit","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2745098039215685,"green":0.11764705882352941,"blue":0.8823529411764706,"alpha":1},"SkirtBack":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2745098039215685,"green":0.11764705882352941,"blue":0.8823529411764706,"alpha":1}}},{"Item":"RobeSkirt","Group":"RobeSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.607843137254902,"green":0.39215686274509803,"blue":3.0980392156862746,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.607843137254902,"green":1,"blue":0.09803921568627451,"alpha":1}}},{"Item":"RobeSleeves","Group":"RobeSleeves","Color":"#ffffff","Lost":false,"Filters":{"SleeveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.372549019607843,"green":4.392156862745098,"blue":4.176470588235294,"alpha":1},"SleeveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.235294117647059,"green":4.294117647058823,"blue":4.333333333333333,"alpha":1}}},{"Item":"BlouseCollar","Group":"BlouseCollar","Color":"#ffffff","Lost":false,"Filters":{"BlouseCollar":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":2.803921568627451,"green":2.9019607843137254,"blue":0.19607843137254902,"alpha":1},"Collar":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.9411764705882353,"green":0.5882352941176471,"blue":0.058823529411764705,"alpha":1}}},{"Item":"Pauldrons","Group":"Pauldrons","Color":"#ffffff","Lost":false,"Filters":{"Pauldrons":{"gamma":1,"saturation":0,"contrast":0.28,"brightness":1,"red":1.5490196078431373,"green":1.5490196078431373,"blue":1.5490196078431373,"alpha":1}}},{"Item":"WarriorBoots","Group":"WarriorBoots","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0,"contrast":1.02,"brightness":1,"red":1.8627450980392157,"green":0.19607843137254902,"blue":1.3725490196078431,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0,"contrast":1.02,"brightness":1,"red":1.8627450980392157,"green":0.19607843137254902,"blue":1.3725490196078431,"alpha":1}}}], + DollmakerApprentice: [{"Item":"BalletHeels","Group":"BalletHeels","Color":"#ffffff","Lost":false,"Filters":{"Shoe":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Sole":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1}}},{"Item":"FullVisor","Group":"FullVisor","Color":"#ffffff","Lost":false,"Filters":{"FullVisor":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":3.1833333333333336}}},{"Item":"LatexBra","Group":"LatexBra","Color":"#ffffff","Lost":false,"Filters":{"ChestHeavyCorset":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Bra":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1}}},{"Item":"CatsuitLower","Group":"CatsuitLower","Color":"#ffffff","Lost":false},{"Item":"CatsuitUpper","Group":"CatsuitUpper","Color":"#ffffff","Lost":false},{"Item":"LatexNeckCorset","Group":"LatexNeckCorset","Color":"#ffffff","Lost":false,"Filters":{}},{"Item":"LatexCorset","Group":"LatexCorset","Color":"#ffffff","Lost":false,"Filters":{"HeavyCorset":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.607843137254902,"green":0.39215686274509803,"blue":3.0980392156862746,"alpha":1},"Corset":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0,"contrast":0.85,"brightness":1,"red":5,"green":5,"blue":5,"alpha":1}}},{"Item":"DressSkirtSplit","Group":"DressSkirtSplit","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2745098039215685,"green":0.11764705882352941,"blue":0.8823529411764706,"alpha":1},"SkirtBack":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2745098039215685,"green":0.11764705882352941,"blue":0.8823529411764706,"alpha":1}}},{"Item":"RobeSkirt","Group":"RobeSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.607843137254902,"green":0.39215686274509803,"blue":3.0980392156862746,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2745098039215685,"green":0.11764705882352941,"blue":0.8823529411764706,"alpha":1}}}], + Dollmaker: [{"Item":"BalletHeels","Group":"BalletHeels","Color":"#ffffff","Lost":false,"Filters":{"Shoe":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Sole":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1}}},{"Item":"FullVisor","Group":"FullVisor","Color":"#ffffff","Lost":false,"Filters":{"FullVisor":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":3.1833333333333336}}},{"Item":"LatexBra","Group":"LatexBra","Color":"#ffffff","Lost":false,"Filters":{"ChestHeavyCorset":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Bra":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1}}},{"Item":"CatsuitLower","Group":"CatsuitLower","Color":"#ffffff","Lost":false},{"Item":"CatsuitUpper","Group":"CatsuitUpper","Color":"#ffffff","Lost":false},{"Item":"LatexNeckCorset","Group":"LatexNeckCorset","Color":"#ffffff","Lost":false,"Filters":{}},{"Item":"LatexCorset","Group":"LatexCorset","Color":"#ffffff","Lost":false,"Filters":{"HeavyCorset":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.607843137254902,"green":0.39215686274509803,"blue":3.0980392156862746,"alpha":1},"Corset":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0,"contrast":0.85,"brightness":1,"red":5,"green":5,"blue":5,"alpha":1}}},{"Item":"DressSkirtSplit","Group":"DressSkirtSplit","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2745098039215685,"green":0.11764705882352941,"blue":0.8823529411764706,"alpha":1},"SkirtBack":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2745098039215685,"green":0.11764705882352941,"blue":0.8823529411764706,"alpha":1}}},{"Item":"RobeSkirt","Group":"RobeSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.607843137254902,"green":0.39215686274509803,"blue":3.0980392156862746,"alpha":1}}},{"Item":"DragonNecklace","Group":"DragonNecklace","Color":"#ffffff","Lost":false,"Filters":{"Necklace":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2745098039215685,"green":0.11764705882352941,"blue":0.8823529411764706,"alpha":1}}}], + DollsmithDoll: [{"Item":"BalletHeels","Group":"BalletHeels","Color":"#ffffff","Lost":false,"Filters":{"BalletLeft":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Shoe":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.6666666666666665,"green":1,"blue":1.5,"alpha":1},"Sole":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1}}},{"Item":"LatexCorsetFullCross","Group":"LatexCorsetFullCross","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":0.6166666666666667,"red":1.25,"green":0.29411764705882354,"blue":1.4833333333333334,"alpha":1},"Bra":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.6666666666666665,"green":1,"blue":1.5,"alpha":1}}},{"Item":"FashionLeatherMittens","Group":"FashionLeatherMittens","Color":"#ffffff","Lost":false,"Filters":{"Mitten":{"gamma":1,"saturation":1,"contrast":1.7333333333333334,"brightness":0.6666666666666666,"red":1.6666666666666665,"green":0.7833333333333334,"blue":1.5,"alpha":1},"Band":{"gamma":1,"saturation":0,"contrast":1.79,"brightness":1,"red":1.5294117647058822,"green":0.17647058823529413,"blue":1.0784313725490196,"alpha":1},"Lock":{"gamma":1,"saturation":0,"contrast":1.79,"brightness":1,"red":1.5294117647058822,"green":0.17647058823529413,"blue":1.0784313725490196,"alpha":1}}},{"Item":"FashionProtoBelt","Group":"FashionProtoBelt","Color":"#ffffff","Lost":false,"Filters":{"Plug":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Lock":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Display":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Metal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.27450980392156865,"green":0.0392156862745098,"blue":0.35294117647058826,"alpha":1},"Lining":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":2.3333333333333335,"red":0.27450980392156865,"green":0.0392156862745098,"blue":0.35294117647058826,"alpha":1}}},{"Item":"FashionFutureHarness","Group":"FashionFutureHarness","Color":"#ffffff","Lost":false,"Filters":{"Lock":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Display":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.27450980392156865,"green":0.0392156862745098,"blue":0.35294117647058826,"alpha":1},"Straps":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.6666666666666665,"green":1,"blue":1.5,"alpha":1}}},{"Item":"RingVibes","Group":"RingVibes","Color":"#ffffff","Lost":false},{"Item":"FashionBraProto","Group":"FashionBraProto","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Lock":{"gamma":1,"saturation":0,"contrast":0.6799999999999999,"brightness":1,"red":3.176470588235294,"green":0.29411764705882354,"blue":2.2941176470588234,"alpha":1},"Cups":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.27450980392156865,"green":0.0392156862745098,"blue":0.35294117647058826,"alpha":1},"BraProto":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.4509803921568627,"green":0.23529411764705882,"blue":1.3137254901960784,"alpha":1},"Metal":{"gamma":1,"saturation":0,"contrast":2.8499999999999996,"brightness":1,"red":0.27450980392156865,"green":0.0392156862745098,"blue":0.35294117647058826,"alpha":1},"Lining":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":2.3333333333333335,"red":0.27450980392156865,"green":0.0392156862745098,"blue":0.35294117647058826,"alpha":1}}},{"Item":"Catsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"ArmRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.098039215686274,"green":0.9019607843137255,"blue":4.03921568627451,"alpha":0.5333333333333333},"TorsoUpper":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.098039215686274,"green":0.9019607843137255,"blue":4.03921568627451,"alpha":1.0166666666666666},"TorsoLower":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.098039215686274,"green":0.9019607843137255,"blue":4.03921568627451,"alpha":1.0166666666666666}}},{"Item":"FashionIronCollar","Group":"FashionIronCollar","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.27450980392156865,"green":0.0392156862745098,"blue":0.35294117647058826,"alpha":1}}},{"Item":"FashionBallGag","Group":"FashionBallGag","Color":"#ffffff","Lost":false,"Filters":{"Ball":{"gamma":1,"saturation":0,"contrast":1.02,"brightness":1,"red":3.235294117647059,"green":0.23529411764705882,"blue":2.392156862745098,"alpha":1}}}], + + Cyborg: [{"Item":"Goggles","Group":"Goggles","Color":"#ffffff","Lost":false,"Filters":{"Dollmaker":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.17647058823529413,"green":0.23529411764705882,"blue":1.5294117647058822,"alpha":1},"Goggles":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.23529411764705882,"blue":1.5490196078431373,"alpha":2.4333333333333336}}},{"Item":"FlatBalletHeels","Group":"FlatBalletHeels","Color":"#ffffff","Lost":false,"Filters":{"FlatBalletLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.23529411764705882,"blue":1.5490196078431373,"alpha":2.4333333333333336},"Shoe":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.058823529411764705,"green":0.09803921568627451,"blue":0.5686274509803921,"alpha":2.4333333333333336},"Sole":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.0196078431372549,"green":0.058823529411764705,"blue":0.5098039215686274,"alpha":2.4333333333333336}}},{"Item":"FashionBraProto","Group":"FashionBraProto","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.8431372549019608,"green":0.2549019607843137,"blue":0.803921568627451,"alpha":1},"BraProto":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1},"Metal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1},"Lining":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1},"Cups":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1},"Lock":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1}}},{"Item":"FashionCyberBelt","Group":"FashionCyberBelt","Color":"#ffffff","Lost":false,"Filters":{"Cyber":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.0392156862745098,"green":0.058823529411764705,"blue":0.3137254901960784,"alpha":1},"Metal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1},"Lining":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1},"Display":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.8431372549019608,"green":0.2549019607843137,"blue":0.803921568627451,"alpha":1}}},{"Item":"SleevelessCatsuitUpper","Group":"SleevelessCatsuitUpper","Color":"#ffffff","Lost":false,"Filters":{"SleevelessTorsoUpper":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.23529411764705882,"blue":1.5490196078431373,"alpha":2.4333333333333336},"TorsoUpper":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.23529411764705882,"blue":1.5490196078431373,"alpha":2.4333333333333336}}},{"Item":"CatsuitLower","Group":"CatsuitLower","Color":"#ffffff","Lost":false,"Filters":{"TorsoLower":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.23529411764705882,"blue":1.5490196078431373,"alpha":2.4333333333333336}}},{"Item":"FashionFutureHarness","Group":"FashionFutureHarness","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.8431372549019608,"green":0.2549019607843137,"blue":0.803921568627451,"alpha":1},"StrapsLower":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1},"Straps":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1},"Metal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1}}},{"Item":"FutureCollar","Group":"FutureCollar","Color":"#ffffff","Lost":false,"Filters":{"Display":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.8431372549019608,"green":0.2549019607843137,"blue":0.803921568627451,"alpha":1},"Base":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1},"Band":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1},"Rim":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.19607843137254902,"green":0.09803921568627451,"blue":1,"alpha":1}}},{"Item":"WolfGloves","Group":"WolfGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.23529411764705882,"blue":1.5490196078431373,"alpha":2.4333333333333336},"RimLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.058823529411764705,"green":0.13725490196078433,"blue":1.0784313725490196,"alpha":2.4333333333333336},"BandLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7450980392156863,"green":0.5098039215686274,"blue":1.6470588235294117,"alpha":1},"GloveRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.23529411764705882,"blue":1.5490196078431373,"alpha":2.4333333333333336},"RimRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.058823529411764705,"green":0.13725490196078433,"blue":1.0784313725490196,"alpha":2.4333333333333336},"BandRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7450980392156863,"green":0.5098039215686274,"blue":1.6470588235294117,"alpha":1}}}], + + "Elven" : [ + {Item: "Elf", Group: "Uniform", Color: "#ffffff", Lost: false}, + ], + "BlackElven": [{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandRight":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5833333333333334,"red":1,"green":1.9500000000000002,"blue":1,"alpha":1},"BandLeft":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5833333333333334,"red":1,"green":1.9500000000000002,"blue":1,"alpha":1}}},{"Item":"ElfSkirt","Group":"ElfSkirt","Color":"#ffffff","Lost":false,"Filters":{"SkirtBack":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.05,"red":0.2833333333333333,"green":0.26666666666666666,"blue":0.48333333333333334,"alpha":1},"SkirtBand":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5833333333333334,"red":1,"green":1.9500000000000002,"blue":1,"alpha":1},"Skirt":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.05,"red":0.2833333333333333,"green":0.26666666666666666,"blue":0.48333333333333334,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333}}},{"Item":"ElfTop","Group":"ElfTop","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.05,"red":0.2833333333333333,"green":0.26666666666666666,"blue":0.48333333333333334,"alpha":1}}},{"Item":"ElfCollar","Group":"ElfCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.5833333333333334,"red":1,"green":1.9500000000000002,"blue":1,"alpha":1}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.3,"brightness":1.2,"red":1.6500000000000001,"green":2.2941176470588234,"blue":1.4313725490196079,"alpha":1}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":0.8833333333333333,"red":0.95,"green":0.6333333333333334,"blue":0.5,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1,"red":0.95,"green":0.6333333333333334,"blue":0.5,"alpha":1}}},{"Item":"ElfPanties","Group":"ElfPanties","Color":"#ffffff","Lost":false}], + Zombie: [{"Item":"Robes","Group":"Robes","Color":"#ffffff","Lost":false},{"Item":"ZombieHat","Group":"ZombieHat","Color":"#ffffff","Lost":false},{"Item":"ZombieTalisman","Group":"ZombieTalisman","Color":"#ffffff","Lost":false},{"Item":"ZombieChestTalisman","Group":"ZombieChestTalisman","Color":"#ffffff","Lost":false}], + "Elven2": [{"Item":"ElfBands","Group":"ElfBands","Color":"#ffffff","Lost":false,"Filters":{"BandLeft":{"gamma":1,"saturation":0.6666666666666666,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1},"BandRight":{"gamma":1,"saturation":0.6666666666666666,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ElfCirclet","Group":"ElfCirclet","Color":"#ffffff","Lost":false,"Filters":{"Gem":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":0.9833333333333333,"blue":3.95,"alpha":1},"Circlet":{"gamma":1,"saturation":0.8,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ElfCollar","Group":"ElfCollar","Color":"#ffffff","Lost":false,"Filters":{"Collar":{"gamma":1,"saturation":0.6666666666666666,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ElfSkirt","Group":"ElfSkirt","Color":"#ffffff","Lost":false,"Filters":{"SkirtBack":{"gamma":1.0833333333333335,"saturation":0.016666666666666666,"contrast":0.8666666666666667,"brightness":1.5,"red":1.2166666666666668,"green":1.2333333333333334,"blue":1.2166666666666668,"alpha":0.7333333333333334},"Skirt":{"gamma":1.0833333333333335,"saturation":0.016666666666666666,"contrast":0.8666666666666667,"brightness":1.0166666666666666,"red":1.2166666666666668,"green":1.2333333333333334,"blue":1.2166666666666668,"alpha":0.8500000000000001},"SkirtBand":{"gamma":1,"saturation":0.6666666666666666,"contrast":1,"brightness":1.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"RobeBra","Group":"RobeBra","Color":"#ffffff","Lost":false,"Filters":{"Bra":{"gamma":1.0166666666666666,"saturation":0.16666666666666666,"contrast":0.9166666666666666,"brightness":1.0833333333333335,"red":4.983333333333333,"green":4.983333333333333,"blue":4.983333333333333,"alpha":0.8166666666666667}}},{"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false,"Filters":{"ShoeRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.4333333333333333,"red":1,"green":1,"blue":1,"alpha":1},"CrystalShoeLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":3.533333333333333,"alpha":0.95},"CrystalShoeRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":3.533333333333333,"alpha":0.95},"ShoeLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.35,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BunnyGloves","Group":"BunnyGloves","Color":"#ffffff","Lost":false,"Filters":{"GloveLeft":{"gamma":1.0833333333333335,"saturation":0.016666666666666666,"contrast":0.8666666666666667,"brightness":1.0166666666666666,"red":1.2166666666666668,"green":1.2333333333333334,"blue":1.2166666666666668,"alpha":0.8},"GloveRight":{"gamma":1.0833333333333335,"saturation":0.016666666666666666,"contrast":0.8666666666666667,"brightness":1.0166666666666666,"red":1.2166666666666668,"green":1.2333333333333334,"blue":1.2166666666666668,"alpha":0.8}}},{"Item":"FashionShacklesWrists","Group":"FashionShacklesWrists","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1,"red":3.156862745098039,"green":2.2941176470588234,"blue":1.4313725490196079,"alpha":1}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":1,"red":3.156862745098039,"green":2.2941176470588234,"blue":1.4313725490196079,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}},{"Item":"TransparentCatsuit","Group":"Catsuit","Color":"#ffffff","Lost":false,"Filters":{"TorsoUpper":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333},"TorsoLower":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.08333333333333333}}}], + "Obsidian" : [ + {"Item":"ElfBra","Group":"ElfBra","Color":"#ffffff","Lost":false, + "Filters":{"Cloth":{"gamma":1,"saturation":0,"contrast":1.21,"brightness":1,"red":0.29411764705882354,"green":0.0196078431372549,"blue":0.47058823529411764,"alpha":1}}}, + {"Item":"VBikini","Group":"VBikini","Color":"#ffffff","Lost":false, + "Filters":{"VBikini":{"gamma":1,"saturation":0,"contrast":1.21,"brightness":1,"red":0.7843137254901961,"green":0.058823529411764705,"blue":1.2352941176470589,"alpha":1}}}, + {"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false, + "Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1.21,"brightness":1,"red":1.8333333333333333,"green":0.11764705882352941,"blue":2.8823529411764706,"alpha":0.8166666666666667}}}, + {"Item":"BunnySocks","Group":"BunnySocks","Color":"#ffffff","Lost":false, + "Filters":{ + "SockRight":{"gamma":1,"saturation":0,"contrast":1.21,"brightness":1,"red":0.17647058823529413,"green":0.17647058823529413,"blue":0.17647058823529413,"alpha":0.5}, + "SockLeft":{"gamma":1,"saturation":0,"contrast":1.21,"brightness":1,"red":0.17647058823529413,"green":0.17647058823529413,"blue":0.17647058823529413,"alpha":0.5}}}, + {"Item":"ElfShoes","Group":"ElfShoes","Color":"#ffffff","Lost":false, + "Filters":{ + "ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.9019607843137255,"green":0.35294117647058826,"blue":1.6470588235294117,"alpha":1}, + "ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.9019607843137255,"green":0.35294117647058826,"blue":1.6470588235294117,"alpha":1}, + "CrystalShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.8235294117647058,"green":0.17647058823529413,"blue":1.1568627450980393,"alpha":1}, + "CrystalShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.8235294117647058,"green":0.17647058823529413,"blue":1.1568627450980393,"alpha":1}}}, + {"Item":"FashionShacklesArms","Group":"FashionShacklesArms","Color":"#ffffff","Lost":false, + "Filters":{"BaseMetal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.9215686274509803,"green":0.27450980392156865,"blue":1.7254901960784315,"alpha":1}}},{"Item":"FashionSteelCollarRunes","Group":"FashionSteelCollarRunes","Color":"#ffffff","Lost":false,"Filters":{"SteelCollar":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.0784313725490196,"green":0.27450980392156865,"blue":1.7254901960784315,"alpha":1},"BaseMetal":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.9803921568627451,"green":0.23529411764705882,"blue":1.7647058823529411,"alpha":1},"Runes":{"gamma":1,"saturation":0,"contrast":0.56,"brightness":1,"red":4.764705882352941,"green":1.607843137254902,"blue":2.8823529411764706,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.0196078431372548,"green":0.5294117647058824,"blue":1.411764705882353,"alpha":1}}}], + "ElementalDress" : [{"Item":"WarriorSkirt","Group":"WarriorSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.8500000000000001}}},{"Item":"VBikini","Group":"VBikini","Color":"#ffffff","Lost":false,"Filters":{"VBikini":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.9333333333333333,"green":1.7000000000000002,"blue":1,"alpha":1}}},{"Item":"LatexBra","Group":"LatexBra","Color":"#ffffff","Lost":false,"Filters":{"ChestHeavyCorset":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.55,"red":1,"green":1,"blue":1,"alpha":1},"Bra":{"gamma":1,"saturation":1,"contrast":1,"brightness":2.05,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ElfTop","Group":"ElfTop","Color":"#ffffff","Lost":false,"Filters":{"Cloth":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.6,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"WarriorBelt","Group":"WarriorBelt","Color":"#ffffff","Lost":false,"Filters":{"Belt":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1.5833333333333333,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionShacklesArms","Group":"FashionShacklesArms","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1.5833333333333333,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionShacklesThigh","Group":"FashionShacklesThigh","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1.5833333333333333,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionShacklesAnkles","Group":"FashionShacklesAnkles","Color":"#ffffff","Lost":false,"Filters":{"BaseMetal":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1.5833333333333333,"green":1,"blue":1,"alpha":1}}},{"Item":"FashionSteelCollar","Group":"FashionSteelCollar","Color":"#ffffff","Lost":false,"Filters":{"SteelCollar":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1.5833333333333333,"green":1,"blue":1,"alpha":1},"BaseMetal":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":0.7666666666666666,"red":1.5833333333333333,"green":1,"blue":1,"alpha":1}}},{"Item":"Sandals","Group":"Sandals","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":0.5333333333333333,"red":1.5833333333333333,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":0.5333333333333333,"red":1.5833333333333333,"green":1,"blue":1,"alpha":1}}}], + "BindingDress": [{"Item":"DressBlouse","Group":"DressBlouse","Color":"#ffffff","Lost":false,"Filters":{SkirtBack: {"gamma":1,"saturation":0,"contrast":0.5700000000000001,"brightness":1,"red":0.5294117647058824,"green":0.35294117647058826,"blue":0.6470588235294118,"alpha":1}, + "SkirtOverKneel":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.7333333333333334,"red":1.0166666666666666,"green":1,"blue":1.6666666666666665,"alpha":1},"BlouseArmLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.6833333333333333,"alpha":1},"BlouseTorso":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.7333333333333334,"red":1.0166666666666666,"green":1,"blue":1.6666666666666665,"alpha":1},"BlouseSkirt":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.7333333333333334,"red":1.0166666666666666,"green":1,"blue":1.6666666666666665,"alpha":1},"Neck":{"gamma":0.2,"saturation":1,"contrast":1.3,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.16666666666666666},"Blouse":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.5166666666666666,"red":0.8666666666666667,"green":0.8,"blue":2.6500000000000004,"alpha":1},"Skirt":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.5166666666666666,"red":0.8666666666666667,"green":0.8,"blue":2.6500000000000004,"alpha":1},"SleeveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.5166666666666666,"red":0.8666666666666667,"green":0.8,"blue":2.6500000000000004,"alpha":1},"SleeveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.5166666666666666,"red":0.8666666666666667,"green":0.8,"blue":2.6500000000000004,"alpha":1},"Collar":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.5166666666666666,"red":1.7000000000000002,"green":0.8,"blue":2.6500000000000004,"alpha":1}}},{"Item":"MaidCorset","Group":"MaidCorset","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1,"red":1.5833333333333333,"green":1,"blue":2.3499999999999996,"alpha":1}}},{"Item":"WitchSkirt","Group":"WitchSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.5666666666666667,"red":1.2166666666666668,"green":1,"blue":3.033333333333333,"alpha":0.65},"SkirtRuffle":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.5666666666666667,"red":2.916666666666667,"green":1,"blue":3.033333333333333,"alpha":1},"Ruffle":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.5166666666666666,"red":3.6666666666666665,"green":0.65,"blue":2.4333333333333336,"alpha":1}}}], + +}; + + +// Dynamically create dresses +(() => { + let flagged = []; + + for (let key of Object.keys(KDModelDresses)) { + if (!KinkyDungeonOutfitsBase.some((outfit) => {return outfit.name == key || outfit.dress == key})) { + flagged.push({name: key, dress: key, shop: false, rarity: 1},); + } + } + for (let f of flagged) { + KinkyDungeonOutfitsBase.push(f); + } +})(); diff --git a/Data/ModelList.ts b/Data/ModelList.ts new file mode 100644 index 000000000..69df187ee --- /dev/null +++ b/Data/ModelList.ts @@ -0,0 +1,2282 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "CatsuitLower", + TopLevel: false, + Categories: ["Suits"], + Folder: "Catsuit", + Parent: "Catsuit", + Layers: ToLayerMap([ + { Name: "TorsoLower", Layer: "TorsoLower", Pri: 1, + InheritColor: "TorsoLower", + MorphPoses: {Closed: "Closed", Spread: "Spread", Hogtie: "Closed"}, + }, + { Name: "FootRight", Layer: "FootRight", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(FOOTRIGHTPOSES), + }, + { Name: "FootRightKneel", Layer: "FootRightKneel", Pri: 1, + InheritColor: "TorsoLower", + HidePoses: ToMap(["FeetLinked"]), + Poses: ToMap(["Kneel"]), + MorphPoses: {Kneel: ""}, + }, + { Name: "FootLeft", Layer: "FootLeft", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(FOOTLEFTPOSES), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + }, + { Name: "FootLeftHogtie", Layer: "FootLeftHogtie", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(["Hogtie"]), + MorphPoses: {Hogtie: ""}, + }, + { Name: "LegRight", Layer: "LegRight", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(LEGPOSES), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + }, + { Name: "LegLeft", Layer: "LegLeft", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(LEGPOSES), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + }, + { Name: "Butt", Layer: "Butt", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(KNEELPOSES), + }, + ]) +}); + +AddModel({ + Name: "CatsuitLowerLowRise", + TopLevel: false, + Categories: ["Suits"], + Folder: "Catsuit", + Parent: "Catsuit", + Layers: ToLayerMap([ + { Name: "TorsoLowerLowRise", Layer: "TorsoLower", Pri: 1, + InheritColor: "TorsoLower", + MorphPoses: {Closed: "Closed", Spread: "Spread", Hogtie: "Closed"}, + }, + { Name: "FootRight", Layer: "FootRight", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(FOOTRIGHTPOSES), + }, + { Name: "FootRightKneel", Layer: "FootRightKneel", Pri: 1, + InheritColor: "TorsoLower", + HidePoses: ToMap(["FeetLinked"]), + Poses: ToMap(["Kneel"]), + MorphPoses: {Kneel: ""}, + }, + { Name: "FootLeft", Layer: "FootLeft", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(FOOTLEFTPOSES), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + }, + { Name: "FootLeftHogtie", Layer: "FootLeftHogtie", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(["Hogtie"]), + MorphPoses: {Hogtie: ""}, + }, + { Name: "LegRight", Layer: "LegRight", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(LEGPOSES), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + }, + { Name: "LegLeft", Layer: "LegLeft", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(LEGPOSES), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + }, + { Name: "Butt", Layer: "Butt", Pri: 1, + InheritColor: "TorsoLower", + Poses: ToMap(KNEELPOSES), + }, + ]) +}); +AddModel({ + Name: "CatsuitLowerLeotard", + TopLevel: true, + Categories: ["Suits", "Underwear", "Panties"], + Folder: "Catsuit", + Parent: "Catsuit", + Layers: ToLayerMap([ + { Name: "TorsoLowerLeotard", Layer: "Bodysuit", Pri: -20, + InheritColor: "Latex", + }, + ]) +}); + +AddModel({ + Name: "CatsuitUpper", + TopLevel: false, + Parent: "Catsuit", + Categories: ["Suits"], + Folder: "Catsuit", + AddPose: ["HideNipples"], + Layers: ToLayerMap([ + { Name: "ArmRight", Layer: "ArmRight", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMapSubtract(ARMPOSES, [...HIDEARMPOSES], "Hogtie"), + GlobalDefaultOverride: ToMap(["Hogtie", "Front", "Crossed"]), + AppendPose: ToMapDupe(["Hogtie"]), + AppendPoseRequire: ToMap(["Wristtie"]), + }, + { Name: "ArmLeft", Layer: "ArmLeft", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMapSubtract(ARMPOSES, [...HIDEARMPOSES], "Hogtie"), + GlobalDefaultOverride: ToMap(["Hogtie", "Front", "Crossed"]), + AppendPose: ToMapDupe(["Hogtie"]), + AppendPoseRequire: ToMap(["Wristtie"]), + }, + { Name: "ShoulderRight", Layer: "ShoulderRight", Pri: 0, + InheritColor: "TorsoUpper", + Poses: ToMap([...SHOULDERPOSES]), + }, + { Name: "ShoulderLeft", Layer: "ShoulderLeft", Pri: 0, + InheritColor: "TorsoUpper", + Poses: ToMap([...SHOULDERPOSES]), + }, + + { Name: "ForeArmRight", Layer: "ForeArmRight", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMap(FOREARMPOSES), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossArmRight"}, + }, + { Name: "ForeArmLeft", Layer: "ForeArmLeft", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMap(FOREARMPOSES), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossArmLeft"}, + }, + { Name: "HandRight", Layer: "HandRight", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMap(HANDRIGHTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandRight"]), + }, + { Name: "HandLeft", Layer: "HandLeft", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMap(HANDLEFTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandLeft"]), + }, + { Name: "ForeHandRight", Layer: "ForeHandRight", Pri: 1, + Sprite: "HandRight", + InheritColor: "TorsoUpper", + Poses: ToMap(FOREHANDRIGHTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandRight"]), + }, + { Name: "ForeHandLeft", Layer: "ForeHandLeft", Pri: 1, + Sprite: "HandLeft", + InheritColor: "TorsoUpper", + Poses: ToMap(FOREHANDLEFTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandLeft"]), + }, + { Name: "TorsoUpper", Layer: "TorsoUpper", Pri: 1, + InheritColor: "TorsoUpper", + }, + { Name: "Chest", Layer: "CatsuitChest", Pri: 1, + InheritColor: "TorsoUpper", + GlobalDefaultOverride: ToMap(["Hogtie"]), + }, + + ]) +}); +AddModel({ + Name: "SleevelessCatsuitUpper", + TopLevel: false, + Parent: "Catsuit", + Categories: ["Suits"], + Folder: "Catsuit", + AddPose: ["HideNipples"], + Layers: ToLayerMap([ + { Name: "SleevelessTorsoUpper", Layer: "TorsoUpper", Pri: 1, + InheritColor: "TorsoUpper", + }, + { Name: "Chest", Layer: "CatsuitChest", Pri: 1, + InheritColor: "TorsoUpper", + GlobalDefaultOverride: ToMap(["Hogtie"]), + }, + + ]) +}); + + +AddModel({ + Name: "CatsuitTop", + TopLevel: true, + Parent: "Catsuit", + Categories: ["Suits", "Tops", "Bras"], + Folder: "Catsuit", + Layers: ToLayerMap([ + { Name: "SleevelessTop", Layer: "Bodysuit", Pri: -4, + InheritColor: "Latex", + }, + { Name: "SleevelessTopChest", Layer: "SuitChest", Pri: -4, + InheritColor: "Latex", + }, + + ]) +}); +AddModel({ + Name: "CatsuitTopV", + TopLevel: true, + Parent: "Catsuit", + Categories: ["Suits", "Tops", "Bras"], + Folder: "Catsuit", + Layers: ToLayerMap([ + { Name: "SleevelessTopV", Layer: "Bodysuit", Pri: -3.5, + InheritColor: "Latex", + }, + { Name: "SleevelessTopVChest", Layer: "SuitChest", Pri: -3.5, + InheritColor: "Latex", + }, + + ]) +}); + +AddModel({ + Name: "CatsuitUpperCropped", + TopLevel: false, + Parent: "Catsuit", + Categories: ["Suits"], + Folder: "Catsuit", + AddPose: ["HideNipples"], + Layers: ToLayerMap([ + { Name: "ArmRight", Layer: "ArmRight", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMapSubtract(ARMPOSES, [...HIDEARMPOSES], "Hogtie"), + GlobalDefaultOverride: ToMap(["Hogtie", "Front", "Crossed"]), + AppendPose: ToMapDupe(["Hogtie"]), + AppendPoseRequire: ToMap(["Wristtie"]), + }, + { Name: "ArmLeft", Layer: "ArmLeft", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMapSubtract(ARMPOSES, [...HIDEARMPOSES], "Hogtie"), + GlobalDefaultOverride: ToMap(["Hogtie", "Front", "Crossed"]), + AppendPose: ToMapDupe(["Hogtie"]), + AppendPoseRequire: ToMap(["Wristtie"]), + }, + { Name: "ShoulderRight", Layer: "ShoulderRight", Pri: 0, + InheritColor: "TorsoUpper", + Poses: ToMap([...SHOULDERPOSES]), + }, + { Name: "ShoulderLeft", Layer: "ShoulderLeft", Pri: 0, + InheritColor: "TorsoUpper", + Poses: ToMap([...SHOULDERPOSES]), + }, + + { Name: "ForeArmRight", Layer: "ForeArmRight", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMap(FOREARMPOSES), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossArmRight"}, + }, + { Name: "ForeArmLeft", Layer: "ForeArmLeft", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMap(FOREARMPOSES), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossArmLeft"}, + }, + { Name: "HandRight", Layer: "HandRight", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMap(HANDRIGHTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandRight"]), + }, + { Name: "HandLeft", Layer: "HandLeft", Pri: 1, + InheritColor: "TorsoUpper", + Poses: ToMap(HANDLEFTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandLeft"]), + }, + { Name: "ForeHandRight", Layer: "ForeHandRight", Pri: 1, + Sprite: "HandRight", + InheritColor: "TorsoUpper", + Poses: ToMap(FOREHANDRIGHTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandRight"]), + }, + { Name: "ForeHandLeft", Layer: "ForeHandLeft", Pri: 1, + Sprite: "HandLeft", + InheritColor: "TorsoUpper", + Poses: ToMap(FOREHANDLEFTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandLeft"]), + }, + { Name: "TorsoUpperCrop", Layer: "TorsoUpper", Pri: 1, + InheritColor: "TorsoUpper", + }, + { Name: "Chest", Layer: "CatsuitChest", Pri: 1, + InheritColor: "TorsoUpper", + GlobalDefaultOverride: ToMap(["Hogtie"]), + }, + + ]) +}); + + +AddModel({ + Name: "Catsuit", + TopLevel: true, + Categories: ["Suits"], + Folder: "Catsuit", + Group: "Catsuit", + AddPose: ["HideNipples"], + Layers: ToLayerMap([ + ...GetModelLayers("CatsuitUpper"), + ...GetModelLayers("CatsuitLower"), + ]) +}); + + + +AddModel({ + Name: "TransparentCatsuitUpper", + TopLevel: false, + Parent: "TransparentCatsuit", + Categories: ["Suits"], + Folder: "Catsuit", + Filters: { + TorsoUpper: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + TorsoLower: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + }, + Layers: ToLayerMap([ + ...GetModelLayersNoOverride("CatsuitUpper"), + ]), +}); +AddModel({ + Name: "TransparentCatsuitUpperCropped", + TopLevel: false, + Parent: "TransparentCatsuit", + Categories: ["Suits"], + Folder: "Catsuit", + Filters: { + TorsoUpper: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + TorsoLower: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + }, + Layers: ToLayerMap([ + ...GetModelLayersNoOverride("CatsuitUpperCropped"), + ]), +}); + +AddModel({ + Name: "TransparentCatsuitLower", + TopLevel: false, + Parent: "TransparentCatsuit", + Categories: ["Suits"], + Folder: "Catsuit", + Filters: { + TorsoUpper: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + TorsoLower: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + }, + Layers: ToLayerMap([ + ...GetModelLayersNoOverride("CatsuitLower"), + ]), +}); + + +AddModel({ + Name: "TransparentCatsuitLowerLeotard", + TopLevel: true, + Categories: ["Suits", "Underwear", "Panties"], + Folder: "Catsuit", + Parent: "Catsuit", + Filters: { + TorsoUpper: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + TorsoLower: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + }, + Layers: ToLayerMap([ + { Name: "TorsoLowerLeotard", Layer: "Bodysuit", Pri: -20, + InheritColor: "Latex", + //MorphPoses: {Closed: "Closed", Spread: "Spread", Hogtie: "Closed"}, + }, + ]) +}); + +AddModel({ + Name: "TransparentCatsuitLowerLowRise", + TopLevel: false, + Parent: "TransparentCatsuit", + Categories: ["Suits"], + Folder: "Catsuit", + Filters: { + TorsoUpper: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + TorsoLower: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + }, + Layers: ToLayerMap([ + ...GetModelLayersNoOverride("CatsuitLowerLowRise"), + ]), +}); + +AddModel({ + Name: "TransparentCatsuit", + TopLevel: true, + Categories: ["Suits"], + Folder: "Catsuit", + Group: "Catsuit", + Filters: { + TorsoUpper: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + TorsoLower: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5333333333333333}, + }, + Layers: ToLayerMap([ + ...GetModelLayersNoOverride("Catsuit"), + ]), +}); + +AddModel({ + Name: "Labcoat", + Folder: "Labcoat", + TopLevel: true, + Categories: ["Tops", "Accessories"], + Layers: ToLayerMap([ + // Duplicate yoked is to override Closed override + { Name: "Shoulders", Layer: "Shoulders", Pri: 10, + Poses: ToMap(["Yoked", "Up", "Spread", "Closed", "Kneel", "KneelClosed"]), + InheritColor: "Coat", + MorphPoses: {Yoked: "Yoked", Closed: "Spread"}, + }, + { Name: "ShouldersHogtie", Layer: "Shoulders", Pri: 10, + Poses: ToMapSubtract([...ARMPOSES, "Hogtie"], ["Wristtie", "Yoked", "Up"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + HidePoses: ToMap(["Spread", "Closed", "Yoked", "Up"]), + InheritColor: "Coat", + MorphPoses: {Boxtie: "Free", Free: "Free", Hogtie: ""}, + }, + { Name: "Coat", Layer: "Coat", Pri: 0, + Poses: ToMap(["Kneel", "KneelClosed", "Yoked", "Spread", "Closed"]), + HidePoses: ToMap(["Hogtie"]), + MorphPoses: {Closed: "Spread"}, + }, + // This one is weird, its just a special case + { Name: "CoatHogtieFree", Layer: "Cape", Pri: 0, + Poses: ToMap(["Hogtie"]), + HidePoses: ToMap(["Wristtie"]), + InheritColor: "Coat", + MorphPoses: {Hogtie: ""}, + }, + { Name: "Cape", Layer: "Cape", Pri: 0, + Poses: ToMap(["Hogtie", "Kneel", "KneelClosed", "Yoked", "Spread", "Closed"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + MorphPoses: {Closed: "Spread"}, + }, + ]) +}); + +AddModel({ + Name: "Cape", + Folder: "Cape", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + // Duplicate yoked is to override Closed override + { Name: "Shoulders", Layer: "Shoulders", Pri: 10, + Poses: ToMap(["Yoked", "Up", "Spread", "Closed", "Kneel", "KneelClosed"]), + InheritColor: "Front", + MorphPoses: {Yoked: "Yoked", Closed: "Spread"}, + }, + { Name: "ShouldersHogtie", Layer: "Shoulders", Pri: 10, + Poses: ToMapSubtract([...ARMPOSES, "Hogtie"], ["Wristtie", "Yoked", "Up"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + HidePoses: ToMap(["Spread", "Closed", "Yoked", "Up"]), + InheritColor: "Front", + MorphPoses: {Boxtie: "Free", Free: "Free", Hogtie: ""}, + }, + { Name: "Cape", Layer: "Cape", Pri: 0, + Poses: ToMap(["Hogtie", "Kneel", "KneelClosed", "Yoked", "Spread", "Closed"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + MorphPoses: {Closed: "Spread"}, + InheritColor: "Back", + }, + ]) +}); + + +AddModel({ + Name: "Pauldrons", + Folder: "ArmorPlate", + Parent: "PlateArmor", + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "Pauldrons", Layer: "Shoulders", Pri: 80, + Poses: ToMapSubtract([...ARMPOSES], [...HIDEARMPOSES, "Up"], "Hogtie"), + MorphPoses: {Yoked: "Yoked", Hogtie: "Hogtie", Wristtie: "Free", Boxtie: "Free", Front: "Free", Crossed: "Free"}, + HideWhenOverridden: true, + HidePoseConditional: [ + ["DynamicArmor", "ArmArmor", "SuppressDynamic"], + ], + }, + ]) +}); +AddModel({ + Name: "Breastplate", + Folder: "ArmorPlate", + Parent: "PlateArmor", + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "Breastplate", Layer: "Chestplate", Pri: 25, + Poses: ToMap([...ARMPOSES, "Hogtie"]), + HideWhenOverridden: true, + MorphPoses: {Hogtie: "Hogtie"}, + Invariant: true, + DisplacementSprite: "Breastplate", + DisplaceAmount: 20, + DisplaceLayers: ToMap(["Breastplate"]), + HidePoseConditional: [ + ["DynamicArmor", "ChestArmor", "SuppressDynamic"], + ], + }, + ]) +}); + + +AddModel({ + Name: "PlateBoots", + Folder: "ArmorPlate", + Parent: "PlateArmor", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + { Name: "BootLeft", Layer: "ShoeLeft", Pri: 25, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + HideWhenOverridden: true, + NoDisplace: true, + DisplacementPosesExclude: ["Hogtie"], + DisplacementSprite: "Boots", + DisplaceAmount: 10, + DisplaceLayers: ToMap(["Boots"]), + DisplaceZBonus: 100, + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + }, + { Name: "BootRight", Layer: "ShoeRight", Pri: 25, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "Kneel", "KneelClosed"]), + HideWhenOverridden: true, + NoDisplace: true, + + DisplacementSprite: "BalletCuffs", + DisplaceZBonus: 10000, + DisplaceAmount: 20, + DisplaceLayers: ToMap(["BalletHeelsCuffs"]), + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + }, + { Name: "BootRightKneel", Layer: "ShoeRightKneel", Pri: 25, + Poses: ToMap(["Kneel"]), + HidePoses: ToMap(["FeetLinked"]), + HideWhenOverridden: true, + InheritColor: "BootRight", + Invariant: true, + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + }, + { Name: "FootBootLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 25, + Poses: ToMap(["Hogtie"]), + HideWhenOverridden: true, + InheritColor: "BootLeft", + Invariant: true, + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + }, + ]) +}); + + +AddModel({ + Name: "GauntletLeft", + Folder: "ArmorPlate", + Parent: "PlateArmor", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GauntletLeft", Layer: "GloveLeft", Pri: 15, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + SwapLayerPose: {Front: "ForeGloveLeft", Crossed: "CrossGloveLeft"}, + HideWhenOverridden: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HidePoseConditional: [ + ["DynamicArmor", "GlovesArmor", "SuppressDynamic"], + ], + }, + ]) +}); + + +AddModel({ + Name: "GauntletRight", + Folder: "ArmorPlate", + Parent: "PlateArmor", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GauntletRight", Layer: "GloveRight", Pri: 15, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Up"]), + SwapLayerPose: {Front: "ForeGloveRight", Crossed: "CrossGloveRight"}, + HideWhenOverridden: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HidePoseConditional: [ + ["DynamicArmor", "GlovesArmor", "SuppressDynamic"], + ], + }, + ]) +}); + +AddModel({ + Name: "Gauntlets", + Folder: "ArmorPlate", + Parent: "PlateArmor", + TopLevel: true, + Categories: ["Gloves"], + Layers: ToLayerMap([ + ...GetModelLayers("GauntletRight"), + ...GetModelLayers("GauntletLeft"), + ]) +}); + +AddModel({ + Name: "PlateArmor", + Folder: "ArmorPlate", + TopLevel: true, + Categories: ["Armor"], + Layers: ToLayerMap([ + ...GetModelLayers("Breastplate"), + ...GetModelLayers("Pauldrons"), + ...GetModelLayers("PlateBoots"), + ...GetModelLayers("Gauntlets"), + ]) +}); + +AddModel({ + Name: "ChainShirt", + Folder: "ArmorChain", + Parent: "ChainArmor", + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "Shirt", Layer: "Shirt", Pri: -40, + //swaplayerpose: {Kneel: "CorsetLinerLower", KneelClosed: "CorsetLinerLower"}, + Poses: ToMap([...ARMPOSES, "Hogtie"]), + MorphPoses: {Hogtie: "Hogtie"}, + Invariant: true, + HidePoseConditional: [ + ["DynamicArmor", "TorsoArmor", "SuppressDynamic"], + ], + }, + { Name: "ShirtChest", Layer: "ShirtChest", Pri: 5, + Poses: ToMap([...ARMPOSES, "Hogtie"]), + MorphPoses: {Hogtie: "Hogtie", Up: "Up", Free: "Free", Yoked: "Free"}, + InheritColor: "Shirt", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + NoOverride: true, + HidePoseConditional: [ + ["DynamicArmor", "TorsoArmor", "SuppressDynamic"], + ], + }, + ]) +}); +AddModel({ + Name: "ChainBikini", + Folder: "ArmorChain", + Parent: "ChainArmor", + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "ShirtChest", Layer: "ShirtChest", Pri: 5.5, + Poses: ToMap([...ARMPOSES, "Hogtie"]), + MorphPoses: {Hogtie: "Hogtie", Up: "Up", Free: "Free", Yoked: "Free"}, + InheritColor: "Bikini", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + NoOverride: true, + HidePoseConditional: [ + ["DynamicArmor", "TorsoArmor", "SuppressDynamic"], + ], + }, + ]) +}); + + +AddModel({ + Name: "ChainSkirt2", + Folder: "ArmorChain", + Parent: "ChainArmor", + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "SkirtBelt", Layer: "OverSkirt", Pri: 15.1, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Hogtie: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + NoOverride: true, + InheritColor: "Belt", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + { Name: "SkirtBeltDeco", Layer: "OverSkirt", Pri: 15.2, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Hogtie: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + TieToLayer: "SkirtBelt", + InheritColor: "Insignia", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + { Name: "SkirtBeltRivets", Layer: "OverSkirt", Pri: 15.2, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Hogtie: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + TieToLayer: "SkirtBelt", + InheritColor: "Rivets", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + { Name: "Skirt2", Layer: "OverSkirt", Pri: 15, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Hogtie: "Hogtie", Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + InheritColor: "Skirt", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + ]) +}); + + +AddModel({ + Name: "ChainSkirt", + Folder: "ArmorChain", + Parent: "ChainArmor", + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "OverSkirt", Pri: 15.3, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Hogtie: "Hogtie", Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + InheritColor: "Plate", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + { Name: "SkirtBelt", Layer: "OverSkirt", Pri: 15.1, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Hogtie: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + NoOverride: true, + InheritColor: "Belt", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + { Name: "SkirtBeltDeco", Layer: "OverSkirt", Pri: 15.2, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Hogtie: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + TieToLayer: "SkirtBelt", + InheritColor: "Insignia", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + { Name: "SkirtBeltRivets", Layer: "OverSkirt", Pri: 15.2, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Hogtie: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + TieToLayer: "SkirtBelt", + InheritColor: "Rivets", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + { Name: "Skirt2", Layer: "OverSkirt", Pri: 15, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Hogtie: "Hogtie", Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + InheritColor: "Skirt", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + ]) +}); + +AddModel({ + Name: "ChainPanties", + Folder: "ArmorChain", + Parent: "ChainArmor", + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "Panties", Layer: "CrotchPanelMid", Pri: 15, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Closed: "Closed", Hogtie: "Closed", Kneel: "Kneel", KneelClosed: "KneelClosed"}, + Invariant: true, + InheritColor: "Panties", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + { Name: "PantiesChain", Layer: "CrotchPanelMid", Pri: 14.9, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Closed: "Closed", Hogtie: "Closed"}, + Invariant: true, + InheritColor: "Chain", + TieToLayer: "Panties", + }, + ]) +}); + + +AddModel({ + Name: "ChainPanties2", + Folder: "ArmorChain", + Parent: "ChainArmor", + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "Panties", Layer: "CrotchPanelMid", Pri: 15, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Closed: "Closed", Hogtie: "Closed", Kneel: "Kneel", KneelClosed: "KneelClosed"}, + Invariant: true, + InheritColor: "Panties", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + { Name: "PantiesChain", Layer: "CrotchPanelMid", Pri: 14.9, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Closed: "Closed", Hogtie: "Closed"}, + Invariant: true, + InheritColor: "Chain", + TieToLayer: "Panties", + }, + { Name: "Skirt", Layer: "OverSkirt", Pri: 15.3, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Hogtie: "Hogtie", Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + InheritColor: "Plate", + HidePoseConditional: [ + ["DynamicArmor", "PelvisArmor", "SuppressDynamic"], + ], + }, + ]) +}); + +AddModel({ + Name: "ChainArmor", + Folder: "ArmorChain", + TopLevel: true, + Categories: ["Armor"], + Layers: ToLayerMap([ + ...GetModelLayers("ChainShirt"), + ...GetModelLayers("ChainSkirt"), + ]) +}); + +AddModel({ + Name: "BanditPouch", + Folder: "Bandit", + Parent: "Bandit", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Pouch", Layer: "PantsAccRight", Pri: 14, + Poses: ToMap([...LEGPOSES]), + }, + ]) +}); + +AddModel({ + Name: "BanditKnee", + Folder: "Bandit", + Parent: "Bandit", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Knee", Layer: "KneeAccLeft", Pri: 15, + Poses: ToMap([...LEGPOSES]), + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "BanditChoker", + Folder: "Bandit", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Choker", Layer: "Collar", Pri: 3, + Invariant: true, + HideWhenOverridden: true, + }, + ]) +}); + +AddModel({ + Name: "BanditLeftWrist", + Folder: "Bandit", + Parent: "BanditWrist", + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "WristLeft", Layer: "WristLeft", Pri: 7, + Poses: ToMapSubtract([...ARMPOSES], [...WRISTHIDELEFT]), + }, + ]) +}); + +AddModel({ + Name: "BanditRightWrist", + Folder: "Bandit", + Parent: "BanditWrist", + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "WristRight", Layer: "WristRight", Pri: 7, + Poses: ToMapSubtract([...ARMPOSES], [...WRISTHIDERIGHT]), + }, + ]) +}); + +AddModel({ + Name: "BanditWrist", + Folder: "Bandit", + Parent: "Bandit", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("BanditLeftWrist"), + ...GetModelLayers("BanditRightWrist"), + ]) +}); + + + +AddModel({ + Name: "BanditBoots", + Folder: "Bandit", + Parent: "Bandit", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + { Name: "ShoeLeft", Layer: "ShoeLeft", Pri: 1, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + NoDisplace: true, + HideWhenOverridden: true, + DisplacementSprite: "BootsShort", + DisplaceAmount: 30, + DisplaceLayers: ToMap(["Boots"]), + DisplaceZBonus: 100, + }, + { Name: "ShoeRight", Layer: "ShoeRight", Pri: 1, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "Kneel", "KneelClosed"]), + NoDisplace: true, + HideWhenOverridden: true, + }, + { Name: "ShoeRightKneel", Layer: "ShoeRightKneel", Pri: 1, + Poses: ToMap(["Kneel"]), + Invariant: true, + NoDisplace: true, + InheritColor: "ShoeRight", + HideWhenOverridden: true, + }, + { Name: "ShoeLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 1, + Poses: ToMap(["Hogtie"]), + Invariant: true, + NoDisplace: true, + InheritColor: "ShoeLeft", + HideWhenOverridden: true, + }, + ]) +}); + +AddModel({ + Name: "BanditBreastplate", + Folder: "Bandit", + Parent: "Bandit", + Categories: ["Armor"], + TopLevel: true, + Layers: ToLayerMap([ + { Name: "Breastplate", Layer: "Chestplate", Pri: 24, + Poses: ToMap([...ARMPOSES, "Hogtie"]), + HideWhenOverridden: true, + MorphPoses: {Hogtie: "Hogtie"}, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "Bandit", + Folder: "Bandit", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("BanditShorts"), + ...GetModelLayers("BanditBreastplate"), + ...GetModelLayers("BanditWrist"), + ...GetModelLayers("BanditPouch"), + ...GetModelLayers("BanditKnee"), + ...GetModelLayers("BanditChoker"), + ...GetModelLayers("BanditBoots"), + ]) +}); + + + +AddModel({ + Name: "MaidSkirt", + Folder: "Maid", + Parent: "Maid", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "Skirt", Pri: 14, + Poses: ToMap([...LEGPOSES]), + HideWhenOverridden: true, + //swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + MorphPoses: {Hogtie: "Closed", Closed: "Closed", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "Stripe", Layer: "Skirt", Pri: 14.1, + TieToLayer: "Skirt", + NoOverride: true, + Poses: ToMap([...LEGPOSES]), + //swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + MorphPoses: {Hogtie: "Closed", Closed: "Closed", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + }, + /*{ Name: "SkirtOver", Layer: "SkirtOver", Pri: 7, + Poses: ToMap([...KNEELPOSES]), + //RequirePoses: ToMap(["CrotchStrap"]), + TieToLayer: "Skirt", NoOverride: true, + InheritColor: "Skirt", + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + { Name: "StripeOver", Layer: "Skirt", Pri: 7.1, + Poses: ToMap([...KNEELPOSES]), + //RequirePoses: ToMap(["CrotchStrap"]), + TieToLayer: "Skirt", NoOverride: true, + InheritColor: "Stripe", + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + },*/ + ]) +}); + +AddModel({ + Name: "MaidApron", + Folder: "Maid", + Parent: "Maid", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Apron", Layer: "BeltDeco", Pri: 30, + Poses: ToMap([...LEGPOSES]), + HideWhenOverridden: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "MaidBlouse", + Folder: "Maid", + Parent: "Maid", + TopLevel: true, + RemovePoses: ["EncaseTorsoUpper"], + Categories: ["Tops"], + Layers: ToLayerMap([ + { Name: "Blouse", Layer: "CorsetLiner", Pri: 3, + //swaplayerpose: {Kneel: "CorsetLinerLower", KneelClosed: "CorsetLinerLower"}, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + Invariant: true, + }, + { Name: "BlouseBust", Layer: "ShirtChest", Pri: 3, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + InheritColor: "Blouse", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "MaidBow", + Folder: "Maid", + Parent: "Maid", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Bow", Layer: "CollarAcc", Pri: 1, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "MaidCorset", + Folder: "Maid", + Parent: "Maid", + TopLevel: true, + Categories: ["Corsets"], + Layers: ToLayerMap([ + { Name: "Corset", Layer: "Bustier", Pri: 25, + //SwapLayerPose: {Pants: "CorsetUnder"}, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + NoOverride: true, + Invariant: true, + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + }, + ]) +}); +AddModel({ + Name: "MaidCorsetFull", + Folder: "Maid", + Parent: "Maid", + TopLevel: true, + Categories: ["Corsets"], + Layers: ToLayerMap([ + ...GetModelLayers("MaidCorset"), + { Name: "CorsetStraps", Layer: "Straps", Pri: 1, + Poses: ToMap([...ARMPOSES]), + MorphPoses: {Boxtie: "Boxtie", Wristtie: "Boxtie"}, + Invariant: true, + }, + ]) +}); + + + +AddModel({ + Name: "StockingLeft", + Folder: "Maid", + Parent: "Stockings", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockLeft", Layer: "StockingLeft", Pri: 1, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingLeft: true,}, + DisplacementSprite: "SockLSquish_Long", + DisplaceAmount: 10, + }, + { Name: "FootSockLeftHogtie", Layer: "SockLeftHogtie", Pri: 1, + Poses: ToMap(["Hogtie"]), + InheritColor: "SockLeft", + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "StockingRight", + Folder: "Maid", + Parent: "Stockings", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockRight", Layer: "StockingRight", Pri: 1, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingRight: true,}, + DisplacementSprite: "SockRSquish_Long", + DisplaceAmount: 10, + }, + { Name: "FootSockRightKneel", Layer: "SockRightKneel", Pri: 1, + HidePoses: ToMap(["FeetLinked"]), + Poses: ToMap(["Kneel"]), + InheritColor: "SockRight", + Invariant: true, + }, + ]) +}); + + + +AddModel({ + Name: "MaidSockLeft", + Folder: "Maid", + Parent: "MaidSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + ...GetModelLayers("StockingLeft"), + { Name: "StripeSockLeft", Layer: "StockingLeft", Pri: 1.1, + NoOverride: true, TieToLayer: "SockLeft", + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + }, + ]) +}); +AddModel({ + Name: "MaidSockRight", + Folder: "Maid", + Parent: "MaidSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + + ...GetModelLayers("StockingRight"), + { Name: "StripeSockRight", Layer: "StockingRight", Pri: 1.1, + NoOverride: true, TieToLayer: "SockRight", + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + }, + ]) +}); + +AddModel({ + Name: "MaidShoes", + Folder: "Maid", + Parent: "Maid", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + { Name: "ShoeLeft", Layer: "ShoeLeft", Pri: 1, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie"]), + //GlobalDefaultOverride: ToMap(["KneelClosed"]), + HideWhenOverridden: true, + }, + { Name: "ShoeRight", Layer: "ShoeRight", Pri: 1, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "Kneel", "KneelClosed"]), + HideWhenOverridden: true, + }, + { Name: "ShoeRightKneel", Layer: "ShoeRightKneel", Pri: 1, + Poses: ToMap(["Kneel"]), + Invariant: true, + InheritColor: "ShoeRight", + HideWhenOverridden: true, + }, + { Name: "ShoeLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 1, + Poses: ToMap(["Hogtie"]), + Invariant: true, + InheritColor: "ShoeLeft", + HideWhenOverridden: true, + }, + ]) +}); + +AddModel({ + Name: "Stockings", + Folder: "Maid", + Parent: "Maid", + TopLevel: true, + Categories: ["Socks"], + Layers: ToLayerMap([ + ...GetModelLayers("StockingRight"), + ...GetModelLayers("StockingLeft"), + ]) +}); + +AddModel({ + Name: "MaidSocks", + Folder: "Maid", + Parent: "Maid", + TopLevel: true, + Categories: ["Socks"], + Layers: ToLayerMap([ + ...GetModelLayers("MaidSockRight"), + ...GetModelLayers("MaidSockLeft"), + ]) +}); + +AddModel({ + Name: "Maid", + Folder: "Maid", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("MaidSkirt"), + ...GetModelLayers("MaidBlouse"), + ...GetModelLayers("MaidCorsetFull"), + ...GetModelLayers("MaidSocks"), + ...GetModelLayers("MaidShoes"), + ...GetModelLayers("MaidBow"), + ...GetModelLayers("HairBowFrilly"), + ]) +}); + + + +AddModel({ + Name: "WitchBlouse", + Folder: "Witch", + Parent: "Witch", + TopLevel: true, + Categories: ["Tops"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "BlouseLeft", Layer: "SleeveLeft", Pri: 4, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + //AppendPose: ToMapDupe(["RopesUpper"], {TorsoUpperTight: "Tight"}), + }, + { Name: "BlouseRight", Layer: "SleeveRight", Pri: 4, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + //AppendPose: ToMapDupe(["RopesUpper"], {TorsoUpperTight: "Tight"}), + }, + { Name: "BlouseLiner", Layer: "CorsetLiner", Pri: 4, + //swaplayerpose: {Kneel: "CorsetLinerLower", KneelClosed: "CorsetLinerLower"}, + Invariant: true, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + }, + { Name: "BlouseBust", Layer: "ShirtChest", Pri: 4, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + InheritColor: "Blouse", + MorphPoses: {Up: "Up"}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "WitchCorset", + Folder: "Witch", + Parent: "Witch", + TopLevel: true, + Categories: ["Corsets"], + Layers: ToLayerMap([ + { Name: "Corset", Layer: "Bustier", Pri: 1, + //SwapLayerPose: {Pants: "CorsetUnder"}, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + Invariant: true, + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + }, + ]) +}); + + +AddModel({ + Name: "SantaHat", + Folder: "Festive", + Parent: "SantaHat", + TopLevel: true, + Categories: ["Hats"], + Layers: ToLayerMap([ + { Name: "Hat", Layer: "Hat", Pri: 85, + HideWhenOverridden: true, + Invariant: true, + MorphPoses: {Hogtie: "Hogtie"}, + }, + { Name: "HatBack", Layer: "HatBack", Pri: 85, + HideWhenOverridden: true, + Invariant: true, + Poses: {Hogtie: true}, + }, + { Name: "Fluff", Layer: "Hat", Pri: 84.9, + NoOverride: true, + Invariant: true, + TieToLayer: "Hat", + MorphPoses: {Hogtie: "Hogtie"}, + }, + { Name: "Orb", Layer: "Hat", Pri: 84.9, + NoOverride: true, + Invariant: true, + TieToLayer: "Hat", + MorphPoses: {Hogtie: "Hogtie"}, + SwapLayerPose: {Hogtie: "HatBack"}, + }, + ]) +}); + +AddModel({ + Name: "WitchHat", + Folder: "Witch", + Parent: "Witch", + TopLevel: true, + Categories: ["Hats"], + Layers: ToLayerMap([ + { Name: "WitchHat", Layer: "Hat", Pri: 70, + HideWhenOverridden: true, + Invariant: true, + }, + { Name: "WitchHatBack", Layer: "HatBack", Pri: 70, + HideWhenOverridden: true, + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "ApprenticeHat", + Folder: "Witch", + Parent: "Witch", + TopLevel: true, + Categories: ["Hats"], + Layers: ToLayerMap([ + { Name: "ApprenticeHat", Layer: "Hat", Pri: 40, + HideWhenOverridden: true, + Invariant: true, + }, + { Name: "ApprenticeHatPuff", Layer: "Hat", Pri: 40.1, + HideWhenOverridden: true, + NoOverride: true, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "WitchShoes", + Folder: "Witch", + Parent: "Witch", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + { Name: "ShoeLeft", Layer: "ShoeLeft", Pri: 1, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + HideWhenOverridden: true, + }, + { Name: "ShoeRight", Layer: "ShoeRight", Pri: 1, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "Kneel", "KneelClosed"]), + HideWhenOverridden: true, + }, + { Name: "ShoeRightKneel", Layer: "ShoeRightKneel", Pri: 1, + Poses: ToMap(["Kneel"]), + Invariant: true, + InheritColor: "ShoeRight", + HideWhenOverridden: true, + }, + { Name: "ShoeLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 1, + Poses: ToMap(["Hogtie"]), + Invariant: true, + InheritColor: "ShoeLeft", + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "WitchSkirt", + Folder: "Witch", + Parent: "Witch", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "Skirt", Pri: 12, + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + Poses: ToMap([...LEGPOSES]), + HideWhenOverridden: true, + MorphPoses: {Hogtie: "Closed", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "SkirtOver", Layer: "SkirtOver", Pri: 12, + Poses: ToMap([...KNEELPOSES]), + TieToLayer: "Skirt", + NoOverride: true, + AppendPose: ToMapDupe(["CrotchStrap"]), + InheritColor: "Skirt", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + { Name: "SkirtRuffleOver", Layer: "Skirt", Pri: 12.1, + Poses: ToMap([...KNEELPOSES]), + TieToLayer: "Skirt", + NoOverride: true, + AppendPose: ToMapDupe(["CrotchStrap"]), + InheritColor: "Ruffle", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + { Name: "SkirtBelt", Layer: "Skirt", Pri: 12.1, + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + Poses: ToMap([...LEGPOSES]), + TieToLayer: "Skirt", NoOverride: true, + InheritColor: "Belt", + MorphPoses: {Hogtie: "Closed", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + }, + { Name: "SkirtRuffle", Layer: "Skirt", Pri: 12.1, + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + Poses: ToMap([...LEGPOSES]), + TieToLayer: "Skirt", NoOverride: true, + InheritColor: "Ruffle", + MorphPoses: {Hogtie: "Closed", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "Witch", + Folder: "Witch", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("WitchSkirt"), + ...GetModelLayers("WitchCorset"), + ...GetModelLayers("WitchBlouse"), + ...GetModelLayers("WitchHat"), + ...GetModelLayers("WitchShoes"), + ]) +}); + + + + +AddModel({ + Name: "WarriorBoots", + Folder: "Warrior", + Parent: "Dragonheart", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + { Name: "ShoeLeft", Layer: "ShoeLeft", Pri: 1, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + AppendPose: ToMapDupe(["RopesAnkle"]), + }, + { Name: "ShoeRight", Layer: "ShoeRight", Pri: 1, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "Kneel", "KneelClosed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + AppendPose: ToMapDupe(["RopesAnkle"]), + }, + { Name: "ShoeRightKneel", Layer: "ShoeRightKneel", Pri: 1, + Poses: ToMap(["Kneel"]), + Invariant: true, + InheritColor: "ShoeRight", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + HideWhenOverridden: true, + }, + { Name: "FootShoeLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 1, + Poses: ToMap(["Hogtie"]), + Invariant: true, + InheritColor: "ShoeLeft", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "SportsBra", + Folder: "Warrior", + Parent: "Dragonheart", + TopLevel: true, + Categories: ["Tops"], + Layers: ToLayerMap([ + { Name: "Bra", Layer: "BraChest", Pri: 5.5, + Poses: ToMap([...ARMPOSES]), + MorphPoses: {Yoked: "Yoked"}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "WarriorBustier", + Folder: "Warrior", + Parent: "Dragonheart", + TopLevel: true, + Categories: ["Tops"], + Layers: ToLayerMap([ + { Name: "Bustier", Layer: "Bustier", Pri: 15, + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "BustierChest", Layer: "ShirtChest", Pri: 15, + Invariant: true, + InheritColor: "Bustier", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + HideWhenOverridden: true, + }, + ]) +}); + + + +AddModel({ + Name: "LeatherGloveLeft", + Folder: "Warrior", + Parent: "Dragonheart", + Categories: ["Gloves"], + Filters: { + "GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":1}, + "BandLeft":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.43333333333333335,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":1} + }, + Layers: ToLayerMap([ + { Name: "GloveLeft", Layer: "GloveLeft", Pri: 8, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "ForeGloveLeft", Layer: "ForeGloveLeft", Pri: 8, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveLeft"}, + }, + { Name: "RimGloveLeft", Layer: "GloveLeft", Pri: 8.1, + Poses: ToMap([...ARMPOSES]), + InheritColor: "RimLeft", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "RimForeGloveLeft", Layer: "ForeGloveLeft", Pri: 8.1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "RimLeft", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveLeft"}, + }, + { Name: "BandGloveLeft", Layer: "GloveLeft", Pri: 8.1, + Poses: ToMap([...ARMPOSES]), + InheritColor: "BandLeft", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "BandForeGloveLeft", Layer: "ForeGloveLeft", Pri: 8.1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "BandLeft", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveLeft"}, + }, + ]) +}); + +AddModel({ + Name: "LeatherGloveRight", + Folder: "Warrior", + Parent: "Dragonheart", + Categories: ["Gloves"], + Filters: { + "GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":1}, + "BandRight":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.43333333333333335,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "GloveRight", Layer: "GloveRight", Pri: 8, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "ForeGloveRight", Layer: "ForeGloveRight", Pri: 8, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + { Name: "RimGloveRight", Layer: "GloveRight", Pri: 8.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + InheritColor: "RimRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "RimForeGloveRight", Layer: "ForeGloveRight", Pri: 8.1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "RimRight", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + { Name: "BandGloveRight", Layer: "GloveRight", Pri: 8.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + InheritColor: "BandRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "BandForeGloveRight", Layer: "ForeGloveRight", Pri: 8.1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "BandRight", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + ]) +}); + + +AddModel({ + Name: "LeatherGloves", + Folder: "Warrior", + Parent: "Dragonheart", + TopLevel: true, + Categories: ["Gloves"], + Filters: { + "GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":1}, + "GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3166666666666664,"green":1.3833333333333333,"blue":1,"alpha":1}, + "BandRight":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.43333333333333335,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":1}, + "BandLeft":{"gamma":1,"saturation":0.18333333333333335,"contrast":1,"brightness":0.43333333333333335,"red":1.3333333333333333,"green":0.8999999999999999,"blue":1,"alpha":1} + }, + Layers: ToLayerMap([ + ...GetModelLayers("LeatherGloveLeft"), + ...GetModelLayers("LeatherGloveRight"), + ]) +}); + + +AddModel({ + Name: "WarriorBelt", + Folder: "Warrior", + Parent: "Dragonheart", + TopLevel: true, + Categories: ["Corsets"], + Layers: ToLayerMap([ + { Name: "Belt", Layer: "Belt", Pri: 15, + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper", "TorsoLower"], + HideWhenOverridden: true, + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + }, + ]) +}); +/* +AddModel({ + Name: "WarriorBeltTight", + Folder: "Warrior", + Parent: "Dragonheart", + TopLevel: true, + Categories: ["Corsets"], + Layers: ToLayerMap([ + { Name: "Belt", Layer: "Belt", Pri: 15, + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper", "TorsoLower"], + HideWhenOverridden: true, + DisplaceAmount: 200, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquishTight", + DisplacementInvariant: true, + }, + ]) +});*/ + + +AddModel({ + Name: "RubyNecklace", + Folder: "Necklace", + Parent: "RubyNecklace", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "RubyChain", Layer: "Necklace", Pri: 15, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Chain", + }, + { Name: "RubyRing", Layer: "Necklace", Pri: 15.2, + Invariant: true, + NoOverride: true, + TieToLayer: "RubyChain", + InheritColor: "Ring", + }, + { Name: "RubyHardware", Layer: "Necklace", Pri: 15.1, + Invariant: true, + NoOverride: true, + TieToLayer: "RubyChain", + InheritColor: "Hardware", + }, + { Name: "RubyGem", Layer: "Necklace", Pri: 15.3, + Invariant: true, + NoOverride: true, + InheritColor: "Gem", + TieToLayer: "RubyChain", + }, + ]) +}); +AddModel(GetModelRestraintVersion("RubyNecklace", true)); +AddModel({ + Name: "SigilNecklace", + Folder: "Necklace", + Parent: "SigilNecklace", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "SigilChain", Layer: "Necklace", Pri: 15, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Chain", + }, + { Name: "SigilDisc", Layer: "Necklace", Pri: 15.1, + Invariant: true, + NoOverride: true, + TieToLayer: "SigilChain", + InheritColor: "Disc", + }, + ]) +}); +AddModel(GetModelRestraintVersion("SigilNecklace", true)); +AddModel({ + Name: "MetalNecklace", + Folder: "Necklace", + Parent: "MetalNecklace", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "MetalChain", Layer: "NecklaceCharm", Pri: -5, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Chain", + }, + { Name: "MetalDisc", Layer: "NecklaceCharm", Pri: -4.9, + Invariant: true, + NoOverride: true, + TieToLayer: "MetalChain", + InheritColor: "Disc", + }, + ]) +}); +AddModel(GetModelRestraintVersion("MetalNecklace", true)); + +AddModel({ + Name: "DragonNecklace", + Folder: "Warrior", + Parent: "Dragonheart", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Necklace", Layer: "Necklace", Pri: 5, + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "NecklaceCharm", Layer: "Necklace", Pri: 5, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Charm", + }, + ]) +}); +AddModel(GetModelRestraintVersion("DragonNecklace", true)); +AddModel({ + Name: "DragonArmband", + Folder: "Warrior", + Parent: "Dragonheart", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Armband", Layer: "SleeveRight", Pri: 3, + Poses: ToMap(["Yoked", "Wristtie", "Free", "Boxtie", "Front", "Crossed"]), + MorphPoses: {Yoked: "Yoked", Boxtie: "Boxtie", Free: "Free", Wristtie: "Wristtie", Front: "Boxtie"}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "DragonCollar", + Folder: "Warrior", + Parent: "Dragonheart", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Collar", Layer: "Collar", Pri: 5, + Invariant: true, + HideWhenOverridden: true, + }, + ]) +}); + +AddModel({ + Name: "WarriorSkirt", + Folder: "Warrior", + Parent: "Dragonheart", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "Skirt", Pri: 7, + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + Poses: ToMap([...LEGPOSES]), + //HideWhenOverridden: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "SkirtOver", Layer: "SkirtOver", Pri: 7, + Poses: ToMap([...KNEELPOSES]), + //RequirePoses: ToMap(["CrotchStrap"]), + TieToLayer: "Skirt", NoOverride: true, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + InheritColor: "Skirt", + //Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "Dragonheart", + Folder: "Warrior", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("WarriorSkirt"), + ...GetModelLayers("WarriorBustier"), + ...GetModelLayers("WarriorBelt"), + ...GetModelLayers("SportsBra"), + ...GetModelLayers("WarriorBoots"), + ...GetModelLayers("DragonCollar"), + ...GetModelLayers("DragonNecklace"), + ...GetModelLayers("DragonArmband"), + ]) +}); + + +AddModel({ + Name: "Dragonheart", + Folder: "Warrior", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("WarriorSkirt"), + ...GetModelLayers("WarriorBustier"), + ...GetModelLayers("WarriorBelt"), + ...GetModelLayers("SportsBra"), + ...GetModelLayers("WarriorBoots"), + ...GetModelLayers("DragonCollar"), + ...GetModelLayers("DragonNecklace"), + ...GetModelLayers("DragonArmband"), + ]) +}); + + + + +AddModel({ + Name: "ZombieHat", + Folder: "Robes", + Parent: "Robes", + TopLevel: true, + Categories: ["Hats"], + Layers: ToLayerMap([ + { Name: "ZombieHat", Layer: "Hat", Pri: 40, + HideWhenOverridden: true, + Invariant: true, + }, + { Name: "ZombieHatBand", Layer: "Hat", Pri: 41, + HideWhenOverridden: true, + NoOverride: true, + Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "ZombieChestTalisman", + Folder: "Robes", + Parent: "Robes", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "ZombieChestTalisman", Layer: "ChestDeco", Pri: 70, + NoOverride: true, + Invariant: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + }, + ]) +}); + + +AddModel({ + Name: "ZombieTalisman", + Folder: "Robes", + Parent: "Robes", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "ZombieTalisman", Layer: "HatDeco", Pri: 90, + NoOverride: true, + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "ZombieTalismanBent", + Folder: "Robes", + Parent: "Robes", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "ZombieTalismanBent", Layer: "HeadbandDeco", Pri: 90, + NoOverride: true, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "Sandals", + Folder: "Robes", + Parent: "Robes", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + { Name: "ShoeLeft", Layer: "ShoeLeft", Pri: 1, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + HideWhenOverridden: true, + }, + { Name: "ShoeRight", Layer: "ShoeRight", Pri: 1, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "Kneel", "KneelClosed"]), + HideWhenOverridden: true, + }, + { Name: "ShoeRightKneel", Layer: "ShoeRightKneel", Pri: 1, + Poses: ToMap(["Kneel"]), + Invariant: true, + InheritColor: "ShoeRight", + HideWhenOverridden: true, + }, + { Name: "ShoeLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 1, + Poses: ToMap(["Hogtie"]), + Invariant: true, + InheritColor: "ShoeLeft", + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "RobeBra", + Folder: "Robes", + Parent: "Robes", + TopLevel: true, + Categories: ["Tops"], + Layers: ToLayerMap([ + { Name: "Bra", Layer: "Bra", Pri: 50, + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "Chest", Layer: "BraChest", Pri: 50, + Invariant: true, + InheritColor: "Bra", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "RobeSleeveLeft", + Folder: "Robes", + Parent: "RobeSleeves", + Categories: ["Sleeves"], + TopLevel: true, + Layers: ToLayerMap([ + { Name: "SleeveLeft", Layer: "SleeveLeft", Pri: 40, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + MorphPoses: {Crossed: "Front"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + //AppendPose: ToMapDupe(["RopesUpper"], {ArmLeftTight: "Tight"}), + }, + ]) +}); +AddModel({ + Name: "RobeSleeveRight", + Folder: "Robes", + Parent: "RobeSleeves", + Categories: ["Tops"], + Layers: ToLayerMap([ + { Name: "SleeveRight", Layer: "SleeveRight", Pri: 40, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + MorphPoses: {Crossed: "Front"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + //AppendPose: ToMapDupe(["RopesUpper"], {ArmRightTight: "Tight"}), + }, + ]) +}); + + +AddModel({ + Name: "RobeSleeves", + Folder: "Robes", + Parent: "Robes", + TopLevel: true, + Categories: ["Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("RobeSleeveLeft"), + ...GetModelLayers("RobeSleeveRight"), + ]) +}); + + + +AddModel({ + Name: "RobeSleeveDecoLeft", + Folder: "Robes", + Parent: "RobeSleevesDeco", + Categories: ["Tops"], + Layers: ToLayerMap([ + { Name: "SleeveDecoLeft", Layer: "SleeveDecoLeft", Pri: 40, + Poses: ToMap(["Free", "Yoked", "Front", "Crossed"]), + MorphPoses: {Crossed: "Front"}, + GlobalDefaultOverride: ToMap(["Front"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + HideWhenOverridden: true, + }, + ]) +}); +AddModel({ + Name: "RobeSleeveDecoRight", + Folder: "Robes", + Parent: "RobeSleevesDeco", + Categories: ["Tops"], + Layers: ToLayerMap([ + { Name: "SleeveDecoRight", Layer: "SleeveDecoRight", Pri: 40, + Poses: ToMap(["Free", "Yoked", "Front", "Crossed"]), + MorphPoses: {Crossed: "Front"}, + GlobalDefaultOverride: ToMap(["Front"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "RobeSleevesDeco", + Folder: "Robes", + Parent: "Robes", + TopLevel: true, + Categories: ["Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("RobeSleeveDecoLeft"), + ...GetModelLayers("RobeSleeveDecoRight"), + ]) +}); + +AddModel({ + Name: "Ribbon", + Folder: "Robes", + Parent: "Robes", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "RibbonBelt", Layer: "BeltUnder", Pri: 30, + Invariant: true, + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + HideWhenOverridden: true, + }, + { Name: "RibbonBack", Layer: "BeltBack", Pri: -30, + Poses: ToMap(["Wristtie", "Boxtie"]), + Invariant: true, + HidePoses: ToMap(["HideBigProps"]), + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", UprightHogtie: "Boxtie", SuspendedHogtie: "Boxtie", Hogtie: "Hogtie"}, + }, + { Name: "RibbonFarBack", Layer: "BeltFarBack", Pri: -30, + Sprite: "RibbonBack", + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie"]), + Invariant: true, + HidePoses: ToMap(["HideBigProps"]), + InheritColor: "RibbonBack", + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", UprightHogtie: "Boxtie", SuspendedHogtie: "Boxtie", Hogtie: "Hogtie"}, + }, + ]) +}); + + +AddModel({ + Name: "RobeSkirt", + Folder: "Robes", + Parent: "Robes", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "Skirt", Pri: 7, + //swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + Poses: ToMap([...LEGPOSES]), + //HideWhenOverridden: true, + MorphPoses: {Closed: "Closed", Hogtie: "Closed", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "SkirtOver", Layer: "SkirtOver", Pri: 7, + Poses: ToMap([...KNEELPOSES]), + //RequirePoses: ToMap(["CrotchStrap"]), + TieToLayer: "Skirt", NoOverride: true, + InheritColor: "Skirt", + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "Robes", + Folder: "Robes", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("Sandals"), + ...GetModelLayers("RobeSleeves"), + ...GetModelLayers("RobeSleevesDeco"), + ...GetModelLayers("RobeSkirt"), + ...GetModelLayers("RobeBra"), + ...GetModelLayers("Ribbon"), + ]) +}); + diff --git a/Data/ModelListBase.ts b/Data/ModelListBase.ts new file mode 100644 index 000000000..b3028f84f --- /dev/null +++ b/Data/ModelListBase.ts @@ -0,0 +1,175 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "Body", + Group: "Body", + TopLevel: true, + Protected: true, + Categories: ["Body"], + Folder: "Body", + AddPose: ["Body"], + Layers: ToLayerMap([ + { Name: "Head", Layer: "Head", Pri: 0, + MorphPoses: {AnimalEars: "NoEar", HideEars: "NoEar"}, + AppendPose: {FaceCoverGag: "", FaceBigGag: "BigGag", FaceGag: "Gag"}, + }, + { Name: "ArmRight", Layer: "ArmRight", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMapSubtract(ARMPOSES, [...HIDEARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "ArmLeft", Layer: "ArmLeft", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMapSubtract(ARMPOSES, [...HIDEARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + ErasePoses: ["HideHands"], + EraseLayers: {RightHand: true}, + EraseSprite: "HideBoxtieHand", + EraseInvariant: true, + }, + { Name: "ShoulderRight", Layer: "ShoulderRight", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMap([...SHOULDERPOSES]), + }, + { Name: "ShoulderLeft", Layer: "ShoulderLeft", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMap([...SHOULDERPOSES]), + }, + { Name: "ForeArmRight", Layer: "ForeArmRight", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMap(FOREARMPOSES), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossArmRight"}, + }, + { Name: "ForeArmLeft", Layer: "ForeArmLeft", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMap(FOREARMPOSES), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossArmLeft"}, + }, + { Name: "HandRight", Layer: "HandRight", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMap(HANDRIGHTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandRight"]), + }, + { Name: "HandLeft", Layer: "HandLeft", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMap(HANDLEFTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandLeft",]), + + }, + { Name: "ForeHandRight", Layer: "ForeHandRight", Pri: 0, + HideWhenOverridden: true, + Sprite: "HandRight", + InheritColor: "Torso", + Poses: ToMap(FOREHANDRIGHTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandRight"]), + }, + { Name: "ForeHandLeft", Layer: "ForeHandLeft", Pri: 0, + HideWhenOverridden: true, + Sprite: "HandLeft", + InheritColor: "Torso", + Poses: ToMap(FOREHANDLEFTPOSES), + GlobalDefaultOverride: ToMap(["Front"]), + HidePoses: ToMap(["HideHands", "EncaseHandLeft"]), + }, + { Name: "LegLeft", Layer: "LegLeft", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMap(LEGPOSES), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + }, + { Name: "Torso", Layer: "Torso", Pri: 0, + //AppendPose: {CrotchStrap: "Chastity"}, + InheritColor: "Torso", + MorphPoses: {Closed: "Closed", Spread: "Spread", Hogtie: "Closed"}, + EraseLayers: {BustierPoses: true}, + EraseSprite: "EraseCorset", + EraseInvariant: true, + EraseZBonus: 1000, + //EraseMorph: {EncaseTorsoLower: "Encase"}, + }, + { Name: "Chest", Layer: "Chest", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + //DisplaceAmount: 50, + //DisplacementSprite: "BustHuge", + //DisplacementInvariant: true, + //DisplaceLayers: {BustSize: true}, + }, + /*{ Name: "FootRight", Layer: "FootRight", Pri: 0, + InheritColor: "Torso", + Poses: ToMap(FOOTRIGHTPOSES), + },*/ + { Name: "FootRightKneel", Sprite: "FootRight", Layer: "FootRightKneel", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + HidePoses: ToMap(["FeetLinked", "FeetCovered"]), + Poses: ToMap(["Kneel"]), + }, + /*{ Name: "FootLeft", Layer: "FootLeft", Pri: 0, + InheritColor: "Torso", + Poses: ToMap(FOOTLEFTPOSES), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + },*/ + { Name: "FootLeftHogtie", Layer: "FootLeftHogtie", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMap(["Hogtie"]), + MorphPoses: {Hogtie: ""}, + }, + { Name: "LegRight", Layer: "LegRight", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMap(LEGPOSES), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + }, + { Name: "Butt", Layer: "Butt", Pri: 0, + //HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMap(KNEELPOSES), + EraseLayers: {BustierPoses2: true}, + EraseSprite: "EraseCorsetKneel", + EraseInvariant: true, + EraseZBonus: 1000, + //EraseMorph: {EncaseTorsoLower: "Encase"}, + }, + { Name: "Butt2", Layer: "Butt", Pri: 0, + //HideWhenOverridden: true, + InheritColor: "Torso", + Poses: ToMap(KNEELPOSES), + EraseLayers: {ButtSleeves: true}, + EraseSprite: "ButtSleeves", + EraseZBonus: 1000, + EraseInvariant: true, + Invariant: true, + //EraseMorph: {EncaseTorsoLower: "Encase"}, + }, + + + + { Name: "Nipples", Layer: "Nipples", Pri: 0, + HideWhenOverridden: true, + InheritColor: "Nipples", + Invariant: true, + HidePoses: {HideNipples: true}, + }, + ]) +}); diff --git a/Data/ModelListFace.ts b/Data/ModelListFace.ts new file mode 100644 index 000000000..fd5b02d4d --- /dev/null +++ b/Data/ModelListFace.ts @@ -0,0 +1,674 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ +AddModel({ + Name: "KoiEyes", + Folder: "FaceKoi", + TopLevel: true, + Protected: true, + //Group: "Eyes", + Categories: ["Eyes","Face"], + AddPose: ["Eyes"], + Layers: ToLayerMap([ + { Name: "Eyes", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(EYEPOSES), + }, + { Name: "Eyes2", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(EYE2POSES), + }, + { Name: "Whites", Layer: "Eyes", Pri: -1, + OffsetX: 942, + OffsetY: 200, + NoColorize: true, + Poses: ToMap(EYEPOSES), + }, + { Name: "Whites2", Layer: "Eyes", Pri: -1, + Sprite: "Whites", + OffsetX: 942, + OffsetY: 200, + NoColorize: true, + Poses: ToMap(EYE2POSES), + }, + ]) +}); + +AddModel({ + Name: "HumanEyes", + Folder: "FaceKoi", + TopLevel: true, + Protected: true, + //Group: "Eyes", + Categories: ["Eyes","Face"], + AddPose: ["Eyes"], + Layers: ToLayerMap([ + { Name: "Eyes", Layer: "Eyes", Pri: 0, + Sprite: "Human", // Because pose is called EyesNeutral lol + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(EYEPOSES), + }, + { Name: "Eyes2", Layer: "Eyes", Pri: 0, + Sprite: "Human", // Because pose is called EyesNeutral lol + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(EYE2POSES), + }, + { Name: "Whites", Layer: "Eyes", Pri: -1, + OffsetX: 942, + OffsetY: 200, + NoColorize: true, + Poses: ToMap(EYEPOSES), + }, + { Name: "Whites2", Layer: "Eyes", Pri: -1, + Sprite: "Whites", + OffsetX: 942, + OffsetY: 200, + NoColorize: true, + Poses: ToMap(EYE2POSES), + }, + ]) +}); +AddModel({ + Name: "BlankEyes", + Folder: "FaceKoiBlank", + TopLevel: true, + Protected: true, + //Group: "Eyes", + Categories: ["Eyes","Face"], + AddPose: ["Eyes"], + Layers: ToLayerMap([ + { Name: "Eyes", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(EYEPOSES), + }, + { Name: "Eyes2", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(EYE2POSES), + }, + { Name: "Whites", Layer: "Eyes", Pri: -1, + OffsetX: 942, + OffsetY: 200, + NoColorize: true, + Poses: ToMap(EYEPOSES), + }, + { Name: "Whites2", Layer: "Eyes", Pri: -1, + Sprite: "Whites", + OffsetX: 942, + OffsetY: 200, + NoColorize: true, + Poses: ToMap(EYE2POSES), + }, + ]) +}); + +AddModel({ + Name: "KoiBrows", + Folder: "FaceKoi", + TopLevel: true, + Protected: true, + //Group: "Brows", + Categories: ["Eyes","Face"], + Layers: ToLayerMap([ + { Name: "Brows", Layer: "Brows", Pri: 0, + Sprite: "", // Because pose is called BrowsNeutral lol + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(BROWPOSES), + HidePoses: ToMap(["EncaseHead"]), + }, + { Name: "Brows2", Layer: "Brows", Pri: 0, + Sprite: "", // Because pose is called BrowsNeutral lol + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(BROW2POSES), + HidePoses: ToMap(["EncaseHead"]), + }, + ]) +}); +AddModel({ + Name: "DaiBrows1", + Folder: "EyesDai1", + TopLevel: true, + Protected: true, + //Group: "Brows", + Categories: ["Eyes","Face"], + Layers: ToLayerMap([ + { Name: "Brows", Layer: "Brows", Pri: 0, + Sprite: "", // Because pose is called BrowsNeutral lol + Poses: ToMap(BROWPOSES), + HidePoses: ToMap(["EncaseHead"]), + }, + { Name: "Brows2", Layer: "Brows", Pri: 0, + Sprite: "", // Because pose is called BrowsNeutral lol + Poses: ToMap(BROW2POSES), + HidePoses: ToMap(["EncaseHead"]), + }, + ]) +}); +AddModel({ + Name: "DaiBrows2", + Folder: "EyesDai2", + TopLevel: true, + Protected: true, + //Group: "Brows", + Categories: ["Eyes","Face"], + Layers: ToLayerMap([ + { Name: "Brows", Layer: "Brows", Pri: 0, + Sprite: "", // Because pose is called BrowsNeutral lol + Poses: ToMap(BROWPOSES), + HidePoses: ToMap(["EncaseHead"]), + }, + { Name: "Brows2", Layer: "Brows", Pri: 0, + Sprite: "", // Because pose is called BrowsNeutral lol + Poses: ToMap(BROW2POSES), + HidePoses: ToMap(["EncaseHead"]), + }, + ]) +}); + +AddModel({ + Name: "Glabella", + Folder: "EyesDai1", + TopLevel: true, + Protected: true, + //Group: "Brows", + Categories: ["Eyes","Face"], + Layers: ToLayerMap([ + { Name: "Ridge", Layer: "Brows", Pri: 0, + Poses: ToMap(["Brows2Angry", "BrowsAngry", "Brows2Sad", "BrowsSad"]), + MorphPoses: { + Brows2Angry: "Angry", + BrowsAngry: "Angry", + Brows2Sad: "Sad", + BrowsSad: "Sad", + }, + HidePoses: ToMap(["EncaseHead"]), + }, + ]) +}); + +AddModel({ + Name: "Mascara", + Folder: "Wolfgirl", + TopLevel: true, + Protected: true, + Categories: ["Makeup","Face"], + Layers: ToLayerMap([ + { Name: "MascaraL", Layer: "Head", Pri: 5, + Invariant: true, + HidePoses: ToMap(["EncaseHead"]), + NoOverride: true, + OffsetX: 920, + OffsetY: 50, + }, + { Name: "MascaraR", Layer: "Head", Pri: 5, + Invariant: true, + HidePoses: ToMap(["EncaseHead"]), + NoOverride: true, + OffsetX: 920, + OffsetY: 50, + }, + ]) +}); + +AddModel({ + Name: "Scar", + Folder: "Wolfgirl", + TopLevel: true, + Protected: true, + Categories: ["Scar","Face"], + Layers: ToLayerMap([ + { Name: "Scar", Layer: "Head", Pri: 10, + Invariant: true, + HidePoses: ToMap(["EncaseHead"]), + NoOverride: true, + OffsetX: 920, + OffsetY: 50, + }, + ]) +}); + + + +AddModel({ + Name: "KoiMouth", + Folder: "FaceKoi", + TopLevel: true, + Protected: true, + Group: "Mouth", + Categories: ["Mouth","Face"], + Layers: ToLayerMap([ + { Name: "Mouth", Layer: "Mouth", Pri: 0, + Sprite: "", // Because pose is called MouthNeutral lol + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(MOUTHPOSES), + HidePoses: ToMap(["HideMouth"]), + }, + ]) +}); +AddModel({ + Name: "KoiBlush", + Folder: "FaceKoi", + TopLevel: true, + Protected: true, + //Group: "Blush", + Categories: ["Face"], + Layers: ToLayerMap([ + { Name: "Blush", Layer: "Blush", Pri: 0, + Sprite: "", // Because pose is called MouthNeutral lol + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(BLUSHPOSES), + }, + ]) +}); + +AddModel({ + Name: "Fear", + Folder: "Expressions", + TopLevel: true, + Protected: true, + //Group: "Blush", + Categories: ["Face"], + Layers: ToLayerMap([ + { Name: "Fear", Layer: "Fear", Pri: 0, + Invariant: true, + RequirePoses: {FearPose: true}, + }, + ]) +}); + + + +AddModel({ + Name: "KjusEyes", + Folder: "FaceKjus", + TopLevel: true, + Protected: true, + //Group: "Eyes", + Categories: ["Eyes","Face"], + AddPose: ["Eyes"], + Layers: ToLayerMap([ + { Name: "Eyes", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + Poses: ToMap(EYEPOSES), + }, + { Name: "Eyes2", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + Poses: ToMap(EYE2POSES), + }, + { Name: "Whites", Layer: "Eyes", Pri: -1, + NoColorize: true, + Poses: ToMap(EYEPOSES), + }, + { Name: "Whites2", Layer: "Eyes", Pri: -1, + Sprite: "Whites", + NoColorize: true, + Poses: ToMap(EYE2POSES), + }, + ]) +}); + + + +AddModel({ + Name: "KjusEyes2", + Folder: "EyesK2", + TopLevel: true, + Protected: true, + //Group: "Eyes", + Categories: ["Eyes","Face"], + AddPose: ["Eyes"], + Layers: ToLayerMap([ + { Name: "Eyes", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + Poses: ToMap(EYEPOSES), + }, + { Name: "Eyes2", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + Poses: ToMap(EYE2POSES), + }, + { Name: "Whites", Layer: "Eyes", Pri: -1, + NoColorize: true, + Poses: ToMap(EYEPOSES), + }, + { Name: "Whites2", Layer: "Eyes", Pri: -1, + Sprite: "Whites", + NoColorize: true, + Poses: ToMap(EYE2POSES), + }, + ]) +}); + +AddModel({ + Name: "KjusEyes3", + Folder: "EyesK3", + TopLevel: true, + Protected: true, + //Group: "Eyes", + Categories: ["Eyes","Face"], + AddPose: ["Eyes"], + Layers: ToLayerMap([ + { Name: "Eyes", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + Poses: ToMap(EYEPOSES), + }, + { Name: "Eyes2", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + Poses: ToMap(EYE2POSES), + }, + { Name: "Whites", Layer: "Eyes", Pri: -1, + NoColorize: true, + Poses: ToMap(EYEPOSES), + }, + { Name: "Whites2", Layer: "Eyes", Pri: -1, + Sprite: "Whites", + NoColorize: true, + Poses: ToMap(EYE2POSES), + }, + ]) +}); +AddModel({ + Name: "KjusEyes4", + Folder: "EyesK4", + TopLevel: true, + Protected: true, + //Group: "Eyes", + Categories: ["Eyes","Face"], + AddPose: ["Eyes"], + Layers: ToLayerMap([ + { Name: "Eyes", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + Poses: ToMap(EYEPOSES), + }, + { Name: "Eyes2", Layer: "Eyes", Pri: 0, + Sprite: "", // Because pose is called EyesNeutral lol + Poses: ToMap(EYE2POSES), + }, + { Name: "Whites", Layer: "Eyes", Pri: -1, + NoColorize: true, + Poses: ToMap(EYEPOSES), + }, + { Name: "Whites2", Layer: "Eyes", Pri: -1, + Sprite: "Whites", + NoColorize: true, + Poses: ToMap(EYE2POSES), + }, + ]) +}); + + +AddModel({ + Name: "KjusBrows", + Folder: "FaceKjus", + TopLevel: true, + Protected: true, + //Group: "Brows", + Categories: ["Eyes","Face"], + Layers: ToLayerMap([ + { Name: "Brows", Layer: "Brows", Pri: 0, + Sprite: "", // Because pose is called BrowsNeutral lol + Poses: ToMap(BROWPOSES), + HidePoses: ToMap(["EncaseHead"]), + }, + { Name: "Brows2", Layer: "Brows", Pri: 0, + Sprite: "", // Because pose is called BrowsNeutral lol + Poses: ToMap(BROW2POSES), + HidePoses: ToMap(["EncaseHead"]), + }, + ]) +}); + +AddModel({ + Name: "KjusMouth", + Folder: "FaceKjus", + TopLevel: true, + Protected: true, + Group: "Mouth", + Categories: ["Mouth","Face"], + Layers: ToLayerMap([ + { Name: "Mouth", Layer: "Mouth", Pri: 0, + Sprite: "", // Because pose is called MouthNeutral lol + Poses: ToMap(MOUTHPOSES), + HidePoses: ToMap(["HideMouth"]), + }, + ]) +}); + +AddModel({ + Name: "FangMouth", + Folder: "FaceFang", + TopLevel: true, + Protected: true, + Group: "Mouth", + Categories: ["Mouth","Face"], + AddPose: ["Fang"], + Layers: ToLayerMap([ + { Name: "Mouth", Layer: "Mouth", Pri: 0, + Sprite: "", // Because pose is called MouthNeutral lol + Poses: ToMap(MOUTHPOSES), + HidePoses: ToMap(["HideMouth"]), + }, + ]) +}); + + +AddModel({ + Name: "FangMouth_Double", + Folder: "FaceFang2", + TopLevel: true, + Protected: true, + Group: "Mouth", + Categories: ["Mouth","Face"], + AddPose: ["2Fang"], + Layers: ToLayerMap([ + { Name: "Mouth", Layer: "Mouth", Pri: 0, + Sprite: "", // Because pose is called MouthNeutral lol + Poses: ToMap(MOUTHPOSES), + HidePoses: ToMap(["HideMouth"]), + }, + ]) +}); + +AddModel({ + Name: "FanglessMouth", + Folder: "FaceFangless", + TopLevel: true, + Protected: true, + Group: "Mouth", + Categories: ["Mouth","Face"], + Layers: ToLayerMap([ + { Name: "Mouth", Layer: "Mouth", Pri: 0, + Sprite: "", // Because pose is called MouthNeutral lol + Poses: ToMap(MOUTHPOSES), + HidePoses: ToMap(["HideMouth"]), + }, + ]) +}); +AddModel({ + Name: "KjusBlush", + Folder: "FaceKjus", + TopLevel: true, + Protected: true, + //Group: "Blush", + Categories: ["Face"], + Layers: ToLayerMap([ + { Name: "Blush", Layer: "Blush", Pri: 0, + Sprite: "", // Because pose is called MouthNeutral lol + Poses: ToMap(BLUSHPOSES), + }, + ]) +}); + +AddModel({ + Name: "DaskBrows", + Folder: "FaceDask", + TopLevel: true, + Protected: true, + //Group: "Brows", + Categories: ["Eyes","Face"], + Layers: ToLayerMap([ + { Name: "Brows", Layer: "Brows", Pri: 0, + Sprite: "", // Because pose is called BrowsNeutral lol + Poses: ToMap(BROWPOSES), + HidePoses: ToMap(["EncaseHead"]), + }, + { Name: "Brows2", Layer: "Brows", Pri: 0, + Sprite: "", // Because pose is called BrowsNeutral lol + Poses: ToMap(BROW2POSES), + HidePoses: ToMap(["EncaseHead"]), + }, + ]) +}); + +AddModel({ + Name: "DaskEyes", + Folder: "FaceDask", + TopLevel: true, + Protected: true, + //Group: "Eyes", + Categories: ["Eyes","Face"], + AddPose: ["Eyes"], + Layers: ToLayerMap([ + { Name: "Eyes", Layer: "Eyes", Pri: 0, + Sprite: "", + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(EYEPOSES), + }, + { Name: "Eyes2", Layer: "Eyes", Pri: 0, + Sprite: "", + OffsetX: 942, + OffsetY: 200, + Poses: ToMap(EYE2POSES), + }, + { Name: "Whites", Layer: "Eyes", Pri: -1, + OffsetX: 942, + OffsetY: 200, + NoColorize: true, + Poses: ToMap(EYEPOSES), + }, + { Name: "Whites2", Layer: "Eyes", Pri: -1, + Sprite: "Whites", + OffsetX: 942, + OffsetY: 200, + NoColorize: true, + Poses: ToMap(EYE2POSES), + }, + ]) +}); + + + + +AddModel({ + Name: "ElfEars", + TopLevel: true, + Protected: true, + Categories: ["Body", "Face", "Cosplay"], + AddPose: ["Cosplay"], + Folder: "Ears", + RemovePoses: ["HideEars"], + Layers: ToLayerMap([ + { Name: "ElfFront", Layer: "Head", Pri: 0.1, + NoOverride: true, + ImportColorFromGroup: ["Body", "Head"], + }, + { Name: "ElfBack", Layer: "Head", Pri: -0.1, + NoOverride: true, + ImportColorFromGroup: ["Body", "Head"], + }, + ]) +}); +AddModel({ + Name: "ElfEarsLong", + Parent: "ElfEars", + TopLevel: false, + Protected: true, + Categories: ["Body", "Face", "Cosplay"], + AddPose: ["Cosplay"], + Folder: "Ears", + RemovePoses: ["HideEars"], + Layers: ToLayerMap([ + { Name: "ElfLongFront", Layer: "Head", Pri: 0.1, + NoOverride: true, + ImportColorFromGroup: ["Body", "Head"], + }, + { Name: "ElfLongBack", Layer: "Head", Pri: -0.1, + NoOverride: true, + ImportColorFromGroup: ["Body", "Head"], + }, + ]) +}); +AddModel({ + Name: "ElfEarsFloppy", + Parent: "ElfEars", + TopLevel: false, + Protected: true, + Categories: ["Body", "Face", "Cosplay"], + AddPose: ["Cosplay"], + Folder: "Ears", + RemovePoses: ["HideEars"], + Layers: ToLayerMap([ + { Name: "ElfFloppyFront", Layer: "Head", Pri: 0.1, + NoOverride: true, + ImportColorFromGroup: ["Body", "Head"], + }, + { Name: "ElfFloppyBack", Layer: "Head", Pri: -0.1, + NoOverride: true, + ImportColorFromGroup: ["Body", "Head"], + }, + ]) +}); +AddModel({ + Name: "ElfEarrings", + Parent: "Earrings", + TopLevel: false, + Protected: true, + Categories: ["Face", "Accessories"], + Folder: "Ears", + RemovePoses: ["HideEars"], + Layers: ToLayerMap([ + { Name: "ElfEarringsFront", Layer: "Head", Pri: 0.2, + NoOverride: true, + InheritColor: "EarringLeft", + }, + { Name: "ElfEarringsBack", Layer: "Head", Pri: 0, + NoOverride: true, + InheritColor: "EarringRight", + }, + ]) +}); +AddModel({ + Name: "Earrings", + Parent: "Earrings", + TopLevel: true, + Protected: true, + Categories: ["Face", "Accessories"], + Folder: "Ears", + RemovePoses: ["HideEars"], + Layers: ToLayerMap([ + { Name: "Earrings", Layer: "Head", Pri: 0.2, + NoOverride: true, + InheritColor: "EarringLeft", + }, + { Name: "EarringsBack", Layer: "Head", Pri: -0.1, + NoOverride: true, + InheritColor: "EarringRight", + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelListHair.ts b/Data/ModelListHair.ts new file mode 100644 index 000000000..2ece174aa --- /dev/null +++ b/Data/ModelListHair.ts @@ -0,0 +1,684 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "HairBow", + Folder: "Hair", + TopLevel: true, + Protected: true, + Categories: ["Hairstyles", "Accessories", "Hairbands"], + Layers: ToLayerMap([ + { Name: "Bow", Layer: "HatBack", Pri: -100, + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "HairBowFrilly", + Parent: "Maid", + Folder: "Hair", + TopLevel: false, + Protected: true, + Categories: ["Hairstyles", "Accessories", "Hairbands"], + Layers: ToLayerMap([ + ...GetModelLayers("HairBow"), + { Name: "BowFrills", Layer: "HatBack", Pri: -100.1, + NoOverride: true, + TieToLayer: "Bow", + }, + ]) +}); + +AddModel({ + Name: "Hairband", + Folder: "Hair", + TopLevel: true, + Protected: true, + Categories: ["Hairstyles", "Accessories", "Hairbands"], + Layers: ToLayerMap([ + { Name: "Hairband", Layer: "HairFront", Pri: 20, + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "Hairband2", + Folder: "GagLeather", + Parent: "Hairband", + Protected: true, + Categories: ["Hairstyles", "Accessories", "Hairbands"], + Layers: ToLayerMap([ + { Name: "Hairband", Layer: "HairFront", Pri: 20, + Sprite: "BallSideStrap", + NoOverride: true, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "MaidHairband", + Parent: "Hairband", + Folder: "Hair", + TopLevel: false, + Protected: true, + Categories: ["Hairstyles", "Accessories", "Hairbands"], + Layers: ToLayerMap([ + { Name: "Hairband", Layer: "HairFront", Pri: 20, + NoOverride: true, + }, + { Name: "MaidFrill", Layer: "HairFront", Pri: 20.1, + NoOverride: true, TieToLayer: "Hairband", + InheritColor: "Frill", + }, + ]) +}); + + +AddModel({ + Name: "FrillyHeadband", + Parent: "Hairband", + Folder: "Hat", + Protected: true, + Categories: ["Hairstyles", "Accessories", "Hairbands"], + Layers: ToLayerMap([ + { Name: "Headband", Layer: "HairFront", Pri: 70, + NoOverride: true, + }, + { Name: "HeadbandFrill", Layer: "HairFront", Pri: 70.2, + NoOverride: true, TieToLayer: "Headband", + InheritColor: "Frill", + }, + { Name: "HeadbandBand", Layer: "HairFront", Pri: 70.1, + NoOverride: true, TieToLayer: "Headband", + InheritColor: "Band", + }, + { Name: "HeadbandBow", Layer: "HairFront", Pri: 70.3, + NoOverride: true, TieToLayer: "HaiHeadbandrband", + InheritColor: "Bow", + }, + ]) +}); +AddModel({ + Name: "BowHeadband", + Parent: "Hairband", + Folder: "Hat", + Protected: true, + Categories: ["Hairstyles", "Accessories", "Hairbands"], + Layers: ToLayerMap([ + { Name: "BowHeadband", Layer: "HairFront", Pri: 65, + NoOverride: true, + }, + { Name: "BowHeadbandFrill", Layer: "HairFront", Pri: 65.1, + NoOverride: true, TieToLayer: "BowHeadband", + InheritColor: "Frill", + }, + ]) +}); + + + + + +AddModel({ + Name: "Braid", + Folder: "Hair", + TopLevel: true, + Protected: true, + Categories: ["Hairstyles"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Braid", Layer: "Hair", Pri: 0, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + { Name: "Braid_Overstrap", Layer: "HairFront", Pri: 0, InheritColor: "Braid", + }, + { Name: "BraidBack", Layer: "HairBack", Pri: 0, + }, + ]) +}); +AddModel({ + Name: "BraidCustom", + Parent: "Braid", + Folder: "Hair", + Protected: true, + Categories: ["Hairstyles"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "BraidCustom", Layer: "Hair", Pri: 0, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + { Name: "BraidCustom_Overstrap", Layer: "HairFront", Pri: 0, InheritColor: "BraidCustom", + }, + ]) +}); +AddModel({ + Name: "BraidCustomBack", + Parent: "Braid", + Folder: "Hair", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "BraidCustomBack", Layer: "HairBack", Pri: -1, + }, + { Name: "BraidCustomBraid", Layer: "Hair", Pri: -1, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + ]) +}); +AddModel({ + Name: "BraidCustomBackNoBraid", + Parent: "Braid", + Folder: "Hair", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "BraidCustomBack", Layer: "HairBack", Pri: 0, + }, + ]) +}); +AddModel({ + Name: "BackStraight", + Folder: "Hair", + TopLevel: true, + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "BackStraight", Layer: "HairBack", Pri: 0, + }, + ]) +}); +AddModel({ + Name: "BackHime", + Folder: "Hair", + TopLevel: false, + Parent: "BackStraight", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "HimeBack", Layer: "HairBack", Pri: 5, + }, + ]) +}); +AddModel({ + Name: "BackShort", + Folder: "Hair", + TopLevel: true, + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "BackShort", Layer: "HairBack", Pri: 15, + }, + ]) +}); +AddModel({ + Name: "BackFlat", + Folder: "Hair", + TopLevel: false, + Parent: "BackShort", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "BackFlat", Layer: "HairBack", Pri: 12, + }, + ]) +}); +AddModel({ + Name: "Curly", + Folder: "Hair", + TopLevel: true, + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Curly", Layer: "Hair", Pri: 0, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + { Name: "Curly_Overstrap", Layer: "HairFront", Pri: 0, + InheritColor: "Curly", + }, + ]) +}); +AddModel({ + Name: "Fluffy", + Folder: "Hair", + Parent: "Curly", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Fuzzy", Layer: "Hair", Pri: 0, + SwapLayerPose: {HoodMask: "HairOver"}, + InheritColor: "Fuzzy", + }, + { Name: "Fuzzy_Overstrap", Layer: "HairFront", Pri: 0, + InheritColor: "Fuzzy", + }, + ]) +}); +AddModel({ + Name: "FrontStraight", + Folder: "Hair", + TopLevel: false, + Protected: true, + Parent: "Straight", + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "FrontStraight", Layer: "Hair", Pri: 0, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + { Name: "FrontStraight_Overstrap", Layer: "HairFront", Pri: 0, InheritColor: "FrontStraight", + }, + ]) +}); +AddModel({ + Name: "Bob", + Folder: "Hair", + TopLevel: false, + Protected: true, + Parent: "Straight", + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Bob", Layer: "Hair", Pri: 7, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + { Name: "BobFront", Layer: "HairFront", Pri: 7, + }, + ]) +}); +AddModel({ + Name: "FrontStraight2", + Folder: "Hair", + TopLevel: false, + Parent: "Straight", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "FrontStraight2", Layer: "Hair", Pri: 3, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + { Name: "FrontStraight2_Front", Layer: "HairFront", Pri: 3, + SwapLayerPose: {HoodMask: "HairOver"}, + InheritColor: "Bangs", + }, + { Name: "FrontStraight2_Overstrap", Layer: "HairFront", Pri: 3, + InheritColor: "Bangs", + }, + ]) +}); +AddModel({ + Name: "Straight", + Folder: "Hair", + TopLevel: true, + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Straight", Layer: "Hair", Pri: 0, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + { Name: "Straight_Overstrap", Layer: "HairFront", Pri: 0, InheritColor: "Straight", + }, + ]) +}); +AddModel({ + Name: "StraightBangs", + Folder: "Hair", + TopLevel: true, + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "StraightBangs", Layer: "Hair", Pri: 0, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + { Name: "StraightBangs_Overstrap", Layer: "HairFront", Pri: 0, InheritColor: "StraightBangs", + }, + ]) +}); +AddModel({ + Name: "FrontSwept", + Folder: "Hair", + Parent: "Curly", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "FrontSwept", Layer: "Hair", Pri: -20, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + { Name: "FrontSweptSide", Layer: "Hair", Pri: -20, InheritColor: "SideBang", + SwapLayerPose: {HoodMask: "HairOver"}, + }, + ]) +}); +AddModel({ + Name: "Vents", + Folder: "Hair", + Parent: "StraightBangs", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "VentL", Layer: "Hair", Pri: 15, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + { Name: "VentR", Layer: "Hair", Pri: 15, + SwapLayerPose: {HoodMask: "HairOver"}, + }, + { Name: "VentsInnerR", Layer: "Hair", Pri: 15.1, + SwapLayerPose: {HoodMask: "HairOver"}, + TieToLayer: "VentR", + }, + { Name: "VentsInnerL", Layer: "Hair", Pri: 15.1, + SwapLayerPose: {HoodMask: "HairOver"}, + TieToLayer: "VentL", + }, + { Name: "VentsFront", Layer: "HairFront", Pri: 15, + }, + ]) +}); +AddModel({ + Name: "MessyBack", + Folder: "Hair", + TopLevel: true, + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "Messy", Layer: "HairBack", Pri: 0, + }, + ]) +}); +AddModel({ + Name: "ShortMessyBack", + Parent: "MessyBack", + Folder: "Hair", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "BackShortMessy", Layer: "HairBack", Pri: 0, + }, + { Name: "BackShortMessyUnderlight", Layer: "HairBack", Pri: -0.1, + NoOverride: true, TieToLayer: "BackShortMessy", + }, + ]) +}); +AddModel({ + Name: "ShortCurlyBack", + Parent: "MessyBack", + Folder: "Hair", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "BackShortCurly", Layer: "HairBack", Pri: 0, + }, + { Name: "BackShortCurlyUnderlight", Layer: "HairBack", Pri: -0.1, + NoOverride: true, TieToLayer: "BackShortCurly", + }, + ]) +}); +AddModel({ + Name: "Ponytail", + Folder: "Hair", + TopLevel: true, + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "Ponytail", Layer: "HairPonytail", Pri: 0, + }, + ]) +}); +AddModel({ + Name: "BigBraidBack", + Folder: "Hair", + TopLevel: false, + Protected: true, + Parent: "Braid", + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "BigBraidBack", Layer: "HairBack", Pri: -20, + }, + ]) +}); +AddModel({ + Name: "CurlyPonytail", + Folder: "Hair", + TopLevel: false, + Parent: "Ponytail", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "CurlyPonytail", Layer: "HairPonytail", Pri: 0, + }, + ]) +}); +AddModel({ + Name: "FluffyPonytail", + Parent: "Ponytail", + Folder: "Hair", + TopLevel: false, + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "Ponytail2", Layer: "HairPonytail", Pri: 0, + }, + ]) +}); + +AddModel({ + Name: "DrillLeft", + Folder: "Hair", + TopLevel: false, + Protected: true, + Parent: "Twindrills", + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "DrillLeft", Layer: "HairPonytail", Pri: 4, + }, + ]) +}); +AddModel({ + Name: "DrillRight", + Folder: "Hair", + TopLevel: false, + Protected: true, + Parent: "Twindrills", + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "DrillRight", Layer: "HairPonytail", Pri: 4, + }, + ]) +}); +AddModel({ + Name: "TwintailLeft", + Folder: "Hair", + TopLevel: false, + Protected: true, + Parent: "Twintails", + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "TwintailLeft", Layer: "HairPonytail", Pri: 0, + }, + ]) +}); +AddModel({ + Name: "TwintailRight", + Folder: "Hair", + TopLevel: false, + Protected: true, + Parent: "Twintails", + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "TwintailRight", Layer: "HairPonytail", Pri: 0, + }, + ]) +}); +AddModel({ + Name: "Twindrills", + Folder: "Hair", + TopLevel: true, + Protected: true, + Parent: "Ponytail", + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + ...GetModelLayers("DrillLeft"), + ...GetModelLayers("DrillRight"), + ]) +}); +AddModel({ + Name: "Twintails", + Folder: "Hair", + TopLevel: true, + Protected: true, + Parent: "Ponytail", + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + ...GetModelLayers("TwintailLeft"), + ...GetModelLayers("TwintailRight"), + ]) +}); +AddModel({ + Name: "Ahoge", + Folder: "Hair", + TopLevel: true, + Protected: true, + Categories: ["Hairstyles"], + Layers: ToLayerMap([ + { Name: "Ahoge", Layer: "Ahoge", Pri: 0, + HideWhenOverridden: true, + HideOverrideLayer: "Hat", + }, + ]) +}); + +AddModel({ + Name: "PointyAhoge", + Folder: "Pointy", + Parent: "Ahoge", + Protected: true, + Categories: ["Hairstyles"], + Layers: ToLayerMap([ + { Name: "Ahoge", Layer: "Ahoge", Pri: 0, + HideWhenOverridden: true, + HideOverrideLayer: "Hat", + OffsetX: 527, + OffsetY: 80, + }, + ]) +}); + + + +AddModel({ + Name: "RoundHat", + Folder: "Hat", + Parent: "RoundHat", + TopLevel: true, + Categories: ["Hats"], + Layers: ToLayerMap([ + { Name: "Hat", Layer: "Hat", Pri: 35, + Invariant: true, + InheritColor: "Rim", + }, + { Name: "HatTop", Layer: "Hat", Pri: 35.5, + HideWhenOverridden: true, + Invariant: true, + InheritColor: "Top", + }, + { Name: "Ribbon", Layer: "Hat", Pri: 36, + TieToLayer: "HatTop", + Invariant: true, + NoOverride: true, + }, + { Name: "HatBack", Layer: "HatBack", Pri: 35, + Invariant: true, + InheritColor: "Rim", + TieToLayer: "Hat", + NoOverride: true, + }, + ]) +}); + + + +AddModel({ + Name: "TopHatSmall", + Folder: "Hat", + Parent: "TopHatSmall", + TopLevel: true, + Categories: ["Hats"], + Layers: ToLayerMap([ + { Name: "TopHatSmall", Layer: "Hat", Pri: 5, + HideWhenOverridden: true, + Invariant: true, + InheritColor: "Rim", + }, + { Name: "TopHatSmallBow", Layer: "Hat", Pri: 5.1, + Invariant: true, + InheritColor: "Ribbon", + NoOverride: true, + TieToLayer: "TopHatSmall", + }, + ]) +}); + + +AddModel({ + Name: "HeavyMaidKnightHairband", + Parent: "HeavyMaidKnight", + Parent2: ["Hairband"], + Folder: "MaidKnightHeavy", + TopLevel: false, + Protected: true, + Categories: ["Hairstyles", "Accessories", "Hairbands"], + Layers: ToLayerMap([ + { Name: "Headband", Layer: "HairFront", Pri: 17, + NoOverride: true, + }, + { Name: "HeadbandFrill", Layer: "HairFront", Pri: 17.1, + NoOverride: true, TieToLayer: "Headband", + InheritColor: "Frill", + }, + { Name: "HeadbandRibbon", Layer: "HairFront", Pri: 17.1, + NoOverride: true, TieToLayer: "Headband", + InheritColor: "Ribbon", + }, + { Name: "HeadbandRibbonBack", Layer: "Head", Pri: -1, + NoOverride: true, TieToLayer: "Headband", + InheritColor: "Ribbon", + }, + ]) +}); + +AddModel({ + Name: "LightMaidKnightHairband", + Parent: "LightMaidKnight", + Parent2: ["Hairband"], + Folder: "MaidKnightLight", + TopLevel: false, + Protected: true, + Categories: ["Hairstyles", "Accessories", "Hairbands"], + Layers: ToLayerMap([ + { Name: "Headband", Layer: "HairFront", Pri: 15, + NoOverride: true, + }, + { Name: "HeadbandFrill", Layer: "HairFront", Pri: 15.1, + NoOverride: true, TieToLayer: "Headband", + InheritColor: "Frill", + }, + { Name: "HeadbandRibbon", Layer: "HairFront", Pri: 15.1, + NoOverride: true, TieToLayer: "Headband", + InheritColor: "Ribbon", + }, + ]) +}); diff --git a/Data/ModelListHair2.ts b/Data/ModelListHair2.ts new file mode 100644 index 000000000..2aa298287 --- /dev/null +++ b/Data/ModelListHair2.ts @@ -0,0 +1,439 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "AuraHair", + Folder: "Hair2", + TopLevel: true, + Protected: true, + Parent: "StraightBangs", + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "HairAura_Front", Layer: "Hair", Pri: 1, + SwapLayerPose: {HoodMask: "HairOver"}, + InheritColor: "Front", + }, + { Name: "HairAura", Layer: "HairFront", Pri: 4, + InheritColor: "Sides", + }, + ]) +}); + + +AddModel({ + Name: "BlondeFront", + Folder: "Hair2", + Parent: "StraightBangs", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "BlondeFront", Layer: "HairOver", Pri: 3, + InheritColor: "Hair", + HidePoses: {"Marhnth": true}, + }, + { Name: "BlondeBangs", Layer: "HairFront", Pri: 3, + InheritColor: "Bangs", + HidePoses: {"Marhnth": true}, + }, + { Name: "BlondeFrontM", Layer: "HairOver", Pri: 3, + InheritColor: "Hair", + RequirePoses: {"Marhnth": true}, + }, + { Name: "BlondeBangsM", Layer: "HairFront", Pri: 3, + InheritColor: "Bangs", + RequirePoses: {"Marhnth": true}, + }, + { Name: "Hairpin", Layer: "HairFront", Pri: 30, + NoOverride: true, + Folder: "Uniform", + RequirePoses: {"Marhnth": true}, + }, + ]) +}); +AddModel({ + Name: "BlondeBack", + Folder: "Hair2", + Parent: "BackStraight", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "BlondeBack", Layer: "HairBack", Pri: -3, + InheritColor: "Back", + HidePoses: {"Marhnth": true}, + }, + { Name: "BlondeBackM", Layer: "HairBack", Pri: -3, + InheritColor: "Back", + RequirePoses: {"Marhnth": true}, + }, + ]) +}); + + + +AddModel({ + Name: "AuraBang_Left", + Folder: "Hair2", + TopLevel: false, + Parent: "AuraHair", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "HairAura_Left", Layer: "Hair", Pri: -100, + InheritColor: "Bang", + }, + { Name: "HairAura_LeftB", Layer: "Hair", Pri: -105, + InheritColor: "Tail", + }, + ]) +}); +AddModel({ + Name: "AuraBang_Right", + Folder: "Hair2", + TopLevel: false, + Parent: "AuraHair", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "HairAura_Right", Layer: "Hair", Pri: -100, + InheritColor: "Bang", + }, + { Name: "HairAura_RightB", Layer: "Hair", Pri: -105, + InheritColor: "Tail", + }, + ]) +}); + + + +AddModel({ + Name: "AuraBang_Left_Back", + Folder: "Hair2", + TopLevel: false, + Parent: "AuraHair", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "HairAura_Left", Layer: "Hair", Pri: -100, + InheritColor: "Bang", + }, + { Name: "HairAura_LeftB", Layer: "HairPonytail", Pri: -5, + InheritColor: "Tail", + }, + ]) +}); +AddModel({ + Name: "AuraBang_Right_Back", + Folder: "Hair2", + TopLevel: false, + Parent: "AuraHair", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "HairAura_Right", Layer: "Hair", Pri: 0, + InheritColor: "Bang", + }, + { Name: "HairAura_RightB", Layer: "HairPonytail", Pri: -5, + InheritColor: "Tail", + }, + ]) +}); + + +AddModel({ + Name: "Hair2", + Folder: "Hair2", + Parent: "Straight", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair2_Front", Layer: "Hair", Pri: 9, + SwapLayerPose: {HoodMask: "HairOver"}, + InheritColor: "Front", + }, + { Name: "Hair2_FrontB", Layer: "HairFront", Pri: -5, + InheritColor: "LeftSideBang", + }, + { Name: "Hair2_FrontC", Layer: "HairFront", Pri: -5, + InheritColor: "RightSideBang", + }, + ]) +}); +AddModel({ + Name: "Hair2_LeftPuff", + Folder: "Hair2", + TopLevel: false, + Parent: "Twintails", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "Hair2_Left", Layer: "Hair", Pri: 40, + InheritColor: "LeftPuff", + }, + ]) +}); +AddModel({ + Name: "Hair2_RightPuff", + Folder: "Hair2", + TopLevel: false, + Parent: "Twintails", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + Layers: ToLayerMap([ + { Name: "Hair2_Right", Layer: "Hair", Pri: 40, + InheritColor: "RightPuff", + }, + ]) +}); + + +AddModel({ + Name: "Hair3", + Folder: "Hair2", + Parent: "StraightBangs", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair3_FrontA", Layer: "Hair", Pri: 9, + SwapLayerPose: {HoodMask: "HairOver"}, + InheritColor: "Hair", + }, + { Name: "Hair3_FrontC", Layer: "HairFront", Pri: 30, + InheritColor: "Bangs", + }, + { Name: "Hair3_FrontD", Layer: "HairFront", Pri: 31, + InheritColor: "Under", + TieToLayer: "Hair3_FrontC", + }, + ]) +}); +AddModel({ + Name: "Hair3_Short", + Folder: "Hair2", + TopLevel: false, + Parent: "Curly", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair3_FrontA", Layer: "Hair", Pri: 9, + SwapLayerPose: {HoodMask: "HairOver"}, + InheritColor: "Hair", + }, + { Name: "Hair3_FrontC", Layer: "HairFront", Pri: 30, + InheritColor: "Bangs", + }, + { Name: "Hair3_FrontD", Layer: "HairFront", Pri: 31, + InheritColor: "Under", + TieToLayer: "Hair3_FrontC", + }, + ]) +}); +AddModel({ + Name: "Hair3_Bangs", + Folder: "Hair2", + TopLevel: false, + Parent: "StraightBangs", + Protected: true, + Categories: ["Hairstyles"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair3_FrontE", Layer: "HairFront", Pri: 40, + InheritColor: "Bangs", + }, + ]) +}); +AddModel({ + Name: "Hair3Back", + Folder: "Hair2", + TopLevel: false, + Parent: "MessyBack", + Protected: true, + Categories: ["Hairstyles", "BackHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair3_Back", Layer: "HairBack", Pri: -40, + InheritColor: "Back", + }, + ]) +}); + + +AddModel({ + Name: "Hair4", + Folder: "Hair2", + Parent: "Straight", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair4_Front", Layer: "Hair", Pri: 4, + SwapLayerPose: {HoodMask: "HairOver"}, + InheritColor: "Hair", + }, + { Name: "Hair4_FrontB", Layer: "HairFront", Pri: 5, + InheritColor: "Front", + }, + ]) +}); + +AddModel({ + Name: "Hair4_TailLeft", + Folder: "Hair2", + TopLevel: false, + Parent: "Twintails", + Protected: true, + Categories: ["Hairstyles"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair4_Left", Layer: "HairPonytail", Pri: -5, + InheritColor: "Tail", + }, + { Name: "Hair4_LeftB", Layer: "HairPonytail", Pri: -4.9, + InheritColor: "Highlight", + }, + ]) +}); +AddModel({ + Name: "Hair4_TailRight", + Folder: "Hair2", + TopLevel: false, + Parent: "Twintails", + Protected: true, + Categories: ["Hairstyles"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair4_Right", Layer: "HairPonytail", Pri: -5, + InheritColor: "Tail", + }, + { Name: "Hair4_RightB", Layer: "HairPonytail", Pri: -4.9, + InheritColor: "Highlight", + }, + ]) +}); + + +AddModel({ + Name: "Hair5", + Folder: "Hair2", + Parent: "Straight", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair5_Front", Layer: "Hair", Pri: 4, + SwapLayerPose: {HoodMask: "HairOver"}, + InheritColor: "Hair", + }, + { Name: "Hair5_FrontB", Layer: "HairFront", Pri: 5, + InheritColor: "FrontLeft", + }, + { Name: "Hair5_FrontC", Layer: "HairFront", Pri: 5.2, + InheritColor: "Under", + }, + ]) +}); +AddModel({ + Name: "Hair5_Highlight", + Folder: "Hair2", + TopLevel: false, + Parent: "Straight", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair5_FrontD", Layer: "HairFront", Pri: 6, + InheritColor: "HighlightLeft", + }, + { Name: "Hair5_FrontE", Layer: "HairFront", Pri: 6, + InheritColor: "HighlightRight", + }, + ]) +}); + +AddModel({ + Name: "Hair5_TailLeft", + Folder: "Hair2", + TopLevel: false, + Parent: "Twintails", + Protected: true, + Categories: ["Hairstyles"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair5_Left", Layer: "HairPonytail", Pri: -4, + InheritColor: "Tail", + }, + ]) +}); +AddModel({ + Name: "Hair5_TailRight", + Folder: "Hair2", + TopLevel: false, + Parent: "Twintails", + Protected: true, + Categories: ["Hairstyles"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair5_Right", Layer: "HairPonytail", Pri: -4, + InheritColor: "Tail", + }, + ]) +}); + + + +AddModel({ + Name: "Hair6", + Folder: "Hair2", + Parent: "Straight", + Protected: true, + Categories: ["Hairstyles", "FrontHair"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair6_Front", Layer: "Hair", Pri: 7, + SwapLayerPose: {HoodMask: "HairOver"}, + InheritColor: "Hair", + }, + { Name: "Hair6_FrontB", Layer: "HairFront", Pri: 8, + InheritColor: "FrontLeft", + }, + ]) +}); + + +AddModel({ + Name: "Hair6_TailLeft", + Folder: "Hair2", + TopLevel: false, + Parent: "Twintails", + Protected: true, + Categories: ["Hairstyles"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair6_Left", Layer: "HairPonytail", Pri: 30, + InheritColor: "Tail", + }, + ]) +}); +AddModel({ + Name: "Hair6_TailRight", + Folder: "Hair2", + TopLevel: false, + Parent: "Twintails", + Protected: true, + Categories: ["Hairstyles"], + AddPose: ["Hair"], + Layers: ToLayerMap([ + { Name: "Hair6_Right", Layer: "HairPonytail", Pri: 30, + InheritColor: "Tail", + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Armbinders.ts b/Data/ModelList_Armbinders.ts new file mode 100644 index 000000000..c4a9af9d0 --- /dev/null +++ b/Data/ModelList_Armbinders.ts @@ -0,0 +1,236 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + +AddModel({ + Name: "FestiveArmbinder", + Folder: "Festive", + Restraint: true, + TopLevel: true, + Parent: "SantaHat", + AddPose: ["HideHands"], + Categories: ["Restraints", "Latex", "Binders"], + Layers: ToLayerMap([ + { Name: "BinderLeft", Layer: "BindArmLeft", Pri: 32.1, + HideWhenOverridden: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + InheritColor: "Binder", + DisplacementSprite: "BinderLeft", + DisplaceLayers: ToMap(["Arms"]), + DisplaceAmount: 100, + }, + { Name: "BinderRight", Layer: "BindArmRight", Pri: 32.1, + HideWhenOverridden: true, + Poses: ToMap(["Boxtie", "Wristtie"]), + InheritColor: "Binder", + DisplacementSprite: "BinderRight", + DisplaceLayers: ToMap(["Arms"]), + DisplaceAmount: 100, + }, + { Name: "BinderStrapLeft", Layer: "BindArmLeft", Pri: 32, + NoOverride: true, + TieToLayer: "BinderLeft", + Poses: ToMap(["Wristtie", "Boxtie"]), + InheritColor: "Strap", + }, + { Name: "BinderFluffLeft", Layer: "BindArmLeft", Pri: 32, + NoOverride: true, + TieToLayer: "BinderLeft", + Poses: ToMap(["Wristtie", "Boxtie"]), + InheritColor: "Fluff", + }, + ]) +}); + + +AddModel({ + Name: "SmoothArmbinder", + Folder: "Armbinder", + Restraint: true, + TopLevel: false, + Parent: "Armbinder", + AddPose: ["HideHands"], + Categories: ["Restraints", "Latex", "Binders"], + Layers: ToLayerMap([ + { Name: "BinderLeft", Layer: "BindArmLeft", Pri: 30, + HideWhenOverridden: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + InheritColor: "Binder", + DisplacementSprite: "BinderLeft", + DisplaceLayers: ToMap(["Arms"]), + DisplaceAmount: 100, + }, + { Name: "BinderRight", Layer: "BindArmRight", Pri: 30, + HideWhenOverridden: true, + Poses: ToMap(["Boxtie", "Wristtie"]), + InheritColor: "Binder", + DisplacementSprite: "BinderRight", + DisplaceLayers: ToMap(["Arms"]), + DisplaceAmount: 100, + }, + ]) +}); + + + +AddModel({ + Name: "Armbinder", + Folder: "Armbinder", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Leather", "Binders"], + AddPose: ["HideHands"], + Layers: ToLayerMap([ + ...GetModelLayers("SmoothArmbinder"), + { Name: "StrapsLeft", Layer: "BindArmLeft", Pri: 31, + HideWhenOverridden: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + NoOverride: true, + InheritColor: "BinderStraps", + }, + { Name: "StrapsRight", Layer: "BindArmRight", Pri: 31, + HideWhenOverridden: true, + Poses: ToMap(["Boxtie"]), + NoOverride: true, + InheritColor: "BinderStraps", + }, + ]) +}); + + + +AddModel({ + Name: "ArmbinderCross", + Folder: "Armbinder", + Restraint: true, + TopLevel: false, + Parent: "Armbinder", + AddPose: ["HideHands"], + Categories: ["Restraints", "Leather", "Binders"], + Layers: ToLayerMap([ + ...GetModelLayers("Armbinder"), + { Name: "Cross", Layer: "BindArms", Pri: 30, + HideWhenOverridden: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + InheritColor: "Straps", + }, + ]) +}); + +AddModel({ + Name: "SmoothArmbinderCross", + Folder: "Armbinder", + Restraint: true, + TopLevel: false, + Parent: "Armbinder", + AddPose: ["HideHands"], + Categories: ["Restraints", "Latex", "Binders"], + Layers: ToLayerMap([ + ...GetModelLayers("SmoothArmbinder"), + { Name: "Cross", Layer: "BindArms", Pri: 30, + HideWhenOverridden: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + InheritColor: "Straps", + }, + ]) +}); + +AddModel({ + Name: "ArmbinderSecure", + Folder: "Armbinder", + Restraint: true, + TopLevel: false, + Parent: "Armbinder", + AddPose: ["HideHands"], + Categories: ["Restraints", "Leather", "Binders"], + Layers: ToLayerMap([ + ...GetModelLayers("Armbinder"), + { Name: "Secure", Layer: "BindArms", Pri: 30, + HideWhenOverridden: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + InheritColor: "Straps", + }, + ]) +}); + +AddModel({ + Name: "SmoothArmbinderSecure", + Folder: "Armbinder", + Restraint: true, + TopLevel: false, + Parent: "Armbinder", + AddPose: ["HideHands"], + Categories: ["Restraints", "Latex", "Binders"], + Layers: ToLayerMap([ + ...GetModelLayers("SmoothArmbinder"), + { Name: "Secure", Layer: "BindArms", Pri: 30, + HideWhenOverridden: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + InheritColor: "Straps", + }, + ]) +}); + +AddModel({ + Name: "ArmbinderGwen", + Folder: "Armbinder", + Restraint: true, + TopLevel: false, + Parent: "Armbinder", + AddPose: ["HideHands"], + Categories: ["Restraints", "Leather", "Binders"], + Layers: ToLayerMap([ + ...GetModelLayers("Armbinder"), + { Name: "Gwen", Layer: "BindArms", Pri: 30, + HideWhenOverridden: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + InheritColor: "Straps", + }, + ]) +}); + + +AddModel({ + Name: "SmoothArmbinderGwen", + Folder: "Armbinder", + Restraint: true, + TopLevel: false, + Parent: "Armbinder", + AddPose: ["HideHands"], + Categories: ["Restraints", "Latex", "Binders"], + Layers: ToLayerMap([ + ...GetModelLayers("SmoothArmbinder"), + { Name: "Gwen", Layer: "BindArms", Pri: 30, + HideWhenOverridden: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + InheritColor: "Straps", + }, + ]) +}); + + + + +AddModel({ + Name: "WolfArmbinder", + Folder: "Armbinder", + Restraint: true, + TopLevel: false, + Parent: "Armbinder", + AddPose: ["HideHands"], + Categories: ["Restraints", "Leather", "Binders"], + Layers: ToLayerMap([ + ...GetModelLayers("Armbinder"), + { Name: "WolfHarness", Layer: "BindArms", Pri: 30, + HideWhenOverridden: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + InheritColor: "Straps", + Invariant: true, + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Belts.ts b/Data/ModelList_Belts.ts new file mode 100644 index 000000000..ba42d14ab --- /dev/null +++ b/Data/ModelList_Belts.ts @@ -0,0 +1,216 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "BeltsArms1", + Folder: "Belts", + Parent: "Belt", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Arms1", Layer: "BindChest", Pri: 50, + InheritColor: "Belt", + DisplacementSprite: "Arm2Squish", + DisplacementMorph: {Boxtie: "Boxtie",Wristtie: "Wristtie",Front: "Boxtie",Crossed: "Boxtie",}, + DisplaceLayers: ToMap(["Ribbon1"]), + Invariant: true, + NoOverride: true, + }, + { Name: "LeftArm1", Layer: "BindArmLeft", Pri: 60, + InheritColor: "Belt", + Poses: ToMap(["Wristtie", "Boxtie"]), + NoOverride: true, + }, + { Name: "RightArm1", Layer: "BindArmRight", Pri: 60, + InheritColor: "Belt", + Poses: ToMap(["Wristtie", "Boxtie"]), + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "BeltsArms2", + Folder: "Belts", + Parent: "Belt", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Arms2", Layer: "StrapsUnderbust", Pri: 60, + InheritColor: "Belt", + Invariant: true, + NoOverride: true, + DisplacementSprite: "Arm1Squish", + DisplacementMorph: {Boxtie: "Boxtie",Wristtie: "Wristtie",Front: "Boxtie",Crossed: "Boxtie",}, + DisplaceLayers: ToMap(["Ribbon1"]), + }, + { Name: "LeftArm2", Layer: "BindArmLeft", Pri: 60, + InheritColor: "Belt", + NoOverride: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + }, + { Name: "RightArm2", Layer: "BindArmRight", Pri: 60, + InheritColor: "Belt", + NoOverride: true, + Poses: ToMap(["Wristtie", "Boxtie"]), + }, + ]) +}); + +AddModel({ + Name: "BeltsArmsAll", + Folder: "Belts", + Parent: "Belt", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + ...GetModelLayers("BeltsArms1"), + ...GetModelLayers("BeltsArms2"), + ]) +}); + + + + +AddModel({ + Name: "BeltsLegs1", + Folder: "Belts", + Parent: "Belt", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Legs1", Layer: "Thighs", Pri: 60, + Poses: ToMapSubtract([...LEGPOSES], ["Spread"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Belt", + DisplacementMorph: {Hogtie: "Hogtie", KneelClosed: "KneelClosed"}, + DisplacementSprite: "BeltLegs1Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonThighs"]), + NoOverride: true, + }, + { Name: "RightLegs1", Layer: "BindThighRight", Pri: 60, + Poses: ToMap(["Kneel", "KneelClosed"]), + InheritColor: "Belt", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "BeltsLegs2", + Folder: "Belts", + Parent: "Belt", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Legs2", Layer: "Thighs", Pri: 60, + Poses: ToMapSubtract([...LEGPOSES], ["Spread"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Belt", + DisplacementMorph: {Hogtie: "Hogtie", KneelClosed: "KneelClosed"}, + DisplacementSprite: "BeltLegs2Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonThighs"]), + NoOverride: true, + }, + { Name: "RightLegs2", Layer: "BindThighRight", Pri: 60, + Poses: ToMap(["Kneel", "KneelClosed"]), + InheritColor: "Belt", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "BeltsLegsAll", + Folder: "Belts", + Parent: "Belt", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + ...GetModelLayers("BeltsLegs1"), + ...GetModelLayers("BeltsLegs2"), + ]) +}); + + +AddModel({ + Name: "BeltsFeet1", + Folder: "Belts", + Parent: "Belt", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Feet1", Layer: "AnklesOver", Pri: 60, + Poses: ToMapSubtract([...CLOSEDPOSES], ["Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Belt", + DisplacementMorph: {KneelClosed: "KneelClosed"}, + DisplacementSprite: "BeltFeet1Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonCalf"]), + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "BeltsFeet2", + Folder: "Belts", + Parent: "Belt", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Feet2", Layer: "AnklesOver", Pri: 60, + Poses: ToMapSubtract([...CLOSEDPOSES], ["Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Belt", + DisplacementMorph: {KneelClosed: "KneelClosed"}, + DisplacementSprite: "BeltFeet2Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonCalf"]), + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "BeltsFeetAll", + Folder: "Belts", + Parent: "Belt", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + ...GetModelLayers("BeltsFeet1"), + ...GetModelLayers("BeltsFeet2"), + ]) +}); + + +AddModel({ + Name: "Belt", + Folder: "Belts", + TopLevel: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Belt", Layer: "HarnessMid", Pri: 50, + Invariant: true, + InheritColor: "Belt", + DisplacementSprite: "BeltSquish", + DisplaceLayers: ToMap(["RibbonCalf"]), + NoOverride: true, + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Blindfolds.ts b/Data/ModelList_Blindfolds.ts new file mode 100644 index 000000000..5072d9ce6 --- /dev/null +++ b/Data/ModelList_Blindfolds.ts @@ -0,0 +1,138 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "TapeFace", + Folder: "GagTape", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags", "Blindfolds", "Masks"], + AddPose: ["FaceCoverGag"], + AddPoseConditional: { + Xray: ["HoodMask"], + }, + Layers: ToLayerMap([ + { Name: "Face", Layer: "Hood", Pri: -20, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Tape", + }, + ]) +}); +AddModel({ + Name: "ClothBlindfold", + Folder: "Blindfold", + TopLevel: true, + Group: "Blindfold", + Restraint: true, + Categories: ["Restraints", "Blindfolds"], + AddPose: ["Blindfolds"], + Layers: ToLayerMap([ + { Name: "Cloth", Layer: "Blindfold", Pri: -10, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + +AddModel(GetModelFashionVersion("ClothBlindfold", true)); +AddModel({ + Name: "BlindfoldBasic", + Folder: "Blindfold", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Blindfolds"], + AddPose: ["Blindfolds"], + Layers: ToLayerMap([ + { Name: "Basic", Layer: "Blindfold", Pri: 0, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Blindfold", + }, + { Name: "BasicRim", Layer: "Blindfold", Pri: 0.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + TieToLayer: "Basic", + NoOverride: true, + InheritColor: "Rim", + }, + ]) +}); + +AddModel(GetModelFashionVersion("BlindfoldBasic", true)); +AddModel({ + Name: "BlindfoldLeather", + Folder: "Blindfold", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Blindfolds"], + AddPose: ["Blindfolds"], + Layers: ToLayerMap([ + { Name: "LeatherBase", Layer: "Blindfold", Pri: 2, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Blindfold", + }, + { Name: "LeatherRim", Layer: "Blindfold", Pri: 2.1, + Invariant: true, + TieToLayer: "LeatherBase", + NoOverride: true, + InheritColor: "Rim", + }, + ]) +}); +AddModel({ + Name: "KittyBlindfold", + Folder: "Blindfold", + TopLevel: false, + Restraint: true, + Parent: "BlindfoldLeather", + Categories: ["Restraints", "Blindfolds"], + AddPose: ["Blindfolds"], + Filters: { + Blindfold: {"gamma":0.9833333333333333,"saturation":1,"contrast":0.8,"brightness":3.1,"red":1,"green":1,"blue":1,"alpha":1}, + KittyEyes: {"gamma":1,"saturation":1,"contrast":0.55,"brightness":1.7666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("BlindfoldLeather"), + { Name: "KittyEyes", Layer: "Blindfold", Pri: 2.1, + Invariant: true, + TieToLayer: "LeatherBase", + NoOverride: true, + }, + ]) +}); + + +AddModel(GetModelFashionVersion("BlindfoldLeather", true)); +AddModel(GetModelFashionVersion("KittyBlindfold", true)); +AddModel({ + Name: "BlindfoldTape", + Folder: "Blindfold", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Blindfolds"], + AddPose: ["Blindfolds"], + Layers: ToLayerMap([ + { Name: "Tape", Layer: "Blindfold", Pri: -1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Tape", + }, + ]) +}); + +AddModel(GetModelFashionVersion("BlindfoldTape", true)); \ No newline at end of file diff --git a/Data/ModelList_Bra.ts b/Data/ModelList_Bra.ts new file mode 100644 index 000000000..9032ff474 --- /dev/null +++ b/Data/ModelList_Bra.ts @@ -0,0 +1,121 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "Bra", + Folder: "Bra", + Parent: "Bra", + TopLevel: true, + Categories: ["Bras"], + Layers: ToLayerMap([ + { Name: "Bra", Layer: "BraChest", Pri: -35, + Invariant: true, + InheritColor: "Cups", + EraseAmount: 100, + EraseSprite: "LaceChest", + EraseLayers: ToMap(["CorsetBra"]), + }, + { Name: "BraRim", Layer: "BraChest", Pri: -34.9, + Invariant: true, + NoOverride: true, + InheritColor: "Rim", + TieToLayer: "Bra", + }, + { Name: "InnerLines", Layer: "BraChest", Pri: -34.7, + Invariant: true, + NoOverride: true, + InheritColor: "Seams", + TieToLayer: "Bra", + }, + { Name: "BraUnder", Layer: "Bra", Pri: -35, + Invariant: true, + NoOverride: true, + InheritColor: "Under", + }, + { Name: "BraUnderRim", Layer: "Bra", Pri: -34.9, + Invariant: true, + NoOverride: true, + InheritColor: "Rim", + TieToLayer: "BraUnder", + }, + ]) +}); + + +AddModel({ + Name: "BraStriped", + Folder: "Bra", + Parent: "Bra", + TopLevel: false, + Categories: ["Bras"], + Layers: ToLayerMap([ + ...GetModelLayers("Bra"), + { Name: "Stripes", Layer: "BraChest", Pri: -34.8, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "BraCherry", + Folder: "Bra", + Parent: "Bra", + TopLevel: false, + Categories: ["Bras"], + Layers: ToLayerMap([ + ...GetModelLayers("Bra"), + { Name: "Cherry", Layer: "BraChest", Pri: -34.8, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "BraRose", + Folder: "Bra", + Parent: "Bra", + TopLevel: false, + Categories: ["Bras"], + Layers: ToLayerMap([ + ...GetModelLayers("Bra"), + { Name: "Rose", Layer: "BraChest", Pri: -34.8, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "BraInvertedRose", + Folder: "Bra", + Parent: "Bra", + TopLevel: false, + Categories: ["Bras"], + Layers: ToLayerMap([ + ...GetModelLayers("Bra"), + { Name: "InvertedRose", Layer: "BraChest", Pri: -34.8, + Invariant: true, + }, + ]) +}); + + + +AddModel({ + Name: "BraStraps", + Folder: "Bra", + Parent: "Bra", + TopLevel: false, + Categories: ["Bras"], + Layers: ToLayerMap([ + { Name: "Straps", Layer: "BraChest", Pri: -35, + Invariant: true, + MorphPoses: {Boxtie: "Tied", Crossed: "Tied", Front: "Tied", Wristtie: "Tied", Up: "Up"}, + }, + ]) +}); + diff --git a/Data/ModelList_Bubble.ts b/Data/ModelList_Bubble.ts new file mode 100644 index 000000000..c494947a9 --- /dev/null +++ b/Data/ModelList_Bubble.ts @@ -0,0 +1,179 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + +AddModel({ + Name: "Bubble", + Folder: "Bubble", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Latex"], + AddPose: ["BubbleHogtie", "PreferKneel", "ShiftRight"], + Layers: ToLayerMap([ + { Name: "Bubble", Layer: "FurnitureFront", Pri: -40, + Invariant: true, + OffsetY: 350, + EraseSprite: "Bubble", + EraseLayers: ToMap(["Bubble"]), + }, + ]) +}); + +AddModel({ + Name: "SlimeBubble", + Folder: "Bubble", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Latex"], + AddPose: ["BubbleHogtie", "PreferKneel", "ShiftRight"], + Filters: { + Bubble: {"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.2166666666666668,"red":1.7000000000000002,"green":0.5166666666666666,"blue":2.3833333333333333,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "Bubble", Layer: "FurnitureFront", Pri: -40, + Invariant: true, + OffsetY: 350, + EraseSprite: "Bubble", + EraseLayers: ToMap(["Bubble"]), + }, + ]) +}); +AddModel({ + Name: "BubbleSquishy", + Folder: "Bubble", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Latex"], + AddPose: ["UprightHogtie", "PreferKneel", "ShiftRight"], + Layers: ToLayerMap([ + { Name: "BubbleSquishy", Layer: "FurnitureFront", Pri: -50, + Invariant: true, + OffsetY: 350, + EraseSprite: "Bubble", + EraseLayers: ToMap(["Bubble"]), + }, + { Name: "BubbleSquishyBack", Layer: "FurnitureBack", Pri: 50, + Invariant: true, + NoErase: true, + OffsetY: 350, + }, + ]) +}); + +AddModel({ + Name: "LatexSphere", + Folder: "Bubble", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Latex"], + AddPose: ["UprightHogtie", "PreferKneel", "ShiftRight"], + Layers: ToLayerMap([ + { Name: "LatexSphere", Layer: "FurnitureFront", Pri: 21, + Invariant: true, + OffsetY: 350, + Poses: {Menu: true}, + HidePoses: ToMap(["Xray"]), + }, + { Name: "LatexSphereCutaway", Layer: "FurnitureFront", Pri: 20, + Invariant: true, + OffsetY: 350, + NoErase: true, + }, + { Name: "LatexSphereCutawayBack", Layer: "FurnitureBack", Pri: -20, + Invariant: true, + OffsetY: 350, + NoErase: true, + EraseSprite: "Bubble2", + EraseLayers: ToMap(["Bubble"]), + }, + ]) +}); + +AddModel({ + Name: "BallSuit", + Folder: "Bubble", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Latex"], + AddPose: ["ForceHogtie"], + AddPoseConditional: { + BallsuitTip: ["UprightHogtie"], + }, + AddPoseIf: { + BallsuitTip: ["TippedHogtie"], + }, + Layers: ToLayerMap([ + { Name: "BallSuit", Layer: "FurnitureLinked", Pri: 20.5, + Invariant: true, + //OffsetY: 350, + EraseSprite: "BallSuit", + EraseLayers: ToMap(["Bubble"]), + }, + ]) +}); + + +AddModel({ + Name: "BubbleHead", + Folder: "Bubble", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Latex"], + Filters: { + Bubble: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5}, + }, + Layers: ToLayerMap([ + { Name: "Head", Layer: "InflatableHead", Pri: 50, + Invariant: true, + EraseSprite: "BubbleHead", + EraseInvariant: true, + EraseLayers: ToMap(["HairHelmet"]), + InheritColor: "Bubble", + }, + ]) +}); +AddModel(GetModelFashionVersion("BubbleHead", true)); +AddModel({ + Name: "BubbleArms", + Folder: "Bubble", + TopLevel: false, + Parent: "BubbleHead", + Restraint: true, + Categories: ["Restraints", "Latex"], + Filters: { + Bubble: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5}, + }, + Layers: ToLayerMap([ + { Name: "Arms", Layer: "InflatableArms", Pri: 50, + Invariant: true, + InheritColor: "Bubble", + }, + ]) +}); +AddModel({ + Name: "BubbleLegs", + Folder: "Bubble", + TopLevel: false, + Parent: "BubbleHead", + Categories: ["Restraints", "Latex"], + Filters: { + Bubble: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5}, + }, + Layers: ToLayerMap([ + { Name: "Legs", Layer: "InflatableLegs", Pri: 50, + Invariant: true, + InheritColor: "Bubble", + }, + ]) +}); +AddModel(GetModelFashionVersion("BubbleLegs", true)); \ No newline at end of file diff --git a/Data/ModelList_Chastity.ts b/Data/ModelList_Chastity.ts new file mode 100644 index 000000000..c3f331264 --- /dev/null +++ b/Data/ModelList_Chastity.ts @@ -0,0 +1,966 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + +AddModel({ + Name: "LatexTop", + Folder: "Chastity", + Parent: "LatexTop", + TopLevel: true, + Categories: ["Bras"], + Layers: ToLayerMap([ + { Name: "BraProtoLining", Layer: "BraChest", Pri:-40.1, + Invariant: true, + InheritColor: "Latex", + TieToLayer: "BraProtoLiningRim", + }, + { Name: "BraProtoLiningMid", Layer: "StrapsUnderbust", Pri: -40.1, + Invariant: true, + InheritColor: "Latex", + TieToLayer: "BraProtoLiningMidRim", + }, + { Name: "BraProtoLiningRim", Layer: "BraChest", Pri:-40, + Invariant: true, + InheritColor: "Hem", + }, + { Name: "BraProtoLiningMidRim", Layer: "StrapsUnderbust", Pri: -40, + Invariant: true, + InheritColor: "Hem", + }, + + ]) +}); + + + +AddModel({ + Name: "LatexTopZip", + Folder: "Chastity", + Parent: "LatexTop", + TopLevel: false, + Categories: ["Bras"], + Layers: ToLayerMap([ + { Name: "BraProtoLiningZip", Layer: "BraChest", Pri: -40.1, + Invariant: true, + InheritColor: "Latex", + TieToLayer: "BraProtoLiningZipRim", + }, + { Name: "BraProtoLiningMidZip", Layer: "StrapsUnderbust", Pri: -40.1, + Invariant: true, + InheritColor: "Latex", + TieToLayer: "BraProtoLiningMidZipRim", + }, + { Name: "BraProtoLiningZipRim", Layer: "BraChest", Pri: -40, + Invariant: true, + InheritColor: "Hem", + }, + { Name: "BraProtoLiningMidZipRim", Layer: "StrapsUnderbust", Pri: -40, + Invariant: true, + InheritColor: "Hem", + }, + + ]) +}); + + +AddModel({ + Name: "BraProto", + Folder: "Chastity", + Parent: "BraCyber", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "ChastityBra", "Metal", "SciFi"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "BraProto", Layer: "BindChestLower", Pri: 14.2-100, + Invariant: true, + InheritColor: "Metal", + }, + { Name: "BraProtoLining", Layer: "BindChestLower", Pri: 14.1-100, + Invariant: true, + InheritColor: "Lining", + }, + { Name: "BraProtoLiningMid", Layer: "StrapsUnderbust", Pri: 14-100, + Invariant: true, + InheritColor: "Lining", + }, + { Name: "BraProtoCups", Layer: "BindChestLower", Pri: 14-100, + Invariant: true, + TieToLayer: "BraProto", + NoOverride: true, + InheritColor: "Cups", + }, + { Name: "BraProtoDisplay", Layer: "BindChestLower", Pri: 14.1-100, + Invariant: true, + TieToLayer: "BraProto", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "BraProtoLock", Layer: "BindChestLower", Pri: 14.2, + Invariant: true, + TieToLayer: "BraProto", + NoOverride: true, + InheritColor: "Lock", + LockLayer: true, + }, + ]) +}); +AddModel(GetModelFashionVersion("BraProto", true)); + +AddModel({ + Name: "BraCyber", + Folder: "Chastity", + Parent: "BraCyber", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "ChastityBra", "Metal", "SciFi"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "BraCyber", Layer: "BindChestLower", Pri: 15.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + InheritColor: "Metal", + }, + { Name: "BraCyberLining", Layer: "BindChestLower", Pri: 15, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraCyber", + NoOverride: true, + InheritColor: "Lining", + }, + { Name: "BraCyberDisplay", Layer: "BindChestLower", Pri: 15, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraCyber", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "BraCyberLock", Layer: "BindChestLower", Pri: 15.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraCyber", + NoOverride: true, + InheritColor: "Lock", + LockLayer: true, + }, + ]) +}); +AddModel(GetModelFashionVersion("BraCyber", true)); + +AddModel({ + Name: "ChastityBra", + Folder: "Chastity", + Parent: "ChastityBra", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "ChastityBra", "Metal"], + Layers: ToLayerMap([ + { Name: "BraCups", Layer: "BindChestLower", Pri: -40.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + InheritColor: "Metal", + }, + { Name: "BraLining", Layer: "BindChestLower", Pri: -40, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraCups", + NoOverride: true, + InheritColor: "Lining", + }, + { Name: "BraChain", Layer: "BindChestLower", Pri: -25, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + NoOverride: true, + InheritColor: "Chain", + }, + { Name: "BraLock", Layer: "BindChestLower", Pri: -39, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraCups", + NoOverride: true, + InheritColor: "Lock", + LockLayer: true, + }, + ]) +}); +AddModel(GetModelFashionVersion("ChastityBra", true)); + + +AddModel({ + Name: "HeartBelt", + Folder: "Chastity", + Parent: "HeartBelt", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "ChastityBelt", "Metal"], + AddPose: ["ChastityBelt"], + AddPoseIf: { + ChastityOption2: ["CrotchStrap"], + }, + Layers: ToLayerMap([ + { Name: "Belt", Layer: "ChastityBelt", Pri: -40.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + //DisplacementInvariant: true, + //DisplacementSprite: "CrotchropeSquished", + //DisplaceLayers: ToMap(["RibbonTorso"]), + InheritColor: "Metal", + }, + { Name: "BeltLining", Layer: "ChastityBelt", Pri: -40, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "Belt", + InheritColor: "Lining", + }, + { Name: "BeltLock", Layer: "ChastityBelt", Pri: -39.9, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + InheritColor: "Lock", + }, + { Name: "BeltStrap", Layer: "ChastityBelt", Pri: -45.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + InheritColor: "Metal", + }, + { Name: "BeltStrapLining", Layer: "ChastityBelt", Pri: -45, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + NoOverride: true, + TieToLayer: "BeltStrap", + InheritColor: "Lining", + }, + ]) +}); + +AddModel(GetModelFashionVersion("HeartBelt", true)); + + +AddModel({ + Name: "CyberBelt", + Folder: "Chastity", + Parent: "CyberBelt", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "ChastityBelt", "Metal", "SciFi"], + AddPose: ["ChastityBelt"], + AddPoseIf: { + ChastityOption2: ["CrotchStrap"], + }, + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "Cyber", Layer: "ChastityBelt", Pri: -40, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + //DisplacementInvariant: true, + //DisplacementSprite: "CrotchropeSquished", + //DisplaceLayers: ToMap(["RibbonTorso"]), + InheritColor: "Metal", + }, + { Name: "CyberLining", Layer: "ChastityBelt", Pri: -40.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "Cyber", + InheritColor: "Lining", + }, + { Name: "CyberDisplay", Layer: "ChastityBelt", Pri: -40.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "Cyber", + InheritColor: "Display", + }, + { Name: "CyberPlug", Layer: "ChastityBelt", Pri: -40.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "Cyber", + InheritColor: "Plug", + }, + { Name: "CyberLock", Layer: "ChastityBelt", Pri: -40, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + InheritColor: "Lock", + LockLayer: true, + }, + ]) +}); +AddModel(GetModelFashionVersion("CyberBelt", true)); + + +AddModel({ + Name: "CyberPanties", + Folder: "Chastity", + Parent: "CyberBelt", + TopLevel: true, + Categories: ["Underwear", "Panties", "Metal", "SciFi"], + Layers: ToLayerMap([ + { Name: "CyberPanties", Layer: "Panties", Pri: -10, + Invariant: true, + InheritColor: "Metal", + MorphPoses: {Closed: "Closed", "Hogtie": "Closed"}, + }, + { Name: "CyberPantiesLining", Layer: "Panties", Pri: -10.1, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "CyberPanties", + InheritColor: "Lining", + MorphPoses: {Closed: "Closed", "Hogtie": "Closed"}, + }, + ]) +}); + +AddModel({ + Name: "ProtoBelt", + Folder: "Chastity", + Parent: "CyberBelt", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "ChastityBelt", "Metal", "SciFi"], + AddPose: ["ChastityBelt"], + AddPoseIf: { + ChastityOption2: ["CrotchStrap"], + }, + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + //AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "Proto", Layer: "ChastityBelt", Pri: 40.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + //DisplacementInvariant: true, + //DisplacementSprite: "CrotchropeSquished", + //DisplaceLayers: ToMap(["RibbonTorso"]), + InheritColor: "Metal", + }, + { Name: "ProtoLining", Layer: "ChastityBelt", Pri: 40, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "Proto", + InheritColor: "Lining", + }, + { Name: "ProtoDisplay", Layer: "ChastityBelt", Pri: 40, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "Proto", + InheritColor: "Display", + }, + { Name: "ProtoPlug", Layer: "ChastityBelt", Pri: 40, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "Proto", + InheritColor: "Plug", + }, + { Name: "ProtoLock", Layer: "ChastityBelt", Pri: 40.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + InheritColor: "Lock", + LockLayer: true, + }, + ]) +}); +AddModel(GetModelFashionVersion("ProtoBelt", true)); + + + +AddModel({ + Name: "DivineBelt", + Folder: "DivineBelt", + Parent: "DivineBelt", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "ChastityBelt", "Metal", "Divine"], + AddPose: ["ChastityBelt"], + AddPoseIf: { + ChastityOption2: ["CrotchStrap"], + }, + Layers: ToLayerMap([ + { Name: "BeltLines", Layer: "ChastityBelt", Pri: 45.2, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + NoColorize: true, + }, + { Name: "BeltMetal2", Layer: "ChastityBelt", Pri: 45.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "BeltLines", + InheritColor: "Shield", + }, + { Name: "BeltMetal1", Layer: "ChastityBelt", Pri: 45.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "BeltLines", + InheritColor: "Highlights", + }, + { Name: "BeltBase", Layer: "ChastityBelt", Pri: 45.0, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "BeltLines", + InheritColor: "Metal", + }, + { Name: "BeltPin", Layer: "ChastityBelt", Pri: 45.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "BeltLines", + InheritColor: "Pin", + }, + + + { Name: "LockBeltLines", Layer: "ChastityBelt", Pri: 45.6, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoColorize: true, + //LockLayer: true, + TieToLayer: "BeltLines", + }, + + { Name: "LockBeltPlate", Layer: "ChastityBelt", Pri: 45.3, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + //LockLayer: true, + TieToLayer: "BeltLines", + InheritColor: "LockPlate", + }, + { Name: "LockBeltShackle", Layer: "ChastityBelt", Pri: 45.4, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + //LockLayer: true, + TieToLayer: "BeltLines", + InheritColor: "LockShackle", + }, + { Name: "LockBeltHighlight", Layer: "ChastityBelt", Pri: 45.5, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + //LockLayer: true, + TieToLayer: "BeltLines", + InheritColor: "LockHighlight", + }, + ]) +}); +AddModel(GetModelFashionVersion("DivineBelt", true)); + + +AddModel({ + Name: "DivineBeltRunic", + Folder: "DivineBelt", + Parent: "DivineBelt", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "ChastityBelt", "Metal", "Divine"], + AddPose: ["ChastityBelt"], + AddPoseIf: { + ChastityOption2: ["CrotchStrap"], + }, + Layers: ToLayerMap([ + { Name: "BeltLines", Layer: "ChastityBelt", Pri: 45.2, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + NoColorize: true, + }, + { Name: "BeltMetalRunic2", Layer: "ChastityBelt", Pri: 45.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "BeltLines", + InheritColor: "Shield", + }, + { Name: "BeltMetalRunic1", Layer: "ChastityBelt", Pri: 45.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "BeltLines", + InheritColor: "Highlights", + }, + { Name: "BeltBase", Layer: "ChastityBelt", Pri: 45.0, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "BeltLines", + InheritColor: "Metal", + }, + { Name: "BeltPin", Layer: "ChastityBelt", Pri: 45.1, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "BeltLines", + InheritColor: "Pin", + }, + + + { Name: "LockBeltLines", Layer: "ChastityBelt", Pri: 45.6, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + NoColorize: true, + //LockLayer: true, + TieToLayer: "BeltLines", + }, + + { Name: "LockBeltPlate", Layer: "ChastityBelt", Pri: 45.3, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + //LockLayer: true, + TieToLayer: "BeltLines", + InheritColor: "LockPlate", + }, + { Name: "LockBeltShackle", Layer: "ChastityBelt", Pri: 45.4, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + //LockLayer: true, + TieToLayer: "BeltLines", + InheritColor: "LockShackle", + }, + { Name: "LockBeltHighlight", Layer: "ChastityBelt", Pri: 45.5, + //swaplayerpose: {Kneel: "ChastityBeltLower", KneelClosed: "ChastityBeltLower"}, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + //LockLayer: true, + TieToLayer: "BeltLines", + InheritColor: "LockHighlight", + }, + ]) +}); +AddModel(GetModelFashionVersion("DivineBeltRunic", true)); + +AddModel({ + Name: "DivineBra", + Folder: "DivineBelt", + Parent: "DivineBra", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "ChastityBra", "Metal", "Divine"], + Layers: ToLayerMap([ + { Name: "BraLines", Layer: "BindChestLower", Pri: 10.3, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + NoColorize: true, + }, + { Name: "BraBase1", Layer: "BindChestLower", Pri: 10, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Metal", + }, + { Name: "BraBase2", Layer: "BindChestLower", Pri: 10, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Chest", + }, + { Name: "BraMetal1", Layer: "BindChestLower", Pri: 10.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Highlights", + }, + { Name: "BraMetal2", Layer: "BindChestLower", Pri: 10.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Center", + }, + { Name: "BraPins", Layer: "BindChestLower", Pri: 10.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Pins", + }, + { Name: "BraStraps", Layer: "BindChestLower", Pri: 10.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Straps", + }, + { Name: "LockBraLines", Layer: "BindChestLower", Pri: 10.6, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + NoColorize: true, + //LockLayer: true, + }, + { Name: "LockBraPlate", Layer: "BindChestLower", Pri: 10.3, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "LockPlate", + //LockLayer: true, + }, + { Name: "LockBraShackle", Layer: "BindChestLower", Pri: 10.4, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "LockShackle", + //LockLayer: true, + }, + { Name: "LockBraHighlight", Layer: "BindChestLower", Pri: 10.5, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "LockHighlight", + //LockLayer: true, + }, + ]) +}); +AddModel(GetModelFashionVersion("DivineBra", true)); + + +AddModel({ + Name: "DivineBraRunic", + Folder: "DivineBelt", + Parent: "DivineBra", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "ChastityBra", "Metal", "Divine"], + Layers: ToLayerMap([ + { Name: "BraLines", Layer: "BindChestLower", Pri: 10.3, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + NoColorize: true, + }, + { Name: "BraBase1", Layer: "BindChestLower", Pri: 10, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Metal", + }, + { Name: "BraBase2", Layer: "BindChestLower", Pri: 10, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Chest", + }, + { Name: "BraMetalRunic1", Layer: "BindChestLower", Pri: 10.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Highlights", + }, + { Name: "BraMetalRunic2", Layer: "BindChestLower", Pri: 10.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Center", + }, + { Name: "BraPins", Layer: "BindChestLower", Pri: 10.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Pins", + }, + { Name: "BraStrapsRunic", Layer: "BindChestLower", Pri: 10.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "Straps", + }, + { Name: "LockBraLines", Layer: "BindChestLower", Pri: 10.6, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + NoColorize: true, + //LockLayer: true, + }, + { Name: "LockBraPlate", Layer: "BindChestLower", Pri: 10.3, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "LockPlate", + //LockLayer: true, + }, + { Name: "LockBraShackle", Layer: "BindChestLower", Pri: 10.4, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "LockShackle", + //LockLayer: true, + }, + { Name: "LockBraHighlight", Layer: "BindChestLower", Pri: 10.5, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + TieToLayer: "BraLines", + NoOverride: true, + InheritColor: "LockHighlight", + //LockLayer: true, + }, + ]) +}); +AddModel(GetModelFashionVersion("DivineBraRunic", true)); + + + +AddModel({ + Name: "SteelChastityBelt_Padlock", + Folder: "SteelChastity", + Parent: "SteelChastityBelt_Padlock", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "ChastityBelt", "Metal"], + AddPose: ["ChastityBelt"], + AddPoseIf: { + ChastityOption2: ["CrotchStrap"], + }, + //AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "Belt", Layer: "ChastityBelt", Pri: -40.1, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + DisplacementSprite: "TightBelt", + DisplaceAmount: 100, + DisplaceLayers: ToMap(["TightChastityBelt"]), + InheritColor: "BaseMetal", + }, + { Name: "BeltPadlock", Layer: "ChastityBelt", Pri: -39.9, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + InheritColor: "Lock", + }, + { Name: "BeltPadlockPin", Layer: "ChastityBelt", Pri: -39.8, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + InheritColor: "LockPin", + }, + ]) +}); +AddModel({ + Name: "SteelChastityBelt_Radial", + Folder: "SteelChastity", + Parent: "SteelChastityBelt_Padlock", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "ChastityBelt", "Metal"], + AddPose: ["ChastityBelt"], + AddPoseIf: { + ChastityOption2: ["CrotchStrap"], + }, + //AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "Belt", Layer: "ChastityBelt", Pri: -40.1, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + DisplacementSprite: "TightBelt", + DisplaceAmount: 100, + DisplaceLayers: ToMap(["TightChastityBelt"]), + InheritColor: "BaseMetal", + }, + { Name: "BeltRadial", Layer: "ChastityBelt", Pri: -39.9, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + InheritColor: "Lock", + }, + ]) +}); +AddModel({ + Name: "SteelChastityBelt_Segu", + Folder: "SteelChastity", + Parent: "SteelChastityBelt_Padlock", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "ChastityBelt", "Metal"], + AddPose: ["ChastityBelt"], + AddPoseIf: { + ChastityOption2: ["CrotchStrap"], + }, + //AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "Belt", Layer: "ChastityBelt", Pri: -40.1, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + DisplacementSprite: "TightBelt", + DisplaceAmount: 100, + DisplaceLayers: ToMap(["TightChastityBelt"]), + InheritColor: "BaseMetal", + }, + { Name: "BeltSegu", Layer: "ChastityBelt", Pri: -39.9, + PrependLayerPrefix: {ChastityOption2: "Option2_", ChastityOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + InheritColor: "Lock", + }, + ]) +}); + +AddModel(GetModelFashionVersion("SteelChastityBelt_Padlock", true)); +AddModel(GetModelFashionVersion("SteelChastityBelt_Radial", true)); +AddModel(GetModelFashionVersion("SteelChastityBelt_Segu", true)); + + + +AddModel({ + Name: "SteelChastityBra_Padlock", + Folder: "SteelChastity", + Parent: "SteelChastityBra_Padlock", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "ChastityBra", "Metal"], + //AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "Bra", Layer: "BindChestLower", Pri: -30.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + InheritColor: "BaseMetal", + }, + { Name: "BraPadlock", Layer: "BindChestLower", Pri: -29.9, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + InheritColor: "Lock", + }, + { Name: "BraPadlockPin", Layer: "BindChestLower", Pri: -29.8, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + InheritColor: "LockPin", + }, + ]) +}); +AddModel({ + Name: "SteelChastityBra_Radial", + Folder: "SteelChastity", + Parent: "SteelChastityBra_Padlock", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "ChastityBra", "Metal"], + //AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "Bra", Layer: "BindChestLower", Pri: -30.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + InheritColor: "BaseMetal", + }, + { Name: "BraRadial", Layer: "BindChestLower", Pri: -29.9, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + InheritColor: "Lock", + }, + ]) +}); +AddModel({ + Name: "SteelChastityBra_Segu", + Folder: "SteelChastity", + Parent: "SteelChastityBra_Padlock", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "ChastityBra", "Metal"], + //AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "Bra", Layer: "BindChestLower", Pri: -30.1, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + InheritColor: "BaseMetal", + }, + { Name: "BraSegu", Layer: "BindChestLower", Pri: -29.9, + PrependLayerPrefix: {ChastityBraOption: "Option_"}, + Invariant: true, + DisplacementInvariant: true, + InheritColor: "Lock", + }, + ]) +}); + +AddModel(GetModelFashionVersion("SteelChastityBra_Padlock", true)); +AddModel(GetModelFashionVersion("SteelChastityBra_Radial", true)); +AddModel(GetModelFashionVersion("SteelChastityBra_Segu", true)); \ No newline at end of file diff --git a/Data/ModelList_Cloak.ts b/Data/ModelList_Cloak.ts new file mode 100644 index 000000000..ef6ebd5a0 --- /dev/null +++ b/Data/ModelList_Cloak.ts @@ -0,0 +1,95 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + +AddModel({ + Name: "SlayerCollar", + Folder: "Slayer", + Parent: "SlayerCape", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "CapeCollar", Layer: "Collar", Pri: 54, + Invariant: true, + NoOverride: true, + }, + { Name: "CapeCollarButton", Layer: "Collar", Pri: 54.1, + Invariant: true, + InheritColor: "Button", + NoOverride: true, TieToLayer: "CapeCollar", + }, + { Name: "CapeCollarRim", Layer: "Collar", Pri: 54.1, + Invariant: true, + InheritColor: "Rim", + NoOverride: true, TieToLayer: "CapeCollar", + }, + ]) +}); +AddModel({ + Name: "SlayerCape", + Folder: "Slayer", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("SlayerCollar"), + { Name: "CapeCollarInner", Layer: "Collar", Pri: 54.1, + Invariant: true, + InheritColor: "Inner", + NoOverride: true, TieToLayer: "CapeCollar", + }, + { Name: "Cape", Layer: "Shoulders", Pri: 35, + Poses: ToMap([...ARMPOSES]), + InheritColor: "Cape", + NoOverride: true, + Invariant: true, + MorphPoses: {Tied: "Tied", Crossed: "Tied", Front: "Tied", Up: "Up", Yoked: "Yoked"}, + }, + { Name: "CapeStripe", Layer: "Shoulders", Pri: 35.1, + Poses: ToMap([...ARMPOSES]), + InheritColor: "Stripe", + TieToLayer: "Cape", + NoOverride: true, + Invariant: true, + MorphPoses: {Tied: "Tied", Crossed: "Tied", Front: "Tied", Up: "Up", Yoked: "Yoked"}, + }, + { Name: "CapeShoulderLeft", Layer: "Shoulders", Pri: 35.1, + Poses: ToMap([...ARMPOSES]), + InheritColor: "ShoulderLeft", + TieToLayer: "Cape", + NoOverride: true, + Invariant: true, + MorphPoses: {Tied: "Tied", Crossed: "Tied", Front: "Tied", Up: "Up", Yoked: "Yoked"}, + }, + { Name: "CapeShoulderRight", Layer: "Shoulders", Pri: 35.1, + Poses: ToMap([...ARMPOSES]), + InheritColor: "ShoulderRight", + TieToLayer: "Cape", + NoOverride: true, + Invariant: true, + MorphPoses: {Tied: "Tied", Crossed: "Tied", Front: "Tied", Up: "Up", Yoked: "Yoked"}, + }, + { Name: "CapeShoulderLeftButton", Layer: "Shoulders", Pri: 35.2, + Poses: ToMap([...ARMPOSES]), + InheritColor: "LeftButton", + TieToLayer: "Cape", + NoOverride: true, + Invariant: true, + MorphPoses: {Tied: "Tied", Crossed: "Tied", Front: "Tied", Up: "Up", Yoked: "Yoked"}, + }, + { Name: "CapeShoulderRightButton", Layer: "Shoulders", Pri: 35.2, + Poses: ToMap(["Up"]), + InheritColor: "RightButton", + TieToLayer: "Cape", + NoOverride: true, + }, + { Name: "CapeBack", Layer: "Cape", Pri: -35, + Poses: ToMap(["Yoked", "Up"]), + InheritColor: "Back", + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Collars.ts b/Data/ModelList_Collars.ts new file mode 100644 index 000000000..75a3ce94d --- /dev/null +++ b/Data/ModelList_Collars.ts @@ -0,0 +1,180 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + + + +AddModel({ + Name: "StardustCollar", + Folder: "Warrior", + Parent: "Dragonheart", + TopLevel: true, + Restraint: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Collar", Layer: "Collar", Pri: 10, + Invariant: true, + HideWhenOverridden: true, + }, + ]) +}); + + + +AddModel({ + Name: "Leash", + Folder: "Leash", + Parent: "Leash", + TopLevel: true, + Restraint: true, + Categories: ["Restraints"], + AddPose: ["Leash"], + Layers: ToLayerMap([ + { Name: "Leash", Layer: "Leash", Pri: 0, + Invariant: true, + HideWhenOverridden: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie", HandsBound: "", Pulled: "", HandsBehind: "", + Free: "Free", Crossed: "Crossed", Front: "Front"}, + AppendPose: {Pulled: "Pulled"}, + }, + { Name: "LeashCollar", Layer: "Collar", Pri: -400, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Leash", + }, + { Name: "LeashCollarHardware", Layer: "Collar", Pri: -399.9, + Invariant: true, + TieToLayer: "LeashCollar", + InheritColor: "Hardware", + NoOverride: true, + }, + ]) +}); + +AddModel(GetModelFashionVersion("Leash", true)); + +AddModel({ + Name: "MikoCollar", + Folder: "Collars", + TopLevel: true, + Restraint: true, + Categories: ["Restraints"], + Filters: { + Neck: {"gamma":1,"saturation":0,"contrast":1.3,"brightness":1.3,"red":1,"green":1,"blue":1,"alpha":1}, + Rim: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":0.95,"red":1,"green":1,"blue":1,"alpha":1}, + Collar: {"gamma":1,"saturation":0.06666666666666667,"contrast":0.6666666666666666,"brightness":0.5333333333333333,"red":2.7666666666666666,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "DragonCollar", Layer: "Collar", Pri: 70, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Collar", + }, + ...GetModelLayers("LatexNeckCorset"), + ]) +}); + + +AddModel({ + Name: "FutureCollar", + Folder: "Collars", + Parent: "CyberDoll", + TopLevel: true, + Categories: ["Accessories"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "Future", Layer: "Collar", Pri: 30, + Invariant: true, + InheritColor: "Base", + HideWhenOverridden: true, + }, + { Name: "FutureBand", Layer: "Collar", Pri: 30.1, + Invariant: true, + InheritColor: "Band", + NoOverride: true, + TieToLayer: "Future", + }, + { Name: "FutureDisplay", Layer: "Collar", Pri: 30.2, + Invariant: true, + InheritColor: "Display", + NoOverride: true, + TieToLayer: "Future", + }, + { Name: "FutureRim", Layer: "Collar", Pri: 30.3, + Invariant: true, + InheritColor: "Rim", + NoOverride: true, + TieToLayer: "Future", + }, + { Name: "FutureLock", Layer: "Collar", Pri: 30.3, + Invariant: true, + InheritColor: "Lock", + LockLayer: true, + NoOverride: true, + TieToLayer: "Future", + }, + ]) +}); + +AddModel(GetModelRestraintVersion("FutureCollar", false),); + + +AddModel({ + Name: "ShockModule", + Folder: "Wolf", + Parent: "Wolf", + TopLevel: true, + Restraint: true, + Categories: ["Restraints"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "Module", Layer: "CollarAcc", Pri: 40, + Invariant: true, + InheritColor: "Module", + HidePoses: {HideModuleLeft: true}, + }, + { Name: "ModuleDisplay", Layer: "CollarAcc", Pri: 40.1, + Invariant: true, + InheritColor: "Display", + TieToLayer: "Module", + NoOverride: true, + HidePoses: {HideModuleLeft: true}, + }, + ]) +}); + + +AddModel({ + Name: "TrackingModule", + Folder: "Collars", + Parent: "Collars", + TopLevel: true, + Restraint: true, + Categories: ["Restraints"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "TrackingModule", Layer: "CollarAcc", Pri: 40.1, + Invariant: true, + InheritColor: "Module", + HidePoses: {HideModuleRight: true}, + }, + { Name: "TrackingModuleDisplay", Layer: "CollarAcc", Pri: 40, + Invariant: true, + InheritColor: "Display", + TieToLayer: "Module", + NoOverride: true, + HidePoses: {HideModuleRight: true}, + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Corset.ts b/Data/ModelList_Corset.ts new file mode 100644 index 000000000..996dfde05 --- /dev/null +++ b/Data/ModelList_Corset.ts @@ -0,0 +1,38 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "BuckleCorset", + Folder: "Corsets", + Parent: "BuckleCorset", + TopLevel: true, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + { Name: "BuckleCorset", Layer: "Bustier", Pri: 50, + Invariant: true, + InheritColor: "Corset", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + }, + { Name: "BuckleCorsetBuckles", Layer: "Bustier", Pri: 50.1, + Invariant: true, + InheritColor: "Buckles", + TieToLayer: "BuckleCorset", + }, + { Name: "BuckleCorsetHardware", Layer: "Bustier", Pri: 50.2, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "BuckleCorset", + }, + ]) +}); + +AddModel(GetModelRestraintVersion("BuckleCorset", true)); \ No newline at end of file diff --git a/Data/ModelList_Cosplay.ts b/Data/ModelList_Cosplay.ts new file mode 100644 index 000000000..0e3ab00e7 --- /dev/null +++ b/Data/ModelList_Cosplay.ts @@ -0,0 +1,375 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "PointyAntennae", + Folder: "Pointy", + Parent: "PointyAntennae", + TopLevel: true, + Protected: true, + Categories: ["Ears", "Insect", "Face", "Cosplay"], + AddPose: ["AnimalEars", "Insect", "Cosplay"], + Layers: ToLayerMap([ + { Name: "AnthenaL", Layer: "AnimalEars", Pri: 30, + Invariant: true, + InheritColor: "Left", + OffsetX: 527, + OffsetY: 80, + }, + { Name: "AnthenaR", Layer: "AnimalEars", Pri: 30, + Invariant: true, + InheritColor: "Right", + OffsetX: 527, + OffsetY: 80, + }, + ]) +}); +AddModel({ + Name: "PointyHorns", + Folder: "Pointy", + Parent: "PointyAntennae", + TopLevel: false, + Protected: true, + Categories: ["Ears", "Insect", "Face", "Cosplay"], + AddPose: ["AnimalEars", "Insect", "Cosplay"], + Layers: ToLayerMap([ + { Name: "HornL", Layer: "AnimalEars", Pri: -50, + Invariant: true, + InheritColor: "Left", + NoOverride: true, + OffsetX: 527, + OffsetY: 80, + }, + { Name: "HornR", Layer: "AnimalEars", Pri: -50, + Invariant: true, + InheritColor: "Right", + NoOverride: true, + OffsetX: 527, + OffsetY: 80, + }, + ]) +}); + + +AddModel({ + Name: "PointyTail", + Folder: "Pointy", + Parent: "PointyAntennae", + TopLevel: true, + Protected: true, + Categories: ["Tails", "Cosplay"], + AddPose: ["Tails", "Insect", "Cosplay"], + Layers: ToLayerMap([{ + Name: "Tail", + Layer: "Tail", + Pri: 30, + Invariant: true, + OffsetX: 527, + OffsetY: 80, + } + ]) +}); + +AddModel({ + Name: "BunnyEars", + Folder: "Bunny", + Parent: "Bunny", + TopLevel: true, + Protected: true, + Categories: ["Ears", "Bunny", "Face", "Cosplay"], + AddPose: ["AnimalEars", "Bunny", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Ears", Layer: "AnimalEars", Pri: 10, + Invariant: true, + InheritColor: "Ears", + }, + { Name: "EarsInner", Layer: "AnimalEars", Pri: 10.1, + Invariant: true, + TieToLayer: "Ears", + NoOverride: true, + InheritColor: "InnerEars", + }, + { Name: "EarsFront", Layer: "AnimalEarsFront", Pri: 10, + Invariant: true, + InheritColor: "EarsFront", + }, + ]) +}); + +AddModel({ + Name: "KittyEars", + Folder: "Ears", + Parent: "Kitty", + TopLevel: true, + Protected: true, + Categories: ["Ears", "Kitty", "Face", "Cosplay"], + AddPose: ["AnimalEars", "Kitty", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Kitty", Layer: "AnimalEars", Pri: 10, + Invariant: true, + InheritColor: "Ears", + }, + { Name: "KittyInner", Layer: "AnimalEars", Pri: 10.1, + Invariant: true, + TieToLayer: "Kitty", + NoOverride: true, + InheritColor: "InnerEars", + }, + ]) +}); + +AddModel({ + Name: "WolfEars", + Folder: "Ears", + Parent: "Wolf", + TopLevel: true, + Protected: true, + Categories: ["Ears", "Wolf", "Face", "Cosplay"], + AddPose: ["AnimalEars", "Wolf", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Wolf", Layer: "AnimalEars", Pri: 10, + Invariant: true, + InheritColor: "Ears", + }, + { Name: "WolfInner", Layer: "AnimalEars", Pri: 10.1, + Invariant: true, + TieToLayer: "Wolf", + NoOverride: true, + InheritColor: "InnerEars", + }, + ]) +}); + +AddModel({ + Name: "WolfEars2", + Folder: "Wolfgirl", + Parent: "Wolf", + TopLevel: true, + Protected: true, + Categories: ["Ears", "Wolf", "Face", "Cosplay"], + AddPose: ["AnimalEars", "Wolf", "Cosplay"], + Layers: ToLayerMap([ + { Name: "EarLeft", Layer: "AnimalEars", Pri: 9, + Invariant: true, + OffsetX: 920, + OffsetY: 50, + }, + { Name: "EarRight", Layer: "AnimalEars", Pri: 9, + Invariant: true, + OffsetX: 920, + OffsetY: 50, + }, + ]) +}); + + + +AddModel({ + Name: "HairclipDual", + Folder: "Wolfgirl", + TopLevel: true, + Protected: true, + Parent: "HairclipDual", + Categories: ["Hairstyles", "Accessories", "Hairpins"], + Layers: ToLayerMap([ + { Name: "HairclipLower", Layer: "HairFront", Pri: 25, + NoOverride: true, + OffsetX: 942, + OffsetY: 50, + }, + { Name: "HairclipUpper", Layer: "HairFront", Pri: 25, + NoOverride: true, + OffsetX: 942, + OffsetY: 50, + }, + ]) +}); + +AddModel({ + Name: "FoxEars", + Folder: "Ears", + Parent: "Fox", + TopLevel: true, + Protected: true, + Categories: ["Ears", "Fox", "Face", "Cosplay"], + AddPose: ["AnimalEars", "Fox", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Fox", Layer: "AnimalEars", Pri: 10, + Invariant: true, + InheritColor: "Ears", + }, + { Name: "FoxInner", Layer: "AnimalEars", Pri: 10.1, + Invariant: true, + TieToLayer: "Fox", + NoOverride: true, + InheritColor: "InnerEars", + }, + ]) +}); + + +AddModel({ + Name: "WolfTail", + Folder: "Tails", + Parent: "Wolf", + TopLevel: true, + Protected: true, + Categories: ["Tails", "Wolf", "Cosplay"], + AddPose: ["Tails", "Wolf", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Wolf", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail", + }, + ]) +}); + +AddModel({ + Name: "KittyTail", + Folder: "Tails", + Parent: "Kitty", + TopLevel: true, + Protected: true, + Categories: ["Tails", "Kitty", "Cosplay"], + AddPose: ["Tails", "Kitty", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Kitty", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail", + }, + ]) +}); +AddModel({ + Name: "Kitty2Tail", + Folder: "Tails", + Parent: "KittyTail", + TopLevel: false, + Protected: true, + Categories: ["Tails", "Kitty", "Cosplay"], + AddPose: ["Tails", "Kitty", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Kitty", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail1", + }, + { Name: "Kitty2", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail2", + }, + ]) +}); + +AddModel({ + Name: "FoxTail", + Folder: "Tails", + Parent: "Fox", + TopLevel: true, + Protected: true, + Categories: ["Tails", "Fox", "Cosplay"], + AddPose: ["Tails", "Fox", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Fox", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail", + }, + ]) +}); + +AddModel({ + Name: "Fox2Tail", + Folder: "Tails", + Parent: "FoxTail", + TopLevel: false, + Protected: true, + Categories: ["Tails", "Fox", "Cosplay"], + AddPose: ["Tails", "Fox", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Fox", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail1", + }, + { Name: "Fox2", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail2", + }, + ]) +}); +AddModel({ + Name: "Fox3Tail", + Folder: "Tails", + Parent: "FoxTail", + TopLevel: false, + Protected: true, + Categories: ["Tails", "Fox", "Cosplay"], + AddPose: ["Tails", "Fox", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Fox3", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail", + }, + ]) +}); +AddModel({ + Name: "Fox4Tail", + Folder: "Tails", + Parent: "FoxTail", + TopLevel: false, + Protected: true, + Categories: ["Tails", "Fox", "Cosplay"], + AddPose: ["Tails", "Fox"], + Layers: ToLayerMap([ + { Name: "Fox4", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail", + }, + ]) +}); +AddModel({ + Name: "Fox5Tail", + Folder: "Tails", + Parent: "FoxTail", + TopLevel: false, + Protected: true, + Categories: ["Tails", "Fox", "Cosplay"], + AddPose: ["Tails", "Fox", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Fox5", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail", + }, + ]) +}); +AddModel({ + Name: "Fox6Tail", + Folder: "Tails", + Parent: "FoxTail", + TopLevel: false, + Protected: true, + Categories: ["Tails", "Fox", "Cosplay"], + AddPose: ["Tails", "Fox", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Fox6", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail", + }, + ]) +}); +AddModel({ + Name: "Fox7Tail", + Folder: "Tails", + Parent: "FoxTail", + TopLevel: false, + Protected: true, + Categories: ["Tails", "Fox", "Cosplay"], + AddPose: ["Tails", "Fox", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Fox7", Layer: "Tail", Pri: 0, + Invariant: true, + InheritColor: "Tail", + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_CrystalCuffs.ts b/Data/ModelList_CrystalCuffs.ts new file mode 100644 index 000000000..2df215544 --- /dev/null +++ b/Data/ModelList_CrystalCuffs.ts @@ -0,0 +1,212 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "CrystalCuffsWristLeft", + Folder: "CrystalCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristLeft", "", "", "BaseMetal", 0.1), + ]) +}); +AddModel({ + Name: "CrystalCuffsWristRight", + Folder: "CrystalCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristRight", "", "", "BaseMetal", 0.1), + ]) +}); + +AddModel({ + Name: "CrystalCuffsWrists", + Folder: "CrystalCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("CrystalCuffsWristLeft"), + ...GetModelLayers("CrystalCuffsWristRight"), + ]) +}); + + + +AddModel({ + Name: "CrystalCuffsElbowLeft", + Folder: "CrystalCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowLeft", "", "", "BaseMetal", 0.1), + ]) +}); +AddModel({ + Name: "CrystalCuffsElbowRight", + Folder: "CrystalCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowRight", "", "", "BaseMetal", 0.1), + ]) +}); + +AddModel({ + Name: "CrystalCuffsElbows", + Folder: "CrystalCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("CrystalCuffsElbowLeft"), + ...GetModelLayers("CrystalCuffsElbowRight"), + ]) +}); + +AddModel({ + Name: "CrystalCuffsArms", + Folder: "CrystalCuffs", + TopLevel: true, + Parent: "Cuffs", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight", "WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("CrystalCuffsWrists"), + ...GetModelLayers("CrystalCuffsElbows"), + ]) +}); + +AddModel({ + Name: "CrystalCuffsAnklesLeft", + Folder: "CrystalCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesLeft", "", "", "BaseMetal", 0.1), + ]) +}); + +AddModel({ + Name: "CrystalCuffsAnklesRight", + Folder: "CrystalCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesRight", "", "", "BaseMetal", 0.1) + ]) +}); + + +AddModel({ + Name: "CrystalCuffsAnkles", + Folder: "CrystalCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight", "AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("CrystalCuffsAnklesRight"), + ...GetModelLayers("CrystalCuffsAnklesLeft"), + ]) +}); + + + +AddModel({ + Name: "CrystalCuffsThighLeft", + Folder: "CrystalCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighLeft", "", "", "BaseMetal", 0.1), + ]) +}); + +AddModel({ + Name: "CrystalCuffsThighRight", + Folder: "CrystalCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighRight", "", "", "BaseMetal", 0.1), + ]) +}); + + +AddModel({ + Name: "CrystalCuffsThigh", + Folder: "CrystalCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight", "ThighLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("CrystalCuffsThighRight"), + ...GetModelLayers("CrystalCuffsThighLeft"), + ]) +}); + + +AddModel({ + Name: "CrystalCollar", + Folder: "CrystalCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronCollar", "", "", "BaseMetal", 0.1), + ]) +}); + +AddModel({ + Name: "CrystalBelt", + Folder: "CrystalCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronBelt", "", "", "BaseMetal", 0.1), + ]) +}); + + + + +AddModel(GetModelFashionVersion("CrystalCollar", true)); +AddModel(GetModelFashionVersion("CrystalBelt", true)); +AddModel(GetModelFashionVersion("CrystalCuffsWristLeft", true)); +AddModel(GetModelFashionVersion("CrystalCuffsWristRight", true)); +AddModel(GetModelFashionVersion("CrystalCuffsWrists", true)); +AddModel(GetModelFashionVersion("CrystalCuffsElbowLeft", true)); +AddModel(GetModelFashionVersion("CrystalCuffsElbowRight", true)); +AddModel(GetModelFashionVersion("CrystalCuffsElbows", true)); +AddModel(GetModelFashionVersion("CrystalCuffsArms", true)); +AddModel(GetModelFashionVersion("CrystalCuffsAnklesLeft", true)); +AddModel(GetModelFashionVersion("CrystalCuffsAnklesRight", true)); +AddModel(GetModelFashionVersion("CrystalCuffsAnkles", true)); +AddModel(GetModelFashionVersion("CrystalCuffsThighLeft", true)); +AddModel(GetModelFashionVersion("CrystalCuffsThighRight", true)); +AddModel(GetModelFashionVersion("CrystalCuffsThigh", true)); \ No newline at end of file diff --git a/Data/ModelList_Cuffs.ts b/Data/ModelList_Cuffs.ts new file mode 100644 index 000000000..29d5c878c --- /dev/null +++ b/Data/ModelList_Cuffs.ts @@ -0,0 +1,380 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "ShacklesWristLeft", + Folder: "Cuffs", + TopLevel: false, + Parent: "ShacklesArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft"], + Layers: ToLayerMap([ + { Name: "WristLeft", Layer: "BindWristLeft", Pri: 1, + Poses: ToMapSubtract([...ARMPOSES], [...WRISTHIDELEFT]), + SwapLayerPose: {Front: "BindForeWristLeft"}, + GlobalDefaultOverride: ToMap(["Front"]), + DisplacementSprite: "CuffLeft", + DisplaceLayers: ToMap(["Cuffs"]), + DisplaceAmount: 90, + InheritColor: "BaseMetal", + }, + ]) +}); +AddModel({ + Name: "ShacklesWristRight", + Folder: "Cuffs", + TopLevel: false, + Parent: "ShacklesArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristRight"], + Layers: ToLayerMap([ + { Name: "WristRight", Layer: "BindWristRight", Pri: 1, + Poses: ToMapSubtract([...ARMPOSES], [...WRISTHIDERIGHT]), + SwapLayerPose: {Front: "BindForeWristRight", Crossed: "BindCrossWristRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + DisplacementSprite: "CuffRight", + DisplaceLayers: ToMap(["Cuffs"]), + DisplaceAmount: 90, + InheritColor: "BaseMetal", + }, + ]) +}); + +AddModel({ + Name: "ShacklesWrists", + Folder: "Cuffs", + TopLevel: false, + Parent: "ShacklesArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristLeft"), + ...GetModelLayers("ShacklesWristRight"), + ]) +}); + + + +AddModel({ + Name: "ShacklesElbowLeft", + Folder: "Cuffs", + TopLevel: false, + Parent: "ShacklesArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft"], + Layers: ToLayerMap([ + { Name: "ElbowLeft", Layer: "BindElbowLeft", Pri: 1, + Poses: ToMap([...ARMPOSES]), + SwapLayerPose: {Front: "BindForeElbowLeft", Crossed: "BindCrossElbowLeft", Up: "BindForeElbowLeft"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + MorphPoses: {Crossed: "Front"}, + DisplacementSprite: "ElbowCuffLeft", + DisplaceLayers: ToMap(["Cuffs"]), + DisplaceAmount: 50, + InheritColor: "BaseMetal", + HidePoses: ToMap(["EncaseArmLeft"]), + }, + ]) +}); +AddModel({ + Name: "ShacklesElbowRight", + Folder: "Cuffs", + TopLevel: false, + Parent: "ShacklesArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowRight"], + Layers: ToLayerMap([ + { Name: "ElbowRight", Layer: "BindElbowRight", Pri: 1, + Poses: ToMapSubtract([...ARMPOSES], ["Free"]), + SwapLayerPose: {Front: "BindForeElbowRight", Crossed: "BindCrossElbowRight", Up: "BindForeElbowRight"}, + GlobalDefaultOverride: ToMap(["Front"]), + MorphPoses: {Crossed: "Front"}, + DisplacementSprite: "ElbowCuffRight", + DisplaceLayers: ToMap(["Cuffs"]), + DisplaceAmount: 100, + InheritColor: "BaseMetal", + HidePoses: ToMap(["EncaseArmRight"]), + }, + ]) +}); + +AddModel({ + Name: "ShacklesElbows", + Folder: "Cuffs", + TopLevel: false, + Parent: "ShacklesArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowLeft"), + ...GetModelLayers("ShacklesElbowRight"), + ]) +}); + +AddModel({ + Name: "ShacklesArms", + Folder: "Cuffs", + TopLevel: true, + Parent: "Shackles", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight", "WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristLeft"), + ...GetModelLayers("ShacklesWristRight"), + ...GetModelLayers("ShacklesElbowLeft"), + ...GetModelLayers("ShacklesElbowRight"), + ]) +}); + +AddModel({ + Name: "ShacklesAnklesLeft", + Folder: "Cuffs", + TopLevel: false, + Parent: "ShacklesAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleLeft"], + Layers: ToLayerMap([ + { Name: "AnkleLeft", Layer: "AnkleLeft", Pri: 30, + Poses: ToMap([...FOOTLEFTPOSES]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementSprite: "AnkleCuffLeft", + DisplaceLayers: ToMap(["LegCuffs"]), + DisplaceAmount: 50, + InheritColor: "BaseMetal", + }, + ]) +}); + +AddModel({ + Name: "ShacklesAnklesRight", + Folder: "Cuffs", + TopLevel: false, + Parent: "ShacklesAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight"], + Layers: ToLayerMap([ + { Name: "AnkleRight", Layer: "AnkleRight", Pri: 30, + Poses: ToMap([...FOOTRIGHTPOSES]), + DisplacementSprite: "AnkleCuffRight", + DisplaceLayers: ToMap(["LegCuffs"]), + DisplaceAmount: 50, + InheritColor: "BaseMetal", + }, + ]) +}); + + +AddModel({ + Name: "ShacklesAnkles", + Folder: "Cuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight", "AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesRight"), + ...GetModelLayers("ShacklesAnklesLeft"), + ]) +}); + + + +AddModel({ + Name: "ShacklesThighLeft", + Folder: "Cuffs", + TopLevel: false, + Parent: "ShacklesThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighLeft"], + Layers: ToLayerMap([ + { Name: "ThighLeft", Layer: "ThighLeft", Pri: 30, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementSprite: "ThighCuffsLeft", + DisplaceLayers: ToMap(["LegCuffs"]), + DisplaceAmount: 50, + InheritColor: "BaseMetal", + }, + ]) +}); + +AddModel({ + Name: "ShacklesThighRight", + Folder: "Cuffs", + TopLevel: false, + Parent: "ShacklesThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight"], + Layers: ToLayerMap([ + { Name: "ThighRight", Layer: "ThighRight", Pri: 30, + Poses: ToMap([...LEGPOSES]), + DisplacementSprite: "ThighCuffsRight", + DisplaceLayers: ToMap(["LegCuffs"]), + DisplaceAmount: 50, + InheritColor: "BaseMetal", + }, + ]) +}); + + +AddModel({ + Name: "ShacklesThigh", + Folder: "Cuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight", "ThighLeft", "LowCuffs"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighRight"), + ...GetModelLayers("ShacklesThighLeft"), + ]) +}); + +AddModel({ + Name: "ThighLink", + Folder: "Cuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints","Cuffs", "Links"], + AddPose: ["ThighLink"], + Layers: ToLayerMap([ + { Name: "ThighLink", Layer: "BindChainLinksUnder", Pri: 0, + Poses: ToMap(["Spread"]), + AppendPose: {"HighCuffs": "High"}, // "LowCuffs": "", + }, + ]) +}); + +AddModel({ + Name: "AnkleLink", + Folder: "Cuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints","Cuffs", "Links"], + AddPose: ["AnkleLink"], + Layers: ToLayerMap([ + { Name: "AnkleLink", Layer: "BindChainLinksUnder", Pri: 0, + Poses: ToMap(["Spread"]), + }, + ]) +}); + +AddModel({ + Name: "IronCollar", + Folder: "Cuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + { Name: "Collar", Layer: "Collar", Pri: 20, + Invariant: true, + InheritColor: "BaseMetal", + }, + ]) +}); + +AddModel({ + Name: "IronCollarClip", + Folder: "Cuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + { Name: "Collar", Layer: "Collar", Pri: 20, + Invariant: true, + InheritColor: "BaseMetal", + }, + { Name: "CollarHardware", Layer: "CollarRing", Pri: 10.1, + Invariant: true, + InheritColor: "Hardware", + }, + ]) +}); + + +AddModel({ + Name: "SteelCollar", + Folder: "Cuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + { Name: "SteelCollar", Layer: "Collar", Pri: 25, + Invariant: true, + InheritColor: "BaseMetal", + }, + { Name: "CollarHardware", Layer: "CollarRing", Pri: 25, + Invariant: true, + InheritColor: "Hardware", + }, + ]) +}); + +AddModel({ + Name: "SteelCollarRunes", + Parent: "SteelCollar", + Folder: "Cuffs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("SteelCollar"), + { Name: "SteelCollarRunes", Layer: "Collar", Pri: 25.1, + Invariant: true, + NoOverride: true, + TieToLayer: "SteelCollar", + InheritColor: "Runes", + }, + { Name: "CollarHardware", Layer: "CollarRing", Pri: 25.1, + Invariant: true, + InheritColor: "Hardware", + RequirePoses: {Leash: true}, + }, + ]) +}); + + +AddModel({ + Name: "IronBelt", + Folder: "Cuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + { Name: "Belt", Layer: "BeltBondage", Pri: 25, + Invariant: true, + DisplacementSprite: "Belt", + DisplaceLayers: ToMap(["RopeTorso"]), + DisplaceAmount: 50, + InheritColor: "BaseMetal", + }, + ]) +}); + + + + +AddModel(GetModelFashionVersion("IronCollar", true)); +AddModel(GetModelFashionVersion("IronCollarClip", true)); +AddModel(GetModelFashionVersion("IronBelt", true)); +AddModel(GetModelFashionVersion("SteelCollarRunes", true)); +AddModel(GetModelFashionVersion("SteelCollar", true)); +AddModel(GetModelFashionVersion("ShacklesWristLeft", true)); +AddModel(GetModelFashionVersion("ShacklesWristRight", true)); +AddModel(GetModelFashionVersion("ShacklesWrists", true)); +AddModel(GetModelFashionVersion("ShacklesElbowLeft", true)); +AddModel(GetModelFashionVersion("ShacklesElbowRight", true)); +AddModel(GetModelFashionVersion("ShacklesElbows", true)); +AddModel(GetModelFashionVersion("ShacklesArms", true)); +AddModel(GetModelFashionVersion("ShacklesAnklesLeft", true)); +AddModel(GetModelFashionVersion("ShacklesAnklesRight", true)); +AddModel(GetModelFashionVersion("ShacklesAnkles", true)); +AddModel(GetModelFashionVersion("ShacklesThighLeft", true)); +AddModel(GetModelFashionVersion("ShacklesThighRight", true)); +AddModel(GetModelFashionVersion("ShacklesThigh", true)); +AddModel(GetModelFashionVersion("ThighLink", true)); +AddModel(GetModelFashionVersion("AnkleLink", true)); + diff --git a/Data/ModelList_CyberCuffs.ts b/Data/ModelList_CyberCuffs.ts new file mode 100644 index 000000000..ff2262d82 --- /dev/null +++ b/Data/ModelList_CyberCuffs.ts @@ -0,0 +1,353 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "CyberCuffsWristLeft", + Folder: "CyberCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristLeft", "", "", "BaseMetal", 0.4), + ...GetModelLayers("ShacklesWristLeft", "Screen", "", "Screen", 0.65), + ...GetModelLayers("ShacklesWristLeft", "Display", "", "Display", 0.67), + ...GetModelLayers("ShacklesWristLeft", "Lock", "", "Lock", 0.7), + ]) +}); +AddModel({ + Name: "CyberCuffsWristRight", + Folder: "CyberCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristRight"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristRight", "", "", "BaseMetal", 0.4), + ...GetModelLayers("ShacklesWristRight", "Screen", "", "Screen", 0.65), + ...GetModelLayers("ShacklesWristRight", "Display", "", "Display", 0.67), + ...GetModelLayers("ShacklesWristRight", "Lock", "", "Lock", 0.7), + ]) +}); + +AddModel({ + Name: "CyberCuffsWrists", + Folder: "CyberCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft", "WristRight"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("CyberCuffsWristLeft"), + ...GetModelLayers("CyberCuffsWristRight"), + ]) +}); + + + +AddModel({ + Name: "CyberCuffsElbowLeft", + Folder: "CyberCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowLeft", "", "", "BaseMetal", 0.4), + ...GetModelLayers("ShacklesElbowLeft", "Screen", "", "Screen", 0.65), + ...GetModelLayers("ShacklesElbowLeft", "Display", "", "Display", 0.67), + ...GetModelLayers("ShacklesElbowLeft", "Lock", "", "Lock", 0.7), + ]) +}); +AddModel({ + Name: "CyberCuffsElbowRight", + Folder: "CyberCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowRight"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowRight", "", "", "BaseMetal", 0.4), + ...GetModelLayers("ShacklesElbowRight", "Screen", "", "Screen", 0.65), + ...GetModelLayers("ShacklesElbowRight", "Display", "", "Display", 0.67), + ...GetModelLayers("ShacklesElbowRight", "Lock", "", "Lock", 0.7), + ]) +}); + +AddModel({ + Name: "CyberCuffsElbows", + Folder: "CyberCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("CyberCuffsElbowLeft"), + ...GetModelLayers("CyberCuffsElbowRight"), + ]) +}); + +AddModel({ + Name: "CyberCuffsArms", + Folder: "CyberCuffs", + TopLevel: true, + Parent: "Cuffs", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight", "WristLeft", "WristRight"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("CyberCuffsWrists"), + ...GetModelLayers("CyberCuffsElbows"), + ]) +}); + +AddModel({ + Name: "CyberCuffsAnklesLeft", + Folder: "CyberCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleLeft"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesLeft", "", "", "BaseMetal", 0.4), + ...GetModelLayers("ShacklesAnklesLeft", "Screen", "", "Screen", 0.65), + ...GetModelLayers("ShacklesAnklesLeft", "Display", "", "Display", 0.67), + ...GetModelLayers("ShacklesAnklesLeft", "Lock", "", "Lock", 0.7), + ]) +}); + +AddModel({ + Name: "CyberCuffsAnklesRight", + Folder: "CyberCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesRight", "", "", "BaseMetal", 0.4), + ...GetModelLayers("ShacklesAnklesRight", "Screen", "", "Screen", 0.65), + ...GetModelLayers("ShacklesAnklesRight", "Display", "", "Display", 0.67), + ...GetModelLayers("ShacklesAnklesRight", "Lock", "", "Lock", 0.7), + ]) +}); + + +AddModel({ + Name: "CyberCuffsAnkles", + Folder: "CyberCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight", "AnkleLeft"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("CyberCuffsAnklesRight"), + ...GetModelLayers("CyberCuffsAnklesLeft"), + ]) +}); + + + +AddModel({ + Name: "CyberCuffsThighLeft", + Folder: "CyberCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighLeft"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighLeft", "", "", "BaseMetal", 0.4), + ...GetModelLayers("ShacklesThighLeft", "Screen", "", "Screen", 0.65), + ...GetModelLayers("ShacklesThighLeft", "Display", "", "Display", 0.67), + ...GetModelLayers("ShacklesThighLeft", "Lock", "", "Lock", 0.7), + ]) +}); + +AddModel({ + Name: "CyberCuffsThighRight", + Folder: "CyberCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighRight", "", "", "BaseMetal", 0.4), + ...GetModelLayers("ShacklesThighRight", "Screen", "", "Screen", 0.65), + ...GetModelLayers("ShacklesThighRight", "Display", "", "Display", 0.67), + ...GetModelLayers("ShacklesThighRight", "Lock", "", "Lock", 0.7), + ]) +}); + + +AddModel({ + Name: "CyberCuffsThigh", + Folder: "CyberCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight", "ThighLeft", "HighCuffs"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("CyberCuffsThighRight"), + ...GetModelLayers("CyberCuffsThighLeft"), + ]) +}); + + +AddModel({ + Name: "NeoCyberCollar", + Folder: "CyberCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("IronCollar", "", "", "BaseMetal", 0.4), + ...GetModelLayers("IronCollar", "Screen", "", "Screen", 0.65), + ...GetModelLayers("IronCollar", "Display", "", "Display", 0.67), + ...GetModelLayers("IronCollar", "Lock", "", "Lock", 0.7), + ]) +}); + + +AddModel({ + Name: "CyberLinkCollar", + Folder: "CyberCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("IronCollar", "Link", "", "BaseMetal", 0.4), + ...GetModelLayers("IronCollar", "ScreenLink", "", "Screen", 0.65), + ...GetModelLayers("IronCollar", "DisplayLink", "", "Display", 0.67), + ...GetModelLayers("IronCollar", "LockLink", "", "Lock", 0.7), + ]) +}); + +AddModel({ + Name: "NeoCyberBelt", + Folder: "CyberCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("IronBelt", "", "", "BaseMetal", 0.4), + ...GetModelLayers("IronBelt", "Screen", "", "Screen", 0.65), + ...GetModelLayers("IronBelt", "Display", "", "Display", 0.67), + ...GetModelLayers("IronBelt", "Lock", "", "Lock", 0.7), + ]) +}); + + + + +AddModel({ + Name: "CyberThighLink", + Folder: "CyberLink", + TopLevel: true, + Restraint: true, + Categories: ["Restraints","Cuffs", "Links"], + AddPose: ["ThighLink"], + Layers: ToLayerMap([ + { Name: "ThighLink", Layer: "BindChainLinksUnder", Pri: 5, + Poses: ToMap(["Spread"]), + AppendPose: {"HighCuffs": "High"}, // "LowCuffs": "", + InheritColor: "Tether", + }, + { Name: "GlowThighLink", Layer: "BindChainLinksUnder", Pri: 5.1, + Poses: ToMap(["Spread"]), + AppendPose: {"HighCuffs": "High"}, // "LowCuffs": "", + TieToLayer: "ThighLink", + InheritColor: "Glow", + }, + ]) +}); + +AddModel({ + Name: "CyberAnkleLink", + Folder: "CyberLink", + TopLevel: true, + Restraint: true, + Categories: ["Restraints","Cuffs", "Links"], + AddPose: ["AnkleLink"], + Layers: ToLayerMap([ + { Name: "AnkleLink", Layer: "BindChainLinksUnder", Pri: 5, + Poses: ToMap(["Spread"]), + InheritColor: "Tether", + }, + { Name: "GlowAnkleLink", Layer: "BindChainLinksUnder", Pri: 5.1, + Poses: ToMap(["Spread"]), + TieToLayer: "AnkleLink", + InheritColor: "Glow", + }, + ]) +}); +AddModel(GetModelFashionVersion("CyberThighLink", true)); +AddModel(GetModelFashionVersion("CyberAnkleLink", true)); + + + + +AddModel(GetModelFashionVersion("NeoCyberCollar", true)); +AddModel(GetModelFashionVersion("CyberLinkCollar", true)); +AddModel(GetModelFashionVersion("NeoCyberBelt", true)); +AddModel(GetModelFashionVersion("CyberCuffsWristLeft", true)); +AddModel(GetModelFashionVersion("CyberCuffsWristRight", true)); +AddModel(GetModelFashionVersion("CyberCuffsWrists", true)); +AddModel(GetModelFashionVersion("CyberCuffsElbowLeft", true)); +AddModel(GetModelFashionVersion("CyberCuffsElbowRight", true)); +AddModel(GetModelFashionVersion("CyberCuffsElbows", true)); +AddModel(GetModelFashionVersion("CyberCuffsArms", true)); +AddModel(GetModelFashionVersion("CyberCuffsAnklesLeft", true)); +AddModel(GetModelFashionVersion("CyberCuffsAnklesRight", true)); +AddModel(GetModelFashionVersion("CyberCuffsAnkles", true)); +AddModel(GetModelFashionVersion("CyberCuffsThighLeft", true)); +AddModel(GetModelFashionVersion("CyberCuffsThighRight", true)); +AddModel(GetModelFashionVersion("CyberCuffsThigh", true)); \ No newline at end of file diff --git a/Data/ModelList_CyberHeels.ts b/Data/ModelList_CyberHeels.ts new file mode 100644 index 000000000..288c9bddf --- /dev/null +++ b/Data/ModelList_CyberHeels.ts @@ -0,0 +1,77 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "CyberBalletHeels", + Folder: "CyberHeels", + TopLevel: true, + Parent: "BalletHeels", + Categories: ["Shoes", "Heels"], + AddPose: ["Ballet"], + RemovePoses: ["TapeBoots"], + Layers: ToLayerMap([ + { Name: "ShinyBalletLeft", Layer: "ShoeLeftOver", Pri: 52, // Bondage overrides plate mail + HideWhenOverridden: true, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...CALFLEFTPOSES]), + DisplacementSprite: "Ballet", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["BalletHeels"]), + EraseInvariant: true, + EraseMorph: {Spread: "Spread"}, + EraseSprite: "BalletErase", + EraseAmount: 100, + EraseLayers: ToMap(["BalletHeels"]), + }, + { Name: "ShinyBalletRight", Layer: "ShoeRightOver", Pri: 52, // Bondage overrides plate mail + HideWhenOverridden: true, + InheritColor: "Shoe", + Poses: ToMap([...CALFRIGHTPOSES, "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "BalletRightErase", + EraseAmount: 100, + EraseLayers: ToMap(["BalletHeelRight"]), + EraseZBonus: 100, + }, + + + + { Name: "GlowBalletLeft", Layer: "ShoeLeftOver", Pri: 52.1, + HideWhenOverridden: true, + InheritColor: "Glow", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...CALFLEFTPOSES]), + NoOverride: true, + TieToLayer: "ShinyBalletLeft", + + DisplacementSprite: "BalletCuffs", + DisplaceZBonus: 10000, + DisplaceAmount: 70, + DisplaceLayers: ToMap(["BalletHeelsCuffs"]), + }, + { Name: "GlowBalletRight", Layer: "ShoeRightOver", Pri: 52.1, + HideWhenOverridden: true, + InheritColor: "Glow", + Poses: ToMap([...CALFRIGHTPOSES, "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + NoOverride: true, + TieToLayer: "ShinyBalletRight", + }, + ]) +}); + + +AddModel(GetModelRestraintVersion("CyberBalletHeels", true, + ["RestrainingShoes"], + ["TapeBoots"])); + diff --git a/Data/ModelList_DivineCuffs.ts b/Data/ModelList_DivineCuffs.ts new file mode 100644 index 000000000..9cceb000e --- /dev/null +++ b/Data/ModelList_DivineCuffs.ts @@ -0,0 +1,252 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "DivineCuffsWristLeft", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristLeft", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesWristLeft", "", "Deco", "Band", 0.7), + ...GetModelLayers("ShacklesWristLeft", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesWristLeft", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesWristLeft", "", "LockBand", "LockBand", 1.6), + ]) +}); +AddModel({ + Name: "DivineCuffsWristRight", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristRight", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesWristRight", "", "Deco", "Band", 0.7), + ...GetModelLayers("ShacklesWristRight", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesWristRight", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesWristRight", "", "LockBand", "LockBand", 1.6), + ]) +}); + +AddModel({ + Name: "DivineCuffsWrists", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("DivineCuffsWristLeft"), + ...GetModelLayers("DivineCuffsWristRight"), + ]) +}); + + + +AddModel({ + Name: "DivineCuffsElbowLeft", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowLeft", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesElbowLeft", "", "Deco", "Band", 0.7), + ...GetModelLayers("ShacklesElbowLeft", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesElbowLeft", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesElbowLeft", "", "LockBand", "LockBand", 1.6), + ]) +}); +AddModel({ + Name: "DivineCuffsElbowRight", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowRight", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesElbowRight", "", "Deco", "Band", 0.7), + ...GetModelLayers("ShacklesElbowRight", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesElbowRight", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesElbowRight", "", "LockBand", "LockBand", 1.6), + ]) +}); + +AddModel({ + Name: "DivineCuffsElbows", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("DivineCuffsElbowLeft"), + ...GetModelLayers("DivineCuffsElbowRight"), + ]) +}); + +AddModel({ + Name: "DivineCuffsArms", + Folder: "DivineCuffs", + TopLevel: true, + Parent: "Cuffs", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight", "WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("DivineCuffsWrists"), + ...GetModelLayers("DivineCuffsElbows"), + ]) +}); + +AddModel({ + Name: "DivineCuffsAnklesLeft", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesLeft", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesAnklesLeft", "", "Deco", "Band", 0.7), + ...GetModelLayers("ShacklesAnklesLeft", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesAnklesLeft", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesAnklesLeft", "", "LockBand", "LockBand", 1.6), + ]) +}); + +AddModel({ + Name: "DivineCuffsAnklesRight", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesRight", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesAnklesRight", "", "Deco", "Band", 0.7), + ...GetModelLayers("ShacklesAnklesRight", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesAnklesRight", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesAnklesRight", "", "LockBand", "LockBand", 1.6), + ]) +}); + + +AddModel({ + Name: "DivineCuffsAnkles", + Folder: "DivineCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight", "AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("DivineCuffsAnklesRight"), + ...GetModelLayers("DivineCuffsAnklesLeft"), + ]) +}); + + + +AddModel({ + Name: "DivineCuffsThighLeft", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighLeft", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesThighLeft", "", "Deco", "Band", 0.7), + ...GetModelLayers("ShacklesThighLeft", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesThighLeft", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesThighLeft", "", "LockBand", "LockBand", 1.6), + ]) +}); + +AddModel({ + Name: "DivineCuffsThighRight", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighRight", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesThighRight", "", "Deco", "Band", 0.7), + ...GetModelLayers("ShacklesThighRight", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesThighRight", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesThighRight", "", "LockBand", "LockBand", 1.6), + ]) +}); + + +AddModel({ + Name: "DivineCuffsThigh", + Folder: "DivineCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight", "ThighLeft", "LowCuffs"], + Layers: ToLayerMap([ + ...GetModelLayers("DivineCuffsThighRight"), + ...GetModelLayers("DivineCuffsThighLeft"), + ]) +}); + + +AddModel({ + Name: "DivineCollar", + Folder: "DivineCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronCollar", "", "", "BaseMetal", 0.8), + ...GetModelLayers("IronCollar", "", "Deco", "Band", 0.7), + ...GetModelLayers("IronCollar", "", "Lock", "Lock", 1.8), + ...GetModelLayers("IronCollar", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("IronCollar", "", "LockBand", "LockBand", 1.6), + ]) +}); + +AddModel({ + Name: "DivineBelt", + Folder: "DivineCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronBelt", "", "", "BaseMetal", 0.8), + ...GetModelLayers("IronBelt", "", "Deco", "Band", 0.7), + ...GetModelLayers("IronBelt", "", "Lock", "Lock", 1.8), + ...GetModelLayers("IronBelt", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("IronBelt", "", "LockBand", "LockBand", 1.6), + ]) +}); + + + + +AddModel(GetModelFashionVersion("DivineCollar", true)); +AddModel(GetModelFashionVersion("DivineBelt", true)); +AddModel(GetModelFashionVersion("DivineCuffsWristLeft", true)); +AddModel(GetModelFashionVersion("DivineCuffsWristRight", true)); +AddModel(GetModelFashionVersion("DivineCuffsWrists", true)); +AddModel(GetModelFashionVersion("DivineCuffsElbowLeft", true)); +AddModel(GetModelFashionVersion("DivineCuffsElbowRight", true)); +AddModel(GetModelFashionVersion("DivineCuffsElbows", true)); +AddModel(GetModelFashionVersion("DivineCuffsArms", true)); +AddModel(GetModelFashionVersion("DivineCuffsAnklesLeft", true)); +AddModel(GetModelFashionVersion("DivineCuffsAnklesRight", true)); +AddModel(GetModelFashionVersion("DivineCuffsAnkles", true)); +AddModel(GetModelFashionVersion("DivineCuffsThighLeft", true)); +AddModel(GetModelFashionVersion("DivineCuffsThighRight", true)); +AddModel(GetModelFashionVersion("DivineCuffsThigh", true)); \ No newline at end of file diff --git a/Data/ModelList_DivineCuffsClean.ts b/Data/ModelList_DivineCuffsClean.ts new file mode 100644 index 000000000..838aafd97 --- /dev/null +++ b/Data/ModelList_DivineCuffsClean.ts @@ -0,0 +1,252 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "DivineCuffsCleanWristLeft", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristLeft", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesWristLeft", "", "DecoClean", "Band", 0.7), + ...GetModelLayers("ShacklesWristLeft", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesWristLeft", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesWristLeft", "", "LockBand", "LockBand", 1.6), + ]) +}); +AddModel({ + Name: "DivineCuffsCleanWristRight", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristRight", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesWristRight", "", "DecoClean", "Band", 0.7), + ...GetModelLayers("ShacklesWristRight", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesWristRight", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesWristRight", "", "LockBand", "LockBand", 1.6), + ]) +}); + +AddModel({ + Name: "DivineCuffsCleanWrists", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("DivineCuffsCleanWristLeft"), + ...GetModelLayers("DivineCuffsCleanWristRight"), + ]) +}); + + + +AddModel({ + Name: "DivineCuffsCleanElbowLeft", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowLeft", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesElbowLeft", "", "DecoClean", "Band", 0.7), + ...GetModelLayers("ShacklesElbowLeft", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesElbowLeft", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesElbowLeft", "", "LockBand", "LockBand", 1.6), + ]) +}); +AddModel({ + Name: "DivineCuffsCleanElbowRight", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowRight", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesElbowRight", "", "DecoClean", "Band", 0.7), + ...GetModelLayers("ShacklesElbowRight", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesElbowRight", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesElbowRight", "", "LockBand", "LockBand", 1.6), + ]) +}); + +AddModel({ + Name: "DivineCuffsCleanElbows", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("DivineCuffsCleanElbowLeft"), + ...GetModelLayers("DivineCuffsCleanElbowRight"), + ]) +}); + +AddModel({ + Name: "DivineCuffsCleanArms", + Folder: "DivineCuffs", + TopLevel: true, + Parent: "Cuffs", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight", "WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("DivineCuffsCleanWrists"), + ...GetModelLayers("DivineCuffsCleanElbows"), + ]) +}); + +AddModel({ + Name: "DivineCuffsCleanAnklesLeft", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesLeft", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesAnklesLeft", "", "DecoClean", "Band", 0.7), + ...GetModelLayers("ShacklesAnklesLeft", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesAnklesLeft", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesAnklesLeft", "", "LockBand", "LockBand", 1.6), + ]) +}); + +AddModel({ + Name: "DivineCuffsCleanAnklesRight", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesRight", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesAnklesRight", "", "DecoClean", "Band", 0.7), + ...GetModelLayers("ShacklesAnklesRight", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesAnklesRight", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesAnklesRight", "", "LockBand", "LockBand", 1.6), + ]) +}); + + +AddModel({ + Name: "DivineCuffsCleanAnkles", + Folder: "DivineCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight", "AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("DivineCuffsCleanAnklesRight"), + ...GetModelLayers("DivineCuffsCleanAnklesLeft"), + ]) +}); + + + +AddModel({ + Name: "DivineCuffsCleanThighLeft", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighLeft", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesThighLeft", "", "DecoClean", "Band", 0.7), + ...GetModelLayers("ShacklesThighLeft", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesThighLeft", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesThighLeft", "", "LockBand", "LockBand", 1.6), + ]) +}); + +AddModel({ + Name: "DivineCuffsCleanThighRight", + Folder: "DivineCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighRight", "", "", "BaseMetal", 0.8), + ...GetModelLayers("ShacklesThighRight", "", "DecoClean", "Band", 0.7), + ...GetModelLayers("ShacklesThighRight", "", "Lock", "Lock", 1.8), + ...GetModelLayers("ShacklesThighRight", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("ShacklesThighRight", "", "LockBand", "LockBand", 1.6), + ]) +}); + + +AddModel({ + Name: "DivineCuffsCleanThigh", + Folder: "DivineCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight", "ThighLeft", "LowCuffs"], + Layers: ToLayerMap([ + ...GetModelLayers("DivineCuffsCleanThighRight"), + ...GetModelLayers("DivineCuffsCleanThighLeft"), + ]) +}); + + +AddModel({ + Name: "DivineCollarClean", + Folder: "DivineCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronCollar", "", "", "BaseMetal", 0.8), + ...GetModelLayers("IronCollar", "", "DecoClean", "Band", 0.7), + ...GetModelLayers("IronCollar", "", "Lock", "Lock", 1.8), + ...GetModelLayers("IronCollar", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("IronCollar", "", "LockBand", "LockBand", 1.6), + ]) +}); + +AddModel({ + Name: "DivineBeltClean", + Folder: "DivineCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronBelt", "", "", "BaseMetal", 0.8), + ...GetModelLayers("IronBelt", "", "DecoClean", "Band", 0.7), + ...GetModelLayers("IronBelt", "", "Lock", "Lock", 1.8), + ...GetModelLayers("IronBelt", "", "LockPlate", "LockPlate", 1.7), + ...GetModelLayers("IronBelt", "", "LockBand", "LockBand", 1.6), + ]) +}); + + + + +AddModel(GetModelFashionVersion("DivineCollarClean", true)); +AddModel(GetModelFashionVersion("DivineBeltClean", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanWristLeft", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanWristRight", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanWrists", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanElbowLeft", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanElbowRight", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanElbows", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanArms", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanAnklesLeft", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanAnklesRight", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanAnkles", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanThighLeft", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanThighRight", true)); +AddModel(GetModelFashionVersion("DivineCuffsCleanThigh", true)); \ No newline at end of file diff --git a/Data/ModelList_DivineGag.ts b/Data/ModelList_DivineGag.ts new file mode 100644 index 000000000..0ef53d324 --- /dev/null +++ b/Data/ModelList_DivineGag.ts @@ -0,0 +1,147 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "DivineGag", + Folder: "DivineGag", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceBigGag", "StuffMouth", "HideMouth"], + Layers: ToLayerMap([ + { Name: "Ball", Layer: "Gag", Pri: 50, + Invariant: true, + InheritColor: "Ball", + }, + { Name: "Teeth", Layer: "Gag", Pri: 50.1, + Invariant: true, + NoColorize: true, + TieToLayer: "Ball", + }, + { Name: "Harness", Layer: "GagStraps", Pri: 50, + Invariant: true, + InheritColor: "Harness", + }, + { Name: "Gold", Layer: "GagStraps", Pri: 50.2, + Invariant: true, + InheritColor: "Clips", + }, + { Name: "Metallic", Layer: "GagStraps", Pri: 50.1, + Invariant: true, + InheritColor: "Hardware", + }, + ]) +}); +AddModel(GetModelFashionVersion("DivineGag", true)); + + +AddModel({ + Name: "DivineGagClean", + Folder: "DivineGag", + TopLevel: false, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceBigGag", "StuffMouth", "HideMouth"], + Layers: ToLayerMap([ + { Name: "Ball", Layer: "Gag", Pri: 50, + Invariant: true, + InheritColor: "Ball", + }, + { Name: "Teeth", Layer: "Gag", Pri: 50.1, + Invariant: true, + NoColorize: true, + TieToLayer: "Ball", + }, + { Name: "Harness", Layer: "GagStraps", Pri: 50, + Invariant: true, + InheritColor: "Harness", + }, + { Name: "GoldClean", Layer: "GagStraps", Pri: 50.2, + Invariant: true, + InheritColor: "Clips", + }, + { Name: "Metallic", Layer: "GagStraps", Pri: 50.1, + Invariant: true, + InheritColor: "Hardware", + }, + ]) +}); +AddModel(GetModelFashionVersion("DivineGagClean", false)); + + + + +AddModel({ + Name: "DivineMuzzle", + Folder: "DivineGag", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceBigGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Muzzle", Layer: "GagMuzzle", Pri: 50, + Invariant: true, + InheritColor: "Muzzle", + }, + { Name: "MuzzleRim", Layer: "GagMuzzle", Pri: 50.1, + Invariant: true, + InheritColor: "Rim", + TieToLayer: "Muzzle", + }, + { Name: "MuzzleGold", Layer: "GagMuzzle", Pri: 50.2, + Invariant: true, + InheritColor: "Clips", + }, + { Name: "MuzzleHarness", Layer: "GagStrapsUnder", Pri: 50, + Invariant: true, + InheritColor: "Harness", + }, + { Name: "MuzzleCollar", Layer: "Collar", Pri: -50, + Invariant: true, + InheritColor: "Collar", + }, + ]) +}); +AddModel(GetModelFashionVersion("DivineMuzzle", true)); + + +AddModel({ + Name: "DivineMuzzleClean", + Folder: "DivineGag", + TopLevel: false, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceBigGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Muzzle", Layer: "GagMuzzle", Pri: 50, + Invariant: true, + InheritColor: "Muzzle", + }, + { Name: "MuzzleRim", Layer: "GagMuzzle", Pri: 50.1, + Invariant: true, + InheritColor: "Rim", + TieToLayer: "Muzzle", + }, + { Name: "MuzzleGoldClean", Layer: "GagMuzzle", Pri: 50.2, + Invariant: true, + InheritColor: "Clips", + }, + { Name: "MuzzleHarness", Layer: "GagStrapsUnder", Pri: 50, + Invariant: true, + InheritColor: "Harness", + }, + { Name: "MuzzleCollar", Layer: "Collar", Pri: -50, + Invariant: true, + InheritColor: "Collar", + }, + ]) +}); +AddModel(GetModelFashionVersion("DivineMuzzleClean", false)); diff --git a/Data/ModelList_Dress.ts b/Data/ModelList_Dress.ts new file mode 100644 index 000000000..b47eb3034 --- /dev/null +++ b/Data/ModelList_Dress.ts @@ -0,0 +1,1300 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "LaceCorset", + Folder: "Dress", + Parent: "Dress", + TopLevel: true, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + { Name: "LaceCorset", Layer: "Bustier", Pri: 20.1, + Invariant: true, + InheritColor: "Base", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + }, + { Name: "LaceCorsetHardware", Layer: "Bustier", Pri: 20, + Invariant: true, + TieToLayer: "LaceCorset", + NoOverride: true, + InheritColor: "Hardware", + }, + { Name: "LaceCorsetStripes", Layer: "Bustier", Pri: 20, + Invariant: true, + TieToLayer: "LaceCorset", + NoOverride: true, + InheritColor: "Stripes", + }, + { Name: "LaceCorsetCrystal", Layer: "Bustier", Pri: 20, + Invariant: true, + TieToLayer: "LaceCorset", + NoOverride: true, + InheritColor: "Crystal", + }, + ]) +}); +AddModel({ + Name: "LaceBra", + Folder: "Dress", + TopLevel: true, + Parent: "LaceCorset", + Categories: ["Bras"], + Layers: ToLayerMap([ + { Name: "LaceChest", Layer: "BraChest", Pri: 10.1, + Invariant: true, + InheritColor: "BraBase", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + }, + { Name: "LaceChestCups", Layer: "BraChest", Pri: 10, + Invariant: true, + TieToLayer: "LaceChest", + NoOverride: true, + InheritColor: "BraCups", + }, + { Name: "LaceChestStripes", Layer: "BraChest", Pri: 10, + Invariant: true, + TieToLayer: "LaceChest", + NoOverride: true, + InheritColor: "BraStripes", + }, + ]) +}); +AddModel({ + Name: "LaceBustier", + Folder: "Dress", + TopLevel: true, + Parent: "LaceCorset", + Categories: ["Bras", "Tops"], + Layers: ToLayerMap([ + { Name: "LaceChest", Layer: "BustierChest", Pri: 10.1, + Invariant: true, + InheritColor: "BraBase", + EraseAmount: 100, + EraseSprite: "LaceChest", + EraseLayers: ToMap(["CorsetBra"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + }, + { Name: "LaceChestCups", Layer: "BustierChest", Pri: 10, + Invariant: true, + TieToLayer: "LaceChest", + NoOverride: true, + InheritColor: "BraCups", + }, + { Name: "LaceChestStripes", Layer: "BustierChest", Pri: 10, + Invariant: true, + TieToLayer: "LaceChest", + NoOverride: true, + InheritColor: "BraStripes", + }, + ]) +}); +AddModel({ + Name: "LaceDeco", + Folder: "Dress", + Parent: "Dress", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "LaceChestDeco", Layer: "ChestDeco", Pri: -20, + Invariant: true, + InheritColor: "DecoBase", + }, + { Name: "LaceChestDecoCrystal", Layer: "ChestDeco", Pri: -20.1, + Invariant: true, + TieToLayer: "LaceChestDeco", + NoOverride: true, + InheritColor: "DecoCrystal", + }, + { Name: "LaceChestDecoHardware", Layer: "ChestDeco", Pri: -20.1, + Invariant: true, + TieToLayer: "LaceChestDeco", + NoOverride: true, + InheritColor: "DecoHardware", + }, + ]) +}); +AddModel({ + Name: "LaceBraDeco", + Folder: "Dress", + TopLevel: false, + Parent: "LaceCorset", + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + ...GetModelLayers("LaceBustier"), + ...GetModelLayers("LaceDeco"), + ]) +}); +AddModel(GetModelRestraintVersion("LaceCorset", true)); +AddModel(GetModelRestraintVersion("LaceBustier", true)); +AddModel(GetModelRestraintVersion("LaceBraDeco", true)); + + + +AddModel({ + Name: "BowCorsetBow", + Folder: "Dress", + TopLevel: true, + Parent: "BowCorset", + Categories: ["Accessories"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + { Name: "BowCorsetBow", Layer: "ChestDeco", Pri: -9, + Invariant: true, + InheritColor: "Bow", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + }, + ]) +}); + +AddModel({ + Name: "BowCorsetBust", + Folder: "Dress", + Parent: "BowCorset", + TopLevel: false, + Categories: ["Corsets", "Bras"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + { Name: "BowCorsetBust", Layer: "BustierChest", Pri: 40.1, + Invariant: true, + InheritColor: "CorsetBust", + EraseAmount: 100, + EraseSprite: "LaceChest", + EraseLayers: ToMap(["CorsetBra"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + }, + { Name: "BowCorsetBustRuffle", Layer: "BustierChest", Pri: 40.1, + Invariant: true, + InheritColor: "RuffleBust", + NoOverride: true, + TieToLayer: "BowCorsetBust" + }, + ]) +}); +AddModel({ + Name: "BowCorsetBustBow", + Folder: "Dress", + Parent: "BowCorset", + TopLevel: false, + Categories: ["Corsets", "Bras"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + ...GetModelLayers("BowCorsetBust"), + ...GetModelLayers("BowCorsetBow"), + ]) +}); + + +AddModel({ + Name: "BowCorset", + Folder: "Dress", + Parent: "Dress", + TopLevel: true, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + { Name: "BowCorset", Layer: "Bustier", Pri: 40.1, + Invariant: true, + InheritColor: "Corset", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + }, + { Name: "BowCorsetRuffle", Layer: "Bustier", Pri: 40.1, + Invariant: true, + InheritColor: "Ruffle", + NoOverride: true, + TieToLayer: "BowCorset" + }, + ]) +}); +AddModel({ + Name: "BowCorsetLong", + Folder: "Dress", + Parent: "BowCorset", + TopLevel: false, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + { Name: "BowCorsetLong", Layer: "Bustier", Pri: 40.1, + Invariant: true, + //SwapLayerPose: {Pants: "CorsetUnder", Kneel: "CorsetUnder", KneelClosed: "CorsetUnder"}, + InheritColor: "Corset", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + }, + { Name: "BowCorsetLongRuffle", Layer: "Bustier", Pri: 40.1, + //SwapLayerPose: {Pants: "CorsetUnder", Kneel: "CorsetUnder", KneelClosed: "CorsetUnder"}, + Invariant: true, + InheritColor: "Ruffle", + NoOverride: true, + TieToLayer: "BowCorsetLong" + }, + ]) +}); +AddModel({ + Name: "BowCorsetOverbust", + Folder: "Dress", + Parent: "BowCorset", + TopLevel: false, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + ...GetModelLayers("BowCorsetBust"), + ...GetModelLayers("BowCorset"), + ]) +}); +AddModel({ + Name: "BowCorsetLongOverbust", + Folder: "Dress", + Parent: "BowCorset", + TopLevel: false, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + ...GetModelLayers("BowCorsetBust"), + ...GetModelLayers("BowCorsetLong"), + ]) +}); +AddModel({ + Name: "BowCorsetOverbustBow", + Folder: "Dress", + Parent: "BowCorset", + TopLevel: false, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + ...GetModelLayers("BowCorsetBust"), + ...GetModelLayers("BowCorset"), + ...GetModelLayers("BowCorsetBow"), + ]) +}); + +AddModel({ + Name: "BowCorsetLongOverbustBow", + Folder: "Dress", + Parent: "BowCorset", + TopLevel: false, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + ...GetModelLayers("BowCorsetBust"), + ...GetModelLayers("BowCorsetLong"), + ...GetModelLayers("BowCorsetBow"), + ]) +}); + + +AddModel(GetModelRestraintVersion("BowCorset", true)); +AddModel(GetModelRestraintVersion("BowCorsetBow", true)); +AddModel(GetModelRestraintVersion("BowCorsetOverbust", true)); +AddModel(GetModelRestraintVersion("BowCorsetOverbustBow", true)); +AddModel(GetModelRestraintVersion("BowCorsetLongOverbust", true)); +AddModel(GetModelRestraintVersion("BowCorsetLongOverbustBow", true)); + + +AddModel({ + Name: "LatexCorset", + Folder: "Corsets", + Parent: "Dress", + TopLevel: true, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + { Name: "HeavyCorset", Layer: "Bustier", Pri: 30.1, + Invariant: true, + InheritColor: "Corset", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + }, + ]) +}); +AddModel({ + Name: "LatexBra", + Folder: "Corsets", + TopLevel: true, + Parent: "LatexCorset", + Categories: ["Bras"], + Layers: ToLayerMap([ + { Name: "ChestHeavyCorset", Layer: "BraChest", Pri: 17.1, + Invariant: true, + InheritColor: "Bra", + }, + ]) +}); +AddModel({ + Name: "LatexBraStraps", + Folder: "Corsets", + TopLevel: false, + Parent: "LatexBra", + Categories: ["Bras"], + Layers: ToLayerMap([ + { Name: "StrapsHeavyCorset", Layer: "BraChest", Pri: 17, + Invariant: true, + InheritColor: "Straps", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "LatexBraStrapsCross", + Folder: "Corsets", + TopLevel: false, + Parent: "LatexBra", + Categories: ["Bras"], + Layers: ToLayerMap([ + { Name: "CrossHeavyCorset", Layer: "BraChest", Pri: 17, + Invariant: true, + InheritColor: "Straps", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "LatexBustier", + Folder: "Corsets", + TopLevel: true, + Parent: "LatexCorset", + Categories: ["Tops", "Bras"], + Layers: ToLayerMap([ + { Name: "ChestHeavyCorset", Layer: "BustierChest", Pri: 17.1, + Invariant: true, + InheritColor: "Bra", + EraseAmount: 100, + EraseSprite: "LaceChest", + EraseLayers: ToMap(["CorsetBra"]), + }, + ]) +}); + +AddModel({ + Name: "LatexCorsetFull", + Folder: "Corsets", + Parent: "LatexCorset", + TopLevel: false, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + ...GetModelLayers("LatexCorset"), + ...GetModelLayers("LatexBustier"), + ]) +}); +AddModel({ + Name: "LatexCorsetStrap", + Folder: "Corsets", + Parent: "LatexCorset", + TopLevel: false, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + ...GetModelLayers("LatexCorset"), + { Name: "StrapsHeavyCorset", Layer: "ChestStraps", Pri: 17.1, + Invariant: true, + InheritColor: "Bra", + EraseAmount: 100, + EraseSprite: "LaceChest", + EraseLayers: ToMap(["CorsetBra"]), + }, + ]) +}); +AddModel({ + Name: "LatexCorsetFullStrap", + Folder: "Corsets", + Parent: "LatexCorset", + TopLevel: false, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + ...GetModelLayers("LatexCorset"), + ...GetModelLayers("LatexBustier"), + { Name: "StrapsHeavyCorset", Layer: "ChestStraps", Pri: 17.1, + Invariant: true, + InheritColor: "Bra", + EraseAmount: 100, + EraseSprite: "LaceChest", + EraseLayers: ToMap(["CorsetBra"]), + }, + ]) +}); +AddModel({ + Name: "LatexCorsetCross", + Folder: "Corsets", + Parent: "LatexCorset", + TopLevel: false, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + ...GetModelLayers("LatexCorset"), + { Name: "CrossHeavyCorset", Layer: "ChestStraps", Pri: 17.1, + Invariant: true, + InheritColor: "Bra", + EraseAmount: 100, + EraseSprite: "LaceChest", + EraseLayers: ToMap(["CorsetBra"]), + }, + ]) +}); +AddModel({ + Name: "LatexCorsetFullCross", + Folder: "Corsets", + Parent: "LatexCorset", + TopLevel: false, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + ...GetModelLayers("LatexCorset"), + ...GetModelLayers("LatexBustier"), + { Name: "CrossHeavyCorset", Layer: "ChestStraps", Pri: 17.1, + Invariant: true, + InheritColor: "Bra", + EraseAmount: 100, + EraseSprite: "LaceChest", + EraseLayers: ToMap(["CorsetBra"]), + }, + ]) +}); +AddModel(GetModelRestraintVersion("LatexCorset", true)); +AddModel(GetModelRestraintVersion("LatexBustier", true)); +AddModel(GetModelRestraintVersion("LatexCorsetFull", true)); +AddModel(GetModelRestraintVersion("LatexCorsetStrap", true)); +AddModel(GetModelRestraintVersion("LatexCorsetCross", true)); +AddModel(GetModelRestraintVersion("LatexCorsetFullStrap", true)); +AddModel(GetModelRestraintVersion("LatexCorsetFullCross", true)); + + + +AddModel({ + Name: "LacePanties", + Folder: "Dress", + Parent: "Dress", + TopLevel: true, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + { Name: "LaceCrotchPanel", Layer: "Panties", Pri: 30, + //swaplayerpose: {Kneel: "PantiesLower", KneelClosed: "PantiesLower"}, + Invariant: true, + InheritColor: "Panties", + }, + { Name: "LaceCrotchPanelTrim", Layer: "Panties", Pri: 30.2, + //swaplayerpose: {Kneel: "PantiesLower", KneelClosed: "PantiesLower"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "LaceCrotchPanel", + InheritColor: "Trim", + }, + { Name: "LaceCrotchPanelLace", Layer: "Panties", Pri: 30.1, + //swaplayerpose: {Kneel: "PantiesLower", KneelClosed: "PantiesLower"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "LaceCrotchPanel", + InheritColor: "Lace", + }, + ]) +}); + + +AddModel({ + Name: "LaceCrotchPanel", + Folder: "Dress", + Parent: "LacePanties", + TopLevel: false, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + { Name: "LaceCrotchPanel", Layer: "CrotchPanelMid", Pri: 30, + //swaplayerpose: {Kneel: "CrotchPanelLower", KneelClosed: "CrotchPanelLower"}, + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + InheritColor: "Panties", + }, + { Name: "LaceCrotchPanelTrim", Layer: "CrotchPanelMid", Pri: 30.2, + //swaplayerpose: {Kneel: "CrotchPanelLower", KneelClosed: "CrotchPanelLower"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "LaceCrotchPanel", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + InheritColor: "Trim", + }, + { Name: "LaceCrotchPanelLace", Layer: "CrotchPanelMid", Pri: 30.1, + //swaplayerpose: {Kneel: "CrotchPanelLower", KneelClosed: "CrotchPanelLower"}, + Invariant: true, + DisplacementInvariant: true, + NoOverride: true, + TieToLayer: "LaceCrotchPanel", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + InheritColor: "Lace", + }, + ]) +}); + + + +AddModel({ + Name: "DressSkirt", + Folder: "Dress", + Parent: "Dress", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "Skirt", Pri: 9, + Poses: ToMap([...LEGPOSES]), + //HideWhenOverridden: true, + //swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + MorphPoses: {Hogtie: "Closed", Closed: "Closed", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: {Hogtie: "CrotchStrap", CrotchStrap: "CrotchStrap"}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "SkirtOver", Layer: "SkirtOver", Pri: 3, + Poses: ToMap([...KNEELPOSES]), + //RequirePoses: ToMap(["CrotchStrap"]), + TieToLayer: "Skirt", NoOverride: true, + InheritColor: "Skirt", + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "DressSkirtSplitNoBelt", + Folder: "Dress", + Parent: "DressSkirtSplit", + TopLevel: false, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "SkirtBack", Pri: 9, + Poses: ToMap([...LEGPOSES]), + HideWhenOverridden: true, + ////swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + MorphPoses: {Hogtie: "Closed", Closed: "Closed", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: {Hogtie: "CrotchStrap", CrotchStrap: "CrotchStrap"}, + InheritColor: "SkirtBack", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + }, + { Name: "SkirtSplit", Layer: "Skirt", Pri: 13, + Poses: ToMap([...LEGPOSES]), NoOverride: true, + //swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + MorphPoses: {Hogtie: "Closed", Closed: "Closed", Kneel: "Kneel", KneelClosed: "Kneel"}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + InheritColor: "Skirt", + Invariant: true, + EraseInvariant: true, + EraseSprite: "EraseSkirtSplit", + ErasePoses: ["Spread", "Closed", "Hogtie"], + EraseLayers: {WrappingLegsOver: true}, + EraseZBonus: 100, + }, + { Name: "SkirtSplitOver", Layer: "SkirtOver", Pri: 17, + Poses: ToMap([...KNEELPOSES]), + //RequirePoses: ToMap(["CrotchStrap"]), + TieToLayer: "Skirt", NoOverride: true, + InheritColor: "Skirt", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "DressSkirtSplit", + Folder: "Dress", + Parent: "Dress", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + ...GetModelLayers("DressSkirtSplitNoBelt"), + { Name: "SkirtSplitBelt", Layer: "Skirt", Pri: 12.95, + Poses: ToMap([...LEGPOSES]), NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + InheritColor: "Skirt", + TieToLayer: "SkirtSplit", + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "BlouseCollar", + Folder: "Dress", + Parent: "DressBlouse", + TopLevel: true, + Categories: ["Accessories"], + //RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { + Name: "BlouseCollar", Layer: "ShirtCollar", Pri: 10, + InheritColor: "Collar", + Poses: ToMap([...ARMPOSES]), + MorphPoses: {Up: "Up", Boxtie: "Boxtie", Wristtie: "Boxtie", Crossed: "Boxtie", Front: "Boxtie",}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "BlouseSkirt", + Folder: "Dress", + Parent: "DressBlouse", + TopLevel: true, + Categories: ["Skirts"], + //RemovePoses: ["EncaseTorsoLower"], + Layers: ToLayerMap([ + { Name: "BlouseSkirtLone", Layer: "SkirtOver", Pri: 100, + NoOverride: true, + //InheritColor: "Skirt", + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel",}, + HidePoses: ToMap(["EncaseTorsoLower"]), + InheritColor: "BlouseSkirt", + }, + { Name: "BlouseSkirtOverKneel", Layer: "SkirtOver", Pri: 100, + Poses: ToMap([...KNEELPOSES]), + Invariant: true, + InheritColor: "BlouseSkirt", + NoOverride: true, + //NoOverride: true, + TieToLayer: "BlouseSkirt", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + HidePoses: ToMap(["EncaseTorsoLower"]), + }, + + ]) +}); + +AddModel({ + Name: "DressBlouseBust", + Folder: "Dress", + Parent: "DressBlouse", + TopLevel: false, + Categories: ["Tops"], + //RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "BlouseTorso", Layer: "ShirtOver", Pri: 1, + InheritColor: "Blouse", + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel",}, + HidePoses: ToMap(["EncaseTorsoUpper"]), + }, + { Name: "BlouseSkirt", Layer: "SkirtOver", Pri: 100, + NoOverride: true, + //InheritColor: "Skirt", + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel",}, + HidePoses: ToMap(["EncaseTorsoLower"]), + }, + { Name: "BlouseSkirtOverKneel", Layer: "SkirtOver", Pri: 100, + Poses: ToMap([...KNEELPOSES]), + Invariant: true, + InheritColor: "BlouseSkirt", + NoOverride: true, + //NoOverride: true, + TieToLayer: "BlouseSkirt", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + HidePoses: ToMap(["EncaseTorsoLower"]), + }, + { Name: "BlouseBust", Layer: "ShirtChest", Pri: 1, + InheritColor: "Blouse", + Poses: ToMap([...ARMPOSES]), + MorphPoses: {Up: "Up", Boxtie: "Boxtie", Wristtie: "Boxtie", Crossed: "Boxtie", Front: "Boxtie",}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + AppendPose: {Chesttied: "Chesttied"}, + Invariant: true, + HidePoses: ToMap(["EncaseTorsoUpper"]), + }, + { Name: "BlouseNeck", Layer: "ShirtChest", Pri: 1.1, + InheritColor: "Neck", + TieToLayer: "BlouseBust", + NoOverride: true, + Poses: ToMap([...ARMPOSES]), + MorphPoses: {Up: "Up", Boxtie: "Boxtie", Wristtie: "Boxtie", Crossed: "Boxtie", Front: "Boxtie",}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + HidePoses: ToMap(["EncaseTorsoUpper"]), + }, + ...GetModelLayers("BlouseCollar"), + ]) +}); + + +AddModel({ + Name: "DressBlouseBustCropped", + Folder: "Dress", + Parent: "DressBlouse", + TopLevel: false, + Categories: ["Tops"], + //RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "CroppedBlouseTorso", Layer: "Shirt", Pri: 1, + InheritColor: "Blouse", + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel",}, + HidePoses: ToMap(["EncaseTorsoUpper"]), + }, + { Name: "BlouseBust", Layer: "ShirtChest", Pri: 1, + InheritColor: "Blouse", + Poses: ToMap([...ARMPOSES]), + MorphPoses: {Up: "Up", Boxtie: "Boxtie", Wristtie: "Boxtie", Crossed: "Boxtie", Front: "Boxtie",}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + AppendPose: {Chesttied: "Chesttied"}, + Invariant: true, + HidePoses: ToMap(["EncaseTorsoUpper"]), + }, + { Name: "BlouseNeck", Layer: "ShirtChest", Pri: 1.1, + InheritColor: "Neck", + TieToLayer: "BlouseBust", + NoOverride: true, + Poses: ToMap([...ARMPOSES]), + MorphPoses: {Up: "Up", Boxtie: "Boxtie", Wristtie: "Boxtie", Crossed: "Boxtie", Front: "Boxtie",}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + HidePoses: ToMap(["EncaseTorsoUpper"]), + }, + ...GetModelLayers("BlouseCollar"), + ]) +}); + +AddModel({ + Name: "DressBlouseSleeveLeft", + Folder: "Dress", + Parent: "DressBlouseSleeves", + Categories: ["Sleeves"], + TopLevel: true, + Layers: ToLayerMap([ + { Name: "BlouseArmLeft", Layer: "SleeveLeft", Pri: 40, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + { Name: "BlouseForeArmLeft", Layer: "ForeSleeveLeft", Pri: 40, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "SleeveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossSleeveLeft"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + ]) +}); +AddModel({ + Name: "DressBlouseSleeveRight", + Folder: "Dress", + Parent: "DressBlouseSleeves", + Categories: ["Tops"], + Layers: ToLayerMap([ + { Name: "BlouseArmRight", Layer: "SleeveRight", Pri: 40, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + }, + { Name: "BlouseForeArmRight", Layer: "ForeSleeveRight", Pri: 40, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "SleeveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossSleeveRight"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + }, + { Name: "BlouseShoulderRight", Layer: "UpSleeveRight", Pri: 40, + HideWhenOverridden: true, + InheritColor: "SleeveRight", + Poses: ToMap([...SHOULDERPOSES]), + }, + ]) +}); + + +AddModel({ + Name: "DressBlouseSleeves", + Folder: "Dress", + Parent: "DressBlouse", + TopLevel: true, + Categories: ["Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("DressBlouseSleeveLeft"), + ...GetModelLayers("DressBlouseSleeveRight"), + ]) +}); + +AddModel({ + Name: "DressBlouse", + Folder: "Dress", + Parent: "DressBlouse", + TopLevel: true, + Categories: ["Tops"], + //RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + ...GetModelLayers("DressBlouseSleeveLeft"), + ...GetModelLayers("DressBlouseSleeveRight"), + ...GetModelLayers("DressBlouseBust"), + + ]) +}); + + + + +AddModel({ + Name: "Glasses", + Folder: "Dress", + Parent: "Dress", + TopLevel: true, + Categories: ["Accessories", "Face"], + Layers: ToLayerMap([ + { Name: "Glasses", Layer: "Glasses", Pri: 20, + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "GlassesLens", Layer: "Glasses", Pri: 20.1, + InheritColor: "Lens", + Invariant: true, + NoOverride: true, + TieToLayer: "Glasses", + HideWhenOverridden: true, + }, + ]) +}); + +AddModel({ + Name: "Sunglasses", + Folder: "Shades", + Parent: "Suit", + TopLevel: true, + Categories: ["Accessories", "Face"], + Layers: ToLayerMap([ + { Name: "Glasses", Layer: "Glasses", Pri: 15, + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "GlassesLens", Layer: "Glasses", Pri: 15.1, + InheritColor: "Lens", + Invariant: true, + NoOverride: true, + TieToLayer: "Glasses", + HideWhenOverridden: true, + }, + ]) +}); + +AddModel({ + Name: "MonocleLeft", + Folder: "Dress", + Parent: "Glasses", + TopLevel: false, + Categories: ["Accessories", "Face"], + Layers: ToLayerMap([ + { Name: "MonocleLeft", Layer: "Glasses", Pri: 25, + Invariant: true, + NoOverride: true, + }, + { Name: "MonocleLensLeft", Layer: "Glasses", Pri: 25.1, + InheritColor: "LensLeft", + Invariant: true, + NoOverride: true, + TieToLayer: "Glasses", + }, + ]) +}); +AddModel({ + Name: "MonocleRight", + Folder: "Dress", + Parent: "Glasses", + TopLevel: false, + Categories: ["Accessories", "Face"], + Layers: ToLayerMap([ + { Name: "MonocleRight", Layer: "Glasses", Pri: 25, + Invariant: true, + NoOverride: true, + }, + { Name: "MonocleLensRight", Layer: "Glasses", Pri: 25.1, + InheritColor: "LensRight", + Invariant: true, + NoOverride: true, + TieToLayer: "Glasses", + }, + ]) +}); + + +AddModel({ + Name: "DressShoes", + Folder: "Dress", + Parent: "Dress", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + ...GetModelLayers("MaidShoes", undefined, undefined, undefined, -1), + ]) +}); + + +AddModel({ + Name: "Dress", + Folder: "Dress", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("DressSkirt"), + ...GetModelLayers("DressBlouse"), + ...GetModelLayers("LacePanties"), + ...GetModelLayers("LaceCorset"), + ...GetModelLayers("LaceBra"), + ]) +}); + + +AddModel({ + Name: "MageSkirt", + Folder: "Dress", + Parent: "Mage", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "MageSkirt", Layer: "Skirt", Pri: 13, + Poses: ToMap([...LEGPOSES]), + NoOverride: true, + //HideWhenOverridden: true, + //swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "Band", Layer: "Skirt", Pri: 13.1, + TieToLayer: "MageSkirt", + NoOverride: true, + Poses: ToMap([...LEGPOSES]), + //HideWhenOverridden: true, + ////swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + }, + { Name: "MageSkirtOver", Layer: "SkirtOver", Pri: 9, + Poses: ToMap([...KNEELPOSES]), + //RequirePoses: ToMap(["CrotchStrap"]), + TieToLayer: "MageSkirt", NoOverride: true, + InheritColor: "Skirt", + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "MageCorset", + Folder: "Dress", + Parent: "MageTop", + TopLevel: true, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + { Name: "MageCorset", Layer: "Bustier", Pri: 2.1, + Invariant: true, + InheritColor: "Base", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + }, + { Name: "MageCorsetStripes", Layer: "Bustier", Pri: 2, + Invariant: true, + TieToLayer: "MageCorset", + NoOverride: true, + InheritColor: "Stripes", + }, + ]) +}); + +AddModel({ + Name: "MageBra", + Folder: "Dress", + TopLevel: true, + Parent: "MageTop", + Categories: ["Bras"], + Layers: ToLayerMap([ + { Name: "MageBra", Layer: "BraChest", Pri: 7.1, + Invariant: true, + InheritColor: "BraBase", + }, + { Name: "MageBraStripes", Layer: "BraChest", Pri: 7, + Invariant: true, + TieToLayer: "MageBra", + NoOverride: true, + InheritColor: "BraStripes", + }, + ]) +}); + + +AddModel({ + Name: "MageTop", + Folder: "Dress", + TopLevel: true, + Parent: "Mage", + Categories: ["Tops"], + Layers: ToLayerMap([ + { Name: "MageBra", Layer: "SuitChestOver", Pri: 20.1, + Invariant: true, + InheritColor: "BraBase", + }, + { Name: "MageBraStripes", Layer: "SuitChestOver", Pri: 20, + Invariant: true, + TieToLayer: "MageBra", + NoOverride: true, + InheritColor: "BraStripes", + }, + { Name: "MageCorset", Layer: "Corset", Pri: -10, + Invariant: true, + InheritColor: "Base", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + }, + { Name: "MageCorsetStripes", Layer: "Corset", Pri: -10.1, + Invariant: true, + TieToLayer: "MageCorset", + NoOverride: true, + InheritColor: "Stripes", + }, + ]) +}); + + +AddModel({ + Name: "MageCollar", + Folder: "Dress", + Parent: "MageTop", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "MageCollar", Layer: "NecklaceCharm", Pri: 20.1, + Invariant: true, + InheritColor: "BaseMetal", + }, + { Name: "MageCollarCrystal", Layer: "NecklaceCharm", Pri: 20, + Invariant: true, + TieToLayer: "MageCollar", + NoOverride: true, + InheritColor: "Crystal", + }, + { Name: "MageCollarHardware", Layer: "NecklaceCharm", Pri: 20, + Invariant: true, + TieToLayer: "MageCollar", + NoOverride: true, + InheritColor: "Hardware", + }, + ]) +}); +AddModel({ + Name: "MageCollar2", + Folder: "Dress", + Parent: "MageCollar", + TopLevel: false, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("MageCollar"), + { Name: "MageCollarTie", Layer: "NecklaceCharm", Pri: 19.9, + Invariant: true, + TieToLayer: "MageCollar", + NoOverride: true, + InheritColor: "Tie", + }, + ]) +}); + + + + +AddModel({ + Name: "Mage", + Folder: "Dress", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("MageTop"), + ...GetModelLayers("MageSkirt"), + ...GetModelLayers("MageCollar2"), + ]) +}); + + +AddModel({ + Name: "ChineseDress", + Folder: "China", + Parent: "ChineseDress", + TopLevel: true, + Categories: ["Tops", "Uniforms"], + //RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "Dress", Layer: "Shirt", Pri: 1, + InheritColor: "Dress", + //HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + HidePoses: ToMap(["EncaseTorsoUpper"]), + //MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel",}, + }, + { Name: "Bra", Layer: "ShirtChest", Pri: 1, + InheritColor: "Top", + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + HidePoses: ToMap(["EncaseTorsoUpper"]), + }, + { Name: "Highlights", Layer: "ShirtChest", Pri: 1.1, + InheritColor: "Highlights", + TieToLayer: "Bra", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + HidePoses: ToMap(["EncaseTorsoUpper"]), + }, + { Name: "DressSkirt", Layer: "Skirt", Pri: -10, + //NoOverride: true, + //InheritColor: "Skirt", + //HideWhenOverridden: true, + AppendPose: {Hogtie: "CrotchStrap", CrotchStrap: "CrotchStrap"}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Closed: "Closed",}, + HidePoses: ToMap(["EncaseTorsoLower"]), + }, + { Name: "DressSkirtOverKneel", Layer: "Skirt", Pri: -10, + Poses: ToMap([...KNEELPOSES]), + Invariant: true, + InheritColor: "DressSkirt", + NoOverride: true, + //NoOverride: true, + TieToLayer: "DressSkirt", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + HidePoses: ToMap(["EncaseTorsoLower"]), + }, + ]) +}); + + + +AddModel({ + Name: "ChineseBra", + Folder: "China", + Parent: "ChineseDress", + TopLevel: true, + Categories: ["Bras"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "Bra", Layer: "BraChest", Pri: 1, + InheritColor: "Top", + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + }, + { Name: "Highlights", Layer: "BraChest", Pri: 1.1, + InheritColor: "Highlights", + TieToLayer: "Bra", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + }, + + ]) +}); + +AddModel({ + Name: "ChineseTop", + Folder: "China", + Parent: "ChineseDress", + TopLevel: false, + Categories: ["Tops"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "Bra", Layer: "ShirtChest", Pri: 1, + InheritColor: "Top", + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + }, + { Name: "Highlights", Layer: "ShirtChest", Pri: 1.1, + InheritColor: "Highlights", + TieToLayer: "Bra", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + }, + + ]) +}); + + + + +AddModel({ + Name: "BindingDress", + Folder: "Dress", + Parent: "Dress", + TopLevel: true, + Categories: ["Restraints"], + //AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + //...GetModelLayers("LaceCorset"), + ...GetModelLayers("DressSkirtSplit"), + ...GetModelLayers("LacePanties"), + ...GetModelLayers("MageTop"), + ...GetModelLayers("MageCollar2"), + + + ]) +}); diff --git a/Data/ModelList_Elf.ts b/Data/ModelList_Elf.ts new file mode 100644 index 000000000..f32516459 --- /dev/null +++ b/Data/ModelList_Elf.ts @@ -0,0 +1,283 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "ElfPanties", + Folder: "Elf", + Parent: "Elf", + TopLevel: true, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + { Name: "Panties", Layer: "Panties", Pri: -30, + Invariant: true, + //swaplayerpose: {Kneel: "PantiesLower", KneelClosed: "PantiesLower"}, + }, + ]) +}); +AddModel({ + Name: "ElfTop", + Folder: "Elf", + Parent: "Elf", + TopLevel: true, + Categories: ["Underwear", "Panties", "Tops"], + Layers: ToLayerMap([ + { Name: "Chest", Layer: "ShirtChest", Pri: 30, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + InheritColor: "Cloth", + EraseAmount: 100, + EraseSprite: "LaceChest", + EraseLayers: ToMap(["ShirtCutoffBra"]), + }, + { Name: "Bra", Layer: "Shirt", Pri: 30, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + InheritColor: "Cloth", + }, + ]) +}); +AddModel({ + Name: "ElfBra", + Folder: "Elf", + Parent: "ElfTop", + TopLevel: false, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + { Name: "Chest", Layer: "BraChest", Pri: 30, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + InheritColor: "Cloth", + }, + { Name: "Bra", Layer: "Bra", Pri: 30, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + InheritColor: "Cloth", + }, + ]) +}); + +AddModel({ + Name: "ElfCollar", + Folder: "Elf", + Parent: "Elf", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Collar", Layer: "Collar", Pri: 15, + Invariant: true, + HideWhenOverridden: true, + }, + + { Name: "CollarHardware", Layer: "CollarRing", Pri: -5, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "Collar", + NoOverride: true, + HidePoses: {HideModuleMiddle: true}, + RequirePoses: {Leash: true}, + }, + ]) +}); + +AddModel({ + Name: "ElfCollarRestraint", + Folder: "Elf", + Parent: "Elf", + TopLevel: true, + Restraint: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Collar", Layer: "Collar", Pri: -10, + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "CollarHardware", Layer: "CollarRing", Pri: -5, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "Collar", + NoOverride: true, + HidePoses: {HideModuleMiddle: true}, + }, + ]) +}); + + +AddModel({ + Name: "ElfCirclet", + Folder: "Elf", + Parent: "Elf", + TopLevel: true, + Categories: ["Accessories", "Hairstyles"], + Layers: ToLayerMap([ + { Name: "Circlet", Layer: "Circlet", Pri: 20, + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "Gem", Layer: "Circlet", Pri: 20.1, + Sprite: "CircletGem", + Invariant: true, + NoOverride: true, + TieToLayer: "Circlet", + HideWhenOverridden: true, + }, + ]) +}); + +AddModel({ + Name: "ElfSkirtBack", + Folder: "Elf", + Parent: "ElfSkirt", + TopLevel: false, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "SkirtBack", Layer: "SkirtBack", Pri: -100, + Invariant: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + }, + ]) +}); + +AddModel({ + Name: "ElfSkirt", + Folder: "Elf", + Parent: "Elf", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "Skirt", Pri: 100, + //swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + Invariant: true, + HideWhenOverridden: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + HidePoses: {"SkimpyLower": true}, + }, + { Name: "SkirtBand", Layer: "Skirt", Pri: 99.9, + Invariant: true, + TieToLayer: "Skirt", NoOverride: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + }, + { Name: "SkirtBack", Layer: "SkirtBack", Pri: -100, + Invariant: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + TieToLayer: "Skirt", NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + }, + ]) +}); + + +AddModel({ + Name: "Sandals", + Folder: "Elf", + Parent: "Elf", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + ...GetModelLayers("MaidShoes", undefined, undefined, undefined, -7), + ]) +}); + +AddModel({ + Name: "ElfShoes", + Folder: "Elf", + Parent: "Sandals", + TopLevel: false, + Categories: ["Shoes"], + Layers: ToLayerMap([ + ...GetModelLayers("Sandals", undefined, undefined, undefined, -7), + { Name: "CrystalShoeLeft", Layer: "ShoeLeft", Pri: -6, + Poses: ToMap(["Closed", "Spread"]), + HideWhenOverridden: true, + TieToLayer: "ShoeLeft", NoOverride: true, + }, + { Name: "CrystalShoeRight", Layer: "ShoeRight", Pri: 6, + Poses: ToMap(["Closed", "Spread"]), + HideWhenOverridden: true, + TieToLayer: "ShoeRight", NoOverride: true, + }, + ]) +}); + + + +AddModel({ + Name: "ElfBandLeft", + Folder: "Elf", + TopLevel: false, + Parent: "ShacklesArms", + Categories: ["Accessories"], + AddPose: ["ElbowLeft"], + Layers: ToLayerMap([ + { Name: "BandLeft", Layer: "BindElbowLeft", Pri: -100, + Poses: ToMap([...ARMPOSES]), + SwapLayerPose: {Front: "BindForeElbowLeft", Crossed: "BindCrossElbowLeft", Up: "BindForeElbowLeft"}, + DisplacementSprite: "ElbowCuffLeft", + DisplaceLayers: ToMap(["Cuffs"]), + DisplaceAmount: 50, + }, + ]) +}); +AddModel({ + Name: "ElfBandRight", + Folder: "Elf", + TopLevel: false, + Parent: "ShacklesArms", + Categories: ["Accessories"], + AddPose: ["ElbowRight"], + Layers: ToLayerMap([ + { Name: "BandRight", Layer: "BindElbowRight", Pri: -100, + Poses: ToMap([...ARMPOSES]), + SwapLayerPose: {Front: "BindForeElbowRight", Crossed: "BindCrossElbowRight", Up: "BindForeElbowRight"}, + MorphPoses: {Crossed: "Front", Front: "Front"}, + DisplacementSprite: "ElbowCuffRight", + DisplaceLayers: ToMap(["Cuffs"]), + DisplaceAmount: 100, + }, + ]) +}); + +AddModel({ + Name: "ElfBands", + Folder: "Elf", + TopLevel: true, + Parent: "Elf", + Categories: ["Accessories"], + AddPose: ["ElbowLeft", "ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ElfBandLeft"), + ...GetModelLayers("ElfBandRight"), + ]) +}); + + + +AddModel({ + Name: "Elf", + Folder: "Elf", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("ElfSkirt"), + ...GetModelLayers("ElfTop"), + ...GetModelLayers("ElfBands"), + ...GetModelLayers("ElfCirclet"), + ...GetModelLayers("ElfShoes"), + ...GetModelLayers("ElfPanties"), + ...GetModelLayers("ElfCollar"), + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Furniture.ts b/Data/ModelList_Furniture.ts new file mode 100644 index 000000000..cb05c8b5a --- /dev/null +++ b/Data/ModelList_Furniture.ts @@ -0,0 +1,274 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "Cage", + Folder: "Furniture", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Cages"], + AddPose: ["Caged", "UprightHogtie", "KneelDown"], + Layers: ToLayerMap([ + { Name: "CageFront", Layer: "FurnitureFront", Pri: 50, + Invariant: true, + }, + { Name: "CageBack", Layer: "FurnitureBack", Pri: -50, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "FutureBox", + Folder: "FutureBox", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Cages"], + AddPose: ["Enclosed", "UprightHogtie", "KneelDown"], + Layers: ToLayerMap([ + { Name: "Rim", Layer: "FurnitureFront", Pri: 20, + Invariant: true, + HidePoses: ToMap(["Sprite"]), + }, + { Name: "Display", Layer: "FurnitureFront", Pri: 20.1, + Invariant: true, + TieToLayer: "Rim", + }, + { Name: "Lock", Layer: "FurnitureFront", Pri: 20.2, + Invariant: true, + TieToLayer: "Rim", + }, + { Name: "Door", Layer: "FurnitureFront", Pri: 20.2, + Invariant: true, + Poses: ToMap(["Menu"]), + }, + { Name: "DoorWindow", Layer: "FurnitureFront", Pri: 20.1, + Invariant: true, + TieToLayer: "Door", + }, + { Name: "DoorNumeral", Layer: "FurnitureFront", Pri: 20.3, + Invariant: true, + TieToLayer: "Door", + }, + { Name: "BackFade", Layer: "FurnitureBack", Pri: -19.9, + Invariant: true, + TieToLayer: "Back", + }, + { Name: "Back", Layer: "FurnitureBack", Pri: -20, + Invariant: true, + EraseSprite: "FutureBox", + EraseLayers: ToMap(["All"]), + EraseAmount: 100, + EraseInvariant: true, + HidePoses: ToMap(["Sprite"]), + }, + ]) +}); + +AddModel({ + Name: "Sarcophagus", + Folder: "Furniture", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Display"], + AddPose: ["Display", "SuspendedHogtie", "LiftKneel", "HideBigProps"], + Layers: ToLayerMap([ + { Name: "SarcoFront", Layer: "FurnitureFront", Pri: 30, + Invariant: true, + EraseSprite: "Sarco", + EraseLayers: ToMap(["All"]), + EraseAmount: 100, + EraseInvariant: true, + }, + { Name: "SarcoWebs", Layer: "FurnitureBack", Pri: -30, + Invariant: true, + }, + { Name: "SarcoBack", Layer: "FurnitureBack", Pri: -50, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "Bed", + Folder: "Furniture", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Display"], + AddPose: ["Display", "LiftKneel"], + Layers: ToLayerMap([ + { Name: "Bed", Layer: "FurnitureBackLinked", Pri: -100, + Invariant: true, + MorphPoses: {UprightHogtie: "", SuspendedHogtie: "", Hogtie: "Hogtie"} + }, + ]) +}); + + +AddModel({ + Name: "BondageBed", + Folder: "Furniture", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Display"], + AddPose: ["Display", "LiftKneel", "HandsBehind"], + Layers: ToLayerMap([ + ...GetModelLayers("Bed"), + + { Name: "BedStraps", Layer: "FurnitureLinked", Pri: 20, + Invariant: true, + TieToLayer: "Bed", + HidePoses: {Hogtie: true}, + }, + { Name: "BedStrapsHogtie", Layer: "FurnitureLinked", Pri: 20, + Invariant: true, + TieToLayer: "Bed", + Poses: {Hogtie: true}, + MorphPoses: {Boxtie: "Boxtie", Front: "Boxtie", Crossed: "Boxtie", + UprightHogtie: "", SuspendedHogtie: ""}, + DisplacementSprite: "BedStrapsHogtie", + DisplaceLayers: ToMap(["Ribbon1"]), + DisplacementMorph: {Boxtie: "Boxtie", Front: "Boxtie", Crossed: "Boxtie"}, + DisplaceAmount: 100, + DisplacementInvariant: true, + }, + ]) +}); + +AddModel({ + Name: "LatexCube", + Folder: "Furniture", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Latex"], + AddPose: ["UprightHogtie", "ForceKneel"], + Layers: ToLayerMap([ + { Name: "LatexCube", Layer: "FurnitureFront", Pri: -40, + Invariant: true, + }, + { Name: "LatexCubeBack", Layer: "FurnitureBack", Pri: 40, + Invariant: true, + }, + ]) +}); + + + +AddModel({ + Name: "CrystalEncase", + Folder: "Crystal", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Crystal"], + AddPose: ["SuspendedHogtie"], + Layers: ToLayerMap([ + { Name: "EncaseOver", Layer: "FurnitureFront", Pri: -40, + Invariant: true, + EraseSprite: "CrystalErase", + EraseLayers: ToMap(["All"]), + EraseAmount: 100, + EraseInvariant: true, + + }, + { Name: "EncaseUnder", Layer: "FurnitureBack", Pri: 40, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "Barrel", + Folder: "Furniture", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture"], + AddPose: ["UprightHogtie", "ForceKneel"], + Layers: ToLayerMap([ + { Name: "Barrel", Layer: "FurnitureBack", Pri: 80, + Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "DisplayStand", + Folder: "Furniture", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Stands"], + AddPose: ["SuspendedHogtie", "BlockKneel", "ForceStand", "FeetLinked", "HideBigProps"], + Layers: ToLayerMap([ + { Name: "DisplayFront", Layer: "FurnitureFront", Pri: -50, + Invariant: true, + MorphPoses: {Hogtie: "Hogtie"}, + }, + ]) +}); + +AddModel({ + Name: "OneBarPrison", + Folder: "Furniture", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Stands"], + AddPose: ["SuspendedHogtie", "ForceStand"], + Layers: ToLayerMap([ + { Name: "OneBarTop", Layer: "WrappingTorsoUnder", Pri: -249, + Poses: ToMap(["Closed", "Spread"]), + RequirePoses: ToMap(["ChastityBelts"]), + AppendPose: {Ballet: "Heels"}, + NoOverride: true, + }, + { Name: "OneBarFront", Layer: "Torso", Pri: -50, + Poses: ToMap(["Closed", "Spread"]), + AppendPose: {Ballet: "Heels"}, + }, + { Name: "OneBarBack", Layer: "FurnitureBack", Pri: 50, + Poses: ToMap(["Closed", "Spread"]), + AppendPose: {Ballet: "Heels"}, + }, + ]) +}); + + +AddModel({ + Name: "OneBarPrisonLatex", + Folder: "Furniture", + TopLevel: true, + Group: "Devices", + Restraint: true, + Categories: ["Restraints","Furniture", "Stands"], + AddPose: ["SuspendedHogtie", "ForceStand"], + Filters: {"OneBarTop":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.3333333333333333,"green":0.7450980392156863,"blue":1.6666666666666667,"alpha":1},"OneBarFront":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.3333333333333333,"green":0.7450980392156863,"blue":1.6666666666666667,"alpha":1},"OneBarBack":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.3333333333333333,"green":0.7450980392156863,"blue":1.6666666666666667,"alpha":1}}, + Layers: ToLayerMap([ + { Name: "OneBarTop", Layer: "WrappingTorsoUnder", Pri: -249, + Poses: ToMap(["Closed", "Spread"]), + AppendPose: {Ballet: "Heels"}, + NoOverride: true, + }, + { Name: "OneBarFront", Layer: "Torso", Pri: -50, + Poses: ToMap(["Closed", "Spread"]), + AppendPose: {Ballet: "Heels"}, + }, + { Name: "OneBarBack", Layer: "FurnitureBack", Pri: 50, + Poses: ToMap(["Closed", "Spread"]), + AppendPose: {Ballet: "Heels"}, + }, + ]) +}); diff --git a/Data/ModelList_Gags.ts b/Data/ModelList_Gags.ts new file mode 100644 index 000000000..ebf924b14 --- /dev/null +++ b/Data/ModelList_Gags.ts @@ -0,0 +1,1693 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "MaidGag", + Folder: "GagFrilly", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "FrillyPanel", Layer: "Gag", Pri: 13, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Panel", + }, + { Name: "FrillyStraps", Layer: "GagStraps", Pri: 16, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Straps", + }, + { Name: "FrillyHardware", Layer: "GagStraps", Pri: 14, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Hardware", + }, + { Name: "FrillyHighlights", Layer: "GagStraps", Pri: 14, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Highlights", + }, + ]) +}); +AddModel(GetModelFashionVersion("MaidGag", true)); + +AddModel({ + Name: "DusterGag", + Folder: "GagFrilly", + TopLevel: false, + Group: "Mouth", + Parent: "MaidGag", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceGag", "StuffMouth"], + Layers: ToLayerMap([ + ...GetModelLayers("MaidGag"), + { Name: "Duster", Layer: "MouthProp", Pri: 15, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "GhostGag", + Folder: "GagLeather", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth", "FaceGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Ball", Layer: "Gag", Pri: -50, + Sprite: "GhostBall", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + { Name: "Strap", Layer: "GagStraps", Pri: -50, + Sprite: "GhostBallStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); +AddModel(GetModelFashionVersion("DusterGag", true)); + +AddModel({ + Name: "BallGag", + Folder: "GagLeather", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth", "FaceGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Ball", Layer: "Gag", Pri: 1, + Sprite: "Ball", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Ball", + AppendPose: {"2Fang": "2Fang", Fang: "Fang"}, + MorphPoses: {MouthNeutral: "_TeethDeep", MouthSurprised: "_Teeth", MouthPout: "_TeethDeep", MouthDistracted: "_Teeth"}, + }, + { Name: "BallTeeth", Layer: "Gag", Pri: 1.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + TieToLayer: "Ball", + AppendPose: {"2Fang": "2Fang", Fang: "Fang"}, + Poses: {MouthNeutral: true, MouthSurprised: true, MouthPout: true, MouthDistracted: true}, + MorphPoses: {MouthNeutral: "_TeethDeep", MouthSurprised: "_Teeth", MouthPout: "_TeethDeep", MouthDistracted: "_Teeth"}, + }, + { Name: "Strap", Layer: "GagStraps", Pri: 15, + Sprite: "BallStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); +AddModel(GetModelWithExtraLayers("BallGagHarness", "BallGag", [ + { Name: "Harness", Layer: "GagStraps", Pri: 10, + Sprite: "BallHarness", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "BallGag", false)); +AddModel(GetModelWithExtraLayers("BallGagHarnessSecure", "BallGagHarness", [ + { Name: "SideStrap", Layer: "GagStraps", Pri: 20, + Sprite: "BallSideStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "BallGag", false)); +AddModel(GetModelFashionVersion("BallGag", true)); +AddModel(GetModelFashionVersion("BallGagHarness", true)); +AddModel(GetModelFashionVersion("BallGagHarnessSecure", true)); + + +AddModel({ + Name: "LargeBallGag", + Folder: "GagLeather", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth", "FaceBigGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Ball", Layer: "Gag", Pri: 1, + Sprite: "BigBall", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + AppendPose: {"2Fang": "2Fang", Fang: "Fang"}, + InheritColor: "Ball", + }, + { Name: "BigBallTeethFang", Layer: "Gag", Pri: 1.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "BallTeeth", + AppendPose: {"2Fang": "2"}, + Poses: {Fang: true, "2Fang": true}, + }, + { Name: "Strap", Layer: "GagStraps", Pri: 13, + Sprite: "BigBallStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); +AddModel(GetModelWithExtraLayers("LargeBallGagHarness", "LargeBallGag", [ + { Name: "Harness", Layer: "GagStraps", Pri: 15, + Sprite: "BallHarness", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + AppendPose: {FaceBigGag: "Large"}, + }, +], "LargeBallGag", false)); +AddModel(GetModelWithExtraLayers("LargeBallGagHarnessSecure", "LargeBallGagHarness", [ + { Name: "SideStrap", Layer: "GagStraps", Pri: 20, + Sprite: "BallSideStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "LargeBallGag", false)); + + +AddModel({ + Name: "CrystalBallGag", + Folder: "GagLeather", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth", "FaceBigGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Ball", Layer: "Gag", Pri: 2, + Sprite: "CrystalBall", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Ball", + }, + { Name: "Strap", Layer: "GagStraps", Pri: 13, + Sprite: "BigBallStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "CrystalBallGagSmooth", + Folder: "GagLeather", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth", "FaceBigGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Ball", Layer: "Gag", Pri: 2, + Sprite: "CrystalBall", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Ball", + }, + { Name: "Strap", Layer: "GagStraps", Pri: 13, + Sprite: "BigBallStrap", + Folder: "GagMetal", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "PanelGag", + Folder: "GagLeather", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceCoverGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Panel", Layer: "GagFlat", Pri: 5, + Sprite: "Panel", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + { Name: "Strap", Layer: "GagStraps", Pri: 17, + Sprite: "BallStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); +AddModel(GetModelWithExtraLayers("PanelGagHarness", "PanelGag", [ + { Name: "Harness", Layer: "GagFlatStraps", Pri: 19, + Sprite: "PanelHarness", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "PanelGag", false)); +AddModel(GetModelWithExtraLayers("PanelGagHarnessSecure", "PanelGagHarness", [ + { Name: "SideStrap", Layer: "GagFlatStraps", Pri: 21, + Sprite: "PanelSideStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "PanelGag", false)); +AddModel(GetModelFashionVersion("PanelGag", true)); +AddModel(GetModelFashionVersion("PanelGagHarness", true)); +AddModel(GetModelFashionVersion("PanelGagHarnessSecure", true)); + + +AddModel({ + Name: "MuzzleGag", + Folder: "GagLeather", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceCoverGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Muzzle", Layer: "GagMuzzle", Pri: 3, + Sprite: "Muzzle", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + { Name: "Strap", Layer: "GagMuzzleStraps", Pri: 15, + Sprite: "MuzzleStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("MuzzleGagHarness", "MuzzleGag", [ + { Name: "Harness", Layer: "GagMuzzleStraps", Pri: 18, + Sprite: "MuzzleHarness", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "MuzzleGag", false)); +AddModel(GetModelWithExtraLayers("MuzzleGagHarnessSecure", "MuzzleGagHarness", [ + { Name: "SideStrap", Layer: "GagMuzzleStraps", Pri: 22, + Sprite: "MuzzleSideStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "MuzzleGag", false)); +AddModel(GetModelFashionVersion("MuzzleGag", true)); +AddModel(GetModelFashionVersion("MuzzleGagHarness", true)); +AddModel(GetModelFashionVersion("MuzzleGagHarnessSecure", true)); + + + +AddModel({ + Name: "PlugGagPlug", + Folder: "Dummy", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: [], + Layers: ToLayerMap([ + { Name: "Plug", Layer: "GagMuzzle", Pri: 14, + Sprite: "Plug", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("PlugMuzzleGag", "MuzzleGag", [ + ...GetModelLayers("PlugGagPlug"), +], "MuzzleGag", false)); +AddModel(GetModelWithExtraLayers("PlugMuzzleGagHarness", "MuzzleGagHarness", [ + ...GetModelLayers("PlugGagPlug"), +], "MuzzleGag", false)); +AddModel(GetModelWithExtraLayers("PlugMuzzleGagHarnessSecure", "MuzzleGagHarnessSecure", [ + ...GetModelLayers("PlugGagPlug"), +], "MuzzleGag", false)); + + +AddModel(GetModelWithExtraLayers("PlugPanelGag", "PanelGag", [ + ...GetModelLayers("PlugGagPlug"), +], "PanelGag", false)); +AddModel(GetModelWithExtraLayers("PlugPanelGagHarness", "PanelGagHarness", [ + ...GetModelLayers("PlugGagPlug"), +], "PanelGag", false)); +AddModel(GetModelWithExtraLayers("PlugPanelGagHarnessSecure", "PanelGagHarnessSecure", [ + ...GetModelLayers("PlugGagPlug"), +], "PanelGag", false)); + +AddModel(GetModelFashionVersion("PlugMuzzleGag", true)); +AddModel(GetModelFashionVersion("PlugMuzzleGagHarness", true)); +AddModel(GetModelFashionVersion("PlugMuzzleGagHarnessSecure", true)); +AddModel(GetModelFashionVersion("PlugPanelGag", true)); +AddModel(GetModelFashionVersion("PlugPanelGagHarness", true)); +AddModel(GetModelFashionVersion("PlugPanelGagHarnessSecure", true)); + + + +AddModel({ + Name: "Stuffing", + Folder: "GagTape", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["StuffMouth", "FaceGag"], + Layers: ToLayerMap([ + { Name: "Stuffing", Layer: "GagUnder", Pri: -100, + HidePoses: ToMap(["HideMouth"]), + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "TapeFull", + Folder: "GagTape", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "Full", Layer: "GagMuzzle", Pri: -50, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Tape", + }, + ]) +}); + +AddModel({ + Name: "TapeWrap", + Folder: "GagTape", + TopLevel: false, + Parent: "TapeFull", + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + Layers: ToLayerMap([ + { Name: "Wrap", Layer: "GagFlat", Pri: -50, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Tape", + }, + ]) +}); + + +AddModel({ + Name: "TapeFullOver", + Folder: "GagTape", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "Full", Layer: "GagOver", Pri: -50, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Tape", + }, + ]) +}); + +AddModel({ + Name: "TapeWrapOver", + Folder: "GagTape", + TopLevel: false, + Parent: "TapeFull", + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + Layers: ToLayerMap([ + { Name: "Wrap", Layer: "GagOver", Pri: -45, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Tape", + }, + ]) +}); + +AddModel({ + Name: "TapeCleave", + Folder: "GagTape", + TopLevel: false, + Parent: "TapeFull", + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth"], + Layers: ToLayerMap([ + { Name: "Cleave", Layer: "Gag", Pri: -100, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Tape", + }, + ]) +}); +AddModel(GetModelFashionVersion("TapeCleave", true)); + + + +AddModel({ + Name: "ClothCleave", + Folder: "GagCloth", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth"], + Layers: ToLayerMap([ + { Name: "Cleave", Layer: "Gag", Pri: -25, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Cloth", + }, + ]) +}); +AddModel({ + Name: "ClothCleaveThick", + Folder: "GagCloth", + TopLevel: false, + Parent: "ClothCleave", + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth", "StuffMouth", "FaceGag"], + Layers: ToLayerMap([ + { Name: "CleaveThick", Layer: "Gag", Pri: -20, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Cloth", + }, + ]) +}); + +AddModel({ + Name: "ClothKnot", + Folder: "GagCloth", + TopLevel: false, + Parent: "ClothCleave", + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth", "StuffMouth", "FaceGag"], + Layers: ToLayerMap([ + { Name: "Knot", Layer: "Gag", Pri: 0, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Cloth", + }, + ]) +}); + +AddModel({ + Name: "ClothOTN", + Folder: "GagCloth", + TopLevel: false, + Parent: "ClothCleave", + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "OTN", Layer: "GagMuzzle", Pri: -30, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Cloth", + }, + ]) +}); + +AddModel({ + Name: "ClothOTM", + Folder: "GagCloth", + TopLevel: false, + Parent: "ClothCleave", + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "OTM", Layer: "GagFlat", Pri: -1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Cloth", + }, + ]) +}); +AddModel(GetModelFashionVersion("ClothKnot", true)); +AddModel(GetModelFashionVersion("ClothCleaveThick", true)); +AddModel(GetModelFashionVersion("ClothCleave", true)); +AddModel(GetModelFashionVersion("ClothOTN", true)); +AddModel(GetModelFashionVersion("ClothOTM", true)); + +AddModel({ + Name: "GagLatex", + Folder: "GagLatex", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags","Latex"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "OTN", Layer: "GagFlat", Pri: 20, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Latex", + AppendPose: {StuffMouth: "Flat"} + }, + ]) +}); + + + +AddModel({ + Name: "GagLatexFlat", + Folder: "GagLatex", + Parent: "GagLatex", + TopLevel: false, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags","Latex"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "OTNFlat", Layer: "GagFlat", Pri: 30, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Latex", + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("GagLatexFlatHarness", "GagLatexFlat", [ + { Name: "Harness", Layer: "GagFlatStraps", Pri: 19, + Sprite: "Harness", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "GagLatex", false)); +AddModel(GetModelWithExtraLayers("GagLatexFlatHarnessSecure", "GagLatexFlatHarness", [ + { Name: "SideStrap", Layer: "GagFlatStraps", Pri: 21, + Sprite: "SideStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "GagLatex", false)); + + +AddModel({ + Name: "GagLatexMute", + Folder: "GagLatex", + Parent: "GagLatex", + TopLevel: false, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags","Latex"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "OTNFlat", Layer: "GagFlat", Pri: 30, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Latex", + }, + { Name: "MuteLogo", Layer: "GagFlat", Pri: 30.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, + TieToLayer: "OTNFlat", + InheritColor: "Symbol", + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("GagLatexMuteHarness", "GagLatexMute", [ + { Name: "Harness", Layer: "GagFlatStraps", Pri: 19, + Sprite: "Harness", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "GagLatex", false)); +AddModel(GetModelWithExtraLayers("GagLatexMuteHarnessSecure", "GagLatexMuteHarness", [ + { Name: "SideStrap", Layer: "GagFlatStraps", Pri: 21, + Sprite: "SideStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "GagLatex", false)); + +AddModel(GetModelFashionVersion("GagLatex", true)); +AddModel(GetModelFashionVersion("GagLatexFlat", true)); +AddModel(GetModelFashionVersion("GagLatexFlatHarness", true)); +AddModel(GetModelFashionVersion("GagLatexFlatHarnessSecure", true)); +AddModel(GetModelFashionVersion("GagLatexMute", true)); +AddModel(GetModelFashionVersion("GagLatexMuteHarness", true)); +AddModel(GetModelFashionVersion("GagLatexMuteHarnessSecure", true)); + +AddModel({ + Name: "GagLatexPlug", + Folder: "GagLatex", + Parent: "GagLatex", + TopLevel: false, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags","Latex"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + ...GetModelLayers("GagLatexFlat"), + { Name: "Plug", Layer: "GagFlatStraps", Pri: 40, + Sprite: "LatexPlug", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("GagLatexPlugHarness", "GagLatexPlug", [ + { Name: "Harness", Layer: "GagFlatStraps", Pri: 19, + Sprite: "Harness", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "GagLatex", false)); +AddModel(GetModelWithExtraLayers("GagLatexPlugHarnessSecure", "GagLatexPlugHarness", [ + { Name: "SideStrap", Layer: "GagFlatStraps", Pri: 21, + Sprite: "SideStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "GagLatex", false)); + +AddModel(GetModelFashionVersion("GagLatexPlug", true)); +AddModel(GetModelFashionVersion("GagLatexPlugHarness", true)); +AddModel(GetModelFashionVersion("GagLatexPlugHarnessSecure", true)); + +AddModel({ + Name: "LatexNeckCorset", + Folder: "GagLatex", + TopLevel: true, + Categories: ["Accessories", "Latex"], + Layers: ToLayerMap([ + { Name: "NeckCorset", Layer: "NeckCorset", Pri: -40, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Neck", + }, + { Name: "NeckCorsetRim", Layer: "NeckCorset", Pri: -40.1, + Invariant: true, + NoOverride: true, + TieToLayer: "NeckCorset", + InheritColor: "Rim", + }, + ]) +}); + +AddModel({ + Name: "LatexNeckCorsetGag", + Folder: "GagLatex", + Parent: "LatexNeckCorset", + TopLevel: false, + Categories: ["Accessories","Gags","Latex"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + ...GetModelLayers("LatexNeckCorset"), + //...GetModelLayers("GagLatexFlat"), + { Name: "OTNFlat", Layer: "GagMuzzle", Pri: -20, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Latex", + }, + ]) +}); + +AddModel(GetModelRestraintVersion("LatexNeckCorset", true)); +AddModel(GetModelRestraintVersion("LatexNeckCorsetGag", true)); + + +AddModel({ + Name: "NeckCorset", + Folder: "GagLatex", + TopLevel: true, + Categories: ["Accessories", "Latex"], + Layers: ToLayerMap([ + { Name: "NeckCorset2", Layer: "NeckCorset", Pri: -35, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Neck", + }, + { Name: "NeckCorsetRim2", Layer: "NeckCorset", Pri: -35.1, + Invariant: true, + NoOverride: true, + TieToLayer: "NeckCorset2", + InheritColor: "Rim", + }, + ]) +}); +AddModel({ + Name: "ShinyLatexMuzzle", + Folder: "GagLatex", + Parent: "NeckCorset", + TopLevel: false, + Categories: ["Accessories","Gags","Latex"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "NeckCorsetGag2", Layer: "GagMuzzle", Pri: -15, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Gag", + }, + { Name: "NeckCorsetGagRim2", Layer: "GagMuzzle", Pri: -15.1, + Invariant: true, + NoOverride: true, + InheritColor: "Rim", + TieToLayer: "NeckCorsetGag2", + }, + ]) +}); + +AddModel({ + Name: "NeckCorsetGag", + Folder: "GagLatex", + Parent: "NeckCorset", + TopLevel: false, + Categories: ["Accessories","Gags","Latex"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + ...GetModelLayers("NeckCorset"), + ...GetModelLayers("ShinyLatexMuzzle"), + ]) +}); + +AddModel(GetModelRestraintVersion("ShinyLatexMuzzle", true)); +AddModel(GetModelRestraintVersion("NeckCorset", true)); +AddModel(GetModelRestraintVersion("NeckCorsetGag", true)); + + + +AddModel({ + Name: "LatexNeckCorsetPlugGag", + Folder: "GagLatex", + Parent: "LatexNeckCorsetRestraint", + TopLevel: false, + Group: "Mouth", + Restraint: true, + Categories: ["Restraint", "Accessories","Gags","Latex"], + AddPose: ["FaceCoverGag"], + AddPoseConditional: { + Xray: ["HideMouth",], + }, + Layers: ToLayerMap([ + ...GetModelLayers("LatexNeckCorsetGag"), + //...GetModelLayers("GagLatexFlat"), + { Name: "Plug", Layer: "GagMuzzleStraps", Pri: 40, + Sprite: "LatexPlug", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, + ]) +}); +AddModel(GetModelFashionVersion("LatexNeckCorsetPlugGag", true)); + + +AddModel({ + Name: "GagMetal", + Folder: "GagMetal", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags","Metal"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "OTN", Layer: "GagFlat", Pri: 30, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Metal", + }, + ]) +}); + +AddModel({ + Name: "GagFabric", + Folder: "GagLeather", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags","Fabric"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "FabricMuzzle", Layer: "GagFlat", Pri: 45, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, + InheritColor: "Fabric", + }, + ]) +}); +AddModel(GetModelFashionVersion("GagFabric", true)); +AddModel(GetModelFashionVersion("GagMetal", true)); + + +AddModel({ + Name: "KittyMuzzle", + Folder: "GagLeather", + TopLevel: false, + Group: "Mouth", + Restraint: true, + Parent: "GagFabric", + Categories: ["Restraints","Gags","Fabric"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + ...GetModelLayers("GagFabric"), + { Name: "KittyMouth", Layer: "GagFlat", Pri: 45.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, + TieToLayer: "FabricMuzzle", + }, + { Name: "Whiskers", Layer: "GagFlat", Pri: 45.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, + TieToLayer: "FabricMuzzle", + }, + ]) +}); +AddModel({ + Name: "KittyHarnessPanelGag", + Folder: "GagLeather", + TopLevel: false, + Group: "Mouth", + Restraint: true, + Parent: "GagFabric", + Categories: ["Restraints","Gags","Fabric"], + AddPose: ["FaceCoverGag"], + Filters: { + Panel: {"gamma":0.9833333333333333,"saturation":1,"contrast":0.8,"brightness":3.1,"red":1,"green":1,"blue":1,"alpha":1}, + Strap: {"gamma":0.8,"saturation":1,"contrast":0.9666666666666667,"brightness":2.7666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + Harness: {"gamma":0.8,"saturation":1,"contrast":0.9666666666666667,"brightness":2.7666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + SideStrap: {"gamma":0.8,"saturation":1,"contrast":0.9666666666666667,"brightness":2.7666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + ...GetModelLayers("PanelGagHarnessSecure"), + { Name: "KittyMouth", Layer: "GagFlat", Pri: 45.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, + TieToLayer: "FabricMuzzle", + }, + ]) +}); +AddModel(GetModelFashionVersion("KittyMuzzle", true)); +AddModel(GetModelFashionVersion("KittyHarnessPanelGag", true)); + + +AddModel({ + Name: "GagComfy", + Folder: "GagLeather", + TopLevel: false, + Group: "Mouth", + Parent: "GagFabric", + Restraint: true, + Categories: ["Restraints","Gags","Fabric"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "FabricMuzzle", Layer: "GagFlat", Pri: 45, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, + InheritColor: "Fabric", + }, + ]) +}); + + + +AddModel({ + Name: "GagMetalRiveted", + Folder: "GagMetal", + Parent: "GagMetal", + TopLevel: false, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags","Metal"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + ...GetModelLayers("GagMetal"), + { Name: "OTNRivets", Layer: "GagFlat", Pri: 30.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Rivets", + TieToLayer: "OTN", + NoOverride: true, + }, + ]) +}); + +AddModel(GetModelFashionVersion("GagMetalRiveted", true)); + + +AddModel({ + Name: "GagMetalRivetedStrap", + Folder: "GagMetal", + Parent: "GagMetal", + TopLevel: false, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags","Metal"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + ...GetModelLayers("GagMetalRiveted"), + { Name: "OTNStrap", Layer: "GagFlat", Pri: 30.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Strap", + TieToLayer: "OTN", + NoOverride: true, + }, + { Name: "OTNStrapRivets", Layer: "GagFlat", Pri: 30.2, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "StrapRivets", + TieToLayer: "OTN", + NoOverride: true, + }, + ]) +}); + +AddModel(GetModelFashionVersion("GagMetalRivetedStrap", true)); + + +AddModel({ + Name: "SmoothBallGag", + Folder: "GagMetal", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth", "FaceGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Ball", Layer: "Gag", Pri: 1, + Sprite: "Ball", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + AppendPose: {"2Fang": "2Fang", Fang: "Fang"}, + MorphPoses: {MouthNeutral: "_TeethDeep", MouthSurprised: "_Teeth", MouthPout: "_TeethDeep", MouthDistracted: "_Teeth"}, + }, + { Name: "BallTeeth", Layer: "Gag", Pri: 1.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + TieToLayer: "Ball", + AppendPose: {"2Fang": "2Fang", Fang: "Fang"}, + Poses: {MouthNeutral: true, MouthSurprised: true, MouthPout: true, MouthDistracted: true}, + MorphPoses: {MouthNeutral: "_TeethDeep", MouthSurprised: "_Teeth", MouthPout: "_TeethDeep", MouthDistracted: "_Teeth"}, + }, + { Name: "Strap", Layer: "GagStraps", Pri: 15, + Sprite: "BallStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); +AddModel(GetModelWithExtraLayers("SmoothBallGagHarness", "SmoothBallGag", [ + { Name: "Harness", Layer: "GagStraps", Pri: 10, + Sprite: "BallHarness", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + AppendPose: {FaceBigGag: "Large"}, + }, +], "SmoothBallGag", false)); +AddModel(GetModelWithExtraLayers("SmoothBallGagHarnessSecure", "SmoothBallGagHarness", [ + { Name: "SideStrap", Layer: "GagStraps", Pri: 20, + Sprite: "BallSideStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SmoothBallGag", false)); + +AddModel(GetModelFashionVersion("SmoothBallGag", true)); + +AddModel({ + Name: "SmoothLargeBallGag", + Folder: "GagMetal", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth", "FaceBigGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Ball", Layer: "Gag", Pri: 3, + Sprite: "BigBall", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + AppendPose: {"2Fang": "2Fang", Fang: "Fang"}, + }, + { Name: "BigBallTeethFang", Layer: "Gag", Pri: 3.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "BallTeeth", + AppendPose: {"2Fang": "2"}, + Poses: {Fang: true, "2Fang": true}, + }, + { Name: "Strap", Layer: "GagStraps", Pri: 15, + Sprite: "BigBallStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("SmoothLargeBallGagHarness", "SmoothLargeBallGag", [ + { Name: "Harness", Layer: "GagStraps", Pri: 17, + Sprite: "BallHarness", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + AppendPose: {FaceBigGag: "Large"}, + }, +], "SmoothLargeBallGag", false)); +AddModel(GetModelWithExtraLayers("SmoothLargeBallGagHarnessSecure", "SmoothLargeBallGagHarness", [ + { Name: "SideStrap", Layer: "GagStraps", Pri: 22, + Sprite: "BallSideStrap", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SmoothLargeBallGag", false)); + + +AddModel({ + Name: "SegmentedLargeBallGag", + Folder: "GagMetal", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth", "FaceBigGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Ball", Layer: "Gag", Pri: 2, + Sprite: "BigBall", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + { Name: "Strap", Layer: "GagStraps", Pri: 14, + Sprite: "BigBallStrapSegmented", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("SegmentedLargeBallGagHarness", "SegmentedLargeBallGag", [ + { Name: "Harness", Layer: "GagStraps", Pri: 16, + Sprite: "BallHarnessSegmented", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + AppendPose: {FaceBigGag: "Large"}, + }, +], "SegmentedLargeBallGag", false)); +AddModel(GetModelWithExtraLayers("SegmentedLargeBallGagHarnessSecure", "SegmentedLargeBallGagHarness", [ + { Name: "SideStrap", Layer: "GagStraps", Pri: 21, + Sprite: "BallSideStrapSegmented", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SegmentedLargeBallGag", false)); + +AddModel(GetModelWithExtraLayers("SciFiBallGag", "SegmentedLargeBallGagHarness", [ +{ Name: "TopRim", Layer: "GagStraps", Pri: 21.1, + Sprite: "Rim", + NoOverride: true, + TieToLayer: "Display", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + { Name: "Display", Layer: "GagStraps", Pri: 21, + Sprite: "Display", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], undefined, true)); + +AddModel(GetModelWithExtraLayers("EnhancedSciFiBallGag", "SciFiBallGag", [ + { Name: "Mask", Layer: "GagStraps", Pri: 19, + Sprite: "HarnessMask", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SciFiBallGag", false)); + +AddModel(GetModelWithExtraLayers("AdvancedSciFiBallGag", "EnhancedSciFiBallGag", [ + { Name: "HarnessRim", Layer: "GagStraps", Pri: 21.1, + Sprite: "HarnessRim", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + { Name: "HarnessDisplay", Layer: "GagStraps", Pri: 21, + Sprite: "HarnessDisplay", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SciFiBallGag", false)); + +AddModel(GetModelWithExtraLayers("UltimateSciFiBallGag", "AdvancedSciFiBallGag", [ + + { Name: "Muzzle", Layer: "GagStraps", Pri: 17, + Sprite: "SciFiMuzzle", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SciFiBallGag", false, { + AddPose: ["HideMouth", "StuffMouth", "FaceCoverGag"], +})); +AddModel(GetModelWithExtraLayers("UltimateSciFiBallGag2", "AdvancedSciFiBallGag", [ + + { Name: "Muzzle", Layer: "GagStraps", Pri: 17, + Sprite: "SciFiMuzzle2", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SciFiBallGag", false, { + AddPose: ["HideMouth", "StuffMouth", "FaceCoverGag"], +})); + + + +AddModel({ + Name: "SegmentedLargePanelGag", + Folder: "GagMetal", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceBigGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Panel", Layer: "GagFlatStraps", Pri: 17, + Sprite: "SciFiPanel", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + { Name: "Strap", Layer: "GagFlatStraps", Pri: 14, + Sprite: "BigBallStrapSegmented", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + { Name: "Mask", Layer: "GagFlatStraps", Pri: 19, + Sprite: "HarnessMask", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("SegmentedLargePanelGagHarness", "SegmentedLargePanelGag", [ + { Name: "Harness", Layer: "GagFlatStraps", Pri: 16, + Sprite: "BallHarnessSegmented", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + AppendPose: {FaceBigGag: "Large"}, + }, +], "SegmentedLargePanelGag", false)); +AddModel(GetModelWithExtraLayers("SegmentedLargePanelGagHarnessSecure", "SegmentedLargePanelGagHarness", [ + { Name: "SideStrap", Layer: "GagFlatStraps", Pri: 21, + Sprite: "BallSideStrapSegmented", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SegmentedLargePanelGag", false)); + +AddModel(GetModelWithExtraLayers("SciFiPanelGag", "SegmentedLargePanelGagHarness", [ +{ Name: "TopRim", Layer: "GagFlatStraps", Pri: 21.1, + Sprite: "Rim", + NoOverride: true, + TieToLayer: "Display", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + { Name: "Display", Layer: "GagFlatStraps", Pri: 21, + Sprite: "Display", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], undefined, true)); + +AddModel(GetModelWithExtraLayers("AdvancedSciFiPanelGag", "SciFiPanelGag", [ + { Name: "HarnessRim", Layer: "GagFlatStraps", Pri: 21.1, + Sprite: "HarnessRim", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + { Name: "HarnessDisplay", Layer: "GagFlatStraps", Pri: 21, + Sprite: "HarnessDisplay", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SciFiPanelGag", false)); + +AddModel(GetModelWithExtraLayers("UltimateSciFiPanelGag", "AdvancedSciFiPanelGag", [ + + { Name: "Muzzle", Layer: "GagFlatStraps", Pri: 17, + Sprite: "SciFiMuzzle", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SciFiPanelGag", false, { + AddPose: ["StuffMouth", "FaceCoverGag"], +})); +AddModel(GetModelWithExtraLayers("UltimateSciFiPanelGag2", "AdvancedSciFiPanelGag", [ + + { Name: "Muzzle", Layer: "GagFlatStraps", Pri: 17, + Sprite: "SciFiMuzzle2", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SciFiPanelGag", false, { + AddPose: ["StuffMouth", "FaceCoverGag"], +})); + +AddModel(GetModelFashionVersion("SegmentedLargePanelGag", true)); +AddModel(GetModelFashionVersion("SegmentedLargePanelGagHarness", true)); +AddModel(GetModelFashionVersion("SciFiPanelGag", true)); +AddModel(GetModelFashionVersion("AdvancedSciFiPanelGag", true)); +AddModel(GetModelFashionVersion("UltimateSciFiPanelGag", true)); +AddModel(GetModelFashionVersion("UltimateSciFiPanelGag2", true)); + + + + + +AddModel({ + Name: "SegmentedPlugGag", + Folder: "GagMetal", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["HideMouth", "FaceBigGag", "StuffMouth"], + Layers: ToLayerMap([ + { Name: "Panel", Layer: "GagFlatStraps", Pri: 17, + Sprite: "SciFiPanel", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, + { Name: "Strap", Layer: "GagFlatStraps", Pri: 14, + Sprite: "BigBallStrapSegmented", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, + { Name: "Mask", Layer: "GagFlatStraps", Pri: 19, + Sprite: "HarnessMask", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, + { Name: "Plug", Layer: "GagFlatStraps", Pri: 40, + Sprite: "SciFiPlug", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, + ]) +}); + +AddModel(GetModelFashionVersion("SegmentedPlugGag", true)); + +AddModel(GetModelWithExtraLayers("SegmentedPlugGagHarness", "SegmentedPlugGag", [ + { Name: "Harness", Layer: "GagFlatStraps", Pri: 16, + Sprite: "BallHarnessSegmented", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + AppendPose: {FaceBigGag: "Large"}, + }, +], "SegmentedPlugGag", false)); +AddModel(GetModelWithExtraLayers("SegmentedPlugGagHarnessSecure", "SegmentedPlugGagHarness", [ + { Name: "SideStrap", Layer: "GagFlatStraps", Pri: 21, + Sprite: "BallSideStrapSegmented", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, +], "SegmentedPlugGag", false)); + +AddModel(GetModelWithExtraLayers("SciFiPlugGag", "SegmentedPlugGagHarness", [ +{ Name: "TopRim", Layer: "GagFlatStraps", Pri: 21.1, + Sprite: "Rim", + NoOverride: true, + TieToLayer: "Display", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, + { Name: "Display", Layer: "GagFlatStraps", Pri: 21, + Sprite: "Display", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, +], undefined, true)); + +AddModel(GetModelWithExtraLayers("AdvancedSciFiPlugGag", "SciFiPlugGag", [ + { Name: "HarnessRim", Layer: "GagFlatStraps", Pri: 21.1, + Sprite: "HarnessRim", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, + { Name: "HarnessDisplay", Layer: "GagFlatStraps", Pri: 21, + Sprite: "HarnessDisplay", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, +], "SciFiPlugGag", false)); + +AddModel(GetModelWithExtraLayers("UltimateSciFiPlugGag", "AdvancedSciFiPlugGag", [ + + { Name: "Muzzle", Layer: "GagFlatStraps", Pri: 17, + Sprite: "SciFiMuzzle", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, +], "SciFiPlugGag", false, { + AddPose: ["HideMouth", "StuffMouth", "FaceCoverGag"], +})); +AddModel(GetModelWithExtraLayers("UltimateSciFiPlugGag2", "AdvancedSciFiPlugGag", [ + + { Name: "Muzzle", Layer: "GagFlatStraps", Pri: 17, + Sprite: "SciFiMuzzle2", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + SwapLayerPose: {XrayFace: "GagStraps"}, + }, +], "SciFiPlugGag", false, { + AddPose: ["HideMouth", "StuffMouth", "FaceCoverGag"], +})); + + +AddModel({ + Name: "SimpleSciFiMuzzle", + Folder: "GagMetal", + TopLevel: true, + Parent: "SciFiBallGag", + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { + Name: "HarnessRim", Layer: "GagMuzzleStraps", Pri: 110.1, + Sprite: "HarnessRim", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + TieToLayer: "HarnessDisplay", + NoOverride: true, + }, + { + Name: "HarnessDisplay", Layer: "GagMuzzleStraps", Pri: 110, + Sprite: "HarnessDisplay", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + + { + Name: "Muzzle", Layer: "GagMuzzle", Pri: 110, + Sprite: "SciFiMuzzle", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); +AddModel(GetModelFashionVersion("SimpleSciFiMuzzle", true)); + +AddModel(GetModelWithExtraLayers("AdvancedSciFiMuzzle", "SimpleSciFiMuzzle", [ + { Name: "Mask", Layer: "GagMuzzleStraps", Pri: 19, + Sprite: "HarnessMask", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SimpleSciFiMuzzle", false)); + +AddModel(GetModelFashionVersion("AdvancedSciFiMuzzle", true)); + +AddModel(GetModelWithExtraLayers("SciFiPlugMuzzle", "SimpleSciFiMuzzle", [ + { Name: "Plug", Layer: "GagMuzzleStraps", Pri: 110.1, + Sprite: "SciFiPlug", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, + TieToLayer: "Muzzle", + }, +], "SimpleSciFiMuzzle", false)); +AddModel(GetModelWithExtraLayers("AdvancedSciFiPlugMuzzle", "AdvancedSciFiMuzzle", [ + { Name: "Plug", Layer: "GagMuzzleStraps", Pri: 110.1, + Sprite: "SciFiPlug", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, + TieToLayer: "Muzzle", + }, +], "SimpleSciFiMuzzle", false)); + +AddModel(GetModelFashionVersion("SciFiPlugMuzzle", true)); +AddModel(GetModelFashionVersion("AdvancedSciFiPlugMuzzle", true)); + +// Transparent +AddModel({ + Name: "SimpleSciFiMuzzle2", + Folder: "GagMetal", + TopLevel: false, + Parent: "SimpleSciFiMuzzle", + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { + Name: "HarnessRim", Layer: "GagMuzzleStraps", Pri: 110.1, + Sprite: "HarnessRim", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + TieToLayer: "HarnessDisplay", + NoOverride: true, + }, + { + Name: "HarnessDisplay", Layer: "GagMuzzleStraps", Pri: 110, + Sprite: "HarnessDisplay", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + + { + Name: "Muzzle", Layer: "GagFlatStraps", Pri: 17, + Sprite: "SciFiMuzzle2", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("AdvancedSciFiMuzzle2", "SimpleSciFiMuzzle", [ + { Name: "Mask", Layer: "GagMuzzleStraps", Pri: 100, + Sprite: "HarnessMask", + OffsetX: 942, + OffsetY: 200, + Invariant: true, + }, +], "SimpleSciFiMuzzle", false)); + +AddModel(GetModelFashionVersion("SimpleSciFiMuzzle", true)); +AddModel(GetModelFashionVersion("AdvancedSciFiMuzzle2", true)); + + + + + +AddModel({ + Name: "GagNecklace", + Folder: "GagLeather", + TopLevel: true, + Restraint: true, + Categories: ["Restraints","Accessories"], + Layers: ToLayerMap([ + { Name: "GagNecklaceBall", Layer: "Collar", Pri: 250.1, + Invariant: true, + NoOverride: true, + TieToLayer: "GagNecklace", + InheritColor: "Ball", + }, + { Name: "GagNecklace", Layer: "Collar", Pri: 250, + Invariant: true, + NoOverride: true, + InheritColor: "Strap", + }, + ]) +}); + +AddModel(GetModelFashionVersion("GagNecklace", true)); + + +AddModel({ + Name: "CrystalGagNecklace", + Folder: "GagLeather", + TopLevel: true, + Restraint: true, + Categories: ["Restraints","Accessories"], + Layers: ToLayerMap([ + { Name: "CrystalGagNecklaceBall", Layer: "Collar", Pri: 250.1, + Invariant: true, + NoOverride: true, + TieToLayer: "GagNecklace", + InheritColor: "Ball", + }, + { Name: "GagNecklace", Layer: "Collar", Pri: 250, + Invariant: true, + NoOverride: true, + InheritColor: "Strap", + }, + ]) +}); + +AddModel(GetModelFashionVersion("CrystalGagNecklace", true)); \ No newline at end of file diff --git a/Data/ModelList_Gothic.ts b/Data/ModelList_Gothic.ts new file mode 100644 index 000000000..d2af96384 --- /dev/null +++ b/Data/ModelList_Gothic.ts @@ -0,0 +1,106 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "GothicSkirt", + Folder: "Gothic", + Parent: "GothicSkirt", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "Skirt", Pri: 45, + MorphPoses: {Hogtie: "", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + Poses: ToMap([...LEGPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "WaistbandClips", Layer: "Skirt", Pri: 45.1, + TieToLayer: "Skirt", + NoOverride: true, + Invariant: true, + }, + { Name: "Buttons", Layer: "Skirt", Pri: 45.2, + TieToLayer: "Skirt", + NoOverride: true, + Invariant: true, + }, + { Name: "Lines", Layer: "Skirt", Pri: 45.4, + MorphPoses: {Hogtie: "", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + TieToLayer: "Skirt", + Poses: ToMap([...LEGPOSES]), + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + }, + { Name: "HemLower", Layer: "Skirt", Pri: 45.2, + MorphPoses: {Hogtie: "", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + TieToLayer: "Skirt", + Poses: ToMap([...LEGPOSES]), + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + }, + { Name: "HemLowerBack", Layer: "SkirtBack", Pri: -45.2, + AppendPose: ToMapDupe(["CrotchStrap"]), + TieToLayer: "Skirt", + Poses: ToMap(["Spread"]), + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + InheritColor: "HemLower", + }, + { Name: "HemUpper", Layer: "Skirt", Pri: 45.2, + MorphPoses: {Hogtie: "", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + TieToLayer: "Skirt", + Poses: ToMap([...LEGPOSES]), + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "GothicSkirtLace", + Folder: "Gothic", + Parent: "GothicSkirt", + TopLevel: false, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + ...GetModelLayers("GothicSkirt"), + { Name: "LaceLower", Layer: "Skirt", Pri: 45.3, + MorphPoses: {Hogtie: "", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + TieToLayer: "Skirt", + Poses: ToMap([...LEGPOSES]), + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + }, + { Name: "LaceUpper", Layer: "Skirt", Pri: 45.3, + MorphPoses: {Hogtie: "", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + TieToLayer: "Skirt", + Poses: ToMap([...LEGPOSES]), + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Handcuffs.ts b/Data/ModelList_Handcuffs.ts new file mode 100644 index 000000000..4fef37017 --- /dev/null +++ b/Data/ModelList_Handcuffs.ts @@ -0,0 +1,190 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "Legirons", + Folder: "Handcuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Cuffs", "Legirons"], + AddPose: ["LegCuffed"], + Layers: ToLayerMap([ + { Name: "LegironsLeft", Layer: "AnkleLeft", Pri: 50, + HideWhenOverridden: true, + InheritColor: "BaseMetal", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...ANKLELEFTPOSES]), + }, + { Name: "LegironsRight", Layer: "AnkleRight", Pri: 50, + HideWhenOverridden: true, + InheritColor: "BaseMetal", + Poses: ToMap([...ANKLERIGHTPOSES]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + SwapLayerPose: {Kneel: "AnkleRightKneel"}, + }, + ]) +}); + +AddModel({ + Name: "Irish8Ankle", + Folder: "Handcuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Cuffs", "Legirons"], + AddPose: ["LegCuffed"], + Layers: ToLayerMap([ + { Name: "Irish8AnkleLeft", Layer: "AnkleLeft", Pri: 50, + HideWhenOverridden: true, + InheritColor: "BaseMetal", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + }, + { Name: "Irish8AnkleRight", Layer: "AnkleRight", Pri: 50, + HideWhenOverridden: true, + InheritColor: "BaseMetal", + Poses: ToMap(["Closed"]), + SwapLayerPose: {Kneel: "AnkleRightKneel"}, + }, + ]) +}); + + + +AddModel({ + Name: "HandCuffs", + Folder: "Handcuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Cuffs", "Handcuffs"], + AddPose: ["HandCuffed"], + Layers: ToLayerMap([ + { Name: "CuffsLock", Layer: "BindForeWristLeft", Pri: 40.1, + HideWhenOverridden: true, + NoOverride: true, + TieToLayer: "HandCuffs", + InheritColor: "Lock", + LockLayer: true, + Poses: ToMap(["Front"]), + GlobalDefaultOverride: ToMap(["Front"]), + }, + { Name: "HandCuffs", Layer: "BindForeWristLeft", Pri: 25, + HideWhenOverridden: true, + InheritColor: "BaseMetal", + Poses: ToMap(["Front"]), + GlobalDefaultOverride: ToMap(["Front"]), + }, + ]) +}); + + + +AddModel({ + Name: "HingedCuffs", + Folder: "Handcuffs", + Parent: "HandCuffs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Cuffs", "Handcuffs"], + AddPose: ["HandCuffed"], + Layers: ToLayerMap([ + { Name: "CuffsLock", Layer: "BindForeWristLeft", Pri: 40.1, + HideWhenOverridden: true, + NoOverride: true, + TieToLayer: "HingedCuffs", + InheritColor: "Lock", + LockLayer: true, + Poses: ToMap(["Front"]), + GlobalDefaultOverride: ToMap(["Front"]), + }, + { Name: "HingedCuffs", Layer: "BindForeWristLeft", Pri: 30, + HideWhenOverridden: true, + InheritColor: "BaseMetal", + Poses: ToMap(["Front"]), + GlobalDefaultOverride: ToMap(["Front"]), + }, + ]) +}); +AddModel({ + Name: "Irish8Cuffs", + Folder: "Handcuffs", + Parent: "HandCuffs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Cuffs", "Handcuffs"], + AddPose: ["HandCuffed"], + Layers: ToLayerMap([ + { Name: "CuffsLock", Layer: "BindForeWristLeft", Pri: 40.1, + HideWhenOverridden: true, + NoOverride: true, + TieToLayer: "Irish8Cuffs", + InheritColor: "Lock", + LockLayer: true, + Poses: ToMap(["Front"]), + GlobalDefaultOverride: ToMap(["Front"]), + }, + { Name: "Irish8Cuffs", Layer: "BindForeWristLeft", Pri: 35, + HideWhenOverridden: true, + InheritColor: "BaseMetal", + Poses: ToMap(["Front"]), + GlobalDefaultOverride: ToMap(["Front"]), + }, + ]) +}); + +AddModel({ + Name: "WolfCuffs", + Folder: "Handcuffs", + Parent: "HandCuffs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Cuffs", "Handcuffs"], + AddPose: ["HandCuffed"], + Layers: ToLayerMap([ + /*{ Name: "CuffsLock", Layer: "BindForeWristLeft", Pri: 40.1, + HideWhenOverridden: true, + NoOverride: true, + TieToLayer: "WolfCuffs", + InheritColor: "Lock", + LockLayer: true, + Poses: ToMap(["Front"]), + GlobalDefaultOverride: ToMap(["Front"]), + },*/ + { Name: "WolfCuffs", Layer: "BindForeWristLeft", Pri: 40, + HideWhenOverridden: true, + InheritColor: "BaseMetal", + Poses: ToMap(["Front"]), + GlobalDefaultOverride: ToMap(["Front"]), + }, + { Name: "WolfCuffsChain", Layer: "BindForeWristLeft", Pri: 39.9, + HideWhenOverridden: true, + NoOverride: true, + InheritColor: "Chain", + TieToLayer: "WolfCuffs", + Poses: ToMap(["Front"]), + GlobalDefaultOverride: ToMap(["Front"]), + }, + ]) +}); + +AddModel({ + Name: "Thumbcuffs", + Folder: "Handcuffs", + Parent: "HandCuffs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Cuffs", "Handcuffs"], + AddPose: ["HandCuffed"], + Layers: ToLayerMap([ + { Name: "Thumbcuffs", Layer: "BindForeHandLeft", Pri: -50, + NoOverride: true, + InheritColor: "BaseMetal", + Poses: ToMap(["Front"]), + GlobalDefaultOverride: ToMap(["Front"]), + }, + ]) +}); + diff --git a/Data/ModelList_Harness.ts b/Data/ModelList_Harness.ts new file mode 100644 index 000000000..8101b2998 --- /dev/null +++ b/Data/ModelList_Harness.ts @@ -0,0 +1,414 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "HarnessTop", + Folder: "Harness", + TopLevel: false, + Parent: "Harness", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + Layers: ToLayerMap([ + { Name: "BeltsTop", Layer: "BindChest", Pri: -10, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Up"]), + InheritColor: "Straps", + }, + { Name: "HardwareTop", Layer: "BindChest", Pri: -10.1, + InheritColor: "Hardware", + TieToLayer: "BeltsTop", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "HarnessMid", + Folder: "Harness", + TopLevel: false, + Parent: "Harness", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + Layers: ToLayerMap([ + { Name: "BeltsMid", Layer: "HarnessMid", Pri: 10, + Invariant: true, + InheritColor: "Straps", + }, + { Name: "HardwareMid", Layer: "HarnessMid", Pri: 9.9, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "BeltsMid", + NoOverride: true, + }, + ]) +}); + + +AddModel({ + Name: "HarnessStrap", + Folder: "Harness", + TopLevel: false, + Parent: "Harness", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "BeltsStrap", Layer: "HarnessMid", Pri: 10, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Straps", + MorphPoses: {Closed: "Closed", Hogtie: "Closed"}, + }, + { Name: "HardwareStrap", Layer: "HarnessMid", Pri: 9.9, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "BeltsStrap", + NoOverride: true, + }, + ]) +}); + + + + + +AddModel({ + Name: "Harness", + Folder: "Harness", + TopLevel: true, + Parent: "Harness", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + ...GetModelLayers("HarnessTop"), + + { Name: "BeltsOverbust", Layer: "BindChest", Pri: -10, + Invariant: true, + InheritColor: "Straps", + }, + { Name: "BeltsUnderbust", Layer: "StrapsUnderbust", Pri: 10, + Invariant: true, + InheritColor: "Straps", + }, + { Name: "HardwareUnderbustOver", Layer: "BindChest", Pri: -10.1, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "BeltsUnderbust", + NoOverride: true, + }, + { Name: "HardwareUnderbust", Layer: "StrapsUnderbust", Pri: 9.9, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "BeltsUnderbust", + NoOverride: true, + }, + + ...GetModelLayers("HarnessMid"), + ...GetModelLayers("HarnessStrap"), + ]) +}); + + + +AddModel(GetModelFashionVersion("HarnessTop", true)); +AddModel(GetModelFashionVersion("HarnessMid", true)); +AddModel(GetModelFashionVersion("HarnessStrap", true)); +AddModel(GetModelFashionVersion("Harness", true)); + + + + +AddModel({ + Name: "FestiveHarnessTop", + Folder: "Festive", + TopLevel: false, + Parent: "Harness", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + Layers: ToLayerMap([ + { Name: "StrapTop", Layer: "BindChest", Pri: -12, + MorphPoses: {"Boxtie": "Tied","Wristtie": "Tied","Crossed": "Tied","Front": "Tied","Up": "Up",}, + InheritColor: "Straps", + }, + { Name: "ButtonsTop", Layer: "BindChest", Pri: -12.1, + MorphPoses: {"Boxtie": "Tied","Wristtie": "Tied","Crossed": "Tied","Front": "Tied","Up": "Up",}, + InheritColor: "Hardware", + TieToLayer: "StrapTop", + NoOverride: true, + }, + { Name: "FuzzTop", Layer: "BindChest", Pri: -12.1, + MorphPoses: {"Boxtie": "Tied","Wristtie": "Tied","Crossed": "Tied","Front": "Tied","Up": "Up",}, + InheritColor: "Fluff", + TieToLayer: "StrapTop", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "FestiveHarnessMid", + Folder: "Festive", + TopLevel: false, + Parent: "Harness", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + Layers: ToLayerMap([ + { Name: "StrapMid", Layer: "HarnessMid", Pri: 8, + Invariant: true, + InheritColor: "Straps", + }, + { Name: "ButtonsMid", Layer: "HarnessMid", Pri: 7.9, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "StrapMid", + NoOverride: true, + }, + { Name: "FuzzMid", Layer: "HarnessMid", Pri: 7.9, + Invariant: true, + InheritColor: "Fluff", + TieToLayer: "StrapMid", + NoOverride: true, + }, + ]) +}); + + +AddModel({ + Name: "FestiveHarnessStrap", + Folder: "Festive", + TopLevel: false, + Parent: "Harness", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "StrapBot", Layer: "HarnessMid", Pri: 8, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Straps", + MorphPoses: {Closed: "Closed", Hogtie: "Closed"}, + }, + { Name: "ButtonsBot", Layer: "HarnessMid", Pri: 7.9, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "StrapBot", + NoOverride: true, + }, + { Name: "FuzzBot", Layer: "HarnessMid", Pri: 7.9, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Fluff", + TieToLayer: "StrapBot", + NoOverride: true, + }, + ]) +}); + + + + + +AddModel({ + Name: "FestiveHarness", + Folder: "Festive", + TopLevel: true, + Parent: "SantaHat", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + ...GetModelLayers("FestiveHarnessTop"), + + { Name: "StrapOverbust", Layer: "BindChest", Pri: -12, + Invariant: true, + InheritColor: "Straps", + }, + { Name: "StrapUnderbust", Layer: "StrapsUnderbust", Pri: 8, + Invariant: true, + InheritColor: "Straps", + }, + { Name: "ButtonsUnderbustOver", Layer: "BindChest", Pri: -12.1, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "StrapOverbust", + NoOverride: true, + }, + { Name: "ButtonsUnderbust", Layer: "StrapsUnderbust", Pri: 7.9, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "StrapUnderbust", + NoOverride: true, + }, + { Name: "FuzzUnderbustOver", Layer: "BindChest", Pri: -12.1, + Invariant: true, + InheritColor: "Fluff", + TieToLayer: "StrapOverbust", + NoOverride: true, + }, + { Name: "FuzzUnderbust", Layer: "StrapsUnderbust", Pri: 7.9, + Invariant: true, + InheritColor: "Fluff", + TieToLayer: "StrapUnderbust", + NoOverride: true, + }, + + ...GetModelLayers("FestiveHarnessMid"), + ...GetModelLayers("FestiveHarnessStrap"), + ]) +}); + + + +AddModel(GetModelFashionVersion("FestiveHarnessTop", true)); +AddModel(GetModelFashionVersion("FestiveHarnessMid", true)); +AddModel(GetModelFashionVersion("FestiveHarnessStrap", true)); +AddModel(GetModelFashionVersion("FestiveHarness", true)); + + +AddModel({ + Name: "FutureHarnessChest", + Folder: "FutureHarness", + TopLevel: false, + Parent: "FutureHarness", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "StrapsChest", Layer: "BindChest", Pri: 60, + Invariant: true, + InheritColor: "Straps", + }, + { Name: "DisplayChest", Layer: "BindChest", Pri: 60.2, + Invariant: true, + InheritColor: "Display", + TieToLayer: "StrapsChest", + NoOverride: true, + }, + { Name: "LockChest", Layer: "BindChest", Pri: 60.3, + Invariant: true, + InheritColor: "Lock", + TieToLayer: "StrapsChest", + NoOverride: true, + LockLayer: true, + }, + { Name: "MetalChest", Layer: "BindChest", Pri: 60.1, + Invariant: true, + InheritColor: "Metal", + TieToLayer: "StrapsChest", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "FutureHarnessMid", + Parent: "FutureHarness", + TopLevel: false, + Folder: "FutureHarness", + Restraint: true, + Categories: ["Restraints", "Harness", "Metal"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "StrapsMid", Layer: "HarnessMid", Pri: 60, + Invariant: true, + InheritColor: "Straps", + }, + { Name: "DisplayMid", Layer: "HarnessMid", Pri: 60.2, + Invariant: true, + InheritColor: "Display", + TieToLayer: "StrapsMid", + NoOverride: true, + }, + { Name: "LockMid", Layer: "HarnessMid", Pri: 60.3, + Invariant: true, + InheritColor: "Lock", + TieToLayer: "StrapsMid", + NoOverride: true, + LockLayer: true, + }, + { Name: "MetalMid", Layer: "HarnessMid", Pri: 60.1, + Invariant: true, + InheritColor: "Metal", + TieToLayer: "StrapsMid", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "FutureHarnessLower", + Parent: "FutureHarness", + TopLevel: false, + Folder: "FutureHarness", + Restraint: true, + Categories: ["Restraints", "Harness", "Metal"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "StrapsLower", Layer: "HarnessMid", Pri: 59, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Straps", + }, + { Name: "DisplayLower", Layer: "HarnessMid", Pri: 59.2, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Display", + TieToLayer: "StrapsMid", + NoOverride: true, + }, + { Name: "LockLower", Layer: "HarnessMid", Pri: 59.3, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Lock", + TieToLayer: "StrapsMid", + NoOverride: true, + LockLayer: true, + }, + { Name: "MetalLower", Layer: "HarnessMid", Pri: 59.1, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Metal", + TieToLayer: "StrapsMid", + NoOverride: true, + }, + ]) +}); + + + + +AddModel({ + Name: "FutureHarness", + Folder: "FutureHarness", + TopLevel: true, + Parent: "FutureHarness", + Restraint: true, + Categories: ["Restraints", "Harness", "Metal"], + AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + ...GetModelLayers("FutureHarnessLower"), + ...GetModelLayers("FutureHarnessMid"), + ...GetModelLayers("FutureHarnessChest"), + ]) +}); + + + +AddModel(GetModelFashionVersion("FutureHarnessLower", true)); +AddModel(GetModelFashionVersion("FutureHarnessMid", true)); +AddModel(GetModelFashionVersion("FutureHarnessChest", true)); +AddModel(GetModelFashionVersion("FutureHarness", true)); \ No newline at end of file diff --git a/Data/ModelList_Heavy.ts b/Data/ModelList_Heavy.ts new file mode 100644 index 000000000..9ea6c0a74 --- /dev/null +++ b/Data/ModelList_Heavy.ts @@ -0,0 +1,438 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + + +AddModel({ + Name: "JacketArmbinder", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + AddPose: ["HideHands", "EncaseArmLeft", "EncaseArmRight"], + Categories: ["Restraints", "Jacket", "Leather"], + Layers: ToLayerMap([ + { Name: "Arms", Layer: "SleeveLeft", Pri: 90, + Poses: ToMap(["Wristtie", "Boxtie", "Crossed"]), + SwapLayerPose: {Crossed: "SleevesCrossArms"}, + GlobalDefaultOverride: ToMap(["Crossed"]), + HidePoses: ToMap(["WrapArms"]), + DisplacementSprite: "Jacket", + DisplaceAmount: 70, + DisplaceLayers: ToMap(["ArmsAll"]), + }, + { Name: "BeltsArms", Layer: "BindArmLeft", Pri: 3, + NoOverride: true, + Poses: ToMap(["Wristtie", "Boxtie", "Crossed"]), + SwapLayerPose: {Crossed: "BindCrossArms"}, + GlobalDefaultOverride: ToMap(["Crossed"]), + }, + ]) +}); + +AddModel({ + Name: "JacketStraps", + Folder: "Jacket", + TopLevel: false, + Parent: "Jacket", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + Layers: ToLayerMap([ + { Name: "StrapsArms", Layer: "BindArmLeft", Pri: 3, + NoOverride: true, + Poses: ToMap(["Wristtie", "Boxtie", "Crossed"]), + SwapLayerPose: {Crossed: "BindCrossArms"}, + GlobalDefaultOverride: ToMap(["Crossed"]), + InheritColor: "BeltsArms", + HidePoses: ToMap(["WrapArms"]), + }, + { Name: "StrapsChest", Layer: "BindChest", Pri: -10, + NoOverride: true, + Poses: ToMap(["Wristtie", "Boxtie", "Crossed"]), + GlobalDefaultOverride: ToMap(["Crossed"]), + InheritColor: "BeltsChest", + HidePoses: ToMap(["WrapChest"]), + }, + { Name: "StrapsUnderbust", Layer: "StrapsUnderbust", Pri: -10, + NoOverride: true, + Invariant: true, + Poses: ToMap(["Wristtie", "Boxtie", "Crossed"]), + InheritColor: "BeltsChest", + }, + ]) +}); + + +AddModel({ + Name: "JacketLowerStraps", + Folder: "Jacket", + TopLevel: false, + Parent: "Jacket", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "BeltsTorsoLower", Layer: "HarnessMid", Pri: 70, + NoOverride: true, + MorphPoses: {Crossed: "Crossed", Wristtie: "Wristtie", Boxtie: "Boxtie"}, + InheritColor: "BeltsLower", + }, + { Name: "CrotchBelts", Layer: "HarnessMid", Pri: 70, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + InheritColor: "BeltsLower", + Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "JacketExtraStraps", + Folder: "Jacket", + TopLevel: false, + Parent: "Jacket", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "StrapsTorsoLowerExtra", Layer: "HarnessMid", Pri: 70.1, + NoOverride: true, + Invariant: true, + InheritColor: "BeltsLower", + }, + { Name: "CrotchBeltExtra", Layer: "HarnessMid", Pri: 69.91, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + InheritColor: "BeltsLower", + Invariant: true, + }, + { Name: "StrapsChestExtra", Layer: "BindChest", Pri: -9.9, + NoOverride: true, + HidePoses: ToMap(["WrapChest"]), + Invariant: true, + InheritColor: "BeltsChest", + GlobalDefaultOverride: ToMap(["Crossed"]), + }, + ]) +}); + + +AddModel({ + Name: "JacketHeavyStraps", + Folder: "Jacket", + TopLevel: false, + Parent: "Jacket", + Restraint: true, + Categories: ["Restraints", "Harness", "Leather"], + AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + ...GetModelLayers("JacketStraps"), + ...GetModelLayers("JacketLowerStraps"), + ]) +}); + +AddModel({ + Name: "Jacket", + Folder: "Jacket", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Jacket", "Leather"], + AddPose: ["EncaseTorsoUpper", "EncaseChest", "HideHands", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + ...GetModelLayers("JacketStraps"), + { Name: "Arms", Layer: "SleeveLeft", Pri: 90, + Poses: ToMap(["Wristtie", "Boxtie", "Crossed"]), + SwapLayerPose: {Crossed: "SleevesCrossArms"}, + HidePoses: ToMap(["WrapArms"]), + GlobalDefaultOverride: ToMap(["Crossed"]), + }, + { Name: "Chest", Layer: "SuitChestOver", Pri: 80, + Poses: ToMap(["Wristtie", "Boxtie", "Crossed"]), + HidePoses: ToMap(["WrapChest"]), + GlobalDefaultOverride: ToMap(["Crossed"]), + DisplacementSprite: "Jacket", + DisplaceAmount: 70, + DisplaceLayers: ToMap(["ArmsAll"]), + }, + ]) +}); + +AddModel({ + Name: "JacketLower", + Folder: "Jacket", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Jacket", "Leather"], + AddPose: ["EncaseTorsoUpper", "EncaseChest", "CrotchStrap", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + { Name: "BinderTorsoLower", Layer: "Corset", Pri: 30, + InheritColor: "Lower", + Invariant: true, + }, + { Name: "Crotch", Layer: "HarnessMid", Pri: -10.1, + InheritColor: "Lower", + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + NoOverride: true, + TieToLayer: "CrotchBelts", + Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "JacketHeavy", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Jacket", "Leather"], + AddPose: ["EncaseTorsoUpper", "EncaseChest", "HideHands", "CrotchStrap", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + ...GetModelLayers("Jacket"), + ...GetModelLayers("JacketLower"), + ...GetModelLayers("JacketLowerStraps"), + ]) +}); + +AddModel({ + Name: "JacketExtra", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Jacket", "Leather"], + AddPose: ["EncaseTorsoUpper", "EncaseChest", "HideHands", "CrotchStrap", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + ...GetModelLayers("JacketHeavy"), + ...GetModelLayers("JacketExtraStraps"), + ]) +}); + +AddModel({ + Name: "JacketArmbinderSecure", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Jacket", "Leather"], + AddPose: ["HideHands", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + { Name: "Arms", Layer: "SleeveLeft", Pri: 90, + Poses: ToMap(["Wristtie", "Boxtie", "Crossed"]), + SwapLayerPose: {Crossed: "SleevesCrossArms"}, + GlobalDefaultOverride: ToMap(["Crossed"]), + HidePoses: ToMap(["WrapArms"]), + DisplacementSprite: "Jacket", + DisplaceAmount: 70, + DisplaceLayers: ToMap(["ArmsAll"]), + }, + ...GetModelLayers("JacketStraps"), + ]) +}); + +AddModel({ + Name: "JacketHeavyArmbinder", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Jacket", "Leather"], + AddPose: ["HideHands", "CrotchStrap", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + ...GetModelLayers("JacketArmbinderSecure"), + ...GetModelLayers("JacketLowerStraps"), + ]) +}); + + +AddModel({ + Name: "JacketExtraArmbinder", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Jacket", "Leather"], + AddPose: ["HideHands", "CrotchStrap", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + ...GetModelLayers("JacketHeavyArmbinder"), + ...GetModelLayers("JacketExtraStraps"), + ]) +}); + + + +AddModel({ + Name: "JacketBolero", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Jacket", "Leather"], + AddPose: ["HideHands", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + { Name: "Arms", Layer: "SleeveLeft", Pri: 90, + Poses: ToMap(["Wristtie", "Boxtie", "Crossed"]), + SwapLayerPose: {Crossed: "SleevesCrossArms"}, + GlobalDefaultOverride: ToMap(["Crossed"]), + HidePoses: ToMap(["WrapArms"]), + }, + { Name: "ChestBolero", Layer: "ShirtChest", Pri: 80, + Poses: ToMap(["Wristtie", "Boxtie", "Crossed"]), + HidePoses: ToMap(["WrapChest"]), + GlobalDefaultOverride: ToMap(["Crossed"]), + DisplacementSprite: "Jacket", + DisplaceAmount: 70, + NoOverride: true, + DisplaceLayers: ToMap(["ArmsAll"]), + InheritColor: "Chest", + }, + ...GetModelLayers("JacketStraps"), + ]) +}); + +AddModel({ + Name: "JacketHeavyBolero", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Jacket", "Leather"], + AddPose: ["HideHands", "CrotchStrap", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + ...GetModelLayers("JacketBolero"), + ...GetModelLayers("JacketLower"), + ...GetModelLayers("JacketLowerStraps"), + ]) +}); + +AddModel({ + Name: "JacketExtraBolero", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Jacket", "Leather"], + AddPose: ["HideHands", "CrotchStrap", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + ...GetModelLayers("JacketHeavyBolero"), + ...GetModelLayers("JacketExtraStraps"), + ]) +}); + + +AddModel({ + Name: "JacketLeotard", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Jacket", "Leather"], + AddPose: ["HideHands", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + ...GetModelLayers("JacketBolero"), + + { Name: "LatexLower", Layer: "Bodysuit", Pri: 13, + //swaplayerpose: {Kneel: "BodysuitLower", KneelClosed: "BodysuitLower"}, + }, + { Name: "LatexChest", Layer: "SuitChest", Pri: 14, + InheritColor: "LatexUpper", + }, + { Name: "LatexUpper", Layer: "Bodysuit", Pri: 14, + }, + ]) +}); + +AddModel({ + Name: "JacketHeavyLeotard", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + AddPose: ["HideHands"], + Categories: ["Restraints", "Jacket", "Leather", "CrotchStrap", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + ...GetModelLayers("JacketLeotard"), + ...GetModelLayers("JacketLowerStraps"), + ]) +}); + +AddModel({ + Name: "JacketExtraLeotard", + Folder: "Jacket", + Parent: "Jacket", + TopLevel: false, + Restraint: true, + AddPose: ["HideHands"], + Categories: ["Restraints", "Jacket", "Leather", "CrotchStrap", "EncaseArmLeft", "EncaseArmRight"], + Layers: ToLayerMap([ + ...GetModelLayers("JacketHeavyLeotard"), + ...GetModelLayers("JacketExtraStraps"), + ]) +}); + +AddModel({ + Name: "Legbinder", + Folder: "Legbinder", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Legbinder", "Leather"], + Layers: ToLayerMap([ + { Name: "Legbinder", Layer: "LegbinderLegsOver", Pri: -20, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + HideWhenOverridden: true, + InheritColor: "Binder", + DisplaceAmount: 100, + DisplaceLayers: ToMap(["Legbinder"]), + DisplacementSprite: "LegbinderSquish", + + }, + { Name: "LegLegbinder", Layer: "LegbinderAnklesOver", Pri: -20, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + SwapLayerPose: {Kneel: "LegbinderLegsOver", KneelClosed: "LegbinderLegsOver"}, + InheritColor: "Binder", + }, + { Name: "RightLegbinder", Layer: "LegbinderLegsOver", Pri: -20, + //SwapLayerPose: {Kneel: "WrappingLegsRightOver", KneelClosed: "WrappingLegsRightOver"}, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + TieToLayer: "Legbinder", + InheritColor: "Binder", + + }, + { Name: "LegRightLegbinder", Layer: "LegbinderAnklesOver", Pri: -20, + SwapLayerPose: {Kneel: "WrappingLegsRight", KneelClosed: "WrappingLegsRight"}, + Poses: ToMap(["Closed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + TieToLayer: "LegLegbinder", + InheritColor: "Binder", + + }, + { Name: "LacesLegbinder", Layer: "LegbinderLegsOver", Pri: 10, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + NoOverride: true, + TieToLayer: "Legbinder", + InheritColor: "Laces", + }, + { Name: "RightLacesLegbinder", Layer: "LegbinderLegsOver", Pri: 10, + Poses: ToMap(["KneelClosed"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + NoOverride: true, + TieToLayer: "Legbinder", + InheritColor: "Laces", + }, + { Name: "LegLacesLegbinder", Layer: "LegbinderAnklesOver", Pri: 10, + Poses: ToMap(["Closed"]), + NoOverride: true, + TieToLayer: "Legbinder", + InheritColor: "Laces", + }, + ]) +}); diff --git a/Data/ModelList_Heels.ts b/Data/ModelList_Heels.ts new file mode 100644 index 000000000..e9ab6a108 --- /dev/null +++ b/Data/ModelList_Heels.ts @@ -0,0 +1,511 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "BalletHeels", + Folder: "Heels", + TopLevel: true, + Restraint: false, + Categories: ["Shoes", "Heels"], + AddPose: ["Ballet"], + RemovePoses: ["TapeBoots"], + Layers: ToLayerMap([ + { Name: "BalletLeft", Layer: "ShoeLeftOver", Pri: 50, // Bondage overrides plate mail + HideWhenOverridden: true, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...CALFLEFTPOSES]), + DisplacementSprite: "Ballet", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["BalletHeels"]), + EraseInvariant: true, + EraseMorph: {Spread: "Spread"}, + EraseSprite: "BalletErase", + EraseAmount: 100, + EraseLayers: ToMap(["BalletHeels"]), + }, + { Name: "BalletRight", Layer: "ShoeRightOver", Pri: 50, // Bondage overrides plate mail + HideWhenOverridden: true, + InheritColor: "Shoe", + Poses: ToMap([...CALFRIGHTPOSES, "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "BalletRightErase", + EraseAmount: 100, + EraseLayers: ToMap(["BalletHeelRight"]), + EraseZBonus: 100, + }, + + + { Name: "BalletSoleLeft", Layer: "ShoeLeftOver", Pri: 50.1, + HideWhenOverridden: true, + InheritColor: "Sole", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...CALFLEFTPOSES]), + NoOverride: true, + TieToLayer: "BalletLeft", + + DisplacementSprite: "BalletCuffs", + DisplaceZBonus: 10000, + DisplaceAmount: 70, + DisplaceLayers: ToMap(["BalletHeelsCuffs"]), + }, + { Name: "BalletSoleRight", Layer: "ShoeRightOver", Pri: 50.1, + HideWhenOverridden: true, + InheritColor: "Sole", + Poses: ToMap([...CALFRIGHTPOSES, "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + NoOverride: true, + TieToLayer: "BalletRight", + }, + + + { Name: "BalletLaceLeft", Layer: "ShoeLeftOver", Pri: 50.2, + HideWhenOverridden: true, + InheritColor: "Laces", + Poses: ToMap(["Closed", "Spread"]), + NoOverride: true, + TieToLayer: "BalletLeft", + }, + { Name: "BalletLaceRight", Layer: "ShoeRightOver", Pri: 50.2, + HideWhenOverridden: true, + InheritColor: "Laces", + Poses: ToMap(["Closed", "Spread"]), + NoOverride: true, + TieToLayer: "BalletRight", + }, + ]) +}); + + +AddModel({ + Name: "FlatBalletHeels", + Folder: "Heels", + TopLevel: false, + Parent: "BalletHeels", + Restraint: false, + Categories: ["Shoes", "Heels"], + AddPose: ["Ballet"], + RemovePoses: ["TapeBoots"], + Layers: ToLayerMap([ + { Name: "FlatBalletLeft", Layer: "ShoeLeftOver", Pri: 51, // Bondage overrides plate mail + HideWhenOverridden: true, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...CALFLEFTPOSES]), + DisplacementSprite: "Ballet", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["BalletHeels"]), + EraseInvariant: true, + EraseMorph: {Spread: "Spread"}, + EraseSprite: "BalletErase", + EraseAmount: 100, + EraseLayers: ToMap(["BalletHeels"]), + }, + { Name: "FlatBalletRight", Layer: "ShoeRightOver", Pri: 51, // Bondage overrides plate mail + HideWhenOverridden: true, + InheritColor: "Shoe", + Poses: ToMap([...CALFRIGHTPOSES, "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "BalletRightErase", + EraseAmount: 100, + EraseLayers: ToMap(["BalletHeelRight"]), + EraseZBonus: 100, + }, + + + { Name: "BalletSoleLeft", Layer: "ShoeLeftOver", Pri: 51.1, + InheritColor: "Sole", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...CALFLEFTPOSES]), + NoOverride: true, + TieToLayer: "FlatBalletLeft", + DisplacementSprite: "BalletCuffs", + DisplaceZBonus: 10000, + DisplaceAmount: 70, + DisplaceLayers: ToMap(["BalletHeelsCuffs"]), + }, + { Name: "BalletSoleRight", Layer: "ShoeRightOver", Pri: 51.1, + InheritColor: "Sole", + Poses: ToMap([...CALFRIGHTPOSES, "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + NoOverride: true, + TieToLayer: "FlatBalletRight", + }, + ]) +}); +AddModel({ + Name: "ShinyBalletHeels", + Folder: "Heels", + TopLevel: false, + Parent: "BalletHeels", + Restraint: false, + Categories: ["Shoes", "Heels"], + AddPose: ["Ballet"], + RemovePoses: ["TapeBoots"], + Layers: ToLayerMap([ + { Name: "ShinyBalletLeft", Layer: "ShoeLeftOver", Pri: 52, // Bondage overrides plate mail + HideWhenOverridden: true, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...CALFLEFTPOSES]), + DisplacementSprite: "Ballet", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["BalletHeels"]), + EraseInvariant: true, + EraseMorph: {Spread: "Spread"}, + EraseSprite: "BalletErase", + EraseAmount: 100, + EraseLayers: ToMap(["BalletHeels"]), + }, + { Name: "ShinyBalletRight", Layer: "ShoeRightOver", Pri: 52, // Bondage overrides plate mail + HideWhenOverridden: true, + InheritColor: "Shoe", + Poses: ToMap([...CALFRIGHTPOSES, "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "BalletRightErase", + EraseAmount: 100, + EraseLayers: ToMap(["BalletHeelRight"]), + EraseZBonus: 100, + }, + + + { Name: "BalletSoleLeft", Layer: "ShoeLeftOver", Pri: 52.1, + HideWhenOverridden: true, + InheritColor: "Sole", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...CALFLEFTPOSES]), + NoOverride: true, + TieToLayer: "ShinyBalletLeft", + DisplacementSprite: "BalletCuffs", + DisplaceZBonus: 10000, + DisplaceAmount: 70, + DisplaceLayers: ToMap(["BalletHeelsCuffs"]), + }, + { Name: "BalletSoleRight", Layer: "ShoeRightOver", Pri: 52.1, + HideWhenOverridden: true, + InheritColor: "Sole", + Poses: ToMap([...CALFRIGHTPOSES, "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + NoOverride: true, + TieToLayer: "ShinyBalletRight", + }, + ]) +}); + + + +AddModel(GetModelRestraintVersion("BalletHeels", true, + ["RestrainingShoes"], ["TapeBoots"] +)); +AddModel(GetModelRestraintVersion("FlatBalletHeels", true, + ["RestrainingShoes"], ["TapeBoots"] +)); +AddModel(GetModelRestraintVersion("ShinyBalletHeels", true, + ["RestrainingShoes"], ["TapeBoots"] +)); + + +AddModel({ + Name: "LeatherHeels", + Folder: "Heels", + TopLevel: true, + Restraint: false, + Categories: ["Shoes"], + AddPose: ["Heels"], + Layers: ToLayerMap([ + { Name: "LeatherLeft", Layer: "ShoeLeft", Pri: 30, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...LEGPOSES]), + SwapLayerPose: {Hogtie: "ShoeLeftHogtie"}, + DisplacementSprite: "Heels", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["Heels"]), + DisplaceZBonus: 10000, + EraseInvariant: true, + EraseMorph: {Spread: "Spread"}, + EraseSprite: "HeelsErase", + EraseAmount: 100, + EraseLayers: ToMap(["Heels"]), + }, + { Name: "LeatherRight", Layer: "ShoeRight", Pri: 30, + InheritColor: "Shoe", + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "KneelClosed"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "HeelsRightErase", + EraseAmount: 100, + EraseLayers: ToMap(["HeelRight"]), + EraseZBonus: 100, + }, + { Name: "LeatherLegLeft", Layer: "OverShoes", Pri: 31, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["Hogtie"]), + Poses: ToMap(["Hogtie"]), + }, + { Name: "LeatherLegRight", Layer: "ShoeRight", Pri: 31, + InheritColor: "Shoe", + Poses: ToMap(["Kneel", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + }, + ]) +}); + + +AddModel({ + Name: "SmoothHeels", + Folder: "SmoothHeels", + TopLevel: true, + Restraint: false, + Categories: ["Shoes"], + AddPose: ["Heels"], + Layers: ToLayerMap([ + { Name: "Left", Layer: "ShoeLeft", Pri: 29, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...LEGPOSES]), + SwapLayerPose: {Hogtie: "ShoeLeftHogtie"}, + DisplacementSprite: "Heels", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["Heels"]), + DisplaceZBonus: 10000, + EraseInvariant: true, + EraseMorph: {Spread: "Spread"}, + EraseSprite: "HeelsErase", + EraseAmount: 100, + EraseLayers: ToMap(["Heels"]), + }, + { Name: "Right", Layer: "ShoeRight", Pri: 29, + InheritColor: "Shoe", + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "KneelClosed"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "HeelsRightErase", + EraseAmount: 100, + EraseLayers: ToMap(["HeelRight"]), + EraseZBonus: 100, + }, + { Name: "LegLeft", Layer: "OverShoes", Pri: 29.5, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["Hogtie"]), + Poses: ToMap(["Hogtie"]), + }, + { Name: "LegRight", Layer: "ShoeRight", Pri: 29.5, + InheritColor: "Shoe", + Poses: ToMap(["Kneel", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + }, + ]) +}); + + + +AddModel({ + Name: "TallHeels", + Folder: "Heels", + TopLevel: true, + Restraint: false, + Categories: ["Shoes"], + AddPose: ["Heels"], + Layers: ToLayerMap([ + { Name: "TallLeft", Layer: "ShoeLeft", Pri: 26, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...LEGPOSES]), + SwapLayerPose: {Hogtie: "ShoeLeftHogtie"}, + DisplacementSprite: "Heels", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["Heels"]), + DisplaceZBonus: 10000, + EraseInvariant: true, + EraseMorph: {Spread: "Spread"}, + EraseSprite: "HeelsErase", + EraseAmount: 100, + EraseLayers: ToMap(["Heels"]), + }, + { Name: "TallRight", Layer: "ShoeRight", Pri: 26, + InheritColor: "Shoe", + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "KneelClosed"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "HeelsRightErase", + EraseAmount: 100, + EraseLayers: ToMap(["HeelRight"]), + EraseZBonus: 100, + }, + { Name: "TallLegLeft", Layer: "OverSocks", Pri: 27, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap(["Kneel", "KneelClosed", "Hogtie"]), + }, + { Name: "TallLegRight", Layer: "ShoeRightUnder", Pri: 27, + InheritColor: "Shoe", + Poses: ToMap(["Kneel", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + }, + ]) +}); + + +AddModel({ + Name: "TallHeelsRestraint", + Folder: "Heels", + TopLevel: true, + Restraint: true, + Categories: ["Shoes"], + AddPose: ["Heels"], + Layers: ToLayerMap([ + ...GetModelLayers("TallHeels"), + ]) +}); + + +AddModel({ + Name: "TallSmoothHeels", + Folder: "TallSmoothHeels", + TopLevel: true, + Restraint: false, + Categories: ["Shoes"], + AddPose: ["Heels"], + HideLayers: ["FootRightKneel", "SockRightKneel"], + Layers: ToLayerMap([ + { Name: "TallLeft", Layer: "ShoeLeft", Pri: 26, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...LEGPOSES]), + SwapLayerPose: {Hogtie: "ShoeLeftHogtie"}, + DisplacementSprite: "Heels2", + DisplaceAmount: 80, + DisplaceLayers: ToMap(["Heels"]), + DisplaceZBonus: 10000, + EraseInvariant: true, + EraseMorph: {Spread: "Spread", Closed: "Closed"}, + EraseSprite: "HeelsErase", + EraseAmount: 100, + EraseLayers: ToMap(["Heels"]), + }, + { Name: "TallRight", Layer: "ShoeRight", Pri: 26, + InheritColor: "Shoe", + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "KneelClosed"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "HeelsRightErase", + EraseAmount: 100, + EraseLayers: ToMap(["HeelRight"]), + EraseZBonus: 100, + }, + { Name: "TallLegLeft", Layer: "OverSocks", Pri: 27, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap(["Kneel", "KneelClosed", "Hogtie"]), + }, + { Name: "TallLegRight", Layer: "ShoeRightUnder", Pri: 27, + InheritColor: "Shoe", + Poses: ToMap(["Kneel", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + }, + ]) +}); + + +AddModel({ + Name: "TallSmoothHeelsRestraint", + Folder: "TallSmoothHeels", + TopLevel: true, + Restraint: true, + Categories: ["Shoes"], + AddPose: ["Heels"], + Layers: ToLayerMap([ + ...GetModelLayers("TallSmoothHeels"), + ]) +}); + +AddModel({ + Name: "TallBalletHeels", + Folder: "TallBallet", + TopLevel: true, + Restraint: false, + Categories: ["Shoes"], + AddPose: ["Heels", "FeetCovered"], + RemovePoses: ["TapeBoots"], + Layers: ToLayerMap([ + { Name: "TallLeft", Layer: "ShoeLeft", Pri: 26, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...LEGPOSES]), + SwapLayerPose: {Hogtie: "ShoeLeftHogtie"}, + + + DisplacementSprite: "Ballet", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["Heels"]), + DisplaceZBonus: 100, + EraseInvariant: true, + EraseMorph: {Spread: "Spread"}, + EraseSprite: "BalletErase", + EraseAmount: 100, + EraseLayers: ToMap(["Heels"]), + }, + { Name: "TallRight", Layer: "ShoeRight", Pri: 26, + InheritColor: "Shoe", + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "KneelClosed"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + SwapLayerPose: {Kneel: "ShoeRightKneel"}, + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "BalletRightErase", + EraseAmount: 100, + EraseLayers: ToMap(["HeelRight"]), + EraseZBonus: 100, + }, + { Name: "TallLegLeft", Layer: "OverShoes", Pri: 27, + InheritColor: "Shoe", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap(["Kneel", "KneelClosed", "Hogtie"]), + }, + { Name: "TallLegRight", Layer: "ShoeRightUnder", Pri: 27, + InheritColor: "Shoe", + Poses: ToMap(["Kneel", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + }, + ]) +}); + + +AddModel({ + Name: "TallBalletHeelsRestraint", + Folder: "TallBallet", + TopLevel: true, + Restraint: true, + Categories: ["Shoes"], + AddPose: ["Heels", "RestrainingShoes"], + Layers: ToLayerMap([ + ...GetModelLayers("TallHeels"), + ]) +}); + diff --git a/Data/ModelList_Hood.ts b/Data/ModelList_Hood.ts new file mode 100644 index 000000000..dac8e72a7 --- /dev/null +++ b/Data/ModelList_Hood.ts @@ -0,0 +1,81 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "LeatherMask", + Folder: "Hood", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Hoods"], + AddPose: ["HideEars", "FaceCoverGag", "Hooded", "HoodMask"], + HideLayers: ["Brows"], + Layers: ToLayerMap([ + { Name: "Hood", Layer: "Hood", Pri: 50, + Invariant: true, + }, + { Name: "HoodCollar", Layer: "Collar", Pri: -440, + Invariant: true, + }, + { Name: "Gag", Layer: "Hood", Pri: 50.1, + Invariant: true, + NoOverride: true, + }, + { Name: "Blindfold", Layer: "Hood", Pri: 50.1, + Invariant: true, + NoOverride: true, + }, + ]) +}); +AddModel(GetModelFashionVersion("LeatherMask", true)); + + +AddModel({ + Name: "LeatherHood", + Folder: "Hood", + TopLevel: true, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Hoods"], + AddPose: ["HideEars", "FaceCoverGag", "Hooded"], + HideLayers: ["HairFront", "HairOver", "HairBack", "Brows", "Ears"], + AddPoseConditional: { + Xray: ["HoodMask",], + }, + Layers: ToLayerMap([ + { Name: "Hood", Layer: "Hood", Pri: 50, + Invariant: true, + }, + { Name: "HoodCollar", Layer: "Collar", Pri: -440, + Invariant: true, + }, + { Name: "Gag", Layer: "Hood", Pri: 50.1, + Invariant: true, + NoOverride: true, + }, + { Name: "Blindfold", Layer: "Hood", Pri: 50.1, + Invariant: true, + NoOverride: true, + }, + { Name: "WolfEars", Layer: "Hood", Pri: 50.1, + Invariant: true, + NoOverride: true, + RequirePoses: {"Wolf": true}, + }, + { Name: "KittyEars", Layer: "Hood", Pri: 50.1, + Invariant: true, + NoOverride: true, + RequirePoses: {"Kitty": true}, + }, + { Name: "BunnyEars", Layer: "Hood", Pri: 50.1, + Invariant: true, + NoOverride: true, + RequirePoses: {"Bunny": true}, + }, + ]) +}); +AddModel(GetModelFashionVersion("LeatherHood", true)); diff --git a/Data/ModelList_Kigu.ts b/Data/ModelList_Kigu.ts new file mode 100644 index 000000000..9afa2968b --- /dev/null +++ b/Data/ModelList_Kigu.ts @@ -0,0 +1,120 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "KiguMask", + Folder: "Kigu", + TopLevel: true, + Restraint: true, + Categories: ["Restraints","Accessories"], + AddPose: ["FaceCoverGag", "Hooded"], + AddPoseConditional: { + Xray: ["HoodMask",], + }, + HideLayers: [ + "Brows", // Brows should get hidden with mask + "MouthProp", + ], + ImportBodyFilters: true, + Layers: ToLayerMap([ + { Name: "Mask", Layer: "Hood", Pri: -10, + HidePoses: {Xray: true}, + InheritColor: "Head", + AppendPose: {FaceCoverGag: "", FaceBigGag: "Gag", FaceGag: "Gag"}, + }, + { Name: "Eyes", Layer: "Hood", Pri: -9.8, + NoOverride: true, + HidePoses: {Xray: true}, + TieToLayer: "Mask", + ImportColorFromCategory: ["Eyes", "Eyes"], + }, + { Name: "Eyes2", Layer: "Hood", Pri: -9.8, + NoOverride: true, + HidePoses: {Xray: true}, + TieToLayer: "Mask", + ImportColorFromCategory: ["Eyes", "Eyes2"], + }, + { Name: "Lock", Layer: "Hood", Pri: -10.1, + NoOverride: true, + HidePoses: {Xray: true}, + TieToLayer: "Mask", + LockLayer: true, + }, + { Name: "EyesWhites", Layer: "Hood", Pri: -9.9, + NoOverride: true, + HidePoses: {Xray: true}, + TieToLayer: "Mask", + }, + { Name: "Mouth", Layer: "Hood", Pri: -9.9, + NoOverride: true, + HidePoses: {Xray: true}, + TieToLayer: "Mask", + }, + ]) +}); + + +AddModel(GetModelFashionVersion("KiguMask", true)); + + + +AddModel({ + Name: "KiguMaskSmile", + Folder: "Kigu", + TopLevel: true, + Restraint: true, + Categories: ["Restraints","Accessories"], + AddPose: ["FaceCoverGag", "Hooded"], + AddPoseConditional: { + Xray: ["HoodMask",], + }, + HideLayers: [ + "Brows", // Brows should get hidden with mask + "MouthProp", + ], + ImportBodyFilters: true, + Layers: ToLayerMap([ + { Name: "Mask", Layer: "Hood", Pri: -10, + HidePoses: {Xray: true}, + InheritColor: "Head", + AppendPose: {FaceCoverGag: "", FaceBigGag: "Gag", FaceGag: "Gag"}, + }, + { Name: "Eyes", Layer: "Hood", Pri: -9.8, + NoOverride: true, + HidePoses: {Xray: true}, + TieToLayer: "Mask", + ImportColorFromCategory: ["Eyes", "Eyes"], + }, + { Name: "Eyes2", Layer: "Hood", Pri: -9.8, + NoOverride: true, + HidePoses: {Xray: true}, + TieToLayer: "Mask", + ImportColorFromCategory: ["Eyes", "Eyes2"], + }, + { Name: "Lock", Layer: "Hood", Pri: -10.1, + NoOverride: true, + HidePoses: {Xray: true}, + TieToLayer: "Mask", + LockLayer: true, + }, + { Name: "EyesWhites", Layer: "Hood", Pri: -9.9, + NoOverride: true, + HidePoses: {Xray: true}, + TieToLayer: "Mask", + }, + { Name: "MouthSmile", Layer: "Hood", Pri: -9.9, + NoOverride: true, + HidePoses: {Xray: true}, + TieToLayer: "Mask", + OffsetX: 942, + OffsetY: 200, + }, + ]) +}); + + +AddModel(GetModelFashionVersion("KiguMaskSmile", true)); diff --git a/Data/ModelList_KittyPawCuffs.ts b/Data/ModelList_KittyPawCuffs.ts new file mode 100644 index 000000000..dbcc2c8c6 --- /dev/null +++ b/Data/ModelList_KittyPawCuffs.ts @@ -0,0 +1,256 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "KittyPawCuffsWristLeft", + Folder: "KittyPawCuffs", + TopLevel: false, + Parent: "KittyPawCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristLeft", "", "", "Cuff"), + ...GetModelLayers("ShacklesWristLeft", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesWristLeft", "Lock", "", "Lock", 0.5), + ]) +}); +AddModel({ + Name: "KittyPawCuffsWristRight", + Folder: "KittyPawCuffs", + TopLevel: false, + Parent: "KittyPawCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristRight", "", "", "Cuff"), + ...GetModelLayers("ShacklesWristRight", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesWristRight", "Lock", "", "Lock", 0.5), + ]) +}); + +AddModel({ + Name: "KittyPawCuffsWrists", + Folder: "KittyPawCuffs", + TopLevel: false, + Parent: "KittyPawCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPawCuffsWristLeft"), + ...GetModelLayers("KittyPawCuffsWristRight"), + ]) +}); + + + +AddModel({ + Name: "KittyPawCuffsElbowLeft", + Folder: "KittyPawCuffs", + TopLevel: false, + Parent: "KittyPawCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft"], + Layers: ToLayerMap([ + { Name: "ElbowLeft", Layer: "BindElbowLeft", Pri: 1, + Poses: ToMap([...ARMPOSES]), + SwapLayerPose: {Front: "BindForeElbowLeft", Crossed: "BindCrossElbowLeft", Up: "BindForeElbowLeft"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + DisplacementSprite: "ElbowCuffLeft", + DisplaceLayers: ToMap(["Cuffs"]), + DisplaceAmount: 50, + InheritColor: "BaseMetal", + HidePoses: ToMap(["EncaseArmLeft"]), + }, + + { Name: "BandElbowLeft", Layer: "BindElbowLeft", Pri: 1.4, + Poses: ToMap([...ARMPOSES]), + SwapLayerPose: {Front: "BindForeElbowLeft", Crossed: "BindCrossElbowLeft", Up: "BindForeElbowLeft"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Band", + HidePoses: ToMap(["EncaseArmLeft"]), + TieToLayer: "ElbowLeft", + NoOverride: true, + }, + + { Name: "LockElbowLeft", Layer: "BindElbowLeft", Pri: 1.5, + Poses: ToMap([...ARMPOSES]), + SwapLayerPose: {Front: "BindForeElbowLeft", Crossed: "BindCrossElbowLeft", Up: "BindForeElbowLeft"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Lock", + HidePoses: ToMap(["EncaseArmLeft"]), + TieToLayer: "ElbowLeft", + NoOverride: true, + }, + + ]) +}); +AddModel({ + Name: "KittyPawCuffsElbowRight", + Folder: "KittyPawCuffs", + TopLevel: false, + Parent: "KittyPawCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowRight"], + Layers: ToLayerMap([ + { Name: "ElbowRight", Layer: "BindElbowRight", Pri: 1, + Poses: ToMapSubtract([...ARMPOSES], ["Free"]), + SwapLayerPose: {Front: "BindForeElbowRight", Crossed: "BindCrossElbowRight", Up: "BindForeElbowRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + DisplacementSprite: "ElbowCuffRight", + DisplaceLayers: ToMap(["Cuffs"]), + DisplaceAmount: 100, + InheritColor: "BaseMetal", + HidePoses: ToMap(["EncaseArmRight"]), + }, + + { Name: "BandElbowRight", Layer: "BindElbowRight", Pri: 1.4, + Poses: ToMapSubtract([...ARMPOSES], ["Free"]), + SwapLayerPose: {Front: "BindForeElbowRight", Crossed: "BindCrossElbowRight", Up: "BindForeElbowRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Band", + HidePoses: ToMap(["EncaseArmRight"]), + TieToLayer: "ElbowRight", + NoOverride: true, + }, + + { Name: "LockElbowRight", Layer: "BindElbowRight", Pri: 1.5, + Poses: ToMapSubtract([...ARMPOSES], ["Free"]), + SwapLayerPose: {Front: "BindForeElbowRight", Crossed: "BindCrossElbowRight", Up: "BindForeElbowRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Lock", + HidePoses: ToMap(["EncaseArmRight"]), + TieToLayer: "ElbowRight", + NoOverride: true, + }, + + ]) +}); + +AddModel({ + Name: "KittyPawCuffsElbows", + Folder: "KittyPawCuffs", + TopLevel: false, + Parent: "KittyPawCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPawCuffsElbowLeft"), + ...GetModelLayers("KittyPawCuffsElbowRight"), + ]) +}); + +AddModel({ + Name: "KittyPawCuffsArms", + Folder: "KittyPawCuffs", + TopLevel: true, + Parent: "KittyPawCuffs", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight", "WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPawCuffsWrists"), + ...GetModelLayers("KittyPawCuffsElbows"), + ]) +}); + +AddModel({ + Name: "KittyPawCuffsAnklesLeft", + Folder: "KittyPawCuffs", + TopLevel: false, + Parent: "KittyPawCuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesLeft", "", "", "Cuff"), + ...GetModelLayers("ShacklesAnklesLeft", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesAnklesLeft", "Lock", "", "Lock", 0.5), + ]) +}); + +AddModel({ + Name: "KittyPawCuffsAnklesRight", + Folder: "KittyPawCuffs", + TopLevel: false, + Parent: "KittyPawCuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesRight", "", "", "Cuff"), + ...GetModelLayers("ShacklesAnklesRight", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesAnklesRight", "Lock", "", "Lock", 0.5), + ]) +}); + + +AddModel({ + Name: "KittyPawCuffsAnkles", + Folder: "KittyPawCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight", "AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPawCuffsAnklesRight"), + ...GetModelLayers("KittyPawCuffsAnklesLeft"), + ]) +}); + + + +AddModel({ + Name: "KittyPawCuffsThighLeft", + Folder: "KittyPawCuffs", + TopLevel: false, + Parent: "KittyPawCuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighLeft", "", "", "Cuff"), + ...GetModelLayers("ShacklesThighLeft", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesThighLeft", "Lock", "", "Lock", 0.5), + ]) +}); + +AddModel({ + Name: "KittyPawCuffsThighRight", + Folder: "KittyPawCuffs", + TopLevel: false, + Parent: "KittyPawCuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighRight", "", "", "Cuff"), + ...GetModelLayers("ShacklesThighRight", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesThighRight", "Lock", "", "Lock", 0.5), + ]) +}); + + +AddModel({ + Name: "KittyPawCuffsThigh", + Folder: "KittyPawCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight", "ThighLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPawCuffsThighRight"), + ...GetModelLayers("KittyPawCuffsThighLeft"), + ]) +}); + +AddModel(GetModelFashionVersion("KittyPawCuffsWristLeft", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsWristRight", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsWrists", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsElbowLeft", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsElbowRight", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsElbows", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsArms", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsAnklesLeft", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsAnklesRight", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsAnkles", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsThighLeft", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsThighRight", true)); +AddModel(GetModelFashionVersion("KittyPawCuffsThigh", true)); \ No newline at end of file diff --git a/Data/ModelList_KittyPet.ts b/Data/ModelList_KittyPet.ts new file mode 100644 index 000000000..d5f5f0379 --- /dev/null +++ b/Data/ModelList_KittyPet.ts @@ -0,0 +1,478 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "KittyPetLeotardUnder", + Folder: "KittyPet", + Parent: "KittyPetLeotard", + TopLevel: false, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "Leotard", Layer: "Bodysuit", Pri: 3, + HideWhenOverridden: true, + MorphPoses: {Closed: "Closed", Hogtie: "Closed"}, + }, + { Name: "LeotardStripes", Layer: "Bodysuit", Pri: 3.1, + NoOverride: true, + TieToLayer: "Leotard", + InheritColor: "Stripes", + }, + { Name: "LeotardChest", Layer: "SuitChest", Pri: 3, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + HideWhenOverridden: true, + InheritColor: "LeotardUpper", + MorphPoses: {Boxtie: "Tied", Front: "Tied", Crossed: "Tied", Wristtie: "Tied", Up: "Up",}, + }, + { Name: "LeotardChestStripes", Layer: "SuitChest", Pri: 3.1, + NoOverride: true, + InheritColor: "StripesUpper", + TieToLayer: "LeotardChest", + }, + ]) +}); +AddModel({ + Name: "KittyPetLeotard", + Folder: "KittyPet", + Parent: "KittyPetLeotard", + TopLevel: true, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "Leotard", Layer: "BodysuitOver", Pri: 3, + HideWhenOverridden: true, + MorphPoses: {Closed: "Closed", Hogtie: "Closed"}, + }, + { Name: "LeotardStripes", Layer: "BodysuitOver", Pri: 3.1, + NoOverride: true, + TieToLayer: "Leotard", + InheritColor: "Stripes", + }, + { Name: "LeotardChest", Layer: "SuitChestOver", Pri: 3, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + MorphPoses: {Boxtie: "Tied", Front: "Tied", Crossed: "Tied", Wristtie: "Tied", Up: "Up",}, + HideWhenOverridden: true, + InheritColor: "LeotardUpper", + }, + { Name: "LeotardChestStripes", Layer: "SuitChestOver", Pri: 3.1, + NoOverride: true, + InheritColor: "StripesUpper", + TieToLayer: "LeotardChest", + }, + ]) +}); + +AddModel(GetModelRestraintVersion("KittyPetLeotard", true)); + + +AddModel({ + Name: "KittyPetUniformCollar", + Folder: "KittyPet", + Parent: "KittyPetLeotard", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "LeotardChestCollar", Layer: "BustierCollar", Pri: 25, + HideWhenOverridden: true, + NoOverride: true, + InheritColor: "CollarRight", + MorphPoses: {Up: "Up",}, + }, + { Name: "LeotardChestCollarLeft", Layer: "BustierCollar", Pri: 25, + NoOverride: true, + InheritColor: "CollarLeft", + TieToLayer: "LeotardChestCollar", + MorphPoses: {Boxtie: "Tied", Front: "Tied", Crossed: "Tied", Wristtie: "Tied", Up: "Tied",}, + }, + { Name: "LeotardChestCollarStripes", Layer: "BustierCollar", Pri: 25.1, + NoOverride: true, + InheritColor: "StripesRight", + TieToLayer: "LeotardChestCollar", + MorphPoses: { Up: "Up",}, + }, + { Name: "LeotardChestCollarStripesLeft", Layer: "BustierCollar", Pri: 25.1, + NoOverride: true, + InheritColor: "StripesLeft", + TieToLayer: "LeotardChestCollarLeft", + MorphPoses: {Boxtie: "Tied", Front: "Tied", Crossed: "Tied", Wristtie: "Tied", Up: "Tied",}, + }, + + + { Name: "CollarDeco", Layer: "BindChest", Pri: -40, + InheritColor: "Tag", + HideWhenOverridden: true, + }, + { Name: "CollarDecoSymbol", Layer: "BindChest", Pri: -39.1, + InheritColor: "Symbol", + TieToLayer: "CollarDeco", + NoOverride: true, + }, + + + { Name: "ShoulderCuffLeft", Layer: "SuitChestOver", Pri: 2.8, + NoOverride: true, + InheritColor: "LeftShoulder", + TieToLayer: "LeotardChestCollarLeft", + }, + { Name: "ShoulderCuffStripeLeft", Layer: "SuitChestOver", Pri: 2.9, + NoOverride: true, + InheritColor: "LeftShoulderStripe", + TieToLayer: "ShoulderCuffLeft", + }, + { Name: "ShoulderCuffRight", Layer: "SuitChestOver", Pri: 2.8, + NoOverride: true, + InheritColor: "RightShoulder", + TieToLayer: "LeotardChestCollar", + }, + { Name: "ShoulderCuffStripeRight", Layer: "SuitChestOver", Pri: 2.9, + NoOverride: true, + InheritColor: "RightShoulderStripe", + TieToLayer: "LeotardChestCollar", + }, + ]) +}); + + + +AddModel({ + Name: "KittyPetTail", + Folder: "KittyPet", + Parent: "KittyPet", + TopLevel: true, + Protected: true, + Categories: ["Tails", "Kitty", "Cosplay"], + AddPose: ["Tails", "Kitty", "Cosplay"], + Layers: ToLayerMap([ + { Name: "Tail", Layer: "Tail", Pri: 5, + Invariant: true, + InheritColor: "Tail", + NoOverride: true, + }, + { Name: "TailStripe", Layer: "Tail", Pri: 5.1, + Invariant: true, + InheritColor: "Stripe", + TieToLayer: "Tail", + NoOverride: true, + }, + ]) +}); + + +AddModel({ + Name: "KittyPetBlindfold", + Folder: "KittyPet", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Blindfolds"], + AddPose: ["Blindfolds"], + Layers: ToLayerMap([ + { Name: "BlindfoldRim", Layer: "Blindfold", Pri: 40, + Invariant: true, + InheritColor: "Rim", + }, + { Name: "Blindfold", Layer: "Blindfold", Pri: 40.1, + Invariant: true, + TieToLayer: "BlindfoldRim", + }, + { Name: "BlindfoldBrow", Layer: "Blindfold", Pri: 40.2, + Invariant: true, + TieToLayer: "BlindfoldRim", + InheritColor: "Brows", + }, + ]) +}); + + +AddModel(GetModelFashionVersion("KittyPetBlindfold", true)); + + +AddModel({ + Name: "KittyPetSteelCollar", + Folder: "KittyPet", + Parent: "KittyPetLeotard", + TopLevel: true, + Categories: ["Restraints", "Collars", "Accessories"], + Filters: { + Stripe: {"gamma":1,"saturation":0,"contrast":1.59,"brightness":1,"red":1.2352941176470589,"green":0.7058823529411765,"blue":1.1176470588235294,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "Collar", Layer: "Collar", Pri: -10, + InheritColor: "BaseMetal", + }, + { Name: "CollarStripe", Layer: "Collar", Pri: -9.9, + InheritColor: "Stripe", + TieToLayer: "Collar", + NoOverride: true, + }, + ]) +}); + +AddModel(GetModelFashionVersion("KittyPetSteelCollar", true)); + + + +AddModel({ + Name: "KittyPetMittenLeft", + Folder: "KittyPetPaws", + Parent: "KittyPetPaws", + Categories: ["Mittens", "Restraints"], + Layers: ToLayerMap([ + { Name: "GloveLeft", Layer: "MittenLeft", Pri: -1, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Mitten", + EraseSprite: "MittL", + EraseLayers: ToMap(["MittL"]), + }, + { Name: "GloveLeftPaw", Layer: "MittenLeft", Pri: -0.9, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Crossed", "Up"]), + GlobalDefaultOverride: ToMap(["Front"]), + NoOverride: true, + TieToLayer: "GloveLeft", + }, + { Name: "ForeGloveLeft", Layer: "ForeMittenLeft", Pri: -1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveLeft"}, + EraseSprite: "MittL", + EraseLayers: ToMap(["MittL"]), + }, + { Name: "ForeGloveLeftPaw", Layer: "ForeMittenLeft", Pri: -0.9, + Poses: ToMapSubtract([...FOREARMPOSES], ["Crossed"]), + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "GloveLeft", + SwapLayerPose: {Crossed: "CrossGloveLeft"}, + NoOverride: true, + TieToLayer: "ForeGloveLeft", + }, + ...GetModelLayers("KittyPawCuffsWristLeft", + undefined, undefined, undefined, undefined, undefined, "KittyPawCuffs"), + ...GetModelLayers("KittyPawCuffsElbowLeft", + undefined, undefined, undefined, undefined, undefined, "KittyPawCuffs"), + ]) +}); + +AddModel({ + Name: "KittyPetMittenRight", + Folder: "KittyPetPaws", + Parent: "KittyPetPaws", + Categories: ["Mittens", "Restraints"], + Layers: ToLayerMap([ + { Name: "GloveRight", Layer: "MittenRight", Pri: -1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + EraseSprite: "MittR", + EraseLayers: ToMap(["MittR"]), + }, + { Name: "GloveRightPaw", Layer: "MittenRight", Pri: -0.9, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Crossed", "Up"]), + GlobalDefaultOverride: ToMap(["Front"]), + NoOverride: true, + TieToLayer: "GloveRight", + }, + { Name: "ForeGloveRight", Layer: "ForeMittenRight", Pri: -1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + EraseSprite: "MittR", + EraseLayers: ToMap(["MittR"]), + }, + { Name: "ForeGloveRightPaw", Layer: "ForeMittenRight", Pri: -0.9, + Poses: ToMapSubtract([...FOREARMPOSES], ["Crossed"]), + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "GloveRight", + SwapLayerPose: {Crossed: "CrossGloveRight"}, + NoOverride: true, + TieToLayer: "ForeGloveRight", + }, + ...GetModelLayers("KittyPawCuffsWristRight", + undefined, undefined, undefined, undefined, undefined, "KittyPawCuffs"), + ...GetModelLayers("KittyPawCuffsElbowRight", + undefined, undefined, undefined, undefined, undefined, "KittyPawCuffs"), + + + ]) +}); + +AddModel({ + Name: "KittyPetMittens", + Folder: "KittyPetPaws", + Parent: "KittyPetLeotard", + TopLevel: true, + Categories: ["Mittens", "Restraints"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPetMittenLeft"), + ...GetModelLayers("KittyPetMittenRight"), + ]) +}); + +AddModel(GetModelFashionVersion("KittyPetMittenLeft", true)); +AddModel(GetModelFashionVersion("KittyPetMittenRight", true)); +AddModel(GetModelFashionVersion("KittyPetMittens", true)); + + + +AddModel({ + Name: "KittyPetEars1", + Folder: "KittyPet", + Parent: "KittyPetEarmuffs", + TopLevel: false, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Ears1L", Layer: "Circlet", Pri: 40, + NoOverride: true, + Invariant: true, + }, + { Name: "Ears1R", Layer: "Circlet", Pri: 40.1, + NoOverride: true, + Invariant: true, + }, + { Name: "Ears1InnerL", Layer: "Circlet", Pri: 40, + TieToLayer: "Ears1L", + NoOverride: true, + Invariant: true, + }, + { Name: "Ears1InnerR", Layer: "Circlet", Pri: 40.1, + TieToLayer: "Ears1R", + NoOverride: true, + Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "KittyPetEars2", + Folder: "KittyPet", + Parent: "KittyPetEarmuffs", + TopLevel: false, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Ears2L", Layer: "Circlet", Pri: 40, + NoOverride: true, + Invariant: true, + }, + { Name: "Ears2R", Layer: "Circlet", Pri: 40.1, + NoOverride: true, + Invariant: true, + }, + { Name: "Ears2InnerL", Layer: "Circlet", Pri: 40, + TieToLayer: "Ears2L", + NoOverride: true, + Invariant: true, + }, + { Name: "Ears2InnerR", Layer: "Circlet", Pri: 40.1, + TieToLayer: "Ears2R", + NoOverride: true, + Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "KittyPetEarmuffs", + Folder: "KittyPet", + Parent: "KittyPetEarmuffs", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Band", Layer: "Circlet", Pri: 35, + HideWhenOverridden: true, + Invariant: true, + InheritColor: "Band", + }, + { Name: "EarmuffersL", Layer: "Circlet", Pri: 35.1, + TieToLayer: "Band", + NoOverride: true, + Invariant: true, + InheritColor: "EarmuffL", + }, + { Name: "EarmuffersR", Layer: "CircletUnder", Pri: -35, + NoOverride: true, + Invariant: true, + InheritColor: "EarmuffR", + }, + ]) +}); + +AddModel(GetModelRestraintVersion("KittyPetEarmuffs", true)); +AddModel(GetModelRestraintVersion("KittyPetEars1", true)); +AddModel(GetModelRestraintVersion("KittyPetEars2", true)); + + +AddModel({ + Name: "KittyPetGag", + Folder: "KittyPet", + TopLevel: true, + Restraint: true, + Categories: ["Restraints","Gags","Leather"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "Gag", Layer: "GagMuzzle", Pri: 30, + InheritColor: "Gag", + }, + { Name: "GagCollar", Layer: "NeckCorset", Pri: -50, + InheritColor: "Collar", + }, + ]) +}); +AddModel({ + Name: "KittyPetGagSeamless", + Folder: "KittyPet", + TopLevel: false, + Parent: "KittyPetGag", + Restraint: true, + Categories: ["Restraints","Gags","Leather"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "GagSeamless", Layer: "GagMuzzle", Pri: 30, + InheritColor: "Gag", + }, + { Name: "GagCollar", Layer: "NeckCorset", Pri: -50, + InheritColor: "Collar", + }, + ]) +}); +AddModel({ + Name: "KittyPetGagMouth", + Folder: "KittyPet", + TopLevel: false, + Parent: "KittyPetGag", + Restraint: true, + Categories: ["Restraints","Gags","Leather"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "GagMouth", Layer: "GagMuzzle", Pri: 30, + InheritColor: "Gag", + }, + { Name: "GagCollar", Layer: "NeckCorset", Pri: -50, + InheritColor: "Collar", + }, + ]) +}); +AddModel({ + Name: "KittyPetGagMouthSeamless", + Folder: "KittyPet", + TopLevel: false, + Parent: "KittyPetGag", + Restraint: true, + Categories: ["Restraints","Gags","Leather"], + AddPose: ["FaceCoverGag"], + Layers: ToLayerMap([ + { Name: "GagMouthSeamless", Layer: "GagMuzzle", Pri: 30, + InheritColor: "Gag", + }, + { Name: "GagCollar", Layer: "NeckCorset", Pri: -50, + InheritColor: "Collar", + }, + ]) +}); +AddModel(GetModelFashionVersion("KittyPetGag", true)); +AddModel(GetModelFashionVersion("KittyPetGagSeamless", true)); +AddModel(GetModelFashionVersion("KittyPetGagMouth", true)); +AddModel(GetModelFashionVersion("KittyPetGagMouthSeamless", true)); diff --git a/Data/ModelList_KittyPetCuffs.ts b/Data/ModelList_KittyPetCuffs.ts new file mode 100644 index 000000000..82c3688bd --- /dev/null +++ b/Data/ModelList_KittyPetCuffs.ts @@ -0,0 +1,247 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "KittyPetCuffsWristLeft", + Folder: "KittyPetCuffs", + TopLevel: false, + Parent: "KittyPetCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristLeft", "", "", "Cuff"), + ...GetModelLayers("ShacklesWristLeft", "Band", "", "Band", 0.4), + ]) +}); +AddModel({ + Name: "KittyPetCuffsWristRight", + Folder: "KittyPetCuffs", + TopLevel: false, + Parent: "KittyPetCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristRight", "", "", "Cuff"), + ...GetModelLayers("ShacklesWristRight", "Band", "", "Band", 0.4), + ]) +}); + +AddModel({ + Name: "KittyPetCuffsWrists", + Folder: "KittyPetCuffs", + TopLevel: false, + Parent: "KittyPetCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPetCuffsWristLeft"), + ...GetModelLayers("KittyPetCuffsWristRight"), + ]) +}); + + + +AddModel({ + Name: "KittyPetCuffsElbowLeft", + Folder: "KittyPetCuffs", + TopLevel: false, + Parent: "KittyPetCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft"], + Layers: ToLayerMap([ + { Name: "ElbowLeft", Layer: "BindElbowLeft", Pri: 1, + Poses: ToMap([...ARMPOSES]), + SwapLayerPose: {Front: "BindForeElbowLeft", Crossed: "BindCrossElbowLeft", Up: "BindForeElbowLeft"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + DisplacementSprite: "ElbowCuffLeft", + DisplaceLayers: ToMap(["Cuffs"]), + DisplaceAmount: 50, + InheritColor: "BaseMetal", + HidePoses: ToMap(["EncaseArmLeft"]), + }, + + { Name: "BandElbowLeft", Layer: "BindElbowLeft", Pri: 1.4, + Poses: ToMap([...ARMPOSES]), + SwapLayerPose: {Front: "BindForeElbowLeft", Crossed: "BindCrossElbowLeft", Up: "BindForeElbowLeft"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Band", + HidePoses: ToMap(["EncaseArmLeft"]), + TieToLayer: "ElbowLeft", + NoOverride: true, + }, + + ]) +}); +AddModel({ + Name: "KittyPetCuffsElbowRight", + Folder: "KittyPetCuffs", + TopLevel: false, + Parent: "KittyPetCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowRight"], + Layers: ToLayerMap([ + { Name: "ElbowRight", Layer: "BindElbowRight", Pri: 1, + Poses: ToMapSubtract([...ARMPOSES], ["Free"]), + SwapLayerPose: {Front: "BindForeElbowRight", Crossed: "BindCrossElbowRight", Up: "BindForeElbowRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + DisplacementSprite: "ElbowCuffRight", + DisplaceLayers: ToMap(["Cuffs"]), + DisplaceAmount: 100, + InheritColor: "BaseMetal", + HidePoses: ToMap(["EncaseArmRight"]), + }, + + { Name: "BandElbowRight", Layer: "BindElbowRight", Pri: 1.4, + Poses: ToMapSubtract([...ARMPOSES], ["Free"]), + SwapLayerPose: {Front: "BindForeElbowRight", Crossed: "BindCrossElbowRight", Up: "BindForeElbowRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Band", + HidePoses: ToMap(["EncaseArmRight"]), + TieToLayer: "ElbowRight", + NoOverride: true, + }, + + ]) +}); + +AddModel({ + Name: "KittyPetCuffsElbows", + Folder: "KittyPetCuffs", + TopLevel: false, + Parent: "KittyPetCuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPetCuffsElbowLeft"), + ...GetModelLayers("KittyPetCuffsElbowRight"), + ]) +}); + +AddModel({ + Name: "KittyPetCuffsArms", + Folder: "KittyPetCuffs", + TopLevel: true, + Parent: "KittyPetCuffs", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight", "WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPetCuffsWrists"), + ...GetModelLayers("KittyPetCuffsElbows"), + ]) +}); + +AddModel({ + Name: "KittyPetCuffsAnklesLeft", + Folder: "KittyPetCuffs", + TopLevel: false, + Parent: "KittyPetCuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesLeft", "", "", "Cuff"), + ...GetModelLayers("ShacklesAnklesLeft", "Band", "", "Band", 0.4), + ]) +}); + +AddModel({ + Name: "KittyPetCuffsAnklesRight", + Folder: "KittyPetCuffs", + TopLevel: false, + Parent: "KittyPetCuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesRight", "", "", "Cuff"), + ...GetModelLayers("ShacklesAnklesRight", "Band", "", "Band", 0.4), + ]) +}); + + +AddModel({ + Name: "KittyPetCuffsAnkles", + Folder: "KittyPetCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight", "AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPetCuffsAnklesRight"), + ...GetModelLayers("KittyPetCuffsAnklesLeft"), + ]) +}); + + + +AddModel({ + Name: "KittyPetCuffsThighLeft", + Folder: "KittyPetCuffs", + TopLevel: false, + Parent: "KittyPetCuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighLeft", "", "", "Cuff"), + ...GetModelLayers("ShacklesThighLeft", "Band", "", "Band", 0.4), + ]) +}); + +AddModel({ + Name: "KittyPetCuffsThighRight", + Folder: "KittyPetCuffs", + TopLevel: false, + Parent: "KittyPetCuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighRight", "", "", "Cuff"), + ...GetModelLayers("ShacklesThighRight", "Band", "", "Band", 0.4), + ]) +}); + + +AddModel({ + Name: "KittyPetCuffsThigh", + Folder: "KittyPetCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight", "ThighLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPetCuffsThighRight"), + ...GetModelLayers("KittyPetCuffsThighLeft"), + ]) +}); + + +AddModel({ + Name: "KittyPetCuffsCollar", + Folder: "KittyPetCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronCollar", "", "", "Cuff"), + ...GetModelLayers("IronCollar", "Band", "", "Band", 0.4), + ]) +}); + + + + +AddModel(GetModelFashionVersion("KittyPetCuffsCollar", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsWristLeft", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsWristRight", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsWrists", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsElbowLeft", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsElbowRight", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsElbows", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsArms", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsAnklesLeft", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsAnklesRight", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsAnkles", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsThighLeft", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsThighRight", true)); +AddModel(GetModelFashionVersion("KittyPetCuffsThigh", true)); \ No newline at end of file diff --git a/Data/ModelList_KittyPetsuit.ts b/Data/ModelList_KittyPetsuit.ts new file mode 100644 index 000000000..696dc4d8d --- /dev/null +++ b/Data/ModelList_KittyPetsuit.ts @@ -0,0 +1,314 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "KittyPetsuit", + Folder: "KittyPetsuit", + Parent: "KittyPetsuit", + TopLevel: true, + Categories: ["Restraints"], + Restraint: true, + AddPose: ["HideArms", "EncaseArmLeft", "EncaseArmRight", "EncaseUpper", "EncaseLower", "ForceKneel", "Petsuit"], + HideLayerGroups: ["PetsuitArms"], + Layers: ToLayerMap([ + { Name: "Arms", Layer: "BindForeArms", Pri: -31, + Invariant: true, + Poses: ToMap(["Front"]), + }, + { Name: "ArmsPaws", Layer: "BindForeArms", Pri: -30.9, + Invariant: true, + Poses: ToMap(["Front"]), + TieToLayer: "Arms", + }, + { Name: "Legs", Layer: "PetsuitLegs", Pri: -5, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + }, + { Name: "LeftLegs", Layer: "PetsuitLegs", Pri: -5, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Legs", + DisplaceAmount: 50, + DisplacementInvariant: true, + DisplaceLayers: ToMap(["Petsuit"]), + DisplacementSprite: "PetsuitSquish", + }, + { Name: "LeftLegsPaws", Layer: "PetsuitLegs", Pri: -4.9, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "FeetPaws", + NoOverride: true, + TieToLayer: "LeftLegs", + + }, + { Name: "FootRightKneel", Layer: "SockRightKneel", Pri: 25, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Legs", + HideWhenOverridden: true, + }, + { Name: "FootLeftHogtie", Layer: "SockLeftHogtie", Pri: 25, + Poses: ToMap(["Hogtie"]), + InheritColor: "Legs", + HideWhenOverridden: true, + }, + { Name: "FootLeftHogtiePaws", Layer: "SockLeftHogtie", Pri: 25.1, + Poses: ToMap(["Hogtie"]), + InheritColor: "FeetPaws", + NoOverride: true, + TieToLayer: "FootLeftHogtie", + }, + + { Name: "Leotard", Layer: "BodysuitOver", Pri: 50, + HideWhenOverridden: true, + MorphPoses: {Hogtie: "Hogtie"}, + InheritColor: "LowerBody", + }, + { Name: "LeotardChest", Layer: "SuitChestOver", Pri: 50, + HideWhenOverridden: true, + InheritColor: "UpperBody", + }, + { Name: "Collar", Layer: "Collar", Pri: -100, + InheritColor: "Collar", + NoOverride: true, + }, + ]) +}); + + + +AddModel({ + Name: "KittyPetSockLeft", + Folder: "KittyPetSocks", + Parent: "KittyPetSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockLeft", Layer: "StockingLeft", Pri: -3, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingLeft: true,}, + DisplacementSprite: "SockLSquish_Long", + DisplaceAmount: 10, + }, + { Name: "SockLeftPaws", Layer: "StockingLeft", Pri: -2.9, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + TieToLayer: "SockLeft", + InheritColor: "PawLeft", + NoOverride: true, + }, + { Name: "FootLeftHogtie", Layer: "SockLeftHogtie", Pri: -3.5, + Poses: ToMap(["Hogtie"]), + InheritColor: "SockLeft", + Invariant: true, + }, + { Name: "FootLeftHogtiePaws", Layer: "SockLeftHogtie", Pri: -3.4, + Poses: ToMap(["Hogtie"]), + InheritColor: "PawLeft", + Invariant: true, + TieToLayer: "FootLeftHogtie", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "KittyPetSockRight", + Folder: "KittyPetSocks", + Parent: "KittyPetSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockRight", Layer: "StockingRight", Pri: -3, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingRight: true,}, + DisplacementSprite: "SockRSquish_Long", + DisplaceAmount: 10, + }, + { Name: "FootRightKneel", Layer: "SockRightKneel", Pri: -1.5, + HidePoses: ToMap(["FeetLinked"]), + Poses: ToMap(["Kneel"]), + InheritColor: "SockRight", + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "KittyPetSocks", + Folder: "KittyPetSocks", + Parent: "KittyPetLeotard", + TopLevel: true, + Categories: ["Socks"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPetSockRight"), + ...GetModelLayers("KittyPetSockLeft"), + ]) +}); + +AddModel(GetModelRestraintVersion("KittyPetSocks", true)); + + + +AddModel({ + Name: "KittyPetPawLeft", + Folder: "KittyPetPaws", + Parent: "KittyPetPaws", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockLeft", Layer: "StockingLeft", Pri: -3, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingLeft: true,}, + DisplacementSprite: "SockLSquish_Long", + DisplaceAmount: 10, + }, + { Name: "SockLeftPaws", Layer: "StockingLeft", Pri: -2.9, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + TieToLayer: "SockLeft", + InheritColor: "PawLeft", + NoOverride: true, + }, + { Name: "FootLeftHogtie", Layer: "SockLeftHogtie", Pri: -3.5, + Poses: ToMap(["Hogtie"]), + InheritColor: "SockLeft", + Invariant: true, + }, + { Name: "FootLeftHogtiePaws", Layer: "SockLeftHogtie", Pri: -3.4, + Poses: ToMap(["Hogtie"]), + InheritColor: "PawLeft", + Invariant: true, + TieToLayer: "FootLeftHogtie", + NoOverride: true, + }, + + + ...GetModelLayers("KittyPawCuffsThighLeft", + undefined, undefined, undefined, undefined, undefined, "KittyPawCuffs"), + ...GetModelLayers("KittyPawCuffsAnklesLeft", + undefined, undefined, undefined, undefined, undefined, "KittyPawCuffs"), + ]) +}); +AddModel({ + Name: "KittyPetPawRight", + Folder: "KittyPetPaws", + Parent: "KittyPetPaws", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockRight", Layer: "StockingRight", Pri: -3, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingRight: true,}, + DisplacementSprite: "SockRSquish_Long", + DisplaceAmount: 10, + }, + { Name: "FootRightKneel", Layer: "SockRightKneel", Pri: -1.5, + HidePoses: ToMap(["FeetLinked"]), + Poses: ToMap(["Kneel"]), + InheritColor: "SockRight", + Invariant: true, + HideWhenOverridden: true, + }, + ...GetModelLayers("KittyPawCuffsThighRight", + undefined, undefined, undefined, undefined, undefined, "KittyPawCuffs"), + ...GetModelLayers("KittyPawCuffsAnklesRight", + undefined, undefined, undefined, undefined, undefined, "KittyPawCuffs"), + ]) +}); + +AddModel({ + Name: "KittyPetPaws", + Folder: "KittyPetPaws", + Parent: "KittyPetLeotard", + TopLevel: true, + Categories: ["Socks", "Cosplay"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPetPawRight"), + ...GetModelLayers("KittyPetPawLeft"), + ]) +}); + +AddModel(GetModelRestraintVersion("KittyPetPaws", true)); + + + +AddModel({ + Name: "KittyPetPawShortLeft", + Folder: "KittyPetPawsShort", + Parent: "KittyPetPaws", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockLeft", Layer: "StockingLeft", Pri: -3, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingLeft: true,}, + DisplacementSprite: "SockLSquish_Long", + DisplaceAmount: 10, + }, + { Name: "SockLeftPaws", Layer: "StockingLeft", Pri: -2.9, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + TieToLayer: "SockLeft", + InheritColor: "PawLeft", + NoOverride: true, + }, + { Name: "FootLeftHogtie", Layer: "SockLeftHogtie", Pri: -3.5, + Poses: ToMap(["Hogtie"]), + InheritColor: "SockLeft", + Invariant: true, + }, + { Name: "FootLeftHogtiePaws", Layer: "SockLeftHogtie", Pri: -3.4, + Poses: ToMap(["Hogtie"]), + InheritColor: "PawLeft", + Invariant: true, + TieToLayer: "FootLeftHogtie", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "KittyPetPawShortRight", + Folder: "KittyPetPawsShort", + Parent: "KittyPetPaws", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockRight", Layer: "StockingRight", Pri: -3, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingRight: true,}, + DisplacementSprite: "SockRSquish_Long", + DisplaceAmount: 10, + }, + { Name: "FootRightKneel", Layer: "SockRightKneel", Pri: -1.5, + HidePoses: ToMap(["FeetLinked"]), + Poses: ToMap(["Kneel"]), + InheritColor: "SockRight", + Invariant: true, + HideWhenOverridden: true, + }, + ]) +}); + +AddModel({ + Name: "KittyPetPawsShort", + Folder: "KittyPetPawsShort", + Parent: "KittyPetPaws", + TopLevel: false, + Categories: ["Socks", "Cosplay"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyPetPawShortRight"), + ...GetModelLayers("KittyPetPawShortLeft"), + ]) +}); + +AddModel(GetModelRestraintVersion("KittyPetPawsShort", true)); \ No newline at end of file diff --git a/Data/ModelList_LeatherCuffs.ts b/Data/ModelList_LeatherCuffs.ts new file mode 100644 index 000000000..2bb172f94 --- /dev/null +++ b/Data/ModelList_LeatherCuffs.ts @@ -0,0 +1,264 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "CuffsWristLeft", + Folder: "LeatherCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristLeft", "", "", "Cuff"), + ...GetModelLayers("ShacklesWristLeft", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesWristLeft", "Hardware", "", "Hardware", 0.4), + ]) +}); +AddModel({ + Name: "CuffsWristRight", + Folder: "LeatherCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristRight", "", "", "Cuff"), + ...GetModelLayers("ShacklesWristRight", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesWristRight", "Hardware", "", "Hardware", 0.4), + ]) +}); + +AddModel({ + Name: "CuffsWrists", + Folder: "LeatherCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("CuffsWristLeft"), + ...GetModelLayers("CuffsWristRight"), + ]) +}); + + + +AddModel({ + Name: "CuffsElbowLeft", + Folder: "LeatherCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowLeft", "", "", "Cuff"), + ...GetModelLayers("ShacklesElbowLeft", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesElbowLeft", "Hardware", "", "Hardware", 0.4), + ]) +}); +AddModel({ + Name: "CuffsElbowRight", + Folder: "LeatherCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowRight", "", "", "Cuff"), + ...GetModelLayers("ShacklesElbowRight", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesElbowRight", "Hardware", "", "Hardware", 0.4), + ]) +}); + +AddModel({ + Name: "CuffsElbows", + Folder: "LeatherCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("CuffsElbowLeft"), + ...GetModelLayers("CuffsElbowRight"), + ]) +}); + +AddModel({ + Name: "CuffsArms", + Folder: "LeatherCuffs", + TopLevel: true, + Parent: "Cuffs", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight", "WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("CuffsWrists"), + ...GetModelLayers("CuffsElbows"), + ]) +}); + +AddModel({ + Name: "CuffsAnklesLeft", + Folder: "LeatherCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesLeft", "", "", "Cuff"), + ...GetModelLayers("ShacklesAnklesLeft", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesAnklesLeft", "Hardware", "", "Hardware", 0.4), + ]) +}); + +AddModel({ + Name: "CuffsAnklesRight", + Folder: "LeatherCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesRight", "", "", "Cuff"), + ...GetModelLayers("ShacklesAnklesRight", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesAnklesRight", "Hardware", "", "Hardware", 0.4), + ]) +}); + + +AddModel({ + Name: "CuffsAnkles", + Folder: "LeatherCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight", "AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("CuffsAnklesRight"), + ...GetModelLayers("CuffsAnklesLeft"), + ]) +}); + + + +AddModel({ + Name: "CuffsThighLeft", + Folder: "LeatherCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighLeft", "", "", "Cuff"), + ...GetModelLayers("ShacklesThighLeft", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesThighLeft", "Hardware", "", "Hardware", 0.4), + ]) +}); + +AddModel({ + Name: "CuffsThighRight", + Folder: "LeatherCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighRight", "", "", "Cuff"), + ...GetModelLayers("ShacklesThighRight", "Band", "", "Band", 0.4), + ...GetModelLayers("ShacklesThighRight", "Hardware", "", "Hardware", 0.4), + ]) +}); + + +AddModel({ + Name: "CuffsThigh", + Folder: "LeatherCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight", "ThighLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("CuffsThighRight"), + ...GetModelLayers("CuffsThighLeft"), + ]) +}); + + +AddModel({ + Name: "LeatherCollar", + Folder: "LeatherCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronCollar", "", "", "Cuff"), + ...GetModelLayers("IronCollar", "Band", "", "Band", 0.4), + ...GetModelLayers("IronCollar", "Hardware", "", "Hardware", 0.4), + ]) +}); + +AddModel({ + Name: "LeatherCollarBell", + Folder: "LeatherCuffs", + Parent: "LeatherCollar", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronCollar", "", "", "Cuff"), + ...GetModelLayers("IronCollar", "Band", "", "Band", 0.4), + ...GetModelLayers("IronCollar", "Hardware", "", "Hardware", 0.4), + ...GetModelLayers("IronCollar", "Bell", "", "Bell", 0.5, "CollarAcc"), + ]) +}); +AddModel({ + Name: "LeatherCollarBow", + Folder: "LeatherCuffs", + Parent: "LeatherCollar", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronCollar", "", "", "Cuff"), + ...GetModelLayers("IronCollar", "Band", "", "Band", 0.4), + ...GetModelLayers("IronCollar", "Hardware", "", "Hardware", 0.4), + ...GetModelLayers("IronCollar", "BowBell", "", "Bell", 0.6, "CollarAcc"), + ...GetModelLayers("IronCollar", "Bow", "", "Bow", 0.5, "CollarAcc"), + ]) +}); + +AddModel({ + Name: "LeatherBelt", + Folder: "LeatherCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronBelt", "", "", "Cuff"), + ...GetModelLayers("IronBelt", "Band", "", "Band", 0.4), + ...GetModelLayers("IronBelt", "Hardware", "", "Hardware", 0.4), + ]) +}); + + + + +AddModel(GetModelFashionVersion("LeatherCollar", true)); +AddModel(GetModelFashionVersion("LeatherBelt", true)); +AddModel(GetModelFashionVersion("LeatherCollarBell", true)); +AddModel(GetModelFashionVersion("LeatherCollarBow", true)); +AddModel(GetModelFashionVersion("CuffsWristLeft", true)); +AddModel(GetModelFashionVersion("CuffsWristRight", true)); +AddModel(GetModelFashionVersion("CuffsWrists", true)); +AddModel(GetModelFashionVersion("CuffsElbowLeft", true)); +AddModel(GetModelFashionVersion("CuffsElbowRight", true)); +AddModel(GetModelFashionVersion("CuffsElbows", true)); +AddModel(GetModelFashionVersion("CuffsArms", true)); +AddModel(GetModelFashionVersion("CuffsAnklesLeft", true)); +AddModel(GetModelFashionVersion("CuffsAnklesRight", true)); +AddModel(GetModelFashionVersion("CuffsAnkles", true)); +AddModel(GetModelFashionVersion("CuffsThighLeft", true)); +AddModel(GetModelFashionVersion("CuffsThighRight", true)); +AddModel(GetModelFashionVersion("CuffsThigh", true)); \ No newline at end of file diff --git a/Data/ModelList_Leotards.ts b/Data/ModelList_Leotards.ts new file mode 100644 index 000000000..c5a84b96e --- /dev/null +++ b/Data/ModelList_Leotards.ts @@ -0,0 +1,453 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "SwimsuitUnder", + Folder: "Swimsuit", + Parent: "Swimsuit", + TopLevel: false, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "Swimsuit", Layer: "Bodysuit", Pri: 5, + //swaplayerpose: {Kneel: "BodysuitLower", KneelClosed: "BodysuitLower"}, + Poses: ToMap([...LEGPOSES]), + }, + { Name: "SwimsuitChest", Layer: "SuitChest", Pri: 5, + Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Swimsuit", + }, + ]) +}); +AddModel({ + Name: "Swimsuit", + Folder: "Swimsuit", + Parent: "Swimsuit", + TopLevel: true, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "Swimsuit", Layer: "BodysuitOver", Pri: 5, + //swaplayerpose: {Kneel: "BodysuitLower", KneelClosed: "BodysuitLower"}, + Poses: ToMap([...LEGPOSES]), + }, + { Name: "SwimsuitChest", Layer: "SuitChestOver", Pri: 5, + Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Swimsuit", + }, + ]) +}); + +AddModel(GetModelRestraintVersion("Swimsuit", true)); + + +AddModel({ + Name: "StrappyBra", + Folder: "Swimsuit", + Parent: "StrappySwimsuit", + TopLevel: true, + Categories: ["Bras"], + Layers: ToLayerMap([ + { Name: "ChestStrappy", Layer: "SuitChest", Pri: 40, + Poses: ToMap([...ARMPOSES]), + InheritColor: "Bra", + }, + ]) +}); + +AddModel({ + Name: "VBikini", + Folder: "Swimsuit", + Parent: "StrappySwimsuit", + TopLevel: true, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + { Name: "VBikini", Layer: "Panties", Pri: 39, + Invariant: true, + //swaplayerpose: {Kneel: "PantiesLower", KneelClosed: "PantiesLower"}, + MorphPoses: {Closed: "Closed", Hogtie: "Closed"}, + }, + ]) +}); + +AddModel({ + Name: "StrappyBikini", + Folder: "Swimsuit", + Parent: "StrappySwimsuit", + TopLevel: true, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + { Name: "StrappyLower", Layer: "Panties", Pri: 40, + Invariant: true, + MorphPoses: {Closed: "Closed"}, + //swaplayerpose: {Kneel: "PantiesLower", KneelClosed: "PantiesLower"}, + }, + ]) +}); + +AddModel({ + Name: "StrappyHarness", + Folder: "Swimsuit", + Parent: "StrappySwimsuit", + TopLevel: true, + Categories: ["Corsets"], + Layers: ToLayerMap([ + { Name: "Strappy", Layer: "Bodysuit", Pri: 40, + Poses: ToMap([...LEGPOSES]), + Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "StrappySwimsuit", + Folder: "Swimsuit", + TopLevel: true, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + ...GetModelLayers("StrappyBra"), + ...GetModelLayers("StrappyHarness"), + ...GetModelLayers("StrappyBikini"), + ]) +}); + + + +AddModel({ + Name: "BunnySockLeft", + Folder: "Bunny", + Parent: "BunnySocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockLeft", Layer: "StockingLeft", Pri: -1, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingLeft: true,}, + DisplacementSprite: "SockLSquish_Long", + DisplaceAmount: 10, + }, + /*{ Name: "LegSockLeft", Layer: "BodysuitLower", Pri: 80, + NoOverride: true, + TieToLayer: "SockLeft", + InheritColor: "SockLeft", + Poses: ToMap([...STANDPOSES, "Hogtie"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + },*/ + { Name: "FootSockLeftHogtie", Layer: "SockLeftHogtie", Pri: -1, + Poses: ToMap(["Hogtie"]), + InheritColor: "SockLeft", + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "BunnySockRight", + Folder: "Bunny", + Parent: "BunnySocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockRight", Layer: "StockingRight", Pri: -1, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingRight: true,}, + DisplacementSprite: "SockRSquish_Long", + DisplaceAmount: 10, + }, + /*{ Name: "LegSockRight", Layer: "BodysuitLower", Pri: 80, + NoOverride: true, + TieToLayer: "SockRight", + InheritColor: "SockRight", + Poses: ToMap([...STANDPOSES, "Hogtie"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + },*/ + { Name: "FootSockRightKneel", Layer: "SockRightKneel", Pri: 1.5, + HidePoses: ToMap(["FeetLinked"]), + Poses: ToMap(["Kneel"]), + InheritColor: "SockRight", + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "BunnySocks", + Folder: "Bunny", + Parent: "Bunny", + TopLevel: true, + Categories: ["Socks"], + Layers: ToLayerMap([ + ...GetModelLayers("BunnySockRight"), + ...GetModelLayers("BunnySockLeft"), + ]) +}); + +AddModel(GetModelRestraintVersion("BunnySocks", true)); + + + +AddModel({ + Name: "BunnyGloveLeft", + Folder: "Bunny", + Parent: "Bunny", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveLeft", Layer: "GloveLeft", Pri: -1, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "ForeGloveLeft", Layer: "ForeGloveLeft", Pri: -1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveLeft"}, + }, + ]) +}); + +AddModel({ + Name: "BunnyGloveRight", + Folder: "Bunny", + Parent: "Bunny", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveRight", Layer: "GloveRight", Pri: -1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "ForeGloveRight", Layer: "ForeGloveRight", Pri: -1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + ]) +}); + +AddModel({ + Name: "BunnyGloves", + Folder: "Bunny", + Parent: "Bunny", + TopLevel: true, + Categories: ["Gloves"], + Layers: ToLayerMap([ + ...GetModelLayers("BunnyGloveLeft"), + ...GetModelLayers("BunnyGloveRight"), + ]) +}); + +AddModel(GetModelRestraintVersion("BunnyGloves", true)); + +AddModel({ + Name: "BunnyLeotardUnder", + Folder: "Bunny", + Parent: "Bunny", + TopLevel: false, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "Leotard", Layer: "Bodysuit", Pri: -1, + //swaplayerpose: {Kneel: "BodysuitLower", KneelClosed: "BodysuitLower"}, + MorphPoses: {Closed: "Closed"} + }, + { Name: "LeotardChest", Layer: "SuitChest", Pri: 1.5, + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Leotard", + }, + ]) +}); +AddModel({ + Name: "BunnyLeotardHighUnder", + Folder: "Bunny", + Parent: "BunnyLeotard", + TopLevel: false, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "HighLeotard", Layer: "Bodysuit", Pri: -0.9, + //swaplayerpose: {Kneel: "BodysuitLower", KneelClosed: "BodysuitLower"}, + MorphPoses: {Closed: "Closed"} + }, + { Name: "LeotardChest", Layer: "SuitChest", Pri: 1.6, + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Leotard", + }, + ]) +}); + + +AddModel({ + Name: "BunnyLeotard", + Folder: "Bunny", + Parent: "Bunny", + TopLevel: true, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "Leotard", Layer: "BodysuitOver", Pri: -1, + //swaplayerpose: {Kneel: "BodysuitLower", KneelClosed: "BodysuitLower"}, + MorphPoses: {Closed: "Closed"} + }, + { Name: "LeotardChest", Layer: "SuitChestOver", Pri: 1.5, + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Leotard", + }, + ]) +}); +AddModel({ + Name: "BunnyLeotardHigh", + Folder: "Bunny", + Parent: "BunnyLeotard", + TopLevel: false, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "HighLeotard", Layer: "BodysuitOver", Pri: -0.9, + //swaplayerpose: {Kneel: "BodysuitLower", KneelClosed: "BodysuitLower"}, + MorphPoses: {Closed: "Closed"} + }, + { Name: "LeotardChest", Layer: "SuitChestOver", Pri: 1.6, + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Leotard", + }, + ]) +}); + +AddModel({ + Name: "Bunny", + Folder: "Bunny", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("BunnyLeotard"), + ...GetModelLayers("BunnyGloves"), + ...GetModelLayers("BunnySocks"), + ]) +}); + + + +AddModel({ + Name: "LeatherLeotardTop", + Folder: "LeatherLeotard", + Parent: "LeatherLeotard", + TopLevel: false, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "LeotardChest", Layer: "SuitChestOver", Pri: 45, + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Leather", + }, + ]) +}); +AddModel({ + Name: "LeatherLeotardBottom", + Folder: "LeatherLeotard", + Parent: "LeatherLeotard", + TopLevel: false, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "Leotard", Layer: "BodysuitOver", Pri: 30, + InheritColor: "Leather", + MorphPoses: {Closed: "Closed"} + }, + ]) +}); +AddModel({ + Name: "LeatherLeotardCorset", + Folder: "LeatherLeotard", + Parent: "LeatherLeotard", + TopLevel: true, + Categories: ["Corsets"], + Layers: ToLayerMap([ + { Name: "LeotardCorset", Layer: "Bustier", Pri: -20, + InheritColor: "Corset", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + NoOverride: true, + }, + { Name: "Laces", Layer: "BodysuitOver", Pri: 30.1, + InheritColor: "Laces", + TieToLayer: "Leotard", + NoOverride: true, + }, + ]) +}); + + +AddModel({ + Name: "LeatherLeotard", + Folder: "LeatherLeotard", + Parent: "LeatherLeotard", + TopLevel: true, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + ...GetModelLayers("LeatherLeotardTop"), + ...GetModelLayers("LeatherLeotardBottom"), + ...GetModelLayers("LeatherLeotardCorset"), + ]) +}); + + +AddModel({ + Name: "LeatherLeotardStrapsUpper", + Folder: "LeatherLeotard", + Parent: "LeatherLeotard", + TopLevel: false, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "StrapsChest", Layer: "SuitChestOver", Pri: 45.1, + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Straps", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "LeatherLeotardStrapsLower", + Folder: "LeatherLeotard", + Parent: "LeatherLeotard", + TopLevel: false, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "StrapsLower", Layer: "BodysuitOver", Pri: 30.1, + InheritColor: "Straps", + NoOverride: true, + MorphPoses: {Closed: "Closed"} + }, + { Name: "StrapsHardware", Layer: "BodysuitOver", Pri: 30.2, + InheritColor: "Hardware", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "LeatherLeotardStrapsLowerClean", + Folder: "LeatherLeotard", + Parent: "LeatherLeotard", + TopLevel: false, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "StrapsLowerClean", Layer: "BodysuitOver", Pri: 30.1, + InheritColor: "Straps", + NoOverride: true, + MorphPoses: {Closed: "Closed"} + }, + { Name: "StrapsHardware", Layer: "BodysuitOver", Pri: 30.2, + InheritColor: "Hardware", + NoOverride: true, + }, + ]) +}); + diff --git a/Data/ModelList_MaidKnightHeavy.ts b/Data/ModelList_MaidKnightHeavy.ts new file mode 100644 index 000000000..9fa8a8002 --- /dev/null +++ b/Data/ModelList_MaidKnightHeavy.ts @@ -0,0 +1,782 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "HeavyMaidKnight_Dress", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Tops", "Dresses", "Skirts"], + //RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "Dress", Layer: "Shirt", Pri: 5, + InheritColor: "Dress", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + HidePoses: ToMap(["EncaseTorsoUpper", "SkimpyUpper"]), + DisplaceAmount: 125, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "TightUpperSquish", + DisplacementInvariant: true, + Invariant: true, + }, + { Name: "DressChest", Layer: "ShirtChest", Pri: 5, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + HidePoses: ToMap(["EncaseTorsoUpper"]), + InheritColor: "Dress", + MorphPoses: {Front: "Boxtie", Crossed: "Boxtie"}, + }, + { Name: "DressSkirt", Layer: "SkirtOver", Pri: 6, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie"}, + HidePoses: ToMap(["EncaseTorsoLower"]), + InheritColor: "Skirt", + }, + { Name: "DressSkirtHem", Layer: "SkirtOver", Pri: 5.9, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie"}, + InheritColor: "SkirtHem", + TieToLayer: "DressSkirt", + NoOverride: true, + }, + { Name: "DressSkirtStripe", Layer: "SkirtOver", Pri: 6.1, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie"}, + InheritColor: "SkirtStripe", + TieToLayer: "DressSkirt", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "HeavyMaidKnight_SleeveLeft", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: false, + Categories: ["Sleeves"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "SleeveLeft", Layer: "SleeveLeft", Pri: 40, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + { Name: "SleeveLeftStripe", Layer: "SleeveLeft", Pri: 40.1, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveLeftStripe", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + NoOverride: true, + TieToLayer: "SleeveLeft", + }, + { Name: "ArmLeft", Layer: "TightSleeveLeft", Pri: 30, + Poses: ToMap([...ARMPOSES]), + InheritColor: "ArmLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + { Name: "ForeArmLeft", Layer: "ForeSleeveLeft", Pri: 40, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "ArmLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossSleeveLeft"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + + ]) +}); + +AddModel({ + Name: "HeavyMaidKnight_SleeveRight", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: false, + Categories: ["Sleeves"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "SleeveRight", Layer: "SleeveRight", Pri: 40, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + EraseSprite: "LightMaidRightArmErase", + EraseLayers: {MaidArmPoofRight: true}, + EraseAmount: 100, + EraseZBonus: 8600, + EraseInvariant: true, + }, + { Name: "SleeveRightStripe", Layer: "SleeveRight", Pri: 40.1, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveRightStripe", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + NoOverride: true, + TieToLayer: "SleeveRight", + }, + { Name: "ArmRight", Layer: "TightSleeveRight", Pri: 40, + Poses: ToMap([...ARMPOSES]), + InheritColor: "ArmRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + + }, + { Name: "ForeArmRight", Layer: "ForeSleeveRight", Pri: 40, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "ArmRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossSleeveRight"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + }, + { Name: "ShoulderRight", Layer: "UpSleeveRight", Pri: 40, + HideWhenOverridden: true, + InheritColor: "SleeveRight", + Poses: ToMap([...SHOULDERPOSES]), + }, + ]) +}); + + +AddModel({ + Name: "HeavyMaidKnight_ChestArmor", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "ChestArmor", Layer: "ChestplateOver", Pri: 35, + HideWhenOverridden: true, + Invariant: true, + NoOverride: true, + HidePoseConditional: [ + ["DynamicArmor", "ChestArmor", "SuppressDynamic"], + ], + }, + ]) +}); + + +AddModel({ + Name: "HeavyMaidKnight_GloveLeft", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveLeft", Layer: "GloveLeft", Pri: -3, + Poses: ToMapSubtract([...ARMPOSES], ["Crossed", "Boxtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Front: "ForeGloveLeft"}, + HideWhenOverridden: true, + }, + ]) +}); + +AddModel({ + Name: "HeavyMaidKnight_GloveRight", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveRight", Layer: "GloveRight", Pri: -3, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight", Front: "ForeGloveRight"}, + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "HeavyMaidKnight_Gloves", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Gloves"], + Layers: ToLayerMap([ + ...GetModelLayers("HeavyMaidKnight_GloveLeft"), + ...GetModelLayers("HeavyMaidKnight_GloveRight"), + ]) +}); + + + + +AddModel({ + Name: "HeavyMaidKnight_GauntletLeft", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight_Gauntlets", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GauntletLeft", Layer: "GloveLeft", Pri: 35, + Poses: ToMapSubtract([...ARMPOSES], ["Boxtie"]), + SwapLayerPose: {Front: "ForeGloveLeft", Crossed: "CrossGloveLeft"}, + HideWhenOverridden: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HidePoseConditional: [ + ["DynamicArmor", "GlovesArmor", "SuppressDynamic"], + ], + }, + ]) +}); + + +AddModel({ + Name: "HeavyMaidKnight_GauntletRight", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight_Gauntlets", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GauntletRight", Layer: "GloveRight", Pri: 35, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + SwapLayerPose: {Front: "ForeGloveRight", Crossed: "CrossGloveRight"}, + HideWhenOverridden: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HidePoseConditional: [ + ["DynamicArmor", "GlovesArmor", "SuppressDynamic"], + ], + }, + ]) +}); + +AddModel({ + Name: "HeavyMaidKnight_Gauntlets", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Gloves"], + Layers: ToLayerMap([ + ...GetModelLayers("HeavyMaidKnight_GauntletLeft"), + ...GetModelLayers("HeavyMaidKnight_GauntletRight"), + ]) +}); + + + +AddModel({ + Name: "HeavyMaidKnight_PauldronLeft", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight_Pauldrons", + TopLevel: false, + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "PauldronLeft", Layer: "Shoulders", Pri: 150, + Invariant: true, + MorphPoses: { + Yoked: "Yoked", + Up: "Up", + }, + HideWhenOverridden: true, + HidePoseConditional: [ + ["DynamicArmor", "ArmArmor", "SuppressDynamic"], + ], + }, + { Name: "PauldronLeftStraps", Layer: "UpperArmStraps", Pri: -30, + Invariant: true, + MorphPoses: { + Yoked: "Yoked", + Up: "Up", + }, + HidePoseConditional: [ + ["DynamicArmor", "ArmArmor", "SuppressDynamic"], + ], + }, + { Name: "PauldronLeftHardware", Layer: "Shoulders", Pri: 151, + Invariant: true, + TieToLayer: "PauldronLeft", + NoOverride: true, + MorphPoses: { + Yoked: "Yoked", + Up: "Up", + }, + HidePoseConditional: [ + ["DynamicArmor", "ArmArmor", "SuppressDynamic"], + ], + }, + ]) +}); + +AddModel({ + Name: "HeavyMaidKnight_PauldronRight", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight_Pauldrons", + TopLevel: false, + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "PauldronRight", Layer: "Shoulders", Pri: 150, + Invariant: true, + MorphPoses: { + Yoked: "Yoked", + Up: "Up", + }, + HideWhenOverridden: true, + HidePoseConditional: [ + ["DynamicArmor", "ArmArmor", "SuppressDynamic"], + ], + }, + { Name: "PauldronRightStraps", Layer: "UpperArmStrapsBack", Pri: -30, + Invariant: true, + MorphPoses: { + Yoked: "Yoked", + Up: "Up", + }, + HidePoseConditional: [ + ["DynamicArmor", "ArmArmor", "SuppressDynamic"], + ], + }, + ]) +}); + + + +AddModel({ + Name: "HeavyMaidKnight_Pauldrons", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Armor"], + Layers: ToLayerMap([ + ...GetModelLayers("HeavyMaidKnight_PauldronLeft"), + ...GetModelLayers("HeavyMaidKnight_PauldronRight"), + ]) +}); + + +AddModel({ + Name: "HeavyMaidKnight_SideArmor", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "SideArmor", Layer: "BeltArmor", Pri: 35, + HideWhenOverridden: true, + Invariant: true, + NoOverride: true, + HidePoseConditional: [ + ["DynamicArmor", "TorsoArmor", "SuppressDynamic"], + ], + }, + ]) +}); + + +AddModel({ + Name: "HeavyMaidKnight_Corset", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Corsets"], + AddPose: ["Corset"], + Layers: ToLayerMap([ + { Name: "Corset", Layer: "OverCorset", Pri: 20, + Invariant: true, + InheritColor: "Corset", + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + NoOverride: true, + HideWhenOverridden: true, + }, + ]) +}); + +AddModel(GetModelRestraintVersion("HeavyMaidKnight_Corset", true)); + +AddModel({ + Name: "HeavyMaidKnight_Sleeves", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("HeavyMaidKnight_SleeveLeft"), + ...GetModelLayers("HeavyMaidKnight_SleeveRight"), + ]) +}); + + + +AddModel({ + Name: "HeavyMaidKnight_ApronBottom", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight_Apron", + TopLevel: false, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Apron", Layer: "Apron", Pri: 15, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie"}, + Invariant: true, + }, + { Name: "ApronBelt", Layer: "Apron", Pri: 14, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie"}, + Invariant: true, + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + TieToLayer: "Apron", + }, + { Name: "ApronMiniBow", Layer: "Apron", Pri: 15.1, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie"}, + Invariant: true, + NoOverride: true, + TieToLayer: "Apron", + }, + { Name: "ApronCross", Layer: "Apron", Pri: 15.1, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie"}, + Invariant: true, + NoOverride: true, + TieToLayer: "Apron", + }, + { Name: "ApronStripe", Layer: "Apron", Pri: 15.1, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie"}, + Invariant: true, + NoOverride: true, + TieToLayer: "Apron", + }, + { Name: "ApronPattern", Layer: "Apron", Pri: 15.1, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie"}, + Invariant: true, + NoOverride: true, + TieToLayer: "Apron", + }, + + ]) +}); + +AddModel({ + Name: "HeavyMaidKnight_ApronTop", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight_Apron", + TopLevel: false, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "ApronChest", Layer: "ChestDeco", Pri: -30, + InheritColor: "Top", + Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "ApronChestRuffles", Layer: "ChestDeco", Pri: -29.9, + InheritColor: "TopRuffles", + Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + NoOverride: true, + TieToLayer: "ApronChest", + MorphPoses: { + Free: "Free", + Boxtie: "Boxtie", + Wristtie: "Boxtie", + Crossed: "Crossed", + Front: "Front", + Yoked: "Yoked", + Up: "Up", + }, + }, + { Name: "ApronChestBelts", Layer: "ChestDeco", Pri: -29.8, + InheritColor: "TopBelts", + Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + NoOverride: true, + TieToLayer: "ApronChest", + MorphPoses: { + Up: "Up", + }, + }, + + + ]) +}); + +AddModel({ + Name: "HeavyMaidKnight_Apron", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("HeavyMaidKnight_ApronTop"), + ...GetModelLayers("HeavyMaidKnight_ApronBottom"), + + ]) +}); + + + +AddModel({ + Name: "HeavyMaidKnight_WaistBelts", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight_Waist", + TopLevel: false, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Belts", Layer: "Belt", Pri: 25, + Poses: ToMap([...LEGPOSES]), + Invariant: true, + NoOverride: true, + }, + { Name: "BeltsHardware", Layer: "Belt", Pri: 25.1, + Poses: ToMap([...LEGPOSES]), + Invariant: true, + TieToLayer: "Belts", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "HeavyMaidKnight_WaistPouches", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight_Waist", + TopLevel: false, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Pouches", Layer: "BeltDeco", Pri: 35, + Poses: ToMap([...LEGPOSES]), + Invariant: true, + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "HeavyMaidKnight_Waist", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("HeavyMaidKnight_WaistPouches"), + ...GetModelLayers("HeavyMaidKnight_WaistBelts"), + + ]) +}); + + + +AddModel({ + Name: "HeavyMaidKnight_Boots", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + { Name: "BootLeft", Layer: "ShoeLeft", Pri: 131, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + + DisplacementPosesExclude: ["Hogtie"], + ErasePosesExclude: ["Hogtie"], + + DisplacementSprite: "Heels2", + DisplaceAmount: 80, + DisplaceLayers: ToMap(["Heels"]), + DisplaceZBonus: 10000, + EraseInvariant: true, + EraseMorph: {Spread: "Spread", Closed: "Closed"}, + EraseSprite: "HeelsErase", + EraseAmount: 100, + EraseLayers: ToMap(["Heels"]), + + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + + InheritColor: "BootLeft", + }, + { Name: "BootRight", Layer: "ShoeRight", Pri: 131, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "Kneel", "KneelClosed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "HeelsRightErase2", + EraseAmount: 100, + EraseLayers: ToMap(["HeelRight"]), + EraseZBonus: 100, + + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + + InheritColor: "BootRight", + }, + { Name: "BootShoeLeft", Layer: "ShoeLeft", Pri: 130.9, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + TieToLayer: "BootLeft", NoOverride: true, + + InheritColor: "ShoeLeft", + }, + { Name: "BootShoeRight", Layer: "ShoeRight", Pri: 130.9, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "Kneel", "KneelClosed"]), + TieToLayer: "BootRight", NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + + InheritColor: "ShoeRight", + }, + { Name: "BootRightKneel", Layer: "ShoeRightKneel", Pri: 131, + Poses: ToMap(["Kneel"]), + Invariant: true, + InheritColor: "FootRight", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + HideWhenOverridden: true, + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + }, + { Name: "FootBootLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 131, + Poses: ToMap(["Hogtie"]), + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + HideWhenOverridden: true, + + InheritColor: "FootLeft", + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + }, + + { Name: "BootLegLeft", Layer: "OverShoes", Pri: 131, + InheritColor: "KneepadLeft", + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + Poses: ToMap([...LEGPOSES]), + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + }, + { Name: "BootLegRight", Layer: "ShoeRight", Pri: 131, + InheritColor: "KneepadRight", + Poses: ToMap([...LEGPOSES]), + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + }, + ]) +}); + + + +AddModel({ + Name: "HeavyMaidKnight_PantyhoseShorts", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight_Pantyhose", + Categories: ["Panties"], + TopLevel: true, + Layers: ToLayerMap([ + { Name: "Pantyhose", Layer: "BodysuitLower", Pri: -40, + Poses: ToMap([...LEGPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //MorphPoses: {Hogtie: "Hogtie"}, + }, + ]) +}); + +AddModel({ + Name: "HeavyMaidKnight_SockLeft", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight_Pantyhose", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockLeft", Layer: "StockingLeft", Pri: -40, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingLeft: true,}, + DisplacementSprite: "SockLSquish_Long", + DisplaceAmount: 10, + + }, + { Name: "FootSockLeftHogtie", Layer: "SockLeftHogtie", Pri: -40, + Poses: ToMap(["Hogtie"]), + InheritColor: "SockLeft", + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "HeavyMaidKnight_SockRight", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight_Pantyhose", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockRight", Layer: "StockingRight", Pri: -40, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingRight: true,}, + DisplacementSprite: "SockRSquish_Long", + DisplaceAmount: 10, + + }, + { Name: "FootSockRightKneel", Layer: "SockRightKneel", Pri: -40, + HidePoses: ToMap(["FeetLinked"]), + Poses: ToMap(["Kneel"]), + InheritColor: "SockRight", + Invariant: true, + }, + ]) +}); + + + + +AddModel({ + Name: "Pantyhose", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + Categories: ["Socks", "Panties"], + TopLevel: true, + Layers: ToLayerMap([ + ...GetModelLayers("HeavyMaidKnight_PantyhoseShorts"), + ...GetModelLayers("HeavyMaidKnight_SockLeft"), + ...GetModelLayers("HeavyMaidKnight_SockRight"), + ]) +}); + +AddModel({ + Name: "HeavyMaidKnight", + Folder: "MaidKnightHeavy", + Parent: "HeavyMaidKnight", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("HeavyMaidKnight_Dress"), + ...GetModelLayers("HeavyMaidKnight_Sleeves"), + ...GetModelLayers("HeavyMaidKnight_ApronBottom"), + ...GetModelLayers("HeavyMaidKnight_ApronTop"), + ...GetModelLayers("HeavyMaidKnight_Pauldrons"), + ...GetModelLayers("HeavyMaidKnight_Gauntlets"), + ...GetModelLayers("HeavyMaidKnight_Waist"), + ...GetModelLayers("HeavyMaidKnight_SideArmor"), + ...GetModelLayers("HeavyMaidKnight_ChestArmor"), + ...GetModelLayers("HeavyMaidKnight_Corset"), + ...GetModelLayers("HeavyMaidKnight_Boots"), + ...GetModelLayers("Pantyhose"), + ...GetModelLayers("HeavyMaidKnightHairband"), + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_MaidKnightLight.ts b/Data/ModelList_MaidKnightLight.ts new file mode 100644 index 000000000..7304e93dd --- /dev/null +++ b/Data/ModelList_MaidKnightLight.ts @@ -0,0 +1,568 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "LightMaidKnight_Dress", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: true, + Categories: ["Tops", "Dresses", "Skirts"], + //RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "Dress", Layer: "Shirt", Pri: 3, + InheritColor: "Dress", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + HidePoses: ToMap(["EncaseTorsoUpper", "SkimpyUpper"]), + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + DisplaceAmount: 125, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "TightUpperSquish", + DisplacementInvariant: true, + Invariant: true, + }, + { Name: "DressChest", Layer: "ShirtChest", Pri: 3, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + HidePoses: ToMap(["EncaseTorsoUpper"]), + InheritColor: "Dress", + MorphPoses: {Front: "Boxtie", Crossed: "Boxtie"}, + }, + { Name: "DressSkirt", Layer: "SkirtOver", Pri: 4, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie"}, + HidePoses: ToMap(["EncaseTorsoLower"]), + InheritColor: "Skirt", + }, + { Name: "DressDeco", Layer: "SkirtOver", Pri: 4.1, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + NoOverride: true, + TieToLayer: "DressSkirt", + }, + { Name: "DressDecoBack", Layer: "SkirtOver", Pri: 4.1, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + NoOverride: true, + TieToLayer: "DressSkirt", + }, + ]) +}); + + + +AddModel({ + Name: "LightMaidKnight_Apron", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "ApronChest", Layer: "ChestDeco", Pri: -30, + InheritColor: "Top", + Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + MorphPoses: { + Boxtie: "Boxtie", + Wristtie: "Boxtie", + Crossed: "Crossed", + Front: "Front", + Yoked: "Yoked", + Up: "Up", + }, + }, + { Name: "Apron", Layer: "Apron", Pri: 15, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", SuspendedHogtie: "", Hogtie: "Hogtie"}, + Invariant: true, + }, + { Name: "ApronBack", Layer: "BeltBack", Pri: -15, + Invariant: true, + InheritColor: "Back", + }, + + ]) +}); +AddModel({ + Name: "LightMaidKnight_Flower", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Flower", Layer: "BeltCharmSide", Pri: 25, + Invariant: true, + NoOverride: true, + HideWhenOverridden: true, + }, + { Name: "FlowerLeaves", Layer: "BeltCharmSide", Pri: 24, + Invariant: true, + NoOverride: true, + TieToLayer: "Flower", + }, + ]) +}); + + + +AddModel({ + Name: "MaidApron", + Folder: "Maid", + Parent: "Maid", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Apron", Layer: "Apron", Pri: 30, + Poses: ToMap([...LEGPOSES]), + HideWhenOverridden: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "LightMaidKnight_Bra", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: true, + Categories: ["Bras"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "DressChest", Layer: "BraChest", Pri: -30, + InheritColor: "Top", + Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + //Invariant: true, + }, + + ]) +}); + +AddModel({ + Name: "LightMaidKnight_Top", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: true, + Categories: ["Tops"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "DressChest", Layer: "ShirtChest", Pri: 25, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + HidePoses: ToMap(["EncaseTorsoUpper"]), + InheritColor: "Dress", + MorphPoses: {Front: "Boxtie", Crossed: "Boxtie"}, + }, + ]) +}); + + +AddModel({ + Name: "LightMaidKnight_SleeveLeft", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: false, + Categories: ["Sleeves"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "ArmLeft", Layer: "SleeveLeft", Pri: 60, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + { Name: "ForeArmLeft", Layer: "ForeSleeveLeft", Pri: 60, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "SleeveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossSleeveLeft"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + + ]) +}); + +AddModel({ + Name: "LightMaidKnight_SleeveRight", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: false, + Categories: ["Sleeves"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "ArmRight", Layer: "SleeveRight", Pri: 60, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + EraseSprite: "LightMaidRightArmErase", + EraseLayers: {MaidArmPoofRight: true}, + EraseAmount: 100, + EraseZBonus: 8600, + EraseInvariant: true, + }, + { Name: "ForeArmRight", Layer: "ForeSleeveRight", Pri: 60, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "SleeveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossSleeveRight"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + }, + { Name: "ShoulderRight", Layer: "UpSleeveRight", Pri: 60, + HideWhenOverridden: true, + InheritColor: "SleeveRight", + Poses: ToMap([...SHOULDERPOSES]), + }, + ]) +}); + + +AddModel({ + Name: "LightMaidKnight_Sleeves", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: true, + Categories: ["Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("LightMaidKnight_SleeveLeft"), + ...GetModelLayers("LightMaidKnight_SleeveRight"), + ]) +}); + + + +AddModel({ + Name: "LightMaidKnight_SockRight", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockLeft", Layer: "StockingLeft", Pri: 4, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingLeft: true,}, + DisplacementSprite: "SockLSquish_Long", + DisplaceAmount: 10, + + }, + { Name: "FootSockLeftHogtie", Layer: "SockLeftHogtie", Pri: 4, + Poses: ToMap(["Hogtie"]), + InheritColor: "SockLeft", + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "LightMaidKnight_SockLeft", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockRight", Layer: "StockingRight", Pri: 4, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingRight: true,}, + DisplacementSprite: "SockRSquish_Long", + DisplaceAmount: 10, + + }, + { Name: "FootSockRightKneel", Layer: "SockRightKneel", Pri: 4, + HidePoses: ToMap(["FeetLinked"]), + Poses: ToMap(["Kneel"]), + InheritColor: "SockRight", + Invariant: true, + }, + ]) +}); + + + +AddModel({ + Name: "LightMaidKnight_Socks", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: true, + Categories: ["Socks"], + Layers: ToLayerMap([ + ...GetModelLayers("LightMaidKnight_SockLeft"), + ...GetModelLayers("LightMaidKnight_SockRight"), + ]) +}); + + +AddModel({ + Name: "LightMaidKnight_GloveLeft", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveLeft", Layer: "GloveLeft", Pri: -4, + Poses: ToMapSubtract([...ARMPOSES], ["Crossed", "Boxtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Front: "ForeGloveLeft"}, + HideWhenOverridden: true, + }, + ]) +}); + +AddModel({ + Name: "LightMaidKnight_GloveRight", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveRight", Layer: "GloveRight", Pri: -4, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight", Front: "ForeGloveRight"}, + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "LightMaidKnight_Gloves", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: true, + Categories: ["Gloves"], + Layers: ToLayerMap([ + ...GetModelLayers("LightMaidKnight_GloveLeft"), + ...GetModelLayers("LightMaidKnight_GloveRight"), + ]) +}); + + +AddModel({ + Name: "LightMaidKnight_GuardLeft", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + Categories: ["Accessories", "Armor"], + Layers: ToLayerMap([ + { Name: "GuardLeft", Layer: "BindWristLeft", Pri: 20, + Poses: ToMapSubtract([...ARMPOSES], ["Boxtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Front: "BindForeWristLeft"}, + NoOverride: true, + HidePoseConditional: [ + ["DynamicArmor", "GlovesArmor", "SuppressDynamic"], + ], + EraseSprite: "GuardLeft", + ErasePoses: ["Free", "Yoked", "Front"], + EraseLayers: ToMap(["BindWristLeft"]), + }, + { Name: "GuardCuffLeft", Layer: "BindWristLeft", Pri: -20, + Poses: ToMapSubtract([...ARMPOSES], ["Boxtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Front: "BindForeWristLeft"}, + HideWhenOverridden: true, + HidePoseConditional: [ + ["DynamicArmor", "GlovesArmor", "SuppressDynamic"], + ], + }, + { Name: "GuardCuff2Left", Layer: "BindArmLeft", Pri: -20, + Poses: ToMapSubtract([...ARMPOSES], ["Boxtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Front: "BindForeArmLeft"}, + HideWhenOverridden: true, + HidePoseConditional: [ + ["DynamicArmor", "GlovesArmor", "SuppressDynamic"], + ], + }, + ]) +}); + +AddModel({ + Name: "LightMaidKnight_GuardRight", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + Categories: ["Accessories", "Armor"], + Layers: ToLayerMap([ + { Name: "GuardRight", Layer: "BindWristRight", Pri: 20, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "BindCrossWristRight", Front: "BindForeWristRight"}, + NoOverride: true, + HidePoseConditional: [ + ["DynamicArmor", "GlovesArmor", "SuppressDynamic"], + ], + EraseSprite: "GuardRight", + ErasePoses: ["Free", "Yoked", "Front"], + EraseLayers: ToMap(["BindWristRight"]), + }, + { Name: "GuardCuffRight", Layer: "BindWristRight", Pri: -20, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "BindCrossWristRight", Front: "BindForeWristRight"}, + HideWhenOverridden: true, + HidePoseConditional: [ + ["DynamicArmor", "GlovesArmor", "SuppressDynamic"], + ], + }, + { Name: "GuardCuff2Right", Layer: "BindArmRight", Pri: -20, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "BindCrossArmRight", Front: "BindForeArmRight"}, + HideWhenOverridden: true, + HidePoseConditional: [ + ["DynamicArmor", "GlovesArmor", "SuppressDynamic"], + ], + }, + ]) +}); + + +AddModel({ + Name: "LightMaidKnight_Guards", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: true, + Categories: ["Accessories", "Armor"], + Layers: ToLayerMap([ + ...GetModelLayers("LightMaidKnight_GuardLeft"), + ...GetModelLayers("LightMaidKnight_GuardRight"), + ]) +}); + + + + +AddModel({ + Name: "LightMaidKnight_Boots", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + { Name: "BootLeft", Layer: "ShoeLeft", Pri: 8, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + + DisplacementPosesExclude: ["Hogtie"], + ErasePosesExclude: ["Hogtie"], + + DisplacementSprite: "Heels2", + DisplaceAmount: 80, + DisplaceLayers: ToMap(["Heels"]), + DisplaceZBonus: 10000, + EraseInvariant: true, + EraseMorph: {Spread: "Spread", Closed: "Closed"}, + EraseSprite: "HeelsErase", + EraseAmount: 100, + EraseLayers: ToMap(["Heels"]), + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + }, + { Name: "BootRight", Layer: "ShoeRight", Pri: 8, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "Kneel", "KneelClosed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "HeelsRightErase2", + EraseAmount: 100, + EraseLayers: ToMap(["HeelRight"]), + EraseZBonus: 100, + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + }, + { Name: "BootRightKneel", Layer: "ShoeRightKneel", Pri: 8, + Poses: ToMap(["Kneel"]), + Invariant: true, + InheritColor: "ShoeRight", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + HideWhenOverridden: true, + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + }, + { Name: "FootBootLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 8, + Poses: ToMap(["Hogtie"]), + Invariant: true, + InheritColor: "ShoeLeft", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + HideWhenOverridden: true, + HidePoseConditional: [ + ["DynamicArmor", "BootsArmor", "SuppressDynamic"], + ], + }, + ]) +}); + + + + +AddModel({ + Name: "LightMaidKnight_Pauldron", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + Categories: ["Armor"], + Layers: ToLayerMap([ + { Name: "PauldronLeft", Layer: "Shoulders", Pri: 150, + Invariant: true, + MorphPoses: { + Yoked: "Yoked", + Hogtie: "Hogtie", + Wristtie: "Wristtie", + Boxtie: "Boxtie", + Front: "Front", + Crossed: "Crossed" + }, + HideWhenOverridden: true, + HidePoseConditional: [ + ["DynamicArmor", "ArmArmor", "SuppressDynamic"], + ], + }, + { Name: "PauldronStrap", Layer: "UpperArmStraps", Pri: -30, + Invariant: true, + MorphPoses: { + Yoked: "Yoked", + Hogtie: "Hogtie", + Wristtie: "Wristtie", + Boxtie: "Boxtie", + Front: "Front", + Crossed: "Crossed" + }, + HidePoseConditional: [ + ["DynamicArmor", "ArmArmor", "SuppressDynamic"], + ], + }, + ]) +}); + +AddModel({ + Name: "LightMaidKnight", + Folder: "MaidKnightLight", + Parent: "LightMaidKnight", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("LightMaidKnight_Dress"), + ...GetModelLayers("LightMaidKnight_Sleeves"), + ...GetModelLayers("LightMaidKnight_Apron"), + ...GetModelLayers("LightMaidKnight_Flower"), + ...GetModelLayers("LightMaidKnight_Pauldron"), + ...GetModelLayers("LightMaidKnight_Socks"), + ...GetModelLayers("LightMaidKnight_Boots"), + ...GetModelLayers("LightMaidKnight_Guards"), + ...GetModelLayers("LightMaidKnightHairband"), + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Mittens.ts b/Data/ModelList_Mittens.ts new file mode 100644 index 000000000..78b39a9ac --- /dev/null +++ b/Data/ModelList_Mittens.ts @@ -0,0 +1,1159 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "LeatherMittenLeft", + Folder: "Mittens", + Parent: "LeatherMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + { Name: "LeatherLeft", Layer: "MittenLeft", Pri: 100, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + InheritColor: "Mitten", + EraseSprite: "Mitts", + EraseLayers: ToMap(["Mitts"]), + }, + { Name: "BandLeft", Layer: "MittenLeft", Pri: 100.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LeatherLeft", + NoOverride: true, + InheritColor: "Band", + }, + { Name: "LockLeft", Layer: "MittenLeft", Pri: 100.2, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LeatherLeft", + NoOverride: true, + InheritColor: "Lock", + }, + + + ]) +}); + +AddModel({ + Name: "LeatherMittenRight", + Folder: "Mittens", + Parent: "LeatherMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + { Name: "LeatherRight", Layer: "MittenRight", Pri: 100, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + InheritColor: "Mitten", + }, + { Name: "BandRight", Layer: "MittenRight", Pri: 100.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LeatherRight", + NoOverride: true, + InheritColor: "Band", + }, + { Name: "LockRight", Layer: "MittenRight", Pri: 100.2, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LeatherRight", + NoOverride: true, + InheritColor: "Lock", + }, + ]) +}); + +AddModel({ + Name: "LeatherPawMittenLeft", + Folder: "Mittens", + Parent: "LeatherMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + ...GetModelLayers("LeatherMittenLeft"), + { Name: "PawLeft", Layer: "MittenLeft", Pri: 100.3, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LeatherLeft", + NoOverride: true, + InheritColor: "Paw", + }, + ]) +}); +AddModel({ + Name: "LeatherPawMittenRight", + Folder: "Mittens", + Parent: "LeatherMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + ...GetModelLayers("LeatherMittenRight"), + { Name: "PawRight", Layer: "MittenRight", Pri: 100.3, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LeatherRight", + NoOverride: true, + InheritColor: "Paw", + }, + ]) +}); + +AddModel({ + Name: "LatexMittenLeft", + Folder: "Mittens", + Parent: "LatexMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + { Name: "LatexLeft", Layer: "MittenLeft", Pri: 100, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + InheritColor: "Mitten", + EraseSprite: "Mitts", + EraseLayers: ToMap(["Mitts"]), + }, + { Name: "ZipperLeft", Layer: "MittenLeft", Pri: 100.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LatexLeft", + NoOverride: true, + InheritColor: "Zipper", + }, + + ]) +}); + +AddModel({ + Name: "LatexMittenRight", + Folder: "Mittens", + Parent: "LatexMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + { Name: "LatexRight", Layer: "MittenRight", Pri: 100, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + InheritColor: "Mitten", + }, + { Name: "ZipperRight", Layer: "MittenRight", Pri: 100.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LatexRight", + NoOverride: true, + InheritColor: "Zipper", + }, + ]) +}); + + +AddModel({ + Name: "LeatherMittens", + Folder: "Mittens", + TopLevel: true, + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + ...GetModelLayers("LeatherMittenLeft"), + ...GetModelLayers("LeatherMittenRight"), + ]) +}); + +AddModel({ + Name: "LeatherPawMittens", + Folder: "Mittens", + TopLevel: false, + Parent: "LeatherMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + ...GetModelLayers("LeatherPawMittenLeft"), + ...GetModelLayers("LeatherPawMittenRight"), + ]) +}); + +AddModel({ + Name: "LatexMittens", + Folder: "Mittens", + TopLevel: true, + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + ...GetModelLayers("LatexMittenLeft"), + ...GetModelLayers("LatexMittenRight"), + ]) +}); + +AddModel({ + Name: "LongMittenLeft", + Folder: "Mittens", + Parent: "LongMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + { Name: "LongMittenLeft", Layer: "MittenLeft", Pri: 100, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Mitten", + EraseSprite: "Mitts", + EraseLayers: ToMap(["Mitts"]), + }, + { Name: "ForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: -1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "Mitten", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + EraseSprite: "Mitts", + EraseLayers: ToMap(["Mitts"]), + }, + { Name: "BandLeft", Layer: "MittenLeft", Pri: 100.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "Band", + }, + { Name: "LockLeft", Layer: "MittenLeft", Pri: 100.2, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "Lock", + }, + ]) +}); + +AddModel({ + Name: "LongMittenRight", + Folder: "Mittens", + Parent: "LongMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + { Name: "LongMittenRight", Layer: "MittenRight", Pri: 100, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Mitten", + EraseSprite: "Mitts", + EraseLayers: ToMap(["Mitts"]), + }, + { Name: "ForeLongMittenRight", Layer: "ForeMittenRight", Pri: -1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "Mitten", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + { Name: "BandRight", Layer: "MittenRight", Pri: 100.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "Band", + }, + { Name: "LockRight", Layer: "MittenRight", Pri: 100.2, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "Lock", + }, + ]) +}); + +AddModel({ + Name: "LongMittens", + Folder: "Mittens", + TopLevel: true, + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + ...GetModelLayers("LongMittenLeft"), + ...GetModelLayers("LongMittenRight"), + ]) +}); + + + +AddModel({ + Name: "CyberLongMittenLeft", + Folder: "CyberMitts", + Parent: "LongMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + { Name: "CapForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + HideWhenOverridden: true, + InheritColor: "Cap", + }, + { Name: "CapLongMittenLeft", Layer: "MittenLeft", Pri: 120, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + InheritColor: "Cap", + }, + { Name: "LongMittenLeft", Layer: "MittenLeft", Pri: 120.05, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Mitten", + NoOverride: true, + }, + { Name: "ForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.05, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "Mitten", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + EraseSprite: "Mitts", + EraseLayers: ToMap(["Mitts"]), + }, + { Name: "CuffForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "CapForeLongMittenLeft", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "CuffLongMittenLeft", Layer: "MittenLeft", Pri: 120.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "CapLongMittenLeft", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "DisplayForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.2, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "CapForeLongMittenLeft", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "DisplayLongMittenLeft", Layer: "MittenLeft", Pri: 120.2, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "CapLongMittenLeft", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "LockForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.3, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "CapForeLongMittenLeft", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "LockLongMittenLeft", Layer: "MittenLeft", Pri: 120.3, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "CapLongMittenLeft", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "GlowForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.4, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "CapForeLongMittenLeft", + NoOverride: true, + InheritColor: "Glow", + }, + { Name: "GlowLongMittenLeft", Layer: "MittenLeft", Pri: 120.4, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "CapLongMittenLeft", + NoOverride: true, + InheritColor: "Glow", + }, + { Name: "StrapsForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "ForeLongMittenLeft", + NoOverride: true, + InheritColor: "Straps", + }, + { Name: "StrapsLongMittenLeft", Layer: "MittenLeft", Pri: 120.1, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "Straps", + }, + { Name: "UpperCuffLongMittenLeft", Layer: "MittenLeft", Pri: 120.1, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "UpperCuff", + }, + { Name: "UpperDisplayLongMittenLeft", Layer: "MittenLeft", Pri: 120.2, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "UpperDisplay", + }, + { Name: "UpperLockLongMittenLeft", Layer: "MittenLeft", Pri: 120.3, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "UpperLock", + }, + { Name: "UpperGlowLongMittenLeft", Layer: "MittenLeft", Pri: 120.4, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "UpperGlow", + }, + ]) +}); + +AddModel({ + Name: "CyberLongMittenRight", + Folder: "CyberMitts", + Parent: "CyberLongMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + { Name: "CapForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + HideWhenOverridden: true, + InheritColor: "Cap", + }, + { Name: "CapLongMittenRight", Layer: "MittenRight", Pri: 120, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + InheritColor: "Cap", + }, + { Name: "LongMittenRight", Layer: "MittenRight", Pri: 120.05, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Mitten", + EraseSprite: "Mitts", + NoOverride: true, + EraseLayers: ToMap(["Mitts"]), + }, + { Name: "ForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.05, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "Mitten", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + EraseSprite: "Mitts", + EraseLayers: ToMap(["Mitts"]), + }, + { Name: "CuffForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "CapForeLongMittenRight", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "CuffLongMittenRight", Layer: "MittenRight", Pri: 120.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "CapLongMittenRight", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "DisplayForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.2, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "CapForeLongMittenRight", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "DisplayLongMittenRight", Layer: "MittenRight", Pri: 120.2, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "CapLongMittenRight", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "LockForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.3, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "CapForeLongMittenRight", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "LockLongMittenRight", Layer: "MittenRight", Pri: 120.3, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "CapLongMittenRight", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "GlowForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.4, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "CapForeLongMittenRight", + NoOverride: true, + InheritColor: "Glow", + }, + { Name: "GlowLongMittenRight", Layer: "MittenRight", Pri: 120.4, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "CapLongMittenRight", + NoOverride: true, + InheritColor: "Glow", + }, + + { Name: "StrapsForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeLongMittenRight", + NoOverride: true, + InheritColor: "Straps", + }, + { Name: "StrapsLongMittenRight", Layer: "MittenRight", Pri: 120.1, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "Straps", + }, + { Name: "UpperCuffLongMittenRight", Layer: "MittenRight", Pri: 120.1, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "UpperCuff", + }, + { Name: "UpperDisplayLongMittenRight", Layer: "MittenRight", Pri: 120.2, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "UpperDisplay", + }, + { Name: "UpperLockLongMittenRight", Layer: "MittenRight", Pri: 120.3, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "UpperLock", + }, + { Name: "UpperGlowLongMittenRight", Layer: "MittenRight", Pri: 120.4, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "UpperGlow", + }, + ]) +}); + +AddModel({ + Name: "CyberLongMittens", + Folder: "CyberMitts", + TopLevel: true, + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + ...GetModelLayers("CyberLongMittenLeft"), + ...GetModelLayers("CyberLongMittenRight"), + ]) +}); + + + + +AddModel({ + Name: "CyberMittenLeft", + Folder: "CyberMitts", + Parent: "CyberMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + { Name: "MittenLeft", Layer: "MittenLeft", Pri: 130, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Mitten", + EraseSprite: "Mitts", + EraseLayers: ToMap(["Mitts"]), + }, + { Name: "ForeMittenLeft", Layer: "ForeMittenLeft", Pri: 30, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "Mitten", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + }, + { Name: "CuffForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 30.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "ForeMittenLeft", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "CuffLongMittenLeft", Layer: "MittenLeft", Pri: 130.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "MittenLeft", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "DisplayForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 30.2, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "ForeMittenLeft", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "DisplayLongMittenLeft", Layer: "MittenLeft", Pri: 130.2, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "MittenLeft", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "LockForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 30.3, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "ForeMittenLeft", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "LockLongMittenLeft", Layer: "MittenLeft", Pri: 130.3, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "MittenLeft", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "GlowForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 30.4, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "ForeMittenLeft", + NoOverride: true, + InheritColor: "Glow", + }, + { Name: "GlowLongMittenLeft", Layer: "MittenLeft", Pri: 130.4, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "MittenLeft", + NoOverride: true, + InheritColor: "Glow", + }, + { Name: "CapForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 30.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "ForeMittenLeft", + NoOverride: true, + InheritColor: "Cap", + }, + { Name: "CapLongMittenLeft", Layer: "MittenLeft", Pri: 130.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "MittenLeft", + NoOverride: true, + InheritColor: "Cap", + }, + ]) +}); + +AddModel({ + Name: "CyberMittenRight", + Folder: "CyberMitts", + Parent: "CyberMittens", + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + { Name: "MittenRight", Layer: "MittenRight", Pri: 130, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Mitten", + EraseSprite: "Mitts", + EraseLayers: ToMap(["Mitts"]), + }, + { Name: "ForeMittenRight", Layer: "ForeMittenRight", Pri: 30, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "Mitten", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + { Name: "CuffForeLongMittenRight", Layer: "ForeMittenRight", Pri: 30.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeMittenRight", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "CuffLongMittenRight", Layer: "MittenRight", Pri: 130.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "MittenRight", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "DisplayForeLongMittenRight", Layer: "ForeMittenRight", Pri: 30.2, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeMittenRight", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "DisplayLongMittenRight", Layer: "MittenRight", Pri: 130.2, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "MittenRight", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "LockForeLongMittenRight", Layer: "ForeMittenRight", Pri: 30.3, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeMittenRight", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "LockLongMittenRight", Layer: "MittenRight", Pri: 130.3, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "MittenRight", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "GlowForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.4, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeMittenRight", + NoOverride: true, + InheritColor: "Glow", + }, + { Name: "GlowLongMittenRight", Layer: "MittenRight", Pri: 130.4, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "MittenRight", + NoOverride: true, + InheritColor: "Glow", + }, + { Name: "CapForeLongMittenRight", Layer: "ForeMittenRight", Pri: 30.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeMittenRight", + NoOverride: true, + InheritColor: "Cap", + }, + { Name: "CapLongMittenRight", Layer: "MittenRight", Pri: 130.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "MittenRight", + NoOverride: true, + InheritColor: "Cap", + }, + ]) +}); + +AddModel({ + Name: "CyberMittens", + Folder: "CyberMitts", + TopLevel: true, + Categories: ["Gloves", "Mittens", "Restraints"], + Restraint: true, + AddPose: ["Mittens"], + Layers: ToLayerMap([ + ...GetModelLayers("CyberMittenLeft"), + ...GetModelLayers("CyberMittenRight"), + ]) +}); + + + +AddModel({ + Name: "CyberArmLeft", + Folder: "CyberArms", + Parent: "CyberArms", + Categories: ["Gloves", "Sleeves"], + Layers: ToLayerMap([ + { Name: "LongMittenLeft", Layer: "MittenLeft", Pri: 120, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Mitten", + }, + { Name: "ForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "Mitten", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + }, + { Name: "CuffForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "ForeLongMittenLeft", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "CuffLongMittenLeft", Layer: "MittenLeft", Pri: 120.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "DisplayForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.2, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "ForeLongMittenLeft", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "DisplayLongMittenLeft", Layer: "MittenLeft", Pri: 120.2, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "LockForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.3, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "ForeLongMittenLeft", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "LockLongMittenLeft", Layer: "MittenLeft", Pri: 120.3, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "GlowForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.4, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "ForeLongMittenLeft", + NoOverride: true, + InheritColor: "Glow", + }, + { Name: "GlowLongMittenLeft", Layer: "MittenLeft", Pri: 120.4, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "Glow", + }, + + + { Name: "StrapsForeLongMittenLeft", Layer: "ForeMittenLeft", Pri: 20.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft"}, + TieToLayer: "ForeLongMittenLeft", + NoOverride: true, + InheritColor: "Straps", + }, + { Name: "StrapsLongMittenLeft", Layer: "MittenLeft", Pri: 120.1, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "Straps", + }, + { Name: "UpperCuffLongMittenLeft", Layer: "MittenLeft", Pri: 120.1, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "UpperCuff", + }, + { Name: "UpperDisplayLongMittenLeft", Layer: "MittenLeft", Pri: 120.2, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "UpperDisplay", + }, + { Name: "UpperLockLongMittenLeft", Layer: "MittenLeft", Pri: 120.3, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "UpperLock", + }, + { Name: "UpperGlowLongMittenLeft", Layer: "MittenLeft", Pri: 120.4, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenLeft", Front: "ForeMittenLeft"}, + TieToLayer: "LongMittenLeft", + NoOverride: true, + InheritColor: "UpperGlow", + }, + ]) +}); + +AddModel({ + Name: "CyberArmRight", + Folder: "CyberArms", + Parent: "CyberArms", + Categories: ["Gloves", "Sleeves"], + Layers: ToLayerMap([ + { Name: "LongMittenRight", Layer: "MittenRight", Pri: 120, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Mitten", + }, + { Name: "ForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "Mitten", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + { Name: "CuffForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeLongMittenRight", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "CuffLongMittenRight", Layer: "MittenRight", Pri: 120.1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "Cuff", + }, + { Name: "DisplayForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.2, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeLongMittenRight", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "DisplayLongMittenRight", Layer: "MittenRight", Pri: 120.2, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "Display", + }, + { Name: "LockForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.3, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeLongMittenRight", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "LockLongMittenRight", Layer: "MittenRight", Pri: 120.3, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "Lock", + }, + { Name: "GlowForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.4, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeLongMittenRight", + NoOverride: true, + InheritColor: "Glow", + }, + { Name: "GlowLongMittenRight", Layer: "MittenRight", Pri: 120.4, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie", "Up"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "Glow", + }, + + + + { Name: "StrapsForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeLongMittenRight", + NoOverride: true, + InheritColor: "Straps", + }, + { Name: "StrapsLongMittenRight", Layer: "MittenRight", Pri: 120.1, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "Straps", + }, + { Name: "UpperCuffForeLongMittenRight", Layer: "ForeMittenRight", Pri: 20.1, + Poses: ToMap([...FOREARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + TieToLayer: "ForeLongMittenRight", + NoOverride: true, + InheritColor: "UpperCuff", + }, + { Name: "UpperCuffLongMittenRight", Layer: "MittenRight", Pri: 120.1, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "UpperCuff", + }, + { Name: "UpperDisplayLongMittenRight", Layer: "MittenRight", Pri: 120.2, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "UpperDisplay", + }, + { Name: "UpperLockLongMittenRight", Layer: "MittenRight", Pri: 120.3, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "UpperLock", + }, + { Name: "UpperGlowLongMittenRight", Layer: "MittenRight", Pri: 120.4, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossMittenRight", Front: "ForeMittenRight"}, + TieToLayer: "LongMittenRight", + NoOverride: true, + InheritColor: "UpperGlow", + }, + ]) +}); + +AddModel({ + Name: "CyberArms", + Folder: "CyberArms", + TopLevel: true, + Categories: ["Gloves", "Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("CyberArmLeft"), + ...GetModelLayers("CyberArmRight"), + ]) +}); + + + +//AddModel(GetModelFashionVersion("LeatherMittenRight", true)); +//AddModel(GetModelFashionVersion("LeatherMittenLeft", true)); +AddModel(GetModelFashionVersion("LeatherMittens", true)); +//AddModel(GetModelFashionVersion("LeatherPawMittenRight", true)); +//AddModel(GetModelFashionVersion("LeatherPawMittenLeft", true)); +AddModel(GetModelFashionVersion("LeatherPawMittens", true)); +//AddModel(GetModelFashionVersion("LatexMittenRight", true)); +//AddModel(GetModelFashionVersion("LatexMittenLeft", true)); +AddModel(GetModelFashionVersion("LatexMittens", true)); +//AddModel(GetModelFashionVersion("LongMittenRight", true)); +//AddModel(GetModelFashionVersion("LongMittenLeft", true)); +AddModel(GetModelFashionVersion("LongMittens", true)); +AddModel(GetModelFashionVersion("CyberLongMittens", true)); +AddModel(GetModelFashionVersion("CyberMittens", true)); + + + diff --git a/Data/ModelList_Ninja.ts b/Data/ModelList_Ninja.ts new file mode 100644 index 000000000..252345956 --- /dev/null +++ b/Data/ModelList_Ninja.ts @@ -0,0 +1,414 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "ClothCollar", + Folder: "Ninja", + Parent: "Ninja", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Collar", Layer: "Collar", Pri: 10, + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "ClothCollarTag", + Folder: "Ninja", + Parent: "ClothCollar", + TopLevel: false, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("ClothCollar"), + { Name: "CollarTag", Layer: "CollarAcc", Pri: 10.1, + Invariant: true, + NoOverride: true, TieToLayer: "Collar", + }, + ]) +}); + + +AddModel({ + Name: "ClothBelt", + Folder: "Ninja", + Parent: "Ninja", + TopLevel: true, + Categories: ["Corsets"], + Layers: ToLayerMap([ + { Name: "Belt", Layer: "Bustier", Pri: 1, + //SwapLayerPose: {Pants: "CorsetUnder"}, + HideWhenOverridden: true, + Invariant: true, + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + }, + ]) +}); + +AddModel({ + Name: "ClothBeltLines", + Folder: "Ninja", + Parent: "Ninja", + TopLevel: true, + Categories: ["Corsets"], + Layers: ToLayerMap([ + ...GetModelLayers("ClothBelt"), + { Name: "BeltLines", Layer: "Bustier", Pri: 1.1, + NoOverride: true, TieToLayer: "Belt", + //SwapLayerPose: {Pants: "CorsetUnder"}, + Invariant: true, + }, + ]) +}); + + + +AddModel({ + Name: "ClothTop", + Folder: "Ninja", + Parent: "ClothTop", + TopLevel: true, + Categories: ["Tops"], + Layers: ToLayerMap([ + { Name: "TopChest", Layer: "ShirtChest", Pri:40, + Invariant: true, + InheritColor: "Base", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied",}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + { Name: "TopShoulders", Layer: "ShirtChest", Pri:39.9, + Invariant: true, + InheritColor: "Shoulders", + NoOverride: true, + TieToLayer: "TopChest", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied",}, + }, + { Name: "Top", Layer: "Shirt", Pri: 40, + Invariant: true, + InheritColor: "Base", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + + ]) +}); +AddModel({ + Name: "ClothBra", + Folder: "Ninja", + Parent: "ClothTop", + TopLevel: true, + Categories: ["Bras"], + Layers: ToLayerMap([ + { Name: "TopChest", Layer: "BraChest", Pri:40, + Invariant: true, + InheritColor: "Base", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied",}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + { Name: "Top", Layer: "Bra", Pri: 40, + Invariant: true, + InheritColor: "Base", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + + ]) +}); + +AddModel({ + Name: "ClothTopBand", + Folder: "Ninja", + Parent: "ClothTop", + TopLevel: false, + Categories: ["Tops"], + Layers: ToLayerMap([ + ...GetModelLayers("ClothTop"), + { Name: "TopBandChest", Layer: "ShirtChest", Pri:41, + Invariant: true, + InheritColor: "Band", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied",}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + { Name: "TopBandRimChest", Layer: "ShirtChest", Pri:41.1, + Invariant: true, + InheritColor: "Rim", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied",}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + { Name: "TopBand", Layer: "Shirt", Pri: 41, + Invariant: true, + InheritColor: "Band", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + { Name: "TopBandRim", Layer: "Shirt", Pri: 41.1, + Invariant: true, + InheritColor: "Rim", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + ]) +}); +AddModel({ + Name: "ClothBraBand", + Folder: "Ninja", + Parent: "ClothBra", + TopLevel: false, + Categories: ["Bras"], + Layers: ToLayerMap([ + ...GetModelLayers("ClothBra"), + { Name: "TopBandChest", Layer: "BraChest", Pri:41, + Invariant: true, + InheritColor: "Band", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied",}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + { Name: "TopBandRimChest", Layer: "BraChest", Pri:41.1, + Invariant: true, + InheritColor: "Rim", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied",}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + { Name: "TopBand", Layer: "Bra", Pri: 41, + Invariant: true, + InheritColor: "Band", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + { Name: "TopBandRim", Layer: "Bra", Pri: 41.1, + Invariant: true, + InheritColor: "Rim", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + }, + ]) +}); + + + +AddModel({ + Name: "NinjaSkirt", + Folder: "Ninja", + Parent: "Ninja", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "Skirt", Pri: 15, + Poses: ToMap([...LEGPOSES]), + HideWhenOverridden: true, + //swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "SkirtBand", Layer: "Skirt", Pri: 15.1, + TieToLayer: "Skirt", + NoOverride: true, + InheritColor: "Band", + Poses: ToMap([...LEGPOSES]), + HideWhenOverridden: true, + //swaplayerpose: {Kneel: "SkirtLower", KneelClosed: "SkirtLower"}, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + }, + { Name: "SkirtOver", Layer: "SkirtOver", Pri: 8, + Poses: ToMap([...KNEELPOSES]), + //RequirePoses: ToMap(["CrotchStrap"]), + TieToLayer: "Skirt", NoOverride: true, + InheritColor: "Skirt", + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + { Name: "SkirtBandOver", Layer: "SkirtOver", Pri: 8.1, + Poses: ToMap([...KNEELPOSES]), + //RequirePoses: ToMap(["CrotchStrap"]), + TieToLayer: "Skirt", NoOverride: true, + InheritColor: "Band", + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + ]) +}); + + + +AddModel({ + Name: "NinjaSockLeft", + Folder: "Ninja", + Parent: "NinjaSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockLeft", Layer: "StockingLeft", Pri: 2, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + SwapLayerPose: {KneelClosed: "StockingLeftKneel"}, + NoOverride: true, + DisplaceLayers: {StockingLeft: true,}, + DisplacementSprite: "SockLSquish_Short", + DisplaceAmount: 20, + }, + ]) +}); +AddModel({ + Name: "NinjaSockRight", + Folder: "Ninja", + Parent: "NinjaSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockRight", Layer: "StockingRight", Pri: 2, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + SwapLayerPose: {Kneel: "SockRightKneel"}, + NoOverride: true, + DisplaceLayers: {StockingRight: true,}, + DisplacementSprite: "SockRSquish_Short", + DisplaceAmount: 20, + }, + + ]) +}); + + +AddModel({ + Name: "NinjaThighLeft", + Folder: "Ninja", + Parent: "NinjaSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "ThighLeft", Layer: "StockingLeft", Pri: 3, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "NinjaThighRight", + Folder: "Ninja", + Parent: "NinjaSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "ThighRight", Layer: "StockingRight", Pri: 3, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + NoOverride: true, + }, + + ]) +}); + + +AddModel({ + Name: "NinjaKneeLeft", + Folder: "Ninja", + Parent: "NinjaSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "KneeLeft", Layer: "StockingLeft", Pri: 4, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "NinjaKneeRight", + Folder: "Ninja", + Parent: "NinjaSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "KneeRight", Layer: "StockingRight", Pri: 4, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + NoOverride: true, + }, + + ]) +}); + + +AddModel({ + Name: "NinjaSocks", + Folder: "Ninja", + Parent: "Ninja", + TopLevel: true, + Categories: ["Socks"], + Layers: ToLayerMap([ + ...GetModelLayers("NinjaSockLeft"), + ...GetModelLayers("NinjaSockRight"), + ]) +}); +AddModel({ + Name: "NinjaThighs", + Folder: "Ninja", + Parent: "NinjaSocks", + TopLevel: false, + Categories: ["Socks"], + Layers: ToLayerMap([ + ...GetModelLayers("NinjaThighLeft"), + ...GetModelLayers("NinjaThighRight"), + ]) +}); +AddModel({ + Name: "NinjaKnees", + Folder: "Ninja", + Parent: "NinjaSocks", + TopLevel: false, + Categories: ["Socks"], + Layers: ToLayerMap([ + ...GetModelLayers("NinjaKneeLeft"), + ...GetModelLayers("NinjaKneeRight"), + ]) +}); + + +AddModel({ + Name: "NinjaShoes", + Folder: "Ninja", + Parent: "Ninja", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + ...GetModelLayers("MaidShoes", undefined, undefined, undefined, -1), + ]) +}); + + +AddModel({ + Name: "Ninja", + Folder: "Ninja", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("ClothTopBand"), + ...GetModelLayers("NinjaSkirt"), + ...GetModelLayers("ClothCollarTag"), + ...GetModelLayers("ClothBeltLines"), + ...GetModelLayers("NinjaThighs"), + ...GetModelLayers("NinjaKnees"), + ...GetModelLayers("NinjaSocks"), + ...GetModelLayers("NinjaShoes"), + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Opera.ts b/Data/ModelList_Opera.ts new file mode 100644 index 000000000..08f6b8f9f --- /dev/null +++ b/Data/ModelList_Opera.ts @@ -0,0 +1,59 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "OperaGloveLeft", + Folder: "OperaGloves", + Parent: "OperaGloves", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveLeft", Layer: "GloveLeft", Pri: 3, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "ForeGloveLeft", Layer: "ForeGloveLeft", Pri: 3, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveLeft"}, + }, + ]) +}); + +AddModel({ + Name: "OperaGloveRight", + Folder: "OperaGloves", + Parent: "OperaGloves", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveRight", Layer: "GloveRight", Pri: 3, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "ForeGloveRight", Layer: "ForeGloveRight", Pri: 3, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + ]) +}); + +AddModel({ + Name: "OperaGloves", + Folder: "OperaGloves", + Parent: "OperaGloves", + TopLevel: true, + Categories: ["Gloves"], + Layers: ToLayerMap([ + ...GetModelLayers("OperaGloveLeft"), + ...GetModelLayers("OperaGloveRight"), + ]) +}); + +AddModel(GetModelRestraintVersion("OperaGloves", true)); diff --git a/Data/ModelList_Panties.ts b/Data/ModelList_Panties.ts new file mode 100644 index 000000000..b89caabd9 --- /dev/null +++ b/Data/ModelList_Panties.ts @@ -0,0 +1,186 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "Panties", + Folder: "Panties", + Parent: "Panties", + TopLevel: true, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + { Name: "Base", Layer: "Panties", Pri: -25, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel"}, + }, + { Name: "Lines", Layer: "Panties", Pri: -24.8, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel"}, + NoOverride: true, + InheritColor: "Seams", + TieToLayer: "Base", + }, + ]) +}); + + +AddModel({ + Name: "PantiesBow", + Folder: "Panties", + Parent: "Panties", + TopLevel: true, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + { Name: "Bow", Layer: "Panties", Pri: -24.7, + Invariant: true, + NoOverride: true, + }, + ]) +}); + + +AddModel({ + Name: "PantiesStriped", + Folder: "Panties", + Parent: "Panties", + TopLevel: false, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + ...GetModelLayers("Panties"), + { Name: "Stripes", Layer: "Panties", Pri: -24.9, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel"}, + NoOverride: true, + TieToLayer: "Base", + }, + { Name: "Lines", Layer: "Panties", Pri: -24.8, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel"}, + NoOverride: true, + InheritColor: "Seams", + TieToLayer: "Base", + }, + ]) +}); +AddModel({ + Name: "PantiesInvertedRose", + Folder: "Panties", + Parent: "Panties", + TopLevel: false, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + ...GetModelLayers("Panties"), + { Name: "InvertedRose", Layer: "Panties", Pri: -24.9, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel"}, + NoOverride: true, + TieToLayer: "Base", + }, + { Name: "Lines", Layer: "Panties", Pri: -24.8, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel"}, + NoOverride: true, + InheritColor: "Seams", + TieToLayer: "Base", + }, + ]) +}); +AddModel({ + Name: "PantiesCherry", + Folder: "Panties", + Parent: "Panties", + TopLevel: false, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + ...GetModelLayers("Panties"), + { Name: "Cherry", Layer: "Panties", Pri: -24.9, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel"}, + NoOverride: true, + TieToLayer: "Base", + }, + { Name: "Lines", Layer: "Panties", Pri: -24.8, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel"}, + NoOverride: true, + InheritColor: "Seams", + TieToLayer: "Base", + }, + ]) +}); + +AddModel({ + Name: "PantiesBowStriped", + Folder: "Panties", + Parent: "Panties", + TopLevel: false, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + ...GetModelLayers("Panties"), + ...GetModelLayers("PantiesBow"), + { Name: "Stripes", Layer: "Panties", Pri: -24.9, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel"}, + NoOverride: true, + TieToLayer: "Base", + }, + { Name: "Lines", Layer: "Panties", Pri: -24.8, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel"}, + NoOverride: true, + InheritColor: "Seams", + TieToLayer: "Base", + }, + ]) +}); + + + +AddModel({ + Name: "PantiesHigh", + Folder: "PantiesHigh", + Parent: "PantiesHigh", + TopLevel: true, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + { Name: "Base", Layer: "Panties", Pri: -29, + Invariant: true, + MorphPoses: {Hogtie: "Closed", Closed: "Closed"}, + }, + { Name: "Lines", Layer: "Panties", Pri: -28.8, + Invariant: true, + MorphPoses: {Hogtie: "Closed", Closed: "Closed"}, + NoOverride: true, + InheritColor: "Seams", + TieToLayer: "Base", + }, + ]) +}); + +AddModel({ + Name: "PantiesHighStriped", + Folder: "PantiesHigh", + Parent: "PantiesHigh", + TopLevel: false, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + ...GetModelLayers("PantiesHigh"), + { Name: "Stripes", Layer: "Panties", Pri: -28.9, + Invariant: true, + MorphPoses: {Hogtie: "Closed", Closed: "Closed"}, + NoOverride: true, + TieToLayer: "Base", + }, + { Name: "Lines", Layer: "Panties", Pri: -28.8, + Invariant: true, + MorphPoses: {Hogtie: "Closed", Closed: "Closed"}, + NoOverride: true, + InheritColor: "Seams", + TieToLayer: "Base", + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Pants.ts b/Data/ModelList_Pants.ts new file mode 100644 index 000000000..318f67d85 --- /dev/null +++ b/Data/ModelList_Pants.ts @@ -0,0 +1,29 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "BanditShorts", + Folder: "Bandit", + Parent: "Bandit", + TopLevel: true, + Categories: ["Pants"], + AddPose: ["Pants"], + Layers: ToLayerMap([ + { Name: "Shorts", Layer: "Shorts", Pri: 7, + Poses: ToMap([...LEGPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //MorphPoses: {Hogtie: "Hogtie"}, + }, + { Name: "ShortsLeft", Layer: "ShortsLeft", Pri: 7, + Poses: ToMap([...LEGPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //MorphPoses: {Hogtie: "Hogtie"}, + }, + ]) +}); + diff --git a/Data/ModelList_Petsuit.ts b/Data/ModelList_Petsuit.ts new file mode 100644 index 000000000..8a57635fd --- /dev/null +++ b/Data/ModelList_Petsuit.ts @@ -0,0 +1,300 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "Petsuit", + Folder: "Petsuit", + Parent: "Petsuit", + TopLevel: true, + Categories: ["Restraints", "Cosplay"], + Restraint: true, + AddPose: ["HideArms", "EncaseArmLeft", "EncaseArmRight", "ForceKneel", "Petsuit"], + HideLayerGroups: ["PetsuitArms"], + Layers: ToLayerMap([ + { Name: "Arms", Layer: "BindForeArms", Pri: -30, + Invariant: true, + Poses: ToMap(["Front"]), + }, + { Name: "ArmsBelts", Layer: "BindForeArms", Pri: -29.9, + Invariant: true, + TieToLayer: "Arms", + NoOverride: true, + Poses: ToMap(["Front"]), + }, + { Name: "Legs", Layer: "PetsuitLegs", Pri: -5, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + }, + { Name: "LegsBelts", Layer: "PetsuitLegs", Pri: -4.9, + TieToLayer: "Legs", + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + }, + { Name: "LeftLegs", Layer: "PetsuitLegs", Pri: -5, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Legs", + DisplaceAmount: 50, + DisplacementInvariant: true, + DisplaceLayers: ToMap(["Petsuit"]), + DisplacementSprite: "PetsuitSquish", + }, + { Name: "LeftLegsBelts", Layer: "PetsuitLegs", Pri: -4.9, + TieToLayer: "LeftLegs", + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "LegsBelts", + }, + ]) +}); + + +AddModel({ + Name: "LatexPetsuit", + Folder: "LatexPetsuit", + Parent: "Petsuit", + TopLevel: true, + Categories: ["Restraints", "Cosplay"], + Restraint: true, + AddPose: ["HideArms", "EncaseArmLeft", "EncaseArmRight", "ForceKneel", "Petsuit"], + HideLayerGroups: ["PetsuitArms"], + Layers: ToLayerMap([ + { Name: "Arms", Layer: "BindForeArms", Pri: -41, + Invariant: true, + Poses: ToMap(["Front"]), + }, + { Name: "Legs", Layer: "PetsuitLegs", Pri: -16, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + }, + { Name: "LeftLegs", Layer: "PetsuitLegs", Pri: -16, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Legs", + DisplaceAmount: 50, + DisplacementInvariant: true, + DisplaceLayers: ToMap(["Petsuit"]), + DisplacementSprite: "PetsuitSquish", + }, + ]) +}); + +AddModel({ + Name: "LatexPetsuitGlow", + Folder: "LatexPetsuit", + Parent: "Petsuit", + TopLevel: false, + Categories: ["Restraints", "Cosplay"], + Restraint: true, + AddPose: ["HideArms", "EncaseArmLeft", "EncaseArmRight", "ForceKneel", "Petsuit"], + HideLayerGroups: ["PetsuitArms"], + Layers: ToLayerMap([ + ...GetModelLayers("LatexPetsuit"), + { Name: "GlowArms", Layer: "BindForeArms", Pri: -40, + Invariant: true, + Poses: ToMap(["Front"]), + InheritColor: "Glow", + NoOverride: true, + NoDisplace: true, + }, + { Name: "GlowTorso", Layer: "WrapChest", Pri: -40, + Invariant: true, + InheritColor: "GlowTorso", + NoOverride: true, + NoDisplace: true, + }, + { Name: "GlowLegs", Layer: "PetsuitLegs", Pri: -15, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Glow", + NoOverride: true, + NoDisplace: true, + }, + { Name: "GlowLeftLegs", Layer: "PetsuitLegs", Pri: -15, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Glow", + NoOverride: true, + NoDisplace: true, + }, + ]) +}); + + +AddModel({ + Name: "ElitePetsuit", + Folder: "LeatherPetsuit", + Parent: "Petsuit", + TopLevel: true, + Categories: ["Restraints", "Cosplay"], + Restraint: true, + AddPose: ["HideArms", "EncaseArmLeft", "EncaseArmRight", "ForceKneel", "Petsuit"], + HideLayerGroups: ["PetsuitArms"], + Layers: ToLayerMap([ + { Name: "Arms", Layer: "BindForeArms", Pri: -15, + Invariant: true, + Poses: ToMap(["Front"]), + InheritColor: "Suit", + }, + { Name: "ArmsBelts", Layer: "BindForeArms", Pri: -14.9, + Invariant: true, + TieToLayer: "Arms", + NoOverride: true, + Poses: ToMap(["Front"]), + InheritColor: "Straps", + }, + { Name: "ArmsLaces", Layer: "BindForeArms", Pri: -14.8, + Invariant: true, + TieToLayer: "Arms", + NoOverride: true, + Poses: ToMap(["Front"]), + InheritColor: "Laces", + }, + { Name: "ArmsHardware", Layer: "BindForeArms", Pri: -14.8, + Invariant: true, + TieToLayer: "Arms", + NoOverride: true, + Poses: ToMap(["Front"]), + InheritColor: "Hardware", + }, + { Name: "Legs", Layer: "PetsuitLegs", Pri: -5, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Suit", + }, + { Name: "LegsLaces", Layer: "PetsuitLegs", Pri: 15.2, + TieToLayer: "Legs", + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Laces", + }, + { Name: "LegsHardware", Layer: "PetsuitLegs", Pri: 15.2, + TieToLayer: "Legs", + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Hardware", + }, + { Name: "LegsBelts", Layer: "PetsuitLegs", Pri: 15.1, + TieToLayer: "Legs", + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Straps", + }, + { Name: "LeftLegs", Layer: "PetsuitLegs", Pri: 15, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplaceAmount: 50, + DisplacementInvariant: true, + DisplaceLayers: ToMap(["Petsuit"]), + DisplacementSprite: "PetsuitSquish", + InheritColor: "Suit", + }, + { Name: "LeftLegsBelts", Layer: "PetsuitLegs", Pri: 15.1, + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Straps", + }, + { Name: "LeftLegsLaces", Layer: "PetsuitLegs", Pri: 15.2, + TieToLayer: "LeftLegs", + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Laces", + }, + { Name: "LeftLegsHardware", Layer: "PetsuitLegs", Pri: 15.2, + TieToLayer: "LeftLegs", + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Hardware", + }, + ]) +}); + + +AddModel({ + Name: "CyberPetsuit", + Folder: "CyberPetsuit", + Parent: "Petsuit", + TopLevel: true, + Categories: ["Restraints", "Cosplay"], + Restraint: true, + AddPose: ["HideArms", "EncaseArmLeft", "EncaseArmRight", "ForceKneel", "Petsuit"], + HideLayerGroups: ["PetsuitArms"], + Filters: { + Display: {"gamma":1,"saturation":1,"contrast":1.6500000000000001,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Layers: ToLayerMap([ + { Name: "Arms", Layer: "BindForeArms", Pri: -15, + Invariant: true, + Poses: ToMap(["Front"]), + InheritColor: "Suit", + }, + { Name: "ArmsBelts", Layer: "BindForeArms", Pri: -14.9, + Invariant: true, + TieToLayer: "Arms", + NoOverride: true, + Poses: ToMap(["Front"]), + InheritColor: "Straps", + }, + { Name: "DisplayArms", Layer: "BindForeArms", Pri: -14.8, + Invariant: true, + TieToLayer: "Arms", + NoOverride: true, + Poses: ToMap(["Front"]), + InheritColor: "Display", + }, + { Name: "Legs", Layer: "PetsuitLegs", Pri: -5, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Suit", + }, + { Name: "DisplayLegs", Layer: "PetsuitLegs", Pri: 15.2, + TieToLayer: "Legs", + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Display", + }, + { Name: "LegsBelts", Layer: "PetsuitLegs", Pri: 15.1, + TieToLayer: "Legs", + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Straps", + }, + { Name: "LeftLegs", Layer: "PetsuitLegs", Pri: 15, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplaceAmount: 50, + DisplacementInvariant: true, + DisplaceLayers: ToMap(["Petsuit"]), + DisplacementSprite: "PetsuitSquish", + InheritColor: "Suit", + }, + { Name: "LeftLegsBelts", Layer: "PetsuitLegs", Pri: 15.1, + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Straps", + }, + { Name: "DisplayLeftLegs", Layer: "PetsuitLegs", Pri: 15.2, + TieToLayer: "LeftLegs", + NoOverride: true, + Poses: ToMap(["KneelClosed", "Kneel"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Display", + }, + ]) +}); diff --git a/Data/ModelList_Pony.ts b/Data/ModelList_Pony.ts new file mode 100644 index 000000000..bd74da5b8 --- /dev/null +++ b/Data/ModelList_Pony.ts @@ -0,0 +1,29 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + +AddModel({ + Name: "QuakeCollar", + Folder: "Pony", + Parent: "QuakeCollar", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Collar", Layer: "Collar", Pri: 100, + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "CollarTag", Layer: "CollarAcc", Pri: 100, + MorphPoses: {Hogtie: "Hogtie"}, + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel(GetModelRestraintVersion("QuakeCollar", true)); diff --git a/Data/ModelList_PureWind.ts b/Data/ModelList_PureWind.ts new file mode 100644 index 000000000..17f4c4187 --- /dev/null +++ b/Data/ModelList_PureWind.ts @@ -0,0 +1,348 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "NightWhip", + Folder: "Weapon", + TopLevel: true, + Protected: false, + Categories: ["Weapon"], + Layers: ToLayerMap([{ + Name: "NightWhip", + Layer: "Weapon", + Pri: 0, + NoOverride: true, + Poses: { + Free: true + }, + }, { + Name: "NightWhipLight", + Layer: "Weapon", + Pri: 1, + NoOverride: true, + Poses: { + Free: true + }, + TieToLayer: "NightWhip" + } + ]), + "Filters": { + "NightWhip": { + "gamma": 1, + "saturation": 1, + "contrast": 1.5666666666666669, + "brightness": 1.05, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 1 + } + } +}); +AddModel({ + Name: "LatexWhip", + Folder: "Weapon", + TopLevel: true, + Protected: false, + Categories: ["Weapon"], + Layers: ToLayerMap([{ + Name: "LatexWhip", + Layer: "Weapon", + Pri: 0, + NoOverride: true, + Poses: { + Free: true + }, + }, + ]), + "Filters": { + "LatexWhip": { + "gamma": 1, + "saturation": 0, + "contrast": 1.25, + "brightness": 1, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 1 + } + } +}); + +AddModel({ + Name: "KittyLatexEar", + Folder: "KittyLatex", + Parent: "KittyLatex", + TopLevel: false, + Protected: true, + Categories: ["Ears", "Kitty", "Face", "Cosplay"], + AddPose: ["AnimalEars", "Kitty", "Cosplay"], + Layers: ToLayerMap([{ + Name: "KittyLatexEar", + Layer: "AnimalEars", + Pri: 11, + Invariant: true, + InheritColor: "Ears", + }, { + Name: "KittyLatexEarLight", + Layer: "AnimalEars", + Pri: 11.1, + Invariant: true, + TieToLayer: "KittyLatexEar", + NoOverride: true, + InheritColor: "InnerEarsLight", + }, { + Name: "KittyLatexEarMuff", + Layer: "HairFront", + Pri: 21, + Invariant: true, + }, { + Name: "KittyLatexEarMuffLight2", + Layer: "HairFront", + Pri: 21.1, + Invariant: true, + TieToLayer: "KittyLatexEarMuff", + NoOverride: true, + }, { + Name: "KittyLatexEarMuffLight1", + Layer: "HairFront", + Pri: 21.2, + Invariant: true, + TieToLayer: "KittyLatexEarMuff", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "KittyLatexTail", + Folder: "KittyLatex", + Parent: "KittyLatex", + TopLevel: false, + Protected: true, + Categories: ["Tails", "Kitty", "Cosplay"], + AddPose: ["Tails", "Kitty"], + Layers: ToLayerMap([{ + Name: "KittyLatexTail", + Layer: "Tail", + Pri: 1, + Invariant: true, + }, { + Name: "KittyLatexTailLight", + Layer: "Tail", + Pri: 1.1, + Invariant: true, + TieToLayer: "KittyLatexTail" + }, + ]) +}); + +AddModel({ + Name: "KittyLatexTail2", + Folder: "KittyLatex", + Parent: "KittyLatex", + TopLevel: false, + Protected: true, + Categories: ["Tails", "Kitty", "Cosplay"], + AddPose: ["Tails", "Kitty"], + Layers: ToLayerMap([{ + Name: "KittyLatexTail", + Layer: "Tail", + Pri: 1, + Invariant: true, + }, { + Name: "KittyLatexTail2", + Layer: "Tail", + Pri: 1.1, + Invariant: true, + }, { + Name: "KittyLatexTailLight", + Layer: "Tail", + Pri: 1.2, + Invariant: true, + TieToLayer: "KittyLatexTail" + }, { + Name: "KittyLatexTail2Light", + Layer: "Tail", + Pri: 1.3, + Invariant: true, + TieToLayer: "KittyLatexTail2" + }, + ]) +}); + +AddModel({ + Name: "KittyLatex", + Folder: "KittyLatex", + TopLevel: true, + Protected: true, + Categories: ["Cosplay"], + Layers: ToLayerMap([ + ...GetModelLayers("KittyLatexEar"), + ...GetModelLayers("KittyLatexTail"), + ...GetModelLayers("KittyLatexTail2"), + ]) +}); + +AddModel({ + Name: "SuccubusWing", + Folder: "Succubus", + Parent: "Succubus", + TopLevel: false, + Protected: true, + Categories: ["Cosplay"], + AddPose: ["Wings", "Demon", "Cosplay"], + Layers: ToLayerMap([{ + Name: "SuccubusWingBase", + Layer: "Wings", + Pri: 1, + Invariant: true, + }, { + Name: "SuccubusWingBack", + Layer: "Wings", + Pri: 1.1, + Invariant: true, + TieToLayer: "SuccubusWingBase", + NoOverride: true, + }, { + Name: "SuccubusWingLight", + Layer: "Wings", + Pri: 1.2, + Invariant: true, + TieToLayer: "SuccubusWingBase", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "SuccubusHorn", + Folder: "Succubus", + Parent: "Succubus", + TopLevel: false, + Protected: true, + Categories: ["Ears", "Face", "Cosplay"], + AddPose: ["Demon", "Cosplay"], + Layers: ToLayerMap([{ + Name: "SuccubusHornRight", + Layer: "AnimalEars", + Pri: 10, + Invariant: true + }, { + Name: "SuccubusHornLeft", + Layer: "AnimalEarsFront", + Pri: 10.1, + Invariant: true, + TieToLayer: "SuccubusHornRight" + }, { + Name: "SuccubusHornLight", + Layer: "AnimalEarsFront", + Pri: 10.2, + Invariant: true, + TieToLayer: "SuccubusHornRight" + }, + ]) +}); + +AddModel({ + Name: "SuccubusTail", + Folder: "Succubus", + Parent: "Succubus", + TopLevel: false, + Protected: true, + Categories: ["Tails", "Face", "Cosplay"], + AddPose: ["Tails", "Demon", "Cosplay"], + Layers: ToLayerMap([{ + Name: "SuccubusTail", + Layer: "Tail", + Pri: 10, + Invariant: true + }, { + Name: "SuccubusTailLight", + Layer: "Tail", + Pri: 10.1, + Invariant: true, + TieToLayer: "SuccubusTail" + } + ]) +}); +AddModel({ + Name: "SuccubusClaws", + Folder: "Succubus", + Parent: "Succubus", + TopLevel: false, + Categories: ["Gloves", "Cosplay"], + Protected: true, + Layers: ToLayerMap([ + { Name: "SuccubusClawLeft", Layer: "GloveLeft", Pri: 14, + Poses: {Free: true, Yoked: true, Front: true, Wristtie: true}, + SwapLayerPose: { Front: "ForeGloveLeft", Crossed: "CrossGloveLeft" }, + HideWhenOverridden: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "SuccubusClawRight", Layer: "GloveRight", Pri: 14, + Poses: {Free: true, Yoked: true, Front: true, Wristtie: true}, + SwapLayerPose: { Front: "ForeGloveRight", Crossed: "CrossGloveRight" }, + HideWhenOverridden: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + ]) +}); +AddModel({ + Name: "SuccubusFeet", + Folder: "Succubus", + Parent: "Succubus", + TopLevel: true, + Categories: ["Cosplay"], + Protected: true, + Layers: ToLayerMap([ + { Name: "SockLeft", Layer: "StockingLeft", Pri: 5.1, + Poses: {Spread:true, Closed:true, Kneel:true, KneelClosed:true}, + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + HideWhenOverridden: true, + DisplaceLayers: {StockingLeft: true,}, + DisplacementSprite: "SockLSquish_Long", + DisplaceAmount: 10, + }, + { Name: "FootSockLeftHogtie", Layer: "SockLeftHogtie", Pri: 5.1, + Poses: ToMap(["Hogtie"]), + InheritColor: "SockLeft", + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "SockRight", Layer: "StockingRight", Pri: 5, + Poses: {Spread:true, Closed:true}, + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + HideWhenOverridden: true, + DisplaceLayers: {StockingRight: true,}, + DisplacementSprite: "SockLSquish_Short", + DisplaceAmount: 10, + }, + { Name: "FootSockRightKneel", Layer: "SockRightKneel", Pri: 5, + HidePoses: ToMap(["FeetLinked"]), + Poses: ToMap(["Kneel"]), + InheritColor: "SockRight", + Invariant: true, + HideWhenOverridden: true, + }, + ]) +}); +AddModel({ + Name: "Succubus", + Folder: "Succubus", + TopLevel: true, + Protected: true, + Categories: ["Cosplay"], + AddPose: ["AnimalEars", "Demon", "Tails", "Wings", "Cosplay"], + Layers: ToLayerMap([ + ...GetModelLayers("SuccubusHorn"), + ...GetModelLayers("SuccubusTail"), + ...GetModelLayers("SuccubusWing"), + ...GetModelLayers("SuccubusClaws"), + ...GetModelLayers("SuccubusFeet"), + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Restraints.ts b/Data/ModelList_Restraints.ts new file mode 100644 index 000000000..fc74e983b --- /dev/null +++ b/Data/ModelList_Restraints.ts @@ -0,0 +1,116 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "SteelYoke", + Folder: "Yoke", + Parent: "Yoke", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Metal", "Yokes"], + AddPose: ["Yokes"], + Layers: ToLayerMap([ + { Name: "Steel", Layer: "Yoke", Pri: 10, + Invariant: true, + HideWhenOverridden: true, + DisplacementSprite: "Yoke", + DisplaceLayers: ToMap(["Yoke"]), + DisplaceAmount: 40, + }, + { Name: "SteelBar", Layer: "Yoke", Pri: 10.1, + Invariant: true, + HideWhenOverridden: true, + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "HeavyYoke", + Folder: "Yoke", + Parent: "Yoke", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Metal", "Yokes"], + AddPose: ["Yokes"], + Layers: ToLayerMap([ + { Name: "HeavySteel", Layer: "Yoke", Pri: 35, + Invariant: true, + HideWhenOverridden: true, + DisplacementSprite: "Yoke", + DisplaceLayers: ToMap(["Yoke"]), + DisplaceAmount: 40, + InheritColor: "BaseMetal", + }, + { Name: "HeavySteelPins", Layer: "Yoke", Pri: 35.2, + Invariant: true, + HideWhenOverridden: true, + NoOverride: true, + TieToLayer: "HeavySteel", + InheritColor: "Pins", + LockLayer: true, + }, + { Name: "HeavySteelLock", Layer: "Yoke", Pri: 35.2, + Invariant: true, + HideWhenOverridden: true, + NoOverride: true, + TieToLayer: "HeavySteel", + InheritColor: "Locks", + LockLayer: true, + }, + { Name: "HeavySteelHardware", Layer: "Yoke", Pri: 35.1, + Invariant: true, + HideWhenOverridden: true, + NoOverride: true, + TieToLayer: "HeavySteel", + InheritColor: "Shackles", + LockLayer: true, + }, + ]) +}); + +AddModel({ + Name: "HeavyFiddle", + Folder: "Fiddle", + Parent: "Fiddle", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Metal", "Fiddles"], + AddPose: ["Fiddles"], + Layers: ToLayerMap([ + { Name: "FiddleLines", Layer: "FiddleFront", Pri: 5.1, + Invariant: true, + HideWhenOverridden: true, + NoColorize: true, + DisplacementSprite: "Fiddle", + DisplacementInvariant: true, + DisplaceLayers: ToMap(["Fiddle"]), + DisplaceAmount: 25, + }, + { Name: "FiddleBody", Layer: "FiddleFront", Pri: 5, + Invariant: true, + TieToLayer: "FiddleLines", + InheritColor: "BaseMetal", + }, + { Name: "FiddleLock", Layer: "FiddleFront", Pri: 5, + Invariant: true, + TieToLayer: "FiddleLines", + InheritColor: "Lock", + }, + { Name: "BackFiddleLines", Layer: "Yoke", Pri: 5.1, + Invariant: true, + HideWhenOverridden: true, + NoColorize: true, + }, + { Name: "BackFiddleBody", Layer: "Yoke", Pri: 5, + Invariant: true, + TieToLayer: "BackFiddleLines", + InheritColor: "BaseMetal", + }, + ]) +}); diff --git a/Data/ModelList_Ribbon.ts b/Data/ModelList_Ribbon.ts new file mode 100644 index 000000000..f1e491917 --- /dev/null +++ b/Data/ModelList_Ribbon.ts @@ -0,0 +1,440 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + +AddModel({ + Name: "RibbonCrosstie1", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["Crossties"], + Layers: ToLayerMap([ + { Name: "ArmStrap", Layer: "StrapsUnderbustOver", Pri: 4, + Poses: ToMap(["Crossed"]), + MorphPoses: {Crossed:"Crossed"}, + DisplacementSprite: "ArmStrap", + DisplacementMorph: {Crossed:"Crossed"}, + DisplaceLayers: ToMap(["Ribbon1"]), + InheritColor: "Ribbon", + }, + ]) +}); + +AddModel({ + Name: "RibbonBoxtie1", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["Boxties"], + Layers: ToLayerMap([ + { Name: "Arm1", Layer: "StrapsUnderbust", Pri: 4, + Poses: ToMap(["Boxtie"]), + DisplacementSprite: "Arm1Squish", + DisplaceLayers: ToMap(["Ribbon1"]), + InheritColor: "Ribbon", + }, + ]) +}); + + +AddModel({ + Name: "RibbonWristtie1", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["Wristties", "Chesttied"], + Layers: ToLayerMap([ + /*{ Name: "Arm1", Layer: "StrapsUnderbust", Pri: 4, + Poses: ToMap(["Wristtie"]), + DisplacementSprite: "Arm1Squish", + DisplaceLayers: ToMap(["Ribbon1"]), + },*/ + { Name: "ForeArm1", Layer: "BindArmLeft", Pri: 4, + Poses: ToMap(["Wristtie"]), + DisplacementSprite: "ForeArm1Squish", + DisplaceLayers: ToMap(["Ribbon1"]), + InheritColor: "Ribbon", + }, + ]) +}); + +// Cosmetic only +AddModel({ + Name: "RibbonChestStraps1", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["RibbonsLower"], + Layers: ToLayerMap([ + /*{ Name: "Arm1", Layer: "StrapsUnderbustOver", Pri: 4, + Poses: ToMap(["Boxtie", "Wristtie", "Crossed"]), + DisplacementSprite: "Arm1Squish", + DisplaceLayers: ToMap(["Ribbon1"]), + },*/ + /*{ Name: "Arm1Over", Layer: "StrapsUnderbustOver", Pri: 4, + Poses: ToMap(["Boxtie", "Wristtie"]), + },*/ + { Name: "Arm2", Layer: "ChestStraps", Pri: 4, + Poses: ToMap(["Boxtie", "Wristtie", "Crossed"]), + DisplacementSprite: "Arm2Squish", + DisplaceLayers: ToMap(["Ribbon1"]), + InheritColor: "Ribbon", + }, + { Name: "ForeArm2", Layer: "BindArmLeft", Pri: 4, + Poses: ToMap(["Wristtie"]), + DisplacementSprite: "ForeArm2Squish", + DisplaceLayers: ToMap(["Ribbon1"]), + InheritColor: "Ribbon", + }, + ]) +}); + + +AddModel({ + Name: "RibbonBoxtie2", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["Boxties"], + Layers: ToLayerMap([ + ...GetModelLayers("RibbonBoxtie1"), + ...GetModelLayers("RibbonChestStraps1"), + ]) +}); + + +AddModel({ + Name: "RibbonWristtie2", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["Wristties"], + Layers: ToLayerMap([ + ...GetModelLayers("RibbonWristtie1"), + ...GetModelLayers("RibbonChestStraps1"), + ]) +}); + + + +AddModel({ + Name: "RibbonChestStraps2", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["RibbonsUpper"], + Layers: ToLayerMap([ + /*{ Name: "Arm2", Layer: "ChestStraps", Pri: 4, + Poses: ToMap(["Boxtie", "Wristtie", "Crossed"]), + DisplacementSprite: "Arm2Squish", + DisplaceLayers: ToMap(["Ribbon1"]), + }, + { Name: "ForeArm2", Layer: "LowerArmBondageLeft", Pri: 4, + Poses: ToMap(["Wristtie"]), + DisplacementSprite: "ForeArm2Squish", + DisplaceLayers: ToMap(["Ribbon1"]), + },*/ + { Name: "ArmHarness", Layer: "ChestStraps", Pri: 3, + Poses: ToMapSubtract([...ARMPOSES], ["Up"]), + DisplacementSprite: "ArmHarnessSquish", + DisplaceLayers: ToMap(["Ribbon1"]), + Invariant: true, + InheritColor: "Ribbon", + }, + { Name: "ArmHarnessUnderbust", Layer: "StrapsUnderbust", Pri: 2, + Invariant: true, + InheritColor: "Ribbon", + }, + { Name: "ArmStrap", Layer: "ChestStraps", Pri: 2, + Poses: ToMap(["Crossed"]), + MorphPoses: {Crossed:"Crossed"}, + InheritColor: "Ribbon", + }, + { Name: "ArmHarnessUp", Sprite: "ArmHarness", Layer: "ChestStraps", Pri: 3, + Poses: ToMap([...ARMPOSES]), + Invariant: true, + InheritColor: "Ribbon", + }, + ]) +}); + + +AddModel({ + Name: "RibbonCuffs", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["Handcuffed"], + Layers: ToLayerMap([ + { Name: "Cuffs", Layer: "ForeWrists", Pri: 4, + Poses: ToMap(["Front", "Crossed"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "StrapsUnderbustOver"}, + DisplacementSprite: "CuffsSquish", + DisplaceLayers: ToMap(["RibbonFore"]), + InheritColor: "Ribbon", + }, + ]) +}); + +AddModel({ + Name: "RibbonBelt", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + Layers: ToLayerMap([ + { Name: "Belt", Layer: "BeltBondage", Pri: 4, + Invariant: true, + DisplacementSprite: "BeltSquish", + DisplaceLayers: ToMap(["RibbonCalf"]), + InheritColor: "Ribbon", + }, + ]) +}); + +AddModel({ + Name: "RibbonHarness", + Folder: "Ribbon", + Parent: "Ribbon", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "Harness", Layer: "HarnessOver", Pri: 4, + //MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + DisplacementInvariant: true, + DisplacementSprite: "HarnessSquish", + DisplaceLayers: ToMap(["RibbonTorso"]), + InheritColor: "Ribbon", + }, + { Name: "HarnessMid", Layer: "HarnessMid", Pri: 4, + Invariant: true, + AppendPose: {FlattenedUnderbust: "Flattened"}, + DisplacementInvariant: true, + DisplacementSprite: "HarnessSquish", + DisplaceLayers: ToMap(["RibbonTorso"]), + InheritColor: "Ribbon", + }, + { Name: "HarnessLower", Layer: "HarnessMid", Pri: 4, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + //MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + InheritColor: "Ribbon", + //DisplacementInvariant: true, + //DisplacementSprite: "HarnessSquish", + //DisplaceLayers: ToMap(["RibbonTorso"]), + }, + { Name: "HarnessLowerStrap", Layer: "HarnessMid", Pri: 4, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Ribbon", + }, + ]) +}); +AddModel({ + Name: "RibbonCrotch", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPoseConditional: { + OptionCrotchRope: ["CrotchStrap"], + }, + AddPoseIf: { + //ChastityBelt: ["OptionCrotchRope"], + }, + Layers: ToLayerMap([ + { Name: "Crotch", Layer: "HarnessMid", Pri: -95, + //MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + SwapLayerPose: {OptionCrotchRope: "CrotchRope"}, + Invariant: true, + InheritColor: "Ribbon", + DisplacementInvariant: true, + DisplacementSprite: "CrotchropeSquished", + DisplaceLayers: ToMap(["RibbonTorso"]), + + }, + { Name: "CrotchStrap", Layer: "HarnessMid", Pri: -95.1, + SwapLayerPose: {OptionCrotchRope: "CrotchRope"}, + Invariant: true, + InheritColor: "Ribbon", + }, + ]) +}); + +AddModel({ + Name: "RibbonToes", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["FeetLinked"], + Layers: ToLayerMap([ + { Name: "Toe", Layer: "OverShoes", Pri: 14, + Poses: ToMap(["Closed"]), + CrossHideOverride: true, + HideOverrideLayerMulti: ["ToeTie"], + InheritColor: "Ribbon", + }, + ]) +}); + +AddModel({ + Name: "RibbonFeet", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["FeetLinked", "RibbonsAnkle"], + Layers: ToLayerMap([ + { Name: "Feet", Layer: "OverShoes", Pri: 15, + Poses: ToMap(["Closed", "KneelClosed"]), + DisplacementSprite: "AnklesSquish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonCalf"]), + InheritColor: "Ribbon", + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("RibbonFeetHeavy", "RibbonFeet", [ + ...GetModelLayers("RibbonToes"), +], "RibbonHarness", false)); + + +AddModel({ + Name: "RibbonAnkles1", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["FeetLinked", "RibbonsAnkle"], + Layers: ToLayerMap([ + { Name: "Calf1", Layer: "Ankles1", Pri: 5, + Poses: ToMap(["Closed", "KneelClosed"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementSprite: "Calf1Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonCalf"]), + InheritColor: "Ribbon", + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("RibbonAnkles2", "RibbonAnkles1", [ + { Name: "Calf2", Layer: "Ankles2", Pri: 5, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + DisplacementSprite: "Calf2Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonCalf"]), + InheritColor: "Ribbon", + }, +], "RibbonHarness", false)); + + +AddModel(GetModelWithExtraLayers("RibbonAnkles3", "RibbonAnkles2", [ + { Name: "Calf3", Layer: "Ankles3", Pri: 5, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + DisplacementSprite: "Calf3Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonCalf"]), + InheritColor: "Ribbon", + }, +], "RibbonHarness", false)); + + + +AddModel({ + Name: "RibbonLegs1", + Folder: "Ribbon", + Parent: "RibbonHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["FeetLinked"], + Layers: ToLayerMap([ + { Name: "Thigh1", Layer: "Thighs1", Pri: 5, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementMorph: {Hogtie: "Hogtie"}, + DisplacementSprite: "Thigh1Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonThighs"]), + InheritColor: "Ribbon", + }, + { Name: "RightThigh1", Layer: "RightThighs1", Pri: 5, + Poses: ToMap(["KneelClosed"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Ribbon", + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("RibbonLegs2", "RibbonLegs1", [ + { Name: "Thigh2", Layer: "Thighs2", Pri: 5, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementMorph: {Hogtie: "Hogtie"}, + DisplacementSprite: "Thigh2Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonThighs"]), + InheritColor: "Ribbon", + }, + { Name: "RightThigh2", Layer: "RightThighs2", Pri: 5, + Poses: ToMap(["KneelClosed"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Ribbon", + }, +], "RibbonHarness", false)); + + +AddModel(GetModelWithExtraLayers("RibbonLegs3", "RibbonLegs2", [ + { Name: "Thigh3", Layer: "Thighs3", Pri: 5, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementMorph: {Hogtie: "Hogtie"}, + DisplacementSprite: "Thigh3Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonThighs"]), + InheritColor: "Ribbon", + }, + { Name: "RightThigh3", Layer: "RightThighs3", Pri: 5, + Poses: ToMap(["KneelClosed"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Ribbon", + }, +], "RibbonHarness", false)); + +AddModel(GetModelFashionVersion("RibbonHarness", true)); +AddModel(GetModelFashionVersion("RibbonCrotch", true)); \ No newline at end of file diff --git a/Data/ModelList_RobeOfChastity.ts b/Data/ModelList_RobeOfChastity.ts new file mode 100644 index 000000000..45e22f309 --- /dev/null +++ b/Data/ModelList_RobeOfChastity.ts @@ -0,0 +1,133 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + +AddModel({ + Name: "MiniCape", + Folder: "RobeOfChastity", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Cape", Layer: "Cape", Pri: 35, + Invariant: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + }, + ]) +}); + + + +AddModel({ + Name: "Epaulettes", + Folder: "RobeOfChastity", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Pauldrons", Layer: "Shoulders", Pri: 8, + Poses: ToMapSubtract([...ARMPOSES], [...HIDEARMPOSES, "Up"]), + MorphPoses: {Yoked: "Yoked", Wristtie: "Tied", Boxtie: "Tied", Front: "Tied", Crossed: "Tied"}, + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "TheRobeOfChastity", + Folder: "RobeOfChastity", + Parent: "RobeOfChastity", + TopLevel: true, + Categories: ["Bodysuits"], + Layers: ToLayerMap([ + { Name: "Base", Layer: "BodysuitOver", Pri: 90, + Poses: ToMap([...LEGPOSES]), + InheritColor: "Lines", + HideWhenOverridden: true, + }, + { Name: "ChestBase", Layer: "SuitChestOver", Pri: 90, + //Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Lines", + HideWhenOverridden: true, + }, + { Name: "Frill", Layer: "BodysuitOver", Pri: 90, + Poses: ToMap([...LEGPOSES]), + InheritColor: "Frill", + TieToLayer: "Base", + NoOverride: true, + }, + { Name: "ChestFrill", Layer: "SuitChestOver", Pri: 89.9, + //Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Frill", + TieToLayer: "ChestBase", + NoOverride: true, + }, + { Name: "Gold", Layer: "BodysuitOver", Pri: 89.9, + Poses: ToMap([...LEGPOSES]), + InheritColor: "Gold", + TieToLayer: "Base", + NoOverride: true, + }, + { Name: "ChestGold", Layer: "SuitChestOver", Pri: 89.9, + //Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Gold", + TieToLayer: "ChestBase", + NoOverride: true, + }, + { Name: "Plate", Layer: "BodysuitOver", Pri: 89.9, + Poses: ToMap([...LEGPOSES]), + InheritColor: "Plate", + TieToLayer: "Base", + NoOverride: true, + }, + { Name: "ChestPlate", Layer: "SuitChestOver", Pri: 89.9, + //Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "ChestPlate", + TieToLayer: "ChestBase", + NoOverride: true, + }, + { Name: "GoldBase", Layer: "BodysuitOver", Pri: 89.8, + Poses: ToMap([...LEGPOSES]), + InheritColor: "GoldBase", + TieToLayer: "Base", + NoOverride: true, + }, + { Name: "ChestGoldBase", Layer: "SuitChestOver", Pri: 89.8, + //Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "GoldBase", + TieToLayer: "ChestBase", + NoOverride: true, + }, + { Name: "Fabric", Layer: "BodysuitOver", Pri: 89.8, + Poses: ToMap([...LEGPOSES]), + InheritColor: "Fabric", + TieToLayer: "Base", + NoOverride: true, + }, + { Name: "ChestFabric", Layer: "SuitChestOver", Pri: 89.8, + //Poses: ToMap([...ARMPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + InheritColor: "Fabric", + TieToLayer: "ChestBase", + NoOverride: true, + }, + + ...GetModelLayers("MiniCape"), + ...GetModelLayers("Epaulettes"), + + + ]) +}); + + +AddModel(GetModelRestraintVersion("TheRobeOfChastity", true)); + diff --git a/Data/ModelList_Rope.ts b/Data/ModelList_Rope.ts new file mode 100644 index 000000000..2c190b191 --- /dev/null +++ b/Data/ModelList_Rope.ts @@ -0,0 +1,515 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + +AddModel({ + Name: "RopeSuspension", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Rope", "Suspension"], + AddPose: ["SuspendedHogtie"], + Layers: ToLayerMap([ + { Name: "Suspension", Layer: "FurnitureBack", Pri: 10, + Invariant: true, + InheritColor: "Rope", + NoOverride: true, + }, + { Name: "Belt", Layer: "BeltBondage", Pri: 0, + Invariant: true, + DisplacementSprite: "BeltSquish", + DisplaceLayers: ToMap(["RopeCalf"]), + InheritColor: "Rope", + NoOverride: true, + }, + + ]) +}); + +AddModel({ + Name: "RopeCrosstie1", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["Crossties"], + Layers: ToLayerMap([ + { Name: "ArmStrap", Layer: "StrapsUnderbustOver", Pri: 0, + Poses: ToMap(["Crossed"]), + MorphPoses: {Crossed:"Crossed"}, + DisplacementSprite: "ArmStrap", + DisplacementMorph: {Crossed:"Crossed"}, + DisplaceLayers: ToMap(["Rope1"]), + InheritColor: "Rope", + NoOverride: true, + }, + { Name: "Arm1", Layer: "StrapsUnderbust", Pri: 0, + Poses: ToMap(["Boxtie", "Wristtie"]), + DisplacementSprite: "Arm1Squish", + DisplaceLayers: ToMap(["Rope1"]), + InheritColor: "Rope", + NoOverride: true, + }, + { Name: "ForeArm1", Layer: "BindArmLeft", Pri: 0, + Poses: ToMap(["Wristtie"]), + DisplacementSprite: "ForeArm1Squish", + DisplaceLayers: ToMap(["Rope1"]), + InheritColor: "Rope", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "RopeBoxtie1", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["Boxties"], + Layers: ToLayerMap([ + ...GetModelLayers("RopeCrosstie1"), + ]) +}); + + +AddModel({ + Name: "RopeWristtie1", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["Wristties"], + Layers: ToLayerMap([ + ...GetModelLayers("RopeCrosstie1"), + ]) +}); + +// Cosmetic only +AddModel({ + Name: "RopeChestStraps1", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["RopesLower"], + Layers: ToLayerMap([ + /*{ Name: "Arm1", Layer: "StrapsUnderbustOver", Pri: 0, + Poses: ToMap(["Boxtie", "Wristtie", "Crossed"]), + DisplacementSprite: "Arm1Squish", + DisplaceLayers: ToMap(["Rope1"]), + },*/ + /*{ Name: "Arm1Over", Layer: "StrapsUnderbustOver", Pri: 0, + Poses: ToMap(["Boxtie", "Wristtie"]), + },*/ + /*{ Name: "Arm1", Layer: "StrapsUnderbust", Pri: 0, + Poses: ToMap(["Boxtie", "Wristtie"]), + DisplacementSprite: "Arm1Squish", + DisplaceLayers: ToMap(["Rope1"]), + InheritColor: "Rope", + },*/ + { Name: "Arm2", Layer: "ChestStraps", Pri: 0, + Poses: ToMap(["Boxtie", "Wristtie", "Crossed"]), + DisplacementSprite: "Arm2Squish", + DisplaceLayers: ToMap(["Rope1"]), + InheritColor: "Rope", + NoOverride: true, + }, + { Name: "ForeArm2", Layer: "BindArmLeft", Pri: 0, + Poses: ToMap(["Wristtie"]), + DisplacementSprite: "ForeArm2Squish", + DisplaceLayers: ToMap(["Rope1"]), + InheritColor: "Rope", + NoOverride: true, + }, + ]) +}); + + +AddModel({ + Name: "RopeBoxtie2", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["Boxties"], + Layers: ToLayerMap([ + ...GetModelLayers("RopeBoxtie1"), + ...GetModelLayers("RopeChestStraps1"), + ]) +}); +AddModel({ + Name: "RopeWristtie2", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["Wristties"], + Layers: ToLayerMap([ + ...GetModelLayers("RopeWristtie1"), + ...GetModelLayers("RopeChestStraps1"), + ]) +}); + +AddModel({ + Name: "RopeChestStraps2", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["RopesUpper"], + Layers: ToLayerMap([ + /*{ Name: "Arm2", Layer: "ChestStraps", Pri: 0, + Poses: ToMap(["Boxtie", "Wristtie", "Crossed"]), + DisplacementSprite: "Arm2Squish", + DisplaceLayers: ToMap(["Rope1"]), + }, + { Name: "ForeArm2", Layer: "LowerArmBondageLeft", Pri: 0, + Poses: ToMap(["Wristtie"]), + DisplacementSprite: "ForeArm2Squish", + DisplaceLayers: ToMap(["Rope1"]), + },*/ + { Name: "ArmHarness", Layer: "ChestStraps", Pri: -1, + Poses: ToMapSubtract([...ARMPOSES], ["Up"]), + DisplacementSprite: "ArmHarnessSquish", + DisplaceLayers: ToMap(["Rope1"]), + Invariant: true, + InheritColor: "Rope", + NoOverride: true, + }, + { Name: "ArmStrapHarness", Layer: "ChestStraps", Pri: -2, + Poses: ToMap(["Crossed"]), + MorphPoses: {Crossed:"Crossed"}, + InheritColor: "Rope", + NoOverride: true, + }, + { Name: "ArmHarnessUp", Sprite: "ArmHarness", Layer: "ChestStraps", Pri: -1, + Poses: ToMap([...ARMPOSES]), + Invariant: true, + InheritColor: "Rope", + NoOverride: true, + }, + ]) +}); + + +AddModel({ + Name: "RopeBoxtie3", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["Boxties"], + Layers: ToLayerMap([ + ...GetModelLayers("RopeBoxtie2"), + ...GetModelLayers("RopeChestStraps2"), + ]) +}); +AddModel({ + Name: "RopeWristtie3", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["Wristties"], + Layers: ToLayerMap([ + ...GetModelLayers("RopeWristtie2"), + ...GetModelLayers("RopeChestStraps2"), + ]) +}); + + +AddModel({ + Name: "RopeCuffs", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["Handcuffed"], + Layers: ToLayerMap([ + { Name: "Cuffs", Layer: "ForeWrists", Pri: 0, + Poses: ToMap(["Front", "Crossed"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "StrapsUnderbustOver"}, + DisplacementSprite: "CuffsSquish", + DisplaceLayers: ToMap(["RopeFore"]), + InheritColor: "Rope", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "RopeBelt", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + Layers: ToLayerMap([ + { Name: "Belt", Layer: "BeltBondage", Pri: 0, + Invariant: true, + DisplacementSprite: "BeltSquish", + DisplaceLayers: ToMap(["RopeCalf"]), + InheritColor: "Rope", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "RopeHarness", + Folder: "Rope", + Parent: "Rope", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["CrotchStrap", "Chesttied"], + Layers: ToLayerMap([ + { Name: "Harness", Layer: "HarnessOver", Pri: 0, + //MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + DisplacementInvariant: true, + DisplacementSprite: "HarnessSquish", + DisplaceLayers: ToMap(["RopeTorso"]), + InheritColor: "Rope", + }, + { Name: "HarnessLower", Layer: "HarnessMid", Pri: -50, + Invariant: true, + DisplacementInvariant: true, + DisplacementSprite: "HarnessSquish", + DisplaceLayers: ToMap(["RopeTorso"]), + InheritColor: "Rope", + }, + { Name: "HarnessLowerStrap", Layer: "HarnessMid", Pri: -50.1, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Rope", + }, + ]) +}); +AddModel({ + Name: "RopeCrotch", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPoseConditional: { + OptionCrotchRope: ["CrotchStrap"], + }, + AddPoseIf: { + //ChastityBelt: ["OptionCrotchRope"], + }, + Layers: ToLayerMap([ + { Name: "Crotchrope", Layer: "HarnessMid", Pri: -100, + //MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + SwapLayerPose: {OptionCrotchRope: "CrotchRope"}, + Invariant: true, + DisplacementInvariant: true, + DisplacementSprite: "CrotchropeSquished", + DisplaceLayers: ToMap(["RopeTorso"]), + InheritColor: "Rope", + + }, + { Name: "CrotchropeStrap", Layer: "HarnessMid", Pri: -101, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + SwapLayerPose: {OptionCrotchRope: "CrotchRope"}, + Invariant: true, + InheritColor: "Rope", + }, + ]) +}); + +AddModel({ + Name: "RopeToes", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["FeetLinked"], + Layers: ToLayerMap([ + { Name: "Toe", Layer: "OverShoes", Pri: 10, + Poses: ToMap(["Closed"]), + CrossHideOverride: true, + HideOverrideLayerMulti: ["ToeTie"], + InheritColor: "Rope", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "RopeFeet", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["FeetLinked", "RopesAnkle"], + Layers: ToLayerMap([ + { Name: "Ankles", Layer: "OverShoes", Pri: 11, + Poses: ToMap(["Closed", "KneelClosed"]), + DisplacementSprite: "AnklesSquish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RopeCalf"]), + AppendPose: {WrapFeet: "Over"}, + NoAppendDisplacement: true, + InheritColor: "Rope", + NoOverride: true, + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("RopeFeetHeavy", "RopeFeet", [ + ...GetModelLayers("RopeToes"), +], "RopeHarness", false)); + + +AddModel({ + Name: "RopeAnkles1", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["FeetLinked", "RopesAnkle"], + Layers: ToLayerMap([ + { Name: "Calf1", Layer: "Ankles1", Pri: 1, + Poses: ToMap(["Closed", "KneelClosed"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementSprite: "Calf1Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RopeCalf"]), + AppendPose: {WrapAnkles: "Over"}, + NoAppendDisplacement: true, + InheritColor: "Rope", + NoOverride: true, + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("RopeAnkles2", "RopeAnkles1", [ + { Name: "Calf2", Layer: "Ankles2", Pri: 1, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + DisplacementSprite: "Calf2Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RopeCalf"]), + AppendPose: {WrapAnkles: "Over"}, + NoAppendDisplacement: true, + InheritColor: "Rope", + NoOverride: true, + }, +], "RopeHarness", false)); + + +AddModel(GetModelWithExtraLayers("RopeAnkles3", "RopeAnkles2", [ + { Name: "Calf3", Layer: "Ankles3", Pri: 1, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + DisplacementSprite: "Calf3Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RopeCalf"]), + AppendPose: {WrapAnkles: "Over"}, + NoAppendDisplacement: true, + InheritColor: "Rope", + NoOverride: true, + }, +], "RopeHarness", false)); + + + +AddModel({ + Name: "RopeLegs1", + Folder: "Rope", + Parent: "RopeHarness", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rope"], + AddPose: ["FeetLinked"], + Layers: ToLayerMap([ + { Name: "Thigh1", Layer: "Thighs1", Pri: 0, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementMorph: {Hogtie: "Hogtie"}, + DisplacementSprite: "Thigh1Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RopeThighs"]), + AppendPose: {WrapLegs: "Over"}, + NoAppendDisplacement: true, + InheritColor: "Rope", + NoOverride: true, + }, + { Name: "RightThigh1", Layer: "RightThighs1", Pri: 0, + Poses: ToMap(["KneelClosed"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Rope", + NoOverride: true, + }, + ]) +}); + +AddModel(GetModelWithExtraLayers("RopeLegs2", "RopeLegs1", [ + { Name: "Thigh2", Layer: "Thighs2", Pri: 0, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementMorph: {Hogtie: "Hogtie"}, + DisplacementSprite: "Thigh2Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RopeThighs"]), + AppendPose: {WrapLegs: "Over"}, + NoAppendDisplacement: true, + InheritColor: "Rope", + NoOverride: true, + }, + { Name: "RightThigh2", Layer: "RightThighs2", Pri: 0, + Poses: ToMap(["KneelClosed"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Rope", + NoOverride: true, + }, +], "RopeHarness", false)); + + +AddModel(GetModelWithExtraLayers("RopeLegs3", "RopeLegs2", [ + { Name: "Thigh3", Layer: "Thighs3", Pri: 1, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementMorph: {Hogtie: "Hogtie"}, + DisplacementSprite: "Thigh3Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RopeThighs"]), + AppendPose: {WrapLegs: "Over"}, + NoAppendDisplacement: true, + InheritColor: "Rope", + NoOverride: true, + }, + { Name: "RightThigh3", Layer: "RightThighs3", Pri: 0, + Poses: ToMap(["KneelClosed"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Rope", + NoOverride: true, + }, +], "RopeHarness", false)); + + +AddModel(GetModelFashionVersion("RopeHarness", true)); +AddModel(GetModelFashionVersion("RopeCrotch", true)); +AddModel(GetModelFashionVersion("RopeChestStraps2", true)); \ No newline at end of file diff --git a/Data/ModelList_Rubber.ts b/Data/ModelList_Rubber.ts new file mode 100644 index 000000000..3b9fd9ef6 --- /dev/null +++ b/Data/ModelList_Rubber.ts @@ -0,0 +1,385 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "RubberMouth", + Folder: "Rubber", + Parent: "RubberHead", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseMouth"], + Layers: ToLayerMap([ + { Name: "FaceMouth", Layer: "GagOver", Pri: -60, + Invariant: true, + NoOverride: true, + InheritColor: "Rubber", + AddPriWithPose: { + ItemMouthRubberOver: 45, + }, + }, + ]) +}); + +AddModel({ + Name: "RubberEyes", + Folder: "Rubber", + Parent: "RubberHead", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseEyes"], + Layers: ToLayerMap([ + { Name: "FaceEyes", Layer: "Blindfold", Pri: -25, + Invariant: true, + NoOverride: true, + InheritColor: "Rubber", + AddPriWithPose: { + ItemHeadRubberOver: 45, + }, + }, + ]) +}); + +AddModel({ + Name: "RubberHead", + Folder: "Rubber", + Parent: "Rubber", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseEyes", "EncaseMouth", "EncaseHead"], + AddPoseConditional: { + Xray: ["HoodMask",], + }, + Layers: ToLayerMap([ + { Name: "FaceFull", Layer: "Hood", Pri: -25, + Invariant: true, + NoOverride: true, + InheritColor: "Rubber", + AddPriWithPose: { + ItemHeadRubberOver: 10, + }, + }, + ]) +}); + +AddModel({ + Name: "RubberBoots", + Folder: "Rubber", + Parent: "RubberLegs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseFeet"], + Layers: ToLayerMap([ + { Name: "FootLeft", Layer: "WrappingLegsUnder", Pri: 50, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + NoOverride: true, + InheritColor: "Rubber", + AddPriWithPose: { + ItemBootsRubberOver: 45, + }, + DisplaceLayers: ToMap(["Heels"]), + DisplaceAmount: 100, + DisplacementSprite: "SlimeLeft", + DisplacementPoses: ["Closed"], + }, + { Name: "FootRight", Layer: "WrappingLegsRight", Pri: 50, + //SwapLayerPose: {Kneel: "WrappingLegsRight", KneelClosed: "WrappingLegsRight"}, + Poses: ToMap(["Closed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + NoOverride: true, + InheritColor: "Rubber", + AddPriWithPose: { + ItemBootsRubberOver: 45, + }, + DisplaceLayers: ToMap(["HeelRight"]), + DisplaceAmount: 100, + DisplacementSprite: "SlimeRight", + DisplacementPoses: ["Closed"], + }, + ]) +}); + +AddModel({ + Name: "RubberTorsoLower", + Folder: "Rubber", + Parent: "RubberLegs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseTorsoLower"], + Layers: ToLayerMap([ + { Name: "TorsoLower", Layer: "WrappingTorsoLower", Pri: 54, + //swaplayerpose: {Kneel: "WrappingTorso", KneelClosed: "WrappingTorso"}, + Invariant: true, + InheritColor: "Rubber", + MorphPoses: {KneelClosed: "Kneel"}, + HideWhenOverridden: true, + AddPriWithPose: { + ItemLegsRubberOver: 45, + }, + }, + ]) +}); + +AddModel({ + Name: "RubberThighs", + Folder: "Rubber", + Parent: "RubberLegs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["FeetLinked", "EncaseLegs"], + Layers: ToLayerMap([ + { Name: "LegLeft", Layer: "WrappingLegsOver2", Pri: 25, + Poses: ToMap(["Closed", "KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Rubber", + HideWhenOverridden: true, + AddPriWithPose: { + ItemLegsRubberOver: 45, + }, + DisplaceAmount: 100, + DisplaceLayers: ToMap(["SlimeThighs"]), + DisplacementSprite: "SlimeThighs", + }, + { Name: "LegRight", Layer: "WrappingLegsOver2", Pri: 25, + //SwapLayerPose: {Kneel: "WrappingLegsRightOver", KneelClosed: "WrappingLegsRightOver"}, + Poses: ToMap(["Closed", "KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Rubber", + HideWhenOverridden: true, + AddPriWithPose: { + ItemLegsRubberOver: 45, + }, + }, + ]) +}); + + +AddModel({ + Name: "RubberLegs", + Folder: "Rubber", + Parent: "Rubber", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["FeetLinked", "EncaseTorsoLower", "EncaseLegs"], + Layers: ToLayerMap([ + ...GetModelLayers("RubberThighs"), + ...GetModelLayers("RubberTorsoLower"), + ]) +}); + + +AddModel({ + Name: "RubberFeet", + Folder: "Rubber", + Parent: "RubberLegs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["FeetLinked", "EncaseAnkles"], + Layers: ToLayerMap([ + { Name: "AnkleLeft", Layer: "WrappingAnklesOver", Pri: 25, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + SwapLayerPose: {Kneel: "WrappingLegsOver", KneelClosed: "WrappingLegsOver"}, + InheritColor: "Rubber", + HideWhenOverridden: true, + AddPriWithPose: { + ItemFeetRubberOver: 45, + }, + }, + { Name: "AnkleRight", Layer: "WrappingAnklesOver", Pri: 25, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Rubber", + HideWhenOverridden: true, + AddPriWithPose: { + ItemFeetRubberOver: 45, + }, + }, + ]) +}); + + +AddModel({ + Name: "Hobbleskirt", + Folder: "Rubber", + Parent: "Rubber", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["FeetLinked", "EncaseTorsoLower", "EncaseLegs", "FeetLinked", "EncaseAnkles"], + Layers: ToLayerMap([ + ...GetModelLayers("RubberThighs"), + ...GetModelLayers("RubberTorsoLower"), + ...GetModelLayers("RubberFeet"), + ]) +}); + + +AddModel({ + Name: "RubberArmLeft", + Folder: "Rubber", + Parent: "RubberArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseArmLeft"], + Layers: ToLayerMap([ + { Name: "ArmLeft", Layer: "WrapArms", Pri: 25, + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "WrapForeArms", Crossed: "WrapCrossArms"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Rubber", + HideWhenOverridden: true, + AddPriWithPose: { + ItemArmsRubberOver: 45, + }, + }, + ]) +}); +AddModel({ + Name: "RubberArmRight", + Folder: "Rubber", + Parent: "RubberArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseArmRight"], + Layers: ToLayerMap([ + { Name: "ArmRight", Layer: "WrapArms", Pri: 25, + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "WrapForeArms", Crossed: "WrapCrossArms"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Rubber", + HideWhenOverridden: true, + AddPriWithPose: { + ItemArmsRubberOver: 45, + }, + }, + ]) +}); + +AddModel({ + Name: "RubberTorsoUpper", + Folder: "Rubber", + Parent: "RubberArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseTorsoUpper", "EncaseChest"], + Layers: ToLayerMap([ + { Name: "TorsoUpper", Layer: "WrappingTorsoMid", Pri: 25, + Invariant: true, + HideOverrideLayerMulti: ["TopBinding"], + InheritColor: "Rubber", + HideWhenOverridden: true, + AddPriWithPose: { + ItemArmsRubberOver: 45, + }, + EraseLayers: ToMap(["BustierPoses"]), + EraseInvariant: true, + EraseSprite: "SlimeCorsetErase", + }, + { Name: "Chest", Layer: "WrappingChest", Pri: 25, + Invariant: true, + InheritColor: "Rubber", + HideWhenOverridden: true, + CrossHideOverride: true, + HideOverrideLayerMulti: ["ChestBinding"], + ForceSingleOverride: true, + MorphPoses: {Crossed: "Crossed", Boxtie: "Boxtie", Wristtie: "Wristtie"}, + AddPriWithPose: { + ItemArmsRubberOver: 45, + }, + }, + ]) +}); + + +AddModel({ + Name: "RubberArms", + Folder: "Rubber", + Parent: "Rubber", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseArmLeft", "EncaseArmRight", "EncaseTorsoUpper", "EncaseChest", "WrapArms", "WrapChest"], + Layers: ToLayerMap([ + ...GetModelLayers("RubberArmLeft"), + ...GetModelLayers("RubberArmRight"), + ...GetModelLayers("RubberTorsoUpper"), + ]) +}); + + +AddModel({ + Name: "RubberHandLeft", + Folder: "Rubber", + Parent: "RubberArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseHandLeft"], + Layers: ToLayerMap([ + { Name: "HandLeft", Layer: "MittenLeft", Pri: 25, + Poses: ToMap(["Free", "Boxtie", "Front", "Up", "Wristtie", "Yoked"]), + SwapLayerPose: {Front: "ForeMittenLeft"}, + HidePoses: ToMap(["HideHands"]), + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "Rubber", + EraseSprite: "Mitts", + EraseLayers: ToMap(["Mitts"]), + AddPriWithPose: { + ItemHandsRubberOver: 45, + }, + }, + ]) +}); +AddModel({ + Name: "RubberHandRight", + Folder: "Rubber", + Parent: "RubberArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseHandRight"], + Layers: ToLayerMap([ + { Name: "HandRight", Layer: "MittenRight", Pri: 25, + Poses: ToMap(["Free", "Boxtie", "Front", "Up", "Wristtie", "Yoked"]), + SwapLayerPose: {Front: "ForeMittenRight"}, + HidePoses: ToMap(["HideHands"]), + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "Rubber", + AddPriWithPose: { + ItemHandsRubberOver: 45, + }, + }, + ]) +}); + + + +AddModel({ + Name: "RubberHands", + Folder: "Rubber", + Parent: "RubberArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Rubber"], + AddPose: ["EncaseHandRight", "EncaseHandLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("RubberHandLeft"), + ...GetModelLayers("RubberHandRight"), + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_SMoonlight.ts b/Data/ModelList_SMoonlight.ts new file mode 100644 index 000000000..d6b1550eb --- /dev/null +++ b/Data/ModelList_SMoonlight.ts @@ -0,0 +1,93 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "PostureCollarBasic", + Folder: "SMoonlight", + Parent: "PostureCollarBasic", + TopLevel: false, + Restraint: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "PostureCollar", Layer: "Collar", Pri: -5.1, + Invariant: true, + InheritColor: "Band", + }, + { Name: "PostureCollarRim", Layer: "Collar", Pri: -5, + Invariant: true, + NoOverride: true, + InheritColor: "Rim", + TieToLayer: "PostureCollar", + }, + ]) +}); +AddModel({ + Name: "PostureCollar", + Folder: "SMoonlight", + Parent: "PostureCollar", + TopLevel: true, + Restraint: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("PostureCollarBasic"), + { Name: "PostureCollarLoop", Layer: "Collar", Pri: -5, + Invariant: true, + NoOverride: true, + InheritColor: "Loop", + TieToLayer: "PostureCollarHardware", + }, + { Name: "PostureCollarHardware", Layer: "Collar", Pri: -2, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Hardware", + }, + ]) +}); +AddModel(GetModelFashionVersion("PostureCollarBasic", true)) +AddModel(GetModelFashionVersion("PostureCollar", true)) + + +AddModel({ + Name: "ReverseBinder", + Folder: "SMoonlight", + Parent: "ReverseBinder", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "ReversePrayer", "Leather"], + Layers: ToLayerMap([ + { Name: "ReverseBinderLeft", Layer: "BindArmLeft", Pri: 90, + Poses: ToMap(["Wristtie"]), + HidePoses: ToMap(["WrapArms"]), + Invariant: true, + EraseSprite: "ReversePrayer", + EraseInvariant: true, + EraseLayers: ToMap(["ArmsAll"]), + InheritColor: "Binder", + }, + { Name: "ReverseBinderRight", Layer: "BindArmRight", Pri: 90, + Poses: ToMap(["Wristtie"]), + HidePoses: ToMap(["WrapArms"]), + Invariant: true, + InheritColor: "Binder", + }, + { Name: "ReverseBinderStraps", Layer: "BindChest", Pri: 3, + NoOverride: true, + InheritColor: "Straps", + HidePoses: ToMap(["WrapArms"]), + Poses: ToMap(["Wristtie"]), + Invariant: true, + }, + { Name: "ReverseBinderHardware", Layer: "BindChest", Pri: 3.1, + NoOverride: true, + InheritColor: "Hardware", + HidePoses: ToMap(["WrapArms"]), + Poses: ToMap(["Wristtie"]), + Invariant: true, + }, + ]) +}); diff --git a/Data/ModelList_Sailor.ts b/Data/ModelList_Sailor.ts new file mode 100644 index 000000000..587fced76 --- /dev/null +++ b/Data/ModelList_Sailor.ts @@ -0,0 +1,205 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "SailorCollar", + Folder: "Sailor", + Parent: "Sailor", + TopLevel: true, + Categories: ["Accessories"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { + Name: "Collar", Layer: "ShirtCollar", Pri: 10, + InheritColor: "Collar", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied", Yoked: "Yoked",}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + }, + { + Name: "CollarStripe", Layer: "ShirtCollar", Pri: 10.1, + InheritColor: "CollarStripe", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied", Yoked: "Yoked",}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + NoOverride: true, + TieToLayer: "Collar", + }, + ]) +}); + + +AddModel({ + Name: "SailorCollarFull", + Folder: "Sailor", + Parent: "SailorCollar", + TopLevel: false, + Categories: ["Accessories"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + ...GetModelLayers("SailorCollar"), + { + Name: "Bust", Layer: "ShirtChest", Pri: -100, + InheritColor: "Bust", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + }, + { + Name: "BustStripe", Layer: "ShirtChest", Pri: -99.9, + InheritColor: "Bust", + NoOverride: true, + TieToLayer: "Bust", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "SailorBow", + Folder: "Sailor", + Parent: "Sailor", + TopLevel: true, + Categories: ["Accessories"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { + Name: "Ribbon", Layer: "BustierCollar", Pri: 50, + InheritColor: "Collar", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied", Yoked: "Yoked",}, + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + NoOverride: true, + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "SailorTop", + Folder: "Sailor", + Parent: "Sailor", + TopLevel: false, + Categories: ["Tops"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "Shirt", Layer: "Shirt", Pri: 5, + InheritColor: "Shirt", + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + //MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel",}, + }, + { Name: "ShirtChest", Layer: "ShirtChest", Pri: 14, + InheritColor: "Shirt", + Poses: ToMap([...ARMPOSES]), + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied", Yoked: "Yoked",}, + Invariant: true, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + AppendPose: {Chesttied: "Chesttied"}, + }, + ]) +}); + +AddModel({ + Name: "SailorSleeveLeft", + Folder: "Sailor", + Parent: "SailorSleeves", + Categories: ["Sleeves"], + TopLevel: true, + Layers: ToLayerMap([ + { Name: "SleeveLeft", Layer: "SleeveLeft", Pri: -5, + Poses: ToMap([...ARMPOSES]), + InheritColor: "Sleeves", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied", Yoked: "Yoked",}, + Invariant: true, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + { Name: "HemLeft", Layer: "SleeveLeft", Pri: -4.9, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveHems", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied", Yoked: "Yoked",}, + Invariant: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + NoOverride: true, + TieToLayer: "SleeveLeft", + }, + ]) +}); +AddModel({ + Name: "SailorSleeveRight", + Folder: "Sailor", + Parent: "SailorSleeves", + Categories: ["Tops"], + Layers: ToLayerMap([ + { Name: "SleeveRight", Layer: "SleeveRight", Pri: -5, + Poses: ToMap([...ARMPOSES]), + InheritColor: "Sleeves", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied", Yoked: "Yoked",}, + Invariant: true, + SwapLayerPose: {Up: "UpSleeveRight"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + }, + { Name: "HemRight", Layer: "SleeveRight", Pri: -4.9, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveHems", + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied", Yoked: "Yoked",}, + Invariant: true, + SwapLayerPose: {Up: "UpSleeveRight"}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + NoOverride: true, + TieToLayer: "SleeveRight", + }, + ]) +}); + + +AddModel({ + Name: "SailorSleeves", + Folder: "Sailor", + Parent: "Sailor", + TopLevel: true, + Categories: ["Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("SailorSleeveLeft"), + ...GetModelLayers("SailorSleeveRight"), + ]) +}); + +AddModel({ + Name: "SailorShirt", + Folder: "Sailor", + Parent: "Sailor", + TopLevel: true, + Categories: ["Tops"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + ...GetModelLayers("SailorSleeves"), + ...GetModelLayers("SailorTop"), + ]) +}); + +AddModel({ + Name: "Sailor", + Folder: "Sailor", + Parent: "Sailor", + TopLevel: true, + Categories: ["Uniforms"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + ...GetModelLayers("SailorSleeves"), + ...GetModelLayers("SailorTop"), + ...GetModelLayers("SailorCollarFull"), + ...GetModelLayers("SailorBow"), + + ]) +}); diff --git a/Data/ModelList_Shadow.ts b/Data/ModelList_Shadow.ts new file mode 100644 index 000000000..c9386e5ce --- /dev/null +++ b/Data/ModelList_Shadow.ts @@ -0,0 +1,227 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "ShadowHandsArms1", + Folder: "ShadowHands", + Parent: "ShadowHandsArmsAll", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Arms1", Layer: "BindChest", Pri: 50, + DisplacementSprite: "Arm2Squish", + DisplacementMorph: {Boxtie: "Boxtie",Wristtie: "Wristtie",Front: "Boxtie",Crossed: "Boxtie",}, + Poses: ToMap(["Boxtie", "Wristtie", "Front", "Crossed"]), + DisplaceLayers: ToMap(["Ribbon1"]), + Invariant: true, + InheritColor: "Shadow", + }, + /*{ Name: "LeftArm1", Layer: "BindArmLeft", Pri: 60, + InheritColor: "Belt", + Poses: ToMap(["Wristtie", "Boxtie"]), + }, + { Name: "RightArm1", Layer: "BindArmRight", Pri: 60, + InheritColor: "Belt", + Poses: ToMap(["Wristtie", "Boxtie"]), + },*/ + ]) +}); +AddModel({ + Name: "ShadowHandsArms2", + Folder: "ShadowHands", + Parent: "ShadowHandsArmsAll", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Arms2", Layer: "StrapsUnderbust", Pri: 60, + InheritColor: "Shadow", + Invariant: true, + DisplacementSprite: "Arm1Squish", + DisplacementMorph: {Boxtie: "Boxtie",Wristtie: "Wristtie",Front: "Boxtie",Crossed: "Boxtie",}, + Poses: ToMap(["Boxtie", "Wristtie", "Front", "Crossed"]), + DisplaceLayers: ToMap(["Ribbon1"]), + }, + { Name: "LeftArm2", Layer: "BindArmLeft", Pri: 60, + InheritColor: "Shadow", + Poses: ToMap(["Wristtie", "Boxtie"]), + }, + /*{ Name: "RightArm2", Layer: "BindArmRight", Pri: 60, + InheritColor: "Belt", + Poses: ToMap(["Wristtie", "Boxtie"]), + },*/ + ]) +}); + +AddModel({ + Name: "ShadowHandsArmsAll", + Folder: "ShadowHands", + Parent: "ShadowHandsArmsAll", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + ...GetModelLayers("ShadowHandsArms1"), + ...GetModelLayers("ShadowHandsArms2"), + ]) +}); + + + + +AddModel({ + Name: "ShadowHandsLegs1", + Folder: "ShadowHands", + Parent: "ShadowHandsArmsAll", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Legs1", Layer: "Thighs", Pri: 60, + Poses: ToMapSubtract([...LEGPOSES], ["Spread"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Shadow", + DisplacementMorph: {Hogtie: "Hogtie", KneelClosed: "KneelClosed"}, + DisplacementSprite: "BeltLegs1Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonThighs"]), + }, + { Name: "RightLegs1", Layer: "BindThighRight", Pri: 60, + Poses: ToMap(["Kneel", "KneelClosed"]), + InheritColor: "Belt", + }, + ]) +}); +AddModel({ + Name: "ShadowHandsLegs2", + Folder: "ShadowHands", + Parent: "ShadowHandsArmsAll", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Legs2", Layer: "Thighs", Pri: 60, + Poses: ToMapSubtract([...LEGPOSES], ["Spread"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Shadow", + DisplacementMorph: {Hogtie: "Hogtie", KneelClosed: "KneelClosed"}, + DisplacementSprite: "BeltLegs2Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonThighs"]), + }, + { Name: "RightLegs2", Layer: "BindThighRight", Pri: 60, + Poses: ToMap(["Kneel", "KneelClosed"]), + InheritColor: "Belt", + }, + ]) +}); + +AddModel({ + Name: "ShadowHandsLegsAll", + Folder: "ShadowHands", + Parent: "ShadowHandsArmsAll", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + ...GetModelLayers("ShadowHandsLegs1"), + ...GetModelLayers("ShadowHandsLegs2"), + ]) +}); + + +AddModel({ + Name: "ShadowHandsFeet", + Folder: "ShadowHands", + Parent: "ShadowHandsArmsAll", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Leather"], + Layers: ToLayerMap([ + { Name: "Feet1", Layer: "AnklesOver", Pri: 60, + Poses: ToMapSubtract([...CLOSEDPOSES], ["Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + InheritColor: "Shadow", + DisplacementMorph: {KneelClosed: "KneelClosed"}, + DisplacementSprite: "BeltFeet1Squish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RibbonCalf"]), + }, + ]) +}); + + + + + +AddModel({ + Name: "ShadowHandsMouth", + Folder: "ShadowHands", + Parent: "ShadowHandsArmsAll", + TopLevel: false, + Group: "Mouth", + Restraint: true, + Categories: ["Restraints","Gags"], + AddPose: ["FaceGag"], + Layers: ToLayerMap([ + { Name: "Mouth", Layer: "GagOver", Pri: 9, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + InheritColor: "Shadow", + }, + ]) +}); + + + +AddModel({ + Name: "ShadowHandsEyes", + Folder: "ShadowHands", + Parent: "ShadowHandsArmsAll", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Blindfolds"], + AddPose: ["Blindfolds"], + Layers: ToLayerMap([ + { Name: "Eyes", Layer: "Hood", Pri: 90, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Shadow", + }, + ]) +}); + +AddModel({ + Name: "ShadowHandsCrotch", + Folder: "ShadowHands", + Parent: "ShadowHandsArmsAll", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Ribbon"], + AddPose: ["CrotchStrap"], + Layers: ToLayerMap([ + { Name: "Crotch", Layer: "HarnessMid", Pri: -105, + //MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + InheritColor: "Ribbon", + DisplacementInvariant: true, + DisplacementSprite: "CrotchropeSquished", + DisplaceLayers: ToMap(["RibbonTorso"]), + + }, + { Name: "CrotchStrap", Layer: "HarnessMid", Pri: -105.1, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + Invariant: true, + InheritColor: "Ribbon", + }, + ]) +}); diff --git a/Data/ModelList_Skirt.ts b/Data/ModelList_Skirt.ts new file mode 100644 index 000000000..c4e85d939 --- /dev/null +++ b/Data/ModelList_Skirt.ts @@ -0,0 +1,117 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "StripedSkirt", + Folder: "Skirts", + Parent: "StripedSkirt", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "StripedSkirt", Layer: "Skirt", Pri: 16, + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + //HideWhenOverridden: true, + MorphPoses: {Hogtie: "Closed", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + InheritColor: "Skirt", + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "StripedSkirtUnder", Layer: "Skirt", Pri: 16.1, + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + TieToLayer: "StripedSkirt", + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + //HideWhenOverridden: true, + MorphPoses: {Hogtie: "Closed", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + InheritColor: "Underskirt", + Invariant: true, + }, + { Name: "StripedSkirtOver", Layer: "SkirtOver", Pri: 16, + Poses: ToMap([...KNEELPOSES]), + TieToLayer: "StripedSkirt", + NoOverride: true, + AppendPose: ToMapDupe(["CrotchStrap"]), + InheritColor: "Skirt", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + { Name: "StripedSkirtUnderOver", Layer: "SkirtOver", Pri: 16.1, + Poses: ToMap([...KNEELPOSES]), + TieToLayer: "StripedSkirtOver", + NoOverride: true, + AppendPose: ToMapDupe(["CrotchStrap"]), + InheritColor: "Underskirt", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "ApronSkirt", + Folder: "Skirts", + Parent: "MaidSkirt", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "MaidSkirt", Layer: "Skirt", Pri: 17, + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + //HideWhenOverridden: true, + MorphPoses: {Hogtie: "Closed", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + InheritColor: "Skirt", + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "ApronSkirt", Layer: "Skirt", Pri: 17.1, + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + TieToLayer: "MaidSkirt", + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + //HideWhenOverridden: true, + MorphPoses: {Hogtie: "Closed", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + InheritColor: "Apron", + Invariant: true, + }, + { Name: "MaidSkirtOver", Layer: "SkirtOver", Pri: 17, + Poses: ToMap([...KNEELPOSES]), + TieToLayer: "MaidSkirt", + NoOverride: true, + AppendPose: ToMapDupe(["CrotchStrap"]), + InheritColor: "Skirt", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + { Name: "ApronSkirtOver", Layer: "SkirtOver", Pri: 17.1, + Poses: ToMap([...KNEELPOSES]), + TieToLayer: "MaidSkirtOver", + NoOverride: true, + AppendPose: ToMapDupe(["CrotchStrap"]), + InheritColor: "Apron", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Slime.ts b/Data/ModelList_Slime.ts new file mode 100644 index 000000000..7740df147 --- /dev/null +++ b/Data/ModelList_Slime.ts @@ -0,0 +1,423 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +let slimefilter = {"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.2166666666666668,"red":1.7000000000000002,"green":0.5166666666666666,"blue":2.3833333333333333,"alpha":1}; + + + +AddModel({ + Name: "SlimeMouth", + Folder: "Slime", + Parent: "SlimeHead", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseMouth"], + Filters: { + "Slime": slimefilter, + }, + Layers: ToLayerMap([ + { Name: "FaceMouth", Layer: "GagFlat", Pri: -60, + Invariant: true, + NoOverride: true, + InheritColor: "Slime", + AddPriWithPose: { + ItemMouthRubberOver: 45, + }, + }, + ]) +}); + +AddModel({ + Name: "SlimeEyes", + Folder: "Slime", + Parent: "SlimeHead", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseEyes"], + Filters: { + "Slime": slimefilter, + }, + Layers: ToLayerMap([ + { Name: "FaceEyes", Layer: "Blindfold", Pri: -25, + Invariant: true, + NoOverride: true, + InheritColor: "Slime", + AddPriWithPose: { + ItemHeadRubberOver: 45, + }, + }, + ]) +}); + +AddModel({ + Name: "SlimeHead", + Folder: "Slime", + Parent: "Slime", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseEyes", "EncaseMouth", "EncaseHead"], + Filters: { + "Slime": slimefilter, + }, + AddPoseConditional: { + Xray: ["HoodMask",], + }, + Layers: ToLayerMap([ + { Name: "FaceFull", Layer: "Hood", Pri: -30, + Invariant: true, + NoOverride: true, + InheritColor: "Slime", + AddPriWithPose: { + ItemHeadRubberOver: 14, + }, + }, + ]) +}); + +AddModel({ + Name: "SlimeBoots", + Folder: "Slime", + Parent: "SlimeLegs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseFeet"], + Filters: { + "Slime": slimefilter, + }, + Layers: ToLayerMap([ + { Name: "FootLeft", Layer: "WrappingLegsUnder", Pri: 150, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + NoOverride: true, + InheritColor: "Slime", + ApplyFilterToLayerGroup: ToMap(["SlimeFeet", "BelowShoes"]), + AddPriWithPose: { + ItemBootsRubberOver: 45, + }, + DisplaceLayers: ToMap(["Heels"]), + DisplaceAmount: 100, + DisplacementSprite: "SlimeLeft", + DisplacementPoses: ["Closed"], + }, + { Name: "FootRight", Layer: "WrappingLegsRight", Pri: -150, + //SwapLayerPose: {Kneel: "WrappingLegsRight", KneelClosed: "WrappingLegsRight"}, + Poses: ToMap(["Closed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + NoOverride: true, + InheritColor: "Slime", + ApplyFilterToLayerGroup: ToMap(["SlimeFeet", "BelowShoes"]), + AddPriWithPose: { + ItemBootsRubberOver: 45, + }, + DisplaceLayers: ToMap(["HeelRight"]), + DisplaceAmount: 100, + DisplacementSprite: "SlimeRight", + DisplacementPoses: ["Closed"], + }, + ]) +}); + +AddModel({ + Name: "SlimeTorsoLower", + Folder: "Slime", + Parent: "SlimeLegs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseTorsoLower"], + Filters: { + "Slime": slimefilter, + }, + Layers: ToLayerMap([ + { Name: "TorsoLower", Layer: "WrappingTorsoLower", Pri: 54, + //swaplayerpose: {Kneel: "WrappingTorso", KneelClosed: "WrappingTorso"}, + Invariant: true, + ApplyFilterToLayerGroup: ToMap(["SlimeTorsoLower"]), + InheritColor: "Slime", + MorphPoses: {KneelClosed: "Kneel"}, + HideWhenOverridden: true, + AddPriWithPose: { + ItemLegsRubberOver: 45, + }, + }, + ]) +}); + +AddModel({ + Name: "SlimeThighs", + Folder: "Slime", + Parent: "SlimeLegs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["FeetLinked", "EncaseLegs"], + Filters: { + "Slime": slimefilter, + }, + Layers: ToLayerMap([ + { Name: "LegLeft", Layer: "WrappingLegsOver2", Pri: 24, + Poses: ToMap(["Closed", "KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + ApplyFilterToLayerGroup: ToMap(["SlimeLegs"]), + InheritColor: "Slime", + HideWhenOverridden: true, + AddPriWithPose: { + ItemLegsRubberOver: 45, + }, + DisplaceAmount: 100, + DisplaceLayers: ToMap(["SlimeThighs"]), + DisplacementSprite: "SlimeThighs", + }, + { Name: "LegRight", Layer: "WrappingLegsOver2", Pri: 24, + //SwapLayerPose: {Kneel: "WrappingLegsRightOver", KneelClosed: "WrappingLegsRightOver"}, + Poses: ToMap(["Closed", "KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + ApplyFilterToLayerGroup: ToMap(["SlimeLegs"]), + InheritColor: "Slime", + HideWhenOverridden: true, + AddPriWithPose: { + ItemLegsRubberOver: 45, + }, + }, + ]) +}); + + +AddModel({ + Name: "SlimeLegs", + Folder: "Slime", + Parent: "Slime", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["FeetLinked", "EncaseTorsoLower", "EncaseLegs"], + Filters: { + "Slime": slimefilter, + }, + Layers: ToLayerMap([ + ...GetModelLayers("SlimeThighs"), + ...GetModelLayers("SlimeTorsoLower"), + ]) +}); + + +AddModel({ + Name: "SlimeFeet", + Folder: "Slime", + Parent: "SlimeLegs", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["FeetLinked", "EncaseAnkles"], + Filters: { + "Slime": slimefilter, + }, + Layers: ToLayerMap([ + { Name: "AnkleLeft", Layer: "WrappingAnklesOver", Pri: 15, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + ApplyFilterToLayerGroup: ToMap(["SlimeFeet", "BelowShoes"]), + SwapLayerPose: {Kneel: "WrappingLegsOver", KneelClosed: "WrappingLegsOver"}, + InheritColor: "Slime", + HideWhenOverridden: true, + AddPriWithPose: { + ItemFeetRubberOver: 45, + }, + }, + { Name: "AnkleRight", Layer: "WrappingAnklesOver", Pri: 15, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + ApplyFilterToLayerGroup: ToMap(["SlimeFeet", "BelowShoes"]), + InheritColor: "Slime", + HideWhenOverridden: true, + AddPriWithPose: { + ItemFeetRubberOver: 45, + }, + }, + ]) +}); + +AddModel({ + Name: "SlimeArmLeft", + Folder: "Slime", + Parent: "SlimeArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseArmLeft"], + Filters: { + "Slime": slimefilter, + }, + Layers: ToLayerMap([ + { Name: "ArmLeft", Layer: "WrapArms", Pri: 15, + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmLeft", Crossed: "BindCrossArmLeft"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Slime", + HideWhenOverridden: true, + AddPriWithPose: { + ItemArmsRubberOver: 45, + }, + }, + ]) +}); +AddModel({ + Name: "SlimeArmRight", + Folder: "Slime", + Parent: "SlimeArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseArmRight"], + Filters: { + "Slime": slimefilter, + }, + Layers: ToLayerMap([ + { Name: "ArmRight", Layer: "WrapArms", Pri: 15, + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "WrapForeArms", Crossed: "WrapCrossArms"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Slime", + HideWhenOverridden: true, + AddPriWithPose: { + ItemArmsRubberOver: 45, + }, + }, + ]) +}); + +AddModel({ + Name: "SlimeTorsoUpper", + Folder: "Slime", + Parent: "SlimeArms", + TopLevel: false, + Restraint: true, + Filters: { + "Slime": slimefilter, + }, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseTorsoUpper", "EncaseChest"], + Layers: ToLayerMap([ + { Name: "TorsoUpper", Layer: "WrappingTorsoMid", Pri: 15, + Invariant: true, + HideOverrideLayerMulti: ["TopBinding"], + InheritColor: "Slime", + HideWhenOverridden: true, + AddPriWithPose: { + ItemArmsRubberOver: 45, + }, + EraseLayers: ToMap(["BustierPoses"]), + EraseInvariant: true, + EraseSprite: "SlimeCorsetErase", + }, + { Name: "Chest", Layer: "WrappingChest", Pri: 15, + Invariant: true, + CrossHideOverride: true, + HideWhenOverridden: true, + HideOverrideLayerMulti: ["ChestBinding"], + ForceSingleOverride: true, + InheritColor: "Slime", + MorphPoses: {Crossed: "Crossed", Boxtie: "Boxtie", Wristtie: "Wristtie"}, + AddPriWithPose: { + ItemArmsRubberOver: 45, + }, + }, + ]) +}); + + +AddModel({ + Name: "SlimeArms", + Folder: "Slime", + Parent: "Slime", + TopLevel: true, + Restraint: true, + Filters: { + "Slime": slimefilter, + }, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseArmLeft", "EncaseArmRight", "EncaseTorsoUpper", "EncaseChest", "WrapArms", "WrapChest"], + Layers: ToLayerMap([ + ...GetModelLayers("SlimeArmLeft"), + ...GetModelLayers("SlimeArmRight"), + ...GetModelLayers("SlimeTorsoUpper"), + ]) +}); + + +AddModel({ + Name: "SlimeHandLeft", + Folder: "Slime", + Parent: "SlimeArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseHandLeft"], + Filters: { + "Slime": slimefilter, + }, + Layers: ToLayerMap([ + { Name: "HandLeft", Layer: "MittenLeft", Pri: 15, + Poses: ToMap(["Free", "Boxtie", "Front", "Up", "Wristtie", "Yoked"]), + SwapLayerPose: {Front: "ForeMittenLeft"}, + HidePoses: ToMap(["HideHands"]), + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "Slime", + EraseSprite: "Mitts", + EraseLayers: ToMap(["Mitts"]), + AddPriWithPose: { + ItemHandsRubberOver: 45, + }, + }, + ]) +}); +AddModel({ + Name: "SlimeHandRight", + Folder: "Slime", + Parent: "SlimeArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseHandRight"], + Filters: { + "Slime": slimefilter, + }, + Layers: ToLayerMap([ + { Name: "HandRight", Layer: "MittenRight", Pri: 15, + Poses: ToMap(["Free", "Boxtie", "Front", "Up", "Wristtie", "Yoked"]), + SwapLayerPose: {Front: "ForeMittenRight"}, + HidePoses: ToMap(["HideHands"]), + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "Slime", + AddPriWithPose: { + ItemHandsRubberOver: 45, + }, + }, + ]) +}); + + +AddModel({ + Name: "SlimeHands", + Folder: "Slime", + Parent: "SlimeArms", + TopLevel: false, + Restraint: true, + Filters: { + "Slime": slimefilter, + }, + Categories: ["Restraints", "Slime"], + AddPose: ["EncaseHandRight", "EncaseHandLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("SlimeHandLeft"), + ...GetModelLayers("SlimeHandRight"), + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Spats.ts b/Data/ModelList_Spats.ts new file mode 100644 index 000000000..be89f5fd1 --- /dev/null +++ b/Data/ModelList_Spats.ts @@ -0,0 +1,28 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "Spats", + Folder: "Spats", + Parent: "Spats", + TopLevel: true, + Categories: ["Pants"], + AddPose: ["Spats"], + Layers: ToLayerMap([ + { Name: "Spats", Layer: "Shorts", Pri: 4, + Poses: ToMap([...LEGPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + MorphPoses: {KneelClosed: "KneelClosed"}, + }, + /*{ Name: "ShortsLeft", Layer: "ShortsLeft", Pri: 7, + Poses: ToMap([...LEGPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //MorphPoses: {Hogtie: "Hogtie"}, + },*/ + ]) +}); diff --git a/Data/ModelList_SteelCuffs.ts b/Data/ModelList_SteelCuffs.ts new file mode 100644 index 000000000..033453e2e --- /dev/null +++ b/Data/ModelList_SteelCuffs.ts @@ -0,0 +1,222 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "SteelCuffsWristLeft", + Folder: "SteelCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristLeft", "", "", "BaseMetal", 0.6), + ...GetModelLayers("ShacklesWristLeft", "Rim", "", "Rim", 0.5), + ]) +}); +AddModel({ + Name: "SteelCuffsWristRight", + Folder: "SteelCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesWristRight", "", "", "BaseMetal", 0.6), + ...GetModelLayers("ShacklesWristRight", "Rim", "", "Rim", 0.5), + ]) +}); + +AddModel({ + Name: "SteelCuffsWrists", + Folder: "SteelCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("SteelCuffsWristLeft"), + ...GetModelLayers("SteelCuffsWristRight"), + ]) +}); + + + +AddModel({ + Name: "SteelCuffsElbowLeft", + Folder: "SteelCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowLeft", "", "", "BaseMetal", 0.6), + ...GetModelLayers("ShacklesElbowLeft", "Rim", "", "Rim", 0.5), + ]) +}); +AddModel({ + Name: "SteelCuffsElbowRight", + Folder: "SteelCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesElbowRight", "", "", "BaseMetal", 0.6), + ...GetModelLayers("ShacklesElbowRight", "Rim", "", "Rim", 0.5), + ]) +}); + +AddModel({ + Name: "SteelCuffsElbows", + Folder: "SteelCuffs", + TopLevel: false, + Parent: "CuffsArms", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight"], + Layers: ToLayerMap([ + ...GetModelLayers("SteelCuffsElbowLeft"), + ...GetModelLayers("SteelCuffsElbowRight"), + ]) +}); + +AddModel({ + Name: "SteelCuffsArms", + Folder: "SteelCuffs", + TopLevel: true, + Parent: "Cuffs", + Categories: ["Restraints","Cuffs"], + AddPose: ["ElbowLeft", "ElbowRight", "WristLeft", "WristRight"], + Layers: ToLayerMap([ + ...GetModelLayers("SteelCuffsWrists"), + ...GetModelLayers("SteelCuffsElbows"), + ]) +}); + +AddModel({ + Name: "SteelCuffsAnklesLeft", + Folder: "SteelCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesLeft", "", "", "BaseMetal", 0.6), + ...GetModelLayers("ShacklesAnklesLeft", "Rim", "", "Rim", 0.5), + ]) +}); + +AddModel({ + Name: "SteelCuffsAnklesRight", + Folder: "SteelCuffs", + TopLevel: false, + Parent: "CuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesRight", "", "", "BaseMetal", 0.6), + ...GetModelLayers("ShacklesAnklesRight", "Rim", "", "Rim", 0.5), + ]) +}); + + +AddModel({ + Name: "SteelCuffsAnkles", + Folder: "SteelCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight", "AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("SteelCuffsAnklesRight"), + ...GetModelLayers("SteelCuffsAnklesLeft"), + ]) +}); + + + +AddModel({ + Name: "SteelCuffsThighLeft", + Folder: "SteelCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighLeft", "", "", "BaseMetal", 0.6), + ...GetModelLayers("ShacklesThighLeft", "Rim", "", "Rim", 0.5), + ]) +}); + +AddModel({ + Name: "SteelCuffsThighRight", + Folder: "SteelCuffs", + TopLevel: false, + Parent: "CuffsThigh", + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesThighRight", "", "", "BaseMetal", 0.6), + ...GetModelLayers("ShacklesThighRight", "Rim", "", "Rim", 0.5), + ]) +}); + + +AddModel({ + Name: "SteelCuffsThigh", + Folder: "SteelCuffs", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["ThighRight", "ThighLeft", "LowCuffs"], + Layers: ToLayerMap([ + ...GetModelLayers("SteelCuffsThighRight"), + ...GetModelLayers("SteelCuffsThighLeft"), + ]) +}); + + +AddModel({ + Name: "NeoSteelCollar", + Folder: "SteelCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronCollar", "", "", "BaseMetal", 0.6), + ...GetModelLayers("IronCollar", "Rim", "", "Rim", 0.5), + ]) +}); + +AddModel({ + Name: "NeoSteelBelt", + Folder: "SteelCuffs", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("IronBelt", "", "", "BaseMetal", 0.6), + ...GetModelLayers("IronBelt", "Rim", "", "Rim", 0.5), + ]) +}); + + + + +AddModel(GetModelFashionVersion("NeoSteelCollar", true)); +AddModel(GetModelFashionVersion("NeoSteelBelt", true)); +AddModel(GetModelFashionVersion("SteelCuffsWristLeft", true)); +AddModel(GetModelFashionVersion("SteelCuffsWristRight", true)); +AddModel(GetModelFashionVersion("SteelCuffsWrists", true)); +AddModel(GetModelFashionVersion("SteelCuffsElbowLeft", true)); +AddModel(GetModelFashionVersion("SteelCuffsElbowRight", true)); +AddModel(GetModelFashionVersion("SteelCuffsElbows", true)); +AddModel(GetModelFashionVersion("SteelCuffsArms", true)); +AddModel(GetModelFashionVersion("SteelCuffsAnklesLeft", true)); +AddModel(GetModelFashionVersion("SteelCuffsAnklesRight", true)); +AddModel(GetModelFashionVersion("SteelCuffsAnkles", true)); +AddModel(GetModelFashionVersion("SteelCuffsThighLeft", true)); +AddModel(GetModelFashionVersion("SteelCuffsThighRight", true)); +AddModel(GetModelFashionVersion("SteelCuffsThigh", true)); \ No newline at end of file diff --git a/Data/ModelList_TapeHeavy.ts b/Data/ModelList_TapeHeavy.ts new file mode 100644 index 000000000..fceb888bb --- /dev/null +++ b/Data/ModelList_TapeHeavy.ts @@ -0,0 +1,282 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +let tapefilter = {"gamma":1,"saturation":0.0,"contrast":2,"brightness":3,"red":1,"green":1,"blue":1,"alpha":1}; + +AddModel({ + Name: "TapeHeavyBoots", + Folder: "TapeHeavy", + Parent: "TapeHeavyBottom", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseFeet"], + AddPoseConditional: { + RestrainingShoes: ["TapeBoots"], + }, + RemovePoses: ["RestrainingShoes"], + Layers: ToLayerMap([ + { Name: "Feet", Layer: "WrappingLegs", Pri: 50, + Poses: ToMap(["Closed", "KneelClosed","Hogtie"]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + DisplacementSprite: "TapeAnklesSquish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RopeCalf"]), + InheritColor: "Tape", + }, + ]) +}); +AddModel({ + Name: "TapeHeavyAnkles", + Folder: "TapeHeavy", + Parent: "TapeHeavyBottom", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseAnkles"], + Layers: ToLayerMap([ + { Name: "Ankles", Layer: "WrappingAnklesOver", Pri: 50, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Tape", + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "TapeHeavyLegs", + Folder: "TapeHeavy", + TopLevel: false, + Parent: "TapeHeavyBottom", + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["FeetLinked", "EncaseLegs"], + Layers: ToLayerMap([ + { Name: "Legs", Layer: "WrappingLegsOver2", Pri: 50, + Poses: ToMap(["Closed", "KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Tape", + HideWhenOverridden: true, + DisplaceAmount: 100, + DisplaceLayers: ToMap(["SlimeThighs"]), + DisplacementSprite: "SlimeThighs", + }, + { Name: "RightLegs", Layer: "WrappingLegsOver2", Pri: 50, + //SwapLayerPose: {Kneel: "WrappingLegsRightOver", KneelClosed: "WrappingLegsRightOver"}, + Poses: ToMap(["Closed", "KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Tape", + HideWhenOverridden: true, + }, + { Name: "StrapCover", Layer: "OverCrotchStrapMid", Pri: 5, + Poses: ToMap(["Closed", "Hogtie"]), + RequirePoses: ToMap(["CrotchStrap"]), + HidePoses: ToMap(["Skirt"]), + InheritColor: "Tape", + Invariant: true, + TieToLayer: "Legs", + }, + ]) +}); + +AddModel({ + Name: "TapeHeavyBottom", + Folder: "TapeHeavy", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["FeetLinked", "EncaseLegs"], + Layers: ToLayerMap([ + { Name: "Bottom", Layer: "WrappingTorsoMid", Pri: 50, + //swaplayerpose: {Kneel: "WrappingTorso", KneelClosed: "WrappingTorso"}, + Poses: ToMap(["Closed", "KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Tape", + HideWhenOverridden: true, + }, + ]) +}); + +AddModel({ + Name: "TapeHeavyBottomFull", + Folder: "TapeHeavy", + TopLevel: false, + Parent: "TapeHeavyBottom", + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["FeetLinked", "EncaseTorsoLower", "EncaseLegs"], + Layers: ToLayerMap([ + ...GetModelLayers("TapeHeavyBottom"), + ...GetModelLayers("TapeHeavyLegs"), + + ]) +}); +/* +AddModel({ + Name: "TapeHeavyArmLeft", + Folder: "TapeHeavy", + Parent: "TapeHeavyArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseArmLeft"], + Layers: ToLayerMap([ + { Name: "ArmLeft", Layer: "BindArmLeft", Pri: -5, + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmLeft", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Tape", + }, + ]) +}); +AddModel({ + Name: "TapeHeavyArmRight", + Folder: "TapeHeavy", + Parent: "TapeHeavyArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseArmRight"], + Layers: ToLayerMap([ + { Name: "ArmRight", Layer: "BindArmRight", Pri: -5, + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmRight", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Tape", + }, + ]) +});*/ + + +AddModel({ + Name: "TapeHeavyArms", + Folder: "TapeHeavy", + Parent: "TapeHeavy", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseArmLeft", "EncaseArmRight", "EncaseTorsoUpper", "EncaseChest", "FlattenedUnderbust", "WrapArms"], + Layers: ToLayerMap([ + { Name: "Collar", Layer: "Collar", Pri: 0, + Invariant: true, + InheritColor: "Tape", + }, + { Name: "Top", Layer: "WrappingTorsoMid", Pri: 50, + Poses: ToMap(["Boxtie", "Crossed", "Wristtie"]), + GlobalDefaultOverride: ToMap(["Crossed"]), + HideOverrideLayerMulti: ["TopBinding"], + InheritColor: "Tape", + HideWhenOverridden: true, + }, + { Name: "Chest", Layer: "WrappingChest", Pri: 50, + Invariant: true, + InheritColor: "Tape", + HideWhenOverridden: true, + + CrossHideOverride: true, + HideOverrideLayerMulti: ["ChestBinding"], + ForceSingleOverride: true, + }, + { Name: "ArmLeft", Layer: "WrapArms", Pri: 50, // BindArmLeft + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmLeft", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + + DisplacementSprite: "TapeHeavyLeft", + DisplaceLayers: ToMap(["ArmsAllAndHarness"]), + DisplacementMorph: {Crossed: "Crossed", Boxtie: "Boxtie"}, + DisplacementInvariant: true, + DisplaceAmount: 100, + + NoDisplace: true, + InheritColor: "Tape", + }, + { Name: "ArmRight", Layer: "WrapArms", Pri: 50, // BindArmRight + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmRight", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + + DisplacementSprite: "TapeHeavyRight", + DisplaceLayers: ToMap(["ArmsAllAndHarness"]), + DisplacementMorph: {Crossed: "Crossed", Boxtie: "Boxtie"}, + DisplacementInvariant: true, + DisplaceAmount: 100, + + NoDisplace: true, + InheritColor: "Tape", + }, + ]) +}); + +AddModel({ + Name: "TapeHeavyArmsFull", + Folder: "TapeHeavy", + Parent: "TapeHeavyArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseArmLeft", "EncaseArmRight", "EncaseTorsoUpper", "EncaseChest", "FlattenedUnderbust", "WrapArms", "WrapChest"], + Layers: ToLayerMap([ + ...GetModelLayers("TapeHeavyArms"), + ...GetModelLayers("TapeFullArms"), + ]) +}); + + +AddModel({ + Name: "TapeHeavyHandLeft", + Folder: "TapeHeavy", + Parent: "TapeHeavyArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseHandLeft"], + Layers: ToLayerMap([ + { Name: "HandLeft", Layer: "MittenLeft", Pri: -5, + Poses: ToMap(["Free", "Boxtie", "Front", "Up", "Wristtie", "Yoked"]), + SwapLayerPose: {Front: "BindForeHandLeft"}, + HidePoses: ToMap(["HideHands"]), + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "Tape", + }, + ]) +}); +AddModel({ + Name: "TapeHeavyHandRight", + Folder: "TapeHeavy", + Parent: "TapeHeavyArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseHandRight"], + Layers: ToLayerMap([ + { Name: "HandRight", Layer: "MittenRight", Pri: -5, + Poses: ToMap(["Free", "Boxtie", "Front", "Up", "Wristtie", "Yoked"]), + SwapLayerPose: {Front: "BindForeHandRight"}, + HidePoses: ToMap(["HideHands"]), + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "Tape", + }, + ]) +}); +AddModel({ + Name: "TapeHeavyHands", + Folder: "TapeHeavy", + Parent: "TapeHeavyArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseHandRight", "EncaseHandLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("TapeHeavyHandLeft"), + ...GetModelLayers("TapeHeavyHandRight"), + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_TapeLight.ts b/Data/ModelList_TapeLight.ts new file mode 100644 index 000000000..530a26f13 --- /dev/null +++ b/Data/ModelList_TapeLight.ts @@ -0,0 +1,272 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "TapeBoots", + Folder: "TapeLight", + Parent: "TapeBottom", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPoseConditional: { + RestrainingShoes: ["TapeBoots"], + }, + RemovePoses: ["RestrainingShoes"], + Layers: ToLayerMap([ + { Name: "Feet", Layer: "WrappingLegs", Pri: 10, + Poses: ToMap(["Closed", "KneelClosed"]), + //GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementSprite: "TapeAnklesSquish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RopeCalf"]), + InheritColor: "Tape", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "TapeAnkles", + Folder: "TapeLight", + Parent: "TapeBottom", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + Layers: ToLayerMap([ + { Name: "Ankles", Layer: "WrappingAnklesOver", Pri: 35, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Tape", + NoOverride: true, + HideWhenOverridden: true, + }, + ]) +}); + + +AddModel({ + Name: "TapeLegs", + Folder: "TapeLight", + TopLevel: false, + Parent: "TapeBottom", + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["FeetLinked"], + Layers: ToLayerMap([ + { Name: "Legs", Layer: "WrappingLegsOver2", Pri: 5, + Poses: ToMap(["Closed", "KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Tape", + NoOverride: true, + }, + { Name: "RightLegs", Layer: "WrappingLegsOver2", Pri: 5, + //SwapLayerPose: {Kneel: "WrappingLegsRightOver", KneelClosed: "WrappingLegsRightOver"}, + Poses: ToMap(["Closed", "KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Tape", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "TapeBottom", + Folder: "TapeLight", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["FeetLinked"], + Layers: ToLayerMap([ + // + ]) +}); + +AddModel({ + Name: "TapeTorsoUpper", + Folder: "TapeLight", + Parent: "TapeArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape", "FlattenedUnderbust"], + Layers: ToLayerMap([ + { Name: "Top", Layer: "WrappingTorsoMid", Pri: 29, + Poses: ToMap(["Boxtie", "Crossed", "Wristtie"]), + GlobalDefaultOverride: ToMap(["Crossed"]), + InheritColor: "Tape", + }, + ]) +}); + +AddModel({ + Name: "TapeArmLeft", + Folder: "TapeLight", + Parent: "TapeArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + Layers: ToLayerMap([ + { Name: "ArmLeft", Layer: "WrapArms", Pri: 30, // BindArmLeft + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmLeft", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + + DisplacementSprite: "TapeLightLeft", + DisplaceLayers: ToMap(["ArmsAllAndHarness"]), + DisplacementMorph: {Crossed: "Crossed", Boxtie: "Boxtie", Wristtie: "Wristtie"}, + DisplacementInvariant: true, + DisplaceAmount: 100, + + NoOverride: true, + + NoDisplace: true, + InheritColor: "Tape", + }, + ]) +}); +AddModel({ + Name: "TapeArmRight", + Folder: "TapeLight", + Parent: "TapeArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + Layers: ToLayerMap([ + { Name: "ArmRight", Layer: "WrapArms", Pri: 30, // BindArmRight + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmRight", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + + DisplacementSprite: "TapeLightRight", + DisplaceLayers: ToMap(["ArmsAllAndHarness"]), + DisplacementMorph: {Crossed: "Crossed", Boxtie: "Boxtie", Wristtie: "Wristtie"}, + DisplacementInvariant: true, + DisplaceAmount: 100, + + NoDisplace: true, + NoOverride: true, + InheritColor: "Tape", + }, + ]) +}); + +AddModel({ + Name: "TapeArms", + Folder: "TapeLight", + Parent: "Tape", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Tape", "FlattenedUnderbust"], + Layers: ToLayerMap([ + ...GetModelLayers("TapeArmLeft"), + ...GetModelLayers("TapeArmRight"), + ...GetModelLayers("TapeTorsoUpper"), + ]) +}); + +AddModel({ + Name: "TapeStrapArms", + Folder: "TapeMed", + Parent: "TapeMed", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Tape", "FlattenedUnderbust"], + Layers: ToLayerMap([ + { Name: "TopStrap", Layer: "WrappingChest", Pri: 32, + Poses: ToMap(["Boxtie", "Crossed", "Wristtie"]), + GlobalDefaultOverride: ToMap(["Crossed"]), + InheritColor: "Tape", + NoOverride: true, + }, + { Name: "ChestStrap", Layer: "WrappingChest", Pri: 35, + Invariant: true, + InheritColor: "Tape", + NoOverride: true, + TieToLayer: "TopStrap", + + //CrossHideOverride: true, + //HideOverrideLayerMulti: ["ChestBinding"], + //ForceSingleOverride: true, + }, + { Name: "ArmStrapLeft", Layer: "WrappingChest", Pri: 35, // BindArmLeft + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmLeft", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + NoOverride: true, + TieToLayer: "TopStrap", + + DisplacementSprite: "TapeTopLeft", + DisplaceLayers: ToMap(["ArmsAllAndHarness"]), + DisplacementMorph: {Crossed: "Crossed", Boxtie: "Boxtie", Wristtie: "Wristtie"}, + DisplacementInvariant: true, + DisplaceAmount: 100, + + NoDisplace: true, + InheritColor: "Tape", + }, + { Name: "ArmStrapRight", Layer: "WrappingChest", Pri: 35, // BindArmRight + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmRight", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + NoOverride: true, + TieToLayer: "TopStrap", + + DisplacementSprite: "TapeTopRight", + DisplaceLayers: ToMap(["ArmsAllAndHarness"]), + DisplacementMorph: {Crossed: "Crossed", Boxtie: "Boxtie", Wristtie: "Wristtie"}, + DisplacementInvariant: true, + DisplaceAmount: 100, + + NoDisplace: true, + InheritColor: "Tape", + }, + ]) +}); + +AddModel({ + Name: "TapeStrappedArms", + Folder: "TapeLight", + Parent: "TapeArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + Layers: ToLayerMap([ + ...GetModelLayers("TapeArms"), + ...GetModelLayers("TapeStrapArms"), + ]) +}); + +AddModel({ + Name: "TapeHandLeft", + Folder: "TapeLight", + Parent: "TapeArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + Layers: ToLayerMap([ + { Name: "HandLeft", Layer: "MittenLeft", Pri: -5, + Poses: ToMap(["Free", "Boxtie", "Front", "Up", "Wristtie"]), + SwapLayerPose: {Front: "ForeMittenLeft"}, + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "Tape", + }, + ]) +}); +AddModel({ + Name: "TapeHandRight", + Folder: "TapeLight", + Parent: "TapeArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + Layers: ToLayerMap([ + { Name: "HandRight", Layer: "MittenRight", Pri: -5, + Poses: ToMap(["Free", "Boxtie", "Front", "Up", "Wristtie"]), + SwapLayerPose: {Front: "ForeMittenRight"}, + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "Tape", + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_TapeMed.ts b/Data/ModelList_TapeMed.ts new file mode 100644 index 000000000..130d0c560 --- /dev/null +++ b/Data/ModelList_TapeMed.ts @@ -0,0 +1,279 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + +AddModel({ + Name: "TapeMedBoots", + Folder: "TapeMed", + Parent: "TapeMedBottom", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseFeet"], + AddPoseConditional: { + RestrainingShoes: ["TapeBoots"], + }, + RemovePoses: ["RestrainingShoes"], + Layers: ToLayerMap([ + { Name: "Feet", Layer: "WrappingLegs", Pri: 10, + Poses: ToMap(["Closed", "KneelClosed"]), + //GlobalDefaultOverride: ToMap(["KneelClosed"]), + DisplacementSprite: "TapeAnklesSquish", + DisplaceAmount: 50, + DisplaceLayers: ToMap(["RopeCalf"]), + InheritColor: "Tape", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "TapeMedAnkles", + Folder: "TapeMed", + Parent: "TapeMedBottom", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseAnkles"], + Layers: ToLayerMap([ + { Name: "Ankles", Layer: "WrappingAnklesOver", Pri: 40, + Poses: ToMap(["Closed", "KneelClosed", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Tape", + HideWhenOverridden: true, + NoOverride: true, + }, + ]) +}); + + +AddModel({ + Name: "TapeMedLegs", + Folder: "TapeMed", + TopLevel: false, + Parent: "TapeMedBottom", + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["FeetLinked", "EncaseLegs"], + Layers: ToLayerMap([ + { Name: "Legs", Layer: "WrappingLegsOver2", Pri: 45, + Poses: ToMap(["Closed", "KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Tape", + HideWhenOverridden: true, + NoOverride: true, + }, + { Name: "RightLegs", Layer: "WrappingLegsOver2", Pri: 45, + //SwapLayerPose: {Kneel: "WrappingLegsRightOver", KneelClosed: "WrappingLegsRightOver"}, + Poses: ToMap(["Closed", "KneelClosed", "Kneel", "Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), + InheritColor: "Tape", + HideWhenOverridden: true, + NoOverride: true, + }, + { Name: "StrapCover", Layer: "OverCrotchStrapMid", Pri: 5, + TieToLayer: "Legs", + Poses: ToMap(["Closed", "Hogtie"]), + RequirePoses: ToMap(["CrotchStrap"]), + HidePoses: ToMap(["Skirt"]), + InheritColor: "Tape", + Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "TapeMedBottom", + Folder: "TapeMed", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["FeetLinked", "EncaseLegs"], + Layers: ToLayerMap([ + ]) +}); +/* +AddModel({ + Name: "TapeMedArmLeft", + Folder: "TapeMed", + Parent: "TapeMedArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseArmLeft"], + Layers: ToLayerMap([ + { Name: "ArmLeft", Layer: "BindArmLeft", Pri: -5, + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmLeft", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Tape", + }, + ]) +}); +AddModel({ + Name: "TapeMedArmRight", + Folder: "TapeMed", + Parent: "TapeMedArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseArmRight"], + Layers: ToLayerMap([ + { Name: "ArmRight", Layer: "BindArmRight", Pri: -5, + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmRight", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + InheritColor: "Tape", + }, + ]) +});*/ + +AddModel({ + Name: "TapeMedArms", + Folder: "TapeMed", + Parent: "TapeMed", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Tape", "FlattenedUnderbust"], + Layers: ToLayerMap([ + { Name: "Top", Layer: "WrappingTorsoMid", Pri: 40, + Poses: ToMap(["Boxtie", "Crossed", "Wristtie"]), + GlobalDefaultOverride: ToMap(["Crossed"]), + InheritColor: "Tape", + NoOverride: true, + }, + { Name: "Chest", Layer: "WrappingChest", Pri: 40, + Invariant: true, + InheritColor: "Tape", + NoOverride: true, + + //CrossHideOverride: true, + //HideOverrideLayerMulti: ["ChestBinding"], + //ForceSingleOverride: true, + }, + { Name: "ArmLeft", Layer: "WrapArms", Pri: 45, // BindArmLeft + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmLeft", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + NoOverride: true, + + DisplacementSprite: "TapeMedLeft", + DisplaceLayers: ToMap(["ArmsAllAndHarness"]), + DisplacementMorph: {Crossed: "Crossed", Boxtie: "Boxtie", Wristtie: "Wristtie"}, + DisplacementInvariant: true, + DisplaceAmount: 100, + + NoDisplace: true, + InheritColor: "Tape", + }, + { Name: "ArmRight", Layer: "WrapArms", Pri: 45, // BindArmRight + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "BindForeArmRight", Crossed: "BindCrossArmRight"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + NoOverride: true, + + DisplacementSprite: "TapeMedRight", + DisplaceLayers: ToMap(["ArmsAllAndHarness"]), + DisplacementMorph: {Crossed: "Crossed", Boxtie: "Boxtie", Wristtie: "Wristtie"}, + DisplacementInvariant: true, + DisplaceAmount: 100, + + NoDisplace: true, + InheritColor: "Tape", + }, + ]) +}); + + + + +AddModel({ + Name: "TapeFullArms", + Folder: "TapeMed", + Parent: "TapeMed", + TopLevel: true, + Restraint: true, + Categories: ["Restraints", "Tape"], + Layers: ToLayerMap([ + { Name: "TopFull", Layer: "WrappingTorsoMid", Pri: 40, + Poses: ToMap(["Boxtie", "Crossed", "Wristtie"]), + GlobalDefaultOverride: ToMap(["Crossed"]), + InheritColor: "Tape", + }, + { Name: "ChestFull", Layer: "WrappingChest", Pri: 49, + Invariant: true, + InheritColor: "Tape", + + //CrossHideOverride: true, + //HideOverrideLayerMulti: ["ChestBinding"], + //ForceSingleOverride: true, + }, + { Name: "ArmFullLeft", Layer: "WrappingChest", Pri: 45, // BindArmLeft + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "WrapForeArms", Crossed: "BindCrossArms"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + + DisplacementSprite: "TapeFullLeft", + DisplaceLayers: ToMap(["ArmsAllAndHarness"]), + DisplacementMorph: {Crossed: "Crossed", Boxtie: "Boxtie", Wristtie: "Wristtie"}, + DisplacementInvariant: true, + DisplaceAmount: 100, + + NoDisplace: true, + InheritColor: "Tape", + }, + { Name: "ArmFullRight", Layer: "WrappingChest", Pri: 45, // BindArmRight + Poses: ToMap(["Boxtie", "Front", "Crossed", "Up", "Wristtie"]), + SwapLayerPose: {Front: "WrapForeArms", Crossed: "BindCrossArms"}, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + + DisplacementSprite: "TapeFullRight", + DisplaceLayers: ToMap(["ArmsAllAndHarness"]), + DisplacementMorph: {Crossed: "Crossed", Boxtie: "Boxtie", Wristtie: "Wristtie"}, + DisplacementInvariant: true, + DisplaceAmount: 100, + + NoDisplace: true, + InheritColor: "Tape", + }, + ]) +}); + +AddModel({ + Name: "TapeMedHandLeft", + Folder: "TapeMed", + Parent: "TapeMedArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseHandLeft"], + Layers: ToLayerMap([ + { Name: "HandLeft", Layer: "MittenLeft", Pri: -5, + Poses: ToMap(["Free", "Boxtie", "Front", "Up", "Wristtie"]), + SwapLayerPose: {Front: "ForeMittenLeft"}, + HidePoses: ToMap(["HideHands"]), + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "Tape", + }, + ]) +}); +AddModel({ + Name: "TapeMedHandRight", + Folder: "TapeMed", + Parent: "TapeMedArms", + TopLevel: false, + Restraint: true, + Categories: ["Restraints", "Tape"], + AddPose: ["EncaseHandRight"], + Layers: ToLayerMap([ + { Name: "HandRight", Layer: "MittenRight", Pri: -5, + Poses: ToMap(["Free", "Boxtie", "Front", "Up", "Wristtie"]), + SwapLayerPose: {Front: "ForeMittenRight"}, + HidePoses: ToMap(["HideHands"]), + GlobalDefaultOverride: ToMap(["Front"]), + InheritColor: "Tape", + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Toys.ts b/Data/ModelList_Toys.ts new file mode 100644 index 000000000..7dd53a577 --- /dev/null +++ b/Data/ModelList_Toys.ts @@ -0,0 +1,126 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "NippleClamps", + Folder: "Nipples", + Parent: "NippleClamps", + TopLevel: true, + Categories: ["Toys", "Clamps"], + Filters: {"Clamps":{"gamma":0.5666666666666667,"saturation":0.25,"contrast":0.95,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"ClampsBullet":{"gamma":1,"saturation":1,"contrast":2.2,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}, + Layers: ToLayerMap([ + { Name: "Clamps", Layer: "NippleToys", Pri: 50, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Base", + SwapLayerPose: {NippleToysOption: "NippleToysOption"}, + HidePoses: {HideNippleToys: true} + }, + { Name: "ClampsBullet", Layer: "NippleToys", Pri: 49.9, + Invariant: true, + NoOverride: true, + TieToLayer: "Clamps", + InheritColor: "Vibe", + SwapLayerPose: {NippleToysOption: "NippleToysOption"}, + HidePoses: {HideNippleToys: true} + }, + ]) +}); +AddModel(GetModelRestraintVersion("NippleClamps", true)); + +AddModel({ + Name: "RingVibes", + Folder: "Nipples", + Parent: "NippleClamps", + TopLevel: true, + Categories: ["Toys", "Clamps"], + //Filters: {"Clamps":{"gamma":0.5666666666666667,"saturation":0.25,"contrast":0.95,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"ClampsBullet":{"gamma":1,"saturation":1,"contrast":2.2,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}, + Layers: ToLayerMap([ + { Name: "Rings", Layer: "NippleToys", Pri: 10, + Invariant: true, + InheritColor: "Base", + NoOverride: true, + SwapLayerPose: {NippleToysOption: "NippleToysOption"}, + HidePoses: {HideNippleToys: true} + }, + { Name: "RingsBullet", Layer: "NippleToys", Pri: 9.9, + Invariant: true, + NoOverride: true, + TieToLayer: "Clamps", + InheritColor: "Vibe", + SwapLayerPose: {NippleToysOption: "NippleToysOption"}, + HidePoses: {HideNippleToys: true} + }, + ]) +}); +AddModel(GetModelRestraintVersion("RingVibes", true)); + +AddModel({ + Name: "NippleWeights", + Folder: "Nipples", + Parent: "NippleClamps", + TopLevel: true, + Categories: ["Toys", "Clamps"], + //Filters: {"Clamps":{"gamma":0.5666666666666667,"saturation":0.25,"contrast":0.95,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"ClampsBullet":{"gamma":1,"saturation":1,"contrast":2.2,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}, + Layers: ToLayerMap([ + { Name: "Weights", Layer: "NippleToys", Pri: 40, + Invariant: true, + InheritColor: "Base", + HideWhenOverridden: true, + SwapLayerPose: {NippleToysOption: "NippleToysOption"}, + HidePoses: {HideNippleToys: true} + }, + ]) +}); +AddModel(GetModelRestraintVersion("NippleWeights", true)); + +AddModel({ + Name: "VibePiercings", + Folder: "Nipples", + Parent: "NippleClamps", + TopLevel: true, + Categories: ["Toys", "Piercings"], + //Filters: {"Clamps":{"gamma":0.5666666666666667,"saturation":0.25,"contrast":0.95,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"ClampsBullet":{"gamma":1,"saturation":1,"contrast":2.2,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}, + Layers: ToLayerMap([ + { Name: "VibePiercings", Layer: "NippleToys", Pri: 40, + Invariant: true, + HideWhenOverridden: true, + InheritColor: "Base", + SwapLayerPose: {NippleToysOption: "NippleToysOption"}, + HidePoses: {HideNipplePiercings: true} + }, + { Name: "VibePiercingsBullet", Layer: "NippleToys", Pri: 39.9, + Invariant: true, + NoOverride: true, + TieToLayer: "VibePiercings", + InheritColor: "Vibe", + SwapLayerPose: {NippleToysOption: "NippleToysOption"}, + HidePoses: {HideNipplePiercings: true} + }, + // Replace with clamps + { Name: "Clamps", Layer: "NippleToys", Pri: 50, + Invariant: true, + NoOverride: true, + Poses: {HideNipplePiercings: true}, + HideWhenOverridden: true, + InheritColor: "Base", + SwapLayerPose: {NippleToysOption: "NippleToysOption"}, + HidePoses: {HideNippleToys: true} + }, + { Name: "ClampsBullet", Layer: "NippleToys", Pri: 49.9, + Invariant: true, + Poses: {HideNipplePiercings: true}, + NoOverride: true, + TieToLayer: "Clamps", + InheritColor: "Vibe", + SwapLayerPose: {NippleToysOption: "NippleToysOption"}, + HidePoses: {HideNippleToys: true} + }, + ]) +}); +AddModel(GetModelRestraintVersion("VibePiercings", true)); \ No newline at end of file diff --git a/Data/ModelList_Uniform.ts b/Data/ModelList_Uniform.ts new file mode 100644 index 000000000..696759361 --- /dev/null +++ b/Data/ModelList_Uniform.ts @@ -0,0 +1,660 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "MilitaryJacket_Sleeveless", + Folder: "Uniform", + Parent: "MilitaryJacket", + TopLevel: false, + Categories: ["Tops", "Jackets"], + //RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "Dress", Layer: "Shirt", Pri: 30, + InheritColor: "JacketBottom", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + HidePoses: ToMap(["EncaseTorsoUpper"]), + Invariant: true, + }, + { Name: "DressChest", Layer: "ShirtChest", Pri: 30, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + HidePoses: ToMap(["EncaseTorsoUpper"]), + InheritColor: "Jacket", + }, + { Name: "DressSkirt", Layer: "SkirtOver", Pri: 31, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", Hogtie: "Hogtie"}, + HidePoses: ToMap(["EncaseTorsoLower"]), + InheritColor: "JacketBottom", + }, + ]) +}); + + + +AddModel({ + Name: "MilitaryUniform_SleeveLeft", + Folder: "Uniform", + Parent: "MilitaryJacket", + TopLevel: false, + Categories: ["Sleeves"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "SleeveLeft", Layer: "SleeveLeft", Pri: 60, + Poses: ToMap([...ARMPOSES]), + InheritColor: "JacketSleeveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + { Name: "ArmLeft", Layer: "SleeveLeft", Pri: 50, + Poses: ToMap([...ARMPOSES]), + InheritColor: "JacketSleeveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + TieToLayer: "SleeveLeft", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + { Name: "ForeArmLeft", Layer: "ForeSleeveLeft", Pri: 60, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "JacketSleeveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossSleeveLeft"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + + ]) +}); + +AddModel({ + Name: "MilitaryUniform_SleeveRight", + Folder: "Uniform", + Parent: "MilitaryJacket", + TopLevel: false, + Categories: ["Sleeves"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "SleeveRight", Layer: "SleeveRight", Pri: 60, + Poses: ToMap([...ARMPOSES]), + InheritColor: "JacketSleeveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + }, + { Name: "ArmRight", Layer: "SleeveRight", Pri: 50, + Poses: ToMap([...ARMPOSES]), + InheritColor: "JacketSleeveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + TieToLayer: "SleeveRight", + NoOverride: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + + }, + { Name: "ForeArmRight", Layer: "ForeSleeveRight", Pri: 60, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "JacketSleeveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossSleeveRight"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + }, + { Name: "ShoulderRight", Layer: "UpSleeveRight", Pri: 60, + HideWhenOverridden: true, + InheritColor: "JacketSleeveRight", + Poses: ToMap([...SHOULDERPOSES]), + }, + ]) +}); + + +AddModel({ + Name: "MilitaryUniform_Sleeves", + Folder: "Uniform", + Parent: "MilitaryJacket", + TopLevel: false, + Categories: ["Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("MilitaryUniform_SleeveLeft"), + ...GetModelLayers("MilitaryUniform_SleeveRight"), + ]) +}); + + +AddModel({ + Name: "MilitaryJacket", + Folder: "Uniform", + Parent: "MilitaryUniform", + TopLevel: true, + Categories: ["Tops", "Jackets", "Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("MilitaryUniform_Sleeves"), + ...GetModelLayers("MilitaryJacket_Sleeveless"), + ]) +}); + + + + +AddModel({ + Name: "WhiteGloveLeft", + Folder: "UniformShirt", + Parent: "WhiteGloves", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveLeft", Layer: "GloveLeft", Pri: 3, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "ForeGloveLeft", Layer: "ForeGloveLeft", Pri: 3, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveLeft"}, + }, + ]) +}); + +AddModel({ + Name: "WhiteGloveRight", + Folder: "UniformShirt", + Parent: "WhiteGloves", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveRight", Layer: "GloveRight", Pri: 3, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "ForeGloveRight", Layer: "ForeGloveRight", Pri: 3, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + ]) +}); + + +AddModel({ + Name: "WhiteGloves", + Folder: "UniformShirt", + Parent: "MilitaryUniform", + TopLevel: true, + Categories: ["Gloves"], + Layers: ToLayerMap([ + ...GetModelLayers("WhiteGloveLeft"), + ...GetModelLayers("WhiteGloveRight"), + ]) +}); + + + +AddModel({ + Name: "UniformShirt_Sleeveless", + Folder: "UniformShirt", + Parent: "UniformShirt", + TopLevel: false, + Categories: ["Tops", "Jackets"], + //RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "Dress", Layer: "Shirt", Pri: -5, + InheritColor: "ShirtBottom", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + HidePoses: ToMap(["EncaseTorsoUpper"]), + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + Invariant: true, + }, + { Name: "DressChest", Layer: "ShirtChest", Pri: -5, + Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + HidePoses: ToMap(["EncaseTorsoUpper"]), + InheritColor: "Shirt", + }, + ]) +}); + + + +AddModel({ + Name: "UniformShirt_SleeveLeft", + Folder: "UniformShirt", + Parent: "UniformShirt", + TopLevel: false, + Categories: ["Sleeves"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "SleeveLeft", Layer: "SleeveLeft", Pri: 10, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + { Name: "ForeArmLeft", Layer: "ForeSleeveLeft", Pri: 10, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "SleeveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossSleeveLeft"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + + ]) +}); + +AddModel({ + Name: "UniformShirt_SleeveRight", + Folder: "UniformShirt", + Parent: "UniformShirt", + TopLevel: false, + Categories: ["Sleeves"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "SleeveRight", Layer: "SleeveRight", Pri: 10, + Poses: ToMap([...ARMPOSES]), + InheritColor: "SleeveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + }, + { Name: "ForeArmRight", Layer: "ForeSleeveRight", Pri: 10, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "SleeveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossSleeveRight"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + }, + { Name: "ShoulderRight", Layer: "UpSleeveRight", Pri: 10, + HideWhenOverridden: true, + InheritColor: "SleeveRight", + Poses: ToMap([...SHOULDERPOSES]), + }, + ]) +}); + + +AddModel({ + Name: "UniformShirt_Sleeves", + Folder: "UniformShirt", + Parent: "UniformShirt", + TopLevel: false, + Categories: ["Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("UniformShirt_SleeveLeft"), + ...GetModelLayers("UniformShirt_SleeveRight"), + ]) +}); + + +AddModel({ + Name: "UniformShirt", + Folder: "UniformShirt", + Parent: "MilitaryUniform", + TopLevel: true, + Categories: ["Tops", "Shirts", "Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("UniformShirt_Sleeves"), + ...GetModelLayers("UniformShirt_Sleeveless"), + ]) +}); + +AddModel({ + Name: "MilitaryUniform_Hat", + Folder: "Uniform", + Parent: "MilitaryUniform", + TopLevel: true, + Categories: ["Hats"], + Layers: ToLayerMap([ + { Name: "Hat", Layer: "Hat", Pri: 30, + HideWhenOverridden: true, + Invariant: true, + EraseLayers: {EarsHelmet: true}, + EraseAmount: 100, + EraseSprite: "SovietHatErase", + }, + { Name: "HatRim", Layer: "Hat", Pri: 30.2, + HideWhenOverridden: true, + NoOverride: true, + Invariant: true, + InheritColor: "Rim", + }, + { Name: "HatCap", Layer: "Hat", Pri: 30.1, + HideWhenOverridden: true, + NoOverride: true, + Invariant: true, + InheritColor: "Cap", + }, + { Name: "HatGloriousInsignia", Layer: "Hat", Pri: 30.3, + HideWhenOverridden: true, + NoOverride: true, + Invariant: true, + InheritColor: "Circle", + }, + { Name: "HatGloriousInsigniaHS", Layer: "Hat", Pri: 30.4, + HideWhenOverridden: true, + NoOverride: true, + Invariant: true, + InheritColor: "Secret", + RequirePoses: {"Marhnth": true}, + }, + ]) +}); + + + +AddModel({ + Name: "MilitaryUniform_Skirt", + Folder: "Uniform", + Parent: "MilitaryUniform", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "Skirt", Pri: -4, + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + Poses: ToMap([...LEGPOSES]), + //HideWhenOverridden: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + //AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "SkirtBand", Layer: "Skirt", Pri: -3.9, + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + Poses: ToMap([...LEGPOSES]), + //HideWhenOverridden: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel"}, + //AppendPose: ToMapDupe(["CrotchStrap"]), + TieToLayer: "Skirt", + InheritColor: "Band", + Invariant: true, + }, + ]) +}); + + +AddModel({ + Name: "MilitaryUniform_Shoes", + Folder: "Uniform", + Parent: "MilitaryUniform", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + { Name: "ShoeLeft", Layer: "ShoeLeft", Pri: 17, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie"]), + GlobalDefaultOverride: ToMap(["KneelClosed"]), + HideWhenOverridden: true, + + DisplaceLayers: {ShoeLeft: true,}, + DisplacementSprite: "SockLSquish_Short", + DisplaceAmount: 10, + }, + { Name: "ShoeRight", Layer: "ShoeRight", Pri: 17, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "Kneel", "KneelClosed"]), + HideWhenOverridden: true, + + DisplaceLayers: {ShoeRight: true,}, + DisplacementSprite: "SockRSquish_Short", + DisplaceAmount: 10, + }, + { Name: "ShoeRightKneel", Layer: "ShoeRightKneel", Pri: 17, + Poses: ToMap(["Kneel"]), + Invariant: true, + InheritColor: "ShoeRight", + HideWhenOverridden: true, + }, + { Name: "ShoeLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 17, + Poses: ToMap(["Hogtie"]), + Invariant: true, + InheritColor: "ShoeLeft", + HideWhenOverridden: true, + }, + ]) +}); + + + +AddModel({ + Name: "MilitaryUniform_TightsShorts", + Folder: "Uniform", + Parent: "Tights", + Categories: ["Panties"], + TopLevel: true, + Layers: ToLayerMap([ + { Name: "Pantyhose", Layer: "BodysuitLower", Pri: -30, + Poses: ToMap([...LEGPOSES]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //MorphPoses: {Hogtie: "Hogtie"}, + }, + ]) +}); + +AddModel({ + Name: "MilitaryUniform_SockLeft", + Folder: "Uniform", + Parent: "Tights", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockLeft", Layer: "StockingLeft", Pri: -30, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingLeft: true,}, + DisplacementSprite: "SockLSquish_Long", + DisplaceAmount: 30, + + }, + { Name: "FootSockLeftHogtie", Layer: "SockLeftHogtie", Pri: -30, + Poses: ToMap(["Hogtie"]), + InheritColor: "SockLeft", + Invariant: true, + }, + ]) +}); +AddModel({ + Name: "MilitaryUniform_SockRight", + Folder: "Uniform", + Parent: "Tights", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "SockRight", Layer: "StockingRight", Pri: -30, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + DisplaceLayers: {StockingRight: true,}, + DisplacementSprite: "SockRSquish_Long", + DisplaceAmount: 30, + + }, + { Name: "FootSockRightKneel", Layer: "SockRightKneel", Pri: -30, + HidePoses: ToMap(["FeetLinked"]), + Poses: ToMap(["Kneel"]), + InheritColor: "SockRight", + Invariant: true, + }, + ]) +}); + + + + +AddModel({ + Name: "Tights", + Folder: "Uniform", + Parent: "MilitaryUniform", + Categories: ["Socks", "Panties"], + TopLevel: true, + Layers: ToLayerMap([ + ...GetModelLayers("MilitaryUniform_TightsShorts"), + ...GetModelLayers("MilitaryUniform_SockLeft"), + ...GetModelLayers("MilitaryUniform_SockRight"), + ]) +}); + + + +AddModel({ + Name: "MilitaryUniform", + Folder: "Uniform", + Parent: "MilitaryUniform", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("MilitaryJacket"), + ...GetModelLayers("UniformShirt", "Shirt", undefined, undefined, undefined, undefined, + "UniformShirt" + ), + ...GetModelLayers("WhiteGloves", undefined, undefined, undefined, undefined, undefined, + "UniformShirt" + ), + ...GetModelLayers("Tights"), + ...GetModelLayers("MilitaryUniform_Shoes"), + ...GetModelLayers("MilitaryUniform_Skirt"), + ...GetModelLayers("MilitaryUniform_Hairpin"), + ...GetModelLayers("MilitaryUniform_Hat"), + ...GetModelLayers("MilitaryEarphones"), + + + + { Name: "Headgear", Layer: "Circlet", Pri: 40, + HideWhenOverridden: true, + NoOverride: true, + Invariant: true, + InheritColor: "Band", + RequirePoses: {"Marhnth": true}, + }, + { Name: "HeadgearUnit", Layer: "Circlet", Pri: 40.1, + TieToLayer: "Headgear", + NoOverride: true, + Invariant: true, + InheritColor: "Unit", + RequirePoses: {"Marhnth": true}, + }, + { Name: "HeadgearBack", Layer: "CircletUnder", Pri: -40, + NoOverride: true, + Invariant: true, + InheritColor: "Inner", + RequirePoses: {"Marhnth": true}, + }, + + { Name: "BeltPouch", Layer: "ChestStraps", Pri: 50, + Invariant: true, + NoOverride: true, + InheritColor: "Pouch", + RequirePoses: {"Marhnth": true}, + }, + { Name: "BeltPouchRim", Layer: "ChestStraps", Pri: 50.1, + Invariant: true, + NoOverride: true, + TieToLayer: "BeltPouch", + RequirePoses: {"Marhnth": true}, + }, + + { Name: "WebbingUnderbust", Layer: "ChestStraps", Pri: 25, + Invariant: true, + NoOverride: true, + InheritColor: "UnderbustStrap", + RequirePoses: {"Marhnth": true}, + }, + { Name: "WebbingUnderbustHardware", Layer: "ChestStraps", Pri: 25.1, + Invariant: true, + NoOverride: true, + TieToLayer: "WebbingUnderbust", + InheritColor: "UnderbustHardware", + RequirePoses: {"Marhnth": true}, + }, + + { Name: "HeadgearEars", Layer: "Circlet", Pri: 40.1, + TieToLayer: "Headgear", + NoOverride: true, + Invariant: true, + InheritColor: "Ears", + RequirePoses: {"Marhnth": true}, + }, + { Name: "HeadgearEarsInner", Layer: "Circlet", Pri: 40.2, + TieToLayer: "Headgear", + NoOverride: true, + Invariant: true, + InheritColor: "EarsInner", + RequirePoses: {"Marhnth": true}, + }, + { Name: "Webbing", Layer: "UpperArmStraps", Pri: 25, + Invariant: true, + NoOverride: true, + InheritColor: "Secret_Strap", + RequirePoses: {"Marhnth": true}, + MorphPoses: {Wristtie: "Wristtie", Up: "Up"}, + }, + { Name: "WebbingSide", Layer: "ChestStraps", Pri: 25.1, + Invariant: true, + NoOverride: true, + InheritColor: "Secret_Side", + TieToLayer: "Webbing", + RequirePoses: {"Marhnth": true}, + MorphPoses: {Boxtie: "Tied", Wristtie: "Tied", Front: "Tied", Crossed: "Tied", Up: "Up", Yoked: "Yoked"}, + }, + { Name: "WebbingHardware", Layer: "UpperArmStraps", Pri: 25.1, + Invariant: true, + NoOverride: true, + InheritColor: "Secret_Hardware", + TieToLayer: "Webbing", + RequirePoses: {"Marhnth": true}, + }, + { Name: "WebbingName", Layer: "UpperArmStraps", Pri: 25.1, + Invariant: true, + NoOverride: true, + RequirePoses: {"Marhnth": true}, + InheritColor: "Name", + TieToLayer: "Webbing", + }, + { Name: "WebbingUnderbust", Layer: "ChestStraps", Pri: 25, + Invariant: true, + NoOverride: true, + InheritColor: "Secret_UnderbustStrap", + RequirePoses: {"Marhnth": true}, + }, + { Name: "WebbingUnderbustHardware", Layer: "ChestStraps", Pri: 25.1, + Invariant: true, + NoOverride: true, + TieToLayer: "WebbingUnderbust", + InheritColor: "Secret_UnderbustHardware", + RequirePoses: {"Marhnth": true}, + }, + { Name: "SearchlightPouch", Layer: "UpperArmStraps", Pri: 50, + Invariant: true, + NoOverride: true, + InheritColor: "Secret_Pouch", + RequirePoses: {"Marhnth": true}, + }, + { Name: "Searchlight", Layer: "ChestOverHair", Pri: 50.2, + Invariant: true, + NoOverride: true, + InheritColor: "Secret_Light", + RequirePoses: {"Marhnth": true}, + }, + { Name: "SearchlightBase", Layer: "UpperArmStraps", Pri: 50.1, + Invariant: true, + NoOverride: true, + InheritColor: "Secret_Base", + RequirePoses: {"Marhnth": true}, + }, + { Name: "SearchlightLens", Layer: "ChestOverHair", Pri: 50, + Invariant: true, + NoOverride: true, + TieToLayer: "Searchlight", + InheritColor: "Secret_Lens", + RequirePoses: {"Marhnth": true}, + }, + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Visors.ts b/Data/ModelList_Visors.ts new file mode 100644 index 000000000..677d8d817 --- /dev/null +++ b/Data/ModelList_Visors.ts @@ -0,0 +1,104 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + + + +AddModel({ + Name: "Goggles", + Folder: "Visors", + Parent: "Goggles", + TopLevel: true, + Categories: ["Accessories", "Face"], + Layers: ToLayerMap([ + { Name: "Dollmaker", Layer: "Goggles", Pri: 14, + InheritColor: "Goggles", + Invariant: true, + HideWhenOverridden: true, + }, + ]) +}); +AddModel(GetModelRestraintVersion("Goggles", true)); + +AddModel({ + Name: "FullVisor", + Folder: "Visors", + Parent: "Goggles", + TopLevel: false, + Categories: ["Accessories", "Face"], + Layers: ToLayerMap([ + { Name: "DollmakerFull", Layer: "MaskOver", Pri: 50, + InheritColor: "FullVisor", + Invariant: true, + HideWhenOverridden: true, + }, + ]) +}); +AddModel({ + Name: "FullVisorRim", + Folder: "Visors", + Parent: "Goggles", + TopLevel: false, + Categories: ["Accessories", "Face"], + Layers: ToLayerMap([ + { Name: "DollmakerFull", Layer: "MaskOver", Pri: 50, + InheritColor: "FullVisor", + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "DollmakerFullRim", Layer: "MaskOver", Pri: 50.1, + InheritColor: "Rim", + Invariant: true, + NoOverride: true, TieToLayer: "DollmakerFull", + }, + ]) +}); +AddModel(GetModelRestraintVersion("FullVisor", true)); +AddModel(GetModelRestraintVersion("FullVisorRim", true)); + + +AddModel({ + Name: "GasMask", + Folder: "Gasmask", + Parent: "GasMask", + TopLevel: true, + Categories: ["Accessories", "Face"], + Layers: ToLayerMap([ + { Name: "Mask", Layer: "GagMuzzle", Pri: 10, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + HideWhenOverridden: true, + }, + { Name: "Valves", Layer: "GagMuzzle", Pri: 20, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, TieToLayer: "Mask", + }, + { Name: "Center", Layer: "GagMuzzle", Pri: 10.1, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, TieToLayer: "Mask", + }, + { Name: "Nose", Layer: "GagMuzzle", Pri: 10.2, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, TieToLayer: "Mask", + }, + { Name: "Plugs", Layer: "GagMuzzle", Pri: 20.2, + OffsetX: 942, + OffsetY: 200, + Invariant: true, + NoOverride: true, TieToLayer: "Valves", + }, + ]) +}); +AddModel(GetModelRestraintVersion("GasMask", true)); \ No newline at end of file diff --git a/Data/ModelList_Wolf.ts b/Data/ModelList_Wolf.ts new file mode 100644 index 000000000..271976d95 --- /dev/null +++ b/Data/ModelList_Wolf.ts @@ -0,0 +1,573 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + +AddModel({ + Name: "WolfPanties", + Folder: "Wolf", + Parent: "Wolf", + TopLevel: true, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + { Name: "Panties", Layer: "Panties", Pri: 10, + Invariant: true, + //swaplayerpose: {Kneel: "PantiesLower", KneelClosed: "PantiesLower"}, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel", } + }, + ]) +}); + +AddModel({ + Name: "WolfCollar", + Folder: "Wolf", + Parent: "Wolf", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "Collar", Layer: "Collar", Pri: 50, + Invariant: true, + InheritColor: "Lining", + }, + { Name: "CollarBand", Layer: "Collar", Pri: 50.1, + Invariant: true, + InheritColor: "Band", + TieToLayer: "Collar", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "WolfCollarTag", + Folder: "Wolf", + Parent: "Wolf", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("WolfCollar"), + { Name: "CollarHardware", Layer: "CollarAcc", Pri: -5, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "Collar", + NoOverride: true, + HidePoses: {HideModuleMiddle: true}, + }, + { Name: "CollarTag", Layer: "CollarAcc", Pri: -5.1, + Invariant: true, + InheritColor: "Tag", + TieToLayer: "Collar", + NoOverride: true, + HidePoses: {HideModuleMiddle: true}, + }, + ]) +}); +AddModel({ + Name: "WolfCollarSmall", + Folder: "Wolf", + Parent: "Wolf", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "FCollar", Layer: "Collar", Pri: 35, + Invariant: true, + InheritColor: "Lining", + }, + { Name: "FCollarBand", Layer: "Collar", Pri: 35.1, + Invariant: true, + InheritColor: "Band", + TieToLayer: "FCollar", + NoOverride: true, + }, + ]) +}); +AddModel({ + Name: "WolfCollarSmallTag", + Folder: "Wolf", + Parent: "Wolf", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("WolfCollarSmall"), + { Name: "FCollarHardware", Layer: "CollarAcc", Pri: -5.1, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "FCollar", + NoOverride: true, + HidePoses: {HideModuleMiddle: true}, + }, + { Name: "FCollarTag", Layer: "CollarAcc", Pri: -5, + Invariant: true, + InheritColor: "Tag", + TieToLayer: "FCollar", + NoOverride: true, + HidePoses: {HideModuleMiddle: true}, + }, + ]) +}); + +AddModel({ + Name: "WolfHarnessUpper", + Folder: "Wolf", + Parent: "WolfHarness", + TopLevel: false, + Categories: ["Accessories"], + Layers: ToLayerMap([ + { Name: "HarnessUpper", Layer: "BindChest", Pri: 35, + Invariant: true, + InheritColor: "Lining", + }, + { Name: "HarnessBandUpper", Layer: "BindChest", Pri: 35.1, + Invariant: true, + InheritColor: "Band", + TieToLayer: "HarnessUpper", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "WolfHarnessBelt", + Folder: "Wolf", + Parent: "WolfHarness", + TopLevel: false, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("WolfHarnessBelt"), + { Name: "BeltMid", Layer: "HarnessMid", Pri: 35, + Invariant: true, + InheritColor: "Lining", + }, + { Name: "BeltBandMid", Layer: "HarnessMid", Pri: 35.1, + Invariant: true, + InheritColor: "Band", + TieToLayer: "BeltMid", + NoOverride: true, + }, + { Name: "BeltHardwareMid", Layer: "HarnessMid", Pri: 35.2, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "BeltMid", + NoOverride: true, + }, + ]) +}); + +AddModel({ + Name: "WolfHarnessLower", + Folder: "Wolf", + Parent: "WolfHarness", + TopLevel: false, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("WolfHarnessBelt"), + { Name: "HarnessMid", Layer: "HarnessMid", Pri: 30, + Invariant: true, + InheritColor: "Lining", + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", } + }, + { Name: "HarnessHardwareMid", Layer: "HarnessMid", Pri: 30.1, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "HarnessMid", + NoOverride: true, + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", } + }, + { Name: "HarnessLower", Layer: "HarnessMid", Pri: 30, + Invariant: true, + InheritColor: "Lining", + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel", } + }, + { Name: "HarnessBandLower", Layer: "HarnessMid", Pri: 30.1, + Invariant: true, + InheritColor: "Band", + TieToLayer: "HarnessLower", + NoOverride: true, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel", } + }, + { Name: "HarnessHardwareLower", Layer: "HarnessMid", Pri: 30.2, + Invariant: true, + InheritColor: "Hardware", + TieToLayer: "HarnessLower", + NoOverride: true, + //SwapLayerPose: {Kneel: "HarnessLower", KneelClosed: "HarnessLower"}, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel", } + }, + ]) +}); + +AddModel({ + Name: "WolfHarness", + Folder: "Wolf", + Parent: "Wolf", + TopLevel: true, + Categories: ["Accessories"], + Layers: ToLayerMap([ + ...GetModelLayers("WolfHarnessBelt"), + ...GetModelLayers("WolfHarnessUpper"), + ...GetModelLayers("WolfHarnessLower"), + ]) +}); + + + +AddModel({ + Name: "WolfCuffsAnklesLeft", + Folder: "Wolf", + TopLevel: false, + Parent: "WolfCuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesLeft", "", "", "Cuff"), + ...GetModelLayers("ShacklesAnklesLeft", "Band", "", "Band", 0.4), + ]) +}); + +AddModel({ + Name: "WolfCuffsAnklesRight", + Folder: "Wolf", + TopLevel: false, + Parent: "WolfCuffsAnkles", + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight"], + Layers: ToLayerMap([ + ...GetModelLayers("ShacklesAnklesRight", "", "", "Cuff"), + ...GetModelLayers("ShacklesAnklesRight", "Band", "", "Band", 0.4), + ]) +}); + + +AddModel({ + Name: "WolfCuffsAnkles", + Folder: "Wolf", + TopLevel: true, + Categories: ["Restraints","Cuffs"], + AddPose: ["AnkleRight", "AnkleLeft"], + Layers: ToLayerMap([ + ...GetModelLayers("WolfCuffsAnklesRight"), + ...GetModelLayers("WolfCuffsAnklesLeft"), + ]) +}); + +AddModel(GetModelRestraintVersion("WolfCollar", true)); +AddModel(GetModelRestraintVersion("WolfCollarTag", true)); +AddModel(GetModelRestraintVersion("WolfCollarSmall", true)); +AddModel(GetModelRestraintVersion("WolfCollarSmallTag", true)); +AddModel(GetModelRestraintVersion("WolfPanties", true)); +AddModel(GetModelRestraintVersion("WolfHarnessLower", true)); +AddModel(GetModelRestraintVersion("WolfHarnessUpper", true)); +AddModel(GetModelRestraintVersion("WolfHarnessBelt", true)); +AddModel(GetModelRestraintVersion("WolfHarness", true)); + + +AddModel({ + Name: "WolfGloveLeft", + Folder: "WolfCatsuit", + Parent: "Wolf", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveLeft", Layer: "GloveLeft", Pri: -1, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "ForeGloveLeft", Layer: "ForeGloveLeft", Pri: -1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveLeft", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveLeft"}, + }, + { Name: "RimGloveLeft", Layer: "GloveLeft", Pri: -.9, + Poses: ToMap([...ARMPOSES]), + InheritColor: "RimLeft", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "RimForeGloveLeft", Layer: "ForeGloveLeft", Pri: -.9, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "RimLeft", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveLeft"}, + }, + { Name: "BandGloveLeft", Layer: "GloveLeft", Pri: -.8, + Poses: ToMap([...ARMPOSES]), + InheritColor: "BandLeft", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "BandForeGloveLeft", Layer: "ForeGloveLeft", Pri: -.8, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "BandLeft", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveLeft"}, + }, + ]) +}); + +AddModel({ + Name: "WolfGloveRight", + Folder: "WolfCatsuit", + Parent: "Wolf", + Categories: ["Gloves"], + Layers: ToLayerMap([ + { Name: "GloveRight", Layer: "GloveRight", Pri: -1, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "ForeGloveRight", Layer: "ForeGloveRight", Pri: -1, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "GloveRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + { Name: "RimGloveRight", Layer: "GloveRight", Pri: -.9, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + InheritColor: "RimRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "RimForeGloveRight", Layer: "ForeGloveRight", Pri: -.9, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "RimRight", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + { Name: "BandGloveRight", Layer: "GloveRight", Pri: -.8, + Poses: ToMapSubtract([...ARMPOSES], ["Wristtie"]), + InheritColor: "BandRight", + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + }, + { Name: "BandForeGloveRight", Layer: "ForeGloveRight", Pri: -.8, + Poses: ToMap([...FOREARMPOSES]), + InheritColor: "BandRight", + NoOverride: true, + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + SwapLayerPose: {Crossed: "CrossGloveRight"}, + }, + ]) +}); + +AddModel({ + Name: "WolfGloves", + Folder: "WolfCatsuit", + Parent: "Wolf", + TopLevel: true, + Categories: ["Gloves"], + Layers: ToLayerMap([ + ...GetModelLayers("WolfGloveLeft"), + ...GetModelLayers("WolfGloveRight"), + ]) +}); + + +AddModel({ + Name: "WolfSockLeft", + Folder: "WolfCatsuit", + Parent: "WolfSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "LegLeft", Layer: "StockingLeft", Pri: -1, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + InheritColor: "Cloth", + DisplaceLayers: {StockingLeft: true,}, + DisplacementSprite: "SockLSquish_Long", + DisplaceAmount: 10, + }, + { Name: "LegRimLeft", Layer: "StockingLeft", Pri: -.9, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + NoOverride: true, + TieToLayer: "LegLeft", + InheritColor: "Rim", + }, + { Name: "LegBandLeft", Layer: "StockingLeft", Pri: -.8, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + NoOverride: true, + TieToLayer: "LegLeft", + InheritColor: "Band", + }, + { Name: "LegPadsLeft", Layer: "StockingLeft", Pri: -.9, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + NoOverride: true, + TieToLayer: "LegLeft", + InheritColor: "Pads", + }, + ]) +}); +AddModel({ + Name: "WolfSockRight", + Folder: "WolfCatsuit", + Parent: "WolfSocks", + Categories: ["Socks"], + TopLevel: false, + Layers: ToLayerMap([ + { Name: "LegRight", Layer: "StockingRight", Pri: -1, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + InheritColor: "Cloth", + DisplaceLayers: {StockingRight: true,}, + DisplacementSprite: "SockRSquish_Long", + DisplaceAmount: 10, + }, + { Name: "LegRimRight", Layer: "StockingRight", Pri: -.9, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + NoOverride: true, + TieToLayer: "LegRight", + InheritColor: "Rim", + }, + { Name: "LegBandRight", Layer: "StockingRight", Pri: -.8, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + NoOverride: true, + TieToLayer: "LegRight", + InheritColor: "Band", + }, + { Name: "LegPadsRight", Layer: "StockingRight", Pri: -.9, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie", "KneelClosed"]), + NoOverride: true, + TieToLayer: "LegRight", + InheritColor: "Pads", + }, + ]) +}); + +AddModel({ + Name: "WolfSocks", + Folder: "WolfCatsuit", + Parent: "Wolf", + TopLevel: true, + Categories: ["Socks"], + Layers: ToLayerMap([ + ...GetModelLayers("WolfSockRight"), + ...GetModelLayers("WolfSockLeft"), + ]) +}); + +AddModel(GetModelRestraintVersion("WolfSocks", true)); + + + +AddModel({ + Name: "WolfTorsoLower", + Folder: "WolfCatsuit", + Parent: "Wolf", + TopLevel: false, + Categories: ["Underwear", "Panties"], + Layers: ToLayerMap([ + { Name: "TorsoLower", Layer: "Bodysuit", Pri: 10, + Invariant: true, + //swaplayerpose: {Kneel: "BodysuitLower", KneelClosed: "BodysuitLower"}, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel", }, + InheritColor: "Cloth", + }, + { Name: "TorsoLowerRim", Layer: "Bodysuit", Pri: 10.1, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel", }, + TieToLayer: "TorsoLower", + NoOverride: true, + }, + { Name: "TorsoLowerBand", Layer: "Bodysuit", Pri: 10.2, + Invariant: true, + MorphPoses: {Kneel: "Kneel", Hogtie: "Closed", Closed: "Closed", KneelClosed: "Kneel", }, + TieToLayer: "TorsoLower", + NoOverride: true, + }, + ]) +}); + + +AddModel({ + Name: "WolfTorsoUpper", + Folder: "WolfCatsuit", + Parent: "Wolf", + TopLevel: true, + Categories: ["Underwear", "Panties", "Tops"], + Layers: ToLayerMap([ + { Name: "Chest", Layer: "SuitChest", Pri: 30, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + InheritColor: "Cloth", + EraseAmount: 100, + EraseSprite: "LaceChest", + EraseLayers: ToMap(["ShirtCutoffBra"]), + }, + { Name: "TorsoUpperCups", Layer: "SuitChest", Pri: 30.1, + //HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + InheritColor: "Cups", + TieToLayer: "Chest", + NoOverride: true, + }, + { Name: "ChestRim", Layer: "SuitChest", Pri: 30.1, + Invariant: true, + InheritColor: "Rim", + TieToLayer: "Chest", + NoOverride: true, + }, + { Name: "ChestBand", Layer: "SuitChest", Pri: 30.2, + Invariant: true, + InheritColor: "Band", + TieToLayer: "Chest", + NoOverride: true, + }, + { Name: "TorsoUpper", Layer: "Bodysuit", Pri: 30, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + InheritColor: "Cloth", + }, + { Name: "TorsoUpperBand", Layer: "Bodysuit", Pri: 30.2, + //HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + InheritColor: "Band", + TieToLayer: "TorsoUpper", + NoOverride: true, + }, + { Name: "TorsoUpperRim", Layer: "Bodysuit", Pri: 30.1, + //HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + Invariant: true, + InheritColor: "Rim", + TieToLayer: "TorsoUpper", + NoOverride: true, + }, + ]) +}); + + + +AddModel({ + Name: "WolfHeels", + Folder: "WolfCatsuit", + Parent: "Wolf", + TopLevel: true, + Categories: ["Shoes"], + Layers: ToLayerMap([ + ...GetModelLayers("MaidShoes", undefined, undefined, undefined, 8), + ]) +}); + +AddModel({ + Name: "Wolf", + Folder: "WolfCatsuit", + Parent: "Wolf", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("WolfSocks"), + ...GetModelLayers("WolfGloves"), + ...GetModelLayers("WolfTorsoUpper"), + ...GetModelLayers("WolfTorsoLower"), + ...GetModelLayers("WolfHeels"), + ]) +}); \ No newline at end of file diff --git a/Data/ModelList_Yukata.ts b/Data/ModelList_Yukata.ts new file mode 100644 index 000000000..c726ca3a2 --- /dev/null +++ b/Data/ModelList_Yukata.ts @@ -0,0 +1,205 @@ +/** + * TIPS AND TRICKS FOR CONTRIBUTORS + * 1) Memorize the layering of body parts. Hands are higher than arms, feet higher than legs + * 2) Generally you will want to avoid lower pri items on the same layer sticking out on seams if your object is skintight. + * In general, this is accomplished by having higher priority items cover more of the original + */ + + + +AddModel({ + Name: "YukataWaist", + Folder: "Yukata", + Parent: "Yukata", + TopLevel: true, + Categories: ["Corsets"], + Layers: ToLayerMap([ + { Name: "Waist", Layer: "Bustier", Pri: -1, + Invariant: true, + InheritColor: "Waistband", + }, + { Name: "WaistBand", Layer: "Bustier", Pri: 70.1, + Invariant: true, + NoOverride: true, + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + InheritColor: "WaistbandBelts", + }, + ]) +}); + +AddModel({ + Name: "YukataWaistPattern", + Folder: "Yukata", + Parent: "Yukata", + TopLevel: true, + Categories: ["Corsets"], + Layers: ToLayerMap([ + { Name: "WaistPattern", Layer: "Bustier", Pri: -1, + Invariant: true, + InheritColor: "Waistband", + }, + { Name: "WaistBand", Layer: "Bustier", Pri: 70.1, + Invariant: true, + NoOverride: true, + DisplaceAmount: 150, + DisplaceLayers: ToMap(["CorsetTorso"]), + DisplacementSprite: "CorsetSquish", + DisplacementInvariant: true, + InheritColor: "WaistbandBelts", + }, + ]) +}); + + + + +AddModel({ + Name: "YukataTop", + Folder: "Yukata", + Parent: "YukataShirt", + TopLevel: false, + Categories: ["Tops"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + { Name: "Shirt", Layer: "Shirt", Pri: 24, + InheritColor: "Top", + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoUpper"], + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel",}, + }, + { Name: "ShirtChest", Layer: "ShirtChest", Pri: 34, + InheritColor: "Top", + Poses: ToMap([...ARMPOSES]), + MorphPoses: {Up: "Up", Boxtie: "Tied", Wristtie: "Tied", Crossed: "Tied", Front: "Tied", Yoked: "Yoked",}, + Invariant: true, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], + AppendPose: {Chesttied: "Chesttied"}, + }, + ]) +}); + + +AddModel({ + Name: "YukataSleeveLeft", + Folder: "Yukata", + Parent: "YukataSleeves", + Categories: ["Sleeves"], + Layers: ToLayerMap([ + { Name: "SleeveLeft", Layer: "SleeveLeft", Pri: 40, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + MorphPoses: {Crossed: "Front"}, + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmLeft"], + }, + ]) +}); +AddModel({ + Name: "YukataSleeveRight", + Folder: "Yukata", + Parent: "YukataSleeves", + Categories: ["Sleeves"], + Layers: ToLayerMap([ + { Name: "SleeveRight", Layer: "SleeveRight", Pri: 40, + Poses: ToMap([...ARMPOSES]), + GlobalDefaultOverride: ToMap(["Front", "Crossed"]), + MorphPoses: {Crossed: "Front"}, + HideWhenOverridden: true, + SwapLayerPose: {Up: "UpSleeveRight"}, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["ArmRight"], + }, + + ]) +}); + + + +AddModel({ + Name: "YukataSleeves", + Folder: "Yukata", + Parent: "Yukata", + TopLevel: true, + Categories: ["Sleeves"], + Layers: ToLayerMap([ + ...GetModelLayers("YukataSleeveLeft"), + ...GetModelLayers("YukataSleeveRight"), + ]) +}); + +AddModel({ + Name: "YukataShirt", + Folder: "Yukata", + Parent: "Yukata", + TopLevel: true, + Categories: ["Tops"], + RemovePoses: ["EncaseTorsoUpper"], + Layers: ToLayerMap([ + ...GetModelLayers("YukataTop"), + ...GetModelLayers("YukataSleeves"), + ]) +}); + + +AddModel({ + Name: "YukataSkirt", + Folder: "Yukata", + Parent: "Yukata", + TopLevel: true, + Categories: ["Skirts"], + AddPoseConditional: { + EncaseTorsoLower: ["Skirt"] + }, + Layers: ToLayerMap([ + { Name: "Skirt", Layer: "Skirt", Pri: 9, + //swaplayerpose: {Kneel: "SkirtOverLower", KneelClosed: "SkirtOverLower"}, + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["Hogtie"]), + //HideWhenOverridden: true, + MorphPoses: {Hogtie: "Closed", Closed: "", Kneel: "Kneel", KneelClosed: "Kneel"}, + AppendPose: ToMapDupe(["CrotchStrap"]), + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + Invariant: true, + HidePoses: {"SkimpyLower": true}, + }, + { Name: "SkirtOver", Layer: "SkirtOver", Pri: 9, + Poses: ToMap([...KNEELPOSES]), + TieToLayer: "Skirt", + NoOverride: true, + AppendPose: ToMapDupe(["CrotchStrap"]), + InheritColor: "Skirt", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["TorsoLower"], + //Invariant: true, + }, + ]) +}); + +AddModel({ + Name: "Yukata", + Folder: "Yukata", + Parent: "Yukata", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("YukataWaist"), + ...GetModelLayers("YukataShirt"), + ...GetModelLayers("YukataSkirt"), + + ]) +}); + + +AddModel({ + Name: "YukataPattern", + Folder: "Yukata", + Parent: "Yukata", + TopLevel: true, + Categories: ["Uniforms"], + Layers: ToLayerMap([ + ...GetModelLayers("YukataWaistPattern"), + + ]) +}); diff --git a/Data/ModelStylesBody.ts b/Data/ModelStylesBody.ts new file mode 100644 index 000000000..83e235c9a --- /dev/null +++ b/Data/ModelStylesBody.ts @@ -0,0 +1,124 @@ + +/** + * List off all bodies + */ +let KDModelBody: {[_: string]: KinkyDungeonDress} = { + "Default" : [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false}, + ], + "Zombie" : [ + { + Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: {"Torso":{"gamma":1,"saturation":0.35000000000000003,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Head":{"gamma":1,"saturation":0.35000000000000003,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}} + } + ], + + "Demon" : [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":0.08333333333333333,"contrast":3.0833333333333335,"brightness":0.3833333333333333,"red":0.9333333333333333,"green":0.55,"blue":1.8333333333333333,"alpha":1}, + Torso: {"gamma":1,"saturation":0.08333333333333333,"contrast":3.0833333333333335,"brightness":0.3833333333333333,"red":0.9333333333333333,"green":0.55,"blue":1.8333333333333333,"alpha":1}, + }}, + ], + + Nara: [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":0,"contrast":0.72,"brightness":1,"red":1.55,"green":1.1833333333333333,"blue":1.0833333333333335,"alpha":1}, + Torso: {"gamma":1,"saturation":0,"contrast":0.72,"brightness":1,"red":1.55,"green":1.1833333333333333,"blue":1.0833333333333335,"alpha":1}, + Nipples: {"gamma":1,"saturation":0,"contrast":0.72,"brightness":1,"red":1.55,"green":1.1833333333333333,"blue":1.0833333333333335,"alpha":1}, + }}, + ], + + "Pale" : [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: {"Head":{"gamma":1,"saturation":0.5666666666666667,"contrast":1.3666666666666667,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Torso":{"gamma":1,"saturation":0.5666666666666667,"contrast":1.3666666666666667,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}}, + ], + "ElementalLight": [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":1,"contrast":1,"brightness":0.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + Torso: {"gamma":1,"saturation":1,"contrast":1,"brightness":0.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }}, + ], + "ElementalFire": [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":1.1,"contrast":1,"brightness":0.9166666666666666,"red":1.7000000000000002,"green":1,"blue":0.8,"alpha":0.9833333333333333}, + Torso: {"gamma":1,"saturation":1.1,"contrast":1,"brightness":0.9166666666666666,"red":1.7000000000000002,"green":1,"blue":0.8,"alpha":0.9833333333333333}, + }}, + ], + "ElementalCorrupted": [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.5666666666666667,"red":1.2666666666666668,"green":1,"blue":1.6,"alpha":0.9833333333333333}, + Torso: {"gamma":1,"saturation":0.5166666666666666,"contrast":1,"brightness":0.5666666666666667,"red":1.2666666666666668,"green":1,"blue":1.6,"alpha":0.9833333333333333}, + }}, + ], + "ElementalTan": [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":1,"contrast":1,"brightness":0.7333333333333334,"red":1.2,"green":0.9833333333333333,"blue":0.8166666666666667,"alpha":1}, + Torso: {"gamma":1,"saturation":1,"contrast":1,"brightness":0.7333333333333334,"red":1.2,"green":0.9833333333333333,"blue":0.8166666666666667,"alpha":1}, + }}, + ], + "Dryad": [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":1,"contrast":2.1,"brightness":0.7000000000000001,"red":0.8833333333333333,"green":1.2,"blue":0.8500000000000001,"alpha":1}, + Torso: {"gamma":1,"saturation":1,"contrast":2.1,"brightness":0.7000000000000001,"red":0.8833333333333333,"green":1.2,"blue":0.8500000000000001,"alpha":1}, + }}, + ], + + + "ElementalLatex": [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.8666666666666667,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333}, + Torso: {"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":0.8666666666666667,"red":1,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333}, + }}, + ], + + "ElementalPale": [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}, + Torso: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}, + }}, + ], + "ElementalWater": [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1.1372549019607843,"blue":1.0784313725490196,"alpha":1}, + Torso: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1.1372549019607843,"blue":1.0784313725490196,"alpha":1}, + }}, + ], + + "ElementalIce": [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}, + Torso: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.0833333333333335,"alpha":1}, + }}, + ], + + + + "Maid": [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head:{"gamma":0.44999999999999996,"saturation":1.5,"contrast":0.8333333333333333,"brightness":0.8833333333333333,"red":1.2,"green":1.2,"blue":1.1,"alpha":1}, + Torso:{"gamma":0.44999999999999996,"saturation":1.5,"contrast":0.8333333333333333,"brightness":0.8833333333333333,"red":1.2,"green":1.2,"blue":1.1,"alpha":1}, + Nipples: {"gamma":1,"saturation":1.6,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.8}, + }}, + ], + + "Mid": [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1,"saturation":2.4333333333333336,"contrast":1,"brightness":0.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + Torso: {"gamma":1,"saturation":2.4333333333333336,"contrast":1,"brightness":0.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }}, + ], + "Tan" : [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1.2,"saturation":1.0166666666666666,"contrast":1.1,"brightness":1.4333333333333333,"red":0.6166666666666667,"green":0.5166666666666666,"blue":0.5333333333333333,"alpha":1}, + Torso: {"gamma":1.2,"saturation":1.0166666666666666,"contrast":1.1,"brightness":1.4333333333333333,"red":0.6166666666666667,"green":0.5166666666666666,"blue":0.5333333333333333,"alpha":1}, + }}, + ], + "MidTan" : [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: { + Head: {"gamma":1.2,"saturation":1.0666666666666667,"contrast":1.1,"brightness":1.1666666666666667,"red":0.7333333333333334,"green":0.5166666666666666,"blue":0.5333333333333333,"alpha":1}, + Torso: {"gamma":1.2,"saturation":1.0666666666666667,"contrast":1.1,"brightness":1.1666666666666667,"red":0.7333333333333334,"green":0.5166666666666666,"blue":0.5333333333333333,"alpha":1}, + } + }, + ], + "DarkTan" : [ + {Item: "Body", Group: "Body", Color: "#ffffff", Lost: false, Filters: {"Torso":{"gamma":1.2,"saturation":0.7833333333333334,"contrast":1.1,"brightness":0.9666666666666667,"red":0.7333333333333334,"green":0.5166666666666666,"blue":0.5333333333333333,"alpha":1},"Head":{"gamma":1.2,"saturation":0.7833333333333334,"contrast":1.1,"brightness":0.9666666666666667,"red":0.7333333333333334,"green":0.5166666666666666,"blue":0.5333333333333333,"alpha":1}}}, + ], +}; diff --git a/Data/ModelStylesCosplay.ts b/Data/ModelStylesCosplay.ts new file mode 100644 index 000000000..969887b8f --- /dev/null +++ b/Data/ModelStylesCosplay.ts @@ -0,0 +1,107 @@ + + +/** + * List off all ears and tails and stuff + */ +let KDModelCosplay: {[_: string]: KinkyDungeonDress} = { + "Fuuka" : [{"Item":"ElfEars","Group":"ElfEars","Color":"#ffffff","Lost":false}], + Nara: [ + {"Item":"SuccubusTail","Group":"SuccubusTail","Color":"#ffffff","Lost":false,"Filters":{"SuccubusTail":{"gamma":0.7666666666666666,"saturation":0,"contrast":0.7666666666666666,"brightness":4.9,"red":1.3,"green":0.5166666666666666,"blue":1.4833333333333334,"alpha":0.65},"SuccubusTailLight":{"gamma":1.0166666666666666,"saturation":0.016666666666666666,"contrast":1,"brightness":2.166666666666667,"red":0.3666666666666667,"green":0.3833333333333333,"blue":1.4833333333333334,"alpha":0.65}}}, + {"Item":"ElfEarsLong","Group":"ElfEarsLong","Color":"#ffffff","Lost":false,"Filters":{"ElfLongBack":{"gamma":1,"saturation":0,"contrast":0.72,"brightness":1,"red":1.55,"green":1.1833333333333333,"blue":1.0833333333333335,"alpha":1},"ElfLongFront":{"gamma":1,"saturation":0,"contrast":0.72,"brightness":1,"red":1.55,"green":1.1833333333333333,"blue":1.0833333333333335,"alpha":1}}}], + "Elf1": [ + { + Item: "ElfEarsLong", Color: "#ffffff", Lost: false + }, + { + Item: "ElfEarrings", Color: "#ffffff", Lost: false }, + ], + "Glasses": [ + { + Item: "Glasses", Color: "#ffffff", Lost: false, Filters: {"Lens":{"gamma":1,"saturation":0.16666666666666666,"contrast":1.02,"brightness":1,"red":1.0196078431372548,"green":1.0196078431372548,"blue":1.0196078431372548,"alpha":0.4}}, + }, + ], + + "Elf2": [ + { + Item: "ElfEarsLong", Color: "#ffffff", Lost: false + }, + { + Item: "ElfEarrings", Color: "#ffffff", Lost: false, Filters: + {"EarringRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.3,"red":1,"green":1,"blue":1,"alpha":1},"EarringLeft":{"gamma":1,"saturation":1,"contrast":0.65,"brightness":1.7000000000000002,"red":0.55,"green":0.55,"blue":2.033333333333333,"alpha":1.75}} + }, + ], + + MaidKnightLight: [{"Item":"FoxEars","Group":"FoxEars","Color":"#ffffff","Lost":false,"Filters":{"Ears":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.27450980392156865,"green":0.27450980392156865,"blue":0.27450980392156865,"alpha":1}}},{"Item":"WolfTail","Group":"WolfTail","Color":"#ffffff","Lost":false,"Filters":{"Wolf":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.2,"red":1,"green":1,"blue":1,"alpha":1},"Tail":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.2,"red":1,"green":1,"blue":1,"alpha":1}}}], + MaidKnightHeavy: [{"Item":"FoxEars","Group":"FoxEars","Color":"#ffffff","Lost":false,"Filters":{"Ears":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.27450980392156865,"green":0.27450980392156865,"blue":0.27450980392156865,"alpha":1}}},{"Item":"WolfTail","Group":"WolfTail","Color":"#ffffff","Lost":false,"Filters":{"Wolf":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.2,"red":1,"green":1,"blue":1,"alpha":1},"Tail":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.2,"red":1,"green":1,"blue":1,"alpha":1}}}], + + Hilda: [{"Item":"ElfEarsLong","Group":"ElfEarsLong","Color":"#ffffff","Lost":false},{"Item":"SuccubusHorn","Group":"SuccubusHorn","Color":"#ffffff","Lost":false,"Filters":{"SuccubusHornRight":{"gamma":1,"saturation":0,"contrast":2.48,"brightness":1,"red":0.7647058823529411,"green":0.8235294117647058,"blue":0.8235294117647058,"alpha":1},"SuccubusHornLeft":{"gamma":1,"saturation":0,"contrast":2.48,"brightness":1,"red":0.7647058823529411,"green":0.8235294117647058,"blue":0.8235294117647058,"alpha":1},"SuccubusHornLight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2156862745098038,"green":0.11764705882352941,"blue":1.8823529411764706,"alpha":1}}}], + + "Elf3": [ + { + Item: "ElfEarsLong", Color: "#ffffff", Lost: false + }, + ], + "Elf4": [ + { + Item: "ElfEars", Color: "#ffffff", Lost: false + }, + { + Item: "ElfEarrings", Color: "#ffffff", Lost: false }, + ], + "Elf5": [ + { + Item: "ElfEars", Color: "#ffffff", Lost: false + }, + { + Item: "ElfEarrings", Color: "#ffffff", Lost: false, Filters: + {"EarringRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.3,"red":1,"green":1,"blue":1,"alpha":1},"EarringLeft":{"gamma":1,"saturation":1,"contrast":0.65,"brightness":1.7000000000000002,"red":0.55,"green":0.55,"blue":2.033333333333333,"alpha":1.75}} + }, + ], + "Elf6": [ + { + Item: "ElfEars", Color: "#ffffff", Lost: false + }, + ], + ArcticFox: [{"Item":"FoxEars","Group":"FoxEars","Color":"#ffffff","Lost":false,"Filters":{"Fox":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.6274509803921569,"green":1.607843137254902,"blue":3.392156862745098,"alpha":1},"Ears":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.3333333333333333,"green":1.3529411764705883,"blue":1.6666666666666667,"alpha":1}}},{"Item":"FoxTail","Group":"FoxTail","Color":"#ffffff","Lost":false,"Filters":{"Tail":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.3333333333333333,"green":1.3529411764705883,"blue":1.6666666666666667,"alpha":1}}}], + "Wolf1": [ + { + Item: "WolfTail", Group: "WolfTail", Color: "#ffffff", Lost: false + }, + { + Item: "WolfEars", Group: "WolfEars", Color: "#ffffff", Lost: false + }, + ],"Wolf1b": [ + { + Item: "WolfTail", Group: "WolfTail", Color: "#ffffff", Lost: false + }, + { + Item: "WolfEars", Group: "WolfEars", Color: "#ffffff", Lost: false + }, + ], + "Wolf2": [ + { + Item: "WolfTail", Group: "WolfTail", Color: "#ffffff", Lost: false, Filters: + {"Tail":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.8999999999999999,"red":1,"green":1.0833333333333335,"blue":1.2833333333333332,"alpha":1}} + }, + { + Item: "WolfEars2", Group: "WolfEars", Color: "#ffffff", Lost: false, Filters: + {"Ears":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.8999999999999999,"red":1,"green":1.0833333333333335,"blue":1.2833333333333332,"alpha":1}} + }, + ], + "Wolf2b": [ + { + Item: "WolfTail", Group: "WolfTail", Color: "#ffffff", Lost: false, Filters: + {"Tail":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.8999999999999999,"red":1,"green":1.0833333333333335,"blue":1.2833333333333332,"alpha":1}} + }, + { + Item: "WolfEars2", Group: "WolfEars", Color: "#ffffff", Lost: false, Filters: + {"Ears":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.8999999999999999,"red":1,"green":1.0833333333333335,"blue":1.2833333333333332,"alpha":1}} + }, + ], + Kitty: [{"Item":"KittyTail","Group":"KittyTail","Color":"#ffffff","Lost":false,"Filters":{"Kitty":{"gamma":1,"saturation":0.21666666666666667,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Tail":{"gamma":1,"saturation":0.3666666666666667,"contrast":1,"brightness":0.65,"red":0.65,"green":0.8833333333333333,"blue":0.8166666666666667,"alpha":1}}},{"Item":"KittyEars","Group":"KittyEars","Color":"#ffffff","Lost":false,"Filters":{"Ears":{"gamma":1,"saturation":0.3666666666666667,"contrast":1,"brightness":0.65,"red":0.65,"green":0.8833333333333333,"blue":0.8166666666666667,"alpha":1},"InnerEars":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.05,"red":1,"green":1,"blue":1,"alpha":1}}}], + Kitty2: [{"Item":"KittyEars","Group":"KittyEars","Color":"#ffffff","Lost":false,"Filters":{"Ears":{"gamma":1,"saturation":0.3666666666666667,"contrast":1,"brightness":0.65,"red":0.65,"green":0.8833333333333333,"blue":0.8166666666666667,"alpha":1},"InnerEars":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":0.05,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"Kitty2Tail","Group":"Kitty2Tail","Color":"#ffffff","Lost":false,"Filters":{"Tail1":{"gamma":1,"saturation":0.3666666666666667,"contrast":1,"brightness":0.65,"red":0.65,"green":0.8833333333333333,"blue":0.8166666666666667,"alpha":1},"Tail2":{"gamma":1,"saturation":0.3666666666666667,"contrast":1,"brightness":0.65,"red":0.65,"green":0.8833333333333333,"blue":0.8166666666666667,"alpha":1}}}], + DragonPoison: [{"Item":"SuccubusTail","Group":"SuccubusTail","Color":"#ffffff","Lost":false,"Filters":{"SuccubusTail":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.8,"brightness":3.016666666666667,"red":0.5166666666666666,"green":0.7000000000000001,"blue":1,"alpha":1},"SuccubusTailLight":{"gamma":1,"saturation":0,"contrast":1.2,"brightness":1.7166666666666666,"red":0.41666666666666663,"green":1,"blue":0.41666666666666663,"alpha":0.9333333333333333}}}], + DragonCrystal: [{"Item":"SuccubusTail","Group":"SuccubusTail","Color":"#ffffff","Lost":false,"Filters":{"SuccubusTail":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.8,"brightness":2.1,"red":0.5166666666666666,"green":0.65,"blue":1,"alpha":1},"SuccubusTailLight":{"gamma":1,"saturation":0,"contrast":2.5,"brightness":1.4166666666666665,"red":0.3666666666666667,"green":1,"blue":1,"alpha":0.9333333333333333}}}], + DragonIce: [{"Item":"SuccubusTail","Group":"SuccubusTail","Color":"#ffffff","Lost":false,"Filters":{"SuccubusTail":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.8,"brightness":2.8666666666666667,"red":0.5166666666666666,"green":0.7333333333333334,"blue":1,"alpha":1},"SuccubusTailLight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1.7000000000000002,"red":0.6333333333333334,"green":0.7333333333333334,"blue":1.3833333333333333,"alpha":0.65}}},{"Item":"SuccubusHorn","Group":"SuccubusHorn","Color":"#ffffff","Lost":false,"Filters":{"SuccubusHornRight":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.55,"brightness":2.9499999999999997,"red":0.7333333333333334,"green":0.7333333333333334,"blue":1,"alpha":1},"SuccubusHornLeft":{"gamma":1,"saturation":0.016666666666666666,"contrast":0.55,"brightness":2.9499999999999997,"red":0.7333333333333334,"green":0.7333333333333334,"blue":1,"alpha":1},"SuccubusHornLight":{"gamma":1,"saturation":0,"contrast":2.5,"brightness":1.4166666666666665,"red":0.3666666666666667,"green":1,"blue":1,"alpha":0.9333333333333333}}}], + DragonShadow: [{"Item":"SuccubusTail","Group":"SuccubusTail","Color":"#ffffff","Lost":false,"Filters":{"SuccubusTail":{"gamma":0.7666666666666666,"saturation":0,"contrast":0.7666666666666666,"brightness":4.9,"red":1.3,"green":0.5166666666666666,"blue":1.4833333333333334,"alpha":0.65},"SuccubusTailLight":{"gamma":1.0166666666666666,"saturation":0.016666666666666666,"contrast":1,"brightness":2.166666666666667,"red":0.3666666666666667,"green":0.3833333333333333,"blue":1.4833333333333334,"alpha":0.65}}},{"Item":"SuccubusHorn","Group":"SuccubusHorn","Color":"#ffffff","Lost":false,"Filters":{"SuccubusHornRight":{"gamma":1,"saturation":0,"contrast":0.5166666666666666,"brightness":0.7333333333333334,"red":1.5666666666666669,"green":1.1,"blue":0.95,"alpha":1},"SuccubusHornLeft":{"gamma":1,"saturation":0,"contrast":0.5166666666666666,"brightness":0.7333333333333334,"red":1.5666666666666669,"green":1.1,"blue":0.95,"alpha":1}}}], +}; diff --git a/Data/ModelStylesFace.ts b/Data/ModelStylesFace.ts new file mode 100644 index 000000000..2ceae2b11 --- /dev/null +++ b/Data/ModelStylesFace.ts @@ -0,0 +1,122 @@ +/** + * List off all face styles + */ +let KDModelFace: {[_: string]: KinkyDungeonDress} = { + "Default" : [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"HumanEyes","Group":"HumanEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":0.5333333333333333,"saturation":0.016666666666666666,"contrast":1,"brightness":1.1166666666666667,"red":1.6166666666666665,"green":0.8333333333333333,"blue":0.7166666666666667,"alpha":1},"Eyes2":{"gamma":0.5333333333333333,"saturation":0.016666666666666666,"contrast":1,"brightness":1.1166666666666667,"red":1.6166666666666665,"green":0.8333333333333333,"blue":0.7166666666666667,"alpha":1}}},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"DaskBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false,}], + "Elf1" : [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false}, + { + Item: "HumanEyes", Group: "HumanEyes", Color: "#ffffff", Lost: false, Filters: + {"Eyes":{"gamma":0.9833333333333333,"saturation":0.2833333333333333,"contrast":1.0666666666666667,"brightness":0.9833333333333333,"red":1.0833333333333335,"green":1.0833333333333335,"blue":2.0666666666666664,"alpha":0.9833333333333333},"Eyes2":{"gamma":0.9833333333333333,"saturation":0.2833333333333333,"contrast":1.0666666666666667,"brightness":0.9833333333333333,"red":1.0833333333333335,"green":1.0833333333333335,"blue":2.0666666666666664,"alpha":0.9833333333333333}}, + }, + {Item: "KoiBrows", Group: "KoiBrows", Color: "#ffffff", Lost: false}, + {Item: "KoiBlush", Group: "KoiBlush", Color: "#ffffff", Lost: false}, + {Item: "KoiMouth", Group: "KoiMouth", Color: "#ffffff", Lost: false}, + ], + "CrystalFace": [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KoiEyes","Group":"KoiEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.2666666666666668,"brightness":1.5,"red":1.3833333333333333,"green":0.43333333333333335,"blue":1.3666666666666667,"alpha":0.6},"Eyes2":{"gamma":1,"saturation":0,"contrast":1.1666666666666667,"brightness":1.7833333333333334,"red":0.3666666666666667,"green":0.3833333333333333,"blue":1,"alpha":0.6}}}], + YellowOpen: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes4","Group":"KjusEyes4","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3333333333333335,"green":1.5666666666666669,"blue":1,"alpha":1},"Eyes2":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.3333333333333335,"green":1.5666666666666669,"blue":1,"alpha":1}}}], + YellowRound: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes3","Group":"KjusEyes3","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.6166666666666667,"green":2.783333333333333,"blue":1,"alpha":1},"Eyes2":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.6166666666666667,"green":2.783333333333333,"blue":1,"alpha":1}}}], + YellowKjus: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes","Group":"KjusEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":1,"red":3.1333333333333337,"green":2.4,"blue":1,"alpha":1},"Eyes2":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":1,"red":3.1333333333333337,"green":2.4,"blue":1,"alpha":1}}}], + + MaidKnightLight: [{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1.5099999999999998,"brightness":1,"red":1.5686274509803921,"green":0.9019607843137255,"blue":0.47058823529411764,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1.5099999999999998,"brightness":1,"red":1.5686274509803921,"green":0.9019607843137255,"blue":0.47058823529411764,"alpha":1}}},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false}], + MaidKnightHeavy: [{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"KjusEyes","Group":"KjusEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.607843137254902,"green":1.803921568627451,"blue":1.6862745098039216,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.607843137254902,"green":1.803921568627451,"blue":1.6862745098039216,"alpha":1}}},{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false}], + + Myrtrice: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes2","Group":"KjusEyes2","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":0.8500000000000001,"saturation":0.05,"contrast":1,"brightness":0.9833333333333333,"red":4.882352941176471,"green":1,"blue":0.016666666666666666,"alpha":1.0166666666666666},"Eyes2":{"gamma":0.8666666666666667,"saturation":0,"contrast":1,"brightness":1.0166666666666666,"red":4.983333333333333,"green":1.0166666666666666,"blue":0.03333333333333333,"alpha":1}}},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false}], + Nara: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KjusEyes4","Group":"KjusEyes4","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0,"green":0,"blue":0,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0,"green":0,"blue":0,"alpha":1}},"Properties":{"Eyes2Eyes2Surprised":{"ExtraHidePoses":["1"]}}},{"Item":"KjusEyes","Group":"KjusEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":3.1372549019607843,"green":3.2745098039215685,"blue":1.7647058823529411,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":3.1372549019607843,"green":3.2745098039215685,"blue":1.7647058823529411,"alpha":1}}},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusBlush","Group":"KjusBlush","Color":"#ffffff","Lost":false,"Filters":{}},{"Item":"DaiBrows1","Group":"DaiBrows1","Color":"#ffffff","Lost":false,"Filters":{"Brows":{"gamma":1,"saturation":0,"contrast":0.03,"brightness":1,"red":0,"green":0,"blue":0,"alpha":0},"Brows2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0,"green":0,"blue":0,"alpha":1}}},{"Item":"ElfEarrings","Group":"ElfEarrings","Color":"#ffffff","Lost":false,"Filters":{"ElfEarringsFront":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":1.3333333333333333,"blue":2.8000000000000003,"alpha":1},"EarringLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5,"green":0.5,"blue":0.5,"alpha":1},"EarringRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5,"green":0.5,"blue":0.5,"alpha":1}}}], + Melissa: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1568627450980393,"green":0.8431372549019608,"blue":4.1568627450980395,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1568627450980393,"green":0.8431372549019608,"blue":4.1568627450980395,"alpha":1}}}], + Worshipper: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"DaiBrows1","Group":"DaiBrows1","Color":"#ffffff","Lost":false,"Filters":{"Brows":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Brows2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.4666666666666668,"red":1.3666666666666667,"green":0.75,"blue":2.4,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.4666666666666668,"red":1.3666666666666667,"green":0.75,"blue":2.4,"alpha":1}}}], + Viola: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusEyes","Group":"KjusEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1.0666666666666667,"saturation":0,"contrast":1.35,"brightness":1.85,"red":0.7166666666666667,"green":1.8333333333333333,"blue":3.95,"alpha":1},"Eyes2":{"gamma":1.0666666666666667,"saturation":0,"contrast":1.35,"brightness":1.85,"red":0.7166666666666667,"green":1.8333333333333333,"blue":3.95,"alpha":1}}},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"Earrings","Group":"Earrings","Color":"#ffffff","Lost":false}], + Yuri: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false,"Filters":{"Brows":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.7333333333333334,"red":1.7000000000000002,"green":0.8,"blue":1.45,"alpha":0.9833333333333333},"Brows2":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.7333333333333334,"red":1.7000000000000002,"green":0.8,"blue":1.45,"alpha":0.9833333333333333}}},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":2.7450980392156863,"green":1.0980392156862746,"blue":4.862745098039215,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":2.7450980392156863,"green":1.0980392156862746,"blue":4.862745098039215,"alpha":1}}}], + Hilda: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusEyes3","Group":"KjusEyes3","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":2.0833333333333335,"red":1.8166666666666667,"green":1,"blue":1.5,"alpha":0.9833333333333333},"Eyes2":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":2.0833333333333335,"red":1.8166666666666667,"green":1,"blue":1.5,"alpha":0.9833333333333333}}}], + + "WolfgirlBlue" : [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false}, + {Item: "KjusEyes", Group: "KjusEyes", Color: "#ffffff", Lost: false}, + {Item: "KjusBrows", Group: "KoiBrows", Color: "#ffffff", Lost: false}, + {Item: "KjusBlush", Group: "KoiBlush", Color: "#ffffff", Lost: false}, + {Item: "KjusMouth", Group: "KoiMouth", Color: "#ffffff", Lost: false}, + ], + "WolfgirlCyan" : [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false}, + {Item: "KjusEyes", Group: "KjusEyes", Color: "#ffffff", Lost: false, Filters: { + Eyes: {"gamma":1,"saturation":0.9333333333333333,"contrast":1,"brightness":2.2666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + Eyes2: {"gamma":1,"saturation":0.9333333333333333,"contrast":1,"brightness":2.2666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + }}, + {Item: "KjusBrows", Group: "KoiBrows", Color: "#ffffff", Lost: false}, + {Item: "KjusBlush", Group: "KoiBlush", Color: "#ffffff", Lost: false}, + {Item: "KjusMouth", Group: "KoiMouth", Color: "#ffffff", Lost: false}, + ], + "WolfgirlBrown" : [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false}, + {Item: "KjusEyes", Group: "KjusEyes", Color: "#ffffff", Lost: false, Filters: { + Eyes: {"gamma":1,"saturation":0,"contrast":1.6500000000000001,"brightness":1,"red":1.8627450980392157,"green":0.9607843137254902,"blue":0.43137254901960786,"alpha":1}, + Eyes2: {"gamma":1,"saturation":0,"contrast":1.6500000000000001,"brightness":1,"red":1.8627450980392157,"green":0.9607843137254902,"blue":0.43137254901960786,"alpha":1}, + }}, + {Item: "KjusBrows", Group: "KoiBrows", Color: "#ffffff", Lost: false}, + {Item: "KjusBlush", Group: "KoiBlush", Color: "#ffffff", Lost: false}, + {Item: "KjusMouth", Group: "KoiMouth", Color: "#ffffff", Lost: false}, + ], + "WolfgirlRare" : [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false}, + {Item: "KjusEyes", Group: "KjusEyes", Color: "#ffffff", Lost: false, Filters: { + //Eyes: {"gamma":1,"saturation":0,"contrast":1.6500000000000001,"brightness":1,"red":1.8627450980392157,"green":0.9607843137254902,"blue":0.43137254901960786,"alpha":1}, + Eyes2: {"gamma":1,"saturation":0,"contrast":1.6500000000000001,"brightness":1,"red":1.8627450980392157,"green":0.9607843137254902,"blue":0.43137254901960786,"alpha":1}, + }}, + {Item: "KjusBrows", Group: "KoiBrows", Color: "#ffffff", Lost: false}, + {Item: "KjusBlush", Group: "KoiBlush", Color: "#ffffff", Lost: false}, + {Item: "KjusMouth", Group: "KoiMouth", Color: "#ffffff", Lost: false}, + ], + "WolfgirlGrey" : [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false}, + {Item: "KjusEyes", Group: "KjusEyes", Color: "#ffffff", Lost: false, Filters: { + Eyes: {"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":2.2666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + Eyes2: {"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":2.2666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + }}, + {Item: "KjusBrows", Group: "KoiBrows", Color: "#ffffff", Lost: false}, + {Item: "KjusBlush", Group: "KoiBlush", Color: "#ffffff", Lost: false}, + {Item: "KjusMouth", Group: "KoiMouth", Color: "#ffffff", Lost: false}, + ], + "WolfgirlOrange" : [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false}, + {Item: "KjusEyes", Group: "KjusEyes", Color: "#ffffff", Lost: false, Filters: { + Eyes: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":2.4705882352941178,"green":0.9803921568627451,"blue":0.21568627450980393,"alpha":1}, + Eyes2: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":2.4705882352941178,"green":0.9803921568627451,"blue":0.21568627450980393,"alpha":1}, + }}, + {Item: "KjusBrows", Group: "KoiBrows", Color: "#ffffff", Lost: false}, + {Item: "KjusBlush", Group: "KoiBlush", Color: "#ffffff", Lost: false}, + {Item: "KjusMouth", Group: "KoiMouth", Color: "#ffffff", Lost: false}, + ], + + + YellowCute: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":1,"red":2.7333333333333334,"green":1.4166666666666665,"blue":1,"alpha":1},"Eyes2":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":1,"red":2.7333333333333334,"green":1.4166666666666665,"blue":1,"alpha":1}}},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusBlush","Group":"KjusBlush","Color":"#ffffff","Lost":false}], + YellowAngry: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusBlush","Group":"KjusBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes","Group":"KjusEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":1.35,"red":3,"green":1.7333333333333334,"blue":1,"alpha":1},"Eyes2":{"gamma":1,"saturation":0.3,"contrast":1,"brightness":1.35,"red":3,"green":1.7333333333333334,"blue":1,"alpha":1}}}], + + RedScary: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"HumanEyes","Group":"HumanEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.6274509803921569,"green":0.5098039215686274,"blue":0.5686274509803921,"alpha":1.0166666666666666},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.6274509803921569,"green":0.5098039215686274,"blue":0.5686274509803921,"alpha":1.0166666666666666}}},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false}], + + GreenNormal: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"HumanEyes","Group":"HumanEyes","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"ElfEarrings","Group":"ElfEarrings","Color":"#ffffff","Lost":false}], + GreenAngry: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KjusEyes","Group":"KjusEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1.0166666666666666,"saturation":1.0166666666666666,"contrast":1.0166666666666666,"brightness":0.95,"red":0.6666666666666666,"green":1.9666666666666666,"blue":0.7333333333333334,"alpha":1.0166666666666666},"Eyes2":{"gamma":1.0166666666666666,"saturation":1.0166666666666666,"contrast":1.0166666666666666,"brightness":0.95,"red":0.6666666666666666,"green":1.9666666666666666,"blue":0.7333333333333334,"alpha":1.0166666666666666}}},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false}], + GreenCute: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false}], + GreenOpen: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes2","Group":"KjusEyes2","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.35000000000000003,"contrast":1,"brightness":1,"red":0.65,"green":1.0833333333333335,"blue":1.5166666666666666,"alpha":1},"Eyes2":{"gamma":1,"saturation":0.35000000000000003,"contrast":1,"brightness":1,"red":0.65,"green":1.0833333333333335,"blue":1.5166666666666666,"alpha":1}}},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"ElfEarrings","Group":"ElfEarrings","Color":"#ffffff","Lost":false,"Filters":{"EarringLeft":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":1,"red":2.1333333333333333,"green":1,"blue":1,"alpha":1},"EarringRight":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":1,"red":2.1333333333333333,"green":1,"blue":1,"alpha":1}}}], + Hazel: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiEyes","Group":"KoiEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.8627450980392157,"green":1.0980392156862746,"blue":0.8431372549019608,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.8627450980392157,"green":1.0980392156862746,"blue":0.8431372549019608,"alpha":1}}},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false}], + + Cyan: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes2","Group":"KjusEyes2","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.35000000000000003,"contrast":1,"brightness":1,"red":0.65,"green":1.0833333333333335,"blue":1.5166666666666666,"alpha":1},"Eyes2":{"gamma":1,"saturation":0.35000000000000003,"contrast":1,"brightness":1,"red":0.65,"green":1.0833333333333335,"blue":1.5166666666666666,"alpha":1}}},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"ElfEarrings","Group":"ElfEarrings","Color":"#ffffff","Lost":false,"Filters":{"EarringLeft":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":1,"red":2.1333333333333333,"green":1,"blue":1,"alpha":1},"EarringRight":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":1,"red":2.1333333333333333,"green":1,"blue":1,"alpha":1}}}], + CyanNormal: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"HumanEyes","Group":"HumanEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":0.9833333333333333,"saturation":0.2833333333333333,"contrast":1.0666666666666667,"brightness":1.1,"red":0.9166666666666666,"green":1.6666666666666665,"blue":2.0666666666666664,"alpha":0.9833333333333333},"Eyes2":{"gamma":0.9833333333333333,"saturation":0.2833333333333333,"contrast":1.0666666666666667,"brightness":1.1,"red":0.9166666666666666,"green":1.6666666666666665,"blue":2.0666666666666664,"alpha":0.9833333333333333}}},{"Item":"ElfEarrings","Group":"ElfEarrings","Color":"#ffffff","Lost":false,"Filters":{"EarringRight":{"gamma":1,"saturation":1,"contrast":0.65,"brightness":1.7000000000000002,"red":1.2666666666666668,"green":3.4499999999999997,"blue":2.2333333333333334,"alpha":1.75},"EarringLeft":{"gamma":1,"saturation":1,"contrast":0.65,"brightness":1.7000000000000002,"red":1.2666666666666668,"green":3.4499999999999997,"blue":2.2333333333333334,"alpha":1.75}}}], + CyanAngry: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"KjusEyes","Group":"KjusEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.2833333333333333,"contrast":1,"brightness":1.3833333333333333,"red":1,"green":1.75,"blue":1.7000000000000002,"alpha":1},"Eyes2":{"gamma":1,"saturation":0.2833333333333333,"contrast":1,"brightness":1.3833333333333333,"red":1,"green":1.75,"blue":1.7000000000000002,"alpha":1}}}], + CyanCute: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false,"Filters":{}},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6078431372549019,"green":1.0980392156862746,"blue":2.196078431372549,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6078431372549019,"green":1.0980392156862746,"blue":2.196078431372549,"alpha":1}}}], + CyanCute2: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.6333333333333334,"green":1,"blue":1.5166666666666666,"alpha":1},"Eyes2":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.6333333333333334,"green":1,"blue":1.5166666666666666,"alpha":1}}},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"ElfEarrings","Group":"ElfEarrings","Color":"#ffffff","Lost":false,"Filters":{"EarringLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":2.45,"red":0.6333333333333334,"green":1,"blue":1.5166666666666666,"alpha":1},"EarringRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":2.45,"red":0.6333333333333334,"green":1,"blue":1.5166666666666666,"alpha":1}}}], + TealCute: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes3","Group":"KjusEyes3","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1.5166666666666666,"red":0.8,"green":1.5666666666666669,"blue":1.4833333333333334,"alpha":0.9833333333333333},"Eyes2":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1.5166666666666666,"red":0.8,"green":1.5666666666666669,"blue":1.4833333333333334,"alpha":0.9833333333333333}}},{"Item":"ElfEarrings","Group":"ElfEarrings","Color":"#ffffff","Lost":false,"Filters":{"EarringLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1.8666666666666667,"red":1.3166666666666664,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333},"EarringRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1.8666666666666667,"red":1.3166666666666664,"green":1,"blue":1.4833333333333334,"alpha":0.9833333333333333}}}], + BlueCute: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes2":{"gamma":1,"saturation":0.35000000000000003,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7833333333333334,"alpha":1},"Eyes":{"gamma":1,"saturation":0.35000000000000003,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7833333333333334,"alpha":1}}},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"ElfEarrings","Group":"ElfEarrings","Color":"#ffffff","Lost":false,"Filters":{"EarringLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":4.216666666666667,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65},"EarringRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":4.216666666666667,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}}], + PurpleCute: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"KjusEyes3","Group":"KjusEyes3","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.16666666666666666,"contrast":1.0166666666666666,"brightness":1.0833333333333335,"red":1.5166666666666666,"green":0.5666666666666667,"blue":1.6,"alpha":1},"Eyes2":{"gamma":1,"saturation":0.16666666666666666,"contrast":1.0166666666666666,"brightness":1.0833333333333335,"red":1.5166666666666666,"green":0.5666666666666667,"blue":1.6,"alpha":1}}},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false}], + PurpleAngry: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes","Group":"KjusEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":0.44999999999999996,"blue":1.7333333333333334,"alpha":1},"Eyes2":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":0.44999999999999996,"blue":1.7333333333333334,"alpha":1}}}], + MagentaCute: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.8,"red":1.3137254901960784,"green":0.6862745098039216,"blue":1.2745098039215685,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.8,"red":1.3137254901960784,"green":0.6862745098039216,"blue":1.2745098039215685,"alpha":1}}},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false}], + PinkCute: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusEyes3","Group":"KjusEyes3","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":2.0833333333333335,"red":1.8166666666666667,"green":1,"blue":1.5,"alpha":0.9833333333333333},"Eyes2":{"gamma":1,"saturation":0.15,"contrast":1,"brightness":2.0833333333333335,"red":1.8166666666666667,"green":1,"blue":1.5,"alpha":0.9833333333333333}}}], + PinkAngry: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes","Group":"KjusEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1.1333333333333333,"saturation":0.2833333333333333,"contrast":1,"brightness":1.5166666666666666,"red":1.2166666666666668,"green":0.6,"blue":1.4333333333333333,"alpha":3.1333333333333337},"Eyes2":{"gamma":1.1333333333333333,"saturation":0.2833333333333333,"contrast":1,"brightness":1.5166666666666666,"red":1.2166666666666668,"green":0.6,"blue":1.4333333333333333,"alpha":3.1333333333333337}}}], + LightBlueCute: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes2":{"gamma":1,"saturation":0.35000000000000003,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7833333333333334,"alpha":1},"Eyes":{"gamma":1,"saturation":0.35000000000000003,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.7833333333333334,"alpha":1}}},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"ElfEarrings","Group":"ElfEarrings","Color":"#ffffff","Lost":false,"Filters":{"EarringLeft":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":4.216666666666667,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65},"EarringRight":{"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":4.216666666666667,"red":0.6333333333333334,"green":0.9166666666666666,"blue":1.3833333333333333,"alpha":0.65}}}], + + RedOpen: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"KjusEyes4","Group":"KjusEyes4","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.3333333333333333,"green":0.13725490196078433,"blue":0.29411764705882354,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.3333333333333333,"green":0.13725490196078433,"blue":0.29411764705882354,"alpha":1}}}], + RedEyes: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"DaskBrows","Group":"DaskBrows","Color":"#ffffff","Lost":false},{"Item":"KjusBlush","Group":"KjusBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"ElfEarrings","Group":"ElfEarrings","Color":"#ffffff","Lost":false,"Filters":{"EarringLeft":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":2.683333333333333,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.44999999999999996},"EarringRight":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1,"brightness":2.683333333333333,"red":1.2833333333333332,"green":0.8,"blue":1.4833333333333334,"alpha":0.44999999999999996}}},{"Item":"KjusEyes3","Group":"KjusEyes3","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0.16666666666666666,"contrast":1.0166666666666666,"brightness":1.0833333333333335,"red":1.5166666666666666,"green":0.5666666666666667,"blue":0.7666666666666666,"alpha":1},"Eyes2":{"gamma":1,"saturation":0.16666666666666666,"contrast":1.0166666666666666,"brightness":1.0833333333333335,"red":1.5166666666666666,"green":0.5666666666666667,"blue":0.7666666666666666,"alpha":1}}}], + + Brown1: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"ElfEarrings","Group":"ElfEarrings","Color":"#ffffff","Lost":false,"Filters":{"EarringLeft":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":2.466666666666667,"red":1,"green":2.25,"blue":1,"alpha":1},"EarringRight":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":2.466666666666667,"red":1,"green":2.25,"blue":1,"alpha":1}}},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusEyes2","Group":"KjusEyes2","Color":"#ffffff","Lost":false,"Filters":{}}], + Brown2: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"KjusEyes","Group":"KjusEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.8431372549019607,"green":1.0784313725490196,"blue":0.6470588235294118,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.8431372549019607,"green":1.0784313725490196,"blue":0.6470588235294118,"alpha":1}}},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false}], + Brown3: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"Earrings","Group":"Earrings","Color":"#ffffff","Lost":false,"Filters":{"Earrings":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.8431372549019608,"green":1.7254901960784315,"blue":0.7058823529411765,"alpha":1},"EarringLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6078431372549019,"green":1.8235294117647058,"blue":0.7058823529411765,"alpha":1},"EarringRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6078431372549019,"green":1.8235294117647058,"blue":0.7058823529411765,"alpha":1}}},{"Item":"DaskEyes","Group":"DaskEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":0.7058823529411765,"blue":0.5490196078431373,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":0.7058823529411765,"blue":0.5490196078431373,"alpha":1}}},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false}], + Brown4: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes4","Group":"KjusEyes4","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.6274509803921569,"green":0.803921568627451,"blue":0.3137254901960784,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.6274509803921569,"green":0.803921568627451,"blue":0.3137254901960784,"alpha":1}}},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false}], + + Fuuka: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBrows","Group":"KoiBrows","Color":"#ffffff","Lost":false},{"Item":"KoiMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes4","Group":"KjusEyes4","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.03921568627451,"green":0.39215686274509803,"blue":1.0196078431372548,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.03921568627451,"green":0.39215686274509803,"blue":1.0196078431372548,"alpha":1}}}], + + Amber3: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KoiBlush","Group":"KoiBlush","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusEyes","Group":"KjusEyes","Color":"#ffffff","Lost":false,"Filters":{"Eyes":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":3.196078431372549,"green":1.7254901960784315,"blue":0.3333333333333333,"alpha":1},"Eyes2":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":3.196078431372549,"green":1.7254901960784315,"blue":0.3333333333333333,"alpha":1}}},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"Earrings","Group":"Earrings","Color":"#ffffff","Lost":false}], + Amber1: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"KjusBlush","Group":"KjusBlush","Color":"#ffffff","Lost":false},{"Item":"KjusEyes2","Group":"KjusEyes2","Color":"#ffffff","Lost":false}], + Amber2: [{"Item":"Fear","Group":"Fear","Color":"#ffffff","Lost":false},{"Item":"KjusEyes2","Group":"KjusEyes2","Color":"#ffffff","Lost":false},{"Item":"KjusMouth","Group":"Mouth","Color":"#ffffff","Lost":false},{"Item":"KjusBrows","Group":"KjusBrows","Color":"#ffffff","Lost":false},{"Item":"KjusBlush","Group":"KjusBlush","Color":"#ffffff","Lost":false}], +}; \ No newline at end of file diff --git a/Data/ModelStylesHair.ts b/Data/ModelStylesHair.ts new file mode 100644 index 000000000..3f8f93dd2 --- /dev/null +++ b/Data/ModelStylesHair.ts @@ -0,0 +1,145 @@ + +/** + * List off all hair styles + */ +let KDModelHair: {[_: string]: KinkyDungeonDress} = { + "Default" : [ + {Item: "Braid", Group: "Braid", Color: "#ffffff", Lost: false}, + ], + "Blue_WhiteRibbon": [{"Item":"Fluffy","Group":"Fluffy","Color":"#ffffff","Lost":false,"Filters":{"Fuzzy":{"gamma":1.0166666666666666,"saturation":1.0166666666666666,"contrast":1.0166666666666666,"brightness":0.48333333333333334,"red":0.3333333333333333,"green":0.2833333333333333,"blue":1.85,"alpha":1.0166666666666666}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1.0166666666666666,"saturation":1.0166666666666666,"contrast":1.0166666666666666,"brightness":0.48333333333333334,"red":0.3333333333333333,"green":0.2833333333333333,"blue":1.85,"alpha":1.0166666666666666}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1.0166666666666666,"saturation":1.0166666666666666,"contrast":1.0166666666666666,"brightness":0.48333333333333334,"red":0.3333333333333333,"green":0.2833333333333333,"blue":1.85,"alpha":1.0166666666666666}}},{"Item":"HairBow","Group":"HairBow","Color":"#ffffff","Lost":false,"Filters":{"Bow":{"gamma":1,"saturation":0,"contrast":0.85,"brightness":1,"red":2.9607843137254903,"green":3.215686274509804,"blue":4.9411764705882355,"alpha":1}}}], + "Elf1" : [ + { + Item: "StraightBangs", Color: "#ffffff", Lost: false, Filters: + {"StraightBangs":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.35,"green":1.588235294117647,"blue":0.7843137254901961,"alpha":1}} + }, + { + Item: "MessyBack", Color: "#ffffff", Lost: false, Filters: + {"Messy":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.35,"green":1.588235294117647,"blue":0.7843137254901961,"alpha":1}} + }, + ], + + MaidKnightLight: [{"Item":"Ponytail","Group":"Ponytail","Color":"#ffffff","Lost":false,"Filters":{"Ponytail":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.27450980392156865,"green":0.27450980392156865,"blue":0.27450980392156865,"alpha":1}}},{"Item":"StraightBangs","Group":"StraightBangs","Color":"#ffffff","Lost":false,"Filters":{"StraightBangs":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.27450980392156865,"green":0.27450980392156865,"blue":0.27450980392156865,"alpha":1}}},{"Item":"MaidHairband","Group":"MaidHairband","Color":"#ffffff","Lost":false},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.27450980392156865,"green":0.27450980392156865,"blue":0.27450980392156865,"alpha":1}}}], + MaidKnightHeavy: [{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":1.0499999999999998,"brightness":1,"red":1.0980392156862746,"green":1.0784313725490196,"blue":1.196078431372549,"alpha":1}}},{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0,"contrast":1.0499999999999998,"brightness":1,"red":1.0980392156862746,"green":1.0784313725490196,"blue":1.196078431372549,"alpha":1}}},{"Item":"HeavyMaidKnightHairband","Group":"HeavyMaidKnightHairband","Color":"#ffffff","Lost":false},{"Item":"Fluffy","Group":"Fluffy","Color":"#ffffff","Lost":false,"Filters":{"Fuzzy":{"gamma":1,"saturation":0,"contrast":1.0499999999999998,"brightness":1,"red":1.0980392156862746,"green":1.0784313725490196,"blue":1.196078431372549,"alpha":1}}}], + + + PinkTwintail: [{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":1.9019607843137254,"green":0.43137254901960786,"blue":1.8627450980392157,"alpha":1}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":2.019607843137255,"green":0.4117647058823529,"blue":3.0784313725490198,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.5294117647058822,"green":0.23529411764705882,"blue":1.5294117647058822,"alpha":1}}}], + + PurpleNecro: [{"Item":"Hairband","Group":"Hairband","Color":"#ffffff","Lost":false},{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.7333333333333334,"red":1.7000000000000002,"green":0.8,"blue":1.45,"alpha":0.9833333333333333}}},{"Item":"BackStraight","Group":"BackStraight","Color":"#ffffff","Lost":false,"Filters":{"BackStraight":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.7333333333333334,"red":1.7000000000000002,"green":0.8,"blue":1.45,"alpha":0.9833333333333333}}}], + PurpleLong: [{"Item":"BackStraight","Group":"BackStraight","Color":"#ffffff","Lost":false,"Filters":{"BackStraight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6862745098039216,"green":0.11764705882352941,"blue":1.5098039215686274,"alpha":1}}},{"Item":"StraightBangs","Group":"StraightBangs","Color":"#ffffff","Lost":false,"Filters":{"StraightBangs":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6862745098039216,"green":0.11764705882352941,"blue":1.5098039215686274,"alpha":1}}}], + + Myrtrice: [{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":0.6333333333333334,"saturation":0,"contrast":1.1333333333333333,"brightness":0.5166666666666666,"red":2.466666666666667,"green":0.43333333333333335,"blue":0.44999999999999996,"alpha":1}}},{"Item":"Hairband","Group":"Hairband","Color":"#ffffff","Lost":false},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":0.6333333333333334,"saturation":0.016666666666666666,"contrast":1.1666666666666667,"brightness":0.6,"red":2.5,"green":0.5166666666666666,"blue":0.44999999999999996,"alpha":1}}},{"Item":"StraightBangs","Group":"StraightBangs","Color":"#ffffff","Lost":false,"Filters":{"StraightBangs":{"gamma":0.6166666666666667,"saturation":0.016666666666666666,"contrast":1.1333333333333333,"brightness":0.6666666666666666,"red":2.5333333333333337,"green":0.48333333333333334,"blue":0.44999999999999996,"alpha":1}}}], + Melissa: [{"Item":"StraightBangs","Group":"StraightBangs","Color":"#ffffff","Lost":false,"Filters":{"StraightBangs":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":3.016666666666667,"green":1.6666666666666665,"blue":0.75,"alpha":1}}},{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":3.016666666666667,"green":1.6666666666666665,"blue":0.75,"alpha":1}}},{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":3.016666666666667,"green":1.6666666666666665,"blue":0.75,"alpha":1}}},{"Item":"Hairband","Group":"Hairband","Color":"#ffffff","Lost":false,"Filters":{"Hairband":{"gamma":1,"saturation":0,"contrast":0.77,"brightness":1,"red":2.3333333333333335,"green":1.8627450980392157,"blue":4.8431372549019605,"alpha":1}}}], + Viola: [{"Item":"StraightBangs","Group":"StraightBangs","Color":"#ffffff","Lost":false,"Filters":{"StraightBangs":{"gamma":1.0666666666666667,"saturation":0,"contrast":1.35,"brightness":1.85,"red":0.2,"green":0.7333333333333334,"blue":2.5,"alpha":1}}},{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1.0833333333333335,"saturation":0.06666666666666667,"contrast":1.35,"brightness":1.85,"red":0.2,"green":0.7333333333333334,"blue":2.5,"alpha":1}}}], + // @ts-ignore + Nara: [{"Item":"Hair4_TailRight","Group":"Hair4_TailRight","Color":"#ffffff","Lost":false,"Filters":{"Hair4_Right":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7254901960784315,"green":1.803921568627451,"blue":1.2941176470588236,"alpha":1},"Tail":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":1.3333333333333333,"blue":2.1372549019607843,"alpha":1},"Highlight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":1.3333333333333333,"blue":2.1372549019607843,"alpha":1}}},{"Item":"Ahoge","Group":"Ahoge","Color":"#ffffff","Lost":false,"Filters":{"Ahoge":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.6470588235294117,"green":1.3333333333333333,"blue":2.1372549019607843,"alpha":1}},"Properties":{"Ahoge":{"YPivot":"0","XPivot":"0","XScale":"0","YScale":"0","Rotation":"0"}}},{"Item":"AuraBang_Left","Group":"AuraBang_Left","Color":"#ffffff","Lost":false,"Filters":{"Bang":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.4509803921568627,"green":1.1764705882352942,"blue":1.8627450980392157,"alpha":1},"Tail":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.4313725490196079,"green":1.1568627450980393,"blue":1.8431372549019607,"alpha":1},"HairAura_Left":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":0.803921568627451,"blue":1.2941176470588236,"alpha":1}},"Properties":{"Bang":{"XOffset":3,"XPivot":"-","Rotation":2,"YOffset":"0"},"Tail":{"XOffset":"0","Rotation":2}}},{"Item":"Hair4","Group":"Hair4","Color":"#ffffff","Lost":false,"Filters":{"Front":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":1.3333333333333333,"blue":2.1372549019607843,"alpha":1},"Hair":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.7000000000000002,"green":1.3333333333333333,"blue":2.1372549019607843,"alpha":1}}}], + + "Wolfgirl1" : [ + { + Item: "Curly", Group: "Curly", Color: "#ffffff", Lost: false, + Filters: + {"Curly":{"gamma":1,"saturation":0,"contrast":1.18,"brightness":1,"red":1.4509803921568627,"green":1.5490196078431373,"blue":1.4509803921568627,"alpha":1}}, + }, + { + Item: "CurlyBack", Group: "CurlyBack", Color: "#ffffff", Lost: false, + Filters: + {"BackShortCurly":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.4313725490196079,"green":1.588235294117647,"blue":1.6274509803921569,"alpha":1},"BackShortCurlyUnderlight":{"gamma":1,"saturation":0,"contrast":1.6500000000000001,"brightness":1,"red":0.9411764705882353,"green":1.3333333333333333,"blue":2.3529411764705883,"alpha":1}} + }, + ], + "Wolfgirl2" : [ + { + Item: "Fluffy", Group: "Fluffy", Color: "#ffffff", Lost: false, + }, + { + Item: "FluffyPonytail", Group: "FluffyPonytail", Color: "#ffffff", Lost: false, + }, + ], + "Wolfgirl3" : [ + { + Item: "BraidCustom", Group: "BraidCustom", Color: "#ffffff", Lost: false, Filters: + {"BraidCustom":{"gamma":1,"saturation":0,"contrast":1.1333333333333333,"brightness":0.8833333333333333,"red":1.4166666666666665,"green":1.5,"blue":1.8833333333333333,"alpha":1}}, + }, + { + Item: "FluffyPonytail", Group: "FluffyPonytail", Color: "#ffffff", Lost: false, Filters: + {"Ponytail2":{"gamma":1,"saturation":0,"contrast":1.1333333333333333,"brightness":0.6166666666666667,"red":1.4166666666666665,"green":1.5,"blue":1.9833333333333334,"alpha":1}}, + }, + ], + + KittyShort: [{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessyUnderlight":{"gamma":1,"saturation":0.3666666666666667,"contrast":1,"brightness":0.65,"red":0.65,"green":0.8833333333333333,"blue":0.8166666666666667,"alpha":1},"BackShortMessy":{"gamma":1,"saturation":0.3666666666666667,"contrast":1,"brightness":0.65,"red":0.65,"green":0.8833333333333333,"blue":0.8166666666666667,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0.3666666666666667,"contrast":1,"brightness":0.65,"red":0.65,"green":0.8833333333333333,"blue":0.8166666666666667,"alpha":1}}}], + KittyLong: [{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0.3666666666666667,"contrast":1,"brightness":0.65,"red":0.65,"green":0.8833333333333333,"blue":0.8166666666666667,"alpha":1}}},{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0.3666666666666667,"contrast":1,"brightness":0.65,"red":0.65,"green":0.8833333333333333,"blue":0.8166666666666667,"alpha":1}}}], + + Ponytail: [{"Item":"Ponytail","Group":"Ponytail","Color":"#ffffff","Lost":false,"Filters":{"Ponytail":{"gamma":1,"saturation":0.6,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0.6,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}}], + + ElfShort: [{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0.2,"contrast":2.25,"brightness":0.5666666666666667,"red":1,"green":1.6333333333333333,"blue":1,"alpha":1}}},{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0.2,"contrast":2.25,"brightness":0.5666666666666667,"red":1,"green":1.6333333333333333,"blue":1,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666}}}], + ElfLong: [{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.3333333333333333,"blue":0.1568627450980392,"alpha":1}}},{"Item":"Fluffy","Group":"Fluffy","Color":"#ffffff","Lost":false,"Filters":{"Fuzzy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.3333333333333333,"blue":0.1568627450980392,"alpha":1}}},{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.13725490196078433,"green":0.3333333333333333,"blue":0.1568627450980392,"alpha":1}}}], + + WhiteTwintails: [{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":0.5833333333333334,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.5833333333333334,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0.5833333333333334,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0.5833333333333334,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BackStraight","Group":"BackStraight","Color":"#ffffff","Lost":false,"Filters":{"BackStraight":{"gamma":1,"saturation":0.5833333333333334,"contrast":1,"brightness":1.6,"red":1,"green":1,"blue":1,"alpha":1}}}], + WhiteLongHair: [{"Item":"Hairband","Group":"Hairband","Color":"#ffffff","Lost":false,"Filters":{"Hairband":{"gamma":1,"saturation":1,"contrast":1,"brightness":3.25,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BackStraight","Group":"BackStraight","Color":"#ffffff","Lost":false,"Filters":{"BackStraight":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":1.3833333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"AuraHair","Group":"AuraHair","Color":"#ffffff","Lost":false,"Filters":{"HairAura_Front":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Front":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":1.3833333333333333,"red":1,"green":1,"blue":1,"alpha":1},"Sides":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.016666666666666666}},"Properties":{"Front":{"LayerBonus":6000}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":1.3,"red":1,"green":1,"blue":1,"alpha":1}},"Properties":{"BraidCustom":{"YOffset":12}}}], + + LavenderPonytail: [{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0.5166666666666666,"contrast":2,"brightness":1.1,"red":0.8166666666666667,"green":0.8166666666666667,"blue":0.7333333333333334,"alpha":1.2333333333333334}}},{"Item":"Ponytail","Group":"Ponytail","Color":"#ffffff","Lost":false,"Filters":{"Ponytail":{"gamma":1,"saturation":0.5166666666666666,"contrast":2,"brightness":1.1,"red":0.8166666666666667,"green":0.8166666666666667,"blue":0.7333333333333334,"alpha":1.2333333333333334}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0.5166666666666666,"contrast":2,"brightness":1.1,"red":0.8166666666666667,"green":0.8166666666666667,"blue":0.7333333333333334,"alpha":1.2333333333333334}}}], + LavenderTwintails: [{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6470588235294118,"green":0.6470588235294118,"blue":1.0588235294117647,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6470588235294118,"green":0.6470588235294118,"blue":1.0588235294117647,"alpha":1}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":0.6470588235294118,"blue":1.1372549019607843,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.5686274509803921,"green":0.6470588235294118,"blue":1.1372549019607843,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6470588235294118,"green":0.6470588235294118,"blue":1.0588235294117647,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6470588235294118,"green":0.6470588235294118,"blue":1.0588235294117647,"alpha":1}}}], + + GreenMessy: [{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0,"contrast":1.02,"brightness":1,"red":0.23529411764705882,"green":0.6666666666666666,"blue":0.5098039215686274,"alpha":1.0166666666666666}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0,"contrast":1.02,"brightness":1,"red":0.23529411764705882,"green":0.6666666666666666,"blue":0.5098039215686274,"alpha":1.0166666666666666}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0,"contrast":1.02,"brightness":1,"red":0.23529411764705882,"green":0.6666666666666666,"blue":0.5098039215686274,"alpha":1.0166666666666666}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0,"contrast":1.02,"brightness":1,"red":0.23529411764705882,"green":0.6666666666666666,"blue":0.5098039215686274,"alpha":1.0166666666666666}}}], + GreenPonytail: [{"Item":"FluffyPonytail","Group":"FluffyPonytail","Color":"#ffffff","Lost":false,"Filters":{"Ponytail2":{"gamma":1,"saturation":0.3833333333333333,"contrast":1,"brightness":0.5666666666666667,"red":1,"green":1.6666666666666665,"blue":1,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0.3833333333333333,"contrast":1,"brightness":0.5666666666666667,"red":1,"green":1.6666666666666665,"blue":1,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.3833333333333333,"contrast":1,"brightness":0.5666666666666667,"red":1,"green":1.6666666666666665,"blue":1,"alpha":1}}}], + GreenTwintail: [{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0,"contrast":1.9666666666666666,"brightness":1,"red":0.6666666666666666,"green":1.7647058823529411,"blue":0.9411764705882353,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":0,"contrast":1.9666666666666666,"brightness":1,"red":0.6666666666666666,"green":1.7647058823529411,"blue":0.9411764705882353,"alpha":1}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0,"contrast":1.9666666666666666,"brightness":1,"red":0.6666666666666666,"green":1.7647058823529411,"blue":0.9411764705882353,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0,"contrast":1.9666666666666666,"brightness":1,"red":0.6666666666666666,"green":1.7647058823529411,"blue":0.9411764705882353,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":1.9666666666666666,"brightness":1,"red":0.6666666666666666,"green":1.7647058823529411,"blue":0.9411764705882353,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":1.9666666666666666,"brightness":1,"red":0.6666666666666666,"green":1.7647058823529411,"blue":0.9411764705882353,"alpha":1}}}], + GreenShiny: [{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":1.7000000000000002,"brightness":1.1666666666666667,"red":0.43333333333333335,"green":1,"blue":0.43333333333333335,"alpha":1}}},{"Item":"Ahoge","Group":"Ahoge","Color":"#ffffff","Lost":false,"Filters":{"Ahoge":{"gamma":1,"saturation":0,"contrast":1.7000000000000002,"brightness":1.1666666666666667,"red":0.43333333333333335,"green":1,"blue":0.43333333333333335,"alpha":1}}},{"Item":"BraidCustomBackNoBraid","Group":"BraidCustomBackNoBraid","Color":"#ffffff","Lost":false,"Filters":{"BraidCustomBack":{"gamma":1,"saturation":0,"contrast":1.7000000000000002,"brightness":1.1666666666666667,"red":0.43333333333333335,"green":1,"blue":0.43333333333333335,"alpha":1}}},{"Item":"Fluffy","Group":"Fluffy","Color":"#ffffff","Lost":false,"Filters":{"Fuzzy":{"gamma":1,"saturation":0,"contrast":1.7000000000000002,"brightness":1.1666666666666667,"red":0.43333333333333335,"green":1,"blue":0.43333333333333335,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":1.7000000000000002,"brightness":1.1666666666666667,"red":0.43333333333333335,"green":1,"blue":0.43333333333333335,"alpha":1}}}], + CrystalHair: [{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0,"contrast":2,"brightness":1.35,"red":0.65,"green":1,"blue":1,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4333333333333333,"brightness":1.7333333333333334,"red":1,"green":0.5666666666666667,"blue":0.7333333333333334,"alpha":1}}},{"Item":"Ahoge","Group":"Ahoge","Color":"#ffffff","Lost":false,"Filters":{"Ahoge":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.1500000000000001,"brightness":1.3666666666666667,"red":1,"green":0.5666666666666667,"blue":0.7333333333333334,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.016666666666666666,"contrast":1.4333333333333333,"brightness":1.7333333333333334,"red":1,"green":0.5666666666666667,"blue":0.7333333333333334,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":2,"brightness":1.35,"red":0.65,"green":1,"blue":1,"alpha":1}}}], + + BlueTwintail: [{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0,"contrast":1.85,"brightness":1,"red":0.39215686274509803,"green":0.5098039215686274,"blue":1.0196078431372548,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0,"contrast":1.85,"brightness":1,"red":0.39215686274509803,"green":0.5098039215686274,"blue":1.0196078431372548,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0,"contrast":1.85,"brightness":1,"red":0.39215686274509803,"green":0.5098039215686274,"blue":1.0196078431372548,"alpha":1}}}], + BlueBraid: [{"Item":"Ahoge","Group":"Ahoge","Color":"#ffffff","Lost":false,"Filters":{"Ahoge":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.21568627450980393,"green":1.1568627450980393,"blue":1.1372549019607843,"alpha":1}}},{"Item":"BraidCustomBack","Group":"BraidCustomBack","Color":"#ffffff","Lost":false,"Filters":{"BraidCustomBraid":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.21568627450980393,"green":1.1568627450980393,"blue":1.1372549019607843,"alpha":1},"BraidCustomBack":{"gamma":1,"saturation":0,"contrast":1.02,"brightness":1,"red":0.21568627450980393,"green":1.1568627450980393,"blue":1.1372549019607843,"alpha":1}}},{"Item":"Hairband","Group":"Hairband","Color":"#ffffff","Lost":false,"Filters":{"Hairband":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":4.294117647058823,"green":4.215686274509804,"blue":4.352941176470588,"alpha":1}}},{"Item":"Fluffy","Group":"Fluffy","Color":"#ffffff","Lost":false,"Filters":{"Fuzzy":{"gamma":1,"saturation":0,"contrast":0.81,"brightness":1,"red":0.13725490196078433,"green":0.9019607843137255,"blue":0.9019607843137255,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":0.81,"brightness":1,"red":0.13725490196078433,"green":0.9019607843137255,"blue":0.9019607843137255,"alpha":1}}}], + BlueBangs: [{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0,"contrast":1.7833333333333334,"brightness":1.0833333333333335,"red":0.35294117647058826,"green":1.2666666666666668,"blue":1.6470588235294117,"alpha":1}}},{"Item":"StraightBangs","Group":"StraightBangs","Color":"#ffffff","Lost":false,"Filters":{"StraightBangs":{"gamma":1,"saturation":0,"contrast":1.7833333333333334,"brightness":1,"red":0.35294117647058826,"green":0.8823529411764706,"blue":1.6470588235294117,"alpha":1}}}], + BlueMessy: [{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.43333333333333335,"red":1.35,"green":1.588235294117647,"blue":2.15,"alpha":1}}},{"Item":"StraightBangs","Group":"StraightBangs","Color":"#ffffff","Lost":false,"Filters":{"StraightBangs":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.43333333333333335,"red":1.35,"green":1.588235294117647,"blue":2.15,"alpha":1}}}], + Blue1: [{"Item":"ShortCurlyBack","Group":"ShortCurlyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortCurly":{"gamma":1,"saturation":0,"contrast":1.45,"brightness":1.0833333333333335,"red":0.48333333333333334,"green":0.9166666666666666,"blue":1.1372549019607843,"alpha":1},"BackShortCurlyUnderlight":{"gamma":1,"saturation":0,"contrast":1.45,"brightness":1.0833333333333335,"red":0.48333333333333334,"green":0.9166666666666666,"blue":1.1372549019607843,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0,"contrast":1.45,"brightness":1.0833333333333335,"red":0.48333333333333334,"green":0.9166666666666666,"blue":1.1372549019607843,"alpha":1}}}], + BlueLong1: [{"Item":"ShortCurlyBack","Group":"ShortCurlyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortCurly":{"gamma":1,"saturation":0,"contrast":1.45,"brightness":1.0833333333333335,"red":0.48333333333333334,"green":0.9166666666666666,"blue":1.1372549019607843,"alpha":1},"BackShortCurlyUnderlight":{"gamma":1,"saturation":0,"contrast":1.45,"brightness":1.0833333333333335,"red":0.48333333333333334,"green":0.9166666666666666,"blue":1.1372549019607843,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0,"contrast":1.45,"brightness":1.0833333333333335,"red":0.48333333333333334,"green":0.9166666666666666,"blue":1.1372549019607843,"alpha":1}}},{"Item":"BackStraight","Group":"BackStraight","Color":"#ffffff","Lost":false,"Filters":{"BackStraight":{"gamma":1,"saturation":0,"contrast":1.45,"brightness":1.0833333333333335,"red":0.48333333333333334,"green":0.9166666666666666,"blue":1.1372549019607843,"alpha":1}}}], + BlueHime: [{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":0.16666666666666666,"contrast":3.95,"brightness":1.35,"red":0.2833333333333333,"green":0.48333333333333334,"blue":0.55,"alpha":1}}},{"Item":"BackStraight","Group":"BackStraight","Color":"#ffffff","Lost":false,"Filters":{"BackStraight":{"gamma":1,"saturation":0.16666666666666666,"contrast":3.95,"brightness":1.35,"red":0.2833333333333333,"green":0.48333333333333334,"blue":0.55,"alpha":1}}}], + LightBlueLong: [{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0.16666666666666666,"contrast":3.95,"brightness":1.35,"red":0.2833333333333333,"green":0.48333333333333334,"blue":0.55,"alpha":1}}},{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":0.16666666666666666,"contrast":3.95,"brightness":1.35,"red":0.2833333333333333,"green":0.48333333333333334,"blue":0.55,"alpha":1}}}], + LightBlueMedium: [{"Item":"StraightBangs","Group":"StraightBangs","Color":"#ffffff","Lost":false,"Filters":{"StraightBangs":{"gamma":1,"saturation":0.16666666666666666,"contrast":3.95,"brightness":1.35,"red":0.2833333333333333,"green":0.48333333333333334,"blue":0.55,"alpha":1}}},{"Item":"BackStraight","Group":"BackStraight","Color":"#ffffff","Lost":false,"Filters":{"BackStraight":{"gamma":1,"saturation":0.16666666666666666,"contrast":3.95,"brightness":1.35,"red":0.2833333333333333,"green":0.48333333333333334,"blue":0.55,"alpha":1}}}], + LightBlueShort: [{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":0,"contrast":1.85,"brightness":1.3,"red":0.7647058823529411,"green":0.8833333333333333,"blue":1.2,"alpha":1}}},{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0,"contrast":1.85,"brightness":1.3,"red":0.7647058823529411,"green":0.8833333333333333,"blue":1.2,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":0,"contrast":1.85,"brightness":1.3,"red":0.7647058823529411,"green":0.8833333333333333,"blue":1.2,"alpha":1}}}], + + "Water1": [{"Item":"ShortCurlyBack","Group":"ShortCurlyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortCurly":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.5666666666666669,"red":0.5490196078431373,"green":0.5166666666666666,"blue":1.6666666666666667,"alpha":1},"BackShortCurlyUnderlight":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":1,"red":0.8666666666666667,"green":1.2833333333333332,"blue":1.3166666666666664,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.2,"contrast":1,"brightness":0.9166666666666666,"red":0.8666666666666667,"green":1.2833333333333332,"blue":1.3166666666666664,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1.5666666666666669,"red":0.5490196078431373,"green":0.5166666666666666,"blue":1.6666666666666667,"alpha":1}}}], + Fire1: [{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessyUnderlight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.3333333333333333,"green":0.48333333333333334,"blue":0.29411764705882354,"alpha":1},"BackShortMessy":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.9166666666666666,"red":1.3333333333333333,"green":0.35000000000000003,"blue":0.23333333333333334,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.3333333333333333,"green":0.48333333333333334,"blue":0.29411764705882354,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.9166666666666666,"red":1.3333333333333333,"green":0.35000000000000003,"blue":0.23333333333333334,"alpha":1}}}], + FireLong: [{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.3333333333333333,"green":0.48333333333333334,"blue":0.29411764705882354,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.9166666666666666,"red":1.3333333333333333,"green":0.35000000000000003,"blue":0.23333333333333334,"alpha":1}}},{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.9166666666666666,"red":1.3333333333333333,"green":0.35000000000000003,"blue":0.23333333333333334,"alpha":1}}}], + FireTwintails: [{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.3333333333333333,"green":0.48333333333333334,"blue":0.29411764705882354,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.9166666666666666,"red":1.3333333333333333,"green":0.35000000000000003,"blue":0.23333333333333334,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.9166666666666666,"red":1.3333333333333333,"green":0.35000000000000003,"blue":0.23333333333333334,"alpha":1}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.9166666666666666,"red":1.3333333333333333,"green":0.35000000000000003,"blue":0.23333333333333334,"alpha":1}}}], + FireMessy: [{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.0588235294117647,"green":0.27450980392156865,"blue":0.49019607843137253,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.0588235294117647,"green":0.27450980392156865,"blue":0.49019607843137253,"alpha":1}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.0588235294117647,"green":0.27450980392156865,"blue":0.49019607843137253,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.0588235294117647,"green":0.27450980392156865,"blue":0.49019607843137253,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.0588235294117647,"green":0.27450980392156865,"blue":0.49019607843137253,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.0588235294117647,"green":0.27450980392156865,"blue":0.49019607843137253,"alpha":1}}}], + + Ginger: [{"Item":"Fluffy","Group":"Fluffy","Color":"#ffffff","Lost":false,"Filters":{"Fuzzy":{"gamma":0.3666666666666667,"saturation":0,"contrast":0.8999999999999999,"brightness":1,"red":1.2745098039215685,"green":0.7647058823529411,"blue":0.5294117647058824,"alpha":1}}}], + Ginger2: [{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9166666666666667,"brightness":1.0833333333333335,"red":1.35,"green":0.7000000000000001,"blue":0.48333333333333334,"alpha":1}}},{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9166666666666667,"brightness":1.0833333333333335,"red":1.35,"green":0.7000000000000001,"blue":0.48333333333333334,"alpha":1}}},{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9166666666666667,"brightness":1.0833333333333335,"red":1.35,"green":0.7000000000000001,"blue":0.48333333333333334,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9166666666666667,"brightness":1.0833333333333335,"red":1.35,"green":0.7000000000000001,"blue":0.48333333333333334,"alpha":1}}}], + GingerLong: [{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9166666666666667,"brightness":1.0833333333333335,"red":1.35,"green":0.7000000000000001,"blue":0.48333333333333334,"alpha":1}}},{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9166666666666667,"brightness":1.0833333333333335,"red":1.35,"green":0.7000000000000001,"blue":0.48333333333333334,"alpha":1}}},{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9166666666666667,"brightness":1.0833333333333335,"red":1.35,"green":0.7000000000000001,"blue":0.48333333333333334,"alpha":1}}}], + OrangeBraid: [{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1.2941176470588236,"green":0.6274509803921569,"blue":0.13725490196078433,"alpha":1}}},{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessyUnderlight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0},"BackShortMessy":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1.2941176470588236,"green":0.6274509803921569,"blue":0.13725490196078433,"alpha":1}}},{"Item":"Braid","Group":"Braid","Color":"#ffffff","Lost":false,"Filters":{"Braid":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1.2941176470588236,"green":0.6274509803921569,"blue":0.13725490196078433,"alpha":1},"BraidBack":{"gamma":1,"saturation":0,"contrast":1.26,"brightness":1,"red":1.2941176470588236,"green":0.6274509803921569,"blue":0.13725490196078433,"alpha":1}}}], + DeepRed: [{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1372549019607843,"green":0.35294117647058826,"blue":0.7647058823529411,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1372549019607843,"green":0.35294117647058826,"blue":0.7647058823529411,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1372549019607843,"green":0.35294117647058826,"blue":0.7647058823529411,"alpha":1}}}], + + RedheadTwintail: [{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.411764705882353,"green":0.7254901960784313,"blue":0.5294117647058824,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.411764705882353,"green":0.7254901960784313,"blue":0.5294117647058824,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.411764705882353,"green":0.7254901960784313,"blue":0.5294117647058824,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.411764705882353,"green":0.7254901960784313,"blue":0.5294117647058824,"alpha":1}}},{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.411764705882353,"green":0.7254901960784313,"blue":0.5294117647058824,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}}], + RedheadLong: [{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.9666666666666666,"brightness":0.8500000000000001,"red":1.4166666666666665,"green":0.7666666666666666,"blue":0.48333333333333334,"alpha":1}}},{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.9666666666666666,"brightness":0.8500000000000001,"red":1.4166666666666665,"green":0.7666666666666666,"blue":0.48333333333333334,"alpha":1}}}], + + PeachTwintails: [{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.2833333333333333,"contrast":2.8833333333333333,"brightness":0.8166666666666667,"red":1.7000000000000002,"green":0.6666666666666666,"blue":0.48333333333333334,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0.2833333333333333,"contrast":2.8833333333333333,"brightness":0.8166666666666667,"red":1.7000000000000002,"green":0.6666666666666666,"blue":0.48333333333333334,"alpha":1}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0.2833333333333333,"contrast":2.8833333333333333,"brightness":0.8166666666666667,"red":1.7000000000000002,"green":0.6666666666666666,"blue":0.48333333333333334,"alpha":1}}},{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0.2833333333333333,"contrast":2.8833333333333333,"brightness":0.8166666666666667,"red":1.7000000000000002,"green":0.6666666666666666,"blue":0.48333333333333334,"alpha":1}}}], + PeachShort: [{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.4333333333333333,"brightness":1.5666666666666669,"red":0.9833333333333333,"green":0.6666666666666666,"blue":0.48333333333333334,"alpha":1}}},{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.4333333333333333,"brightness":1.5666666666666669,"red":0.9833333333333333,"green":0.6666666666666666,"blue":0.48333333333333334,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":0.2833333333333333,"contrast":1.4333333333333333,"brightness":1.5666666666666669,"red":0.9833333333333333,"green":0.6666666666666666,"blue":0.48333333333333334,"alpha":1}}}], + VeryPeachPonytail: [{"Item":"StraightBangs","Group":"StraightBangs","Color":"#ffffff","Lost":false,"Filters":{"StraightBangs":{"gamma":1,"saturation":0,"contrast":2.25,"brightness":0.9333333333333333,"red":4.7254901960784315,"green":1.0588235294117647,"blue":0.9411764705882353,"alpha":1}}},{"Item":"Ponytail","Group":"Ponytail","Color":"#ffffff","Lost":false,"Filters":{"Ponytail":{"gamma":1,"saturation":0,"contrast":2.25,"brightness":0.9333333333333333,"red":4.7254901960784315,"green":1.0588235294117647,"blue":0.9411764705882353,"alpha":1}}}], + + BrownShort: [{"Item":"Ahoge","Group":"Ahoge","Color":"#ffffff","Lost":false,"Filters":{"Ahoge":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333}}},{"Item":"BraidCustomBackNoBraid","Group":"BraidCustomBackNoBraid","Color":"#ffffff","Lost":false,"Filters":{"BraidCustomBack":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333}}}], + BrownPonytail: [{"Item":"Ponytail","Group":"Ponytail","Color":"#ffffff","Lost":false,"Filters":{"Ponytail":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":0.3333333333333333,"saturation":0.15,"contrast":1,"brightness":0.9166666666666666,"red":1.3166666666666664,"green":0.65,"blue":0.6666666666666666,"alpha":0.9833333333333333}}}], + Brown1: [{"Item":"ShortCurlyBack","Group":"ShortCurlyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortCurly":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2156862745098038,"green":0.7450980392156863,"blue":0.5882352941176471,"alpha":1},"BackShortCurlyUnderlight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2156862745098038,"green":0.7450980392156863,"blue":0.5882352941176471,"alpha":1}}},{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2156862745098038,"green":0.7450980392156863,"blue":0.5882352941176471,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.2156862745098038,"green":0.7450980392156863,"blue":0.5882352941176471,"alpha":1}}}], + Brown2: [{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":1.7399999999999998,"brightness":1,"red":1.196078431372549,"green":0.5686274509803921,"blue":0.39215686274509803,"alpha":1}}},{"Item":"Ahoge","Group":"Ahoge","Color":"#ffffff","Lost":false,"Filters":{"Ahoge":{"gamma":1,"saturation":0,"contrast":0.8,"brightness":1,"red":1.196078431372549,"green":0.5686274509803921,"blue":0.39215686274509803,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":0.8,"brightness":1,"red":1.196078431372549,"green":0.5686274509803921,"blue":0.39215686274509803,"alpha":1}}}], + Brown3: [{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":1.7399999999999998,"brightness":1,"red":1.196078431372549,"green":0.5686274509803921,"blue":0.39215686274509803,"alpha":1}}},{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0,"contrast":1.7399999999999998,"brightness":1,"red":1.196078431372549,"green":0.5686274509803921,"blue":0.39215686274509803,"alpha":1}}}], + Brown4: [{"Item":"FluffyPonytail","Group":"FluffyPonytail","Color":"#ffffff","Lost":false,"Filters":{"Ponytail2":{"gamma":1,"saturation":0,"contrast":0.8,"brightness":1,"red":1.196078431372549,"green":0.5686274509803921,"blue":0.39215686274509803,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0,"contrast":1.7399999999999998,"brightness":1,"red":1.196078431372549,"green":0.5686274509803921,"blue":0.39215686274509803,"alpha":1}}}], + + PinkNeat: [{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.5833333333333334,"red":1.7000000000000002,"green":0.8,"blue":1.45,"alpha":0.9833333333333333}}},{"Item":"BraidCustomBackNoBraid","Group":"BraidCustomBackNoBraid","Color":"#ffffff","Lost":false,"Filters":{"BraidCustomBack":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.7333333333333334,"red":1.7000000000000002,"green":0.8,"blue":1.45,"alpha":0.9833333333333333}}},{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.7333333333333334,"red":1.7000000000000002,"green":0.8,"blue":1.45,"alpha":0.9833333333333333}}},{"Item":"Hairband","Group":"Hairband","Color":"#ffffff","Lost":false}], + PinkMessy: [{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1}}},{"Item":"StraightBangs","Group":"StraightBangs","Color":"#ffffff","Lost":false,"Filters":{"StraightBangs":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1}}},{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1764705882352942,"green":0,"blue":1.0196078431372548,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}}}], + + PurpleTwintails: [{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0,"contrast":1.44,"brightness":1,"red":0.35294117647058826,"green":0.13725490196078433,"blue":0.6470588235294118,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0,"contrast":1.44,"brightness":1,"red":0.35294117647058826,"green":0.13725490196078433,"blue":0.6470588235294118,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0,"contrast":1.44,"brightness":1,"red":0.35294117647058826,"green":0.13725490196078433,"blue":0.6470588235294118,"alpha":1}}},{"Item":"Ahoge","Group":"Ahoge","Color":"#ffffff","Lost":false,"Filters":{"Ahoge":{"gamma":1,"saturation":0,"contrast":1.44,"brightness":1,"red":0.35294117647058826,"green":0.13725490196078433,"blue":0.6470588235294118,"alpha":1}}}], + PurpleBraid: [{"Item":"BraidCustomBack","Group":"BraidCustomBack","Color":"#ffffff","Lost":false,"Filters":{"BraidCustomBraid":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.41666666666666663,"red":1.7999999999999998,"green":1,"blue":1.85,"alpha":1},"BraidCustomBack":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.41666666666666663,"red":1.7999999999999998,"green":1,"blue":1.85,"alpha":1}}},{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.41666666666666663,"red":1.7999999999999998,"green":1,"blue":1.85,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.41666666666666663,"red":1.7999999999999998,"green":1,"blue":1.85,"alpha":1}}}], + DarkPurpleSideBangs: [{"Item":"StraightBangs","Group":"StraightBangs","Color":"#ffffff","Lost":false,"Filters":{"StraightBangs":{"gamma":1,"saturation":1,"contrast":2.6666666666666665,"brightness":0.44999999999999996,"red":0.48333333333333334,"green":0.5,"blue":0.7666666666666666,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":1,"contrast":2.6666666666666665,"brightness":0.44999999999999996,"red":0.48333333333333334,"green":0.5,"blue":0.7666666666666666,"alpha":1}}},{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":1,"contrast":2.6666666666666665,"brightness":0.44999999999999996,"red":0.48333333333333334,"green":0.5,"blue":0.7666666666666666,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":1,"contrast":2.6666666666666665,"brightness":0.44999999999999996,"red":0.48333333333333334,"green":0.5,"blue":0.7666666666666666,"alpha":1}}}], + + BlackTwintails: [{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.3000000000000003,"brightness":1,"red":0.3,"green":0.3666666666666667,"blue":0.48333333333333334,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.3000000000000003,"brightness":1,"red":0.3,"green":0.3666666666666667,"blue":0.48333333333333334,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.3000000000000003,"brightness":1,"red":0.3,"green":0.3666666666666667,"blue":0.48333333333333334,"alpha":1}}}], + SlateTwintails: [{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.3000000000000003,"brightness":1.1333333333333333,"red":0.3,"green":0.41666666666666663,"blue":0.48333333333333334,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.3000000000000003,"brightness":1.1333333333333333,"red":0.3,"green":0.41666666666666663,"blue":0.48333333333333334,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.3000000000000003,"brightness":1.1333333333333333,"red":0.3,"green":0.41666666666666663,"blue":0.48333333333333334,"alpha":1}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.3000000000000003,"brightness":1.1333333333333333,"red":0.3,"green":0.41666666666666663,"blue":0.48333333333333334,"alpha":1}}}], + SlateShortPonytail: [{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.3000000000000003,"brightness":1.1,"red":0.3,"green":0.3666666666666667,"blue":0.48333333333333334,"alpha":1}}},{"Item":"FluffyPonytail","Group":"FluffyPonytail","Color":"#ffffff","Lost":false,"Filters":{"Ponytail2":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.3000000000000003,"brightness":0.65,"red":0.3,"green":0.3666666666666667,"blue":0.48333333333333334,"alpha":1}}},{"Item":"BraidCustom","Group":"BraidCustom","Color":"#ffffff","Lost":false,"Filters":{"BraidCustom":{"gamma":1,"saturation":0.21666666666666667,"contrast":3.3000000000000003,"brightness":0.7666666666666666,"red":0.3,"green":0.3666666666666667,"blue":0.48333333333333334,"alpha":1}}}], + + Maid1: [{"Item":"Fluffy","Group":"Fluffy","Color":"#ffffff","Lost":false},{"Item":"FluffyPonytail","Group":"FluffyPonytail","Color":"#ffffff","Lost":false},{"Item":"MaidHairband","Group":"MaidHairband","Color":"#ffffff","Lost":false,"Filters":{"Frill":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.0666666666666667,"alpha":1}}}], + Maid2: [{"Item":"MaidHairband","Group":"MaidHairband","Color":"#ffffff","Lost":false,"Filters":{"Frill":{"gamma":1.1166666666666667,"saturation":0,"contrast":1,"brightness":1.3833333333333333,"red":1,"green":1,"blue":1.1,"alpha":1},"Hairband":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1.1,"green":1,"blue":1,"alpha":1}}},{"Item":"Ponytail","Group":"Ponytail","Color":"#ffffff","Lost":false,"Filters":{"Ponytail":{"gamma":1.6500000000000001,"saturation":0.5,"contrast":1.2,"brightness":0.9833333333333333,"red":1.05,"green":1.05,"blue":1.0833333333333335,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1.6500000000000001,"saturation":0.5,"contrast":1.2,"brightness":0.9833333333333333,"red":1.05,"green":1.05,"blue":1.0833333333333335,"alpha":1}}}], + Maid3: [{"Item":"MaidHairband","Group":"MaidHairband","Color":"#ffffff","Lost":false,"Filters":{"Frill":{"gamma":1,"saturation":1,"contrast":1.9333333333333333,"brightness":1.2,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"Braid","Group":"Braid","Color":"#ffffff","Lost":false,"Filters":{"Braid":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1},"BraidBack":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}}], + Maid4: [{"Item":"MaidHairband","Group":"MaidHairband","Color":"#ffffff","Lost":false,"Filters":{"Frill":{"gamma":1,"saturation":1,"contrast":1.9333333333333333,"brightness":1.2833333333333332,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"Straight","Group":"Straight","Color":"#ffffff","Lost":false,"Filters":{"Straight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"ShortMessyBack","Group":"ShortMessyBack","Color":"#ffffff","Lost":false,"Filters":{"BackShortMessy":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1},"BackShortMessyUnderlight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}}], + Maid5: [{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BackStraight","Group":"BackStraight","Color":"#ffffff","Lost":false,"Filters":{"BackStraight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidHairband","Group":"MaidHairband","Color":"#ffffff","Lost":false,"Filters":{"Frill":{"gamma":1,"saturation":1,"contrast":1.9333333333333333,"brightness":1.2,"red":1,"green":1,"blue":1,"alpha":1}}}], + Maid6: [{"Item":"Curly","Group":"Curly","Color":"#ffffff","Lost":false,"Filters":{"Curly":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"TwintailLeft","Group":"TwintailLeft","Color":"#ffffff","Lost":false,"Filters":{"TwintailLeft":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"TwintailRight","Group":"TwintailRight","Color":"#ffffff","Lost":false,"Filters":{"TwintailRight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"BackStraight","Group":"BackStraight","Color":"#ffffff","Lost":false,"Filters":{"BackStraight":{"gamma":1,"saturation":0.21666666666666667,"contrast":1.9333333333333333,"brightness":1.0666666666666667,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidHairband","Group":"MaidHairband","Color":"#ffffff","Lost":false,"Filters":{"Frill":{"gamma":1,"saturation":1,"contrast":1.9333333333333333,"brightness":1.2,"red":1,"green":1,"blue":1,"alpha":1}}}], + + + Fuuka: [{"Item":"HairBow","Group":"HairBow","Color":"#ffffff","Lost":false},{"Item":"MessyBack","Group":"MessyBack","Color":"#ffffff","Lost":false,"Filters":{"Messy":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6666666666666666,"green":0.4117647058823529,"blue":0.23529411764705882,"alpha":1}}},{"Item":"FrontStraight","Group":"FrontStraight","Color":"#ffffff","Lost":false,"Filters":{"FrontStraight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6666666666666666,"green":0.4117647058823529,"blue":0.23529411764705882,"alpha":1}}},{"Item":"Ahoge","Group":"Ahoge","Color":"#ffffff","Lost":false,"Filters":{"Ahoge":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.6666666666666666,"green":0.4117647058823529,"blue":0.23529411764705882,"alpha":1}}}], + +}; diff --git a/Data/ModelStylesList.ts b/Data/ModelStylesList.ts new file mode 100644 index 000000000..26e8ce9d6 --- /dev/null +++ b/Data/ModelStylesList.ts @@ -0,0 +1,1083 @@ +/** + * List off all face styles + */ + +let KDModelStyles: Record> = { + Nevermere: { + Cosplay: [ + "Wolf1b", + "Wolf2b", + "Wolf1", + "Wolf2", + "Wolf1", + "Wolf2", + "Wolf1", + "Wolf2", + "ArcticFox", + "", + ], + Hairstyle: [ + "Wolfgirl1", + "Wolfgirl2", + "Wolfgirl3", + ], + Bodystyle: [ + "Pale", + "Default", + "Tan", + ], + Facestyle: [ + "CyanCute", + "CyanCute2", + "TealCute", + "GreenCute", + "WolfgirlBlue", + "WolfgirlCyan", + "WolfgirlBrown", + "WolfgirlOrange", + "WolfgirlRare", + "WolfgirlGrey", + ], + }, + Elf: { + Cosplay: [ + "Elf1", + "Elf2", + "Elf3", + "Elf4", + "Elf5", + "Elf6", + ], + Hairstyle: [ + "Elf1", + "ElfShort", + "ElfLong", + "GreenMessy", + "GreenPonytail", + "LavenderPonytail", + "GingerLong", + "VeryPeachPonytail", + "PeachTwintails", + ], + Bodystyle: [ + "Pale", + "Default", + ], + Facestyle: [ + "Elf1", + "GreenNormal", + "GreenCute", + "GreenAngry", + "CyanNormal", + "Cyan", + "Amber1", + "Amber2", + "Amber3", + ], + }, + Dryad: { + Hairstyle: [ + "Elf1", + "ElfShort", + "ElfLong", + "GreenMessy", + "GreenPonytail", + "LavenderPonytail", + "GingerLong", + "VeryPeachPonytail", + "PeachTwintails", + ], + Bodystyle: [ + "Dryad", + ], + Facestyle: [ + "Brown1", + "Brown2", + "Brown3", + "Brown4", + "Amber1", + "Amber2", + "Amber3", + ], + }, + MaidKnightLight: { + Hairstyle: [ + "MaidKnightLight", + ], + Bodystyle: [ + "Maid", + ], + Facestyle: [ + "MaidKnightLight", + ], + Cosplay: [ + "MaidKnightLight", + ], + }, + MaidKnightHeavy: { + Hairstyle: [ + "MaidKnightHeavy", + ], + Bodystyle: [ + "Maid", + ], + Facestyle: [ + "MaidKnightHeavy", + ], + Cosplay: [ + "MaidKnightHeavy", + ], + }, + DarkElf: { + Cosplay: [ + "Elf1", + "Elf2", + "Elf3", + "Elf4", + "Elf5", + "Elf6", + ], + Hairstyle: [ + "SlateTwintails", + "BlueMessy", + "BlueBangs", + "PurpleBraid", + "LavenderTwintails", + "DarkPurpleSideBangs", + "PurpleLong", + "PurpleNecro", + ], + Bodystyle: [ + "Pale", + "ElementalPale", + "ElementalCorrupted", + ], + Facestyle: [ + "GreenNormal", + "GreenCute", + "GreenAngry", + "CyanNormal", + "Cyan", + ], + }, + BlackCatGirl: { + Cosplay: [ + "Kitty", + "Kitty", + "Kitty", + "Kitty", + "Kitty", + "Kitty", + "Kitty2", + ], + Hairstyle: [ + "SlateTwintails", + "KittyShort", + "KittyLong", + ], + Bodystyle: [ + "Pale", + "Default", + "Tan", + "Mid", + "MidTan", + ], + Facestyle: [ + "GreenNormal", + "GreenAngry", + "GreenCute", + "CyanNormal", + "Cyan", + ], + }, + Mummy: { + Cosplay: [ + "Kitty", + "Kitty", + "Kitty", + "Kitty", + "Kitty", + "Kitty", + "Kitty2", + ], + Hairstyle: [ + "SlateTwintails", + "KittyShort", + "KittyLong", + ], + Bodystyle: [ + "Tan", + "Mid", + "MidTan", + "DarkTan", + ], + Facestyle: [ + "GreenNormal", + "GreenAngry", + "GreenCute", + "GreenOpen", + "Hazel", + "RedEyes", + ], + }, + FireElemental: { + Hairstyle: [ + "Fire1", + "SlateShortPonytail", + "SlateTwintails", + "FireLong", + "FireTwintails", + "FireMessy", + ], + Bodystyle: [ + "ElementalFire", + "ElementalTan", + ], + Facestyle: [ + "PinkCute", + "PinkAngry", + "RedOpen", + "PurpleCute", + "PurpleAngry", + "MagentaCute", + ], + Cosplay: [ + "", + "Elf3", + ], + }, + Demon: { + Hairstyle: [ + "SlateShortPonytail", + "SlateTwintails", + "BlackTwintails", + "PurpleTwintails", + "DarkPurpleSideBangs", + "PurpleBraid", + "LavenderTwintails", + "BlueMessy", + "BlueLong1", + ], + Bodystyle: [ + "Demon", + "ElementalCorrupted", + ], + Facestyle: [ + "RedScary", + "RedOpen", + "PurpleCute", + "PurpleAngry", + "PinkCute", + "PinkAngry", + "RedEyes", + ], + Cosplay: [ + "Elf1", + "Elf2", + "Elf3", + ], + }, + Angel: { + Hairstyle: [ + "Wolfgirl1", + "Wolfgirl2", + "Wolfgirl3", + "Maid6", + "WhiteTwintails", + ], + Bodystyle: [ + "Pale", + "ElementalPale", + "Tan", + ], + Facestyle: [ + "YellowAngry", + "YellowCute", + "Amber1", + ], + Cosplay: [ + "Elf1", + "Elf2", + "Elf3", + ], + }, + Worshipper: { + Hairstyle: [ + "WhiteLongHair", + "WhiteLongHair", + "Maid6", + "WhiteTwintails", + ], + Bodystyle: [ + "Pale", + "ElementalPale", + "Tan", + ], + Facestyle: [ + "Worshipper", + "Worshipper", + "Worshipper", + "PurpleCute", + "PurpleAngry", + "MagentaCute", + ], + Cosplay: [ + "", + "", + "", + "", + "", + "Elf1", + "Elf2", + "Elf3", + ], + }, + + EarthElemental: { + Hairstyle: [ + "BrownPonytail", + "BrownShort", + "Brown1", + ], + Bodystyle: [ + "Tan", + "MidTan", + "DarkTan", + "ElementalTan", + "ElementalPale", + ], + Facestyle: [ + "PinkCute", + "PinkAngry", + "RedOpen", + "PurpleCute", + "PurpleAngry", + "MagentaCute", + ], + Cosplay: [ + "", + "Elf3", + ], + }, + AirElemental: { + Hairstyle: [ + "Wolfgirl1", + "Wolfgirl2", + "Wolfgirl3", + "LavenderPonytail", + ], + Bodystyle: [ + "Tan", + "MidTan", + "ElementalTan", + "ElementalPale", + "Pale", + ], + Facestyle: [ + "PinkCute", + "PinkAngry", + "RedOpen", + "PurpleCute", + "PurpleAngry", + "MagentaCute", + ], + Cosplay: [ + "", + "Elf3", + ], + }, + WaterElemental: { + Hairstyle: [ + "Water1", + "BlueMessy", + "BlueLong1", + "BlueHime", + "BlueBangs", + "LightBlueLong", + "LightBlueMedium", + "BlueBraid", + "BlueTwintail", + ], + Bodystyle: [ + "ElementalWater", + ], + Facestyle: [ + "PinkCute", + "PinkAngry", + "RedOpen", + "PurpleCute", + "PurpleAngry", + "MagentaCute", + "RedEyes", + ], + Cosplay: [ + "", + "Elf3", + ], + }, + ElementalLatex: { + Hairstyle: [ + "Water1", + "BlueMessy", + "BlueLong1", + "BlueHime", + "BlueBangs", + "LightBlueLong", + "LightBlueMedium", + "LightBlueShort", + ], + Bodystyle: [ + "ElementalLatex", + ], + Facestyle: [ + "PinkCute", + "PinkAngry", + "RedOpen", + "PurpleCute", + "PurpleAngry", + "MagentaCute", + ], + Cosplay: [ + "", + "Elf3", + ], + }, + IceElemental: { + Hairstyle: [ + "Wolfgirl1", + "Wolfgirl2", + "Wolfgirl3", + "LavenderPonytail", + "LightBlueLong", + "LightBlueMedium", + ], + Bodystyle: [ + "ElementalIce", + "ElementalPale", + ], + Facestyle: [ + "PinkCute", + "PinkAngry", + "RedOpen", + "PurpleCute", + "PurpleAngry", + "MagentaCute", + ], + Cosplay: [ + "", + "Elf3", + ], + }, + Zombie: { + Bodystyle: [ + "Zombie", + "Pale", + "ElementalPale", + ], + Facestyle: [ + "Fuuka", + "PinkCute", + "PinkAngry", + "RedOpen", + "RedScary", + ], + Hairstyle: [ + "PeachShort", + "PinkMessy", + "PinkNeat", + "PinkNeat", + "PinkNeat", + "BlackTwintails", + "SlateTwintails", + "DarkPurpleSideBangs", + "PurpleBraid", + ], + }, + Necromancer: { + Hairstyle: [ + "PeachShort", + "PinkMessy", + "PinkNeat", + "PinkNeat", + "PinkNeat", + "BlackTwintails", + "SlateTwintails", + "DarkPurpleSideBangs", + "PurpleBraid", + "PurpleNecro", + "PurpleLong", + ], + Bodystyle: [ + "Pale", + "ElementalPale", + ], + Facestyle: [ + "PinkCute", + "PinkAngry", + "Cyan", + "CyanAngry", + "CyanCute", + "CyanCute2", + "TealCute", + "BlueCute", + ], + Cosplay: [ + "", + "", + "", + "", + "", + "Elf3", + ], + }, + Shadow: { + Hairstyle: [ + "PeachShort", + "PinkMessy", + "PinkNeat", + "PinkNeat", + "PinkNeat", + "BlackTwintails", + "SlateTwintails", + "DarkPurpleSideBangs", + "PurpleBraid", + "PurpleTwintails", + "PurpleLong", + ], + Bodystyle: [ + "Pale", + "Default", + "Tan", + "ElementalPale", + "ElementalCorrupted", + ], + Facestyle: [ + "GreenAngry", + "CyanAngry", + "PinkAngry", + "MagentaCute", + "Amber1", + "Amber2", + "Amber3", + "RedScary", + "RedOpen", + "RedEyes", + ], + Cosplay: [ + "", + "Elf1", + "Elf3", + ], + }, + Bandit: { + Hairstyle: [ + "Ginger", + "Ginger2", + "OrangeBraid", + "BrownShort", + "Brown1", + "PinkMessy", + "KittyShort", + "RedheadTwintail", + ], + Bodystyle: [ + "Default", + "Mid", + "Tan", + "MidTan", + "DarkTan", + ], + Facestyle: [ + "Brown1", + "Brown2", + "Brown3", + "Amber1", + "Amber2", + "Amber3", + "RedOpen", + ], + }, + + BlueHair: { + Hairstyle: [ + "Water1", + "BlueMessy", + "BlueLong1", + "BlueHime", + "BlueBangs", + "LightBlueLong", + "LightBlueMedium", + "BlueBraid", + "BlueTwintail", + ], + Bodystyle: [ + "Default", + "Mid", + "Pale", + "MidTan", + ], + Facestyle: [ + "Amber1", + "Amber2", + "Amber3", + "GreenOpen", + "GreenNormal", + "CyanCute", + "PurpleCute", + "Brown3", + ], + }, + GreenHair: { + Hairstyle: [ + "GreenMessy", + "GreenPonytail", + "GreenTwintail", + ], + Bodystyle: [ + "Default", + "Mid", + "Pale", + "MidTan", + ], + Facestyle: [ + "Amber1", + "Amber2", + "Amber3", + "GreenOpen", + "GreenNormal", + "CyanCute", + "PurpleCute", + "Brown3", + ], + }, + WhiteHair: { + Hairstyle: [ + "Wolfgirl1", + "Wolfgirl2", + "Wolfgirl3", + "LavenderPonytail", + "Maid1", + "Maid2", + ], + Bodystyle: [ + "Default", + "Mid", + "Pale", + "MidTan", + "DarkTan", + ], + Facestyle: [ + "BlueCute", + "MagentaCute", + "PinkCute", + "PinkAngry", + "PurpleAngry", + "PurpleCute", + "Brown1", + "Brown2", + "Brown3", + ], + }, + Maid: { + Hairstyle: [ + "Maid1", + "Maid2", + "Maid3", + "Maid4", + "Maid6", + ], + Bodystyle: [ + "Default", + "Tan", + "Pale", + "MidTan", + ], + Facestyle: [ + "BlueCute", + "MagentaCute", + "PinkCute", + "PinkAngry", + "PurpleAngry", + "PurpleCute", + "Brown1", + "Brown2", + "Brown3", + "Hazel", + ], + }, + Water: { + Hairstyle: [ + "Water1", + "BlueMessy", + "BlueLong1", + "BlueHime", + "BlueBangs", + "LightBlueLong", + "LightBlueMedium", + "LightBlueShort", + "BlueBraid", + "BlueTwintail", + "PurpleLong", + ], + Bodystyle: [ + "Default", + "Mid", + "Pale", + "MidTan", + ], + Facestyle: [ + "Cyan", + "CyanNormal", + "CyanAngry", + "CyanCute", + "CyanCute2", + "PurpleCute", + ], + }, + Ice: { + Hairstyle: [ + "Wolfgirl1", + "Wolfgirl2", + "Wolfgirl3", + "LavenderPonytail", + "LightBlueLong", + "LightBlueMedium", + "LightBlueShort", + "BlueTwintail", + ], + Bodystyle: [ + "Default", + "Mid", + "Pale", + ], + Facestyle: [ + "TealCute", + "BlueCute", + "CyanAngry", + "CyanCute", + "CyanCute2", + ], + }, + Earth: { + Hairstyle: [ + "Ginger", + "Ginger2", + "GingerLong", + "OrangeBraid", + "PeachShort", + "BrownPonytail", + "BrownShort", + "Brown1", + "Brown2", + "Brown3", + "Brown4", + "DeepRed", + "PeachTwintails", + ], + Bodystyle: [ + "Default", + "Mid", + "Pale", + ], + Facestyle: [ + "Amber1", + "Amber2", + "Amber3", + "Brown1", + "Brown2", + "Brown3", + "TealCute", + "BlueCute", + ], + }, + Air: { + Hairstyle: [ + "Wolfgirl1", + "Wolfgirl2", + "Wolfgirl3", + "LavenderPonytail", + "PeachTwintails", + ], + Bodystyle: [ + "Default", + "Mid", + "Pale", + ], + Facestyle: [ + "TealCute", + "BlueCute", + "CyanAngry", + "CyanCute", + "CyanCute2", + ], + }, + + Fire: { + Hairstyle: [ + "Fire1", + "SlateShortPonytail", + "SlateTwintails", + "FireLong", + "FireTwintails", + "FireMessy", + ], + Bodystyle: [ + "Default", + "Tan", + "DarkTan", + "Pale", + ], + Facestyle: [ + "GreenOpen", + "GreenAngry", + "Amber1", + "Amber2", + "Amber3", + "Brown1", + "Brown2", + "RedOpen", + ], + }, + + DragonPoison: { + Hairstyle: [ + "GreenMessy", + "GreenPonytail", + "GreenShiny", + "PurpleBraid", + "LavenderTwintails", + "DarkPurpleSideBangs", + "PurpleLong", + ], + Bodystyle: [ + "Default", + "Mid", + "Pale", + "Tan", + "DarkTan", + ], + Facestyle: [ + "GreenOpen", + "GreenAngry", + "GreenNormal", + "PurpleCute", + "TealCute", + "PurpleAngry", + "LightBlueCute", + ], + Cosplay: [ + "DragonPoison" + ], + }, + + + DragonCrystal: { + Hairstyle: [ + "CrystalHair", + "CrystalHair", + "CrystalHair", + "PinkMessy", + "PinkNeat", + "PinkNeat", + "PinkNeat", + + ], + Bodystyle: [ + "Default", + "Mid", + "Pale", + "Tan", + "DarkTan", + ], + Facestyle: [ + "CrystalFace", + "CrystalFace", + "PinkCute", + "PinkAngry", + ], + Cosplay: [ + "DragonCrystal", + ], + }, + + DragonIce: { + Hairstyle: [ + "Wolfgirl1", + "Wolfgirl2", + "Wolfgirl3", + "LavenderPonytail", + "LightBlueLong", + "LightBlueMedium", + "LightBlueShort", + "BlueTwintail", + ], + Bodystyle: [ + "Default", + "Mid", + "Pale", + ], + Facestyle: [ + "TealCute", + "BlueCute", + "CyanAngry", + "CyanCute", + "CyanCute2", + ], + Cosplay: [ + "DragonIce" + ], + }, + DragonShadow: { + Hairstyle: [ + "SlateShortPonytail", + "SlateTwintails", + "BlackTwintails", + "PurpleTwintails", + "DarkPurpleSideBangs", + "PurpleBraid", + "LavenderTwintails", + "BlueMessy", + "BlueLong1", + "PurpleLong", + ], + Bodystyle: [ + "Demon", + "ElementalCorrupted", + ], + Facestyle: [ + "YellowOpen", + "YellowRound", + "YellowKjus", + ], + Cosplay: [ + "DragonIce" + ], + }, + + RedHair: { + Hairstyle: [ + "Fire1", + "SlateShortPonytail", + "SlateTwintails", + "FireLong", + "FireTwintails", + "FireMessy", + "DeepRed", + ], + Bodystyle: [ + "Default", + "Tan", + "DarkTan", + "Pale", + ], + Facestyle: [ + "GreenOpen", + "GreenAngry", + "GreenNormal", + "PurpleCute", + "TealCute", + "PurpleAngry", + "LightBlueCute", + ], + }, + Melissa: { + Bodystyle: [ + "Default", + ], + Facestyle: [ + "Melissa", + ], + Hairstyle: [ + "Melissa", + ], + }, + Viola: { + Bodystyle: [ + "Default", + ], + Facestyle: [ + "Viola", + ], + Hairstyle: [ + "Viola", + ], + }, + Yuri: { + Bodystyle: [ + "Default", + ], + Facestyle: [ + "Yuri", + ], + Hairstyle: [ + "PurpleNecro", + ], + Cosplay: [ + "Glasses", + ], + }, + Hilda: { + Bodystyle: [ + "Default", + ], + Facestyle: [ + "Hilda", + ], + Hairstyle: [ + "PinkTwintail", + ], + Cosplay: [ + "Hilda", + ], + }, + Nara: { + Cosplay: [ + "Nara", + ], + Bodystyle: [ + "Nara", + ], + Facestyle: [ + "Nara", + ], + Hairstyle: [ + "Nara", + ], + }, + Myrtrice: { + Bodystyle: [ + "Default", + ], + Facestyle: [ + "Myrtrice", + ], + Hairstyle: [ + "Myrtrice", + ], + }, + Fuuka: { + Cosplay: [ + "Fuuka", + ], + Bodystyle: [ + "Zombie", + ], + Facestyle: [ + "Fuuka", + ], + Hairstyle: [ + "Fuuka", + ], + }, + Dollmaker: { + Bodystyle: [ + "Default", + ], + Facestyle: [ + "GreenAngry", + ], + Hairstyle: [ + "BlueBraid", + ], + }, +}; \ No newline at end of file diff --git a/Data/ModelTypes.ts b/Data/ModelTypes.ts new file mode 100644 index 000000000..7272bebba --- /dev/null +++ b/Data/ModelTypes.ts @@ -0,0 +1,271 @@ +enum PosePriConditions { + rotation, + offset_x, + offset_y, + offset_either, +}; + +type PoseMod = { + Layer: string, + offset_x?: number, + offset_y?: number, + scale_x?: number, + scale_y?: number, + rotation_x_anchor?: number, + rotation_y_anchor?: number, + rotation?: number, +}; + +/** A set of properties for poses */ +type PoseProperty = { + /** Only applied during this pose */ + filter_pose?: string[], + /** How much this pose rotates the player, in degrees */ + rotation?: number, + rotation_x_anchor?: number, + rotation_y_anchor?: number, + /** Priority of the rotation. Only the highest will rotate the character */ + pri_rotation?: number, + /** The height offset of the pose*/ + offset_y?: number, + /** The side-to-side offset of the pose*/ + offset_x?: number, + offset_xFlip?: number, + /** Priority of the offset. Only the highest will offset the character at all*/ + pri_offsetx?: number, + pri_offsety?: number, + /** Greedy priority: If this pose isn't the top offset in both x and y, it won't do either*/ + greedy_offset?: boolean, + /** These are modifications to particular layers, such as the head and anything with the head as parent*/ + mods?: PoseMod[], + /** If any of these conditions are not met the mods will not be applied */ + greedy_mod_conditions?: PosePriConditions[], + /** Unless a model specifically lists this pose in GlobalDefaultOverride, it will look for images with this prefix instead*/ + global_default?: string, + /** Does a model flip*/ + flip?: boolean, + +} + +interface Model extends Namable { + /** Name of the model, used to identify */ + Name: string, + /** Folder to find artwork */ + Folder: string, + /** Layers themselves */ + Layers: Record, + /** Protects from stripping, for hair and such */ + Protected?: boolean, + /** Protects from stripping AND override, for ears, eyes, tail and such */ + SuperProtected?: boolean, + /** This is a restraint */ + Restraint?: boolean, + /** Optional group, for items where there can should only be one (like panties or shoes)*/ + Group?: string, + /** Removes the model if these poses are present*/ + RemovePoses?: string[], + /** Optional categories for a model to appear in wardrobe*/ + Categories: string[], + /** Optional, this appears as a top level item*/ + TopLevel?: boolean, + /** Optional, this appears under a top level item*/ + Parent?: string, + /** Optional, this appears under a top level item*/ + Parent2?: string[], + /** Adds these as tempposes*/ + AddPose?: string[], + /** Conditional add pose. They are only added if the specified pose is NOT present */ + AddPoseConditional?: Record, + /** Conditional add pose. They are only added if the specified pose is present */ + AddPoseIf?: Record, + /** This model hides all items on these layers. Use sparingly */ + HideLayers?: string[], + /** This model hides all items on these layergroups. Use sparingly */ + HideLayerGroups?: string[], + /** Default string of colors*/ + DefaultColor?: string[], + /** Color definition */ + Filters?: Record, + /** Color definition */ + Properties?: Record, + /** Hardcoded Lock Type */ + LockType?: string, + /** Hardcoded body filters */ + ImportBodyFilters?: boolean, +} + +interface ModelLayer extends Namable { + /** Name of the layer, used to identify */ + Name: string, + /** Layer for priority sorting */ + Layer: string, + /** Custom override for folder */ + Folder?: string, + /** Priority offset, -499 to 500 */ + Pri?: number, + /** Name of the sprite PNG, same as the name by default*/ + Sprite?: string, + /** This layer only appears if the item is locked */ + LockLayer?: boolean, + /** Changes the layer if a certain pose exists */ + SwapLayerPose?: Record, + /** Prepends a string to the beginning of the layer if a pose is present. Only the first happens */ + PrependLayerPrefix?: Record, + /** Changes the priority if a certain pose exists */ + SwapPriorityPose?: Record, + /** One of these layers is required*/ + Poses?: Record, + /** Only displace in these poses */ + DisplacementPoses?: string[], + + /** No displacement map in these poses */ + DisplacementPosesExclude?: string[], + /** No erase map in these poses */ + ErasePosesExclude?: string[], + /** Adds a displacement map for rope squish and such. If the same sprite is in use it wont be duped*/ + DisplacementSprite?: string, + /** Which layers to apply displacement to */ + DisplaceLayers?: Record, + /** MorphPoses but displacement */ + DisplacementMorph?: Record, + /** Amount of displacement */ + DisplaceAmount?: number, + DisplaceZBonus?: number, + /** Prevents displacement maps from applying to this item */ + NoDisplace?: boolean, + + OccludePoses?: string[], + /** No displacement map in these poses */ + OccludePosesExclude?: string[], + /** Which layers to apply displacement to */ + OccludeLayers?: Record, + /** Amount of displacement */ + OccludeAmount?: number, + + + /** [Group, Color] */ + ImportColorFromGroup?: string[], + /** [Category, Color] */ + ImportColorFromCategory?: string[], + + /** Adds a Erase map for heel deletion and such. If the same sprite is in use it wont be duped*/ + EraseSprite?: string, + /** Only erase in these poses */ + ErasePoses?: string[], + /** Which layers to apply Erase to */ + EraseLayers?: Record, + /** MorphPoses but Erase */ + EraseMorph?: Record, + /** Amount of Erase */ + EraseAmount?: number, + EraseZBonus?: number, + /** Prevents Erase maps from applying to this item */ + NoErase?: boolean, + /** Invariant displacement */ + EraseInvariant?: boolean, + + /** Hide this item if the specified pose isnt present + * 0 - Condition + * 1 - Pose to filter off of + * 2 - Cancel property + */ + HidePoseConditional?: string[][], + /** These layers are ALL REQUIRED to make it appear*/ + RequirePoses?: Record, + /** This layer is hidden in this pose*/ + HidePoses?: Record, + /** If one of these poses is present then the layer will default to the relevant pose*/ + MorphPoses?: Record, + /** Overrides globaL_default of the listed poses */ + GlobalDefaultOverride?: Record, + /** AppendPose does not apply to the displacement map */ + NoAppendDisplacement?: boolean, + /** AppendPose does not apply to the erase map */ + NoAppendErase?: boolean, + /** When this pose is present it appends it to the name. Only one can be appended this way */ + AppendPose?: Record, + /** When this pose is present it appends it to the name. Same as appendpose but appends all that are available*/ + AppendPoseMulti?: Record, + /** Lists the poses that can be affected by AppendPose*/ + AppendPoseRequire?: Record, + /** Hides when this pose plus the layer name is present. E.g. HidePrefixPose: ["Encase"] will hide EncaseShoeLeft if the layer is on ShoeLeft */ + HidePrefixPose?: string[], + /** Additional suffixes for HidePrefixPose */ + HidePrefixPoseSuffix?: string[], + /** This layer gets hidden if something else is higher on the priority list */ + HideWhenOverridden?: boolean, + /** This is the layer used for HideWhenOverridden rather than the default layer */ + HideOverrideLayer?: string, + /** This is the layer(s) used for HideWhenOverridden rather than the default layer. Uses layer groups*/ + HideOverrideLayerMulti?: string[], + /** Only the main override layer is used for hiding THIS item */ + ForceSingleOverride?: boolean, + /** This makes it so HideOverrideLayer is the layer for overriding purposes. Pair with NoOverride to complete the effect */ + CrossHideOverride?: boolean, + /** Only overrides if the layer is not hidden.*/ + DontAlwaysOverride?: boolean, + /** This layer does not affect the max priority level */ + NoOverride?: boolean, + /** Hide this layer if the other layer does not show */ + TieToLayer?: string, + /** The name is as is */ + Invariant?: boolean, + /** Displacement maps are treated as Invariant */ + DisplacementInvariant?: boolean, + /** Applies this layer's filter to a layer when the filter isn't hidden */ + ApplyFilterToLayerGroup?: Record, + /** Which filter to apply */ + ApplyFilter?: string, + /** Disables color filters */ + NoColorize?: boolean, + /** Inherits colorization from another layer */ + InheritColor?: string, + /** Offset X */ + OffsetX?: number, + /** Offset Y */ + OffsetY?: number, + /** Offset X scale */ + AnchorModX?: number, + /** Offset Y scale */ + AnchorModY?: number, + /** Increases layer priority but only if the pose is present */ + AddPriWithPose?: Record, +} + +type LayerFilter = { + gamma: number; + saturation: number; + contrast: number; + brightness: number; + red: number; + green: number; + blue: number; + alpha: number; +} + +type LayerPropertiesType = { + LayerBonus?: number, + XOffset?: number, + YOffset?: number, + XPivot?: number, + YPivot?: number, + Rotation?: number, + XScale?: number, + YScale?: number, + Protected?: number, + SuppressDynamic?: number, + HideOverridden?: number, + NoOverride?: number, + ExtraHidePoses?: string[], + ExtraRequirePoses?: string[], + ExtraHidePrefixPose?: string[], + ExtraHidePrefixPoseSuffix?: string[], + AddPose?: string[], + DisplaceAmount?: number, + EraseAmount?: number, +} + +interface Namable { + Name: string, +} + diff --git a/Data/Models.ts b/Data/Models.ts new file mode 100644 index 000000000..2b064f187 --- /dev/null +++ b/Data/Models.ts @@ -0,0 +1,2710 @@ +let SHOWMESHPOINTS = false; +let StruggleAnimation = false; + +let RenderCharacterQueue = new Map(); +let RenderCharacterLock = new Map(); + +let KDFilterCacheToDestroy: PIXIFilter[] = []; +let KDFilterDrawn: Map = new Map(); +let KDRenderTexToDestroy: PIXITexture[] = []; +let KDMeshToDestroy: PIXIMesh[] = []; +let KDSpritesToCull: PIXISprite[] = []; + +let KDCulling = true; + +/** + * Returns a table with the priorities for each layer based on order of the array + */ +function InitLayers(layers: string[]): {[_: string]: number} { + let table: {[_: string]: number} = {}; + let count = 0; + for (let l of layers) { + table[l] = count * LAYER_INCREMENT; + count += 1; + } + return table; +} +/** + * returns a meta layer for each non meta layer + */ +function InitMetaLayers(bounds: metaLayerBound[]): + {forward: Record, reverse: Record, order: Record} { + let forward: Record = {}; + let reverse: Record = {}; + let order: Record = {}; + + let currentIndex = 0; + let layerCount = 0; + let currentLayer = LAYERS_BASE[currentIndex]; + for (let meta of bounds) { + let layers: string[] = []; + // Skip ahead if needed + while (LAYERS_BASE[currentIndex] != meta.start) { + if (!reverse[LAYERS_BASE[currentIndex]]) { + // Create a singleton if needed + order[LAYERS_BASE[currentIndex]] = layerCount; + forward[LAYERS_BASE[currentIndex]] = [LAYERS_BASE[currentIndex]]; + reverse[LAYERS_BASE[currentIndex]] = LAYERS_BASE[currentIndex]; + layerCount++; + } + currentIndex++; + } + // Do the register + while (LAYERS_BASE[currentIndex]) { + currentLayer = LAYERS_BASE[currentIndex]; + layers.push(currentLayer); + reverse[currentLayer] = meta.id; + if (currentLayer == meta.end || LAYERS_BASE[currentIndex + 1] == meta.end) { + break; + } + currentIndex++; + } + forward[meta.id] = layers; + order[meta.id] = layerCount; + layerCount++; + } + return {forward: forward, reverse: reverse, order: order}; +} + +let ModelLayers = InitLayers(LAYERS_BASE); +let metaLayersData = InitMetaLayers(metaLayerBoundaries); +let metaLayerForward = metaLayersData.forward; +let metaLayerReverse = metaLayersData.reverse; +let metaLayerOrder = metaLayersData.order; + + +let ModelDefs: {[_: string]: Model} = {}; + +function AddModel(Model: Model, Strings?: Record) { + ModelDefs[Model.Name] = Model; + if (Strings) { + for (let str of Object.entries(Strings)) { + addTextKey("m_" + str[0], str[1]); + } + } +} + +let KDCurrentModels: Map = new Map(); + +interface ContainerInfo { + readonly SpriteList: Map; + readonly SpritesDrawn: Map; + readonly Container: PIXIContainer; + readonly Mesh: PIXIMesh; + readonly RenderTexture: PIXIRenderTexture; + readonly Matrix: PIXIArray; + Zoom: number; +} + +class ModelContainer { + + public HighestPriority: {[_: string]: number}; + public HiddenLayers: {[_: string]: number}; + public XRayFilters: string[]; + + Character: Character; + Models: Map; + Containers: Map; + ContainersDrawn: Map; + Poses: Record; + TempPoses: Record; + readonly Update: Set; + readonly ForceUpdate: Set; + readonly Refresh: Set; + readonly Mods: Map; + readonly EndMods: Map; + + + constructor(Character: Character, Models: Map, Containers: Map, ContainersDrawn: Map, Poses: Record) { + this.Character = Character; + this.Containers = Containers; + this.ContainersDrawn = ContainersDrawn; + this.Models = Models; + this.Poses = Poses; + this.TempPoses = {}; + this.HighestPriority = {}; + this.Mods = new Map(); + this.EndMods = new Map(); + this.Update = new Set(); + this.ForceUpdate = new Set(); + this.Refresh = new Set(); + } + + /** + * Adds a model to the modelcontainer + */ + addModel(Model: Model, Filters?: Record, LockType?: string, Properties?: Record) { + let mod: Model = JSON.parse(JSON.stringify(Model)); + if (Filters) { + mod.Filters = JSON.parse(JSON.stringify(Filters)) || mod.Filters; + } + if (Properties) { + mod.Properties = JSON.parse(JSON.stringify(Properties)) || mod.Properties; + } + if (LockType) { + mod.LockType = JSON.parse(JSON.stringify(LockType)) || mod.LockType; + } + this.Models.set(Model.Name, mod); + } + + /** Updates a model, usually after adding all the models*/ + updateModel(Name: string) { + let Model = this.Models.get(Name); + if (Model?.ImportBodyFilters && this.Models.get("Body")?.Filters) { + if (!Model.Filters) Model.Filters = {}; + Object.assign(Model.Filters, JSON.parse(JSON.stringify(this.Models.get("Body").Filters))); + } + + // Hunts down the proper color + if (Model?.Layers) { + for (let l of Object.values(Model.Layers)) { + if (l.ImportColorFromGroup && !(Model.Filters && Model.Filters[l.Name])) { + let copiedFrom = [...this.Models.values()].find((model) => { + return model.Group == l.ImportColorFromGroup[0] && model.Filters && model.Filters[l.ImportColorFromGroup[1]] + }); + if (copiedFrom) { + if (!Model.Filters) Model.Filters = {}; + Model.Filters[l.InheritColor || l.Name] = JSON.parse(JSON.stringify(copiedFrom.Filters[l.ImportColorFromGroup[1]])); + } + } + if (l.ImportColorFromCategory && !(Model.Filters && Model.Filters[l.Name])) { + let copiedFrom = [...this.Models.values()].find((model) => { + return model.Categories.includes(l.ImportColorFromCategory[0]) && model.Filters && model.Filters[l.ImportColorFromCategory[1]] + }); + if (copiedFrom) { + if (!Model.Filters) Model.Filters = {}; + Model.Filters[l.InheritColor || l.Name] = JSON.parse(JSON.stringify(copiedFrom.Filters[l.ImportColorFromCategory[1]])); + } + } + } + } + } + + /** + * Deletes a model to the modelcontainer + */ + removeModel(Model: string) { + this.Models.delete(Model); + } +} + +function ToLayerMap(Layers: ModelLayer[]): {[_: string]: ModelLayer} { + return ToNamedMap(Layers); +} + +function GetModelLayers(ModelName: string, PrependString?: string, AppendString?: string, InheritColor?: string, PriBonus?: number, layerSwap?: string, Folder?: string, noTieToLayer: boolean = false): ModelLayer[] { + if (ModelDefs[ModelName]) { + let ret : ModelLayer[] = JSON.parse(JSON.stringify(Object.values(ModelDefs[ModelName].Layers))); + for (let layer of ret) { + layer.Name = (PrependString || "") + layer.Name + (AppendString || ""); + if (InheritColor) layer.InheritColor = InheritColor; + if (PriBonus) { + layer.Pri += PriBonus; + if (!noTieToLayer && !layerSwap && (PrependString || AppendString)) { + layer.NoOverride = true; + layer.TieToLayer = layer.Name; + delete layer.HideWhenOverridden; + } + } + if (layerSwap) layer.Layer = layerSwap; + if (Folder) layer.Folder = Folder; + } + return ret; + } + return []; +} +function GetModelLayersNoOverride(ModelName: string, PrependString?: string, AppendString?: string, InheritColor?: string, PriBonus?: number, layerSwap?: string, Folder?: string): ModelLayer[] { + if (ModelDefs[ModelName]) { + let ret : ModelLayer[] = JSON.parse(JSON.stringify(Object.values(ModelDefs[ModelName].Layers))); + for (let layer of ret) { + layer.Name = (PrependString || "") + layer.Name + (AppendString || ""); + if (InheritColor) layer.InheritColor = InheritColor; + if (PriBonus) layer.Pri += PriBonus; + if (layerSwap) layer.Layer = layerSwap; + if (Folder) layer.Folder = Folder; + layer.NoOverride = true; + } + return ret; + } + return []; +} +function GetModelWithExtraLayers(NewModel: string, BaseModel: string, Layers: ModelLayer[], Parent?: string, TopLevel?: boolean, ExtraProps?: object): Model { + if (ModelDefs[BaseModel]) { + let model: Model = JSON.parse(JSON.stringify(ModelDefs[BaseModel])); + model.Name = NewModel; + if (Parent != undefined) model.Parent = Parent; + if (TopLevel != undefined) model.TopLevel = TopLevel; + for (let l of Layers) { + model.Layers[l.Name] = JSON.parse(JSON.stringify(l)); + } + if (ExtraProps) Object.assign(model, ExtraProps); + return model; + } + return null; +} + +function GetModelRestraintVersion(BaseModel: string, Parent: boolean, + extraAddPoses?: string[], + removeRemovePoses?: string[]): Model { + if (ModelDefs[BaseModel]) { + let model: Model = JSON.parse(JSON.stringify(ModelDefs[BaseModel])); + model.Name = model.Name + "Restraint"; + if (Parent) { + model.Parent = model.Parent + "Restraint"; + } + if (!model.Categories) model.Categories = []; + model.Categories.push("Restraints"); + model.Restraint = true; + if (extraAddPoses) { + // This bit of javascript gives me a headache + model.AddPose = [...(model.AddPose || []), ...extraAddPoses]; + } + if (removeRemovePoses) { + if (model.RemovePoses) { + model.RemovePoses = model.RemovePoses.filter((rp) => {return !removeRemovePoses.includes(rp);}) + } + } + return model; + } + return null; +} + +function GetModelFashionVersion(BaseModel: string, Parent: boolean, removeOptionSwap: boolean = true): Model { + if (ModelDefs[BaseModel]) { + let model: Model = JSON.parse(JSON.stringify(ModelDefs[BaseModel])); + model.Name = "Fashion" + model.Name; + if (Parent) { + model.Parent = "Fashion" + model.Parent; + } + if (!model.Categories) model.Categories = []; + model.Categories.push("FashionRestraints"); + model.Restraint = false; + if (removeOptionSwap) + for (let layer of Object.values(model.Layers)) { + if (layer.PrependLayerPrefix) { + for (let plp of Object.entries(layer.PrependLayerPrefix)) { + if (plp[1] == "Option_") delete layer.PrependLayerPrefix[plp[0]]; + if (plp[1] == "Option2_") delete layer.PrependLayerPrefix[plp[0]]; + } + } + } + delete model.Group; + return model; + } + return null; +} +function GetOverCorset(BaseModel: string): Model { + if (ModelDefs[BaseModel]) { + let model: Model = JSON.parse(JSON.stringify(ModelDefs[BaseModel])); + model.Name = model.Name + "Over"; + for (let l of Object.values(model.Layers)) { + if (l.Layer == "Corset") l.Layer = "Cincher"; + } + return model; + } + return null; +} + + +function DisposeCharacter(C: Character, resort: boolean = true, deleteSpecial: boolean = false): void { + if (KDCurrentModels.get(C)) { + for (let Container of KDCurrentModels.get(C).Containers.values()) { + Container.Container.parent.removeChild(Container.Container); + Container.Container.destroy(); + } + } + if (NPCTags.get(C)) { + NPCTags.delete(C); + } + if (KDNPCChar_ID.get(C)) { + let id = KDNPCChar_ID.get(C); + KDNPCChar.delete(id); + if (deleteSpecial || !KDPersistentNPCs[id + ""] || !KDPersistentNPCs[id + ""].special) { + if (KDPersistentNPCs[id + ""]?.Name && KDGameData.NamesGenerated[KDPersistentNPCs[id + ""].Name] == id) + delete KDGameData.NamesGenerated[KDPersistentNPCs[id + ""].Name] + delete KDPersistentNPCs[id + ""]; + delete KDGameData.NPCRestraints[id + ""]; + KDDeletedIDs[id + ""] = 1; + } + delete KDGameData.Collection[id + ""]; + if (resort) { + KDSortCollection(); + } + KDNPCChar_ID.delete(C); + } + if (KDNPCPoses.get(C)) { + KDNPCPoses.delete(C); + } + if (NPCDesiredPoses.get(C)) { + NPCDesiredPoses.delete(C); + } +} +function DisposeEntity(id: number, resort: boolean = true, deleteSpecial = false, deletePersistent = true): void { + let C = KDNPCChar.get(id); + if (C && KDCurrentModels.get(C)) { + for (let Container of KDCurrentModels.get(C).Containers.values()) { + if (Container.Container.parent) + Container.Container.parent.removeChild(Container.Container); + Container.Container.destroy(); + } + } + if (C && NPCTags.get(C)) { + NPCTags.delete(C); + } + KDNPCChar.delete(id); + if (deleteSpecial || !KDPersistentNPCs[id + ""] || !KDPersistentNPCs[id + ""].special) { + KDPurgeParty(id); + if (KDPersistentNPCs[id + ""]?.Name && KDGameData.NamesGenerated[KDPersistentNPCs[id + ""].Name] == id) + delete KDGameData.NamesGenerated[KDPersistentNPCs[id + ""].Name] + delete KDPersistentNPCs[id + ""]; + delete KDGameData.NPCRestraints[id + ""]; + KDDeletedIDs[id + ""] = 1; + } + delete KDGameData.Collection[id + ""]; + if (resort) { + KDSortCollection(); + } + if (C && KDNPCChar_ID.get(C)) { + KDNPCChar_ID.delete(C); + } + if (C && KDNPCPoses.get(C)) { + KDNPCPoses.delete(C); + } + if (C && NPCDesiredPoses.get(C)) { + NPCDesiredPoses.delete(C); + } +} + +/** + * Refreshes the character if not all images are loaded and draw the character canvas on the main game screen + * @param C - Character to draw + * @param X - Position of the character on the X axis + * @param Y - Position of the character on the Y axis + * @param Zoom - Zoom factor + * @param IsHeightResizeAllowed - Whether or not the settings allow for the height modifier to be applied + * @param DrawCanvas - Pixi container to draw to + * @param Blend - The blend mode to use + * @param StartMods - Mods applied + * @param EndMods - Mods applied at end + * @param flip - Mods applied + */ +function DrawCharacter(C: Character, X: number, Y: number, Zoom: number, + IsHeightResizeAllowed: boolean = true, DrawCanvas: any = null, + Blend: any = PIXI.SCALE_MODES.LINEAR, + StartMods: PoseMod[] = [], zIndex: number = 0, flip: boolean = false, + extraPoses: string[] = undefined, containerID?: string, + EndMods: PoseMod[] = []): void { + if (!DrawCanvas) DrawCanvas = kdcanvas; + + // Update the RenderCharacterQueue + let renderqueue = RenderCharacterQueue.get(C); + if (renderqueue && !RenderCharacterLock.get(C)) { + if (renderqueue.length > 0) { + let renderf = renderqueue.splice(0, 1)[0]; + if (renderf) + renderf(); + } else { + RenderCharacterQueue.delete(C); + } + } + + + + let MC: ModelContainer = !KDCurrentModels.get(C) ? new ModelContainer( + C, + new Map(), + new Map(), + new Map(), + KDGeneratePoseArray(), + ) : KDCurrentModels.get(C); + + if (MC.Models.size == 0) { + UpdateModels(C); + } + + if (!containerID) + containerID = `${Math.round(X)},${Math.round(Y)},${Zoom}`; + let refreshfilters = false; + + if (StruggleAnimation) // PROTOTYPE struggle animation + if (MC.Containers.get(containerID)) { + let mesh = MC.Containers.get(containerID).Mesh; + let rt = MC.Containers.get(containerID).RenderTexture; + let buffer = mesh.geometry.getBuffer('aVertexPosition'); + let matrix = MC.Containers.get(containerID).Matrix; + + // Assign locations + let x = 0; + let y = 0; + let width = 100; + let height = 100; + let timt = 1000; + for (let i = 0; i + 1 < buffer.data.length; i+= 2) + { + // x + buffer.data[i] = matrix[i] + MODELWIDTH*0.005*Math.sin(Math.max(0,Math.PI*(0.6*height-y)/(0.6*height)))*(Math.sin((CommonTime() % timt)/timt * 2*Math.PI))*Zoom; + // y + buffer.data[i+1] = matrix[i+1] + MODELWIDTH*0.001*Math.sin(Math.PI+Math.max(0,Math.PI*(0.6*height-y)/(0.6*height))) * Math.cos((CommonTime() % timt)/timt * 4*Math.PI)*Zoom; + if (SHOWMESHPOINTS && Zoom == 1 && x < width*.5 && y > height*.25 && y < height*.75) { + KDDraw(DrawCanvas, kdpixisprites, "buffer" + i, KinkyDungeonRootDirectory + "ShrineAura.png", + -4+(buffer.data[i])-MODELWIDTH*MODEL_SCALE*0.25, -4+(buffer.data[i+1])-MODELHEIGHT*MODEL_SCALE*(0.25)-MODELWIDTH/10, 8, 8, + undefined, { + zIndex: 100, + tint: 0x00ff00, + }); + } + + x += 1; + if (x >= width) { + y += 1; + x = 0; + } + } + buffer.update(); + } + + if (MC.Containers.get(containerID) && !MC.Update.has(containerID) && MC.Refresh.has(containerID)) { + + let data = { + Character: Character, + containerID: containerID, + ContainerInfo: MC.Containers.get(containerID), + zIndex: zIndex, + x: X, + y: Y, + Blend: Blend, + StartMods: StartMods, + EndMods: EndMods, + }; + KinkyDungeonSendEvent("beforeMeshDestroy", data); + MC.Update.delete(containerID); + MC.Refresh.delete(containerID); + //console.log("Refreshed!") + // Refresh the container! + DrawCanvas.removeChild(MC.Containers.get(containerID).Mesh); + MC.Containers.get(containerID).Container.destroy(); + //MC.Containers.get(containerID).Mesh.destroy(); + KDMeshToDestroy.push(MC.Containers.get(containerID).Mesh); + KDRenderTexToDestroy.push(MC.Containers.get(containerID).RenderTexture); + MC.Containers.delete(containerID); + MC.ContainersDrawn.delete(containerID); + refreshfilters = true; + if (KDGlobalFilterCacheRefresh) { + KDGlobalFilterCacheRefresh = false; + for (let fce of KDAdjustmentFilterCache.entries()) { + let fc = fce[1]; + for (let f of fc) { + if (!KDFilterDrawn.get(f)) { + KDFilterCacheToDestroy.push(f); + fc.splice(fc.indexOf(f), 1); + } + } + if (fc.length == 0) KDAdjustmentFilterCache.delete(fce[0]); + } + KDFilterDrawn = new Map(); + } + + } + let created = false; + if (!MC.Containers.get(containerID)) { + + let RT = PIXI.RenderTexture.create({ width: MODELWIDTH*MODEL_SCALE * 2 * Zoom, height: MODELHEIGHT*MODEL_SCALE * 2 * Zoom, resolution: resolution*(KDToggles.HiResModel ? 2 : 1)}); + let Mesh = new PIXI.SimplePlane(RT, 10, 10); + let Container = { + Container: new PIXI.Container(), + Mesh: Mesh,//Mesh(new PIXI.PlaneGeometry(MODELWIDTH*MODEL_SCALE,MODELHEIGHT*MODEL_SCALE, 100, 100), new PIXI.MeshMaterial(PIXI.Texture.WHITE)), + SpritesDrawn: new Map(), + RenderTexture: RT, + SpriteList: new Map(), + Matrix: Object.assign([], Mesh.geometry.getBuffer('aVertexPosition').data), + Zoom: Zoom, + }; + + //Container.Container.scale.x = 1; + //Container.Container.scale.y = 1; + Container.Mesh.scale.x = 1; + Container.Mesh.scale.y = 1; + //console.log("Matrix: " + Container.Matrix); + Container.Mesh.zIndex = 1; + Container.Mesh.pivot.set(MODELWIDTH*MODEL_SCALE * 1 * Zoom, MODELHEIGHT*MODEL_SCALE * 1 * Zoom); + created = true; + MC.Containers.set(containerID, Container); + DrawCanvas.addChild(Container.Mesh); + Container.Container.sortableChildren = true; + //Container.Container.cacheAsBitmap = true; + if (zIndex) Container.Mesh.zIndex = zIndex; + let data = { + Character: Character, + ContainerInfo: Container, + zIndex: zIndex, + x: X, + y: Y, + Blend: Blend, + StartMods: StartMods, + EndMods: EndMods, + }; + KinkyDungeonSendEvent("meshCreate", data); + //Container.Container.filterArea = new PIXI.Rectangle(0,0,MODELWIDTH*MODEL_SCALE,MODELHEIGHT*MODEL_SCALE); + } + + // Actual loop for drawing the models on the character + + if (!MC.Update.has(containerID)) { + let flippedPoses = DrawModelProcessPoses(MC, extraPoses); + + if (PIXI.BaseTexture.defaultOptions.scaleMode != Blend) PIXI.BaseTexture.defaultOptions.scaleMode = Blend; + let modified = DrawCharacterModels(containerID, + MC, X + Zoom * MODEL_SCALE * MODELHEIGHT * 0.25, + Y + Zoom * MODEL_SCALE * MODELHEIGHT/2, + (Zoom * MODEL_SCALE) || MODEL_SCALE, StartMods, + MC.Containers.get(containerID), refreshfilters, flip, EndMods); + let oldBlend = PIXI.BaseTexture.defaultOptions.scaleMode; + MC.Mods.set(containerID, StartMods); + MC.EndMods.set(containerID, EndMods); + MC.Update.add(containerID); + + let Container = MC.Containers.get(containerID); + // Cull sprites that weren't drawn yet + + modified = KDCullModelContainerContainer(MC, containerID) || modified; + + // We only refresh if it actually needs to be updated + if (!MC.ForceUpdate.has(containerID)) modified = true; // Force refresh if we are forced to + + for (let pose of [...Object.keys(MC.Poses), ...Object.keys(MC.TempPoses)]) { + if (PoseProperties[pose]?.flip) { + flip = !flip; + break; + } + } + + + if (flip && Container.Mesh?.scale.x > 0) { + Container.Mesh.scale.x *= -1; + modified = true; + } + else if (!flip && Container.Mesh?.scale.x < 0) { + Container.Mesh.scale.x *= -1; + modified = true; + } + + if (modified && !created) { + MC.Refresh.add(containerID); + MC.Update.delete(containerID); + } else if (modified) { + if (PIXI.BaseTexture.defaultOptions.scaleMode != oldBlend) + PIXI.BaseTexture.defaultOptions.scaleMode = oldBlend; + + + + + + //Container.Container.pivot.set(-MODELWIDTH*MODEL_SCALE * Container.Container.scale.x * 0.25 * Zoom, -MODELHEIGHT*MODEL_SCALE * Container.Container.scale.y * 0.25 * Zoom); + //Container.Mesh.x += Container.Container.pivot.x; + //Container.Mesh.y += Container.Container.pivot.y; + //if (MC.Containers.get(containerID).RenderTexture) + if (MC.Containers.get(containerID).RenderTexture) { + RenderModelContainer(MC, C, containerID); + } + } + Container.SpritesDrawn.clear(); + + for (let p of flippedPoses) { + delete MC.Poses[p]; + } + } + + // Update the updated array + if (!MC.ContainersDrawn.get(containerID)) { + MC.ContainersDrawn.set(containerID, MC.Containers.get(containerID)); + if (!MC.Refresh.has(containerID)) + // We only update if we are not planning to refresh next turn + MC.Update.add(containerID); + } + + // Store it in the map so we don't have to create it again + if (!KDCurrentModels.get(C)) { + KDCurrentModels.set(C, MC); + } + + // Move mesh + if (MC.Containers.get(containerID)) { + MC.Containers.get(containerID).Mesh.x = X + Zoom * MODEL_SCALE * MODELHEIGHT * 0.25; + MC.Containers.get(containerID).Mesh.y = Y + Zoom * MODEL_SCALE * MODELHEIGHT * 0.5; + } +} +/** Future function */ +let DrawModel = DrawCharacter; + +function LayerIsHidden(MC: ModelContainer, l: ModelLayer, m: Model, Mods) : boolean { + if (l.LockLayer && !m.LockType) return true; + if (MC.HiddenLayers && MC.HiddenLayers[LayerLayer(MC, l, m, Mods)]) return true; + + if (l.HidePoseConditional?.some((entry) => { + return ( + !entry[2] + || !m.Properties + || (!m.Properties[KDLayerPropName(l, MC.Poses)] + && !(m.Properties[l.Name] || m.Properties[l.InheritColor])) + || ((!m.Properties[KDLayerPropName(l, MC.Poses)] + || !m.Properties[KDLayerPropName(l, MC.Poses)][entry[2]]) + && (!(m.Properties[l.Name] || m.Properties[l.InheritColor]) + || !(m.Properties[l.Name] || m.Properties[l.InheritColor])[entry[2]]) + ) + ) + && ( + MC.Poses[entry[0]]) + && !(MC.Poses[entry[1]] + ); + })) return true; + + return false; +} + +function LayerLayer(MC: ModelContainer, l: ModelLayer, m: Model, Mods?) : string { + let layer = l.Layer; + if (l.SwapLayerPose) { + for (let p of Object.entries(l.SwapLayerPose)) { + if (MC.Poses[p[0]]) { + layer = p[1]; + break; + } + } + } + if (l.PrependLayerPrefix) { + for (let p of Object.entries(l.PrependLayerPrefix)) { + if (MC.Poses[p[0]]) return p[1] + layer; + } + } + return layer; +} + +function LayerPri(MC: ModelContainer, l: ModelLayer, m: Model, Mods?) : number { + if (l.SwapPriorityPose) { + for (let p of Object.entries(l.SwapPriorityPose)) { + if (MC.Poses[p[0]] || MC.TempPoses[p[0]]) return p[1]; + } + } + let temp = l.Pri; + if (l.AddPriWithPose) { + for (let p of Object.entries(l.AddPriWithPose)) { + if (MC.Poses[p[0]] || MC.TempPoses[p[0]]) temp += p[1]; + } + } + let Properties: LayerPropertiesType = m.Properties; + let lyr = l.InheritColor || l.Name; + if (Properties && Properties[lyr]) { + if (Properties[lyr].LayerBonus) temp += Properties[lyr].LayerBonus; + } + let oldProp = lyr; + lyr = KDLayerPropName(l, MC.Poses); + if (oldProp != lyr && Properties && Properties[lyr]) { + if (Properties[lyr].LayerBonus) temp += Properties[lyr].LayerBonus; + } + + return temp; +} + +function KDLayerPropName(l: ModelLayer, Poses: Record): string { + if (l.Poses || l.MorphPoses) { + if (l.Poses) + for (let pose of Object.keys(l.Poses)) { + if (Poses[pose]) return (l.InheritColor || l.Name) + pose; + } + if (l.MorphPoses) + for (let pose of Object.values(l.MorphPoses)) { + if (Poses[pose]) return (l.InheritColor || l.Name) + pose; + } + } + return l.InheritColor || l.Name; +} + +/** + * Setup sprites from the modelcontainer + */ +function DrawCharacterModels(containerID: string, MC: ModelContainer, X, Y, Zoom, + StartMods: PoseMod[], + ContainerContainer, refreshfilters: boolean, flip: boolean, EndMods: PoseMod[]) : boolean { + // We create a list of models to be added + let Models = new Map(MC.Models.entries()); + let modified = false; + + // Create the highestpriority matrix + MC.HighestPriority = {}; + MC.HiddenLayers = {}; + for (let m of Models.values()) { + if (m.HideLayers) { + for (let layer of m.HideLayers) { + MC.HiddenLayers[layer] = 1; + } + } + if (m.HideLayerGroups) { + for (let layergroup of m.HideLayerGroups) { + if (LayerGroups[layergroup]) { + for (let layer of Object.keys(LayerGroups[layergroup])) + MC.HiddenLayers[layer] = 1; + } + + } + } + } + + + for (let m of Models.values()) { + + + for (let l of Object.values(m.Layers)) { + + + let prop: LayerPropertiesType = null; + if (m.Properties) { + prop = (m.Properties[l.Name] || m.Properties[l.InheritColor]); + if (!prop && m.Properties[KDLayerPropName(l, MC.Poses)]) { + prop = m.Properties[KDLayerPropName(l, MC.Poses)]; + } else if (prop) { + Object.assign(prop, m.Properties[KDLayerPropName(l, MC.Poses)]); + } + } + + let Mods = [...(StartMods || []), ...(EndMods || [])] + let pri = LayerPri(MC, l, m, Mods); + if (!l.DontAlwaysOverride && LayerIsHidden(MC, l, m, Mods)) continue; + + + if (!l.NoOverride && !(prop?.NoOverride != undefined && prop.NoOverride == 1)) { + let layer = LayerLayer(MC, l, m, Mods); + MC.HighestPriority[layer] = Math.max(MC.HighestPriority[layer] || -500, pri || -500); + } + if (l.CrossHideOverride) { + if (l.HideOverrideLayerMulti) { + for (let hideGroup of l.HideOverrideLayerMulti) { + for (let hideLayer of Object.keys(LayerGroups[hideGroup])) { + MC.HighestPriority[hideLayer] = Math.max(MC.HighestPriority[hideLayer] || -500, pri || -500); + } + } + } + if (l.HideOverrideLayer) + MC.HighestPriority[l.HideOverrideLayer] = Math.max(MC.HighestPriority[l.HideOverrideLayer] || -500, pri || -500); + } + } + } + + + + + + // TODO hide, filtering based on pose, etc etc + let {X_Offset, Y_Offset} = ModelGetPoseOffsets(MC.Poses, flip); + let {rotation, X_Anchor, Y_Anchor} = ModelGetPoseRotation(MC.Poses); + let mods = ModelGetPoseMods(MC.Poses); + let totalMods: {[_: string]: PoseMod[]} = {}; + let endMods: {[_: string]: PoseMod[]} = {}; + ContainerContainer.Container.angle = rotation; + ContainerContainer.Container.pivot.x = MODELWIDTH*Zoom * X_Anchor + MODEL_XOFFSET*Zoom; + ContainerContainer.Container.pivot.y = MODELHEIGHT*Zoom * Y_Anchor; + ContainerContainer.Container.x = (MODELWIDTH * (1 + X_Offset)) * Zoom + MODEL_XOFFSET*Zoom; + ContainerContainer.Container.y = (MODELHEIGHT * (1 + Y_Offset)) * Zoom; + ContainerContainer.Mesh.x = X; + ContainerContainer.Mesh.y = Y; + + for (let m of StartMods) { + if (!mods[m.Layer]) mods[m.Layer] = []; + mods[m.Layer].push(m); + if (!totalMods[m.Layer]) totalMods[m.Layer] = []; + totalMods[m.Layer].push(m); + } + + + if (EndMods) + for (let m of EndMods) { + if (!endMods[m.Layer]) endMods[m.Layer] = []; + endMods[m.Layer].push(m); + if (!totalMods[m.Layer]) totalMods[m.Layer] = []; + totalMods[m.Layer].push(m); + } + + + + let drawLayers: Record = {}; + + // Yes we draw these layers + for (let m of Models.values()) { + for (let l of Object.values(m.Layers)) { + if (!LayerIsHidden(MC, l, m, totalMods)) + drawLayers[m.Name + "," + l.Name] = ModelDrawLayer(MC, m, l, MC.Poses); + } + } + + + // Create the layer extra filter matrix + let ExtraFilters: Record = {}; + let DisplaceFilters: Record = {}; + //let OcclusionFilters: Record = {}; + let DisplaceFiltersInUse: Record = {}; + let DisplaceFilterAmt: Record = {}; + //let OcclusionFiltersInUse = {}; + let EraseFilters: Record = {}; + let EraseFiltersInUse: Record = {}; + let EraseFiltersAmt: Record = {}; + for (let m of Models.values()) { + for (let l of Object.values(m.Layers)) { + + + + + + if (!(drawLayers[m.Name + "," + l.Name] && !ModelLayerHidden(drawLayers, MC, m, l, MC.Poses))) continue; + // Apply filter + if (l.ApplyFilterToLayerGroup) { + for (let lg of Object.entries(l.ApplyFilterToLayerGroup)) { + for (let ll of Object.entries(LayerGroups[lg[0]])) { + if (!ExtraFilters[ll[0]]) ExtraFilters[ll[0]] = []; + ExtraFilters[ll[0]].push(m.Filters[l.ApplyFilter || l.InheritColor || l.Name]); + } + } + } + + let lyr = KDLayerPropName(l, MC.Poses); + // Apply occlusion + /*if (l.OccludeLayers + && (!l.OccludePoses + || l.OccludePoses.some((pose) => {return MC.Poses[pose];})) + && (!l.OccludePosesExclude + || l.OccludePosesExclude.every((pose) => {return !MC.Poses[pose];})) + ) { + let transform = new Transform(); + + let layer = LayerLayer(MC, l, m, totalMods); + + + while (layer) { + let mod_selected: PoseMod[] = mods[layer] || []; + for (let mod of mod_selected) { + transform = transform.recursiveTransform( + mod.offset_x || 0, + mod.offset_y || 0, + mod.rotation_x_anchor ? mod.rotation_x_anchor : 0, + mod.rotation_y_anchor ? mod.rotation_y_anchor : 0, + mod.scale_x || 1, + mod.scale_y || 1, + (mod.rotation * Math.PI / 180) || 0 + ); + } + layer = LayerProperties[layer]?.Parent; + } + + let Properties: LayerProperties = m.Properties ? m.Properties[lyr] : undefined; + if (Properties) { + transform = transform.recursiveTransform( + Properties.XOffset || 0, + Properties.YOffset || 0, + Properties.XPivot || 0, + Properties.YPivot || 0, + Properties.XScale || 1, + Properties.YScale || 1, + (Properties.Rotation * Math.PI / 180) || 0 + ); + } + let oldProps = Properties; + Properties = m.Properties ? (m.Properties[l.Name] || m.Properties[l.InheritColor]) : undefined; + if (Properties && oldProps != Properties) { + transform = transform.recursiveTransform( + Properties.XOffset || 0, + Properties.YOffset || 0, + Properties.XPivot || 0, + Properties.YPivot || 0, + Properties.XScale || 1, + Properties.YScale || 1, + (Properties.Rotation * Math.PI / 180) || 0 + ); + } + layer = LayerLayer(MC, l, m, totalMods); + while (layer) { + let mod_selected: PoseMod[] = endMods[layer] || []; + for (let mod of mod_selected) { + transform = transform.recursiveTransform( + mod.offset_x || 0, + mod.offset_y || 0, + mod.rotation_x_anchor ? mod.rotation_x_anchor : 0, + mod.rotation_y_anchor ? mod.rotation_y_anchor : 0, + mod.scale_x || 1, + mod.scale_y || 1, + (mod.rotation * Math.PI / 180) || 0 + ); + } + layer = LayerProperties[layer]?.Parent; + } + + for (let ll of Object.entries(l.OccludeLayers)) { + let id = "occ_" + ModelLayerString(m, l, MC.Poses); + + let zzz = (l.DisplaceZBonus || 0)*LAYER_INCREMENT-ModelLayers[LayerLayer(MC, l, m, totalMods)] + (LayerPri(MC, l, m, totalMods) || 0); + if (OcclusionFiltersInUse[id] != undefined && OcclusionFiltersInUse[id] < zzz) { + OcclusionFiltersInUse[id] = zzz; + for (let dg of Object.keys(LayerGroups[ll[0]])) { + if (OcclusionFilters[dg]) + for (let ft of OcclusionFilters[dg]) { + if (ft.id == id && ft.zIndex < zzz) { + ft.zIndex = zzz; + } + } + } + continue; + } + OcclusionFiltersInUse[id] = zzz; + + for (let dg of Object.keys(LayerGroups[ll[0]])) { + if (!OcclusionFilters[dg]) OcclusionFilters[dg] = []; + + let tt = transform; + if (KDOptimizeDisplacementMapInfo[id]) { + tt = new Transform( + tt.ox, + tt.oy, + tt.ax, + tt.ay, + tt.sx, + tt.sy, + tt.rot, + ).recursiveTransform( + KDOptimizeDisplacementMapInfo[id].xPad || 0, + KDOptimizeDisplacementMapInfo[id].yPad || 0, + 0, + 0, + 1, + 1, + 0 + ); + } + + let ox = tt.ox; + let oy = tt.oy; + let ax = tt.ax; + let ay = tt.ay; + let sx = tt.sx; + let sy = tt.sy; + let rot = tt.rot; + let img = ModelLayerString(m, l, MC.Poses); + OcclusionFilters[dg].push( + { + amount: (l.OccludeAmount || 1) * Zoom, + hash: id + m.Name + "," + l.Name, + zIndex: zzz, + id: id, + spriteName: img, + sprite: KDDrawRT( + ContainerContainer.Container, + ContainerContainer.SpriteList, + id, img, + img, + ox * Zoom, oy * Zoom, undefined, undefined, + rot, { + zIndex: zzz, + anchorx: (ax - (l.OffsetX/MODELWIDTH || 0)) * (l.AnchorModX || 1), + anchory: (ay - (l.OffsetY/MODELHEIGHT || 0)) * (l.AnchorModY || 1), + scalex: sx != 1 ? sx : undefined, + scaley: sy != 1 ? sy : undefined, + alpha: 0.0, + cullable: KDCulling, + }, false, + ContainerContainer.SpritesDrawn, + Zoom, undefined, undefined, true, false + ), + } + ); + } + + } + }*/ + + let dAmount = 1; + let eAmount = 1; + + let filter = m.Filters ? m.Filters[l.InheritColor || l.Name] : + undefined; + if (filter?.alpha != undefined && filter.alpha < 0.8) { + dAmount = 0; + eAmount = 0; + } + + + // Apply displacement + if (l.DisplaceLayers + && (!l.DisplacementPoses + || l.DisplacementPoses.some((pose) => {return MC.Poses[pose];})) + && (!l.DisplacementPosesExclude + || l.DisplacementPosesExclude.every((pose) => {return !MC.Poses[pose];})) + ) { + let transform = new Transform(); + + let layer = LayerLayer(MC, l, m, totalMods); + + while (layer) { + let mod_selected: PoseMod[] = mods[layer] || []; + for (let mod of mod_selected) { + transform = transform.recursiveTransform( + mod.offset_x || 0, + mod.offset_y || 0, + mod.rotation_x_anchor ? mod.rotation_x_anchor : 0, + mod.rotation_y_anchor ? mod.rotation_y_anchor : 0, + mod.scale_x || 1, + mod.scale_y || 1, + (mod.rotation * Math.PI / 180) || 0 + ); + } + layer = LayerProperties[layer]?.Parent; + } + + let Properties: LayerPropertiesType = m.Properties ? m.Properties[lyr] : undefined; + if (Properties) { + if (Properties.DisplaceAmount != undefined) { + if (dAmount == 0) dAmount = 1; + dAmount *= Properties.DisplaceAmount; + } + if (Properties.EraseAmount != undefined) { + if (eAmount == 0) eAmount = 1; + eAmount *= Properties.EraseAmount; + } + transform = transform.recursiveTransform( + Properties.XOffset || 0, + Properties.YOffset || 0, + Properties.XPivot || 0, + Properties.YPivot || 0, + Properties.XScale || 1, + Properties.YScale || 1, + (Properties.Rotation * Math.PI / 180) || 0 + ); + } + let oldProps = Properties; + Properties = m.Properties ? (m.Properties[l.Name] || m.Properties[l.InheritColor]) : undefined; + if (Properties && oldProps != Properties) { + if (Properties.DisplaceAmount != undefined) { + if (dAmount == 0) dAmount = 1; + dAmount *= Properties.DisplaceAmount; + } + if (Properties.EraseAmount != undefined) { + if (eAmount == 0) eAmount = 1; + eAmount *= Properties.EraseAmount; + } + transform = transform.recursiveTransform( + Properties.XOffset || 0, + Properties.YOffset || 0, + Properties.XPivot || 0, + Properties.YPivot || 0, + Properties.XScale || 1, + Properties.YScale || 1, + (Properties.Rotation * Math.PI / 180) || 0 + ); + } + layer = LayerLayer(MC, l, m, totalMods); + while (layer) { + let mod_selected: PoseMod[] = endMods[layer] || []; + for (let mod of mod_selected) { + transform = transform.recursiveTransform( + mod.offset_x || 0, + mod.offset_y || 0, + mod.rotation_x_anchor ? mod.rotation_x_anchor : 0, + mod.rotation_y_anchor ? mod.rotation_y_anchor : 0, + mod.scale_x || 1, + mod.scale_y || 1, + (mod.rotation * Math.PI / 180) || 0 + ); + } + layer = LayerProperties[layer]?.Parent; + } + + for (let ll of Object.entries(l.DisplaceLayers)) { + let id = ModelLayerStringCustom(m, l, MC.Poses, l.DisplacementSprite, + "DisplacementMaps", false, l.DisplacementInvariant, + l.DisplacementMorph, l.NoAppendDisplacement); + + let zzz = (l.DisplaceZBonus || 0)*LAYER_INCREMENT-ModelLayers[LayerLayer(MC, l, m, totalMods)] + (LayerPri(MC, l, m, totalMods) || 0); + if (DisplaceFiltersInUse[id] != undefined && DisplaceFiltersInUse[id] < zzz) { + DisplaceFiltersInUse[id] = zzz; + for (let dg of Object.keys(LayerGroups[ll[0]])) { + if (DisplaceFilters[dg]) + for (let ft of DisplaceFilters[dg]) { + if (ft.id == id && ft.zIndex < zzz) { + ft.zIndex = zzz; + } + } + } + continue; + } + if (dAmount == 0) continue; + DisplaceFiltersInUse[id] = zzz; + + for (let dg of Object.keys(LayerGroups[ll[0]])) { + if (!DisplaceFilters[dg]) DisplaceFilters[dg] = []; + DisplaceFilterAmt[id + dg] = Math.max( + dAmount * (l.DisplaceAmount || 50) * Zoom, + DisplaceFilterAmt[id + dg] || 0, + ) + + let tt = transform; + if (KDOptimizeDisplacementMapInfo[id]) { + tt = new Transform( + tt.ox, + tt.oy, + tt.ax, + tt.ay, + tt.sx, + tt.sy, + tt.rot, + ).recursiveTransform( + KDOptimizeDisplacementMapInfo[id].xPad || 0, + KDOptimizeDisplacementMapInfo[id].yPad || 0, + 0, + 0, + 1, + 1, + 0 + ); + } + + let ox = tt.ox; + let oy = tt.oy; + let ax = tt.ax; + let ay = tt.ay; + let sx = tt.sx; + let sy = tt.sy; + let rot = tt.rot; + + DisplaceFilters[dg].push( + { + amount: DisplaceFilterAmt[id + dg], + hash: id + m.Name + "," + l.Name, + zIndex: zzz, + id: id, + spriteName: l.DisplacementSprite, + sprite: KDDrawRT( + ContainerContainer.Container, + ContainerContainer.SpriteList, + id, id, + id, + ox * Zoom, oy * Zoom, undefined, undefined, + rot, { + zIndex: zzz, + anchorx: (ax - (l.OffsetX/MODELWIDTH || 0)) * (l.AnchorModX || 1), + anchory: (ay - (l.OffsetY/MODELHEIGHT || 0)) * (l.AnchorModY || 1), + scalex: sx != 1 ? sx : undefined, + scaley: sy != 1 ? sy : undefined, + alpha: 0.0, + cullable: KDCulling, + }, false, + ContainerContainer.SpritesDrawn, + Zoom, undefined, undefined, true, false + ), + } + ); + } + + } + } + // Apply erase + if (l.EraseLayers + && (!l.ErasePoses + || l.ErasePoses.some((pose) => {return MC.Poses[pose];})) + && (!l.ErasePosesExclude + || l.ErasePosesExclude.every((pose) => {return !MC.Poses[pose];})) + ) { + let transform = new Transform(); + + let layer = LayerLayer(MC, l, m, totalMods); + + while (layer) { + let mod_selected: PoseMod[] = mods[layer] || []; + for (let mod of mod_selected) { + transform = transform.recursiveTransform( + mod.offset_x || 0, + mod.offset_y || 0, + mod.rotation_x_anchor ? mod.rotation_x_anchor : 0, + mod.rotation_y_anchor ? mod.rotation_y_anchor : 0, + mod.scale_x || 1, + mod.scale_y || 1, + (mod.rotation * Math.PI / 180) || 0 + ); + } + layer = LayerProperties[layer]?.Parent; + } + + let Properties: LayerPropertiesType = m.Properties ? m.Properties[lyr] : undefined; + if (Properties) { + if (Properties.DisplaceAmount != undefined) { + if (dAmount == 0) dAmount = 1; + dAmount *= Properties.DisplaceAmount; + } + if (Properties.EraseAmount != undefined) { + if (eAmount == 0) eAmount = 1; + eAmount *= Properties.EraseAmount; + } + transform = transform.recursiveTransform( + Properties.XOffset || 0, + Properties.YOffset || 0, + Properties.XPivot || 0, + Properties.YPivot || 0, + Properties.XScale || 1, + Properties.YScale || 1, + (Properties.Rotation * Math.PI / 180) || 0 + ); + } + let oldProps = Properties; + Properties = m.Properties ? (m.Properties[l.Name] || m.Properties[l.InheritColor]) : undefined; + if (Properties && oldProps != Properties) { + if (Properties.DisplaceAmount != undefined) { + if (dAmount == 0) dAmount = 1; + dAmount *= Properties.DisplaceAmount; + } + if (Properties.EraseAmount != undefined) { + if (eAmount == 0) eAmount = 1; + eAmount *= Properties.EraseAmount; + } + transform = transform.recursiveTransform( + Properties.XOffset || 0, + Properties.YOffset || 0, + Properties.XPivot || 0, + Properties.YPivot || 0, + Properties.XScale || 1, + Properties.YScale || 1, + (Properties.Rotation * Math.PI / 180) || 0 + ); + } + layer = LayerLayer(MC, l, m, totalMods); + while (layer) { + let mod_selected: PoseMod[] = endMods[layer] || []; + for (let mod of mod_selected) { + transform = transform.recursiveTransform( + mod.offset_x || 0, + mod.offset_y || 0, + mod.rotation_x_anchor ? mod.rotation_x_anchor : 0, + mod.rotation_y_anchor ? mod.rotation_y_anchor : 0, + mod.scale_x || 1, + mod.scale_y || 1, + (mod.rotation * Math.PI / 180) || 0 + ); + } + layer = LayerProperties[layer]?.Parent; + } + + for (let ll of Object.entries(l.EraseLayers)) { + let id = ModelLayerStringCustom(m, l, MC.Poses, l.EraseSprite, "DisplacementMaps", false, l.EraseInvariant, l.EraseMorph, l.NoAppendErase); + let zzz = (l.EraseZBonus || 0)*LAYER_INCREMENT -ModelLayers[LayerLayer(MC, l, m, totalMods)] + (LayerPri(MC, l, m, totalMods) || 0); + if (EraseFiltersInUse[id] != undefined && EraseFiltersInUse[id] < zzz) { + EraseFiltersInUse[id] = zzz; + for (let dg of Object.keys(LayerGroups[ll[0]])) { + if (EraseFilters[dg]) + for (let ft of EraseFilters[dg]) { + if (ft.id == id && ft.zIndex < zzz) { + ft.zIndex = zzz; + } + } + } + continue; + } + if (eAmount == 0) continue; + EraseFiltersInUse[id] = zzz; + + + for (let dg of Object.keys(LayerGroups[ll[0]])) { + if (!EraseFilters[dg]) EraseFilters[dg] = []; + EraseFiltersAmt[id + dg] = Math.max( + eAmount * (l.EraseAmount || 50) * Zoom, + EraseFiltersAmt[id + dg] || 0, + ) + + let tt = transform; + if (KDOptimizeDisplacementMapInfo[id]) { + tt = new Transform( + tt.ox, + tt.oy, + tt.ax, + tt.ay, + tt.sx, + tt.sy, + tt.rot, + ).recursiveTransform( + KDOptimizeDisplacementMapInfo[id].xPad || 0, + KDOptimizeDisplacementMapInfo[id].yPad || 0, + 0, + 0, + 1, + 1, + 0 + ); + } + + let ox = tt.ox; + let oy = tt.oy; + let ax = tt.ax; + let ay = tt.ay; + let sx = tt.sx; + let sy = tt.sy; + let rot = tt.rot; + + + EraseFilters[dg].push( + { + amount: EraseFiltersAmt[id + dg], + hash: id + m.Name + "," + l.Name, + id: id, + spriteName: l.EraseSprite, + zIndex: zzz, + sprite: KDDrawRT( + ContainerContainer.Container, + ContainerContainer.SpriteList, + id, id, + id, + ox * Zoom, oy * Zoom, undefined, undefined, + rot, { + zIndex: zzz, + anchorx: (ax - (l.OffsetX/MODELWIDTH || 0)) * (l.AnchorModX || 1), + anchory: (ay - (l.OffsetY/MODELHEIGHT || 0)) * (l.AnchorModY || 1), + scalex: sx != 1 ? sx : undefined, + scaley: sy != 1 ? sy : undefined, + alpha: 0.0, + cullable: KDCulling, + }, false, + ContainerContainer.SpritesDrawn, + Zoom, undefined, undefined, true, false + ), + } + ); + } + + } + } + } + } + + // Add Xray filters now + if (MC.XRayFilters) { + let EraseAmount = 50; + for (let x of MC.XRayFilters) { + if (LayerGroups[x]) { + for (let dg of Object.keys(LayerGroups[x])) { + if (!EraseFilters[dg]) EraseFilters[dg] = []; + EraseFilters[dg].push( + { + amount: EraseAmount, + hash: x, + id: 'ef' + x, + sprite: KDDrawRT( + ContainerContainer.Container, + ContainerContainer.SpriteList, + "xrayfilter_" + x, "xrayfilter_" + x, + "DisplacementMaps/" + x + ".png", + 0, 0, undefined, undefined, + 0, { + zIndex: 1000000, + alpha: 0.0, + cullable: KDCulling, + }, false, + ContainerContainer.SpritesDrawn, + Zoom, undefined, undefined, true, false + ), + } + ); + } + } + } + } + + + let f = null; + + // Now that we have the final list of models we do a KDDraw + for (let m of Models.values()) { + for (let l of Object.values(m.Layers)) { + if (drawLayers[m.Name + "," + l.Name] && !ModelLayerHidden(drawLayers, MC, m, l, MC.Poses)) { + + let layer = LayerLayer(MC, l, m, totalMods); + let origlayer = layer; + + let transform = new Transform(); + + while (layer) { + let mod_selected: PoseMod[] = mods[layer] || []; + for (let mod of mod_selected) { + transform = transform.recursiveTransform( + mod.offset_x || 0, + mod.offset_y || 0, + mod.rotation_x_anchor ? mod.rotation_x_anchor : 0, + mod.rotation_y_anchor ? mod.rotation_y_anchor : 0, + mod.scale_x || 1, + mod.scale_y || 1, + (mod.rotation * Math.PI / 180) || 0 + ); + } + layer = LayerProperties[layer]?.Parent; + } + + let Properties: LayerPropertiesType = m.Properties ? m.Properties[KDLayerPropName(l, MC.Poses)] : undefined; + if (Properties) { + transform = transform.recursiveTransform( + Properties.XOffset || 0, + Properties.YOffset || 0, + Properties.XPivot || 0, + Properties.YPivot || 0, + Properties.XScale || 1, + Properties.YScale || 1, + (Properties.Rotation * Math.PI / 180) || 0 + ); + } + let oldProps = Properties; + Properties = m.Properties ? (m.Properties[l.Name] || m.Properties[l.InheritColor]) : undefined; + if (Properties && oldProps != Properties) { + transform = transform.recursiveTransform( + Properties.XOffset || 0, + Properties.YOffset || 0, + Properties.XPivot || 0, + Properties.YPivot || 0, + Properties.XScale || 1, + Properties.YScale || 1, + (Properties.Rotation * Math.PI / 180) || 0 + ); + } + + + layer = LayerLayer(MC, l, m, totalMods); + while (layer) { + let mod_selected: PoseMod[] = endMods[layer] || []; + for (let mod of mod_selected) { + transform = transform.recursiveTransform( + mod.offset_x || 0, + mod.offset_y || 0, + mod.rotation_x_anchor ? mod.rotation_x_anchor : 0, + mod.rotation_y_anchor ? mod.rotation_y_anchor : 0, + mod.scale_x || 1, + mod.scale_y || 1, + (mod.rotation * Math.PI / 180) || 0 + ); + } + layer = LayerProperties[layer]?.Parent; + } + + let ox = transform.ox; + let oy = transform.oy; + let ax = transform.ax; + let ay = transform.ay; + let sx = transform.sx; + let sy = transform.sy; + let rot = transform.rot; + + + let fhash = (m.Filters ? (m.Filters[l.InheritColor || l.Name] ? FilterHash(m.Filters[l.InheritColor || l.Name]) : "") : ""); + let fh = containerID + fhash; + + let filter = m.Filters ? (m.Filters[l.InheritColor || l.Name] ? + ((KDAdjustmentFilterCache.get(fh)) || [adjustFilter(m.Filters[l.InheritColor || l.Name])]) + : undefined) : undefined; + if (filter && !KDAdjustmentFilterCache.get(fh)) { + KDAdjustmentFilterCache.set(containerID + FilterHash(m.Filters[l.InheritColor || l.Name]), filter); + } + + let extrafilter: PIXIFilter[] = []; + let zz = -ModelLayers[origlayer] + (LayerPri(MC, l, m, totalMods) || 0); + // Add extrafilters + if (ExtraFilters[origlayer]) { + for (let ef of ExtraFilters[origlayer]) { + let efh = containerID + FilterHash(ef) + if (refreshfilters) { + KDAdjustmentFilterCache.delete(containerID + FilterHash(ef)); + } + f = new PIXI.filters.AdjustmentFilter(ef); + f.multisample = 0; + let efilter = (KDAdjustmentFilterCache.get(efh) || [f]); + if (efilter && !KDAdjustmentFilterCache.get(efh)) { + KDAdjustmentFilterCache.set(containerID + FilterHash(ef), efilter); + } + extrafilter.push(...efilter); + } + } + // Add erase filters BEFORE displacement + if (!l.NoErase && EraseFilters[origlayer]) { + for (let ef of EraseFilters[origlayer]) { + if (!ef.sprite) continue; + if (ef.spriteName != undefined && ef.spriteName == l.EraseSprite) continue; + if (ef.zIndex != undefined && ef.zIndex - (l.EraseZBonus || 0) <= zz + 0.01) continue; + let efh = containerID + "ers_" + ef.hash; + let dsprite = ef.sprite; + if (refreshfilters) { + KDAdjustmentFilterCache.delete(efh); + } + KDTex(dsprite.name, false); // try to preload it + if (!KDAdjustmentFilterCache.get(efh)) { + f = new EraseFilter( + dsprite, + ); + + KDSetFilterSprite({hash: efh, filter: f}, dsprite); + f.multisample = 0; + } + let efilter = (KDAdjustmentFilterCache.get(efh) || [f]); + if (efilter && !KDAdjustmentFilterCache.get(efh)) { + KDAdjustmentFilterCache.set(efh, efilter); + } + extrafilter.push(...efilter); + } + } + + // Add displacement filters + if (!l.NoDisplace && DisplaceFilters[origlayer]) { + for (let ef of DisplaceFilters[origlayer]) { + if (!ef.sprite) continue; + if (ef.spriteName != undefined && ef.spriteName == l.DisplacementSprite) continue; + if (ef.zIndex != undefined && ef.zIndex - (l.DisplaceZBonus || 0) <= zz + 0.01) continue; + let efh = containerID + "disp_" + ef.hash; + let dsprite = ef.sprite; + if (refreshfilters) { + KDAdjustmentFilterCache.delete(efh); + } + KDTex(dsprite.name, false); // try to preload it + if (!KDAdjustmentFilterCache.get(efh)) { + f = new DisplaceFilter( + dsprite, + ef.amount, + ); + //Unneeded because its already in the filter cache + KDSetFilterSprite({hash: efh, filter: f}, dsprite); + f.multisample = 0; + } + + let efilter = (KDAdjustmentFilterCache.get(efh) || [f]); + if (efilter && !KDAdjustmentFilterCache.get(efh)) { + KDAdjustmentFilterCache.set(efh, efilter); + } + extrafilter.push(...efilter); + } + } + // Add occlusion filters AFTER displacement + /*if (!l.NoErase && OcclusionFilters[origlayer]) { + for (let ef of OcclusionFilters[origlayer]) { + if (!ef.sprite) continue; + if (ef.spriteName != undefined && ef.spriteName == l.EraseSprite) continue; + if (ef.zIndex != undefined && ef.zIndex - (l.DisplaceZBonus || 0) <= zz + 0.01) continue; + let efh = containerID + "occ_" + ef.hash; + let dsprite = ef.sprite; + if (refreshfilters) { + KDAdjustmentFilterCache.delete(efh); + } + KDTex(dsprite.name, false); // try to preload it + f = new OcclusionFilter( + dsprite, + ); + f.multisample = 0; + let efilter = (KDAdjustmentFilterCache.get(efh) || [f]); + if (efilter && !KDAdjustmentFilterCache.get(efh)) { + KDAdjustmentFilterCache.set(efh, efilter); + } + extrafilter.push(...efilter); + } + }*/ + + let img = ModelLayerString(m, l, MC.Poses); + let id = `layer_${m.Name}_${l.Name}_${img}_${fh}_${Math.round(ax*10000)}_${Math.round(ay*10000)}_${Math.round(rot*1000)}_${Math.round(sx*1000)}_${Math.round(sy*1000)}`; + //id = LZString.compressToBase64(id); + if (!modified && !ContainerContainer.SpriteList.has(id)) modified = true; + let filters = filter; + let origFilters = filter; + if (extrafilter) filters = [...(filter || []), ...extrafilter]; + + for (let filter of filters) { + KDFilterDrawn.set(filter, true); + } + if (KDToggles.OptRender) { + KDDrawRT( + ContainerContainer.Container, + ContainerContainer.SpriteList, + id, fhash, + img, + ox * Zoom, oy * Zoom, undefined, undefined, + rot, { + zIndex: zz, + anchorx: (ax - (l.OffsetX/MODELWIDTH || 0)) * (l.AnchorModX || 1), + anchory: (ay - (l.OffsetY/MODELHEIGHT || 0)) * (l.AnchorModY || 1), + normalizeAnchorX: MODELWIDTH, + normalizeAnchorY: MODELHEIGHT, + scalex: sx != 1 ? sx : undefined, + scaley: sy != 1 ? sy : undefined, + filters: extrafilter, + cullable: KDCulling, + }, false, + ContainerContainer.SpritesDrawn, + Zoom, undefined, origFilters + ); + } else { + KDDraw( + ContainerContainer.Container, + ContainerContainer.SpriteList, + id, + img, + ox * Zoom, oy * Zoom, undefined, undefined, + rot, { + zIndex: zz, + anchorx: (ax - (l.OffsetX/MODELWIDTH || 0)) * (l.AnchorModX || 1), + anchory: (ay - (l.OffsetY/MODELHEIGHT || 0)) * (l.AnchorModY || 1), + normalizeAnchorX: MODELWIDTH, + normalizeAnchorY: MODELHEIGHT, + scalex: sx != 1 ? sx : undefined, + scaley: sy != 1 ? sy : undefined, + filters: filters, + cullable: KDCulling, + }, false, + ContainerContainer.SpritesDrawn, + Zoom, undefined + ); + } + + } + } + } + return modified; +} + +function FilterHash(filter) { + if (!filter) return ""; + let str = ""; + for (let f of Object.values(filter)) str = str + "_" + Math.round((f as number) * 1000); + return str; +} + +const KDAdjustmentFilterCache: Map = new Map(); + +/** + * Determines if we should draw this layer or not + * @param {ModelContainer} MC + * @param {Model} Model + * @param {ModelLayer} Layer + * @param {Record} Poses + * @returns {boolean} + */ +function ModelDrawLayer(MC: ModelContainer, Model: Model, Layer: ModelLayer, Poses: Record): boolean { + // Hide if not highest + let prop: LayerPropertiesType = null; + if (Model.Properties) { + prop = Model.Properties[Layer.InheritColor || Layer.Name]; + if (!prop && Model.Properties[KDLayerPropName(Layer, Poses)]) { + prop = Model.Properties[KDLayerPropName(Layer, Poses)]; + } else if (prop) { + Object.assign(prop, Model.Properties[KDLayerPropName(Layer, Poses)]); + } + } + + if ((Layer.HideWhenOverridden && !(prop?.HideOverridden != undefined && prop?.HideOverridden == 0)) + || (prop?.HideOverridden == 1)) { + if (Layer.HideOverrideLayerMulti && !Layer.ForceSingleOverride) { + for (let hideGroup of Layer.HideOverrideLayerMulti) { + for (let LL of Object.keys(LayerGroups[hideGroup])) { + let priTest = MC.HighestPriority[LL]; + if (priTest > LayerPri(MC, Layer, Model)) return false; + } + } + } else { + let priTest = MC.HighestPriority[Layer.HideOverrideLayer || LayerLayer(MC, Layer, Model)]; + if (priTest > LayerPri(MC, Layer, Model)) return false; + } + } + + // Hide poses + if (Layer.HidePoses) { + for (let p of Object.keys(Poses)) { + if (Layer.HidePoses[p]) { + return false; + } + } + } + if (Model.Properties) { + prop = Model.Properties[Layer.InheritColor || Layer.Name]; + if (!prop && Model.Properties[KDLayerPropName(Layer, Poses)]) { + prop = Model.Properties[KDLayerPropName(Layer, Poses)]; + } else if (prop) { + Object.assign(prop, Model.Properties[KDLayerPropName(Layer, Poses)]); + } + if (prop && prop.ExtraHidePoses) { + for (let p of Object.keys(Poses)) { + if (prop.ExtraHidePoses.includes(p)) { + return false; + } + } + } + if (prop && prop.ExtraRequirePoses) { + for (let p of prop.ExtraRequirePoses) { + if (p && !Poses[p]) { + return false; + } + } + } + } + if (Layer.HidePrefixPose) { + for (let p of Layer.HidePrefixPose) { + if (Poses[p]) { + return false; + } + if (Layer.HidePrefixPoseSuffix) { + for (let suff of Layer.HidePrefixPoseSuffix) { + if (Poses[p + suff]) { + return false; + } + } + } + } + } + if (Model.Properties) { + let prop = Model.Properties[Layer.InheritColor || Layer.Name]; + if (!prop && Model.Properties[KDLayerPropName(Layer, Poses)]) { + prop = Model.Properties[KDLayerPropName(Layer, Poses)]; + } else if (prop) { + Object.assign(prop, Model.Properties[KDLayerPropName(Layer, Poses)]); + } + if (prop && prop.ExtraHidePrefixPose) { + for (let p of prop.ExtraHidePrefixPose) { + if (Poses[p + LayerPri(MC, Layer, Model)]) { + return false; + } + if (prop.ExtraHidePrefixPoseSuffix) { + for (let suff of prop.ExtraHidePrefixPoseSuffix) { + if (Poses[p + suff]) { + return false; + } + } + } + } + } + } + + // Filter poses + if (Layer.Poses) { + let found = false; + for (let p of Object.keys(Poses)) { + if (Layer.Poses[p]) { + found = true; + break; + } + } + if (!found) return false; + } + // Required poses + if (Layer.RequirePoses) { + for (let p of Object.keys(Layer.RequirePoses)) { + if (!Poses[p]) { + return false; + } + } + } + // Conditional hide poses + if (Layer.HidePoseConditional?.some((entry) => { + return ( + !entry[2] + || !Model.Properties + || (!Model.Properties[KDLayerPropName(Layer, Poses)] + && !Model.Properties[Layer.InheritColor || Layer.Name]) + || ((!Model.Properties[KDLayerPropName(Layer, Poses)] + || !Model.Properties[KDLayerPropName(Layer, Poses)][entry[2]]) + && (!Model.Properties[Layer.InheritColor || Layer.Name] + || !Model.Properties[Layer.InheritColor || Layer.Name][entry[2]]) + ) + ) + && ( + Poses[entry[0]]) + && !(Poses[entry[1]] + ); + })) return false; + + // TODO filter hide + return true; +} + +/** + * Determines if we should draw this layer or not + */ +function ModelLayerHidden(drawLayers: {[_: string]: boolean}, MC: ModelContainer, Model: Model, Layer: ModelLayer, Poses: {[_: string]: boolean}): boolean { + // Hide if not highest + if (Layer.TieToLayer) { + if (!drawLayers[Model.Name + "," + Layer.TieToLayer]) return true; + } + return false; +} + +function ModelLayerString(Model: Model, Layer: ModelLayer, Poses: {[_: string]: boolean}): string { + return `${Poses.Back ? "ModelsBack" : "Models"}/${Layer.Folder || Model.Folder}/${LayerSprite(Layer, Poses)}.png`; +} +function ModelLayerStringCustom(Model: Model, Layer: ModelLayer, Poses: {[_: string]: boolean}, Sprite: string, Path: string = "Models", useModelFolder: boolean = true, forceInvariant: boolean = false, forceMorph?: Record, noAppend: boolean = false): string { + if (useModelFolder) + return `${Path}/${Layer.Folder || Model.Folder}/${LayerSpriteCustom(Layer, Poses, Sprite, forceInvariant, forceMorph, noAppend)}.png`; + else + return `${Path}/${LayerSpriteCustom(Layer, Poses, Sprite, forceInvariant, forceMorph, noAppend)}.png`; +} + + + +/** + * Gets the sprite name for a layer for a given pose + */ +function LayerSprite(Layer: ModelLayer, Poses: {[_: string]: boolean}): string { + return LayerSpriteCustom(Layer, Poses, (Layer.Sprite != undefined ? Layer.Sprite : Layer.Name)); +} + +/** +* Gets a sprite formatted for the restraint or object +*/ +function LayerSpriteCustom(Layer: ModelLayer, Poses: {[_: string]: boolean}, Sprite: string, forceInvariant: boolean = false, forceMorph?: Record, noAppend: boolean = false): string { + let pose = ""; + + let foundPose = false; + let MorphPoses = forceMorph || Layer.MorphPoses; + if (forceInvariant && !forceMorph) MorphPoses = undefined; + + // change the pose if its a morph pose, this helps to avoid duplication + let cancel = false; + if (MorphPoses) { + for (let dp of Object.entries(MorphPoses)) { + if (Poses[dp[0]] != undefined) { + pose = dp[1]; + cancel = true; + foundPose = true; + break; + } + } + } + + if (!Layer.Invariant && !forceInvariant) { + // Handle the actual poses + if (Layer.Poses && !cancel) { + // Otherwise we append pose name to layer name + for (let p of Object.keys(Layer.Poses)) { + if (Poses[p] != undefined) { + pose = + ( + ( + !(Layer.GlobalDefaultOverride && Layer.GlobalDefaultOverride[p]) + && PoseProperties[p]) + ? PoseProperties[p].global_default + : p) + || p; + foundPose = true; + break; + } + } + } + + // For simplicity, we can have a global default override and it will add it as a pose to the list + // This helps simplify definitions, like for hogtie + if (!foundPose && !cancel && Layer.GlobalDefaultOverride) { + for (let p of Object.keys(Layer.GlobalDefaultOverride)) { + if (Poses[p] != undefined) { + pose = p; + break; + } + } + } + + } + + if (Layer.AppendPose && !forceInvariant && !noAppend) { + for (let p of Object.entries(Layer.AppendPose)) { + if (Poses[p[0]] != undefined && (!Layer.AppendPoseRequire || Layer.AppendPoseRequire[p[0]])) { + pose = pose + (p[1]); + break; + } + } + } + if (Layer.AppendPoseMulti && !forceInvariant && !noAppend) { + for (let p of Object.entries(Layer.AppendPoseMulti)) { + if (Poses[p[0]] != undefined && (!Layer.AppendPoseRequire || Layer.AppendPoseRequire[p[0]])) { + pose = pose + (p[1]); + } + } + } + + return Sprite + pose; +} + +function GetTrimmedAppearance(C: Character) { + let MC: ModelContainer = KDCurrentModels.get(C); + if (!MC) return; + let appearance: Item[] = MC.Character.Appearance; + let appearance_new: Item[] = MC.Character.Appearance; + let poses = {}; + for (let A of appearance) { + if (A.Model && A.Model.AddPose) { + for (let pose of A.Model.AddPose) { + poses[pose] = true; + } + } + if (A.Model && A.Model.Categories) { + for (let pose of A.Model.Categories) { + poses[pose] = true; + } + } + } + for (let A of appearance) { + if (A.Model && A.Model.AddPoseConditional) { + for (let entry of Object.entries(A.Model.AddPoseConditional)) { + if (!poses[entry[0]]) { + for (let pose of entry[1]) { + poses[pose] = true; + } + } + } + } + } + for (let A of appearance) { + if (A.Model && A.Model.AddPoseIf) { + for (let entry of Object.entries(A.Model.AddPoseIf)) { + if (poses[entry[0]]) { + for (let pose of entry[1]) { + poses[pose] = true; + } + } + } + } + + if (A.Model && A.Model.Properties) { + for (let entry of Object.values(A.Model.Properties)) { + if (entry.AddPose) { + for (let pose of entry.AddPose) { + if (!poses[pose]) { + poses[pose] = true; + } + } + } + } + } + } + + for (let A of appearance) { + if (A.Model + && !A.Model.RemovePoses?.some((removePose) => {return poses[removePose];}) + ) { + appearance_new.push(A); + } else { + console.log("lost " + A.Model.Name); + } + } + return appearance_new; +} + + +function IsModelLost(C: Character, Name: string) : boolean { + let MC: ModelContainer = KDCurrentModels.get(C); + if (!MC) return false; + + let poses = MC.Poses; + let Model = MC.Models.get(Name); + if (Model) { + return Model.RemovePoses && Model.RemovePoses.some((removePose) => {return poses[removePose]}); + } + return false; +} + + +function UpdateModels(C: Character, Xray?: string[]) { + let MC: ModelContainer = KDCurrentModels.get(C); + if (!MC) return; + MC.Models = new Map(); + MC.Update.clear(); + let poses = {}; + if (Xray) { + for (let p of Object.keys(MC.Poses)) { + if (p.indexOf("Xray") > -1) { + delete MC.Poses[p]; + } + } + MC.XRayFilters = Xray; + for (let x of Xray) { + poses[x] = true; + } + } + + let appearance: Item[] = MC.Character.Appearance; + for (let A of appearance) { + if (A.Model && A.Model.AddPose) { + for (let pose of A.Model.AddPose) { + poses[pose] = true; + } + } + if (A.Model && A.Model.Categories) { + for (let pose of A.Model.Categories) { + poses[pose] = true; + } + } + } + for (let A of appearance) { + if (A.Model && A.Model.AddPoseConditional) { + for (let entry of Object.entries(A.Model.AddPoseConditional)) { + if (!poses[entry[0]]) { + for (let pose of entry[1]) { + poses[pose] = true; + } + } + } + } + } + + for (let A of appearance) { + if (A.Model && A.Model.AddPoseIf) { + for (let entry of Object.entries(A.Model.AddPoseIf)) { + if (poses[entry[0]]) { + for (let pose of entry[1]) { + poses[pose] = true; + } + } + } + } + if (A.Model && A.Model.Properties) { + for (let entry of Object.values(A.Model.Properties)) { + if (entry.AddPose) { + for (let pose of entry.AddPose) { + if (!poses[pose]) { + poses[pose] = true; + } + } + } + } + } + + + } + + + for (let A of appearance) { + if (A.Model + && !A.Model.RemovePoses?.some((removePose) => {return poses[removePose];}) + ) { + MC.addModel(A.Model, A.Filters, A.Property?.LockedBy, A.Properties); + } + } + + // Update models after adding all of them + for (let A of appearance) { + if (A.Model + && !A.Model.RemovePoses?.some((removePose) => {return poses[removePose];}) + ) { + MC.updateModel(A.Model.Name); + } + } + + + for (let m of MC.Models.values()) { + if (m.AddPose) { + for (let pose of m.AddPose) { + MC.Poses[pose] = true; + } + } + if (m.Categories) { + for (let pose of m.Categories) { + MC.Poses[pose] = true; + } + } + } + + KDRefreshPoseOptionsMC(MC); +} + + +function ForceRefreshModels(C: Character) { + let MC: ModelContainer = KDCurrentModels.get(C); + if (!MC) return; + MC.Update.clear(); + MC.ForceUpdate.clear(); +} +async function ForceRefreshModelsAsync(C: Character, ms = 100) { + await sleep(ms); + let MC: ModelContainer = KDCurrentModels.get(C); + if (!MC) return; + MC.Update.clear(); + MC.ForceUpdate.clear(); +} + +/** + * Returns a list of colorable layer names + */ +function KDGetColorableLayers(Model: Model, Properties: boolean): {name: string, layer: string}[] { + let ret: {name: string, layer: string}[] = []; + let dupe: Record = {}; + for (let layer of Object.values(Model.Layers)) { + if (layer.InheritColor && !ret.some((ee) => {return ee.name == layer.InheritColor;})) { + if (!dupe[layer.InheritColor]) { + dupe[layer.InheritColor] = true; + ret.push({layer: layer.Name, name: layer.InheritColor}); + } + + } + + if ((!layer.NoColorize || Properties) && (!layer.InheritColor || Properties)) { + if (!dupe[layer.Name]) { + dupe[layer.Name] = true; + ret.push({layer: layer.Name, name: layer.Name}); + } + if (Properties && (layer.Poses || layer.MorphPoses || layer.GlobalDefaultOverride)) { + let poses: Record = {}; + if (layer.Poses) + for (let pose of Object.keys(layer.Poses)) { + poses[pose] = true; + } + if (layer.MorphPoses) + for (let pose of Object.entries(layer.MorphPoses)) { + poses[pose[0]] = true; + poses[pose[1]] = true; + } + for (let key of Object.keys(poses)) { + if (!dupe[layer.Name + key]) { + dupe[layer.Name + key] = true; + ret.push({layer: layer.Name, name: layer.Name + key}); + } + } + } + } + if (layer.InheritColor && !ret.some((ee) => {return ee.name == layer.InheritColor;})) { + if (Properties && (layer.Poses || layer.MorphPoses || layer.GlobalDefaultOverride)) { + let poses: Record = {}; + if (layer.Poses) + for (let pose of Object.keys(layer.Poses)) { + poses[pose] = true; + } + if (layer.MorphPoses) + for (let pose of Object.entries(layer.MorphPoses)) { + poses[pose[0]] = true; + poses[pose[1]] = true; + } + for (let key of Object.keys(poses)) { + + if (!dupe[layer.InheritColor + key]) { + dupe[layer.InheritColor + key] = true; + ret.push({layer: layer.Name, name: layer.InheritColor + key}); + } + } + } + } + } + + return ret; +} + +function KDGeneratePoseArray(ArmsPose: string | undefined = undefined, LegsPose: string | undefined = undefined, EyesPose: string | undefined = undefined, BrowsPose: string | undefined = undefined, BlushPose: string | undefined = undefined, MouthPose: string | undefined = undefined, Eyes2Pose: string | undefined = undefined, Brows2Pose: string | undefined = undefined, ExtraPose: string | undefined = undefined, FearPose: string | undefined = undefined): {[_: string]: boolean} { + let poses: {[_: string]: boolean} = {}; + poses[ArmsPose || "Free"] = true; + poses[LegsPose || "Spread"] = true; + poses[EyesPose || "EyesNeutral"] = true; + poses[BrowsPose || "BrowsNeutral"] = true; + poses[BlushPose || "BlushNone"] = true; + poses[MouthPose || "MouthNeutral"] = true; + poses[FearPose || "NoFearPose"] = true; + poses[(Eyes2Pose || EYE2POSES[EYEPOSES.indexOf(EyesPose)] || "Eyes2Neutral")] = true; + poses[(Brows2Pose || BROW2POSES[BROWPOSES.indexOf(BrowsPose)] || "Brows2Neutral")] = true; + if (ExtraPose) { + for (let p of ExtraPose) { + poses[p] = true; + } + } + return poses; +} + + +let PoseCheckArray = { + Arms: ARMPOSES, + Legs: LEGPOSES, + Eyes: EYEPOSES, + Eyes2: EYE2POSES, + Brows: BROWPOSES, + Brows2: BROW2POSES, + Blush: BLUSHPOSES, + Mouth: MOUTHPOSES, + Fear: FEARPOSES, +} + +function KDGetPoseOfType(C: Character, Type: string): string { + let checkArray = PoseCheckArray[Type] || []; + if (KDCurrentModels.get(C)?.Poses) + for (let p of checkArray) { + if (KDCurrentModels.get(C).Poses[p]) { + return p; + } + } + return ""; +} + +function GetUnnamedModels() { + let keys: Record = {}; + for (let m of Object.values(ModelDefs)) { + keys[`m_${m.Name}`] = m.Name; + for (let l of Object.values(m.Layers)) { + if (!l.InheritColor && !l.NoColorize) + keys[`l_${m.Name}_${l.Name}`] = l.Name; + } + } + let st = ""; + for (let s of Object.keys(keys)) { + if (TextGet(s) != s) // Failure condition + { delete keys[s]; } + else st = st + "\n" + s + ",\"" + keys[s] + "\""; + } + console.log(st); + console.log(keys); +} + + +interface Hardpoint { + Parent: string; + X: number; + Y: number; + OffsetX?: number, + OffsetY?: number, + Angle: number; +}; + +function GetModelLoc(C: Character, X: number, Y: number, ZoomInit: number = 1, hp: Hardpoint, Flip: boolean, NoMods: boolean = false) { + let Zoom = (ZoomInit * MODEL_SCALE) || MODEL_SCALE + let pos = {x: hp?.X*Zoom || 0, y: hp?.Y*Zoom || 0, angle: hp.Angle}; + + let MC = KDCurrentModels.get(C); + let StartMods = MC.Mods.get(`${X},${Y},${ZoomInit}`); + let EndMods = MC.EndMods.get(`${X},${Y},${ZoomInit}`); + let mods = ModelGetPoseMods(MC.Poses); + + for (let m of StartMods) { + if (!mods[m.Layer]) mods[m.Layer] = []; + mods[m.Layer].push(m); + } + for (let m of EndMods) { + if (!mods[m.Layer]) mods[m.Layer] = []; + mods[m.Layer].push(m); + } + if (!mods) return pos; + + let transform = new Transform(); + + if (!NoMods) { + let layer = hp.Parent; + while (layer) { + let mod_selected: PoseMod[] = mods[layer] || []; + for (let mod of mod_selected) { + transform = transform.recursiveTransform( + mod.offset_x || 0, + mod.offset_y || 0, + mod.rotation_x_anchor ? mod.rotation_x_anchor : 0, + mod.rotation_y_anchor ? mod.rotation_y_anchor : 0, + mod.scale_x || 1, + mod.scale_y || 1, + (mod.rotation * Math.PI / 180) || 0 + ); + } + layer = LayerProperties[layer]?.Parent; + } + } + + + // Move the hardpoint + transform = transform.recursiveTransform( + hp.X, + hp.Y, + 0, + 0, + 1, + 1, + 0, + ); + + let ox = transform.ox; + let oy = transform.oy; + let ax = transform.ax; + let ay = transform.ay; + //let sx = transform.sx; + //let sy = transform.sy; + let rot = transform.rot; + + + pos.x = ox * Zoom; + pos.y = oy * Zoom; + pos.angle += rot; + pos.x -= (ax - (hp.OffsetX / MODELWIDTH || 0)) * Math.cos(rot) * Zoom; + pos.y += (ax - (hp.OffsetX / MODELWIDTH || 0)) * Math.sin(rot) * Zoom; + pos.x -= (ay - (hp.OffsetY / MODELHEIGHT || 0)) * Math.sin(rot) * Zoom; + pos.y -= (ay - (hp.OffsetY / MODELHEIGHT || 0)) * Math.cos(rot) * Zoom; + let { X_Offset, Y_Offset } = ModelGetPoseOffsets(MC.Poses, Flip); + let { rotation, X_Anchor, Y_Anchor } = ModelGetPoseRotation(MC.Poses); + let pivotx = MODELHEIGHT*0.5 * Zoom * X_Anchor; + let pivoty = MODELHEIGHT * Zoom * Y_Anchor; + let lx = pos.x - pivotx; + let ly = pos.y - pivoty; + let angle = rotation * Math.PI / 180; + pos.x = pivotx + (lx) * Math.cos(angle) - (ly) * Math.sin(angle); + pos.y = pivoty + (ly) * Math.cos(angle) + (lx) * Math.sin(angle); + + pos.angle += angle; + + let xx = (MODELWIDTH * X_Offset) * Zoom + MODEL_XOFFSET*Zoom; + let yy = (MODELHEIGHT * Y_Offset) * Zoom; + + pos.x += xx; + pos.y += yy; + + if (Flip) { + pos.x = (0.5 * MODELHEIGHT) * Zoom - pos.x; + pos.angle = Math.PI - pos.angle; + } + return pos; +} + +/** Gets the location of hp (in screen space) on the player model */ +function GetModelLocInverse(C: Character, X: number, Y: number, ZoomInit: number = 1, + hp: Hardpoint, Flip: boolean) { + let Zoom = 1/((ZoomInit * MODEL_SCALE) || MODEL_SCALE) + let pos = {x: hp?.X*Zoom || 0, y: hp?.Y*Zoom || 0, angle: hp.Angle}; + + if (Flip) { + pos.x = Zoom*((0.5 * MODELHEIGHT) * MODEL_SCALE - hp?.X); + pos.angle = Math.PI - pos.angle; + } + + let MC = KDCurrentModels.get(C); + let StartMods = MC.Mods.get(`${X},${Y},${ZoomInit}`); + let EndMods = MC.EndMods.get(`${X},${Y},${ZoomInit}`); + let mods = ModelGetPoseMods(MC.Poses); + + for (let m of StartMods) { + if (!mods[m.Layer]) mods[m.Layer] = []; + mods[m.Layer].push(m); + } + for (let m of EndMods) { + if (!mods[m.Layer]) mods[m.Layer] = []; + mods[m.Layer].push(m); + } + if (!mods) return pos; + + + + let { X_Offset, Y_Offset } = ModelGetPoseOffsets(MC.Poses, Flip); + + + let xx = (MODELWIDTH * X_Offset) + (MODEL_XOFFSET); + let yy = (MODELHEIGHT * Y_Offset); + + + let transform = new Transform(-xx, -yy); + + let callbacks = []; + + let layer = hp.Parent; + while (layer) { + let mod_selected: PoseMod[] = mods[layer] || []; + callbacks.push(() => { + for (let i = mod_selected.length - 1; i >= 0; i--) { + let mod = mod_selected[i]; + transform = transform.recursiveTransform( + mod.offset_x || 0, + mod.offset_y || 0, + mod.rotation_x_anchor ? mod.rotation_x_anchor : 0, + mod.rotation_y_anchor ? mod.rotation_y_anchor : 0, + mod.scale_x || 1, + mod.scale_y || 1, + -(mod.rotation * Math.PI / 180) || 0 + ); + } + }) + layer = LayerProperties[layer]?.Parent; + } + + for (let cb of callbacks) { + cb(); + } + + // Move the hardpoint + transform = transform.recursiveTransform( + (Flip ? (0.5 * MODELHEIGHT) * MODEL_SCALE - hp?.X : hp.X) * Zoom, + hp.Y * Zoom, + 0, + 0, + 1, + 1, + 0, + ); + + let ox = transform.ox; + let oy = transform.oy; + let rot = transform.rot; + + + pos.x = ox; + pos.y = oy; + pos.angle += rot; + let { rotation, X_Anchor, Y_Anchor } = ModelGetPoseRotation(MC.Poses); + let pivotx = MODELHEIGHT*0.5 / ZoomInit * X_Anchor; + let pivoty = MODELHEIGHT / ZoomInit * Y_Anchor; + let lx = pos.x - pivotx; + let ly = pos.y - pivoty; + let angle = -rotation * Math.PI / 180; + pos.x = pivotx + (lx) * Math.cos(angle) - (ly) * Math.sin(angle); + pos.y = pivoty + (ly) * Math.cos(angle) + (lx) * Math.sin(angle); + + pos.angle += angle; + + + // I give up. Im gonna do it the stupid way. + let resultingPosition = GetModelLoc(C, X, Y, ZoomInit, { + X: pos.x, + Y: pos.y, + Angle: 0, + Parent: hp.Parent + }, Flip); + //let resultingPosition2 = GetModelLoc(C, X, Y, ZoomInit, hp, Flip, true); + let differencex = (resultingPosition.x - hp.X)*Zoom; + let differencey = (resultingPosition.y - hp.Y)*Zoom; + let differencea = Math.PI + resultingPosition.angle; // No idea why this works + + // I have absolutely no idea why this is working. It seems to work in the usercases that I tested + // If you are doing high-level rendering stuff, you may run into issues stemming from the fact + // that I have no idea what I am doing + // cheers + pos.x += differencex*Math.cos(differencea) + differencey*Math.sin(differencea); + pos.y += differencey*Math.cos(differencea) - differencex*Math.sin(differencea); + pos.angle += differencea; + + + return pos; +} + + +function GetHardpointLoc(C: Character, X: number, Y: number, ZoomInit: number = 1, Hardpoint: string, Flip: boolean) { + return GetModelLoc(C, X, Y, ZoomInit, Hardpoints[Hardpoint], Flip); +} + + +function DrawModelProcessPoses(MC: ModelContainer, extraPoses: string[]) { + let flippedPoses = []; + if (extraPoses) { + for (let p of extraPoses) { + if (!MC.Poses[p]) { + flippedPoses.push(p); + MC.Poses[p] = true; + } + } + } + for (let m of MC.Models.values()) { + if (m.AddPose) { + for (let pose of m.AddPose) { + MC.Poses[pose] = true; + } + } + if (m.Categories) { + for (let pose of m.Categories) { + MC.Poses[pose] = true; + } + } + } + + if (MC.XRayFilters) { + for (let x of MC.XRayFilters) { + MC.Poses[x] = true; + } + } + + for (let m of MC.Models.values()) { + if (m.AddPoseConditional) { + for (let entry of Object.entries(m.AddPoseConditional)) { + if (!MC.Poses[entry[0]] && !MC.TempPoses[entry[0]]) { + for (let pose of entry[1]) { + MC.Poses[pose] = true; + } + } + } + } + } + for (let m of MC.Models.values()) { + if (m.AddPoseIf) { + for (let entry of Object.entries(m.AddPoseIf)) { + if (MC.Poses[entry[0]] || MC.TempPoses[entry[0]]) { + for (let pose of entry[1]) { + MC.Poses[pose] = true; + } + } + } + } + + if (m.Properties) { + for (let entry of Object.values(m.Properties)) { + if (entry.AddPose) { + for (let pose of entry.AddPose) { + if (!MC.Poses[pose]) { + MC.Poses[pose] = true; + } + } + } + } + } + } + return flippedPoses; +} + +function RenderModelContainer(MC: ModelContainer, C: Character, containerID: string) { + // Rendering is never actually async + /*if (KDToggles.AsyncRendering && KinkyDungeonDrawState == "Game" && KinkyDungeonState == "Game") { + if (!RenderCharacterQueue.get(C)) RenderCharacterQueue.set(C, []); + RenderCharacterQueue.get(C).push(async function() { + RenderCharacterLock.set(C, true); + PIXIapp.renderer.render(MC.Containers.get(containerID).Container, { + clear: true, + renderTexture: MC.Containers.get(containerID).RenderTexture, + blit: true, + }); + RenderCharacterLock.delete(C); + MC.ForceUpdate.add(containerID); + }); + } else {*/ + PIXIapp.renderer.render(MC.Containers.get(containerID).Container, { + //blit: true, + clear: true, + renderTexture: MC.Containers.get(containerID).RenderTexture, + blit: true, + }); + MC.ForceUpdate.add(containerID); + //} +} + +function KDCullModelContainerContainer(MC: ModelContainer, containerID: string) { + let modified = false; + let Container = MC.Containers.get(containerID); + // Cull sprites that weren't drawn yet + + if (!KDlastCull.get(containerID)) KDlastCull.set(containerID, 0); + let cull = CommonTime() > (KDlastCull.get(containerID) || 0) + KDCULLTIME*100; + + for (let sprite of Container.SpriteList.entries()) { + if ((!Container.SpritesDrawn.has(sprite[0]) && sprite[1])) { + if (cull) { + sprite[1].parent.removeChild(sprite[1]); + Container.SpriteList.delete(sprite[0]); + KDSpritesToCull.push(sprite[1]); + } else sprite[1].visible = false; + modified = true; + }// else sprite[1].visible = true; + } + if (cull) KDlastCull.set(containerID, CommonTime()); + return modified; +} + +function adjustFilter(filter) { + let f = new PIXI.filters.AdjustmentFilter(filter); + + return f; +} + + +class Transform { + ox: number = 0; + oy: number = 0; + ax: number = 0; + ay: number = 0; + sx: number = 1; + sy: number = 1; + rot: number = 0; + + constructor(ox?: number, oy?: number, ax?: number, ay?: number, sx?: number, sy?: number, rot?: number) { + if (ox) this.ox = ox; + if (oy) this.oy = oy; + if (ax) this.ax = ax; + if (ay) this.ay = ay; + if (sx) this.sx = sx; + if (sy) this.sy = sy; + if (rot) this.rot = rot; + } + + get() { + let _ox = -(this.sx*this.ax*Math.cos(this.rot) + - this.sy*this.ay*Math.sin(this.rot)); + let _oy = -(this.sx*this.ax*Math.sin(this.rot) + + this.sy*this.ay*Math.cos(this.rot)); + + return { + x: this.ox + _ox, + y: this.oy + _oy, + sx: this.sx, + sy: this.sy, + rot: this.rot, + } + } + + /** Applies a transformation to the transformation, returning the output*/ + recursiveTransform(ox: number, oy: number, ax: number, ay: number, sx: number, sy: number, rot: number) { + let _sx = this.sx * sx; + let _sy = this.sy * sy; + + let _ox = -(_sx*ax*Math.cos(rot) + - _sy*ay*Math.sin(rot)); + let _oy = -(_sx*ax*Math.sin(rot) + + _sy*ay*Math.cos(rot)); + + // Transform to parent coordinates + let __ox2 = this.sx*(ox) + _ox; + let __oy2 = this.sy*(oy) + _oy; + + + return new Transform( + this.ox + (__ox2*Math.cos(this.rot) - __oy2*Math.sin(this.rot)), + this.oy + (__ox2*Math.sin(this.rot) + __oy2*Math.cos(this.rot)), + 0, + 0, + _sx, + _sy, + this.rot + rot, + ); + } + /** Applies a transformation to the transformation */ + apply(transform) { + return this.recursiveTransform( + transform.ox, + transform.oy, + transform.ax, + transform.ay, + transform.sx, + transform.sy, + transform.rot, ) + } +} + +function KDModelIsProtected(m: Model): boolean { + if (m) { + // Check if at least one layer is + if (m.Properties) { + if (Object.values(m.Properties).some( + (l) => { + return l.Protected > 0; + } + )) return true; + } + // Check base model property + if (m.Protected) { + if (m.Properties) { + if (Object.values(m.Properties).some( + (l) => { + return l.Protected < 0; + } + )) return false; + } + + return true; + } + } + + return false; +} + +function KDContainerClear(Container: ContainerInfo) { + Container.Mesh.destroy(); + Container.Container.destroy(); + Container.RenderTexture.destroy(); +} + +function KDSetFilterSprite(info: {hash: string, filter: PIXIFilter}, sprite: PIXISprite) { + if (!kdFilterSprites.get(sprite)) { + kdFilterSprites.set(sprite, []); + kdFilterSprites.get(sprite).push(info); + } + if (sprite.texture) { + if (!kdFilterSprites.get(sprite.texture)) { + kdFilterSprites.set(sprite.texture, []); + } + kdFilterSprites.get(sprite.texture).push(info); + } + +} \ No newline at end of file diff --git a/Data/Poses.ts b/Data/Poses.ts new file mode 100644 index 000000000..b2e1d9281 --- /dev/null +++ b/Data/Poses.ts @@ -0,0 +1,698 @@ +let ARMPOSES = ["Free", "Boxtie", "Wristtie", "Yoked", "Front", "Up", "Crossed"]; +/** List of poses where the left wrist is invisible */ +let WRISTHIDELEFT = ["Boxtie", "Wristtie", "Up", "Crossed"]; +/** List of poses where the right wrist is invisible */ +let WRISTHIDERIGHT = ["Boxtie", "Wristtie", "Up"]; +/** Poses where the torso needs a correction */ +let SHOULDERPOSES = ["Up"]; +/** Poses where the arms are hidden (usually b/c forearms are visible) */ +let HIDEARMPOSES = []; +let FOREARMPOSES = ["Front", "Crossed"]; +let CROSSARMPOSES = ["Crossed"]; +let HANDRIGHTPOSES = ["Free", "Boxtie", "Yoked"]; +let HANDLEFTPOSES = ["Free", "Yoked"]; +let FOREHANDRIGHTPOSES = ["Front"]; +let FOREHANDLEFTPOSES = ["Front"]; +let LEGPOSES = ["Spread", "Closed", "Kneel", "KneelClosed", "Hogtie"]; +let ANKLERIGHTPOSES = ["Spread", "Closed"]; +let ANKLELEFTPOSES = ["Spread", "Closed", "Kneel", "KneelClosed"]; +let FOOTRIGHTPOSES = ["Spread", "Closed"]; +let FOOTLEFTPOSES = ["Spread", "Closed", "Kneel", "KneelClosed"]; +let CALFRIGHTPOSES = ["Spread", "Closed"]; +let CALFLEFTPOSES = ["Spread", "Closed", "Kneel", "KneelClosed", "Hogtie"]; +let KNEELPOSES = ["Kneel", "KneelClosed"]; +let HOGTIEPOSES = ["Hogtie"]; +let STANDPOSES = ["Spread", "Closed"]; +let CLOSEDPOSES = ["KneelClosed", "Closed"]; +let SPREADPOSES = ["Spread", "Kneel"]; +let SPREADCLOSEDPOSES = ["Hogtie"]; +/** Expressions */ + +let EYETYPES = ["Neutral", "Surprised", "Dazed", "Closed", "Angry", "Sly", "Heart"]; +let EYEPOSES = EYETYPES.map((pose) => {return "Eyes" + pose;}); +let EYE2POSES = EYETYPES.map((pose) => {return "Eyes2" + pose;}); +let BROWTYPES = ["Neutral", "Angry", "Annoyed", "Sad", "Surprised"]; +let BROWPOSES = BROWTYPES.map((pose) => {return "Brows" + pose;}); +let BROW2POSES = BROWTYPES.map((pose) => {return "Brows2" + pose;}); +let MOUTHPOSES = ["MouthNeutral", "MouthDazed", "MouthDistracted", "MouthEmbarrassed", "MouthFrown", "MouthSmile", "MouthSurprised", "MouthPout"]; +let BLUSHPOSES = ["BlushLow", "BlushMedium", "BlushHigh", "BlushExtreme"]; +let FEARPOSES = ["NoFearPose", "FearPose"]; +/** Standard GlobalDefaultOverrides, this should be for any pose that's meant to use mostly normal assets */ +let STANDARD_DEFAULTS = ["Hogtie"]; + +let PoseProperties: {[_: string]: PoseProperty} = { + UprightHogtie: { + filter_pose: ["Hogtie"], + rotation: 0, + pri_rotation: 2, + offset_x: 0, + offset_y: 0.1, + pri_offsetx: 3, + pri_offsety: 3, + global_default: "Closed", + mods: [ + { + Layer: "Head", + rotation: -30, + rotation_x_anchor: 1190, + rotation_y_anchor: 690, + offset_x: 1190, + offset_y: 690, + },{ + Layer: "BG", + rotation: -90, + rotation_x_anchor: .5*MODELWIDTH, + rotation_y_anchor: .5*MODELHEIGHT, + offset_x: 0.68*MODELWIDTH, + offset_y: 0.6*MODELHEIGHT, + } + ] + }, + TippedHogtie: { + filter_pose: ["Hogtie"], + rotation: -125, + pri_rotation: 2, + offset_y: 0.1, + pri_offsety: 3, + global_default: "Closed", + mods: [ + { + Layer: "BG", + rotation: 125, + rotation_x_anchor: .5*MODELWIDTH, + rotation_y_anchor: .5*MODELHEIGHT, + offset_x: 0.641*MODELWIDTH, + offset_y: 0.273*MODELHEIGHT, + } + ] + }, + BubbleHogtie: { + filter_pose: ["Hogtie"], + rotation: -90, + pri_rotation: 1.1, + offset_x: .5, + offset_xFlip: .1, + pri_offsetx: 6, + offset_y: 0.1, + pri_offsety: 3, + global_default: "Closed", + mods: [ + { + Layer: "Head", + rotation: -30, + rotation_x_anchor: 1190, + rotation_y_anchor: 690, + offset_x: 1190, + offset_y: 690, + }, + { + Layer: "BG", + rotation: -90, + rotation_x_anchor: .5*MODELWIDTH, + rotation_y_anchor: .5*MODELHEIGHT, + offset_x: 0.641*MODELWIDTH, + offset_y: 0.6*MODELHEIGHT, + } + ] + }, + SuspendedHogtie: { + filter_pose: ["Hogtie"], + rotation: 0, + pri_rotation: 2, + offset_x: 0, + offset_y: 0.0, + pri_offsetx: 4, + pri_offsety: 4, + global_default: "Closed", + mods: [ + { + Layer: "Head", + rotation: -30, + rotation_x_anchor: 1190, + rotation_y_anchor: 690, + offset_x: 1190, + offset_y: 690, + },{ + Layer: "BG", + rotation: -90, + rotation_x_anchor: .5*MODELWIDTH, + rotation_y_anchor: .5*MODELHEIGHT, + offset_x: 0.82*MODELWIDTH, + offset_y: 0.6*MODELHEIGHT, + } + ] + }, + + Hogtie: { + rotation: -90, + pri_rotation: 1, + offset_x: 0.52, + offset_xFlip: 0.17, + offset_y: 0.2, + pri_offsetx: 2, + pri_offsety: 2, + global_default: "Closed", + mods: [{ + Layer: "Head", + rotation: 30, + rotation_x_anchor: 1190, + rotation_y_anchor: 690, + offset_x: 1190, + offset_y: 690, + },{ + Layer: "BG", + rotation: 90, + //rotation_x_anchor: .5, + //rotation_y_anchor: .5, + //offset_x: 0.641, + //offset_y: 0.273, + rotation_x_anchor: .5*MODELWIDTH, + rotation_y_anchor: .5*MODELHEIGHT, + offset_x: 0.641*MODELWIDTH, + offset_y: 0.273*MODELHEIGHT, + } + ], + }, + + + SuspendedKneel: { + filter_pose: ["Kneel", "KneelClosed"], + offset_y: 0, + pri_offsetx: 3, + pri_offsety: 3, + mods: [ + { + Layer: "BG", + offset_x: 0, + offset_y: -.3*MODELHEIGHT, + }, + ] + }, + KneelDown: { + filter_pose: ["Kneel", "KneelClosed"], + offset_y: .3, + pri_offsetx: 2, + pri_offsety: 2, + mods: [ + { + Layer: "BG", + offset_x: 0*MODELWIDTH, + offset_y: -.15*MODELHEIGHT, + }, + ] + }, + ShiftRight: { + offset_x: .2, + offset_xFlip: -0.2, + pri_offsetx: 5, + }, + Kneel: { + offset_y: 0.15, + pri_offsetx: 1, + pri_offsety: 1, + mods: [{ + Layer: "BG", + offset_x: 0*MODELWIDTH, + offset_y: -.15*MODELHEIGHT, + }, + + { + Layer: "Tail", + rotation: -75, + rotation_x_anchor: 1300, + rotation_y_anchor: 1600, + offset_x: 1300, + offset_y: 1600, + }, + ], + }, + KneelClosed: { + offset_y: 0.15, + pri_offsetx: 1, + pri_offsety: 1, + global_default: "Kneel", + mods: [{ + Layer: "ShoeLeft", + rotation: -5.84, + rotation_x_anchor: 915, + rotation_y_anchor: 2160, + offset_x: 915, + offset_y: 2160, + },{ + Layer: "StockingLeftKneel", + rotation: -5.84, + rotation_x_anchor: 915, + rotation_y_anchor: 2160, + offset_x: 915, + offset_y: 2160, + },{ + Layer: "BG", + offset_x: 0*MODELWIDTH, + offset_y: -.15*MODELHEIGHT, + }, + + { + Layer: "Tail", + rotation: -75, + rotation_x_anchor: 1300, + rotation_y_anchor: 1600, + offset_x: 1300, + offset_y: 1600, + },], + }, + Front: { + global_default: "Boxtie", + }, + Crossed: { + global_default: "Boxtie", + }, +}; + +/** + * Get the pose from the pose array with the highest value of checkvar + */ +function ModelGetMaxPose(Poses: {[_: string]: boolean}, CheckVar: string, FilterVar: string | null = null): string { + let maxPose = ""; + for (let p of Object.keys(Poses)) { + if (PoseProperties[p] && PoseProperties[p][CheckVar] != undefined + && (!PoseProperties[p].filter_pose || PoseProperties[p].filter_pose.some((pose) => {return Poses[pose];})) + && (!FilterVar || PoseProperties[p][FilterVar]) + && (!maxPose || PoseProperties[p][CheckVar] > PoseProperties[maxPose][CheckVar]) + ) { + maxPose = p; + } + } + return maxPose; +} + +function ModelGetPoseOffsets(Poses: {[_: string]: boolean}, Flip: boolean) { + let pose = ModelGetMaxPose(Poses, "pri_offsetx"); + let x = (Flip ? PoseProperties[pose]?.offset_xFlip : 0) || PoseProperties[pose]?.offset_x || 0; + pose = ModelGetMaxPose(Poses, "pri_offsety"); + let y = 0; + if (PoseProperties[pose]?.offset_y) y = PoseProperties[pose]?.offset_y; + return {X_Offset: x, Y_Offset: y}; +} + +function ModelGetPoseRotation(Poses: {[_: string]: boolean}) { + let pose = ModelGetMaxPose(Poses, "pri_rotation"); + let x = 0.5; + let y = 0.5; + let r = 0; + if (PoseProperties[pose]?.rotation_x_anchor) x = PoseProperties[pose]?.rotation_x_anchor; + if (PoseProperties[pose]?.rotation_y_anchor) y = PoseProperties[pose]?.rotation_y_anchor; + if (PoseProperties[pose]?.rotation) r = PoseProperties[pose]?.rotation; + return {rotation: r, X_Anchor: x, Y_Anchor: y}; +} + +function ModelGetPoseMods(Poses: {[_: string]: boolean}): {[_: string]: PoseMod[]} { + let mods: {[_: string]: PoseMod[]} = {}; + for (let p of Object.keys(Poses)) { + if (PoseProperties[p]?.mods) { + if (!PoseProperties[p].filter_pose || PoseProperties[p].filter_pose.some((pose) => {return Poses[pose];})) + for (let mod of PoseProperties[p].mods) { + if (!mods[mod.Layer]) mods[mod.Layer] = []; + mods[mod.Layer].push(mod); + } + } + } + return mods; +} + +function CheckPoseOrTags(C: Character, tag: string, tags: Map = null, tagsOnly: boolean = false) { + if (C == KinkyDungeonPlayer || tags) { + if (tags ? tags.get(tag) : KinkyDungeonPlayerTags.get(tag)) return true; + } else if (NPCTags.get(C)) { + if (NPCTags.get(C).get(tag)) return true; + } + if (!tagsOnly) { + if (KDCurrentModels.get(C)?.Poses[tag]) { + return true; + } + if (KDCurrentModels.get(C)?.TempPoses && KDCurrentModels.get(C)?.TempPoses[tag]) { + return true; + } + } + + return false; +} + +function KDGetAvailablePosesLegs(C: Character, tags: Map = null, tagsOnly: boolean = false): string[] { + let poses: Record = {}; + for (let p of LEGPOSES) { + poses[p] = true; + } + //if (C == KinkyDungeonPlayer) { + let closed = false; + let spread = false; + // Logic for the player + if (["FeetLinked", "Legbinders", "LegBind", "Hobbleskirts"].some((tag) => {return CheckPoseOrTags(C, tag, tags, tagsOnly);})) { + delete poses.Spread; + delete poses.Kneel; + closed = true; + } else if (CheckPoseOrTags(C, "ForceKneel", tags, tagsOnly)) { + delete poses.Spread; + delete poses.Closed; + } + if (!closed && CheckPoseOrTags(C, "FeetSpreader", tags, tagsOnly)) { + delete poses.Closed; + spread = true; + } + if (CheckPoseOrTags(C, "Hogties", tags, tagsOnly) || CheckPoseOrTags(C, "ForceHogtie", tags, tagsOnly)) { + for (let p of STANDPOSES) { + delete poses[p]; + } + for (let p of KNEELPOSES) { + delete poses[p]; + } + } else if (CheckPoseOrTags(C, "ForceKneel", tags, tagsOnly)) { + for (let p of STANDPOSES) { + delete poses[p]; + } + } + + if (closed) { + for (let p of SPREADPOSES) { + delete poses[p]; + } + } else if (spread) { + for (let p of CLOSEDPOSES) { + delete poses[p]; + } + } + + if (CheckPoseOrTags(C, "BlockHogtie", tags, tagsOnly)) { + for (let p of HOGTIEPOSES) { + delete poses[p]; + } + } + if (CheckPoseOrTags(C, "BlockKneel", tags, tagsOnly)) { + for (let p of KNEELPOSES) { + delete poses[p]; + } + } + if (CheckPoseOrTags(C, "DiscourageHogtie", tags, tagsOnly) && Object.keys(poses).length > Object.keys(HOGTIEPOSES).length) { + for (let p of HOGTIEPOSES) { + delete poses[p]; + } + } + if (CheckPoseOrTags(C, "DiscourageKneel", tags, tagsOnly) && Object.keys(poses).length > Object.keys(KNEELPOSES).length) { + for (let p of KNEELPOSES) { + delete poses[p]; + } + } + if (CheckPoseOrTags(C, "DiscourageStand", tags, tagsOnly) && Object.keys(poses).length > Object.keys(STANDPOSES).length) { + for (let p of STANDPOSES) { + delete poses[p]; + } + } + + + if (Object.keys(poses).length == 0) { + if (CheckPoseOrTags(C, "DefaultStand", tags, tagsOnly)) { + poses = {Closed: true}; + } else if (CheckPoseOrTags(C, "DefaultKneel", tags, tagsOnly)) { + poses = {Kneel: true}; + } else { + poses = {Hogtie: true}; + } + } + //} else { + // Logic for NPC + // ??? + //} + + return Object.keys(poses); +} + + +function KDGetAvailablePosesArms(C: Character, tags: Map = undefined): string[] { + let poses: Record = {}; + for (let p of ARMPOSES) { + poses[p] = true; + } + + // TODO make this extensible!!!! + if (CheckPoseOrTags(C, "Yokes", tags)) { + poses = {Yoked: true}; + } else if (CheckPoseOrTags(C, "Armbinders", tags)) { + poses = {Wristtie: true}; + } else if (CheckPoseOrTags(C, "Boxbinders", tags)) { + poses = {Boxtie: true}; + } else if (CheckPoseOrTags(C, "Straitjackets", tags) || CheckPoseOrTags(C, "Crossties", tags)) { + poses = {Crossed: true}; + } else if (CheckPoseOrTags(C, "Boxties", tags)) { + poses = {Boxtie: true}; + } else if (CheckPoseOrTags(C, "Wristties", tags)) { + poses = {Wristtie: true}; + } else if (CheckPoseOrTags(C, "Petsuits", tags) || CheckPoseOrTags(C, "Fiddles", tags)) { + poses = {Front: true}; + } + if (KinkyDungeonIsArmsBoundC(C, false, false)) { + delete poses.Free; + if (!CheckPoseOrTags(C, "HandsFrontAllowed") && !CheckPoseOrTags(C, "HandsFront") && !CheckPoseOrTags(C, "Petsuits") && !CheckPoseOrTags(C, "Fiddles")) { + delete poses.Front; + } + if (!CheckPoseOrTags(C, "HandsCrossed") && !CheckPoseOrTags(C, "HandsCrossedAllowed") && !CheckPoseOrTags(C, "Straitjackets") && !CheckPoseOrTags(C, "Crossties")) { + delete poses.Crossed; + } + if (CheckPoseOrTags(C, "HandsBehind")) { + + if (!(CheckPoseOrTags(C, "Yokes"))) + delete poses.Yoked; + if (!(CheckPoseOrTags(C, "Butterfly") || CheckPoseOrTags(C, "HandsUp"))) + delete poses.Up; + if (!(CheckPoseOrTags(C, "Petsuits") || CheckPoseOrTags(C, "Fiddles"))) + delete poses.Front; + if (!(CheckPoseOrTags(C, "Straitjackets") || CheckPoseOrTags(C, "Crossties"))) + delete poses.Crossed; + } + if (CheckPoseOrTags(C, "ElbowTied") && poses.Wristtie) { + delete poses.Boxtie; + delete poses.Up; + } + if (CheckPoseOrTags(C, "HandsUp")) { + delete poses.Boxtie; + delete poses.Wristtie; + delete poses.Front; + delete poses.Yoked; + delete poses.Crossed; + } else if (!CheckPoseOrTags(C, "HandsUpAllowed")) { + delete poses.Up; + } + if (!CheckPoseOrTags(C, "Yoked")) { + delete poses.Yoked; + } else { + delete poses.Front; + delete poses.Boxtie; + delete poses.Wristtie; + delete poses.Crossed; + } + } + + if (CheckPoseOrTags(C, "PreferWristtie") && poses.Wristtie) { + poses = {Wristtie: true}; + } + + if (CheckPoseOrTags(C, "PreferBoxtie") && poses.Boxtie) { + poses = {Boxtie: true}; + } + + if (CheckPoseOrTags(C, "PreferCrossed") && poses.Crossed) { + poses = {Crossed: true}; + } + //} else { + // Logic for NPC + // ??? + //} + + return Object.keys(poses); +} + +function RefreshTempPoses(Character: Character, Restraints: boolean, Buffs: boolean = true) { + KDRefreshPoseOptions(Character); + + for (let pose of Object.keys(KDCurrentModels.get(Character).TempPoses)) + delete KDCurrentModels.get(Character).Poses[pose]; + KDCurrentModels.get(Character).TempPoses = {}; + + /*for (let m of KDCurrentModels.get(Character).Models.values()) { + if (m.AddPose) { + for (let pose of m.AddPose) { + KDCurrentModels.get(Character).Poses[pose] = true; + } + } + }*/ + + if (Buffs) { + if (Character == KinkyDungeonPlayer) { + for (let buff of Object.values(KinkyDungeonPlayerBuffs)) { + if (buff.pose && buff.duration >= 0) { + KDCurrentModels.get(Character).TempPoses[buff.pose] = true; + } + } + } else { + let entity = KDGetCharacterEntity(Character); + if (entity?.buffs) + for (let buff of Object.values(entity.buffs)) { + if (buff.pose && buff.duration >= 0) { + KDCurrentModels.get(Character).TempPoses[buff.pose] = true; + } + } + } + + } + + if (Restraints) { + for (let inv of KDGetRestraintsForID(KDGetCharacterID(Character))) { + if (KDRestraint(inv)?.addPose) + for (let tag of KDRestraint(inv).addPose) { + if (!KDCurrentModels.get(Character).TempPoses[tag]) KDCurrentModels.get(Character).TempPoses[tag] = true; + } + if (KDRestraint(inv)?.addPoseIfTopLevel && KinkyDungeonGetRestraintItem(KDRestraint(inv).Group) == inv) + for (let tag of KDRestraint(inv).addPoseIfTopLevel) { + if (!KDCurrentModels.get(Character).TempPoses[tag]) KDCurrentModels.get(Character).TempPoses[tag] = true; + } + + + } + } + + + + KDRefreshPoseOptions(Character); +} + +function KDRefreshPoseOptions(Character: Character) { + if (KDToggles.ChastityOption) { + KDCurrentModels.get(Character).TempPoses.ChastityOption = true; + KDCurrentModels.get(Character).Poses.ChastityOption = true; + } + if (KDToggles.CrotchRopeOption || (Character == KinkyDungeonPlayer && KinkyDungeonPlayerTags.get("ChastityBelts"))) { + KDCurrentModels.get(Character).TempPoses.OptionCrotchRope = true; + KDCurrentModels.get(Character).Poses.OptionCrotchRope = true; + } + if (KinkyDungeonDrawState != "Game" || KinkyDungeonState != "Game") { + KDCurrentModels.get(Character).TempPoses.Menu = true; + KDCurrentModels.get(Character).Poses.Menu = true; + } + if (KDToggles.ChastityOption2) { + KDCurrentModels.get(Character).TempPoses.ChastityOption2 = true; + KDCurrentModels.get(Character).Poses.ChastityOption2 = true; + } + if (!KDToggles.Nipples) { + KDCurrentModels.get(Character).TempPoses.HideNipples = true; + KDCurrentModels.get(Character).Poses.HideNipples = true; + } + if (KDToggles.NippleToysHide) { + KDCurrentModels.get(Character).TempPoses.HideNippleToys = true; + KDCurrentModels.get(Character).Poses.HideNippleToys = true; + } + if (KDToggles.NipplePiercingsHide) { + KDCurrentModels.get(Character).TempPoses.HideNipplePiercings = true; + KDCurrentModels.get(Character).Poses.HideNipplePiercings = true; + } + if (KDToggles.NippleToysOption) { + KDCurrentModels.get(Character).TempPoses.NippleToysOption = true; + KDCurrentModels.get(Character).Poses.NippleToysOption = true; + } + if (Character == KinkyDungeonPlayer && ((KDToggles.DynamicArmor + && (KinkyDungeonState == "Game" || KinkyDungeonState == "GenMap" || KinkyDungeonState == "JourneyMap")) + )) { + KDCurrentModels.get(Character).TempPoses.DynamicArmor = true; + KDCurrentModels.get(Character).Poses.DynamicArmor = true; + } + + if (KinkyDungeonState == "Wardrobe") { + KDCurrentModels.get(Character).Poses.DynamicArmor = true; + if (!KDToggles.HideArmorWardrobe) { + for (let ap of KDArmorPoses) { + KDCurrentModels.get(Character).Poses[ap] = true; + } + } + } + + + if (KDToggles.ChastityBraOption) { + KDCurrentModels.get(Character).TempPoses.ChastityBraOption = true; + KDCurrentModels.get(Character).Poses.ChastityBraOption = true; + } + + if (Character == KinkyDungeonPlayer) { + let restraints = KinkyDungeonAllRestraintDynamic(); + for (let inv of restraints) { + KDCurrentModels.get(Character).Poses[inv.item.name + "Worn"] = true; + } + } else if (KDNPCChar_ID.get(Character)) { + let restraints = KDGetNPCRestraints(KDNPCChar_ID.get(Character)); + for (let inv of Object.values(restraints)) { + KDCurrentModels.get(Character).Poses[inv.name + "Worn"] = true; + } + } +} + +function KDRefreshPoseOptionsMC(MC: ModelContainer) { + if (KDToggles.CrotchRopeOption) { + MC.Poses.OptionCrotchRope = true; + } + if (KDToggles.ChastityOption) { + MC.Poses.ChastityOption = true; + } + if (KDToggles.ChastityOption2) { + MC.Poses.ChastityOption2 = true; + } + if (!KDToggles.Nipples) { + MC.Poses.HideNipples = true; + } + if (KDToggles.NippleToysHide) { + MC.Poses.HideNippleToys = true; + } + if (KDToggles.NipplePiercingsHide) { + MC.Poses.HideNipplePiercings = true; + } + if (KDToggles.NippleToysOption) { + MC.Poses.NippleToysOption = true; + } + if (MC.Character == KinkyDungeonPlayer && ((KDToggles.DynamicArmor + && (KinkyDungeonState == "Game" || KinkyDungeonState == "GenMap" || KinkyDungeonState == "JourneyMap")) + )) { + MC.Poses.DynamicArmor = true; + } + + if (KinkyDungeonState == "Wardrobe") { + MC.Poses.DynamicArmor = true; + if (!KDToggles.HideArmorWardrobe) { + for (let ap of KDArmorPoses) { + MC.Poses[ap] = true; + } + } + } + + if (KDToggles.ChastityBraOption) { + MC.Poses.ChastityBraOption = true; + } + + if (MC.Character == KinkyDungeonPlayer) { + let restraints = KinkyDungeonAllRestraintDynamic(); + for (let inv of restraints) { + MC.Poses[inv.item.name + "Worn"] = true; + } + } else if (KDNPCChar_ID.get(MC.Character)) { + let restraints = KDGetNPCRestraints(KDNPCChar_ID.get(MC.Character)); + for (let inv of Object.values(restraints)) { + MC.Poses[inv.name + "Worn"] = true; + } + } + +} + +let KDArmorPoses = [ + "ChestArmor", + "ArmArmor", + "GlovesArmor", + "LegsArmor", + "ChestArmor", + "PelvisArmor", + "TorsoArmor", + "BootsArmor", +] \ No newline at end of file diff --git a/Data/Preload.ts b/Data/Preload.ts new file mode 100644 index 000000000..c878c48d2 --- /dev/null +++ b/Data/Preload.ts @@ -0,0 +1,709 @@ +PIXI.Assets.init(); + + +let KDFontName = "Inconsolata Medium"; + +let KDBaseFonts = [ + ["Inconsolata", { + alias: "Inconsolata", + src: 'Fonts/Inconsolata/Inconsolata-Regular.ttf', + mono: true, + width: 1.25, + }], + ["Inconsolata Medium", { + alias: "Inconsolata Medium", + src: 'Fonts/Inconsolata/Inconsolata-Medium.ttf', + mono: true, + width: 1.25, + }], + ["Inconsolata Light", { + alias: "Inconsolata Light", + src: 'Fonts/Inconsolata/Inconsolata-Light.ttf', + mono: true, + width: 1.25, + }], + ["Inconsolata Condensed Medium", { + alias: "Inconsolata Condensed Medium", + src: 'Fonts/Inconsolata/Inconsolata_Condensed-Medium.ttf', + mono: true, + width: 1.5, + }], + ["Inconsolata Condensed Light", { + alias: "Inconsolata Condensed Light", + src: 'Fonts/Inconsolata/Inconsolata_Condensed-Light.ttf', + mono: true, + width: 1.5, + }], + ["3270", { + alias: "3270 Regular", + src: 'Fonts/3270/3270-Regular.ttf', + mono: true, + width: 1.0, + }], + ["3270 Condensed", { + alias: "3270condensed Regular", + src: 'Fonts/3270/3270Condensed-Regular.ttf', + mono: true, + width: 1.5, + }], + ["Courier New", { + alias: "Courier New", + src: '', + mono: true, + width: 1.0, + }], + ["Lekton", { + alias: "Lekton Regular", + src: 'Fonts/Lekton/Lekton-Regular.ttf', + mono: true, + width: 1.25, + }], + ["System", { + alias: "Fsex302", + src: 'Fonts/System/FSEX302.ttf', + mono: true, + width: 1.1, + }], + ["Iosevka Regular", { + alias: "Iosevka Regular", + src: 'Fonts/Iosevka/Iosevka-Regular.ttf', + mono: true, + width: 1.25, + }], + ["Iosevka Medium", { + alias: "Iosevka Medium", + src: 'Fonts/Iosevka/Iosevka-Medium.ttf', + mono: true, + width: 1.25, + }], + ["Iosevka Slab Regular", { + alias: "Iosevkaslab Regular", + src: 'Fonts/Iosevka/IosevkaSlab-Regular.ttf', + mono: true, + width: 1.25, + }], + ["Iosevka Slab Medium", { + alias: "Iosevkaslab Medium", + src: 'Fonts/Iosevka/IosevkaSlab-Medium.ttf', + mono: true, + width: 1.25, + }], + ["Iosevka Curly Regular", { + alias: "Iosevkacurly Regular", + src: 'Fonts/Iosevka/IosevkaCurly-Regular.ttf', + mono: true, + width: 1.25, + }], + ["Iosevka Curly Medium", { + alias: "Iosevkacurly Medium", + src: 'Fonts/Iosevka/IosevkaCurly-Medium.ttf', + mono: true, + width: 1.25, + }], + ["Nanum Gothic Coding", { + alias: "Nanumgothiccoding Regular", + src: 'Fonts/Nanum/NanumGothicCoding-Regular.ttf', + mono: true, + width: 1.25, + }], + ["Roboto", { + alias: "Roboto Regular", + src: 'Fonts/Roboto/Roboto-Regular.ttf', + mono: false, + width: 1.3, + }], +]; + +let KDFonts = new Map(); +for (let obj of KDBaseFonts) { + KDFonts.set(obj[0], obj[1]); +} +let KDFontsAlias = new Map(); +for (let obj of KDBaseFonts) { + if (typeof obj[1] !== "string") + KDFontsAlias.set(obj[1].alias, obj[1]); +} + +let KDSelectedFont = KDFontName; +let KDSelectedFontListIndex = 0; +let KDSelectedFontList = Array.from(KDFonts.keys()); + +let KDButtonFont = KDFontName; +let KDButtonFontListIndex = 0; +let KDButtonFontList = Array.from(KDFonts.keys()); + +let KDOptimizeDisplacementMapInfo: Record = { + 'DisplacementMaps/CorsetSquish.png': { + xPad: 0, + yPad: 1000, + } +}; + +let DisplacementMaps = [ + /* +'SovietHatErase.png', +'SlimeLeftClosed.png', +'SlimeRightClosed.png', +'HideBoxtieHand.png', +'BedStrapsHogtie.png', +'FutureBox.png', +'TapeTopRight.png', +'TapeTopRightBoxtie.png', +'TightUpperSquish.png', +'LightMaidRightArmErase.png', +'TapeTopRightCrossed.png', +'TapeTopRightWristtie.png', +'Thigh1SquishClosed.png', +'Thigh1SquishHogtie.png', +'Thigh1SquishKneelClosed.png', +'Thigh2SquishClosed.png', +'Thigh2SquishHogtie.png', +'Thigh2SquishKneelClosed.png', +'Thigh3SquishClosed.png', +'Thigh3SquishHogtie.png', +'Thigh3SquishKneelClosed.png', +'ThighCuffsLeftClosed.png', +'ThighCuffsLeftKneel.png', +'ThighCuffsLeftKneelClosed.png', +'ThighCuffsLeftSpread.png', +'ThighCuffsRightClosed.png', +'ThighCuffsRightKneel.png', +'ThighCuffsRightKneelClosed.png', +'ThighCuffsRightSpread.png', +'CrystalErase.png', +'Xray.png', +'BallSuit.png', +'Bubble.png', +'Bubble2.png', +'BustHuge.png', +'Fiddle.png', +'TightBelt.png', +'XrayBra.png', +'XrayFace.png', +'XrayPanties.png', +'Yoke.png', +'AnkleCuffLeftClosed.png', +'AnkleCuffLeftKneel.png', +'AnkleCuffLeftKneelClosed.png', +'AnkleCuffLeftSpread.png', +'AnkleCuffRightClosed.png', +'AnkleCuffRightSpread.png', +'AnklesSquishClosed.png', +'AnklesSquishKneel.png', +'Arm1SquishBoxtie.png', +'Arm1SquishWristtie.png', +'Arm2SquishBoxtie.png', +'Arm2SquishWristtie.png', +'ArmHarnessSquish.png', +'ArmStrapCrossed.png', +'BalletClosed.png', +'BalletErase.png', +'BalletEraseSpread.png', +'BalletHogtie.png', +'BalletKneel.png', +'BalletKneelClosed.png', +'BalletRightErase.png', +'BalletRightEraseKneel.png', +'BalletRightEraseClosed.png', +'BalletSpread.png', + +'BalletCuffsClosed.png', +'BalletCuffsHogtie.png', +'BalletCuffsKneel.png', +'BalletCuffsKneelClosed.png', +'BalletCuffsSpread.png', +'Belt.png', +'BeltFeet1SquishClosed.png', +'BeltFeet1SquishKneelClosed.png', +'BeltFeet2SquishClosed.png', +'BeltFeet2SquishKneelClosed.png', +'BeltLegs1SquishClosed.png', +'BeltLegs1SquishHogtie.png', +'BeltLegs1SquishKneelClosed.png', +'BeltLegs2SquishClosed.png', +'BeltLegs2SquishHogtie.png', +'BeltLegs2SquishKneelClosed.png', +'BeltSquish.png', +'BinderLeftBoxtie.png', +'BinderLeftWristtie.png', +'BinderRightBoxtie.png', +'BinderRightWristtie.png', +'BootsClosed.png', +'BootsHogtie.png', +'BootsKneel.png', +'BootsKneelClosed.png', +'BootsShortClosed.png', +'BootsShortHogtie.png', +'BootsShortKneel.png', +'BootsShortKneelClosed.png', +'BootsShortSpread.png', +'BootsSpread.png', +'Breastplate.png', +'Calf1SquishClosed.png', +'Calf1SquishKneelClosed.png', +'Calf2SquishClosed.png', +'Calf2SquishHogtie.png', +'Calf2SquishKneelClosed.png', +'Calf3SquishClosed.png', +'Calf3SquishHogtie.png', +'Calf3SquishKneelClosed.png', +'CorsetSquish.png', +'CorsetSquishTight.png', +'CrotchropeSquished.png', +'CuffLeftCrossed.png', +'CuffLeftFree.png', +'CuffLeftFront.png', +'CuffLeftYoked.png', +'CuffRightCrossed.png', +'CuffRightFree.png', +'CuffRightFront.png', +'CuffRightYoked.png', +'CuffsSquishCrossed.png', +'CuffsSquishFront.png', +'ElbowCuffLeftBoxtie.png', +'ElbowCuffLeftCrossed.png', +'ElbowCuffLeftFree.png', +'ElbowCuffLeftFront.png', +'ElbowCuffLeftUp.png', +'ElbowCuffLeftWristtie.png', +'ElbowCuffLeftYoked.png', +'ElbowCuffRightBoxtie.png', +'ElbowCuffRightCrossed.png', +'ElbowCuffRightFree.png', +'ElbowCuffRightFront.png', +'ElbowCuffRightUp.png', +'ElbowCuffRightWristtie.png', +'ElbowCuffRightYoked.png', +'ForeArm1SquishWristtie.png', +'ForeArm2SquishWristtie.png', +'FrogThigh1SquishKneel.png', +'FrogThigh1SquishKneelClosed.png', +'FrogThigh2SquishKneel.png', +'FrogThigh2SquishKneelClosed.png', +'FrogThigh3SquishKneel.png', +'FrogThigh3SquishKneelClosed.png', +'HarnessSquish.png', +'HeelsErase.png', +'HeelsEraseSpread.png', +'HeelsEraseClosed.png', +'HeelsClosed.png', +'HeelsHogtie.png', +'HeelsKneel.png', +'HeelsKneelClosed.png', +'HeelsSpread.png', +'Heels2Closed.png', +'Heels2Hogtie.png', +'Heels2Kneel.png', +'Heels2KneelClosed.png', +'Heels2Spread.png', +'HeelsRightErase.png', +'HeelsRightEraseClosed.png', +'HeelsRightErase2.png', +'HeelsRightErase2Closed.png', +'JacketArmsBoxtie.png', +'JacketArmsCrossed.png', +'JacketArmsWristtie.png', +'JacketBoxtie.png', +'JacketCrossed.png', +'JacketWristtie.png', +'LaceChest.png', +'LeftFrogtieSquishKneel.png', +'LeftFrogtieSquishKneelClosed.png', +'Leg1SquishClosed.png', +'MittsFree.png', +'MittsFront.png', +'MittsCrossed.png', +'MittsYoked.png', +'Null.png', +'RightFrogtieSquishKneel.png', +'RightFrogtieSquishKneelClosed.png', +'Sarco.png', +'SlimeCorsetErase.png', +'TapeAnklesSquishClosed.png', +'TapeAnklesSquishKneel.png', +'TapeAnklesSquishKneelClosed.png', +'TapeAnklesSquishHogtie.png', +'TapeArmsBoxtie.png', +'TapeFullLeft.png', +'TapeFullLeftBoxtie.png', +'TapeFullLeftCrossed.png', +'TapeFullLeftWristtie.png', +'TapeFullRight.png', +'TapeFullRightBoxtie.png', +'TapeFullRightCrossed.png', +'TapeFullRightWristtie.png', +'TapeHeavyLeft.png', +'TapeHeavyLeftBoxtie.png', +'TapeHeavyLeftCrossed.png', +'TapeHeavyLeftWristtie.png', +'TapeHeavyRight.png', +'TapeHeavyRightBoxtie.png', +'TapeHeavyRightCrossed.png', +'TapeHeavyRightWristtie.png', +'TapeLightLeft.png', +'TapeLightLeftBoxtie.png', +'TapeLightLeftCrossed.png', +'TapeLightLeftWristtie.png', +'TapeLightRight.png', +'TapeLightRightBoxtie.png', +'TapeLightRightCrossed.png', +'TapeLightRightWristtie.png', +'TapeMedLeft.png', +'TapeMedLeftBoxtie.png', +'TapeMedLeftCrossed.png', +'TapeMedLeftWristtie.png', +'TapeMedRight.png', +'TapeMedRightBoxtie.png', +'TapeMedRightCrossed.png', +'TapeMedRightWristtie.png', +'TapeTopLeft.png', +'TapeTopLeftBoxtie.png', +'TapeTopLeftCrossed.png', +'TapeTopLeftWristtie.png', +'EraseCorsetKneel.png', +'EraseCorsetKneelEncase.png', +'EraseCorset.png', +'EraseCorsetEncase.png', +'ReversePrayer.png', +'ButtSleeves.png', +'PetsuitSquish.png', +'LegbinderSquishClosed.png', +'LegbinderSquishHogtie.png', +'LegbinderSquishKneelClosed.png', +'SlimeThighsKneelClosed.png', +'SlimeThighsClosed.png', +'SlimeThighsHogtie.png', +'EraseSkirtSplit.png', +'GuardLeftYoked.png', +'GuardRightYoked.png', +'GuardLeftFree.png', +'GuardRightFree.png', +'GuardLeftFront.png', +'GuardRightFront.png',*/ +]; + +// Scale factor for displacement and erase maps +let DisplacementScale = 0.25; + +let displacementList = [ + ...DisplacementMaps.map((e) => {return "DisplacementMaps/" + e;}), +]; + +let linearList = [ + "TextureAtlas/atlas0.json", + "TextureAtlas/displace0.json", +]; + +let nearestList = [ + "TextureAtlas/game0.json", +] + +let CurrentLoading = ""; + +let lastProgress = 0; +function incrementProgress(amount) { + return (progress) => { + console.log(progress); + if (progress < lastProgress) lastProgress = 0; + KDLoadingDone += (progress - lastProgress) * amount; + lastProgress = progress; + }; +} + +let buildSuff = "";//"?build=" + TextGet("KDVersionStr"); + +async function LoadTextureAtlas(list, scale_mode, preload = false) { + PIXI.BaseTexture.defaultOptions.scaleMode = scale_mode; + + for (let dataFile of list) { + console.log("Found atlas: " + dataFile); + let amount = 100; + KDLoadingMax += amount; + + } + for (let dataFile of list) { + let result = preload ? await PIXI.Assets.backgroundLoad(dataFile+ buildSuff).then((value) => { + + let amount = 100; + //console.log(value) + CurrentLoading = "Loaded " + dataFile; + //console.log(dataFile); + KDLoadingDone += amount; + + }, () => { + + let amount = 100; + CurrentLoading = "Error Loading " + dataFile; + KDLoadingDone += amount; + }) + : await PIXI.Assets.load(dataFile + buildSuff).then((value) => { + for (let s of Object.values(value.linkedSheets)) { + for (let t of Object.keys((s as any).textures)) { + let tsprite = PIXI.Sprite.from(KDTex(t, scale_mode == PIXI.SCALE_MODES.NEAREST)); + let rt = PIXI.RenderTexture.create( + { width: 100, height: 100, + resolution: 1}); + + PIXIapp.renderer.render(tsprite, { + //blit: true, + clear: true, + renderTexture: rt, + blit: true, + }); + tsprite.destroy(); + rt.destroy(true); + } + } + + let amount = 100; + //console.log(value) + CurrentLoading = "Loaded " + dataFile; + //console.log(dataFile); + KDLoadingDone += amount; + //console.log(amount) + }, () => { + + let amount = 100; + CurrentLoading = "Error Loading " + dataFile; + KDLoadingDone += amount; + }); + + + /*result.then((value) => { + + }, () => { + CurrentLoading = "Error Loading " + dataFile; + KDLoadingDone += amount; + });*/ + //let atlas = await result; + } + +} + +async function PreloadDisplacement(list) { + for (let dataFile of list) { + //console.log("Found d_map: " + dataFile); + let amount = 1; + KDLoadingMax += amount; + } + for (let dataFile of list) { + let amount = 1; + let texture = PIXI.Texture.fromURL(dataFile + buildSuff, { + resourceOptions: { + scale: DisplacementScale, + } + }); + texture.then((value) => { + //console.log(value) + CurrentLoading = "Loaded " + dataFile; + //console.log(dataFile); + KDTex(dataFile, false); + + + KDLoadingDone += amount; + }, () => { + CurrentLoading = "Error Loading " + dataFile; + console.log(CurrentLoading); + KDLoadingDone += amount; + }); + /*let result = preload ? PIXI.Assets.backgroundLoad(dataFile) : PIXI.Assets.load(dataFile); + + result.then((value) => { + console.log(value) + CurrentLoading = "Loaded " + dataFile; + //console.log(dataFile); + KDLoadingDone += amount; + }, () => { + CurrentLoading = "Error Loading " + dataFile; + console.log(CurrentLoading); + KDLoadingDone += amount; + });*/ + //let atlas = await result; + } +} + +KDLoadToggles(); +//if (!KDToggles.HighResDisplacement) DisplacementScale = 1/16 + + +async function load() { + + for (let font of KDFonts.values()) { + if (font.src) { + try { + const url_to_font_name = font.src; + const font_name = new FontFace(font.alias, `url(${url_to_font_name})`); + document.fonts.add(font_name); + // Work that does not require `font_name` to be loaded… + font_name.load(); + // Work that requires `font_name` to be loaded… + + //await PIXI.Assets.load( { + // src: font.src, + //}); + } catch (err) { + console.log(err); + } + } + + } + + + + PIXI.BaseTexture.defaultOptions.mipmap = PIXI.MIPMAP_MODES.ON; + //PIXI.BaseTexture.defaultOptions.anisotropicLevel = 0; + + PIXI.Assets.load("Logo.png"); + + //KDLoadingMax = 100; + await LoadTextureAtlas(nearestList, KDToggles.NearestNeighbor ? PIXI.SCALE_MODES.NEAREST : PIXI.SCALE_MODES.LINEAR); + await LoadTextureAtlas(linearList, PIXI.SCALE_MODES.LINEAR); + await PreloadDisplacement(displacementList); + // Load everything twice... for good measure + + setTimeout(() => { + LoadTextureAtlas(nearestList, KDToggles.NearestNeighbor ? PIXI.SCALE_MODES.NEAREST : PIXI.SCALE_MODES.LINEAR); + LoadTextureAtlas(linearList, PIXI.SCALE_MODES.LINEAR); + }, 700); + + PIXI.BaseTexture.defaultOptions.scaleMode = PIXI.SCALE_MODES.LINEAR; + +} + +load(); + + +(() => { + let extensions = PIXI.extensions; + // Alternatively your plugin could be an object, such as with the @pixi/assets parsers + const modAtlasLoader = { + extension: { + type: PIXI.ExtensionType.LoadParser, + name: 'modAtlasLoader', + }, + name: 'modAtlasLoader', + + async load(url: string): Promise + { + if (KDModFiles[url]) url = KDModFiles[url]; + else { + url = url.substring(url.indexOf("blob:http:/")); + url = url.replace("blob:http:/", "blob:http://") + } + + const response = await PIXI.settings.ADAPTER.fetch(url); + + const json = await response.json(); + + //json.meta.image = "TextureAtlas/" + json.meta.image; + console.log(json) + + return json as T; + }, + } + + + // Make sure to "register" the extension! + extensions.add(modAtlasLoader); + + const validImageExtensions = ['.jpeg', '.jpg', '.png', '.webp', '.avif']; + const validImageMIMEs = [ + 'image/jpeg', + 'image/png', + 'image/webp', + 'image/avif', + ]; + + // Alternatively your plugin could be an object, such as with the @pixi/assets parsers + const modTextureLoader = { + extension: { + type: PIXI.ExtensionType.LoadParser, + name: 'modTextureLoader', + priority: PIXI.LoaderParserPriority.High + 1, + }, + name: 'modTextureLoader', + + config: { + preferWorkers: true, + preferCreateImageBitmap: true, + crossOrigin: 'anonymous', + }, + + test(url: string): boolean + { + return (PIXI.checkDataUrl(url, validImageMIMEs) || PIXI.checkExtension(url, validImageExtensions)) && KDModFiles[url]; + }, + + async load(url: string, asset: any, loader: any): Promise + { + if (KDModFiles[url]) url = KDModFiles[url]; + const useImageBitmap = globalThis.createImageBitmap && this.config.preferCreateImageBitmap; + let src: HTMLImageElement | ImageBitmap; + + if (useImageBitmap) + { + + src = await PIXI.loadImageBitmap(url); + } + else + { + src = await new Promise((resolve, reject) => + { + const src = new Image(); + + src.crossOrigin = this.config.crossOrigin; + src.src = url; + if (src.complete) + { + resolve(src); + } + else + { + src.onload = () => resolve(src); + src.onerror = (e) => reject(e); + } + }); + } + + const options = { ...asset.data }; + + options.resolution ??= PIXI.utils.getResolutionOfUrl(url); + if (useImageBitmap && options.resourceOptions?.ownsImageBitmap === undefined) + { + options.resourceOptions = { ...options.resourceOptions }; + options.resourceOptions.ownsImageBitmap = true; + } + + const base = new PIXI.BaseTexture(src, options); + + base.resource.src = url; + + return PIXI.createTexture(base, loader, url); + }, + + unload(texture: PIXITexture): void + { + texture.destroy(true); + } + } + + // Make sure to "register" the extension! + extensions.add(modTextureLoader); + + const resolveModURL = { + extension: { + type: PIXI.ExtensionType.ResolveParser, + name: 'resolveModURL', + priority: PIXI.LoaderParserPriority.High, + }, + test: (url) => KDModFiles[url] != undefined, + parse: (value: string): PIXIUnresolvedAsset => + ({ + resolution: parseFloat(PIXI.settings.RETINA_PREFIX.exec(value)?.[1] ?? '1'), + format: PIXI.utils.path.extname(value).slice(1), + src: KDModFiles[value], + }), + } + + extensions.add(resolveModURL); +})(); diff --git a/Data/Utils.ts b/Data/Utils.ts new file mode 100644 index 000000000..21ef284ab --- /dev/null +++ b/Data/Utils.ts @@ -0,0 +1,68 @@ +/** + * Returns a map from a list + */ +function ToNamedMap(Named: N[]): {[_: string]: N} { + let list = {}; + for (let n of Named) { + list[n.Name] = n; + } + return list; +} + +function ToMap(Array: string[], ...Extra: string[]): {[_: string]: boolean} { + if (Extra) { + Array = [...Array, ...Extra]; + } + let list: {[_: string]: boolean} = {}; + for (let n of Array) { + list[n] = true; + } + return list; +} + +function ToMapSubtract(Array: string[], Subtract: string[], ...Extra: string[]): {[_: string]: boolean} { + if (Extra) { + Array = [...Array, ...Extra]; + } + let list: {[_: string]: boolean} = {}; + for (let n of Array) { + list[n] = true; + } + // O(n) instead of O(n^2) to check while creating the first array + for (let n of Subtract) { + delete list[n]; + } + return list; +} + + +function ToMapDefault(Array: string[], Default: string = ""): {[_: string]: string} { + let list: {[_: string]: string} = {}; + for (let n of Array) { + list[n] = Default; + } + return list; +} + +function ToMapDupe(Array: string[], ExtraMap?: Record): {[_: string]: string} { + let list: {[_: string]: string} = Object.assign({}, ExtraMap || {}); + for (let n of Array) { + list[n] = n; + } + return list; +} + +function GenPlaceholderModelNames() { + let ret = ""; + for (let model of Object.values(ModelDefs)) { + if (TextGet("m_" + model.Name) == "m_" + model.Name) { + ret = ret + ("m_" + model.Name + "," + model.Name) + "\n"; + } + for (let layer of Object.values(model.Layers)) { + if (TextGet("m_" + model.Name + "_l_" + layer.Name) == "m_" + model.Name + "_l_" + layer.Name) { + ret = ret + ("m_" + model.Name + "_l_" + layer.Name + "," + layer.Name) + "\n"; + } + } + } + return ret; +} \ No newline at end of file diff --git a/Data/image.png b/Data/image.png new file mode 100644 index 000000000..8c2713d6f Binary files /dev/null and b/Data/image.png differ diff --git a/DisplacementMaps/AnkleCuffLeftClosed.png b/DisplacementMaps/AnkleCuffLeftClosed.png new file mode 100644 index 000000000..20de9213d Binary files /dev/null and b/DisplacementMaps/AnkleCuffLeftClosed.png differ diff --git a/DisplacementMaps/AnkleCuffLeftKneel.png b/DisplacementMaps/AnkleCuffLeftKneel.png new file mode 100644 index 000000000..519389014 Binary files /dev/null and b/DisplacementMaps/AnkleCuffLeftKneel.png differ diff --git a/DisplacementMaps/AnkleCuffLeftKneelClosed.png b/DisplacementMaps/AnkleCuffLeftKneelClosed.png new file mode 100644 index 000000000..577506f0a Binary files /dev/null and b/DisplacementMaps/AnkleCuffLeftKneelClosed.png differ diff --git a/DisplacementMaps/AnkleCuffLeftSpread.png b/DisplacementMaps/AnkleCuffLeftSpread.png new file mode 100644 index 000000000..1947c37c2 Binary files /dev/null and b/DisplacementMaps/AnkleCuffLeftSpread.png differ diff --git a/DisplacementMaps/AnkleCuffRightClosed.png b/DisplacementMaps/AnkleCuffRightClosed.png new file mode 100644 index 000000000..0a4ca50e0 Binary files /dev/null and b/DisplacementMaps/AnkleCuffRightClosed.png differ diff --git a/DisplacementMaps/AnkleCuffRightSpread.png b/DisplacementMaps/AnkleCuffRightSpread.png new file mode 100644 index 000000000..2a9a3e98b Binary files /dev/null and b/DisplacementMaps/AnkleCuffRightSpread.png differ diff --git a/DisplacementMaps/AnklesSquishClosed.png b/DisplacementMaps/AnklesSquishClosed.png new file mode 100644 index 000000000..c5ccec7b9 Binary files /dev/null and b/DisplacementMaps/AnklesSquishClosed.png differ diff --git a/DisplacementMaps/AnklesSquishKneel.png b/DisplacementMaps/AnklesSquishKneel.png new file mode 100644 index 000000000..d259613b3 Binary files /dev/null and b/DisplacementMaps/AnklesSquishKneel.png differ diff --git a/DisplacementMaps/Arm1SquishBoxtie.png b/DisplacementMaps/Arm1SquishBoxtie.png new file mode 100644 index 000000000..907d91318 Binary files /dev/null and b/DisplacementMaps/Arm1SquishBoxtie.png differ diff --git a/DisplacementMaps/Arm1SquishWristtie.png b/DisplacementMaps/Arm1SquishWristtie.png new file mode 100644 index 000000000..3226d2f97 Binary files /dev/null and b/DisplacementMaps/Arm1SquishWristtie.png differ diff --git a/DisplacementMaps/Arm2SquishBoxtie.png b/DisplacementMaps/Arm2SquishBoxtie.png new file mode 100644 index 000000000..38f7002b6 Binary files /dev/null and b/DisplacementMaps/Arm2SquishBoxtie.png differ diff --git a/DisplacementMaps/Arm2SquishWristtie.png b/DisplacementMaps/Arm2SquishWristtie.png new file mode 100644 index 000000000..66baaa3e3 Binary files /dev/null and b/DisplacementMaps/Arm2SquishWristtie.png differ diff --git a/DisplacementMaps/ArmHarnessSquish.png b/DisplacementMaps/ArmHarnessSquish.png new file mode 100644 index 000000000..0cf1e7ed4 Binary files /dev/null and b/DisplacementMaps/ArmHarnessSquish.png differ diff --git a/DisplacementMaps/ArmStrapCrossed.png b/DisplacementMaps/ArmStrapCrossed.png new file mode 100644 index 000000000..c712f11a6 Binary files /dev/null and b/DisplacementMaps/ArmStrapCrossed.png differ diff --git a/DisplacementMaps/BallSuit.png b/DisplacementMaps/BallSuit.png new file mode 100644 index 000000000..c3046abac Binary files /dev/null and b/DisplacementMaps/BallSuit.png differ diff --git a/DisplacementMaps/BalletClosed.png b/DisplacementMaps/BalletClosed.png new file mode 100644 index 000000000..b2db879f2 Binary files /dev/null and b/DisplacementMaps/BalletClosed.png differ diff --git a/DisplacementMaps/BalletCuffsClosed.png b/DisplacementMaps/BalletCuffsClosed.png new file mode 100644 index 000000000..90f164e62 Binary files /dev/null and b/DisplacementMaps/BalletCuffsClosed.png differ diff --git a/DisplacementMaps/BalletCuffsHogtie.png b/DisplacementMaps/BalletCuffsHogtie.png new file mode 100644 index 000000000..70d821c39 Binary files /dev/null and b/DisplacementMaps/BalletCuffsHogtie.png differ diff --git a/DisplacementMaps/BalletCuffsKneel.png b/DisplacementMaps/BalletCuffsKneel.png new file mode 100644 index 000000000..6d64a9459 Binary files /dev/null and b/DisplacementMaps/BalletCuffsKneel.png differ diff --git a/DisplacementMaps/BalletCuffsKneelClosed.png b/DisplacementMaps/BalletCuffsKneelClosed.png new file mode 100644 index 000000000..9456b7aa2 Binary files /dev/null and b/DisplacementMaps/BalletCuffsKneelClosed.png differ diff --git a/DisplacementMaps/BalletCuffsSpread.png b/DisplacementMaps/BalletCuffsSpread.png new file mode 100644 index 000000000..d8fb6c014 Binary files /dev/null and b/DisplacementMaps/BalletCuffsSpread.png differ diff --git a/DisplacementMaps/BalletErase.png b/DisplacementMaps/BalletErase.png new file mode 100644 index 000000000..fc1629e24 Binary files /dev/null and b/DisplacementMaps/BalletErase.png differ diff --git a/DisplacementMaps/BalletEraseSpread.png b/DisplacementMaps/BalletEraseSpread.png new file mode 100644 index 000000000..068c18892 Binary files /dev/null and b/DisplacementMaps/BalletEraseSpread.png differ diff --git a/DisplacementMaps/BalletHogtie.png b/DisplacementMaps/BalletHogtie.png new file mode 100644 index 000000000..70d821c39 Binary files /dev/null and b/DisplacementMaps/BalletHogtie.png differ diff --git a/DisplacementMaps/BalletKneel.png b/DisplacementMaps/BalletKneel.png new file mode 100644 index 000000000..130b17c64 Binary files /dev/null and b/DisplacementMaps/BalletKneel.png differ diff --git a/DisplacementMaps/BalletKneelClosed.png b/DisplacementMaps/BalletKneelClosed.png new file mode 100644 index 000000000..f5e783017 Binary files /dev/null and b/DisplacementMaps/BalletKneelClosed.png differ diff --git a/DisplacementMaps/BalletRightErase.png b/DisplacementMaps/BalletRightErase.png new file mode 100644 index 000000000..fc1629e24 Binary files /dev/null and b/DisplacementMaps/BalletRightErase.png differ diff --git a/DisplacementMaps/BalletRightEraseClosed.png b/DisplacementMaps/BalletRightEraseClosed.png new file mode 100644 index 000000000..cdcff9025 Binary files /dev/null and b/DisplacementMaps/BalletRightEraseClosed.png differ diff --git a/DisplacementMaps/BalletRightEraseKneel.png b/DisplacementMaps/BalletRightEraseKneel.png new file mode 100644 index 000000000..ca1bcc98b Binary files /dev/null and b/DisplacementMaps/BalletRightEraseKneel.png differ diff --git a/DisplacementMaps/BalletSpread.png b/DisplacementMaps/BalletSpread.png new file mode 100644 index 000000000..a4815e369 Binary files /dev/null and b/DisplacementMaps/BalletSpread.png differ diff --git a/DisplacementMaps/BedStrapsHogtie.png b/DisplacementMaps/BedStrapsHogtie.png new file mode 100644 index 000000000..dca890acd Binary files /dev/null and b/DisplacementMaps/BedStrapsHogtie.png differ diff --git a/DisplacementMaps/BedStrapsHogtieBoxtie.png b/DisplacementMaps/BedStrapsHogtieBoxtie.png new file mode 100644 index 000000000..b67c7592d Binary files /dev/null and b/DisplacementMaps/BedStrapsHogtieBoxtie.png differ diff --git a/DisplacementMaps/Belt.png b/DisplacementMaps/Belt.png new file mode 100644 index 000000000..5cdb96d05 Binary files /dev/null and b/DisplacementMaps/Belt.png differ diff --git a/DisplacementMaps/BeltFeet1SquishClosed.png b/DisplacementMaps/BeltFeet1SquishClosed.png new file mode 100644 index 000000000..39861ae44 Binary files /dev/null and b/DisplacementMaps/BeltFeet1SquishClosed.png differ diff --git a/DisplacementMaps/BeltFeet1SquishKneelClosed.png b/DisplacementMaps/BeltFeet1SquishKneelClosed.png new file mode 100644 index 000000000..75fdb41ee Binary files /dev/null and b/DisplacementMaps/BeltFeet1SquishKneelClosed.png differ diff --git a/DisplacementMaps/BeltFeet2SquishClosed.png b/DisplacementMaps/BeltFeet2SquishClosed.png new file mode 100644 index 000000000..4876f16b7 Binary files /dev/null and b/DisplacementMaps/BeltFeet2SquishClosed.png differ diff --git a/DisplacementMaps/BeltFeet2SquishKneelClosed.png b/DisplacementMaps/BeltFeet2SquishKneelClosed.png new file mode 100644 index 000000000..7c5d06863 Binary files /dev/null and b/DisplacementMaps/BeltFeet2SquishKneelClosed.png differ diff --git a/DisplacementMaps/BeltLegs1SquishClosed.png b/DisplacementMaps/BeltLegs1SquishClosed.png new file mode 100644 index 000000000..d7578f4b6 Binary files /dev/null and b/DisplacementMaps/BeltLegs1SquishClosed.png differ diff --git a/DisplacementMaps/BeltLegs1SquishHogtie.png b/DisplacementMaps/BeltLegs1SquishHogtie.png new file mode 100644 index 000000000..3a92d7145 Binary files /dev/null and b/DisplacementMaps/BeltLegs1SquishHogtie.png differ diff --git a/DisplacementMaps/BeltLegs1SquishKneelClosed.png b/DisplacementMaps/BeltLegs1SquishKneelClosed.png new file mode 100644 index 000000000..dc4940a1a Binary files /dev/null and b/DisplacementMaps/BeltLegs1SquishKneelClosed.png differ diff --git a/DisplacementMaps/BeltLegs2SquishClosed.png b/DisplacementMaps/BeltLegs2SquishClosed.png new file mode 100644 index 000000000..b1f3a68e1 Binary files /dev/null and b/DisplacementMaps/BeltLegs2SquishClosed.png differ diff --git a/DisplacementMaps/BeltLegs2SquishHogtie.png b/DisplacementMaps/BeltLegs2SquishHogtie.png new file mode 100644 index 000000000..ef88e89fe Binary files /dev/null and b/DisplacementMaps/BeltLegs2SquishHogtie.png differ diff --git a/DisplacementMaps/BeltLegs2SquishKneelClosed.png b/DisplacementMaps/BeltLegs2SquishKneelClosed.png new file mode 100644 index 000000000..4f15bd831 Binary files /dev/null and b/DisplacementMaps/BeltLegs2SquishKneelClosed.png differ diff --git a/DisplacementMaps/BeltSquish.png b/DisplacementMaps/BeltSquish.png new file mode 100644 index 000000000..17d50fc00 Binary files /dev/null and b/DisplacementMaps/BeltSquish.png differ diff --git a/DisplacementMaps/BinderLeftBoxtie.png b/DisplacementMaps/BinderLeftBoxtie.png new file mode 100644 index 000000000..9f68be39e Binary files /dev/null and b/DisplacementMaps/BinderLeftBoxtie.png differ diff --git a/DisplacementMaps/BinderLeftWristtie.png b/DisplacementMaps/BinderLeftWristtie.png new file mode 100644 index 000000000..ba5184cdc Binary files /dev/null and b/DisplacementMaps/BinderLeftWristtie.png differ diff --git a/DisplacementMaps/BinderRightBoxtie.png b/DisplacementMaps/BinderRightBoxtie.png new file mode 100644 index 000000000..4ce715dc0 Binary files /dev/null and b/DisplacementMaps/BinderRightBoxtie.png differ diff --git a/DisplacementMaps/BinderRightWristtie.png b/DisplacementMaps/BinderRightWristtie.png new file mode 100644 index 000000000..43e1b5270 Binary files /dev/null and b/DisplacementMaps/BinderRightWristtie.png differ diff --git a/DisplacementMaps/BootsClosed.png b/DisplacementMaps/BootsClosed.png new file mode 100644 index 000000000..0bc950880 Binary files /dev/null and b/DisplacementMaps/BootsClosed.png differ diff --git a/DisplacementMaps/BootsHogtie.png b/DisplacementMaps/BootsHogtie.png new file mode 100644 index 000000000..d9ccf9717 Binary files /dev/null and b/DisplacementMaps/BootsHogtie.png differ diff --git a/DisplacementMaps/BootsKneel.png b/DisplacementMaps/BootsKneel.png new file mode 100644 index 000000000..a4640aff2 Binary files /dev/null and b/DisplacementMaps/BootsKneel.png differ diff --git a/DisplacementMaps/BootsKneelClosed.png b/DisplacementMaps/BootsKneelClosed.png new file mode 100644 index 000000000..a4640aff2 Binary files /dev/null and b/DisplacementMaps/BootsKneelClosed.png differ diff --git a/DisplacementMaps/BootsShortClosed.png b/DisplacementMaps/BootsShortClosed.png new file mode 100644 index 000000000..4d813abb5 Binary files /dev/null and b/DisplacementMaps/BootsShortClosed.png differ diff --git a/DisplacementMaps/BootsShortHogtie.png b/DisplacementMaps/BootsShortHogtie.png new file mode 100644 index 000000000..d9ccf9717 Binary files /dev/null and b/DisplacementMaps/BootsShortHogtie.png differ diff --git a/DisplacementMaps/BootsShortKneel.png b/DisplacementMaps/BootsShortKneel.png new file mode 100644 index 000000000..039fafb29 Binary files /dev/null and b/DisplacementMaps/BootsShortKneel.png differ diff --git a/DisplacementMaps/BootsShortKneelClosed.png b/DisplacementMaps/BootsShortKneelClosed.png new file mode 100644 index 000000000..8a8445e5b Binary files /dev/null and b/DisplacementMaps/BootsShortKneelClosed.png differ diff --git a/DisplacementMaps/BootsShortSpread.png b/DisplacementMaps/BootsShortSpread.png new file mode 100644 index 000000000..1e2fcac9b Binary files /dev/null and b/DisplacementMaps/BootsShortSpread.png differ diff --git a/DisplacementMaps/BootsSpread.png b/DisplacementMaps/BootsSpread.png new file mode 100644 index 000000000..f5cec52b9 Binary files /dev/null and b/DisplacementMaps/BootsSpread.png differ diff --git a/DisplacementMaps/Breastplate.png b/DisplacementMaps/Breastplate.png new file mode 100644 index 000000000..ed31de4db Binary files /dev/null and b/DisplacementMaps/Breastplate.png differ diff --git a/DisplacementMaps/Bubble.png b/DisplacementMaps/Bubble.png new file mode 100644 index 000000000..a9bbc4a8c Binary files /dev/null and b/DisplacementMaps/Bubble.png differ diff --git a/DisplacementMaps/Bubble2.png b/DisplacementMaps/Bubble2.png new file mode 100644 index 000000000..b6b49168c Binary files /dev/null and b/DisplacementMaps/Bubble2.png differ diff --git a/DisplacementMaps/BubbleHead.png b/DisplacementMaps/BubbleHead.png new file mode 100644 index 000000000..7b3b696a6 Binary files /dev/null and b/DisplacementMaps/BubbleHead.png differ diff --git a/DisplacementMaps/BustHuge.png b/DisplacementMaps/BustHuge.png new file mode 100644 index 000000000..966671a3a Binary files /dev/null and b/DisplacementMaps/BustHuge.png differ diff --git a/DisplacementMaps/ButtSleeves.png b/DisplacementMaps/ButtSleeves.png new file mode 100644 index 000000000..ab7353551 Binary files /dev/null and b/DisplacementMaps/ButtSleeves.png differ diff --git a/DisplacementMaps/Calf1SquishClosed.png b/DisplacementMaps/Calf1SquishClosed.png new file mode 100644 index 000000000..40d2512fd Binary files /dev/null and b/DisplacementMaps/Calf1SquishClosed.png differ diff --git a/DisplacementMaps/Calf1SquishKneelClosed.png b/DisplacementMaps/Calf1SquishKneelClosed.png new file mode 100644 index 000000000..b24401cec Binary files /dev/null and b/DisplacementMaps/Calf1SquishKneelClosed.png differ diff --git a/DisplacementMaps/Calf2SquishClosed.png b/DisplacementMaps/Calf2SquishClosed.png new file mode 100644 index 000000000..7c6708f4f Binary files /dev/null and b/DisplacementMaps/Calf2SquishClosed.png differ diff --git a/DisplacementMaps/Calf2SquishHogtie.png b/DisplacementMaps/Calf2SquishHogtie.png new file mode 100644 index 000000000..ccc568959 Binary files /dev/null and b/DisplacementMaps/Calf2SquishHogtie.png differ diff --git a/DisplacementMaps/Calf2SquishKneelClosed.png b/DisplacementMaps/Calf2SquishKneelClosed.png new file mode 100644 index 000000000..02ce31e90 Binary files /dev/null and b/DisplacementMaps/Calf2SquishKneelClosed.png differ diff --git a/DisplacementMaps/Calf3SquishClosed.png b/DisplacementMaps/Calf3SquishClosed.png new file mode 100644 index 000000000..49d0741f0 Binary files /dev/null and b/DisplacementMaps/Calf3SquishClosed.png differ diff --git a/DisplacementMaps/Calf3SquishHogtie.png b/DisplacementMaps/Calf3SquishHogtie.png new file mode 100644 index 000000000..d2951854f Binary files /dev/null and b/DisplacementMaps/Calf3SquishHogtie.png differ diff --git a/DisplacementMaps/Calf3SquishKneelClosed.png b/DisplacementMaps/Calf3SquishKneelClosed.png new file mode 100644 index 000000000..76df45cbe Binary files /dev/null and b/DisplacementMaps/Calf3SquishKneelClosed.png differ diff --git a/DisplacementMaps/CorsetSquish.png b/DisplacementMaps/CorsetSquish.png new file mode 100644 index 000000000..2fc0a753b Binary files /dev/null and b/DisplacementMaps/CorsetSquish.png differ diff --git a/DisplacementMaps/CorsetSquishTight.png b/DisplacementMaps/CorsetSquishTight.png new file mode 100644 index 000000000..a3e14360c Binary files /dev/null and b/DisplacementMaps/CorsetSquishTight.png differ diff --git a/DisplacementMaps/CrotchropeSquished.png b/DisplacementMaps/CrotchropeSquished.png new file mode 100644 index 000000000..380a58aa6 Binary files /dev/null and b/DisplacementMaps/CrotchropeSquished.png differ diff --git a/DisplacementMaps/CrystalErase.png b/DisplacementMaps/CrystalErase.png new file mode 100644 index 000000000..514782656 Binary files /dev/null and b/DisplacementMaps/CrystalErase.png differ diff --git a/DisplacementMaps/CuffLeftCrossed.png b/DisplacementMaps/CuffLeftCrossed.png new file mode 100644 index 000000000..02b82ffd6 Binary files /dev/null and b/DisplacementMaps/CuffLeftCrossed.png differ diff --git a/DisplacementMaps/CuffLeftFree.png b/DisplacementMaps/CuffLeftFree.png new file mode 100644 index 000000000..e91b32df0 Binary files /dev/null and b/DisplacementMaps/CuffLeftFree.png differ diff --git a/DisplacementMaps/CuffLeftFront.png b/DisplacementMaps/CuffLeftFront.png new file mode 100644 index 000000000..09a704e0e Binary files /dev/null and b/DisplacementMaps/CuffLeftFront.png differ diff --git a/DisplacementMaps/CuffLeftYoked.png b/DisplacementMaps/CuffLeftYoked.png new file mode 100644 index 000000000..b14c4a60b Binary files /dev/null and b/DisplacementMaps/CuffLeftYoked.png differ diff --git a/DisplacementMaps/CuffRightCrossed.png b/DisplacementMaps/CuffRightCrossed.png new file mode 100644 index 000000000..abebf8c01 Binary files /dev/null and b/DisplacementMaps/CuffRightCrossed.png differ diff --git a/DisplacementMaps/CuffRightFree.png b/DisplacementMaps/CuffRightFree.png new file mode 100644 index 000000000..a5b1b9450 Binary files /dev/null and b/DisplacementMaps/CuffRightFree.png differ diff --git a/DisplacementMaps/CuffRightFront.png b/DisplacementMaps/CuffRightFront.png new file mode 100644 index 000000000..ea198f28a Binary files /dev/null and b/DisplacementMaps/CuffRightFront.png differ diff --git a/DisplacementMaps/CuffRightYoked.png b/DisplacementMaps/CuffRightYoked.png new file mode 100644 index 000000000..28024ee7e Binary files /dev/null and b/DisplacementMaps/CuffRightYoked.png differ diff --git a/DisplacementMaps/CuffsSquishCrossed.png b/DisplacementMaps/CuffsSquishCrossed.png new file mode 100644 index 000000000..6e02ff941 Binary files /dev/null and b/DisplacementMaps/CuffsSquishCrossed.png differ diff --git a/DisplacementMaps/CuffsSquishFront.png b/DisplacementMaps/CuffsSquishFront.png new file mode 100644 index 000000000..bc5a47ff1 Binary files /dev/null and b/DisplacementMaps/CuffsSquishFront.png differ diff --git a/DisplacementMaps/ElbowCuffLeftBoxtie.png b/DisplacementMaps/ElbowCuffLeftBoxtie.png new file mode 100644 index 000000000..d1ea2a373 Binary files /dev/null and b/DisplacementMaps/ElbowCuffLeftBoxtie.png differ diff --git a/DisplacementMaps/ElbowCuffLeftCrossed.png b/DisplacementMaps/ElbowCuffLeftCrossed.png new file mode 100644 index 000000000..fbde94d12 Binary files /dev/null and b/DisplacementMaps/ElbowCuffLeftCrossed.png differ diff --git a/DisplacementMaps/ElbowCuffLeftFree.png b/DisplacementMaps/ElbowCuffLeftFree.png new file mode 100644 index 000000000..8eff68ee7 Binary files /dev/null and b/DisplacementMaps/ElbowCuffLeftFree.png differ diff --git a/DisplacementMaps/ElbowCuffLeftFront.png b/DisplacementMaps/ElbowCuffLeftFront.png new file mode 100644 index 000000000..6e263d991 Binary files /dev/null and b/DisplacementMaps/ElbowCuffLeftFront.png differ diff --git a/DisplacementMaps/ElbowCuffLeftUp.png b/DisplacementMaps/ElbowCuffLeftUp.png new file mode 100644 index 000000000..9e447b369 Binary files /dev/null and b/DisplacementMaps/ElbowCuffLeftUp.png differ diff --git a/DisplacementMaps/ElbowCuffLeftWristtie.png b/DisplacementMaps/ElbowCuffLeftWristtie.png new file mode 100644 index 000000000..b5877a836 Binary files /dev/null and b/DisplacementMaps/ElbowCuffLeftWristtie.png differ diff --git a/DisplacementMaps/ElbowCuffLeftYoked.png b/DisplacementMaps/ElbowCuffLeftYoked.png new file mode 100644 index 000000000..0bae1402a Binary files /dev/null and b/DisplacementMaps/ElbowCuffLeftYoked.png differ diff --git a/DisplacementMaps/ElbowCuffRightBoxtie.png b/DisplacementMaps/ElbowCuffRightBoxtie.png new file mode 100644 index 000000000..af949cbd0 Binary files /dev/null and b/DisplacementMaps/ElbowCuffRightBoxtie.png differ diff --git a/DisplacementMaps/ElbowCuffRightCrossed.png b/DisplacementMaps/ElbowCuffRightCrossed.png new file mode 100644 index 000000000..ec57f89a5 Binary files /dev/null and b/DisplacementMaps/ElbowCuffRightCrossed.png differ diff --git a/DisplacementMaps/ElbowCuffRightFree.png b/DisplacementMaps/ElbowCuffRightFree.png new file mode 100644 index 000000000..295bbed5d Binary files /dev/null and b/DisplacementMaps/ElbowCuffRightFree.png differ diff --git a/DisplacementMaps/ElbowCuffRightFront.png b/DisplacementMaps/ElbowCuffRightFront.png new file mode 100644 index 000000000..7930928ed Binary files /dev/null and b/DisplacementMaps/ElbowCuffRightFront.png differ diff --git a/DisplacementMaps/ElbowCuffRightUp.png b/DisplacementMaps/ElbowCuffRightUp.png new file mode 100644 index 000000000..413228084 Binary files /dev/null and b/DisplacementMaps/ElbowCuffRightUp.png differ diff --git a/DisplacementMaps/ElbowCuffRightWristtie.png b/DisplacementMaps/ElbowCuffRightWristtie.png new file mode 100644 index 000000000..f068517a0 Binary files /dev/null and b/DisplacementMaps/ElbowCuffRightWristtie.png differ diff --git a/DisplacementMaps/ElbowCuffRightYoked.png b/DisplacementMaps/ElbowCuffRightYoked.png new file mode 100644 index 000000000..0eb0583dc Binary files /dev/null and b/DisplacementMaps/ElbowCuffRightYoked.png differ diff --git a/DisplacementMaps/EraseCorset.png b/DisplacementMaps/EraseCorset.png new file mode 100644 index 000000000..66b289499 Binary files /dev/null and b/DisplacementMaps/EraseCorset.png differ diff --git a/DisplacementMaps/EraseCorsetEncase.png b/DisplacementMaps/EraseCorsetEncase.png new file mode 100644 index 000000000..32757e7af Binary files /dev/null and b/DisplacementMaps/EraseCorsetEncase.png differ diff --git a/DisplacementMaps/EraseCorsetKneel.png b/DisplacementMaps/EraseCorsetKneel.png new file mode 100644 index 000000000..09b10af11 Binary files /dev/null and b/DisplacementMaps/EraseCorsetKneel.png differ diff --git a/DisplacementMaps/EraseCorsetKneelEncase.png b/DisplacementMaps/EraseCorsetKneelEncase.png new file mode 100644 index 000000000..32757e7af Binary files /dev/null and b/DisplacementMaps/EraseCorsetKneelEncase.png differ diff --git a/DisplacementMaps/EraseSkirtSplit.png b/DisplacementMaps/EraseSkirtSplit.png new file mode 100644 index 000000000..be1678bbd Binary files /dev/null and b/DisplacementMaps/EraseSkirtSplit.png differ diff --git a/DisplacementMaps/Fiddle.png b/DisplacementMaps/Fiddle.png new file mode 100644 index 000000000..69212d700 Binary files /dev/null and b/DisplacementMaps/Fiddle.png differ diff --git a/DisplacementMaps/ForeArm1SquishWristtie.png b/DisplacementMaps/ForeArm1SquishWristtie.png new file mode 100644 index 000000000..a085a7bc7 Binary files /dev/null and b/DisplacementMaps/ForeArm1SquishWristtie.png differ diff --git a/DisplacementMaps/ForeArm2SquishWristtie.png b/DisplacementMaps/ForeArm2SquishWristtie.png new file mode 100644 index 000000000..b560b941d Binary files /dev/null and b/DisplacementMaps/ForeArm2SquishWristtie.png differ diff --git a/DisplacementMaps/FrogThigh1SquishKneel.png b/DisplacementMaps/FrogThigh1SquishKneel.png new file mode 100644 index 000000000..c7ce04c57 Binary files /dev/null and b/DisplacementMaps/FrogThigh1SquishKneel.png differ diff --git a/DisplacementMaps/FrogThigh1SquishKneelClosed.png b/DisplacementMaps/FrogThigh1SquishKneelClosed.png new file mode 100644 index 000000000..5f97db4ec Binary files /dev/null and b/DisplacementMaps/FrogThigh1SquishKneelClosed.png differ diff --git a/DisplacementMaps/FrogThigh2SquishKneel.png b/DisplacementMaps/FrogThigh2SquishKneel.png new file mode 100644 index 000000000..0ac3dd70a Binary files /dev/null and b/DisplacementMaps/FrogThigh2SquishKneel.png differ diff --git a/DisplacementMaps/FrogThigh2SquishKneelClosed.png b/DisplacementMaps/FrogThigh2SquishKneelClosed.png new file mode 100644 index 000000000..1632a582a Binary files /dev/null and b/DisplacementMaps/FrogThigh2SquishKneelClosed.png differ diff --git a/DisplacementMaps/FrogThigh3SquishKneel.png b/DisplacementMaps/FrogThigh3SquishKneel.png new file mode 100644 index 000000000..8a69a08dd Binary files /dev/null and b/DisplacementMaps/FrogThigh3SquishKneel.png differ diff --git a/DisplacementMaps/FrogThigh3SquishKneelClosed.png b/DisplacementMaps/FrogThigh3SquishKneelClosed.png new file mode 100644 index 000000000..4fd22ac96 Binary files /dev/null and b/DisplacementMaps/FrogThigh3SquishKneelClosed.png differ diff --git a/DisplacementMaps/FutureBox.png b/DisplacementMaps/FutureBox.png new file mode 100644 index 000000000..4cde2c37f Binary files /dev/null and b/DisplacementMaps/FutureBox.png differ diff --git a/DisplacementMaps/GuardLeftFree.png b/DisplacementMaps/GuardLeftFree.png new file mode 100644 index 000000000..9390af289 Binary files /dev/null and b/DisplacementMaps/GuardLeftFree.png differ diff --git a/DisplacementMaps/GuardLeftFront.png b/DisplacementMaps/GuardLeftFront.png new file mode 100644 index 000000000..ff5721676 Binary files /dev/null and b/DisplacementMaps/GuardLeftFront.png differ diff --git a/DisplacementMaps/GuardLeftYoked.png b/DisplacementMaps/GuardLeftYoked.png new file mode 100644 index 000000000..4b89f1ed9 Binary files /dev/null and b/DisplacementMaps/GuardLeftYoked.png differ diff --git a/DisplacementMaps/GuardRightFree.png b/DisplacementMaps/GuardRightFree.png new file mode 100644 index 000000000..d2ce9fb58 Binary files /dev/null and b/DisplacementMaps/GuardRightFree.png differ diff --git a/DisplacementMaps/GuardRightFront.png b/DisplacementMaps/GuardRightFront.png new file mode 100644 index 000000000..280e6d5eb Binary files /dev/null and b/DisplacementMaps/GuardRightFront.png differ diff --git a/DisplacementMaps/GuardRightYoked.png b/DisplacementMaps/GuardRightYoked.png new file mode 100644 index 000000000..1ae44119c Binary files /dev/null and b/DisplacementMaps/GuardRightYoked.png differ diff --git a/DisplacementMaps/HarnessSquish.png b/DisplacementMaps/HarnessSquish.png new file mode 100644 index 000000000..5e313c096 Binary files /dev/null and b/DisplacementMaps/HarnessSquish.png differ diff --git a/DisplacementMaps/Heels2Closed.png b/DisplacementMaps/Heels2Closed.png new file mode 100644 index 000000000..840d98e2f Binary files /dev/null and b/DisplacementMaps/Heels2Closed.png differ diff --git a/DisplacementMaps/Heels2Hogtie.png b/DisplacementMaps/Heels2Hogtie.png new file mode 100644 index 000000000..70d821c39 Binary files /dev/null and b/DisplacementMaps/Heels2Hogtie.png differ diff --git a/DisplacementMaps/Heels2Kneel.png b/DisplacementMaps/Heels2Kneel.png new file mode 100644 index 000000000..bc964777e Binary files /dev/null and b/DisplacementMaps/Heels2Kneel.png differ diff --git a/DisplacementMaps/Heels2KneelClosed.png b/DisplacementMaps/Heels2KneelClosed.png new file mode 100644 index 000000000..bbe28b415 Binary files /dev/null and b/DisplacementMaps/Heels2KneelClosed.png differ diff --git a/DisplacementMaps/Heels2Spread.png b/DisplacementMaps/Heels2Spread.png new file mode 100644 index 000000000..02a897d7f Binary files /dev/null and b/DisplacementMaps/Heels2Spread.png differ diff --git a/DisplacementMaps/HeelsClosed.png b/DisplacementMaps/HeelsClosed.png new file mode 100644 index 000000000..840d98e2f Binary files /dev/null and b/DisplacementMaps/HeelsClosed.png differ diff --git a/DisplacementMaps/HeelsErase.png b/DisplacementMaps/HeelsErase.png new file mode 100644 index 000000000..fc1629e24 Binary files /dev/null and b/DisplacementMaps/HeelsErase.png differ diff --git a/DisplacementMaps/HeelsEraseClosed.png b/DisplacementMaps/HeelsEraseClosed.png new file mode 100644 index 000000000..12ae04887 Binary files /dev/null and b/DisplacementMaps/HeelsEraseClosed.png differ diff --git a/DisplacementMaps/HeelsEraseSpread.png b/DisplacementMaps/HeelsEraseSpread.png new file mode 100644 index 000000000..fc1629e24 Binary files /dev/null and b/DisplacementMaps/HeelsEraseSpread.png differ diff --git a/DisplacementMaps/HeelsHogtie.png b/DisplacementMaps/HeelsHogtie.png new file mode 100644 index 000000000..70d821c39 Binary files /dev/null and b/DisplacementMaps/HeelsHogtie.png differ diff --git a/DisplacementMaps/HeelsKneel.png b/DisplacementMaps/HeelsKneel.png new file mode 100644 index 000000000..713c51b10 Binary files /dev/null and b/DisplacementMaps/HeelsKneel.png differ diff --git a/DisplacementMaps/HeelsKneelClosed.png b/DisplacementMaps/HeelsKneelClosed.png new file mode 100644 index 000000000..a5fff2702 Binary files /dev/null and b/DisplacementMaps/HeelsKneelClosed.png differ diff --git a/DisplacementMaps/HeelsRightErase.png b/DisplacementMaps/HeelsRightErase.png new file mode 100644 index 000000000..7f19911f1 Binary files /dev/null and b/DisplacementMaps/HeelsRightErase.png differ diff --git a/DisplacementMaps/HeelsRightErase2.png b/DisplacementMaps/HeelsRightErase2.png new file mode 100644 index 000000000..423afce37 Binary files /dev/null and b/DisplacementMaps/HeelsRightErase2.png differ diff --git a/DisplacementMaps/HeelsRightErase2Closed.png b/DisplacementMaps/HeelsRightErase2Closed.png new file mode 100644 index 000000000..cc3182437 Binary files /dev/null and b/DisplacementMaps/HeelsRightErase2Closed.png differ diff --git a/DisplacementMaps/HeelsRightEraseClosed.png b/DisplacementMaps/HeelsRightEraseClosed.png new file mode 100644 index 000000000..cc3182437 Binary files /dev/null and b/DisplacementMaps/HeelsRightEraseClosed.png differ diff --git a/DisplacementMaps/HeelsSpread.png b/DisplacementMaps/HeelsSpread.png new file mode 100644 index 000000000..f42504bf9 Binary files /dev/null and b/DisplacementMaps/HeelsSpread.png differ diff --git a/DisplacementMaps/HideBoxtieHand.png b/DisplacementMaps/HideBoxtieHand.png new file mode 100644 index 000000000..74fd71b5f Binary files /dev/null and b/DisplacementMaps/HideBoxtieHand.png differ diff --git a/DisplacementMaps/JacketArmsBoxtie.png b/DisplacementMaps/JacketArmsBoxtie.png new file mode 100644 index 000000000..818697db4 Binary files /dev/null and b/DisplacementMaps/JacketArmsBoxtie.png differ diff --git a/DisplacementMaps/JacketArmsCrossed.png b/DisplacementMaps/JacketArmsCrossed.png new file mode 100644 index 000000000..614778308 Binary files /dev/null and b/DisplacementMaps/JacketArmsCrossed.png differ diff --git a/DisplacementMaps/JacketArmsWristtie.png b/DisplacementMaps/JacketArmsWristtie.png new file mode 100644 index 000000000..623a7d093 Binary files /dev/null and b/DisplacementMaps/JacketArmsWristtie.png differ diff --git a/DisplacementMaps/JacketBoxtie.png b/DisplacementMaps/JacketBoxtie.png new file mode 100644 index 000000000..9b40a3c3a Binary files /dev/null and b/DisplacementMaps/JacketBoxtie.png differ diff --git a/DisplacementMaps/JacketCrossed.png b/DisplacementMaps/JacketCrossed.png new file mode 100644 index 000000000..dd116fbcf Binary files /dev/null and b/DisplacementMaps/JacketCrossed.png differ diff --git a/DisplacementMaps/JacketWristtie.png b/DisplacementMaps/JacketWristtie.png new file mode 100644 index 000000000..36e7fc063 Binary files /dev/null and b/DisplacementMaps/JacketWristtie.png differ diff --git a/DisplacementMaps/LaceChest.png b/DisplacementMaps/LaceChest.png new file mode 100644 index 000000000..32a641dd5 Binary files /dev/null and b/DisplacementMaps/LaceChest.png differ diff --git a/DisplacementMaps/Leg1SquishClosed.png b/DisplacementMaps/Leg1SquishClosed.png new file mode 100644 index 000000000..aec659756 Binary files /dev/null and b/DisplacementMaps/Leg1SquishClosed.png differ diff --git a/DisplacementMaps/LegbinderSquishClosed.png b/DisplacementMaps/LegbinderSquishClosed.png new file mode 100644 index 000000000..9afac4fd9 Binary files /dev/null and b/DisplacementMaps/LegbinderSquishClosed.png differ diff --git a/DisplacementMaps/LegbinderSquishHogtie.png b/DisplacementMaps/LegbinderSquishHogtie.png new file mode 100644 index 000000000..7ef906798 Binary files /dev/null and b/DisplacementMaps/LegbinderSquishHogtie.png differ diff --git a/DisplacementMaps/LegbinderSquishKneelClosed.png b/DisplacementMaps/LegbinderSquishKneelClosed.png new file mode 100644 index 000000000..6bdf7edbb Binary files /dev/null and b/DisplacementMaps/LegbinderSquishKneelClosed.png differ diff --git a/DisplacementMaps/LightMaidRightArmErase.png b/DisplacementMaps/LightMaidRightArmErase.png new file mode 100644 index 000000000..ccadf160b Binary files /dev/null and b/DisplacementMaps/LightMaidRightArmErase.png differ diff --git a/DisplacementMaps/MittLCrossed.png b/DisplacementMaps/MittLCrossed.png new file mode 100644 index 000000000..c748e47f1 Binary files /dev/null and b/DisplacementMaps/MittLCrossed.png differ diff --git a/DisplacementMaps/MittLFree.png b/DisplacementMaps/MittLFree.png new file mode 100644 index 000000000..63bd7817f Binary files /dev/null and b/DisplacementMaps/MittLFree.png differ diff --git a/DisplacementMaps/MittLFront.png b/DisplacementMaps/MittLFront.png new file mode 100644 index 000000000..f0d7e08cf Binary files /dev/null and b/DisplacementMaps/MittLFront.png differ diff --git a/DisplacementMaps/MittLYoked.png b/DisplacementMaps/MittLYoked.png new file mode 100644 index 000000000..634cf9ead Binary files /dev/null and b/DisplacementMaps/MittLYoked.png differ diff --git a/DisplacementMaps/MittRCrossed.png b/DisplacementMaps/MittRCrossed.png new file mode 100644 index 000000000..c748e47f1 Binary files /dev/null and b/DisplacementMaps/MittRCrossed.png differ diff --git a/DisplacementMaps/MittRFree.png b/DisplacementMaps/MittRFree.png new file mode 100644 index 000000000..f56061de3 Binary files /dev/null and b/DisplacementMaps/MittRFree.png differ diff --git a/DisplacementMaps/MittRFront.png b/DisplacementMaps/MittRFront.png new file mode 100644 index 000000000..c6e6759c7 Binary files /dev/null and b/DisplacementMaps/MittRFront.png differ diff --git a/DisplacementMaps/MittRYoked.png b/DisplacementMaps/MittRYoked.png new file mode 100644 index 000000000..35bdfd0e8 Binary files /dev/null and b/DisplacementMaps/MittRYoked.png differ diff --git a/DisplacementMaps/MittsCrossed.png b/DisplacementMaps/MittsCrossed.png new file mode 100644 index 000000000..c748e47f1 Binary files /dev/null and b/DisplacementMaps/MittsCrossed.png differ diff --git a/DisplacementMaps/MittsFree.png b/DisplacementMaps/MittsFree.png new file mode 100644 index 000000000..e8a565c07 Binary files /dev/null and b/DisplacementMaps/MittsFree.png differ diff --git a/DisplacementMaps/MittsFront.png b/DisplacementMaps/MittsFront.png new file mode 100644 index 000000000..c8b708eca Binary files /dev/null and b/DisplacementMaps/MittsFront.png differ diff --git a/DisplacementMaps/MittsYoked.png b/DisplacementMaps/MittsYoked.png new file mode 100644 index 000000000..f6f881b52 Binary files /dev/null and b/DisplacementMaps/MittsYoked.png differ diff --git a/DisplacementMaps/Null.png b/DisplacementMaps/Null.png new file mode 100644 index 000000000..e20b092b0 Binary files /dev/null and b/DisplacementMaps/Null.png differ diff --git a/DisplacementMaps/PetsuitSquish.png b/DisplacementMaps/PetsuitSquish.png new file mode 100644 index 000000000..6a37ccd88 Binary files /dev/null and b/DisplacementMaps/PetsuitSquish.png differ diff --git a/DisplacementMaps/ReversePrayer.png b/DisplacementMaps/ReversePrayer.png new file mode 100644 index 000000000..b4fe4e678 Binary files /dev/null and b/DisplacementMaps/ReversePrayer.png differ diff --git a/DisplacementMaps/Sarco.png b/DisplacementMaps/Sarco.png new file mode 100644 index 000000000..a36b1e1f2 Binary files /dev/null and b/DisplacementMaps/Sarco.png differ diff --git a/DisplacementMaps/SlimeCorsetErase.png b/DisplacementMaps/SlimeCorsetErase.png new file mode 100644 index 000000000..360d20c44 Binary files /dev/null and b/DisplacementMaps/SlimeCorsetErase.png differ diff --git a/DisplacementMaps/SlimeLeftClosed.png b/DisplacementMaps/SlimeLeftClosed.png new file mode 100644 index 000000000..d21e0924e Binary files /dev/null and b/DisplacementMaps/SlimeLeftClosed.png differ diff --git a/DisplacementMaps/SlimeRightClosed.png b/DisplacementMaps/SlimeRightClosed.png new file mode 100644 index 000000000..077478a1b Binary files /dev/null and b/DisplacementMaps/SlimeRightClosed.png differ diff --git a/DisplacementMaps/SlimeThighsClosed.png b/DisplacementMaps/SlimeThighsClosed.png new file mode 100644 index 000000000..9afac4fd9 Binary files /dev/null and b/DisplacementMaps/SlimeThighsClosed.png differ diff --git a/DisplacementMaps/SlimeThighsHogtie.png b/DisplacementMaps/SlimeThighsHogtie.png new file mode 100644 index 000000000..7ef906798 Binary files /dev/null and b/DisplacementMaps/SlimeThighsHogtie.png differ diff --git a/DisplacementMaps/SlimeThighsKneelClosed.png b/DisplacementMaps/SlimeThighsKneelClosed.png new file mode 100644 index 000000000..261221a13 Binary files /dev/null and b/DisplacementMaps/SlimeThighsKneelClosed.png differ diff --git a/DisplacementMaps/SockLSquish_LongClosed.png b/DisplacementMaps/SockLSquish_LongClosed.png new file mode 100644 index 000000000..4542d850f Binary files /dev/null and b/DisplacementMaps/SockLSquish_LongClosed.png differ diff --git a/DisplacementMaps/SockLSquish_LongHogtie.png b/DisplacementMaps/SockLSquish_LongHogtie.png new file mode 100644 index 000000000..ef2e848f8 Binary files /dev/null and b/DisplacementMaps/SockLSquish_LongHogtie.png differ diff --git a/DisplacementMaps/SockLSquish_LongKneel.png b/DisplacementMaps/SockLSquish_LongKneel.png new file mode 100644 index 000000000..30c0c78fc Binary files /dev/null and b/DisplacementMaps/SockLSquish_LongKneel.png differ diff --git a/DisplacementMaps/SockLSquish_LongKneelClosed.png b/DisplacementMaps/SockLSquish_LongKneelClosed.png new file mode 100644 index 000000000..169867e66 Binary files /dev/null and b/DisplacementMaps/SockLSquish_LongKneelClosed.png differ diff --git a/DisplacementMaps/SockLSquish_LongSpread.png b/DisplacementMaps/SockLSquish_LongSpread.png new file mode 100644 index 000000000..ed3ca52de Binary files /dev/null and b/DisplacementMaps/SockLSquish_LongSpread.png differ diff --git a/DisplacementMaps/SockLSquish_MidClosed.png b/DisplacementMaps/SockLSquish_MidClosed.png new file mode 100644 index 000000000..433e6c957 Binary files /dev/null and b/DisplacementMaps/SockLSquish_MidClosed.png differ diff --git a/DisplacementMaps/SockLSquish_MidHogtie.png b/DisplacementMaps/SockLSquish_MidHogtie.png new file mode 100644 index 000000000..e37319a76 Binary files /dev/null and b/DisplacementMaps/SockLSquish_MidHogtie.png differ diff --git a/DisplacementMaps/SockLSquish_MidKneel.png b/DisplacementMaps/SockLSquish_MidKneel.png new file mode 100644 index 000000000..45ed904d1 Binary files /dev/null and b/DisplacementMaps/SockLSquish_MidKneel.png differ diff --git a/DisplacementMaps/SockLSquish_MidKneelClosed.png b/DisplacementMaps/SockLSquish_MidKneelClosed.png new file mode 100644 index 000000000..bf9f1a3b5 Binary files /dev/null and b/DisplacementMaps/SockLSquish_MidKneelClosed.png differ diff --git a/DisplacementMaps/SockLSquish_MidSpread.png b/DisplacementMaps/SockLSquish_MidSpread.png new file mode 100644 index 000000000..a43b6e368 Binary files /dev/null and b/DisplacementMaps/SockLSquish_MidSpread.png differ diff --git a/DisplacementMaps/SockLSquish_ShortClosed.png b/DisplacementMaps/SockLSquish_ShortClosed.png new file mode 100644 index 000000000..1cebfa599 Binary files /dev/null and b/DisplacementMaps/SockLSquish_ShortClosed.png differ diff --git a/DisplacementMaps/SockLSquish_ShortHogtie.png b/DisplacementMaps/SockLSquish_ShortHogtie.png new file mode 100644 index 000000000..a14d4c393 Binary files /dev/null and b/DisplacementMaps/SockLSquish_ShortHogtie.png differ diff --git a/DisplacementMaps/SockLSquish_ShortKneel.png b/DisplacementMaps/SockLSquish_ShortKneel.png new file mode 100644 index 000000000..504a100a6 Binary files /dev/null and b/DisplacementMaps/SockLSquish_ShortKneel.png differ diff --git a/DisplacementMaps/SockLSquish_ShortKneelClosed.png b/DisplacementMaps/SockLSquish_ShortKneelClosed.png new file mode 100644 index 000000000..750d016b1 Binary files /dev/null and b/DisplacementMaps/SockLSquish_ShortKneelClosed.png differ diff --git a/DisplacementMaps/SockLSquish_ShortSpread.png b/DisplacementMaps/SockLSquish_ShortSpread.png new file mode 100644 index 000000000..c03fb388e Binary files /dev/null and b/DisplacementMaps/SockLSquish_ShortSpread.png differ diff --git a/DisplacementMaps/SockRSquish_LongClosed.png b/DisplacementMaps/SockRSquish_LongClosed.png new file mode 100644 index 000000000..4d59060fb Binary files /dev/null and b/DisplacementMaps/SockRSquish_LongClosed.png differ diff --git a/DisplacementMaps/SockRSquish_LongHogtie.png b/DisplacementMaps/SockRSquish_LongHogtie.png new file mode 100644 index 000000000..06a5fc79b Binary files /dev/null and b/DisplacementMaps/SockRSquish_LongHogtie.png differ diff --git a/DisplacementMaps/SockRSquish_LongKneel.png b/DisplacementMaps/SockRSquish_LongKneel.png new file mode 100644 index 000000000..f773dd608 Binary files /dev/null and b/DisplacementMaps/SockRSquish_LongKneel.png differ diff --git a/DisplacementMaps/SockRSquish_LongKneelClosed.png b/DisplacementMaps/SockRSquish_LongKneelClosed.png new file mode 100644 index 000000000..f773dd608 Binary files /dev/null and b/DisplacementMaps/SockRSquish_LongKneelClosed.png differ diff --git a/DisplacementMaps/SockRSquish_LongSpread.png b/DisplacementMaps/SockRSquish_LongSpread.png new file mode 100644 index 000000000..fe748440a Binary files /dev/null and b/DisplacementMaps/SockRSquish_LongSpread.png differ diff --git a/DisplacementMaps/SockRSquish_MidClosed.png b/DisplacementMaps/SockRSquish_MidClosed.png new file mode 100644 index 000000000..beab8473c Binary files /dev/null and b/DisplacementMaps/SockRSquish_MidClosed.png differ diff --git a/DisplacementMaps/SockRSquish_MidHogtie.png b/DisplacementMaps/SockRSquish_MidHogtie.png new file mode 100644 index 000000000..09c5d3bc3 Binary files /dev/null and b/DisplacementMaps/SockRSquish_MidHogtie.png differ diff --git a/DisplacementMaps/SockRSquish_MidKneel.png b/DisplacementMaps/SockRSquish_MidKneel.png new file mode 100644 index 000000000..9ec9782ad Binary files /dev/null and b/DisplacementMaps/SockRSquish_MidKneel.png differ diff --git a/DisplacementMaps/SockRSquish_MidKneelClosed.png b/DisplacementMaps/SockRSquish_MidKneelClosed.png new file mode 100644 index 000000000..ca7a6f0a3 Binary files /dev/null and b/DisplacementMaps/SockRSquish_MidKneelClosed.png differ diff --git a/DisplacementMaps/SockRSquish_MidSpread.png b/DisplacementMaps/SockRSquish_MidSpread.png new file mode 100644 index 000000000..e9376e8f4 Binary files /dev/null and b/DisplacementMaps/SockRSquish_MidSpread.png differ diff --git a/DisplacementMaps/SockRSquish_ShortClosed.png b/DisplacementMaps/SockRSquish_ShortClosed.png new file mode 100644 index 000000000..76081b25b Binary files /dev/null and b/DisplacementMaps/SockRSquish_ShortClosed.png differ diff --git a/DisplacementMaps/SockRSquish_ShortHogtie.png b/DisplacementMaps/SockRSquish_ShortHogtie.png new file mode 100644 index 000000000..c9aa2bda2 Binary files /dev/null and b/DisplacementMaps/SockRSquish_ShortHogtie.png differ diff --git a/DisplacementMaps/SockRSquish_ShortKneel.png b/DisplacementMaps/SockRSquish_ShortKneel.png new file mode 100644 index 000000000..8765c65c8 Binary files /dev/null and b/DisplacementMaps/SockRSquish_ShortKneel.png differ diff --git a/DisplacementMaps/SockRSquish_ShortKneelClosed.png b/DisplacementMaps/SockRSquish_ShortKneelClosed.png new file mode 100644 index 000000000..50e7bc800 Binary files /dev/null and b/DisplacementMaps/SockRSquish_ShortKneelClosed.png differ diff --git a/DisplacementMaps/SockRSquish_ShortSpread.png b/DisplacementMaps/SockRSquish_ShortSpread.png new file mode 100644 index 000000000..4ee91ea8c Binary files /dev/null and b/DisplacementMaps/SockRSquish_ShortSpread.png differ diff --git a/DisplacementMaps/SovietHatErase.png b/DisplacementMaps/SovietHatErase.png new file mode 100644 index 000000000..f327f658f Binary files /dev/null and b/DisplacementMaps/SovietHatErase.png differ diff --git a/DisplacementMaps/TapeAnklesSquishClosed.png b/DisplacementMaps/TapeAnklesSquishClosed.png new file mode 100644 index 000000000..9a6c598a4 Binary files /dev/null and b/DisplacementMaps/TapeAnklesSquishClosed.png differ diff --git a/DisplacementMaps/TapeAnklesSquishHogtie.png b/DisplacementMaps/TapeAnklesSquishHogtie.png new file mode 100644 index 000000000..de67ea58b Binary files /dev/null and b/DisplacementMaps/TapeAnklesSquishHogtie.png differ diff --git a/DisplacementMaps/TapeAnklesSquishKneel.png b/DisplacementMaps/TapeAnklesSquishKneel.png new file mode 100644 index 000000000..b94335fff Binary files /dev/null and b/DisplacementMaps/TapeAnklesSquishKneel.png differ diff --git a/DisplacementMaps/TapeAnklesSquishKneelClosed.png b/DisplacementMaps/TapeAnklesSquishKneelClosed.png new file mode 100644 index 000000000..b408941af Binary files /dev/null and b/DisplacementMaps/TapeAnklesSquishKneelClosed.png differ diff --git a/DisplacementMaps/TapeArmsBoxtie.png b/DisplacementMaps/TapeArmsBoxtie.png new file mode 100644 index 000000000..58cfbe90d Binary files /dev/null and b/DisplacementMaps/TapeArmsBoxtie.png differ diff --git a/DisplacementMaps/TapeClosed.png b/DisplacementMaps/TapeClosed.png new file mode 100644 index 000000000..5b21445c0 Binary files /dev/null and b/DisplacementMaps/TapeClosed.png differ diff --git a/DisplacementMaps/TapeFullLeft.png b/DisplacementMaps/TapeFullLeft.png new file mode 100644 index 000000000..5c935e21d Binary files /dev/null and b/DisplacementMaps/TapeFullLeft.png differ diff --git a/DisplacementMaps/TapeFullLeftBoxtie.png b/DisplacementMaps/TapeFullLeftBoxtie.png new file mode 100644 index 000000000..4872d4da6 Binary files /dev/null and b/DisplacementMaps/TapeFullLeftBoxtie.png differ diff --git a/DisplacementMaps/TapeFullLeftCrossed.png b/DisplacementMaps/TapeFullLeftCrossed.png new file mode 100644 index 000000000..f2e95a6fd Binary files /dev/null and b/DisplacementMaps/TapeFullLeftCrossed.png differ diff --git a/DisplacementMaps/TapeFullLeftWristtie.png b/DisplacementMaps/TapeFullLeftWristtie.png new file mode 100644 index 000000000..6efc341e8 Binary files /dev/null and b/DisplacementMaps/TapeFullLeftWristtie.png differ diff --git a/DisplacementMaps/TapeFullRight.png b/DisplacementMaps/TapeFullRight.png new file mode 100644 index 000000000..5c935e21d Binary files /dev/null and b/DisplacementMaps/TapeFullRight.png differ diff --git a/DisplacementMaps/TapeFullRightBoxtie.png b/DisplacementMaps/TapeFullRightBoxtie.png new file mode 100644 index 000000000..84ce946b0 Binary files /dev/null and b/DisplacementMaps/TapeFullRightBoxtie.png differ diff --git a/DisplacementMaps/TapeFullRightCrossed.png b/DisplacementMaps/TapeFullRightCrossed.png new file mode 100644 index 000000000..795ae0109 Binary files /dev/null and b/DisplacementMaps/TapeFullRightCrossed.png differ diff --git a/DisplacementMaps/TapeFullRightWristtie.png b/DisplacementMaps/TapeFullRightWristtie.png new file mode 100644 index 000000000..c978fb76a Binary files /dev/null and b/DisplacementMaps/TapeFullRightWristtie.png differ diff --git a/DisplacementMaps/TapeHeavyLeft.png b/DisplacementMaps/TapeHeavyLeft.png new file mode 100644 index 000000000..5c935e21d Binary files /dev/null and b/DisplacementMaps/TapeHeavyLeft.png differ diff --git a/DisplacementMaps/TapeHeavyLeftBoxtie.png b/DisplacementMaps/TapeHeavyLeftBoxtie.png new file mode 100644 index 000000000..4869a2615 Binary files /dev/null and b/DisplacementMaps/TapeHeavyLeftBoxtie.png differ diff --git a/DisplacementMaps/TapeHeavyLeftCrossed.png b/DisplacementMaps/TapeHeavyLeftCrossed.png new file mode 100644 index 000000000..81dc1c159 Binary files /dev/null and b/DisplacementMaps/TapeHeavyLeftCrossed.png differ diff --git a/DisplacementMaps/TapeHeavyLeftWristtie.png b/DisplacementMaps/TapeHeavyLeftWristtie.png new file mode 100644 index 000000000..f7e08e94c Binary files /dev/null and b/DisplacementMaps/TapeHeavyLeftWristtie.png differ diff --git a/DisplacementMaps/TapeHeavyRight.png b/DisplacementMaps/TapeHeavyRight.png new file mode 100644 index 000000000..5c935e21d Binary files /dev/null and b/DisplacementMaps/TapeHeavyRight.png differ diff --git a/DisplacementMaps/TapeHeavyRightBoxtie.png b/DisplacementMaps/TapeHeavyRightBoxtie.png new file mode 100644 index 000000000..82860ab3a Binary files /dev/null and b/DisplacementMaps/TapeHeavyRightBoxtie.png differ diff --git a/DisplacementMaps/TapeHeavyRightCrossed.png b/DisplacementMaps/TapeHeavyRightCrossed.png new file mode 100644 index 000000000..59eb4facf Binary files /dev/null and b/DisplacementMaps/TapeHeavyRightCrossed.png differ diff --git a/DisplacementMaps/TapeHeavyRightWristtie.png b/DisplacementMaps/TapeHeavyRightWristtie.png new file mode 100644 index 000000000..ff50e6794 Binary files /dev/null and b/DisplacementMaps/TapeHeavyRightWristtie.png differ diff --git a/DisplacementMaps/TapeLightLeft.png b/DisplacementMaps/TapeLightLeft.png new file mode 100644 index 000000000..5c935e21d Binary files /dev/null and b/DisplacementMaps/TapeLightLeft.png differ diff --git a/DisplacementMaps/TapeLightLeftBoxtie.png b/DisplacementMaps/TapeLightLeftBoxtie.png new file mode 100644 index 000000000..a51fc5712 Binary files /dev/null and b/DisplacementMaps/TapeLightLeftBoxtie.png differ diff --git a/DisplacementMaps/TapeLightLeftCrossed.png b/DisplacementMaps/TapeLightLeftCrossed.png new file mode 100644 index 000000000..3d9cf6ca9 Binary files /dev/null and b/DisplacementMaps/TapeLightLeftCrossed.png differ diff --git a/DisplacementMaps/TapeLightLeftWristtie.png b/DisplacementMaps/TapeLightLeftWristtie.png new file mode 100644 index 000000000..f60680782 Binary files /dev/null and b/DisplacementMaps/TapeLightLeftWristtie.png differ diff --git a/DisplacementMaps/TapeLightRight.png b/DisplacementMaps/TapeLightRight.png new file mode 100644 index 000000000..5c935e21d Binary files /dev/null and b/DisplacementMaps/TapeLightRight.png differ diff --git a/DisplacementMaps/TapeLightRightBoxtie.png b/DisplacementMaps/TapeLightRightBoxtie.png new file mode 100644 index 000000000..981ee0d85 Binary files /dev/null and b/DisplacementMaps/TapeLightRightBoxtie.png differ diff --git a/DisplacementMaps/TapeLightRightCrossed.png b/DisplacementMaps/TapeLightRightCrossed.png new file mode 100644 index 000000000..5463d51be Binary files /dev/null and b/DisplacementMaps/TapeLightRightCrossed.png differ diff --git a/DisplacementMaps/TapeLightRightWristtie.png b/DisplacementMaps/TapeLightRightWristtie.png new file mode 100644 index 000000000..a83c663e0 Binary files /dev/null and b/DisplacementMaps/TapeLightRightWristtie.png differ diff --git a/DisplacementMaps/TapeMedLeft.png b/DisplacementMaps/TapeMedLeft.png new file mode 100644 index 000000000..5c935e21d Binary files /dev/null and b/DisplacementMaps/TapeMedLeft.png differ diff --git a/DisplacementMaps/TapeMedLeftBoxtie.png b/DisplacementMaps/TapeMedLeftBoxtie.png new file mode 100644 index 000000000..19a5012d6 Binary files /dev/null and b/DisplacementMaps/TapeMedLeftBoxtie.png differ diff --git a/DisplacementMaps/TapeMedLeftCrossed.png b/DisplacementMaps/TapeMedLeftCrossed.png new file mode 100644 index 000000000..c82107d7f Binary files /dev/null and b/DisplacementMaps/TapeMedLeftCrossed.png differ diff --git a/DisplacementMaps/TapeMedLeftWristtie.png b/DisplacementMaps/TapeMedLeftWristtie.png new file mode 100644 index 000000000..2bb455618 Binary files /dev/null and b/DisplacementMaps/TapeMedLeftWristtie.png differ diff --git a/DisplacementMaps/TapeMedRight.png b/DisplacementMaps/TapeMedRight.png new file mode 100644 index 000000000..5c935e21d Binary files /dev/null and b/DisplacementMaps/TapeMedRight.png differ diff --git a/DisplacementMaps/TapeMedRightBoxtie.png b/DisplacementMaps/TapeMedRightBoxtie.png new file mode 100644 index 000000000..f0dc51f0c Binary files /dev/null and b/DisplacementMaps/TapeMedRightBoxtie.png differ diff --git a/DisplacementMaps/TapeMedRightCrossed.png b/DisplacementMaps/TapeMedRightCrossed.png new file mode 100644 index 000000000..19abefada Binary files /dev/null and b/DisplacementMaps/TapeMedRightCrossed.png differ diff --git a/DisplacementMaps/TapeMedRightWristtie.png b/DisplacementMaps/TapeMedRightWristtie.png new file mode 100644 index 000000000..0e66b5511 Binary files /dev/null and b/DisplacementMaps/TapeMedRightWristtie.png differ diff --git a/DisplacementMaps/TapeTopLeft.png b/DisplacementMaps/TapeTopLeft.png new file mode 100644 index 000000000..5c935e21d Binary files /dev/null and b/DisplacementMaps/TapeTopLeft.png differ diff --git a/DisplacementMaps/TapeTopLeftBoxtie.png b/DisplacementMaps/TapeTopLeftBoxtie.png new file mode 100644 index 000000000..aab6bb68c Binary files /dev/null and b/DisplacementMaps/TapeTopLeftBoxtie.png differ diff --git a/DisplacementMaps/TapeTopLeftCrossed.png b/DisplacementMaps/TapeTopLeftCrossed.png new file mode 100644 index 000000000..ee8c0b47d Binary files /dev/null and b/DisplacementMaps/TapeTopLeftCrossed.png differ diff --git a/DisplacementMaps/TapeTopLeftWristtie.png b/DisplacementMaps/TapeTopLeftWristtie.png new file mode 100644 index 000000000..7c17d79bb Binary files /dev/null and b/DisplacementMaps/TapeTopLeftWristtie.png differ diff --git a/DisplacementMaps/TapeTopRight.png b/DisplacementMaps/TapeTopRight.png new file mode 100644 index 000000000..5c935e21d Binary files /dev/null and b/DisplacementMaps/TapeTopRight.png differ diff --git a/DisplacementMaps/TapeTopRightBoxtie.png b/DisplacementMaps/TapeTopRightBoxtie.png new file mode 100644 index 000000000..a6e33aa37 Binary files /dev/null and b/DisplacementMaps/TapeTopRightBoxtie.png differ diff --git a/DisplacementMaps/TapeTopRightCrossed.png b/DisplacementMaps/TapeTopRightCrossed.png new file mode 100644 index 000000000..5ff509fa9 Binary files /dev/null and b/DisplacementMaps/TapeTopRightCrossed.png differ diff --git a/DisplacementMaps/TapeTopRightWristtie.png b/DisplacementMaps/TapeTopRightWristtie.png new file mode 100644 index 000000000..8785b8650 Binary files /dev/null and b/DisplacementMaps/TapeTopRightWristtie.png differ diff --git a/DisplacementMaps/Template_Closed.png b/DisplacementMaps/Template_Closed.png new file mode 100644 index 000000000..749dfdda4 Binary files /dev/null and b/DisplacementMaps/Template_Closed.png differ diff --git a/DisplacementMaps/Template_ClosedL.png b/DisplacementMaps/Template_ClosedL.png new file mode 100644 index 000000000..2064b0f7c Binary files /dev/null and b/DisplacementMaps/Template_ClosedL.png differ diff --git a/DisplacementMaps/Template_ClosedR.png b/DisplacementMaps/Template_ClosedR.png new file mode 100644 index 000000000..2f833d0a5 Binary files /dev/null and b/DisplacementMaps/Template_ClosedR.png differ diff --git a/DisplacementMaps/Template_Free.png b/DisplacementMaps/Template_Free.png new file mode 100644 index 000000000..47ecf8262 Binary files /dev/null and b/DisplacementMaps/Template_Free.png differ diff --git a/DisplacementMaps/Template_Hogtie.png b/DisplacementMaps/Template_Hogtie.png new file mode 100644 index 000000000..77f144267 Binary files /dev/null and b/DisplacementMaps/Template_Hogtie.png differ diff --git a/DisplacementMaps/Template_HogtieL.png b/DisplacementMaps/Template_HogtieL.png new file mode 100644 index 000000000..baca36f73 Binary files /dev/null and b/DisplacementMaps/Template_HogtieL.png differ diff --git a/DisplacementMaps/Template_HogtieR.png b/DisplacementMaps/Template_HogtieR.png new file mode 100644 index 000000000..6e116de49 Binary files /dev/null and b/DisplacementMaps/Template_HogtieR.png differ diff --git a/DisplacementMaps/Template_Kneel.png b/DisplacementMaps/Template_Kneel.png new file mode 100644 index 000000000..ed7e3b325 Binary files /dev/null and b/DisplacementMaps/Template_Kneel.png differ diff --git a/DisplacementMaps/Template_KneelClosedL.png b/DisplacementMaps/Template_KneelClosedL.png new file mode 100644 index 000000000..06d89fb80 Binary files /dev/null and b/DisplacementMaps/Template_KneelClosedL.png differ diff --git a/DisplacementMaps/Template_KneelClosedR.png b/DisplacementMaps/Template_KneelClosedR.png new file mode 100644 index 000000000..96f3d4a38 Binary files /dev/null and b/DisplacementMaps/Template_KneelClosedR.png differ diff --git a/DisplacementMaps/Template_KneelL.png b/DisplacementMaps/Template_KneelL.png new file mode 100644 index 000000000..e796f51a4 Binary files /dev/null and b/DisplacementMaps/Template_KneelL.png differ diff --git a/DisplacementMaps/Template_KneelR.png b/DisplacementMaps/Template_KneelR.png new file mode 100644 index 000000000..0f47bba5b Binary files /dev/null and b/DisplacementMaps/Template_KneelR.png differ diff --git a/DisplacementMaps/Thigh1SquishClosed.png b/DisplacementMaps/Thigh1SquishClosed.png new file mode 100644 index 000000000..c5ec54939 Binary files /dev/null and b/DisplacementMaps/Thigh1SquishClosed.png differ diff --git a/DisplacementMaps/Thigh1SquishHogtie.png b/DisplacementMaps/Thigh1SquishHogtie.png new file mode 100644 index 000000000..5756a9406 Binary files /dev/null and b/DisplacementMaps/Thigh1SquishHogtie.png differ diff --git a/DisplacementMaps/Thigh1SquishKneelClosed.png b/DisplacementMaps/Thigh1SquishKneelClosed.png new file mode 100644 index 000000000..00fb0995d Binary files /dev/null and b/DisplacementMaps/Thigh1SquishKneelClosed.png differ diff --git a/DisplacementMaps/Thigh2SquishClosed.png b/DisplacementMaps/Thigh2SquishClosed.png new file mode 100644 index 000000000..cf51894ec Binary files /dev/null and b/DisplacementMaps/Thigh2SquishClosed.png differ diff --git a/DisplacementMaps/Thigh2SquishHogtie.png b/DisplacementMaps/Thigh2SquishHogtie.png new file mode 100644 index 000000000..e3083f6db Binary files /dev/null and b/DisplacementMaps/Thigh2SquishHogtie.png differ diff --git a/DisplacementMaps/Thigh2SquishKneelClosed.png b/DisplacementMaps/Thigh2SquishKneelClosed.png new file mode 100644 index 000000000..2f6e03713 Binary files /dev/null and b/DisplacementMaps/Thigh2SquishKneelClosed.png differ diff --git a/DisplacementMaps/Thigh3SquishClosed.png b/DisplacementMaps/Thigh3SquishClosed.png new file mode 100644 index 000000000..fde6184d7 Binary files /dev/null and b/DisplacementMaps/Thigh3SquishClosed.png differ diff --git a/DisplacementMaps/Thigh3SquishHogtie.png b/DisplacementMaps/Thigh3SquishHogtie.png new file mode 100644 index 000000000..77760444e Binary files /dev/null and b/DisplacementMaps/Thigh3SquishHogtie.png differ diff --git a/DisplacementMaps/Thigh3SquishKneelClosed.png b/DisplacementMaps/Thigh3SquishKneelClosed.png new file mode 100644 index 000000000..4fe8d01d1 Binary files /dev/null and b/DisplacementMaps/Thigh3SquishKneelClosed.png differ diff --git a/DisplacementMaps/ThighCuffsLeftClosed.png b/DisplacementMaps/ThighCuffsLeftClosed.png new file mode 100644 index 000000000..cc8619033 Binary files /dev/null and b/DisplacementMaps/ThighCuffsLeftClosed.png differ diff --git a/DisplacementMaps/ThighCuffsLeftKneel.png b/DisplacementMaps/ThighCuffsLeftKneel.png new file mode 100644 index 000000000..2ce77b9f7 Binary files /dev/null and b/DisplacementMaps/ThighCuffsLeftKneel.png differ diff --git a/DisplacementMaps/ThighCuffsLeftKneelClosed.png b/DisplacementMaps/ThighCuffsLeftKneelClosed.png new file mode 100644 index 000000000..2ce77b9f7 Binary files /dev/null and b/DisplacementMaps/ThighCuffsLeftKneelClosed.png differ diff --git a/DisplacementMaps/ThighCuffsLeftSpread.png b/DisplacementMaps/ThighCuffsLeftSpread.png new file mode 100644 index 000000000..177e7af18 Binary files /dev/null and b/DisplacementMaps/ThighCuffsLeftSpread.png differ diff --git a/DisplacementMaps/ThighCuffsRightClosed.png b/DisplacementMaps/ThighCuffsRightClosed.png new file mode 100644 index 000000000..e93e89029 Binary files /dev/null and b/DisplacementMaps/ThighCuffsRightClosed.png differ diff --git a/DisplacementMaps/ThighCuffsRightKneel.png b/DisplacementMaps/ThighCuffsRightKneel.png new file mode 100644 index 000000000..2a254c0c7 Binary files /dev/null and b/DisplacementMaps/ThighCuffsRightKneel.png differ diff --git a/DisplacementMaps/ThighCuffsRightKneelClosed.png b/DisplacementMaps/ThighCuffsRightKneelClosed.png new file mode 100644 index 000000000..e04317f82 Binary files /dev/null and b/DisplacementMaps/ThighCuffsRightKneelClosed.png differ diff --git a/DisplacementMaps/ThighCuffsRightSpread.png b/DisplacementMaps/ThighCuffsRightSpread.png new file mode 100644 index 000000000..31407a2ca Binary files /dev/null and b/DisplacementMaps/ThighCuffsRightSpread.png differ diff --git a/DisplacementMaps/TightBelt.png b/DisplacementMaps/TightBelt.png new file mode 100644 index 000000000..923361b43 Binary files /dev/null and b/DisplacementMaps/TightBelt.png differ diff --git a/DisplacementMaps/TightUpperSquish.png b/DisplacementMaps/TightUpperSquish.png new file mode 100644 index 000000000..3ce7c51b1 Binary files /dev/null and b/DisplacementMaps/TightUpperSquish.png differ diff --git a/DisplacementMaps/Xray.png b/DisplacementMaps/Xray.png new file mode 100644 index 000000000..c599930c0 Binary files /dev/null and b/DisplacementMaps/Xray.png differ diff --git a/DisplacementMaps/XrayBra.png b/DisplacementMaps/XrayBra.png new file mode 100644 index 000000000..cfa9dc472 Binary files /dev/null and b/DisplacementMaps/XrayBra.png differ diff --git a/DisplacementMaps/XrayFace.png b/DisplacementMaps/XrayFace.png new file mode 100644 index 000000000..c3177c26b Binary files /dev/null and b/DisplacementMaps/XrayFace.png differ diff --git a/DisplacementMaps/XrayPanties.png b/DisplacementMaps/XrayPanties.png new file mode 100644 index 000000000..76fec0ffd Binary files /dev/null and b/DisplacementMaps/XrayPanties.png differ diff --git a/DisplacementMaps/Yoke.png b/DisplacementMaps/Yoke.png new file mode 100644 index 000000000..142db6e99 Binary files /dev/null and b/DisplacementMaps/Yoke.png differ diff --git a/Fonts/3270/3270-Regular.ttf b/Fonts/3270/3270-Regular.ttf new file mode 100644 index 000000000..d6b55a6ab Binary files /dev/null and b/Fonts/3270/3270-Regular.ttf differ diff --git a/Fonts/3270/3270Condensed-Regular.ttf b/Fonts/3270/3270Condensed-Regular.ttf new file mode 100644 index 000000000..7a77e75cd Binary files /dev/null and b/Fonts/3270/3270Condensed-Regular.ttf differ diff --git a/Fonts/3270/3270SemiCondensed-Regular.ttf b/Fonts/3270/3270SemiCondensed-Regular.ttf new file mode 100644 index 000000000..1cdaf29aa Binary files /dev/null and b/Fonts/3270/3270SemiCondensed-Regular.ttf differ diff --git a/Fonts/3270/LICENSE.txt b/Fonts/3270/LICENSE.txt new file mode 100644 index 000000000..b8f248ab4 --- /dev/null +++ b/Fonts/3270/LICENSE.txt @@ -0,0 +1,51 @@ +Copyright 2022 The 3270font Authors (https://github.com/rbanffy/3270font) + +Copyright (c) 2011-2022, Ricardo Banffy. +Copyright (c) 1993-2011, Paul Mattes. +Copyright (c) 2004-2005, Don Russell. +Copyright (c) 2004, Dick Altenbern. +Copyright (c) 1990, Jeff Sparkes. +Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Ricardo Banffy, Paul Mattes, Don Russell, + Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL RICARDO BANFFY, PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF +SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The Debian Logo glyph is based on the Debian Open Use Logo and is +Copyright (c) 1999 Software in the Public Interest, Inc., and it is +incorporated here under the terms of the Creative Commons +Attribution-ShareAlike 3.0 Unported License. The logo is released +under the terms of the GNU Lesser General Public License, version 3 or +any later version, or, at your option, of the Creative Commons +Attribution-ShareAlike 3.0 Unported License. + +Ubuntu, the Ubuntu logo and the Circle of Friends symbol are +registered trademarks of Canonical Ltd. + +The Fontforge SFD font description file is optionally licensed under +the SIL Open Font License v1.1 with no Reserved Font Name. This +license is available with a FAQ at http://scripts.sil.org/OFL. diff --git a/Fonts/Calligraffitti/Calligraffitti-Regular.ttf b/Fonts/Calligraffitti/Calligraffitti-Regular.ttf deleted file mode 100644 index b928a7ba0..000000000 Binary files a/Fonts/Calligraffitti/Calligraffitti-Regular.ttf and /dev/null differ diff --git a/Fonts/Inconsolata/Inconsolata-Light.ttf b/Fonts/Inconsolata/Inconsolata-Light.ttf new file mode 100644 index 000000000..36b47d6d6 Binary files /dev/null and b/Fonts/Inconsolata/Inconsolata-Light.ttf differ diff --git a/Fonts/Inconsolata/Inconsolata-Medium.ttf b/Fonts/Inconsolata/Inconsolata-Medium.ttf new file mode 100644 index 000000000..86ba05ae8 Binary files /dev/null and b/Fonts/Inconsolata/Inconsolata-Medium.ttf differ diff --git a/Fonts/Inconsolata/Inconsolata-Regular.ttf b/Fonts/Inconsolata/Inconsolata-Regular.ttf new file mode 100644 index 000000000..d1241516b Binary files /dev/null and b/Fonts/Inconsolata/Inconsolata-Regular.ttf differ diff --git a/Fonts/Inconsolata/Inconsolata_Condensed-Light.ttf b/Fonts/Inconsolata/Inconsolata_Condensed-Light.ttf new file mode 100644 index 000000000..e456116b4 Binary files /dev/null and b/Fonts/Inconsolata/Inconsolata_Condensed-Light.ttf differ diff --git a/Fonts/Inconsolata/Inconsolata_Condensed-Medium.ttf b/Fonts/Inconsolata/Inconsolata_Condensed-Medium.ttf new file mode 100644 index 000000000..150c5fff2 Binary files /dev/null and b/Fonts/Inconsolata/Inconsolata_Condensed-Medium.ttf differ diff --git a/Fonts/Inconsolata/OFL.txt b/Fonts/Inconsolata/OFL.txt new file mode 100644 index 000000000..1089cbf83 --- /dev/null +++ b/Fonts/Inconsolata/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2006 The Inconsolata Project Authors + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Fonts/Iosevka/Iosevka-Medium.ttf b/Fonts/Iosevka/Iosevka-Medium.ttf new file mode 100644 index 000000000..acea17a99 Binary files /dev/null and b/Fonts/Iosevka/Iosevka-Medium.ttf differ diff --git a/Fonts/Iosevka/Iosevka-Regular.ttf b/Fonts/Iosevka/Iosevka-Regular.ttf new file mode 100644 index 000000000..de92c16f4 Binary files /dev/null and b/Fonts/Iosevka/Iosevka-Regular.ttf differ diff --git a/Fonts/Iosevka/IosevkaCurly-Medium.ttf b/Fonts/Iosevka/IosevkaCurly-Medium.ttf new file mode 100644 index 000000000..0bff6f258 Binary files /dev/null and b/Fonts/Iosevka/IosevkaCurly-Medium.ttf differ diff --git a/Fonts/Iosevka/IosevkaCurly-Regular.ttf b/Fonts/Iosevka/IosevkaCurly-Regular.ttf new file mode 100644 index 000000000..a3f4f6f19 Binary files /dev/null and b/Fonts/Iosevka/IosevkaCurly-Regular.ttf differ diff --git a/Fonts/Iosevka/IosevkaSlab-Medium.ttf b/Fonts/Iosevka/IosevkaSlab-Medium.ttf new file mode 100644 index 000000000..d82813277 Binary files /dev/null and b/Fonts/Iosevka/IosevkaSlab-Medium.ttf differ diff --git a/Fonts/Iosevka/IosevkaSlab-Regular.ttf b/Fonts/Iosevka/IosevkaSlab-Regular.ttf new file mode 100644 index 000000000..dc08e8aee Binary files /dev/null and b/Fonts/Iosevka/IosevkaSlab-Regular.ttf differ diff --git a/Fonts/Iosevka/LICENSE.md b/Fonts/Iosevka/LICENSE.md new file mode 100644 index 000000000..adbbbc63e --- /dev/null +++ b/Fonts/Iosevka/LICENSE.md @@ -0,0 +1,110 @@ +Copyright (c) 2015-2024, Renzhi Li (aka. Belleve Invis, belleve@typeof.net) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +-------------------------- + + +SIL Open Font License v1.1 +==================================================== + + +Preamble +---------- + +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + + +Definitions +------------- + +`"Font Software"` refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +`"Reserved Font Name"` refers to any names specified as such after the +copyright statement(s). + +`"Original Version"` refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +`"Modified Version"` refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +`"Author"` refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + + +Permission & Conditions +------------------------ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1. Neither the Font Software nor any of its individual components, + in Original or Modified Versions, may be sold by itself. + +2. Original or Modified Versions of the Font Software may be bundled, + redistributed and/or sold with any software, provided that each copy + contains the above copyright notice and this license. These can be + included either as stand-alone text files, human-readable headers or + in the appropriate machine-readable metadata fields within text or + binary files as long as those fields can be easily viewed by the user. + +3. No Modified Version of the Font Software may use the Reserved Font + Name(s) unless explicit written permission is granted by the corresponding + Copyright Holder. This restriction only applies to the primary font name as + presented to the users. + +4. The name(s) of the Copyright Holder(s) or the Author(s) of the Font + Software shall not be used to promote, endorse or advertise any + Modified Version, except to acknowledge the contribution(s) of the + Copyright Holder(s) and the Author(s) or with their explicit written + permission. + +5. The Font Software, modified or unmodified, in part or in whole, + must be distributed entirely under this license, and must not be + distributed under any other license. The requirement for fonts to + remain under this license does not apply to any document created + using the Font Software. + + + +Termination +----------- + +This license becomes null and void if any of the above conditions are +not met. + + + DISCLAIMER + + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM + OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Fonts/Lekton/Lekton-Bold.ttf b/Fonts/Lekton/Lekton-Bold.ttf new file mode 100644 index 000000000..b46b56b2c Binary files /dev/null and b/Fonts/Lekton/Lekton-Bold.ttf differ diff --git a/Fonts/Lekton/Lekton-Italic.ttf b/Fonts/Lekton/Lekton-Italic.ttf new file mode 100644 index 000000000..a23c4ce41 Binary files /dev/null and b/Fonts/Lekton/Lekton-Italic.ttf differ diff --git a/Fonts/Lekton/Lekton-Regular.ttf b/Fonts/Lekton/Lekton-Regular.ttf new file mode 100644 index 000000000..e971ecaa5 Binary files /dev/null and b/Fonts/Lekton/Lekton-Regular.ttf differ diff --git a/Fonts/Lekton/SIL Open Font License.txt b/Fonts/Lekton/SIL Open Font License.txt new file mode 100644 index 000000000..14c043d60 --- /dev/null +++ b/Fonts/Lekton/SIL Open Font License.txt @@ -0,0 +1,41 @@ +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the copyright statement(s). + +"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. + +5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/Fonts/Nanum/NanumGothicCoding-Bold.ttf b/Fonts/Nanum/NanumGothicCoding-Bold.ttf new file mode 100644 index 000000000..36bd22065 Binary files /dev/null and b/Fonts/Nanum/NanumGothicCoding-Bold.ttf differ diff --git a/Fonts/Nanum/NanumGothicCoding-Regular.ttf b/Fonts/Nanum/NanumGothicCoding-Regular.ttf new file mode 100644 index 000000000..990066a7c Binary files /dev/null and b/Fonts/Nanum/NanumGothicCoding-Regular.ttf differ diff --git a/Fonts/Nanum/OFL.txt b/Fonts/Nanum/OFL.txt new file mode 100644 index 000000000..15c635612 --- /dev/null +++ b/Fonts/Nanum/OFL.txt @@ -0,0 +1,97 @@ +Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +NanumBrush, NanumPen, Naver NanumPen. + + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Fonts/Pacifico/Pacifico-Regular.ttf b/Fonts/Pacifico/Pacifico-Regular.ttf deleted file mode 100644 index b9265a2a5..000000000 Binary files a/Fonts/Pacifico/Pacifico-Regular.ttf and /dev/null differ diff --git a/Fonts/Calligraffitti/LICENSE.txt b/Fonts/Roboto/LICENSE.txt similarity index 100% rename from Fonts/Calligraffitti/LICENSE.txt rename to Fonts/Roboto/LICENSE.txt diff --git a/Fonts/Roboto/Roboto-Black.ttf b/Fonts/Roboto/Roboto-Black.ttf new file mode 100644 index 000000000..0112e7da6 Binary files /dev/null and b/Fonts/Roboto/Roboto-Black.ttf differ diff --git a/Fonts/Roboto/Roboto-BlackItalic.ttf b/Fonts/Roboto/Roboto-BlackItalic.ttf new file mode 100644 index 000000000..b2c6aca57 Binary files /dev/null and b/Fonts/Roboto/Roboto-BlackItalic.ttf differ diff --git a/Fonts/Roboto/Roboto-Bold.ttf b/Fonts/Roboto/Roboto-Bold.ttf new file mode 100644 index 000000000..43da14d84 Binary files /dev/null and b/Fonts/Roboto/Roboto-Bold.ttf differ diff --git a/Fonts/Roboto/Roboto-BoldItalic.ttf b/Fonts/Roboto/Roboto-BoldItalic.ttf new file mode 100644 index 000000000..bcfdab431 Binary files /dev/null and b/Fonts/Roboto/Roboto-BoldItalic.ttf differ diff --git a/Fonts/Roboto/Roboto-Italic.ttf b/Fonts/Roboto/Roboto-Italic.ttf new file mode 100644 index 000000000..1b5eaa361 Binary files /dev/null and b/Fonts/Roboto/Roboto-Italic.ttf differ diff --git a/Fonts/Roboto/Roboto-Light.ttf b/Fonts/Roboto/Roboto-Light.ttf new file mode 100644 index 000000000..e7307e72c Binary files /dev/null and b/Fonts/Roboto/Roboto-Light.ttf differ diff --git a/Fonts/Roboto/Roboto-LightItalic.ttf b/Fonts/Roboto/Roboto-LightItalic.ttf new file mode 100644 index 000000000..2d277afb2 Binary files /dev/null and b/Fonts/Roboto/Roboto-LightItalic.ttf differ diff --git a/Fonts/Roboto/Roboto-Medium.ttf b/Fonts/Roboto/Roboto-Medium.ttf new file mode 100644 index 000000000..ac0f908b9 Binary files /dev/null and b/Fonts/Roboto/Roboto-Medium.ttf differ diff --git a/Fonts/Roboto/Roboto-MediumItalic.ttf b/Fonts/Roboto/Roboto-MediumItalic.ttf new file mode 100644 index 000000000..fc36a4785 Binary files /dev/null and b/Fonts/Roboto/Roboto-MediumItalic.ttf differ diff --git a/Fonts/Roboto/Roboto-Regular.ttf b/Fonts/Roboto/Roboto-Regular.ttf new file mode 100644 index 000000000..ddf4bfacb Binary files /dev/null and b/Fonts/Roboto/Roboto-Regular.ttf differ diff --git a/Fonts/Roboto/Roboto-Thin.ttf b/Fonts/Roboto/Roboto-Thin.ttf new file mode 100644 index 000000000..2e0dee6a8 Binary files /dev/null and b/Fonts/Roboto/Roboto-Thin.ttf differ diff --git a/Fonts/Roboto/Roboto-ThinItalic.ttf b/Fonts/Roboto/Roboto-ThinItalic.ttf new file mode 100644 index 000000000..084f9c0f5 Binary files /dev/null and b/Fonts/Roboto/Roboto-ThinItalic.ttf differ diff --git a/Fonts/System/FSEX302.ttf b/Fonts/System/FSEX302.ttf new file mode 100644 index 000000000..4e019c8f6 Binary files /dev/null and b/Fonts/System/FSEX302.ttf differ diff --git a/Game/Audio/Acid.ogg b/Game/Audio/Acid.ogg new file mode 100644 index 000000000..40ecdf808 Binary files /dev/null and b/Game/Audio/Acid.ogg differ diff --git a/Game/Audio/Arrow.ogg b/Game/Audio/Arrow.ogg new file mode 100644 index 000000000..c90f00137 Binary files /dev/null and b/Game/Audio/Arrow.ogg differ diff --git a/Game/Audio/ArrowBolt.ogg b/Game/Audio/ArrowBolt.ogg new file mode 100644 index 000000000..9b70e8a99 Binary files /dev/null and b/Game/Audio/ArrowBolt.ogg differ diff --git a/Game/Audio/Chain1.ogg b/Game/Audio/Chain1.ogg new file mode 100644 index 000000000..0fac51e42 Binary files /dev/null and b/Game/Audio/Chain1.ogg differ diff --git a/Game/Audio/Chain2.ogg b/Game/Audio/Chain2.ogg new file mode 100644 index 000000000..cb2f99a28 Binary files /dev/null and b/Game/Audio/Chain2.ogg differ diff --git a/Game/Audio/Chain3.ogg b/Game/Audio/Chain3.ogg new file mode 100644 index 000000000..43a346178 Binary files /dev/null and b/Game/Audio/Chain3.ogg differ diff --git a/Game/Audio/Chain4.ogg b/Game/Audio/Chain4.ogg new file mode 100644 index 000000000..19d8c8cb0 Binary files /dev/null and b/Game/Audio/Chain4.ogg differ diff --git a/Game/Audio/ClangLight.ogg b/Game/Audio/ClangLight.ogg new file mode 100644 index 000000000..2d5d328bc Binary files /dev/null and b/Game/Audio/ClangLight.ogg differ diff --git a/Game/Audio/Crackling.ogg b/Game/Audio/Crackling.ogg index 558aa2c9a..7ceecde25 100644 Binary files a/Game/Audio/Crackling.ogg and b/Game/Audio/Crackling.ogg differ diff --git a/Game/Audio/Danger.ogg b/Game/Audio/Danger.ogg new file mode 100644 index 000000000..292f8d4fd Binary files /dev/null and b/Game/Audio/Danger.ogg differ diff --git a/Game/Audio/DangerWeak.ogg b/Game/Audio/DangerWeak.ogg new file mode 100644 index 000000000..bfd14108d Binary files /dev/null and b/Game/Audio/DangerWeak.ogg differ diff --git a/Game/Audio/Error.ogg b/Game/Audio/Error.ogg new file mode 100644 index 000000000..203d2000d Binary files /dev/null and b/Game/Audio/Error.ogg differ diff --git a/Game/Audio/Estim.ogg b/Game/Audio/Estim.ogg new file mode 100644 index 000000000..70a550afc Binary files /dev/null and b/Game/Audio/Estim.ogg differ diff --git a/Game/Audio/Grope.ogg b/Game/Audio/Grope.ogg new file mode 100644 index 000000000..d46c3f2b8 Binary files /dev/null and b/Game/Audio/Grope.ogg differ diff --git a/Game/Audio/HeavySwing2.ogg b/Game/Audio/HeavySwing2.ogg new file mode 100644 index 000000000..522bd1912 Binary files /dev/null and b/Game/Audio/HeavySwing2.ogg differ diff --git a/Game/Audio/HeavyThudPixel.ogg b/Game/Audio/HeavyThudPixel.ogg new file mode 100644 index 000000000..4394485b9 Binary files /dev/null and b/Game/Audio/HeavyThudPixel.ogg differ diff --git a/Game/Audio/HexOrb.ogg b/Game/Audio/HexOrb.ogg new file mode 100644 index 000000000..4efb0b14e Binary files /dev/null and b/Game/Audio/HexOrb.ogg differ diff --git a/Game/Audio/HexOrbMinor.ogg b/Game/Audio/HexOrbMinor.ogg new file mode 100644 index 000000000..5debbf571 Binary files /dev/null and b/Game/Audio/HexOrbMinor.ogg differ diff --git a/Game/Audio/HorrorSound.ogg b/Game/Audio/HorrorSound.ogg new file mode 100644 index 000000000..2df5d5a8c Binary files /dev/null and b/Game/Audio/HorrorSound.ogg differ diff --git a/Game/Audio/HydraulicLock.mp3 b/Game/Audio/HydraulicLock.mp3 new file mode 100644 index 000000000..a99a1f7f3 Binary files /dev/null and b/Game/Audio/HydraulicLock.mp3 differ diff --git a/Game/Audio/HydraulicUnlock.mp3 b/Game/Audio/HydraulicUnlock.mp3 new file mode 100644 index 000000000..35a6c810b Binary files /dev/null and b/Game/Audio/HydraulicUnlock.mp3 differ diff --git a/Game/Audio/Leather1.ogg b/Game/Audio/Leather1.ogg new file mode 100644 index 000000000..967399e3f Binary files /dev/null and b/Game/Audio/Leather1.ogg differ diff --git a/Game/Audio/Leather2.ogg b/Game/Audio/Leather2.ogg new file mode 100644 index 000000000..aee8c8c2f Binary files /dev/null and b/Game/Audio/Leather2.ogg differ diff --git a/Game/Audio/Leather3.ogg b/Game/Audio/Leather3.ogg new file mode 100644 index 000000000..84bb3166b Binary files /dev/null and b/Game/Audio/Leather3.ogg differ diff --git a/Game/Audio/Leather4.ogg b/Game/Audio/Leather4.ogg new file mode 100644 index 000000000..700327b0b Binary files /dev/null and b/Game/Audio/Leather4.ogg differ diff --git a/Game/Audio/MiniFire.ogg b/Game/Audio/MiniFire.ogg new file mode 100644 index 000000000..8744e264e Binary files /dev/null and b/Game/Audio/MiniFire.ogg differ diff --git a/Game/Audio/MiniWind.ogg b/Game/Audio/MiniWind.ogg new file mode 100644 index 000000000..9eb7c85dc Binary files /dev/null and b/Game/Audio/MiniWind.ogg differ diff --git a/Game/Audio/MothClick.ogg b/Game/Audio/MothClick.ogg new file mode 100644 index 000000000..52594dbc4 Binary files /dev/null and b/Game/Audio/MothClick.ogg differ diff --git a/Game/Audio/MysteryTech.ogg b/Game/Audio/MysteryTech.ogg new file mode 100644 index 000000000..48a7032a1 Binary files /dev/null and b/Game/Audio/MysteryTech.ogg differ diff --git a/Game/Audio/Recycle.ogg b/Game/Audio/Recycle.ogg new file mode 100644 index 000000000..e8a93afd1 Binary files /dev/null and b/Game/Audio/Recycle.ogg differ diff --git a/Game/Audio/Rope1.ogg b/Game/Audio/Rope1.ogg new file mode 100644 index 000000000..174ad3480 Binary files /dev/null and b/Game/Audio/Rope1.ogg differ diff --git a/Game/Audio/Rope2.ogg b/Game/Audio/Rope2.ogg new file mode 100644 index 000000000..cc2dc16d7 Binary files /dev/null and b/Game/Audio/Rope2.ogg differ diff --git a/Game/Audio/Rope3.ogg b/Game/Audio/Rope3.ogg new file mode 100644 index 000000000..0beb9c7b9 Binary files /dev/null and b/Game/Audio/Rope3.ogg differ diff --git a/Game/Audio/Rope4.ogg b/Game/Audio/Rope4.ogg new file mode 100644 index 000000000..51984744a Binary files /dev/null and b/Game/Audio/Rope4.ogg differ diff --git a/Game/Audio/Rubber1.ogg b/Game/Audio/Rubber1.ogg new file mode 100644 index 000000000..9f3acdfa5 Binary files /dev/null and b/Game/Audio/Rubber1.ogg differ diff --git a/Game/Audio/Rubber2.ogg b/Game/Audio/Rubber2.ogg new file mode 100644 index 000000000..0ab52140c Binary files /dev/null and b/Game/Audio/Rubber2.ogg differ diff --git a/Game/Audio/Rubber3.ogg b/Game/Audio/Rubber3.ogg new file mode 100644 index 000000000..f9e2ac597 Binary files /dev/null and b/Game/Audio/Rubber3.ogg differ diff --git a/Game/Audio/Rubber4.ogg b/Game/Audio/Rubber4.ogg new file mode 100644 index 000000000..d062a82f6 Binary files /dev/null and b/Game/Audio/Rubber4.ogg differ diff --git a/Game/Audio/SciFiConfigure.mp3 b/Game/Audio/SciFiConfigure.mp3 new file mode 100644 index 000000000..3b3fb25a5 Binary files /dev/null and b/Game/Audio/SciFiConfigure.mp3 differ diff --git a/Game/Audio/SciFiExplode.ogg b/Game/Audio/SciFiExplode.ogg new file mode 100644 index 000000000..b6774a6c5 Binary files /dev/null and b/Game/Audio/SciFiExplode.ogg differ diff --git a/Game/Audio/SciFiExplodeLarge.ogg b/Game/Audio/SciFiExplodeLarge.ogg new file mode 100644 index 000000000..113558841 Binary files /dev/null and b/Game/Audio/SciFiExplodeLarge.ogg differ diff --git a/Game/Audio/SciFiPump.mp3 b/Game/Audio/SciFiPump.mp3 new file mode 100644 index 000000000..249914cdf Binary files /dev/null and b/Game/Audio/SciFiPump.mp3 differ diff --git a/Game/Audio/Slap.ogg b/Game/Audio/Slap.ogg new file mode 100644 index 000000000..485dd7f9b Binary files /dev/null and b/Game/Audio/Slap.ogg differ diff --git a/Game/Audio/Sniper.ogg b/Game/Audio/Sniper.ogg new file mode 100644 index 000000000..4cbbe4aa0 Binary files /dev/null and b/Game/Audio/Sniper.ogg differ diff --git a/Game/Audio/Sniper2.ogg b/Game/Audio/Sniper2.ogg new file mode 100644 index 000000000..52beaa34a Binary files /dev/null and b/Game/Audio/Sniper2.ogg differ diff --git a/Game/Audio/Sniper3.ogg b/Game/Audio/Sniper3.ogg new file mode 100644 index 000000000..b0462dfdf Binary files /dev/null and b/Game/Audio/Sniper3.ogg differ diff --git a/Game/Audio/SpikeTrapHit.ogg b/Game/Audio/SpikeTrapHit.ogg new file mode 100644 index 000000000..fb83df253 Binary files /dev/null and b/Game/Audio/SpikeTrapHit.ogg differ diff --git a/Game/Audio/SpikeTrapTrigger.ogg b/Game/Audio/SpikeTrapTrigger.ogg new file mode 100644 index 000000000..a10d660f5 Binary files /dev/null and b/Game/Audio/SpikeTrapTrigger.ogg differ diff --git a/Game/Audio/SummonCurse.ogg b/Game/Audio/SummonCurse.ogg new file mode 100644 index 000000000..800730700 Binary files /dev/null and b/Game/Audio/SummonCurse.ogg differ diff --git a/Game/Audio/Tape.ogg b/Game/Audio/Tape.ogg new file mode 100644 index 000000000..0d5a646f3 Binary files /dev/null and b/Game/Audio/Tape.ogg differ diff --git a/Game/Audio/TapeStruggle.ogg b/Game/Audio/TapeStruggle.ogg new file mode 100644 index 000000000..7e124f7c5 Binary files /dev/null and b/Game/Audio/TapeStruggle.ogg differ diff --git a/Game/Audio/WoodBlock.ogg b/Game/Audio/WoodBlock.ogg new file mode 100644 index 000000000..3f59ee868 Binary files /dev/null and b/Game/Audio/WoodBlock.ogg differ diff --git a/Game/Audio/ZipUp.ogg b/Game/Audio/ZipUp.ogg new file mode 100644 index 000000000..9874a1883 Binary files /dev/null and b/Game/Audio/ZipUp.ogg differ diff --git a/Game/Aura/Airbender0.png b/Game/Aura/Airbender0.png new file mode 100644 index 000000000..c1378447d Binary files /dev/null and b/Game/Aura/Airbender0.png differ diff --git a/Game/Aura/Airbender1.png b/Game/Aura/Airbender1.png new file mode 100644 index 000000000..7a9793e1b Binary files /dev/null and b/Game/Aura/Airbender1.png differ diff --git a/Game/Aura/Airbender2.png b/Game/Aura/Airbender2.png new file mode 100644 index 000000000..eebe24af7 Binary files /dev/null and b/Game/Aura/Airbender2.png differ diff --git a/Game/Aura/Armored.png b/Game/Aura/Armored.png new file mode 100644 index 000000000..6fca6e718 Binary files /dev/null and b/Game/Aura/Armored.png differ diff --git a/Game/Aura/Aura.png b/Game/Aura/Aura.png index 995093448..b962c3c9e 100644 Binary files a/Game/Aura/Aura.png and b/Game/Aura/Aura.png differ diff --git a/Game/Aura/AuraSeal.png b/Game/Aura/AuraSeal.png new file mode 100644 index 000000000..486b6759f Binary files /dev/null and b/Game/Aura/AuraSeal.png differ diff --git a/Game/Aura/AuraX.png b/Game/Aura/AuraX.png new file mode 100644 index 000000000..e4103efe0 Binary files /dev/null and b/Game/Aura/AuraX.png differ diff --git a/Game/Aura/Disrobe.png b/Game/Aura/Disrobe.png new file mode 100644 index 000000000..77c00f8e7 Binary files /dev/null and b/Game/Aura/Disrobe.png differ diff --git a/Game/Aura/DistractionShield.png b/Game/Aura/DistractionShield.png new file mode 100644 index 000000000..e9b7eb139 Binary files /dev/null and b/Game/Aura/DistractionShield.png differ diff --git a/Game/Aura/EnergyShield.png b/Game/Aura/EnergyShield.png new file mode 100644 index 000000000..3b5562164 Binary files /dev/null and b/Game/Aura/EnergyShield.png differ diff --git a/Game/Aura/Fast.png b/Game/Aura/Fast.png new file mode 100644 index 000000000..d8a421f17 Binary files /dev/null and b/Game/Aura/Fast.png differ diff --git a/Game/Aura/Glued.png b/Game/Aura/Glued.png new file mode 100644 index 000000000..9e5fbd82d Binary files /dev/null and b/Game/Aura/Glued.png differ diff --git a/Game/Aura/HealingAura.png b/Game/Aura/HealingAura.png new file mode 100644 index 000000000..3cfa6e2ff Binary files /dev/null and b/Game/Aura/HealingAura.png differ diff --git a/Game/Aura/LatexBubble.png b/Game/Aura/LatexBubble.png new file mode 100644 index 000000000..a73ae65a9 Binary files /dev/null and b/Game/Aura/LatexBubble.png differ diff --git a/Game/Aura/Missiles0.png b/Game/Aura/Missiles0.png new file mode 100644 index 000000000..c1378447d Binary files /dev/null and b/Game/Aura/Missiles0.png differ diff --git a/Game/Aura/Missiles1.png b/Game/Aura/Missiles1.png new file mode 100644 index 000000000..9aaa10e61 Binary files /dev/null and b/Game/Aura/Missiles1.png differ diff --git a/Game/Aura/Missiles2.png b/Game/Aura/Missiles2.png new file mode 100644 index 000000000..e9ba15524 Binary files /dev/null and b/Game/Aura/Missiles2.png differ diff --git a/Game/Aura/Missiles3.png b/Game/Aura/Missiles3.png new file mode 100644 index 000000000..8f39b6c97 Binary files /dev/null and b/Game/Aura/Missiles3.png differ diff --git a/Game/Aura/Missiles4.png b/Game/Aura/Missiles4.png new file mode 100644 index 000000000..f4e9d8805 Binary files /dev/null and b/Game/Aura/Missiles4.png differ diff --git a/Game/Aura/Muscle.png b/Game/Aura/Muscle.png new file mode 100644 index 000000000..2dad15481 Binary files /dev/null and b/Game/Aura/Muscle.png differ diff --git a/Game/Aura/NoWP.png b/Game/Aura/NoWP.png new file mode 100644 index 000000000..0d3dd60a1 Binary files /dev/null and b/Game/Aura/NoWP.png differ diff --git a/Game/Aura/Null.png b/Game/Aura/Null.png new file mode 100644 index 000000000..bfee88011 Binary files /dev/null and b/Game/Aura/Null.png differ diff --git a/Game/Aura/PsychicLink.png b/Game/Aura/PsychicLink.png new file mode 100644 index 000000000..2594df6e2 Binary files /dev/null and b/Game/Aura/PsychicLink.png differ diff --git a/Game/Aura/Reload.png b/Game/Aura/Reload.png new file mode 100644 index 000000000..7c2775cf2 Binary files /dev/null and b/Game/Aura/Reload.png differ diff --git a/Game/Aura/Select.png b/Game/Aura/Select.png new file mode 100644 index 000000000..3f0983385 Binary files /dev/null and b/Game/Aura/Select.png differ diff --git a/Game/Aura/Slimed.png b/Game/Aura/Slimed.png index f307eec97..355ea9488 100644 Binary files a/Game/Aura/Slimed.png and b/Game/Aura/Slimed.png differ diff --git a/Game/Aura/WaterBubble.png b/Game/Aura/WaterBubble.png new file mode 100644 index 000000000..14c30e593 Binary files /dev/null and b/Game/Aura/WaterBubble.png differ diff --git a/Game/Buffs/BuffDots.png b/Game/Buffs/BuffDots.png new file mode 100644 index 000000000..15b4fc91e Binary files /dev/null and b/Game/Buffs/BuffDots.png differ diff --git a/Game/Buffs/BuffDotsSide.png b/Game/Buffs/BuffDotsSide.png new file mode 100644 index 000000000..c49d880cc Binary files /dev/null and b/Game/Buffs/BuffDotsSide.png differ diff --git a/Game/Buffs/Plugged.png b/Game/Buffs/Plugged.png index 7f610b2e7..ea530d1c5 100644 Binary files a/Game/Buffs/Plugged.png and b/Game/Buffs/Plugged.png differ diff --git a/Game/Buffs/PluggedFull.png b/Game/Buffs/PluggedFull.png index ff29b556a..782abc9c6 100644 Binary files a/Game/Buffs/PluggedFull.png and b/Game/Buffs/PluggedFull.png differ diff --git a/Game/Buffs/buff/buffAkashicConflux.png b/Game/Buffs/buff/buffAkashicConflux.png new file mode 100644 index 000000000..0de78806f Binary files /dev/null and b/Game/Buffs/buff/buffAkashicConflux.png differ diff --git a/Game/Buffs/buff/buffAnalyze.png b/Game/Buffs/buff/buffAnalyze.png new file mode 100644 index 000000000..20e49aa58 Binary files /dev/null and b/Game/Buffs/buff/buffAnalyze.png differ diff --git a/Game/Buffs/buff/buffArcaneEnergy.png b/Game/Buffs/buff/buffArcaneEnergy.png new file mode 100644 index 000000000..0aae280b1 Binary files /dev/null and b/Game/Buffs/buff/buffArcaneEnergy.png differ diff --git a/Game/Buffs/buff/buffBattleRhythm.png b/Game/Buffs/buff/buffBattleRhythm.png new file mode 100644 index 000000000..4da85ca4e Binary files /dev/null and b/Game/Buffs/buff/buffBattleRhythm.png differ diff --git a/Game/Buffs/buff/buffBattleTrance.png b/Game/Buffs/buff/buffBattleTrance.png new file mode 100644 index 000000000..6801706d7 Binary files /dev/null and b/Game/Buffs/buff/buffBattleTrance.png differ diff --git a/Game/Buffs/buff/buffChaoticOverflow.png b/Game/Buffs/buff/buffChaoticOverflow.png new file mode 100644 index 000000000..452f1b23b Binary files /dev/null and b/Game/Buffs/buff/buffChaoticOverflow.png differ diff --git a/Game/Buffs/buff/buffCorrupted.png b/Game/Buffs/buff/buffCorrupted.png new file mode 100644 index 000000000..8ab190a6d Binary files /dev/null and b/Game/Buffs/buff/buffCorrupted.png differ diff --git a/Game/Buffs/buff/buffCorruptionStat.png b/Game/Buffs/buff/buffCorruptionStat.png new file mode 100644 index 000000000..72ee1fc10 Binary files /dev/null and b/Game/Buffs/buff/buffCorruptionStat.png differ diff --git a/Game/Buffs/buff/buffCursed.png b/Game/Buffs/buff/buffCursed.png new file mode 100644 index 000000000..c6d56dda8 Binary files /dev/null and b/Game/Buffs/buff/buffCursed.png differ diff --git a/Game/Buffs/buff/buffCursedDistract.png b/Game/Buffs/buff/buffCursedDistract.png new file mode 100644 index 000000000..e3ab23be2 Binary files /dev/null and b/Game/Buffs/buff/buffCursedDistract.png differ diff --git a/Game/Buffs/buff/buffCursingCircle.png b/Game/Buffs/buff/buffCursingCircle.png new file mode 100644 index 000000000..d365d8e6e Binary files /dev/null and b/Game/Buffs/buff/buffCursingCircle.png differ diff --git a/Game/Buffs/buff/buffDildoBatBuff.png b/Game/Buffs/buff/buffDildoBatBuff.png new file mode 100644 index 000000000..e6eb34586 Binary files /dev/null and b/Game/Buffs/buff/buffDildoBatBuff.png differ diff --git a/Game/Buffs/buff/buffDistractionShield.png b/Game/Buffs/buff/buffDistractionShield.png new file mode 100644 index 000000000..a3c16982b Binary files /dev/null and b/Game/Buffs/buff/buffDistractionShield.png differ diff --git a/Game/Buffs/buff/buffForcedSubmission.png b/Game/Buffs/buff/buffForcedSubmission.png new file mode 100644 index 000000000..23d09ef91 Binary files /dev/null and b/Game/Buffs/buff/buffForcedSubmission.png differ diff --git a/Game/Buffs/buff/buffFuukaOrb.png b/Game/Buffs/buff/buffFuukaOrb.png new file mode 100644 index 000000000..8325bf473 Binary files /dev/null and b/Game/Buffs/buff/buffFuukaOrb.png differ diff --git a/Game/Buffs/buff/buffGreaterInvisibility.png b/Game/Buffs/buff/buffGreaterInvisibility.png new file mode 100644 index 000000000..fd5512da9 Binary files /dev/null and b/Game/Buffs/buff/buffGreaterInvisibility.png differ diff --git a/Game/Buffs/buff/buffHaunted.png b/Game/Buffs/buff/buffHaunted.png new file mode 100644 index 000000000..5515061ef Binary files /dev/null and b/Game/Buffs/buff/buffHaunted.png differ diff --git a/Game/Buffs/buff/buffHighValueFound.png b/Game/Buffs/buff/buffHighValueFound.png new file mode 100644 index 000000000..5bae6e21a Binary files /dev/null and b/Game/Buffs/buff/buffHighValueFound.png differ diff --git a/Game/Buffs/buff/buffInnerPowerArcaneStore.png b/Game/Buffs/buff/buffInnerPowerArcaneStore.png new file mode 100644 index 000000000..6f8e55063 Binary files /dev/null and b/Game/Buffs/buff/buffInnerPowerArcaneStore.png differ diff --git a/Game/Buffs/buff/buffInvisibility.png b/Game/Buffs/buff/buffInvisibility.png new file mode 100644 index 000000000..dca3777b2 Binary files /dev/null and b/Game/Buffs/buff/buffInvisibility.png differ diff --git a/Game/Buffs/buff/buffLatexBubble.png b/Game/Buffs/buff/buffLatexBubble.png new file mode 100644 index 000000000..63b950377 Binary files /dev/null and b/Game/Buffs/buff/buffLatexBubble.png differ diff --git a/Game/Buffs/buff/buffLatexIntegrationStat.png b/Game/Buffs/buff/buffLatexIntegrationStat.png new file mode 100644 index 000000000..f0812e498 Binary files /dev/null and b/Game/Buffs/buff/buffLatexIntegrationStat.png differ diff --git a/Game/Buffs/buff/buffManaBurst.png b/Game/Buffs/buff/buffManaBurst.png new file mode 100644 index 000000000..a71b8b629 Binary files /dev/null and b/Game/Buffs/buff/buffManaBurst.png differ diff --git a/Game/Buffs/buff/buffManaRegenSuspend.png b/Game/Buffs/buff/buffManaRegenSuspend.png new file mode 100644 index 000000000..e148bbac9 Binary files /dev/null and b/Game/Buffs/buff/buffManaRegenSuspend.png differ diff --git a/Game/Buffs/buff/buffNoWP.png b/Game/Buffs/buff/buffNoWP.png new file mode 100644 index 000000000..c83e7e3f9 Binary files /dev/null and b/Game/Buffs/buff/buffNoWP.png differ diff --git a/Game/Buffs/buff/buffNovicePet.png b/Game/Buffs/buff/buffNovicePet.png new file mode 100644 index 000000000..f2b23e3ce Binary files /dev/null and b/Game/Buffs/buff/buffNovicePet.png differ diff --git a/Game/Buffs/buff/buffNovicePetBad.png b/Game/Buffs/buff/buffNovicePetBad.png new file mode 100644 index 000000000..530b9456d Binary files /dev/null and b/Game/Buffs/buff/buffNovicePetBad.png differ diff --git a/Game/Buffs/buff/buffNovicePetVeryBad.png b/Game/Buffs/buff/buffNovicePetVeryBad.png new file mode 100644 index 000000000..68cdc5237 Binary files /dev/null and b/Game/Buffs/buff/buffNovicePetVeryBad.png differ diff --git a/Game/Buffs/buff/buffRaiseDefenses.png b/Game/Buffs/buff/buffRaiseDefenses.png new file mode 100644 index 000000000..1fb73db29 Binary files /dev/null and b/Game/Buffs/buff/buffRaiseDefenses.png differ diff --git a/Game/Buffs/buff/buffRogueEscape.png b/Game/Buffs/buff/buffRogueEscape.png new file mode 100644 index 000000000..f36656747 Binary files /dev/null and b/Game/Buffs/buff/buffRogueEscape.png differ diff --git a/Game/Buffs/buff/buffSagittaAssault.png b/Game/Buffs/buff/buffSagittaAssault.png new file mode 100644 index 000000000..2079a319a Binary files /dev/null and b/Game/Buffs/buff/buffSagittaAssault.png differ diff --git a/Game/Buffs/buff/buffShadowSeal.png b/Game/Buffs/buff/buffShadowSeal.png new file mode 100644 index 000000000..84f5c69bd Binary files /dev/null and b/Game/Buffs/buff/buffShadowSeal.png differ diff --git a/Game/Buffs/buff/buffShockCollarCD.png b/Game/Buffs/buff/buffShockCollarCD.png new file mode 100644 index 000000000..e375a7bfb Binary files /dev/null and b/Game/Buffs/buff/buffShockCollarCD.png differ diff --git a/Game/Buffs/buff/buffSpellDamageResist.png b/Game/Buffs/buff/buffSpellDamageResist.png new file mode 100644 index 000000000..03618c1b5 Binary files /dev/null and b/Game/Buffs/buff/buffSpellDamageResist.png differ diff --git a/Game/Buffs/buff/buffSpellDamageUp.png b/Game/Buffs/buff/buffSpellDamageUp.png new file mode 100644 index 000000000..97522a5ed Binary files /dev/null and b/Game/Buffs/buff/buffSpellDamageUp.png differ diff --git a/Game/Buffs/buff/buffTaunted.png b/Game/Buffs/buff/buffTaunted.png new file mode 100644 index 000000000..df2bfe8b1 Binary files /dev/null and b/Game/Buffs/buff/buffTaunted.png differ diff --git a/Game/Buffs/buff/buffTraineeWP.png b/Game/Buffs/buff/buffTraineeWP.png new file mode 100644 index 000000000..267528988 Binary files /dev/null and b/Game/Buffs/buff/buffTraineeWP.png differ diff --git a/Game/Buffs/buff/buffUnsteady2.png b/Game/Buffs/buff/buffUnsteady2.png deleted file mode 100644 index 71bec7c32..000000000 Binary files a/Game/Buffs/buff/buffUnsteady2.png and /dev/null differ diff --git a/Game/Buffs/buff/buffWaterBubble.png b/Game/Buffs/buff/buffWaterBubble.png new file mode 100644 index 000000000..466edb75b Binary files /dev/null and b/Game/Buffs/buff/buffWaterBubble.png differ diff --git a/Game/Buffs/buff/buffd_OrgasmResist.png b/Game/Buffs/buff/buffd_OrgasmResist.png new file mode 100644 index 000000000..567fbdeab Binary files /dev/null and b/Game/Buffs/buff/buffd_OrgasmResist.png differ diff --git a/Game/Buffs/buff/buffd_SlimeMimic.png b/Game/Buffs/buff/buffd_SlimeMimic.png new file mode 100644 index 000000000..823a561fe Binary files /dev/null and b/Game/Buffs/buff/buffd_SlimeMimic.png differ diff --git a/Game/Buffs/buff/buffe_OrgasmResist.png b/Game/Buffs/buff/buffe_OrgasmResist.png new file mode 100644 index 000000000..be06c1abb Binary files /dev/null and b/Game/Buffs/buff/buffe_OrgasmResist.png differ diff --git a/Game/Buffs/curse/Blind.png b/Game/Buffs/curse/Blind.png new file mode 100644 index 000000000..f6a8c611b Binary files /dev/null and b/Game/Buffs/curse/Blind.png differ diff --git a/Game/Buffs/curse/Blocked.png b/Game/Buffs/curse/Blocked.png new file mode 100644 index 000000000..3dd784f10 Binary files /dev/null and b/Game/Buffs/curse/Blocked.png differ diff --git a/Game/Buffs/curse/Blue.png b/Game/Buffs/curse/Blue.png new file mode 100644 index 000000000..a17f9bcae Binary files /dev/null and b/Game/Buffs/curse/Blue.png differ diff --git a/Game/Buffs/curse/Curse.png b/Game/Buffs/curse/Curse.png new file mode 100644 index 000000000..8c0961f75 Binary files /dev/null and b/Game/Buffs/curse/Curse.png differ diff --git a/Game/Buffs/curse/Disc.png b/Game/Buffs/curse/Disc.png new file mode 100644 index 000000000..f2e4c8150 Binary files /dev/null and b/Game/Buffs/curse/Disc.png differ diff --git a/Game/Buffs/curse/Divine.png b/Game/Buffs/curse/Divine.png new file mode 100644 index 000000000..ea79e1991 Binary files /dev/null and b/Game/Buffs/curse/Divine.png differ diff --git a/Game/Buffs/curse/Dollmaker.png b/Game/Buffs/curse/Dollmaker.png new file mode 100644 index 000000000..2769f6146 Binary files /dev/null and b/Game/Buffs/curse/Dollmaker.png differ diff --git a/Game/Buffs/curse/Fuuka.png b/Game/Buffs/curse/Fuuka.png new file mode 100644 index 000000000..d6b3fa985 Binary files /dev/null and b/Game/Buffs/curse/Fuuka.png differ diff --git a/Game/Buffs/curse/Gold.png b/Game/Buffs/curse/Gold.png new file mode 100644 index 000000000..2dd78f5a7 Binary files /dev/null and b/Game/Buffs/curse/Gold.png differ diff --git a/Game/Buffs/curse/HiSec.png b/Game/Buffs/curse/HiSec.png new file mode 100644 index 000000000..f2f198056 Binary files /dev/null and b/Game/Buffs/curse/HiSec.png differ diff --git a/Game/Buffs/curse/Purple.png b/Game/Buffs/curse/Purple.png new file mode 100644 index 000000000..d17739328 Binary files /dev/null and b/Game/Buffs/curse/Purple.png differ diff --git a/Game/Buffs/curse/Red.png b/Game/Buffs/curse/Red.png new file mode 100644 index 000000000..f5cbecfc4 Binary files /dev/null and b/Game/Buffs/curse/Red.png differ diff --git a/Game/Buffs/curse/Red_Hi.png b/Game/Buffs/curse/Red_Hi.png new file mode 100644 index 000000000..f27c6bfc1 Binary files /dev/null and b/Game/Buffs/curse/Red_Hi.png differ diff --git a/Game/Buffs/curse/Red_Med.png b/Game/Buffs/curse/Red_Med.png new file mode 100644 index 000000000..724c870e2 Binary files /dev/null and b/Game/Buffs/curse/Red_Med.png differ diff --git a/Game/Buffs/curse/Rubber.png b/Game/Buffs/curse/Rubber.png new file mode 100644 index 000000000..bce77a205 Binary files /dev/null and b/Game/Buffs/curse/Rubber.png differ diff --git a/Game/Buffs/curse/StarCurse.png b/Game/Buffs/curse/StarCurse.png new file mode 100644 index 000000000..94c88b59a Binary files /dev/null and b/Game/Buffs/curse/StarCurse.png differ diff --git a/Game/Buffs/curse/White.png b/Game/Buffs/curse/White.png new file mode 100644 index 000000000..c7482da91 Binary files /dev/null and b/Game/Buffs/curse/White.png differ diff --git a/Game/Buffs/debuff.png b/Game/Buffs/debuff.png index cbd108157..8060777b5 100644 Binary files a/Game/Buffs/debuff.png and b/Game/Buffs/debuff.png differ diff --git a/Game/Buffs/dmgPlus/dmgarcane.png b/Game/Buffs/dmgPlus/dmgarcane.png new file mode 100644 index 000000000..00bb3c6c6 Binary files /dev/null and b/Game/Buffs/dmgPlus/dmgarcane.png differ diff --git a/Game/Buffs/dmgPlus/dmgplush.png b/Game/Buffs/dmgPlus/dmgplush.png new file mode 100644 index 000000000..d1a84fa48 Binary files /dev/null and b/Game/Buffs/dmgPlus/dmgplush.png differ diff --git a/Game/Buffs/dmgPlus/dmgsoap.png b/Game/Buffs/dmgPlus/dmgsoap.png new file mode 100644 index 000000000..06d747d6f Binary files /dev/null and b/Game/Buffs/dmgPlus/dmgsoap.png differ diff --git a/Game/Buffs/dmgarcane.png b/Game/Buffs/dmgarcane.png new file mode 100644 index 000000000..fd6088ff3 Binary files /dev/null and b/Game/Buffs/dmgarcane.png differ diff --git a/Game/Buffs/dmgholy.png b/Game/Buffs/dmgholy.png new file mode 100644 index 000000000..ca432c1df Binary files /dev/null and b/Game/Buffs/dmgholy.png differ diff --git a/Game/Buffs/dmgplush.png b/Game/Buffs/dmgplush.png new file mode 100644 index 000000000..74f1b6d27 Binary files /dev/null and b/Game/Buffs/dmgplush.png differ diff --git a/Game/Buffs/dmgsoap.png b/Game/Buffs/dmgsoap.png new file mode 100644 index 000000000..b95b82a86 Binary files /dev/null and b/Game/Buffs/dmgsoap.png differ diff --git a/Game/Buffs/infoBlock.png b/Game/Buffs/infoBlock.png new file mode 100644 index 000000000..650664fbc Binary files /dev/null and b/Game/Buffs/infoBlock.png differ diff --git a/Game/Buffs/restriction.png b/Game/Buffs/restriction.png new file mode 100644 index 000000000..50eb63b0f Binary files /dev/null and b/Game/Buffs/restriction.png differ diff --git a/Game/Buffs/shield.png b/Game/Buffs/shield.png new file mode 100644 index 000000000..2dffadf22 Binary files /dev/null and b/Game/Buffs/shield.png differ diff --git a/Game/Buffs/training/Heels.png b/Game/Buffs/training/Heels.png new file mode 100644 index 000000000..568a596fe Binary files /dev/null and b/Game/Buffs/training/Heels.png differ diff --git a/Game/Buffs/weaponTag/bow.png b/Game/Buffs/weaponTag/bow.png new file mode 100644 index 000000000..295d9c75c Binary files /dev/null and b/Game/Buffs/weaponTag/bow.png differ diff --git a/Game/Buffs/weaponTag/clumsy.png b/Game/Buffs/weaponTag/clumsy.png new file mode 100644 index 000000000..8762029b0 Binary files /dev/null and b/Game/Buffs/weaponTag/clumsy.png differ diff --git a/Game/Buffs/weaponTag/heavy.png b/Game/Buffs/weaponTag/heavy.png new file mode 100644 index 000000000..75964cce4 Binary files /dev/null and b/Game/Buffs/weaponTag/heavy.png differ diff --git a/Game/Buffs/weaponTag/illum.png b/Game/Buffs/weaponTag/illum.png new file mode 100644 index 000000000..d8ff9b1c2 Binary files /dev/null and b/Game/Buffs/weaponTag/illum.png differ diff --git a/Game/Buffs/weaponTag/light.png b/Game/Buffs/weaponTag/light.png new file mode 100644 index 000000000..53ffda20f Binary files /dev/null and b/Game/Buffs/weaponTag/light.png differ diff --git a/Game/Buffs/weaponTag/magic.png b/Game/Buffs/weaponTag/magic.png new file mode 100644 index 000000000..60d9c9d4a Binary files /dev/null and b/Game/Buffs/weaponTag/magic.png differ diff --git a/Game/Buffs/weaponTag/massive.png b/Game/Buffs/weaponTag/massive.png new file mode 100644 index 000000000..1470f7958 Binary files /dev/null and b/Game/Buffs/weaponTag/massive.png differ diff --git a/Game/Buffs/weaponTag/noHands.png b/Game/Buffs/weaponTag/noHands.png new file mode 100644 index 000000000..7866e5c20 Binary files /dev/null and b/Game/Buffs/weaponTag/noHands.png differ diff --git a/Game/Buffs/weaponTag/offhand.png b/Game/Buffs/weaponTag/offhand.png new file mode 100644 index 000000000..53e237be8 Binary files /dev/null and b/Game/Buffs/weaponTag/offhand.png differ diff --git a/Game/Buffs/weaponTag/shield.png b/Game/Buffs/weaponTag/shield.png new file mode 100644 index 000000000..a2272dc84 Binary files /dev/null and b/Game/Buffs/weaponTag/shield.png differ diff --git a/Game/Buffs/weaponTag/stamPenType_Staff.png b/Game/Buffs/weaponTag/stamPenType_Staff.png new file mode 100644 index 000000000..d61eb2e92 Binary files /dev/null and b/Game/Buffs/weaponTag/stamPenType_Staff.png differ diff --git a/Game/Bullets/AMGagBolt.png b/Game/Bullets/AMGagBolt.png new file mode 100644 index 000000000..04e580842 Binary files /dev/null and b/Game/Bullets/AMGagBolt.png differ diff --git a/Game/Bullets/AMGagBoltHit.png b/Game/Bullets/AMGagBoltHit.png new file mode 100644 index 000000000..9b612c81a Binary files /dev/null and b/Game/Bullets/AMGagBoltHit.png differ diff --git a/Game/Bullets/AllyFirebolt.png b/Game/Bullets/AllyFirebolt.png index ab66259d1..0eac80a33 100644 Binary files a/Game/Bullets/AllyFirebolt.png and b/Game/Bullets/AllyFirebolt.png differ diff --git a/Game/Bullets/AllyHolyBolt.png b/Game/Bullets/AllyHolyBolt.png new file mode 100644 index 000000000..e8571d04c Binary files /dev/null and b/Game/Bullets/AllyHolyBolt.png differ diff --git a/Game/Bullets/AllyHolyBoltHit.png b/Game/Bullets/AllyHolyBoltHit.png new file mode 100644 index 000000000..f02d347dc Binary files /dev/null and b/Game/Bullets/AllyHolyBoltHit.png differ diff --git a/Game/Bullets/ArcaneBlast.png b/Game/Bullets/ArcaneBlast.png new file mode 100644 index 000000000..12b76b426 Binary files /dev/null and b/Game/Bullets/ArcaneBlast.png differ diff --git a/Game/Bullets/ArcaneBlastHit.png b/Game/Bullets/ArcaneBlastHit.png new file mode 100644 index 000000000..0629f401b Binary files /dev/null and b/Game/Bullets/ArcaneBlastHit.png differ diff --git a/Game/Bullets/ArrowBolt.png b/Game/Bullets/ArrowBolt.png new file mode 100644 index 000000000..6c33843de Binary files /dev/null and b/Game/Bullets/ArrowBolt.png differ diff --git a/Game/Bullets/ArrowBoltHeavy.png b/Game/Bullets/ArrowBoltHeavy.png new file mode 100644 index 000000000..6c33843de Binary files /dev/null and b/Game/Bullets/ArrowBoltHeavy.png differ diff --git a/Game/Bullets/ArrowBoltHeavyHit.png b/Game/Bullets/ArrowBoltHeavyHit.png new file mode 100644 index 000000000..fd8a5cd3d Binary files /dev/null and b/Game/Bullets/ArrowBoltHeavyHit.png differ diff --git a/Game/Bullets/ArrowBoltHit.png b/Game/Bullets/ArrowBoltHit.png new file mode 100644 index 000000000..6aa127966 Binary files /dev/null and b/Game/Bullets/ArrowBoltHit.png differ diff --git a/Game/Bullets/ArrowBoltPistol.png b/Game/Bullets/ArrowBoltPistol.png new file mode 100644 index 000000000..6c33843de Binary files /dev/null and b/Game/Bullets/ArrowBoltPistol.png differ diff --git a/Game/Bullets/ArrowBoltPistolHit.png b/Game/Bullets/ArrowBoltPistolHit.png new file mode 100644 index 000000000..226ce68f4 Binary files /dev/null and b/Game/Bullets/ArrowBoltPistolHit.png differ diff --git a/Game/Bullets/ArrowFire.png b/Game/Bullets/ArrowFire.png new file mode 100644 index 000000000..5d0f1fc5b Binary files /dev/null and b/Game/Bullets/ArrowFire.png differ diff --git a/Game/Bullets/ArrowFireHit.png b/Game/Bullets/ArrowFireHit.png new file mode 100644 index 000000000..32b9b5116 Binary files /dev/null and b/Game/Bullets/ArrowFireHit.png differ diff --git a/Game/Bullets/ArrowLongbow.png b/Game/Bullets/ArrowLongbow.png new file mode 100644 index 000000000..3aee78f4c Binary files /dev/null and b/Game/Bullets/ArrowLongbow.png differ diff --git a/Game/Bullets/ArrowLongbowHit.png b/Game/Bullets/ArrowLongbowHit.png new file mode 100644 index 000000000..fd8a5cd3d Binary files /dev/null and b/Game/Bullets/ArrowLongbowHit.png differ diff --git a/Game/Bullets/ArrowNormal.png b/Game/Bullets/ArrowNormal.png new file mode 100644 index 000000000..3aee78f4c Binary files /dev/null and b/Game/Bullets/ArrowNormal.png differ diff --git a/Game/Bullets/ArrowNormalHit.png b/Game/Bullets/ArrowNormalHit.png new file mode 100644 index 000000000..226ce68f4 Binary files /dev/null and b/Game/Bullets/ArrowNormalHit.png differ diff --git a/Game/Bullets/ArrowRecurve.png b/Game/Bullets/ArrowRecurve.png new file mode 100644 index 000000000..3aee78f4c Binary files /dev/null and b/Game/Bullets/ArrowRecurve.png differ diff --git a/Game/Bullets/ArrowRecurveHit.png b/Game/Bullets/ArrowRecurveHit.png new file mode 100644 index 000000000..6aa127966 Binary files /dev/null and b/Game/Bullets/ArrowRecurveHit.png differ diff --git a/Game/Bullets/ArrowVine.png b/Game/Bullets/ArrowVine.png new file mode 100644 index 000000000..aa55e1cc9 Binary files /dev/null and b/Game/Bullets/ArrowVine.png differ diff --git a/Game/Bullets/ArrowVineHit.png b/Game/Bullets/ArrowVineHit.png new file mode 100644 index 000000000..e58daf087 Binary files /dev/null and b/Game/Bullets/ArrowVineHit.png differ diff --git a/Game/Bullets/BindFabricHit.png b/Game/Bullets/BindFabricHit.png new file mode 100644 index 000000000..5dc8ad721 Binary files /dev/null and b/Game/Bullets/BindFabricHit.png differ diff --git a/Game/Bullets/BindWrappingHit.png b/Game/Bullets/BindWrappingHit.png new file mode 100644 index 000000000..1b1dcb756 Binary files /dev/null and b/Game/Bullets/BindWrappingHit.png differ diff --git a/Game/Bullets/BladeDanceBullet.png b/Game/Bullets/BladeDanceBullet.png new file mode 100644 index 000000000..d02fb12fb Binary files /dev/null and b/Game/Bullets/BladeDanceBullet.png differ diff --git a/Game/Bullets/BombItem.png b/Game/Bullets/BombItem.png new file mode 100644 index 000000000..68f76ed64 Binary files /dev/null and b/Game/Bullets/BombItem.png differ diff --git a/Game/Bullets/BombItemHit.png b/Game/Bullets/BombItemHit.png new file mode 100644 index 000000000..f5700ccfa Binary files /dev/null and b/Game/Bullets/BombItemHit.png differ diff --git a/Game/Bullets/BubbleBurst.png b/Game/Bullets/BubbleBurst.png new file mode 100644 index 000000000..9baa5223b Binary files /dev/null and b/Game/Bullets/BubbleBurst.png differ diff --git a/Game/Bullets/BubbleBurstHit.png b/Game/Bullets/BubbleBurstHit.png new file mode 100644 index 000000000..d169055a0 Binary files /dev/null and b/Game/Bullets/BubbleBurstHit.png differ diff --git a/Game/Bullets/BubbleBurstLatex.png b/Game/Bullets/BubbleBurstLatex.png new file mode 100644 index 000000000..d5afd93a1 Binary files /dev/null and b/Game/Bullets/BubbleBurstLatex.png differ diff --git a/Game/Bullets/BubbleBurstLatexHit.png b/Game/Bullets/BubbleBurstLatexHit.png new file mode 100644 index 000000000..9e98e50d0 Binary files /dev/null and b/Game/Bullets/BubbleBurstLatexHit.png differ diff --git a/Game/Bullets/BubbleBurstSlime.png b/Game/Bullets/BubbleBurstSlime.png new file mode 100644 index 000000000..d5964ec85 Binary files /dev/null and b/Game/Bullets/BubbleBurstSlime.png differ diff --git a/Game/Bullets/BubbleBurstSlimeHit.png b/Game/Bullets/BubbleBurstSlimeHit.png new file mode 100644 index 000000000..42b021a42 Binary files /dev/null and b/Game/Bullets/BubbleBurstSlimeHit.png differ diff --git a/Game/Bullets/Bubbleexp.png b/Game/Bullets/Bubbleexp.png new file mode 100644 index 000000000..b844e72d2 Binary files /dev/null and b/Game/Bullets/Bubbleexp.png differ diff --git a/Game/Bullets/BubbleexpHit.png b/Game/Bullets/BubbleexpHit.png new file mode 100644 index 000000000..89306992c Binary files /dev/null and b/Game/Bullets/BubbleexpHit.png differ diff --git a/Game/Bullets/C4Item.png b/Game/Bullets/C4Item.png new file mode 100644 index 000000000..7f00cd576 Binary files /dev/null and b/Game/Bullets/C4Item.png differ diff --git a/Game/Bullets/C4ItemHit.png b/Game/Bullets/C4ItemHit.png new file mode 100644 index 000000000..f5700ccfa Binary files /dev/null and b/Game/Bullets/C4ItemHit.png differ diff --git a/Game/Bullets/ColdFeet.png b/Game/Bullets/ColdFeet.png new file mode 100644 index 000000000..6a17a9208 Binary files /dev/null and b/Game/Bullets/ColdFeet.png differ diff --git a/Game/Bullets/ColdFeetHit.png b/Game/Bullets/ColdFeetHit.png new file mode 100644 index 000000000..c69d37743 Binary files /dev/null and b/Game/Bullets/ColdFeetHit.png differ diff --git a/Game/Bullets/CrystalBolt.png b/Game/Bullets/CrystalBolt.png new file mode 100644 index 000000000..7e9a01f11 Binary files /dev/null and b/Game/Bullets/CrystalBolt.png differ diff --git a/Game/Bullets/CrystalBoltHit.png b/Game/Bullets/CrystalBoltHit.png new file mode 100644 index 000000000..31fddd618 Binary files /dev/null and b/Game/Bullets/CrystalBoltHit.png differ diff --git a/Game/Bullets/CrystalBoltMany.png b/Game/Bullets/CrystalBoltMany.png new file mode 100644 index 000000000..f6303a6bd Binary files /dev/null and b/Game/Bullets/CrystalBoltMany.png differ diff --git a/Game/Bullets/CrystalBoltManyHit.png b/Game/Bullets/CrystalBoltManyHit.png new file mode 100644 index 000000000..4a0f4ac25 Binary files /dev/null and b/Game/Bullets/CrystalBoltManyHit.png differ diff --git a/Game/Bullets/CrystalBoltSingle.png b/Game/Bullets/CrystalBoltSingle.png new file mode 100644 index 000000000..7e9a01f11 Binary files /dev/null and b/Game/Bullets/CrystalBoltSingle.png differ diff --git a/Game/Bullets/CrystalBoltSingleHit.png b/Game/Bullets/CrystalBoltSingleHit.png new file mode 100644 index 000000000..31fddd618 Binary files /dev/null and b/Game/Bullets/CrystalBoltSingleHit.png differ diff --git a/Game/Bullets/CrystalPuff.png b/Game/Bullets/CrystalPuff.png index fd7781a6c..3d948660f 100644 Binary files a/Game/Bullets/CrystalPuff.png and b/Game/Bullets/CrystalPuff.png differ diff --git a/Game/Bullets/CrystalShock.png b/Game/Bullets/CrystalShock.png new file mode 100644 index 000000000..5cceb0ca2 Binary files /dev/null and b/Game/Bullets/CrystalShock.png differ diff --git a/Game/Bullets/CrystalShockBolt.png b/Game/Bullets/CrystalShockBolt.png new file mode 100644 index 000000000..4f60b9739 Binary files /dev/null and b/Game/Bullets/CrystalShockBolt.png differ diff --git a/Game/Bullets/CrystalShockBoltHit.png b/Game/Bullets/CrystalShockBoltHit.png new file mode 100644 index 000000000..83f46a834 Binary files /dev/null and b/Game/Bullets/CrystalShockBoltHit.png differ diff --git a/Game/Bullets/CrystalShockHit.png b/Game/Bullets/CrystalShockHit.png new file mode 100644 index 000000000..31fddd618 Binary files /dev/null and b/Game/Bullets/CrystalShockHit.png differ diff --git a/Game/Bullets/CrystalSlash.png b/Game/Bullets/CrystalSlash.png new file mode 100644 index 000000000..62ef07bdf Binary files /dev/null and b/Game/Bullets/CrystalSlash.png differ diff --git a/Game/Bullets/CrystalSlashHit.png b/Game/Bullets/CrystalSlashHit.png new file mode 100644 index 000000000..7b11cefcd Binary files /dev/null and b/Game/Bullets/CrystalSlashHit.png differ diff --git a/Game/Bullets/CursedArrow.png b/Game/Bullets/CursedArrow.png new file mode 100644 index 000000000..681f121c2 Binary files /dev/null and b/Game/Bullets/CursedArrow.png differ diff --git a/Game/Bullets/CursedArrowHit.png b/Game/Bullets/CursedArrowHit.png new file mode 100644 index 000000000..31c178616 Binary files /dev/null and b/Game/Bullets/CursedArrowHit.png differ diff --git a/Game/Bullets/CursingCircle.png b/Game/Bullets/CursingCircle.png new file mode 100644 index 000000000..3b7a93b2a Binary files /dev/null and b/Game/Bullets/CursingCircle.png differ diff --git a/Game/Bullets/CursingCircle2.png b/Game/Bullets/CursingCircle2.png new file mode 100644 index 000000000..4ea0bc978 Binary files /dev/null and b/Game/Bullets/CursingCircle2.png differ diff --git a/Game/Bullets/CursingCircle2Hit.png b/Game/Bullets/CursingCircle2Hit.png new file mode 100644 index 000000000..bc8c56478 Binary files /dev/null and b/Game/Bullets/CursingCircle2Hit.png differ diff --git a/Game/Bullets/CursingCircleHit.png b/Game/Bullets/CursingCircleHit.png new file mode 100644 index 000000000..e54d4c397 Binary files /dev/null and b/Game/Bullets/CursingCircleHit.png differ diff --git a/Game/Bullets/DistractionBurstBullet.png b/Game/Bullets/DistractionBurstBullet.png new file mode 100644 index 000000000..ab7f5da5c Binary files /dev/null and b/Game/Bullets/DistractionBurstBullet.png differ diff --git a/Game/Bullets/DragonFlowerSpores.png b/Game/Bullets/DragonFlowerSpores.png new file mode 100644 index 000000000..fc4e8a36c Binary files /dev/null and b/Game/Bullets/DragonFlowerSpores.png differ diff --git a/Game/Bullets/DragonFlowerSporesHit.png b/Game/Bullets/DragonFlowerSporesHit.png new file mode 100644 index 000000000..29810b05f Binary files /dev/null and b/Game/Bullets/DragonFlowerSporesHit.png differ diff --git a/Game/Bullets/DragonIceBolt.png b/Game/Bullets/DragonIceBolt.png new file mode 100644 index 000000000..13496739d Binary files /dev/null and b/Game/Bullets/DragonIceBolt.png differ diff --git a/Game/Bullets/DragonIceBoltHit.png b/Game/Bullets/DragonIceBoltHit.png new file mode 100644 index 000000000..48de3c5ff Binary files /dev/null and b/Game/Bullets/DragonIceBoltHit.png differ diff --git a/Game/Bullets/DragonSlash.png b/Game/Bullets/DragonSlash.png new file mode 100644 index 000000000..feb777586 Binary files /dev/null and b/Game/Bullets/DragonSlash.png differ diff --git a/Game/Bullets/DragonSlashHit.png b/Game/Bullets/DragonSlashHit.png new file mode 100644 index 000000000..c0cdf5bd1 Binary files /dev/null and b/Game/Bullets/DragonSlashHit.png differ diff --git a/Game/Bullets/DragonVine.png b/Game/Bullets/DragonVine.png new file mode 100644 index 000000000..567b7f230 Binary files /dev/null and b/Game/Bullets/DragonVine.png differ diff --git a/Game/Bullets/DragonVineHit.png b/Game/Bullets/DragonVineHit.png new file mode 100644 index 000000000..c7ff430ce Binary files /dev/null and b/Game/Bullets/DragonVineHit.png differ diff --git a/Game/Bullets/DynamiteItem.png b/Game/Bullets/DynamiteItem.png new file mode 100644 index 000000000..2084ad3ac Binary files /dev/null and b/Game/Bullets/DynamiteItem.png differ diff --git a/Game/Bullets/DynamiteItemHit.png b/Game/Bullets/DynamiteItemHit.png new file mode 100644 index 000000000..f5700ccfa Binary files /dev/null and b/Game/Bullets/DynamiteItemHit.png differ diff --git a/Game/Bullets/ElfArrow_2.png b/Game/Bullets/ElfArrow_2.png deleted file mode 100644 index 660834b35..000000000 Binary files a/Game/Bullets/ElfArrow_2.png and /dev/null differ diff --git a/Game/Bullets/EnchantRope.png b/Game/Bullets/EnchantRope.png new file mode 100644 index 000000000..4481469ed Binary files /dev/null and b/Game/Bullets/EnchantRope.png differ diff --git a/Game/Bullets/EnemyEnchantRope.png b/Game/Bullets/EnemyEnchantRope.png new file mode 100644 index 000000000..e537f432c Binary files /dev/null and b/Game/Bullets/EnemyEnchantRope.png differ diff --git a/Game/Bullets/EnemyEnchantRope2.png b/Game/Bullets/EnemyEnchantRope2.png new file mode 100644 index 000000000..9b248a553 Binary files /dev/null and b/Game/Bullets/EnemyEnchantRope2.png differ diff --git a/Game/Bullets/EnemyEnchantRope2Hit.png b/Game/Bullets/EnemyEnchantRope2Hit.png new file mode 100644 index 000000000..48ad8e608 Binary files /dev/null and b/Game/Bullets/EnemyEnchantRope2Hit.png differ diff --git a/Game/Bullets/EnemyEnchantRopeHit.png b/Game/Bullets/EnemyEnchantRopeHit.png new file mode 100644 index 000000000..6fd28bfd1 Binary files /dev/null and b/Game/Bullets/EnemyEnchantRopeHit.png differ diff --git a/Game/Bullets/EnemyFlashBomb.png b/Game/Bullets/EnemyFlashBomb.png new file mode 100644 index 000000000..dfafc2a3e Binary files /dev/null and b/Game/Bullets/EnemyFlashBomb.png differ diff --git a/Game/Bullets/EnemyFlashBombHit.png b/Game/Bullets/EnemyFlashBombHit.png new file mode 100644 index 000000000..c0824a5dd Binary files /dev/null and b/Game/Bullets/EnemyFlashBombHit.png differ diff --git a/Game/Bullets/EnemyLatexArmbinderBolt.png b/Game/Bullets/EnemyLatexArmbinderBolt.png new file mode 100644 index 000000000..cc42a5999 Binary files /dev/null and b/Game/Bullets/EnemyLatexArmbinderBolt.png differ diff --git a/Game/Bullets/EnemyLatexArmbinderBoltHit.png b/Game/Bullets/EnemyLatexArmbinderBoltHit.png new file mode 100644 index 000000000..7f84ee40e Binary files /dev/null and b/Game/Bullets/EnemyLatexArmbinderBoltHit.png differ diff --git a/Game/Bullets/EnemyLatexGagBolt.png b/Game/Bullets/EnemyLatexGagBolt.png new file mode 100644 index 000000000..fec5d61e6 Binary files /dev/null and b/Game/Bullets/EnemyLatexGagBolt.png differ diff --git a/Game/Bullets/EnemyLatexGagBoltHit.png b/Game/Bullets/EnemyLatexGagBoltHit.png new file mode 100644 index 000000000..7f84ee40e Binary files /dev/null and b/Game/Bullets/EnemyLatexGagBoltHit.png differ diff --git a/Game/Bullets/EnemyLatexLegbinderBolt.png b/Game/Bullets/EnemyLatexLegbinderBolt.png new file mode 100644 index 000000000..f3658e208 Binary files /dev/null and b/Game/Bullets/EnemyLatexLegbinderBolt.png differ diff --git a/Game/Bullets/EnemyLatexLegbinderBoltHit.png b/Game/Bullets/EnemyLatexLegbinderBoltHit.png new file mode 100644 index 000000000..7f84ee40e Binary files /dev/null and b/Game/Bullets/EnemyLatexLegbinderBoltHit.png differ diff --git a/Game/Bullets/EnemyLatexRestraintBolt.png b/Game/Bullets/EnemyLatexRestraintBolt.png new file mode 100644 index 000000000..55ffda787 Binary files /dev/null and b/Game/Bullets/EnemyLatexRestraintBolt.png differ diff --git a/Game/Bullets/EnemyLatexRestraintBoltHit.png b/Game/Bullets/EnemyLatexRestraintBoltHit.png new file mode 100644 index 000000000..7f84ee40e Binary files /dev/null and b/Game/Bullets/EnemyLatexRestraintBoltHit.png differ diff --git a/Game/Bullets/EnemySteelRainBurst.png b/Game/Bullets/EnemySteelRainBurst.png new file mode 100644 index 000000000..f442b0b3a Binary files /dev/null and b/Game/Bullets/EnemySteelRainBurst.png differ diff --git a/Game/Bullets/EnemySteelRainBurstHit.png b/Game/Bullets/EnemySteelRainBurstHit.png new file mode 100644 index 000000000..762c2ca43 Binary files /dev/null and b/Game/Bullets/EnemySteelRainBurstHit.png differ diff --git a/Game/Bullets/EnemySteelRainPlug.png b/Game/Bullets/EnemySteelRainPlug.png new file mode 100644 index 000000000..49fa4071a Binary files /dev/null and b/Game/Bullets/EnemySteelRainPlug.png differ diff --git a/Game/Bullets/EnemySteelRainPlugHit.png b/Game/Bullets/EnemySteelRainPlugHit.png new file mode 100644 index 000000000..5dee6f3e5 Binary files /dev/null and b/Game/Bullets/EnemySteelRainPlugHit.png differ diff --git a/Game/Bullets/EnemySummonLatexArmbinder.png b/Game/Bullets/EnemySummonLatexArmbinder.png new file mode 100644 index 000000000..c22ecb9d7 Binary files /dev/null and b/Game/Bullets/EnemySummonLatexArmbinder.png differ diff --git a/Game/Bullets/EnemySummonLatexArmbinderHit.png b/Game/Bullets/EnemySummonLatexArmbinderHit.png new file mode 100644 index 000000000..762c2ca43 Binary files /dev/null and b/Game/Bullets/EnemySummonLatexArmbinderHit.png differ diff --git a/Game/Bullets/EnemySummonLatexGag.png b/Game/Bullets/EnemySummonLatexGag.png new file mode 100644 index 000000000..79ffdafd6 Binary files /dev/null and b/Game/Bullets/EnemySummonLatexGag.png differ diff --git a/Game/Bullets/EnemySummonLatexGagHit.png b/Game/Bullets/EnemySummonLatexGagHit.png new file mode 100644 index 000000000..762c2ca43 Binary files /dev/null and b/Game/Bullets/EnemySummonLatexGagHit.png differ diff --git a/Game/Bullets/EnemySummonLatexLegbinder.png b/Game/Bullets/EnemySummonLatexLegbinder.png new file mode 100644 index 000000000..f6a387868 Binary files /dev/null and b/Game/Bullets/EnemySummonLatexLegbinder.png differ diff --git a/Game/Bullets/EnemySummonLatexLegbinderHit.png b/Game/Bullets/EnemySummonLatexLegbinderHit.png new file mode 100644 index 000000000..762c2ca43 Binary files /dev/null and b/Game/Bullets/EnemySummonLatexLegbinderHit.png differ diff --git a/Game/Bullets/EnemySummonLatexRestraint.png b/Game/Bullets/EnemySummonLatexRestraint.png new file mode 100644 index 000000000..4beb8e762 Binary files /dev/null and b/Game/Bullets/EnemySummonLatexRestraint.png differ diff --git a/Game/Bullets/EnemySummonLatexRestraintHit.png b/Game/Bullets/EnemySummonLatexRestraintHit.png new file mode 100644 index 000000000..762c2ca43 Binary files /dev/null and b/Game/Bullets/EnemySummonLatexRestraintHit.png differ diff --git a/Game/Bullets/EnemyWindBlast.png b/Game/Bullets/EnemyWindBlast.png new file mode 100644 index 000000000..c187626b3 Binary files /dev/null and b/Game/Bullets/EnemyWindBlast.png differ diff --git a/Game/Bullets/EnemyWindBlastHit.png b/Game/Bullets/EnemyWindBlastHit.png new file mode 100644 index 000000000..f02d347dc Binary files /dev/null and b/Game/Bullets/EnemyWindBlastHit.png differ diff --git a/Game/Bullets/EnemyWinterblast.png b/Game/Bullets/EnemyWinterblast.png new file mode 100644 index 000000000..753b2f2db Binary files /dev/null and b/Game/Bullets/EnemyWinterblast.png differ diff --git a/Game/Bullets/EnemyWinterblastHit.png b/Game/Bullets/EnemyWinterblastHit.png new file mode 100644 index 000000000..f20838422 Binary files /dev/null and b/Game/Bullets/EnemyWinterblastHit.png differ diff --git a/Game/Bullets/ExplosiveBarrelHit.png b/Game/Bullets/ExplosiveBarrelHit.png new file mode 100644 index 000000000..755917d18 Binary files /dev/null and b/Game/Bullets/ExplosiveBarrelHit.png differ diff --git a/Game/Bullets/Fireball.png b/Game/Bullets/Fireball.png index 8c5222e11..76a6e1d93 100644 Binary files a/Game/Bullets/Fireball.png and b/Game/Bullets/Fireball.png differ diff --git a/Game/Bullets/FireballHit.png b/Game/Bullets/FireballHit.png index f5700ccfa..24a49c8bd 100644 Binary files a/Game/Bullets/FireballHit.png and b/Game/Bullets/FireballHit.png differ diff --git a/Game/Bullets/Fireblast.png b/Game/Bullets/Fireblast.png new file mode 100644 index 000000000..c89620460 Binary files /dev/null and b/Game/Bullets/Fireblast.png differ diff --git a/Game/Bullets/FireblastHit.png b/Game/Bullets/FireblastHit.png new file mode 100644 index 000000000..fdaa6542d Binary files /dev/null and b/Game/Bullets/FireblastHit.png differ diff --git a/Game/Bullets/Fireexp.png b/Game/Bullets/Fireexp.png new file mode 100644 index 000000000..12b8f1486 Binary files /dev/null and b/Game/Bullets/Fireexp.png differ diff --git a/Game/Bullets/FireexpHit.png b/Game/Bullets/FireexpHit.png new file mode 100644 index 000000000..c0b1a9062 Binary files /dev/null and b/Game/Bullets/FireexpHit.png differ diff --git a/Game/Bullets/FlameRuneStrike.png b/Game/Bullets/FlameRuneStrike.png index 9547b729b..648d8fbb5 100644 Binary files a/Game/Bullets/FlameRuneStrike.png and b/Game/Bullets/FlameRuneStrike.png differ diff --git a/Game/Bullets/FlameRuneStrikeHit.png b/Game/Bullets/FlameRuneStrikeHit.png index f74b6b4f0..c96f7d544 100644 Binary files a/Game/Bullets/FlameRuneStrikeHit.png and b/Game/Bullets/FlameRuneStrikeHit.png differ diff --git a/Game/Bullets/FlashBomb.png b/Game/Bullets/FlashBomb.png index dfafc2a3e..ad0bd21a5 100644 Binary files a/Game/Bullets/FlashBomb.png and b/Game/Bullets/FlashBomb.png differ diff --git a/Game/Bullets/FlashFreezeHit.png b/Game/Bullets/FlashFreezeHit.png index 5a6a060a0..b5f914b14 100644 Binary files a/Game/Bullets/FlashFreezeHit.png and b/Game/Bullets/FlashFreezeHit.png differ diff --git a/Game/Bullets/FlashbangHit.png b/Game/Bullets/FlashbangHit.png new file mode 100644 index 000000000..c0824a5dd Binary files /dev/null and b/Game/Bullets/FlashbangHit.png differ diff --git a/Game/Bullets/FreezeRuneStrike.png b/Game/Bullets/FreezeRuneStrike.png index 09a5d2101..fef70eebf 100644 Binary files a/Game/Bullets/FreezeRuneStrike.png and b/Game/Bullets/FreezeRuneStrike.png differ diff --git a/Game/Bullets/FreezeRuneStrikeHit.png b/Game/Bullets/FreezeRuneStrikeHit.png index 3157a7a7b..0b757c7e4 100644 Binary files a/Game/Bullets/FreezeRuneStrikeHit.png and b/Game/Bullets/FreezeRuneStrikeHit.png differ diff --git a/Game/Bullets/FuukaOrb.png b/Game/Bullets/FuukaOrb.png new file mode 100644 index 000000000..f57f58658 Binary files /dev/null and b/Game/Bullets/FuukaOrb.png differ diff --git a/Game/Bullets/FuukaOrbHit.png b/Game/Bullets/FuukaOrbHit.png new file mode 100644 index 000000000..cec3edcbf Binary files /dev/null and b/Game/Bullets/FuukaOrbHit.png differ diff --git a/Game/Bullets/FuukaOrbMulti.png b/Game/Bullets/FuukaOrbMulti.png new file mode 100644 index 000000000..f57f58658 Binary files /dev/null and b/Game/Bullets/FuukaOrbMulti.png differ diff --git a/Game/Bullets/FuukaOrbMultiHit.png b/Game/Bullets/FuukaOrbMultiHit.png new file mode 100644 index 000000000..cec3edcbf Binary files /dev/null and b/Game/Bullets/FuukaOrbMultiHit.png differ diff --git a/Game/Bullets/GlueBomb.png b/Game/Bullets/GlueBomb.png new file mode 100644 index 000000000..bfdc2a231 Binary files /dev/null and b/Game/Bullets/GlueBomb.png differ diff --git a/Game/Bullets/GlueBombHit.png b/Game/Bullets/GlueBombHit.png new file mode 100644 index 000000000..ff933f0de Binary files /dev/null and b/Game/Bullets/GlueBombHit.png differ diff --git a/Game/Bullets/GravityPull.png b/Game/Bullets/GravityPull.png new file mode 100644 index 000000000..b63672495 Binary files /dev/null and b/Game/Bullets/GravityPull.png differ diff --git a/Game/Bullets/GravityPullEarth.png b/Game/Bullets/GravityPullEarth.png new file mode 100644 index 000000000..6a674fdfb Binary files /dev/null and b/Game/Bullets/GravityPullEarth.png differ diff --git a/Game/Bullets/GravityPullEarthHit.png b/Game/Bullets/GravityPullEarthHit.png new file mode 100644 index 000000000..af8c2582f Binary files /dev/null and b/Game/Bullets/GravityPullEarthHit.png differ diff --git a/Game/Bullets/GravityPullHit.png b/Game/Bullets/GravityPullHit.png new file mode 100644 index 000000000..f12434d7e Binary files /dev/null and b/Game/Bullets/GravityPullHit.png differ diff --git a/Game/Bullets/HeavySlash.png b/Game/Bullets/HeavySlash.png new file mode 100644 index 000000000..6143e10c4 Binary files /dev/null and b/Game/Bullets/HeavySlash.png differ diff --git a/Game/Bullets/HeavySlashHit.png b/Game/Bullets/HeavySlashHit.png new file mode 100644 index 000000000..7b11cefcd Binary files /dev/null and b/Game/Bullets/HeavySlashHit.png differ diff --git a/Game/Bullets/HexLatexExplosion.png b/Game/Bullets/HexLatexExplosion.png new file mode 100644 index 000000000..b75eeeb4b Binary files /dev/null and b/Game/Bullets/HexLatexExplosion.png differ diff --git a/Game/Bullets/HexLatexExplosionHit.png b/Game/Bullets/HexLatexExplosionHit.png new file mode 100644 index 000000000..29d7b58e4 Binary files /dev/null and b/Game/Bullets/HexLatexExplosionHit.png differ diff --git a/Game/Bullets/HexOrb.png b/Game/Bullets/HexOrb.png new file mode 100644 index 000000000..c5b318c5f Binary files /dev/null and b/Game/Bullets/HexOrb.png differ diff --git a/Game/Bullets/HexOrbHit.png b/Game/Bullets/HexOrbHit.png new file mode 100644 index 000000000..40d9b85d3 Binary files /dev/null and b/Game/Bullets/HexOrbHit.png differ diff --git a/Game/Bullets/HexWrapping.png b/Game/Bullets/HexWrapping.png new file mode 100644 index 000000000..fa80c2401 Binary files /dev/null and b/Game/Bullets/HexWrapping.png differ diff --git a/Game/Bullets/HexWrappingHit.png b/Game/Bullets/HexWrappingHit.png new file mode 100644 index 000000000..b9bb38c89 Binary files /dev/null and b/Game/Bullets/HexWrappingHit.png differ diff --git a/Game/Bullets/IceBreathChannel.png b/Game/Bullets/IceBreathChannel.png new file mode 100644 index 000000000..a715d67e3 Binary files /dev/null and b/Game/Bullets/IceBreathChannel.png differ diff --git a/Game/Bullets/IceBreathChannelHit.png b/Game/Bullets/IceBreathChannelHit.png new file mode 100644 index 000000000..a715d67e3 Binary files /dev/null and b/Game/Bullets/IceBreathChannelHit.png differ diff --git a/Game/Bullets/Iceexp.png b/Game/Bullets/Iceexp.png new file mode 100644 index 000000000..a8905930c Binary files /dev/null and b/Game/Bullets/Iceexp.png differ diff --git a/Game/Bullets/IceexpHit.png b/Game/Bullets/IceexpHit.png new file mode 100644 index 000000000..48de3c5ff Binary files /dev/null and b/Game/Bullets/IceexpHit.png differ diff --git a/Game/Bullets/KineticLance.png b/Game/Bullets/KineticLance.png new file mode 100644 index 000000000..21b999476 Binary files /dev/null and b/Game/Bullets/KineticLance.png differ diff --git a/Game/Bullets/KineticLanceHit.png b/Game/Bullets/KineticLanceHit.png new file mode 100644 index 000000000..a023f39d1 Binary files /dev/null and b/Game/Bullets/KineticLanceHit.png differ diff --git a/Game/Bullets/LatexArmbinderBolt.png b/Game/Bullets/LatexArmbinderBolt.png new file mode 100644 index 000000000..cc42a5999 Binary files /dev/null and b/Game/Bullets/LatexArmbinderBolt.png differ diff --git a/Game/Bullets/LatexArmbinderBoltHit.png b/Game/Bullets/LatexArmbinderBoltHit.png new file mode 100644 index 000000000..7f84ee40e Binary files /dev/null and b/Game/Bullets/LatexArmbinderBoltHit.png differ diff --git a/Game/Bullets/LatexBubble.png b/Game/Bullets/LatexBubble.png new file mode 100644 index 000000000..a3024c764 Binary files /dev/null and b/Game/Bullets/LatexBubble.png differ diff --git a/Game/Bullets/LatexBubbleHit.png b/Game/Bullets/LatexBubbleHit.png new file mode 100644 index 000000000..7f84ee40e Binary files /dev/null and b/Game/Bullets/LatexBubbleHit.png differ diff --git a/Game/Bullets/LatexBubbleTrail.png b/Game/Bullets/LatexBubbleTrail.png new file mode 100644 index 000000000..55ffda787 Binary files /dev/null and b/Game/Bullets/LatexBubbleTrail.png differ diff --git a/Game/Bullets/LatexBubbleexp.png b/Game/Bullets/LatexBubbleexp.png new file mode 100644 index 000000000..b844e72d2 Binary files /dev/null and b/Game/Bullets/LatexBubbleexp.png differ diff --git a/Game/Bullets/LatexBubbleexpHit.png b/Game/Bullets/LatexBubbleexpHit.png new file mode 100644 index 000000000..89306992c Binary files /dev/null and b/Game/Bullets/LatexBubbleexpHit.png differ diff --git a/Game/Bullets/LatexGagBolt.png b/Game/Bullets/LatexGagBolt.png new file mode 100644 index 000000000..fec5d61e6 Binary files /dev/null and b/Game/Bullets/LatexGagBolt.png differ diff --git a/Game/Bullets/LatexGagBoltHit.png b/Game/Bullets/LatexGagBoltHit.png new file mode 100644 index 000000000..7f84ee40e Binary files /dev/null and b/Game/Bullets/LatexGagBoltHit.png differ diff --git a/Game/Bullets/LatexLegbinderBolt.png b/Game/Bullets/LatexLegbinderBolt.png new file mode 100644 index 000000000..f3658e208 Binary files /dev/null and b/Game/Bullets/LatexLegbinderBolt.png differ diff --git a/Game/Bullets/LatexLegbinderBoltHit.png b/Game/Bullets/LatexLegbinderBoltHit.png new file mode 100644 index 000000000..7f84ee40e Binary files /dev/null and b/Game/Bullets/LatexLegbinderBoltHit.png differ diff --git a/Game/Bullets/LatexSpray.png b/Game/Bullets/LatexSpray.png new file mode 100644 index 000000000..305ab2358 Binary files /dev/null and b/Game/Bullets/LatexSpray.png differ diff --git a/Game/Bullets/LatexSprayHit.png b/Game/Bullets/LatexSprayHit.png new file mode 100644 index 000000000..74081ca01 Binary files /dev/null and b/Game/Bullets/LatexSprayHit.png differ diff --git a/Game/Bullets/LiquidMetalBurst.png b/Game/Bullets/LiquidMetalBurst.png new file mode 100644 index 000000000..bc11ba022 Binary files /dev/null and b/Game/Bullets/LiquidMetalBurst.png differ diff --git a/Game/Bullets/LiquidMetalBurstHit.png b/Game/Bullets/LiquidMetalBurstHit.png new file mode 100644 index 000000000..6259a26bd Binary files /dev/null and b/Game/Bullets/LiquidMetalBurstHit.png differ diff --git a/Game/Bullets/LockBullet.png b/Game/Bullets/LockBullet.png new file mode 100644 index 000000000..e5b931876 Binary files /dev/null and b/Game/Bullets/LockBullet.png differ diff --git a/Game/Bullets/LockBulletHit.png b/Game/Bullets/LockBulletHit.png new file mode 100644 index 000000000..6d9b0a235 Binary files /dev/null and b/Game/Bullets/LockBulletHit.png differ diff --git a/Game/Bullets/MagicBelt.png b/Game/Bullets/MagicBelt.png new file mode 100644 index 000000000..3e78a3f27 Binary files /dev/null and b/Game/Bullets/MagicBelt.png differ diff --git a/Game/Bullets/MagicBeltHit.png b/Game/Bullets/MagicBeltHit.png new file mode 100644 index 000000000..8449fda47 Binary files /dev/null and b/Game/Bullets/MagicBeltHit.png differ diff --git a/Game/Bullets/MagicMissile.png b/Game/Bullets/MagicMissile.png new file mode 100644 index 000000000..0330ba237 Binary files /dev/null and b/Game/Bullets/MagicMissile.png differ diff --git a/Game/Bullets/MagicMissile2.png b/Game/Bullets/MagicMissile2.png new file mode 100644 index 000000000..0118ab76d Binary files /dev/null and b/Game/Bullets/MagicMissile2.png differ diff --git a/Game/Bullets/MagicMissile2Hit.png b/Game/Bullets/MagicMissile2Hit.png new file mode 100644 index 000000000..54b9c3cb7 Binary files /dev/null and b/Game/Bullets/MagicMissile2Hit.png differ diff --git a/Game/Bullets/MagicMissileChannel.png b/Game/Bullets/MagicMissileChannel.png new file mode 100644 index 000000000..8d137997d Binary files /dev/null and b/Game/Bullets/MagicMissileChannel.png differ diff --git a/Game/Bullets/MagicMissileChannelHit.png b/Game/Bullets/MagicMissileChannelHit.png new file mode 100644 index 000000000..8d137997d Binary files /dev/null and b/Game/Bullets/MagicMissileChannelHit.png differ diff --git a/Game/Bullets/MagicMissileHit.png b/Game/Bullets/MagicMissileHit.png new file mode 100644 index 000000000..54b9c3cb7 Binary files /dev/null and b/Game/Bullets/MagicMissileHit.png differ diff --git a/Game/Bullets/MagicRope.png b/Game/Bullets/MagicRope.png new file mode 100644 index 000000000..4ef09dd1f Binary files /dev/null and b/Game/Bullets/MagicRope.png differ diff --git a/Game/Bullets/MagicRopeHit.png b/Game/Bullets/MagicRopeHit.png new file mode 100644 index 000000000..2fca09b76 Binary files /dev/null and b/Game/Bullets/MagicRopeHit.png differ diff --git a/Game/Bullets/ManyMithrilBolts.png b/Game/Bullets/ManyMithrilBolts.png new file mode 100644 index 000000000..ea6ea7b96 Binary files /dev/null and b/Game/Bullets/ManyMithrilBolts.png differ diff --git a/Game/Bullets/ManyMithrilBoltsHit.png b/Game/Bullets/ManyMithrilBoltsHit.png new file mode 100644 index 000000000..074bd9008 Binary files /dev/null and b/Game/Bullets/ManyMithrilBoltsHit.png differ diff --git a/Game/Bullets/ManyObsidianBolts.png b/Game/Bullets/ManyObsidianBolts.png new file mode 100644 index 000000000..199476bae Binary files /dev/null and b/Game/Bullets/ManyObsidianBolts.png differ diff --git a/Game/Bullets/ManyObsidianBoltsHit.png b/Game/Bullets/ManyObsidianBoltsHit.png new file mode 100644 index 000000000..125ce7795 Binary files /dev/null and b/Game/Bullets/ManyObsidianBoltsHit.png differ diff --git a/Game/Bullets/ManyShadowHands.png b/Game/Bullets/ManyShadowHands.png new file mode 100644 index 000000000..aa79fbe35 Binary files /dev/null and b/Game/Bullets/ManyShadowHands.png differ diff --git a/Game/Bullets/ManyShadowHandsHit.png b/Game/Bullets/ManyShadowHandsHit.png new file mode 100644 index 000000000..8cb411bb3 Binary files /dev/null and b/Game/Bullets/ManyShadowHandsHit.png differ diff --git a/Game/Bullets/Minigun.png b/Game/Bullets/Minigun.png new file mode 100644 index 000000000..f25fecf57 Binary files /dev/null and b/Game/Bullets/Minigun.png differ diff --git a/Game/Bullets/MinigunHit.png b/Game/Bullets/MinigunHit.png new file mode 100644 index 000000000..101a56996 Binary files /dev/null and b/Game/Bullets/MinigunHit.png differ diff --git a/Game/Bullets/MithrilBolt.png b/Game/Bullets/MithrilBolt.png new file mode 100644 index 000000000..80704be66 Binary files /dev/null and b/Game/Bullets/MithrilBolt.png differ diff --git a/Game/Bullets/MithrilBoltHit.png b/Game/Bullets/MithrilBoltHit.png new file mode 100644 index 000000000..708d9f130 Binary files /dev/null and b/Game/Bullets/MithrilBoltHit.png differ diff --git a/Game/Bullets/NatureMoteBolt.png b/Game/Bullets/NatureMoteBolt.png new file mode 100644 index 000000000..dc753cb25 Binary files /dev/null and b/Game/Bullets/NatureMoteBolt.png differ diff --git a/Game/Bullets/NatureMoteBoltHit.png b/Game/Bullets/NatureMoteBoltHit.png new file mode 100644 index 000000000..bd23fd357 Binary files /dev/null and b/Game/Bullets/NatureMoteBoltHit.png differ diff --git a/Game/Bullets/ObserverBeam.png b/Game/Bullets/ObserverBeam.png new file mode 100644 index 000000000..f51e9454c Binary files /dev/null and b/Game/Bullets/ObserverBeam.png differ diff --git a/Game/Bullets/ObserverBeamBeam.png b/Game/Bullets/ObserverBeamBeam.png new file mode 100644 index 000000000..6f99aa847 Binary files /dev/null and b/Game/Bullets/ObserverBeamBeam.png differ diff --git a/Game/Bullets/ObserverBeamBeamHit.png b/Game/Bullets/ObserverBeamBeamHit.png new file mode 100644 index 000000000..749c854b7 Binary files /dev/null and b/Game/Bullets/ObserverBeamBeamHit.png differ diff --git a/Game/Bullets/ObserverBeamBeamTrail.png b/Game/Bullets/ObserverBeamBeamTrail.png new file mode 100644 index 000000000..6f99aa847 Binary files /dev/null and b/Game/Bullets/ObserverBeamBeamTrail.png differ diff --git a/Game/Bullets/ObserverBeamBeamTrailHit.png b/Game/Bullets/ObserverBeamBeamTrailHit.png new file mode 100644 index 000000000..749c854b7 Binary files /dev/null and b/Game/Bullets/ObserverBeamBeamTrailHit.png differ diff --git a/Game/Bullets/ObserverBeamHit.png b/Game/Bullets/ObserverBeamHit.png new file mode 100644 index 000000000..f5f320b1d Binary files /dev/null and b/Game/Bullets/ObserverBeamHit.png differ diff --git a/Game/Bullets/OneBarMissile.png b/Game/Bullets/OneBarMissile.png new file mode 100644 index 000000000..9f06d09b6 Binary files /dev/null and b/Game/Bullets/OneBarMissile.png differ diff --git a/Game/Bullets/OneBarMissileHit.png b/Game/Bullets/OneBarMissileHit.png new file mode 100644 index 000000000..eaf23ed5d Binary files /dev/null and b/Game/Bullets/OneBarMissileHit.png differ diff --git a/Game/Bullets/PlayerRubberSniper.png b/Game/Bullets/PlayerRubberSniper.png new file mode 100644 index 000000000..22429c554 Binary files /dev/null and b/Game/Bullets/PlayerRubberSniper.png differ diff --git a/Game/Bullets/PlayerRubberSniperHit.png b/Game/Bullets/PlayerRubberSniperHit.png new file mode 100644 index 000000000..7e00522bf Binary files /dev/null and b/Game/Bullets/PlayerRubberSniperHit.png differ diff --git a/Game/Bullets/PoisonBreath.png b/Game/Bullets/PoisonBreath.png new file mode 100644 index 000000000..951ccb042 Binary files /dev/null and b/Game/Bullets/PoisonBreath.png differ diff --git a/Game/Bullets/PoisonBreathHit.png b/Game/Bullets/PoisonBreathHit.png new file mode 100644 index 000000000..0925977ac Binary files /dev/null and b/Game/Bullets/PoisonBreathHit.png differ diff --git a/Game/Bullets/RecoverObjectHit.png b/Game/Bullets/RecoverObjectHit.png new file mode 100644 index 000000000..76bb76258 Binary files /dev/null and b/Game/Bullets/RecoverObjectHit.png differ diff --git a/Game/Bullets/RestrainingBolt.png b/Game/Bullets/RestrainingBolt.png new file mode 100644 index 000000000..0aa3eded9 Binary files /dev/null and b/Game/Bullets/RestrainingBolt.png differ diff --git a/Game/Bullets/RestrainingBoltHit.png b/Game/Bullets/RestrainingBoltHit.png new file mode 100644 index 000000000..54b9c3cb7 Binary files /dev/null and b/Game/Bullets/RestrainingBoltHit.png differ diff --git a/Game/Bullets/RopeBoltLaunchMany.png b/Game/Bullets/RopeBoltLaunchMany.png new file mode 100644 index 000000000..1baca359b Binary files /dev/null and b/Game/Bullets/RopeBoltLaunchMany.png differ diff --git a/Game/Bullets/RopeBoltLaunchManyHit.png b/Game/Bullets/RopeBoltLaunchManyHit.png new file mode 100644 index 000000000..cd5fbc777 Binary files /dev/null and b/Game/Bullets/RopeBoltLaunchManyHit.png differ diff --git a/Game/Bullets/RopeBoltLaunchSingle.png b/Game/Bullets/RopeBoltLaunchSingle.png new file mode 100644 index 000000000..13edf4fb2 Binary files /dev/null and b/Game/Bullets/RopeBoltLaunchSingle.png differ diff --git a/Game/Bullets/RopeBoltLaunchSingleHit.png b/Game/Bullets/RopeBoltLaunchSingleHit.png new file mode 100644 index 000000000..13edf4fb2 Binary files /dev/null and b/Game/Bullets/RopeBoltLaunchSingleHit.png differ diff --git a/Game/Bullets/RopeRuneStrike.png b/Game/Bullets/RopeRuneStrike.png new file mode 100644 index 000000000..aea54360c Binary files /dev/null and b/Game/Bullets/RopeRuneStrike.png differ diff --git a/Game/Bullets/RopeRuneStrikeHit.png b/Game/Bullets/RopeRuneStrikeHit.png new file mode 100644 index 000000000..f6882e1c4 Binary files /dev/null and b/Game/Bullets/RopeRuneStrikeHit.png differ diff --git a/Game/Bullets/RubberBulletsHit.png b/Game/Bullets/RubberBulletsHit.png index d8798b19b..3df99eb96 100644 Binary files a/Game/Bullets/RubberBulletsHit.png and b/Game/Bullets/RubberBulletsHit.png differ diff --git a/Game/Bullets/RubberSniper.png b/Game/Bullets/RubberSniper.png new file mode 100644 index 000000000..22429c554 Binary files /dev/null and b/Game/Bullets/RubberSniper.png differ diff --git a/Game/Bullets/RubberSniperHit.png b/Game/Bullets/RubberSniperHit.png new file mode 100644 index 000000000..7e00522bf Binary files /dev/null and b/Game/Bullets/RubberSniperHit.png differ diff --git a/Game/Bullets/RuneTrap_Belt.png b/Game/Bullets/RuneTrap_Belt.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_Belt.png differ diff --git a/Game/Bullets/RuneTrap_BeltHit.png b/Game/Bullets/RuneTrap_BeltHit.png new file mode 100644 index 000000000..d4b371c13 Binary files /dev/null and b/Game/Bullets/RuneTrap_BeltHit.png differ diff --git a/Game/Bullets/RuneTrap_Bubble.png b/Game/Bullets/RuneTrap_Bubble.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_Bubble.png differ diff --git a/Game/Bullets/RuneTrap_BubbleHit.png b/Game/Bullets/RuneTrap_BubbleHit.png new file mode 100644 index 000000000..d016b327a Binary files /dev/null and b/Game/Bullets/RuneTrap_BubbleHit.png differ diff --git a/Game/Bullets/RuneTrap_Chain.png b/Game/Bullets/RuneTrap_Chain.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_Chain.png differ diff --git a/Game/Bullets/RuneTrap_ChainHit.png b/Game/Bullets/RuneTrap_ChainHit.png new file mode 100644 index 000000000..757e970ec Binary files /dev/null and b/Game/Bullets/RuneTrap_ChainHit.png differ diff --git a/Game/Bullets/RuneTrap_Latex.png b/Game/Bullets/RuneTrap_Latex.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_Latex.png differ diff --git a/Game/Bullets/RuneTrap_LatexBall.png b/Game/Bullets/RuneTrap_LatexBall.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_LatexBall.png differ diff --git a/Game/Bullets/RuneTrap_LatexBallHit.png b/Game/Bullets/RuneTrap_LatexBallHit.png new file mode 100644 index 000000000..96d4202ac Binary files /dev/null and b/Game/Bullets/RuneTrap_LatexBallHit.png differ diff --git a/Game/Bullets/RuneTrap_LatexHit.png b/Game/Bullets/RuneTrap_LatexHit.png new file mode 100644 index 000000000..90ad52b06 Binary files /dev/null and b/Game/Bullets/RuneTrap_LatexHit.png differ diff --git a/Game/Bullets/RuneTrap_LatexSphere.png b/Game/Bullets/RuneTrap_LatexSphere.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_LatexSphere.png differ diff --git a/Game/Bullets/RuneTrap_LatexSphereHit.png b/Game/Bullets/RuneTrap_LatexSphereHit.png new file mode 100644 index 000000000..96d4202ac Binary files /dev/null and b/Game/Bullets/RuneTrap_LatexSphereHit.png differ diff --git a/Game/Bullets/RuneTrap_Leather.png b/Game/Bullets/RuneTrap_Leather.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_Leather.png differ diff --git a/Game/Bullets/RuneTrap_LeatherHit.png b/Game/Bullets/RuneTrap_LeatherHit.png new file mode 100644 index 000000000..822a56e0d Binary files /dev/null and b/Game/Bullets/RuneTrap_LeatherHit.png differ diff --git a/Game/Bullets/RuneTrap_Ribbon.png b/Game/Bullets/RuneTrap_Ribbon.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_Ribbon.png differ diff --git a/Game/Bullets/RuneTrap_RibbonHit.png b/Game/Bullets/RuneTrap_RibbonHit.png new file mode 100644 index 000000000..5f3d129ce Binary files /dev/null and b/Game/Bullets/RuneTrap_RibbonHit.png differ diff --git a/Game/Bullets/RuneTrap_Rope.png b/Game/Bullets/RuneTrap_Rope.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_Rope.png differ diff --git a/Game/Bullets/RuneTrap_RopeHit.png b/Game/Bullets/RuneTrap_RopeHit.png new file mode 100644 index 000000000..f6882e1c4 Binary files /dev/null and b/Game/Bullets/RuneTrap_RopeHit.png differ diff --git a/Game/Bullets/RuneTrap_Rubber.png b/Game/Bullets/RuneTrap_Rubber.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_Rubber.png differ diff --git a/Game/Bullets/RuneTrap_RubberHit.png b/Game/Bullets/RuneTrap_RubberHit.png new file mode 100644 index 000000000..0e3b98e16 Binary files /dev/null and b/Game/Bullets/RuneTrap_RubberHit.png differ diff --git a/Game/Bullets/RuneTrap_Slime.png b/Game/Bullets/RuneTrap_Slime.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_Slime.png differ diff --git a/Game/Bullets/RuneTrap_SlimeBubble.png b/Game/Bullets/RuneTrap_SlimeBubble.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_SlimeBubble.png differ diff --git a/Game/Bullets/RuneTrap_SlimeBubbleHit.png b/Game/Bullets/RuneTrap_SlimeBubbleHit.png new file mode 100644 index 000000000..7c6864139 Binary files /dev/null and b/Game/Bullets/RuneTrap_SlimeBubbleHit.png differ diff --git a/Game/Bullets/RuneTrap_SlimeHit.png b/Game/Bullets/RuneTrap_SlimeHit.png new file mode 100644 index 000000000..5c55b4090 Binary files /dev/null and b/Game/Bullets/RuneTrap_SlimeHit.png differ diff --git a/Game/Bullets/RuneTrap_VacCube.png b/Game/Bullets/RuneTrap_VacCube.png new file mode 100644 index 000000000..31d958da1 Binary files /dev/null and b/Game/Bullets/RuneTrap_VacCube.png differ diff --git a/Game/Bullets/RuneTrap_VacCubeHit.png b/Game/Bullets/RuneTrap_VacCubeHit.png new file mode 100644 index 000000000..96f32b714 Binary files /dev/null and b/Game/Bullets/RuneTrap_VacCubeHit.png differ diff --git a/Game/Bullets/RuneTrap_Vine.png b/Game/Bullets/RuneTrap_Vine.png new file mode 100644 index 000000000..c2cd216a5 Binary files /dev/null and b/Game/Bullets/RuneTrap_Vine.png differ diff --git a/Game/Bullets/RuneTrap_VineHit.png b/Game/Bullets/RuneTrap_VineHit.png new file mode 100644 index 000000000..4eba2e88f Binary files /dev/null and b/Game/Bullets/RuneTrap_VineHit.png differ diff --git a/Game/Bullets/SagittaBolt.png b/Game/Bullets/SagittaBolt.png new file mode 100644 index 000000000..bf33f5e60 Binary files /dev/null and b/Game/Bullets/SagittaBolt.png differ diff --git a/Game/Bullets/SagittaBoltHit.png b/Game/Bullets/SagittaBoltHit.png new file mode 100644 index 000000000..9c9a21e02 Binary files /dev/null and b/Game/Bullets/SagittaBoltHit.png differ diff --git a/Game/Bullets/SagittaHit.png b/Game/Bullets/SagittaHit.png new file mode 100644 index 000000000..d02fb12fb Binary files /dev/null and b/Game/Bullets/SagittaHit.png differ diff --git a/Game/Bullets/SealingBolt.png b/Game/Bullets/SealingBolt.png new file mode 100644 index 000000000..85a9268c5 Binary files /dev/null and b/Game/Bullets/SealingBolt.png differ diff --git a/Game/Bullets/SealingBoltHit.png b/Game/Bullets/SealingBoltHit.png new file mode 100644 index 000000000..d68e65e4b Binary files /dev/null and b/Game/Bullets/SealingBoltHit.png differ diff --git a/Game/Bullets/ShadowBubble.png b/Game/Bullets/ShadowBubble.png new file mode 100644 index 000000000..4bd20f1c7 Binary files /dev/null and b/Game/Bullets/ShadowBubble.png differ diff --git a/Game/Bullets/ShadowBubbleHit.png b/Game/Bullets/ShadowBubbleHit.png new file mode 100644 index 000000000..cbbae775e Binary files /dev/null and b/Game/Bullets/ShadowBubbleHit.png differ diff --git a/Game/Bullets/ShadowDance.png b/Game/Bullets/ShadowDance.png new file mode 100644 index 000000000..4ffe93a7b Binary files /dev/null and b/Game/Bullets/ShadowDance.png differ diff --git a/Game/Bullets/ShadowDanceHit.png b/Game/Bullets/ShadowDanceHit.png new file mode 100644 index 000000000..4eb186930 Binary files /dev/null and b/Game/Bullets/ShadowDanceHit.png differ diff --git a/Game/Bullets/ShadowGrasp.png b/Game/Bullets/ShadowGrasp.png new file mode 100644 index 000000000..bc5cd661e Binary files /dev/null and b/Game/Bullets/ShadowGrasp.png differ diff --git a/Game/Bullets/ShadowGraspHit.png b/Game/Bullets/ShadowGraspHit.png new file mode 100644 index 000000000..c2b3d4034 Binary files /dev/null and b/Game/Bullets/ShadowGraspHit.png differ diff --git a/Game/Bullets/ShadowGraspMulti.png b/Game/Bullets/ShadowGraspMulti.png new file mode 100644 index 000000000..a632e56b8 Binary files /dev/null and b/Game/Bullets/ShadowGraspMulti.png differ diff --git a/Game/Bullets/ShadowGraspMultiHit.png b/Game/Bullets/ShadowGraspMultiHit.png new file mode 100644 index 000000000..af58e8aa6 Binary files /dev/null and b/Game/Bullets/ShadowGraspMultiHit.png differ diff --git a/Game/Bullets/ShadowShroud.png b/Game/Bullets/ShadowShroud.png new file mode 100644 index 000000000..c36ee3a46 Binary files /dev/null and b/Game/Bullets/ShadowShroud.png differ diff --git a/Game/Bullets/ShadowShroudGirl.png b/Game/Bullets/ShadowShroudGirl.png new file mode 100644 index 000000000..d3f80179a Binary files /dev/null and b/Game/Bullets/ShadowShroudGirl.png differ diff --git a/Game/Bullets/ShadowShroudGirlHit.png b/Game/Bullets/ShadowShroudGirlHit.png new file mode 100644 index 000000000..1c5e12121 Binary files /dev/null and b/Game/Bullets/ShadowShroudGirlHit.png differ diff --git a/Game/Bullets/ShadowShroudHit.png b/Game/Bullets/ShadowShroudHit.png new file mode 100644 index 000000000..79add7c33 Binary files /dev/null and b/Game/Bullets/ShadowShroudHit.png differ diff --git a/Game/Bullets/ShadowSlashHit.png b/Game/Bullets/ShadowSlashHit.png index 8ddc2ecdc..d2026e807 100644 Binary files a/Game/Bullets/ShadowSlashHit.png and b/Game/Bullets/ShadowSlashHit.png differ diff --git a/Game/Bullets/SleepGas.png b/Game/Bullets/SleepGas.png index 0ff32e3df..951ccb042 100644 Binary files a/Game/Bullets/SleepGas.png and b/Game/Bullets/SleepGas.png differ diff --git a/Game/Bullets/SleepGasHit.png b/Game/Bullets/SleepGasHit.png index aec69a4b3..5a2b21d21 100644 Binary files a/Game/Bullets/SleepGasHit.png and b/Game/Bullets/SleepGasHit.png differ diff --git a/Game/Bullets/SmokeBomb.png b/Game/Bullets/SmokeBomb.png new file mode 100644 index 000000000..b2ffb45a1 Binary files /dev/null and b/Game/Bullets/SmokeBomb.png differ diff --git a/Game/Bullets/SmokeBombHit.png b/Game/Bullets/SmokeBombHit.png new file mode 100644 index 000000000..aec69a4b3 Binary files /dev/null and b/Game/Bullets/SmokeBombHit.png differ diff --git a/Game/Bullets/SoulCrystalBind_2.png b/Game/Bullets/SoulCrystalBind_2.png new file mode 100644 index 000000000..282016c50 Binary files /dev/null and b/Game/Bullets/SoulCrystalBind_2.png differ diff --git a/Game/Bullets/SpikeTrap.png b/Game/Bullets/SpikeTrap.png new file mode 100644 index 000000000..c464c62a0 Binary files /dev/null and b/Game/Bullets/SpikeTrap.png differ diff --git a/Game/Bullets/SpikeTrapHit.png b/Game/Bullets/SpikeTrapHit.png new file mode 100644 index 000000000..df987a7ae Binary files /dev/null and b/Game/Bullets/SpikeTrapHit.png differ diff --git a/Game/Bullets/SummonAMGag.png b/Game/Bullets/SummonAMGag.png new file mode 100644 index 000000000..ded797819 Binary files /dev/null and b/Game/Bullets/SummonAMGag.png differ diff --git a/Game/Bullets/SummonAMGagHit.png b/Game/Bullets/SummonAMGagHit.png new file mode 100644 index 000000000..762c2ca43 Binary files /dev/null and b/Game/Bullets/SummonAMGagHit.png differ diff --git a/Game/Bullets/SummonLatexArmbinder.png b/Game/Bullets/SummonLatexArmbinder.png new file mode 100644 index 000000000..c22ecb9d7 Binary files /dev/null and b/Game/Bullets/SummonLatexArmbinder.png differ diff --git a/Game/Bullets/SummonLatexArmbinderHit.png b/Game/Bullets/SummonLatexArmbinderHit.png new file mode 100644 index 000000000..762c2ca43 Binary files /dev/null and b/Game/Bullets/SummonLatexArmbinderHit.png differ diff --git a/Game/Bullets/SummonLatexGag.png b/Game/Bullets/SummonLatexGag.png new file mode 100644 index 000000000..79ffdafd6 Binary files /dev/null and b/Game/Bullets/SummonLatexGag.png differ diff --git a/Game/Bullets/SummonLatexGagHit.png b/Game/Bullets/SummonLatexGagHit.png new file mode 100644 index 000000000..762c2ca43 Binary files /dev/null and b/Game/Bullets/SummonLatexGagHit.png differ diff --git a/Game/Bullets/SummonLatexLegbinder.png b/Game/Bullets/SummonLatexLegbinder.png new file mode 100644 index 000000000..f6a387868 Binary files /dev/null and b/Game/Bullets/SummonLatexLegbinder.png differ diff --git a/Game/Bullets/SummonLatexLegbinderHit.png b/Game/Bullets/SummonLatexLegbinderHit.png new file mode 100644 index 000000000..762c2ca43 Binary files /dev/null and b/Game/Bullets/SummonLatexLegbinderHit.png differ diff --git a/Game/Bullets/Taunt.png b/Game/Bullets/Taunt.png new file mode 100644 index 000000000..1494c4e0c Binary files /dev/null and b/Game/Bullets/Taunt.png differ diff --git a/Game/Bullets/TauntHit.png b/Game/Bullets/TauntHit.png new file mode 100644 index 000000000..cce2a17a6 Binary files /dev/null and b/Game/Bullets/TauntHit.png differ diff --git a/Game/Bullets/TomeArcaneHit.png b/Game/Bullets/TomeArcaneHit.png new file mode 100644 index 000000000..7b59fb1b5 Binary files /dev/null and b/Game/Bullets/TomeArcaneHit.png differ diff --git a/Game/Bullets/TomeBondageHit.png b/Game/Bullets/TomeBondageHit.png new file mode 100644 index 000000000..5f2e182f2 Binary files /dev/null and b/Game/Bullets/TomeBondageHit.png differ diff --git a/Game/Bullets/TrapCrystal.png b/Game/Bullets/TrapCrystal.png new file mode 100644 index 000000000..58f6be99b Binary files /dev/null and b/Game/Bullets/TrapCrystal.png differ diff --git a/Game/Bullets/TrapCrystalHit.png b/Game/Bullets/TrapCrystalHit.png new file mode 100644 index 000000000..bc385ecd0 Binary files /dev/null and b/Game/Bullets/TrapCrystalHit.png differ diff --git a/Game/Bullets/TrapLatex.png b/Game/Bullets/TrapLatex.png new file mode 100644 index 000000000..b46fb35c1 Binary files /dev/null and b/Game/Bullets/TrapLatex.png differ diff --git a/Game/Bullets/TrapLatexBall.png b/Game/Bullets/TrapLatexBall.png new file mode 100644 index 000000000..47d06da52 Binary files /dev/null and b/Game/Bullets/TrapLatexBall.png differ diff --git a/Game/Bullets/TrapLatexBallHit.png b/Game/Bullets/TrapLatexBallHit.png new file mode 100644 index 000000000..9e98e50d0 Binary files /dev/null and b/Game/Bullets/TrapLatexBallHit.png differ diff --git a/Game/Bullets/TrapLatexBubble.png b/Game/Bullets/TrapLatexBubble.png new file mode 100644 index 000000000..dcf0bf7a8 Binary files /dev/null and b/Game/Bullets/TrapLatexBubble.png differ diff --git a/Game/Bullets/TrapLatexBubbleHit.png b/Game/Bullets/TrapLatexBubbleHit.png new file mode 100644 index 000000000..9e98e50d0 Binary files /dev/null and b/Game/Bullets/TrapLatexBubbleHit.png differ diff --git a/Game/Bullets/TrapLatexHit.png b/Game/Bullets/TrapLatexHit.png new file mode 100644 index 000000000..b8f459b5b Binary files /dev/null and b/Game/Bullets/TrapLatexHit.png differ diff --git a/Game/Bullets/SoulCrystalBindHit.png b/Game/Bullets/TrapObsidian.png similarity index 100% rename from Game/Bullets/SoulCrystalBindHit.png rename to Game/Bullets/TrapObsidian.png diff --git a/Game/Bullets/TrapObsidianHit.png b/Game/Bullets/TrapObsidianHit.png new file mode 100644 index 000000000..f9d17f172 Binary files /dev/null and b/Game/Bullets/TrapObsidianHit.png differ diff --git a/Game/Bullets/TrapShadowLatex.png b/Game/Bullets/TrapShadowLatex.png new file mode 100644 index 000000000..eabd343fc Binary files /dev/null and b/Game/Bullets/TrapShadowLatex.png differ diff --git a/Game/Bullets/TrapShadowLatexHit.png b/Game/Bullets/TrapShadowLatexHit.png new file mode 100644 index 000000000..474fb9868 Binary files /dev/null and b/Game/Bullets/TrapShadowLatexHit.png differ diff --git a/Game/Bullets/VineSlimeBall.png b/Game/Bullets/VineSlimeBall.png new file mode 100644 index 000000000..2a2792b63 Binary files /dev/null and b/Game/Bullets/VineSlimeBall.png differ diff --git a/Game/Bullets/VineSlimeBallHit.png b/Game/Bullets/VineSlimeBallHit.png new file mode 100644 index 000000000..c01cdf8da Binary files /dev/null and b/Game/Bullets/VineSlimeBallHit.png differ diff --git a/Game/Bullets/Vineexp.png b/Game/Bullets/Vineexp.png new file mode 100644 index 000000000..0067cc9da Binary files /dev/null and b/Game/Bullets/Vineexp.png differ diff --git a/Game/Bullets/VineexpHit.png b/Game/Bullets/VineexpHit.png new file mode 100644 index 000000000..c3eeaac02 Binary files /dev/null and b/Game/Bullets/VineexpHit.png differ diff --git a/Game/Bullets/WardenCageDrop.png b/Game/Bullets/WardenCageDrop.png new file mode 100644 index 000000000..7361f671a Binary files /dev/null and b/Game/Bullets/WardenCageDrop.png differ diff --git a/Game/Bullets/WardenCageDropHit.png b/Game/Bullets/WardenCageDropHit.png new file mode 100644 index 000000000..e433de9cd Binary files /dev/null and b/Game/Bullets/WardenCageDropHit.png differ diff --git a/Game/Bullets/WitchElectrify.png b/Game/Bullets/WitchElectrify.png index 7780e3fb1..2150e7c31 100644 Binary files a/Game/Bullets/WitchElectrify.png and b/Game/Bullets/WitchElectrify.png differ diff --git a/Game/Bullets/ZoneOfFrost.png b/Game/Bullets/ZoneOfFrost.png new file mode 100644 index 000000000..403460572 Binary files /dev/null and b/Game/Bullets/ZoneOfFrost.png differ diff --git a/Game/Bullets/ZoneOfFrostHit.png b/Game/Bullets/ZoneOfFrostHit.png new file mode 100644 index 000000000..5fcdc3d9a Binary files /dev/null and b/Game/Bullets/ZoneOfFrostHit.png differ diff --git a/Game/Changelog.txt b/Game/Changelog.txt index 4edc5faa3..c3df68965 100644 --- a/Game/Changelog.txt +++ b/Game/Changelog.txt @@ -1,7 +1,1709 @@ +CURRENT CHANGELOGS + +Vague todo: +- Automatic settings disable for potato PCs +- 'Sword of Many' hands free weapon +- 'Lesser Pants' shorts item +- TODO add scroll to log, rep + +TODO add sugar magic ('Blood Energy Magic') +TODO make hostile faction enemies able to not attack the player if their opinion is high + +- Goals: +Spellcaster witch that channels a defensive ward, rapidly gives shield to nearby allies +Monk class? +- Passive: enchantments apply to unarmed strikes +- Active: Increase unarmed base damage for 20 turns. After using, need to meditate 10 turns to recharge. Free. + + - TODO add mimic curse + - TODO add lairs + - TODO add chains + - TODO display stand turret + - TODO added personalized dragon caves + - TODO dragon arena floor 20 + + +TODO: +- High alchemist and solvent +- Let go of leash thru menu +- Aggro level + +TODO remove hogtie when released +TODO Add Cuddle play type + +- TODO extend modding framework for witnessing components to include: +- Mana cost of spells +- decay per faction + +Note to Modders: if your mod alters the function KDFreeNPC you will have to reimplement some new functionality added, to avoid bugs! + +TODO add ability to recolor own restraints via palette + +5.4.40 +- New hairstyles: "FrontSwept" "CurlyPonytail", "BigBraidBack", "Vents", "BackShort", "FrontStraight2", "BackHime", "Bob", "BackFlat", "TwinDrills" +- Added RoundHat +- Added FrillyHeadband and BowHeadband +- Added TopHatSmall +- Added functionality from Ilyasnow's Wardrobe Tools mod +- Reorganized hairs +- Added 'Currently Worn' category in wardrobe + +5.4.39 +- New Experimental Rendering (unsstable) option +- Added kitty pet leotard +- Added kitty pet uniform collar +- Added kitty pet tail +- Added kitty pet paws, gloves, and socks +- Added kitty pet headgear and gag (fashion only atm) +- Hopefully increased variety in restraint types (armbinder, boxbinder, jacket) in jail +- Optimized RAM usage for displacement maps (hopefully). + +TODO +- Middle mouse button to toggle sprint option +- middle mouse to toggle passthrough? +- middle mouse to interact +- middle mouse to shoot +- middle mouse to truss +- middle mouse to cast spell 0/9 +- mouse shortcut menu? +- pinch self +- banish horny thoughts +- tabs for playself +- Glow around layer affected by current expert tools selection + +5.4.38 +- Additional optimizations to rendering +- hopefully fixed a memory leak + +5.4.37 +- Added shibari cursed armor -- adds cosmetic rope when worn, mostly torso chest armor atm +- Added skimpy cursed armor -- turns into a skimpier version, mostly just chain skirt atm +- Fixed some bugs + +5.4.36 +- Damaging enemies will now slow their struggling temporarily. +- Damaging enemy shield will pause its regen for 3 turns + +5.4.35 +- Some delayed actions like putting on armor can now be interrupted by clicking +- Cursed armors are now Mimics +- >they will turn into a restraint if given the chance, while cursed +- >You have 10 turns before they can transform +- Putting restraints or armor on can now be interrupted by being attacked +- Putting on restraints or armor to yourself takes longer while bound +- Fixed bug involving item duplication (e.g. when ancient ankle cuffs detach/attach) +- Fixed ancient heels not providing slow reduction always + +5.4.34 +- Had to make some tweaks to the military uniform, sorry for inconvenience +- Added some additional music for the bosses + +5.4.33 +- Added military uniform +- Added pointy antennae, ahoge, horns, and tail +- Added wolfears2 +- Added mascara, scar +- various bugfixes + +5.4.32 +- Add fangmouth, fangmouth_double, and fanglessmouth version +- Added fang overbite for ball gags +- New character option: Use palette regardless of outfit +- New inventory action for restraints: set palette +- Added option in wardrobe to render with/without armor +- Added more expressions for prisoners in the collection +- Fixed some bugs with armor pieces hidden by dynamic armor rules still overriding shoes and boots underneath. + +5.4.31 +- Just bugfixes + +5.4.30 +- Fixed crash when an enemy should be deleted but the game tries to place them somewhere when they despawn +- Fixed bug where shrines still remove favorite restraints +- Reduced the number of unique faction prisons when starting with a bunch of bondage start scenarios + +5.4.29 +- Strip search now triggers when thrown in jail on regular floors +- Many bug fixes +- Added wandering maid knight & squire +- added the Sweeper and the Persuader +- maid knights rescue each other if they defeat you +- added rename NPC +- Added santa hat, festive harness fashion restraint + +5.4.28 +- Fixed a few bugs +- Added strip search dialogue + +5.4.27 +- Interacting now turns to face if it doesnt interact with anything, or if a turn passed when you interacted +- Prisoners that spawn in levels now come with restraints! +- Added rare Latex Doll Stand item + +5.4.26 +- Added new map escape objectives: Nevermere servers, Dollsmith/Ancient Robot server drones, Draconic Seals +- Pickaxe now can be used quickly by clicking on the wall (thanks Enraa) +- New perk: Unidentified Wear (thanks Enraa!) +- Did some optimizations to help performance. Please report any issues specifically with buffs not having an effect (on player or enemy). + +5.4.25 +- Added 'furniture' zones for the player and dragon prisoners in the dragon lairs +- Reduced perk point multiplier to 2x + +5.4.24 +- Made minimap more readable and added toggleable filters +- Fix viewing future journey +- Fixed cursed plugs being removable through belts +- Fixed high guilt causing negative security gain when chased +- Fixed too long autosave interval +- Added compat to help old saves not be broken by new journey organization +- Fix issues with minimap labels + +5.4.23 +- Added minimap labels (option in UI) +- Minimap moves with inspection +- Allow viewing journey map in journal + +5.4.22 +- Various bugfixes +- Added modding framework for enemies witnessing spell components and applying prison restraints accordingly + +5.4.21 +- Dragon lairs are here +- When created in map gen, dragons create a lair. +- Dragons will wander on the map, but go back to check their lairs periodically +- "Elemental Energy" mapmod replaced with "Dragon Sighting" +- Perk point costs multiplied by 5 for readability +- Rebalanced many perk costs in general +- Removed Unfocused perk, added Focused Strikes and Focused Power +- Being distracted now decreases accuracy of most weapons +- Being distracted now raises the stamina cost of staves +- Fix bug with retro animations hiding most effect tiles + +5.4.20 +- Various quality of life changes + +5.4.19 +- Fixed prison wandering behavior from guards in highsec +- New enemy: Witch's Apprentice + +5.4.18 +- Changed persistent NPC wandering to support different NPC AI wandering types with different priorities/interests +- Early elevator halls may have dragon girls instead of dragons + +5.4.17 +- More immersive experience being brought to jail +- Capture option from menu now places in highsec jail if being dragged there +- Enemies leashing the player to highsec jail should directly leash to highsec instead of always stopping by furniture + +5.4.16 +- Bugfixes due to issues in 5.4.15 +- Unstoppable foes can now be moved on conveyors if disabled. Unflinching can if slowed. + +5.4.15 +- Enemies helping each other fixed +- Enemies will now pull each other off of latex pools and other dangerous terrain +- Enemies will now transfer from cage to cell in highsec jail +- Fixed jail doors not getting locked properly (or more accurately, lock info being lost forever) +- HighSecJail now puts you in a cage to set your uniform +- Fixed bug where enemies wouldnt spawn in high sec jail when the enemies arent aware of you + + +5.4.14 +- Highsec prisons are now persistent +- Shrines dont remove favorited restraints +- Crystal shockwaves from heirophant allies should no longer hit the player +- Fixed issues where party members didnt get properly spawned on the map to rescue + +5.4.13 +- Added Essence Necklace +- Made yokes and fiddles more common in the enchanted restraints loot table +- Added Mana Burst back as an upgrade + +5.4.12 +- Replaced Trainee's Mana Burst with Essence Motes (active spell) +- Reworked Trainee's Desire Burst to use motes +- New Trainee spells: Conjure Essence Mote, Shock Collar, Psychic Link +- Removed Mental Fortitude for now + +5.4.11 +- Reworked Mental Fortitude. Added Mental Defiance +- Changed all "ChangeX" stat change functions to have an src field +- Added mod compat setting for above, changed names of functions + +5.4.10 +- Defeating enemies now restores WP +- Vengeance now gives 10% of the DP from before +- Limit surge is now 40 WP instead of 50 + + +5.4.9 +- Added wait speed options +- Made settings for toggles appear after hovering over the buttons for a bit +- Mental Resistance now always works if you are shielded +- Removed Second Wind from the perk selection +- New Trainee upgrade: "Mental Fortitude: While WP >75%, regenerate to full" + + +5.4.7 & 5.4.8 +- Lots of small bugfixes + +5.4.6 +- Clear restraints from outfit when loading into wardrobe from title screen +- Fix save game code missing in non roguelike mode +- Changed layer of pantyhose to go under socks/stockings + +5.4.5 +- Show owned items in NPC shop interface +- Add option to untie NPC + +5.4.4 +- Universal solvent now rescues Encased Adventurers (if you choose to use it for such) +- Universal solvent now removes encased debuffs from NPCs and grants glue resist to NPC/player for 30 turns +- Being hit by an Observer's beam now attracts the Shadow to your position +- The shadow now properly applies a cursed item when she catches you +- Calling a guard should now pick an eligible character on the map instead of spawning one +- Enchant Rope now affects NPC restraints properly +- Fixed a bug where entities other than player would benefit from rogue super crit/surprise bondage +- fixed missing nurse bound sprite +- Can no longer backtrack in boss rooms until you defeat the boss / are defeated + +5.4.3 +- No longer need to pass room escape method to backtrack +- dragon girls and dragon queens can no longer spawn as bounties for the Bounty escape method + +5.4.2 +- Added 'spike' trap + +5.3.50 +- More sound effects +- Giving Good Girl Gifts to NPCs will now temporarily increase their submissiveness +- Field of Frost has been split into progressively bigger upcasts. + +5.3.49 +- Cursed item offer from enemies now includes a real curse +- Added more enemy journal entries +- Fixed the names of many spells not being defined + +5.3.48 +- MODDERS: Added "OverCorset", "UpperArmStrapsBack", TightSleeveLeft/Right, and "Apron" layer +- Added heavy maid knight uniform + +5.3.47 +- Several weapons now have a special property dealing 50% additional damage when stamina is over 50%: +- Hammer (and variants) +- Axe (and variants) +- Rock +- Fixed an issue where leashed NPCs didnt follow player properly thru stairs +- Battle Rhythm now uses the higher of original stamina cost or effective stamina cost +- New weapon: Sledgehammer +- Telekinesis must now go in the hotbar to be used, but can be toggled + +5.3.46 +- Require being in summit to deposit restraints to summit warden +- Fix misleading message when NPCs try to escape even if they made no progress +- Show sprint cost when sprint icon shows on map +- Sprint cost now 20 base, 25 heeled, 15 hop, 20 hop (slowed), 25 hop (super slowed). Overall buff while bound, nerf while free +- Added quick facility assigning + +5.3.45 +- Summit warden now knows how to use generic bondage like rope +- Add button to toggle big render of collection character +- Small bugfixes + +5.3.44 +- Added Warden facility +- Added chest container system +- Regular chests will now have some lesser items in them +- Fix bug where command spells (for controlling allies) would not deselect properly +- Fix bug where truss em up sometimes wont work even with Reaching Authority +- Fix bug where cuddle loungegoers would cluster around and gawk at a single cuddlee +- Fix bug where cuddle loungegoers would take cuddlees out of the cuddle lounge + +5.3.43 +- Fix offhand bug +- Fix instand trap explosions bug +- Enemies can fire spells on you (innacurately) while blind +- Conjured restraints cannot be tightened +- Fix a crash when picking a lock on a map object +- Fix CMD: Lock not being a command spell and Remove Slime being one +- Fix enemies helping each other out of bondage + +5.3.42 +- MODDERS: KinkyDungeonRedKeys, BlueKeys, and Lockpicks are now inventory items instead of hardcoded variables! +- Spells now apply bindings to enemies! +- Bindings will be conjured, so you cannot spam them to pick them up +- Also applies to handheld weapons like ropes. +- New spell: Conjure Anti-Magic gag +- Revised enemy struggle function to help normalize the amount of time it takes to escape +- Can now equip offhand weapons without clicking the icon on the hotbar +- Enemies can now use items they struggled out of in order to tie YOU + +5.3.41 +- Fix bug where runes hit twice +- Fix bug where magic keys are consumed even if unlocked by different means + +5.3.40 +- Added in a LOT of new patron NPCs, thank you for your support +- Added toggle for Game sound now off when minimized +- Chased restraint value formula so that restraints aren't as valuable early on, but reduced the decay +- Added tooltips to the collection binding bars +- Attempted to fix issue where cosplay items persist between outfits +- Fixed some pathing issues in crowded hallways + +5.3.39 +- Fix issue with trail warnings disappearing one turn before they are supposed to +- Fixed heavy wep + kinetic mastery issue +- Fixed issue w/ mana regen +- Fixed inner power + kinetic slash + flame blade issue + +5.3.38-RC10 +- Fixed some bugs with bosses doing dialogue while part of the player faction +- Living collars can now be disenchanted to delay their effects. + +5.3.38-RC9 +- MODDERS: Added mod.json format, see https://itch.io/t/4135169/mod-json + +5.3.38-RC8 +- Fixed issue where some battle rhythm effects were applying twice +- Fixed issue where 1st floor was getting regenerated +- Code refactoring + +5.3.38-RC7 +- Fixed issues where NPCs would hug the corner of the map after losing sight of you +- High value enemies will now use their missiles in combat (watch out for friendly fire) + +5.3.38-RC6 +- Fix some issues with runes (aoe, cast time) +- New Expert Tool tag: Protected. Put 1 here to make the layer protected. +If a model has any protected layers then it will be treated like ears, etc. +Converse: if you set it to -1 then it will make a protected model no longer protected. +1 overrides -1. + +5.3.38-RC5 +- fixed monster rope hogtie crash +- enemies can now path thru barricades and destructible doors +- allow placing prisoners in doll stands (both collection and leashed) + +5.3.38-RC4 +- Fixed bug where the light maid knight socks had unintended holes and the toes would stick out +- Fixed bug where the leather mask would cause a bald patch when using x rays + +5.3.38-RC3 +- Monster rope should now add hogtie properly (only applies to new monster ropes generated) +- Fixed some bugs involving leashing and hostility +- Fixed critical bug with enchanted items disappearing when dropped by enemy attack!!! + +5.3.38-RC2 +- Made dirt piles and giant mushrooms not block leashing NPCs +- Added gag necklace + +5.3.38-RC1 +- Updated version number +- Merged a great huge typescript refactor by ewhac. Several longstanding bugs got caught and fixed as a result +- Allow linking armor under accessible restraints + +5.4-nightly8 +- Added modding parameter to allow custom msg for equipping and successfully removing restraints +- fixed bug where assigning outfit to hotbar disappears the slot +- fixed missing assets in coastal tileset +- Increased arcane tome damage and clarified that they're not supposed to crit +- Removed arcane crystal from wizard start, has arcane tome instead +- added arcane crystal to wizard study chest, shadow chest, and wall loot in library + +5.4-nightly7b +- Updated version number +- Clarified cuddle lounge mechanics +- b version: fixed a crash and a visual bug, hopefully + +5.4-nightly6 +- Changed worldgen to make sizing a bit more reasonable +- Angel can help you with divine locks +- Added Crystal lock +- Added Ancient Worshippers +- Made the simple color picker more accurate + + +5.4-nightly5 +- Added directional wires (vertical, horizontal, endpoint) +- fixed bug w/ opinion not updating on cuddle lounge pets when you revisit summit +- fixed fighter break free ability +- Changed rune graphics to be more consistent with the game + +5.4-nightly4 +- Fix issue with Commerce Goddes Rewards Program™ portals spawning on non-empty tiles +- Fix issue with weird flashing dialogue options involving leashes +- Fix issue with both tool multiplier and buff multiplier applying to edge bonus (such as hook, etc) +- Fix issues with light maid knight socks poking through the bottom of shoes +- Fixed issue with summons being added to collection if you add them to party + +5.4-nightly3 +- Fixed an issue where Rogue's problem solving triggered twice +- Fixed (hopefully) an issue where audio crashed randomly +- Fixed an issue where enemies send repeated soundwaves +- Fixed an issue where dolls werent properly displaced when shoving the player into their space +- Fixed some Light Maid Knight clipping and missing textures +- Fixed some issues with struggle power calc + + +5.4-nightly2 +- !!!MODDERS - IMPORTANT!!! +- "kinkydungeonappearanceX" now contains an expanded object with metadata. Please update mods that handle the localstorage version of character +- CharacterAppearanceStringify now encodes metadata into the provided string +- CharacterAppearanceRestore can handle both old and new strigified characters +- You will need to update any code that directly references a string created by CharacterAppearanceStringify instead of using CharacterAppearanceRestore +- saveStat in the save files now has Palette field + +5.4-nightly2 +- Fixed bug where running out of WP didnt reduce struggle power +- Bed trap now has straps ^^ +- Cuddle lounge now improves servant opinions a lot more +- Cuddle lounge is less effective per prisoner the more prisoners in it + +5.4-nightly1 +- Added Absurdly Huge Maps perk +- Reworked the maze algorithm so it can now handle empty tiles generated +- Made cracks propagate into walls more +- Made the pickaxe able to break some blocks depending on geometry + +5.3.37 +- Brawler should no longer give you full accuracy while arm + legbindered, but should always give full unarmed damage +- Fixed a bug where keys vanish into oblivion +- Distracted allies should be a little less unreliable + +5.3.36 +- MODDERS: Replaced KinkyDungeonCheckClothesLoss with KDRedrawCharacter, a map. The old variable still works as a generic way to do it to 'whatever gets rendered next' +- Saves will now save your outfit as well, and restore it during saves. You can turn off both saving and loading of outfits +- Added multiple save slots and mod config by Enraa +- Added panties by Boxtie +- Added CyberPanties +- Added Gothic Skirt by Lumpychan +- Added Bra and PantiesHigh by Boxtie +- Added custom outfits for 3 of the custom patrons +- Added a sneaky dealer npc +- Made truss em up menu show different colors and helpful messages based on what the restraining conditions are +- Fixed bug where cyber restraints could sometimes be impossible to unlock even with a keycard +- Fixed bug where summit elevator could trap you in while still letting escapees out +- Fixed bug where active soul crystals could not be vaulted around even though the vault upgrade says you can +- Fixed issue where truss em up couldnt be opened even if you had quick-bind restraints that could be used with it. +- Hopefully fixed issue where your party members would turn on you due to other ally's AoE +- Fixed issue where caldera could have inaccessible regions and the player might even start in one + +5.3-Patch1 +- Added toggle to only bind self from quick inv (instead of targeting) + +5.3-RC10 +- You can now use quick inventory or hotbar to attempt to truss up targets + (or wear items by clicking yourself) +- New upgrade: Reaching Authority +- Added Spats and BrowsDai1 and 2 +- Releasing NPCs gives back items (so you dont have to free them manually first) +- Old guardians leashing you to highsec now take you to doll processing Instead +- Faction rep affects personal opinion less +- Attacking enemies now reduces their opinion of you (it's personal) +- Added the 'Robe of Chastity' in lesser gold chests +- Flanking enemies now makes them vulnerable (instead of stunned) +- Fixed a bug where removing one generic restraint item would remove all of them +- Fixed bug where traps would spawn in places there were not supposed to be any +- Fixed bug where the void would sometimes be an actual void and not a discount void (with demon squatters) +- Fixed bug where prisoners you reclaim would not actually be reclaimed but rather cast into the ether (and are inaccessible as prisoners) + + +5.3.35 RC8-RC9 +- Added filter field in collection +- Fixed a bug where sensory mask was being applied infinitely +- Autobind should now use raw materials as well for restraints +- Resolved a bug where the binding dress in recycler couldnt be made but still took resources +- Resolved a bug where enchanted armor got duplicated when it gets knocked off by enemies + +5.3.35 RC7 +- Fix sailor shirt exposing kneel pose midriff +- Fix crash when leaving summit sometimes +- Fix zooming not affecting many indicators +- Ancient chastity bra clarified to only reduce damage from attacks (current behavior, no change) +- Ancient chastity bra now blocks 20 damage up from 10 +- Fixed bug where you cant ransom most enemies +- Time Stop now allows you to tie up enemies more easily during its duration +- Time ghosts are slightly faster + + +5.3.35 RC6 +- Added toggle for front plugs. May cause balance issues. + +5.3.35 RC5 +- Misc fixes + +5.3.35 RC4 +- Misc graphical fixes + +5.3.35 RC3 +- Further filled out recycler tree + +5.3.35 RC2 +- Added vinyl tape and added tape/ribbon/mummy wrap to the Recycler + +5.3.35 RC1 +- Various misc bugfixes + +5.3.35 +- You can now disassemble rope items into raw rope +- You can now apply raw items to NPCs via truss em up + +5.3.34 +- Added sensory hood and sensory mask to leather prison and rare bondage offer +- Added zoom in/out key + +5.3.33 +- Increased rep gain from rescuing prisoners +- Added tall smooth heels by SMoonlightM +- Added leather hood/mask by SMoonlightM + +5.3.32 +- Added management facility. management servants will wander around and help you fight off escapees. +- Added quick facilities buttons + +5.3.31 +- You can use furniture to gain an advantage over enemies +- Added mod compatibility setting + +5.3.30 +- Added Combat Maneuvers (battle trance upgrade) +- Fixed issue where promoting and demoting NPCs in facility roles would break their role and make it impossible to change +- Fixed crash on hovering over non humanoids +- Fixed non humanoids having names (e.g a barricade named Maddie) +- Fixed helpless enemies blocking elevator from unlocking +- Fixed a crash when loading prisoners from memory +- Fixed fuuka not dropping her restraints on defeat +- Fixed bug where armor hides restraints underneath even if drawarmor is off + +5.3.29 +- Added training level indicator in buffs menu +- Added NPC images in dialogue, tooltip, and (toggleable in GFX settings) on the field + +5.3.28 +- MODDERS: KinkyDungeonHiddenFactions is now a Map() instead of a list +- Added 'Release NPCs' feature + +5.3.27 +- Added auto binding feature +- truss em up now uses bondage UI from collection +- Enemies can now escape! +- Cuddle lounge is now present for improving opinion +- truss em up is more effective now +- Enemy helpless threshold lowered for basic enemies (such as maidforce recruits) + + +5.3.26 +- Can now add NPCs to display stand +- Can now view party members in collection +- prototype persistent NPCs. lmk if there are weirdness with party members +- NPCs have facial expressions and their poses can be set individually (no persistence) + + +5.3.25 +- New perk: Fully Integrated (unlock by reaching 100% latex integration. Start with 100% latex integration) +- New consumable: Universal Solvent (Each use reduces latex integration by -25% and debuffs current latex restraint struggle/cut resistance by 10) +- Can generate random name on name screen +- Can set restraint palette +- Truss em Up now adds the restraint to the enemy's inventory so you can get it back on capture + +5.3.24 +- Added ability to restrain NPCs + +5.3.23 +- Recycler is now online in the summit! +- Interacting now picks up items on the targeted tile + +5.3.22 +- You can lock yourself inside of furniture +- Added some gag particles to player and enemy +- Added setting to allow dynamic armor item removal from outfits if you are missing armor (only works with plate armor) +- Added pose-specific layer properties (hide, require poses, and hide prefix/suffix) + +5.3.21 +- Upgraded the layering system to allow for even tighter item combinations (and getting rid of low level items to replace with more strong items) +- More scenery now appears in various tiles, and added a few new temple tile variations +- Made it possible to put your own runes on top of enemy runes. Have fun :) +- Having an orgasm is easier the more desire you have, and the effects last longer if you have more desire +- Fixed some cases of linking not working properly +- Added Cyber Link +- Added cyber mitt artwork and added shorter cyber mitts item +- Being headpatted now affects your facial expression +- Enemies like the Cyber Warden can remotely link your cyber cuffs +- Control harness now applies heels and mitts when placed in a full set of cyber cuffs +- Tweaked orgasm power increase from desire + +5.3.20 +- You can now give release to distracted NPCs thru the flirting menu +- Replaced 'close door' control on bottom bar with 'interact' control, which now lets you interact with objects as well as close doors +- Can now interact with doll dropoffs to put yourself on one (only on new tiles) +- Increased number of hotbar slots to 50 +- Fixed bug where enemies would deaggro and sit there (instead of running away) +- Minefield is now a -1 perk (instead of -2) + +5.3.19 +- Fixed 'temp leash enemy failing to deliver to jail or cage' +- Added graphics for bars in bandit hideout +- Fixed a few other bugs +- Added Swimsuit armor +- Reworked the lore system and rewrote most lore entries +- Added Free the Boob and Liberate the Boob perks +- Added Slayer Cape + +5.3.18 +- Fixed bug where enchantments had wrong font color +- Changed enemy perception so that they can track your movement a bit more realistically +- Allies will now temp leash the player again +- Fix pose issues with hogtie and kneel and bubble/cube/barrel +- Lifted the doll blockade that sometimes happens in doll processing +- fixed more leash bugs + +5.3.17 +- Added separate button font option +- Made different font types word wrap at different character amounts depending on font + +5.3.16 +- Added save/load as file function for save codes and outfit codes +- Added crotch rope gfx for the newer striped skirt +- Redesigned inventory interface (with UI option to do a classic inspired scroll) +- Added selectable font in game options + +5.3.15 +- Fixed bug with layer properties having wrong coordinate geometry in hogtie/map mode +- Fixed bug with layer property layer bonus not working + +5.3.14 +- Added Expert Tools section in the color picker +- One Click Move is now disabled when in danger (such as combat) +- Enemies can hit you more easily if they have low base accuracy, if you are slowed or restrained +- 6 new hairstyles added + +5.3.13 +- Changed how bondage resist gets affected by penalties when stunned +- Added evasion, block, bondage resist penalty for being frozen +- Game ignores files that start with . when loading mods (to increase Mac OS compat) +- Fix bug where casting a spell after using a leash consumes one leash +- Fix bug where Cyber security level doesnt reset on floor up +- Fix 'equipped' filters showing the wrong items in some cases +- Fix doll processing start denying journey selection + +5.3.12 +- Fixed a couple leash bugs + +5.3.11 +- Some enemies have Bulwark which blocks bomb explosions +- Fixed some bugs where enemies would fail to pathfind +- Added plastic explosive and dynamite to the shop + +5.3.10 +- Dragons can no longer reinforce PoI maps like bandit hideout +- Added Clip-On Leash item +- Refactored leashing! Should work on enemies and player now (may have some bugs) + +5.3.9 +- Fix issue where allies don't spawn in dollmaker, warden arena, or other maps +- Added the summit (currently serves only as a safe storage for items) +- Fixed some issues with filters in the armor menu +- Added a feature to tally damage dealt by attacks +- Added option for damage floaters to disappear faster + +5.3.8 +- Nerfed restoration tablets and determination tablets to compensate for increased counts +- Reduced time taken to copy large save codes in some browsers +- Added 'Show Restraint Info on Escape Hover' option +- greatly buffed the epsilon collar +- Added filters to the log +- Added damage resist enchantments for the shield table + +5.3.7 +- Buffed fuuka's dress, Gag +- Reduced cut power of magic hammer +- Fixed bug where rope getting enchanted would stack infinitely +- Added more filter categories to enchanted restraints +- Made the flanking stun more convenient when enemies arent moving +- Added new cyber lock types + +5.3.6 +- Fix tablets being too rare +- Made big map sizes bigger +- Bombs now destroy cracked tiles and various lesser objects + +5.3.5 +- Fix not enough overgrown monoliths +- Fix guards not showing up to training +- Added minimap icon for chests and tablets + +5.3.4 +- Can now rescue factory dolls with CMD spells +- Updated to pixi.js 7.4.2 +- Made it so enemies shouldnt temp leash you in doll Processing +- Traps in doll processing now spawn regular enemies not Surprise! +- Fixed bug with gargantuan halls, etc, breaking some special map tiles +- Fixed bug where enemies always home in on you in prison +- Fixed cases of spurious playtime +- Fixed class specific spells appearing in menu + +5.3.1 +- Fixed bugs with cyber locks not being unlockable +- Fixed bug where unlocking any lock would always remove the item + +5.3.0 +- TODO rope weapon when struggling out +- MODDERS: Added LinkCategories to allow multiple link categories per item +- Reworked the Doll Room in the Bellows. it is now the Doll Processing! +- Living collars now only apply when you pass out, not when you are jailed. Typically this is caused by shadow hands, gigantic slimes, sarcophagus, rope kraken, etc. +- Added perk that adds back living collars when jailed functionality +- Added 'Some Exclusions Apply' perk +- Increased max outfit count to 99 +- Stormbreaker now gains additional duration (up to 30 turns) for each damage instance +- Split acid from soap damage +- Added various combination effect and condition type enchantments +- Added more outfits to the shop +- Added smooth heels by SMoonlightM +- Replaced heart amulets with Overgrown Tablets, 2 per floor, diminishing returns when using it to boost a high stat +- Reworked Orb UI +- Added stun resistance for foes who have unstoppable or unflinching +- Some foes are now relentless, which gives stun resist upon being stunned +- Added Negate Rune spell (requires CMD disenchant, but is leg component spell) +- Player Runes now have a soft limit of 10 (will start to explode after 10) +- Fixed bug where having folders or files in the mods folder crashes the game +- Fixed an issue where the player model would sometimes flicker while moving +- Made the targeting reticule prefer floors and movable tiles over walls (toggleable) +- Added Retro Enemy Animations toggle +- Enemies no longer try to play with you after youve asked them to help you out and they said yes +- Fixed shield damage calculation +- Tremor duration reduced + +5.2.28 +- Desire burst is now locked to the Path of Pleasure + +5.2.27 +- Added ancient vaults, replacing the existing locations of special gold chests. +- Added guardian versions of the cyber warden, enforcer unit, and drone +- Added a secret collar + +5.2.26 +- Added cyber petsuit, leather petsuit +- Added leather leotard + +5.2.25 +- Added yukata +- Added buckle corset +- Added striped skirt, apron skirt +- Fixed crash when accepting goddess quest +- Outfits now determine restraint palette (defaulting to player setting otherwise) +- Added a bit more variance in cursed restraint selection +- Added divine gag +- New graphic for divine muzzle + +5.2.24 +- Made a linking change -- please lmk if there are any item duplication errors!! +- Fixed even more random bugs +- Added new model for crystal/obsidian cuffs +- Used steel cuffs model for mithril + +5.2.23 +- Some bug fixes +- New Steel Cuffs and Cyber Cuffs models + +5.2.22 +- Buffed kitty paws (harder to escape) +- Added chain skirt +- Fixed an issue where Light would sometimes ignore Inner Power +- Fixed human eye having one cat eye +- Capped amount of extra power an enemy can get from the muscle buff + +5.2.21 +- Various bug fixes +- Fixed Strong, Flexible, Locksmith, Clueless, Weak, and Inflexible. Now they actually work on struggling >.< +- Added difficulty and effective struggle power display to restraint hover over + +5.2.20 +RC1 +- Added obstacles to dragon elevator halls +- Fixed a few visual bugs +- Surrender debuff (being at 0WP) now reduces struggle bonus strength by 25% +RC2 +- Fixed latex catsuit stacking bug +- Added heavy latex catsuit +RC3 +- Fixed bug involving restraint looping when applied by enemies +- Latex catsuit should appear in latex bondage machines +- Latex catsuit should be applied by more enemy types +- Protoslime level reduced (was not supposed to be higher than regular slime!) +RC4 +- Added latex bondage offer for dominant enemies (e.g. latex elementals) +- Fixed longstanding bug resulting in chain loops of enemies aggroing on you in prison + +5.2.19 +- Restriction now affects get up time +- Added perks for Warden belt +- Tightness mechanic tweaked + +5.2.18 +- Added Warden's Belt and Belt of Privilege +- Some graphical fixes +- New perk: No Blindfolds + + +5.2.17 +- Easier to Remove restraints if hands and arms are unbound and player is not distracted +- New mod features: AlwaysLinkable and event 'dressRestraints' +- Added some layering features by Aelie +- Added more dialogue for The Warden +- Dollmaker is back at level 20 for now + +Known issues: No warden's collar yet + +5.2.16 +- Added 'Zero Resistance' to the unique spell tree +- Tightness is less punishing +- Different restraints have different tightness descriptions + +5.2.15 +- Added names and outfits for dragon girls +- Items have a tightness value and can get less tight over time +- You cant offer to quest shrines until the quest is accepted +- Fixed a bug where the tutorial became the Void +- and a bunch of other rare, intermittent bugs resulting from the same root cause +- Added new cyber heels + + +5.2.14 +- Leather Whip now binds using Leather at 150% efficiency +- Ropework now binds at 300% efficiency instead of 200% +- Chain bondage is harder to escape for enemies +- Added hogtie chain +- Reworked the way hogtie items work +- Fixed a bug where wrist and elbow chains would never be added outside of jail + +5.2.13 +- Fixed bug where items didnt get destroyed properly if you struggle out of them +- Fixed a bug where a lot of items were much easier to struggle out of inadvertently + +5.2.12 +- Ice dragon queen fires more concentrated ice bolts +- Ice dragon queen has a longer CD between channels +- Ice dragon queen ice bolt no longer goes thru walls +- Ice dragon queen channel time increased by 1 +- All dragons now regen slowly when the player is inside furniture +- Added 'dressRestraints' event for modders +- Fixed a bug where items bought off an NPC would have no events or special effects + +5.2.11 +- new perk: Stalker + +5.2.10 +- Added elevators which you can fast travel between once you unlock them +- Reworked the way cuffs and links work +- Added Warden collar +- Added Dragon Queens +- Added Dragon Girls +- Numerous bug, graphical fixes +- Added latex ball suit trap +- New music by Synthc4t! Used in bellows/dollmaker fight + +5.2.9 +- Added Sariel Vinlaga's Panties to gold chests +- Added Elven Panties as armor +- Steel Rain now does teasing damage + +5.2.8 +- Fixed a crash +- Added new tileset by Wyatt Wintersoul + +5.2.7 +- Made items more universally 'stretchy' so that having more progress in struggling makes further struggling weaker, however, having struggle progress makes removal and cutting easier +- Bound penalties to items have been reduced to compensate, this will make most items somewhat harder to escape with a single escape method. If you can leverage struggle in addition to cut or remove, it will make things much easier. +- Some items break permanently if you struggle out of them: leashes, corsets, collars, chains, cuffs + +5.2.6 +- Frozen Prison now brings an enemy up to 20% binding, then applies 10 binding per turn of freeze applied. +- Cutting while bound should now be a little easier +- Tweaked struggle parameters on leashes and bubbles +- Added custom lines for bubble struggling + +5.2.5 +- Arcane Barrier nerfed to 0 + 10% max mana +- Fix: Enemy with 0 hp won't be defeated from damage +- Fix: Softlocked in the edge of reality +- Fix: Game crash in high sec +- Fix: Random mystery tile trap activation +- Fix: Sealing pillars can enter same space as entrance and exit at Fuuka's +- Fix: Simple text mismatch report +- Fix: Dead-end / Crash in 5.2.3 +- Fix: Bug in fashion chastity belt masking +- Fix: Sunglasses don't prevent blindness from changing light levels (5.1.15) +- Fix: "Crash" when dogpiled by Shadow Hands +- Fix: Problem when Loading Pre-5.2.2 Save +- Fix: Enchanted gear that is unworn sometimes disappears +- Attempted to fix item duplication glitch. Keep an eye out for whether it swings the other way and enchanted items start disappearing + +5.2.4 +- Added Bandit Hideout + new track + +5.2.3 +- 'dimensional rifts' to the edge of reality can be found +- killsquad distance nerfed considerably + +5.2.2 +- Added a new system for tileset and mapmod selection at the end of the perk room + +5.2.1 +- Various bug fixes +- Unmasked and Kigu Masks are separate +- Dressmakers can now apply kigu masks + +5.2.0 + - Added Sealing Pillars to Fuuka's fight, giving bound players a means of taking her down + - Submitting to fuuka now gives you a beneficial version of her collar instead. + - New boss! Lines are fuuka's and currently just gives you fuuka's collar, but the intended fight loop is there + - New 'Escape Method' system by Aelie! + - Wolfgirl boots and torso now have split color layers + - Nevermere punishment suit now has a leotard component + - Fixed bug where load from code didnt affect the NPC you were dressing + - Added crotch rope under panties option + - Added Loot Recovery challenge mode + - Added Aqua Slime and related restraints + - Hopefully fixed shrine scarcity on bellows + - Added mana pressure plate + - Made allies ignore scenery unless the player is attacking it + - Added small escape power penalty for NOT having help + - Having help increases escape speed + - New variable: Restriction. Each restraint adds 1 restriction. Some add more. + - Restriction reduces cutting power by up to 60% + - Restriction reduces struggle power by up to 15% + - Restriction reduces remove power by up to 30% + - Restriction reduces unlock power by up to 30% + - Restriction reduces pick power by up to 40% + +5.1.15 + - Tweaked future harness lower + - Force restraints to use palette now applies to None palette + - New enemy: Aqua Witch + - Alkahestor and Slime Witch now have bubble attacks + +5.1.14 + - Fixed Red Binding Dress coloring + - Added Living Collars perk by Aelie + - Lowered damage of tease attacks + - Fixed () in damage reports + +5.1.13 + - New auto mod loader, simply place mods in Mods/ folder to load + - Fiddles, yokes added to prison + - Prison now mildly respects armbinder/boxbinder preferences (specifically if you do Less_Armbinders it will filter out armbinders from prison) + - Slime Eruption damage reduced from 50 to 40 + - Slime Blast damage reduced from 40 to 35 + - Added sunglasses + - Enemies fighting you have a harder time using tease attacks + - Enemies playing with you have an easier time using tease attacks + - Added Miku and Royal palette + - RC2: More bug fixes + - RC3: Added Nevermere palette + - RC3: Fix full defeat when an leash walker takes you back to jail + - RC3: Fix some clipping with legs + - RC3: Add more restraints to goddess quest punishments + - RC3: Fix vibration particles in wrong position when player is flipped by option + - RC3: Fix player flipped wrong in hogtie when player is flipped by option + - RC4: Add HUD player background + - RC4: Add bubble traps + +5.1.12 + - Added a global cooldown on tease attacks as well as a per enemy cooldown + - Made cuffs linkable by anything (only the base level) + - Added chastity over harness option + - Zone of Purity triggers at any binding level + - Added 'make bullets transparent' button and hotkey + - Fixed enemy Disarm removing your weapon + - enemy Disarm is now an action you are vulnerable to after an enemy weakens your grip + - You can now ask an NPC to link your cuffs + - Attempted to make cuff linking more sane (please report any bugs) + +5.1.11 + - Added elemental and Royal palette + - Tweaked sound levels on ghosts and demons + +5.1.10 +- Bugfixes + +5.1.9 +- Added Steel Fiddle, Heavy Yoke +- Enemies can now tease, tickle, and insert stuff into you between their attacks +- New spells: Chain Strike, Ropework, Leather Whip +- New graphics for some belts and bras +- Added perks for different heavy bondage preferences +- Removed Slayer, Magician, Conjurer perks +- Liquid metal now debuffs electric resist +- Liquid metal and steel armor now apply conduction to the player + +5.1.8 +- Frigid personality now ends at 10% distraction rather than 1% +- Liquid metal tile effects are now ignored by the player at 75 Glue Resist rather than 45 Glue Resist +- Vine spitters have a more powerful attack +- Added Earthshape Arc +- Fixed slime wall and latex wall not existing +- Fixed mistakenly switching the player outfit when choosing an outfit to put on an NPC + +5.1.7 +- Added mod texture packer support + +5.1.6 +- Added PureWind mod assets by PureWind +- Fixed many asset layering glitches +- More minor bugfixes +- Optimizations to help make the game smoother, this time with worn restraints +- edging yourself for longer means more Desire lost +- few QoL fixes and changes +- Nevermere blaster and bondage buster now count as attacks + +5.1.5 +- Minor bugfixes +- Fixed bug with bondage resist being inversely correlated with how much you have + +5.1.4 +- Can now dress your collection +- Water mote durability increased, stun duration decreased +- Unstoppable enemies are more stoppable +- Changed fireball and fireblast to deal full AoE damage but no double damage to the target hit +- Burning desire now 25% fire damage instead of 40% +- Added 'sell excess' button +- Bugfixes + +5.1.3 +- Graphical optimizations, should be MUCH less laggy lategame with many spells + +5.1.2 +- Fix guerilla fighter and unconventional warfare +- Fixed restraint block calculation +- Shrine buff titles changed from Arcane X to Divine X +- Conjuration buff changed from (retaliation damage and armor for 10 hits) to (blocks the next 3 restraining instances) + +5.1.1 +- Added Guerilla Fighting (rogue), Unconventional Warfare (fighter) +- Fixed some graphical glitches +- Added a wide variety of names to NPCs +- fixed truesight and reduced mana cost to 8/turn (from 10/turn). It now costs mana the first time you use it, but it also updates instantly without having to spend a turn +- Arcane barrier nerfed to 40+10% max mana (from a base of 60), but efficiency increased to 0.5 to 1. +- Arcane Protection (conjure shrine buff) armor and spellward buff now ends sooner when you take damage + +5.1.0 +- Added offline mod loading +- Added suspicious mod detection and filtering +- New perks: Edging, Pleasure, Denial, and Teasing lovers +- Some enemies, when dashing, will be able to attack immediately after dashing +- Added many new assets +- Added paperdolls to NPCs in your collection. Please let me know if there are any crashes! +- Added flip player option + +5.0.7 +Release A +- Cut power is now shown in the weapon card +- New perks: Heel training, Classic Heels +- Ballet heel restraints no longer hobble. instead you have a balance meter which drains when you walk, attack, and cast arm/leg spells +- You can train up your heel walking ability. It levels up when you reach a new highest floor, and is based on how often you were wearing heels the last level. Grinding the same level won't help you. +- Added more enchanted restraint types as quest rewards (mostly chastity and toys) +- Added experimental option to zoom in and out (in game options) +- Hogtie no longer forces arm bondage but can now be kept in inventory +Release B +- Fixed more bugs +- Tweaked enchantment probabilities based on restraint type some more +- New perks: Hard to Master: Heels, Poor Balance, Head Start: Heels +- Reworked some of the buttons in the inventory screen +- You can now lock your items with simple locks +- Arcane Barrier recovers more slowly but is more efficient +- You can feed allies sweets in order to heal them +Release C +- More bugfixes +- Enemies will now let go when their distraction is maxed out. +- Enemies have a Desire level now, which affects the amount of damage they take when letting go +- New spell: Sonar +- Added Divine Chastity Bra +Release E +- Added a collection where you can view captured NPCs +- Fixed some more bugs +- Added fashion chastity belts and fashion gags +Release F +- Added palette options + + +5.0.6 +- New perks: Can't Touch That, Grounded +- Fixed bugs with moirai's scissors (now costs charge instead of generating it, description matches ability) +- Fixed vine trap message +- Fixed librarian spawn message +- Added buff icon for Magical Sight +- Added option to outline enemies instead of showing buff aura +- Added option to pixelate the game board +- Added option to use "minimalist" buff outlines +- Fixed 'summon up' upgrades being invisible +- Party members not on the map are x'ed out which lets you remove them + +5.0.5 +- Fixed a few more bugs +- You can now devote yourself to a goddess to guarantee a quest on future floors +- 2.5% goddess rep on first quest completed on a floor +- Bondage offers only give goddess rep the first time +- Security level penalty for stealing from a faction chest is doubled +- Bows now count as attacks for purpose of enchanted gear and Grounded in Reality +- Added options to disable player and enemy buff auras + +5.0.4 D +- The past now comes back to haunt you if you abuse time magic +- More hairstyles by Dask! +- New leash graphics by Koirin! +- Portal spells are now channeled +- Additional RU translation by Osiris +- Additional CN translation by Mitki +- Arcane barrier nerfed to 60 + 10% max mana +- Portal spells now all channel + +5.0.4 C +- New perks: Bullet Hell, Bullet Armageddon +- Commited some graphical fixes +- Some bugfixes +- Enemies will sometimes toy with you before taking you away +- Fixed some dialogue lines +- New enemy: Rubber Elemental, Shibari Witch +- New lock type: Rubber +- New spells: Ropestorm. Enchant Ropes. Conjure Latex Armbinder, Gag, Legbinder +- Rope spell binding and struggle rate tweaked +- High value targets are a little weaker but have more buffs + +5.0.4 +- Targeting reticule now changes depending on action (attack, move, interact, pass, etc) +- Removed Floating Weapon; replaced with new Telekinesis spell category +- New spells: Recover Object, Kinetic Slash, WIP (Sagitta, Grasp, Kinetic Lance, Psychokinesis) +- Tweaked positioning of ropes for boxtie, strict Ropework +- Fixed Inertia perk not allowing diagonal 90 degree turns +- Fixed jail doors not being locked properly +- Added Candle Snuffer and Bag of Bags +- Kinky Prisoner, No Way Out, and Well-Equipped increase Security level by 30 (no way to lower except by Rep) +- Added lots of new definitions for prison restraints based on tags including maid, different rope types, and gave alchemist latex +- Added more sections of leg rope for a much tighter and more secure experience +- Floater messages now distribute themselves for greater readability + +5.0.3 (December 18) +- Added explosive barrels to levels. Beat them down without igniting them to take their gunpowder. +- Blink split into 3 spells for 1 spell point, each adding +1 range +- Changed Secure Defense to give more block at 0 willpower but half at max willpower +- New spells: Shield of (un)Clarity (Trainee only), Desire Burst (Trainee only), Liquid Metal, Raise Defense (Fighter only), Evasive Maneuvers (Rogue only), Break Free (Fighter only), Phase Dance, Double/Triple/Quad/Total Accel, Spatial swap +- Inner power now applies before multipliers +- Slime ball trail does 20 damage instead of 40 +- Added divine locks for enforcing Bound Crusaders! +- WIP Fixed item duplication glitch +- Fixed bug where outfit pieces that overlapped with restraint models would not get hidden +- Added auto strip before loading a code +- Magical Overload is now trainee exclusive +- Outfits, binding dresses, and petsuits now affect stealth slightly for the matching faction +- Security level now affected by faction rep +- Security now decays by 5 per floor instead of 1 +- Various factions will apply very strict restraints when above 100 security level +- Added fashion cuff assets +- Increased vulnerable accuracy bonus to 2x from 1.33x +- Fixed issue with legbinder clipping with ankle cuffs +- Made enchantments correlate more with other enchantments on the item +- Added Shadow Bleed weapon enchantment +- Added two new ghosts +- Added ghost traps are more common on chests +- Added skeleton, zombie, and mummy traps to the chest trap rotation +- Added perk shrine bondage visibility options +- Perk shrines can now give gold- locked restraints, configurable in challenge settings +- Added new uncancelable 'quests' for the various starting perks +- Added more rubble around the map +- New enemies: Tome of Belts, Tome of Ropes, Tome of Bondage, Liquid Metal Cube, Skeleton Archer +- New buyable restraint: Divine Chastity Belt +- New Light spell: Holy Orb +- New shadow spell: Shadow Dance, The Shadow Within +- Shadow Slash now deals bonus damage when you are in the shadows, but deals less damage otherwise +- Added accuracy upgrades +- Added physical damage upgrade +- New fighter upgrades: Gunslinger, Deadly Aim, Effortless Assault +- Heal and Healing Light moved to Light tree +- New summon: Nature Spirit +- New Summoning spells: Flash Portal, Selective Portal, Banishing Portal +- Portal removed +- New weapon: Maids feather duster +- New restraint: Duster Gag +- Arcane Barrier is now a shield +- The world is now greyscale if Light Filter is on and time is slowed down. Color briefly resumes on the turn before the world takes a step +- Enemies cannot dodge while blinded +- Conjured Armbinders, Straitjackets, and Legbinders are undodgeable and reduce the enemy's ability to block +- Reduced block amount for higher rank enemies (they reduce less damage per block) +- Added flash bomb consumable +- Smoke bomb now can be thrown +- Flash spells now blind but stun less +- New fighter spell: Enrage +- Nerfed some of the Block upgradesProblem Solving (Rogue) +- Some enemies now have shields +- Enemy evasion and block reworked. Enemies now gain evasion and block tokens when they see you, based on their evasion/block chance. +- Player accuracy reworked. Accuracy now reduces the amount of evasion tokens removed when an enemy dodges an attack +- Being bound now reduces your base damage for non- magic weapons and unarmed. Magic and enchanted weapons are unchanged +- Added quest markers for quest enemies on minimap +- Made quest enemies spawn closer together +- Visibility is reduced by 50% while either holding still or moving while slowed. +- Visibility is increased by 50% while attacking or casting +- Camouflage now does not end if you move near a wall +- Added prefixes and suffixes to enchantments +- Added icons to show curse effects on buff bar +- Enemies now show if they are unstoppable in the tooltip + +5.0.2 +- Nerfed Fast Recharge to be 6 turns instead of 4 +- Added various toggles to the UI +- Changed the way the previous weapons list works +- Unarmed attacks now deal Grope damage against humanoid targets +- Added various new catsuit variant models +- Various bugfix + +5.0.1 +- Fixed bug where hotkeys for Wait, Play self, and Make Noise didnt work +- Wait til Interrupted while Reloading a crossbow now auto-ends after finishing loading. Useful for arbalest. +- Improved the Orb Break menu when using Random Spells (now you know which spell it will give you) +- Added Goddess Quests at shrines +- Added Pray option at shrines +- Removed champion System +- Removed Rescue on the rep screen +- Merged lore and rep screen now that rep screen isnt functional and is informative only +- Added quests tab to journals +- Added minimap icons +- Inspect now allows you to pan the camera by clicking or using the arrow keys +- Added shadow hand graphics +- Tails rotate when kneeling +- Added Simple Color Picker option +- Added 'Known Abilities' as the default spells page +- Added hairband, maid hairband +- Fixed animal ears not touching the head in some hairstyles +- Added elf ears +- Added V bikini bottom +- Added hairbow +- Added cloth collar, cloth belt +- Added bow corset +- Added 3 new eyes by Kjus +- Added new hair and eyes by Dask + +5.0.0 RC8 +- Added Strict Ropework which adds an additional rope harness for aesthetic purposes +- Various curses that need you to be near a shrine now give a hint as to when they can be removed +- UI improvements in the wardrobe +- Fixed a bug where an enemy would leash you and then stand next to you forever +- Fixed crash when picking up an enchanted restraint off the ground while it was in your hotbar +- Tweaked layering of slime and tape +- Added a mini tutorial at the beginning. You can disable it in the game options +- Added keybindings for Make Noise, Play with Self, and Wait till Interrupted +- Fixed pose weirdness with display stand +- Added a new sprite for the hogtie display stand + +5.0.0 RC7 +- Added fullscreen and hi-res displacement map toggle +- Added dummies near the tutorial portal at the start of the game to suggest it is a training area +- Made the portals in the starting floor spin around and rotate to make them more portal-like +- Made it so loading in with modded restraints that dont exist anymore ideally shouldn't crash the game +- Fixed straitjackets not putting player arms forward +- Fixed game locking up when pressing 'skip' key in a text field +- Fixed a bug where arm cuffs were messing up glove sprites +- Copy paste buttons removed, replaced with text fields that update the state on paste/edit +- Added filter text field in wardrobe +- Corrected a number of graphical glitches +- Made some changes to slime layering + +5.0.0 RC6 +- Hopefully resolved the bug with blindfolds sometimes not appearing +- Hopefully prevented a rare crash +- Added Leather Gloves +- Split WolfGloves to have 3 colorable layers +- Fixed invisible laces on legbinder +- Made swimsuit top disappear when torso is encased (by slime) +- Added more descriptive loading + +5.0 (GRAPHICS UPDATE PATCH) +- Magic ropes now grant a struggle bonus when you have high mana, but a penalty when you have low mana +- Added Ice cuffs +- Added more types of traps to Edge of Reality and Bellows +- Added RU translation by Osiris +- Updated CN translation. Thanks Timeline!! +- Wolfgirl collar and shock module split into different items. + +4.83.2 (Nov 2023) +- Added new perks: Poor Form, Deft Fingering, and Poor Coordination, Smooth Talker. Renamed Graceful Walk to Deft Footwork. +- More doors can be locked in regular maps, and sometimes are replaced with grates +- fix bug with gold locks on doors + +4.83.1 (Nov 2023) +- Added enchanted weapons + +4.83 (Nov 2023) +- Fixed several bugs involving pathfinding +- Fixed a bug involving favorited items not working correctly with enchanted armor +- Added a few new enchantment types +- Made changes to jail under the hood +- changed enemy composition in high security prisons + +4.82.1 (Oct 2023) +- Added some changes to mobile touch controls to make it easier to use + +4.82 (Oct 2023) +- New restraint UI +- Enemies will now try to help each other out of bondage sometimes +- Changed Fuuka dialogue +- Added intro at the beginning (option to turn it off in Game Options) +- Statdust curse now unaffected by psychic or charm dmg +- Some bug fixes + +4.81.2 (Oct 2023) +- Fixed enemies with pulls taking you to jail while playing +- Star Curse now requires willpower for damage to count +- Some Qol (Cursed items now change their prefix to 'cursed' when equipped) + +4.81.1 (Oct 2023) +- Bugfixes +- Anti-magic gags are now a variation of regular gags + +4.81 (Oct 2023) +- Epicenters now scale with number of epicenters spawned, not with level +- Added party member system (they come with you across levels, and appear in prisons if they get defeated) +- Added some times with new fancy maze generation features +- Hopefully fixed the following bugs: +Curses being overwritten +Selling items deletes whole stack +Crash while fighting +Impossible to unlock chests and doors +Threatening barricades affects rep + +4.80.1 (Oct 2023) +- The shopkeeper offers diminishing returns for items sold to her +- Shop NPCs have a limited amount of gold they will give you +- New lock types: Secure, Disc + +4.80 (Oct 2023) +- Enchantments and curses now scale in occurrence with level +- Added some variation to the standard lock visuals +- Added High Security lock type +- Armor now gets thrown on the floor if it falls off +- Loadouts can now be set to merge armor into the loadout instead of replacing all armor + +4.79.5 (Oct 2023) +- CMD: Unlock now unlocks one lock, but is 33% cheaper +- New spell: CMD: Greater Unlock + +4.79.4 (Oct 2023) +- Added Take Command spells + +4.79.3 (Oct 2023) +- New perks: Directional Vision, Inertia, Heavy Inertia + +4.79.2 (Oct 2023) +- Can now sell items to floor 0 shopkeeper + +4.79 (Oct 2023) +- New perks: Fortified, Minefield +- Fixed some bugs +- New barricade type: Blast Door +- You can now buy items from NPC inventories, but they will gouge you if they aren't a shopkeeper! +- Added a few new shop types + +4.78 (Oct 2023) +- New enemies: Void Demon, Earth Keeper +- New barricade types +- New options for auto pathfinding +- Masochist perk now allows you to orgasm when taking sufficient damage + +4.77 (Oct 2023) +- Keybindings have changed format to allow for characters like !, @, #, etc +- Added scroll wheel support in a number of menus, including spell list, perk list, map editor, and hotbar pages +- Added scroll wheel to single spell display, quick inv, inventory, restraint scrolling, dialogue, shop, message log +- Enemies now take time to teleport in from traps +- New options for passthrough +- Can now walk through enemies via dialogue instead of having to toggle the setting +- Enemies now set up barricades to impede your progress +- Added filters to weapon inventory tab +- Bugfixes + + +4.76 (Oct 2023) +- Added ability to switch hotbar configs +- Added ability to add weapons, consumables, armor to hotbar +- Added keybindings for switching offhand weapons, hotbar configs, and fast-equipping loadouts + +4.75 (Sep 2023) +- Add Dual Wield to fighter class and partial version to Rogue class and wizard class +- New weapons: Arcane Tome, Bondage Tome +- Added Combat Training to fighter class +- New Fighter ability: Charge (Toggle: If you hit an enemy with space behind them and deal at least 10% of their HP in damage, you knock them back and take their space.) +- New Rogue ability: Tools of the Trade (Allows crafting bombs and smoke bombs from Gunpowder (dropped from alchemists), invisibility potions from ectoplasm) +Vault changes: +- Regular vault now allows you to slide under flying enemies +- Removed Improved Vault + +4.74 (Sep 2023) +- Added experimental new AI, let me know how things go +- Enemies can now sprint for a short time and recharge when idle +- Added inventory and spell filters +- Using Remove Slime on encased adventurers frees them from their predicament +- Split the panic perk into two different ones (by popular request) for chest traps vs floor traps +- New enemies, Masterful Lock, Heavy Weapons Maid, Glue Technican, Lab Assistant +- Many animated restraints now have backup restraint types +- Also fixed some bugs with certain restraints never being applied due to a calculation not working as intended + +4.73 (Sep 2023) +- Enemies now say things when helping their allies in combat +- Mage Circuits is now wizard-exclusive, adds +400 mana pool instead +- New Wizard upgrade: Mana Harvesting +- Hard Mode is moved to the game setup screen, and now you can choose to have extra perk points +- Bondage buster buffed to add binding +- Edge of reality smaller and more intelligible +- Freeze does damage now and has similar stipulations to ice shard +- Enchanted rope now does 50 magic binding instead of 30 +- Many enemies had their armor increased +- Fixed some bugs with mana costs + +4.72 (Sep 2023) +- Replaced High Profile with Precise Targeting for Rogue class +- Added High Profile perk +- Added Commerce Goddess Rewards Program +- Added Heavenly Crunch Macaron to shops and gold chests +- Inner Power now reduces mana costs instead of regenerating mana +- Spell point costs are now doubled for spells obtained thru multiclass (will affect all classes in old saves :( ) + +4.71 (Sep 2023) +Bugfixes +- Fix encased enemy sprite not showing +- Fixed mimics being passive +- Fixed slime ball not damaging the player when self cast +- Made enemies more likely to use high level restraints on you when playing +- Fixed shatter proccing infinitely on helpless enemy with Staff of Permafrost out. +- fixed psychic perk doesn't let you unlock some restraints that you should be able to + +4.7 (Sep 2023) +- Added some new upgrades to Rogue (Well-Placed Traps, Hard to Catch) +- Mage Circuits now gives +200 mana pool and costs 1 spell point +- Archmage no longer requires Mage Circuits +- Arcane Recharge replaced with Akashic Conflux, changed to "Consume 100 Arcane Energy to gain 100 mana and ignore components for 3 turns" +- New trainee spell: "Chaotic Overflow" - Spend 25% WP to refill mana and ignore spell components for 10 turns, but receive a crystal restraint at the end. +- Stamina regen is doubled while waiting +- Some other formula tweaks and bugfixes + + +4.69 (Sep 2023) +- Flanking an enemy now only stuns them if you teleport +- Added 'Battle Rhythm' and 'Limit Surge' to the Fighter class +- NG+ is much harder now +- Latex elemental should no longer use cuffs +- Added latex boxbinder +- Trainee should be more likely to orgasm while using Mana Burst +- Changed accuracy formulas for enemies +- Made enemies more picky about which types of restraints they put on you + +4.68 (Sep 2023) +- Handcuffs now have Simple Locks which can be easily removed and don't consume a key after the first time +- Simple Locks create a Simple Key consumable in your inventory which lasts an unlimited number of uses and lets you remove simple locks +- Many enemies now use Simple Locks instead +- Added thumbcuffs and hinged cuffs +- Added Arcane Blast, Arcane Barrier to wizard class +- Added 'The Reaping' to the Peasant class +- Added 'High Profile' to the Rogue class +Balance +- Can no longer get upgrades via Random Spells +- Arbalest now pierces enemies and has 250% crit modifier +- Fireball is now Fireblast, added Fireball as further upgrade +Bugfix +- Fix bug where enemies cant pathfind back to their home spot +- fix bug where enemy cancels attack randomly +- fix bug where guards run off into oblivion instead of tending to the prisoner + +4.67 (Sep 2023) +- Bows and crossbows now use a mechanic where they must be loaded before firing +- New weapons: Pistol Crossbow, Recurve Bow, Longbow, Arbalest +- Weapons now have a 'critical strike' modifier, which determines the damage boost they do to unaware or vulnerable targets. spells and bullets can also have one. +- Spells can now crit +- Critical Strike renamed to Precise Critical, affects only critical strikes +- New upgrade: Magical Overload (+crit based on total DP) +- Fixed a crash where there were no factions available to place a guarded chest (now defaults to bandits) + +4.66 (Sep 2023) +- Returned the original multiple-clicks-to-walk feature since there is now fast travel. +- Added 'One-Click Move' to options menu to walk like before + +4.65 (Sep 2023) +- Flirting menu now has two options, 1st is to initiate a play event, 2nd is to start a bondage offer +- New option to hide bullet and enemy warnings if the mouse is not on the map + +4.64 (Sep 2023) +- Rope Snare has been renamed to Rope Rune, standardized with the other runes, weaker now but AoE and roots in place instead of stuns +- Rogue now starts with an ability that makes traps not channel + +4.63 (Sep 2023) +- Trainee has been buffed: Everything now restores a baseline amount, plus restoring the mana pool if you have willpower. +- Mental Resistance can now toggle the orgasm prevention effect (QoL) +- New wizard spell: Arcane Recharge +- Split battlemage into two upgrades, one for attacking and one for casting + +4.62 (Sep 2023) +- Fix duplicate shop items +- Fix ally summons not carrying over across levels +- Fix fuuka's zombies (and all bosses really) from not aggroing on player +- Fix game calling auto-equipped items cursed when they aren't +- Split Smooth Lighting and Enhanced Fog of War in the game options menu + +4.61 (Sep 2023) +- Bugfix patch to hopefully fix a lot of the prison and map persistence bugs +- Truss em Up now applies status effects from restraints but also takes 1 turn +- Wall can now be cast on doors to do a special effect +- Perks which increase enemy resistance flatly now instead increase HP +- You can no longer stack multiple trap type spells on the same tile +- Added some lighting changes +- Added a rudimentary UI background that can be toggled off in the game options +- Added kitty chests in the Ancient Tombs +- New sensory perks added +- New game-changing perk,: Curse Seeker, Novice Pet (and upgrades) + +4.6 (Sep 2023) +Features +- You can now backtrack to previous levels! This is a start toward a future system to make the map more sane and understandable +- The shopkeeper is now in regular games! She basically functions as a very expensive shrine you can backtrack to the start of the game for +- You can now apply non-special bindings from your inventory to enemies that are disabled, adding some points of binding +Changes +- Some changes to enemy behavior based on the map faction and whether or not you are hostile to them + +4.52 (August 2023) +Features +- Can now flirt with NPCs to trigger a play event +- New sound feature that makes enemies more visible depending on situation +QoL +- Plugs and vibes now indicate the type of vibrations they do in their description +- Item and spells show their images in their description always +- Scarves now deal Plush damage (plush content will be expanded in future) + +4.51 (August 2023) +Features +- Shadow hands now take you to the Edge of Reality +- Patron NPCs now tell your their name when they first become aware of you! +- Added lesser shadow chests to the Edge of Reality +- Added much more variety to the enchanted restraints you get grom chests +- Enemies now mumble helplessly if they can't speak +- Optional enemy struggle animations (toggle off in game options) +- Enemies now have semi-directional vision (they can still see behind themselves, just not as clearly) +- Added a lot more Fuuka dialogue (about those reincarnated ones...) for those interested in lore. Talk to her after defeating the Dollmaker for an extra branch! +- Added 4 types of Fighter +- Convincing Disguise can now be toggled +- Added indication of which spell you are currently casting +- Added some new map tiles with more guarded chests and vent puzzles. Take True Sight to see through walls! +Changes +- Security level only increases by 10% instead of 20% when escaping +- Security level now only increases when escaping if you are unarmed or if you attacked an enemy on the way out +- Second Wind now restores WP when free +- Added more restraints to the loot tables +- Cursed armor now no longer functions as armor while cursed but otherwise functions normally +- Enchantments can no longer have duplicates +- The Underground Jungle is now the Overgrown Ruins, with new graphical variation in the tileset +- Catgirl enemies (Bast mummies + one of the new fighters) are now weak to water/acid damage +Bugfix +- CMD: Unlock now properly castable with Conjurer perk +- Fix issue where kitty blindfold was treated as a gag in code +- Fixed an issue with flexible map tiles creating unreachable zones +- Removing cursed restraints with a shrine correctly deletes the curse +- Fixed longstanding issue where clicking on an upcast spell in the spell list would sometimes choose the wrong spell +Modding +- Added tool to get the category and tag of a generated map tile (useful for post-worldgen tweaks like the Overgrown Ruins) +- Enchantments and hexes (cursed item effects) can now see a list of other enchantments/curses (respectively) already applied to the item +- New 'resistance profiles' which allows you to set specific sets of resistances that are shared between enemies and easy to apply/change across categories + +4.5 (August 2023) +Features +- Cursed Loot is here! Currently only cursed item set are the Stardust/Moondust Curse +- Added Cursed Epicenters, powerful new enemies that spawn only from shadow/gold chests when you are wearing a cursed item +- Added 6 new curses exclusive to the Stardust Curse +- Optimize fog rendering while the player isn't moving +Content +- Added Shadow Heels +Bugfix +- Fix bug where gold locks layered under something were not being updated +- Fix jail mode setting not remembered after refreshing the page +- hopefully fixed bug where removing an cursed enchanted restraint did not preserve in inventory +- Fix glitches relating to item data not being preserved through links +- Fixed issues where linked items were not triggering events properly + +4.4 (August 2023) +Features +- Added X-ray vision feature to view your character through wrappings (such as slime) and tape +Content +- Added some lower level versions of the plug gag and panel gag +- Added Shadow Latex restraints +Bugfix +- Fix bug where the game drops an equipped restraint instead of the one in inventory +- Fix bug where linking an enchanted restraint on top of an existing one would not carry over its special properties + +4.35 (August 2023) +Features +- Armor and restraints are now separate in inventory screen +- Some armors now have multiple enchantments +- Can now drop items from the inventory +- Added special and mundane filters to armor and restraints screens +- Allow removing and struggling in the inventory +Tweaks +- Inventory scrolls faster +- There are more shadow chests in hard mode +- Cursed items now display 'Cursed' instead of unlocked +- Restoration shrines are more common +- Enchanted restraints added to silver chests +- Changed colors of slash, crush, and pierce damage types +- Fixed double '-' in enchantment tooltip +- Cursed items not only have more enchantments but also better enchantments +- Curbed the enchantment strength of tougher restraints and higher level armors somewhat +- Prevented long enchantment tooltips from overflowing the inventory background +Bugfix +- Enchanted armor names are displayed property when dropped +- Torch weapon is now properly tinted a fire color +- Minimap border expanded to reflect actual area the minimap occupies +- Enchantments which add elemental damage to attacks no longer hit if the player misses +- Fix hard mode deactivating mid run +- Fix bug where vibe modifiers didn't stack properly +Modding +- Added a function to get the current number of cursed items +- Added loot prerequisites to require a certain number of cursed items for the loot to appear +- Added "specialChests" event to allow adding more special chest types to levels via event + +4.34 (August 2023) +Features +- Added enchantments to armor +Modding +-Reworked curse system entirely + +4.33 (August 2023) +Features +- Added a new minimap in the top of the screen, hover over it to enlarge! +Content +- New enchantments applied to armor, giving random stat boosts. More common on cursed items--beware! +Bugfix +- Fix bug "Can't hear you" perk broken +- Fix bug where floating weapon still took accuracy penalties from arms being bound (due to the way it was being calculated) +Modding +- New system for temporary variants of items, created dynamically using a helper function + +4.32 (July 2023) +- New feature (standalone only, unreleased): Option to desaturate areas that are dark (and lighten them a bit) in order to make light vs. dark regions more apparent +- Added two new upgrades for the wizard class +- New perks: Wizard multiclass, No Police +- Added a more powerful anti-magic gag, and also made it so enemies will use it on you in jail +- Lockpicking on prisoner NPCs now has a chance to trigger a safety shield +- Ice restraints now eventually melt off + +4.31 (July 2023) +- Added ability to add temporary curses onto items using console -- TODO test this to make sure the curse is persistent and gets filtered when the item is removed +- New weapons: Industrial Tape Wand, Bag of Goodies, Magic Remote, Rubber Stick, Blade of Ejahl, Enchanted Rope, Wooden Bow, Crossbow +- New series of spells which modify arrows fired by bows +- Some enemies now come pre-equipped with a toy +- Added quick inventory setups +- Large, slow enemies have reduced evasion +- Pristine is 70% reduction now instead of 100% and bug fixed so it works on regular levels + + + +OLD CHANGELOGS + 1.2 (Apr 10 2021) - First Beta Release - 1.3 (May 2021) Loot and Rewards - Added locked chests which are scattered around the dungeon. Each floor is guaranteed to have at least one locked chest but is likely to have more be locked. You can either pick them or unlock them @@ -1303,9 +3005,54 @@ Minor Changes: - Curse tooltips now show even while the item is overlaid - Each boss now gives a Leyline Map if you beat it, which lets you increase your mana pool up to +500 more -TODO: Mushrooms in the jungle +4.23 (April 2023) +- Lots of optimization. The game should run silky smooth! + +4.24 (April 2023) +- Balance: + Earth mote: hp 80 -> 120 +- Added Quick inventory sorting and ability to drop items +- Added Gigantic Slime and Latex Cube enemies +- New spell: Vanish, tweaked Invisibility +- New weapons: Targe, Tower Shield, Reinforced Shield +- Steadfast Guard renamed to Defiance so I can reuse the name +- New upgrades: Parry, Dagger Parry, Riposte, Steadfast Guard, The Power of Steel +- Many projectile spells are now blockable. A few (rubber bullets and earth witch boulder) can also be evaded, as it doesn't make much sense to block these +- Leashing enemies will disarm the player +- New perks: Self bondage enthusiast, Apprehended, The Wand is Mightier, Feeble Attacks, Glass Cannon +- Enemies will try to be much more aggressive when leashing you +- Vault is now more limited although you can purchase the full version which is just as good as before. Requires Evasion I now. +- Added some latex items in map editor, tiles section +- Dominant-type enemies will now sometimes leash you for a bit when you are in the Released state +- Tweaks to struggling algorithm + + +4.25 (May 2023) +- Enemy kill threshold expanded to attacks dealing 5 or more damage, down from 20 +- Added Inventory Filters! +- Added new upgrades for the Trainee Class: Way of Discipline, Way of Denial, Way of Pleasure, Intense Power, Pleasure Training I & II, Mental Resistance +- Balance +-- Buffed Convincing Disguise spell to have looser requirements +- Added more weak magic rope types + + +4.3 (Jun 2023) +- Buffs should no longer overflow as easily in the UI +- Added fire affinity type for modders +- New restraint: Anti Magic Gag (some maidforce have it) +- Can now find torches, scissors, and rope in rubble piles +- New mechanic: When demons jail you they will try to summon a portal and take you to a special area instead. +- Sleeping now restores 100% max mana + + + + + + TODO +The white bird that ties people up in Fate: Zero + Warden (more comprehensive cuffs) Detective (Stealth, wanders around laying traps throughout the level) Nurse (applies straitjackets and stuff) diff --git a/Game/Color.png b/Game/Color.png new file mode 100644 index 000000000..7f98b9038 Binary files /dev/null and b/Game/Color.png differ diff --git a/Game/ColorPicker.png b/Game/ColorPicker.png new file mode 100644 index 000000000..adfcce322 Binary files /dev/null and b/Game/ColorPicker.png differ diff --git a/Game/Conditions/ArmorBuff.png b/Game/Conditions/ArmorBuff.png index 4ce8f91c1..cb17396e7 100644 Binary files a/Game/Conditions/ArmorBuff.png and b/Game/Conditions/ArmorBuff.png differ diff --git a/Game/Conditions/ArmorDebuff.png b/Game/Conditions/ArmorDebuff.png index 058923f41..b5c0a2fdd 100644 Binary files a/Game/Conditions/ArmorDebuff.png and b/Game/Conditions/ArmorDebuff.png differ diff --git a/Game/Conditions/BlockBuff.png b/Game/Conditions/BlockBuff.png new file mode 100644 index 000000000..796d6387c Binary files /dev/null and b/Game/Conditions/BlockBuff.png differ diff --git a/Game/Conditions/ShieldBuff.png b/Game/Conditions/ShieldBuff.png index fc2d73695..84018f85f 100644 Binary files a/Game/Conditions/ShieldBuff.png and b/Game/Conditions/ShieldBuff.png differ diff --git a/Game/Conditions/ShieldDebuff.png b/Game/Conditions/ShieldDebuff.png index d9be1bfa5..3cdc5fcfa 100644 Binary files a/Game/Conditions/ShieldDebuff.png and b/Game/Conditions/ShieldDebuff.png differ diff --git a/Game/Conditions/Teleporting.png b/Game/Conditions/Teleporting.png new file mode 100644 index 000000000..f2130b374 Binary files /dev/null and b/Game/Conditions/Teleporting.png differ diff --git a/Game/Conditions/Thought/PlayDone.png b/Game/Conditions/Thought/PlayDone.png new file mode 100644 index 000000000..d13364be3 Binary files /dev/null and b/Game/Conditions/Thought/PlayDone.png differ diff --git a/Game/Conditions/VulnerableBlocked.png b/Game/Conditions/VulnerableBlocked.png new file mode 100644 index 000000000..84a6a5184 Binary files /dev/null and b/Game/Conditions/VulnerableBlocked.png differ diff --git a/Game/Consumables/AncientPowerSource.png b/Game/Consumables/AncientPowerSource.png deleted file mode 100644 index e7ca14555..000000000 Binary files a/Game/Consumables/AncientPowerSource.png and /dev/null differ diff --git a/Game/Consumables/AncientPowerSourceSpent.png b/Game/Consumables/AncientPowerSourceSpent.png deleted file mode 100644 index 8a7eb4257..000000000 Binary files a/Game/Consumables/AncientPowerSourceSpent.png and /dev/null differ diff --git a/Game/Consumables/Bola.png b/Game/Consumables/Bola.png deleted file mode 100644 index 72e6ba983..000000000 Binary files a/Game/Consumables/Bola.png and /dev/null differ diff --git a/Game/Consumables/Bomb.png b/Game/Consumables/Bomb.png deleted file mode 100644 index b5d89e80c..000000000 Binary files a/Game/Consumables/Bomb.png and /dev/null differ diff --git a/Game/Consumables/EarthRune.png b/Game/Consumables/EarthRune.png deleted file mode 100644 index 7ef4ae324..000000000 Binary files a/Game/Consumables/EarthRune.png and /dev/null differ diff --git a/Game/Consumables/Ectoplasm.png b/Game/Consumables/Ectoplasm.png deleted file mode 100644 index c71fa150f..000000000 Binary files a/Game/Consumables/Ectoplasm.png and /dev/null differ diff --git a/Game/Consumables/ElfCrystal.png b/Game/Consumables/ElfCrystal.png deleted file mode 100644 index fa172ba38..000000000 Binary files a/Game/Consumables/ElfCrystal.png and /dev/null differ diff --git a/Game/Consumables/EnchantedGrinder.png b/Game/Consumables/EnchantedGrinder.png deleted file mode 100644 index 0fb61fb17..000000000 Binary files a/Game/Consumables/EnchantedGrinder.png and /dev/null differ diff --git a/Game/Consumables/IceRune.png b/Game/Consumables/IceRune.png deleted file mode 100644 index 2490289cc..000000000 Binary files a/Game/Consumables/IceRune.png and /dev/null differ diff --git a/Game/Consumables/MistressKey.png b/Game/Consumables/MistressKey.png deleted file mode 100644 index abec87b76..000000000 Binary files a/Game/Consumables/MistressKey.png and /dev/null differ diff --git a/Game/Consumables/Potion.png b/Game/Consumables/Potion.png deleted file mode 100644 index ec4eed572..000000000 Binary files a/Game/Consumables/Potion.png and /dev/null differ diff --git a/Game/Consumables/PotionFrigid.png b/Game/Consumables/PotionFrigid.png deleted file mode 100644 index cff2e8a95..000000000 Binary files a/Game/Consumables/PotionFrigid.png and /dev/null differ diff --git a/Game/Consumables/PotionHealth.png b/Game/Consumables/PotionHealth.png deleted file mode 100644 index 9bd221aab..000000000 Binary files a/Game/Consumables/PotionHealth.png and /dev/null differ diff --git a/Game/Consumables/PotionHealthGreater.png b/Game/Consumables/PotionHealthGreater.png deleted file mode 100644 index fdc522abf..000000000 Binary files a/Game/Consumables/PotionHealthGreater.png and /dev/null differ diff --git a/Game/Consumables/PotionHealthUltimate.png b/Game/Consumables/PotionHealthUltimate.png deleted file mode 100644 index 9b5b240c3..000000000 Binary files a/Game/Consumables/PotionHealthUltimate.png and /dev/null differ diff --git a/Game/Consumables/PotionInvisibility.png b/Game/Consumables/PotionInvisibility.png deleted file mode 100644 index ec4eed572..000000000 Binary files a/Game/Consumables/PotionInvisibility.png and /dev/null differ diff --git a/Game/Consumables/PotionMana.png b/Game/Consumables/PotionMana.png deleted file mode 100644 index 935795525..000000000 Binary files a/Game/Consumables/PotionMana.png and /dev/null differ diff --git a/Game/Consumables/PotionStamina.png b/Game/Consumables/PotionStamina.png deleted file mode 100644 index 26dbbfd91..000000000 Binary files a/Game/Consumables/PotionStamina.png and /dev/null differ diff --git a/Game/Consumables/ScrollArms.png b/Game/Consumables/ScrollArms.png deleted file mode 100644 index 399c2238e..000000000 Binary files a/Game/Consumables/ScrollArms.png and /dev/null differ diff --git a/Game/Consumables/ScrollLegs.png b/Game/Consumables/ScrollLegs.png deleted file mode 100644 index bd8e7b90a..000000000 Binary files a/Game/Consumables/ScrollLegs.png and /dev/null differ diff --git a/Game/Consumables/ScrollPurity.png b/Game/Consumables/ScrollPurity.png deleted file mode 100644 index 9eecbee98..000000000 Binary files a/Game/Consumables/ScrollPurity.png and /dev/null differ diff --git a/Game/Consumables/ScrollVerbal.png b/Game/Consumables/ScrollVerbal.png deleted file mode 100644 index ffa3d0fba..000000000 Binary files a/Game/Consumables/ScrollVerbal.png and /dev/null differ diff --git a/Game/Consumables/SmokeBomb.png b/Game/Consumables/SmokeBomb.png deleted file mode 100644 index 71523677b..000000000 Binary files a/Game/Consumables/SmokeBomb.png and /dev/null differ diff --git a/Game/Consumables/WaterRune.png b/Game/Consumables/WaterRune.png deleted file mode 100644 index bdbcc8ba8..000000000 Binary files a/Game/Consumables/WaterRune.png and /dev/null differ diff --git a/Game/Cursor.png b/Game/Cursor.png new file mode 100644 index 000000000..1e1459c0f Binary files /dev/null and b/Game/Cursor.png differ diff --git a/Game/Cut.png b/Game/Cut.png index 00f3aa68a..59e2719fb 100644 Binary files a/Game/Cut.png and b/Game/Cut.png differ diff --git a/Game/EffectTiles/Acid.png b/Game/EffectTiles/Acid.png new file mode 100644 index 000000000..2292018d8 Binary files /dev/null and b/Game/EffectTiles/Acid.png differ diff --git a/Game/EffectTiles/BoobyTrap.png b/Game/EffectTiles/BoobyTrap.png new file mode 100644 index 000000000..c1a97278f Binary files /dev/null and b/Game/EffectTiles/BoobyTrap.png differ diff --git a/Game/EffectTiles/BoobyTrapMagic.png b/Game/EffectTiles/BoobyTrapMagic.png new file mode 100644 index 000000000..f7416f036 Binary files /dev/null and b/Game/EffectTiles/BoobyTrapMagic.png differ diff --git a/Game/EffectTiles/Bubble.png b/Game/EffectTiles/Bubble.png new file mode 100644 index 000000000..5af16f50b Binary files /dev/null and b/Game/EffectTiles/Bubble.png differ diff --git a/Game/EffectTiles/Chill.png b/Game/EffectTiles/Chill.png new file mode 100644 index 000000000..a4771f50a Binary files /dev/null and b/Game/EffectTiles/Chill.png differ diff --git a/Game/EffectTiles/DistractionMote.png b/Game/EffectTiles/DistractionMote.png new file mode 100644 index 000000000..1e414d637 Binary files /dev/null and b/Game/EffectTiles/DistractionMote.png differ diff --git a/Game/EffectTiles/DistractionMoteContact.png b/Game/EffectTiles/DistractionMoteContact.png new file mode 100644 index 000000000..7b996c5ee Binary files /dev/null and b/Game/EffectTiles/DistractionMoteContact.png differ diff --git a/Game/EffectTiles/EdgeOrb.png b/Game/EffectTiles/EdgeOrb.png new file mode 100644 index 000000000..5f73a8a6e Binary files /dev/null and b/Game/EffectTiles/EdgeOrb.png differ diff --git a/Game/EffectTiles/EdgeOrbDead.png b/Game/EffectTiles/EdgeOrbDead.png new file mode 100644 index 000000000..dcd06351e Binary files /dev/null and b/Game/EffectTiles/EdgeOrbDead.png differ diff --git a/Game/EffectTiles/Glue.png b/Game/EffectTiles/Glue.png new file mode 100644 index 000000000..3725c4066 Binary files /dev/null and b/Game/EffectTiles/Glue.png differ diff --git a/Game/EffectTiles/Gunpowder.png b/Game/EffectTiles/Gunpowder.png new file mode 100644 index 000000000..39eb760b6 Binary files /dev/null and b/Game/EffectTiles/Gunpowder.png differ diff --git a/Game/EffectTiles/LatexBlue.png b/Game/EffectTiles/LatexBlue.png new file mode 100644 index 000000000..d36fb778f Binary files /dev/null and b/Game/EffectTiles/LatexBlue.png differ diff --git a/Game/EffectTiles/LatexGreen.png b/Game/EffectTiles/LatexGreen.png new file mode 100644 index 000000000..878ba01af Binary files /dev/null and b/Game/EffectTiles/LatexGreen.png differ diff --git a/Game/EffectTiles/LatexThin.png b/Game/EffectTiles/LatexThin.png new file mode 100644 index 000000000..6654ba9d9 Binary files /dev/null and b/Game/EffectTiles/LatexThin.png differ diff --git a/Game/EffectTiles/LatexThinBlue.png b/Game/EffectTiles/LatexThinBlue.png new file mode 100644 index 000000000..2211c269e Binary files /dev/null and b/Game/EffectTiles/LatexThinBlue.png differ diff --git a/Game/EffectTiles/LatexThinGreen.png b/Game/EffectTiles/LatexThinGreen.png new file mode 100644 index 000000000..cc737f639 Binary files /dev/null and b/Game/EffectTiles/LatexThinGreen.png differ diff --git a/Game/EffectTiles/LiquidMetal.png b/Game/EffectTiles/LiquidMetal.png new file mode 100644 index 000000000..600bf86de Binary files /dev/null and b/Game/EffectTiles/LiquidMetal.png differ diff --git a/Game/EffectTiles/ManaEmpty.png b/Game/EffectTiles/ManaEmpty.png new file mode 100644 index 000000000..82d23d78e Binary files /dev/null and b/Game/EffectTiles/ManaEmpty.png differ diff --git a/Game/EffectTiles/ManaFull.png b/Game/EffectTiles/ManaFull.png new file mode 100644 index 000000000..729797849 Binary files /dev/null and b/Game/EffectTiles/ManaFull.png differ diff --git a/Game/EffectTiles/ManaPartial.png b/Game/EffectTiles/ManaPartial.png new file mode 100644 index 000000000..b0bcb4dc9 Binary files /dev/null and b/Game/EffectTiles/ManaPartial.png differ diff --git a/Game/EffectTiles/MotionLamp.png b/Game/EffectTiles/MotionLamp.png new file mode 100644 index 000000000..9ce62b215 Binary files /dev/null and b/Game/EffectTiles/MotionLamp.png differ diff --git a/Game/EffectTiles/MotionLampLight.png b/Game/EffectTiles/MotionLampLight.png new file mode 100644 index 000000000..09cbd3e21 Binary files /dev/null and b/Game/EffectTiles/MotionLampLight.png differ diff --git a/Game/EffectTiles/NoTeleportPlate.png b/Game/EffectTiles/NoTeleportPlate.png new file mode 100644 index 000000000..c202a4e00 Binary files /dev/null and b/Game/EffectTiles/NoTeleportPlate.png differ diff --git a/Game/EffectTiles/Portals/CommercePortal.png b/Game/EffectTiles/Portals/CommercePortal.png new file mode 100644 index 000000000..e73921318 Binary files /dev/null and b/Game/EffectTiles/Portals/CommercePortal.png differ diff --git a/Game/EffectTiles/Portals/CommercePortalReturn.png b/Game/EffectTiles/Portals/CommercePortalReturn.png new file mode 100644 index 000000000..79fb82349 Binary files /dev/null and b/Game/EffectTiles/Portals/CommercePortalReturn.png differ diff --git a/Game/EffectTiles/Portals/DarkPortal.png b/Game/EffectTiles/Portals/DarkPortal.png new file mode 100644 index 000000000..ab5f04069 Binary files /dev/null and b/Game/EffectTiles/Portals/DarkPortal.png differ diff --git a/Game/EffectTiles/Portals/Portal.png b/Game/EffectTiles/Portals/Portal.png new file mode 100644 index 000000000..34cfcf59e Binary files /dev/null and b/Game/EffectTiles/Portals/Portal.png differ diff --git a/Game/EffectTiles/Radiance.png b/Game/EffectTiles/Radiance.png new file mode 100644 index 000000000..b91589e38 Binary files /dev/null and b/Game/EffectTiles/Radiance.png differ diff --git a/Game/EffectTiles/Rubble.png b/Game/EffectTiles/Rubble.png new file mode 100644 index 000000000..0dea80ec8 Binary files /dev/null and b/Game/EffectTiles/Rubble.png differ diff --git a/Game/EffectTiles/RubbleNoMend.png b/Game/EffectTiles/RubbleNoMend.png new file mode 100644 index 000000000..0dea80ec8 Binary files /dev/null and b/Game/EffectTiles/RubbleNoMend.png differ diff --git a/Game/EffectTiles/Sack.png b/Game/EffectTiles/Sack.png new file mode 100644 index 000000000..27875e471 Binary files /dev/null and b/Game/EffectTiles/Sack.png differ diff --git a/Game/EffectTiles/SealSigil.png b/Game/EffectTiles/SealSigil.png new file mode 100644 index 000000000..70f14b2db Binary files /dev/null and b/Game/EffectTiles/SealSigil.png differ diff --git a/Game/EffectTiles/Soap.png b/Game/EffectTiles/Soap.png new file mode 100644 index 000000000..7d23ba64a Binary files /dev/null and b/Game/EffectTiles/Soap.png differ diff --git a/Game/EffectTiles/SpikeTrap.png b/Game/EffectTiles/SpikeTrap.png new file mode 100644 index 000000000..bfe814901 Binary files /dev/null and b/Game/EffectTiles/SpikeTrap.png differ diff --git a/Game/EffectTiles/SpikeTrapActive.png b/Game/EffectTiles/SpikeTrapActive.png new file mode 100644 index 000000000..dcaaf93a2 Binary files /dev/null and b/Game/EffectTiles/SpikeTrapActive.png differ diff --git a/Game/EffectTiles/SpikeTrapSeen.png b/Game/EffectTiles/SpikeTrapSeen.png new file mode 100644 index 000000000..7ed77e4d8 Binary files /dev/null and b/Game/EffectTiles/SpikeTrapSeen.png differ diff --git a/Game/EffectTiles/StarryTrail.png b/Game/EffectTiles/StarryTrail.png new file mode 100644 index 000000000..ef32d871a Binary files /dev/null and b/Game/EffectTiles/StarryTrail.png differ diff --git a/Game/EffectTiles/TauntGround.png b/Game/EffectTiles/TauntGround.png new file mode 100644 index 000000000..0fe6cca45 Binary files /dev/null and b/Game/EffectTiles/TauntGround.png differ diff --git a/Game/EffectTiles/TeleportPlate.png b/Game/EffectTiles/TeleportPlate.png new file mode 100644 index 000000000..0da2f316a Binary files /dev/null and b/Game/EffectTiles/TeleportPlate.png differ diff --git a/Game/EffectTiles/TeleportPlateMana.png b/Game/EffectTiles/TeleportPlateMana.png new file mode 100644 index 000000000..25be934e8 Binary files /dev/null and b/Game/EffectTiles/TeleportPlateMana.png differ diff --git a/Game/EffectTiles/Wire.png b/Game/EffectTiles/Wire.png index a8178baa2..5cd488850 100644 Binary files a/Game/EffectTiles/Wire.png and b/Game/EffectTiles/Wire.png differ diff --git a/Game/EffectTiles/WireEnd.png b/Game/EffectTiles/WireEnd.png new file mode 100644 index 000000000..4627872cb Binary files /dev/null and b/Game/EffectTiles/WireEnd.png differ diff --git a/Game/EffectTiles/WireHoriz.png b/Game/EffectTiles/WireHoriz.png new file mode 100644 index 000000000..386c8ae7b Binary files /dev/null and b/Game/EffectTiles/WireHoriz.png differ diff --git a/Game/EffectTiles/WireVert.png b/Game/EffectTiles/WireVert.png new file mode 100644 index 000000000..1b8e89822 Binary files /dev/null and b/Game/EffectTiles/WireVert.png differ diff --git a/Game/Enemies/AcidBarrel.png b/Game/Enemies/AcidBarrel.png new file mode 100644 index 000000000..160271132 Binary files /dev/null and b/Game/Enemies/AcidBarrel.png differ diff --git a/Game/Enemies/Adventurer_Brat_Fighter.png b/Game/Enemies/Adventurer_Brat_Fighter.png new file mode 100644 index 000000000..58d0b7b90 Binary files /dev/null and b/Game/Enemies/Adventurer_Brat_Fighter.png differ diff --git a/Game/Enemies/Adventurer_Dom_Fighter.png b/Game/Enemies/Adventurer_Dom_Fighter.png new file mode 100644 index 000000000..fb7fba555 Binary files /dev/null and b/Game/Enemies/Adventurer_Dom_Fighter.png differ diff --git a/Game/Enemies/Adventurer_Sub_Fighter.png b/Game/Enemies/Adventurer_Sub_Fighter.png new file mode 100644 index 000000000..2d29dc117 Binary files /dev/null and b/Game/Enemies/Adventurer_Sub_Fighter.png differ diff --git a/Game/Enemies/Adventurer_Switch_Fighter.png b/Game/Enemies/Adventurer_Switch_Fighter.png new file mode 100644 index 000000000..ed938d3a9 Binary files /dev/null and b/Game/Enemies/Adventurer_Switch_Fighter.png differ diff --git a/Game/Enemies/AirMote.png b/Game/Enemies/AirMote.png index fd383cdd7..ca28175f9 100644 Binary files a/Game/Enemies/AirMote.png and b/Game/Enemies/AirMote.png differ diff --git a/Game/Enemies/Ally.png b/Game/Enemies/Ally.png index 5fd47593d..01a283636 100644 Binary files a/Game/Enemies/Ally.png and b/Game/Enemies/Ally.png differ diff --git a/Game/Enemies/AntiqueQuest.png b/Game/Enemies/AntiqueQuest.png new file mode 100644 index 000000000..57c9b92c5 Binary files /dev/null and b/Game/Enemies/AntiqueQuest.png differ diff --git a/Game/Enemies/AquaSlime.png b/Game/Enemies/AquaSlime.png new file mode 100644 index 000000000..a1c17e76f Binary files /dev/null and b/Game/Enemies/AquaSlime.png differ diff --git a/Game/Enemies/ArmorerQuest.png b/Game/Enemies/ArmorerQuest.png new file mode 100644 index 000000000..489c153a2 Binary files /dev/null and b/Game/Enemies/ArmorerQuest.png differ diff --git a/Game/Enemies/Barricade.png b/Game/Enemies/Barricade.png new file mode 100644 index 000000000..99e1807a0 Binary files /dev/null and b/Game/Enemies/Barricade.png differ diff --git a/Game/Enemies/BarricadeAir.png b/Game/Enemies/BarricadeAir.png new file mode 100644 index 000000000..dfc7b62cf Binary files /dev/null and b/Game/Enemies/BarricadeAir.png differ diff --git a/Game/Enemies/BarricadeBlastDoor.png b/Game/Enemies/BarricadeBlastDoor.png new file mode 100644 index 000000000..4d9d25619 Binary files /dev/null and b/Game/Enemies/BarricadeBlastDoor.png differ diff --git a/Game/Enemies/BarricadeConcrete.png b/Game/Enemies/BarricadeConcrete.png new file mode 100644 index 000000000..c49f65ed2 Binary files /dev/null and b/Game/Enemies/BarricadeConcrete.png differ diff --git a/Game/Enemies/BarricadeEarth.png b/Game/Enemies/BarricadeEarth.png new file mode 100644 index 000000000..4e746814d Binary files /dev/null and b/Game/Enemies/BarricadeEarth.png differ diff --git a/Game/Enemies/BarricadeElectric.png b/Game/Enemies/BarricadeElectric.png new file mode 100644 index 000000000..f87844870 Binary files /dev/null and b/Game/Enemies/BarricadeElectric.png differ diff --git a/Game/Enemies/BarricadeFire.png b/Game/Enemies/BarricadeFire.png new file mode 100644 index 000000000..e4f4a7611 Binary files /dev/null and b/Game/Enemies/BarricadeFire.png differ diff --git a/Game/Enemies/BarricadeHighSecurityDoor.png b/Game/Enemies/BarricadeHighSecurityDoor.png new file mode 100644 index 000000000..07d3fc857 Binary files /dev/null and b/Game/Enemies/BarricadeHighSecurityDoor.png differ diff --git a/Game/Enemies/BarricadeIce.png b/Game/Enemies/BarricadeIce.png new file mode 100644 index 000000000..c9828f599 Binary files /dev/null and b/Game/Enemies/BarricadeIce.png differ diff --git a/Game/Enemies/BarricadeLight.png b/Game/Enemies/BarricadeLight.png new file mode 100644 index 000000000..07d3fc857 Binary files /dev/null and b/Game/Enemies/BarricadeLight.png differ diff --git a/Game/Enemies/BarricadeMagic.png b/Game/Enemies/BarricadeMagic.png new file mode 100644 index 000000000..3a298466a Binary files /dev/null and b/Game/Enemies/BarricadeMagic.png differ diff --git a/Game/Enemies/BarricadeMetal.png b/Game/Enemies/BarricadeMetal.png new file mode 100644 index 000000000..a9edd3daf Binary files /dev/null and b/Game/Enemies/BarricadeMetal.png differ diff --git a/Game/Enemies/BarricadeRobot.png b/Game/Enemies/BarricadeRobot.png new file mode 100644 index 000000000..9a90ed405 Binary files /dev/null and b/Game/Enemies/BarricadeRobot.png differ diff --git a/Game/Enemies/BarricadeSecurityDoor.png b/Game/Enemies/BarricadeSecurityDoor.png new file mode 100644 index 000000000..07d3fc857 Binary files /dev/null and b/Game/Enemies/BarricadeSecurityDoor.png differ diff --git a/Game/Enemies/BarricadeShadow.png b/Game/Enemies/BarricadeShadow.png new file mode 100644 index 000000000..b5160b797 Binary files /dev/null and b/Game/Enemies/BarricadeShadow.png differ diff --git a/Game/Enemies/BarricadeShadowMetal.png b/Game/Enemies/BarricadeShadowMetal.png new file mode 100644 index 000000000..9e7f83d1d Binary files /dev/null and b/Game/Enemies/BarricadeShadowMetal.png differ diff --git a/Game/Enemies/BarricadeVine.png b/Game/Enemies/BarricadeVine.png new file mode 100644 index 000000000..f59706555 Binary files /dev/null and b/Game/Enemies/BarricadeVine.png differ diff --git a/Game/Enemies/BarricadeWater.png b/Game/Enemies/BarricadeWater.png new file mode 100644 index 000000000..4a478000c Binary files /dev/null and b/Game/Enemies/BarricadeWater.png differ diff --git a/Game/Enemies/BigSlime.png b/Game/Enemies/BigSlime.png index bf5e9caeb..9a53803e9 100644 Binary files a/Game/Enemies/BigSlime.png and b/Game/Enemies/BigSlime.png differ diff --git a/Game/Enemies/BlacksmithQuest.png b/Game/Enemies/BlacksmithQuest.png index 03e7f013e..b779c87ee 100644 Binary files a/Game/Enemies/BlacksmithQuest.png and b/Game/Enemies/BlacksmithQuest.png differ diff --git a/Game/Enemies/BookBelt.png b/Game/Enemies/BookBelt.png new file mode 100644 index 000000000..7c84d48c2 Binary files /dev/null and b/Game/Enemies/BookBelt.png differ diff --git a/Game/Enemies/BookBondage.png b/Game/Enemies/BookBondage.png new file mode 100644 index 000000000..2705322ce Binary files /dev/null and b/Game/Enemies/BookBondage.png differ diff --git a/Game/Enemies/BookRope.png b/Game/Enemies/BookRope.png new file mode 100644 index 000000000..0a04f38cb Binary files /dev/null and b/Game/Enemies/BookRope.png differ diff --git a/Game/Enemies/BotMissile.png b/Game/Enemies/BotMissile.png index 541b25acd..fa0275d5b 100644 Binary files a/Game/Enemies/BotMissile.png and b/Game/Enemies/BotMissile.png differ diff --git a/Game/Enemies/BowyerQuest.png b/Game/Enemies/BowyerQuest.png new file mode 100644 index 000000000..0f30358a2 Binary files /dev/null and b/Game/Enemies/BowyerQuest.png differ diff --git a/Game/Enemies/CaptureBot.png b/Game/Enemies/CaptureBot.png index 3c05bc296..70b4aaf21 100644 Binary files a/Game/Enemies/CaptureBot.png and b/Game/Enemies/CaptureBot.png differ diff --git a/Game/Enemies/Chef.png b/Game/Enemies/Chef.png new file mode 100644 index 000000000..75d3f7168 Binary files /dev/null and b/Game/Enemies/Chef.png differ diff --git a/Game/Enemies/ClericHigh.png b/Game/Enemies/ClericHigh.png new file mode 100644 index 000000000..d4cf9d827 Binary files /dev/null and b/Game/Enemies/ClericHigh.png differ diff --git a/Game/Enemies/CuffedGirl.png b/Game/Enemies/CuffedGirl.png new file mode 100644 index 000000000..295be44f5 Binary files /dev/null and b/Game/Enemies/CuffedGirl.png differ diff --git a/Game/Enemies/CuffedGirl2.png b/Game/Enemies/CuffedGirl2.png new file mode 100644 index 000000000..d695d6ce5 Binary files /dev/null and b/Game/Enemies/CuffedGirl2.png differ diff --git a/Game/Enemies/CuffedGirl3.png b/Game/Enemies/CuffedGirl3.png new file mode 100644 index 000000000..440623551 Binary files /dev/null and b/Game/Enemies/CuffedGirl3.png differ diff --git a/Game/Enemies/CustomSprite/Alisa.png b/Game/Enemies/CustomSprite/Alisa.png new file mode 100644 index 000000000..e84a6ff10 Binary files /dev/null and b/Game/Enemies/CustomSprite/Alisa.png differ diff --git a/Game/Enemies/CustomSprite/Hilda.png b/Game/Enemies/CustomSprite/Hilda.png new file mode 100644 index 000000000..346298528 Binary files /dev/null and b/Game/Enemies/CustomSprite/Hilda.png differ diff --git a/Game/Enemies/CustomSprite/Melissa.png b/Game/Enemies/CustomSprite/Melissa.png new file mode 100644 index 000000000..9d12f7326 Binary files /dev/null and b/Game/Enemies/CustomSprite/Melissa.png differ diff --git a/Game/Enemies/CustomSprite/Myrtrice.png b/Game/Enemies/CustomSprite/Myrtrice.png index 4340c9122..aca934941 100644 Binary files a/Game/Enemies/CustomSprite/Myrtrice.png and b/Game/Enemies/CustomSprite/Myrtrice.png differ diff --git a/Game/Enemies/CustomSprite/Myrtrice2.png b/Game/Enemies/CustomSprite/Myrtrice2.png new file mode 100644 index 000000000..8c95733f8 Binary files /dev/null and b/Game/Enemies/CustomSprite/Myrtrice2.png differ diff --git a/Game/Enemies/CustomSprite/Myrtrice3.png b/Game/Enemies/CustomSprite/Myrtrice3.png new file mode 100644 index 000000000..0a43b53c3 Binary files /dev/null and b/Game/Enemies/CustomSprite/Myrtrice3.png differ diff --git a/Game/Enemies/CustomSprite/Nara.png b/Game/Enemies/CustomSprite/Nara.png new file mode 100644 index 000000000..a412d7221 Binary files /dev/null and b/Game/Enemies/CustomSprite/Nara.png differ diff --git a/Game/Enemies/CustomSprite/Parov.png b/Game/Enemies/CustomSprite/Parov.png new file mode 100644 index 000000000..9cca071c8 Binary files /dev/null and b/Game/Enemies/CustomSprite/Parov.png differ diff --git a/Game/Enemies/CustomSprite/Rai.png b/Game/Enemies/CustomSprite/Rai.png new file mode 100644 index 000000000..a9367a297 Binary files /dev/null and b/Game/Enemies/CustomSprite/Rai.png differ diff --git a/Game/Enemies/CustomSprite/Rai2.png b/Game/Enemies/CustomSprite/Rai2.png new file mode 100644 index 000000000..c7129c079 Binary files /dev/null and b/Game/Enemies/CustomSprite/Rai2.png differ diff --git a/Game/Enemies/CustomSprite/Rook.png b/Game/Enemies/CustomSprite/Rook.png new file mode 100644 index 000000000..58d0c05c7 Binary files /dev/null and b/Game/Enemies/CustomSprite/Rook.png differ diff --git a/Game/Enemies/CustomSprite/Selly.png b/Game/Enemies/CustomSprite/Selly.png new file mode 100644 index 000000000..9003aa277 Binary files /dev/null and b/Game/Enemies/CustomSprite/Selly.png differ diff --git a/Game/Enemies/CustomSprite/Viola.png b/Game/Enemies/CustomSprite/Viola.png new file mode 100644 index 000000000..aea947070 Binary files /dev/null and b/Game/Enemies/CustomSprite/Viola.png differ diff --git a/Game/Enemies/CustomSpriteBound/Alisa.png b/Game/Enemies/CustomSpriteBound/Alisa.png new file mode 100644 index 000000000..286d4cc51 Binary files /dev/null and b/Game/Enemies/CustomSpriteBound/Alisa.png differ diff --git a/Game/Enemies/CustomSpriteBound/Hilda.png b/Game/Enemies/CustomSpriteBound/Hilda.png new file mode 100644 index 000000000..0687a1aa9 Binary files /dev/null and b/Game/Enemies/CustomSpriteBound/Hilda.png differ diff --git a/Game/Enemies/CustomSpriteBound/Melissa.png b/Game/Enemies/CustomSpriteBound/Melissa.png new file mode 100644 index 000000000..a969fc7bf Binary files /dev/null and b/Game/Enemies/CustomSpriteBound/Melissa.png differ diff --git a/Game/Enemies/CustomSpriteBound/Myrtrice.png b/Game/Enemies/CustomSpriteBound/Myrtrice.png index e7b801914..999928332 100644 Binary files a/Game/Enemies/CustomSpriteBound/Myrtrice.png and b/Game/Enemies/CustomSpriteBound/Myrtrice.png differ diff --git a/Game/Enemies/CustomSpriteBound/Myrtrice2.png b/Game/Enemies/CustomSpriteBound/Myrtrice2.png new file mode 100644 index 000000000..999928332 Binary files /dev/null and b/Game/Enemies/CustomSpriteBound/Myrtrice2.png differ diff --git a/Game/Enemies/CustomSpriteBound/Myrtrice3.png b/Game/Enemies/CustomSpriteBound/Myrtrice3.png new file mode 100644 index 000000000..8d55417e1 Binary files /dev/null and b/Game/Enemies/CustomSpriteBound/Myrtrice3.png differ diff --git a/Game/Enemies/CustomSpriteBound/Nara.png b/Game/Enemies/CustomSpriteBound/Nara.png new file mode 100644 index 000000000..a71cb04ba Binary files /dev/null and b/Game/Enemies/CustomSpriteBound/Nara.png differ diff --git a/Game/Enemies/CustomSpriteBound/Rai.png b/Game/Enemies/CustomSpriteBound/Rai.png new file mode 100644 index 000000000..3dba53bdd Binary files /dev/null and b/Game/Enemies/CustomSpriteBound/Rai.png differ diff --git a/Game/Enemies/CustomSpriteBound/Rai2.png b/Game/Enemies/CustomSpriteBound/Rai2.png new file mode 100644 index 000000000..3dba53bdd Binary files /dev/null and b/Game/Enemies/CustomSpriteBound/Rai2.png differ diff --git a/Game/Enemies/CustomSpriteBound/Rook.png b/Game/Enemies/CustomSpriteBound/Rook.png new file mode 100644 index 000000000..12da0e3fd Binary files /dev/null and b/Game/Enemies/CustomSpriteBound/Rook.png differ diff --git a/Game/Enemies/CustomSpriteBound/Selly.png b/Game/Enemies/CustomSpriteBound/Selly.png new file mode 100644 index 000000000..01a5b377f Binary files /dev/null and b/Game/Enemies/CustomSpriteBound/Selly.png differ diff --git a/Game/Enemies/CustomSpriteBound/Viola.png b/Game/Enemies/CustomSpriteBound/Viola.png new file mode 100644 index 000000000..6fd7b3830 Binary files /dev/null and b/Game/Enemies/CustomSpriteBound/Viola.png differ diff --git a/Game/Enemies/Cyborg.png b/Game/Enemies/Cyborg.png new file mode 100644 index 000000000..b343b69f9 Binary files /dev/null and b/Game/Enemies/Cyborg.png differ diff --git a/Game/Enemies/CyborgBerserker.png b/Game/Enemies/CyborgBerserker.png new file mode 100644 index 000000000..f6cc68e15 Binary files /dev/null and b/Game/Enemies/CyborgBerserker.png differ diff --git a/Game/Enemies/CyborgEnforcer.png b/Game/Enemies/CyborgEnforcer.png new file mode 100644 index 000000000..348f7309f Binary files /dev/null and b/Game/Enemies/CyborgEnforcer.png differ diff --git a/Game/Enemies/CyborgGuardian.png b/Game/Enemies/CyborgGuardian.png new file mode 100644 index 000000000..a234113d4 Binary files /dev/null and b/Game/Enemies/CyborgGuardian.png differ diff --git a/Game/Enemies/Demon.png b/Game/Enemies/Demon.png index c096319f6..2283b4de2 100644 Binary files a/Game/Enemies/Demon.png and b/Game/Enemies/Demon.png differ diff --git a/Game/Enemies/DemonEye.png b/Game/Enemies/DemonEye.png new file mode 100644 index 000000000..22baa46f2 Binary files /dev/null and b/Game/Enemies/DemonEye.png differ diff --git a/Game/Enemies/DemonMoon.png b/Game/Enemies/DemonMoon.png index 3842e9c2b..b287ee4f3 100644 Binary files a/Game/Enemies/DemonMoon.png and b/Game/Enemies/DemonMoon.png differ diff --git a/Game/Enemies/DemonStar.png b/Game/Enemies/DemonStar.png index 7008b91d4..86b13b456 100644 Binary files a/Game/Enemies/DemonStar.png and b/Game/Enemies/DemonStar.png differ diff --git a/Game/Enemies/DemonVoid.png b/Game/Enemies/DemonVoid.png new file mode 100644 index 000000000..7a18ebf50 Binary files /dev/null and b/Game/Enemies/DemonVoid.png differ diff --git a/Game/Enemies/DirtPile.png b/Game/Enemies/DirtPile.png new file mode 100644 index 000000000..840e0a0e4 Binary files /dev/null and b/Game/Enemies/DirtPile.png differ diff --git a/Game/Enemies/DollTransport.png b/Game/Enemies/DollTransport.png new file mode 100644 index 000000000..edfa6657f Binary files /dev/null and b/Game/Enemies/DollTransport.png differ diff --git a/Game/Enemies/DollmakerBoss1.png b/Game/Enemies/DollmakerBoss1.png index c3631eab8..b1e45a1c1 100644 Binary files a/Game/Enemies/DollmakerBoss1.png and b/Game/Enemies/DollmakerBoss1.png differ diff --git a/Game/Enemies/DollmakerBoss2.png b/Game/Enemies/DollmakerBoss2.png index e0e2de7fa..9f8cfe716 100644 Binary files a/Game/Enemies/DollmakerBoss2.png and b/Game/Enemies/DollmakerBoss2.png differ diff --git a/Game/Enemies/DollmakerBoss3.png b/Game/Enemies/DollmakerBoss3.png index 8c5048dc1..eaeefe590 100644 Binary files a/Game/Enemies/DollmakerBoss3.png and b/Game/Enemies/DollmakerBoss3.png differ diff --git a/Game/Enemies/DragonFlower.png b/Game/Enemies/DragonFlower.png new file mode 100644 index 000000000..ad8e696fb Binary files /dev/null and b/Game/Enemies/DragonFlower.png differ diff --git a/Game/Enemies/DragonGirlCrystal.png b/Game/Enemies/DragonGirlCrystal.png new file mode 100644 index 000000000..be6f84271 Binary files /dev/null and b/Game/Enemies/DragonGirlCrystal.png differ diff --git a/Game/Enemies/DragonGirlIce.png b/Game/Enemies/DragonGirlIce.png new file mode 100644 index 000000000..62224afdf Binary files /dev/null and b/Game/Enemies/DragonGirlIce.png differ diff --git a/Game/Enemies/DragonGirlPoison.png b/Game/Enemies/DragonGirlPoison.png new file mode 100644 index 000000000..da85e6404 Binary files /dev/null and b/Game/Enemies/DragonGirlPoison.png differ diff --git a/Game/Enemies/DragonGirlShadow.png b/Game/Enemies/DragonGirlShadow.png new file mode 100644 index 000000000..f1699bec9 Binary files /dev/null and b/Game/Enemies/DragonGirlShadow.png differ diff --git a/Game/Enemies/DragonIce.png b/Game/Enemies/DragonIce.png index 15f20893d..30f6301f8 100644 Binary files a/Game/Enemies/DragonIce.png and b/Game/Enemies/DragonIce.png differ diff --git a/Game/Enemies/DragonQueenCrystal.png b/Game/Enemies/DragonQueenCrystal.png new file mode 100644 index 000000000..6a4b8ae94 Binary files /dev/null and b/Game/Enemies/DragonQueenCrystal.png differ diff --git a/Game/Enemies/DragonQueenIce.png b/Game/Enemies/DragonQueenIce.png new file mode 100644 index 000000000..292d7e03c Binary files /dev/null and b/Game/Enemies/DragonQueenIce.png differ diff --git a/Game/Enemies/DragonQueenPoison.png b/Game/Enemies/DragonQueenPoison.png new file mode 100644 index 000000000..3857f07ad Binary files /dev/null and b/Game/Enemies/DragonQueenPoison.png differ diff --git a/Game/Enemies/DragonQueenShadow.png b/Game/Enemies/DragonQueenShadow.png new file mode 100644 index 000000000..ba79608b9 Binary files /dev/null and b/Game/Enemies/DragonQueenShadow.png differ diff --git a/Game/Enemies/DragonVineFlower.png b/Game/Enemies/DragonVineFlower.png new file mode 100644 index 000000000..7279d60cd Binary files /dev/null and b/Game/Enemies/DragonVineFlower.png differ diff --git a/Game/Enemies/DragonVinePlant.png b/Game/Enemies/DragonVinePlant.png new file mode 100644 index 000000000..7279d60cd Binary files /dev/null and b/Game/Enemies/DragonVinePlant.png differ diff --git a/Game/Enemies/Drone.png b/Game/Enemies/Drone.png index 677d183d0..2d910bbb0 100644 Binary files a/Game/Enemies/Drone.png and b/Game/Enemies/Drone.png differ diff --git a/Game/Enemies/DroneGuardian.png b/Game/Enemies/DroneGuardian.png new file mode 100644 index 000000000..b54e9a5e0 Binary files /dev/null and b/Game/Enemies/DroneGuardian.png differ diff --git a/Game/Enemies/DroneNode.png b/Game/Enemies/DroneNode.png new file mode 100644 index 000000000..d37a90d89 Binary files /dev/null and b/Game/Enemies/DroneNode.png differ diff --git a/Game/Enemies/EarthMote.png b/Game/Enemies/EarthMote.png index 56e5ca970..55646c63c 100644 Binary files a/Game/Enemies/EarthMote.png and b/Game/Enemies/EarthMote.png differ diff --git a/Game/Enemies/ElementalLatex.png b/Game/Enemies/ElementalLatex.png index c3766ae58..512ffd3a1 100644 Binary files a/Game/Enemies/ElementalLatex.png and b/Game/Enemies/ElementalLatex.png differ diff --git a/Game/Enemies/ElementalRope.png b/Game/Enemies/ElementalRope.png index 479fc9040..699932cda 100644 Binary files a/Game/Enemies/ElementalRope.png and b/Game/Enemies/ElementalRope.png differ diff --git a/Game/Enemies/ElementalRubber.png b/Game/Enemies/ElementalRubber.png new file mode 100644 index 000000000..552480cf3 Binary files /dev/null and b/Game/Enemies/ElementalRubber.png differ diff --git a/Game/Enemies/EncasedDollMetal.png b/Game/Enemies/EncasedDollMetal.png new file mode 100644 index 000000000..cc9ef610c Binary files /dev/null and b/Game/Enemies/EncasedDollMetal.png differ diff --git a/Game/Enemies/EncasedFactoryDollMetal.png b/Game/Enemies/EncasedFactoryDollMetal.png new file mode 100644 index 000000000..e3771888f Binary files /dev/null and b/Game/Enemies/EncasedFactoryDollMetal.png differ diff --git a/Game/Enemies/Enemies.zip b/Game/Enemies/Enemies.zip new file mode 100644 index 000000000..c822b8aba Binary files /dev/null and b/Game/Enemies/Enemies.zip differ diff --git a/Game/Enemies/EnforcerBot.png b/Game/Enemies/EnforcerBot.png index b85c3d0f0..bd56e64ca 100644 Binary files a/Game/Enemies/EnforcerBot.png and b/Game/Enemies/EnforcerBot.png differ diff --git a/Game/Enemies/EnforcerBotGuardian.png b/Game/Enemies/EnforcerBotGuardian.png new file mode 100644 index 000000000..f49912cf1 Binary files /dev/null and b/Game/Enemies/EnforcerBotGuardian.png differ diff --git a/Game/Enemies/EpicenterCursed.png b/Game/Enemies/EpicenterCursed.png new file mode 100644 index 000000000..b09d383fa Binary files /dev/null and b/Game/Enemies/EpicenterCursed.png differ diff --git a/Game/Enemies/EpicenterCursed2.png b/Game/Enemies/EpicenterCursed2.png new file mode 100644 index 000000000..5da5b5f73 Binary files /dev/null and b/Game/Enemies/EpicenterCursed2.png differ diff --git a/Game/Enemies/ExplosiveBarrel.png b/Game/Enemies/ExplosiveBarrel.png new file mode 100644 index 000000000..2c93025e8 Binary files /dev/null and b/Game/Enemies/ExplosiveBarrel.png differ diff --git a/Game/Enemies/FastSlime.png b/Game/Enemies/FastSlime.png index 392b1f392..6258ef4ad 100644 Binary files a/Game/Enemies/FastSlime.png and b/Game/Enemies/FastSlime.png differ diff --git a/Game/Enemies/FireElemental.png b/Game/Enemies/FireElemental.png index cfb11e47e..63c6652a7 100644 Binary files a/Game/Enemies/FireElemental.png and b/Game/Enemies/FireElemental.png differ diff --git a/Game/Enemies/ForceField.png b/Game/Enemies/ForceField.png index c0e4ecb2f..e5b0cf891 100644 Binary files a/Game/Enemies/ForceField.png and b/Game/Enemies/ForceField.png differ diff --git a/Game/Enemies/ForcefieldBot.png b/Game/Enemies/ForcefieldBot.png index b221385af..205537ab9 100644 Binary files a/Game/Enemies/ForcefieldBot.png and b/Game/Enemies/ForcefieldBot.png differ diff --git a/Game/Enemies/FreeDoll.png b/Game/Enemies/FreeDoll.png new file mode 100644 index 000000000..1a51327b3 Binary files /dev/null and b/Game/Enemies/FreeDoll.png differ diff --git a/Game/Enemies/Fuuka1.png b/Game/Enemies/Fuuka1.png index 0df32cb0e..46407695f 100644 Binary files a/Game/Enemies/Fuuka1.png and b/Game/Enemies/Fuuka1.png differ diff --git a/Game/Enemies/Fuuka2.png b/Game/Enemies/Fuuka2.png index 3f3dd195e..1c07d442c 100644 Binary files a/Game/Enemies/Fuuka2.png and b/Game/Enemies/Fuuka2.png differ diff --git a/Game/Enemies/FuukaPillar.png b/Game/Enemies/FuukaPillar.png new file mode 100644 index 000000000..2dd6443a6 Binary files /dev/null and b/Game/Enemies/FuukaPillar.png differ diff --git a/Game/Enemies/GagGeist.png b/Game/Enemies/GagGeist.png new file mode 100644 index 000000000..6bb2ff584 Binary files /dev/null and b/Game/Enemies/GagGeist.png differ diff --git a/Game/Enemies/GasBarrel.png b/Game/Enemies/GasBarrel.png new file mode 100644 index 000000000..8524392f2 Binary files /dev/null and b/Game/Enemies/GasBarrel.png differ diff --git a/Game/Enemies/Ghost.png b/Game/Enemies/Ghost.png index dfae2dd82..4628246f1 100644 Binary files a/Game/Enemies/Ghost.png and b/Game/Enemies/Ghost.png differ diff --git a/Game/Enemies/GlueTechnician.png b/Game/Enemies/GlueTechnician.png new file mode 100644 index 000000000..f3a17b165 Binary files /dev/null and b/Game/Enemies/GlueTechnician.png differ diff --git a/Game/Enemies/Golem.png b/Game/Enemies/Golem.png index 333b5380b..83489e10f 100644 Binary files a/Game/Enemies/Golem.png and b/Game/Enemies/Golem.png differ diff --git a/Game/Enemies/GreedyGhast.png b/Game/Enemies/GreedyGhast.png index 945c8e89a..abbfd5a7a 100644 Binary files a/Game/Enemies/GreedyGhast.png and b/Game/Enemies/GreedyGhast.png differ diff --git a/Game/Enemies/HolyOrb.png b/Game/Enemies/HolyOrb.png new file mode 100644 index 000000000..b2be27bb6 Binary files /dev/null and b/Game/Enemies/HolyOrb.png differ diff --git a/Game/Enemies/HugHorror.png b/Game/Enemies/HugHorror.png index e4d77129e..72e14d7f5 100644 Binary files a/Game/Enemies/HugHorror.png and b/Game/Enemies/HugHorror.png differ diff --git a/Game/Enemies/IceWall.png b/Game/Enemies/IceWall.png new file mode 100644 index 000000000..b676cfda2 Binary files /dev/null and b/Game/Enemies/IceWall.png differ diff --git a/Game/Enemies/KeeperEarth.png b/Game/Enemies/KeeperEarth.png new file mode 100644 index 000000000..10a2214c8 Binary files /dev/null and b/Game/Enemies/KeeperEarth.png differ diff --git a/Game/Enemies/KeeperFire.png b/Game/Enemies/KeeperFire.png new file mode 100644 index 000000000..b77d625d1 Binary files /dev/null and b/Game/Enemies/KeeperFire.png differ diff --git a/Game/Enemies/LabAssistant.png b/Game/Enemies/LabAssistant.png new file mode 100644 index 000000000..2a94afd1d Binary files /dev/null and b/Game/Enemies/LabAssistant.png differ diff --git a/Game/Enemies/LatexCube.png b/Game/Enemies/LatexCube.png new file mode 100644 index 000000000..b894ced31 Binary files /dev/null and b/Game/Enemies/LatexCube.png differ diff --git a/Game/Enemies/LatexCubeHidden.png b/Game/Enemies/LatexCubeHidden.png new file mode 100644 index 000000000..59bcb076f Binary files /dev/null and b/Game/Enemies/LatexCubeHidden.png differ diff --git a/Game/Enemies/LatexCubeMetal.png b/Game/Enemies/LatexCubeMetal.png new file mode 100644 index 000000000..5c57ec678 Binary files /dev/null and b/Game/Enemies/LatexCubeMetal.png differ diff --git a/Game/Enemies/LatexCubeSmall.png b/Game/Enemies/LatexCubeSmall.png new file mode 100644 index 000000000..9cc3004e8 Binary files /dev/null and b/Game/Enemies/LatexCubeSmall.png differ diff --git a/Game/Enemies/LatexCubeSmallHidden.png b/Game/Enemies/LatexCubeSmallHidden.png new file mode 100644 index 000000000..59bcb076f Binary files /dev/null and b/Game/Enemies/LatexCubeSmallHidden.png differ diff --git a/Game/Enemies/LatexSprayer.png b/Game/Enemies/LatexSprayer.png new file mode 100644 index 000000000..41914f1da Binary files /dev/null and b/Game/Enemies/LatexSprayer.png differ diff --git a/Game/Enemies/LatexStorageTank.png b/Game/Enemies/LatexStorageTank.png new file mode 100644 index 000000000..f5f7187e5 Binary files /dev/null and b/Game/Enemies/LatexStorageTank.png differ diff --git a/Game/Enemies/LiquidMetalCube.png b/Game/Enemies/LiquidMetalCube.png new file mode 100644 index 000000000..8b85da4fe Binary files /dev/null and b/Game/Enemies/LiquidMetalCube.png differ diff --git a/Game/Enemies/LockMaster.png b/Game/Enemies/LockMaster.png new file mode 100644 index 000000000..29ef5452f Binary files /dev/null and b/Game/Enemies/LockMaster.png differ diff --git a/Game/Enemies/MaidKnightHeavy.png b/Game/Enemies/MaidKnightHeavy.png new file mode 100644 index 000000000..e50a00a6a Binary files /dev/null and b/Game/Enemies/MaidKnightHeavy.png differ diff --git a/Game/Enemies/MaidKnightHeavy_Equip.png b/Game/Enemies/MaidKnightHeavy_Equip.png new file mode 100644 index 000000000..3ffee25c0 Binary files /dev/null and b/Game/Enemies/MaidKnightHeavy_Equip.png differ diff --git a/Game/Enemies/MaidKnightLight.png b/Game/Enemies/MaidKnightLight.png new file mode 100644 index 000000000..5c82a9651 Binary files /dev/null and b/Game/Enemies/MaidKnightLight.png differ diff --git a/Game/Enemies/MaidKnightLight_Aim.png b/Game/Enemies/MaidKnightLight_Aim.png new file mode 100644 index 000000000..3cf826caa Binary files /dev/null and b/Game/Enemies/MaidKnightLight_Aim.png differ diff --git a/Game/Enemies/MaidKnightLight_Equip.png b/Game/Enemies/MaidKnightLight_Equip.png new file mode 100644 index 000000000..b76bd339b Binary files /dev/null and b/Game/Enemies/MaidKnightLight_Equip.png differ diff --git a/Game/Enemies/MaidforceMini.png b/Game/Enemies/MaidforceMini.png new file mode 100644 index 000000000..996cc88ca Binary files /dev/null and b/Game/Enemies/MaidforceMini.png differ diff --git a/Game/Enemies/MimicLatex.png b/Game/Enemies/MimicLatex.png new file mode 100644 index 000000000..a9be4635d Binary files /dev/null and b/Game/Enemies/MimicLatex.png differ diff --git a/Game/Enemies/MummyElevator.png b/Game/Enemies/MummyElevator.png new file mode 100644 index 000000000..b0233f808 Binary files /dev/null and b/Game/Enemies/MummyElevator.png differ diff --git a/Game/Enemies/NatureSpirit.png b/Game/Enemies/NatureSpirit.png new file mode 100644 index 000000000..2013080c6 Binary files /dev/null and b/Game/Enemies/NatureSpirit.png differ diff --git a/Game/Enemies/Observer.png b/Game/Enemies/Observer.png new file mode 100644 index 000000000..ad027e0fc Binary files /dev/null and b/Game/Enemies/Observer.png differ diff --git a/Game/Enemies/OldDroneNode.png b/Game/Enemies/OldDroneNode.png new file mode 100644 index 000000000..36763bed6 Binary files /dev/null and b/Game/Enemies/OldDroneNode.png differ diff --git a/Game/Enemies/OneBar.png b/Game/Enemies/OneBar.png new file mode 100644 index 000000000..303d9a9ab Binary files /dev/null and b/Game/Enemies/OneBar.png differ diff --git a/Game/Enemies/PinkAlchemist.png b/Game/Enemies/PinkAlchemist.png new file mode 100644 index 000000000..5759ec4b7 Binary files /dev/null and b/Game/Enemies/PinkAlchemist.png differ diff --git a/Game/Enemies/PinkAlkahestor.png b/Game/Enemies/PinkAlkahestor.png new file mode 100644 index 000000000..033509fe4 Binary files /dev/null and b/Game/Enemies/PinkAlkahestor.png differ diff --git a/Game/Enemies/PinkGlueTechnician.png b/Game/Enemies/PinkGlueTechnician.png new file mode 100644 index 000000000..52984cc90 Binary files /dev/null and b/Game/Enemies/PinkGlueTechnician.png differ diff --git a/Game/Enemies/PinkLabAssistant.png b/Game/Enemies/PinkLabAssistant.png new file mode 100644 index 000000000..b7702d3e8 Binary files /dev/null and b/Game/Enemies/PinkLabAssistant.png differ diff --git a/Game/Enemies/Poltergeist.png b/Game/Enemies/Poltergeist.png new file mode 100644 index 000000000..b06c53983 Binary files /dev/null and b/Game/Enemies/Poltergeist.png differ diff --git a/Game/Enemies/RubberBarrel.png b/Game/Enemies/RubberBarrel.png new file mode 100644 index 000000000..614e93929 Binary files /dev/null and b/Game/Enemies/RubberBarrel.png differ diff --git a/Game/Enemies/ShadyQuest.png b/Game/Enemies/ShadyQuest.png new file mode 100644 index 000000000..845b46a28 Binary files /dev/null and b/Game/Enemies/ShadyQuest.png differ diff --git a/Game/Enemies/SkeletonArcher.png b/Game/Enemies/SkeletonArcher.png new file mode 100644 index 000000000..3f1c4434c Binary files /dev/null and b/Game/Enemies/SkeletonArcher.png differ diff --git a/Game/Enemies/SlimeAdv.png b/Game/Enemies/SlimeAdv.png index 17a365904..b16a0e4a6 100644 Binary files a/Game/Enemies/SlimeAdv.png and b/Game/Enemies/SlimeAdv.png differ diff --git a/Game/Enemies/SlimeKraken.png b/Game/Enemies/SlimeKraken.png new file mode 100644 index 000000000..befcfcd30 Binary files /dev/null and b/Game/Enemies/SlimeKraken.png differ diff --git a/Game/Enemies/SmallSlime.png b/Game/Enemies/SmallSlime.png index f03d08cc4..003f2662f 100644 Binary files a/Game/Enemies/SmallSlime.png and b/Game/Enemies/SmallSlime.png differ diff --git a/Game/Enemies/SmallSlimeLeaper.png b/Game/Enemies/SmallSlimeLeaper.png index 2ac061825..f4a769ec9 100644 Binary files a/Game/Enemies/SmallSlimeLeaper.png and b/Game/Enemies/SmallSlimeLeaper.png differ diff --git a/Game/Enemies/TapeBot.png b/Game/Enemies/TapeBot.png index f9d7d2ba5..108c5a91c 100644 Binary files a/Game/Enemies/TapeBot.png and b/Game/Enemies/TapeBot.png differ diff --git a/Game/Enemies/TapeDrone.png b/Game/Enemies/TapeDrone.png new file mode 100644 index 000000000..bf2adf20f Binary files /dev/null and b/Game/Enemies/TapeDrone.png differ diff --git a/Game/Enemies/TheWarden1.png b/Game/Enemies/TheWarden1.png new file mode 100644 index 000000000..0ea281a7c Binary files /dev/null and b/Game/Enemies/TheWarden1.png differ diff --git a/Game/Enemies/TheWarden2.png b/Game/Enemies/TheWarden2.png new file mode 100644 index 000000000..6faf285e2 Binary files /dev/null and b/Game/Enemies/TheWarden2.png differ diff --git a/Game/Enemies/TickleTerror.png b/Game/Enemies/TickleTerror.png index 1aa4673d6..f0553cd7a 100644 Binary files a/Game/Enemies/TickleTerror.png and b/Game/Enemies/TickleTerror.png differ diff --git a/Game/Enemies/TimeGhost.png b/Game/Enemies/TimeGhost.png new file mode 100644 index 000000000..6228a6dfd Binary files /dev/null and b/Game/Enemies/TimeGhost.png differ diff --git a/Game/Enemies/VineSpitter.png b/Game/Enemies/VineSpitter.png new file mode 100644 index 000000000..a88c64cce Binary files /dev/null and b/Game/Enemies/VineSpitter.png differ diff --git a/Game/Enemies/WallDoor.png b/Game/Enemies/WallDoor.png new file mode 100644 index 000000000..e342f7ebc Binary files /dev/null and b/Game/Enemies/WallDoor.png differ diff --git a/Game/Enemies/WardenArcher.png b/Game/Enemies/WardenArcher.png new file mode 100644 index 000000000..8c4df45ed Binary files /dev/null and b/Game/Enemies/WardenArcher.png differ diff --git a/Game/Enemies/WardenFighter.png b/Game/Enemies/WardenFighter.png new file mode 100644 index 000000000..b6f6fe529 Binary files /dev/null and b/Game/Enemies/WardenFighter.png differ diff --git a/Game/Enemies/WardenMage.png b/Game/Enemies/WardenMage.png new file mode 100644 index 000000000..d6d7c3d6e Binary files /dev/null and b/Game/Enemies/WardenMage.png differ diff --git a/Game/Enemies/WaterMote.png b/Game/Enemies/WaterMote.png index bc9fa31e4..43f49e9cd 100644 Binary files a/Game/Enemies/WaterMote.png and b/Game/Enemies/WaterMote.png differ diff --git a/Game/Enemies/WitchApprentice.png b/Game/Enemies/WitchApprentice.png new file mode 100644 index 000000000..48550609b Binary files /dev/null and b/Game/Enemies/WitchApprentice.png differ diff --git a/Game/Enemies/WitchAqua.png b/Game/Enemies/WitchAqua.png new file mode 100644 index 000000000..8548bc880 Binary files /dev/null and b/Game/Enemies/WitchAqua.png differ diff --git a/Game/Enemies/WitchShibari.png b/Game/Enemies/WitchShibari.png new file mode 100644 index 000000000..6985c7def Binary files /dev/null and b/Game/Enemies/WitchShibari.png differ diff --git a/Game/Enemies/WolfServer.png b/Game/Enemies/WolfServer.png new file mode 100644 index 000000000..c7ee00ab7 Binary files /dev/null and b/Game/Enemies/WolfServer.png differ diff --git a/Game/EnemiesBound/Adventurer_Brat.png b/Game/EnemiesBound/Adventurer_Brat.png new file mode 100644 index 000000000..55ffa44c2 Binary files /dev/null and b/Game/EnemiesBound/Adventurer_Brat.png differ diff --git a/Game/EnemiesBound/Adventurer_Dom.png b/Game/EnemiesBound/Adventurer_Dom.png new file mode 100644 index 000000000..dbe770f78 Binary files /dev/null and b/Game/EnemiesBound/Adventurer_Dom.png differ diff --git a/Game/EnemiesBound/Adventurer_Sub.png b/Game/EnemiesBound/Adventurer_Sub.png new file mode 100644 index 000000000..115e9c073 Binary files /dev/null and b/Game/EnemiesBound/Adventurer_Sub.png differ diff --git a/Game/EnemiesBound/Adventurer_Switch.png b/Game/EnemiesBound/Adventurer_Switch.png new file mode 100644 index 000000000..a23a430af Binary files /dev/null and b/Game/EnemiesBound/Adventurer_Switch.png differ diff --git a/Game/EnemiesBound/ClericHigh.png b/Game/EnemiesBound/ClericHigh.png new file mode 100644 index 000000000..b4278ca9b Binary files /dev/null and b/Game/EnemiesBound/ClericHigh.png differ diff --git a/Game/EnemiesBound/CuffedGirl.png b/Game/EnemiesBound/CuffedGirl.png new file mode 100644 index 000000000..4daa684e7 Binary files /dev/null and b/Game/EnemiesBound/CuffedGirl.png differ diff --git a/Game/EnemiesBound/CuffedGirl2.png b/Game/EnemiesBound/CuffedGirl2.png new file mode 100644 index 000000000..85e6a7e49 Binary files /dev/null and b/Game/EnemiesBound/CuffedGirl2.png differ diff --git a/Game/EnemiesBound/Cyborg.png b/Game/EnemiesBound/Cyborg.png new file mode 100644 index 000000000..aecb6d823 Binary files /dev/null and b/Game/EnemiesBound/Cyborg.png differ diff --git a/Game/EnemiesBound/CyborgBerserker.png b/Game/EnemiesBound/CyborgBerserker.png new file mode 100644 index 000000000..c833207e8 Binary files /dev/null and b/Game/EnemiesBound/CyborgBerserker.png differ diff --git a/Game/EnemiesBound/CyborgEnforcer.png b/Game/EnemiesBound/CyborgEnforcer.png new file mode 100644 index 000000000..3d0b4b076 Binary files /dev/null and b/Game/EnemiesBound/CyborgEnforcer.png differ diff --git a/Game/EnemiesBound/CyborgGuardian.png b/Game/EnemiesBound/CyborgGuardian.png new file mode 100644 index 000000000..0689e88c0 Binary files /dev/null and b/Game/EnemiesBound/CyborgGuardian.png differ diff --git a/Game/EnemiesBound/Demon.png b/Game/EnemiesBound/Demon.png index 3dc2a0e52..1053c362c 100644 Binary files a/Game/EnemiesBound/Demon.png and b/Game/EnemiesBound/Demon.png differ diff --git a/Game/EnemiesBound/Deputy.png b/Game/EnemiesBound/Deputy.png new file mode 100644 index 000000000..48abd3b2d Binary files /dev/null and b/Game/EnemiesBound/Deputy.png differ diff --git a/Game/EnemiesBound/DollmakerBoss.png b/Game/EnemiesBound/DollmakerBoss.png index b2a7ab3af..90be59fab 100644 Binary files a/Game/EnemiesBound/DollmakerBoss.png and b/Game/EnemiesBound/DollmakerBoss.png differ diff --git a/Game/EnemiesBound/ElementalLatex.png b/Game/EnemiesBound/ElementalLatex.png index 049d7354f..248f85d3f 100644 Binary files a/Game/EnemiesBound/ElementalLatex.png and b/Game/EnemiesBound/ElementalLatex.png differ diff --git a/Game/EnemiesBound/ElementalRope.png b/Game/EnemiesBound/ElementalRope.png index 7cdc5fb14..ca7728310 100644 Binary files a/Game/EnemiesBound/ElementalRope.png and b/Game/EnemiesBound/ElementalRope.png differ diff --git a/Game/EnemiesBound/ElementalRubber.png b/Game/EnemiesBound/ElementalRubber.png new file mode 100644 index 000000000..1fa585947 Binary files /dev/null and b/Game/EnemiesBound/ElementalRubber.png differ diff --git a/Game/EnemiesBound/EncasedFactoryDollMetal.png b/Game/EnemiesBound/EncasedFactoryDollMetal.png new file mode 100644 index 000000000..63b326b10 Binary files /dev/null and b/Game/EnemiesBound/EncasedFactoryDollMetal.png differ diff --git a/Game/EnemiesBound/Fuuka.png b/Game/EnemiesBound/Fuuka.png new file mode 100644 index 000000000..7bd8f831e Binary files /dev/null and b/Game/EnemiesBound/Fuuka.png differ diff --git a/Game/EnemiesBound/GlueTechnician.png b/Game/EnemiesBound/GlueTechnician.png new file mode 100644 index 000000000..295472461 Binary files /dev/null and b/Game/EnemiesBound/GlueTechnician.png differ diff --git a/Game/EnemiesBound/LabAssistant.png b/Game/EnemiesBound/LabAssistant.png new file mode 100644 index 000000000..d7b5b789e Binary files /dev/null and b/Game/EnemiesBound/LabAssistant.png differ diff --git a/Game/EnemiesBound/Librarian.png b/Game/EnemiesBound/Librarian.png new file mode 100644 index 000000000..c3a69a553 Binary files /dev/null and b/Game/EnemiesBound/Librarian.png differ diff --git a/Game/EnemiesBound/MaidKnightHeavy.png b/Game/EnemiesBound/MaidKnightHeavy.png new file mode 100644 index 000000000..088879dd3 Binary files /dev/null and b/Game/EnemiesBound/MaidKnightHeavy.png differ diff --git a/Game/EnemiesBound/MaidKnightLight.png b/Game/EnemiesBound/MaidKnightLight.png new file mode 100644 index 000000000..99f48bd99 Binary files /dev/null and b/Game/EnemiesBound/MaidKnightLight.png differ diff --git a/Game/EnemiesBound/MaidforceMini.png b/Game/EnemiesBound/MaidforceMini.png new file mode 100644 index 000000000..864887bde Binary files /dev/null and b/Game/EnemiesBound/MaidforceMini.png differ diff --git a/Game/EnemiesBound/Nurse.png b/Game/EnemiesBound/Nurse.png new file mode 100644 index 000000000..8d77b5fad Binary files /dev/null and b/Game/EnemiesBound/Nurse.png differ diff --git a/Game/EnemiesBound/TapedDoll.png b/Game/EnemiesBound/TapedDoll.png new file mode 100644 index 000000000..2ad114e59 Binary files /dev/null and b/Game/EnemiesBound/TapedDoll.png differ diff --git a/Game/EnemiesBound/TheWarden.png b/Game/EnemiesBound/TheWarden.png new file mode 100644 index 000000000..6155ebbb0 Binary files /dev/null and b/Game/EnemiesBound/TheWarden.png differ diff --git a/Game/EnemiesBound/WardenArcher.png b/Game/EnemiesBound/WardenArcher.png new file mode 100644 index 000000000..94d62e70e Binary files /dev/null and b/Game/EnemiesBound/WardenArcher.png differ diff --git a/Game/EnemiesBound/WardenFighter.png b/Game/EnemiesBound/WardenFighter.png new file mode 100644 index 000000000..0015b498a Binary files /dev/null and b/Game/EnemiesBound/WardenFighter.png differ diff --git a/Game/EnemiesBound/WardenMage.png b/Game/EnemiesBound/WardenMage.png new file mode 100644 index 000000000..7058568f4 Binary files /dev/null and b/Game/EnemiesBound/WardenMage.png differ diff --git a/Game/EnemiesBound/WitchApprentice.png b/Game/EnemiesBound/WitchApprentice.png new file mode 100644 index 000000000..eceff23cb Binary files /dev/null and b/Game/EnemiesBound/WitchApprentice.png differ diff --git a/Game/EnemiesBound/WitchRope.png b/Game/EnemiesBound/WitchRope.png new file mode 100644 index 000000000..3e727e5d7 Binary files /dev/null and b/Game/EnemiesBound/WitchRope.png differ diff --git a/Game/FloorGeneric/AngelTied.png b/Game/FloorGeneric/AngelTied.png new file mode 100644 index 000000000..93ba2247c Binary files /dev/null and b/Game/FloorGeneric/AngelTied.png differ diff --git a/Game/FloorGeneric/BondageMachine/DollHoriz.png b/Game/FloorGeneric/BondageMachine/DollHoriz.png new file mode 100644 index 000000000..4c8a61873 Binary files /dev/null and b/Game/FloorGeneric/BondageMachine/DollHoriz.png differ diff --git a/Game/FloorGeneric/BondageMachine/DollVert.png b/Game/FloorGeneric/BondageMachine/DollVert.png new file mode 100644 index 000000000..eebc163e0 Binary files /dev/null and b/Game/FloorGeneric/BondageMachine/DollVert.png differ diff --git a/Game/FloorGeneric/Chests/Kitty.png b/Game/FloorGeneric/Chests/Kitty.png new file mode 100644 index 000000000..6081b2d24 Binary files /dev/null and b/Game/FloorGeneric/Chests/Kitty.png differ diff --git a/Game/FloorGeneric/Chests/KittyOpen.png b/Game/FloorGeneric/Chests/KittyOpen.png new file mode 100644 index 000000000..46668c50a Binary files /dev/null and b/Game/FloorGeneric/Chests/KittyOpen.png differ diff --git a/Game/FloorGeneric/Chests/Robot.png b/Game/FloorGeneric/Chests/Robot.png new file mode 100644 index 000000000..aa87e583a Binary files /dev/null and b/Game/FloorGeneric/Chests/Robot.png differ diff --git a/Game/FloorGeneric/Chests/RobotOpen.png b/Game/FloorGeneric/Chests/RobotOpen.png new file mode 100644 index 000000000..6856e27fd Binary files /dev/null and b/Game/FloorGeneric/Chests/RobotOpen.png differ diff --git a/Game/FloorGeneric/ClamBed.png b/Game/FloorGeneric/ClamBed.png new file mode 100644 index 000000000..06d006a32 Binary files /dev/null and b/Game/FloorGeneric/ClamBed.png differ diff --git a/Game/FloorGeneric/CollapsedStairs.png b/Game/FloorGeneric/CollapsedStairs.png new file mode 100644 index 000000000..330a8f415 Binary files /dev/null and b/Game/FloorGeneric/CollapsedStairs.png differ diff --git a/Game/FloorGeneric/CommercePortal.png b/Game/FloorGeneric/CommercePortal.png new file mode 100644 index 000000000..c5393d0c6 Binary files /dev/null and b/Game/FloorGeneric/CommercePortal.png differ diff --git a/Game/FloorGeneric/CommercePortalReturn.png b/Game/FloorGeneric/CommercePortalReturn.png new file mode 100644 index 000000000..74c63eaf0 Binary files /dev/null and b/Game/FloorGeneric/CommercePortalReturn.png differ diff --git a/Game/FloorGeneric/Conveyor/DownLeft.png b/Game/FloorGeneric/Conveyor/DownLeft.png index 462f16d42..e9344b7ef 100644 Binary files a/Game/FloorGeneric/Conveyor/DownLeft.png and b/Game/FloorGeneric/Conveyor/DownLeft.png differ diff --git a/Game/FloorGeneric/Conveyor/DownRight.png b/Game/FloorGeneric/Conveyor/DownRight.png index 77d74bd97..60a09827c 100644 Binary files a/Game/FloorGeneric/Conveyor/DownRight.png and b/Game/FloorGeneric/Conveyor/DownRight.png differ diff --git a/Game/FloorGeneric/Conveyor/Left.png b/Game/FloorGeneric/Conveyor/Left.png index 855b9b369..bebf95153 100644 Binary files a/Game/FloorGeneric/Conveyor/Left.png and b/Game/FloorGeneric/Conveyor/Left.png differ diff --git a/Game/FloorGeneric/Conveyor/Right.png b/Game/FloorGeneric/Conveyor/Right.png index 937b3ad31..409666919 100644 Binary files a/Game/FloorGeneric/Conveyor/Right.png and b/Game/FloorGeneric/Conveyor/Right.png differ diff --git a/Game/FloorGeneric/Conveyor/SafetyDown.png b/Game/FloorGeneric/Conveyor/SafetyDown.png new file mode 100644 index 000000000..49a841139 Binary files /dev/null and b/Game/FloorGeneric/Conveyor/SafetyDown.png differ diff --git a/Game/FloorGeneric/Conveyor/SafetyLeft.png b/Game/FloorGeneric/Conveyor/SafetyLeft.png new file mode 100644 index 000000000..c5f45f5d9 Binary files /dev/null and b/Game/FloorGeneric/Conveyor/SafetyLeft.png differ diff --git a/Game/FloorGeneric/Conveyor/SafetyRight.png b/Game/FloorGeneric/Conveyor/SafetyRight.png new file mode 100644 index 000000000..7697a18e7 Binary files /dev/null and b/Game/FloorGeneric/Conveyor/SafetyRight.png differ diff --git a/Game/FloorGeneric/Conveyor/SafetyUp.png b/Game/FloorGeneric/Conveyor/SafetyUp.png new file mode 100644 index 000000000..c91407396 Binary files /dev/null and b/Game/FloorGeneric/Conveyor/SafetyUp.png differ diff --git a/Game/FloorGeneric/CrystalBase.png b/Game/FloorGeneric/CrystalBase.png new file mode 100644 index 000000000..26eb90b46 Binary files /dev/null and b/Game/FloorGeneric/CrystalBase.png differ diff --git a/Game/FloorGeneric/DimensionRift.png b/Game/FloorGeneric/DimensionRift.png new file mode 100644 index 000000000..dce8a8f9e Binary files /dev/null and b/Game/FloorGeneric/DimensionRift.png differ diff --git a/Game/FloorGeneric/Doors/CyberDoor.png b/Game/FloorGeneric/Doors/CyberDoor.png new file mode 100644 index 000000000..e9f6bb69f Binary files /dev/null and b/Game/FloorGeneric/Doors/CyberDoor.png differ diff --git a/Game/FloorGeneric/Doors/CyberDoorOpen.png b/Game/FloorGeneric/Doors/CyberDoorOpen.png new file mode 100644 index 000000000..9474cdedb Binary files /dev/null and b/Game/FloorGeneric/Doors/CyberDoorOpen.png differ diff --git a/Game/FloorGeneric/Doors/CyberDoorVert.png b/Game/FloorGeneric/Doors/CyberDoorVert.png new file mode 100644 index 000000000..8cd797089 Binary files /dev/null and b/Game/FloorGeneric/Doors/CyberDoorVert.png differ diff --git a/Game/FloorGeneric/Doors/CyberDoorVertCont.png b/Game/FloorGeneric/Doors/CyberDoorVertCont.png new file mode 100644 index 000000000..11037d9d8 Binary files /dev/null and b/Game/FloorGeneric/Doors/CyberDoorVertCont.png differ diff --git a/Game/FloorGeneric/Doors/CyberDoorVertOpen.png b/Game/FloorGeneric/Doors/CyberDoorVertOpen.png new file mode 100644 index 000000000..eebb5f9b3 Binary files /dev/null and b/Game/FloorGeneric/Doors/CyberDoorVertOpen.png differ diff --git a/Game/FloorGeneric/Doors/CyberDoorVertOpenCont.png b/Game/FloorGeneric/Doors/CyberDoorVertOpenCont.png new file mode 100644 index 000000000..eebb5f9b3 Binary files /dev/null and b/Game/FloorGeneric/Doors/CyberDoorVertOpenCont.png differ diff --git a/Game/FloorGeneric/Dummy0.png b/Game/FloorGeneric/Dummy0.png new file mode 100644 index 000000000..348ea3500 Binary files /dev/null and b/Game/FloorGeneric/Dummy0.png differ diff --git a/Game/FloorGeneric/Dummy1.png b/Game/FloorGeneric/Dummy1.png new file mode 100644 index 000000000..26eda6bf9 Binary files /dev/null and b/Game/FloorGeneric/Dummy1.png differ diff --git a/Game/FloorGeneric/Dummy2.png b/Game/FloorGeneric/Dummy2.png new file mode 100644 index 000000000..9a0ddcd00 Binary files /dev/null and b/Game/FloorGeneric/Dummy2.png differ diff --git a/Game/FloorGeneric/Elevator.png b/Game/FloorGeneric/Elevator.png new file mode 100644 index 000000000..312d664fd Binary files /dev/null and b/Game/FloorGeneric/Elevator.png differ diff --git a/Game/FloorGeneric/ElevatorDisabled.png b/Game/FloorGeneric/ElevatorDisabled.png new file mode 100644 index 000000000..10263a951 Binary files /dev/null and b/Game/FloorGeneric/ElevatorDisabled.png differ diff --git a/Game/FloorGeneric/EmptyPipe.png b/Game/FloorGeneric/EmptyPipe.png new file mode 100644 index 000000000..769e3403d Binary files /dev/null and b/Game/FloorGeneric/EmptyPipe.png differ diff --git a/Game/FloorGeneric/FutureBox.png b/Game/FloorGeneric/FutureBox.png new file mode 100644 index 000000000..3137bd62b Binary files /dev/null and b/Game/FloorGeneric/FutureBox.png differ diff --git a/Game/FloorGeneric/IceBase.png b/Game/FloorGeneric/IceBase.png new file mode 100644 index 000000000..a0fe6e6c3 Binary files /dev/null and b/Game/FloorGeneric/IceBase.png differ diff --git a/Game/FloorGeneric/LatexDisplayStand.png b/Game/FloorGeneric/LatexDisplayStand.png new file mode 100644 index 000000000..b99a3a5e4 Binary files /dev/null and b/Game/FloorGeneric/LatexDisplayStand.png differ diff --git a/Game/FloorGeneric/LatexPipe.png b/Game/FloorGeneric/LatexPipe.png new file mode 100644 index 000000000..2d4ac427d Binary files /dev/null and b/Game/FloorGeneric/LatexPipe.png differ diff --git a/Game/FloorGeneric/Portal.png b/Game/FloorGeneric/Portal.png new file mode 100644 index 000000000..a20548cd3 Binary files /dev/null and b/Game/FloorGeneric/Portal.png differ diff --git a/Game/FloorGeneric/Sarcophagus.png b/Game/FloorGeneric/Sarcophagus.png new file mode 100644 index 000000000..da39a3e80 Binary files /dev/null and b/Game/FloorGeneric/Sarcophagus.png differ diff --git a/Game/FloorGeneric/SarcophagusGone.png b/Game/FloorGeneric/SarcophagusGone.png new file mode 100644 index 000000000..3cd6e4530 Binary files /dev/null and b/Game/FloorGeneric/SarcophagusGone.png differ diff --git a/Game/FloorGeneric/ShadowBase.png b/Game/FloorGeneric/ShadowBase.png new file mode 100644 index 000000000..606b6b95c Binary files /dev/null and b/Game/FloorGeneric/ShadowBase.png differ diff --git a/Game/FloorGeneric/SpiralStairsDown.png b/Game/FloorGeneric/SpiralStairsDown.png new file mode 100644 index 000000000..339d7b8b0 Binary files /dev/null and b/Game/FloorGeneric/SpiralStairsDown.png differ diff --git a/Game/FloorGeneric/SpiralStairsUp.png b/Game/FloorGeneric/SpiralStairsUp.png new file mode 100644 index 000000000..5a12f4f8d Binary files /dev/null and b/Game/FloorGeneric/SpiralStairsUp.png differ diff --git a/Game/FloorGeneric/SummitTeleporter.png b/Game/FloorGeneric/SummitTeleporter.png new file mode 100644 index 000000000..e36fd33a7 Binary files /dev/null and b/Game/FloorGeneric/SummitTeleporter.png differ diff --git a/Game/FloorGeneric/TabletDetermination.png b/Game/FloorGeneric/TabletDetermination.png index fbe08cb6b..19d53da73 100644 Binary files a/Game/FloorGeneric/TabletDetermination.png and b/Game/FloorGeneric/TabletDetermination.png differ diff --git a/Game/FloorGeneric/TabletDetermination_2.png b/Game/FloorGeneric/TabletDetermination_2.png new file mode 100644 index 000000000..fbe08cb6b Binary files /dev/null and b/Game/FloorGeneric/TabletDetermination_2.png differ diff --git a/Game/FloorGeneric/TabletHeart.png b/Game/FloorGeneric/TabletHeart.png new file mode 100644 index 000000000..28bf5f681 Binary files /dev/null and b/Game/FloorGeneric/TabletHeart.png differ diff --git a/Game/FloorGeneric/TiedCourier.png b/Game/FloorGeneric/TiedCourier.png new file mode 100644 index 000000000..a349272d7 Binary files /dev/null and b/Game/FloorGeneric/TiedCourier.png differ diff --git a/Game/FloorGeneric/Viewscreen.png b/Game/FloorGeneric/Viewscreen.png new file mode 100644 index 000000000..2400b5bc1 Binary files /dev/null and b/Game/FloorGeneric/Viewscreen.png differ diff --git a/Game/FloorGeneric/VineBase.png b/Game/FloorGeneric/VineBase.png new file mode 100644 index 000000000..0409e59d8 Binary files /dev/null and b/Game/FloorGeneric/VineBase.png differ diff --git a/Game/FloorGeneric/WaterFoam.png b/Game/FloorGeneric/WaterFoam.png new file mode 100644 index 000000000..d684a8238 Binary files /dev/null and b/Game/FloorGeneric/WaterFoam.png differ diff --git a/Game/Floors/Floor_DemonTransition/Barrel.png b/Game/Floors/Floor_DemonTransition/Barrel.png new file mode 100644 index 000000000..4c0450c4c Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/Barrel.png differ diff --git a/Game/Floors/Floor_DemonTransition/Bars.png b/Game/Floors/Floor_DemonTransition/Bars.png new file mode 100644 index 000000000..0f1f07ff3 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/Bars.png differ diff --git a/Game/Floors/Floor_DemonTransition/BarsVert.png b/Game/Floors/Floor_DemonTransition/BarsVert.png new file mode 100644 index 000000000..583d3aee0 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/BarsVert.png differ diff --git a/Game/Floors/Floor_DemonTransition/BarsVertCont.png b/Game/Floors/Floor_DemonTransition/BarsVertCont.png new file mode 100644 index 000000000..e78f00726 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/BarsVertCont.png differ diff --git a/Game/Floors/Floor_DemonTransition/Brickwork.png b/Game/Floors/Floor_DemonTransition/Brickwork.png new file mode 100644 index 000000000..96eb1bd07 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/Brickwork.png differ diff --git a/Game/Floors/Floor_DemonTransition/Doodad.png b/Game/Floors/Floor_DemonTransition/Doodad.png new file mode 100644 index 000000000..b1eb75e00 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/Doodad.png differ diff --git a/Game/Floors/Floor_DemonTransition/Door.png b/Game/Floors/Floor_DemonTransition/Door.png new file mode 100644 index 000000000..836939e6e Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/Door.png differ diff --git a/Game/Floors/Floor_DemonTransition/DoorOpen.png b/Game/Floors/Floor_DemonTransition/DoorOpen.png new file mode 100644 index 000000000..fbce6aedf Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/DoorOpen.png differ diff --git a/Game/Floors/Floor_DemonTransition/DoorVert.png b/Game/Floors/Floor_DemonTransition/DoorVert.png new file mode 100644 index 000000000..f087c3134 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/DoorVert.png differ diff --git a/Game/Floors/Floor_DemonTransition/DoorVertCont.png b/Game/Floors/Floor_DemonTransition/DoorVertCont.png new file mode 100644 index 000000000..c1433bdcf Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/DoorVertCont.png differ diff --git a/Game/Floors/Floor_DemonTransition/DoorVertOpen.png b/Game/Floors/Floor_DemonTransition/DoorVertOpen.png new file mode 100644 index 000000000..387a750a7 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/DoorVertOpen.png differ diff --git a/Game/Floors/Floor_DemonTransition/DoorVertOpenCont.png b/Game/Floors/Floor_DemonTransition/DoorVertOpenCont.png new file mode 100644 index 000000000..3e2b86e42 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/DoorVertOpenCont.png differ diff --git a/Game/Floors/Floor_DemonTransition/Floor.png b/Game/Floors/Floor_DemonTransition/Floor.png new file mode 100644 index 000000000..96f799626 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/Floor.png differ diff --git a/Game/Floors/Floor_DemonTransition/Grate.png b/Game/Floors/Floor_DemonTransition/Grate.png new file mode 100644 index 000000000..17bd0afff Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/Grate.png differ diff --git a/Game/Floors/Floor_DemonTransition/GrateHoriz.png b/Game/Floors/Floor_DemonTransition/GrateHoriz.png new file mode 100644 index 000000000..3e1870bb1 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/GrateHoriz.png differ diff --git a/Game/Floors/Floor_DemonTransition/GrateVert.png b/Game/Floors/Floor_DemonTransition/GrateVert.png new file mode 100644 index 000000000..1f82d24de Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/GrateVert.png differ diff --git a/Game/Floors/Floor_DemonTransition/MimicBlock.png b/Game/Floors/Floor_DemonTransition/MimicBlock.png new file mode 100644 index 000000000..ea04ed5c5 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/MimicBlock.png differ diff --git a/Game/Floors/Floor_DemonTransition/OrbEmpty.png b/Game/Floors/Floor_DemonTransition/OrbEmpty.png new file mode 100644 index 000000000..edc6c75cd Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/OrbEmpty.png differ diff --git a/Game/Floors/Floor_DemonTransition/RubbleLooted.png b/Game/Floors/Floor_DemonTransition/RubbleLooted.png new file mode 100644 index 000000000..7dc1ec653 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/RubbleLooted.png differ diff --git a/Game/Floors/Floor_DemonTransition/Shrine.png b/Game/Floors/Floor_DemonTransition/Shrine.png new file mode 100644 index 000000000..237d08c9a Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/Shrine.png differ diff --git a/Game/Floors/Floor_DemonTransition/ShrineBroken.png b/Game/Floors/Floor_DemonTransition/ShrineBroken.png new file mode 100644 index 000000000..8b27b9d09 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/ShrineBroken.png differ diff --git a/Game/Floors/Floor_DemonTransition/ShrineC.png b/Game/Floors/Floor_DemonTransition/ShrineC.png new file mode 100644 index 000000000..ea2ddc87d Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/ShrineC.png differ diff --git a/Game/Floors/Floor_DemonTransition/ShrineEmpty.png b/Game/Floors/Floor_DemonTransition/ShrineEmpty.png new file mode 100644 index 000000000..95142b06f Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/ShrineEmpty.png differ diff --git a/Game/Floors/Floor_DemonTransition/Trap.png b/Game/Floors/Floor_DemonTransition/Trap.png new file mode 100644 index 000000000..de5554119 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/Trap.png differ diff --git a/Game/Floors/Floor_DemonTransition/Wall.png b/Game/Floors/Floor_DemonTransition/Wall.png new file mode 100644 index 000000000..f57139aa1 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/Wall.png differ diff --git a/Game/Floors/Floor_DemonTransition/WallR.png b/Game/Floors/Floor_DemonTransition/WallR.png new file mode 100644 index 000000000..f857efecd Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/WallR.png differ diff --git a/Game/Floors/Floor_DemonTransition/WallRVert.png b/Game/Floors/Floor_DemonTransition/WallRVert.png new file mode 100644 index 000000000..d4bcb5a2d Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/WallRVert.png differ diff --git a/Game/Floors/Floor_DemonTransition/WallVert.png b/Game/Floors/Floor_DemonTransition/WallVert.png new file mode 100644 index 000000000..7f0694bd1 Binary files /dev/null and b/Game/Floors/Floor_DemonTransition/WallVert.png differ diff --git a/Game/Floors/Floor_bel/WallR.png b/Game/Floors/Floor_bel/WallR.png new file mode 100644 index 000000000..938da497d Binary files /dev/null and b/Game/Floors/Floor_bel/WallR.png differ diff --git a/Game/Floors/Floor_bel/WallRVert.png b/Game/Floors/Floor_bel/WallRVert.png new file mode 100644 index 000000000..30f8f3038 Binary files /dev/null and b/Game/Floors/Floor_bel/WallRVert.png differ diff --git a/Game/Floors/Floor_cat/Wall.png b/Game/Floors/Floor_cat/Wall.png index 00bcd861f..784b97a5a 100644 Binary files a/Game/Floors/Floor_cat/Wall.png and b/Game/Floors/Floor_cat/Wall.png differ diff --git a/Game/Floors/Floor_cat/WallR.png b/Game/Floors/Floor_cat/WallR.png new file mode 100644 index 000000000..00995d3af Binary files /dev/null and b/Game/Floors/Floor_cat/WallR.png differ diff --git a/Game/Floors/Floor_cat/WallRVert.png b/Game/Floors/Floor_cat/WallRVert.png new file mode 100644 index 000000000..3892f18b0 Binary files /dev/null and b/Game/Floors/Floor_cat/WallRVert.png differ diff --git a/Game/Floors/Floor_cat/WallVert.png b/Game/Floors/Floor_cat/WallVert.png index dd50ccb7c..540c46b7e 100644 Binary files a/Game/Floors/Floor_cat/WallVert.png and b/Game/Floors/Floor_cat/WallVert.png differ diff --git a/Game/Floors/Floor_cav/Barrel.png b/Game/Floors/Floor_cav/Barrel.png new file mode 100644 index 000000000..2a46295d7 Binary files /dev/null and b/Game/Floors/Floor_cav/Barrel.png differ diff --git a/Game/Floors/Floor_cav/Bars.png b/Game/Floors/Floor_cav/Bars.png new file mode 100644 index 000000000..00e5a757d Binary files /dev/null and b/Game/Floors/Floor_cav/Bars.png differ diff --git a/Game/Floors/Floor_cav/BarsOld.png b/Game/Floors/Floor_cav/BarsOld.png new file mode 100644 index 000000000..a86c94cc0 Binary files /dev/null and b/Game/Floors/Floor_cav/BarsOld.png differ diff --git a/Game/Floors/Floor_cav/BarsVert.png b/Game/Floors/Floor_cav/BarsVert.png new file mode 100644 index 000000000..6151df913 Binary files /dev/null and b/Game/Floors/Floor_cav/BarsVert.png differ diff --git a/Game/Floors/Floor_cav/BarsVertCont.png b/Game/Floors/Floor_cav/BarsVertCont.png new file mode 100644 index 000000000..845a42217 Binary files /dev/null and b/Game/Floors/Floor_cav/BarsVertCont.png differ diff --git a/Game/Floors/Floor_cav/Brickwork.png b/Game/Floors/Floor_cav/Brickwork.png new file mode 100644 index 000000000..b6e1f85e8 Binary files /dev/null and b/Game/Floors/Floor_cav/Brickwork.png differ diff --git a/Game/Floors/Floor_cav/Doodad.png b/Game/Floors/Floor_cav/Doodad.png new file mode 100644 index 000000000..71052ff94 Binary files /dev/null and b/Game/Floors/Floor_cav/Doodad.png differ diff --git a/Game/Floors/Floor_cav/Door.png b/Game/Floors/Floor_cav/Door.png new file mode 100644 index 000000000..991e4e1e1 Binary files /dev/null and b/Game/Floors/Floor_cav/Door.png differ diff --git a/Game/Floors/Floor_cav/DoorOpen.png b/Game/Floors/Floor_cav/DoorOpen.png new file mode 100644 index 000000000..3b1591113 Binary files /dev/null and b/Game/Floors/Floor_cav/DoorOpen.png differ diff --git a/Game/Floors/Floor_cav/DoorVert.png b/Game/Floors/Floor_cav/DoorVert.png new file mode 100644 index 000000000..86dea040a Binary files /dev/null and b/Game/Floors/Floor_cav/DoorVert.png differ diff --git a/Game/Floors/Floor_cav/DoorVertCont.png b/Game/Floors/Floor_cav/DoorVertCont.png new file mode 100644 index 000000000..869d8e5bf Binary files /dev/null and b/Game/Floors/Floor_cav/DoorVertCont.png differ diff --git a/Game/Floors/Floor_cav/DoorVertOpen.png b/Game/Floors/Floor_cav/DoorVertOpen.png new file mode 100644 index 000000000..a1b7d1f04 Binary files /dev/null and b/Game/Floors/Floor_cav/DoorVertOpen.png differ diff --git a/Game/Floors/Floor_cav/DoorVertOpenCont.png b/Game/Floors/Floor_cav/DoorVertOpenCont.png new file mode 100644 index 000000000..1ce8dca42 Binary files /dev/null and b/Game/Floors/Floor_cav/DoorVertOpenCont.png differ diff --git a/Game/Floors/Floor_cav/Floor.png b/Game/Floors/Floor_cav/Floor.png new file mode 100644 index 000000000..32123439b Binary files /dev/null and b/Game/Floors/Floor_cav/Floor.png differ diff --git a/Game/Floors/Floor_cav/Grate.png b/Game/Floors/Floor_cav/Grate.png new file mode 100644 index 000000000..3b4bb6d2b Binary files /dev/null and b/Game/Floors/Floor_cav/Grate.png differ diff --git a/Game/Floors/Floor_cav/GrateHoriz.png b/Game/Floors/Floor_cav/GrateHoriz.png new file mode 100644 index 000000000..6346b3888 Binary files /dev/null and b/Game/Floors/Floor_cav/GrateHoriz.png differ diff --git a/Game/Floors/Floor_cav/GrateVert.png b/Game/Floors/Floor_cav/GrateVert.png new file mode 100644 index 000000000..ab4007b17 Binary files /dev/null and b/Game/Floors/Floor_cav/GrateVert.png differ diff --git a/Game/Floors/Floor_cav/MimicBlock.png b/Game/Floors/Floor_cav/MimicBlock.png new file mode 100644 index 000000000..424381534 Binary files /dev/null and b/Game/Floors/Floor_cav/MimicBlock.png differ diff --git a/Game/Floors/Floor_cav/OrbEmpty.png b/Game/Floors/Floor_cav/OrbEmpty.png new file mode 100644 index 000000000..5609adb0e Binary files /dev/null and b/Game/Floors/Floor_cav/OrbEmpty.png differ diff --git a/Game/Floors/Floor_cav/RubbleLooted.png b/Game/Floors/Floor_cav/RubbleLooted.png new file mode 100644 index 000000000..47c9bf089 Binary files /dev/null and b/Game/Floors/Floor_cav/RubbleLooted.png differ diff --git a/Game/Floors/Floor_cav/Shrine.png b/Game/Floors/Floor_cav/Shrine.png new file mode 100644 index 000000000..633621776 Binary files /dev/null and b/Game/Floors/Floor_cav/Shrine.png differ diff --git a/Game/Floors/Floor_cav/ShrineBroken.png b/Game/Floors/Floor_cav/ShrineBroken.png new file mode 100644 index 000000000..fbbc81f91 Binary files /dev/null and b/Game/Floors/Floor_cav/ShrineBroken.png differ diff --git a/Game/Floors/Floor_cav/ShrineC.png b/Game/Floors/Floor_cav/ShrineC.png new file mode 100644 index 000000000..e59575eb0 Binary files /dev/null and b/Game/Floors/Floor_cav/ShrineC.png differ diff --git a/Game/Floors/Floor_cav/ShrineEmpty.png b/Game/Floors/Floor_cav/ShrineEmpty.png new file mode 100644 index 000000000..6f3b636e4 Binary files /dev/null and b/Game/Floors/Floor_cav/ShrineEmpty.png differ diff --git a/Game/Floors/Floor_cav/StairsDown.png b/Game/Floors/Floor_cav/StairsDown.png new file mode 100644 index 000000000..251cfc212 Binary files /dev/null and b/Game/Floors/Floor_cav/StairsDown.png differ diff --git a/Game/Floors/Floor_cav/StairsUp.png b/Game/Floors/Floor_cav/StairsUp.png new file mode 100644 index 000000000..e4bb48e92 Binary files /dev/null and b/Game/Floors/Floor_cav/StairsUp.png differ diff --git a/Game/Floors/Floor_cav/Trap.png b/Game/Floors/Floor_cav/Trap.png new file mode 100644 index 000000000..98e690997 Binary files /dev/null and b/Game/Floors/Floor_cav/Trap.png differ diff --git a/Game/Floors/Floor_cav/Wall.png b/Game/Floors/Floor_cav/Wall.png new file mode 100644 index 000000000..fa5321134 Binary files /dev/null and b/Game/Floors/Floor_cav/Wall.png differ diff --git a/Game/Floors/Floor_cav/WallR.png b/Game/Floors/Floor_cav/WallR.png new file mode 100644 index 000000000..abc416040 Binary files /dev/null and b/Game/Floors/Floor_cav/WallR.png differ diff --git a/Game/Floors/Floor_cav/WallRVert.png b/Game/Floors/Floor_cav/WallRVert.png new file mode 100644 index 000000000..141ac40cd Binary files /dev/null and b/Game/Floors/Floor_cav/WallRVert.png differ diff --git a/Game/Floors/Floor_cav/WallVert.png b/Game/Floors/Floor_cav/WallVert.png new file mode 100644 index 000000000..f05089e18 Binary files /dev/null and b/Game/Floors/Floor_cav/WallVert.png differ diff --git a/Game/Floors/Floor_cry/WallR.png b/Game/Floors/Floor_cry/WallR.png new file mode 100644 index 000000000..5b7bc36d1 Binary files /dev/null and b/Game/Floors/Floor_cry/WallR.png differ diff --git a/Game/Floors/Floor_cry/WallRVert.png b/Game/Floors/Floor_cry/WallRVert.png new file mode 100644 index 000000000..f57e1419f Binary files /dev/null and b/Game/Floors/Floor_cry/WallRVert.png differ diff --git a/Game/Floors/Floor_cst/Barrel.png b/Game/Floors/Floor_cst/Barrel.png new file mode 100644 index 000000000..2af0fd925 Binary files /dev/null and b/Game/Floors/Floor_cst/Barrel.png differ diff --git a/Game/Floors/Floor_cst/Bars.png b/Game/Floors/Floor_cst/Bars.png new file mode 100644 index 000000000..d510d103a Binary files /dev/null and b/Game/Floors/Floor_cst/Bars.png differ diff --git a/Game/Floors/Floor_cst/BarsVert.png b/Game/Floors/Floor_cst/BarsVert.png new file mode 100644 index 000000000..d510d103a Binary files /dev/null and b/Game/Floors/Floor_cst/BarsVert.png differ diff --git a/Game/Floors/Floor_cst/BarsVertCont.png b/Game/Floors/Floor_cst/BarsVertCont.png new file mode 100644 index 000000000..d510d103a Binary files /dev/null and b/Game/Floors/Floor_cst/BarsVertCont.png differ diff --git a/Game/Floors/Floor_cst/Brickwork.png b/Game/Floors/Floor_cst/Brickwork.png new file mode 100644 index 000000000..e2f79ddd6 Binary files /dev/null and b/Game/Floors/Floor_cst/Brickwork.png differ diff --git a/Game/Floors/Floor_cst/Doodad.png b/Game/Floors/Floor_cst/Doodad.png new file mode 100644 index 000000000..64b8010e4 Binary files /dev/null and b/Game/Floors/Floor_cst/Doodad.png differ diff --git a/Game/Floors/Floor_cst/Door.png b/Game/Floors/Floor_cst/Door.png new file mode 100644 index 000000000..e5725ac81 Binary files /dev/null and b/Game/Floors/Floor_cst/Door.png differ diff --git a/Game/Floors/Floor_cst/DoorOpen.png b/Game/Floors/Floor_cst/DoorOpen.png new file mode 100644 index 000000000..4739098ce Binary files /dev/null and b/Game/Floors/Floor_cst/DoorOpen.png differ diff --git a/Game/Floors/Floor_cst/DoorVert.png b/Game/Floors/Floor_cst/DoorVert.png new file mode 100644 index 000000000..2dec37537 Binary files /dev/null and b/Game/Floors/Floor_cst/DoorVert.png differ diff --git a/Game/Floors/Floor_cst/DoorVertCont.png b/Game/Floors/Floor_cst/DoorVertCont.png new file mode 100644 index 000000000..1f07b9638 Binary files /dev/null and b/Game/Floors/Floor_cst/DoorVertCont.png differ diff --git a/Game/Floors/Floor_cst/DoorVertOpen.png b/Game/Floors/Floor_cst/DoorVertOpen.png new file mode 100644 index 000000000..799eeb790 Binary files /dev/null and b/Game/Floors/Floor_cst/DoorVertOpen.png differ diff --git a/Game/Floors/Floor_cst/DoorVertOpenCont.png b/Game/Floors/Floor_cst/DoorVertOpenCont.png new file mode 100644 index 000000000..27dc4d578 Binary files /dev/null and b/Game/Floors/Floor_cst/DoorVertOpenCont.png differ diff --git a/Game/Floors/Floor_cst/Floor.png b/Game/Floors/Floor_cst/Floor.png new file mode 100644 index 000000000..e2f79ddd6 Binary files /dev/null and b/Game/Floors/Floor_cst/Floor.png differ diff --git a/Game/Floors/Floor_cst/Giant Bubble.png b/Game/Floors/Floor_cst/Giant Bubble.png new file mode 100644 index 000000000..7406cdaae Binary files /dev/null and b/Game/Floors/Floor_cst/Giant Bubble.png differ diff --git a/Game/Floors/Floor_cst/Grate.png b/Game/Floors/Floor_cst/Grate.png new file mode 100644 index 000000000..58243e63e Binary files /dev/null and b/Game/Floors/Floor_cst/Grate.png differ diff --git a/Game/Floors/Floor_cst/GrateHoriz.png b/Game/Floors/Floor_cst/GrateHoriz.png new file mode 100644 index 000000000..c5253f61b Binary files /dev/null and b/Game/Floors/Floor_cst/GrateHoriz.png differ diff --git a/Game/Floors/Floor_cst/GrateVert.png b/Game/Floors/Floor_cst/GrateVert.png new file mode 100644 index 000000000..8b69daf7e Binary files /dev/null and b/Game/Floors/Floor_cst/GrateVert.png differ diff --git a/Game/Floors/Floor_cst/MimicBlock.png b/Game/Floors/Floor_cst/MimicBlock.png new file mode 100644 index 000000000..a8858c520 Binary files /dev/null and b/Game/Floors/Floor_cst/MimicBlock.png differ diff --git a/Game/Floors/Floor_cst/OrbEmpty.png b/Game/Floors/Floor_cst/OrbEmpty.png new file mode 100644 index 000000000..c9cf23cad Binary files /dev/null and b/Game/Floors/Floor_cst/OrbEmpty.png differ diff --git a/Game/Floors/Floor_cst/RubbleLooted.png b/Game/Floors/Floor_cst/RubbleLooted.png new file mode 100644 index 000000000..291e20d0b Binary files /dev/null and b/Game/Floors/Floor_cst/RubbleLooted.png differ diff --git a/Game/Floors/Floor_cst/Shrine.png b/Game/Floors/Floor_cst/Shrine.png new file mode 100644 index 000000000..c512a5a74 Binary files /dev/null and b/Game/Floors/Floor_cst/Shrine.png differ diff --git a/Game/Floors/Floor_cst/ShrineBroken.png b/Game/Floors/Floor_cst/ShrineBroken.png new file mode 100644 index 000000000..6ab5f17bd Binary files /dev/null and b/Game/Floors/Floor_cst/ShrineBroken.png differ diff --git a/Game/Floors/Floor_cst/ShrineC.png b/Game/Floors/Floor_cst/ShrineC.png new file mode 100644 index 000000000..12af7b9d1 Binary files /dev/null and b/Game/Floors/Floor_cst/ShrineC.png differ diff --git a/Game/Floors/Floor_cst/ShrineEmpty.png b/Game/Floors/Floor_cst/ShrineEmpty.png new file mode 100644 index 000000000..a4d86979e Binary files /dev/null and b/Game/Floors/Floor_cst/ShrineEmpty.png differ diff --git a/Game/Floors/Floor_cst/Trap.png b/Game/Floors/Floor_cst/Trap.png new file mode 100644 index 000000000..f9a5f2dfe Binary files /dev/null and b/Game/Floors/Floor_cst/Trap.png differ diff --git a/Game/Floors/Floor_cst/Wall.png b/Game/Floors/Floor_cst/Wall.png new file mode 100644 index 000000000..b6e7a2527 Binary files /dev/null and b/Game/Floors/Floor_cst/Wall.png differ diff --git a/Game/Floors/Floor_cst/WallR.png b/Game/Floors/Floor_cst/WallR.png new file mode 100644 index 000000000..15c2e0dab Binary files /dev/null and b/Game/Floors/Floor_cst/WallR.png differ diff --git a/Game/Floors/Floor_cst/WallRVert.png b/Game/Floors/Floor_cst/WallRVert.png new file mode 100644 index 000000000..ae7b9c7e9 Binary files /dev/null and b/Game/Floors/Floor_cst/WallRVert.png differ diff --git a/Game/Floors/Floor_cst/WallVert.png b/Game/Floors/Floor_cst/WallVert.png new file mode 100644 index 000000000..b5db4b2eb Binary files /dev/null and b/Game/Floors/Floor_cst/WallVert.png differ diff --git a/Game/Floors/Floor_grv/WallR.png b/Game/Floors/Floor_grv/WallR.png new file mode 100644 index 000000000..99e492a31 Binary files /dev/null and b/Game/Floors/Floor_grv/WallR.png differ diff --git a/Game/Floors/Floor_grv/WallRVert.png b/Game/Floors/Floor_grv/WallRVert.png new file mode 100644 index 000000000..bcbe3da2c Binary files /dev/null and b/Game/Floors/Floor_grv/WallRVert.png differ diff --git a/Game/Floors/Floor_jng/Barrel.png b/Game/Floors/Floor_jng/Barrel.png index 241bf6072..fa3ab8581 100644 Binary files a/Game/Floors/Floor_jng/Barrel.png and b/Game/Floors/Floor_jng/Barrel.png differ diff --git a/Game/Floors/Floor_jng/Bars.png b/Game/Floors/Floor_jng/Bars.png index 20e5924c1..407fc9a4a 100644 Binary files a/Game/Floors/Floor_jng/Bars.png and b/Game/Floors/Floor_jng/Bars.png differ diff --git a/Game/Floors/Floor_jng/BarsVert.png b/Game/Floors/Floor_jng/BarsVert.png index 20e5924c1..5633e7a15 100644 Binary files a/Game/Floors/Floor_jng/BarsVert.png and b/Game/Floors/Floor_jng/BarsVert.png differ diff --git a/Game/Floors/Floor_jng/BarsVertCont.png b/Game/Floors/Floor_jng/BarsVertCont.png index 20e5924c1..f2c26f1b3 100644 Binary files a/Game/Floors/Floor_jng/BarsVertCont.png and b/Game/Floors/Floor_jng/BarsVertCont.png differ diff --git a/Game/Floors/Floor_jng/Brickwork.png b/Game/Floors/Floor_jng/Brickwork.png index 1aa08cbf6..e8de2163d 100644 Binary files a/Game/Floors/Floor_jng/Brickwork.png and b/Game/Floors/Floor_jng/Brickwork.png differ diff --git a/Game/Floors/Floor_jng/Doodad.png b/Game/Floors/Floor_jng/Doodad.png index 1c239d621..7abbad812 100644 Binary files a/Game/Floors/Floor_jng/Doodad.png and b/Game/Floors/Floor_jng/Doodad.png differ diff --git a/Game/Floors/Floor_jng/DoorOpen.png b/Game/Floors/Floor_jng/DoorOpen.png index 814d5d515..ef2295df5 100644 Binary files a/Game/Floors/Floor_jng/DoorOpen.png and b/Game/Floors/Floor_jng/DoorOpen.png differ diff --git a/Game/Floors/Floor_jng/DoorVert.png b/Game/Floors/Floor_jng/DoorVert.png index 74a20b300..e9633e613 100644 Binary files a/Game/Floors/Floor_jng/DoorVert.png and b/Game/Floors/Floor_jng/DoorVert.png differ diff --git a/Game/Floors/Floor_jng/DoorVertCont.png b/Game/Floors/Floor_jng/DoorVertCont.png index 97d6e4a62..9ad5d1a4b 100644 Binary files a/Game/Floors/Floor_jng/DoorVertCont.png and b/Game/Floors/Floor_jng/DoorVertCont.png differ diff --git a/Game/Floors/Floor_jng/DoorVertOpen.png b/Game/Floors/Floor_jng/DoorVertOpen.png index 93ed491d4..9ad36a640 100644 Binary files a/Game/Floors/Floor_jng/DoorVertOpen.png and b/Game/Floors/Floor_jng/DoorVertOpen.png differ diff --git a/Game/Floors/Floor_jng/DoorVertOpenCont.png b/Game/Floors/Floor_jng/DoorVertOpenCont.png index 1b32455a2..54dc1fef0 100644 Binary files a/Game/Floors/Floor_jng/DoorVertOpenCont.png and b/Game/Floors/Floor_jng/DoorVertOpenCont.png differ diff --git a/Game/Floors/Floor_jng/Floor.png b/Game/Floors/Floor_jng/Floor.png index 26c0fc105..79cb803bf 100644 Binary files a/Game/Floors/Floor_jng/Floor.png and b/Game/Floors/Floor_jng/Floor.png differ diff --git a/Game/Floors/Floor_jng/MimicBlock.png b/Game/Floors/Floor_jng/MimicBlock.png index 066d63f1d..c6c6e8f20 100644 Binary files a/Game/Floors/Floor_jng/MimicBlock.png and b/Game/Floors/Floor_jng/MimicBlock.png differ diff --git a/Game/Floors/Floor_jng/OrbEmpty.png b/Game/Floors/Floor_jng/OrbEmpty.png index 1ef774934..f8bbe7790 100644 Binary files a/Game/Floors/Floor_jng/OrbEmpty.png and b/Game/Floors/Floor_jng/OrbEmpty.png differ diff --git a/Game/Floors/Floor_jng/RubbleLooted.png b/Game/Floors/Floor_jng/RubbleLooted.png index b57828c5f..73af8841f 100644 Binary files a/Game/Floors/Floor_jng/RubbleLooted.png and b/Game/Floors/Floor_jng/RubbleLooted.png differ diff --git a/Game/Floors/Floor_jng/Shrine.png b/Game/Floors/Floor_jng/Shrine.png index 0696059e7..d59182519 100644 Binary files a/Game/Floors/Floor_jng/Shrine.png and b/Game/Floors/Floor_jng/Shrine.png differ diff --git a/Game/Floors/Floor_jng/ShrineBroken.png b/Game/Floors/Floor_jng/ShrineBroken.png index e21daf38d..6d80acdfd 100644 Binary files a/Game/Floors/Floor_jng/ShrineBroken.png and b/Game/Floors/Floor_jng/ShrineBroken.png differ diff --git a/Game/Floors/Floor_jng/ShrineC.png b/Game/Floors/Floor_jng/ShrineC.png index 7b5ec9134..1bf1fe061 100644 Binary files a/Game/Floors/Floor_jng/ShrineC.png and b/Game/Floors/Floor_jng/ShrineC.png differ diff --git a/Game/Floors/Floor_jng/ShrineEmpty.png b/Game/Floors/Floor_jng/ShrineEmpty.png index a0d889442..cf2a303c9 100644 Binary files a/Game/Floors/Floor_jng/ShrineEmpty.png and b/Game/Floors/Floor_jng/ShrineEmpty.png differ diff --git a/Game/Floors/Floor_jng/Trap.png b/Game/Floors/Floor_jng/Trap.png index e4f9e7c6c..89cc069c5 100644 Binary files a/Game/Floors/Floor_jng/Trap.png and b/Game/Floors/Floor_jng/Trap.png differ diff --git a/Game/Floors/Floor_jng/WallR.png b/Game/Floors/Floor_jng/WallR.png new file mode 100644 index 000000000..314ddf8e6 Binary files /dev/null and b/Game/Floors/Floor_jng/WallR.png differ diff --git a/Game/Floors/Floor_jng/WallRVert.png b/Game/Floors/Floor_jng/WallRVert.png new file mode 100644 index 000000000..b001c96dc Binary files /dev/null and b/Game/Floors/Floor_jng/WallRVert.png differ diff --git a/Game/Floors/Floor_jngWild/Barrel.png b/Game/Floors/Floor_jngWild/Barrel.png new file mode 100644 index 000000000..241bf6072 Binary files /dev/null and b/Game/Floors/Floor_jngWild/Barrel.png differ diff --git a/Game/Floors/Floor_jngWild/Bars.png b/Game/Floors/Floor_jngWild/Bars.png new file mode 100644 index 000000000..20e5924c1 Binary files /dev/null and b/Game/Floors/Floor_jngWild/Bars.png differ diff --git a/Game/Floors/Floor_jngWild/BarsVert.png b/Game/Floors/Floor_jngWild/BarsVert.png new file mode 100644 index 000000000..20e5924c1 Binary files /dev/null and b/Game/Floors/Floor_jngWild/BarsVert.png differ diff --git a/Game/Floors/Floor_jngWild/BarsVertCont.png b/Game/Floors/Floor_jngWild/BarsVertCont.png new file mode 100644 index 000000000..20e5924c1 Binary files /dev/null and b/Game/Floors/Floor_jngWild/BarsVertCont.png differ diff --git a/Game/Floors/Floor_jngWild/Brickwork.png b/Game/Floors/Floor_jngWild/Brickwork.png new file mode 100644 index 000000000..1aa08cbf6 Binary files /dev/null and b/Game/Floors/Floor_jngWild/Brickwork.png differ diff --git a/Game/Floors/Floor_jngWild/Doodad.png b/Game/Floors/Floor_jngWild/Doodad.png new file mode 100644 index 000000000..1c239d621 Binary files /dev/null and b/Game/Floors/Floor_jngWild/Doodad.png differ diff --git a/Game/Floors/Floor_jngWild/Door.png b/Game/Floors/Floor_jngWild/Door.png new file mode 100644 index 000000000..95dcf799c Binary files /dev/null and b/Game/Floors/Floor_jngWild/Door.png differ diff --git a/Game/Floors/Floor_jngWild/DoorOpen.png b/Game/Floors/Floor_jngWild/DoorOpen.png new file mode 100644 index 000000000..814d5d515 Binary files /dev/null and b/Game/Floors/Floor_jngWild/DoorOpen.png differ diff --git a/Game/Floors/Floor_jngWild/DoorVert.png b/Game/Floors/Floor_jngWild/DoorVert.png new file mode 100644 index 000000000..74a20b300 Binary files /dev/null and b/Game/Floors/Floor_jngWild/DoorVert.png differ diff --git a/Game/Floors/Floor_jngWild/DoorVertCont.png b/Game/Floors/Floor_jngWild/DoorVertCont.png new file mode 100644 index 000000000..97d6e4a62 Binary files /dev/null and b/Game/Floors/Floor_jngWild/DoorVertCont.png differ diff --git a/Game/Floors/Floor_jngWild/DoorVertOpen.png b/Game/Floors/Floor_jngWild/DoorVertOpen.png new file mode 100644 index 000000000..93ed491d4 Binary files /dev/null and b/Game/Floors/Floor_jngWild/DoorVertOpen.png differ diff --git a/Game/Floors/Floor_jngWild/DoorVertOpenCont.png b/Game/Floors/Floor_jngWild/DoorVertOpenCont.png new file mode 100644 index 000000000..1b32455a2 Binary files /dev/null and b/Game/Floors/Floor_jngWild/DoorVertOpenCont.png differ diff --git a/Game/Floors/Floor_jngWild/Floor.png b/Game/Floors/Floor_jngWild/Floor.png new file mode 100644 index 000000000..26c0fc105 Binary files /dev/null and b/Game/Floors/Floor_jngWild/Floor.png differ diff --git a/Game/Floors/Floor_jngWild/Grate.png b/Game/Floors/Floor_jngWild/Grate.png new file mode 100644 index 000000000..d216ad556 Binary files /dev/null and b/Game/Floors/Floor_jngWild/Grate.png differ diff --git a/Game/Floors/Floor_jngWild/GrateHoriz.png b/Game/Floors/Floor_jngWild/GrateHoriz.png new file mode 100644 index 000000000..2e48e388c Binary files /dev/null and b/Game/Floors/Floor_jngWild/GrateHoriz.png differ diff --git a/Game/Floors/Floor_jngWild/GrateVert.png b/Game/Floors/Floor_jngWild/GrateVert.png new file mode 100644 index 000000000..2e61a566e Binary files /dev/null and b/Game/Floors/Floor_jngWild/GrateVert.png differ diff --git a/Game/Floors/Floor_jngWild/MimicBlock.png b/Game/Floors/Floor_jngWild/MimicBlock.png new file mode 100644 index 000000000..066d63f1d Binary files /dev/null and b/Game/Floors/Floor_jngWild/MimicBlock.png differ diff --git a/Game/Floors/Floor_jngWild/OrbEmpty.png b/Game/Floors/Floor_jngWild/OrbEmpty.png new file mode 100644 index 000000000..1ef774934 Binary files /dev/null and b/Game/Floors/Floor_jngWild/OrbEmpty.png differ diff --git a/Game/Floors/Floor_jngWild/RubbleLooted.png b/Game/Floors/Floor_jngWild/RubbleLooted.png new file mode 100644 index 000000000..b57828c5f Binary files /dev/null and b/Game/Floors/Floor_jngWild/RubbleLooted.png differ diff --git a/Game/Floors/Floor_jngWild/Shrine.png b/Game/Floors/Floor_jngWild/Shrine.png new file mode 100644 index 000000000..0696059e7 Binary files /dev/null and b/Game/Floors/Floor_jngWild/Shrine.png differ diff --git a/Game/Floors/Floor_jngWild/ShrineBroken.png b/Game/Floors/Floor_jngWild/ShrineBroken.png new file mode 100644 index 000000000..e21daf38d Binary files /dev/null and b/Game/Floors/Floor_jngWild/ShrineBroken.png differ diff --git a/Game/Floors/Floor_jngWild/ShrineC.png b/Game/Floors/Floor_jngWild/ShrineC.png new file mode 100644 index 000000000..7b5ec9134 Binary files /dev/null and b/Game/Floors/Floor_jngWild/ShrineC.png differ diff --git a/Game/Floors/Floor_jngWild/ShrineEmpty.png b/Game/Floors/Floor_jngWild/ShrineEmpty.png new file mode 100644 index 000000000..a0d889442 Binary files /dev/null and b/Game/Floors/Floor_jngWild/ShrineEmpty.png differ diff --git a/Game/Floors/Floor_jng/StairsDown.png b/Game/Floors/Floor_jngWild/StairsDown.png similarity index 100% rename from Game/Floors/Floor_jng/StairsDown.png rename to Game/Floors/Floor_jngWild/StairsDown.png diff --git a/Game/Floors/Floor_jng/StairsUp.png b/Game/Floors/Floor_jngWild/StairsUp.png similarity index 100% rename from Game/Floors/Floor_jng/StairsUp.png rename to Game/Floors/Floor_jngWild/StairsUp.png diff --git a/Game/Floors/Floor_jngWild/Trap.png b/Game/Floors/Floor_jngWild/Trap.png new file mode 100644 index 000000000..e4f9e7c6c Binary files /dev/null and b/Game/Floors/Floor_jngWild/Trap.png differ diff --git a/Game/Floors/Floor_jngWild/Wall.png b/Game/Floors/Floor_jngWild/Wall.png new file mode 100644 index 000000000..ee2ff0ae4 Binary files /dev/null and b/Game/Floors/Floor_jngWild/Wall.png differ diff --git a/Game/Floors/Floor_jngWild/WallR.png b/Game/Floors/Floor_jngWild/WallR.png new file mode 100644 index 000000000..61764bbaa Binary files /dev/null and b/Game/Floors/Floor_jngWild/WallR.png differ diff --git a/Game/Floors/Floor_jngWild/WallRVert.png b/Game/Floors/Floor_jngWild/WallRVert.png new file mode 100644 index 000000000..9b6a9ba0b Binary files /dev/null and b/Game/Floors/Floor_jngWild/WallRVert.png differ diff --git a/Game/Floors/Floor_jngWild/WallVert.png b/Game/Floors/Floor_jngWild/WallVert.png new file mode 100644 index 000000000..80ff562a8 Binary files /dev/null and b/Game/Floors/Floor_jngWild/WallVert.png differ diff --git a/Game/Floors/Floor_lib/WallR.png b/Game/Floors/Floor_lib/WallR.png new file mode 100644 index 000000000..3a6f477d5 Binary files /dev/null and b/Game/Floors/Floor_lib/WallR.png differ diff --git a/Game/Floors/Floor_lib/WallRVert.png b/Game/Floors/Floor_lib/WallRVert.png new file mode 100644 index 000000000..435d2f90e Binary files /dev/null and b/Game/Floors/Floor_lib/WallRVert.png differ diff --git a/Game/Floors/Floor_lib/WallVert.png b/Game/Floors/Floor_lib/WallVert.png index 863d38b99..3540a17fb 100644 Binary files a/Game/Floors/Floor_lib/WallVert.png and b/Game/Floors/Floor_lib/WallVert.png differ diff --git a/Game/Floors/Floor_shoppe/Barrel.png b/Game/Floors/Floor_shoppe/Barrel.png new file mode 100644 index 000000000..5318131a7 Binary files /dev/null and b/Game/Floors/Floor_shoppe/Barrel.png differ diff --git a/Game/Floors/Floor_shoppe/Bars.png b/Game/Floors/Floor_shoppe/Bars.png new file mode 100644 index 000000000..11ed11121 Binary files /dev/null and b/Game/Floors/Floor_shoppe/Bars.png differ diff --git a/Game/Floors/Floor_shoppe/BarsVert.png b/Game/Floors/Floor_shoppe/BarsVert.png new file mode 100644 index 000000000..af0f5b9db Binary files /dev/null and b/Game/Floors/Floor_shoppe/BarsVert.png differ diff --git a/Game/Floors/Floor_shoppe/BarsVertCont.png b/Game/Floors/Floor_shoppe/BarsVertCont.png new file mode 100644 index 000000000..90000137e Binary files /dev/null and b/Game/Floors/Floor_shoppe/BarsVertCont.png differ diff --git a/Game/Floors/Floor_shoppe/Brickwork.png b/Game/Floors/Floor_shoppe/Brickwork.png new file mode 100644 index 000000000..f91eb2f74 Binary files /dev/null and b/Game/Floors/Floor_shoppe/Brickwork.png differ diff --git a/Game/Floors/Floor_shoppe/Doodad.png b/Game/Floors/Floor_shoppe/Doodad.png new file mode 100644 index 000000000..6e1f49a81 Binary files /dev/null and b/Game/Floors/Floor_shoppe/Doodad.png differ diff --git a/Game/Floors/Floor_shoppe/Door.png b/Game/Floors/Floor_shoppe/Door.png new file mode 100644 index 000000000..df9e16063 Binary files /dev/null and b/Game/Floors/Floor_shoppe/Door.png differ diff --git a/Game/Floors/Floor_shoppe/DoorOpen.png b/Game/Floors/Floor_shoppe/DoorOpen.png new file mode 100644 index 000000000..0e401545b Binary files /dev/null and b/Game/Floors/Floor_shoppe/DoorOpen.png differ diff --git a/Game/Floors/Floor_shoppe/DoorVert.png b/Game/Floors/Floor_shoppe/DoorVert.png new file mode 100644 index 000000000..32589ebdc Binary files /dev/null and b/Game/Floors/Floor_shoppe/DoorVert.png differ diff --git a/Game/Floors/Floor_shoppe/DoorVertCont.png b/Game/Floors/Floor_shoppe/DoorVertCont.png new file mode 100644 index 000000000..73fbb6ac2 Binary files /dev/null and b/Game/Floors/Floor_shoppe/DoorVertCont.png differ diff --git a/Game/Floors/Floor_shoppe/DoorVertOpen.png b/Game/Floors/Floor_shoppe/DoorVertOpen.png new file mode 100644 index 000000000..8f6acaf4d Binary files /dev/null and b/Game/Floors/Floor_shoppe/DoorVertOpen.png differ diff --git a/Game/Floors/Floor_shoppe/DoorVertOpenCont.png b/Game/Floors/Floor_shoppe/DoorVertOpenCont.png new file mode 100644 index 000000000..0e3775036 Binary files /dev/null and b/Game/Floors/Floor_shoppe/DoorVertOpenCont.png differ diff --git a/Game/Floors/Floor_shoppe/Floor.png b/Game/Floors/Floor_shoppe/Floor.png new file mode 100644 index 000000000..c0c28beb4 Binary files /dev/null and b/Game/Floors/Floor_shoppe/Floor.png differ diff --git a/Game/Floors/Floor_shoppe/Grate.png b/Game/Floors/Floor_shoppe/Grate.png new file mode 100644 index 000000000..648c00644 Binary files /dev/null and b/Game/Floors/Floor_shoppe/Grate.png differ diff --git a/Game/Floors/Floor_shoppe/GrateHoriz.png b/Game/Floors/Floor_shoppe/GrateHoriz.png new file mode 100644 index 000000000..3d84786b9 Binary files /dev/null and b/Game/Floors/Floor_shoppe/GrateHoriz.png differ diff --git a/Game/Floors/Floor_shoppe/GrateVert.png b/Game/Floors/Floor_shoppe/GrateVert.png new file mode 100644 index 000000000..0bfbf93d3 Binary files /dev/null and b/Game/Floors/Floor_shoppe/GrateVert.png differ diff --git a/Game/Floors/Floor_shoppe/MimicBlock.png b/Game/Floors/Floor_shoppe/MimicBlock.png new file mode 100644 index 000000000..287ba5659 Binary files /dev/null and b/Game/Floors/Floor_shoppe/MimicBlock.png differ diff --git a/Game/Floors/Floor_shoppe/OrbEmpty.png b/Game/Floors/Floor_shoppe/OrbEmpty.png new file mode 100644 index 000000000..4012c57af Binary files /dev/null and b/Game/Floors/Floor_shoppe/OrbEmpty.png differ diff --git a/Game/Floors/Floor_shoppe/RubbleLooted.png b/Game/Floors/Floor_shoppe/RubbleLooted.png new file mode 100644 index 000000000..6e803c554 Binary files /dev/null and b/Game/Floors/Floor_shoppe/RubbleLooted.png differ diff --git a/Game/Floors/Floor_shoppe/Shrine.png b/Game/Floors/Floor_shoppe/Shrine.png new file mode 100644 index 000000000..c21592371 Binary files /dev/null and b/Game/Floors/Floor_shoppe/Shrine.png differ diff --git a/Game/Floors/Floor_shoppe/ShrineBroken.png b/Game/Floors/Floor_shoppe/ShrineBroken.png new file mode 100644 index 000000000..9642bd214 Binary files /dev/null and b/Game/Floors/Floor_shoppe/ShrineBroken.png differ diff --git a/Game/Floors/Floor_shoppe/ShrineC.png b/Game/Floors/Floor_shoppe/ShrineC.png new file mode 100644 index 000000000..d2b5ea339 Binary files /dev/null and b/Game/Floors/Floor_shoppe/ShrineC.png differ diff --git a/Game/Floors/Floor_shoppe/ShrineEmpty.png b/Game/Floors/Floor_shoppe/ShrineEmpty.png new file mode 100644 index 000000000..93af285a3 Binary files /dev/null and b/Game/Floors/Floor_shoppe/ShrineEmpty.png differ diff --git a/Game/Floors/Floor_shoppe/Tile.png b/Game/Floors/Floor_shoppe/Tile.png new file mode 100644 index 000000000..9ed8c6be4 Binary files /dev/null and b/Game/Floors/Floor_shoppe/Tile.png differ diff --git a/Game/Floors/Floor_shoppe/Trap.png b/Game/Floors/Floor_shoppe/Trap.png new file mode 100644 index 000000000..7dbd9fc6c Binary files /dev/null and b/Game/Floors/Floor_shoppe/Trap.png differ diff --git a/Game/Floors/Floor_shoppe/Wall.png b/Game/Floors/Floor_shoppe/Wall.png new file mode 100644 index 000000000..d17ee894c Binary files /dev/null and b/Game/Floors/Floor_shoppe/Wall.png differ diff --git a/Game/Floors/Floor_shoppe/WallR.png b/Game/Floors/Floor_shoppe/WallR.png new file mode 100644 index 000000000..3668a4a16 Binary files /dev/null and b/Game/Floors/Floor_shoppe/WallR.png differ diff --git a/Game/Floors/Floor_shoppe/WallRVert.png b/Game/Floors/Floor_shoppe/WallRVert.png new file mode 100644 index 000000000..b322528e0 Binary files /dev/null and b/Game/Floors/Floor_shoppe/WallRVert.png differ diff --git a/Game/Floors/Floor_shoppe/WallVert.png b/Game/Floors/Floor_shoppe/WallVert.png new file mode 100644 index 000000000..cc56edb12 Binary files /dev/null and b/Game/Floors/Floor_shoppe/WallVert.png differ diff --git a/Game/Floors/Floor_shrine/Barrel.png b/Game/Floors/Floor_shrine/Barrel.png new file mode 100644 index 000000000..bacdb8e80 Binary files /dev/null and b/Game/Floors/Floor_shrine/Barrel.png differ diff --git a/Game/Floors/Floor_shrine/Bars.png b/Game/Floors/Floor_shrine/Bars.png new file mode 100644 index 000000000..be1d874db Binary files /dev/null and b/Game/Floors/Floor_shrine/Bars.png differ diff --git a/Game/Floors/Floor_shrine/BarsOld.png b/Game/Floors/Floor_shrine/BarsOld.png new file mode 100644 index 000000000..92e755ade Binary files /dev/null and b/Game/Floors/Floor_shrine/BarsOld.png differ diff --git a/Game/Floors/Floor_shrine/BarsVert.png b/Game/Floors/Floor_shrine/BarsVert.png new file mode 100644 index 000000000..f9377a562 Binary files /dev/null and b/Game/Floors/Floor_shrine/BarsVert.png differ diff --git a/Game/Floors/Floor_shrine/BarsVertCont.png b/Game/Floors/Floor_shrine/BarsVertCont.png new file mode 100644 index 000000000..1e6bdb76c Binary files /dev/null and b/Game/Floors/Floor_shrine/BarsVertCont.png differ diff --git a/Game/Floors/Floor_shrine/Brickwork.png b/Game/Floors/Floor_shrine/Brickwork.png new file mode 100644 index 000000000..71c144932 Binary files /dev/null and b/Game/Floors/Floor_shrine/Brickwork.png differ diff --git a/Game/Floors/Floor_shrine/Doodad.png b/Game/Floors/Floor_shrine/Doodad.png new file mode 100644 index 000000000..1d6bcb934 Binary files /dev/null and b/Game/Floors/Floor_shrine/Doodad.png differ diff --git a/Game/Floors/Floor_shrine/Door.png b/Game/Floors/Floor_shrine/Door.png new file mode 100644 index 000000000..d3ad056b8 Binary files /dev/null and b/Game/Floors/Floor_shrine/Door.png differ diff --git a/Game/Floors/Floor_shrine/DoorOpen.png b/Game/Floors/Floor_shrine/DoorOpen.png new file mode 100644 index 000000000..ce39e166c Binary files /dev/null and b/Game/Floors/Floor_shrine/DoorOpen.png differ diff --git a/Game/Floors/Floor_shrine/DoorVert.png b/Game/Floors/Floor_shrine/DoorVert.png new file mode 100644 index 000000000..01fe16c8c Binary files /dev/null and b/Game/Floors/Floor_shrine/DoorVert.png differ diff --git a/Game/Floors/Floor_shrine/DoorVertCont.png b/Game/Floors/Floor_shrine/DoorVertCont.png new file mode 100644 index 000000000..15d3caf19 Binary files /dev/null and b/Game/Floors/Floor_shrine/DoorVertCont.png differ diff --git a/Game/Floors/Floor_shrine/DoorVertOpen.png b/Game/Floors/Floor_shrine/DoorVertOpen.png new file mode 100644 index 000000000..77911a377 Binary files /dev/null and b/Game/Floors/Floor_shrine/DoorVertOpen.png differ diff --git a/Game/Floors/Floor_shrine/DoorVertOpenCont.png b/Game/Floors/Floor_shrine/DoorVertOpenCont.png new file mode 100644 index 000000000..3a774b7f4 Binary files /dev/null and b/Game/Floors/Floor_shrine/DoorVertOpenCont.png differ diff --git a/Game/Floors/Floor_shrine/Floor.png b/Game/Floors/Floor_shrine/Floor.png new file mode 100644 index 000000000..a4d9c4412 Binary files /dev/null and b/Game/Floors/Floor_shrine/Floor.png differ diff --git a/Game/Floors/Floor_shrine/Grate.png b/Game/Floors/Floor_shrine/Grate.png new file mode 100644 index 000000000..d216ad556 Binary files /dev/null and b/Game/Floors/Floor_shrine/Grate.png differ diff --git a/Game/Floors/Floor_shrine/GrateHoriz.png b/Game/Floors/Floor_shrine/GrateHoriz.png new file mode 100644 index 000000000..2e48e388c Binary files /dev/null and b/Game/Floors/Floor_shrine/GrateHoriz.png differ diff --git a/Game/Floors/Floor_shrine/GrateVert.png b/Game/Floors/Floor_shrine/GrateVert.png new file mode 100644 index 000000000..2e61a566e Binary files /dev/null and b/Game/Floors/Floor_shrine/GrateVert.png differ diff --git a/Game/Floors/Floor_shrine/MimicBlock.png b/Game/Floors/Floor_shrine/MimicBlock.png new file mode 100644 index 000000000..cc88bf25c Binary files /dev/null and b/Game/Floors/Floor_shrine/MimicBlock.png differ diff --git a/Game/Floors/Floor_shrine/OrbEmpty.png b/Game/Floors/Floor_shrine/OrbEmpty.png new file mode 100644 index 000000000..ef468e6ce Binary files /dev/null and b/Game/Floors/Floor_shrine/OrbEmpty.png differ diff --git a/Game/Floors/Floor_shrine/RubbleLooted.png b/Game/Floors/Floor_shrine/RubbleLooted.png new file mode 100644 index 000000000..f0328453b Binary files /dev/null and b/Game/Floors/Floor_shrine/RubbleLooted.png differ diff --git a/Game/Floors/Floor_shrine/Shrine.png b/Game/Floors/Floor_shrine/Shrine.png new file mode 100644 index 000000000..50f0b685f Binary files /dev/null and b/Game/Floors/Floor_shrine/Shrine.png differ diff --git a/Game/Floors/Floor_shrine/ShrineBroken.png b/Game/Floors/Floor_shrine/ShrineBroken.png new file mode 100644 index 000000000..c4bdce251 Binary files /dev/null and b/Game/Floors/Floor_shrine/ShrineBroken.png differ diff --git a/Game/Floors/Floor_shrine/ShrineC.png b/Game/Floors/Floor_shrine/ShrineC.png new file mode 100644 index 000000000..dd11ac991 Binary files /dev/null and b/Game/Floors/Floor_shrine/ShrineC.png differ diff --git a/Game/Floors/Floor_shrine/ShrineEmpty.png b/Game/Floors/Floor_shrine/ShrineEmpty.png new file mode 100644 index 000000000..880fe951e Binary files /dev/null and b/Game/Floors/Floor_shrine/ShrineEmpty.png differ diff --git a/Game/Floors/Floor_shrine/Trap.png b/Game/Floors/Floor_shrine/Trap.png new file mode 100644 index 000000000..0a1a35fa1 Binary files /dev/null and b/Game/Floors/Floor_shrine/Trap.png differ diff --git a/Game/Floors/Floor_shrine/Wall.png b/Game/Floors/Floor_shrine/Wall.png new file mode 100644 index 000000000..eb1f2411b Binary files /dev/null and b/Game/Floors/Floor_shrine/Wall.png differ diff --git a/Game/Floors/Floor_shrine/WallR.png b/Game/Floors/Floor_shrine/WallR.png new file mode 100644 index 000000000..401ffe1f3 Binary files /dev/null and b/Game/Floors/Floor_shrine/WallR.png differ diff --git a/Game/Floors/Floor_shrine/WallRVert.png b/Game/Floors/Floor_shrine/WallRVert.png new file mode 100644 index 000000000..3dc623438 Binary files /dev/null and b/Game/Floors/Floor_shrine/WallRVert.png differ diff --git a/Game/Floors/Floor_shrine/WallVert.png b/Game/Floors/Floor_shrine/WallVert.png new file mode 100644 index 000000000..651c96c93 Binary files /dev/null and b/Game/Floors/Floor_shrine/WallVert.png differ diff --git a/Game/Floors/Floor_tmb/WallR.png b/Game/Floors/Floor_tmb/WallR.png new file mode 100644 index 000000000..73f6acab3 Binary files /dev/null and b/Game/Floors/Floor_tmb/WallR.png differ diff --git a/Game/Floors/Floor_tmb/WallRVert.png b/Game/Floors/Floor_tmb/WallRVert.png new file mode 100644 index 000000000..61a8f5672 Binary files /dev/null and b/Game/Floors/Floor_tmb/WallRVert.png differ diff --git a/Game/Floors/Floor_tmp/WallR.png b/Game/Floors/Floor_tmp/WallR.png new file mode 100644 index 000000000..b7f90359e Binary files /dev/null and b/Game/Floors/Floor_tmp/WallR.png differ diff --git a/Game/Floors/Floor_tmp/WallRVert.png b/Game/Floors/Floor_tmp/WallRVert.png new file mode 100644 index 000000000..72120f435 Binary files /dev/null and b/Game/Floors/Floor_tmp/WallRVert.png differ diff --git a/Game/Floors/Floor_vault/Barrel.png b/Game/Floors/Floor_vault/Barrel.png new file mode 100644 index 000000000..f10fd417a Binary files /dev/null and b/Game/Floors/Floor_vault/Barrel.png differ diff --git a/Game/Floors/Floor_vault/Bars.png b/Game/Floors/Floor_vault/Bars.png new file mode 100644 index 000000000..89f7dabc3 Binary files /dev/null and b/Game/Floors/Floor_vault/Bars.png differ diff --git a/Game/Floors/Floor_vault/BarsVert.png b/Game/Floors/Floor_vault/BarsVert.png new file mode 100644 index 000000000..83492243e Binary files /dev/null and b/Game/Floors/Floor_vault/BarsVert.png differ diff --git a/Game/Floors/Floor_vault/BarsVertCont.png b/Game/Floors/Floor_vault/BarsVertCont.png new file mode 100644 index 000000000..71d3a6d2c Binary files /dev/null and b/Game/Floors/Floor_vault/BarsVertCont.png differ diff --git a/Game/Floors/Floor_vault/Brickwork.png b/Game/Floors/Floor_vault/Brickwork.png new file mode 100644 index 000000000..cf1f5b7e5 Binary files /dev/null and b/Game/Floors/Floor_vault/Brickwork.png differ diff --git a/Game/Floors/Floor_vault/DollDropoff.png b/Game/Floors/Floor_vault/DollDropoff.png new file mode 100644 index 000000000..4d8e085b5 Binary files /dev/null and b/Game/Floors/Floor_vault/DollDropoff.png differ diff --git a/Game/Floors/Floor_vault/Doodad.png b/Game/Floors/Floor_vault/Doodad.png new file mode 100644 index 000000000..aadce1f7a Binary files /dev/null and b/Game/Floors/Floor_vault/Doodad.png differ diff --git a/Game/Floors/Floor_vault/Door.png b/Game/Floors/Floor_vault/Door.png new file mode 100644 index 000000000..a724968c4 Binary files /dev/null and b/Game/Floors/Floor_vault/Door.png differ diff --git a/Game/Floors/Floor_vault/DoorOpen.png b/Game/Floors/Floor_vault/DoorOpen.png new file mode 100644 index 000000000..8b15cac48 Binary files /dev/null and b/Game/Floors/Floor_vault/DoorOpen.png differ diff --git a/Game/Floors/Floor_vault/DoorVert.png b/Game/Floors/Floor_vault/DoorVert.png new file mode 100644 index 000000000..0a6afe786 Binary files /dev/null and b/Game/Floors/Floor_vault/DoorVert.png differ diff --git a/Game/Floors/Floor_vault/DoorVertCont.png b/Game/Floors/Floor_vault/DoorVertCont.png new file mode 100644 index 000000000..15b0bcf55 Binary files /dev/null and b/Game/Floors/Floor_vault/DoorVertCont.png differ diff --git a/Game/Floors/Floor_vault/DoorVertOpen.png b/Game/Floors/Floor_vault/DoorVertOpen.png new file mode 100644 index 000000000..9a3e982ac Binary files /dev/null and b/Game/Floors/Floor_vault/DoorVertOpen.png differ diff --git a/Game/Floors/Floor_vault/DoorVertOpenCont.png b/Game/Floors/Floor_vault/DoorVertOpenCont.png new file mode 100644 index 000000000..a7a5c5dfa Binary files /dev/null and b/Game/Floors/Floor_vault/DoorVertOpenCont.png differ diff --git a/Game/Floors/Floor_vault/Floor.png b/Game/Floors/Floor_vault/Floor.png new file mode 100644 index 000000000..4d8e085b5 Binary files /dev/null and b/Game/Floors/Floor_vault/Floor.png differ diff --git a/Game/Floors/Floor_vault/Grate.png b/Game/Floors/Floor_vault/Grate.png new file mode 100644 index 000000000..a0dc16f6b Binary files /dev/null and b/Game/Floors/Floor_vault/Grate.png differ diff --git a/Game/Floors/Floor_vault/GrateHoriz.png b/Game/Floors/Floor_vault/GrateHoriz.png new file mode 100644 index 000000000..628201329 Binary files /dev/null and b/Game/Floors/Floor_vault/GrateHoriz.png differ diff --git a/Game/Floors/Floor_vault/GrateVert.png b/Game/Floors/Floor_vault/GrateVert.png new file mode 100644 index 000000000..f99bf95e6 Binary files /dev/null and b/Game/Floors/Floor_vault/GrateVert.png differ diff --git a/Game/Floors/Floor_vault/MimicBlock.png b/Game/Floors/Floor_vault/MimicBlock.png new file mode 100644 index 000000000..f780470b6 Binary files /dev/null and b/Game/Floors/Floor_vault/MimicBlock.png differ diff --git a/Game/Floors/Floor_vault/OrbEmpty.png b/Game/Floors/Floor_vault/OrbEmpty.png new file mode 100644 index 000000000..df3abbcfe Binary files /dev/null and b/Game/Floors/Floor_vault/OrbEmpty.png differ diff --git a/Game/Floors/Floor_vault/RubbleLooted.png b/Game/Floors/Floor_vault/RubbleLooted.png new file mode 100644 index 000000000..d41ab6efd Binary files /dev/null and b/Game/Floors/Floor_vault/RubbleLooted.png differ diff --git a/Game/Floors/Floor_vault/Shrine.png b/Game/Floors/Floor_vault/Shrine.png new file mode 100644 index 000000000..c3b944c6b Binary files /dev/null and b/Game/Floors/Floor_vault/Shrine.png differ diff --git a/Game/Floors/Floor_vault/ShrineBroken.png b/Game/Floors/Floor_vault/ShrineBroken.png new file mode 100644 index 000000000..62f675d76 Binary files /dev/null and b/Game/Floors/Floor_vault/ShrineBroken.png differ diff --git a/Game/Floors/Floor_vault/ShrineC.png b/Game/Floors/Floor_vault/ShrineC.png new file mode 100644 index 000000000..a82f3df22 Binary files /dev/null and b/Game/Floors/Floor_vault/ShrineC.png differ diff --git a/Game/Floors/Floor_vault/ShrineEmpty.png b/Game/Floors/Floor_vault/ShrineEmpty.png new file mode 100644 index 000000000..19d2fdf1c Binary files /dev/null and b/Game/Floors/Floor_vault/ShrineEmpty.png differ diff --git a/Game/Floors/Floor_vault/StairsDown.png b/Game/Floors/Floor_vault/StairsDown.png new file mode 100644 index 000000000..59bcb076f Binary files /dev/null and b/Game/Floors/Floor_vault/StairsDown.png differ diff --git a/Game/Floors/Floor_vault/StairsUp.png b/Game/Floors/Floor_vault/StairsUp.png new file mode 100644 index 000000000..59bcb076f Binary files /dev/null and b/Game/Floors/Floor_vault/StairsUp.png differ diff --git a/Game/Floors/Floor_vault/Trap.png b/Game/Floors/Floor_vault/Trap.png new file mode 100644 index 000000000..3f4a662da Binary files /dev/null and b/Game/Floors/Floor_vault/Trap.png differ diff --git a/Game/Floors/Floor_vault/Wall.png b/Game/Floors/Floor_vault/Wall.png new file mode 100644 index 000000000..8f3988153 Binary files /dev/null and b/Game/Floors/Floor_vault/Wall.png differ diff --git a/Game/Floors/Floor_vault/WallR.png b/Game/Floors/Floor_vault/WallR.png new file mode 100644 index 000000000..ecb5df4f7 Binary files /dev/null and b/Game/Floors/Floor_vault/WallR.png differ diff --git a/Game/Floors/Floor_vault/WallRVert.png b/Game/Floors/Floor_vault/WallRVert.png new file mode 100644 index 000000000..903d65857 Binary files /dev/null and b/Game/Floors/Floor_vault/WallRVert.png differ diff --git a/Game/Floors/Floor_vault/WallVert.png b/Game/Floors/Floor_vault/WallVert.png new file mode 100644 index 000000000..e6821e126 Binary files /dev/null and b/Game/Floors/Floor_vault/WallVert.png differ diff --git a/Game/Fog/Fog.png b/Game/Fog/Fog.png deleted file mode 100644 index b61c5e03c..000000000 Binary files a/Game/Fog/Fog.png and /dev/null differ diff --git a/Game/GFX/Talisman.png b/Game/GFX/Talisman.png new file mode 100644 index 000000000..ec524efe4 Binary files /dev/null and b/Game/GFX/Talisman.png differ diff --git a/Game/GameLogo.aseprite b/Game/GameLogo.aseprite new file mode 100644 index 000000000..3984a32f2 Binary files /dev/null and b/Game/GameLogo.aseprite differ diff --git a/Game/GameLogo.png b/Game/GameLogo.png new file mode 100644 index 000000000..9137517e2 Binary files /dev/null and b/Game/GameLogo.png differ diff --git a/Game/HideFalse.png b/Game/HideFalse.png index c7883e5f2..72c0080f3 100644 Binary files a/Game/HideFalse.png and b/Game/HideFalse.png differ diff --git a/Game/HideFull.png b/Game/HideFull.png index 849b67443..f663467c9 100644 Binary files a/Game/HideFull.png and b/Game/HideFull.png differ diff --git a/Game/HideMost.png b/Game/HideMost.png new file mode 100644 index 000000000..753de9655 Binary files /dev/null and b/Game/HideMost.png differ diff --git a/Game/HideStruggle.png b/Game/HideStruggle.png new file mode 100644 index 000000000..399c5cf64 Binary files /dev/null and b/Game/HideStruggle.png differ diff --git a/Game/HideTrue.png b/Game/HideTrue.png index 1155c55c2..678bca4dc 100644 Binary files a/Game/HideTrue.png and b/Game/HideTrue.png differ diff --git a/Game/Icons/HeartEmpty.png b/Game/Icons/HeartEmpty.png deleted file mode 100644 index d2ba4ce73..000000000 Binary files a/Game/Icons/HeartEmpty.png and /dev/null differ diff --git a/Game/Icons/HeartFull.png b/Game/Icons/HeartFull.png deleted file mode 100644 index b0a23cfd5..000000000 Binary files a/Game/Icons/HeartFull.png and /dev/null differ diff --git a/Game/Icons/HeartHalf.png b/Game/Icons/HeartHalf.png deleted file mode 100644 index 8b723d7ee..000000000 Binary files a/Game/Icons/HeartHalf.png and /dev/null differ diff --git a/Game/Icons/ManaEmpty.png b/Game/Icons/ManaEmpty.png deleted file mode 100644 index 7bb63fcc5..000000000 Binary files a/Game/Icons/ManaEmpty.png and /dev/null differ diff --git a/Game/Icons/ManaFull.png b/Game/Icons/ManaFull.png deleted file mode 100644 index 382a53c77..000000000 Binary files a/Game/Icons/ManaFull.png and /dev/null differ diff --git a/Game/Icons/ManaHalf.png b/Game/Icons/ManaHalf.png deleted file mode 100644 index 4d21a273b..000000000 Binary files a/Game/Icons/ManaHalf.png and /dev/null differ diff --git a/Game/Icons/StaminaEmpty.png b/Game/Icons/StaminaEmpty.png deleted file mode 100644 index eef7a4e2f..000000000 Binary files a/Game/Icons/StaminaEmpty.png and /dev/null differ diff --git a/Game/Icons/StaminaFull.png b/Game/Icons/StaminaFull.png deleted file mode 100644 index d69f58075..000000000 Binary files a/Game/Icons/StaminaFull.png and /dev/null differ diff --git a/Game/Icons/StaminaHalf.png b/Game/Icons/StaminaHalf.png deleted file mode 100644 index 7d3e3f14c..000000000 Binary files a/Game/Icons/StaminaHalf.png and /dev/null differ diff --git a/Game/InvDrop.png b/Game/InvDrop.png new file mode 100644 index 000000000..969bb1587 Binary files /dev/null and b/Game/InvDrop.png differ diff --git a/Game/InvFilter.png b/Game/InvFilter.png new file mode 100644 index 000000000..bd79bd6f1 Binary files /dev/null and b/Game/InvFilter.png differ diff --git a/Game/InvHide.png b/Game/InvHide.png index 849b67443..c2a717b5a 100644 Binary files a/Game/InvHide.png and b/Game/InvHide.png differ diff --git a/Game/InvItemDrop.png b/Game/InvItemDrop.png new file mode 100644 index 000000000..37dc4516a Binary files /dev/null and b/Game/InvItemDrop.png differ diff --git a/Game/InvItemSort.png b/Game/InvItemSort.png new file mode 100644 index 000000000..b94acd0e2 Binary files /dev/null and b/Game/InvItemSort.png differ diff --git a/Game/InvItemSortLeft.png b/Game/InvItemSortLeft.png new file mode 100644 index 000000000..6ad923571 Binary files /dev/null and b/Game/InvItemSortLeft.png differ diff --git a/Game/InvItemSortRight.png b/Game/InvItemSortRight.png new file mode 100644 index 000000000..28ee3fb41 Binary files /dev/null and b/Game/InvItemSortRight.png differ diff --git a/Game/InvNoHide.png b/Game/InvNoHide.png deleted file mode 100644 index f2a58e032..000000000 Binary files a/Game/InvNoHide.png and /dev/null differ diff --git a/Game/InvSort.png b/Game/InvSort.png new file mode 100644 index 000000000..133d9064d Binary files /dev/null and b/Game/InvSort.png differ diff --git a/Game/InvVisible.png b/Game/InvVisible.png new file mode 100644 index 000000000..040682069 Binary files /dev/null and b/Game/InvVisible.png differ diff --git a/Game/InventoryAction/Attach.png b/Game/InventoryAction/Attach.png new file mode 100644 index 000000000..ad32b9ae5 Binary files /dev/null and b/Game/InventoryAction/Attach.png differ diff --git a/Game/InventoryAction/Bondage.png b/Game/InventoryAction/Bondage.png new file mode 100644 index 000000000..e4a2f763e Binary files /dev/null and b/Game/InventoryAction/Bondage.png differ diff --git a/Game/InventoryAction/CommandWord.png b/Game/InventoryAction/CommandWord.png new file mode 100644 index 000000000..2ed504d70 Binary files /dev/null and b/Game/InventoryAction/CommandWord.png differ diff --git a/Game/InventoryAction/Cookie.png b/Game/InventoryAction/Cookie.png new file mode 100644 index 000000000..f8826acf9 Binary files /dev/null and b/Game/InventoryAction/Cookie.png differ diff --git a/Game/InventoryAction/CurseInfo.png b/Game/InventoryAction/CurseInfo.png new file mode 100644 index 000000000..af829e170 Binary files /dev/null and b/Game/InventoryAction/CurseInfo.png differ diff --git a/Game/InventoryAction/CurseStruggle.png b/Game/InventoryAction/CurseStruggle.png new file mode 100644 index 000000000..951b450b2 Binary files /dev/null and b/Game/InventoryAction/CurseStruggle.png differ diff --git a/Game/InventoryAction/CurseUnlock.png b/Game/InventoryAction/CurseUnlock.png new file mode 100644 index 000000000..1ecfa5b56 Binary files /dev/null and b/Game/InventoryAction/CurseUnlock.png differ diff --git a/Game/InventoryAction/Cut.png b/Game/InventoryAction/Cut.png new file mode 100644 index 000000000..75dfb7668 Binary files /dev/null and b/Game/InventoryAction/Cut.png differ diff --git a/Game/InventoryAction/Disassemble.png b/Game/InventoryAction/Disassemble.png new file mode 100644 index 000000000..3d8d93d49 Binary files /dev/null and b/Game/InventoryAction/Disassemble.png differ diff --git a/Game/InventoryAction/Drop.png b/Game/InventoryAction/Drop.png new file mode 100644 index 000000000..4cf90af94 Binary files /dev/null and b/Game/InventoryAction/Drop.png differ diff --git a/Game/InventoryAction/Equip.png b/Game/InventoryAction/Equip.png new file mode 100644 index 000000000..66bc11215 Binary files /dev/null and b/Game/InventoryAction/Equip.png differ diff --git a/Game/InventoryAction/Favorite.png b/Game/InventoryAction/Favorite.png new file mode 100644 index 000000000..5678f830d Binary files /dev/null and b/Game/InventoryAction/Favorite.png differ diff --git a/Game/InventoryAction/Hotbar.png b/Game/InventoryAction/Hotbar.png new file mode 100644 index 000000000..57cfaab74 Binary files /dev/null and b/Game/InventoryAction/Hotbar.png differ diff --git a/Game/InventoryAction/Lock.png b/Game/InventoryAction/Lock.png new file mode 100644 index 000000000..06b5c2cc8 Binary files /dev/null and b/Game/InventoryAction/Lock.png differ diff --git a/Game/InventoryAction/Macaron.png b/Game/InventoryAction/Macaron.png new file mode 100644 index 000000000..79accc4df Binary files /dev/null and b/Game/InventoryAction/Macaron.png differ diff --git a/Game/InventoryAction/Offhand.png b/Game/InventoryAction/Offhand.png new file mode 100644 index 000000000..df0898ca5 Binary files /dev/null and b/Game/InventoryAction/Offhand.png differ diff --git a/Game/InventoryAction/Pick.png b/Game/InventoryAction/Pick.png new file mode 100644 index 000000000..b345b3643 Binary files /dev/null and b/Game/InventoryAction/Pick.png differ diff --git a/Game/InventoryAction/Quickslot.png b/Game/InventoryAction/Quickslot.png new file mode 100644 index 000000000..539f36ba0 Binary files /dev/null and b/Game/InventoryAction/Quickslot.png differ diff --git a/Game/InventoryAction/Recolor.png b/Game/InventoryAction/Recolor.png new file mode 100644 index 000000000..821aebbb5 Binary files /dev/null and b/Game/InventoryAction/Recolor.png differ diff --git a/Game/InventoryAction/Recycle.png b/Game/InventoryAction/Recycle.png new file mode 100644 index 000000000..3f7937382 Binary files /dev/null and b/Game/InventoryAction/Recycle.png differ diff --git a/Game/InventoryAction/RecycleBulk.png b/Game/InventoryAction/RecycleBulk.png new file mode 100644 index 000000000..3d8d93d49 Binary files /dev/null and b/Game/InventoryAction/RecycleBulk.png differ diff --git a/Game/InventoryAction/RecycleExcess.png b/Game/InventoryAction/RecycleExcess.png new file mode 100644 index 000000000..3b4cd1984 Binary files /dev/null and b/Game/InventoryAction/RecycleExcess.png differ diff --git a/Game/InventoryAction/Remove.png b/Game/InventoryAction/Remove.png new file mode 100644 index 000000000..66bc11215 Binary files /dev/null and b/Game/InventoryAction/Remove.png differ diff --git a/Game/InventoryAction/RemoveOffhand.png b/Game/InventoryAction/RemoveOffhand.png new file mode 100644 index 000000000..d02814054 Binary files /dev/null and b/Game/InventoryAction/RemoveOffhand.png differ diff --git a/Game/InventoryAction/Sell.png b/Game/InventoryAction/Sell.png new file mode 100644 index 000000000..9b2b4a73a Binary files /dev/null and b/Game/InventoryAction/Sell.png differ diff --git a/Game/InventoryAction/SellBulk.png b/Game/InventoryAction/SellBulk.png new file mode 100644 index 000000000..ec21bed23 Binary files /dev/null and b/Game/InventoryAction/SellBulk.png differ diff --git a/Game/InventoryAction/SellExcess.png b/Game/InventoryAction/SellExcess.png new file mode 100644 index 000000000..3e4a8229e Binary files /dev/null and b/Game/InventoryAction/SellExcess.png differ diff --git a/Game/InventoryAction/Struggle.png b/Game/InventoryAction/Struggle.png new file mode 100644 index 000000000..951b450b2 Binary files /dev/null and b/Game/InventoryAction/Struggle.png differ diff --git a/Game/InventoryAction/Unequip.png b/Game/InventoryAction/Unequip.png new file mode 100644 index 000000000..5cd0d1c96 Binary files /dev/null and b/Game/InventoryAction/Unequip.png differ diff --git a/Game/InventoryAction/Unfavorite.png b/Game/InventoryAction/Unfavorite.png new file mode 100644 index 000000000..d38939644 Binary files /dev/null and b/Game/InventoryAction/Unfavorite.png differ diff --git a/Game/InventoryAction/Use.png b/Game/InventoryAction/Use.png new file mode 100644 index 000000000..faf26ca3a Binary files /dev/null and b/Game/InventoryAction/Use.png differ diff --git a/Game/Items/ArcaneTome.png b/Game/Items/ArcaneTome.png new file mode 100644 index 000000000..800af2c0e Binary files /dev/null and b/Game/Items/ArcaneTome.png differ diff --git a/Game/Items/BagOfGoodies.png b/Game/Items/BagOfGoodies.png new file mode 100644 index 000000000..4f5bfabd3 Binary files /dev/null and b/Game/Items/BagOfGoodies.png differ diff --git a/Game/Items/BlueKey.png b/Game/Items/BlueKey.png index abf2dda58..bfc13018a 100644 Binary files a/Game/Items/BlueKey.png and b/Game/Items/BlueKey.png differ diff --git a/Game/Items/BondageTome.png b/Game/Items/BondageTome.png new file mode 100644 index 000000000..bab0db035 Binary files /dev/null and b/Game/Items/BondageTome.png differ diff --git a/Game/Items/Bow.png b/Game/Items/Bow.png new file mode 100644 index 000000000..85327e61b Binary files /dev/null and b/Game/Items/Bow.png differ diff --git a/Game/Items/BowRecurve.png b/Game/Items/BowRecurve.png new file mode 100644 index 000000000..0c82df36a Binary files /dev/null and b/Game/Items/BowRecurve.png differ diff --git a/Game/Items/Brownies.png b/Game/Items/Brownies.png new file mode 100644 index 000000000..d0f3f4977 Binary files /dev/null and b/Game/Items/Brownies.png differ diff --git a/Game/Items/C4.png b/Game/Items/C4.png new file mode 100644 index 000000000..6432e918f Binary files /dev/null and b/Game/Items/C4.png differ diff --git a/Game/Items/ChainSword.png b/Game/Items/ChainSword.png new file mode 100644 index 000000000..da8406646 Binary files /dev/null and b/Game/Items/ChainSword.png differ diff --git a/Game/Items/Claymore.png b/Game/Items/Claymore.png new file mode 100644 index 000000000..9eb3e91d6 Binary files /dev/null and b/Game/Items/Claymore.png differ diff --git a/Game/Items/Cookie.png b/Game/Items/Cookie.png index f75cd20a2..f8826acf9 100644 Binary files a/Game/Items/Cookie.png and b/Game/Items/Cookie.png differ diff --git a/Game/Items/CookieJailer.png b/Game/Items/CookieJailer.png index fa364eae3..8d2fb78f2 100644 Binary files a/Game/Items/CookieJailer.png and b/Game/Items/CookieJailer.png differ diff --git a/Game/Items/Crossbow.png b/Game/Items/Crossbow.png new file mode 100644 index 000000000..7cafcbd88 Binary files /dev/null and b/Game/Items/Crossbow.png differ diff --git a/Game/Items/CrossbowHeavy.png b/Game/Items/CrossbowHeavy.png new file mode 100644 index 000000000..817f384d0 Binary files /dev/null and b/Game/Items/CrossbowHeavy.png differ diff --git a/Game/Items/CrossbowPistol.png b/Game/Items/CrossbowPistol.png new file mode 100644 index 000000000..b8731caa4 Binary files /dev/null and b/Game/Items/CrossbowPistol.png differ diff --git a/Game/Items/CuffKeys.png b/Game/Items/CuffKeys.png new file mode 100644 index 000000000..a9f2990d1 Binary files /dev/null and b/Game/Items/CuffKeys.png differ diff --git a/Game/Items/DildoBat.png b/Game/Items/DildoBat.png new file mode 100644 index 000000000..245edcf35 Binary files /dev/null and b/Game/Items/DildoBat.png differ diff --git a/Game/Items/DildoBatPlus.png b/Game/Items/DildoBatPlus.png new file mode 100644 index 000000000..ed098d403 Binary files /dev/null and b/Game/Items/DildoBatPlus.png differ diff --git a/Game/Items/DiscPick.png b/Game/Items/DiscPick.png new file mode 100644 index 000000000..def1681eb Binary files /dev/null and b/Game/Items/DiscPick.png differ diff --git a/Game/Items/DivineTear.png b/Game/Items/DivineTear.png new file mode 100644 index 000000000..7114b833a Binary files /dev/null and b/Game/Items/DivineTear.png differ diff --git a/Game/Items/Donut.png b/Game/Items/Donut.png index cb562793b..9b20fbf45 100644 Binary files a/Game/Items/Donut.png and b/Game/Items/Donut.png differ diff --git a/Game/Items/Duster.png b/Game/Items/Duster.png new file mode 100644 index 000000000..52dddecb4 Binary files /dev/null and b/Game/Items/Duster.png differ diff --git a/Game/Items/Dynamite.png b/Game/Items/Dynamite.png new file mode 100644 index 000000000..2d5c6a399 Binary files /dev/null and b/Game/Items/Dynamite.png differ diff --git a/Game/Items/EscortDrone.png b/Game/Items/EscortDrone.png index d9bf9749f..72d77fc95 100644 Binary files a/Game/Items/EscortDrone.png and b/Game/Items/EscortDrone.png differ diff --git a/Game/Items/FlashBomb.png b/Game/Items/FlashBomb.png new file mode 100644 index 000000000..f0480e434 Binary files /dev/null and b/Game/Items/FlashBomb.png differ diff --git a/Game/Items/Flashbang.png b/Game/Items/Flashbang.png new file mode 100644 index 000000000..5bea63cde Binary files /dev/null and b/Game/Items/Flashbang.png differ diff --git a/Game/Items/Flashlight.png b/Game/Items/Flashlight.png new file mode 100644 index 000000000..1c182f869 Binary files /dev/null and b/Game/Items/Flashlight.png differ diff --git a/Game/Items/FrostSword.png b/Game/Items/FrostSword.png new file mode 100644 index 000000000..43dd9cddd Binary files /dev/null and b/Game/Items/FrostSword.png differ diff --git a/Game/Items/GoldenTicket.png b/Game/Items/GoldenTicket.png new file mode 100644 index 000000000..643e23cbf Binary files /dev/null and b/Game/Items/GoldenTicket.png differ diff --git a/Game/Items/Group/ItemArms.png b/Game/Items/Group/ItemArms.png new file mode 100644 index 000000000..ccf530863 Binary files /dev/null and b/Game/Items/Group/ItemArms.png differ diff --git a/Game/Items/Group/ItemBoots.png b/Game/Items/Group/ItemBoots.png new file mode 100644 index 000000000..de0d97a0c Binary files /dev/null and b/Game/Items/Group/ItemBoots.png differ diff --git a/Game/Items/Group/ItemBreast.png b/Game/Items/Group/ItemBreast.png new file mode 100644 index 000000000..6753aa633 Binary files /dev/null and b/Game/Items/Group/ItemBreast.png differ diff --git a/Game/Items/Group/ItemButt.png b/Game/Items/Group/ItemButt.png new file mode 100644 index 000000000..43c3baa2d Binary files /dev/null and b/Game/Items/Group/ItemButt.png differ diff --git a/Game/Items/Group/ItemDevices.png b/Game/Items/Group/ItemDevices.png new file mode 100644 index 000000000..1e9660d50 Binary files /dev/null and b/Game/Items/Group/ItemDevices.png differ diff --git a/Game/Items/Group/ItemFeet.png b/Game/Items/Group/ItemFeet.png new file mode 100644 index 000000000..10df930b5 Binary files /dev/null and b/Game/Items/Group/ItemFeet.png differ diff --git a/Game/Items/Group/ItemHands.png b/Game/Items/Group/ItemHands.png new file mode 100644 index 000000000..f69888271 Binary files /dev/null and b/Game/Items/Group/ItemHands.png differ diff --git a/Game/Items/Group/ItemHead.png b/Game/Items/Group/ItemHead.png new file mode 100644 index 000000000..1c942c014 Binary files /dev/null and b/Game/Items/Group/ItemHead.png differ diff --git a/Game/Items/Group/ItemLegs.png b/Game/Items/Group/ItemLegs.png new file mode 100644 index 000000000..3d8592dcc Binary files /dev/null and b/Game/Items/Group/ItemLegs.png differ diff --git a/Game/Items/Group/ItemMouth.png b/Game/Items/Group/ItemMouth.png new file mode 100644 index 000000000..fbf5bf07b Binary files /dev/null and b/Game/Items/Group/ItemMouth.png differ diff --git a/Game/Items/Group/ItemNeck.png b/Game/Items/Group/ItemNeck.png new file mode 100644 index 000000000..f566c7117 Binary files /dev/null and b/Game/Items/Group/ItemNeck.png differ diff --git a/Game/Items/Group/ItemNeckAccessories.png b/Game/Items/Group/ItemNeckAccessories.png new file mode 100644 index 000000000..9d54845e8 Binary files /dev/null and b/Game/Items/Group/ItemNeckAccessories.png differ diff --git a/Game/Items/Group/ItemNeckRestraints.png b/Game/Items/Group/ItemNeckRestraints.png new file mode 100644 index 000000000..787fd57b4 Binary files /dev/null and b/Game/Items/Group/ItemNeckRestraints.png differ diff --git a/Game/Items/Group/ItemNipples.png b/Game/Items/Group/ItemNipples.png new file mode 100644 index 000000000..e81384808 Binary files /dev/null and b/Game/Items/Group/ItemNipples.png differ diff --git a/Game/Items/Group/ItemPelvis.png b/Game/Items/Group/ItemPelvis.png new file mode 100644 index 000000000..d9c5888e9 Binary files /dev/null and b/Game/Items/Group/ItemPelvis.png differ diff --git a/Game/Items/Group/ItemTorso.png b/Game/Items/Group/ItemTorso.png new file mode 100644 index 000000000..f78f923a7 Binary files /dev/null and b/Game/Items/Group/ItemTorso.png differ diff --git a/Game/Items/Group/ItemVulva.png b/Game/Items/Group/ItemVulva.png new file mode 100644 index 000000000..1612b3fb8 Binary files /dev/null and b/Game/Items/Group/ItemVulva.png differ diff --git a/Game/Items/Group/ItemVulvaPiercings.png b/Game/Items/Group/ItemVulvaPiercings.png new file mode 100644 index 000000000..e3aa3078d Binary files /dev/null and b/Game/Items/Group/ItemVulvaPiercings.png differ diff --git a/Game/Items/Gunpowder.png b/Game/Items/Gunpowder.png new file mode 100644 index 000000000..2e79904d7 Binary files /dev/null and b/Game/Items/Gunpowder.png differ diff --git a/Game/Items/Heart.png b/Game/Items/Heart.png index 82f63c936..45af9fda8 100644 Binary files a/Game/Items/Heart.png and b/Game/Items/Heart.png differ diff --git a/Game/Items/KeyCard.png b/Game/Items/KeyCard.png new file mode 100644 index 000000000..e2f542cd5 Binary files /dev/null and b/Game/Items/KeyCard.png differ diff --git a/Game/Items/Keyring.png b/Game/Items/Keyring.png index cc9c4f8a1..c54f40d83 100644 Binary files a/Game/Items/Keyring.png and b/Game/Items/Keyring.png differ diff --git a/Game/Items/LeashItem.png b/Game/Items/LeashItem.png new file mode 100644 index 000000000..f50cadd56 Binary files /dev/null and b/Game/Items/LeashItem.png differ diff --git a/Game/Items/Longbow.png b/Game/Items/Longbow.png new file mode 100644 index 000000000..3a88c764e Binary files /dev/null and b/Game/Items/Longbow.png differ diff --git a/Game/Items/Lore.png b/Game/Items/Lore.png index 265f105c9..b16b122b0 100644 Binary files a/Game/Items/Lore.png and b/Game/Items/Lore.png differ diff --git a/Game/Items/MagicFlail.png b/Game/Items/MagicFlail.png index ed411243f..b7f27380a 100644 Binary files a/Game/Items/MagicFlail.png and b/Game/Items/MagicFlail.png differ diff --git a/Game/Items/MagicRope.png b/Game/Items/MagicRope.png new file mode 100644 index 000000000..6b4663db1 Binary files /dev/null and b/Game/Items/MagicRope.png differ diff --git a/Game/Items/Maul.png b/Game/Items/Maul.png new file mode 100644 index 000000000..68d455783 Binary files /dev/null and b/Game/Items/Maul.png differ diff --git a/Game/Items/Persuader.png b/Game/Items/Persuader.png new file mode 100644 index 000000000..6b2f57cd7 Binary files /dev/null and b/Game/Items/Persuader.png differ diff --git a/Game/Items/Pick.png b/Game/Items/Pick.png index ba442fbb9..c65b70543 100644 Binary files a/Game/Items/Pick.png and b/Game/Items/Pick.png differ diff --git a/Game/Items/Pike.png b/Game/Items/Pike.png new file mode 100644 index 000000000..dc915439b Binary files /dev/null and b/Game/Items/Pike.png differ diff --git a/Game/Items/PotionFrigid.png b/Game/Items/PotionFrigid.png index aeb3915e2..ea90c4272 100644 Binary files a/Game/Items/PotionFrigid.png and b/Game/Items/PotionFrigid.png differ diff --git a/Game/Items/PotionInvisibility.png b/Game/Items/PotionInvisibility.png index 6ed9bfc4c..d6d4c24b3 100644 Binary files a/Game/Items/PotionInvisibility.png and b/Game/Items/PotionInvisibility.png differ diff --git a/Game/Items/PotionMana.png b/Game/Items/PotionMana.png index 711f50769..e7bd7d434 100644 Binary files a/Game/Items/PotionMana.png and b/Game/Items/PotionMana.png differ diff --git a/Game/Items/PotionStamina.png b/Game/Items/PotionStamina.png index df63bd240..335781746 100644 Binary files a/Game/Items/PotionStamina.png and b/Game/Items/PotionStamina.png differ diff --git a/Game/Items/PotionWill.png b/Game/Items/PotionWill.png index 6dff0fe40..c452fd2c1 100644 Binary files a/Game/Items/PotionWill.png and b/Game/Items/PotionWill.png differ diff --git a/Game/Items/RedKey.png b/Game/Items/RedKey.png index a9f2990d1..b2580ee4f 100644 Binary files a/Game/Items/RedKey.png and b/Game/Items/RedKey.png differ diff --git a/Game/Items/Restraint.png b/Game/Items/Restraint.png index 338c14f29..cba4e945f 100644 Binary files a/Game/Items/Restraint.png and b/Game/Items/Restraint.png differ diff --git a/Game/Items/Restraint/Ancient.png b/Game/Items/Restraint/Ancient.png new file mode 100644 index 000000000..192b7610b Binary files /dev/null and b/Game/Items/Restraint/Ancient.png differ diff --git a/Game/Items/Restraint/ArmbinderHarness.png b/Game/Items/Restraint/ArmbinderHarness.png new file mode 100644 index 000000000..ea683dab9 Binary files /dev/null and b/Game/Items/Restraint/ArmbinderHarness.png differ diff --git a/Game/Items/Restraint/Armbinders.png b/Game/Items/Restraint/Armbinders.png new file mode 100644 index 000000000..530af0665 Binary files /dev/null and b/Game/Items/Restraint/Armbinders.png differ diff --git a/Game/Items/Restraint/AutoTape.png b/Game/Items/Restraint/AutoTape.png new file mode 100644 index 000000000..2df5e0184 Binary files /dev/null and b/Game/Items/Restraint/AutoTape.png differ diff --git a/Game/Items/Restraint/BallGags.png b/Game/Items/Restraint/BallGags.png new file mode 100644 index 000000000..027bfa64b Binary files /dev/null and b/Game/Items/Restraint/BallGags.png differ diff --git a/Game/Items/Restraint/Belts.png b/Game/Items/Restraint/Belts.png new file mode 100644 index 000000000..4824d3233 Binary files /dev/null and b/Game/Items/Restraint/Belts.png differ diff --git a/Game/Items/Restraint/BindingDress.png b/Game/Items/Restraint/BindingDress.png new file mode 100644 index 000000000..8d64d02ed Binary files /dev/null and b/Game/Items/Restraint/BindingDress.png differ diff --git a/Game/Items/Restraint/BitGagHarness.png b/Game/Items/Restraint/BitGagHarness.png new file mode 100644 index 000000000..7ab959a65 Binary files /dev/null and b/Game/Items/Restraint/BitGagHarness.png differ diff --git a/Game/Items/Restraint/Blindfolds.png b/Game/Items/Restraint/Blindfolds.png new file mode 100644 index 000000000..f5e5e8394 Binary files /dev/null and b/Game/Items/Restraint/Blindfolds.png differ diff --git a/Game/Items/Restraint/Boxbinders.png b/Game/Items/Restraint/Boxbinders.png new file mode 100644 index 000000000..126edc1b4 Binary files /dev/null and b/Game/Items/Restraint/Boxbinders.png differ diff --git a/Game/Items/Restraint/Bracers.png b/Game/Items/Restraint/Bracers.png new file mode 100644 index 000000000..a88abd06a Binary files /dev/null and b/Game/Items/Restraint/Bracers.png differ diff --git a/Game/Items/Restraint/Breastplate.png b/Game/Items/Restraint/Breastplate.png new file mode 100644 index 000000000..d259352c9 Binary files /dev/null and b/Game/Items/Restraint/Breastplate.png differ diff --git a/Game/Items/Restraint/Bustier.png b/Game/Items/Restraint/Bustier.png new file mode 100644 index 000000000..2329aea69 Binary files /dev/null and b/Game/Items/Restraint/Bustier.png differ diff --git a/Game/Items/Restraint/Catsuits.png b/Game/Items/Restraint/Catsuits.png new file mode 100644 index 000000000..c694835d1 Binary files /dev/null and b/Game/Items/Restraint/Catsuits.png differ diff --git a/Game/Items/Restraint/ChainBikini.png b/Game/Items/Restraint/ChainBikini.png new file mode 100644 index 000000000..880ffd5c9 Binary files /dev/null and b/Game/Items/Restraint/ChainBikini.png differ diff --git a/Game/Items/Restraint/ChainTunic.png b/Game/Items/Restraint/ChainTunic.png new file mode 100644 index 000000000..bbd914e37 Binary files /dev/null and b/Game/Items/Restraint/ChainTunic.png differ diff --git a/Game/Items/Restraint/Charms.png b/Game/Items/Restraint/Charms.png new file mode 100644 index 000000000..43f28e1e4 Binary files /dev/null and b/Game/Items/Restraint/Charms.png differ diff --git a/Game/Items/Restraint/Chastity.png b/Game/Items/Restraint/Chastity.png new file mode 100644 index 000000000..ae9978e75 Binary files /dev/null and b/Game/Items/Restraint/Chastity.png differ diff --git a/Game/Items/Restraint/ChastityBelts.png b/Game/Items/Restraint/ChastityBelts.png new file mode 100644 index 000000000..ae9978e75 Binary files /dev/null and b/Game/Items/Restraint/ChastityBelts.png differ diff --git a/Game/Items/Restraint/ChastityBras.png b/Game/Items/Restraint/ChastityBras.png new file mode 100644 index 000000000..2620346b5 Binary files /dev/null and b/Game/Items/Restraint/ChastityBras.png differ diff --git a/Game/Items/Restraint/ClothGag.png b/Game/Items/Restraint/ClothGag.png new file mode 100644 index 000000000..0dc4b5416 Binary files /dev/null and b/Game/Items/Restraint/ClothGag.png differ diff --git a/Game/Items/Restraint/ClothGagOver.png b/Game/Items/Restraint/ClothGagOver.png new file mode 100644 index 000000000..a895f6624 Binary files /dev/null and b/Game/Items/Restraint/ClothGagOver.png differ diff --git a/Game/Items/Restraint/Collars.png b/Game/Items/Restraint/Collars.png new file mode 100644 index 000000000..1da7edc32 Binary files /dev/null and b/Game/Items/Restraint/Collars.png differ diff --git a/Game/Items/Restraint/Corsets.png b/Game/Items/Restraint/Corsets.png new file mode 100644 index 000000000..9241e52c7 Binary files /dev/null and b/Game/Items/Restraint/Corsets.png differ diff --git a/Game/Items/Restraint/Cuffs.png b/Game/Items/Restraint/Cuffs.png new file mode 100644 index 000000000..b51896bf2 Binary files /dev/null and b/Game/Items/Restraint/Cuffs.png differ diff --git a/Game/Items/Restraint/Cyber.png b/Game/Items/Restraint/Cyber.png new file mode 100644 index 000000000..6fa3879a1 Binary files /dev/null and b/Game/Items/Restraint/Cyber.png differ diff --git a/Game/Items/Restraint/CyberLink.png b/Game/Items/Restraint/CyberLink.png new file mode 100644 index 000000000..2a1730f08 Binary files /dev/null and b/Game/Items/Restraint/CyberLink.png differ diff --git a/Game/Items/Restraint/CyberMittens.png b/Game/Items/Restraint/CyberMittens.png new file mode 100644 index 000000000..581747384 Binary files /dev/null and b/Game/Items/Restraint/CyberMittens.png differ diff --git a/Game/Items/Restraint/DivineBelt.png b/Game/Items/Restraint/DivineBelt.png new file mode 100644 index 000000000..541b7d7c2 Binary files /dev/null and b/Game/Items/Restraint/DivineBelt.png differ diff --git a/Game/Items/Restraint/DivineBelt2.png b/Game/Items/Restraint/DivineBelt2.png new file mode 100644 index 000000000..541b7d7c2 Binary files /dev/null and b/Game/Items/Restraint/DivineBelt2.png differ diff --git a/Game/Items/Restraint/DivineBra.png b/Game/Items/Restraint/DivineBra.png new file mode 100644 index 000000000..2a864741b Binary files /dev/null and b/Game/Items/Restraint/DivineBra.png differ diff --git a/Game/Items/Restraint/DivineBra2.png b/Game/Items/Restraint/DivineBra2.png new file mode 100644 index 000000000..2a864741b Binary files /dev/null and b/Game/Items/Restraint/DivineBra2.png differ diff --git a/Game/Items/Restraint/ElvenPanties.png b/Game/Items/Restraint/ElvenPanties.png new file mode 100644 index 000000000..fdcd95e40 Binary files /dev/null and b/Game/Items/Restraint/ElvenPanties.png differ diff --git a/Game/Items/Restraint/EssenceNecklace.png b/Game/Items/Restraint/EssenceNecklace.png new file mode 100644 index 000000000..f40e9f678 Binary files /dev/null and b/Game/Items/Restraint/EssenceNecklace.png differ diff --git a/Game/Items/Restraint/FlatGags.png b/Game/Items/Restraint/FlatGags.png new file mode 100644 index 000000000..d966e6e19 Binary files /dev/null and b/Game/Items/Restraint/FlatGags.png differ diff --git a/Game/Items/Restraint/Gags.png b/Game/Items/Restraint/Gags.png new file mode 100644 index 000000000..027bfa64b Binary files /dev/null and b/Game/Items/Restraint/Gags.png differ diff --git a/Game/Items/Restraint/Gauntlets.png b/Game/Items/Restraint/Gauntlets.png new file mode 100644 index 000000000..ec1b647b9 Binary files /dev/null and b/Game/Items/Restraint/Gauntlets.png differ diff --git a/Game/Items/Restraint/Glue.png b/Game/Items/Restraint/Glue.png new file mode 100644 index 000000000..57ac588e4 Binary files /dev/null and b/Game/Items/Restraint/Glue.png differ diff --git a/Game/Items/Restraint/Handcuffs.png b/Game/Items/Restraint/Handcuffs.png new file mode 100644 index 000000000..0a0a5d60e Binary files /dev/null and b/Game/Items/Restraint/Handcuffs.png differ diff --git a/Game/Items/Restraint/Harnesses.png b/Game/Items/Restraint/Harnesses.png new file mode 100644 index 000000000..f88a4296c Binary files /dev/null and b/Game/Items/Restraint/Harnesses.png differ diff --git a/Game/Items/Restraint/HighCollars.png b/Game/Items/Restraint/HighCollars.png new file mode 100644 index 000000000..cde8e96cd Binary files /dev/null and b/Game/Items/Restraint/HighCollars.png differ diff --git a/Game/Items/Restraint/HingedCuffs.png b/Game/Items/Restraint/HingedCuffs.png new file mode 100644 index 000000000..a5b2b4d85 Binary files /dev/null and b/Game/Items/Restraint/HingedCuffs.png differ diff --git a/Game/Items/Restraint/HolyRope.png b/Game/Items/Restraint/HolyRope.png new file mode 100644 index 000000000..f06b71b21 Binary files /dev/null and b/Game/Items/Restraint/HolyRope.png differ diff --git a/Game/Items/Restraint/Ice.png b/Game/Items/Restraint/Ice.png new file mode 100644 index 000000000..bedf1acdf Binary files /dev/null and b/Game/Items/Restraint/Ice.png differ diff --git a/Game/Items/Restraint/Irish8Cuffs.png b/Game/Items/Restraint/Irish8Cuffs.png new file mode 100644 index 000000000..ce0c02102 Binary files /dev/null and b/Game/Items/Restraint/Irish8Cuffs.png differ diff --git a/Game/Items/Restraint/Latex.png b/Game/Items/Restraint/Latex.png new file mode 100644 index 000000000..4e0b14a6a Binary files /dev/null and b/Game/Items/Restraint/Latex.png differ diff --git a/Game/Items/Restraint/LatexOTNGag.png b/Game/Items/Restraint/LatexOTNGag.png new file mode 100644 index 000000000..0eb11b937 Binary files /dev/null and b/Game/Items/Restraint/LatexOTNGag.png differ diff --git a/Game/Items/Restraint/Leashes.png b/Game/Items/Restraint/Leashes.png new file mode 100644 index 000000000..f50cadd56 Binary files /dev/null and b/Game/Items/Restraint/Leashes.png differ diff --git a/Game/Items/Restraint/LeatherBoots.png b/Game/Items/Restraint/LeatherBoots.png new file mode 100644 index 000000000..4928afc21 Binary files /dev/null and b/Game/Items/Restraint/LeatherBoots.png differ diff --git a/Game/Items/Restraint/LeatherCuffs.png b/Game/Items/Restraint/LeatherCuffs.png new file mode 100644 index 000000000..e3401d124 Binary files /dev/null and b/Game/Items/Restraint/LeatherCuffs.png differ diff --git a/Game/Items/Restraint/LeatherGloves.png b/Game/Items/Restraint/LeatherGloves.png new file mode 100644 index 000000000..743e34fbe Binary files /dev/null and b/Game/Items/Restraint/LeatherGloves.png differ diff --git a/Game/Items/Restraint/Legbinders.png b/Game/Items/Restraint/Legbinders.png new file mode 100644 index 000000000..3ac7f0d6f Binary files /dev/null and b/Game/Items/Restraint/Legbinders.png differ diff --git a/Game/Items/Restraint/Legirons.png b/Game/Items/Restraint/Legirons.png new file mode 100644 index 000000000..aaef32bac Binary files /dev/null and b/Game/Items/Restraint/Legirons.png differ diff --git a/Game/Items/Restraint/MagicArmbands.png b/Game/Items/Restraint/MagicArmbands.png new file mode 100644 index 000000000..52f8efc33 Binary files /dev/null and b/Game/Items/Restraint/MagicArmbands.png differ diff --git a/Game/Items/Restraint/MagicBelts.png b/Game/Items/Restraint/MagicBelts.png new file mode 100644 index 000000000..3e78a3f27 Binary files /dev/null and b/Game/Items/Restraint/MagicBelts.png differ diff --git a/Game/Items/Restraint/Maid.png b/Game/Items/Restraint/Maid.png new file mode 100644 index 000000000..3bfc31c23 Binary files /dev/null and b/Game/Items/Restraint/Maid.png differ diff --git a/Game/Items/Restraint/Metal.png b/Game/Items/Restraint/Metal.png new file mode 100644 index 000000000..cfc99f5cf Binary files /dev/null and b/Game/Items/Restraint/Metal.png differ diff --git a/Game/Items/Restraint/MithrilRope.png b/Game/Items/Restraint/MithrilRope.png new file mode 100644 index 000000000..ae36c19b3 Binary files /dev/null and b/Game/Items/Restraint/MithrilRope.png differ diff --git a/Game/Items/Restraint/Mittens.png b/Game/Items/Restraint/Mittens.png new file mode 100644 index 000000000..66200faed Binary files /dev/null and b/Game/Items/Restraint/Mittens.png differ diff --git a/Game/Items/Restraint/Modules.png b/Game/Items/Restraint/Modules.png new file mode 100644 index 000000000..937d4e252 Binary files /dev/null and b/Game/Items/Restraint/Modules.png differ diff --git a/Game/Items/Restraint/MysticDuctTape.png b/Game/Items/Restraint/MysticDuctTape.png new file mode 100644 index 000000000..7380cde87 Binary files /dev/null and b/Game/Items/Restraint/MysticDuctTape.png differ diff --git a/Game/Items/Restraint/NippleClamps.png b/Game/Items/Restraint/NippleClamps.png new file mode 100644 index 000000000..aec7f81cf Binary files /dev/null and b/Game/Items/Restraint/NippleClamps.png differ diff --git a/Game/Items/Restraint/NippleClamps2.png b/Game/Items/Restraint/NippleClamps2.png new file mode 100644 index 000000000..1092b13a1 Binary files /dev/null and b/Game/Items/Restraint/NippleClamps2.png differ diff --git a/Game/Items/Restraint/NippleClamps3.png b/Game/Items/Restraint/NippleClamps3.png new file mode 100644 index 000000000..a193e151d Binary files /dev/null and b/Game/Items/Restraint/NippleClamps3.png differ diff --git a/Game/Items/Restraint/NippleWeights.png b/Game/Items/Restraint/NippleWeights.png new file mode 100644 index 000000000..197f3ce6f Binary files /dev/null and b/Game/Items/Restraint/NippleWeights.png differ diff --git a/Game/Items/Restraint/Obsidian.png b/Game/Items/Restraint/Obsidian.png new file mode 100644 index 000000000..4ab31a8c2 Binary files /dev/null and b/Game/Items/Restraint/Obsidian.png differ diff --git a/Game/Items/Restraint/PanelGags.png b/Game/Items/Restraint/PanelGags.png new file mode 100644 index 000000000..d966e6e19 Binary files /dev/null and b/Game/Items/Restraint/PanelGags.png differ diff --git a/Game/Items/Restraint/Petsuits.png b/Game/Items/Restraint/Petsuits.png new file mode 100644 index 000000000..958d8200c Binary files /dev/null and b/Game/Items/Restraint/Petsuits.png differ diff --git a/Game/Items/Restraint/PlugGags.png b/Game/Items/Restraint/PlugGags.png new file mode 100644 index 000000000..14faf1cad Binary files /dev/null and b/Game/Items/Restraint/PlugGags.png differ diff --git a/Game/Items/Restraint/Plugs.png b/Game/Items/Restraint/Plugs.png new file mode 100644 index 000000000..d941d579e Binary files /dev/null and b/Game/Items/Restraint/Plugs.png differ diff --git a/Game/Items/Restraint/Posture.png b/Game/Items/Restraint/Posture.png new file mode 100644 index 000000000..599457502 Binary files /dev/null and b/Game/Items/Restraint/Posture.png differ diff --git a/Game/Items/Restraint/RedLatexOTNGag.png b/Game/Items/Restraint/RedLatexOTNGag.png new file mode 100644 index 000000000..3699fe60a Binary files /dev/null and b/Game/Items/Restraint/RedLatexOTNGag.png differ diff --git a/Game/Items/Restraint/ReversePrayer.png b/Game/Items/Restraint/ReversePrayer.png new file mode 100644 index 000000000..5d6acc5a4 Binary files /dev/null and b/Game/Items/Restraint/ReversePrayer.png differ diff --git a/Game/Items/Restraint/Ribbons.png b/Game/Items/Restraint/Ribbons.png new file mode 100644 index 000000000..5dc8ad721 Binary files /dev/null and b/Game/Items/Restraint/Ribbons.png differ diff --git a/Game/Items/Restraint/RobeOfChastity.png b/Game/Items/Restraint/RobeOfChastity.png new file mode 100644 index 000000000..e4cf169ee Binary files /dev/null and b/Game/Items/Restraint/RobeOfChastity.png differ diff --git a/Game/Items/Restraint/RopeSnake.png b/Game/Items/Restraint/RopeSnake.png new file mode 100644 index 000000000..755d0f7a4 Binary files /dev/null and b/Game/Items/Restraint/RopeSnake.png differ diff --git a/Game/Items/Restraint/Rubber.png b/Game/Items/Restraint/Rubber.png new file mode 100644 index 000000000..4e0b14a6a Binary files /dev/null and b/Game/Items/Restraint/Rubber.png differ diff --git a/Game/Items/Restraint/SarielPanties.png b/Game/Items/Restraint/SarielPanties.png new file mode 100644 index 000000000..32dca26e5 Binary files /dev/null and b/Game/Items/Restraint/SarielPanties.png differ diff --git a/Game/Items/Restraint/ScarfGag.png b/Game/Items/Restraint/ScarfGag.png new file mode 100644 index 000000000..f832b87c3 Binary files /dev/null and b/Game/Items/Restraint/ScarfGag.png differ diff --git a/Game/Items/Restraint/ShadowLatex.png b/Game/Items/Restraint/ShadowLatex.png new file mode 100644 index 000000000..af8d082df Binary files /dev/null and b/Game/Items/Restraint/ShadowLatex.png differ diff --git a/Game/Items/Restraint/Slime.png b/Game/Items/Restraint/Slime.png new file mode 100644 index 000000000..49b936f43 Binary files /dev/null and b/Game/Items/Restraint/Slime.png differ diff --git a/Game/Items/Restraint/SteelArmor.png b/Game/Items/Restraint/SteelArmor.png new file mode 100644 index 000000000..c5955de93 Binary files /dev/null and b/Game/Items/Restraint/SteelArmor.png differ diff --git a/Game/Items/Restraint/SteelBoots.png b/Game/Items/Restraint/SteelBoots.png new file mode 100644 index 000000000..3206aa1f8 Binary files /dev/null and b/Game/Items/Restraint/SteelBoots.png differ diff --git a/Game/Items/Restraint/SteelPlugs.png b/Game/Items/Restraint/SteelPlugs.png new file mode 100644 index 000000000..17b7b9ad4 Binary files /dev/null and b/Game/Items/Restraint/SteelPlugs.png differ diff --git a/Game/Items/Restraint/SteelSkirt.png b/Game/Items/Restraint/SteelSkirt.png new file mode 100644 index 000000000..cd86a8eb5 Binary files /dev/null and b/Game/Items/Restraint/SteelSkirt.png differ diff --git a/Game/Items/Restraint/Straitjackets.png b/Game/Items/Restraint/Straitjackets.png new file mode 100644 index 000000000..39465cdcd Binary files /dev/null and b/Game/Items/Restraint/Straitjackets.png differ diff --git a/Game/Items/Restraint/StrongMagicRopes.png b/Game/Items/Restraint/StrongMagicRopes.png new file mode 100644 index 000000000..6b4663db1 Binary files /dev/null and b/Game/Items/Restraint/StrongMagicRopes.png differ diff --git a/Game/Items/Restraint/Stuffing.png b/Game/Items/Restraint/Stuffing.png new file mode 100644 index 000000000..3bdd1572f Binary files /dev/null and b/Game/Items/Restraint/Stuffing.png differ diff --git a/Game/Items/Restraint/Sunglasses.png b/Game/Items/Restraint/Sunglasses.png new file mode 100644 index 000000000..ecfa1e16b Binary files /dev/null and b/Game/Items/Restraint/Sunglasses.png differ diff --git a/Game/Items/Restraint/Sunglasses2.png b/Game/Items/Restraint/Sunglasses2.png new file mode 100644 index 000000000..1613899c0 Binary files /dev/null and b/Game/Items/Restraint/Sunglasses2.png differ diff --git a/Game/Items/Restraint/SupremeBelt.png b/Game/Items/Restraint/SupremeBelt.png new file mode 100644 index 000000000..5f3d8110a Binary files /dev/null and b/Game/Items/Restraint/SupremeBelt.png differ diff --git a/Game/Items/Restraint/Swimsuit.png b/Game/Items/Restraint/Swimsuit.png new file mode 100644 index 000000000..f82247c13 Binary files /dev/null and b/Game/Items/Restraint/Swimsuit.png differ diff --git a/Game/Items/Restraint/Tape.png b/Game/Items/Restraint/Tape.png new file mode 100644 index 000000000..9f6ff1142 Binary files /dev/null and b/Game/Items/Restraint/Tape.png differ diff --git a/Game/Items/Restraint/Thumbcuffs.png b/Game/Items/Restraint/Thumbcuffs.png new file mode 100644 index 000000000..ce6b8bd24 Binary files /dev/null and b/Game/Items/Restraint/Thumbcuffs.png differ diff --git a/Game/Items/Restraint/Ties.png b/Game/Items/Restraint/Ties.png new file mode 100644 index 000000000..755d0f7a4 Binary files /dev/null and b/Game/Items/Restraint/Ties.png differ diff --git a/Game/Items/Restraint/Vibes.png b/Game/Items/Restraint/Vibes.png new file mode 100644 index 000000000..9dfc9dcfc Binary files /dev/null and b/Game/Items/Restraint/Vibes.png differ diff --git a/Game/Items/Restraint/VinylTape.png b/Game/Items/Restraint/VinylTape.png new file mode 100644 index 000000000..27ce73f8f Binary files /dev/null and b/Game/Items/Restraint/VinylTape.png differ diff --git a/Game/Items/Restraint/WeakMagicRopes.png b/Game/Items/Restraint/WeakMagicRopes.png new file mode 100644 index 000000000..aad6d0fe0 Binary files /dev/null and b/Game/Items/Restraint/WeakMagicRopes.png differ diff --git a/Game/Items/Restraint/WiredVibe.png b/Game/Items/Restraint/WiredVibe.png new file mode 100644 index 000000000..0613c0a6e Binary files /dev/null and b/Game/Items/Restraint/WiredVibe.png differ diff --git a/Game/Items/Restraint/WolfCuffs.png b/Game/Items/Restraint/WolfCuffs.png new file mode 100644 index 000000000..2cf5c7bb1 Binary files /dev/null and b/Game/Items/Restraint/WolfCuffs.png differ diff --git a/Game/Items/Restraint/Yokes.png b/Game/Items/Restraint/Yokes.png new file mode 100644 index 000000000..d5e9936e5 Binary files /dev/null and b/Game/Items/Restraint/Yokes.png differ diff --git a/Game/Items/Restraint/liquidMetal.png b/Game/Items/Restraint/liquidMetal.png new file mode 100644 index 000000000..f3145e935 Binary files /dev/null and b/Game/Items/Restraint/liquidMetal.png differ diff --git a/Game/Items/Rock.png b/Game/Items/Rock.png new file mode 100644 index 000000000..4ba4f849d Binary files /dev/null and b/Game/Items/Rock.png differ diff --git a/Game/Items/Rope.aseprite b/Game/Items/Rope.aseprite index 502d9388c..a58af35d7 100644 Binary files a/Game/Items/Rope.aseprite and b/Game/Items/Rope.aseprite differ diff --git a/Game/Items/RopeRune.png b/Game/Items/RopeRune.png new file mode 100644 index 000000000..ad53f3370 Binary files /dev/null and b/Game/Items/RopeRune.png differ diff --git a/Game/Items/SackOfSacks.png b/Game/Items/SackOfSacks.png new file mode 100644 index 000000000..9650c8dbf Binary files /dev/null and b/Game/Items/SackOfSacks.png differ diff --git a/Game/Items/Shield.png b/Game/Items/Shield.png new file mode 100644 index 000000000..4e874bea3 Binary files /dev/null and b/Game/Items/Shield.png differ diff --git a/Game/Items/ShieldMagic.png b/Game/Items/ShieldMagic.png new file mode 100644 index 000000000..f8d9e6cd1 Binary files /dev/null and b/Game/Items/ShieldMagic.png differ diff --git a/Game/Items/ShieldReinforced.png b/Game/Items/ShieldReinforced.png new file mode 100644 index 000000000..f9a5a69af Binary files /dev/null and b/Game/Items/ShieldReinforced.png differ diff --git a/Game/Items/ShieldTower.png b/Game/Items/ShieldTower.png new file mode 100644 index 000000000..f660b43a6 Binary files /dev/null and b/Game/Items/ShieldTower.png differ diff --git a/Game/Items/SlimeClaymore.png b/Game/Items/SlimeClaymore.png new file mode 100644 index 000000000..a91bb022e Binary files /dev/null and b/Game/Items/SlimeClaymore.png differ diff --git a/Game/Items/SlimeSword.png b/Game/Items/SlimeSword.png new file mode 100644 index 000000000..18abe5a2c Binary files /dev/null and b/Game/Items/SlimeSword.png differ diff --git a/Game/Items/SmokeBomb.png b/Game/Items/SmokeBomb.png index f8f2d3085..361290e67 100644 Binary files a/Game/Items/SmokeBomb.png and b/Game/Items/SmokeBomb.png differ diff --git a/Game/Items/Snuffer.png b/Game/Items/Snuffer.png new file mode 100644 index 000000000..6a3be6696 Binary files /dev/null and b/Game/Items/Snuffer.png differ diff --git a/Game/Items/StaffTape.png b/Game/Items/StaffTape.png new file mode 100644 index 000000000..c308c3faa Binary files /dev/null and b/Game/Items/StaffTape.png differ diff --git a/Game/Items/Sunglasses.png b/Game/Items/Sunglasses.png new file mode 100644 index 000000000..ecfa1e16b Binary files /dev/null and b/Game/Items/Sunglasses.png differ diff --git a/Game/Items/Sweeper.png b/Game/Items/Sweeper.png new file mode 100644 index 000000000..6ddd2588e Binary files /dev/null and b/Game/Items/Sweeper.png differ diff --git a/Game/Items/UniversalSolvent.png b/Game/Items/UniversalSolvent.png new file mode 100644 index 000000000..53749410b Binary files /dev/null and b/Game/Items/UniversalSolvent.png differ diff --git a/Game/Items/VibeRemote.png b/Game/Items/VibeRemote.png new file mode 100644 index 000000000..0d8c4fda0 Binary files /dev/null and b/Game/Items/VibeRemote.png differ diff --git a/Game/KDAutoStruggle.js b/Game/KDAutoStruggle.js deleted file mode 100644 index 7f6bb27ea..000000000 --- a/Game/KDAutoStruggle.js +++ /dev/null @@ -1,375 +0,0 @@ -'use strict'; - -/** @typedef {{action: string, id: string, result: string, favorability: number, delay: number,}} KDAS_Result */ -/** @typedef {{action: string, id: string, group: string, index: number}} KDAS_Action */ - -let KDAutoStruggleData = { - lastTick: 0, - /** @type {KDAS_Result[]} */ - lastActionQueue: [], - decidedAction: "", - - /** State params for PC focus */ - /** @type {{action: KDAS_Action, weight: number}[]} */ - possibleActions: [], - /** Measure of despair accumulated with each item, downgrades the item in terms of weight - * @type {Record} - */ - totalDespair: {}, - - currentFocusGroup: "", - currentFocusIndex: 0, - /** Despair is the PCs measure of whether to give up and try something else*/ - currentFocusDespair: 0, - /** DespairTarget is the PC's value decided for how much effort she is willing to put in */ - currentFocusDespairTarget: 0, - - /** Overalldespair determines how much individual hope the protag has for restraints working */ - overallDespair: 0, - /** Lengthens the duration of waiting between inputs */ - lastDelay: 0, - - /** For the Wiggle action, only moves within this point and only cuts when at the center*/ - /** @type {{x: number, y: number}} */ - wigglePoint: null, - wiggleDist: 2.99, -}; - -/** @type {Record number, playerweight?: (player: entity) => number, action: (player: entity) => KDAS_Result}>} */ -let KDAutoStruggleActions = { - "Struggle": { - itemweight: (player, item) => { - if (KDGetCurse(item) || KDRestraint(item).good) return 0; - return 10 / Math.max(1, KDRestraint(item).power); - }, - action: (player) => { - let action = "Struggle"; - let result = KDSendInput("struggle", {group: KDAutoStruggleData.currentFocusGroup, index: KDAutoStruggleData.currentFocusIndex, type: action}); - let favor = KDAS_SwitchFavor(result); - let delay = KDAS_SwitchDelay(result); - return { - action: action, - favorability: favor, - delay: delay, - id: KDAutoWaitIndexID(player, KDAutoStruggleData.currentFocusGroup, KDAutoStruggleData.currentFocusIndex, action), - result: result, - }; - }, - }, - "Remove": { - itemweight: (player, item) => { - if (item.lock) return 0; - if (KDGetCurse(item) || KDRestraint(item).good) return 0; - if (!KDRestraint(item).alwaysStruggleable && KDGroupBlocked(KDRestraint(item).Group)) return 0; - return 10 / Math.max(1, KDRestraint(item).power); - }, - action: (player) => { - let action = "Remove"; - let result = KDSendInput("struggle", {group: KDAutoStruggleData.currentFocusGroup, index: KDAutoStruggleData.currentFocusIndex, type: action}); - let favor = KDAS_SwitchFavor(result); - let delay = KDAS_SwitchDelay(result); - return { - action: action, - favorability: favor, - delay: delay, - id: KDAutoWaitIndexID(player, KDAutoStruggleData.currentFocusGroup, KDAutoStruggleData.currentFocusIndex, action), - result: result, - }; - }, - }, - "Cut": { - itemweight: (player, item) => { - if (!KDAS_InWigglePoint(player) && !KinkyDungeonWallCrackAndKnife(false)) return 0; - if (KDGetCurse(item) || KDRestraint(item).good) return 0; - if (!KDRestraint(item).alwaysStruggleable && KDGroupBlocked(KDRestraint(item).Group)) return 0; - if (!((KinkyDungeonAllWeapon().some((inv) => {return KDWeapon(inv).light && KDWeapon(inv).cutBonus != undefined;}) || KinkyDungeonGetAffinity(false, "Sharp")) - && !(KDRestraint(item) && KDRestraint(item).escapeChance && KDRestraint(item).escapeChance.Cut == undefined))) return 0; - return 10 / Math.max(1, KDRestraint(item).power); - }, - action: (player) => { - let action = "Cut"; - let result = KDSendInput("struggle", {group: KDAutoStruggleData.currentFocusGroup, index: KDAutoStruggleData.currentFocusIndex, type: action}); - let favor = KDAS_SwitchFavor(result); - let delay = KDAS_SwitchDelay(result); - if (result == "Drop") KDAS_UpdateWigglePoint(player, true); - return { - action: action, - favorability: favor, - delay: delay, - id: KDAutoWaitIndexID(player, KDAutoStruggleData.currentFocusGroup, KDAutoStruggleData.currentFocusIndex, action), - result: result, - }; - }, - }, - "Wait": { - playerweight: (player) => { - return 20*Math.max(0, - KinkyDungeonStatStamina - KinkyDungeonStatStaminaCostStruggle * 2); - }, - action: (player) => { - KDSendInput("move", {dir: {x:0, y: 0, delta: 0}, delta: 1, AllowInteract: true, AutoDoor: KinkyDungeonToggleAutoDoor, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, true); - return {action: "wait", id: "", result: "fail", delay: 0, favorability: KinkyDungeonStatStamina > (Math.max(KinkyDungeonStatStaminaCostStruggle * 2, KinkyDungeonStatStaminaMax * 0.7)) ? -10 - : (KinkyDungeonStatStamina > KinkyDungeonStatStaminaCostStruggle * 2 ? -4 : -1)}; - }, - }, - "Wiggle": { - playerweight: (player) => { - return KDAutoStruggleData.lastActionQueue.some((action) => {return action.result == "Drop" || action.result == "NeedEdge";}) ? - ((KDAffinityList.some((affinity) => {return KinkyDungeonGetAffinity(false, affinity);})) ? 5 : 50) - : ((KDAffinityList.some((affinity) => {return KinkyDungeonGetAffinity(false, affinity);})) ? 0.5 : (2 + Math.min(8, KDAutoStruggleData.overallDespair/10))); - }, - action: (player) => { - let wigglePoints = KDAS_GetMovableWigglePoint(player, Math.random() < 0.5); - let point = wigglePoints[Math.floor(Math.random() * wigglePoints.length)] || {x: 0, y: 0}; - KDSendInput("move", {dir: {x:point.x - player.x, y: point.y-player.y, delta: 0}, delta: 1, AllowInteract: true, AutoDoor: KinkyDungeonToggleAutoDoor, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, true); - KinkyDungeonSendActionMessage(6, TextGet("KDWiggle"), "#aaaaaa", 1); - if (KDAffinityList.some((affinity) => {return KinkyDungeonGetAffinity(false, affinity);})) { - KDAutoStruggleData.decidedAction = ""; - } - return {action: "wiggle", id: "", result: "fail", delay: 1, favorability: KinkyDungeonStatStamina > (Math.max(KinkyDungeonStatStaminaCostStruggle * 2, KinkyDungeonStatStaminaMax * 0.7)) ? -3 - : (KinkyDungeonStatStamina > KinkyDungeonStatStaminaCostStruggle * 2 ? -2 : -1)}; - }, - }, -}; - -/** - * Function to reset certain state variables of auto struggle - */ -function KDInitAutoStruggle() { - KDAutoStruggleData.possibleActions = []; - KDAutoStruggleData.lastActionQueue = []; - KDAutoStruggleData.decidedAction = ""; - - KDAutoStruggleData.currentFocusGroup = ""; - KDAutoStruggleData.currentFocusIndex = 0; - KDAutoStruggleData.currentFocusDespair = 0; - KDAutoStruggleData.currentFocusDespairTarget = 0; - - - KDAutoStruggleData.overallDespair = 0; - KDAutoStruggleData.totalDespair = {}; - - KDAutoStruggleData.wigglePoint = null; - - KDAutoStruggleData.lastTick = KinkyDungeonCurrentTick; -} - -/** - * Updates the wiggle point - * @param {entity} player - * @param {boolean} [force] - */ -function KDAS_UpdateWigglePoint(player, force) { - let wpx = KDAutoStruggleData.wigglePoint?.x; - let wpy = KDAutoStruggleData.wigglePoint?.y; - if (force || (!KDAutoStruggleData.wigglePoint || KDistChebyshev(player.x - wpx, player.y - wpy) > 1.5)) { - KDAutoStruggleData.wigglePoint = {x: player.x, y: player.y}; - } -} - -/** - * Returns if the player is on the wiggle point or not - * @param {entity} player - * @returns {boolean} - */ -function KDAS_InWigglePoint(player) { - KDAS_UpdateWigglePoint(player); - return (player.x == KDAutoStruggleData.wigglePoint.x && player.y == KDAutoStruggleData.wigglePoint.y); -} -/** - * Returns an array of tiles the player can move near the wiggle points - * @param {entity} player - * @param {boolean} goCloser - If the player has to move closer to the wiggle point - * @returns {{x: number, y: number}[]} - */ -function KDAS_GetMovableWigglePoint(player, goCloser) { - KDAS_UpdateWigglePoint(player); - let list = []; - let dist = KDAutoStruggleData.wiggleDist; - let wpx = KDAutoStruggleData.wigglePoint.x; - let wpy = KDAutoStruggleData.wigglePoint.y; - let currentPdist = KDistEuclidean(player.x - wpx, player.y - wpy); - for (let XX = Math.floor(player.x - dist); XX <= Math.ceil(player.x + dist); XX++) { - for (let YY = Math.floor(player.y - dist); YY <= Math.ceil(player.y + dist); YY++) { - let pdist = KDistEuclidean(XX - wpx, YY - wpy); - if (KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(XX, YY)) - && pdist <= dist - && (!goCloser || pdist < currentPdist) - && KDistChebyshev(player.x - XX, player.y - YY) < 1.5) { - list.push({x:XX, y:YY}); - } - } - } - - return list; -} - -/** - * - * @param {string} result - * @returns {number} - */ -function KDAS_SwitchFavor(result) { - switch(result) { - case "Success": return 5; - case "Fail": return -1; - case "Impossible": return -10; - case "NeedEdge": return -5; - case "Drop": return -10; - case "Limit": return -6; - case "Strict": return -6; - } - return -1; -} - -/** - * - * @param {string} result - * @returns {number} - */ -function KDAS_SwitchDelay(result) { - switch(result) { - case "Success": return 12; - case "Fail": return 1; - case "Impossible": return 4; - case "NeedEdge": return 3; - case "Drop": return 9; - case "Limit": return 6; - case "Strict": return 3; - } - return -1; -} - -/** - * Master function for handling the Auto Struggle state machine - * @param {entity} player - */ -function KDHandleAutoStruggle(player) { - if (KinkyDungeonCurrentTick > KDAutoStruggleData.lastTick + 10) { - // Reset the data if it's stale - KDInitAutoStruggle(); - } - KDAutoStruggleData.lastTick = KinkyDungeonCurrentTick; - - // Examine the state of things - KDAutoStruggleEvaluate(player); - // Actually do something - KDAutoStruggleMakeDecision(player); - // Run the decision that was made - let result = KDAutoStruggleRunDecision(player); - - console.log(result); -} - -/** - * Updates the KDAutoStruggleData state data to accurately reflect the player - * @param {entity} player - */ -function KDAutoStruggleEvaluate(player) { - KDAutoStruggleData.possibleActions = []; - - // First get actions with an itemweight - for (let inv of KinkyDungeonAllRestraint()) { - let items = KDDynamicLinkListSurface(inv); - let link = items[0]; - let index = 0; - let group = KDRestraint(inv).Group; - while (link) { - for (let action of Object.entries(KDAutoStruggleActions)) { - if (action[1].itemweight) { - KDAutoStruggleData.possibleActions.push({ - action: { - action: action[0], - group: group, - index: index, - id: KDAutoWaitIndexID(player, group, index, action[0]), - }, - weight: action[1].itemweight(player, link), - }); - } - } - - index += 1; - link = items[index]; - } - } - - // Now to get other actions that dont have an itemweight - for (let action of Object.entries(KDAutoStruggleActions)) { - if (action[1].playerweight) { - KDAutoStruggleData.possibleActions.push({ - action: { - action: action[0], - group: "", - index: 0, - id: KDAutoWaitIndexID(player, "", 0, action[0]), - }, - weight: action[1].playerweight(player), - }); - } - } -} - - -/** - * Updates the KDAutoStruggleData decidedAction variable - * @param {entity} player - */ -function KDAutoStruggleMakeDecision(player) { - if (KDAutoStruggleData.decidedAction && KDAutoStruggleData.currentFocusDespair < KDAutoStruggleData.currentFocusDespairTarget - && (!KDAutoStruggleData.currentFocusGroup || (KinkyDungeonGetRestraintItem(KDAutoStruggleData.currentFocusGroup, KDAutoStruggleData.currentFocusIndex)))) { - // Keep doing what you doing - } else { - let totalWeight = 0; - let currentWeights = []; - for (let action of KDAutoStruggleData.possibleActions) { - totalWeight += action.weight * (1 / (1 + 0.01 * (KDAutoStruggleData.totalDespair[action.action.id]||0))); - currentWeights.push({action: action.action, weight: totalWeight}); - } - let selection = Math.random() * totalWeight; - for (let action of currentWeights) { - if (action.weight > selection) { - KDAutoStruggleData.decidedAction = action.action.action; - KDAutoStruggleData.currentFocusGroup = action.action.group; - KDAutoStruggleData.currentFocusindex = action.action.index; - KDAutoStruggleData.currentFocusDespair = 0; - KDAutoStruggleData.currentFocusDespairTarget = 10; - break; - } - } - } - - -} - -/** - * Executes the run decision - * @param {entity} player - */ -function KDAutoStruggleRunDecision(player) { - /** @type {KDAS_Result} */ - let result = null; - if (KDAutoStruggleActions[KDAutoStruggleData.decidedAction]) { - result = KDAutoStruggleActions[KDAutoStruggleData.decidedAction].action(player); - KDAutoStruggleData.currentFocusDespair = Math.max(0, (KDAutoStruggleData.currentFocusDespair || 0) - result.favorability); - KDAutoStruggleData.totalDespair[result.id] = Math.max(0, (KDAutoStruggleData.totalDespair[result.id] || 0) - result.favorability); - KDAutoStruggleData.overallDespair += Math.max(0, - result.favorability); - KDAutoStruggleData.lastDelay = Math.max(0, result.delay); - } else { - // Wait - KDSendInput("move", {dir: {x:0, y: 0, delta: 0}, delta: 1, AllowInteract: true, AutoDoor: KinkyDungeonToggleAutoDoor, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, true); - result = {action: "wait", id: "", result: "fail", favorability: -1, delay: 0}; - } - if (result) - KDAutoStruggleData.lastActionQueue.unshift(result); - - KDAutoStruggleData.lastActionQueue = KDAutoStruggleData.lastActionQueue.slice(0, 15); - - return result; -} - - - - -function KDAutoWaitIndexID(player, group, index, action) { - return `${group}_${KinkyDungeonGetRestraintItem(group)?.name}_${index}_${action}`; -} \ No newline at end of file diff --git a/Game/KDClasses.js b/Game/KDClasses.js deleted file mode 100644 index 1fc6ac65b..000000000 --- a/Game/KDClasses.js +++ /dev/null @@ -1,92 +0,0 @@ -'use strict'; - -let KDClassReqs = { - "Trainee": () => {return KinkyDungeonSexyMode;} -}; - -let KDClassStart = { - "Fighter": () => { // Fighter - KinkyDungeonInventoryAddWeapon("Knife"); - KinkyDungeonInventoryAddWeapon("Sword"); - if (!KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("Breastplate"), 0, true, "")) - KinkyDungeonInventoryAddLoose("Breastplate"); - KDGameData.PreviousWeapon = "Knife"; - KDSetWeapon("Sword"); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("CommandWord")); - KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("WPUp1")); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("WPUp1")); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("IronWill")); - KinkyDungeonSpellPoints = 3; - KinkyDungeonRedKeys = 1; - KinkyDungeonLockpicks = 1; - KinkyDungeonGold = 100; - - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionStamina, 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionFrigid, 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, 2); - }, - "Rogue": () => { // Rogue - KinkyDungeonInventoryAddWeapon("Rope"); - KinkyDungeonInventoryAddWeapon("Dirk"); - - if (!KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("LeatherBoots"), 0, true, "")) - KinkyDungeonInventoryAddLoose("LeatherBoots"); - KDGameData.PreviousWeapon = "Rope"; - KDSetWeapon("Dirk"); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("CommandWord")); - KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("SPUp1")); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("SPUp1")); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("Sneaky")); - KinkyDungeonSpellPoints = 3; - KinkyDungeonLockpicks = 2; - KinkyDungeonGold = 100; - - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionStamina, 2); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionFrigid, 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, 1); - }, - "Mage": () => { // Mage - KinkyDungeonInventoryAddWeapon("Knife"); - KinkyDungeonInventoryAddWeapon("ArcaneCrystal"); - KDGameData.PreviousWeapon = "Knife"; - KDSetWeapon("ArcaneCrystal"); - - KinkyDungeonSpells.push(KinkyDungeonFindSpell("CommandWord")); - KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("Analyze")); - KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("MPUp1")); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("MPUp1")); - KinkyDungeonSpellPoints = 3; - KinkyDungeonRedKeys = 1; - KinkyDungeonGold = 100; - - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 3); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionFrigid, 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, 1); - }, - "Peasant": () => { // Peasant - KinkyDungeonSpellChoices = []; - KinkyDungeonSpellPoints = 3; - }, - "Trainee": () => { // Trainee - KinkyDungeonSpellChoices = []; - KinkyDungeonSpellPoints = 3; - KinkyDungeonGold = 100; - KinkyDungeonSpellChoices = []; - KinkyDungeonSpells.push(KinkyDungeonFindSpell("DistractionCast")); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("MPUp1")); - KinkyDungeonSpells.push(KinkyDungeonFindSpell("APUp1")); - KinkyDungeonInventoryAddWeapon("Knife"); - KDSetWeapon("Knife"); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 3); - KinkyDungeonChangeFactionRep("Apprentice", .2); - - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug2"), 100, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), 100, true, "Gold"); - }, -}; \ No newline at end of file diff --git a/Game/KDDelayedActions.js b/Game/KDDelayedActions.js deleted file mode 100644 index 12ce6f929..000000000 --- a/Game/KDDelayedActions.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict'; - -/** Prunes delayed actions with tags - * @param {string[]} tags -*/ -function KDDelayedActionPrune(tags) { - KDGameData.DelayedActions = KDGameData.DelayedActions ? KDGameData.DelayedActions.filter((action) => { - for (let t of tags) { - if (action.tags.includes(t)) return false; - } - return true; - }) : []; -} - -/** - * Adds a delayed action - * @param {KDDelayedAction} action - */ -function KDAddDelayedAction(action) { - KDGameData.DelayedActions.push(Object.assign({}, action)); -} - -/** This is processed for delayed actions - * @type {Record void>} - */ -let KDDelayedActionUpdate = { - "RequireWill": (action) => { - if (!(KinkyDungeonStatWill > 0)) action.time = 0; - }, -}; -/** This is processed for delayed actions - * @type {Record void>} - */ -let KDDelayedActionCommit = { - "Consumable": (action) => { - if (KinkyDungeonGetInventoryItem(action.data.Name)) - KinkyDungeonUseConsumable(action.data.Name, action.data.Quantity); - }, - "Armor": (action) => { - if (KinkyDungeonGetInventoryItem(action.data.Name)) - KinkyDungeonUseConsumable(action.data.Name, action.data.Quantity); - }, - "Struggle": (action) => { - /** - * Data format: - * group: string - * index: number - * amount: number - * escapeData: escape data - */ - let dynamic = KDGetDynamicItem(action.data.group, action.data.index); - let restraint = dynamic.restraint; - let host = dynamic.host; - if (restraint) { - KinkyDungeonSetFlag("escaping", 2); - let lockType = restraint.lock && KDLocks[restraint.lock] ? KDLocks[restraint.lock] : null; - let struggleType = action.data.escapeData.struggleType; - if (struggleType == "Struggle" || struggleType == "Remove" || struggleType == "Cut") { - if (struggleType == "Cut") - restraint.cutProgress += action.data.amount; - else restraint.struggleProgress += action.data.amount; - let progress = (restraint.struggleProgress || 0) + (restraint.cutProgress || 0); - if (progress > 1) - KDSuccessRemove(struggleType, restraint, lockType, action.data.index, action.data.escapeData, host); - else KDStunTurns(1, true); - - } else if (struggleType == "Unlock") { - restraint.unlockProgress += action.data.amount; - if (restraint.unlockProgress > 1) - KDSuccessRemove(struggleType, restraint, lockType, action.data.index, action.data.escapeData, host); - else KDStunTurns(1, true); - } else if (struggleType == "Pick") { - restraint.pickProgress += action.data.amount; - if (restraint.pickProgress > 1) - KDSuccessRemove(struggleType, restraint, lockType, action.data.index, action.data.escapeData, host); - else KDStunTurns(1, true); - } - } - }, -}; \ No newline at end of file diff --git a/Game/KDModUtils.js b/Game/KDModUtils.js deleted file mode 100644 index 6121bf24e..000000000 --- a/Game/KDModUtils.js +++ /dev/null @@ -1,180 +0,0 @@ -'use strict'; - -function addTextKey(Name, Text) { - let ct = 0; - for (let screen of TextAllScreenCache.entries()) { - if (screen[0].includes("KinkyDungeon")) { - screen[1].cache[Name] = Text; - } else console.log("ERROR LOADING TEXT!!!"); - } - if (ct == 0) KDLoadingTextKeys[Name] = Text; -} - -const cloneDeep = (obj) => - JSON.parse(JSON.stringify(obj)); - -const defaultRestraint = { - inventory: true, - power: 0, - weight: 0, - minLevel: 0, - allFloors: true, - - escapeChance: { - "Struggle": 10, - "Cut": 10, - "Remove": 10 - }, - - events: [], - enemyTags: [], - playerTags: [], - shrine: [], -}; - -/** - * Creates a restraint using a set of reasonable defaults and adds it to the list of restraints. - * - * @param {KDRestraintProps} props - * A list of restraint props to be applied. At minimum, the "name", "Group" and "Asset" props should be provided. - * - * @param {string} [displayName] - * The name displayed to the user for the restraint. - * - * @param {string} [flavorText] - * Text that describes the "look and feel" of the restraint. - * - * @param {string} [functionText] - * Text that describes how the restraint operates. - * @returns The created restraint. - */ -function KinkyDungeonCreateRestraint(props, displayName, flavorText, functionText) { - if (!props.name || !props.Group || !props.Asset) { - throw new Error('name, Group and Asset props must be provided.'); - } - - const restraint = ({ - ...cloneDeep(defaultRestraint), - ...props - }); - - KinkyDungeonRestraints.push(restraint); - if (displayName) { - KinkyDungeonAddRestraintText(props.name, displayName, flavorText, functionText); - } - return restraint; -} - -/** - * @type {Record>} - */ -let KDCursedVariantsCreated = { -}; - -/** - * This function adds cursed variants to the restraint list - * @param {restraint} Restraint - The restraint to have extra variants added onto - * @param {string[]} Variants - Names of the cursed variants to apply. Must be from KDCursedVars - */ -function KinkyDungeonAddCursedVariants(Restraint, Variants) { - for (let v of Variants) { - if (KDCursedVars[v]) { - KinkyDungeonCloneRestraint(Restraint.name, Restraint.name+v, KDCursedVars[v].variant(Restraint, Restraint.name+v)); - if (!KDCursedVariantsCreated[Restraint.name]) KDCursedVariantsCreated[Restraint.name] = {}; - KDCursedVariantsCreated[Restraint.name][v] = KDCursedVars[v].level; - } - } -} - -/** - * Gets a list of curses applied to the item - * @param {string} Restraint - * @param {boolean} [includeOrig] - includes thje original item - * @param {number} [minLevel] - for gating curse severity - * @param {number} [maxLevel] - for gating curse severity - * @returns {string[]} - */ -function KinkyDungeonGetCurses(Restraint, includeOrig, minLevel, maxLevel) { - if (KDCursedVariantsCreated[Restraint]) { - let keys = Object.keys(KDCursedVariantsCreated[Restraint]).filter((key) => { - return (!minLevel || KDCursedVariantsCreated[Restraint][key] >= minLevel) - && (!maxLevel || KDCursedVariantsCreated[Restraint][key] < maxLevel); - }).map((element) => {return Restraint + element;}); - if (includeOrig) keys.push(Restraint); - return keys; - } - return []; -} - -/** - * Creates a restraint using an existing restraint as a base and adds it to the list of restraints. - * - * @param {string} clonedName - * The name of the restraint to be cloned. - * - * @param {string} newName - * The name of the newly created restraint. - * - * @param {object} props - * A list of restraint props to be applied. Anything that isn't supplied with be identical to the base object. - * - * @returns The created restraint. - */ -function KinkyDungeonCloneRestraint(clonedName, newName, props) { - const existingRestraint = KinkyDungeonRestraints.find(restraint => restraint.name === clonedName); - - if (!existingRestraint) { - throw new Error(`No restraint named ${clonedName}.`); - } - - const newRestraint = ({ - ...cloneDeep(existingRestraint), - name: newName - }); - - Object.assign(newRestraint, props); - - KinkyDungeonRestraints.push(newRestraint); - - return newRestraint; -} - -/** - * Registers text for a named restraint. - * - * @param {string} name - * The name of the restraint used by the system. - * - * @param {string} displayName - * The name displayed to the user for the restraint. - * - * @param {string} flavorText - * Text that describes the "look and feel" of the restraint. - * - * @param {string} functionText - * Text that describes how the restraint operates. - */ -function KinkyDungeonAddRestraintText(name, displayName, flavorText, functionText) { - const baseKey = `Restraint${name}`; - - addTextKey(baseKey, displayName); - addTextKey(`${baseKey}Desc`, flavorText); - addTextKey(`${baseKey}Desc2`, functionText); -} - -/** - * Registers text for a named restraint. - * - * @param {string} restraint - The name of the restraint used by the system. - * @param {string} newRestraint - The name of the new restraint used by the system. - * - */ -function KinkyDungeonDupeRestraintText(restraint, newRestraint) { - const oldKey = `Restraint${restraint}`; - const baseKey = `Restraint${newRestraint}`; - - addTextKey(baseKey, TextGetKD(oldKey)); - addTextKey(`${baseKey}Desc`, TextGetKD(`${oldKey}Desc`)); - addTextKey(`${baseKey}Desc2`, TextGetKD(`${oldKey}Desc2`)); -} - diff --git a/Game/KDParticles.js b/Game/KDParticles.js deleted file mode 100644 index 707624140..000000000 --- a/Game/KDParticles.js +++ /dev/null @@ -1,199 +0,0 @@ -'use strict'; - -/** @type {Map} */ -let KDParticles = new Map(); -let KDParticleid = 0; - -/** - * - * @param {number} x - * @param {number} y - * @param {string} img - * @param {string} type - * @param {KDParticleData} data - */ -function KDAddParticle(x, y, img, type, data) { - if (KDParticles.size > 1000) return; - let tex = KDTex(img); - - if (tex && data) { - // Setup info... - let info = Object.assign({}, data); - Object.assign(info, { - time: 0, - lifetime: (data.lifetime || 0) + (data.lifetime_spread ? (Math.random()*data.lifetime_spread - data.lifetime_spread*0.5) : 0), - zIndex: data.zIndex || 100, - vy: data.vy + (data.vy_spread ? (Math.random()*data.vy_spread - data.vy_spread*0.5) : 0), - vx: data.vx + (data.vx_spread ? (Math.random()*data.vx_spread - data.vx_spread*0.5) : 0), - sin_y: data.sin_y + (data.sin_y_spread ? (Math.random()*data.sin_y_spread - data.sin_y_spread*0.5) : 0), - sin_x: data.sin_x + (data.sin_x_spread ? (Math.random()*data.sin_x_spread - data.sin_x_spread*0.5) : 0), - sin_period: data.sin_period + (data.sin_period_spread ? (Math.random()*data.sin_period_spread - data.sin_period_spread*0.5) : 0), - phase: data.phase || 0, - }); - // Create the sprite - // @ts-ignore - let sprite = PIXI.Sprite.from(tex); - sprite.position.x = x; - sprite.position.y = y; - sprite.zIndex = info.zIndex; - - if (info.fadeEase) { - switch (info.fadeEase) { - case "invcos": {sprite.alpha = Math.min(1, Math.max(0, 1 - Math.cos(2 * Math.PI * info.time / info.lifetime)));} - } - } - - KDParticles.set(KDParticleid, {info: info, sprite: sprite}); - kdparticles.addChild(sprite); - - KDParticleid += 1; - if (KDParticleid > 4000000000) KDParticleid = 0; - } -} - - -function KDUpdateParticles(delta) { - let id = 0; - /** @type {KDParticleData} */ - let info = null; - let sprite = null; - for (let particle of KDParticles.entries()) { - id = particle[0]; - info = particle[1].info; - sprite = particle[1].sprite; - - sprite.anchor.set(0.5); - - if (info.rotation && !sprite.rotation) sprite.rotation = info.rotation; - - if (info.vy) {sprite.position.y += info.vy * delta;} - if (info.vx) {sprite.position.x += info.vx * delta;} - - if (info.sin_x && info.sin_period) {sprite.position.x += info.sin_x * Math.sin(info.phase + info.sin_period * info.time / info.lifetime) * delta;} - if (info.sin_y && info.sin_period) {sprite.position.y += info.sin_y * Math.sin(info.phase + info.sin_period * info.time / info.lifetime) * delta;} - - if (info.fadeEase) { - switch (info.fadeEase) { - case "invcos": {sprite.alpha = Math.min(1, Math.max(0, 1 - Math.cos(2 * Math.PI * info.time / info.lifetime)));} - } - } - - info.time += delta; - if (!info.lifetime || info.time > info.lifetime) { - KDRemoveParticle(id); - } - } -} - -function KDRemoveParticle(id) { - if (KDParticles.has(id)) { - kdparticles.removeChild(KDParticles.get(id).sprite); - KDParticles.get(id).sprite.destroy(); - KDParticles.delete(id); - } -} - -let lastArousalParticle = 0; -let lastVibeParticle = 0; - -/** - * Draws arousal heart particles - * @param {number} pinkChance - 0 to 1 - * @param {number} density - 0 to 1 - * @param {number} purpleChance - 0 to 1 - */ -function KDDrawArousalParticles(pinkChance, density, purpleChance) { - if (density == 0) return; - let arousalRate = 100 / density; - - if (CommonTime() > lastArousalParticle + arousalRate) { - KDCreateArousalParticle(pinkChance, purpleChance); - - lastArousalParticle = CommonTime(); - } - -} - -function KDDrawVibeParticles(density) { - - let arousalRate = 100 / density; - if (KinkyDungeonVibeLevel > 0 && CommonTime() > lastVibeParticle + 0.03 * arousalRate * (2/(2 + KinkyDungeonVibeLevel))) { - KDCreateVibeParticle(); - - lastVibeParticle = CommonTime(); - } -} - -/** - * - */ -function KDCreateVibeParticle() { - let lifetime = 500 + Math.random() * 250; - let x = 250; - let y = 520 + (KinkyDungeonPlayer.Pose.includes("Hogtied") ? 165 : (KinkyDungeonPlayer.IsKneeling() ? 78 : 0)); - let locations = KDSumVibeLocations(); - let vx = ((Math.random() > 0.5) ? -1 : 1) * 0.25; - let vy = -.15 + Math.random() * .3; - let breast = locations.includes("ItemBreast") || locations.includes("ItemNipples"); - let cli = (locations.includes("ItemVulvaPiercings") || locations.includes("ItemPelvis")); - if (breast || cli) { - if (cli && (locations.length == 1 || Math.random() < 0.25)) { - vy = 0.25 + Math.random()*0.1; - vx = -.05 + Math.random() * .1; - } - else if (breast && !KinkyDungeonPlayer.Pose.includes("Hogtied") && (locations.length == 1 || Math.random() < 0.5)) y -= 155; - - } - - if (KinkyDungeonPlayer.HeightRatio) y += (100) * (1 - KinkyDungeonPlayer.HeightRatio); - if (KinkyDungeonPlayer.HeightModifier) y -= KinkyDungeonPlayer.HeightModifier; - - KDAddParticle( - x, - y, - KinkyDungeonRootDirectory + `Particles/VibeHeart.png`, - undefined, { - time: 0, - lifetime: lifetime, - vx: vx, - vy: vy, - zIndex: 60, - sin_x: .04, - sin_x_spread: .01, - sin_period: 1.4, - phase: 6 * Math.random(), - fadeEase: "invcos", - rotation: Math.atan2(vy, vx), - }); -} - -/** - * - * @param {number} pinkChance - 0 to 1 - * @param {number} purpleChance - 0 to 1 - */ -function KDCreateArousalParticle(pinkChance, purpleChance) { - let lifetime = 2000 + Math.random() * 1000; - let y = 200 + Math.random() * 700; - let xval = Math.random() < 0.5 ? 0.3 * Math.random() : (1 - 0.3 * Math.random()); - let x = xval * 500; - let vy = -0.3 * Math.min(500, y) / lifetime; - KDAddParticle( - x, - y, - KinkyDungeonRootDirectory + `Particles/${ - Math.random() < purpleChance ? "HeartPurple" : - (Math.random() < pinkChance ? "HeartPink" : "Heart") - }.png`, - undefined, { - time: 0, - lifetime: lifetime, - vy: vy, - zIndex: -1, - sin_x: .04, - sin_x_spread: .01, - sin_period: 1.4, - phase: 6 * Math.random(), - fadeEase: "invcos", - }); -} \ No newline at end of file diff --git a/Game/KDTypeDefs.ts b/Game/KDTypeDefs.ts deleted file mode 100644 index 819c98d27..000000000 --- a/Game/KDTypeDefs.ts +++ /dev/null @@ -1,2025 +0,0 @@ -type Named = { - name: string, -} - -/** Kinky Dungeon Typedefs*/ -interface item extends Named { - id: number, - /** Contains string data */ - dataString?: Record; - /** Contains numeric data */ - dataNumber?: Record; - /** Used in order to boost performance */ - linkCache?: string[], - /** If the item has a different curse from the base curse */ - curse?: string, - /** Name of the item*/ - name: string, - /** Type of the item*/ - type?: string, - /** Faction of the applied item */ - faction?: string, - /** Events associated with the item*/ - //weapon?: KinkyDungeonWeapon, /** Item weapon data, if applicable*/ - //consumable?: any, /** Item consumable data, if applicable*/ - events?: KinkyDungeonEvent[], - /** Number of consumables in the inventory*/ - quantity?: number, - //looserestraint?: any, /** Loose restraint data, if applicable*/ - //restraint?: any, /** Which restraint the item is associated with*/ - /** Type of lock, Red, Blue, or Gold (potentially more in future)*/ - lock?: string, - /** Bool to describe if the item is tethered to the leashing enemy*/ - tetherToLeasher?: boolean, - /** Bool to describe if the item is tethered to KinkyDungeonJailGuard()*/ - tetherToGuard?: boolean, - /** ID of leashing enemy*/ - tetherEntity?: number, - /** Leashing location*/ - tetherLocation?: {x: number, y: number}, - /** Location of the tether*/ - tx?: number, - /** Location of the tether*/ - ty?: number, - /** Length of the tether*/ - tetherLength?: number, - /** Used for Gold locks only, determines which floor the lock will release*/ - lockTimer?: number, - /** Stores the previously linked item*/ - dynamicLink?: item, - /** Generic item data, able to be manipulated thru events*/ - data?: Record, - /** Escape progress tracking*/ - pickProgress?: number, - /** Escape progress tracking*/ - struggleProgress?: number, - /** Escape progress tracking*/ - cutProgress?: number, - /** Escape progress tracking*/ - unlockProgress?: number, - /** Number of escape attempts, integer*/ - attempts?: number, - /** Can be used to make an item tighter and harder to escape, reduces with each escape attempt*/ - tightness?: number, - /** Determines the current trap attached to the restraint*/ - trap?: string, -} - -interface consumable { - name: string, - rarity: number, - type: string, - shop?: boolean, - spell?: string, - potion?: boolean, - noHands?: boolean, - /** Data var */ - data?: Record, - /** Requirement that overrides all other requirements */ - prereq?: string, - /** Requirement in addition to all other requirements such as not being gagged for potions, bound, etc */ - postreq?: string, - /** Minimum effectiveness when gagged */ - gagFloor?: number, - /** Max gag amount to use */ - gagMax?: number, - /** delay before use */ - delay?: number, - needMouth?: boolean, - /** Max strictness allowed before the item cant be used */ - maxStrictness?: number, - mp_instant?: number, - mpool_instant?: number, - wp_instant?: number, - sp_instant?: number, - ap_instant?: number, - mp_gradual?: number, - wp_gradual?: number, - sp_gradual?: number, - ap_gradual?: number, - arousalRatio?: number, - scaleWithMaxMP?: boolean, - scaleWithMaxSP?: boolean, - scaleWithMaxAP?: boolean, - scaleWithMaxWP?: boolean, - duration?: number, - power?: number, - amount?: number, - rechargeCost?: number, - aura?: string, - buff?: string, - costMod?: number, - shrine?: string, - sfx?: string, - noConsumeOnUse?: boolean, - useQuantity?: number, - /** Support for multiple effects */ - sideEffects?: string[], -} - -type KDHasTags = { - tags: any -} - -interface KDRestraintProps { - /** This item is unaffected by shrines */ - noShrine?:boolean, - /** This item is beneficial and player wont try to struggle from it */ - good?: boolean, - - inventory?: boolean, - power?: number, - weight?: number, - minLevel?: number, - allFloors?: boolean, - - escapeChance?: any, - - events?: KinkyDungeonEvent[], - enemyTags?: Record, - playerTags?: Record, - shrine?: string[], - - debris?: string, - debrisChance?: number, - - /** These items can only be applied if an enemy has the items in her inventory or the unlimited enemy tag */ - limited?: boolean, - /** Forced to allow these, mainly leashes and collars */ - unlimited?: boolean, - - /** Security levels for chastity. Non-tech belts should have a Tech security of undefined. Magic belts should have undefined for key and tech. - * KEY can be circumvented by having a key. Normally you cant remove a plug but you can spend a key to unlock a plug slot for 30 turns or until you are hit or a restraint is removed in that slot. - * Key difficulty of 1 can simply be lockpicked, taking a bit of time. - * Key difficulty of 3 becomes a blue key. - * MAGIC can be circumvented thru CMD: Unlock - * Tech cannot be circumvented by the player. TODO add keycard to allow this. - * Undefined means the specified method can not be used - * Chastity without Security ignores the security system - * NPC ability to unlock is OR. Having the ability to unlock just one of the security levels means the NPC can unlock. - */ - Security?: { - /** Key security level, for low-tech non-mage factions */ - level_key?: number, - /** Tech security level, for robots and wolfgirls */ - level_tech?: number, - /** Magic security level, for mage factions */ - level_magic?: number, - }, - - /** Affinity type: Hook, Edge, or Sharp, Sticky, defaults are Hook (struggle), Sharp (Cut), Edge (Pick), Sticky (Unlock), and none (Pick)*/ - affinity?: { - Struggle?: string[], - Cut?: string[], - Remove?: string[], - Pick?: string[], - Unlock?: string[], - }, - /** - * Makes it so its never impossible to struggle with these methods, usually best combined with struggleMinSpeed - */ - alwaysEscapable?: string[]; - /** - * Makes it so enemies, if they would remove this item to place another restraint on, will simply remove this item instead - * Higher number means resistance to multibind - */ - protection?: number; - /** - * This item only provides protection if its group is being targeted - */ - protectionCursed?: boolean; - /** Determines if the item appears in aroused mode only */ - arousalMode?: boolean, - /** This item lets you access linked items under it */ - accessible?: boolean, - /** This item lets you CANT access linked items under it */ - inaccessible?: boolean, - /** This item lets you ignore its inaccessibility for the sake of trussing up the player */ - deepAccessible?: boolean, - /** WIP, does nothing yet. Should allow you to access the item under even inaccessible stuff */ - alwaysAccessible?: boolean, - /** This item can be rendered when linked */ - renderWhenLinked?: string[]; - // Player must have one of these PlayerTags to equip - requireSingleTagToEquip?: string[]; - /** This item always renders when linked */ - alwaysRender?: boolean, - /** When the mentioned items are rendered, changes the type */ - changeRenderType?: Record; - /** Stacking category, used to determine if you can have multiple of these items in a stack */ - linkCategory?: string; - /** Stacking size, can't exceed 1 */ - linkSize?: number; - /** Enemies ignore you while you are wearing it */ - ignoreNear?: boolean, - /** Enemies wont cast spells or ranged attacks while you are wearing it */ - ignoreSpells?: boolean, - /** Can always struggle even if it's blocked */ - alwaysStruggleable?: boolean, - name: string, - Group: string, - Asset: string, - /** Used for when the visual asset in BC is different from the actual group of the item*/ - AssetGroup?: string, - Color?: string[] | string, - /** Maximum level, wont be used at this or higher. Inclusive. */ - maxLevel?: number, - /** Determines the floors the restraint can appear on */ - floors?: Record, - /** Overrides escapeChance when you have a ghost helping*/ - helpChance?: { - Struggle?: number, - Cut?: number, - Remove?: number, - Pick?: number, - Unlock?: number, - }, - /** Determines the penalty to the escape chance at the limit--full struggle progress when struggling, and 0 for cut/remove/unlock/pick*/ - limitChance?: { - Struggle?: number, - Cut?: number, - Remove?: number, - Pick?: number, - Unlock?: number, - }, - struggleMinSpeed?: { - Struggle?: number, - Cut?: number, - Remove?: number, - Pick?: number, - Unlock?: number, - }, - struggleMaxSpeed?: { - Struggle?: number, - Cut?: number, - Remove?: number, - Pick?: number, - Unlock?: number, - }, - /** Multiplier to struggle power */ - struggleMult?: { - Struggle?: number, - Cut?: number, - Remove?: number, - Pick?: number, - Unlock?: number, - }, - - /** Sound when using an escape method*/ - sfxEscape?: { - Struggle?: string, - Cut?: string, - Remove?: string, - Pick?: string, - Unlock?: string, - NoStamina?: string, - NoWill?: string, - NoMagic?: string, - MagicCut?: string, - PickBreak?: string, - KnifeBreak?: string, - KnifeDrop?: string, - KeyDrop?: string, - PickDrop?: string, - }, - sfxFinishEscape?: { - Struggle?: string, - Cut?: string, - Remove?: string, - Pick?: string, - Unlock?: string, - Destroy?: string, - } - /** Remove sound */ - sfxRemove?: string, - /** Equip sound */ - sfx?: string, - /** The vibrator will start vibing whenever another linked vibe starts */ - linkedVibeTags?: string[], - vibeLocation?: string, - showInQuickInv?: boolean, - /** The item is a chastity belt */ - chastity?: boolean, - /** The item is a chastity bra */ - chastitybra?: boolean, - /** The item is a piercing */ - piercing?: boolean, - /** The item rubs against the crotch when you move or struggle*/ - crotchrope?: boolean, - /** The item provides distraction when you walk around*/ - plugSize?: number, - /** Binding arms hurts a lot of things but isn't as punishing as hands */ - bindarms?: boolean, - /** Binding hands prevents use of weapons and picks */ - bindhands?: number, - /** harnesses allow enemies to grab you and slow you */ - harness?: boolean, - /** hobble is the simplest kind of slowing restraint, increasing slow by 1*/ - hobble?: boolean, - /** Blocking feet is for restraints that tie the legs together, forcing the player into SLow Level 2 or higher */ - blockfeet?: boolean, - /** Your total gag level is the sum of the gag values of all your variables. Ball gags have 0.3-0.75 based on size and harness, muzzles are 1.0 */ - gag?: number, - /** Higher value = higher vision loss */ - blindfold?: number - /** Maximum stamina percentage the player can have in order for the restraint to be applied. 0.25-0.35 for really strict stuff, 0.9 for stuff like ball gags, none for quick restraints like cuffs */ - maxwill?: number, - Type?: string, - /** Item is removed when the wearer goes to prison */ - removePrison?: boolean, - /** Changes the dialogue text when you fail to remove the item */ - failSuffix?: Record, - /** Changes the dialogue text when you try to struggle completely */ - specStruggleTypes?: string[], - /** List of Groups removed */ - remove?: string[], - /** List of tags removed */ - removeShrine?: string[], - slimeLevel?: number, - addTag?: string[], - OverridePriority?: number, - Modules?: number[], - /** When added to the inventory, is added as a different item instead. Good for multiple stages of the same item, like cuffs */ - inventoryAs?: string, - /** When added to the inventory by self, is added as a different item instead. Good for multiple stages of the same item, like cuffs */ - inventoryAsSelf?: string, - /** The item is always kept in your inventory no matter how it gets removed, so long as you don't cut it */ - alwaysKeep?: boolean, - /** The jailer won't remove these */ - noJailRemove?: boolean, - /** Increases the difficulty of other items */ - strictness?: number, - /** Overrides the existing strictness zones for the item's group */ - strictnessZones?: string[], - /** Can be linked by items with this shrine category */ - LinkableBy?: string[], - DefaultLock?: string, - HideDefaultLock?: boolean, - Link?: string, - UnLink?: string, - /** Removes when the player is leashed */ - removeOnLeash?: boolean, - /** player is enclosed */ - enclose?: boolean, - /** ignore the player if player is 0 stamina and the enemy is non leashing */ - ignoreIfNotLeash?: boolean, - /** Default tether length */ - tether?: number, - leash?: boolean, - /** The vibe can be remote controlled by enemies */ - allowRemote?: boolean, - /** Multiplies the escape chance */ - escapeMult?: number, - /** Clothes for dressing */ - alwaysDress?: overrideDisplayItem[], - /** The item always bypasses covering items, such as dresses and chastity belts */ - bypass?: boolean, - /** The item can only be cut with magical implements */ - magic?: boolean, - /** The item is regarded as a non-binding item, so the game knows how to handle it. Used for stuff like cuffs which are not binding by default */ - nonbinding?: boolean, - /** Instantly forces a high slow level, for stuff like slime */ - freeze?: boolean, - /** Immobilizes the player */ - immobile?: boolean, - /** The item CAN be trapped, which triggers when you struggle out */ - trappable?: boolean, - /** The item can only be removed through a special condition known as a curse */ - curse?: string, - /** The extra difficulty the item adds to the global difficulty var */ - difficultyBonus?: number, - /** Whether or not the angels will take it off when you call them */ - divine?: boolean, - /** If this is enabled, then you can spend ancient energy to use a potion at no reduction to potion effectiveness while gagged */ - potionCollar?: boolean, - /** Always allows potions while this restraint is on */ - allowPotions?: boolean, - /** Allows the user to walk across slime */ - slimeWalk?: boolean, - /** Amount of ancient energy it draws per turn */ - enchantedDrain?: number, - /** Whether or not this is an Ancient item, prison respects it */ - enchanted?: boolean, - /** Faction color index */ - factionColor?: number[][], - /** Determines if it gets hidden by the 'Hide Armor' option */ - armor?: boolean, - /** Power to display, not actual power */ - displayPower?: number, -}; - -interface restraint extends KDRestraintProps { - power: number, - /** Base weight of the restraint, required */ - weight: number, - minLevel: number, - - Color: string[] | string, - - escapeChance: any, - - enemyTags: Record, - playerTags: Record, - shrine: string[], -} - -type outfitKey = string - -type mapKey = string - -interface floorParams { - /** List of factions allowed to be primary or secondary here */ - factionList?: string[]; - /** This code is run after a worldgen */ - worldGenCode?: () => void; - tagModifiers?: Record; - globalTags?: Record; - shadowColor?: number, - lightColor?: number, - background : string, - openness : number, // Openness of rooms - density : number, // Density of tunnels (inverse of room spawn chance) - torchchance?: number, - torchlitchance?: number, - music: Record, - /** Will add more/less torches on the main path */ - torchchanceboring?: number, - torchreplace?: { - sprite: string, - unlitsprite?: string, - brightness: number, - }, - /** These tiles wont alter wall tiles in this tileset */ - noReplace?: string, - /** Chance of shrine having mana */ - manaChance?: number, - crackchance : number, - foodChance? : number, - barchance : number, - brightness : number, - chestcount : number, - shrinecount : number, - shrinechance : number, - ghostchance : number, - doorchance: number, - nodoorchance : number, - doorlockchance : number, - doorlocktrapchance? : number, - minortrapChance? : number, - chargerchance?: number, - litchargerchance?: number, - chargercount?: number, - trapchance : number, - barrelChance? : number, - grateChance : number, - rubblechance : number, - brickchance : number, - cacheInterval : number, - cageChance? : number, - - wallhookchance? : number, - ceilinghookchance? : number, - - hallopenness? : number, - - /** FOrces all setpieces to use POIs, useful for tunnel type maps with thick walls to prevent entombe pieces*/ - forcePOI?: boolean, - - gaschance?: number, - gasdensity?: number, - gastype?: string, - - wallRubblechance?: number, - - lockmult?: number, - - floodchance? : number, - forbiddenChance : number, // If a forbidden gold chance is generated. Otherwise a silver chest will appear - forbiddenGreaterChance : number, // Chance after a forbidden area is generated with a restraint, otherwise its a lesser gold chest - - setpieces?: {Type: string, Weight: number}[], - - shortcuts: {Level: number, checkpoint: string, chance:number}[ ], - mainpath: {Level: number, checkpoint: string, chance?: number}[], - - traps: {Name: string, Enemy?: string, Spell?: string, extraTag?: string, Level: number, Power: number, Weight: number, strict?: true}[], - - min_width : number, - max_width : number, - min_height : number, - max_height : number, - - ShopExclusives? : string[], - - enemyTags: string[], - "defeat_outfit": outfitKey, - /** - * key required for jailers INSTEAD of "jailer" - */ - jailType?: string, - guardType?: string, - "shrines": {Type: string, Weight: number}[] -} - -interface overrideDisplayItem { - /** Bondage club asset */ - Item: string, - /** Group */ - Group: string, - /** Color */ - Color: string[]|string, - /** Faction color index */ - factionColor?: number[][], - /** Whether or not it overrides items already on */ - override?: boolean, - /** Uses the player's hair color as the item color */ - useHairColor?: boolean, - /** Used for overriding BC priority */ - OverridePriority?: number[]|number, -} - -interface KDLoadout {name: string, tags?: string[], singletag: string[], singletag2?: string[], forbidtags: string[], chance: number, items?: string[], restraintMult?: number, multiplier?: number}; - -interface enemy extends KDHasTags { - /** This enemy will always kite the player even if player is harmless*/ - alwaysKite?: boolean, - - /** These enemies always carry these items at the start */ - startingItems?: string[] - - /** Restraint filters */ - RestraintFilter?: { - /** Starts with more restraints!! */ - bonusRestraints?: number, - /** This enemy can apply restraints without needing them in her pockets */ - unlimitedRestraints?: boolean, - /** Restraints applied must all be from inventory */ - invRestraintsOnly?: boolean, - /** Restraints applied must all be limited */ - limitedRestraintsOnly?: boolean, - /** Restraints with more power than this must be in inventory. Default is 3*/ - powerThresh?: number, - /** These wont be added to the initial inventory 3*/ - ignoreInitial?: string[], - /** These wont be added to the initial inventory 3*/ - ignoreInitialTag?: string[], - /** This enemy won't restock restraints out of sight */ - noRestock?: boolean, - /** Enemy will restock to this percentage */ - restockPercent?: number, - /** These enemies always restock these restraint items if they dont have them */ - requiredItems?: string[] - }, - - /** Security levels for accessing chastity */ - Security?: { - /** Key security level, for low-tech non-mage factions */ - level_key?: number, - /** Tech security level, for robots and wolfgirls */ - level_tech?: number, - /** Magic security level, for mage factions */ - level_magic?: number, - }, - - /** Behavior tags */ - Behavior?: { - /** This enemy will always want to add more restraints~ */ - thorough?: number, - /** Can't play */ - noPlay?: boolean, - /** Wont stop tying you until these groups are bound */ - ensureGroupTied?: string[], - /** Wont stop tying you until these playertags are fulfilled */ - ensurePlayerTag?: string[], - /** Wont stop tying you until these groups are bound (arousal mode only)*/ - ensureGroupTiedArousal?: string[], - /** Wont stop tying you until these playertags are fulfilled (arousal mode only)*/ - ensurePlayerTagArousal?: string[], - } - - /** This enemy wont appear outside of its designated floors even if it shares the tag */ - noOverrideFloor?: boolean, - /** This tag will be added to the selection tags if the enemy has it, for loot and ambush spawning purposes */ - summonTags?: string[], - /** This tag will be added to the selection tags if the enemy has it, for loot and ambush spawning purposes. Multiple copies will be pushed*/ - summonTagsMulti?: string[], - /** If true, this enemy will always be bound to the enemy that summons it */ - alwaysBound?: boolean, - /** These enemies wont appear in distracted mode */ - arousalMode?: boolean, - name: string, - /** Special dialogue played when clicked on instead of standard ally dialogue */ - specialdialogue?: string, - /** Overrides the default weight reduction for being outside of a miniboss/boss/minor/elite box */ - outOfBoxWeightMult?: number, - /** Tags, used for determining weaknesses, spawning, restraints applied, and rank*/ - tags: Record, - /** Spell resist, formula is spell damage taken = 1 / (1 + spell resist) */ - spellResist?: number, - /** Whether or not the enemy is friendly to the player and attacks enemies */ - allied?: boolean, - /** Enemies will prioritize this enemy less than other enemies. Used by allies only. */ - lowpriority? : boolean, - /** Hit chance = 1 / (1 + evasion) */ - evasion?: number, - /** */ - armor?: number, - /** Starting data */ - data?: Record, - /** HIde timer */ - hidetimerbar?: boolean, - Attack?: { - mustBindorFail?: boolean, - }, - /** Contains data pertaining to the creature's awareness */ - Awareness?: { - /** Optional tag to override chase radius */ - chaseradius?: number, - } - /** Contains data pertaining to the creature's effect on reputation and its behaviors from it */ - Reputation?: { - /** Optional tag to make an enemy not give up rep when killed */ - noRepLoss?: boolean, - }, - /** */ - followRange?: number, - /** wander = wanders randomly - * hunt = wanders, then follows the player - * guard = follows a specific point - * ambush = waits for the player to come near before becoming active - * patrol = walks between predefined global points on the map - */ - AI?: string, - /** HP regen per turn*/ - regen?: number, - /** */ - visionRadius?: number, - /** Max enemy hp*/ - maxhp?: number, - /** HP the enemy starts at */ - startinghp?: number, - /** */ - minLevel?: number, - /** */ - maxLevel?: number, - /** */ - weight?: number, - /** */ - movePoints?: number, - /** */ - attackPoints?: number, - /** String declaring what types of attacks this unit has */ - attack?: string, - /** */ - attackRange?: number, - /** */ - terrainTags?: Record, - /** */ - floors?: Record, - /** Enemy events */ - events?: KinkyDungeonEvent[]; - /** */ - allFloors?: boolean, - /** */ - noblockplayer?: boolean, - /** */ - triggersTraps?: boolean, - /** The enemy follows the player at the end of the level */ - keepLevel?: boolean, - /** Boost to accuracy, 1 + (1 + accuracy)*/ - accuracy?: number, - /** Blindsight toward the player but not other enemies. Mainly used by allies so they know where the player is. */ - playerBlindSight?: number, - /** */ - attackWidth?: number, - /** */ - power?: number, - /** */ - dmgType?: string, - /** */ - bound?: string, - /** */ - color?: string, - /** counts toward the player's permanent summmon limit */ - CountLimit?: boolean, - /** Does not target silenced enemies */ - noTargetSilenced?: boolean, - /** */ - silenceTime?: number, - /** List of spells*/ - spells?: string[], - /** This enemy will not miscast spells when distracted*/ - noMiscast?: boolean, - /** Sound effect when miscasting */ - miscastsfx?: string, - /** Message when miscasting */ - miscastmsg?: string, - /** This enemy knows the unlock command up to this level*/ - unlockCommandLevel?: number, - /** This enemy must wait this long between unlock command attempts. Default is 90*/ - unlockCommandCD?: number, - /** */ - spellCooldownMult?: number, - /** */ - spellCooldownMod?: number, - /** */ - kite?: number, - /** */ - playerFollowRange?: number, - /** */ - minSpellRange?: number, - /** */ - stopToCast?: boolean, - /** Shows a marker when the creature has a spell ready */ - spellRdy?: boolean, - /** Casts while moving */ - castWhileMoving?: boolean, - /** Enemy does not attack */ - noAttack?: boolean, - /** Disarm counter increased by this fraction when attacked. When it reaches 1, the player's next attack will miss, otherweise it will reduce by this amount per turn */ - disarm?: number, - /** Boost to power when target is not the player or when the enemy cant tie up the player */ - fullBoundBonus?: number, - /** Loot*/ - dropTable?: any[], - /** */ - attackWhileMoving?: boolean, - /** Doesnt cast spells when the player is out of stamina */ - noSpellsLowSP?: boolean, - /** Rep changes on death */ - rep?: Record, - /** Rep changes on death */ - factionrep?: Record; - /** Chance to generate as a guard instead */ - guardChance?: number; - /** When generating clusters of enemies, the clustering units must have this tag*/ - clusterWith?: string, - /** Chance to ignore the player if the enemy has an ignore tag like ignorenoSP */ - ignorechance?: number, - /** The enemy count is incremented by this amount when the enemy is spawned during map gen*/ - difficulty?: number, - /** The enemy will not attack if the path to the player is blocked, and will move closer*/ - projectileAttack?: boolean, - /** The enemy will use 'buff' tagged spells on allies*/ - buffallies?: boolean, - /** Special attack property*/ - stunTime?: number, - /** Special attack property. Cooldown of the special attack.*/ - specialCD?: number, - /** Special attack property. Added to the special attack in addition to the enemy's default attack*/ - specialAttack?: string, - /** Special attacks ignore stamina requirements */ - specialIgnoreStam?: boolean, - /** Special attack property. Removed these types from the main attack when special attacking.*/ - specialRemove?: string, - /** Adds additional restraint tags when special attacking*/ - specialExtraTags?: string[], - /** removes the specified restraint tags when special attacking*/ - specialRemoveTags?: string[], - /** Uses a special message for Special attacks */ - specialMsg?: boolean, - /** specifies a condition for using a special attack*/ - specialCondition?: string, - /** Special attack property*/ - specialPower?: number, - /** Special attack property*/ - specialDamage?: string, - /** Special attack property. Special attack will go on CD when the enemy uses it, not when it hits*/ - specialCDonAttack?: boolean, - /** Special attack property*/ - specialWidth?: number, - /** Special attack property*/ - specialRange?: number, - /** Which shrines the enemy is associated with*/ - shrines?: string[], - /** */ - followLeashedOnly?: boolean, - /** */ - blindSight?: number, - /** */ - specialCharges?: number, - /** */ - strictAttackLOS?: boolean, - /** */ - specialAttackPoints?: number, - /** */ - specialMinrange?: number, - /** */ - stealth?: number, - /** After being seen the enemy can go back into stealth if the player moves away*/ - noReveal?: boolean, - /** */ - ambushRadius?: number, - /** For AI = 'ambush', this enemy will wander until it sees the player and triggers the ambush. Mostly used for invisible enemies. */ - wanderTillSees?: boolean, - /** For kiting enemies, this enemy moves in to attack Only When the player is Disabled. Used on enemies like the Maidforce stalker who stay away from the enemy but have powerful disabling effects like flash bombs*/ - dontKiteWhenDisabled?: boolean, - /** The special attack only binds on kneeling players*/ - bindOnDisableSpecial?: boolean, - /** The regular attack only binds on kneeling players*/ - bindOnDisable?: boolean, - /** Sfx when an attack lands*/ - hitsfx?: string, - /** All lockable restraints will use this lock*/ - useLock?: string, - /** Uses this lock when using the lock attack */ - attackLock?: string, - /** Minimum range for attack warning tiles, used to prevent high range enemies from attacking all around them*/ - tilesMinRange?: number, - /** Minimum range to try attacking */ - attackMinRange?: number, - /** Minimum range to try attacking */ - specialMinRange?: number, - - /** */ - noKiteWhenHarmless?: boolean, - /** */ - noSpellsWhenHarmless?: boolean, - /** */ - ignoreStaminaForBinds?: boolean, - /** */ - sneakThreshold?: number, - RemoteControl?: { - /** */ - remote?: number, - /** */ - remoteAmount?: number, - /** If the enemy has a remote that can control punishing items (e.g. shock collars), the range that they can control items from */ - punishRemote?: number, - /** The chance per tick that the enemy will use their remote remote to punish the player when they are within range */ - punishRemoteChance?: number, - } - /** */ - bypass?: boolean, - /** */ - multiBind?: number, - /** */ - noLeashUnlessExhausted?: boolean, - /** */ - ethereal?: boolean, - /** */ - alwaysEvade?: boolean, - /** */ - summonRage?: boolean, - /** */ - noAlert?: boolean, - /** The enemy will follow enemies defined by this block*/ - master?: {type: string, range: number, loose?: boolean, aggressive?: boolean, dependent?: boolean}, - /** */ - pullTowardSelf?: boolean, - /** */ - pullDist?: number, - /** */ - summon?: any[], - /** */ - sneakthreshold?: number, - /** */ - blockVisionWhileStationary?: boolean, - /** */ - squeeze?: boolean, - /** Enemy will not chase player for being unrestrained. Use on enemies like drones who have lines but dont bind readily */ - noChaseUnrestrained?: boolean, - /** */ - suicideOnSpell?: boolean, - /** */ - suicideOnAdd?: boolean, - /** */ - suicideOnLock?: boolean, - /** Hostile even on parole */ - alwaysHostile?: boolean, - /** */ - specialsfx?: string, - /** Stuns the enemy when the special attack goes on CD without a hit */ - stunOnSpecialCD?: number, - /** Dashes to the player even when a dash misses*/ - dashOnMiss?: boolean, - /** */ - cohesion?: number, - /** */ - noSpellLeashing?: boolean, - /** */ - projectileTargeting?: boolean, - /** */ - ondeath?: any[], - /** */ - blindTime?: number, - /** */ - tilesMinRangeSpecial?: number, - /** */ - convertTiles?: any[], - /** the enemy sends a special message when pulling the player */ - pullMsg?: boolean, - /** */ - dashThruWalls?: boolean, - /** */ - dashThrough?: boolean, - /** */ - cohesionRange?: number, - /** */ - kiteChance?: number, - /** this enemy ignores the player when these flags are set*/ - ignoreflag?: string[], - /** flags set when the player is hit but no binding occurs*/ - failAttackflag?: string[], - /** How long to set the flag for */ - failAttackflagDuration?: number, - /** */ - visionSummoned?: number, - /** */ - dependent?: boolean, - /** */ - nopickpocket?: boolean, - /** */ - attackThruBars?: boolean, - /** */ - noCancelAttack?: boolean, - /** */ - keys?: boolean, - /** If this enemy is always enraged */ - rage?: boolean, - /** Starting lifetime of enemy*/ - lifespan?: number, - /** This enemy cant be swapped */ - noDisplace?: boolean, - /** The enemy will cast spells even if you are in parole */ - spellWhileParole?: boolean, - /** This line is a suffic to the line they say when they want to play with you */ - playLine?: string, - /** Blocks vision */ - blockVision?: boolean, - /** Hit SFX for enemy special attack */ - hitsfxSpecial?: string, - /** Effect when the enemy misses */ - misssfx?: string, - /** SFX on certain cues */ - cueSfx?: { - /** When the enemy takes no damage from a melee attack */ - Block?: string, - /** When the enemy takes no damage from a magic attack */ - Resist?: string, - /** When the enemy takes damage in general */ - Damage?: string, - /** When the player misses it */ - Miss?: string, - }, - /** The enemyeffect when player is hit */ - effect?: any, - /** Cant cast spells while winding up an attack */ - noSpellDuringAttack?: boolean, - /** Base faction of this enemy, overridden by the entity faction */ - faction?: string, - /** This enemy does not channel its spells */ - noChannel?: boolean, - /** Focuses player over summmons, ignores decoys */ - focusPlayer?: boolean; - /** Cant be swapped by another enemy pathing */ - immobile?: boolean; - /** Stops casting spells after there are this many enemies */ - enemyCountSpellLimit?: number; - -} - -interface shopItem { - cost: any; - rarity: any; - costMod?: any; - shoptype: string; - consumable?: string; - quantity?: number; - name: any; -} - -interface weapon { - name: string; - dmg: number; - chance: number; - type: string; - bind?: number; - bindType?: string; - distract?: number; - bindEff?: number; - distractEff?: number; - light?: boolean; - boundBonus?: number; - tease?: boolean; - rarity: number; - staminacost?: number; - magic?: boolean; - cutBonus?: number; - playSelfBonus?: number; - playSelfMsg?: string; - playSelfSound?: string; - unarmed: boolean; - shop: boolean; - noequip?: boolean; - sfx: string; - events?: KinkyDungeonEvent[]; - noHands?: boolean; - silent?: boolean; - novulnerable?: boolean; - special?: { - type: string, - spell?: string, - selfCast?: boolean, - requiresEnergy?: boolean, - energyCost?: number, - range?: number,}; -} - -interface KinkyDungeonEvent { - cost?: number, - tags?: string[], - duration?: number, - always?: boolean, - type: string; - trigger: string; - restraint?: string; - sfx?: string; - power?: number; - count?: number; - player?: boolean; - bind?: number; - distract?: number; - mult?: number; - kind?: string; - variance?: number; - damage?: string; - buffTypes?: string[]; - damageTrigger?: string; - dist?: number; - aoe?: number; - buffType?: string; - time?: number; - bindType?: string; - chance?: number; - buff?: any; - lock?: string; - msg?: string; - prereq?: string; - color?: string; - /** Vibe */ - edgeOnly?: boolean; - /** Vibe */ - cooldown?: Record; - /** A required enemy tag */ - requiredTag?: string; - /** Generic required tags */ - requireTags?: string[]; - /** Generic filtered tags */ - filterTags?: string[]; - /** Type of struggle that this event triggers on */ - StruggleType?: string; - requireEnergy?: boolean; - /** Limit of whatever thius event modifies */ - limit?: number - energyCost?: number; - /** The event gets copied to any restraint if the item is linked */ - inheritLinked?: boolean; - /** Spell to cast at the target */ - spell?: string; - /** Chance to trigger is 1+(submissive % * subMult)*/ - subMult?: number; - /** Won't trigger while being leashed */ - noLeash?: boolean; - /** Stun duration */ - stun?: number; - /** Chance the player will get warned instead of punshed */ - warningchance?: number; - /** triggers from this component */ - punishComponent?: string; - /** List of restraints or other string params */ - list?: string[]; - /** Whether or not the event only triggers on human targets */ - humanOnly?: boolean; - /** Distance having to do with stealth */ - distStealth?: number; - /** Dialogue key an enemy should send */ - enemyDialogue?: string; - - // MUTABLE QUANTITIES - prevSlowLevel?: number; -} - -interface entity { - /** Opinion of you. Positive is good. */ - opinion?: number, - /** Determines if an enemy can be dommed or not */ - domVariance?: number, - hideTimer?: boolean, - Enemy: enemy, - /** List an enemy ID. Enemy will be bound to this one and dies if not found. BoundTo of -1 indicates bound to the player, and will expire if the player is jailed or passes out*/ - boundTo?: number, - /** This enemy is weakly bound and simply stunning the caster will delete it */ - weakBinding?: boolean, - player?: boolean, - /** This enemy has keys to red locked doors */ - keys?: boolean, - /** Additional Ondeath, e.g quest markers or rep */ - ondeath?: any[], - /** Used for misc data */ - data?: Record, - /** Rep changes on death */ - rep?: Record, - /** Rep changes on death */ - factionrep?: Record; - dialogue?: string, - dialogueDuration?: number, - dialogueColor?: string, - dialoguePriority?: number, - CustomName?: string, - CustomSprite?: string, - CustomNameColor?: string, - rescue?: boolean, - personality?: string, - patrolIndex?: number, - flags?: Record, - noDrop?: boolean, - droppedItems?: boolean, - specialdialogue?: string, - aggro?: number, - id?: number, - hp: number, - AI?: string, - moved?: boolean, - playerdmg?: number, - idle?: boolean, - summoned?: boolean, - boundLevel?: number, - specialBoundLevel?: Record, - distraction?: number, - lifetime?: number, - maxlifetime?: number, - attackPoints?: number, - movePoints?: number, - aware?: boolean, - vp?: number, - tracking?: boolean, - revealed?: boolean, - ambushtrigger?: boolean, - castCooldown?: number, - castCooldownSpecial?: number, - specialCharges?: number, - usingSpecial?: boolean, - specialCD?: number, - disarmflag?: number, - channel?: number, - items?: string[], - tempitems?: string[], - x: number, - y: number, - lastx?: number, - lasty?: number, - fx?: number, - fy?: number, - path?: {x: number, y: number}[], - gx?: number, - gy?: number, - gxx?: number, - gyy?: number, - rage?: number, - hostile?: number, - faction?: string, - allied?: number, - ceasefire?: number, - bind?: number, - blind?: number, - disarm?: number, - slow?: number, - freeze?: number, - stun?: number, - silence?: number, - vulnerable?: number, - buffs?: any, - warningTiles?: any, - visual_x?: number, - visual_y?: number, - Analyze?: boolean, - /** Number of turns the enemy is temporarily hostile for */ - playWithPlayer?: number, - playWithPlayerCD?: number, - - IntentAction?: string, - IntentLeashPoint?: {x: number, y: number, type: string, radius: number}, - - CurrentAction?: string, - RemainingJailLeashTourWaypoints?: number, - NextJailLeashTourWaypointX?: number, - NextJailLeashTourWaypointY?: number, - KinkyDungeonJailTourInfractions?: number, -} - -type KinkyDungeonDress = { - Item: string; - Group: string; - Color: string | string[]; - Lost: boolean; - NoLose?: boolean; - Property?: any, - OverridePriority?: number; - Skirt?: boolean; -}[] - -interface KinkyDialogueTrigger { - dialogue: string; - allowedPrisonStates?: string[]; - /** Only allows the following personalities to do it */ - allowedPersonalities?: string[]; - blockDuringPlaytime?: boolean; - noAlly?: boolean, - /** Exclude if enemy has one of these tags */ - excludeTags?: string[]; - /** Require all of these tags */ - requireTags?: string[]; - /** Require one of these tags */ - requireTagsSingle?: string[]; - /** Require play to be POSSIBLE */ - playRequired?: boolean; - /** Require play to be ONGOING */ - onlyDuringPlay?: boolean; - /** Allow this to happen even out of playtime if the player is submissive enough */ - allowPlayExceptionSub?: boolean; - /** If any NPC is in combat in last 3 turns this wont happen */ - noCombat?: boolean; - /** Prevents this from happening if the target is hostile */ - nonHostile?: boolean; - prerequisite: (enemy: entity, dist: number, AIData: any) => boolean; - weight: (enemy: entity, dist: number) => number; -} - -interface effectTile { - x?: number, - y?: number, - lightColor?: number, - //shadowColor?: number, - yoffset?: number, - xoffset?: number, - name: string, - duration: number, - priority: number, - data?: any, - /** For tiles which can be used to help escape */ - affinities?: string[], - /** For tiles which can be used to help escape, but only while standing */ - affinitiesStanding?: string[], - drawOver?: boolean, - tags: string[], - pauseDuration?: number, - pauseSprite?: string, - brightness?: number, - skin?: string, - /** random = basic effect where it fades in and has a chance to fade out again */ - fade?: string, - statuses?: Record, -}; - -/** For spells */ -interface effectTileRef { - name: string, - duration?: number, - data?: any, - pauseDuration?: number, - pauseSprite?: string, - skin?: string, - statuses?: Record, -}; - -type KDPerk = { - /** Determines if this one goes in the debuffs tree */ - debuff?: boolean, - /** Determines if this one goes in the buffs tree */ - buff?: boolean, - category: string, - id: string | number, - cost: number, - block?: string[], - tags?: string[], - blocktags?: string[], - blockclass?: string[], - locked?: boolean, - outfit?: string, - require?: string, - costGroup?: string, - startPriority?: number, - requireArousal?: boolean, -} - -interface spell { - /** This spell doesnt hurt the target upon directly hitting, only the AoE */ - noDirectDamage?: true, - /** This spell does not leave a warning to the player */ - hideWarnings?: boolean, - /** This spell does leave a warning to the player */ - alwaysWarn?:boolean, - /** Marks a spell as non-magical, so traps dont leave a rune on the ground */ - nonmagical?: boolean, - /** Marks the spell as a command word spell to enemies */ - commandword?: boolean, - /** The spell is used to buff allies */ - buffallies?: boolean, - /** caster will also target themselves */ - selfbuff?: boolean, - /** Type of binding applied to the power */ - bindType?: string, - /** Stops the spell from moving more than 1 tile */ - slowStart?: boolean, - /** Spinrate of the bullet */ - bulletSpin?: number, - /** Spinrate of the bullet hit */ - hitSpin?: number, - /** Forces spell to move more than 1 tile at beginning */ - fastStart?: boolean, - /** Affects aoe type - * acceptable values are: - * vert - creates a vertical line - * horiz - creates a horizontal line - * box - uses chebyshev distance - * cross - creates a vertical and horizontal line - */ - aoetype?: string, - aoetypetrail?: string, - secondaryhit?: string, - upcastFrom?: string, - upcastLevel?: number, - hitColor?: number; - bulletColor?: number; - trailColor?: number; - hitLight?: number; - bulletLight?: number; - trailLight?: number; - goToPage?: number; - tags?: string[]; - effectTile?: effectTileRef, - effectTileAoE?: number, - effectTileDurationMod?: number, - effectTilePre?: effectTileRef, - effectTileDurationModPre?: number, - effectTileLinger?: effectTileRef, - effectTileDurationModLinger?: number, - effectTileDensityLinger?: number, - effectTileTrail?: effectTileRef, - effectTileDurationModTrail?: number, - effectTileDensityTrail?: number, - effectTileTrailAoE?: number, - effectTileDoT?: effectTileRef, - effectTileDurationModDoT?: number, - effectTileDensityDoT?: number, - effectTileDensity?: number, - - /** Hides this spell in the spell screen */ - hide?: boolean, - - shotgunCount?: number, - shotgunSpread?: number, - shotgunDistance?: number, - shotgunSpeedBonus?: number, - - distractEff?: number, - bindEff?: number, - - damageFlags?: string[], - /** Wont spawn a trail on the player, ever */ - noTrailOnPlayer?: boolean, - /** Wont spawn a trail on any entity, ever */ - noTrailOnEntity?: boolean, - /** Wont spawn a trail on any allied entity, ever */ - noTrailOnAlly?: boolean, - /** Color of the spell and bullet warningsd */ - color?: string, - /** Buffs applied by the hit will effect everyone */ - buffAll?: boolean, - name: string; - /** spell required to unlock this one */ - prerequisite?: string | string[]; - /** Spell is hidden if you didnt learn it */ - hideUnlearnable?: boolean, - /** Spell is hidden if you DID learn it */ - hideLearned?: boolean, - /** Automatically learns the spells when you learn it (thru magic screen) */ - autoLearn?: string[], - /** This spell wont trigger an aggro action */ - noAggro?: boolean; - /** Whether the spell defaults to the Player faction */ - allySpell?: boolean; - /** Spell overrides the faction */ - faction?: string; - /** Whether the spell defaults to the Enemy faction */ - enemySpell?: boolean; - /** Conjure, Illusion, Elements */ - school?: string; - /** if the type is special, this is the special type */ - special?: string; - /** Damage of the spell */ - power?: number; - /** Damage type */ - damage?: string; - /** size of sprite */ - size?: number; - /** Prevents multiple instances of the spell from doing damage on the same turn from the same bullet to the same enemy */ - noUniqueHits?: boolean; - /** AoE */ - aoe?: number; - /** bind */ - bind?: number; - /** distract */ - distract?: number; - /** Bonus daMAGE TO BOUND TATRGETS */ - boundBonus?: number; - /** outfit applied (special parameter) */ - outfit?: string; - /** speed */ - speed?: number; - knifecost?: number; - staminacost?: number; - manacost: number; - minRange?: number; - noSprite?: boolean; - /** Verbal, arms, or legs */ - components?: any[]; - /** Spell level */ - level: number; - /** Whether the spell is passive (like the summon count up) or active like the bolt or toggle spells*/ - passive?: boolean; - /** costOnToggle */ - costOnToggle?: boolean; - /** Type of the spell */ - type: string; - /** Type of effect on hit */ - onhit?: string; - /** Duration of the status effect applied */ - time?: number; - /** For Inert spells, this is the lifetime of the main bullet */ - delay?: number; - /** Random added onto delay */ - delayRandom?: number; - /** castRange */ - castRange?: number; - /** Spell range */ - range?: number; - /** lifetime of the Hit bullet created by the spell, not the bullet itself in the case of an "inert" bullet*/ - lifetime?: number; - /** Specifically for the bullet lifetime, currently unused */ - bulletLifetime?: number; - /** channel turns */ - channel?: number; - /** Noise spell makes on cast */ - noise?: number; - /** block */ - block?: number; - /** played on cast */ - sfx?: string; - /** Played on damage dealt */ - hitsfx?: string; - /** Played on bullet impact */ - landsfx?: string; - /** trailPower */ - trailPower?: number; - /** trailHit */ - trailHit?: string; - /** trailLifetime */ - trailLifetime?: number; - /** trailTime */ - trailTime?: number; - /** Random number to increase lifetime by */ - lifetimeHitBonus?: number; - /** Random number to increase trail lifetime by */ - trailLifetimeBonus?: number; - /** Playereffect of the trail */ - trailPlayerEffect?: any; - /** trailChance */ - trailChance?: number; - /** Creates trails on the projectiles itself too */ - trailOnSelf?: boolean; - /** trailDamage */ - trailDamage?: string; - /** trailspawnaoe */ - trailspawnaoe?: number; - /** Casts a spell as a trail */ - trailcast?: any; - /** trail */ - trail?: string; - /** Spell points cost to buy */ - spellPointCost?: number; - /** Whether the spell heals or not */ - heal?: boolean; - /** Whether AI treats as a buff */ - buff?: boolean; - /** The spell needs this condition for an enemy to cast it*/ - castCondition?: string; - /** Player can only cast spell on a creature or player */ - mustTarget?: boolean; - /** Player cant target player */ - noTargetPlayer?: boolean; - /** Only target walls */ - WallsOnly?: boolean; - /** Spell can be dodged */ - evadeable?: boolean; - /** Targeting location */ - meleeOrigin?: boolean; - /** Cant hit the same enemy twice per turrn, impoprtant for piercing spells */ - noDoubleHit?: boolean; - /** Doesnt do spellcast on the hit */ - noCastOnHit?: boolean; - /** Casts a spellcast during the delay */ - castDuringDelay?: boolean; - /** Casts spell */ - spellcast?: any; - /** Casts spell on cast */ - extraCast?: any; - /** spell cast on hit */ - spellcasthit?: any; - /** List of buffs applied by the spell */ - buffs?: any[]; - /** Whether the spell is off by default */ - defaultOff?: boolean; - /** List of events applied by the spell */ - events?: KinkyDungeonEvent[]; - /** List of events applied by the spell to its hit */ - hitevents?: KinkyDungeonEvent[]; - /** spell pierces */ - piercing?: boolean; - /** spell pierces enemies */ - pierceEnemies?: boolean; - /** spell pierces */ - passthrough?: boolean; - /** Deals DoT */ - dot?: boolean; - /** spell pierces */ - noTerrainHit?: boolean; - /** spell pierces */ - noEnemyCollision?: boolean; - /** If an enemy has one of these tags it will get hit no matter what*/ - alwaysCollideTags?: string[], - /** trail pierces */ - piercingTrail?: boolean; - /** nonVolatile */ - nonVolatile?: boolean; - /** Cancels automove when cast */ - cancelAutoMove?: boolean; - /** requireLOS */ - requireLOS?: boolean; - /** selfTargetOnly */ - selfTargetOnly?: boolean; - /** AI will only target creatures with this tag */ - filterTags?: string[]; - /** Whether or not sends a message on cast */ - msg?: boolean; - /** Suppress summon message */ - noSumMsg?: boolean; - /** Targeted like a bolt, showing the aim line */ - projectileTargeting?: boolean; - /** CastInWalls */ - CastInWalls?: boolean; - /** noTargetEnemies */ - noTargetEnemies?: boolean; - /** Exception list for NoTargetEnemies */ - exceptionFactions?: string[]; - /** noTargetAllies */ - noTargetAllies?: boolean; - /** Sets the enemy's specialCD shared between others */ - specialCD?: number; - /** AI wont choose this as first choice */ - noFirstChoice?: boolean; - /** Player effect */ - playerEffect?: any; - /** Doesnt send cast message */ - noCastMsg?: boolean; - /** Casts on self always */ - selfcast?: boolean; - /** Cant miscast */ - noMiscast?: boolean; - /** summon */ - summon?: any[]; - /** Spell does not show up in the spells scrreen until learned */ - secret?: boolean; - /** Enemies summoned by this spell will have their default faction and not the caster's faction */ - defaultFaction?: boolean; - -} - -interface KDPoint {x: number, y: number} -interface KDJailPoint extends KDPoint {type: string, radius: number, requireLeash?: boolean, requireFurniture?: boolean, direction?:{x: number, y: number}, restraint?:string, restrainttags?:string[]} - -interface KinkyDialogue { - /** REPLACETEXT -> Replacement */ - data?: Record; - /** Shows the quick inventory */ - inventory?: boolean; - /** Function to play when clicked. If not specified, nothing happens. Bool is whether or not to abort current click*/ - clickFunction?: (gagged: boolean, player: entity) => boolean | undefined; - /** Function to play when clicked, if considered gagged. If not specified, will use the default function. */ - gagFunction?: (player: entity) => boolean | undefined; - /** Will not appear unless function returns true */ - prerequisiteFunction?: (gagged: boolean, player: entity) => boolean; - /** Will appear greyed out unless true */ - greyoutFunction?: (gagged: boolean, player: entity) => boolean; - greyoutTooltip?: string; - /** List of personalities supported by this dialogue */ - personalities?: string[]; - /** Jumps to the specified dialogue when clicked, after setting the response string*/ - leadsTo?: string; - leadsToStage?: string; - /** Pressing the skip key will click this option */ - skip?: boolean; - /** After leading to another dialogue, the response will NOT be updated */ - dontTouchText?: boolean; - exitDialogue?: boolean; - /** The response the NPC will give when this dialogue is clicked. If response is "null", then it keeps the original, "" uses pregenerated - * The string name will be "r" + response with a couple of enemy-specific variations - */ - response?: string; - /** The option for you to select for this dialogue. "" means pregenerated, OK to put "" for top-level KinkyDialogues - * The string name will be "d" + response - */ - playertext?: string; - /** Whether or not this line has a gag-specific dialogue line */ - gag?: boolean; - /** Threshold at which the player is considered gagged for this dialogue. Default is 0.01*/ - gagThreshold?: number; - /** Whether or not this option appears while gagged */ - gagDisabled?: boolean; - /** Whether or not this option appears while ungagged */ - gagRequired?: boolean; - /** Options to display */ - options?: Record; - /** Name of a dialogue to get extra options from. Merges them, preferring this dialogue's options if the name is the same */ - extraOptions?: string; -} - -interface KinkyVibration { - // Basic Factors - /** Item applying this vibration */ - source: string, - /** Identification */ - name: string, - intensity: number, - /** Location(s) of the vibration */ - location: string[], - - // Total duration - duration: number, - durationLeft: number, - - // Denial - /** Will turn off for this long when being denied */ - denyTime?: number, - denyTimeLeft?: number, - - /** Will deny this many times. */ - denialsLeft?: number, - /** Always denies instead of orgasm. Overrides edgeOnly in the vibration itself but gets overridden by vibe modifiers */ - alwaysDeny?: boolean, - /** Chance to deny. 0 or undefined means 100%*/ - denialChance?: number, - /** Chance to deny if the player is likely to orgasm. 0 or undefined means 100%*/ - denialChanceLikely?: number, - - // Edging - /** After this much time the orgasms will be unlocked*/ - edgeTime?: number, - edgeTimeLeft?: number, - /** The vibration will sense when the player is at max arousal and only decrement the timer then */ - tickEdgeAtMaxArousal?: boolean, - - - /** Will repeat this many times */ - loopsLeft?: number, - - /** Orgasm will always be impossible */ - edgeOnly?: boolean, - - /** Table of modifiers */ - VibeModifiers: VibeMod[], -} - -interface VibeMod { - /** Source of the modifier */ - source: string, - /** Identifier of the modifier */ - name: string, - /** Location of the modifier */ - location: string, - /** Duration of the vibe modifier */ - duration: number, - durationLeft: number, - /** Change to intensity, cannot go below 1, capped at the value of the highest/lowest mod*/ - intensityMod: number, - /** Forces intensity*/ - intensitySetpoint?: number, - edgeOnly?: boolean, - forceDeny?: boolean, - bypassDeny?: boolean, - bypassEdge?: boolean, - /** Duration does not tick down while this vibe mod is on */ - extendDuration?: boolean, - /** Increments the deny chance */ - denyChanceMod?: number, - /** Increments the deny chance */ - denyChanceLikelyMod?: number, -} - -interface KinkyDungeonSave { - KinkyDungeonPlayerEntity: any; - level: number; - checkpoint: string; - rep: Record; - costs: Record; - pcosts: Record; - orbs: number[]; - chests: number[]; - dress: string; - gold: number; - points: number; - grounditems: any; - perks: string[]; - levels: { - Elements: number; - Conjure: number; - Illusion: number; - }; - rescued: Record; - aid: Record; - seed: string; - statchoice: [string, boolean][]; - mapIndex: Record; - id: number; - choices: number[]; - choices2: boolean[]; - buffs: Record; - lostitems: any[]; - caches: number[]; - hearts: number[]; - spells: string[]; - inventory: item[]; - KDGameData: KDGameDataBase; - KDEventData: Object; - flags: [string, number][]; - stats: { - picks: number; - keys: number; - bkeys: number; - mana: number; - manapool: number; - stamina: number; - willpower: number; - distraction: number; - distractionlower: number; - wep: any; - npp: number; - diff: number; - }; - faction: Record>; - - - KinkyDungeonTiles: Record; - KinkyDungeonTilesSkin: Record; - KinkyDungeonTilesMemory: Record; - KinkyDungeonEffectTiles: Record>; - KinkyDungeonRandomPathablePoints: Record; - KinkyDungeonEntities: entity[]; - KinkyDungeonBullets: any[]; - KinkyDungeonGrid: string; - KinkyDungeonGridWidth: number; - KinkyDungeonGridHeight: number; - KinkyDungeonFogGrid: any[]; - KinkyDungeonStartPosition: {x: number, y: number}; - KinkyDungeonEndPosition: {x: number, y: number}; -} - - - -type MapMod = { - name: string, - roomType: string, - jailType?: string, - guardType?: string, - weight: number, - tags: string[], - faction?: string, - tagsOverride?: string[], - bonusTags: Record, - spawnBoxes?: any[], - bonussetpieces?: {Type: string, Weight: number}[], - altRoom: string, -} - -type AIType = { - /** The AI will only wander to visible points */ - strictwander?: boolean, - /** This enemy is stealthy until the ambush is triggered */ - ambush?: boolean, - /** This is the tile for the AI which registers as tooltip */ - ambushtile?: string, - /** Happens at the start immediately after AI is assigned*/ - init: (enemy, player, aidata) => void, - /** Happens before movement. Return true to skip movement loop*/ - beforemove: (enemy, player, aidata) => boolean, - /** Whether the enemy chases the player if it sees them */ - chase: (enemy, player, aidata) => boolean, - /** Whether enemy will chase the player across a long distance */ - persist: (enemy, player, aidata) => boolean, - /** Whether the enemy moves toward gx */ - move: (enemy, player, aidata) => boolean, - /** whether the enemy obeys commands like Follow Me and such */ - follower: (enemy, player, aidata) => boolean, - /** Whether the enemy follows sound sources or not */ - followsound: (enemy, player, aidata) => boolean, - /** Whether enemy will randomly wander to nearby points*/ - wander_near: (enemy, player, aidata) => boolean, - /** Whether enemy will randomly choose points on the map to wander to */ - wander_far: (enemy, player, aidata) => boolean, - /** Function to replace wandernear. Return true to cancel stock func, false otherwise*/ - wandernear_func?: (enemy, player, aidata) => boolean, - /** Function to replace wanderfar. Return true to cancel stock func, false otherwise*/ - wanderfar_func?: (enemy, player, aidata) => boolean, - /** Whether it sets gx to gxx when idle, and gy to gyy */ - resetguardposition: (enemy, player, aidata) => boolean, - /** Whether enemy attacks */ - attack: (enemy, player, aidata) => boolean, - /** whether enemy casts spells */ - spell: (enemy, player, aidata) => boolean, - /** This function executes before wander location changes. Return True to override wander behavior */ - aftermove: (enemy, player, aidata) => boolean, - /** This executes after enemy is determined to be idle or not. If true, prevents spells.*/ - afteridle?: (enemy, player, aidata) => boolean, - /** Returns the current wander long delay.*/ - wanderDelay_long?: (enemy, aidata) => number, - /** Returns the current wander short delay.*/ - wanderDelay_short?: (enemy, aidata) => number, - -} - -type EnemyEvent = { - forceattack?: boolean, - aggressive?: boolean, - nonaggressive?: boolean, - play?: boolean, - noplay?: boolean, - /** This event wont get cleared by mass resets, like when you are deposited into a cage */ - noMassReset?: boolean, - /** Determines weight */ - weight: (enemy: entity, AIData: any, allied: boolean, hostile: boolean, aggressive: boolean) => number, - /** Run when triggered */ - trigger: (enemy: entity, AIData: any) => void, - /** Run when leashes to the leash point */ - arrive?: (enemy: entity, AIData: any) => boolean, - /** Run each turn at the end */ - maintain?: (enemy: entity, delta: number) => boolean, - /** Run before the move loop */ - beforeMove?: (enemy: entity, AIData: any, delta: number) => boolean, - /** Run before the attack loop */ - beforeAttack?: (enemy: entity, AIData: any, delta: number) => boolean, - /** Run before the spell loop */ - beforeSpell?: (enemy: entity, AIData: any, delta: number) => boolean, -} - -type KDLockType = { - lockmult: number; - - penalty?: Record; - - pickable: boolean; - pick_time: number; - pick_diff: number; - pick_lim?: number; - canPick: (data: any) => boolean; - doPick: (data: any) => boolean; - failPick: (data: any) => string; - breakChance: (data: any) => boolean; - unlockable: boolean; - key: string; - canUnlock: (data: any) => boolean; - doUnlock: (data: any) => boolean; - failUnlock: (data: any) => string; - removeKeys: (data: any) => void; - - levelStart: (item) => void; - shrineImmune: boolean; - - commandlevel: number; - command_lesser: () => number; - command_greater: () => number; - command_supreme: () => number; - - loot_special: boolean; - loot_locked: boolean; -} - -type KDMapTile = { - name: string; - w: number; - h: number; - primInd: string, - index: Record; - flexEdge?: Record; - flexEdgeSuper?: Record; - scale: number; - category: string; - weight: number; - grid: string; - POI: any[]; - Keyring?: any[]; - Jail: any[]; - Tiles: Record; - effectTiles: Record>; - Skin: Record; - /** List of inaccessible entrance pairs */ - inaccessible: {indX1: number, indY1: number, dir1: string, indX2: number, indY2: number, dir2: string}[]; - /** tags */ - tags: string[], - /** tags that make weight 0 if they exist */ - forbidTags?: string[], - /** tags required or else bad things happen */ - requireTags?: string[], - /** tags for following 3 */ - indexTags: string[], - /** tags and max counts before this tile is no longer considered */ - maxTags: number[], - /** tags and weight bonus */ - bonusTags: number[], - /** tags and weight mult */ - multTags: number[], - /** NEGATION operator, triggers the mult if there is NOT a tag */ - notTags?: any[], -} - -interface KDBondage { - color: string, - /** Order in which enemies will struggle */ - priority: number, - /** Multiplier for struggle rate */ - struggleRate: number, - /** Multiplier for the max health component of struggle */ - healthStruggleBoost: number, - /** Multiplier for the power component of struggle */ - powerStruggleBoost: number, -} - -interface KDCursedVar { - variant: (restraint: restraint, newRestraintName: string) => any, - level: number, -} - -interface KDDelayedAction { - data: any, - time: number, - commit: string, - update?: string, - /** Cancel this in certain cases */ - tags: string[], -} - -interface KDBondageMachineFunc { - eligible_player: (tile, x, y, entity) => boolean; - eligible_enemy: (tile, x, y, entity) => boolean; - - function_player: (tile, delta, x, y, entity) => boolean; - function_enemy: (tile, delta, x, y, entity) => boolean; -} - -interface KDDroppedItemProp { - /** When blindfolded, this item will be invisible if your blind level is equal to this or higher */ - tinyness?: number, -} - -type KDParticleData = { - zIndex: number, - fadeEase?: string, - time: number, - phase?: number, - - rotation?: number, - - vy?: number, - vy_spread?: number, - vx?: number, - vx_spread?: number, - sin_period?: number, - sin_period_spread?: number, - sin_x?: number, - sin_x_spread?: number, - sin_y?: number, - sin_y_spread?: number, - /** Lifetime in ms */ - lifetime: number, - lifetime_spread?: number, -} - -interface KDCursedDef { - /** Restraints with this curse are unremovable via shrine */ - noShrine?: boolean, - /** TODO NOT IMPLEMENTED for a future RemoveCursesWithShrine function */ - shrineRemove?: string[], - onApply?: (item: item, host?: item) => void, - condition: (item: item) => boolean, - remove: (item: item, host: item) => void, events?: KinkyDungeonEvent[] -} - -type SpecialCondition = { - resetCD: boolean, - criteria: (enemy: entity, AIData: any) => boolean, -} - -type KDEventData_PostApply = {player: entity, item: item|null, host: item, keep: boolean, Link: boolean} - -declare const PIXI: any; -declare const zip: any; diff --git a/Game/KinkyDungeon.js b/Game/KinkyDungeon.js deleted file mode 100644 index ee09a0ff3..000000000 --- a/Game/KinkyDungeon.js +++ /dev/null @@ -1,2980 +0,0 @@ -"use strict"; - -// Disable interpolation when scaling, will make texture be pixelated -PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST; - -/** These languages have characters which are rendered bigger than English. */ -let KDBigLanguages = ["CN", "KR", "JP"]; -let KDBigLanguages2 = ["Chinese", "Korean", "Japanese"]; -/** Language List */ -let KDLanguages = ["", "CN", "KR", "JP", "ES"]; - -let KinkyDungeonPlayerNeedsRefresh = false; -let KinkyDungeonNextRefreshCheck = 0; - -// Check URL to see if indev branch -const pp = new URLSearchParams(window.location.search); -let param_branch = pp.has('branch') ? pp.get('branch') : ""; -let param_test = pp.has('test') ? pp.get('test') : ""; -let param_localhost = pp.has('localhost') ? pp.get('localhost') : ""; -let TestMode = param_test || param_branch || param_localhost || ServerURL == 'https://bc-server-test.herokuapp.com/'; - -let KDDebugMode = false; -let KDDebug = false; -let KDDebugPerks = false; -let KDDebugGold = false; - -let KDAllModFiles = []; -let KDModFiles = {}; - -let KinkyDungeonPerksConfig = "1"; - -let KDUnlockedPerks = []; - -let KinkyDungeonBackground = "BrickWall"; -/** - * @type {Character} - */ -let KinkyDungeonPlayer = null; -let KinkyDungeonState = "Consent"; - -let KinkyDungeonRep = 0; // Variable to store max level to avoid losing it if the server doesnt take the rep update - -function KDSetDefaultKeybindings() { - KinkyDungeonKeybindingsTemp = Object.assign({}, KDDefaultKB); -} - -let KinkyDungeonKeybindings = null; -let KinkyDungeonKeybindingsTemp = null; -let KinkyDungeonKeybindingCurrentKey = ""; -let KinkyDungeonKeybindingCurrentKeyRelease = ""; - -let KinkyDungeonNewGame = 0; - -let KinkyDungeonGameRunning = false; - -let KDLose = false; - -//let KinkyDungeonKeyLower = [87+32, 65+32, 83+32, 68+32, 81+32, 45+32, 90+32, 43+32]; // WASD -let KinkyDungeonKey = ['KeyW', 'KeyA', 'KeyS', 'KeyD', 'KeyQ', 'KeyE', 'KeyZ', 'KeyC']; -//let KinkyDungeonKeyNumpad = [56, 52, 50, 54, 55, 57, 49, 51]; // Numpad -let KinkyDungeonKeySpell = ['Digit1', 'Digit2', 'Digit3', 'Digit4', 'Digit5', 'Digit6', 'Digit7']; // 1 2 3 4 5 6 7 -let KinkyDungeonKeyWait = ['KeyX']; -let KinkyDungeonKeySkip = ['Space']; -let KinkyDungeonKeyEnter = ['Enter']; -let KinkyDungeonKeySprint = ['ShiftLeft']; -let KinkyDungeonKeyWeapon = ['KeyF']; -let KinkyDungeonKeyUpcast = ['KeyR', 'ControlLeft']; -let KinkyDungeonKeyMenu = ['KeyT', 'KeyI', 'KeyG', 'KeyM', 'KeyL']; // QuikInv, Inventory, Reputation, Magic, Log -let KinkyDungeonKeyToggle = ['Backquote', 'KeyB', 'KeyV', 'KeyN', 'Comma', 'Slash']; // Log, Passing, Door, Auto Struggle, Auto Pathfind -let KinkyDungeonKeySpellPage = ['Backquote']; -let KinkyDungeonKeySwitchWeapon = ['ControlRight']; - -let KDLoadingTextKeys = {}; - - -let KinkyDungeonGraphicsQuality = true; - -let KDToggles = { - VibeSounds: true, - Music: true, - Sound: true, - Drool: true, - DrawArmor: true, - TurnCounter: true, - ShowNPCStatuses: true, - StunFlash: true, - ArousalHearts: true, - VibeHearts: true, - FancyWalls: true, -}; - -let KDDefaultKB = { - Down: KinkyDungeonKey[2], - DownLeft: KinkyDungeonKey[6], - DownRight: KinkyDungeonKey[7], - Left: KinkyDungeonKey[1], - Right: KinkyDungeonKey[3], - Up: KinkyDungeonKey[0], - UpLeft: KinkyDungeonKey[4], - UpRight: KinkyDungeonKey[5], - - Spell1: KinkyDungeonKeySpell[0], - Spell2: KinkyDungeonKeySpell[1], - Spell3: KinkyDungeonKeySpell[2], - Spell4: KinkyDungeonKeySpell[3], - Spell5: KinkyDungeonKeySpell[4], - Spell6: KinkyDungeonKeySpell[5], - Spell7: KinkyDungeonKeySpell[6], - SpellWeapon: KinkyDungeonKeyWeapon[0], - - Wait: KinkyDungeonKeyWait[0], - Skip: KinkyDungeonKeySkip[0], - Enter: KinkyDungeonKeyEnter[0], - Sprint: KinkyDungeonKeySprint[0], - - SpellPage: KinkyDungeonKeySpellPage[0], - SwitchWeapon: KinkyDungeonKeySwitchWeapon[0], - - QInventory: KinkyDungeonKeyMenu[0], - Inventory: KinkyDungeonKeyMenu[1], - Reputation: KinkyDungeonKeyMenu[2], - Magic: KinkyDungeonKeyMenu[3], - Log: KinkyDungeonKeyMenu[4], - - Upcast: KinkyDungeonKeyUpcast[0], - UpcastCancel: KinkyDungeonKeyUpcast[1], - - MsgLog: KinkyDungeonKeyToggle[0], - Pass: KinkyDungeonKeyToggle[1], - Door: KinkyDungeonKeyToggle[2], - AStruggle: KinkyDungeonKeyToggle[3], - APathfind: KinkyDungeonKeyToggle[4], - AInspect: KinkyDungeonKeyToggle[5], -}; - -let KinkyDungeonRootDirectory = "Screens/MiniGame/KinkyDungeon/"; -let KinkyDungeonPlayerCharacter = null; // Other player object -let KinkyDungeonGameData = null; // Data sent by other player -let KinkyDungeonGameDataNullTimer = 4000; // If data is null, we query this often -let KinkyDungeonGameDataNullTimerTime = 0; -let KinkyDungeonStreamingPlayers = []; // List of players to stream to - -let KinkyDungeonInitTime = 0; - -let KinkyDungeonSleepTime = 0; -let KinkyDungeonFreezeTime = 1000; -let KinkyDungeonPlaySelfTime = 300; -let KinkyDungeonOrgasmTime = 1000; -let KinkyDungeonAutoWait = false; -let KinkyDungeonAutoWaitStruggle = false; - -let KinkyDungeonConfigAppearance = false; - -const Consumable = "consumable"; -const Restraint = "restraint"; -const LooseRestraint = "looserestraint"; -const Outfit = "outfit"; -const Accessory = "accessory"; -const Weapon = "weapon"; -const Misc = "misc"; - -let KinkyDungeonStatsChoice = new Map(); - -let KDJourney = ""; - -let KDOptOut = false; - -/** -* @typedef {{ -* KeysNeeded: boolean, -* PoolUses: number, -* PoolUsesGrace: number, -* JailRemoveRestraintsTimer: number; -* KinkyDungeonSpawnJailers: number; -* KinkyDungeonSpawnJailersMax: number; -* KinkyDungeonLeashedPlayer: number; -* KinkyDungeonLeashingEnemy: number; -* KinkyDungeonJailGuard: number; -* KinkyDungeonGuardTimer: number; -* KinkyDungeonGuardTimerMax: number; -* KinkyDungeonGuardSpawnTimer: number; -* KinkyDungeonGuardSpawnTimerMax: number; -* KinkyDungeonGuardSpawnTimerMin: number; -* KinkyDungeonMaxPrisonReduction: number; -* KinkyDungeonPrisonReduction: number; -* KinkyDungeonPrisonExtraGhostRep: number; -* PrisonGoodBehaviorFromLeash: number; -* KinkyDungeonJailTourTimer: number; -* KinkyDungeonJailTourTimerMin: number; -* KinkyDungeonJailTourTimerMax: number; -* KinkyDungeonPenanceCostCurrent: number; -* KinkyDungeonAngel: number; -* KDPenanceStage: number; -* KDPenanceStageEnd: number; -* AngelCurrentRep: string; -* KDPenanceMode: string; -* OrgasmStage: number; -* OrgasmTurns: number; -* OrgasmStamina: number; -* SleepTurns: number; -* PlaySelfTurns: number; -* RescueFlag: boolean; -* KinkyDungeonPenance: boolean; -* GuardApplyTime: number; -* WarningLevel: number; -* AncientEnergyLevel: number; -* OrigEnergyLevel: number; -* LastMP: number; -* LastAP: number; -* LastSP: number; -* LastWP: number; -* Outfit: string, -* Champion: string, -* ChampionCurrent: number, -* JailPoints: KDJailPoint[], -* LastMapSeed: string, -* AlreadyOpened: {x: number, y:number}[], -* Journey: string, -* CheckpointIndices: number[], -* PrisonerState: string, -* TimesJailed: number, -* JailTurns: number, -* JailKey: boolean, -* CurrentDialog: string, -* CurrentDialogStage: string, -* OrgasmNextStageTimer: number, -* DistractionCooldown: number, -* ConfirmAttack: boolean, -* CurrentDialogMsg: string, -* CurrentDialogMsgSpeaker: string, -* CurrentDialogMsgPersonality: string, -* CurrentDialogMsgID: number, -* CurrentDialogMsgData: Record, -* CurrentDialogMsgValue: Record, -* AlertTimer: number, -* RespawnQueue: {enemy: string, faction: string}[], -* HeartTaken: boolean, -* CurrentVibration: KinkyVibration, -* Edged: boolean, -* TimeSinceLastVibeStart: Record, -* TimeSinceLastVibeEnd: Record, -* OfferFatigue: number, -* Favors: Record, -* RoomType: string, -* MapMod: string, -* HunterTimer: number, -* Hunters: number[], -* Quests: string[], -* MapFaction: string, -* PriorJailbreaks: number, -* PriorJailbreaksDecay: number, -* PreviousWeapon: string, -* StaminaPause: number, -* StaminaSlow: number, -* ManaSlow: number, -* TempFlagFloorTicks: Record, -* KneelTurns: number, -* HiddenSpellPages : Record, -* KeyringLocations : {x: number, y: number}[], -* HiddenItems : Record, -* CagedTime : number, -* ShopItems: shopItem[], -* DelayedActions: KDDelayedAction[], -* JailFaction: string[], -* GuardFaction: string[], -* OfferCount: number, -* MainPath: string, -* ShortcutPath: string, -* ItemID: number, -* ShopkeeperFee: number, -* DollCount: number, -* ChestsGenerated: string[], -* DollRoomCount: number, -* CollectedHearts: number, -* CollectedOrbs: number, -* otherPlaying: number, - -*}} KDGameDataBase -*/ -let KDGameDataBase = { - CollectedOrbs: 0, - CollectedHearts: 0, - DollRoomCount: 0, - ChestsGenerated: [], - MainPath: 'grv', - ShortcutPath: 'grv', - DollCount: 0, - - CagedTime: 0, - HiddenItems: {}, - KeyringLocations: [], - HiddenSpellPages: {}, - PriorJailbreaks: 0, - PriorJailbreaksDecay: 0, - MapFaction: "", - KeysNeeded: false, - RoomType: "", - MapMod: "", - - Quests: [], - - HunterTimer: 0, - Hunters: [], - - AlertTimer: 0, - OrgasmNextStageTimer: 0, - DistractionCooldown: 0, - - PoolUses: 0, - PoolUsesGrace: 3, - JailRemoveRestraintsTimer: 0, - KinkyDungeonSpawnJailers: 0, - KinkyDungeonSpawnJailersMax: 5, - KinkyDungeonLeashedPlayer: 0, - KinkyDungeonLeashingEnemy: 0, - - KinkyDungeonJailGuard: 0, - KinkyDungeonGuardTimer: 0, - KinkyDungeonGuardTimerMax: 28, - KinkyDungeonGuardSpawnTimer: 0, - KinkyDungeonGuardSpawnTimerMax: 80, - KinkyDungeonGuardSpawnTimerMin: 50, - KinkyDungeonMaxPrisonReduction: 10, - KinkyDungeonPrisonReduction: 0, - KinkyDungeonPrisonExtraGhostRep: 0, - PrisonGoodBehaviorFromLeash: 0, - - KinkyDungeonJailTourTimer: 0, - KinkyDungeonJailTourTimerMin: 20, - KinkyDungeonJailTourTimerMax: 40, - - KinkyDungeonPenanceCostCurrent: 100, - - KinkyDungeonAngel: 0, - KDPenanceStage: 0, - KDPenanceStageEnd: 0, - AngelCurrentRep: "", - KDPenanceMode: "", - - OrgasmStage: 0, - OrgasmTurns: 0, - OrgasmStamina: 0, - - KinkyDungeonPenance: false, - - RescueFlag: false, - - SleepTurns: 0, - PlaySelfTurns: 0, - GuardApplyTime: 0, - - AncientEnergyLevel: 0, - OrigEnergyLevel: 0, - LastAP: 0, - LastSP: KDMaxStatStart, - LastMP: KDMaxStatStart, - LastWP: KDMaxStatStart, - - Outfit: "Default", - - Champion: "", - ChampionCurrent: 0, - - JailPoints: [], - - WarningLevel: 0, - LastMapSeed: "", - - AlreadyOpened: [], - Journey: "", - CheckpointIndices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], - - TempFlagFloorTicks: {}, - - // "" = not a prisoner - // "jail" = must remain in cell - // "parole" = can roam but not allowed to take most actions - PrisonerState: "", - TimesJailed: 0, - JailTurns: 0, - JailKey: false, - - CurrentDialog: "", - CurrentDialogStage: "", - CurrentDialogMsg: "", - CurrentDialogMsgSpeaker: "", - CurrentDialogMsgPersonality: "", - CurrentDialogMsgData: {}, - CurrentDialogMsgValue: {}, - CurrentDialogMsgID: -1, - - ConfirmAttack: false, - RespawnQueue: [], - HeartTaken: false, - - CurrentVibration: null, - Edged: false, - TimeSinceLastVibeStart: {}, - TimeSinceLastVibeEnd: {}, - - OfferFatigue: 0, - - Favors: {}, - PreviousWeapon: null, - - StaminaPause: 0, - StaminaSlow: 0, - ManaSlow: 0, - KneelTurns: 0, - ShopItems: [], - DelayedActions: [], - JailFaction: [], - GuardFaction: [], - - OfferCount: 0, - - ItemID: 0, - ShopkeeperFee: 0, - otherPlaying: 0, -}; -/** - * @type {KDGameDataBase} - */ -let KDGameData = Object.assign({}, KDGameDataBase); -/*{ - KinkyDungeonSpawnJailers: 0, - KinkyDungeonSpawnJailersMax: 5, - KinkyDungeonLeashedPlayer: 0, - KinkyDungeonLeashingEnemy: 0, - - KinkyDungeonJailGuard: 0, - KinkyDungeonGuardTimer: 0, - KinkyDungeonGuardTimerMax: 22, - KinkyDungeonGuardSpawnTimer: 0, - KinkyDungeonGuardSpawnTimerMax: 20, - KinkyDungeonGuardSpawnTimerMin: 6, - KinkyDungeonMaxPrisonReduction: 10, - KinkyDungeonPrisonReduction: 0, - KinkyDungeonPrisonExtraGhostRep: 0, - - KinkyDungeonJailTourTimer: 0, - KinkyDungeonJailTourTimerMin: 20, - KinkyDungeonJailTourTimerMax: 40, - - KinkyDungeonPenanceCostCurrent: 100, - - KinkyDungeonAngel: 0, - KDPenanceStage: 0, - KDPenanceStageEnd: 0, - AngelCurrentRep: "", - KDPenanceMode: "", - - KinkyDungeonPenance: false, -};*/ - -let KDLeashingEnemy = null; -function KinkyDungeonLeashingEnemy() { - if (KDGameData.KinkyDungeonLeashingEnemy) { - if (!KDLeashingEnemy) { - KDLeashingEnemy = KinkyDungeonFindID(KDGameData.KinkyDungeonLeashingEnemy); - } - } else if (!KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { - KDLeashingEnemy = null; - } - return KDLeashingEnemy; -} -let KDJailGuard = null; - -/** - * - * @returns {entity} - */ -function KinkyDungeonJailGuard() { - if (KDGameData.KinkyDungeonJailGuard) { - if (!KDJailGuard) { - KDJailGuard = KinkyDungeonFindID(KDGameData.KinkyDungeonJailGuard); - } - } else { - KDJailGuard = null; - } - return KDJailGuard; -} -let KDAngel = null; -function KinkyDungeonAngel() { - if (KDGameData.KinkyDungeonAngel) { - if (!KDAngel) { - KDAngel = KinkyDungeonFindID(KDGameData.KinkyDungeonAngel); - } - } else { - KDAngel = null; - } - return KDAngel; -} - -function KDUnlockPerk(Perk) { - if (Perk && !KDUnlockedPerks.includes(Perk)) KDUnlockedPerks.push(Perk); - KDLoadPerks(); - localStorage.setItem("KDUnlockedPerks", JSON.stringify(KDUnlockedPerks)); -} - -// @ts-ignore -function KDLoadPerks(Perk) { - if (localStorage.getItem("KDUnlockedPerks")) { - let perks = JSON.parse(localStorage.getItem("KDUnlockedPerks")); - if (perks) { - for (let p of perks) { - if (!KDUnlockedPerks.includes(p)) { - KDUnlockedPerks.push(p); - } - } - } - } -} - -/** - * - * @param {any[]} list - * @return {Record} - */ -function KDMapInit(list) { - let map = {}; - for (let l of list) { - map[l] = true; - } - return map; -} - -function KDistEuclidean(x, y) { - return Math.sqrt(x*x + y*y); -} - -function KDistChebyshev(x, y) { - return Math.max(Math.abs(x), Math.abs(y)); -} - -function KDLoadToggles() { - let loaded = localStorage.getItem("KDToggles") ? JSON.parse(localStorage.getItem("KDToggles")) : {}; - for (let t of Object.keys(KDToggles)) { - if (loaded[t] != undefined) - KDToggles[t] = loaded[t]; - } - - if (!Player.GraphicsSettings) { - // @ts-ignore - Player.GraphicsSettings = {AnimationQuality: 0}; - } -} -function KDSaveToggles() { - localStorage.setItem("KDToggles", JSON.stringify(KDToggles)); -} - -/** - * Loads the kinky dungeon game - * @returns {void} - Nothing - */ -function KinkyDungeonLoad() { - KinkyDungeonSetupCrashHandler(); - - for (let entry of Object.entries(KDLoadingTextKeys)) { - addTextKey(entry[0], entry[1]); - } - KDCategories = Object.assign([], KDCategoriesStart); - for (let c of KDCategories) { - c.buffs = []; - c.debuffs = []; - } - - for (let stat of Object.entries(KinkyDungeonStatsPresets)) { - for (let c of KDCategories) { - if (stat[1].category == c.name) { - if (!stat[1].buff && (stat[1].debuff || KDGetPerkCost(stat[1]) < 0)) - c.debuffs.push(stat); - else - c.buffs.push(stat); - } - } - } - - KDLoadPerks(); - - CurrentDarkFactor = 0; - - KinkyDungeonPlayerNeedsRefresh = false; - - KinkyDungeonInitTime = CommonTime(); - KinkyDungeonGameKey.load(); - - if (!KinkyDungeonIsPlayer()) KinkyDungeonGameRunning = false; - // @ts-ignore - if (ServerURL != 'foobar' && KinkyDungeonState == 'Consent') KinkyDungeonState = "Menu"; - //if (!Player.KinkyDungeonSave) Player.KinkyDungeonSave = {}; - - if (!KinkyDungeonGameRunning) { - if (!KinkyDungeonPlayer) { // new game - KDrandomizeSeed(false); - if (KDPatched) { - // @ts-ignore - KinkyDungeonPlayer = suppressCanvasUpdate(() => CharacterLoadNPC("NPC_Avatar")); - } else { - KinkyDungeonPlayer = CharacterLoadNPC("NPC_Avatar"); - } - KinkyDungeonPlayer.Type = "simple"; - // @ts-ignore - KinkyDungeonPlayer.OnlineSharedSettings = {BlockBodyCosplay: true, }; - - KDLoadToggles(); - - KinkyDungeonBones = localStorage.getItem("KinkyDungeonBones") != undefined ? localStorage.getItem("KinkyDungeonBones") : KinkyDungeonBones; - - if (localStorage.getItem("KDVibeVolume")) { - let parsed = parseInt(localStorage.getItem("KDVibeVolume")); - if (parsed != undefined) { - KDVibeVolumeListIndex = parsed; - KDVibeVolume = KDVibeVolumeList[KDVibeVolumeListIndex]; - } - } - if (localStorage.getItem("KDMusicVolume")) { - let parsed = parseInt(localStorage.getItem("KDMusicVolume")); - if (parsed != undefined) { - KDMusicVolumeListIndex = parsed; - KDMusicVolume = KDMusicVolumeList[KDMusicVolumeListIndex]; - } - } - if (localStorage.getItem("KDAnimSpeed")) { - let parsed = parseInt(localStorage.getItem("KDAnimSpeed")); - if (parsed != undefined) { - KDAnimSpeedListIndex = parsed; - KDAnimSpeed = KDAnimSpeedList[KDAnimSpeedListIndex] || 0; - } - } - - KinkyDungeonSexyMode = localStorage.getItem("KinkyDungeonSexyMode") != undefined ? localStorage.getItem("KinkyDungeonSexyMode") == "True" : true; - KinkyDungeonClassMode = localStorage.getItem("KinkyDungeonClassMode") != undefined ? localStorage.getItem("KinkyDungeonClassMode") : "Mage"; - KinkyDungeonSexyPiercing = localStorage.getItem("KinkyDungeonSexyPiercing") != undefined ? localStorage.getItem("KinkyDungeonSexyPiercing") == "True" : false; - KinkyDungeonSexyPlug = localStorage.getItem("KinkyDungeonSexyPlug") != undefined ? localStorage.getItem("KinkyDungeonSexyPlug") == "True" : false; - - KinkyDungeonSaveMode = localStorage.getItem("KinkyDungeonSaveMode") != undefined ? localStorage.getItem("KinkyDungeonSaveMode") == "True" : false; - KinkyDungeonRandomMode = localStorage.getItem("KinkyDungeonRandomMode") != undefined ? localStorage.getItem("KinkyDungeonRandomMode") == "True" : false; - KinkyDungeonEasyMode = localStorage.getItem("KinkyDungeonEasyMode") != undefined ? parseInt(localStorage.getItem("KinkyDungeonEasyMode")) || 0 : 0; - - KinkyDungeonNewDress = true; - let appearance = LZString.decompressFromBase64(localStorage.getItem("kinkydungeonappearance")); - if (!appearance) { - KinkyDungeonNewDress = false; - appearance = CharacterAppearanceStringify(KinkyDungeonPlayerCharacter ? KinkyDungeonPlayerCharacter : Player); - } - - CharacterAppearanceRestore(KinkyDungeonPlayer, appearance); - - - if (KDPatched) - // @ts-ignore - suppressCanvasUpdate(() => CharacterReleaseTotal(KinkyDungeonPlayer)); - else - CharacterReleaseTotal(KinkyDungeonPlayer); - KinkyDungeonDressSet(); - if (KDPatched) - // @ts-ignore - suppressCanvasUpdate(() => CharacterNaked(KinkyDungeonPlayer)); - else - CharacterNaked(KinkyDungeonPlayer); - KinkyDungeonInitializeDresses(); - KinkyDungeonDressPlayer(); - KDInitProtectedGroups(); - CharacterRefresh(KinkyDungeonPlayer); - } - - if (localStorage.getItem("KinkyDungeonKeybindings") && JSON.parse(localStorage.getItem("KinkyDungeonKeybindings"))) { - KinkyDungeonKeybindings = JSON.parse(localStorage.getItem("KinkyDungeonKeybindings")); - KinkyDungeonKeybindingsTemp = {}; - Object.assign(KinkyDungeonKeybindingsTemp, KinkyDungeonKeybindings); - console.log(KinkyDungeonKeybindings); - } - else console.log("Failed to load keybindings"); - - if (KinkyDungeonIsPlayer()) { - if (ServerURL != 'foobar' && KinkyDungeonState == "Consent") - KinkyDungeonState = "Menu"; - KinkyDungeonGameData = null; - - CharacterAppearancePreviousEmoticon = WardrobeGetExpression(Player).Emoticon; - ServerSend("ChatRoomCharacterExpressionUpdate", { Name: "Gaming", Group: "Emoticon", Appearance: ServerAppearanceBundle(Player.Appearance) }); - } else { - KinkyDungeonState = "Game"; - if (!KinkyDungeonGameData) { - MiniGameKinkyDungeonLevel = 1; - KinkyDungeonInitialize(1); - } - } - - for (const group of KinkyDungeonStruggleGroupsBase) { - if (group == "ItemM") { - if (InventoryGet(Player, "ItemMouth")) - KinkyDungeonRestraintsLocked.push("ItemMouth"); - if (InventoryGet(Player, "ItemMouth2")) - KinkyDungeonRestraintsLocked.push("ItemMouth2"); - if (InventoryGet(Player, "ItemMouth3")) - KinkyDungeonRestraintsLocked.push("ItemMouth3"); - } - if (group == "ItemH") { - if (InventoryGet(Player, "ItemHood")) - KinkyDungeonRestraintsLocked.push("ItemHood"); - if (InventoryGet(Player, "ItemHead")) - KinkyDungeonRestraintsLocked.push("ItemHead"); - } - - if (InventoryGet(Player, group)) - KinkyDungeonRestraintsLocked.push(group); - } - } -} - -/** - * Restricts Devious Dungeon Challenge to only occur when inside the arcade - * @returns {boolean} - If the player is in the arcade - */ -function KinkyDungeonDeviousDungeonAvailable() { - return KinkyDungeonIsPlayer() && (DialogGamingPreviousRoom == "Arcade" || MiniGameReturnFunction == "ArcadeKinkyDungeonEnd") && ServerURL != 'foobar'; -} - -/** - * Returns whether or not the player is the one playing, which determines whether or not to draw the UI and struggle groups - * @returns {boolean} - If the player is the game player - */ -function KinkyDungeonIsPlayer() { - return (!KinkyDungeonPlayerCharacter || KinkyDungeonPlayerCharacter == Player) ; -} - -/** - * Runs the kinky dungeon game and draws its components on screen - * @returns {void} - Nothing - */ - -let KinkyDungeonCreditsPos = 0; -let KDMaxPatronPerPage = 4; -let KDMaxPatron = 5; -let KinkyDungeonPatronPos = 0; -let KinkyDungeonFastWait = true; -let KinkyDungeonTempWait = false; -let KinkyDungeonSexyMode = false; -let KinkyDungeonClassMode = "Mage"; -let KinkyDungeonRandomMode = false; -let KinkyDungeonEasyMode = 0; -let KinkyDungeonSaveMode = false; -let KinkyDungeonSexyPiercing = false; -let KinkyDungeonSexyPlug = false; -let KDOldValue = ""; -let KDOriginalValue = ""; - -let KDRestart = false; - -let fpscounter = 0; -let lastfps = 0; -let dispfps = 60; - -async function sleep(msec) { - return new Promise(resolve => setTimeout(resolve, msec)); -} - -function KinkyDungeonRun() { - // Override right click and make it trigger the Skip key - // Normally we don't override right click on websites but this is a game - if (!CommonIsMobile) - document.addEventListener('contextmenu', event => { - if (CommonIsMobile || document.activeElement?.id != "MainCanvas") { - // Nothing!! - } else { - event.preventDefault(); - let code = KinkyDungeonKeySkip[0]; - if (!KinkyDungeonKeybindingCurrentKey) { - KinkyDungeonKeybindingCurrentKey = code; - KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime() + 100; - // We also press it for 100 msec - (async function() { - KinkyDungeonGameKey.keyPressed[9] = true; - await sleep(100); - KinkyDungeonGameKey.keyPressed[9] = false; - })(); - } - } - }); - - // Reset the sprites drawn cache - kdSpritesDrawn = new Map(); - - KDLastButtonsCache = KDButtonsCache; - KDButtonsCache = {}; - KDUpdateVibeSounds(); - KDUpdateMusic(); - let BG = "BrickWall"; - DrawImage("Backgrounds/" + BG + ".jpg", 0, 0); - - if (ServerURL != "foobar") - DrawButtonVis(1885, 25, 90, 90, "", "#ffffff", KinkyDungeonRootDirectory + "UI/Exit.png"); - - // eslint-disable-next-line no-constant-condition - if (true || KDToggles.Fullscreen) { - KinkyDungeonGridWidthDisplay = 2000/KinkyDungeonGridSizeDisplay;//17; - KinkyDungeonGridHeightDisplay = 1000/KinkyDungeonGridSizeDisplay;//9; - canvasOffsetX = 0; - canvasOffsetY = 0; - KinkyDungeonCanvas.width = 2000; - KinkyDungeonCanvas.height = 1000; - } else { - KinkyDungeonGridWidthDisplay = 16; - KinkyDungeonGridHeightDisplay = 9; - canvasOffsetX = canvasOffsetX_ui; - canvasOffsetY = canvasOffsetY_ui; - KinkyDungeonCanvas.width = KinkyDungeonGridSizeDisplay * KinkyDungeonGridWidthDisplay; - KinkyDungeonCanvas.height = KinkyDungeonGridSizeDisplay * KinkyDungeonGridHeightDisplay; - } - // Check to see whether the player (outside of KD) needs a refresh - KinkyDungeonCheckPlayerRefresh(); - - // Draw the characters - if ((KinkyDungeonState != "Game" || KinkyDungeonDrawState != "Game") && KinkyDungeonState != "Stats") - DrawCharacter(KinkyDungeonPlayer, 0, 0, 1); - - - - if (KinkyDungeonState == "Mods") { - DrawButtonKDEx("mods_back", (bdata) => { - KinkyDungeonState = "Menu"; - KDExecuteMods(); - return true; - }, true, 975, 850, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", ""); - DrawButtonKDEx("mods_load", (bdata) => { - getFileInput(); - return true; - }, true, 975, 250, 350, 64, TextGet("KinkyDungeonLoadMod"), "#ffffff", ""); - DrawTextKD(TextGet("KinkyDungeonLoadModWarning1"), 1175, 100, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonLoadModWarning2"), 1175, 150, "#ffffff", KDTextGray2); - - KDDrawMods(); - - } else if (KinkyDungeonState == "Credits") { - let credits = TextGet("KinkyDungeonCreditsList" + KinkyDungeonCreditsPos).split('|'); - let i = 0; - MainCanvas.textAlign = "left"; - for (let c of credits) { - DrawTextKD(c, 550, 25 + 40 * i, "#ffffff", KDTextGray2); - i++; - } - MainCanvas.textAlign = "center"; - - DrawButtonVis(1870, 930, 110, 64, TextGet("KinkyDungeonBack"), "#ffffff", ""); - DrawButtonVis(1730, 930, 110, 64, TextGet("KinkyDungeonNext"), "#ffffff", ""); - } else if (KinkyDungeonState == "Patrons") { - for (let x = KinkyDungeonPatronPos * KDMaxPatronPerPage; x < KinkyDungeonPatronPos * KDMaxPatronPerPage + KDMaxPatronPerPage && x <= KDMaxPatron; x++) { - let credits = TextGet("KinkyDungeonPatronsList" + x).split('|'); - let i = 0; - MainCanvas.textAlign = "left"; - for (let c of credits) { - DrawTextKD(c, 550 + 350 * (x - KinkyDungeonPatronPos * KDMaxPatronPerPage), 25 + 40 * i, "#ffffff", KDTextGray2); - i++; - } - MainCanvas.textAlign = "center"; - } - - - DrawButtonVis(1870, 930, 110, 64, TextGet("KinkyDungeonBack"), "#ffffff", ""); - DrawButtonVis(1730, 930, 110, 64, TextGet("KinkyDungeonNext"), "#ffffff", ""); - //DrawButtonVis(1730, 930, 110, 64, TextGet("KinkyDungeonNext"), "#ffffff", ""); - } else if (KinkyDungeonState == "Menu") { - KinkyDungeonGameFlag = false; - MainCanvas.textAlign = "left"; - DrawCheckboxVis(600, 100, 64, 64, TextGet("KDToggleSound"), KDToggles.Sound, false, "#ffffff"); - MainCanvas.textAlign = "center"; - // Draw temp start screen - if (KDLose) { - DrawTextKD(TextGet("End"), 1250, 250, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("End2"), 1250, 310, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("End3"), 1250, 370, "#ffffff", KDTextGray2); - } else { - DrawTextKD(TextGet("KinkyDungeon"), 1250, 200, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("Intro"), 1250, 250, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("Intro2"), 1250, 300, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("Intro3"), 1250, 350, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("Intro4" + (ServerURL == 'foobar' ? "" : "BC")), 1250, 400, "#ffffff", KDTextGray2); - } - - if (ArcadeDeviousChallenge && KinkyDungeonDeviousDungeonAvailable() && ServerURL != "foobar") - DrawTextKD(TextGet("DeviousChallenge"), 1250, 925, "#ffffff", KDTextGray2); - - - DrawButtonKDEx("GameContinue", () => { - KinkyDungeonStartNewGame(true); - return true; - }, true, 1075, 460, 350, 64, TextGet("GameContinue"), localStorage.getItem('KinkyDungeonSave') ? "#ffffff" : "pink", ""); - DrawButtonKDEx("GameStart", () => { - KinkyDungeonState = "Diff"; - KinkyDungeonLoadStats(); - return true; - }, true, 1075, 540, 350, 64, TextGet("GameStart"), "#ffffff", ""); - DrawButtonKDEx("LoadGame", () => { - KinkyDungeonState = "Load"; - ElementCreateTextArea("saveInputField"); - return true; - }, true, 1075, 620, 350, 64, TextGet("LoadGame"), "#ffffff", ""); - DrawButtonKDEx("GameConfigKeys", () => { - KinkyDungeonState = "Keybindings"; - - if (!KinkyDungeonKeybindings) - KDSetDefaultKeybindings(); - else { - KinkyDungeonKeybindingsTemp = {}; - Object.assign(KinkyDungeonKeybindingsTemp, KinkyDungeonKeybindings); - } - return true; - }, true, 1075, 700, 350, 64, TextGet("GameConfigKeys"), "#ffffff", ""); - DrawButtonKDEx("GameToggles", () => { - KinkyDungeonState = "Toggles"; - return true; - }, true, 1075, 780, 350, 64, TextGet("GameToggles"), "#ffffff", ""); - - if (TestMode) { - DrawButtonKDEx("TileEditor", () => { - KDInitTileEditor(); - KinkyDungeonState = "TileEditor"; - return true; - }, true, 1075, 860, 350, 64, "Tile Editor", "#ffffff", ""); - } - - - DrawButtonVis(25, 942, 325, 50, TextGet("KinkyDungeonDressPlayer"), "#ffffff", ""); - DrawButtonVis(360, 942, 220, 50, TextGet((KinkyDungeonReplaceConfirm > 0 ) ? "KinkyDungeonConfirm" : "KinkyDungeonDressPlayerReset"), "#ffffff", ""); - DrawButtonVis(590, 942, 150, 50, TextGet("KinkyDungeonDressPlayerImport"), "#ffffff", ""); - DrawButtonVis(1850, 942, 135, 50, TextGet("KinkyDungeonCredits"), "#ffffff", ""); - DrawButtonVis(1700, 942, 135, 50, TextGet("KinkyDungeonPatrons"), "#ffffff", ""); - DrawButtonKDEx("Deviantart", (bdata) => { - let url = 'https://www.deviantart.com/ada18980'; - window.open(url, '_blank'); - return true; - }, true, 1700, 694, 280, 50, TextGet("KinkyDungeonDeviantart"), "#ffffff", ""); - DrawButtonKDEx("Patreon", (bdata) => { - let url = 'https://www.patreon.com/ada18980'; - KDSendEvent('patreon'); - window.open(url, '_blank'); - return true; - }, true, 1700, 754, 280, 50, TextGet("KinkyDungeonPatreon"), "#ffeecc", ""); - - - DrawTextKD(TextGet("Language") + " ->", 1675, 898, "#ffffff", KDTextGray2, undefined, "right"); - DrawButtonVis(1700, 874, 280, 50, localStorage.getItem("BondageClubLanguage") || "EN", "#ffffff", ""); - - if (KDPatched) { - // @ts-ignore - DrawButtonKDEx("mods_button", (bdata) => { - KinkyDungeonState = "Mods"; - return true; - }, !KDModsLoaded, 1700, 814, 280, 50, TextGet(!KDModsLoaded ? "KDMods" : "KDModsLoaded"), "#ffffff", ""); - } - - if (KDRestart) - DrawTextKD(TextGet("RestartNeeded" + (localStorage.getItem("BondageClubLanguage") || "EN")), 1840, 600, "#ffffff", KDTextGray2); - } else if (KinkyDungeonState == "Consent") { - MainCanvas.textAlign = "center"; - // Draw temp start screen - DrawTextKD(TextGet("KinkyDungeonConsent"), 1250, 300, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonConsent2"), 1250, 400, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonConsent3"), 1250, 500, "#ffffff", KDTextGray2); - DrawButtonVis(975, 720, 450, 64, TextGet("KDOptIn"), "#ffffff", ""); - DrawButtonVis(975, 820, 450, 64, TextGet("KDOptOut"), "#ffffff", ""); - } else if (KinkyDungeonState == "TileEditor") { - KDDrawTileEditor(); - } else if (KinkyDungeonState == "Load") { - DrawButtonVis(875, 750, 350, 64, TextGet("KinkyDungeonLoadConfirm"), "#ffffff", ""); - DrawButtonVis(1275, 750, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", ""); - - ElementPosition("saveInputField", 1250, 550, 1000, 230); - } else if (KinkyDungeonState == "LoadOutfit") { - DrawButtonVis(875, 750, 350, 64, TextGet("LoadOutfit"), "#ffffff", ""); - DrawButtonVis(1275, 750, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", ""); - - let newValue = ElementValue("saveInputField"); - if (newValue != KDOldValue) { - let decompressed = LZString.decompressFromBase64(ElementValue("saveInputField")); - if (decompressed) { - let origAppearance = KinkyDungeonPlayer.Appearance; - try { - CharacterAppearanceRestore(KinkyDungeonPlayer, decompressed); - CharacterRefresh(KinkyDungeonPlayer); - KDOldValue = newValue; - KDInitProtectedGroups(); - } catch (e) { - // If we fail, it might be a BCX code. try it! - KinkyDungeonPlayer.Appearance = origAppearance; - try { - let parsed = JSON.parse(decompressed); - if (parsed.length > 0) { - for (let g of parsed) { - InventoryWear(KinkyDungeonPlayer, g.Name, g.Group, g.Color); - } - - CharacterRefresh(KinkyDungeonPlayer); - KDOldValue = newValue; - KDInitProtectedGroups(); - } else { - console.log("Invalid code. Maybe its corrupt?"); - } - } catch (error) { - console.log("Invalid code."); - } - } - } - } - - ElementPosition("saveInputField", 1250, 550, 1000, 230); - } else if (KinkyDungeonState == "Journey") { - DrawTextKD(TextGet("KinkyDungeonJourney"), 1250, 300, "#ffffff", KDTextGray2); - DrawButtonVis(875, 350, 750, 64, TextGet("KinkyDungeonJourney0"), "#ffffff", ""); - DrawButtonVis(875, 450, 750, 64, TextGet("KinkyDungeonJourney1"), "#ffffff", ""); - DrawButtonVis(875, 550, 750, 64, TextGet("KinkyDungeonJourney2"), "#ffffff", ""); - DrawButtonVis(1075, 850, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", ""); - - } else if (KinkyDungeonState == "Diff") { - DrawTextKD(TextGet("KinkyDungeonDifficulty"), 1250, 170, "#ffffff", KDTextGray2); - //DrawButtonVis(875, 350, 750, 64, TextGet("KinkyDungeonDifficulty0"), "#ffffff", ""); - //DrawButtonVis(875, 450, 750, 64, TextGet("KinkyDungeonDifficulty3"), "#ffffff", ""); - //DrawButtonVis(875, 550, 750, 64, TextGet("KinkyDungeonDifficulty1"), "#ffffff", ""); - DrawButtonKDEx("startQuick", () => { - KinkyDungeonStatsChoice = new Map(); - KDUpdatePlugSettings(); - KDLose = false; - KinkyDungeonStartNewGame(); - return true; - }, true, 875, 650, 750, 64, TextGet("KinkyDungeonStartGameQuick"), "#ffffff", ""); - DrawButtonKDEx("startGame", () => { - KinkyDungeonState = "Stats"; - KDUpdatePlugSettings(); - return true; - }, true, 875, 720, 750, 64, TextGet("KinkyDungeonStartGameAdv"), "#ffffff", ""); - - - - if (MouseIn(875, 650, 750, 64)) { - DrawTextFitKD(TextGet("KinkyDungeonStartGameDesc"), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - if (MouseIn(875, 720, 750, 64)) { - DrawTextFitKD(TextGet("KinkyDungeonStartGameDescAdc"), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - DrawButtonVis(1075, 850, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", ""); - - - let buttonswidth = 168; - let buttonsheight = 50; - let buttonspad = 25; - let buttonsypad = 10; - let buttonsstart = 875; - let X = 0; - let Y = 0; - - DrawTextFitKD(TextGet("KDClasses"), 875 - 50, 210 + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - - let classCount = Object.keys(KDClassStart).length; - for (let i = 0; i < classCount; i++) { - X = i % 4; - Y = Math.floor(i / 4); - // @ts-ignore - DrawButtonKDEx("Class" + i, (bdata) => { - KinkyDungeonClassMode = Object.keys(KDClassStart)[i]; - localStorage.setItem("KinkyDungeonClassMode", "" + KinkyDungeonClassMode); - return true; - }, (!KDClassReqs[Object.keys(KDClassStart)[i]]) || KDClassReqs[Object.keys(KDClassStart)[i]](), - buttonsstart + (buttonspad + buttonswidth) * X, 210 + Y*(buttonsheight + buttonsypad), buttonswidth, buttonsheight, TextGet("KinkyDungeonClassMode" + i), - ((!KDClassReqs[Object.keys(KDClassStart)[i]]) || KDClassReqs[Object.keys(KDClassStart)[i]]()) ? - (KinkyDungeonClassMode == Object.keys(KDClassStart)[i] ? "#ffffff" : "#888888") - : "#ff5555", ""); - if (MouseIn(buttonsstart + (buttonspad + buttonswidth) * X, 210 + Y*(buttonsheight + buttonsypad), buttonswidth, buttonsheight)) { - DrawTextFitKD(TextGet("KinkyDungeonClassModeDesc" + i), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - } - - - - DrawTextFitKD(TextGet("KDSexyMode"), 875 - 50, 350 + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - - DrawButtonKDEx("KinkyDungeonSexyMode0", (bdata) => { - KinkyDungeonSexyMode = false; - KDUpdatePlugSettings(); - localStorage.setItem("KinkyDungeonSexyMode", KinkyDungeonSexyMode ? "True" : "False"); - return true; - }, true, 875, 350, 275, 50, TextGet("KinkyDungeonSexyMode0"), !KinkyDungeonSexyMode ? "#ffffff" : "#888888", ""); - if (MouseInKD("KinkyDungeonSexyMode0")) { - DrawTextFitKD(TextGet("KinkyDungeonSexyModeDesc0"), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - DrawButtonKDEx("KinkyDungeonSexyMode1", (bdata) => { - KinkyDungeonSexyMode = true; - KDUpdatePlugSettings(); - localStorage.setItem("KinkyDungeonSexyMode", KinkyDungeonSexyMode ? "True" : "False"); - return true; - }, true, 1175, 350, 275, 50, TextGet("KinkyDungeonSexyMode1"), KinkyDungeonSexyMode ? "#ffffff" : "#888888", ""); - if (MouseInKD("KinkyDungeonSexyMode1")) { - DrawTextFitKD(TextGet("KinkyDungeonSexyModeDesc1"), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - - DrawTextFitKD(TextGet("KDRandomMode"), 875 - 50, 410 + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - - DrawButtonKDEx("KinkyDungeonRandomMode0", (bdata) => { - KinkyDungeonRandomMode = false; - localStorage.setItem("KinkyDungeonRandomMode", KinkyDungeonRandomMode ? "True" : "False"); - return true; - }, true, 875, 410, 275, 50, TextGet("KinkyDungeonRandomMode0"), !KinkyDungeonRandomMode ? "#ffffff" : "#888888", ""); - if (MouseInKD("KinkyDungeonRandomMode0")) { - DrawTextFitKD(TextGet("KinkyDungeonRandomModeDesc0"), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - DrawButtonKDEx("KinkyDungeonRandomMode1", (bdata) => { - KinkyDungeonRandomMode = true; - localStorage.setItem("KinkyDungeonRandomMode", KinkyDungeonRandomMode ? "True" : "False"); - return true; - }, true, 1175, 410, 275, 50, TextGet("KinkyDungeonRandomMode1"), KinkyDungeonRandomMode ? "#ffffff" : "#888888", ""); - if (MouseInKD("KinkyDungeonRandomMode1")) { - DrawTextFitKD(TextGet("KinkyDungeonRandomModeDesc1"), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - - DrawTextFitKD(TextGet("KDSaveMode"), 875 - 50, 470 + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - - DrawButtonKDEx("KinkyDungeonSaveMode0", (bdata) => { - KinkyDungeonSaveMode = false; - localStorage.setItem("KinkyDungeonSaveMode", KinkyDungeonSaveMode ? "True" : "False"); - return true; - }, true, 875, 470, 275, 50, TextGet("KinkyDungeonSaveMode0"), !KinkyDungeonSaveMode ? "#ffffff" : "#888888", ""); - if (MouseInKD("KinkyDungeonSaveMode0")) { - DrawTextFitKD(TextGet("KinkyDungeonSaveModeDesc0"), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - DrawButtonKDEx("KinkyDungeonSaveMode1", (bdata) => { - KinkyDungeonSaveMode = true; - localStorage.setItem("KinkyDungeonSaveMode", KinkyDungeonSaveMode ? "True" : "False"); - return true; - }, true, 1175, 470, 275, 50, TextGet("KinkyDungeonSaveMode1"), KinkyDungeonSaveMode ? "#ffffff" : "#888888", ""); - if (MouseInKD("KinkyDungeonSaveMode1")) { - DrawTextFitKD(TextGet("KinkyDungeonSaveModeDesc1"), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - - - DrawTextFitKD(TextGet("KDEasyMode"), 875 - 50, 530 + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - - DrawButtonKDEx("KinkyDungeonEasyMode0", (bdata) => { - KinkyDungeonEasyMode = 0; - localStorage.setItem("KinkyDungeonEasyMode", KinkyDungeonEasyMode ? "True" : "False"); - return true; - }, true, 1075, 530, 175, 50, TextGet("KinkyDungeonEasyMode0"), KinkyDungeonEasyMode == 0 ? "#ffffff" : "#888888", ""); - if (MouseInKD("KinkyDungeonEasyMode0")) { - DrawTextFitKD(TextGet("KinkyDungeonEasyModeDesc0"), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - DrawButtonKDEx("KinkyDungeonEasyMode1", (bdata) => { - KinkyDungeonEasyMode = 1; - localStorage.setItem("KinkyDungeonEasyMode", KinkyDungeonEasyMode ? "True" : "False"); - return true; - }, true, 1275, 530, 175, 50, TextGet("KinkyDungeonEasyMode1"), KinkyDungeonEasyMode == 1 ? "#ffffff" : "#888888", ""); - if (MouseInKD("KinkyDungeonEasyMode1")) { - DrawTextFitKD(TextGet("KinkyDungeonEasyModeDesc1"), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - DrawButtonKDEx("KinkyDungeonEasyMode2", (bdata) => { - KinkyDungeonEasyMode = 2; - localStorage.setItem("KinkyDungeonEasyMode", KinkyDungeonEasyMode ? "True" : "False"); - return true; - }, true, 875, 530, 175, 50, TextGet("KinkyDungeonEasyMode2"), KinkyDungeonEasyMode == 2 ? "#ffffff" : "#888888", ""); - if (MouseInKD("KinkyDungeonEasyMode2")) { - DrawTextFitKD(TextGet("KinkyDungeonEasyModeDesc2"), 1250, 80, 1000, "#ffffff", KDTextGray0); - } - - if (KinkyDungeonSexyMode) { - MainCanvas.textAlign = "left"; - DrawCheckboxKDEx("KinkyDungeonSexyPlugs", (bdata) => { - KinkyDungeonSexyPlug = !KinkyDungeonSexyPlug; - localStorage.setItem("KinkyDungeonSexyPlug", KinkyDungeonSexyPlug ? "True" : "False"); - return true; - }, true, 1500, 350, 64, 64, TextGet("KinkyDungeonSexyPlugs"), KinkyDungeonSexyPlug, false, "#ffffff"); - DrawCheckboxKDEx("KinkyDungeonSexyPiercings", (bdata) => { - KinkyDungeonSexyPiercing = !KinkyDungeonSexyPiercing; - localStorage.setItem("KinkyDungeonSexyPiercing", KinkyDungeonSexyPiercing ? "True" : "False"); - return true; - }, true, 1500, 430, 64, 64, TextGet("KinkyDungeonSexyPiercings"), KinkyDungeonSexyPiercing, false, "#ffffff"); - MainCanvas.textAlign = "center"; - } - - - } else if (KinkyDungeonState == "Stats") { - - let tooltip = KinkyDungeonDrawPerks(false); - DrawTextKD(TextGet("KinkyDungeonStats"), 1000, 30, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonStats2"), 1000, 80, "#ffffff", KDTextGray2); - if (!tooltip) { - let points = KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice); - let hardmode = points >= KDHardModeThresh ? TextGet("KDHardMode") : ""; - DrawTextKD(TextGet("KinkyDungeonStatPoints").replace("AMOUNT", "" + points) + hardmode, 1000, 150, "#ffffff", KDTextGray2); - } - DrawButtonKDEx("KDPerksStart", (bdata) => { - if (KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice) >= 0) { - //KinkyDungeonState = "Diff"; - KDLose = false; - KinkyDungeonStartNewGame(); - } - return true; - }, true, 875, 920, 350, 64, TextGet("KinkyDungeonStartGame"), KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice) >= 0 ? "#ffffff" : "pink", ""); - DrawButtonKDEx("KDPerksBack", (bdata) => { - KinkyDungeonState = "Menu"; - return true; - }, true, 1275, 920, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", ""); - DrawButtonKDEx("KDPerksClear", (bdata) => { - KinkyDungeonStatsChoice = new Map(); - KDUpdatePlugSettings(); - return true; - }, true, 40, 920, 190, 64, TextGet("KinkyDungeonClearAll"), "#ffffff", ""); - DrawButtonKDEx("KDPerkConfig1", (bdata) => { - KinkyDungeonPerksConfig = "1"; - KinkyDungeonLoadStats(); - KDUpdatePlugSettings(); - return true; - }, true, 270, 930, 100, 54, TextGet("KinkyDungeonConfig") + "1", KinkyDungeonPerksConfig == "1" ? "#ffffff" : "#888888", ""); - DrawButtonKDEx("KDPerkConfig2", (bdata) => { - KinkyDungeonPerksConfig = "2"; - KinkyDungeonLoadStats(); - KDUpdatePlugSettings(); - return true; - }, true, 380, 930, 100, 54, TextGet("KinkyDungeonConfig") + "2", KinkyDungeonPerksConfig == "2" ? "#ffffff" : "#888888", ""); - DrawButtonKDEx("KDPerkConfig3", (bdata) => { - KinkyDungeonPerksConfig = "3"; - KinkyDungeonLoadStats(); - KDUpdatePlugSettings(); - return true; - }, true, 490, 930, 100, 54, TextGet("KinkyDungeonConfig") + "3", KinkyDungeonPerksConfig == "3" ? "#ffffff" : "#888888", ""); - - - let TF = KDTextField("PerksFilter", 600, 930, 210, 54, "text", "", "45"); - if (TF.Created) { - TF.Element.oninput = (event) => { - KDPerksFilter = ElementValue("PerksFilter"); - }; - } - DrawTextFitKD(TextGet("KinkyDungeonFilter"), 600 + 210/2, 930 + 54/2, 210, "#aaaaaa"); - - // @ts-ignore - DrawButtonKDEx("copyperks", (bdata) => { - let txt = ""; - for (let k of KinkyDungeonStatsChoice.keys()) { - if (!k.startsWith("arousal") && !k.endsWith("Mode")) txt += (txt ? "\n" : "") + k; - } - navigator.clipboard.writeText(txt); - return true; - }, true, 1850, 930, 140, 54, TextGet("KinkyDungeonCopyPerks"), "#ffffff", ""); - - DrawButtonKDEx("pasteperks", (bdata) => { - navigator.clipboard.readText() - .then(text => { - let list = text.split('\n'); - let changed = 1; - let iter = 0; - while (changed > 0 && iter < 1000) { - changed = 0; - for (let l of list) { - let lp = l.replace('\r','');// List processed - // Find the perk that matches the name - for (let perk of Object.entries(KinkyDungeonStatsPresets)) { - if (perk[0] == lp && KDValidatePerk(perk[1])) { - KinkyDungeonStatsChoice.set(perk[0], true); - changed += 1; - }// else if (KinkyDungeonStatsChoice.get(perk[0])) KinkyDungeonStatsChoice.delete(perk[0]) - } - } - iter += 1; - } - }) - .catch(err => { - console.error('Failed to read clipboard contents: ', err); - }); - return true; - }, true, 1700, 930, 140, 54, TextGet("KinkyDungeonPastePerks"), "#ffffff", ""); - - - if (KinkyDungeonKeybindingCurrentKey && KinkyDungeonGameKeyDown()) { - if (KinkyDungeonKeybindingCurrentKey) - KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime(); - KinkyDungeonKeybindingCurrentKey = ''; - } - } else if (KinkyDungeonState == "Save") { - // Draw temp start screen - DrawTextKD(TextGet("KinkyDungeonSaveIntro0"), 1250, 350, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonSaveIntro"), 1250, 475, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonSaveIntro2"), 1250, 550, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonSaveIntro3"), 1250, 625, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonSaveIntro4"), 1250, 700, "#ffffff", KDTextGray2); - - ElementPosition("saveDataField", 1250, 150, 1000, 230); - - //DrawButtonVis(875, 750, 350, 64, TextGet("KinkyDungeonGameSave"), "#ffffff", ""); - DrawButtonVis(1075, 750, 350, 64, TextGet("KinkyDungeonGameContinue"), "#ffffff", ""); - } else if (KinkyDungeonState == "Game") { - KinkyDungeonGameRunning = true; - KinkyDungeonGameFlag = true; - KinkyDungeonDrawGame(); - if (KinkyDungeonInputQueue.length < 1) { - let _CharacterRefresh = CharacterRefresh; - let _CharacterAppearanceBuildCanvas = CharacterAppearanceBuildCanvas; - // @ts-ignore - CharacterRefresh = () => {KDRefresh = true;}; - // @ts-ignore - CharacterAppearanceBuildCanvas = () => {}; - - - if (KDGameData.SleepTurns > 0) { - if (CommonTime() > KinkyDungeonSleepTime) { - KDGameData.SleepTurns -= 1; - if (KinkyDungeonAggressive()) - KinkyDungeonTotalSleepTurns += 1; - if (KinkyDungeonStatStamina >= KinkyDungeonStatStaminaMax && KinkyDungeonStatWill >= KinkyDungeonStatWillMax) { - KDGameData.SleepTurns = 0; - } - // Decrease offer fatigue - KDIncreaseOfferFatigue(-1); - KDSendInput("tick", {delta: 1, sleep: true}, false, true); - KinkyDungeonSleepTime = CommonTime() + 10; - } - if (KDGameData.SleepTurns == 0) { - KinkyDungeonChangeStamina(0); - KinkyDungeonChangeWill(0); - if (CharacterItemsHavePoseAvailable(KinkyDungeonPlayer, "BodyLower", "Kneel") && !CharacterDoItemsSetPose(KinkyDungeonPlayer, "Kneel") && KinkyDungeonPlayer.IsKneeling()) { - CharacterSetActivePose(KinkyDungeonPlayer, "BaseLower", false); - } - } - } else if (KDGameData.PlaySelfTurns > 0) { - if (CommonTime() > KinkyDungeonSleepTime) { - KDSendInput("tick", {delta: 1}, false, true); - KDGameData.PlaySelfTurns -= 1; - KinkyDungeonSleepTime = CommonTime() + (KinkyDungeonFlags.get("PlayerOrgasm") ? KinkyDungeonOrgasmTime : KinkyDungeonPlaySelfTime) * (0.25 + KDAnimSpeed * 0.75); - } - if (KDGameData.SleepTurns == 0) { - KinkyDungeonChangeStamina(0); - } - } else if (KinkyDungeonStatFreeze > 0) { - if (CommonTime() > KinkyDungeonSleepTime) { - KinkyDungeonStatFreeze -= 1; - KDSendInput("tick", {delta: 1, NoUpdate: false, NoMsgTick: true}, false, true); - KinkyDungeonSleepTime = CommonTime() + KinkyDungeonFreezeTime * (0.25 + KDAnimSpeed * 0.75); - } - } else if (KinkyDungeonSlowMoveTurns > 0) { - if (CommonTime() > KinkyDungeonSleepTime) { - KinkyDungeonSlowMoveTurns -= 1; - KDSendInput("tick", {delta: 1, NoUpdate: false, NoMsgTick: true}, false, true); - KinkyDungeonSleepTime = CommonTime() + 150 * (0.25 + KDAnimSpeed * 0.75); - } - } else if (KinkyDungeonFastMove && KinkyDungeonFastMovePath && KinkyDungeonFastMovePath.length > 0) { - if (CommonTime() > KinkyDungeonSleepTime) { - if (KinkyDungeonFastMovePath.length > 0) { - let next = KinkyDungeonFastMovePath[0]; - KinkyDungeonFastMovePath.splice(0, 1); - if (Math.max(Math.abs(next.x-KinkyDungeonPlayerEntity.x), Math.abs(next.y-KinkyDungeonPlayerEntity.y)) < 1.5) - KDSendInput("move", {dir: {x:next.x-KinkyDungeonPlayerEntity.x, y:next.y-KinkyDungeonPlayerEntity.y}, delta: 1, AllowInteract: true, AutoDoor: KinkyDungeonToggleAutoDoor, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, true); - else KinkyDungeonFastMovePath = []; - } - KinkyDungeonSleepTime = CommonTime() + 100 * (0.25 + KDAnimSpeed * 0.75); - } - } else if (KinkyDungeonFastStruggle && KinkyDungeonFastStruggleType && KinkyDungeonFastStruggleGroup) { - if (CommonTime() > KinkyDungeonSleepTime) { - let result = KDSendInput("struggle", {group: KinkyDungeonFastStruggleGroup, type: KinkyDungeonFastStruggleType}, false, true); - if (result != "Fail" || !KinkyDungeonHasStamina(2.5)) { - KinkyDungeonFastStruggleType = ""; - KinkyDungeonFastStruggleGroup = ""; - } - KinkyDungeonSleepTime = CommonTime() + 250 * (0.25 + KDAnimSpeed * 0.75); - } - } else if (KinkyDungeonAutoWait) { - if (CommonTime() > KinkyDungeonSleepTime) { - let lastStamina = KinkyDungeonStatStamina; - KDSendInput("move", {dir: {x:0, y: 0, delta: 0}, delta: 1, AllowInteract: true, AutoDoor: KinkyDungeonToggleAutoDoor, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, true); - if (KinkyDungeonFastStruggle && KinkyDungeonStatStamina == KinkyDungeonStatStaminaMax && lastStamina < KinkyDungeonStatStamina) { - if (KinkyDungeonTempWait && !KDGameData.KinkyDungeonLeashedPlayer && !KinkyDungeonInDanger()) - KDDisableAutoWait(); - } - KinkyDungeonSleepTime = CommonTime() + (KinkyDungeonFastWait ? 100 : 300); - } - } else if (KinkyDungeonAutoWaitStruggle) { - if (CommonTime() > KinkyDungeonSleepTime) { - //KDSendInput("move", {dir: {x:0, y: 0, delta: 0}, delta: 1, AllowInteract: true, AutoDoor: KinkyDungeonToggleAutoDoor, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, true); - - if (!(KDGameData.DelayedActions?.length > 0)) { - KDHandleAutoStruggle(KinkyDungeonPlayerEntity); - } - if (KinkyDungeonInDanger()) - KDDisableAutoWait(); - KinkyDungeonSleepTime = CommonTime() + (300 + Math.min(1200, KDAutoStruggleData.lastDelay * 270)) * (0.5 + KDAnimSpeed * 0.5); - } - } else KinkyDungeonSleepTime = CommonTime() + 100; - // @ts-ignore - CharacterRefresh = _CharacterRefresh; - // @ts-ignore - CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; - } else KinkyDungeonSleepTime = CommonTime() + 100; - - } else if (KinkyDungeonState == "End") { - KinkyDungeonGameRunning = false; - // Draw temp start screen - DrawTextKD(TextGet("EndWin"), 1250, 400, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("EndWin2"), 1250, 500, "#ffffff", KDTextGray2); - - DrawButtonVis(1075, 650, 350, 64, TextGet("KinkyDungeonNewGamePlus"), "#ffffff", ""); - DrawButtonVis(1075, 750, 350, 64, TextGet("GameReturnToMenu"), "#ffffff", ""); - } else if (KinkyDungeonState == "Keybindings") { - // Draw temp start screen - DrawButtonKDEx("KBBack", () => { - KinkyDungeonKeybindings = KinkyDungeonKeybindingsTemp; - if (KinkyDungeonGameFlag) { - KinkyDungeonState = "Game"; - if (KinkyDungeonKeybindings) { - KDCommitKeybindings(); - } - } else KinkyDungeonState = "Menu"; - localStorage.setItem("KinkyDungeonKeybindings", JSON.stringify(KinkyDungeonKeybindings)); - //ServerAccountUpdate.QueueData({ KinkyDungeonKeybindings: KinkyDungeonKeybindings }); - return true; - }, true, 1450, 780, 350, 64, TextGet("GameReturnToMenu"), "#ffffff", ""); - - // Draw temp start screen - DrawButtonKDEx("KBBack2", () => { - KinkyDungeonKeybindingsTemp = Object.assign({}, KinkyDungeonKeybindingsTemp); - if (KinkyDungeonGameFlag) { - KinkyDungeonState = "Game"; - } else KinkyDungeonState = "Menu"; - //ServerAccountUpdate.QueueData({ KinkyDungeonKeybindings: KinkyDungeonKeybindings }); - return true; - }, true, 1450, 700, 350, 64, TextGet("GameReturnToMenu2"), "#ffffff", ""); - - // Draw key buttons - DrawButtonKDEx("KBUp", () => {KinkyDungeonKeybindingsTemp.Up = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1075, 100, 300, 50, TextGet("KinkyDungeonKeyUp") + ": '" + (KinkyDungeonKeybindingsTemp.Up) + "'", "#ffffff", ""); - DrawButtonKDEx("KBDown", () => {KinkyDungeonKeybindingsTemp.Down = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1075, 160, 300, 50, TextGet("KinkyDungeonKeyDown") + ": '" + (KinkyDungeonKeybindingsTemp.Down) + "'", "#ffffff", ""); - DrawButtonKDEx("KBLeft", () => {KinkyDungeonKeybindingsTemp.Left = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1075, 220, 300, 50, TextGet("KinkyDungeonKeyLeft") + ": '" + (KinkyDungeonKeybindingsTemp.Left) + "'", "#ffffff", ""); - DrawButtonKDEx("KBRight", () => {KinkyDungeonKeybindingsTemp.Right = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1075, 280, 300, 50, TextGet("KinkyDungeonKeyRight") + ": '" + (KinkyDungeonKeybindingsTemp.Right) + "'", "#ffffff", ""); - - DrawButtonKDEx("KBUpLleft", () => {KinkyDungeonKeybindingsTemp.UpLeft = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1075, 340, 300, 50, TextGet("KinkyDungeonKeyUpLeft") + ": '" + (KinkyDungeonKeybindingsTemp.UpLeft) + "'", "#ffffff", ""); - DrawButtonKDEx("KBUpRight", () => {KinkyDungeonKeybindingsTemp.UpRight = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1075, 400, 300, 50, TextGet("KinkyDungeonKeyUpRight") + ": '" + (KinkyDungeonKeybindingsTemp.UpRight) + "'", "#ffffff", ""); - DrawButtonKDEx("KBDownLeft", () => {KinkyDungeonKeybindingsTemp.DownLeft = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1075, 460, 300, 50, TextGet("KinkyDungeonKeyDownLeft") + ": '" + (KinkyDungeonKeybindingsTemp.DownLeft) + "'", "#ffffff", ""); - DrawButtonKDEx("KBDownRight", () => {KinkyDungeonKeybindingsTemp.DownRight = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1075, 520, 300, 50, TextGet("KinkyDungeonKeyDownRight") + ": '" + (KinkyDungeonKeybindingsTemp.DownRight) + "'", "#ffffff", ""); - - DrawButtonKDEx("KBWait", () => {KinkyDungeonKeybindingsTemp.Wait = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1075, 600, 300, 50, TextGet("KinkyDungeonKeyWait") + ": '" + (KinkyDungeonKeybindingsTemp.Wait) + "'", "#ffffff", ""); - - DrawButtonKDEx("KBSpell1", () => {KinkyDungeonKeybindingsTemp.Spell1 = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 100, 300, 50, TextGet("KinkyDungeonKeySpell1") + ": '" + (KinkyDungeonKeybindingsTemp.Spell1) + "'", "#ffffff", ""); - DrawButtonKDEx("KBSpell2", () => {KinkyDungeonKeybindingsTemp.Spell2 = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 160, 300, 50, TextGet("KinkyDungeonKeySpell2") + ": '" + (KinkyDungeonKeybindingsTemp.Spell2) + "'", "#ffffff", ""); - DrawButtonKDEx("KBSpell3", () => {KinkyDungeonKeybindingsTemp.Spell3 = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 220, 300, 50, TextGet("KinkyDungeonKeySpell3") + ": '" + (KinkyDungeonKeybindingsTemp.Spell3) + "'", "#ffffff", ""); - DrawButtonKDEx("KBSpell4", () => {KinkyDungeonKeybindingsTemp.Spell4 = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 280, 300, 50, TextGet("KinkyDungeonKeySpell4") + ": '" + (KinkyDungeonKeybindingsTemp.Spell4) + "'", "#ffffff", ""); - DrawButtonKDEx("KBSpell5", () => {KinkyDungeonKeybindingsTemp.Spell5 = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 340, 300, 50, TextGet("KinkyDungeonKeySpell5") + ": '" + (KinkyDungeonKeybindingsTemp.Spell5) + "'", "#ffffff", ""); - DrawButtonKDEx("KBSpell6", () => {KinkyDungeonKeybindingsTemp.Spell6 = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 400, 300, 50, TextGet("KinkyDungeonKeySpell6") + ": '" + (KinkyDungeonKeybindingsTemp.Spell6) + "'", "#ffffff", ""); - DrawButtonKDEx("KBSpell7", () => {KinkyDungeonKeybindingsTemp.Spell7 = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 460, 300, 50, TextGet("KinkyDungeonKeySpell7") + ": '" + (KinkyDungeonKeybindingsTemp.Spell7) + "'", "#ffffff", ""); - - DrawButtonKDEx("KBSpellPage", () => {KinkyDungeonKeybindingsTemp.SpellPage = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 520, 300, 50, TextGet("KinkyDungeonKeySpellPage") + ": '" + (KinkyDungeonKeybindingsTemp.SpellPage) + "'", "#ffffff", ""); - - DrawButtonKDEx("KBUpcast", () => {KinkyDungeonKeybindingsTemp.Upcast = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 580, 300, 50, TextGet("KinkyDungeonKeyUpcast") + ": '" + (KinkyDungeonKeybindingsTemp.Upcast) + "'", "#ffffff", ""); - DrawButtonKDEx("KBUpcastCancel", () => {KinkyDungeonKeybindingsTemp.UpcastCancel = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 640, 300, 50, TextGet("KinkyDungeonKeyUpcastCancel") + ": '" + (KinkyDungeonKeybindingsTemp.UpcastCancel) + "'", "#ffffff", ""); - - DrawButtonKDEx("KBSwitchWeapon", () => {KinkyDungeonKeybindingsTemp.SwitchWeapon = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 700, 300, 50, TextGet("KinkyDungeonKeySwitchWeapon") + ": '" + (KinkyDungeonKeybindingsTemp.SwitchWeapon) + "'", "#ffffff", ""); - DrawButtonKDEx("KBSpellWeapon", () => {KinkyDungeonKeybindingsTemp.SpellWeapon = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 675, 760, 300, 50, TextGet("KinkyDungeonKeySpellWeapon") + ": '" + (KinkyDungeonKeybindingsTemp.SpellWeapon) + "'", "#ffffff", ""); - - DrawButtonKDEx("KBSkip", () => {KinkyDungeonKeybindingsTemp.Skip = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1075, 680, 300, 50, TextGet("KinkyDungeonKeySkip") + ": '" + (KinkyDungeonKeybindingsTemp.Skip) + "'", "#ffffff", ""); - DrawButtonKDEx("KBEnter", () => {KinkyDungeonKeybindingsTemp.Enter = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1075, 740, 300, 50, TextGet("KinkyDungeonKeyEnter") + ": '" + (KinkyDungeonKeybindingsTemp.Enter) + "'", "#ffffff", ""); - - - DrawButtonKDEx("KBMsgLog", () => {KinkyDungeonKeybindingsTemp.MsgLog = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 100, 300, 38, TextGet("KinkyDungeonKeyMsgLog") + ": '" + (KinkyDungeonKeybindingsTemp.MsgLog) + "'", "#ffffff", ""); - DrawButtonKDEx("KBDoor", () => {KinkyDungeonKeybindingsTemp.Door = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 145, 300, 38, TextGet("KinkyDungeonKeyDoor") + ": '" + (KinkyDungeonKeybindingsTemp.Door) + "'", "#ffffff", ""); - DrawButtonKDEx("KBPass", () => {KinkyDungeonKeybindingsTemp.Pass = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 190, 300, 38, TextGet("KinkyDungeonKeyPass") + ": '" + (KinkyDungeonKeybindingsTemp.Pass) + "'", "#ffffff", ""); - DrawButtonKDEx("KBAStruggle", () => {KinkyDungeonKeybindingsTemp.AStruggle = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 235, 300, 38, TextGet("KinkyDungeonKeyAStruggle") + ": '" + (KinkyDungeonKeybindingsTemp.AStruggle) + "'", "#ffffff", ""); - DrawButtonKDEx("KBAPathfind", () => {KinkyDungeonKeybindingsTemp.APathfind = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 280, 300, 38, TextGet("KinkyDungeonKeyAPathfind") + ": '" + (KinkyDungeonKeybindingsTemp.APathfind) + "'", "#ffffff", ""); - DrawButtonKDEx("KBASprint", () => {KinkyDungeonKeybindingsTemp.Sprint = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 325, 300, 38, TextGet("KinkyDungeonKeySprint") + ": '" + (KinkyDungeonKeybindingsTemp.Sprint) + "'", "#ffffff", ""); - DrawButtonKDEx("KBInspect", () => {KinkyDungeonKeybindingsTemp.AInspect = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 370, 300, 38, TextGet("KinkyDungeonKeyInspect") + ": '" + (KinkyDungeonKeybindingsTemp.AInspect) + "'", "#ffffff", ""); - - DrawButtonKDEx("KBQInventory", () => {KinkyDungeonKeybindingsTemp.QInventory = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 425, 300, 45, TextGet("KinkyDungeonKeyQInventory") + ": '" + (KinkyDungeonKeybindingsTemp.QInventory) + "'", "#ffffff", ""); - DrawButtonKDEx("KBInventory", () => {KinkyDungeonKeybindingsTemp.Inventory = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 475, 300, 45, TextGet("KinkyDungeonKeyInventory") + ": '" + (KinkyDungeonKeybindingsTemp.Inventory) + "'", "#ffffff", ""); - DrawButtonKDEx("KBReputation", () => {KinkyDungeonKeybindingsTemp.Reputation = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 525, 300, 45, TextGet("KinkyDungeonKeyReputation") + ": '" + (KinkyDungeonKeybindingsTemp.Reputation) + "'", "#ffffff", ""); - DrawButtonKDEx("KBMagic", () => {KinkyDungeonKeybindingsTemp.Magic = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 575, 300, 45, TextGet("KinkyDungeonKeyMagic") + ": '" + (KinkyDungeonKeybindingsTemp.Magic) + "'", "#ffffff", ""); - DrawButtonKDEx("KBLog", () => {KinkyDungeonKeybindingsTemp.Log = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', - 1475, 625, 300, 45, TextGet("KinkyDungeonKeyLog") + ": '" + (KinkyDungeonKeybindingsTemp.Log) + "'", "#ffffff", ""); - - if (KinkyDungeonKeybindingCurrentKey) - DrawTextKD(TextGet("KinkyDungeonCurrentPress") + ": '" + (KinkyDungeonKeybindingCurrentKey) + "'", 1250, 900, "#ffffff", KDTextGray2); - - DrawTextKD(TextGet("KinkyDungeonCurrentPressInfo"), 1250, 950, "#ffffff", KDTextGray2); - } else if (KinkyDungeonState == "Toggles") { - - let XX = 840; - let YYstart = 200; - let YYmax = 680; - let YY = YYstart; - let YYd = 70; - let XXd = 400; - let toggles = Object.keys(KDToggles); - MainCanvas.textAlign = "left"; - for (let toggle of toggles) { - // Draw temp start screen - DrawCheckboxKDEx("toggle" + toggle, () => { - KDToggles[toggle] = !KDToggles[toggle]; - KDSaveToggles(); - return true; - }, true, XX, YY, 64, 64, TextGet("KDToggle" + toggle), KDToggles[toggle], false, "#ffffff", undefined, { - maxWidth: 300, - }); - - YY += YYd; - if (YY > YYmax) { - YY = YYstart; - XX += XXd; - } - } - MainCanvas.textAlign = "center"; - - YY = YYstart; - - DrawBackNextButtonVis(450, YY, 350, 64, TextGet("KDVibeVolume") + " " + (KDVibeVolume * 100 + "%"), "#ffffff", "", - () => KDVibeVolumeList[(KDVibeVolumeListIndex + KDVibeVolumeList.length - 1) % KDVibeVolumeList.length] * 100 + "%", - () => KDVibeVolumeList[(KDVibeVolumeListIndex + 1) % KDVibeVolumeList.length] * 100 + "%"); - YY += YYd; - DrawBackNextButtonVis(450, YY, 350, 64, TextGet("KDMusicVolume") + " " + (KDMusicVolume * 100 + "%"), "#ffffff", "", - () => KDMusicVolumeList[(KDMusicVolumeListIndex + KDMusicVolumeList.length - 1) % KDMusicVolumeList.length] * 100 + "%", - () => KDMusicVolumeList[(KDMusicVolumeListIndex + 1) % KDMusicVolumeList.length] * 100 + "%"); - YY += YYd; - DrawBackNextButtonVis(450, YY, 350, 64, TextGet("KDSfxVolume") + " " + (KDSfxVolume * 100 + "%"), "#ffffff", "", - () => KDSfxVolumeList[(KDSfxVolumeListIndex + KDSfxVolumeList.length - 1) % KDSfxVolumeList.length] * 100 + "%", - () => KDSfxVolumeList[(KDSfxVolumeListIndex + 1) % KDSfxVolumeList.length] * 100 + "%"); - YY += YYd; - DrawBackNextButtonVis(450, YY, 350, 64, TextGet("KDAnimSpeed") + " " + (KDAnimSpeed * 100 + "%"), "#ffffff", "", - () => KDAnimSpeedList[(KDAnimSpeedListIndex + KDAnimSpeedList.length - 1) % KDAnimSpeedList.length] * 100 + "%", - () => KDAnimSpeedList[(KDAnimSpeedListIndex + 1) % KDAnimSpeedList.length] * 100 + "%"); - YY += YYd; - - - - - DrawButtonKDEx("KBBackOptions", () => { - KinkyDungeonKeybindingsTemp = Object.assign({}, KinkyDungeonKeybindingsTemp); - if (KinkyDungeonGameFlag) { - KinkyDungeonState = "Game"; - } else KinkyDungeonState = "Menu"; - //ServerAccountUpdate.QueueData({ KinkyDungeonKeybindings: KinkyDungeonKeybindings }); - return true; - }, true, 975, 780, 550, 64, TextGet("GameReturnToMenuFromOptions"), "#ffffff", ""); - - } - - // Cull temp elements - KDCullTempElements(); - - //if (KDDebugMode) { - //DrawTextKD(dispfps, 20, 20, "#ffffff", undefined, undefined, "left"); - //} - // Cull the sprites that werent rendered or updated this frame - for (let sprite of kdpixisprites.entries()) { - if (!kdSpritesDrawn.has(sprite[0])) { - sprite[1].parent.removeChild(sprite[1]); - if (kdprimitiveparams.has(sprite[0])) kdprimitiveparams.delete(sprite[0]); - kdpixisprites.delete(sprite[0]); - sprite[1].destroy(); - } - } - - if (!pixiview) pixiview = document.getElementById("MainCanvas"); - if (!pixirenderer) { - if (pixiview) { - // @ts-ignore - pixirenderer = new PIXI.CanvasRenderer({ - // @ts-ignore - width: pixiview.width, - // @ts-ignore - height: pixiview.height, - view: pixiview, - antialias: true, - }); - } - } - - let delta = performance.now() - lastfps; - fpscounter++; - if (fpscounter > 10) { - fpscounter = 0; - dispfps = Math.round(10 * 1000 / Math.max(delta, 1)); - - } - lastfps = performance.now(); - KDUpdateParticles(delta); - - // Draw the context layer even if we haven't updated it - if (pixirenderer) { - pixirenderer.render(kdcanvas, { - clear: false, - }); - pixirenderer.render(kdui, { - clear: false, - }); - } - - MainCanvas.textBaseline = "middle"; - - KDLastButtonsCache = {}; -} - -/** - * @type {Record boolean}>} - */ -let KDButtonsCache = { - -}; -/** - * @type {Record boolean}>} - */ -let KDLastButtonsCache = { - -}; - - -/** - * Draws a button component - * @param {string} name - Name of the button element - * @param {boolean} enabled - Whether or not you can click on it - * @param {number} Left - Position of the component from the left of the canvas - * @param {number} Top - Position of the component from the top of the canvas - * @param {number} Width - Width of the component - * @param {number} Height - Height of the component - * @param {string} Label - Text to display in the button - * @param {string} Color - Color of the component - * @param {string} [Image] - URL of the image to draw inside the button, if applicable - * @param {string} [HoveringText] - Text of the tooltip, if applicable - * @param {boolean} [Disabled] - Disables the hovering options if set to true - * @param {boolean} [NoBorder] - Disables the border and stuff - * @returns {void} - Nothing - */ -function DrawButtonKD(name, enabled, Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder) { - DrawButtonVis(Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder); - KDButtonsCache[name] = { - Left, - Top, - Width, - Height, - enabled, - }; -} - - -/** - * Draws a button component - * @param {string} name - Name of the button element - * @param {(bdata: any) => boolean} func - Whether or not you can click on it - * @param {boolean} enabled - Whether or not you can click on it - * @param {number} Left - Position of the component from the left of the canvas - * @param {number} Top - Position of the component from the top of the canvas - * @param {number} Width - Width of the component - * @param {number} Height - Height of the component - * @param {string} Label - Text to display in the button - * @param {string} Color - Color of the component - * @param {string} [Image] - URL of the image to draw inside the button, if applicable - * @param {string} [HoveringText] - Text of the tooltip, if applicable - * @param {boolean} [Disabled] - Disables the hovering options if set to true - * @param {boolean} [NoBorder] - Disables border - * @param {string} [FillColor] - BG color - * @param {number} [FontSize] - Font size - * @param {boolean} [ShiftText] - Shift text to make room for the button - * @param {object} [options] - Additional options - * @param {boolean} [options.noTextBG] - Dont show text backgrounds - * @param {number} [options.alpha] - Dont show text backgrounds - * @param {number} [options.zIndex] - zIndex - * @returns {void} - Nothing - */ -function DrawButtonKDEx(name, func, enabled, Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, options) { - DrawButtonVis(Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, undefined, options?.zIndex, options); - KDButtonsCache[name] = { - Left, - Top, - Width, - Height, - enabled, - func, - }; -} - -function KDProcessButtons() { - for (let button of Object.entries(KDButtonsCache)) { - if (button[1].enabled && button[1].func) { - if (MouseInKD(button[0])) { - return button[1].func(); - } - } - } - return false; -} - -/** - * Buttons are clickable one frame later, please factor this in to UI design (especially when enforcing validation) - * @param {string} name - * @returns {boolean} - */ -function KDClickButton(name) { - let button = KDButtonsCache[name] || KDLastButtonsCache[name]; - if (button && button.enabled) { - return button.func(); - } - return false; -} - -function MouseInKD(name) { - let button = KDButtonsCache[name]; - if (button && button.enabled) { - return MouseIn(button.Left, button.Top, button.Width, button.Height); - } - return false; -} - -function KinkyDungeonGetTraitsCount() { - return Array.from(KinkyDungeonStatsChoice.keys()).filter((element) => {return !element.includes('arousalMode');}).length; -} - -function KDSendTrait(trait) { - // @ts-ignore - if (window.dataLayer) - // @ts-ignore - window.dataLayer.push({ - 'event':'trait', - 'traitType':trait, - 'journey':KDJourney, - }); -} - -function KDSendSpell(spell) { - // @ts-ignore - if (window.dataLayer) - // @ts-ignore - window.dataLayer.push({ - 'event':'spell', - 'spellType':spell, - 'currentLevel':MiniGameKinkyDungeonLevel, - 'currentCheckpoint':MiniGameKinkyDungeonCheckpoint, - 'journey':KDJourney, - }); -} - -function KDSendSpellCast(spell) { - // @ts-ignore - if (window.dataLayer) - // @ts-ignore - window.dataLayer.push({ - 'event':'spellCast', - 'spellType':spell, - 'currentLevel':MiniGameKinkyDungeonLevel, - 'currentCheckpoint':MiniGameKinkyDungeonCheckpoint, - 'journey':KDJourney, - }); -} -function KDSendWeapon(weapon) { - // @ts-ignore - if (window.dataLayer) - // @ts-ignore - window.dataLayer.push({ - 'event':'weapon', - 'weapon':weapon, - 'currentLevel':MiniGameKinkyDungeonLevel, - 'currentCheckpoint':MiniGameKinkyDungeonCheckpoint, - 'journey':KDJourney, - }); -} - -function KDSendStatus(type, data, data2) { - // @ts-ignore - if (window.dataLayer && !KDOptOut) { - // @ts-ignore - window.dataLayer.push({ - 'event':'gameStatus', - 'currentLevel':MiniGameKinkyDungeonLevel, - 'currentCheckpoint':MiniGameKinkyDungeonCheckpoint, - 'difficulty':KinkyDungeonStatsChoice.get("randomMode"), - 'newgameplus':KinkyDungeonNewGame, - 'statusType':type, - 'aroused':KinkyDungeonStatsChoice.get("arousalMode") ? 'yes' : 'no', - 'traitscount':KinkyDungeonGetTraitsCount(), - 'gold':Math.round(KinkyDungeonGold / 100) * 100, - 'spellType': type == 'learnspell' ? data : undefined, - 'goddess': type == 'goddess' ? data : undefined, - 'helpType': type == 'goddess' ? data2 : undefined, - 'restraint': (type == 'escape' || type == 'bound') ? data : undefined, - 'method': type == 'escape' ? data2 : undefined, - 'attacker': type == 'bound' ? data2 : undefined, - 'prisonerstate': KDGameData.PrisonerState, - }); - if (type == 'nextLevel' && !KinkyDungeonStatsChoice.get("randomMode")) { - for (let s of KinkyDungeonSpells) { - KDSendSpell(s.name); - } - KDSendWeapon((KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.name) ? KinkyDungeonPlayerDamage.name : 'unarmed'); - } - } -} -function KDSendEvent(type) { - // @ts-ignore - if (window.dataLayer && !KDOptOut) - if (type == 'newGame') { - // @ts-ignore - window.dataLayer.push({ - 'event':type, - 'aroused':KinkyDungeonStatsChoice.get("arousalMode") ? 'yes' : 'no', - 'traitscount':KinkyDungeonGetTraitsCount(), - 'journey':KDJourney, - }); - for (let s of KinkyDungeonStatsChoice.keys()) { - if (KinkyDungeonStatsChoice.get(s)) - KDSendTrait(s); - } - } else if (type == 'jail') { - // @ts-ignore - window.dataLayer.push({ - 'event':type, - 'currentLevel':MiniGameKinkyDungeonLevel, - 'alreadyInJail':KinkyDungeonInJail(KDJailFilters) ? 'true' : 'false', - 'currentCheckpoint':MiniGameKinkyDungeonCheckpoint, - 'difficulty':KinkyDungeonStatsChoice.get("randomMode"), - 'newgameplus':KinkyDungeonNewGame, - 'aroused':KinkyDungeonStatsChoice.get("arousalMode") ? 'yes' : 'no', - 'traitscount':KinkyDungeonGetTraitsCount(), - 'gold':Math.round(KinkyDungeonGold / 100) * 100, - 'journey':KDJourney, - }); - } else if (type == 'loadGame') { - // @ts-ignore - window.dataLayer.push({ - 'event':type, - 'currentLevel':MiniGameKinkyDungeonLevel, - 'currentCheckpoint':MiniGameKinkyDungeonCheckpoint, - 'difficulty':KinkyDungeonStatsChoice.get("randomMode"), - 'newgameplus':KinkyDungeonNewGame, - 'aroused':KinkyDungeonStatsChoice.get("arousalMode") ? 'yes' : 'no', - 'traitscount':KinkyDungeonGetTraitsCount(), - 'gold':Math.round(KinkyDungeonGold / 100) * 100, - 'journey':KDJourney, - }); - } else if (type == 'patreon') { - // @ts-ignore - window.dataLayer.push({ - 'event':type, - }); - } else if (type == 'optout' || type == 'optin') { - // @ts-ignore - window.dataLayer.push({ - 'event':type, - }); - } -} - -function KinkyDungeonLoadStats() { - KinkyDungeonStatsChoice = new Map(); - let statsChoice = localStorage.getItem('KinkyDungeonStatsChoice' + KinkyDungeonPerksConfig); - if (statsChoice) { - let statsArray = JSON.parse(statsChoice); - if (statsArray) { - for (let s of statsArray) { - if (!s.includes('arousalMode') && KinkyDungeonStatsPresets[s] && KDValidatePerk(KinkyDungeonStatsPresets[s])) - KinkyDungeonStatsChoice.set(s, true); - } - } - } -} - -let KinkyDungeonReplaceConfirm = 0; -let KinkyDungeonGameFlag = false; - -let KDDefaultJourney = ["grv", "cat", "jng", "tmp", "bel"]; -let KDDefaultAlt = ["tmb", "lib", "cry", "ore", "bel"]; - -function KDInitializeJourney(Journey) { - /** - * @type {Record} - */ - let newIndex = {}; - - for (let map of KDDefaultJourney) { - newIndex[map] = map; - } - for (let map of KDDefaultAlt) { - newIndex[map] = map; - } - - if (Journey) - KDGameData.Journey = Journey; - // Option to shuffle the dungeon types besides the initial one (graveyard) - if (KDGameData.Journey == "Random") { - /* Randomize array in-place using Durstenfeld shuffle algorithm */ - // https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array - let randList = Array.from(Object.keys(newIndex)); - for (let i = randList.length - 1; i >= 0; i--) { - let j = Math.floor(KDRandom() * (i + 1)); - let temp = randList[i]; - randList[i] = randList[j]; - randList[j] = temp; - } - let ii = 0; - for (let index of Object.keys(newIndex)) { - newIndex[index] = randList[ii]; - ii++; - } - - } else if (KDGameData.Journey == "Harder") { - for (let i = 0; i < KDDefaultJourney.length; i++) { - newIndex[KDDefaultAlt[i]] = KDDefaultJourney[i]; - newIndex[KDDefaultJourney[i]] = KDDefaultAlt[i]; - } - } else if (KDGameData.Journey == "Explorer") { - newIndex.grv = 'jng'; - newIndex.tmb = 'cry'; - newIndex.cat = 'grv'; - newIndex.lib = 'cat'; - newIndex.jng = 'tmp'; - newIndex.cry = 'lib'; - newIndex.tmp = 'ore'; - newIndex.ore = 'tmb'; - newIndex.bel = 'bel'; - } else if (KDGameData.Journey == "Doll") { - newIndex.grv = 'tmp'; - newIndex.tmb = 'bel'; - newIndex.cat = 'bel'; - newIndex.lib = 'ore'; - newIndex.jng = 'bel'; - newIndex.cry = 'lib'; - newIndex.tmp = 'cry'; - newIndex.ore = 'tmb'; - newIndex.bel = 'cat'; - } else if (KDGameData.Journey == "Test") { - newIndex.grv = 'bel'; - newIndex.tmb = 'bel'; - } - - KinkyDungeonMapIndex = newIndex; -} - - - -function KDCommitKeybindings() { - KinkyDungeonKey = [KinkyDungeonKeybindings.Up, KinkyDungeonKeybindings.Left, KinkyDungeonKeybindings.Down, KinkyDungeonKeybindings.Right, KinkyDungeonKeybindings.UpLeft, KinkyDungeonKeybindings.UpRight, KinkyDungeonKeybindings.DownLeft, KinkyDungeonKeybindings.DownRight]; // WASD - KinkyDungeonGameKey.KEY_UP = (KinkyDungeonKeybindings.Up); - KinkyDungeonGameKey.KEY_DOWN = (KinkyDungeonKeybindings.Down); - KinkyDungeonGameKey.KEY_LEFT = (KinkyDungeonKeybindings.Left); - KinkyDungeonGameKey.KEY_RIGHT = (KinkyDungeonKeybindings.Right); - KinkyDungeonGameKey.KEY_UPLEFT = (KinkyDungeonKeybindings.UpLeft); - KinkyDungeonGameKey.KEY_DOWNLEFT = (KinkyDungeonKeybindings.DownLeft); - KinkyDungeonGameKey.KEY_UPRIGHT = (KinkyDungeonKeybindings.UpRight); - KinkyDungeonGameKey.KEY_DOWNRIGHT = (KinkyDungeonKeybindings.DownRight); - - //let KinkyDungeonKeyNumpad = [56, 52, 50, 54, 55, 57, 49, 51]; // Numpad - KinkyDungeonKeySpell = [ - KinkyDungeonKeybindings.Spell1, - KinkyDungeonKeybindings.Spell2, - KinkyDungeonKeybindings.Spell3, - KinkyDungeonKeybindings.Spell4, - KinkyDungeonKeybindings.Spell5, - KinkyDungeonKeybindings.Spell6, - KinkyDungeonKeybindings.Spell7, - ]; // ! @ # - KinkyDungeonKeyWait = [KinkyDungeonKeybindings.Wait]; - KinkyDungeonKeySkip = [KinkyDungeonKeybindings.Skip]; - KinkyDungeonKeyUpcast = [KinkyDungeonKeybindings.Upcast, KinkyDungeonKeybindings.UpcastCancel]; - KinkyDungeonKeyWeapon = [KinkyDungeonKeybindings.SpellWeapon]; // 8 (57) - KinkyDungeonKeyMenu = [ - KinkyDungeonKeybindings.QInventory, - KinkyDungeonKeybindings.Inventory, - KinkyDungeonKeybindings.Reputation, - KinkyDungeonKeybindings.Magic, - KinkyDungeonKeybindings.Log, - ]; - KinkyDungeonKeyToggle = [ - KinkyDungeonKeybindings.MsgLog, - KinkyDungeonKeybindings.Pass, - KinkyDungeonKeybindings.Door, - KinkyDungeonKeybindings.AStruggle, - KinkyDungeonKeybindings.APathfind, - KinkyDungeonKeybindings.AInspect, - ]; - - KinkyDungeonKeyEnter = [KinkyDungeonKeybindings.Enter]; - KinkyDungeonKeySpellPage = [KinkyDungeonKeybindings.SpellPage]; - KinkyDungeonKeySwitchWeapon = [KinkyDungeonKeybindings.SwitchWeapon]; - KinkyDungeonKeySprint = [KinkyDungeonKeybindings.Sprint]; - - KinkyDungeonGameKey.KEY_WAIT = (KinkyDungeonKeybindings.Wait); - KinkyDungeonGameKey.KEY_SKIP = (KinkyDungeonKeybindings.Skip); -} - -let afterLoaded = false; - -/** - * Dummy function. You can modify this function as part of your mod like so: - * function _KDModsAfterLoad = KDModsAfterLoad; - * KDModsAfterLoad = () => { - * [Your stuff here] - * _KDModsAfterLoad(); - * } - */ -function KDModsAfterLoad() { - // Meep -} - -function KinkyDungeonStartNewGame(Load) { - KinkyDungeonNewGame = 0; - let cp = KinkyDungeonMapIndex.grv; - KinkyDungeonInitialize(1, Load); - MiniGameKinkyDungeonCheckpoint = "grv"; - KinkyDungeonGrid = ""; - if (Load) { - KinkyDungeonLoadGame(); - KDSendEvent('loadGame'); - } else { - KDSendEvent('newGame'); - KDGameData.RoomType = KinkyDungeonStatsChoice.get("easyMode") ? "ShopStart" : "JourneyFloor"; - MiniGameKinkyDungeonLevel = 0; - KDInitializeJourney(""); - if (KDTileToTest) { - KinkyDungeonMapIndex.grv = cp; - } - } - if (!KinkyDungeonGrid) - KinkyDungeonCreateMap(KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]], MiniGameKinkyDungeonLevel, false, Load); - KinkyDungeonState = "Game"; - - if (KinkyDungeonKeybindings) { - KDCommitKeybindings(); - } - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/StoneDoor_Close.ogg"); -} - -function KDUpdatePlugSettings() { - KinkyDungeonStatsChoice.set("arousalMode", KinkyDungeonSexyMode ? true : undefined); - KinkyDungeonStatsChoice.set("arousalModePlug", KinkyDungeonSexyPlug ? true : undefined); - KinkyDungeonStatsChoice.set("arousalModePiercing", KinkyDungeonSexyPiercing ? true : undefined); - - KinkyDungeonStatsChoice.set("randomMode", KinkyDungeonRandomMode ? true : undefined); - KinkyDungeonStatsChoice.set("saveMode", KinkyDungeonSaveMode ? true : undefined); - KinkyDungeonStatsChoice.set("easyMode", KinkyDungeonEasyMode == 1 ? true : undefined); - KinkyDungeonStatsChoice.set("norescueMode", KinkyDungeonEasyMode == 2 ? true : undefined); - - - if (KDClassReqs[KinkyDungeonClassMode] && !KDClassReqs[KinkyDungeonClassMode]()) { - // disable the class if we don't meet its requirements - KinkyDungeonClassMode = "Peasant"; - } - let classCount = Object.keys(KDClassStart).length; - for (let i = 0; i < classCount; i++) { - KinkyDungeonStatsChoice.set("classMode", KinkyDungeonClassMode == Object.keys(KDClassStart)[i] ? true : undefined); - } - let points = KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice); - KinkyDungeonStatsChoice.set("hardMode", points >= KDHardModeThresh ? true : undefined); - -} - -let KDHardModeThresh = 10; - -function KinkyDungeonHandleClick() { - if (KDProcessButtons()) return true; - - if (MouseIn(1885, 25, 90, 90) && (ServerURL != "foobar")) { - ElementRemove("saveDataField"); - ElementRemove("saveInputField"); - KinkyDungeonExit(); - return true; - } - if (KinkyDungeonState == "Credits") { - if (MouseIn(1870, 930, 110, 64)) { - KinkyDungeonState = "Menu"; - return true; - } - if (MouseIn(1730, 930, 110, 64)) { - if (KinkyDungeonCreditsPos < 1) KinkyDungeonCreditsPos += 1; - else KinkyDungeonCreditsPos = 0; - } - } if (KinkyDungeonState == "Patrons") { - if (MouseIn(1870, 930, 110, 64)) { - KinkyDungeonState = "Menu"; - return true; - } - if (MouseIn(1730, 930, 110, 64)) { - if (KinkyDungeonPatronPos < 1) KinkyDungeonPatronPos += 1; - else KinkyDungeonPatronPos = 0; - } - } else if (KinkyDungeonState == "Journey") { - if (MouseIn(875, 350, 750, 64)) { - KDJourney = ""; - KinkyDungeonState = "Stats"; - return true; - } else if (MouseIn(875, 450, 750, 64)) { - KDJourney = "Random"; - KinkyDungeonState = "Stats"; - return true; - } else if (MouseIn(875, 550, 750, 64)) { - KDJourney = "Harder"; - KinkyDungeonState = "Stats"; - return true; - } else if (MouseIn(1075, 850, 350, 64)) { - KinkyDungeonState = "Menu"; - return true; - } - } else if (KinkyDungeonState == "Diff") { - - KDUpdatePlugSettings(); - if (MouseIn(1075, 850, 350, 64)) { - KinkyDungeonState = "Menu"; - return true; - } - } else if (KinkyDungeonState == "Stats") { - - // Removed and moved to DrawButtonKDEx - } else if (KinkyDungeonState == "TileEditor") { - KDHandleTileEditor(); - } else if (KinkyDungeonState == "Load"){ - if (MouseIn(875, 750, 350, 64)) { - KinkyDungeonNewGame = 0; - KinkyDungeonGrid = ""; - KinkyDungeonInitialize(1, true); - MiniGameKinkyDungeonCheckpoint = "grv"; - if (KinkyDungeonLoadGame(ElementValue("saveInputField"))) { - KDSendEvent('loadGame'); - //KDInitializeJourney(KDJourney); - if (KinkyDungeonGrid == "") KinkyDungeonCreateMap(KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]], MiniGameKinkyDungeonLevel, false, true); - ElementRemove("saveInputField"); - KinkyDungeonState = "Game"; - - if (KinkyDungeonKeybindings) { - KDCommitKeybindings(); - } - } - return true; - } else if (MouseIn(1275, 750, 350, 64)) { - KinkyDungeonState = "Menu"; - ElementRemove("saveInputField"); - return true; - } - } else if (KinkyDungeonState == "LoadOutfit"){ - if (MouseIn(875, 750, 350, 64)) { - // Save outfit - let appearance = LZString.decompressFromBase64(ElementValue("saveInputField")); - let origAppearance = KinkyDungeonPlayer.Appearance; - if (appearance) { - try { - CharacterAppearanceRestore(KinkyDungeonPlayer, appearance); - CharacterRefresh(KinkyDungeonPlayer); - } catch (e) { - // If we fail, it might be a BCX code. try it! - KinkyDungeonPlayer.Appearance = origAppearance; - } - KDInitProtectedGroups(); - localStorage.setItem("kinkydungeonappearance", LZString.compressToBase64(CharacterAppearanceStringify(KinkyDungeonPlayer))); - - KinkyDungeonDressSet(); - } - // Return to menu - KinkyDungeonState = "Menu"; - KinkyDungeonNewDress = true; - ElementRemove("saveInputField"); - return true; - } else if (MouseIn(1275, 750, 350, 64)) { - // Restore the original outfit - if (KDOriginalValue) { - CharacterAppearanceRestore(KinkyDungeonPlayer, LZString.decompressFromBase64(KDOriginalValue)); - CharacterRefresh(KinkyDungeonPlayer); - KDInitProtectedGroups(); - } - - - KinkyDungeonState = "Menu"; - ElementRemove("saveInputField"); - return true; - } - } else if (KinkyDungeonState == "Consent") { - if (MouseIn(975, 720, 450, 64)) { - KinkyDungeonState = "Menu"; - KDSendEvent('optin'); - - CharacterReleaseTotal(KinkyDungeonPlayer); - KinkyDungeonDressSet(); - CharacterNaked(KinkyDungeonPlayer); - KinkyDungeonInitializeDresses(); - KinkyDungeonDressPlayer(); - KDInitProtectedGroups(); - CharacterRefresh(KinkyDungeonPlayer); - - return true; - } else if (MouseIn(975, 820, 450, 64)) { - KDSendEvent('optout'); - KDOptOut = true; - KinkyDungeonState = "Menu"; - - CharacterReleaseTotal(KinkyDungeonPlayer); - KinkyDungeonDressSet(); - CharacterNaked(KinkyDungeonPlayer); - KinkyDungeonInitializeDresses(); - KinkyDungeonDressPlayer(); - KDInitProtectedGroups(); - CharacterRefresh(KinkyDungeonPlayer); - - return true; - } - } else if (KinkyDungeonState == "Menu" || KinkyDungeonState == "Lose") { - - if (MouseIn(600, 100, 64, 64)) { - KDToggles.Sound = !KDToggles.Sound; - KDSaveToggles(); - } - - if (MouseIn(1700, 874, 280, 50)) { - let langIndex = KDLanguages.indexOf(localStorage.getItem("BondageClubLanguage")) || 0; - let newIndex = (langIndex + 1) % KDLanguages.length; - localStorage.setItem("BondageClubLanguage", KDLanguages[newIndex]); - KDRestart = true; - return true; - } - - - if (MouseIn(590, 930, 150, 64)) { - KinkyDungeonState = "LoadOutfit"; - - KDOriginalValue = LZString.compressToBase64(CharacterAppearanceStringify(KinkyDungeonPlayer)); - CharacterReleaseTotal(KinkyDungeonPlayer); - ElementCreateTextArea("saveInputField"); - ElementValue("saveInputField", LZString.compressToBase64(CharacterAppearanceStringify(KinkyDungeonPlayer))); - return true; - } else if (MouseIn(25, 942, 325, 50)) { - //if (KinkyDungeonState == "Lose") { - KinkyDungeonState = "Menu"; - let appearance = LZString.decompressFromBase64(localStorage.getItem("kinkydungeonappearance")); - if (appearance) { - CharacterAppearanceRestore(KinkyDungeonPlayer, appearance); - CharacterRefresh(KinkyDungeonPlayer); - } - //} - // @ts-ignore - KinkyDungeonPlayer.OnlineSharedSettings = {AllowFullWardrobeAccess: true}; - KinkyDungeonNewDress = true; - if (ServerURL == "foobar") { - // Give all of the items - for (let A = 0; A < Asset.length; A++) - if ((Asset[A] != null) && (Asset[A].Group != null) && !InventoryAvailable(Player, Asset[A].Name, Asset[A].Group.Name)) - InventoryAdd(Player, Asset[A].Name, Asset[A].Group.Name); - } - CharacterReleaseTotal(KinkyDungeonPlayer); - KinkyDungeonCheckClothesLoss = true; - KinkyDungeonDressPlayer(); - // @ts-ignore - KinkyDungeonPlayer.OnlineSharedSettings = {BlockBodyCosplay: false, AllowFullWardrobeAccess: true}; - CharacterAppearanceLoadCharacter(KinkyDungeonPlayer); - KinkyDungeonConfigAppearance = true; - return true; - } else if (MouseIn(360, 930, 220, 64)) { - if (KinkyDungeonReplaceConfirm > 0) { - KinkyDungeonDresses.Default = KinkyDungeonDefaultDefaultDress; - CharacterAppearanceRestore(KinkyDungeonPlayer, CharacterAppearanceStringify(KinkyDungeonPlayerCharacter ? KinkyDungeonPlayerCharacter : Player)); - CharacterReleaseTotal(KinkyDungeonPlayer); - KinkyDungeonSetDress("Default", "Default"); - KinkyDungeonDressPlayer(); - KDInitProtectedGroups(); - KinkyDungeonConfigAppearance = true; - return true; - } else { - KinkyDungeonReplaceConfirm = 2; - return true; - } - } else if (MouseIn(1850, 930, 135, 64)) { - KinkyDungeonState = "Credits"; - return true; - } - if (MouseIn(1700, 930, 135, 64)) { - KinkyDungeonState = "Patrons"; - return true; - } - } else if (KinkyDungeonState == "Save") { - if (!KinkyDungeonIsPlayer()) KinkyDungeonState = "Game"; - if (MouseIn(875, 750, 350, 64)) { - KinkyDungeonState = "Game"; - ElementRemove("saveDataField"); - return true; - } else if (MouseIn(1275, 750, 350, 64)) { - KinkyDungeonState = "Game"; - ElementRemove("saveDataField"); - return true; - } - } else if (KinkyDungeonState == "Game") { - if (KinkyDungeonIsPlayer()) KinkyDungeonClickGame(); - } else if (KinkyDungeonState == "Keybindings") { - // Replaced by DrawButtonKDEx - } else if (KinkyDungeonState == "Toggles") { - let YYstart = 200; - let YY = YYstart; - let YYd = 70; - - YY = YYstart; - - - if (MouseIn(450, YY, 350, 64)) { - if (MouseX <= 450 + 350/2) KDVibeVolumeListIndex = (KDVibeVolumeList.length + KDVibeVolumeListIndex - 1) % KDVibeVolumeList.length; - else KDVibeVolumeListIndex = (KDVibeVolumeListIndex + 1) % KDVibeVolumeList.length; - KDVibeVolume = KDVibeVolumeList[KDVibeVolumeListIndex]; - localStorage.setItem("KDVibeVolume", "" + KDVibeVolumeListIndex); - } - YY += YYd; - if (MouseIn(450, YY, 350, 64)) { - if (MouseX <= 450 + 350/2) KDMusicVolumeListIndex = (KDMusicVolumeList.length + KDMusicVolumeListIndex - 1) % KDMusicVolumeList.length; - else KDMusicVolumeListIndex = (KDMusicVolumeListIndex + 1) % KDMusicVolumeList.length; - KDMusicVolume = KDMusicVolumeList[KDMusicVolumeListIndex]; - localStorage.setItem("KDMusicVolume", "" + KDMusicVolumeListIndex); - } - YY += YYd; - if (MouseIn(450, YY, 350, 64)) { - if (MouseX <= 450 + 350/2) KDSfxVolumeListIndex = (KDSfxVolumeList.length + KDSfxVolumeListIndex - 1) % KDSfxVolumeList.length; - else KDSfxVolumeListIndex = (KDSfxVolumeListIndex + 1) % KDSfxVolumeList.length; - KDSfxVolume = KDSfxVolumeList[KDSfxVolumeListIndex]; - localStorage.setItem("KDSfxVolume", "" + KDSfxVolumeListIndex); - } - YY += YYd; - if (MouseIn(450, YY, 350, 64)) { - if (MouseX <= 450 + 350/2) KDAnimSpeedListIndex = (KDAnimSpeedList.length + KDAnimSpeedListIndex - 1) % KDAnimSpeedList.length; - else KDAnimSpeedListIndex = (KDAnimSpeedListIndex + 1) % KDAnimSpeedList.length; - KDAnimSpeed = KDAnimSpeedList[KDAnimSpeedListIndex] || 0; - localStorage.setItem("KDAnimSpeed", "" + KDAnimSpeedListIndex); - } - YY += YYd; - } else if (KinkyDungeonState == "End") { - if (MouseIn(1075, 650, 350, 64)) { - KinkyDungeonState = "Game"; - KinkyDungeonNewGamePlus(); - return true; - } if (MouseIn(1075, 750, 350, 64)) { - KinkyDungeonState = "Menu"; - return true; - } - } - - - return false; -} - -/** - * Handles clicks during the kinky dungeon game - * @returns {void} - Nothing - */ -function KinkyDungeonClick() { - if (KinkyDungeonHandleClick()) { - if (KinkyDungeonReplaceConfirm > 0) KinkyDungeonReplaceConfirm -= 1; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - } -} - -/** - * Handles exit during the kinky dungeon game - * @returns {void} - Nothing - */ -function KinkyDungeonExit() { - CommonDynamicFunction(MiniGameReturnFunction + "()"); - - // Refresh the player character if needed - if (ArcadeDeviousChallenge && KinkyDungeonPlayerNeedsRefresh) { - if (ServerPlayerIsInChatRoom()) { - ChatRoomCharacterUpdate(Player); - } else { - CharacterRefresh(Player); - } - } - - if (CharacterAppearancePreviousEmoticon) { - CharacterSetFacialExpression(Player, "Emoticon", CharacterAppearancePreviousEmoticon); - CharacterAppearancePreviousEmoticon = ""; - } - - if (MiniGameKinkyDungeonLevel > Math.max(KinkyDungeonRep, ReputationGet("Gaming")) || Math.max(KinkyDungeonRep, ReputationGet("Gaming")) > KinkyDungeonMaxLevel) { - KinkyDungeonRep = Math.max(KinkyDungeonRep, MiniGameKinkyDungeonLevel); - DialogSetReputation("Gaming", KinkyDungeonRep); - } - - if (CurrentScreen == "ChatRoom" && KinkyDungeonState != "Menu" && KDLose) { - let Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "KinkyDungeonLevel", Text: String(MiniGameKinkyDungeonLevel)}, - ]; - // @ts-ignore - ChatRoomPublishCustomAction("KinkyDungeonLose", false, Dictionary); - } - CharacterRefresh(Player, true); - - KinkyDungeonTeardownCrashHandler(); -} - - - - -/** - * Handles key presses during the mini game. (Both keyboard and mobile) - * @returns {void} - Nothing - */ -function KinkyDungeonKeyDown() { - // n/a -} - - - -let mouseDown = false; - -window.addEventListener('mousedown', function() { - mouseDown = true; -}); -window.addEventListener('mouseup', function() { - mouseDown = false; -}); - -/** - * Game keyboard input handler object: Handles keyboard inputs. - * @constant - * @type {object} - The game keyboard input handler object. Contains the functions and properties required to handle key press events. - */ -let KinkyDungeonGameKey = { - keyPressed : [false, false, false, false, false, false, false, false, false], - - KEY_UP : 'KeyB', - KEY_DOWN : 'KeyV', - KEY_LEFT : 'KeyC', - KEY_RIGHT : 'KeyX', - KEY_UPLEFT : 'KeyC', - KEY_UPRIGHT : 'KeyB', - KEY_DOWNLEFT : 'KeyX', - KEY_DOWNRIGHT : 'KeyV', - KEY_WAIT : 'KeyV', - KEY_SKIP : 'KeyEnter', - - load : function(){ - KinkyDungeonGameKey.keyPressed = [false, false, false, false, false, false, false, false, false]; - KinkyDungeonGameKey.addKeyListener(); - }, - - addKeyListener : function () { - window.addEventListener('keydown', KinkyDungeonGameKey.keyDownEvent); - window.addEventListener('keyup', KinkyDungeonGameKey.keyUpEvent); - }, - removeKeyListener : function () { - window.removeEventListener('keydown', KinkyDungeonGameKey.keyDownEvent); - window.removeEventListener('keyup', KinkyDungeonGameKey.keyUpEvent); - }, - keyDownEvent : { - handleEvent : function (event) { - let code = event.code; - if (!KDLastKeyTime[code]) { - KinkyDungeonKeybindingCurrentKey = code; - KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime(); - } - switch(code){ - case KinkyDungeonGameKey.KEY_UP: - if(!KinkyDungeonGameKey.keyPressed[0]){ - KinkyDungeonGameKey.keyPressed[0] = true; - } - break; - case KinkyDungeonGameKey.KEY_DOWN: - if(!KinkyDungeonGameKey.keyPressed[1]){ - KinkyDungeonGameKey.keyPressed[1] = true; - } - break; - case KinkyDungeonGameKey.KEY_LEFT: - if(!KinkyDungeonGameKey.keyPressed[2]){ - KinkyDungeonGameKey.keyPressed[2] = true; - } - break; - case KinkyDungeonGameKey.KEY_RIGHT: - if(!KinkyDungeonGameKey.keyPressed[3]){ - KinkyDungeonGameKey.keyPressed[3] = true; - } - break; - case KinkyDungeonGameKey.KEY_UPLEFT: - if(!KinkyDungeonGameKey.keyPressed[4]){ - KinkyDungeonGameKey.keyPressed[4] = true; - } - break; - case KinkyDungeonGameKey.KEY_UPRIGHT: - if(!KinkyDungeonGameKey.keyPressed[5]){ - KinkyDungeonGameKey.keyPressed[5] = true; - } - break; - case KinkyDungeonGameKey.KEY_DOWNLEFT: - if(!KinkyDungeonGameKey.keyPressed[6]){ - KinkyDungeonGameKey.keyPressed[6] = true; - } - break; - case KinkyDungeonGameKey.KEY_DOWNRIGHT: - if(!KinkyDungeonGameKey.keyPressed[7]){ - KinkyDungeonGameKey.keyPressed[7] = true; - } - break; - case KinkyDungeonGameKey.KEY_WAIT: - if(!KinkyDungeonGameKey.keyPressed[8]){ - KinkyDungeonGameKey.keyPressed[8] = true; - } - break; - case KinkyDungeonGameKey.KEY_SKIP: - if(!KinkyDungeonGameKey.keyPressed[9]){ - KinkyDungeonGameKey.keyPressed[9] = true; - } - break; - } - } - }, - keyUpEvent : { - handleEvent : function (event) { - let code = event.code; - KinkyDungeonKeybindingCurrentKeyRelease = code; - if (KinkyDungeonKeybindingCurrentKeyRelease) KinkyDungeonGameKeyUp(KDLastKeyTime[KinkyDungeonKeybindingCurrentKeyRelease]); - if (KDLastKeyTime[code]) delete KDLastKeyTime[code]; - KinkyDungeonKeybindingCurrentKeyRelease = ''; - switch(code){ - case KinkyDungeonGameKey.KEY_UP: - if (KinkyDungeonGameKey.keyPressed[0]) KinkyDungeonLastMoveTimerStart = 0; - KinkyDungeonGameKey.keyPressed[0] = false; - break; - case KinkyDungeonGameKey.KEY_DOWN: - if (KinkyDungeonGameKey.keyPressed[1]) KinkyDungeonLastMoveTimerStart = 0; - KinkyDungeonGameKey.keyPressed[1] = false; - break; - case KinkyDungeonGameKey.KEY_LEFT: - if (KinkyDungeonGameKey.keyPressed[2]) KinkyDungeonLastMoveTimerStart = 0; - KinkyDungeonGameKey.keyPressed[2] = false; - break; - case KinkyDungeonGameKey.KEY_RIGHT: - if (KinkyDungeonGameKey.keyPressed[3]) KinkyDungeonLastMoveTimerStart = 0; - KinkyDungeonGameKey.keyPressed[3] = false; - break; - case KinkyDungeonGameKey.KEY_UPLEFT: - if (KinkyDungeonGameKey.keyPressed[4]) KinkyDungeonLastMoveTimerStart = 0; - KinkyDungeonGameKey.keyPressed[4] = false; - break; - case KinkyDungeonGameKey.KEY_UPRIGHT: - if (KinkyDungeonGameKey.keyPressed[5]) KinkyDungeonLastMoveTimerStart = 0; - KinkyDungeonGameKey.keyPressed[5] = false; - break; - case KinkyDungeonGameKey.KEY_DOWNLEFT: - if (KinkyDungeonGameKey.keyPressed[6]) KinkyDungeonLastMoveTimerStart = 0; - KinkyDungeonGameKey.keyPressed[6] = false; - break; - case KinkyDungeonGameKey.KEY_DOWNRIGHT: - if (KinkyDungeonGameKey.keyPressed[7]) KinkyDungeonLastMoveTimerStart = 0; - KinkyDungeonGameKey.keyPressed[7] = false; - break; - case KinkyDungeonGameKey.KEY_WAIT: - if (KinkyDungeonGameKey.keyPressed[8]) KinkyDungeonLastMoveTimerStart = 0; - KinkyDungeonGameKey.keyPressed[8] = false; - break; - case KinkyDungeonGameKey.KEY_SKIP: - if (KinkyDungeonGameKey.keyPressed[9]) KinkyDungeonLastMoveTimerStart = 0; - KinkyDungeonGameKey.keyPressed[9] = false; - break; - } - - } - }, -}; - - - -/** - * Outputs a savegame - * @returns {KinkyDungeonSave} - Saved game object - */ -function KinkyDungeonGenerateSaveData() { - /** @type {KinkyDungeonSave} */ - let save = {}; - save.level = MiniGameKinkyDungeonLevel; - save.checkpoint = MiniGameKinkyDungeonCheckpoint; - save.rep = KinkyDungeonGoddessRep; - save.costs = KinkyDungeonShrineCosts; - save.pcosts = KinkyDungeonPenanceCosts; - save.dress = KinkyDungeonCurrentDress; - save.gold = KinkyDungeonGold; - save.points = KinkyDungeonSpellPoints; - save.id = KinkyDungeonEnemyID; - save.choices = KinkyDungeonSpellChoices; - save.choices2 = KinkyDungeonSpellChoicesToggle; - save.buffs = KinkyDungeonPlayerBuffs; - save.lostitems = KinkyDungeonLostItems; - save.grounditems = KinkyDungeonGroundItems; - save.rescued = KinkyDungeonRescued; - save.aid = KinkyDungeonAid; - save.seed = KinkyDungeonSeed; - save.statchoice = Array.from(KinkyDungeonStatsChoice); - save.mapIndex = KinkyDungeonMapIndex; - save.flags = Array.from(KinkyDungeonFlags); - save.faction = KinkyDungeonFactionRelations; - save.perks = KDUnlockedPerks; - - let spells = []; - /**@type {item[]} */ - let newInv = []; - - for (let inv of KinkyDungeonFullInventory()) { - let item = Object.assign({}, inv); - newInv.push(item); - } - - for (let spell of KinkyDungeonSpells) { - spells.push(spell.name); - } - - save.spells = spells; - save.inventory = newInv; - save.KDGameData = KDGameData; - save.KDEventData = KDEventData; - - save.KinkyDungeonEffectTiles = KinkyDungeonEffectTiles; - save.KinkyDungeonTiles = KinkyDungeonTiles; - save.KinkyDungeonTilesSkin = KinkyDungeonTilesSkin; - save.KinkyDungeonTilesMemory = KinkyDungeonTilesMemory; - save.KinkyDungeonRandomPathablePoints = KinkyDungeonRandomPathablePoints; - save.KinkyDungeonPlayerEntity = KinkyDungeonPlayerEntity; - save.KinkyDungeonEntities = KinkyDungeonEntities; - save.KinkyDungeonBullets = KinkyDungeonBullets; - save.KinkyDungeonGrid = KinkyDungeonGrid; - save.KinkyDungeonGridWidth = KinkyDungeonGridWidth; - save.KinkyDungeonGridHeight = KinkyDungeonGridHeight; - save.KinkyDungeonFogGrid = KinkyDungeonFogGrid; - save.KinkyDungeonEndPosition = KinkyDungeonEndPosition; - save.KinkyDungeonStartPosition = KinkyDungeonStartPosition; - - save.stats = { - picks: KinkyDungeonLockpicks, - keys: KinkyDungeonRedKeys, - bkeys: KinkyDungeonBlueKeys, - mana: KinkyDungeonStatMana, - manapool: KinkyDungeonStatManaPool, - stamina: KinkyDungeonStatStamina, - willpower: KinkyDungeonStatWill, - distraction: KinkyDungeonStatDistraction, - distractionlower: KinkyDungeonStatDistractionLower, - wep: KinkyDungeonPlayerWeapon, - npp: KinkyDungeonNewGame, - diff: KinkyDungeonStatsChoice.get("randomMode"), - }; - return save; -} - -function KinkyDungeonSaveGame(ToString) { - let save = KinkyDungeonGenerateSaveData(); - - let data = KinkyDungeonCompressSave(save); - if (!ToString) { - //Player.KinkyDungeonSave = saveData.KinkyDungeonSave; - //ServerAccountUpdate.QueueData(saveData); - localStorage.setItem('KinkyDungeonSave', data); - } - return data; -} - -function KinkyDungeonCompressSave(save) { - return LZString.compressToBase64(JSON.stringify(save)); -} - -// N4IgNgpgbhYgXARgDQgMYAsJoNYAcB7ASwDsAXBABlQCcI8FQBxDAgZwvgFoBWakAAo0ibAiQg0EvfgBkIAQzJZJ8fgFkIZeXFWoASgTwQqqAOpEwO/gFFIAWwjk2JkAGExAKwCudFwElLLzYiMSoAX1Q0djJneGAIkAIaACNYgG0AXUisDnSskAATOjZYkAARCAAzeS8wClQAcwIwApdCUhiEAGZUSBgwWNBbCAcnBBQ3Tx9jJFQAsCCQknGEtiNLPNRSGHIkgE8ENNAokjYvO3lkyEYQEnkHBEECMiW1eTuQBIBHL3eXsgOSAixzEZwuVxmoDuD3gTxeYgAylo7KR5J9UD8/kQAStkCDTudLtc4rd7jM4UsAGLCBpEVrfX7kbGAxDAkAAdwUhGWJOh5IA0iQiJVjGE2cUyDR5B0bnzHmUvGgyAAVeRGOQNZwJF4NDBkcQlca9Ai4R7o0ASqUy3lk+WKlVqiCUiCaNTnOwHbVEXX6iCG2bgE04M1hDJhIA= -function KinkyDungeonLoadGame(String) { - let str = String ? LZString.decompressFromBase64(String.trim()) : (localStorage.getItem('KinkyDungeonSave') ? LZString.decompressFromBase64(localStorage.getItem('KinkyDungeonSave')) : ""); - if (str) { - let saveData = JSON.parse(str); - if (saveData - && saveData.spells != undefined - && saveData.level != undefined - && saveData.checkpoint != undefined - && saveData.inventory != undefined - && saveData.costs != undefined - && saveData.rep != undefined - && saveData.dress != undefined) { - - KDPathfindingCacheFails = 0; - KDPathfindingCacheHits = 0; - KDPathCache = new Map(); - KDThoughtBubbles = new Map(); - - KinkyDungeonEntities = []; - KDUpdateEnemyCache = true; - if (saveData.flags && saveData.flags.length) KinkyDungeonFlags = new Map(saveData.flags); - MiniGameKinkyDungeonLevel = saveData.level; - if (Array.from(Object.keys(KinkyDungeonMapIndex)).includes(saveData.checkpoint)) - MiniGameKinkyDungeonCheckpoint = saveData.checkpoint; - else MiniGameKinkyDungeonCheckpoint = "grv"; - KinkyDungeonShrineCosts = saveData.costs; - KinkyDungeonGoddessRep = saveData.rep; - KinkyDungeonCurrentDress = saveData.dress; - KDGameData.KinkyDungeonSpawnJailers = 0; - KDGameData.KinkyDungeonSpawnJailersMax = 0; - if (saveData.seed) KDsetSeed(saveData.seed); - if (saveData.pcosts) KinkyDungeonPenanceCosts = saveData.pcosts; - if (saveData.choices) KinkyDungeonSpellChoices = saveData.choices; - if (saveData.choices2) KinkyDungeonSpellChoicesToggle = saveData.choices2; - if (saveData.buffs) KinkyDungeonPlayerBuffs = saveData.buffs; - if (saveData.gold != undefined) KinkyDungeonGold = saveData.gold; - if (saveData.id != undefined) KinkyDungeonEnemyID = saveData.id; - if (saveData.points != undefined) KinkyDungeonSpellPoints = saveData.points; - if (saveData.lostitems != undefined) KinkyDungeonLostItems = saveData.lostitems; - if (saveData.rescued != undefined) KinkyDungeonRescued = saveData.rescued; - if (saveData.aid != undefined) KinkyDungeonAid = saveData.aid; - if (saveData.grounditems) KinkyDungeonGroundItems = saveData.grounditems; - if (saveData.stats) { - if (saveData.stats.picks != undefined) KinkyDungeonLockpicks = saveData.stats.picks; - if (saveData.stats.keys != undefined) KinkyDungeonRedKeys = saveData.stats.keys; - if (saveData.stats.bkeys != undefined) KinkyDungeonBlueKeys = saveData.stats.bkeys; - if (saveData.stats.mana != undefined) KinkyDungeonStatMana = saveData.stats.mana; - if (saveData.stats.manapool != undefined) KinkyDungeonStatManaPool = saveData.stats.manapool; - if (saveData.stats.stamina != undefined) KinkyDungeonStatStamina = saveData.stats.stamina; - if (saveData.stats.willpower != undefined) KinkyDungeonStatWill = saveData.stats.willpower; - if (saveData.stats.distraction != undefined) KinkyDungeonStatDistraction = saveData.stats.distraction; - if (saveData.stats.distractionlower != undefined) KinkyDungeonStatDistractionLower = saveData.stats.distractionlower; - if (saveData.stats.wep != undefined) KDSetWeapon(saveData.stats.wep); - if (saveData.stats.npp != undefined) KinkyDungeonNewGame = saveData.stats.npp; - - - KDOrigStamina = KinkyDungeonStatStamina*10; - KDOrigWill = KinkyDungeonStatWill*10; - KDOrigMana = KinkyDungeonStatMana*10; - KDOrigDistraction = KinkyDungeonStatDistraction*10; - } - KDGameData = JSON.parse(JSON.stringify(KDGameDataBase)); - if (saveData.KDGameData != undefined) KDGameData = Object.assign({}, saveData.KDGameData); - KDEventData = JSON.parse(JSON.stringify(KDEventDataBase)); - if (saveData.KDEventData != undefined) KDEventData = Object.assign({}, saveData.KDEventData); - - if (saveData.statchoice != undefined) KinkyDungeonStatsChoice = new Map(saveData.statchoice); - if (saveData.faction != undefined) KinkyDungeonFactionRelations = saveData.faction; - KDInitFactions(); - if (typeof KDGameData.TimeSinceLastVibeStart === "number") KDGameData.TimeSinceLastVibeStart = {}; - if (typeof KDGameData.TimeSinceLastVibeEnd === "number") KDGameData.TimeSinceLastVibeEnd = {}; - - if (!KDGameData.AlreadyOpened) KDGameData.AlreadyOpened = []; - - if (saveData.perks) { - KDUnlockedPerks = saveData.perks; - KDLoadPerks(); - } - KDUnlockPerk(); - - KDInitInventory(); - for (let item of saveData.inventory) { - if (item.type == Restraint) { - let restraint = KinkyDungeonGetRestraintByName(item.name); - if (restraint) { - KinkyDungeonAddRestraint(restraint, 0, true, item.lock, undefined, undefined, undefined, undefined, item.faction); // Add the item - let createdrestraint = KinkyDungeonGetRestraintItem(restraint.Group); - if (createdrestraint) createdrestraint.lock = item.lock; // Lock if applicable - if (createdrestraint) createdrestraint.events = item.events; // events if applicable - KinkyDungeonInventoryAdd(item); - } - } else { - if (item.type != LooseRestraint || KDRestraint(item) != undefined) - KinkyDungeonInventoryAdd(item); - } - } - - KinkyDungeonSpells = []; - for (let spell of saveData.spells) { - let sp = KinkyDungeonFindSpell(spell); - if (sp) KinkyDungeonSpells.push(sp); - } - - - if (saveData.KinkyDungeonEffectTiles) KinkyDungeonEffectTiles = saveData.KinkyDungeonEffectTiles; - if (saveData.KinkyDungeonTiles) KinkyDungeonTiles = saveData.KinkyDungeonTiles; - if (saveData.KinkyDungeonTilesSkin) KinkyDungeonTilesSkin = saveData.KinkyDungeonTilesSkin; - if (saveData.KinkyDungeonTilesMemory) KinkyDungeonTilesMemory = saveData.KinkyDungeonTilesMemory; - if (saveData.KinkyDungeonRandomPathablePoints) KinkyDungeonRandomPathablePoints = saveData.KinkyDungeonRandomPathablePoints; - if (saveData.KinkyDungeonPlayerEntity) KinkyDungeonPlayerEntity = saveData.KinkyDungeonPlayerEntity; - if (saveData.KinkyDungeonEntities) KinkyDungeonEntities = saveData.KinkyDungeonEntities; - KDUpdateEnemyCache = true; - if (saveData.KinkyDungeonBullets) KinkyDungeonBullets = saveData.KinkyDungeonBullets; - if (saveData.KinkyDungeonStartPosition) KinkyDungeonStartPosition = saveData.KinkyDungeonStartPosition; - if (saveData.KinkyDungeonEndPosition) KinkyDungeonEndPosition = saveData.KinkyDungeonEndPosition; - if (saveData.KinkyDungeonGrid) { - KinkyDungeonGrid = saveData.KinkyDungeonGrid; - KinkyDungeonGridWidth = saveData.KinkyDungeonGridWidth; - KinkyDungeonGridHeight = saveData.KinkyDungeonGridHeight; - } - KinkyDungeonResetFog(); - - if (saveData.KinkyDungeonFogGrid) KinkyDungeonFogGrid = saveData.KinkyDungeonFogGrid; - - KinkyDungeonSetMaxStats(); - KinkyDungeonCheckClothesLoss = true; - KDNaked = false; - KinkyDungeonDressPlayer(); - KDRefresh = true; - KDUpdateEnemyCache = true; - if (KDGameData.Journey) - KDJourney = KDGameData.Journey; - if (saveData.mapIndex && !saveData.mapIndex.length) KinkyDungeonMapIndex = saveData.mapIndex; - - if (String) - localStorage.setItem('KinkyDungeonSave', String); - - if (saveData.KDGameData && saveData.KDGameData.LastMapSeed) KDsetSeed(saveData.KDGameData.LastMapSeed); - - if (!KinkyDungeonMapIndex[KDGameData.MainPath] || !KinkyDungeonMapIndex[KDGameData.ShortcutPath]) - KDInitializeJourney(KDGameData.Journey); - - if (saveData.KinkyDungeonGrid) { - KDUpdateVision(); - } - KinkyDungeonFloaters = []; - KinkyDungeonAdvanceTime(0, true, true); - return true; - } - } - return false; -} - -let KinkyDungeonSeed = (Math.random() * 4294967296).toString(); -let KDRandom = sfc32(xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)()); - -/** - * - * @param {boolean} Native Decides whether or not to use native KDRandom to randomize - */ -function KDrandomizeSeed(Native) { - let rand = Native ? KDRandom : () => {return Math.random();}; - KinkyDungeonSeed = (rand() * 4294967296).toString(); - for (let i = 0; i < 20; i++) { - let index = rand() * KinkyDungeonSeed.length; - KinkyDungeonSeed = KinkyDungeonSeed.replaceAt(index, String.fromCharCode(65 + Math.floor(rand()*50)) + String.fromCharCode(65 + Math.floor(rand()*50))); - } - KDRandom = sfc32(xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)()); - for (let i = 0; i < 1000; i++) { - KDRandom(); - } -} - -function KDsetSeed(string) { - KinkyDungeonSeed = string; - KDRandom = sfc32(xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)()); - for (let i = 0; i < 1000; i++) { - KDRandom(); - } -} - -/** - * It takes a string and returns a function that returns a random number - * @param str - The string to hash. - * @returns A function that returns a random number. - */ -function xmur3(str) { - let h = 1779033703 ^ str.length; - for(let i = 0; i < str.length; i++) { - h = Math.imul(h ^ str.charCodeAt(i), 3432918353); - h = h << 13 | h >>> 19; - } return function() { - h = Math.imul(h ^ (h >>> 16), 2246822507); - h = Math.imul(h ^ (h >>> 13), 3266489909); - return (h ^= h >>> 16) >>> 0; - }; -} - -/** - * It takes four 32-bit integers and returns a function that returns a random number between 0 and 1 - * @param a - The first parameter. - * @param b - 0x9e3779b9 - * @param c - 0x9e3779b9 - * @param d - The seed. - * @returns A function that returns a random number between 0 and 1. - */ -function sfc32(a, b, c, d) { - return function() { - a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0; - let t = (a + b) | 0; - a = b ^ b >>> 9; - b = c + (c << 3) | 0; - c = (c << 21 | c >>> 11); - d = d + 1 | 0; - t = t + d | 0; - c = c + t | 0; - return (t >>> 0) / 4294967296; - }; -} - -/** - * @type {Map} - */ -let kdSoundCache = new Map(); - -/** - * - * @param {string} Path - * @param {number} [volume] - */ -function AudioPlayInstantSoundKD(Path, volume) { - const vol = KDSfxVolume * (volume != null ? volume : Player.AudioSettings.Volume); - if (vol > 0) { - let src = KDModFiles[Path] || Path; - let audio = kdSoundCache.has(src) ? kdSoundCache.get(src) : new Audio(); - if (!kdSoundCache.has(src)) { - audio.src = src; - kdSoundCache.set(src, audio); - } else { - audio.pause(); - audio.currentTime = 0; - } - audio.volume = Math.min(vol, 1); - audio.play(); - } -} - -/** - * From https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0 - */ -function hashCode(s) { - for(var i = 0, h = 0; i < s.length; i++) - h = Math.imul(31, h) + s.charCodeAt(i) | 0; - return h; -} - -function TextGetKD(Text) { - if (TextGet(Text)) - return TextGet(Text); - else return KDLoadingTextKeys[Text] || "Missing text"; -} - - -function KinkyDungeonCheckPlayerRefresh() { - if (!ArcadeDeviousChallenge || CommonTime() < KinkyDungeonNextRefreshCheck) { - return; - } - - // We've exceeded the refresh check time - check again in 1 second - KinkyDungeonNextRefreshCheck = CommonTime() + 1000; - - if (!KinkyDungeonPlayerNeedsRefresh) { - return; - } - - KinkyDungeonPlayerNeedsRefresh = false; - - if (ServerPlayerIsInChatRoom()) { - ChatRoomCharacterUpdate(Player); - } else { - CharacterRefresh(Player); - } -} - -function CJKcheck(text,p = 0,o = "search"){ - if (o == "search") - { - //Find all English characters and space - if (p == 1){ return text.match(/[a-zA-Z0-9\s\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+/g);} - //Find all characters except English characters - if (p == 2){ return text.match(/^[a-zA-Z\s\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+$/g);} - //Find all CJK Symbols and Punctuation - if (p == 3){ return text.match(/[\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\uff1f\uff01\uffe5\u3000-\u303f]+/g);} - //Find all CJK characters - else { return text.match(/[\u3000-\u9fff\ue000-\uf8ff\uff01-\uffdc\uac00-\ud7af]+/g);} - } else if (o == "test") - { - //Check CJK Symbols and Punctuation - if (p == 3){ return (/[\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\uff1f\uff01\uffe5\u3000-\u303f]+/g).test(text);} - } -} \ No newline at end of file diff --git a/Game/KinkyDungeonAlt.js b/Game/KinkyDungeonAlt.js deleted file mode 100644 index 7c30157c0..000000000 --- a/Game/KinkyDungeonAlt.js +++ /dev/null @@ -1,1510 +0,0 @@ -"use strict"; - -let KDJourneyMapMod = { - "Random": true, -}; - -let KDDefaultMaxFlags = { - goldchest: 1, - lessergold: 1, - silverchest: 2, - darkchest: 2, - redchest: 6, - bluechest: 2, - forbidden: 1, - artifact: 2, - jail: 2, - playroom: 4, - supplydepot: 1, - barracks: 2, - robotroom: 3, - laboratory: 1, - library: 1, - armory: 1, - workshop: 2, - tinker: 1, - office: 3, - worship: 1, - graveyard: 2, - well: 3, - wildlife: 2, - range: 2, - arena: 1, - arena_boss: 1, - arena_miniboss: 5, - slimespawn: 3, - beastspawn: 3, - magicspawn: 3, - robotspawn: 3, -}; - -let alts = { - "Tunnel": { - name: "Tunnel", - bossroom: false, - width: 8, - height: 8, - genType: "Tunnel", - spawns: false, - chests: false, - shrines: false, - orbs: 0, - setpieces: { - }, - chargers: false, - notorches: false, - heart: false, - specialtiles: true, - shortcut: false, - enemies: false, - nojail: true, - nolore: true, - nokeys: true, - nostairs: true, - notraps: true, - noClutter: true, - noShrineTypes: ["Commerce", "Will"], - tickFlags: true, - noMusic: true, - keepMainPath: true, - }, - "PerkRoom": { - name: "PerkRoom", - bossroom: false, - width: 9, - height: 8, - genType: "PerkRoom", - setpieces: { - "PearlChest": 100, - }, - spawns: false, - chests: false, - shrines: false, - orbs: 0, - chargers: false, - notorches: false, - heart: false, - specialtiles: true, - shortcut: false, - enemies: false, - nojail: true, - nolore: true, - nokeys: true, - nostairs: true, - notraps: true, - noClutter: true, - noShrineTypes: ["Commerce", "Will"], - noMusic: true, - keepMainPath: true, - }, - "Jail": { - name: "Jail", - bossroom: false, - width: 15, - height: 15, - enemyMult: 0.6, - setpieces: { - "GuaranteedCell": 100, - "ExtraCell": 20, - "Bedroom": 10, - "QuadCell": 7, - "Storage": 12, - }, - bonusTags: { - "construct": {bonus: 0, mult: 0}, - }, - genType: "NarrowMaze", - spawns: false, - chests: false, - shrines: true, - orbs: 0, - chargers: true, - notorches: false, - heart: false, - specialtiles: true, - shortcut: false, - enemies: true, - nojail: false, - nokeys: true, - nostairs: false, - notraps: false, - noRelease: true, - releaseOnLowSec: true, - noShrineTypes: ["Commerce"], - }, - "DollRoom": { - name: "DollRoom", - noWear: true, // Disables doodad wear - bossroom: false, - width: 15, - height: 10, - nopatrols: true, - setpieces: { - }, - data: { - dollroom: true, - }, - genType: "DollRoom", - spawns: false, - chests: false, - shrines: false, - orbs: 0, - chargers: false, - notorches: true, - heart: false, - specialtiles: false, - shortcut: false, - enemies: false, - nojail: true, - nokeys: true, - nostairs: true, - nostartstairs: true, - notraps: false, - noClutter: true, - nobrick: true, - nolore: true, - noboring: true, // Skip generating boringness - }, - - "TestTile": { - name: "TestTile", - noWear: true, // Disables doodad wear - bossroom: false, - width: 15, - height: 10, - //nopatrols: true, - setpieces: { - }, - genType: "TestTile", - spawns: true, - chests: false, - shrines: false, - orbs: 0, - chargers: false, - notorches: true, - heart: false, - specialtiles: false, - shortcut: false, - enemies: true, - nojail: true, - nokeys: true, - nostairs: true, - nostartstairs: true, - notraps: false, - noClutter: true, - nobrick: true, - nolore: true, - noboring: true, // Skip generating boringness - }, - "JourneyFloor": { - name: "JourneyFloor", - bossroom: false, - width: 10, - height: 8, - setpieces: { - }, - genType: "JourneyFloor", - spawns: false, - chests: false, - shrines: false, - orbs: 0, - chargers: false, - notorches: false, - heart: false, - specialtiles: false, - shortcut: false, - enemies: false, - nojail: true, - nokeys: true, - nolore: true, - nostairs: true, - notraps: true, - noClutter: true, - skiptunnel: true, // Skip the ending tunnel - }, - "ShopStart": { - name: "ShopStart", - bossroom: false, - width: 10, - height: 8, - setpieces: { - }, - genType: "ShopStart", - spawns: false, - chests: false, - shrines: false, - orbs: 0, - chargers: false, - notorches: false, - heart: false, - specialtiles: false, - shortcut: false, - enemies: false, - nojail: true, - nokeys: true, - nolore: true, - nostairs: true, - notraps: true, - noClutter: true, - skiptunnel: true, // Skip the ending tunnel - }, - "Tutorial": { - name: "Tutorial", - bossroom: false, - width: 30, - height: 7, - setpieces: { - }, - genType: "Tutorial", - spawns: false, - chests: false, - shrines: false, - orbs: 0, - chargers: false, - notorches: false, - heart: false, - specialtiles: false, - shortcut: false, - enemies: false, - nojail: true, - nokeys: true, - nolore: true, - nostairs: true, - notraps: true, - noClutter: true, - }, -}; - -let KDJourneyList = ["Random", "Harder", "Explorer", "Doll"]; -if (param_test) KDJourneyList.push("Test"); - -function KinkyDungeonAltFloor(Type) { - return alts[Type]; -} - - -let KinkyDungeonCreateMapGenType = { - "Room": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data); - }, - "JourneyFloor": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateJourneyFloor(POI, VisitedRooms, width, height, openness, density, hallopenness, data); - }, - "ShopStart": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateShopStart(POI, VisitedRooms, width, height, openness, density, hallopenness, data); - }, - "TestTile": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateTestTile(POI, VisitedRooms, width, height, openness, density, hallopenness, data); - }, - "Tutorial": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateTutorial(POI, VisitedRooms, width, height, openness, density, hallopenness, data); - }, - "Tunnel": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateTunnel(POI, VisitedRooms, width, height, openness, density, hallopenness, data); - }, - "PerkRoom": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreatePerkRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data); - }, - "Chamber": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateMaze(POI, VisitedRooms, width, height, 2, 1.5, 8, data); - }, - "Maze": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateMaze(POI, VisitedRooms, width, height, openness, density, hallopenness, data); - }, - "TileMaze": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateTileMaze(POI, VisitedRooms, width, height, openness, density, hallopenness, data); - }, - "NarrowMaze": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateMaze(POI, VisitedRooms, width, height, 0, 10, 0, data); - }, - "DollRoom": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateDollRoom(POI, VisitedRooms, width, height, 0, 10, 0, data); - }, - "Dollmaker": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { - KinkyDungeonCreateDollmaker(POI, VisitedRooms, width, height, 0, 10, 0, data); - }, -}; - - -function KinkyDungeonCreateMaze(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { - // Variable setup - - let Walls = {}; - let WallsList = {}; - let VisitedCells = {}; - - // Initialize the first cell in our Visited Cells list - if (KDDebug) console.log("Created maze with dimensions " + width + "x" + height + ", openness: "+ openness + ", density: "+ density); - - VisitedCells[VisitedRooms[0].x + "," + VisitedRooms[0].y] = {x:VisitedRooms[0].x, y:VisitedRooms[0].y}; - - // Walls are basically even/odd pairs. - for (let X = 2; X < width; X += 2) - for (let Y = 1; Y < height; Y += 2) - if (KinkyDungeonMapGet(X, Y) == '1') { - Walls[X + "," + Y] = {x:X, y:Y}; - } - for (let X = 1; X < width; X += 2) - for (let Y = 2; Y < height; Y += 2) - if (KinkyDungeonMapGet(X, Y) == '1') { - Walls[X + "," + Y] = {x:X, y:Y}; - } - - // Setup the wallslist for the first room - KinkyDungeonMazeWalls(VisitedRooms[0], Walls, WallsList); - - // Per a randomized primm algorithm from Wikipedia, we loop through the list of walls until there are no more walls - - let WallKeys = Object.keys(WallsList); - //let CellKeys = Object.keys(VisitedCells); - - while (WallKeys.length > 0) { - let I = Math.floor(KDRandom() * WallKeys.length); - let wall = Walls[WallKeys[I]]; - let unvisitedCell = null; - - // Check if wall is horizontal or vertical and determine if there is a single unvisited cell on the other side of the wall - if (wall.x % 2 == 0) { //horizontal wall - if (!VisitedCells[(wall.x-1) + "," + wall.y]) unvisitedCell = {x:wall.x-1, y:wall.y}; - if (!VisitedCells[(wall.x+1) + "," + wall.y]) { - if (unvisitedCell) unvisitedCell = null; - else unvisitedCell = {x:wall.x+1, y:wall.y}; - } - } else { //vertical wall - if (!VisitedCells[wall.x + "," + (wall.y-1)]) unvisitedCell = {x:wall.x, y:wall.y-1}; - if (!VisitedCells[wall.x + "," + (wall.y+1)]) { - if (unvisitedCell) unvisitedCell = null; - else unvisitedCell = {x:wall.x, y:wall.y+1}; - } - } - - // We only add a new cell if only one of the cells is unvisited - if (unvisitedCell) { - delete Walls[wall.x + "," + wall.y]; - - KinkyDungeonMapSet(wall.x, wall.y, '0'); - KinkyDungeonMapSet(unvisitedCell.x, unvisitedCell.y, '0'); - VisitedCells[unvisitedCell.x + "," + unvisitedCell.y] = unvisitedCell; - - KinkyDungeonMazeWalls(unvisitedCell, Walls, WallsList); - } - - // Either way we remove this wall from consideration - delete WallsList[wall.x + "," + wall.y]; - // Update keys - - WallKeys = Object.keys(WallsList); - //CellKeys = Object.keys(VisitedCells); - } - - for (let X = 1; X < KinkyDungeonGridWidth; X += 1) - for (let Y = 1; Y < KinkyDungeonGridWidth; Y += 1) { - if ((X % 2 == 0 && Y % 2 == 1) || (X % 2 == 1 && Y % 2 == 0)) { - let size = 1+Math.ceil(KDRandom() * (openness)); - if (KDRandom() < 0.4 - 0.02*density * size * size) { - - let tile = '0'; - - // We open up the tiles - for (let XX = X; XX < X +size; XX++) - for (let YY = Y; YY < Y+size; YY++) { - if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) - KinkyDungeonMapSet(XX, YY, tile); - VisitedCells[XX + "," + YY] = {x:XX, y:YY}; - KinkyDungeonMazeWalls({x:XX, y:YY}, Walls, WallsList); - delete Walls[XX + "," + YY]; - } - } - } - } - - // We add POI's at dead ends - for (let X = 1; X < KinkyDungeonGridWidth; X += 1) - for (let Y = 1; Y < KinkyDungeonGridWidth; Y += 1) { - let nearwalls = 0; - for (let XX = X - 1; XX <= X + 1; XX += 1) - for (let YY = Y - 1; YY <= Y + 1; YY += 1) { - if (KinkyDungeonMapGet(XX, YY) == '1') { - nearwalls += 1; - } - } - if (nearwalls == 7) { - POI.push({x: X*2, y: Y*2, requireTags: ["endpoint"], favor: [], used: false}); - } - } - - // Now we STRETCH the map - let KinkyDungeonOldGrid = KinkyDungeonGrid; - let w = KinkyDungeonGridWidth; - let h = KinkyDungeonGridHeight; - KinkyDungeonGridWidth = Math.floor(KinkyDungeonGridWidth*2); - KinkyDungeonGridHeight = Math.floor(KinkyDungeonGridHeight*2); - KinkyDungeonGrid = ""; - - // Generate the grid - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - for (let X = 0; X < KinkyDungeonGridWidth; X++) - KinkyDungeonGrid = KinkyDungeonGrid + KinkyDungeonOldGrid[Math.floor(X * w / KinkyDungeonGridWidth) + Math.floor(Y * h / KinkyDungeonGridHeight)*(w+1)]; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } - - // Constrict hallways randomly in X - for (let Y = 2; Y < KinkyDungeonGridHeight - 1; Y += 1) { - if (KDRandom() < 0.4 - 0.04*hallopenness) { - let row_top = []; - let row_mid = []; - let row_bot = []; - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - row_top.push(KinkyDungeonMapGet(X, Y-1)); - row_mid.push(KinkyDungeonMapGet(X, Y)); - row_bot.push(KinkyDungeonMapGet(X, Y+1)); - } - for (let X = 1; X < KinkyDungeonGridWidth-1; X++) { - if (row_mid[X] == '0') { - if (row_mid[X-1] == '0' || row_mid[X+1] == '0') { - if (row_top[X] == '0' && row_bot[X] == '0' && (row_top[X-1] == '1' || row_bot[X+1] == '1')) { - // Avoid creating diagonals - if (((row_top[X+1] == '0' && row_bot[X+1] == '0') || row_mid[X+1] == '1') - && ((row_top[X-1] == '0' && row_bot[X-1] == '0') || row_mid[X-1] == '1')) { - KinkyDungeonMapSet(X, Y, 'X'); - X++; - } - } - } - } - } - } - } - - // Constrict hallways randomly in Y - for (let X = 2; X < KinkyDungeonGridWidth - 1; X += 1) { - if (KDRandom() < 0.4 - 0.04*hallopenness) { - let col_top = []; - let col_mid = []; - let col_bot = []; - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - col_top.push(KinkyDungeonMapGet(X-1, Y)); - col_mid.push(KinkyDungeonMapGet(X, Y)); - col_bot.push(KinkyDungeonMapGet(X+1, Y)); - } - for (let Y = 1; Y < KinkyDungeonGridHeight-1; Y++) { - if (col_mid[Y] == '0') { - if (col_mid[Y-1] == '0' || col_mid[Y+1] == '0') { - if (col_top[Y] == '0' && col_bot[Y] == '0' && (col_top[Y-1] == '1' || col_bot[Y+1] == '1')) { - if (((col_top[Y+1] == '0' && col_bot[Y+1] == '0') || col_mid[Y+1] == '1') - && ((col_top[Y-1] == '0' && col_bot[Y-1] == '0') || col_mid[Y-1] == '1')) { - KinkyDungeonMapSet(X, Y, '1'); - Y++; - } - } - } - } - } - } - } - - for (let X = 2; X < KinkyDungeonGridWidth; X += 2) - for (let Y = 2; Y < KinkyDungeonGridWidth; Y += 2) { - let size = 2*Math.ceil(KDRandom() * (openness)); - if (KDRandom() < 0.4 - 0.04*density * size) { - - let tile = '0'; - if (data.params.floodChance > 0 && KDRandom() < data.params.floodChance) tile = 'w'; - - // We open up the tiles - for (let XX = X; XX < X +size; XX++) - for (let YY = Y; YY < Y+size; YY++) { - if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) - KinkyDungeonMapSet(XX, YY, tile); - } - } - } -} - -/** - * - * @param {*} POI - * @param {*} VisitedRooms - * @param {*} width - * @param {*} height - * @param {*} openness - * @param {*} density - * @param {*} hallopenness - * @param {{params: floorParams; chestlist: any[]; traps: any[]; shrinelist: any[]; chargerlist: any[]; spawnpoints: any[]}} data - */ -function KinkyDungeonCreateTileMaze(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { - // Variable setup - - VisitedRooms = []; - KinkyDungeonMapSet(1, 1, '0', VisitedRooms); - - let Walls = {}; - let WallsList = {}; - let VisitedCells = {}; - - // Initialize the first cell in our Visited Cells list - //if (KDDebug) - console.log("Created maze with dimensions " + width + "x" + height + ", openness: "+ openness + ", density: "+ density); - - VisitedCells[VisitedRooms[0].x + "," + VisitedRooms[0].y] = {x:VisitedRooms[0].x, y:VisitedRooms[0].y}; - - // Walls are basically even/odd pairs. - for (let X = 2; X < width; X += 2) - for (let Y = 1; Y < height; Y += 2) - if (KinkyDungeonMapGet(X, Y) == '1') { - Walls[X + "," + Y] = {x:X, y:Y}; - } - for (let X = 1; X < width; X += 2) - for (let Y = 2; Y < height; Y += 2) - if (KinkyDungeonMapGet(X, Y) == '1') { - Walls[X + "," + Y] = {x:X, y:Y}; - } - - // Setup the wallslist for the first room - KinkyDungeonMazeWalls(VisitedRooms[0], Walls, WallsList); - - // Per a randomized primm algorithm from Wikipedia, we loop through the list of walls until there are no more walls - - let WallKeys = Object.keys(WallsList); - //let CellKeys = Object.keys(VisitedCells); - - while (WallKeys.length > 0) { - let I = Math.floor(KDRandom() * WallKeys.length); - let wall = Walls[WallKeys[I]]; - let unvisitedCell = null; - - // Check if wall is horizontal or vertical and determine if there is a single unvisited cell on the other side of the wall - if (wall.x % 2 == 0) { //horizontal wall - if (!VisitedCells[(wall.x-1) + "," + wall.y]) unvisitedCell = {x:wall.x-1, y:wall.y}; - if (!VisitedCells[(wall.x+1) + "," + wall.y]) { - if (unvisitedCell) unvisitedCell = null; - else unvisitedCell = {x:wall.x+1, y:wall.y}; - } - } else { //vertical wall - if (!VisitedCells[wall.x + "," + (wall.y-1)]) unvisitedCell = {x:wall.x, y:wall.y-1}; - if (!VisitedCells[wall.x + "," + (wall.y+1)]) { - if (unvisitedCell) unvisitedCell = null; - else unvisitedCell = {x:wall.x, y:wall.y+1}; - } - } - - // We only add a new cell if only one of the cells is unvisited - if (unvisitedCell) { - delete Walls[wall.x + "," + wall.y]; - - KinkyDungeonMapSet(wall.x, wall.y, '0'); - KinkyDungeonMapSet(unvisitedCell.x, unvisitedCell.y, '0'); - VisitedCells[unvisitedCell.x + "," + unvisitedCell.y] = unvisitedCell; - - KinkyDungeonMazeWalls(unvisitedCell, Walls, WallsList); - } - - // Either way we remove this wall from consideration - delete WallsList[wall.x + "," + wall.y]; - // Update keys - - WallKeys = Object.keys(WallsList); - //CellKeys = Object.keys(VisitedCells); - } - - // The maze is complete. Now we open up some tiles - - for (let X = 1; X < KinkyDungeonGridWidth; X += 1) - for (let Y = 1; Y < KinkyDungeonGridWidth; Y += 1) { - if ((X % 2 == 0 && Y % 2 == 1) || (X % 2 == 1 && Y % 2 == 0)) { - let size = 1;//+Math.ceil(KDRandom() * (openness)); - if (KDRandom() < 0.4 - 0.02*density * size * size) { - - let tile = '0'; - - // We open up the tiles - for (let XX = X; XX < X +size; XX++) - for (let YY = Y; YY < Y+size; YY++) { - if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) - KinkyDungeonMapSet(XX, YY, tile); - VisitedCells[XX + "," + YY] = {x:XX, y:YY}; - KinkyDungeonMazeWalls({x:XX, y:YY}, Walls, WallsList); - delete Walls[XX + "," + YY]; - } - } - if (KDRandom() < 0.02 * openness) { - - let tile = '0'; - - // We open up the tiles - for (let XX = X-1; XX <= X + 1; XX++) - for (let YY = Y; YY <= Y + 1; YY++) - if (XX == 0 || YY == 0) { - if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) - KinkyDungeonMapSet(XX, YY, tile); - VisitedCells[XX + "," + YY] = {x:XX, y:YY}; - KinkyDungeonMazeWalls({x:XX, y:YY}, Walls, WallsList); - delete Walls[XX + "," + YY]; - } - } - } - } - - // Now we create a new map based on the maze - let w = KinkyDungeonGridWidth; - let h = KinkyDungeonGridHeight; - - // Determine widths empirically. Only science is allowed here. - let index_w = 0; - let index_h = 0; - for (let x = 1; x*2 < KinkyDungeonGridWidth; x += 1) { - index_w += 1; - index_h = 0; - for (let y = 1; y*2 < KinkyDungeonGridHeight; y += 1) { - index_h += 1; - } - } - - - // Set points for start and end points on the map... - let starty = Math.floor(KDRandom() * (index_h )); - let endy = Math.floor(KDRandom() * (index_h)); - let topx = Math.floor(KDRandom() * (index_w)); - let botx = Math.floor(KDRandom() * (index_w)); - - /** - * Start, end, top, bot positions - * @type {Record} - */ - let requiredAccess = { - }; - requiredAccess[1 + "," + (starty + 1)] = true; - requiredAccess[(topx + 1) + "," + 1] = true; - requiredAccess[w + "," + (endy + 1)] = true; - requiredAccess[(botx + 1) + "," + h] = true; - - // Now we convert the maze into an array of indices - /** - * @type {Record} - */ - let indices = {}; - for (let x = 1; x < KinkyDungeonGridWidth; x += 2) { - for (let y = 1; y < KinkyDungeonGridHeight; y += 2) { - let index = ""; - if (KinkyDungeonMapGet(x, y - 1) == '0' || (y == 1 && (x - 1)/2 == topx)) index = index + "u"; - if (KinkyDungeonMapGet(x, y + 1) == '0' || (y == -1 + index_h * 2 && (x - 1)/2 == botx)) index = index + "d"; - if (KinkyDungeonMapGet(x - 1, y) == '0' || (x == 1 && (y - 1)/2 == starty)) index = index + "l"; - if (KinkyDungeonMapGet(x + 1, y) == '0' || (x == -1 + index_w * 2 && (y - 1)/2 == endy)) index = index + "r"; - indices[(1 + (x - 1)/2) + "," + (1 + (y - 1)/2)] = index; - } - } - - // TODO remove - console.log(indices); - - // Set the map bounds - KinkyDungeonGridWidth = Math.floor(index_w * KDTE_Scale) + 2; - KinkyDungeonGridHeight = Math.floor(index_h * KDTE_Scale) + 2; - - KinkyDungeonStartPosition = {x: 1, y: 4 + (starty) * KDTE_Scale}; - KinkyDungeonEndPosition = {x: KinkyDungeonGridWidth - 2, y: 4 + (endy) * KDTE_Scale}; - if (KDRandom() < 0.5) - KinkyDungeonShortcutPosition = {x: 4 + (botx) * KDTE_Scale, y: KinkyDungeonGridHeight - 2}; - else - KinkyDungeonShortcutPosition = {x: 4 + (topx) * KDTE_Scale, y: 1}; - - KinkyDungeonGrid = ""; - - // Generate the grid - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - for (let X = 0; X < KinkyDungeonGridWidth; X++) - KinkyDungeonGrid = KinkyDungeonGrid + '1';//KinkyDungeonGrid + KinkyDungeonOldGrid[Math.floor(X * w / KinkyDungeonGridWidth) + Math.floor(Y * h / KinkyDungeonGridHeight)*(w+1)]; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } - - let tagModifiers = data.params.tagModifiers ? data.params.tagModifiers : undefined; - - // Now we decide which tiles to use. This is a lengthy process, so it is its own function - // This happens with the loading--future tiles depend on present tiles - let maxTagFlags = Object.assign({ - chest: data.params.chestcount || 0, - shrine: data.params.shrinecount || 0, - charger: data.params.chargercount || 0, - }, KDDefaultMaxFlags); - KDMapTilesPopulate(w, h, indices, data, requiredAccess, maxTagFlags, tagModifiers); - - let floodChance = data.params.floodchance || 0; - - for (let X = 2; X < KinkyDungeonGridWidth; X += 2) - for (let Y = 2; Y < KinkyDungeonGridWidth; Y += 2) { - let size = 2*Math.ceil(KDRandom() * (openness)); - if (KDRandom() < 0.4 - 0.04*density * size) { - if (floodChance > 0 && KDRandom() < floodChance) - // We open up the tiles - for (let XX = X; XX < X +size; XX++) - for (let YY = Y; YY < Y+size; YY++) { - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) - KinkyDungeonMapSet(XX, YY, 'w'); - } - } - } -} - - -function KinkyDungeonCreateRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { - // Variable setup - - KinkyDungeonCreateRectangle(0, 0, width, height, true, false, false, false); - - // Now we STRETCH the map - let KinkyDungeonOldGrid = KinkyDungeonGrid; - let w = KinkyDungeonGridWidth; - let h = KinkyDungeonGridHeight; - KinkyDungeonGridWidth = Math.floor(KinkyDungeonGridWidth*2); - KinkyDungeonGridHeight = Math.floor(KinkyDungeonGridHeight*2); - KinkyDungeonGrid = ""; - - // Generate the grid - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - for (let X = 0; X < KinkyDungeonGridWidth; X++) - KinkyDungeonGrid = KinkyDungeonGrid + KinkyDungeonOldGrid[Math.floor(X * w / KinkyDungeonGridWidth) + Math.floor(Y * h / KinkyDungeonGridHeight)*(w+1)]; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } -} - -function KinkyDungeonCreateDollRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { - // Variable setup - - - // Now we STRETCH the map - KinkyDungeonGridWidth = Math.floor(KinkyDungeonGridWidth*2); - KinkyDungeonGridHeight = Math.floor(KinkyDungeonGridHeight*2); - KinkyDungeonGrid = ""; - - width = KinkyDungeonGridWidth; - height = KinkyDungeonGridHeight; - - // Generate the grid - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - for (let X = 0; X < KinkyDungeonGridWidth; X++) - KinkyDungeonGrid = KinkyDungeonGrid + '1'; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } - - - // Create the doll cell itself - let CellWidth = 10; - let CellHeight = 12; - let CellX = width / 2 - CellWidth / 2; - let CellY = height / 2 - CellHeight / 2; - let cavityStart = 5; - let cavityEnd = 2; - - // Hollow out a greater cell area - KinkyDungeonCreateRectangle(cavityStart, 0, CellX + CellWidth - cavityEnd, height, false, false, false, false); - - KinkyDungeonCreateRectangle(CellX, CellY, CellWidth, CellHeight, true, false, false, true, true, false, true); - - // Create some protrustions in the walls - let leftPassages = [ - ]; - for (let i = 0; i < 6; i++) { - leftPassages.push(1 + Math.ceil(KDRandom()*2)); - } - let rightPassages = []; - for (let i = 0; i < 6; i++) { - rightPassages.push(2 + Math.ceil(KDRandom()*3)); - } - let ii = 0; - for (let l of leftPassages) { - KinkyDungeonCreateRectangle(cavityStart - l, 1 + 3 * ii, l, 2, false, false, false, false); - - KinkyDungeonMapSet(cavityStart, 3 + 3 * ii, 'X'); - //if (ii < leftPassages.length - 1) { - KinkyDungeonMapSet(cavityStart, 1 + 3 * ii, '2'); - KinkyDungeonMapSet(cavityStart, 2 + 3 * ii, '2'); - //} - ii += 1; - } - ii = 0; - for (let l of rightPassages) { - KinkyDungeonCreateRectangle(cavityStart - cavityEnd + CellX + CellWidth, 1 + 3 * ii, l, 2, false, false, false, false); - KinkyDungeonMapSet(cavityStart - cavityEnd + CellX + CellWidth, 3 + 3 * ii, 'X'); - //if (ii < rightPassages.length - 1) { - KinkyDungeonMapSet(cavityStart - cavityEnd + CellX + CellWidth, 1 + 3 * ii, '2'); - KinkyDungeonMapSet(cavityStart - cavityEnd + CellX + CellWidth, 2 + 3 * ii, '2'); - //} - ii += 1; - } - - // Create grates - KinkyDungeonMapSet(CellX + 2 + Math.floor(KDRandom()*(CellWidth - 5)), KDRandom() < 0.5 ? CellY : (CellY+CellHeight - 1), 'g'); - if (KDRandom() < 0.5) - KinkyDungeonMapSet(CellX + 2 + Math.floor(KDRandom()*(CellWidth - 5)), KDRandom() < 0.5 ? CellY : (CellY+CellHeight - 1), 'g'); - if (KDRandom() < 0.5) - KinkyDungeonMapSet(CellX,CellY + 2 + Math.floor(KDRandom()*(CellHeight - 5)), 'g'); - if (KDRandom() < 0.5) - KinkyDungeonMapSet((CellX+CellWidth - 1),CellY + 2 + Math.floor(KDRandom()*(CellHeight - 5)), 'g'); - // Create light posts - for (let xx = CellX + 2; xx < CellX + CellWidth; xx += 5) { - for (let yy = 2; yy < height; yy += 5) { - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(xx, yy))) { - KinkyDungeonMapSet(xx, yy, '0'); - KinkyDungeonTilesSet((xx) + "," + (yy), Object.assign(KinkyDungeonTilesGet((xx) + "," + (yy)) || {}, {Light: 6, Skin: "LightRaysDoll"})); - } - - } - } - - let dollCount = 10; - // Generate dolls in the inside - for (let i = 0; i < dollCount; i++) { - let XX = CellX + 1 + Math.round(KDRandom() * (CellWidth-3)); - let YY = CellY + 1 + Math.round(KDRandom() * (CellHeight-3)); - let entity = KinkyDungeonEntityAt(XX, YY); - if (entity || (XX == width/2 && YY == height/2)) continue; - let Enemy = KinkyDungeonGetEnemy(["bellowsDoll"], MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', ["doll", "peaceful"]); - if (Enemy) { - let e = DialogueCreateEnemy(XX, YY, Enemy.name); - if (KDRandom() < 0.33) KDTieUpEnemy(e, 15 + Math.floor(45 * KDRandom()), "Tape"); - else if (KDRandom() < 0.32) KDTieUpEnemy(e, 15 + Math.floor(45 * KDRandom()), "Slime"); - else if (KDRandom() < 0.34) KDTieUpEnemy(e, 15 + Math.floor(45 * KDRandom()), "Metal"); - if (e.boundLevel > 0 && KDRandom() < 0.33) e.hp = 0.5; - } - } - - KDGameData.JailPoints.push({x: width/2, y: height/2, type: "dropoff", radius: 1}); - - let takenIndex = 0; - let takenRight = false; - if (KDRandom() < 0.5) { - // Left side - let cavityNum = Math.floor(KDRandom()*leftPassages.length); - takenIndex = cavityNum; - KinkyDungeonEndPosition = {x: cavityStart - leftPassages[cavityNum], y: 1 + 3 * cavityNum}; - } else { - // Right side - let cavityNum = Math.floor(KDRandom()*rightPassages.length); - takenIndex = cavityNum; - takenRight = true; - KinkyDungeonEndPosition = {x: cavityStart - cavityEnd + CellX + CellWidth + rightPassages[cavityNum] - 1, y: 1 + 3 * cavityNum}; - } - if (KDRandom() < 0.5) { - // Left side - let cavityNum = Math.floor(KDRandom()*leftPassages.length); - if (!takenRight && takenIndex == cavityNum) { - if (cavityNum > 0) cavityNum -= 1; - else cavityNum += 1; - } - KinkyDungeonStartPosition = {x: cavityStart - leftPassages[cavityNum], y: 2 + 3 * cavityNum}; - } else { - // Right side - let cavityNum = Math.floor(KDRandom()*rightPassages.length); - if (takenRight && takenIndex == cavityNum) { - if (cavityNum > 0) cavityNum -= 1; - else cavityNum += 1; - } - - KinkyDungeonStartPosition = {x: cavityStart - cavityEnd + CellX + CellWidth + rightPassages[cavityNum] - 1, y: 2 + 3 * cavityNum}; - } - - let exitGuardTags = ["robot"]; KinkyDungeonAddTags(exitGuardTags, MiniGameKinkyDungeonLevel); - if (KDGameData.DollRoomCount > 0) exitGuardTags.push("open"); // Allow spawning an Enforcer unit - let robotTags = ["robot"]; KinkyDungeonAddTags(robotTags, MiniGameKinkyDungeonLevel); - let eliteTags = ["robot"]; KinkyDungeonAddTags(eliteTags, MiniGameKinkyDungeonLevel); - - let robotCount = 5 + Math.min(10, KinkyDungeonDifficulty/10 + MiniGameKinkyDungeonLevel/3) + 5 * (KDGameData.DollRoomCount || 0); - // Generate robots in the outside - for (let i = 0; i < robotCount; i++) { - let XX = i % 2 == 0 ? - (cavityStart + Math.round(KDRandom() * (CellX - cavityStart - 1))) - : (CellX + CellWidth + 1 + Math.round(KDRandom() * (cavityStart - 2 - cavityEnd))); - let YY = CellY + 1 + Math.round(KDRandom() * (CellHeight-2)); - let entity = KinkyDungeonEntityAt(XX, YY); - if (entity || (XX == width/2 && YY == height/2)) continue; - let Enemy = KinkyDungeonGetEnemy(robotTags, MiniGameKinkyDungeonLevel + 3, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', ["robot"], undefined, undefined); - if (Enemy) { - let e = DialogueCreateEnemy(XX, YY, Enemy.name); - e.faction = "Enemy"; - } - } - if (KDGameData.DollRoomCount > 1) { // Spawn a group of AIs - for (let i = 0; i < 1 + Math.ceil(robotCount * 0.1); i++) { - let point = KinkyDungeonGetNearbyPoint(KinkyDungeonEndPosition.x, KinkyDungeonEndPosition.y); - let Enemy = KinkyDungeonGetEnemy(eliteTags, MiniGameKinkyDungeonLevel + 4, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', ["robot"], - undefined, undefined, ["minor", "miniboss", "noguard"]); - if (Enemy) { - let e = DialogueCreateEnemy(point.x, point.y, Enemy.name); - e.faction = "Enemy"; - e.AI = "looseguard"; - } - } - } - - let ExitGuard = KinkyDungeonGetEnemy(exitGuardTags, MiniGameKinkyDungeonLevel + 10, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', ["robot", "dollRoomBoss"], - undefined, undefined, ["noguard"]); - if (ExitGuard) { - let e = DialogueCreateEnemy(KinkyDungeonEndPosition.x, KinkyDungeonEndPosition.y, ExitGuard.name); - e.faction = "Enemy"; - e.AI = "verylooseguard"; - } - - KinkyDungeonPatrolPoints.push({x: CellX - 2, y: CellY - 2}); - KinkyDungeonPatrolPoints.push({x: CellX - 2, y: CellY + 2 + CellHeight}); - KinkyDungeonPatrolPoints.push({x: CellX + 2 + CellWidth, y: CellY + 2 + CellHeight}); - KinkyDungeonPatrolPoints.push({x: CellX + 2 + CellWidth, y: CellY - 2}); - - - - KinkyDungeonMapSet(KinkyDungeonEndPosition.x, KinkyDungeonEndPosition.y, 's'); - if (KDGameData.DollRoomCount > 0) - KinkyDungeonMapSet(KinkyDungeonStartPosition.x, KinkyDungeonStartPosition.y, 'S'); -} - - -function KinkyDungeonCreateDollmaker(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { - // Variable setup - KinkyDungeonSetFlag("NoDollRoomBypass", -1, 1); - - // Now we STRETCH the map - KinkyDungeonGridWidth = Math.floor(KinkyDungeonGridWidth*2); - KinkyDungeonGridHeight = Math.floor(KinkyDungeonGridHeight*2); - KinkyDungeonGrid = ""; - - width = KinkyDungeonGridWidth; - height = KinkyDungeonGridHeight; - - // Generate the grid - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - for (let X = 0; X < KinkyDungeonGridWidth; X++) - KinkyDungeonGrid = KinkyDungeonGrid + '1'; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } - - - // Create the doll cell itself - let cavitywidth = 21; - let cavityheight = 21; - let cavityStart = 2; - - KinkyDungeonStartPosition = {x: cavityStart, y: 1 + Math.floor(cavityheight/2)}; - - // Hollow out a greater cell area - KinkyDungeonCreateRectangle(cavityStart, 0, cavitywidth, cavityheight, false, false, false, false); - - KD_PasteTile(KDMapTilesList.Arena_Dollmaker, cavityStart, 1, data); - - DialogueCreateEnemy(KinkyDungeonStartPosition.x + Math.floor(cavityheight/2), KinkyDungeonStartPosition.y, "DollmakerBoss1"); - - KinkyDungeonEndPosition = {x: KinkyDungeonStartPosition.x + cavitywidth, y: KinkyDungeonStartPosition.y}; - - KinkyDungeonMapSet(KinkyDungeonEndPosition.x, KinkyDungeonEndPosition.y, 's'); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x, KinkyDungeonStartPosition.y, 'S'); -} - -function KinkyDungeonCreateTunnel(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { - // Variable setup - - KinkyDungeonCreateRectangle(0, 0, width, height, true, true, false, false); - - // Starting rectangle - KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y - 1, width - 3, 2, false, false, false, false); - // Main passage - KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y, width - 2, 1, false, false, false, false); - - // Create the two branching hallways - let b1 = 3 + Math.floor(KDRandom() * (width-7)); - let b2 = 4 + Math.floor(KDRandom() * (width-6)); - - let y1 = VisitedRooms[0].y > 4 ? 1 : VisitedRooms[0].y; - let h1 = VisitedRooms[0].y > 4 ? Math.abs(y1 - VisitedRooms[0].y) : height - VisitedRooms[0].y - 1; - - let y2 = VisitedRooms[0].y < height - 4 ? VisitedRooms[0].y : 1; - let h2 = VisitedRooms[0].y < height - 4 ? Math.abs(height - 1 - VisitedRooms[0].y) : VisitedRooms[0].y - 1; - - if (Math.abs(b1 - b2) < 2) { - if (b1 < width - 4) b2 = b1 + 2; - else b2 = b1 - 2; - } - - KinkyDungeonCreateRectangle(b1, y1, 1, h1, false, false, false, false); - KinkyDungeonCreateRectangle(b2, y2, 1, h2, false, false, false, false); - - - /* - // Add the prison - let py = (VisitedRooms[0].y < height - 5 ? height - 3 : 3); - POI.push({x: 2*VisitedRooms[0].x + 4, y: 2*py, requireTags: [], favor: ["GuaranteedCell"], used: false}); - KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false); - KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), b2-2, 1, false, false, false, false); - KinkyDungeonCreateRectangle(b2, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false);*/ - - - // Now we STRETCH the map - let KinkyDungeonOldGrid = KinkyDungeonGrid; - let w = KinkyDungeonGridWidth; - let h = KinkyDungeonGridHeight; - KinkyDungeonGridWidth = Math.floor(KinkyDungeonGridWidth*2); - KinkyDungeonGridHeight = Math.floor(KinkyDungeonGridHeight*2); - KinkyDungeonGrid = ""; - - // Generate the grid - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - for (let X = 0; X < KinkyDungeonGridWidth; X++) - KinkyDungeonGrid = KinkyDungeonGrid + KinkyDungeonOldGrid[Math.floor(X * w / KinkyDungeonGridWidth) + Math.floor(Y * h / KinkyDungeonGridHeight)*(w+1)]; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } - - // Place a shop and a Leyline Tap - - //KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 + 1, 'A'); - //KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Shrine", Name: "Will"}); - - // Removing shrine and leyline and putting in perk room instead - /* - KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 + 1, 'l'); - KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 + 1), {Leyline: true, Light: KDLeylineLight, lightColor: KDLeylineLightColor}); - - KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 - 2, 'A'); - KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 - 2), {Type: "Shrine", Name: "Commerce"}); - - // Place lost items chest - if (KinkyDungeonLostItems.length > 0) - KDChest(VisitedRooms[0].x*2 + 0, VisitedRooms[0].y*2 - 2, "lost_items");*/ - - // Place the exit stairs - - let boss = KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel + 1); - let mods = !boss ? KDGetMapGenList(3, KDMapMods) : ["None", "None", "None"]; - if (!boss) { - let exit1 = mods[0].name; - KinkyDungeonMapSet(b1*2, VisitedRooms[0].y > 4 ? 2 : height*2 - 3, 's'); - KinkyDungeonMapSet(b1*2 + 1, VisitedRooms[0].y > 4 ? 2 : height*2 - 3, 'G'); - KinkyDungeonTilesSet("" + (b1*2) + "," + (VisitedRooms[0].y > 4 ? 2 : height*2 - 3), {MapMod: exit1}); - KinkyDungeonTilesSet("" + (b1*2 + 1) + "," + (VisitedRooms[0].y > 4 ? 2 : height*2 - 3), {Type: "Ghost", Msg: "MapMod" + exit1}); - - let exit2 = mods[1].name; - KinkyDungeonMapSet(b2*2 + 1, VisitedRooms[0].y < height - 4 ? height*2 - 3 : 2, 's'); - KinkyDungeonMapSet(b2*2, VisitedRooms[0].y < height - 4 ? height*2 - 3 : 2, 'G'); - KinkyDungeonTilesSet("" + (b2*2 + 1) + "," + (VisitedRooms[0].y < height - 4 ? height*2 - 3 : 2), {MapMod: exit2}); - KinkyDungeonTilesSet("" + (b2*2) + "," + (VisitedRooms[0].y < height - 4 ? height*2 - 3 : 2), {Type: "Ghost", Msg: "MapMod" + exit2}); - } - - let exit3 = boss ? "Boss" : mods[2].name; - KinkyDungeonMapSet(width*2 - 2, VisitedRooms[0].y*2, 's'); - KinkyDungeonMapSet(width*2 - 2, VisitedRooms[0].y*2 + 1, 'G'); - if (!boss) - KinkyDungeonTilesSet("" + (width*2 - 2) + "," + (VisitedRooms[0].y*2), {MapMod: exit3}); - KinkyDungeonTilesSet("" + (width*2 - 2) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "MapMod" + exit3}); - - KinkyDungeonEndPosition = {x: width*2 - 2, y: VisitedRooms[0].y*2}; - - // Place quest NPCs - let quests = KDQuestList(2 + Math.round(KDRandom()), KDQuests, "Tunnel", ""); - for (let q of quests) { - if (q.npc) - KinkyDungeonSummonEnemy(KinkyDungeonStartPosition.x, KinkyDungeonStartPosition.y, q.npc, 1, 14, true); - } -} - - -function KinkyDungeonCreatePerkRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { - // Variable setup - - KinkyDungeonCreateRectangle(0, 0, width, height, true, true, false, false); - - KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y - 1, 2, 2, false, false, false, false); - KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y, width - 2, 1, false, false, false, false); - - // Create the two branching hallways - let b1 = 3 + Math.floor(KDRandom() * (width-7)); - let b2 = 4 + Math.floor(KDRandom() * (width-6)); - - if (Math.abs(b1 - b2) < 2) { - if (b1 < width - 4) b2 = b1 + 2; - else b2 = b1 - 2; - } - - // Now we STRETCH the map - let KinkyDungeonOldGrid = KinkyDungeonGrid; - let w = KinkyDungeonGridWidth; - let h = KinkyDungeonGridHeight; - KinkyDungeonGridWidth = Math.floor(KinkyDungeonGridWidth*2); - KinkyDungeonGridHeight = Math.floor(KinkyDungeonGridHeight*2); - KinkyDungeonGrid = ""; - - // Generate the grid - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - for (let X = 0; X < KinkyDungeonGridWidth; X++) - KinkyDungeonGrid = KinkyDungeonGrid + KinkyDungeonOldGrid[Math.floor(X * w / KinkyDungeonGridWidth) + Math.floor(Y * h / KinkyDungeonGridHeight)*(w+1)]; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } - - // Place a shop and a Leyline Tap - KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 + 1, 'l'); - KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 + 1), {Leyline: true, Light: KDLeylineLight, lightColor: KDLeylineLightColor}); - - if (KinkyDungeonFlags.get("SpawnMap")) { - if (KinkyDungeonSpells.filter((spell) => {return spell.name == "ManaPoolUp";}).length < Math.ceil(MiniGameKinkyDungeonLevel/4)) - KinkyDungeonGroundItems.push({x:VisitedRooms[0].x*2 + 3, y:(VisitedRooms[0].y*2), name: "LeylineMap"}); - KinkyDungeonSetFlag("SpawnMap", -1); - } - - KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 - 2, 'A'); - KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 - 2), {Type: "Shrine", Name: "Commerce"}); - - // Create the perk altars - let py = VisitedRooms[0].y*2 - 2; - let p1x = VisitedRooms[0].x*2 + 5; - KinkyDungeonCreateRectangle(p1x, py, 5, 2, false, false, false, false); - - POI.push({x: VisitedRooms[0].x*2 + 7, y: VisitedRooms[0].y*2, requireTags: [], favor: ["PearlChest"], used: false}); - - let perkCount = 3; - /** @type {Record} */ - let perks = {}; - for (let i = 0; i < perkCount; i++) { - let newperks = KDGetRandomPerks(perks); - if (newperks.length > 0) { - KinkyDungeonMapSet(p1x + i * 2, py, 'P'); - KinkyDungeonTilesSet("" + (p1x + i * 2) + "," + (py), {Perks: newperks}); - for (let p of newperks) { - perks[p] = true; - } - } - } - - // Place lost items chest - if (KinkyDungeonLostItems.length > 0) - KDChest(VisitedRooms[0].x*2 + 0, VisitedRooms[0].y*2 - 2, "lost_items"); - - // Place the exit stairs - KinkyDungeonMapSet(width*2 - 2, VisitedRooms[0].y*2, 's'); - KinkyDungeonTilesSet("" + (width*2 - 2) + "," + (VisitedRooms[0].y*2), {RoomType: "Tunnel"}); - - KinkyDungeonEndPosition = {x: width*2 - 2, y: VisitedRooms[0].y*2}; -} - - -function KinkyDungeonCreateJourneyFloor(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { - // Variable setup - - KinkyDungeonStartPosition = {x: 2, y: height}; - VisitedRooms[0].x = 1; - VisitedRooms[0].y = Math.floor(height/2); - - KinkyDungeonCreateRectangle(0, 0, width, height, true, true, false, false); - - KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y - 1, 2, 2, false, false, false, false); - KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y, 6, 1, false, false, false, false); - - // Create a branching room for journeys - let b1 = 4; - KinkyDungeonCreateRectangle(b1, VisitedRooms[0].y - 3, width - b1, 2, false, false, false, false); - KinkyDungeonCreateRectangle(b1, VisitedRooms[0].y - 3, 1, 3, false, false, false, false); - - /* - // Add the prison - let py = (VisitedRooms[0].y < height - 5 ? height - 3 : 3); - POI.push({x: 2*VisitedRooms[0].x + 4, y: 2*py, requireTags: [], favor: ["GuaranteedCell"], used: false}); - KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false); - KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), b2-2, 1, false, false, false, false); - KinkyDungeonCreateRectangle(b2, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false);*/ - - - // Now we STRETCH the map - let KinkyDungeonOldGrid = KinkyDungeonGrid; - let w = KinkyDungeonGridWidth; - let h = KinkyDungeonGridHeight; - KinkyDungeonGridWidth = Math.floor(KinkyDungeonGridWidth*2); - KinkyDungeonGridHeight = Math.floor(KinkyDungeonGridHeight*2); - KinkyDungeonGrid = ""; - - // Generate the grid - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - for (let X = 0; X < KinkyDungeonGridWidth; X++) - KinkyDungeonGrid = KinkyDungeonGrid + KinkyDungeonOldGrid[Math.floor(X * w / KinkyDungeonGridWidth) + Math.floor(Y * h / KinkyDungeonGridHeight)*(w+1)]; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } - - // Normal end stairs - KinkyDungeonMapSet(b1*2 + 5, VisitedRooms[0].y*2, 's'); - KinkyDungeonMapSet(b1*2 + 5, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (b1*2 + 5) + "," + (VisitedRooms[0].y*2), {Journey: undefined}); - KinkyDungeonTilesSet("" + (b1*2 + 5) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "JourneyNone"}); - - // Tutorial end stairs - KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 - 2, 's'); - KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 - 1, 'G'); - KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 - 2), {RoomType: "Tutorial"}); - KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 - 1), {Type: "Ghost", Msg: "JourneyTutorial"}); - - // Place journey stairs - let x = b1 * 2; - let i = 0; - while (x < width*2-2) { - if (KDJourneyList[i]) { - KinkyDungeonMapSet(x, VisitedRooms[0].y*2 - 6, 's'); - KinkyDungeonMapSet(x, VisitedRooms[0].y*2 - 5, 'G'); - KinkyDungeonTilesSet("" + (x) + "," + (VisitedRooms[0].y*2 - 6), {Journey: KDJourneyList[i], MapMod: KDJourneyMapMod[KDJourneyList[i]] ? KDGetMapGenList(1, KDMapMods)[0].name : undefined}); - KinkyDungeonTilesSet("" + (x) + "," + (VisitedRooms[0].y*2 - 5), {Type: "Ghost", Msg: "Journey" + KDJourneyList[i]}); - } - i++; - x += 2; - } - - KinkyDungeonEndPosition = {x: b1*2 + 5, y: VisitedRooms[0].y*2}; -} - - -function KinkyDungeonCreateShopStart(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { - // Variable setup - - KinkyDungeonStartPosition = {x: 2, y: height}; - VisitedRooms[0].x = 1; - VisitedRooms[0].y = Math.floor(height/2); - - KinkyDungeonCreateRectangle(0, 0, width, height, true, true, false, false); - - KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y - 1, 4, 2, false, false, false, false); - KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y, 6, 1, false, false, false, false); - - let b1 = 4; - - - // Now we STRETCH the map - let KinkyDungeonOldGrid = KinkyDungeonGrid; - let w = KinkyDungeonGridWidth; - let h = KinkyDungeonGridHeight; - KinkyDungeonGridWidth = Math.floor(KinkyDungeonGridWidth*2); - KinkyDungeonGridHeight = Math.floor(KinkyDungeonGridHeight*2); - KinkyDungeonGrid = ""; - - // Generate the grid - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - for (let X = 0; X < KinkyDungeonGridWidth; X++) - KinkyDungeonGrid = KinkyDungeonGrid + KinkyDungeonOldGrid[Math.floor(X * w / KinkyDungeonGridWidth) + Math.floor(Y * h / KinkyDungeonGridHeight)*(w+1)]; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } - - KD_PasteTile(KDMapTilesList.ShopStart, KinkyDungeonStartPosition.x, KinkyDungeonStartPosition.y - 4, data); - - DialogueCreateEnemy(KinkyDungeonStartPosition.x + 5, KinkyDungeonStartPosition.y, "ShopkeeperStart"); - - // Normal end stairs - KinkyDungeonMapSet(b1*2 + 7, VisitedRooms[0].y*2, 's'); - if (MiniGameKinkyDungeonLevel == 0) - KinkyDungeonTilesSet("" + (b1*2 + 7) + "," + (VisitedRooms[0].y*2), {RoomType: "JourneyFloor"}); - - KinkyDungeonEndPosition = {x: b1*2 + 5, y: VisitedRooms[0].y*2}; -} - - -function KinkyDungeonCreateTestTile(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { - // Variable setup - - KinkyDungeonStartPosition = {x: 2, y: height}; - VisitedRooms[0].x = 1; - VisitedRooms[0].y = Math.floor(height/2); - - KinkyDungeonCreateRectangle(0, 0, width, height, false, false, false, false); - - let b1 = 4; - - - // Now we STRETCH the map - let KinkyDungeonOldGrid = KinkyDungeonGrid; - let w = KinkyDungeonGridWidth; - let h = KinkyDungeonGridHeight; - KinkyDungeonGridWidth = Math.floor(KinkyDungeonGridWidth*2); - KinkyDungeonGridHeight = Math.floor(KinkyDungeonGridHeight*2); - KinkyDungeonGrid = ""; - - // Generate the grid - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - for (let X = 0; X < KinkyDungeonGridWidth; X++) - KinkyDungeonGrid = KinkyDungeonGrid + KinkyDungeonOldGrid[Math.floor(X * w / KinkyDungeonGridWidth) + Math.floor(Y * h / KinkyDungeonGridHeight)*(w+1)]; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } - - KD_PasteTile(KDTileToTest, KinkyDungeonStartPosition.x + 4, 3, data); - - - KinkyDungeonEndPosition = {x: b1*2 + 5, y: VisitedRooms[0].y*2}; -} - - -function KinkyDungeonCreateTutorial(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { - // Variable setup - - KinkyDungeonStartPosition = {x: 2, y: height}; - VisitedRooms[0].x = 1; - VisitedRooms[0].y = Math.floor(height/2); - - KinkyDungeonCreateRectangle(0, 0, width, height, true, true, false, false); - - KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y - 1, 2, 2, false, false, false, false); - KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y, width, 1, false, false, false, false); - - - /* - // Add the prison - let py = (VisitedRooms[0].y < height - 5 ? height - 3 : 3); - POI.push({x: 2*VisitedRooms[0].x + 4, y: 2*py, requireTags: [], favor: ["GuaranteedCell"], used: false}); - KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false); - KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), b2-2, 1, false, false, false, false); - KinkyDungeonCreateRectangle(b2, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false);*/ - - - // Now we STRETCH the map - let KinkyDungeonOldGrid = KinkyDungeonGrid; - let w = KinkyDungeonGridWidth; - let h = KinkyDungeonGridHeight; - KinkyDungeonGridWidth = Math.floor(KinkyDungeonGridWidth*2); - KinkyDungeonGridHeight = Math.floor(KinkyDungeonGridHeight*2); - KinkyDungeonGrid = ""; - - // Generate the grid - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - for (let X = 0; X < KinkyDungeonGridWidth; X++) - KinkyDungeonGrid = KinkyDungeonGrid + KinkyDungeonOldGrid[Math.floor(X * w / KinkyDungeonGridWidth) + Math.floor(Y * h / KinkyDungeonGridHeight)*(w+1)]; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } - - // Normal end stairs - KinkyDungeonMapSet(width*2 - 2, VisitedRooms[0].y*2, 's'); - KinkyDungeonMapSet(width*2 - 2, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (width*2 - 2) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "TutorialCongrats"}); - - // Tutorial start - KinkyDungeonMapSet(VisitedRooms[0].x + 3, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (VisitedRooms[0].x + 3) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial0"}); - - // Barrels - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + 7, 3, 2, height*2, false, false, false, false); - KinkyDungeonMapSet(VisitedRooms[0].x + 7, VisitedRooms[0].y*2, 'L'); - KinkyDungeonMapSet(VisitedRooms[0].x + 7, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (VisitedRooms[0].x + 7) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Dialogue: "Tutorial1"}); - - // Stats - KinkyDungeonMapSet(VisitedRooms[0].x + 11, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (VisitedRooms[0].x + 11) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2"}); - - // SP - let xx = 13; - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx + 4, 3, 2, 2, false, false, false, false); - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx + 4, 3, 1, 5, false, false, false, false); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx + 4, 5, 'd'); - KinkyDungeonTilesSet((KinkyDungeonStartPosition.x + xx + 4) + "," + 5, { - Type: "Door", - }); - KinkyDungeonGroundItems.push({x:KinkyDungeonStartPosition.x + xx + 4, y:4, name: "PotionWill"}); - - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx, 3, 2, 2, false, false, false, false); - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx, 3, 1, 5, false, false, false, false); - KinkyDungeonGroundItems.push({x:KinkyDungeonStartPosition.x + xx, y:4, name: "PotionWill"}); - KinkyDungeonMapSet(VisitedRooms[0].x + xx + 1, 5, 'T'); - KinkyDungeonTilesSet((VisitedRooms[0].x + xx + 1) + "," + 5, { - Type: "Trap", - Trap: "SpecificSpell", - noVary: true, - Spell: "TrapSCloud", - }); - KinkyDungeonMapSet(VisitedRooms[0].x + xx + 3, VisitedRooms[0].y*2, 'T'); - KinkyDungeonTilesSet((VisitedRooms[0].x + xx + 3) + "," + (VisitedRooms[0].y*2), { - Type: "Trap", - Trap: "SpecificSpell", - noVary: true, - Spell: "TrapSCloud", - }); - KinkyDungeonMapSet(VisitedRooms[0].x + xx + 3, VisitedRooms[0].y*2 + 1, 'T'); - KinkyDungeonTilesSet((VisitedRooms[0].x + xx + 3) + "," + (VisitedRooms[0].y*2 + 1), { - Type: "Trap", - Trap: "SpecificSpell", - noVary: true, - Spell: "TrapSCloud", - }); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx - 1, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx - 1) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_sp1"}); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx + 1, 3, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx + 1) + "," + (3), {Type: "Ghost", Msg: "Tutorial2_sp2"}); - KinkyDungeonMapSet(VisitedRooms[0].x + xx + 4, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (VisitedRooms[0].x + xx + 4) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_sp3"}); - - - // MP - xx = 22; - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx, 3, 2, 2, false, false, false, false); - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx, 3, 1, 5, false, false, false, false); - KinkyDungeonGroundItems.push({x:KinkyDungeonStartPosition.x + xx, y:4, name: "PotionMana"}); - KinkyDungeonMapSet(VisitedRooms[0].x + xx + 1, 5, 'd'); - KinkyDungeonTilesSet((VisitedRooms[0].x + xx + 1) + "," + 5, { - Type: "Door", - }); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx - 5, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx - 5) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_mp1"}); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx - 3, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx - 3) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_mp2"}); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx - 1, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx - 1) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Dialogue: "Tutorial2_mp3"}); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx + 2, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx + 2) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_mp4"}); - - - // DP - xx = 28; - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx, 3, 7, 2, false, false, false, false); - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx, 3, 1, 5, false, false, false, false); - KinkyDungeonGroundItems.push({x:KinkyDungeonStartPosition.x + xx, y:4, name: "PotionFrigid"}); - KinkyDungeonMapSet(VisitedRooms[0].x + xx + 1, 5, 'T'); - KinkyDungeonTilesSet((VisitedRooms[0].x + xx + 1) + "," + 5, { - Type: "Trap", - Trap: "SpecificSpell", - noVary: true, - Spell: "TrapLustCloud", - }); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx - 1, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx - 1) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_dp1"}); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx + 1, 3, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx + 1) + "," + (3), {Type: "Ghost", Dialogue: "Tutorial2_dp2"}); - - - // Struggle - xx = 36; - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx, 3, 5, 2, false, false, false, false); - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx, 3, 1, 5, false, false, false, false); - KinkyDungeonGroundItems.push({x:KinkyDungeonStartPosition.x + xx + 4, y:4, name: "RedKey"}); - - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx - 1, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx - 1) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial3_1"}); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx + 4, 3, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx + 4) + "," + (3), {Type: "Ghost", Msg: "Tutorial3_2"}); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx + 1, 3, 'C'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx + 1) + "," + (3), {Loot: "tutorial1", Roll: KDRandom()}); - - // Struggle - xx = 43; - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx, 3, 5, 2, false, false, false, false); - KinkyDungeonCreateRectangle(KinkyDungeonStartPosition.x + xx, 3, 1, 5, false, false, false, false); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx + 4, 4, '?'); - - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx - 1, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx - 1) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial3_3"}); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx + 4, 3, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx + 4) + "," + (3), {Type: "Ghost", Msg: "Tutorial3_4"}); - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx, 3, 'C'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx) + "," + (3), {Loot: "tutorial2", Roll: KDRandom()}); - - // END - - - KinkyDungeonMapSet(KinkyDungeonStartPosition.x + xx + 4, VisitedRooms[0].y*2 + 1, 'G'); - KinkyDungeonTilesSet("" + (KinkyDungeonStartPosition.x + xx + 4) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial4"}); - - DialogueCreateEnemy(width*2 - 7, VisitedRooms[0].y*2, "FastZombie").AI = "guard"; - DialogueCreateEnemy(width*2 - 5, VisitedRooms[0].y*2 + 1, "FastZombie").AI = "guard"; - DialogueCreateEnemy(width*2 - 3, VisitedRooms[0].y*2, "FastZombie").AI = "guard"; - DialogueCreateEnemy(width*2 - 3, VisitedRooms[0].y*2 + 1, "BlindZombie").AI = "guard"; - - KinkyDungeonMapSet(width*2 - 5, VisitedRooms[0].y*2, 'C'); - KinkyDungeonTilesSet("" + (width*2 - 5) + "," + (VisitedRooms[0].y*2), {Loot: "silver", Roll: KDRandom()}); - KinkyDungeonMapSet(width*2 - 6, VisitedRooms[0].y*2, 'C'); - KinkyDungeonTilesSet("" + (width*2 - 6) + "," + (VisitedRooms[0].y*2), {Loot: "chest", Roll: KDRandom()}); - - KinkyDungeonEndPosition = {x: width*2 - 2, y: VisitedRooms[0].y*2}; -} \ No newline at end of file diff --git a/Game/KinkyDungeonBones.js b/Game/KinkyDungeonBones.js deleted file mode 100644 index 1ce2b3849..000000000 --- a/Game/KinkyDungeonBones.js +++ /dev/null @@ -1,123 +0,0 @@ -"use strict"; - -let KinkyDungeonBones = { - -}; - -let KDPatronAdventurers = [ -]; - -let KDPatronCustomEnemies = new Map([ - ["Wolfgirl", [ - {name: "Sivasa", color: "#9c2a70", prisoner: false, free: true, customSprite: ""}, - {name: "Alexandra", color: "#6241e1", prisoner: true, free: true, customSprite: ""}, - {name: "Nekora", color: "#42a459", prisoner: true, free: true, customSprite: ""}, - {name: "Emeia", color: "#00A7FF", prisoner: true, free: true, customSprite: ""}, - {name: "Dana", color: "#4444ff", prisoner: true, free: true, customSprite: ""}, - {name: "Yami", color: "#88ff88", prisoner: true, free: true, customSprite: ""}, - {name: "Animi", color: "#ff9999", prisoner: true, free: false, customSprite: ""}, - {name: "Ladica", color: "#44ff44", prisoner: false, free: true, customSprite: ""}, - ], - ], - ["WolfgirlPet", [ - {name: "Demetria", color: "#c9d4fd", prisoner: true, free: false, customSprite: ""}, - {name: "Arii", color: "#ff88ff", prisoner: true, free: true, customSprite: ""}, - ], - ], - ["Nurse", [ - {name: "Rena", color: "#a452ff", prisoner: true, free: true, customSprite: ""}, - {name: "Str Nurse", color: "#ffffff", prisoner: false, free: true, customSprite: ""}, - ], - ], - ["ElementalLatex", [ - {name: "Samsy", color: "#2f847f", prisoner: false, free: true, customSprite: ""}, - ], - ], - ["Dragon", [ - {name: "Garss", color: "#ff8888", prisoner: true, free: false, customSprite: ""}, - ], - ], - ["DragonLeaderDuelist", [ - {name: "Kaitlyn", color: "#ff5555", prisoner: true, free: true, customSprite: ""}, - ], - ], - ["SlimeAdv", [ - {name: "Rena", color: "#C8C8FF", prisoner: true, free: true, customSprite: ""}, - {name: "Rappy The Toy", color: "#C759FF", prisoner: true, free: false, customSprite: ""}, - ], - ], - ["SmallSlime", [ - {name: "TY", color: "#ff5555", prisoner: false, free: true, customSprite: ""}, - ], - ], - ["WitchRope", [ - {name: "Kamikaze roper", color: "#ffae70", prisoner: true, free: false, customSprite: ""}, - ], - ], - ["MaidforceStalker", [ - {name: "Chandra", color: "#340000", prisoner: true, free: true, customSprite: ""}, - ], - ], - ["ApprenticeSlime", [ - {name: "Gabrielle", color: "#ffff00", prisoner: true, free: true, customSprite: ""}, - ], - ], - ["Alchemist", [ - {name: "Morgan", color: "#6241e1", prisoner: true, free: true, customSprite: ""}, - {name: "Myth", color: "#22ffff", prisoner: false, free: true, customSprite: ""}, - ], - ], - ["Dressmaker", [ - {name: "A Lazy Dressmaker", color: "#fad6ff", prisoner: true, free: true, customSprite: ""}, - ], - ], - ["Maidforce", [ - {name: "Ester", color: "#97edca", prisoner: true, free: false, customSprite: ""}, - {name: "Rest", color: "#999999", prisoner: false, free: true, customSprite: ""}, - {name: "Rika Mercury", color: "#92e8e5", prisoner: true, free: false, customSprite: ""}, - {name: "Maidlinmo", color: "#ff5555", prisoner: true, free: true, customSprite: ""}, - {name: "April", color: "#4444ff", prisoner: true, free: true, customSprite: ""}, - ], - ], - ["WitchFlame", [ - {name: "Myrtrice", color: "#d30000", prisoner: false, free: true, customSprite: "Myrtrice"}, - ], - ], - ["BanditPet", [ - {name: "Liz", color: "#d480bb", prisoner: true, free: true, customSprite: ""}, - {name: "Jinxy", color: "#7d27a5", prisoner: true, free: true, customSprite: ""}, - {name: "Genna", color: "#42bfe8", prisoner: true, free: true, customSprite: ""}, - ], - ], - ["ElfRanger", [ - {name: "Valeria", color: "#ebaaf4", prisoner: true, free: true, customSprite: ""}, - ], - ], - ["Elf", [ - {name: "Ferahla", color: "#44ff44", prisoner: true, free: true, customSprite: ""}, - ], - ], - ["Dollsmith", [ - {name: "Kiera", color: "#310051", prisoner: false, free: true, customSprite: ""}, - ], - ], -]); - -/** - * - * @param {enemy} Enemy - * @param {entity} e - */ -function KDProcessCustomPatron(Enemy, e) { - if (KDPatronCustomEnemies.get(Enemy.name) && KDRandom() < 0.05) { - let customs = KDPatronCustomEnemies.get(Enemy.name).filter((element) => { - return (element.prisoner && Enemy.specialdialogue && Enemy.specialdialogue.includes("Prisoner")) || (element.free && !Enemy.specialdialogue); - }); - if (customs.length > 0) { - let custom = customs[Math.floor(customs.length * KDRandom())]; - e.CustomName = custom.name; - e.CustomNameColor = custom.color; - e.CustomSprite = custom.customSprite; - } - } -} \ No newline at end of file diff --git a/Game/KinkyDungeonBoss.js b/Game/KinkyDungeonBoss.js deleted file mode 100644 index a22a2941e..000000000 --- a/Game/KinkyDungeonBoss.js +++ /dev/null @@ -1,63 +0,0 @@ -"use strict"; - -let bosses = { - "Fuuka": { - boss: "Fuuka", - bossroom: true, - width: 13, - height: 13, - setpieces: { - "GuaranteedCell": 1000, - "FuukaAltar": 1000, - }, - genType: "Chamber", - spawns: false, - chests: false, - shrines: true, - chargers: true, - torches: true, - heart: false, - specialtiles: true, - shortcut: false, - enemies: false, - nokeys: true, - nojail: false, - }, - - "Dollmaker": { - boss: "Dollmaker", - bossroom: true, - jailType: "dollsmith", - guardType: "dollsmith", - width: 21, - height: 21, - setpieces: { - }, - genType: "Dollmaker", - spawns: false, - chests: false, - shrines: false, - noWear: true, - chargers: false, - notorches: true, - heart: false, - specialtiles: true, - shortcut: false, - enemies: false, - nokeys: true, - nojail: true, - noClutter: true, - nostairs: true, - nostartstairs: true, - nobrick: true, - nolore: true, - skin: 'bel', - noboring: true, // Skip generating boringness - }, -}; - -function KinkyDungeonBossFloor(Floor) { - if (Floor == 4) return bosses.Fuuka; - if (Floor == 20) return bosses.Dollmaker; - return null; -} \ No newline at end of file diff --git a/Game/KinkyDungeonBuffs.js b/Game/KinkyDungeonBuffs.js deleted file mode 100644 index 43d719768..000000000 --- a/Game/KinkyDungeonBuffs.js +++ /dev/null @@ -1,236 +0,0 @@ -"use strict"; - -function KinkyDungeonSendBuffEvent(Event, data) { - if (!KDMapHasEvent(KDEventMapBuff, Event)) return; - for (let buff of Object.values(KinkyDungeonPlayerBuffs)) { - if (buff && buff.events) { - for (let e of buff.events) { - if (e.trigger == Event) { - KinkyDungeonHandleBuffEvent(Event, e, buff, KinkyDungeonPlayerEntity, data); - } - } - } - } - for (let ent of KinkyDungeonEntities) { - if (ent.buffs) { - for (let buff of Object.values(ent.buffs)) { - if (buff && buff.events) { - for (let e of buff.events) { - if (e.trigger == Event) { - KinkyDungeonHandleBuffEvent(Event, e, buff, ent, data); - } - } - } - } - } - } -} - -// Decreases time left in buffs and also applies effects -function KinkyDungeonTickBuffs(list, delta, endFloor, entity) { - for (const [key, value] of Object.entries(list)) { - if (value) { - if (value.endFloor && endFloor) KinkyDungeonExpireBuff(list, key); - else if (value.endSleep && KDGameData.SleepTurns > 1) KinkyDungeonExpireBuff(list, key); - else if (!value.duration || value.duration < 0) KinkyDungeonExpireBuff(list, key); - else { - if (value.type == "restore_mp") KinkyDungeonChangeMana(value.power); - if (value.type == "restore_wp") KinkyDungeonChangeWill(value.power); - if (value.type == "restore_sp") KinkyDungeonChangeStamina(value.power); - if (value.type == "restore_ap") KinkyDungeonChangeDistraction(value.power, true); - - if (value.type == "SpellCastConstant" && value.spell && entity) { - KinkyDungeonCastSpell(entity.x, entity.y, KinkyDungeonFindSpell(value.spell, true), undefined, undefined, undefined); - } - - if (value.type == "Flag") { - KinkyDungeonSetFlag(value.id, 1 + delta); - } - - if (!(value.infinite)) - value.duration -= delta; - } - } - } -} - -function KinkyDungeonTickBuffTag(list, tag, Amount = 1) { - if (list) - for (const [key, value] of Object.entries(list)) { - if (value) { - if (value.maxCount && value.tags.includes(tag)) { - if (!value.currentCount) value.currentCount = 0; - value.currentCount += Amount; - if (value.currentCount >= value.maxCount) KinkyDungeonExpireBuff(list, key); - } - } - } -} - -/** - * - * @param {entity} entity - * @param {string} tag - * @returns {boolean} - */ -function KDEntityHasBuffTags(entity, tag) { - let list = entity.player ? KinkyDungeonPlayerBuffs : entity.buffs; - if (list) { - for (const buff of Object.values(list)) { - if (buff) { - if (buff.tags && buff.tags.includes(tag)) return true; - } - } - } - return false; -} -/** - * - * @param {entity} entity - * @param {string} tag - * @returns {Record} - */ -function KDGetBuffsWithTag(entity, tag) { - let ret = {}; - let list = entity.player ? KinkyDungeonPlayerBuffs : entity.buffs; - if (list) { - for (const [key, buff] of Object.entries(list)) { - if (buff) { - if (buff.tags && buff.tags.includes(tag)) ret[key] = buff; - } - } - } - return ret; -} - -/** - * - * @param {entity} entity - * @param {string[]} tags - */ -function KinkyDungeonRemoveBuffsWithTag(entity, tags) { - let list = null; - if (entity && entity.player) { - list = KinkyDungeonPlayerBuffs; - } else if (entity.buffs) list = entity.buffs; - if (list) - for (const [key, value] of Object.entries(list)) { - if (value) { - for (let t of tags) - if (value.tags && value.tags.includes(t)) { - KinkyDungeonExpireBuff(list, key); - } - } - } -} - -// Updates buffs for all creatures -function KinkyDungeonUpdateBuffs(delta, endFloor) { - // Tick down buffs the buffs - KinkyDungeonSendEvent("tickBuffs", {delta: delta}); - KinkyDungeonTickBuffs(KinkyDungeonPlayerBuffs, delta, endFloor, KinkyDungeonPlayerEntity); - for (let enemy of KinkyDungeonEntities) { - if (!enemy.buffs) enemy.buffs = {}; - KinkyDungeonTickBuffs(enemy.buffs, delta, endFloor, enemy); - } - - // Apply the buffs from bullets - for (let b of KinkyDungeonBullets) { - if (b.bullet.spell && b.bullet.spell.buffs) { // Apply the buff - for (let buff of b.bullet.spell.buffs) { - - if (buff.player && buff.range >= Math.sqrt((KinkyDungeonPlayerEntity.x - b.x) * (KinkyDungeonPlayerEntity.x - b.x) + (KinkyDungeonPlayerEntity.y - b.y) * (KinkyDungeonPlayerEntity.y - b.y))) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff); - } - if (buff.enemies) { - for (let enemy of KinkyDungeonEntities) { - if ((KDHostile(enemy) || !buff.noAlly) - && (KDAllied(enemy) || !buff.onlyAlly) - && (!b.bullet.spell.filterTags || b.bullet.spell.filterTags.some((tag) => {return enemy.Enemy.tags[tag];})) - && buff.range >= Math.sqrt((enemy.x - b.x) * (enemy.x - b.x) + (enemy.y - b.y) * (enemy.y - b.y))) { - KinkyDungeonApplyBuff(enemy.buffs, buff); - } - } - - } - } - } - } -} - -function KinkyDungeonGetBuffedStat(list, Stat, onlyPositiveDuration) { - let stat = 0; - if (list) - for (let buff of Object.values(list)) { - if (buff && buff.type == Stat && (!onlyPositiveDuration || buff.duration > 0)) { - stat += buff.power; - } - } - return stat; -} - -function KinkyDungeonExpireBuff(list, key) { - delete list[key]; -} - -function KinkyDungeonApplyBuffToEntity(entity, origbuff, changes) { - if (entity && entity.player) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, origbuff, changes); - } else if (entity) { - if (!entity.buffs) entity.buffs = {}; - KinkyDungeonApplyBuff(entity.buffs, origbuff, changes); - } -} - -function KinkyDungeonApplyBuff(list, origbuff, changes) { - if (!origbuff) return; - let buff = {}; - Object.assign(buff, origbuff); - if (changes) - Object.assign(buff, changes); - let id = buff.id ? buff.id : buff.name; - - if (list[id] && buff.cancelOnReapply) { - KinkyDungeonExpireBuff(list, id); - } else { - if (!list[id] && buff.sfxApply) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + buff.sfxApply + ".ogg"); - if (!list[id] || (list[id].power > 0 && buff.power >= list[id].power) || (list[id].power < 0 && ((buff.power > 0 && buff.power >= list[id].power) || buff.power <= list[id].power))) list[id] = buff; - if ((list[id].power && buff.power == list[id].power && buff.duration >= list[id].duration)) list[id].duration = buff.duration; - - if (buff.tags) - for (let tag of buff.tags) { - if (tag == "darkness" && list == KinkyDungeonPlayerBuffs) { - KinkyDungeonBlindLevelBase = Math.max(KinkyDungeonBlindLevelBase, 1); - } else if (tag == "heavydarkness" && list == KinkyDungeonPlayerBuffs) { - KinkyDungeonBlindLevelBase = Math.max(KinkyDungeonBlindLevelBase, 2); - } - } - } -} - -function KinkyDungeonGetbuff(list, Buff) { - if (list && list[Buff]) return list[Buff]; - else return null; -} - -function KinkyDungeonHasBuff(list, Buff) { - if (list && list[Buff]) return true; - else return false; -} - -function KDEntityHasBuff(entity, buff) { - if (entity.player) { - return KinkyDungeonHasBuff(KinkyDungeonPlayerBuffs, buff); - } else return KinkyDungeonHasBuff(entity.buffs, buff); -} -function KDEntityBuffedStat(entity, stat) { - if (entity.player) { - return KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, stat); - } else return KinkyDungeonGetBuffedStat(entity.buffs, stat); -} - -function KDEntityGetBuff(entity, buff) { - if (entity.player) { - return KinkyDungeonGetbuff(KinkyDungeonPlayerBuffs, buff); - } else return KinkyDungeonGetbuff(entity.buffs, buff); -} \ No newline at end of file diff --git a/Game/KinkyDungeonBuffsList.js b/Game/KinkyDungeonBuffsList.js deleted file mode 100644 index 053f12227..000000000 --- a/Game/KinkyDungeonBuffsList.js +++ /dev/null @@ -1,166 +0,0 @@ -"use strict"; - - -let KDConduction = {id: "Conduction", type: "event", aura: "#ffff88", noAuraColor: true, aurasprite: "Conduction", power: 7.0, player: true, duration: 5, enemies: true, range: 2.99, events: [ - {type: "RemoveConduction", duration: 1, trigger: "tick"}, - {type: "Conduction", power: 0.5, duration: 5, damage: "electric", aoe: 3.99, trigger: "playerTakeDamage"}, - {type: "Conduction", power: 0.5, duration: 5, damage: "electric", aoe: 3.99, trigger: "beforeDamageEnemy"}, -]}; - -let KDDrenched = {id: "Drenched", type: "fireDamageResist", aura: "#59a0d1", aurasprite: "Drenched", power: 0.425, player: true, duration: 20, enemies: true, events: [ - {type: "RemoveDrench", duration: 1, trigger: "tick"}, - {type: "ApplyConduction", duration: 1, trigger: "tick", kind: "invis"}, - {type: "ApplyConduction", duration: 1, trigger: "tickAfter", kind: "invis"}, -]}; - -let KDBurning = {id: "Burning", type: "event", aura: "#ff8933", aurasprite: "Flaming", noAuraColor: true, power: 0.5, player: true, duration: 6, enemies: true, events: [ - {type: "RemoveBurning", trigger: "tick"}, - {type: "ElementalEffect", power: 0.5, damage: "fire", trigger: "tick"}, - {type: "EchoDamage", power: 1.0, damage: "fire", damageTrigger: "stun", trigger: "beforeDamageEnemy"}, - {type: "EchoDamage", power: 1.0, damage: "fire", damageTrigger: "stun", trigger: "playerTakeDamage"}, -]}; - -let KDDisenchant1 = {id: "Disenchant1", type: "MoveSpeed", aura: "#440088", power: -0.5, player: false, duration: 9999, enemies: true}; -let KDDisenchant2 = {id: "Disenchant2", type: "AttackSlow", aura: "#440088", power: 0.5, player: false, duration: 9999, enemies: true}; - -let KDVolcanism = {id: "Volcanism", type: "event", aura: "#ff0000", power: 0.5, player: false, duration: 9999, enemies: true, events: [ - {type: "Volcanism", power: 4.0, damage: "fire", trigger: "beforeDamageEnemy"}, -]}; - -let KDDrenched2 = {id: "Drenched2", type: "electricDamageResist", power: -0.2, player: true, duration: 20, enemies: true}; -let KDDrenched3 = {id: "Drenched3", type: "iceDamageResist", power: -0.35, player: true, duration: 20, enemies: true}; - -let KDBoundByFate = {id: "BoundByFate", type: "Fate", power: 1, player: true, duration: 3, enemies: false, aura: "#dddddd", events: [ - {type: "BoundByFate", kind: "mithrilRope", count: 2, trigger: "tick", power: 1}, -]}; - -let KDEager = { - id: "Eager", type: "MoveSpeed", power: 0.95, duration: 1, events: [ - {type: "ApplyVuln", duration: 1, trigger: "tick"}, - {type: "ApplyVuln", duration: 1, power: -1.0, trigger: "tickAfter"}, - ] -}; -let KDMasochist = { - id: "Masochist", type: "DamageAmp", power: -1, duration: 1 -}; - -let KDChilled = {id: "Chilled", aura: "#73efe8", type: "MoveSpeed", power: -1.0, player: true, enemies: true, duration: 2,}; -let KDSlimed = { - id: "Slimed", aura: "#dc16bc", aurasprite: "Slimed", noAuraColor: true, type: "SlimeProgress", power: 1.0, player: true, enemies: true, duration: 3, range: 0.5, hideHelpless: true, tags: ["slimed"], events: [ - {type: "RemoveSlimeWalk", duration: 1, trigger: "tick"}, - {type: "Flammable", trigger: "beforeDamageEnemy"}, - {type: "Flammable", trigger: "beforePlayerDamage"}, - {type: "ApplySlowed", duration: 1, power: -1.0, trigger: "tick"}, - {type: "ApplySlowed", duration: 1, power: -1.0, trigger: "tickAfter"}, - {type: "ApplyGlueVuln", duration: 1, power: -0.3, trigger: "tick"}, - {type: "ApplyGlueVuln", duration: 1, power: -0.3, trigger: "tickAfter"}, - ] -}; -let KDEncased = { - id: "Encased", type: "SlimeProgress", power: 2.0, player: false, enemies: true, duration: 9999, range: 0.5, replaceSprite: "EncasedDoll", tags: ["encased"], events: [ - {type: "RemoveSlimeWalk", duration: 1, trigger: "tick"}, - {type: "RemoveFree", trigger: "tick"}, - {type: "ApplySlowed", duration: 1, power: -2.0, trigger: "tick"}, - {type: "ApplySlowed", duration: 1, power: -2.0, trigger: "tickAfter"}, - {type: "ApplyAttackSlow", duration: 1, power: 1.0, trigger: "tick"}, - {type: "ApplyAttackSlow", duration: 1, power: 1.0, trigger: "tickAfter"}, - {type: "ApplySilence", duration: 2, power: 1.0, trigger: "tick"}, - {type: "ApplySilence", duration: 2, power: 1.0, trigger: "tickAfter"}, - {type: "ApplyGlueVuln", duration: 1, power: -0.5, trigger: "tick"}, - {type: "ApplyGlueVuln", duration: 1, power: -0.5, trigger: "tickAfter"}, - ] -}; -let KDEncasedDoll = { - id: "EncasedDoll", type: "SlimeProgress", power: 2.0, player: false, enemies: true, duration: 9999, range: 0.5, replaceSprite: "EncasedFactoryDoll", tags: ["encased"], events: [ - {type: "RemoveSlimeWalk", duration: 1, trigger: "tick"}, - {type: "RemoveFree", trigger: "tick"}, - {type: "ApplySlowed", duration: 1, power: -2.0, trigger: "tick"}, - {type: "ApplySlowed", duration: 1, power: -2.0, trigger: "tickAfter"}, - {type: "ApplyAttackSlow", duration: 1, power: 1.0, trigger: "tick"}, - {type: "ApplyAttackSlow", duration: 1, power: 1.0, trigger: "tickAfter"}, - {type: "ApplySilence", duration: 2, power: 1.0, trigger: "tick"}, - {type: "ApplySilence", duration: 2, power: 1.0, trigger: "tickAfter"}, - {type: "ApplyGlueVuln", duration: 1, power: -0.5, trigger: "tick"}, - {type: "ApplyGlueVuln", duration: 1, power: -0.5, trigger: "tickAfter"}, - ] -}; -let KDChastity = { - id: "Chastity", type: "Chastity", power: 1.0, aura: "#dddddd", aurasprite: "Chastity", player: false, enemies: true, duration: 9999, range: 0.5, tags: ["chastity"], events: [ - {type: "Distract", power: 0.1, trigger: "tick", prereq: "bound"}, - ] -}; -let KDVibrate1 = { - id: "Vibrate1", type: "Vibration", power: 1.0, aura: "#ffaaaa", duration: 3, tags: ["plugged"], events: [ - {type: "RemoveNoPlug", trigger: "tick"}, - ] -}; -let KDVibrate2 = { - id: "Vibrate2", type: "Vibration", power: 1.0, aura: "#ffaaaa", duration: 3, tags: ["plugged"], events: [ - {type: "RemoveNoPlug", trigger: "tick"}, - ] -}; -let KDVibrate3 = { - id: "Vibrate3", type: "Vibration", power: 1.0, aura: "#ffaaaa", duration: 3, tags: ["plugged"], events: [ - {type: "RemoveNoPlug", trigger: "tick"}, - ] -}; -let KDToy = { - id: "Toy", type: "Plug", power: 0.1, aura: "#dddddd", aurasprite: "Toy", player: false, enemies: true, duration: 30, range: 0.5, tags: ["toy"] -}; -let KDPlugged = { - id: "Plugged", type: "Plug", power: 1.0, aura: "#dddddd", aurasprite: "Plugged", player: false, enemies: true, duration: 9999, range: 0.5, tags: ["plugged"], events: [ - {type: "Distract", power: 2.0, trigger: "tick"}, - {type: "RemoveFree", trigger: "tick", prereq: "NoChastity"}, - ] -}; -let KDDoublePlugged = { - id: "DoublePlugged", type: "Plug", power: 2.0, aura: "#dddddd", aurasprite: "DoublePlugged", player: false, enemies: true, duration: 9998, range: 0.5, tags: ["plugged"], events: [ - {type: "Distract", power: 5.0, trigger: "tick"}, - {type: "RemoveFree", trigger: "tick", prereq: "NoChastity"}, - ] -}; -let KDGlueVulnLow = { - id: "GlueVuln", type: "glueDamageResist", power: -0.3, player: true, enemies: true, duration: 1 -}; -let KDGlueResist = { - id: "GlueVuln", type: "glueDamageResist", power: 0.5, player: false, enemies: true, duration: 1 -}; -let KDDollDebuff = { - id: "DollDebuff", type: "soulDamageResist", power: -0.5, player: false, enemies: true, duration: 2, aura: "#ff8888", -}; -let KDDollDebuff2 = { - id: "DollDebuff2", type: "charmDamageResist", power: -0.5, player: false, enemies: true, duration: 2 -}; -let KDSlowed = { - id: "Slowed", type: "MoveSpeed", power: -1.0, player: true, enemies: true, duration: 1 -}; -let KDAttackSlow = { - id: "AttackSlow", type: "AttackSlow", power: 0.5, player: true, enemies: true, duration: 1 -}; -let KDUnsteady = {id: "Unsteady", aura: "#aa8888", type: "MoveSpeed", power: -1.0, player: true, enemies: true, duration: 1,}; -let KDUnsteady2 = {id: "Unsteady2", aura: "#aa8888", type: "Armor", power: -1.0, player: true, enemies: false, duration: 3,}; -let KDUnsteady3 = {id: "Unsteady3", type: "Evasion", power: -0.5, player: true, enemies: false, duration: 3,}; - -let KDNoChill = {id: "ChillWalk", aura: "#73efe8", type: "ChillWalk", power: -1.0, player: true, enemies: true, duration: 2,}; -let KDNoChillNoAura = {id: "ChillWalk2", type: "ChillWalk", power: -1.0, player: true, enemies: true, duration: 2,}; -function KDChillWalk(entity) { - return KDEntityHasBuff(entity, "ChillWalk") || KDEntityHasBuff(entity, "ChillWalk2"); -} - -let KDRestraintDisarmLight = {id: "RestDisarmLight", aura: "#ff5555", type: "DisarmOnAttack", power: 3, player: false, enemies: true, duration: 9999, events: [ - {type: "RemoveRestraint", trigger: "tick"}, - {type: "ApplyDisarm", trigger: "playerAttack"}, -]}; - -let KDBuffReference = { - "RestraintDisarmLight": [KDRestraintDisarmLight], - "Unsteady": [KDUnsteady, KDUnsteady2, KDUnsteady3], - "Plugged": [KDPlugged], - "DoublePlugged": [KDDoublePlugged], - "Chastity": [KDChastity], - "Vibrate1": [KDVibrate1], - "Vibrate2": [KDVibrate2], - "Vibrate3": [KDVibrate3], -}; - -let KDDisenchantSelf = {id: "DisenchantSelf", aura: "#8888ff", type: "Disenchant", power: 9.9, player: true, enemies: true, duration: 10,}; \ No newline at end of file diff --git a/Game/KinkyDungeonConsumables.js b/Game/KinkyDungeonConsumables.js deleted file mode 100644 index 82a18e6da..000000000 --- a/Game/KinkyDungeonConsumables.js +++ /dev/null @@ -1,318 +0,0 @@ -"use strict"; - -/** - * - * @param {item} item - * @returns {consumable} - */ -function KDConsumable(item) { - return KinkyDungeonConsumables[item.name]; -} - -function KinkyDungeonFindConsumable(Name) { - for (let con of Object.values(KinkyDungeonConsumables)) { - if (con.name == Name) return con; - } - return undefined; -} - -function KinkyDungeonFindBasic(Name) { - for (let con of Object.values(KinkyDungneonBasic)) { - if (con.name == Name) return con; - } - return undefined; -} - -function KinkyDungeonFindConsumableOrBasic(Name) { - for (let con of Object.values(KinkyDungeonConsumables)) { - if (con.name == Name) return con; - } - - for (let con of Object.values(KinkyDungneonBasic)) { - if (con.name == Name) return con; - } - return undefined; -} - -function KinkyDungeonGetInventoryItem(Name, Filter = Consumable) { - let Filtered = KinkyDungeonFilterInventory(Filter); - for (let item of Filtered) { - if (item.name == Name) return item; - } - return null; -} - -function KinkyDungeonItemCount(Name) { - let item = KinkyDungeonGetInventoryItem(Name); - if (item && item.item && item.item.quantity) { - return item.item.quantity; - } - return 0; -} - -function KinkyDungeonGetShopItem(Level, Rarity, Shop) { - let Table = []; - let params = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]]; - if (params.ShopExclusives) { - for (let exc of params.ShopExclusives) { - Table.push(exc); - } - } - /**@type {Record} */ - let Shopable = Object.entries(KinkyDungeonConsumables).filter(([k, v]) => (v.shop)); - for (let S = 0; S < Shopable.length; S++) { - let s = Shopable[S][1]; - s.shoptype = "Consumable"; - Table.push(s); - } - // @ts-ignore - Shopable = Object.entries(KinkyDungneonBasic).filter(([k, v]) => (v.shop)); - for (let S = 0; S < Shopable.length; S++) { - let s = Shopable[S][1]; - s.shoptype = "Basic"; - if (!s.ignoreInventory || !KinkyDungeonInventoryGet(s.ignoreInventory)) - Table.push(s); - } - // @ts-ignore - Shopable = Object.entries(KinkyDungneonShopRestraints).filter(([k, v]) => (v.shop)); - for (let S = 0; S < Shopable.length; S++) { - let s = Shopable[S][1]; - s.shoptype = "Restraint"; - if (!KinkyDungeonInventoryGet(s.name)) - Table.push(s); - } - // @ts-ignore - Shopable = Object.entries(KinkyDungeonWeapons).filter(([k, v]) => (v.shop)); - for (let S = 0; S < Shopable.length; S++) { - let s = Shopable[S][1]; - s.shoptype = "Weapon"; - if (!KinkyDungeonInventoryGet(s.name)) - Table.push(s); - } - - // No duplicates - for (let R = Rarity; R >= 0; R--) { - let available = Table.filter((item) => (item.rarity == R && !KDGameData.ShopItems.some((item2) => {return item2.name == item.name;}))); - if (available.length > 0) return available[Math.floor(KDRandom() * available.length)]; - } - return null; -} - - -/** - * - * @param {consumable} consumable - * @param {number} Quantity - * @return {boolean} - */ -function KinkyDungeonChangeConsumable(consumable, Quantity) { - let item = KinkyDungeonInventoryGetConsumable(consumable.name); - if (item) { - item.quantity += Quantity; - if (item.quantity <= 0) { - KinkyDungeonInventoryRemove(item); - } - return true; - } - - if (Quantity >= 0) { - KinkyDungeonInventoryAdd({name: consumable.name, id: KinkyDungeonGetItemID(), type: Consumable, quantity: Quantity}); - } - - return false; -} - -function KinkyDungeonConsumableEffect(Consumable, type) { - if (!type) type = Consumable.type; - - if (KDConsumableEffects[type]) { - KDConsumableEffects[type](Consumable); - } else if (type == "spell") { - KinkyDungeonCastSpell(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonFindSpell(Consumable.spell, true), undefined, undefined, undefined); - KDStunTurns(1, true); - } else if (type == "targetspell") { - KDCloseQuickInv(); - KinkyDungeonTargetingSpell = KinkyDungeonFindSpell(Consumable.spell, true); - KinkyDungeonTargetingSpellItem = Consumable; - } else if (type == "charge") { - KDGameData.AncientEnergyLevel = Math.min(Math.max(0, KDGameData.AncientEnergyLevel + Consumable.amount), 1.0); - if (!KinkyDungeonStatsChoice.get("LostTechnology")) - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSourceSpent, 1); - } else if (type == "buff") { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: Consumable.name, type: Consumable.buff, power: Consumable.power, duration: Consumable.duration, aura: Consumable.aura}); - } else if (type == "recharge") { - //KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); - //KinkyDungeonAddGold(-Consumable.rechargeCost); - //KDStunTurns(1); - } else if (type == "shrineRemove") { - KinkyDungeonRemoveRestraintsWithShrine(Consumable.shrine); - KDStunTurns(1, true); - } else if (type == "goldKey") { - for (let r of KinkyDungeonPlayerGetRestraintsWithLocks(["Gold"])) { - KinkyDungeonLock(r, "Blue"); - } - } -} - -function KinkyDungeonPotionCollar() { - for (let r of KinkyDungeonAllRestraint()) { - if (KDRestraint(r).potionCollar) return true; - } - return false; -} - -function KinkyDungeonCanDrink(byEnemy) { - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).allowPotions) return true; - } - if (KDGroupBlocked("ItemMouth", byEnemy)) return false; - return KinkyDungeonCanTalk(true); -} - -function KinkyDungeonAttemptConsumable(Name, Quantity) { - if (KDGameData.SleepTurns > 0 || KinkyDungeonSlowMoveTurns > 0) return false; - let item = KinkyDungeonGetInventoryItem(Name, Consumable); - if (!item) return false; - - - if (KDConsumable(item).prereq && KDConsumablePrereq[KDConsumable(item).prereq]) { - if (KDConsumablePrereq[KDConsumable(item).prereq](item, Quantity)) { - KinkyDungeonUseConsumable(Name, Quantity); - return true; - } else return false; - } - - if (item.item && KDConsumable(item.item) && KDConsumable(item.item).type == "unusuable") { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonUnusable"), "#ff0000", 1); - return false; - } - if (item.item && KDConsumable(item.item) && KDConsumable(item.item).type == "goldKey") { - if (KinkyDungeonPlayerGetRestraintsWithLocks(["Gold"]).length == 0) { - KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonMistressKeyFail"), "#ff0000", 1); - return false; - } - } - if (item.item && KDConsumable(item.item) && KDConsumable(item.item).type == "charge" && KDGameData.AncientEnergyLevel >= 1) { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonFullpower"), "#ff0000", 1); - return false; - } - if (item.item && KDConsumable(item.item) && KDConsumable(item.item).type == "recharge") { - KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonInventoryItemAncientPowerSourceSpentUseFail"), "#ff0000", 1); - return false; - } - - if (item.item && KDConsumable(item.item) && KDConsumable(item.item).type == "shrineRemove" && KinkyDungeonGetRestraintsWithShrine(KDConsumable(item.item).shrine).length < 1) { - KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonNoItemToRemove"), "pink", 1); - return false; - } - - let needMouth = item.item && KDConsumable(item.item) && ((KDConsumable(item.item).potion && !KDConsumable(item.item).gagFloor) || KDConsumable(item.item).needMouth); - let needArms = !(item.item && KDConsumable(item.item) && KDConsumable(item.item).noHands); - let strictness = KinkyDungeonStrictness(false, "ItemHands"); - let maxStrictness = (item.item && KDConsumable(item.item) && KDConsumable(item.item).maxStrictness) ? KDConsumable(item.item).maxStrictness : 1000; - - if (needMouth && ((!KDConsumable(item.item).potion && ((KDConsumable(item.item).gagMax && KinkyDungeonGagTotal() > KDConsumable(item.item).gagMax) || (!KDConsumable(item.item).gagMax && !KinkyDungeonCanTalk(true)))) - || (KDConsumable(item.item).potion && !KinkyDungeonCanDrink()))) { - let allowPotions = KinkyDungeonPotionCollar(); - if (KDConsumable(item.item).potion && allowPotions) { - //KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - energyCost); - } else { - KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonPotionGagged"), "#ff0000", 1); - - if (KinkyDungeonTextMessageTime > 0) - KinkyDungeonDrawState = "Game"; - - return false; - } - } - if (!(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && needArms && !KinkyDungeonStatsChoice.get("Psychic") && !(item.item && KDConsumable(item.item).potion && !KinkyDungeonIsArmsBound() && (!KinkyDungeonStatsChoice.has("WeakGrip") || !KinkyDungeonIsHandsBound(false, false))) && (KinkyDungeonIsHandsBound(false, true) || (KinkyDungeonStatsChoice.has("WeakGrip") && item.item && KDConsumable(item.item).potion)) && !KinkyDungeonCanUseFeet()) { - let allowPotions = KinkyDungeonPotionCollar(); - let nohands = KinkyDungeonIsHandsBound(false, true); - if (KDConsumable(item.item).potion && allowPotions) { - //KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - energyCost); - } else if (!nohands && KinkyDungeonCanKneel() && KDGameData.KneelTurns < 1) { - if (!KDGameData.KneelTurns) KDGameData.KneelTurns = 2; - else KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns, 2); - KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonCantUsePotionsKneel"), "#ffff00", 1); - - if (KinkyDungeonTextMessageTime > 0) - KinkyDungeonDrawState = "Game"; - - KinkyDungeonAdvanceTime(1, true, true); - - return false; - } else if (nohands || KDGameData.KneelTurns < 1) { - //KinkyDungeonAdvanceTime(1); - KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonCantUsePotions"), "#ff0000", 1); - - if (KinkyDungeonTextMessageTime > 0) - KinkyDungeonDrawState = "Game"; - - return false; - } - } - - if (strictness >= maxStrictness) { - //KinkyDungeonAdvanceTime(1); - KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonCantUsePotionsStrict"), "#ff0000", 1); - - if (KinkyDungeonTextMessageTime > 0) - KinkyDungeonDrawState = "Game"; - return false; - } - - if (KDConsumable(item).postreq && KDConsumablePrereq[KDConsumable(item).postreq]) { - if (KDConsumablePrereq[KDConsumable(item).postreq](item, Quantity)) { - KDDelayedActionPrune(["Action", "Consume"]); - if (KDConsumable(item.item).delay || (KDConsumable(item.item).potion && KinkyDungeonStatsChoice.has("SavourTheTaste"))) { - KDAddDelayedAction({ - commit: "Consumable", - data: { - Name: Name, - Quantity: Quantity, - }, - time: KDConsumable(item.item).delay || 2, - tags: ["Action", "Remove", "Restrain"], - }); - KDStunTurns(KDConsumable(item.item).delay || 2, true); - } else KinkyDungeonUseConsumable(Name, Quantity); - return true; - } else return false; - } - KDDelayedActionPrune(["Action", "Consume"]); - if (KDConsumable(item.item).delay || (KDConsumable(item.item).potion && KinkyDungeonStatsChoice.has("SavourTheTaste"))) { - KDAddDelayedAction({ - commit: "Consumable", - data: { - Name: Name, - Quantity: Quantity, - }, - time: KDConsumable(item.item).delay || 2, - tags: ["Action", "Remove", "Restrain"], - }); - KDStunTurns(KDConsumable(item.item).delay || 2, true); - } else KinkyDungeonUseConsumable(Name, Quantity); - return true; -} - -function KinkyDungeonUseConsumable(Name, Quantity) { - let item = KinkyDungeonGetInventoryItem(Name, Consumable); - if (!item || item.item.quantity < Quantity) return false; - - for (let I = 0; I < Quantity; I++) { - KinkyDungeonConsumableEffect(KDConsumable(item.item)); - if (KDConsumable(item.item).sideEffects) { - for (let effect of KDConsumable(item.item).sideEffects) { - KinkyDungeonConsumableEffect(KDConsumable(item.item), effect); - } - } - } - if (!KDConsumable(item.item).noConsumeOnUse) - KinkyDungeonChangeConsumable(KDConsumable(item.item), -(KDConsumable(item.item).useQuantity ? KDConsumable(item.item).useQuantity : 1) * Quantity); - - KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonInventoryItem" + Name + "Use"), "#88FF88", 1); - if (KDConsumable(item.item).sfx) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" + KDConsumable(item.item).sfx + ".ogg"); - } - return true; -} diff --git a/Game/KinkyDungeonConsumablesList.js b/Game/KinkyDungeonConsumablesList.js deleted file mode 100644 index d83562684..000000000 --- a/Game/KinkyDungeonConsumablesList.js +++ /dev/null @@ -1,117 +0,0 @@ -"use strict"; - -/** - * @type {Record} - */ -let KinkyDungeonConsumables = { - "PotionMana" : {name: "PotionMana", potion: true, rarity: 0, shop: true, type: "restore", mp_instant: 5, mpool_instant: 0, mp_gradual: 0, scaleWithMaxMP: true, gagFloor: 0.5, duration: 0, sfx: "PotionDrink"}, - "ManaOrb" : {name: "ManaOrb", noHands: true, rarity: 2, shop: true, type: "restore", mp_instant: 0, mpool_instant: 20, mp_gradual: 0, scaleWithMaxMP: false, duration: 0, sfx: "Invis"}, - "PotionWill" : {name: "PotionWill", potion: true, rarity: 0, shop: true, type: "restore", wp_instant: 2.5, wp_gradual: 0, scaleWithMaxWP: true, duration: 0, gagFloor: 0.5, sfx: "PotionDrink"}, - "PotionStamina" : {name: "PotionStamina", potion: true, rarity: 1, shop: true, type: "restore", sp_instant: 5, sp_gradual: 25, scaleWithMaxSP: true, duration: 25, gagFloor: 0.5, sfx: "PotionDrink"}, - "PotionFrigid" : {name: "PotionFrigid", potion: true, rarity: 1, shop: true, type: "restore", ap_instant: -10, ap_gradual: -20, duration: 50, arousalRatio: 1.0, gagFloor: 0.5, sfx: "PotionDrink"}, - "SmokeBomb" : {name: "SmokeBomb", noHands: true, rarity: 2, costMod: -1, shop: true, type: "spell", spell: "Shroud", sfx: "FireSpell"}, - "PotionInvisibility" : {name: "PotionInvisibility", potion: true, rarity: 3, costMod: -1, shop: true, type: "spell", spell: "Invisibility", sfx: "PotionDrink"}, - "Ectoplasm" : {name: "Ectoplasm", noHands: true, rarity: 1, shop: false, type: "spell", spell: "LesserInvisibility", sfx: "Invis"}, - "EarthRune" : {name: "EarthRune", rarity: 2, costMod: -1, shop: false, type: "spell", spell: "Earthrune", sfx: "HeavySwing"}, - "WaterRune" : {name: "WaterRune", rarity: 2, costMod: -1, shop: false, type: "spell", spell: "Waterrune", sfx: "HeavySwing"}, - "Bola" : {name: "Bola", rarity: 0, costMod: -1, shop: false, useQuantity: 1, noConsumeOnUse: true, type: "targetspell", spell: "PlayerBola"}, - "IceRune" : {name: "IceRune", rarity: 2, costMod: -1, shop: false, type: "spell", spell: "Icerune", sfx: "Freeze"}, - "Bomb" : {name: "Bomb", rarity: 1, costMod: -1, shop: false, type: "spell", spell: "Bomb", sfx: "MagicSlash"}, - "ElfCrystal" : {name: "ElfCrystal", noHands: true, rarity: 3, costMod: -1, shop: false, type: "spell", spell: "Slippery", sfx: "MagicSlash"}, - "EnchantedGrinder" : {name: "EnchantedGrinder", noHands: true, rarity: 4, shop: true, type: "spell", spell: "Cutting", sfx: "Laser"}, - "MistressKey" : {name: "MistressKey", rarity: 8, costMod: -1, shop: false, type: "goldKey"}, - "AncientPowerSource" : {name: "AncientPowerSource", noHands: true, rarity: 4, costMod: -1, shop: true, type: "charge", amount: 0.250}, - "AncientPowerSourceSpent" : {name: "AncientPowerSourceSpent", noHands: true, rarity: 3, costMod: -1, shop: false, type: "recharge"}, - "ScrollArms" : {name: "ScrollArms", noHands: true, rarity: 2, costMod: 1, shop: true, type: "buff", buff: "NoArmsComp", duration: 12, power: 1, aura: "#aaffaa", sfx: "FireSpell"}, - "ScrollVerbal" : {name: "ScrollVerbal", noHands: true, rarity: 2, costMod: 1, shop: true, type: "buff", buff: "NoVerbalComp", duration: 12, power: 1, aura: "#aaaaff", sfx: "FireSpell"}, - "ScrollLegs" : {name: "ScrollLegs", noHands: true, rarity: 2, costMod: 1, shop: true, type: "buff", buff: "NoLegsComp", duration: 12, power: 1, aura: "#ffaaaa", sfx: "FireSpell"}, - "ScrollPurity" : {name: "ScrollPurity", noHands: true, rarity: 4, shop: true, type: "shrineRemove", shrine: "Vibes", sfx: "FireSpell"}, - - "DollID" : {name: "DollID", rarity: 0, shop: false, type: "dollID", noHands: true, sfx: "FutureLock"}, -}; - -// Separate for organizational purposes -/** - * @type {Record} - */ -let KDCookies = { - "Cookie" : {name: "Cookie", rarity: 0, shop: true, type: "restore", wp_instant: 1.0, wp_gradual: 0, scaleWithMaxWP: true, needMouth: true, delay: 3, gagMax: 0.59, duration: 0, sfx: "Cookie"}, - "Donut" : {name: "Donut", rarity: 0, shop: true, type: "restore", wp_instant: 1.0, wp_gradual: 0, scaleWithMaxWP: true, needMouth: true, delay: 3, gagMax: 0.59, duration: 0, sfx: "Cookie"}, - "CookieJailer" : {name: "CookieJailer", rarity: 0, shop: true, type: "restore", wp_instant: 1.5, wp_gradual: 0, scaleWithMaxWP: true, needMouth: true, delay: 3, gagMax: 0.59, duration: 0, sfx: "Cookie", - sideEffects: ["subAdd"], - data: { - subAdd: 5, - }}, -}; -Object.assign(KinkyDungeonConsumables, KDCookies); - -let KDRechargeCost = 100; - -let KinkyDungneonBasic = { - "RedKey" : {name: "RedKey", rarity: 0, shop: true}, - "BlueKey" : {name: "BlueKey", rarity: 2, costMod: 2, shop: true}, - "Lockpick" : {name: "Lockpick", rarity: 0, shop: true}, - //"4Lockpick" : {name: "4Lockpick", rarity: 1, shop: true}, - "3Bola" : {name: "3Bola", consumable: "Bola", quantity: 3, rarity: 0, shop: true}, - "3Bomb" : {name: "3Bomb", consumable: "Bomb", quantity: 3, rarity: 1, shop: true}, - "MaidUniform" : {name: "MaidUniform", rarity: 2, shop: true, ignoreInventory: "Maid"}, - //"PotionCollar" : {name: "PotionCollar", rarity: 2, shop: true}, -}; - -let KinkyDungneonShopRestraints = { - "SlimeWalkers" : {name: "SlimeWalkers", rarity: 2, shop: true}, - "PotionCollar" : {name: "PotionCollar", rarity: 2, shop: true}, -}; - -/** @type {Record void>} */ -let KDConsumableEffects = { - "subAdd": (Consumable) => { - let amount = Consumable.data?.subAdd || 5; - KinkyDungeonChangeRep("Ghost", amount); - }, - "dollID": (Consumable) => { - KinkyDungeonSetFlag("DollmakerGrace", 300); - }, - "restore": (Consumable) => { - let multi = 1.0; - if (Consumable.scaleWithMaxSP) { - multi = Math.max(KinkyDungeonStatStaminaMax / KDMaxStatStart); - } - let Manamulti = 1.0; - if (Consumable.scaleWithMaxMP) { - Manamulti = Math.max(KinkyDungeonStatManaMax / KDMaxStatStart); - } - let Willmulti = 1.0; - if (Consumable.scaleWithMaxWP) { - Willmulti = Math.max(KinkyDungeonStatWillMax / KDMaxStatStart); - } - let Distmulti = 1.0; - if (Consumable.scaleWithMaxAP) { - Distmulti = Math.max(KinkyDungeonStatDistractionMax / KDMaxStatStart); - } - let gagFloor = Consumable.gagFloor ? Consumable.gagFloor : 0; - let gagMult = (Consumable.potion && gagFloor != 1.0) ? Math.max(0, gagFloor + (1 - gagFloor) * (1 - Math.max(0, Math.min(1.0, KinkyDungeonGagTotal(true))))) : 1.0; - if (gagMult < 0.999) { - KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonConsumableLessEffective"), "#ff0000", 2); - } - if (Consumable.mp_instant != undefined) { - //let manaAmt = Math.min(KinkyDungeonStatManaMax, KinkyDungeonStatMana + Consumable.mp_instant * Manamulti * gagMult) - KinkyDungeonStatMana; - KinkyDungeonChangeMana(Consumable.mp_instant * Manamulti * gagMult, false, Consumable.mpool_instant * Manamulti * gagMult, false, true); - } - if (Consumable.wp_instant) KinkyDungeonChangeWill(Consumable.wp_instant * Willmulti * gagMult); - if (Consumable.sp_instant) KinkyDungeonChangeStamina(Consumable.sp_instant * multi * gagMult); - if (Consumable.ap_instant) KinkyDungeonChangeDistraction(Consumable.ap_instant * Distmulti * gagMult, false, Consumable.arousalRatio ? Consumable.arousalRatio : 0); - - KinkyDungeonCalculateMiscastChance(); - - if (Consumable.mp_gradual) KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "PotionMana", type: "restore_mp", power: Consumable.mp_gradual/Consumable.duration * gagMult * Manamulti, duration: Consumable.duration}); - if (Consumable.wp_gradual) KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "PotionWill", type: "restore_wp", power: Consumable.wp_gradual/Consumable.duration * gagMult * Willmulti, duration: Consumable.duration}); - if (Consumable.sp_gradual) KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "PotionStamina", type: "restore_sp", power: Consumable.sp_gradual/Consumable.duration * gagMult * multi, duration: Consumable.duration}); - if (Consumable.ap_gradual) KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "PotionFrigid", type: "restore_ap", power: Consumable.ap_gradual/Consumable.duration * gagMult * Distmulti, duration: Consumable.duration}); - }, -}; - -/** @type {Record boolean>} */ -let KDConsumablePrereq = { - -}; \ No newline at end of file diff --git a/Game/KinkyDungeonCurse.js b/Game/KinkyDungeonCurse.js deleted file mode 100644 index fcb63b93d..000000000 --- a/Game/KinkyDungeonCurse.js +++ /dev/null @@ -1,355 +0,0 @@ -"use strict"; - -/** - * onApply: occurs when applied - * condition: required to remove it - * remove: happens when removing - * events: these events are added to the restraint - * @type {Record} */ -let KDCurses = { - "GhostLock" : { - condition: (item) => { - return KinkyDungeonItemCount("Ectoplasm") >= 25; - }, - remove: (item, host) => { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.Ectoplasm, -25); - } - }, - "DollLock" : { - condition: (item) => { - return KinkyDungeonItemCount("DollID") >= 8; - }, - remove: (item, host) => { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.DollID, -8); - } - }, - "MistressKey": { - noShrine: true, - condition: (item) => { - return KinkyDungeonItemCount("MistressKey") > 0; - }, - remove: (item, host) => { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.MistressKey, -1); - } - }, - "5Keys" : { - condition: (item) => { - return KinkyDungeonRedKeys >= 5; - }, - remove: (item, host) => { - KinkyDungeonRedKeys -= 5; - } - }, - "Key" : { - condition: (item) => { - return KinkyDungeonRedKeys >= 1; - }, - remove: (item, host) => { - KinkyDungeonRedKeys -= 1; - } - }, - "BlueLock" : { - condition: (item) => { - return KinkyDungeonBlueKeys >= 1; - }, - remove: (item, host) => { - KinkyDungeonBlueKeys -= 1; - } - }, - "TakeDamageFire" : { - condition: (item) => {return false;}, - remove: (item, host) => {}, - events: [ - {type: "RemoveOnDmg", power: 1, count: 3, damage: "fire", trigger: "beforePlayerDamage", kind: "CurseMelt"}, - {type: "RemoveOnDmg", power: 1, count: 3, damage: "crush", trigger: "beforePlayerDamage", kind: "CurseMelt"}, - ], - }, - "TakeDamageIce" : { - condition: (item) => {return false;}, - remove: (item, host) => {}, - events: [ - {type: "RemoveOnDmg", power: 1, count: 4, damage: "ice", trigger: "beforePlayerDamage", kind: "CurseExtinguish"}, - {type: "RemoveOnDmg", power: 1, count: 4, damage: "acid", trigger: "beforePlayerDamage", kind: "CurseExtinguish"}, - {type: "RemoveOnDmg", power: 1, count: 4, damage: "stun", trigger: "beforePlayerDamage", kind: "CurseExtinguish"}, - {type: "RemoveOnBuffName", trigger: "tick", kind: "Drenched"}, - {type: "RemoveOnBuffName", trigger: "tick", kind: "Chilled"}, - ], - }, - "TakeDamageElectric" : { - condition: (item) => {return false;}, - remove: (item, host) => {}, - events: [ - {type: "RemoveOnDmg", power: 1, count: 2, damage: "electric", trigger: "beforePlayerDamage", kind: "CurseShock"} - ], - }, - "TakeDamageGlue" : { - condition: (item) => {return false;}, - remove: (item, host) => {}, - events: [ - {type: "RemoveOnDmg", power: 1, count: 5, damage: "glue", trigger: "beforePlayerDamage", kind: "CurseGlue"} - ], - }, - "TakeDamageChain" : { - condition: (item) => {return false;}, - remove: (item, host) => {}, - events: [ - {type: "RemoveOnDmg", power: 1, count: 5, damage: "chain", trigger: "beforePlayerDamage", kind: "CurseChain"} - ], - }, - "Will" : { - onApply: (item, host) => { - KinkyDungeonChangeWill(-1); - }, - condition: (item) => { - return KinkyDungeonStatWill >= KinkyDungeonStatWillMax*0.99; - }, - remove: (item, host) => { - // For free! - } - }, - "Mana" : { - condition: (item) => { - return KinkyDungeonStatMana + KinkyDungeonStatManaPool >= 20; - }, - remove: (item, host) => { - KinkyDungeonChangeMana(-20, false, 0, true, true); - } - }, - "ShrineWill" : { - condition: (item) => { - return KDNearbyTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some((tile) => { - return tile?.tile?.Type == "Shrine" && tile.tile.Name == "Will"; - }); - }, remove: (item, host) => {/* For free! */}}, - "ShrineElements" : { - condition: (item) => { - return KDNearbyTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some((tile) => { - return tile?.tile?.Type == "Shrine" && tile.tile.Name == "Elements"; - }); - }, remove: (item, host) => {/* For free! */}}, - "ShrineConjure" : { - condition: (item) => { - return KDNearbyTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some((tile) => { - return tile?.tile?.Type == "Shrine" && tile.tile.Name == "Conjure"; - }); - }, remove: (item, host) => {/* For free! */}}, - "ShrineIllusion" : { - condition: (item) => { - return KDNearbyTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some((tile) => { - return tile?.tile?.Type == "Shrine" && tile.tile.Name == "Illusion"; - }); - }, remove: (item, host) => {/* For free! */}}, -}; - - -/** - * TODO -curseInfoAnimation,"Curse of Animation: Causes loose restraints to animate and attack you!" -curseInfoSensitivity,"Curse of Sensitivity: Makes it easier to lose control of yourself." - */ - -/** Cursed variants of restraints - * @type {Record} - */ -let KDCursedVars = { - "Light": { - level: 1, - variant: (restraint, newRestraintName) => { - return KDAddEventVariant(restraint, newRestraintName, [ - {type: "ItemLight", trigger: "getLights", power: 3.5, color: "#ffff55", inheritLinked: true}, - {trigger: "tick", type: "sneakBuff", power: -1.0, inheritLinked: true}, - {trigger: "drawSGTooltip", type: "curseInfo", msg: "Illumination", color: "#ff5555", inheritLinked: true}, - ]);}}, - "Attraction": { - level: 1, - variant: (restraint, newRestraintName) => { - return KDAddEventVariant(restraint, newRestraintName, [ - {type: "CurseAttraction", trigger: "calcPlayChance", power: 0.5, inheritLinked: true}, - {trigger: "drawSGTooltip", type: "curseInfo", msg: "Attraction", color: "#ff5555", inheritLinked: true} - ]);}}, - "Sensitivity": { - level: 1, - variant: (restraint, newRestraintName) => { - return KDAddEventVariant(restraint, newRestraintName, [ - {type: "CurseSensitivity", trigger: "calcOrgThresh", power: 0.5, inheritLinked: true}, - {trigger: "drawSGTooltip", type: "curseInfo", msg: "Sensitivity", color: "#ff5555", inheritLinked: true} - ]);}}, - "Submission": { - level: 1, - variant: (restraint, newRestraintName) => { - return KDAddEventVariant(restraint, newRestraintName, [ - {type: "CurseSubmission", trigger: "orgasm", power: 10, inheritLinked: true}, - {trigger: "drawSGTooltip", type: "curseInfo", msg: "Submission", color: "#ff5555", inheritLinked: true} - ]);}}, - "Distraction": { - level: 1, - variant: (restraint, newRestraintName) => { - return KDAddEventVariant(restraint, newRestraintName, [ - {type: "multDistractionPos", trigger: "changeDistraction", power: 1.5, inheritLinked: true}, - {trigger: "drawSGTooltip", type: "curseInfo", msg: "Distraction", color: "#ff5555", inheritLinked: true} - ]);}}, - "Breathlessness": { - level: 1, - variant: (restraint, newRestraintName) => { - return KDAddEventVariant(restraint, newRestraintName, [ - {type: "multStaminaPos", trigger: "changeStamina", power: 0.6, inheritLinked: true}, - {trigger: "drawSGTooltip", type: "curseInfo", msg: "Breathlessness", color: "#ff5555", inheritLinked: true} - ]);}}, - "Futility": { - level: 1, - variant: (restraint, newRestraintName) => { - return KDAddEventVariant(restraint, newRestraintName, [ - {type: "multWillPos", trigger: "changeWill", power: 0.25, inheritLinked: true}, - {trigger: "drawSGTooltip", type: "curseInfo", msg: "Futile", color: "#ff5555", inheritLinked: true} - ]);}}, - "Tickle": { - level: 1, - variant: (restraint, newRestraintName) => { - return KDAddEventVariant(restraint, newRestraintName, [ - {trigger: "tick", type: "tickleDrain", power: -0.02, inheritLinked: true}, - {trigger: "drawSGTooltip", type: "curseInfo", msg: "Tickle", color: "#ff5555", inheritLinked: true} - ]); - } - }, - "Punish": { - level: 1, - variant: (restraint, newRestraintName) => { - return KDAddEventVariant(restraint, newRestraintName, [ - {trigger: "playerAttack", type: "cursePunish", chance: 1, damage: "souldrain", power: 1, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerCurse", inheritLinked: true}, - {trigger: "playerCast", type: "cursePunish", chance: 1, damage: "souldrain", power: 1, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerCurse", inheritLinked: true}, - {trigger: "drawSGTooltip", type: "curseInfo", msg: "Punish", color: "#ff5555", inheritLinked: true} - ]); - } - }, -}; - - -/** - * Contains a list of curse variant types - * Can be modified dynamically so mods can add basic curses - */ -let KDCurseVariantList = { - "Basic": [ - "Tickle", - "Punish", - "Light", - "Attraction", - "Submission", - "Distraction", - "Breathlessness", - "Futility", - "Sensitivity", - ], -}; -/** - * Unlockcurse list. This is always referenced dynamically when the restraint is picked up - */ -let KDCurseUnlockList = { - "Basic": [ - "ShrineWill", - "ShrineIllusion", - "ShrineElements", - "ShrineConjure", - "BlueLock", - "Will", - "TakeDamageFire", - "TakeDamageElectric", - "TakeDamageIce", - "TakeDamageGlue", - "TakeDamageChain", - "Mana", - ], -}; - -/** - * - * @param {restraint} restraint - * @param {string} newRestraintName - * @param {KinkyDungeonEvent[]} ev - * @param {number} power - * @param {string} lock - * @param {Record} enemyTags - * @returns {any} - */ -function KDAddEventVariant(restraint, newRestraintName, ev, power = 4, lock = "Purple", enemyTags = {basicCurse: 10}) { - KinkyDungeonDupeRestraintText(restraint.name, newRestraintName); - /** @type {KinkyDungeonEvent[]} */ - let events = ev.concat(restraint.events); - let escapeChance = { - Struggle: Math.min(restraint.escapeChance.Struggle, 0-.2), - Cut: Math.min(restraint.escapeChance.Cut || 1.0, -0.1), - Pick: Math.min(restraint.escapeChance.Pick || 1.0, 0.1), - }; - return { - protectionCursed: true, - escapeChance: escapeChance, - DefaultLock: lock, - HideDefaultLock: true, - magic: true, - events: events, - power: power, - good: false, - enemyTags: Object.assign({}, enemyTags), - shrine: restraint.shrine?.concat(["Cursed"]), - inventoryAsSelf: restraint.inventoryAsSelf || restraint.inventoryAs || restraint.name, - displayPower: restraint.displayPower || restraint.power, - }; -} - -function KinkyDungeonCurseInfo(item, Curse) { - if (Curse == "MistressKey" && KinkyDungeonItemCount("MistressKey")) { - KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseInfoMistressKeyHave").replace("KeyAmount", "" + KinkyDungeonItemCount("MistressKey")), "White", 2); - } else { - KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseInfo" + Curse), "White", 2); - } -} - -function KinkyDungeonCurseStruggle(item, Curse) { - if (Curse == "MistressKey") { - KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseStruggle" + Curse + item.name), "White", 2); - } else KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseStruggle" + Curse), "White", 2); - -} - -function KinkyDungeonCurseAvailable(item, Curse) { - if (KDCurses[Curse] && KDCurses[Curse].condition(item)) { - return true; - } - return false; -} - -/** - * - * @param {string} group - * @param {number} index - * @param {string} Curse - */ -function KinkyDungeonCurseUnlock(group, index, Curse) { - let unlock = true; - let keep = false; - let restraint = KinkyDungeonGetRestraintItem(group); - let host = restraint; - if (index) { - let surfaceItems = KDDynamicLinkListSurface(restraint); - if (surfaceItems[index]) { - host = surfaceItems[index - 1]; - restraint = surfaceItems[index]; - } - else console.log("Error! Please report the item combination and screenshot to Ada!"); - } - - if (KDCurses[Curse]) { - KDCurses[Curse].remove(restraint, host); - } - - if (unlock) { - KDSendStatus('escape', KinkyDungeonGetRestraintItem(group).name, "Curse"); - KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonCurseUnlock" + Curse), "#99FF99", 2); - if (restraint != host) { - KinkyDungeonRemoveDynamicRestraint(host, keep, undefined, KinkyDungeonPlayerEntity); - } else { - KinkyDungeonRemoveRestraint(group, keep, undefined, undefined, undefined, undefined, KinkyDungeonPlayerEntity); - } - } -} - diff --git a/Game/KinkyDungeonDialogue.js b/Game/KinkyDungeonDialogue.js deleted file mode 100644 index 40e8e3b3d..000000000 --- a/Game/KinkyDungeonDialogue.js +++ /dev/null @@ -1,1571 +0,0 @@ -"use strict"; - -let KDDialogueData = { - CurrentDialogueIndex: 0, -}; - -/** - * - * @param {number} Min - * @param {number} Avg - * @param {number} Max - * @param {entity} [Enemy] - * @returns {number} - */ -function KDPersonalitySpread(Min, Avg, Max, Enemy) { - return KDStrictPersonalities.includes(Enemy?.personality || KDGameData.CurrentDialogMsgPersonality) ? Max : - (!KDLoosePersonalities.includes(Enemy?.personality || KDGameData.CurrentDialogMsgPersonality) ? Avg : - Min); -} - -function KinkyDungeonCanPutNewDialogue() { - return !KDGameData.CurrentDialog && !KinkyDungeonFlags.get("NoDialogue"); -} - -function KDBasicCheck(PositiveReps, NegativeReps, Modifier = 0) { - let value = Modifier; - if (KinkyDungeonFlags.has("OfferRefused")) value -= 15; - if (KinkyDungeonFlags.has("OfferRefusedLight")) value -= 15; - // Being low willpower makes it harder - if (KinkyDungeonStatWill < 10) value -= Math.max(0, 5 * (10 - KinkyDungeonStatWill)); - for (let rep of PositiveReps) { - if (KinkyDungeonGoddessRep[rep] != undefined) value += 50 + KinkyDungeonGoddessRep[rep]; - } - for (let rep of NegativeReps) { - if (KinkyDungeonGoddessRep[rep] != undefined) value -= 50 + KinkyDungeonGoddessRep[rep]; - } - return value; -} - -function KDDialogueApplyPersonality(allowed) { - if (allowed.includes(KDGameData.CurrentDialogMsgPersonality)) KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + KDGameData.CurrentDialogMsgPersonality; -} - -function KDGetDialogue() { - let dialogue = KDDialogue[KDGameData.CurrentDialog]; - if (KDGameData.CurrentDialogStage && dialogue?.options) { - let stages = KDGameData.CurrentDialogStage.split("_"); - for (let i = 0; i < stages.length; i++) { - if (dialogue.options[stages[i]]) - dialogue = dialogue.options[stages[i]]; - else { - // Break the dialogue - console.log("Error in dialogue " + KDGameData.CurrentDialog + ", stage = " + KDGameData.CurrentDialogStage); - KDGameData.CurrentDialog = ""; - break; - } - } - } - return dialogue; -} - -let KDMaxDialogue = 7; -let KDOptionOffset = 0; - -function KDDrawDialogue() { - KDDraw(kdcanvas, kdpixisprites, "dialogbg", KinkyDungeonRootDirectory + "DialogBackground.png", 500, 0, 1000, 1000, undefined, { - zIndex: 111, - }); - if (KDGameData.CurrentDialog && !(KinkyDungeonSlowMoveTurns > 0)) { - KinkyDungeonDrawState = "Game"; - // Get the current dialogue and traverse down the tree - let dialogue = KDGetDialogue(); - // Now that we have the dialogue, we check if we have a message - if (dialogue.response && !KDGameData.CurrentDialogMsg) KDGameData.CurrentDialogMsg = dialogue.response; - if (KDGameData.CurrentDialogMsg == "Default") KDGameData.CurrentDialogMsg = KDGameData.CurrentDialog + KDGameData.CurrentDialogStage; - - // Type the message - let text = TextGet("r" + KDGameData.CurrentDialogMsg).split("|"); - for (let i = 0; i < text.length; i++) { - let tt = text[i]; - if (KDGameData.CurrentDialogMsgData) { - for (let d of Object.entries(KDGameData.CurrentDialogMsgData)) { - tt = tt.replace(d[0], d[1]); - } - } - DrawTextFitKD(tt.replace("SPEAKER", TextGet("Name" + KDGameData.CurrentDialogMsgSpeaker)), - 1000, 300 + 50 * i - 25 * text.length, 900, "white", "black", undefined, undefined, 115); - } - - // Draw the options - if (dialogue.options) { - let entries = Object.entries(dialogue.options); - - let II = 0; - let gagged = KDDialogueGagged(); - for (let i = KDOptionOffset; i < entries.length && II < KDMaxDialogue; i++) { - if ((!entries[i][1].prerequisiteFunction || entries[i][1].prerequisiteFunction(gagged, KinkyDungeonPlayerEntity)) - && (!entries[i][1].gagRequired || gagged) - && (!entries[i][1].gagDisabled || !gagged)) { - let playertext = entries[i][1].playertext; - if (playertext == "Default") playertext = KDGameData.CurrentDialog + KDGameData.CurrentDialogStage + "_" + entries[i][0]; - if (entries[i][1].gag && KDDialogueGagged()) playertext = playertext + "Gag"; - - let tt = TextGet("d" + playertext); - if (KDGameData.CurrentDialogMsgData) { - for (let d of Object.entries(KDGameData.CurrentDialogMsgData)) { - tt = tt.replace(d[0], d[1]); - } - } - DrawButtonKDEx("dialogue" + II, (bdata) => { - KDOptionOffset = 0; - KDDialogueData.CurrentDialogueIndex = 0; - KDSendInput("dialogue", {dialogue: KDGameData.CurrentDialog, dialogueStage: KDGameData.CurrentDialogStage + ((KDGameData.CurrentDialogStage) ? "_" : "") + entries[i][0], click: true}); - return true; - }, KinkyDungeonDialogueTimer < CommonTime(), 700, 450 + II * 60, 600, 50, tt, KinkyDungeonDialogueTimer < CommonTime() ? "#ffffff" : "#888888", undefined, undefined, undefined, undefined, - KDDialogueData.CurrentDialogueIndex == II ? KDTextGray3 : undefined, undefined, undefined, { - zIndex: 122, - }); - if (MouseIn(700, 450 + II * 60, 600, 50)) KDDialogueData.CurrentDialogueIndex = II; - II += 1; - } - } - if (II >= KDMaxDialogue) { - DrawButtonKDEx("dialogueUP", (bdata) => { - KDOptionOffset -= 1; - return true; - }, KDOptionOffset > 0, 1350, 450, 90, 40, "", KDOptionOffset > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png", - undefined, undefined, undefined, undefined, undefined, undefined, { - zIndex: 122, - }); - DrawButtonKDEx("dialogueDOWN", (bdata) => { - KDOptionOffset += 1; - return true; - }, KDOptionOffset + KDMaxDialogue < entries.length, 1350, 450 + (KDMaxDialogue - 1) * 60 + 10, 90, 40, "", KDOptionOffset + KDMaxDialogue < entries.length ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png", - undefined, undefined, undefined, undefined, undefined, undefined, { - zIndex: 122, - }); - } - if (KDDialogueData.CurrentDialogueIndex < 0) KDDialogueData.CurrentDialogueIndex = 0; - if (KDDialogueData.CurrentDialogueIndex >= II) KDDialogueData.CurrentDialogueIndex = II - 1; - } - - } else if (!KDGameData.CurrentDialog) { - // Clear data - KDGameData.CurrentDialogMsgData = {}; - KDGameData.CurrentDialogMsgValue = {}; - } -} - -function KDIncreaseOfferFatigue(Amount) { - if (!KDGameData.OfferFatigue) { - KDGameData.OfferFatigue = 0; - } - KDGameData.OfferFatigue = Math.max(0, KDGameData.OfferFatigue + Amount); - - if (Amount > 0) KinkyDungeonSetFlag("OfferRefused", KDOfferCooldown * 2); - if (Amount > 0) KinkyDungeonSetFlag("OfferRefusedLight", KDOfferCooldown * 5); -} - -function KDEnemyHelpfulness(enemy) { - if (!enemy.personality) return 1.0; - if (KDStrictPersonalities.includes(enemy.personality)) return 0.33; - if (KDLoosePersonalities.includes(enemy.personality)) return 1.75; -} - -function KDGetSpeaker() { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return enemy; - } - return null; -} - -/** - * - * @param {number} Amount - */ -function KDPleaseSpeaker(Amount) { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KDAddOpinion(enemy, Amount * 100); - let faction = KDGetFactionOriginal(enemy); - if (!KinkyDungeonHiddenFactions.includes(faction)) { - KinkyDungeonChangeFactionRep(faction, Amount); - } - } -} - -/** - * - * @param {entity} enemy - * @param {number} Amount - */ -function KDAddOpinion(enemy, Amount) { - if (!enemy) return; - let a = Math.min(1000, Math.abs(Amount)); - while (a > 0) { - enemy.opinion = Math.max((enemy.opinion || 0) + Math.min(10, a) * Math.min(10, a) / (Amount > 0 ? (Math.min(10, a) + (enemy.opinion || 0)) : -1), 0); - a -= 10; - } -} - -function KDAllySpeaker(Turns, Follow) { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KDAddOpinion(enemy, Turns); - if (!(enemy.hostile > 0)) { - enemy.allied = Turns; - if (Follow) { - KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 0); - } - } - } -} - -function KDAggroSpeaker(Turns = 300) { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - if (!(enemy.hostile > 0)) { - enemy.hostile = Turns; - } else enemy.hostile = Math.max(enemy.hostile, Turns); - } -} - - -// Success chance for a basic dialogue -function KDBasicDialogueSuccessChance(checkResult) { - return Math.max(0, Math.min(1.0, checkResult/100)); -} - -// Success chance for a basic dialogue -function KDAgilityDialogueSuccessChance(checkResult) { - let evasion = KinkyDungeonPlayerEvasion(); - return Math.max(0, Math.min(1.0, (checkResult/100 - (KDGameData.OfferFatigue ? KDGameData.OfferFatigue /100 : 0) + 0.2 * Math.max(0, 3 - KinkyDungeonSlowLevel)) * evasion)); -} - -// Success chance for an offensive dialogue -function KDOffensiveDialogueSuccessChance(checkResult) { - let accuracy = KinkyDungeonGetEvasion(); - return Math.max(0, Math.min(1.0, (checkResult/100 - (KDGameData.OfferFatigue ? KDGameData.OfferFatigue / 100 : 0) - - 0.15 + 0.3 * Math.max(0, 3 - KinkyDungeonSlowLevel)) * accuracy)); -} - -let KinkyDungeonDialogueTimer = 0; - -/** - * - * @param {string} Dialogue - * @param {string} [Speaker] - * @param {boolean} [Click] - * @param {string} [Personality] - * @param {entity} [enemy] - */ -function KDStartDialog(Dialogue, Speaker, Click, Personality, enemy) { - KinkyDungeonInterruptSleep(); - KDDisableAutoWait(); - KinkyDungeonDialogueTimer = CommonTime() + 700 + KinkyDungeonSlowMoveTurns * 200; - KDOptionOffset = 0; - KinkyDungeonFastMovePath = []; - KinkyDungeonDrawState = "Game"; - KDDialogueData.CurrentDialogueIndex = 0; - - - KDDoDialogue({dialogue: Dialogue, dialogueStage: "", click: Click, speaker: Speaker, personality: Personality, enemy: enemy ? enemy.id : undefined}); -} - - -function KDDoDialogue(data) { - KDDelayedActionPrune(["Action", "Dialogue"]); - if (!KDGameData.CurrentDialogMsgData) KDGameData.CurrentDialogMsgData = {}; - if (!KDGameData.CurrentDialogMsgValue) KDGameData.CurrentDialogMsgValue = {}; - - KDGameData.CurrentDialog = data.dialogue; - KDGameData.CurrentDialogStage = data.dialogueStage; - if (data.speaker) { - let oldSpeaker = KDGameData.CurrentDialogMsgSpeaker; - KDGameData.CurrentDialogMsgSpeaker = data.speaker; - if (KDGameData.CurrentDialogMsgSpeaker != oldSpeaker) - KDGameData.CurrentDialogMsgPersonality = ""; // Reset when speaker changes - } - if (data.enemy) { - KDGameData.CurrentDialogMsgID = data.enemy; - } - if (data.personality) - KDGameData.CurrentDialogMsgPersonality = data.personality; - - let dialogue = KDGetDialogue(); - if (dialogue.data) KDGameData.CurrentDialogMsgData = dialogue.data; - if (dialogue.response) KDGameData.CurrentDialogMsg = dialogue.response; - if (dialogue.response == "Default") KDGameData.CurrentDialogMsg = KDGameData.CurrentDialog + KDGameData.CurrentDialogStage; - if (dialogue.personalities) { - KDDialogueApplyPersonality(dialogue.personalities); - } - let abort = false; - if (data.click) { - let gagged = KDDialogueGagged(); - if (dialogue.gagFunction && gagged) { - abort = dialogue.gagFunction(KinkyDungeonPlayerEntity); - } else if (dialogue.clickFunction) { - abort = dialogue.clickFunction(gagged, KinkyDungeonPlayerEntity); - } - } - if (!abort) { - if (dialogue.exitDialogue) { - KDGameData.CurrentDialog = ""; - KDGameData.CurrentDialogStage = ""; - } else { - let modded = false; - if (dialogue.leadsTo != undefined) { - KDGameData.CurrentDialog = dialogue.leadsTo; - KDGameData.CurrentDialogStage = ""; - modded = true; - } - if (dialogue.leadsToStage != undefined) { - KDGameData.CurrentDialogStage = dialogue.leadsToStage; - modded = true; - } - if (modded && !dialogue.dontTouchText) { - dialogue = KDGetDialogue(); - if (dialogue.response) KDGameData.CurrentDialogMsg = dialogue.response; - if (dialogue.response == "Default") KDGameData.CurrentDialogMsg = KDGameData.CurrentDialog + KDGameData.CurrentDialogStage; - } - } - } -} - -/** - * - * @param {string} Dialogue - * @param {string} [Speaker] - * @param {boolean} [Click] - * @param {string} [Personality] - * @param {entity} [enemy] - */ -function KDStartDialogInput(Dialogue, Speaker, Click, Personality, enemy) { - KinkyDungeonInterruptSleep(); - KDDisableAutoWait(); - KinkyDungeonDialogueTimer = CommonTime() + 700 + KinkyDungeonSlowMoveTurns * 200; - KDOptionOffset = 0; - KinkyDungeonFastMovePath = []; - KinkyDungeonDrawState = "Game"; - KDDialogueData.CurrentDialogueIndex = 0; - KDSendInput("dialogue", {dialogue: Dialogue, dialogueStage: "", click: Click, speaker: Speaker, personality: Personality, enemy: enemy ? enemy.id : undefined}); -} - -function KDDialogueGagged() { - let dialogue = KDGetDialogue(); - let threshold = dialogue.gagThreshold ? dialogue.gagThreshold : 0.01; - if (KinkyDungeonGagTotal() >= threshold) return true; - return false; -} - -function KDHandleDialogue() { - if (KDGameData.CurrentDialog && KinkyDungeonDialogueTimer < CommonTime()) { - KinkyDungeonInterruptSleep(); - // Get the current dialogue and traverse down the tree - let dialogue = KDGetDialogue(); - - if (dialogue.inventory) - KinkyDungeonhandleQuickInv(true); - } - - return false; -} - - -/** - * - * @param {number} x - * @param {number} y - * @param {string} Name - * @returns {entity} - */ -function DialogueCreateEnemy(x, y, Name) { - if (KinkyDungeonEnemyAt(x, y)) KDKickEnemy(KinkyDungeonEnemyAt(x, y)); - let Enemy = KinkyDungeonGetEnemyByName(Name); - let e = {summoned: true, Enemy: Enemy, id: KinkyDungeonGetEnemyID(), - x:x, y:y, - hp: (Enemy && Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0}; - KDAddEntity(e); - return e; -} - -/** - * - * @returns {entity} - */ -function KDDialogueEnemy() { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return enemy; - } - return null; -} - - - -function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight) { - /** - * @type {KinkyDialogue} - */ - let dialog = { - response: "Default", - options: {}, - }; - dialog.options.Leave = {playertext: "Leave", exitDialogue: true, - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetEnemyFlag(enemy, "NoShop", 9999); - } - return false; - }, - }; - dialog.options.Attack = {playertext: name + "Attack", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (!enemy || (enemy.aware && !enemy.playWithPlayer)) return true; - return false; - }, - options: { - "Confirm": {playertext: name + "Attack_Confirm", response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - if (!enemy.Enemy.allied) { - KDMakeHostile(enemy); - let faction = KDGetFactionOriginal(enemy); - if (!KinkyDungeonHiddenFactions.includes(faction)) { - KinkyDungeonChangeRep("Ghost", -5); - KinkyDungeonChangeFactionRep(faction, -0.06); - } - } else { - enemy.hp = 0; - } - } - return false; - }, - exitDialogue: true, - }, - "Leave": {playertext: name + "Attack_Leave", response: "Default", - leadsToStage: "", - }, - } - }; - dialog.options.AttackPlay = {playertext: name + "AttackPlay", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.playWithPlayer) return true; - return false; - }, - options: { - "Confirm": {playertext: name + "Attack_Confirm", response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - if (!enemy.Enemy.allied) { - KDMakeHostile(enemy); - let faction = KDGetFactionOriginal(enemy); - if (!KinkyDungeonHiddenFactions.includes(faction)) { - KinkyDungeonChangeRep("Ghost", -5); - } - } else { - enemy.hp = 0; - } - } - return false; - }, - exitDialogue: true, - }, - "Leave": {playertext: name + "AttackPlay_Leave", response: "Default", - leadsToStage: "", - }, - } - }; - dialog.options.AttackUnaware = {playertext: name + "AttackUnaware", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && (enemy.aware || enemy.playWithPlayer)) return false; - return true; - }, - options: { - "Confirm": {playertext: name + "AttackUnaware_Confirm", response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - if (!enemy.Enemy.allied) { - KDMakeHostile(enemy); - enemy.stun = Math.max(enemy.stun || 0, 1); - enemy.vulnerable = Math.max(enemy.vulnerable || 0, 1); - } else { - enemy.hp = 0; - } - } - return false; - }, - exitDialogue: true, - }, - "Leave": {playertext: name + "AttackUnaware_Leave", response: "Default", - leadsToStage: "", - }, - } - }; - /*dialog.options.LetMePass = {playertext: name + "LetMePass", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return !KinkyDungeonFlags.has("passthrough"); - } - return false; - }, - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - if (KinkyDungeonFlags.has("LetMePass")) { - KinkyDungeonSetEnemyFlag(enemy, "passthrough", 8); - KDGameData.CurrentDialog = ""; - KDGameData.CurrentDialogStage = ""; - KinkyDungeonSetFlag("LetMePass", 30); - } - } - return false; - }, - options: { - "Confirm": {playertext: name + "LetMePass_Confirm", response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetEnemyFlag(enemy, "passthrough", 8); - if (KinkyDungeonFlags.has("LetMePass")) { - KDGameData.CurrentDialog = ""; - KDGameData.CurrentDialogStage = ""; - } - KinkyDungeonSetFlag("LetMePass", 30); - } - return false; - }, - exitDialogue: true, - }, - "ConfirmAll": {playertext: name + "LetMePass_ConfirmAll", response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetFlag("Passthrough", 8); - } - return false; - }, - exitDialogue: true, - }, - "Leave": {playertext: name + "LetMePass_Leave", response: "Default", - leadsToStage: "", - }, - } - };*/ - dialog.options.StopFollowingMe = {playertext: name + "StopFollowingMe", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return KDAllied(enemy) && !KDEnemyHasFlag(enemy, "NoFollow"); - } - return false; - }, - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 9999); - } - return false; - }, - leadsToStage: "", dontTouchText: true, - }; - dialog.options.FollowMe = {playertext: name + "FollowMe", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return KDAllied(enemy) && KDEnemyHasFlag(enemy, "NoFollow") && !KDEnemyHasFlag(enemy, "Shop"); - } - return false; - }, - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - if (!KDEnemyHasFlag(enemy, "NoStay") - && (KDRandom() < (70 - KinkyDungeonGoddessRep.Ghost + KDGetModifiedOpinion(enemy) + (KinkyDungeonStatsChoice.get("Dominant") ? 50 : 0))/100 * 0.35 * KDEnemyHelpfulness(enemy) || enemy.Enemy.allied) - ) { - KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 0); - } else { - KDGameData.CurrentDialogMsg = name + "StayHere_Fail"; - KinkyDungeonSetEnemyFlag(enemy, "NoStay", 100); - } - } - return false; - }, - leadsToStage: "", dontTouchText: true, - }; - dialog.options.DontStayHere = {playertext: name + "DontStayHere", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return !KDHostile(enemy) && KDEnemyHasFlag(enemy, "StayHere"); - } - return false; - }, - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetEnemyFlag(enemy, "StayHere", 0); - } - return false; - }, - leadsToStage: "", dontTouchText: true, - }; - dialog.options.StayHere = {playertext: name + "StayHere", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return !KDHostile(enemy) && !KDEnemyHasFlag(enemy, "StayHere") && !KDEnemyHasFlag(enemy, "Shop"); - } - return false; - }, - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - if (!KDEnemyHasFlag(enemy, "NoStay") && (KDRandom() < (50 - KinkyDungeonGoddessRep.Ghost + KDGetModifiedOpinion(enemy) + (KinkyDungeonStatsChoice.get("Dominant") ? 50 : 0))/100 * KDEnemyHelpfulness(enemy) * (KDAllied(enemy) ? 4.0 : 0.25) || enemy.Enemy.allied)) { - KinkyDungeonSetEnemyFlag(enemy, "StayHere", -1); - enemy.gx = enemy.x; - enemy.gy = enemy.y; - } else { - KDGameData.CurrentDialogMsg = name + "StayHere_Fail"; - KinkyDungeonSetEnemyFlag(enemy, "NoStay", 100); - } - } - return false; - }, - leadsToStage: "", dontTouchText: true, - }; - dialog.options.Aggressive = {playertext: name + "Aggressive", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return !KDHostile(enemy) && KDEnemyHasFlag(enemy, "Defensive"); - } - return false; - }, - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetEnemyFlag(enemy, "Defensive", 0); - } - return false; - }, - leadsToStage: "", dontTouchText: true, - }; - dialog.options.Defensive = {playertext: name + "Defensive", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return !KDHostile(enemy) && !KDEnemyHasFlag(enemy, "Defensive") && !KDEnemyHasFlag(enemy, "Shop"); - } - return false; - }, - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetEnemyFlag(enemy, "Defensive", -1); - } - return false; - }, - leadsToStage: "", dontTouchText: true, - }; - dialog.options.HelpMe = {playertext: name + "HelpMe", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return !KDHostile(enemy) && enemy.Enemy.bound && !enemy.Enemy.tags.nohelp && !KDHelpless(enemy) - && !KDEnemyHasFlag(enemy, "NoHelp") && !KDEnemyHasFlag(enemy, "HelpMe") && KinkyDungeonAllRestraint().length > 0; - } - return false; - }, - options: { - "Confirm": {playertext: name + "HelpMe_Confirm", response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - if (!KDEnemyHasFlag(enemy, "NoHelp") - && KDRandom() < (KDPersonalitySpread(125, 85, 25) - KinkyDungeonGoddessRep.Ghost + KDGetModifiedOpinion(enemy) + (KinkyDungeonStatsChoice.get("Dominant") ? 25 : 0))/100 * (KDPersonalitySpread(0.0, -0.25, -0.5) + (KDAllied(enemy) ? 2.0 : 1.0)) - ) { - KinkyDungeonChangeRep("Ghost", 3); - KinkyDungeonSetEnemyFlag(enemy, "HelpMe", 30); - KinkyDungeonSetEnemyFlag(enemy, "wander", 30); - } else { - KDGameData.CurrentDialogMsg = name + "HelpMe_Fail"; - KinkyDungeonSetEnemyFlag(enemy, "NoHelp", 100); - - KinkyDungeonSetEnemyFlag(enemy, "playLikely", 10); - KinkyDungeonChangeRep("Ghost", 1); - } - } - return false; - }, - leadsToStage: "", - dontTouchText: true, - }, - "Leave": {playertext: name + "HelpMe_Leave", response: "Default", - leadsToStage: "", - }, - } - }; - dialog.options.HelpMeCommandWord = {playertext: name + "HelpMeCommandWord", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker && enemy.Enemy.unlockCommandLevel > 0) { - return !KDHostile(enemy) && enemy.Enemy.bound && !enemy.Enemy.tags.nohelp && !KDHelpless(enemy) - && !KDEnemyHasFlag(enemy, "NoHelpCommandWord") && !KDEnemyHasFlag(enemy, "commandword") && KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks).length > 0; - } - return false; - }, - options: { - "Confirm": {playertext: name + "HelpMeCommandWord_Confirm", response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - if (!KDEnemyHasFlag(enemy, "NoHelpCommandWord") - && KDRandom() < (KDPersonalitySpread(125, 85, 25) - KinkyDungeonGoddessRep.Ghost + KDGetModifiedOpinion(enemy) + (KinkyDungeonStatsChoice.get("Dominant") ? 25 : 0))/100 * (KDPersonalitySpread(0.0, -0.25, -0.5) + (KDAllied(enemy) ? 2.0 : 1.0)) - ) { - KinkyDungeonChangeRep("Ghost", 3); - if (KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks).length > 0) { - for (let r of KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks, true)) { - KinkyDungeonLock(r, ""); - } - } - const unlockSpell = KinkyDungeonFindSpell("EffectEnemyCM" + (enemy?.Enemy?.unlockCommandLevel || 1), true) || KinkyDungeonFindSpell("EffectEnemyCM1", true); - KinkyDungeonCastSpell(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, unlockSpell, undefined, undefined, undefined); - - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - KinkyDungeonSetEnemyFlag(enemy, "commandword", enemy.Enemy.unlockCommandCD || 90); - } else { - KDGameData.CurrentDialogMsg = name + "HelpMeCommandWord_Fail"; - KinkyDungeonSetEnemyFlag(enemy, "NoHelpCommandWord", 100); - KinkyDungeonChangeRep("Ghost", 1); - } - } - return false; - }, - leadsToStage: "", - dontTouchText: true, - }, - "Leave": {playertext: name + "HelpMeCommandWord_Leave", response: "Default", - leadsToStage: "", - }, - } - }; - dialog.options.HelpMeKey = {playertext: name + "HelpMeKey", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return !KDHostile(enemy) && enemy.Enemy.bound && !enemy.Enemy.tags.nohelp && !KDHelpless(enemy) - && !KDEnemyHasFlag(enemy, "NoHelpKey") && enemy.items && enemy.items.includes("RedKey") && KinkyDungeonPlayerGetRestraintsWithLocks(KDKeyedLocks).length > 0; - } - return false; - }, - options: { - "Confirm": {playertext: name + "HelpMeKey_Confirm", response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - if (!KDEnemyHasFlag(enemy, "NoHelpKey") - && KDRandom() < (KDPersonalitySpread(125, 85, 25) - KinkyDungeonGoddessRep.Ghost + KDGetModifiedOpinion(enemy) + (KinkyDungeonStatsChoice.get("Dominant") ? 25 : 0))/100 * (KDPersonalitySpread(0.0, -0.25, -0.5) + (KDAllied(enemy) ? 2.0 : 1.0)) - ) { - KinkyDungeonChangeRep("Ghost", 3); - KinkyDungeonRedKeys += 1; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Coins.ogg"); - enemy.items.splice(enemy.items.indexOf("RedKey"), 1); - } else { - KDGameData.CurrentDialogMsg = name + "HelpMeKey_Fail"; - KinkyDungeonSetEnemyFlag(enemy, "NoHelpKey", 100); - KinkyDungeonChangeRep("Ghost", 1); - } - } - return false; - }, - leadsToStage: "", - dontTouchText: true, - }, - "Leave": {playertext: name + "HelpMeKey_Leave", response: "Default", - leadsToStage: "", - }, - } - }; - dialog.options.DontHelpMe = {playertext: name + "DontHelpMe", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return enemy.Enemy.bound && !enemy.Enemy.tags.nohelp && !KDEnemyHasFlag(enemy, "NoHelp") && KDEnemyHasFlag(enemy, "HelpMe") && KinkyDungeonAllRestraint().length > 0; - } - return false; - }, - options: { - "Confirm": {playertext: name + "DontHelpMe_Confirm", response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetEnemyFlag(enemy, "HelpMe", 0); - KinkyDungeonSetEnemyFlag(enemy, "wander", 0); - } - return false; - }, - exitDialogue: true, - }, - "Leave": {playertext: name + "DontHelpMe_Leave", response: "Default", - leadsToStage: "", - }, - } - }; - dialog.options.Shop = {playertext: name + "Shop", response: "Default", - prerequisiteFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - return KDEnemyHasFlag(enemy, "Shop"); - } - return false; - }, - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - for (let shop of Object.values(KDShops)) { - if (KDEnemyHasFlag(enemy, shop.name)) { - KDStartDialog(shop.name, enemy.Enemy.name, true, enemy.personality, enemy); - return true; - } - } - } - }, - exitDialogue: true, - }; - KDAllyDialog[name] = {name: name, tags: requireTags, singletag: requireSingleTag, excludeTags: excludeTags, weight: weight}; - return dialog; -} - - -/** - * @type {Record} - */ -let KDPrisonRescues = {}; - - -/** - * - * @param {string} name - * @param {string} faction - * @param {string[]} enemytypes - * @returns {KinkyDialogue} - */ -function KDPrisonerRescue(name, faction, enemytypes) { - /** - * @type {KinkyDialogue} - */ - let dialogue = { - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonInterruptSleep(); - let door = KDGetJailDoor(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - if (door) { - if (door.tile) { - door.tile.Lock = undefined; - KDUpdateDoorNavMap(); - } - KinkyDungeonMapSet(door.x, door.y, 'd'); - let e = DialogueCreateEnemy(door.x, door.y, enemytypes[0]); - e.allied = 9999; - e.faction = "Player"; - KDGameData.CurrentDialogMsgSpeaker = e.Enemy.name; - - let reinforcementCount = Math.floor(1 + KDRandom() * (KDGameData.PriorJailbreaks ? (Math.min(5, KDGameData.PriorJailbreaks) + 1) : 1)); - KDGameData.PriorJailbreaks += 1; - for (let i = 0; i < reinforcementCount; i++) { - let pp = KinkyDungeonGetNearbyPoint(door.x, door.y, true, undefined, undefined); - if (pp) { - let ee = DialogueCreateEnemy(pp.x, pp.y, enemytypes[1] || enemytypes[0]); - ee.allied = 9999; - ee.faction = "Player"; - } - } - } - KDGameData.KinkyDungeonGuardSpawnTimer = 50 + Math.floor(KDRandom() * 10); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }; - KDPrisonRescues[name] = { - speaker: enemytypes[0], - faction: faction, - }; - return dialogue; -} - -// ["wolfGear", "wolfRestraints"] -function KDRecruitDialogue(name, faction, outfitName, goddess, restraints, restraintscount, restraintsAngry, restraintscountAngry, requireTags, requireSingleTag, excludeTags, chance) { - /** - * @type {KinkyDialogue} - */ - let recruit = { - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag(name, -1, 1); - return false; - }, - options: { - "Yes": {gag: true, playertext: "Default", response: "Default", - options: { - "Yes": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDPleaseSpeaker(0.1); - KinkyDungeonChangeRep("Ghost", 2); - for (let i = 0; i < restraintscount; i++) { - let r = KinkyDungeonGetRestraint({tags: restraints}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (r) KinkyDungeonAddRestraintIfWeaker(r, 0, true); - } - let outfit = {name: outfitName, type: Outfit, id: KinkyDungeonGetItemID()}; - if (!KinkyDungeonInventoryGet(outfitName)) KinkyDungeonInventoryAdd(outfit); - //if (KinkyDungeonInventoryGet("OutfitDefault")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("OutfitDefault")); - KinkyDungeonSetDress(outfitName, outfitName); - KinkyDungeonSetFlag("Recruit_" + name, -1); - KinkyDungeonSetFlag("Recruited", -1); - KDChangeFactionRelation("Player", faction, 0.4, true); - KDChangeFactionRelation("Player", faction, -0.2); - KinkyDungeonSlowMoveTurns = 3; - KinkyDungeonSleepTime = CommonTime() + 200; - KinkyDungeonSetFlag(name, -1, 1); - return false; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - let diff = KinkyDungeonStatsChoice.has("Dominant") ? 0 : 35; - if (KDBasicCheck([goddess], ["Ghost"]) <= diff) { - KDGameData.CurrentDialogStage = "Force"; - KDGameData.CurrentDialogMsg = name + "ForceYes"; - KDGameData.CurrentDialogMsgValue.Percent = KDAgilityDialogueSuccessChance(KDBasicCheck([goddess], ["Ghost"])); - KDGameData.CurrentDialogMsgData.PERCENT = `${Math.round(100 * KDGameData.CurrentDialogMsgValue.Percent)}%`; - } - KinkyDungeonChangeRep("Ghost", -1); - KinkyDungeonSetFlag(name, -1, 1); - return false; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - }, - }, - "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - let diff = KinkyDungeonStatsChoice.has("Dominant") ? 0 : 45; - if (KDBasicCheck(["Metal"], ["Ghost"]) <= diff) { - KDGameData.CurrentDialogStage = "Force"; - KDGameData.CurrentDialogMsg = ""; - KDGameData.CurrentDialogMsgValue.Percent = KDAgilityDialogueSuccessChance(KDBasicCheck([goddess], ["Ghost"])); - KDGameData.CurrentDialogMsgData.PERCENT = `${Math.round(100 * KDGameData.CurrentDialogMsgValue.Percent)}%`; - } - KinkyDungeonChangeRep("Ghost", -1); - KinkyDungeonSetFlag(name, -1, 1); - return false; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - "Force": {gag: true, playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => {return false;}, - options: { - "Yes": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDPleaseSpeaker(0.08); - KinkyDungeonChangeRep("Ghost", 2); - for (let i = 0; i < restraintscount; i++) { - let r = KinkyDungeonGetRestraint({tags: restraints}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (r) KinkyDungeonAddRestraintIfWeaker(r, 0, true); - } - let outfit = {name: outfitName, type: Outfit, id: KinkyDungeonGetItemID()}; - if (!KinkyDungeonInventoryGet(outfitName)) KinkyDungeonInventoryAdd(outfit); - //if (KinkyDungeonInventoryGet("Default")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Default")); - KinkyDungeonSetDress(outfitName, outfitName); - KinkyDungeonSetFlag("Recruit_" + name, -1); - KinkyDungeonSetFlag("Recruited", -1); - KDChangeFactionRelation("Player", faction, 0.4, true); - KDChangeFactionRelation("Player", faction, -0.2); - KinkyDungeonSlowMoveTurns = 3; - KinkyDungeonSleepTime = CommonTime() + 200; - KinkyDungeonSetFlag(name, -1, 1); - return false; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}},}, - "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - let percent = KDGameData.CurrentDialogMsgValue.Percent; - KinkyDungeonChangeRep("Ghost", -1); - if (KDRandom() > percent) { - // Fail - KDIncreaseOfferFatigue(-20); - KDGameData.CurrentDialogMsg = name + "Force_Failure"; - for (let i = 0; i < restraintscountAngry; i++) { - let r = KinkyDungeonGetRestraint({tags: restraintsAngry}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (r) KinkyDungeonAddRestraintIfWeaker(r, 0, true); - } - let outfit = {name: outfitName, type: Outfit, id: KinkyDungeonGetItemID()}; - if (!KinkyDungeonInventoryGet(outfitName)) KinkyDungeonInventoryAdd(outfit); - //if (KinkyDungeonInventoryGet("Default")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Default")); - KinkyDungeonSetDress(outfitName, outfitName); - KinkyDungeonSlowMoveTurns = 3; - KinkyDungeonSleepTime = CommonTime() + 200; - } else { - KDIncreaseOfferFatigue(10); - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KDMakeHostile(enemy); - KinkyDungeonChangeRep(goddess, -2); - } - } - KinkyDungeonSetFlag(name, -1, 1); - return false; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}},}, - }, - }, - } - }; - - KDRecruitDialog[name] = {name: name, outfit: outfitName, tags: requireTags, singletag: requireSingleTag, excludeTags: excludeTags, chance: chance}; - KDDialogueTriggers[name] = KDRecruitTrigger(name, KDRecruitDialog[name]); - return recruit; -} - -let KDMaxSellItems = 6; -function KDShopDialogue(name, items, requireTags, requireSingleTag, chance) { - /** - * @type {KinkyDialogue} - */ - let shop = { - inventory: true, - response: "Default", - clickFunction: (gagged, player) => { - /*let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetEnemyFlag(enemy, "Shop", 0); - }*/ - for (let i = 0; i < items.length; i++) { - let item = items[i]; - if (KinkyDungeonGetRestraintByName(item)) { - KDGameData.CurrentDialogMsgData["Item"+i] = TextGet("Restraint" + item); - let power = KinkyDungeonGetRestraintByName(item).power; - if (!power || power < 1) power = 1; - KDGameData.CurrentDialogMsgValue["ItemCost"+i] = 5 * Math.round((10 + 2 * Math.pow(power, 1.5))/5); - KDGameData.CurrentDialogMsgData["ItemCost"+i] = "" + KDGameData.CurrentDialogMsgValue["ItemCost"+i]; - } else { - KDGameData.CurrentDialogMsgData["Item"+i] = TextGet("KinkyDungeonInventoryItem" + item); - KDGameData.CurrentDialogMsgValue["ItemCost"+i] = Math.round(KinkyDungeonItemCost(KinkyDungeonFindConsumable(item) ? KinkyDungeonFindConsumable(item) : KinkyDungeonFindWeapon(item), true, true) * 0.75); - KDGameData.CurrentDialogMsgData["ItemCost"+i] = "" + KDGameData.CurrentDialogMsgValue["ItemCost"+i]; - } - } - return false; - }, - options: {}, - }; - shop.options.Leave = {playertext: "Leave", exitDialogue: true, - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetEnemyFlag(enemy, "NoShop", 9999); - KinkyDungeonSetEnemyFlag(enemy, "NoTalk", 8); - } - return false; - }, - }; - shop.options.Attack = {gag: true, playertext: "ItemShopAttack", response: "Default", - options: { - "Confirm": {playertext: "ItemShopAttack_Confirm", response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KDMakeHostile(enemy); - KinkyDungeonChangeRep("Ghost", -5); - if (!KinkyDungeonHiddenFactions.includes(KDGetFactionOriginal(enemy))) - KinkyDungeonChangeFactionRep(KDGetFactionOriginal(enemy), -0.06); - } - return false; - }, - exitDialogue: true, - }, - "Leave": {playertext: "ItemShopAttack_Leave", response: "Default", - leadsToStage: "", - }, - } - }; - - for (let i = 0; i < items.length; i++) { - let item = items[i]; - shop.options["Item" + i] = {playertext: "ItemShop" + i, response: name + item, - prerequisiteFunction: (gagged, player) => { - return KinkyDungeonInventoryGet(item) != undefined; - }, - clickFunction: (gagged, player) => { - let itemInv = KinkyDungeonInventoryGet(item); - if (itemInv.type == Consumable) - KinkyDungeonChangeConsumable(KDConsumable(itemInv), -1); - else KinkyDungeonInventoryRemove(itemInv); - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - let faction = KDGetFactionOriginal(enemy); - if (!KinkyDungeonHiddenFactions.includes(faction)) { - KinkyDungeonChangeFactionRep(faction, Math.max(0.0001, KDGameData.CurrentDialogMsgValue["ItemCost"+i] * 0.00005)); - } - } - KinkyDungeonAddGold(KDGameData.CurrentDialogMsgValue["ItemCost"+i]); - return false; - }, - leadsToStage: "", dontTouchText: true, - }; - } - KDShops[name] = {name: name, tags: requireTags, singletag: requireSingleTag, chance: chance}; - return shop; -} - -let KDOfferCooldown = 20; - -/** - * - * @param {(firstRefused) => boolean} setupFunction - firstRefused is if the player said no first. Happens after the user clicks - * @param {(firstRefused) => boolean} yesFunction - firstRefused is if the player said no then yes. Happens whenever the user submits - * @param {(firstRefused) => boolean} noFunction - firstRefused is if the player said no then no. Happens whenever the user successfully avoids - * @param {(firstRefused) => boolean} domFunction - firstRefused is if the player said no then no. Happens when the user clicks the Dominant response - * @returns {KinkyDialogue} - */ -function KDYesNoTemplate(setupFunction, yesFunction, noFunction, domFunction) { - /** - * @type {KinkyDialogue} - */ - let dialogue = { - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("BondageOffer", KDOfferCooldown); - return false; - }, - options: { - "Yes": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - return setupFunction(false); - }, - options: { - "Yes": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - return yesFunction(false); - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - return noFunction(false); - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - "Dominant": {gag: true, playertext: "OfferDominant", response: "OfferDominantSuccess", - clickFunction: (gagged, player) => { - return domFunction(false); - }, - prerequisiteFunction: (gagged, player) => { - return KDGetSpeaker()?.Enemy?.bound != undefined; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - }, - }, - "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - return setupFunction(true); - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - "Force": {gag: true, playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => {return false;}, - options: { - "Yes": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - return yesFunction(true); - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}},}, - "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - return noFunction(true); - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - "Dominant": {gag: true, playertext: "OfferDominant", response: "OfferDominantSuccess", - clickFunction: (gagged, player) => { - return domFunction(true); - }, - prerequisiteFunction: (gagged, player) => { - return KDGetSpeaker()?.Enemy?.bound != undefined; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - }, - }, - } - }; - - - return dialogue; -} - -/** - * - * @param {string} name - * @param {string[]} goddess - * @param {string[]} antigoddess - * @param {string[]} restraint - * @param {number[]} diffSpread - 0 is yesfunction diff, 2 is nofunction diff, 1 is yesfunction dom (should be lower), 3 is nofunction dom (should be lower) - * @param {number[]} OffdiffSpread - 0 is submissive diff, 1 is normal diff, 2 is dom diff, 3 is dom diff if you have dom personality (should be between 1 and 2) - * @param {number} count - * @param {number} countAngry - * @param {string} countAngry - * @param {boolean} Ally - * @param {{name: string, duration: number, floors?: number}[]} Flags - Sets flags on setup - * @returns {KinkyDialogue} - */ -function KDYesNoBasic(name, goddess, antigoddess, restraint, diffSpread, OffdiffSpread, count = 1, countAngry = 1, Lock = "Red", Ally = false, Flags = []) { - return KDYesNoTemplate( - (refused) => { // Setup function. This is run when you click Yes or No in the start of the dialogue - for (let f of Flags) { - KinkyDungeonSetFlag(f.name, f.duration, f.floors); - } - // This is the restraint that the dialogue offers to add. It's selected from a set of tags. You can change the tags to change the restraint - let r = KinkyDungeonGetRestraint({tags: restraint}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (r) { - KDGameData.CurrentDialogMsgData = { - "Data_r": r.name, - "RESTRAINT": TextGet("Restraint" + r.name), - }; - - // Percent chance your dominant action ("Why don't you wear it instead?") succeeds - // Based on a difficulty that is the sum of four lines - // Dominant perk should help with this - KDGameData.CurrentDialogMsgValue.PercentOff = - KDOffensiveDialogueSuccessChance(KDBasicCheck(goddess, []) - - (KDDialogueGagged() ? 60 : 40) - - (KinkyDungeonStatsChoice.get("Undeniable") ? 100 : 0) - - (KinkyDungeonStatsChoice.has("Dominant") ? 0 : 40) - - KDPersonalitySpread(OffdiffSpread[0], OffdiffSpread[1], KinkyDungeonStatsChoice.has("Dominant") ? OffdiffSpread[3] : OffdiffSpread[2])); - // Set the string to replace in the UI - KDGameData.CurrentDialogMsgData.OFFPERC = `${Math.round(100 * KDGameData.CurrentDialogMsgValue.PercentOff)}%`; - } - - // If the player hits No first, this happens - if (refused) { - // Set up the difficulty of the check - // This check basically determines if we switch to the Force stage where the speaker tries to force you - let diff = KinkyDungeonStatsChoice.has("Dominant") ? diffSpread[1] : diffSpread[0]; - if (KinkyDungeonStatsChoice.get("Undeniable")) diff += 140; - // Failure condition - if (KDBasicCheck(goddess, antigoddess) <= diff) { - KDGameData.CurrentDialogStage = "Force"; - KDGameData.CurrentDialogMsg = name + "ForceYes"; // This is different from OfferLatexForce_Yes, it's a more reluctant dialogue... - // Set up percentage chance to resist - KDGameData.CurrentDialogMsgValue.Percent = KDAgilityDialogueSuccessChance(KDBasicCheck(goddess, antigoddess, KinkyDungeonStatsChoice.get("Undeniable") ? -70 : 0)); - KDGameData.CurrentDialogMsgData.PERCENT = `${Math.round(100 * KDGameData.CurrentDialogMsgValue.Percent)}%`; - } else { - // You succeed but get fatigue - KDIncreaseOfferFatigue(10); - } - KinkyDungeonChangeRep(antigoddess[0], -1); // Reduce submission because of refusal - KDAddOpinion(KDGetSpeaker(), -10); - } - return false; - },(refused) => { // Yes function. This happens if the user submits willingly - KinkyDungeonChangeRep(goddess[0], 1); - if (Ally) - KDAllySpeaker(9999, true); - else - KDPleaseSpeaker(refused ? 0.004 : 0.005); // Less reputation if you refused - KinkyDungeonChangeRep(antigoddess[0], refused ? 1 : 2); // Less submission if you refused - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.Data_r), 0, true, Lock); - KDAddOffer(1); - let num = count; - // Apply additional restraints - if (num > 1) { - let r = KinkyDungeonGetRestraint({tags: restraint}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (r) - KinkyDungeonAddRestraintIfWeaker(r, 0, true, Lock); - } - return false; - },(refused) => { // No function. This happens when the user refuses. - // The first half is basically the same as the setup function, but only if the user did not refuse the first yes/no - if (!refused) { - // This check basically determines if we switch to the Force stage where the speaker tries to force you - let diff = KinkyDungeonStatsChoice.has("Dominant") ? diffSpread[3] : diffSpread[2]; // Slightly harder because we refused - if (KinkyDungeonStatsChoice.get("Undeniable")) diff += 140; - // Failure condition - if (KDBasicCheck(goddess, antigoddess) <= diff) { - KDGameData.CurrentDialogStage = "Force"; - KDGameData.CurrentDialogMsg = ""; - // Set up percentage chance to resist - KDGameData.CurrentDialogMsgValue.Percent = KDAgilityDialogueSuccessChance(KDBasicCheck(goddess, antigoddess, KinkyDungeonStatsChoice.get("Undeniable") ? -70 : 0)); - KDGameData.CurrentDialogMsgData.PERCENT = `${Math.round(100 * KDGameData.CurrentDialogMsgValue.Percent)}%`; - } else { - KDIncreaseOfferFatigue(10); - } - KinkyDungeonChangeRep(antigoddess[0], -1); - KDAddOpinion(KDGetSpeaker(), -5); - } else { // If the user refuses we use the already generated success chance and calculate the result - let percent = KDGameData.CurrentDialogMsgValue.Percent; - KDAddOpinion(KDGetSpeaker(), -10); - if (KDRandom() > percent) { // We failed! You get tied tight - KDIncreaseOfferFatigue(-20); - KDGameData.CurrentDialogMsg = name + "Force_Failure"; - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.Data_r), 0, true, Lock || "Red"); - KDAddOffer(1); - let num = refused ? countAngry : count; - // Apply additional restraints - if (num > 1) { - let r = KinkyDungeonGetRestraint({tags: restraint}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (r) - KinkyDungeonAddRestraintIfWeaker(r, 0, true, Lock); - } - } else { - KDIncreaseOfferFatigue(10); - } - } - return false; - },(refused) => { // Dom function. This is what happens when you try the dominant option - // We use the already generated percent chance - let percent = KDGameData.CurrentDialogMsgValue.PercentOff; - if (KDRandom() > percent) { - // If we fail, we aggro the enemy - KDIncreaseOfferFatigue(-20); - KDGameData.CurrentDialogMsg = "OfferDominantFailure"; - KDAggroSpeaker(10); - KDAddOpinion(KDGetSpeaker(), -20); - } else { - // If we succeed, we get the speaker enemy and bind them - KDIncreaseOfferFatigue(10); - KDAddOpinion(KDGetSpeaker(), 25); - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - enemy.playWithPlayer = 0; - enemy.playWithPlayerCD = 999; - let amount = 10; - if (!enemy.boundLevel) enemy.boundLevel = amount; - else enemy.boundLevel += amount; - } - KinkyDungeonChangeRep(antigoddess[0], -4); // Reduce submission because dom - } - return false; - }); -} - -/** - * A shop where the seller sells items - * @returns {KinkyDialogue} - */ -function KDSaleShop(name, items, requireTags, requireSingleTag, chance, markup) { - if (!markup) markup = 1.0; - let shop = { - shop: true, - response: "Default", - clickFunction: (gagged, player) => { - /*let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetEnemyFlag(enemy, "Shop", 0); - }*/ - /*if (KDDialogueEnemy()) { - let enemy = KDDialogueEnemy(); - if (!enemy.items) - enemy.items = items; - }*/ - for (let i = 0; i < items.length; i++) { - let item = items[i]; - if (KinkyDungeonGetRestraintByName(item)) { - KDGameData.CurrentDialogMsgData["Item"+i] = TextGet("Restraint" + item); - let power = KinkyDungeonGetRestraintByName(item).power; - if (!power || power < 1) power = 1; - KDGameData.CurrentDialogMsgValue["ItemCost"+i] = 5 * Math.round((10 + 2 * Math.pow(power, 1.5))/5); - KDGameData.CurrentDialogMsgData["ItemCost"+i] = "" + KDGameData.CurrentDialogMsgValue["ItemCost"+i]; - } else { - KDGameData.CurrentDialogMsgData["Item"+i] = TextGet("KinkyDungeonInventoryItem" + item); - KDGameData.CurrentDialogMsgValue["ItemCost"+i] = Math.round(KinkyDungeonItemCost(KinkyDungeonFindConsumableOrBasic(item) ? KinkyDungeonFindConsumableOrBasic(item) : KinkyDungeonFindWeapon(item), true, true) * markup); - KDGameData.CurrentDialogMsgData["ItemCost"+i] = "" + KDGameData.CurrentDialogMsgValue["ItemCost"+i]; - } - } - return false; - }, - options: {}, - }; - shop.options.Leave = {playertext: "Leave", exitDialogue: true, - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KinkyDungeonSetEnemyFlag(enemy, "NoShop", 9999); - KinkyDungeonSetEnemyFlag(enemy, "NoTalk", 8); - } - return false; - }, - }; - shop.options.Attack = {gag: true, playertext: "ItemShopAttack", response: "Default", - options: { - "Confirm": {playertext: "ItemShopAttack_Confirm", response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - KDMakeHostile(enemy); - KinkyDungeonChangeRep("Ghost", -5); - if (!KinkyDungeonHiddenFactions.includes(KDGetFactionOriginal(enemy))) - KinkyDungeonChangeFactionRep(KDGetFactionOriginal(enemy), -0.06); - } - return false; - }, - exitDialogue: true, - }, - "Leave": {playertext: "ItemShopAttack_Leave", response: "Default", - leadsToStage: "", - }, - } - }; - - for (let i = 0; i < items.length; i++) { - let item = items[i]; - shop.options["Item" + i] = {playertext: "ItemShopBuy" + i, response: name + item, - prerequisiteFunction: (gagged, player) => { - return true;//KinkyDungeonInventoryGet(item) != undefined; - }, - clickFunction: (gagged, player) => { - let buy = false; - if (KinkyDungeonGold >= KDGameData.CurrentDialogMsgValue["ItemCost"+i]) { - buy = true; - if (KinkyDungeonGetRestraintByName(item)) { - // Sell the player a restraint - let rest = KinkyDungeonGetRestraintByName(item); - let Rname = rest.inventoryAs || rest.name; - if (!KinkyDungeonInventoryGetLoose(Rname)) { - KinkyDungeonInventoryAdd({name: Rname, type: LooseRestraint, events:rest.events, quantity: 1, id: KinkyDungeonGetItemID()}); - } else { - if (!KinkyDungeonInventoryGetLoose(Rname).quantity) KinkyDungeonInventoryGetLoose(Rname).quantity = 0; - KinkyDungeonInventoryGetLoose(Rname).quantity += 1; - } - } else if (KinkyDungeonFindBasic(item)) { - KDAddBasic(KinkyDungeonFindBasic(item)); - } else if (KinkyDungeonFindConsumable(item)) { - KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable(item), 1); - } else if (KinkyDungeonFindWeapon(item)) { - if (!KinkyDungeonInventoryGetWeapon(item)) { - KinkyDungeonInventoryAddWeapon(item); - } else { - KDGameData.CurrentDialogMsg = name + "_AlreadyHave"; - buy = false; - } - } - } else { - KDGameData.CurrentDialogMsg = name + "_NoMoney"; - } - - if (buy) { - KinkyDungeonAddGold(-KDGameData.CurrentDialogMsgValue["ItemCost"+i]); - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - let faction = KDGetFactionOriginal(enemy); - if (!KinkyDungeonHiddenFactions.includes(faction)) { - KinkyDungeonChangeFactionRep(faction, Math.max(0.0001, KDGameData.CurrentDialogMsgValue["ItemCost"+i] * 0.0001)); - } - } - } - return false; - }, - leadsToStage: "", dontTouchText: true, - }; - } - KDShops[name] = {name: name, tags: requireTags, singletag: requireSingleTag, chance: chance, items: items}; - return shop; -} - -/* - - "Leave": {playertext: "Leave", exitDialogue: true} - clickFunction: (gagged, player) => {KinkyDungeonStartChase(undefined, "Refusal");}, - -clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", 3); -},*/ - -/** Yoinks a nearby enemy and brings them next to x */ -/** - * - * @param {number} x - * @param {number} y - * @param {number} radius - * @returns {entity} - */ -function DialogueBringNearbyEnemy(x, y, radius) { - for (let e of KinkyDungeonEntities) { - if (!KDHelpless(e) && KDistChebyshev(x - e.x, y - e.y) <= radius && KinkyDungeonAggressive(e) && !KDIsImmobile(e) && !e.Enemy.tags.temporary && (KDAIType[KDGetAI(e)]?.ambush || e.ambushtrigger)) { - let point = KinkyDungeonNoEnemy(x, y, true) ? {x:x, y:y} : KinkyDungeonGetNearbyPoint(x, y, true); - if (point) { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonDiscovered"), "#ff0000", 1); - KDMoveEntity(e, point.x, point.y, true); - return e; - } - } - } - return null; -} - -/** Yoinks a nearby enemy and brings them next to x */ -/** - * - * @param {number} x - * @param {number} y - * @param {entity} enemy - * @returns {entity} - */ -function DialogueBringSpecific(x, y, enemy) { - if (enemy) { - let point = KinkyDungeonNoEnemy(x, y, true) ? {x:x, y:y} : KinkyDungeonGetNearbyPoint(x, y, true); - if (point) { - KDMoveEntity(enemy, point.x, point.y, true); - return enemy; - } - } - return null; -} - -/** - * Returns if you are submissive enough to be played with by this enemy - * @param {entity} enemy - * @returns {boolean} - */ -function KDIsSubmissiveEnough(enemy) { - let diff = KDPersonalitySpread(20, -20, -51); - if (KinkyDungeonGoddessRep.Ghost >= diff) return true; - return false; -} - -/** - * - * @param {entity} enemy - * @returns {number} - */ -function KDGetModifiedOpinion(enemy) { - let op = enemy.opinion || 0; - - op += 30 * KDFactionRelation("Player", KDGetFaction(enemy)); - if (KinkyDungeonStatsChoice.get("Dominant") && enemy.personality && KDLoosePersonalities.includes(enemy.personality)) op += 12; - if (KinkyDungeonStatsChoice.get("Oppression")) op -= 15; - - return op; -} - -/** - * - * @param {number} Amount - */ -function KDAddOffer(Amount) { - if (!KDGameData.OfferCount) KDGameData.OfferCount = 0; - KDGameData.OfferCount += Amount; -} - -/** - * @returns {number} - */ -function KDGetOfferLevelMod() { - return Math.round(0.25 * (KDGameData.OfferCount || 0)); -} \ No newline at end of file diff --git a/Game/KinkyDungeonDialogueList.js b/Game/KinkyDungeonDialogueList.js deleted file mode 100644 index add2d2e3b..000000000 --- a/Game/KinkyDungeonDialogueList.js +++ /dev/null @@ -1,2459 +0,0 @@ -"use strict"; - -let KDDialogueParams = { - ShopkeeperFee: 900, - ShopkeeperFeePerLevel: 100, - ShopkeeperFeePunishThresh: 2500, -}; - -/** - * Tags that are deleted on ng++ - * @type {string[]} - */ -let KDResertNGTags = [ - "BossDialogueFuuka" -]; - -/** - * @type {Record} - */ -let KDShops = {}; - - - -/** - * @type {Record} - */ -let KDRecruitDialog = {}; - -/** - * @type {Record} - */ -let KDAllyDialog = {}; - -let KDSleepBedPercentage = 0.5; - -/** @type {Record} */ -let KDDialogue = { - "GhostInfo": { - response: "Default", - options: { - "Continue" : { - clickFunction: (gagged, player) => { - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - return false; - }, - playertext: "Default", exitDialogue: true, - }, - //"Nice" : {gag: true, playertext: "Default", exitDialogue: true}, - //"Snark" : {playertext: "Default", exitDialogue: true}, - //"Brash" : {gag: true, playertext: "Default", exitDialogue: true}, - }, - }, - "Tutorial1": { - response: "Default", - options: { - "Continue" : { - clickFunction: (gagged, player) => { - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - let zombie = DialogueCreateEnemy(KinkyDungeonStartPosition.x + 7, 3, "FastZombie"); - zombie.AI = "guard"; - zombie.gxx = KinkyDungeonStartPosition.x + 8; - zombie.gyy = KinkyDungeonGridHeight - 2; - return false; - }, - playertext: "GhostInfo_Continue", exitDialogue: true, - }, - //"Nice" : {gag: true, playertext: "Default", exitDialogue: true}, - //"Snark" : {playertext: "Default", exitDialogue: true}, - //"Brash" : {gag: true, playertext: "Default", exitDialogue: true}, - }, - }, - "Tutorial2_mp3": { - response: "Default", - options: { - "Continue" : { - clickFunction: (gagged, player) => { - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - DialogueCreateEnemy(KinkyDungeonStartPosition.x + 22, 3, "FastZombie"); - return false; - }, - playertext: "GhostInfo_Continue", exitDialogue: true, - }, - //"Nice" : {gag: true, playertext: "Default", exitDialogue: true}, - //"Snark" : {playertext: "Default", exitDialogue: true}, - //"Brash" : {gag: true, playertext: "Default", exitDialogue: true}, - }, - }, - "Tutorial2_dp2": { - response: "Default", - options: { - "Continue" : { - clickFunction: (gagged, player) => { - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - DialogueCreateEnemy(KinkyDungeonStartPosition.x + 32, 4, "FastZombie"); - return false; - }, - playertext: "GhostInfo_Continue", exitDialogue: true, - }, - //"Nice" : {gag: true, playertext: "Default", exitDialogue: true}, - //"Snark" : {playertext: "Default", exitDialogue: true}, - //"Brash" : {gag: true, playertext: "Default", exitDialogue: true}, - }, - }, - "WeaponFound": { - response: "WeaponFound", - personalities: ["Robot"], - options: { - "Accept": {gag: true, playertext: "WeaponFoundAccept", response: "GoodGirl", personalities: ["Dom", "Sub", "Robot"], - clickFunction: (gagged, player) => { - KinkyDungeonSendTextMessage(10, TextGet("KDWeaponConfiscated"), "#ff0000", 2); - let weapon = KinkyDungeonPlayerDamage.name; - if (weapon && weapon != "Unarmed") { - KinkyDungeonChangeRep("Ghost", 3); - let item = KinkyDungeonInventoryGetWeapon(weapon); - KDSetWeapon(null); - KinkyDungeonAddLostItems([item], false); - KinkyDungeonInventoryRemove(item); - KinkyDungeonSetFlag("demand", 4); - } - return false; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}}, - "Bluff": {playertext: "", response: "", - prerequisiteFunction: (gagged, player) => {return false;}, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}}, - "Deny": {gag: true, playertext: "WeaponFoundDeny", response: "Punishment", personalities: ["Dom", "Sub", "Robot"], - clickFunction: (gagged, player) => { - KinkyDungeonStartChase(undefined, "Refusal"); - KDAggroSpeaker(); - return false; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}}, - "Illusion": {gagDisabled: true, playertext: "WeaponFoundIllusion", response: "Disbelief", personalities: ["Dom", "Sub", "Robot"], - prerequisiteFunction: (gagged, player) => {return KinkyDungeonGoddessRep.Illusion >= 51;}, - clickFunction: (gagged, player) => { - if (KDGameData.CurrentDialogMsgSpeaker == "MaidforceHead") { - KDGameData.CurrentDialogStage = "Deny"; - KDGameData.CurrentDialogMsg = "HeadMaidExcuseMe"; - KinkyDungeonStartChase(undefined, "Refusal"); - KDAggroSpeaker(); - } else { - let diff = KDPersonalitySpread(40, 60, 80); - if (KDBasicCheck(["Illusion", "Ghost"], ["Prisoner"]) > diff) { - KDGameData.CurrentDialogStage = "Bluff"; - KDGameData.CurrentDialogMsg = "Bluffed"; - KinkyDungeonChangeRep("Ghost", -2); - } - KDDialogueApplyPersonality(["Dom", "Sub", "Robot"]); - } - return false; - }, - options: {"Back": {playertext: "Pause", leadsToStage: ""}}}, - "Conjure": {gagDisabled: true, playertext: "WeaponFoundConjure", response: "Disbelief", personalities: ["Dom", "Sub", "Robot"], - prerequisiteFunction: (gagged, player) => {return KinkyDungeonGoddessRep.Conjure >= 51;}, - clickFunction: (gagged, player) => { - let diff = KDPersonalitySpread(40, 60, 80); - if (KDBasicCheck(["Conjure", "Ghost"], ["Prisoner"]) > diff) { - KDGameData.CurrentDialogStage = "Bluff"; - KDGameData.CurrentDialogMsg = "Bluffed"; - KinkyDungeonChangeRep("Ghost", -2); - } - KDDialogueApplyPersonality(["Dom", "Sub", "Robot"]); - return false; - }, - options: {"Back": {playertext: "Pause", leadsToStage: ""}}}, - "Elements": {gagDisabled: true, playertext: "WeaponFoundElements", response: "Disbelief", personalities: ["Dom", "Sub", "Robot"], - prerequisiteFunction: (gagged, player) => {return KinkyDungeonGoddessRep.Elements >= 51;}, - clickFunction: (gagged, player) => { - let diff = KDPersonalitySpread(40, 60, 80); - if (KDBasicCheck(["Elements", "Ghost"], ["Prisoner"]) > diff) { - KDGameData.CurrentDialogStage = "Bluff"; - KDGameData.CurrentDialogMsg = "Bluffed"; - KinkyDungeonChangeRep("Ghost", -2); - } - KDDialogueApplyPersonality(["Dom", "Sub", "Robot"]); - return false; - }, - options: {"Back": {playertext: "Pause", leadsToStage: ""}}}, - "Rope": {gagDisabled: true, playertext: "WeaponFoundRope", response: "Disbelief", personalities: ["Dom", "Sub", "Robot"], - prerequisiteFunction: (gagged, player) => {return KinkyDungeonGoddessRep.Rope >= 51;}, - clickFunction: (gagged, player) => { - let diff = KDPersonalitySpread(40, 60, 80); - if (KDBasicCheck(["Rope", "Ghost"], ["Prisoner"]) > diff) { - KDGameData.CurrentDialogStage = "Bluff"; - KDGameData.CurrentDialogMsg = "Bluffed"; - KinkyDungeonChangeRep("Ghost", -2); - } - KDDialogueApplyPersonality(["Dom", "Sub", "Robot"]); - return false; - }, - options: {"Back": {playertext: "Pause", leadsToStage: ""}}}, - "Leather": {gagDisabled: true, playertext: "WeaponFoundLeather", response: "Disbelief", personalities: ["Dom", "Sub", "Robot"], - prerequisiteFunction: (gagged, player) => {return KinkyDungeonGoddessRep.Leather >= 51;}, - clickFunction: (gagged, player) => { - let diff = KDPersonalitySpread(40, 60, 80); - if (KDBasicCheck(["Leather", "Ghost"], ["Prisoner"]) > diff) { - KDGameData.CurrentDialogStage = "Bluff"; - KDGameData.CurrentDialogMsg = "Bluffed"; - KinkyDungeonChangeRep("Ghost", -2); - } - KDDialogueApplyPersonality(["Dom", "Sub", "Robot"]); - return false; - }, - options: {"Back": {playertext: "Pause", leadsToStage: ""}}}, - } - }, - "PrisonIntro": { - response: "Default", - options: { - "NewLife": {playertext: "Default", response: "Default", - options: { - "Pout": {playertext: "Default", response: "Default", options: {"Continue" : {playertext: "Continue", leadsToStage: "Rules"}}}, - "Brat": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", -10); - KinkyDungeonChangeRep("Prisoner", 10); - return false; - }, - options: {"Continue" : {playertext: "Continue", leadsToStage: "Rules"}}}, - "Sub": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", 10); - return false; - }, - options: {"Continue" : {playertext: "Continue", leadsToStage: "Rules"}}}, - } - }, - "Rules": {playertext: "Default", response: "Default", - options: { - "Pout": {playertext: "Default", response: "Default", options: {"Continue" : {playertext: "Continue", exitDialogue: true}}}, - "Brat": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", -10); - KinkyDungeonChangeRep("Prisoner", 10); - return false; - }, - options: {"Continue" : {playertext: "Continue", exitDialogue: true}}}, - "Sub": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", 10); - return false; - }, - options: {"Continue" : {playertext: "Continue", exitDialogue: true}}}, - } - }, - } - }, - "PrisonRepeat": { - response: "Default", - options: { - "Smile": {playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => {return !(KinkyDungeonGetRestraintItem("ItemVulva"));}, - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), 0, true); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug2"), 0, true); - KinkyDungeonChangeRep("Ghost", 3); - return false; - }, - options: { - "Correct": {playertext: "Default", response: "Default", gagDisabled: true, - prerequisiteFunction: (gagged, player) => {return !(KinkyDungeonGetRestraintItem("ItemMouth") || KinkyDungeonGetRestraintItem("ItemMouth2") || KinkyDungeonGetRestraintItem("ItemMouth3"));}, - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapGag"), 0, true); - KinkyDungeonChangeRep("Ghost", -1); - return false; - }, - options: { - "Leave": {playertext: "Leave", exitDialogue: true} - }, - }, - "Leave": {playertext: "Leave", exitDialogue: true} - }, - }, - "Smile2": {playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => {return KinkyDungeonGetRestraintItem("ItemVulva") != undefined;}, - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", 5); - return false; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - "Struggle": {playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => {return KinkyDungeonGetRestraintItem("ItemArms") != undefined;}, - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Prisoner", 3); - return false; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - "Pout": {playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", -3); - return false; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - "Bribe": {playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - return KinkyDungeonGoddessRep.Prisoner >= -40 && KinkyDungeonGold >= 40; - }, - options: { - "Accept": {playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - if (KinkyDungeonGoddessRep.Prisoner >= 49.5) { - KDGameData.CurrentDialogMsg = "PrisonRepeatBribeFail"; - return false; - } - KinkyDungeonChangeRep("Prisoner", -Math.max(10, Math.min(100, KinkyDungeonGold*0.25))); - KinkyDungeonGold = 0; - KinkyDungeonSetFlag("LeashToPrison", 0); - return false; - }, - options: {"Leave": {playertext: "Leave", exitDialogue: true}}, - }, - "Leave": {playertext: "Leave", exitDialogue: true} - }, - }, - } - }, - "OfferDress": KDYesNoBasic("OfferDress", ["Rope"], ["Ghost"], ["bindingDress"], [55, 0, 75, 0], [-25, 0, 40, 15]), - "OfferArmor": KDYesNoBasic("OfferArmor", ["Metal"], ["Ghost"], ["shackleGag"], [60, -10, 75, -20], [-35, -10, 25, -5]), - "OfferChain": KDYesNoBasic("OfferChain", ["Metal"], ["Ghost"], ["chainRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15], 2, 3), - "OfferVine": KDYesNoBasic("OfferVine", ["Will"], ["Ghost"], ["vineRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15], 2, 3), - "OfferObsidian": KDYesNoBasic("OfferObsidian", ["Elements"], ["Ghost"], ["obsidianRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15], 1, 2), - "OfferMaidRestraint": KDYesNoBasic("OfferMaidRestraint", ["Illusion"], ["Ghost"], ["maidRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15], 1, 2), - "OfferDragon": KDYesNoBasic("OfferDragon", ["Leather"], ["Ghost"], ["dragonRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15], 1, 2), - "OfferComfy": KDYesNoBasic("OfferComfy", ["Conjure"], ["Ghost"], ["comfyRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15]), - "OfferShackles": KDYesNoBasic("OfferShackles", ["Metal"], ["Ghost"], ["shackleRestraints", "steelCuffs"], [55, 0, 75, 0], [-25, 0, 40, 15], 1, 3), - "OfferKitty": KDYesNoBasic("OfferKitty", ["Will"], ["Ghost"], ["kittyRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15]), - "OfferMithril": KDYesNoBasic("OfferMithril", ["Metal"], ["Ghost"], ["mithrilRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15]), - "OfferMithrilRope": KDYesNoBasic("OfferMithrilRope", ["Rope"], ["Ghost"], ["mithrilRope","mithrilRopeHogtie"], [55, 0, 75, 0], [-25, 0, 40, 15]), - "OfferWolfRestraint": KDYesNoBasic("OfferWolfRestraint", ["Metal"], ["Ghost"], ["wolfRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15]), - "OfferSlime": KDYesNoBasic("OfferSlime", ["Latex"], ["Ghost"], ["slimeRestraintsRandom"], [55, 0, 75, 0], [-25, 0, 40, 15]), - "OfferScarf": KDYesNoBasic("OfferScarf", ["Rope"], ["Ghost"], ["scarfRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15]), - "OfferAutoTape": KDYesNoBasic("OfferAutoTape", ["Metal"], ["Ghost"], ["autoTape"], [55, 0, 75, 0], [-200, -200, -200, -200], 2, 3), - "OfferHiTechCables": KDYesNoBasic("OfferHiTechCables", ["Metal"], ["Ghost"], ["hitechCables","cableGag"], [55, 0, 75, 0], [-200, -200, -200, -200], 2, 3), - "OfferIce": KDYesNoBasic("OfferIce", ["Elements"], ["Ghost"], ["iceRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15], 2, 3), - "OfferLatex": KDYesNoBasic("OfferLatex", ["Latex"], ["Ghost"], ["latexRestraints", "latexRestraintsHeavy"], [55, 0, 75, 0], [-25, 0, 40, 15]), - "OfferKigu": KDYesNoBasic("OfferKigu", ["Conjure"], ["Ghost"], ["kiguRestraints"], [55, 0, 75, 0], [-25, 0, 40, 15]), - "OfferLeather": KDYesNoBasic("OfferLeather", ["Leather"], ["Ghost"], ["armbinderSpell", "straitjacketSpell", "legbinderSpell", "harnessSpell", "gagSpell", "blindfoldSpell", "leathercuffsSpell"], [55, 0, 75, 0], [-25, 0, 40, 15], 1, 3), - "OfferRopes": KDYesNoBasic("OfferRopes", ["Rope"], ["Ghost"], ["ropeRestraints", "ropeRestraints2", "ropeRestraintsHogtie", "ropeRestraintsWrist", "ropeAuxiliary"], [55, 0, 75, 0], [-25, 0, 40, 15], 3, 5, "Red"), - "OfferChastity": KDYesNoBasic("OfferChastity", ["Metal"], ["Ghost"], ["genericChastity"], [55, 0, 75, 0], [-25, 0, 40, 15], 1, 1, "Gold", true, [{name: "ChastityOffer", duration: 300}]), - - - - "OfferWolfgirl": KDRecruitDialogue("OfferWolfgirl", "Nevermere", "Wolfgirl", "Metal", ["wolfGear"], 5, ["wolfGear", "wolfRestraints"], 8, ["wolfgirl", "trainer"], undefined, undefined, 0.5), - "OfferMaid": KDRecruitDialogue("OfferMaid", "Maidforce", "Maid", "Illusion", ["maidVibeRestraints"], 5, ["maidVibeRestraints", "maidRestraints"], 13, ["maid"], undefined, ["submissive"], 0.5), - "OfferBast": KDRecruitDialogue("OfferBast", "Bast", "Bast", "Will", ["kittyCollar"], 5, ["kittyRestraints"], 13, ["mummy"], undefined, ["submissive"], 0.5), - "OfferDressmaker": KDRecruitDialogue("OfferDressmaker", "Dressmaker", "Bikini", "Rope", ["dressUniform"], 5, ["dressUniform", "dressRestraints"], 13, ["dressmaker"], undefined, ["submissive"], 0.5), - "OfferBountyhunter": KDRecruitDialogue("OfferBountyhunter", "Bountyhunter", "Bountyhunter", "Illusion", [], 5, ["ropeRestraints", "ropeRestraints2", "ropeRestraintsHogtie", "ropeRestraintsWrist", "ropeAuxiliary"], 13, ["bountyhunter"], undefined, ["submissive"], 0.5), - "OfferAncientRobot": KDRecruitDialogue("OfferAncientRobot", "AncientRobot", "Wolfgirl", "Metal", ["roboPrisoner"], 5, ["roboPrisoner", "roboAngry", "hitechCables"], 13, ["robot"], undefined, ["submissive"], 0.5), - "OfferElf": KDRecruitDialogue("OfferElf", "Elf", "Elven", "Will", ["mithrilRestraints"], 5, ["mithrilRestraints", "mithrilRope"], 13, ["elf"], undefined, ["submissive"], 0.5), - "OfferAlchemist": KDRecruitDialogue("OfferAlchemist", "Alchemist", "BlueSuit", "Latex", ["latexUniform"], 5, ["latexUniform", "latexRestraints"], 13, ["alchemist"], undefined, ["submissive"], 0.5), - //"OfferWitch": KDRecruitDialogue("OfferWitch", "Witch", "Default", "Conjure", [], 5, ["ropeRestraints", "ropeRestraints2", "ropeRestraintsHogtie", "ropeRestraintsWrist", "ropeAuxiliary"], 13, ["witch"], undefined, ["submissive"], 0.5), - "OfferElemental": KDRecruitDialogue("OfferElemental", "Elemental", "Obsidian", "Elements", ["obsidianCuffs"], 5, ["obsidianRestraints"], 13, ["elemental"], undefined, ["submissive"], 0.5), - "OfferDragonheart": KDRecruitDialogue("OfferDragonheart", "Dragon", "Default", "Leather", [], 5, ["dragonRestraints"], 13, ["dragon"], undefined, ["submissive"], 0.5), - "OfferApprentice": KDRecruitDialogue("OfferApprentice", "Apprentice", "Default", "Conjure", [], 5, ["ropeRestraints", "ropeRestraints2", "ropeRestraintsHogtie", "ropeRestraintsWrist", "ropeAuxiliary"], 13, ["apprentice"], undefined, ["submissive", "wizard"], 0.5), - //"OfferApprentice2": KDRecruitDialogue("OfferApprentice2", "Apprentice", "Default", "Conjure", [], 5, ["ropeRestraints", "ropeRestraints2", "ropeRestraintsHogtie", "ropeRestraintsWrist", "ropeAuxiliary"], 13, ["apprentice"], undefined, ["submissive", "student"], 0.5), - "OfferBandit": KDRecruitDialogue("OfferBandit", "Bandit", "Default", "Leather", [], 5, ["leatherRestraints", "leatherRestraintsHeavy"], 13, ["bandit"], undefined, ["submissive"], 0.5), - //"OfferFungal": KDRecruitDialogue("OfferFungal", "Mushy", "BlueSuit", "Will", ["crystalBelt"], 5, ["crystalBelt", "crystalRestraints"], 13, ["fungal"], undefined, ["submissive"], 0.5), - - "AngelHelp": { - response: "Default", - inventory: true, - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("AngelHelp", 55); - return false; - }, - options: { - "Knife": { - playertext: "Default", response: "AngelHelpKnife", - prerequisiteFunction: (gagged, player) => { - return !KinkyDungeonFlags.get("AngelHelped") && !KinkyDungeonInventoryGet("Knife"); - }, - clickFunction: (gagged, player) => { - KinkyDungeonInventoryAddWeapon("Knife"); - KinkyDungeonSetFlag("AngelHelped", 5); - return false; - }, - leadsToStage: "", dontTouchText: true, - }, - "Pick": { - playertext: "Default", response: "AngelHelpPick", - prerequisiteFunction: (gagged, player) => { - return !KinkyDungeonFlags.get("AngelHelped"); - }, - clickFunction: (gagged, player) => { - KinkyDungeonLockpicks += 3; - KinkyDungeonSetFlag("AngelHelped", 5); - return false; - }, - leadsToStage: "", dontTouchText: true, - }, - "BlueKey": { - playertext: "Default", response: "AngelHelpBlueKey", - prerequisiteFunction: (gagged, player) => { - return !KinkyDungeonFlags.get("AngelHelped"); - }, - clickFunction: (gagged, player) => { - KinkyDungeonBlueKeys += 1; - KinkyDungeonSetFlag("AngelHelped", 5); - return false; - }, - leadsToStage: "", dontTouchText: true, - }, - "Leave": {playertext: "Leave", exitDialogue: true}, - } - }, - "DressmakerQuest": { - response: "Default", - inventory: true, - clickFunction: (gagged, player) => { - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - "Help": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDAddQuest("DressmakerQuest"); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Complete": { - playertext: "Default", response: "Default", - gag: true, - clickFunction: (gagged, player) => { - let items = KinkyDungeonGetRestraintsWithShrine("BindingDress", true, true); - // Get the most powerful item - let item = items.length > 0 ? items.reduce((prev, current) => (KDRestraint(prev).power * KinkyDungeonGetLockMult(prev.lock) > KDRestraint(current).power * KinkyDungeonGetLockMult(current.lock)) ? prev : current) : null; - - let power = item ? KDRestraint(item).power : 5; - if (KDFactionRelation("Player", "Dressmaker") < 0.25) - KinkyDungeonChangeFactionRep("Dressmaker", 0.002 * power); - else - KinkyDungeonChangeFactionRep("Dressmaker", 0.0007 * power); - KDRemoveQuest("DressmakerQuest"); - KDSpliceIndex(KinkyDungeonEntities.indexOf(KDDialogueEnemy()), 1); - return false; - }, - prerequisiteFunction: (gagged, player) => { - return KinkyDungeonPlayerTags.has("BindingDress"); - }, - options: { - "Question": { - playertext: "Default", response: "Default", - gag: true, - clickFunction: (gagged, player) => { - if (KinkyDungeonStatsChoice.has("Dominant")) { - KinkyDungeonRemoveRestraintsWithShrine("BindingDress"); - KDGameData.CurrentDialogMsg = "DressmakerQuestComplete_QuestionSuccess"; - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "ApprenticeQuest": { - response: "Default", - inventory: true, - clickFunction: (gagged, player) => { - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - "Help": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDAddQuest("ApprenticeQuest"); - return false; - }, - prerequisiteFunction: (gagged, player) => { - return !KDHasQuest("ApprenticeQuest"); - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "CompleteLegs": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDRemoveQuest("ApprenticeQuest"); - KDSpliceIndex(KinkyDungeonEntities.indexOf(KDDialogueEnemy()), 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollLegs, -1); - if (KDFactionRelation("Player", "Apprentice") < 0.25) - KinkyDungeonChangeFactionRep("Apprentice", 0.015); - else - KinkyDungeonChangeFactionRep("Apprentice", 0.005); - return false; - }, - prerequisiteFunction: (gagged, player) => { - return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollLegs") != undefined; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "CompleteArms": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDRemoveQuest("ApprenticeQuest"); - KDSpliceIndex(KinkyDungeonEntities.indexOf(KDDialogueEnemy()), 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollArms, -1); - if (KDFactionRelation("Player", "Apprentice") < 0.25) - KinkyDungeonChangeFactionRep("Apprentice", 0.015); - else - KinkyDungeonChangeFactionRep("Apprentice", 0.005); - return false; - }, - prerequisiteFunction: (gagged, player) => { - return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollArms") != undefined; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "CompleteVerbal": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDRemoveQuest("ApprenticeQuest"); - KDSpliceIndex(KinkyDungeonEntities.indexOf(KDDialogueEnemy()), 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollVerbal, -1); - if (KDFactionRelation("Player", "Apprentice") < 0.25) - KinkyDungeonChangeFactionRep("Apprentice", 0.015); - else - KinkyDungeonChangeFactionRep("Apprentice", 0.005); - return false; - }, - prerequisiteFunction: (gagged, player) => { - return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollVerbal") != undefined; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "CompletePurity": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDRemoveQuest("ApprenticeQuest"); - KDSpliceIndex(KinkyDungeonEntities.indexOf(KDDialogueEnemy()), 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollPurity, -1); - if (KDFactionRelation("Player", "Apprentice") < 0.25) - KinkyDungeonChangeFactionRep("Apprentice", 0.015); - else - KinkyDungeonChangeFactionRep("Apprentice", 0.005); - return false; - }, - prerequisiteFunction: (gagged, player) => { - return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollPurity") != undefined; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "DragonheartQuest": { - response: "Default", - clickFunction: (gagged, player) => { - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - "Help": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDAddQuest("DragonheartQuest"); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "MaidforceQuest": { - response: "Default", - clickFunction: (gagged, player) => { - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - "Help": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDAddQuest("MaidforceQuest"); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "JailerHiSec": { - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("LeashToPrison", -1); - return false; - }, - options: { - "Submit": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonDefeat(true); - return true; - }, - exitDialogue: true, - }, - "Resist": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - if (KDDialogueEnemy() && !KDDialogueEnemy().hostile) { - KDDialogueEnemy().hostile = 300; - } - KinkyDungeonStartChase(undefined, "Jailbreak"); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "Bed": { - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("nobed", 8); - return false; - }, - options: { - "Sleep": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("slept", -1); - //KinkyDungeonChangeWill(KinkyDungeonStatWillMax * KDSleepBedPercentage); - KDGameData.SleepTurns = KinkyDungeonSleepTurnsMax; - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "TableFood": { - response: "Default", - clickFunction: (gagged, player) => { - if (KinkyDungeonTargetTile) { - let tile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); - if (tile) { - KDGameData.CurrentDialogMsgData = { - AMOUNT: "" + 10 * (tile.Amount || 1), - ARTICLE: "a", - FOODNAME: TextGet(KinkyDungeonTargetTile.Food), - FOODMSG: TextGet("KinkyDungeonFood" + KinkyDungeonTargetTile.Food), - }; - } - } - return false; - }, - options: { - "Eat": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - let tile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); - if (tile && tile.Type == "Food") { - let gagTotal = KinkyDungeonGagTotal(); - if (gagTotal > 0) { - //KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonFoodEatenGag"), "#ff8800", 1); - KDGameData.CurrentDialogMsg = "TableFoodEatFail"; - } else { - // Perform the deed - let Willmulti = Math.max(KinkyDungeonStatWillMax / KDMaxStatStart); - let amount = tile.Amount ? tile.Amount : 1.0; - KinkyDungeonChangeWill(amount * Willmulti); - - // Send the message and advance time - KinkyDungeonAdvanceTime(1); - //KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonFoodEaten"), "lightgreen", 1); - - // Remove the food - tile.Food = "Plate"; - tile.Eaten = true; - } - } - return false; - }, - options: { - "Leave": { - clickFunction: (gagged, player) => { - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - return false; - }, - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Leave": { - clickFunction: (gagged, player) => { - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - return false; - }, - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Button": { - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("nobutton", 3); - return false; - }, - options: { - "Press": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - // PUSH the BUTTON - KDCreateEffectTile(player.x, player.y, { - name: "WireSparks", - duration: 2, - }, 0); - KinkyDungeonAdvanceTime(1, true, true); - return false; - }, - exitDialogue: true, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - - "LeylineMap": { - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("nodollterm", 4); - return false; - }, - options: { - "Leave": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSpells.push(KinkyDungeonFindSpell("ManaPoolUp")); - KinkyDungeonUpdateStats(0); - return false; - }, - exitDialogue: true, - }, - "Cancel": { - playertext: "Default", response: "Default", - options: { - "Leave": { - playertext: "Default", response: "Default", - exitDialogue: true, - clickFunction: (gagged, player) => { - KinkyDungeonSpells.push(KinkyDungeonFindSpell("ManaPoolUp")); - KinkyDungeonUpdateStats(0); - return false; - }, - }, - "Cancel": { - playertext: "Default", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "DollTerminal_Step": { - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("nodollterm", 4); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - "Enter": { - playertext: "Default", response: "Default", - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - "Enter": { - playertext: "Default", response: "Default", - options: { - "Leave": { - playertext: "Leave", response: "Default", - clickFunction: (gagged, player) => { - KDEnterDollTerminal(true); - return false; - }, - exitDialogue: true, - }, - } - }, - } - }, - } - }, - "DollTerminal_Forced": { - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("nodollterm", 4); - KDGameData.CurrentDialogMsgValue = { - Percent: Math.max(0, 0.25 * KinkyDungeonSlowLevel), - }; - KDGameData.CurrentDialogMsgData = { - RESISTCHANCE: "" + Math.max(0, Math.round(100 - KDGameData.CurrentDialogMsgValue.Percent * 100)), - }; - return false; - }, - options: { - "Resist": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - if (KDRandom() < KDGameData.CurrentDialogMsgValue.Percent) { - KDGameData.CurrentDialogMsg = "DollTerminal_ForcedForced"; - KDGameData.CurrentDialogStage = "Forced"; - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Enter": { - playertext: "Default", response: "Default", - options: { - "Leave": { - playertext: "Leave", response: "Default", - clickFunction: (gagged, player) => { - KDEnterDollTerminal(true); - return false; - }, - exitDialogue: true, - }, - } - }, - "Forced": { - prerequisiteFunction: (gagged, player) => {return false;}, - playertext: "Default", response: "Default", - options: { - "Leave": { - clickFunction: (gagged, player) => { - KDEnterDollTerminal(false); - return false; - }, - playertext: "DollTerminal_Forced_Submit", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "Leyline": { - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("noleyline", 8); - return false; - }, - options: { - "Use": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonChangeMana(0, false, 100, false, false); - if (KDTile() && KDTile().Leyline) { - KinkyDungeonMapSet(player.x, player.y, '0'); - KDTileDelete(); - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "BanditQuest": { - response: "Default", - clickFunction: (gagged, player) => { - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - "Help": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDAddQuest("BanditPrisoner"); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "PrisonerRescueBountyhunter": KDPrisonerRescue("PrisonerRescueBountyhunter", "Bountyhunter", ["Nawashi", "Ninja"]), - "PrisonerRescue": KDPrisonerRescue("PrisonerRescue", "Bandit", ["Bandit", "Bandit"]), - "PrisonerRescueAlchemist": KDPrisonerRescue("PrisonerRescueAlchemist", "Alchemist", ["Alkahestor", "Alchemist"]), - "PrisonerRescueNevermere": KDPrisonerRescue("PrisonerRescueNevermere", "Nevermere", ["Wolfgirl", "WolfgirlPet"]), - "PrisonerRescueApprentice": KDPrisonerRescue("PrisonerRescueApprentice", "Apprentice", ["Apprentice2", "Apprentice"]), - "PrisonerRescueDressmaker": KDPrisonerRescue("PrisonerRescueDressmaker", "Dressmaker", ["Librarian", "Dressmaker"]), - "PrisonerRescueWitch": KDPrisonerRescue("PrisonerRescueWitch", "Witch", ["WitchIce", "Apprentice"]), - "PrisonerRescueElemental": KDPrisonerRescue("PrisonerRescueElemental", "Elemental", ["ElementalAir", "ElementalFire"]), - "PrisonerRescueDragon": KDPrisonerRescue("PrisonerRescueDragon", "Dragon", ["DragonShield", "Dragon"]), - "PrisonerRescueMaid": KDPrisonerRescue("PrisonerRescueMaid", "Maidforce", ["MaidforceStalker", "Maidforce"]), - "PrisonerRescueBast": KDPrisonerRescue("PrisonerRescueBast", "Bast", ["Cleric", "MeleeCleric"]), - "PrisonerRescueElf": KDPrisonerRescue("PrisonerRescueElf", "Elf", ["Elf", "ElfRanger"]), - //"PrisonerRescueMushy": KDPrisonerRescue("PrisonerRescueMushy", "Mushy", ["Fungal", "Mushy"]), - "PrisonerRescueAncientRobot": KDPrisonerRescue("PrisonerRescueAncientRobot", "AncientRobot", ["CaptureBot", "Drone"]), - - "ShopkeeperRescue": { - response: "Default", - clickFunction: (gagged, player) => { - return false; - }, - options: { - "Accept": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KDGameData.PrisonerState = ""; - KinkyDungeonInterruptSleep(); - // Type shenanigans unintended - let doorTile = KDGetJailDoor(player.x, player.y); - /** @type {KDPoint} */ - let door = doorTile; - if (door) { - if (doorTile.tile) { - doorTile.tile.Lock = undefined; - KDUpdateDoorNavMap(); - } - KinkyDungeonMapSet(door.x, door.y, 'd'); - } else door = KinkyDungeonGetNearbyPoint(player.x, player.y, true); - if (!door) { - door = {x: player.x, y: player.y}; // Better glitch than break game - } - KinkyDungeonEntities = []; - KDGameData.RespawnQueue = []; - KDUpdateEnemyCache = true; - let e = DialogueCreateEnemy(door.x, door.y, "ShopkeeperRescue"); - e.allied = 9999; - e.faction = "Player"; - KDGameData.CurrentDialogMsgSpeaker = e.Enemy.name; - KinkyDungeonSetEnemyFlag(e, "RescuingPlayer", -1); - - KDGameData.KinkyDungeonGuardSpawnTimer = 100; - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Refuse": { - playertext: "Default", response: "Default", - gag: true, - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("refusedShopkeeperRescue", 100); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "ShopkeeperRescueChatter": { - response: "Default", - clickFunction: (gagged, player) => { - return false; - }, - options: { - "Treasure": { - playertext: "Default", response: "Default", gagDisabled: true, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Cost": { - playertext: "Default", response: "Default", gagDisabled: true, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "ShopkeeperTeleport": { - response: "Default", - clickFunction: (gagged, player) => { - if (!KDGameData.ShopkeeperFee) KDGameData.ShopkeeperFee = 0; - KDGameData.ShopkeeperFee += KDDialogueParams.ShopkeeperFee + Math.max(0, KDDialogueParams.ShopkeeperFeePerLevel * MiniGameKinkyDungeonLevel); - KDGameData.CurrentDialogMsgValue = { - "RESCUECOST": KDGameData.ShopkeeperFee, - }; - KDGameData.CurrentDialogMsgData = { - "RESCUECOST": "" + KDGameData.ShopkeeperFee, - }; - return false; - }, - options: { - "Pay": { - playertext: "Default", response: "Default", gag: true, - prerequisiteFunction: (gagged, player) => { - return KinkyDungeonGold >= KDGameData.ShopkeeperFee; - }, - clickFunction: (gagged, player) => { - KinkyDungeonGold -= KDGameData.ShopkeeperFee; - KDGameData.ShopkeeperFee = 0; - KinkyDungeonRemoveRestraintsWithShrine("Rope", undefined, true, false, true); - KinkyDungeonRemoveRestraintsWithShrine("Leather", undefined, true, false, true); - KinkyDungeonRemoveRestraintsWithShrine("Metal", undefined, true, false, true); - KinkyDungeonRemoveRestraintsWithShrine("Latex", undefined, true, false, true); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Tab": { - prerequisiteFunction: (gagged, player) => { - return !KDGameData.CurrentDialogMsgData.Please; - }, - playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { - if (KinkyDungeonGold >= KDDialogueParams.ShopkeeperFee + Math.max(0, KDDialogueParams.ShopkeeperFeePerLevel * MiniGameKinkyDungeonLevel)) { - KDGameData.CurrentDialogMsg = "ShopkeeperTeleportTabNo"; - KDGameData.CurrentDialogStage = ""; - KDGameData.CurrentDialogMsgData.Please = "true"; - return false; - } else { - if (!KDGameData.CurrentDialogMsgData) KDGameData.CurrentDialogMsgData = {}; - KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor = KinkyDungeonGetRestraint({tags: ['basicCurse', 'shopCurse']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; - KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint = KDChooseRestraintFromListGroupPri( - KDGetRestraintsEligible({tags: ['trap', 'shopRestraint']}, 10, 'grv', true, undefined, undefined, undefined, false), - KDRestraintGroupProgressiveOrderFun)?.name; - KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar = KinkyDungeonGetRestraint({tags: ['shopCollar']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; - KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit = KinkyDungeonGetRestraint({tags: ['shopCatsuit']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; - - if (KDGameData.ShopkeeperFee < KDDialogueParams.ShopkeeperFeePunishThresh || !( - KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor - || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint - || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar - || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit - || KinkyDungeonGold > KDGameData.ShopkeeperFee - )) { - if (KinkyDungeonPlayerTags.get("Metal") || KinkyDungeonPlayerTags.get("Leather") || KinkyDungeonPlayerTags.get("Rope") || KinkyDungeonPlayerTags.get("Latex")) { - KDGameData.CurrentDialogMsg = "ShopkeeperTeleportTabYesRestrained"; - } else KDGameData.CurrentDialogMsg = "ShopkeeperTeleportTabYes"; - } else { - KDGameData.CurrentDialogStage = "Debt"; - KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; - } - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "TabRetry": { - prerequisiteFunction: (gagged, player) => { - return KDGameData.CurrentDialogMsgData.Please != undefined; - }, - playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { - if (!KDGameData.CurrentDialogMsgData) KDGameData.CurrentDialogMsgData = {}; - KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor = KinkyDungeonGetRestraint({tags: ['basicCurse', 'shopCurse']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; - KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint = KDChooseRestraintFromListGroupPri( - KDGetRestraintsEligible({tags: ['trap', 'shopRestraint']}, 10, 'grv', true, undefined, undefined, undefined, false), - KDRestraintGroupProgressiveOrderFun)?.name; - KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar = KinkyDungeonGetRestraint({tags: ['shopCollar']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; - KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit = KinkyDungeonGetRestraint({tags: ['shopCatsuit']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; - - if (KDGameData.ShopkeeperFee < KDDialogueParams.ShopkeeperFeePunishThresh || !( - KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor - || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint - || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar - || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit - || KinkyDungeonGold > KDGameData.ShopkeeperFee - )) { - if (KinkyDungeonPlayerTags.get("Metal") || KinkyDungeonPlayerTags.get("Leather") || KinkyDungeonPlayerTags.get("Rope") || KinkyDungeonPlayerTags.get("Latex")) { - KDGameData.CurrentDialogMsg = "ShopkeeperTeleportTabRetryRestrained"; - } else KDGameData.CurrentDialogMsg = "ShopkeeperTeleportTabRetry"; - } else { - KDGameData.CurrentDialogStage = "Debt"; - KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Debt": { - prerequisiteFunction: (gagged, player) => { - return false; - }, - playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { - return false; - }, - options: { - "Armor": { - playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { - return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Armor != undefined; - }, - clickFunction: (gagged, player) => { - KDGameData.CurrentDialogMsgData.RESTRAINTNAME = TextGet("Restraint" + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor); - return false; - }, - options: { - "Yes": { - playertext: "ShopkeeperTeleportDebt_Yes", response: "Default", gag: true, - clickFunction: (gagged, player) => { - if (KDRandom() > (KDBasicArmorWeight_Cursed) / (KDBasicArmorWeight_Cursed + KDBasicArmorWeight)) { - KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt_Armor_YesUncursed"; - - } else { - KinkyDungeonAddRestraint(KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor), 0, true, "", true, false, false, undefined, "Shopkeeper", false, undefined, - CommonRandomItemFromList("", KDCurseUnlockList.Basic)); - KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt_Armor_YesCursed"; - - } - - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "No": { - playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { - KDGameData.CurrentDialogStage = "Debt"; - KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; - return true; - } - }, - } - }, - "Restraint": { - playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { - return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Restraint != undefined; - }, - clickFunction: (gagged, player) => { - KDGameData.CurrentDialogMsgData.RESTRAINTNAME = TextGet("Restraint" + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint); - return false; - }, - options: { - "Yes": { - playertext: "ShopkeeperTeleportDebt_Yes", response: "Default", gag: true, - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraint(KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint), 0, true, "", true, false, false, undefined, "Shopkeeper", false, undefined, - CommonRandomItemFromList("", KDCurseUnlockList.Basic)); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "No": { - playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { - KDGameData.CurrentDialogStage = "Debt"; - KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; - return true; - } - }, - } - }, - "Collar": { - playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { - return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Collar != undefined; - }, - clickFunction: (gagged, player) => { - KDGameData.CurrentDialogMsgData.RESTRAINTNAME = TextGet("Restraint" + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar); - return false; - }, - options: { - "Yes": { - playertext: "ShopkeeperTeleportDebt_Yes", response: "Default", gag: true, - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraint(KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar), 0, true, "", true, false, false, undefined, "Shopkeeper", false, undefined, - CommonRandomItemFromList("", KDCurseUnlockList.Basic)); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "No": { - playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { - KDGameData.CurrentDialogStage = "Debt"; - KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; - return true; - } - }, - } - }, - "Catsuit": { - playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { - return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Catsuit != undefined; - }, - clickFunction: (gagged, player) => { - KDGameData.CurrentDialogMsgData.RESTRAINTNAME = TextGet("Restraint" + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit); - return false; - }, - options: { - "Yes": { - playertext: "ShopkeeperTeleportDebt_Yes", response: "Default", gag: true, - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraint(KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit), 0, true, "", true, false, false, undefined, "Shopkeeper", false, undefined, - CommonRandomItemFromList("", KDCurseUnlockList.Basic)); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "No": { - playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { - KDGameData.CurrentDialogStage = "Debt"; - KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; - return true; - } - }, - } - }, - "Pay": { - playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { - return KinkyDungeonGold >= KDGameData.ShopkeeperFee; - }, - clickFunction: (gagged, player) => { - KinkyDungeonGold -= KDGameData.ShopkeeperFee; - KDGameData.ShopkeeperFee = 0; - KinkyDungeonRemoveRestraintsWithShrine("Rope", undefined, true, false, true); - KinkyDungeonRemoveRestraintsWithShrine("Leather", undefined, true, false, true); - KinkyDungeonRemoveRestraintsWithShrine("Metal", undefined, true, false, true); - KinkyDungeonRemoveRestraintsWithShrine("Latex", undefined, true, false, true); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - } - }, - "ShopkeeperStart": { - response: "Default", - clickFunction: (gagged, player) => { - if (!KDGameData.ShopkeeperFee) KDGameData.ShopkeeperFee = 0; - KDGameData.CurrentDialogMsgValue = { - "RESCUECOST": KDGameData.ShopkeeperFee || (KDDialogueParams.ShopkeeperFee + Math.max(0, KDDialogueParams.ShopkeeperFeePerLevel * MiniGameKinkyDungeonLevel)), - }; - KDGameData.CurrentDialogMsgData = { - "RESCUECOST": "" + (KDGameData.ShopkeeperFee || (KDDialogueParams.ShopkeeperFee + Math.max(0, KDDialogueParams.ShopkeeperFeePerLevel * MiniGameKinkyDungeonLevel))), - }; - return false; - }, - options: { - "Danger": { - playertext: "Default", response: "Default", - gagDisabled: true, - options: { - "Return": { - playertext: "Return", response: "Default", - leadsToStage: "", - }, - } - }, - "Fee": { - playertext: "Default", response: "Default", - gagDisabled: true, - options: { - "Return": { - playertext: "Return", response: "Default", - leadsToStage: "", - }, - } - }, - "Shop": { - playertext: "Default", response: "Default", - gagDisabled: true, - options: { - "Return": { - playertext: "Return", response: "Default", - leadsToStage: "", - }, - } - }, - "Gag": { - playertext: "Default", response: "Default", - gagRequired: true, - options: { - "Return": { - playertext: "Return", response: "Default", - leadsToStage: "", - }, - } - }, - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - - "BlacksmithShop": KDSaleShop("BlacksmithShop", ["Lockpick", "Knife", "Sword", "Axe", "Spear", "TrapCuffs"], [], ["blacksmith"], 0.4, 1.5), - "PrisonerBandit": { - response: "Default", - personalities: ["Sub"], - clickFunction: (gagged, player) => { - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - "Help": { - playertext: "Default", response: "Default", - personalities: ["Sub"], - clickFunction: (gagged, player) => { - if (KDDialogueEnemy()) { - let e = KDDialogueEnemy(); - KDSpliceIndex(KinkyDungeonEntities.indexOf(KDDialogueEnemy()), 1); - let created = DialogueCreateEnemy(e.x, e.y, "Bandit"); - created.allied = 9999; - created.personality = e.personality; - if (KDFactionRelation("Player", "Bandit") < -0.5) { - for (let enemy of KinkyDungeonEntities) { - if (enemy.Enemy.tags.bandit) { - if (enemy.hostile && enemy.hostile < 9000) { - enemy.hostile = 0; - } - enemy.ceasefire = 300; - } - } - } - KinkyDungeonAggroFaction("Bountyhunter"); - if (KDFactionRelation("Player", "Bandit") < 0.25) - KinkyDungeonChangeFactionRep("Bandit", 0.015); - else - KinkyDungeonChangeFactionRep("Bandit", 0.005); - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Tighten": { - playertext: "Default", response: "Default", - personalities: ["Sub"], - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "PrisonerJail": { // For prisoners in the prison level. Doesnt increase rep much, but useful for jailbreak purposes - response: "Default", - clickFunction: (gagged, player) => { - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - "Unlock": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - if (KinkyDungeonRedKeys > 0) { - if (KinkyDungeonCanUseKey() || !KinkyDungeonIsArmsBound()) { - if (KDDialogueEnemy()) { - let e = KDDialogueEnemy(); - e.boundLevel = 0; - KinkyDungeonSetEnemyFlag(e, "imprisoned", 0); - e.allied = 9999; - e.specialdialogue = undefined; - KinkyDungeonAggroFaction("Jail"); - let faction = e.Enemy.faction ? e.Enemy.faction : "Enemy"; - e.faction = "Player"; - if (!KinkyDungeonHiddenFactions.includes(faction) && !(KDGameData.MapFaction == faction)) { - if (KDFactionRelation("Player", faction) < 0.25) - KinkyDungeonChangeFactionRep(faction, 0.005); - else - KinkyDungeonChangeFactionRep(faction, 0.0025); - } - KinkyDungeonRedKeys -= 1; - if (KinkyDungeonIsHandsBound(false, true, 0.2)) { - DialogueBringNearbyEnemy(player.x, player.y, 8); - KDGameData.CurrentDialogMsg = "PrisonerJailUnlockSlow"; - } else { - KDGameData.CurrentDialogMsg = "PrisonerJailUnlock"; - if (e.Enemy.tags.gagged) { - KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + "Gagged"; - } - } - } - } else { - KDGameData.CurrentDialogStage = ""; - KDGameData.CurrentDialogMsg = "PrisonerJailUnlockHandsBound"; - } - } else { - KDGameData.CurrentDialogStage = ""; - KDGameData.CurrentDialogMsg = "PrisonerJailNoKeys"; - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Pick": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - if (KinkyDungeonLockpicks > 0) { - if (!KinkyDungeonIsHandsBound(false, true, 0.45)) { - if (KDDialogueEnemy()) { - let e = KDDialogueEnemy(); - e.boundLevel = 0; - KinkyDungeonSetEnemyFlag(e, "imprisoned", 0); - e.allied = 9999; - e.specialdialogue = undefined; - KinkyDungeonAggroFaction("Jail"); - let faction = e.Enemy.faction ? e.Enemy.faction : "Enemy"; - e.faction = "Player"; - if (!KinkyDungeonHiddenFactions.includes(faction) && !(KDGameData.MapFaction == faction)) { - if (KDFactionRelation("Player", faction) < 0.25) - KinkyDungeonChangeFactionRep(faction, 0.005); - else - KinkyDungeonChangeFactionRep(faction, 0.0025); - } - KDGameData.CurrentDialogMsg = "PrisonerJailPick"; - if (e.Enemy.tags.gagged) { - KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + "Gagged"; - } - DialogueBringNearbyEnemy(player.x, player.y, 8); - } - } else { - KDGameData.CurrentDialogStage = ""; - KDGameData.CurrentDialogMsg = "PrisonerJailPickHandsBound"; - } - } else { - KDGameData.CurrentDialogStage = ""; - KDGameData.CurrentDialogMsg = "PrisonerJailNoPick"; - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "Fuuka": { - response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - enemy.hostile = 9999; - enemy.aware = true; - enemy.vp = 2; - enemy.AI = 'hunt'; - KinkyDungeonSetFlag("BossDialogueFuuka", -1, 1); - } - return false; - }, - options: { - "Aggressive": { gag: true, - playertext: "Default", response: "Default", - options: { - "Question": {gagDisabled: true, - playertext: "Default", response: "Default", - options: { - "Brat": { - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - } - } - }, - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - "Proceed": {gagDisabled: true, - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - "ProceedGag": {gagRequired: true, - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - "Brat": {gagDisabled: true, - playertext: "Default", response: "Default", - options: { - "Proceed": {gag: true, - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - "Proceed2": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - } - }, - "Defensive": { gag: true, - playertext: "Default", response: "Default", - options: { - "Question": {gagDisabled: true, - playertext: "Default", response: "Default", - options: { - "Question": { - playertext: "Default", response: "Default", - options: { - "Question": { - playertext: "Default", response: "Default", - options: { - "Question": { - playertext: "Default", response: "Default", - options: { - "Question": { - playertext: "Default", response: "Default", - options: { - "Question": { - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", - leadsToStage: "PostIntro", - } - } - }, - "Question2": { - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", - leadsToStage: "PostIntro", - } - } - }, - "Proceed": { - playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", - leadsToStage: "PostIntro", - } - } - }, - "Proceed": { - playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", - leadsToStage: "PostIntro", - } - } - }, - "Proceed": { - playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", - leadsToStage: "PostIntro", - } - } - }, - "Proceed": { - playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", - leadsToStage: "PostIntro", - } - } - }, - "Proceed": { - playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - "Proceed": {gagDisabled: true, - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - "ProceedGag": {gagRequired: true, - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - "Brat": {gagDisabled: true, - playertext: "Default", response: "Default", - options: { - "Proceed": {gag: true, - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - "Proceed2": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - } - }, - "Brat": { gag: true, - playertext: "Default", response: "Default", - options: { - "Question": {gagDisabled: true, - playertext: "Default", response: "Default", - options: { - "Question": { - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - } - } - }, - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - "Proceed": {gagDisabled: true, - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - "ProceedGag": {gagRequired: true, - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - "Brat": {gagDisabled: true, - playertext: "Default", response: "Default", - options: { - "Proceed": {gag: true, - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - "Proceed2": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - } - }, - "Dom": { gag: true, - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", -2); - return false; - }, - options: { - "Question": {gagDisabled: true, - playertext: "Default", response: "Default", - options: { - "Question": { - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - } - } - }, - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - "Proceed": {gagDisabled: true, - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - "ProceedGag": {gagRequired: true, - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - "Brat": {gag: true, - playertext: "Default", response: "Default", - options: { - "Proceed": {gag: true, - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - "Proceed2": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - } - }, - "Sub": { gag: true, - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", 2); - return false; - }, - options: { - "Question": {gagDisabled: true, - playertext: "Default", response: "Default", - options: { - "Question": { - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - } - } - }, - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - "Proceed": {gagDisabled: true, - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - "ProceedGag": {gagRequired: true, - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - "Brat": {gag: true, - playertext: "Default", response: "Default", - options: { - "Proceed": {gag: true, - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - "Proceed2": { - playertext: "Default", response: "Default", - leadsToStage: "PostIntro", - }, - } - }, - } - }, - "Attack": {playertext: "Default", exitDialogue: true}, - - "PostIntro": { - prerequisiteFunction: (gagged, player) => {return false;}, - playertext: "Default", response: "Default", - options: { - "Zombie": { - gagDisabled: true, - playertext: "Default", response: "Default", - leadsToStage: "Defensive_Question", - }, - "Brat": {gag: true, - playertext: "Default", response: "FuukaPostIntro_Brat", - leadsToStage: "Fight", - }, - "Dom": {gag: true, - playertext: "Default", response: "FuukaPostIntro_Dom", - leadsToStage: "Fight", - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", -2); - return false; - } - }, - "Sub": {gag: true, - playertext: "Default", response: "FuukaPostIntro_Sub", - leadsToStage: "Fight", - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", 2); - return false; - } - }, - "Normal": {gag: true, - playertext: "Default", response: "FuukaPostIntro_Normal", - leadsToStage: "Fight", - }, - } - }, - "Fight": { - prerequisiteFunction: (gagged, player) => {return false;}, - playertext: "Default", dontTouchText: true, - options: { - "Fight1": {gag: true, - playertext: "Default", exitDialogue: true, - }, - "Fight2": {gag: true, - playertext: "Default", exitDialogue: true, - }, - "Fight3": {gag: true, - playertext: "Default", exitDialogue: true, - }, - } - } - } - }, - "Dollmaker": { - response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - enemy.hostile = 9999; - enemy.aware = true; - enemy.vp = 2; - enemy.AI = 'hunt'; - KinkyDungeonSetFlag("BossDialogueDollmaker", -1, 1); - } - return false; - }, - options: { - "Ask": { - playertext: "Default", response: "Default", gag: true, - options: { - "Proceed": { - playertext: "Default", response: "Default", gag: true, - leadsToStage: "Fight", - }, - "Staff": { - prerequisiteFunction: (gagged, player) => { - return KinkyDungeonPlayerDamage?.name == "StaffDoll"; - }, - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "Fight", - }, - } - } - } - }, - "Assume": { - playertext: "Default", response: "Default", gagDisabled: true, - options: { - "Happy": { - playertext: "Default", response: "Default", - leadsToStage: "Fight", - }, - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "Fight", - }, - "Staff": { - prerequisiteFunction: (gagged, player) => { - return KinkyDungeonPlayerDamage?.name == "StaffDoll"; - }, - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", response: "Default", - leadsToStage: "Fight", - }, - } - } - } - }, - - "Fight": { - prerequisiteFunction: (gagged, player) => {return false;}, - playertext: "Default", response: "Default", - options: { - "Wait": {gagDisabled: true, - playertext: "Default", response: "Default", - options: { - "Dismiss": { - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", exitDialogue: true, - }, - } - }, - "Press": { - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", exitDialogue: true, - }, - } - }, - "Press2": { - playertext: "Default", response: "Default", - options: { - "Proceed": { - playertext: "Default", exitDialogue: true, - }, - } - }, - "Proceed": { - playertext: "Default", exitDialogue: true, - }, - } - }, - "Fight1": {gag: true, - playertext: "Default", exitDialogue: true, - }, - "Fight2": {gag: true, - playertext: "Default", exitDialogue: true, - }, - "Fight3": {gag: true, - playertext: "Default", exitDialogue: true, - }, - } - }, - "Attack": {playertext: "Default", exitDialogue: true}, - } - }, - "DollmakerStage2": { // Player defeats fuuka's first form - response: "Default", - clickFunction: (gagged, player) => { - let point = KinkyDungeonGetNearbyPoint(KinkyDungeonStartPosition.x + 10, KinkyDungeonStartPosition.y - 5, true,undefined, true); - if (!point) { - point = {x: KinkyDungeonStartPosition.x + 10, y: KinkyDungeonStartPosition.y - 7}; - } - let e = DialogueCreateEnemy(point.x, point.y, "DollmakerBoss2"); - e.hostile = 300; - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "DollmakerStage3": { // Player defeats fuuka's first form - response: "Default", - clickFunction: (gagged, player) => { - // Remove the doors - for (let en of KinkyDungeonEntities) { - if (en.Enemy.tags.dolldoor) en.hp = 0; - } - let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true); - if (!point) { - point = KinkyDungeonGetRandomEnemyPoint(false, false, null); - } - let e = DialogueCreateEnemy(point.x, point.y, "DollmakerBoss3"); - e.hostile = 300; - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "DollmakerWin": { // Player beats Fuuka - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("BossUnlocked", -1); - KinkyDungeonSetFlag("SpawnMap", -1); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - clickFunction: (gagged, player) => { - if (KinkyDungeonIsPlayer()) { - KDUnlockPerk("DollmakerVisor"); - KDUnlockPerk("StartCyberDoll"); - KDUnlockPerk("CommonCyber"); - } - return false; - }, - exitDialogue: true, - }, - "Accept": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerVisor"), 0, true); - KinkyDungeonAddGold(1000); - if (KinkyDungeonIsPlayer()) { - KDUnlockPerk("DollmakerVisor"); - KDUnlockPerk("StartCyberDoll"); - KDUnlockPerk("CommonCyber"); - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Accept2": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerMask"), 0, true); - KinkyDungeonAddGold(1000); - if (KinkyDungeonIsPlayer()) { - KDUnlockPerk("DollmakerVisor"); - KDUnlockPerk("StartCyberDoll"); - KDUnlockPerk("CommonCyber"); - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Gag": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", -5); - if (KinkyDungeonIsPlayer()) { - KDUnlockPerk("DollmakerVisor"); - KDUnlockPerk("StartCyberDoll"); - KDUnlockPerk("CommonCyber"); - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "DollmakerLose": { // Player loses to Fuuka - response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - enemy.hostile = 0; - enemy.ceasefire = 4; - KinkyDungeonSetFlag("BossUnlocked", -1); - KinkyDungeonSetFlag("NoDollRoomBypass", 0); - } - return false; - }, - options: { - "Accept": { gag: true, - playertext: "Default", response: "Default", - options: { - "Continue1": { - playertext: "DollmakerLose_Continue1", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerVisor"), 0, true); - return false; - }, - }, - "Continue2": { - playertext: "DollmakerLose_Continue2", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerMask"), 0, true); - return false; - }, - }, - "Continue3": { - playertext: "DollmakerLose_Continue3", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(KDRandom() < 0.5 ? "DollmakerVisor" : "DollmakerMask"), 0, true); - return false; - }, - }, - } - }, - "Deny": { gag: true, - playertext: "Default", response: "Default", - options: { - "Continue1": { - playertext: "DollmakerLose_Continue1", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerVisor"), 0, true); - return false; - }, - }, - "Continue2": { - playertext: "DollmakerLose_Continue2", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerMask"), 0, true); - return false; - }, - }, - "Continue3": { - playertext: "DollmakerLose_Continue3", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(KDRandom() < 0.5 ? "DollmakerVisor" : "DollmakerMask"), 0, true); - return false; - }, - }, - } - }, - "Finish": { - prerequisiteFunction: (gagged, player) => {return false;}, - playertext: "Default", response: "DollmakerLoseFinish", - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - } - } - }, - "FuukaLose": { // Player loses to Fuuka - response: "Default", - clickFunction: (gagged, player) => { - let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { - enemy.hostile = 0; - enemy.ceasefire = 4; - KinkyDungeonSetFlag("BossUnlocked", -1); - } - return false; - }, - options: { - "Accept": { gag: true, - playertext: "Default", response: "Default", - options: { - "Continue1": { - playertext: "FuukaLose_Continue1", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); - return false; - }, - }, - "Continue2": { - playertext: "FuukaLose_Continue2", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); - return false; - }, - }, - "Continue3": { - playertext: "FuukaLose_Continue3", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); - return false; - }, - }, - } - }, - "Deny": { gag: true, - playertext: "Default", response: "Default", - options: { - "Continue1": { - playertext: "FuukaLose_Continue1", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); - return false; - }, - }, - "Continue2": { - playertext: "FuukaLose_Continue2", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); - return false; - }, - }, - "Continue3": { - playertext: "FuukaLose_Continue3", response: "Default", - leadsToStage: "Finish", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); - return false; - }, - }, - } - }, - "Finish": { - prerequisiteFunction: (gagged, player) => {return false;}, - playertext: "Default", response: "FuukaLoseFinish", - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - } - } - }, - "FuukaStage2": { // Player defeats fuuka's first form - response: "Default", - clickFunction: (gagged, player) => { - let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true); - if (!point) { - point = KinkyDungeonGetRandomEnemyPoint(false, false, null); - } - let e = DialogueCreateEnemy(point.x, point.y, "Fuuka2"); - e.hostile = 300; - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "FuukaWin": { // Player beats Fuuka - response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonSetFlag("BossUnlocked", -1); - KinkyDungeonSetFlag("SpawnMap", -1); - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - clickFunction: (gagged, player) => { - if (KinkyDungeonIsPlayer()) { - KDUnlockPerk("FuukaCollar"); - KDUnlockPerk("CommonFuuka"); - } - return false; - }, - exitDialogue: true, - }, - "Accept": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); - KinkyDungeonAddGold(1000); - if (KinkyDungeonIsPlayer()) { - KDUnlockPerk("FuukaCollar"); - KDUnlockPerk("CommonFuuka"); - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - "Gag": { - playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { - KinkyDungeonChangeRep("Ghost", -5); - if (KinkyDungeonIsPlayer()) { - KDUnlockPerk("FuukaCollar"); - KDUnlockPerk("CommonFuuka"); - } - return false; - }, - options: { - "Leave": { - playertext: "Leave", response: "Default", - exitDialogue: true, - }, - } - }, - } - }, - "PotionSell": KDShopDialogue("PotionSell", ["PotionFrigid", "PotionStamina", "PotionMana", "PotionInvisibility"], [], ["witch", "apprentice", "alchemist", "human", "dragon"], 0.2), - "ElfCrystalSell": KDShopDialogue("ElfCrystalSell", ["PotionMana", "ElfCrystal", "EarthRune", "WaterRune", "IceRune"], [], ["elf"], 0.25), - "ScrollSell": KDShopDialogue("ScrollSell", ["ScrollArms", "ScrollVerbal", "ScrollLegs", "ScrollPurity"], [], ["witch", "apprentice", "elf", "wizard", "dressmaker"], 0.15), - "WolfgirlSell": KDShopDialogue("WolfgirlSell", ["MistressKey", "AncientPowerSource", "AncientPowerSourceSpent", "EnchantedGrinder"], [], ["trainer", "alchemist", "human"], 0.2), - "NinjaSell": KDShopDialogue("NinjaSell", ["SmokeBomb", "Bola", "Bomb", "PotionInvisibility"], [], ["ninja", "bountyhunter"], 0.2), - "GhostSell": KDShopDialogue("GhostSell", ["Ectoplasm", "PotionInvisibility", "ElfCrystal"], [], ["alchemist", "witch", "apprentice", "dressmaker", "dragon"], 0.1), - // TODO magic book dialogue in which you can read forward and there are traps - "GenericAlly": KDAllyDialogue("GenericAlly", [], [], [], 1), -}; - - diff --git a/Game/KinkyDungeonDialogueTriggers.js b/Game/KinkyDungeonDialogueTriggers.js deleted file mode 100644 index 419f6c746..000000000 --- a/Game/KinkyDungeonDialogueTriggers.js +++ /dev/null @@ -1,659 +0,0 @@ -"use strict"; - -/** No dialogues will trigger when the player dist is higher than this */ -let KinkyDungeonMaxDialogueTriggerDist = 5.9; - -/** @type {Record} */ -let KDDialogueTriggers = { - "WeaponStop": { - dialogue: "WeaponFound", - allowedPrisonStates: ["parole"], - excludeTags: ["zombie", "skeleton"], - playRequired: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - prerequisite: (enemy, dist, AIData) => { - return (KinkyDungeonPlayerDamage - && !KinkyDungeonPlayerDamage.unarmed - && KinkyDungeonPlayerDamage.name - && dist < 3.9 - && KDHostile(enemy) - && KDRandom() < 0.25 - && !KinkyDungeonFlags.has("demand")); - }, - weight: (enemy, dist) => { - return KDStrictPersonalities.includes(enemy.personality) ? 10 : 1; - }, - }, - "OfferDress": { - dialogue: "OfferDress", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Sub"], - requireTagsSingle: ["dressRestraints", "bindingDress"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["bindingDress"])); - }, - weight: (enemy, dist) => { - return 1 + 0.8 * Math.max(Math.abs(KinkyDungeonGoddessRep.Latex)/100, Math.abs(KinkyDungeonGoddessRep.Conjure)/100); - }, - }, - "OfferKigu": { - dialogue: "OfferKigu", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Sub"], - requireTagsSingle: ["kiguRestraints"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["kiguRestraints"])); - }, - weight: (enemy, dist) => { - return 1 + 0.8 * Math.max(Math.abs(KinkyDungeonGoddessRep.Latex)/100, Math.abs(KinkyDungeonGoddessRep.Conjure)/100); - }, - }, - "OfferArmor": { - dialogue: "OfferArmor", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Sub"], - requireTagsSingle: ["melee"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.1,["shackleGag"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Metal)/100, Math.abs(KinkyDungeonGoddessRep.Illusion)/100); - }, - }, - "OfferChain": { - dialogue: "OfferChain", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Sub"], - requireTagsSingle: ["chainRestraints", "witch"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["chainRestraints"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Metal)/100, Math.abs(KinkyDungeonGoddessRep.Conjure)/100); - }, - }, - "OfferVine": { - dialogue: "OfferVine", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom"], - requireTagsSingle: ["vineRestraints"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["vineRestraints"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Rope)/100, Math.abs(KinkyDungeonGoddessRep.Will)/100); - }, - }, - "OfferObsidian": { - dialogue: "OfferObsidian", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom", "Sub"], - requireTagsSingle: ["obsidianRestraints"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["obsidianRestraints"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Metal)/100, Math.abs(KinkyDungeonGoddessRep.Elements)/100); - }, - }, - "OfferMaidRestraint": { - dialogue: "OfferMaidRestraint", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Sub"], - requireTagsSingle: ["maidRestraints"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["maidRestraints"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Latex)/100, Math.abs(KinkyDungeonGoddessRep.Illusion)/100); - }, - }, - "OfferDragon": { - dialogue: "OfferDragon", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom"], - requireTagsSingle: ["dragonRestraints"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["dragonRestraints"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.abs(KinkyDungeonGoddessRep.Leather)/100; - }, - }, - "OfferComfy": { - dialogue: "OfferComfy", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Sub"], - requireTagsSingle: ["submissive"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["comfyRestraints"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Conjure)/100, Math.abs(KinkyDungeonGoddessRep.Illusion)/100); - }, - }, - "OfferShackles": { - dialogue: "OfferShackles", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom"], - requireTagsSingle: ["shackleRestraints", "steelCuffs", "handcuffer"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["shackleRestraints", "steelCuffs"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Metal)/100, Math.abs(KinkyDungeonGoddessRep.Prisoner)/100); - }, - }, - "OfferKitty": { - dialogue: "OfferKitty", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom", "Sub"], - requireTagsSingle: ["kittyRestraints"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["kittyRestraints"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Leather)/100, Math.abs(KinkyDungeonGoddessRep.Will)/100); - }, - }, - "OfferMithrilRope": { - dialogue: "OfferMithrilRope", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom","Sub"], - requireTagsSingle: ["mithrilRope","mithrilRopeHogtie"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["mithrilRope","mithrilRopeHogtie"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Rope)/100, Math.abs(KinkyDungeonGoddessRep.Will)/100); - }, - }, - "OfferMithril": { - dialogue: "OfferMithril", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom","Sub"], - requireTagsSingle: ["mithrilRestraints"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["mithrilRestraints"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Metal)/100, Math.abs(KinkyDungeonGoddessRep.Ghost)/100); - }, - }, - "OfferWolfRestraint": { - dialogue: "OfferWolfRestraint", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom"], - requireTagsSingle: ["trainer"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["wolfRestraints"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Metal)/100, Math.abs(KinkyDungeonGoddessRep.Will)/100); - }, - }, - "OfferSlime": { - dialogue: "OfferSlime", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom"], - requireTags: ["alchemist","human"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["slimeRestraintsRandom"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Latex)/100, Math.abs(KinkyDungeonGoddessRep.Will)/100); - }, - }, - "OfferScarf": { - dialogue: "OfferScarf", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom", "Sub"], - requireTagsSingle: ["scarfRestraints","ropeAuxiliary"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["scarfRestraints"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.abs(KinkyDungeonGoddessRep.Rope)/100; - }, - }, - "OfferAutoTape": { - dialogue: "OfferAutoTape", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Robot"], - requireTags: ["robot","autoTape"], - excludeTags: ["zombie", "skeleton"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["autoTape"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.abs(KinkyDungeonGoddessRep.Metal + 50)/100; - }, - }, - "OfferHiTechCables": { - dialogue: "OfferHiTechCables", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Robot"], - requireTags: ["robot"], - requireTagsSingle: ["hitechCables", "cableGag"], - excludeTags: ["zombie", "skeleton"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["hitechCables", "cableGag"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.abs(KinkyDungeonGoddessRep.Metal + 50)/100; - }, - }, - "OfferIce": { - dialogue: "OfferIce", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom"], - requireTagsSingle: ["iceRestraints", "ice", "apprentice", "witch", "water"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["iceRestraints"])); - }, - weight: (enemy, dist) => { - return 0.5 + 0.1 * Math.max(Math.abs(KinkyDungeonGoddessRep.Elements)/100, Math.abs(KinkyDungeonGoddessRep.Ghost)/100); - }, - }, - "OfferLatex": { - dialogue: "OfferLatex", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Sub"], - requireTagsSingle: ["latexRestraints", "latexRestraintsHeavy"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.25,["latexRestraints", "latexRestraintsHeavy"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.max(Math.abs(KinkyDungeonGoddessRep.Latex)/100, Math.abs(KinkyDungeonGoddessRep.Conjure)/100); - }, - }, - "OfferChastity": { - dialogue: "OfferChastity", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Sub"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: true, - prerequisite: (enemy, dist, AIData) => { - return (dist < 1.5 - && KinkyDungeonStatsChoice.has("arousalMode") - && !KinkyDungeonFlags.get("DangerFlag") - && !KinkyDungeonFlags.get("BondageOffer") - && !KinkyDungeonFlags.get("ChastityOffer") - && !KinkyDungeonFlags.get("NoTalk") - && KDRandom() < 0.05 - && KinkyDungeonGetRestraint({tags: ["genericChastity"]}, MiniGameKinkyDungeonLevel * 2, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]) != undefined); - }, - weight: (enemy, dist) => { - return 1 + 0.8 * Math.max(Math.abs(KinkyDungeonGoddessRep.Metal)/100, Math.abs(KinkyDungeonGoddessRep.Elements)/100, Math.abs(KinkyDungeonGoddessRep.Illusion)/100, Math.abs(KinkyDungeonGoddessRep.Ghost)/100); - }, - }, - "OfferRopes": { - dialogue: "OfferRopes", - allowedPrisonStates: ["parole", ""], - allowedPersonalities: ["Dom"], - requireTagsSingle: ["ropeRestraints", "ropeRestraints2", "ropeRestraintsWrist", "ropeRestraintsHogtie"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.5,["ropeRestraints", "ropeRestraints", "ropeRestraintsWrist", "ropeRestraintsHogtie"])); - }, - weight: (enemy, dist) => { - return 1 + 0.4 * Math.abs(KinkyDungeonGoddessRep.Rope + 50)/100; - }, - }, - "OfferLeather": { - dialogue: "OfferLeather", - allowedPrisonStates: ["parole", ""], - requireTagsSingle: ["leatherRestraints", "leatherRestraintsHeavy"], - excludeTags: ["zombie", "skeleton", "robot"], - playRequired: true, - nonHostile: true, - noCombat: true, - noAlly: true, - blockDuringPlaytime: false, - onlyDuringPlay: true, - allowPlayExceptionSub: true, - prerequisite: (enemy, dist, AIData) => { - return (KDDefaultPrereqs(enemy, AIData,dist,1.5,0.5,["leatherRestraintsHeavy"])); - }, - weight: (enemy, dist) => { - return 1 + 0.5 * Math.abs(KinkyDungeonGoddessRep.Leather + 50)/100; - }, - }, - - - - "PotionSell": KDShopTrigger("PotionSell"), - "ElfCrystalSell": KDShopTrigger("ElfCrystalSell"), - "NinjaSell": KDShopTrigger("NinjaSell"), - "ScrollSell": KDShopTrigger("ScrollSell"), - "GhostSell": KDShopTrigger("GhostSell"), - "WolfgirlSell": KDShopTrigger("WolfgirlSell"), - "Fuuka": KDBossTrigger("Fuuka", ["Fuuka1", "Fuuka2"]), - "FuukaLose": KDBossLose("FuukaLose", ["Fuuka1", "Fuuka2"], ["mikoRestraints"]), - "DollmakerLose1": KDBossLose("DollmakerLose", ["DollmakerBoss1"], ["controlharness", "dollmakerrestraints", "leashing"]), - "DollmakerLose2": KDBossLose("DollmakerLose", ["DollmakerBoss2", "DollmakerBoss3"], ["controlharness", "cyberdollrestraints", "dollmakerrestraints"]), - "Dollmaker": KDBossTrigger("Dollmaker", ["DollmakerBoss1", "DollmakerBoss2", "DollmakerBoss3"]), -}; - -/** - * Generic condition for Bondage Offers - * @param {entity} enemy - * @param {any} AIData - * @param {number} dist - Current player dist, its sent as a param for faster runtime - * @param {number} maxdist - * @param {number} chance - * @param {string[]} restraintTags - Tags of required restraints - * @returns {boolean} - */ -function KDDefaultPrereqs(enemy, AIData, dist, maxdist, chance, restraintTags) { - return dist < maxdist - && !AIData.domMe - && !KDEnemyHasFlag(enemy, "playstart") - && !KinkyDungeonFlags.get("DangerFlag") - && !KinkyDungeonFlags.get("BondageOffer") - && !KinkyDungeonFlags.get("NoTalk") - && (KinkyDungeonStatsChoice.get("Undeniable") || KDRandom() < chance) - && (!restraintTags || KinkyDungeonGetRestraint({tags: restraintTags}, MiniGameKinkyDungeonLevel * 2, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]) != undefined) - && (KinkyDungeonStatsChoice.get("Undeniable") || !KDIsBrat(enemy)); -} - -function KDShopTrigger(name) { - return { - dialogue: name, - allowedPrisonStates: ["parole", ""], - nonHostile: true, - noCombat: true, - excludeTags: ["noshop"], - blockDuringPlaytime: true, - prerequisite: (enemy, dist, AIData) => { - return (dist < 1.5 - && !KinkyDungeonFlags.get("NoTalk") - && !(KDGameData.SleepTurns > 0) - && KDEnemyHasFlag(enemy, name) - && !KDEnemyHasFlag(enemy, "NoShop")); - }, - weight: (enemy, dist) => { - return 100; - }, - }; -} - -/** - * - * @param {string} name - * @param {KinkyDialogue} name - * @returns {KinkyDialogueTrigger} - */ -function KDRecruitTrigger(name, dialogue) { - if (dialogue) - return { - dialogue: name, - allowedPrisonStates: ["parole", ""], - requireTags: dialogue.tags, - requireTagsSingle: dialogue.singletag, - excludeTags: dialogue.excludeTags, - playRequired: true, - nonHostile: true, - noCombat: true, - blockDuringPlaytime: true, - prerequisite: (enemy, dist, AIData) => { - return (dist < 1.5 - && !KinkyDungeonFlags.get("Recruited") - && !KinkyDungeonFlags.get("DangerFlag") - && !KinkyDungeonFlags.get(name) - && !KinkyDungeonFlags.get("NoTalk") - && KinkyDungeonCurrentDress != dialogue.outfit - && !enemy.faction - && !enemy.allied - && KDFactionRelation("Player", KDGetFactionOriginal(enemy)) > -0.1 - && KDRandom() < dialogue.chance); - }, - weight: (enemy, dist) => { - return 10; - }, - }; - return null; -} - -/** Boss intro dialogue */ -function KDBossTrigger(name, enemyName) { - return { - dialogue: name, - nonHostile: true, - prerequisite: (enemy, dist, AIData) => { - return (dist < 2.5 - && !KinkyDungeonFlags.get("NoTalk") - && !(KDGameData.SleepTurns > 0) - && enemyName.includes(enemy.Enemy.name) - && !KinkyDungeonFlags.has("BossUnlocked") - && !KinkyDungeonFlags.has("BossDialogue" + name)); - }, - weight: (enemy, dist) => { - return 100; - }, - }; -} -/** - * Lose to a boss - * @param {string} name - * @param {string[]} enemyName - * @param {string[]} tags - * @returns {KinkyDialogueTrigger} - */ -function KDBossLose(name, enemyName, tags) { - return { - dialogue: name, - prerequisite: (enemy, dist, AIData) => { - return (dist < 1.5 - && !KinkyDungeonFlags.get("NoTalk") - && !(KDGameData.SleepTurns > 0) - && enemyName.includes(enemy.Enemy.name) - && !KinkyDungeonFlags.has("BossUnlocked") - && !KinkyDungeonHasWill(0.1) - && (!tags || !KinkyDungeonGetRestraint({tags: tags}, MiniGameKinkyDungeonLevel * 2, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]))); - }, - weight: (enemy, dist) => { - return 100; - }, - }; -} - -function KinkyDungeonGetShopForEnemy(enemy, guaranteed) { - if (enemy.Enemy.tags.noshop) return ""; - let shoplist = []; - for (let s of Object.values(KDShops)) { - let end = false; - if (s.tags) { - for (let t of s.tags) { - if (!enemy.Enemy.tags[t]) { - end = true; - break; - } - } - } - let hasTag = !s.singletag; - if (!end && s.singletag) { - for (let t of s.singletag) { - if (enemy.Enemy.tags[t]) { - hasTag = true; - break; - } - } - } - if (!hasTag) end = true; - if (!end && (guaranteed || !s.chance || KDRandom() < s.chance)) shoplist.push(s.name); - } - if (shoplist.length > 0) return shoplist[Math.floor(KDRandom() * shoplist.length)]; - return ""; -} diff --git a/Game/KinkyDungeonDraw.js b/Game/KinkyDungeonDraw.js deleted file mode 100644 index a81c7d06d..000000000 --- a/Game/KinkyDungeonDraw.js +++ /dev/null @@ -1,3121 +0,0 @@ -"use strict"; - -let KDRecentRepIndex = 0; - -let ShowBoringness = false; - -let KDWallReplacers = "14,dDzZbgS"; - -let KinkyDungeonSuppressSprint = true; - -let KDReturnButtonXX = 1450; - -let KDIntenseFilter = null; - -// PIXI experimental -let pixiview = document.getElementById("MainCanvas"); -// @ts-ignore -let pixirenderer = null; -// @ts-ignore -let pixirendererKD = null; -// @ts-ignore -let kdgamefog = new PIXI.Graphics(); -// @ts-ignore -let kdgameboard = new PIXI.Container(); -kdgameboard.sortableChildren = true; -// @ts-ignore -let kdui = new PIXI.Graphics(); -// @ts-ignore -let kdcanvas = new PIXI.Container(); -kdcanvas.sortableChildren = true; - - -// @ts-ignore -let kdparticles = new PIXI.Container(); -kdparticles.sortableChildren = true; -//kdgameboard.addChild(kdparticles); - -let KDTextWhite = "#ffffff"; -let KDTextGray3 = "#aaaaaa"; -let KDTextTan = "#d6cbc5"; -let KDTextGray2 = "#333333"; -let KDTextGray1 = "#111111"; -let KDTextGray0 = "#000000"; -let KDCurseColor = "#ff55aa"; -let KDGoodColor = "#77ff99"; - -/** - * @type {Map} - */ -let kdSpritesDrawn = new Map(); - -/** - * @type {Map} - */ -let kdpixisprites = new Map(); - -/** - * @type {Map} - */ -let kdprimitiveparams = new Map(); - -/** - * @type {Map} - */ -let kdpixitex = new Map(); - -/** - * - * @param {number} x - * @param {number} y - * @param {string} [noReplace] - * @returns {boolean} - */ -function KDWallVert(x, y, noReplace) { - //let tileUp = KinkyDungeonMapGet(x, y); - let tileBelow = KinkyDungeonMapGet(x, y + 1); - if ( - // These are the tiles that trigger a replacement - (KDWallReplacers.includes(tileBelow) - && (!noReplace || !noReplace.includes(tileBelow))) - ) - return true; - - if (!KinkyDungeonVisionGet(x, y + 1) && !(KinkyDungeonFogGet(x, y + 1) > 0)) return true; - - return false; -} -/** - * - * @param {number} x - * @param {number} y - * @param {string} [noReplace] - * @returns {boolean} - */ -function KDWallVertAbove(x, y, noReplace) { - //let tileUp = KinkyDungeonMapGet(x, y); - let tileAbove = KinkyDungeonMapGet(x, y - 1); - if ( - // These are the tiles that trigger a replacement - KDWallReplacers.includes(tileAbove) - && (!noReplace || !noReplace.includes(tileAbove)) - ) - return true; - - return false; -} -/** - * - * @param {number} x - * @param {number} y - * @param {string} [noReplace] - * @returns {boolean} - */ -function KDWallVertBoth(x, y, noReplace) { - //let tileUp = KinkyDungeonMapGet(x, y); - let tileBelow = KinkyDungeonMapGet(x, y + 1); - let tileAbove = KinkyDungeonMapGet(x, y - 1); - if ( - // These are the tiles that trigger a replacement - KDWallReplacers.includes(tileBelow) - && (!noReplace || !noReplace.includes(tileBelow)) - && KDWallReplacers.includes(tileAbove) - && (!noReplace || !noReplace.includes(tileAbove)) - ) - return true; - - return false; -} -/** - * - * @param {number} x - * @param {number} y - * @returns {boolean} - */ -function KDWallHorizTunnel(x, y) { - //let tileUp = KinkyDungeonMapGet(x, y); - let tileUp = KinkyDungeonMapGet(x, y - 1); - let tileBelow = KinkyDungeonMapGet(x, y + 1); - if ( - // These are the tiles that trigger a replacement - KinkyDungeonWallTiles.includes(tileUp) - && KinkyDungeonWallTiles.includes(tileBelow) - ) - return true; - - return false; -} -/** - * - * @param {number} x - * @param {number} y - * @returns {boolean} - */ -function KDWallVertTunnel(x, y) { - //let tileUp = KinkyDungeonMapGet(x, y); - let tileRight = KinkyDungeonMapGet(x + 1, y); - let tileLeft = KinkyDungeonMapGet(x - 1, y); - if ( - // These are the tiles that trigger a replacement - KinkyDungeonWallTiles.includes(tileRight) - && KinkyDungeonWallTiles.includes(tileLeft) - ) - return true; - - return false; -} - -let KDChainablePillar = 'bdD'; - - -let KDSprites = { - // @ts-ignore - "5": (x, y, Fog, noReplace) => { - let tile = KinkyDungeonTilesGet(x + "," + y); - if (tile?.Sprite) return tile.Sprite; - return "Floor"; - }, - // @ts-ignore - "1": (x, y, Fog, noReplace) => { - if (KDWallVert(x, y, noReplace)) - return "WallVert"; - return "Wall"; - }, - // @ts-ignore - "2": (x, y, Fog, noReplace) => { - return "Brickwork"; - }, - // @ts-ignore - "3": (x, y, Fog, noReplace) => { - return Fog ? "Doodad" : "MimicBlock"; - }, - // @ts-ignore - "b": (x, y, Fog, noReplace) => { - if (KDWallVertAbove(x, y, noReplace)) - return KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "BarsVertCont" : "BarsVert"; - return "Bars"; - }, - // @ts-ignore - "X": (x, y, Fog, noReplace) => { - return "Doodad"; - }, - // @ts-ignore - "4": (x, y, Fog, noReplace) => { - if (KDWallVert(x, y, noReplace)) - return "WallVert"; - return "Wall"; - }, - // @ts-ignore - "L": (x, y, Fog, noReplace) => { - if (KinkyDungeonTilesGet(x + "," + y)) { - let furn = KinkyDungeonTilesGet(x + "," + y).Furniture ? KDFurniture[KinkyDungeonTilesGet(x + "," + y).Furniture] : ""; - if (furn) { - return furn.floor; - } - } - return "Barrel"; - }, - // @ts-ignore - "F": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "?": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "/": (x, y, Fog, noReplace) => { - return "RubbleLooted"; - }, - // @ts-ignore - ",": (x, y, Fog, noReplace) => { - if (KDWallVert(x, y, noReplace)) - return "WallVert"; - return "Wall"; - }, - // @ts-ignore - "D": (x, y, Fog, noReplace) => { - if (Fog) { - if (KinkyDungeonTilesMemory[x + "," + y]) return KinkyDungeonTilesMemory[x + "," + y]; - } - if (KDWallVertBoth(x, y, noReplace)) - KinkyDungeonTilesMemory[x + "," + y] = KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "DoorVertCont" : "DoorVert"; - else KinkyDungeonTilesMemory[x + "," + y] = "Door"; - return KinkyDungeonTilesMemory[x + "," + y]; - }, - // @ts-ignore - "d": (x, y, Fog, noReplace) => { - if (Fog) { - if (KinkyDungeonTilesMemory[x + "," + y]) return KinkyDungeonTilesMemory[x + "," + y]; - } - if (KDWallVertBoth(x, y, noReplace)) - KinkyDungeonTilesMemory[x + "," + y] = KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "DoorVertOpenCont" : "DoorVertOpen"; - else KinkyDungeonTilesMemory[x + "," + y] = "DoorOpen"; - return KinkyDungeonTilesMemory[x + "," + y]; - }, - // @ts-ignore - "Z": (x, y, Fog, noReplace) => { - if (Fog) { - if (KinkyDungeonTilesMemory[x + "," + y]) return KinkyDungeonTilesMemory[x + "," + y]; - } - if (KDWallVertBoth(x, y, noReplace)) - KinkyDungeonTilesMemory[x + "," + y] = KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "DoorVertCont" : "DoorVert"; - else KinkyDungeonTilesMemory[x + "," + y] = "Door"; - return KinkyDungeonTilesMemory[x + "," + y]; - }, - // @ts-ignore - "z": (x, y, Fog, noReplace) => { - if (Fog) { - if (KinkyDungeonTilesMemory[x + "," + y]) return KinkyDungeonTilesMemory[x + "," + y]; - } - if (KDWallVertBoth(x, y, noReplace)) - KinkyDungeonTilesMemory[x + "," + y] = KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "DoorVertOpenCont" : "DoorVertOpen"; - else KinkyDungeonTilesMemory[x + "," + y] = "DoorOpen"; - return KinkyDungeonTilesMemory[x + "," + y]; - }, - // @ts-ignore - "a": (x, y, Fog, noReplace) => { - return "ShrineBroken"; - }, - // @ts-ignore - "A": (x, y, Fog, noReplace) => { - return (KinkyDungeonTilesGet(x + "," + y) && KinkyDungeonTilesGet(x + "," + y).Type == "Shrine" && KinkyDungeonTilesGet(x + "," + y).Name == "Commerce") ? "ShrineC" : ( - (KinkyDungeonTilesGet(x + "," + y) && KinkyDungeonTilesGet(x + "," + y).drunk) ? "ShrineEmpty" : "Shrine" - ); - }, - // @ts-ignore - "H": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "s": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "S": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "g": (x, y, Fog, noReplace) => { - if (KDWallHorizTunnel(x, y)) - return "GrateHoriz"; - else if (!KDWallVert(x, y)) { - return "Grate"; - } else if (KDWallVertTunnel(x, y)) { - return "GrateVert"; - } - return "Grate"; - }, - // @ts-ignore - "r": (x, y, Fog, noReplace) => { - return "RubbleLooted"; - }, - // @ts-ignore - "T": (x, y, Fog, noReplace) => { - return (KinkyDungeonBlindLevel > 0) ?"Floor" : "Trap"; - }, - // @ts-ignore - "Y": (x, y, Fog, noReplace) => { - return "Doodad"; - }, - // @ts-ignore - "R": (x, y, Fog, noReplace) => { - return "RubbleLooted"; - }, - // @ts-ignore - "m": (x, y, Fog, noReplace) => { - return "Brickwork"; - }, - // @ts-ignore - "M": (x, y, Fog, noReplace) => { - return "Brickwork"; - }, - // @ts-ignore - "O": (x, y, Fog, noReplace) => { - return "OrbEmpty"; - }, - // @ts-ignore - "P": (x, y, Fog, noReplace) => { - return "OrbEmpty"; - }, - // @ts-ignore - "p": (x, y, Fog, noReplace) => { - return "OrbEmpty"; - }, - // @ts-ignore - "o": (x, y, Fog, noReplace) => { - return "OrbEmpty"; - }, - // @ts-ignore - "w": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "]": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "[": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "=": (x, y, Fog, noReplace) => { - return "Brickwork"; - }, - // @ts-ignore - "+": (x, y, Fog, noReplace) => { - return "Brickwork"; - }, - // @ts-ignore - "-": (x, y, Fog, noReplace) => { - return "Brickwork"; - }, - // @ts-ignore - "l": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "V": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "t": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "u": (x, y, Fog, noReplace) => { - return "Floor"; - }, - // @ts-ignore - "N": (x, y, Fog, noReplace) => { - return "Floor"; - }, -}; - -let KDOverlays = { - // @ts-ignore - "5": (x, y, Fog, noReplace) => { - let tile = KinkyDungeonTilesGet(x + "," + y); - if (tile?.Overlay) return tile.Overlay; - return ""; - }, - // @ts-ignore - "Z": (x, y, Fog, noReplace) => { - return "Signal/AutoLock"; - }, - // @ts-ignore - "H": (x, y, Fog, noReplace) => { - return "StairsDown"; - }, - // @ts-ignore - "s": (x, y, Fog, noReplace) => { - return "StairsDown"; - }, - // @ts-ignore - "S": (x, y, Fog, noReplace) => { - return "StairsUp"; - }, - // @ts-ignore - "-": (x, y, Fog, noReplace) => { - return "ChargerSpent"; - }, - // @ts-ignore - "l": (x, y, Fog, noReplace) => { - return "Leyline"; - }, - // @ts-ignore - "+": (x, y, Fog, noReplace) => { - return "Charger"; - }, - // @ts-ignore - "=": (x, y, Fog, noReplace) => { - return "ChargerCrystal"; - }, - // @ts-ignore - "Y": (x, y, Fog, noReplace) => { - return "Rubble"; - }, - // @ts-ignore - "/": (x, y, Fog, noReplace) => { - return "Scrap"; - }, - // @ts-ignore - "R": (x, y, Fog, noReplace) => { - return "Rubble"; - }, - // @ts-ignore - "$": (x, y, Fog, noReplace) => { - return "Angel"; - }, - // @ts-ignore - "m": (x, y, Fog, noReplace) => { - return "TabletSpent"; - }, - // @ts-ignore - "M": (x, y, Fog, noReplace) => { - if (KinkyDungeonTilesGet(x + "," + y) && !Object.keys(KinkyDungeonGoddessRep).includes(KinkyDungeonTilesGet(x + "," + y).Name)) return "Tablet" + KinkyDungeonTilesGet(x + "," + y).Name; - return "Tablet"; - }, - // @ts-ignore - "[": (x, y, Fog, noReplace) => { - return "Spores"; - }, - // @ts-ignore - "]": (x, y, Fog, noReplace) => { - return "HappyGas"; - }, - // @ts-ignore - "w": (x, y, Fog, noReplace) => { - return Fog ? "" : "Water"; - }, - // @ts-ignore - "O": (x, y, Fog, noReplace) => { - return "Orb"; - }, - // @ts-ignore - "P": (x, y, Fog, noReplace) => { - return "Perk"; - }, - // @ts-ignore - ",": (x, y, Fog, noReplace) => { - return "HookLow"; - }, - // @ts-ignore - "?": (x, y, Fog, noReplace) => { - return "HookHigh"; - }, - // @ts-ignore - "B": (x, y, Fog, noReplace) => { - return "Bed"; - }, - // @ts-ignore - "@": (x, y, Fog, noReplace) => { - return "Signal/Button"; - }, - // @ts-ignore - "V": (x, y, Fog, noReplace) => { - let tile = KinkyDungeonTilesGet(x + "," + y); - if (tile) { - let tU = KinkyDungeonTilesGet(x + "," + (y - 1)); - let tD = KinkyDungeonTilesGet(x + "," + (y + 1)); - let tR = KinkyDungeonTilesGet((x + 1) + "," + y); - let tL = KinkyDungeonTilesGet((x - 1) + "," + y); - - let sprite = ""; - - if (tile.DY == -1) { - if (tD?.DY == -1) return "Conveyor/Up"; - if (tL?.DX == 1 && tR?.DX == -1) sprite = sprite + "LeftRight"; - else if (tL?.DX == 1) sprite = sprite + "Right"; - else if (tR?.DX == -1) sprite = sprite + "Left"; - sprite = sprite + "Up"; - } else if (tile.DY == 1) { - if (tU?.DY == 1) return "Conveyor/Down"; - if (tL?.DX == 1 && tR?.DX == -1) sprite = sprite + "LeftRight"; - else if (tL?.DX == 1 && !(tR?.DX == -1)) sprite = sprite + "Right"; - else if (tR?.DX == -1 && !(tL?.DX == 1)) sprite = sprite + "Left"; - sprite = sprite + "Down"; - } else if (tile.DX == 1) { - if (tU?.DY == 1 && tD?.DY == -1) sprite = sprite + "UpDown"; - else if (tU?.DY == 1) sprite = sprite + "Down"; - else if (tD?.DY == -1) sprite = sprite + "Up"; - sprite = sprite + "Right"; - } else if (tile.DX == -1) { - if (tU?.DY == 1 && tD?.DY == -1) sprite = sprite + "UpDown"; - else if (tU?.DY == 1) sprite = sprite + "Down"; - else if (tD?.DY == -1) sprite = sprite + "Up"; - sprite = sprite + "Left"; - } - - - return "Conveyor/" + sprite; - } - return "Conveyor/Conveyor"; - }, - // @ts-ignore - "t": (x, y, Fog, noReplace) => { - return "DollTerminal"; - }, - // @ts-ignore - "u": (x, y, Fog, noReplace) => { - return "DollSupply"; - }, - // @ts-ignore - "N": (x, y, Fog, noReplace) => { - let tile = KinkyDungeonTilesGet(x + ',' + y); - let tileAbove = KinkyDungeonMapGet(x, y - 1); - let tileBelow = KinkyDungeonMapGet(x, y + 1); - if (tileAbove == 'V' && KinkyDungeonTilesGet(x + "," + (y-1))?.DY == 1) { - return `BondageMachine/${tile.Binding || "Latex"}Vert`; - } else if (tileBelow == 'V' && KinkyDungeonTilesGet(x + "," + (y+1))?.DY == -1) { - return `BondageMachine/${tile.Binding || "Latex"}Vert`; - } - - - return `BondageMachine/${tile.Binding || "Latex"}Horiz`; - }, -}; - -let KDOverlays2 = { - // @ts-ignore - "V": (x, y, Fog, noReplace) => { - let tile = KinkyDungeonTilesGet(x + "," + y); - if (tile && tile.SwitchMode != undefined) { - let sprite = ""; - - if (tile.DY == -1) { - sprite = sprite + "Up"; - } else if (tile.DY == 1) { - sprite = sprite + "Down"; - } else if (tile.DX == 1) { - sprite = sprite + "Right"; - } else if (tile.DX == -1) { - sprite = sprite + "Left"; - } - if (tile.SwitchMode) sprite = sprite + tile.SwitchMode; - return "Conveyor/" + sprite; - } - return ""; - }, -}; - -function KinkyDungeonGetSprite(code, x, y, Fog, noReplace) { - let sprite = "Floor"; - if (KDSprites[code]) sprite = KDSprites[code](x, y, Fog, noReplace); - return sprite; -} - -/** For multilayer sprites */ -function KinkyDungeonGetSpriteOverlay2(code, x, y, Fog, noReplace) { - let sprite = ""; - if (KDOverlays2[code]) sprite = KDOverlays2[code](x, y, Fog, noReplace); - if (KinkyDungeonTilesGet(x + "," + y) && KinkyDungeonTilesGet(x + "," + y).Skin2) { - sprite = KinkyDungeonTilesGet(x + "," + y).Skin2; - } - return sprite; -} - -function KinkyDungeonGetSpriteOverlay(code, x, y, Fog, noReplace) { - let sprite = ""; - if (KDOverlays[code]) sprite = KDOverlays[code](x, y, Fog, noReplace); - if (KinkyDungeonTilesGet(x + "," + y) && KinkyDungeonTilesGet(x + "," + y).Skin) { - sprite = KinkyDungeonTilesGet(x + "," + y).Skin; - } - else if (code == "G") { - sprite = "Ghost"; - if (KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Msg || KinkyDungeonTilesGet(x + "," + y).Dialogue)) { - sprite = "GhostImportant"; - } - } - - else if (code == "L") { - if (KinkyDungeonTilesGet(x + "," + y)) { - let furn = KinkyDungeonTilesGet(x + "," + y).Furniture ? KDFurniture[KinkyDungeonTilesGet(x + "," + y).Furniture] : ""; - if (furn) { - return furn.sprite; - } - } - } else if (code == "F") { - sprite = "Table"; - if (KinkyDungeonTilesGet(x + "," + y)) { - let table = "Table"; - if (KinkyDungeonTilesGet(x + "," + y).Food) { - sprite = table + KinkyDungeonTilesGet(x + "," + y).Food; - } - } - } else if (code == "4") { - let left = KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x - 1, y)); - let right = KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 1, y)); - let up = KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x, y - 1)); - let down = KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x, y + 1)); - if (down) { - sprite = "Crack"; - } else if (up) { - sprite = "CrackHoriz"; - } else if (left && right) { - sprite = "CrackVert"; - } else if (left) { - sprite = "CrackLeft"; - } else if (right) { - sprite = "CrackRight"; - } else - sprite = "CrackNone"; - } - else if (code == "C") sprite = (KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "gold" || KinkyDungeonTilesGet(x + "," + y).Loot == "lessergold")) ? "ChestGold" : - ((KinkyDungeonTilesGet(x + "," + y) && (KDSpecialChests[KinkyDungeonTilesGet(x + "," + y).Loot])) ? KDSpecialChests[KinkyDungeonTilesGet(x + "," + y).Loot] : - ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "blue")) ? "ChestBlue" : - ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "dark")) ? "ChestDark" : - ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "pearl" || KinkyDungeonTilesGet(x + "," + y).Loot == "lesserpearl")) ? "ChestPearl" : "Chest")))); - else if (code == "c") sprite = (KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "gold" || KinkyDungeonTilesGet(x + "," + y).Loot == "lessergold")) ? "ChestGoldOpen" : - ((KinkyDungeonTilesGet(x + "," + y) && (KDSpecialChests[KinkyDungeonTilesGet(x + "," + y).Loot])) ? KDSpecialChests[KinkyDungeonTilesGet(x + "," + y).Loot] + "Open" : - ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "blue")) ? "ChestBlueOpen" : - ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "dark")) ? "ChestDarkOpen" : - ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "pearl" || KinkyDungeonTilesGet(x + "," + y).Loot == "lesserpearl")) ? "ChestPearlOpen" : "ChestOpen")))); - return sprite; -} - -let KDSpecialChests = { - "silver" : "ChestSilver", - "shadow" : "ChestShadow", -}; - -/** - * @type {Record} - */ -let KDLastKeyTime = { -}; - - -// Draw function for the game portion -function KinkyDungeonDrawGame() { - - if (KinkyDungeonKeybindingCurrentKey && KinkyDungeonGameKeyDown()) { - if (KinkyDungeonKeybindingCurrentKey) - KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime(); - KinkyDungeonKeybindingCurrentKey = ''; - } - - if (KinkyDungeonDrawState == "Game") - KinkyDungeonListenKeyMove(); - - KDProcessInputs(); - - - if (!KinkyDungeonFlags.get("lastAuto") && KinkyDungeonStatsChoice.get("saveMode")) { - KinkyDungeonSetFlag("lastAuto", Math.floor(50 + KDRandom() * 50)); - KinkyDungeonSaveGame(); - } - - if (KDRefresh) { - CharacterRefresh(KinkyDungeonPlayer); - } - KDNaked = false; - KDRefresh = false; - - if (ServerURL == "foobar") { - MainCanvas.textAlign = "center"; - DrawTextFitKD(TextGet("KinkyDungeon"), 1865, 50, 200, "#ffffff", KDTextGray2); - MainCanvas.textAlign = "center"; - } - - - if ((KinkyDungeonGameKey.keyPressed[9]) && !KinkyDungeonDrawStatesModal.includes(KinkyDungeonDrawState)) { - if (KinkyDungeonDrawState == "Magic") { - KinkyDungeonDrawState = "MagicSpells"; - KinkyDungeonGameKey.keyPressed[9] = false; - } else { - KinkyDungeonDrawState = "Game"; - KinkyDungeonMessageToggle = false; - KinkyDungeonTargetingSpell = null; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - KinkyDungeonSpellPress = ""; - KDModalArea = false; - KDCloseQuickInv(); - KDRepSelectionMode = ""; - KinkyDungeonGameKey.keyPressed[9] = false; - } - } - - KinkyDungeonCapStats(); - - // @ts-ignore - if (ChatRoomChatLog.length > 0) { - // @ts-ignore - let LastChatObject = ChatRoomChatLog[ChatRoomChatLog.length - 1]; - let LastChat = LastChatObject.Garbled; - let LastChatTime = LastChatObject.Time; - let LastChatSender = (LastChatObject.SenderName) ? LastChatObject.SenderName + ": " : ">"; - let LastChatMaxLength = 60; - - if (LastChat) { - LastChat = (LastChatSender + LastChat).substr(0, LastChatMaxLength); - if (LastChat.length == LastChatMaxLength) LastChat = LastChat + "..."; - if (LastChatTime && CommonTime() < LastChatTime + KinkyDungeonLastChatTimeout) - if (!KinkyDungeonSendTextMessage(0, LastChat, "#ffffff", 1) && LastChat != KinkyDungeonActionMessage) - if (!KinkyDungeonSendActionMessage(0, LastChat, "#ffffff", 1) && LastChat != KinkyDungeonTextMessage) - KinkyDungeonSendTextMessage(1, LastChat, "#ffffff", 1); - } - } - - - KinkyDungeonDrawDelta = Math.min(CommonTime() - KinkyDungeonLastDraw, KinkyDungeonLastDraw - KinkyDungeonLastDraw2); - KinkyDungeonLastDraw2 = KinkyDungeonLastDraw; - KinkyDungeonLastDraw = CommonTime(); - - if (!(KinkyDungeonDrawState == "MagicSpells")) { - KDSwapSpell = -1; - } - - // For the lower buttons - let bx = 650 + 15; - let bwidth = 165; - let bspacing = 5; - let bindex = 0; - - if (KinkyDungeonDrawState == "Game") { - let tooltip = ""; - if ((KinkyDungeonIsPlayer() || (KinkyDungeonGameData && CommonTime() < KinkyDungeonNextDataLastTimeReceived + KinkyDungeonNextDataLastTimeReceivedTimeout))) { - - - KinkyDungeonUpdateVisualPosition(KinkyDungeonPlayerEntity, KinkyDungeonDrawDelta); - - let CamX = KinkyDungeonPlayerEntity.x - Math.floor(KinkyDungeonGridWidthDisplay/2);//Math.max(0, Math.min(KinkyDungeonGridWidth - KinkyDungeonGridWidthDisplay, KinkyDungeonPlayerEntity.x - Math.floor(KinkyDungeonGridWidthDisplay/2))); - let CamY = KinkyDungeonPlayerEntity.y - Math.floor(KinkyDungeonGridHeightDisplay/2);// Math.max(0, Math.min(KinkyDungeonGridHeight - KinkyDungeonGridHeightDisplay, KinkyDungeonPlayerEntity.y - Math.floor(KinkyDungeonGridHeightDisplay/2))); - let CamX_offset = KinkyDungeonPlayerEntity.visual_x - Math.floor(KinkyDungeonGridWidthDisplay/2) - CamX;//Math.max(0, Math.min(KinkyDungeonGridWidth - KinkyDungeonGridWidthDisplay, KinkyDungeonPlayerEntity.visual_x - Math.floor(KinkyDungeonGridWidthDisplay/2))) - CamX; - let CamY_offset = KinkyDungeonPlayerEntity.visual_y - Math.floor(KinkyDungeonGridHeightDisplay/2) - CamY;//Math.max(0, Math.min(KinkyDungeonGridHeight - KinkyDungeonGridHeightDisplay, KinkyDungeonPlayerEntity.visual_y - Math.floor(KinkyDungeonGridHeightDisplay/2))) - CamY; - - KinkyDungeonCamX = CamX; - KinkyDungeonCamY = CamY; - let KinkyDungeonForceRender = ""; - - KinkyDungeonSetMoveDirection(); - - if (KinkyDungeonCanvas) { - KinkyDungeonContext.fillStyle = "rgba(0,0,0.0,1.0)"; - KinkyDungeonContext.fillRect(0, 0, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height); - KinkyDungeonContext.fill(); - let spriteRes = KDDrawMap(CamX, CamY, CamX_offset, CamY_offset); - tooltip = spriteRes.tooltip; - KinkyDungeonForceRender = spriteRes.KinkyDungeonForceRender; - - // Get lighting grid - if (KinkyDungeonUpdateLightGrid) { - KDUpdateFog = true; - KDUpdateVision(); - } - - KDDrawEffectTiles(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); - - let aura_scale = 0; - let aura_scale_max = 0; - for (let b of Object.values(KinkyDungeonPlayerBuffs)) { - if (b && b.aura && b.duration > 0) { - aura_scale_max += 1; - } - } - if (aura_scale_max > 0) { - let buffs = Object.values(KinkyDungeonPlayerBuffs); - buffs = buffs.sort((a, b) => {return b.duration - a.duration;}); - for (let b of buffs) { - if (b && b.aura && b.duration > 0) { - aura_scale += 1/aura_scale_max; - let s = aura_scale; - if (b.noAuraColor) { - KDDraw(kdgameboard, kdpixisprites, b.id, KinkyDungeonRootDirectory + "Aura/" + (b.aurasprite ? b.aurasprite : "Aura") + ".png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s, - KinkyDungeonSpriteSize * (1 + s), KinkyDungeonSpriteSize * (1 + s), undefined, { - zIndex: 2.1, - }); - } else { - KDDraw(kdgameboard, kdpixisprites, b.id, KinkyDungeonRootDirectory + "Aura/" + (b.aurasprite ? b.aurasprite : "Aura") + ".png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s, - KinkyDungeonSpriteSize * (1 + s), KinkyDungeonSpriteSize * (1 + s), undefined, { - tint: string2hex(b.aura), - zIndex: 2.1, - }); - } - - } - } - } - - - KinkyDungeonDrawItems(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); - - if (!kdpixitex.get("playertex")) { - kdpixitex.set("playertex", PIXI.Texture.from(KinkyDungeonCanvasPlayer)); - } - let playertex = kdpixitex.get("playertex"); - if (playertex) { - KDDraw(kdgameboard, kdpixisprites, "player", "playertex", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 0.01, - }); - } - if ((KinkyDungeonMovePoints < 0 || KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowLevel") > 0) && KinkyDungeonSlowLevel < 10) { - KDDraw(kdgameboard, kdpixisprites, "c_slow", KinkyDungeonRootDirectory + "Conditions/Slow.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - if (KinkyDungeonStatBlind > 0) { - KDDraw(kdgameboard, kdpixisprites, "c_stun", KinkyDungeonRootDirectory + "Conditions/Stun.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - if (KinkyDungeonStatFreeze > 0) { - KDDraw(kdgameboard, kdpixisprites, "c_freeze", KinkyDungeonRootDirectory + "Conditions/Freeze.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - if (KinkyDungeonStatBind > 0) { - KDDraw(kdgameboard, kdpixisprites, "c_bind", KinkyDungeonRootDirectory + "Conditions/Bind.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak") > 0 || KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowDetection") > 0) { - KDDraw(kdgameboard, kdpixisprites, "c_sneak", KinkyDungeonRootDirectory + "Conditions/Sneak.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay - 30, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackDmg") > 0 || KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackAcc") > 0) { - KDDraw(kdgameboard, kdpixisprites, "c_buff", KinkyDungeonRootDirectory + "Conditions/Buff.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackDmg") < 0 || KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackAcc") < 0) { - KDDraw(kdgameboard, kdpixisprites, "c_dbuff", KinkyDungeonRootDirectory + "Conditions/Debuff.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Armor") > 0) { - KDDraw(kdgameboard, kdpixisprites, "c_arm", KinkyDungeonRootDirectory + "Conditions/ArmorBuff.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } else if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Armor") < 0) { - KDDraw(kdgameboard, kdpixisprites, "c_armd", KinkyDungeonRootDirectory + "Conditions/ArmorDebuff.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Evasion") > 0) { - KDDraw(kdgameboard, kdpixisprites, "c_eva", KinkyDungeonRootDirectory + "Conditions/EvasionBuff.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellResist") > 0) { - KDDraw(kdgameboard, kdpixisprites, "c_shield", KinkyDungeonRootDirectory + "Conditions/ShieldBuff.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - else if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellResist") < 0) { - KDDraw(kdgameboard, kdpixisprites, "c_shield", KinkyDungeonRootDirectory + "Conditions/ShieldDeuff.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "DamageAmp") > 0) { - KDDraw(kdgameboard, kdpixisprites, "c_amp", KinkyDungeonRootDirectory + "Conditions/DamageAmp.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - if (!KDCanAttack()) { - KDDraw(kdgameboard, kdpixisprites, "c_cantAttack", KinkyDungeonRootDirectory + "Conditions/Tired.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay * 0.5, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - - KinkyDungeonDrawFight(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); - KinkyDungeonDrawEnemiesWarning(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); - KinkyDungeonDrawEnemies(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); - KinkyDungeonDrawEnemiesStatus(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); - - // Draw fog of war - let CamPos = {x: CamX, y: CamY}; - if (CamPos.x != KDLastCamPos.x || CamPos.y != KDLastCamPos.y) KDUpdateFog = true; - KDLastCamPos = CamPos; - - if (KDUpdateFog) - KDDrawFog(CamX, CamY, CamX_offset, CamY_offset); - - KinkyDungeonSendEvent("draw",{update: KDDrawUpdate, CamX:CamX, CamY:CamY, CamX_offset: CamX_offset, CamY_offset: CamY_offset}); - KDDrawUpdate = 0; - KinkyDungeonSuppressSprint = false; - - - // Draw targeting reticule - if (!KinkyDungeonMessageToggle && !KDIsAutoAction() && !KinkyDungeonShowInventory - && MouseIn(canvasOffsetX, canvasOffsetY, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height) && KinkyDungeonIsPlayer() - && !MouseIn(0, 0, 500, 1000) && !MouseIn(1750, 0, 250, 1000) - && (!KDModalArea || !MouseIn(KDModalArea_x, KDModalArea_y, KDModalArea_width, KDModalArea_height)) - ) { - if (KinkyDungeonTargetingSpell) { - KinkyDungeonSetTargetLocation(); - - KDDraw(kdgameboard, kdpixisprites, "ui_spellreticule", KinkyDungeonRootDirectory + "TargetSpell.png", - (KinkyDungeonTargetX - CamX)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 100, - }); - - let spellRange = KinkyDungeonTargetingSpell.range * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "spellRange")); - let free = KinkyDungeonOpenObjects.includes(KinkyDungeonMapGet(KinkyDungeonTargetX, KinkyDungeonTargetY)) || KinkyDungeonVisionGet(KinkyDungeonTargetX, KinkyDungeonTargetY) < 0.1; - KinkyDungeonSpellValid = (KinkyDungeonTargetingSpell.projectileTargeting || spellRange >= Math.sqrt((KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x) *(KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x) + (KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y) * (KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y))) && - (KinkyDungeonTargetingSpell.projectileTargeting || KinkyDungeonTargetingSpell.CastInWalls || free) && - (!KinkyDungeonTargetingSpell.WallsOnly || !KinkyDungeonOpenObjects.includes(KinkyDungeonMapGet(KinkyDungeonTargetX, KinkyDungeonTargetY))); - if (KinkyDungeonTargetingSpell.noTargetEnemies) { - let enemy = KinkyDungeonEnemyAt(KinkyDungeonTargetX, KinkyDungeonTargetY); - let faction = KDGetFaction(enemy); - if (enemy && (!KinkyDungeonTargetingSpell.exceptionFactions || !KinkyDungeonTargetingSpell.exceptionFactions.includes(faction))) - KinkyDungeonSpellValid = false; - } - if (KinkyDungeonTargetingSpell.noTargetAllies) { - let enemy = KinkyDungeonEnemyAt(KinkyDungeonTargetX, KinkyDungeonTargetY); - if (enemy && KDAllied(enemy)) - KinkyDungeonSpellValid = false; - } - if (KinkyDungeonTargetingSpell.selfTargetOnly && (KinkyDungeonPlayerEntity.x != KinkyDungeonTargetX || KinkyDungeonPlayerEntity.y != KinkyDungeonTargetY)) KinkyDungeonSpellValid = false; - if (KinkyDungeonTargetingSpell.requireLOS && - !KinkyDungeonCheckPath(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonTargetX, KinkyDungeonTargetY, - true, true, 1, true)) KinkyDungeonSpellValid = false; - if (KinkyDungeonTargetingSpell.noTargetPlayer && KinkyDungeonPlayerEntity.x == KinkyDungeonTargetX && KinkyDungeonPlayerEntity.y == KinkyDungeonTargetY) KinkyDungeonSpellValid = false; - if (KinkyDungeonTargetingSpell.mustTarget && KinkyDungeonNoEnemy(KinkyDungeonTargetX, KinkyDungeonTargetY, true)) KinkyDungeonSpellValid = false; - if (KinkyDungeonTargetingSpell.minRange && KDistEuclidean(KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x, KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y) < KinkyDungeonTargetingSpell.minRange) KinkyDungeonSpellValid = false; - - if (KinkyDungeonSpellValid) - if (KinkyDungeonTargetingSpell.projectileTargeting) { - let range = KinkyDungeonTargetingSpell.castRange; - if (!range || spellRange > range) range = spellRange; - let dist = Math.sqrt((KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x)*(KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x) - + (KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y)*(KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y)); - for (let R = 0; R <= Math.max(1, range - 1); R+= 0.1) { - let xx = KinkyDungeonMoveDirection.x + Math.round((KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x) * R / dist); - let yy = KinkyDungeonMoveDirection.y + Math.round((KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y) * R / dist); - if (KinkyDungeonVisionGet(xx + KinkyDungeonPlayerEntity.x, yy + KinkyDungeonPlayerEntity.y) > 0 && !KinkyDungeonForceRender) - KDDraw(kdgameboard, kdpixisprites, xx + "," + yy + "_target", KinkyDungeonRootDirectory + "Target.png", - (xx + KinkyDungeonPlayerEntity.x - CamX)*KinkyDungeonGridSizeDisplay, (yy + KinkyDungeonPlayerEntity.y - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 99, - }); - } - } - else if (!KinkyDungeonForceRender) { - let rad = KinkyDungeonTargetingSpell.aoe ? KinkyDungeonTargetingSpell.aoe : 0.5; - for (let xxx = KinkyDungeonTargetX - Math.ceil(rad); xxx <= KinkyDungeonTargetX + Math.ceil(rad); xxx++) - for (let yyy = KinkyDungeonTargetY - Math.ceil(rad); yyy <= KinkyDungeonTargetY + Math.ceil(rad); yyy++) - if ( - AOECondition(KinkyDungeonTargetX, KinkyDungeonTargetY, xxx, yyy, rad, KinkyDungeonTargetingSpell.aoetype || "") - ) - KDDraw(kdgameboard, kdpixisprites, xxx + "," + yyy + "_target", KinkyDungeonRootDirectory + "Target.png", - (xxx - CamX)*KinkyDungeonGridSizeDisplay, (yyy - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 99, - }); - } - - } else if (KinkyDungeonFastMove && !(!KinkyDungeonSuppressSprint && KinkyDungeonToggleAutoSprint && KDCanSprint()) && (KinkyDungeonMoveDirection.x != 0 || KinkyDungeonMoveDirection.y != 0)) { - KinkyDungeonSetTargetLocation(); - - - let allowFog = KDAllowFog(); - if (KinkyDungeonVisionGet(KinkyDungeonTargetX, KinkyDungeonTargetY) > 0 || (allowFog && KinkyDungeonFogGet(KinkyDungeonTargetX, KinkyDungeonTargetY) > 0)) { - KDDraw(kdgameboard, kdpixisprites, "ui_movereticule", KinkyDungeonRootDirectory + "TargetMove.png", - (KinkyDungeonTargetX - CamX)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 100, - }); - if (KinkyDungeonSlowLevel > 1 && KinkyDungeonSlowLevel < 10) { - if (!KinkyDungeonEnemyAt(KinkyDungeonTargetX, KinkyDungeonTargetY) || KDCanPassEnemy(KinkyDungeonPlayerEntity, KinkyDungeonEnemyAt(KinkyDungeonTargetX, KinkyDungeonTargetY))) { - let dist = Math.round(KinkyDungeonSlowLevel); - let path = KinkyDungeonFindPath(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonTargetX, KinkyDungeonTargetY, false, false, true, KinkyDungeonMovableTilesSmartEnemy, false, false, false); - if (path?.length > 1) { - dist *= path.length; - } - DrawTextKD("x" + dist, (KinkyDungeonTargetX - CamX + 0.5)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - CamY + 0.5)*KinkyDungeonGridSizeDisplay, "#ffaa44"); - } - } - } - } else if ((KinkyDungeonMoveDirection.x != 0 || KinkyDungeonMoveDirection.y != 0)) { - let xx = KinkyDungeonMoveDirection.x + KinkyDungeonPlayerEntity.x; - let yy = KinkyDungeonMoveDirection.y + KinkyDungeonPlayerEntity.y; - if (KinkyDungeonSlowLevel < 2 && MouseIn(canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay)) { - KinkyDungeonSuppressSprint = true; - } - if (!KinkyDungeonSuppressSprint && KinkyDungeonToggleAutoSprint && (KDCanSprint())) { - if (KinkyDungeonMoveDirection.x || KinkyDungeonMoveDirection.y) { - let newX = KinkyDungeonMoveDirection.x * (KinkyDungeonSlowLevel < 2 ? 2 : 1) + KinkyDungeonPlayerEntity.x; - let newY = KinkyDungeonMoveDirection.y * (KinkyDungeonSlowLevel < 2 ? 2 : 1) + KinkyDungeonPlayerEntity.y; - let tile = KinkyDungeonMapGet(newX, newY); - if (KinkyDungeonMovableTilesEnemy.includes(tile) && KinkyDungeonNoEnemy(newX, newY)) { - KDDraw(kdgameboard, kdpixisprites, "ui_movesprint", KinkyDungeonRootDirectory + "Sprint.png", - (newX - CamX)*KinkyDungeonGridSizeDisplay, (newY - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 99, - }); - xx = newX; - yy = newY; - } - } - } - KDDraw(kdgameboard, kdpixisprites, "ui_movereticule", KinkyDungeonRootDirectory + "TargetMove.png", - (xx - CamX)*KinkyDungeonGridSizeDisplay, (yy - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 100, - }); - if (KinkyDungeonSlowLevel > 1 && KinkyDungeonSlowLevel < 10) { - if (!KinkyDungeonEnemyAt(xx, yy) || KDCanPassEnemy(KinkyDungeonPlayerEntity, KinkyDungeonEnemyAt(xx, yy))) { - let dist = Math.round(KinkyDungeonSlowLevel); - - DrawTextKD("x" + dist, (xx - CamX + 0.5)*KinkyDungeonGridSizeDisplay, (yy - CamY + 0.5)*KinkyDungeonGridSizeDisplay, "#ffaa44"); - } - } - } - } - - - let cursorX = Math.round((MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamX; - let cursorY = Math.round((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamY; - let tooltips = []; - if (KinkyDungeonVisionGet(cursorX, cursorY) > 0) { - let ambushTile = ""; - let enemy = KinkyDungeonEnemyAt(cursorX, cursorY); - if (enemy && KDCanSeeEnemy(KinkyDungeonEnemyAt(cursorX, cursorY))) { - if (!enemy.ambushtrigger && KDAIType[KDGetAI(KinkyDungeonEnemyAt(cursorX, cursorY))]?.ambushtile) { - ambushTile = KDAIType[KDGetAI(enemy)].ambushtile; - } else { - tooltips.push((offset) => KDDrawEnemyTooltip(enemy, offset)); - } - - - } - let eTiles = KDGetEffectTiles(cursorX, cursorY); - for (let etile of Object.values(eTiles)) { - if (KDEffectTileTooltips[etile.name] && KDCanSeeEffectTile(etile)) { - tooltips.push((offset) => KDDrawEffectTileTooltip(etile, cursorX, cursorY, offset)); - } - } - let tile = ambushTile || KinkyDungeonMapGet(cursorX, cursorY); - if (KDTileTooltips[tile] && (KinkyDungeonInspect || KDTileTooltips[tile]().noInspect)) { - tooltips.push((offset) => KDDrawTileTooltip(tile, cursorX, cursorY, offset)); - } - } - - let tooltipOffset = 0; - for (let t of tooltips) { - tooltipOffset = t(tooltipOffset); - } - - if (KinkyDungeonFastMoveSuppress) { - DrawRectKD(kdcanvas, kdpixisprites, "redborder", { - Left: canvasOffsetX, - Top: canvasOffsetY, - Width: KinkyDungeonCanvas.width, - Height: KinkyDungeonCanvas.height, - Color: "#ff4444", - LineWidth: 2, - zIndex: 10, - }); - /*KinkyDungeonContext.beginPath(); - KinkyDungeonContext.rect(0, 0, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height); - KinkyDungeonContext.lineWidth = 4; - KinkyDungeonContext.strokeStyle = "#ff4444"; - KinkyDungeonContext.stroke();*/ - } - - if (KinkyDungeonLastTurnAction == "Struggle" && KinkyDungeonCurrentEscapingItem && KinkyDungeonCurrentEscapingItem.lock) { - KDDraw(kdgameboard, kdpixisprites, "ui_lock", KinkyDungeonRootDirectory + "Lock.png", - (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offset)*KinkyDungeonGridSizeDisplay, - (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offset)*KinkyDungeonGridSizeDisplay - 60, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - - // Cull the sprites that werent rendered or updated this frame - for (let sprite of kdpixisprites.entries()) { - if (!kdSpritesDrawn.has(sprite[0]) && sprite[1] && sprite[1].parent == kdgameboard) { - sprite[1].parent.removeChild(sprite[1]); - if (kdprimitiveparams.has(sprite[0])) kdprimitiveparams.delete(sprite[0]); - kdpixisprites.delete(sprite[0]); - sprite[1].destroy(); - } - } - - // Draw the context layer even if we haven't updated it - if (pixirendererKD) { - pixirendererKD.render(kdgameboard, { - clear: false, - }); - } - - // Draw the context layer even if we haven't updated it - if (pixirendererKD) { - pixirendererKD.render(kdgamefog, { - clear: false, - }); - } - - // Draw the context layer even if we haven't updated it - if (pixirendererKD) { - pixirendererKD.render(kdparticles, { - clear: false, - }); - } - if (!pixirendererKD) { - if (KinkyDungeonContext && KinkyDungeonCanvas) { - // @ts-ignore - pixirendererKD = new PIXI.CanvasRenderer({ - // @ts-ignore - width: KinkyDungeonCanvas.width, - // @ts-ignore - height: KinkyDungeonCanvas.height, - view: KinkyDungeonCanvas, - antialias: true, - }); - } - } - MainCanvas.drawImage(KinkyDungeonCanvas, canvasOffsetX, canvasOffsetY); - - } - - /*if (KDGameData && KDGameData.AncientEnergyLevel) { - let h = 1000 * KDGameData.AncientEnergyLevel; - const Grad = MainCanvas.createLinearGradient(0, 1000-h, 0, 1000); - Grad.addColorStop(0, `rgba(255,255,0,0)`); - Grad.addColorStop(0.5, `rgba(255,255,128,0.5)`); - Grad.addColorStop(0.75, `rgba(255,255,255,1.0)`); - Grad.addColorStop(1.0, `rgba(255,255,255,0.25)`); - MainCanvas.fillStyle = Grad; - MainCanvas.fillRect(0, 1000-h, 500, h); - }*/ - - DrawCharacter(KinkyDungeonPlayer, 0, 0, 1); - - - DrawTextFitKD( - TextGet("CurrentLevel").replace("FLOORNUMBER", "" + MiniGameKinkyDungeonLevel).replace("DUNGEONNAME", TextGet("DungeonName" + KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint])) - + (KinkyDungeonNewGame ? TextGet("KDNGPlus").replace("XXX", "" + KinkyDungeonNewGame) : ""), - KDMsgX + KDMsgWidth/2, 42, 1000, "#ffffff", "#333333"); - //DrawTextKD(TextGet("DungeonName" + KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]), 1500, 42, "#ffffff", KDTextGray2); - - // Draw the stats - KinkyDungeonDrawStats(1750, 164, 230, KinkyDungeonStatBarHeight); - - if (KinkyDungeonSleepiness) { - CharacterSetFacialExpression(KinkyDungeonPlayer, "Emoticon", "Sleep"); - } else CharacterSetFacialExpression(KinkyDungeonPlayer, "Emoticon", null); - - // Draw the player no matter what - KinkyDungeonContextPlayer.clearRect(0, 0, KinkyDungeonCanvasPlayer.width, KinkyDungeonCanvasPlayer.height); - DrawCharacter(KinkyDungeonPlayer, -KinkyDungeonGridSizeDisplay/2, KinkyDungeonPlayer.Pose.includes("Hogtied") ? -165 : (KinkyDungeonPlayer.IsKneeling() ? -78 : 0), KinkyDungeonGridSizeDisplay/250, false, KinkyDungeonContextPlayer); - - KinkyDungeonDrawEnemiesHP(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); - KinkyDungeonDrawFloaters(CamX+CamX_offset, CamY+CamY_offset); - - if (KinkyDungeonCanvas) { - let barInt = 0; - if (KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax*0.9) { - KinkyDungeonBar(canvasOffsetX + (KinkyDungeonPlayerEntity.visual_x - CamX-CamX_offset)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (KinkyDungeonPlayerEntity.visual_y - CamY-CamY_offset)*KinkyDungeonGridSizeDisplay - 12 - 13 * barInt, - KinkyDungeonGridSizeDisplay, 8, 100 * KinkyDungeonStatStamina / KinkyDungeonStatStaminaMax, !KDCanAttack() ? "#ff5555" : "#44ff44", KDTextGray0); - barInt += 1; - } - /*for (let b of Object.values(KinkyDungeonPlayerBuffs)) { - if (b && b.aura && b.duration > 0 && b.duration < 999) { - if (!b.maxduration) b.maxduration = b.duration; - KinkyDungeonBar(canvasOffsetX + (KinkyDungeonPlayerEntity.visual_x - CamX-CamX_offset)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (KinkyDungeonPlayerEntity.visual_y - CamY-CamY_offset)*KinkyDungeonGridSizeDisplay - 12 - 13 * barInt, - KinkyDungeonGridSizeDisplay, 12, 100 * b.duration / b.maxduration, b.aura, KDTextGray0); - barInt += 1; - } - }*/ - if (KinkyDungeonCurrentEscapingItem && KinkyDungeonFlags.get("escaping")) { - let item = KinkyDungeonCurrentEscapingItem; - let value = 0; - let value2 = 0; - let color = "#ecebe7"; - let color2 = "#ff0000"; - if (KinkyDungeonCurrentEscapingMethod == "Struggle") { - if (item.struggleProgress) - value = item.struggleProgress; - if (item.cutProgress) - value2 = item.cutProgress; - } else if (KinkyDungeonCurrentEscapingMethod == "Pick" && item.pickProgress) { - value = item.pickProgress; - color = "#ceaaed"; - } else if (KinkyDungeonCurrentEscapingMethod == "Remove") { - if (item.struggleProgress) - value = item.struggleProgress; - if (item.cutProgress) - value2 = item.cutProgress; - } else if (KinkyDungeonCurrentEscapingMethod == "Cut") { - if (item.struggleProgress) - value = item.struggleProgress; - if (item.cutProgress) - value2 = item.cutProgress; - } else if (KinkyDungeonCurrentEscapingMethod == "Unlock" && item.unlockProgress) { - value = item.unlockProgress; - color = "#d0ffea"; - } - let xAdd = 0; - let yAdd = 0; - if (KinkyDungeonStruggleTime > CommonTime()) { - xAdd = Math.round(-1 + 2*Math.random()); - yAdd = Math.round(-1 + 2*Math.random()); - } - if (value <= 1) - KinkyDungeonBar(canvasOffsetX + xAdd + (KinkyDungeonPlayerEntity.visual_x - CamX-CamX_offset)*KinkyDungeonGridSizeDisplay, canvasOffsetY + yAdd + (KinkyDungeonPlayerEntity.visual_y - CamY-CamY_offset)*KinkyDungeonGridSizeDisplay - 24, - KinkyDungeonGridSizeDisplay, 12, Math.max(7, Math.min(100, 100 * (value + value2))), color, KDTextGray0); - if (value2 && value <= 1) { - KinkyDungeonBar(canvasOffsetX + xAdd + (KinkyDungeonPlayerEntity.visual_x - CamX-CamX_offset)*KinkyDungeonGridSizeDisplay, canvasOffsetY + yAdd + (KinkyDungeonPlayerEntity.visual_y - CamY-CamY_offset)*KinkyDungeonGridSizeDisplay - 24, - KinkyDungeonGridSizeDisplay, 12, Math.max(7, 100 * value2), color2, "none"); - } - } - - KinkyDungeonDrawTether(KinkyDungeonPlayerEntity, CamX+CamX_offset, CamY+CamY_offset); - - if (tooltip) { - DrawTextFitKD(tooltip, MouseX, MouseY - KinkyDungeonGridSizeDisplay/2, 200, "#ffffff", KDTextGray2); - } - } - - if (KinkyDungeonPlayerEntity.dialogue) { - let yboost = 0;//-1*KinkyDungeonGridSizeDisplay/7; - DrawTextFitKD(KinkyDungeonPlayerEntity.dialogue, canvasOffsetX + (KinkyDungeonPlayerEntity.visual_x - CamX-CamX_offset)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (KinkyDungeonPlayerEntity.visual_y - CamY-CamY_offset)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/1.5, 10 + KinkyDungeonPlayerEntity.dialogue.length * 8, KinkyDungeonPlayerEntity.dialogueColor, KDTextGray0); - } - - - KDModalArea_x = 600; - KDModalArea_y = 700; - KDModalArea_width = 800; - KDModalArea_height = 100; - - if (KinkyDungeonIsPlayer()) { - KinkyDungeonDrawInputs(); - } - - if (KDGameData.CurrentDialog) { - KDDrawDialogue(); - } - - KinkyDungeonDrawMessages(); - - // Draw the quick inventory - if (KDShowQuickInv()) { - KinkyDungeonDrawQuickInv(); - } - } else { - DrawTextKD(TextGet("KinkyDungeonLoading"), 1100, 500, "#ffffff", KDTextGray2); - if (CommonTime() > KinkyDungeonGameDataNullTimerTime + KinkyDungeonGameDataNullTimer) { - ServerSend("ChatRoomChat", { Content: "RequestFullKinkyDungeonData", Type: "Hidden", Target: KinkyDungeonPlayerCharacter.MemberNumber }); - KinkyDungeonGameDataNullTimerTime = CommonTime(); - } - } - } else if (KinkyDungeonDrawState == "Orb") { - KinkyDungeonDrawOrb(); - } else if (KinkyDungeonDrawState == "PerkOrb") { - KinkyDungeonDrawPerkOrb(); - } else if (KinkyDungeonDrawState == "Heart") { - KinkyDungeonDrawHeart(); - } else if (KinkyDungeonDrawState == "Magic") { - // @ts-ignore - DrawButtonKDEx("goInv", (bdata) => { - KinkyDungeonDrawState = "Inventory"; - return true; - }, true, bx + bindex * (bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonInventory"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_inventory.png", undefined, undefined, false, "", 24, true); bindex++; - // @ts-ignore - DrawButtonKDEx("goRep", (bdata) => { - KinkyDungeonDrawState = "Reputation"; - return true; - }, true, bx + bindex * (bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonReputation"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_reputation.png", undefined, undefined, false, "", 24, true); bindex++; - // @ts-ignore - DrawButtonKDEx("goSpells", (bdata) => { - KinkyDungeonDrawState = "MagicSpells"; - return true; - }, true, bx + bindex * (bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonMagic"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_spells.png", undefined, undefined, false, "", 24, true); bindex++; - - let logtxt = KinkyDungeonNewLoreList.length > 0 ? TextGet("KinkyDungeonLogbookN").replace("N", KinkyDungeonNewLoreList.length): TextGet("KinkyDungeonLogbook"); - // @ts-ignore - DrawButtonKDEx("goLog", (bdata) => { - KinkyDungeonDrawState = "Logbook"; - KinkyDungeonUpdateLore(localStorage.getItem("kinkydungeonexploredlore") ? JSON.parse(localStorage.getItem("kinkydungeonexploredlore")) : []); - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, logtxt, "#ffffff", KinkyDungeonRootDirectory + "UI/button_logbook.png", undefined, undefined, false, "", 24, true); bindex++; - // @ts-ignore - DrawButtonKDEx("return", (bdata) => {KinkyDungeonDrawState = "Game"; return true;}, true, KDReturnButtonXX, 925, bwidth, 60, TextGet("KinkyDungeonGame"), "#ffffff", "", ""); - - KinkyDungeonDrawMagic(); - - } else if (KinkyDungeonDrawState == "MagicSpells") { - // @ts-ignore - DrawButtonKDEx("goInv", (bdata) => { - KinkyDungeonDrawState = "Inventory"; - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonInventory"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_inventory.png", undefined, undefined, false, "", 24, true); bindex++; - // @ts-ignore - DrawButtonKDEx("goRep", (bdata) => { - KinkyDungeonDrawState = "Reputation"; - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonReputation"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_reputation.png", undefined, undefined, false, "", 24, true); bindex++; - // @ts-ignore - DrawButtonKDEx("return", (bdata) => {KinkyDungeonDrawState = "Game"; return true;}, true, KDReturnButtonXX, 925, bwidth, 60, TextGet("KinkyDungeonGame"), "#ffffff", "", ""); bindex++; - - let logtxt = KinkyDungeonNewLoreList.length > 0 ? TextGet("KinkyDungeonLogbookN").replace("N", KinkyDungeonNewLoreList.length): TextGet("KinkyDungeonLogbook"); - // @ts-ignore - DrawButtonKDEx("goLog", (bdata) => { - KinkyDungeonDrawState = "Logbook"; - KinkyDungeonUpdateLore(localStorage.getItem("kinkydungeonexploredlore") ? JSON.parse(localStorage.getItem("kinkydungeonexploredlore")) : []); - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, logtxt, "#ffffff", KinkyDungeonRootDirectory + "UI/button_logbook.png", undefined, undefined, false, "", 24, true); bindex++; - KinkyDungeonDrawMagicSpells(); - } else if (KinkyDungeonDrawState == "Inventory") { - // @ts-ignore - DrawButtonKDEx("return", (bdata) => {KinkyDungeonDrawState = "Game"; return true;}, true, KDReturnButtonXX, 925, bwidth, 60, TextGet("KinkyDungeonGame"), "#ffffff", "", ""); bindex++; - // @ts-ignore - DrawButtonKDEx("goRep", (bdata) => { - KinkyDungeonDrawState = "Reputation"; - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonReputation"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_reputation.png", undefined, undefined, false, "", 24, true); bindex++; - // @ts-ignore - DrawButtonKDEx("goSpells", (bdata) => { - KinkyDungeonDrawState = "MagicSpells"; - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonMagic"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_spells.png", undefined, undefined, false, "", 24, true); bindex++; - - let logtxt = KinkyDungeonNewLoreList.length > 0 ? TextGet("KinkyDungeonLogbookN").replace("N", KinkyDungeonNewLoreList.length): TextGet("KinkyDungeonLogbook"); - // @ts-ignore - DrawButtonKDEx("goLog", (bdata) => { - KinkyDungeonDrawState = "Logbook"; - KinkyDungeonUpdateLore(localStorage.getItem("kinkydungeonexploredlore") ? JSON.parse(localStorage.getItem("kinkydungeonexploredlore")) : []); - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, logtxt, "#ffffff", KinkyDungeonRootDirectory + "UI/button_logbook.png", undefined, undefined, false, "", 24, true); bindex++; - - - KinkyDungeonDrawInventory(); - } else if (KinkyDungeonDrawState == "Logbook") { - // @ts-ignore - DrawButtonKDEx("goInv", (bdata) => { - KinkyDungeonDrawState = "Inventory"; - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonInventory"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_inventory.png", undefined, undefined, false, "", 24, true); bindex++; - // @ts-ignore - DrawButtonKDEx("goRep", (bdata) => { - KinkyDungeonDrawState = "Reputation"; - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonReputation"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_reputation.png", undefined, undefined, false, "", 24, true); bindex++; - // @ts-ignore - DrawButtonKDEx("goSpells", (bdata) => { - KinkyDungeonDrawState = "MagicSpells"; - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonMagic"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_spells.png", undefined, undefined, false, "", 24, true); bindex++; - // @ts-ignore - DrawButtonKDEx("return", (bdata) => {KinkyDungeonDrawState = "Game"; return true;}, true, KDReturnButtonXX, 925, bwidth, 60, TextGet("KinkyDungeonGame"), "#ffffff", "", ""); bindex++; - - - - KinkyDungeonDrawLore(); - } else if (KinkyDungeonDrawState == "Reputation") { - // @ts-ignore - DrawButtonKDEx("goInv", (bdata) => { - KinkyDungeonDrawState = "Inventory"; - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonInventory"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_inventory.png", undefined, undefined, false, "", 24, true); bindex++; - // @ts-ignore - DrawButtonKDEx("return", (bdata) => {KinkyDungeonDrawState = "Game"; return true;}, true, KDReturnButtonXX, 925, 165, 60, TextGet("KinkyDungeonGame"), "#ffffff", "", ""); bindex++; - // @ts-ignore - DrawButtonKDEx("goSpells", (bdata) => { - KinkyDungeonDrawState = "MagicSpells"; - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonMagic"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_spells.png", undefined, undefined, false, "", 24, true); bindex++; - let logtxt = KinkyDungeonNewLoreList.length > 0 ? TextGet("KinkyDungeonLogbookN").replace("N", KinkyDungeonNewLoreList.length): TextGet("KinkyDungeonLogbook"); - // @ts-ignore - DrawButtonKDEx("goLog", (bdata) => { - KinkyDungeonDrawState = "Logbook"; - KinkyDungeonUpdateLore(localStorage.getItem("kinkydungeonexploredlore") ? JSON.parse(localStorage.getItem("kinkydungeonexploredlore")) : []); - return true; - }, true, bx + bindex *(bwidth + bspacing), 925, bwidth, 60, logtxt, "#ffffff", KinkyDungeonRootDirectory + "UI/button_logbook.png", undefined, undefined, false, "", 24, true); bindex++; - - KinkyDungeonDrawReputation(); - } else if (KinkyDungeonDrawState == "Lore") { - // @ts-ignore - DrawButtonKDEx("return", (bdata) => {KinkyDungeonDrawState = "Game"; return true;}, true, KDReturnButtonXX, 925, 250, 60, TextGet("KinkyDungeonGame"), "#ffffff", "", ""); - KinkyDungeonDrawLore(); - } else if (KinkyDungeonDrawState == "Restart") { - MainCanvas.textAlign = "left"; - if (TestMode) { - DrawCheckboxVis(600, 20, 64, 64, "Debug Mode", KDDebugMode, false, "#ffffff"); - if (KDDebugMode) { - let dd = 30; - let i = 0; - for (let r of KinkyDungeonRestraints) { - if (i * dd < 1200 && r.name.includes(ElementValue("DebugItem"))) { - DrawTextFitKD(r.name, 0, 15 + i * dd, 200, "#ffffff", KDTextGray0); - i++; - } - } - i = 0; - for (let r of Object.values(KinkyDungeonConsumables)) { - if (i * dd < 1200 && r.name.includes(ElementValue("DebugItem"))) { - DrawTextFitKD(r.name, 200, 15 + i * dd, 200, "lightblue", KDTextGray0); - i++; - } - } - i = 0; - for (let r of KinkyDungeonEnemies) { - if (i * dd < 1200 && r.name.includes(ElementValue("DebugEnemy"))) { - DrawTextFitKD(r.name, 400, 15 + i * dd, 200, "#ff0000", KDTextGray0); - i++; - } - } - i = 0; - for (let r of Object.values(KinkyDungeonWeapons)) { - if (i * dd < 1200 && r.name.includes(ElementValue("DebugItem"))) { - DrawTextFitKD(r.name, 1800, 15 + i * dd, 200, "orange", KDTextGray0); - i++; - } - } - i = 0; - for (let r of KinkyDungeonOutfitsBase) { - if (i * dd < 1200 && r.name.includes(ElementValue("DebugItem"))) { - DrawTextFitKD(r.name, 900, 15 + i * dd, 200, "lightgreen", KDTextGray0); - i++; - } - } - - DrawCheckboxVis(1100, 20, 64, 64, "Verbose Console", KDDebug, false, "#ffffff"); - DrawCheckboxVis(1100, 100, 64, 64, "Changeable Perks", KDDebugPerks, false, "#ffffff"); - DrawCheckboxVis(1100, 180, 64, 64, "Unlimited Gold", KDDebugGold, false, "#ffffff"); - MainCanvas.textAlign = "center"; - ElementPosition("DebugEnemy", 1650, 52, 300, 64); - DrawButtonVis(1500, 100, 100, 64, "Enemy", "#ffffff", ""); - DrawButtonVis(1600, 100, 100, 64, "Ally", "#ffffff", ""); - DrawButtonVis(1700, 100, 100, 64, "Shop", "#ffffff", ""); - ElementPosition("DebugItem", 1650, 212, 300, 64); - DrawButtonVis(1500, 260, 300, 64, "Add to inventory", "#ffffff", ""); - DrawButtonVis(1100, 260, 300, 64, "Teleport to stairs", "#ffffff", ""); - DrawButtonVis(1500, 320, 300, 64, "Get save code", "#ffffff", ""); - DrawButtonVis(1100, 320, 300, 64, "Enter parole mode", "#ffffff", ""); - - DrawButtonKDEx("debugAddKey", (bdata) => { - KinkyDungeonRedKeys += 1; - KinkyDungeonBlueKeys += 1; - KinkyDungeonLockpicks += 1; - return true; - }, true, 600, 160, 300, 64, "Add keys and lockpicks", "#ffffff", ""); - DrawButtonKDEx("debugAddVision", (bdata) => { - KinkyDungeonSeeAll = !KinkyDungeonSeeAll; - return true; - }, true, 600, 240, 300, 64, "Toggle OmniVision™", "#ffffff", ""); - DrawButtonKDEx("debugAddSP", (bdata) => { - KinkyDungeonSpellPoints += 1; - return true; - }, true, 600, 320, 300, 64, "Add spell point", "#ffffff", ""); - DrawButtonKDEx("debugClearQuickInv", (bdata) => { - KinkyDungeonInventory.get('looserestraint').clear(); - KinkyDungeonAdvanceTime(0, true); - return true; - }, true, 600, 400, 300, 64, "Clear loose restraints", "#ffffff", ""); - DrawButtonKDEx("debugClearPlayerInv", (bdata) => { - KinkyDungeonInventory.get('restraint').clear(); - KinkyDungeonAdvanceTime(0, true); - return true; - }, true, 600, 480, 300, 64, "Clear worn restraints", "#ffffff", ""); - DrawButtonKDEx("debugIncFloor", (bdata) => { - MiniGameKinkyDungeonLevel += 1; - return true; - }, true, 600, 560, 300, 64, "Increment Floor", "#ffffff", ""); - - - } - } - - MainCanvas.textAlign = "center"; - DrawTextFitKD(TextGet("KinkyDungeonRestartConfirm"), 1250, 400, 1000, "#ffffff", "#333333"); - DrawButtonVis(975, 550, 550, 64, TextGet("KinkyDungeonRestartNo"), "#ffffff", ""); - DrawButtonVis(975, 650, 550, 64, TextGet("KinkyDungeonRestartQuitNoErase"), "#ffffff", ""); - DrawButtonVis(975, 800, 550, 64, TextGet("KinkyDungeonRestartCapture" + (KDConfirmDeleteSave ? "Confirm" : "")), (KDGameData.PrisonerState == 'jail' || !KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)) ? "Pink" : "#ffffff", ""); - DrawButtonVis(975, 900, 550, 64, TextGet("KinkyDungeonRestartYes" + (KDConfirmDeleteSave ? "Confirm" : "")), "#ffffff", ""); - DrawButtonVis(1650, 900, 300, 64, TextGet("KinkyDungeonCheckPerks"), "#ffffff", ""); - - DrawButtonKDEx("GameConfigKeys", () => { - KinkyDungeonState = "Keybindings"; - if (!KinkyDungeonKeybindings) - KDSetDefaultKeybindings(); - else { - KinkyDungeonKeybindingsTemp = {}; - Object.assign(KinkyDungeonKeybindingsTemp, KinkyDungeonKeybindings); - } - return true; - }, true, 975, 450, 260, 64, TextGet("GameConfigKeys"), "#ffffff", ""); - DrawButtonKDEx("GameToggles", () => { - KinkyDungeonState = "Toggles"; - return true; - }, true, 1265, 450, 260, 64, TextGet("GameToggles"), "#ffffff", ""); - - } else if (KinkyDungeonDrawState == "Perks2") { - KinkyDungeonDrawPerks(!KDDebugPerks); - DrawButtonVis(1650, 920, 300, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", ""); - - // @ts-ignore - DrawButtonKDEx("copyperks", (bdata) => { - let txt = ""; - for (let k of KinkyDungeonStatsChoice.keys()) { - if (!k.startsWith("arousal") && !k.endsWith("Mode")) txt += (txt ? "\n" : "") + k; - } - navigator.clipboard.writeText(txt); - return true; - }, true, 1400, 930, 200, 54, TextGet("KinkyDungeonCopyPerks"), "#ffffff", ""); - } - - if (KinkyDungeonDrawState == "Game") { - if (KinkyDungeonFlags.get("PlayerOrgasmFilter")) { - /*if (KDToggles.IntenseOrgasm) { - if (!KDIntenseFilter) { - KDIntenseFilter = PIXI.Sprite.from(KinkyDungeonRootDirectory + 'displacement_map_repeat.jpg'); - // Make sure the sprite is wrapping. - KDIntenseFilter.texture.baseTexture.wrapMode = PIXI.WRAP_MODES.REPEAT; - const displacementFilter = new PIXI.filters.DisplacementFilter(KDIntenseFilter); - displacementFilter.padding = 10; - - kdgameboard.addChild(KDIntenseFilter); - - kdgameboard.filters = [displacementFilter]; - - displacementFilter.scale.x = 30; - displacementFilter.scale.y = 60; - } - } else {*/ - FillRectKD(kdcanvas, kdpixisprites, "screenoverlayor", { - Left: 0, - Top: 0, - Width: 2000, - Height: 1000, - Color: "#ff5277", - LineWidth: 1, - zIndex: 1, - alpha: 0.1, - }); - //} - } else if (KinkyDungeonStatFreeze > 0) { - FillRectKD(kdcanvas, kdpixisprites, "screenoverlayfr", { - Left: 0, - Top: 0, - Width: 2000, - Height: 1000, - Color: "#92e8c0", - LineWidth: 1, - zIndex: 1, - alpha: 0.1, - }); - } else if (KDToggles.StunFlash && (KinkyDungeonFlags.get("playerStun") || (KinkyDungeonMovePoints < 0 && KinkyDungeonSlowLevel < 9))) { - FillRectKD(kdcanvas, kdpixisprites, "screenoverlayst", { - Left: 0, - Top: 0, - Width: 2000, - Height: 1000, - Color: "#aaaaaa", - LineWidth: 1, - zIndex: 1, - alpha: 0.07, - }); - } else if (KDToggles.ArousalHearts) { - KDDrawArousalParticles(KDGameData.OrgasmTurns/KinkyDungeonOrgasmTurnsMax, KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax, - (KDGameData.OrgasmStage / KinkyDungeonMaxOrgasmStage) - ); - } else if (KinkyDungeonStatDistraction > 1.0) { - KDDrawArousalScreenFilter(0, 1000, 2000, KinkyDungeonStatDistraction * 100 / KinkyDungeonStatDistractionMax); - } - - if (KDToggles.VibeHearts) { - KDDrawVibeParticles(KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax); - } - - /*if (!KinkyDungeonFlags.get("PlayerOrgasmFilter") && KDIntenseFilter) { - kdgameboard.removeChild(KDIntenseFilter); - kdgameboard.filters = kdgameboard.filters.filter((filter) => {return filter != KDIntenseFilter;}); - KDIntenseFilter = null; - }*/ - } - - - if (ServerURL != "foobar") - DrawButtonVis(1885, 25, 90, 90, "", "#ffffff", KinkyDungeonRootDirectory + "UI/Exit.png"); - - if ((!KDDebugMode && KinkyDungeonDrawState == "Restart") || (KDDebugMode && KinkyDungeonDrawState != "Restart")) { - ElementRemove("DebugEnemy"); - ElementRemove("DebugItem"); - } -} - - -/** - * Draws arousal screen filter - * @param {number} y1 - Y to draw filter at. - * @param {number} h - Height of filter - * @param {number} Width - Width of filter - * @param {number} ArousalOverride - Override to the existing arousal value - * @returns {void} - Nothing. - */ -function KDDrawArousalScreenFilter(y1, h, Width, ArousalOverride, Color = '255, 100, 176', AlphaBonus = 0) { - let Progress = (ArousalOverride) ? ArousalOverride : Player.ArousalSettings.Progress; - let amplitude = 0.24 * Math.min(1, 2 - 1.5 * Progress/100); // Amplitude of the oscillation - let percent = Progress/100.0; - let level = Math.min(0.5, percent) + 0.5 * Math.pow(Math.max(0, percent*2 - 1), 4); - let oscillation = Math.sin(CommonTime() / 1000 % Math.PI); - let alpha = Math.min(1.0, AlphaBonus + 0.35 * level * (0.99 - amplitude + amplitude * oscillation)); - - if (Player.ArousalSettings.VFXFilter == "VFXFilterHeavy") { - const Grad = MainCanvas.createLinearGradient(0, y1, 0, h); - let alphamin = 0;//Math.max(0, alpha / 2 - 0.05); - Grad.addColorStop(0, `rgba(${Color}, ${alpha})`); - Grad.addColorStop(0.1 + 0.1*percent * (1.0 + 0.3 * oscillation), `rgba(${Color}, ${alphamin})`); - Grad.addColorStop(0.5, `rgba(${Color}, ${alphamin/2})`); - Grad.addColorStop(0.9 - 0.1*percent * (1.0 + 0.3 * oscillation), `rgba(${Color}, ${alphamin})`); - Grad.addColorStop(1, `rgba(${Color}, ${alpha})`); - MainCanvas.fillStyle = Grad; - MainCanvas.fillRect(0, y1, Width, h); - } else { - if (Player.ArousalSettings.VFXFilter != "VFXFilterMedium") { - alpha = (Progress >= 91) ? 0.25 : 0; - } else alpha /= 2; - if (alpha > 0) - DrawRect(0, y1, Width, h, `rgba(${Color}, ${alpha})`); - } -} - -function KDCanAttack() { - let attackCost = KinkyDungeonStatStaminaCostAttack; - if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.staminacost) attackCost = -KinkyDungeonPlayerDamage.staminacost; - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackStamina")) { - attackCost = Math.min(0, attackCost * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackStamina"))); - } - return KinkyDungeonHasStamina(Math.abs(attackCost), true); -} - -let KinkyDungeonFloaters = []; -let KinkyDungeonLastFloaterTime = 0; - -let KDTimescale = 0.004; -let KDBulletSpeed = 40; - -// We use this to offset floaters -let KDEntitiesFloaterRegisty = new Map(); -let KDFloaterSpacing = 36 / KinkyDungeonGridSizeDisplay; - -function KinkyDungeonSendFloater(Entity, Amount, Color, Time, LocationOverride, suff = "") { - if (Entity.x && Entity.y) { - let II = KDEntitiesFloaterRegisty.get(Entity) || 1; - II += 1; - KDEntitiesFloaterRegisty.set(Entity, II); - let floater = { - x: Entity.x + 0.5,// + Math.random(), - y: Entity.y - (II - 1) * KDFloaterSpacing,// + Math.random(), - override: LocationOverride, - speed: 30,// + (Time ? Time : 0) + Math.random()*10, - t: 0, - color: Color, - text: "" + ((typeof Amount === "string") ? Amount : Math.round(Amount * 10)/10) + suff, - lifetime: Time ? Time : ((typeof Amount === "string") ? 4 : ((Amount < 3) ? 2 : (Amount > 5 ? 3 : 2))), - }; - KinkyDungeonFloaters.push(floater); - } -} - - -function KinkyDungeonDrawFloaters(CamX, CamY) { - let delta = CommonTime() - KinkyDungeonLastFloaterTime; - if (delta > 0) { - for (let floater of KinkyDungeonFloaters) { - floater.t += delta/1000; - } - } - let newFloaters = []; - for (let floater of KinkyDungeonFloaters) { - let x = floater.override ? floater.x : canvasOffsetX + (floater.x - CamX)*KinkyDungeonGridSizeDisplay; - let y = floater.override ? floater.y : canvasOffsetY + (floater.y - CamY)*KinkyDungeonGridSizeDisplay; - DrawTextKD(floater.text, - x, y - floater.speed*floater.t, - floater.color, KDTextGray1, undefined, undefined, 120, KDEase(floater.t / floater.lifetime)); - if (floater.t < floater.lifetime) newFloaters.push(floater); - } - KinkyDungeonFloaters = newFloaters; - - KinkyDungeonLastFloaterTime = CommonTime(); -} - -/** - * Easing function makes things smooth - * @param {number} value - * @returns {number} - */ -function KDEase(value) { - if (value < 0.25) - return Math.sin(value * Math.PI * 2); - else if (value > 0.75) - return Math.sin(-value * Math.PI * 2); - else return 1; -} - -let KinkyDungeonMessageToggle = false; -let KinkyDungeonMessageLog = []; -let KDLogDist = 24; -let KDMSGFontSize = 20; -let KDLogHeight = 700; -let KDMaxLog = Math.floor(700/KDLogDist); -let KDLogTopPad = 100; - -let KDLogIndex = 0; -let KDLogIndexInc = 3; - -let KDMsgWidth = 1200; -let KDMsgWidthMin = 800; -let KDMsgX = 400; -let KDMsgFadeTime = 10; - -let KDMaxConsoleMsg = 6; - -function KinkyDungeonDrawMessages(NoLog) { - if (!NoLog) - // @ts-ignore - DrawButtonKDEx("logtog", (bdata) => { - KinkyDungeonMessageToggle = !KinkyDungeonMessageToggle; - KDLogIndex = 0; - return true; - }, true, 1750, 82, 100, 50, TextGet("KinkyDungeonLog"), "#ffffff"); - if (!KinkyDungeonMessageToggle || NoLog) { - let i = 0; - if (!MouseIn(KDMsgX + (KDMsgWidth - KDMsgWidthMin)/2, 62, KDMsgWidthMin, KDLogDist*(2 + KDMaxConsoleMsg)) || KinkyDungeonDrawState != "Game") { - - - let msg2nd = []; - let ignoreMSG = []; - let spacing = KDLogDist; - if (KinkyDungeonActionMessageTime > 0 && KinkyDungeonActionMessageNoPush) { - DrawTextFitKD(KinkyDungeonActionMessage, KDMsgX + KDMsgWidth/2, 82 + spacing * i, KDMsgWidthMin, KinkyDungeonActionMessageColor, KDTextGray1, KDMSGFontSize); - ignoreMSG.push(KinkyDungeonActionMessage); - i++; - } - if (KinkyDungeonTextMessageTime > 0 && KinkyDungeonTextMessageNoPush) { - DrawTextFitKD(KinkyDungeonTextMessage, KDMsgX + KDMsgWidth/2, 82 + spacing * i, KDMsgWidthMin, KinkyDungeonTextMessageColor, KDTextGray1, KDMSGFontSize); - ignoreMSG.push(KinkyDungeonTextMessage); - i++; - } - for (let ii = 0; ii < KinkyDungeonMessageLog.length && ii < 100; ii++) { - let index = KinkyDungeonMessageLog.length - 1 - ii; - let msg = KinkyDungeonMessageLog[index]; - if (!msg) break; - if (ignoreMSG.includes(msg.text)) { - ignoreMSG.splice(ignoreMSG.indexOf(msg.text), 1); - continue; - } - if (KinkyDungeonCurrentTick - msg.time < KDMsgFadeTime) { - let count = 1; - for (let iii = 1; iii < 100; iii++) { - if (KinkyDungeonMessageLog[index - iii] && KinkyDungeonMessageLog[index-iii].text == msg.text) { - count += 1; - //KinkyDungeonMessageLog.splice(ii+iii, 1); - //ii -= 1; - } else break; - } - if (count > 1) { - ii += count - 1; - } - msg2nd.push(count == 1 ? msg : Object.assign({}, {text: msg.text + ` (x${count})`, color: msg.color, time: msg.time})); - } - } - if (msg2nd.length > 0) { - let alpha = 1; - let alphamin = 0.4; - for (let msg of msg2nd) { - if (i > KDMaxConsoleMsg || (KinkyDungeonDrawState != "Game" && i > 3)) break; - if (alpha > 0) { - alpha = Math.max(0, Math.min(1, 2.0 - i / KDMaxConsoleMsg)) * (1 - Math.max(0, Math.min(1, Math.max(0, KinkyDungeonCurrentTick - msg.time - 1)/KDMsgFadeTime))); - DrawTextFitKD(msg.text, KDMsgX + KDMsgWidth/2, 82 + spacing * i, KDMsgWidthMin, msg.color, KDTextGray1, KDMSGFontSize, undefined, undefined, alphamin + (1 - alphamin) * alpha); i++; - } - } - } - - } - if (i > 0 || KinkyDungeonDrawState == "Game") - FillRectKD(kdcanvas, kdpixisprites, "msglogbg", { - Left: KDMsgX + (KDMsgWidth - KDMsgWidthMin)/2, - Top: 0, - Width: KDMsgWidthMin, - Height: 62 + KDLogDist*(i + 1), - Color: "#000000", - LineWidth: 1, - zIndex: 100, - alpha: 0.45, - }); - - - } else { - FillRectKD(kdcanvas, kdpixisprites, "msglogbg", { - Left: KDMsgX, - Top: 0, - Width: KDMsgWidth, - Height: KDLogTopPad + KDLogHeight, - Color: KDTextGray0, - LineWidth: 1, - zIndex: 100, - alpha: 0.6, - }); - for (let i = 0; i < KinkyDungeonMessageLog.length && i < KDMaxLog; i++) { - let log = KinkyDungeonMessageLog[Math.max(0, KinkyDungeonMessageLog.length - 1 - (i + KDLogIndex))]; - let col = log.color; - DrawTextFitKD(log.text, KDMsgX + KDMsgWidth/2, KDLogTopPad + i * KDLogDist + KDLogDist/2, KDMsgWidth, col, KDTextGray1, 28, undefined, 101); - } - if (KinkyDungeonMessageLog.length > KDMaxLog) { - // @ts-ignore - DrawButtonKDEx("logscrollup", (bdata) => { - if (KDLogIndex > 0) - KDLogIndex = Math.max(0, KDLogIndex - KDLogIndexInc); - return true; - }, true, 1500, 20, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Up.png"); - //KDMsgX + KDMsgWidth/2 - 45, KDLogTopPad + KDLogHeight + 10 - // @ts-ignore - DrawButtonKDEx("logscrolldown", (bdata) => { - if (KDLogIndex < KinkyDungeonMessageLog.length - KDMaxLog) - KDLogIndex = Math.min(Math.max(0, KinkyDungeonMessageLog.length - KDMaxLog), KDLogIndex + KDLogIndexInc); - return true; - }, true,1500, 60, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Down.png"); - - if (KinkyDungeonMessageLog.length > KDMaxLog * 100) { - KinkyDungeonMessageLog.splice(0, KDMaxLog * 100 - KinkyDungeonMessageLog.length); - } - } - - } -} - -function KDhexToRGB(h) { - let r = "", g = "", b = ""; - - // 3 digits - if (h.length == 4) { - r = "#" + h[1] + h[1]; - g = "#" + h[2] + h[2]; - b = "#" + h[3] + h[3]; - - // 6 digits - } else if (h.length == 7) { - r = "#" + h[1] + h[2]; - g = "#" + h[3] + h[4]; - b = "#" + h[5] + h[6]; - } - - return {r:r, g:g, b:b}; -} - -function KinkyDungeonUpdateVisualPosition(Entity, amount) { - if (amount < 0 || Entity.visual_x == undefined || Entity.visual_y == undefined) { - Entity.visual_x = (Entity.xx != undefined) ? Entity.xx : Entity.x; - Entity.visual_y = (Entity.yy != undefined) ? Entity.yy : Entity.y; - return -1; - } else { - let speed = 50 + KDAnimSpeed * 50; - if (Entity.player && KinkyDungeonSlowLevel > 0 && KDGameData.KinkyDungeonLeashedPlayer < 2 && (KinkyDungeonFastMovePath.length < 1 || KinkyDungeonSlowLevel > 1)) speed += KDAnimSpeed * 50 * KinkyDungeonSlowLevel; - if (KDGameData.SleepTurns > 0) speed = 100; - if (speed > 300) speed = 250; - if (Entity.scale) speed = KDBulletSpeed; - let value = amount/speed;// How many ms to complete a move - // xx is the true position of a bullet - let tx = (Entity.xx != undefined) ? Entity.xx : Entity.x; - let ty = (Entity.yy != undefined) ? Entity.yy : Entity.y; - - let offX = 0; - let offY = 0; - let offamount = 0.25; - if (Entity.fx && Entity.fy && (Entity.fx != Entity.x || Entity.fy != Entity.y) && Entity.Enemy && !KDIsImmobile(Entity)) { - if (Entity.fx != Entity.x) { - offX = offamount * Math.sign(Entity.fx - Entity.x); - } - if (Entity.fy != Entity.y) { - offY = offamount * Math.sign(Entity.fy - Entity.y); - } - } - tx += offX; - ty += offY; - - let dist = Math.sqrt((Entity.visual_x - tx) * (Entity.visual_x - tx) + (Entity.visual_y - ty) * (Entity.visual_y - ty)); - if (dist > 5) { - value = 1; - } - if (Entity.scale != undefined) { - let scalemult = 0.9; - if (dist > 0 || !Entity.end || !(Entity.vx || Entity.vy)) { - if (Entity.vx || Entity.vy) { - scalemult = KDistEuclidean(Entity.vx, Entity.vy); - } - Entity.scale = Math.min(1.0, Entity.scale + KDTimescale*amount*scalemult); - } else { - Entity.scale = Math.max(0.0, Entity.scale - KDTimescale*amount*scalemult); - } - } - if (Entity.alpha != undefined) { - let alphamult = 0.28; - if (dist > 0 || !Entity.end) { - Entity.alpha = Math.min(1.0, Entity.alpha + KDTimescale*amount*3.0); - } else { - if ((Entity.vx || Entity.vy) || Entity.time > 1) { - alphamult = 0; - } - Entity.alpha = Math.min(1, Math.max(0.0, Entity.alpha - KDTimescale*amount*alphamult)); - } - } - - if (Entity.spin != undefined && Entity.spinAngle != undefined) { - Entity.spinAngle += Entity.spin * KDTimescale*amount; - if (Entity.spinAngle > Math.PI * 2) Entity.spinAngle -= Math.PI*2; - else if (Entity.spinAngle < 0) Entity.spinAngle += Math.PI*2; - //Math.min(1.0, Entity.alpha + KDTimescale*amount*3.0); - } - - if (dist == 0) return dist; - // Increment - let weightx = Math.abs(Entity.visual_x - tx)/(dist); - let weighty = Math.abs(Entity.visual_y - ty)/(dist); - //if (weightx != 0 && weightx != 1 && Math.abs(weightx - weighty) > 0.01) - //console.log(weightx + ", " + weighty + ", " + (Entity.visual_x - tx) + ", " + (Entity.visual_y - ty) + ", dist = " + dist, "x = " + Entity.visual_x + ", y = " + Entity.visual_y) - - if (Entity.visual_x > tx) Entity.visual_x = Math.max(Entity.visual_x - value*weightx, tx); - else Entity.visual_x = Math.min(Entity.visual_x + value*weightx, tx); - - if (Entity.visual_y > ty) Entity.visual_y = Math.max(Entity.visual_y - value*weighty, ty); - else Entity.visual_y = Math.min(Entity.visual_y + value*weighty, ty); - return dist; - //console.log("x = " + Entity.visual_x + ", y = " + Entity.visual_y + ", tx = " + tx + ", ty = " + ty) - } -} - -/** - * Sets the target location based on MOUSE location - */ -function KinkyDungeonSetTargetLocation() { - KinkyDungeonTargetX = Math.round((MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamX; - KinkyDungeonTargetY = Math.round((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamY; -} - -/** - * Sets the move direction based on MOUSE location - */ -function KinkyDungeonSetMoveDirection() { - - let tx = //(MouseX - ((KinkyDungeonPlayerEntity.x - KinkyDungeonCamX)*KinkyDungeonGridSizeDisplay + canvasOffsetX + KinkyDungeonGridSizeDisplay / 2))/KinkyDungeonGridSizeDisplay - Math.round((MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamX; - let ty = //(MouseY - ((KinkyDungeonPlayerEntity.y - KinkyDungeonCamY)*KinkyDungeonGridSizeDisplay + canvasOffsetY + KinkyDungeonGridSizeDisplay / 2))/KinkyDungeonGridSizeDisplay) - Math.round((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamY; - - KDSendInput("setMoveDirection", {dir: KinkyDungeonGetDirection( - tx - KinkyDungeonPlayerEntity.x, - ty - KinkyDungeonPlayerEntity.y)}, true, true); - -} - -let KDBoxThreshold = 60; -let KDButtonColor = "rgba(5, 5, 5, 0.5)"; -let KDButtonColorIntense = "rgba(5, 5, 5, 0.8)"; -let KDBorderColor = '#f0b541'; - -/** - * Draws a box component - * @param {number} Left - Position of the component from the left of the canvas - * @param {number} Top - Position of the component from the top of the canvas - * @param {number} Width - Width of the component - * @param {number} Height - Height of the component - * @param {string} Color - Color of the component - * @param {boolean} [NoBorder] - Color of the component - * @param {number} [Alpha] - Transparency of the box - * @param {number} [zIndex] - z Index - * @returns {void} - Nothing - */ -function DrawBoxKD(Left, Top, Width, Height, Color, NoBorder, Alpha, zIndex = 90) { - /*// Draw the button rectangle (makes the background color cyan if the mouse is over it) - MainCanvas.beginPath(); - MainCanvas.fillStyle = Color; - MainCanvas.fillRect(Left, Top, Width, Height); - MainCanvas.fill(); - if (!NoBorder) { - MainCanvas.rect(Left, Top, Width, Height); - MainCanvas.lineWidth = 2; - MainCanvas.strokeStyle = KDBorderColor; - MainCanvas.stroke(); - } - - MainCanvas.closePath();*/ - FillRectKD(kdcanvas, kdpixisprites, "box" + Left + "," + Top + "," + Width + "," + Height + Color + zIndex, { - Left: Left, - Top: Top, - Width: Width, - Height: Height, - Color: Color, - LineWidth: 1, - zIndex: zIndex, - alpha: Alpha != undefined ? Alpha : 1, - }); - - if (!NoBorder) { - DrawRectKD(kdcanvas, kdpixisprites, "boxBorder" + Left + "," + Top + "," + Width + "," + Height + zIndex, { - Left: Left, - Top: Top, - Width: Width, - Height: Height, - Color: KDBorderColor, - LineWidth: 2, - zIndex: zIndex + 0.001, - }); - } -} - -let KDFont = 'Arial'; - -/** - * - * @param {*} Text - * @param {*} X - * @param {*} Y - * @param {*} Width - * @param {*} Color - * @param {*} [BackColor] - * @param {*} [FontSize] - * @param {*} [Align] - * @param {*} [zIndex] - * @param {*} [alpha] - * @param {*} [border] - */ -function DrawTextFitKD(Text, X, Y, Width, Color, BackColor, FontSize, Align, zIndex = 110, alpha = 1.0, border = undefined) { - if (!Text) return; - let alignment = Align ? Align : MainCanvas.textAlign; - - DrawTextVisKD(kdcanvas, kdpixisprites, Text + "," + X + "," + Y, { - Text: Text, - X: X, - Y: Y, - Width: Width, - Color: Color, - BackColor: BackColor ? BackColor : (Color == KDTextGray2 ? KDTextGray0 : (Color == KDTextGray0 ? KDTextGray3 : KDTextGray2)), - FontSize: FontSize ? FontSize : 30, - align: alignment, - zIndex: zIndex, - alpha: alpha, - border: border, - }); -} - -/** - * - * @param {*} Text - * @param {*} X - * @param {*} Y - * @param {*} Color - * @param {*} [BackColor] - * @param {*} [FontSize] - * @param {*} [Align] - * @param {*} [zIndex] - * @param {*} [alpha] - */ -function DrawTextKD(Text, X, Y, Color, BackColor, FontSize, Align, zIndex = 110, alpha = 1.0, border = undefined) { - if (!Text) return; - let alignment = Align ? Align : MainCanvas.textAlign; - - DrawTextVisKD(kdcanvas, kdpixisprites, Text + "," + X + "," + Y, { - Text: Text, - X: X, - Y: Y, - Width: undefined, - Color: Color, - BackColor: BackColor, - FontSize: FontSize ? FontSize : 30, - align: alignment, - zIndex: zIndex, - alpha: alpha, - border: border, - }); -} - -let KDFontName = "Roboto"; - -/* eslint-disable */ -// // Load them google fonts before starting...! -// @ts-ignore -window.WebFontConfig = { - google: { - families: [KDFontName], - }, - - active() { - KDAllowText = true; - }, -}; - -let KDAllowText = true; - - -// include the web-font loader script -(function() { - const wf = document.createElement('script'); - wf.src = `Fonts/webfont.js`; - wf.type = 'text/javascript'; - wf.async = true; - const s = document.getElementsByTagName('script')[0]; - s.parentNode.insertBefore(wf, s); -}()); -/* eslint-enabled */ - -/** - * - * @param {{Text: string, X: number, Y: number, Width?: number, Color: string, BackColor: string, FontSize?: number, align?: string, zIndex?: number, alpha?: number, border?: number}} Params - * @returns {boolean} - If it worked - */ -function DrawTextVisKD(Container, Map, id, Params) { - if (!KDAllowText) return; - let sprite = Map.get(id); - let same = true; - let par = kdprimitiveparams.get(id); - if (sprite && par) { - for (let p of Object.entries(kdprimitiveparams.get(id))) { - if (Params[p[0]] != p[1]) { - same = false; - break; - } - } - for (let p of Object.entries(Params)) { - if (par[p[0]] != p[1]) { - same = false; - break; - } - } - } - if (!sprite || !same) { - if (sprite) sprite.destroy(); - // Make the prim - sprite = new PIXI.Text(Params.Text, - { - fontFamily : KDFontName, - fontSize: Params.FontSize ? Params.FontSize : 30, - fill : string2hex(Params.Color), - stroke : Params.BackColor != "none" ? (Params.BackColor ? string2hex(Params.BackColor) : "#333333") : 0x000000, - strokeThickness: Params.border != undefined ? Params.border : (Params.BackColor != "none" ? (Params.FontSize ? Math.ceil(Params.FontSize / 8) : 2) : 0), - miterLimit: 4, - } - ); - if (Params.Width) { - sprite.scale.x = Math.min(1, Params.Width / Math.max(1, sprite.width)); - sprite.scale.y = sprite.scale.x; - } - // Add it to the container - Map.set(id, sprite); - Container.addChild(sprite); - if (!kdprimitiveparams.has(id) || !same) - kdprimitiveparams.set(id, Params); - } - if (sprite) { - // Modify the sprite according to the params - sprite.name = id; - sprite.position.x = Params.X + (Params.align == 'center' ? -sprite.width/2 : (Params.align == 'right' ? -sprite.width : 0)); - sprite.position.y = Params.Y - sprite.height/2 - 2; - sprite.zIndex = Params.zIndex ? Params.zIndex : 0; - sprite.alpha = Params.alpha ? Params.alpha : 1; - kdSpritesDrawn.set(id, true); - return true; - } - return false; -} - -/** - * Draws a basic rectangle filled with a given color - * @param {any} Container - * @param {Map} Map - * @param {{Left: number, Top: number, Width: number, Height: number, Color: string, LineWidth: number, zIndex: number, alpha?: number}} Params - rect parameters - * @returns {boolean} - If it worked - */ -function DrawRectKD(Container, Map, id, Params) { - let sprite = Map.get(id); - let same = true; - if (sprite && kdprimitiveparams.has(id)) { - for (let p of Object.entries(kdprimitiveparams.get(id))) { - if (Params[p[0]] != p[1]) { - same = false; - break; - } - } - } - if (!sprite || !same) { - if (sprite) sprite.destroy(); - // Make the prim - sprite = new PIXI.Graphics(); - sprite.lineStyle(Params.LineWidth ? Params.LineWidth : 1, string2hex(Params.Color), 1); - sprite.drawRect(0, 0, Params.Width, Params.Height); - // Add it to the container - Map.set(id, sprite); - Container.addChild(sprite); - if (!kdprimitiveparams.has(id) || !same) - kdprimitiveparams.set(id, Params); - } - if (sprite) { - // Modify the sprite according to the params - sprite.name = id; - sprite.position.x = Params.Left; - sprite.position.y = Params.Top; - sprite.width = Params.Width; - sprite.height = Params.Height; - sprite.zIndex = Params.zIndex ? Params.zIndex : 0; - sprite.alpha = Params.alpha ? Params.alpha : 1; - kdSpritesDrawn.set(id, true); - return true; - } - return false; -} - -/** - * Draws a basic rectangle filled with a given color - * @param {any} Container - * @param {Map} Map - * @param {{Left: number, Top: number, Width: number, Height: number, Color: string, LineWidth?: number, zIndex: number, alpha?: number}} Params - rect parameters - * @returns {boolean} - If it worked - */ -function FillRectKD(Container, Map, id, Params) { - let sprite = Map.get(id); - let same = true; - if (sprite && kdprimitiveparams.has(id)) { - for (let p of Object.entries(kdprimitiveparams.get(id))) { - if (Params[p[0]] != p[1]) { - same = false; - break; - } - } - } - if (!sprite || !same) { - if (sprite) sprite.destroy(); - // Make the prim - sprite = new PIXI.Graphics(); - sprite.beginFill(string2hex(Params.Color)); - sprite.drawRect(0, 0, Params.Width, Params.Height); - // Add it to the container - Map.set(id, sprite); - Container.addChild(sprite); - if (!kdprimitiveparams.has(id)) - kdprimitiveparams.set(id, Params); - } - if (sprite) { - // Modify the sprite according to the params - sprite.name = id; - sprite.position.x = Params.Left; - sprite.position.y = Params.Top; - sprite.width = Params.Width; - sprite.height = Params.Height; - sprite.zIndex = Params.zIndex ? Params.zIndex : 0; - sprite.alpha = Params.alpha ? Params.alpha : 1; - kdSpritesDrawn.set(id, true); - return true; - } - return false; -} - -/** - * Draws a button component - * @param {number} Left - Position of the component from the left of the canvas - * @param {number} Top - Position of the component from the top of the canvas - * @param {number} Width - Width of the component - * @param {number} Height - Height of the component - * @param {string} Label - Text to display in the button - * @param {string} Color - Color of the component - * @param {string} [Image] - URL of the image to draw inside the button, if applicable - * @param {string} [HoveringText] - Text of the tooltip, if applicable - * @param {boolean} [Disabled] - Disables the hovering options if set to true - * @param {boolean} [NoBorder] - Disables the button border and only draws the image and selection halo - * @param {string} [FillColor] - Color of the background - * @param {number} [FontSize] - Color of the background - * @param {boolean} [ShiftText] - Shift text to make room for the button - * @param {boolean} [Stretch] - Stretch the image to fit - * @param {number} [zIndex] - Stretch the image to fit - * @param {object} [options] - Additional options - * @param {boolean} [options.noTextBG] - Dont show text backgrounds - * @param {number} [options.alpha] - * @param {number} [options.zIndex] - zIndex - * @returns {void} - Nothing - */ -function DrawButtonVis(Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, Stretch, zIndex = 100, options) { - let hover = ((MouseX >= Left) && (MouseX <= Left + Width) && (MouseY >= Top) && (MouseY <= Top + Height) && !CommonIsMobile && !Disabled); - if (!NoBorder || FillColor) - DrawBoxKD(Left, Top, Width, Height, - FillColor ? FillColor : (hover ? (KDTextGray2) : KDButtonColor), - NoBorder, options?.alpha || 0.5, zIndex - ); - if (hover) { - let pad = 4; - // Draw the button rectangle (makes the background color cyan if the mouse is over it) - /*MainCanvas.beginPath(); - MainCanvas.rect(Left + pad, Top + pad, Width - 2 * pad, Height - 2 * pad); - MainCanvas.lineWidth = 2; - MainCanvas.strokeStyle = '#cccccc'; - MainCanvas.stroke(); - MainCanvas.closePath();*/ - DrawRectKD(kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height + "out", { - Left: Left + pad, - Top: Top + pad, - Width: Width - 2 * pad + 1, - Height: Height - 2 * pad + 1, - Color: "#ffffff", - LineWidth: 2, - zIndex: zIndex, - }); - } - - // Draw the text or image - let textPush = 0; - if ((Image != null) && (Image != "")) { - let img = DrawGetImage(Image); - if (Stretch) { - KDDraw(kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height, - Image, Left, Top, Width, Height, undefined, { - zIndex: zIndex + 0.001, - }); - /*DrawImageEx(Image, Left, Top, { - Width: Width, - Height: Height, - });*/ - } else KDDraw(kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height, - Image, Left + 2, Top + Height/2 - img.height/2, img.width, img.height, undefined, { - zIndex: zIndex + 0.001, - }); - textPush = img.width; - } - DrawTextFitKD(Label, Left + Width / 2 + (ShiftText ? textPush*0.5 : 0), Top + (Height / 2), Width - 4 - Width*0.04 - (textPush ? (textPush + (ShiftText ? 0 : Width*0.04)) : Width*0.04), - Color, - (options && options.noTextBG) ? "none" : undefined, - FontSize, undefined, zIndex + 0.001); - - // Draw the tooltip - if ((HoveringText != null) && (MouseX >= Left) && (MouseX <= Left + Width) && (MouseY >= Top) && (MouseY <= Top + Height)) { - DrawTextFitKD(HoveringText, 1000, MouseY, 1500, "#ffffff"); - //DrawHoverElements.push(() => DrawButtonHover(Left, Top, Width, Height, HoveringText)); - } -} - - - -/** - * Draws a checkbox component - * @param {number} Left - Position of the component from the left of the canvas - * @param {number} Top - Position of the component from the top of the canvas - * @param {number} Width - Width of the component - * @param {number} Height - Height of the component - * @param {string} Text - Label associated with the checkbox - * @param {boolean} IsChecked - Whether or not the checkbox is checked - * @param {boolean} [Disabled] - Disables the hovering options if set to true - * @param {string} [TextColor] - Color of the text - * @param {object} [options] - Additional options - * @param {boolean} [options.noTextBG] - Dont show text backgrounds - * @param {number} [options.alpha] - * @param {number} [options.zIndex] - zIndex - * @returns {void} - Nothing - */ -// @ts-ignore -function DrawCheckboxVis(Left, Top, Width, Height, Text, IsChecked, Disabled = false, TextColor = KDTextGray0, CheckImage = "Icons/Checked.png", options) { - DrawTextFitKD(Text, Left + 100, Top + 33, 1000, TextColor, "#333333"); - DrawButtonVis(Left, Top, Width, Height, "", Disabled ? "#ebebe4" : "#ffffff", IsChecked ? (KinkyDungeonRootDirectory + "UI/Checked.png") : "", null, Disabled, - undefined, undefined, undefined, undefined, undefined, options?.zIndex, options); -} - - - -/** - * Draws a checkbox component - * @param {string} name - Name of the button element - * @param {(bdata: any) => boolean} func - Whether or not you can click on it - * @param {boolean} enabled - Whether or not you can click on it - * @param {number} Left - Position of the component from the left of the canvas - * @param {number} Top - Position of the component from the top of the canvas - * @param {number} Width - Width of the component - * @param {number} Height - Height of the component - * @param {string} Text - Label associated with the checkbox - * @param {boolean} IsChecked - Whether or not the checkbox is checked - * @param {boolean} [Disabled] - Disables the hovering options if set to true - * @param {string} [TextColor] - Color of the text - * @param {object} [options] - Additional options - * @param {boolean} [options.noTextBG] - Dont show text backgrounds - * @param {number} [options.alpha] - * @param {number} [options.zIndex] - zIndex - * @param {number} [options.maxWidth] - Max width - * @returns {void} - Nothing - */ -// @ts-ignore -function DrawCheckboxKDEx(name, func, enabled, Left, Top, Width, Height, Text, IsChecked, Disabled = false, TextColor = KDTextGray0, CheckImage = "Icons/Checked.png", options) { - DrawTextFitKD(Text, Left + 100, Top + 33, options?.maxWidth || 1000, TextColor, "#333333",); - DrawButtonKDEx(name, func, enabled, Left, Top, Width, Height, "", Disabled ? "#ebebe4" : "#ffffff", IsChecked ? (KinkyDungeonRootDirectory + "UI/Checked.png") : "", null, Disabled, - undefined, undefined, undefined, undefined, options); -} - - -/** - * Draw a back & next button component - * @param {number} Left - Position of the component from the left of the canvas - * @param {number} Top - Position of the component from the top of the canvas - * @param {number} Width - Width of the component - * @param {number} Height - Height of the component - * @param {string} Label - Text inside the component - * @param {string} Color - Color of the component - * @param {string} [Image] - Image URL to draw in the component - * @param {() => string} [BackText] - Text for the back button tooltip - * @param {() => string} [NextText] - Text for the next button tooltip - * @param {boolean} [Disabled] - Disables the hovering options if set to true - * @param {number} [ArrowWidth] - How much of the button the previous/next sections cover. By default, half each. - * @param {boolean} [NoBorder] - Disables the hovering options if set to true - * @param {object} [options] - Additional options - * @param {boolean} [options.noTextBG] - Dont show text backgrounds - * @param {number} [options.alpha] - * @returns {void} - Nothing - */ -// @ts-ignore -function DrawBackNextButtonVis(Left, Top, Width, Height, Label, Color, Image, BackText, NextText, Disabled, ArrowWidth, NoBorder, options) { - // Set the widths of the previous/next sections to be colored cyan when hovering over them - // By default each covers half the width, together covering the whole button - if (ArrowWidth == null || ArrowWidth > Width / 2) ArrowWidth = Width / 2; - const LeftSplit = Left + ArrowWidth; - const RightSplit = Left + Width - ArrowWidth; - - if (ControllerActive == true) { - setButton(Left, Top); - setButton(Left + Width - ArrowWidth, Top); - } - - DrawBoxKD(Left, Top, Width, Height, - KDButtonColor, undefined, options?.alpha || 0.5 - ); - - // Draw the button rectangle - MainCanvas.beginPath(); - MainCanvas.lineWidth = 1; - MainCanvas.strokeStyle = '#ffffff'; - MainCanvas.stroke(); - if (MouseIn(Left, Top, Width, Height) && !CommonIsMobile && !Disabled) { - if (MouseX > RightSplit) { - MainCanvas.rect(RightSplit + 4, Top + 4, ArrowWidth - 8, Height - 8); - } - else if (MouseX <= LeftSplit) { - MainCanvas.rect(Left + 4, Top + 4, ArrowWidth - 8, Height - 8); - } else { - MainCanvas.rect(Left + 4 + ArrowWidth, Top + 4, Width - ArrowWidth * 2 - 8, Height - 8); - } - } - else if (CommonIsMobile && ArrowWidth < Width / 2 && !Disabled) { - // Fill in the arrow regions on mobile - MainCanvas.rect(Left + 4, Top + 4, ArrowWidth - 8, Height - 8); - MainCanvas.rect(RightSplit + 4, Top + 4, ArrowWidth - 8, Height - 8); - } - MainCanvas.stroke(); - MainCanvas.closePath(); - - // Draw the text or image - DrawTextFitKD(Label, Left + Width / 2, Top + (Height / 2) + 1, (CommonIsMobile) ? Width - 6 : Width - 36, "#ffffff"); - if ((Image != null) && (Image != "")) DrawImage(Image, Left + 2, Top + 2); - if (ControllerActive == true) { - setButton(Left + Width / 2, Top); - } - - // Draw the back arrow - MainCanvas.beginPath(); - MainCanvas.fillStyle = KDTextGray0; - MainCanvas.moveTo(Left + 15, Top + Height / 5); - MainCanvas.lineTo(Left + 5, Top + Height / 2); - MainCanvas.lineTo(Left + 15, Top + Height - Height / 5); - MainCanvas.stroke(); - MainCanvas.closePath(); - - // Draw the next arrow - MainCanvas.beginPath(); - MainCanvas.fillStyle = KDTextGray0; - MainCanvas.moveTo(Left + Width - 15, Top + Height / 5); - MainCanvas.lineTo(Left + Width - 5, Top + Height / 2); - MainCanvas.lineTo(Left + Width - 15, Top + Height - Height / 5); - MainCanvas.stroke(); - MainCanvas.closePath(); -} - - -/** - * - * @param {number} CamX - * @param {number} CamY - * @param {number} CamX_offset - * @param {number} CamY_offset - * @param {boolean} [Debug] - * @returns {any} - */ -function KDDrawMap(CamX, CamY, CamX_offset, CamY_offset, Debug) { - let tooltip = ""; - let KinkyDungeonForceRender = ""; - let KinkyDungeonForceRenderFloor = ""; - - for (let b of Object.values(KinkyDungeonPlayerBuffs)) { - if (b && b.mushroom) { - KinkyDungeonForceRender = '2'; - KinkyDungeonForceRenderFloor = "cry"; - } - } - - - let altType = KDGetAltType(MiniGameKinkyDungeonLevel); - let drawFloor = altType?.skin ? altType.skin : KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]; - - let noReplace = ""; - let noReplace_skin = {}; - for (let tile of Object.values(KinkyDungeonTilesSkin)) { - if (tile.skin && noReplace_skin[tile.skin] != undefined) { - let paramskin = KinkyDungeonMapParams[drawFloor]; - if (paramskin.noReplace) - noReplace_skin[tile.skin] = paramskin.noReplace; - else noReplace_skin[tile.skin] = ""; - } - } - - let params = KinkyDungeonMapParams[drawFloor]; - if (params.noReplace) - noReplace = params.noReplace; - // Draw the grid and tiles - let rows = KinkyDungeonGrid.split('\n'); - for (let R = -1; R <= KinkyDungeonGridHeightDisplay + 1; R++) { - for (let X = -1; X <= KinkyDungeonGridWidthDisplay + 1; X++) { - let RY = R+CamY; - let RX = X+CamX; - let allowFog = KDAllowFog(); - if (RY >= 0 && RY < KinkyDungeonGridHeight && RX >= 0 && RX < KinkyDungeonGridWidth && (KinkyDungeonVisionGet(RX, RY) > 0 || (allowFog && KinkyDungeonFogGet(RX, RY) > 0))) { - if (Debug) { - if ( KinkyDungeonTilesGet(RX + "," + RY)) { - if (KinkyDungeonTilesGet(RX + "," + RY).Lock) - DrawTextFitKD(KinkyDungeonTilesGet(RX + "," + RY).Lock, (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, "#aaaaaA"); - - if (KinkyDungeonTilesGet(RX + "," + RY).AI) - DrawTextFitKD(KinkyDungeonTilesGet(RX + "," + RY).AI, (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, "#aaaaaA"); - - if (KinkyDungeonTilesGet(RX + "," + RY).Type == "Prisoner") - DrawTextFitKD("Prisoner", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, "#aaaaaA"); - - if (KinkyDungeonTilesGet(RX + "," + RY).required && KinkyDungeonTilesGet(RX + "," + RY).required) - DrawTextFitKD(KinkyDungeonTilesGet(RX + "," + RY).required[0], (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#aaaaaA"); - - if (KinkyDungeonTilesGet(RX + "," + RY).Label && KinkyDungeonTilesGet(RX + "," + RY).required) - DrawTextFitKD(KinkyDungeonTilesGet(RX + "," + RY).required[0], (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/1.5, KinkyDungeonGridSizeDisplay, "#aaaaaA"); - - if (KinkyDungeonTilesGet(RX + "," + RY).OffLimits) - DrawTextFitKD("OffLimits", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#ff5555"); - if (KinkyDungeonTilesGet(RX + "," + RY).Priority) - DrawTextFitKD("Priority", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay*0.67, KinkyDungeonGridSizeDisplay, "#55ff55"); - } - - for (let p of KinkyDungeonPOI) { - if (p.x == RX && p.y == RY) { - DrawTextFitKD("POI" + (p.requireTags && p.requireTags.includes("endpoint") ? "Endpoint" : ""), (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#999999"); - DrawTextFitKD((p.favor && p.favor.length > 0 ? p.favor[0] : ""), (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, "#999999"); - DrawTextFitKD((p.chance || 1.0) * 100 + "%", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#999999"); - } - } - for (let p of KDGameData.KeyringLocations) { - if (p.x == RX && p.y == RY) { - DrawTextFitKD("Keyring", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#999999"); - } - } - } - let floor = KinkyDungeonTilesSkin[RX + "," + RY] ? - (KinkyDungeonTilesSkin[RX + "," + RY].force ? KinkyDungeonTilesSkin[RX + "," + RY].skin : KinkyDungeonMapIndex[KinkyDungeonTilesSkin[RX + "," + RY].skin]) - : drawFloor; - let vision = KinkyDungeonVisionGet(RX, RY); - let nR = KinkyDungeonTilesSkin[RX + "," + RY] ? noReplace : noReplace_skin[floor]; - let sprite = KinkyDungeonGetSprite(rows[RY][RX], RX, RY, vision == 0, nR); - let sprite2 = KinkyDungeonGetSpriteOverlay(rows[RY][RX], RX, RY, vision == 0, nR); - let sprite3 = KinkyDungeonGetSpriteOverlay2(rows[RY][RX], RX, RY, vision == 0, nR); - if (KinkyDungeonForceRender) { - sprite = KinkyDungeonGetSprite(KinkyDungeonForceRender, RX, RY, vision == 0, nR); - sprite2 = null; - sprite3 = null; - } - if (KinkyDungeonForceRenderFloor != "") floor = KinkyDungeonForceRenderFloor; - let light = KinkyDungeonBrightnessGet(RX, RY); - let lightColor = KDAvgColor(KinkyDungeonColorGet(RX, RY), KinkyDungeonShadowGet(RX, RY), light, 1); - lightColor = KDAvgColor(lightColor, 0xffffff, 1, 1); // Brighten - - KDDraw(kdgameboard, kdpixisprites, RX + "," + RY, KinkyDungeonRootDirectory + "Floors/Floor_" + floor + "/" + sprite + ".png", - (-CamX_offset + X)*KinkyDungeonGridSizeDisplay, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: -2, - tint: lightColor, - }); - if (sprite2) - KDDraw(kdgameboard, kdpixisprites, RX + "," + RY + "_o", KinkyDungeonRootDirectory + "FloorGeneric/" + sprite2 + ".png", - (-CamX_offset + X)*KinkyDungeonGridSizeDisplay, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: -1.1, - tint: lightColor, - }); - - if (sprite3) - KDDraw(kdgameboard, kdpixisprites, RX + "," + RY + "_o2", KinkyDungeonRootDirectory + "FloorGeneric/" + sprite3 + ".png", - (-CamX_offset + X)*KinkyDungeonGridSizeDisplay, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: -1, - tint: lightColor, - }); - - if (rows[RY][RX] == "A") { - let color = ""; - if (KinkyDungeonTilesGet(RX + "," + RY)) { - color = KDGoddessColor(KinkyDungeonTilesGet(RX + "," + RY).Name); - } - if (color) - KDDraw(kdgameboard, kdpixisprites, RX + "," + RY + "_a", KinkyDungeonRootDirectory + "ShrineAura.png", - (-CamX_offset + X)*KinkyDungeonGridSizeDisplay, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - tint: string2hex(color), - }); - } - if (KinkyDungeonVisionGet(RX, RY) > 0 - && (KinkyDungeonTilesGet(RX + "," + RY) && rows[RY][RX] == "A" || KinkyDungeonTilesGet(RX + "," + RY) && rows[RY][RX] == "M") - && MouseIn(canvasOffsetX + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay)) { - tooltip = TextGet("KinkyDungeon" + KinkyDungeonTilesGet(RX + "," + RY).Type + "Tooltip").replace("SHRINETYPE", TextGet("KinkyDungeonShrine" + KinkyDungeonTilesGet(RX + "," + RY).Name)); - } - } - } - } - - return { - tooltip: tooltip, - KinkyDungeonForceRender: KinkyDungeonForceRender, - }; -} - -/** - * - * @param {any} Container - * @param {Map} Map - * @param {string} Image - * @param {number} Left - * @param {number} Top - * @param {number} Width - * @param {number} Height - * @param {number} [Rotation] - * @param {any} [options] - * @param {boolean} [Centered] - * @returns {boolean} - */ -function KDDraw(Container, Map, id, Image, Left, Top, Width, Height, Rotation, options, Centered) { - let sprite = Map.get(id); - if (!sprite) { - // Load the texture - let tex = KDTex(Image); - - if (tex) { - // Create the sprite - // @ts-ignore - sprite = PIXI.Sprite.from(tex); - Map.set(id, sprite); - // Add it to the container - Container.addChild(sprite); - } - } - if (sprite) { - // Modify the sprite according to the params - let tex = KDTex(Image); - if (tex) sprite.texture = tex; - sprite.name = id; - sprite.position.x = Left; - sprite.position.y = Top; - if (Width) - sprite.width = Width; - if (Height) - sprite.height = Height; - if (Centered) { - sprite.anchor.set(0.5); - } - if (Rotation) - sprite.rotation = Rotation; - if (options) { - for (let o of Object.entries(options)) { - sprite[o[0]] = o[1]; - } - } - kdSpritesDrawn.set(id, true); - return true; - } - return false; -} - -/** - * Returns a PIXI.Texture, or null if there isnt one - * @param {string} Image - * @returns {any} - */ -function KDTex(Image) { - if (kdpixitex.has(Image)) return kdpixitex.get(Image); - let img = DrawGetImage(Image); - if (img) { - // @ts-ignore - let tex = PIXI.Texture.from(img); - kdpixitex.set(Image, tex); - return tex; - } - return null; -} - -/** - * - * @param {string} str - * @returns - */ -function string2hex(str) { - // @ts-ignore - return PIXI.utils.string2hex(str); -} - -function GetAdjacentList(list, index, width) { - return { - left: list.slice(0, index), - right: list.slice(index+width), - } -} - -function KDUpdateVision() { - KinkyDungeonUpdateLightGrid = false; - - let viewpoints = [ {x: KinkyDungeonPlayerEntity.x, y:KinkyDungeonPlayerEntity.y, brightness: KinkyDungeonDeaf ? 2 : 4 }]; - - let data = { - lights: [], - maplights: [], - }; - let l = null; - for (let t of Object.keys(KinkyDungeonTiles)) { - let tile = KinkyDungeonTilesGet(t); - let x = parseInt(t.split(',')[0]); - let y = parseInt(t.split(',')[1]); - if (tile && tile.Light && x && y) { - l = {x: x, y:y + (tile.Offset ? 1 : 0), y_orig: y, brightness: tile.Light, color: tile.lightColor}; - data.lights.push(l); - data.maplights.push(l); - } - } - for (let b of KinkyDungeonBullets) { - if (b.bullet?.bulletColor) { - l = {x: b.x, y:b.y, y_orig: b.y, brightness: b.bullet.bulletLight, color: b.bullet.bulletColor}; - data.lights.push(l); - } - } - KinkyDungeonSendEvent("getLights", data); - KinkyDungeonMakeBrightnessMap(KinkyDungeonGridWidth, KinkyDungeonGridHeight, KinkyDungeonMapBrightness, data.lights, KDVisionUpdate); - KinkyDungeonMakeVisionMap(KinkyDungeonGridWidth, KinkyDungeonGridHeight, viewpoints, data.lights, KDVisionUpdate, KinkyDungeonMapBrightness); - KDVisionUpdate = 0; -} - - -let KDTileTooltips = { - '1': () => {return {color: "#ffffff", text: "1"};}, - '0': () => {return {color: "#ffffff", text: "0"};}, - '2': () => {return {color: "#ffffff", text: "2"};}, - 'R': () => {return {color: "#ffffff", noInspect: true, text: "R"};}, - 'Y': () => {return {color: "#ffffff", noInspect: true, text: "Y"};}, - 'L': () => {return {color: "#ffffff", noInspect: true, text: "L"};}, - 'A': () => {return {color: "#ffffff", noInspect: true, text: "A"};}, - 'a': () => {return {color: "#ffffff", text: "a"};}, - 'O': () => {return {color: "#ffffff", text: "O"};}, - 'o': () => {return {color: "#ffffff", text: "o"};}, - 'C': () => {return {color: "#ffffff", noInspect: true, text: "C"};}, - 'c': () => {return {color: "#ffffff", text: "c"};}, - 'T': () => {return {color: "#ffffff", text: "T"};}, - '4': () => {return {color: "#ffffff", noInspect: true, text: "4"};}, - 'X': () => {return {color: "#ffffff", text: "X"};}, - '?': () => {return {color: "#ffffff", noInspect: true, text: "Hook"};}, - ',': () => {return {color: "#ffffff", noInspect: true, text: "Hook"};}, - 'S': () => {return {color: "#ffffff", noInspect: true, text: "S"};}, - 's': () => {return {color: "#ffffff", noInspect: true, text: "s"};}, - 'H': () => {return {color: "#ffffff", noInspect: true, text: "H"};}, - 'G': () => {return {color: "#ffffff", noInspect: true, text: "G"};}, - 'B': () => {return {color: "#ffffff", noInspect: true, text: "B"};}, - '@': () => {return {color: "#ffffff", noInspect: true, text: "@"};}, - 'b': () => {return {color: "#ffffff", noInspect: true, text: "b"};}, - 'D': () => {return {color: "#ffffff", noInspect: true, text: "D"};}, - 'd': () => {return {color: "#ffffff", noInspect: true, text: "d"};}, - 'Z': () => {return {color: "#ffffff", noInspect: true, text: "Z"};}, - 'z': () => {return {color: "#ffffff", noInspect: true, text: "z"};}, - 't': () => {return {color: "#aa55ff", noInspect: true, text: "t"};}, - 'u': () => {return {color: "#ffffff", noInspect: true, text: "u"};}, - 'V': () => {return {color: "#ffffff", noInspect: true, text: "V"};}, - 'N': () => {return {color: "#ffffff", noInspect: true, text: "N"};}, -}; - - -function KDDrawTileTooltip(maptile, x, y, offset) { - let TooltipList = []; - TooltipList.push({ - str: TextGet("KDTileTooltip" + KDTileTooltips[maptile]().text), - fg: KDTileTooltips[maptile]().color, - bg: "#000000", - size: 24, - center: true, - }); - - - return KDDrawTooltip(TooltipList, offset); -} - - -let KDEffectTileTooltips = { - 'Runes': (tile, x, y, TooltipList) => { - TooltipList.push({ - str: TextGet("KDEffectTileTooltip" + tile.name), - fg: "#ff5555", - bg: "#000000", - size: 24, - center: true, - }); - TooltipList.push({ - str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), - fg: "#ffffff", - bg: "#000000", - size: 16, - center: true, - }); - }, - 'RunesTrap': (tile, x, y, TooltipList) => { - TooltipList.push({ - str: TextGet("KDEffectTileTooltip" + tile.name), - fg: "#92e8c0", - bg: "#000000", - size: 24, - center: true, - }); - TooltipList.push({ - str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), - fg: "#ffffff", - bg: "#000000", - size: 16, - center: true, - }); - }, - 'Inferno': (tile, x, y, TooltipList) => { - TooltipList.push({ - str: TextGet("KDEffectTileTooltip" + tile.name), - fg: "#ff8855", - bg: "#000000", - size: 24, - center: true, - }); - TooltipList.push({ - str: TextGet("KDEffectTileTooltip" + tile.name + "Desc").replace("DAMAGEDEALT", "" + Math.round(10 * KDGetEnvironmentalDmg())), - fg: "#ffaa55", - bg: "#000000", - size: 16, - center: true, - }); - }, - 'Ember': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffaa88");}, - 'Ice': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#88ffff");}, - 'Water': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#8888ff");}, - 'Vines': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#44ff44", "KDEffectTileTooltipCMDBindings");}, - 'Ropes': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffae70", "KDEffectTileTooltipCMDBindings");}, - 'Chains': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#aaaaaa", "KDEffectTileTooltipCMDBindings");}, - 'Belts': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#8f4d57", "KDEffectTileTooltipCMDBindings");}, - 'Fabric': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff5277", "KDEffectTileTooltipCMDBindings");}, - 'FabricGreen': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#63ab3f", "KDEffectTileTooltipCMDBindings");}, - 'Slime': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#d952ff", "KDEffectTileTooltipCMDSlime");}, - 'Latex': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#d952ff");}, - 'Steam': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}, - 'Smoke': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#888888");}, - 'Torch': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}, - 'TorchUnlit': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}, - 'Lantern': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}, - 'LanternUnlit': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}, - 'IllusOrb': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}, - 'IllusOrbDead': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}, - 'TorchOrb': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}, - 'Cracked': (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff8844");}, -}; -/** - * - * @param {effectTile} tile - * @param {any[]} TooltipList - * @param {string} color - * @param {string} [extra] - * @param {string} [descColor] - * @param {string} [extraColor] - */ -function KDETileTooltipSimple(tile, TooltipList, color, extra, descColor = "#ffffff", extraColor = "#ffffff") { - TooltipList.push({ - str: TextGet("KDEffectTileTooltip" + tile.name), - fg: color, - bg: "#000000", - size: 24, - center: true, - }); - TooltipList.push({ - str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), - fg: descColor, - bg: "#000000", - size: 16, - center: true, - }); - if (extra) { - TooltipList.push({ - str: TextGet(extra), - fg: extraColor, - bg: "#000000", - size: 16, - center: true, - }); - } -} - -function KDDrawEffectTileTooltip(tile, x, y, offset) { - let TooltipList = []; - KDEffectTileTooltips[tile.name](tile, x, y, TooltipList); - - return KDDrawTooltip(TooltipList, offset); -} - -function KDDrawTooltip(TooltipList, offset) { - let TooltipWidth = 300; - let TooltipHeight = 0; - let extra = 5; - for (let listItem of TooltipList) { - TooltipHeight += listItem.size + extra; - } - TooltipHeight = Math.max(20, TooltipHeight); - let tooltipX = 2000 - 410 - TooltipWidth; - let tooltipY = 890 - TooltipHeight - offset; - let YY = 0; - - FillRectKD(kdcanvas, kdpixisprites, "inspectTooltip" + offset, { - Left: tooltipX, - Top: tooltipY - 25, - Width: TooltipWidth, - Height: TooltipHeight + 20, - Color: "#000000", - LineWidth: 1, - zIndex: 60, - alpha: 0.4, - }); - - let pad = 10; - - for (let listItem of TooltipList) { - DrawTextFitKD(listItem.str, - tooltipX + (listItem.center ? TooltipWidth/2 : pad), - tooltipY + YY, TooltipWidth - 2 * pad, listItem.fg, listItem.bg, - listItem.size, listItem.center ? "center" : "left", 61); - YY += extra + listItem.size; - } - return offset + TooltipHeight + 30; -} - -/** - * Elements which are temporary and drawn using a declarative style - * If not redrawn at the end of a frame, they will be removed - */ -let KDTempElements = new Map(); -/** - * Elements which are temporary and drawn using a declarative style - * If not redrawn at the end of a frame, they will be removed - */ -let KDDrawnElements = new Map(); - -/** - * Creates a text field with the specified params - * @param {string} Name - * @param {number} Left - * @param {number} Top - * @param {number} Width - * @param {number} Height - */ -function KDTextArea(Name, Left, Top, Width, Height) { - let Element = KDTempElements.get(Name); - let created = false; - if (!Element) { - ElementCreateTextArea(Name); - Element = document.getElementById(Name); - KDTempElements.set(Name, Element) - if (Element) created = true; - } - KDElementPosition(Name, Left, Top, Width, Height); - KDDrawnElements.set(Name, Element) - return {Element: Element, Created: created} -} - -/** - * Creates a text field with the specified params - * @param {string} Name - * @param {number} Left - * @param {number} Top - * @param {number} Width - * @param {number} Height - * @param {string} Type - * @param {string} Value - * @param {string} MaxLength - */ -function KDTextField(Name, Left, Top, Width, Height, Type = "text", Value = "", MaxLength = "30") { - let Element = KDTempElements.get(Name); - let created = false; - if (!Element) { - ElementCreateInput(Name, Type, Value, MaxLength); - Element = document.getElementById(Name); - KDTempElements.set(Name, Element) - if (Element) created = true; - } - KDElementPosition(Name, Left, Top, Width, Height); - KDDrawnElements.set(Name, Element) - return {Element: Element, Created: created} -} - - -/** - * Culls the text fields and other DOM elements created - */ -function KDCullTempElements() { - for (let Name of KDTempElements.keys()) { - if (!KDDrawnElements.get(Name)) { - ElementRemove(Name); - KDTempElements.delete(Name); - } - } - - KDDrawnElements = new Map(); -} - - -/** - * Draws an existing HTML element at a specific position within the document. The element is "centered" on the given coordinates by dividing its height and width by two. - * @param {string} ElementID - The id of the input tag to (re-)position. - * @param {number} X - Center point of the element on the X axis. - * @param {number} Y - Center point of the element on the Y axis. - * @param {number} W - Width of the element. - * @param {number} [H] - Height of the element. - * @returns {void} - Nothing - */ -function KDElementPosition(ElementID, X, Y, W, H) { - var E = document.getElementById(ElementID); - - if (!E) { - console.warn("A call to ElementPosition was made on non-existent element with ID '" + ElementID + "'"); - return; - } - - // For a vertical slider, swap the width and the height (the transformation is handled by CSS) - if (E.tagName.toLowerCase() === "input" && E.getAttribute("type") === "range" && E.classList.contains("Vertical")) { - var tmp = W; - W = H; - H = tmp; - } - - // Different positions based on the width/height ratio - const HRatio = MainCanvas.canvas.clientHeight / 1000; - const WRatio = MainCanvas.canvas.clientWidth / 2000; - const Font = MainCanvas.canvas.clientWidth <= MainCanvas.canvas.clientHeight * 2 ? MainCanvas.canvas.clientWidth / 50 : MainCanvas.canvas.clientHeight / 25; - const Height = H ? H * HRatio : Font * 1.1; - const Width = W * WRatio; - const Top = MainCanvas.canvas.offsetTop + Y * HRatio - 4; - const Left = MainCanvas.canvas.offsetLeft + (X) * WRatio + 4; - - // Sets the element style - Object.assign(E.style, { - fontSize: Font + "px", - fontFamily: CommonGetFontName(), - position: "fixed", - left: Left + "px", - top: Top + "px", - width: Width + "px", - height: Height + "px", - display: "inline" - }); -} - -/** Whether or not to show the quick inv - * @returns {boolean} -*/ -function KDShowQuickInv() { - return KinkyDungeonShowInventory || (KDGameData.CurrentDialog && KDDialogue[KDGameData.CurrentDialog] && KDDialogue[KDGameData.CurrentDialog].inventory); -} - -let KDUpdateFog = false; -let KDLastCamPos = {x: 0, y: 0}; \ No newline at end of file diff --git a/Game/KinkyDungeonDress.js b/Game/KinkyDungeonDress.js deleted file mode 100644 index c8af529b5..000000000 --- a/Game/KinkyDungeonDress.js +++ /dev/null @@ -1,579 +0,0 @@ -"use strict"; - - -// For cacheing -let KinkyDungeonOutfitCache = new Map(); - -/**@type {string[]} Contains protected zones*/ -let KDProtectedCosplay = []; - -function KDOutfit(item) { - return KinkyDungeonOutfitCache.get(item.name); -} - -function KinkyDungeonRefreshOutfitCache() { - KinkyDungeonOutfitCache = new Map(); - for (let r of KinkyDungeonOutfitsBase) { - KinkyDungeonOutfitCache.set(r.name, r); - } -} - -/** - * These priorities override the default BC - * @type {Record>} - */ -let KDClothOverrides = { - "Cloth": { - "SleevelessTop": 24.9, - }, -}; - -// Default dress (witch hat and skirt and corset) -/** @type {KinkyDungeonDress} */ -let KinkyDungeonDefaultDefaultDress = [ - {Item: "WitchHat1", Group: "Hat", Color: "Default", Lost: false}, - {Item: "LeatherCorsetTop1", Group: "Cloth", Color: "Default", Lost: false}, - {Item: "LatexSkirt1", Group: "ClothLower", Color: "Default", OverridePriority: 17, Lost: false, Skirt: true}, - {Item: "Socks4", Group: "Socks", Color: "#444444", Lost: false}, - {Item: "Heels3", Group: "Shoes", Color: "#222222", Lost: false}, - {Item: "KittyPanties1", Group: "Panties", Color: "#222222", Lost: false}, - {Item: "FullLatexBra", Group: "Bra", Color: "Default", Lost: false}, - {Item: "LatexElbowGloves", Group: "Gloves", Color: "Default", Lost: false}, - {Item: "Necklace4", Group: "Necklace", Color: "#222222", Lost: false}, -]; - -// This is a flag that checks if the script should check for clothes loss -let KinkyDungeonCheckClothesLoss = false; - -// Return all dresses so theres no longer any Lost items -function KinkyDungeonInitializeDresses() { - KinkyDungeonCheckClothesLoss = true; - KinkyDungeonUndress = 0; - if (Object.values(KinkyDungeonDresses).length > 0) { - for (let d of Object.values(KinkyDungeonDresses)) { - for (let dd of d) { - if (dd.Lost) dd.Lost = false; - } - } - } - -} - -let KinkyDungeonNewDress = false; - -// Sets the player's dress to whatever she is wearing -function KinkyDungeonDressSet() { - if (KinkyDungeonNewDress) { - KinkyDungeonDresses.Default = []; - let C = KinkyDungeonPlayer; - for (let A = 0; A < C.Appearance.length; A++) { - let save = false; - if (C.Appearance[A].Asset.Group.BodyCosplay || C.Appearance[A].Asset.BodyCosplay) save = true; - else if (C.Appearance[A].Asset.Group.Underwear) save = true; - else if (C.Appearance[A].Asset.Group.Clothing) save = true; - if (save) { - KinkyDungeonDresses.Default.push({ - Item: C.Appearance[A].Asset.Name, - Group: C.Appearance[A].Asset.Group.Name, - Property: C.Appearance[A].Property, - Color: (C.Appearance[A].Color) ? C.Appearance[A].Color : (C.Appearance[A].Asset.DefaultColor ? C.Appearance[A].Asset.DefaultColor : "Default"), - Lost: false, - },); - } - } - } - KinkyDungeonNewDress = false; -} - -function KinkyDungeonSetDress(Dress, Outfit) { - if (Outfit) KDGameData.Outfit = Outfit; - KinkyDungeonCurrentDress = Dress; - if (KinkyDungeonDresses) { - for (let clothes of KinkyDungeonDresses[KinkyDungeonCurrentDress]) { - clothes.Lost = false; - } - KinkyDungeonCheckClothesLoss = true; - KinkyDungeonDressPlayer(); - KDRefresh = true; - } -} - -let KDNaked = false; -let KDRefresh = false; - -/** - * It sets the player's appearance based on their stats. - */ -function KinkyDungeonDressPlayer() { - let _CharacterRefresh = CharacterRefresh; - let _CharacterAppearanceBuildCanvas = CharacterAppearanceBuildCanvas; - // @ts-ignore - CharacterRefresh = () => {KDRefresh = true;}; - // @ts-ignore - CharacterAppearanceBuildCanvas = () => {}; - let restraints = []; - - try { - let data = { - updateRestraints: false, - updateDress: false, - updateExpression: false, - }; - - // @ts-ignore - KinkyDungeonPlayer.OnlineSharedSettings = {BlockBodyCosplay: true}; - if (!KDNaked) KDCharacterNaked(); - - // if true, nakeds the player, then reclothes - if (KinkyDungeonCheckClothesLoss) { - // We refresh all the restraints - - // First we remove all restraints and clothes - let clothGroups = {}; - for (let cloth of KinkyDungeonDresses[KinkyDungeonCurrentDress]) { - clothGroups[cloth.Group] = true; - } - let newAppearance = {}; - for (let A = 0; A < KinkyDungeonPlayer.Appearance.length; A++) { - let asset = KinkyDungeonPlayer.Appearance[A].Asset; - if (!asset.Group.Name.startsWith("Item") && !clothGroups[asset.Group.Name]) { - //KinkyDungeonPlayer.Appearance.splice(A, 1); - //A -= 1; - newAppearance[asset.Group.Name] = KinkyDungeonPlayer.Appearance[A]; - } - } - KinkyDungeonPlayer.Appearance = Object.values(newAppearance); - - //KinkyDungeonPlayer.Appearance = []; - - - // Next we revisit all the player's restraints - for (let inv of KinkyDungeonAllRestraint()) { - let renderTypes = KDRestraint(inv).shrine; - KDApplyItem(inv, KinkyDungeonPlayerTags); - restraints.push(inv); - if (inv.dynamicLink) { - let link = inv.dynamicLink; - for (let I = 0; I < 30; I++) { - if (KDRestraint(link).alwaysRender || (KDRestraint(link).renderWhenLinked && KDRestraint(link).renderWhenLinked.some((element) => {return renderTypes.includes(element);}))) { - KDApplyItem(link, KinkyDungeonPlayerTags); - restraints.push(link); - } - if (link.dynamicLink) { - link = link.dynamicLink; - } else I = 1000; - } - } - } - - data.updateRestraints = true; - KDNaked = true; - KinkyDungeonUndress = 0; - } - - let alreadyClothed = {}; - - for (let A = 0; A < KinkyDungeonPlayer.Appearance.length; A++) { - let asset = KinkyDungeonPlayer.Appearance[A].Asset; - alreadyClothed[asset.Group.Name] = true; - } - - for (let clothes of KinkyDungeonDresses[KinkyDungeonCurrentDress]) { - if (alreadyClothed[clothes.Group]) continue; - data.updateDress = true; - if (!clothes.Lost && KinkyDungeonCheckClothesLoss) { - if (clothes.Group == "Necklace") { - if (KinkyDungeonGetRestraintItem("ItemTorso") && KDRestraint(KinkyDungeonGetRestraintItem("ItemTorso")).harness) clothes.Lost = true; - if (KinkyDungeonGetRestraintItem("ItemArms") && InventoryGroupIsBlockedForCharacter(KinkyDungeonPlayer, "ItemBreast")) clothes.Lost = true; - } - //if (clothes.Group == "Bra" && !clothes.NoLose) { - //if (KinkyDungeonGetRestraintItem("ItemBreast")) clothes.Lost = true; - //} - if (clothes.Group == "Panties" && !clothes.NoLose) { - if (KinkyDungeonGetRestraintItem("ItemPelvis") && KinkyDungeonGetRestraintItem("ItemPelvis") && KDRestraint(KinkyDungeonGetRestraintItem("ItemPelvis")).chastity) clothes.Lost = true; - } - if (clothes.Group == "ClothLower" && clothes.Skirt) { - if (KinkyDungeonGetRestraintItem("ItemPelvis")) clothes.Lost = true; - if (InventoryGroupIsBlockedForCharacter(KinkyDungeonPlayer, "ItemLegs")) clothes.Lost = true; - if (InventoryGroupIsBlockedForCharacter(KinkyDungeonPlayer, "ClothLower")) clothes.Lost = true; - } - if (clothes.Group == "Shoes") { - if (KinkyDungeonGetRestraintItem("ItemBoots")) clothes.Lost = true; - } - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).remove) { - for (let remove of KDRestraint(inv).remove) { - if (remove == clothes.Group) clothes.Lost = true; - } - } - } - - if (clothes.Lost) KinkyDungeonUndress += 1/KinkyDungeonDresses[KinkyDungeonCurrentDress].length; - } - - if (!clothes.Lost) { - if (KinkyDungeonCheckClothesLoss) { - let item = KDInventoryWear(clothes.Item, clothes.Group, undefined, clothes.Color); - alreadyClothed[clothes.Group] = true; - if (clothes.OverridePriority) { - if (item) { - if (!item.Property) item.Property = {OverridePriority: clothes.OverridePriority}; - else item.Property.OverridePriority = clothes.OverridePriority; - } - } else if (KDClothOverrides[clothes.Group] && KDClothOverrides[clothes.Group][clothes.Item] != undefined) { - if (!item.Property) item.Property = {OverridePriority: KDClothOverrides[clothes.Group][clothes.Item]}; - else item.Property.OverridePriority = KDClothOverrides[clothes.Group][clothes.Item]; - } - if (clothes.Property) item.Property = clothes.Property; - // Ignored because BC uses string[] as a type! - // @ts-ignore - //KDCharacterAppearanceSetColorForGroup(KinkyDungeonPlayer, clothes.Color, clothes.Group); - } - } - - if (clothes.Group == "Panties" && !KinkyDungeonGetRestraintItem("ItemPelvis")) clothes.Lost = false; // A girl's best friend never leaves her - if (clothes.Group == "Bra" && !KinkyDungeonGetRestraintItem("ItemBreast")) clothes.Lost = false; // A girl's best friend never leaves her - } - - for (let inv of KinkyDungeonAllRestraint()) { - if (KinkyDungeonCheckClothesLoss) - if (KDRestraint(inv).AssetGroup && (!KDRestraint(inv).armor || KDToggles.DrawArmor)) { - KDInventoryWear(KDRestraint(inv).Asset, KDRestraint(inv).AssetGroup, undefined, KDRestraint(inv).Color); - } - } - if (KinkyDungeonCheckClothesLoss) - KinkyDungeonWearForcedClothes(restraints); - - KinkyDungeonCheckClothesLoss = false; - - if (KDGameData.KneelTurns > 0 || KDGameData.SleepTurns > 0) { - if (CharacterItemsHavePoseAvailable(KinkyDungeonPlayer, "BodyLower", "Kneel") && !CharacterDoItemsSetPose(KinkyDungeonPlayer, "Kneel") && !KinkyDungeonPlayer.IsKneeling()) { - CharacterSetActivePose(KinkyDungeonPlayer, "Kneel", false); - } - } else if (KDGameData.SleepTurns < 1) { - if (CharacterItemsHavePoseAvailable(KinkyDungeonPlayer, "BodyLower", "Kneel") && !CharacterDoItemsSetPose(KinkyDungeonPlayer, "Kneel") && KinkyDungeonPlayer.IsKneeling()) { - CharacterSetActivePose(KinkyDungeonPlayer, "BaseLower", false); - } - } - - let BlushCounter = 0; - let Blush = ""; - let Eyes = ""; - let Eyes2 = ""; - let Eyebrows = ""; - let Mouth = ""; - let Fluids = ""; - - if (KDToggles.Drool && !KinkyDungeonCanTalk()) { - if (SpeechGetTotalGagLevel(KinkyDungeonPlayer) > 8) Fluids = "DroolMessy"; - else if (SpeechGetTotalGagLevel(KinkyDungeonPlayer) > 4) Fluids = "DroolMedium"; - else Fluids = "DroolLow"; - } - if (KDToggles.Drool && KDGameData.KinkyDungeonLeashedPlayer > 0) { - if (Fluids.includes("Drool")) Fluids = Fluids.replace("Drool", "DroolTears"); - else Fluids = "TearsHigh"; - } - - if (KinkyDungeonSleepiness) { - Eyes = "Dazed"; - } - - if (KinkyDungeonStatMana < KinkyDungeonStatManaMax*0.45) Eyes = "Sad"; - if (KinkyDungeonStatWill <= KinkyDungeonStatWillMax*0.33 || KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax/2) Eyes = "Dazed"; - - if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.167 || KinkyDungeonStatMana < KinkyDungeonStatManaMax*0.33 || KinkyDungeonStatWill < KinkyDungeonStatWillMax*0.33) Eyebrows = "Soft"; - - let chastityMult = KinkyDungeonChastityMult(); - if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.67 && KinkyDungeonStatWill > KinkyDungeonStatWillMax*0.5 && chastityMult > 0.9) Eyebrows = "Angry"; - - if (KinkyDungeonStatDistraction >= KinkyDungeonStatDistractionMax * 0.8) Eyes = (Eyebrows != "Angry" && KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax * 0.99) ? "Lewd" : "Scared"; - - if (KinkyDungeonStatDistraction >= 0.01 && KinkyDungeonStatDistraction <= 3) Eyes2 = "Closed"; - - if (KDGameData.OrgasmTurns > 0) { - Eyebrows = "Soft"; - Eyes2 = ""; - Eyes = "LewdHeart"; - } else if (KDGameData.OrgasmStamina > 0) { - Eyebrows = "Soft"; - } else if (KDGameData.OrgasmStage > 5 && Math.random() < 0.33) { - Eyebrows = "Angry"; - } else if (KDGameData.OrgasmStage > 3 && Math.random() < 0.33) { - Eyebrows = "Angry"; - } - - if (KinkyDungeonStatWill <= 2) { - Eyes = "Dazed"; - Eyes2 = ""; - } - - if (KinkyDungeonStatDistraction > 0.01) BlushCounter += 1; - if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.33) BlushCounter += 1; - if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.65) BlushCounter += 1; - - if (KinkyDungeonUndress > 0.4) BlushCounter += 1; - if (KinkyDungeonUndress > 0.8) BlushCounter += 1; - - if (BlushCounter == 1) Blush = "Low"; - else if (BlushCounter == 2) Blush = "Medium"; - else if (BlushCounter == 3) Blush = "High"; - else if (BlushCounter == 4) Blush = "VeryHigh"; - else if (BlushCounter == 5) Blush = "Extreme"; - - - for (let A = 0; A < KinkyDungeonPlayer.Appearance.length; A++) { - if (KinkyDungeonPlayer.Appearance[A].Asset.Group.Name == "Blush") { - let property = KinkyDungeonPlayer.Appearance[A].Property; - if (!property || property.Expression != Blush) { - KinkyDungeonPlayer.Appearance[A].Property = { Expression: Blush }; - KDRefresh = true; - data.updateExpression = true; - } - } - if (KinkyDungeonPlayer.Appearance[A].Asset.Group.Name == "Eyebrows") { - let property = KinkyDungeonPlayer.Appearance[A].Property; - if (!property || property.Expression != Eyebrows) { - KinkyDungeonPlayer.Appearance[A].Property = { Expression: Eyebrows }; - KDRefresh = true; - data.updateExpression = true; - } - } - if (KinkyDungeonPlayer.Appearance[A].Asset.Group.Name == "Mouth") { - let property = KinkyDungeonPlayer.Appearance[A].Property; - if (!property || property.Expression != Mouth) { - KinkyDungeonPlayer.Appearance[A].Property = { Expression: Mouth }; - KDRefresh = true; - data.updateExpression = true; - } - } - if (KinkyDungeonPlayer.Appearance[A].Asset.Group.Name == "Fluids") { - let property = KinkyDungeonPlayer.Appearance[A].Property; - if (!property || property.Expression != Fluids) { - KinkyDungeonPlayer.Appearance[A].Property = { Expression: Fluids }; - KDRefresh = true; - data.updateExpression = true; - } - } - if (KinkyDungeonPlayer.Appearance[A].Asset.Group.Name == "Eyes" || KinkyDungeonPlayer.Appearance[A].Asset.Group.Name == "Eyes2") { - let property = KinkyDungeonPlayer.Appearance[A].Property; - if (!property || property.Expression != ((KinkyDungeonPlayer.Appearance[A].Asset.Group.Name == "Eyes2" && Eyes2) ? Eyes2 : Eyes)) { - KinkyDungeonPlayer.Appearance[A].Property = { Expression: ((KinkyDungeonPlayer.Appearance[A].Asset.Group.Name == "Eyes2" && Eyes2) ? Eyes2 : Eyes) }; - KDRefresh = true; - data.updateExpression = true; - } - } - - - } - - KinkyDungeonSendEvent("afterDress", data); - } finally { - // @ts-ignore - CharacterRefresh = _CharacterRefresh; - // @ts-ignore - CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; - } -} - -/** - * Initializes protected groups like ears and tail - */ -function KDInitProtectedGroups() { - KDProtectedCosplay = []; - // init protected slots - for (let a of KinkyDungeonPlayer.Appearance) { - if (a.Asset.Group.BodyCosplay){ - KDProtectedCosplay.push(a.Asset.Group.Name); - } - } -} - - - -/** - * If the player is wearing a restraint that has a `alwaysDress` property, and the player is not wearing the item specified - * in the `alwaysDress` property, the player will be forced to wear the items. - */ -/** - * - * @param {item[]} [restraints] - */ -function KinkyDungeonWearForcedClothes(restraints) { - if (!restraints) restraints = KinkyDungeonAllRestraint(); - for (let i = restraints.length - 1; i >= 0; i--) { - let inv = restraints[i]; - if (KDRestraint(inv).alwaysDress) { - KDRestraint(inv).alwaysDress.forEach(dress=>{ // for .. of loop has issues with iterations - if (dress.override || !dress.Group.includes("Item") || !InventoryGet(KinkyDungeonPlayer, dress.Group)) { - let canReplace = (dress.override!==null && dress.override===true) ? true : !InventoryGet(KinkyDungeonPlayer,dress.Group); - - if (!canReplace) {return;} - if (KDProtectedCosplay.includes(dress.Group)){return;} - let color = (typeof dress.Color === "string") ? [dress.Color] : dress.Color; - let faction = inv.faction; - if (inv.faction) - if (dress.factionColor && faction && KinkyDungeonFactionColors[faction]) { - for (let ii = 0; ii < dress.factionColor.length; ii++) { - for (let n of dress.factionColor[ii]) { - if (KinkyDungeonFactionColors[faction][ii]) - color[n] = KinkyDungeonFactionColors[faction][ii]; // 0 is the primary color - } - } - } - // @ts-ignore - if (dress.useHairColor && InventoryGet(KinkyDungeonPlayer, "HairFront")) color = InventoryGet(KinkyDungeonPlayer, "HairFront").Color; - let item = KDInventoryWear(dress.Item, dress.Group, inv.name, color); - - if (dress.OverridePriority) { - if (item) { - if (!item.Property) item.Property = {OverridePriority: dress.OverridePriority}; - else item.Property.OverridePriority = dress.OverridePriority; - } - } - - // @ts-ignore - //KDCharacterAppearanceSetColorForGroup(KinkyDungeonPlayer, color, dress.Group); - } - }); - } - } -} -function KDCharacterAppearanceSetColorForGroup(Player, Color, Group) { - let item = InventoryGet(Player, Group); - if (item) { - item.Color = Color; - } -} - -function KinkyDungeonGetOutfit(Name) { - if (KinkyDungeonOutfitCache && KinkyDungeonOutfitCache.get(Name)) { - let outfit = {}; - Object.assign(outfit, KinkyDungeonOutfitCache.get(Name)); - return outfit; - } - return null; -} - - -/** - * Makes the KinkyDungeonPlayer wear an item on a body area - * @param {string} AssetName - The name of the asset to wear - * @param {string} AssetGroup - The name of the asset group to wear - * @param {string} par - parent item - * @param {string | string[]} color - parent item - */ -function KDInventoryWear(AssetName, AssetGroup, par, color) { - const A = AssetGet(KinkyDungeonPlayer.AssetFamily, AssetGroup, AssetName); - if (!A) return; - let item = KDAddAppearance(KinkyDungeonPlayer, AssetGroup, A, color || A.DefaultColor); - //CharacterAppearanceSetItem(KinkyDungeonPlayer, AssetGroup, A, color || A.DefaultColor,0,-1, false); - CharacterRefresh(KinkyDungeonPlayer, true); - return item; -} - -function KDCharacterNaked() { - KDCharacterAppearanceNaked(); - CharacterRefresh(KinkyDungeonPlayer); -} - -/** - * Removes all items that can be removed, making the player naked. Checks for a blocking of CosPlayItem removal. - * @returns {void} - Nothing - */ -function KDCharacterAppearanceNaked() { - // For each item group (non default items only show at a 20% rate) - for (let A = KinkyDungeonPlayer.Appearance.length - 1; A >= 0; A--) - if (KinkyDungeonPlayer.Appearance[A].Asset.Group.AllowNone && - (KinkyDungeonPlayer.Appearance[A].Asset.Group.Category === "Appearance")){ - // conditional filter - let f = !(KinkyDungeonPlayer.Appearance[A].Asset.Group.BodyCosplay - && (KDProtectedCosplay.includes(KinkyDungeonPlayer.Appearance[A].Asset.Group.Name))); - if (!f){continue;} - KinkyDungeonPlayer.Appearance.splice(A, 1); - } - - // Loads the new character canvas - CharacterLoadCanvas(KinkyDungeonPlayer); -} - - -function KDApplyItem(inv, tags) { - // @ts-ignore - let _ChatRoomCharacterUpdate = ChatRoomCharacterUpdate; - // @ts-ignore - ChatRoomCharacterUpdate = () => {}; - try { - let restraint = KDRestraint(inv); - let AssetGroup = restraint.AssetGroup ? restraint.AssetGroup : restraint.Group; - let faction = inv.faction ? inv.faction : ""; - - let color = (typeof restraint.Color === "string") ? [restraint.Color] : Object.assign([], restraint.Color); - if (restraint.factionColor && faction && KinkyDungeonFactionColors[faction]) { - for (let i = 0; i < restraint.factionColor.length; i++) { - for (let n of restraint.factionColor[i]) { - if (KinkyDungeonFactionColors[faction][i]) - color[n] = KinkyDungeonFactionColors[faction][i]; // 0 is the primary color - } - } - } - - //let already = InventoryGet(KinkyDungeonPlayer, AssetGroup); - //let difficulty = already?.Property?.Difficulty || 0; - - /** @type {Item} */ - let placed = null; - - if (!restraint.armor || KDToggles.DrawArmor) { - placed = KDAddAppearance(KinkyDungeonPlayer, AssetGroup, AssetGet("3DCGFemale", AssetGroup, restraint.Asset), color, undefined, undefined, undefined, inv); - } - - if (placed) { - let type = restraint.Type; - if (restraint.changeRenderType && Object.keys(restraint.changeRenderType).some((k) => {return tags.has(k);})) { - let key = Object.keys(restraint.changeRenderType).filter((k) => {return tags.has(k);})[0]; - if (key) { - type = restraint.changeRenderType[key]; - } - } - placed.Property = {Type: type, Difficulty: restraint.power, LockedBy: inv.lock ? "MetalPadlock" : undefined}; - - /*if ((!already) && type) { - KinkyDungeonPlayer.FocusGroup = AssetGroupGet("Female3DCG", AssetGroup); - let options = window["Inventory" + ((AssetGroup.includes("ItemMouth")) ? "ItemMouth" : AssetGroup) + restraint.Asset + "Options"]; - if (!options) options = TypedItemDataLookup[`${AssetGroup}${restraint.Asset}`].options; // Try again - const option = options.find(o => o.Name === type); - ExtendedItemSetType(KinkyDungeonPlayer, options, option); - KinkyDungeonPlayer.FocusGroup = null; - }*/ - - if (restraint.Modules) { - let data = ModularItemDataLookup[AssetGroup + restraint.Asset]; - let asset = data.asset; - let modules = data.modules; - // @ts-ignore - placed.Property = ModularItemMergeModuleValues({ asset, modules }, restraint.Modules); - placed.Property.LockedBy = inv.lock ? "MetalPadlock" : undefined; - } else if (type) TypedItemSetOptionByName(KinkyDungeonPlayer, placed, type, false); - if (restraint.OverridePriority) { - placed.Property.OverridePriority = restraint.OverridePriority; - } - } - } finally { - // @ts-ignore - ChatRoomCharacterUpdate = _ChatRoomCharacterUpdate; - } - -} - - -function KinkyDungeonSendOutfitEvent(Event, data) { - if (!KDMapHasEvent(KDEventMapOutfit, Event)) return; - let outfit = KDOutfit({name: KinkyDungeonCurrentDress}); - if (outfit && outfit.events) { - for (let e of outfit.events) { - if (e.trigger == Event) { - KinkyDungeonHandleOutfitEvent(Event, e, outfit, data); - } - } - } -} \ No newline at end of file diff --git a/Game/KinkyDungeonDressList.js b/Game/KinkyDungeonDressList.js deleted file mode 100644 index bc12c1cc8..000000000 --- a/Game/KinkyDungeonDressList.js +++ /dev/null @@ -1,152 +0,0 @@ -"use strict"; - -// Outfit resource, uncached -let KinkyDungeonOutfitsBase = [ - {name: "OutfitDefault", dress: "Default", shop: false, rarity: 1},// To avoid breaking saves - {name: "Default", dress: "Default", shop: false, rarity: 1}, - {name: "JailUniform", dress: "JailUniform", shop: false, rarity: 1}, - {name: "Bast", dress: "Bast", shop: false, rarity: 1}, - {name: "Bountyhunter", dress: "Bountyhunter", shop: false, rarity: 1}, - {name: "Bikini", dress: "Bikini", shop: false, rarity: 1}, - {name: "Maid", dress: "Maid", shop: false, rarity: 2, events: [{trigger: "calcEvasion", type: "AccuracyBuff", requiredTag: "mold", power: 10.0}]}, - {name: "Dragon", dress: "Dragon", shop: false, rarity: 2}, - {name: "Elven", dress: "Elven", shop: false, rarity: 2}, - {name: "Wolfgirl", dress: "Wolfgirl", shop: false, rarity: 2}, - {name: "CyberDoll", dress: "CyberDoll", shop: false, rarity: 3}, - {name: "BlueSuitPrison", dress: "BlueSuitPrison", shop: false, rarity: 2}, - {name: "DollSuit", dress: "DollSuit", shop: false, rarity: 2}, - {name: "BlueSuit", dress: "BlueSuit", shop: false, rarity: 2}, - {name: "Obsidian", dress: "Obsidian", shop: false, rarity: 2}, -]; - -/** - * List off all dresses items - * @type {Record} - */ -let KinkyDungeonDresses = { - "Default" : KinkyDungeonDefaultDefaultDress, - "Prisoner" : [ - {Item: "SleevelessCatsuit", Group: "Suit", Color: "#8A120C", Lost: false}, - {Item: "CatsuitPanties", Group: "SuitLower", Color: "#8A120C", Lost: false}, - {Item: "Heels1", Group: "Shoes", Color: "#8A120C", Lost: false}, - {Item: "Socks4", Group: "Socks", Color: "#222222", Lost: false}, - ], - "GreenLeotard" : [ - {Item: "SleevelessCatsuit", Group: "Suit", Color: "#267237", Lost: false}, - {Item: "CatsuitPanties", Group: "SuitLower", Color: "#267237", Lost: false}, - ], - "Leotard" : [ - {Item: "SleevelessCatsuit", Group: "Suit", Color: "#53428D", Lost: false}, - {Item: "CatsuitPanties", Group: "SuitLower", Color: "#53428D", Lost: false}, - ], - "Bikini" : [ - {Item: "KittyPanties1", Group: "Panties", Color: "#050505", Lost: false}, - {Item: "FullLatexBra", Group: "Bra", Color: "Default", Lost: false}, - ], - "Lingerie" : [ - {Item: "LaceBabydoll", Group: "Cloth", Color: "Default", Lost: false}, - {Item: "Bandeau1", Group: "Bra", Color: "Default", Lost: false}, - {Item: "FloralPanties2", Group: "Panties", Color: ['#303030', '#F0F0F0'], Lost: false}, - ], - "LatexPrisoner" : [ - {Item: "LatexPanties2", Group: "Panties", Color: "Default", Lost: false}, - {Item: "LatexCorset1", Group: "Corset", Color: "Default", Lost: false}, - {Item: "FullLatexBra", Group: "Bra", Color: "Default", Lost: false}, - {Item: "Heels1", Group: "Shoes", Color: "#222222", Lost: false}, - {Item: "LatexSocks1", Group: "Socks", Color: "Default", Lost: false}, - ], - "Dungeon" : [ - {Item: "Bandeau1", Group: "Bra", Color: "Default", Lost: false}, - {Item: "Pantyhose1", Group: "SuitLower", Color: "Default", Lost: false}, - {Item: "Corset5", Group: "Corset", Color: "#777777", Lost: false}, - {Item: "AnkleStrapShoes", Group: "Shoes", Color: "#2D2D2D", Lost: false}, - {Item: "FloralPanties2", Group: "Panties", Color: ['#303030', '#F0F0F0'], Lost: false}, - ], - "Bast" : [ - {Item: "Sarashi1", Group: "Bra", Color: "Default", Lost: false}, - {Item: "Panties7", Group: "Panties", Color: "#ffffff", Lost: false}, - {Item: "Sandals", Group: "Shoes", Color: "Default", Lost: false}, - {Item: "FaceVeil", Group: "Mask", Color: "#ffffff", Lost: false}, - {Item: "HaremPants", Group: "ClothLower", Color: "Default", OverridePriority: 28, Lost: false}, - ], - "Dragon" : [ - {Item: "Sarashi1", Group: "Bra", Color: "#444444", Lost: false}, - {Item: "SunstripePanties1", Group: "Panties", Color: "#EC1515", Lost: false}, - {Item: "LatexAnkleShoes", Group: "Shoes", Color: "#AC1818", Lost: false}, - {Item: "Corset4", Group: "Corset", Color: "#AC1818", Lost: false}, - {Item: "LatexTop", Group: "Cloth", Color: "#AC1818", Lost: false}, - {Item: "GarterBelt2", Group: "Garters", Color: "Default", Lost: false}, - ], - "SlimeSuit" : [ - {Item: "SeamlessCatsuit", Group: "Suit", Color: "#7F3C9B", Lost: false}, - {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#7F3C9B", Lost: false}, - {Item: "Catsuit", Group: "Gloves", Color: "#7F3C9B", Lost: false}, - ], - "ProtoSlimeSuit" : [ - {Item: "SeamlessCatsuit", Group: "Suit", Color: "#404973", Lost: false}, - {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#404973", Lost: false}, - {Item: "Catsuit", Group: "Gloves", Color: "#404973", Lost: false}, - ], - "BlueSuit" : [ - {Item: "SeamlessCatsuit", Group: "Suit", Color: "#3873C3", Lost: false}, - {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#3873C3", Lost: false}, - {Item: "Catsuit", Group: "Gloves", Color: "#3873C3", Lost: false}, - ], - "DollSuit" : [ - {Item: "SeamlessCatsuit", Group: "Suit", Color: "#840d26", Lost: false}, - {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#840d26", Lost: false}, - {Item: "Catsuit", Group: "Gloves", Color: "#840d26", Lost: false}, - ], - "Bountyhunter" : [ - {Item: "SeamlessCatsuit", Group: "Suit", Color: "#222222", Lost: false}, - {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#222222", Lost: false}, - {Item: "Catsuit", Group: "Gloves", Color: "#222222", Lost: false}, - ], - "BlueSuitPrison" : [ - {Item: "SeamlessCatsuit", Group: "Suit", Color: "#3873C3", Lost: false}, - {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#3873C3", Lost: false}, - {Item: "Catsuit", Group: "Gloves", Color: "#3873C3", Lost: false}, - {Item: "FaceVeil", Group: "Mask", Color: "#ffffff", Lost: false}, - ], - "Wolfgirl" : [ - {Item: "PilotSuit", Group: "Suit", Color: ['#828FA2', '#323332', '#223525', '#383838', 'Default'], Lost: false}, - {Item: "PilotPanties", Group: "SuitLower", Color: ['#828FA2', '#323332', '#223525'], Lost: false}, - {Item: "LatexSocks1", Group: "Socks", Color: "#AAAAAA", Lost: false}, - ], - "CyberDoll" : [ - {Item: "PilotSuit", Group: "Suit", Color: ['#7e1972', '#222222', '#555555', '#222222', 'Default'], Lost: false}, - {Item: "PilotSuit", Group: "SuitLower", Color: ['#7e1972', '#222222', '#555555'], Lost: false}, - {Item: "PilotSuitGloves", Group: "Gloves", Color: ['#7e1972', '#222222', '#555555'], Lost: false}, - ], - "Maid" : [ - {Item: "SleevelessCatsuit", Group: "Suit", Color: "#aaaaaa", Lost: false}, - {Item: "MaidApron2", Group: "Cloth", Color: "Default", Lost: false}, - {Item: "FullLatexBra2", Group: "Bra", Color: ["#333333", "#aaaaaa"], Lost: false}, - {Item: "Pantyhose2", Group: "SuitLower", Color: "#939393", Lost: false}, - {Item: "LaceBands", Group: "Bracelet", Color: ['Default', '#151515'], Lost: false}, - {Item: "MageSkirt", Group: "ClothLower", Color: ["#676767", "#2E2E2E"], Lost: false}, - {Item: "Corset4", Group: "Corset", Color: "#4B4B4B", Lost: false}, - {Item: "Band1", Group: "Hat", Color: "#767676", Lost: false}, - {Item: "Shoes5", Group: "Shoes", Color: "#575757", Lost: false}, - {Item: "Socks6", Group: "Socks", Color: ['#080808', 'Default'], Lost: false}, - ], - "Elven" : [ - {Item: "Swimsuit1", Group: "Bra", Color: ['#E2E2E2'], Lost: false, NoLose: true}, - {Item: "Corset4", Group: "Corset", Color: ['#FFFFFF'], Lost: false}, - {Item: "Stockings4", Group: "Socks", Color: "#000000", Lost: false}, - {Item: "FaceVeil", Group: "Mask", Color: "Default", Lost: false}, - {Item: "HairFlower1", Group: "HairAccessory3", Color: 'Default', Lost: false}, - {Item: "NecklaceKey", Group: "Necklace", Color: "Default", Lost: false}, - {Item: "MageSkirt", Group: "ClothLower", Color: ['#40824F', '#AF9225'], OverridePriority: 27, Lost: false}, - {Item: "Heels1", Group: "Shoes", Color: "#aaaaaa", Lost: false}, - ], - "Obsidian" : [ - {Item: "SleevelessSlimLatexLeotard", Group: "Suit", Color: ['#4964A5'], Lost: false, NoLose: true}, - {Item: "LatexCorset1", Group: "Corset", Color: ['#4869BD'], Lost: false}, - {Item: "Stockings3", Group: "Socks", Color: "Default", Lost: false}, - {Item: "LatexTop", Group: "Cloth", Color: "#1F175F", Lost: false}, - {Item: "CatsuitPanties", Group: "Panties", Color: '#4964A5', Lost: false}, - {Item: "FuturisticHeels2", Group: "Shoes", Color: ['#1F175F', '#FFFFFF', '#333333', '#333333', '#7A7979', '#aaaaaa'], Lost: false}, - {Item: "LatexSkirt2", Group: "ClothLower", Color: ['#2C4A95'], OverridePriority: 27, Lost: false}, - ], -}; diff --git a/Game/KinkyDungeonEditor.js b/Game/KinkyDungeonEditor.js deleted file mode 100644 index 9c9d16af7..000000000 --- a/Game/KinkyDungeonEditor.js +++ /dev/null @@ -1,1331 +0,0 @@ -"use strict"; - - -let KDMapTilesListEditor = localStorage.getItem("KDMapTilesListEditor") ? JSON.parse(localStorage.getItem("KDMapTilesListEditor")) : Object.assign({}, KDMapTilesList); - -let KDTileToTest = null; - -// localStorage.setItem("KDMapTilesListEditor", JSON.stringify(KDMapTilesList)) - -function KDInitTileEditor() { - KDTE_Create(1, 1); -} - -let KDEditorTileIndex = 'lr'; -let KDEditorTileFlex = ""; -let KDEditorTileFlexSuper = ""; - -let KDEditorTileIndexQuery = '1,1'; - -/** - * @type {Record} - */ -let KDEditorTileIndexStore = { - "1,1": 'lr', -}; -/** - * @type {Record} - */ -let KDEditorTileFlexStore = { -}; -/** - * @type {Record} - */ -let KDEditorTileFlexSuperStore = { -}; - -let KDEditorCurrentMapTileName = 'test'; -let KDEditorCurrentMapTile = null; - -let KDTileIndices = { - 'udlr': true, - 'u': true, - 'd': true, - 'l': true, - 'r': true, - 'ud': true, - 'lr': true, - 'ul': true, - 'ur': true, - 'dl': true, - 'dr': true, - 'udl': true, - 'udr': true, - 'dlr': true, - 'ulr': true, -}; - -let KDEditorTileIndexHover = ''; -let KDEditorTileNameIndex = 0; - -let KDEditorTileBrush = 'Clear'; -let KDEditorTileBrushIndex = 0; -let KDEditorTileBrushIndex2 = 0; - -let KDTilePalette = { - 'Clear': {type: "clear", tile: '0'}, - 'Wall': {type: "tile", tile: '1'}, - '----Spawns----': {type: "none"}, - 'Spawn': {type: "tile", tile: 'G', special: {Type: "Spawn", required: []}}, - 'SpawnGuard': {type: "tile", tile: 'G', special: {Type: "Spawn", required: [], AI: "guard"}}, - 'Prisoner': {type: "tile", tile: 'G', special: {Type: "Prisoner"}}, - 'SpawnLooseGuard': {type: "tile", tile: 'G', special: {Type: "Spawn", required: [], AI: "looseguard"}}, - 'SpawnMiniboss': {type: "tile", tile: 'G', special: {Type: "Spawn", required: ["miniboss"], AI: "guard"}}, - 'SpawnBoss': {type: "tile", tile: 'G', special: {Type: "Spawn", required: ["boss"], AI: "guard"}}, - '----SpecifcSpawns----': {type: "none"}, - 'SpawnStatue': {type: "tile", tile: '3', special: {Type: "Spawn", required: ["statue"], Label: "Statue"}}, - 'SpawnObstacleDoor': {type: "tile", tile: 'G', special: {Type: "ForceSpawn", required: ["obstacledoor"], tags: ["obstacletile"], Label: "Door"}}, - 'SpawnSoulCrys': {type: "tile", tile: '3', special: {Type: "Spawn", required: ["soul"], tags: ["soul"], Label: "SoulC"}}, - 'SpawnSoulCrysActive': {type: "tile", tile: '3', special: {Type: "Spawn", required: ["soul", "active"], tags: ["soul"], Label: "SoulC_A"}}, - 'SpawnChaosCrysRare': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["chaos", "inactive"], tags: ["chaos"], Label: "ChaosC", Chance: 0.4}}, - 'SpawnChaosCrys': {type: "tile", tile: '3', special: {Type: "Spawn", required: ["chaos"], tags: ["chaos"], Label: "ChaosC"}}, - 'SpawnChaosCrysActive': {type: "tile", tile: '3', special: {Type: "Spawn", required: ["chaos", "active"], tags: ["chaos"], Label: "ChaosC_A"}}, - 'SpawnMushroom': {type: "tile", tile: '3', special: {Type: "Spawn", required: ["mushroom", "scenery"], tags: ["mushroom"], Label: "Mushroom"}}, - 'SpawnCustom': {type: "tile", tile: '3', special: {Type: "Spawn", required: [], Label: "Custom"}, customfields: { - required: {type: "array"}, - tags: {type: "array"}, - filterTags: {type: "array"}, - Label: {type: "string"}, - Chance: {type: "number"}, - AI: {type: "string"}, - force: {type: "boolean"}, - faction: {type: "string"}, - }}, - 'ForceSpawnCustom': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: [], Label: "Custom"}, customfields: { - required: {type: "array"}, - tags: {type: "array"}, - filterTags: {type: "array"}, - Label: {type: "string"}, - Chance: {type: "number"}, - AI: {type: "string"}, - force: {type: "boolean"}, - faction: {type: "string"}, - }}, - '----Tiles----': {type: "none"}, - 'Brick': {type: "tile", tile: '2'}, - 'Doodad': {type: "tile", tile: 'X'}, - 'Grate': {type: "tile", tile: 'g'}, - 'Bars': {type: "tile", tile: 'b'}, - 'Bed': {type: "tile", tile: 'B'}, - 'Crack': {type: "tile", tile: '4'}, - 'WallHook': {type: "tile", tile: ','}, - 'CeilingHook': {type: "tile", tile: '?'}, - 'InactiveTablet': {type: "tile", tile: 'm'}, - 'BrokenShrine': {type: "tile", tile: 'a'}, - 'BrokenOrb': {type: "tile", tile: 'o'}, - 'BrokenCharger': {type: "tile", tile: '-'}, - '----Doors----': {type: "none"}, - 'Door': {type: "tile", tile: 'd', special: {Type: "Door"}}, - 'DoorAlways': {type: "tile", tile: 'D', special: {Type: "Door", Priority: true, AlwaysClose: true}}, - 'Door_RedLock': {type: "tile", tile: 'D', special: {Type: "Door", Priority: true, AlwaysClose: true, Lock: "Red"}}, - 'Door_PurpleLock': {type: "tile", tile: 'D', special: {Type: "Door", Priority: true, AlwaysClose: true, Lock: "Purple"}}, - 'Door_BlueLock': {type: "tile", tile: 'D', special: {Type: "Door", Priority: true, AlwaysClose: true, Lock: "Blue"}}, - 'AutoDoorToggle': {type: "tile", tile: 'Z', special: {Type: "AutoDoor", wireType: "AutoDoor_Toggle"}}, - 'AutoDoorOpenToggle': {type: "tile", tile: 'z', special: {Type: "AutoDoor", wireType: "AutoDoor_Toggle"}}, - 'AutoDoorHoldOpen': {type: "tile", tile: 'Z', special: {Type: "AutoDoor", wireType: "AutoDoor_HoldOpen", Label: "HoldOpen"}}, - 'AutoDoorHoldClosed': {type: "tile", tile: 'Z', special: {Type: "AutoDoor", wireType: "AutoDoor_HoldClosed", Label: "HoldClosed"}}, - 'AutoDoorOpen': {type: "tile", tile: 'Z', special: {Type: "AutoDoor", wireType: "AutoDoor_Open", Label: "Open"}}, - 'AutoDoorClose': {type: "tile", tile: 'z', special: {Type: "AutoDoor", wireType: "AutoDoor_Close", Label: "Open"}}, - '----Furniture----': {type: "none"}, - 'Table': {type: "tile", tile: 'F', special: {Type: "Table"}}, - 'TableFood': {type: "tile", tile: 'F', special: {Type: "Table", Food: "Plate"}}, - 'Rubble': {type: "tile", tile: 'R', special: {Type: "Rubble"}}, - 'Sharp': {type: "tile", tile: '/', special: {Type: "Debris"}}, - 'SharpAlways': {type: "tile", tile: '/', special: {Type: "Debris", Always: true}}, - 'Torch': {type: "effect", effectTile: "Torch"}, - 'PotentialTorch': {type: "effect", effectTile: "TorchUnlit"}, - 'Barrel': {type: "tile", tile: 'L', special: {Type: "Barrel"}}, - 'BarrelAlways': {type: "tile", tile: 'L', special: {Type: "Barrel", Always: true}}, - 'Cage': {type: "tile", tile: 'L', special: {Type: "Cage", Furniture: "Cage"}, jail: {type: "furniture", radius: 1}}, - 'DisplayStand': {type: "tile", tile: 'L', special: {Type: "DisplayStand", Furniture: "DisplayStand"}, jail: {type: "furniture", radius: 1}}, - 'DisplayEgyptian': {type: "tile", tile: 'L', special: {Type: "Furniture", Furniture: "DisplayEgyptian"}, jail: {type: "furniture", radius: 1}}, - '----Chests----': {type: "none"}, - 'Chest': {type: "tile", tile: 'C', special: {Type: "Chest"}}, - 'ChestRed': {type: "tile", tile: 'C', special: {Type: "Chest", Lock: "Red"}}, - 'ChestBlue': {type: "tile", tile: 'C', special: {Type: "Chest", Lock: "Blue"}}, - 'ChestOrShrine': {type: "tile", tile: 'O', special: {Type: "ChestOrShrine"}}, - 'HighPriorityChest': {type: "tile", tile: 'C', special: {Priority: true}}, - 'SilverChest': {type: "tile", tile: 'C', special: {Type: "Chest", Loot: "silver", Priority: true}}, - 'StorageChest': {type: "tile", tile: 'C', special: {Type: "Chest", Loot: "storage", Chance: 0.8}}, - 'ChestCustom': {type: "tile", tile: 'C', special: {Type: "Chest", Loot: "storage"}, customfields: { - Loot: {type: "string"}, - Faction: {type: "string"}, - NoTrap: {type: "boolean"}, - lootTrap: {type: "string"}, - Lock: {type: "string"}, - Priority: {type: "boolean"}, - }}, - 'GuardedChest': {type: "tile", tile: 'C', special: {Type: "GuardedChest", Label: "Guarded"}}, - 'GuardedChestLocked': {type: "tile", tile: 'C', special: {Type: "GuardedChest", Lock: "Red", Label: "Guarded"}}, - '----Shrines----': {type: "none"}, - 'Shrine': {type: "tile", tile: 'A', special: {Type: "Shrine", Name: "Metal"}}, - 'HighPriorityShrine': {type: "tile", tile: 'A', special: {Type: "Shrine", Name: "Will", Priority: true}}, - '----Chargers----': {type: "none"}, - 'PriorityCharger': {type: "tile", tile: '=', special: {Type: "Charger", Priority: true}}, - 'Charger': {type: "tile", tile: '+', special: {Type: "Charger"}}, - 'UnlockedCharger': {type: "tile", tile: '=', special: {Type: "Charger", NoRemove: false}}, - '----Hazards----': {type: "none"}, - 'Trap': {type: "tile", tile: 'T', special: {Type: "Trap", Always: true,}}, - 'PotentialTrap': {type: "tile", tile: 'T', special: {Type: "Trap"}}, - '----Conveyors----': {type: "none"}, - 'ConveyorUp': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Up", DX: 0, DY: -1,}}, - 'ConveyorDown': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Down", DX: 0, DY: 1,}}, - 'ConveyorLeft': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Left", DX: -1, DY: 0,}}, - 'ConveyorRight': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Right", DX: 1, DY: 0,}}, - 'ConveyorUpOn': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Up", DX: 0, DY: -1, wireType: "Conveyor_Toggle", SwitchMode: "On"}}, - 'ConveyorDownOn': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Down", DX: 0, DY: 1, wireType: "Conveyor_Toggle", SwitchMode: "On"}}, - 'ConveyorLeftOn': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Left", DX: -1, DY: 0, wireType: "Conveyor_Toggle", SwitchMode: "On"}}, - 'ConveyorRightOn': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Right", DX: 1, DY: 0, wireType: "Conveyor_Toggle", SwitchMode: "On"}}, - 'ConveyorUpOff': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Up", DX: 0, DY: -1, wireType: "Conveyor_Toggle", SwitchMode: "Off"}}, - 'ConveyorDownOff': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Down", DX: 0, DY: 1, wireType: "Conveyor_Toggle", SwitchMode: "Off"}}, - 'ConveyorLeftOff': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Left", DX: -1, DY: 0, wireType: "Conveyor_Toggle", SwitchMode: "Off"}}, - 'ConveyorRightOff': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Right", DX: 1, DY: 0, wireType: "Conveyor_Toggle", SwitchMode: "Off"}}, - 'ConveyorUpSwitch': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Up", DX: 0, DY: -1, wireType: "Conveyor_Switch", SwitchMode: "Switch"}}, - 'ConveyorDownSwitch': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Down", DX: 0, DY: 1, wireType: "Conveyor_Switch", SwitchMode: "Switch"}}, - 'ConveyorLeftSwitch': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Left", DX: -1, DY: 0, wireType: "Conveyor_Switch", SwitchMode: "Switch"}}, - 'ConveyorRightSwitch': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Right", DX: 1, DY: 0, wireType: "Conveyor_Switch", SwitchMode: "Switch"}}, - '----Machines----': {type: "none"}, - 'DollSupply': {type: "tile", tile: 'u', special: {Type: "DollSupply"}}, - 'DollSupplyManual': {type: "tile", tile: 'u', special: {Type: "DollSupply", count: 0, wireType: "increment", rate: 3}}, - 'DollTerminal': {type: "tile", tile: 't', special: {Type: "DollTerminal"}}, - 'BondageMachineLatex': {type: "tile", tile: 'N', special: {Type: "BondageMachine", Binding: "Latex"}}, - 'BondageMachinePlug': {type: "tile", tile: 'N', special: {Type: "BondageMachine", Binding: "Plug"}}, - 'BondageMachineChastity': {type: "tile", tile: 'N', special: {Type: "BondageMachine", Binding: "Chastity"}}, - 'BondageMachineTape': {type: "tile", tile: 'N', special: {Type: "BondageMachine", Binding: "Tape"}}, - 'BondageMachineMetal': {type: "tile", tile: 'N', special: {Type: "BondageMachine", Binding: "Metal"}}, - 'DollDropoffU': {type: "tile", tile: '5', special: {Type: "DollDropoff", Sprite: "Floor", Overlay: "DollDropoff", direction: {x: 0, y:-1}}}, - 'DollDropoffD': {type: "tile", tile: '5', special: {Type: "DollDropoff", Sprite: "Floor", Overlay: "DollDropoffD", direction: {x: 0, y:1}}}, - 'DollDropoffR': {type: "tile", tile: '5', special: {Type: "DollDropoff", Sprite: "Floor", Overlay: "DollDropoffR", direction: {x: 1, y:0}}}, - 'DollDropoffL': {type: "tile", tile: '5', special: {Type: "DollDropoff", Sprite: "Floor", Overlay: "DollDropoffL", direction: {x: -1, y:0}}}, - '----Signals----': {type: "none"}, - 'Button': {type: "tile", tile: '@'}, - 'Wire': {type: "effect", effectTile: "Wire"}, - 'PressurePlate': {type: "effect", effectTile: "PressurePlate"}, - 'PressurePlateHold': {type: "effect", effectTile: "PressurePlateHold"}, - 'PressurePlateOneUse': {type: "effect", effectTile: "PressurePlateOneUse"}, - '----Misc----': {type: "none"}, - 'POI': {type: "POI"}, - 'OffLimits': {type: "offlimits"}, - 'Jail': {type: "jail"}, - 'Keyring': {type: "Keyring"}, -}; - -function KDGetTileIndexImg(index) { - return { - u: index.includes('u'), - d: index.includes('d'), - l: index.includes('l'), - r: index.includes('r'), - }; -} - -let KDTE_State = ""; - -function KDDrawTileEditor() { - - if (KinkyDungeonCanvas) { - - KinkyDungeonContext.fillStyle = "rgba(0,0,0.0,1.0)"; - KinkyDungeonContext.fillRect(0, 0, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height); - KinkyDungeonContext.fill(); - KinkyDungeonCamX = KinkyDungeonPlayerEntity.x - Math.floor(KinkyDungeonGridWidthDisplay/2); - KinkyDungeonCamY = KinkyDungeonPlayerEntity.y - Math.floor(KinkyDungeonGridHeightDisplay/2); - - KDDrawMap(KinkyDungeonCamX, KinkyDungeonCamY, 0, 0, true); - KDDrawEffectTiles(0, 0, KinkyDungeonCamX, KinkyDungeonCamY); - - KinkyDungeonTargetX = Math.round((MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamX; - KinkyDungeonTargetY = Math.round((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamY; - - if (KinkyDungeonTargetX >= 0 && KinkyDungeonTargetX < KinkyDungeonGridWidth - && KinkyDungeonTargetY >= 0 && KinkyDungeonTargetY < KinkyDungeonGridHeight) { - KDDraw(kdgameboard, kdpixisprites, "ui_movereticule", KinkyDungeonRootDirectory + "TargetMove.png", - (KinkyDungeonTargetX - KinkyDungeonCamX)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - KinkyDungeonCamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 100, - }); - } - - // Cull the sprites that werent rendered or updated this frame - for (let sprite of kdpixisprites.entries()) { - if (!kdSpritesDrawn.has(sprite[0]) && sprite[1] && sprite[1].parent == kdgameboard) { - sprite[1].parent.removeChild(sprite[1]); - if (kdprimitiveparams.has(sprite[0])) kdprimitiveparams.delete(sprite[0]); - kdpixisprites.delete(sprite[0]); - sprite[1].destroy(); - } - } - - // Draw the context layer even if we haven't updated it - if (pixirendererKD) { - pixirendererKD.render(kdgameboard, { - clear: false, - }); - } - if (!pixirendererKD) { - if (KinkyDungeonContext && KinkyDungeonCanvas) { - // @ts-ignore - pixirendererKD = new PIXI.CanvasRenderer({ - // @ts-ignore - width: KinkyDungeonCanvas.width, - // @ts-ignore - height: KinkyDungeonCanvas.height, - view: KinkyDungeonCanvas, - antialias: true, - }); - } - } - MainCanvas.drawImage(KinkyDungeonCanvas, canvasOffsetX, canvasOffsetY); - - KDTE_UpdateUI(false); - - if (!KDTE_State) { - DrawButtonKDEx("ToTags", (bdata) => { - KDTE_State = "Tags"; - return true; - }, true, 20 , 920, 250, 64, 'Edit Tile Tags', "#ffffff"); - KDDrawEditorUI(); - } else { - DrawButtonKDEx("backToBrushes", (bdata) => { - KDTE_State = ""; - return true; - }, true, 20 , 920, 250, 64, 'Go Back', "#ffffff"); - if (KDTE_State == "Tags") - KDDrawEditorTagsUI(); - } - - - } - - if (KinkyDungeonKeybindingCurrentKey && KinkyDungeonGameKeyDown()) { - if (KinkyDungeonKeybindingCurrentKey) - KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime(); - KinkyDungeonKeybindingCurrentKey = ''; - } -} - -function KDDrawEditorTagsUI() { - -} - -let KDEditorTileBrushIndexVisual = 0; -let KDEditorTileBrushIndex2Visual = 0; -let KDEditorTileNameIndexVisual = 0; - -function KDDrawEditorUI() { - - if (Math.abs(KDEditorTileBrushIndexVisual - KDEditorTileBrushIndex) > 0.5) - KDEditorTileBrushIndexVisual = (KDEditorTileBrushIndexVisual*4 + KDEditorTileBrushIndex) / 5; - if (Math.abs(KDEditorTileBrushIndex2Visual - KDEditorTileBrushIndex2) > 0.5) - KDEditorTileBrushIndex2Visual = (KDEditorTileBrushIndex2Visual*4 + KDEditorTileBrushIndex2) / 5; - if (Math.abs(KDEditorTileNameIndexVisual - KDEditorTileNameIndex) > 0.5) - KDEditorTileNameIndexVisual = (KDEditorTileNameIndexVisual*4 + KDEditorTileNameIndex) / 5; - - - let indexX = (1 + Math.floor(Math.max(0, Math.min(KinkyDungeonGridWidth-1, KinkyDungeonPlayerEntity.x)) / KDTE_Scale)); - let indexY = (1 + Math.floor(Math.max(0, Math.min(KinkyDungeonGridHeight-1,KinkyDungeonPlayerEntity.y)) / KDTE_Scale)); - - let yy = 160; - let xx = 100; - let grid = 10; - DrawTextFitKD("Tile Index", xx + grid * 1.5 , yy - 30, 200, "#ffffff"); - KDEditorTileIndexHover = ''; - KDEditorTileIndex = KDEditorTileIndexStore[KDEditorTileIndexQuery]; - KDEditorTileFlex = KDEditorTileFlexStore[KDEditorTileIndexQuery] || ""; - KDEditorTileFlexSuper = KDEditorTileFlexSuperStore[KDEditorTileIndexQuery] || ""; - for (let index of Object.keys(KDTileIndices)) { - let patt = KDGetTileIndexImg(index); - - if (!patt.u && KDEditorTileIndexStore[(indexX)+","+(indexY-1)]) {yy += grid * 5; continue;} - if (!patt.d && KDEditorTileIndexStore[(indexX)+","+(indexY+1)]) {yy += grid * 5; continue;} - if (!patt.l && KDEditorTileIndexStore[(indexX-1)+","+(indexY)]) {yy += grid * 5; continue;} - if (!patt.r && KDEditorTileIndexStore[(indexX+1)+","+(indexY)]) {yy += grid * 5; continue;} - DrawBoxKD(xx + grid, yy, grid, grid, patt.u ? "#ffffff" : "#000000", patt.u); - DrawBoxKD(xx + grid, yy + 2*grid, grid, grid, patt.d ? "#ffffff" : "#000000", patt.d); - DrawBoxKD(xx, yy + grid, grid, grid, patt.l ? "#ffffff" : "#000000", patt.l); - DrawBoxKD(xx + 2*grid, yy + grid, grid, grid, patt.r ? "#ffffff" : "#000000", patt.r); - - if (MouseIn(xx, yy, grid*3, grid*3) || KDEditorTileIndex == index) { - if (KDEditorTileIndex != index) KDEditorTileIndexHover = index; - DrawRectKD(kdcanvas, kdpixisprites, "tileInd" + index, { - Left: xx - 3, - Top: yy - 3, - Width: grid*3 + 8, - Height: grid*3 + 8, - Color: "#ffffff", - LineWidth: 2, - zIndex: 100, - alpha: 0.5, - }); - } - - yy += grid * 5; - } - - DrawButtonKDEx("flextoggle", (bdata) => { - KDEditorTileFlex = KDEditorTileFlex ? "" : "y"; - if (KDEditorTileFlexStore[KDEditorTileIndexQuery] && !KDEditorTileFlex) { - delete KDEditorTileFlexStore[KDEditorTileIndexQuery]; - } else if (!KDEditorTileFlexStore[KDEditorTileIndexQuery] && KDEditorTileFlex) { - KDEditorTileFlexStore[KDEditorTileIndexQuery] = KDEditorTileFlex; - } - return true; - }, true, 150 , 160, 140, 45, 'Flex', "#ffffff", KDEditorTileFlex ? (KinkyDungeonRootDirectory + "UI/CheckSmall.png") : undefined); - - DrawButtonKDEx("flexsupertoggle", (bdata) => { - KDEditorTileFlexSuper = KDEditorTileFlexSuper ? "" : "y"; - if (KDEditorTileFlexSuperStore[KDEditorTileIndexQuery] && !KDEditorTileFlexSuper) { - delete KDEditorTileFlexSuperStore[KDEditorTileIndexQuery]; - } else if (!KDEditorTileFlexSuperStore[KDEditorTileIndexQuery] && KDEditorTileFlexSuper) { - KDEditorTileFlexSuperStore[KDEditorTileIndexQuery] = KDEditorTileFlexSuper; - } - return true; - }, true, 150 , 210, 140, 45, 'OpenBorder', "#ffffff", KDEditorTileFlexSuper ? (KinkyDungeonRootDirectory + "UI/CheckSmall.png") : undefined); - - // For later - let tileKeys = Object.keys(KDMapTilesListEditor); - - yy = 220; - xx = 1790; - grid = 40; - let width = 200; - let brushKeys = Object.keys(KDTilePalette); - - DrawButtonKDEx("tilebrushup", (bdata) => { - if (KDEditorTileBrushIndex == 0) KDEditorTileBrushIndex = brushKeys.length - 4; - else KDEditorTileBrushIndex = Math.max(0, KDEditorTileBrushIndex - 14); - return true; - }, true, xx , yy, width, grid-5, '^', KDEditorTileBrushIndex > 0 ? "#ffffff" : "#888888"); - KDTE_CullIndex(tileKeys, brushKeys); - yy += grid; - for (let i = 0; i < 670/grid; i++) { - let index = i + Math.round(KDEditorTileBrushIndexVisual); - if (index >= brushKeys.length) break; - - DrawButtonKDEx("brush" + i, (bdata) => { - KDEditorTileBrush = brushKeys[index]; - return true; - }, true, xx , yy, width, grid-5, brushKeys[index], brushKeys[index] == KDEditorTileBrush ? "#ffffff" : (brushKeys[index].startsWith('-') ? "#77ff77" : "#888888")); - - yy += grid; - } - DrawButtonKDEx("tilebrushdown", (bdata) => { - if (KDEditorTileBrushIndex >= brushKeys.length - 6) KDEditorTileBrushIndex = 0; - else KDEditorTileBrushIndex = Math.min(brushKeys.length - 4, KDEditorTileBrushIndex + 14); - return true; - }, true, xx , yy, width, grid-5, 'v', KDEditorTileBrushIndex < brushKeys.length - 4 ? "#ffffff" : "#888888"); - - - // Draw the second palette - yy = 220; - xx = 1590; - grid = 40; - - DrawButtonKDEx("tilebrushup2", (bdata) => { - if (KDEditorTileBrushIndex2 == 0) KDEditorTileBrushIndex2 = brushKeys.length - 4; - else KDEditorTileBrushIndex2 = Math.max(0, KDEditorTileBrushIndex2 - 8); - return true; - }, true, xx , yy, width, grid-5, '^', KDEditorTileBrushIndex2 > 0 ? "#ffffff" : "#888888"); - KDTE_CullIndex(tileKeys, brushKeys); - yy += grid; - for (let i = 0; i < 420/grid; i++) { - let index = i + Math.round(KDEditorTileBrushIndex2Visual); - if (index >= brushKeys.length) break; - - DrawButtonKDEx("brush2_" + i, (bdata) => { - KDEditorTileBrush = brushKeys[index]; - return true; - }, true, xx , yy, width, grid-5, brushKeys[index], brushKeys[index] == KDEditorTileBrush ? "#ffffff" : (brushKeys[index].startsWith('-') ? "#77ff77" : "#888888")); - - yy += grid; - } - DrawButtonKDEx("tilebrushdown2", (bdata) => { - if (KDEditorTileBrushIndex2 >= brushKeys.length - 6) KDEditorTileBrushIndex2 = 0; - else KDEditorTileBrushIndex2 = Math.min(brushKeys.length - 4, KDEditorTileBrushIndex2 + 8); - return true; - }, true, xx , yy, width, grid-5, 'v', KDEditorTileBrushIndex2 < brushKeys.length - 4 ? "#ffffff" : "#888888"); - - - - yy = 160; - xx = 300; - grid = 45; - width = 200; - DrawTextFitKD("Tile List", xx + width/2 , yy - 30, width, "#ffffff", undefined, 36); - - DrawButtonKDEx("tilenameup", (bdata) => { - if (KDEditorTileNameIndex == 0) KDEditorTileNameIndex = tileKeys.length - 4; - else KDEditorTileNameIndex = Math.max(0, KDEditorTileNameIndex - 9); - KDTELoadConfirm = false; - return true; - }, true, xx , yy, width, grid-5, '^', KDEditorTileNameIndex > 0 ? "#ffffff" : "#888888"); - yy += grid; - KDTE_CullIndex(tileKeys, brushKeys); - for (let i = 0; i < 700/grid; i++) { - let index = i + Math.round(KDEditorTileNameIndexVisual); - if (index >= tileKeys.length) break; - - DrawButtonKDEx("tilename" + i, (bdata) => { - if (KDEditorCurrentMapTileName != tileKeys[index] || !KDTELoadConfirm) { - KDEditorCurrentMapTileName = tileKeys[index]; - ElementValue("MapTileTitle", KDEditorCurrentMapTileName); - KDTELoadConfirm = true; - } else if (KDTELoadConfirm) { - KDTE_LoadTile(KDEditorCurrentMapTileName); - KDTELoadConfirm = false; - } - return true; - }, true, xx , yy, width, grid-5, tileKeys[index], tileKeys[index] == KDEditorCurrentMapTileName ? "#ffffff" : "#888888"); - if (KDTELoadConfirm && tileKeys[index] == KDEditorCurrentMapTileName) { - DrawTextFitKD("Double click to LOAD", xx + width * 1.65 , yy + grid/2, width, "#ffffff", undefined); - DrawButtonKDEx("deletetilename" + i, (bdata) => { - delete KDMapTilesListEditor[KDEditorCurrentMapTileName]; - return true; - }, true, xx - 160, yy, 150, grid-5, "Delete!!!", tileKeys[index] == KDEditorCurrentMapTileName ? "#ffffff" : "#888888"); - } - - yy += grid; - } - DrawButtonKDEx("tilenamedown", (bdata) => { - if (KDEditorTileNameIndex >= tileKeys.length - 6) KDEditorTileNameIndex = 0; - else KDEditorTileNameIndex = Math.min(tileKeys.length - 4, KDEditorTileNameIndex + 9); - KDTELoadConfirm = false; - return true; - }, true, xx , yy, width, grid-5, 'v', KDEditorTileNameIndex < tileKeys.length - 4 ? "#ffffff" : "#888888"); - - DrawButtonKDEx("tilesave", (bdata) => { - KDTE_SaveTile(KDEditorCurrentMapTileName); - return true; - }, true, 900 , 150, 200, 60, 'Save Tile', "#ffffff"); - - - DrawButtonKDEx("maptileR", (bdata) => { - KinkyDungeonPlayerEntity.x = Math.max(0, Math.min(KinkyDungeonGridWidth - 1, KinkyDungeonPlayerEntity.x + 3)); - KDTELoadConfirm = false; - return true; - }, true, 1000 , 900, 50, 50, '>', "#ffffff"); - DrawButtonKDEx("maptileL", (bdata) => { - KinkyDungeonPlayerEntity.x = Math.max(0, Math.min(KinkyDungeonGridWidth - 1, KinkyDungeonPlayerEntity.x - 3)); - KDTELoadConfirm = false; - return true; - }, true, 900 , 900, 50, 50, '<', "#ffffff"); - DrawButtonKDEx("maptileD", (bdata) => { - KinkyDungeonPlayerEntity.y = Math.max(0, Math.min(KinkyDungeonGridHeight - 1, KinkyDungeonPlayerEntity.y + 3)); - KDTELoadConfirm = false; - return true; - }, true, 950 , 950, 50, 50, 'v', "#ffffff"); - DrawButtonKDEx("maptileU", (bdata) => { - KinkyDungeonPlayerEntity.y = Math.max(0, Math.min(KinkyDungeonGridHeight - 1, KinkyDungeonPlayerEntity.y - 3)); - KDTELoadConfirm = false; - return true; - }, true, 950 , 850, 50, 50, '^', "#ffffff"); - - KDTE_CullIndex(tileKeys, brushKeys); - - DrawButtonKDEx("TileEditorBack", () => { - KinkyDungeonState = "Menu"; - KinkyDungeonSeeAll = false; - KDTE_CloseUI(); - return true; - }, true, 10, 10, 350, 64, "Back to menu", "#ffffff", ""); - DrawButtonKDEx("TileEditorNew", () => { - let x = parseInt(ElementValue("MapTileX")); - let y = parseInt(ElementValue("MapTileY")); - if (x && y && x > 0 && y > 0 && x <= KDTE_MAXDIM && y <= KDTE_MAXDIM) - KDTE_Create(x, y); - return true; - }, true, 1600, 130, 350, 64, "Resize (Clears all)", "#ffffff", ""); - - DrawButtonKDEx("TileTest", () => { - KDTE_CloseUI(); - KDTileToTest = KDTE_ExportTile(); - KinkyDungeonStartNewGame(); - return true; - }, true, 1910, 10, 80, 40, "Test Tile", "#ffffff", ""); - - DrawButtonKDEx("CopyClip", () => { - var text = JSON.stringify(KDMapTilesListEditor); - navigator.clipboard.writeText(text).then(function() { - console.log('Async: Copying to clipboard was successful!'); - console.log(KDMapTilesListEditor); - }, function(err) { - console.error('Async: Could not copy text: ', err); - }); - return true; - }, true, 1450, 900, 275, 45, "Copy array to clipboard", "#ffffff", ""); - - - DrawButtonKDEx("MergeClip", () => { - let success = false; - navigator.clipboard.readText() - .then(text => { - if (JSON.parse(text)) { - console.log(JSON.parse(text)); - console.log("Parse successful!!!"); - for (let tile of Object.values(JSON.parse(text))) { - if (tile && tile.name) { - if (!KDMapTilesListEditor[tile.name]) { - KDMapTilesListEditor[tile.name] = tile; - console.log(`${tile.name} added successfully`); - success = true; - } else { - console.log(`${tile.name} already present`); - } - } - } - if (success) { - localStorage.setItem("KDMapTilesListEditor", JSON.stringify(KDMapTilesListEditor)); - console.log("Saved new tiles to browser local storage."); - } - } - }) - .catch(err => { - console.error('Failed to read clipboard contents: ', err); - }); - - - - return true; - }, true, 1450, 850, 275, 45, "Merge from clipboard", "#ffffff", ""); - - DrawButtonKDEx("DeleteEditorTiles", () => { - if (KDTE_confirmreset) { - KDTE_confirmreset = false; - KDMapTilesListEditor = JSON.parse(JSON.stringify(KDMapTilesList)); - } else { - KDTE_confirmreset = true; - } - - - return true; - }, true, 1450, 800, 275, 40, "Reset tile database", "#ffffff", ""); - if (KDTE_confirmreset) { - DrawTextFitKD("This is a DESTRUCTIVE operation. Click the button again to do it. Save a tile to commit fully.", 1400, 470, 1000, "#ffff00", "#ff0000"); - } - - - - - DrawButtonKDEx("PasteTileFromCB", () => { - let success = false; - navigator.clipboard.readText() - .then(text => { - let tile = JSON.parse(text); - if (tile && tile.name) { - console.log(JSON.parse(text)); - console.log("Parse successful!!!"); - KDTE_LoadTile(tile.name, tile); - - if (success) { - localStorage.setItem("KDMapTilesListEditor", JSON.stringify(KDMapTilesListEditor)); - console.log("Saved new tiles to browser local storage."); - } - } - }) - .catch(err => { - console.error('Failed to read clipboard contents: ', err); - }); - return true; - }, true, 1250, 950, 175, 45, "Load tile from Clipboard", "#ffffff", ""); - - DrawButtonKDEx("MakeTileCB", () => { - var text = JSON.stringify(KDTE_ExportTile()); - navigator.clipboard.writeText(text).then(function() { - console.log('Async: Copying to clipboard was successful!'); - }, function(err) { - console.error('Async: Could not copy text: ', err); - }); - return true; - }, true, 1250, 900, 175, 45, "Copy Tile to Clipboard", "#ffffff", ""); - - DrawButtonKDEx("CommitTiles", () => { - if (KDTE_confirmcommit) { - KDTE_confirmcommit = false; - KDMapTilesList = JSON.parse(JSON.stringify(KDMapTilesListEditor)); - } else { - KDTE_confirmcommit = true; - } - return true; - }, true, 1450, 950, 275, 45, "Commit Editor Tiles", "#ffffff", ""); - if (KDTE_confirmcommit) { - DrawTextFitKD("This will temporarily make the game use your editor's tiles. You are responsible for any crashes.", 1400, 470, 1000, "#ffffff", "#ff00aa"); - } - - KDEditorTileIndexQuery = indexX - + "," - + indexY; - - // Enforce entrance/exits - for (let sim_x = 0; sim_x < KinkyDungeonGridWidth-1; sim_x += KDTE_Scale) { - for (let sim_y = 0; sim_y < KinkyDungeonGridHeight-1; sim_y += KDTE_Scale) { - let indexXX = (Math.floor(Math.max(0, Math.min(KinkyDungeonGridWidth-1, sim_x)) / KDTE_Scale)); - let indexYY = (Math.floor(Math.max(0, Math.min(KinkyDungeonGridHeight-1,sim_y)) / KDTE_Scale)); - let patt = KDGetTileIndexImg(KDEditorTileIndexStore[(indexXX + 1) + "," + (indexYY + 1)]); - if (patt) { - if (patt.u && indexYY == 0) KDTE_Clear(indexXX*KDTE_Scale + Math.floor(KDTE_Scale/2), indexYY*KDTE_Scale); - if (patt.d && indexYY == Math.floor((KinkyDungeonGridHeight-1)/KDTE_Scale)) KDTE_Clear(indexXX*KDTE_Scale + Math.floor(KDTE_Scale/2), indexYY*KDTE_Scale + KDTE_Scale - 1); - if (patt.l && indexXX == 0) KDTE_Clear(indexXX*KDTE_Scale, indexYY*KDTE_Scale + Math.floor(KDTE_Scale/2)); - if (patt.r && indexXX == Math.floor((KinkyDungeonGridWidth-1)/KDTE_Scale)) KDTE_Clear(indexXX*KDTE_Scale + KDTE_Scale - 1, indexYY*KDTE_Scale + Math.floor(KDTE_Scale/2)); - } - } - } - - if (mouseDown && !CommonIsMobile) { - if (!KDTE_lastMouse) KDTE_lastMouse = CommonTime(); - if (CommonTime() > KDTE_lastMouse + KDTEHoldDelay) - KDHandleTileEditor(true); - } else KDTE_lastMouse = 0; - - KDTE_CustomUI(); -} - -let customfieldsElements = []; - -function KDTE_CustomUI() { - - let brush = KDTilePalette[KDEditorTileBrush]; - let names = []; - if (brush?.customfields) { - names.push(...Object.keys(brush.customfields)); - } - - for (let element of customfieldsElements) { - if (!names.includes(element)) { - ElementRemove("KDTECustomField" + element); - customfieldsElements.splice(customfieldsElements.indexOf(element), 1); - } - } - let YY = 990 - names.length * 55; - let XX = 650; - for (let name of names) { - if (!customfieldsElements.includes(name)) { - ElementCreateTextArea("KDTECustomField" + name); - document.getElementById("KDTECustomField" + name).setAttribute("placeholder", name); - ElementPosition("KDTECustomField" + name, XX, YY, 300, 45); YY += 55; - customfieldsElements.push(name); - } - } -} - -let KDTE_lastMouse = 0; -let KDTEHoldDelay = 200; - -let KDTEmode = 0; - -let KDTE_Scale = 7; -let KDTE_MAXDIM = 4; - -let KDTELoadConfirm = false; - -function KDTE_Clear(x, y, force = false) { - if (force || !KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(x, y))) { - KinkyDungeonMapSetForce(x, y, '0'); - KinkyDungeonTilesDelete(x + "," + y); - delete KinkyDungeonTilesSkin[x + "," + y]; - for (let jail of KDGameData.JailPoints) { - if (jail.x == x && jail.y == y) - KDGameData.JailPoints.splice(KDGameData.JailPoints.indexOf(jail), 1); - } - //KinkyDungeonEffectTiles.delete(x + "," + y); - } -} - -let KDTE_Brush = { - "clear": (brush, curr, noSwap) => { - KDTE_Clear(KinkyDungeonTargetX, KinkyDungeonTargetY, true); - for (let p of KinkyDungeonPOI) { - if (p.x == KinkyDungeonTargetX && p.y == KinkyDungeonTargetY) { - KinkyDungeonPOI.splice(KinkyDungeonPOI.indexOf(p), 1); - break; - } - } - delete KinkyDungeonEffectTiles[KinkyDungeonTargetX + "," + KinkyDungeonTargetY]; - }, - "tile": (brush, curr, noSwap) => { - let OL = KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY) ? KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).OffLimits : undefined; - let Jail = KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY) ? KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).Jail : undefined; - let tile = (curr == brush.tile && !noSwap) ? '0' : brush.tile; - if (tile == '0') { - if (!noSwap) { - KDTE_Clear(KinkyDungeonTargetX, KinkyDungeonTargetY, true); - if (OL || Jail) - KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {OffLimits: OL, Jail: Jail}); - } - } else if (curr != tile) { - KinkyDungeonMapSetForce(KinkyDungeonTargetX, KinkyDungeonTargetY, tile); - - if (brush.jail) { - KDGameData.JailPoints.push({x: KinkyDungeonTargetX, y: KinkyDungeonTargetY, type: brush.jail.type, radius: brush.jail.radius}); - } - if (brush.special) { - KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, Object.assign({}, brush.special)); - if (OL) - KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).OffLimits = true; - if (Jail) - KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).Jail = true; - if (brush.customfields) { - for (let field of Object.entries(brush.customfields)) { - if (KDTE_GetField(field)) - KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)[field[0]] = KDTE_GetField(field); - } - } - } else { - if (OL) - KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {OffLimits: true}); - else - KinkyDungeonTilesDelete(KinkyDungeonTargetX + "," + KinkyDungeonTargetY); - } - } - }, - 'offlimits': (brush, curr, noSwap) => { - if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { - if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).OffLimits) { - if (!noSwap) - KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).OffLimits = false; - } else - KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).OffLimits = true; - } else { - KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {OffLimits: true}); - } - }, - 'jail': (brush, curr, noSwap) => { - if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { - if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).Jail) { - if (!noSwap) - KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).Jail = false; - } else - KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).Jail = true; - } else { - KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {Jail: true}); - } - }, - 'Keyring': (brush, curr, noSwap) => { - let keyringLength = KDGameData.KeyringLocations.length; - let filtered = KDGameData.KeyringLocations.filter((e) => {return e.x != KinkyDungeonTargetX || e.y != KinkyDungeonTargetY;}); - if (filtered.length != keyringLength) { - if (!noSwap) - KDGameData.KeyringLocations = filtered; - } else { - KDGameData.KeyringLocations.push({x: KinkyDungeonTargetX, y: KinkyDungeonTargetY}); - } - }, - "effect": (brush, curr, noSwap) => { - if ((brush.wall && KinkyDungeonWallTiles.includes(curr)) - || (brush.floor && KinkyDungeonGroundTiles.includes(curr)) - || (!brush.floor && !brush.wall)) { - if (KinkyDungeonEffectTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { - if (!noSwap) - delete KinkyDungeonEffectTiles[KinkyDungeonTargetX + "," + KinkyDungeonTargetY]; - } else { - KDCreateEffectTile(KinkyDungeonTargetX, KinkyDungeonTargetY, {name: brush.effectTile}, 0); - } - } - }, - "POI": (brush, curr, noSwap) => { - let deleted = false; - for (let p of KinkyDungeonPOI) { - if (p.x == KinkyDungeonTargetX && p.y == KinkyDungeonTargetY) { - if (!noSwap) { - if (!p.requireTags.includes("endpoint")) { - let chanceCycle = [1.0, 0.75, 0.5, 0.25, 0.15, 0.1, 0.05, 0.01]; - let chanceIndex = chanceCycle.indexOf(p.chance || 1.0); - chanceIndex += 1; - if (chanceIndex >= chanceCycle.length) { - p.requireTags.push("endpoint"); - p.chance = 1.0; - } else { - p.chance = chanceCycle[chanceIndex]; - } - } else { - KinkyDungeonPOI.splice(KinkyDungeonPOI.indexOf(p), 1); - } - } - deleted = true; - break; - } - } - if (!deleted) { - let tags = []; - let favor = []; - //let indexXX = (Math.floor(Math.max(0, Math.min(KinkyDungeonGridWidth-1, KinkyDungeonTargetX)) / KDTE_Scale)); - //let indexYY = (Math.floor(Math.max(0, Math.min(KinkyDungeonGridHeight-1,KinkyDungeonTargetY)) / KDTE_Scale)); - //let pat = KDEditorTileIndexStore[(indexXX + 1) + "," + (indexYY + 1)]; - //if (pat) { - // if (pat.length == 1) tags.push("endpoint"); - //} - if (ElementValue("MapTileCategory")) - favor.push(ElementValue("MapTileCategory")); - KinkyDungeonPOI.push({x: KinkyDungeonTargetX, y: KinkyDungeonTargetY, requireTags: tags, favor: favor, used: false}); - } - } -}; - -let KDTE_Inaccessible = false; - -let KDTE_confirmreset = false; -let KDTE_confirmcommit = false; - -function KDHandleTileEditor(noSwap) { - if (!noSwap && KDTE_lastMouse && CommonTime() > KDTE_lastMouse + KDTEHoldDelay) return; - - KDTE_confirmreset = false; - KDTE_confirmcommit = false; - - if (KDTE_State) return; - - - KDTESetIndexToTile(KDEditorCurrentMapTileName); - - KinkyDungeonTargetX = Math.round((MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamX; - KinkyDungeonTargetY = Math.round((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamY; - - if (KinkyDungeonTargetX >= 0 && KinkyDungeonTargetX < KinkyDungeonGridWidth - && KinkyDungeonTargetY >= 0 && KinkyDungeonTargetY < KinkyDungeonGridHeight) { - KDTELoadConfirm = false; - let curr = KinkyDungeonMapGet(KinkyDungeonTargetX, KinkyDungeonTargetY); - - let brush = KDTilePalette[KDEditorTileBrush]; - if (KDTE_Brush[brush.type]) { - KDTE_Brush[brush.type](brush, curr, noSwap); - } - if (ElementValue("MapTileSkin")) { - KinkyDungeonSkinSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {force: true, skin: ElementValue("MapTileSkin")}); - } else { - KinkyDungeonSkinDelete(KinkyDungeonTargetX + "," + KinkyDungeonTargetY); - } - - if (!noSwap) { - KDVisionUpdate = 1; - KinkyDungeonMakeBrightnessMap(KinkyDungeonGridWidth, KinkyDungeonGridHeight, KinkyDungeonMapBrightness, [], KDVisionUpdate); - KinkyDungeonMakeVisionMap(KinkyDungeonGridWidth, KinkyDungeonGridHeight, [], [], KDVisionUpdate, KinkyDungeonMapBrightness); - KDVisionUpdate = 0; - } - } - if (KDEditorTileIndexHover) { - KDEditorTileIndexStore[KDEditorTileIndexQuery] = KDEditorTileIndexHover; - } - - if (!noSwap) { - let inaccess = KDTEGetInaccessible(); - if (inaccess.length > 0) KDTE_Inaccessible = true; - else KDTE_Inaccessible = false; - } - -} - -function KDTE_UpdateUI(Load) { - let tagCount = 17; - if (Load) { - ElementCreateTextArea("MapTileTitle"); - ElementValue("MapTileTitle", KDEditorCurrentMapTileName); - ElementCreateTextArea("MapTileTileset"); - ElementValue("MapTileTileset", ElementValue("MapTileTileset") ? ElementValue("MapTileTileset") : KinkyDungeonMapIndex.grv); - ElementCreateTextArea("MapTileCategory"); - ElementValue("MapTileCategory", "urban"); - ElementCreateTextArea("MapTileWeight"); - ElementValue("MapTileWeight", "10"); - - - ElementCreateTextArea("MapTileX"); - ElementValue("MapTileX", "1"); - ElementCreateTextArea("MapTileY"); - ElementValue("MapTileY", "1"); - - ElementCreateTextArea("MapTags"); - ElementCreateTextArea("MapRequireTags"); - ElementCreateTextArea("MapForbidTags"); - - for (let i = 0; i < tagCount; i++) { - ElementCreateTextArea("MapCountTag" + i); - ElementCreateTextArea("MapCountTagMult" + i); - ElementCreateTextArea("MapCountTagBonus" + i); - ElementCreateTextArea("MapCountTagMax" + i); - ElementCreateTextArea("MapCountTagNot" + i); - ElementValue("MapCountTagMax" + i, "-1"); - ElementValue("MapCountTagBonus" + i, "0"); - ElementValue("MapCountTagMult" + i, "1"); - ElementValue("MapCountTagNot" + i, ""); - } - - } - - if (KDTE_State == "Tags") { - DrawTextFitKD("Tile Tags", 300, 50, 500, "#ffffff"); - ElementPosition("MapTags", 300, 200, 500, 200); - - DrawTextFitKD("Require Tags", 300, 350, 500, "#ffffff"); - ElementPosition("MapRequireTags", 300, 500, 500, 200); - - DrawTextFitKD("Forbid Tags", 300, 650, 500, "#ffffff"); - ElementPosition("MapForbidTags", 300, 800, 500, 200); - - for (let i = 0; i < tagCount; i++) { - DrawTextFitKD("Existing Tag", 1450, 150, 400, "#ffffff"); - DrawTextFitKD("Mult", 1720, 150, 400, "#ffffff"); - DrawTextFitKD("Bonus", 1820, 150, 400, "#ffffff"); - DrawTextFitKD("Max", 1920, 150, 400, "#ffffff"); - ElementPosition("MapCountTag" + i, 1450, 200 + 50 * i, 200, 40); - ElementPosition("MapCountTagMult" + i, 1680, 200 + 50 * i, 150, 40); - ElementPosition("MapCountTagBonus" + i, 1820, 200 + 50 * i, 110, 40); - ElementPosition("MapCountTagMax" + i, 1920, 200 + 50 * i, 110, 40); - - DrawTextFitKD("NOT", 1250, 150, 400, "#ffffff"); - ElementPosition("MapCountTagNot" + i, 1250, 200 + 50 * i, 110, 40); - } - } else { - ElementPosition("MapTags", 300, -1000, 500, 200); - ElementPosition("MapRequireTags", 300, -1000, 500, 200); - ElementPosition("MapForbidTags", 300, -1000, 500, 200); - - for (let i = 0; i < tagCount; i++) { - ElementPosition("MapCountTag" + i, 1700, -1000, 200, 40); - ElementPosition("MapCountTagMult" + i, 1900, -1000, 90, 40); - ElementPosition("MapCountTagBonus" + i, 1900, -1000, 90, 40); - ElementPosition("MapCountTagMax" + i, 1900, -1000, 90, 40); - ElementPosition("MapCountTagNot" + i, 1900, -1000, 90, 40); - } - } - - DrawTextFitKD("X", 1700, 25, 100, "#ffffff"); - ElementPosition("MapTileX", 1800, 25, 150); - DrawTextFitKD("Y", 1700, 75, 100, "#ffffff"); - ElementPosition("MapTileY", 1800, 75, 150); - - - DrawTextFitKD("Name of Tile", 1000, 25, 200, "#ffffff"); - ElementPosition("MapTileTitle", 1000, 70, 400); - let propTile = ElementValue("MapTileTitle"); - KDEditorCurrentMapTileName = propTile; - - DrawTextFitKD("Tileset", 1000 - 400, 25, 200, "#ffffff"); - ElementPosition("MapTileTileset", 1000 - 400, 70, 200); - - DrawTextFitKD("Skin", 1000 - 400, 120, 200, "#ffffff"); - KDTextField("MapTileSkin", 1000 - 400 - 100, 150, 200, 60,); - - let propTileset = ElementValue("MapTileTileset"); - if (KinkyDungeonMapParams[propTileset]) { - KinkyDungeonMapIndex.grv = propTileset; - } - - DrawTextFitKD("Category", 1000 + 350, 25, 200, "#ffffff"); - ElementPosition("MapTileCategory", 1000 + 350, 70, 200); - - DrawTextFitKD("Weight", 1000 + 550, 25, 200, "#ffffff"); - ElementPosition("MapTileWeight", 1000 + 550, 70, 200); - - if (KDTE_Inaccessible) - DrawTextFitKD("Some entrances are inaccessible. This tile will occur more rarely in worldgen", 1000, 800, 1000, "#ff5555"); -} - -function KDTESetIndexToTile(propTile) { - if (KDMapTilesListEditor[propTile]) { - let tileKeys = Object.keys(KDMapTilesListEditor); - let brushKeys = Object.keys(KDTilePalette); - KDEditorTileNameIndex = tileKeys.indexOf(propTile) - 9; - KDTE_CullIndex(tileKeys, brushKeys); - } -} - -function KDTE_CullIndex(tileKeys, brushKeys) { - KDEditorTileNameIndex = Math.max(0, Math.min(tileKeys.length - 6, KDEditorTileNameIndex)); - KDEditorTileBrushIndex = Math.max(0, Math.min(brushKeys.length - 6, KDEditorTileBrushIndex)); - KDEditorTileBrushIndex2 = Math.max(0, Math.min(brushKeys.length - 6, KDEditorTileBrushIndex2)); -} - -function KDTE_CloseUI() { - ElementRemove("MapTileTitle"); - ElementRemove("MapTileTileset"); - ElementRemove("MapTileCategory"); - ElementRemove("MapTileWeight"); - - ElementRemove("MapTileX"); - ElementRemove("MapTileY"); -} - - -/** - * - * @param {number} w - * @param {number} h - * @param {string} chkpoint - */ -function KDTE_Create(w, h, chkpoint = 'grv') { - MiniGameKinkyDungeonCheckpoint = 'grv'; - KinkyDungeonMapIndex = { - 'grv' : chkpoint, - }; - - - KinkyDungeonSeeAll = true; - - - KinkyDungeonGrid = ""; - KinkyDungeonGridWidth = KDTE_Scale * w; - KinkyDungeonGridHeight = KDTE_Scale * h; - for (let y = 0; y < KinkyDungeonGridHeight; y++) { - for (let x = 0; x < KinkyDungeonGridWidth; x++) { - KinkyDungeonGrid = KinkyDungeonGrid + "1"; - } - KinkyDungeonGrid = KinkyDungeonGrid + "\n"; - } - KinkyDungeonTiles = {}; - KinkyDungeonEffectTiles = {}; - KinkyDungeonTilesSkin = {}; - KinkyDungeonEntities = []; - KinkyDungeonTilesMemory = {}; - - KinkyDungeonPOI = []; - KDGameData.KeyringLocations = []; - - KDEditorTileIndexStore = {}; - for (let ww = 1; ww <= w; ww++) { - for (let hh = 1; hh <= h; hh++) { - KDEditorTileIndexStore[ww + "," + hh] = 'udlr'; - } - } - KDEditorTileFlexStore = {}; - KDEditorTileFlexSuperStore = {}; - - KinkyDungeonPlayerEntity = { - x: Math.floor(KinkyDungeonGridWidth/2), - y: Math.floor(KinkyDungeonGridHeight/2), - player: true, - }; - - KDInitCanvas(); - KDVisionUpdate = 1; - KinkyDungeonMakeBrightnessMap(KinkyDungeonGridWidth, KinkyDungeonGridHeight, KinkyDungeonMapBrightness, [], KDVisionUpdate); - KinkyDungeonMakeVisionMap(KinkyDungeonGridWidth, KinkyDungeonGridHeight, [], [], KDVisionUpdate, KinkyDungeonMapBrightness); - KDVisionUpdate = 0; - KDTE_UpdateUI(true); -} - -function KDTE_LoadTile(name, loadedTile) { - /** - * @type {KDMapTile} - */ - let nt = loadedTile || KDMapTilesListEditor[name]; - KDTE_Create(nt.w, nt.h); - KDEditorTileIndexStore = nt.index; - KDEditorTileFlexStore = nt.flexEdge || {}; - KDEditorTileFlexSuperStore = nt.flexEdgeSuper || {}; - if (nt.category) - ElementValue("MapTileCategory", nt.category); - if (nt.weight) - ElementValue("MapTileWeight", "" + nt.weight); - KinkyDungeonGrid = nt.grid; - KinkyDungeonPOI = []; - for (let p of nt.POI) { - KinkyDungeonPOI.push(Object.assign({}, p)); - } - KDGameData.KeyringLocations = []; - if (nt.Keyring) { - for (let k of nt.Keyring) { - KDGameData.KeyringLocations.push({x:k.x, y:k.y}); - } - } - - KinkyDungeonTiles = KDObjFromMapArray(nt.Tiles); - KinkyDungeonTilesSkin = KDObjFromMapArray(nt.Skin); - KDGameData.JailPoints = []; - for (let j of nt.Jail) { - KDGameData.JailPoints.push(Object.assign({}, j)); - } - let array = KDObjFromMapArray(nt.effectTiles); - for (let tile of Object.entries(array)) { - KinkyDungeonEffectTilesSet(tile[0], KDObjFromMapArray(tile[1])); - } - - KDVisionUpdate = 1; - KinkyDungeonMakeBrightnessMap(KinkyDungeonGridWidth, KinkyDungeonGridHeight, KinkyDungeonMapBrightness, [], KDVisionUpdate); - KinkyDungeonMakeVisionMap(KinkyDungeonGridWidth, KinkyDungeonGridHeight, [], [], KDVisionUpdate, KinkyDungeonMapBrightness); - KDVisionUpdate = 0; - - ElementValue("MapTags", nt.tags.toString()); - ElementValue("MapRequireTags", nt.requireTags.toString()); - ElementValue("MapForbidTags", nt.forbidTags.toString()); - - // JSON recreation to kill all references - KDMapTilesListEditor = JSON.parse(JSON.stringify(KDMapTilesListEditor)); - - KDTESetIndexToTile(nt.name); - - let tagCount = 17; - for (let i = 0; i < tagCount; i++) { - //if (i < nt.indexTags.length) { - ElementValue("MapCountTag" + i, nt.indexTags[i] ? nt.indexTags[i] : ""); - ElementValue("MapCountTagBonus" + i, "" + (nt.indexTags[i] ? nt.bonusTags[i] : 0)); - ElementValue("MapCountTagMult" + i, "" + (nt.indexTags[i] ? nt.multTags[i] : 1)); - ElementValue("MapCountTagMax" + i, "" + (nt.indexTags[i] ? nt.maxTags[i] : -1)); - ElementValue("MapCountTagNot" + i, (nt.indexTags[i] && nt.notTags ? nt.notTags[i] : "")); - //} - - } -} - -/** - * @returns {KDMapTile} - */ -function KDTE_ExportTile() { -/** - * @type {KDMapTile} - */ - let saveTile = { - name: KDEditorCurrentMapTileName, - w: KinkyDungeonGridWidth / KDTE_Scale, - h: KinkyDungeonGridHeight / KDTE_Scale, - primInd: KDEditorTileIndexStore["1,1"], - index: KDEditorTileIndexStore, - flexEdge: KDEditorTileFlexStore || {}, - flexEdgeSuper: KDEditorTileFlexSuperStore || {}, - scale: KDTE_Scale, - category: ElementValue("MapTileCategory"), - weight: parseInt(ElementValue("MapTileWeight")) ? parseInt(ElementValue("MapTileWeight")) : 10, - grid: KinkyDungeonGrid, - POI: KinkyDungeonPOI, - Keyring: KDGameData.KeyringLocations, - Jail: KDGameData.JailPoints, - Tiles: KinkyDungeonTiles, - effectTiles: KinkyDungeonEffectTiles, - Skin: KinkyDungeonTilesSkin, - inaccessible: KDTEGetInaccessible(), - tags: ElementValue("MapTags") ? ElementValue("MapTags").split(',') : [ElementValue("MapTileCategory")], - forbidTags: ElementValue("MapForbidTags") ? ElementValue("MapForbidTags").split(',') : [], - requireTags: ElementValue("MapRequireTags") ? ElementValue("MapRequireTags").split(',') : [], - indexTags: [], - maxTags: [], - bonusTags: [], - multTags: [], - notTags: [], - }; - - let maxTags = 17; - for (let i = 0; i < maxTags; i++) { - if (ElementValue("MapCountTag" + i)) { - saveTile.indexTags.push(ElementValue("MapCountTag" + i)); - saveTile.bonusTags.push(parseInt(ElementValue("MapCountTagBonus" + i))); - saveTile.multTags.push(parseInt(ElementValue("MapCountTagMult" + i))); - saveTile.maxTags.push(parseInt(ElementValue("MapCountTagMax" + i))); - saveTile.notTags.push(ElementValue("MapCountTagNot" + i)); - } - } - return saveTile; -} - -function KDTE_SaveTile(tile) { - let saveTile = KDTE_ExportTile(); - - // JSON recreation to kill all references - KDMapTilesListEditor[KDEditorCurrentMapTileName] = saveTile; - KDMapTilesListEditor = JSON.parse(JSON.stringify(KDMapTilesListEditor)); - - KDTESetIndexToTile(KDEditorCurrentMapTileName); - - localStorage.setItem("KDMapTilesListEditor", JSON.stringify(KDMapTilesListEditor)); -} - -/** - * @returns {{indX1: number, indY1: number, dir1: string, indX2: number, indY2: number, dir2: string}[]} - */ -function KDTEGetInaccessible() { - /** - * @type {{indX1: number, indY1: number, dir1: string, indX2: number, indY2: number, dir2: string}[]} - */ - let list = []; - /** - * @type {{indX: number, indY: number, dir: string}[]} - */ - let listEntrances = []; - - // Figure out the list of entrances we need to compare - for (let ind of Object.entries(KDEditorTileIndexStore)) { - let indX = parseInt(ind[0].split(',')[0]); - let indY = parseInt(ind[0].split(',')[1]); - - if (indX && indY) { - if (indX == 1 && ind[1].includes('l')) - listEntrances.push({indX: indX, indY: indY, dir: 'l'}); - if (indX == 1 + Math.floor((KinkyDungeonGridWidth-1)/KDTE_Scale) && ind[1].includes('r')) - listEntrances.push({indX: indX, indY: indY, dir: 'r'}); - if (indY == 1 && ind[1].includes('u')) - listEntrances.push({indX: indX, indY: indY, dir: 'u'}); - if (indY == 1 + Math.floor((KinkyDungeonGridHeight-1)/KDTE_Scale) && ind[1].includes('d')) - listEntrances.push({indX: indX, indY: indY, dir: 'd'}); - } - } - - let pairsTested = {}; - - // Now we attempt to find a path for smart enemies (player can open doors) - for (let entrance1 of listEntrances) { - for (let entrance2 of listEntrances) { - if (entrance1 == entrance2) continue; - let ID = entrance1.indX + "," + entrance1.indY + "," + entrance1.dir + "," - + entrance2.indX + "," + entrance2.indY + "," + entrance2.dir; - if (pairsTested[ID]) continue; - pairsTested[ID] = true; - let x1 = (entrance1.indX - 1)*KDTE_Scale; - if (entrance1.dir == 'r') x1 += KDTE_Scale; - else if (entrance1.dir == 'u' || entrance1.dir == 'd') x1 += Math.floor(KDTE_Scale/2); - let x2 = (entrance2.indX - 1)*KDTE_Scale; - if (entrance2.dir == 'r') x2 += KDTE_Scale; - else if (entrance2.dir == 'u' || entrance2.dir == 'd') x2 += Math.floor(KDTE_Scale/2); - let y1 = (entrance1.indY - 1)*KDTE_Scale; - if (entrance1.dir == 'd') y1 += KDTE_Scale; - else if (entrance1.dir == 'l' || entrance1.dir == 'r') y1 += Math.floor(KDTE_Scale/2); - let y2 = (entrance2.indY - 1)*KDTE_Scale; - if (entrance2.dir == 'd') y2 += KDTE_Scale; - else if (entrance2.dir == 'l' || entrance2.dir == 'r') y2 += Math.floor(KDTE_Scale/2); - - // Clear caches - KDPathCacheIgnoreLocks = new Map(); - KDPathCache = new Map(); - // Find path - let access = KinkyDungeonFindPath( - x1, y1, - x2, y2, - false, false, false, KinkyDungeonMovableTilesSmartEnemy); - - if (!access) { - list.push({ - indX1: entrance1.indX, - indY1: entrance1.indY, - indX2: entrance2.indX, - indY2: entrance2.indY, - dir1: entrance1.dir, - dir2: entrance2.dir, - }); - } - } - } - - return list; -} - -function KDObjFromMapArray(array) { - if (array.length != undefined) { - let map = {}; - for (let entry of array) { - map[entry[0]] = entry[1]; - } - return map; - } else { - return array; - } -} - -function KDReloadAllEditorTiles() { - for (let tile of Object.entries(KDMapTilesList)) { - KDEditorCurrentMapTileName = tile[0]; - KDTE_LoadTile(tile[0]); - KDTE_SaveTile(); - } -} - -function KDTE_GetField(field) { - if (!field[1]) return undefined; - if (ElementValue("KDTECustomField" + field[0]) == "") return undefined; - if (field[1].type == 'array') return ElementValue("KDTECustomField" + field[0])?.split(','); - if (field[1].type == 'number') return parseFloat(ElementValue("KDTECustomField" + field[0])) || 0; - return ElementValue("KDTECustomField" + field[0]); -} \ No newline at end of file diff --git a/Game/KinkyDungeonEditorGen.js b/Game/KinkyDungeonEditorGen.js deleted file mode 100644 index a64a68e8d..000000000 --- a/Game/KinkyDungeonEditorGen.js +++ /dev/null @@ -1,793 +0,0 @@ -"use strict"; - -/** If a tile's weight is higher than this, then any time without this much weight will get culled from the list */ -let KD_GENWEIGHTCUTOFF = 100000; - -/** - * - * @param {number} w - * @param {number} h - * @param {Record} indices - * @param {any} data - * @param {Record} requiredAccess - * @param {Record} maxTagFlags - * @returns {Record} - */ -function KDMapTilesPopulate(w, h, indices, data, requiredAccess, maxTagFlags, tagModifiers) { - /** - * temp helper var - * @type {string[]} - */ - let tiles_temp = []; - for (let t of Object.keys(indices)) { - tiles_temp.push(t); - } - /** - * order of which tiles to consider, sampled randomly from indices - * @type {string[]} - */ - let tileOrder = []; - - // Determine order of filling tiles - while (tiles_temp.length > 0) { - let ind = Math.floor(KDRandom() * tiles_temp.length); - tileOrder.push(tiles_temp[ind]); - tiles_temp.splice(ind, 1); - } - - /** - * tiles that are filled in - * @type {Record} - */ - let tilesFilled = {}; - /** - * indices that are filled in - * @type {Record} - */ - let indexFilled = {}; - - /** - * Count of each tag in a filled tile - * @type {Record} - */ - let tagCounts = {}; - - // Next we start filling in tiles! - - let fails = 0; - - let ii = 0; - - /** - * @type {Record} - */ - let globalTags = Object.assign({}, data.params.globalTags || {}); - - if (KinkyDungeonStatsChoice.get("arousalMode")) globalTags.arousalMode = true; - - while (tileOrder.length > 0) { - let tileOrderInd = Math.floor(KDRandom() * tileOrder.length); - let tileSpot = tileOrder[tileOrderInd]; - let indX = parseInt(tileSpot.split(',')[0]); - let indY = parseInt(tileSpot.split(',')[1]); - if (indX == undefined || indY == undefined) { - fails += 1; - if (fails > 100) tileOrder = []; // Nuclear meltdown - console.log("Nuclear meltdown. Pls report. Tilespot = " + tileSpot); - continue; - } - - // Only place those adjacent to the first one!!! - if (ii == 0 || ( - (indices[tileSpot].includes('l') && indexFilled[(indX - 1) + ',' + (indY)]) - || (indices[tileSpot].includes('r') && indexFilled[(indX + 1) + ',' + (indY)]) - || (indices[tileSpot].includes('u') && indexFilled[(indX) + ',' + (indY - 1)]) - || (indices[tileSpot].includes('d') && indexFilled[(indX) + ',' + (indY + 1)]) - )) { - // Get location (and entrances) - - let cornerX = (indX - 1)*KDTE_Scale + 1; - let cornerY = (indY - 1)*KDTE_Scale + 1; - - // if already occupied we skip - if (indexFilled[tileSpot]) { - tileOrder.splice(tileOrderInd, 1); - continue; - } - - let index = indices[tileSpot]; - if (!index) { - fails += 1; - if (fails > 100) tileOrder = []; // Nuclear meltdown - console.log("Nuclear meltdown. Pls report. Index = " + index + ", Tilespot = " + tileSpot); - continue; - } - - // Get tile name based on weights (TODO) - let tileName = KD_GetMapTile(index, indX, indY, tilesFilled, indexFilled, tagCounts, requiredAccess, globalTags, indices, tagModifiers); - - // Get tile from array - let tile = KDMapTilesList[tileName]; - - let tags = KD_PasteTile(tile, cornerX, cornerY, data); - if (tags) { - for (let t of tags) { - if (!tagCounts[t]) tagCounts[t] = 1; - else tagCounts[t] += 1; - } - for (let xx = 1; xx <= tile.w; xx++) - for (let yy = 1; yy <= tile.h; yy++) { - tilesFilled[(indX + xx - 1) + "," + (indY + yy - 1)] = tile; - indexFilled[(indX + xx - 1) + "," + (indY + yy - 1)] = tile.index[xx + ',' + yy]; - } - } - - tileOrder.splice(tileOrderInd, 1); - } - - for (let t of Object.entries(maxTagFlags)) { - if (tagCounts[t[0]] >= t[1]) - globalTags["max" + t[0]] = true; - } - - ii += 1; - } - - console.log(tagCounts); - console.log(globalTags); - console.log(tilesFilled); - console.log(indexFilled); - - - - return tilesFilled; -} - -/** - * - * @param {KDMapTile} mapTile - Tile to be evaluated for weight - * @param {Record} tags - Tags of the INCOMING tile, not the current one - * @param {Record} tagCounts - Counts of all tags on the map at present - * @param {Record} tagModifiers - Tags of the incoming tile will get a multiplier if the incoming tile has it - * @returns {number} - */ -function KDGetTileWeight(mapTile, tags, tagCounts, tagModifiers) { - let weight = mapTile.weight; - - // Forbid tags are not allowed - if (mapTile.forbidTags) { - for (let tag of mapTile.forbidTags) { - if (tags[tag]) return 0; - } - } - - // Require tags are all required - if (mapTile.requireTags) { - for (let tag of mapTile.requireTags) { - if (!tags[tag]) { - return 0; - } - } - } - - // Indextags are basically the index for tags that have special modifiers - for (let i = 0; i < mapTile.indexTags.length; i++) { - let not = mapTile.notTags && mapTile.notTags[i]; - if ( - (!not && tags[mapTile.indexTags[i]]) - || (not && !tags[mapTile.indexTags[i]])) { - // We abord if we've reached the max of this many tag - if (mapTile.maxTags[i] >= 0) { - let count = tagCounts[mapTile.maxTags[i]]; - if (count && count >= mapTile.maxTags[i]) return 0; - } - // We add weight - if (mapTile.bonusTags[i]) weight += mapTile.bonusTags[i]; - // We multiply weight, in sequence, AFTER bonus from the same tag - if (mapTile.multTags[i] != undefined) weight *= mapTile.multTags[i]; - - } - } - - if (weight > 0 && tagModifiers) { - for (let tag of mapTile.tags) { - if (tagModifiers[tag] != undefined) weight *= tagModifiers[tag]; - if (weight == 0) return 0; - } - } - - return weight; -} - - -/** - * - * @param {string} index - * @param {number} indX - * @param {number} indY - * @param {Record} tilesFilled - * @param {Record} indexFilled - * @param {Record} requiredAccess - * @param {Record} globalTags - * @param {Record} indices - * @param {Record} tagModifiers - * @returns {string} - */ -function KD_GetMapTile(index, indX, indY, tilesFilled, indexFilled, tagCounts, requiredAccess, globalTags, indices, tagModifiers) { - let tagList = { - "1,1": KDAggregateTileTags(indX, indY, 1, 1, tilesFilled, globalTags), - }; - - let tile = null; - - let WeightTotal = 0; - let Weights = []; - - - let maxWeight = 0; - - for (let mapTile of Object.values(KDMapTilesList)) { - if (mapTile.primInd == index || (mapTile.flexEdge && mapTile.flexEdge['1,1'])) { - if (!KDCheckMapTileFilling(mapTile, indX, indY, indices, requiredAccess, indexFilled)) continue; - - if (!KDCheckMapTileAccess(mapTile, indX, indY, indexFilled, requiredAccess)) continue; - - // Aggregate tags for the creation and evaluation of this tile, caching them if needed - let tags = tagList[mapTile.w + ',' + mapTile.h]; - if (!tags) { - tags = KDAggregateTileTags(indX, indY, mapTile.w, mapTile.h, tilesFilled, globalTags); - tagList[mapTile.w + ',' + mapTile.h] = tags; - } - - if (requiredAccess[indX + ',' + indY]) tags.start = true; - - // Determine tile candidate weight and then commit to the array if it's positive - let weight = KDGetTileWeight(mapTile, tags, tagCounts, tagModifiers); - if (weight > 0 && (maxWeight < KD_GENWEIGHTCUTOFF || weight >= KD_GENWEIGHTCUTOFF)) { - maxWeight = weight; - Weights.push({tile: mapTile, weight: WeightTotal}); - WeightTotal += mapTile.weight; - } - } - } - - if (maxWeight >= KD_GENWEIGHTCUTOFF) { - // Cull all tiles under the cutoff - for (let L = Weights.length - 1; L >= 0; L--) { - if (Weights[L].weight < KD_GENWEIGHTCUTOFF) { - Weights[L].weight = 0; - break; - } - } - } - - let selection = KDRandom() * WeightTotal; - - for (let L = Weights.length - 1; L >= 0; L--) { - if (selection > Weights[L].weight) { - tile = Weights[L].tile.name; - break; - } - } - - if (!tile) { - console.log("ERROR AT INDEX " + indX + "," + indY); - } - - return tile; -} - -/** - * - * @param {KDMapTile} mapTile - * @param {number} indX - * @param {number} indY - * @param {Record} indices - * @param {Record} requiredAccess - * @param {Record} indexFilled - * @returns {boolean} - */ -function KDCheckMapTileFilling(mapTile, indX, indY, indices, requiredAccess, indexFilled) { - let passCount = 0; - // Skip over larger tiles that dont fit the tilesFilled map or are already filled - for (let xx = 1; xx <= mapTile.w; xx++) - for (let yy = 1; yy <= mapTile.h; yy++) { - let fail = false; - // The index store of the map tile, we compare to the indices of indexfilled - let ind = mapTile.index[xx + ',' + yy]; - // Skip map tile if out of bounds - if (!indices[(xx + indX - 1) + ',' + (yy + indY - 1)]) return false; - // Skip this mapTile if it doesnt fit - if (ind != indices[(xx + indX - 1) + ',' + (yy + indY - 1)] && KDLooseIndexRankingSuspend(indices[(xx + indX - 1) + ',' + (yy + indY - 1)], ind, mapTile.w, mapTile.h, xx, yy)) { - if (mapTile.flexEdge && mapTile.flexEdge[xx + ',' + yy] && ((mapTile.flexEdgeSuper && mapTile.flexEdgeSuper[xx + ',' + yy]) || ( - // 1st condition: tile is inside this one - // 2nd condition: this tile doesn't need it - // 3rd condition: other index is already filled - (yy > 1 || !indices[(xx + indX - 1) + ',' + (yy + indY - 1)].includes('u') || indexFilled[(xx + indX - 1) + ',' + (yy + indY - 1 - 1)]) - && (yy < mapTile.h || !indices[(xx + indX - 1) + ',' + (yy + indY - 1)].includes('d') || indexFilled[(xx + indX - 1) + ',' + (yy + indY - 1 + 1)]) - && (xx < mapTile.w || !indices[(xx + indX - 1) + ',' + (yy + indY - 1)].includes('l') || indexFilled[(xx + indX - 1 - 1) + ',' + (yy + indY - 1)]) - && (xx > 1 || !indices[(xx + indX - 1) + ',' + (yy + indY - 1)].includes('r') || indexFilled[(xx + indX - 1 + 1) + ',' + (yy + indY - 1)]) - ))) fail = true; - else return false; - } - // Skip this mapTile if it's already filled - if (indexFilled[(xx + indX - 1) + ',' + (yy + indY - 1)]) return false; - // Make sure none of the tile overlaps with required access... - if (mapTile.w != 1 || mapTile.h != 1 || (mapTile.inaccessible && mapTile.inaccessible.length > 0)) { - if (requiredAccess[(xx + indX - 1) + ',' + (yy + indY - 1)]) return false; - } - if (!fail) - passCount += 1; - } - return passCount > 0; -} - -/** Suspends the inside of large tiles */ -function KDLooseIndexRankingSuspend(indexCheck, indexTile, w, h, xx, yy) { - if (w == 1 && h == 1) return true; // Tiles that are 1/1 dont get requirements suspended - if (xx > 1 && xx < w && yy > 1 && yy < h) return false; // Suspended tiles in the middle - if (!indexCheck) return true; // This means we hit the border - if (!indexTile) return true; // This is bad but it shouldnt crash the game. We just dont place the tile - if (indexCheck.includes('u') && yy == 1 && !indexTile.includes('u')) return true; // Dont suspend if we dont have the appropriate index entrance - if (indexCheck.includes('d') && yy == h && !indexTile.includes('d')) return true; // Dont suspend if we dont have the appropriate index entrance - if (indexCheck.includes('l') && xx == 1 && !indexTile.includes('l')) return true; // Dont suspend if we dont have the appropriate index entrance - if (indexCheck.includes('r') && xx == w && !indexTile.includes('r')) return true; // Dont suspend if we dont have the appropriate index entrance - return false; -} - -/** - * - * @param {KDMapTile} mapTile - * @param {number} indX - * @param {number} indY - * @param {Record} indexFilled - * @param {Record} requiredAccess - * @returns {boolean} - */ -function KDCheckMapTileAccess(mapTile, indX, indY, indexFilled, requiredAccess) { - // If any entrance pairs are inaccessible then BOTH must be filled in... - if (mapTile.inaccessible) { - for (let access of mapTile.inaccessible) { - let XX1 = indX + access.indX1 - 1; - let XX2 = indX + access.indX2 - 1; - let YY1 = indY + access.indY1 - 1; - let YY2 = indY + access.indY2 - 1; - - if ((access.dir1 == "l" && !indexFilled[(XX1 - 1) + ',' + (YY1)]) - || (access.dir1 == "r" && !indexFilled[(XX1 + 1) + ',' + (YY1)]) - || (access.dir1 == "u" && !indexFilled[(XX1) + ',' + (YY1 - 1)]) - || (access.dir1 == "d" && !indexFilled[(XX1) + ',' + (YY1 + 1)]) - ) return false; - - if ((access.dir2 == "l" && !indexFilled[(XX2 - 1) + ',' + (YY2)]) - || (access.dir2 == "r" && !indexFilled[(XX2 + 1) + ',' + (YY2)]) - || (access.dir2 == "u" && !indexFilled[(XX2) + ',' + (YY2 - 1)]) - || (access.dir2 == "d" && !indexFilled[(XX2) + ',' + (YY2 + 1)]) - ) return false; - } - } - return true; -} - -/** - * - * @param {KDMapTile} tile - * @param {number} x - * @param {number} y - * @param {any} y - * @returns {string[]} - */ -function KD_PasteTile(tile, x, y, data) { - let tileWidth = KDTE_Scale * tile.w; - let tileHeight = KDTE_Scale * tile.h; - - for (let xx = 0; xx < tileWidth; xx++) - for (let yy = 0; yy < tileHeight; yy++) { - let tileTile = tile.grid[xx + yy*(tileWidth+1)]; - KinkyDungeonMapSetForce(x + xx, y + yy, tileTile); - if (tileTile == 'B' && !data.notraps && KinkyDungeonStatsChoice.has("Nowhere")) { - if (KDRandom() < 0.5) - KinkyDungeonTilesSet((x + xx) + "," + (y + yy), { - Type: "Trap", - Trap: "BedTrap", - }); - } - } - - if (tile.Keyring) { - for (let k of tile.Keyring) { - KDGameData.KeyringLocations.push({x:x + k.x, y:y + k.y}); - } - } - - if (tile.POI) - for (let origPoi of tile.POI) { - let poi = Object.assign({}, origPoi); - KinkyDungeonPOI.push(poi); - poi.x = x + poi.x; - poi.y = y + poi.y; - if (poi.chance && KDRandom() > poi.chance) - poi.used = true; - } - for (let tileLoc of Object.entries(tile.Tiles)) { - let xx = parseInt(tileLoc[0].split(',')[0]); - let yy = parseInt(tileLoc[0].split(',')[1]); - if (xx != undefined && yy != undefined) { - let gennedTile = KDCreateTile(xx+x, yy+y, Object.assign({}, tileLoc[1]), data); - if (gennedTile) - KinkyDungeonTilesSet((xx + x) + "," + (yy + y), gennedTile); - } - } - for (let tileLoc of Object.entries(tile.Skin)) { - let xx = parseInt(tileLoc[0].split(',')[0]); - let yy = parseInt(tileLoc[0].split(',')[1]); - if (xx != undefined && yy != undefined) { - KinkyDungeonTilesSkin[(xx + x) + "," + (yy + y)] = tileLoc[1]; - } - } - /*for (let jail of tile.Jail) { - let newJail = Object.assign({}, jail); - newJail.x += x; - newJail.y += y; - KDGameData.JailPoints.push(newJail); - - }*/ - - for (let tileLoc of Object.entries(tile.effectTiles)) { - let xx = parseInt(tileLoc[0].split(',')[0]); - let yy = parseInt(tileLoc[0].split(',')[1]); - if (xx != undefined && yy != undefined) { - for (let eTile of Object.entries(tileLoc[1])) { - KDCreateEffectTileTile(xx+x, yy+y, eTile[1], data); - } - } - } - - return tile.tags; -} - - -let KDEffectTileGen = { - "TorchUnlit": (x, y, tile, tileGenerator, data) => { - let torchlitchance = data.params.torchlitchance || 0.6; - let torchreplace = data.params.torchreplace; - - let spr = torchreplace ? torchreplace.sprite : "Torch"; - if ((!torchreplace || torchreplace.unlitsprite) && KDRandom() > torchlitchance) { - spr = torchreplace ? torchreplace.unlitsprite : "TorchUnlit"; - } - KDCreateEffectTile(x, y, { - name: spr, - duration: 9999, - }, 0); - return null; - }, - "Torch": (x, y, tile, tileGenerator, data) => { - let torchlitchance = 1.0; - let torchreplace = data.params.torchreplace; - - let spr = torchreplace ? torchreplace.sprite : "Torch"; - if ((!torchreplace || torchreplace.unlitsprite) && KDRandom() > torchlitchance) { - spr = torchreplace ? torchreplace.unlitsprite : "TorchUnlit"; - } - KDCreateEffectTile(x, y, { - name: spr, - duration: 9999, - }, 0); - return null; - }, - "Wire": (x, y, tile, tileGenerator, data) => { - KDCreateEffectTile(x, y, { - name: "Wire", - duration: 9999, - }, 0); - return null; - }, -}; - -/** - * @type {Record any>} - */ -let KDTileGen = { - "Rubble": (x, y, tile, tileGenerator, data) => { - let rubblechance = data.params.rubblechance || 0.5; - if (KDRandom() < rubblechance) - KinkyDungeonMapSet(x, y, 'R'); - else if (KDRandom() < rubblechance * rubblechance - 0.01) - KinkyDungeonMapSet(x, y, '/'); - else - KinkyDungeonMapSet(x, y, 'r'); - return null; - }, - "Debris": (x, y, tile, tileGenerator, data) => { - let rubblechance = data.params.rubblechance || 1; - if (tileGenerator.Always || KDRandom() < rubblechance) - KinkyDungeonMapSet(x, y, '/'); - else - KinkyDungeonMapSet(x, y, 'r'); - return null; - }, - "Barrel": (x, y, tile, tileGenerator, data) => { - let barrelChance = data.params.barrelChance || 0.25; - if (tileGenerator.Always || KDRandom() < barrelChance) - KinkyDungeonMapSet(x, y, 'L'); - else - KinkyDungeonMapSet(x, y, 'r'); - return null; - }, - "Spawn": (x, y, tile, tileGenerator, data) => { - data.spawnpoints.push({x:x, y:y, required: tileGenerator.required, ftags: tileGenerator.filterTags, tags: tileGenerator.tags, AI: tileGenerator.AI, faction: tileGenerator.faction}); - KinkyDungeonMapSet(x, y, '0'); - return null; - }, - "ForceSpawn": (x, y, tile, tileGenerator, data) => { - if (!tileGenerator.Chance || KDRandom() < tileGenerator.Chance) { - let enemy = KinkyDungeonGetEnemy(tileGenerator.tags, MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - '0', tileGenerator.required, tileGenerator.requireHostile, tileGenerator.bonusTags, tileGenerator.filterTags, tileGenerator.requireSingleTag); - DialogueCreateEnemy(x, y, enemy.name); - } - KinkyDungeonMapSet(x, y, '0'); - return null; - }, - "Prisoner": (x, y, tile, tileGenerator, data) => { - SetpieceSpawnPrisoner(x, y); - KinkyDungeonMapSet(x, y, '0'); - return null; - }, - "Chest": (x, y, tile, tileGenerator, data) => { - if (tileGenerator.Loot) { - if (tileGenerator.Priority || KDRandom() < (tileGenerator.Chance || 0.5)) { - KinkyDungeonMapSet(x, y, 'C'); - KDGameData.ChestsGenerated.push(tileGenerator.Loot); - return { - NoTrap: tileGenerator.NoTrap, - Type: tileGenerator.Lock ? "Lock" : undefined, Lock: tileGenerator.Lock == "Red" ? KDRandomizeRedLock() : tileGenerator.Lock, - Loot: tileGenerator.Lock == "Blue" ? "blue" : (tileGenerator.Loot ? tileGenerator.Loot : "chest"), - //Faction: tileGenerator.Faction, - Roll: KDRandom(), - Special: tileGenerator.Lock == "Blue", - RedSpecial: tileGenerator.Lock?.includes("Red"), - lootTrap: KDGenChestTrap(false, x, y, (tileGenerator.Loot ? tileGenerator.Loot : "chest"), tileGenerator.Lock, tileGenerator.NoTrap), - }; - } else { - KinkyDungeonMapSet(x, y, 'c'); - } - } else { - data.chestlist.push(({x: x, y: y, priority: tileGenerator.Priority, NoTrap: tileGenerator.NoTrap})); - KinkyDungeonMapSet(x, y, '2'); - } - return null; - }, - "GuardedChest": (x, y, tile, tileGenerator, data) => { - KinkyDungeonMapSet(x, y, 'C'); - let faction = KDPlaceChest(x - 1, y - 1, 3, data.chestlist, data.spawnpoints, true); - return { - NoTrap: tileGenerator.NoTrap, - Type: tileGenerator.Lock ? "Lock" : undefined, Lock: tileGenerator.Lock, - Loot: tileGenerator.Lock == "Blue" ? "blue" : (tileGenerator.Loot ? tileGenerator.Loot : "chest"), - Faction: faction, - Roll: KDRandom(), - Special: tileGenerator.Lock == "Blue", - RedSpecial: tileGenerator.Lock?.includes("Red"), - lootTrap: KDGenChestTrap(false, x, y, (tileGenerator.Loot ? tileGenerator.Loot : "chest"), tileGenerator.Lock, tileGenerator.NoTrap), - }; - }, - "ChestOrShrine": (x, y, tile, tileGenerator, data) => { - let chestcount = data.params.chestcount || 1; - let shrinecount = data.params.shrinecount || 1; - if (KDRandom() < (chestcount) / Math.max(1, chestcount + shrinecount)) - data.chestlist.push(({x: x, y: y, NoTrap: tileGenerator.NoTrap})); - else - data.shrinelist.push(({x: x, y: y, NoTrap: tileGenerator.NoTrap})); - KinkyDungeonMapSet(x, y, '2'); - return null; - }, - "Door": (x, y, tile, tileGenerator, data) => { - let doorchance = data.params.doorchance; // Chance door will be closed - let nodoorchance = data.params.nodoorchance || 0; // Chance of there not being a door - - // No doors/grates next to each other unless forced - if ("Ddg".includes(KinkyDungeonMapGet(x - 1, y)) - || "Ddg".includes(KinkyDungeonMapGet(x + 1, y)) - || "Ddg".includes(KinkyDungeonMapGet(x, y - 1)) - || "Ddg".includes(KinkyDungeonMapGet(x, y + 1))) - nodoorchance = 1.0; - else if ( - !(KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 1, y)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x - 1, y))) - && !(KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x, y + 1)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x, y - 1))) - ) { - // No doors if there isn't a straight path - nodoorchance = 1.0; - } - - // The door algorithm has been deprecated - //let doorlockchance = data.params.doorlockchance; // Max treasure chest count - - if (tileGenerator.Priority || KDRandom() > nodoorchance) { - if (tileGenerator.AlwaysClose || KDRandom() < doorchance) { - KinkyDungeonMapSet(x, y, 'D'); - } else { - KinkyDungeonMapSet(x, y, 'd'); - } - return {Type: "Door", Lock: tileGenerator.Lock == "Red" ? KDRandomizeRedLock() : tileGenerator.Lock, OffLimits: tileGenerator.OffLimits}; - } else { - KinkyDungeonMapSet(x, y, '2'); - } - return null; - }, - "Shrine": (x, y, tile, tileGenerator, data) => { - data.shrinelist.push(({x: x, y: y, priority: tileGenerator.Priority})); - KinkyDungeonMapSet(x, y, 'a'); - return null; - }, - "DollDropoff": (x, y, tile, tileGenerator, data) => { - if (KinkyDungeonStatsChoice.get("NoDoll")) { - KinkyDungeonMapSet(x, y, '0'); - return null; - } - KinkyDungeonMapSet(x, y, '5'); - KDGameData.JailPoints.push({x: x, y: y, type: "dropoff", direction: tileGenerator.direction || {x: 0, y: -1}, radius: 1, restrainttags: ["dollstand"]}); - //KinkyDungeonTilesSkinSet(x + "," + y, 'Bel'); - return {Sprite: "Floor", Overlay: tileGenerator.Overlay || "DollDropoff"}; - }, - "Cage": (x, y, tile, tileGenerator, data) => { - KinkyDungeonMapSet(x, y, 'L'); - KDGameData.JailPoints.push({x: x, y: y, type: "furniture", radius: 1}); - return {Furniture: "Cage"}; - }, - "DisplayStand": (x, y, tile, tileGenerator, data) => { - KinkyDungeonMapSet(x, y, 'L'); - KDGameData.JailPoints.push({x: x, y: y, type: "furniture", radius: 1}); - return {Furniture: "DisplayStand"}; - }, - "Furniture": (x, y, tile, tileGenerator, data) => { - //KinkyDungeonMapSet(x, y, tileGenerator.tile); - KDGameData.JailPoints.push({x: x, y: y, type: "furniture", radius: 1}); - return {Furniture: tileGenerator.Furniture}; - }, - "Table": (x, y, tile, tileGenerator, data) => { - KinkyDungeonMapSet(x, y, 'F'); - let type = ""; - - if (tileGenerator.Food == "Plate") { - let WeightTotal = 0; - let Weights = []; - - for (let obj of Object.values(KDFood)) { - Weights.push({event: obj, weight: WeightTotal}); - WeightTotal += obj.Weight; - } - - let selection = KDRandom() * WeightTotal; - - for (let L = Weights.length - 1; L >= 0; L--) { - if (selection > Weights[L].weight) { - type = Weights[L].event.Food; - break; - } - } - } - return {Food: type, Type: "Food"}; - }, - "Trap": (x, y, tile, tileGenerator, data) => { - let trapchance = data.params.trapchance || 0.1; - if (tileGenerator.Always || KDRandom() < trapchance) - data.traps.push(({x: x, y: y})); - KinkyDungeonMapSet(x, y, '2'); - return null; - }, - "Charger": (x, y, tile, tileGenerator, data) => { - if (tileGenerator.Priority) { - return {Type: "Charger", NoRemove: KinkyDungeonMapGet(x, y) == '=', lightColor: KDChargerColor, Light: (KinkyDungeonMapGet(x, y) == '=' ? KDChargerLight : undefined)}; - } - KinkyDungeonMapSet(x, y, '-'); - data.chargerlist.push(({x: x, y: y})); - return null; - }, - "Conveyor": (x, y, tile, tileGenerator, data) => { - KinkyDungeonMapSet(x, y, 'V'); - return {Type: "Conveyor", DX: tileGenerator.DX, DY: tileGenerator.DY, OffLimits: true, wireType: tileGenerator.wireType, SwitchMode: tileGenerator.SwitchMode}; - }, - "DollSupply": (x, y, tile, tileGenerator, data) => { - KinkyDungeonMapSet(x, y, 'u'); - return {Type: "DollSupply", index: 0, cd: 0, rate: tileGenerator.rate || 10, count: tileGenerator.count, dollType: tileGenerator.dollType, SwitchMode: tileGenerator.SwitchMode, wireType: tileGenerator.wireType}; - }, - "DollTerminal": (x, y, tile, tileGenerator, data) => { - KinkyDungeonMapSet(x, y, 't'); - return {Type: "DollTerminal", OffLimits: true}; - }, - "BondageMachine": (x, y, tile, tileGenerator, data) => { - KinkyDungeonMapSet(x, y, 'N'); - return {Type: "BondageMachine", OffLimits: true, Binding: tileGenerator.Binding}; - }, - "EffectTile": (x, y, tile, tileGenerator, data) => { - KDCreateEffectTile(x, y, { - name: tileGenerator.Tile, - }, 0); - return null; - }, - "AutoDoor": (x, y, tile, tileGenerator, data) => { - return {wireType: tileGenerator.wireType}; - }, -}; - -/** - * Creates a map tile based on a generator tile - * @param {number} x - * @param {number} y - * @param {any} tileGenerator - * @param {any} data - * @returns {any} - */ -function KDCreateTile(x, y, tileGenerator, data) { - let tile = {}; - if (tileGenerator.Type) { - tile = KDTileGen[tileGenerator.Type](x, y, tile, tileGenerator, data); - } else { - tile = Object.assign({}, tileGenerator); - tile.x = x; - tile.y = y; - } - if (tile) - return tile; -} - - -/** - * Creates a map tile based on a generator tile - * @param {number} x - * @param {number} y - * @param {any} tileGenerator - * @param {any} data - * @returns {any} - */ -function KDCreateEffectTileTile(x, y, tileGenerator, data) { - let tile = {}; - if (tileGenerator.name && KDEffectTileGen[tileGenerator.name]) { - tile = KDEffectTileGen[tileGenerator.name](x, y, tile, tileGenerator, data); - } else { - tile = KDCreateEffectTile(x, y, { - name: tileGenerator.name, - duration: tileGenerator.duration, - }, 0); - } - if (tile) - return tile; -} - -/** - * Aggregates tags from nearby tiles for the specific tile - * @param {number} x - Top left corner - * @param {number} y - Top left corner - * @param {number} w - Tile size - * @param {number} h - Tile size - * @param {Record} tilesFilled - * @param {Record} globalTags - * @return {Record} - */ -function KDAggregateTileTags(x, y, w, h, tilesFilled, globalTags) { - /** - * Record of tag name => tile that has the tag - * @type {Record} - */ - let tags = Object.assign({}, globalTags); - - // Loop over tile's borders and add up tags - for (let indX = x - 1; indX <= x + w; indX++) - for (let indY = y - 1; indY <= y + h; indY++) { - let index = indX < x ? "L_" : (indX >= x + w ? "R_" : ""); - index = (indY < y ? "U" : (indY >= y + h ? "D" : "")) + index; - - if (index) { - let neighbor = tilesFilled[indX + ',' + indY]; - if (neighbor) { - for (let t of neighbor.tags) { - tags[index + t] = true; - tags[t] = true; - } - } - } - } - - return tags; -} \ No newline at end of file diff --git a/Game/KinkyDungeonEditorTiles.js b/Game/KinkyDungeonEditorTiles.js deleted file mode 100644 index ca98f6439..000000000 --- a/Game/KinkyDungeonEditorTiles.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; - -/** - * @type {Record} - */ -let KDMapTilesList = -{"HallCross":{"name":"HallCross","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1110111\n0000000\n1110111\n1110111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.75}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"5,3":{"TorchUnlit":{"x":5,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"T_Left_Thinvert":{"name":"T_Left_Thinvert","w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n111d111\n1110L00\n1110000\n11100L0\n111d111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[],"Tiles":{"3,1":{"Type":"Door"},"3,5":{"Type":"Door"},"4,2":{"Type":"Barrel"},"5,4":{"Type":"Barrel"}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban"],"forbidTags":["silverchest"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"deadend_d":{"name":"deadend_d","w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11RRL11\n1L00001\n10000L1\n1000001\n1000001\n111d111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["urban"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"3,6":{"Type":"Door"},"5,3":{"Type":"Barrel"},"4,1":{"Type":"Barrel"},"1,2":{"Type":"Barrel"},"2,1":{"Type":"Rubble"},"3,1":{"Type":"Rubble"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"deadend_u":{"name":"deadend_u","w":1,"h":1,"primInd":"u","index":{"1,1":"u"},"scale":7,"category":"urban","weight":10,"grid":"111d111\n10L0001\n1000001\n1000001\n10000R1\n110LL11\n1111111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["urban"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"3,0":{"Type":"Door"},"2,1":{"Type":"Barrel"},"4,5":{"Type":"Barrel"},"3,5":{"Type":"Barrel"},"5,4":{"Type":"Rubble"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"deadend_l":{"name":"deadend_l","w":1,"h":1,"primInd":"l","index":{"1,1":"l"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1LL00,1\n1L00001\nd000001\n10000R1\n1LL0011\n1111111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["urban"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"0,3":{"Type":"Door"},"1,5":{"Type":"Barrel"},"2,5":{"Type":"Barrel"},"1,1":{"Type":"Barrel"},"1,2":{"Type":"Barrel"},"2,1":{"Type":"Barrel"},"5,4":{"Type":"Rubble"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"deadend_r":{"name":"deadend_r","w":1,"h":1,"primInd":"r","index":{"1,1":"r"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11LL001\n1R00001\n100000d\n1L00001\n11L0001\n1111111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["urban"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"6,3":{"Type":"Door"},"3,1":{"Type":"Barrel"},"2,5":{"Type":"Barrel"},"1,4":{"Type":"Barrel"},"2,1":{"Type":"Barrel"},"1,2":{"Type":"Rubble"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"narrow_noleft":{"name":"narrow_noleft","w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1100001\n1100000\n1100001\n1110111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.75}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_noright":{"name":"narrow_noright","w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1000011\n0000011\n1000011\n1110111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.75}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_noup":{"name":"narrow_noup","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1100001\n1100001\n0000000\n1100001\n1100001\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.75}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_nodown":{"name":"narrow_nodown","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"temple","weight":50,"grid":"1111111\n1X1X1X1\n0000000\n2222222\n0000000\n1X1X1X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":[],"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"narrow_upright":{"name":"narrow_upright","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1100111\n1100000\n1100011\n1111111\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_upleft":{"name":"narrow_upleft","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1110011\n0000011\n1100011\n1111111\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_downleft":{"name":"narrow_downleft","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n,100011\n0000011\n1110011\n1110111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_downright":{"name":"narrow_downright","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n1100011\n1100000\n1100111\n1110111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_vert":{"name":"narrow_vert","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1100111\n1100111\n11R0111\n1100111\n1100111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,3":{"Type":"Rubble"}},"effectTiles":{"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_horiz":{"name":"narrow_horiz","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n100R001\n0000000\n1111111\n1111111\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"Rubble"}},"effectTiles":{"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"VertChest":{"name":"VertChest","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"111D111\n1120211\n1120211\n112C211\n1120211\n1120211\n111D111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,0":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"3,6":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"}},"effectTiles":{"4,1":{"Torch":{"x":4,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["ignite","hot"]}},"2,1":{"Torch":{"x":2,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["ignite","hot"]}}},"Skin":[],"inaccessible":[{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"u","dir2":"d"},{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"d","dir2":"u"}],"tags":["door","locked","chest","wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"wide_horiz":{"name":"wide_horiz","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n0L0L0L0\n0000000\n00L0L00\n1111111\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"1,2":{"Type":"Barrel"},"2,4":{"Type":"Barrel"},"3,2":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"5,2":{"Type":"Barrel"}},"effectTiles":{"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":["silverchest"],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_vert":{"name":"wide_vert","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"1100011\n11L0011\n1100L11\n11L0011\n1100L11\n11L0011\n1100011\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,3":{"Type":"Barrel"},"4,2":{"Type":"Barrel"},"2,1":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"2,5":{"Type":"Barrel"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":["silverchest"],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"HallCrossWide":{"name":"HallCrossWide","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"urban","weight":10,"grid":"1100011\n1100011\n0000000\n0000000\n0000000\n1100011\n1100011\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[],"Tiles":[],"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"HallCrossWideDoors":{"name":"HallCrossWideDoors","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"urban","weight":10,"grid":"111d111\n1100011\n1000001\nd00000d\n1000001\n1100011\n111d111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[],"Tiles":{"6,3":{"Type":"Door"},"3,0":{"Type":"Door"},"3,6":{"Type":"Door"},"0,3":{"Type":"Door"}},"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"HallCrossWideRoom":{"name":"HallCrossWideRoom","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"urban","weight":15,"grid":"1100011\n1000001\n0010100\n000G000\n0010100\n1000001\n1100011\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,5":{"TorchUnlit":{"x":4,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,5":{"TorchUnlit":{"x":2,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":["start"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"wide_upleft":{"name":"wide_upleft","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"scale":7,"category":"urban","weight":10,"grid":"1100R11\n1,0R011\n000/R11\n000LL11\n00RLL11\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"4,3":{"Type":"Barrel"},"3,4":{"Type":"Barrel"},"4,2":{"Type":"Rubble"},"2,4":{"Type":"Rubble"},"3,1":{"Type":"Rubble"},"4,0":{"Type":"Rubble"},"3,2":{"Type":"Debris","Always":true}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":["silverchest"],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_upright":{"name":"wide_upright","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"scale":7,"category":"urban","weight":10,"grid":"1100011\n1100011\n11RR000\n11LLR00\n11LL/00\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"4,4":{"Type":"Debris"},"3,3":{"Type":"Barrel"},"2,3":{"Type":"Barrel"},"2,4":{"Type":"Barrel"},"3,4":{"Type":"Barrel"},"2,2":{"Type":"Rubble"},"3,2":{"Type":"Rubble"},"4,3":{"Type":"Rubble"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_downleft":{"name":"wide_downleft","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n0RLLL11\n00RL/11\n000LL11\n1100R11\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"4,2":{"Type":"Barrel"},"3,2":{"Type":"Barrel"},"2,2":{"Type":"Barrel"},"3,3":{"Type":"Barrel"},"3,4":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"1,2":{"Type":"Rubble"},"2,3":{"Type":"Rubble"},"4,5":{"Type":"Rubble"},"4,3":{"Type":"Debris"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_downright":{"name":"wide_downright","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n11/LLR0\n11RLR00\n110R0L0\n11L0011\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"4,2":{"Type":"Barrel"},"3,2":{"Type":"Barrel"},"3,3":{"Type":"Barrel"},"5,4":{"Type":"Barrel"},"2,5":{"Type":"Barrel"},"5,2":{"Type":"Rubble"},"4,3":{"Type":"Rubble"},"3,4":{"Type":"Rubble"},"2,3":{"Type":"Rubble"},"2,2":{"Type":"Debris"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_RoomNoLeft":{"name":"wide_RoomNoLeft","w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"scale":7,"category":"urban","weight":10,"grid":"111d111\n1000001\n10+0001\n10OG00d\n10+0001\n1000001\n111d111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"6,3":{"Type":"Door"},"3,0":{"Type":"Door"},"3,6":{"Type":"Door"},"2,2":{"Type":"Charger"},"2,4":{"Type":"Charger"},"2,3":{"Type":"ChestOrShrine"},"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_RoomNoRight":{"name":"wide_RoomNoRight","w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"scale":7,"category":"urban","weight":10,"grid":"111d111\n1000001\n1000+01\nd00GO01\n1000+01\n1000001\n111d111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,0":{"Type":"Door"},"3,6":{"Type":"Door"},"0,3":{"Type":"Door"},"4,3":{"Type":"ChestOrShrine"},"4,2":{"Type":"Charger"},"4,4":{"Type":"Charger"},"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_RoomNoDown":{"name":"wide_RoomNoDown","w":1,"h":1,"primInd":"ulr","index":{"1,1":"ulr"},"scale":7,"category":"urban","weight":10,"grid":"111d111\n1000001\n1000001\nd00G00d\n10+O+01\n1000001\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,0":{"Type":"Door"},"0,3":{"Type":"Door"},"6,3":{"Type":"Door"},"2,4":{"Type":"Charger"},"4,4":{"Type":"Charger"},"3,4":{"Type":"ChestOrShrine"},"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_RoomNoUp":{"name":"wide_RoomNoUp","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1000001\n10+O+01\nd00G00d\n1000001\n1000001\n111d111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"0,3":{"Type":"Door"},"6,3":{"Type":"Door"},"3,6":{"Type":"Door"},"3,2":{"Type":"ChestOrShrine"},"2,2":{"Type":"Charger"},"4,2":{"Type":"Charger"},"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"T_Right_Thinvert":{"name":"T_Right_Thinvert","w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n111d111\n00L0111\n0000111\n0LL0111\n111d111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[],"Tiles":{"3,5":{"Type":"Door"},"3,1":{"Type":"Door"},"2,2":{"Type":"Barrel"},"2,4":{"Type":"Barrel"},"1,4":{"Type":"Barrel"}},"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"wide_horizDoors":{"name":"wide_horizDoors","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n1000001\nd00000d\n1000001\n1111111\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"6,3":{"Type":"Door"},"0,3":{"Type":"Door"}},"effectTiles":{"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_vertDoors":{"name":"wide_vertDoors","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"111d111\n1100011\n1100011\n1100011\n1100011\n1100011\n111d111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,0":{"Type":"Door"},"3,6":{"Type":"Door"}},"effectTiles":{"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"narrow_noleft_room":{"name":"narrow_noleft_room","w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"scale":7,"category":"urban","weight":10,"grid":"1110011\n1111011\n1+01d11\n1O00000\n1+01d11\n1111011\n1110011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"4,4":{"Type":"Door"},"4,2":{"Type":"Door"},"1,3":{"Type":"ChestOrShrine"},"1,2":{"Type":"Charger"},"1,4":{"Type":"Charger"}},"effectTiles":{"5,3":{"TorchUnlit":{"x":5,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"3,3":{"TorchUnlit":{"x":3,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_noright_room":{"name":"narrow_noright_room","w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"scale":7,"category":"urban","weight":10,"grid":"1100111\n1101111\n11d10+1\n00000O1\n11d10+1\n1101111\n1100111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,2":{"Type":"Door"},"2,4":{"Type":"Door"},"5,3":{"Type":"ChestOrShrine"},"5,2":{"Type":"Charger"},"5,4":{"Type":"Charger"}},"effectTiles":{"3,3":{"TorchUnlit":{"x":3,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_noup_room":{"name":"narrow_noup_room","w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"scale":7,"category":"urban","weight":10,"grid":"1100111\n1101111\n11d10+1\n00000O1\n11d10+1\n1101111\n1100111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,2":{"Type":"Door"},"2,4":{"Type":"Door"},"5,3":{"Type":"ChestOrShrine"},"5,2":{"Type":"Charger"},"5,4":{"Type":"Charger"}},"effectTiles":{"3,3":{"TorchUnlit":{"x":3,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_noup_silver":{"name":"narrow_noup_silver","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11oCo11\n1100011\n0100010\n0d000d0\n111d111\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,1":{"Type":"Chest","Loot":"silver","Priority":true},"5,4":{"Type":"Door"},"1,4":{"Type":"Door"},"3,5":{"Type":"Door"}},"effectTiles":{"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow","silverchest"],"forbidTags":["silverchest"],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[1,1],"notTags":["",""]},"wide_horiz_chestshrine":{"name":"wide_horiz_chestshrine","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n002O200\n002G200\n0000000\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"ChestOrShrine"},"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"narrow_vert_spawn":{"name":"narrow_vert_spawn","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1X222X1\n1G000G1\n1X2O2X1\n1G000G1\n1X222X1\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"ChestOrShrine"},"5,2":{"Type":"Spawn","required":[],"AI":"looseguard"},"1,2":{"Type":"Spawn","required":[],"AI":"looseguard"},"1,4":{"Type":"Spawn","required":[],"AI":"looseguard"},"5,4":{"Type":"Spawn","required":[],"AI":"looseguard"}},"effectTiles":{"4,1":{"Torch":{"x":4,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,1":{"Torch":{"x":2,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_horiz_spawn":{"name":"narrow_horiz_spawn","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1X222X1\n1G000G1\nd02O00d\n1G000G1\n1X222X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"ChestOrShrine"},"6,3":{"Type":"Door"},"0,3":{"Type":"Door"},"5,2":{"Type":"Spawn","required":[],"AI":"looseguard"},"5,4":{"Type":"Spawn","required":[],"AI":"looseguard"},"1,4":{"Type":"Spawn","required":[],"AI":"looseguard"},"1,2":{"Type":"Spawn","required":[],"AI":"looseguard"}},"effectTiles":{"4,1":{"Torch":{"x":4,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,1":{"Torch":{"x":2,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":["start"],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_uprightOpen":{"name":"narrow_uprightOpen","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1100111\n1?0000d\n1000001\n1XLX111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":2,"y":5,"type":"furniture","radius":1}],"Tiles":{"6,3":{"Type":"Door"},"2,5":{"Type":"Cage","Furniture":"Cage"}},"effectTiles":{"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_upleftOpen":{"name":"narrow_upleftOpen","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n111d111\n1110LL1\n0d00La1\n1120LL1\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"5,2":{"Type":"Barrel"},"5,4":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"4,3":{"Type":"Barrel"},"4,2":{"Type":"Barrel"},"1,3":{"Type":"Door"},"3,1":{"Type":"Door"}},"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_downleftOpen":{"name":"narrow_downleftOpen","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n112B211\n1120211\n0d00011\n112?211\n1120211\n111d111\n","POI":[],"Keyring":[{"x":3,"y":2}],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"1,3":{"Type":"Door"},"3,6":{"Type":"Door"}},"effectTiles":{"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_downrightOpen":{"name":"narrow_downrightOpen","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1R1LLL1\n1L1g1d1\n1000100\n10L0111\n1000111\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":2,"y":4,"type":"furniture","radius":1}],"Tiles":{"2,4":{"Type":"Cage","Furniture":"Cage"},"1,2":{"Type":"Barrel","Always":true},"5,2":{"Type":"Door"},"3,1":{"Type":"Barrel"},"4,1":{"Type":"Barrel"},"5,1":{"Type":"Barrel"},"1,1":{"Type":"Rubble"}},"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_vert_dorm":{"name":"narrow_vert_dorm","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"111d111\n1C10CB1\n10D00B1\n1010GB1\n1Rb00B1\n1L10RB1\n111d111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"1,1":{"Priority":true},"2,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"4,3":{"Type":"Spawn","required":[],"AI":"looseguard"},"1,4":{"Type":"Rubble"},"1,5":{"Type":"Barrel","Always":true},"4,5":{"Type":"Rubble"},"3,0":{"Type":"Door"},"3,6":{"Type":"Door"},"4,1":{"Type":"Chest","Loot":"storage"}},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_horiz_cells":{"name":"narrow_horiz_cells","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1BR0GB1\n11bDb11\n0000000\n1R000L1\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"5,4":{"Type":"Barrel"},"1,4":{"Type":"Rubble"},"4,1":{"Type":"Prisoner"},"2,1":{"Type":"Rubble"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"1x2_Cells":{"name":"1x2_Cells","w":1,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ulr"},"scale":7,"category":"urban","weight":35,"grid":"111,111\n1000001\n10X0L01\nd0G000d\n1021b11\n102bGB1\n102DGB1\n10210B1\n102bGB1\n1021b11\nd00000d\n10L0G01\n1000CB1\n1110111\n","POI":[],"Keyring":[{"x":4,"y":11}],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":4,"y":2,"type":"furniture","radius":1},{"x":2,"y":11,"type":"furniture","radius":1}],"Tiles":{"4,5":{"Type":"Prisoner"},"4,6":{"Type":"Prisoner"},"4,8":{"Type":"Prisoner"},"3,6":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"4,12":{"Type":"Chest"},"4,2":{"Type":"Cage","Furniture":"Cage"},"2,11":{"Type":"Cage","Furniture":"Cage"},"6,3":{"Type":"Door"},"0,3":{"Type":"Door"},"0,10":{"Type":"Door"},"6,10":{"Type":"Door"},"4,11":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"2,3":{"Type":"Spawn","required":[],"AI":"looseguard"}},"effectTiles":{"5,5":{"TorchUnlit":{"x":5,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,10":{"Torch":{"x":5,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["urban","cells"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,5],"multTags":[1,1],"notTags":["",""]},"narrow_horizwide":{"name":"narrow_horizwide","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n0002000\n000G000\n11g1111\n11000C1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"5,5":{"Type":"Chest"},"3,3":{"Type":"Spawn","required":[],"AI":"guard"}},"effectTiles":{"5,5":{"Torch":{"x":5,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"3,2":{"TorchUnlit":{"x":3,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow","2wide"],"maxTags":[-1,-1,-1],"bonusTags":[0,0,0],"multTags":[0,2,2],"notTags":["","",""]},"narrow_vertWide":{"name":"narrow_vertWide","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"1100111\n1X00g01\n1100101\n1AGG1/1\n1100101\n1X00g01\n1100111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,3":{"Type":"Spawn","required":[],"AI":"guard"},"3,3":{"Type":"Spawn","required":[],"AI":"guard"},"5,3":{"Type":"Debris"},"1,3":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow","2wide"],"maxTags":[-1,-1,-1],"bonusTags":[0,0,0],"multTags":[0,2,1],"notTags":["","",""]},"deadend_dChest":{"name":"deadend_dChest","w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11XCX11\n12G2G21\n12X2X21\n1202021\n1102011\n111d111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,6":{"Type":"Door"},"3,1":{"Type":"Chest"},"4,2":{"Type":"Spawn","required":[],"AI":"guard"},"2,2":{"Type":"Spawn","required":[],"AI":"guard"}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"deadend_uChest":{"name":"deadend_uChest","w":1,"h":1,"primInd":"u","index":{"1,1":"u"},"scale":7,"category":"urban","weight":10,"grid":"111D111\n1100011\n120G021\n12XCX21\n1200021\n11+A+11\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,0":{"Type":"Door","Priority":true,"AlwaysClose":true},"2,5":{"Type":"Charger"},"4,5":{"Type":"Charger"},"3,2":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"3,3":{"Priority":true},"3,5":{"Type":"Shrine","Name":"Will","Priority":true}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"open_upright_OpR":{"name":"open_upright_OpR","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"scale":7,"category":"dungeon","weight":10,"grid":"1110111\n1100011\n1100000\n1000000\n1RLL000\n1111/00\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,4":{"Type":"Barrel"},"3,4":{"Type":"Barrel"},"1,4":{"Type":"Rubble"},"4,5":{"Type":"Debris"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["dungeon","open"],"forbidTags":[],"requireTags":[],"indexTags":["R_open"],"maxTags":[-1],"bonusTags":[0],"multTags":[10],"notTags":[""]},"open_upleft_OpL":{"name":"open_upleft_OpL","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"scale":7,"category":"dungeon","weight":10,"grid":"1110111\n1000111\n0000011\n0X0XGO1\n0000021\n1000111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"5,3":{"Type":"ChestOrShrine"},"4,3":{"Type":"Spawn","required":[],"AI":"looseguard"}},"effectTiles":{"2,1":{"Torch":{"x":2,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["dungeon","open"],"forbidTags":[],"requireTags":[],"indexTags":["L_open"],"maxTags":[-1],"bonusTags":[0],"multTags":[10],"notTags":[""]},"3x1_corridor":{"name":"3x1_corridor","w":3,"h":1,"primInd":"lr","index":{"1,1":"lr","2,1":"lr","3,1":"lr"},"scale":7,"category":"urban","weight":70,"grid":"111R11111111111111111\n1+101a11000T000100011\n101b1001g11111g10X011\n0000000021XOX12000000\n101b100X210001200X011\n1+1010002G0G0G2000011\n111R11111111111111111\n","POI":[],"Keyring":[{"x":11,"y":5}],"Jail":[{"x":3,"y":34,"type":"furniture","radius":1},{"x":31,"y":5,"type":"furniture","radius":1},{"x":25,"y":25,"type":"jail","radius":1},{"x":30,"y":4,"type":"furniture","radius":1}],"Tiles":{"11,1":{"Type":"Trap","Always":true},"9,5":{"Type":"Spawn","required":[],"AI":"looseguard"},"13,5":{"Type":"Spawn","required":[],"AI":"looseguard"},"11,5":{"Type":"Spawn","required":[],"AI":"guard"},"3,6":{"Type":"Rubble"},"3,0":{"Type":"Rubble"},"1,5":{"Type":"Charger"},"1,1":{"Type":"Charger"},"11,3":{"Type":"ChestOrShrine"}},"effectTiles":{"15,3":{"TorchUnlit":{"x":15,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"7,3":{"TorchUnlit":{"x":7,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"13,5":{"TorchUnlit":{"x":13,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"9,5":{"TorchUnlit":{"x":9,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":["narrow"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"3x1_splitChamber":{"name":"3x1_splitChamber","w":3,"h":1,"primInd":"lr","index":{"1,1":"lr","2,1":"udlr","3,1":"lr"},"scale":7,"category":"urban","weight":70,"grid":"11,1111411D1111114,11\n11000200T222T00R00011\n1G000000X2A2X000020G1\nd0L000G0T2C2T0G200L0d\n1G002000X2A2X000020G1\n110000R0T222T02200011\n1111141111D1114111111\n","POI":[],"Keyring":[{"x":6,"y":3},{"x":14,"y":3}],"Jail":[{"x":3,"y":34,"type":"furniture","radius":1},{"x":31,"y":5,"type":"furniture","radius":1},{"x":25,"y":25,"type":"jail","radius":1},{"x":30,"y":4,"type":"furniture","radius":1},{"x":18,"y":3,"type":"furniture","radius":1},{"x":2,"y":3,"type":"furniture","radius":1}],"Tiles":{"10,0":{"Type":"Door","Priority":true,"AlwaysClose":true},"10,6":{"Type":"Door","Priority":true,"AlwaysClose":true},"20,3":{"Type":"Door"},"0,3":{"Type":"Door"},"15,1":{"Type":"Rubble"},"6,5":{"Type":"Rubble"},"10,3":{"Type":"Chest","Loot":"silver","Priority":true},"10,2":{"Type":"Shrine","Name":"Metal"},"10,4":{"Type":"Shrine","Name":"Metal"},"18,3":{"Type":"Cage","Furniture":"Cage"},"2,3":{"Type":"Cage","Furniture":"Cage"},"8,3":{"Type":"Trap","Always":true},"12,3":{"Type":"Trap","Always":true},"12,1":{"Type":"Trap","Always":true},"12,5":{"Type":"Trap","Always":true},"8,5":{"Type":"Trap","Always":true},"8,1":{"Type":"Trap","Always":true},"6,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"14,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"1,2":{"Type":"Spawn","required":[],"AI":"guard"},"1,4":{"Type":"Spawn","required":[],"AI":"guard"},"19,2":{"Type":"Spawn","required":[],"AI":"guard"},"19,4":{"Type":"Spawn","required":[],"AI":"guard"}},"effectTiles":{"11,1":{"Torch":{"x":11,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"9,1":{"Torch":{"x":9,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,2":{"Torch":{"x":1,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"19,2":{"Torch":{"x":19,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["urban","silverchest"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"GuardedChest":{"name":"GuardedChest","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"urban","weight":15,"grid":"1X000X1\nX22222X\n0200020\n020C020\n0200020\nX22222X\n1X000X1\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"GuardedChest"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","chest"],"forbidTags":["maxchest","start"],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[3],"notTags":[""]},"SoulCrystal":{"name":"SoulCrystal","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"temple","weight":5,"grid":"1000001\n0000000\n00+2+00\n0023200\n00+2+00\n0000000\n1000001\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"Spawn","required":["soul","active"],"tags":["soul"],"Label":"SoulC_A"},"2,2":{"Type":"Charger"},"2,4":{"Type":"Charger"},"4,4":{"Type":"Charger"},"4,2":{"Type":"Charger"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["temple"],"forbidTags":["start"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Banquet":{"name":"Banquet","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"urban","weight":10,"grid":"1100LL1\n10000R1\n10F2F01\n00F1F00\n10F2F01\n1000001\n1100011\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,3":{"Type":"Table","Food":"Plate"},"5,1":{"Type":"Rubble"},"5,0":{"Type":"Barrel"},"4,0":{"Type":"Barrel"},"2,2":{"Type":"Table","Food":"Plate"},"2,4":{"Type":"Table","Food":"Plate"},"2,3":{"Type":"Table","Food":"Plate"},"4,2":{"Type":"Table","Food":"Plate"},"4,4":{"Type":"Table","Food":"Plate"}},"effectTiles":{"3,4":{"TorchUnlit":{"x":3,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","food","wide"],"forbidTags":[],"requireTags":[],"indexTags":["U_wide","D_wide"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,2],"notTags":["",""]},"narrow_vertObst":{"name":"narrow_vertObst","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n10G0001\n1001131\n1G01F01\n1000001\n10000R1\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"1,3":{"Type":"Spawn","required":[],"AI":"guard"},"2,1":{"Type":"Spawn","required":[],"AI":"guard"},"4,3":{"Type":"Table","Food":"Plate"},"5,5":{"Type":"Rubble"},"5,2":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"HallCrossRubble":{"name":"HallCrossRubble","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1110111\n00000R0\n1110111\n1110111\n1110111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"5,3":{"Type":"Rubble"}},"effectTiles":{"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"DR_Closet":{"name":"DR_Closet","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11R0C11\n111D111\n1000000\n1000000\n1100011\n1110111\n","POI":[],"Keyring":[{"x":3,"y":1}],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"Door","Priority":true,"AlwaysClose":true},"4,1":{"Type":"Chest","Loot":"storage"},"2,1":{"Type":"Rubble"}},"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":["narrow"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"DL_Closet":{"name":"DL_Closet","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11R0C11\n111D111\n0000001\n0000001\n1100011\n1110111\n","POI":[],"Keyring":[{"x":3,"y":1}],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"Door","Priority":true,"AlwaysClose":true},"4,1":{"Type":"Chest","Loot":"storage"},"2,1":{"Type":"Rubble"}},"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":["narrow"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Corridor_Up_1x2":{"name":"Corridor_Up_1x2","w":1,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ud"},"scale":7,"category":"urban","weight":60,"grid":"1100111\n1100111\n0000000\n000A000\n1100011\n1120111\n1102111\n1102111\n1100111\n1100111\n1120011\n1120111\n1100111\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{"4,10":{"TorchUnlit":{"x":4,"y":10,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Corridor_UD_1x2":{"name":"Corridor_UD_1x2","w":1,"h":2,"primInd":"ud","index":{"1,1":"ud","1,2":"ud"},"scale":7,"category":"urban","weight":40,"grid":"1100111\n1100111\n1102111\n1100111\n1100011\n1120111\n1102111\n1102111\n1100111\n1100111\n1120011\n1120111\n1100111\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":[],"effectTiles":{"4,4":{"TorchUnlit":{"x":4,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,10":{"TorchUnlit":{"x":4,"y":10,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["U_2wide","D_2wid"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[5,5],"notTags":["",""]},"Corridor_LR_1x2":{"name":"Corridor_LR_1x2","w":2,"h":1,"primInd":"lr","index":{"1,1":"lr","2,1":"lr"},"scale":7,"category":"urban","weight":50,"grid":"11111111111111\n11111111111111\n00000000000000\n00000000000000\n111A111111+111\n11111111111111\n11111111111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"10,4":{"Type":"Charger"},"3,4":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{"10,2":{"TorchUnlit":{"x":10,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"3,2":{"TorchUnlit":{"x":3,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["L_2wide","R_2wid"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[4,4],"notTags":["",""]},"HallCrossThicc":{"name":"HallCrossThicc","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"urban","weight":30,"grid":"1100111\n1100111\n0000000\n0000000\n1100111\n1100111\n1100111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[],"Tiles":[],"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["L_2wide","R_2wide","U_2wid","D_2wid"],"maxTags":[-1,-1,-1,-1],"bonusTags":[0,0,0,0],"multTags":[3,3,3,3],"notTags":["","","",""]},"jng1":{"name":"jng1","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"jungle","weight":10,"grid":"0000011\n01000R1\n000X130\n0000100\nX000,10\n1X00010\n1000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"5,1":{"Type":"Rubble"},"5,2":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"}},"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng2":{"name":"jng2","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"jungle","weight":10,"grid":"010000X\n000R10X\n0000R00\n0000000\n0000000\n0100100\nX100000\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["jungle"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"3,1":{"Type":"Rubble"},"4,2":{"Type":"Rubble"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng3":{"name":"jng3","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"jungle","weight":10,"grid":"XX00000\nX0R0010\n0000000\n00X1000\n0000000\n000-100\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"2,1":{"Type":"Rubble"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_ud_1":{"name":"jng_ud_1","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"jungle","weight":10,"grid":"0000011\n01000R1\n000X130\n0000100\nX000110\n1X00010\n1000000\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["jungle"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"5,1":{"Type":"Rubble"},"5,2":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"}},"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_lr_1":{"name":"jng_lr_1","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"jungle","weight":10,"grid":"XXX0X0X\nX0X0X30\n0000000\n0000000\n0300030\nX3000XX\nX0XX0X0\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["jungle"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"5,1":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"1,4":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"1,5":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"5,4":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_ul_1":{"name":"jng_ul_1","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"scale":7,"category":"jungle","weight":10,"grid":"0000000\n0000000\n00000L0\n0000LL1\n0000111\n00LL111\n0111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["jungle"],"used":false,"chance":0.5}],"Keyring":[{"x":3,"y":4}],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"5,3":{"Type":"Barrel"},"5,2":{"Type":"Barrel"},"4,3":{"Type":"Barrel"},"3,5":{"Type":"Barrel"},"2,5":{"Type":"Barrel"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_ur_1":{"name":"jng_ur_1","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"scale":7,"category":"jungle","weight":10,"grid":"0000000\n0000000\n0303000\nX0X0000\nXX3XX00\n1XX3000\n11XXXX0\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"2,4":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"3,5":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"1,2":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"3,2":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_dl_1":{"name":"jng_dl_1","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"scale":7,"category":"jungle","weight":10,"grid":"0001111\n0001C01\n0001101\n00001g1\n0000000\n0000000\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"4,1":{"Type":"Chest","Loot":"silver","Priority":true}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_dr_1":{"name":"jng_dr_1","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"scale":7,"category":"jungle","weight":10,"grid":"1111100\n11X0300\n11X0X00\n1130000\n1X03000\n1000000\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"4,1":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"2,3":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"3,4":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_noR_1":{"name":"jng_noR_1","w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"scale":7,"category":"jungle","weight":10,"grid":"0000001\n00000X1\n000Xo01\n0X00001\n0000XA1\n00X0XX1\n0000011\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"5,4":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_noL_1":{"name":"jng_noL_1","w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"scale":7,"category":"jungle","weight":10,"grid":"1000000\n1X0X000\nXR00000\n1XX0000\n4XXX000\n1RX0000\n1100000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"1,5":{"Type":"Rubble"},"1,2":{"Type":"Rubble"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_noU_1":{"name":"jng_noU_1","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"scale":7,"category":"jungle","weight":10,"grid":"1111111\n111111X\n031X100\n00XR130\n0030000\n0000000\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"Rubble"},"1,2":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"5,3":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"2,4":{"Type":"Spawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_noD_1":{"name":"jng_noD_1","w":1,"h":1,"primInd":"ulr","index":{"1,1":"ulr"},"scale":7,"category":"jungle","weight":10,"grid":"0000000\n0000000\n0000000\n011G110\n0100010\n01RCR11\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door"},"3,5":{"Priority":true},"4,5":{"Type":"Rubble"},"2,5":{"Type":"Rubble"}},"effectTiles":{"4,4":{"TorchUnlit":{"x":4,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,4":{"TorchUnlit":{"x":2,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"HallCrossDisplay":{"name":"HallCrossDisplay","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"urban","weight":25,"grid":"1110111\n1100011\n1000001\n000L000\n1000001\n1100011\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":3,"y":3,"type":"furniture","radius":1}],"Tiles":{"3,3":{"Type":"DisplayStand","Furniture":"DisplayStand"}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["egyptian"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":[""]},"wide_tombH":{"name":"wide_tombH","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"temple","weight":100,"grid":"1111111\n1L1X1L1\n0000000\n2222222\n0000000\n1X1L1X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"3,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombV":{"name":"wide_tombV","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"temple","weight":100,"grid":"1102011\n1L020X1\n1102011\n1X020L1\n1102011\n1L020X1\n1102011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1},{"x":5,"y":3,"type":"furniture","radius":1},{"x":1,"y":3,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,3":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"1,3":{"Torch":{"x":1,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,3":{"Torch":{"x":5,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,5":{"Torch":{"x":1,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,5":{"Torch":{"x":5,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombX":{"name":"wide_tombX","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"temple","weight":250,"grid":"1102011\n1X020L1\n0002000\n2222222\n0002000\n1L020X1\n1102011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{"5,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombXFull":{"name":"wide_tombXFull","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"temple","weight":100,"grid":"1102011\n1X020X1\n0002000\n2222222\n0002000\n1X020X1\n1102011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":[],"effectTiles":{"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombXEmpty":{"name":"wide_tombXEmpty","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"temple","weight":50,"grid":"1102011\n1L020L1\n0002000\n2222222\n0002000\n1L020L1\n1102011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombVMost":{"name":"wide_tombVMost","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"temple","weight":100,"grid":"1102011\n1L020X1\n1102011\n1X020X1\n1102011\n1X020X1\n1102011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1},{"x":5,"y":3,"type":"furniture","radius":1},{"x":1,"y":3,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"1,3":{"Torch":{"x":1,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,3":{"Torch":{"x":5,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,5":{"Torch":{"x":1,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,5":{"Torch":{"x":5,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombVEmpty":{"name":"wide_tombVEmpty","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"temple","weight":50,"grid":"1102011\n1L020L1\n1102011\n1L020L1\n1102011\n1L020L1\n1102011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1},{"x":5,"y":3,"type":"furniture","radius":1},{"x":1,"y":3,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,3":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,3":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"1,3":{"Torch":{"x":1,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,3":{"Torch":{"x":5,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,5":{"Torch":{"x":1,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,5":{"Torch":{"x":5,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombVFull":{"name":"wide_tombVFull","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"temple","weight":50,"grid":"1102011\n1X020X1\n1102011\n1X020X1\n1102011\n1X020X1\n1102011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1},{"x":5,"y":3,"type":"furniture","radius":1},{"x":1,"y":3,"type":"furniture","radius":1}],"Tiles":[],"effectTiles":{"1,3":{"Torch":{"x":1,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,3":{"Torch":{"x":5,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,5":{"Torch":{"x":1,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,5":{"Torch":{"x":5,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombHEmpty":{"name":"wide_tombHEmpty","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"temple","weight":50,"grid":"1111111\n1L1L1L1\n0000000\n2222222\n0000000\n1L1L1L1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"3,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"3,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombHMost":{"name":"wide_tombHMost","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"temple","weight":100,"grid":"1111111\n1L1X1X1\n0000000\n2222222\n0000000\n1X1X1X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombHFull":{"name":"wide_tombHFull","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"temple","weight":50,"grid":"1111111\n1X1X1X1\n0000000\n2222222\n0000000\n1X1X1X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":[],"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"test":{"name":"test","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"temple","weight":50,"grid":"1111111\n1X1X1X1\n0000000\n2222222\n0000000\n1X1X1X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":[],"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":[],"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"Market":{"name":"Market","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"2,2":"y","1,2":"y","1,1":"y","2,1":"y"},"flexEdgeSuper":{"1,1":"y","2,1":"y","2,2":"y","1,2":"y"},"scale":7,"category":"urban","weight":500,"grid":"00000000000000\n01101100111010\n01F0F10010L010\n000G000000G000\n01F0F100100F10\n01101100100110\n00000000000000\n0000000G000000\n01F0FF00FFF0F0\n01L00F00F00010\n01LG0000003L10\n01FGF000F00F10\n011111001F0110\n00000000000000\n","POI":[],"Keyring":[],"Jail":[{"x":2,"y":10,"type":"furniture","radius":1},{"x":2,"y":9,"type":"furniture","radius":1},{"x":10,"y":2,"type":"furniture","radius":1},{"x":11,"y":10,"type":"furniture","radius":1}],"Tiles":{"8,8":{"Type":"Table"},"9,8":{"Type":"Table"},"10,8":{"Type":"Table"},"12,8":{"Type":"Table"},"8,11":{"Type":"Table"},"8,9":{"Type":"Table"},"9,12":{"Type":"Table"},"11,11":{"Type":"Table","Food":"Plate"},"11,10":{"Type":"DisplayStand","Furniture":"DisplayStand"},"2,11":{"Type":"Table","Food":"Plate"},"3,11":{"Type":"Prisoner"},"2,8":{"Type":"Table"},"2,9":{"Type":"Cage","Furniture":"Cage"},"2,10":{"Type":"Cage","Furniture":"Cage"},"4,8":{"Type":"Table"},"5,8":{"Type":"Table"},"5,9":{"Type":"Table"},"4,2":{"Type":"Table","Food":"Plate"},"2,2":{"Type":"Table","Food":"Plate"},"2,4":{"Type":"Table","Food":"Plate"},"4,4":{"Type":"Table","Food":"Plate"},"10,2":{"Type":"DisplayStand","Furniture":"DisplayStand"},"11,4":{"Type":"Table"},"4,11":{"Type":"Table","Food":"Plate"},"3,10":{"Type":"Spawn","required":[]},"3,3":{"Type":"Spawn","required":[]},"10,3":{"Type":"Spawn","required":[]},"7,7":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"10,10":{"Type":"Spawn","required":["dressmaker"],"Label":"dressmaker","tags":["dressmaker"],"Chance":1,"AI":"guard","force":"true"}},"effectTiles":{"8,6":{"Torch":{"x":8,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,6":{"Torch":{"x":12,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,6":{"Torch":{"x":1,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,6":{"Torch":{"x":5,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,3":{"Torch":{"x":5,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,3":{"Torch":{"x":12,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,13":{"Torch":{"x":5,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,13":{"Torch":{"x":8,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,13":{"Torch":{"x":12,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,13":{"Torch":{"x":1,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,3":{"Torch":{"x":1,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","market"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":[""]},"Shoppe":{"name":"Shoppe","w":2,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"udlr"},"flexEdge":{"2,1":"y","1,1":"y"},"flexEdgeSuper":{"2,1":"y","1,1":"y"},"scale":7,"category":"urban","weight":30,"grid":"00000000000000\n0LL11110L11110\n0111FGD00D0L10\n0d00F01D110L10\n01100G10B1LC10\n0L111111111110\n00000000000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,3":{"Type":"Table"},"4,2":{"Type":"Table"},"7,3":{"Type":"Door","Priority":true,"AlwaysClose":true},"6,2":{"Type":"Door","Priority":true,"AlwaysClose":true},"9,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"11,4":{"Type":"Chest","Lock":"Red"},"10,4":{"Type":"Barrel","OffLimits":true},"11,3":{"Type":"Barrel","OffLimits":true},"11,2":{"Type":"Barrel","OffLimits":true},"5,2":{"Type":"Spawn","required":[]},"5,4":{"Type":"Spawn","required":[]},"1,3":{"Type":"Door"},"8,1":{"Type":"Barrel"},"7,4":{"OffLimits":true},"10,2":{"OffLimits":true},"10,3":{"OffLimits":true},"2,1":{"Type":"Barrel"},"1,1":{"Type":"Barrel"},"1,5":{"Type":"Barrel"}},"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,4":{"Torch":{"x":8,"y":4,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Prison":{"name":"Prison","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"2,2":"y","2,1":"y","1,1":"y","1,2":"y"},"flexEdgeSuper":{"2,2":"y","2,1":"y","1,1":"y","1,2":"y"},"scale":7,"category":"urban","weight":900,"grid":"00000000000000\n01111b11111110\n01B0D01B01CC10\n01G0b01FG10010\n011b1G11d1bD10\n01B0D0d00000G0\n01G0b0111d1110\n011b1d1FL0LF10\n01CL001G0G0G10\n0100001FFFFF10\n01GF00D0000010\n01111110000010\n0000001b1d1b10\n00000000000000\n","POI":[],"Keyring":[{"x":10,"y":8}],"Jail":[],"Tiles":{"9,12":{"Type":"Door"},"6,10":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"7,9":{"Type":"Table"},"8,9":{"Type":"Table"},"9,9":{"Type":"Table"},"10,9":{"Type":"Table"},"11,9":{"Type":"Table"},"6,5":{"Type":"Door"},"11,4":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Purple","OffLimits":true},"9,6":{"Type":"Door","OffLimits":true},"8,4":{"Type":"Door","OffLimits":true},"3,10":{"Type":"Table"},"7,7":{"Type":"Table","Food":"Plate"},"11,7":{"Type":"Table","Food":"Plate"},"7,3":{"Type":"Table","Food":"Plate"},"4,5":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red","OffLimits":true},"4,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red","OffLimits":true},"2,6":{"Type":"Prisoner","OffLimits":true},"2,3":{"Type":"Prisoner"},"2,8":{"Type":"Chest"},"11,2":{"Type":"Chest","Lock":"Blue"},"7,8":{"Type":"Spawn","required":[],"OffLimits":true},"11,8":{"Type":"Spawn","required":[],"OffLimits":true},"9,8":{"Type":"Spawn","required":[],"OffLimits":true},"8,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard","OffLimits":true},"5,4":{"Type":"Spawn","required":[],"OffLimits":true},"3,8":{"Type":"Barrel"},"8,7":{"Type":"Barrel","OffLimits":true},"10,7":{"Type":"Barrel","OffLimits":true},"5,7":{"Type":"Door","OffLimits":true},"2,10":{"Type":"Spawn","required":[],"OffLimits":true},"7,10":{"OffLimits":false},"7,11":{"OffLimits":false},"5,10":{"OffLimits":true},"5,8":{"OffLimits":true},"5,9":{"OffLimits":true},"4,8":{"OffLimits":true},"4,9":{"OffLimits":true},"4,10":{"OffLimits":true},"3,9":{"OffLimits":true},"2,9":{"OffLimits":true},"3,6":{"OffLimits":true},"3,5":{"OffLimits":true},"5,6":{"OffLimits":true},"5,5":{"OffLimits":true},"3,2":{"OffLimits":true},"3,3":{"OffLimits":true},"5,2":{"OffLimits":true},"5,3":{"OffLimits":true},"7,5":{"OffLimits":true},"8,5":{"OffLimits":true},"9,5":{"OffLimits":true},"4,4":{"OffLimits":false},"10,5":{"OffLimits":true},"11,5":{"OffLimits":true},"8,2":{"OffLimits":true},"10,3":{"OffLimits":true},"11,3":{"OffLimits":true},"7,2":{"OffLimits":true},"2,2":{"OffLimits":true},"2,5":{"OffLimits":true},"9,7":{"OffLimits":true},"8,8":{"OffLimits":true},"10,8":{"OffLimits":true},"4,3":{"OffLimits":false},"10,2":{"Priority":true},"12,5":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door"}},"effectTiles":{"8,7":{"Torch":{"x":8,"y":7,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"10,7":{"Torch":{"x":10,"y":7,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"9,5":{"Torch":{"x":9,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,2":{"Torch":{"x":8,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"11,2":{"Torch":{"x":11,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"3,2":{"Torch":{"x":3,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"3,5":{"Torch":{"x":3,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"4,8":{"Torch":{"x":4,"y":8,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,13":{"Torch":{"x":8,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"10,13":{"Torch":{"x":10,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","prison"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"cyb_WolfCampS":{"name":"cyb_WolfCampS","w":3,"h":3,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","1,3":"udlr","2,1":"udlr","2,2":"udlr","2,3":"udlr","3,1":"udlr","3,2":"udlr","3,3":"udlr"},"flexEdge":{"1,3":"y","2,3":"y","3,3":"y","3,2":"y","3,1":"y","2,1":"y","1,1":"y","1,2":"y"},"flexEdgeSuper":{"1,3":"y","2,3":"y","3,3":"y","3,2":"y","3,1":"y","2,1":"y","1,1":"y","1,2":"y"},"scale":7,"category":"urban","weight":500,"grid":"000000000000000000000\n011111111111111111110\n010TTTTTD000LG01L0B10\n01CTTTTT10F000F1B0010\n010TTTTT10GF0FG100B10\n01111111100G0G0d0G010\n01B0B000d000000100B10\n0100000L10?00?01B0010\n01B0B00G1L0000L1L0B10\n01111d11111d111111110\n0b00G0G0b0020000L0L10\n0b000000b0G2G00000010\n0b000000d222000000010\n0b000000b0G2GL0L0L010\n0b000000b002000000010\n0b000000b002000000010\n01bbbbbb1bbDbb1bbbb10\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n","POI":[],"Keyring":[],"Jail":[{"x":1,"y":7,"type":"furniture","radius":1},{"x":16,"y":10,"type":"furniture","radius":1},{"x":18,"y":10,"type":"furniture","radius":1},{"x":12,"y":2,"type":"furniture","radius":1}],"Tiles":{"11,16":{"Type":"Door","Priority":true,"AlwaysClose":true},"8,12":{"Type":"Door"},"8,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Purple"},"8,6":{"Type":"Door"},"4,2":{"Type":"Trap","OffLimits":true},"5,2":{"Type":"Trap","OffLimits":true},"7,2":{"Type":"Trap","OffLimits":true},"5,3":{"Type":"Trap","OffLimits":true},"6,3":{"Type":"Trap","OffLimits":true},"7,3":{"Type":"Trap","OffLimits":true},"7,7":{"Type":"Barrel"},"15,5":{"Type":"Door"},"11,9":{"Type":"Door"},"14,3":{"Type":"Table","Food":"Plate"},"13,4":{"Type":"Table","Food":"Plate"},"11,4":{"Type":"Table","Food":"Plate"},"10,3":{"Type":"Table","Food":"Plate"},"5,9":{"Type":"Door"},"9,8":{"Type":"Barrel"},"14,8":{"Type":"Barrel"},"16,8":{"Type":"Barrel"},"16,2":{"Type":"Barrel"},"16,10":{"Type":"Cage","Furniture":"Cage"},"18,10":{"Type":"Cage","Furniture":"Cage"},"13,13":{"Type":"Barrel"},"15,13":{"Type":"Barrel"},"17,13":{"Type":"Barrel"},"2,3":{"Type":"Chest","Lock":"Blue","OffLimits":true},"4,4":{"Type":"Trap","OffLimits":true},"6,4":{"Type":"Trap","OffLimits":true},"7,4":{"Type":"Trap","OffLimits":true},"3,4":{"Type":"Trap","OffLimits":true},"10,11":{"Type":"Spawn","required":[],"AI":"guard"},"12,11":{"Type":"Spawn","required":[],"AI":"guard"},"12,13":{"Type":"Spawn","required":[],"AI":"guard"},"10,13":{"Type":"Spawn","required":[],"AI":"guard"},"14,4":{"Type":"Spawn","required":[],"AI":"guard"},"13,5":{"Type":"Spawn","required":[],"AI":"guard"},"11,5":{"Type":"Spawn","required":[],"AI":"guard"},"10,4":{"Type":"Spawn","required":[],"AI":"guard"},"13,2":{"Type":"Prisoner"},"12,2":{"Type":"DisplayStand","Furniture":"DisplayStand"},"17,5":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"7,8":{"Type":"Prisoner"},"4,10":{"Type":"Prisoner"},"6,10":{"Type":"Prisoner"},"3,2":{"Type":"Trap","OffLimits":true},"4,3":{"Type":"Trap","OffLimits":true},"3,3":{"Type":"Trap","OffLimits":true},"6,2":{"Type":"Trap","OffLimits":true},"5,4":{"Type":"Trap","OffLimits":true},"2,2":{"OffLimits":true},"2,4":{"OffLimits":true}},"effectTiles":{"14,17":{"Torch":{"x":14,"y":17,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,17":{"Torch":{"x":8,"y":17,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"17,2":{"Torch":{"x":17,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"14,2":{"Torch":{"x":14,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"9,2":{"Torch":{"x":9,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"10,10":{"Torch":{"x":10,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,10":{"Torch":{"x":12,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"7,10":{"Torch":{"x":7,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,10":{"Torch":{"x":2,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,6":{"Torch":{"x":5,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"17,10":{"Torch":{"x":17,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","wolfgirl"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"cyb_PetTrack":{"name":"cyb_PetTrack","w":3,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr","3,1":"udlr","3,2":"udlr"},"flexEdge":{"1,1":"y","1,2":"y","2,2":"y","3,2":"y","3,1":"y","2,1":"y"},"flexEdgeSuper":{"1,2":"y","1,1":"y","2,2":"y","3,2":"y","3,1":"y","2,1":"y"},"scale":7,"category":"urban","weight":250,"grid":"100000000000000000001\n100000000000000000001\n1001bbbbbbdbbbbbb1001\n000b2222222222222b000\n100b2222222222222b001\n100b22001bdb10022b001\n100b2200bG0Gb0022b001\n100b22G0b00Gb0G22b001\n100b22001bdb10022b001\n100b2222222222222b001\n000b2222222222222b000\n1001bbbbbbdbbbbbb1001\n100000000000000000001\n100000000000000000001\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"10,8":{"Type":"Door"},"10,11":{"Type":"Door"},"10,2":{"Type":"Door"},"10,5":{"Type":"Door"},"14,7":{"Type":"Spawn","required":[]},"6,7":{"Type":"Spawn","required":[]},"11,7":{"Type":"Spawn","required":[]},"9,6":{"Type":"Prisoner"},"11,6":{"Type":"Prisoner"}},"effectTiles":{"12,9":{"Torch":{"x":12,"y":9,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,9":{"Torch":{"x":8,"y":9,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,3":{"Torch":{"x":8,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,3":{"Torch":{"x":12,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"16,3":{"Torch":{"x":16,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"4,3":{"Torch":{"x":4,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","pet"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"pyro_ruinedHall":{"name":"pyro_ruinedHall","w":4,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"udlr","3,1":"udlr","4,1":"udlr"},"flexEdge":{"4,1":"y","1,1":"y","3,1":"y","2,1":"y"},"flexEdgeSuper":{"4,1":"y","3,1":"y","2,1":"y","1,1":"y"},"scale":7,"category":"temple","weight":4000,"grid":"1100011110001111000111100011\n100004bb40001bb40001bb400004\n00X00-CL-TG0-LG+TR0+LL-T0X00\n00000T0GT0/GTR0T000TRGT00000\n0L000+0/+T0T-0/-00L-0T+T0000\n1000014410004114000114100001\n1100011110001111000111100011\n","POI":[],"Keyring":[],"Jail":[{"x":20,"y":2,"type":"furniture","radius":1},{"x":21,"y":2,"type":"furniture","radius":1}],"Tiles":{"20,3":{"Type":"Rubble"},"7,4":{"Type":"Debris"},"10,3":{"Type":"Debris"},"15,2":{"Type":"Charger"},"8,4":{"Type":"Charger"},"5,4":{"Type":"Charger"},"19,2":{"Type":"Charger"},"22,4":{"Type":"Charger"},"13,2":{"Type":"Barrel"},"18,4":{"Type":"Barrel"},"14,4":{"Type":"Debris","Always":true},"13,3":{"Type":"Rubble"},"17,2":{"Type":"Rubble"},"9,2":{"Type":"Trap"},"23,2":{"Type":"Trap"},"23,4":{"Type":"Trap"},"16,2":{"Type":"Trap"},"11,4":{"Type":"Trap"},"9,4":{"Type":"Trap"},"5,3":{"Type":"Trap"},"8,3":{"Type":"Trap"},"12,3":{"Type":"Trap"},"15,3":{"Type":"Trap"},"22,3":{"Type":"Trap"},"19,3":{"Type":"Trap"},"11,3":{"Type":"Spawn","required":[]},"10,2":{"Type":"Spawn","required":[]},"6,2":{"Type":"Chest"},"7,3":{"Type":"Spawn","required":[]},"21,3":{"Type":"Spawn","required":[],"AI":"guard"},"14,2":{"Type":"Spawn","required":[]},"1,4":{"Type":"Barrel"},"7,2":{"Type":"Barrel"},"21,4":{"Type":"Trap"},"20,2":{"Type":"Cage","Furniture":"Cage"},"21,2":{"Type":"Cage","Furniture":"Cage"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","long","hall"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"TempleHall_1x2":{"name":"TempleHall_1x2","w":1,"h":2,"primInd":"ud","index":{"1,1":"ud","1,2":"ud"},"flexEdge":{},"scale":7,"category":"temple","weight":200,"grid":"4b101b1\nLL+0+0L\nRL0000L\nLR00111\n/000141\n11401A1\n11100TL\n1A1000L\n0T00111\n00L0411\nL0001A1\nR0000T0\n/R+0+00\n1b101b4\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"4,1":{"Type":"Charger"},"2,1":{"Type":"Charger"},"2,12":{"Type":"Charger"},"4,12":{"Type":"Charger"},"5,10":{"Type":"Shrine","Name":"Metal"},"1,7":{"Type":"Shrine","Name":"Metal"},"5,5":{"Type":"Shrine","Name":"Metal"},"5,11":{"Type":"Trap"},"5,6":{"Type":"Trap"},"1,8":{"Type":"Trap"},"1,12":{"Type":"Rubble"},"0,11":{"Type":"Rubble"},"0,12":{"Type":"Debris"},"0,10":{"Type":"Barrel"},"2,9":{"Type":"Barrel"},"0,1":{"Type":"Barrel"},"1,1":{"Type":"Barrel"},"1,2":{"Type":"Barrel"},"0,2":{"Type":"Rubble"},"0,3":{"Type":"Barrel"},"1,3":{"Type":"Rubble"},"0,4":{"Type":"Debris"},"6,6":{"Type":"Barrel"},"6,7":{"Type":"Barrel"},"6,2":{"Type":"Barrel"},"6,1":{"Type":"Barrel"}},"effectTiles":{"4,6":{"TorchUnlit":{"x":4,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,11":{"TorchUnlit":{"x":4,"y":11,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,8":{"TorchUnlit":{"x":2,"y":8,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"TempleHall_2x1":{"name":"TempleHall_2x1","w":2,"h":1,"primInd":"dlr","index":{"1,1":"dlr","2,1":"dlr"},"flexEdge":{"1,1":"y","2,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":200,"grid":"11111111111111\n1R1111C=1111R1\n001A102201A100\n0032G0220G2300\n00021111112000\n1000Xo00oX0001\n11000000000011\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"10,2":{"Type":"Shrine","Name":"Metal"},"3,2":{"Type":"Shrine","Name":"Metal"},"6,1":{"Type":"Chest","Loot":"silver","Priority":true},"2,3":{"Type":"Spawn","required":["statue"],"Label":"Statue"},"11,3":{"Type":"Spawn","required":["statue"],"Label":"Statue"},"9,3":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door","OffLimits":true},"4,3":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door","OffLimits":true},"7,1":{"Type":"Charger","NoRemove":false},"12,1":{"Type":"Rubble"},"1,1":{"Type":"Rubble"},"5,3":{"OffLimits":true},"5,2":{"OffLimits":true},"6,2":{"OffLimits":true},"7,2":{"OffLimits":true},"8,2":{"OffLimits":true},"8,3":{"OffLimits":true},"7,3":{"OffLimits":true},"6,3":{"OffLimits":true}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_End":{"name":"TempleHall_End","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":70,"grid":"X2X2X2X\n2000002\nX01b10X\n201C102\nX01310X\n2000002\nX2X2X2X\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Priority":true},"3,4":{"Type":"Spawn","required":["statue"],"Label":"Statue"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide","chest"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_Hub":{"name":"TempleHall_Hub","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":70,"grid":"X01d10X\n0222220\n1200021\nd20+02d\n1200021\n0222220\nX01d10X\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"0,3":{"Type":"Door"},"3,0":{"Type":"Door"},"3,6":{"Type":"Door"},"6,3":{"Type":"Door"},"3,3":{"Type":"Charger"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_Field":{"name":"TempleHall_Field","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":70,"grid":"0202020\n2X2X2X2\n0202020\n2X232X2\n0202020\n2X2X2X2\n0202000\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"Spawn","required":["soul"],"Label":"soul","tags":["soul"],"Chance":0.4,"AI":"guard","force":"true"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide","open"],"forbidTags":["start"],"requireTags":[],"indexTags":["temple","open"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[1,0],"notTags":["1","1"]},"TempleHall_UR":{"name":"TempleHall_UR","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":35,"grid":"111d111\n1222221\n1200021\n120A02d\n1200021\n1222221\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,0":{"Type":"Door"},"6,3":{"Type":"Door"},"3,3":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_UL":{"name":"TempleHall_UL","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":35,"grid":"111d111\n1222221\n1200021\nd20A021\n1200021\n1222221\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,0":{"Type":"Door"},"3,3":{"Type":"Shrine","Name":"Metal"},"0,3":{"Type":"Door"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_DL":{"name":"TempleHall_DL","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":35,"grid":"1111111\n1222221\n1200021\nd20A021\n1200021\n1222221\n111d111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"Shrine","Name":"Metal"},"0,3":{"Type":"Door"},"3,6":{"Type":"Door"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_DR":{"name":"TempleHall_DR","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":35,"grid":"1111111\n1222221\n1200021\n120A02d\n1200021\n1222221\n111d111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"Shrine","Name":"Metal"},"3,6":{"Type":"Door"},"6,3":{"Type":"Door"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_MultiShrine":{"name":"TempleHall_MultiShrine","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":20,"grid":"X01d10X\n0222220\n12A0A21\nd20002d\n12A0A21\n0222220\nX01d10X\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"0,3":{"Type":"Door"},"3,0":{"Type":"Door"},"3,6":{"Type":"Door"},"6,3":{"Type":"Door"},"2,2":{"Type":"Shrine","Name":"Metal"},"4,2":{"Type":"Shrine","Name":"Metal"},"4,4":{"Type":"Shrine","Name":"Metal"},"2,4":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"jng4":{"name":"jng4","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"jungle","weight":15,"grid":"0000000\n01TAT10\n00TFT00\n00TTT00\n0000000\n00R0000\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"Table","Food":"Plate"},"3,1":{"Type":"Shrine","Name":"Metal"},"2,1":{"Type":"Trap"},"2,2":{"Type":"Trap"},"2,3":{"Type":"Trap"},"3,3":{"Type":"Trap"},"4,3":{"Type":"Trap"},"4,2":{"Type":"Trap"},"4,1":{"Type":"Trap"},"2,5":{"Type":"Rubble"}},"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng5":{"name":"jng5","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"jungle","weight":7,"grid":"0000000\n0111100\n01C0100\n0100D00\n01B0100\n011g100\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"2,2":{"Priority":true,"OffLimits":true},"4,3":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"3,2":{"OffLimits":true},"3,3":{"OffLimits":true},"3,4":{"OffLimits":true},"2,4":{"OffLimits":true},"2,3":{"OffLimits":true}},"effectTiles":{"3,2":{"TorchUnlit":{"x":3,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"TempleSanctum":{"name":"TempleSanctum","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"1,2":"y","2,2":"y","2,1":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":1000,"grid":"11000141100011\n1m000222200Rm4\n00000100400000\n0R0X142211X000\n00011A22A11000\n1211A2222A1121\n4202220C222021\n120222G0222021\n1211A2222A1421\n00014A22A11000\n000X112241XR00\n000/0100400000\n1m0002222000m1\n11000141100041\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"5,4":{"Type":"Shrine","Name":"Metal"},"4,5":{"Type":"Shrine","Name":"Metal"},"8,4":{"Type":"Shrine","Name":"Metal"},"9,5":{"Type":"Shrine","Name":"Metal"},"8,9":{"Type":"Shrine","Name":"Metal"},"4,8":{"Type":"Shrine","Name":"Metal"},"5,9":{"Type":"Shrine","Name":"Metal"},"6,7":{"Type":"Spawn","required":["boss"],"AI":"guard"},"9,8":{"Type":"Shrine","Name":"Metal"},"11,1":{"Type":"Rubble"},"1,3":{"Type":"Rubble"},"11,10":{"Type":"Rubble"},"3,11":{"Type":"Debris"},"7,6":{"Priority":true}},"effectTiles":{"11,6":{"TorchUnlit":{"x":11,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,6":{"TorchUnlit":{"x":2,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,9":{"TorchUnlit":{"x":2,"y":9,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"11,9":{"TorchUnlit":{"x":11,"y":9,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,12":{"TorchUnlit":{"x":8,"y":12,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,12":{"TorchUnlit":{"x":5,"y":12,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,1":{"TorchUnlit":{"x":8,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"TempleSanctumGuarded":{"name":"TempleSanctumGuarded","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"1,2":"y","2,2":"y","1,1":"y","2,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":1000,"grid":"11000141100011\n1m0002222000m4\n0000L100400000\n000X142211X000\n00011a22A11R00\n1211AG00Ga1121\n420220G0022021\n12022000022021\n1211oG00GC11D1\n00-14+22C11C04\n000X1122410000\n0000R1004L00,0\n1m000222g0G0G0\n11000141400000\n","POI":[],"Keyring":[{"x":10,"y":10}],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"4,5":{"Type":"Shrine","Name":"Metal"},"8,4":{"Type":"Shrine","Name":"Metal"},"8,9":{"Priority":true},"5,9":{"Type":"Charger"},"9,8":{"Type":"Chest","Lock":"Blue"},"11,9":{"Type":"Chest","Loot":"storage"},"9,11":{"Type":"Barrel"},"4,2":{"Type":"Barrel"},"11,4":{"Type":"Rubble"},"4,11":{"Type":"Rubble"},"10,12":{"Type":"Spawn","required":[],"AI":"guard"},"5,5":{"Type":"Spawn","required":[]},"5,8":{"Type":"Spawn","required":[]},"8,8":{"Type":"Spawn","required":[]},"8,5":{"Type":"Spawn","required":[]},"6,6":{"Type":"Spawn","required":[],"AI":"guard"},"12,12":{"Type":"Prisoner"},"12,8":{"Type":"Door","Priority":true,"AlwaysClose":true}},"effectTiles":{"2,6":{"TorchUnlit":{"x":2,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"11,6":{"TorchUnlit":{"x":11,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,12":{"TorchUnlit":{"x":5,"y":12,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,12":{"TorchUnlit":{"x":8,"y":12,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,1":{"TorchUnlit":{"x":8,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"10,10":{"Torch":{"x":10,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"TempleChamber":{"name":"TempleChamber","w":1,"h":2,"primInd":"ud","index":{"1,1":"ud","1,2":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":400,"grid":"111D111\n1110111\n1100011\n1100011\n1000001\n1300031\n+00+00+\n+00+00+\n1300031\n1000001\n1100011\n1100011\n1110111\n111D111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"1,5":{"Type":"Spawn","required":["statue"],"Label":"Statue"},"5,5":{"Type":"Spawn","required":["statue"],"Label":"Statue"},"5,8":{"Type":"Spawn","required":["statue"],"Label":"Statue"},"1,8":{"Type":"Spawn","required":["statue"],"Label":"Statue"},"6,6":{"Type":"Charger"},"6,7":{"Type":"Charger"},"0,6":{"Type":"Charger"},"0,7":{"Type":"Charger"},"3,6":{"Type":"Charger"},"3,7":{"Type":"Charger"},"3,0":{"Type":"Door","Priority":true,"AlwaysClose":true},"3,13":{"Type":"Door","Priority":true,"AlwaysClose":true}},"effectTiles":{"5,4":{"TorchUnlit":{"x":5,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"6,6":{"TorchUnlit":{"x":6,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,4":{"TorchUnlit":{"x":1,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","narrow"],"forbidTags":[],"requireTags":["orrery"],"indexTags":["orrery"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"ShopStart":{"name":"ShopStart","w":2,"h":1,"primInd":"r","index":{"1,1":"r","2,1":"l"},"flexEdge":{"2,1":"y","1,1":"y"},"flexEdgeSuper":{"2,1":"y","1,1":"y"},"scale":7,"category":"unavailable","weight":10,"grid":"1111111LL,1111\n1L0m001LL/1000\n1L0000D000D000\n1L00F01D111000\n0000F010BL1000\n1LL0FL10001000\n11111111111111\n","POI":[],"Keyring":[],"Jail":[{"x":9,"y":4,"type":"furniture","radius":1}],"Tiles":{"4,3":{"Type":"Table"},"7,3":{"Type":"Door","Priority":true,"AlwaysClose":true},"6,2":{"Type":"Door","Priority":true,"AlwaysClose":true},"8,1":{"Type":"Barrel"},"4,4":{"Type":"Table"},"4,5":{"Type":"Table"},"5,5":{"Type":"Barrel"},"7,1":{"Type":"Barrel"},"7,0":{"Type":"Barrel"},"8,0":{"Type":"Barrel"},"10,2":{"Type":"Door","Priority":true,"AlwaysClose":true},"9,1":{"Type":"Debris","Always":true},"9,4":{"Type":"Cage","Furniture":"Cage"},"2,5":{"Type":"Barrel"},"1,5":{"Type":"Barrel"},"1,1":{"Type":"Barrel"},"1,2":{"Type":"Barrel"},"1,3":{"Type":"Barrel"}},"effectTiles":{"8,4":{"Torch":{"x":8,"y":4,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,1":{"Torch":{"x":2,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"4,1":{"Torch":{"x":4,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,1":{"Torch":{"x":12,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["unavailable"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Conveyor_+":{"name":"Conveyor_+","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":50,"grid":"1111111\n1tVVVVu\n1122211\nd00000d\n1122211\nuVVVVt1\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"6,3":{"Type":"Door"},"0,3":{"Type":"Door"},"1,1":{"Type":"DollTerminal"},"5,5":{"Type":"DollTerminal"},"0,5":{"Type":"DollSupply"},"6,1":{"Type":"DollSupply"},"2,1":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,1":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"4,1":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"5,1":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"1,5":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"2,5":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,5":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"4,5":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0}},"effectTiles":{"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,3":{"TorchUnlit":{"x":5,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":[],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"Conveyor_+2":{"name":"Conveyor_+2","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":50,"grid":"1111111\nuVVVVt1\n1122211\nd00000d\n1122211\n1tVVVVu\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"6,3":{"Type":"Door"},"0,3":{"Type":"Door"},"0,1":{"Type":"DollSupply"},"6,5":{"Type":"DollSupply"},"1,5":{"Type":"DollTerminal"},"5,1":{"Type":"DollTerminal"},"1,1":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"2,1":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,1":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"4,1":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"5,5":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"4,5":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,5":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"2,5":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0}},"effectTiles":{"5,3":{"TorchUnlit":{"x":5,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":[],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"Conveyor_LongLatex":{"name":"Conveyor_LongLatex","w":2,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"udlr"},"flexEdge":{"2,1":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":400,"grid":"11001111110011\n10000000000001\n00uVVNVV110000\n0005000N110000\n0000000VVNVVVV\n1000000000000t\n11001111110011\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"11,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"2,2":{"Type":"DollSupply"},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"4,2":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"6,2":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"9,4":{"Type":"BondageMachine","Binding":"Latex"},"10,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"8,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"7,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"7,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"5,2":{"Type":"BondageMachine","Binding":"Latex"},"7,3":{"Type":"BondageMachine","Binding":"Latex"},"13,5":{"Type":"DollTerminal"},"12,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"13,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,3":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoff"}},"effectTiles":{"8,4":{"TorchUnlit":{"x":8,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":["factory"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"Conveyor_LongLatex2":{"name":"Conveyor_LongLatex2","w":2,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"udlr"},"flexEdge":{"2,1":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":400,"grid":"11001111110011\n10005000000001\n00VVVu1tVVVV00\n00V11111111V00\n00VVVNVNVNVV00\n10000000000000\n11001111110011\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"7,4":{"Type":"BondageMachine","Binding":"Latex"},"5,4":{"Type":"BondageMachine","Binding":"Latex"},"9,4":{"Type":"BondageMachine","Binding":"Latex"},"10,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"11,4":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"11,3":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"11,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"10,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"9,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"8,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"5,2":{"Type":"DollSupply"},"7,2":{"Type":"DollTerminal"},"8,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"6,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"4,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"2,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"2,3":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"4,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"4,1":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoffD","direction":{"x":0,"y":1}}},"effectTiles":{"3,4":{"TorchUnlit":{"x":3,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"10,4":{"TorchUnlit":{"x":10,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":["factory"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"Conveyor_LongMetal":{"name":"Conveyor_LongMetal","w":1,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr"},"flexEdge":{"1,2":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":500,"grid":"1110111\n1100011\n1000001\n0022200\n10VVu01\n10V11g1\n10N1C01\n10V1C01\n10V11g1\n10VVt01\n0022200\n1000001\n1100011\n1110111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,6":{"Type":"Chest","Loot":"storage"},"4,7":{"Type":"Chest","Loot":"storage"},"2,7":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,9":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,9":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"2,5":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,6":{"Type":"BondageMachine","Binding":"Metal"},"2,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,4":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"4,4":{"Type":"DollSupply"},"4,9":{"Type":"DollTerminal"}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"3,9":{"TorchUnlit":{"x":3,"y":9,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":["factory"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"Conveyor_LongChastity":{"name":"Conveyor_LongChastity","w":1,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"ulr"},"flexEdge":{"1,2":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":600,"grid":"1110111\n1100011\n1000001\nd02t20d\n1R0V001\n1R1N101\n1LLV001\n1LRNG01\n1L0V001\n1R1N101\nd02V20d\n105N001\n1uVV001\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,7":{"Type":"Spawn","required":[],"AI":"guard"},"2,6":{"Type":"Barrel"},"2,7":{"Type":"Rubble"},"1,5":{"Type":"Rubble"},"1,6":{"Type":"Barrel","Always":true},"1,7":{"Type":"Barrel","Always":true},"1,8":{"Type":"Barrel"},"1,4":{"Type":"Rubble"},"1,9":{"Type":"Rubble"},"3,6":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,7":{"Type":"BondageMachine","Binding":"Plug"},"3,8":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,9":{"Type":"BondageMachine","Binding":"Metal"},"3,10":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,3":{"Type":"DollTerminal"},"3,5":{"Type":"BondageMachine","Binding":"Chastity"},"3,4":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,11":{"Type":"BondageMachine","Binding":"Metal"},"6,10":{"Type":"Door"},"0,10":{"Type":"Door"},"0,3":{"Type":"Door"},"6,3":{"Type":"Door"},"1,12":{"Type":"DollSupply"},"2,12":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,12":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"2,11":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoffD","direction":{"x":0,"y":1}}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,6":{"Torch":{"x":4,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":["factory","arousalMode"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"Conveyor_TapeFacility":{"name":"Conveyor_TapeFacility","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"2,2":"y","2,1":"y","1,1":"y","1,2":"y"},"flexEdgeSuper":{"1,2":"y","2,1":"y","1,1":"y","2,2":"y"},"scale":7,"category":"factory","weight":500,"grid":"00000000000000\n0220XXuVVVVVu0\n02202200VV5220\n00002200NN0000\n01112200VV01C0\n01Cb2222NN0000\n010b2222VV0000\n010D0000NN0000\n010b0000VV0000\n0111L000NN01C0\n00000000VV0000\n0220tVVNVV0220\n0220tVVNVV0220\n0G000000000000\n","POI":[],"Keyring":[],"Jail":[{"x":4,"y":9,"type":"furniture","radius":1}],"Tiles":{"4,9":{"Type":"DisplayStand","Furniture":"DisplayStand"},"1,13":{"Type":"Spawn","required":[],"AI":"looseguard"},"12,4":{"Type":"Chest","Loot":"storage"},"12,9":{"Type":"Chest","Loot":"storage"},"8,3":{"Type":"BondageMachine","Binding":"Tape"},"8,5":{"Type":"BondageMachine","Binding":"Tape"},"8,7":{"Type":"BondageMachine","Binding":"Tape"},"8,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"8,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"9,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"9,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"8,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"8,9":{"Type":"BondageMachine","Binding":"Tape"},"9,9":{"Type":"BondageMachine","Binding":"Tape"},"9,3":{"Type":"BondageMachine","Binding":"Tape"},"8,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"9,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"8,1":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"7,1":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"6,1":{"Type":"DollSupply"},"9,5":{"Type":"BondageMachine","Binding":"Tape"},"9,7":{"Type":"BondageMachine","Binding":"Tape"},"9,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"9,10":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"8,11":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"9,12":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"8,12":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"5,11":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"5,12":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"7,11":{"Type":"BondageMachine","Binding":"Latex"},"7,12":{"Type":"BondageMachine","Binding":"Latex"},"9,11":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"8,10":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"4,11":{"Type":"DollTerminal"},"4,12":{"Type":"DollTerminal"},"6,11":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"6,12":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,7":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Purple"},"2,5":{"Type":"Chest","Loot":"silver","Priority":true},"9,1":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"10,1":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"11,1":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"12,1":{"Type":"DollSupply"},"10,2":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoff"}},"effectTiles":{"11,5":{"TorchUnlit":{"x":11,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"11,10":{"TorchUnlit":{"x":11,"y":10,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,10":{"TorchUnlit":{"x":2,"y":10,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,5":{"TorchUnlit":{"x":2,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_Shrine1":{"name":"Bellows_Shrine1","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":60,"grid":"1X000X1\n1000001\n00VVV00\n00VAV00\n00t+u00\n1000001\n1X000X1\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"Shrine","Name":"Will","Priority":true},"4,3":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"2,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,3":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"4,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,4":{"Type":"Charger"},"4,4":{"Type":"DollSupply"},"2,4":{"Type":"DollTerminal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":["start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_Shrine2":{"name":"Bellows_Shrine2","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"bellows","weight":50,"grid":"0000000\n0011110\n0110O10\n0b=0010\n01b1D10\n2X2X222\n0000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,2":{"Type":"ChestOrShrine"},"4,4":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"2,3":{"Type":"Charger","NoRemove":false}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":["start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_Shrine3":{"name":"Bellows_Shrine3","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"bellows","weight":50,"grid":"0000000\n0011000\n0022200\n0422210\n002A240\n04040m0\n0000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,4":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{"3,2":{"TorchUnlit":{"x":3,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":["start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_T_noU":{"name":"Bellows_T_noU","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"bellows","weight":70,"grid":"1X111X1\n12g0RC1\n1211111\n0000000\n0000000\n1000001\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"5,1":{"Type":"Chest"},"4,1":{"Type":"Rubble"}},"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":["start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_LR":{"name":"Bellows_LR","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":120,"grid":"11,1111\n1CRggR1\n1bb1101\n00L0L00\n2222222\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,1":{"Type":"Rubble"},"5,1":{"Type":"Rubble"},"4,3":{"Type":"Barrel"},"2,3":{"Type":"Barrel"},"1,1":{"Type":"Chest"}},"effectTiles":{"3,3":{"TorchUnlit":{"x":3,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_LR_pris":{"name":"Bellows_LR_pris","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":12,"grid":"11,1111\n1G0gg01\n1bb1101\n0000000\n2222222\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"1,1":{"Type":"Prisoner"}},"effectTiles":{"3,3":{"TorchUnlit":{"x":3,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_UR":{"name":"Bellows_UR","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":100,"grid":"1000001\n10TF000\n1011110\n10R0LT0\n1011110\n10TCL00\n1111111\n","POI":[],"Keyring":[{"x":4,"y":1}],"Jail":[],"Tiles":{"2,5":{"Type":"Trap"},"5,3":{"Type":"Trap"},"2,1":{"Type":"Trap"},"3,1":{"Type":"Table"},"3,5":{"Type":"Chest","Lock":"Red"},"4,3":{"Type":"Barrel"},"4,5":{"Type":"Barrel"},"2,3":{"Type":"Rubble"}},"effectTiles":{"6,1":{"TorchUnlit":{"x":6,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_UD":{"name":"Bellows_UD","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":120,"grid":"1000001\n11100R1\n1?400L1\n10100R1\n10100R1\n1000001\n1000001\n","POI":[],"Keyring":[],"Jail":[{"x":5,"y":2,"type":"furniture","radius":1}],"Tiles":{"5,1":{"Type":"Rubble"},"5,4":{"Type":"Rubble"},"5,3":{"Type":"Rubble"},"5,2":{"Type":"Cage","Furniture":"Cage"}},"effectTiles":{"2,5":{"TorchUnlit":{"x":2,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_DR":{"name":"Bellows_DR","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":100,"grid":"1111111\n1CL0LR1\n1TRLRR1\n1000000\n1000000\n1L00RR1\n1100111\n","POI":[],"Keyring":[],"Jail":[{"x":4,"y":1,"type":"furniture","radius":1}],"Tiles":{"4,1":{"Type":"Cage","Furniture":"Cage"},"1,1":{"Type":"Chest"},"2,1":{"Type":"Barrel"},"3,2":{"Type":"Barrel"},"1,5":{"Type":"Barrel"},"5,1":{"Type":"Rubble"},"5,2":{"Type":"Rubble"},"4,2":{"Type":"Rubble"},"5,5":{"Type":"Rubble"},"4,5":{"Type":"Rubble"},"2,2":{"Type":"Rubble"},"1,2":{"Type":"Trap","Always":true}},"effectTiles":{"3,1":{"TorchUnlit":{"x":3,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_UL":{"name":"Bellows_UL","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":120,"grid":"111d111\n0000bX1\n0+00bX1\n0200bC1\n0200b01\n0000GR1\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,0":{"Type":"Door"},"5,3":{"Type":"Chest","Lock":"Blue"},"4,5":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door"},"5,5":{"Type":"Rubble"},"1,2":{"Type":"Charger"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_DL":{"name":"Bellows_DL","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":80,"grid":"1111111\n1FF00C1\n11b10G1\nd00b001\n1001bD1\n10T0001\n111d111\n","POI":[],"Keyring":[{"x":4,"y":1}],"Jail":[],"Tiles":{"2,5":{"Type":"Trap"},"2,1":{"Type":"Table","Food":"Plate"},"1,1":{"Type":"Table"},"5,4":{"Type":"Door","Priority":true,"AlwaysClose":true},"5,2":{"Type":"Spawn","required":[],"AI":"guard"},"5,1":{"Type":"Chest"},"3,6":{"Type":"Door"},"0,3":{"Type":"Door"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_T_noU":{"name":"Factory_T_noU","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":90,"grid":"1111X11\n1000201\n1222221\n0000000\n0000000\n1100111\n1100111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["factory"],"used":false}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_T_noD":{"name":"Factory_T_noD","w":1,"h":1,"primInd":"ulr","index":{"1,1":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":25,"grid":"1100111\n1000201\n1222X21\n0000200\n0000200\n1000201\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["factory"],"used":false}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_T_noR":{"name":"Factory_T_noR","w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":10,"grid":"1100111\n1000221\n10G02X1\n0000221\n00G02X1\n1000221\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,2":{"Type":"Spawn","required":[]},"2,4":{"Type":"Spawn","required":[]}},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_T_noL":{"name":"Factory_T_noL","w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":10,"grid":"1100,11\n1200201\n12G0201\n120020d\n12G0201\n1200201\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,2":{"Type":"Spawn","required":[]},"2,4":{"Type":"Spawn","required":[]},"6,3":{"Type":"Door"}},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Conveyor_LongTape":{"name":"Conveyor_LongTape","w":1,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr"},"flexEdge":{"1,2":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":300,"grid":"1100111\n1000001\n1000t01\n00u0V00\n00V0N00\n10N0V01\n1CV0N11\n11N0VC1\n10V0N01\n10N0V01\nd0V0u0d\n10t0001\n1000001\n111d111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,4":{"Type":"BondageMachine","Binding":"Tape"},"4,6":{"Type":"BondageMachine","Binding":"Tape"},"2,7":{"Type":"BondageMachine","Binding":"Tape"},"2,9":{"Type":"BondageMachine","Binding":"Tape"},"4,8":{"Type":"BondageMachine","Binding":"Tape"},"4,7":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"4,5":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"4,3":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"2,3":{"Type":"DollSupply"},"2,5":{"Type":"BondageMachine","Binding":"Tape"},"2,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,10":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"4,10":{"Type":"DollSupply"},"4,9":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"4,2":{"Type":"DollTerminal"},"2,11":{"Type":"DollTerminal"},"5,7":{"Type":"Chest"},"1,6":{"Type":"Chest"},"6,10":{"Type":"Door"},"0,10":{"Type":"Door"},"3,13":{"Type":"Door"}},"effectTiles":{"1,8":{"TorchUnlit":{"x":1,"y":8,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,7":{"TorchUnlit":{"x":5,"y":7,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","chest","conveyor"],"forbidTags":["start"],"requireTags":["factory"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"IndustrialHallV":{"name":"IndustrialHallV","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"1100111\n11222X1\n1100111\n11222X1\n1100111\n11222X1\n1100111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["industrial"],"used":false}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,5":{"TorchUnlit":{"x":4,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHallH":{"name":"IndustrialHallH","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"1111111\n11222X1\n1100201\n0000+00\n0000200\n11222X1\n1100111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["industrial"],"used":false}],"Keyring":[],"Jail":[],"Tiles":{"4,3":{"Type":"Charger"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_U":{"name":"IndustrialHall_U","w":1,"h":1,"primInd":"u","index":{"1,1":"u"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":30,"grid":"111D111\n1CL0/C1\n1L00001\n1011101\n100R001\n1/11101\n1000R01\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,0":{"Type":"Door","Priority":true,"AlwaysClose":true},"5,1":{"Type":"Chest","Loot":"storage","Chance":0.8},"1,2":{"Type":"Barrel"},"1,1":{"Type":"Chest"},"2,1":{"Type":"Barrel"},"3,4":{"Type":"Rubble"},"4,6":{"Type":"Rubble"},"4,1":{"Type":"Debris"},"1,5":{"Type":"Debris"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_D":{"name":"IndustrialHall_D","w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":30,"grid":"1111111\n1uu0RR1\n1000OR1\n10G0001\n1X00O01\n1X00001\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,2":{"Type":"ChestOrShrine"},"4,4":{"Type":"ChestOrShrine"},"1,1":{"Type":"DollSupply"},"2,1":{"Type":"DollSupply"},"2,3":{"Type":"Spawn","required":[],"AI":"looseguard"},"5,1":{"Type":"Rubble"},"4,1":{"Type":"Rubble"},"5,2":{"Type":"Rubble"}},"effectTiles":{"3,1":{"Torch":{"x":3,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_L":{"name":"IndustrialHall_L","w":1,"h":1,"primInd":"l","index":{"1,1":"l"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":25,"grid":"1111111\n1RRRRR1\n1000001\n0000L01\n0000LL1\n1X0LLO1\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,5":{"Type":"Barrel"},"5,4":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"3,5":{"Type":"Barrel"},"4,3":{"Type":"Barrel"},"5,5":{"Type":"ChestOrShrine"},"2,1":{"Type":"Rubble"},"3,1":{"Type":"Rubble"},"4,1":{"Type":"Rubble"},"5,1":{"Type":"Rubble"},"1,1":{"Type":"Rubble"}},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_R":{"name":"IndustrialHall_R","w":1,"h":1,"primInd":"r","index":{"1,1":"r"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":50,"grid":"1111111\n1tRLRR1\n1V00001\n1V00000\n1000001\n1ALRLR1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":4,"y":5,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"DollTerminal"},"4,5":{"Type":"DisplayStand","Furniture":"DisplayStand"},"3,1":{"Type":"Cage","Furniture":"Cage"},"5,5":{"Type":"Rubble"},"2,5":{"Type":"Barrel","Always":true},"3,5":{"Type":"Rubble"},"4,1":{"Type":"Rubble"},"5,1":{"Type":"Rubble"},"2,1":{"Type":"Rubble"},"1,2":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"1,3":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"1,5":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial","conveyor","shrine"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_U_poi":{"name":"IndustrialHall_U_poi","w":1,"h":1,"primInd":"u","index":{"1,1":"u"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"111D111\n1000001\n1000001\n1000001\n1000001\n1000001\n1000001\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["industrial"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"3,0":{"Type":"Door","Priority":true,"AlwaysClose":true}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_R_poi":{"name":"IndustrialHall_R_poi","w":1,"h":1,"primInd":"r","index":{"1,1":"r"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"1111111\n1000001\n1000001\n1000000\n1000001\n1000001\n1111111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["industrial"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_L_poi":{"name":"IndustrialHall_L_poi","w":1,"h":1,"primInd":"l","index":{"1,1":"l"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"1111111\n1000001\n1000001\n0000L01\n0000LL1\n100LL01\n1111111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["industrial"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"4,5":{"Type":"Barrel"},"5,4":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"3,5":{"Type":"Barrel"},"4,3":{"Type":"Barrel"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_D_poi":{"name":"IndustrialHall_D_poi","w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"1111111\n1000RR1\n1000001\n1000001\n1000001\n1000001\n1100111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["industrial"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"5,1":{"Type":"Rubble"},"4,1":{"Type":"Rubble"}},"effectTiles":{"3,1":{"Torch":{"x":3,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Factory_+":{"name":"Factory_+","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":35,"grid":"1100111\n1000001\n1222221\n0000000\n0000000\n1000001\n1100111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["factory"],"used":false,"chance":0.75}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_ButtonTest":{"name":"Factory_ButtonTest","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":10,"grid":"1111111\n1C00001\n1uVVt01\n00T@T00\n00TTT00\n1m000m1\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"EffectTile","Tile":"Wire"},"2,2":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"4,2":{"Type":"DollTerminal"},"1,2":{"Type":"DollSupply","count":0,"wireType":"increment","rate":3},"3,4":{"Type":"Trap"},"4,3":{"Type":"Trap"},"2,3":{"Type":"Trap"},"2,4":{"Type":"Trap"},"4,4":{"Type":"Trap"},"1,1":{"Type":"Chest"}},"effectTiles":{"3,3":{"Wire":{"x":3,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,3":{"Wire":{"x":2,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,3":{"Wire":{"x":1,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,2":{"Wire":{"x":1,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_PPDoor":{"name":"Factory_PPDoor","w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":100,"grid":"1111111\n10CCC01\n1000001\n1bbZbb1\n1000001\n1000001\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"AutoDoor","wireType":"AutoDoor_HoldOpen","Label":"HoldOpen"},"2,1":{"Type":"Chest","Loot":"storage","Chance":0.8},"4,1":{"Type":"Chest","Loot":"storage","Chance":0.8},"3,1":{"Priority":true}},"effectTiles":{"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"3,3":{"Wire":{"x":3,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,4":{"PressurePlateHold":{"x":3,"y":4,"name":"PressurePlateHold","duration":9999,"priority":50,"tags":["wire"]}},"3,2":{"PressurePlateHold":{"x":3,"y":2,"name":"PressurePlateHold","duration":9999,"priority":50,"tags":["wire"]}}},"Skin":{},"inaccessible":[],"tags":["factory","chest","signal"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"IndustrialPuzzle":{"name":"IndustrialPuzzle","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"1,2":"y","2,2":"y","2,1":"y","1,1":"y"},"flexEdgeSuper":{"1,2":"y","2,2":"y","2,1":"y","1,1":"y"},"scale":7,"category":"industrial","weight":1500,"grid":"00000000000000\n000000001111L0\n0uVV0000ZC1LL0\n005N0+001b1110\n0@0V0000D000D0\n0G0N0000100F10\n000V00001LGF10\n000N0+00100010\n000V0000111110\n000V0000000000\n000V000RLRRL/0\n0tVV0?0RLRRL/0\n00000000000000\n00000000000000\n","POI":[],"Keyring":[{"x":11,"y":7}],"Jail":[{"x":9,"y":6,"type":"furniture","radius":1}],"Tiles":{"11,5":{"Type":"Table"},"11,6":{"Type":"Table"},"10,10":{"Type":"Rubble"},"9,11":{"Type":"Rubble"},"9,10":{"Type":"Rubble"},"10,11":{"Type":"Rubble"},"11,10":{"Type":"Barrel"},"8,11":{"Type":"Barrel"},"8,10":{"Type":"Barrel"},"11,11":{"Type":"Barrel"},"12,11":{"Type":"Debris"},"12,10":{"Type":"Debris"},"7,11":{"Type":"Rubble"},"7,10":{"Type":"Rubble"},"9,2":{"Type":"Chest","Loot":"silver","Priority":true},"11,2":{"Type":"Barrel","Always":true},"12,1":{"Type":"Barrel"},"12,2":{"Type":"Barrel"},"8,2":{"Type":"AutoDoor","wireType":"AutoDoor_HoldOpen","Label":"HoldOpen"},"1,2":{"Type":"DollSupply","count":0,"wireType":"increment","rate":3},"3,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,7":{"Type":"BondageMachine","Binding":"Latex"},"3,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,9":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,10":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,2":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,11":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"2,11":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"1,11":{"Type":"DollTerminal"},"3,5":{"Type":"BondageMachine","Binding":"Tape"},"3,3":{"Type":"BondageMachine","Binding":"Metal"},"5,7":{"Type":"Charger"},"5,3":{"Type":"Charger"},"12,4":{"Type":"Door","Priority":true,"AlwaysClose":true},"8,4":{"Type":"Door","Priority":true,"AlwaysClose":true},"9,6":{"Type":"Cage","Furniture":"Cage"},"10,6":{"Type":"Spawn","required":[],"AI":"guard"},"1,5":{"Type":"Spawn","required":[],"AI":"guard"},"2,3":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoff"}},"effectTiles":{"7,2":{"Wire":{"x":7,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,2":{"Wire":{"x":8,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,3":{"Wire":{"x":7,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,4":{"Wire":{"x":7,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,5":{"Wire":{"x":7,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,6":{"Wire":{"x":7,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,7":{"Wire":{"x":7,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,8":{"Wire":{"x":7,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,9":{"Wire":{"x":7,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,9":{"Wire":{"x":6,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,9":{"Wire":{"x":5,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,9":{"Wire":{"x":4,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,3":{"Wire":{"x":1,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,4":{"Wire":{"x":1,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,9":{"PressurePlateHold":{"x":3,"y":9,"name":"PressurePlateHold","duration":9999,"priority":50,"tags":["wire"]}},"1,2":{"Wire":{"x":1,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}}},"Skin":{},"inaccessible":[],"tags":["industrial","silverchest","conveyor","signal"],"forbidTags":["silverchest"],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"BellowsDollDispenser":{"name":"BellowsDollDispenser","w":2,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"l"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"bellows","weight":500,"grid":"00001111111111\n0@001111111111\n000000000000F1\n0000VVNVNVNVu1\n0C000000000001\n11001111111111\n11001111111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"12,3":{"Type":"DollSupply","count":0,"wireType":"increment","rate":3},"11,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"10,3":{"Type":"BondageMachine","Binding":"Metal"},"9,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"6,3":{"Type":"BondageMachine","Binding":"Chastity"},"7,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"8,3":{"Type":"BondageMachine","Binding":"Plug"},"5,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"4,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"12,2":{"Type":"Table","Food":"Plate"},"1,4":{"Type":"Chest"}},"effectTiles":{"4,5":{"Wire":{"x":4,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,5":{"Wire":{"x":5,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,5":{"Wire":{"x":6,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,5":{"Wire":{"x":7,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,1":{"Wire":{"x":2,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,1":{"Wire":{"x":3,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,1":{"Wire":{"x":4,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,2":{"Wire":{"x":4,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,3":{"Wire":{"x":4,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,4":{"Wire":{"x":4,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,1":{"Wire":{"x":1,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,5":{"Wire":{"x":8,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"9,5":{"Wire":{"x":9,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,5":{"Wire":{"x":10,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"11,5":{"Wire":{"x":11,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"12,5":{"Wire":{"x":12,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"12,4":{"Wire":{"x":12,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"12,3":{"Wire":{"x":12,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,2":{"TorchUnlit":{"x":6,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,2":{"TorchUnlit":{"x":8,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"10,2":{"TorchUnlit":{"x":10,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide","chest","conveyor"," signal"],"forbidTags":["start"],"requireTags":["bellows","arousalMode"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"BellowsRobotTrap":{"name":"BellowsRobotTrap","w":1,"h":2,"primInd":"d","index":{"1,1":"d","1,2":"udlr"},"flexEdge":{"1,2":"y"},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":8000,"grid":"1111111\n111C111\n13Z0Z31\n1110111\n13Z0Z31\n1110111\n13Z0Z31\n1110111\n13Z0Z31\n111D111\n0200200\n0200200\n0+00X00\n0000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"1,12":{"Type":"Charger"},"3,9":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"3,1":{"Type":"Chest","Loot":"lessergold","Faction":"AncientRobot","NoTrap":"true","Priority":"true"},"4,2":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,2":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,4":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,4":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,6":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,6":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,8":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,8":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"1,8":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"1,6":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"5,6":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"5,8":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"5,4":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"1,4":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"1,2":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"5,2":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"}},"effectTiles":{"2,8":{"Wire":{"x":2,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,8":{"Wire":{"x":3,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,8":{"Wire":{"x":4,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,7":{"Wire":{"x":3,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,6":{"Wire":{"x":3,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,5":{"Wire":{"x":3,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,4":{"Wire":{"x":3,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,3":{"Wire":{"x":3,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,2":{"Wire":{"x":2,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,4":{"Wire":{"x":2,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,4":{"Wire":{"x":4,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,6":{"Wire":{"x":4,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,6":{"Wire":{"x":2,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,2":{"Wire":{"x":4,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,2":{"PressurePlateOneUse":{"x":3,"y":2,"name":"PressurePlateOneUse","duration":9999,"priority":50,"tags":["wire"]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide","lessergold"],"forbidTags":["start","maxlessergold"],"requireTags":["bellows"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Bellows_DR2":{"name":"Bellows_DR2","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":100,"grid":"1111111\n1000000\n1L11110\n1LRRRR0\n1L11110\n1LRRRR0\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,5":{"Type":"Rubble"},"2,5":{"Type":"Rubble"},"3,5":{"Type":"Rubble"},"5,5":{"Type":"Rubble"},"5,3":{"Type":"Rubble"},"4,3":{"Type":"Rubble"},"3,3":{"Type":"Rubble"},"2,3":{"Type":"Rubble"},"1,2":{"Type":"Barrel"},"1,3":{"Type":"Barrel"},"1,4":{"Type":"Barrel"},"1,5":{"Type":"Barrel"}},"effectTiles":{"6,1":{"TorchUnlit":{"x":6,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"BellowsRobotTrap2":{"name":"BellowsRobotTrap2","w":2,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"udlr"},"flexEdge":{"1,1":"y","2,1":"y"},"flexEdgeSuper":{"1,1":"y","2,1":"y"},"scale":7,"category":"bellows","weight":300,"grid":"00000000000000\n0X222XX111Z100\n01111111333110\n01C00001Z11110\n0111110000z010\n01X22111111d10\n00000000000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,3":{"Type":"Chest","Loot":"lessergold","Faction":"AncientRobots","NoTrap":"true","Priority":"true"},"8,3":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"11,5":{"Type":"Door"},"10,4":{"Type":"AutoDoor","wireType":"AutoDoor_Close","Label":"Open"},"10,1":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"8,2":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"Robo","tags":["robot","minor","elite"],"Chance":1,"force":"true","faction":"Ambush"},"9,2":{"Type":"Spawn","required":["robot"],"Label":"Robo","tags":["robot","minor","elite"],"Chance":1,"force":"true","faction":"Ambush"},"10,2":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"Robo","tags":["robot","minor","elite"],"Chance":1,"force":"true","faction":"Ambush"}},"effectTiles":{"7,3":{"Wire":{"x":7,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,3":{"Wire":{"x":6,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,3":{"Wire":{"x":5,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,3":{"Wire":{"x":8,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,3":{"Wire":{"x":4,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,3":{"PressurePlateOneUse":{"x":3,"y":3,"name":"PressurePlateOneUse","duration":9999,"priority":50,"tags":["wire"]}},"9,3":{"Wire":{"x":9,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,3":{"Wire":{"x":10,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,4":{"Wire":{"x":10,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,2":{"Wire":{"x":10,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,1":{"Wire":{"x":10,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,4":{"Wire":{"x":7,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,4":{"Wire":{"x":8,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"9,4":{"Wire":{"x":9,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide","lessergold"],"forbidTags":["start","maxlessergold"],"requireTags":["bellows"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Bellows_Silv1":{"name":"Bellows_Silv1","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":600,"grid":"1111111\n13ZCZ31\n1Z101Z1\n001z100\n0000000\n0000000\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"AutoDoor","wireType":"AutoDoor_Close","Label":"Open"},"5,2":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"1,2":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,1":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,1":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"3,1":{"Type":"Chest","Loot":"silver","Priority":true},"1,1":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"robo","tags":["robot","minor","elite"],"Chance":1,"force":"true","faction":"Ambush"},"5,1":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"robo","tags":["robot","minor","elite"],"Chance":1,"force":"true","faction":"Ambush"}},"effectTiles":{"3,3":{"Wire":{"x":3,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,2":{"Wire":{"x":1,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,2":{"Wire":{"x":2,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,2":{"Wire":{"x":4,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,2":{"Wire":{"x":5,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,2":{"PressurePlateOneUse":{"x":3,"y":2,"name":"PressurePlateOneUse","duration":9999,"priority":50,"tags":["wire"]}},"2,1":{"Wire":{"x":2,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,1":{"Wire":{"x":4,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}}},"Skin":{},"inaccessible":[],"tags":["bellows","silverchest"],"forbidTags":["maxsilverchest"," start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_Silv2":{"name":"Bellows_Silv2","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":600,"grid":"1100111\n1000001\n11D1221\n1C0b001\n11Z1X01\n1100001\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"1,3":{"Type":"Chest","Loot":"silver","Priority":true},"2,4":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"}},"effectTiles":{"2,4":{"Wire":{"x":2,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,3":{"PressurePlateOneUse":{"x":2,"y":3,"name":"PressurePlateOneUse","duration":9999,"priority":50,"tags":["wire"]}}},"Skin":{},"inaccessible":[],"tags":["bellows","silverchest"],"forbidTags":["maxsilverchest"," start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_Gallery":{"name":"Bellows_Gallery","w":1,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ulr"},"flexEdge":{"1,2":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":200,"grid":"1LRR2L1\n1000201\n10X2X01\n001D100\n1110111\n11Z0Z11\n13Z0Z31\n13Z0Z31\n13Z0Z31\n1110111\n001D100\n10X2@01\n1020001\n1F200F1\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,5":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,6":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,7":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,8":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,5":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,6":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,7":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,8":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"3,3":{"Type":"Door","Priority":true,"AlwaysClose":true},"3,10":{"Type":"Door","Priority":true,"AlwaysClose":true},"5,13":{"Type":"Table"},"1,13":{"Type":"Table"},"5,0":{"Type":"Barrel"},"1,0":{"Type":"Barrel"},"2,0":{"Type":"Rubble"},"3,0":{"Type":"Rubble"},"5,6":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor"],"Chance":1,"force":"true"},"1,6":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor"],"Chance":1,"force":"true"},"1,7":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor"],"Chance":1,"force":"true"},"5,7":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor"],"Chance":1,"force":"true"},"5,8":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor"],"Chance":1,"force":"true"},"1,8":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor"],"Chance":1,"force":"true"}},"effectTiles":{"4,11":{"Wire":{"x":4,"y":11,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,10":{"Wire":{"x":4,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,9":{"Wire":{"x":4,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,8":{"Wire":{"x":4,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,7":{"Wire":{"x":4,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,5":{"Wire":{"x":4,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,6":{"Wire":{"x":4,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,8":{"Wire":{"x":3,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,8":{"Wire":{"x":2,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,7":{"Wire":{"x":2,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,6":{"Wire":{"x":2,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,5":{"Wire":{"x":2,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,9":{"Wire":{"x":3,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,7":{"Wire":{"x":3,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,6":{"Wire":{"x":3,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,5":{"Wire":{"x":3,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}}},"Skin":{},"inaccessible":[],"tags":["bellows","signal","ambush"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"Arena_Dollmaker":{"name":"Arena_Dollmaker","w":3,"h":3,"primInd":"dr","index":{"1,1":"dr","1,2":"udlr","1,3":"ur","2,1":"dlr","2,2":"udlr","2,3":"ulr","3,1":"dl","3,2":"udlr","3,3":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"boss","weight":-1,"grid":"111111111111111111111\n111t1110=0u0=0111t111\n110V000000V000000V011\n110N0VVVVVVVVVVV0N011\n110V0V111111111V0V011\n000N0V100000001V0N000\n000V0V10F000F01V0V000\n000N0V13bbbbb31V0N002\n00=V0V02=0@0=20V0V=00\n000V0V020000020V0V000\n000VVV5200L0025VVV000\n000V0V020000020V0V000\n00=V0V02=0@0=20V0V=00\n000N0V0X22222X0V0N000\n000V0V000000000V0V000\n000N0V000000000V0N000\n110V0V000000000V0V011\n110N0VVVVVVVVVVV0N011\n110V000000V000000V011\n111t1110=0u0=0111t111\n111111111111111111111\n","POI":[],"Keyring":[],"Jail":[{"x":10,"y":10,"type":"furniture","radius":1}],"Tiles":{"8,8":{"Type":"Charger","Priority":true},"12,8":{"Type":"Charger","Priority":true},"8,19":{"Type":"Charger","Priority":true},"12,19":{"Type":"Charger","Priority":true},"12,1":{"Type":"Charger","Priority":true},"2,12":{"Type":"Charger","Priority":true},"2,8":{"Type":"Charger","Priority":true},"18,8":{"Type":"Charger","Priority":true},"18,12":{"Type":"Charger","Priority":true},"8,12":{"Type":"Charger","Priority":true},"8,1":{"Type":"Charger","Priority":true},"12,12":{"Type":"Charger","Priority":true},"3,19":{"Type":"DollTerminal"},"17,19":{"Type":"DollTerminal"},"17,1":{"Type":"DollTerminal"},"3,1":{"Type":"DollTerminal"},"10,19":{"Type":"DollSupply"},"10,1":{"Type":"DollSupply"},"10,18":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"10,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"10,3":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"wireType":"Conveyor_Switch","SwitchMode":"Switch"},"10,17":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"wireType":"Conveyor_Switch","SwitchMode":"Switch"},"11,17":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"12,17":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"13,17":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"9,17":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"8,17":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"7,17":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"9,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"8,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"7,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"11,3":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"12,3":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"13,3":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"15,3":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"14,3":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"5,3":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"6,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"14,17":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"6,17":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"15,17":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,17":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,5":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,7":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"5,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"5,5":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"5,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"5,7":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"5,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"5,9":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,9":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,16":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,15":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,14":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,13":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,12":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,11":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,15":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,14":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,16":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,13":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,12":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,11":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,10":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"15,10":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"16,10":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"17,9":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"17,6":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"17,7":{"Type":"BondageMachine","Binding":"Metal"},"17,8":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"17,5":{"Type":"BondageMachine","Binding":"Metal"},"17,3":{"Type":"BondageMachine","Binding":"Metal"},"17,2":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"17,11":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,13":{"Type":"BondageMachine","Binding":"Latex"},"17,14":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,15":{"Type":"BondageMachine","Binding":"Latex"},"17,16":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,17":{"Type":"BondageMachine","Binding":"Latex"},"17,18":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,10":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1,"wireType":"Conveyor_Switch","SwitchMode":"Switch"},"4,10":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,9":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,8":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,7":{"Type":"BondageMachine","Binding":"Metal"},"3,6":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,5":{"Type":"BondageMachine","Binding":"Tape"},"3,4":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,3":{"Type":"BondageMachine","Binding":"Latex"},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,11":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,12":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,13":{"Type":"BondageMachine","Binding":"Tape"},"3,14":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,15":{"Type":"BondageMachine","Binding":"Tape"},"3,16":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,17":{"Type":"BondageMachine","Binding":"Tape"},"3,18":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,10":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"wireType":"Conveyor_Switch","SwitchMode":"Switch"},"17,12":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,4":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"13,7":{"Type":"ForceSpawn","required":["dolldoor"],"Label":"dolldoor","tags":["dolldoor"],"Chance":1,"force":"true"},"7,7":{"Type":"ForceSpawn","required":["dolldoor"],"Label":"dolldoor","tags":["dolldoor"],"Chance":1,"force":"true"},"12,6":{"Type":"Table","Food":"Plate"},"8,6":{"Type":"Table","Food":"Plate"},"10,10":{"Type":"DisplayStand","Furniture":"DisplayStand"},"14,10":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoffR","direction":{"x":1,"y":0}},"6,10":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoffL","direction":{"x":-1,"y":0}}},"effectTiles":{"10,8":{"Wire":{"x":10,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,12":{"Wire":{"x":10,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"13,10":{"Wire":{"x":13,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"14,10":{"Wire":{"x":14,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"15,10":{"Wire":{"x":15,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"17,10":{"Wire":{"x":17,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"16,10":{"Wire":{"x":16,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,17":{"Wire":{"x":10,"y":17,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,16":{"Wire":{"x":10,"y":16,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,15":{"Wire":{"x":10,"y":15,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,14":{"Wire":{"x":10,"y":14,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,13":{"Wire":{"x":10,"y":13,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,10":{"Wire":{"x":8,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,10":{"Wire":{"x":7,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,10":{"Wire":{"x":6,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,10":{"Wire":{"x":5,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,10":{"Wire":{"x":4,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,10":{"Wire":{"x":3,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,7":{"Wire":{"x":10,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,6":{"Wire":{"x":10,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,5":{"Wire":{"x":10,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,4":{"Wire":{"x":10,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,3":{"Wire":{"x":10,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"9,10":{"Wire":{"x":9,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,10":{"Wire":{"x":10,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"12,10":{"Wire":{"x":12,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"11,10":{"Wire":{"x":11,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"9,12":{"Wire":{"x":9,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,12":{"Wire":{"x":8,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,12":{"Wire":{"x":7,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,12":{"Wire":{"x":6,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,12":{"Wire":{"x":5,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,12":{"Wire":{"x":4,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,12":{"Wire":{"x":3,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,12":{"Wire":{"x":2,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,12":{"Wire":{"x":1,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,11":{"Wire":{"x":1,"y":11,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,10":{"Wire":{"x":1,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,9":{"Wire":{"x":1,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,8":{"Wire":{"x":1,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,8":{"Wire":{"x":2,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,8":{"Wire":{"x":3,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,8":{"Wire":{"x":4,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,8":{"Wire":{"x":5,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,8":{"Wire":{"x":6,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,8":{"Wire":{"x":7,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"9,8":{"Wire":{"x":9,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,8":{"Wire":{"x":8,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}}},"Skin":{},"inaccessible":[],"tags":["boss"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Arena_Empty":{"name":"Arena_Empty","w":3,"h":3,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","1,3":"udlr","2,1":"udlr","2,2":"udlr","2,3":"udlr","3,1":"udlr","3,2":"udlr","3,3":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":-1,"grid":"000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]}} -; \ No newline at end of file diff --git a/Game/KinkyDungeonEffectTiles.js b/Game/KinkyDungeonEffectTiles.js deleted file mode 100644 index cdccffe88..000000000 --- a/Game/KinkyDungeonEffectTiles.js +++ /dev/null @@ -1,258 +0,0 @@ -"use strict"; - -let KDLatexDmg = 1; -let KDLatexBind = 2; - -/** - * @type {Record} - */ -let KDEffectTiles = { - "FateBoundGround": { - name: "Ice", - duration: 2, - priority: 10, - tags: ["fate"], - }, - "Ice": { - name: "Ice", - duration: 1, - priority: 1, - tags: ["ice", "slippery"], - }, - "Water": { - name: "Water", - duration: 40, - priority: 1, - tags: ["water", "freezeover", "conductive", "slippery"], - }, - "Cracked": { - name: "Cracked", - duration: 100, - priority: 0, - affinities: ["Edge"], - tags: ["terrain", "ground", "wettable", "freezeover"], - }, - "Slime": { - name: "Slime", - duration: 10, - priority: 2, - affinities: ["Sticky"], - tags: ["slime", "freezeover", "flammable", "conductive"], - }, - "Latex": { - name: "Latex", - duration: 80, - priority: -2, - affinities: ["Latex"], - tags: ["latex", "insulator"], - }, - "Ropes": { - name: "Ropes", - duration: 30, - priority: 5, - tags: ["bind", "rope", "flammable"], - }, - "Fabric": { - name: "Fabric", - duration: 30, - priority: 5, - tags: ["bind", "fabric", "flammable"], - }, - "FabricGreen": { - name: "FabricGreen", - duration: 30, - priority: 5, - brightness: 3.5, - lightColor: 0x55ff55, - tags: ["bind", "fabric"], - }, - "Vines": { - name: "Vines", - duration: 50, - priority: 5, - tags: ["bind", "vine", "flammable"], - }, - "Runes": { - name: "Runes", - duration: 9999, - priority: 10, - tags: ["runesummon", "rune", "hiddenmagic"], - }, - "RunesTrap": { - name: "RunesTrap", - duration: 9999, - priority: 10, - tags: ["magic", "runetrap", "rune", "hiddenmagic"], - }, - "Belts": { - name: "Belts", - duration: 30, - priority: 5, - tags: ["bind", "belt"], - }, - "Chains": { - name: "Chains", - duration: 30, - priority: 5, - tags: ["bind", "chain", "noisy", "conductive"], - }, - "SlimeBurning": { - name: "SlimeBurning", - duration: 5, - priority: 3, - affinities: ["Sticky"], - tags: ["slime", "ignite", "fire", "hot", "conductive"], - }, - "Smoke": { - name: "Smoke", - duration: 2, - priority: 4, - tags: ["smoke", "visionblock", "brightnessblock", "darkarea"], - }, - "Inferno": { - name: "Inferno", - duration: 5, - priority: 5, - brightness: 6, - lightColor: 0xff8933, - tags: ["fire", "ignite", "smoke", "visionblock"], - }, - "Ember": { - name: "Ember", - duration: 1, - priority: 3, - brightness: 3.5, - lightColor: 0xb83716, - tags: ["ignite", "smoke", "visionblock"], - }, - "Sparks": { - name: "Sparks", - duration: 4, - priority: 7, - brightness: 6, - lightColor: 0xaaaaff, - tags: ["ignite", "electric"], - }, - "WireSparks": { - name: "WireSparks", - duration: 4, - priority: 51, - brightness: 3, - lightColor: 0xff5555, - tags: ["signal"], - }, - "WireSparksAct": { - name: "WireSparks", - duration: 1, - priority: 1, - tags: ["signalFrame"], - }, - "Wire": { - name: "Wire", - duration: 9999, - priority: 50, - tags: ["hiddenmagic", "wire"], - }, - "PressurePlate": { - name: "PressurePlate", - duration: 9999, - priority: 50, - tags: ["wire"], - }, - "PressurePlateOneUse": { - name: "PressurePlateOneUse", - duration: 9999, - priority: 50, - tags: ["wire"], - }, - "PressurePlateActive": { - name: "PressurePlateActive", - duration: 2, - priority: 51, - tags: ["ppactive"], - }, - "PressurePlateHold": { - name: "PressurePlateHold", - duration: 9999, - priority: 50, - tags: ["wire"], - }, - "Ignition": { - name: "Ignition", - duration: 1, - priority: 0, - brightness: 1.5, - lightColor: 0xff8933, - tags: ["ignite", "hot"], - }, - "Torch": { - name: "Torch", - duration: 9999, - priority: 5, - brightness: 6, - lightColor: 0xff8933, - yoffset: -1, - tags: ["hot"], - }, - "TorchUnlit": { - name: "TorchUnlit", - duration: 9999, - priority: 5, - yoffset: -1, - tags: [], - }, - "Lantern": { - name: "Lantern", - duration: 9999, - priority: 5, - brightness: 6.5, - lightColor: 0xffee83, - affinitiesStanding: ["Hook", "Edge"], - yoffset: -1, - tags: ["hot"], - }, - "LanternUnlit": { - name: "LanternUnlit", - duration: 9999, - priority: 5, - affinitiesStanding: ["Hook", "Edge"], - yoffset: -1, - tags: [], - }, - "TorchOrb": { - name: "TorchOrb", - duration: 9999, - priority: 5, - brightness: 6, - lightColor: 0x99aaff, - affinitiesStanding: ["Hook", "Edge"], - yoffset: -1, - tags: [], - }, - "IllusOrb": { - name: "IllusOrb", - duration: 9999, - priority: 5, - brightness: 4, - lightColor: 0xffffff, - affinitiesStanding: ["Hook", "Edge"], - yoffset: -1, - tags: [], - }, - "IllusOrbDead": { - name: "IllusOrbDead", - duration: 9999, - priority: 5, - brightness: 2, - lightColor: 0x6700ff, - affinitiesStanding: ["Hook", "Edge"], - yoffset: -1, - tags: [], - }, - "Steam": { - name: "Steam", - duration: 6, - priority: 2, - tags: ["steam", "hot", "visionblock"], - }, -}; \ No newline at end of file diff --git a/Game/KinkyDungeonEnemies.js b/Game/KinkyDungeonEnemies.js deleted file mode 100644 index bc934bc63..000000000 --- a/Game/KinkyDungeonEnemies.js +++ /dev/null @@ -1,4974 +0,0 @@ -"use strict"; - -let KDEnemiesCache = new Map(); - -let KinkyDungeonSummonCount = 2; -let KinkyDungeonEnemyAlertRadius = 2; -let KDStealthyMult = 0.75; -let KDConspicuousMult = 1.5; - -let commentChance = 0.03; -let actionDialogueChance = 0.1; -let actionDialogueChanceIntense = 0.4; - - - -/** - * Refreshes the enemies map - */ -function KinkyDungeonRefreshEnemiesCache() { - KDEnemiesCache = new Map(); - for (let enemy of KinkyDungeonEnemies) { - KDEnemiesCache.set(enemy.name, enemy); - } -} - - -/** - * - * @param {string} Name - * @returns {enemy} - */ -function KinkyDungeonGetEnemyByName(Name) { - if (KDEnemiesCache.size > 0) { - return KDEnemiesCache.get(Name); - } else { - KinkyDungeonRefreshEnemiesCache(); - return KDEnemiesCache.get(Name); - } -} - -/** - * - * @param {number} x - * @param {number} y - * @param {string[]} [filter] - * @param {boolean} [any] - * @param {boolean} [qualified] - Exclude jails where the player doesnt meet conditions - * @returns {KDJailPoint} - */ -function KinkyDungeonNearestJailPoint(x, y, filter, any, qualified) { - let filt = filter ? filter : ["jail", "dropoff"]; - let dist = 100000; - let point = null; - let leash = KinkyDungeonGetRestraintItem("ItemNeckRestraints"); - let furniture = KinkyDungeonGetRestraintItem("ItemDevices"); - for (let p of KDGameData.JailPoints) { - if (!any && p.type && !filt.includes(p.type)) continue; - if (qualified && p.requireLeash && !leash) continue; - if (qualified && p.requireFurniture && !furniture) continue; - let d = Math.max(Math.abs(x - p.x), Math.abs(y - p.y)); - if (d < dist) { - dist = d; - point = p; - } - } - - return point; -} - -function KDLockNearbyJailDoors(x, y) { - let jail = KinkyDungeonNearestJailPoint(x, y); - if (jail) { - let radius = jail.radius + 1; - if (radius) - for (let X = x - Math.ceil(radius); X <= x + Math.ceil(radius); X++) - for (let Y = y - Math.ceil(radius); Y <= y + Math.ceil(radius); Y++) - if (KinkyDungeonTilesGet(X + ',' + Y)?.Jail && KinkyDungeonMapGet(X, Y) == 'd') { - KinkyDungeonMapSet(X, Y, 'D'); - KinkyDungeonTilesGet(X + ',' + Y).Lock = "Red"; - } - } -} - -/** - * - * @param {string[]} [filter] - * @param {{x: number, y: number, type: string, radius: number}[]} [exclude] - * @returns {{x: number, y: number, type: string, radius: number}} - */ -function KinkyDungeonRandomJailPoint(filter, exclude) { - let filt = filter ? filter : ["jail"]; - let points = []; - for (let p of KDGameData.JailPoints) { - if (p.type && !filt.includes(p.type)) continue; - if (!exclude || exclude.includes(p)) continue; - points.push(p); - } - if (points.length > 0) return points[Math.floor(KDRandom() * points.length)]; - return null; -} - -function KinkyDungeonNearestPatrolPoint(x, y) { - let dist = 100000; - let point = -1; - for (let p of KinkyDungeonPatrolPoints) { - let d = Math.max(Math.abs(x - p.x), Math.abs(y - p.y)); - if (d < dist) { - dist = d; - point = KinkyDungeonPatrolPoints.indexOf(p); - } - } - - return point; -} - -/** @type {Map} */ -let KinkyDungeonFlags = new Map(); - -/** - * - * @param {string} Flag - * @param {number} Duration - In turns - * @param {number} [Floors] - Optional, makes this flag expire in this many floors - */ -function KinkyDungeonSetFlag(Flag, Duration, Floors) { - if (!KinkyDungeonFlags.get(Flag) || Duration <= 0 || (KinkyDungeonFlags.get(Flag) > 0 && KinkyDungeonFlags.get(Flag) < Duration)) { - KinkyDungeonFlags.set(Flag, Duration); - if (Duration == 0) { - KinkyDungeonFlags.delete(Flag); - } else if (Floors != undefined) { - if (!KDGameData.TempFlagFloorTicks) - KDGameData.TempFlagFloorTicks = {}; - // handle optional floor count flag setting logic - if (!KDGameData.TempFlagFloorTicks[Flag] || KDGameData.TempFlagFloorTicks[Flag] < Floors) { - KDGameData.TempFlagFloorTicks[Flag] = Floors; - } - if (Floors === 0) { - delete KDGameData.TempFlagFloorTicks[Flag]; - } - } - } -} - -function KinkyDungeonUpdateFlags(delta) { - for (let f of KinkyDungeonFlags.keys()) { - if (KinkyDungeonFlags.get(f) != -1) { - if (KinkyDungeonFlags.get(f) > 0) KinkyDungeonFlags.set(f, KinkyDungeonFlags.get(f) - delta); - if (KinkyDungeonFlags.get(f) <= 0 && KinkyDungeonFlags.get(f) != -1) KinkyDungeonFlags.delete(f); - } - } -} - -function KinkyDungeonGetPatrolPoint(index, radius, Tiles) { - let p = KinkyDungeonPatrolPoints[index]; - let t = Tiles ? Tiles : KinkyDungeonMovableTilesEnemy; - if (p) { - for (let i = 0; i < 8; i++) { - let XX = p.x + Math.round(KDRandom() * 2 * radius - radius); - let YY = p.y + Math.round(KDRandom() * 2 * radius - radius); - if (t.includes(KinkyDungeonMapGet(XX, YY))) { - return {x: XX, y: YY}; - } - } - } - return p; -} - -function KDHelpless(enemy) { - return enemy && !enemy.player && (enemy.hp <= enemy.Enemy.maxhp * 0.1 || enemy.hp <= 0.52 || enemy.boundLevel > 10 * enemy.Enemy.maxhp) && KDBoundEffects(enemy) > 3; -} - -function KinkyDungeonNearestPlayer(enemy, requireVision, decoy, visionRadius, AI_Data) { - if (enemy && enemy.Enemy && !visionRadius) { - visionRadius = enemy.Enemy.visionRadius; - if (enemy.blind && !enemy.aware) visionRadius = 1.5; - } - if (decoy) { - let pdist = Math.sqrt((KinkyDungeonPlayerEntity.x - enemy.x)*(KinkyDungeonPlayerEntity.x - enemy.x) - + (KinkyDungeonPlayerEntity.y - enemy.y)*(KinkyDungeonPlayerEntity.y - enemy.y)); - let nearestVisible = undefined; - - if (enemy.Enemy.focusPlayer && KinkyDungeonCheckLOS(enemy, KinkyDungeonPlayerEntity, pdist, visionRadius, false, false) && !KinkyDungeonCheckPath(enemy.x, enemy.y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, false, true)) return KinkyDungeonPlayerEntity; - - let nearestDistance = (AI_Data && AI_Data.hostile) ? pdist - 0.1 : 100000; - - if ((enemy.Enemy.visionRadius || enemy.Enemy.blindSight) && !(enemy.Enemy.noAttack && !enemy.Enemy.spells)) - for (let e of KinkyDungeonEntities) { - if (e == enemy) continue; - if (KDHelpless(e)) continue; - if (KDGetFaction(e) == "Natural") continue; - if (enemy.Enemy.noTargetSilenced && e.silence > 0) continue; - if ((e.Enemy && !e.Enemy.noAttack && KDHostile(enemy, e))) { - let dist = Math.sqrt((e.x - enemy.x)*(e.x - enemy.x) - + (e.y - enemy.y)*(e.y - enemy.y)); - let pdist_enemy = - (KDGetFaction(enemy) == "Player" - && !KDEnemyHasFlag(enemy, "NoFollow") - && !KDEnemyHasFlag(enemy, "StayHere") - && (enemy.Enemy.allied || (!KDGameData.PrisonerState || KDGameData.PrisonerState == "chase"))) - ? KDistChebyshev(e.x - KinkyDungeonPlayerEntity.x, e.y - KinkyDungeonPlayerEntity.y) : - -1; - if (pdist_enemy > 0 && pdist_enemy < 1.5 && AI_Data.hostile) KinkyDungeonSetFlag("AIHelpPlayer", 4); - if (pdist_enemy > 0 && KinkyDungeonFlags.get("AIHelpPlayer") && dist > 2.5) { - if (pdist_enemy > 2.5) dist += 2; - else dist = Math.max(1.01 + dist/4, dist/3); - } - if (dist <= nearestDistance && (pdist_enemy <= 0 || - ((KinkyDungeonVisionGet(e.x, e.y) > 0 || pdist_enemy < 5) && (pdist_enemy < 8 || enemy.Enemy.followRange > 1)) - )) { - if (KinkyDungeonCheckLOS(enemy, e, dist, visionRadius, true, true) - && (KinkyDungeonVisionGet(e.x, e.y) > 0 || KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 || e.aware || enemy.aware)) { - if (enemy.rage || !e.Enemy.lowpriority - || (!KinkyDungeonCheckLOS(enemy, KinkyDungeonPlayerEntity, pdist, visionRadius, true, true) || !KinkyDungeonCheckPath(enemy.x, enemy.y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, false, true))) { - nearestVisible = e; - nearestDistance = dist; - } - } - } - } - } - - if (nearestVisible) return nearestVisible; - } - return KinkyDungeonPlayerEntity; -} - -function KinkyDungeonInDanger() { - for (let b of KinkyDungeonBullets) { - let bdist = 1.5; - if (b.vx && b.vy) bdist = 2*Math.sqrt(b.vx*b.vx + b.vy*b.vy); - if (KinkyDungeonVisionGet(Math.round(b.x), Math.round(b.y)) > 0 && Math.max(Math.abs(b.x - KinkyDungeonPlayerEntity.x), Math.abs(b.y - KinkyDungeonPlayerEntity.y)) < bdist) { - return true; - } - } - for (let enemy of KinkyDungeonEntities) { - let playerDist = Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y)); - if (KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) { - if (((enemy.revealed && !enemy.Enemy.noReveal) || !enemy.Enemy.stealth || KinkyDungeonSeeAll || playerDist <= enemy.Enemy.stealth + 0.1) && !(KinkyDungeonGetBuffedStat(enemy.buffs, "Sneak") > 0 && playerDist > 1.5)) { - if (((!KDHelpless(enemy) && KinkyDungeonAggressive(enemy)) || playerDist < 1.5)) { - if ((KDHostile(enemy) || enemy.rage) && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && - (!KDAmbushAI(enemy) || enemy.ambushtrigger)) { - return true; - } - if ((KDHostile(enemy) || enemy.rage) && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && - (!KDAmbushAI(enemy) || enemy.ambushtrigger)) { - return true; - } - } - } - } - } - - return false; -} - -function KDAmbushAI(enemy) { - let AI = enemy.AI ? enemy.AI : enemy.Enemy.AI; - let AIType = KDAIType[AI]; - if (AIType) return AIType.ambush; - return false; -} - -let KinkyDungeonFastMoveSuppress = false; -let KinkyDungeonFastStruggleSuppress = false; -function KinkyDungeonDrawEnemies(canvasOffsetX, canvasOffsetY, CamX, CamY) { - let reenabled = false; - let reenabled2 = false; - if (KinkyDungeonFastMoveSuppress) { //&& !CommonIsMobile - KinkyDungeonFastMove = true; - KinkyDungeonFastMovePath = []; - KinkyDungeonFastMoveSuppress = false; - reenabled = true; - } - if (KinkyDungeonFastStruggleSuppress) { - KinkyDungeonFastStruggle = true; - KinkyDungeonFastStruggleType = ""; - KinkyDungeonFastStruggleGroup = ""; - KinkyDungeonFastStruggleSuppress = false; - reenabled2 = true; - } - for (let b of KinkyDungeonBullets) { - let bdist = 1.5; - if (b.vx && b.vy) bdist = 2*Math.sqrt(b.vx*b.vx + b.vy*b.vy); - if (KinkyDungeonVisionGet(Math.round(b.x), Math.round(b.y)) > 0 && Math.max(Math.abs(b.x - KinkyDungeonPlayerEntity.x), Math.abs(b.y - KinkyDungeonPlayerEntity.y)) < bdist) { - if (KinkyDungeonFastStruggle) { - if (KinkyDungeonFastStruggle && !KinkyDungeonFastStruggleSuppress && !reenabled2) - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - KinkyDungeonFastStruggle = false; - KinkyDungeonFastStruggleGroup = ""; - KinkyDungeonFastStruggleType = ""; - reenabled2 = false; - //if (!CommonIsMobile) - KinkyDungeonFastStruggleSuppress = true; - } - if (KinkyDungeonFastMove) { - if (KinkyDungeonFastMove && !KinkyDungeonFastMoveSuppress && !reenabled) - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - KinkyDungeonFastMove = false; - KinkyDungeonFastMovePath = []; - reenabled = false; - //if (!CommonIsMobile) - KinkyDungeonFastMoveSuppress = true; - } - } - } - - for (let enemy of KinkyDungeonEntities) { - let sprite = enemy.Enemy.name; - KinkyDungeonUpdateVisualPosition(enemy, KinkyDungeonDrawDelta); - let tx = enemy.visual_x; - let ty = enemy.visual_y; - let playerDist = KDistChebyshev((enemy.x - KinkyDungeonPlayerEntity.x), (enemy.y - KinkyDungeonPlayerEntity.y)); - if (enemy.x >= CamX && enemy.y >= CamY && enemy.x < CamX + KinkyDungeonGridWidthDisplay && enemy.y < CamY + KinkyDungeonGridHeightDisplay - && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && KDCanSeeEnemy(enemy, playerDist)) { - if (((enemy.revealed && !enemy.Enemy.noReveal) || !enemy.Enemy.stealth || KDHelpless(enemy) || KinkyDungeonSeeAll || playerDist <= enemy.Enemy.stealth + 0.1) && !(KinkyDungeonGetBuffedStat(enemy.buffs, "Sneak", true) > 0 && playerDist > 1.5)) { - enemy.revealed = true; - if (((KinkyDungeonAggressive(enemy) && playerDist <= 6.9) || (playerDist < 1.5 && enemy.playWithPlayer))) { - if ((KDHostile(enemy) || enemy.rage) && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && KinkyDungeonFastMove && - !enemy.Enemy.tags.harmless && - (!KDAmbushAI(enemy) || enemy.ambushtrigger)) { - if (KinkyDungeonFastMove && !KinkyDungeonFastMoveSuppress && !reenabled) - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - KinkyDungeonFastMove = false; - KinkyDungeonFastMovePath = []; - reenabled = false; - if (!CommonIsMobile) - KinkyDungeonFastMoveSuppress = true; - } - if ((KDHostile(enemy) || enemy.rage) && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && KinkyDungeonFastStruggle && - !enemy.Enemy.tags.harmless && - (!KDAmbushAI(enemy) || enemy.ambushtrigger)) { - if (KinkyDungeonFastStruggle && !KinkyDungeonFastStruggleSuppress && !reenabled2) - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - KinkyDungeonFastStruggle = false; - KinkyDungeonFastStruggleGroup = ""; - KinkyDungeonFastStruggleType = ""; - reenabled2 = false; - if (!CommonIsMobile) - KinkyDungeonFastStruggleSuppress = true; - } - } - if (enemy.buffs) { - let aura_scale = 0; - let aura_scale_max = 0; - for (let b of Object.values(enemy.buffs)) { - if (b && b.aura && b.duration > 0) { - aura_scale_max += 1; - } - } - if (aura_scale_max > 0) { - let buffs = Object.values(enemy.buffs); - buffs = buffs.sort((a, b) => {return b.duration - a.duration;}); - for (let b of buffs) { - if (b && b.aura && b.duration > 0 && (!b.hideHelpless || !KDHelpless(enemy))) { - aura_scale += 1/aura_scale_max; - let s = aura_scale; - if (b.noAuraColor) { - KDDraw(kdgameboard, kdpixisprites, enemy.id + "," + b.id, KinkyDungeonRootDirectory + "Aura/" + (b.aurasprite ? b.aurasprite : "Aura") + ".png", - (tx - CamX)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s + KinkyDungeonGridSizeDisplay * (1 + s) * 0.167, - (ty - CamY)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s + KinkyDungeonGridSizeDisplay * (1 + s) * 0.167, - KinkyDungeonSpriteSize * (1 + s) * 0.67, - KinkyDungeonSpriteSize * (1 + s) * 0.67, undefined, { - zIndex: 2, - }); - } else { - KDDraw(kdgameboard, kdpixisprites, enemy.id + "," + b.id, KinkyDungeonRootDirectory + "Aura/" + (b.aurasprite ? b.aurasprite : "Aura") + ".png", - (tx - CamX)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s + KinkyDungeonGridSizeDisplay * (1 + s) * 0.167, - (ty - CamY)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s + KinkyDungeonGridSizeDisplay * (1 + s) * 0.167, - KinkyDungeonSpriteSize * (1 + s) * 0.67, - KinkyDungeonSpriteSize * (1 + s) * 0.67, - undefined, { - tint: string2hex(b.aura), - zIndex: 2, - }); - } - - } - } - } - } - - let buffSprite = ""; - let buffSpritePower = 0; - if (enemy.buffs) { - for (let b of Object.values(enemy.buffs)) { - if (b.replaceSprite && b.power > buffSpritePower) { - buffSpritePower = b.power; - buffSprite = b.replaceSprite; - } - } - } - - if (buffSprite) sprite = buffSprite; - - if (!enemy.Enemy.bound || (KDBoundEffects(enemy) < 4 && !KDHelpless(enemy))) { - let sp = sprite; - if (enemy.CustomSprite && !buffSprite) sp = "CustomSprite/" + enemy.CustomSprite; - KDDraw(kdgameboard, kdpixisprites, "spr_" + enemy.id, KinkyDungeonRootDirectory + "Enemies/" + sp + ".png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } else { - let sp = buffSprite || enemy.Enemy.bound; - let dir = "EnemiesBound/"; - if (enemy.CustomSprite && !buffSprite) { - dir = "Enemies/"; - sp = "CustomSpriteBound/" + enemy.CustomSprite; - } - KDDraw(kdgameboard, kdpixisprites, "spr_" + enemy.id, KinkyDungeonRootDirectory + dir + sp + ".png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - } - } - } - if (reenabled && KinkyDungeonFastMove) { - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - } else if (reenabled2 && KinkyDungeonFastStruggle) { - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - } -} - -/** - * - * @param {entity} enemy - * @param {string} flag - * @returns {boolean} - */ -function KDEnemyHasFlag(enemy, flag) { - return (enemy.flags && (enemy.flags[flag] > 0 || enemy.flags[flag] == -1)); -} - -function KinkyDungeonDrawEnemiesStatus(canvasOffsetX, canvasOffsetY, CamX, CamY) { - for (let enemy of KinkyDungeonEntities) { - let tx = enemy.visual_x; - let ty = enemy.visual_y; - let helpless = KDHelpless(enemy); - let playerDist = Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y)); - if (enemy.x >= CamX && enemy.y >= CamY && enemy.x < CamX + KinkyDungeonGridWidthDisplay && enemy.y < CamY + KinkyDungeonGridHeightDisplay - && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && KDCanSeeEnemy(enemy, playerDist)) { - let bindLevel = KDBoundEffects(enemy); - if (((enemy.revealed && !enemy.Enemy.noReveal) || !enemy.Enemy.stealth || KDHelpless(enemy) || KinkyDungeonSeeAll || playerDist <= enemy.Enemy.stealth + 0.1) && !(KinkyDungeonGetBuffedStat(enemy.buffs, "Sneak", true) > 0)) { - if (enemy.stun > 0) { - KDDraw(kdgameboard, kdpixisprites, "stun" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Stun.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - if (KDToggles.ShowNPCStatuses || MouseIn((tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay)) { - if (enemy.silence > 1 && !helpless) { - KDDraw(kdgameboard, kdpixisprites, "sil" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Silence.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - if (enemy.blind > 1 && !helpless) { - KDDraw(kdgameboard, kdpixisprites, "bli" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Blind.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - if (enemy.disarm > 1 && !helpless) { - KDDraw(kdgameboard, kdpixisprites, "dis" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Disarm.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - if (enemy.bind > 1 && bindLevel < 4) { - KDDraw(kdgameboard, kdpixisprites, "bind" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Bind.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.11, - }); - } - if ((enemy.slow > 1 || KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed", true) < 0) && bindLevel < 4) { - KDDraw(kdgameboard, kdpixisprites, "spd" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Slow.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - if (KinkyDungeonGetBuffedStat(enemy.buffs, "AttackDmg", true) > 0) { - KDDraw(kdgameboard, kdpixisprites, "atkb" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Buff.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - if (KinkyDungeonGetBuffedStat(enemy.buffs, "AttackDmg", true) < 0 && bindLevel < 4) { - KDDraw(kdgameboard, kdpixisprites, "atkdb" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Debuff.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - if (KinkyDungeonGetBuffedStat(enemy.buffs, "Armor") < 0 && enemy.Enemy.armor > 0) { - KDDraw(kdgameboard, kdpixisprites, "armd" + enemy.id, KinkyDungeonRootDirectory + "Conditions/ArmorDebuff.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } else if (KinkyDungeonGetBuffedStat(enemy.buffs, "Armor") > 0) { - KDDraw(kdgameboard, kdpixisprites, "arm" + enemy.id, KinkyDungeonRootDirectory + "Conditions/ArmorBuff.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - if (KinkyDungeonGetBuffedStat(enemy.buffs, "SpellResist") < 0 && enemy.Enemy.spellResist > 0) { - KDDraw(kdgameboard, kdpixisprites, "spresd" + enemy.id, KinkyDungeonRootDirectory + "Conditions/ShieldDebuff.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } else if (KinkyDungeonGetBuffedStat(enemy.buffs, "SpellResist") > 0) { - KDDraw(kdgameboard, kdpixisprites, "spres" + enemy.id, KinkyDungeonRootDirectory + "Conditions/ShieldBuff.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - if (KinkyDungeonGetBuffedStat(enemy.buffs, "Evasion") > 0) { - KDDraw(kdgameboard, kdpixisprites, "evab" + enemy.id, KinkyDungeonRootDirectory + "Conditions/EvasionBuff.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - if (KinkyDungeonGetBuffedStat(enemy.buffs, "DamageReduction") > 0) { - KDDraw(kdgameboard, kdpixisprites, "shield" + enemy.id, KinkyDungeonRootDirectory + "Conditions/ShieldBuff.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - if (KinkyDungeonGetBuffedStat(enemy.buffs, "DamageAmp", true) > 0) { - KDDraw(kdgameboard, kdpixisprites, "amp" + enemy.id, KinkyDungeonRootDirectory + "Conditions/DamageAmp.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - } - - if (enemy.freeze > 0) { - KDDraw(kdgameboard, kdpixisprites, "frz" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Freeze.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { - zIndex: 2.1, - }); - } - } - } - } -} - -function KinkyDungeonDrawEnemiesWarning(canvasOffsetX, canvasOffsetY, CamX, CamY) { - for (let enemy of KinkyDungeonEntities) { - if (enemy.warningTiles) { - for (let t of enemy.warningTiles) { - let tx = enemy.x + t.x; - let ty = enemy.y + t.y; - if (!KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(tx, ty)) && KinkyDungeonNoEnemy(tx, ty, true)) continue; - let special = enemy.usingSpecial ? "Special" : ""; - let attackMult = KinkyDungeonGetBuffedStat(enemy.buffs, "AttackSlow", true); - let attackPoints = enemy.attackPoints - attackMult + 1.1; - let preHit = false; - if (((enemy.usingSpecial && enemy.Enemy.specialAttackPoints) ? enemy.Enemy.specialAttackPoints : enemy.Enemy.attackPoints) > attackPoints) { - special = special + "Basic"; - preHit = true; - } - // && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(tx, ty)) - if (tx >= CamX && ty >= CamY && tx < CamX + KinkyDungeonGridWidthDisplay && ty < CamY + KinkyDungeonGridHeightDisplay && !(tx == enemy.x && ty == enemy.y)) { - let color = enemy.Enemy.color ? string2hex(enemy.Enemy.color) : 0xff5555; - - KDDraw(kdgameboard, kdpixisprites, tx + "," + ty + "_w" + enemy.id, KinkyDungeonRootDirectory + ((KDAllied(enemy)) ? "WarningAlly" : "WarningColor" + special) + ".png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { - tint: color, - zIndex: 2.22 + 0.001 * (enemy.Enemy.power ? enemy.Enemy.power : 0), - }); - KDDraw(kdgameboard, kdpixisprites, tx + "," + ty + "_w_b" + enemy.id, KinkyDungeonRootDirectory + "WarningBacking" + ".png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { - tint: color, - zIndex: 0.2 + 0.001 * (enemy.Enemy.power ? enemy.Enemy.power : 0), - alpha: preHit ? 0.5 : 0.8, - }); - KDDraw(kdgameboard, kdpixisprites, tx + "," + ty + "_w_h" + enemy.id, KinkyDungeonRootDirectory + ((KDAllied(enemy)) ? "WarningHighlightAlly" : "WarningHighlight" + special) + ".png", - (tx - CamX)*KinkyDungeonGridSizeDisplay - 1, (ty - CamY)*KinkyDungeonGridSizeDisplay - 1, - KinkyDungeonSpriteSize + 2, KinkyDungeonSpriteSize + 2, undefined, { - zIndex: 3.21, - alpha: 0.2, - }); - } - } - } - let mp = enemy.Enemy.movePoints + KDBoundEffects(enemy) * 0.5; - let ms = KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed") ? KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed")) : 1; - if (enemy.fx && enemy.fy && enemy.movePoints >= mp - ms - 0.0001) { - let tx = enemy.fx; - let ty = enemy.fy; - if (tx >= CamX && ty >= CamY && tx < CamX + KinkyDungeonGridWidthDisplay && ty < CamY + KinkyDungeonGridHeightDisplay - && KDCanSeeEnemy(enemy, Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y))) - && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) { - let color = enemy.Enemy.color ? string2hex(enemy.Enemy.color) : 0xff5555; - KDDraw(kdgameboard, kdpixisprites, tx + "," + ty + "_w_m" + enemy.id, KinkyDungeonRootDirectory + ("WarningMove") + ".png", - (tx - CamX + 0.5)*KinkyDungeonGridSizeDisplay - 1, (ty - CamY + 0.5)*KinkyDungeonGridSizeDisplay - 1, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, Math.atan2(ty - enemy.y, tx - enemy.x) || 0, { - tint: color, - zIndex: -0.05, - }, true); - } - } - if (enemy.Enemy.spells && (enemy.Enemy.spellRdy && (!KDAmbushAI(enemy) || enemy.ambushtrigger)) && !(enemy.castCooldown > 1) && (!(enemy.silence > 0) && !(enemy.stun > 0) && !(enemy.freeze > 0) && !KDHelpless(enemy))) { - let tx = enemy.visual_x; - let ty = enemy.visual_y; - // && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(tx, ty)) - if (tx >= CamX && ty >= CamY && tx < CamX + KinkyDungeonGridWidthDisplay && ty < CamY + KinkyDungeonGridHeightDisplay - && KDCanSeeEnemy(enemy, Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y))) - && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) { - KDDraw(kdgameboard, kdpixisprites, enemy.id + "_sr", KinkyDungeonRootDirectory + "SpellReady.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, enemy.Enemy.color ? { - tint: string2hex(enemy.Enemy.color), - zIndex: -0.1, - } : undefined); - } - } - if (enemy.weakBinding) { // || enemy.specialBinding - let tx = enemy.visual_x; - let ty = enemy.visual_y; - let binder = KinkyDungeonFindID(enemy.boundTo); - // && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(tx, ty)) - if (binder && tx >= CamX && ty >= CamY && tx < CamX + KinkyDungeonGridWidthDisplay && ty < CamY + KinkyDungeonGridHeightDisplay - && KDCanSeeEnemy(enemy, Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y))) - && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) { - KDDraw(kdgameboard, kdpixisprites, enemy.id + "_sr", KinkyDungeonRootDirectory + "WeakBinding.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, binder.Enemy.color ? { - tint: string2hex(binder.Enemy.color), - zIndex: -0.1, - } : undefined); - } - } - } -} - -function KinkyDungeonBar(x, y, w, h, value, foreground = "#66FF66", background = "#ff0000", orig = undefined, origColor = "#ff4444", notches = undefined, notchcolor = "#ffffff", notchbg = "#ffffff", zIndex = 55) { - if (value < 0) value = 0; - if (value > 100) value = 100; - let id = x + "," + y + "," + w + "," + h + foreground; - if (background != "none") - FillRectKD(kdcanvas, kdpixisprites, id + '1', { - Left: x + 1, - Top: y + 1, - Width: w - 2, - Height: h - 2, - Color: "#000000", - LineWidth: 1, - zIndex: zIndex+value*0.0001, - }); - FillRectKD(kdcanvas, kdpixisprites, id + '2', { - Left: x + 2, - Top: y + 2, - Width: Math.floor((w - 4) * value / 100), - Height: h - 4, - Color: foreground, - LineWidth: 1, - zIndex: zIndex + .1, - }); - if (background != "none") - FillRectKD(kdcanvas, kdpixisprites, id + '3', { - Left: Math.floor(x + 2 + (w - 4) * value / 100), - Top: y + 2, - Width: Math.floor((w - 4) * (100 - value) / 100), - Height: h - 4, - Color: background, - LineWidth: 1, - zIndex: zIndex + .2, - }); - if (orig != undefined) - FillRectKD(kdcanvas, kdpixisprites, id + '4', { - Left: Math.min( - Math.floor(x + 2 + (w - 4) * orig / 100), - Math.floor(x + 2 + (w - 4) * value / 100) - ), - Top: y + 2, - Width: Math.floor((w - 4) * Math.abs(value - orig) / 100), - Height: h - 4, - Color: origColor, - LineWidth: 1, - zIndex: zIndex + .3, - }); - if (notches) { - for (let n of notches) { - if (n > 0 && n < 1) { - FillRectKD(kdcanvas, kdpixisprites, id + '5' + n, { - Left: x + Math.floor((w - 4) * n) - 1, - Top: y + 2, - Width: 3, - Height: h - h, - Color: notchbg, - LineWidth: 1, - zIndex: zIndex + .4, - }); - FillRectKD(kdcanvas, kdpixisprites, id + '6' + n, { - Left: x + Math.floor((w - 4) * n), - Top: y + 2, - Width: 1, - Height: h - 4, - Color: notchcolor, - LineWidth: 1, - zIndex: zIndex + .5, - }); - } - } - } -} - -/** - * - * @param {entity} enemy - * @param {number} [playerDist] - * @returns {boolean} - */ -function KDCanSeeEnemy(enemy, playerDist) { - if (playerDist == undefined) playerDist = KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y); - return (((enemy.revealed && !enemy.Enemy.noReveal) || !enemy.Enemy.stealth || KDHelpless(enemy) || KinkyDungeonSeeAll || playerDist <= enemy.Enemy.stealth + 0.1) - && !(KinkyDungeonGetBuffedStat(enemy.buffs, "Sneak") > 0 && playerDist > 1.5) - && playerDist <= KDMaxEnemyViewDist(enemy)); -} - -function KDMaxEnemyViewDist(enemy) { - let data = { - blindMult: (KinkyDungeonStatsChoice.get("Blackout") || KinkyDungeonStatsChoice.get("TotalBlackout")) ? 100 : 2, - }; - //KinkyDungeonSendEvent("calcEnemyRad", data); - if (enemy.hp < enemy.Enemy.maxhp || enemy.attackPoints > 0) return KDMaxVisionDist; - if (KinkyDungeonBlindLevel < 2) return KDMaxVisionDist; - else return Math.max(1.5, KDMaxVisionDist - KinkyDungeonBlindLevel * data.blindMult); -} - -/** - * - * @param {entity} enemy - * @returns {number} - */ -function KDGetEnemyStruggleMod(enemy) { - let level = KDBoundEffects(enemy); - let mult = 0.1; - - if (enemy.boundLevel > enemy.Enemy.maxhp * 10) { - mult = 0; - } - if (mult > 0) { - if (enemy.disarm > 0) mult *= 0.5; - if (enemy.silence > 0) mult *= 0.75; - if (enemy.blind > 0) mult *= 0.75; - if (enemy.bind > 0) mult *= 0.5; - else if (enemy.slow > 0) mult *= 0.75; - if (level > 3) mult *= 3; // Struggle faster when bound heavily, because they're using all their energy to try to escape - if (enemy.vulnerable > 0 || enemy.attackPoints > 0) mult *= 0.5; // They're busy - if (enemy.boundLevel > 0) { - mult *= Math.pow(1.5, -enemy.boundLevel / enemy.Enemy.maxhp); // The more you tie, the stricter the bondage gets - } - if (enemy.distraction > 0) mult *= 1 / (1 + 2 * enemy.distraction / enemy.Enemy.maxhp); - } - - if (!KDEnemyHasFlag(enemy, "imprisoned") && enemy.hp > 0.51 && KDNearbyEnemies(enemy.x, enemy.y, 1.5).some((en) => { - return en != enemy && en.Enemy.bound && !KDHelpless(enemy) && KDBoundEffects(en) < 3 && !KDEnemyHasFlag(en, "imprisoned") && !KinkyDungeonIsDisabled(en) && KDFactionRelation(KDGetFaction(enemy), KDGetFaction(en)) >= Math.max(0.1, KDFactionRelation("Player", KDGetFaction(en))); - })) { - mult += 0.15; - } - if (mult > 0) { - if (KinkyDungeonGetBuffedStat(enemy.buffs, "Lockdown")) mult *= KinkyDungeonGetBuffedStat(enemy.buffs, "Lockdown"); - } - - return mult; -} - -/** - * - * @param {entity} enemy - * @param {number} vibe - * @returns {number} - */ -function KDGetEnemyDistractRate(enemy, vibe) { - if (vibe) return -(enemy.Enemy.maxhp**0.5) * (0.1 + 0.05 * vibe); - let level = KDBoundEffects(enemy); - let mult = enemy.distraction/enemy.Enemy.maxhp > 0.9 ? 0.02 : (enemy.distraction/enemy.Enemy.maxhp > 0.5 ? 0.04 : 0.06); - if (KDStrictPersonalities.includes(enemy.personality)) mult = mult * 2; - else if (!KDLoosePersonalities.includes(enemy.personality)) mult = mult * 1.5; - - return mult * enemy.Enemy.maxhp / (1 + level * 0.25); -} - -/** - * - * @param {entity} enemy - * @param {number} vibe - * @returns {number} - */ -function KDGetEnemyDistractionDamage(enemy, vibe) { - if (vibe <= 0) return 0; - let mult = Math.max(0.25, enemy.distraction/enemy.Enemy.maxhp) * 0.05 * vibe; - if (enemy.hp <= 1 || enemy.hp <= enemy.Enemy.maxhp * 0.101) return 0; - return Math.min(Math.max(0.2 * enemy.Enemy.maxhp**0.75, 1), mult * enemy.hp); -} - -let KDMaxBindingBars = 3; - -function KinkyDungeonDrawEnemiesHP(canvasOffsetX, canvasOffsetY, CamX, CamY) { - let tooltip = false; - for (let enemy of KinkyDungeonEntities) { - let playerDist = Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y)); - if (enemy.x >= CamX && enemy.y >= CamY && enemy.x < CamX + KinkyDungeonGridWidthDisplay && enemy.y < CamY + KinkyDungeonGridHeightDisplay - && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) { - let xx = enemy.visual_x ? enemy.visual_x : enemy.x; - let yy = enemy.visual_y ? enemy.visual_y : enemy.y; - let II = 0; - // Draw bars - if ((!enemy.Enemy.stealth || KDHelpless(enemy) || playerDist <= enemy.Enemy.stealth + 0.1) && !(KinkyDungeonGetBuffedStat(enemy.buffs, "Sneak") > 0 && playerDist > 1.5)) { - if ((KDAllied(enemy) || enemy.distraction > 0 || ((enemy.lifetime != undefined || enemy.hp < enemy.Enemy.maxhp || enemy.boundTo || enemy.boundLevel))) && KDCanSeeEnemy(enemy, playerDist)) { - let spacing = 6; - // Draw binding bars - let helpless = KDHelpless(enemy); - if (enemy.boundLevel != undefined && enemy.boundLevel > 0) { - if (!helpless) { - let bindingBars = Math.ceil(enemy.boundLevel / enemy.Enemy.maxhp); - let SM = KDGetEnemyStruggleMod(enemy); - let futureBound = KDPredictStruggle(enemy, SM, 1); - for (let i = 0; i < bindingBars && i < KDMaxBindingBars; i++) { - if (i > 0) II++; - let mod = enemy.boundLevel - futureBound.boundLevel; - // Part that will be struggled out of - KinkyDungeonBar(canvasOffsetX + (xx - CamX + 0.1)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay + 12 - 15 - spacing*II, - KinkyDungeonGridSizeDisplay * 0.8, 7, Math.min(1, (enemy.boundLevel - i * enemy.Enemy.maxhp) / enemy.Enemy.maxhp) * 100, "#ffffff", "#52333f"); - // Separator between part that will be struggled and not - KinkyDungeonBar(1 + canvasOffsetX + (xx - CamX + 0.1)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay + 12 - 15 - spacing*II, - KinkyDungeonGridSizeDisplay * 0.8, 7, Math.min(1, (enemy.boundLevel - mod - i * enemy.Enemy.maxhp) / enemy.Enemy.maxhp) * 100, "#444444", "none"); - - } - II -= Math.max(0, Math.min(bindingBars-1, KDMaxBindingBars-1)); - // Temp value of bondage level, decremented based on special bound level and priority - let bb = 0; - let bcolor = "#ffae70"; - let bondage = []; - if (futureBound.specialBoundLevel) { - for (let b of Object.entries(futureBound.specialBoundLevel)) { - bondage.push({name: b[0], amount: b[1], level: 0, pri: KDSpecialBondage[b[0]].priority}); - } - bondage = bondage.sort((a, b) => { - return b.pri - a.pri; - }); - } else { - bondage.push({name: "Normal", amount: 0, level: futureBound.boundLevel, pri: 0}); - } - - for (let b of bondage) { - if (!b.level) { - b.level = bb + b.amount; - bb = b.level; - } - } - for (let i = 0; i < bindingBars && i < KDMaxBindingBars; i++) { - if (i > 0) II++; - // Determine current bondage type - let bars = false; - for (let bi = bondage.length - 1; bi >= 0; bi--) { - let b = bondage[bi]; - // Filter out anything that doesnt fit currently - if (b.level > i * enemy.Enemy.maxhp) { - bcolor = KDSpecialBondage[b.name] ? KDSpecialBondage[b.name].color : "#ffae70"; - // Struggle bars themselves - KinkyDungeonBar(canvasOffsetX + (xx - CamX + 0.1)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay + 12 - 15 - spacing*II, - KinkyDungeonGridSizeDisplay * 0.8, 7, Math.min(1, (Math.max(0, b.level - i * enemy.Enemy.maxhp)) / enemy.Enemy.maxhp) * 100, bcolor, "none", - undefined, undefined, bars ? [0.25, 0.5, 0.75] : undefined, bars ? "#85522c" : undefined, bars ? "#85522c" : undefined, 57.5 + b.pri*0.01); - bars = true; - } - - } - - } - } else { - // TODO draw a lock or some other icon - } - } - // Draw HP bar - if (!helpless) { - - if (enemy.hp < enemy.Enemy.maxhp || KDAllied(enemy) || enemy.boundTo) { - // Draw hp bar - let fg = enemy.boundTo ? (KDAllied(enemy) ? "#77aaff" : "#dd88ff") : (KDAllied(enemy) ? "#00ff88" : "#ff5555"); - let bg = KDAllied(enemy) ? "#aa0000" : "#000000"; - KinkyDungeonBar(canvasOffsetX + (xx - CamX + (enemy.boundTo? 0.1 : 0.05))*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 15 - II * spacing, - KinkyDungeonGridSizeDisplay * (enemy.boundTo? 0.8 : 0.9), enemy.boundTo? 7 : 9, enemy.hp / enemy.Enemy.maxhp * 100, fg, bg); II++; - } - - if (enemy.distraction > 0) { - // Draw distraction bar - KinkyDungeonBar(canvasOffsetX + (xx - CamX + 0.1)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 15 - II * spacing, - KinkyDungeonGridSizeDisplay * 0.8, 6, enemy.distraction / enemy.Enemy.maxhp * 100, "#fda1ff", "#9300ff"); - KDDraw(kdcanvas, kdpixisprites, enemy.id + "_ar_heart", KinkyDungeonRootDirectory + (enemy.distraction >= 0.9 * enemy.Enemy.maxhp ? "UI/HeartExtreme.png" : "UI/Heart.png"), - -7 + canvasOffsetX + (xx - CamX + enemy.distraction / enemy.Enemy.maxhp * 0.8 + 0.1)*KinkyDungeonGridSizeDisplay, - -4 + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 15 - II * spacing, - 14, 14 , undefined, { - zIndex: 63, - }); - II++; - } - - if (enemy.lifetime != undefined && enemy.maxlifetime > 0 && enemy.maxlifetime < 999 && ((!enemy.Enemy.hidetimerbar && !enemy.hideTimer) || KDAllied(enemy))) { - // Draw lifetime bar - KinkyDungeonBar(canvasOffsetX + (xx - CamX + (enemy.boundTo? 0.1 : 0.05))*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 15 - II * spacing, - KinkyDungeonGridSizeDisplay * (enemy.boundTo? 0.8 : 0.9), 8, enemy.lifetime / enemy.maxlifetime * 100, "#cccccc", "#000000"); II++; - } - } - } - } - - - // Draw status bubbles - if (KDCanSeeEnemy(enemy, playerDist)) { - // Draw thought bubbles - let yboost = II * -20; - if (enemy.Enemy.specialdialogue || enemy.specialdialogue) { - KDDraw(kdcanvas, kdpixisprites, enemy.id + "_th", KinkyDungeonRootDirectory + "Conditions/Dialogue.png", - canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { - zIndex: 23, - }); - } - let bb = false; - if (enemy.Enemy.bound && KDThoughtBubbles.has(enemy.id)) { - let bubble = KDThoughtBubbles.get(enemy.id); - if (bubble.index + bubble.duration >= KinkyDungeonCurrentTick && (enemy.ambushtrigger || !KDAIType[KDGetAI(enemy)]?.ambush)) { - bb = true; - let name = CommonTime() % 1000 < 500 ? "Thought" : bubble.name; - if (name != "Thought" || !((enemy.lifetime != undefined || enemy.hp < enemy.Enemy.maxhp || enemy.boundLevel))) - KDDraw(kdcanvas, kdpixisprites, enemy.id + "_th", KinkyDungeonRootDirectory + `Conditions/Thought/${name}.png`, - canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { - zIndex: 4, - }); - } - } - if (!KDHelpless(enemy)) { - if (!KinkyDungeonAggressive(enemy) && ((!KDAllied(enemy) && !enemy.Enemy.specialdialogue && !bb) || KDEnemyHasFlag(enemy, "Shop")) && !enemy.playWithPlayer && enemy.Enemy.movePoints < 90 && !KDAmbushAI(enemy)) { - KDDraw(kdcanvas, kdpixisprites, enemy.id + "_shop", KinkyDungeonRootDirectory + ((KDEnemyHasFlag(enemy, "Shop")) ? "Conditions/Shop.png" : (KDAllied(enemy) ? "Conditions/Heart.png" : "Conditions/Peace.png")), - canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { - zIndex: 22, - }); - } else if (!bb && enemy.aware && KDHostile(enemy) && enemy.vp > 0 && enemy.Enemy && !enemy.Enemy.noAlert && enemy.Enemy.movePoints < 90 && !KDAmbushAI(enemy)) { - KDDraw(kdcanvas, kdpixisprites, enemy.id + "_aw", KinkyDungeonRootDirectory + "Conditions/Aware.png", - canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { - zIndex: 22, - }); - } else if (!bb && enemy.vp > 0.01 && KDHostile(enemy) && enemy.Enemy && !enemy.Enemy.noAlert && enemy.Enemy.movePoints < 90 && !KDAmbushAI(enemy)) { - let sneakThreshold = enemy.Enemy.sneakThreshold ? enemy.Enemy.sneakThreshold : 2; - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")) sneakThreshold = Math.max(0.1, sneakThreshold + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")); - if (enemy.vp > sneakThreshold/2) - KDDraw(kdcanvas, kdpixisprites, enemy.id + "_vp", KinkyDungeonRootDirectory + "Conditions/vp.png", - canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { - zIndex: 22, - }); - } - if (enemy.vulnerable > 0) - KDDraw(kdcanvas, kdpixisprites, enemy.id + "_vuln", KinkyDungeonRootDirectory + "Conditions/Vulnerable.png", - canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { - zIndex: 22, - }); - } - - if (!tooltip && (((!KDAmbushAI(enemy) || enemy.ambushtrigger) - && (MouseIn(canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay) - || MouseIn(canvasOffsetX + (enemy.x - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (enemy.y - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay)) - || (KDGameData.CurrentDialog && KDGetSpeaker() == enemy)))) { - let faction = KDGetFaction(enemy); - if (faction && (!KinkyDungeonHiddenFactions.includes(faction) || KinkyDungeonTooltipFactions.includes(faction))) { - let tt = TextGet("KinkyDungeonFaction" + faction); - let ttlength = 10; - if (CJKcheck(tt,2)){ - DrawTextFitKD(tt, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, 10 + tt.length * 8, "white", "black"); - yboost += -2*KinkyDungeonGridSizeDisplay/7; - } else { - let ttCJKcheck1 = CJKcheck(tt,1); - let ttCJKcheck2 = CJKcheck(tt); - - if (ttCJKcheck1){ - let i; - for (i in ttCJKcheck1){ttlength += ttCJKcheck1[i].length * 8;} - } - if (ttCJKcheck2){ - let i; - for (i in ttCJKcheck2){ttlength += ttCJKcheck2[i].length * 16;} - } - DrawTextFitKD(tt, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, ttlength, "white", "black"); - yboost += -3*KinkyDungeonGridSizeDisplay/8; - } - } - - let name = TextGet("Name" + enemy.Enemy.name); - let namelength = 10; - if (CJKcheck(name,2)){ - DrawTextFitKD(name, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, 10 + name.length * 8, "white", "black"); - } else { - let nameCJKcheck1 = CJKcheck(name,1); - let nameCJKcheck2 = CJKcheck(name); - - if (nameCJKcheck1){ - let i; - for (i in nameCJKcheck1){namelength += nameCJKcheck1[i].length * 8;} - } - if (nameCJKcheck2){ - let i; - for (i in nameCJKcheck2){namelength += nameCJKcheck2[i].length * 16;} - } - DrawTextFitKD(name, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, namelength, "white", "black"); - } - - if (enemy.CustomName) { - DrawTextKD(enemy.CustomName, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/1.5, enemy.CustomNameColor, "black"); - } - tooltip = true; - } - - if (enemy.dialogue && !tooltip) { - let dialougelenth = 10; - if (CJKcheck(enemy.dialogue,2)){ - DrawTextFitKD(enemy.dialogue, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/1.5, 10 + enemy.dialogue.length * 8, enemy.dialogueColor, "#000000", 18, undefined, 20); - } else { - let dialougeCJKcheck1 = CJKcheck(enemy.dialogue,1); - let dialougeCJKcheck2 = CJKcheck(enemy.dialogue); - - if (dialougeCJKcheck1){ - let i; - for (i in dialougeCJKcheck1){dialougelenth += dialougeCJKcheck1[i].length * 8;} - } - if (dialougeCJKcheck2){ - let i; - for (i in dialougeCJKcheck2){dialougelenth += dialougeCJKcheck2[i].length * 16;} - } - DrawTextFitKD(enemy.dialogue, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/1.5, dialougelenth, enemy.dialogueColor, "#000000", 18, undefined, 20); - } - } - } - } - } -} - -/** - * - * @param {entity} enemy - * @param {number} offset - * @returns {number} - */ -function KDDrawEnemyTooltip(enemy, offset) { - let analyze = KDHasSpell("ApprenticeKnowledge"); - // Previously this was dependent on using a spell called Analyze. Now it is enabled by default if you have Knowledge - let TooltipList = []; - TooltipList.push({ - str: TextGet("Name" + enemy.Enemy.name), - fg: enemy.Enemy.color || "#ff5555", - bg: "#000000", - size: 24, - center: true, - }); - TooltipList.push({ - str: TextGet("KDTooltipHP") + Math.round(enemy.hp*10) + "/" + Math.round(enemy.Enemy.maxhp * 10), - fg: "#ffffff", - bg: "#000000", - size: 20, - center: true, - }); - if (enemy.boundLevel) { - TooltipList.push({ - str: TextGet("KDTooltipBinding") + Math.round(enemy.boundLevel/enemy.Enemy.maxhp*100) + "%", - fg: "#ffae70", - bg: "#000000", - size: 20, - center: true, - }); - } - if (enemy.boundTo) { - TooltipList.push({ - str: TextGet(enemy.weakBinding ? "KDTooltipWeakBinding" : "KDTooltipNormalBinding"), - fg: KDHostile(enemy) ? "#88ff88" : "#ff5555", - bg: "#000000", - size: 14, - center: true, - }); - let caster = KinkyDungeonFindID(enemy.boundTo); - if (caster) - TooltipList.push({ - str: TextGet("KDTooltipBoundTo").replace("ENEMYNAME", TextGet("Name" + caster.Enemy.name)), - fg: KDHostile(enemy) ? "#88ff88" : "#ff5555", - bg: "#000000", - size: 14, - center: true, - }); - else - TooltipList.push({ - str: TextGet("KDTooltipDisappearing"), - fg: "#ff5555", - bg: "#000000", - size: 14, - center: true, - }); - } - let statuses = []; - - if (enemy.vulnerable) statuses.push({name: "Vulnerable", count: undefined}); - if (KDEntityBuffedStat(enemy, "Vibration")) statuses.push({name: "Vibed", count: undefined}); - if (enemy.stun) statuses.push({name: "Stunned", count: enemy.stun}); - if (enemy.bind) statuses.push({name: "Bind", count: enemy.bind}); - if (enemy.slow) statuses.push({name: "Slow", count: enemy.slow}); - if (enemy.silence) statuses.push({name: "Silence", count: enemy.silence}); - if (enemy.disarm) statuses.push({name: "Disarm", count: enemy.disarm}); - if (enemy.blind) statuses.push({name: "Blind", count: enemy.blind}); - if (enemy.slow || KDEntityBuffedStat(enemy, "MoveSpeed") < 0) statuses.push({name: "Slow", count: enemy.slow}); - if (KDBoundEffects(enemy)) statuses.push({name: "Bound" + (KDHelpless(enemy) ? 10 : KDBoundEffects(enemy))}); - if (KDEntityBuffedStat(enemy, "Plug")) statuses.push({name: "Plug", count: undefined}); - if (KDEntityBuffedStat(enemy, "Chastity")) statuses.push({name: "Belt", count: undefined}); - - if (statuses.length > 0) { - let strings = [""]; - let strr = ""; - let count = 0; - let maxcount = 4; - for (let stat of statuses) { - count += 1; - if (count > maxcount) { - strr = ""; - strings.push(""); - } - if (strr) strr = strr + ", "; - strr = strr + `${TextGet("KDStatusTooltipEnemy" + stat.name)}`; - if (stat.count) strr = strr + ` (${stat.count})`; - strings[strings.length - 1] = strr; - } - for (let stringlisted of strings) - TooltipList.push({ - str: stringlisted, - fg: "#dddddd", - bg: "#000000", - size: 14, - center: true, - }); - } - - - TooltipList.push({ - str: "", - fg: "#ffaa55", - bg: "#000000", - size: 12, - }); - let opinion = Math.max(-3, Math.min(3, Math.round(KDGetModifiedOpinion(enemy)/10))); - let str = TextGet("KDTooltipOpinion"+opinion); - TooltipList.push({ - str: str, - fg: "#ffffff", - bg: KDTextGray0, - size: 20, - }); - let ttt = KDGetAwareTooltip(enemy); - TooltipList.push({ - str: TextGet("KDTooltipAware" + ttt.suff), - fg: ttt.color, - bg: "#000000", - size: 20, - }); - if (enemy.Enemy.armor) { - let st = TextGet("KinkyDungeonTooltipArmor").replace("AMOUNT", "" + Math.round(10* enemy.Enemy.armor)); - TooltipList.push({ - str: st, - fg: "#ffffff", - bg: KDTextGray0, - size: 20, - }); - } - if (enemy.Enemy.spellResist) { - let st = TextGet("KinkyDungeonTooltipSpellResist").replace("AMOUNT", "" + Math.round(10* enemy.Enemy.spellResist)); - TooltipList.push({ - str: st, - fg: "#ffffff", - bg: KDTextGray0, - size: 20, - }); - } - if (enemy.Enemy.evasion) { - let st = TextGet("KinkyDungeonTooltipEvasion").replace("AMOUNT", "" + Math.round(100 - 100 * KinkyDungeonMultiplicativeStat(enemy.Enemy.evasion))); - TooltipList.push({ - str: st, - fg: "#ffffff", - bg: KDTextGray0, - size: 20, - }); - } - - if (analyze) { - if (enemy.Enemy.disarm) { - let dt = KinkyDungeonDamageTypes[enemy.Enemy.dmgType]; - if (dt) { - let st = TextGet("KDTooltipDisarm").replace("DISARMCHANCE", "" + Math.round(enemy.Enemy.disarm * 100)); - TooltipList.push({ - str: st, - fg: "#ffaa55", - bg: "#000000", - size: 20, - }); - } - } - - if (enemy.Enemy.dmgType) { - let dt = KinkyDungeonDamageTypes[enemy.Enemy.dmgType]; - if (dt) { - let st = TextGet("KinkyDungeonTooltipDealsDamage").replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + enemy.Enemy.dmgType)); - TooltipList.push({ - str: st, - fg: dt.color, - bg: dt.bg, - size: 20, - }); - } - } - } - - if (enemy.items && enemy.items.length > 0) { - TooltipList.push({ - str: "", - fg: "#ffaa55", - bg: "#000000", - size: 8, - }); - TooltipList.push({ - str: TextGet("KDTooltipInventory"), - fg: "#ffffff", - bg: "#000000", - size: 20, - }); - - for (let i = 0; i < 6 && i < enemy.items.length; i++) { - TooltipList.push({ - str: TextGet(KinkyDungeonGetRestraintByName(enemy.items[i]) ? "Restraint" + enemy.items[i] : "KinkyDungeonInventoryItem" + enemy.items[i]), - fg: "#ffffff", - bg: "#000000", - size: 18, - }); - } - if (enemy.items.length > 6) { - TooltipList.push({ - str: TextGet("KDTooltipInventoryFull").replace("NUMBER", "" + (enemy.items.length - 6)), - fg: "#ffffff", - bg: "#000000", - size: 18, - }); - } - - - TooltipList.push({ - str: "", - fg: "#ffaa55", - bg: "#000000", - size: 8, - }); - } - - if (analyze) { - let list = Array.from(Object.keys(enemy.Enemy.tags)); - if (enemy.Enemy.spellResist) - list.push("magic"); - let magic = false; - let repeats = {}; - for (let t of list) { - for (let dt of Object.values(KinkyDungeonDamageTypes)) { - if ((t == dt.name + "resist" || t == dt.name + "weakness" || t == dt.name + "immune" || t == dt.name + "severeweakness") - || (dt.name == "magic" && t.includes("magic") && enemy.Enemy.spellResist)) { - let mult = 1.0; - if (t == dt.name + "resist") mult = 0.5; - else if (t == dt.name + "weakness") mult = 1.5; - else if (t == dt.name + "immune") mult = 0; - else if (t == dt.name + "severeweakness") mult = 2.0; - if (dt.name == "magic" && !magic && enemy.Enemy.spellResist) { - magic = true; - mult *= KinkyDungeonMultiplicativeStat(enemy.Enemy.spellResist); - } - let st = TextGet("KinkyDungeonTooltipWeakness").replace("MULTIPLIER", "" + Math.round(mult * 100)/100).replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType"+ dt.name)); - - if (!repeats.DR) { - TooltipList.push({ - str: "", - fg: "#ffffff", - bg: "#000000", - size: 10, - }); - TooltipList.push({ - str: TextGet("KDTooltipDamageResists"), - fg: "#ffffff", - bg: "#000000", - size: 20, - }); - repeats.DR = true; - } - if (!repeats[st]) - TooltipList.push({ - str: st, - fg: dt.color, - bg: dt.bg, - size: 18, - }); - repeats[st] = true; - } - } - } - } - return KDDrawTooltip(TooltipList, offset); -} - -function KDGetColor(enemy) { - return "#ffffff"; - //if (enemy.color) return enemy.color; - //if (enemy.Enemy.color) return enemy.Enemy.color; - //return "#ffff44"; -} - -let KDChampionMax = 10; - -/** - * - * @param {entity} enemy - * @returns {boolean} Whether or not it was a Champion capture - */ -function KinkyDungeonCapture(enemy) { - let msg = "KinkyDungeonCapture"; - let goddessCapture = false; - if (enemy.lifetime != undefined && enemy.lifetime < 999) { - msg = "KinkyDungeonCaptureBasic"; - } else if (KDGameData.Champion) { - if (KDGameData.ChampionCurrent < KDChampionMax) { - msg = "KinkyDungeonCaptureGoddess"; - let disapproval = 0; - goddessCapture = true; - let spell = KinkyDungeonFindSpell("Summon", true); - if (spell) { - KinkyDungeonCastSpell(enemy.x, enemy.y, spell, undefined, undefined, undefined); - } - // Is the player wearing something related to the goddess? - if (KinkyDungeonStatsChoice.has("BoundCrusader")) { - let uniform = ["Rope", "Leather", "Metal", "Latex"]; - if (uniform.includes(KDGameData.Champion)) uniform = [KDGameData.Champion]; - let restraints = []; - for (let u of uniform) { - for (let r of KinkyDungeonGetRestraintsWithShrine(u, true)) { - restraints.push(r); - } - } - let minAmount = 1; - if (KinkyDungeonGoddessRep[KDGameData.Champion] > 10) minAmount = 2; - if (KinkyDungeonGoddessRep[KDGameData.Champion] > 30) minAmount = 3; - if (restraints.length < minAmount) { - msg = "KinkyDungeonCaptureGoddess" + (minAmount == 1 ? "Low" : "None") + (uniform.includes(KDGameData.Champion) ? "Uniform" : "Restraint"); - if (minAmount == 1) - disapproval = 1; - else - disapproval = 2; - } - } - if (disapproval == 0) { - KinkyDungeonChangeRep(KDGameData.Champion, KinkyDungeonGoddessRep[KDGameData.Champion] < -10 ? 1 : - (KinkyDungeonGoddessRep[KDGameData.Champion] > 30 ? 0.25 : 0.5)); - KDGameData.ChampionCurrent += 1; - } else goddessCapture = false; - } else msg = "KinkyDungeonCaptureMax"; - } else msg = "KinkyDungeonCaptureBasic"; - - KinkyDungeonSendEvent("capture", {enemy: enemy}); - KinkyDungeonSendActionMessage(6, TextGet(msg).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)).replace("GODDESS", TextGet("KinkyDungeonShrine" + KDGameData.Champion)), "lightgreen", 2); - return goddessCapture; -} - -/** - * - * @param {entity} enemy - */ -function KDDropStolenItems(enemy) { - if (enemy.items) { - for (let name of enemy.items) { - if (!enemy.tempitems || !enemy.tempitems.includes(name)) { - let item = {x:enemy.x, y:enemy.y, name: name}; - KinkyDungeonGroundItems.push(item); - } - } - enemy.items = []; - enemy.tempitems = undefined; - } -} - -/** - * - * @param {entity} enemy - * @param {number} E - * @returns {boolean} - */ -function KinkyDungeonEnemyCheckHP(enemy, E) { - if (enemy.hp <= 0) { - let noRepHit = false; - KinkyDungeonSendEvent("death", {}); - KDSpliceIndex(E, 1); - KinkyDungeonSendEvent("kill", {enemy: enemy}); - if (KDBoundEffects(enemy) > 3 && enemy.boundLevel > 0 && KDHostile(enemy) && !enemy.Enemy.tags.nocapture && enemy.playerdmg) { - KDDropStolenItems(enemy); - if (!KinkyDungeonCapture(enemy)) noRepHit = true; - } else { - KDDropStolenItems(enemy); - if (enemy == KinkyDungeonKilledEnemy) { - if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 10) - KinkyDungeonSendActionMessage(4, TextGet("Kill"+enemy.Enemy.name), "orange", 2); - KinkyDungeonKilledEnemy = null; - } - } - - - if (!(enemy.lifetime < 9000)) { - if (enemy.playerdmg && !(!KinkyDungeonAggressive(enemy) && KDHelpless(enemy) && KDCanDom(enemy))) { - if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.boss) - KinkyDungeonChangeRep("Ghost", -3); - else if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.miniboss) - KinkyDungeonChangeRep("Ghost", -1); - else if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.elite && KDRandom() < 0.33) - KinkyDungeonChangeRep("Ghost", -1); - - - if (enemy.rep) - for (let rep of Object.keys(enemy.rep)) - KinkyDungeonChangeRep(rep, enemy.rep[rep]); - - if (enemy.factionrep) - for (let rep of Object.keys(enemy.factionrep)) - KinkyDungeonChangeFactionRep(rep, enemy.factionrep[rep]); - - if (enemy.Enemy.rep && !KDEnemyHasFlag(enemy, "norep")) - for (let rep of Object.keys(enemy.Enemy.rep)) - KinkyDungeonChangeRep(rep, enemy.Enemy.rep[rep]); - - if (enemy.Enemy.factionrep && !KDEnemyHasFlag(enemy, "norep")) - for (let rep of Object.keys(enemy.Enemy.factionrep)) - KinkyDungeonChangeFactionRep(rep, enemy.Enemy.factionrep[rep]); - - if (KinkyDungeonStatsChoice.has("Vengeance")) { - KinkyDungeonChangeDistraction(Math.max(0, Math.ceil(Math.pow(enemy.Enemy.maxhp, 0.7))), false, 0.75); - } - - let faction = KDGetFaction(enemy); - let amount = 0; - - if (!KinkyDungeonHiddenFactions.includes(faction)) { - if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.boss) - amount = 0.04; - else if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.miniboss) - amount = 0.02; - else if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.elite) - amount = 0.01; - if (enemy.Enemy && enemy.Enemy.tags && !enemy.Enemy.tags.minor) - amount = 0.004; - if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.minor) - amount = KDRandom() < 0.33 ? 0.004 : 0.001; - - } - if (amount && !noRepHit && !enemy.Enemy.Reputation?.noRepLoss) { - KinkyDungeonChangeFactionRep(faction, -amount); - - // For being near a faction - let boostfactions = []; - let hurtfactions = []; - for (let e of KinkyDungeonEntities) { - let dist = KDistChebyshev(e.x - enemy.x, e.y - enemy.y); - if (dist < 10) { - let faction2 = KDGetFaction(e); - if (!KinkyDungeonHiddenFactions.includes(faction2)) { - if (KDFactionRelation(faction, faction2) < -0.1 && !boostfactions.includes(faction2)) { - boostfactions.push(faction2); - let mult = 1.0; - if (amount > 0) { - if (KDFactionRelation("Player", faction2) > 0.5) - mult *= 0.05; - else if (KDFactionRelation("Player", faction2) > 0.25) - mult *= 0.5; - } - KinkyDungeonChangeFactionRep(faction2, 0.5 * amount * mult * -KDFactionRelation(faction, faction2)); - // Add a favor - KDAddFavor(faction2, amount); - } else - if (KDFactionRelation(faction, faction2) > 0.1 && !hurtfactions.includes(faction2)) { - hurtfactions.push(faction2); - KinkyDungeonChangeFactionRep(faction2, 0.5 * amount * -KDFactionRelation(faction, faction2)); - } - } - } - } - } - } else if (!enemy.summoned && !KDIsImmobile(enemy) && !enemy.Enemy.tags.temporary) { - if (!KDGameData.RespawnQueue) KDGameData.RespawnQueue = []; - KDGameData.RespawnQueue.push({enemy: enemy.Enemy.name, faction: KDGetFaction(enemy)}); - } - } - - if (enemy.ondeath) { - for (let o of enemy.ondeath) { - KDOndeath[o.type](enemy, o); - } - } - if (enemy.Enemy.ondeath) { - for (let o of enemy.Enemy.ondeath) { - KDOndeath[o.type](enemy, o); - } - } - KDDropItems(enemy); - - return true; - } else if (KDHelpless(enemy)) { - KDDropStolenItems(enemy); - if (!enemy.droppedItems) - KDDropItems(enemy); - } - return false; -} - -/** - * - * @param {entity} enemy - */ -function KDDropItems(enemy) { - if (!enemy.noDrop && (enemy.playerdmg || !enemy.summoned) && !enemy.droppedItems) { - KinkyDungeonItemDrop(enemy.x, enemy.y, enemy.Enemy.dropTable, enemy.summoned); - enemy.droppedItems = true; - let dropped = null; - if (enemy.data && enemy.data.shop && KDShops[enemy.data.shop] && KDShops[enemy.data.shop].items) { - for (let i of KDShops[enemy.data.shop].items) { - if (!enemy.tempitems || !enemy.tempitems.includes(i)) { - dropped = {x:enemy.x, y:enemy.y, name: i}; - KinkyDungeonGroundItems.push(dropped); - } - } - } - if (KDEnemyHasFlag(enemy, "Shop")) { - dropped = {x:enemy.x, y:enemy.y, name: "Gold", amount: 100}; - KinkyDungeonGroundItems.push(dropped); - } - } -} - - -/** - * - * @param {entity} Enemy - * @returns {boolean} - If the NPC is eligible to use favors - */ -function KDFavorNPC(Enemy) { - // Only enemies which are not temporarily allied, or summoned by you, or specifically allied (like angels), are eligible to show up in dialogue - return Enemy && !Enemy.allied && !Enemy.Enemy.allied; -} - -/** - * - * @param {entity} Enemy - * @returns {number} - Gets the favor with the enemy - */ -function KDGetFavor(Enemy) { - if (KDGameData.Favors) - return KDGameData.Favors[KDGetFactionOriginal(Enemy)] ? KDGameData.Favors[KDGetFactionOriginal(Enemy)] : 0; - return 0; -} - -/** - * - * @param {entity} Enemy - * @param {number} Amount - */ -function KDChangeFavor(Enemy, Amount) { - KDModFavor(KDGetFactionOriginal(Enemy), Amount); -} - -function KDAddFavor(Faction, Amount) { - KDModFavor(Faction, Math.abs(Amount)); -} -function KDModFavor(Faction, Amount) { - if (!KDGameData.Favors) KDGameData.Favors = {}; - if (!KDGameData.Favors[Faction]) KDGameData.Favors[Faction] = 0; - KDGameData.Favors[Faction] = Math.max(KDGameData.Favors[Faction] + Amount, 0); -} - -function KinkyDungeonCheckLOS(enemy, player, distance, maxdistance, allowBlind, allowBars) { - let bs = (enemy && enemy.Enemy && enemy.Enemy.blindSight) ? enemy.Enemy.blindSight : 0; - if (KinkyDungeonStatsChoice.get("KillSquad")) bs += 20; - if (player.player && enemy.Enemy && (enemy.Enemy.playerBlindSight || KDAllied(enemy.Enemy))) bs = enemy.Enemy.playerBlindSight; - return distance <= maxdistance && ((allowBlind && bs >= distance) || KinkyDungeonCheckPath(enemy.x, enemy.y, player.x, player.y, allowBars)); -} - -function KinkyDungeonTrackSneak(enemy, delta, player, darkmult) { - if (!enemy.vp) enemy.vp = 0; - if (!player.player) return true; - let sneakThreshold = enemy.Enemy.sneakThreshold ? enemy.Enemy.sneakThreshold : 2; - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")) sneakThreshold = Math.max(0.1, sneakThreshold + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")); - let deltaMult = 0.7/Math.max(1, (1 + KinkyDungeonSubmissiveMult)); - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowDetection")) deltaMult *= KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowDetection")); - if (KDGameData.Outfit) { - let outfit = KinkyDungeonGetOutfit(KDGameData.Outfit); - if (outfit && outfit.visibility) - deltaMult *= outfit.visibility; - } - if (KinkyDungeonStatsChoice.get("Conspicuous")) deltaMult *= KDConspicuousMult; - else if (KinkyDungeonStatsChoice.get("Stealthy")) deltaMult *= KDStealthyMult; - if (darkmult) { - deltaMult *= KDPlayerLight/(darkmult + KDPlayerLight); - } - enemy.vp = Math.min(sneakThreshold * 2, enemy.vp + delta*deltaMult); - return (enemy.vp > sneakThreshold); -} - -function KinkyDungeonMultiplicativeStat(Stat) { - if (Stat > 0) { - return 1 / (1 + Stat); - } - if (Stat < 0) { - return 1 - Stat; - } - - return 1; -} - -/** - * - * @param {number} x - * @param {number} y - * @param {number} dist - * @param {entity} [hostileEnemy] - * @returns {entity[]} - */ -function KDNearbyEnemies(x, y, dist, hostileEnemy) { - let cache = KDGetEnemyCache(); - let list = []; - if (!cache) { - for (let e of KinkyDungeonEntities) { - if (KDistEuclidean(x - e.x, y - e.y) <= dist && (!hostileEnemy || KDHostile(e, hostileEnemy))) list.push(e); - } - } else { - let e = null; - for (let X = Math.floor(x - dist); X < Math.ceil(x + dist); X++) - for (let Y = Math.floor(y - dist); Y < Math.ceil(y + dist); Y++) - if (KDistEuclidean(X - x, Y - y) <= dist) { - e = cache.get(X + "," + Y); - if (e && (!hostileEnemy || KDHostile(e, hostileEnemy))) list.push(e); - } - } - return list; -} - - -/** - * - * @param {number} x - * @param {number} y - * @param {number} dist - * @returns {{x: number, y: number, tile: any}[]} - */ -function KDNearbyTiles(x, y, dist) { - let list = []; - for (let X = Math.floor(x - dist); X < Math.ceil(x + dist); X++) - for (let Y = Math.floor(y - dist); Y < Math.ceil(y + dist); Y++) - if (KDistEuclidean(X - x, Y - y) <= dist) { - if (KinkyDungeonTilesGet(X + ',' + Y)) list.push({x: X, y: Y, tile: KinkyDungeonTilesGet(X + ',' + Y)}); - } - return list; -} - -/** - * - * @param {number} x - * @param {number} y - * @param {number} dist - * @param {entity} [neutralEnemy] - * @returns {entity[]} - */ -function KDNearbyNeutrals(x, y, dist, neutralEnemy) { - let cache = KDGetEnemyCache(); - let list = []; - if (!cache) { - for (let e of KinkyDungeonEntities) { - if (KDistEuclidean(x - e.x, y - e.y) <= dist && (!neutralEnemy || !KDHostile(e, neutralEnemy))) list.push(e); - } - } else { - let e = null; - for (let X = Math.floor(x - dist); X < Math.ceil(x + dist); X++) - for (let Y = Math.floor(y - dist); Y < Math.ceil(y + dist); Y++) - if (KDistEuclidean(X - x, Y - y) <= dist) { - e = cache.get(X + "," + Y); - if (e && (!neutralEnemy || !KDHostile(e, neutralEnemy))) list.push(e); - } - } - return list; -} - -function KinkyDungeonGetRandomEnemyPoint(avoidPlayer, onlyPlayer, Enemy, playerDist = 6, minDist = 6) { - return KinkyDungeonGetRandomEnemyPointCriteria(undefined, avoidPlayer, onlyPlayer, Enemy, playerDist, minDist); -} -function KinkyDungeonGetRandomEnemyPointCriteria(criteria, avoidPlayer, onlyPlayer, Enemy, playerDist = 6, minDist = 6) { - let tries = 0; - - while (tries < 100) { - let points = Object.values(KinkyDungeonRandomPathablePoints); - let point = points[Math.floor(points.length * KDRandom())]; - if (point) { - let X = point.x;//1 + Math.floor(KDRandom()*(KinkyDungeonGridWidth - 1)); - let Y = point.y;//1 + Math.floor(KDRandom()*(KinkyDungeonGridHeight - 1)); - let PlayerEntity = KinkyDungeonNearestPlayer({x:X, y:Y}); - - if (((!avoidPlayer || Math.sqrt((X - PlayerEntity.x) * (X - PlayerEntity.x) + (Y - PlayerEntity.y) * (Y - PlayerEntity.y)) > minDist) - && (!onlyPlayer || Math.sqrt((X - PlayerEntity.x) * (X - PlayerEntity.x) + (Y - PlayerEntity.y) * (Y - PlayerEntity.y)) <= playerDist)) - && (!KinkyDungeonPointInCell(X, Y)) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y)) - && (!Enemy || KinkyDungeonNoEnemyExceptSub(X, Y, true, Enemy)) - && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits) - && (!criteria || criteria(X, Y))) { - return {x: X, y:Y}; - } - } - tries += 1; - } - - return undefined; -} - -function KinkyDungeonGetNearbyPoint(x, y, allowNearPlayer=false, Enemy, Adjacent, ignoreOffLimits, callback) { - let slots = []; - for (let X = -Math.ceil(1); X <= Math.ceil(1); X++) - for (let Y = -Math.ceil(1); Y <= Math.ceil(1); Y++) { - if ((X != 0 || Y != 0) && KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(x + X, y + Y))) { - // We add the slot and those around it - slots.push({x:x + X, y:y + Y}); - slots.push({x:x + X, y:y + Y}); - slots.push({x:x + X, y:y + Y}); - if (!Adjacent) - for (let XX = -Math.ceil(1); XX <= Math.ceil(1); XX++) - for (let YY = -Math.ceil(1); YY <= Math.ceil(1); YY++) { - if ((Math.abs(X + XX) > 1 || Math.abs(Y + YY) > 1) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x + XX + X, y + YY + Y))) { - slots.push({x:x + XX + X, y:y + YY + Y}); - slots.push({x:x + XX + X, y:y + YY + Y}); - for (let XXX = -Math.ceil(1); XXX <= Math.ceil(1); XXX++) - for (let YYY = -Math.ceil(1); YYY <= Math.ceil(1); YYY++) { - if ((Math.abs(X + XX + XXX) > 2 || Math.abs(Y + YY + YYY) > 2) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x + XX + XXX + X, y + YYY + YY + Y))) { - slots.push({x:x + XXX + XX + X, y:y + YYY + YY + Y}); - } - } - } - } - } - } - - let foundslot = undefined; - for (let C = 0; C < 100; C++) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - if (slot && KinkyDungeonNoEnemyExceptSub(slot.x, slot.y, false, Enemy) && (ignoreOffLimits || !KinkyDungeonTilesGet(slot.x + "," + slot.y) || (!KinkyDungeonTilesGet(slot.x + "," + slot.y).NoWander && !KinkyDungeonTilesGet(slot.x + "," + slot.y).OffLimits)) - && (allowNearPlayer || Math.max(Math.abs(KinkyDungeonPlayerEntity.x - slot.x), Math.abs(KinkyDungeonPlayerEntity.y - slot.y)) > 1.5) - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(slot.x, slot.y)) - && (!callback || callback(slot.x, slot.y))) { - foundslot = {x: slot.x, y: slot.y}; - - C = 100; - } else slots.splice(C, 1); - } - return foundslot; -} - -function KinkyDungeonSetEnemyFlag(enemy, flag, duration) { - if (!enemy.flags) enemy.flags = {}; - if (enemy.flags[flag]) { - if (duration == 0) { - delete enemy.flags[flag];// = undefined; - return; - } - if (enemy.flags[flag] == -1) return; - if (enemy.flags[flag] < duration) enemy.flags[flag] = duration; - } else if (duration) enemy.flags[flag] = duration; -} - -/** - * - * @param {entity} enemy - * @param {number} delta - */ -function KinkyDungeonTickFlagsEnemy(enemy, delta) { - if (enemy.flags) { - for (let f of Object.entries(enemy.flags)) { - if (f[1] == -1) continue; - if (f[1] <= delta) delete enemy.flags[f[0]]; - if (f[1] > 0) enemy.flags[f[0]] = f[1] - delta; - } - } -} - -let KinkyDungeonDamageTaken = false; -let KinkyDungeonTorsoGrabCD = 0; -let KinkyDungeonHuntDownPlayer = false; - -/** - * - * @param {entity} enemy - * @returns {boolean} - */ -function KinkyDungeonHasStatus(enemy) { - return enemy && (enemy.bind > 0 || enemy.slow > 0 || enemy.stun > 0 || enemy.freeze > 0 || enemy.silence > 0 || KinkyDungeonIsSlowed(enemy) || KDBoundEffects(enemy) > 0); -} - - -/** - * - * @param {entity} enemy - * @returns {boolean} - */ -function KinkyDungeonIsDisabled(enemy) { - return enemy && (enemy.stun > 0 || enemy.freeze > 0 || KDBoundEffects(enemy) > 3); -} - - -/** - * - * @param {entity} enemy - * @returns {boolean} - */ -function KinkyDungeonIsSlowed(enemy) { - return enemy && ((KDBoundEffects(enemy) > 0 && KDBoundEffects(enemy) < 4) || enemy.slow > 0 || KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed") < 0); -} - - -/** - * - * @param {entity} enemy - * @returns {boolean} - */ -function KinkyDungeonCanCastSpells(enemy) { - return enemy && !(KinkyDungeonIsDisabled(enemy) || enemy.silence > 0); -} - -function KDCanBind(enemy) { - return (enemy?.Enemy?.bound != undefined); -} - -function KDBoundEffects(enemy) { - if (!enemy.Enemy.bound) return 0; - if (!enemy.boundLevel) return 0; - let boundLevel = enemy.boundLevel ? enemy.boundLevel : 0; - let bindAmp = KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BindAmp")); - boundLevel *= bindAmp; - if (boundLevel > enemy.Enemy.maxhp || (enemy.hp <= 0.1*enemy.Enemy.maxhp && boundLevel > enemy.hp)) return 4; // Totally tied - if (boundLevel > enemy.Enemy.maxhp*0.75) return 3; - if (boundLevel > enemy.Enemy.maxhp*0.5) return 2; - if (boundLevel > enemy.Enemy.maxhp*0.25) return 1; - return 0; -} - - -function KinkyDungeonUpdateEnemies(delta, Allied) { - let tickAlertTimer = false; - let tickAlertTimerFactions = []; - let visionMod = 1.0; - let defeat = false; - - /*if (KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]]) { - if (KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]].brightness) { - visionMod = Math.min(1.0, Math.max(0.5, KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]].brightness / 8)); - } - }*/ - - if (Allied) { - KinkyDungeonUpdateDialogue(KinkyDungeonPlayerEntity, delta); - let KinkyDungeonSummons = 0; - for (let i = KinkyDungeonEntities.length-1; i >= 0; i--) { - let enemy = KinkyDungeonEntities[i]; - KinkyDungeonUpdateDialogue(enemy, delta); - if (KDAllied(enemy) && enemy.summoned && enemy.Enemy.allied && enemy.Enemy.CountLimit && (!enemy.lifetime || enemy.lifetime > 999)) { - KinkyDungeonSummons += 1; - if (KinkyDungeonSummons > KinkyDungeonSummonCount) { - enemy.hp -= Math.max(0.1 * enemy.hp) + 1; - } - } - } - } else { - if (KinkyDungeonTorsoGrabCD > 0) KinkyDungeonTorsoGrabCD -= 1; - - if (KDGameData.KinkyDungeonLeashedPlayer > 0) { - KDGameData.KinkyDungeonLeashedPlayer -= 1; - - let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - if (nearestJail) { - let xx = nearestJail.x; - let yy = nearestJail.y; - let jaildoor = KDGetJailDoor(xx, yy).tile; - if (jaildoor && jaildoor.Type == "Door") { - jaildoor.Lock = undefined; - } - } - - } - KinkyDungeonUpdateFlags(delta); - } - - KDGameData.DollCount = 0; - - // Loop 1 - for (let enemy of KinkyDungeonEntities) { - if ((Allied && KDAllied(enemy)) || (!Allied && !KDAllied(enemy))) { - - let tile = KinkyDungeonTilesGet(enemy.x + "," + enemy.y); - if (tile?.OffLimits) { - // We remove certain flags when enemies are in an 'offlimits' area so we can get them out - KinkyDungeonSetEnemyFlag(enemy, "wander", 0); - } - if (enemy.Enemy.tags.doll) KDGameData.DollCount += 1; - - - let master = KinkyDungeonFindMaster(enemy).master; - if (master && enemy.aware) master.aware = true; - if (master && master.aware) enemy.aware = true; - if (enemy.Enemy.master && enemy.Enemy.master.dependent && !master) enemy.hp = -10000; - else if (enemy.Enemy.master?.dependent) enemy.boundTo = master.id; - - if (!enemy.castCooldown) enemy.castCooldown = 0; - if (enemy.castCooldown > 0) { - let cdmult = enemy.distraction ? 1 / (1 + enemy.distraction / enemy.Enemy.maxhp) : 1; - cdmult = cdmult * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(enemy.buffs, "CastSpeed")); - enemy.castCooldown = Math.max(0, enemy.castCooldown-delta * cdmult); - if (enemy.castCooldown <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "specialCD"}); - } - if (!enemy.castCooldownSpecial) enemy.castCooldownSpecial = 0; - if (enemy.castCooldownSpecial > 0) { - enemy.castCooldownSpecial = Math.max(0, enemy.castCooldownSpecial-delta); - if (enemy.castCooldownSpecial <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "castCooldownSpecial"}); - } - - if (enemy.Enemy.specialCharges && enemy.specialCharges <= 0) enemy.specialCD = 999; - KinkyDungeonTickFlagsEnemy(enemy, delta); - if (enemy.specialCD > 0) { - enemy.specialCD -= delta; - if (enemy.specialCD <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "specialCD"}); - } - if (enemy.slow > 0) { - enemy.slow -= delta; - if (enemy.slow <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "slow"}); - } - if (enemy.boundLevel > 0 && !(enemy.stun > 0 || enemy.freeze > 0) && (enemy.hp > enemy.Enemy.maxhp * 0.1)) { - let SM = KDGetEnemyStruggleMod(enemy); - let newBound = KDPredictStruggle(enemy, SM, delta); - enemy.boundLevel = newBound.boundLevel; - enemy.specialBoundLevel = newBound.specialBoundLevel; - - let SR = SM * (10 + Math.pow(Math.max(0.01, enemy.hp), 0.75)); - if (SR <= 0 || KDRandom() < 0.1) { - KDAddThought(enemy.id, "GiveUp", 5, SR <= 0 ? 4 : 1); - } else { - if (KDLoosePersonalities.includes(enemy.personality)) { - KDAddThought(enemy.id, "Embarrassed", 2, 4); - } else if (KDStrictPersonalities.includes(enemy.personality)) { - KDAddThought(enemy.id, "Struggle", 2, 2); - } else { - KDAddThought(enemy.id, "Annoyed", 2, 2); - } - } - - if (enemy.boundLevel <= 0) { - KDAddThought(enemy.id, "Annoyed", 5, 1); - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "boundLevel"}); - } - } - let vibe = KDEntityBuffedStat(enemy, "Vibration"); - if (enemy.distraction > 0 || vibe) { - let DD = KDGetEnemyDistractionDamage(enemy, vibe); - if (DD > 0) { - KinkyDungeonDamageEnemy(enemy, { - damage: DD, - type: "charm", - }, true, true); - } - - - let DR = KDGetEnemyDistractRate(enemy, vibe); - if (enemy.distraction > enemy.Enemy.maxhp) { - enemy.distraction = enemy.Enemy.maxhp; - KDAddThought(enemy.id, "Embarrassed", 7, 1); - } else { - if (DR <= 0 || KDRandom() < 0.1) { - KDAddThought(enemy.id, "GiveUp", 5, DR <= 0 ? 4 : 1); - } else { - if (KDLoosePersonalities.includes(enemy.personality)) { - KDAddThought(enemy.id, "Play", 1, 4); - } else if (KDStrictPersonalities.includes(enemy.personality)) { - KDAddThought(enemy.id, "Annoyed", 1, 3); - } else { - KDAddThought(enemy.id, "Embarrassed", 1, 2); - } - } - } - enemy.distraction = Math.max(0, Math.min((enemy.distraction || 0) - delta * DR, enemy.Enemy.maxhp)); - - - if (enemy.distraction <= 0) { - KDAddThought(enemy.id, "Annoyed", 5, 1); - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "boundLevel"}); - } - } - - let bindLevel = KDBoundEffects(enemy); - let statusBonus = 1; - if (enemy.Enemy.tags.unstoppable) statusBonus *= 4; - else if (enemy.Enemy.tags.unflinching) statusBonus *= 2; - - if (enemy.Enemy.rage) enemy.rage = 9999; - if (enemy.bind > 0) { - enemy.bind -= delta; - if (enemy.bind <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "bind"}); - } - if (enemy.rage > 0) { - enemy.rage -= delta; - if (enemy.rage <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "rage"}); - } - if (enemy.hostile > 0) { - enemy.hostile -= delta; - if (enemy.hostile <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "hostile"}); - } - if (enemy.allied > 0 && enemy.allied < 9000) { - enemy.allied -= delta; - if (enemy.allied <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "allied"}); - } - if (enemy.ceasefire > 0 && enemy.ceasefire < 9000) { - enemy.ceasefire -= delta; - if (enemy.ceasefire <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "ceasefire"}); - } - if (enemy.blind > 0 && bindLevel < 4) { - enemy.blind -= delta * statusBonus / (1 + 1*bindLevel); - if (enemy.blind <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "blind"}); - } - if (enemy.disarm > 0 && bindLevel < 4) { - enemy.disarm -= delta * statusBonus / (1 + 1*bindLevel); - if (enemy.disarm <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "disarm"}); - } - if (enemy.playWithPlayer > 0) { - enemy.playWithPlayer -= delta; - if (enemy.playWithPlayer <= 0) { - if (!KinkyDungeonAggressive(enemy)) { - KDResetIntent(enemy, AIData); - KDAddThought(enemy.id, "Happy", 5, 1); - } - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "playWithPlayer"}); - } - } else enemy.playWithPlayer = 0; - if (enemy.playWithPlayerCD > 0) { - enemy.playWithPlayerCD -= delta; - if (enemy.playWithPlayerCD <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "playWithPlayerCD"}); - } - if (enemy.silence > 0 && bindLevel < 4) { - enemy.silence -= delta * statusBonus / (1 + 1*bindLevel); - if (enemy.silence <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "silence"}); - } - if (enemy.disarmflag > 0 && enemy.Enemy.disarm && KinkyDungeonLastAction != "Attack") { - enemy.disarmflag = Math.max(0, enemy.disarmflag - enemy.Enemy.disarm); - if (enemy.disarmflag <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "disarmflag"}); - } - if (enemy.stun > 0 || enemy.freeze > 0) { - enemy.warningTiles = []; - enemy.disarmflag = 0; - enemy.fx = undefined; - enemy.fy = undefined; - if (enemy.stun > 0 && enemy.stun <= delta) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "stun"}); - if (enemy.freeze > 0 && enemy.freeze <= delta) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "freeze"}); - let smult = 1 - 0.167 * KDBoundEffects(enemy); - let fmult = KDHelpless(enemy) ? 0.1 : 1 - 0.2 * KDBoundEffects(enemy); - if (enemy.stun > 0) enemy.stun = Math.max(enemy.stun - delta * smult, 0); - if (enemy.freeze > 0) enemy.freeze = Math.max(enemy.freeze - delta * fmult, 0); - } else if (enemy.channel > 0) { - enemy.warningTiles = []; - if (enemy.channel > 0) enemy.channel -= delta; - - if (enemy.channel <= 0) - KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "channel"}); - } - } - } - - KDGameData.otherPlaying = 0; - // Loop 2 - for (let E = 0; E < KinkyDungeonEntities.length; E++) { - let enemy = KinkyDungeonEntities[E]; - if ((Allied && KDAllied(enemy)) || (!Allied && !KDAllied(enemy))) { - if (enemy.vulnerable > 0) enemy.vulnerable -= delta; - else enemy.vulnerable = 0; - if (enemy.Enemy.tags.nonvulnerable && enemy.vulnerable) enemy.vulnerable = 0; - if (!(KDGameData.KinkyDungeonPenance && KinkyDungeonAngel()) || enemy == KinkyDungeonAngel()) { - // Delete the enemy - if (KinkyDungeonEnemyCheckHP(enemy, E)) { E -= 1; continue;} - - let player = (!KinkyDungeonAngel()) ? KinkyDungeonNearestPlayer(enemy, false, true, enemy.Enemy.visionRadius ? (enemy.Enemy.visionRadius + ((enemy.lifetime > 0 && enemy.Enemy.visionSummoned) ? enemy.Enemy.visionSummoned : 0)) : 0, AIData) : KinkyDungeonPlayerEntity; - - - if (enemy.Enemy.convertTiles) { - let tile = KinkyDungeonMapGet(enemy.x, enemy.y); - for (let c of enemy.Enemy.convertTiles) { - if (c.from == tile && c.to) { - KinkyDungeonMapSet(enemy.x, enemy.y, c.to); - } - } - } - - KinkyDungeonHandleTilesEnemy(enemy, delta); - - if (enemy.Enemy.triggersTraps) { - KinkyDungeonHandleTraps(enemy, enemy.x, enemy.y, true); - } - - let idle = true; - //let bindLevel = KDBoundEffects(enemy); - - if (!( - KinkyDungeonIsDisabled(enemy) - || KDHelpless(enemy) - || enemy.channel > 0 - )) { - let start = performance.now(); - - let playerItems = []; - for (let inv of KinkyDungeonAllWeapon()) { - if (inv.name != "Unarmed") - playerItems.push(inv); - } - for (let inv of KinkyDungeonAllConsumable()) { - playerItems.push(inv); - } - let ret = KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems); - if (enemy.playWithPlayer) KDGameData.otherPlaying += 1; - idle = ret.idle; - if (ret.defeat) { - defeat = true; - } - - //TODO pass items to more dominant nearby enemies - if (enemy.items && !KDEnemyHasFlag(enemy, "shop")) { - let light = KinkyDungeonVisionGet(enemy.x, enemy.y); - if (light == 0 && !enemy.aware && KDRandom() < 0.2) { - //KDClearItems(enemy); - KDRestockRestraints(enemy, enemy.Enemy.RestraintFilter?.restockPercent || 0.5); - } - } - - if (idle && enemy.hp > 0) { - // Removed for non guards because its fun to find tied up girls around - if (enemy == KinkyDungeonJailGuard()) - KDCaptureNearby(enemy); - } - - let end = performance.now(); - if (KDDebug) - console.log(`Took ${end - start} milliseconds to run loop for enemy ${enemy.Enemy.name}`); - } else { - // These happen when an enemy is disabled - enemy.disarmflag = 0; - enemy.fx = undefined; - enemy.fy = undefined; - } - - if (KDHelpless(enemy)) enemy.playWithPlayer = 0; - - if (idle) { - // These happen when an enemy is disabled or not doing anything - enemy.movePoints = 0; - enemy.attackPoints = 0; - enemy.warningTiles = []; - } - - KinkyDungeonHandleTilesEnemy(enemy, delta); - - if (enemy.vp > 0 && (!enemy.path || enemy.path.length < 4)) { - let sneakThreshold = enemy.Enemy.sneakThreshold ? enemy.Enemy.sneakThreshold : 2; - if (enemy.vp > sneakThreshold * 2 && !enemy.aware) { - let sneak = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak"); - if (sneak > 0) - enemy.vp = Math.max(sneakThreshold + 1, Math.max(Math.min(enemy.vp, sneakThreshold), enemy.vp * 0.7 - 0.1)); - } - enemy.vp = Math.max(0, enemy.vp - 0.1); - } - - // Delete the enemy - if (KinkyDungeonEnemyCheckHP(enemy, E)) { E -= 1;} else { - if (enemy.aware && (enemy.lifetime == undefined || enemy.lifetime > 9000) && !enemy.Enemy.tags.temporary && !enemy.Enemy.tags.peaceful) { - if (enemy.hostile > 0 && enemy.hostile < 9000 && (KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail')) { - if (!(enemy.silence > 0)) { - tickAlertTimer = true; - if (KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y) < 9 && !tickAlertTimerFactions.includes(KDGetFaction(enemy))) { - tickAlertTimerFactions.push(KDGetFaction(enemy)); - } - } - } else if (KinkyDungeonAggressive(enemy)) { - if (!(enemy.silence > 0)) { - tickAlertTimer = true; - if (KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y) < 9 && !tickAlertTimerFactions.includes(KDGetFaction(enemy))) { - tickAlertTimerFactions.push(KDGetFaction(enemy)); - } - } - } - } - } - if (enemy.Enemy.regen && (enemy.hp > 0.01 || enemy.Enemy.regen < 0)) enemy.hp = Math.min(enemy.Enemy.maxhp, enemy.hp + enemy.Enemy.regen * delta); - if (enemy.Enemy.lifespan || enemy.lifetime != undefined) { - if (enemy.lifetime == undefined) enemy.lifetime = enemy.Enemy.lifespan; - if (enemy.lifetime <= 9000) - enemy.lifetime -= delta; - if (enemy.lifetime <= 0) enemy.hp = -10000; - } - if (enemy.boundTo) { - if (enemy.boundTo == -1) { - if (KDPlayerIsDefeated()) enemy.hp = 0; - if (enemy.weakBinding && KDPlayerIsStunned()) enemy.hp = 0; - } else if (!KinkyDungeonFindID(enemy.boundTo) || KDHelpless(KinkyDungeonFindID(enemy.boundTo)) || (enemy.weakBinding && KinkyDungeonIsDisabled(KinkyDungeonFindID(enemy.boundTo)))) enemy.hp = 0; - } - } - } - } - - - if (!Allied) { - // vulnerability calc - for (let i = KinkyDungeonEntities.length-1; i >= 0; i--) { - let enemy = KinkyDungeonEntities[i]; - // Make it so you can backstab enemies while your allies fight them - KDCheckVulnerableBackstab(enemy); - // Alert enemies if youve aggroed one - if (!KDAllied(enemy) && !(enemy.ceasefire > 0)) { - if (!(enemy.hostile > 0) && tickAlertTimerFactions.length > 0 && !KinkyDungeonAggressive(enemy) && !enemy.Enemy.tags.peaceful && (enemy.vp > 0.5 || enemy.lifetime < 900 || (!KDHostile(enemy) && KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 7))) { - for (let f of tickAlertTimerFactions) { - if ((KDGetFaction(enemy) != "Player") && ( - (KDFactionRelation(f, KDGetFaction(enemy)) > 0.15 && KDFactionRelation(f, KDGetFaction(enemy)) < 0.5 && // Favored - KDFactionRelation("Player", KDGetFaction(enemy)) < 0.2) - || (KDFactionRelation(f, KDGetFaction(enemy)) >= 0.5 && // Allied - KDFactionRelation("Player", KDGetFaction(enemy)) < 0.4) - ) - ) { - KDMakeHostile(enemy, KDMaxAlertTimer); - } - } - } - } - } - - let alertingFaction = false; - for (let f of tickAlertTimerFactions) { - if (KDFactionRelation("Jail", f) > -0.01 && KDFactionRelation("Chase", f) > -0.01) { - alertingFaction = true; - } - } - if (tickAlertTimer && (KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail') && alertingFaction) { - if (KDGameData.AlertTimer < 3*KDMaxAlertTimer) KDGameData.AlertTimer += delta; - } else if (KDGameData.AlertTimer > 0) { - KDGameData.AlertTimer -= delta * 3; - } - if (KDGameData.AlertTimer >= KDMaxAlertTimer) { - KinkyDungeonStartChase(undefined, "Alert"); - } - - KinkyDungeonHandleJailSpawns(delta); - KinkyDungeonHandleWanderingSpawns(delta); - KinkyDungeonAlert = 0; - } - - if (defeat) { - KinkyDungeonDefeat(KinkyDungeonFlags.has("LeashToPrison")); - } - -} - -function KDMakeHostile(enemy, timer) { - if (!timer) timer = KDMaxAlertTimerAggro; - if (!enemy.hostile) enemy.hostile = timer; - else enemy.hostile = Math.max(enemy.hostile, timer); -} - -/** - * Makes an enemy vulnerable if you are behind them - * @param {entity} enemy - */ -function KDCheckVulnerableBackstab(enemy) { - if (KinkyDungeonAggressive(enemy) && enemy != KinkyDungeonLeashingEnemy()) { - if (enemy.fx && enemy.fy && KDistChebyshev(enemy.fx - enemy.x, enemy.fy - enemy.y) < 1.5 && !enemy.Enemy.tags.noflank) { - if (enemy.x * 2 - enemy.fx == KinkyDungeonPlayerEntity.x && enemy.y * 2 - enemy.fy == KinkyDungeonPlayerEntity.y) { - KDAddThought(enemy.id, "Annoyed", 4, 1); - enemy.vulnerable = Math.max(enemy.vulnerable, 1); - return true; - } - } - } - return false; -} - -/** - * - * @param {entity} enemy - * @returns {string} - */ -function KDGetAI(enemy) { - if (enemy.AI) return enemy.AI; - else return enemy.Enemy.AI; -} - -/** - * @type {Map} - */ -let KDThoughtBubbles = new Map(); - -function KDAddThought(id, name, priority, duration) { - let pri = -1; - let n = ""; - let i = 0; - let d = 1; - if (KDThoughtBubbles.has(id)) { - pri = KDThoughtBubbles.get(id).priority; - n = KDThoughtBubbles.get(id).name; - d = KDThoughtBubbles.get(id).duration; - i = KDThoughtBubbles.get(id).index; - } - // Different name means the bubble is refreshed - if (priority > pri || (n != name && KinkyDungeonCurrentTick > d + i) || (n != name && priority >= pri)) { - KDThoughtBubbles.set(id, { - name: name, - priority: priority, - duration: duration, - index: KinkyDungeonCurrentTick, - }); - } -} - -function KDEnemyCanTalk(enemy) { - return enemy.Enemy && !enemy.Enemy.gagged && (enemy.Enemy.tags.jailer || enemy.Enemy.tags.jail || enemy.Enemy.playLine) && !(enemy.silence > 0); -} - -let AIData = {}; - -/** - * - * @param {entity} enemy - * @param {*} player - * @param {number} delta - * @param {number} visionMod - * @param {item[]} playerItems - * @returns {{idle: boolean, defeat: boolean}} - */ -function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { - AIData = {}; - - //let allied = KDAllied(enemy); - //let hostile = KDHostile(enemy); - - AIData.defeat = false; - AIData.idle = true; - AIData.moved = false; - AIData.ignore = false; - AIData.visionMod = visionMod; - AIData.followRange = enemy.Enemy.followRange == 1 ? 1.5 : enemy.Enemy.followRange; - AIData.visionRadius = enemy.Enemy.visionRadius ? (enemy.Enemy.visionRadius + ((enemy.lifetime > 0 && enemy.Enemy.visionSummoned) ? enemy.Enemy.visionSummoned : 0)) : 0; - let AIType = KDAIType[enemy.AI ? enemy.AI : enemy.Enemy.AI]; - if (AIData.visionMod && AIData.visionRadius > 1.5) AIData.visionRadius = Math.max(1.5, AIData.visionRadius * AIData.visionMod); - AIData.chaseRadius = (enemy.Enemy.Awareness?.chaseradius != undefined) ? enemy.Enemy.Awareness.chaseradius - : 10 + 1.5*(Math.max(AIData.followRange, 0)) + 1.5*Math.max(AIData.visionRadius ? AIData.visionRadius : 0, enemy.Enemy.blindSight ? enemy.Enemy.blindSight : 0); - AIData.blindSight = (enemy && enemy.Enemy && enemy.Enemy.blindSight) ? enemy.Enemy.blindSight : 0; - if (KinkyDungeonStatsChoice.get("KillSquad")) { - AIData.visionRadius *= 2; - AIData.chaseRadius *= 2; - AIData.blindSight += 20; - if (AIData.blindSight > AIData.visionRadius) { - AIData.visionRadius = AIData.blindSight; - } - if (AIData.blindSight > AIData.chaseRadius) { - AIData.chaseRadius = AIData.blindSight; - } - } - AIData.ignoreLocks = enemy.Enemy.keys || enemy.keys || enemy == KinkyDungeonJailGuard() || (KDEnemyHasFlag(enemy, "keys")); - AIData.harmless = (KinkyDungeonPlayerDamage.dmg <= enemy.Enemy.armor || !KinkyDungeonHasWill(0.1)) && !KinkyDungeonFlags.has("PlayerCombat") && !KinkyDungeonCanTalk() && !KinkyDungeonPlayer.CanInteract() && KinkyDungeonSlowLevel > 1; - - AIData.playerDist = Math.sqrt((enemy.x - player.x)*(enemy.x - player.x) + (enemy.y - player.y)*(enemy.y - player.y)); - AIData.hostile = KDHostile(enemy); - AIData.aggressive = KinkyDungeonAggressive(enemy); - AIData.domMe = (player.player && AIData.aggressive) ? false : KDCanDom(enemy); - - AIData.leashing = enemy.Enemy.tags.leashing && KDFactionRelation(KDGetFaction(enemy), "Jail") > -0.1; - AIData.highdistraction = enemy.distraction > 0 && enemy.distraction >= enemy.Enemy.maxhp * 0.9; - AIData.distracted = AIData.highdistraction && KDLoosePersonalities.includes(enemy.personality); - // Check if the enemy ignores the player - if (player.player && !KDAllied(enemy)) { - if (AIData.playerDist < 1.5 && KinkyDungeonAllRestraint().some((r) => {return KDRestraint(r).ignoreNear;})) AIData.ignore = true; - if (!AIData.leashing && !KinkyDungeonHasWill(0.1) && KinkyDungeonAllRestraint().some((r) => {return KDRestraint(r).ignoreIfNotLeash;})) AIData.ignore = true; - - if (!KinkyDungeonFlags.has("PlayerCombat") || enemy.Enemy.tags.ignorebrat) { - if (enemy.Enemy.tags.ignorenoSP && !KinkyDungeonHasWill(0.1)) AIData.ignore = true; - if ((KDGetFaction(enemy) == "Ambush" || enemy.Enemy.tags.ignoreharmless) && (!enemy.warningTiles || enemy.warningTiles.length == 0) - && AIData.harmless && (!enemy.Enemy.ignorechance || KDRandom() < enemy.Enemy.ignorechance || !KinkyDungeonHasWill(0.1))) AIData.ignore = true; - if (enemy.Enemy.tags.ignoretiedup && (!enemy.warningTiles || enemy.warningTiles.length == 0) && enemy.lifetime == undefined - && !KinkyDungeonPlayer.CanInteract() && !KinkyDungeonCanTalk() && !KinkyDungeonPlayer.CanInteract() && KinkyDungeonSlowLevel > 1 - && (!enemy.Enemy.ignorechance || KDRandom() < enemy.Enemy.ignorechance || !KinkyDungeonHasWill(0.1))) AIData.ignore = true; - if (enemy.Enemy.tags.ignoregagged && (!enemy.warningTiles || enemy.warningTiles.length == 0) && enemy.lifetime == undefined - && !KinkyDungeonCanTalk() - && (!enemy.Enemy.ignorechance || KDRandom() < enemy.Enemy.ignorechance || !KinkyDungeonHasWill(0.1))) AIData.ignore = true; - if (enemy.Enemy.tags.ignoreboundhands && (!enemy.warningTiles || enemy.warningTiles.length == 0) && enemy.lifetime == undefined - && (KinkyDungeonPlayerDamage.dmg <= enemy.Enemy.armor || !KinkyDungeonHasWill(0.1)) && !KinkyDungeonPlayer.CanInteract() - && (!enemy.Enemy.ignorechance || KDRandom() < enemy.Enemy.ignorechance || !KinkyDungeonHasWill(0.1))) AIData.ignore = true; - } - if (enemy.Enemy.ignoreflag) { - for (let f of enemy.Enemy.ignoreflag) { - if (KinkyDungeonFlags.get(f)) AIData.ignore = true; - } - } - // Instead of leashing we ignore - if (enemy.Enemy.tags.leashing && !AIData.leashing && !KinkyDungeonHasWill(0.1) && !KinkyDungeonPlayer.CanInteract()) { - AIData.ignore = true; - } - if (!AIData.aggressive && !(enemy.rage > 0) && !enemy.Enemy.alwaysHostile && (!enemy.playWithPlayer || !player.player)) AIData.ignore = true; - if (AIData.distracted) AIData.ignore = true; - - // If the player is already being held by another NPC and is not resisting - if (KinkyDungeonFlags.get("PlayerDommed") && !KDPlayerDeservesPunishment(enemy, player)) AIData.ignore = true; - } - - AIData.MovableTiles = KinkyDungeonMovableTilesEnemy; - AIData.AvoidTiles = "" + KDDefaultAvoidTiles; - if (enemy.Enemy.tags && enemy.Enemy.tags.opendoors) AIData.MovableTiles = KinkyDungeonMovableTilesSmartEnemy; - if (enemy.Enemy.ethereal) { - AIData.AvoidTiles = ""; - AIData.MovableTiles = AIData.MovableTiles + "1X"; - } else if (enemy.Enemy.squeeze && KDGameData.KinkyDungeonLeashingEnemy != enemy.id) { - AIData.MovableTiles = AIData.MovableTiles + 'b'; - AIData.AvoidTiles = ""; - } - - AIData.attack = enemy.Enemy.attack; - AIData.range = enemy.Enemy.attackRange == 1 ? 1.5 : enemy.Enemy.attackRange; - AIData.width = enemy.Enemy.attackWidth; - AIData.bindLevel = KDBoundEffects(enemy); - AIData.accuracy = enemy.Enemy.accuracy ? enemy.Enemy.accuracy : 1.0; - if (enemy.distraction) AIData.accuracy = AIData.accuracy / (1 + 1.5 * enemy.distraction / enemy.Enemy.maxhp); - if (AIData.bindLevel) AIData.accuracy = AIData.accuracy / (1 + 0.5 * AIData.bindLevel); - if (enemy.blind > 0) AIData.accuracy = 0; - AIData.vibe = false; - AIData.damage = enemy.Enemy.dmgType; - AIData.power = enemy.Enemy.power; - - AIData.targetRestraintLevel = 0.25 + (enemy.aggro && !enemy.playWithPlayer ? enemy.aggro : 0) + 0.004 * (KinkyDungeonGoddessRep.Prisoner + 50); - if (enemy.aggro > 0 && delta > 0) enemy.aggro = enemy.aggro * 0.95; - if (KinkyDungeonStatsChoice.has("NoWayOut") || KinkyDungeonCanPlay(enemy) || enemy.hp < enemy.Enemy.maxhp * 0.5) AIData.targetRestraintLevel = 999; - if (enemy.Enemy.Behavior?.thorough) AIData.targetRestraintLevel = Math.max(AIData.targetRestraintLevel, enemy.Enemy.Behavior?.thorough); - AIData.addLeash = AIData.leashing && KDBoundPowerLevel >= AIData.targetRestraintLevel && (!KinkyDungeonGetRestraintItem("ItemNeck") || !KinkyDungeonGetRestraintItem("ItemNeckRestraints")); - if (!AIData.addLeash && AIData.leashing && enemy.IntentLeashPoint && (!KinkyDungeonGetRestraintItem("ItemNeck") || !KinkyDungeonGetRestraintItem("ItemNeckRestraints"))) AIData.addLeash = true; - - if (enemy.Enemy.tags && AIData.leashing && (!KinkyDungeonHasWill(0.1) || AIData.addLeash)) { - AIData.followRange = 1.5; - if (!AIData.attack.includes("Bind")) AIData.attack = "Bind" + AIData.attack; - } - - AIData.refreshWarningTiles = false; - - AIData.hitsfx = (enemy.Enemy && enemy.Enemy.hitsfx) ? enemy.Enemy.hitsfx : ""; - if (KinkyDungeonAlert && AIData.playerDist < KinkyDungeonAlert) { - if (KDPlayerLight < 1.5 && AIData.playerDist < KinkyDungeonAlert*0.5) { - if (!enemy.aware && AIData.aggressive) KDAddThought(enemy.id, "Blind", 3, 3); - } else { - if (!enemy.aware && AIData.aggressive) KDAddThought(enemy.id, "Aware", 3, 3); - enemy.aware = true; - if (!enemy.aggro) enemy.aggro = 0; - enemy.aggro += 0.1; - } - - } - let specialCondition = enemy.Enemy.specialAttack != undefined && (!enemy.specialCD || enemy.specialCD <= 0) && (!enemy.Enemy.specialMinrange || AIData.playerDist > enemy.Enemy.specialMinrange); - let specialConditionSpecial = (enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialCondition) ? KDSpecialConditions[enemy.Enemy.specialCondition].criteria(enemy, AIData) : true; - if (!enemy.attackPoints && specialCondition && specialConditionSpecial) { - AIData.attack = AIData.attack + enemy.Enemy.specialAttack; - AIData.refreshWarningTiles = !enemy.usingSpecial; - enemy.usingSpecial = true; - if (enemy.Enemy && enemy.Enemy.hitsfxSpecial) AIData.hitsfx = enemy.Enemy.hitsfxSpecial; - - if (enemy.Enemy.specialRemove) AIData.attack = AIData.attack.replace(enemy.Enemy.specialRemove, ""); - if (enemy.Enemy.specialRange && enemy.usingSpecial) { - AIData.range = enemy.Enemy.specialRange == 1 ? 1.5 : enemy.Enemy.specialRange; - } - if (enemy.Enemy.specialWidth && enemy.usingSpecial) { - AIData.width = enemy.Enemy.specialWidth; - } - if (enemy.Enemy.specialPower && enemy.usingSpecial) { - AIData.power = enemy.Enemy.specialPower; - } - if (enemy.Enemy.specialDamage && enemy.usingSpecial) { - AIData.damage = enemy.Enemy.specialDamage; - } - } - if (enemy.usingSpecial && !specialConditionSpecial) { - enemy.usingSpecial = false; - if (KDSpecialConditions[enemy.Enemy.specialCondition].resetCD) enemy.specialCD = enemy.Enemy.specialCD; - } - - AIData.addMoreRestraints = KinkyDungeonStatsChoice.has("NoWayOut") || !AIData.leashing || (AIData.attack.includes("Bind") - && ( - KDBoundPowerLevel < AIData.targetRestraintLevel // General restraint level - || (enemy.Enemy.Behavior && ( - enemy.Enemy.Behavior.ensureGroupTied?.some((group) => {return KinkyDungeonGetRestraintItem(group) != undefined;}) // Some enemies won't stop until these groups are filled - || enemy.Enemy.Behavior.ensurePlayerTag?.some((tag) => {return KinkyDungeonPlayerTags.has(tag);}) // Some enemies won't stop until these tags are had - || (KinkyDungeonStatsChoice.get("arousalMode") && - (enemy.Enemy.Behavior.ensureGroupTied?.some((group) => {return KinkyDungeonGetRestraintItem(group) != undefined;}) // Some enemies won't stop until these groups are filled - || enemy.Enemy.Behavior.ensurePlayerTag?.some((tag) => {return KinkyDungeonPlayerTags.has(tag);})))) // Some enemies won't stop until these tags are had - ) - || !KinkyDungeonIsArmsBound() // All enemies should bind arms or have ignore tag - ) - ); - - if (!enemy.Enemy.attackWhileMoving && AIData.range > AIData.followRange) { - AIData.followRange = AIData.range; - } - if (player.player && enemy.Enemy && enemy.Enemy.playerFollowRange) AIData.followRange = enemy.Enemy.playerFollowRange == 1.5 ? 1.5 : enemy.Enemy.playerFollowRange; - - if (!enemy.warningTiles) enemy.warningTiles = []; - AIData.canSensePlayer = !AIData.distracted && KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius, true, true); - AIData.canSeePlayer = !AIData.distracted && KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius, false, false); - AIData.canSeePlayerChase = !AIData.distracted && (enemy.aware ? KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.chaseRadius, false, false) : false); - AIData.canSeePlayerMedium = !AIData.distracted && KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius/1.4, false, true); - AIData.canSeePlayerClose = !AIData.distracted && KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius/2, false, true); - AIData.canSeePlayerVeryClose = !AIData.distracted && KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius/3, false, true); - AIData.canShootPlayer = !AIData.distracted && KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius, false, true); - - if (KinkyDungeonLastTurnAction && AIData.canSeePlayer) { - if (!enemy.aggro) enemy.aggro = 0; - enemy.aggro += KinkyDungeonLastTurnAction == "Struggle" ? 0.1 : - (KinkyDungeonLastTurnAction == "Spell" ? 0.3 : - (KinkyDungeonAlert ? 0.1 : - 0.01)); - } - - if ((enemy.Enemy.projectileAttack || enemy.Enemy.projectileTargeting) && (!AIData.canShootPlayer || !KinkyDungeonCheckProjectileClearance(enemy.x, enemy.y, player.x, player.y))) AIData.followRange = 1.5; - - if (!AIData.aggressive && !enemy.Enemy.alwaysHostile && !(enemy.rage > 0) && AIData.canSeePlayer && player.player && !KDAllied(enemy) - && ((!KinkyDungeonFlags.has("nojailbreak") && !KinkyDungeonPlayerInCell(true, true)) || KinkyDungeonLastTurnAction == "Struggle" || KinkyDungeonLastAction == "Struggle")) { - if (enemy.Enemy.tags.jailer || enemy.Enemy.tags.jail || enemy.Enemy.tags.leashing) { - if (KDGameData.PrisonerState == 'parole' && KinkyDungeonPlayer.CanInteract() && !KDEnemyHasFlag(enemy, "Shop")) - KinkyDungeonAggroAction('unrestrained', {enemy: enemy}); - else if ((KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail') && (KinkyDungeonLastTurnAction == "Struggle" || KinkyDungeonLastAction == "Struggle")) - KinkyDungeonAggroAction('struggle', {enemy: enemy}); - else if ( - (!KinkyDungeonFlags.has("nojailbreak") && !KinkyDungeonPlayerInCell(true, true)) - && KDGameData.PrisonerState == 'jail' - && !KDIsPlayerTethered(KinkyDungeonPlayerEntity) - && KinkyDungeonSlowLevel < 9) - KinkyDungeonAggroAction('jailbreak', {enemy: enemy}); - } - AIData.ignore = !AIData.aggressive && (!enemy.playWithPlayer || !player.player); - } - - let sneakThreshold = enemy.Enemy.sneakThreshold ? enemy.Enemy.sneakThreshold : 2; - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")) sneakThreshold = Math.max(0.1, sneakThreshold + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")); - - AIData.playAllowed = false; - AIData.startedDialogue = false; - AIData.playChance = 0.1; - if (KDGameData.JailKey) AIData.playChance += 0.25; - if (AIData.playerDist < 1.5) AIData.playChance += 0.1; - - if (!enemy.personality) enemy.personality = KDGetPersonality(enemy); - - if (AIData.playerDist < enemy.Enemy.visionRadius / 2) AIData.playChance += 0.1; - if (AIData.playerDist < 1.5) AIData.playChance += 0.3; - - if (KDAllied(enemy) || (!AIData.hostile && KDGameData.PrisonerState != "jail" && KDGameData.PrisonerState != "parole" && !KinkyDungeonStatsChoice.has("Submissive"))) AIData.playChance *= 0.07; // Drastically reduced chance to play if not hostile - else { - if (KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed) { - AIData.playChance += 0.25; - } - if (playerItems?.length > 0 || KinkyDungeonRedKeys > 0) { - AIData.playChance += 0.2; - if (playerItems.length > 6) { - AIData.playChance += 0.5; - } - } - } - if (AIData.domMe) { - AIData.playChance += 0.2; - } else if (!KDPlayerIsTied()) { - AIData.playChance *= 0.4; - } - // Reduce chance of play in combat - if (KinkyDungeonFlags.get("PlayerCombat")) AIData.playChance *= 0.2; - if (!KinkyDungeonFlags.get("wander")) AIData.playChance *= 0.75; - if (enemy.path?.length > 2) AIData.playChance *= 0.1; - if (KDGameData.otherPlaying > 0) AIData.playChance *= Math.max(0.05, 1 - 0.35 * KDGameData.otherPlaying); - - if (KDEnemyHasFlag(enemy, "Shop")) AIData.playChance = 0; - if (KinkyDungeonFlags.get("playLikely")) AIData.playChance += 0.5; - - - if (KinkyDungeonStatsChoice.get("Undeniable")) { - if (AIData.playChance < 0.1) AIData.playChance = 0.1; - else AIData.playChance = 0.9; - } - let aware = (enemy.vp > sneakThreshold || enemy.aware); - - let playData = { - playChance: AIData.playChance, - AIData: AIData, - enemy: enemy, - player: player, - }; - KinkyDungeonSendEvent("calcPlayChance", playData); - AIData.playChance = playData.playChance; - - if (KinkyDungeonCanPlay(enemy) && enemy != KinkyDungeonJailGuard() && !KinkyDungeonFlags.get("NPCCombat") && !enemy.Enemy.alwaysHostile && !(enemy.rage > 0) && !(enemy.hostile > 0) && player.player && AIData.canSeePlayer && (aware) && KDEnemyCanTalk(enemy) && !KinkyDungeonInJail(KDJailFilters)) { - AIData.playAllowed = true; - if (!(enemy.playWithPlayerCD > 0) && !(enemy.playWithPlayer > 0) && KDRandom() < AIData.playChance && !KDAllied(enemy)) { - AIData.playEvent = true; - } - } - - // Intent events - if (enemy.vp < 0.01 && !KDEnemyHasFlag(enemy, "noResetIntent")) { - KDResetIntent(enemy, AIData); - } - - if (player.player && AIData.canSeePlayer && aware && !enemy.IntentAction) { - let event = KDGetIntentEvent(enemy, AIData, AIData.playEvent, KDAllied(enemy), AIData.hostile, AIData.aggressive); - if (event) event(enemy, AIData); - } - - - if (KinkyDungeonCanPutNewDialogue() && AIData.playerDist <= KinkyDungeonMaxDialogueTriggerDist && player.player) { - let WeightTotal = 0; - let Weights = []; - for (let e of Object.entries(KDDialogueTriggers)) { - let trigger = e[1]; - let weight = 0; - if ((!trigger.blockDuringPlaytime || enemy.playWithPlayer < 1 || !enemy.playWithPlayer) - && (!trigger.noAlly || !KDAllied(enemy)) - && (!trigger.playRequired || AIData.playAllowed) - && (!trigger.noCombat || !KinkyDungeonFlags.get("NPCCombat")) - && (!trigger.nonHostile || !AIData.aggressive) - && (!trigger.allowedPrisonStates || trigger.allowedPrisonStates.includes(KDGameData.PrisonerState)) - && (!trigger.allowedPersonalities || trigger.allowedPersonalities.includes(enemy.personality)) - && (!trigger.onlyDuringPlay || enemy.playWithPlayer > 0 - || (trigger.allowPlayExceptionSub && KDIsSubmissiveEnough(enemy)))) { - let end = false; - if (trigger.excludeTags) { - for (let tt of trigger.excludeTags) { - if (enemy.Enemy.tags[tt]) { - end = true; - break; - } - } - } - if (!end && trigger.requireTags) { - for (let tt of trigger.requireTags) { - if (!enemy.Enemy.tags[tt]) { - end = true; - break; - } - } - } - let hastag = !trigger.requireTagsSingle; - if (!end && trigger.requireTagsSingle) { - for (let tt of trigger.requireTagsSingle) { - if (enemy.Enemy.tags[tt]) { - hastag = true; - break; - } - } - } - if (!hastag) end = true; - if (!end && (!trigger.prerequisite || trigger.prerequisite(enemy, AIData.playerDist, AIData))) { - weight = trigger.weight(enemy, AIData.playerDist); - } - } - if (weight > 0) { - Weights.push({t: trigger, weight: WeightTotal}); - WeightTotal += weight; - } - } - - let selection = KDRandom() * WeightTotal; - - for (let L = Weights.length - 1; L >= 0; L--) { - if (selection > Weights[L].weight) { - KDStartDialog(Weights[L].t.dialogue,enemy.Enemy.name, true, enemy.personality, enemy); - AIData.startedDialogue = true; - } - } - } - - let intentAction = enemy.IntentAction && KDIntentEvents[enemy.IntentAction] ? KDIntentEvents[enemy.IntentAction] : null; - - if (!AIData.aggressive && player.player && (enemy.playWithPlayer || (intentAction && intentAction.forceattack))) AIData.ignore = false; - - AIData.sneakMult = 0.25; - if (AIData.canSeePlayerMedium) AIData.sneakMult += 0.45; - if (AIData.canSeePlayerClose) AIData.sneakMult += 0.25; - if (AIData.canSeePlayerVeryClose) AIData.sneakMult += 0.5; - if (KinkyDungeonAlert > 0) AIData.sneakMult += 1; - if ((AIData.canSensePlayer || AIData.canSeePlayer || AIData.canShootPlayer || AIData.canSeePlayerChase) && KinkyDungeonTrackSneak(enemy, delta * (AIData.sneakMult), player, (AIData.canSensePlayer) ? 0 : (enemy.Enemy.tags.darkvision ? 0.5 : 1.5))) { - if (!KDEnemyHasFlag(enemy, "StayHere")) { - if (KDEnemyHasFlag(enemy, "Defensive")) { - enemy.gx = KinkyDungeonPlayerEntity.x; - enemy.gy = KinkyDungeonPlayerEntity.y; - } else if (!AIData.ignore && (AIData.aggressive || enemy.playWithPlayer || !KDEnemyHasFlag(enemy, "NoFollow"))) { - let pp = KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, true); - if (pp) { - enemy.gx = pp.x; - enemy.gy = pp.y; - } else { - enemy.gx = player.x; - enemy.gy = player.y; - } - } - } - if (AIData.canSensePlayer || AIData.canSeePlayer || AIData.canShootPlayer) { - if (!enemy.aware && AIData.aggressive) KDAddThought(enemy.id, "Aware", 3, 3); - enemy.aware = true; - // Share aggro - if (AIData.hostile && AIData.aggressive && !enemy.rage && !enemy.Enemy.tags.minor && (!(enemy.silence > 0 || enemy.Enemy.tags.gagged) || enemy.Enemy.tags.alwaysAlert)) { - for (let e of KinkyDungeonEntities) { - if (KDHostile(e) && KinkyDungeonAggressive(e) && !enemy.rage && e != enemy && KDistChebyshev(e.x - enemy.x, e.y - enemy.y) <= KinkyDungeonEnemyAlertRadius) { - if (player.player && KDPlayerLight < 1.5) { - if (!e.aware) { - KDAddThought(e.id, "Blind", 3, 3); - e.path = null; - let pp = KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, true); - if (pp) { - e.gx = pp.x; - e.gy = pp.y; - } else { - e.gx = player.x; - e.gy = player.y; - } - - } - } else { - if (!e.aware) KDAddThought(e.id, "Confused", 3, 3); - e.aware = true; - } - - } - } - } - } - } - - AIData.ignoreRanged = AIData.canShootPlayer && KinkyDungeonAllRestraint().some((r) => {return KDRestraint(r).ignoreSpells;}); - // Close the gap to leash - if ((AIData.ignoreRanged || (!enemy.Enemy.alwaysKite && AIData.harmless)) && AIData.leashing) AIData.followRange = 1.5; - if (enemy == KinkyDungeonJailGuard()) AIData.followRange = 1.5; - - AIData.kite = false; - AIData.kiteChance = enemy.Enemy.kiteChance ? enemy.Enemy.kiteChance : 0.75; - if (AIData.canSeePlayer && (!player.player || AIData.aggressive) && enemy.Enemy && enemy.Enemy.kite && !enemy.usingSpecial && (!player.player || KinkyDungeonHasWill(0.1)) && (enemy.attackPoints <= 0 || enemy.Enemy.attackWhileMoving) && AIData.playerDist <= enemy.Enemy.kite && (AIData.hostile || !player.player)) { - if (!enemy.Enemy.dontKiteWhenDisabled || !(KDPlayerIsDisabled())) - if (!enemy.Enemy.noKiteWhenHarmless || !AIData.harmless) - if (AIData.kiteChance >= 1 || KDRandom() < AIData.kiteChance) - if (!AIData.ignoreRanged) - AIData.kite = true; - } - - if (!AIData.aggressive && player.player && (enemy.playWithPlayer || KDAllied(enemy))) { - if (AIData.domMe && KDIsBrat(enemy)) { - AIData.followRange = 3.9; - AIData.kite = true; - } else - AIData.followRange = 1.5; - } - - if ((AIType.resetguardposition(enemy, player, AIData)) && (!enemy.gxx || !enemy.gyy)) { - enemy.gxx = enemy.gx; - enemy.gyy = enemy.gy; - } - // Movement loop - - // If an enemy was trying to attack the player but the player got behind them somehow, they get stunned - let flanked = KDCheckVulnerableBackstab(enemy); - if (player.player && flanked && !enemy.stun && !enemy.Enemy.tags.nosurpriseflank && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { - enemy.stun = 1; - } - - if (!AIData.startedDialogue) { - if ( - !AIType.beforemove(enemy, player, AIData) - && ( - (enemy.Enemy.attackWhileMoving && enemy != KinkyDungeonLeashingEnemy()) - || AIData.ignore - || !(KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.followRange, enemy.attackPoints < 1 || !(enemy.Enemy.projectileTargeting || enemy.Enemy.projectileAttack), false) && enemy.aware) - || AIData.kite - ) - ) { - if (!enemy.gx) enemy.gx = enemy.x; - if (!enemy.gy) enemy.gy = enemy.y; - - AIData.idle = true; - AIData.patrolChange = false; - AIData.followPlayer = false; - AIData.dontFollow = false; - - if (AIType.follower(enemy, player, AIData)) { - if (KDAllied(enemy) && player.player) { - if (!KDEnemyHasFlag(enemy, "NoFollow") && !KDEnemyHasFlag(enemy, "StayHere")) { - AIData.followPlayer = true; - } else { - AIData.dontFollow = true; - if (enemy.gx == player.x && enemy.gy == player.y && !KDEnemyHasFlag(enemy, "StayHere")) { - //enemy.gx = undefined; - //enemy.gy = undefined; - } - } - } else { - if (KDEnemyHasFlag(enemy, "Defensive") && !KDEnemyHasFlag(enemy, "StayHere")) { - enemy.gx = KinkyDungeonPlayerEntity.x; - enemy.gy = KinkyDungeonPlayerEntity.y; - } - if (KDEnemyHasFlag(enemy, "StayHere") || KDEnemyHasFlag(enemy, "Defensive")) AIData.dontFollow = true; - if (AIData.hostile) { - KinkyDungeonSetEnemyFlag(enemy, "StayHere", 0); - KinkyDungeonSetEnemyFlag(enemy, "Defensive", 0); - } else if (!KDAllied(enemy)) { - KinkyDungeonSetEnemyFlag(enemy, "Defensive", 0); - } - } - } - - // try 12 times to find a moveable tile, with some random variance - if ( - !KDIsImmobile(enemy) && - AIType.chase(enemy, player, AIData) - && !AIData.ignore - && !AIData.dontFollow - && (enemy.aware || AIData.followPlayer) - && AIData.playerDist <= AIData.chaseRadius - && (enemy.gx != enemy.x || enemy.gy != enemy.y || enemy.path || enemy.fx || enemy.fy)) { - //enemy.aware = true; - - for (let T = 0; T < 12; T++) { - let dir = KDGetDir(enemy, player); - let splice = false; - if (T > 2 && T < 8) dir = KinkyDungeonGetDirectionRandom(dir.x * 10, dir.y * 10); // Fan out a bit - if (T >= 8 || (enemy.path && !AIData.canSeePlayer) || (!AIData.canSeePlayer && !(enemy.Enemy.stopToCast && AIData.canShootPlayer))) { - if (!enemy.path && (KinkyDungeonAlert || (enemy.vp > 0 && enemy.aware) || AIData.canSeePlayer)) { - if (!AIData.canSeePlayer) { - if (AIData.canShootPlayer) { - KDAddThought(enemy.id, "Shoot", 4, 2); - } else if (AIData.canSensePlayer) { - KDAddThought(enemy.id, "Sense", 2, 6); - } else { - KDAddThought(enemy.id, "Search", 2, 6); - } - } - enemy.path = KinkyDungeonFindPath(enemy.x, enemy.y, player.x, player.y, - KDEnemyHasFlag(enemy, "blocked"), KDEnemyHasFlag(enemy, "blocked"), - enemy == KinkyDungeonLeashingEnemy() || AIData.ignoreLocks, AIData.MovableTiles, - undefined, undefined, undefined, enemy, enemy != KinkyDungeonJailGuard() && !KDEnemyHasFlag(enemy, "longPath")); // Give up and pathfind - } if (enemy.path && enemy.path.length > 0 && Math.max(Math.abs(enemy.path[0].x - enemy.x),Math.abs(enemy.path[0].y - enemy.y)) < 1.5) { - dir = {x: enemy.path[0].x - enemy.x, y: enemy.path[0].y - enemy.y, delta: KDistChebyshev(enemy.path[0].x - enemy.x, enemy.path[0].y - enemy.y)}; - if (!KinkyDungeonNoEnemyExceptSub(enemy.x + dir.x, enemy.y + dir.y, false, enemy) - || !AIData.MovableTiles.includes(KinkyDungeonMapGet(enemy.path[0].x, enemy.path[0].y))) { - enemy.path = undefined; - KinkyDungeonSetEnemyFlag(enemy, "failpath", enemy == KinkyDungeonJailGuard() ? 2 : 20); - KinkyDungeonSetEnemyFlag(enemy, "blocked", 24); - } - splice = true; - } else { - enemy.path = undefined; - KinkyDungeonSetEnemyFlag(enemy, "failpath", enemy == KinkyDungeonJailGuard() ? 2 : 20); - if (!AIData.canSensePlayer) { - if (enemy.aware) KDAddThought(enemy.id, "Lose", 1, 4); - enemy.aware = false; - } - - //dir = KinkyDungeonGetDirectionRandom(0, 0); // Random... - } - } - if (dir.delta > 1.5) { - enemy.path = undefined; - KinkyDungeonSetEnemyFlag(enemy, "failpath", 20); - } - else if (KinkyDungeonEnemyCanMove(enemy, dir, AIData.MovableTiles, AIData.AvoidTiles, AIData.ignoreLocks, T)) { - if (KinkyDungeonEnemyTryMove(enemy, dir, delta, enemy.x + dir.x, enemy.y + dir.y)) AIData.moved = true; - if (AIData.moved && splice && enemy.path) enemy.path.splice(0, 1); - AIData.idle = false; - - // If we moved we will pick a candidate for next turns attempt - if (AIData.moved) { - dir = KDGetDir(enemy, player); - if (KinkyDungeonEnemyCanMove(enemy, dir, AIData.MovableTiles, AIData.AvoidTiles, AIData.ignoreLocks, T)) { - enemy.fx = enemy.x + dir.x; - enemy.fy = enemy.y + dir.y; - } - } - break; - } else { - enemy.fx = undefined; - enemy.fy = undefined; - } - } - } else if (!KDIsImmobile(enemy) && AIType.move(enemy, player, AIData) && (Math.abs(enemy.x - enemy.gx) > 0 || Math.abs(enemy.y - enemy.gy) > 0)) { - if (enemy.aware) { - enemy.path = undefined; - } - enemy.aware = false; - for (let T = 0; T < 8; T++) { - let dir = KDGetDir(enemy, {x: enemy.gx, y: enemy.gy}); - let splice = false; - if (T > 2 && T < 8) dir = KinkyDungeonGetDirectionRandom(dir.x * 10, dir.y * 10); // Fan out a bit - if (T >= 8 || enemy.path || !KinkyDungeonCheckPath(enemy.x, enemy.y, enemy.gx, enemy.gy)) { - if (!enemy.path && !KDEnemyHasFlag(enemy, "genpath")) { - enemy.path = KinkyDungeonFindPath( - enemy.x, enemy.y, enemy.gx, enemy.gy, - enemy == KinkyDungeonJailGuard() || KDEnemyHasFlag(enemy, "blocked"), KDEnemyHasFlag(enemy, "blocked"), - enemy == KinkyDungeonLeashingEnemy() || AIData.ignoreLocks, AIData.MovableTiles, - undefined, undefined, undefined, enemy, enemy != KinkyDungeonJailGuard() && !KDEnemyHasFlag(enemy, "longPath")); // Give up and pathfind - KinkyDungeonSetEnemyFlag(enemy, "genpath", enemy == KinkyDungeonJailGuard() ? 1 : 100); - } - if (enemy.path && enemy.path.length > 0 && Math.max(Math.abs(enemy.path[0].x - enemy.x),Math.abs(enemy.path[0].y - enemy.y)) < 1.5) { - dir = {x: enemy.path[0].x - enemy.x, y: enemy.path[0].y - enemy.y, delta: KDistChebyshev(enemy.path[0].x - enemy.x, enemy.path[0].y - enemy.y)}; - if (!KinkyDungeonNoEnemyExceptSub(enemy.x + dir.x, enemy.y + dir.y, false, enemy) - || !AIData.MovableTiles.includes(KinkyDungeonMapGet(enemy.path[0].x, enemy.path[0].y))) { - enemy.path = undefined; - KinkyDungeonSetEnemyFlag(enemy, "failpath", enemy == KinkyDungeonJailGuard() ? 2 : 20); - KinkyDungeonSetEnemyFlag(enemy, "blocked", 24); - } - splice = true; - } else { - enemy.path = undefined; - KinkyDungeonSetEnemyFlag(enemy, "failpath", enemy == KinkyDungeonJailGuard() ? 2 : 20); - } - } - if (dir.delta > 1.5) {enemy.path = undefined;} - else if (KinkyDungeonEnemyCanMove(enemy, dir, AIData.MovableTiles, AIData.AvoidTiles, AIData.ignoreLocks, T)) { - if (KinkyDungeonEnemyTryMove(enemy, dir, delta, enemy.x + dir.x, enemy.y + dir.y)) AIData.moved = true; - if (AIData.moved && splice && enemy.path) enemy.path.splice(0, 1); - AIData.idle = false;// If we moved we will pick a candidate for next turns attempt - if (AIData.moved) { - dir = KDGetDir(enemy, {x: enemy.gx, y: enemy.gy}); - if (KinkyDungeonEnemyCanMove(enemy, dir, AIData.MovableTiles, AIData.AvoidTiles, AIData.ignoreLocks, T)) { - enemy.fx = enemy.x + dir.x; - enemy.fy = enemy.y + dir.y; - } - } - break; - } else { - enemy.fx = undefined; - enemy.fy = undefined; - if (KinkyDungeonPlayerEntity.x == enemy.x + dir.x && KinkyDungeonPlayerEntity.y == enemy.y + dir.y) enemy.path = undefined; - } - } - } else if (Math.abs(enemy.x - enemy.gx) < 2 || Math.abs(enemy.y - enemy.gy) < 2) AIData.patrolChange = true; - - if (!KDIsImmobile(enemy) && !AIType.aftermove(enemy, player, AIData)) { - if (AIType.resetguardposition(enemy, player, AIData) && !AIData.followPlayer && Math.max(Math.abs(enemy.x - enemy.gx), Math.abs(enemy.y - enemy.gy)) < 1.5 && enemy.gxx && enemy.gyy) { - enemy.gx = enemy.gxx; - enemy.gy = enemy.gyy; - } - let wanderfar = AIType.wander_far(enemy, player, AIData); - let wandernear = AIType.wander_near(enemy, player, AIData); - if ((wanderfar || wandernear) && !AIData.followPlayer && (!enemy.Enemy.allied && !KDEnemyHasFlag(enemy, "StayHere")) && !KDEnemyHasFlag(enemy, "StayHere") && enemy.movePoints < 1 && (!enemy.aware || !AIData.aggressive)) { - if ((Math.max(Math.abs(enemy.x - enemy.gx), Math.abs(enemy.y - enemy.gy)) < 1.5 || (KDRandom() < 0.02 && KDEnemyHasFlag(enemy, "failpath"))) || (!(enemy.vp > 0.05) && (!enemy.path || KDRandom() < 0.1))) { - AIData.master = KinkyDungeonFindMaster(enemy).master; - if (!KDEnemyHasFlag(enemy, "wander")) { - if (!AIData.master && wanderfar) { - if (!AIType.wanderfar_func || !AIType.wanderfar_func(enemy, player, AIData)) { - // long distance hunt - let newPoint = KinkyDungeonGetRandomEnemyPoint(false, enemy.tracking && KinkyDungeonHuntDownPlayer && KDGameData.PrisonerState != "parole" && KDGameData.PrisonerState != "jail"); - if (newPoint) { - enemy.gx = newPoint.x; - enemy.gy = newPoint.y; - } - } - KinkyDungeonSetEnemyFlag(enemy, "wander", AIType.wanderDelay_long(enemy) || 50); - } else if (wandernear) { - KinkyDungeonSetEnemyFlag(enemy, "wander", AIType.wanderDelay_short(enemy) || 20); - if (!AIType.wandernear_func || !AIType.wandernear_func(enemy, player, AIData)) { - if (KinkyDungeonAlert && AIData.playerDist < Math.max(4, AIData.visionRadius)) { - enemy.gx = KinkyDungeonPlayerEntity.x; - enemy.gy = KinkyDungeonPlayerEntity.y; - } else { - // Short distance - let ex = enemy.x; - let ey = enemy.y; - let cohesion = enemy.Enemy.cohesion ? enemy.Enemy.cohesion : 0.5; - let masterCloseness = enemy.Enemy.cohesion ? enemy.Enemy.cohesion : 0.7; - if (AIData.master && KDRandom() < masterCloseness) { - ex = AIData.master.x; - ey = AIData.master.y; - } else if (KDRandom() < cohesion) { - let minDist = enemy.Enemy.cohesionRange ? enemy.Enemy.cohesionRange : AIData.visionRadius; - for (let e of KinkyDungeonEntities) { - if (e == enemy) continue; - if (['guard', 'ambush'].includes(KDGetAI(enemy))) continue; - if (!( - (enemy.Enemy.clusterWith && !e.Enemy.tags[enemy.Enemy.clusterWith]) - || e.Enemy.clusterWith && !enemy.Enemy.tags[enemy.Enemy.clusterWith] - )) continue; - if (KDGetFaction(e) != KDGetFaction(enemy)) continue; - if (KinkyDungeonTilesGet(e.x + "," + e.y) && KinkyDungeonTilesGet(e.x + "," + e.y).OffLimits) continue; - let dist = KDistEuclidean(e.x - enemy.x, e.y - enemy.y); - if (dist < minDist) { - minDist = dist; - let ePoint = KinkyDungeonGetNearbyPoint(ex, ey, false); - if (ePoint) { - ex = ePoint.x; - ey = ePoint.y; - } - } - } - } - let newPoint = KinkyDungeonGetNearbyPoint(ex, ey, false); - if (newPoint && (KDGetFaction(enemy) != "Player" || !KinkyDungeonPointInCell(newPoint.x, newPoint.y))) { - if (!AIType.strictwander || KinkyDungeonCheckPath(enemy.x, enemy.y, newPoint.x, newPoint.y)) { - enemy.gx = newPoint.x; - enemy.gy = newPoint.y; - } - } - } - } - } - } - } - } - } - } - } - - if (enemy.usingSpecial && !enemy.specialCD) enemy.specialCD = 0; - - let minRange = enemy.Enemy.attackMinRange || 0; - if (enemy.usingSpecial && enemy.Enemy.specialMinRange != undefined) minRange = enemy.Enemy.specialMinRange; - - // Attack loop - AIData.playerDist = Math.sqrt((enemy.x - player.x)*(enemy.x - player.x) + (enemy.y - player.y)*(enemy.y - player.y)); - let canAttack = !(enemy.disarm > 0) - && (!enemy.Enemy.followLeashedOnly || KDPlayerDeservesPunishment(enemy, player) || KDGameData.KinkyDungeonLeashedPlayer < 1 || KDGameData.KinkyDungeonLeashingEnemy == enemy.id) - && ((AIData.hostile || (enemy.playWithPlayer && player.player && !AIData.domMe)) || (!player.player && (!player.Enemy || KDHostile(player) || enemy.rage))) - && ((enemy.aware && KDCanDetect(enemy, player)) || (!KDAllied(enemy) && !AIData.hostile)) - && !AIData.ignore - && (!minRange || (AIData.playerDist > minRange)) - && (AIData.attack.includes("Melee") || (enemy.Enemy.tags && AIData.leashing && !KinkyDungeonHasWill(0.1))) - && (!AIData.ignoreRanged || AIData.playerDist < 1.5) - && AIType.attack(enemy, player, AIData) - && KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.range, !enemy.Enemy.projectileAttack, !enemy.Enemy.projectileAttack); - if (canAttack) {//Player is adjacent - AIData.idle = false; - enemy.revealed = true; - - let dir = KinkyDungeonGetDirection(player.x - enemy.x, player.y - enemy.y); - - if (enemy.usingSpecial && !specialConditionSpecial) { - enemy.usingSpecial = false; - if (KDSpecialConditions[enemy.Enemy.specialCondition].resetCD) enemy.specialCD = enemy.Enemy.specialCD; - } - - if (!AIData.moved || enemy.Enemy.attackWhileMoving) { - let moveMult = KDBoundEffects(enemy) * 0.5; - let attackMult = KinkyDungeonGetBuffedStat(enemy.buffs, "AttackSlow"); - let attackTiles = enemy.warningTiles ? enemy.warningTiles : [dir]; - let ap = (KinkyDungeonMovePoints < 0 && !KinkyDungeonHasWill(0.1) && KDGameData.KinkyDungeonLeashingEnemy == enemy.id) ? enemy.Enemy.movePoints+moveMult+1 : enemy.Enemy.attackPoints + attackMult; - if (!KinkyDungeonEnemyTryAttack(enemy, player, attackTiles, delta, enemy.x + dir.x, enemy.y + dir.y, (enemy.usingSpecial && enemy.Enemy.specialAttackPoints) ? enemy.Enemy.specialAttackPoints : ap, undefined, undefined, enemy.usingSpecial, AIData.refreshWarningTiles, AIData.attack, AIData.MovableTiles)) { - if (enemy.warningTiles.length == 0 || (AIData.refreshWarningTiles && enemy.usingSpecial)) { - let minrange = enemy.Enemy.tilesMinRange ? enemy.Enemy.tilesMinRange : 1; - if (enemy.usingSpecial && enemy.Enemy.tilesMinRangeSpecial) minrange = enemy.Enemy.tilesMinRangeSpecial; - if ((!enemy.usingSpecial && enemy.attackPoints > 0) || enemy.specialCD < 1) { - enemy.fx = player.x; - enemy.fy = player.y; - enemy.warningTiles = KinkyDungeonGetWarningTiles(player.x - enemy.x, player.y - enemy.y, AIData.range, AIData.width, minrange); - let playerIn = false; - for (let tile of enemy.warningTiles) { - if (KinkyDungeonPlayerEntity.x == enemy.x + tile.x && KinkyDungeonPlayerEntity.y == enemy.y + tile.y) {playerIn = true; break;} - } - if (!playerIn) { - enemy.fx = player.x; - enemy.fy = player.y; - } - } - if (AIData.refreshWarningTiles && enemy.usingSpecial) enemy.attackPoints = Math.min(enemy.attackPoints, delta); - } else { - let playerIn = false; - for (let tile of enemy.warningTiles) { - if (player.x == enemy.x + tile.x && player.y == enemy.y + tile.y) {playerIn = true; break;} - } - if (!playerIn) { - if (enemy.Enemy.specialRange && enemy.usingSpecial && enemy.Enemy.specialCDonAttack) { - enemy.specialCD = enemy.Enemy.specialCD; - if (enemy.Enemy.stunOnSpecialCD) enemy.stun = enemy.Enemy.stunOnSpecialCD; - if (AIData.attack.includes("Dash") && enemy.Enemy.dashOnMiss) { - KDDash(enemy, player, AIData.MovableTiles); - } - } - if (enemy.Enemy.specialWidth && enemy.usingSpecial && enemy.Enemy.specialCDonAttack) { - enemy.specialCD = enemy.Enemy.specialCD; - if (enemy.Enemy.stunOnSpecialCD) enemy.stun = enemy.Enemy.stunOnSpecialCD; - if (AIData.attack.includes("Dash") && enemy.Enemy.dashOnMiss) { - KDDash(enemy, player, AIData.MovableTiles); - } - } - } - } - - let playerEvasion = (player.player) ? KinkyDungeonPlayerEvasion() - : KinkyDungeonMultiplicativeStat(((player.Enemy && player.Enemy.evasion) ? player.Enemy.evasion : 0)) * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(player.buffs, "Evasion")); - if (AIData.playerDist < 1.5 && player.player && AIData.attack.includes("Bind") && enemy.Enemy.bound && KDRandom() * AIData.accuracy <= playerEvasion && KinkyDungeonMovePoints > -1 && KinkyDungeonTorsoGrabCD < 1 && KinkyDungeonLastAction == "Move") { - let caught = false; - for (let tile of enemy.warningTiles) { - if (enemy.x + tile.x == player.x && enemy.y + tile.y == player.y) { - caught = true; - break; - } - } - if (caught) { - let harnessChance = 0; - let harnessRestraintName = ""; - let list = KinkyDungeonAllRestraint(); - let list2 = []; - for (let restraint of list) { - if (KDRestraint(restraint) && KDRestraint(restraint).harness) { - harnessChance += 1; - list2.push(KDRestraint(restraint).name); - } - } - let rest = list2[Math.floor(KDRandom() * list2.length)]; - if (rest) harnessRestraintName = rest; - - if (harnessChance > 0) { - let roll = KDRandom(); - let bonus = 0; - if (!KinkyDungeonCanStand()) bonus += KinkyDungeonTorsoGrabChanceBonus; - if (KinkyDungeonStatWill < 0.01) bonus += KinkyDungeonTorsoGrabChanceBonus; - for (let T = 0; T < harnessChance; T++) { - roll = Math.min(roll, KDRandom()); - } - if (roll < KinkyDungeonTorsoGrabChance + bonus) { - KinkyDungeonMovePoints = -1; - let msg = TextGet("KinkyDungeonTorsoGrab").replace("RestraintName", TextGet("Restraint" + harnessRestraintName)).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)); - - KinkyDungeonSendTextMessage(5, msg, "yellow", 1); - - if (KDRandom() < actionDialogueChance) - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (enemy.Enemy.playLine ? enemy.Enemy.playLine : "") + "Grab").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 4); - - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Grab.ogg", enemy); - KinkyDungeonTorsoGrabCD = 2; - } - } - } - } - } else { // Attack lands! - enemy.revealed = true; - let hit = ((enemy.usingSpecial && enemy.Enemy.specialAttackPoints) ? enemy.Enemy.specialAttackPoints : ap) <= 1; - for (let tile of enemy.warningTiles) { - if (enemy.x + tile.x == player.x && enemy.y + tile.y == player.y) { - hit = true; - break; - } - } - - let playerEvasion = (player.player) ? KinkyDungeonPlayerEvasion() - : KinkyDungeonMultiplicativeStat(((player.Enemy && player.Enemy.evasion) ? player.Enemy.evasion : 0)) * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(player.buffs, "Evasion")); - - if (hit) { - if (player.player) { - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "incomingHit", 1); - } else - KinkyDungeonTickBuffTag(player.buffs, "incomingHit", 1); - } - - let missed = KDRandom() > playerEvasion * AIData.accuracy; - let preData = { - attack: AIData.attack, - enemy: enemy, - damagetype: AIData.damage, - attacker: enemy, - target: player, - missed: missed, - hit: hit, - }; - KinkyDungeonSendEvent("beforeAttack", preData); - - if (hit && missed) { - if (player.player) { - KinkyDungeonSendEvent("miss", {enemy: enemy, player: player}); - KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonAttackMiss").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "lightgreen", 1); - - if (KDRandom() < actionDialogueChance) - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (enemy.Enemy.playLine ? enemy.Enemy.playLine : "") + "Miss").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 4); - } - KDAddThought(enemy.id, "Annoyed", 4, 1); - enemy.vulnerable = Math.max(enemy.vulnerable, 1); - hit = false; - } - if (hit) { - if (KDRandom() < actionDialogueChanceIntense) - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (enemy.Enemy.playLine ? enemy.Enemy.playLine : "") + "HitPlayer").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 3, 5); - let replace = []; - let restraintAdd = []; - let restraintFromInventory = []; - let willpowerDamage = 0; - let msgColor = "#ffff00"; - let Locked = false; - let Stun = false; - let Blind = false; - let priorityBonus = 0; - let addedRestraint = false; - - let happened = 0; - let bound = 0; - - if (player.player) { - if (player.player && AIData.playerDist < AIData.range && (AIData.aggressive || AIData.attack.includes("Pull") || enemy.IntentLeashPoint) && (((!enemy.Enemy.noLeashUnlessExhausted || !KinkyDungeonHasWill(0.1)) && enemy.Enemy.tags && AIData.leashing && KDGetFaction(enemy) != "Ambush") || AIData.attack.includes("Pull") || enemy.IntentLeashPoint) && (KDGameData.KinkyDungeonLeashedPlayer < 1 || KDGameData.KinkyDungeonLeashingEnemy == enemy.id)) { - AIData.intentToLeash = true; - - let wearingLeash = false; - if (!wearingLeash && !AIData.attack.includes("Pull")) - wearingLeash = KinkyDungeonIsWearingLeash(); - AIData.leashed = wearingLeash || AIData.attack.includes("Pull"); - - if (AIData.leashed) { - - let leashToExit = AIData.leashing && !KinkyDungeonHasWill(0.1) && AIData.playerDist < 1.5; - - AIData.nearestJail = KinkyDungeonNearestJailPoint(enemy.x, enemy.y); - if (KinkyDungeonFlags.has("LeashToPrison")) AIData.nearestJail = Object.assign({type: "jail", radius: 1}, KinkyDungeonStartPosition); - let leashPos = AIData.nearestJail; - let findMaster = undefined; - if (!leashToExit && enemy.Enemy.pullTowardSelf && (Math.abs(player.x - enemy.x) > 1.5 || Math.abs(player.y - enemy.y) > 1.5)) { - findMaster = enemy; - if (findMaster) leashPos = {x: findMaster.x, y: findMaster.y, type: "", radius: 1}; - } else { - if (AIData.attack.includes("Pull") && enemy.Enemy.master) { - /*let masterDist = 1000; - for (let e of KinkyDungeonEntities) { - let dist = Math.sqrt((e.x - enemy.x) * (e.x - enemy.x) + (e.y - enemy.y)*(e.y - enemy.y)); - if ((!enemy.Enemy.master.maxDist || dist < enemy.Enemy.master.maxDist) - && dist < masterDist - && (!enemy.Enemy.master.loose || KinkyDungeonCheckLOS(enemy, e, dist, 100, false))) { - masterDist = Math.sqrt((e.x - enemy.x) * (e.x - enemy.x) + (e.y - enemy.y)*(e.y - enemy.y)); - findMaster = e; - } - }*/ - let fm = KinkyDungeonFindMaster(enemy); - findMaster = fm.master; - if (findMaster) leashPos = {x: findMaster.x, y: findMaster.y, type: "", radius: 1}; - } - } - - if (enemy.IntentLeashPoint) leashPos = enemy.IntentLeashPoint; - - if (AIData.playerDist < 1.5 || !KinkyDungeonGetRestraintItem("ItemDevices")) - AIData.leashPos = leashPos; - } - } - - if (AIData.attack.includes("Lock") && KinkyDungeonPlayerGetLockableRestraints().length > 0) { - let Lockable = KinkyDungeonPlayerGetLockableRestraints(); - let Lstart = 0; - let Lmax = Lockable.length-1; - if (!enemy.Enemy.attack.includes("LockAll")) { - Lstart = Math.floor(Lmax*KDRandom()); // Lock one at random - } - for (let L = Lstart; L <= Lmax; L++) { - let l = enemy.Enemy.attackLock ? KDProcessLock(enemy.Enemy.attackLock) : KinkyDungeonGenerateLock(true); - KinkyDungeonLock(Lockable[L], l); // Lock it! - priorityBonus += KDRestraint(Lockable[L]).power; - } - Locked = true; - happened += 1; - if (enemy.usingSpecial && Locked && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Lock")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - if (KDRandom() < actionDialogueChanceIntense) - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (enemy.Enemy.playLine ? enemy.Enemy.playLine : "") + "Lock").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 4); - - } else if (AIData.attack.includes("Bind") - && ((!enemy.usingSpecial && !enemy.Enemy.bindOnDisable) || (enemy.usingSpecial && !enemy.Enemy.bindOnDisableSpecial) || !KinkyDungeonHasWill(0.01) || !KinkyDungeonHasStamina(2.5) || KinkyDungeonPlayer.Pose.includes("Kneel") || KinkyDungeonPlayer.Pose.includes("Hogtie"))) { - - if (AIData.addMoreRestraints || AIData.addLeash || enemy.usingSpecial) { - if (!AIData.intentToLeash && !KinkyDungeonFlags.get("Released") && enemy.Enemy.bound - && KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y) && KDGameData.KinkyDungeonLeashedPlayer < 1 - && KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture - && !KinkyDungeonPlayerTags.has("Furniture") - && KDFurniture[KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture]) { - let furn = KDFurniture[KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture]; - if (furn) { - let rest = KinkyDungeonGetRestraint( - {tags: [furn.restraintTag]}, MiniGameKinkyDungeonLevel, - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - true, - "", - true, - false, - false); - replace.push({keyword:"RestraintAdded", value: TextGet("Restraint" + rest.name)}); - restraintAdd.push(rest); - addedRestraint = true; - } - } else { - let numTimes = 1; - if (enemy.Enemy.multiBind) numTimes = enemy.Enemy.multiBind; - for (let times = 0; times < numTimes; times++) { - // Note that higher power enemies get a bonus to the floor restraints appear on - let rThresh = enemy.Enemy.RestraintFilter?.powerThresh || KDDefaultRestraintThresh; - let rest = KinkyDungeonGetRestraint( - {tags: KDGetTags(enemy, enemy.usingSpecial)}, MiniGameKinkyDungeonLevel, - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - enemy.Enemy.bypass, - enemy.Enemy.useLock ? enemy.Enemy.useLock : "", - !(enemy.Enemy.ignoreStaminaForBinds || (enemy.usingSpecial && enemy.Enemy.specialIgnoreStam)) && !AIData.attack.includes("Suicide"), - !AIData.addMoreRestraints && !enemy.usingSpecial && AIData.addLeash, - !(KinkyDungeonStatsChoice.has("TightRestraints") || enemy.Enemy.tags.miniboss || enemy.Enemy.tags.boss), - KDGetExtraTags(enemy, enemy.usingSpecial), - false, - { - //minPower: rThresh, - //onlyLimited: !enemy.Enemy.RestraintFilter?.limitedRestraintsOnly, - looseLimit: true, - require: enemy.Enemy.RestraintFilter?.unlimitedRestraints ? undefined : enemy.items, - }, enemy); - - if (!rest) { - rest = KinkyDungeonGetRestraint( - {tags: KDGetTags(enemy, enemy.usingSpecial)}, MiniGameKinkyDungeonLevel, - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - enemy.Enemy.bypass, - enemy.Enemy.useLock ? enemy.Enemy.useLock : "", - !(enemy.Enemy.ignoreStaminaForBinds || (enemy.usingSpecial && enemy.Enemy.specialIgnoreStam)) && !AIData.attack.includes("Suicide"), - !AIData.addMoreRestraints && !enemy.usingSpecial && AIData.addLeash, - !(KinkyDungeonStatsChoice.has("TightRestraints") || enemy.Enemy.tags.miniboss || enemy.Enemy.tags.boss), - KDGetExtraTags(enemy, enemy.usingSpecial), - false, - { - maxPower: rThresh + 0.01, - looseLimit: true, - onlyUnlimited: true, - ignore: enemy.items, - }, enemy); - } else { - restraintFromInventory.push(rest.name); - } - if (rest) { - replace.push({keyword:"RestraintAdded", value: TextGet("Restraint" + rest.name)}); - restraintAdd.push(rest); - addedRestraint = true; - } - } - if (enemy.usingSpecial && addedRestraint && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Bind")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - if (!addedRestraint && enemy.Enemy.fullBoundBonus) { - willpowerDamage += enemy.Enemy.fullBoundBonus; // Some enemies deal bonus damage if they cannot put a binding on you - } - } - } else if (enemy.Enemy.fullBoundBonus) { - willpowerDamage += enemy.Enemy.fullBoundBonus; // Some enemies deal bonus damage if they cannot put a binding on you - } - } - } - if (AIData.attack.includes("Bind") && KDGameData.KinkyDungeonLeashedPlayer < 1 && !enemy.Enemy.nopickpocket && player.player && enemy.Enemy.bound && !KDGameData.JailKey && KDCanPickpocket(enemy)) { - let item = playerItems.length > 0 ? playerItems[Math.floor(KDRandom() * playerItems.length)] : undefined; - let picked = false; - if (item && playerItems.length > 0 - && KinkyDungeonIsArmsBound() && ((!KinkyDungeonPlayerDamage || item.name != KinkyDungeonPlayerDamage.name) || KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax * 0.05) && KDRandom() < 0.5) { - if (item.type == Weapon) { - KinkyDungeonInventoryRemove(item); - //KinkyDungeonAddLostItems([item], false); - if (!enemy.items) enemy.items = [item.name]; - else if (!enemy.items.includes(item.name)) - enemy.items.push(item.name); - } else if (item.type == Consumable) { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables[item.name], -1); - /** @type {item} */ - let item2 = Object.assign({}, item); - //KinkyDungeonAddLostItems([item2], false); - item2.quantity = 1; - if (!enemy.items) enemy.items = [item.name]; - enemy.items.push(item.name); - } - if (item) { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStealItem").replace("ITEMSTOLEN", TextGet("KinkyDungeonInventoryItem" + item.name)), "yellow", 2); - picked = true; - } - } else if (KinkyDungeonLockpicks > 0 && KDRandom() < 0.5) { - KinkyDungeonLockpicks -= 1; - KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonStealPick"), "yellow", 2); - if (!enemy.items) enemy.items = ["Pick"]; - enemy.items.push("Pick"); - picked = true; - } else if (KinkyDungeonRedKeys > 0) { - KinkyDungeonRedKeys -= 1; - KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonStealRedKey"), "yellow", 2); - if (!enemy.items) enemy.items = ["RedKey"]; - enemy.items.push("RedKey"); - picked = true; - } else if (KinkyDungeonBlueKeys > 0) { - KinkyDungeonBlueKeys -= 1; - KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonStealBlueKey"), "yellow", 2); - if (!enemy.items) enemy.items = ["BlueKey"]; - enemy.items.push("BlueKey"); - picked = true; - } - /*else if (KinkyDungeonEnchantedBlades > 0 && KDRandom() < 0.5) { - KinkyDungeonEnchantedBlades -= 1; - KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonStealEnchKnife"), "yellow", 2); - if (!enemy.items) enemy.items = ["EnchKnife"]; - enemy.items.push("knife"); - }*/ - if (picked) { - KinkyDungeonSetFlag("pickpocket", 4); - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Miss.ogg", enemy); - if (KDRandom() < actionDialogueChanceIntense) - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (enemy.Enemy.playLine ? enemy.Enemy.playLine : "") + "Pickpocket").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 1); - - } - } - - if (AIData.attack.includes("Suicide")) { - if ((!enemy.Enemy.suicideOnAdd && !enemy.Enemy.suicideOnLock) - || (enemy.Enemy.suicideOnAdd && addedRestraint) || (enemy.Enemy.suicideOnLock && Locked) || (!player.player && AIData.attack.includes("Bind") && enemy.Enemy.suicideOnAdd)) { - enemy.hp = 0; - } else if ((!KinkyDungeonHasWill(0.1) || (enemy.Enemy.Attack?.mustBindorFail)) && enemy.Enemy.failAttackflag) { - for (let f of enemy.Enemy.failAttackflag) { - KinkyDungeonSetFlag(f, enemy.Enemy.failAttackflagDuration || 12); - } - } - } - if (AIData.attack.includes("Vibe")) { - AIData.vibe = true; - } - if (AIData.intentToLeash) { - let leashPos = AIData.leashPos; - if (AIData.leashPos) { - if (leashPos && leashPos == enemy.IntentLeashPoint && Math.abs(enemy.x - leashPos.x) <= 1.5 && Math.abs(enemy.y - leashPos.y) <= 1.5) { - if (enemy.IntentAction && KDIntentEvents[enemy.IntentAction] && KDIntentEvents[enemy.IntentAction].arrive) { - KDIntentEvents[enemy.IntentAction].arrive(enemy, AIData); - } else { - KDResetIntent(enemy, AIData); - } - } - else if (enemy.Enemy.tags.leashing && AIData.nearestJail && leashPos == AIData.nearestJail && Math.abs(enemy.x - leashPos.x) <= 1 && Math.abs(enemy.y - leashPos.y) <= 1) { - AIData.defeat = true; - KDGameData.KinkyDungeonLeashedPlayer = 3 + ap * 2; - KDGameData.KinkyDungeonLeashingEnemy = enemy.id; - KDBreakTether(); - } - else if (leashPos && ((AIData.attack.includes("Pull") && enemy.x == leashPos.x && enemy.y == leashPos.y) || Math.abs(enemy.x - leashPos.x) > 1.5 || Math.abs(enemy.y - leashPos.y) > 1.5)) { - if (!KinkyDungeonHasWill(0.1) && KDRandom() < 0.25) KinkyDungeonMovePoints = -1; - // Leash pullback - if (AIData.playerDist < 1.5) { - let path = KinkyDungeonFindPath(enemy.x, enemy.y, leashPos.x, leashPos.y, false, false, true, KinkyDungeonMovableTilesSmartEnemy, undefined, undefined, undefined, enemy); - if (path && path.length > 0) { - let leashPoint = path[0]; - let enemySwap = KinkyDungeonEnemyAt(leashPoint.x, leashPoint.y); - if ((!enemySwap || !enemySwap.Enemy.noDisplace) && Math.max(Math.abs(leashPoint.x - enemy.x), Math.abs(leashPoint.y - enemy.y)) <= 1.5) { - KDGameData.KinkyDungeonLeashedPlayer = 3 + ap * 2; - KDGameData.KinkyDungeonLeashingEnemy = enemy.id; - if (enemySwap) { - enemySwap.x = KinkyDungeonPlayerEntity.x; - enemySwap.y = KinkyDungeonPlayerEntity.y; - enemySwap.warningTiles = []; - } - if (AIData.leashing) - KinkyDungeonAttachTetherToEntity(2.5, enemy); - KDMovePlayer(enemy.x, enemy.y, false); - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - KDMoveEntity(enemy, leashPoint.x, leashPoint.y, true, false, undefined, true); - AIData.hitsfx = "Struggle"; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).removeOnLeash) { - KinkyDungeonRemoveRestraint(KDRestraint(inv).Group, false); - if (KDRestraint(inv).Group == "ItemDevices") { - KinkyDungeonSetFlag("Released", 24); - KinkyDungeonSetFlag("nojailbreak", 10); - } - } - } - if (!KinkyDungeonHasWill(0.1)) { - KDStunTurns(enemy.Enemy.movePoints + moveMult - 1); - KinkyDungeonSleepTime = CommonTime() + 200; - } - KinkyDungeonSetFlag("nojailbreak", KDGameData.KinkyDungeonLeashedPlayer); - if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Pull")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - if (KinkyDungeonMapGet(enemy.x, enemy.y) == 'D') { - KinkyDungeonMapSet(enemy.x, enemy.y, 'd'); - if (KinkyDungeonTilesGet(enemy.x + ',' +enemy.y) && KinkyDungeonTilesGet(enemy.x + ',' +enemy.y).Type == "Door") - KinkyDungeonTilesGet(enemy.x + ',' +enemy.y).Lock = undefined; - } - - if (KDRandom() < actionDialogueChanceIntense) - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (enemy.Enemy.playLine ? enemy.Enemy.playLine : "") + "Leash").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 3); - if (!KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonLeashGrab").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "yellow", 1)) - KinkyDungeonSendActionMessage(1, TextGet("KinkyDungeonLeashGrab").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "yellow", 1); - } - } - } else { - // Simple pull - let path = KinkyDungeonFindPath(player.x, player.y, leashPos.x, leashPos.y, true, false, false, KinkyDungeonMovableTilesEnemy, undefined, undefined, undefined, enemy); - let pullDist = enemy.Enemy.pullDist ? enemy.Enemy.pullDist : 1; - if (path && path.length > 0) { - let leashPoint = path[Math.min(Math.max(0,path.length-2), Math.floor(Math.max(0, pullDist-1)))]; - if (!KinkyDungeonEnemyAt(leashPoint.x, leashPoint.y) - && Math.sqrt((leashPoint.x - enemy.x) * (leashPoint.x - enemy.x) + (leashPoint.y - enemy.y) * (leashPoint.y - enemy.y)) < AIData.playerDist - && Math.sqrt((leashPoint.x - player.x) * (leashPoint.x - player.x) + (leashPoint.y - player.y) * (leashPoint.y - player.y)) <= pullDist * 1.45) { - if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Pull")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - KDGameData.KinkyDungeonLeashedPlayer = 2; - KDGameData.KinkyDungeonLeashingEnemy = enemy.id; - player.x = leashPoint.x; - player.y = leashPoint.y; - let msg = "KinkyDungeonLeashGrab"; - if (enemy.Enemy.pullMsg) msg = "Attack" + enemy.Enemy.name + "Pull"; - - if (KDRandom() < actionDialogueChanceIntense) - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (enemy.Enemy.playLine ? enemy.Enemy.playLine : "") + "Pull").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 3); - if (!KinkyDungeonSendTextMessage(8, TextGet(msg).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "yellow", 1)) - KinkyDungeonSendActionMessage(3, TextGet(msg).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "yellow", 1); - } - } - } - } - } - } - let Dash = false; - let data = {}; - if (AIData.attack.includes("Dash") && (enemy.Enemy.dashThruWalls || AIData.canSeePlayer)) { - let d = KDDash(enemy, player, AIData.MovableTiles); - Dash = d.Dash; - happened += d.happened; - } - if (AIData.attack.includes("Will") || willpowerDamage > 0) { - if (willpowerDamage == 0) - willpowerDamage += AIData.power; - let buffdmg = KinkyDungeonGetBuffedStat(enemy.buffs, "AttackDmg"); - if (buffdmg) willpowerDamage = Math.max(0, willpowerDamage + buffdmg); - msgColor = "#ff5555"; - if (enemy.usingSpecial && willpowerDamage > 0 && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Will")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - } - if (player.player) { - KinkyDungeonTickBuffTag(enemy.buffs, "hit", 1); - if (restraintAdd && restraintAdd.length > 0) { - msgColor = "#ff5555"; - let restraintblock = KinkyDungeonGetPlayerStat("RestraintBlock"); - let restraintpower = 0; - for (let r of restraintAdd) { - restraintpower += r.power; - } - let blocked = () => { - KDDamageQueue.push({floater: TextGet("KDBlockedRestraint"), Entity: {x: enemy.x - 0.5, y: enemy.y - 0.5}, Color: "white", Time: 2, Delay: 0}); - for (let rep of replace) { - if (rep.keyword == "RestraintAdded") rep.value = TextGet("KDRestraintBlockedItem"); - } - msgColor = "#ff8800"; - bound += 1; - if (willpowerDamage == 0) - willpowerDamage += AIData.power; - }; - restraintblock = KDRestraintBlockPower(restraintblock, restraintpower + (enemy.Enemy.power || 0)); - if (!restraintblock || KDRandom() < restraintblock) { - let protection = 0; - let multiPower = restraintAdd.length; - let targetGroups = {}; - for (let r of restraintAdd) { - targetGroups[r.Group] = true; - } - // Calculate power of an attack vs protection - let protectRestraints = KinkyDungeonAllRestraint().filter((r) => {return KDRestraint(r).protection > 0;}); - for (let r of protectRestraints) { - if (r && KDRestraint(r).protection && (!KDRestraint(r).protectionCursed || targetGroups[KDRestraint(r).Group])) { - protection += KDRestraint(r).protection; - } - } - - let count = 0; - if (protection >= multiPower) { - for (let r of protectRestraints) { - if (count < multiPower) { - KinkyDungeonRemoveRestraint(KDRestraint(r).Group, true); - KinkyDungeonSendTextMessage( - 5, TextGet("KDArmorBlock") - .replace("ArmorName", TextGet("Restraint" + r.name)) - .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), - "#ffff00", 1); - } - count += KDRestraint(r).protection; - } - blocked(); - } else { - for (let r of restraintAdd) { - let bb = 0; - if (count >= protection) { - bb = KinkyDungeonAddRestraintIfWeaker(r, AIData.power, KinkyDungeonStatsChoice.has("MagicHands") ? true : enemy.Enemy.bypass, enemy.Enemy.useLock ? enemy.Enemy.useLock : undefined, undefined, undefined, undefined, KDGetFaction(enemy), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, enemy) * 2; - if (bb) { - if (KDGroupBlocked(r.Group) && !enemy.Enemy.bypass) { - KinkyDungeonSendTextMessage( - 5, TextGet("KDBypasses") - .replace("RestraintName", TextGet("Restraint" + r.name)) - .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), - "#ffff00", 1); - } - if (restraintFromInventory.includes(r.name)) { - restraintFromInventory.splice(restraintFromInventory.indexOf(r.name), 1); - if (enemy.items?.includes(r.name)) { - enemy.items.splice(enemy.items.indexOf(r.name), 1); - } - } - KDSendStatus('bound', r.name, "enemy_" + enemy.Enemy.name); - } - } - bound += bb; - count += 1; - } - } - } else { - blocked(); - } - } - - - if (AIData.attack.includes("Slow")) { - KinkyDungeonMovePoints = Math.max(KinkyDungeonMovePoints - 2, -1); - if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Slow")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - happened += 1; - } - if (AIData.attack.includes("Effect") && enemy.Enemy.effect) { - let affected = KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, enemy.Enemy.effect.damage, enemy.Enemy.effect.effect, enemy.Enemy.effect.spell, KDGetFaction(enemy)); - if (affected && enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Effect")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - happened += 1; - } - if (AIData.attack.includes("Stun")) { - let time = enemy.Enemy.stunTime ? enemy.Enemy.stunTime : 1; - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, time); - KinkyDungeonMovePoints = Math.max(Math.min(-1, -time+1), KinkyDungeonMovePoints-time); // This is to prevent stunlock while slowed heavily - if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Stun")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - happened += 1; - priorityBonus += 3*time; - Stun = true; - if (KDRandom() < actionDialogueChanceIntense) - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (enemy.Enemy.playLine ? enemy.Enemy.playLine : "") + "Stun").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 3); - - } - if (AIData.attack.includes("Blind")) { - let time = enemy.Enemy.blindTime ? enemy.Enemy.blindTime : 1; - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, time); - if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Blind")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - happened += 1; - priorityBonus += 3*time; - Blind = true; - } - happened += bound; - - data = { - attack: AIData.attack, - enemy: enemy, - bound: bound, - damage: willpowerDamage, - damagetype: AIData.damage, - restraintsAdded: restraintAdd, - attacker: enemy, - target: player, - happened: happened, - }; - KinkyDungeonSendEvent("beforeDamage", data); - KDDelayedActionPrune(["Hit"]); - let dmg = KinkyDungeonDealDamage({damage: data.damage, type: data.damagetype}); - data.happened += dmg.happened; - if (!enemy.playWithPlayer) - KinkyDungeonSetFlag("NPCCombat", 3); - happened = data.happened; - replace.push({keyword:"DamageTaken", value: dmg.string}); - } else { // if (KDRandom() <= playerEvasion) - if (AIData.attack.includes("Slow")) { - if (player.movePoints) - player.movePoints = Math.max(player.movePoints - 1, 0); - if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Slow")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - happened += 1; - } - if (AIData.attack.includes("Stun")) { - let time = enemy.Enemy.stunTime ? enemy.Enemy.stunTime : 1; - if (!player.stun) player.stun = time; - else player.stun = Math.max(time, player.stun); - if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Stun")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - happened += 1; - } - if (AIData.attack.includes("Blind")) { - let time = enemy.Enemy.blindTime ? enemy.Enemy.blindTime : 1; - if (!player.blind) player.blind = time; - else player.blind = Math.max(time, player.blind); - if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Blind")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - happened += 1; - } - if (AIData.attack.includes("Silence")) { - let time = enemy.Enemy.silenceTime ? enemy.Enemy.silenceTime : 1; - KDSilenceEnemy(player, time); - if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Blind")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - happened += 1; - } - - - let dmg = AIData.power; - let buffdmg = KinkyDungeonGetBuffedStat(enemy.buffs, "AttackDmg"); - if (buffdmg) dmg = Math.max(0, dmg + buffdmg); - if (enemy.Enemy.fullBoundBonus) { - dmg += enemy.Enemy.fullBoundBonus; // Some enemies deal bonus damage if they cannot put a binding on you - } - happened += KinkyDungeonDamageEnemy(player, {type: enemy.Enemy.dmgType, damage: dmg}, false, true, undefined, undefined, enemy); - KinkyDungeonSetFlag("NPCCombat", 3); - KinkyDungeonTickBuffTag(enemy.buffs, "hit", 1); - if (happened > 0) { - // Decrement play timer on a hit, less if they are on furniture - if (enemy.playWithPlayer) { - KDAddOpinion(enemy, 10); - enemy.playWithPlayer = Math.max(0, enemy.playWithPlayer - (!KinkyDungeonPlayerTags.has("Furniture") ? 2 : 1) * Math.max(1, ((enemy.usingSpecial && enemy.Enemy.specialAttackPoints) ? enemy.Enemy.specialAttackPoints : enemy.Enemy.attackPoints))); // Decrement each attack.... - if (enemy.playWithPlayer == 0) KDResetIntent(enemy, AIData); - } - let sfx = (AIData.hitsfx) ? AIData.hitsfx : "DealDamage"; - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + sfx + ".ogg", enemy); - } - } - - if (enemy.usingSpecial && enemy.specialCD > 0 && enemy.Enemy.specialCharges) { - if (enemy.specialCharges == undefined) enemy.specialCharges = enemy.Enemy.specialCharges-1; - else enemy.specialCharges -= 1; - } - - if (happened > 0 && player.player) { - let suffix = ""; - if (Stun) suffix = "Stun"; - else if (Blind) suffix = "Blind"; - else if (Locked) suffix = "Lock"; - else if (bound > 0) suffix = "Bind"; - if (Dash) suffix = "Dash"; - if (enemy.usingSpecial && enemy.Enemy.specialMsg) suffix = "Special"; - - let sfx = (AIData.hitsfx) ? AIData.hitsfx : (data.damage > 1 ? "Damage" : "DamageWeak"); - if (enemy.usingSpecial && enemy.Enemy.specialsfx) sfx = enemy.Enemy.specialsfx; - KinkyDungeonSendEvent("hit", data); - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + sfx + ".ogg", enemy); - let text = TextGet("Attack"+enemy.Enemy.name + suffix); - if (replace) - for (let R = 0; R < replace.length; R++) - text = text.replace(replace[R].keyword, "" + replace[R].value); - KinkyDungeonSendTextMessage(happened+priorityBonus, text, msgColor, 1); - if (!enemy.Enemy.tags.temporary && AIData.attack.includes("Bind") && KDCanPickpocket(enemy)) - KinkyDungeonLoseJailKeys(true, undefined, enemy); - } - } else { - let sfx = (enemy.Enemy && enemy.Enemy.misssfx) ? enemy.Enemy.misssfx : "Miss"; - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + sfx + ".ogg", enemy); - if (player.player) { - KinkyDungeonSendEvent("miss", {enemy: enemy, player: player}); - KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonAttackMiss").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "lightgreen", 1); - - if (KDRandom() < actionDialogueChance) - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (enemy.Enemy.playLine ? enemy.Enemy.playLine : "") + "Miss").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 4); - } - KDAddThought(enemy.id, "Annoyed", 4, 1); - - enemy.vulnerable = Math.max(enemy.vulnerable, 1); - if (AIData.attack.includes("Dash") && enemy.Enemy.dashOnMiss) { - KDDash(enemy, player, AIData.MovableTiles); - } - } - - KinkyDungeonTickBuffTag(enemy.buffs, "damage", 1); - - enemy.warningTiles = []; - if (enemy.usingSpecial) enemy.usingSpecial = false; - } - } else { - enemy.warningTiles = []; - enemy.attackPoints = 0; - if (enemy.usingSpecial) enemy.usingSpecial = false; - enemy.fx = enemy.x + dir.x; - enemy.fy = enemy.y + dir.y; - } - } else { - enemy.warningTiles = []; - enemy.attackPoints = 0; - } - - enemy.moved = (AIData.moved || enemy.movePoints > 0); - enemy.idle = AIData.idle && !(AIData.moved || enemy.attackPoints > 0); - if (enemy.idle) { - enemy.fx = undefined; - enemy.fy = undefined; - } - - - if (!AIType.afteridle || !AIType.afteridle(enemy, player, AIData)) { - // Spell loop - if ((!enemy.Enemy.enemyCountSpellLimit || KinkyDungeonEntities.length < enemy.Enemy.enemyCountSpellLimit) - && ((!player.player || (AIData.aggressive || (KDGameData.PrisonerState == 'parole' && enemy.Enemy.spellWhileParole)))) - && (!enemy.silence || enemy.silence < 0.01) - && (!enemy.blind || enemy.blind < 0.01 || AIData.playerDist < 2.99) - && (!enemy.Enemy.noSpellDuringAttack || enemy.attackPoints < 1) - && (!enemy.Enemy.noSpellsWhenHarmless || !AIData.harmless) - && (!enemy.Enemy.noSpellsLowSP || KinkyDungeonHasWill(0.1) || KinkyDungeonFlags.has("PlayerCombat")) - && (!enemy.Enemy.noSpellLeashing || KDGameData.KinkyDungeonLeashingEnemy != enemy.id || KDGameData.KinkyDungeonLeashedPlayer < 1) - && (!enemy.Enemy.followLeashedOnly || (KDGameData.KinkyDungeonLeashedPlayer < 1 || KDGameData.KinkyDungeonLeashingEnemy == enemy.id)) - && (AIData.hostile || (!player.player && (KDHostile(player) || enemy.rage))) - && ((enemy.aware && (KDCanDetect(enemy, player))) || (!KDAllied(enemy) && !AIData.hostile)) - && !AIData.ignore && (!AIData.moved || enemy.Enemy.castWhileMoving) && enemy.Enemy.attack.includes("Spell") - && !AIData.ignoreRanged - && AIType.spell(enemy, player, AIData) - && KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius, false, true) && enemy.castCooldown <= 0) { - AIData.idle = false; - let spellchoice = null; - let spell = null; - let spelltarget = undefined; - - for (let tries = 0; tries < 6; tries++) { - spelltarget = null; - spellchoice = enemy.Enemy.spells[Math.floor(KDRandom()*enemy.Enemy.spells.length)]; - spell = KinkyDungeonFindSpell(spellchoice, true); - if (spell && (enemy.blind > 0 && (spell.projectileTargeting))) spell = null; - if (spell && ((!spell.castRange && AIData.playerDist > spell.range) || (spell.castRange && AIData.playerDist > spell.castRange))) spell = null; - if (spell && spell.specialCD && enemy.castCooldownSpecial > 0) spell = null; - if (spell && spell.noFirstChoice && tries <= 2) spell = null; - if (spell && spell.projectileTargeting && !KinkyDungeonCheckProjectileClearance(enemy.x, enemy.y, player.x, player.y)) spell = null; - if (spell && spell.buff) { - if (enemy.Enemy.buffallies || spell.buffallies) { - // Select a random nearby ally of the enemy - let nearAllies = []; - for (let e of KinkyDungeonEntities) { - if ((e != enemy || spell.selfbuff) && (!spell.heal || e.hp < e.Enemy.maxhp - spell.power*0.5) - && e.aware && !KinkyDungeonHasBuff(e.buffs, spell.name) - && !e.rage - && ((KDAllied(enemy) && KDAllied(e)) || (KDHostile(enemy) && KDHostile(e) || KDFactionRelation(KDGetFaction(e), KDGetFaction(enemy)) >= 0.1)) - && Math.sqrt((enemy.x - e.x)*(enemy.x - e.x) + (enemy.y - e.y)*(enemy.y - e.y)) < spell.range - && (!spell.castCondition || KDCastConditions[spell.castCondition](enemy, e, spell))) { - let allow = !spell.filterTags; - if (spell.filterTags && KDMatchTags(spell.filterTags, e)) allow = true; - if (allow) - nearAllies.push(e); - } - } - if (nearAllies.length > 0) { - let e = nearAllies[Math.floor(KDRandom() * nearAllies.length)]; - if (e) { - spelltarget = e; - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonSpellCast" + spell.name).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "white", 2); - break; - } - } else spell = null; - } else { - spelltarget = enemy; - if (spell.castCondition && !KDCastConditions[spell.castCondition](enemy, enemy, spell)) spell = null; - } - } else if (spell?.castCondition && !KDCastConditions[spell.castCondition](enemy, player, spell)) spell = null; - let minSpellRange = (spell && spell.minRange != undefined) ? spell.minRange : ((spell && (spell.selfcast || spell.buff || (spell.range && spell.range < 1.6))) ? 0 : 1.5); - if (spell && spell.heal && spelltarget.hp >= spelltarget.Enemy.maxhp) spell = null; - if (spell && !(!minSpellRange || (AIData.playerDist > minSpellRange))) spell = null; - if (spell && !(!spell.minRange || (AIData.playerDist > spell.minRange))) spell = null; - if (spell) break; - } - if (spell && enemy.distraction && !enemy.Enemy.noMiscast && KDRandom() < enemy.distraction / enemy.Enemy.maxhp * 0.8) { - if (player == KinkyDungeonPlayerEntity) KinkyDungeonSendTextMessage(4, - TextGet(enemy.Enemy.miscastmsg || "KDEnemyMiscast").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "#88ff88", 2); - KinkyDungeonCastSpell(enemy.x, enemy.y, KinkyDungeonFindSpell("EnemyMiscast", true), enemy, player); - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + (enemy.Enemy.miscastsfx || "SoftShield") + ".ogg", enemy); - } else if (spell) { - if (spell.channel && !enemy.Enemy.noChannel) enemy.channel = spell.channel; - enemy.castCooldown = spell.manacost*enemy.Enemy.spellCooldownMult + enemy.Enemy.spellCooldownMod + 1; - if (spell.specialCD) - enemy.castCooldownSpecial = spell.specialCD; - let xx = player.x; - let yy = player.y; - if (spelltarget) { - xx = spelltarget.x; - yy = spelltarget.y; - } - if (spell && spell.selfcast) { - xx = enemy.x; - yy = enemy.y; - if (!spell.noCastMsg) - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonSpellCast" + spell.name).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "white", 4, undefined, undefined, enemy); - } else if (spell && spell.msg) { - if (!spell.noCastMsg) - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonSpellCast" + spell.name).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "white", 4, undefined, undefined, enemy); - } - - - if (spell && KinkyDungeonCastSpell(xx, yy, spell, enemy, player).result == "Cast" && spell.sfx) { - if (enemy.Enemy.suicideOnSpell) enemy.hp = 0; - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + spell.sfx + ".ogg", enemy); - } - - - //console.log("casted "+ spell.name); - } - } - if (AIData.vibe || (enemy.Enemy.RemoteControl?.remote && AIData.playerDist < enemy.Enemy.RemoteControl?.remote)) { - KinkyDungeonSendEvent("remoteVibe", {enemy: enemy.Enemy.name, power: enemy.Enemy.RemoteControl?.remoteAmount ? enemy.Enemy.RemoteControl?.remoteAmount : 5, overcharge: AIData.vibe, noSound: AIData.vibe}); - } - if (AIData.aggressive && AIData.canSensePlayer && enemy.Enemy.RemoteControl?.punishRemote && AIData.playerDist < enemy.Enemy.RemoteControl?.punishRemote) { - KinkyDungeonSendEvent("remotePunish", {enemy}); - } - } - - if (enemy.IntentAction && KDIntentEvents[enemy.IntentAction] && KDIntentEvents[enemy.IntentAction].maintain) { - KDIntentEvents[enemy.IntentAction].maintain(enemy, delta); - } - - if (enemy.playWithPlayer > 0 && !AIData.aggressive) { - KinkyDungeonApplyBuffToEntity(enemy, KDEager); - if (AIData.domMe) - KinkyDungeonApplyBuffToEntity(enemy, KDMasochist); - } - - if (enemy.usingSpecial && (AIData.idle || (AIData.moved && !enemy.Enemy.attackWhileMoving)) && enemy.Enemy.specialCDonAttack) { - enemy.specialCD = enemy.Enemy.specialCD; - } - if (enemy.specialCD > 0) enemy.usingSpecial = false; - - if (AIData.idle) KDAddThought(enemy.id, "Idle", 0.5, 3); - return {idle: AIData.idle, defeat: AIData.defeat}; -} - -// Unique ID for enemies, to prevent bullets from hitting them -// Dont want to pass object handles around in case we ever allow saving a room -function KinkyDungeonGetEnemyID() { - if (KinkyDungeonEnemyID > 100000000) KinkyDungeonEnemyID = 0; - return KinkyDungeonEnemyID++; -} -// Unique ID for items for identification reasons -// Dont want to pass object handles around in case we ever allow saving a room -function KinkyDungeonGetItemID() { - if (KDGameData.ItemID > 100000000 || KDGameData.ItemID == undefined) KDGameData.ItemID = 0; - return KDGameData.ItemID++; -} - -let KinkyDungeonEnemyID = 1; - -function KinkyDungeonNoEnemy(x, y, Player) { - - if (KinkyDungeonEnemyAt(x, y)) return false; - if (Player) - for (let player of KinkyDungeonPlayers) - if ((player.x == x && player.y == y)) return false; - return true; -} - -/** - * - * @param {entity} enemy - * @returns {boolean} - */ -function KDIsImmobile(enemy) { - return enemy && (enemy.Enemy.immobile || enemy.Enemy.tags?.immobile || KDEnemyHasFlag(enemy, "imprisoned")); -} - -// e = potential sub -// Enemy = leader -/** - * - * @param {entity} e - Target enemy - * @param {entity} Enemy - Enemy trying to move - * @returns - */ -function KinkyDungeonCanSwapWith(e, Enemy) { - if (KDIsImmobile(e)) return false; // Definition of noSwap - if (e && KDEnemyHasFlag(e, "noswap")) return false; // Definition of noSwap - if (KinkyDungeonTilesGet(e.x + "," + e.y) && KinkyDungeonTilesGet(e.x + "," + e.y).OffLimits && Enemy != KinkyDungeonJailGuard() && !KinkyDungeonAggressive(Enemy)) return false; // Only jailguard or aggressive enemy is allowed to swap into offlimits spaces unless hostile - if (Enemy && Enemy.Enemy && Enemy.Enemy.ethereal && e && e.Enemy && !e.Enemy.ethereal) return false; // Ethereal enemies NEVER have seniority, this can teleport other enemies into walls - if (Enemy && Enemy.Enemy && Enemy.Enemy.squeeze && e && e.Enemy && !e.Enemy.squeeze) return false; // Squeeze enemies NEVER have seniority, this can teleport other enemies into walls - if (Enemy == KinkyDungeonLeashingEnemy()) return true; - if (Enemy == KinkyDungeonJailGuard()) return true; - if (KDBoundEffects(e) > 3) return true; - if (!e.Enemy.tags || (e.Enemy.tags.minor && !Enemy.Enemy.tags.minor)) - return true; - else if (Enemy && Enemy.Enemy && Enemy.Enemy.tags && Enemy.Enemy.tags.elite) { - if (!e.Enemy.tags || (!e.Enemy.tags.elite && !e.Enemy.tags.miniboss && !e.Enemy.tags.boss)) - return true; - } else if (Enemy && Enemy.Enemy && Enemy.Enemy.tags && Enemy.Enemy.tags.miniboss) { - if (!e.Enemy.tags || (!e.Enemy.tags.miniboss && !e.Enemy.tags.boss)) - return true; - } else if (Enemy && Enemy.Enemy && Enemy.Enemy.tags && Enemy.Enemy.tags.boss) { - if (!e.Enemy.tags || (!e.Enemy.tags.boss)) - return true; - } - return false; -} - -function KinkyDungeonNoEnemyExceptSub(x, y, Player, Enemy) { - let e = KinkyDungeonEnemyAt(x, y); - if (e && e.Enemy) { - if (e.Enemy.master && Enemy && Enemy.Enemy && e.Enemy.master.type == Enemy.Enemy.name) return true; - let seniority = Enemy ? KinkyDungeonCanSwapWith(e, Enemy) : false; - return seniority; - } - if (Player) - for (let pp of KinkyDungeonPlayers) - if ((pp.x == x && pp.y == y)) return false; - return true; -} - -function KinkyDungeonEnemyAt(x, y) { - let cache = KDGetEnemyCache(); - if (cache) return cache.get(x + "," + y); - for (let enemy of KinkyDungeonEntities) { - if (enemy.x == x && enemy.y == y) - return enemy; - } - return null; -} - -function KinkyDungeonEntityAt(x, y, requireVision, vx, vy) { - if (KinkyDungeonPlayerEntity.x == x && KinkyDungeonPlayerEntity.y == y) return KinkyDungeonPlayerEntity; - let cache = KDGetEnemyCache(); - if (!requireVision && cache) return cache.get(x + "," + y); - else if (cache) { - let enemy = cache.get(x + "," + y); - if (KDCanSeeEnemy(enemy, KDistEuclidean(x - vx, y - vy))) return enemy; - } - for (let enemy of KinkyDungeonEntities) { - if (enemy.x == x && enemy.y == y && (!requireVision || KDCanSeeEnemy(enemy, KDistEuclidean(x - vx, y - vy)))) - return enemy; - } - return null; -} - -function KinkyDungeonEnemyTryMove(enemy, Direction, delta, x, y) { - let speedMult = KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed") ? KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed")) : 1; - if (enemy.bind > 0) enemy.movePoints += speedMult * delta/10; - else if (enemy.slow > 0) enemy.movePoints += speedMult * delta/2; - else enemy.movePoints += KDGameData.SleepTurns > 0 ? 4*delta * speedMult : delta * speedMult; - - let moveMult = KDBoundEffects(enemy) * 0.5; - - if (enemy.movePoints > 0) { - enemy.fx = enemy.x + Direction.x; - enemy.fy = enemy.y + Direction.y; - } - - if (enemy.movePoints >= enemy.Enemy.movePoints + moveMult) { - enemy.movePoints = Math.max(0, enemy.movePoints - enemy.Enemy.movePoints + moveMult); - let dist = Math.abs(x - KinkyDungeonPlayerEntity.x) + Math.abs(y - KinkyDungeonPlayerEntity.y); - - let ee = KinkyDungeonEnemyAt(enemy.x + Direction.x, enemy.y + Direction.y); - - if (!ee && KinkyDungeonMapGet(enemy.x, enemy.y) == 'd' && enemy.Enemy && enemy.Enemy.tags.closedoors && !(KDGameData.KinkyDungeonLeashedPlayer > 0 || KinkyDungeonFlags.has("noclosedoors")) - && ((dist > 5) || - (KinkyDungeonTilesGet(enemy.x + "," + enemy.y) && KDHostile(enemy) && (KinkyDungeonTilesGet(enemy.x + "," + enemy.y).Jail || KinkyDungeonTilesGet(enemy.x + "," + enemy.y).ReLock) && !KinkyDungeonFlags.has("nojailbreak")))) { - KinkyDungeonMapSet(enemy.x, enemy.y, 'D'); - if (KDGameData.PrisonerState == 'jail' && KinkyDungeonTilesGet(enemy.x + "," + enemy.y) && KDHostile(enemy) && (KinkyDungeonTilesGet(enemy.x + "," + enemy.y).Jail || KinkyDungeonTilesGet(enemy.x + "," + enemy.y).ReLock) - && !KinkyDungeonFlags.has("nojailbreak")) { - KinkyDungeonTilesGet(enemy.x + "," + enemy.y).Lock = "Red"; - KDUpdateDoorNavMap(); - } - if (dist < 10) { - KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonHearDoorCloseNear"), "#dddddd", 4); - } else if (dist < 20) - KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonHearDoorCloseFar"), "#999999", 4); - } - - if (ee && KinkyDungeonCanSwapWith(ee, enemy)) { - KDMoveEntity(ee, enemy.x, enemy.y, false,undefined, undefined, true); - ee.warningTiles = []; - ee.movePoints = 0; - ee.stun = 1; - } - if (!ee || !KinkyDungeonEnemyAt(enemy.x + Direction.x, enemy.y + Direction.y)) - KDMoveEntity(enemy, enemy.x + Direction.x, enemy.y + Direction.y, true,undefined, undefined, true); - - if (KinkyDungeonMapGet(x, y) == 'D' && enemy.Enemy && enemy.Enemy.tags.opendoors) { - KinkyDungeonMapSet(x, y, 'd'); - if (KinkyDungeonTilesGet(x + ',' +y) && KinkyDungeonTilesGet(x + ',' +y).Type == "Door") - KinkyDungeonTilesGet(x + ',' +y).Lock = undefined; - if (dist < 5) { - KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonHearDoorOpenNear"), "#dddddd", 4); - } else if (dist < 15) - KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonHearDoorOpenFar"), "#999999", 4); - } - - return true; - } - return false; -} - -function KinkyDungeonEnemyTryAttack(enemy, player, Tiles, delta, x, y, points, replace, msgColor, usingSpecial, refreshWarningTiles, attack, MovableTiles) { - if (!enemy.Enemy.noCancelAttack && !refreshWarningTiles && points > 1) { - let playerIn = false; - for (let T = 0; T < Tiles.length; T++) { - let ax = enemy.x + Tiles[T].x; - let ay = enemy.y + Tiles[T].y; - - if (player.x == ax && player.y == ay && (!enemy.Enemy.strictAttackLOS || KinkyDungeonCheckProjectileClearance(enemy.x, enemy.y, player.x, player.y))) { - playerIn = true; - break; - } - } - - if (!playerIn && Tiles.length > 0) { - if (enemy.Enemy.specialRange && enemy.usingSpecial && enemy.Enemy.specialCDonAttack) { - enemy.specialCD = enemy.Enemy.specialCD; - enemy.attackPoints = 0; - enemy.warningTiles = []; - enemy.usingSpecial = false; - if (enemy.Enemy.stunOnSpecialCD) enemy.stun = enemy.Enemy.stunOnSpecialCD; - if (attack.includes("Dash") && enemy.Enemy.dashOnMiss) { - KDDash(enemy, player, MovableTiles); - } - return false; - } - if (enemy.Enemy.specialWidth && enemy.usingSpecial && enemy.Enemy.specialCDonAttack) { - enemy.specialCD = enemy.Enemy.specialCD; - enemy.attackPoints = 0; - enemy.warningTiles = []; - enemy.usingSpecial = false; - if (enemy.Enemy.stunOnSpecialCD) enemy.stun = enemy.Enemy.stunOnSpecialCD; - if (attack.includes("Dash") && enemy.Enemy.dashOnMiss) { - KDDash(enemy, player, MovableTiles); - } - return false; - } - } - } - - enemy.attackPoints += delta * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(enemy.buffs, "AttackSpeed")); - if (!enemy.playWithPlayer) - KinkyDungeonSetFlag("NPCCombat", 3); - - if (enemy.attackPoints >= points) { - enemy.attackPoints = enemy.attackPoints - points; - return true; - } - return false; -} - -function KinkyDungeonGetWarningTilesAdj() { - let arr = []; - - arr.push({x:1, y:1}); - arr.push({x:0, y:1}); - arr.push({x:1, y:0}); - arr.push({x:-1, y:-1}); - arr.push({x:-1, y:1}); - arr.push({x:1, y:-1}); - arr.push({x:-1, y:0}); - arr.push({x:0, y:-1}); - - return arr; -} - -function KDCanPickpocket(enemy) { - if (KinkyDungeonFlags.has("pickpocket")) return false; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).enclose) return false; - } - return KDHostile(enemy) || ((KDGameData.PrisonerState == 'jail' || KDGameData.PrisonerState == 'parole') && KinkyDungeonPlayerTags.has("Furniture")); -} - - -function KinkyDungeonGetWarningTiles(dx, dy, range, width, forwardOffset = 1) { - if (range == 1 && width == 8) return KinkyDungeonGetWarningTilesAdj(); - - let arr = []; - /* - let cone = 0.78539816 * (width-0.9)/2; - let angle_player = Math.atan2(dx, dy) + ((width % 2 == 0) ? ((KDRandom() > 0.5) ? -0.39269908 : 39269908) : 0); - if (angle_player > Math.PI) angle_player -= Math.PI; - if (angle_player < -Math.PI) angle_player += Math.PI; - - for (let X = -range; X <= range; X++) - for (let Y = -range; Y <= range; Y++) { - let angle = Math.atan2(X, Y); - - let angleDiff = angle - angle_player; - angleDiff += (angleDiff>Math.PI) ? -2*Math.PI : (angleDiff<-Math.PI) ? 2*Math.PI : 0; - - if (Math.abs(angleDiff) < cone + 0.22/Math.max(Math.abs(X), Math.abs(Y)) && Math.sqrt(X*X + Y*Y) < range + 0.5) arr.push({x:X, y:Y}); - } - */ - let dist = Math.sqrt(dx*dx + dy*dy); - let radius = Math.ceil(width/2); - if (dist > 0) { - let x_step = dx/dist; - let y_step = dy/dist; - - for (let d = forwardOffset; d <= range; d++) { - let xx = x_step * d; - let yy = y_step * d; - for (let X = Math.floor(xx-radius); X <= Math.ceil(xx+radius); X++) - for (let Y = Math.floor(yy-radius); Y <= Math.ceil(yy+radius); Y++) { - let dd = Math.sqrt((X - xx)*(X - xx) + (Y - yy)*(Y - yy)); - let dd2 = Math.sqrt(X*X+Y*Y); - if (dd < width*0.49 && dd2 < range + 0.5) { - let dupe = false; - for (let a of arr) { - if (a.x == X && a.y == Y) {dupe = true; break;} - } - if (!dupe) arr.push({x:X, y:Y}); - } - } - } - } - - return arr; -} - -function KinkyDungeonFindMaster(enemy) { - let findMaster = undefined; - let masterDist = 1000; - if (enemy.Enemy.master) { - for (let e of KinkyDungeonEntities) { - if (e.Enemy.name == enemy.Enemy.master.type) { - let dist = Math.sqrt((e.x - enemy.x) * (e.x - enemy.x) + (e.y - enemy.y)*(e.y - enemy.y)); - if ((!enemy.Enemy.master.maxDist || dist < enemy.Enemy.master.maxDist) - && dist < masterDist - && (!enemy.Enemy.master.loose || KinkyDungeonCheckLOS(enemy, e, dist, 100, false, false))) { - masterDist = Math.sqrt((e.x - enemy.x) * (e.x - enemy.x) + (e.y - enemy.y)*(e.y - enemy.y)); - findMaster = e; - } - } - } - } - return {master: findMaster, dist: masterDist}; -} - -function KinkyDungeonEnemyCanMove(enemy, dir, MovableTiles, AvoidTiles, ignoreLocks, Tries) { - if (!dir) return false; - let master = enemy.Enemy.master; - let xx = enemy.x + dir.x; - let yy = enemy.y + dir.y; - if (master && (!enemy.Enemy.master.aggressive || !enemy.aware)) { - let fm = KinkyDungeonFindMaster(enemy); - let findMaster = fm.master; - let masterDist = fm.dist; - if (findMaster) { - if (Math.sqrt((xx - findMaster.x) * (xx - findMaster.x) + (yy - findMaster.y) * (yy - findMaster.y)) > master.range - && Math.sqrt((xx - findMaster.x) * (xx - findMaster.x) + (yy - findMaster.y) * (yy - findMaster.y)) > masterDist) return false; - } - } - return MovableTiles.includes(KinkyDungeonMapGet(xx, yy)) && ((Tries && Tries > 5) || !AvoidTiles.includes(KinkyDungeonMapGet(enemy.x + dir.x, enemy.y + dir.y))) - && (ignoreLocks || !KinkyDungeonTilesGet((xx) + "," + (yy)) || !(KinkyDungeonTilesGet((xx) + "," + (yy)).Lock)) - && KinkyDungeonNoEnemyExceptSub(xx, yy, true, enemy); -} - -function KinkyDungeonFindID(id) { - for (let e of KinkyDungeonEntities) { - if (e.id == id) return e; - } - return null; -} - -function KDDash(enemy, player, MovableTiles) { - let happened = 0; - let Dash = false; - // Check player neighbor tiles - let tiles = []; - for (let X = player.x-1; X <= player.x+1; X++) - for (let Y = player.y-1; Y <= player.y+1; Y++) { - let tile = KinkyDungeonMapGet(X, Y); - if ((X != 0 || Y != 0) && !(!KinkyDungeonNoEnemy(X, Y, true) || !MovableTiles.includes(tile) || (tile == 'D' && !enemy.Enemy.ethereal))) { - tiles.push({x:X, y:Y}); - } - } - if (tiles.length > 0) { - let tile = tiles[Math.floor(KDRandom()*tiles.length)]; - if (enemy.Enemy.dashThrough) { - let tiled = 0; - for (let t of tiles) { - let dist = Math.sqrt((enemy.x - t.x)*(enemy.x - t.x) + (enemy.y - t.y)*(enemy.y - t.y)); - if (dist > tiled) { - tile = t; - tiled = dist; - } - } - } else { - let tiled = Math.sqrt((enemy.x - tile.x)*(enemy.x - tile.x) + (enemy.y - tile.y)*(enemy.y - tile.y)); - for (let t of tiles) { - let dist = Math.sqrt((enemy.x - t.x)*(enemy.x - t.x) + (enemy.y - t.y)*(enemy.y - t.y)); - if (dist < tiled) { - tile = t; - tiled = dist; - } - } - } - if (tile && (tile.x != player.x || tile.y != player.y) && (tile.x != KinkyDungeonPlayerEntity.x || tile.y != KinkyDungeonPlayerEntity.y) && MovableTiles.includes(KinkyDungeonMapGet(tile.x, tile.y))) { - Dash = true; - KDMoveEntity(enemy, tile.x, tile.y, true); - enemy.path = undefined; - happened += 1; - if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Dash")) { - enemy.specialCD = enemy.Enemy.specialCD; - } - } - } - return {happened: happened, Dash: Dash}; -} - -function KinkyDungeonSendEnemyEvent(Event, data) { - if (!KDMapHasEvent(KDEventMapEnemy, Event)) return; - for (let enemy of KinkyDungeonEntities) { - if (enemy.Enemy.events) { - for (let e of enemy.Enemy.events) { - if (e.trigger === Event) { - KinkyDungeonHandleEnemyEvent(Event, e, enemy, data); - } - } - } - } -} - -/** - * - * @param {entity} enemy - * @param {any} data - * @param {boolean} aggressive - * @returns {(enemy, AIData) => void} - */ -function KDGetIntentEvent(enemy, data, play, allied, hostile, aggressive) { - let eventWeightTotal = 0; - let eventWeights = []; - - for (let event of Object.values(KDIntentEvents)) { - if (((event.aggressive && aggressive) || (event.nonaggressive && !aggressive)) - && (!event.play || play) - && (!event.noplay || !play)) { - eventWeights.push({event: event, weight: eventWeightTotal}); - eventWeightTotal += event.weight(enemy, data, allied, hostile, aggressive); - } - } - - let selection = KDRandom() * eventWeightTotal; - - for (let L = eventWeights.length - 1; L >= 0; L--) { - if (selection > eventWeights[L].weight) { - return eventWeights[L].event.trigger; - } - } - return (e, a) => {}; -} - -function KDAddEntity(entity) { - KinkyDungeonEntities.push(entity); - KDSetLoadout(entity, null); - if (!entity.data && entity.Enemy.data) entity.data = entity.Enemy.data; - KDUpdateEnemyCache = true; -} -function KDSpliceIndex(index, num = 1) { - KinkyDungeonEntities.splice(index, num); - KDUpdateEnemyCache = true; -} - -/** - * - * @param {entity} enemy - * @param {any} target - * @returns {{x: number, y: number, delta: number}} - */ -function KDGetDir(enemy, target) { - return (enemy.fx && enemy.fy) ? - AIData.kite ? KinkyDungeonGetDirectionRandom(enemy.x - target.x, enemy.y - target.y) : {x: Math.max(-1, Math.min(1, enemy.fx - enemy.x)), y: Math.max(-1, Math.min(1, enemy.fy - enemy.y)), delta: 1} : - (AIData.kite ? KinkyDungeonGetDirectionRandom(enemy.x - target.x, enemy.y - target.y) : KinkyDungeonGetDirectionRandom(target.x - enemy.x, target.y - enemy.y)); -} - - -/** - * - * @param {entity} enemy - * @returns {number} - */ -function KDPullResistance(enemy) { - let tags = enemy?.Enemy?.tags; - if (!tags) return; - return tags.unstoppable ? 0.25 : (tags.unflinching ? 0.5 : 1.0); -} - -/** - * - * @param {number} power - * @param {entity} enemy - * @param {boolean} allowNeg - * @returns {number} - */ -function KDPushModifier(power, enemy, allowNeg = false) { - let pushPower = power; - if (KinkyDungeonIsSlowed(enemy) || enemy.bind > 0) pushPower += 1; - if (KDEntityHasBuff(enemy, "Chilled")) pushPower += 1; - if (enemy.Enemy.tags.stunimmune) pushPower -= 2; - else if (enemy.Enemy.tags.stunresist) pushPower -= 1; - if (enemy.Enemy.tags.unstoppable) pushPower -= 3; - else if (enemy.Enemy.tags.unflinching || enemy.Enemy.tags.slowresist || enemy.Enemy.tags.slowimmune) pushPower -= 1; - if (allowNeg) return pushPower; - return Math.max(0, pushPower); -} - -/** - * - * @param {entity} enemy - * @param {number} amount - * @param {string} type - * @param {any} Damage - * @returns {*} - */ -function KDTieUpEnemy(enemy, amount, type = "Leather", Damage) { - if (!enemy) return 0; - let data = { - amount: amount, - specialAmount: amount, - type: type, // Type of BONDAGE, e.g. leather, rope, etc - Damage: Damage, - }; - - KinkyDungeonSendEvent("bindEnemy", data); - - if (data.amount) { - enemy.boundLevel = (enemy.boundLevel || 0) + data.amount; - } - if (data.type) { - if (!enemy.specialBoundLevel) - enemy.specialBoundLevel = {}; - enemy.specialBoundLevel[type] = (enemy.specialBoundLevel[type] || 0) + data.specialAmount; - } - - return data; -} - -function KDPredictStruggle(enemy, struggleMod, delta) { - let data = { - enemy: enemy, - struggleMod: struggleMod, - delta: delta, - boundLevel: enemy.boundLevel || 0, - specialBoundLevel: enemy.specialBoundLevel ? Object.assign({}, enemy.specialBoundLevel): {}, - }; - - let minLevel = (enemy.buffs && KinkyDungeonGetBuffedStat(enemy.buffs, "MinBoundLevel")) ? KinkyDungeonGetBuffedStat(enemy.buffs, "MinBoundLevel") : 0; - - if (Object.keys(data.specialBoundLevel).length < 1) { - // Simple math, reduce bound level, dont have to worry. - data.struggleMod *= (10 + Math.pow(Math.max(0.01, enemy.hp), 0.75)); - data.boundLevel = Math.max(Math.min(Math.max(0, data.boundLevel), minLevel), data.boundLevel - data.delta * data.struggleMod); - } else { - // We go layer by layer - let bondage = Object.entries(data.specialBoundLevel); - bondage = bondage.sort((a, b) => { - return KDSpecialBondage[a[0]].priority - KDSpecialBondage[b[0]].priority; - }); - // These are the base resources, we exhaust till they are out - data.struggleMod *= 2; - - let i = 0; - while (i < bondage.length - && data.struggleMod > 0 - && data.boundLevel > 0) { - let layer = bondage[i]; - let type = KDSpecialBondage[layer[0]]; - let hBoost = type.healthStruggleBoost; - let pBoost = type.powerStruggleBoost; - let sr = type.struggleRate; - - if (sr <= 0) { - i = bondage.length; - // We are done, cant struggle past here - } - // Otherwise - let totalCost = layer[1] / sr; - if (enemy.hp > 1) - totalCost *= 10/(10 + hBoost * Math.pow(enemy.hp, 0.75)); - totalCost *= 3/(3 + pBoost * enemy.Enemy.power || 0); - - let effect = Math.min(data.struggleMod, totalCost); - let difference = layer[1] * (effect / totalCost); - let origBL = data.boundLevel; - data.boundLevel = Math.max(minLevel, data.boundLevel - difference); - data.specialBoundLevel[layer[0]] -= Math.max(0, origBL - data.boundLevel); - if (data.specialBoundLevel[layer[0]] <= 0) delete data.specialBoundLevel[layer[0]]; - data.struggleMod -= effect; - if (data.struggleMod <= 0) data.struggleMod = 0; - i++; - } - // We can only struggle as much as the current struggle layer - // If we have complicated types we have to do advanced differential calculus - } - - return data; -} - -let KDDomThresh_Loose = 0.5; -let KDDomThresh_Normal = 0.0; -let KDDomThresh_Strict = -0.4; - -let KDDomThresh_Variance = 0.15; // random variance -let KDDomThresh_PerkMod = -0.5; - -/** - * @param {entity} enemy - the enemy to check if the player can domme - * @returns {boolean} - */ -function KDCanDom(enemy) { - if (enemy == KinkyDungeonJailGuard()) return false; - if (KDGameData.KinkyDungeonLeashedPlayer > 0) return false; - if (!enemy.Enemy.bound) return false; - if (KDEnemyHasFlag(enemy, "isSubbing")) return true; - if (KDEnemyHasFlag(enemy, "isDomming")) return false; - if (enemy.Enemy.tags.nosub) return false; - // Very bad pseudo RNG based on enemy.id as seed - // TODO replace with better prng with variable seed - if (enemy.domVariance == undefined) enemy.domVariance = (KDEnemyPersonalities[enemy.personality]?.domVariance || KDDomThresh_Variance) * (2 * KDRandom() - 1); - let modifier = (KinkyDungeonGoddessRep.Ghost + 50)/100 + enemy.domVariance; - if (KinkyDungeonStatsChoice.get("Dominant")) modifier += KDDomThresh_PerkMod; - if (KDEnemyPersonalities[enemy.personality] && KDEnemyPersonalities[enemy.personality].domThresh) return modifier <= KDEnemyPersonalities[enemy.personality].domThresh; - if (KDLoosePersonalities.includes(enemy.personality)) return modifier <= KDDomThresh_Loose; - if (KDStrictPersonalities.includes(enemy.personality)) return modifier <= KDDomThresh_Strict; - - if (KDPlayerIsNotDom()) return false; - return modifier <= KDDomThresh_Normal; -} - -/** - * Returns true if any non-dominant activities are currently being performed on the player which compromises their ability to dominate - * @returns {boolean} - */ -function KDPlayerIsNotDom() { - return KDGameData.KinkyDungeonLeashedPlayer > 1 || KinkyDungeonStatsChoice.get("Submissive") || KDPlayerIsTied(); -} -/** - * Returns true if player has any level of bondage - * @returns {boolean} - */ -function KDPlayerIsTied() { - return KinkyDungeonSlowLevel > 1 || KinkyDungeonGagTotal() > 0.25 || KinkyDungeonIsArmsBound() || KinkyDungeonIsHandsBound() ; -} - -/** - * @param {entity} enemy - * @returns {boolean} - */ -function KDIsBrat(enemy) { - if (KinkyDungeonStatsChoice.get("OnlyBrats")) return true; - if (KinkyDungeonStatsChoice.get("NoBrats")) return false; - if (!KDEnemyPersonalities[enemy.personality]?.brat && !KDEnemyHasFlag(enemy, "forcebrat")) return false; - if (KDPlayerIsNotDom()) return false; - return true; -} - -/** - * Captures helpless enemies near the enemy - * @param {entity} enemy - */ -function KDCaptureNearby(enemy) { - let enemies = KDNearbyEnemies(enemy.x, enemy.y, 1.5, enemy); - for (let en of enemies) { - if (KDHelpless(en) && en.hp < 0.52) { - en.hp = 0; - } - } -} - -/** - * - * @param {entity} enemy - * @param {boolean} guaranteed - * @returns {string} - */ -function KinkyDungeonGetLoadoutForEnemy(enemy, guaranteed) { - if (enemy.Enemy.tags.noshop) return ""; - let loadout_list = []; - for (let s of Object.values(KDLoadouts)) { - let end = false; - if (s.tags) { - for (let t of s.tags) { - if (!enemy.Enemy.tags[t]) { - end = true; - break; - } - } - } - if (s.forbidtags) { - for (let t of s.forbidtags) { - if (enemy.Enemy.tags[t]) { - end = true; - break; - } - } - } - let hasTag = !s.singletag; - if (!end && s.singletag) { - for (let t of s.singletag) { - if (enemy.Enemy.tags[t]) { - hasTag = true; - break; - } - } - } - let hasTag2 = !s.singletag2; - if (!end && s.singletag2) { - for (let t of s.singletag2) { - if (enemy.Enemy.tags[t]) { - hasTag = true; - break; - } - } - } - if (!hasTag) end = true; - if (!hasTag2) end = true; - if (!end && (guaranteed || !s.chance || KDRandom() < s.chance)) { - for (let i = 0; i < (s.multiplier || 1); i++) - loadout_list.push(s.name); - } - } - if (loadout_list.length > 0) return loadout_list[Math.floor(KDRandom() * loadout_list.length)]; - return ""; -} - -/** - * Gets the text for a key, suffixed with the enemy faction or name if available. Otherwise falls back to just the key - * @param {string} key - The base text key - * @param {entity} enemy - The enemy - * @param {boolean} useName - Whether to use the enemy name or faction - * @returns {string} - */ -function KinkyDungeonGetTextForEnemy(key, enemy, useName = false) { - const enemyKey = `${key}${useName ? enemy.Enemy.name : enemy.Enemy.faction}`; - let text = TextGet(enemyKey); - if (!text || text.endsWith(enemyKey)) { - // Couldn't find enemy-specific text - fall back to just the key - text = TextGet(key); - } - return text; -} - - -function KDPlayerIsDefeated() { - return KinkyDungeonFlags.get("playerDefeated"); -} - -function KDPlayerIsDisabled() { - return KinkyDungeonFlags.get("playerDisabled") - || (KinkyDungeonStatBlind > 0 || KinkyDungeonStatBind > 0 || KinkyDungeonStatFreeze > 0 || (KinkyDungeonSlowMoveTurns > 0 && !KinkyDungeonFlags.get("channeling")) || KDGameData.SleepTurns > 0); -} -function KDPlayerIsStunned() { - return KDPlayerIsDisabled() || KinkyDungeonFlags.get("playerStun") - || (KinkyDungeonMovePoints < 0 || KDGameData.KneelTurns > 0 || KinkyDungeonSleepiness > 0); -} - -/** - * - * @param {entity} enemy - * @returns {{suff: string, color: string}} - */ -function KDGetAwareTooltip(enemy) { - if (KDGameData.CurrentDialog && KDGetSpeaker() == enemy && (enemy.aware || enemy.vp > 2)) return { - suff: "Talking", - color: "#ffffff", - }; - if (enemy.aware) { - if (KDHostile(enemy)) { - return { - suff: "Aware", - color: "#ff5555", - }; - } else return { - suff: "AwareFriendly", - color: "#ffffff", - }; - } - if (enemy.vp > 2) return { - suff: "DangerHigh", - color: "#ff5555", - }; - if (enemy.vp > 0.5) return { - suff: "Danger", - color: "#ffaa55", - }; - if (enemy.vp > 0) return { - suff: "Suspicious", - color: "#ffff00", - }; - return { - suff: "Unnoticed", - color: "#88ff88", - }; -} - -/** - * - * @param {string} lock - * @returns {string} - */ -function KDProcessLock(lock) { - if (lock == "Red") return KDRandomizeRedLock(); - else return lock; -} - - -let KDDefaultRestraintThresh = 3; - -/** - * - * @param {entity} enemy - * @param {number} restMult - */ -function KDRestockRestraints(enemy, restMult) { - if ((enemy.Enemy.attack?.includes("Bind") || enemy.Enemy.specialAttack?.includes("Bind")) && !enemy.Enemy.RestraintFilter?.noRestock && !KDEnemyHasFlag(enemy, "restocked")) { - let rCount = KDDetermineBaseRestCount(enemy, restMult); - if ((enemy.items?.length || 0) < rCount) { - KDStockRestraints(enemy, restMult, rCount - (enemy.items?.length || 0)); - KinkyDungeonSetEnemyFlag(enemy, "restocked", 200); - } - if (enemy.Enemy.RestraintFilter?.requiredItems) { - if (!enemy.items) enemy.items = []; - for (let item of enemy.Enemy.RestraintFilter?.requiredItems) { - if (!enemy.items.includes(item)) enemy.items.unshift(item); - } - } - } -} - -/** - * - * @param {entity} enemy - * @param {number} restMult - * @returns {number} - */ -function KDDetermineBaseRestCount(enemy, restMult) { - let rCount = 1; - if (enemy.Enemy.tags.boss) rCount += 6; - else if (enemy.Enemy.tags.miniboss) rCount += 3; - else if (enemy.Enemy.tags.elite) rCount += 2; - else if (!enemy.Enemy.tags.minor) rCount += 1; - if (enemy.Enemy.RestraintFilter?.bonusRestraints) rCount += enemy.Enemy.RestraintFilter?.bonusRestraints; - if (KinkyDungeonStatsChoice.has("TightRestraints")) { - rCount *= 2; - rCount += 1; - } - return Math.ceil(rCount * restMult); -} - -/** - * - * @param {entity} enemy - * @param {number} restMult - * @param {number} [count] - */ -function KDStockRestraints(enemy, restMult, count) { - if (!enemy.items) enemy.items = []; - let rCount = count || KDDetermineBaseRestCount(enemy, restMult); - let rThresh = enemy.Enemy.RestraintFilter?.powerThresh || KDDefaultRestraintThresh; - if (rCount > 0) enemy.items = enemy.items || []; - for (let i = 0; i < rCount; i++) { - let rest = KinkyDungeonGetRestraint( - {tags: KDGetTags(enemy, false)}, MiniGameKinkyDungeonLevel, - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - enemy.Enemy.bypass, - enemy.Enemy.useLock ? enemy.Enemy.useLock : "", - false, - false, - false, - KDGetExtraTags(enemy, true), - true, - { - minPower: rThresh, - noUnlimited: !enemy.Enemy.RestraintFilter?.limitedRestraintsOnly, - onlyLimited: enemy.Enemy.RestraintFilter?.limitedRestraintsOnly,//!enemy.Enemy.RestraintFilter?.invRestraintsOnly, - looseLimit: !enemy.Enemy.RestraintFilter?.limitedRestraintsOnly, - ignore: enemy.items.concat(enemy.Enemy.RestraintFilter?.ignoreInitial || []), - ignoreTags: enemy.Enemy.RestraintFilter?.ignoreInitialTag, - }); - if (rest) { - enemy.items.push(rest.name); - if (KDEnemyIsTemporary(enemy)) { - if (!enemy.tempitems) enemy.tempitems = []; - enemy.tempitems.push(rest.name); - } - } - } - - if (enemy.Enemy.RestraintFilter?.requiredItems) { - if (!enemy.items) enemy.items = []; - for (let item of enemy.Enemy.RestraintFilter?.requiredItems) { - if (!enemy.items.includes(item)) enemy.items.unshift(item); - } - } -} - -/** - * - * @param {entity} enemy - * @param {string} loadout - */ -function KDSetLoadout(enemy, loadout) { - if (loadout) { - let temp = enemy.Enemy.startingItems ? Object.assign([], enemy.Enemy.startingItems) : []; - enemy.items = Object.assign(temp, KDLoadouts[loadout].items); - } - if (!enemy.Enemy.RestraintFilter?.unlimitedRestraints && (enemy.Enemy.attack?.includes("Bind") || enemy.Enemy.specialAttack?.includes("Bind"))) { - let restMult = KDLoadouts[loadout]?.restraintMult || 1; - KDStockRestraints(enemy, restMult); - } -} - -function KDClearItems(enemy) { - if (enemy.items) { - for (let item of enemy.items) { - if (KinkyDungeonFindWeapon(item)) { - KinkyDungeonAddLostItems([{name: item, type: Weapon, id: KinkyDungeonGetItemID()}], false); - } else if (KinkyDungeonGetRestraintByName(item) && KinkyDungeonGetRestraintByName(item).showInQuickInv) { - KinkyDungeonAddLostItems([{name: item, type: LooseRestraint, quantity: 1, id: KinkyDungeonGetItemID()}], false); - } else if (KinkyDungeonFindConsumable(item)) { - KinkyDungeonAddLostItems([{name: item, type: Consumable, quantity: 1, id: KinkyDungeonGetItemID()}], false); - } - } - enemy.items = undefined; - } -} - -/** - * - * @param {entity} enemy - * @param {entity} player - * @returns {boolean} - */ -function KDCanDetect(enemy, player) { - return (KinkyDungeonTrackSneak(enemy, 0, player) || (AIData.playerDist < Math.max(1.5, AIData.blindSight) && enemy.aware)); -} - -/** - * - * @param {entity} enemy - * @param {string} type - * @returns {number} - */ -function KDGetSecurity(enemy, type) { - // Base securities; inherited from BaseSecurity but otherwise populated by the Security matrix of the enemy - let security = KDBaseSecurity[type] != undefined ? KDBaseSecurity[type] : -100; - if (enemy?.Enemy?.Security && enemy.Enemy.Security[type]) - security = enemy.Enemy.Security[type]; - - // Add factional securities - let faction = KDGetFactionOriginal(enemy); - if (KDFactionSecurityMod[faction] && KDFactionSecurityMod[faction][type] != undefined) security = Math.max(security + KDFactionSecurityMod[faction][type], KDFactionSecurityMod[faction][type]); - - // If the enemy is cleared to have security, increase it based on rank - if (security >= -10) { - if (enemy.Enemy.tags.boss) security += 4; - else if (enemy.Enemy.tags.miniboss) security += 3; - else if (enemy.Enemy.tags.elite) security += 2; - else if (!enemy.Enemy.tags.minor) security += 1; - } - return security; -} - -/** - * Reduces the enemy's binding by a certain amount - * @param {entity} enemy - * @param {number} bonus - */ -function KDReduceBinding(enemy, bonus) { - let bindingPercent = enemy.boundLevel > 0 ? (((Math.max(0, enemy.boundLevel - bonus)) / enemy.boundLevel) || 0) : 0; - enemy.boundLevel = Math.max(0, enemy.boundLevel - bonus); - if (enemy.specialBoundLevel) - for (let key of Object.keys(enemy.specialBoundLevel)) { - enemy.specialBoundLevel[key] *= bindingPercent; - } -} - -/** - * Helper function to determine if a character needs punishing - * @param {entity} enemy - * @param {entity} player - */ -function KDPlayerDeservesPunishment(enemy, player) { - if (player.player) { - if (KinkyDungeonFlags.get("PlayerCombat")) return true; - } else { - return true; - } -} - -/** - * - * @param {entity} enemy - */ -function KDPlugEnemy(enemy) { - let plugAmount = KDEntityBuffedStat(enemy, "Plug"); - if (!plugAmount) - KDApplyGenBuffs(enemy, "Plugged", 9999); - else if (plugAmount == 1) { - KinkyDungeonExpireBuff(enemy.buffs, "Plugged"); - KDApplyGenBuffs(enemy, "DoublePlugged", 9998); - } -} - -/** - * - * @param {entity} enemy - * @param {boolean} removeSpecial - * @returns {Record} - */ -function KDGetTags(enemy, removeSpecial) { - let addOn = enemy.Enemy.bound ? KDExtraEnemyTags : undefined; - - let tags = Object.assign({}, enemy.Enemy.tags); - if (addOn) Object.assign(tags, addOn); - if (removeSpecial && enemy.Enemy.specialRemoveTags) { - for (let t of enemy.Enemy.specialRemoveTags) { - delete tags[t]; - } - } - - return tags; -} - -/** - * - * @param {entity} enemy - * @param {boolean} useSpecial - * @returns {Record} - */ -function KDGetExtraTags(enemy, useSpecial) { - let addOn = enemy.Enemy.bound ? KDExtraEnemyTags : undefined; - - let tags = addOn ? Object.assign({}, addOn) : {}; - if (useSpecial && enemy.Enemy.specialExtraTags) { - for (let t of enemy.Enemy.specialExtraTags) { - tags[t] = 0; - } - } - - return tags; -} \ No newline at end of file diff --git a/Game/KinkyDungeonEnemiesList.js b/Game/KinkyDungeonEnemiesList.js deleted file mode 100644 index a5198c5c2..000000000 --- a/Game/KinkyDungeonEnemiesList.js +++ /dev/null @@ -1,2627 +0,0 @@ -"use strict"; -/** - * @type {enemy[]} - */ -let KinkyDungeonEnemies = [ - // Prisoners - {name: "PrisonerBandit", tags: KDMapInit(["prisoner", "bandit", "human", "peaceful", "noshop"]), faction: "Prisoner", immobile: true, lowpriority: true, evasion: -100, armor: 0, followRange: 100, AI: "wander", regen: 0.1, - visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "PrisonerBandit", - Behavior: {noPlay: true}, - terrainTags: {}, floors:KDMapInit([])}, - {name: "FactoryDoll", bound: "FactoryDoll", playLine: "Gagged", tags: KDMapInit(["prisoner", "dollmakerconvert", "doll", "human", "minor", "peaceful", "noshop"]), faction: "Prisoner", lowpriority: true, evasion: -100, armor: 0, followRange: 100, AI: "wander", regen: 0.1, - visionRadius: 0, maxhp: 12, minLevel:0, weight:-10, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, - Behavior: {noPlay: true}, - terrainTags: {"bellowsDoll": 20}, allFloors: true}, - {name: "DollmakerTarget", bound: "FactoryDoll", playLine: "Gagged", tags: KDMapInit(["prisoner", "escapeddoll", "doll", "human", "minor", "peaceful", "noshop"]), - faction: "Prisoner", lowpriority: true, evasion: -100, armor: 0, followRange: 100, AI: "wander", regen: 0.01, - visionRadius: 0, maxhp: 8, minLevel:0, weight:-10, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, - Behavior: {noPlay: true}, - ondeath: [{type: "dollID"}], - terrainTags: {}, allFloors: true}, - - - - // Easy mode rescuer - {name: "ShopkeeperRescue", tags: KDMapInit(["human", "peaceful", "alwayshelp", "noshop", "opendoors"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "guard", - visionRadius: 0, maxhp: 120, regen: 10, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "ShopkeeperRescueChatter", - Behavior: {noPlay: true}, - noDisplace: true, keys: true, - events: [ - {type: "ShopkeeperRescueAI", trigger: "afterEnemyTick"}, - ], - terrainTags: {}, floors:KDMapInit([])}, - - // Easy mode NPC - {name: "ShopkeeperStart", tags: KDMapInit(["human", "peaceful", "alwayshelp", "noshop", "opendoors"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "guard", - visionRadius: 0, maxhp: 120, regen: 10, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "ShopkeeperStart", - Behavior: {noPlay: true}, - noDisplace: true, keys: true, - terrainTags: {}, floors:KDMapInit([])}, - - // Quest NPC - {name: "DressmakerQuest", tags: KDMapInit(["dressmaker", "human", "peaceful", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, - visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "DressmakerQuest", - Behavior: {noPlay: true}, - terrainTags: {}, floors:KDMapInit([])}, - {name: "ApprenticeQuest", tags: KDMapInit(["apprentice", "human", "peaceful", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, - visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "ApprenticeQuest", - Behavior: {noPlay: true}, - terrainTags: {}, floors:KDMapInit([])}, - {name: "BlacksmithQuest", tags: KDMapInit(["human", "peaceful", "alwayshelp", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, - visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "BlacksmithShop", data: {"shop": "BlacksmithShop"}, - Behavior: {noPlay: true}, - terrainTags: {}, floors:KDMapInit([])}, - {name: "DragonheartQuest", tags: KDMapInit(["dragon", "peaceful", "alwayshelp", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, - visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "DragonheartQuest", - Behavior: {noPlay: true}, - terrainTags: {}, floors:KDMapInit([])}, - {name: "MaidforceQuest", tags: KDMapInit(["maid", "peaceful", "alwayshelp", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, - visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "MaidforceQuest", - Behavior: {noPlay: true}, - terrainTags: {}, floors:KDMapInit([])}, - {name: "DragonLeaderDuelist", faction: "Enemy", bound: "DragonLeader", color: "#F92900", tags: KDMapInit(["opendoors", "fire", "ignorenoSP", "noshop", "dragon", "melee", "elite", "dragonRestraints", "unflinching", "handcuffer", "leatherRestraints", "leatherRestraintsHeavy", "fireimmune"]), - ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", focusPlayer: true, - specialCD: 3, specialAttack: "Dash", specialRemove: "BindLockWill", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 3, specialMinrange: 1.5, dashThrough: true, specialsfx: "Miss", - visionRadius: 7, maxhp: 28, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 2, attack: "MeleeBindLockWill", attackWidth: 1, attackRange: 1, power: 4, dmgType: "crush", fullBoundBonus: 2, - terrainTags: {}, shrines: ["Leather"], allFloors: true, - dropTable: [], factionrep: {"Dragon": 0.015}, ondeath: [{type: "removeQuest", quest: "DragonheartQuest"}]}, - {name: "BanditQuest", tags: KDMapInit(["bandit", "peaceful", "alwayshelp", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, - visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "BanditQuest", - Behavior: {noPlay: true}, - terrainTags: {}, floors:KDMapInit([])}, - // End Quest NPC - - {name: "ChainWall", tags: KDMapInit(["construct", "flying", "poisonmmune", "soulimmune", "player", "noknockback", "melee", "temporary", "notalk", "nonvulnerable", "nobrain", "immobile"]), - faction: "Witch", immobile: true, spellResist: 4, lowpriority: true, evasion: -100, armor: 2, followRange: 100, AI: "wander", regen: -0.25, - visionRadius: 0, maxhp: 5, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, - terrainTags: {}, floors:KDMapInit([])}, - - {name: "ForceField", tags: KDMapInit(["construct", "flying", "poisonmmune", "soulimmune", "player", "noknockback", "melee", "temporary", "notalk", "nonvulnerable", "nobrain", "immobile"]), - faction: "Enemy", immobile: true, spellResist: 3, lowpriority: true, evasion: -100, armor: 0, followRange: 100, AI: "wander", regen: -0.6, - visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, - - terrainTags: {}, floors:KDMapInit([])}, - - - // Door lock, trap - {name: "DoorLock", - tags: KDMapInit(["construct", "soulimmune", "melee", "noknockback", "unstoppable", "temporary", "nonvulnerable", "nobrain", "immobile", "poisonimmune", - "soulimmune", - ]), faction: "KinkyConstruct", immobile: true, lowpriority: true, spellResist: 1.5, evasion: -100, armor: 3, followRange: 100, AI: "wander", regen: -1.0, - visionRadius: 0, maxhp: 30, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, - terrainTags: {}, floors:KDMapInit([]), - events: [ - {trigger: "duringDamageEnemy", type: "damageThreshold", power: 1, chance: 1.0}, - ], - }, - - {name: "EarthenMonolith", tags: KDMapInit(["construct", "poisonimmune", "soulimmune", "player", "playerinstakill", "noknockback", "melee", "temporary", "notalk", "immobile", "summonedRock", "fireresist", "nonvulnerable", "nobrain"]), immobile: true, spellResist: 1.0, faction: "Rock", lowpriority: true, evasion: -100, armor: 2.5, followRange: 100, AI: "wander", regen: -0.25, - visionRadius: 0, maxhp: 5, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, - terrainTags: {}, floors:KDMapInit([])}, - {name: "Wall", tags: KDMapInit(["construct", "poisonimmune", "soulimmune", "player", "playerinstakill", "noknockback", "melee", "temporary", "notalk", "nonvulnerable", "immobile", "nobrain"]), immobile: true, spellResist: 4, allied: true, lowpriority: true, evasion: -100, armor: 1, followRange: 100, AI: "wander", regen: -1.0, - visionRadius: 0, maxhp: 25, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, - terrainTags: {}, floors:KDMapInit([])}, - {name: "StaticSphere", tags: KDMapInit(["construct", "flying", "poisonimmune", "soulimmune", "player", "playerinstakill", "noknockback", "melee", "electricImmune", "nowet", "immobile", "temporary", "notalk", "nonvulnerable", "nobrain"]), immobile: true, spellResist: 4, allied: true, lowpriority: true, evasion: -100, armor: 1, followRange: 100, AI: "wander", - visionRadius: 0, maxhp: 20, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, - terrainTags: {}, floors:KDMapInit([]), - events: [ - {type: "CastSpellNearbyEnemy", trigger: "afterEnemyTick", spell: "StaticSphereStrike", aoe: 1.5, player: false}, - {type: "ApplyConductionAoE", trigger: "afterEnemyTick", aoe: 1.5}, - {trigger: "getLights", type: "enemyTorch", power: 5, color: "#ffffff"}, - ], - }, - {name: "Decoy", tags: KDMapInit(["construct", "poisonimmune", "soulimmune", "player", "temporary", "notalk"]), noblockplayer: true, allied: true, evasion: 2, armor: 0, followRange: 100, AI: "wander", triggersTraps: true, - visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 0, attack: "", attackRange: 0, - terrainTags: {}, floors:KDMapInit([])}, - {name: "Ally", tags: KDMapInit(["ghost", "flying", "player", "melee"]), keepLevel: true, allied: true, armor: 0, followRange: 1, AI: "hunt", evasion: 0.33, accuracy: 1.5, - visionRadius: 20, playerBlindSight: 100, maxhp: 8, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 1, attack: "MeleeWill", attackRange: 1, attackWidth: 3, power: 1, dmgType: "slash", CountLimit: true, - terrainTags: {}, floors:KDMapInit([])}, - {name: "AllyDoll", bound: "AllyDoll", color: "#9c2a70", tags: KDMapInit(["human", "player", "gagged", "blindfold", "melee", "glueimmune", "tickleweakness", "nohelp"]), allied: true, armor: 0, followRange: 1, AI: "hunt", - visionRadius: 20, playerBlindSight: 100, maxhp: 8, regen: -0.1, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 2, attack: "MeleeWill", attackRange: 1, attackWidth: 1, power: 1.5, dmgType: "glue", - terrainTags: {}, floors:KDMapInit([])}, - {name: "PetChastity", bound: "AllyDoll", color: "#8888ff", tags: KDMapInit(["human", "player", "gagged", "blindfold", "melee", "charmresist", "soulweakness", "tickleweakness", "nohelp"]), armor: 1.0, followRange: 1, AI: "hunt", - visionRadius: 6, maxhp: 8, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 2, attack: "MeleeWill", attackRange: 1, attackWidth: 1, power: 2, dmgType: "charm", - terrainTags: {}, floors:KDMapInit([])}, - {name: "Pet", color: "#8888ff", tags: KDMapInit(["human", "player", "gagged", "melee", "tickleweakness", "nohelp"]), allied: true, armor: 0, followRange: 4, AI: "hunt", - events: [ - {trigger: "calcManaPool", type: "PetManaRegen", power: 0.01, dist: 1.5}, - ], - visionRadius: 20, playerBlindSight: 100, maxhp: 10, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 2, attack: "", attackRange: 0, power: 1.5, dmgType: "tickle", focusPlayer: true, - terrainTags: {}, floors:KDMapInit([])}, - {name: "PetDisplay", color: "#8888ff", tags: KDMapInit(["human", "player", "gagged", "melee", "meleeresist", "nohelp"]), immobile: true, allied: true, armor: 1.5, followRange: 4, AI: "hunt", - events: [ - {trigger: "calcManaPool", type: "PetManaRegen", power: 0.04, dist: 3.99}, - {trigger: "tick", type: "DisplayAura", power: 0.5, dist: 3.99}, - ], - visionRadius: 0, playerBlindSight: 100, maxhp: 15, minLevel:0, weight:-1000, movePoints: 9999, attackPoints: 2, attack: "", attackRange: 0, power: 1.5, dmgType: "tickle", focusPlayer: true, - terrainTags: {}, floors:KDMapInit([])}, - {name: "PlayerGag", tags: KDMapInit(["construct", "poisonresist", "soulimmune", "player", "melee", "temporary", "notalk"]), noblockplayer: true, allied: true, armor: 0, followRange: 1, AI: "guard", accuracy: 1.5, noTargetSilenced: true, - visionRadius: 20, playerBlindSight: 100, maxhp: 4, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 1, attack: "MeleeWillSilenceSuicideStun", silenceTime: 9, stunTime: 1, attackRange: 1, attackWidth: 1, power: 3.5, dmgType: "grope", - terrainTags: {}, floors:KDMapInit([])}, - {name: "ShadowWarrior", tags: KDMapInit(["ghost", "player", "flying", "melee", "tickleimmune", "glueimmune", "temporary", "notalk"]), noblockplayer: true, allied: true, armor: 0, followRange: 1, AI: "hunt", evasion: 1, - spells: ["AllyShadowStrike"], spellCooldownMult: 1, spellCooldownMod: 0, - visionRadius: 20, playerBlindSight: 100, maxhp: 11, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 1, attack: "Spell", attackRange: 0, power: 1, - terrainTags: {}, floors:KDMapInit([])}, - - {name: "FireElemental", color: "#FF6200", tags: KDMapInit(["elemental", "flying", "fire", "player", "ranged", "charmimmune", "fireimmune", "coldweakness", "acidweakness", "icesevereweakness", "stunweakness", "nohelp"]), keepLevel: true, allied: true, armor: 0, kite: 1.5, followRange: 3, playerFollowRange: 1, AI: "hunt", - spells: ["AllyFirebolt"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, spellRdy: true, evasion: 0.5, CountLimit: true, - visionRadius: 20, playerBlindSight: 100, maxhp: 8, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 1, attack: "Spell", attackRange: 0, power: 1, - terrainTags: {}, floors:KDMapInit([]), - events: [ - {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Ember", time: 3, power: 2, chance: 0.2, aoe: 1.5}, - {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff8933"}, - ], - }, - {name: "WaterMote", color: "#73efe8", tags: KDMapInit(["elemental", "flying", "water", "player", "melee", "charmimmune", "fireresist", "iceweakness", "acidimmune", "electricsevereweakness", "nohelp"]), keepLevel: true, allied: true, armor: 0, followRange: 1, playerFollowRange: 1, AI: "hunt", - evasion: 1.0, CountLimit: true, specialAttack: "Stun", specialCD: 7, - visionRadius: 20, playerBlindSight: 100, maxhp: 8, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 2, attack: "MeleeWill", attackRange: 1, attackWidth: 1, power: 2, stunTime: 3, dmgType: "acid", - terrainTags: {}, floors:KDMapInit([]), - events: [{trigger: "afterEnemyTick", type: "createWater", power: 1, chance: 0.5, aoe: 0.5}],}, - {name: "EarthMote", color: "#e64539", tags: KDMapInit(["elemental", "flying", "earth", "player", "melee", "charmimmune", "fireresist", "electricresist", "tickleresist", "nohelp"]), keepLevel: true, allied: true, followRange: 1, playerFollowRange: 1, AI: "hunt", - evasion: -0.4, armor: 2.0, spellResist: 0.5, CountLimit: true, - visionRadius: 20, playerBlindSight: 100, maxhp: 8, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 4, attack: "MeleeWillSlow", attackRange: 1, attackWidth: 1, power: 6, dmgType: "crush", - terrainTags: {}, floors:KDMapInit([]), - events: [{trigger: "death", type: "createEffectTile", kind: "Cracked", power: 1, chance: 1, aoe: 0.5, time: 40, variance: 10}],}, - {name: "AirMote", color: "#ffffff", tags: KDMapInit(["elemental", "flying", "air", "nowet", "player", "ranged", "charmimmune", "fireweakness", "electricresist", "stunimmune", "painresist", "tickleweakness", "groperesist", "nohelp"]), keepLevel: true, allied: true, followRange: 3, kite: 1.5, playerFollowRange: 1, AI: "hunt", - spells: ["AllyWindBlast"], spellCooldownMult: 1, spellCooldownMod: 0, spellRdy: true, evasion: 1.0, CountLimit: true, castWhileMoving: true, - visionRadius: 20, playerBlindSight: 100, maxhp: 8, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 1, attack: "Spell", attackRange: 0, power: 1, - terrainTags: {}, floors:KDMapInit([])}, - - {name: "Golem", tags: KDMapInit(["construct", "poisonimmune", "soulimmune", "player", "melee", "fireresist", "unstoppable", "tickleresist", "groperesist", "electricresist", "notalk"]), keepLevel: true, allied: true, armor: 2.0, spellResist: 0.4, followRange: 1, AI: "hunt", - visionRadius: 20, playerBlindSight: 100, maxhp: 18, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "MeleeWill", attackRange: 1, attackWidth: 1, power: 4.5, accuracy: 0.7, CountLimit: true, - terrainTags: {}, floors:KDMapInit([])}, - {name: "StormCrystal", tags: KDMapInit(["construct", "flying", "poisonimmune", "soulimmune", "player", "ranged", "unstoppable", "meleeresist", "tickleimmune", "electricimmune", "soulimmune", "temporary", "notalk", "nonvulnerable", "immobile", "nobrain"]), immobile: true, noblockplayer: true, allied: true, armor: 1.5, followRange: 1, AI: "wander", evasion: -10, - spells: ["AllyCrackle"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, - visionRadius: 6, maxhp: 30, regen: -1, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 1, attack: "Spell", attackRange: 0, power: 1, - terrainTags: {}, floors:KDMapInit([]), - events: [ - {trigger: "getLights", type: "enemyTorch", power: 8, color: "#8888ff"}, - ], - }, - - - {name: "HolyConstruct", faction: "Angel", clusterWith: "angel", color: "#ffffaa", tags: KDMapInit(["opendoors", "minor", "holy", "construct", "ranged", "soulimmune", "meleeresist", "unstoppable", "celestialRopes", "coldsevereweakness", "flying"]), - cohesion: 0.7, cohesionRange: 10, - spellResist: 3, - followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 3, AI: "hunt", buffallies: true, - spells: ["OrbHeal", "CelestialBolt"], spellCooldownMult: 2, spellCooldownMod: 0, tilesMinRange: 1, stopToCast: true, kite: 1.5, kiteChance: 0.9, - visionRadius: 10, maxhp: 7, minLevel: 0, weight: -1, movePoints: 3, attackPoints: 4, attack: "SpellMeleeBlindBind", blindTime: 3, attackWidth: 8, attackRange: 1, power: 4, dmgType: "fire", - terrainTags: {"goddessRage":7, "willPleased":2, "willFriendly":2, "angel": 6}, shrines: ["Will"], allFloors: true, dropTable: [{name: "Ectoplasm", weight: 9}, {name: "ElfCrystal", weight: 3}], - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffff44"} - ], - }, - - {name: "Angel", bound: "Angel", faction: "Angel", color:"#ffffaa", tags: KDMapInit(["angel", "flying", "ranged", "divineRestraints", "meleeresist", "unflinching"]), - followRange: 0, AI: "hunt", evasion: 0.25, attackWhileMoving: true, - spells: ["HeatBolt", "WitchElectrify", "EnemyCorona"], spellCooldownMult: 0, spellCooldownMod: 4, castWhileMoving: true, noSpellsLowSP: true, spellRdy: true, - visionRadius: 10, maxhp: 25, spellResist: 3, minLevel: 4, movePoints: 1.7, attackPoints: 3, attack: "SpellMeleeBindLock", attackRange: 1, attackWidth: 3, power: 2, fullBoundBonus: 4, dmgType: "tickle", - attackLock: "Blue", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 6, color: "#ffff44"}, - ], - terrainTags: {"goddessRage": 0.4, "increasingWeight": 0.2, "goddessAnger": 0.6, "angel": 3,}, allFloors: true, weight: -0.5, - dropTable: [{name: "MagicSword", weight: 1, ignoreInInventory: true}, {name: "MagicSpear", weight: 1, ignoreInInventory: true}, {name: "MagicAxe", weight: 1, ignoreInInventory: true}, {name: "MagicFlail", weight: 1, ignoreInInventory: true}, {name: "MagicHammer", weight: 1, ignoreInInventory: true}], - rep: {"Will": -1, "Elements": -1, "Conjure": -1, "Illusion": -1}}, - - {name: "BlindZombie", bound: "Zombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["ignoreharmless", "minor", "zombie", "melee", "fireweakness", "ribbonRestraints", "meleeweakness", "jail"]), evasion: -1, ignorechance: 0.33, armor: 0, followRange: 1, AI: "wander", - visionRadius: 2.5, maxhp: 8, minLevel:0, weight:14, movePoints: 3, attackPoints: 4, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"increasingWeight":-1.5}, floors:KDMapInit(["grv"]), dropTable: [], difficulty: 0.9}, - {name: "FastZombie", bound: "Zombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["ignoreharmless", "zombie", "melee", "fireweakness", "ribbonRestraints", "meleeweakness", "jail"]), evasion: -1, ignorechance: 0.33, armor: 1, followRange: 1, AI: "hunt", - visionRadius: 5, maxhp: 10, minLevel:1, weight:9, movePoints: 3, attackPoints: 4, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"secondhalf":10, "lastthird":14}, floors:KDMapInit(["grv"]), dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, - {name: "SummonedZombie", bound: "Zombie", playLine: "Zombie", regen: -0.7, clusterWith: "zombie", tags: KDMapInit(["ignoreharmless", "zombie", "melee", "fireweakness", "ribbonRestraints", "meleeweakness", "temporary"]), evasion: -1, ignorechance: 0.33, armor: 1, followRange: 1, AI: "hunt", - visionRadius: 5, maxhp: 10, minLevel:1, weight:-1000, movePoints: 3, attackPoints: 3, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"secondhalf":10, "lastthird":14}, floors:KDMapInit([])}, - {name: "MageZombie", bound: "MageZombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["leashing", "zombie", "ranged", "fireweakness", "ribbonRestraints", "meleeweakness", "hunter", "jail"]), spellResist: 0.5, evasion: -1, armor: 0, followRange: 2, AI: "hunt", - spells: ["ZombieOrb", "ZombieOrbIce"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, projectileAttack: true, - visionRadius: 6, maxhp: 13, minLevel:2, weight:14, movePoints: 3, attackPoints: 4, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, - attackLock: "Purple", - terrainTags: {}, floors:KDMapInit(["grv", "tmb"]), dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10}]}, - {name: "TalismanZombie", bound: "TalismanZombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["leashing", "zombie", "ranged", "fireweakness", "ribbonRestraints", "meleeweakness", "hunter", "jail"]), spellResist: 0.5, evasion: -1, armor: 0, followRange: 3, AI: "hunt", - spells: ["ZombieOrb", "ZombieBuff", "OrbHeal", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, kite: 1.5, projectileAttack: true, - visionRadius: 6, maxhp: 20, minLevel:3, weight:14, movePoints: 3, attackPoints: 4, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, - attackLock: "Purple", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffff44"}, - ], - terrainTags: {"mummy": 3}, floors:KDMapInit(["grv", "tmb"]), dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10}]}, - {name: "SamuraiZombie", bound: "SamuraiZombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["leashing", "zombie", "melee", "elite", "fireweakness", "unflinching", "ropeRestraints", "jail", "ropeRestraints2", "meleeweakness", "hunter"]), evasion: -1, armor: 2, followRange: 1, AI: "hunt", - stunTime: 2, specialCD: 6, specialAttack: "Stun", specialRemove: "BindLock", specialPower: 5, specialDamage: "pain", - specialCDonAttack: false, visionRadius: 6, maxhp: 20, minLevel:4, weight:9, movePoints: 3, attackPoints: 3, attack: "MeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, specialWidth: 5, specialRange: 1, - terrainTags: {"secondhalf":5, "lastthird":5}, shrines: ["Will"], floors:KDMapInit(["grv", "tmb"]), dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Sword", weight: 3.5, ignoreInInventory: true},]}, - {name: "NawashiZombie", bound: "NawashiZombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["leashing", "zombie", "melee", "elite", "fireweakness", "unflinching", "ropeRestraints", "jail", "ropeRestraints2", "meleeweakness", "hunter"]), evasion: -1, armor: 0, followRange: 1, AI: "hunt", - visionRadius: 8, maxhp: 12, minLevel:0, weight:2, movePoints: 2, attackPoints: 2, attack: "MeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, difficulty: 1.4, - terrainTags: {"secondhalf":1, "lastthird":2}, shrines: [], floors:KDMapInit(["grv", "tmb"]), dropTable: [{name: "Gold", amountMin: 5, amountMax: 15, weight: 10}, {name: "Rope", weight: 3.5, ignoreInInventory: true}, {name: "Scissors", weight: 0.5, ignoreInInventory: true},]}, - - {name: "Ninja", playLine: "Hunter", faction: "Bountyhunter", bound: "Ninja", clusterWith: "human", color: "#814BB7", tags: KDMapInit(["leashing", "opendoors", "human", "guardCall", "imprisonable", "bountyhunter", "ninja", "melee", "ropeRestraints", "ropeRestraints2", "jailer", "unarmedresist", "slashresist", "glueweakness", "chainweakness", "search"]), followLeashedOnly: true, blindSight: 5, followRange: 1, AI: "hunt", projectileAttack: true, - stunTime: 4, specialCD: 6, specialCharges: 6, specialAttack: "Stun", specialRemove: "BindLock", specialCDonAttack: true, strictAttackLOS: true, focusPlayer: true, - visionRadius: 7, maxhp: 12, minLevel:4, weight:5, movePoints: 1, attackPoints: 3, attack: "MeleeBindLock", attackWidth: 1, attackRange: 1, power: 1.5, dmgType: "crush", fullBoundBonus: 1.5, specialWidth: 1, specialAttackPoints: 3, specialRange: 4, specialMinrange: 1.5, //specialFollow: 3, - terrainTags: {"secondhalf":3, "lastthird":7, "ropeAnger": 2, "bountyhunter": 8, "rope": 5}, shrines: ["Illusion", "Rope"], floors:KDMapInit(["cat", "tmb", "tmp", "cry"]), - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, - {name: "Deputy", playLine: "Officer", color: "#1451f1", faction: "Bountyhunter", bound: "Ninja", clusterWith: "human", tags: KDMapInit(["leashing", "opendoors", "human", "police", "guardCall", "bountyhunter", "handcuffer", "steelCuffs", "police", "melee", "search", "jail", "jailer"]), followLeashedOnly: true, blindSight: 5, followRange: 1, AI: "hunt", projectileAttack: true, - stunTime: 5, specialCD: 11, specialCharges: 4, specialAttack: "Stun", specialRemove: "BindLock", specialCDonAttack: true, strictAttackLOS: true, specialWidth: 2, specialAttackPoints: 4, specialRange: 5, specialMinrange: 1.5, //specialFollow: 3, - visionRadius: 8, maxhp: 12, minLevel:2, weight:1, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 3, - terrainTags: {"secondhalf":2, "lastthird":4, "leatherAnger": 2, "metalAnger": 2, "bountyhunter": 8, "metal": 2}, shrines: ["Leather", "Metal"], floors:KDMapInit(["grv", "jng", "lib", "cry"]), - dropTable: [{name: "Donut", weight: 1}]}, - {name: "NinjaStalker", playLine: "Hunter", faction: "Bountyhunter", bound: "NinjaStalker", clusterWith: "human", color: "#814BB7", tags: KDMapInit(["leashing", "opendoors", "ninja", "human", "bountyhunter", "melee", "ropeRestraints", "ropeRestraints2", "unarmedresist", "slashresist", "glueweakness", "chainweakness", "search"]), blindSight: 5, followRange: 1, AI: "ambush", stealth: 1, noReveal: true, - ambushRadius: 1.9, wanderTillSees: true, visionRadius: 7, maxhp: 12, minLevel:4, weight:4, movePoints: 1, attackPoints: 3, focusPlayer: true, - attack: "MeleeBindLock", attackWidth: 1, attackRange: 1, power: 3, dmgType: "crush", fullBoundBonus: 2, specialWidth: 1, specialAttackPoints: 3, specialRange: 4, specialMinrange: 1.5, //specialFollow: 3, - terrainTags: {"secondhalf":3, "lastthird":7, "ropeAnger": 2, "bountyhunter": 8, "rope": 5}, shrines: ["Illusion", "Rope"], floors:KDMapInit(["cat", "tmb", "tmp", "cry"]), - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, - {name: "Nawashi", playLine: "Hunter", faction: "Bountyhunter", bound: "Nawashi", clusterWith: "construct", color: "#5261ff", tags: KDMapInit(["leashing", "opendoors", "guardCall", "human", "bountyhunter", "elite", "melee", "ropeRestraints", "ropeRestraints2", "ropeRestraintsWrist", "ropeAuxiliary", "jail", "jailer", "ropeRestraintsHogtie"]), - spells: ["RopeAttack"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, stealth: 2, noReveal: true, focusPlayer: true, - followLeashedOnly: true, blindSight: 10, followRange: 1, kite: 3, AI: "hunt", evasion: 0.5, dontKiteWhenDisabled: true, - visionRadius: 7, maxhp: 22, minLevel:8, weight:1, movePoints: 1.5, attackPoints: 2, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "crush", fullBoundBonus: 1, specialWidth: 1, specialAttackPoints: 3, specialRange: 4, specialMinrange: 1.5, //specialFollow: 3, - terrainTags: {"secondhalf":1, "lastthird":2, "ropeAnger": 1, "ropeRage": 1, "bountyhunter": 4, "rope": 5}, shrines: ["Rope"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 10}, {name: "Scissors", ignoreInInventory: true, weight: 10}, {name: "EnchKnife", ignoreInInventory: true, weight: 1}, {name: "Rope", weight: 100, ignoreInInventory: true},]}, - - {name: "Maidforce", faction: "Maidforce", bound: "Maid", clusterWith: "maid", playLine: "SubMaid", color: "#814BB7", tags: KDMapInit(["leashing", "submissive", "tickleweakness", "imprisonable", "opendoors", "human", "maid", "melee", "ropeRestraints", "ropeRestraints2", "handcuffer", "maidVibeRestraintsLimited", "maidRestraintsLight", "jail", "search"]), blindSight: 3, followRange: 1, AI: "hunt", - stealth: 4, noReveal: true, bindOnDisableSpecial: true, bindOnDisable: true, hitsfx: "Tickle", - specialCD: 3, specialAttack: "BindLock", specialCDonAttack: true, - visionRadius: 6, maxhp: 8, minLevel:0, weight:-2, movePoints: 2, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 2, dmgType: "tickle", fullBoundBonus: 2, - terrainTags: {"secondhalf":1, "lastthird":1, "illusionAnger": 22, "illusionRage": 12, "increasingWeight":-1, "maid": 9}, shrines: ["Illusion"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, - {name: "MaidforcePara", faction: "Maidforce", bound: "MaidforcePara", clusterWith: "maid", playLine: "DomMaid", color: "#814BB7", tags: KDMapInit(["leashing", "opendoors", "tickleweakness", "guardCall", "human", "miniboss", "maid", "ranged", "ropeRestraints", "ropeRestraints2", "handcuffer", "maidVibeRestraintsLimited", "maidRestraintsLight", "hunter"]), followLeashedOnly: true, blindSight: 5, followRange: 4, AI: "hunt", guardChance: 0.6, projectileAttack: true, - spells: ["ParasolBuff", "Hairpin", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: 0, buffallies: true, kite: 2.5, - stealth: 3, disarm: 0.5, spellRdy: true, - visionRadius: 8, maxhp: 10, minLevel:0, weight:-2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", - terrainTags: {"secondhalf":1, "lastthird":1, "illusionAnger": 17, "illusionRage": 11, "maid": 6}, shrines: ["Illusion"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, ]}, - {name: "MaidforceStalker", faction: "Maidforce", bound: "MaidforceStalker", clusterWith: "maid", playLine: "DomMaid", color: "#814BB7", - tags: KDMapInit(["leashing", "opendoors", "human", "maid", "melee", "maidRestraints", "handcuffer", "maidVibeRestraintsLimited", "unarmedresist", "tickleweakness", "slashresist", "glueweakness", "chainweakness", "jail", "jailer", "hunter"]), - followLeashedOnly: true, blindSight: 5, followRange: 1, AI: "hunt", guardChance: 0.6, projectileAttack: true, evasion: 0.33, - spells: ["FlashBomb", "MirrorImage"], spellCooldownMult: 1, spellCooldownMod: 0, kite: 2, dontKiteWhenDisabled: true, castWhileMoving: true, - stealth: 1, - visionRadius: 7, maxhp: 12, minLevel:4, weight:-2, movePoints: 1, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"secondhalf":1, "lastthird":1, "illusionAnger": 15, "illusionRage": 10, "increasingWeight":0.5, "maid": 5}, shrines: ["Illusion"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "PotionInvisibility", weight: 3}]}, - {name: "MaidforceStalkerImage", faction: "Maidforce", color: "#814BB7", tags: KDMapInit(["ghost", "maid", "melee"]), followLeashedOnly: true, blindSight: 12, followRange: 2, AI: "hunt", guardChance: 0.6, projectileAttack: true, evasion: -10, - kite: 2, dontKiteWhenDisabled: true, - stealth: 1, - visionRadius: 7, maxhp: 1, minLevel:0, weight:-10, movePoints: 1.25, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "grope", - terrainTags: {}, shrines: ["Illusion"], floors:KDMapInit([]),}, - {name: "MaidforceMafia", faction: "Maidforce", bound: "MaidforceMafia", clusterWith: "maid", color: "#814BB7", playLine: "DomMaid", tags: KDMapInit(["leashing", "opendoors", "tickleweakness", "human", "elite", "maid", "ranged", "maidRestraints", "handcuffer", "maidVibeRestraintsLimited", "jail", "jailer", "hunter"]), followLeashedOnly: true, followRange: 4, AI: "hunt", guardChance: 0.6, projectileAttack: true, evasion: -0.25, - spells: ["RubberBullets"], spellCooldownMult: 1, spellCooldownMod: 0, kite: 3, noKiteWhenHarmless: true, noSpellsWhenHarmless: true, - events: [ - // It's supposed to be the light of the cigar - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ffaa00"}, - ], - visionRadius: 7, maxhp: 14, minLevel:4, weight:-9, movePoints: 3, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "pain", fullBoundBonus: 3, - terrainTags: {"secondhalf":1, "lastthird":1, "open": 6, "illusionAnger": 12, "illusionRage": 5, "latexAnger": 4, "maid": 5}, shrines: ["Illusion"], allFloors: true, attackLock: "Red", - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}]}, - {name: "MaidforceHead", faction: "Maidforce", bound: "MaidforceHead", clusterWith: "maid", color: "#814BB7", playLine: "HeadMaid", tags: KDMapInit(["leashing", "guardCall", "tickleweakness", "opendoors", "human", "maid", "unflinching", "boss", "ranged", "maidRestraintsNonChastity", "maidVibeRestraints", "handcuffer", "jailer", "hunter"]), followLeashedOnly: true, followRange: 3.5, AI: "hunt", guardChance: 0.6, projectileAttack: true, - spells: ["AmpuleGreen", "Hairpin", "RestrainingDevice"], spellCooldownMult: 1, spellCooldownMod: 0, hitsfx: "Tickle", disarm: 1, ignoreStaminaForBinds: true, sneakThreshold: 1, focusPlayer: true, - useLock: "Red", kite: 2.5, - RestraintFilter: { - ignoreInitialTag: ["maidVibeRestraints"], - }, - RemoteControl: { - remote: 5, remoteAmount: 4, - }, bypass: true, noLeashUnlessExhausted: true, evasion: 0.15, //-15 weight - events: [ - {trigger: "afterEnemyTick", type: "maidforceHeadAura", dist: 1.5}, - ], - visionRadius: 8, maxhp: 28, minLevel:6, weight:-14, movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLockAllVibe", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 1.5, dmgType: "tickle", fullBoundBonus: 1, - terrainTags: {"secondhalf":1, "lastthird":1, "open": 4, "illusionAnger": 10, "illusionRage": 4, "maid": 12}, shrines: ["Illusion"], allFloors: true, attackLock: "Red", - dropTable: [{name: "Gold", amountMin: 30, amountMax: 40, weight: 20}, {name: "EnchKnife", ignoreInInventory: true, weight: 1}]}, - - {name: "Skeleton", bound: "Skeleton", playLine: "Skeleton", clusterWith: "skeleton", tags: KDMapInit(["nosub", "leashing", "skeleton", "gagged", "melee", "ropeRestraints", "leatherRestraints", "clothRestraints", "coldresist", "crushweakness", "search"]), ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", - visionRadius: 4, maxhp: 5, minLevel:1, weight:8, movePoints: 2, attackPoints: 3, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1.0, - terrainTags: {"secondhalf":4, "increasingWeight":-0.5}, shrines: ["Leather"], floors:KDMapInit(["cat", "tmb"]), dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, - {name: "SummonedSkeleton", bound: "Skeleton", playLine: "Skeleton", clusterWith: "skeleton", tags: KDMapInit(["nosub", "leashing", "skeleton", "gagged", "melee", "coldresist", "ropeRestraints", "leatherRestraints", "clothRestraints", "crushweakness"]), ignorechance: 0, armor: 0, followRange: 1, AI: "guard", - visionRadius: 5, maxhp: 5, minLevel:1, weight:8, movePoints: 2, attackPoints: 3, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 0.5, dmgType: "grope", fullBoundBonus: 0.5, - terrainTags: {"lastthird":-8}, shrines: [], floors:KDMapInit([])}, - {name: "LesserSkeleton", bound: "Skeleton", playLine: "Skeleton", noChaseUnrestrained: true, clusterWith: "skeleton", tags: KDMapInit(["nosub", "leashing", "ignorenoSP", "skeleton", "gagged", "melee", "coldresist", "crushweakness"]), ignorechance: 0, armor: 0, followRange: 1, AI: "wander", evasion: -2, - visionRadius: 1, maxhp: 2.5, minLevel:0, weight:10, movePoints: 2, attackPoints: 3, attack: "MeleeWillSlow", attackWidth: 1, attackRange: 1, power: 0.5, dmgType: "grope", fullBoundBonus: 0.5, - terrainTags: {"secondhalf":-8, "lastthird":-8, "increasingWeight":-1}, floors:KDMapInit(["cat", "tmb"])}, - {name: "GreaterSkeleton", bound: "GreaterSkeleton", playLine: "Skeleton", clusterWith: "skeleton", tags: KDMapInit(["nosub", "leashing", "skeleton", "gagged", "melee", "unflinching", "elite", "coldresist", "crushweakness", "hunter"]), ignorechance: 0, armor: 1, followRange: 1.5, AI: "hunt", guardChance: 0.6, disarm: 0.5, - visionRadius: 4, maxhp: 10, minLevel:9, weight:5, movePoints: 3, attackPoints: 3, attack: "MeleeWillSlow", attackWidth: 3, attackRange: 1, power: 5, dmgType: "crush", fullBoundBonus: 0, - terrainTags: {"secondhalf":4, "lastthird":6, "increasingWeight":0.5}, floors:KDMapInit(["cat", "tmb", "tmp"]), dropTable: [{name: "PotionStamina", weight: 3}, {name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Hammer", weight: 50, ignoreInInventory: true}]}, - {name: "HeavySkeleton", bound: "HeavySkeleton", playLine: "Skeleton", clusterWith: "skeleton", color: "#aaaaaa", tags: KDMapInit(["nosub", "leashing", "skeleton", "gagged", "melee", "unflinching", "elite", "coldresist", "crushweakness", "hunter", "obsidianRestraints"]), ignorechance: 0, armor: 2, followRange: 1.5, AI: "hunt", guardChance: 0.6, disarm: 0.5, - visionRadius: 6, maxhp: 16, minLevel:15, weight:4, movePoints: 3, attackPoints: 3, attack: "MeleeWillSlowBind", attackWidth: 3.6, attackRange: 1, power: 5, dmgType: "crush", fullBoundBonus: 3, - terrainTags: {"secondhalf":1, "lastthird":4, "increasingWeight":1}, floors:KDMapInit(["cat", "tmb", "tmp"]), - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Axe", weight: 50, ignoreInInventory: true}]}, - - {name: "Ghost", color: "#FFFFFF", faction: "Ghost", clusterWith: "ghost", tags: KDMapInit(["ignorenoSP", "ghost", "flying", "spooky", "melee", "glueimmune", "chainimmune"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", guardChance: 0.6, hitsfx: "Tickle", - visionRadius: 6, blindSight: 3, evasion: 9.0, alwaysEvade: true, maxhp: 1, minLevel:0, weight:0.1, movePoints: 3, attackPoints: 2, attack: "MeleeWill", attackWidth: 3, attackRange: 1, power: 1, dmgType: "tickle", fullBoundBonus: 0, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ffffff"}, - ], - terrainTags: {"ghost" : 4.9}, shrines: ["Illusion"], allFloors: true, - dropTable: [{name: "Ectoplasm", weight: 1}]}, - {name: "TickleTerror", faction: "Ghost", color: "#FFFFFF", tags: KDMapInit(["chestTrap", "ignorenoSP", "comfyRestraints", "spooky", "ghost", "flying", "melee", "glueimmune", "chainimmune", "meleeresist"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", noAlert: true, hitsfx: "Tickle", - visionRadius: 8, blindSight: 8, evasion: 0.5, maxhp: 12, minLevel:4, weight:0.1, movePoints: 2, attackPoints: 2, attack: "MeleeWillBind", attackWidth: 3, attackRange: 1, power: 3, dmgType: "tickle", fullBoundBonus: 3, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ffffff"}, - ], - terrainTags: {"ghost" : 1.9, "increasingWeight": 0.2, "chestTrap": 50, "goddessRage": 4}, shrines: ["Illusion"], allFloors: true, - dropTable: [{name: "Ectoplasm", weight: 1}]}, - {name: "HugHorror", faction: "Ghost", color: "#FFFFFF", tags: KDMapInit(["chestTrap", "ignorenoSP", "ghostRestraints", "spooky", "ghost", "flying", "melee", "glueimmune", "chainimmune", "meleeresist"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", noAlert: true, - visionRadius: 8, blindSight: 8, evasion: 0.2, maxhp: 20, minLevel:4, weight:0.1, movePoints: 3, attackPoints: 2, attack: "MeleeWillBindSlow", attackWidth: 3, attackRange: 1, power: 2, dmgType: "crush", fullBoundBonus: 2, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ffffff"}, - ], - terrainTags: {"ghost" : 1.9, "increasingWeight": 0.2, "chestTrap": 50, "goddessRage": 4}, shrines: ["Illusion"], allFloors: true, - dropTable: [{name: "Ectoplasm", weight: 1}]}, - {name: "GreedyGhast", faction: "Ghost", color: "#FFFFFF", tags: KDMapInit(["chestTrap", "ignorenoSP", "ghost", "flying", "melee", "spooky", "glueimmune", "chainimmune", "meleeresist"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", noAlert: true, - visionRadius: 6, blindSight: 4, evasion: 0.5, maxhp: 7, minLevel:2, weight:0.1, movePoints: 2, attackPoints: 2, attack: "MeleeWill", attackWidth: 3, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ffffff"}, - ], - terrainTags: {"ghost" : 1.9, "increasingWeight": 0.05, "chestTrap": 100, "goddessRage": 5}, shrines: ["Illusion"], allFloors: true, - dropTable: [{name: "Ectoplasm", weight: 1}]}, - - {name: "OrbGuardian", faction: "Ghost", alwaysHostile: true, clusterWith: "ghost", tags: KDMapInit(["divine", "melee", "flying", "glueimmune", "chainimmune"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", - spells: ["ShadowStrike"], spellCooldownMult: 1, spellCooldownMod: 0, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 5, color: "#440099"}, - ], - visionRadius: 100, blindSight: 100, evasion: 0.5, alwaysEvade: true, maxhp: 12, minLevel:0, weight:-10, movePoints: 2, attackPoints: 1, attack: "Spell", attackWidth: 3, - attackRange: 1, power: 4, dmgType: "cold", fullBoundBonus: 0, - terrainTags: {}, shrines: [], floors:KDMapInit([]), - dropTable: [{name: "Ectoplasm", weight: 1}]}, - - - - {name: "TickleHand", hidetimerbar: true, faction: "Witch", clusterWith: "ghost", color: "#FFFFFF", tags: KDMapInit(["ignorenoSP", "ghost", "flying", "melee", "glueimmune", "chainimmune"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", regen: -0.1, noAlert: true, hitsfx: "Tickle", - visionRadius: 10, blindSight: 3, evasion: 9.0, alwaysEvade: true, maxhp: 1, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 1, attack: "MeleeWill", attackWidth: 3, attackRange: 1, power: 3, dmgType: "tickle", fullBoundBonus: 0, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ffffff"}, - ], - terrainTags: {}, shrines: [], allFloors: true}, - {name: "TickleHandSlave", faction: "Witch", color: "#FFFFFF", tags: KDMapInit(["ignorenoSP", "ghost", "flying", "melee", "glueimmune", "chainimmune"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", - master: {type: "ConjurerTickler", range: 3, dependent: true}, noAlert: true, hitsfx: "Tickle", - visionRadius: 10, blindSight: 3, evasion: 9.0, alwaysEvade: true, maxhp: 1, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 1, attack: "MeleeWill", attackWidth: 3, attackRange: 1, power: 3, dmgType: "tickle", fullBoundBonus: 0, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ffffff"}, - ], - terrainTags: {}, shrines: [], allFloors: true, - Reputation: { - noRepLoss: true, - }, - dropTable: [{name: "Ectoplasm", weight: 1}]}, - {name: "Frog", faction: "Witch", clusterWith: "beast", color: "#00FF44", tags: KDMapInit(["summoned", "beast", "ranged", "pierceweakness", "electricsevereweakness", "acidresist"]), followLeashedOnly: true, armor: 1, followRange: 1, AI: "hunt", - pullTowardSelf: true, pullDist: 3, master: {type: "Conjurer", range: 3}, projectileAttack: true, projectileTargeting: true, - visionRadius: 8, maxhp: 19, minLevel:0, weight:0, movePoints: 1.5, attackPoints: 2, attack: "MeleePullWill", attackRange: 4, attackWidth: 1, power: 4, strictAttackLOS: true, dmgType: "tickle", - terrainTags: {}, floors:KDMapInit([])}, - {name: "Conjurer", faction: "Witch", clusterWith: "construct", bound: "Conjurer", playLine: "Witch", tags: KDMapInit(["leashing", "opendoors", "conjurer", "closedoors", "witch", "ranged", "boss", "elite", "unflinching", "dressRestraints", "latexRestraints", "handcuffer"]), followRange: 1, summon: [{enemy: "Frog", range: 2.5, count: 1, strict: true}], - spells: ["SummonTickleHand", "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 9, spellCooldownMult: 2, spellCooldownMod: 1, AI: "guard", visionRadius: 8, maxhp: 30, minLevel:9, weight:-31, movePoints: 3, spellRdy: true, - spellResist: 0.5, attackLock: "Purple", - attackPoints: 4, attack: "MeleeLockAllWillSpellBind", attackWidth: 1, attackRange: 1, power: 3, dmgType: "tickle", - terrainTags: {"secondhalf":16, "lastthird":5, "boss": -80, "open": 20, "passage": -60, "conjureAnger": 20, "conjureRage": 70, "increasingWeight":0.5, "witch": 30}, - allFloors: true, shrines: ["Conjure"], - dropTable: [{name: "MagicSword", weight: 1, ignoreInInventory: true}, {name: "MagicSpear", weight: 1, ignoreInInventory: true}, {name: "MagicAxe", weight: 1, ignoreInInventory: true}, {name: "MagicFlail", weight: 1, ignoreInInventory: true}, {name: "MagicHammer", weight: 1, ignoreInInventory: true}, {name: "BlueKey", weight: 2}]}, - {name: "ConjurerTickler", faction: "Witch", clusterWith: "construct", bound: "ConjurerTickler", playLine: "Witch", tags: KDMapInit(["leashing", "opendoors", "conjurer", "closedoors", "witch", "ranged", "boss", "elite", "unflinching", "dressRestraints", "latexRestraints", "handcuffer"]), followRange: 1, summon: [{enemy: "TickleHandSlave", range: 2.5, count: 3, strict: true}], - spells: ["SummonBookChain", "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 9, spellCooldownMult: 2, spellCooldownMod: 1, AI: "guard", visionRadius: 8, maxhp: 30, minLevel:5, weight:-31, movePoints: 3, spellRdy: true, - spellResist: 0.5, attackLock: "Purple", - attackPoints: 4, attack: "MeleeLockAllWillSpellBind", attackWidth: 1, attackRange: 1, power: 3, dmgType: "tickle", - terrainTags: {"secondhalf":16, "lastthird":5, "boss": -80, "open": 20, "passage": -60, "conjureAnger": 20, "conjureRage": 70, "increasingWeight":0.5, "witch": 30}, - allFloors: true, shrines: ["Conjure"], - dropTable: [{name: "MagicSword", weight: 1, ignoreInInventory: true}, {name: "MagicSpear", weight: 1, ignoreInInventory: true}, {name: "MagicAxe", weight: 1, ignoreInInventory: true}, {name: "MagicFlail", weight: 1, ignoreInInventory: true}, {name: "MagicHammer", weight: 1, ignoreInInventory: true}, {name: "BlueKey", weight: 2}]}, - - {name: "BookChain", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "chainimmune", "ignorenoSP", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, - spells: ["MagicChain"], spellCooldownMult: 1, spellCooldownMod: 1, sneakthreshold: 0.95, kite: 1.5, difficulty: 0.05, noSpellLeashing: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#aaaaaa"}, - ], - visionRadius: 6, maxhp: 6, minLevel:0, weight:20, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, - terrainTags: {"open": 100, "passage": -7, "witch": 2}, floors:KDMapInit(["lib"])}, - {name: "BookCelestial", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireresist", "stunimmune", "ignorenoSP", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, - spells: ["EnemyCorona", "OrbHeal"], spellCooldownMult: 1, spellCooldownMod: 1, sneakthreshold: 0.95, difficulty: 0.05, noSpellLeashing: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ffff44"}, - ], - visionRadius: 6, maxhp: 6, minLevel:6, weight:18, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, - terrainTags: {"open": 100, "passage": -7, "elf": 2}, floors:KDMapInit(["lib"])}, - {name: "BookNature", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["unstoppable", "fireweakness", "ignorenoSP", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, - spells: ["Entangle", "OrbHeal"], spellCooldownMult: 1, spellCooldownMod: 1, sneakthreshold: 0.95, difficulty: 0.05, noSpellLeashing: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#88ff88"}, - ], - visionRadius: 6, maxhp: 6, minLevel:0, weight:18, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, - terrainTags: {"open": 100, "passage": -7, "elf": 2}, floors:KDMapInit(["lib"])}, - {name: "BookElectric", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "electricimmune", "ignorenoSP", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, - spells: ["AreaElectrify"], spellCooldownMult: 1, spellCooldownMod: 1, sneakthreshold: 0.95, difficulty: 0.05, noSpellLeashing: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#8888ff"}, - ], - visionRadius: 6, maxhp: 6, minLevel:3, weight:18, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, - terrainTags: {"open": 100, "passage": -7, "elemental": 2}, floors:KDMapInit(["lib"])}, - {name: "BookSlime", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "glueimmune", "ignorenoSP", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, - spells: ["WitchSlimeBall", "WitchSlimeBall", "WitchSlime"], spellCooldownMult: 1, spellCooldownMod: 0, sneakthreshold: 0.95, difficulty: 0.05, noSpellLeashing: true, - visionRadius: 6, maxhp: 6, minLevel:2, weight:18, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ff00ff"}, - ], - terrainTags: {"open": 100, "passage": -7, "alchemist": 2}, floors:KDMapInit(["lib"])}, - {name: "BookIce", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "iceimmune", "ignorenoSP", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, - spells: ["IceSlowPrepare", "IceDragonBreathPrepare"], spellCooldownMult: 1, spellCooldownMod: 4, sneakthreshold: 0.95, difficulty: 0.05, noSpellLeashing: true, - visionRadius: 6, maxhp: 6, minLevel:4, weight:18, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#44aaff"}, - ], - terrainTags: {"open": 100, "passage": -7, "elemental": 2}, floors:KDMapInit(["lib"])}, - {name: "BookForbidden", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "coldimmune", "ignorenoSP", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, - spells: ["SoulCrystalBind"], spellCooldownMult: 1, spellCooldownMod: 3, sneakthreshold: 0.95, difficulty: 0.05, noSpellLeashing: true, - visionRadius: 6, maxhp: 6, minLevel:5, weight:15, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ff5577"}, - ], - terrainTags: {"open": 100, "passage": -8, "witch": 2}, floors:KDMapInit(["lib", "tmp"])}, - {name: "BookArcane", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "coldimmune", "ignorenoSP", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, - spells: ["MummyBolt"], spellCooldownMult: 1, spellCooldownMod: 3, sneakthreshold: 0.95, difficulty: 0.05, noSpellLeashing: true, - visionRadius: 6, maxhp: 6, minLevel:0, weight:15, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#00ff00"}, - ], - terrainTags: {"open": 100, "passage": -8, "mummy": 2}, floors:KDMapInit(["lib", "tmp"])}, - - {name: "AnimatedArmor", blockVisionWhileStationary: true, tags: KDMapInit(["mimicBlock", "removeDoorSpawn", "ignoreharmless", "leashing", "construct", "poisonimmune", "soulimmune", "minor", "melee", "acidweakness", "shackleRestraints", "shackleGag", "slashresist", "crushweakness"]), - evasion: -0.5, ignorechance: 1.0, armor: 2, followRange: 1, AI: "ambush", difficulty: 0.05, guardChance: 0, - cueSfx: { - Block: "Clang", - Resist: "Clang", - Damage: "ArmorHit", - }, - visionRadius: 100, ambushRadius: 1.9, blindSight: 100, maxhp: 20, minLevel:1, weight:0, movePoints: 2, attackPoints: 3, attack: "MeleeBind", - useLock: "Purple", - attackWidth: 1, attackRange: 1, power: 4, dmgType: "crush", fullBoundBonus: 4, - terrainTags: {"secondhalf":4, "lastthird":7, "passage": 70, "adjChest": 58, "door": 50, "rubble": 15}, floors:KDMapInit(["cat"]), shrines: ["Metal"], - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}, {name: "Sword", weight: 1, ignoreInInventory: true}]}, - {name: "Mimic", blockVisionWhileStationary: true, tags: KDMapInit(["removeDoorSpawn", "ignoreharmless", "ignorenoSP", "construct", "poisonresist", "soulresist", "minor", "melee", "trap", "shackleGag", "crushweakness", "meleeresist", "fireweakness", "electricresist", "chainweakness"]), - evasion: -0.5, ignorechance: 1.0, armor: 0, followRange: 1, AI: "ambush", bypass: true, difficulty: 0.15, guardChance: 0, - visionRadius: 100, ambushRadius: 1.9, blindSight: 100, maxhp: 20, minLevel:2, weight:-1, movePoints: 1.5, attackPoints: 2, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 3, dmgType: "tickle", fullBoundBonus: 1, - terrainTags: {"rubble": 100, "adjChest": 15, "passage": 14, "illusionRage": 2, "illusionAnger": 2}, allFloors: true, shrines: ["Illusion"], - dropTable: [{name: "RedKey", weight: 1}, {name: "Gold", amountMin: 10, amountMax: 40, weight: 6}, {name: "ScrollArms", weight: 1}, {name: "ScrollVerbal", weight: 1}, {name: "ScrollLegs", weight: 1}]}, - - {name: "VinePlant", faction: "Plant", clusterWith: "plant", color: "#00FF00", blockVisionWhileStationary: true, tags: KDMapInit(["nature", "removeDoorSpawn", "ignorenoSP", "plant", "minor", "melee", "slashsevereweakness", "coldweakness", "firesevereweakness", "unarmedresist", "crushresist", "vineRestraints"]), - ignorechance: 1.0, armor: 2, followRange: 1, AI: "ambush", specialCD: 99, specialAttack: "Stun", specialAttackPoints: 1, specialRemove: "Bind", difficulty: 0.05, guardChance: 0, - visionRadius: 3, ambushRadius: 1.9, blindSight: 5, maxhp: 10, minLevel:2, weight:25, movePoints: 1.5, attackPoints: 2, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 2, dmgType: "crush", fullBoundBonus: 3, - terrainTags: {"passage": -50, "adjChest": 8, "door": 12, "elf": 5, "nature": 5}, floors:KDMapInit(["jng"]), shrines: ["Rope", "Will"]}, - {name: "Bramble", faction: "Plant", clusterWith: "plant", color: "#00FF00", hitsfx: "DealDamage", tags: KDMapInit(["removeDoorSpawn", "immobile", "nature", "plant", "minor", "melee", "slashsevereweakness", "coldweakness", "firesevereweakness", "unarmedresist", "crushresist"]), - evasion: -9, ignorechance: 1.0, armor: 2, followRange: 1, AI: "wander", specialCD: 2, specialAttack: "Slow", specialAttackPoints: 1, - visionRadius: 1.5, blindSight: 1.5, maxhp: 16, minLevel:0, weight:-80, movePoints: 99999, attackPoints: 1, attack: "MeleeWill", attackWidth: 8, attackRange: 1, power: 1, dmgType: "pain", - terrainTags: {"passage": -50, "adjChest": -50, "door": -50, "open": 140, "elf": 10}, floors:KDMapInit(["jng"]), shrines: ["Rope", "Will"]}, - - {name: "Alchemist", faction: "Alchemist", clusterWith: "alchemist", playLine: "Alchemist", bound: "Alchemist", tags: KDMapInit(["opendoors", "leashing", "imprisonable", "guardCall", "human", "alchemist", "ranged", "leatherRestraints", "handcuffer", "glueresist", "iceweakness", "electricresist", "leatherRestraintsHeavy", "jail", "jailer", "latexGag", "search"]), ignorechance: 0, armor: 0, followRange: 2, AI: "hunt", - spells: ["AmpuleGreen", "AmpuleYellow", "AmpuleRed", "AmpuleBlue"], spellCooldownMult: 1, spellCooldownMod: 4, kite: 1.5, projectileAttack: true, - visionRadius: 6, maxhp: 8, minLevel:0, weight:0.1, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"secondhalf":1, "thirdhalf":1, "latexAnger": 12, "latexRage": 5, "latexPleased": 12, "latexFriendly": 5, "alchemist": 5}, shrines: ["Latex"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, - {name: "Alkahestor", faction: "Alchemist", clusterWith: "alchemist", playLine: "Alchemist", bound: "Alkahestor", tags: KDMapInit(["opendoors", "leashing", "guardCall", "human", "alchemist", "ranged", "miniboss", "glueresist", "iceweakness", "electricresist", "expRestraints", "handcuffer", "jailer", "latexGag", "search"]), ignorechance: 0, armor: 0, followRange: 2, AI: "hunt", - spells: ["AmpuleBlue", "SummonLatexElemental"], spellCooldownMult: 1, spellCooldownMod: 4, kite: 1.5, projectileAttack: true, - visionRadius: 6, maxhp: 16, minLevel:4, weight:-1, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1.5, dmgType: "grope", fullBoundBonus: 2.5, - terrainTags: {"secondhalf":1, "thirdhalf":1, "latexAnger": 4, "latexRage": 4, "latexPleased": 3, "latexFriendly": 5, "alchemist": 1}, shrines: ["Latex"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}]}, - {name: "ElementalLatex", faction: "Elemental", hidetimerbar: true, playLine: "Elemental", clusterWith: "alchemist", bound: "ElementalLatex", squeeze: true, - tags: KDMapInit(["opendoors", "elemental", "slashweakness", "melee", "glueimmune", "coldweakness", "electricresist", "pierceweakness", "acidweakness", "latexRestraints", "latexGag", "handcuffer", "leashing", "search", "doortrap"]), - armor: 0, followRange: 1, AI: "hunt", - visionRadius: 7, maxhp: 24, minLevel:4, weight:-3, movePoints: 2, attackPoints: 2, attack: "MeleeWillBind", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, - terrainTags: {"secondhalf":2, "thirdhalf":1, "latexAnger": 4, "latexRage": 4, "latexPleased": 2, "latexFriendly": 3, "temple": 4, "doortrap":2, "alchemist": 3, "witch": 5}, allFloors: true, shrines: ["Latex", "Elements"], - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10, noSummon: true}, {name: "EarthRune", weight: 1, noSummon: true}]}, - {name: "SlimeEnthusiast", faction: "Alchemist", clusterWith: "alchemist", playLine: "Alchemist", bound: "SlimeEnthusiast", tags: KDMapInit(["opendoors", "leashing", "elite", "human", "alchemist", "ranged", "unflinching", "meleeweakness", "iceweakness", "electricresist", "miniboss", "glueresist", "leatherRestraints", "leatherRestraintsHeavy", "latexGag", "handcuffer", "jail", "jailer", "hunter"]), ignorechance: 0, armor: 0, followRange: 2, AI: "hunt", - spells: ["RedSlime"], spellCooldownMult: 1, spellCooldownMod: 1, kite: 1.5, projectileAttack: true, - visionRadius: 6, maxhp: 20, minLevel:1, weight:0, movePoints: 3, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"secondhalf":0.5, "thirdhalf":1, "latexAnger": 5, "latexRage": 5, "latexPleased": 2, "latexFriendly": 2, "alchemist": 1}, shrines: ["Latex"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, - {name: "RedSlime", faction: "Alchemist", clusterWith: "alchemist", color: "#FF0000", hidetimerbar: true, tags: KDMapInit(["ignoretiedup", "ignoregagged", "experiment", "slime", "melee", "minor", "ballGagRestraints", "meleeresist", "glueimmune", "electricresist", "iceweakness"]), squeeze: true, followRange: 1, AI: "hunt", sneakThreshold: 1, hitsfx: "", - spells: ["RedSlime"], spellCooldownMult: 1, spellCooldownMod: 1, evasion: 1, - visionRadius: 4.5, maxhp: 2, minLevel: 5, weight:10, movePoints: 2, attackPoints: 3, attack: "SpellMeleeSlowBindSuicide", suicideOnSpell: true, suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "crush", - terrainTags: {}, floors:KDMapInit(["tmp"]), shrines: ["Latex"]}, - - {name: "SummonedDrone", playLine: "Robot", - tags: KDMapInit(["oldrobot", "ignoreharmless", "doortrap", "robot", "flying", "acidweakness", "soulresist", "minor", "melee", - "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "temporary"]), - evasion: 0.2, armor: 1, followRange: 3.5, AI: "hunt", - spells: ["EncaseBoltDrone"], spellCooldownMult: 2, spellCooldownMod: 0, projectileTargeting: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffff00"}, - ], - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - visionRadius: 14, sneakThreshold: 0.5, maxhp: 5, minLevel:0, weight:-1000, kite: 1.5, movePoints: 1.5, attackPoints: 3, attack: "Spell", attackWidth: 1, attackRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 1, - terrainTags: {}, floors:KDMapInit([])}, - {name: "SummonedCaptureDrone", playLine: "Robot", - tags: KDMapInit(["leashing", "oldrobot", "ignoreharmless", "doortrap", "robot", "flying", "acidweakness", "soulresist", "minor", "melee", - "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "temporary"]), - evasion: 0.15, armor: 1, followRange: 1, AI: "hunt", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffff00"}, - ], - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - visionRadius: 15, sneakThreshold: 0.5, maxhp: 6, minLevel:0, weight:-1000, movePoints: 1.35, attackPoints: 2, attack: "MeleeBind", attackWidth: 1.5, attackRange: 1, power: 1, dmgType: "chain", fullBoundBonus: 1.5, - ondeath: [{type: "spellOnSelf", spell: "RubberSlime"}], - terrainTags: {}, floors:KDMapInit([])}, - {name: "OldDrone", faction: "Enemy", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, - color: "#ff3367", - tags: KDMapInit(["oldrobot", "ignoreharmless", "doortrap", "robot", "flying", "acidweakness", "soulresist", "minor", "melee", - "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "jail", "search"]), - AI: "hunt", difficulty: 0.05, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffff00"}, - ], - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - RestraintFilter: { - unlimitedRestraints: true, - }, - armor: 1.5, maxhp: 5, movePoints: 1.1, - visionRadius: 7, followRange: 1, projectileAttack: true, useLock: "Red", followLeashedOnly: true, - bindOnDisable: true, suicideOnAdd: true, - attack: "MeleeBindSuicideWill", attackPoints: 2, attackWidth: 1, attackRange: 1, power: 2, dmgType: "electric", multiBind: 2, fullBoundBonus: 4, - minLevel:0, weight:15, terrainTags: {"oldrobot": 10}, shrines: ["Metal"], floors:KDMapInit(["bel"]), - dropTable: [{name: "Nothing", weight: 19}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, - {name: "OldTapeDrone", faction: "Enemy", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, - color: "#ff3367", - tags: KDMapInit(["oldrobot", "leashing", "doortrap", "robot", "flying", "acidweakness", "soulresist", "melee", - "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushweakness", "autoTape", "jail", "search"]), - AI: "patrol", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffff00"}, - ], - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - RestraintFilter: { - unlimitedRestraints: true, - }, - armor: 1.5, maxhp: 9, movePoints: 1.75, - visionRadius: 7, followRange: 1, - attack: "MeleeBind", attackPoints: 2, attackWidth: 1, attackRange: 1, power: 2, dmgType: "glue", fullBoundBonus: 1, - minLevel:2, weight:15, terrainTags: {"oldrobot": 10, "tapePref": 10, "tapeOptout": -15}, shrines: ["Metal"], floors:KDMapInit(["bel"]), - dropTable: [{name: "Gold", amountMin: 7, amountMax: 15, weight: 10, noSummon: true}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, - - {name: "RubberTurret", faction: "Enemy", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, - color: "#ff3367", - tags: KDMapInit(["oldrobot", "turret", "basicturret", "immobile", "ignoreharmless", "mimicBlock", "doortrap", "robot", "acidweakness", "soulresist", "minor", "ranged", - "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness"]), - AI: "hunt", difficulty: 0.2, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff5555"}, - ], - spells: ["EncaseBolt"], spellCooldownMult: 1, spellCooldownMod: 0, projectileTargeting: true, - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - RestraintFilter: { - unlimitedRestraints: true, - }, - armor: 2.0, maxhp: 20, movePoints: 9999, immobile: true, - visionRadius: 6.5, followRange: 999, - sneakThreshold: 1, - attack: "SpellMeleeWill", attackPoints: 2, attackWidth: 1, attackRange: 1, power: 2, dmgType: "electric", - minLevel:0, weight:-50, terrainTags: {"oldrobot": 7, "oldrobotturret": 50, open: 50, "latexOptout": -100}, shrines: ["Latex"], floors:KDMapInit(["bel"]), - ondeath: [{type: "spellOnSelf", spell: "RubberSlime"}], - dropTable: [{name: "AncientPowerSourceSpent", weight: 9, noSummon: true}, {name: "AncientPowerSource", weight: 1, noSummon: true}]}, - - {name: "RubberSilo", faction: "Enemy", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, - color: "#ff3367", - tags: KDMapInit(["oldrobot", "turret", "immobile", "ignoreharmless", "mimicBlock", "doortrap", "robot", "acidweakness", "soulresist", "minor", "ranged", - "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness"]), - AI: "hunt", difficulty: 0.2, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff5555"}, - ], - spells: ["RubberMissile"], spellCooldownMult: 1, spellCooldownMod: 0, projectileTargeting: true, - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - RestraintFilter: { - unlimitedRestraints: true, - }, - armor: 2.0, maxhp: 20, movePoints: 9999, immobile: true, - visionRadius: 8.5, followRange: 999, - sneakThreshold: 1, - attack: "SpellMeleeWill", attackPoints: 2, attackWidth: 1, attackRange: 1, power: 2, dmgType: "electric", - minLevel: 7, weight:-50, terrainTags: {"oldrobot": 7, "oldrobotturret": 30, open: 50, "latexOptout": -24}, shrines: ["Latex"], floors:KDMapInit(["bel"]), - ondeath: [{type: "spellOnSelf", spell: "RubberSlime"}], - dropTable: [{name: "AncientPowerSourceSpent", weight: 8, noSummon: true}, {name: "AncientPowerSource", weight: 2, noSummon: true}]}, - - {name: "Drone", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, color: "#ff7755", - tags: KDMapInit(["ignoreharmless", "doortrap", "robot", "flying", "acidweakness", "soulresist", "minor", "melee", "electricsevereweakness", "coldresist", "iceresist", - "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "jail", "search"]), - AI: "patrol", difficulty: 0.3, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ff0000"}, - ], - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - RestraintFilter: { - unlimitedRestraints: true, - }, - //summon: [ - //{enemy: "Drone", range: 2, count: 2, chance: 0.7, strict: true},], - armor: 2, maxhp: 5, movePoints: 1.25, - visionRadius: 6, followRange: 1, projectileAttack: true, useLock: "Red", - bindOnDisable: true, suicideOnAdd: true, - specialCD: 30, specialAttack: "Stun", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 3, specialRange: 7, specialWidth: 1.5, specialMinrange: 3, specialsfx: "Laser", stunTime: 5, - attack: "MeleeBindSuicideWill", attackPoints: 2, attackWidth: 1, attackRange: 1, power: 3, dmgType: "electric", multiBind: 2, fullBoundBonus: 6, - minLevel:0, weight:-4, terrainTags: {"secondhalf":0.5, "thirdhalf":0.5, "increasingWeight":0.25, "metalAnger": 4, "metalRage": 2, "metalPleased": 4, "metalFriendly": 4, "robot": 40}, shrines: ["Metal"], allFloors: true, - dropTable: [{name: "Nothing", weight: 19}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, - {name: "CaptureBot", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", color: "#aaaaaa", - tags: KDMapInit(["leashing", "jailer", "doortrap", "robot", "acidweakness", "melee", "electricsevereweakness", "coldresist", "soulresist", "guardCall", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "controlHarness", "jail", "jailer", "search"]), - AI: "patrol", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff0000"}, - ], - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - armor: 2, maxhp: 10, movePoints: 2, - visionRadius: 6, followRange: 1, projectileAttack: true, useLock: "Red", - RemoteControl: { - punishRemote: 4, - punishRemoteChance: 0.25, - }, - attack: "MeleeBind", attackPoints: 4, attackWidth: 3, attackRange: 1, power: 3, dmgType: "crush", multiBind: 2, fullBoundBonus: 2, - minLevel:3, weight:-6, terrainTags: {"secondhalf":1, "thirdhalf":1, "increasingWeight":0.5, "metalAnger": 6, "metalRage": 4, "metalPleased": 6, "metalFriendly": 4, "robot": 20, "tapePref": -4, "tapeOptout": 3}, shrines: ["Metal"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10, noSummon: true}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, - {name: "ForcefieldBot", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", color: "#aaaaaa", - tags: KDMapInit(["leashing", "jailer", "doortrap", "robot", "acidweakness", "melee", "elite", "electricsevereweakness", "coldresist", "soulresist", "guardCall", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "controlHarness", "jail", "jailer", "search"]), - AI: "patrol", - spells: ["SummonForceFields"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff0000"}, - ], - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - armor: 2, maxhp: 14, movePoints: 3, - visionRadius: 6, followRange: 1, projectileAttack: true, useLock: "Red", - RemoteControl: { - punishRemote: 4, - punishRemoteChance: 0.25, - }, - attack: "SpellMeleeBind", attackPoints: 4, attackWidth: 1, attackRange: 1, power: 3, dmgType: "electric", multiBind: 1, fullBoundBonus: 4, - minLevel:6, weight:-6, - terrainTags: {"secondhalf":1, "thirdhalf":1, "increasingWeight":0.5, "metalAnger": 5, "metalRage": 3, "metalPleased": 5, "metalFriendly": 3, "robot": 17}, shrines: ["Metal"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10, noSummon: true}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, - {name: "TapeBot", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", color: "#00eeee", - tags: KDMapInit(["leashing", "jailer", "doortrap", "robot", "acidweakness", "melee", "electricsevereweakness", "coldresist", "soulresist", "guardCall", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "autoTape", "jail", "jailer", "search"]), - AI: "patrol", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 4, color: "#00eeee"}, - ], - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - armor: 2, maxhp: 10, movePoints: 1.7, - visionRadius: 6, followRange: 3.5, projectileAttack: true, useLock: "Red", - RemoteControl: { - punishRemote: 4, - punishRemoteChance: 0.25, - }, - attack: "MeleeBind", attackPoints: 3, attackWidth: 1, attackRange: 3.5, power: 3, dmgType: "glue", multiBind: 1, fullBoundBonus: 2, - minLevel:2, weight:-8, terrainTags: {"secondhalf":1, "thirdhalf":1, "increasingWeight":0.5, "metalAnger": 6, "metalRage": 4, "metalPleased": 6, "metalFriendly": 4, "robot": 20, "tape": 5, "tapePref": 6, "tapeOptout": -30}, shrines: ["Metal"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10, noSummon: true}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, - {name: "BotMissile", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", color: "#bbbbbb", - tags: KDMapInit(["leashing", "robot", "ranged", "miniboss", "acidweakness", "electricsevereweakness", - "unflinching", "coldresist", "soulresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "controlHarness", "search", "dollRoomBoss"]), - AI: "guard", spellRdy: true, bypass: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff0000"}, - ], - spells: ["RubberMissile"], spellCooldownMult: 0.7, spellCooldownMod: 0, castWhileMoving: true, followLeashedOnly: true, - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - armor: 2, maxhp: 20, movePoints: 4, - visionRadius: 9, followRange: 3.5, projectileAttack: true, useLock: "Red", - RemoteControl: { - punishRemote: 6, - punishRemoteChance: 0.5, - }, - attack: "SpellMeleeBind", attackPoints: 2, attackWidth: 1, attackRange: 3.5, power: 1, dmgType: "crush", multiBind: 1, fullBoundBonus: 3, - minLevel:7, weight:-106, terrainTags: {"thirdhalf":1, "increasingWeight":0.5, "open": 100, "metalAnger": 44, "metalRage": 13, "metalPleased": 44, "latex": 5, "metalFriendly": 13, "robot": 7}, shrines: ["Metal"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 5, noSummon: true}, {name: "AncientPowerSource", weight: 1, noSummon: true}]}, - {name: "EnforcerBot", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", color: "#bbbbbb", - tags: KDMapInit(["leashing", "robot", "ranged", "miniboss", "acidweakness", "electricsevereweakness", "unflinching", "coldresist", "soulresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "controlHarness", "search"]), - AI: "guard", spellRdy: true, bypass: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff0000"}, - ], - spells: ["RobotBolt"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, followLeashedOnly: true, - cueSfx: { - Block: "Clang", - Resist: "SoftShield", - Damage: "RobotHit", - }, - summon: [ - {enemy: "Drone", range: 2, count: 2, chance: 0.25, strict: true},], - armor: 2, maxhp: 24, movePoints: 4, - visionRadius: 9, followRange: 3.5, projectileAttack: true, useLock: "Red", - RemoteControl: { - punishRemote: 6, - punishRemoteChance: 0.5, - }, - attack: "SpellMeleeBind", attackPoints: 2, attackWidth: 1, attackRange: 3.5, power: 1, dmgType: "crush", multiBind: 1, fullBoundBonus: 3, - minLevel:9, weight:-106, terrainTags: {"thirdhalf":1, "increasingWeight":0.5, "open": 100, "metalAnger": 44, "metalRage": 13, "metalPleased": 44, "metalFriendly": 13, "robot": 7}, shrines: ["Metal"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 5, noSummon: true}, {name: "AncientPowerSource", weight: 1, noSummon: true}]}, - - {name: "AlchemistPet", faction: "Alchemist", clusterWith: "alchemist", bound: "AlchemistPet", playLine: "Gagged", color: "#007C59", tags: KDMapInit(["opendoors", "submissive", "noshop", "gagged", "imprisonable", "ignorenoSP", "alchemist", "ranged", "glueweakness", "electricresist", "ticklesevereweakness", "iceresist", "charmweakness", "stunweakness", "search"]), ignorechance: 0, armor: 0, followRange: 2, AI: "hunt", - master: {type: "Alchemist", range: 2, loose: true, aggressive: true}, sneakThreshold: 1, blindSight: 2, projectileAttack: true, strictAttackLOS: true, dashOnMiss: true, - specialCD: 11, specialAttack: "DashStun", specialRemove: "Will", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialMinrange: 1.5, specialsfx: "HeavySwing", stunTime: 4, stunOnSpecialCD: 4, - visionRadius: 6, maxhp: 10, minLevel:3, weight:0, movePoints: 1, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"latexAnger": 2, "latexRage": 2, "alchemist": 2}, shrines: ["Latex"], allFloors: true, - dropTable: []}, - {name: "WolfgirlPet", faction: "Nevermere", clusterWith: "nevermere", bound: "WolfgirlPet", playLine: "Gagged", color: "#009C79", tags: KDMapInit(["opendoors", "wolfSub", "nevermere", "submissive", "noshop", "gagged", "wolfPet", "alwaysAlert", "imprisonable", "wolfgirl", "minor", "ignorenoSP", "alchemist", "ranged", "glueweakness", "electricresist", "ticklesevereweakness", "iceresist", "charmweakness", "stunweakness", "search"]), ignorechance: 0, armor: 0, followRange: 2, AI: "hunt", cohesion: 0.9, - master: {type: "Wolfgirl", range: 2, loose: true, aggressive: true}, sneakThreshold: 1, blindSight: 2, projectileAttack: true, strictAttackLOS: true, dashOnMiss: true, difficulty: 0.5, - specialCD: 11, specialAttack: "DashStun", specialRemove: "Will", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialMinrange: 1.5, specialsfx: "HeavySwing", stunTime: 4, stunOnSpecialCD: 4, - visionRadius: 6, maxhp: 10, minLevel:0, weight:0.1, movePoints: 1, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"metalAnger": 3, "metalRage": 3, "metalPleased": 2, "metalFriendly": 2, "nevermere": 2}, shrines: ["Metal"], allFloors: true, - dropTable: []}, - {name: "WolfGuard", faction: "Nevermere", clusterWith: "nevermere", bound: "WolfGuard", color: "#00dCa9", playLine: "Gagged", tags: KDMapInit(["opendoors", "wolfSub", "nevermere", "submissive", "noshop", "gagged", "wolfPet", "autoTape", "alwaysAlert", "leashing", "wolfLeash", "imprisonable", "wolfgirl", "ignorenoSP", "alchemist", "ranged", "glueweakness", "electricresist", "ticklesevereweakness", "iceresist", "charmweakness", "stunweakness", "search"]), - ignorechance: 0, armor: 1, followRange: 2, AI: "hunt", cohesion: 0.5, - master: {type: "Wolfgirl", range: 2, loose: true, aggressive: true}, sneakThreshold: 1, blindSight: 2, projectileAttack: true, strictAttackLOS: true, dashOnMiss: true, - specialCD: 9, specialAttack: "DashWill", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialMinrange: 1.5, specialsfx: "HeavySwing", stunTime: 4, stunOnSpecialCD: 4, specialDamage: "crush", - visionRadius: 6, maxhp: 16, minLevel:6, weight:0, movePoints: 1, attackPoints: 3, attack: "MeleeBind", attackWidth: 1, attackRange: 3, projectileTargeting: true, power: 2, dmgType: "electric", fullBoundBonus: 2, - terrainTags: {"metalAnger": 1.5, "metalRage": 8, "metalPleased": 4, "metalFriendly": 4, "nevermere": 1}, shrines: ["Metal"], allFloors: true, - dropTable: [{name: "Nothing", weight: 10}, {name: "EscortDrone", weight: 0.5, ignoreInInventory: true}, {name: "VibeWand", weight: 100, ignoreInInventory: true},]}, - {name: "WolfInstructor", faction: "Nevermere", clusterWith: "nevermere", bound: "Wolfgirl", playLine: "Wolfgirl", color: "#00EFAB", tags: KDMapInit(["leashing", "nevermere", "imprisonable", "trainer", "controlHarness", "wolfgirl", "jailer", "opendoors", "unflinching", "closedoors", "wolfGear", "handcuffer", "melee", "unflinching", "iceresist", "electricresist", "charmweakness", "stunweakness", "ticklesevereweakness", "jail", "jailer", "hunter"]), - followRange: 3, kite: 2.5, - summon: [ - {enemy: "WolfgirlPet", range: 2, count: 1, chance: 1.0, strict: true}, - {enemy: "WolfgirlPet", range: 2, count: 1, chance: 0.5, strict: true}, - ], - spells: ["NevermereBoost"], spellCooldownMult: 1, spellCooldownMod: 5, buffallies: true, - AI: "hunt", visionRadius: 10, maxhp: 9, minLevel:6, weight:-2, movePoints: 2, evasion: 0.3, - RemoteControl: { - punishRemote: 4, - punishRemoteChance: 0.25, - }, - attackPoints: 3, attack: "MeleeBindLockWillSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 3, dmgType: "pain", sneakThreshold: 1, attackLock: "Red", - terrainTags: {"secondhalf":4, "lastthird":4, "metalAnger": 4, "metalRage": 4, "metalPleased": 9, "metalFriendly": 4, "nevermere": 9}, allFloors: true, shrines: ["Metal"], - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}] - }, - {name: "WolfExecutive", faction: "Nevermere", clusterWith: "nevermere", bound: "WolfExecutive", color: "#00EFAB", playLine: "Wolfgirl", - tags: KDMapInit(["leashing", "nevermere", "trainer", "wolfgirl", "jailer", "opendoors", "unflinching", "closedoors", "wolfGear", "controlHarness", "wolfRestraints", "wolfRestraintsHeavy", "melee", - "boss", "unstoppable", "iceresist", "electricresist", "charmweakness", "stunweakness", "ticklesevereweakness", "jailer", "hunter"]), - followRange: 4.5, kite: 2.5, - summon: [ - {enemy: "WolfGuard", range: 2, count: 2, chance: 1.0, strict: true}, - {enemy: "WolfShieldDrone", range: 2, count: 1, chance: 0.5, strict: true}, - ], - spells: ["NevermereBoost", "SummonWolfDrone", "SummonWolfTapeDrone", "EnemyBlast"], spellCooldownMult: 0.5, spellCooldownMod: 0, buffallies: true, projectileTargeting: true, - AI: "hunt", visionRadius: 10, maxhp: 30, minLevel:5, weight:-30, movePoints: 1.2, evasion: 0.2, bindOnDisable: true, - RemoteControl: { - punishRemote: 5, - punishRemoteChance: 0.35, - }, - attackPoints: 4, attack: "MeleeBindLockAllSpell", multiBind: 2, attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 3, fullBoundBonus: 2, dmgType: "charm", attackLock: "Blue", - terrainTags: {"secondhalf":5, "lastthird":5, "boss": -30, "open": 10, "passage": -40, "metalAnger": 2, "metalRage": 2, "metalPleased": 5, "metalFriendly": 5, "increasingWeight":0.5, "nevermere": 30}, - allFloors: true, shrines: ["Metal"], - dropTable: [{name: "Gold", amountMin: 35, amountMax: 50, weight: 10}, {name: "Blaster", weight: 100, ignoreInInventory: true},] - }, - - {name: "Wolfgirl", faction: "Nevermere", clusterWith: "nevermere", bound: "Wolfgirl", color: "#00EFAB", playLine: "Wolfgirl", - tags: KDMapInit(["leashing", "nevermere", "imprisonable", "trainer", "wolfgirl", "jailer", "opendoors", "unflinching", "closedoors", "wolfRestraints", "melee", "miniboss", "unflinching", "glueweakness", "ticklesevereweakness", "iceresist", "electricresist", "charmweakness", "stunweakness", "unflinching", "jail", "jailer", "hunter"]), followRange: 1, - summon: [ - {enemy: "WolfgirlPet", range: 2, count: 1, chance: 0.7, strict: true},], - spells: ["RestrainingDevice"], spellCooldownMult: 1, spellCooldownMod: 1, AI: "hunt", visionRadius: 10, maxhp: 22, minLevel:0, weight:-6, movePoints: 2, disarm: 0.5, - RemoteControl: { - punishRemote: 4, - punishRemoteChance: 0.25, - }, - attackPoints: 3, attack: "MeleeBindLockAllWillSpell", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 4, dmgType: "grope", sneakThreshold: 1, attackLock: "Red", - terrainTags: {"secondhalf":3, "lastthird":5, "metalAnger": 7, "metalRage": 2, "metalPleased": 9, "metalFriendly": 6, "nevermere": 7}, allFloors: true, shrines: ["Metal"], - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "EscortDrone", weight: 1.0, ignoreInInventory: true}] - }, - - {name: "WolfOperative", faction: "Nevermere", clusterWith: "nevermere", bound: "WolfOperative", color: "#00EFAB", playLine: "Hunter", - tags: KDMapInit(["leashing", "bountyhunter", "nevermere", "imprisonable", "trainer", "wolfgirl", "jailer", "opendoors", "unflinching", "closedoors", "wolfRestraints", "melee", "elite", "unflinching", "glueweakness", "ticklesevereweakness", "iceresist", "electricresist", "charmweakness", "stunweakness", "unflinching", "jail", "jailer", "hunter"]), followRange: 1, - spells: ["EnemyBlast"], spellCooldownMult: 0.75, spellCooldownMod: 0, AI: "hunt", visionRadius: 10, maxhp: 18, minLevel:3, weight:-3, movePoints: 1.7, disarm: 0.5, stealth: 3.5, - RemoteControl: { - punishRemote: 3, - punishRemoteChance: 0.2, - }, - bindOnDisable: true, projectileTargeting: true, cohesion: 0.1, - attackPoints: 2, attack: "MeleeBindLockAllWillSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", sneakThreshold: 1, attackLock: "Red", - terrainTags: {"secondhalf":1, "lastthird":2, "metalAnger": 5, "metalRage": 5, "metalPleased": 15, "metalFriendly": 10, "nevermere": 13, "bountyhunter": 3}, allFloors: true, shrines: ["Metal"], - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 19}, {name: "Blaster", ignoreInInventory: true, weight: 0.5}]}, - - {name: "WolfApprentice", faction: "Nevermere", clusterWith: "nevermere", bound: "Wolfgirl", color: "#00EFAB", playLine: "Wolfgirl", - tags: KDMapInit(["leashing", "imprisonable", "nevermere", "trainer", "wolfgirl", "jailer", "opendoors", "unflinching", "closedoors", "wolfRestraints", "melee", "elite", "unflinching", "glueweakness", "ticklesevereweakness", "iceresist", "electricresist", "charmweakness", "stunweakness", "unflinching", "jail", "jailer", "hunter"]), - spells: ["SummonWolfDrone"], spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", visionRadius: 10, maxhp: 9, minLevel:0, weight:1, movePoints: 2.5, - RemoteControl: { - punishRemote: 3, - punishRemoteChance: 0.15, - }, - followRange: 1, kite: 2.5, dontKiteWhenDisabled: true, castWhileMoving: true, - attackPoints: 3, attack: "MeleeBindLockWillSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", sneakThreshold: 1.5, attackLock: "Red", - terrainTags: {"secondhalf":1, "lastthird":2, "metalAnger": 12, "metalRage": 6, "metalPleased": 5, "metalFriendly": 10, "nevermere": 15}, allFloors: true, shrines: ["Metal"], - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "EscortDrone", weight: 0.25, ignoreInInventory: true}]}, - - {name: "WolfDrone", faction: "Nevermere", clusterWith: "nevermere", color: "#00EFAB", playLine: "Robot", - tags: KDMapInit(["ignoreharmless", "robot", "nevermere", "wolfdrone", "flying", "acidweakness", "soulresist", "minor", "ranged", "electricsevereweakness", "wolfPet", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "search"]), - followRange: 2.5, kite: 1.5, - spells: ["WolfCrackle"], spellCooldownMult: 1, spellCooldownMod: 1, AI: "hunt", visionRadius: 9, maxhp: 6, minLevel:0, weight:-1000, movePoints: 1, - attackPoints: 3, attack: "Spell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "grope", - terrainTags: {}, allFloors: true, shrines: ["Metal"], - }, - {name: "WolfShieldDrone", faction: "Nevermere", clusterWith: "nevermere", color: "#00EFAB", playLine: "Robot", - tags: KDMapInit(["ignoreharmless", "robot", "wolfdrone", "nevermere", "flying", "acidweakness", "soulresist", "minor", "ranged", "electricsevereweakness", "wolfPet", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "search"]), - followRange: 3.9, kite: 2.5, difficulty: 0.2, - AI: "hunt", visionRadius: 9, maxhp: 8, minLevel:0, weight:-4, movePoints: 1.5, cohesion: 1.0, armor: 1.5, spellResist: 1.5, - attackPoints: 3, attack: "", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "grope", - terrainTags: {"metalAnger": 4, "metalRage": 4, "nevermere": 8}, allFloors: true, shrines: ["Metal"], - events: [ - {trigger: "afterEnemyTick", type: "wolfShieldDroneAura", power: 1.5, dist: 4.5}, - ], - }, - {name: "WolfTapeDrones", faction: "Nevermere", clusterWith: "nevermere", color: "#00eeee", playLine: "Robot", - tags: KDMapInit(["ignoreharmless", "robot", "wolfdrone", "leashing", "nevermere", "flying", "acidweakness", "soulresist", "minor", "ranged", "fireweakness", "electricsevereweakness", "wolfPet", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "autoTape", "search"]), - followRange: 1, difficulty: 0.5, - AI: "hunt", visionRadius: 9, maxhp: 10, minLevel:0, weight:-3, movePoints: 1, cohesion: 1.0, armor: 0.5, spellResist: -0.5, evasion: 0.5, - attackPoints: 2, attack: "MeleeBind", attackWidth: 2.5, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 1, - terrainTags: {"metalPleased": 4, "metalFriendly": 8, "nevermere": 13, "tapeOptout": -30, "tape": 5, "tapePref": 2}, allFloors: true, shrines: ["Metal"], - }, - - - {name: "BanditGuard", faction: "Bandit", clusterWith: "bandit", playLine: "Bandit", bound: "Bandit", tags: KDMapInit(["opendoors", "closedoors", "leashing", "cacheguard", "bandit", "minor", "melee", "leatherRestraints", "leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "jail", "jailer", "search"]), cohesion: 0.9, armor: 0, followRange: 1, AI: "hunt", - master: {type: "BanditChief", range: 2, loose: true, aggressive: true}, - spells: ["BanditBola"], spellCooldownMult: 1, spellCooldownMod: 6, noSpellLeashing: true, difficulty: 0.9, miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", - visionRadius: 7, maxhp: 11, minLevel:9, weight:20, movePoints: 1.5, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"BanditEnemy": 10, "increasingWeight":-1, "BanditWanted": 10, "BanditHated": 5}, shrines: ["Leather"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 5, amountMax: 20, weight: 24}, {name: "Rope", weight: 100.5, ignoreInInventory: true},]}, - {name: "Miner", faction: "Bandit", clusterWith: "human", playLine: "Bandit", bound: "Miner", tags: KDMapInit(["opendoors", "closedoors", "leashing", "bandit", "human", "miner", "imprisonable", "melee", "leatherRestraints", "leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "search"]), cohesion: 0.9, armor: 0, followRange: 1, AI: "hunt", - spells: ["MinerBomb"], spellCooldownMult: 1, spellCooldownMod: 3, noSpellLeashing: true, miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ffdd00"}, - ], - visionRadius: 5, maxhp: 11, minLevel:0, weight:12, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "pain", fullBoundBonus: 2, - terrainTags: {"increasingWeight": 1}, shrines: [], floors:KDMapInit(["cry"]), noOverrideFloor: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 21}, {name: "Pickaxe", ignoreInInventory: true, weight: 100}, {name: "Bomb", weight: 9}]}, - {name: "Bandit", faction: "Bandit", clusterWith: "bandit", playLine: "Bandit", bound: "Bandit", tags: KDMapInit(["opendoors", "closedoors", "leashing", "cacheguard", "imprisonable", "bandit", "minor", "melee", "leatherRestraints", "leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "jail", "jailer", "search"]), cohesion: 0.9, armor: 0, followRange: 1, AI: "hunt", - spells: ["BanditBola"], spellCooldownMult: 1, spellCooldownMod: 8, noSpellLeashing: true, difficulty: 0.9, miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", - visionRadius: 6, maxhp: 9, minLevel:0, maxLevel: 9, weight:23, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"thirdhalf":-4, "increasingWeight":-1, "BanditEnemy": -7, "BanditWanted": -6, "BanditHated": -5}, shrines: ["Leather"], floors:KDMapInit(["jng", "cry"]), - dropTable: [{name: "Gold", amountMin: 5, amountMax: 15, weight: 24}, {name: "Rope", weight: 3.5, ignoreInInventory: true},]}, - {name: "BanditChief", faction: "Bandit", clusterWith: "bandit", playLine: "Bandit", bound: "BanditChief", tags: KDMapInit(["opendoors", "cacheguard", "closedoors", "leashing", "bandit", "miniboss", "banditleader", "melee", "unflinching", "ballGagRestraints", "handcuffer", "leatherRestraints", "leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "jail", "jailer", "hunter"]), cohesion: 0.9, armor: 0, followRange: 1, AI: "hunt", - summon: [ - {enemy: "BanditPet", range: 3, count: 1, chance: 1.0, strict: true},], - spells: ["BanditBola"], spellCooldownMult: 1, spellCooldownMod: 4, noSpellLeashing: true, miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", - visionRadius: 8, maxhp: 24, minLevel:0, weight:-11, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3.6, attackRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"secondhalf":16, "lastthird":5, "open": 10, "passage": -10, "increasingWeight":1}, shrines: ["Leather"], floors:KDMapInit(["jng", "cry", "tmp"]), - factionrep: {"Maidforce": 0.005}, - dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 10}, {name: "Knife", ignoreInInventory: true, weight: 2}, {name: "Rope", weight: 100, ignoreInInventory: true},]}, - {name: "BanditPet", faction: "Bandit", clusterWith: "human", playLine: "Gagged", bound: "BanditPet", tags: KDMapInit(["opendoors", "submissive", "noshop", "gagged", "cacheguard", "closedoors", "leashing", "bandit", "melee", "minor", "ballGagRestraints", "ropeRestraints", "tickleweakness", "chainweakness", "glueweakness", "jail", "search"]), cohesion: 0.9, armor: 0, followRange: 1, AI: "hunt", - master: {type: "BanditChief", range: 2, loose: true, aggressive: true}, difficulty: 0.7, - visionRadius: 6, maxhp: 8, minLevel:0, weight:13, movePoints: 1, attackPoints: 3, attack: "MeleeBindLockWill", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"thirdhalf":-1, "increasingWeight":-1}, shrines: ["Leather"], floors:KDMapInit(["jng", "cry"]), - dropTable: [{name: "Gold", amountMin: 1, amountMax: 5, weight: 10}, {name: "Feather", weight: 50, ignoreInInventory: true}]}, - {name: "BanditHunter", faction: "Bandit", bound: "BanditHunter", playLine: "Bandit", tags: KDMapInit(["opendoors", "closedoors", "leashing", "bandit", "imprisonable", "melee", "elite", "leatherRestraints", "leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "jail", "jailer", "hunter"]), ignorechance: 0, armor: 0, followRange: 2, AI: "hunt", guardChance: 0.6, stealth: 1, - spells: ["BanditBola"], spellCooldownMult: 1, spellCooldownMod: 3, noSpellLeashing: true, projectileTargeting: true, focusPlayer: true, miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", - visionRadius: 7, maxhp: 9, minLevel:0, weight:4 , movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"secondhalf":7, "thirdhalf":5}, shrines: ["Leather"], floors:KDMapInit(["jng", "cry", "tmp"]), - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Rope", weight: 8, ignoreInInventory: true},]}, - {name: "BanditGrappler", faction: "Bandit", clusterWith: "bandit", playLine: "Bandit", bound: "BanditGrappler", color: "#ddcaaa", - tags: KDMapInit(["opendoors", "closedoors", "leashing", "bandit", "melee", "cacheguard", "elite", "unflinching", "chainRestraints", "handcuffer","leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "jail", "jailer", "hunter"]), - ignorechance: 0, armor: 1, followRange: 1, AI: "hunt", - specialCD: 10, specialAttack: "Pull", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialsfx: "Chain", specialWidth: 1, specialRemove: "BindLock", pullDist: 3, pullTowardSelf: true, - visionRadius: 7, maxhp: 10, minLevel:3, weight:4, movePoints: 3, attackPoints: 2, attack: "MeleeBindLock", attackWidth: 2, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"secondhalf":10, "thirdhalf":1}, shrines: ["Leather", "Metal"], floors:KDMapInit(["jng", "cry", "tmp"]), - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}]}, - - {name: "SlimeMold", clusterWith: "mold", faction: "Mold", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "doortrap", "mold", "minor", "melee", "moldRestraints", "fireweakness", "glueresist", "acidweakness"]), - squeeze: true, ignorechance: 0.75, followRange: 1, AI: "hunt", sneakThreshold: 1, - visionRadius: 5, maxhp: 1, minLevel: 0, weight:-15, movePoints: 1.5, attackPoints: 2, attack: "MeleeBindSuicide", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 1, - terrainTags: {"increasingWeight":-2, "mold": 25}, allFloors: true, shrines: ["Latex"]}, - {name: "SlimeMoldLeaper", clusterWith: "mold", faction: "Mold", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "doortrap", "mold", "minor", "melee", "moldRestraints", "fireweakness", "glueresist", "acidweakness"]), - squeeze: true, ignorechance: 0.75, followRange: 1, AI: "hunt", sneakThreshold: 1, - specialCD: 5, specialAttack: "Dash", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 3, specialMinrange: 1.5, specialsfx: "Miss", - visionRadius: 9, maxhp: 1, minLevel: 3, weight:-5, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicide", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 2, - terrainTags: {"increasingWeight":-1, "mold": 25}, allFloors: true, shrines: ["Latex"]}, - - {name: "SlimeMoldSpawner", clusterWith: "mold", faction: "Mold", color: "#FF00FF", tags: KDMapInit(["mold", "immobile", "spawner", "melee", "moldRestraints", "meleeresist", "fireweakness", "glueresist", "acidweakness"]), - immobile: true, squeeze: true, followRange: 1, AI: "hunt", sneakThreshold: 1, enemyCountSpellLimit: 40, - spells: ["SummonSlimeMold"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, - visionRadius: 30, blindSight: 30, maxhp: 12, minLevel: 0, weight:-15, movePoints: 1000, attackPoints: 0, attack: "Spell", attackRange: 0, attackWidth: 1, power: 1, dmgType: "acid", fullBoundBonus: 5, - terrainTags: {"increasingWeight":0, "mold": 25, "maid": 15.25}, allFloors: true, shrines: ["Latex"], ondeath: [{type: "summon", enemy: "SlimeMold", range: 2.5, count: 4, strict: true}], - factionrep: {"Maidforce": 0.005}, - }, - - - - {name: "SlimeAdv", faction: "Slime", clusterWith: "slime", bound: "SlimeAdv", playLine: "Gagged", color: "#FF00FF", - tags: KDMapInit([ - "ignoretiedup", "latexTrap", "slime", "melee", "slimeRestraints", "glueimmune", "electricweakness", "acidresist", "iceweakness", "ticklesevereweakness", "charmweakness", - "submissive", "noshop", "gagged", "imprisonable", - ]), - ignorechance: 0, armor: 0, followRange: 2, AI: "hunt", cohesion: 0.45, sneakThreshold: 1, - master: {type: "WitchSlime", range: 2, loose: true, aggressive: true}, - visionRadius: 4.5, blindSight: 2.5, maxhp: 12, minLevel:2, weight:2, movePoints: 1.7, - attackPoints: 3, attack: "MeleeBindSlow", attackWidth: 1, attackRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 2, - terrainTags: {"latexAnger": 3, "latexRage": 3, "alchemist": 2, "slimeBonus": 2, "slime": 5, "jungle": 8}, shrines: ["Latex"], allFloors: true, - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, - ],}, - - {name: "SmallSlime", clusterWith: "slime", faction: "Slime", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "latexTrap", "minor", "slime", "melee", "slimeRestraints", "meleeresist", "glueimmune", "electricweakness", "acidresist", "iceweakness"]), squeeze: true, ignorechance: 0.75, followRange: 1, AI: "hunt", sneakThreshold: 1, - visionRadius: 3, blindSight: 2.5, maxhp: 3, minLevel: 0, maxLevel: 5, weight:8, movePoints: 1.5, attackPoints: 2, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "acid", fullBoundBonus: 2, - terrainTags: {"increasingWeight":-1, "slime": 4, "jungle": 20, "alchemist": 4}, allFloors: true, shrines: ["Latex"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, - ],}, - {name: "SmallSlimeLeaper", clusterWith: "slime", faction: "Slime", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "latexTrap", "minor", "slime", "melee", "slimeRestraints", "meleeresist", "glueimmune", "electricweakness", "acidresist", "iceweakness"]), squeeze: true, ignorechance: 0.75, followRange: 1, AI: "hunt", sneakThreshold: 1, - visionRadius: 4.5, blindSight: 2.5, maxhp: 3, minLevel: 5, weight:8, movePoints: 1.5, attackPoints: 2, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "acid", fullBoundBonus: 2, - specialCD: 5, specialAttack: "Dash", specialRemove: "BindSuicideWill", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.5, specialMinrange: 1.5, specialsfx: "Miss", - terrainTags: {"increasingWeight":-1, "slime": 4, "jungle": 20, "alchemist": 4}, allFloors: true, shrines: ["Latex"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, - ],}, - {name: "FastSlime", clusterWith: "slime", faction: "Slime", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "latexTrap", "slime", "melee", "slimeRestraints", "meleeresist", "glueimmune", "electricweakness", "acidresist", "iceweakness"]), squeeze: true, evasion: 0.3, followRange: 1, AI: "hunt", sneakThreshold: 1, - visionRadius: 4.5, blindSight: 2.5, maxhp: 3, minLevel: 9, weight:3, movePoints: 1, attackPoints: 3, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 3, power: 2, dmgType: "acid", fullBoundBonus: 2, - terrainTags: {"increasingWeight":1, "slime": 2.5, "jungle": 8, "alchemist": 4}, allFloors: true, shrines: ["Latex"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, - ],}, - {name: "BigSlime", clusterWith: "slime", faction: "Slime", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "slime", "latexTrap", "elite", "melee", "slimeRestraints", "meleeresist", "glueimmune", "electricweakness", "acidresist", "iceweakness"]), squeeze: true, evasion: 0.3, followRange: 1, AI: "hunt", sneakThreshold: 1, - visionRadius: 4.5, blindSight: 2.5, maxhp: 12, minLevel: 9, weight:2, movePoints: 3, attackPoints: 3, attack: "MeleeBind", attackWidth: 8, attackRange: 1, power: 4, dmgType: "acid", fullBoundBonus: 2, disarm: 0.5, - terrainTags: {"slime": 1.5, "alchemist": 3}, allFloors: true, shrines: ["Latex"], ondeath: [{type: "summon", enemy: "SmallSlime", range: 2.5, count: 4, strict: true, lifetime: 50}], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 3, chance: 1.0, duration: 20}, - {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Slime", time: 25, power: 2, chance: 0.3, aoe: 0.5} - ], - }, - - {name: "StoneDoor", faction: "Natural", blockVision: true, - cueSfx: { - Block: "Clang", - Resist: "Clang", - Damage: "ArmorHit", - }, - tags: KDMapInit(["obstacledoor", "scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "poisonimmune", "harmless", - "soulimmune", "slashresist", "pierceresist", "electricresist", "crushweakness", "unarmedresist", "chainimmune", "glueresist", "acidresist", "tickleimmune", "gropeimmune", "painimmune", "charmimmune", - ]), spellResist: 0, sneakThreshold: 0.01, - evasion: -9, ignorechance: 1.0, armor: 3, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, immobile: true, - visionRadius: 0, maxhp: 10, minLevel:0, weight:-4, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", - terrainTags: {"obstacle": 10, "obstacletile": 50}, allFloors: true, shrines: [], - events: [ - {trigger: "duringDamageEnemy", type: "damageThreshold", power: 1, chance: 1.0}, - ], - }, - {name: "SteelDoor", faction: "Natural", blockVision: true, - cueSfx: { - Block: "Clang", - Resist: "Clang", - Damage: "ArmorHit", - }, - tags: KDMapInit(["obstacledoor", "steeldoor", "scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "poisonimmune", "harmless", - "soulimmune", "slashresist", "pierceresist", "electricimmune", "unarmedresist", "chainimmune", "glueresist", "tickleimmune", "gropeimmune", "painimmune", "charmimmune", - ]), spellResist: 1, sneakThreshold: 0.01, - evasion: -9, ignorechance: 1.0, armor: 5, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, immobile: true, - visionRadius: 0, maxhp: 15, minLevel:9, weight:-4, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", - terrainTags: {"obstacle": 10, "obstacletile": 30}, allFloors: true, shrines: [], - events: [ - {trigger: "duringDamageEnemy", type: "damageThreshold", power: 1, chance: 1.0}, - ], - }, - {name: "DollDoor", faction: "Natural", blockVision: true, - cueSfx: { - Block: "Clang", - Resist: "Clang", - Damage: "ArmorHit", - }, - tags: KDMapInit(["dolldoor", "scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "poisonimmune", "harmless", - "soulimmune", "slashresist", "pierceresist", "electricimmune", "unarmedresist", "chainimmune", "glueresist", "tickleimmune", "gropeimmune", "painimmune", "charmimmune", - ]), spellResist: 5, armor: 5, sneakThreshold: 0.01, - evasion: -9, ignorechance: 1.0, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, immobile: true, - visionRadius: 0, maxhp: 60, minLevel:0, weight:-100, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", - terrainTags: {dolldoor: 200}, allFloors: true, shrines: [], - events: [ - {trigger: "duringDamageEnemy", type: "damageThreshold", power: 1, chance: 1.0}, - ], - }, - - {name: "GiantMushroom", faction: "Natural", clusterWith: "mushroom", tags: KDMapInit(["mushroom", "scenery", "nonvulnerable", "minor", "inactive", "harmless", "immobile", "unstoppable", "soulimmune", "slashweakness", "fireweakness", "glueresist", "poisonimmune", "coldweakness"]), spellResist: 0.33, sneakThreshold: 0.01, - evasion: -9, ignorechance: 1.0, armor: 0, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, immobile: true, - visionRadius: 0, maxhp: 1, minLevel:0, weight:5, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", - terrainTags: {}, floors:KDMapInit(["cry", "jng"]), shrines: ["Will"], ondeath: [{type: "spellOnSelf", spell: "Spores"}], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0}, - ],}, - {name: "Toad", faction: "Beast", clusterWith: "beast", color: "#00FF44", tags: KDMapInit(["ignorenoSP", "beast", "soulresist", "ranged", "pierceweakness", "electricsevereweakness", "acidresist"]), followLeashedOnly: true, armor: 1, followRange: 1, AI: "hunt", - pullTowardSelf: true, pullDist: 3, master: {type: "GiantMushroom", range: 3}, projectileAttack: true, projectileTargeting: true, - visionRadius: 5, maxhp: 16, minLevel:0, weight:7, movePoints: 2, attackPoints: 3, attack: "MeleePullWill", attackRange: 5, attackWidth: 1, power: 2, strictAttackLOS: true, dmgType: "tickle", - terrainTags: {"increasingWeight":2, "secondhalf":3, }, floors:KDMapInit(["cry"]), dropTable: [{name: "Nothing", weight: 12}, {name: "WaterRune", weight: 3}]}, - {name: "Mushy", faction: "Mushy", clusterWith: "mushroom", color: "#4fa4b8", difficulty: 0.2, - tags: KDMapInit(["leashing", "mushroom", "soulresist", "mushy", "melee", "minor", "slashweakness", "fireweakness", "glueresist", "poisonimmune", "coldweakness", "ropeMagicStrong", "ropeAuxiliary", "ropeRestraintsHogtie", "clothRestraints", "tapeRestraints"]), - squeeze: true, evasion: -0.5, followRange: 1, AI: "patrol", regen: 0.1, - visionRadius: 5, maxhp: 8, minLevel: 4, weight:14, movePoints: 4, attackPoints: 2, attack: "MeleeBindBlindWill", blindTime: 2, attackWidth: 3, attackRange: 1, power: 2, dmgType: "poison", fullBoundBonus: 2, - terrainTags: {"mushy": 10}, floors:KDMapInit(["cry"]), shrines: [], ondeath: [{type: "spellOnSelf", spell: "Spores"}], - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0}, - ],}, - {name: "MushyHappy", clusterWith: "mushroom", color: "#4fa4b8", difficulty: 0.1, - tags: KDMapInit(["ignorenoSP", "mushroom", "soulresist", "mushy", "melee", "minor", "slashweakness", "fireweakness", "glueresist", "poisonimmune", "coldweakness"]), - squeeze: true, evasion: -0.5, followRange: 1, AI: "hunt", regen: 0.1, - spells: ["SporesHappy"], spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, castWhileMoving: true, - visionRadius: 5, maxhp: 8, minLevel: 7, weight:14, movePoints: 4, attackPoints: 2, attack: "SpellMeleeWillBlind", blindTime: 2, attackWidth: 1, attackRange: 1, power: 4, dmgType: "tickle", hitsfx: "Tickle", - terrainTags: {"mushy": 10}, floors:KDMapInit(["cry"]), shrines: [], ondeath: [{type: "spellOnSelf", spell: "Spores"}], - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0}, - {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff44aa"}, - ],}, - {name: "MushySick", clusterWith: "mushroom", color: "#4fa4b8", difficulty: 0.1, - tags: KDMapInit(["ignorenoSP", "mushroom", "soulresist", "mushy", "melee", "minor", "slashweakness", "fireweakness", "glueresist", "poisonimmune", "coldweakness"]), - squeeze: true, evasion: -0.5, followRange: 1, AI: "hunt", - spells: ["SporesSick"], spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, castWhileMoving: true, - visionRadius: 5, maxhp: 8, minLevel: 0, weight:14, movePoints: 4, attackPoints: 2, attack: "SpellMeleeWillBlind", blindTime: 2, attackWidth: 1, attackRange: 1, power: 2, dmgType: "crush", - terrainTags: {"mushy": 10}, floors:KDMapInit(["cry"]), shrines: ["Will"], ondeath: [{type: "spellOnSelf", spell: "Spores"}], - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0}, - {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#00ff00"}, - ],}, - - {name: "Dragon", faction: "Dragon", clusterWith: "dragon", bound: "Dragon", color: "#F92900", tags: KDMapInit(["opendoors", "fire", "guardCall", "jailer", "leashing", "imprisonable", "minor", "dragon", "melee", "dragonRestraints", "handcuffer", "leatherRestraints", "fireresist", "jail", "jailer", "search"]), cohesion: 0.75, - followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, difficulty: 0.5, - visionRadius: 6, maxhp: 10, minLevel:1, weight:-1, movePoints: 2, attackPoints: 2, attack: "MeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, maxLevel: 7, - terrainTags: {"secondhalf":2, "leatherAnger":3, "dragon": 10, "fire": 4}, shrines: ["Leather"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 15}]}, - {name: "DragonShield", faction: "Dragon", clusterWith: "dragon", bound: "DragonShield", color: "#F92900", tags: KDMapInit(["opendoors", "guardCall", "fire", "imprisonable", "leashing", "dragon", "melee", "dragonRestraints", "handcuffer", "leatherRestraints", "fireresist", "jail", "jailer", "search"]), cohesion: 0.75, - stunTime: 2, specialCD: 6, specialAttack: "Stun", specialRemove: "BindLock", specialPower: 6, specialDamage: "pain", - spells: ["ArmorUpArea"], spellCooldownMult: 1, spellCooldownMod: 5, buffallies: true, - followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, - visionRadius: 7, maxhp: 14, minLevel:4, weight:-1, movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLock", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"secondhalf":1, "thirdhalf":1, "leatherAnger":3, "leatherRage":4, "dragon": 10, "fire": 4}, shrines: ["Leather"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 15}]}, - {name: "DragonIce", faction: "Dragon", clusterWith: "dragon", bound: "DragonIce", color: "#aaaaff", tags: KDMapInit(["opendoors", "ice", "leashing", "dragon", "melee", "elite", "dragonRestraints", "handcuffer", "leatherRestraints", "iceimmune", "fireweakness", "crushweakness", "jail", "jailer", "hunter"]), cohesion: 0.75, - followLeashedOnly: true, ignorechance: 0, armor: 1, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, - spells: ["IceDragonBreathPrepare"], spellCooldownMult: 1, spellCooldownMod: 3, spellRdy: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#00ffff"}, - ], - visionRadius: 7, maxhp: 14, minLevel:4, weight:-2, movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLockAll", attackWidth: 1, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 1, - attackLock: "Purple", - terrainTags: {"secondhalf":2, "thirdhalf":2, "dragon": 6, "ice": 4}, shrines: ["Leather", "Elements"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 12}, {name: "IceRune", weight: 3}, {name: "IceBreaker", weight: 0.1, ignoreInInventory: true}]}, - {name: "DragonPoison", faction: "Dragon", clusterWith: "dragon", bound: "DragonPoison", color: "#44ff77", tags: KDMapInit(["opendoors", "nature", "leashing", "dragon", "melee", "elite", "dragonRestraints", "handcuffer", "leatherRestraints", "unflinching", "fireresist", "jail", "jailer", "hunter"]), cohesion: 0.75, - followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, - spells: ["PoisonDragonBlast", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: -1, tilesMinRange: 2, stopToCast: true, spellRdy: true, - visionRadius: 7, maxhp: 11, minLevel:6, weight:-2, movePoints: 3, attackPoints: 4, attack: "SpellMeleeStunWill", stunTime: 1, attackWidth: 3, attackRange: 2, power: 3, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"secondhalf":2, "thirdhalf":2, "dragon": 6, "nature": 4}, shrines: ["Leather", "Will"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 12}, {name: "Pick", weight: 4}, {name: "PotionStamina", weight: 3}]}, - {name: "DragonCrystal", faction: "Dragon", clusterWith: "dragon", bound: "DragonCrystal", color: "#ff00aa", tags: KDMapInit(["opendoors", "chaos", "leashing", "dragon", "melee", "elite", "dragonRestraints", "handcuffer", "leatherRestraints", "leatherRestraintsHeavy", "pierceweakness", "electricresist", "crushweakness", "fireresist", "jail", "jailer", "hunter"]), cohesion: 0.75, - followLeashedOnly: true, ignorechance: 0, armor: 1, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, - spells: ["SummonCrystals"], spellCooldownMult: 1, spellCooldownMod: 2, castWhileMoving: true, spellRdy: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff44aa"}, - ], - visionRadius: 7, maxhp: 10, minLevel:7, weight:-1, movePoints: 1.5, attackPoints: 2, attack: "SpellMeleeBindLockWill", stunTime: 1, attackWidth: 1, attackRange: 1, power: 3, dmgType: "crush", fullBoundBonus: 2, - terrainTags: {"secondhalf":1, "thirdhalf":2, "crystalline": 10, "dragon": 3}, shrines: ["Leather", "Conjure"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 15}, {name: "EarthRune", weight: 3}]}, - {name: "DragonShadow", faction: "Dragon", clusterWith: "dragon", bound: "DragonShadow", color: "#4400ff", - tags: KDMapInit(["opendoors", "shadow", "chaos", "leashing", "dragon", "melee", "elite", "dragonRestraints", "handcuffer", "shadowRestraints", "coldimmune", "fireresist", "jail", "jailer", "hunter"]), - cohesion: 0.75, - followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, - spells: ["ShadowOrb"], spellCooldownMult: 1, spellCooldownMod: 0, pullTowardSelf: true, pullDist: 3, disarm: 0.4, - specialCD: 7, specialAttack: "Pull", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialsfx: "MagicSlash", - visionRadius: 7, maxhp: 16, minLevel:9, weight:-1, movePoints: 2, attackPoints: 2, attack: "SpellMeleeWill", stunTime: 3, attackWidth: 1, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"secondhalf":1, "thirdhalf":2, "dragon": 3, "shadow": 4}, shrines: ["Leather", "Conjure"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Knife", ignoreInInventory: true, weight: 4}]}, - {name: "DragonLeader", faction: "Dragon", clusterWith: "dragon", bound: "DragonLeader", color: "#F92900", tags: KDMapInit(["opendoors", "fire", "leashing", "dragon", "melee", "boss", "dragonRestraints", "unflinching", "handcuffer", "leatherRestraints", "leatherRestraintsHeavy", "jailer", "fireimmune"]), - ignorechance: 0, armor: 0, followRange: 1, AI: "patrol", focusPlayer: true, - summon: [ - {enemy: "Dragon", range: 2, count: 2, chance: 0.4, strict: true}, - {enemy: "DragonIce", range: 3, count: 1, chance: 0.25, strict: true}, - {enemy: "DragonPoison", range: 3, count: 1, chance: 0.25, strict: true}, - {enemy: "DragonCrystal", range: 3, count: 1, chance: 0.25, strict: true}, - {enemy: "DragonShadow", range: 3, count: 1, chance: 0.25, strict: true},], - specialCD: 5, specialAttack: "Dash", specialRemove: "BindLockWill", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 3, specialMinrange: 1.5, specialsfx: "Miss", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ff5555"}, - ], - visionRadius: 8, maxhp: 20, minLevel:4, weight:-11, movePoints: 2, attackPoints: 2, attack: "MeleeBindLockWill", attackWidth: 1, attackRange: 1, power: 4, dmgType: "crush", fullBoundBonus: 2, - terrainTags: {"secondhalf":2, "thirdhalf":4, "open": 10, "fire": 4, "leatherAnger":6, "leatherRage":30, "boss": -55, "increasingWeight":0.5, "dragon": 1}, shrines: ["Leather"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 30, amountMax: 40, weight: 10}, {name: "Sword", ignoreInInventory: true, weight: 100}, {name: "EnchKnife", ignoreInInventory: true, weight: 1}]}, - - - {name: "ElementalFire", faction: "Elemental", playLine: "Elemental", clusterWith: "fire", bound: "ElementalFire", color: "#FF6200", tags: KDMapInit(["opendoors", "fire", "guardCall", "elemental", "fireimmune", "ranged", "coldweakness", "icesevereweakness", "obsidianRestraints", "shackleRestraints", "leashing", "jail", "jailer", "search"]), - armor: 0, kite: 1.5, followRange: 3, AI: "hunt", - spells: ["HeatBolt"], spellCooldownMult: 1, spellCooldownMod: 1, followLeashedOnly: true, stopToCast: true, spellRdy: true, projectileTargeting: true, - visionRadius: 7, maxhp: 8, minLevel:0, weight:-1, movePoints: 1.5, attackPoints: 3, attack: "SpellMeleeWillBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "pain", fullBoundBonus: 2, - terrainTags: {"secondhalf":2, "thirdhalf":1, "open": 1, "elementsAnger": 12, "elementsRage": 6, "temple": 5, "elemental": 6}, allFloors: true, shrines: ["Elements", "Metal"], - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}, {name: "EarthRune", weight: 1}], - events: [ - {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Ember", time: 3, power: 2, chance: 0.2, aoe: 1.5}, - {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff8933"}], - }, - {name: "ElementalIce", faction: "Elemental", playLine: "Elemental", clusterWith: "ice", bound: "ElementalIce", color: "#aaaaff", tags: KDMapInit(["opendoors", "elemental", "guardCall", "ice", "ranged", "firesevereweakness", "crushweakness", "coldresist", "iceimmune", "iceRestraints", "leashing", "jail", "jailer", "search"]), - armor: 1, kite: 1.5, followRange: 3, AI: "hunt", - spells: ["IceSlowPrepare"], spellCooldownMult: 1, spellCooldownMod: 1, followLeashedOnly: true, noSpellLeashing: true, spellRdy: true, projectileTargeting: true, - visionRadius: 7, maxhp: 8, minLevel:3, weight:-2, movePoints: 1.5, attackPoints: 3, attack: "SpellMeleeWillBindLockAll", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, multiBind: 2, - terrainTags: {"secondhalf":1, "thirdhalf":1, "open": 1, "elementsAnger": 8, "elementsRage": 3, "temple": 6, "elemental": 6, "ice": 4}, allFloors: true, shrines: ["Elements"], attackLock: "Purple", - events: [ - {trigger: "afterEnemyTick", type: "createIce", power: 1, chance: 1.0, aoe: 1.0}, - {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#00ffff"}, - ], - dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}, {name: "IceRune", weight: 1}, {name: "IceBreaker", weight: 0.1, ignoreInInventory: true}]}, - {name: "ElementalWater", faction: "Elemental", playLine: "Elemental", clusterWith: "ice", bound: "ElementalWater", color: "#57ff88", tags: KDMapInit(["opendoors", "water", "elemental", "ranged", "fireresist", "acidimmune", "electricsevereweakness", "latexRestraints", "ropeRestraints", "elite", "leashing", "jail", "jailer", "hunter"]), armor: 0, kite: 1.5, followRange: 3, AI: "hunt", guardChance: 0.6, evasion: 0.25, summon: [{enemy: "ElementalIce", range: 2.5, count: 1, chance: 0.6, strict: true}], - specialCD: 5, specialAttack: "Pull", specialCDonAttack: true, specialAttackPoints: 4, specialRange: 4, specialWidth: 3, specialMinrange: 1.5, specialsfx: "Song", hitsfx: "Song", tilesMinRangeSpecial: 2, - visionRadius: 7, maxhp: 12, minLevel:3, weight:-2, movePoints: 1.5, followLeashedOnly: true, projectileTargeting: true, - attackPoints: 3, attack: "MeleeBindLockAll", attackWidth: 3, attackRange: 1, power: 5, dmgType: "charm", pullTowardSelf: true, pullDist: 2, pullMsg: true, - attackLock: "Purple", - terrainTags: {"secondhalf":1, "thirdhalf":1, "open": 1, "elementsAnger": 8, "elementsRage": 3, "illusionAnger": 2, "latexAnger": 2, "temple": 5, "elemental": 4, "water": 4}, allFloors: true, shrines: ["Elements"], - events: [{trigger: "afterEnemyTick", type: "createWater", power: 2, chance: 1.0, aoe: 0.5}], - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "WaterRune", weight: 2}]}, - {name: "ElementalEarth", faction: "Elemental", playLine: "Elemental", clusterWith: "elemental", bound: "ElementalEarth", color: "#C1703A", - tags: KDMapInit(["opendoors", "elemental", "fireresist", "melee", "nofreeze", "earth", "elite", "electricimmune", "guardCall", "unflinching", "iceweakness", "unarmedresist", "slashresist", "pierceresist", "obsidianRestraints", "shackleRestraints", "leashing", "magicresist", "jail", "jailer", "hunter"]), armor: 1, followRange: 1, AI: "hunt", - specialCD: 15, specialAttack: "Dash", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4, specialMinrange: 1.5, specialsfx: "Miss", castWhileMoving: true, dashThruWalls: true, - spells: ["ArmorUp", "Earthfield"], spellCooldownMult: 1, spellCooldownMod: 14, followLeashedOnly: true, spellRdy: true, - visionRadius: 7, maxhp: 12, minLevel:7, weight:-2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"secondhalf":1, "thirdhalf":2, "elementsAnger": 12, "elementsRage": 6, "temple": 6, "elemental": 4, "earth": 4}, allFloors: true, shrines: ["Elements", "Metal"], - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "EarthRune", weight: 3}], - events: [{trigger: "afterEnemyTick", type: "createEffectTile", kind: "Cracked", time: 10, power: 2, chance: 0.3, aoe: 0.5}], - }, - {name: "ElementalAir", faction: "Elemental", playLine: "Elemental", clusterWith: "electric", bound: "ElementalAir", color: "#88aaff", tags: KDMapInit(["opendoors", "electric", "nofreeze", "elemental", "melee", "elite", "fireweakness", "electricresist", "coldweakness", "latexRestraints", "ropeRestraints", "leashing", "jail", "jailer", "hunter"]), armor: -1, followRange: 1, AI: "hunt", guardChance: 0.6, evasion: 0.5, - specialCD: 5, specialAttack: "Dash", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 3, specialMinrange: 1.5, specialsfx: "Miss", castWhileMoving: true, dashThruWalls: true, dashThrough: true, - spells: ["AreaElectrify"], spellCooldownMult: 1, spellCooldownMod: 3, followLeashedOnly: true, disarm: 1, noSpellLeashing: true, spellRdy: true, noChannel: true, - visionRadius: 7, maxhp: 12, minLevel:4, weight:-2, movePoints: 1, attackPoints: 2, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 3, - terrainTags: {"secondhalf":1, "thirdhalf":2, "elementsAnger": 12, "elementsRage": 6, "temple": 5, "elemental": 4, "electric": 4, "air": 4}, allFloors: true, shrines: ["Elements", "Latex"], - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}]}, - - {name: "Dryad", faction: "Elf", clusterWith: "nature", bound: "Dryad", playLine: "Dryad", color: "#67ff44", tags: KDMapInit(["opendoors", "nature", "elf", "leashing", "plant", "ranged", "vineRestraints", "slashweakness", "pierceweakness", "fireweakness", "search"]), cohesion: 0.0, - followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 3, AI: "hunt", - specialCD: 15, specialAttack: "Stun", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialWidth: 2, specialMinrange: 1.5, specialsfx: "Song", tilesMinRangeSpecial: 2, stunTime: 4, - specialDamage: "charm", spellRdy: true, - spells: ["PoisonDragonBlast", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: -2, tilesMinRange: 1, stopToCast: true, kite: 1.5, - visionRadius: 6, maxhp: 10, minLevel:2, weight:-3, movePoints: 1.5, attackPoints: 3, attack: "SpellMeleeBind", attackWidth: 3, attackRange: 1, power: 2, dmgType: "tickle", fullBoundBonus: 2, hitsfx: "Tickle", - terrainTags: {"secondhalf":1, "thirdhalf":2, "willAnger": 11, "willRage": -6, "elf": 5, "nature": 4}, shrines: ["Will"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 12}, {name: "EarthRune", weight: 4}]}, - {name: "JungleDryad", faction: "Elf", clusterWith: "nature", bound: "JungleDryad", playLine: "Dryad", color: "#67ff44", tags: KDMapInit(["opendoors", "nature", "elf", "leashing", "plant", "ranged", "vineRestraints", "slashweakness", "pierceweakness", "fireweakness", "search"]), cohesion: 0.0, - followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 3, AI: "hunt", - spellRdy: true, - spells: ["PoisonDragonBlast", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: -2, tilesMinRange: 1, stopToCast: true, kite: 1.5, - visionRadius: 6, maxhp: 10, minLevel:7, weight:5, movePoints: 1, attackPoints: 3, attack: "SpellMeleeBind", attackWidth: 3, attackRange: 1, power: 2, dmgType: "tickle", fullBoundBonus: 2, hitsfx: "Tickle", - terrainTags: {"secondhalf":3, "thirdhalf":4}, shrines: ["Will"], floors:KDMapInit(["jng"]), noOverrideFloor: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 12}, {name: "EarthRune", weight: 4}]}, - - {name: "ElfRanger", faction: "Elf", clusterWith: "nature", bound: "ElfRanger", playLine: "Elf", color: "#67ff44", tags: KDMapInit(["opendoors", "guardCall", "leashing", "elf", "ranged", "elite", "mithrilRope", "pierceweakness", "iceweakness", "chainresist", "jail", "jailer", "hunter"]), cohesion: 0.0, - followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 3, AI: "hunt", stealth: 3, focusPlayer: true, - spells: ["ElfArrow"], miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, castWhileMoving: true, kite: 1.5, projectileAttack: true, - visionRadius: 9, maxhp: 13, minLevel:3, weight:-0.5, movePoints: 1, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, - attackLock: "Purple", - terrainTags: {"secondhalf":1, "thirdhalf":1, "willAnger": 5, "willRage": 8, "temple": 5, "elf": 12}, shrines: ["Will"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 12}, {name: "ElfCrystal", weight: 3}]}, - {name: "Elf", faction: "Elf", clusterWith: "elf", bound: "Elf", playLine: "Elf", color: "#67ff44", tags: KDMapInit(["opendoors", "guardCall", "religious", "jailer", "leashing", "elf", "imprisonable", "ranged", "elite", "mithrilRestraints", "pierceweakness", "iceweakness", "chainresist", "jail", "jailer", "hunter"]), cohesion: 0.7, - followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, buffallies: true, spellRdy: true, - spells: ["Entangle", "OrbHeal", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 16, spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, castWhileMoving: true, kite: 1.5, - visionRadius: 9, maxhp: 16, minLevel:7, weight:-3, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, - attackLock: "Purple", - terrainTags: {"secondhalf":1, "thirdhalf":1, "willAnger": 4, "willRage": 6, "temple": 5, "elf": 8}, shrines: ["Will"], allFloors: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 9}, {name: "ElfCrystal", weight: 4}], - ondeath: [ - {type: "summon", enemy: "Bramble", range: 0.5, count: 1, strict: true} - ], - events: [ - {trigger: "getLights", type: "enemyTorch", power: 4, color: "#ffffff"} - ], - }, - - {name: "OrbOfLight", clusterWith: "nature", color: "#ffff00", tags: KDMapInit(["opendoors", "ignorenoSP", "nature", "ghost", "ranged", "soulimmune", "unstoppable", "coldsevereweakness", "flying"]), cohesion: 1.0, cohesionRange: 10, - followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 3, AI: "hunt", buffallies: true, spellRdy: true, sneakthreshold: 0.95, - spells: ["OrbHeal"], spellCooldownMult: 1, spellCooldownMod: 3, tilesMinRange: 1, stopToCast: true, kite: 1.5, kiteChance: 0.9, - visionRadius: 10, blindSight: 10, maxhp: 10, minLevel:3, weight:1.5, movePoints: 3, attackPoints: 4, attack: "SpellMeleeBlindWill", blindTime: 3, attackWidth: 8, attackRange: 1, power: 6, dmgType: "fire", - terrainTags: {"willAnger":4, "willRage":4, "magical": 4, "elf": 6}, shrines: ["Will"], allFloors: true, dropTable: [{name: "Ectoplasm", weight: 9}, {name: "ElfCrystal", weight: 3}], - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffff44"} - ], - }, - - {name: "Monolith", clusterWith: "chaos", color: "#ff5277", - tags: KDMapInit(["opendoors", "ignorenoSP", "construct", "poisonimmune", "soulimmune", "temple", "minor", "chaos", "ranged", "slashimmune", "unarmedresist", "pierceimmune", "fireresist", "unstoppable", "tickleresist", "groperesist", "electricresist", "flying"]), - cohesion: 0, cohesionRange: 10, difficulty: 0.3, - followLeashedOnly: true, ignorechance: 0, armor: 1, spellResist: 0.5, followRange: 2, AI: "guard", buffallies: true, spellRdy: false, sneakthreshold: 0.95, - spells: ["MonolithBeam"], spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, kite: 1.5, kiteChance: 0.9, - visionRadius: 5, blindSight: 5, maxhp: 7, minLevel:10, weight:4, movePoints: 4, attackPoints: 4, attack: "Spell", attackWidth: 8, attackRange: 1, power: 3, dmgType: "fire", - terrainTags: {"open": 25, "temple": 6}, shrines: [], floors:KDMapInit(["tmp", "tmb", "cry"]), dropTable: [{name: "EarthRune", weight: 7}, {name: "ElfCrystal", weight: 3}], - }, - - {name: "Pixie", clusterWith: "nature", tags: KDMapInit(["ignorenoSP", "fairy", "soulresist", "chaos", "melee", "minor", "magicweakness", "flying"]), followRange: 1, AI: "hunt", squeeze: true, ethereal: true, cohesion: 1.0, - summon: [ - {enemy: "Pixie", range: 3, count: 2, chance: 0.2, strict: true},], - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ffffff"} - ], - difficulty: 0.2, - spells: ["EnemyFlash"], spellCooldownMult: 1, spellCooldownMod: 14, castWhileMoving: true, - visionRadius: 6, blindSight: 4, maxhp: 1, evasion: 1.0, minLevel:0, weight:0.1, movePoints: 1.25, attackPoints: 2, attack: "MeleeWillSpell", attackWidth: 1, attackRange: 1, power: 2, dmgType: "charm", - terrainTags: {"willAnger": 2, "willRage": 3, "elf": 0.4}, shrines: ["Will"], allFloors: true}, - - {name: "ChaoticCrystal", faction: "Natural", clusterWith: "chaos", color: "#ff00aa", immobile: true, hitsfx: "Evil", tags: KDMapInit(["crystal", "chaos", "minor", "inactive", "melee", "crushweakness", "soulimmune"]), - evasion: -9, ignorechance: 1.0, armor: 0, followRange: 1, AI: "wander", sneakThreshold: 0.01, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ff44aa"} - ], - visionRadius: 1.5, blindSight: 1.5, maxhp: 8, minLevel:0, weight:0, movePoints: 99999, attackPoints: 1, attack: "MeleeWill", attackWidth: 8, attackRange: 1, power: 1, dmgType: "drain", - terrainTags: {"passage": -999, "door": -99, "crystalline": 45}, floors:KDMapInit(["cry"]), shrines: []}, - {name: "ChaoticCrystalActive", faction: "Natural", clusterWith: "chaos", immobile: true, color: "#ff00aa", hitsfx: "Evil", tags: KDMapInit(["crystal", "active", "chaos", "melee", "crushweakness", "crystalRestraints", "soulimmune"]), - evasion: -9, ignorechance: 1.0, armor: 0, followRange: 1, AI: "wander", sneakThreshold: 0.01, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff44aa"} - ], - visionRadius: 5, blindSight: 5, maxhp: 16, minLevel:0, weight:0, movePoints: 99999, attackPoints: 4, attack: "MeleeWillBind", attackWidth: 8, attackRange: 2, power: 2, dmgType: "drain", fullBoundBonus: 2, - terrainTags: {"passage": -999, "door": -99, "crystalline": 5, "open": 45}, floors:KDMapInit(["cry"]), shrines: []}, - - {name: "Statue", faction: "Natural", tags: KDMapInit(["mimicBlock", "statue", "minor", "melee", "unflinching", "crushweakness", "harmless", "pierceweakness", "chainresist", "soulimmune"]), immobile: true, spellResist: 0.33, sneakThreshold: 0.01, - evasion: -9, ignorechance: 1.0, armor: 2, followRange: 1, AI: "ambush", ambushRadius: 0, - visionRadius: 0, maxhp: 8, minLevel:0, weight:30, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 4, dmgType: "souldrain", - terrainTags: {"passage": -999, "temple": 82, "open": 10}, floors:KDMapInit(["tmp"]), shrines: []}, - {name: "StatueGag", tags: KDMapInit(["ignoregagged", "mimicBlock", "statue", "minor", "melee", "unflinching", "ballGagRestraintsMagic", "crushweakness", "pierceweakness", "chainresist", "soulimmune"]), spellResist: 0.33, sneakThreshold: 0.01, - evasion: -9, ignorechance: 1.0, armor: 2, followRange: 1, AI: "ambush", ambushRadius: 1.5, difficulty: 0.2, - visionRadius: 8, maxhp: 12, minLevel:0, weight:10, movePoints: 2, attackPoints: 2, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", - terrainTags: {"passage": -999, "temple": 72, "open": 10}, floors:KDMapInit(["tmp"]), shrines: ["Latex"]}, - {name: "StatueDart", tags: KDMapInit(["mimicBlock", "statue", "minor", "melee", "unflinching", "crushweakness", "pierceweakness", "chainresist", "soulimmune"]), immobile: true, spellResist: 0.33, sneakThreshold: 0.01, - spells: ["SleepDart"], spellCooldownMult: 1, spellCooldownMod: 20, stopToCast: true, castWhileMoving: true, projectileAttack: true, - evasion: -9, ignorechance: 1.0, armor: 2, followRange: 1, AI: "ambush", ambushRadius: 1.5, - visionRadius: 4, maxhp: 8, minLevel:0, weight:25, movePoints: 99999, attackPoints: 4, attack: "Spell", attackWidth: 8, attackRange: 3, power: 4, dmgType: "souldrain", - terrainTags: {"passage": -999, "temple": 72, "open": 15}, floors:KDMapInit(["tmp"]), shrines: []}, - - {name: "SoulCrystal", clusterWith: "chaos", color: "#880000", immobile: true, hitsfx: "Evil", tags: KDMapInit(["crystal", "soul", "minor", "unstoppable", "ranged", "crushweakness", "soulimmune", "flying"]), spellResist: 0.33, sneakThreshold: 0.01, - evasion: -9, ignorechance: 1.0, armor: 2, followRange: 1, AI: "wander", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ff0000"} - ], - visionRadius: 100, maxhp: 20, minLevel:0, weight:-99, movePoints: 99999, attackPoints: 4, attack: "MeleeWill", attackWidth: 2.5, attackRange: 3, power: 4, dmgType: "souldrain", - terrainTags: {"passage": -999, "temple": 20, "open": 125}, floors:KDMapInit(["tmp"]), shrines: ["Conjure"], - dropTable: [{name: "AncientPowerSourceSpent", weight: 9}, {name: "AncientPowerSource", weight: 1}]}, - {name: "SoulCrystalActive", clusterWith: "chaos", color: "#880000", immobile: true, hitsfx: "Evil", tags: KDMapInit(["crystal", "soul", "active", "unstoppable", "miniboss", "ranged", "crushweakness", "soulimmune", "flying"]), spellResist: 0.33, - evasion: -9, ignorechance: 1.0, armor: 2, followRange: 1, AI: "wander", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff0000"} - ], - spells: ["SoulCrystalBind"], spellCooldownMult: 1, spellCooldownMod: 0, followLeashedOnly: true, stopToCast: true, castWhileMoving: true, sneakThreshold: 0.01, - visionRadius: 100, maxhp: 20, minLevel:0, weight:-99, movePoints: 99999, attackPoints: 4, attack: "SpellMeleeWill", attackWidth: 2.5, attackRange: 3, power: 4, dmgType: "souldrain", - terrainTags: {"passage": -999, "temple": 10, "open": 115}, floors:KDMapInit(["tmp"]), shrines: ["Conjure"], - dropTable: [{name: "AncientPowerSource", weight: 10}]}, - - - - - {name: "ShadowHand", faction: "Ghost", clusterWith: "ghost", color: "#880044", tags: KDMapInit(["opendoors", "shadowHandEnemy", "shadowTrap", "ghost", "soulimmune", "fireweakness", "melee", "shadowimmune", "glueimmune", "chainimmune", "shadowHands", "poisonimmune", "meleeresist", "flying"]), - ignorechance: 0, armor: 0, followRange: 1, AI: "huntshadow", noAlert: true, hitsfx: "Evil", ignoreflag: ["ShadowHand"], failAttackflag: ["ShadowHand"], failAttackflagDuration: 2, - visionRadius: 10, blindSight: 4, evasion: 0.4, maxhp: 6, minLevel: 0, weight:-5, movePoints: 1, attackPoints: 2, attack: "MeleeWillBind", attackWidth: 1, attackRange: 1, power: 1.0, dmgType: "grope", fullBoundBonus: 4, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 0, color: "#880044"}, - {trigger: "beforeDamage", type: "shadowEngulf", power: 0, color: "#880044"}, - {trigger: "afterEnemyTick", type: "shadowDebuff", power: -0.5}, - ], - terrainTags: {"trap": 100}, shrines: [], allFloors: true}, - - {name: "ShadowGhast", faction: "Ghost", clusterWith: "ghost", color: "#880044", tags: KDMapInit(["opendoors", "shadowHandEnemy", "shadowTrap", "ghost", "soulimmune", "fireweakness", "melee", "shadowimmune", "glueimmune", "chainimmune", "shadowHands", "poisonimmune", "meleeresist", "flying"]), - ignorechance: 0, armor: 0, followRange: 1, AI: "huntshadow", hitsfx: "Evil", ignoreflag: ["ShadowHand"], failAttackflag: ["ShadowHand"], failAttackflagDuration: 2, - visionRadius: 10, blindSight: 5, evasion: 0.15, maxhp: 14, minLevel: 0, weight:-4, movePoints: 4, attackPoints: 3, attack: "SpellMeleeWillBindSlow", attackWidth: 1, attackRange: 3, power: 2.0, dmgType: "cold", fullBoundBonus: 2, - projectileAttack: true, - spells: ["SummonShadowHand"], spellCooldownMult: 2, spellCooldownMod: 0, castWhileMoving: true, followLeashedOnly: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 0, color: "#880044"}, - {trigger: "beforeDamage", type: "shadowEngulf", power: 0, color: "#880044"}, - {trigger: "afterEnemyTick", type: "shadowDebuff", power: -0.5}, - ], - terrainTags: {"shadowcreature" : 20, "increasingWeight": 0.1, "trap": 10, "goddessRage": 1}, shrines: [], allFloors: true, - dropTable: [{name: "Ectoplasm", weight: 1}]}, - - {name: "CorruptedAdventurer", faction: "Ghost", clusterWith: "ghost", bound: "CorruptedAdventurer", playLine: "Elemental", color: "#880044", - tags: KDMapInit(["shadowHandEnemy", "ghost", "soulresist", "fireweakness", "melee", "shadowresist", "glueresist", "chainresist", "shadowHands"]), - followRange: 1, ignoreflag: ["ShadowDommed"], failAttackflag: ["ShadowDommed"], - spells: ["ShadowBolt"], spellCooldownMult: 1, spellCooldownMod: 0, - AI: "huntshadow", visionRadius: 10, maxhp: 20, minLevel: 3, weight:-1, movePoints: 4, disarm: 0.33, - events: [ - {trigger: "afterEnemyTick", type: "shadowDebuff", power: -0.5}, - {trigger: "afterEnemyTick", type: "shadowDommeRefresh"}, - {trigger: "beforeDamage", type: "shadowDomme", power: 0, color: "#880044"}, - ], - attackPoints: 4, attack: "MeleeBindWillSpell", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 3, dmgType: "cold", multiBind: 2, - terrainTags: {"shadowcreature" : 9, "increasingWeight": 0.1, "goddessRage": 3}, shrines: [], allFloors: true, - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Ectoplasm", weight: 10}] - }, - - {name: "ChainBeing", clusterWith: "elemental", bound: "ChainBeing", playLine: "Elemental", color: "#c7a9fa", - tags: KDMapInit(["construct", "soulresist", "fireweakness", "melee", "shadowresist", "glueresist", "chainimmune", "obsidianRestraints", "chainRestraintsMagic", "leashing"]), - armor: 0, kite: 1.5, followRange: 3, AI: "hunt", - spells: ["ObsidianBolt"], spellCooldownMult: 1, spellCooldownMod: 1, followLeashedOnly: true, stopToCast: true, spellRdy: true, projectileTargeting: true, - visionRadius: 10, maxhp: 11, minLevel: 0, weight:-10, movePoints: 2, - attackPoints: 4, attack: "MeleeBindLockSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "soul", fullBoundBonus: 2.5, - attackLock: "Purple", - terrainTags: {"shadowcreature" : 6, "increasingWeight": 0.1, "metalAnger": 10, "metalPleased": 10, }, shrines: ["Metal"], allFloors: true, - events: [ - {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Chains", time: 5, power: 1, chance: 0.5, aoe: 0.5}, - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Chains", aoe: 1.5, power: 1, chance: 1.0}, - ], - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}] - }, - - - - {name: "DemonStar", clusterWith: "demon", bound: "Demon", playLine: "Elemental", color: "#9ea7de", - tags: KDMapInit(["opendoors", "order", "leashing", "demon", "melee", "miniboss", "mithrilRestraints", "electricresist", "fireresist", "coldresist", "soulweakness", "charmweakness", "jail", "jailer", "hunter"]), - armor: 1, followRange: 0, AI: "hunt", - spells: ["BoundByFate"], spellCooldownMult: 1, spellCooldownMod: 0, followLeashedOnly: true, stopToCast: true, spellRdy: true, projectileTargeting: true, - visionRadius: 10, maxhp: 16, minLevel: 0, weight:-10, movePoints: 4, - attackPoints: 3, attack: "MeleeBindLockSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 4, dmgType: "cold", fullBoundBonus: 2, - attackLock: "Purple", - terrainTags: {"demon" : 15, "increasingWeight": 0.1, "goddessRage": 10, "goddessPleased": 10, }, shrines: [], allFloors: true, - dropTable: [{name: "Gold", amountMin: 25, amountMax: 35, weight: 10}] - }, - - {name: "DemonMoon", clusterWith: "demon", bound: "Demon", playLine: "Elemental", color: "#9ea7de", - tags: KDMapInit(["opendoors", "order", "leashing", "demon", "melee", "miniboss", "mithrilRestraints", "electricresist", "fireresist", "coldresist", "soulweakness", "charmweakness", "jail", "jailer", "hunter"]), - armor: 1, followRange: 0, AI: "hunt", - spells: ["CrushingFate"], spellCooldownMult: 1, spellCooldownMod: 0, followLeashedOnly: true, stopToCast: true, spellRdy: true, projectileTargeting: true, - visionRadius: 10, maxhp: 16, minLevel: 0, weight:-10, movePoints: 4, - attackPoints: 3, attack: "MeleeBindLockSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 4, dmgType: "cold", fullBoundBonus: 2, - attackLock: "Purple", - terrainTags: {"demon" : 15, "increasingWeight": 0.1, "goddessRage": 10, "goddessPleased": 10, }, shrines: [], allFloors: true, - dropTable: [{name: "Gold", amountMin: 25, amountMax: 35, weight: 10}] - }, - - {name: "Gag", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["leatherTrap", "ropeTrap", "ignoregagged", "construct", "poisonresist", "soulimmune", "melee", "ballGagRestraints", "gagSpell", "minor", "chainresist", "doortrap", "flying"]), - ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_Gag"], failAttackflag: ["FA_Gag"], squeeze: true, ignoreStaminaForBinds: true, - Attack: { - mustBindorFail: true, - }, - specialCD: 8, specialAttack: "Dash", specialRemove: "BindSuicide", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.5, specialMinrange: 1.5, dashThrough: true, specialsfx: "Miss", - visionRadius: 3, visionSummoned: 12, maxhp: 4, minLevel: 0, weight:0, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicide", focusPlayer: true, - suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"trap": 50, gag: -40}, allFloors: true, shrines: [], summonTags: ["gag"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "AnimLegbinder", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["leatherTrap", "ignoreharmless", "construct", "poisonresist", "soulimmune", "melee", "legbinderSpell", "minor", "chainresist", "doortrap", "flying"]), - ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_Legb"], failAttackflag: ["FA_Legb"], squeeze: true, ignoreStaminaForBinds: true, - Attack: { - mustBindorFail: true, - }, - visionRadius: 6, visionSummoned: 12, maxhp: 10, minLevel: 5, weight:0, movePoints: 2, attackPoints: 3, attack: "MeleeBindSuicide", focusPlayer: true, - suicideOnAdd: true, attackWidth: 3, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"trap": 30, legbinder: -25}, allFloors: true, shrines: [], summonTags: ["legbinder"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "AnimArmbinder", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["leatherTrap", "ignoreharmless", "construct", "poisonresist", "soulimmune", "melee", "armbinderSpell", "minor", "chainresist", "doortrap", "flying"]), - ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_Armb"], failAttackflag: ["FA_Armb"], squeeze: true, ignoreStaminaForBinds: true, - Attack: { - mustBindorFail: true, - }, - visionRadius: 6, visionSummoned: 12, maxhp: 8, minLevel: 3, weight:0, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindSuicide", focusPlayer: true, - suicideOnAdd: true, attackWidth: 3, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"trap": 30, armbinder: -25}, allFloors: true, shrines: [], summonTags: ["armbinder"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "AnimHarness", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["leatherTrap", "ignoreharmless", "construct", "poisonresist", "soulimmune", "melee", "harnessSpell", "minor", "chainresist", "doortrap", "flying"]), - ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_Harness"], failAttackflag: ["FA_Harness"], squeeze: true, ignoreStaminaForBinds: true, - Attack: { - mustBindorFail: true, - }, - visionRadius: 6, visionSummoned: 12, maxhp: 6, minLevel: 0, weight:0, movePoints: 1.5, attackPoints: 2, attack: "MeleeBindSuicide", focusPlayer: true, - suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 2, dmgType: "crush", fullBoundBonus: 1, - terrainTags: {"trap": 25, harness: -20}, allFloors: true, shrines: [], summonTags: ["harness"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "AnimBlindfold", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["leatherTrap", "ropeTrap", "ignoreharmless", "construct", "poisonresist", "soulimmune", "melee", "blindfoldSpell", "minor", "chainresist", "doortrap", "flying"]), - ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_BF"], failAttackflag: ["FA_BF"], squeeze: true, ignoreStaminaForBinds: true, - Attack: { - mustBindorFail: true, - }, - specialCD: 8, specialAttack: "Dash", specialRemove: "BindSuicide", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.5, specialMinrange: 1.5, dashThrough: true, specialsfx: "Miss", - visionRadius: 9, visionSummoned: 12, maxhp: 4, minLevel: 4, weight:0, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicide", focusPlayer: true, - suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"trap": 25, blindfold: -20}, allFloors: true, shrines: [], summonTags: ["blindfold"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "AnimStraitjacket", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["leatherTrap", "ignoreharmless", "construct", "poisonresist", "soulimmune", "melee", "jacketSpell", "minor", "chainresist", "doortrap", "flying"]), - ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_Jacket"], failAttackflag: ["FA_Jacket"], squeeze: true, ignoreStaminaForBinds: true, - Attack: { - mustBindorFail: true, - }, - visionRadius: 9, visionSummoned: 12, maxhp: 12, minLevel: 7, weight:0, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindSuicide", focusPlayer: true, - suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"trap": 20, "leatherRage": 5, jacket: -20}, allFloors: true, shrines: [], summonTags: ["jacket"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "Cuffs", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["metalTrap", "doortrap", "ignoreharmless", "construct", "poisonimmune", "soulimmune", "melee", "cuffsSpell", "minor", "chainresist", "meleeresist", "glueweakness", "iceweakness", "flying"]), ignorechance: 0.75, - armor: 1, followRange: 1, AI: "hunt", ignoreflag: ["FA_Cuffs"], failAttackflag: ["FA_Cuffs"], squeeze: true, ignoreStaminaForBinds: true, - Attack: { - mustBindorFail: true, - }, - specialCD: 8, specialAttack: "Dash", specialRemove: "BindSuicide", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.5, specialMinrange: 1.5, dashThrough: true, specialsfx: "Miss", - visionRadius: 4, visionSummoned: 12, maxhp: 2, minLevel: 0, weight:0, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicide", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "charm", fullBoundBonus: 1, - terrainTags: {"doortrap": 6, "trap": 50, cuffs: -40}, allFloors: true, shrines: ["Metal"], summonTags: ["cuffs"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Chains", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "AnimChastity", arousalMode: true, faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["metalTrap", "ignoreharmless", "doortrap", "construct", "poisonimmune", "soulimmune", "melee", "chastitySpell", "minor", "chainresist", "meleeresist", "glueweakness", "iceweakness", "flying"]), ignorechance: 0.75, - armor: 2, followRange: 1, AI: "hunt", ignoreflag: ["FA_Chastity"], failAttackflag: ["FA_Chastity"], squeeze: true, ignoreStaminaForBinds: true, - Attack: { - mustBindorFail: true, - }, - visionRadius: 6, visionSummoned: 12, maxhp: 5, minLevel: 2, weight:0, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindSuicide", suicideOnAdd: true, attackWidth: 3, attackRange: 1, power: 2, dmgType: "charm", fullBoundBonus: 1, - terrainTags: {"doortrap": 6, "trap": 35, chastity: -25}, allFloors: true, shrines: ["Metal"], summonTagsMulti: ["chastity"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Chains", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "AnimYoke", arousalMode: true, faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["metalTrap", "ignoreharmless", "doortrap", "construct", "poisonimmune", "soulimmune", "melee", "yokeSpell", "minor", "chainresist", "meleeresist", "glueweakness", "iceweakness", "flying"]), ignorechance: 0.75, - armor: 2, followRange: 1, AI: "hunt", ignoreflag: ["FA_Yoke"], failAttackflag: ["FA_Yoke"], squeeze: true, ignoreStaminaForBinds: true, - Attack: { - mustBindorFail: true, - }, - visionRadius: 6, visionSummoned: 12, maxhp: 5, minLevel: 4, weight:0, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindSuicide", suicideOnAdd: true, attackWidth: 3, attackRange: 1, power: 2, dmgType: "charm", fullBoundBonus: 1, - terrainTags: {"doortrap": 6, "trap": 35, yoke: -30}, allFloors: true, shrines: ["Metal"], summonTags: ["yoke"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Chains", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "Lock", faction: "KinkyConstruct", clusterWith: "construct", color: "#bbbbbb", tags: KDMapInit(["metalTrap", "leatherTrap", "ignorenoSP", "lock", "construct", "poisonimmune", "soulimmune", "melee", "minor", "chainresist", "meleeresist", "glueweakness", "iceweakness", "doortrap", "flying"]), difficulty: 0.2, - ignorechance: 0.75, armor: 1, followRange: 1, AI: "hunt", ignoreflag: ["FA_Lock"], failAttackflag: ["FA_Lock"], squeeze: true, suicideOnLock: true, - Attack: { - mustBindorFail: true, - }, - specialCD: 8, specialAttack: "MeleeDash", specialRemove: "SuicideMeleeBindLockWill", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.5, specialMinrange: 1.5, dashThrough: true, specialsfx: "Miss", - visionRadius: 3, visionSummoned: 12, maxhp: 4, minLevel: 2, weight:0, movePoints: 1, attackPoints: 3, attack: "SuicideMeleeBindLockWill", attackWidth: 3, tilesMinRange: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"secondhalf":1, "lastthird":1, "doortrap": 5, "trap": 100}, allFloors: true, shrines: ["Metal"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Chains", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "Feathers", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["ignorenoSP", "construct", "poisonresist", "soulimmune", "melee", "chainRestraints", "minor", "firesevereweakness", "meleeresist", "doortrap", "flying"]), ignorechance: 0.75, armor: -1, followRange: 1, AI: "hunt", ignoreflag: ["feathers"], failAttackflag: ["feathers"], squeeze: true, - visionRadius: 5, visionSummoned: 12, maxhp: 3, minLevel: 0, weight:-2, movePoints: 2, attackPoints: 2, attack: "MeleeWill", attackWidth: 3, tilesMinRange: 1, attackRange: 1, power: 1, dmgType: "tickle", ondeath: [{type: "spellOnSelf", spell: "Feathers"}], - terrainTags: {"secondhalf":2, "lastthird":-1, "increasingLevel": -1.5, "doortrap": 8}, allFloors: true, shrines: [], difficulty: 0.7, hitsfx: "Tickle",}, - {name: "Scarves", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["ignoreharmless", "construct", "poisonresist", "soulimmune", "melee", "scarfRestraints", "minor", "firesevereweakness", "acidweakness", "slashweakness", "meleeresist", "doortrap"]), ignorechance: 0.75, armor: 0, followRange: 1, AI: "hunt", ignoreflag: ["scarves"], failAttackflag: ["scarves"], squeeze: true, - visionRadius: 3, visionSummoned: 12, maxhp: 1, minLevel: 0, maxLevel: 3, weight:1, movePoints: 1.5, attackPoints: 2, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "tickle", fullBoundBonus: 1, - Attack: { - mustBindorFail: true, - }, - terrainTags: {"secondhalf":-1, "lastthird":-2, "increasingLevel": -2, "doortrap": 6, "ribbon": 3}, allFloors: true, shrines: [], difficulty: 0.4}, - {name: "Ribbons", faction: "KinkyConstruct", color: "#f135a4", clusterWith: "dressmaker", tags: KDMapInit(["ropeTrap", "ignoreharmless", "construct", "poisonresist", "ribbon", "soulimmune", "melee", "magicRibbons", "minor", "fireweakness", "acidweakness", "slashweakness", "meleeresist", "doortrap", "flying"]), ignorechance: 0.75, armor: 0, followRange: 1, AI: "hunt", ignoreflag: ["ribbons"], failAttackflag: ["ribbons"], squeeze: true, - visionRadius:5, visionSummoned: 12, maxhp: 6, minLevel: 0, weight:0, movePoints: 1.25, attackPoints: 3, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "chain", fullBoundBonus: 1, - Attack: { - mustBindorFail: true, - }, - terrainTags: { "dressmaker": 7, "conjureAnger": 4, "ribbon": 3}, allFloors: true, shrines: ["Conjure", "Rope"], difficulty: 0.2, ondeath: [{type: "spellOnSelf", spell: "RibbonBurst"}]}, - {name: "RopeSnake", faction: "KinkyConstruct", clusterWith: "construct", color: "#ffae70", tags: KDMapInit(["ropeTrap", "ignoreharmless", "construct", "poisonresist", "soulimmune", "melee", "ropeRestraints", "minor", "fireweakness", "slashweakness", "chainresist", "doortrap"]), ignorechance: 0.75, followRange: 1, AI: "wander", squeeze: true, - ignoreflag: ["ropesnake"], failAttackflag: ["ropesnake"], - Attack: { - mustBindorFail: true, - }, - visionRadius: 3, maxhp: 4, minLevel: 0, weight:3, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"increasingWeight":-3, "trap": 40}, allFloors: true, shrines: ["Rope"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Ropes", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "UnforseenRope", faction: "KinkyConstruct", clusterWith: "construct", color: "#ffae70", tags: KDMapInit(["ignoreharmless", "construct", "poisonresist", "soulimmune", "melee", "ropeRestraints", "ropeRestraints2", "minor", "fireweakness", "slashweakness", "chainresist", "search"]), ignorechance: 0.75, followRange: 1, AI: "hunt", stealth: 2.5, squeeze: true, - ignoreflag: ["ropesnake"], failAttackflag: ["ropesnake"], - visionRadius: 10, blindSight: 8, maxhp: 4, minLevel: 0, weight:0, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"secondhalf":1, "lastthird":3, "trap": 20}, allFloors: true, shrines: ["Rope"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Ropes", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "LearnedRope", faction: "KinkyConstruct", clusterWith: "construct", color: "#ffae70", tags: KDMapInit(["ignoreharmless", "construct", "poisonresist", "soulimmune", "melee", "ropeRestraints", "ropeRestraints2", "fireweakness", "slashweakness", "chainresist", "search"]), ignorechance: 0.75, followRange: 1, AI: "hunt", squeeze: true, disarm: 0.5, - ignoreflag: ["ropesnake"], failAttackflag: ["ropesnake"], - Attack: { - mustBindorFail: true, - }, - specialCD: 8, specialAttack: "Dash", specialRemove: "BindSuicide", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.5, specialMinrange: 1.5, dashThrough: true, specialsfx: "Miss", - visionRadius: 5, maxhp: 8, minLevel: 2, weight:1, movePoints: 1, attackPoints: 3, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 2.5, power: 2, multiBind: 2, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"trap": 30}, allFloors: true, shrines: ["Rope"], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Ropes", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - {name: "MonsterRope", faction: "KinkyConstruct", clusterWith: "construct", color: "#ffae70", tags: KDMapInit(["ropeTrap", "ignoreharmless", "doortrap", "construct", "poisonresist", "soulimmune", "melee", "unstoppable", "ropeRestraintsHogtie", "ropeRestraints", "ropeRestraints2", "elite", "fireweakness", "slashweakness", "chainresist", "hunter"]), ignorechance: 0.75, followRange: 1, AI: "guard", - ignoreflag: ["ropesnake"], failAttackflag: ["ropesnake"], disarm: 0.5, ignoreStaminaForBinds: true, - visionRadius: 6, maxhp: 20, minLevel: 3, weight:0, movePoints: 3, attackPoints: 3, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 3, attackRange: 1, power: 5, multiBind: 6, dmgType: "grope", fullBoundBonus: 6, - terrainTags: {"secondhalf":1, "lastthird":4, "increasingWeight":2, "trap": 20}, allFloors: true, shrines: ["Rope"], - ondeath: [ - {type: "summon", enemy: "RopeSnake", range: 2.5, count: 3, strict: true, lifetime: 30}, - {type: "summon", enemy: "LearnedRope", range: 2.5, count: 1, strict: true, lifetime: 30}, - ], - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Ropes", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - - {name: "ElementalRope", faction: "Elemental", playLine: "Elemental", clusterWith: "elemental", bound: "ElementalRope", squeeze: true, color: "#ffae70", - tags: KDMapInit(["opendoors", "elemental", "rope", "slashweakness", "melee", "chainresist", "coldweakness", "pierceresist", "crushresist", "jail", "jailer", "unarmedresist", "fireweakness", "ropeRestraints", "ropeRestraints2", "ballGagRestraints", "leashing", "search", "doortrap"]), - armor: 0, followRange: 1, AI: "hunt", - visionRadius: 6, maxhp: 15, minLevel:3, weight:-2, movePoints: 1.5, attackPoints: 3, attack: "MeleeBind", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 2.5, dmgType: "crush", fullBoundBonus: 2.5, - terrainTags: {"secondhalf":2, "thirdhalf":1, "ropeAnger": 4, "ropeRage": 4, "temple": 8, "doortrap": 4, "elemental": 3, "witch": 5, "rope": 4}, allFloors: true, shrines: ["Rope", "Elements"], - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10, noSummon: true}, {name: "Knife", ignoreInInventory: true, weight: 3, noSummon: true}], - events: [ - {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Ropes", time: 5, power: 1, chance: 0.5, aoe: 0.5}, - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Ropes", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - - {name: "ElementalLeather", faction: "Elemental", playLine: "Elemental", clusterWith: "elemental", bound: "ElementalLeather", squeeze: true, color: "#9999a0", - tags: KDMapInit(["opendoors", "elemental", "leather", "melee", "chainresist", "crushresist", "jail", "jailer", "leatherRestraints", "leatherRestraintsHeavy", "ballGagRestraints", "leashing", "search", "doortrap"]), - armor: 2, followRange: 1, AI: "hunt", guardChance: 0.6, kite: 1.5, - visionRadius: 6, maxhp: 12, minLevel:2, weight:-2, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindLock", attackWidth: 1, attackRange: 2.5, tilesMinRange: 1, power: 2.5, dmgType: "pain", fullBoundBonus: 2.5, projectileTargeting: true, - terrainTags: {"secondhalf":2, "thirdhalf":1, "leatherAnger": 4, "leatherRage": 4, "temple": 8, "doortrap": 5, "elemental": 3, "witch": 5, "leather": 4}, allFloors: true, shrines: ["Leather", "Elements"], - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10, noSummon: true}, {name: "EarthRune", weight: 2, noSummon: true}], - events: [ - {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Belts", time: 5, power: 1, chance: 0.5, aoe: 0.5}, - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, - ], - }, - - - {name: "RopeKraken", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["construct", "poisonresist", "soulimmune", "melee", "boss", "elite", "unflinching", "fireweakness", "slashweakness", "chainresist", "hunter"]), - Awareness: { - chaseradius: 15, - }, - ignorechance: 0.75, followRange: 1, AI: "hunt", summon: [{enemy: "RopeMinion", range: 2.5, count: 4, strict: true}], - spells: ["RopeEngulf", "SummonRopeTentacle"], spellCooldownMult: 1, spellCooldownMod: 0, ignoreflag: ["kraken"], disarm: 0.25, - visionRadius: 9, maxhp: 60, minLevel: 3, weight:-31, movePoints: 4, attackPoints: 2, attack: "Spell", attackWidth: 1, attackRange: 1, power: 6, dmgType: "chain", - terrainTags: {"secondhalf":12, "lastthird":5, "boss": -80, "open": 20, "passage": -60, "ropeAnger": 20, "ropeRage": 40, "increasingWeight":0.5}, allFloors: true, shrines: ["Rope"], - events: [ - {trigger: "passout", type: "delete", chance: 1.0}, // All rope krakens vanish after you pass outevents: [ - {trigger: "spellCast", type: "ropeKrakenSummonTentacle"}, // Drain HP when casting - ], - dropTable: [{name: "Scissors", ignoreInInventory: true, weight: 2}, {name: "Knife", ignoreInInventory: true, weight: 5}, {name: "EnchKnife", ignoreInInventory: true, weight: 2}, {name: "ElfCrystal", weight: 3}]}, - {name: "RopeMinion", faction: "KinkyConstruct", tags: KDMapInit(["construct", "poisonresist", "soulimmune", "melee", "fireweakness", "minor", "slashweakness", "chainresist", "krakententacle"]), ignorechance: 0.75, followRange: 1, AI: "hunt", master: {type: "RopeKraken", range: 4}, ignoreflag: ["kraken"], dependent: true, - visionRadius: 10, - Awareness: { - chaseradius: 15, - }, - maxhp: 8, minLevel: 0, weight:-1000, movePoints: 1.5, attackPoints: 2, attack: "MeleePullWill", attackWidth: 1, attackRange: 1, power: 3, dmgType: "crush", noAlert: true, - terrainTags: {}, allFloors: true, shrines: ["Rope"]}, - - - - - - {name: "SarcoKraken", faction: "KinkyConstruct", clusterWith: "construct", color: "#3b7d4f", tags: KDMapInit(["construct", "poisonresist", "soulimmune", "melee", "boss", "elite", "unflinching", "fireresist", "crushweakness", "chainweakness", "glueweakness", "hunter"]), - armor: 2.5, spellResist: 1.5, - ignorechance: 0.75, followRange: 1, AI: "hunt", summon: [{enemy: "SarcoMinion", range: 2.5, count: 3, strict: true}], - spells: ["SarcoHex", "SummonSarcoTentacle"], spellCooldownMult: 1, spellCooldownMod: 0, ignoreflag: ["kraken"], - events: [ - {trigger: "spellCast", type: "sarcoKrakenSummonTentacle"}, // Drain HP when casting - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "FabricGreen", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, - ], - visionRadius: 10, maxhp: 40, minLevel: 0, weight:-11, movePoints: 4, attackPoints: 3, attack: "SpellMeleePull", attackWidth: 1.5, attackMinRange: 1.5, attackRange: 6, power: 4, pullDist: 4, pullTowardSelf: true, dmgType: "charm", - terrainTags: {"secondhalf":16, "lastthird":5, "boss": -80, "open": 20, "passage": -60, "increasingWeight":1}, floors: KDMapInit(["tmb"]), shrines: [], - dropTable: [{name: "Gold", amountMin: 40, amountMax: 50, weight: 12}], - }, - {name: "SarcoMinion", faction: "KinkyConstruct", color: "#99ff99", tags: KDMapInit(["construct", "poisonresist", "soulimmune", "melee", "fireweakness", "minor", "slashweakness", "chainresist", "sarcotentacle", "mummyRestraints"]), - ignorechance: 0.75, followRange: 1, AI: "hunt", master: {type: "SarcoKraken", range: 7}, ignoreflag: ["kraken"], dependent: true, suicideOnAdd: true, - visionRadius: 10, maxhp: 5, minLevel: 0, weight:-1000, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicide", attackWidth: 1, attackRange: 1, power: 2, fullBoundBonus: 2, dmgType: "chain", noAlert: true, - events: [ - {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "FabricGreen", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, - ], - terrainTags: {}, allFloors: true, shrines: ["Rope"]}, - - - {name: "Dollsmith", faction: "Enemy", clusterWith: "smithdoll", bound: "FactoryDoll", playLine: "Robot", color: "#ff3388", - tags: KDMapInit(["leashing", "dollsmith", "doll", "opendoors", "closedoors", "jail", "jailer", "melee", "elite", "glueresist", "crushresist", "electricresist", "handcuffer", "iceweakness", "blacksteelrestraints", "blacksteelcuffs", "teasetoys"]), - spellResist: 1.0, - followLeashedOnly: true, followRange: 1, - spells: ["RubberBolt"], spellCooldownMult: 2, spellCooldownMod: 0, - Security: { - level_key: 3, - level_tech: 1, - }, - Behavior: { - thorough: 0.6, - ensurePlayerTagArousal: ["ChastityUpper", "ChastityLower"], - }, - RestraintFilter: { - bonusRestraints: 2, - requiredItems: ["BlacksteelBelt", "BlacksteelBra"], - }, - summon: [{enemy: "DollsmithDoll", range: 2.5, count: 1, strict: true}, {enemy: "DollsmithDoll", range: 2.5, count: 1, chance: 0.5, strict: true}], - specialCD: 6, specialAttack: "WillBind", specialRemove: "Lock", specialExtraTags: ["redLatexBasic"], specialRemoveTags: ["blacksteelrestraints", "blacksteelcuffs", "leashing", "teasetoys"], - specialAttackPoints: 2, specialWidth: 3, specialMsg: true, specialCondition: "canRestrainWithExtra", specialCDonAttack: true, specialIgnoreStam: true, - attackLock: "Red", - AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 14, minLevel:3, weight:15, movePoints: 2, - attackPoints: 2, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1.5, - terrainTags: {"increasingWeight":1, "dollsmith": 5}, floors:KDMapInit(["bel"]), shrines: ["Metal", "Latex"], - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}]}, - - {name: "Dollmaker", faction: "Enemy", clusterWith: "smithdoll", bound: "FactoryDoll", playLine: "Robot", color: "#ff88ff", - tags: KDMapInit(["leashing", "dollsmith", "doll", "opendoors", "closedoors", "jail", "jailer", "ranged", "miniboss", - "glueresist", "electricresist", "crushresist", "iceweakness", "blacksteelchastity", "latexEncase", "teasetoys"]), - spellResist: 1.5, - followLeashedOnly: true, followRange: 1.5, dontKiteWhenDisabled: true, kite: 4.5, noKiteWhenHarmless: true, - spells: ["RubberBolt", "EncaseBolt", "DollConvert", "DollBoost", "EnemyCM1"], - unlockCommandLevel: 2, unlockCommandCD: 30, spellCooldownMult: 1, spellCooldownMod: -1, buffallies: true, projectileTargeting: true, bypass: true, - Security: { - level_key: 3, - level_tech: 1, - }, - Behavior: { - thorough: 0.6, - ensurePlayerTagArousal: ["ChastityUpper", "ChastityLower"], - }, - RestraintFilter: { - bonusRestraints: 2, - requiredItems: ["BlacksteelBelt", "BlacksteelBra"], - }, - useLock: "Purple", - specialAttack: "WillBind", specialCD: 5, specialExtraTags: ["redLatexBasic"], specialRemoveTags: ["blacksteelchastity", "latexEncase", "leashing", "teasetoys"], - specialAttackPoints: 2, specialWidth: 3, specialMsg: true, specialCondition: "canRestrainWithExtra", specialCDonAttack: true, specialIgnoreStam: true, - AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 14, minLevel:5, weight:10, movePoints: 2.4, - attackPoints: 3, attack: "SpellMeleeBindWill", attackWidth: 1, attackRange: 1, power: 4, dmgType: "glue", - terrainTags: {"increasingWeight":1, "dollsmith": 5, "latexOptout": -9}, floors:KDMapInit(["bel"]), shrines: ["Metal", "Latex"], - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "StaffDoll", ignoreInInventory: true, weight: 100}, ]}, - - {name: "DollsmithDoll", faction: "Enemy", clusterWith: "dollsmith", bound: "EncasedFactoryDoll", playLine: "Gagged", color: "#ff3388", - tags: KDMapInit(["opendoors", "doll", "smithdoll", "submissive", "noshop", "gagged", "alwaysAlert", "imprisonable", "minor", "ignorenoSP", "melee", - "glueresist", "electricresist", "ticklesevereweakness", "chainresist", "charmweakness", "crushresist"]), - ignorechance: 0, armor: 0, spellResist: 1.0, followRange: 2, AI: "hunt", cohesion: 0.9, - master: {type: "Dollsmith", range: 2.5, loose: true, aggressive: true}, - sneakThreshold: 1, difficulty: 0.05, - ignoreflag: ["dollSmithDoll"], failAttackflag: ["dollSmithDoll"], - visionRadius: 7.5, maxhp: 8, minLevel:0, weight:-2, movePoints: 1.5, - attackPoints: 3, attack: "MeleeWillSlow", attackWidth: 3, attackRange: 1, power: 2, dmgType: "charm", - terrainTags: {"latexAnger": 3, "latexRage": 3, "metalAnger": 3, "metalRage": 3, "smithdoll": 40}, - shrines: ["Metal"], floors:KDMapInit(["bel"])}, - - - {name: "Rat", faction: "Beast", tags: KDMapInit(["ignorenoSP", "beast", "darkvision", "melee", "minor"]), followRange: 1, AI: "guard", squeeze: true, - visionRadius: 4, maxhp: 1, evasion: 0.5, minLevel:0, weight:8, movePoints: 1.5, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 1, dmgType: "pain", - terrainTags: {"rubble":20, "increasingWeight":-5}, floors:KDMapInit(["grv"])}, - {name: "Bat", faction: "Beast", tags: KDMapInit(["ignorenoSP", "beast", "darkvision", "melee", "minor", "chainresist", "flying"]), followRange: 1, AI: "guard", squeeze: true, ethereal: true, - visionRadius: 4, maxhp: 1, evasion: 0.5, minLevel:0, weight:4, movePoints: 1, attackPoints: 1, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 1, dmgType: "pain", - terrainTags: {"rubble":20, "increasingWeight":-5}, floors:KDMapInit(["jng"])}, - - {name: "Apprentice", faction: "Apprentice", color: "#9563ff", spellWhileParole: true, bound: "Apprentice", playLine: "Apprentice", - tags: KDMapInit(["leashing", "opendoors", "binding", "human", "closedoors", "apprentice", "ropeRestraints", "ranged", "glueweakness", "chainweakness", "tickleweakness", "search"]), followRange: 2, - castWhileMoving: true, spells: ["RopeEngulfWeak", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, cohesion: 1.0, followLeashedOnly: true, - spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 5, maxhp: 8, minLevel:2, weight:10, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"secondhalf":3, "lastthird":3, "increasingWeight": -1, "apprentice": 4, "rope": 4, "magical": 4}, allFloors: true, shrines: ["Elements"], - dropTable: [{name: "RedKey", weight: 1}, {name: "Nothing", weight: 29}]}, - {name: "Apprentice2", faction: "Apprentice", color: "#ff1616", bound: "Apprentice2", playLine: "Apprentice", - tags: KDMapInit(["leashing", "opendoors", "binding", "human", "conjurer", "latexRestraints", "ropeRestraints", "closedoors", "apprentice", "ranged", "glueweakness", "chainweakness", "tickleweakness", "search"]), followRange: 2, - castWhileMoving: true, spells: ["SummonSingleTickleHand", "SummonEnemyGag", "SummonLock", "SummonCuff", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, cohesion: 1.0, followLeashedOnly: true, - spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 5, maxhp: 8, minLevel:2, weight:6, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"secondhalf":3, "lastthird":3, "increasingWeight": -1, "apprentice": 4, "conjure": 4, "magical": 4}, allFloors: true, shrines: ["Conjure"], - dropTable: [{name: "RedKey", weight: 1}, {name: "Nothing", weight: 29}]}, - {name: "ApprenticeSlime", faction: "Apprentice", color: "#FF00FF", bound: "ApprenticeSlime", playLine: "Apprentice", tags: KDMapInit(["leashing", "opendoors", "binding", "human", "conjurer", "latexRestraints", "closedoors", "apprentice", "ranged", "glueweakness", "chainweakness", "tickleweakness", "search"]), followRange: 2, - castWhileMoving: true, spells: ["SlimePuddle", "ManySlimes", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, cohesion: 1.0, followLeashedOnly: true, - spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 5, maxhp: 8, minLevel:2, weight:8, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, - terrainTags: {"secondhalf":3, "lastthird":3, "increasingWeight": -1, "apprentice": 4, "slime": 4, "magical": 4}, allFloors: true, shrines: ["Latex"], - dropTable: [{name: "RedKey", weight: 1}, {name: "Nothing", weight: 29}]}, - - {name: "WitchRope", faction: "Witch", clusterWith: "apprentice", bound: "Witch", playLine: "Witch", tags: KDMapInit(["leashing", "guardCall", "jail", "jailer", "opendoors", "ropeRestraints", "closedoors", "human", "witch", "ranged", "elite", "hunter"]), followRange: 2, - castWhileMoving: true, spells: ["WitchRope", "RopeEngulfWeak", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, - spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 10, minLevel:0, weight:4, movePoints: 3, attackPoints: 2, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, - terrainTags: {"secondhalf":1, "lastthird":2, "increasingWeight": -1, "ropeAnger": 6, "tech": -6, "rope": 6}, allFloors: true, shrines: ["Rope"], followLeashedOnly: true, - dropTable: [{name: "Gold", amountMin: 5, amountMax: 15, weight: 14, noSummon: true}]}, - - {name: "WitchFlame", faction: "Witch", clusterWith: "elemental", bound: "WitchFlame", playLine: "Witch", color: "#d30000", tags: KDMapInit(["leashing", "guardCall", "jail", "jailer", "opendoors", "handcuffer", "fire", "closedoors", "human", "witch", "ranged", "elite", "unflinching", "fireimmune", "acidweakness", "iceweakness", "hunter"]), followRange: 2, - castWhileMoving: true, spells: ["HeatBolt", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, - spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 11, minLevel:0, weight:2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, - terrainTags: {"secondhalf":1, "lastthird":2, "elementsAnger": 6, "tech": -6, "fire": 4}, allFloors: true, shrines: [], followLeashedOnly: true, - events: [{trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ff8933"}], - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}], - }, - {name: "WitchIce", faction: "Witch", clusterWith: "elemental", bound: "WitchIce", playLine: "Witch", color: "#73efe8", tags: KDMapInit(["leashing", "guardCall", "jail", "jailer", "opendoors", "handcuffer", "ice", "closedoors", "human", "witch", "ranged", "elite", "unflinching", "crushweakness", "fireweakness", "acidresist", "iceresist", "stunresist", "slashresist", "hunter"]), followRange: 2, - castWhileMoving: true, spells: ["WitchIcebolt", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, - spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 11, minLevel:2, weight:2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, - terrainTags: {"secondhalf":1, "lastthird":2, "elementsAnger": 6, "tech": -6, "ice": 6, "water": 2}, allFloors: true, shrines: [], followLeashedOnly: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}], - }, - {name: "WitchEarth", faction: "Witch", clusterWith: "elemental", bound: "WitchEarth", playLine: "Witch", color: "#f8c53a", tags: KDMapInit(["leashing", "guardCall", "jail", "jailer", "opendoors", "handcuffer", "ice", "closedoors", "human", "witch", "ranged", "elite", "unflinching", "crushweakness", "acidweakness", "iceweakness", "fireresist", "hunter", "slashresist", "pierceresist", "shackleRestraints"]), followRange: 1, - castWhileMoving: true, spells: ["WitchBoulder", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, - spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.7, visionRadius: 7, maxhp: 14, minLevel:2, weight:2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, - terrainTags: {"secondhalf":1, "lastthird":2, "elementsAnger": 6, "tech": -6, "earth": 4}, allFloors: true, shrines: [], followLeashedOnly: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}], - }, - {name: "WitchWater", faction: "Witch", clusterWith: "elemental", bound: "WitchWater", playLine: "Witch", color: "#4572e3", tags: KDMapInit(["leashing", "guardCall", "jailer", "opendoors", "handcuffer", "ice", "closedoors", "human", "witch", "ranged", "elite", "unflinching", "fireresist", "acidimmune", "electricweakness", "pierceresist", "hunter", "latexRestraints"]), followRange: 1, - castWhileMoving: true, spells: ["WitchWaterBall", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, evasion: 0.25, - spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 11, minLevel:0, weight:2, movePoints: 3, attackPoints: 4, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, - terrainTags: {"secondhalf":1, "lastthird":2, "elementsAnger": 6, "tech": -6, "water": 6, "ice": 2}, allFloors: true, shrines: [], followLeashedOnly: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}], - }, - - - - {name: "WitchShock", faction: "Witch", clusterWith: "apprentice", bound: "Witch", playLine: "Witch", tags: KDMapInit(["leashing", "opendoors", "handcuffer", "electric", "jail", "jailer", "closedoors", "human", "witch", "ranged", "miniboss", "unflinching", "electricimmune", "glueweakness", "iceweakness", "hunter"]), followRange: 2, - castWhileMoving: true, spells: ["WitchElectrify", "WitchElectricOrb", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 12, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, - spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 15, minLevel:3, weight:2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, - terrainTags: {"secondhalf":2, "lastthird":1, "tech": -10, "electric": 6}, allFloors: true, shrines: [], followLeashedOnly: true, - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}], - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#8888ff"}, - {trigger: "afterEnemyTick", type: "electrifyLocal", power: 1, chance: 0.5, aoe: 1.5} - ], - }, - {name: "WitchMagnet", faction: "Witch", color: "#92e8c0", clusterWith: "apprentice", bound: "Witch", playLine: "Witch", tags: KDMapInit(["leashing", "opendoors", "magnetCuffs", "electric", "jailer", "closedoors", "human", "witch", "ranged", "miniboss", "unflinching", "electricimmune", "glueweakness", "iceweakness", "hunter"]), - castWhileMoving: true, spells: ["AreaElectrify", "WitchElectricOrb", "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 10, stopToCast: true, spellRdy: true, followRange: 1, - spellCooldownMult: 1, spellCooldownMod: -1, AI: "hunt", guardChance: 0.6, visionRadius: 8, maxhp: 24, minLevel:12, weight:1, movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLock", - attackWidth: 1, attackRange: 1, power: 1, dmgType: "electric", fullBoundBonus: 1, noLeashUnlessExhausted: true, - terrainTags: {"lastthird":1, "miniboss": -10, "tech": -10, "metalAnger": 4, "elementsAnger": 6, "increasingWeight": 0.5, "electric": 6}, allFloors: true, shrines: [], followLeashedOnly: true, - dropTable: [{name: "BlueKey", weight: 3}, {name: "ScrollArms", weight: 1}, {name: "ScrollVerbal", weight: 1}, {name: "ScrollLegs", weight: 1}], - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#8888ff"}, - {trigger: "afterEnemyTick", type: "electrifyLocal", power: 1, aoe: 1.5}, - ], - }, - {name: "WitchChain", faction: "Witch", clusterWith: "bandit", bound: "WitchChain", playLine: "Witch", color: "#AAAAAA", tags: KDMapInit(["leashing", "opendoors", "closedoors", "jail", "jailer", "chainRestraints", "human", "witch", "melee", "miniboss", "unflinching", "electricweakness", "crushweakness", "meleeresist", "fireweakness", "hunter"]), - followRange: 1, spells: ["WitchChainBolt", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 12, spellRdy: true, - spellCooldownMult: 2, spellCooldownMod: 2, AI: "hunt", guardChance: 0.6, visionRadius: 6, maxhp: 20, minLevel:3, weight:2, movePoints: 3, disarm: 0.33, - attackPoints: 3, attack: "MeleeLockAllBindSpell", attackWidth: 2.5, attackRange: 1, tilesMinRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 3, multiBind: 2, attackLock: "Red", - terrainTags: {"secondhalf":3, "lastthird":3, "tech": -10, "metal": 6}, allFloors: true, shrines: [], - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}]}, - {name: "WitchMetal", faction: "Witch", clusterWith: "bandit", bound: "WitchChain", playLine: "Witch", color: "#AAAAAA", tags: KDMapInit(["leashing", "opendoors", "closedoors", "jailer", "chainRestraints", "shackleRestraints", "handcuffer", "human", "witch", "melee", "elite", "miniboss", "unflinching", "electricweakness", "crushweakness", "meleeresist", "fireweakness", "hunter"]), - followRange: 1, spells: ["ManyChains", "SummonChainWalls", "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 10, spellRdy: true, - spellCooldownMult: 1, spellCooldownMod: 2, AI: "hunt", guardChance: 0.6, visionRadius: 6, maxhp: 30, minLevel:9, weight:1, movePoints: 3, disarm: 0.33, - attackPoints: 3, attack: "MeleeLockAllBindSpell", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 4, multiBind: 3, attackLock: "Purple", - terrainTags: {"lastthird":1, "miniboss": -10, "tech": -10, "metalAnger": 4, "metalFriendly": 6, "conjureAnger": 6, "increasingWeight": 0.5, "metal": 6}, allFloors: true, shrines: [], - dropTable: [{name: "BlueKey", weight: 3}, {name: "ScrollArms", weight: 1}, {name: "ScrollVerbal", weight: 1}, {name: "ScrollLegs", weight: 1}], - }, - {name: "WitchSlime", faction: "Witch", clusterWith: "slime", bound: "WitchSlime", playLine: "Witch", - tags: KDMapInit(["leashing", "slimewalk", "opendoors", "closedoors", "witch", "jail", "jailer", "ranged", "miniboss", - "unflinching", "slimeRestraints", "glueimmune", "meleeresist", "electricweakness", "iceweakness", "hunter"]), squeeze: true, - followLeashedOnly: true, kite: 1.5, kiteChance: 0.9, followRange: 4, castWhileMoving: true, - spells: ["ManySlimes", "ManySlimes", "WitchSlimeBall", "WitchSlime", "ManySlimes", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 12, stopToCast: true, spellRdy: true, - spellCooldownMult: 2, spellCooldownMod: -7, AI: "hunt", guardChance: 0.6, visionRadius: 8, maxhp: 13, minLevel:3, weight:2, movePoints: 3, attackPoints: 3, attack: "Spell", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, - attackLock: "Purple", - terrainTags: {"secondhalf":2, "lastthird":1, "open": 4, "tech": -8, "slime": 4}, allFloors: true, shrines: [], - events: [ - {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Slime", time: 12, power: 1, chance: 0.5, aoe: 0.5}, - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ff00ff"}, - ], - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}]}, - {name: "Necromancer", faction: "Enemy", clusterWith: "skeleton", bound: "Necromancer", playLine: "Necromancer", - tags: KDMapInit(["leashing", "guardCall", "opendoors", "jailer", "closedoors", "human", "witch", - "ranged", "miniboss", "unflinching", "meleeweakness", "hunter"]), followRange: 1, cohesion: 0.9, - spells: ["SummonSkeleton", "SummonSkeletons", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 16, spellCooldownMult: 1, spellCooldownMod: 2, spellRdy: true, - AI: "hunt", guardChance: 0.6, visionRadius: 6, maxhp: 20, minLevel: 2, weight:3, movePoints: 3, attackPoints: 3, attack: "MeleeLockAllWillSpellBind", attackWidth: 1, attackRange: 1, power: 5, dmgType: "grope", - terrainTags: {"secondhalf":3, "lastthird":3, "miniboss": -7, "tech": -20}, shrines: [], floors:KDMapInit(["cat", "jng", "tmb", "tmp"]), attackLock: "Purple", - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}]}, - - {name: "HighWizard", clusterWith: "mushroom", bound: "HighWizard", faction: "Mushy", playLine: "Witch", color: "#a583ff", tags: KDMapInit(["leashing", "mushy", "opendoors", "closedoors", "human", "ranged", "unflinching", "hunter"]), squeeze: true, - followLeashedOnly: true, kite: 1.5, kiteChance: 0.9, followRange: 4, castWhileMoving: true, spells: ["HighBolt", "Spores", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 12, stopToCast: true, spellRdy: true, - spellCooldownMult: 2, spellCooldownMod: 1, AI: "hunt", guardChance: 0.6, visionRadius: 6, maxhp: 13, minLevel:4, weight:12, movePoints: 2, attackPoints: 2, attack: "Spell", attackWidth: 1, attackRange: 1, power: 1, dmgType: "tickle", fullBoundBonus: 1, - terrainTags: {"secondhalf":2, "lastthird":1, "open": 4, "mushy": 5}, floors:KDMapInit(["cry"]), shrines: [], - dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 9}]}, - {name: "Fungal", clusterWith: "mushroom", bound: "HighWizard", faction: "Mushy", playLine: "Fungal", color: "#a583ff", tags: KDMapInit(["leashing", "guardCall", "mushy", "jail", "jailer", "opendoors", "closedoors", "mushroom", "ranged", "unflinching", "hunter"]), squeeze: true, - followLeashedOnly: true, kite: 1.5, kiteChance: 0.9, followRange: 4, castWhileMoving: true, spells: ["HighBolt", "CrystalPuff", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#892fcc"}, - ], - spellCooldownMult: 1, spellCooldownMod: 1, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 8, regen: 0.1, minLevel:3, weight:12, movePoints: 3, attackPoints: 3, attack: "SpellMeleeWillLockAll", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, - attackLock: "Purple", - terrainTags: {"secondhalf":2, "lastthird":1, "open": 4, "mushroom": 4, "mushy": 5}, floors:KDMapInit(["cry"]), shrines: [], - dropTable: [{name: "Gold", amountMin: 5, amountMax: 0, weight: 8}]}, - - - {name: "Dressmaker", clusterWith: "construct", bound: "Dressmaker", playLine: "Dressmaker", faction: "Dressmaker", color: "#f135a4", tags: KDMapInit(["leashing", "dressmaker", "guardCall", "jail", "jailer", "conjurer", "acidweakness", "opendoors", "closedoors", "human", "ranged", "unflinching", "hunter", "dressRestraints"]), - RestraintFilter: { - requiredItems: ["BindingDress"], - }, - followLeashedOnly: true, kite: 1.5, kiteChance: 0.3, followRange: 4, castWhileMoving: true, spells: ["Ribbons", "Ribbons", "Ribbons", "RibbonBurst", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, stopToCast: true, spellRdy: true, noKiteWhenHarmless: true, noSpellsWhenHarmless: true, - spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 13, minLevel:0, weight:-6, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", projectileTargeting: true, - attackWidth: 1, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 3, focusPlayer: true, attackLock: "Purple", - terrainTags: {"secondhalf":2, "lastthird":1, "open": 4, "dressmaker": 20, "conjureAnger": 5, "conjureRage": 4, "ropeAnger": 3, "ropeRage": 2}, allFloors: true, shrines: ["Conjure", "Rope"], - dropTable: [{name: "Gold", amountMin: 5, amountMax: 15, weight: 14, noSummon: true}]}, - {name: "Nurse", clusterWith: "construct", bound: "Dressmaker", playLine: "Nurse", faction: "Dressmaker", color: "#f135a4", tags: KDMapInit(["leashing", "guardCall", "genericJailer", "dressmaker", "jail", "jailer", "conjurer", "acidweakness", "opendoors", "closedoors", "human", "ranged", "unflinching", "hunter", "nurseRestraints"]), - followLeashedOnly: true, kite: 1.5, kiteChance: 0.3, followRange: 4, castWhileMoving: true, spells: ["NurseBola", "NurseSyringe"], miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", stopToCast: true, spellRdy: true, noKiteWhenHarmless: true, noSpellsWhenHarmless: true, dontKiteWhenDisabled: true, - spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 13, minLevel:0, weight:-40, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindWillLock", projectileTargeting: true, - attackWidth: 1, attackRange: 1, power: 3, dmgType: "charm", fullBoundBonus: 3, focusPlayer: true, attackLock: "Red", - terrainTags: {"secondhalf":2, "lastthird":1, "jailGuard": 50, "Guard": 50, "willAnger": 49, "willRage": 4, "ropeAnger": 3, "ropeRage": 2, "dressmaker": 50, "NoNurse": -10000}, allFloors: true, shrines: ["Will", "Rope"], - events: [ - {trigger: "afterEnemyTick", type: "nurseAura", power: 0.1, dist: 2.59}, - ], - dropTable: [{name: "Gold", amountMin: 5, amountMax: 15, weight: 14, noSummon: true}]}, - - - - {name: "Librarian", clusterWith: "construct", bound: "Dressmaker", playLine: "Librarian", faction: "Dressmaker", color: "#f135a4", - tags: KDMapInit(["leashing", "dressmaker", "miniboss", "jailer", "acidweakness", "conjurer", "opendoors", "closedoors", "human", "ranged", "unflinching", "hunter", "lowWeightRibbons", "magicRibbonsHarsh", "gagSpell", "mittensSpell"]), - followLeashedOnly: true, kite: 1.5, kiteChance: 0.3, followRange: 4, castWhileMoving: true, spells: [ - "SummonBookChain", - "SummonBookSlime", - "SummonBookIce", - "SummonBookNature", - "SummonBookForbidden", - "SummonBookArcane", - "SummonBookCelestial", - "SummonBookElectric", - "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 12, stopToCast: true, spellRdy: true, noKiteWhenHarmless: true, noSpellsWhenHarmless: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffffff"}, - ], - spellCooldownMult: 0.7, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 8, spellResist: 0.35, minLevel:0, weight: -12, movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLockAll", projectileAttack: true, - attackWidth: 1, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 3, focusPlayer: true, attackLock: "Purple", - terrainTags: {"secondhalf":2, "lastthird":1, "open": 10, "miniboss": -5, "dressmaker": 12, "elementsAnger": 7, "elementsRage": 5}, allFloors: true, shrines: ["Conjure", "Elements"], - dropTable: [{name: "ScrollArms", weight: 2}, {name: "ScrollVerbal", weight: 2}, {name: "ScrollLegs", weight: 2}, {name: "ScrollPurity", weight: 1}]}, - - {name: "MummyCursed", bound: "MummyCursed", nopickpocket: true, color: "#55ff55", playLine: "GaggedMummy", faction: "Bast", tags: KDMapInit(["mimicBlock", "gagged", "removeDoorSpawn", "ignoreharmless", "darkvision", "mummy", "melee", "elite", "mummyRestraints", "coldresist", "fireweakness", "meleeweakness", "charmweakness"]), - evasion: -0.25, ignorechance: 1.0, armor: 0, followRange: 1, AI: "ambush", difficulty: 0.05, guardChance: 0, - visionRadius: 10, ambushRadius: 2.01, blindSight: 10, maxhp: 12, minLevel:0, weight:5, movePoints: 1, attackPoints: 2, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 2, dmgType: "charm", fullBoundBonus: 1, - terrainTags: {"secondhalf":5, "lastthird":5, "door": 50}, floors:KDMapInit(["tmb"]), shrines: ["Will"], - dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 25}]}, - - - {name: "Mummy", clusterWith: "mummy", nopickpocket: true, bound: "Mummy", faction: "Bast", color: "#55ff55", tags: KDMapInit(["leashing", "religious", "darkvision", "opendoors", "closedoors", "jail", "jailer", "mummy", "melee", "elite", "mummyRestraints", "coldresist", "fireweakness", "meleeweakness", "hunter"]), followLeashedOnly: true, followRange: 1, - spells: ["MummyBolt", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, specialCD: 3, specialAttack: "BindLock", playLine: "Mummy", spellCooldownMult: 1, spellCooldownMod: 5, specialAttackPoints: 2, specialWidth: 3, spellRdy: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3, color: "#00ff00"}, - ], - attackLock: "Purple", - AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 8, minLevel:3, weight:18, movePoints: 2, attackPoints: 1, attack: "SpellMeleeWill", attackWidth: 1, attackRange: 1, power: 2, fullBoundBonus: 1, dmgType: "crush", - terrainTags: {"secondhalf":2, "lastthird":4, "open": 2, "increasingWeight":1, "mummy": 4}, floors:KDMapInit(["tmb"]), shrines: ["Will"], dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}]}, - {name: "Cleric", clusterWith: "mummy", bound: "Cleric", faction: "Bast", playLine: "Mummy", color: "#00FF00", tags: KDMapInit(["leashing", "religious", "opendoors", "closedoors", "mummy", "ranged", "search", "coldresist", "fireweakness"]), - followLeashedOnly: true, followRange: 4, attackThruBars: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#00ff00"}, - ], - spells: ["ClericBeam", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, kite: 1.5, kiteChance: 0.9, - attackPoints: 3, attack: "Spell", attackWidth: 1, attackRange: 1, power: 3, dmgType: "fire", - AI: "guard", visionRadius: 7, maxhp: 8, minLevel:0, weight:13, movePoints: 1.5, fullBoundBonus: 1, - terrainTags: {"secondhalf":0, "lastthird":1, "passage": -99, "open": 4, "mummy": 5}, floors:KDMapInit(["tmb"]), shrines: ["Will"], dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 12}]}, - {name: "MeleeCleric", clusterWith: "mummy", bound: "MeleeCleric", playLine: "Mummy", faction: "Bast", tags: KDMapInit(["leashing", "darkvision", "opendoors", "closedoors", "mummy", "melee", "kittyRestraints", "jail", "jailer", "search", "coldresist", "fireweakness"]), - followRange: 1, blindSight: 2.5, specialCD: 5, specialAttack: "BindLock", - AI: "hunt", guardChance: 0.6, visionRadius: 6, maxhp: 8, minLevel:0, weight:15, movePoints: 1.5, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 2, fullBoundBonus: 2, dmgType: "grope", - terrainTags: {"secondhalf":0, "lastthird":-2, "mummy": 6}, floors:KDMapInit(["tmb"]), shrines: ["Will"], dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 12}]}, - - {name: "Jailer", faction: "Jail", bound: "Jailer", tags: KDMapInit(["leashing", "opendoors", "closedoors", "jail", "jailer", "genericJailer", "melee", "shackleRestraints", "guardCall", "jailRestraints"]), keys: true, followRange: 1, AI: "patrol", - visionRadius: 6, maxhp: 12, minLevel: -1, weight:0, movePoints: 1, attackPoints: 3, attack: "MeleeBindLockWill", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"jailGuard": 15, "Guard": 1}, allFloors: true, disarm: 0.5, evasion: -0.5, focusPlayer: true, - dropTable: [{name: "Pick", weight: 15}, {name: "RedKey", weight: 5}], rep: {"Prisoner": 5}}, - {name: "Guard", faction: "Jail", bound: "Guard", tags: KDMapInit(["leashing", "opendoors", "closedoors", "miniboss", "jail", "jailer", "melee", "shackleRestraints", "jailRestraints", "guardCall"]), noDisplace: true, keys: true, followRange: 1, AI: "guard", visionRadius: 6, disarm: 0.5, - maxhp: 12, minLevel: -1, weight:-1000, movePoints: 1, attackPoints: 3, attack: "MeleeBindLockWill", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, evasion: -0.5, focusPlayer: true, attackLock: "Red", - RemoteControl: { - punishRemote: 3, - punishRemoteChance: 0.15, - }, - events: [ - {trigger: "defeat", type: "delete", chance: 1.0}, - ], - terrainTags: {"Guard": 1010}, allFloors: true, dropTable: [{name: "RedKey", weight: 1}], rep: {"Prisoner": 10}}, - {name: "GuardHeavy", faction: "Jail", bound: "GuardHeavy", tags: KDMapInit(["leashing", "opendoors", "closedoors", "jail", "jailer", "melee", "unflinching", "hunter", "guardCall", "miniboss", "shackleRestraints", "handcuffer", "jailRestraints"]), noDisplace: true, disarm: 0.5, - keys: true, followRange: 1, AI: "guard", visionRadius: 7, maxhp: 12, minLevel: 4, weight:-20, movePoints: 1, attackPoints: 2, evasion: -0.5, focusPlayer: true, - attack: "MeleeBindLockWillStun", attackWidth: 3, attackRange: 1, power: 5, dmgType: "electric", stunTime: 1, attackLock: "Red", - RemoteControl: { - punishRemote: 4, - punishRemoteChance: 0.2, - }, - events: [ - {trigger: "defeat", type: "delete", chance: 1.0}, - ], - terrainTags: {"jailGuard": 22, "increasingWeight": 1, "jailbreak": 28}, allFloors: true, dropTable: [{name: "RedKey", weight: 1}], rep: {"Prisoner": 10}}, - - - // Minibosses - {name: "BanditMerchant", faction: "Bandit", clusterWith: "bandit", playLine: "Bandit", bound: "BanditChief", - tags: KDMapInit([ - "opendoors", "cacheguard", "closedoors", "leashing", "bandit", "banditleader", - "boss", "melee", "ranged", "caster", - "ballGagRestraints", "banditMagicRestraints","leatherRestraints", "leatherRestraintsHeavy", "chainweakness", "glueweakness", "jailer", "hunter" - ]), cohesion: 0.9, armor: 0, followRange: 1, AI: "hunt", - spells: ["PoisonDagger", "BearTrap", "LustBomb"], spellCooldownMult: 1, spellCooldownMod: 0, noSpellLeashing: true, - summon: [ - {enemy: "BanditPet", range: 3, count: 2, chance: 1.0, strict: true},], - visionRadius: 8, maxhp: 30, minLevel:3, weight:-20, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3.6, attackRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 2, - terrainTags: {"boss": -5, "open": 10, "increasingWeight":1, "BanditEnemy": 11, "BanditWanted": 3, "BanditHated": 4}, shrines: ["Leather"], allFloors: true, - factionrep: {"Bountyhunter": 0.02}, - dropTable: [{name: "Gold", amountMin: 80, amountMax: 100, weight: 10}]}, - - - - // Bosses - {name: "Fuuka1", playLine: "Fuuka", bound: "TalismanZombie", faction: "Boss", clusterWith: "zombie", tags: KDMapInit(["nosub", "leashing", "noshop", "zombie", "ranged", "mikoRestraints", "stageBoss", "boss", "nocapture", "unflinching"]), - armor: 0, followRange: 3, AI: "guard", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ffffff"}, - ], - RestraintFilter: { - unlimitedRestraints: true, - }, - unlockCommandLevel: 3, unlockCommandCD: 7, - spells: ["ZombieOrb", "ManyOrbs", "SummonZombies", "EnemyCM_self"], spellCooldownMult: 0.25, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, kite: 1.5, projectileAttack: true, accuracy: 0.7, noChannel: true, - visionRadius: 8, maxhp: 80, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3, attackRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 4, - terrainTags: {}, floors:KDMapInit([]), dropTable: [{name: "Scrolls", weight: 10}], ondeath: [{type: "dialogue", dialogue:"FuukaStage2", click: true}]}, - {name: "Fuuka2", playLine: "Fuuka", bound: "TalismanZombie", faction: "Boss", clusterWith: "zombie", tags: KDMapInit(["nosub", "leashing", "zombie", "ranged", "mikoRestraints", "stageBoss", "boss", "nocapture", "unflinching"]), - armor: 0, followRange: 1, AI: "hunt", - RestraintFilter: { - unlimitedRestraints: true, - }, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 7, color: "#ffffff"}, - ], - unlockCommandLevel: 3, unlockCommandCD: 7, - spells: ["ZombieOrb", "ManyOrbs", "SummonMikoGhosts", "SummonZombies", "EnemyCM_self"], spellCooldownMult: 0.25, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, projectileAttack: true, accuracy: 0.85, noChannel: true, - visionRadius: 12, maxhp: 45, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3, attackRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 4, - terrainTags: {}, floors:KDMapInit([]), dropTable: [{name: "BlueKey", weight: 10}], ondeath: [{type: "dialogue", dialogue:"FuukaWin", click: true}]}, - - {name: "MikoGhost", faction: "Ghost", color: "#FFFFFF", clusterWith: "ghost", tags: KDMapInit(["ignorenoSP", "ghost", "melee", "glueimmune", "chainimmune", "temporary"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", - specialCD: 7, specialAttack: "Slow", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ffffff"}, - ], - visionRadius: 30, blindSight: 30, evasion: 9.0, alwaysEvade: true, maxhp: 1, regen: -0.051, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 1, attack: "MeleeWill", attackWidth: 3, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 0, - terrainTags: {}, shrines: ["Illusion"], floors:KDMapInit([]), dropTable: [{name: "Ectoplasm", chance: 0.6, weight: 10}],}, - - {name: "DollmakerBoss1", playLine: "Dollmaker", bound: "DollmakerBoss", faction: "Boss", clusterWith: "dollsmith", - tags: KDMapInit(["nosub", "leashing", "noshop", "dollsmith", "ranged", - "glueresist", "electricresist", "crushresist", "iceweakness", "dollmakerrestraints", "controlharness", "cyberdollchastity", "teasetoys", "stageBoss", "boss", "nocapture", "unstoppable"]), - spellResist: 2.0, armor: 0.5, followRange: 1.5, AI: "guard", kite: 4.5, noKiteWhenHarmless: true, dontKiteWhenDisabled: true, - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ff88ff"}, - {trigger: "afterEnemyTick", type: "dollmakerMissiles", count: 2, time: 8, dist: 10, kind: "RubberMissile"}, - ], - RestraintFilter: { - unlimitedRestraints: true, - }, - unlockCommandLevel: 3, unlockCommandCD: 14, - spells: ["SummonDrones", "DollConvertMany", "DollBoost", "EnemyCM_self"], - spellCooldownMult: 0.25, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, projectileAttack: true, accuracy: 0.7, noChannel: true, - visionRadius: 9, maxhp: 70, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLockAll", attackWidth: 3, attackRange: 1, power: 4, dmgType: "soul", fullBoundBonus: 4, - terrainTags: {}, floors:KDMapInit([]), - ondeath: [{type: "dialogue", dialogue:"DollmakerStage2", click: true}]}, - - - {name: "DollmakerBoss2", playLine: "Dollmaker", bound: "DollmakerBoss", faction: "Boss", clusterWith: "dollsmith", - tags: KDMapInit(["nosub", "leashing", "noshop", "dollsmith", "ranged", - "glueresist", "electricresist", "crushresist", "iceweakness", "dollmakerrestraints", "cyberdollchastity", "cyberdollrestraints", "controlharness", "teasetoys", "stageBoss", "boss", "nocapture", "unstoppable"]), - spellResist: 2.0, armor: 0.5, followRange: 5.5, AI: "guard", - events: [ - {trigger: "tick", type: "suicideWhenBound"}, - {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ff88ff"}, - {trigger: "afterEnemyTick", type: "dollmakerMissiles", count: 2, time: 15, dist: 10, kind: "RubberNuke"}, - ], - RestraintFilter: { - unlimitedRestraints: true, - }, - unlockCommandLevel: 3, unlockCommandCD: 14, - spells: ["SummonCaptureDrones", "DollConvertMany", "DollBoost", "EnemyCM_self"], - spellCooldownMult: 0.15, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, kite: 2.5, accuracy: 0.85, noChannel: true, - visionRadius: 20, blindSight: 7, maxhp: 60, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLockAll", attackWidth: 3, attackRange: 1, power: 4, dmgType: "soul", fullBoundBonus: 4, - terrainTags: {}, floors:KDMapInit([]), - ondeath: [{type: "dialogue", dialogue:"DollmakerStage3", click: true}]}, - - {name: "DollmakerBoss3", playLine: "Dollmaker", bound: "DollmakerBoss", faction: "Boss", clusterWith: "dollsmith", - tags: KDMapInit(["nosub", "leashing", "noshop", "dollsmith", "ranged", - "glueresist", "electricresist", "crushresist", "iceweakness", "dollmakerrestraints", "cyberdollchastity", "cyberdollrestraints", "cyberdollheavy", "controlharness", "teasetoys", "stageBoss", "boss", "nocapture", "unstoppable"]), - spellResist: 2.0, armor: 0.5, followRange: 1.5, AI: "guard", - events: [ - {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ff88ff"}, - {trigger: "afterEnemyTick", type: "dollmakerMissiles", count: 2, time: 9, dist: 10, kind: "RubberNuke"}, - ], - RestraintFilter: { - unlimitedRestraints: true, - }, - unlockCommandLevel: 3, unlockCommandCD: 14, - spells: ["DollConvertMany", "DollBoost", "EnemyCM_self", "ManyCables"], - spellCooldownMult: 0.2, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, projectileAttack: true, accuracy: 1.15, noChannel: true, - visionRadius: 30, blindSight: 30, maxhp: 140, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLockAll", attackWidth: 3, attackRange: 1, power: 4, dmgType: "soul", fullBoundBonus: 4, - terrainTags: {}, floors:KDMapInit([]), - ondeath: [{type: "dialogue", dialogue:"DollmakerWin", click: true}]}, - -]; - - -let KDOndeath = { - "summon": (enemy, o) => { - KinkyDungeonSummonEnemy(enemy.x, enemy.y, o.enemy, o.count, o.range, o.strict, o.lifetime, o.hidden, undefined, o.faction || KDGetFaction(enemy), o.hostile, o.minradius, o.startAware, undefined, o.hideTimer); - }, - "dialogue": (enemy, o) => { - KDStartDialog(o.dialogue, enemy.Enemy.name, o.click, enemy.personality, enemy); - }, - "spellOnSelf": (enemy, o) => { - let spell = KinkyDungeonFindSpell(o.spell, true); - if (spell) KinkyDungeonCastSpell(enemy.x, enemy.y, spell, undefined, undefined, undefined, KDGetFaction(enemy)); - }, - "removeQuest": (enemy, o) => { - KDRemoveQuest(o.quest); - }, - "dollID": (enemy, o) => { - if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 9) { - if (!KinkyDungeonFlags.get("gotDollID")) { - let dropped = {x:enemy.x, y:enemy.y, name: "DollID"}; - KinkyDungeonGroundItems.push(dropped); - KinkyDungeonSetFlag("gotDollID", -1, 1); - } - } - }, - "addQuest": (enemy, o) => { - KDAddQuest(o.quest); - }, -}; - -/** - * @type {Record} - */ -let KDAIType = { - "wander": { - init: (enemy, player, AIData) => {}, - beforemove: (enemy, player, AIData) => {return false;}, - chase: (enemy, player, AIData) => {return false;}, - persist: (enemy, player, AIData) => {return false;}, - move: (enemy, player, AIData) => {return true;}, - follower: (enemy, player, AIData) => {return true;}, - followsound: (enemy, player, AIData) => {return true;}, - wander_near: (enemy, player, AIData) => {return true;}, - wander_far: (enemy, player, AIData) => {return KDRandom() < 0.2;}, - resetguardposition: (enemy, player, AIData) => {return false;}, - attack: (enemy, player, AIData) => {return true;}, - spell: (enemy, player, AIData) => {return true;}, - aftermove: (enemy, player, AIData) => {return false;}, - wanderDelay_long: (enemy, AIData) => {return 35 + Math.floor(KDRandom() * 35);}, - wanderDelay_short: (enemy, AIData) => {return 10 + Math.floor(KDRandom() * 25);}, - }, - "hunt": { - init: (enemy, player, AIData) => {}, - beforemove: (enemy, player, AIData) => {return false;}, - chase: (enemy, player, AIData) => {return true;}, - persist: (enemy, player, AIData) => {return true;}, - move: (enemy, player, AIData) => {return true;}, - follower: (enemy, player, AIData) => {return true;}, - followsound: (enemy, player, AIData) => {return true;}, - wander_near: (enemy, player, AIData) => {return true;}, - wander_far: (enemy, player, AIData) => {return KDRandom() < 0.2;}, - resetguardposition: (enemy, player, AIData) => {return false;}, - attack: (enemy, player, AIData) => {return true;}, - spell: (enemy, player, AIData) => {return true;}, - aftermove: (enemy, player, AIData) => {return false;}, - wanderDelay_long: (enemy, AIData) => {return 35 + Math.floor(KDRandom() * 35);}, - wanderDelay_short: (enemy, AIData) => {return 10 + Math.floor(KDRandom() * 25);}, - }, - "huntshadow": { - init: (enemy, player, AIData) => {}, - beforemove: (enemy, player, AIData) => {return false;}, - chase: (enemy, player, AIData) => {return true;}, - persist: (enemy, player, AIData) => {return true;}, - move: (enemy, player, AIData) => {return true;}, - follower: (enemy, player, AIData) => {return true;}, - followsound: (enemy, player, AIData) => {return true;}, - wander_near: (enemy, player, AIData) => {return true;}, - wander_far: (enemy, player, AIData) => {return KDRandom() < 0.4;}, - wandernear_func: (enemy, player, AIData) => { - if (KinkyDungeonAlert && AIData.playerDist < Math.max(4, AIData.visionRadius)) { - enemy.gx = KinkyDungeonPlayerEntity.x; - enemy.gy = KinkyDungeonPlayerEntity.y; - } else { - // Short distance - let ex = enemy.x; - let ey = enemy.y; - let cohesion = enemy.Enemy.cohesion ? enemy.Enemy.cohesion : 0.5; - let masterCloseness = enemy.Enemy.cohesion ? enemy.Enemy.cohesion : 0.7; - if (AIData.master && KDRandom() < masterCloseness) { - ex = AIData.master.x; - ey = AIData.master.y; - } else if (KDRandom() < cohesion) { - let minDist = enemy.Enemy.cohesionRange ? enemy.Enemy.cohesionRange : AIData.visionRadius; - for (let e of KinkyDungeonEntities) { - if (e == enemy) continue; - if (['guard', 'ambush'].includes(KDGetAI(enemy))) continue; - if (enemy.Enemy.clusterWith && !e.Enemy.tags[enemy.Enemy.clusterWith]) continue; - if (KinkyDungeonTilesGet(e.x + "," + e.y) && KinkyDungeonTilesGet(e.x + "," + e.y).OffLimits) continue; - let dist = KDistEuclidean(e.x - enemy.x, e.y - enemy.y); - if (dist < minDist) { - minDist = dist; - let ePoint = KinkyDungeonGetNearbyPoint(ex, ey, false); - if (ePoint) { - ex = ePoint.x; - ey = ePoint.y; - } - } - } - } - let newPoint = KinkyDungeonGetNearbyPoint(ex, ey, false, undefined, undefined, undefined, (x, y) => { - return KinkyDungeonBrightnessGet(x, y) < 4; - }); - if (newPoint && (KDGetFaction(enemy) != "Player" || !KinkyDungeonPointInCell(newPoint.x, newPoint.y))) { - enemy.gx = newPoint.x; - enemy.gy = newPoint.y; - return true; - } - } - - return false; - }, - wanderfar_func: (enemy, player, AIData) => { - let newPoint = KinkyDungeonGetRandomEnemyPointCriteria((x, y) => { - return KinkyDungeonBrightnessGet(x, y) < 4; - }, false, enemy.tracking && KinkyDungeonHuntDownPlayer && KDGameData.PrisonerState != "parole" && KDGameData.PrisonerState != "jail"); - if (newPoint) { - enemy.gx = newPoint.x; - enemy.gy = newPoint.y; - return true; - } - return false; - }, - resetguardposition: (enemy, player, AIData) => {return false;}, - attack: (enemy, player, AIData) => {return true;}, - spell: (enemy, player, AIData) => {return true;}, - aftermove: (enemy, player, AIData) => {return false;}, - wanderDelay_long: (enemy, AIData) => {return 20 + Math.floor(KDRandom() * 15);}, - wanderDelay_short: (enemy, AIData) => {return 10 + Math.floor(KDRandom() * 10);}, - }, - "patrol": { - init: (enemy, player, AIData) => {}, - beforemove: (enemy, player, AIData) => {return false;}, - chase: (enemy, player, AIData) => {return true;}, - persist: (enemy, player, AIData) => {return true;}, - move: (enemy, player, AIData) => {return true;}, - follower: (enemy, player, AIData) => {return true;}, - followsound: (enemy, player, AIData) => {return true;}, - wander_near: (enemy, player, AIData) => {return true;}, - wander_far: (enemy, player, AIData) => {return true;}, - resetguardposition: (enemy, player, AIData) => {return false;}, - attack: (enemy, player, AIData) => {return true;}, - spell: (enemy, player, AIData) => {return true;}, - aftermove: (enemy, player, AIData) => { - if (!AIData.followPlayer && !KDEnemyHasFlag(enemy, "StayHere")) { - let patrolChance = AIData.patrolChange ? 0.13 : 0.02; - if (!enemy.patrolIndex) enemy.patrolIndex = KinkyDungeonNearestPatrolPoint(enemy.x, enemy.y); - if (KinkyDungeonPatrolPoints[enemy.patrolIndex] && KDRandom() < patrolChance) { - - if (enemy.patrolIndex < KinkyDungeonPatrolPoints.length - 1) enemy.patrolIndex += 1; - else enemy.patrolIndex = 0; - - let newPoint = KinkyDungeonGetPatrolPoint(enemy.patrolIndex, 1.4, AIData.MovableTiles); - enemy.gx = newPoint.x; - enemy.gy = newPoint.y; - } - return true; - } - return false; - }, - wanderDelay_long: (enemy, AIData) => {return 35 + Math.floor(KDRandom() * 35);}, - wanderDelay_short: (enemy, AIData) => {return 10 + Math.floor(KDRandom() * 20);}, - }, - "guard": { - init: (enemy, player, AIData) => { - AIData.visionMod *= 0.7;}, - beforemove: (enemy, player, AIData) => {return false;}, - chase: (enemy, player, AIData) => {return true;}, - persist: (enemy, player, AIData) => {return false;}, - move: (enemy, player, AIData) => {return true;}, - follower: (enemy, player, AIData) => {return true;}, - followsound: (enemy, player, AIData) => {return true;}, - wander_near: (enemy, player, AIData) => {return false;}, - wander_far: (enemy, player, AIData) => {return false;}, - resetguardposition: (enemy, player, AIData) => {return true;}, - attack: (enemy, player, AIData) => {return true;}, - spell: (enemy, player, AIData) => {return true;}, - aftermove: (enemy, player, AIData) => {return false;}, - wanderDelay_long: (enemy, AIData) => {return 35 + Math.floor(KDRandom() * 35);}, - wanderDelay_short: (enemy, AIData) => {return 15 + Math.floor(KDRandom() * 30);}, - }, - "looseguard": { - strictwander: true, - init: (enemy, player, AIData) => {}, - beforemove: (enemy, player, AIData) => {return false;}, - chase: (enemy, player, AIData) => {return true;}, - persist: (enemy, player, AIData) => {return false;}, - move: (enemy, player, AIData) => {return true;}, - follower: (enemy, player, AIData) => {return true;}, - followsound: (enemy, player, AIData) => {return true;}, - wander_near: (enemy, player, AIData) => {return true;}, - wander_far: (enemy, player, AIData) => {return false;}, - resetguardposition: (enemy, player, AIData) => {return true;}, - attack: (enemy, player, AIData) => {return true;}, - spell: (enemy, player, AIData) => {return true;}, - aftermove: (enemy, player, AIData) => {return false;}, - wanderDelay_long: (enemy, AIData) => {return 35 + Math.floor(KDRandom() * 35);}, - wanderDelay_short: (enemy, AIData) => {return 15 + Math.floor(KDRandom() * 30);}, - }, - "verylooseguard": { - strictwander: true, - init: (enemy, player, AIData) => {}, - beforemove: (enemy, player, AIData) => {return false;}, - chase: (enemy, player, AIData) => {return true;}, - persist: (enemy, player, AIData) => {return false;}, - move: (enemy, player, AIData) => {return true;}, - follower: (enemy, player, AIData) => {return true;}, - followsound: (enemy, player, AIData) => {return true;}, - wander_near: (enemy, player, AIData) => {return true;}, - wander_far: (enemy, player, AIData) => {return true;}, - resetguardposition: (enemy, player, AIData) => {return true;}, - attack: (enemy, player, AIData) => {return true;}, - spell: (enemy, player, AIData) => {return true;}, - aftermove: (enemy, player, AIData) => {return false;}, - wanderDelay_long: (enemy, AIData) => {return 35 + Math.floor(KDRandom() * 35);}, - wanderDelay_short: (enemy, AIData) => {return 15 + Math.floor(KDRandom() * 30);}, - }, - "ambush": { - ambush: true, - ambushtile: 'X', - init: (enemy, player, AIData) => {}, - beforemove: (enemy, player, AIData) => { - if (AIData.playerDist < 1.5) enemy.ambushtrigger = true; - return false; - }, - chase: (enemy, player, AIData) => {return enemy.ambushtrigger;}, - persist: (enemy, player, AIData) => {return enemy.ambushtrigger;}, - move: (enemy, player, AIData) => {return enemy.ambushtrigger || (enemy.Enemy.wanderTillSees && !AIData.canSeePlayer);}, - follower: (enemy, player, AIData) => {return true;}, - followsound: (enemy, player, AIData) => {return true;}, - wander_near: (enemy, player, AIData) => {return (enemy.Enemy.wanderTillSees && !AIData.canSeePlayer);}, - wander_far: (enemy, player, AIData) => {return false;}, - resetguardposition: (enemy, player, AIData) => {return true;}, - attack: (enemy, player, AIData) => {return enemy.ambushtrigger;}, - spell: (enemy, player, AIData) => {return enemy.ambushtrigger;}, - aftermove: (enemy, player, AIData) => {return false;}, - wanderDelay_long: (enemy, AIData) => {return 35 + Math.floor(KDRandom() * 35);}, - wanderDelay_short: (enemy, AIData) => {return 10 + Math.floor(KDRandom() * 25);}, - }, -}; - - -/** - * @type {Record} - */ -let KDLoadouts = { - "guard": { - name: "guard", - tags: ["elite"], - singletag: ["human", "elf", "alchemist", "dragon", "witch", "apprentice", "mummy", "jailer"], - forbidtags: ["submissive", "gagged"], - chance: 0.1, - items: ["RedKey"], - }, - "thief": { - name: "guard", - tags: ["human"], - singletag: ["bandit", "bountyhunter"], - forbidtags: ["submissive", "gagged"], - chance: 0.15, - items: ["Pick", "Knife"], - }, - "mistress": { - name: "mistress", - tags: ["miniboss"], - singletag: ["human", "elf", "alchemist", "dragon", "witch", "apprentice", "mummy"], - forbidtags: ["submissive", "gagged"], - chance: 0.65, - items: ["RedKey"], - }, - "scientist_I": { - name: "scientist_I", - tags: ["alchemist"], - singletag: ["alchemist"], - forbidtags: ["submissive", "gagged"], - chance: 0.65, - items: ["SmokeBomb"], - }, - "scientist_II": { - name: "scientist_II", - tags: ["alchemist"], - singletag: ["alchemist"], - forbidtags: ["submissive", "gagged"], - chance: 0.5, - items: ["PotionFrigid", "PotionStamina"], - }, - "scientist_III": { - name: "scientist_III", - tags: ["alchemist"], - singletag: ["alchemist"], - forbidtags: ["submissive", "gagged"], - chance: 0.35, - items: ["PotionMana"], - }, - "magus": { - name: "magus", - tags: [], - singletag: ["dressmaker", "elf", "witch", "apprentice", "mummy", "fungal"], - forbidtags: ["submissive", "gagged"], - chance: 0.01, - multiplier: 10, - items: ["BlueKey", "ScrollVerbal", "ScrollLegs", "ScrollArms"], - }, - "magusElite": { - name: "magusElite", - tags: [], - singletag: ["dressmaker", "elf", "witch", "apprentice", "mummy", "fungal"], - singletag2: ["elite", "miniboss", "boss"], - forbidtags: ["submissive", "gagged"], - chance: 0.6, - multiplier: 10, - items: ["BlueKey", "ScrollVerbal", "ScrollLegs", "ScrollArms"], - }, - "scroll_arm": { - name: "scroll_arm", - tags: [], - singletag: ["dressmaker", "elf", "witch", "apprentice", "mummy", "fungal"], - forbidtags: ["submissive", "gagged"], - chance: 0.04, - items: ["ScrollArms"], - }, - "scroll_leg": { - name: "scroll_arm", - tags: [], - singletag: ["dressmaker", "elf", "witch", "apprentice", "mummy", "fungal"], - forbidtags: ["submissive", "gagged"], - chance: 0.04, - items: ["ScrollLegs"], - }, - "scroll_verbal": { - name: "scroll_arm", - tags: [], - singletag: ["dressmaker", "elf", "witch", "apprentice", "mummy", "fungal"], - forbidtags: ["submissive", "gagged"], - chance: 0.04, - items: ["ScrollVerbal"], - }, - "mage": { - name: "mage", - tags: [], - singletag: ["witch", "apprentice", "fungal", "elf", "dressmaker"], - forbidtags: [], - chance: 0.08, - items: ["PotionMana"], - }, - "police": { - name: "police", - tags: ["police"], - singletag: ["human", "bountyhunter"], - forbidtags: ["submissive", "gagged"], - chance: 0.2, - items: ["RedKey"], - }, - "ninja": { - name: "ninja", - tags: [], - singletag: ["ninja", "maid", "bountyhunter"], - forbidtags: [], - chance: 0.7, - items: ["SmokeBomb"], - }, - "bandit_I": { - name: "bandit_I", - tags: [], - singletag: ["bandit"], - forbidtags: [], - chance: 0.3, - items: ["Bomb"], - }, - "bandit_II": { - name: "bandit_II", - tags: [], - singletag: ["bandit"], - forbidtags: [], - chance: 0.7, - items: ["Bola"], - }, - "bandit_III": { - name: "bandit_III", - tags: ["bandit"], - singletag: ["miniboss", "boss", "elite"], - forbidtags: [], - chance: 0.5, - items: ["PotionStamina", "Bola", "Knife"], - }, - "bandit_IV": { - name: "bandit_IV", - tags: ["bandit"], - singletag: ["miniboss", "boss", "elite"], - forbidtags: [], - chance: 0.5, - multiplier: 5, - items: ["PotionWill", "Bomb", "Rope"], - }, - "bandit_V": { - name: "bandit_V", - tags: ["bandit"], - singletag: ["miniboss", "boss"], - forbidtags: [], - chance: 0.1, - multiplier: 10, - items: ["PotionStamina", "RedKey", "RedKey"], - }, - "miner": { - name: "miner", - tags: ["miner"], - singletag: ["miner"], - forbidtags: [], - chance: 1.0, - items: ["Bomb", "Bomb", "Bomb"], - }, - "trainer": { - name: "trainer", - tags: ["trainer"], - singletag: ["trainer"], - forbidtags: [], - chance: 0.4, - items: ["AncientPowerSource"], - }, - "nevermere": { - name: "nevermere", - tags: ["nevermere"], - singletag: ["trainer", "wolfgirl"], - forbidtags: ["submissive", "gagged"], - chance: 0.15, - items: ["AncientPowerSource", "RedKey"], - }, - "agent": { - name: "agent", - tags: [], - singletag: ["ninja", "maid", "bountyhunter"], - forbidtags: [], - chance: 0.1, - items: ["SmokeBomb", "PotionInvisibility"], - }, - "ninja_II": { - name: "ninja_II", - tags: [], - singletag: ["ninja", "maid", "bountyhunter"], - forbidtags: [], - chance: 0.3, - items: ["SmokeBomb", "Bola"], - }, - "religious": { - name: "religious", - tags: ["religious"], - singletag: ["mummy", "elf"], - forbidtags: ["submissive", "gagged"], - chance: 0.01, - items: ["ScrollPurity"], - }, - "religiousElite": { - name: "religiousElite", - tags: ["religious", "elite"], - singletag: ["mummy", "elf"], - forbidtags: ["submissive", "gagged"], - chance: 0.2, - multiplier: 4, - items: ["ScrollPurity", "BlueKey"], - }, - "religiousMiniboss": { - name: "religiousMiniboss", - tags: ["religious", "miniboss"], - singletag: ["mummy", "elf"], - forbidtags: ["submissive", "gagged"], - chance: 0.5, - multiplier: 10, - items: ["ScrollPurity", "BlueKey"], - }, - "religiousBoss": { - name: "religiousBoss", - tags: ["religious", "boss"], - singletag: ["mummy", "elf"], - forbidtags: ["submissive", "gagged"], - chance: 0.8, - multiplier: 10, - items: ["ScrollPurity", "BlueKey"], - }, - "keyholder": { - name: "keyholder", - tags: ["miniboss"], - singletag: ["human", "elf", "alchemist", "dragon", "witch", "apprentice", "mummy", "jailer"], - forbidtags: ["submissive", "gagged"], - chance: 0.22, - multiplier: 2, - items: ["Keyring"], - }, - "potMana_minor": { - name: "potMana_minor", - tags: ["jail"], - singletag: [], - forbidtags: [], - chance: 0.05, - items: ["PotionMana"], - }, - "potStam_minor": { - name: "potStam_minor", - tags: ["jail"], - singletag: [], - forbidtags: [], - chance: 0.05, - items: ["PotionStamina"], - }, - "potWill_minor": { - name: "potWill_minor", - tags: ["jail"], - singletag: [], - forbidtags: [], - chance: 0.04, - items: ["PotionWill"], - }, - "potMana": { - name: "potMana", - tags: ["jail"], - singletag: [], - forbidtags: ["minor"], - chance: 0.05, - items: ["PotionMana"], - }, - "potStam": { - name: "potStam", - tags: ["jail"], - singletag: [], - forbidtags: ["minor"], - chance: 0.05, - items: ["PotionStamina"], - }, - "potWill": { - name: "potWill", - tags: ["jail"], - singletag: [], - forbidtags: ["minor"], - chance: 0.04, - items: ["PotionWill"], - }, - "potFrigid": { - name: "potFrigid", - tags: ["jail"], - singletag: [], - forbidtags: ["minor"], - chance: 0.08, - items: ["PotionFrigid"], - }, - "boss": { - name: "boss", - tags: ["boss"], - singletag: ["human", "elf", "alchemist", "dragon", "witch", "apprentice", "mummy"], - forbidtags: ["submissive", "gagged"], - chance: 1.0, - items: ["RedKey", "Keyring"], - }, -}; - -/** @type {Record} */ -let KDSpecialConditions = { - "canRestrainWithExtra": { - resetCD: false, - criteria: (enemy, AIData) => { - let rThresh = enemy.Enemy.RestraintFilter?.powerThresh || KDDefaultRestraintThresh; - return KDGetRestraintsEligible( - {tags: KDGetTags(enemy, true)}, MiniGameKinkyDungeonLevel, - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - enemy.Enemy.bypass, - enemy.Enemy.useLock ? enemy.Enemy.useLock : "", - !(enemy.Enemy.ignoreStaminaForBinds || (true && enemy.Enemy.specialIgnoreStam)) && !AIData.attack.includes("Suicide"), - false, - !(KinkyDungeonStatsChoice.has("TightRestraints") || enemy.Enemy.tags.miniboss || enemy.Enemy.tags.boss), - KDGetExtraTags(enemy, true), - false, - { - maxPower: rThresh + 0.01, - looseLimit: true, - onlyUnlimited: true, - ignore: enemy.items, - }, enemy - ).length > 0; - } - } -}; \ No newline at end of file diff --git a/Game/KinkyDungeonEnemyEventList.js b/Game/KinkyDungeonEnemyEventList.js deleted file mode 100644 index cabfdfd81..000000000 --- a/Game/KinkyDungeonEnemyEventList.js +++ /dev/null @@ -1,310 +0,0 @@ -"use strict"; - -/** - * Play is actions enemies do when they are NEUTRAL - * @type {Record} - */ -let KDIntentEvents = { - "leashFurniture": { - play: true, - nonaggressive: true, - // This will make the enemy want to leash you - weight: (enemy, AIData, allied, hostile, aggressive) => { - if (allied) return 0; - if (!enemy.Enemy.tags.leashing) return 0; - if (KinkyDungeonFlags.get("Released")) return 0; - if (KDGameData.PrisonerState == 'jail') return 0; - if (KinkyDungeonGetRestraintItem("ItemDevices")) return 0; - if (enemy.playWithPlayer > 0) return 0; - let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"]); - return nearestfurniture && KDistChebyshev(enemy.x - nearestfurniture.x, enemy.y - nearestfurniture.y) < 14 ? (hostile ? 120 : 40) : 0; - }, - trigger: (enemy, AIData) => { - KDResetIntent(enemy, AIData); - enemy.IntentAction = 'leashFurniture'; - KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 140); - let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"]); - enemy.IntentLeashPoint = nearestfurniture; - enemy.playWithPlayer = 22; - KDSetPlayCD(enemy, 2); - - KinkyDungeonSetEnemyFlag(enemy, "playstart", 3); - KinkyDungeonSetEnemyFlag(enemy, "motivated", 50); - - KDAddThought(enemy.id, "Jail", 5, enemy.playWithPlayer); - - let suff = (enemy.Enemy.playLine ? enemy.Enemy.playLine : ""); - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff + "Leash").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 3); - }, - arrive: (enemy, AIData) => { - // When the enemy arrives at the leash point we move the player to it - enemy.IntentAction = ''; - enemy.IntentLeashPoint = null; - KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", -1); - enemy.playWithPlayer = 12 + Math.floor(KDRandom() * 12); - enemy.playWithPlayerCD = 30; - KinkyDungeonSetEnemyFlag(enemy, "playstart", 7); - return KDSettlePlayerInFurniture(enemy, AIData); - }, - maintain: (enemy, delta) => { - if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5 && (KDEnemyHasFlag(enemy, "motivated") || KDHostile(enemy))) { - if (enemy.playWithPlayer < 10) { - enemy.playWithPlayer = 10; - KDSetPlayCD(enemy, 1.5); - }// else enemy.playWithPlayer += delta; - } - return false; - }, - }, - "Ignore": { - nonaggressive: true, - // This is the basic leash to jail mechanic - weight: (enemy, AIData, allied, hostile, aggressive) => { - return 90; - }, - trigger: (enemy, AIData) => { - }, - }, - "Play": { - play: true, - nonaggressive: true, - // This is the basic 'it's time to play!' dialogue - weight: (enemy, AIData, allied, hostile, aggressive) => { - return (KDEnemyHasFlag(enemy, "HelpMe")) ? - 0 - : (!enemy?.playWithPlayer ? (allied ? 10 : 110) : 0); - }, - trigger: (enemy, AIData) => { - KDResetIntent(enemy, AIData); - enemy.playWithPlayer = 8 + Math.floor(KDRandom() * (5 * Math.min(5, Math.max(enemy.Enemy.attackPoints || 0, enemy.Enemy.movePoints || 0)))); - KinkyDungeonSetEnemyFlag(enemy, "playstart", 7); - KDSetPlayCD(enemy, 2.5); - if (AIData.domMe) enemy.playWithPlayer = Math.floor(enemy.playWithPlayer * 0.7); - KDAddThought(enemy.id, "Play", 4, enemy.playWithPlayer); - - let index = Math.floor(Math.random() * 3); - let suff = (enemy.Enemy.playLine ? enemy.Enemy.playLine : ""); - if (AIData.domMe) { - if (KDIsBrat(enemy)) - suff = "Brat" + suff; - else - suff = "Sub" + suff; - } - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff + index).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 3); - }, - }, - "freeFurniture": { - // This is called to make an enemy free you from furniture - weight: (enemy, AIData, allied, hostile, aggressive) => { - return 0; - }, - trigger: (enemy, AIData) => { - // n/a - KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 100); - }, - maintain: (enemy, delta) => { - if (KinkyDungeonGetRestraintItem("ItemDevices")) { - if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5) { - KinkyDungeonRemoveRestraint("ItemDevices", false, false, false); - KDResetIntent(enemy, undefined); - KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", -1); - if (enemy.playWithPlayer > 0) - enemy.playWithPlayerCD = Math.max(enemy.playWithPlayer, 30); - KinkyDungeonSetFlag("Released", 24); - KinkyDungeonSetFlag("nojailbreak", 12); - } else { - enemy.gx = KinkyDungeonPlayerEntity.x; - enemy.gy = KinkyDungeonPlayerEntity.y; - } - if (enemy.playWithPlayer > 0) - enemy.playWithPlayer = 12; - return true; - } - return false; - }, - }, - "Capture": { - aggressive: true, - noplay: true, - // This is the basic leash to jail mechanic - weight: (enemy, AIData, allied, hostile, aggressive) => { - return 100; - }, - trigger: (enemy, AIData) => { - enemy.playWithPlayer = 0; - }, - }, - "CaptureJail": { - // Capture and bring to jail - aggressive: true, - nonaggressive: true, - noplay: true, - forceattack: true, - // This is the basic leash to jail mechanic - weight: (enemy, AIData, allied, hostile, aggressive) => { - return hostile && (enemy.Enemy.tags.jailer || enemy.Enemy.tags.jail || enemy.Enemy.tags.leashing) && (KinkyDungeonFlags.has("Released")) ? - ((KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["dropoff"]) && !KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail"])) ? 0 : 100) - : 0; - }, - trigger: (enemy, AIData) => { - KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 30); - enemy.playWithPlayer = 0; - enemy.IntentAction = 'CaptureJail'; - let nj = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail"]); - enemy.IntentLeashPoint = nj ? nj : Object.assign({type: "jail", radius: 1}, KinkyDungeonStartPosition); - if (!nj) KinkyDungeonSetFlag("LeashToPrison", -1, 1); - }, - arrive: (enemy, AIData) => { - if (KDGameData.PrisonerState == 'parole') { - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "Mistake").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 6, 8); - KDBreakTether(); - if (enemy.IntentLeashPoint) - KDMovePlayer(enemy.IntentLeashPoint.x, enemy.IntentLeashPoint.y, false, false); - KDResetIntent(enemy, AIData); - enemy.playWithPlayer = 0; - enemy.playWithPlayerCD = 24; - return true; - } - AIData.defeat = true; - KDBreakTether(); - return false; - }, - }, - "CaptureDoll": { - // Capture and bring to dropoff - aggressive: true, - nonaggressive: true, - noplay: true, - forceattack: true, - // This is the basic leash to jail mechanic - weight: (enemy, AIData, allied, hostile, aggressive) => { - return hostile && (enemy.Enemy.tags.jailer || enemy.Enemy.tags.jail || enemy.Enemy.tags.leashing) && (KinkyDungeonFlags.has("Released") && KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["dropoff"])) ? 200 : 0; - }, - trigger: (enemy, AIData) => { - KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 30); - enemy.playWithPlayer = 0; - enemy.IntentAction = 'CaptureDoll'; - enemy.IntentLeashPoint = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["dropoff"]); - }, - arrive: (enemy, AIData) => { - if (KDGameData.PrisonerState == 'parole') { - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "Mistake").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 6, 8); - KDBreakTether(); - if (enemy.IntentLeashPoint) - KDMovePlayer(enemy.IntentLeashPoint.x, enemy.IntentLeashPoint.y, false, false); - KDResetIntent(enemy, AIData); - enemy.playWithPlayer = 0; - enemy.playWithPlayerCD = 24; - return true; - } - AIData.defeat = true; - KDBreakTether(); - return false; - }, - }, - "leashFurnitureAggressive": { - noplay: true, - aggressive: true, - // This will make the enemy want to leash you - weight: (enemy, AIData, allied, hostile, aggressive) => { - if (!enemy.Enemy.tags.leashing) return 0; - if (KinkyDungeonFlags.get("Released")) return 0; - if (KDGameData.PrisonerState == 'jail') return 0; - if (KinkyDungeonGetRestraintItem("ItemDevices")) return 0; - let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"]); - return nearestfurniture && KDistChebyshev(enemy.x - nearestfurniture.x, enemy.y - nearestfurniture.y) < 14 ? (hostile ? 120 : (AIData.domMe ? 0 : 40)) : 0; - }, - trigger: (enemy, AIData) => { - KDResetIntent(enemy, AIData); - enemy.IntentAction = 'leashFurnitureAggressive'; - let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"]); - enemy.IntentLeashPoint = nearestfurniture; - - KDAddThought(enemy.id, "Jail", 5, 3); - - let suff = (enemy.Enemy.playLine ? enemy.Enemy.playLine : ""); - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff + "Leash").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 3); - }, - arrive: (enemy, AIData) => { - // When the enemy arrives at the leash point we move the player to it - enemy.IntentAction = ''; - enemy.IntentLeashPoint = null; - let res = KDSettlePlayerInFurniture(enemy, AIData, ["callGuardJailerOnly"]); - if (res) { - for (let e of KinkyDungeonEntities) { - if (e.hostile < 9000) e.hostile = 0; - if (e.attackPoints > 0) e.attackPoints = 0; - if (!e.ceasefire) e.ceasefire = 1; - } - KDGameData.PrisonerState = 'jail'; - } - return res; - }, - maintain: (enemy, delta) => { - if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5) { - if (enemy.playWithPlayer < 10) { - enemy.playWithPlayer = 10; - }// else enemy.playWithPlayer += delta; - } - return false; - }, - }, -}; - -/** - * - * @param {entity} enemy - * @param {any} AIData - */ -function KDResetIntent(enemy, AIData) { - enemy.IntentLeashPoint = null; - enemy.IntentAction = ""; -} - -/** - * Helper function called to leash player to the nearest furniture - * @param {entity} enemy - * @param {any} AIData - * @returns {boolean} - */ -function KDSettlePlayerInFurniture(enemy, AIData, tags, guardDelay = 24) { - let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"]); - let tile = KinkyDungeonTilesGet(nearestfurniture.x + "," + nearestfurniture.y); - let type = tile ? tile.Furniture : undefined; - - let ee = KinkyDungeonEnemyAt(nearestfurniture.x, nearestfurniture.y); - if (ee && ee != enemy) { - KDKickEnemy(ee); - } - if (enemy.x == nearestfurniture.x && enemy.y == nearestfurniture.y) - KDMoveEntity(enemy, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, undefined, undefined, true); - KDMovePlayer(nearestfurniture.x, nearestfurniture.y, false); - if (KinkyDungeonPlayerEntity.x == nearestfurniture.x && KinkyDungeonPlayerEntity.y == nearestfurniture.y) { - let furn = KDFurniture[type]; - if (furn) { - KinkyDungeonSetFlag("GuardCalled", guardDelay); - if (tags) { - for (let t of tags) { - KinkyDungeonSetFlag(t, guardDelay + 60); - } - } - let rest = KinkyDungeonGetRestraint( - {tags: [furn.restraintTag]}, MiniGameKinkyDungeonLevel, - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - true, - "", - true, - false, - false); - KinkyDungeonAddRestraintIfWeaker(rest, 0, true); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Trap.ogg"); - KinkyDungeonMakeNoise(10, nearestfurniture.x, nearestfurniture.y); - } - - KDResetAllAggro(); - KDResetAllIntents(); - KDBreakTether(); - return true; - } - return false; -} \ No newline at end of file diff --git a/Game/KinkyDungeonErrors.js b/Game/KinkyDungeonErrors.js deleted file mode 100644 index b30973005..000000000 --- a/Game/KinkyDungeonErrors.js +++ /dev/null @@ -1,308 +0,0 @@ -'use strict'; - -/** - * Sets up the KD crash handler - */ -function KinkyDungeonSetupCrashHandler() { - window.addEventListener("error", KinkyDungeonOnUncaughtError); -} - -/** - * Tears down the KD crash handler - */ -function KinkyDungeonTeardownCrashHandler() { - window.removeEventListener("error", KinkyDungeonOnUncaughtError); -} - -/** - * Error event handler for uncaught errors - * @param {ErrorEvent} event - The error event - */ -function KinkyDungeonOnUncaughtError(event) { - const report = KinkyDungeonGenerateErrorReport(event); - KinkyDungeonShowCrashReportModal(report); -} - -/** - * Generates an error report string containing crash debug data - * @param {ErrorEvent} event - The error event - * @returns {string} - The report - */ -function KinkyDungeonGenerateErrorReport(event) { - return [ - KinkyDungeonCrashReportErrorDetails(event), - KinkyDungeonCrashReportStateData(), - KinkyDungeonCrashReportDiagnostics(), - KinkyDungeonCrashReportDeviceDetails(), - KinkyDungeonCrashReportSaveData(), - ].join("\n\n"); -} - -/** - * Generates a report string containing debug data about the current state of the game - * @returns {string} - The report - */ -function KinkyDungeonCrashReportStateData() { - let version; - try { - version = TextGet("KinkyDungeon") || "Version unknown"; - } catch { - version = "Version unknown"; - } - let modFiles; - try { - modFiles = KDAllModFiles.map(({filename}) => filename).join(","); - } catch { - modFiles = "Failed to parse mod files"; - } - return [ - "========== Game State Data ==========", - "", - `Version: ${version}`, - `Test mode: ${TestMode}`, - `Debug mode: ${KDDebugMode}`, - `Kinky Dungeon state: ${KinkyDungeonState}`, - `Kinky Dungeon running: ${KinkyDungeonGameRunning}`, - `Loaded mod files: [${modFiles}]`, - ].join("\n"); -} - -/** - * Generates an error report string containing debug data about the thrown error - * @param {ErrorEvent} event - The error event - * @returns {string} - The report - */ -function KinkyDungeonCrashReportErrorDetails(event) { - return [ - "========== Kinky Dungeon Crash Report ==========", - "", - `Message: ${event.message}`, - `Location: ${KinkyDungeonStackSanitize(event.filename)}:${event.lineno}:${event.colno}`, - "", - KinkyDungeonStackSanitize(event.error.stack), - ].join("\n"); -} - -/** - * Generates a report string containing the current save state of the game - * @returns {string} - The report - */ -function KinkyDungeonCrashReportSaveData() { - let saveData = localStorage.getItem("KinkyDungeonSave"); - if (!saveData) { - try { - saveData = KinkyDungeonCompressSave(KinkyDungeonGenerateSaveData()); - } catch (error) { - saveData = "Could not locate or generate save data"; - } - } - return [ - "========== Save Data ==========", - "", - saveData, - ].join("\n"); -} - -/** - * Generates a report string containing debug data with general diagnostics information - * @returns {string} - The report - */ -function KinkyDungeonCrashReportDiagnostics() { - return [ - "========== Diagnostics ==========", - "", - `Location: ${KinkyDungeonStackSanitize(window.location.href)}`, - `User agent: ${window.navigator.userAgent}`, - `Locale: ${window.navigator.language}`, - `Local time: ${Date.now()}`, - `Mouse: [${MouseX}, ${MouseY}]`, - `WebGL supported: ${PIXI.utils.isWebGLSupported()}`, - ].join("\n"); -} - -/** - * Generates a report string containing debug data with device detection information - * @returns {string} - The report - */ -function KinkyDungeonCrashReportDeviceDetails() { - return [ - "========== Device Detection ==========", - "", - JSON.stringify(PIXI.utils.isMobile, null, 2), - ].join("\n"); -} - -/** - * Sanitizes a string to remove beta codes from it - * @returns {string} - The sanitized string - */ -function KinkyDungeonStackSanitize(stack) { - return stack.replaceAll(/\/\d{10,}/g, ""); -} - -/** - * Opens the KD crash report modal, displaying the provided report - * @param {string} report - The report to display - */ -function KinkyDungeonShowCrashReportModal(report) { - const id = "kinky-dungeon-crash-report"; - - if (document.querySelector(`#${id}`)) { - return; - } - - const backdrop = document.createElement("div"); - backdrop.id = id; - Object.assign(backdrop.style, { - position: "fixed", - inset: 0, - backgroundColor: "#000000a0", - fontFamily: "'Arial', sans-serif", - fontSize: "1.8vmin", - lineHeight: 1.6, - }); - - const modal = document.createElement("div"); - Object.assign(modal.style, { - position: "absolute", - display: "flex", - flexFlow: "column nowrap", - width: "90vw", - maxWidth: "1440px", - maxHeight: "90vh", - overflow: "hidden", - backgroundColor: "#282828", - color: "#fafafa", - left: "50%", - top: "50%", - transform: "translate(-50%, -50%)", - padding: "1rem", - borderRadius: "2px", - boxShadow: "1px 1px 40px -8px #ffffff80", - }); - backdrop.appendChild(modal); - - const heading = document.createElement("h1"); - Object.assign(heading.style, { - display: "flex", - flexFlow: "row nowrap", - alignItems: "center", - justifyContent: "space-around", - textAlign: "center", - }); - heading.appendChild(KinkyDungeonErrorImage("WolfgirlPet")); - heading.appendChild(KinkyDungeonErrorImage("Wolfgirl")); - heading.appendChild(KinkyDungeonErrorImage("WolfgirlPet")); - heading.appendChild(document.createTextNode("Kinky Dungeon Crash Handler")); - heading.appendChild(KinkyDungeonErrorImage("WolfgirlPet")); - heading.appendChild(KinkyDungeonErrorImage("Wolfgirl")); - heading.appendChild(KinkyDungeonErrorImage("WolfgirlPet")); - modal.appendChild(heading); - - const hr = document.createElement("hr"); - Object.assign(hr.style, { - border: `1px solid ${KDBorderColor}`, - margin: "0 0 1.5em", - }); - modal.appendChild(hr); - - modal.appendChild(KinkyDungeonErrorPreamble([ - "An error has occurred whilst Kinky Dungeon was running. ", - "You may be able to continue playing, but Kinky Dungeon might not function correctly.", - ])); - modal.appendChild(KinkyDungeonErrorPreamble([ - "Please report this error in the Kinky Dungeon Discord so that we can dispatch our team of highly-trained wolfgirls to fix it.", - "When you make your report, please include the following debug information - the wolfgirls will appreciate it!", - ])); - - const pre = document.createElement("pre"); - Object.assign(pre.style, { - flex: 1, - backgroundColor: "#1a1a1a", - border: "1px solid #ffffff40", - fontSize: "1.1em", - padding: "1em", - userSelect: "all", - overflowWrap: "anywhere", - overflowX: "hidden", - overflowY: "auto", - color: KDBorderColor, - }); - pre.textContent = `\`\`\`\n${report}\n\`\`\``; - modal.appendChild(pre); - - const buttons = document.createElement("div"); - Object.assign(buttons.style, { - display: "flex", - flexFlow: "row wrap", - justifyContent: "flex-end", - gap: "1em", - }); - modal.appendChild(buttons); - - const copyButton = KinkyDungeonErrorModalButton("Copy to clipboard"); - copyButton.addEventListener("click", () => { - KinkyDungeonErrorCopy(report, pre) - .then(copied => { - copyButton.textContent = copied ? "Awoo!" : "Failed"; - }) - .catch(() => void 0); - }); - buttons.appendChild(copyButton); - - const closeButton = KinkyDungeonErrorModalButton("Close"); - closeButton.addEventListener("click", () => { - backdrop.remove(); - }); - buttons.appendChild(closeButton); - - document.body.appendChild(backdrop); -} - -function KinkyDungeonErrorImage(src) { - const img = document.createElement("img"); - img.src = `${KinkyDungeonRootDirectory}Enemies/${src}.png`; - Object.assign(img.style, { - maxWidth: "10vw", - }); - return img; -} - -function KinkyDungeonErrorPreamble(content) { - const preamble = document.createElement("p"); - Object.assign(preamble.style, { - margin: "0 0 0.5em", - fontSize: "1.25em", - }); - preamble.innerHTML = content.join(" "); - return preamble; -} - -function KinkyDungeonErrorModalButton(text) { - const button = document.createElement("button"); - button.textContent = text; - Object.assign(button.style, { - fontSize: "1.25em", - padding: "0.5em 1em", - backgroundColor: KDButtonColor, - border: `2px solid ${KDBorderColor}`, - color: "#ffffff", - cursor: "pointer", - }); - return button; -} - -function KinkyDungeonErrorCopy(report, reportElement) { - return navigator.clipboard.writeText(report) - .then(() => true) - .catch(() => { - if (reportElement) { - const range = document.createRange(); - range.selectNode(reportElement); - window.getSelection()?.removeAllRanges(); - window.getSelection()?.addRange(range); - return document.execCommand("copy"); - } - return false; - }); -} diff --git a/Game/KinkyDungeonEvents.js b/Game/KinkyDungeonEvents.js deleted file mode 100644 index b034909a5..000000000 --- a/Game/KinkyDungeonEvents.js +++ /dev/null @@ -1,4172 +0,0 @@ -"use strict"; - - -let KinkyDungeonAttackTwiceFlag = false; -let KinkyDungeonSlimeParts = [ - {group: "ItemHead", restraint: "SlimeHead", noUnmasked: true}, - {group: "ItemMouth", restraint: "SlimeMouth"}, - {group: "ItemArms", restraint: "SlimeArms"}, - {group: "ItemHands", restraint: "SlimeHands"}, - {group: "ItemLegs", restraint: "SlimeLegs"}, - {group: "ItemFeet", restraint: "SlimeFeet"}, - {group: "ItemBoots", restraint: "SlimeBoots"}, -]; -let KDAlertCD = 5; - -let KDEventDataReset = { - -}; - - -let KDEventDataBase = { - SlimeLevel: 0, - SlimeLevelStart: 0, -}; -let KDEventData = Object.assign({}, KDEventDataBase); - -function KDMapHasEvent(map, event) { - return map[event] != undefined; -} - -function KinkyDungeonSendEvent(Event, data, forceSpell) { - KinkyDungeonSendMagicEvent(Event, data, forceSpell); - KinkyDungeonSendWeaponEvent(Event, data); - KinkyDungeonSendInventoryEvent(Event, data); - KinkyDungeonSendBulletEvent(Event, data.bullet, data); - KinkyDungeonSendBuffEvent(Event, data); - KinkyDungeonSendOutfitEvent(Event, data); - KinkyDungeonSendEnemyEvent(Event, data); - KinkyDungeonHandleGenericEvent(Event, data); -} -/** Called during initialization */ -function KinkyDungeonResetEventVariables() { - KinkyDungeonHandleGenericEvent("resetEventVar", {}); -} -/** Called every tick */ -function KinkyDungeonResetEventVariablesTick(delta) { - KDEventDataReset = {}; - KinkyDungeonAttackTwiceFlag = false; - - KinkyDungeonHandleGenericEvent("resetEventVarTick", {delta: delta}); -} - -/** - * Function mapping - * to expand, keep (e, item, data) => {...} as a constant API call - * @type {Object.>} - */ -let KDEventMapInventory = { - "postApply": { - /** - * @param {KDEventData_PostApply} data - */ - "ControlHarness": (e, item, data) => { - let itemAdded = data.item; - let itemtags = KDRestraint(itemAdded)?.shrine; - console.log(itemtags); - // Ignore anything that isnt futuristic - if (itemtags?.includes("Cyber")) { - /*KinkyDungeonSendTextMessage(4, - TextGet("KDControlHarnessTest"), - "#ffffff", - 1, - );*/ - - for (let category of Object.values(KDControlHarnessCategories)) { - if (category.activateTags.some((tag) => {return itemtags.includes(tag);})) { - let restMap = new Map(); - for (let tag of category.activateTags) { - for (let inv of KinkyDungeonGetRestraintsWithShrine(tag, false, true)) { - if (!restMap.has(inv)) { - restMap.set(inv, true); - } - } - } - category.updateFunction(e, item, data, [...restMap.keys()]); - if (restMap.size == category.activateCount) { - // ACTIVATE - category.activateFunction(e, item, data, [...restMap.keys()]); - } - } - } - } - } - }, - "calcOrgThresh": { - "CurseSensitivity": (e, item, data) => { - if (data.player == KinkyDungeonPlayerEntity) { - data.threshold *= e.power; - } - } - }, - "orgasm": { - "CurseSubmission": (e, item, data) => { - if (data.player == KinkyDungeonPlayerEntity) { - KinkyDungeonChangeRep("Ghost", e.power); - KinkyDungeonSendTextMessage(3, TextGet("KDSubmissionCurseApply") - .replace("RESTRAINTNAME", TextGet("Restraint" + item.name)) - , "#ceaaed", 10); - } - }, - "PunishEvent": (e, item, data) => { - if (!e.chance || KDRandom() < e.chance) { - if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); - - KinkyDungeonSendEvent("punish", Object.assign({ - item: item, - type: "orgasm", - kind: e.kind || "low", - }, data)); - - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - }, - }, - "calcPlayChance": { - "CurseAttraction": (e, item, data) => { - if (data.enemy) { - data.playChance += e.power; - if (!data.enemy.playWithPlayer && data.enemy.playWithPlayerCD > 5) { - data.enemy.playWithPlayerCD = 5; - } - } - } - }, - "changeDistraction": { - "multDistractionPos": (e, item, data) => { - if (data.Amount > 0) - data.Amount *= e.power; - }, - }, - "changeWill": { - "multWillPos": (e, item, data) => { - if (data.Amount > 0) - data.Amount *= e.power; - }, - }, - "changeStamina": { - "multStaminaPos": (e, item, data) => { - if (data.Amount > 0) - data.Amount *= e.power; - }, - }, - "getLights": { - "ItemLight": (e, item, data) => { - data.lights.push({brightness: e.power, x: KinkyDungeonPlayerEntity.x, y: KinkyDungeonPlayerEntity.y, color: string2hex(e.color)}); - }, - }, - "onWear": { - "setSkinColor": (e, item, data) => { - if (item == data.item) { - data.color[0] = "#9A7F76"; - if (KinkyDungeonPlayer && KinkyDungeonPlayer.Appearance) { - let color = InventoryGet(KinkyDungeonPlayer, "BodyUpper").Color; - if (color == "Asian") { - data.color[0] = "#8B7B70"; - } else if (color == "Black") { - data.color[0] = "#684832"; - } - } - } - } - }, - "afterDress": { - "PrisonerJacket": (e, item, data) => { - for (let A = 0; A < KinkyDungeonPlayer.Appearance.length; A++) { - let asset = KinkyDungeonPlayer.Appearance[A].Asset; - if (asset.Name == KDRestraint(item).Asset) { - KinkyDungeonPlayer.Appearance[A].Property = { - "Text": "PATIENT", - "Type": "ShortsAndStraps", - "Block": [ - "ItemNipples", - "ItemNipplesPiercings", - "ItemTorso", - "ItemBreast", - "ItemHands", - "ItemVulva", - "ItemVulvaPiercings", - "ItemButt", - "ItemPelvis" - ], - "Hide": [ - "Cloth", - "ClothLower", - "ItemNipplesPiercings", - "ItemVulva", - "ItemVulvaPiercings", - "ItemButt", - "Panties", - "Corset" - ], - "HideItemExclude": [ - "ClothLowerJeans1", - "ClothLowerJeans2", - "ClothLowerLatexPants1", - "ClothLowerLeggings1", - "ClothLowerLeggings2", - "PantiesHarnessPanties1", - "PantiesHarnessPanties2" - ] - }; - } - } - }, - }, - "kill": { - "MikoGhost": (e, item, data) => { - if (!e.chance || KDRandom() < e.chance) { - if (data.enemy && data.enemy.lifetime == undefined && data.enemy.playerdmg && !data.enemy.Enemy.tags.ghost && !data.enemy.Enemy.tags.construct) { - KinkyDungeonSummonEnemy(data.enemy.x, data.enemy.y, "MikoGhost", 1, 1.5, true); - KinkyDungeonSendTextMessage(5, TextGet("KDMikoCollarSummmon"), "purple", 2); - } - } - }, - "DollmakerMask": (e, item, data) => { - // if (item.player == data.player) - if (data.enemy?.Enemy.tags.escapeddoll) KinkyDungeonSetFlag("DollmakerGrace", 70); - }, - }, - "drawSGTooltip": { - "curseInfo": (e, item, data) => { - if (item == data.item || KDRestraint(item)?.Group == data.group) { - let pre = item == data.item ? "" : TextGet("Restraint" + item.name) + ": "; - data.extraLines.push(pre + TextGet("curseInfo" + e.msg)); - data.extraLineColor.push(e.color); - } - }, - }, - "perksBonus": { - "spellDamage": (e, item, data) => { - KDDamageAmpPerksSpell += e.power; - }, - }, - "calcBlind": { - "DollmakerMask": (e, item, data) => { - if (!KinkyDungeonFlags.get("DollmakerGrace")) { - // if item.player == data.player - data.blindness = Math.max(data.blindness, 5); - KinkyDungeonSendTextMessage(2, TextGet("KDDollmakerMaskDim"), "#ff5555", 2, true); - } - }, - }, - - "draw": { - "DollmakerMask": (e, item, data) => { - let altType = KDGetAltType(MiniGameKinkyDungeonLevel); - if (altType && altType.spawns === false) return; - for (let enemy of KinkyDungeonEntities) { - if (enemy.Enemy.tags.escapeddoll - && KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y) < 12) { - KDDraw(kdcanvas, kdpixisprites, enemy.id + "_dolltarg", KinkyDungeonRootDirectory + "UI/DollmakerTarget.png", - (enemy.visual_x - data.CamX - data.CamX_offset - 0.5) * KinkyDungeonGridSizeDisplay, - (enemy.visual_y - data.CamY - data.CamY_offset - 0.5) * KinkyDungeonGridSizeDisplay, - KinkyDungeonSpriteSize * 2, KinkyDungeonSpriteSize * 2, undefined, { - zIndex: 10, - }); - } - } - - }, - }, - "tick": { - "DollmakerMask": (e, item, data) => { - let altType = KDGetAltType(MiniGameKinkyDungeonLevel); - if (altType && altType.spawns === false) return; - if (KDRandom() < 0.1) { - let count = 0; - for (let en of KinkyDungeonEntities) { - if (en.Enemy.tags.escapeddoll) count += 1; - } - if (count < 10) { - // Spawn a new doll - let point = KinkyDungeonGetRandomEnemyPoint(true, false, undefined, 6, 10); - if (point) { - DialogueCreateEnemy(point.x, point.y, "DollmakerTarget"); - } - } - } - }, - "RemoveOnBuffName": (e, item, data) => { - if (KinkyDungeonPlayerBuffs[e.kind] && (!e.chance || KDRandom() < e.chance)) { - item.curse = ""; - KinkyDungeonLock(item, ""); - KinkyDungeonSendTextMessage(5, TextGet("KDRemoveOnDmgType").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); - } - }, - "armorBuff": (e, item, data) => { - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: item.name + "Armor", type: "Armor", power: e.power, duration: 2,}); - }, - "spellWardBuff": (e, item, data) => { - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: item.name + "SpellResist", type: "SpellResist", power: e.power, duration: 2,}); - }, - "sneakBuff": (e, item, data) => { - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: item.name + "Sneak", type: "SlowDetection", power: e.power, duration: 2,}); - }, - "evasionBuff": (e, item, data) => { - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: item.name + "Evasion", type: "Evasion", power: e.power, duration: 2,}); - }, - "buff": (e, item, data) => { - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: item.name + e.buff, type: e.buff, power: e.power, duration: 2, - tags: e.tags, - currentCount: e.mult ? -1 : undefined, - maxCount: e.mult,}); - }, - "restraintBlock": (e, item, data) => { - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: item.name + "Block", type: "RestraintBlock", power: e.power, duration: 2,}); - }, - "ShadowHandTether": (e, item, data) => { - let enemy = (item.tx && item.ty) ? KinkyDungeonEnemyAt(item.tx, item.ty) : undefined; - if (KinkyDungeonFlags.get("ShadowDommed") || (KDGameData.KinkyDungeonLeashedPlayer > 0 && KinkyDungeonLeashingEnemy() && enemy != KinkyDungeonLeashingEnemy())) { - item.tx = undefined; - item.ty = undefined; - } else { - if (item.tx && item.ty && (!enemy || (e.requiredTag && !enemy.Enemy.tags[e.requiredTag]))) { - item.tx = undefined; - item.ty = undefined; - return; - } else { - // The shadow hands will link to a nearby enemy if possible - for (enemy of KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, e.dist)) { - if (!e.requiredTag || enemy.Enemy.tags[e.requiredTag]) { - item.tx = enemy.x; - item.ty = enemy.y; - } - } - } - } - }, - "Buff": (e, item, data) => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: item.name, - type: e.buffType, - power: e.power, - tags: e.tags, - currentCount: e.mult ? -1 : undefined, - maxCount: e.mult, - duration: 2 - }); - }, - "PeriodicTeasing": (e, item, data) => { - if (!data.delta) return; - if (!e.chance || KDRandom() < e.chance) { - if (!KDGameData.CurrentVibration && KDIsVibeCD(e.cooldown)) { - KinkyDungeonStartVibration(item.name, "normal", KDGetVibeLocation(item), e.power, e.time, undefined, undefined, undefined, undefined, e.edgeOnly); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - } - }, - "PeriodicDenial": (e, item, data) => { - if (!data.delta) return; - if (!e.chance || KDRandom() < e.chance) { - if (!KDGameData.CurrentVibration && KDIsVibeCD(e.cooldown)) { - KinkyDungeonStartVibration(item.name, "normal", KDGetVibeLocation(item), e.power, e.time, undefined, 12, undefined, undefined, undefined, false, 0.1, 1.0); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } else { - KinkyDungeonAddVibeModifier(item.name, "tease", KDRestraint(item).Group, 0, 9, e.power, false, true, false, false, true, 0.1, 1.0); - } - } - }, - "AccuracyBuff": (e, item, data) => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: item.name + e.type + e.trigger, - type: "Accuracy", - duration: 1, - power: e.power - }); - }, - "spellRange": (e, item, data) => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: item.name + e.type + e.trigger, - type: "spellRange", - duration: 1, - power: e.power - }); - }, - "SneakBuff": (e, item, data) => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: item.name + e.type + e.trigger, - type: "Sneak", - duration: 1, - power: e.power - }); - }, - "EvasionBuff": (e, item, data) => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: item.name + e.type + e.trigger, - type: "Evasion", - duration: 1, - power: e.power - }); - }, - "AllyHealingAura": (e, item, data) => { - if (!data.delta) return; - let healed = false; - for (let enemy of KinkyDungeonEntities) { - if (KDAllied(enemy) && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) <= e.aoe) { - let origHP = enemy.hp; - enemy.hp = Math.min(enemy.hp + e.power, enemy.Enemy.maxhp); - if (enemy.hp - origHP > 0) { - KinkyDungeonSendFloater(enemy, `+${Math.round((enemy.hp - origHP) * 10)}`, "#44ff77", 3); - healed = true; - } - } - } - if (healed) { - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - }, - "EnchantedAnkleCuffs2": (e, item, data) => { - KinkyDungeonRemoveRestraint(KDRestraint(item).Group); - KinkyDungeonAddRestraint(KinkyDungeonGetRestraintByName("EnchantedAnkleCuffs"), 0, true, undefined, false, undefined, undefined, undefined, item.faction); - }, - "EnchantedAnkleCuffs": (e, item, data) => { - if (KDGameData.AncientEnergyLevel <= 0.0000001) { - KinkyDungeonRemoveRestraint(KDRestraint(item).Group); - KinkyDungeonAddRestraint(KinkyDungeonGetRestraintByName("EnchantedAnkleCuffs2"), 0, true, undefined, false, undefined, undefined, undefined, item.faction); - } - }, - "RegenMana": (e, item, data) => { - if (!e.limit || KinkyDungeonStatMana / KinkyDungeonStatManaMax < e.limit) { - if (e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - KinkyDungeonChangeMana(e.power); - } - }, - "RegenStamina": (e, item, data) => { - if (!e.limit || KinkyDungeonStatStamina / KinkyDungeonStatStaminaMax < e.limit) { - if (e.energyCost && KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax - 0.01) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - KinkyDungeonChangeStamina(e.power); - } - }, - "ApplySlowLevelBuff": (e, item, data) => { - if (item.type === Restraint) { - if (KinkyDungeonPlayerBuffs[item.name + e.type + e.trigger]) delete KinkyDungeonPlayerBuffs[item.name + e.type + e.trigger]; - KinkyDungeonCalculateSlowLevel(0); - if (KinkyDungeonSlowLevel > 0) { - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: item.name + e.type + e.trigger, - type: "SlowLevel", - duration: 2, - power: e.power - }); - } - } - }, - "AlertEnemies": (e, item, data) => { - if (!data.delta) return; - if (!e.chance || KDRandom() < e.chance) { - KinkyDungeonAlert = Math.max(KinkyDungeonAlert, e.power); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonAlertEnemies").replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - }, - "iceDrain": (e, item, data) => { - if (!data.delta) return; - if (e.power) { - KinkyDungeonChangeMana(e.power); - KinkyDungeonChangeStamina(e.power); - KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonIceDrain"), "lightblue", 2, true); - } - }, - "crystalDrain": (e, item, data) => { - if (!data.delta) return; - if (e.power) { - KinkyDungeonChangeMana(e.power); - KinkyDungeonChangeDistraction(-e.power * 3 * KDBuffResist(KinkyDungeonPlayerBuffs, "soul"), false, 0.1); - KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonCrystalDrain"), "lightblue", 2, true); - } - }, - "tickleDrain": (e, item, data) => { - if (!data.delta) return; - if (e.power) { - KinkyDungeonChangeDistraction(-e.power * KDBuffResist(KinkyDungeonPlayerBuffs, "tickle"), false, 0.01); - KinkyDungeonSendTextMessage(0.5, TextGet("KinkyDungeonTickleDrain"), "lightblue", 2, true); - } - }, - "barrelDebuff": (e, item, data) => { - if (!data.delta) return; - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "Counterbarrel", type: "SlowDetection", duration: 1, power: -10, player: true, enemies: true, endSleep: true, tags: ["SlowDetection", "move", "cast"]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "Counterbarrel3", type: "Sneak", duration: 1, power: -10, player: true, enemies: true, endSleep: true, tags: ["Sneak", "move", "cast"]}); - }, - "cageDebuff": (e, item, data) => { - if (!data.delta) return; - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "Countercage", type: "SlowDetection", duration: 1, power: -5, player: true, enemies: true, endSleep: true, tags: ["SlowDetection", "move", "cast"]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "Countercage2", type: "Sneak", duration: 1, power: -10, player: true, enemies: true, endSleep: true, tags: ["Sneak", "move", "cast"]}); - }, - "callGuard": (e, item, data) => { - if (!data.delta) return; - if (!KinkyDungeonFlags.has("GuardCalled") && KDRandom() < 0.25) { - KinkyDungeonSetFlag("GuardCalled", 35); - console.log("Attempting to call guard"); - if (KinkyDungeonEntities.length < 400) { - console.log("Called guard"); - KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, true); - } - } - }, - "callGuardFurniture": (e, item, data) => { - if (!data.delta) return; - if (!KinkyDungeonFlags.has("GuardCalled") && KDRandom() < (e.chance ? e.chance : 0.1)) { - KinkyDungeonSetFlag("GuardCalled", 35); - console.log("Attempting to call guard"); - if (KinkyDungeonEntities.length < 400 || KDGameData.CagedTime > KDMaxCageTime) { - console.log("Called guard"); - let requireTags = null; - if (KinkyDungeonFlags.has("callGuardJailerOnly")) { - requireTags = ["jailer"]; - } - let ee = KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, true, requireTags); - if (ee) { - let point = KinkyDungeonGetRandomEnemyPoint(true); - if (point) { - ee.x = point.x; - ee.y = point.y; - } - } - if (ee && (KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail')) { - ee.IntentAction = 'freeFurniture'; - ee.playWithPlayer = 12; - //if (KDGameData.CagedTime > KDMaxCageTime * 10) { - //} - } - } - } - let guard = KinkyDungeonJailGuard(); - if (guard && !KinkyDungeonFlags.has("guardTP") && KDGameData.CagedTime > KDMaxCageTime && KDistChebyshev(guard.x - KinkyDungeonPlayerEntity.x, guard.y - KinkyDungeonPlayerEntity.y) > 4) { - DialogueBringSpecific(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, guard); - KinkyDungeonSetFlag("guardTP", 20); - } - }, - "slimeSpread": (e, item, data) => { - if (!data.delta) return; - let mult = 0.4 * Math.max(0.25, Math.min(2.0, - KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist")))); - KDEventData.SlimeLevel = Math.max(KDEventData.SlimeLevel, KDEventData.SlimeLevelStart + e.power * mult); - if (KDEventData.SlimeLevel >= 0.99999) { - KDEventData.SlimeLevel = 0; - KDEventData.SlimeLevelStart = -100; - let slimedParts = []; - let potentialSlimeParts = []; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).slimeLevel > 0) { - slimedParts.push({ - name: KDRestraint(inv).name, - group: KDRestraint(inv).Group, - level: KDRestraint(inv).slimeLevel - }); - } - } - for (let slime of slimedParts) { - let index = -1; - for (let i = 0; i < KinkyDungeonSlimeParts.length; i++) if (KinkyDungeonSlimeParts[i].group === slime.group) { - index = i; - break; - } - if (index >= 0) { - let slime2 = undefined; - let slime3 = undefined; - if (index > 0) { - for (let s of potentialSlimeParts) if (s.group === KinkyDungeonSlimeParts[index - 1].group && !(s.level > slime.level)) { - slime2 = s; - break; - } - if (!slime2 && (!KinkyDungeonStatsChoice.has("Unmasked") || !KinkyDungeonSlimeParts[index - 1].noUnmasked)) potentialSlimeParts.push({ - group: KinkyDungeonSlimeParts[index - 1].group, - restraint: (e.restraint ? e.restraint : "") + KinkyDungeonSlimeParts[index - 1].restraint, - level: slime.level - }); - } - if (index < KinkyDungeonSlimeParts.length - 1) { - for (let s of potentialSlimeParts) if (s.group === KinkyDungeonSlimeParts[index + 1].group && !(s.level > slime.level)) { - slime3 = s; - break; - } - if (!slime3 && (!KinkyDungeonStatsChoice.has("Unmasked") || !KinkyDungeonSlimeParts[index + 1].noUnmasked)) potentialSlimeParts.push({ - group: KinkyDungeonSlimeParts[index + 1].group, - restraint: (e.restraint ? e.restraint : "") + KinkyDungeonSlimeParts[index + 1].restraint, - level: slime.level - }); - } - } - } - let slimed = false; - if (potentialSlimeParts.length === 0) { - KDEventData.SlimeLevel = Math.min(KDEventData.SlimeLevel, 0.5); - KDEventData.SlimeLevelStart = Math.min(KDEventData.SlimeLevelStart, 0.5); - } - else while (potentialSlimeParts.length > 0) { - let newSlime = potentialSlimeParts[Math.floor(KDRandom() * potentialSlimeParts.length)]; - if (newSlime) { - let added = KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(newSlime.restraint), 0, true); - if (added) { - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSlimeSpread"), "#ff44ff", 3); - potentialSlimeParts = []; - KDEventData.SlimeLevel = -100; - slimed = true; - } - } - potentialSlimeParts.splice(potentialSlimeParts.indexOf(newSlime), 1); - } - if (!slimed && potentialSlimeParts.length === 0) { - let slime = slimedParts[Math.floor(KDRandom() * slimedParts.length)]; - if (KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("Hard" + slime.name), 0, true)) { - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSlimeHarden"), "#ff44ff", 3); - let slimesuit = (e.restraint ? e.restraint : "") + "SlimeSuit"; - - if (KinkyDungeonCurrentDress !== slimesuit) { - KinkyDungeonSetDress(slimesuit, ""); - KinkyDungeonDressPlayer(); - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSlimeSpread"), "#ff44ff", 3); - } - } - KDEventData.SlimeLevel = -100; - } - } - } - }, - "remove": { - "slimeStop": (e, item, data) => { - if (data.item === item) KDEventData.SlimeLevel = 0; - }, - "unlinkItem": (e, item, data) => { - if (data.item === item && !data.add && !data.shrine) { - console.log("Deprecated function"); - console.log(Event, e, item, data); - console.trace(); - } - }, - }, - "postRemoval": { - "replaceItem": (e, item, data) => { - if (data.item === item && !data.add && !data.shrine && e.list) { - for (let restraint of e.list) { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(restraint), e.power, true, e.lock, data.keep); - } - } - }, - "RequireBaseArmCuffs": (e, item, data) => { - if (data.item !== item && KDRestraint(item).Group) { - let cuffsbase = false; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("ArmCuffsBase"))) { - cuffsbase = true; - break; - } else if (inv.dynamicLink) { - let link = inv.dynamicLink; - // Recursion thru to make sure we have an armbinder buried in there... somewhere - for (let i = 0; i < 20; i++) { - if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes("ArmCuffsBase"))) { - cuffsbase = true; - break; - } - if (link.dynamicLink) link = link.dynamicLink; - else i = 200; - } - } - } - if (!cuffsbase) { - KinkyDungeonRemoveRestraint(KDRestraint(item).Group, false, false, false); - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveCuffs"), "lightgreen", 2); - } - } - }, - "RequireCollar": (e, item, data) => { - if (data.item !== item && KDRestraint(item).Group) { - let collar = false; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("Collars"))) { - collar = true; - break; - } - } - if (!collar) { - KinkyDungeonRemoveRestraint(KDRestraint(item).Group, false, false, false); - } - } - }, - "RequireBaseAnkleCuffs": (e, item, data) => { - if (data.item !== item && KDRestraint(item).Group) { - let cuffsbase = false; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("AnkleCuffsBase"))) { - cuffsbase = true; - break; - } else if (inv.dynamicLink) { - let link = inv.dynamicLink; - // Recursion thru to make sure we have an armbinder buried in there... somewhere - for (let i = 0; i < 20; i++) { - if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes("AnkleCuffsBase"))) { - cuffsbase = true; - break; - } - if (link.dynamicLink) link = link.dynamicLink; - else i = 200; - } - } - } - if (!cuffsbase) { - KinkyDungeonRemoveRestraint(KDRestraint(item).Group, false, false, false); - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveCuffs"), "lightgreen", 2); - } - } - }, - "RequireBaseLegCuffs": (e, item, data) => { - if (data.item !== item && KDRestraint(item).Group) { - let cuffsbase = false; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("LegCuffsBase"))) { - cuffsbase = true; - break; - } else if (inv.dynamicLink) { - let link = inv.dynamicLink; - // Recursion thru to make sure we have an armbinder buried in there... somewhere - for (let i = 0; i < 20; i++) { - if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes("LegCuffsBase"))) { - cuffsbase = true; - break; - } - if (link.dynamicLink) link = link.dynamicLink; - else i = 200; - } - } - } - if (!cuffsbase) { - KinkyDungeonRemoveRestraint(KDRestraint(item).Group, false, false, false); - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveCuffs"), "lightgreen", 2); - } - } - }, - "armbinderHarness": (e, item, data) => { - if (data.item !== item && KDRestraint(item).Group) { - let armbinder = false; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("Armbinders") || KDRestraint(inv).shrine.includes("Boxbinders"))) { - armbinder = true; - break; - } else if (inv.dynamicLink) { - let link = inv.dynamicLink; - // Recursion thru to make sure we have an armbinder buried in there... somewhere - for (let i = 0; i < 10; i++) { - if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes("Armbinders") || KDRestraint(link).shrine.includes("Boxbinders"))) { - armbinder = true; - break; - } - if (link.dynamicLink) link = link.dynamicLink; - else i = 10; - } - } - } - if (!armbinder) { - KinkyDungeonRemoveRestraint(KDRestraint(item).Group, false, false, false); - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveArmbinderHarness"), "lightgreen", 2); - } - } - } - }, - "hit": { - "linkItem": (e, item, data) => { - if ((data.attack && data.attack.includes("Bind") && (!data.enemy || data.enemy.Enemy.bound) && !data.attack.includes("Suicide"))) { - let added = false; - if (data.restraintsAdded) { - for (let r of data.restraintsAdded) { - if (r.name === item.name) { - added = true; - break; - } - } - } - if (!added) { - let subMult = 1; - let chance = e.chance ? e.chance : 1.0; - if (e.subMult !== undefined) { - let rep = (KinkyDungeonGoddessRep.Ghost + 50) / 100; - subMult = 1.0 + e.subMult * rep; - } - if (e.tags?.includes("lowwill") && KinkyDungeonStatWill < 0.1) chance = 1.0; - if (item && KDRestraint(item).Link && (KDRandom() < chance * subMult) && (!e.noLeash || KDGameData.KinkyDungeonLeashedPlayer < 1)) { - let newRestraint = KinkyDungeonGetRestraintByName(KDRestraint(item).Link); - //KinkyDungeonLinkItem(newRestraint, item, item.tightness, ""); - if (KDToggles.Sound && e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - KinkyDungeonAddRestraint(newRestraint, item.tightness, true, "", false, undefined, undefined, undefined, item.faction); - } - } - } - } - }, - "beforePlayerDamage": { - "RemoveOnDmg": (e, item, data) => { - let t = data.type; - if (KDDamageEquivalencies[data.type]) t = KDDamageEquivalencies[data.type]; - if (data.type && t == e.damage && data.dmg) { - if (!e.power || data.dmg >= e.power) { - // Increase damage count - let count = getItemDataNumber(item, e.kind) || 0; - count = count + Math.max(data.dmg || 1, 1); - setItemDataNumber(item, e.kind, count); - // Evaluate damage count - if (!e.count || count >= e.count) { - item.curse = ""; - KinkyDungeonLock(item, ""); - KinkyDungeonSendTextMessage(5, TextGet("KDRemoveOnDmgType").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); - } else { - KinkyDungeonSendTextMessage(5, TextGet("KDRemoveOnDmgTypePartial").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); - } - } - } - }, - "linkItemOnDamageType": (e, item, data) => { - if (data.type && data.type == e.damage && data.dmg) { - let subMult = 1; - let chance = e.chance ? e.chance : 1.0; - if (item && KDRestraint(item).Link && KDRandom() < chance * subMult) { - let prereq = KDEventPrereq(e.requiredTag); - if (prereq) { - let newRestraint = KinkyDungeonGetRestraintByName(KDRestraint(item).Link); - //KinkyDungeonLinkItem(newRestraint, item, item.tightness, ""); - if (KDToggles.Sound && e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - KinkyDungeonAddRestraint(newRestraint, item.tightness, true, "", false, undefined, undefined, undefined, item.faction); - } - } - } - }, - "lockItemOnDamageType": (e, item, data) => { - if (data.type && data.type == e.damage && data.dmg) { - let subMult = 1; - let chance = e.chance ? e.chance : 1.0; - if (item && KinkyDungeonGetLockMult(e.lock) > KinkyDungeonGetLockMult(item.lock) && KDRandom() < chance * subMult) { - let prereq = KDEventPrereq(e.requiredTag); - if (prereq) { - KinkyDungeonLock(item, e.lock); - } - } - } - }, - }, - "miss": { - "EnergyCost": (e, item, data) => { - if (e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - }, - "calcEvasion": { - "HandsFree": (e, item, data) => { - if (data.flags.KDEvasionHands) { - data.flags.KDEvasionHands = false; - if (data.cost && e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - }, - "BlindFighting": (e, item, data) => { - if (data.flags.KDEvasionSight) { - data.flags.KDEvasionSight = false; - if (data.cost && e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - } - }, - "beforePlayerAttack": { - "BoostDamage": (e, item, data) => { - data.buffdmg = Math.max(0, data.buffdmg + e.power); - if (e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - }, - }, - "beforeDamage": { - "ModifyDamageFlat": (e, item, data) => { - if (data.damage > 0) { - if (!e.chance || KDRandom() < e.chance) { - data.damage = Math.max(data.damage + e.power, 0); - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - } - }, - }, - "beforeDamageEnemy": { - "MultiplyDamageStealth": (e, item, data) => { - if (data.dmg > 0 && data.enemy && KDHostile(data.enemy) && !data.enemy.aware) { - if (!e.chance || KDRandom() < e.chance) { - let dmg = Math.max(0, Math.min(data.enemy.hp, data.dmg)); - if (e.energyCost && e.power > 1) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost * dmg * (e.power - 1)); - data.dmg = Math.max(data.dmg * e.power, 0); - } - } - }, - "AddDamageStealth": (e, item, data) => { - if (data.dmg > 0 && data.enemy && KDHostile(data.enemy) && !data.enemy.aware) { - if (!e.chance || KDRandom() < e.chance) { - if (e.energyCost && e.power > 1) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost * (e.power - 1)); - data.dmg = Math.max(data.dmg + e.power, 0); - } - } - }, - "MultiplyDamageStatus": (e, item, data) => { - if (data.dmg > 0 && data.enemy && KDHostile(data.enemy) && (KinkyDungeonHasStatus(data.enemy))) { - if (!e.chance || KDRandom() < e.chance) { - let dmg = Math.max(0, Math.min(data.enemy.hp, data.dmg)); - if (e.energyCost && e.power > 1) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost * dmg * (e.power - 1)); - data.dmg = Math.max(data.dmg * e.power, 0); - } - } - }, - "MultiplyDamageMagic": (e, item, data) => { - if (data.dmg > 0 && data.incomingDamage && !KinkyDungeonMeleeDamageTypes.includes(data.incomingDamage.type)) { - if (!e.chance || KDRandom() < e.chance) { - let dmg = Math.max(0, Math.min(data.enemy.hp, data.dmg)); - if (e.energyCost && e.power > 1) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost * dmg * (e.power - 1)); - data.dmg = Math.max(data.dmg * e.power, 0); - } - } - } - }, - "defeat": { - "linkItem": (e, item, data) => { - if (item && KDRestraint(item).Link && (KDRandom() < e.chance)) { - let newRestraint = KinkyDungeonGetRestraintByName(KDRestraint(item).Link); - KinkyDungeonAddRestraint(newRestraint, item.tightness, true, "", false, undefined, undefined, undefined, item.faction); - //KinkyDungeonLinkItem(newRestraint, item, item.tightness, ""); - } - }, - "Kittify": (e, item, data) => { - // get defeat, upgrade suit - KinkyDungeonRemoveRestraint("ItemArms",false,false,true,false); - KinkyDungeonAddRestraint(KinkyDungeonGetRestraintByName("KittyPetSuit"), 15, undefined, undefined, undefined, undefined, undefined, undefined, item.faction); - // leash if collared - let collared = InventoryGet(KinkyDungeonPlayer, "ItemNeck"); - if(collared != null){ - KinkyDungeonAddRestraint(KinkyDungeonGetRestraintByName("BasicLeash"), 1, false, "Red", undefined, undefined, undefined, undefined, item.faction); - } - }, - }, - "struggle": { - "crotchrope": (e, item, data) => { - if (data.restraint && data.restraint.type === Restraint && KDRestraint(data.restraint).crotchrope && data.struggleType === "Struggle" && data.struggleType === "Remove") { - KinkyDungeonChangeDistraction(1, false, 0.5); - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonCrotchRope").replace("RestraintName", TextGet("Restraint" + data.restraint.name)), "pink", 3); - } - }, - "VibeOnStruggle": (e, item, data) => { - if ((!e.chance || KDRandom() < e.chance) && data.struggleType === "Struggle") { - if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); - - KinkyDungeonSendEvent("punish", Object.assign({ - item: item, - type: "struggle", - kind: e.kind || "low", - }, data)); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - }, - "celestialRopePunish": (e, item, data) => { - if (data.restraint && item === data.restraint) { - KinkyDungeonChangeDistraction(3); - KinkyDungeonChangeMana(-1); - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind + 1, 2); - - for (let A = 0; A < KinkyDungeonPlayer.Appearance.length; A++) { - if (KinkyDungeonPlayer.Appearance[A].Asset.Group.Name === "Eyes" || KinkyDungeonPlayer.Appearance[A].Asset.Group.Name === "Eyes2") { - let property = KinkyDungeonPlayer.Appearance[A].Property; - if (!property || property.Expression !== "Surprised") { - KinkyDungeonPlayer.Appearance[A].Property = {Expression: "Surprised"}; - KDRefresh = true; - } - } - } - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonCelestialPunish" + Math.floor(KDRandom() * 3)), "#ff0000", 2); - } - }, - "crystalPunish": (e, item, data) => { - if (data.restraint && item === data.restraint) { - KinkyDungeonChangeDistraction(1, false, 0.1); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonCrystalPunish" + Math.floor(KDRandom() * 3)), "#ff0000", 2); - } - }, - "PunishPlayer": (e, item, data) => { - if (data.restraint && item === data.restraint) { - if (KDRandom() < e.chance || (KDGameData.WarningLevel > 2 && KDRandom() < e.warningchance)) { - if (e.stun && KDGameData.WarningLevel > 2) { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints - 1); // This is to prevent stunlock while slowed heavily - } - KDGameData.WarningLevel += 1; - KinkyDungeonDealDamage({damage: e.power, type: e.damage}); - KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer") + (KDGameData.WarningLevel > 2 ? "Harsh" : "")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - } - } - }, - "beforeStruggleCalc": { - "boostWater": (e, item, data) => { - if (KinkyDungeonPlayerBuffs.Drenched && KinkyDungeonPlayerBuffs.Drenched.duration > 0) { - data.escapeChance += e.power; - let msg = e.msg ? e.msg : "KinkyDungeonDrenchedSlimeBuff"; - if (msg) { - KinkyDungeonSendTextMessage(5, TextGet(msg).replace("RestraintName", TextGet("Restraint" + data.restraint.name)), "lightgreen", 2); - } - } - }, - "ShockForStruggle": (e, item, data) => { - if (data.struggleType === "Struggle") { - if (KDRandom() < e.chance || (KDGameData.WarningLevel > 2 && KDRandom() < e.warningchance) || data.group == "ItemNeck") { - if (e.stun && KDGameData.WarningLevel > 2) { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints - 1); // This is to prevent stunlock while slowed heavily - } - data.escapePenalty += e.bind ? e.bind : 0.1; - KDGameData.WarningLevel += 1; - KinkyDungeonDealDamage({damage: e.power, type: e.damage}); - KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer") + (KDGameData.WarningLevel > 2 ? "Harsh" : "")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - } - }, - "elbowCuffsBlock": (e, item, data) => { - if (data.restraint && item != data.restraint && !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && KDRestraint(data.restraint).shrine.includes("ArmCuffsBase")) { - data.escapePenalty += e.power ? e.power : 1.0; - KinkyDungeonSendTextMessage(10, TextGet("KDElbowCuffsBlock" + Math.floor(KDRandom() * 3)), "#ff0000", 2); - } - }, - "vibeStruggle": (e, item, data) => { - if (KinkyDungeonHasCrotchRope && !KinkyDungeonPlayerTags.get("ChastityLower") && data.restraint && item == data.restraint && !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && (KinkyDungeonIsHandsBound(false, false, 0.45) || KinkyDungeonIsArmsBound())) { - data.escapePenalty += data.escapeChance; - KinkyDungeonSendTextMessage(10, TextGet("KDCrotchRopeBlock" + Math.floor(KDRandom() * 3)), "#ff0000", 2); - } - }, - "struggleDebuff": (e, item, data) => { - if (e.StruggleType == data.struggleType && data.restraint && item != data.restraint && KDRestraint(data.restraint)?.shrine?.includes(e.requiredTag)) { - data.escapePenalty += e.power; - if (e.msg) - KinkyDungeonSendTextMessage(2, TextGet(e.msg), "#ff5555", 2); - } - }, - "obsidianDebuff": (e, item, data) => { - if (data.restraint && data.struggleType === "Struggle" && item != data.restraint && !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && KDRestraint(data.restraint).shrine.includes("Obsidian")) { - data.escapePenalty += e.power ? e.power : 0.075; - KinkyDungeonSendTextMessage(5, TextGet("KDObsidianDebuff" + Math.floor(KDRandom() * 3)), "#8800aa", 2, true); - } - }, - "latexDebuff": (e, item, data) => { - if (data.restraint && data.struggleType === "Struggle" && item != data.restraint && KDRestraint(data.restraint).shrine.includes("Latex")) { - data.escapePenalty += e.power ? e.power : 0.075; - KinkyDungeonSendTextMessage(5, TextGet("KDLatexDebuff" + Math.floor(KDRandom() * 3)), "#38a2c3", 2, true); - } - }, - "shadowBuff": (e, item, data) => { - if (data.restraint && data.struggleType === "Struggle" && item == data.restraint) { - - let brightness = KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - if (brightness > 4) { - data.escapeChance += 0.1 * brightness; - KinkyDungeonSendTextMessage(7, TextGet("KDShadowBuff"), "#99ff99", 2, true); - } - - - } - }, - "wristCuffsBlock": (e, item, data) => { - if (data.restraint && item != data.restraint && !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && KDRestraint(data.restraint).shrine.includes("ArmCuffsBase")) { - data.escapePenalty += e.power ? e.power : 0.075; - KinkyDungeonSendTextMessage(5, TextGet("KDWristCuffsBlock" + Math.floor(KDRandom() * 3)), "#ff0000", 2); - } - }, - }, - "sprint": { - "MotionSensitive": (e, item, data) => { - if (!e.chance || KDRandom() < e.chance) { - if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); - - KinkyDungeonSendEvent("punish", Object.assign({ - item: item, - type: "sprint", - kind: e.kind || "low", - }, data)); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - }, - }, - "playerAttack": { - "MotionSensitive": (e, item, data) => { - if (!e.chance || KDRandom() < e.chance) { - if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); - - KinkyDungeonSendEvent("punish", Object.assign({ - item: item, - type: "attack", - kind: e.kind || "low", - }, data)); - - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - }, - "ShadowHeel": (e, item, data) => { - if (data.targetX && data.targetY && !(data.enemy && data.enemy.Enemy && KDAllied(data.enemy))) { - KinkyDungeonCastSpell(data.targetX, data.targetY, KinkyDungeonFindSpell("HeelShadowStrike", true), undefined, undefined, undefined); - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - }, - "AlertEnemies": (e, item, data) => { - if (KDAlertCD < 1 && data.enemy && (!e.chance || KDRandom() < e.chance)) { // (data.damage && data.damage.damage && data.enemy.hp > data.enemy.Enemy.maxhp - data.damage.damage*2 - 1) - KinkyDungeonAlert = Math.max(KinkyDungeonAlert, e.power); - KDAlertCD = 5; - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonAlertEnemies").replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - }, - "PunishPlayer": (e, item, data) => { - if (item.type === Restraint && data.targetX && data.targetY && data.enemy && !(data.enemy && data.enemy.Enemy && KDAllied(data.enemy)) && (!KinkyDungeonHiddenFactions.includes(KDGetFaction(data.enemy)) || KDGetFaction(data.enemy) == "Enemy")) { - if (KDRandom() < e.chance || (KDGameData.WarningLevel > 2 && KDRandom() < e.warningchance)) { - if (e.stun && KDGameData.WarningLevel > 2) { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints - 1); // This is to prevent stunlock while slowed heavily - } - KDGameData.WarningLevel += 1; - KinkyDungeonDealDamage({damage: e.power, type: e.damage}); - KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer") + (KDGameData.WarningLevel > 2 ? "Harsh" : "")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - } - }, - "cursePunish": (e, item, data) => { - if (item.type === Restraint && data.targetX && data.targetY && data.enemy && !(data.enemy && data.enemy.Enemy && KDAllied(data.enemy)) && (!KinkyDungeonHiddenFactions.includes(KDGetFaction(data.enemy)) || KDGetFaction(data.enemy) == "Enemy")) { - if (!e.chance || KDRandom() < e.chance) { - if (e.stun) { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints - 1); // This is to prevent stunlock while slowed heavily - } - KinkyDungeonDealDamage({damage: e.power, type: e.damage}); - if (!data.cursePunish) { - KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - data.cursePunish = true; - } - } - }, - "armorNoise": (e, item, data) => { - if (item.type === Restraint && data.targetX && data.targetY && data.enemy && !data.armorNoise) { - if (!e.chance || KDRandom() < e.chance ) { - KinkyDungeonMakeNoise(e.dist, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - - KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `${TextGet("KDArmorNoise")}`, "#ffffff", 5); - data.armorNoise = true; - } - } - }, - }, - "calcMiscast": { - "ReduceMiscastFlat": (e, item, data) => { - if (data.miscastChance > 0) { - data.miscastChance -= e.power; - } - } - }, - "remoteVibe": { - "RemoteActivatedVibe": (e, item, data) => { - if (!KDGameData.CurrentVibration) { - KinkyDungeonStartVibration(item.name, "tease", KDGetVibeLocation(item), e.power, e.time, undefined, undefined, undefined, undefined, e.edgeOnly); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonStartVibeRemote").replace("EnemyName", TextGet("Name" + data.enemy)), "pink", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - } - }, - "remotePunish": { - "RemoteActivatedShock": (e, item, data) => { - /** @type {entity} */ - const enemy = data.enemy; - if (!enemy || KDRandom() >= (enemy.Enemy.RemoteControl?.punishRemoteChance || 0.25) || KDEnemyHasFlag(enemy, "remoteShockCooldown") || (e.noLeash && KDGameData.KinkyDungeonLeashedPlayer >= 1)) { - return; - } - // 7 tick cooldown stops it feeling overly spammy - KinkyDungeonSetEnemyFlag(enemy, "remoteShockCooldown", 7); - if (e.stun) { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints - 1); // This is to prevent stunlock while slowed heavily - } - KinkyDungeonDealDamage({damage: e.power, type: e.damage}); - const msg = TextGet(e.msg ? e.msg : "KinkyDungeonRemoteShock") - .replace("RestraintName", TextGet(`Restraint${item.name}`)) - .replace("EnemyName", TextGet(`Name${enemy.Enemy.name}`)); - KinkyDungeonSendTextMessage(5, msg, "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(`${KinkyDungeonRootDirectory}/Audio/${e.sfx}.ogg`); - }, - "RemoteLinkItem": (e, item, data) => { - const enemy = data.enemy; - if (KDRandom() >= (enemy.Enemy.RemoteControl?.punishRemoteChance || 0.1) || (e.noLeash && KDGameData.KinkyDungeonLeashedPlayer >= 1)) { - return; - } - - const newRestraint = KinkyDungeonGetRestraintByName(KDRestraint(item).Link); - if (e.sfx) KinkyDungeonPlaySound(`${KinkyDungeonRootDirectory}/Audio/${e.sfx}.ogg`); - - KinkyDungeonAddRestraint(newRestraint, item.tightness, true, "", false, undefined, undefined, undefined, item.faction, undefined, undefined, undefined, false); - - if (e.enemyDialogue) { - const dialogue = KinkyDungeonGetTextForEnemy(e.enemyDialogue, enemy); - KinkyDungeonSendDialogue(enemy, dialogue, KDGetColor(enemy), 2, 4); - } - - if (e.msg) { - const msg = TextGet(e.msg) - .replace("RestraintName", TextGet(`Restraint${item.name}`)) - .replace("EnemyName", TextGet(`Name${enemy.Enemy.name}`)); - KinkyDungeonSendTextMessage(5, msg, "#ff8800", 2); - } - } - }, - "playerMove": { - "removeOnMove": (e, item, data) => { - if (!e.chance || KDRandom() < e.chance) { - if (!e.prereq || KDCheckPrereq(KinkyDungeonPlayerEntity)) { - KinkyDungeonRemoveRestraint(KDRestraint(item).Group, false, false); - } - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - }, - }, - "punish": { - /** If this item is the one to do it it will vibe */ - "PunishSelf": (e, item, data) => { - if (item == data.item && (!e.kind || data.kind == e.kind) && (!e.requireTags || e.requireTags.includes(data.kind)) && (!e.filterTags || !e.filterTags.includes(data.kind))) { - if (!e.chance || KDRandom() < e.chance) { - if (!KDGameData.CurrentVibration) { - KinkyDungeonStartVibration(item.name, "tease", KDGetVibeLocation(item), e.power, e.time, undefined, undefined, undefined, undefined, e.edgeOnly); - } else { - KinkyDungeonAddVibeModifier(item.name, "reinforce", KDRestraint(item).Group, 1, e.time); - } - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - } - }, - /** If this item is the one to do it it will vibe */ - "PunishShock": (e, item, data) => { - if (item == data.item && (!e.kind || data.kind == e.kind) && (!e.requireTags || e.requireTags.includes(data.kind)) && (!e.filterTags || !e.filterTags.includes(data.kind))) { - if (!e.chance || KDRandom() < e.chance) { - KinkyDungeonDealDamage({damage: e.power, type: e.damage}); - if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - } - }, - }, - - "playSelf": { - "PunishEvent": (e, item, data) => { - if (!e.chance || KDRandom() < e.chance) { - if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); - KinkyDungeonSendEvent("punish", Object.assign({ - item: item, - type: "playSelf", - kind: e.kind || "low", - }, data)); - - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - }, - }, - "playerCast": { - "MagicallySensitive": (e, item, data) => { - if (!e.chance || KDRandom() < e.chance) { - if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); - - KinkyDungeonSendEvent("punish", Object.assign({ - item: item, - type: "cast", - kind: e.kind || "low", - }, data)); - - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - }, - "AlertEnemies": (e, item, data) => { - if (!e.chance || KDRandom() < e.chance) { - KinkyDungeonAlert = Math.max(KinkyDungeonAlert, e.power); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonAlertEnemies").replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - }, - "PunishPlayer": (e, item, data) => { - if (data.spell && item.type === Restraint && (!e.punishComponent || (data.spell.components && data.spell.components.includes(e.punishComponent)))) { - if (KDRandom() < e.chance || (KDGameData.WarningLevel > 2 && KDRandom() < e.warningchance)) { - if (e.stun && KDGameData.WarningLevel > 2) { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints - 1); // This is to prevent stunlock while slowed heavily - } - KDGameData.WarningLevel += 1; - KinkyDungeonDealDamage({damage: e.power, type: e.damage}); - KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer") + (KDGameData.WarningLevel > 2 ? "Harsh" : "")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - } - }, - "cursePunish": (e, item, data) => { - if (data.spell && item.type === Restraint && (!e.punishComponent || (data.spell.components && data.spell.components.includes(e.punishComponent)))) { - if (!e.chance || KDRandom() < e.chance ) { - if (e.stun) { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints - 1); // This is to prevent stunlock while slowed heavily - } - KinkyDungeonDealDamage({damage: e.power, type: e.damage}); - if (!data.cursePunish) { - KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - data.cursePunish = true; - } - } - }, - "armorNoise": (e, item, data) => { - if (data.spell && item.type === Restraint && (!e.punishComponent || (data.spell.components && data.spell.components.includes(e.punishComponent))) && !data.armorNoise) { - if (!e.chance || KDRandom() < e.chance ) { - KinkyDungeonMakeNoise(e.dist, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8800", 2); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - - KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `${TextGet("KDArmorNoise")}`, "#ffffff", 5); - data.armorNoise = true; - } - } - }, - } -}; - -/** - * - * @param {string} Event - * @param {KinkyDungeonEvent} kinkyDungeonEvent - * @param {item} item - * @param {*} data - */ -function KinkyDungeonHandleInventoryEvent(Event, kinkyDungeonEvent, item, data) { - if (Event === kinkyDungeonEvent.trigger && KDEventMapInventory[Event] && KDEventMapInventory[Event][kinkyDungeonEvent.type]) { - KDEventMapInventory[Event][kinkyDungeonEvent.type](kinkyDungeonEvent, item, data); - } -} - - -/** - * @type {Object.>} - */ -let KDEventMapBuff = { - "beforeDamageEnemy": { - "Conduction": (e, buff, entity, data) => { - if (data.enemy == entity && (!data.flags || !data.flags.includes("EchoDamage")) && data.dmg > 0 && (!e.damage || e.damage == data.type)) { - if (!e.chance || KDRandom() < e.chance) { - let maxSprites = 7; - let sprites = 0; - for (let enemy of KinkyDungeonEntities) { - if (enemy.buffs && enemy.buffs.Conduction && enemy != data.enemy && enemy.hp > 0 && KDistEuclidean(enemy.x - data.enemy.x, enemy.y - data.enemy.y) <= e.aoe) { - KinkyDungeonDamageEnemy(enemy, { - type: e.damage, - damage: data.dmg * e.power, - flags: ["EchoDamage"] - }, false, true, undefined, undefined, undefined, "Rage"); - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Conduction.ogg"); - let dist = KDistEuclidean(enemy.x - data.enemy.x, enemy.y - data.enemy.y); - let tx = enemy.x; - let ty = enemy.y; - if (dist > 0 && sprites < maxSprites) - for (let d = dist/2.99; d < dist; d += dist/2.99) { - let xx = entity.x + d * (tx - entity.x); - let yy = entity.y + d * (ty - entity.y); - let newB = {born: 0, time:1 + Math.round(KDRandom()*1), x:Math.round(xx), y:Math.round(yy), vx:0, vy:0, xx:xx, yy:yy, spriteID: KinkyDungeonGetEnemyID() + "ElectricEffect" + CommonTime(), - bullet:{faction: "Rage", spell:undefined, damage: undefined, lifetime: 2, passthrough:true, name:"ElectricEffect", width:1, height:1}}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false); - sprites += 1; - } - } - } - if (KinkyDungeonPlayerBuffs.Conduction && KDistEuclidean(data.enemy.x - KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y - data.enemy.y) <= e.aoe) { - KinkyDungeonSendTextMessage(6, TextGet("KDConductionDamageTaken").replace("DAMAGEDEALT", "" + data.dmg * e.power), "#ff0000", 2); - KinkyDungeonDealDamage({ - type: e.damage, - damage: data.dmg * e.power, - flags: ["EchoDamage"], - }); - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Conduction.ogg"); - let dist = KDistEuclidean(KinkyDungeonPlayerEntity.x - data.enemy.x, KinkyDungeonPlayerEntity.y - data.enemy.y); - let tx = KinkyDungeonPlayerEntity.x; - let ty = KinkyDungeonPlayerEntity.y; - if (dist > 0) - for (let d = dist/2.99; d < dist; d += dist/2.99) { - let xx = entity.x + d * (tx - entity.x); - let yy = entity.y + d * (ty - entity.y); - let newB = {born: 0, time:1 + Math.round(KDRandom()*1), x:Math.round(xx), y:Math.round(yy), vx:0, vy:0, xx:xx, yy:yy, spriteID: KinkyDungeonGetEnemyID() + "ElectricEffect" + CommonTime(), - bullet:{faction: "Rage", spell:undefined, damage: undefined, lifetime: 2, passthrough:true, name:"ElectricEffect", width:1, height:1}}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false); - } - } - } - } - }, - "EchoDamage": (e, buff, entity, data) => { - if (data.enemy == entity && (!data.flags || (!data.flags.includes("EchoDamage"))) && data.dmg > 0 && (!e.damageTrigger || data.type == e.damageTrigger)) { - KinkyDungeonDamageEnemy(entity, { - type: e.damage, - damage: data.dmg * e.power, - flags: ["EchoDamage"] - }, false, false, undefined, undefined, undefined, data.faction); - } - }, - "Volcanism": (e, buff, entity, data) => { - if (data.enemy == entity && (!data.flags || (!data.flags.includes("VolcanicDamage") && !data.flags.includes("BurningDamage"))) && data.dmg > 0 && (data.type == "fire")) { - KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, KinkyDungeonFindSpell("VolcanicStrike", true), undefined, undefined, undefined, "Rock"); - data.enemy.hp = 0; - } - }, - "Flammable": (e, buff, entity, data) => { - if ((!data.flags || !data.flags.includes("BurningDamage")) && !KDEntityHasBuff(entity, "Drenched") && data.dmg > 0 && (data.type == "fire")) { - KinkyDungeonApplyBuffToEntity(entity, KDBurning); - } - }, - }, - "beforePlayerDamage": { - "Flammable": (e, buff, entity, data) => { - if ((!data.flags || !data.flags.includes("BurningDamage")) && !KDEntityHasBuff(entity, "Drenched") && data.dmg > 0 && (data.type == "fire")) { - KinkyDungeonApplyBuffToEntity(entity, KDBurning); - } - }, - "Conduction": (e, buff, entity, data) => { - if ((!data.flags || !data.flags.includes("EchoDamage")) && data.dmg > 0 && (!e.damage || e.damage == data.type)) { - if (!e.chance || KDRandom() < e.chance) { - for (let enemy of KinkyDungeonEntities) { - if (enemy.buffs && enemy.buffs.Conduction && enemy.hp > 0 && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) <= e.aoe) { - KinkyDungeonDamageEnemy(enemy, { - type: e.damage, - damage: data.dmg * e.power, - flags: ["EchoDamage"] - }, false, true, undefined, undefined, undefined, "Rage"); - let dist = KDistEuclidean(enemy.x - entity.x, enemy.y - entity.y); - let tx = enemy.x; - let ty = enemy.y; - if (dist > 0) - for (let d = 0; d <= dist; d += dist/3.01) { - let xx = entity.x + d * (tx - entity.x); - let yy = entity.y + d * (ty - entity.y); - let newB = {born: 0, time:1 + Math.round(KDRandom()*1), x:Math.round(xx), y:Math.round(yy), vx:0, vy:0, xx:xx, yy:yy, spriteID: KinkyDungeonGetEnemyID() + "ElectricEffect" + CommonTime(), - bullet:{faction: "Rage", spell:undefined, damage: undefined, lifetime: 2, passthrough:true, name:"ElectricEffect", width:1, height:1}}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false); - } - } - } - } - } - }, - "EchoDamage": (e, buff, entity, data) => { - if ((!data.flags || !data.flags.includes("EchoDamage")) && data.dmg > 0 && (!e.damageTrigger || e.damageTrigger == data.type)) { - KinkyDungeonSendTextMessage(6, TextGet("KDBurningFanFlamesDamageTaken").replace("DAMAGEDEALT", "" + data.dmg * e.power), "#ff0000", 2); - KinkyDungeonDealDamage({ - type: e.damage, - damage: data.dmg * e.power, - flags: ["EchoDamage"], - }); - } - }, - }, - "beforeAttack": { - "CounterattackDamage": (e, buff, entity, data) => { - if (data.attacker && data.target == entity && (!(e.prereq == "hit") || (!data.missed && data.hit)) && (data.attacker.player || !data.target.player || KinkyDungeonAggressive(data.attacker))) { - if (data.attacker.player) { - KinkyDungeonDealDamage({damage: e.power, type: e.damage, bind: e.bind, time: e.time, bindType: e.bindType,}); - } else { - KinkyDungeonDamageEnemy(data.attacker, {damage: e.power, type: e.damage, bind: e.bind, bindType: e.bindType, time: e.time}, false, true, undefined, undefined, entity); - } - if (e.requiredTag) - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, e.requiredTag, 1); - } - }, - "CounterattackSpell": (e, buff, entity, data) => { - if (data.attacker && data.target == entity - && (!(e.prereq == "hit") || (!data.missed && data.hit)) - && (!(e.prereq == "hit-hostile") || (!data.missed && data.hit && !data.attacker.playWithPlayer - // Player attacking = hostile? - // Enemy attacking enemy? hostile - && (data.attacker.player || !data.target.player || KinkyDungeonAggressive(data.attacker))))) { - // @ts-ignore - KinkyDungeonCastSpell(data.attacker.x, data.attacker.y, KinkyDungeonFindSpell(e.spell, true), undefined, undefined, undefined, entity.player ? "Player" : KDGetFaction(entity)); - if (e.requiredTag) - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, e.requiredTag, 1); - } - }, - }, - "afterDamageEnemy": { - "ShrineElements": (e, buff, entity, data) => { - if (data.enemy && data.enemy.hp > 0.52 && KDHostile(data.enemy) && data.faction == "Player" && !KDEventDataReset.ShrineElements && ["fire", "ice", "frost", "electric", "gravity"].includes(data.type)) { - KDEventDataReset.ShrineElements = true; - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "shrineElements", 1); - KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, KinkyDungeonFindSpell(e.spell, true), undefined, undefined, undefined, "Player"); - - } - }, - }, - "playerAttack": { - "ShadowStep": (e, buff, entity, data) => { - if (data.enemy && KDHostile(data.enemy) && !KinkyDungeonPlayerBuffs.ShadowStep) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "ShadowStep", type: "SlowDetection", duration: e.time * 2, power: 0.667, player: true, enemies: true, endSleep: true, currentCount: -1, maxCount: 1, tags: ["SlowDetection", "hit", "cast"]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "ShadowStep2", type: "Sneak", duration: e.time, power: Math.min(20, e.time * 2), player: true, enemies: true, endSleep: true, currentCount: -1, maxCount: 1, tags: ["Sneak", "hit", "cast"]}); - if (e.requiredTag) - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, e.requiredTag, 1); - } - }, - "ApplyDisarm": (e, buff, entity, data) => { - if (data.enemy && data.enemy == entity && data.enemy.Enemy.bound && (!e.prereq || KDCheckPrereq(data.enemy, e.prereq))) { - let time = e.time || 0; - if (!time && entity.buffs) time = KinkyDungeonGetBuffedStat(entity.buffs, "DisarmOnAttack"); - if (time > 0) { - KDDisarmEnemy(data.enemy, time); - } - } - }, - }, - "calcMana": { - "Tablet": (e, buff, entity, data) => { - if (data.spell != KinkyDungeonTargetingSpellItem && data.spell.tags && data.spell.tags.includes(e.requiredTag) || (data.spell.school && data.spell.school.toLowerCase() == e.requiredTag)) { - data.cost = Math.max(data.cost * e.power, 0); - } - }, - "AvatarFire": (e, buff, entity, data) => { - if (data.spell.tags && data.spell.tags.includes("fire")) { - data.cost = Math.max(data.cost - e.power, 0); - } - }, - "AvatarAir": (e, buff, entity, data) => { - if (data.spell.tags && data.spell.tags.includes("air")) { - data.cost = Math.max(data.cost - e.power, 0); - } - }, - "AvatarWater": (e, buff, entity, data) => { - if (data.spell.tags && data.spell.tags.includes("water")) { - data.cost = Math.max(data.cost - e.power, 0); - } - }, - "AvatarEarth": (e, buff, entity, data) => { - if (data.spell.tags && data.spell.tags.includes("earth")) { - data.cost = Math.max(data.cost - e.power, 0); - } - }, - }, - "tick": { - "ShadowDommed": (e, buff, entity, data) => { - if (buff.duration > 0) { - if (entity.player) { - if (!KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { - buff.duration = 0; - } - KinkyDungeonSetFlag("PlayerDommed", 2); - } - } - }, - "BoundByFate": (e, buff, entity, data) => { - if (buff.duration > 0) { - if (entity.player) { - if (!KDEffectTileTags(entity.x, entity.y).fate) { - buff.duration = 0; - KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, "soul", {name: "StarBondage", count: e.count, kind: e.kind, power: e.power}); - KDRemoveAoEEffectTiles(entity.x, entity.y, ["fate"], 1.5); - } - } - } - }, - "ApplyConduction": (e, buff, entity, data) => { - let bb = Object.assign({}, KDConduction); - if (e.duration) bb.duration = e.duration; - if (e.power) bb.power = e.power; - // @ts-ignore - if (entity.player) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, bb); - } else { - if (!entity.buffs) entity.buffs = {}; - KinkyDungeonApplyBuff(entity.buffs, bb); - } - }, - "ApplySlowed": (e, buff, entity, data) => { - let bb = Object.assign({}, KDSlowed); - if (e.duration) bb.duration = e.duration; - if (e.power) bb.power = e.power; - // @ts-ignore - if (entity.player) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, bb); - } else { - if (!entity.buffs) entity.buffs = {}; - KinkyDungeonApplyBuff(entity.buffs, bb); - } - }, - "ApplyVuln": (e, buff, entity, data) => { - if (!entity.player) { - if (!entity.vulnerable) entity.vulnerable = 1; - } - }, - "ApplyAttackSlow": (e, buff, entity, data) => { - let bb = Object.assign({}, KDAttackSlow); - if (e.duration) bb.duration = e.duration; - if (e.power) bb.power = e.power; - // @ts-ignore - if (entity.player) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, bb); - } else { - if (!entity.buffs) entity.buffs = {}; - KinkyDungeonApplyBuff(entity.buffs, bb); - } - }, - "ApplySilence": (e, buff, entity, data) => { - if (!buff.duration) return; - if (!entity.player && entity.Enemy.bound) { - if (!e.prereq || KDCheckPrereq(entity, e.prereq)) - KDSilenceEnemy(entity, e.duration); - } - }, - "ApplyGlueVuln": (e, buff, entity, data) => { - let bb = Object.assign({}, KDGlueVulnLow); - if (e.duration) bb.duration = e.duration; - if (e.power) bb.power = e.power; - // @ts-ignore - if (entity.player) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, bb); - } else { - if (!entity.buffs) entity.buffs = {}; - KinkyDungeonApplyBuff(entity.buffs, bb); - } - }, - "RemoveDrench": (e, buff, entity, data) => { - if (!KDWettable(entity)) { - if (entity.player) { - delete KinkyDungeonPlayerBuffs.Drenched; - delete KinkyDungeonPlayerBuffs.Drenched2; - delete KinkyDungeonPlayerBuffs.Drenched3; - } else { - delete entity.buffs.Drenched; - delete entity.buffs.Drenched2; - delete entity.buffs.Drenched3; - } - } - }, - "RemoveConduction": (e, buff, entity, data) => { - if (!KDConducting(entity)) { - if (entity.player) { - delete KinkyDungeonPlayerBuffs.Conduction; - } else { - delete entity.buffs.Conduction; - } - } - }, - "RemoveSlimeWalk": (e, buff, entity, data) => { - if (KDSlimeImmuneEntity(entity)) { - if (entity.player) { - delete KinkyDungeonPlayerBuffs[buff.id]; - } else { - delete entity.buffs[buff.id]; - } - } - }, - "RemoveNoPlug": (e, buff, entity, data) => { - if (!(KDEntityBuffedStat(entity, "Plug") > 0) && (!e.prereq || KDCheckPrereq(entity, e.prereq, e, data))) { - if (entity.player) { - delete KinkyDungeonPlayerBuffs[buff.id]; - } else { - delete entity.buffs[buff.id]; - } - } - }, - "RemoveFree": (e, buff, entity, data) => { - if (!(entity.boundLevel > 0) && (!e.prereq || KDCheckPrereq(entity, e.prereq, e, data))) { - if (entity.player) { - delete KinkyDungeonPlayerBuffs[buff.id]; - } else { - delete entity.buffs[buff.id]; - } - } - }, - "RemoveFreeStrict": (e, buff, entity, data) => { - if (!(entity.boundLevel > 0 || KinkyDungeonHasStatus(entity)) && (!e.prereq || KDCheckPrereq(entity, e.prereq, e, data))) { - if (entity.player) { - delete KinkyDungeonPlayerBuffs[buff.id]; - } else { - delete entity.buffs[buff.id]; - } - } - }, - "Distract": (e, buff, entity, data) => { - if (entity.Enemy?.bound && (!e.prereq || KDCheckPrereq(entity, e.prereq, e, data))) { - if (!entity.distraction) entity.distraction = data.delta * e.power; - else entity.distraction += data.delta * e.power; - } - }, - "RemoveBurning": (e, buff, entity, data) => { - let drench = KDEntityGetBuff(entity, "Drenched"); - if (drench && drench.duration > data.delta) { - if (entity.player) { - delete KinkyDungeonPlayerBuffs.Burning; - } else { - delete entity.buffs.Burning; - } - drench.duration -= data.delta; - } - }, - "RemoveRestraint": (e, buff, entity, data) => { - // Removes restraint debuffs once the enemy has struggled out - if (buff && buff.duration > data.delta && !entity.player) { - if (!entity.Enemy.bound || entity.boundLevel <= 0.01) - delete entity.buffs[buff.id]; - } - }, - "ElementalEffect": (e, buff, entity, data) => { - if (buff.duration > 0) { - if (entity.player) { - KinkyDungeonDealDamage({ - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - flags: ["BurningDamage"] - }); - } else { - KinkyDungeonDamageEnemy(entity, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - flags: ["BurningDamage"] - }, false, true, undefined, undefined, undefined); - } - } - }, - }, - "tickAfter": { - "ApplyConduction": (e, buff, entity, data) => { - if (!buff.duration) return; - let bb = Object.assign({}, KDConduction); - if (e.duration) bb.duration = e.duration; - if (e.power) bb.power = e.power; - // @ts-ignore - if (entity.player) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, bb); - } else { - if (!entity.buffs) entity.buffs = {}; - KinkyDungeonApplyBuff(entity.buffs, bb); - } - }, - "ApplySlowed": (e, buff, entity, data) => { - if (!buff.duration) return; - let bb = Object.assign({}, KDSlowed); - if (e.duration) bb.duration = e.duration; - if (e.power) bb.power = e.power; - // @ts-ignore - if (entity.player) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, bb); - } else { - if (!entity.buffs) entity.buffs = {}; - KinkyDungeonApplyBuff(entity.buffs, bb); - } - }, - "ApplyVuln": (e, buff, entity, data) => { - if (!entity.player) { - if (!entity.vulnerable) entity.vulnerable = 1; - } - }, - "ApplyAttackSlow": (e, buff, entity, data) => { - if (!buff.duration) return; - let bb = Object.assign({}, KDAttackSlow); - if (e.duration) bb.duration = e.duration; - if (e.power) bb.power = e.power; - // @ts-ignore - if (entity.player) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, bb); - } else { - if (!entity.buffs) entity.buffs = {}; - KinkyDungeonApplyBuff(entity.buffs, bb); - } - }, - "ApplySilence": (e, buff, entity, data) => { - if (!buff.duration) return; - if (!entity.player && entity.Enemy.bound) { - if (!e.prereq || KDCheckPrereq(entity, e.prereq)) - KDSilenceEnemy(entity, e.duration); - } - }, - "ApplyGlueVuln": (e, buff, entity, data) => { - if (!buff.duration) return; - let bb = Object.assign({}, KDGlueVulnLow); - if (e.duration) bb.duration = e.duration; - if (e.power) bb.power = e.power; - // @ts-ignore - if (entity.player) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, bb); - } else { - if (!entity.buffs) entity.buffs = {}; - KinkyDungeonApplyBuff(entity.buffs, bb); - } - }, - }, -}; - -/** - * - * @param {string} Event - * @param {any} buff - * @param {any} entity - * @param {*} data - */ -function KinkyDungeonHandleBuffEvent(Event, e, buff, entity, data) { - if (Event === e.trigger && KDEventMapBuff[Event] && KDEventMapBuff[Event][e.type]) { - KDEventMapBuff[Event][e.type](e, buff, entity, data); - } -} - - -/** - * @type {Object.>} - */ -let KDEventMapOutfit = { - "calcEvasion": { - "AccuracyBuff": (e, outfit, data) => { - if (data.enemy && data.enemy.Enemy && data.enemy.Enemy.tags[e.requiredTag]) { - data.hitmult *= e.power; - } - }, - } -}; - -/** - * - * @param {string} Event - * @param {any} outfit - * @param {*} data - */ -function KinkyDungeonHandleOutfitEvent(Event, e, outfit, data) { - if (Event === e.trigger && KDEventMapOutfit[Event] && KDEventMapOutfit[Event][e.type]) { - KDEventMapOutfit[Event][e.type](e, outfit, data); - } -} - -/** - * @type {Object.>} - */ -let KDEventMapSpell = { - "calcComp": { - "OneWithSlime": (e, spell, data) => { - if (data.spell && data.spell.tags && data.failed.length > 0 && (data.spell.tags.includes("slime") || data.spell.tags.includes("latex"))) { - let tiles = KDGetEffectTiles(data.x, data.y); - for (let t of Object.values(tiles)) { - if (t.tags && (t.tags.includes("slime") || t.tags.includes("latex"))) { - data.failed = []; - return; - } - } - } - }, - }, - "canSprint": { - "Vault": (e, spell, data) => { - if (!data.passThru) { - let enemy = KinkyDungeonEntityAt(data.nextPosx, data.nextPosy); - if (enemy && !enemy?.player && !KDIsImmobile(enemy)) { - data.passThru = true; - } - } - }, - }, - "perkOrb": { - "Cursed": (e, spell, data) => { - if (data.perks && data.perks.includes("Cursed")) { - for (let shrine in KinkyDungeonShrineBaseCosts) { - KinkyDungeonGoddessRep[shrine] = -50; - } - } - }, - }, - "calcMaxStats": { - "IronWill": (e, spell, data) => { - if (KinkyDungeonStatWill >= 9.999) - data.staminaRate += e.power; - }, - "SteadfastGuard": (e, spell, data) => { - if (!e.power || KinkyDungeonStatWill >= e.power) - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "SteadfastGuard", - type: "RestraintBlock", - power: (KinkyDungeonStatWill - (e.power || 0)) * e.mult, - duration: 2 - }); - }, - "IncreaseManaPool": (e, spell, data) => { - KinkyDungeonStatManaPoolMax += e.power; - }, - }, - "afterCalcMana": { - "StaffUser1": (e, spell, data) => { - if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.magic) - data.cost = Math.max(data.cost * e.power, 0); - }, - }, - "beforeMultMana": { - "StaffUser3": (e, spell, data) => { - if (data.spell && data.spell.upcastFrom) - data.cost = data.cost * e.power; - }, - }, - "calcMana": { - "StaffUser2": (e, spell, data) => { - if (data.spell && !data.spell.passive && data.spell.type != 'passive') - data.cost = Math.max(data.cost - e.power, Math.min(data.cost, 1)); - }, - }, - "calcMiscast": { - "DistractionCast": (e, spell, data) => { - if (KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax > 0.99 || KinkyDungeonPlayerBuffs.DistractionCast) data.miscastChance -= 1.0; - }, - }, - "playerCast": { - "DistractionCast": (e, spell, data) => { - if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.99 || KinkyDungeonPlayerBuffs.DistractionCast) { - let tb = KinkyDungeonGetManaCost(data.spell) * 0.25; - KinkyDungeonTeaseLevelBypass += tb; - KDGameData.OrgasmStage = Math.max((KDGameData.OrgasmStage + Math.ceil(tb)) || tb, KinkyDungeonMaxOrgasmStage); - } - }, - "LightningRod": (e, spell, data) => { - if (data.spell && data.spell.tags && data.spell.manacost > 0 && (data.spell.tags.includes("air") || data.spell.tags.includes("electric"))) { - let bb = Object.assign({}, KDConduction); - bb.duration = 4; - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, bb); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "LightningRod", type: "electricDamageResist", aura: "#ffff00", power: e.power, player: true, duration: 4, - }); - } - }, - "LeatherBurst": (e, spell, data) => { - if (data.spell && data.spell.tags && (data.spell.tags.includes("leather") && data.spell.tags.includes("burst"))) { - let power = KDEntityBuffedStat(KinkyDungeonPlayerEntity, "LeatherBurst"); - if (power < e.power) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "LeatherBurst", type: "LeatherBurst", aura: "#ffffff", power: power + 1, player: true, duration: 1.1 - }); - if (power > 0) - data.delta = 0; - } else { - KinkyDungeonExpireBuff(KinkyDungeonPlayerBuffs, "LeatherBurst"); - } - } - }, - }, - "calcEvasion": { - "HandsFree": (e, spell, data) => { - if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.flags.KDEvasionHands) { - data.flags.KDEvasionHands = false; - } - }, - }, - "tick": { - "DistractionCast": (e, spell, data) => { - if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.99) - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "DistractionCast", type: "sfx", power: 1, duration: 4, sfxApply: "PowerMagic", aura: "#ff8888", aurasprite: "Heart" - }); - }, - "Buff": (e, spell, data) => { - if (KDCheckPrereq(null, e.prereq, e, data)) - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: spell.name, - type: e.buffType, - power: e.power, - tags: e.tags, - currentCount: e.mult ? -1 : undefined, - maxCount: e.mult, - duration: 2 - }); - }, - "SlimeMimic": (e, spell, data) => { - if (KinkyDungeonLastAction == "Wait" - && (KinkyDungeonPlayerTags.get("Slime") || KinkyDungeonPlayerTags.get("SlimeHard")) - && KinkyDungeonIsHandsBound(false, false, 0.15) - && KinkyDungeonIsArmsBound(false, false) - && KinkyDungeonSlowLevel > 0 - && KinkyDungeonGagTotal() > 0.25) { - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, - {id: "SlimeMimic", aura: "#ff00ff", type: "SlowDetection", duration: 2, power: 24.0, player: true, enemies: true, endSleep: true, currentCount: -1, maxCount: 1, tags: ["SlowDetection", "move", "cast", "attack"]} - ); - } - }, - "AccuracyBuff": (e, spell, data) => { - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell))) { - //KDBlindnessCap = Math.min(KDBlindnessCap, e.power); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: spell.name + e.type + e.trigger, - type: "Accuracy", - duration: 1, - power: e.power, - }); - } - }, - "Analyze": (e, spell, data) => { - let activate = false; - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && !KinkyDungeonPlayerBuffs.Analyze) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "Analyze", aura:"#ff5555", type: "MagicalSight", power: e.power, duration: e.time}); - activate = true; - } - if (KinkyDungeonPlayerBuffs.Analyze && KinkyDungeonPlayerBuffs.Analyze.duration > 1) { - // Nothing! - } else if (!activate) { - KinkyDungeonDisableSpell("Analyze"); - KinkyDungeonExpireBuff(KinkyDungeonPlayerBuffs, "Analyze"); - } - }, - }, - "calcStats": { - "Blindness": (e, spell, data) => { - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell))) { - //KDBlindnessCap = Math.min(KDBlindnessCap, e.power); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: spell.name + e.type + e.trigger, - type: "Blindness", - duration: e.time ? e.time : 0, - power: -1 - }); - } - }, - }, - "beforeMove": { - "FleetFooted": (e, spell, data) => { - if (!data.IsSpell && !KinkyDungeonNoMoveFlag && KinkyDungeonSlowLevel > 1 && KinkyDungeonHasStamina(1.1) && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell))) { - let manacost = -KinkyDungeonGetManaCost(spell); - e.prevSlowLevel = KinkyDungeonSlowLevel; - KinkyDungeonSlowLevel = Math.max(0, KinkyDungeonSlowLevel - e.power); - if (KinkyDungeonHasMana(1.5) && KinkyDungeonMovePoints < 0) { - KinkyDungeonMovePoints = 0; - manacost -= 1.5; - KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonFleetFootedIgnoreSlow"), "lightgreen", 2); - } - else KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonFleetFooted"), "lightgreen", 2, false, true); - KinkyDungeonChangeMana(manacost); - } - }, - }, - "afterMove": { - "FleetFooted": (e, spell, data) => { - if (e.prevSlowLevel && !data.IsSpell && KinkyDungeonSlowLevel < e.prevSlowLevel) { - KinkyDungeonSlowLevel = e.prevSlowLevel; - e.prevSlowLevel = undefined; - } - }, - }, - "beforeTrap": { - "FleetFooted": (e, spell, data) => { - if (data.flags.AllowTraps && !data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell))) { - if (KDRandom() < e.chance) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - data.flags.AllowTraps = false; - KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonFleetFootedIgnoreTrap"), "lightgreen", 2); - } else { - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonFleetFootedIgnoreTrapFail"), "lightgreen", 2); - } - } - }, - }, - "afterDamageEnemy": { - "IcePrison": (e, spell, data) => { - if (data.enemy && data.froze) { - if ((!e.chance || KDRandom() < e.chance)) { - KinkyDungeonDamageEnemy(data.enemy, { - type: "ice", - damage: 0, - time: 0, - bind: data.froze + data.enemy.Enemy.maxhp * 0.1, - bindType: "Ice", - }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); - if (KDHelpless(data.enemy) && !(data.enemy.freeze > 300)) data.enemy.freeze = 300; - } - } - }, - }, - "beforeDamageEnemy": { - "MultiplyDamageStealth": (e, spell, data) => { - if (data.dmg > 0 && data.enemy && KDHostile(data.enemy) && !data.enemy.aware && data.spell == spell) { - if ((!e.humanOnly || data.enemy.Enemy.bound) && (!e.chance || KDRandom() < e.chance)) { - data.dmg = Math.max(data.dmg * e.power, 0); - } - } - }, - "MakeVulnerable": (e, spell, data) => { - if (data.enemy && data.spell == spell) { - if ((!e.humanOnly || data.enemy.Enemy.bound) && (!e.chance || KDRandom() < e.chance) && !data.enemy.Enemy.tags.nonvulnerable) { - if (!data.enemy.vulnerable) data.enemy.vulnerable = 0; - data.enemy.vulnerable = Math.max(0, e.time); - } - } - }, - "TemperaturePlay": (e, spell, data) => { - if (data.dmg > 0 && data.enemy && KDHostile(data.enemy) && ["fire", "frost", "ice"].includes(data.type)) { - if ((!e.humanOnly || data.enemy.Enemy.bound) && (!e.chance || KDRandom() < e.chance)) { - let percent = Math.min(1, KDBoundEffects(data.enemy) / 4); - data.dmg = Math.max(data.dmg * (1 + e.power * percent), 0); - } - } - }, - "Burning": (e, spell, data) => { - if (data.enemy && (!data.flags || !data.flags.includes("BurningDamage")) && data.dmg > 0 && (!e.damage || e.damage == data.type)) { - if ((!e.chance || KDRandom() < e.chance)) { - KinkyDungeonApplyBuffToEntity(data.enemy, KDBurning); - } - } - }, - }, - "calcDamage": { - "HandsFree": (e, spell, data) => { - if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.flags.KDDamageHands) { - data.flags.KDDamageHands = false; - } - }, - }, - "getWeapon": { - "HandsFree": (e, spell, data) => { - if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.flags && !data.flags.HandsFree) { - data.flags.HandsFree = true; - } - }, - }, - "beforePlayerAttack" : { - "Shatter": (e, spell, data) => { - if (KinkyDungeonPlayerDamage && (KinkyDungeonPlayerDamage.name == "IceBreaker") && data.enemy && data.enemy.freeze > 0 && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell))) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, KinkyDungeonFindSpell("ShatterStrike", true), undefined, undefined, undefined); - } - }, - "BoostDamage": (e, spell, data) => { - if (data.eva && KinkyDungeonHasMana(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell)) && !data.miss && !data.disarm && data.targetX && data.targetY && data.enemy && KDHostile(data.enemy)) { - if (KDCheckPrereq(null, e.prereq, e, data)) { - KinkyDungeonChangeMana(-(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell))); - data.buffdmg = Math.max(0, data.buffdmg + e.power); - } - } - }, - "CritBoost": (e, spell, data) => { - if (data.eva&& !data.miss && !data.disarm && data.targetX && data.targetY && data.enemy && KDHostile(data.enemy)) { - if (KDCheckPrereq(null, e.prereq, e, data)) { - let power = Math.max(0, Math.max((Math.max(KinkyDungeonPlayerDamage.chance || 0, KinkyDungeonGetEvasion()) - 1)*e.power)); - data.buffdmg = Math.max(0, data.buffdmg + (KinkyDungeonPlayerDamage.dmg || 0) * power); - } - } - }, - }, - "calcDisplayDamage": { - "BoostDamage": (e, spell, data) => { - if (KinkyDungeonHasMana(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell))) { - if (KDCheckPrereq(null, e.prereq, e, data)) { - data.buffdmg = Math.max(0, data.buffdmg + e.power); - } - } - }, - "CritBoost": (e, spell, data) => { - if (KDCheckPrereq(null, e.prereq, e, data)) { - let power = Math.max(0, Math.max(((KinkyDungeonPlayerDamage.chance || 0) - 1)*e.power)); - data.buffdmg = Math.max(0, data.buffdmg + (KinkyDungeonPlayerDamage.dmg || 0) * power); - } - }, - }, - "tickAfter": { - "Frustration": (e, spell, data) => { - for (let en of KinkyDungeonEntities) { - if (en.Enemy.bound && en.buffs && KDEntityBuffedStat(en, "Chastity")) { - if (KDHelpless(en)) { - let Enemy = KinkyDungeonGetEnemyByName("PetChastity"); - let doll = { - summoned: true, - faction: "Rage", - Enemy: Enemy, - id: KinkyDungeonGetEnemyID(), - x: en.x, - y: en.y, - hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, - movePoints: 0, - attackPoints: 0 - }; - KDAddEntity(doll); - en.hp = 0; - } - } - } - }, - }, - "playerAttack": { - "FlameBlade": (e, spell, data) => { - if (KinkyDungeonPlayerDamage && ((KinkyDungeonPlayerDamage.name && KinkyDungeonPlayerDamage.name != "Unarmed") || KinkyDungeonStatsChoice.get("Brawler")) && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.targetX && data.targetY && (data.enemy && KDHostile(data.enemy))) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - KinkyDungeonCastSpell(data.targetX, data.targetY, KinkyDungeonFindSpell("FlameStrike", true), undefined, undefined, undefined); - } - }, - "ElementalEffect": (e, spell, data) => { - if (KinkyDungeonHasMana(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell)) && !data.miss && !data.disarm && data.targetX && data.targetY && data.enemy && KDHostile(data.enemy)) { - KinkyDungeonChangeMana(-(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell))); - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); - } - }, - "EffectTile": (e, spell, data) => { - if (KinkyDungeonHasMana(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell)) && !data.miss && !data.disarm && data.targetX && data.targetY && data.enemy && KDHostile(data.enemy)) { - KinkyDungeonChangeMana(-(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell))); - KDCreateEffectTile(data.targetX, data.targetY, { - name: e.kind, - duration: e.duration, - }, e.variance); - } - }, - "FloatingWeapon": (e, spell, data) => { - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.targetX && data.targetY && !(data.enemy && data.enemy.Enemy && KDAllied(data.enemy))) { - let chanceWith = KinkyDungeonPlayerDamage.chance; - let chanceWithout = KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon(true), true).chance; - KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); - if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.name && chanceWithout < chanceWith) - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - } - }, - }, - "beforeStruggleCalc": { - "ModifyStruggle": (e, spell, data) => { - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.escapeChance != undefined && (!e.StruggleType || e.StruggleType == data.struggleType)) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - if (e.mult && data.escapeChance > 0) - data.escapeChance *= e.mult; - if (e.power) - data.escapeChance += e.power; - if (e.msg) { - KinkyDungeonSendTextMessage(10 * e.power, TextGet(e.msg), "lightgreen", 2); - } - } - }, - "WillStruggle": (e, spell, data) => { - if (data.escapeChance != undefined && (!e.StruggleType || e.StruggleType == data.struggleType)) { - if (!e.power || KinkyDungeonStatWill > e.power) { - let boost = (KinkyDungeonStatWill - (e.power || 0)) * e.mult; - data.escapeChance += boost; - if (e.msg) - KinkyDungeonSendTextMessage(10 * boost, TextGet(e.msg).replace("AMOUNT", "" + Math.round(100*boost)), "lightgreen", 2); - } - } - }, - }, - "vision": { - "TrueSight": (e, spell, data) => { - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.flags) { - if (data.update) - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell) * data.update); - data.flags.SeeThroughWalls = Math.max(data.flags.SeeThroughWalls, 2); - } - }, - }, - "draw": { - "EnemySense": (e, spell, data) => { - let activate = false; - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && !KinkyDungeonPlayerBuffs.EnemySense) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell) * data.update); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "EnemySense", type: "EnemySense", duration: 13}); - activate = true; - } - if (KinkyDungeonPlayerBuffs.EnemySense && KinkyDungeonPlayerBuffs.EnemySense.duration > 1) - for (let enemy of KinkyDungeonEntities) { - if (!KinkyDungeonVisionGet(enemy.x, enemy.y) - && Math.sqrt((KinkyDungeonPlayerEntity.x - enemy.x) * (KinkyDungeonPlayerEntity.x - enemy.x) + (KinkyDungeonPlayerEntity.y - enemy.y) * (KinkyDungeonPlayerEntity.y - enemy.y)) < e.dist) { - let color = "#882222"; - if (enemy.Enemy.stealth > 0 || KDAmbushAI(enemy)) color = "#441111"; - if (color == "#882222" || Math.sqrt((KinkyDungeonPlayerEntity.x - enemy.x) * (KinkyDungeonPlayerEntity.x - enemy.x) + (KinkyDungeonPlayerEntity.y - enemy.y) * (KinkyDungeonPlayerEntity.y - enemy.y)) < e.distStealth) - KDDraw(kdcanvas, kdpixisprites, enemy.id + "_sense", KinkyDungeonRootDirectory + "Aura.png", - (enemy.visual_x - data.CamX - data.CamX_offset) * KinkyDungeonGridSizeDisplay, - (enemy.visual_y - data.CamY - data.CamY_offset) * KinkyDungeonGridSizeDisplay, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { - tint: string2hex(color), - }); - } - } - else if (!activate) { - KinkyDungeonDisableSpell("EnemySense"); - KinkyDungeonExpireBuff(KinkyDungeonPlayerBuffs, "EnemySense"); - } - }, - }, - "getLights": { - "Light": (e, spell, data) => { - let activate = false; - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && !KinkyDungeonPlayerBuffs.Light) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "Light", type: "Light", duration: e.time, aura: "#ffffff"}); - activate = true; - KinkyDungeonUpdateLightGrid = true; - } - if (KinkyDungeonPlayerBuffs.Light && KinkyDungeonPlayerBuffs.Light.duration > 1) { - data.lights.push({brightness: e.power, x: KinkyDungeonPlayerEntity.x, y: KinkyDungeonPlayerEntity.y, color: string2hex(e.color)}); - } else if (!activate) { - KinkyDungeonDisableSpell("Light"); - KinkyDungeonExpireBuff(KinkyDungeonPlayerBuffs, "Light"); - } - }, - }, - "toggleSpell": { - "Light": (e, spell, data) => { - if (data.spell?.name == spell?.name) { - KinkyDungeonUpdateLightGrid = true; - if (KinkyDungeonPlayerBuffs.Light && KinkyDungeonPlayerBuffs.Light.duration > 1) { - KinkyDungeonExpireBuff(KinkyDungeonPlayerBuffs, "Light"); - } - } - }, - "Analyze": (e, spell, data) => { - if (data.spell?.name == spell?.name) { - if (KinkyDungeonPlayerBuffs.Analyze && KinkyDungeonPlayerBuffs.Analyze.duration > 1) { - KinkyDungeonExpireBuff(KinkyDungeonPlayerBuffs, "Analyze"); - } - KinkyDungeonAdvanceTime(0, true, true); - - } - }, - }, - "enemyStatusEnd": { - "Shatter": (e, spell, data) => { - if (data.enemy && data.status == "freeze" && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.enemy.playerdmg && KDHostile(data.enemy) && KDistChebyshev(data.enemy.x - KinkyDungeonPlayerEntity.x, data.enemy.y - KinkyDungeonPlayerEntity.y) < 10) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, KinkyDungeonFindSpell("ShatterStrike", true), undefined, undefined, undefined); - } - } - }, - "kill": { - "Shatter": (e, spell, data) => { - if (data.enemy && data.enemy.freeze > 0 && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.enemy.playerdmg && KDHostile(data.enemy) && KDistChebyshev(data.enemy.x - KinkyDungeonPlayerEntity.x, data.enemy.y - KinkyDungeonPlayerEntity.y) < 10) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, KinkyDungeonFindSpell("ShatterStrike", true), undefined, undefined, undefined); - } - } - }, -}; - -/** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {any} spell - * @param {*} data - */ -function KinkyDungeonHandleMagicEvent(Event, e, spell, data) { - if (Event === e.trigger && KDEventMapSpell[Event] && KDEventMapSpell[Event][e.type]) { - KDEventMapSpell[Event][e.type](e, spell, data); - } -} - - -/** - * @type {Object.>} - */ -let KDEventMapWeapon = { - "beforePlayerDamage": { - "StormBreakerCharge": (e, weapon, data) => { - if (data.dmg > 0 && (!e.damageTrigger || e.damageTrigger == data.type)) { - let turns = data.dmg * e.power; - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "StormCharge", - type: "StormCharge", - aura: e.color, - power: 1, - duration: Math.ceil(Math.min(30, turns)), - }); - } - }, - }, - "spellCast": { - "BondageBustBoost": (e, weapon, data) => { - if (!e.chance || KDRandom() < e.chance) { - if (data.spell && data.spell.name == "BondageBustBeam" && data.bulletfired) { - if (data.bulletfired.bullet && data.bulletfired.bullet.damage) { - let dmgMult = e.power; - let charge = KinkyDungeonPlayerBuffs[weapon.name + "Charge"] ? KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration : 0; - if (charge >= 9) dmgMult *= 2; - data.bulletfired.bullet.damage.damage = data.bulletfired.bullet.damage.damage + dmgMult * charge; - KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration = 0; - - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost * charge); - if (e.sfx && charge > 9) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - } - - } - }, - }, - "afterPlayerAttack": { - "DoubleStrike": (e, weapon, data) => { - if (!KinkyDungeonAttackTwiceFlag && (!e.chance || KDRandom() < e.chance)) { - if (data.enemy && data.enemy.hp > 0 && !(KDHelpless(data.enemy) && data.enemy.hp < 0.6)) { - KinkyDungeonAttackTwiceFlag = true; - KinkyDungeonLaunchAttack(data.enemy, 1); - KinkyDungeonAttackTwiceFlag = false; - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - } - }, - "ConvertBindingToDamage": (e, weapon, data) => { - if ((!e.chance || KDRandom() < e.chance)) { - if (data.enemy && data.enemy.hp > 0 && !(KDHelpless(data.enemy) && data.enemy.hp < 0.6) && data.enemy.boundLevel > 0) { - let bonus = Math.min(data.enemy.boundLevel, e.bind); - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: bonus * e.power, - time: e.time - }, false, false, undefined, undefined, KinkyDungeonPlayerEntity); - - KDReduceBinding(data.enemy, bonus); - if (data.enemy.hp <= 0 && KDHelpless(data.enemy)) data.enemy.hp = 0.01; - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - } - }, - }, - "getLights": { - "WeaponLight": (e, spell, data) => { - data.lights.push({brightness: e.power, x: KinkyDungeonPlayerEntity.x, y: KinkyDungeonPlayerEntity.y, color: string2hex(e.color)}); - }, - }, - "tick": { - "Charge": (e, weapon, data) => { - if (KDGameData.AncientEnergyLevel > 0 && KinkyDungeonSlowMoveTurns < 1) { - let currentCharge = KinkyDungeonPlayerBuffs[weapon.name + "Charge"] ? KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration : 0; - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: weapon.name + "Charge", - type: e.buffType, - aura: e.color, - power: 1, - duration: Math.min(e.power, currentCharge + 2), - }); - if (KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration > e.power - 1) { - KinkyDungeonPlayerBuffs[weapon.name + "Charge"].aurasprite = undefined; - } else { - KinkyDungeonPlayerBuffs[weapon.name + "Charge"].aurasprite = weapon.name; - } - } - }, - "Patience": (e, weapon, data) => { - if (KinkyDungeonSlowMoveTurns < 1) { - let currentCharge = KinkyDungeonPlayerBuffs[weapon.name + "Charge"] ? KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration : 0; - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: weapon.name + "Charge", - type: e.buffType, - aura: e.color, - power: 1, - duration: Math.min(e.power, currentCharge + 2), - }); - if (KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration > e.power - 1) { - KinkyDungeonPlayerBuffs[weapon.name + "Charge"].aura = e.color; - } else { - KinkyDungeonPlayerBuffs[weapon.name + "Charge"].aura = "#888888"; - } - } - }, - "Buff": (e, weapon, data) => { - if (KDCheckPrereq(null, e.prereq, e, data)) - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: weapon.name, - type: e.buffType, - power: e.power, - tags: e.tags, - currentCount: e.mult ? -1 : undefined, - maxCount: e.mult, - duration: 2 - }); - }, - "BuffMulti": (e, weapon, data) => { - if (KDCheckPrereq(null, e.prereq, e, data)) - for (let buff of e.buffTypes) - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: weapon.name + buff, - type: buff, - power: e.power, - tags: e.tags, - currentCount: e.mult ? -1 : undefined, - maxCount: e.mult, - duration: 2 - }); - }, - - "AoEDamageFrozen": (e, weapon, data) => { - let trigger = false; - for (let enemy of KinkyDungeonEntities) { - if (KDHostile(enemy) && enemy.freeze > 0 && (!e.chance || KDRandom() < e.chance) && enemy.hp > 0 && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) <= e.aoe) { - KinkyDungeonDamageEnemy(enemy, { - type: e.damage, - damage: e.power, - time: e.time - }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); - trigger = true; - } - } - if (trigger) { - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - }, - "AoEDamageBurning": (e, weapon, data) => { - let trigger = false; - for (let enemy of KinkyDungeonEntities) { - if (KDHostile(enemy) && KDEntityHasBuff(enemy, "Burning") && (!e.chance || KDRandom() < e.chance) && enemy.hp > 0 && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) <= e.aoe) { - KinkyDungeonDamageEnemy(enemy, { - type: e.damage, - damage: e.power, - time: e.time, - flags: ["BurningDamage"], - }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); - trigger = true; - } - } - if (trigger) { - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - }, - "AoEDamage": (e, weapon, data) => { - let trigger = false; - for (let enemy of KinkyDungeonEntities) { - if (KDHostile(enemy) && (!e.chance || KDRandom() < e.chance) && enemy.hp > 0 && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) <= e.aoe) { - KinkyDungeonDamageEnemy(enemy, { - type: e.damage, - damage: e.power, - time: e.time - }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); - trigger = true; - } - } - if (trigger) { - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - }, - }, - "beforePlayerAttack": { - "KatanaBoost": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm && data.Damage && data.Damage.damage) { - if (data.enemy && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { - if (!e.chance || KDRandom() < e.chance) { - let dmgMult = e.power; - let charge = KinkyDungeonPlayerBuffs[weapon.name + "Charge"] ? KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration : 0; - if (charge >= 9) dmgMult *= 2; - data.Damage.damage = data.Damage.damage + dmgMult * charge; - if (KinkyDungeonPlayerBuffs[weapon.name + "Charge"]) KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration = 0; - - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost * charge); - if (e.sfx && charge > 9) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - } - } - }, - "DamageMultInShadow": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm && data.Damage && data.Damage.damage) { - if (data.enemy && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { - if ((!e.chance || KDRandom() < e.chance) && (KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) <= 1.5 || KinkyDungeonBrightnessGet(data.enemy.x, data.enemy.y) <= 1.5)) { - let dmgMult = e.power; - data.Damage.damage = data.Damage.damage * dmgMult; - - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - } - } - }, - "ChangeDamageUnaware": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && data.Damage && data.Damage.damage > 0 && !data.enemy.Enemy.tags.nobrain) { - if ((!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { - if (!data.enemy.aware) { - data.Damage.damage = e.power; - data.Damage.type = e.damage; - data.Damage.time = e.time; - data.Damage.bind = e.bind; - } - } - } - }, - "ChangeDamageVulnerable": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && data.Damage && data.Damage.damage > 0 && !data.enemy.Enemy.tags.nonvulnerable) { - if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { - if (data.enemy.vulnerable > 0) { - data.Damage.damage = e.power; - data.Damage.type = e.damage; - data.Damage.time = e.time; - data.Damage.bind = e.bind; - } - } - } - }, - }, - "playerAttack": { - "ElementalEffect": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm) { - if (data.enemy && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - }, - "StormBreakerDamage": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm) { - let enemies = KDNearbyEnemies(data.enemy.x, data.enemy.y, e.aoe); - for (let en of enemies) { - if (en && KDHostile(en) && (!e.chance || KDRandom() < e.chance) && en.hp > 0 && !KDHelpless(en) && KinkyDungeonPlayerBuffs.StormCharge) { - let mult = 0.2 * Math.min(5, KinkyDungeonPlayerBuffs.StormCharge.duration); - let damage = e.power * mult; - KinkyDungeonDamageEnemy(en, { - type: e.damage, - damage: damage, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, false, false, undefined, undefined, KinkyDungeonPlayerEntity); - KDCreateEffectTile(en.x, en.y, { - name: "Sparks", - duration: 2, - }, 2); - } - } - if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + e.sfx + ".ogg"); - } - }, - "ApplyBuff": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm) { - if (data.enemy && (!e.chance || KDRandom() < e.chance)) { - if (!data.enemy.buffs) data.enemy.buffs = {}; - KinkyDungeonApplyBuff(data.enemy.buffs, e.buff); - } - } - }, - "Cleave": (e, weapon, data) => { - if (data.enemy && !data.disarm) { - for (let enemy of KinkyDungeonEntities) { - if (enemy != data.enemy && KDHostile(enemy) && !KDHelpless(data.enemy)) { - let dist = Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y)); - if (dist < 1.5 && KinkyDungeonEvasion(enemy) && Math.max(Math.abs(enemy.x - data.enemy.x), Math.abs(enemy.y - data.enemy.y))) { - KinkyDungeonDamageEnemy(enemy, { - type: e.damage, - damage: e.power, - time: e.time - }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - } - } - }, - "CastSpell": (e, weapon, data) => { - if (data.enemy && !data.disarm && !KDHelpless(data.enemy)) { - let spell = KinkyDungeonFindSpell(e.spell, true); - KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, spell, { - x: KinkyDungeonPlayerEntity.x, - y: KinkyDungeonPlayerEntity.y - }, {x: data.enemy.x, y: data.enemy.y}, undefined); - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - }, - "Pierce": (e, weapon, data) => { - if (data.enemy && !data.disarm) { - let dist = e.dist ? e.dist : 1; - for (let i = 1; i <= dist; i++) { - let xx = data.enemy.x + i * (data.enemy.x - KinkyDungeonPlayerEntity.x); - let yy = data.enemy.y + i * (data.enemy.y - KinkyDungeonPlayerEntity.y); - for (let enemy of KinkyDungeonEntities) { - if (enemy != data.enemy && KDHostile(enemy) && !KDHelpless(data.enemy)) { - if (KinkyDungeonEvasion(enemy) && enemy.x == xx && enemy.y == yy) { - KinkyDungeonDamageEnemy(enemy, { - type: e.damage, - damage: e.power - }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - } - } - } - }, - "DamageToTag": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy)) { - if (data.enemy && data.enemy.Enemy.tags[e.requiredTag] && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, false, false, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - }, - "DamageToSummons": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy)) { - if (data.enemy && data.enemy.lifetime > 0 && data.enemy.lifetime < 9999 && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - }, - "ElementalOnVulnerable": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && !data.enemy.Enemy.tags.nonvulnerable) { - if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { - if (data.enemy.vulnerable > 0) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, false, false, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - } - }, - "ElementalOnUnaware": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && !data.enemy.Enemy.tags.nobrain) { - if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { - if (!data.enemy.aware) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, false, false, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - } - }, - "ElementalDreamcatcher": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy)) { - if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { - if (!data.enemy.aware && !data.enemy.Enemy.tags.nobrain) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, false, false, undefined, undefined, KinkyDungeonPlayerEntity); - } else if (data.enemy.vulnerable > 0 && !data.enemy.Enemy.tags.nonvulnerable) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power * 0.5, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, false, false, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - } - }, - "ElementalUnaware": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && !data.enemy.Enemy.tags.nobrain) { - if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { - if (!data.enemy.aware) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, false, false, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - } - }, - "ElementalVulnerable": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && !data.enemy.Enemy.tags.nonvulnerable) { - if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { - if (data.enemy.vulnerable > 0) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, false, false, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - } - }, - "Dreamcatcher": (e, weapon, data) => { - if (data.enemy && !data.miss && !data.disarm) { - if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { - if (!data.enemy.aware && !data.enemy.Enemy.tags.Temporary) { - let point = KinkyDungeonGetNearbyPoint(data.enemy.x, data.enemy.y, true, undefined, true); - if (point) { - let Enemy = KinkyDungeonGetEnemyByName("ShadowWarrior"); - KDAddEntity({ - summoned: true, - rage: Enemy.summonRage ? 9999 : undefined, - Enemy: Enemy, - id: KinkyDungeonGetEnemyID(), - x: point.x, - y: point.y, - hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, - movePoints: 0, - attackPoints: 0, - lifetime: e.time, - maxlifetime: e.time, - }); - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - } - } - } - }, - "Knockback": (e, weapon, data) => { - if (e.dist && data.enemy && data.targetX && data.targetY && !data.miss && !data.disarm && !KDHelpless(data.enemy)) { - if (data.enemy.Enemy && !data.enemy.Enemy.tags.unflinching && !data.enemy.Enemy.tags.stunresist && !data.enemy.Enemy.tags.unstoppable && !data.enemy.Enemy.tags.noknockback && !KDIsImmobile(data.enemy)) { - let newX = data.targetX + Math.round(e.dist * (data.targetX - KinkyDungeonPlayerEntity.x)); - let newY = data.targetY + Math.round(e.dist * (data.targetY - KinkyDungeonPlayerEntity.y)); - if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) - && (e.dist == 1 || KinkyDungeonCheckProjectileClearance(data.enemy.x, data.enemy.y, newX, newY))) { - KDMoveEntity(data.enemy, newX, newY, false); - } - } - } - }, - }, - "beforeDamageEnemy": { - "MultiplyTime": (e, weapon, data) => { - if (data.time > 0 && (!e.damage || e.damage == data.type)) { - if (!e.chance || KDRandom() < e.chance) { - data.time = Math.ceil(data.time * e.power); - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - } - }, - "MultiplyDamageFrozen": (e, weapon, data) => { - if (data.enemy && data.enemy.freeze > 0 && data.dmg > 0 && (!e.damage || e.damage == data.type)) { - if (!e.chance || KDRandom() < e.chance) { - data.dmg = Math.ceil(data.dmg * e.power); - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - } - }, - "EchoDamage": (e, weapon, data) => { - if (data.enemy && (!data.flags || !data.flags.includes("EchoDamage")) && data.dmg > 0 && (!e.damage || e.damage == data.type)) { - if (!e.chance || KDRandom() < e.chance) { - let trigger = false; - for (let enemy of KinkyDungeonEntities) { - if ((enemy.rage || (KDAllied(enemy) && KDAllied(data.enemy)) || (KDHostile(enemy) && KDHostile(data.enemy))) && enemy != data.enemy && !KDHelpless(enemy) && enemy.hp > 0 && KDistEuclidean(enemy.x - data.enemy.x, enemy.y - data.enemy.y) <= e.aoe) { - KinkyDungeonDamageEnemy(enemy, { - type: e.damage, - damage: e.power, - time: e.time, - flags: ["EchoDamage"] - }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); - trigger = true; - } - } - if (trigger) { - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - } - } - }, - }, - "capture": { - "Dollmaker": (e, weapon, data) => { - if (data.attacker && data.attacker.player && data.enemy && !KDAllied(data.enemy)) { - if (!e.chance || KDRandom() < e.chance) { - let Enemy = KinkyDungeonGetEnemyByName("AllyDoll"); - let doll = { - summoned: true, - rage: Enemy.summonRage ? 9999 : undefined, - Enemy: Enemy, - id: KinkyDungeonGetEnemyID(), - x: data.enemy.x, - y: data.enemy.y, - hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, - movePoints: 0, - attackPoints: 0 - }; - let dollCount = KinkyDungeonEntities.filter((entity) => { - return entity.Enemy.name == "AllyDoll" && KDAllied(entity); - }).length; - if (dollCount > e.power) { - doll.faction = "Enemy"; - doll.boundLevel = doll.hp * 11; - KinkyDungeonSendTextMessage(8, TextGet("KDDollmakerTooManyDolls"), "lightgreen", 2); - } - KDAddEntity(doll); - if (e.energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - e.energyCost); - } - } - }, - }, - "afterDamageEnemy": { - - }, -}; - -/** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {weapon} weapon - * @param {*} data - */ -function KinkyDungeonHandleWeaponEvent(Event, e, weapon, data) { - if (Event === e.trigger && KDEventMapWeapon[Event] && KDEventMapWeapon[Event][e.type]) { - KDEventMapWeapon[Event][e.type](e, weapon, data); - } -} - - -/** - * @type {Object.>} - */ -let KDEventMapBullet = { - "beforeBulletHit": { - "DropKnife": (e, b, data) => { - let point = {x: b.x, y: b.y}; - if (!KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(point.x, point.y))) { - if (b.vx || b.vy) { - let speed = KDistEuclidean(b.vx, b.vy); - if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Math.round(b.x - b.vx / speed), Math.round(b.y - b.vy / speed)))) { - point = {x: Math.round(b.x - b.vx / speed), y: Math.round(b.y - b.vy / speed)}; - } - else if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Math.floor(b.x - b.vx / speed), Math.floor(b.y - b.vy / speed)))) { - point = {x: Math.floor(b.x - b.vx / speed), y: Math.floor(b.y - b.vy / speed)}; - } - else { - point = {x: Math.ceil(b.x - b.vx / speed), y: Math.ceil(b.y - b.vy / speed)}; - } - } - } - KinkyDungeonDropItem({name: "Knife"}, point, KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(point.x, point.y)), true, true); - }, - }, - "bulletHitEnemy": { - "Knockback": (e, b, data) => { - if (b && data.enemy && !data.enemy.Enemy.tags.noknockback && !KDIsImmobile(data.enemy)) { - let pushPower = KDPushModifier(e.power, data.enemy, false); - - if (pushPower > 0) { - let dist = e.dist; - if (pushPower > dist) dist *= 2; - for (let i = 0; i < dist; i++) { - let newX = data.enemy.x + Math.round(1 * Math.sign(b.vx)); - let newY = data.enemy.y + Math.round(1 * Math.sign(b.vy)); - if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) - && (e.dist == 1 || KinkyDungeonCheckProjectileClearance(data.enemy.x, data.enemy.y, newX, newY))) { - KDMoveEntity(data.enemy, newX, newY, false); - } - } - - } - } - }, - "GreaterRage": (e, b, data) => { - if (b && data.enemy && !(data.enemy.Enemy.tags.soulimmune)) { - let time = 300; - if (data.enemy.Enemy.tags.soulresist) time *= 0.5; - else if (data.enemy.Enemy.tags.soulweakness) time *= 2; - else if (data.enemy.Enemy.tags.soulsevereweakness) time *= 4; - if (data.enemy.Enemy.tags.boss) time *= 0.033; - else if (data.enemy.Enemy.tags.miniboss) time *= 0.1; - if (time > 100) time = 9999; - - if (!data.enemy.rage) data.enemy.rage = time; - else data.enemy.rage = Math.max(data.enemy.rage, time); - - KDAddThought(data.enemy.id, "Play", 11, time); - } - }, - "ElementalOnSlowOrBind": (e, b, data) => { - if (b && data.enemy && (KinkyDungeonIsSlowed(data.enemy) || data.enemy.bind > 0)) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); - } - }, - "ApplyGenBuff": (e, b, data) => { - if (b && data.enemy) { - if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) - KDApplyGenBuffs(data.enemy, e.buff, e.time); - } - }, - "PlugEnemy": (e, b, data) => { - if (b && data.enemy) { - if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { - if (data.enemy.Enemy?.bound && (data.enemy.boundLevel > 0 || KDEntityGetBuff(data.enemy, "Chastity"))) { - KDPlugEnemy(data.enemy); - } - } - } - }, - "LatexWall": (e, b, data) => { - if (b && data.enemy) { - if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { - if (!KDEnemyHasFlag(data.enemy, "latexWall")) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - bind: e.bind, - bindType: e.bindType, - }, true, false, b.bullet.spell, b, undefined, b.delay, true); - KDBlindEnemy(data.enemy, e.time); - KinkyDungeonSetEnemyFlag(data.enemy, "latexWall", 21); - } - } - } - }, - "EncaseBound": (e, b, data) => { - if (b && data.enemy && data.enemy.Enemy) { - if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { - if (data.enemy.Enemy.bound && (data.enemy.boundLevel >= data.enemy.maxhp || KDHelpless(data.enemy))) { - KinkyDungeonApplyBuffToEntity(data.enemy, KDEncased); - } - } - } - }, - "SilenceHumanoid": (e, b, data) => { - if (b && data.enemy && data.enemy.Enemy.bound) { - if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) - KDSilenceEnemy(data.enemy, e.time); - } - }, - "BlindHumanoid": (e, b, data) => { - if (b && data.enemy && data.enemy.Enemy.bound) { - if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) - KDBlindEnemy(data.enemy, e.time); - } - }, - "DisarmHumanoid": (e, b, data) => { - if (b && data.enemy && data.enemy.Enemy.bound) { - if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) - KDDisarmEnemy(data.enemy, e.time); - } - }, - "DisarmDebuff": (e, b, data) => { - if (b && data.enemy && data.enemy.Enemy.bound) { - if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { - KinkyDungeonApplyBuffToEntity(data.enemy, KDRestraintDisarmLight); - } - } - }, - "ElementalIfNotSilenced": (e, b, data) => { - if (b && data.enemy) { - if (!(data.enemy.silence > 0)) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); - } - } - }, - "ElementalIfNotBlinded": (e, b, data) => { - if (b && data.enemy) { - if (!(data.enemy.blind > 0)) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); - } - } - }, - "ElementalIfNotDisarmed": (e, b, data) => { - if (b && data.enemy) { - if (!(data.enemy.disarm > 0)) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); - } - } - }, - "ElementalIfNotSnared": (e, b, data) => { - if (b && data.enemy) { - if (!(data.enemy.bind > 0)) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); - } - } - }, - "ElementalIfHalfBound": (e, b, data) => { - if (b && data.enemy) { - if (KDBoundEffects(data.enemy) > 1) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); - } - } - }, - "Elemental": (e, b, data) => { - if (b && data.enemy) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); - } - }, - "BoundBonus": (e, b, data) => { - if (b && data.enemy) { - let mult = KDBoundEffects(data.enemy); - if (mult > 0) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power ? e.power * mult : undefined, - time: e.time, - bind: e.bind ? e.bind * mult : undefined, - bindType: e.bindType, - }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); - } - } - }, - "ElementalOnSlowOrBindOrDrench": (e, b, data) => { - if (b && data.enemy && (KinkyDungeonIsSlowed(data.enemy) || data.enemy.bind > 0 || (data.enemy.buffs && data.enemy.buffs.Drenched))) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); - } - }, - "ElementalOnDrench": (e, b, data) => { - if (b && data.enemy && (data.enemy.buffs && data.enemy.buffs.Drenched)) { - KinkyDungeonDamageEnemy(data.enemy, { - type: e.damage, - damage: e.power, - time: e.time, - bind: e.bind, - bindType: e.bindType, - }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); - } - }, - }, - "bulletTick": { - "ZoneOfPurity": (e, b, data) => { - let enemies = KDNearbyEnemies(b.x, b.y, e.aoe); - if (enemies.length > 0) { - for (let en of enemies) { - if (en && en.Enemy.bound && en.boundLevel > e.power) { - KinkyDungeonApplyBuffToEntity(en, KDChastity); - } - } - } - if (KDistChebyshev(KinkyDungeonPlayerEntity.x - b.x, KinkyDungeonPlayerEntity.y - b.y) <= e.aoe) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["magicBeltForced"]}, MiniGameKinkyDungeonLevel + 10, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonSendActionMessage(3, TextGet("KDZoneOfPuritySelf"), "#88AAFF", 2); - KinkyDungeonAddRestraintIfWeaker(restraintAdd, 0, false, undefined, false, false, undefined, undefined); - } - } - }, - "ZoneOfExcitement": (e, b, data) => { - let enemies = KDNearbyEnemies(b.x, b.y, e.aoe); - if (enemies.length > 0) { - for (let en of enemies) { - if (en && en.Enemy.bound) { - KinkyDungeonApplyBuffToEntity(en, KDToy); - } - } - } - if (KDistChebyshev(KinkyDungeonPlayerEntity.x - b.x, KinkyDungeonPlayerEntity.y - b.y) <= e.aoe) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["genericToys"]}, MiniGameKinkyDungeonLevel + 10, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonSendActionMessage(3, TextGet("KDZoneOfExcitementSelf"), "#88AAFF", 2); - KinkyDungeonAddRestraintIfWeaker(restraintAdd, 0, false, undefined, false, false, undefined, undefined); - } - } - }, - "CastSpellNearbyEnemy": (e, b, data) => { - if (data.delta > 0) { - let born = b.born ? 0 : 1; - let enemies = KDNearbyEnemies(b.x + b.vx * data.delta * born, b.y + b.vy * data.delta * born, e.aoe).filter((enemy) => { - return (KDHostile(enemy) || (b.x == enemy.x && b.y == enemy.y && !KDAllied(enemy))); - }); - if (e.player && KDistEuclidean(b.x + b.vx * data.delta * born, b.y + b.vy * data.delta * born) < e.aoe) { - enemies.push(KinkyDungeonPlayerEntity); - } - if (enemies.length > 0) { - let enemy = enemies[Math.floor(KDRandom() * enemies.length)]; - KinkyDungeonCastSpell(enemy.x, enemy.y, KinkyDungeonFindSpell(e.spell, true), undefined, undefined, undefined, b.bullet.faction); - } - } - }, - }, - "bulletAfterTick": { - "RubberMissileHoming": (e, b, data) => { - if (data.delta > 0 && b.bullet.targetX != undefined && b.bullet.targetY != undefined) { - // Scan for targets near the target location - if (b.bullet.faction) { - let minDist = 1000; - let entity = null; - let playerDist = 1000; - if (KDFactionHostile(b.bullet.faction, "Player")) { - playerDist = KDistEuclidean(KinkyDungeonPlayerEntity.x - b.bullet.targetX, KinkyDungeonPlayerEntity.y - b.bullet.targetY); - if (playerDist <= e.dist) { - entity = KinkyDungeonPlayerEntity; - minDist = playerDist; - } - } - - let enemies = KDNearbyEnemies(b.bullet.targetX, b.bullet.targetY, e.dist); - for (let en of enemies) { - if (!KDHelpless(en) && KDFactionHostile(b.bullet.faction, en)) { - playerDist = KDistEuclidean(en.x - b.bullet.targetX, en.y - b.bullet.targetY); - if (playerDist < minDist) { - entity = en; - minDist = playerDist; - } - } - } - if (entity) { - // Move the missile's target location toward it - if (b.bullet.targetX > entity.x) { - b.bullet.targetX = Math.max(entity.x, b.bullet.targetX - data.delta * e.power); - } else if (b.bullet.targetX < entity.x) { - b.bullet.targetX = Math.min(entity.x, b.bullet.targetX + data.delta * e.power); - } - if (b.bullet.targetY > entity.y) { - b.bullet.targetY = Math.max(entity.y, b.bullet.targetY - data.delta * e.power); - } else if (b.bullet.targetX < entity.y) { - b.bullet.targetY = Math.min(entity.y, b.bullet.targetY + data.delta * e.power); - } - } - } - let speed = KDistEuclidean(b.vx, b.vy); - - // Missile tracking - let direction = Math.atan2(b.bullet.targetY - b.y, b.bullet.targetX - b.x); - let vx = Math.cos(direction) * speed; - let vy = Math.sin(direction) * speed; - let vxx = b.vx; - let vyy = b.vy; - if (b.vx > vx) vxx = Math.max(vx, b.vx - data.delta * e.power); - else if (b.vx < vx) vxx = Math.min(vx, b.vx + data.delta * e.power); - if (b.vy > vy) vyy = Math.max(vy, b.vy - data.delta * e.power); - else if (b.vy < vy) vyy = Math.min(vy, b.vy + data.delta * e.power); - - if (!e.limit || KDistEuclidean(vxx, vyy) >= e.limit) { - b.vx = vxx; - b.vy = vyy; - } - - // Accelerate the missile - if (e.count) { - speed += e.count; - } - direction = Math.atan2(b.vy, b.vx); - b.vx = Math.cos(direction) * speed; - b.vy = Math.sin(direction) * speed; - } - }, - } -}; - -/** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {any} b - * @param {*} data - */ -function KinkyDungeonHandleBulletEvent(Event, e, b, data) { - if (Event === e.trigger && b.bullet && KDEventMapBullet[Event] && KDEventMapBullet[Event][e.type]) { - KDEventMapBullet[Event][e.type](e, b, data); - } -} - - - - -/** - * @type {Object.>} - */ -let KDEventMapEnemy = { - "passout": { - "delete": (e, enemy, data) => { - if (!e.chance || KDRandom() < e.chance) - enemy.hp = 0; - } - }, - "defeat": { - "delete": (e, enemy, data) => { - if (!e.chance || KDRandom() < e.chance) - enemy.hp = 0; - } - }, - "calcManaPool": { - "PetManaRegen": (e, enemy, data) => { - if (KDAllied(enemy) && KDistChebyshev(enemy.x - data.player.x, enemy.y - data.player.y) < e.dist) { - data.manaPoolRegen += e.power; - } - }, - }, - "tick": { - "DisplayAura": (e, enemy, data) => { - let enemies = KDNearbyEnemies(enemy.x, enemy.y, e.dist, enemy); - for (let en of enemies) { - KinkyDungeonApplyBuffToEntity(en, KDDollDebuff); - KinkyDungeonApplyBuffToEntity(en, KDDollDebuff2); - } - }, - "suicideWhenBound": (e, enemy, data) => { - if (KDHelpless(enemy)) { - enemy.hp = 0; - } - }, - }, - "getLights": { - "enemyTorch": (e, enemy, data) => { - data.lights.push({brightness: e.power, x: enemy.x, y: enemy.y, color: string2hex(e.color)}); - }, - }, - "beforeDamage": { - "shadowEngulf": (e, enemy, data) => { - if (data.enemy == enemy && data.target == KinkyDungeonPlayerEntity && data.restraintsAdded && data.restraintsAdded.length == 0 && !KinkyDungeonFlags.get("shadowEngulf")) { - if (data.enemy == enemy && data.target == KinkyDungeonPlayerEntity && data.restraintsAdded && data.restraintsAdded.length == 0 && !KinkyDungeonFlags.get("shadowEngulf")) { - KDTripleBuffKill("ShadowEngulf", KinkyDungeonPlayerEntity, 9, (tt) => { - KinkyDungeonPassOut(); - }, "Blindness"); - } - } - }, - "shadowDomme": (e, enemy, data) => { - if (data.enemy == enemy && data.target == KinkyDungeonPlayerEntity && data.restraintsAdded && data.restraintsAdded.length == 0 && !KinkyDungeonFlags.get("shadowEngulf")) { - KDTripleBuffKill("ShadowEngulf", KinkyDungeonPlayerEntity, 9, (tt) => { - // Passes out the player, but does NOT teleport - KinkyDungeonPassOut(true); - KDBreakTether(); - - // Instead it applies a debuff, and leash - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, - {id: "ShadowDommed", type: "Flag", duration: 9999, power: 1, maxCount: 1, currentCount: 1, tags: ["attack", "cast"], events: [ - {type: "ShadowDommed", trigger: "tick"}, - ]} - ); - - if (!KinkyDungeonGetRestraintItem("ItemNeck")) { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("ObsidianCollar"), 0, true, "Purple"); - } - if (!KinkyDungeonGetRestraintItem("ItemNeckRestraints")) { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BasicLeash"), 0, true, "Purple"); - } - - KinkyDungeonAttachTetherToEntity(3.5, enemy); - }, "Blindness"); - } - }, - }, - "death": { - "createEffectTile": (e, enemy, data) => { - if (!e.chance || KDRandom() < e.chance) { - let count = e.power ? e.power : 1; - let rad = e.aoe ? e.aoe : 1.5; - let minrad = e.dist; - for (let i = 0; i < count; i++) { - let slots = []; - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (Math.sqrt(X*X+Y*Y) <= rad && (!minrad || Math.sqrt(X*X+Y*Y) >= minrad)) { - if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KinkyDungeonGridWidth && enemy.y + Y < KinkyDungeonGridHeight) - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) - slots.push({x:X, y:Y}); - } - } - - if (slots.length > 0) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - if (slot) { - KDCreateEffectTile(enemy.x + slot.x, enemy.y + slot.y, { - name: e.kind, - duration: e.time, - }, e.variance); - } - } - - } - } - }, - }, - "spellCast": { - "ropeKrakenSummonTentacle": (e, enemy, data) => { - if (enemy == data.enemy && data.spell?.name == "SummonRopeTentacle") { - enemy.hp = Math.max(enemy.hp - enemy.Enemy.maxhp * KDMagicDefs.RopeKraken_TentacleCost, Math.min(enemy.hp, enemy.Enemy.maxhp * KDMagicDefs.RopeKraken_TentacleThreshold)); - } - }, - "sarcoKrakenSummonTentacle": (e, enemy, data) => { - if (enemy == data.enemy && data.spell?.name == "SummonSarcoTentacle") { - enemy.hp = Math.max(enemy.hp - enemy.Enemy.maxhp * KDMagicDefs.SarcoKraken_TentacleCost, Math.min(enemy.hp, enemy.Enemy.maxhp * KDMagicDefs.SarcoKraken_TentacleThreshold)); - } - }, - }, - "afterDamageEnemy": { - "bleedEffectTile": (e, enemy, data) => { - if (data.dmg > 0 && enemy == data.enemy) { - if (!e.chance || KDRandom() < e.chance) { - let count = e.power ? e.power : 1; - let rad = e.aoe ? e.aoe : 1.5; - let minrad = e.dist; - for (let i = 0; i < count; i++) { - let slots = []; - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (Math.sqrt(X*X+Y*Y) <= rad && (!minrad || Math.sqrt(X*X+Y*Y) >= minrad)) { - if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KinkyDungeonGridWidth && enemy.y + Y < KinkyDungeonGridHeight) - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) - slots.push({x:X, y:Y}); - } - } - - if (slots.length > 0) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - if (slot) { - KDCreateEffectTile(enemy.x + slot.x, enemy.y + slot.y, { - name: e.kind, - duration: e.duration - }, e.time); - } - } - - } - } - } - }, - }, - "duringDamageEnemy": { - "damageThreshold": (e, enemy, data) => { - if (enemy == data.enemy && data.dmgDealt < e.power) { - data.dmgDealt = 0; - } - }, - }, - "afterEnemyTick": { - "ShopkeeperRescueAI": (e, enemy, data) => { - // We heal nearby allies and self - if (data.delta && !KDHelpless(enemy) && !KinkyDungeonIsDisabled(enemy) && KDEnemyHasFlag(enemy, "RescuingPlayer") - && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - KinkyDungeonSetEnemyFlag(enemy, "wander", 0); - KinkyDungeonSetEnemyFlag(enemy, "failpath", 0); - KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); - KinkyDungeonSetEnemyFlag(enemy, "longPath", 3); - if (!e.chance || KDRandom() < e.chance) { - if (!KDIsPlayerTethered()) { - // Apply eager buff to make the shopkeeper fast - KinkyDungeonApplyBuffToEntity(enemy, KDEager); - // Go to leash the player - enemy.gx = KinkyDungeonPlayerEntity.x; - enemy.gy = KinkyDungeonPlayerEntity.y; - if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5) { - // Attach leash - let newAdd = KinkyDungeonGetRestraint({tags: ["leashing"]}, 0, 'grv'); - if (newAdd) { - KinkyDungeonAddRestraintIfWeaker(newAdd, 0, true, undefined, false, false, undefined, "Prisoner"); - } - if (KinkyDungeonAttachTetherToEntity(2.5, enemy)) { - KinkyDungeonSendTextMessage(9, TextGet("KDShopkeeperLeash"), "#ffffff", 4); - } - } - } else { - KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 3); - // Drag the player to the start position - enemy.gx = KinkyDungeonStartPosition.x; - enemy.gy = KinkyDungeonStartPosition.y; - if (KDistChebyshev(enemy.x - KinkyDungeonStartPosition.x, enemy.y - KinkyDungeonStartPosition.y) < 1.5 - && KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 2.5) { - KinkyDungeonSendTextMessage(10, TextGet("KDShopkeeperTeleportToStart"), "#ffffff", 4); - KDGameData.RoomType = "ShopStart"; // We do a tunnel every other room - KDGameData.MapMod = ""; // Reset the map mod - MiniGameKinkyDungeonLevel = Math.max(0, MiniGameKinkyDungeonLevel - 1); - let params = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]]; - KinkyDungeonCreateMap(params, MiniGameKinkyDungeonLevel); - KDStartDialog("ShopkeeperTeleport", enemy.Enemy.name, true, "", enemy); - } - } - } - } - }, - "dollmakerMissiles": (e, enemy, data) => { - if (data.delta && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - if (!e.chance || KDRandom() < e.chance) { - let player = KinkyDungeonPlayerEntity; - if (!KDHelpless(enemy) && !KDEnemyHasFlag(enemy, "dollmakerMissiles") && enemy.aware && KDHostile(enemy) && KDistEuclidean(enemy.x - player.x, enemy.y-player.y) > 2.5) { - let origins = [ - {x:player.x + e.dist, y: player.y}, - {x:player.x - e.dist, y: player.y}, - {x:player.x, y: player.y+e.dist}, - {x:player.x, y: player.y-e.dist}, - {x:player.x+e.dist, y: player.y+e.dist}, - {x:player.x+e.dist, y: player.y-e.dist}, - {x:player.x-e.dist, y: player.y+e.dist}, - {x:player.x-e.dist, y: player.y-e.dist}, - {x:player.x+e.dist, y: player.y+e.dist/2}, - {x:player.x+e.dist, y: player.y-e.dist/2}, - {x:player.x-e.dist, y: player.y+e.dist/2}, - {x:player.x-e.dist, y: player.y-e.dist/2}, - {x:player.x+e.dist/2, y: player.y+e.dist}, - {x:player.x+e.dist/2, y: player.y-e.dist}, - {x:player.x-e.dist/2, y: player.y+e.dist}, - {x:player.x-e.dist/2, y: player.y-e.dist}, - ]; - - - origins = origins.filter((origin) => { - return KinkyDungeonNoEnemy(origin.x, origin.y) - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(origin.x, origin.y)) - && KinkyDungeonCheckPath(origin.x, origin.y, player.x, player.y, true, false, 1); - }); - let finalorigin = []; - for (let i =0; i < e.count; i++) { - let index = Math.floor(KDRandom()*origins.length); - if (origins[index]) { - finalorigin.push(origins[index]); - origins.splice(index, 1); - } - } - for (let origin of finalorigin) { - let spell = KinkyDungeonFindSpell(e.kind, true); - let b = KinkyDungeonLaunchBullet(origin.x, origin.y, - player.x,player.y, - 0.5, {noSprite: spell.noSprite, faction: "Ambush", name:spell.name, block: spell.block, width:spell.size, height:spell.size, summon:spell.summon, - targetX: player.x, targetY: player.y, cast: Object.assign({}, spell.spellcast), - source: enemy.id, dot: spell.dot, - bulletColor: spell.bulletColor, bulletLight: spell.bulletLight, - bulletSpin: spell.bulletSpin, - effectTile: spell.effectTile, effectTileDurationMod: spell.effectTileDurationMod, - effectTileTrail: spell.effectTileTrail, effectTileDurationModTrail: spell.effectTileDurationModTrail, effectTileTrailAoE: spell.effectTileTrailAoE, - passthrough: spell.noTerrainHit, noEnemyCollision: spell.noEnemyCollision, alwaysCollideTags: spell.alwaysCollideTags, nonVolatile:spell.nonVolatile, noDoubleHit: spell.noDoubleHit, - pierceEnemies: spell.pierceEnemies, piercing: spell.piercing, events: spell.events, - lifetime: (spell.bulletLifetime ? spell.bulletLifetime : 1000), origin: {x: origin.x, y: origin.y}, range: spell.range, hit:spell.onhit, - damage: {evadeable: spell.evadeable, damage:spell.power, type:spell.damage, distract: spell.distract, distractEff: spell.distractEff, bindEff: spell.bindEff, bind: spell.bind, bindType: spell.bindType, boundBonus: spell.boundBonus, time:spell.time, flags:spell.damageFlags}, spell: spell}, false); - b.visual_x = origin.x; - b.visual_y = origin.y; - let dist = KDistEuclidean(player.x - origin.x, player.y - origin.y); - b.vy = 0.5 * (player.y - origin.y)/dist; - b.vx = 0.5 * (player.x - origin.x)/dist; - } - - if (finalorigin.length > 0) { - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Missile.ogg", enemy); - KinkyDungeonSetEnemyFlag(enemy, "dollmakerMissiles", e.time); - } - - - } - } - } - }, - "nurseAura": (e, enemy, data) => { - // We heal nearby allies and self - if (data.delta && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - if (!e.chance || KDRandom() < e.chance) { - let nearby = KDNearbyNeutrals(enemy.x, enemy.y, e.dist, enemy); - for (let en of nearby) { - if (en.hp > 0.52) en.hp = Math.min(en.hp + e.power, en.Enemy.maxhp); - } - } - } - }, - "shadowDebuff": (e, enemy, data) => { - // We heal nearby allies and self - if (((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - let light = KinkyDungeonBrightnessGet(enemy.x, enemy.y); - if (light >= 4.5) { - KinkyDungeonApplyBuffToEntity(enemy, {id: "ShadowDebuff1", aura: "#ff5555", type: "MoveSpeed", duration: 1, power: -0.7, tags: ["speed"]}); - KinkyDungeonApplyBuffToEntity(enemy, {id: "ShadowDebuff2", aura: "#ff5555", type: "AttackSpeed", duration: 1, power: -0.5, tags: ["speed"]}); - } else if (light > 3) { - KinkyDungeonApplyBuffToEntity(enemy, {id: "ShadowDebuff1", aura: "#ff5555", type: "MoveSpeed", duration: 1, power: -0.4, tags: ["speed"]}); - } - } - }, - "shadowDommeRefresh": (e, enemy, data) => { - if (KinkyDungeonFlags.get("ShadowDommed")) { - KinkyDungeonSetEnemyFlag(enemy, "wander", 0); - } - }, - "wolfShieldDroneAura": (e, enemy, data) => { - // We apply a buff to nearby allies, but not self - if (data.delta && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - if (!e.chance || KDRandom() < e.chance) { - let nearby = KDNearbyNeutrals(enemy.x, enemy.y, e.dist, enemy); - for (let en of nearby) { - if (en != enemy && en.hp > 0.52 && KDMatchTags(["nevermere", "wolfgirl", "alchemist", "dressmaker", "bountyhunter"], en)) { - KinkyDungeonApplyBuffToEntity(en, { - id: "WolfDroneArmor", aura: "#00ffff", type: "Armor", duration: 1.1, power: e.power, player: false, enemies: true, tags: ["defense", "armor"] - }); - KinkyDungeonApplyBuffToEntity(en, { - id: "WolfDroneSpellResist", type: "SpellResist", duration: 1.1, power: e.power, player: false, enemies: true, tags: ["defense", "spellresist"] - }); - } - } - } - } - }, - "maidforceHeadAura": (e, enemy, data) => { - // We apply a buff to nearby allies, but not self - if (data.delta && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - if (!e.chance || KDRandom() < e.chance) { - if (enemy.aware && KinkyDungeonAggressive(enemy) && (KDPlayerIsStunned())) { - KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, "charm", {name: "MaidChastity", power: 2, damage: "charm"}); - } - } - } - }, - "electrifyLocal": (e, enemy, data) => { - if (data.delta && (enemy.aware || enemy.vp > 0.5) && (KDNearbyEnemies(enemy.x, enemy.y, 1.5, enemy).length > 0 || KinkyDungeonAggressive(enemy)) && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - if (!e.chance || KDRandom() < e.chance) { - let count = e.power ? e.power : 1; - let rad = e.aoe ? e.aoe : 1.5; - let minrad = 0.5; - for (let i = 0; i < count; i++) { - let slots = []; - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (Math.sqrt(X*X+Y*Y) <= rad && (!minrad || Math.sqrt(X*X+Y*Y) >= minrad)) { - if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KinkyDungeonGridWidth && enemy.y + Y < KinkyDungeonGridHeight) - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) - slots.push({x:X, y:Y}); - } - } - - if (slots.length > 0) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - if (slot) { - KinkyDungeonCastSpell(enemy.x + slot.x, enemy.y + slot.y, KinkyDungeonFindSpell("WitchElectrify", true), enemy, undefined, undefined); - } - } - - } - } - } - }, - "createEffectTile": (e, enemy, data) => { - if (data.delta &&((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - if (!e.chance || KDRandom() < e.chance) { - let count = e.power ? e.power : 1; - let rad = e.aoe ? e.aoe : 1.5; - let minrad = e.dist; - for (let i = 0; i < count; i++) { - let slots = []; - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (Math.sqrt(X*X+Y*Y) <= rad && (!minrad || Math.sqrt(X*X+Y*Y) >= minrad)) { - if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KinkyDungeonGridWidth && enemy.y + Y < KinkyDungeonGridHeight) - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) - slots.push({x:X, y:Y}); - } - } - - if (slots.length > 0) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - if (slot) { - KDCreateEffectTile(enemy.x + slot.x, enemy.y + slot.y, { - name: e.kind, - }, e.time); - } - } - - } - } - } - }, - "createWater": (e, enemy, data) => { - if (data.delta && !(enemy.freeze > 0) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - if (!e.chance || KDRandom() < e.chance) { - let count = e.power ? e.power : 1; - let rad = e.aoe ? e.aoe : 1.5; - let minrad = e.dist; - for (let i = 0; i < count; i++) { - let slots = []; - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (Math.sqrt(X*X+Y*Y) <= rad && (!minrad || Math.sqrt(X*X+Y*Y) >= minrad)) { - if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KinkyDungeonGridWidth && enemy.y + Y < KinkyDungeonGridHeight) - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) - slots.push({x:X, y:Y}); - } - } - - if (slots.length > 0) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - if (slot) { - KDCreateEffectTile(enemy.x + slot.x, enemy.y + slot.y, { - name: "Water", - duration: 12, - }, 8); - } - } - - } - } - } - }, - "createIce": (e, enemy, data) => { - if (data.delta && !(enemy.freeze > 0) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - if (!e.chance || KDRandom() < e.chance) { - let count = e.power ? e.power : 1; - let rad = e.aoe ? e.aoe : 1.5; - let minrad = e.dist; - for (let i = 0; i < count; i++) { - let slots = []; - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (Math.sqrt(X*X+Y*Y) <= rad && (!minrad || Math.sqrt(X*X+Y*Y) >= minrad)) { - if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KinkyDungeonGridWidth && enemy.y + Y < KinkyDungeonGridHeight) - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) - slots.push({x:X, y:Y}); - } - } - - if (slots.length > 0) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - if (slot) { - KDCreateEffectTile(enemy.x + slot.x, enemy.y + slot.y, { - name: "Ice", - duration: 6, - }, 4); - } - } - - } - } - } - }, - "ApplyConductionAoE": (e, enemy, data) => { - if (data.delta > 0 && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - let bb = Object.assign({}, KDConduction); - bb.duration = 1; - let enemies = KDNearbyEnemies(enemy.x, enemy.y, e.aoe); - for (let entity of enemies) { - if (!entity.buffs) entity.buffs = {}; - KinkyDungeonApplyBuff(entity.buffs, bb); - } - if (KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < e.aoe) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, bb); - } - } - }, - "CastSpellNearbyEnemy": (e, enemy, data) => { - if (data.delta > 0 && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - let enemies = KDNearbyEnemies(enemy.x, enemy.y, e.aoe).filter((enemy2) => { - return (KDHostile(enemy2) || (enemy.x == enemy2.x && enemy.y == enemy2.y && KDFactionRelation(KDGetFaction(enemy2), KDGetFaction(enemy)) < 0.5)); - }); - if (e.player && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < e.aoe) { - enemies.push(KinkyDungeonPlayerEntity); - } - if (enemies.length > 0) { - let enemy2 = enemies[Math.floor(KDRandom() * enemies.length)]; - KinkyDungeonCastSpell(enemy2.x, enemy2.y, KinkyDungeonFindSpell(e.spell, true), undefined, undefined, undefined, KDGetFaction(enemy)); - } - } - }, - }, -}; - -/** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {entity} enemy - * @param {*} data - */ -function KinkyDungeonHandleEnemyEvent(Event, e, enemy, data) { - if (Event === e.trigger && KDEventMapEnemy[Event] && KDEventMapEnemy[Event][e.type]) { - KDEventMapEnemy[Event][e.type](e, enemy, data); - } -} - - - -/** - * @type {Object.>} - */ -let KDEventMapGeneric = { - "calcEnemyTags": { - "perkTags": (e, data) => { - // This event adds tags to enemy tag determination based on perk prefs - if (KinkyDungeonStatsChoice.get("TapePref")) data.tags.push("tapePref"); - else if (KinkyDungeonStatsChoice.get("TapeOptout")) data.tags.push("tapeOptout"); - } - }, - "postMapgen": { - "resetDollRoom": (e, data) => { - //if (!KDGameData.RoomType || !(alts[KDGameData.RoomType].data?.dollroom)) { - //KDGameData.DollRoomCount = 0; - //} - } - }, - "defeat": { - "dollRoomRemove": (e, enemy, data) => { - // Removes the excess dollsmiths that are spawned when you escape the dollroom - if (KDGameData.RoomType && alts[KDGameData.RoomType].data?.dollroom) { - for (let en of KinkyDungeonEntities) { - if (en.Enemy.tags.dollsmith) { - en.noDrop = true; - en.hp = 0; - KDClearItems(en); - } - } - } - } - }, - "beforeHandleStairs": { - "resetDollRoom": (e, data) => { - if (KDGameData.RoomType && alts[KDGameData.RoomType].data?.dollroom) { - KDGameData.DollRoomCount += 1; - if (KDGameData.DollRoomCount >= 3) { - // Allow player to pass unless returning to previous - if (KinkyDungeonFlags.get("NoDollRoomBypass")) { - data.overrideProgression = true; - data.overrideRoomType = true; - data.mapMod = ""; - KDGameData.RoomType = ""; - } - } else { - data.overrideRoomType = true; - data.overrideProgression = true; - data.mapMod = ""; - KDGameData.RoomType = "DollRoom"; - } - - } - } - }, - "drawSGTooltip": { - "goddessBonus": (e, data) => { - if (data.item && KDRestraint(data.item)?.shrine) { - let bonus = KDGetItemGoddessBonus(data.item); - - if (bonus) { - data.extraLines.push(TextGet("KDGoddessStat_" + (bonus > 0 ? "Bonus" : "Penalty")) + Math.round(100 * bonus) + "%"); - data.extraLineColor.push(KDGetPosNegColor(bonus)); - } - } - }, - }, - "playerMove": { - "Conveyor": (e, data) => { - for (let player of [KinkyDungeonPlayerEntity]) { - if (KinkyDungeonMapGet(player.x, player.y) == 'V') - KDConveyor(1, player.x, player.y); - } - - }, - "noisyTerrain": (e, data) => { - if (data.sprint && !data.cancelmove) { - let moves = [ - {x: data.moveX, y: data.moveY, str: data.moveX + "," + data.moveY}, - ]; - for (let m of moves) - if (KinkyDungeonEffectTilesGet(m.str)) { - for (let tile of Object.values(KinkyDungeonEffectTilesGet(m.str))) { - if (tile.tags && tile.tags.includes("noisy")) { - KinkyDungeonMakeNoise(5, m.x, m.y); - KinkyDungeonSendTextMessage(3, TextGet("KDNoisyTerrain"), "#ff8800", 3, false, true); - } - } - } - } - }, - }, - "resetEventVar": { - /** - * Helper event to clear out variables that are meant to always be reset every floor - * You can add your own event like this one - */ - "resetVars": (e, data) => { - KDEventData.SlimeLevel = 0; - }, - }, - "resetEventVarTick": { - /** - * Helper event to clear out variables that are meant to always be reset every floor - * You can add your own event like this one - */ - "resetVars": (e, data) => { - if (KDEventData.SlimeLevel < 0) - KDEventData.SlimeLevel = 0; - KDEventData.SlimeLevelStart = KDEventData.SlimeLevel; - if (KDAlertCD > 0) KDAlertCD -= data.delta; - - if (KinkyDungeonLastTurnAction != "Attack" && KDGameData.WarningLevel > 0) { - if (KDRandom() < 0.25) KDGameData.WarningLevel -= data.delta; - if (KDGameData.WarningLevel > 5) KDGameData.WarningLevel = 5; - } - }, - }, - /** Stuff that occurs after the quest stuff is generated */ - "postQuest": { - /** - * Helper event to clear out flags that are meant to always be reset every floor - * You can add your own event like this one - */ - "resetFlags": (e, data) => { - KinkyDungeonSetFlag("slept", 0); - }, - /** Updates gold locks */ - "lockStart": (e, data) => { - for (let inv of KinkyDungeonAllRestraint()) { - if (inv.lock && KDLocks[inv.lock] && KDLocks[inv.lock].levelStart) { - KDLocks[inv.lock].levelStart(inv); - } - } - }, - }, - "tickFlags": { - "TempFlagFloorTicks": (e, data) => { - if (KDGameData.TempFlagFloorTicks) - for (let f of Object.entries(KDGameData.TempFlagFloorTicks)) { - if (!KinkyDungeonFlags.get(f[0])) delete KDGameData.TempFlagFloorTicks[f[0]]; - else { - if (f[1] > data.delta) KDGameData.TempFlagFloorTicks[f[0]] = KDGameData.TempFlagFloorTicks[f[0]] - data.delta; - else { - KinkyDungeonSetFlag(f[0], 0); - delete KDGameData.TempFlagFloorTicks[f[0]]; - } - } - } - } - }, - /*"calcDisplayDamage": { - "BoostDamage": (e, data) => { - if (KinkyDungeonStatMana >= KinkyDungeonStatMana * 0.999 && KinkyDungeonStatsChoice.has("GroundedInReality")) { - data.buffdmg = Math.max(0, data.buffdmg + KinkyDungeonPlayerDamage.dmg * 0.3); - } - }, - },*/ - "playerAttack": { - "GroundedInReality": (e, data) => { - if (KinkyDungeonPlayerDamage && KinkyDungeonStatMana >= KinkyDungeonStatManaMax * 0.999 && KinkyDungeonStatsChoice.has("GroundedInReality")) { - if (!data.miss && !data.disarm && data.targetX && data.targetY && data.enemy && KDHostile(data.enemy)) { - KinkyDungeonDamageEnemy(data.enemy, { - type: "electric", - damage: KinkyDungeonPlayerDamage.dmg * 0.3, - }, false, false, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - }, - }, - "afterCalcMana": { - "ImmovableObject": (e, data) => { - if (KinkyDungeonStatWill >= KinkyDungeonStatWillMax * 0.90 && KinkyDungeonStatsChoice.has("ImmovableObject")) { - if (data.spell && data.spell.tags && data.spell.tags.includes("buff") && data.spell.tags.includes("earth")) - data.cost = data.cost * 0.5; - } - }, - }, - "tick": { - "DollRoomUpdate": (e, data) => { - if (KDGameData.RoomType && alts[KDGameData.RoomType].data?.dollroom) { - // Spawn shopkeeper - - if (KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)?.OffLimits - && KDCanSpawnShopkeeper(true) - && KDRandom() < 0.1) KDStartDialog("ShopkeeperRescue", "ShopkeeperRescue", true, "", undefined); - - let spawn = true; - let eligible = false; - for (let player of [KinkyDungeonPlayerEntity]) { - if (spawn && KDistEuclidean(player.x - KinkyDungeonStartPosition.x, player.y - KinkyDungeonStartPosition.y) < 10) { - spawn = false; - } - if (spawn && !eligible && !KinkyDungeonTilesGet(player.x + "," + player.y)?.OffLimits) { - eligible = true; - } - } - if (eligible && spawn && !KinkyDungeonFlags.get("spawnDollsmith")) { - let count = 0; - for (let en of KinkyDungeonEntities) { - if (en.Enemy.tags.dollsmith) count += 1; - } - if (count < 5) { - KinkyDungeonSetFlag("spawnDollsmith", 15); - let en = DialogueCreateEnemy(KinkyDungeonStartPosition.x, KinkyDungeonStartPosition.y, "Dollsmith"); - en.summoned = true; - en.noDrop = true; - } - } - } - }, - "BurningDesire": (e, data) => { - if (KinkyDungeonStatDistraction >= KinkyDungeonStatDistractionMax * 0.7 && KinkyDungeonStatsChoice.has("BurningDesire")) { - let px = KinkyDungeonPlayerEntity.x - 1 + Math.round(2 * KDRandom()); - let py = KinkyDungeonPlayerEntity.y - 1 + Math.round(2 * KDRandom()); - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(px, py))) - KDCreateEffectTile(px, py, { - name: "Ember", - duration: 4 - }, 1); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "BurningDesire", - type: "fireDamageBuff", - power: 0.4, - duration: 2 - }); - - } - }, - "Needs": (e, data) => { - if (KinkyDungeonStatsChoice.get("Needs")) { - if (data.delta > 0 && !(KDGameData.OrgasmStamina > 0)) { - if (KinkyDungeonStatDistractionLower < KinkyDungeonStatDistractionLowerCap * KinkyDungeonStatDistractionMax) { - KinkyDungeonStatDistractionLower = Math.min(KinkyDungeonStatDistractionLower + data.delta*0.01, KinkyDungeonStatDistractionLowerCap * KinkyDungeonStatDistractionMax); - } - } - } - }, - "LikeTheWind": (e, data) => { - if (KinkyDungeonStatStamina >= KinkyDungeonStatStaminaMax * 0.95 && KinkyDungeonStatsChoice.has("LikeTheWind")) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "LikeTheWind", - type: "Evasion", - power: 0.3, - duration: 2 - }); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "LikeTheWind2", - type: "SlowLevel", - power: -1, - duration: 2 - }); - - } - }, - "ImmovableObject": (e, data) => { - if (KinkyDungeonStatWill >= KinkyDungeonStatWillMax * 0.90 && KinkyDungeonStatsChoice.has("ImmovableObject")) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "ImmovableObject", - type: "RestraintBlock", - power: 15, - duration: 2 - }); - - } - }, - "LeastResistance": (e, data) => { - if (KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.01 && KinkyDungeonStatsChoice.has("LeastResistance")) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "LeastResistance", - type: "Evasion", - power: 0.35, - duration: 2 - }); - } - }, - - "FrigidPersonality": (e, data) => { - if (KinkyDungeonStatDistraction <= KinkyDungeonStatDistractionMax * 0.01 && KinkyDungeonStatsChoice.has("FrigidPersonality")) { - let px = KinkyDungeonPlayerEntity.x - 1 + Math.round(2 * KDRandom()); - let py = KinkyDungeonPlayerEntity.y - 1 + Math.round(2 * KDRandom()); - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(px, py))) - KDCreateEffectTile(px, py, { - name: "Ice", - duration: 4 - }, 1); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "FrigidPersonality", - type: "iceDamageBuff", - power: 0.1, - duration: 2 - }); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "FrigidPersonality2", - type: "frostDamageBuff", - power: 0.1, - duration: 2 - }); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, KDNoChillNoAura); - - } - }, - }, - "playerCast": { - "ArousingMagic": (e, data) => { - if (KinkyDungeonStatsChoice.get("ArousingMagic")) { - KinkyDungeonChangeDistraction(KinkyDungeonGetManaCost(data.spell), false, 0.1); - } - }, - "Clearheaded": (e, data) => { - if (KinkyDungeonStatsChoice.get("Clearheaded")) { - KinkyDungeonChangeDistraction(-KinkyDungeonGetManaCost(data.spell), false, 0.1); - } - }, - }, - "beforeDamage": { - "LeastResistance": (e, data) => { - if (KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.01 && KinkyDungeonStatsChoice.has("LeastResistance")) { - if (data.attacker && data.target.player && data.bound && (data.attacker.player || !data.target.player || KinkyDungeonAggressive(data.attacker))) { - if (data.attacker.player) { - KinkyDungeonDealDamage({damage: KinkyDungeonStatWillMax*0.1, type: "acid"}); - } else { - KinkyDungeonDamageEnemy(data.attacker, {damage: KinkyDungeonStatWillMax*0.20, type: "acid"}, false, false, undefined, undefined, KinkyDungeonPlayerEntity); - } - } - } - }, - }, - "perksStruggleCalc": { - "CursedLocks": (e, data) => { - if (KinkyDungeonStatsChoice.get("CursedLocks") && data.struggleType == "Cut" && data.restraint.lock) { - data.escapeChance = -100; - if (data.Msg) { - KinkyDungeonSendTextMessage(10, TextGet("KDCursedLocks"), "#aa4488", 1.1); - } - } - }, - }, -}; - -/** - * - * @param {string} Event - * @param {*} data - */ -function KinkyDungeonHandleGenericEvent(Event, data) { - if (!KDMapHasEvent(KDEventMapGeneric, Event)) return; - if (KDEventMapGeneric[Event] && KDEventMapGeneric[Event]) { - for (let e of Object.keys(KDEventMapGeneric[Event])) - KDEventMapGeneric[Event][e](e, data); - } -} - - - - -function KDEventPrereq(e, item, tags) { - if (tags) { - if (!tags.length) { - tags = [tags]; - } - for (let t of tags) { - if (t == "locked") { - return item.lock; - } - } - } - return true; -} diff --git a/Game/KinkyDungeonFactions.js b/Game/KinkyDungeonFactions.js deleted file mode 100644 index e83cb58cc..000000000 --- a/Game/KinkyDungeonFactions.js +++ /dev/null @@ -1,118 +0,0 @@ -"use strict"; - -/** - * Determines if the enemy (which can be hostile) is aggressive, i.e. will pursue the player or ignore - * @param {entity} [enemy] - * @returns {boolean} - */ -function KinkyDungeonAggressive(enemy) { - if (enemy && enemy.hostile > 0) return true; - if (!KDGameData.PrisonerState || KDGameData.PrisonerState == "chase") return KDHostile(enemy); - if (enemy && KDFactionRelation(KDGetFaction(enemy), "Jail") < -0.4) return KDHostile(enemy); - if (enemy && KDFactionRelation(KDGetFaction(enemy), "Jail") < -0.1 && KDGameData.PrisonerState != 'jail' && (KDGameData.PrisonerState != 'parole' || !KinkyDungeonPlayerInCell(true, true))) return KDHostile(enemy); - return false; -} - -/** - * Returns whether or not the enemy is ALLIED, i.e it will follow the player - * @param {entity} enemy - * @returns {boolean} - */ -function KDAllied(enemy) { - return !(enemy.rage > 0) && !(enemy.hostile > 0) && KDFactionAllied("Player", enemy); -} - -/** - * Returns whether the enemy is HOSTILE to the player (if no optional argument) or the optional enemy - * @param {entity} enemy - * @param {entity} [enemy2] - * @returns {boolean} - */ -function KDHostile(enemy, enemy2) { - if (enemy == enemy2) return false; - return (enemy.rage > 0) || - ( - !(!enemy2 && enemy.ceasefire > 0) - && ( - (!enemy2 - && (KDFactionHostile("Player", enemy) || enemy.hostile > 0) - || (enemy2 && ((KDGetFaction(enemy2) == "Player" && enemy.hostile > 0) || KDFactionHostile(KDGetFaction(enemy), enemy2)))))); -} - -/** - * Gets the faction of the enemy, returning "Player" if its an ally, or "Enemy" if no faction - * @param {entity} enemy - * @returns {string} - */ -function KDGetFaction(enemy) { - if (!enemy) return undefined; - if (enemy.player) return "Player"; - let E = enemy.Enemy; - if (enemy.rage > 0) return "Rage"; - if (enemy.faction) return enemy.faction; - if ((E && E.allied) || ((enemy.allied || (E && E.faction && KDFactionAllied("Player", E.faction) && !KDEnemyHasFlag(enemy, "NoFollow"))) && !enemy.faction && !KDEnemyHasFlag(enemy, "Shop"))) return "Player"; - if (E && E.faction) return E.faction; - return "Enemy"; -} - -/** - * Gets the faction of the enemy, returning "Player" if its an ally, or "Enemy" if no faction - * @param {entity} enemy - * @returns {string} - */ -function KDGetFactionOriginal(enemy) { - let E = enemy.Enemy; - if (enemy.faction) return enemy.faction; - if (E && E.faction) return E.faction; - return "Enemy"; -} - -/** - * Consults the faction table and decides if the two mentioned factions are hostile - * @param {string} a - Faction 1 - * @param {string | entity} b - Faction 2 - * @returns {boolean} - */ -function KDFactionHostile(a, b) { - if (a == "Player" && b && !(typeof b === "string") && b.hostile > 0) return true; - if (!(typeof b === "string") && b.rage > 0) return true; - if (a == "Player" && !(typeof b === "string") && b.allied > 0) return false; - if (!(typeof b === "string")) b = KDGetFaction(b); - if (a == "Rage" || b == "Rage") return true; - if (a == "Player" && b == "Enemy") return true; - if (b == "Player" && a == "Enemy") return true; - if (KDFactionRelation(a, b) <= -0.5) return true; - if (a == b) return false; - return false; -} - -/** - * Consults the faction table and decides if the two mentioned factions are allied - * @param {string} a - Faction 1 - * @param {string | entity} b - Faction 2 - * @param {number} [threshold] - Faction 2 - * @returns {boolean} - */ -function KDFactionAllied(a, b, threshold = 0.7) { - if (a == "Player" && b && !(typeof b === "string") && b.hostile > 0) return false; - if (!(typeof b === "string") && b.rage > 0) return false; - if (a == "Player" && !(typeof b === "string") && b.allied > 0) return true; - if (!(typeof b === "string")) b = KDGetFaction(b); - if (a == "Rage" || b == "Rage") return false; - if (a == "Player" && b == "Player") return true; - if (b == "Enemy" && a == "Enemy") return true; - if (KDFactionRelation(a, !(typeof b === "string") ? KDGetFaction(b) : b) >= threshold) return true; - if (a == b) return true; - return false; -} - -/** - * Consults the faction table and decides if the two mentioned factions are favorable (i.e no friendly fire) - * @param {string} a - Faction 1 - * @param {string | entity} b - Faction 2 - * @returns {boolean} - */ -function KDFactionFavorable(a, b) { - return KDFactionAllied(a, b, 0.099); -} - diff --git a/Game/KinkyDungeonFactionsList.js b/Game/KinkyDungeonFactionsList.js deleted file mode 100644 index 41323d48d..000000000 --- a/Game/KinkyDungeonFactionsList.js +++ /dev/null @@ -1,537 +0,0 @@ -"use strict"; - -let KinkyDungeonFactionColors = { - "Jail": ["#8A120C"], - "Slime": ["#9B49BD", "#9B49BD"], - "Dressmaker": ["#6B48E0", "#F8BD01"], - "Alchemist": ["#4c6885", "#7bef41"], - "Elf": ["#63ab3f", "#F8BD01"], - "Bountyhunter": ["#252525", "#bfbfbf"], - "AncientRobot": ["#444444", "#4fa4b8"], - "Dollsmith": ["#444444", "#b1062a", "#ff5277"], - "Mushy": ["#bfbfbf", "#92c1e8"], - "Apprentice": ["#686f99", "#ff5277"], - "Witch": ["#222222", "#8359b3"], -}; - -/** Hidden factions do not auto-rep change when you attack them */ -let KinkyDungeonHiddenFactions = [ - "Plant", - "Natural", - "Player", - "Enemy", - "Jail", - "Prisoner", - "Beast", - "Slime", - "Mold", - "KinkyConstruct", - "Boss", - "Ambush", - "Rage", - "Ghost", - "Trap", - "Rebel", - "Rock", - "Delinquent", - "Wolfhunter", - "Chase", - "Mushy", - "Witch", -]; - - - -let KDFactionSecurityMod = { - Dressmaker: { - level_magic: 1, - level_key: 1, - }, - Witch: { - level_magic: 1, - level_key: 1, - }, - Elemental: { - level_magic: 2, - }, - Mushy: { - level_magic: 1, - level_tech: 0, - }, - Apprentice: { - level_magic: 0, - level_key: -1, - }, - Elf: { - level_magic: 1, - level_key: 1, - }, - Bast: { - level_magic: 1, - }, - AncientRobot: { - level_tech: 2, - level_key: 1, - }, - Nevermere: { - level_tech: 1, - level_key: 1, - }, - Maidforce: { - level_tech: 0, - level_magic: -1, - level_key: 1, - }, - Alchemist: { - level_tech: 1, - level_magic: -1, - }, - Bountyhunter: { - level_tech: 0, - level_key: 2, - }, -}; - -let KDBaseSecurity = { - level_key: 0, -}; - -let KDPiousFactions = { - "Angel": 1.0, -}; - -/** Shows tooltips for these factions even though they are hidden */ -let KinkyDungeonTooltipFactions = [ - "Rebel", - "Ambush", - "Delinquent", - "Wolfhunter", - "Rock", - "Rage", -]; - -/** Tag for these factions, these also can have increased chances to appear on a map */ -let KinkyDungeonFactionTag = { - Bountyhunter: "bountyhunter", - Bandit: "bandit", - Alchemist: "alchemist", - Nevermere: "nevermere", - Apprentice: "apprentice", - Dressmaker: "dressmaker", - //Witch: "witch", - Elemental: "elemental", - Dragon: "dragon", - Maidforce: "maid", - Bast: "mummy", - Elf: "elf", - //Mushy: "mushy", - AncientRobot: "robot", -}; - -let KinkyDungeonFactionRelationsBase = { - "Player": { - Enemy: -1.0, - Jail: -1.0, - Prisoner: 0.1, - - // Wild factions - KinkyConstruct: -0.9, - Plant: -0.9, - Slime: -1.0, - Mold: -1.0, - Beast: -0.6, - - // Mainline factions - Bountyhunter: -0.3, - Bandit: -0.7, - Alchemist: -0.2, - Nevermere: -0.1, - Apprentice: 0.2, - Dressmaker: -0.4, - Witch: -0.8, - Elemental: -0.6, - Dragon: 0.1, - Maidforce: -0.1, - Bast: -0.6, - Elf: -0.3, - Mushy: -0.6, - AncientRobot: -0.4, - - // Special factions - Angel: 0.1, - Demon: -0.25, - }, - "Angel": { - Demon: -1.0, - Ghost: -0.7, - Elemental: 0.15, - Dragon: 0.05, - AncientRobot: -0.25, - Nevermere: -0.1, - Enemy: 0.1, - }, - "Natural": { - Player: -1, - Jail: -1, - }, - "Ghost": { - Player: -1.0, - Jail: -0.25, - }, - "Rock": { - Player: -1.0, - }, - "Rebel": { - Jail: -0.1, - }, - "Demon": { - Elf: -1.0, - Bast: -1.0, - Witch: 0.25, - - Bountyhunter: -0.5, - Bandit: -0.5, - Alchemist: -0.5, - Nevermere: -0.5, - Apprentice: -0.5, - Dressmaker: -0.5, - Elemental: -0.1, - Dragon: -1.0, - Maidforce: -0.5, - Mushy: -0.5, - AncientRobot: -0.45, - }, - "Enemy": { - KinkyConstruct: .1, - Dragon: .1, - Bountyhunter: .1, - Bandit: .1, - Alchemist: .1, - Nevermere: .1, - Apprentice: .1, - Dressmaker: .1, - Witch: .1, - Elemental: .1, - Maidforce: .1, - Bast: .1, - Elf: .1, - Mushy: .1, - AncientRobot: .1, - }, - "Delinquent": { - Player: -1, - Maidforce: -1, - Chase: -1, - }, - "Wolfhunter": { - Player: -1, - Nevermere: -1, - Chase: -1, - }, - "Trap": { - Enemy: 1.0, - Jail: 1.0, - Prisoner: 1, - - // Wild factions - KinkyConstruct: 1, - Plant: 1, - Slime: 1, - Mold: 1, - Beast: 1, - - Bountyhunter: 1, - Bandit: 1, - Alchemist: 1, - Nevermere: 1, - Apprentice: 1, - Dressmaker: 1, - Witch: 1, - Elemental: 1, - Dragon: 1, - Maidforce: 1, - Bast: 1, - Elf: 1, - Mushy: 1, - AncientRobot: 1, - - // Special factions - Angel: 1, - Demon: 1, - - - Chase: -1, - }, - "Boss": { - Chase: -1, - }, - "Chase": { - // Dummy faction, used for deciding if a faction will make you go On The Run - }, - "Ambush": { - Player: -1.0, - Jail: -0.25, - - Chase: -1, - }, - "Prisoner": { - }, - "Jail": { - }, - "Slime": { - Jail: -0.25, - - Bountyhunter: -0.5, - Bandit: -0.6, - Alchemist: -0.8, - Nevermere: -0.55, - Apprentice: -0.55, - Dressmaker: -0.4, - Witch: 0.4, - Elemental: -0.4, - Dragon: -1.0, - Maidforce: -1.0, - Bast: -0.1, - Elf: -0.1, - Mushy: 0.1, - AncientRobot: -1.0, - }, - "Mold": { - Jail: -0.25, - - Enemy: -0.5, - Bountyhunter: -0.5, - Bandit: -0.6, - Alchemist: -0.8, - Nevermere: -0.55, - Apprentice: -0.55, - Dressmaker: -0.5, - Witch: -0.5, - Elemental: -0.5, - Dragon: -1.0, - Maidforce: -1.0, - Bast: -0.5, - Elf: -0.5, - Mushy: -0.5, - AncientRobot: -1.0, - }, - "Beast": { - Jail: -0.25, - - Bountyhunter: -0.4, - Bandit: -0.4, - Alchemist: -0.4, - Nevermere: -0.4, - Apprentice: -0.4, - Dressmaker: -0.4, - Witch: -0.1, - Elemental: -0.4, - Dragon: -1.0, - Maidforce: -0.4, - Mushy: -0.4, - AncientRobot: -1.0, - }, - "KinkyConstruct": { - Jail: -0.25, - Apprentice: -0.55, - Witch: 0.4, - Dressmaker: 0.4, - Dragon: -1.0, - }, - "Plant": { - Jail: -0.25, - }, - "Nevermere": { - "Alchemist": 1.0, - "Bast": -0.55, - "Mushy": -0.4, - "Bandit": 0.3, - "Apprentice": 0.15, - "AncientRobot": -0.51, - }, - "Alchemist": { - "Bandit": 0.15, - "AncientRobot": -0.55, - "Dressmaker": -0.25, - }, - "Bountyhunter": { - "Jail": 0.8, - "Dragon": 0.4, - "Bandit": -0.55, - "Maidforce": -0.15, - "Witch": -0.4, - "Dressmaker": 0.5, - "Nevermere": 0.75, - }, - "Elf": { - "Mushy": 1.0, - "Beast": 1.0, - }, - "Bast": { - "Elf": -1.0, - "Witch": -0.4, - "Beast": 0.55, - }, - "Bandit": { - "Mushy": -0.6, - }, - "Elemental": { - "KinkyConstruct": 0.55, - "Dressmaker": 0.35, - "Witch": 0.15, - "Bandit": -0.15, - "Elf": 0.5, - "Bast": -0.35, - "Dragon": -0.5, - "AncientRobot": -0.15, - }, - "AncientRobot": { - "Bast": 0.55, - "Elf": -0.6, - //"Maidforce": 0.55, - //"Dragon": 0.45, - //"Dressmaker": 0.55, - //"Apprentice": 0.52, - }, - "Dragon": { - "Jail": 1.0, - "Apprentice": 0.4, - "Bandit": -0.6, - "Witch": -0.4, - "Alchemist": -0.15, - "Beast": -1.0, - "Mushy": 0.15, - }, - "Mushy": { - "Alchemist": -0.55, - "Elemental": 0.25, - }, - "Witch": { - "Elf": -1.0, - }, - "Dressmaker": { - "Witch": 0.15, - "Nevermere": 0.8, - "Bandit": -0.5, - "Dragon": -0.5, - }, - "Apprentice": { - "Jail": 1.0, - "Elf": 0.75, - }, - "Maidforce": { - "Alchemist": 0.55, - "Jail": 0.55, - "Dragon": 0.55, - "Apprentice": 0.55, - "Bandit": -0.6, - "Witch": -0.4, - }, -}; - -let KinkyDungeonFactionRelations = Object.assign({}, KinkyDungeonFactionRelationsBase); - -function KDFactionRelation(a, b) { - if (a == "Rage" || b == "Rage") return -1.0; - if (a == b) return 1.0; - if (KDFactionRelations.get(a) && KDFactionRelations.get(a).get(b)) { - return KDFactionRelations.get(a).get(b); - } - return 0.0; -} - -/** - * @type {Map>}; - */ -let KDFactionRelations = new Map(); - -function KDInitFactions(Reset) { - if (Reset) { - KinkyDungeonFactionRelations = Object.assign({}, KinkyDungeonFactionRelationsBase); - for (let relation of Object.entries(KinkyDungeonFactionRelationsBase)) { - KinkyDungeonFactionRelations[relation[0]] = Object.assign({}, KinkyDungeonFactionRelationsBase[relation[0]]); - } - } - - for (let f of Object.keys(KinkyDungeonFactionRelationsBase)) { - if (!KinkyDungeonFactionRelations[f]) { - KinkyDungeonFactionRelations[f] = Object.assign(KinkyDungeonFactionRelationsBase[f]); - } - } - - KDFactionRelations = new Map(); - // For each faction in faction relations we create all the maps - for (let f1 of Object.entries(KinkyDungeonFactionRelationsBase)) { - let fmap = new Map(); - - KDFactionRelations.set(f1[0], fmap); - } - // Next we create the faction relationships - for (let f1 of Object.entries(KinkyDungeonFactionRelations)) { - let fmap = KDFactionRelations.get(f1[0]); - for (let f2 of Object.entries(f1[1])) { - // Set mutual opinions - fmap.set(f2[0], f2[1]); - if (!KDFactionRelations.get(f2[0])) { - console.log("Could not find faction " + f2[0]); - } - KDFactionRelations.get(f2[0]).set(f1[0], f2[1]); - } - } -} - -/** - * Sets faction relation and refreshes the map - * @param {string} a - * @param {string} b - * @param {number} relation - */ -function KDSetFactionRelation(a, b, relation) { - if (a == "Rage" || b == "Rage") return; - if (KinkyDungeonFactionRelations[a]) - KinkyDungeonFactionRelations[a][b] = Math.max(-1, Math.min(1, relation)); - if (KinkyDungeonFactionRelations[b]) - KinkyDungeonFactionRelations[b][a] = Math.max(-1, Math.min(1, relation)); - KDInitFactions(); -} - -/** - * Changes faction relation and refreshes the map - * @param {string} a - * @param {string} b - * @param {number} amount - */ -function KDChangeFactionRelation(a, b, amount, AffectRivals) { - if (a == "Rage" || b == "Rage") return; - if (!KinkyDungeonFactionRelations[a]) KinkyDungeonFactionRelations[a] = KinkyDungeonFactionRelationsBase[a] || 0; - if (!KinkyDungeonFactionRelations[b]) KinkyDungeonFactionRelations[b] = KinkyDungeonFactionRelationsBase[b] || 0; - - let amountSetTo = 0; - let amountSet = false; - - if (KinkyDungeonFactionRelations[a]) { - if (!KinkyDungeonFactionRelations[a][b] && KinkyDungeonFactionRelations[b][a]) - KinkyDungeonFactionRelations[a][b] = KinkyDungeonFactionRelations[b][a]; - else if (!KinkyDungeonFactionRelations[a][b]) KinkyDungeonFactionRelations[a][b] = 0; - amountSetTo = Math.max(-1, Math.min(1, KinkyDungeonFactionRelations[a][b] + amount)); - KinkyDungeonFactionRelations[a][b] = amountSetTo; - amountSet = true; - } - - if (KinkyDungeonFactionRelations[b]) { - if (!KinkyDungeonFactionRelations[b][a] && KinkyDungeonFactionRelations[a][b]) - KinkyDungeonFactionRelations[b][a] = KinkyDungeonFactionRelations[a][b]; - else if (!KinkyDungeonFactionRelations[b][a]) KinkyDungeonFactionRelations[b][a] = 0; - KinkyDungeonFactionRelations[b][a] = amountSet ? amountSetTo : Math.max(-1, Math.min(1, KinkyDungeonFactionRelations[b][a] + amount)); - } - - if (AffectRivals && a == "Player") { - for (let faction of Object.keys(KinkyDungeonFactionRelations)) { - if (!KinkyDungeonHiddenFactions.includes(faction) && faction != a && faction != b) { - let relation = KDFactionRelation(b, faction); - KDChangeFactionRelation("Player", faction, amount * relation); - } - } - } - KDInitFactions(); -} diff --git a/Game/KinkyDungeonFight.js b/Game/KinkyDungeonFight.js deleted file mode 100644 index bce833dc7..000000000 --- a/Game/KinkyDungeonFight.js +++ /dev/null @@ -1,1956 +0,0 @@ -"use strict"; -let KinkyDungeonKilledEnemy = null; -let KinkyDungeonAlert = 0; - -let KDBrawlerAmount = 1.0; -let KDClumsyAmount = 0.7; -let KDUnfocusedParams = { - AmountMin: 0.9, - AmountMax: 0.6, - ThreshMin: 0.1, - ThreshMax: 0.9, -}; -let KDDodgeAmount = 0.75; -let KinkyDungeonMissChancePerBlind = 0.1; // Max 3 -let KinkyDungeonMissChancePerSlow = 0.1; // Max 3 -let KinkyDungeonBullets = []; // Bullets on the game board -/** - * @type {Map} - */ -let KinkyDungeonBulletsVisual = new Map(); // Bullet sprites on the game board -let KinkyDungeonBulletsID = {}; // Bullets on the game board -let KDVulnerableDmg = 1.0; -let KDVulnerableDmgMult = 0.33; -let KDVulnerableHitMult = 1.33; -let KDPacifistReduction = 0.1; -let KDRiggerDmgBoost = 0.2; -let KDRiggerBindBoost = 0.3; -let KDStealthyDamageMult = 0.7; -let KDStealthyEvaMult = 0.8; -let KDResilientDamageMult = 0.7; -let KDStealthyEnemyCountMult = 1.7; -let KDBoundPowerMult = 0.4; -let KDBerserkerAmp = 0.3; -let KDUnstableAmp = 0.6; - -let KinkyDungeonOpenObjects = KinkyDungeonTransparentObjects; // Objects bullets can pass thru -let KinkyDungeonMeleeDamageTypes = ["unarmed", "crush", "slash", "pierce", "grope", "pain", "chain", "tickle"]; -let KinkyDungeonTeaseDamageTypes = ["tickle", "charm", "grope", "pain", "happygas", "poison", "drain", "souldrain"]; -let KinkyDungeonStunDamageTypes = ["fire", "electric", "stun"]; -let KinkyDungeonBindDamageTypes = ["chain", "glue"]; -let KinkyDungeonFreezeDamageTypes = ["ice"]; -let KinkyDungeonSlowDamageTypes = ["crush", "slash", "pierce", "frost", "cold", "poison"]; -let KinkyDungeonVulnerableDamageTypes = ["tickle", "acid", "magicbind"]; - - -let KDDamageBinds = { - "glue": "Slime", - "ice": "Ice", - "frost": "Ice", - "crush": "Metal", -}; -let KDSpellTagBinds = { - "rope": "Rope", - "leather": "Leather", - "chain": "Metal", - "metal": "Metal", - "vine": "Vine", - "nature": "Vine", -}; - -/** - * These also are affected by resistances to the second damage type, but not weaknesses - * Repeats up to 3 times - */ -let KinkyDungeonDamageTypesExtension = { - "tickle": "charm", - "grope": "charm", - "pain": "charm", - "happygas": "charm", - "charm": "soul", -}; - -let KinkyDungeonBindingDamageTypes = ["chain", "glue", "magicbind"]; -let KinkyDungeonDistractDamageTypes = ["tickle", "grope", "happygas", "charm"]; -let KinkyDungeonMasochistDamageTypes = ["crush", "pain", "unarmed", "electric", "shock", "fire", "magicbind", "glue", "chain", "souldrain", "drain"]; - -// Weapons -let KinkyDungeonPlayerWeapon = null; -let KinkyDungeonPlayerWeaponLastEquipped = ""; -/** @type {weapon} */ -let KinkyDungeonPlayerDamageDefault = {name: "", dmg: 2, chance: 0.9, type: "unarmed", unarmed: true, rarity: 0, shop: false, sfx: "Unarmed"}; -/** @type {weapon} */ -let KinkyDungeonPlayerDamage = KinkyDungeonPlayerDamageDefault; - -let KinkyDungeonDamageTypes = { - acid: {name: "acid", color: "#c8d45d", bg: "black"}, - cold: {name: "cold", color: "#554bd4", bg: "black"}, - ice: {name: "ice", color: "#00D8FF", bg: "black"}, - frost: {name: "ice", color: "#00D8FF", bg: "black"}, - fire: {name: "fire", color: "#FF6A00", bg: "black"}, - poison: {name: "poison", color: "#00D404", bg: "black"}, - happygas: {name: "happygas", color: "#E27CD0", bg: "black"}, - charm: {name: "charm", color: "#E27CD0", bg: "black"}, - soul: {name: "soul", color: "#E27CD0", bg: "black"}, - drain: {name: "soul", color: "#E27CD0", bg: "black"}, - souldrain: {name: "soul", color: "#E27CD0", bg: "black"}, - electric: {name: "electric", color: "#FFD800", bg: "black"}, - glue: {name: "glue", color: "#E200D0", bg: "black"}, - stun: {name: "stun", color: "white", bg: "black"}, - chain: {name: "chain", color: "white", bg: "black"}, - tickle: {name: "tickle", color: "white", bg: "black"}, - crush: {name: "crush", color: "white", bg: "black"}, - grope: {name: "grope", color: "white", bg: "black"}, - slash: {name: "slash", color: "white", bg: "black"}, - pierce: {name: "pierce", color: "white", bg: "black"}, - pain: {name: "pain", color: "white", bg: "black"}, - unarmed: {name: "unarmed", color: "white", bg: "black"}, - magic: {name: "magic", color: "#00FF90", bg: "black"}, - melee: {name: "melee", color: "#aaaaaa", bg: "black"}, - spell: {name: "spell", color: "#00FF90", bg: "black"}, -}; - -/** - * - * @param {item} item - * @returns {weapon} - */ -function KDWeapon(item) { - return KinkyDungeonWeapons[item.name]; -} - -function KinkyDungeonFindWeapon(Name) { - for (let con of Object.values(KinkyDungeonWeapons)) { - if (con.name == Name) return con; - } - return undefined; -} - -function KinkyDungeonWeaponCanCut(RequireInteract, MagicOnly) { - if (KinkyDungeonPlayerWeapon - && KinkyDungeonWeapons[KinkyDungeonPlayerWeapon].cutBonus != undefined - && (!MagicOnly || KinkyDungeonWeapons[KinkyDungeonPlayerWeapon].magic != undefined) - && (!RequireInteract || !KinkyDungeonIsHandsBound(false, false, 0.55))) return true; - if (KinkyDungeonPlayerBuffs) { - for (let b of Object.values(KinkyDungeonPlayerBuffs)) { - if (b && b.tags && (b.tags.includes("allowCutMagic") || (!MagicOnly && b.tags.includes("allowCut")))) return true; - } - } - return false; -} - -// We reset the pity timer on weapon switch to prevent issues -function KDSetWeapon(Weapon, forced) { - if (!Weapon) Weapon = 'Unarmed'; - KinkyDungeonEvasionPityModifier = 0; - KinkyDungeonPlayerWeapon = Weapon; - if (!forced) - KinkyDungeonPlayerWeaponLastEquipped = Weapon; -} - -function KinkyDungeonGetPlayerWeaponDamage(HandsFree, NoOverride) { - let flags = { - KDDamageHands: true.valueOf, - }; - if (!NoOverride) - KinkyDungeonSendEvent("calcDamage", {flags: flags}); - - let damage = KinkyDungeonPlayerDamageDefault; - // @ts-ignore - KinkyDungeonPlayerDamage = {}; - let weapon = KinkyDungeonWeapons[KinkyDungeonPlayerWeapon]; - if (weapon && weapon.noHands) HandsFree = true; - if (!HandsFree || (KinkyDungeonStatsChoice.get("Brawler") && !KinkyDungeonPlayerWeapon)) { - damage = KinkyDungeonPlayerDamageDefault; - if (!NoOverride) - KDSetWeapon('Unarmed', true); - } else if (KinkyDungeonPlayerWeapon && KinkyDungeonWeapons[KinkyDungeonPlayerWeapon]) { - damage = KinkyDungeonWeapons[KinkyDungeonPlayerWeapon]; - } - - Object.assign(KinkyDungeonPlayerDamage, damage); - - let handBondage = KDHandBondageTotal(); - if (handBondage && (flags.KDDamageHands || weapon.unarmed) && (!weapon || !weapon.noHands || weapon.unarmed)) { - KinkyDungeonPlayerDamage.chance *= 0.5 + Math.max(0, 0.5 * Math.min(1, handBondage)); - } - if (KinkyDungeonStatsChoice.get("Brawler") && !KinkyDungeonPlayerDamage.name) { - KinkyDungeonPlayerDamage.dmg += KDBrawlerAmount; - } else { - if (KinkyDungeonSlowLevel > 1 && (!KinkyDungeonPlayerDamage.name || weapon.unarmed)) { - KinkyDungeonPlayerDamage.dmg /= 2; - } - } - if ((KinkyDungeonPlayer.Pose.includes("Hogtied") || KinkyDungeonPlayer.Pose.includes("Kneel")) && (flags.KDDamageHands || weapon.unarmed) && (!weapon || !weapon.noHands || weapon.unarmed)) { - KinkyDungeonPlayerDamage.chance /= 1.5; - } - - return KinkyDungeonPlayerDamage; -} - - -let KinkyDungeonEvasionPityModifier = 0; // Current value -let KinkyDungeonEvasionPityModifierIncrementPercentage = 0.5; // Percent of the base hit chance to add - -function KinkyDungeonGetEvasion(Enemy, NoOverride, IsSpell, IsMagic, cost) { - let flags = { - KDEvasionHands: true, - KDEvasionSight: true, - KDEvasionDeaf: true, - KDEvasionSlow: true, - }; - let data = {enemy: Enemy, - isSpell: IsSpell, - isMagic: IsMagic, - flags: flags, - cost: cost, - hitmult: 1.0, - }; - - if (!NoOverride) - KinkyDungeonSendEvent("calcEvasion", data); - let hitChance = (Enemy && Enemy.buffs) ? KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(Enemy.buffs, "Evasion")) : 1.0; - hitChance *= data.hitmult; - - if (KinkyDungeonStatsChoice.get("Clumsy")) hitChance *= KDClumsyAmount; - if (KinkyDungeonStatsChoice.get("Unfocused")) { - let amount = 1; - let dist = KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax; - if (dist >= KDUnfocusedParams.ThreshMin) { - amount = KDUnfocusedParams.AmountMin + (KDUnfocusedParams.AmountMax - KDUnfocusedParams.AmountMin) * (dist - KDUnfocusedParams.ThreshMin) / (KDUnfocusedParams.ThreshMax - KDUnfocusedParams.ThreshMin); - } - if (amount != 1) hitChance *= amount; - } - - if (Enemy && Enemy.Enemy && Enemy.Enemy.evasion && ((!(Enemy.stun > 0) && !(Enemy.freeze > 0)) || Enemy.Enemy.alwaysEvade || Enemy.Enemy.evasion < 0)) hitChance *= Math.max(0, - (Enemy.aware ? KinkyDungeonMultiplicativeStat(Enemy.Enemy.evasion) : Math.max(1, KinkyDungeonMultiplicativeStat(Enemy.Enemy.evasion)))); - if (Enemy && Enemy.Enemy && Enemy.Enemy.tags.ghost && (IsMagic || (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.magic))) hitChance = Math.max(hitChance, 1.0); - - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Accuracy")) { - hitChance *= KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Accuracy")); - } - - if (!IsSpell) hitChance *= KinkyDungeonPlayerDamage.chance; - if (Enemy && Enemy.bind > 0) hitChance *= 3; - else if (Enemy && Enemy.slow > 0) hitChance *= 2; - if (Enemy && (Enemy.stun > 0 || Enemy.freeze > 0)) hitChance *= 5; - else { - if (Enemy && Enemy.distraction > 0) hitChance *= 1 + Math.min(1, Enemy.distraction / Enemy.Enemy.maxhp); - if (Enemy) hitChance *= 1 + 0.25 * KDBoundEffects(Enemy); - } - if (Enemy && Enemy.vulnerable) hitChance *= KDVulnerableHitMult; - - if (!IsSpell) { - if (flags.KDEvasionSight) - hitChance = Math.min(hitChance, Math.max(0.1, hitChance - Math.min(3, KinkyDungeonBlindLevel) * KinkyDungeonMissChancePerBlind)); - if (flags.KDEvasionDeaf &&KinkyDungeonPlayer.IsDeaf()) hitChance *= 0.9; - if (flags.KDEvasionSlow && KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.name && KinkyDungeonSlowLevel > 0) hitChance *= 1.0 - Math.max(0.5, KinkyDungeonMissChancePerSlow * KinkyDungeonSlowLevel); - } - return hitChance; -} - -function KinkyDungeonAggro(Enemy, Spell, Attacker, Faction) { - if (Enemy && Enemy.Enemy && (!Spell || !Spell.enemySpell) && (!Faction || Faction == "Player") && !(Enemy.rage > 0) && (!Attacker || Attacker.player || Attacker.Enemy.allied)) { - if ((Enemy.playWithPlayer || !KDHostile(Enemy)) && KDCanDom(Enemy)) { - KDAddThought(Enemy.id, "Embarrassed", 5, 1); - Enemy.distraction = (Enemy.distraction || 0) + Enemy.Enemy.maxhp * 0.1; - KDAddOpinion(Enemy, 10); - } else { - if (Enemy && !Enemy.Enemy.allied) { - KinkyDungeonSetFlag("PlayerCombat", 8); - KinkyDungeonAggroAction('attack', {enemy: Enemy}); - } - } - } -} - -function KDPlayerEvasionPenalty() { - let evasionPenalty = .25 * KinkyDungeonSlowLevel; - - return evasionPenalty; -} - -function KinkyDungeonPlayerEvasion() { - let playerEvasionMult = 1.0; - let playerEvasionPenalty = KDPlayerEvasionPenalty(); - let val = playerEvasionMult * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Evasion") - playerEvasionPenalty); - - return val; -} -function KinkyDungeonGetPlayerStat(stat, mult) { - let data = { - mult: mult, - stat: !mult ? KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, stat) : KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, stat)), - }; - KinkyDungeonSendEvent("calcPlayer" + stat, data); - - return data.stat; -} - -function KDRestraintBlockPower(block, power) { - return KinkyDungeonMultiplicativeStat(block / Math.max(1, power)); -} - -function KinkyDungeonEvasion(Enemy, IsSpell, IsMagic, Attacker) { - let hitChance = KinkyDungeonGetEvasion(Enemy, undefined, IsSpell, IsMagic, true); - if (KDHostile(Enemy) && KinkyDungeonStatsChoice.get("Stealthy")) { - hitChance *= KDStealthyEvaMult; - } - - if (!Enemy) KinkyDungeonSleepTime = 0; - - KinkyDungeonAggro(Enemy, undefined, Attacker); - - if (KDRandom() < hitChance + KinkyDungeonEvasionPityModifier) { - KinkyDungeonEvasionPityModifier = 0; // Reset the pity timer - return true; - } - - if (Enemy) { - // Increment the pity timer - KinkyDungeonEvasionPityModifier += KinkyDungeonEvasionPityModifierIncrementPercentage * hitChance; - } - - return false; -} - -let KDDamageEquivalencies = { - "frost": "ice", - "happygas": "charm", - "souldrain": "soul", - "drain": "soul", - "shock": "electric", -}; - -/** - * - * @param {Record} tags - * @param {string} type - * @param {string} resist - * @returns {boolean} - */ -function KinkyDungeonGetImmunity(tags, type, resist) { - let t = type; - if (KDDamageEquivalencies[type]) t = KDDamageEquivalencies[type]; - - for (let i = 0; i < 10 && KinkyDungeonDamageTypesExtension[t]; i++) { - if (KinkyDungeonDamageTypesExtension[t] && resist != "weakness" && resist != "severeweakness") t = KinkyDungeonDamageTypesExtension[t]; - } - if (tags && (tags[t + resist] - || ((KinkyDungeonMeleeDamageTypes.includes(t) && (type != "unarmed" || !resist.includes("weakness"))) && tags["melee" + resist]) - || (!KinkyDungeonMeleeDamageTypes.includes(t) && tags["magic"+resist]))) - return true; - return false; -} - -let KDDamageQueue = []; - -function KDArmorFormula(DamageAmount, Armor) { - if (DamageAmount <= 0) return 1; - if (Armor < 0) return Math.min(3, (DamageAmount - Armor) / DamageAmount); - return DamageAmount / (DamageAmount + Armor); -} - - -function KinkyDungeonDamageEnemy(Enemy, Damage, Ranged, NoMsg, Spell, bullet, attacker, Delay, noAlreadyHit) { - if (bullet && !noAlreadyHit) { - if (!bullet.alreadyHit) bullet.alreadyHit = []; - // A bullet can only damage an enemy once per turn - if (bullet.alreadyHit.includes(Enemy.id)) return 0; - bullet.alreadyHit.push(Enemy.id); - } - - let predata = { - aggro: false, - faction: "Enemy", - enemy: Enemy, - spell: Spell, - bullet: bullet, - attacker: attacker, - type: (Damage) ? Damage.type : 0, - bufftype: (Damage) ? Damage.type : 0, - time: (Damage) ? Damage.time : 0, - dmg: (Damage) ? Damage.damage : 0, - bind: (Damage) ? Damage.bind : 0, - bindType: (Damage) ? Damage.bindType : 0, - flags: (Damage) ? Damage.flags : undefined, - boundBonus: (Damage) ? Damage.boundBonus : 0, - bindEff: (Damage) ? Damage.bindEff : 0, - distract: (Damage) ? Damage.distract : 0, - distractEff: (Damage) ? Damage.distractEff : 0, - incomingDamage: Damage, - dmgDealt: 0, - freezebroke: false, - froze: 0, - vulnerable: (Enemy.vulnerable || (KDHostile(Enemy) && !Enemy.aware)) && Damage && !Damage.novulnerable && (!Enemy.Enemy.tags || !Enemy.Enemy.tags.nonvulnerable), - }; - - if (KDDamageEquivalencies[predata.type]) predata.bufftype = KDDamageEquivalencies[predata.type]; - - if (attacker) { - if (attacker.player) predata.faction = "Player"; - else if (attacker.Enemy) predata.faction = KDGetFaction(attacker); - } else if (bullet) { - if (bullet.bullet.faction) predata.faction = bullet.bullet.faction; - else if (bullet.bullet.spell && bullet.bullet.spell.enemySpell) predata.faction = "Enemy"; - else predata.faction = "Player"; - } else if (Spell) { - if (Spell.enemySpell) predata.faction = "Enemy"; - else predata.faction = "Player"; - } - - KinkyDungeonSendEvent("beforeDamageEnemy", predata); - - if (!predata.dmg) predata.dmg = 0; - //let type = (Damage) ? Damage.type : ""; - let effect = false; - let resistStun = 0; - let resistSlow = 0; - let resistDamage = 0; - let spellResist = (Damage && Enemy.Enemy.armor && !KinkyDungeonMeleeDamageTypes.includes(predata.type)) ? Enemy.Enemy.spellResist : 0; - if (KinkyDungeonGetBuffedStat(Enemy.buffs, "SpellResist")) spellResist += KinkyDungeonGetBuffedStat(Enemy.buffs, "SpellResist"); - let armor = (Damage && Enemy.Enemy.armor && KinkyDungeonMeleeDamageTypes.includes(predata.type)) ? Enemy.Enemy.armor : 0; - if (KinkyDungeonGetBuffedStat(Enemy.buffs, "Armor")) armor += KinkyDungeonGetBuffedStat(Enemy.buffs, "Armor"); - if (KinkyDungeonGetBuffedStat(Enemy.buffs, "ArmorBreak")) armor -= Math.min(Math.max(0, armor), KinkyDungeonGetBuffedStat(Enemy.buffs, "ArmorBreak")); - - if (Enemy.freeze > 0 && Damage && KinkyDungeonMeleeDamageTypes.includes(predata.type)) { - predata.dmg *= 2; - } - - let miss = !(!Damage || !Damage.evadeable || KinkyDungeonEvasion(Enemy, (true && Spell), !KinkyDungeonMeleeDamageTypes.includes(predata.type), attacker)); - if (Damage && !miss) { - if (KinkyDungeonStatsChoice.get("Pacifist") && KDHostile(Enemy) && Enemy.Enemy.bound && !KinkyDungeonTeaseDamageTypes.includes(predata.type) && predata.type != "glue" && predata.type != "chain") { - predata.dmg *= KDPacifistReduction; - } - KDUpdatePerksBonus(); - let DamageAmpBonusPerks = KDDamageAmpPerks - + (KinkyDungeonMeleeDamageTypes.includes(predata.type) ? KDDamageAmpPerksMelee : 0) - + (Spell && !Spell.allySpell && !Spell.enemySpell ? KDDamageAmpPerksSpell : 0); - let damageAmp = KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(Enemy.buffs, "DamageAmp") - (KDHostile(Enemy) && (!attacker || attacker.player) ? (DamageAmpBonusPerks) : 0)); - let buffreduction = KinkyDungeonGetBuffedStat(Enemy.buffs, "DamageReduction"); - let buffresist = KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(Enemy.buffs, predata.bufftype + "DamageResist")); - buffresist *= KinkyDungeonMeleeDamageTypes.includes(predata.type) ? - KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(Enemy.buffs, "meleeDamageResist")) - : KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(Enemy.buffs, "magicDamageResist")); - let buffType = predata.bufftype + "DamageBuff"; - let buffAmount = 1 + (KDHostile(Enemy) ? KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, buffType) : 0); - predata.dmg *= buffAmount; - predata.dmg *= buffresist; - - if (predata.type == "fire" && Enemy.freeze > 0) { - predata.dmg *= 1.4; - } - - if (damageAmp) predata.dmg *= damageAmp; - - let time = predata.time ? predata.time : 0; - if (spellResist && !KinkyDungeonMeleeDamageTypes.includes(predata.type)) { - if (time) - time = Math.max(0, Math.ceil(time * KDArmorFormula(predata.dmg, spellResist))); - predata.dmg = Math.max(0, predata.dmg * KDArmorFormula(predata.dmg, spellResist)); - } - - - if (Enemy.Enemy.tags) { - if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, predata.type, "severeweakness")) resistDamage = -2; - else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, predata.type, "weakness")) resistDamage = -1; - else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, predata.type, "immune")) resistDamage = 2; - else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, predata.type, "resist")) resistDamage = 1; - - if (Enemy.Enemy.tags.unstoppable) resistStun = 2; - else if (Enemy.Enemy.tags.unflinching) resistStun = 1; - if (Enemy.Enemy.tags.unslowable) resistSlow = 2; - else if (Enemy.Enemy.tags.slowresist) resistSlow = 1; - - } - - if (Enemy.boundLevel > 0 && (KinkyDungeonTeaseDamageTypes.includes(predata.type) || Damage.tease)) { - let eff = KDBoundEffects(Enemy); - let mult = 1.0; - if (eff > 0) { - mult += 0.5; - } - if (eff > 3) { - mult += 0.5; - } - predata.dmg *= mult; - } - if (Enemy.boundLevel > 0 && Damage && Damage.boundBonus) { - let eff = KDBoundEffects(Enemy); - predata.dmg += Damage.boundBonus * eff; - } - - let killed = Enemy.hp > 0; - let forceKill = false; - - - - if (predata.type != "inert" && resistDamage < 2) { - if (resistDamage == 1 || (resistStun > 0 && predata.type == "stun")) { - predata.dmgDealt = Math.max(predata.dmg * KDArmorFormula(predata.dmg, armor), 0); // Armor goes before resistance - predata.dmgDealt = predata.dmgDealt*0.5; // Enemies that are vulnerable take either dmg+0.5 or 1.5x damage, whichever is greater - } else if (resistDamage == -1) { - if (predata.dmg > 0) - predata.dmgDealt = Math.max(predata.dmg+0.5, predata.dmg*1.5); // Enemies that are vulnerable take either dmg+1 or 1.5x damage, whichever is greater - else predata.dmgDealt = 0; - predata.dmgDealt = Math.max(predata.dmgDealt * KDArmorFormula(predata.dmg, armor), 0); // Armor comes after vulnerability - } else if (resistDamage == -2) { - predata.dmgDealt = Math.max(predata.dmg+1, predata.dmg*2); // Enemies that are severely vulnerable take either dmg+1 or 2x damage, whichever is greater - predata.dmgDealt = Math.max(predata.dmgDealt * KDArmorFormula(predata.dmg, armor), 0); // Armor comes after vulnerability - } else { - predata.dmgDealt = Math.max(predata.dmg * KDArmorFormula(predata.dmg, armor), 0); - } - - if (Enemy.Enemy.tags && Enemy.Enemy.tags.playerinstakill && attacker && attacker.player) predata.dmgDealt = Enemy.hp; - else if (buffreduction && predata.dmgDealt > 0) { - predata.dmgDealt = Math.max(predata.dmgDealt - buffreduction, 0); - KinkyDungeonTickBuffTag(Enemy.buffs, "damageTaken", 1); - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Shield.ogg"); - } - - if (Enemy.freeze > 0 && predata.dmgDealt > 0) { - if ((KinkyDungeonMeleeDamageTypes.includes(predata.type))) { - Enemy.freeze = 0; - } else if (!["ice", "frost"].includes(predata.type)) { - Enemy.freeze = Math.max(0, Enemy.freeze - predata.dmgDealt * (predata.type == "fire" ? 0.75 : 0.25)); - } - if (Enemy.freeze == 0) { - predata.freezebroke = true; - } - } - - if (KDHostile(Enemy)) { - if (KinkyDungeonStatsChoice.get("Stealthy")) - predata.dmgDealt *= KDStealthyDamageMult; - - if (KinkyDungeonStatsChoice.get("ResilientFoes")) - predata.dmgDealt *= KDResilientDamageMult; - } - - KinkyDungeonSendEvent("duringDamageEnemy", predata); - - if (Spell && Spell.hitsfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + Spell.hitsfx + ".ogg"); - else if (!(Spell && Spell.hitsfx) && predata.dmgDealt > 0 && bullet) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/DealDamage.ogg"); - if (Damage && Damage.damage) { - if (predata.faction == "Player" || KinkyDungeonVisionGet(Enemy.x, Enemy.y) > 0) - KDDamageQueue.push({floater: Math.round(Math.min(predata.dmgDealt, Enemy.hp)*10), Entity: Enemy, Color: "#ff4444", Delay: Delay}); - //KinkyDungeonSendFloater(Enemy, Math.round(Math.min(predata.dmgDealt, Enemy.hp)*10), "#ff4444"); - } - //forceKill = (Enemy.hp <= Enemy.Enemy.maxhp*0.1 || Enemy.hp <= 0.52) && KDistChebyshev(Enemy.x - KinkyDungeonPlayerEntity.x, Enemy.y - KinkyDungeonPlayerEntity.y) < 1.5; - - Enemy.hp -= predata.dmgDealt; - if (Enemy.hp > 0 && Enemy.hp <= 0.51 && predata.dmgDealt > 2.01 && !forceKill && KDBoundEffects(Enemy) < 4) Enemy.hp = 0; - if (predata.dmgDealt > 0) Enemy.revealed = true; - } - - if ((resistStun < 2 && resistDamage < 2) && (KinkyDungeonStunDamageTypes.includes(predata.type))) { // Being immune to the damage stops the stun as well - effect = true; - if (!Enemy.stun) KDAddThought(Enemy.id, "Status", 5, 1); - if (!Enemy.stun) Enemy.stun = 0; - if (resistStun == 1 || resistDamage == 1) - Enemy.stun = Math.max(Enemy.stun, Math.min(Math.floor(time/2), time-1)); // Enemies with stun resistance have stuns reduced to 1/2, and anything that stuns them for one turn doesn't affect them - else Enemy.stun = Math.max(Enemy.stun, time); - } - if ((resistStun < 2 && resistDamage < 2) && (KinkyDungeonFreezeDamageTypes.includes(predata.type))) { // Being immune to the damage stops the stun as well - effect = true; - if (!Enemy.freeze) KDAddThought(Enemy.id, "Freeze", 5, 1); - if (!(Enemy.freeze > 0)) Enemy.freeze = 0; - let preFreeze = Enemy.freeze > 0; - if (resistDamage == 1 || resistStun == 1) - Enemy.freeze = Math.max(Enemy.freeze, Math.min(Math.floor(time/2), time-1)); // Enemies with ice resistance have freeze reduced to 1/2, and anything that freezes them for one turn doesn't affect them - else Enemy.freeze = Math.max(Enemy.freeze, time); - predata.froze = (Enemy.freeze > 0 && !preFreeze) ? Enemy.freeze : 0; - } - - if ((resistStun < 2 && resistDamage < 2) && (KinkyDungeonBindDamageTypes.includes(predata.type))) { // Being immune to the damage stops the bind - effect = true; - if (!Enemy.bind) Enemy.bind = 0; - if (resistDamage == 1 || resistStun == 1) - Enemy.bind = Math.max(Enemy.bind, Math.min(Math.floor(time/2), time-1)); // Enemies with resistance have bind reduced to 1/2, and anything that binds them for one turn doesn't affect them - else Enemy.bind = Math.max(Enemy.bind, time); - } - if ((predata.dmg || predata.bind) && Enemy.Enemy.bound && (resistDamage < 2) && (predata.bind || KinkyDungeonBindingDamageTypes.includes(predata.type))) { - effect = true; - if (!Enemy.boundLevel) Enemy.boundLevel = 0; - let efficiency = predata.bindEff ? predata.bindEff : 1.0; - if (resistStun == -2) { - efficiency *= 2; - } else if (resistStun == -1) { - efficiency *= 1.5; - } - if (resistDamage == 1 || resistStun == 1) { - efficiency *= 0.75; - } - if (resistDamage == 2) { - efficiency *= 0.5; - } - if (resistStun == 2) { - efficiency *= 0.5; - } - if (predata.vulnerable || Enemy.boundLevel > Enemy.Enemy.maxhp) { - efficiency *= 2; - } - - if (!(Enemy.boundLevel > 0)) { - let Thought = "Annoyed"; - if (KDStrictPersonalities.includes(Enemy.personality)) Thought = "Struggle"; - else if (KDLoosePersonalities.includes(Enemy.personality)) Thought = "Embarrassed"; - KDAddThought(Enemy.id, Thought, 5, 2); - } - - - let amt = efficiency * (predata.bind ? predata.bind : predata.dmg); - if (predata.vulnerable && efficiency * (predata.bind ? predata.bind : predata.dmg) > 0.01 && Enemy.boundLevel < Enemy.Enemy.maxhp * 0.4) { - amt += Enemy.Enemy.maxhp * 0.2; - } - // Determine binding type based on damage and spell -- best guess - if (amt > 0 && !predata.bindType) { - if (KDDamageBinds[predata.type]) predata.bindType = KDDamageBinds[predata.type]; - else if (Spell) { - if (Spell.tags) { - for (let t of Spell.tags) { - if (KDSpellTagBinds[t]) { - predata.bindType = KDSpellTagBinds[t]; - break; - } - } - } - } - } - // Do the deed - KDTieUpEnemy(Enemy, amt, predata.bindType, predata.dmg); - } - if ((predata.dmg || predata.distract) && Enemy.Enemy.bound && (resistDamage < 2) - && (predata.distract || KinkyDungeonDistractDamageTypes.includes(predata.type) || (KDLoosePersonalities.includes(Enemy.personality) && KinkyDungeonMasochistDamageTypes.includes(predata.type)))) { - if (!Enemy.distraction) Enemy.distraction = 0; - if (Enemy.distraction < Enemy.Enemy.maxhp) { - effect = true; - - let efficiency = predata.distractEff ? predata.distractEff : 1.0; - efficiency *= 1; // Always multiply by 2 - if (resistDamage == 1) { - efficiency *= 0.75; - } - if (resistDamage == 2) { - efficiency *= 0.5; - } - if (predata.vulnerable || Enemy.boundLevel > 0) { - efficiency *= 1 + Math.min(1, predata.vulnerable ? 1 : Enemy.boundLevel / Enemy.Enemy.maxhp); - } - - if (!(Enemy.distraction > 0)) { - let Thought = "Embarrassed"; - if (KDStrictPersonalities.includes(Enemy.personality)) Thought = "Angry"; - else if (KDLoosePersonalities.includes(Enemy.personality)) Thought = "Play"; - KDAddThought(Enemy.id, Thought, 5, 2); - } - - Enemy.distraction += efficiency * (predata.distract ? predata.distract : predata.dmg); - if (predata.vulnerable && efficiency * (predata.distract ? predata.distract : predata.dmg) > 0.01 && Enemy.distraction < Enemy.Enemy.maxhp * 0.5) { - Enemy.distraction += Enemy.Enemy.maxhp * 0.25; - } - } - } - - if (!forceKill && KDBoundEffects(Enemy) > 3 && (Enemy.hp < 0 || (Enemy.hp <= Enemy.Enemy.maxhp * 0.1))) { - if ((predata.faction == "Player" || KinkyDungeonVisionGet(Enemy.x, Enemy.y) > 0) && Enemy.hp > 0.001) { - let Thought = "GiveUp"; - if (KDStrictPersonalities.includes(Enemy.personality)) Thought = "Fire"; - else if (KDLoosePersonalities.includes(Enemy.personality)) Thought = "Play"; - if (!(Enemy.boundLevel > 0)) KDAddThought(Enemy.id, Thought, 6, 3); - KDAddThought(Enemy.id, Thought, 6, 3); - KDDamageQueue.push({floater: TextGet("KDHelpless"), Entity: {x: Enemy.x - 0.5 + Math.random(), y: Enemy.y - 0.5 + Math.random()}, Color: "white", Time: 2, Delay: Delay}); - } - if (killed) - Enemy.hp = 0.001; - } - - if ((resistSlow < 2 && resistDamage < 2) && (KinkyDungeonSlowDamageTypes.includes(predata.type))) { // Being immune to the damage stops the stun as well - effect = true; - if (!Enemy.slow) KDAddThought(Enemy.id, "Annoyed", 5, 1); - if (!Enemy.slow) Enemy.slow = 0; - if (resistSlow == 1 || resistDamage == 1) - Enemy.slow = Math.max(Enemy.slow, Math.min(Math.floor(time/2), time-1)); // Enemies with stun resistance have stuns reduced to 1/2, and anything that stuns them for one turn doesn't affect them - else Enemy.slow = Math.max(Enemy.slow, time); - } - if ((resistDamage < 2) && (KinkyDungeonVulnerableDamageTypes.includes(predata.type))) { // Being immune to the damage stops the stun as well - effect = true; - if (!Enemy.vulnerable) KDAddThought(Enemy.id, "Status", 4, 1); - if (!Enemy.vulnerable) Enemy.vulnerable = 0; - if (resistDamage == 1) - Enemy.vulnerable = Math.max(Enemy.vulnerable, Math.min(Math.floor(time/2), time-1)); // Enemies with stun resistance have stuns reduced to 1/2, and anything that stuns them for one turn doesn't affect them - else Enemy.vulnerable = Math.max(Enemy.vulnerable, time); - } - } - - if (KDBoundEffects(Enemy) > 3) { - if (!Enemy.vulnerable) Enemy.vulnerable = 0; - Enemy.vulnerable = Math.max(Enemy.vulnerable, 1); - } - - predata.aggro = predata.type != "heal" && predata.type != "inert" && (!Spell || !Spell.allySpell) && (!bullet || !bullet.spell || !bullet.spell.allySpell); - - KinkyDungeonSendEvent("afterDamageEnemy", predata); - - let atkname = (Spell) ? TextGet("KinkyDungeonSpell" + Spell.name) : TextGet("KinkyDungeonBasicAttack"); - let damageName = TextGet("KinkyDungeonDamageType" + predata.type); - if (!NoMsg && !Spell) atkname = TextGet("KinkyDungeonBasicDamage"); - - if (Enemy.hp <= 0) { - KinkyDungeonKilledEnemy = Enemy; - } - let mod = ""; - if (resistDamage == 1) mod = "Weak"; - if (resistDamage == 2) mod = "Immune"; - if (resistDamage == -1) mod = "Strong"; - if (resistDamage == -2) mod = "VeryStrong"; - if (Damage && !mod && spellResist > 0 && !KinkyDungeonMeleeDamageTypes.includes(predata.type)) mod = "SpellResist"; - - if (predata.faction == "Player" || predata.faction == "Rage") { - if (!Enemy.playerdmg) Enemy.playerdmg = 0.01; - Enemy.playerdmg += predata.dmgDealt; - } - - if (!NoMsg && (predata.dmgDealt > 0 || !Spell || effect) && (!Damage || Damage.damage > 0)) KinkyDungeonSendActionMessage(4 + predata.dmgDealt * 0.01, (Damage && predata.dmgDealt > 0) ? - TextGet((Ranged) ? "PlayerRanged" + mod : "PlayerAttack" + mod).replace("TargetEnemy", TextGet("Name" + Enemy.Enemy.name)).replace("AttackName", atkname).replace("DamageDealt", "" + Math.round(predata.dmgDealt * 10)).replace("DamageType", ("" + damageName).toLowerCase()) - : TextGet("PlayerMiss" + ((Damage && !miss) ? "Armor" : "")).replace("TargetEnemy", TextGet("Name" + Enemy.Enemy.name)), - (Damage && (predata.dmg > 0 || effect)) ? "orange" : "#ff0000", 2, undefined, undefined, Enemy); - - if (Enemy && Enemy.Enemy && KDAmbushAI(Enemy) && Spell) { - Enemy.ambushtrigger = true; - } - - if (!Damage && predata.type != "inert" && predata.dmgDealt <= 0) { - KDAddThought(Enemy.id, "Laugh", 4, 1); - KDDamageQueue.push({floater: TextGet("KDMissed"), Entity: {x: Enemy.x - 0.5 + Math.random(), y: Enemy.y - 0.5 + Math.random()}, Color: "white", Time: 2, Delay: Delay}); - if (KDRandom() < actionDialogueChanceIntense) - KinkyDungeonSendDialogue(Enemy, TextGet("KinkyDungeonRemindJail" + (Enemy.Enemy.playLine ? Enemy.Enemy.playLine : "") + "MissedMe").replace("EnemyName", TextGet("Name" + Enemy.Enemy.name)), KDGetColor(Enemy), 4, 5, false, true); - - if (KDToggles.Sound && Enemy.Enemy.cueSfx && Enemy.Enemy.cueSfx.Miss) { - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + Enemy.Enemy.cueSfx.Miss + ".ogg"); - } - //KinkyDungeonSendFloater({x: Enemy.x - 0.5 + Math.random(), y: Enemy.y - 0.5 + Math.random()}, TextGet("KDMissed"), "white", 2); - } else if (Damage && Damage.damage > 0 && predata.type != "inert" && predata.dmgDealt <= 0 && !miss) { - if (predata.faction == "Player" || KinkyDungeonVisionGet(Enemy.x, Enemy.y) > 0) { - KDAddThought(Enemy.id, "Laugh", 5, 3); - if (KDRandom() < actionDialogueChanceIntense) - KinkyDungeonSendDialogue(Enemy, TextGet("KinkyDungeonRemindJail" + (Enemy.Enemy.playLine ? Enemy.Enemy.playLine : "") + "MissedMe").replace("EnemyName", TextGet("Name" + Enemy.Enemy.name)), KDGetColor(Enemy), 4, 5, false, true); - KDDamageQueue.push({floater: TextGet("KDBlocked"), Entity: {x: Enemy.x - 0.5 + Math.random(), y: Enemy.y - 0.5 + Math.random()}, Color: "white", Time: 2, Delay: Delay}); - } - - let type = KinkyDungeonMeleeDamageTypes.includes(predata.type) ? "Block" : "Resist"; - if (KDToggles.Sound && Enemy.Enemy.cueSfx && Enemy.Enemy.cueSfx[type]) { - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + Enemy.Enemy.cueSfx[type] + ".ogg"); - } - //KinkyDungeonSendFloater({x: Enemy.x - 0.5 + Math.random(), y: Enemy.y - 0.5 + Math.random()}, TextGet("KDBlocked"), "white", 2); - } else if (predata.dmgDealt > 0 && KDToggles.Sound && Enemy.Enemy.cueSfx && Enemy.Enemy.cueSfx.Damage) { - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + Enemy.Enemy.cueSfx.Damage + ".ogg"); - if (KDRandom() < actionDialogueChance) - KinkyDungeonSendDialogue(Enemy, TextGet("KinkyDungeonRemindJail" + (Enemy.Enemy.playLine ? Enemy.Enemy.playLine : "") + "Hit").replace("EnemyName", TextGet("Name" + Enemy.Enemy.name)), KDGetColor(Enemy), 4, 5); - } - - if (predata.aggro) - KinkyDungeonAggro(Enemy, Spell, attacker, predata.faction); - - if (predata.dmg > 0) { - KinkyDungeonTickBuffTag(Enemy.buffs, "takeDamage", 1); - KinkyDungeonSetEnemyFlag(Enemy, "wander", 0); - } - return predata.dmg; -} - -function KinkyDungeonDisarm(Enemy, suff) { - if (!KinkyDungeonPlayerDamage || KinkyDungeonPlayerDamage.unarmed) return false; - - if (!Enemy) { - console.log("Error processing disarm! Please report!"); - return false; - } - if (KDRandom() < KinkyDungeonWeaponGrabChance) { - let slots = []; - for (let X = -Math.ceil(1); X <= Math.ceil(1); X++) - for (let Y = -Math.ceil(1); Y <= Math.ceil(1); Y++) { - if ((X != 0 || Y != 0) && KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(Enemy.x + X, Enemy.y + Y))) { - // We add the slot and those around it - slots.push({x:Enemy.x + X, y:Enemy.y + Y}); - for (let XX = -Math.ceil(1); XX <= Math.ceil(1); XX++) - for (let YY = -Math.ceil(1); YY <= Math.ceil(1); YY++) { - if ((Math.abs(X + XX) > 1 || Math.abs(Y + YY) > 1) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Enemy.x + XX + X, Enemy.y + YY + Y))) { - slots.push({x:Enemy.x + XX + X, y:Enemy.y + YY + Y}); - } - } - } - } - - let foundslot = null; - for (let C = 0; C < 100; C++) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - if (slot && KinkyDungeonNoEnemy(slot.x, slot.y, true) - && Math.max(Math.abs(KinkyDungeonPlayerEntity.x - slot.x), Math.abs(KinkyDungeonPlayerEntity.y - slot.y)) > 1.5 - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(slot.x, slot.y))) { - foundslot = {x: slot.x, y: slot.y}; - - C = 100; - } else slots.splice(C, 1); - } - - if (foundslot) { - let weapon = KinkyDungeonPlayerDamage.name; - - let dropped = {x:foundslot.x, y:foundslot.y, name: weapon}; - - KDSetWeapon('Unarmed', true); - KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); - KinkyDungeonInventoryRemove(KinkyDungeonInventoryGetWeapon(weapon)); - - KinkyDungeonGroundItems.push(dropped); - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonDisarm" + (suff ? suff : "")), "#ff0000", 2); - - return true; - } - } - return false; -} - -function KinkyDungeonAttackEnemy(Enemy, Damage) { - let disarm = false; - if (Enemy.Enemy && Enemy.Enemy.disarm && Enemy.disarmflag > 0) { - if (Enemy.stun > 0 || Enemy.freeze > 0 || Enemy.blind > 0 || (Enemy.playWithPlayer && !Enemy.hostile)) Enemy.disarmflag = 0; - else if (Enemy.Enemy && Enemy.Enemy.disarm && Enemy.disarmflag >= 0.97 && KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed) { - Enemy.disarmflag = 0; - disarm = true; - } - } - let evaded = KinkyDungeonEvasion(Enemy, undefined, undefined, KinkyDungeonPlayerEntity); - let dmg = Damage; - let buffdmg = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackDmg"); - let predata = { - targetX: Enemy.x, - targetY: Enemy.y, - enemy: Enemy, - evaded: evaded, - miss: !evaded, - disarm: disarm, - eva: !disarm && evaded, - Damage: Damage, - buffdmg: buffdmg, - vulnConsumed: false, - vulnerable: (Enemy.vulnerable || (KDHostile(Enemy) && !Enemy.aware)) && dmg && !dmg.novulnerable && (!Enemy.Enemy.tags || !Enemy.Enemy.tags.nonvulnerable), - }; - KinkyDungeonSendEvent("beforePlayerAttack", predata); - - if (predata.buffdmg) dmg.damage = Math.max(0, dmg.damage + predata.buffdmg); - - if (predata.vulnerable && (predata.eva)) { - predata.vulnConsumed = true; - let dmgBonus = Math.max(Math.min(2 * dmg.damage, KDVulnerableDmg), dmg.damage * KDVulnerableDmgMult); - dmg.damage = Math.max(0, dmg.damage + dmgBonus); - KinkyDungeonSendTextMessage(4, TextGet((Enemy.vulnerable || Enemy.distraction > Enemy.Enemy.maxhp) ? "KinkyDungeonVulnerable" : "KinkyDungeonUnseen") - .replace("AMOUNT", "" + Math.round(10 * dmgBonus)) - .replace("EnemyName", TextGet("Name" + Enemy.Enemy.name)), "lightgreen", 2); - } - - - let hp = Enemy.hp; - KinkyDungeonDamageEnemy(Enemy, (predata.eva) ? dmg : null, undefined, undefined, undefined, undefined, KinkyDungeonPlayerEntity); - if (predata.eva && KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.sfx) { - if (KDToggles.Sound) KDDamageQueue.push({sfx: KinkyDungeonRootDirectory + "/Audio/" + KinkyDungeonPlayerDamage.sfx + ".ogg"}); - //AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" + KinkyDungeonPlayerDamage.sfx + ".ogg"); - } else if (!predata.eva) if (KDToggles.Sound) KDDamageQueue.push({sfx: KinkyDungeonRootDirectory + "/Audio/Miss.ogg"}); - //AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Miss.ogg"); - if (disarm) { - KinkyDungeonDisarm(Enemy); - } - if (!KinkyDungeonPlayerDamage || !KinkyDungeonPlayerDamage.silent || !(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Silence") > 0)) { - if (Enemy && hp < Enemy.Enemy.maxhp) { - KinkyDungeonAlert = 4; - } else { - KinkyDungeonAlert = 2; - } - } else { - if (!KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Silence") || KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Silence") < 2) { - if (KinkyDungeonAlert) { - KinkyDungeonAlert = 2; - } else { - KinkyDungeonAlert = 1; - } - } else if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Silence") < 3) { - // Meep - } - } - - if (Enemy.Enemy && Enemy.Enemy.disarm && !disarm && KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed) { - if (!Enemy.disarmflag) Enemy.disarmflag = 0; - Enemy.disarmflag += Enemy.Enemy.disarm; - } - let data = { - targetX: Enemy.x, - targetY: Enemy.y, - enemy: Enemy, - miss: !evaded, - disarm: disarm, - damage: Damage, - vulnConsumed: predata.vulnConsumed, - }; - KinkyDungeonSendEvent("playerAttack", data); - - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "damage", 1); - KinkyDungeonTickBuffTag(Enemy.buffs, "incomingHit", 1); - if (predata.eva) - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "hit", 1); - - - KinkyDungeonSendEvent("afterPlayerAttack", data); - - if (data.vulnConsumed) { - Enemy.vulnerable = 0; - } -} - -let KDBulletWarnings = []; -let KDUniqueBulletHits = new Map(); - - -function KDUpdateBulletEffects(b, d) { - // At the start we guarantee interactions - if (!b.bullet.noInteractTiles) { - let rad = b.bullet.aoe || 0.5; - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (AOECondition(b.x, b.y, b.x + X, b.y + Y, rad, KDBulletAoEMod(b)) && (X != 0 || Y != 0)) { - KDEffectTileInteractions(b.x + X, b.y + Y, b, d); - } - } - } -} - -function KinkyDungeonUpdateBullets(delta, Allied) { - if (Allied) KDUniqueBulletHits = new Map(); - if (delta > 0) - for (let b of KinkyDungeonBullets) { - if ((Allied && b.bullet && b.bullet.spell && !b.bullet.spell.enemySpell) || (!Allied && !(b.bullet && b.bullet.spell && !b.bullet.spell.enemySpell))) { - KinkyDungeonSendEvent("bulletTick", {bullet: b, delta: delta, allied: Allied}); - if (b.bullet && b.bullet.dot) { - KinkyDungeonBulletDoT(b); - } - if (b.bullet.cast && b.bullet.spell && b.bullet.spell.castDuringDelay && (!b.bullet.cast.chance || KDRandom() < b.bullet.cast.chance) && b.time > 1) { - let xx = b.bullet.cast.tx; - let yy = b.bullet.cast.ty; - if (b.bullet.cast.targetID) { - let enemy = KinkyDungeonFindID(b.bullet.cast.targetID); - if (enemy) { - xx = enemy.x; - yy = enemy.y; - } - } - let castingSpell = KinkyDungeonFindSpell(b.bullet.cast.spell, true); - if (b.bullet.cast.spread) { - let xxx = xx + Math.round(-b.bullet.cast.spread + 2*b.bullet.cast.spread * KDRandom()); - let yyy = yy + Math.round(-b.bullet.cast.spread + 2*b.bullet.cast.spread * KDRandom()); - if (xxx != b.x || yyy != b.y || castingSpell.type != 'bolt') { - xx = xxx; - yy = yyy; - } - } - - if (castingSpell.type != 'bolt') { - if (!xx) xx = b.x; - if (!yy) yy = b.y; - } else if (xx == b.x && yy == b.y) { - for (let i = 0; i < 20; i++) { - xx = b.x + Math.floor(KDRandom() * 3 - 1); - yy = b.y + Math.floor(KDRandom() * 3 - 1); - if (xx != b.x || yy != b.y) i = 1000; - else if (i > 19) { - xx = b.x + 1; - yy = b.y + 0; - } - } - } - - KinkyDungeonCastSpell(xx, yy, castingSpell, undefined, undefined, b); - if (b.bullet.cast.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + b.bullet.cast.sfx + ".ogg"); - } - } - } - if (Allied) { - KDBulletWarnings = []; - } - for (let E = 0; E < KinkyDungeonBullets.length; E++) { - let b = KinkyDungeonBullets[E]; - - if ((Allied && b.bullet && b.bullet.spell && !b.bullet.spell.enemySpell) || (!Allied && !(b.bullet && b.bullet.spell && !b.bullet.spell.enemySpell))) { - let d = delta; - let first = true; - let justBorn = false; - let trailSquares = []; - let startx = b.x; - let starty = b.y; - let end = false; - let mod = (b.bullet.spell && !b.bullet.spell.slowStart && (b.bullet.spell.fastStart || (b.bullet.spell.speed > b.bullet.spell.range * 0.8 && b.bullet.spell.speed > 1) || (!b.bullet.spell.enemySpell && !b.bullet.spell.allySpell && (b.vx != 0 || b.vy != 0)))) ? 1 : 0; - - KDBulletEffectTiles(b); - KDUpdateBulletEffects(b, 0); - - let dt = 0.1; - while (d >= 0.05) { - dt = (d - Math.max(0, d - 1))/Math.sqrt(Math.max(1, b.vx*b.vx+b.vy*b.vy)); - if (!first && delta > 0) { - if (b.born >= 0) { - b.born -= dt; - justBorn = true; - } - if (b.born < mod) { - b.xx += b.vx * dt; - b.yy += b.vy * dt; - b.time -= dt; - } - - if (b.bullet.spell && (b.trail || b.trailEffectTile) && (b.x != Math.round(b.xx) || b.y != Math.round(b.yy) || (b.bullet.spell && b.bullet.spell.trailOnSelf)) - && !trailSquares.includes(Math.round(b.xx) + "," + Math.round(b.yy))) { - if (KinkyDungeonBulletTrail(b)) { - trailSquares.push(Math.round(b.xx) + "," + Math.round(b.yy)); - } - } - - b.x = Math.round(b.xx); - b.y = Math.round(b.yy); - - d -= dt; - } else first = false; - - let outOfRange = false; - let endTime = false; - if (b.bullet && b.bullet.origin) { - let dist = Math.sqrt((b.bullet.origin.x - b.x) * (b.bullet.origin.x - b.x) + (b.bullet.origin.y - b.y) * (b.bullet.origin.y - b.y)); - if (dist > b.bullet.range) outOfRange = true; - if (dist >= b.bullet.range) endTime = true; - } - let outOfTime = (b.bullet.lifetime != 0 && b.time <= 0.001); - end = false; - let checkCollision = (b.bullet.faction == "Player" && (b.x != KinkyDungeonPlayerEntity.x || b.y != KinkyDungeonPlayerEntity.y)) - || justBorn || (b.x != startx || b.y != starty) || (!b.vx && !b.vy) || (KDistEuclidean(b.vx, b.vy) < 0.9); // Check collision for bullets only once they leave their square or if they are slower than one - if ((checkCollision && !KinkyDungeonBulletsCheckCollision(b, undefined, undefined, delta - d, false)) || outOfTime || outOfRange) { - if (!(b.bullet.spell && ((!b.bullet.trail && (b.bullet.spell.piercing || (b.bullet.spell.pierceEnemies && KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(b.x, b.y))))) || (b.bullet.trail && b.bullet.spell.piercingTrail))) || outOfRange || outOfTime) - end = true; - if (end) { - d = 0; - KinkyDungeonBullets.splice(E, 1); - KinkyDungeonBulletsID[b.spriteID] = null; - KinkyDungeonSendEvent("bulletDestroy", {bullet: b, target: undefined, outOfRange:outOfRange, outOfTime: outOfTime}); - E -= 1; - } - if (!((outOfTime || outOfRange) && b.bullet.spell && ((!b.bullet.trail && b.bullet.spell.nonVolatile) || (b.bullet.trail && b.bullet.spell.nonVolatileTrail)))) - KinkyDungeonBulletHit(b, 1.0, outOfTime, outOfRange, d, dt, end); - } - if (endTime) b.time = 0; - // Update the bullet's visual position - KinkyDungeonUpdateSingleBulletVisual(b, end); - } - if (!end || (b.bullet.spell && b.bullet.spell.alwaysWarn)) { - KinkyDungeonSendEvent("bulletAfterTick", {bullet: b, delta: delta, allied: Allied}); - // Update the bullet's visual position - KinkyDungeonUpdateSingleBulletVisual(b, end); - - let show = (KDFactionRelation("Player", b.bullet.faction) < 0.5 || (b.bullet.spell && b.bullet.spell.playerEffect) || b.bullet.playerEffect || (b.bullet.spell && b.bullet.spell.alwaysWarn)) - && !(b.bullet.spell && b.bullet.spell.hideWarnings) - && ((b.bullet.spell && b.bullet.spell.alwaysWarn) - || (b.bullet.hit == "lingering" || (b.bullet.spell && b.bullet.name == b.bullet.spell.name && (b.bullet.spell.onhit == "aoe" || b.bullet.spell.onhit == "dot"))) - || ((b.lifetime > 0 || b.lifetime == undefined) && b.bullet.damage && b.bullet.damage.type && b.bullet.damage.type != "heal" && b.bullet.damage.type != "inert") - ); - let bxx = b.xx; - let byy = b.yy; - let bx = b.x; - let by = b.y; - let btime = b.time; - let bborn = b.born; - // Lookforward - d = delta; - first = true; - startx = bx; - starty = by; - - b.warnings = []; - - while (d > 0.1) { - if (!first && delta > 0) { - dt = 0.5 * (d - Math.max(0, d - 1))/Math.sqrt(Math.max(1, b.vx*b.vx+b.vy*b.vy)); - - if (bborn >= 0) bborn -= dt; - if (bborn < mod) { - bxx += b.vx * dt; - byy += b.vy * dt; - btime -= dt; - } - - bx = Math.round(bxx); - by = Math.round(byy); - - d -= dt; - } else first = false; - - let outOfRange = false; - if (b.bullet && b.bullet.origin) { - let dist = Math.sqrt((b.bullet.origin.x - bx) * (b.bullet.origin.x - bx) + (b.bullet.origin.y - by) * (b.bullet.origin.y - by)); - if (dist > b.bullet.range) outOfRange = true; - } - let outOfTime = (b.bullet.lifetime != 0 && ((!b.bullet.damage && btime <= 0.001) || ((b.bullet.damage) && btime <= 1.001))); - let checkCollision = (bx != startx || by != starty) - || (!b.vx && !b.vy) || (KDistEuclidean(b.vx, b.vy) < 0.9) || b.bullet.aoe; // Check collision for bullets only once they leave their square or if they are slower than one - if (outOfTime || outOfRange) { - d = 0; - } - if ((!(outOfTime || outOfRange) || (b.bullet.spell?.alwaysWarn)) && checkCollision) { - let rad = b.bullet.aoe ? b.bullet.aoe : ((b.bullet.spell && b.bullet.spell.aoe && b.bullet.name == b.bullet.spell.name) ? b.bullet.spell.aoe : 0); - for (let xx = bx - Math.floor(rad); xx <= bx + Math.ceil(rad); xx++) { - for (let yy = by - Math.floor(rad); yy <= by + Math.ceil(rad); yy++) { - if (AOECondition(bx, by, xx, yy, rad, KDBulletAoEMod(b))) { - if (show && !KDBulletWarnings.some((w) => {return w.x == xx && w.y == yy;})) - KDBulletWarnings.push({x: xx, y: yy, color:b.bullet.spell ? (b.bullet.spell.color ? b.bullet.spell.color : "#ff0000") : "#ff0000"}); - if (!b.warnings.includes(xx + "," + yy)) { - b.warnings.push(xx + "," + yy); - } - } - } - } - } - } - } - - - // A bullet can only damage an enemy in one location at a time - // Resets at the end of the bullet update! - // But only for piercing bullets. Non-piercing bullets just expire - if (!b.bullet.piercing && !b.bullet.pierceEnemies && !b.bullet.noDoubleHit) - b.alreadyHit = undefined; - } - } -} - -function KinkyDungeonUpdateSingleBulletVisual(b, end, delay) { - if (b.spriteID && !b.bullet.noSprite) { - let bb = KinkyDungeonBulletsVisual.get(b.spriteID); - let scale = bb ? bb.scale : 0; - let alpha = bb ? bb.alpha : 0; - let dd = bb ? bb.delay : delay; - let spinAngle = bb ? bb.spinAngle : 0; - let visx = bb ? bb.visual_x : b.visual_x; - let visy = bb ? bb.visual_y : b.visual_y; - if (visx == undefined) visx = b.xx; - if (visy == undefined) visy = b.yy; - - let temp = (!b.vx && !b.vy && b.time <= 1 && !b.bullet.hit); - KinkyDungeonBulletsVisual.set(b.spriteID, {end: end, temporary: temp, spin: b.bullet.bulletSpin, spinAngle: spinAngle, name: b.bullet.name, spriteID: b.spriteID, size: b.bullet.width ? b.bullet.width : 1, aoe: (b.bullet.spell && b.bullet.spell.aoe) ? b.bullet.spell.aoe : undefined, vx: b.vx, vy: b.vy, xx: b.xx, yy: b.yy, visual_x: visx, visual_y: visy, updated: true, scale: scale, alpha: alpha, delay: dd}); - } -} - -function KinkyDungeonUpdateBulletVisuals(delta) { - if (delta > 0) - for (let b of KinkyDungeonBulletsVisual.entries()) { - if (b[1].updated) { - b[1].updated = false; - } else if (!b[1].end || b[1].alpha <= 0.01) KinkyDungeonBulletsVisual.delete(b[0]); - } -} - -let KinkyDungeonCurrentTick = 0; - -function KinkyDungeonUpdateBulletsCollisions(delta, Catchup) { - for (let E = 0; E < KinkyDungeonBullets.length; E++) { - let b = KinkyDungeonBullets[E]; - if ((!Catchup && !b.secondary) || (Catchup && b.secondary)) { - if (!KinkyDungeonBulletsCheckCollision(b, b.time >= 0, undefined, undefined, !(b.bullet.faction == "Player" || (!b.vx && !b.vy) || b.bullet.aoe || (KDistEuclidean(b.vx, b.vy) < 0.9)))) { // (b.bullet.faction == "Player" || (!b.vx && !b.vy) || b.bullet.aoe || (KDistEuclidean(b.vx, b.vy) < 0.9)) && - if (!(b.bullet.spell && (b.bullet.spell.piercing || (b.bullet.spell.pierceEnemies && KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(b.x, b.y)))))) { - KinkyDungeonBullets.splice(E, 1); - KinkyDungeonBulletsID[b.spriteID] = null; - KinkyDungeonUpdateSingleBulletVisual(b, true); - KinkyDungeonSendEvent("bulletDestroy", {bullet: b, target: undefined, outOfRange:false, outOfTime: false}); - E -= 1; - } - KinkyDungeonBulletHit(b, 1); - } - } - } -} - - -function KDCheckCollideableBullets(entity, force) { - for (let E = 0; E < KinkyDungeonBullets.length; E++) { - let b = KinkyDungeonBullets[E]; - if (b.x == entity.x && b.y == entity.y && b.bullet && b.bullet.damage - && (b.time > 1 // Only bullets that arent instantly ending - && (!entity.player || !(b.vx != 0 || b.vy != 0)))) {// Enemies can run into bullets as they move, but the player can walk into bullets that are moving without being hit - let pierce = b.bullet.spell && (b.bullet.spell.piercing || b.bullet.spell.pierceEnemies); - let noDirect = b.bullet.spell && (b.bullet.spell.noDirectDamage); - if (noDirect && b.bullet.damage.damage != 0) continue; - if (pierce && b.bullet.damage.damage != 0) continue; - if (!KDBulletCanHitEntity(b, entity) && !force) continue; - - if (entity.player) KDBulletHitPlayer(b, KinkyDungeonPlayerEntity); - else KDBulletHitEnemy(b, entity, 0, b.bullet.NoMsg); - if (!pierce) { - KinkyDungeonBullets.splice(E, 1); - KinkyDungeonBulletsID[b.spriteID] = null; - KinkyDungeonUpdateSingleBulletVisual(b, true); - KinkyDungeonSendEvent("bulletDestroy", {bullet: b, target: undefined, outOfRange:false, outOfTime: false}); - E -= 1; - } - KinkyDungeonBulletHit(b, 1); - } - } -} - -/** - * - * @param {any} b - * @param {number} born - * @param {boolean} [outOfTime] - * @param {boolean} [outOfRange] - * @param {number} [d] - Fraction of the timestep that this hit happened in - * @param {number} [dt] - Timestep - * @param {boolean} [end] - If the bullet is dying - */ -function KinkyDungeonBulletHit(b, born, outOfTime, outOfRange, d, dt, end) { - if (d > 0 && (b.vx || b.vy) && end) { - let tt = KinkyDungeonMapGet(b.x, b.y); - if (!KinkyDungeonMovableTilesEnemy.includes(tt)) { - b.xx -= b.vx * dt; - b.yy -= b.vy * dt; - b.x = Math.round(b.xx); - b.y = Math.round(b.yy); - } - } - - if (b.bullet.hit && b.bullet.spell && b.bullet.hit != b.bullet.spell.secondaryhit && b.bullet.spell.landsfx) { - if (KDToggles.Sound && (b.bullet.faction == "Player" || KinkyDungeonVisionGet(b.x, b.y) > 0)) { - KDDamageQueue.push({sfx: KinkyDungeonRootDirectory + "/Audio/" + b.bullet.spell.landsfx + ".ogg"}); - } - //KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + b.bullet.spell.landsfx + ".ogg"); - } - KinkyDungeonSendEvent("beforeBulletHit", {bullet: b, target: undefined, outOfRange:outOfRange, outOfTime: outOfTime}); - - if (b.bullet.cast && (!b.bullet.cast.chance || KDRandom() < b.bullet.cast.chance) && (!b.bullet.spell || !b.bullet.spell.noCastOnHit)) { - let xx = b.bullet.cast.tx; - let yy = b.bullet.cast.ty; - if (b.bullet.cast.targetID) { - let enemy = KinkyDungeonFindID(b.bullet.cast.targetID); - if (enemy) { - xx = enemy.x; - yy = enemy.y; - } - } - if (!xx) xx = b.x; - if (!yy) yy = b.y; - KinkyDungeonCastSpell(xx, yy, KinkyDungeonFindSpell(b.bullet.cast.spell, true), undefined, undefined, b); - } - - if (b.bullet.hit == "") { - let newB = {born: born, time:1, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), - bullet:{ - bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, - bulletSpin: b.bullet.spell?.hitSpin, - hitevents: b.bullet.spell.hitevents, - faction: b.bullet.faction, lifetime: 1, passthrough:true, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height - }}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false, d); - if (b.bullet.effectTile) { - KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); - } - } else if (b.bullet.hit == "buff" || b.bullet.hit == "buffonly" || b.bullet.hit == "buffnoAoE") { - if (b.bullet.hit == "buff") { - let newB = {born: born, time:1, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), - bullet:{ - bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, - bulletSpin: b.bullet.spell?.hitSpin, - faction: b.bullet.faction, lifetime: 1, passthrough:true, - hitevents: b.bullet.spell.hitevents, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height}}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false, d); - } - if (b.bullet.spell) { - let aoe = b.bullet.spell.aoe ? b.bullet.spell.aoe : 0.5; - if (b.bullet.hit == "buffnoAoE") aoe = 0.5; - if (b.bullet.spell && (b.bullet.spell.playerEffect || b.bullet.playerEffect) && AOECondition(b.x, b.y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, aoe, KDBulletAoEMod(b))) { - KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, b.bullet.damage.type, b.bullet.playerEffect ? b.bullet.playerEffect : b.bullet.spell.playerEffect, b.bullet.spell, b.bullet.faction, b); - } - for (let enemy of KinkyDungeonEntities) { - if (((enemy.x == b.x && enemy.y == b.y) || (b.bullet.spell && aoe && AOECondition(b.x, b.y, enemy.x, enemy.y, aoe, KDBulletAoEMod(b))))) { - for (let buff of b.bullet.spell.buffs) { - if (buff.enemies - && (!buff.noAlly || !b.bullet.faction || KDFactionRelation(b.bullet.faction, KDGetFaction(enemy)) < 0.5) - && (!buff.onlyAlly || !b.bullet.faction || KDFactionRelation(b.bullet.faction, KDGetFaction(enemy)) >= 0.5)) { - if (!enemy.buffs) enemy.buffs = {}; - KinkyDungeonApplyBuff(enemy.buffs, buff); - } - } - } - } - } - if (b.bullet.effectTile) { - KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); - } - } else if (b.bullet.hit == "aoe") { - let newB = {secondary: true, born: born, time:b.bullet.spell.lifetime, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), - bullet:{faction: b.bullet.faction, spell:b.bullet.spell, bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, - bulletSpin: b.bullet.spell?.hitSpin, damage: { - damage:(b.bullet.spell.aoedamage) ? b.bullet.spell.aoedamage : b.bullet.spell.power, type:b.bullet.spell.damage, - hitevents: b.bullet.spell.hitevents, - distract: b.bullet.spell.distract, distractEff: b.bullet.spell.distractEff, bindEff: b.bullet.spell.bindEff, - bind: b.bullet.spell.bind, bindType: b.bullet.spell.bindType, time:b.bullet.spell.time}, aoe: b.bullet.spell.aoe, lifetime: b.bullet.spell.lifetime, passthrough:true, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height}}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false, d); - - if (b.bullet.effectTile) { - KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); - } - } else if (b.bullet.hit == "instant") { - if (!KinkyDungeonBulletsCheckCollision(b, true, true, d)) { - if (!(b.bullet.spell && (b.bullet.spell.piercing || (b.bullet.spell.pierceEnemies && KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(b.x, b.y)))))) { - let ind = KinkyDungeonBullets.indexOf(b); - if (ind > -1) - KinkyDungeonBullets.splice(ind, 1); - KinkyDungeonBulletsID[b.spriteID] = null; - KinkyDungeonUpdateSingleBulletVisual(b, true, d); - KinkyDungeonSendEvent("bulletDestroy", {bullet: b, target: undefined, outOfRange:outOfRange, outOfTime: outOfTime}); - } - } - let newB = {born: born, time:1, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), bullet:{ - hitevents: b.bullet.spell.hitevents, - bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, - bulletSpin: b.bullet.spell?.hitSpin, - faction: b.bullet.faction, lifetime: 1, passthrough:true, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height}}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false); - if (b.bullet.effectTile) { - KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); - } - } else if (b.bullet.hit == "lingering") { - if (b.bullet.effectTile) { - KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); - } - let rad = (b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0; - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (AOECondition(b.x, b.y, b.x + X, b.y + Y, rad, KDBulletAoEMod(b))) { - let dd = KDistEuclidean(X, Y) / rad; - let LifetimeBonus = (b.bullet.spell.lifetimeHitBonus) ? Math.floor(KDRandom() * b.bullet.spell.lifetimeHitBonus) : 0; - let newB = {delay: dd, born: born, time:b.bullet.spell.lifetime + LifetimeBonus, x:b.x+X, y:b.y+Y, vx:0, vy:0, xx:b.x+X, yy:b.y+Y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), - bullet:{faction: b.bullet.faction, spell:b.bullet.spell, block: (b.bullet.blockhit ? b.bullet.blockhit : 0), - bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, hit: b.bullet.spell?.secondaryhit, - bulletSpin: b.bullet.spell?.hitSpin, - effectTileLinger: b.bullet.spell.effectTileLinger, effectTileDurationModLinger: b.bullet.spell.effectTileDurationModLinger, - hitevents: b.bullet.spell.hitevents, - damage: { - damage:b.bullet.spell.power, type:b.bullet.spell.damage, bind: b.bullet.spell.bind, bindType: b.bullet.spell.bindType, time:b.bullet.spell.time, - distract: b.bullet.spell.distract, distractEff: b.bullet.spell.distractEff, bindEff: b.bullet.spell.bindEff, - }, lifetime: b.bullet.spell.lifetime + LifetimeBonus, name:b.bullet.name+"Hit", width:1, height:1}}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false, dd); - } - } - - } else if (b.bullet.hit == "heal") { - let newB = {born: born, time:b.bullet.spell.lifetime, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), - bullet:{faction: b.bullet.faction, spell:b.bullet.spell, bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, - bulletSpin: b.bullet.spell?.hitSpin, - damage: { - damage:(b.bullet.spell.aoedamage) ? b.bullet.spell.aoedamage : b.bullet.spell.power, type:b.bullet.spell.damage, - hitevents: b.bullet.spell.hitevents, - distract: b.bullet.spell.distract, distractEff: b.bullet.spell.distractEff, bindEff: b.bullet.spell.bindEff, - bind: b.bullet.spell.bind, bindType: b.bullet.spell.bindType, time:b.bullet.spell.time - }, aoe: b.bullet.spell.aoe, lifetime: b.bullet.spell.lifetime, passthrough:true, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height}}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false); - - if (b.bullet.spell && (b.bullet.spell.playerEffect || b.bullet.playerEffect) && AOECondition(b.x, b.y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, b.spell.aoe, KDBulletAoEMod(b))) { - KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, b.bullet.damage.type, b.bullet.playerEffect ? b.bullet.playerEffect : b.bullet.spell.playerEffect, b.bullet.spell, b.bullet.faction, b); - } - for (let enemy of KinkyDungeonEntities) { - if ((b.reflected - || (!b.bullet.spell || !b.bullet.faction - || (!KDFactionHostile(b.bullet.faction, enemy)) - )) - && ((enemy.x == b.x && enemy.y == b.y) || (b.bullet.spell && b.bullet.spell.aoe && - AOECondition(b.x, b.y, enemy.x, enemy.y, b.bullet.spell.aoe, KDBulletAoEMod(b))))) { - let origHP = enemy.hp; - enemy.hp = Math.min(enemy.hp + b.bullet.spell.power, enemy.Enemy.maxhp); - //KDDamageQueue.push({floater: `+${Math.round((enemy.hp - origHP) * 10)}`, Entity: enemy, Color: "#ffaa00", Time: 3}); - if (b.bullet.faction == "Player" || KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) - KinkyDungeonSendFloater(enemy, `+${Math.round((enemy.hp - origHP) * 10)}`, "#ffaa00", 3); - if (b.bullet.faction == "Player") - KDHealRepChange(enemy, enemy.hp - origHP); - } - } - if (b.bullet.effectTile) { - KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); - } - } else if (b.bullet.hit == "cast" && b.bullet.spell && b.bullet.spell.spellcasthit) { - let cast = b.bullet.spell.spellcasthit; - let rad = (b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0; - if (cast.countPerCast) { - for (let cc = 0; cc < cast.countPerCast; cc++) { - let spell = KinkyDungeonFindSpell(cast.spell, true); - let xx = b.x + Math.round(rad * (1 - 2*KDRandom())); - let yy = b.y + Math.round(rad * (1 - 2*KDRandom())); - KinkyDungeonCastSpell(xx, yy, spell, undefined, undefined, b); - } - } else { - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (AOECondition(b.x, b.y, b.x + X, b.y + Y, rad, KDBulletAoEMod(b)) && (!cast.chance || KDRandom() < cast.chance)) { - let spell = KinkyDungeonFindSpell(cast.spell, true); - let xx = b.x + X; - let yy = b.y + Y; - KinkyDungeonCastSpell(xx, yy, spell, undefined, undefined, b); - } - } - } - - if (b.bullet.effectTile) { - KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); - } - } else if (b.bullet.hit == "teleport") { - if (KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(b.x, b.y))) { - let newB = {born: born, time:b.bullet.spell.lifetime, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), - bullet:{faction: b.bullet.faction, spell:b.bullet.spell, - bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, - bulletSpin: b.bullet.spell?.hitSpin, - damage: { - damage:(b.bullet.spell.aoedamage) ? b.bullet.spell.aoedamage : b.bullet.spell.power, type:b.bullet.spell.damage, boundBonus: b.bullet.spell.boundBonus, - hitevents: b.bullet.spell.hitevents, - distract: b.bullet.spell.distract, distractEff: b.bullet.spell.distractEff, bindEff: b.bullet.spell.bindEff, - bind: b.bullet.spell.bind, bindType: b.bullet.spell.bindType, time:b.bullet.spell.time}, aoe: b.bullet.spell.aoe, lifetime: b.bullet.spell.lifetime, passthrough:true, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height - }}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false); - - KinkyDungeonMoveTo(b.x, b.y, true); - } - if (b.bullet.effectTile) { - KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); - } - } else if (b.bullet.hit == "summon") { - if (b.bullet.effectTile) { - KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); - } - } - - if (b.bullet.summon && b.bullet.summon) { - let created = 0; - let type = ""; - for (let sum of b.bullet.summon) { - if (!sum.chance || KDRandom() < sum.chance) { - let summonType = sum.name; // Second operand is the enemy type - if (!type) type = summonType; - let count = sum.count ? sum.count : 1; - let rad = (b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0; - if (count > 0) { - let faction = (b.bullet.spell && b.bullet.spell.defaultFaction) ? undefined : b.bullet.faction; - if (!faction && b.bullet.spell && b.bullet.spell.enemySpell) faction = "Enemy"; - else if (!faction && b.bullet.spell && b.bullet.spell.allySpell) faction = "Player"; - - if (b.bullet.faction) faction = b.bullet.faction; - if (sum.faction) faction = sum.faction; - let e = KinkyDungeonSummonEnemy(b.x, b.y, summonType, count, rad, sum.strict, sum.time ? sum.time : undefined, sum.hidden, sum.goToTarget, faction, faction && KDFactionRelation("Player", faction) <= -0.5, sum.minRange, undefined, undefined, sum.hideTimer, undefined, KDBulletAoEMod(b), sum.bound ? b.bullet.source : undefined, sum.weakBinding); - created += e; - } - } - } - if (!b.bullet.spell || !b.bullet.spell.noSumMsg) { - if (created == 1) KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSummonSingle"+type), "white", 2, undefined, undefined, b); - else if (created > 1) KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonSummonMulti"+type).replace("SummonCount", "" + created), "white", 3, undefined, undefined, b); - } - } -} - - -function KinkyDungeonSummonEnemy(x, y, summonType, count, rad, strict, lifetime, hidden, goToTarget, faction, hostile, minrad, startAware, noBullet, hideTimer, pathfind, mod, boundTo, weakBinding) { - let slots = []; - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (AOECondition(x, y, x + X, y + Y, rad, mod) && (!minrad || Math.sqrt(X*X+Y*Y) >= minrad)) { - if ((x + X > 0 && y + Y > 0 && x + X < KinkyDungeonGridWidth && y + Y < KinkyDungeonGridHeight)) - slots.push({x:X, y:Y}); - } - } - - if (slots.length == 0) return 0; - let created = 0; - let maxcounter = 0; - let Enemy = KinkyDungeonGetEnemyByName(summonType); - for (let C = 0; C < count && (KinkyDungeonEntities.length < 300 || faction == "Player" || faction == "Ambush" || faction == "Prisoner") && maxcounter < count * 30; C++) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - if (Enemy && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x+slot.x, y+slot.y)) - && (KinkyDungeonNoEnemy(x+slot.x, y+slot.y, true) || (KinkyDungeonNoEnemy(x+slot.x, y+slot.y, false) && Enemy.noblockplayer && KDistChebyshev(x+slot.x - KinkyDungeonPlayerEntity.x, y+slot.y - KinkyDungeonPlayerEntity.y) < 1.5)) - && (!strict || KinkyDungeonCheckPath(x, y, x+slot.x, y+slot.y, false)) - && (!hidden || (KinkyDungeonVisionGet(x+slot.x, y+slot.y) < 1))) { - let path = (hidden || pathfind) ? KinkyDungeonFindPath( - x+slot.x, y+slot.y, - goToTarget ? KinkyDungeonTargetX : x, goToTarget ? KinkyDungeonTargetY : y, - false, false, - false, Enemy.tags.opendoors ? KinkyDungeonMovableTilesSmartEnemy : KinkyDungeonMovableTilesEnemy, - ) : null; - - if ((!hidden && !pathfind) || path) { - let e = {summoned: true, boundTo: boundTo, weakBinding: weakBinding, faction: faction, hostile: hostile ? 100 : undefined, hideTimer: hideTimer, rage: Enemy.summonRage ? 9999 : undefined, Enemy: Enemy, id: KinkyDungeonGetEnemyID(), gx: goToTarget ? KinkyDungeonTargetX : undefined, gy: goToTarget ? KinkyDungeonTargetY : undefined, - x:x+slot.x, y:y+slot.y, hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0, lifetime: lifetime, maxlifetime: lifetime, path: path}; - KDProcessCustomPatron(Enemy, e); - KDAddEntity(e); - if (!noBullet) { - let spell = KinkyDungeonFindSpell("Summon", true); - if (spell) { - KinkyDungeonCastSpell(e.x, e.y, spell, undefined, undefined, undefined); - } - } - if (startAware) { - e.vp = 2; - e.aware = true; - } - created += 1; - } - } else C -= 1; - maxcounter += 1; - } - return created; -} - -function KinkyDungeonBulletDoT(b) { - KinkyDungeonBulletHit(b, 1.1); -} - -function KinkyDungeonBulletTrail(b) { - let avoidPoint = b.bullet.spell.noTrailOnPlayer ? {x: KinkyDungeonPlayerEntity.x, y: KinkyDungeonPlayerEntity.y} : null; - let trail = false; - if (b.bullet.spell.trail) { - if (b.bullet.spell.trail == "lingering" && !b.bullet.trail) { - let aoe = b.bullet.spell.trailspawnaoe ? b.bullet.spell.trailspawnaoe : 0.0; - let rad = Math.ceil(aoe/2); - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (AOECondition(b.x, b.y, b.x + X, b.y + Y, rad, KDBulletTrailAoEMod(b)) && KDRandom() < b.bullet.spell.trailChance && (!avoidPoint || avoidPoint.x != X + b.x || avoidPoint.y != Y + b.y)) { - trail = true; - let newB = {born: 0, time:b.bullet.spell.trailLifetime + (b.bullet.spell.trailLifetimeBonus ? Math.floor(KDRandom() * b.bullet.spell.trailLifetimeBonus) : 0), x:b.x + X, y:b.y + Y, vx:0, vy:0, xx:b.x + X, yy:b.y + Y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Trail" + CommonTime(), - bullet:{faction: b.bullet.faction, trail: true, hit: b.bullet.spell.trailHit, spell:b.bullet.spell, playerEffect:b.bullet.spell.trailPlayerEffect, - bulletColor: b.bullet.spell?.trailColor, bulletLight: b.bullet.spell?.trailLight, - bulletSpin: b.bullet.spell?.hitSpin, damage: { - damage:b.bullet.spell.trailPower, type:b.bullet.spell.trailDamage, boundBonus: b.bullet.spell.boundBonus, - hitevents: b.bullet.spell.hitevents, - distract: b.bullet.spell.distract, distractEff: b.bullet.spell.distractEff, bindEff: b.bullet.spell.bindEff, - bind: b.bullet.spell.trailBind, bindType: b.bullet.spell.bindType, time:b.bullet.spell.trailTime}, lifetime: b.bullet.spell.trailLifetime, name:b.bullet.name+"Trail", width:1, height:1}}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false); - } - } - } else if (b.bullet.spell.trail == "cast" && !b.bullet.trail && b.bullet.spell && b.bullet.spell.trailcast) { - let aoe = b.bullet.spell.trailspawnaoe ? b.bullet.spell.trailspawnaoe : 0.0; - let rad = Math.ceil(aoe/2); - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (AOECondition(b.x, b.y, b.x + X, b.y + Y, rad, KDBulletTrailAoEMod(b)) && KDRandom() < b.bullet.spell.trailChance && (!avoidPoint || avoidPoint.x != X + b.x || avoidPoint.y != Y + b.y)) { - trail = true; - let cast = b.bullet.spell.trailcast; - let spell = KinkyDungeonFindSpell(cast.spell, true); - if (spell) { - KinkyDungeonCastSpell(b.x + X, b.y + Y, spell, undefined, undefined, undefined); - } - } - } - } - } - if (b.bullet.effectTileTrail) { - KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTileTrail, b.bullet.effectTileDurationModTrail, (b.bullet.spell.effectTileTrailAoE) ? b.bullet.spell.effectTileTrailAoE : 0.5, avoidPoint, b.bullet.spell.effectTileDensityTrail, KDBulletTrailAoEMod(b)); - } - return trail; -} - -function KinkyDungeonBulletsCheckCollision(bullet, AoE, force, d, inWarningOnly, delta) { - let mapItem = KinkyDungeonMapGet(bullet.x, bullet.y); - if (!bullet.bullet.passthrough && !bullet.bullet.piercing && !KinkyDungeonOpenObjects.includes(mapItem)) return false; - - KDBulletEffectTiles(bullet); - - if (bullet.bullet.noEnemyCollision && !(bullet.bullet && bullet.bullet.alwaysCollideTags)) return true; - - if (bullet.delay && !d) d = bullet.delay; - - let hitEnemy = false; - if (bullet.bullet.damage && (bullet.time > 0 || force)) { - if ((AoE || (bullet.vx != 0 || bullet.vy != 0))) { // Moving bullets always have a chance to hit, while AoE only has a chance to hit when AoE is explicitly being checked - if (bullet.bullet.aoe ? KDBulletAoECanHitEntity(bullet, KinkyDungeonPlayerEntity) : KDBulletCanHitEntity(bullet, KinkyDungeonPlayerEntity, inWarningOnly)) { - if (!bullet.bullet.spell || bullet.born < 1 || (bullet.vx == 0 && bullet.vy == 0) || bullet.bullet.spell.enemySpell) { // Projectiles just born cant hurt you, unless they're enemy projectiles - if (!(!bullet.secondary && bullet.bullet.spell && bullet.bullet.spell.noDirectDamage)) - KDBulletHitPlayer(bullet, KinkyDungeonPlayerEntity); - hitEnemy = true; - } - } - let nomsg = bullet.bullet && bullet.bullet.spell && bullet.bullet.spell.enemyspell && !bullet.reflected; - for (let enemy of KinkyDungeonEntities) { - let overrideCollide = !bullet.bullet.aoe ? false : (bullet.bullet.spell && bullet.bullet.alwaysCollideTags && bullet.bullet.alwaysCollideTags.some((tag) => {return enemy.Enemy.tags[tag];})); - if (bullet.bullet.aoe ? KDBulletAoECanHitEntity(bullet, enemy) : KDBulletCanHitEntity(bullet, enemy, inWarningOnly, overrideCollide)) { - if (!(!bullet.secondary && bullet.bullet.spell && bullet.bullet.spell.noDirectDamage)) { - KDBulletHitEnemy(bullet, enemy, d, nomsg); - nomsg = true; - } - hitEnemy = true; - } - } - - KDUpdateBulletEffects(bullet, d); - - } - } - if (!bullet.bullet.aoe && hitEnemy) return false; - - if (!(bullet.bullet.block > 0) && bullet.vx != 0 || bullet.vy != 0) { - - for (let b2 of KinkyDungeonBullets) { - if (b2 != bullet && b2.bullet.block > 0 && b2.x == bullet.x && b2.y == bullet.y) { - b2.bullet.block -= bullet.bullet.damage.damage; - if (b2.bullet.block <= 0) b2.bullet.block = -1; - - return false; - } - } - } else if (bullet.bullet.block == -1) return false; // Shields expire - - if (bullet.bullet.lifetime == -1) return false; // Instant spells - - if (!bullet.bullet.passthrough && !KinkyDungeonOpenObjects.includes(mapItem)) return false; - return true; -} - -function KDBulletAoECanHitEntity(bullet, enemy) { - if (enemy.player) { - return (bullet.bullet.spell && (bullet.bullet.spell.playerEffect || bullet.bullet.playerEffect) - && AOECondition(bullet.x, bullet.y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, bullet.bullet.aoe || 0.5, KDBulletAoEMod(bullet))) - && (!bullet.bullet.spell || !bullet.bullet.spell.noUniqueHits || !KDUniqueBulletHits.get(KDBulletID(bullet, KinkyDungeonPlayerEntity))); - } else { - return (bullet.reflected - || (!bullet.bullet.spell || !bullet.bullet.faction - || (!KDFactionFavorable(bullet.bullet.faction, enemy) && (!bullet.bullet.damage || bullet.bullet.damage.type != "heal")) - || (!KDFactionHostile(bullet.bullet.faction, enemy) && (bullet.bullet.damage && bullet.bullet.damage.type == "heal")) - )) - && AOECondition(bullet.x, bullet.y, enemy.x, enemy.y, bullet.bullet.aoe || 0.5, KDBulletAoEMod(bullet)) - && (!bullet.bullet.spell || !bullet.bullet.spell.noUniqueHits || !KDUniqueBulletHits.get(KDBulletID(bullet, enemy))); - } -} -function KDBulletCanHitEntity(bullet, enemy, inWarningOnly, overrideCollide) { - if (enemy.player) { - return bullet.bullet.spell && (bullet.bullet.spell.playerEffect || bullet.bullet.playerEffect) - && (!bullet.bullet.noEnemyCollision || (bullet.bullet.spell && bullet.bullet.alwaysCollideTags && bullet.bullet.alwaysCollideTags.includes("PlayerChar"))) - && KinkyDungeonPlayerEntity.x == bullet.x && KinkyDungeonPlayerEntity.y == bullet.y - && (!inWarningOnly || (bullet.warnings && bullet.warnings.includes(KinkyDungeonPlayerEntity.lastx + "," + KinkyDungeonPlayerEntity.lasty))) - && (!bullet.bullet.spell || !bullet.bullet.spell.noUniqueHits || !KDUniqueBulletHits.get(KDBulletID(bullet, KinkyDungeonPlayerEntity))); - } else { - return (enemy.x == bullet.x && enemy.y == bullet.y) && (bullet.reflected || overrideCollide - || (!bullet.bullet.spell || !bullet.bullet.faction - || (!KDFactionFavorable(bullet.bullet.faction, enemy) && (!bullet.bullet.damage || bullet.bullet.damage.type != "heal")) - || (!KDFactionHostile(bullet.bullet.faction, enemy) && (bullet.bullet.damage && bullet.bullet.damage.type == "heal")) - )) - && (!bullet.bullet.noEnemyCollision || overrideCollide) - && (!inWarningOnly || (bullet.warnings && bullet.warnings.includes(enemy.lastx + "," + enemy.lasty))) - && (!bullet.bullet.spell || !bullet.bullet.spell.noUniqueHits || !KDUniqueBulletHits.get(KDBulletID(bullet, enemy))); - } -} - -/** - * - * @param {any} bullet - */ -function KDBulletEffectTiles(bullet) { - if (bullet.bullet.spell && bullet.bullet.spell.type == "dot") { - if (bullet.bullet.spell.effectTileDoT) { - KDCreateAoEEffectTiles(bullet.x, bullet.y, bullet.bullet.spell.effectTileDoT, bullet.bullet.spell.effectTileDurationModDoT, (bullet.bullet.spell.effectTileAoE ? bullet.bullet.spell.effectTileAoE : ((bullet.bullet.spell.aoe) ? bullet.bullet.spell.aoe : 0.5)), undefined, bullet.bullet.spell.effectTileDensityDoT, KDBulletAoEMod(bullet)); - } - } - - if (bullet.bullet.effectTileLinger) { - if (bullet.bullet.effectTileLinger) { - KDCreateEffectTile(bullet.x, bullet.y, bullet.bullet.effectTileLinger, bullet.bullet.effectTileDurationModLinger); - } - } -} - -function KDBulletHitPlayer(bullet, player) { - let pf = bullet.bullet.playerEffect ? bullet.bullet.playerEffect : bullet.bullet.spell.playerEffect; - if (pf) { - KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, bullet.bullet.damage.type, pf, bullet.bullet.spell, bullet.bullet.faction, bullet); - KDUniqueBulletHits.set(KDBulletID(bullet, player), true); - } -} - -/** - * - * @param {any} bullet - * @param {entity} enemy - * @param {number} d - * @param {boolean} nomsg - */ -function KDBulletHitEnemy(bullet, enemy, d, nomsg) { - KinkyDungeonSendEvent("bulletHitEnemy", {bullet: bullet, enemy: enemy}); - KDUniqueBulletHits.set(KDBulletID(bullet, enemy), true); - if (bullet.bullet.damage.type == "heal") { - let origHP = enemy.hp; - enemy.hp = Math.min(enemy.hp + bullet.bullet.spell.power, enemy.Enemy.maxhp); - if (bullet.bullet.faction == "Player" || KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) - KinkyDungeonSendFloater(enemy, `+${Math.round((enemy.hp - origHP) * 10)}`, "#ffaa00", 3); - if (bullet.bullet.faction == "Player") - KDHealRepChange(enemy, enemy.hp - origHP); - } else if (bullet.bullet.faction == "Player" || KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) - KinkyDungeonDamageEnemy(enemy, bullet.bullet.damage, true, nomsg, bullet.bullet.spell, bullet, undefined, d); -} - -// Gets ID for unique bullet hits -function KDBulletID(bullet, enemy) { - if (enemy.player) - return (bullet.name) + (bullet.bullet.spell) + "_player"; - return (bullet.name) + (bullet.bullet.spell) + "_" + (enemy.id); -} - - -function KinkyDungeonLaunchBullet(x, y, targetx, targety, speed, bullet, miscast) { - let direction = (!targetx && !targety) ? 0 : Math.atan2(targety, targetx); - let vx = (targetx != 0 && targetx != undefined) ? Math.cos(direction) * speed : 0; - let vy = (targety != 0 && targety != undefined) ? Math.sin(direction) * speed : 0; - let lifetime = bullet.lifetime; - if (miscast) { - vx = 0; - vy = 0; - //lifetime = 1; - } - let b = {born: 1, time:lifetime, x:x, y:y, vx:vx, vy:vy, xx:x, yy:y, spriteID: KinkyDungeonGetEnemyID() + bullet.name + CommonTime(), bullet:bullet, trail:bullet.spell.trail, trailEffectTile: bullet.spell.effectTileTrail}; - KinkyDungeonBullets.push(b); - KinkyDungeonUpdateSingleBulletVisual(b, false); - return b; -} - -function KinkyDungeonDrawFight(canvasOffsetX, canvasOffsetY, CamX, CamY) { - for (let damage of KDDamageQueue) { - if (!damage.Delay || KDTimescale * (performance.now() - KDLastTick) > damage.Delay) { - if (damage.sfx && KDToggles.Sound) KinkyDungeonPlaySound(damage.sfx); - - if (damage.floater) { - KinkyDungeonSendFloater(damage.Entity, damage.floater, damage.Color, damage.Time); - } - - KDDamageQueue.splice(KDDamageQueue.indexOf(damage), 1); - } - } - - for (let t of KDBulletWarnings) { - let tx = t.x; - let ty = t.y; - // && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(tx, ty)) - if (tx >= CamX && ty >= CamY && tx < CamX + KinkyDungeonGridWidthDisplay && ty < CamY + KinkyDungeonGridHeightDisplay && KinkyDungeonVisionGet(tx, ty) > 0) { - KDDraw(kdgameboard, kdpixisprites, tx + "," + ty + "_w" + t.color, KinkyDungeonRootDirectory + "WarningColorSpell.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { - tint: string2hex(t.color || "#ff5555"), - zIndex: 1.31, - alpha: 0.75, - }); - KDDraw(kdgameboard, kdpixisprites, tx + "," + ty + "_w_b" + t.color, KinkyDungeonRootDirectory + "WarningBacking.png", - (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { - tint: string2hex(t.color || "#ff5555"), - zIndex: -0.2, - alpha: 0.6 - }); - } - } - - for (let bullet of KinkyDungeonBulletsVisual.values()) { - if (!bullet.delay || KDTimescale * (performance.now() - KDLastTick) > bullet.delay) { - let sprite = bullet.name; - - let dd = KinkyDungeonUpdateVisualPosition(bullet, KinkyDungeonDrawDelta); - let tx = bullet.visual_x; - let ty = bullet.visual_y; - let scale = bullet.scale != undefined ? bullet.scale : 1.0; - let alpha = bullet.alpha != undefined ? bullet.alpha : 1.0; - let aoe = bullet.aoe ? bullet.aoe : 3; - - if ((bullet.end) && dd == 0 && (!bullet.scale || bullet.scale <= 0.0)) { - KinkyDungeonBulletsVisual.delete(bullet.spriteID); - } else if (bullet.xx >= CamX && bullet.yy >= CamY && bullet.xx < CamX + KinkyDungeonGridWidthDisplay && bullet.yy < CamY + KinkyDungeonGridHeightDisplay - && (KinkyDungeonVisionGet(Math.round(tx), Math.round(ty)) > 0 || KDistChebyshev(tx - KinkyDungeonPlayerEntity.x, ty - KinkyDungeonPlayerEntity.y) < aoe) && alpha > 0) { - - if (!bullet.end && bullet.temporary && alpha >= 1.0 && scale >= 1.0) { - bullet.end = true; - } - - KDDraw(kdgameboard, kdpixisprites, bullet.spriteID, KinkyDungeonRootDirectory + "Bullets/" + sprite + ".png", - (tx - CamX + 0.5)*KinkyDungeonGridSizeDisplay, - (ty - CamY + 0.5)*KinkyDungeonGridSizeDisplay, - bullet.size*scale*KinkyDungeonGridSizeDisplay, - bullet.size*scale*KinkyDungeonGridSizeDisplay, - (!bullet.vy && !bullet.vx) ? bullet.spinAngle : bullet.spinAngle + Math.atan2(bullet.vy, bullet.vx), { - alpha : alpha, - zIndex: -0.01, - }, true); - } - bullet.delay = undefined; - } - } -} - -function KinkyDungeonSendWeaponEvent(Event, data) { - if (!KDMapHasEvent(KDEventMapWeapon, Event)) return; - if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.events) { - for (let e of KinkyDungeonPlayerDamage.events) { - if (e.trigger == Event && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { - KinkyDungeonHandleWeaponEvent(Event, e, KinkyDungeonPlayerDamage, data); - } - } - } -} - -function KinkyDungeonSendBulletEvent(Event, b, data) { - if (!KDMapHasEvent(KDEventMapBullet, Event)) return; - if (b && b.bullet && b.bullet.events) - for (let e of b.bullet.events) { - if (e.trigger == Event) { - KinkyDungeonHandleBulletEvent(Event, e, b, data); - } - } - if (b && b.bullet && b.bullet.hitevents) - for (let e of b.bullet.hitevents) { - if (e.trigger == Event) { - KinkyDungeonHandleBulletEvent(Event, e, b, data); - } - } -} - - -function KDHealRepChange(enemy, amount) { - // De-aggro an enemy if you heal them to full - if (enemy.hostile && amount > 0) { - if (enemy.hp >= enemy.Enemy.maxhp - 0.5) { - enemy.hostile = 0; - } - } else if ((!enemy.allied || enemy.allied <= 400) && amount > 0) { - // Befriend enemies if you save them - if (enemy.hp <= 0.25 * enemy.Enemy.maxhp && enemy.allied <= 400) { - enemy.allied = 400; - } else if (enemy.allied < 15) enemy.allied = 15; - } - // Raise rep based on amount - let amountRep = amount * 0.001; - if (KDHostile(enemy)) amountRep *= 0.5; - else if (KDFactionRelation("Player", KDGetFactionOriginal(enemy)) > 0.45) amountRep *= 0; - else if (KDFactionRelation("Player", KDGetFactionOriginal(enemy)) > 0.35) amountRep *= 0.25; - else if (KDFactionRelation("Player", KDGetFactionOriginal(enemy)) > 0.25) amountRep *= 0.5; - if (amountRep > 0 && !KinkyDungeonHiddenFactions.includes(KDGetFactionOriginal(enemy))) { - if (amountRep > 0.01) amountRep = 0.01; - KinkyDungeonChangeFactionRep(KDGetFactionOriginal(enemy), amountRep); - } -} - -function KDApplyGenBuffs(entity, buff, time) { - let buffs = KDBuffReference[buff]; - if (buffs && entity) { - for (let b of buffs) { - let newBuff = Object.assign({}, b); - if (newBuff && time) newBuff.duration = time; - KinkyDungeonApplyBuffToEntity(entity, newBuff); - } - } -} - -function KDSilenceEnemy(enemy, time) { - if (!enemy.silence) enemy.silence = 0; - enemy.silence = Math.max(time, enemy.silence); -} -function KDBlindEnemy(enemy, time) { - if (!enemy.blind) enemy.blind = 0; - enemy.blind = Math.max(time, enemy.blind); -} -function KDDisarmEnemy(enemy, time) { - if (!enemy.disarm) enemy.disarm = 0; - enemy.disarm = Math.max(time, enemy.disarm); -} - -let KDPrereqs = { - "NoChastity": (enemy, e, data) => {return KDEntityBuffedStat(enemy, "Chastity") < 0.01;}, - "blinded": (enemy, e, data) => {return enemy.blind > 0;}, - "silenced": (enemy, e, data) => {return enemy.silence > 0;}, - "disarmed": (enemy, e, data) => {return enemy.disarm > 0;}, - "bound": (enemy, e, data) => {return enemy.boundLevel > 0;}, - "Waiting": (enemy, e, data) => {return (enemy && !enemy.player) ? enemy.idle : KinkyDungeonLastTurnAction == "Wait";}, - "damageType": (enemy, e, data) => { - switch (e.kind) { - case "melee": return KinkyDungeonMeleeDamageTypes.includes(data.Damage?.type); - case "magic": return !KinkyDungeonMeleeDamageTypes.includes(data.Damage?.type); - } - return data.Damage?.type == 'e.kind'; - }, -}; -function KDCheckPrereq(enemy, prereq, e, data) { - if (!prereq) return true; - if (KDPrereqs[prereq]) return KDPrereqs[prereq](enemy, e, data); - return false; -} - -function KDBulletAoEMod(b) { - return b?.bullet?.aoetype || b?.bullet?.spell?.aoetype; -} -function KDBulletTrailAoEMod(b) { - return b?.bullet?.aoetypetrail || b?.bullet?.spell?.aoetypetrail; -} - -/** - * - * @param {number} bx - * @param {number} by - * @param {number} xx - * @param {number} yy - * @param {number} rad - * @param {string} modifier - */ -function AOECondition(bx, by, xx, yy, rad, modifier = "") { - switch (modifier) { - case "vert": - if (bx != xx) return false; - break; - case "horiz": - if (by != yy) return false; - break; - case "cross": - if (by != yy && bx != xx) return false; - break; - case "box": - return KDistChebyshev(bx - xx, by - yy) <= rad; - } - return KDistEuclidean(bx - xx, by - yy) <= rad; -} - -/** - * - * @param {number} xx - * @param {number} yy - * @param {string} name - */ -function KDCreateParticle(xx, yy, name) { - let newB = {born: 0, time:2, x:Math.round(xx), y:Math.round(yy), vx:0, vy:0, xx:xx, yy:yy, spriteID: KinkyDungeonGetEnemyID() + name + CommonTime(), - bullet:{faction: "Rage", spell:undefined, damage: undefined, lifetime: 2, passthrough:true, name:name, width:1, height:1}}; - KinkyDungeonBullets.push(newB); - KinkyDungeonUpdateSingleBulletVisual(newB, false); -} - -/** - * - * @param {number} x - * @param {number} y - * @param {number} aoe - * @param {any} Damage - * @param {entity} Damage - */ -function KDDealEnvironmentalDamage(x, y, aoe, Damage, Attacker) { - for (let enemy of KDNearbyEnemies(x, y, aoe)) { - KinkyDungeonDamageEnemy(enemy, Damage, true, true, undefined, undefined, Attacker, 0.1); - } - if (KinkyDungeonPlayerEntity.x == x && KinkyDungeonPlayerEntity.y == y) { - KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, Damage.type, {name: "EnvDamage", power: Damage.damage, damage: Damage.type}, undefined, KDGetFaction(Attacker), undefined); - } -} \ No newline at end of file diff --git a/Game/KinkyDungeonFurniture.js b/Game/KinkyDungeonFurniture.js deleted file mode 100644 index 89cf431a3..000000000 --- a/Game/KinkyDungeonFurniture.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; -let KDFurniture = { - "Cage": { - floor: "Floor", - sprite: "Cage", - restraintTag: "cage", - tickFunction: (delta) => { - if (!KDGameData.PrisonerState) { - let power = 0; - if (KDBoundPowerLevel >= 0.35) power = 2; - else if (KDBoundPowerLevel >= 0.1) power = 1; - if (power >= 2) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage2", type: "Sneak", duration: 1, power: 9.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "move", "cast"]}); - } else if (power >= 1) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage2", type: "Sneak", duration: 1, power: 2.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "move", "cast"]}); - } - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonCage" + power), "lightgreen", 1, true); - } - } - }, - "DisplayStand": { - floor: "Floor", - sprite: "DisplayStand", - restraintTag: "displaystand", - tickFunction: (delta) => { - if (!KDGameData.PrisonerState) { - let power = 0; - if (KDBoundPowerLevel >= 0.35) power = 2; - else if (KDBoundPowerLevel >= 0.1) power = 1; - if (power >= 2) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage2", type: "Sneak", duration: 1, power: 9.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "move", "cast"]}); - } else if (power >= 1) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage2", type: "Sneak", duration: 1, power: 2.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "move", "cast"]}); - } - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonCage" + power), "lightgreen", 1, true); - } - } - }, - "DisplayEgyptian": { - floor: "Floor", - sprite: "DisplayEgyptian", - restraintTag: "displaystand", - tickFunction: (delta) => { - if (!KDGameData.PrisonerState) { - let power = 0; - if (KDBoundPowerLevel >= 0.35) power = 2; - else if (KDBoundPowerLevel >= 0.1) power = 1; - if (power >= 2) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage2", type: "Sneak", duration: 1, power: 9.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "darkness", "move", "cast"]}); - } else if (power >= 1) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "cage2", type: "Sneak", duration: 1, power: 2.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "darkness", "move", "cast"]}); - } - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonCage" + power), "lightgreen", 1, true); - } - } - }, -}; \ No newline at end of file diff --git a/Game/KinkyDungeonGame.js b/Game/KinkyDungeonGame.js deleted file mode 100644 index 987d3560d..000000000 --- a/Game/KinkyDungeonGame.js +++ /dev/null @@ -1,4193 +0,0 @@ -"use strict"; - -let KinkyDungeonGagMumbleChance = 0.02; -let KinkyDungeonGagMumbleChancePerRestraint = 0.0025; - -let MiniGameKinkyDungeonCheckpoint = "grv"; -let MiniGameKinkyDungeonLevel = -1; -/** - * @type Record - */ -let KinkyDungeonMapIndex = {}; - -/** - * @type {number[]} - */ -let KinkyDungeonBoringness = []; - -let KinkyDungeonVisionGrid = []; -let KinkyDungeonColorGrid = []; -let KinkyDungeonShadowGrid = []; -let KinkyDungeonBrightnessGrid = []; -let KinkyDungeonFogGrid = []; -let KinkyDungeonUpdateLightGrid = true; -let KinkyDungeonGrid = ""; -let KinkyDungeonGrid_Last = ""; -let KinkyDungeonGridSize = 50; -let KinkyDungeonGridWidth = 31; -let KinkyDungeonGridHeight = 19; - -let KinkyDungeonGridSizeDisplay = 72; -let KinkyDungeonGridWidthDisplay = 2000/KinkyDungeonGridSizeDisplay;//17; -let KinkyDungeonGridHeightDisplay = 1000/KinkyDungeonGridSizeDisplay;//9; - -let KinkyDungeonMoveDirection = KinkyDungeonGetDirection(0, 0); - -let KinkyDungeonTextMessagePriority = 0; -let KinkyDungeonTextMessage = ""; -let KinkyDungeonTextMessageNoPush = false; -let KinkyDungeonTextMessageTime = 0; -let KinkyDungeonTextMessageColor = "white"; - -let KinkyDungeonActionMessagePriority = 0; -let KinkyDungeonActionMessage = ""; -let KinkyDungeonActionMessageNoPush = false; -let KinkyDungeonActionMessageTime = 0; -let KinkyDungeonActionMessageColor = "white"; - -let KinkyDungeonSpriteSize = 72; - -let KinkyDungeonCanvas = document.createElement("canvas"); -let KinkyDungeonContext = null; -let KinkyDungeonCanvasFow = document.createElement("canvas"); -let KinkyDungeonContextFow = null; -let KinkyDungeonCanvasPlayer = document.createElement("canvas"); -let KinkyDungeonContextPlayer = null; - -/** @type {entity[]} */ -let KinkyDungeonEntities = []; -let KinkyDungeonTerrain = []; - -let KinkyDungeonPOI = []; - -let KinkyDungeonMapBrightness = 5; - -let KDDefaultAvoidTiles = "gtVN@"; -let KinkyDungeonGroundTiles = "023w][?/"; -let KinkyDungeonWallTiles = "14"; -let KinkyDungeonMovableTilesEnemy = KinkyDungeonGroundTiles + "HB@lSsRrdzTgLNVt5"; // Objects which can be moved into: floors, debris, open doors, staircases -// 5 is skinned floor, you can give it whatever sprite you want -// 6 is skinned wall, you can give it whatever sprite you want -let KinkyDungeonMovableTilesSmartEnemy = "D" + KinkyDungeonMovableTilesEnemy; //Smart enemies can open doors as well -let KinkyDungeonMovableTiles = "OPCAMG$Y+=-F" + KinkyDungeonMovableTilesSmartEnemy; // Player can open chests, orbs, shrines, chargers - -let KDRandomDisallowedNeighbors = ",?/RAasSHcCHDdOoPp+FZzgtuVN"; // tiles that can't be neighboring a randomly selected point -let KDTrappableNeighbors = "DA+-F@"; // tiles that might have traps bordering them with a small chance -let KDTrappableNeighborsLikely = "COP="; // tiles that might have traps bordering them with a big chance - -let KinkyDungeonTransparentObjects = KinkyDungeonMovableTiles - .replace("D", "") - .replace("g", "") // grate - .replace("Y", "") // wall rubble - + "OoAaMmCcB@lb+=-FXu"; -let KinkyDungeonTransparentMovableObjects = KinkyDungeonMovableTiles - .replace("Z", "") // AutoDoor - .replace("D", "") // Door - .replace("g", ""); // Light does not pass thru doors or grates - -let KDOpenDoorTiles = ["DoorOpen", "DoorVertContOpen", "DoorVertOpen"]; - -/** - * @type {Record} - */ -let KinkyDungeonRandomPathablePoints = {}; -/** @type {Record} */ -let KinkyDungeonTiles = {}; -/** @type {Record>} */ -let KinkyDungeonEffectTiles = {}; -/** @type {Record} */ -let KinkyDungeonTilesMemory = {}; -/** @type {Record} */ -let KinkyDungeonTilesSkin = {}; - - - -let KinkyDungeonTargetTile = null; -let KinkyDungeonTargetTileLocation = ""; - -const KinkyDungeonBaseLockChance = 0.1; -const KinkyDungeonScalingLockChance = 0.1; // Lock chance per 6 floors. Does not affect the guaranteed locked chest each level -const KinkyDungeonBlueLockChance = -0.1; -const KinkyDungeonBlueLockChanceScaling = 0.015; // per floor -const KinkyDungeonBlueLockChanceScalingMax = 0.4; -const KinkyDungeonGoldLockChance = -0.25; // Chance that a blue lock is replaced with a gold lock -const KinkyDungeonGoldLockChanceScaling = 0.015; // per floor -const KinkyDungeonGoldLockChanceScalingMax = 0.25; -const KinkyDungeonPurpleLockChance = 0; // Chance that a red lock is replaced with a purple lock -const KinkyDungeonPurpleLockChanceScaling = 0.02; // per floor -const KinkyDungeonPurpleLockChanceScalingMax = 0.6; - -let KinkyDungeonCurrentMaxEnemies = 1; - -let KinkyDungeonNextDataSendTime = 0; -const KinkyDungeonNextDataSendTimeDelay = 500; // Send on moves every 0.5 second -let KinkyDungeonNextDataSendTimeDelayPing = 5000; // temporary ping -let KinkyDungeonNextDataSendStatsTimeDelay = 3000; // Send stats every 3s to save bandwidth -let KinkyDungeonNextDataSendStatsTime = 0; - -let KinkyDungeonNextDataLastTimeReceived = 0; -let KinkyDungeonNextDataLastTimeReceivedTimeout = 15000; // Clear data if more than 15 seconds of no data received - -let KinkyDungeonLastMoveDirection = null; -/** @type {spell} */ -let KinkyDungeonTargetingSpell = null; - -/** - * Item to decrement by 1 when spell is cast - */ -let KinkyDungeonTargetingSpellItem = null; -let KinkyDungeonTargetingSpellWeapon = null; - -/** - * Game stops when you reach this level - */ -let KinkyDungeonMaxLevel = 21; - -let KinkyDungeonLastMoveTimer = 0; -let KinkyDungeonLastMoveTimerStart = 0; -let KinkyDungeonLastMoveTimerCooldown = 175; -let KinkyDungeonLastMoveTimerCooldownStart = 50; - -let KinkyDungeonPatrolPoints = []; -let KinkyDungeonStartPosition = {x: 1, y: 1}; -let KinkyDungeonEndPosition = {x: 1, y: 1}; -let KinkyDungeonShortcutPosition = {x: 1, y: 1}; -let KinkyDungeonJailLeash = 3; -let KinkyDungeonJailLeashX = 3; - -let KinkyDungeonSaveInterval = 10; - -let KinkyDungeonSFX = []; - -/** - * - * @param {string} location - * @param {Record} value - */ -function KinkyDungeonEffectTilesSet(location, value) { - KinkyDungeonEffectTiles[location] = value; -} -/** - * - * @param {string} location - * @returns {Record} - */ -function KinkyDungeonEffectTilesGet(location) { - return KinkyDungeonEffectTiles[location]; -} - - -/** - * - * @param {string} location - * @param {any} value - */ -function KinkyDungeonTilesSet(location, value) { - KinkyDungeonTiles[location] = value; -} -/** - * - * @param {string} location - * @returns {any} - */ -function KinkyDungeonTilesGet(location) { - return KinkyDungeonTiles[location]; -} - -/** - * - * @param {string} location - */ -function KinkyDungeonTilesDelete(location) { - delete KinkyDungeonTiles[location]; -} - - -/** - * - * @param {string} location - * @param {any} value - */ -function KinkyDungeonSkinSet(location, value) { - KinkyDungeonTilesSkin[location] = value; -} -/** - * - * @param {string} location - * @returns {any} - */ -function KinkyDungeonSkinGet(location) { - return KinkyDungeonTilesSkin[location]; -} - -/** - * - * @param {string} location - */ -function KinkyDungeonSkinDelete(location) { - delete KinkyDungeonTilesSkin[location]; -} - -function KDAlreadyOpened(x, y) { - if (KDGameData.AlreadyOpened) { - for (let ao of KDGameData.AlreadyOpened) { - if (ao.x == x && ao.y == y) { - return true; - } - } - } - return false; -} - -function KinkyDungeonPlaySound(src, entity) { - if (KDToggles.Sound && !KinkyDungeonSFX.includes(src)) { - if (!entity || KinkyDungeonVisionGet(entity.x, entity.y) > 0) { - AudioPlayInstantSoundKD(src); - KinkyDungeonSFX.push(src); - } - } -} - -function KinkyDungeonSetCheckPoint(Checkpoint, AutoSave, suppressCheckPoint) { - if (Checkpoint != undefined) MiniGameKinkyDungeonCheckpoint = Checkpoint; - else if (Math.floor(MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint) == MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint) - MiniGameKinkyDungeonCheckpoint = KDDefaultJourney[Math.min(KDDefaultJourney.length - 1, Math.floor((MiniGameKinkyDungeonLevel) / KDLevelsPerCheckpoint))]; -} - -function KinkyDungeonNewGamePlus() { - KDInitializeJourney(KDGameData.Journey); - - MiniGameKinkyDungeonLevel = 1; - KinkyDungeonSetCheckPoint("grv", true); - KinkyDungeonCreateMap(KinkyDungeonMapParams.grv, 1); - KinkyDungeonNewGame += 1; - - for (let t of KDResertNGTags) { - if (KinkyDungeonFlags.has(t)) - KinkyDungeonFlags.delete(t); - } -} - -function KDResetData(Data) { - if (!Data) Data = KDGameDataBase; - KDGameData = JSON.parse(JSON.stringify( Data)); -} -function KDResetEventData(Data) { - if (!Data) Data = KDEventDataBase; - KDEventData = JSON.parse(JSON.stringify( Data)); -} - -function KinkyDungeonInitialize(Level, Load) { - - if (!afterLoaded) { - KDModsAfterLoad(); - - KinkyDungeonRefreshRestraintsCache(); - KinkyDungeonRefreshEnemiesCache(); - afterLoaded = true; - } - - KDGameData.RespawnQueue = []; - KDInitFactions(true); - CharacterReleaseTotal(KinkyDungeonPlayer); - KDResetData(); - KDResetEventData(); - //Object.assign(KDGameData, KDGameDataBase); - - KinkyDungeonRefreshRestraintsCache(); - KinkyDungeonRefreshEnemiesCache(); - KinkyDungeonRefreshOutfitCache(); - //KinkyDungeonRefreshEnemyCache(); - KinkyDungeonFlags = new Map(); - - KinkyDungeonDressSet(); - if (KinkyDungeonConfigAppearance) { - localStorage.setItem("kinkydungeonappearance", LZString.compressToBase64(CharacterAppearanceStringify(KinkyDungeonPlayer))); - KinkyDungeonConfigAppearance = false; - } - CharacterAppearanceRestore(KinkyDungeonPlayer, CharacterAppearanceStringify(KinkyDungeonPlayer)); - KinkyDungeonDressPlayer(); - KinkyDungeonDrawState = "Game"; - - KinkyDungeonMapIndex = {}; - for (let map of KDDefaultJourney) { - KinkyDungeonMapIndex[map] = map; - } - for (let map of KDDefaultAlt) { - KinkyDungeonMapIndex[map] = map; - } - - for (let e of KinkyDungeonEntities) { - KDClearItems(e); - } - KinkyDungeonEntities = []; - KDUpdateEnemyCache = true; - KinkyDungeonBullets = []; - KinkyDungeonGroundItems = []; - - KinkyDungeonTextMessage = ""; - KinkyDungeonActionMessage = ""; - MiniGameKinkyDungeonLevel = Level; - KinkyDungeonSetCheckPoint(); - - KDInitCanvas(); - - KinkyDungeonDefaultStats(Load); - - // Set up the first level - //KinkyDungeonCreateMap(KinkyDungeonMapParams[KinkyDungeonMapIndex[0]], 0); -} - -function KDInitCanvas() { - KinkyDungeonContextPlayer = KinkyDungeonCanvasPlayer.getContext("2d"); - KinkyDungeonCanvasPlayer.width = KinkyDungeonGridSizeDisplay; - KinkyDungeonCanvasPlayer.height = KinkyDungeonGridSizeDisplay; - - KinkyDungeonContext = KinkyDungeonCanvas.getContext("2d"); - KinkyDungeonCanvas.height = KinkyDungeonCanvasPlayer.height*KinkyDungeonGridHeightDisplay; - - KinkyDungeonContextFow = KinkyDungeonCanvasFow.getContext("2d"); - KinkyDungeonCanvasFow.width = KinkyDungeonCanvas.width; - KinkyDungeonCanvasFow.height = KinkyDungeonCanvas.height; -} - -function KDCreateBoringness(noBoring) { - let start = performance.now(); - // Initialize boringness array - KinkyDungeonBoringness = []; - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) - KinkyDungeonBoringness.push(0); // 0 = no boringness - } - - if (noBoring) return; - // First we find shortest path to exit - let path = KinkyDungeonFindPath(KinkyDungeonStartPosition.x, KinkyDungeonStartPosition.y, KinkyDungeonEndPosition.x, KinkyDungeonEndPosition.y, false, false, true, KinkyDungeonMovableTilesSmartEnemy, false, false, false); - - let pathLength = path ? path.length : 100; - - // Now we find the path to the start/end of every INDIVIDUAL tile - // Boringness = delta between (startLength + endLength) and (pathLength) - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y))) { - let startLength = KinkyDungeonFindPath(X, Y, KinkyDungeonStartPosition.x, KinkyDungeonStartPosition.y, false, false, true, KinkyDungeonMovableTilesSmartEnemy, false, false, false); - if (startLength) { - let endLength = KinkyDungeonFindPath(X, Y, KinkyDungeonEndPosition.x, KinkyDungeonEndPosition.y, false, false, true, KinkyDungeonMovableTilesSmartEnemy, false, false, false); - if (endLength) { - let delta = Math.abs((startLength.length + endLength.length) - pathLength); - KinkyDungeonBoringSet(X, Y, delta); - } - } - } - } - } - - console.log("Time to create Boring" + (performance.now() - start)); -} - -/** - * @returns {number} - */ -function KDGetMapSize() { - if (KinkyDungeonStatsChoice.get("MapLarge")) return 1; - if (KinkyDungeonStatsChoice.get("MapHuge")) return 2; - if (KinkyDungeonStatsChoice.get("MapGigantic")) return 3; - return 0; -} - -// Starts the the game at a specified level -/** - * - * @param {floorParams} MapParams - * @param {number} Floor - * @param {boolean} [testPlacement] - * @param {boolean} [seed] - */ -function KinkyDungeonCreateMap(MapParams, Floor, testPlacement, seed) { - for (let iterations = 0; iterations < 100; iterations++) { - KDGameData.ChestsGenerated = []; - KDPathfindingCacheFails = 0; - KDPathfindingCacheHits = 0; - KDPathCache = new Map(); - KDThoughtBubbles = new Map(); - KinkyDungeonSpecialAreas = []; - KinkyDungeonRescued = {}; - KDGameData.ChampionCurrent = 0; - KinkyDungeonAid = {}; - KDGameData.KinkyDungeonPenance = false; - KDRestraintsCache = new Map(); - KDEnemiesCache = new Map(); - KDEnemyCache = new Map(); - KinkyDungeonGrid = ""; - KinkyDungeonTiles = {}; - KinkyDungeonTilesSkin = {}; - KinkyDungeonEffectTiles = {}; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - KinkyDungeonGroundItems = []; // Clear items on the ground - KinkyDungeonBullets = []; // Clear all bullets - KDGameData.OfferFatigue = 0; - KDGameData.KeyringLocations = []; - - KinkyDungeonEndPosition = null; - KinkyDungeonShortcutPosition = null; - - KinkyDungeonPatrolPoints = []; - - if (KDGameData.JailKey == undefined) { - KDGameData.JailKey = false; - } - - KDGameData.JailPoints = []; - - KDGameData.RescueFlag = false; - - KinkyDungeonTotalSleepTurns = 0; - - KinkyDungeonFastMovePath = []; - - // These are generated before the seed as they depend on the player's restraints and rep - KinkyDungeonGenerateShop(MiniGameKinkyDungeonLevel); - let shrinefilter = KinkyDungeonGetMapShrines(MapParams.shrines); - let traptypes = MapParams.traps.concat(KinkyDungeonGetGoddessTrapTypes()); - - if (iterations == 0) { - //console.log(seed); - if (!seed) { - KDGameData.AlreadyOpened = []; - KDrandomizeSeed(true); - KDGameData.LastMapSeed = KinkyDungeonSeed; - // Reset the chase if this is a new floor - if (KDGameData.PrisonerState == "chase") { - KDGameData.PrisonerState = ""; - } - } - console.log("Map Seed: " + KinkyDungeonSeed); - KDsetSeed(KinkyDungeonSeed); - //console.log(KDRandom()); - } - - let mapMod = null; - if (KDGameData.MapMod) { - mapMod = KDMapMods[KDGameData.MapMod]; - } - - - // Create enemies first so we can spawn them in the set pieces if needed - let allies = KinkyDungeonGetAllies(); - KinkyDungeonEntities = allies; - KDUpdateEnemyCache = true; - - let altRoom = KDGameData.RoomType; - let altType = altRoom ? KinkyDungeonAltFloor((mapMod && mapMod.altRoom) ? mapMod.altRoom : altRoom) : KinkyDungeonBossFloor(Floor); - - if (altType && altType.nokeys) { - KDGameData.KeysNeeded = false; - } else KDGameData.KeysNeeded = true; - - let height = MapParams.min_height * 2 + 2*Math.floor(0.5*KDRandom() * (MapParams.max_height * 2 - MapParams.min_height * 2)); - let width = MapParams.min_width * 2 + 2*Math.floor(0.5*KDRandom() * (MapParams.max_width * 2 - MapParams.min_width * 2)); - - let mapSizeBonus = KDGetMapSize(); - - height = Math.max(2, height + mapSizeBonus); - width = Math.max(2, width + mapSizeBonus); - - if (KDTileToTest) { - altType = alts.TestTile; - width = Math.ceil(KDTileToTest.w /2) + 7; - height = Math.ceil(KDTileToTest.h /2) + 7; - - } - - - // They have to be odd for the maze generator to work - height += 1 - height % 2; - width += 1 - width % 2; - - KDStageBossGenerated = true; - let bossRules = false; - if (altType) { - bossRules = altType.bossroom; - if (bossRules) { - KinkyDungeonSetFlag("BossDialogue" + altType.name, 0); - KDStageBossGenerated = false; - } - height = altType.height; - width = altType.width; - } - KinkyDungeonSetFlag("BossUnlocked", 0); - if (altType && !bossRules && altType.nokeys) { - KinkyDungeonSetFlag("BossUnlocked", -1); - } - - KinkyDungeonCanvas.width = KinkyDungeonCanvasPlayer.width*KinkyDungeonGridWidthDisplay; - KinkyDungeonGridHeight = height; - KinkyDungeonGridWidth = width; - - - // Generate the grid - for (let X = 0; X < height; X++) { - for (let Y = 0; Y < width; Y++) - KinkyDungeonGrid = KinkyDungeonGrid + '1'; - KinkyDungeonGrid = KinkyDungeonGrid + '\n'; - } - - // We only rerender the map when the grid changes - KinkyDungeonGrid_Last = ""; - KinkyDungeonUpdateLightGrid = true; - - // Setup variables - let startpos = 1 + 2*Math.floor(KDRandom()*0.5 * (height - 2)); - if (startpos < 3) startpos = 3; // ... - if (startpos % 2 != 1) startpos += 1; // startpos MUST be odd - - - //console.log(KDRandom()); - // Use primm algorithm with modification to spawn random rooms in the maze - let openness = MapParams.openness; - let density = MapParams.density; - let hallopenness = MapParams.hallopenness ? MapParams.hallopenness : MapParams.openness; - let chargerchance = MapParams.chargerchance ? MapParams.chargerchance : 0.75; - let litchargerchance = MapParams.litchargerchance ? MapParams.litchargerchance : 0.1; - let chargercount = MapParams.chargercount ? MapParams.chargercount : 4; - let crackchance = MapParams.crackchance; - let barchance = MapParams.barchance; - let treasurechance = 1.0; // Chance for an extra locked chest - let treasurecount = MapParams.chestcount; // Max treasure chest count - //if (KDGameData.KinkyDungeonSpawnJailers > 0) treasurecount = 0; - let shrinechance = MapParams.shrinechance; // Chance for an extra shrine - let ghostchance = MapParams.ghostchance; // Chance for a ghost - let manaChance = MapParams.manaChance ? MapParams.manaChance : 0.3; - let shrinecount = MapParams.shrinecount; // Max treasure chest count - let rubblechance = MapParams.rubblechance; // Chance of lootable rubble - if (KinkyDungeonStatsChoice.get("Pristine")) rubblechance = 0; - //if (KinkyDungeonGoddessRep.Prisoner && KDGameData.KinkyDungeonSpawnJailers > 0) doorlockchance = doorlockchance + (KDGameData.KinkyDungeonSpawnJailers / KDGameData.KinkyDungeonSpawnJailersMax) * (1.0 - doorlockchance) * (KinkyDungeonGoddessRep.Prisoner + 50)/100; - let trapChance = MapParams.trapchance; // Chance of a pathway being split between a trap and a door - let doorlocktrapchance = MapParams.doorlocktrapchance ? MapParams.doorlocktrapchance : MapParams.trapchance; - let minortrapChance = MapParams.minortrapChance ? MapParams.minortrapChance : trapChance/3; - // Door algorithm is defunct - //let grateChance = MapParams.grateChance; - let gasChance = (MapParams.gaschance && KDRandom() < MapParams.gaschance) ? (MapParams.gasdensity ? MapParams.gasdensity : 0) : 0; - let gasType = MapParams.gastype ? MapParams.gastype : 0; - let brickchance = MapParams.brickchance; // Chance for brickwork to start being placed - let wallRubblechance = MapParams.wallRubblechance ? MapParams.wallRubblechance : 0; - let barrelChance = MapParams.barrelChance ? MapParams.barrelChance : 0.045; - let foodChance = MapParams.foodChance ? MapParams.foodChance : 0.2; - let cageChance = MapParams.cageChance ? MapParams.cageChance : 0.25; - let wallhookchance = MapParams.wallhookchance ? MapParams.wallhookchance : 0.025; - let ceilinghookchance = MapParams.ceilinghookchance ? MapParams.ceilinghookchance : 0.03; - let torchchance = MapParams.torchchance ? MapParams.torchchance : 0.35; - let torchlitchance = MapParams.torchlitchance ? MapParams.torchlitchance : 0.75; - let torchchanceboring = MapParams.torchchanceboring ? MapParams.torchchanceboring : 0.85; - let torchreplace = (altType && altType.torchreplace) ? altType.torchreplace : (MapParams.torchreplace ? MapParams.torchreplace : null); - let factionList = MapParams.factionList; - - //console.log(KDRandom()); - let shrineTypes = []; - let shrinelist = []; - let chargerlist = []; - let chestlist = []; - let startTime = performance.now(); - let genType = !altType ? "TileMaze" : altType.genType; - - // MAP GENERATION - - let VisitedRooms = []; - - KinkyDungeonStartPosition = {x: 1, y: startpos * 2}; - - KinkyDungeonMapSet(1, startpos, '0', VisitedRooms); - - KinkyDungeonPOI = []; - let POI = KinkyDungeonPOI; - - - // Place the player! - KinkyDungeonPlayerEntity = {MemberNumber:Player.MemberNumber, x: KinkyDungeonStartPosition.x, y:KinkyDungeonStartPosition.y, player:true}; - - - let traps = []; - - let spawnPoints = []; - - let data = { - params: MapParams, - chestlist: chestlist, - traps: traps, - shrinelist: shrinelist, - chargerlist: chargerlist, - spawnpoints: spawnPoints, - notraps: altType?.notraps, - }; - - KinkyDungeonCreateMapGenType[genType](POI, VisitedRooms, width, height, openness, density, hallopenness, data); - - //console.log(KDRandom()); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for maze creation`); - startTime = performance.now(); - } - width = KinkyDungeonGridWidth; - height = KinkyDungeonGridHeight; - - KinkyDungeonResetFog(); - - KinkyDungeonPlayerEntity.x = KinkyDungeonStartPosition.x; - KinkyDungeonPlayerEntity.y = KinkyDungeonStartPosition.y; - - - if (!altType || !altType.noWear) - KinkyDungeonReplaceDoodads(crackchance, barchance, wallRubblechance, wallhookchance, ceilinghookchance, width, height, altType); // Replace random internal walls with doodads - //console.log(KDRandom()); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for doodad creation`); - startTime = performance.now(); - } - KinkyDungeonPlaceStairs(KinkyDungeonGetMainPath(Floor, altType), KinkyDungeonStartPosition.y, width, height, altType && altType.nostairs, altType && altType.nostartstairs); // Place the start and end locations - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for stair creation`); - startTime = performance.now(); - } - - let noBoring = altType?.noboring; - - // Now we create the boringness matrix - KDCreateBoringness(noBoring); - - KinkyDungeonPlaceSetPieces(POI, traps, chestlist, shrinelist, chargerlist, spawnPoints, false, width, height); - - if (!((KinkyDungeonNearestJailPoint(1, 1) || (altType && altType.nojail)) && (!altType || KDStageBossGenerated || !bossRules))) { - console.log("This map failed to generate! Please screenshot and send your save code to Ada on deviantart or discord!"); - continue; - } - - if (altType && !altType.noFurniture) - KinkyDungeonPlaceFurniture(barrelChance, cageChance, width, height, altType); // Replace random internal walls with doodads - - if (altType && !altType.noFood) - KinkyDungeonPlaceFood(foodChance, width, height, altType); // Replace random internal walls with doodads - - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for setpiece generation`); - startTime = performance.now(); - } - // Recreate boringness - KDCreateBoringness(noBoring); - - if (!testPlacement) { - if (!altType || altType.shortcut) - KinkyDungeonPlaceShortcut(KinkyDungeonGetShortcut(Floor, altType), width, height); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for shortcut creation`); - startTime = performance.now(); - } - if (!altType || altType.chests) - KinkyDungeonPlaceChests(chestlist, shrinelist, treasurechance, treasurecount, rubblechance, Floor, width, height); // Place treasure chests inside dead ends - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for chest creation`); - startTime = performance.now(); - } - let traps2 = [];//KinkyDungeonPlaceDoors(doorchance, nodoorchance, doorlockchance, trapChance, grateChance, Floor, width, height); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for door creation`); - startTime = performance.now(); - } - for (let t of traps2) { - traps.push(t); - } - - if (altType && !altType.notorches) - KinkyDungeonPlaceTorches(torchchance, torchlitchance, torchchanceboring, width, height, altType, torchreplace); - - // Recreate boringness - KDCreateBoringness(noBoring); - let orbcount = Math.min(2, Math.max(2 * (MiniGameKinkyDungeonLevel + KinkyDungeonNewGame*KinkyDungeonMaxLevel) - KDGameData.CollectedOrbs, 0)); - if (altType && altType.orbs != undefined) orbcount = altType.orbs; - if (!altType || altType.shrines) - KinkyDungeonPlaceShrines(chestlist, shrinelist, shrinechance, shrineTypes, shrinecount, shrinefilter, ghostchance, manaChance, orbcount, (altType && altType.noShrineTypes) ? altType.noShrineTypes : [], Floor, width, height); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for shrine creation`); - startTime = performance.now(); - } - if (!altType || altType.chargers) - KinkyDungeonPlaceChargers(chargerlist, chargerchance, litchargerchance, chargercount, Floor, width, height); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for charger creation`); - startTime = performance.now(); - } - if (!altType || altType.nobrick) - KinkyDungeonPlaceBrickwork(brickchance, Floor, width, height); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for brickwork creation`); - startTime = performance.now(); - } - if (!altType || !altType.notraps) - KinkyDungeonPlaceTraps(traps, traptypes, minortrapChance, doorlocktrapchance, Floor, width, height); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for trap creation`); - startTime = performance.now(); - } - if (!altType || !altType.nopatrols) - KinkyDungeonPlacePatrols(4, width, height); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for patrol point creation`); - startTime = performance.now(); - } - - if ((!altType || !altType.nolore)) - KinkyDungeonPlaceLore(width, height); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for lore creation`); - startTime = performance.now(); - } - if ((!altType || altType.heart) && KDGameData.CollectedHearts < (MiniGameKinkyDungeonLevel + KinkyDungeonMaxLevel*KinkyDungeonNewGame)) { - KinkyDungeonPlaceHeart(width, height, Floor); - } - if (!altType || altType.specialtiles) - KinkyDungeonPlaceSpecialTiles(gasChance, gasType, Floor, width, height); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for special tile creation`); - startTime = performance.now(); - } - KinkyDungeonGenNavMap(); - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for navmap creation`); - startTime = performance.now(); - } - - KinkyDungeonUpdateStats(0); - - let tags = Object.assign([], MapParams.enemyTags); - if (mapMod && mapMod.tags) { - // Add in any mapmod tags - for (let t of mapMod.tags) { - if (!tags.includes(t)) - tags.push(t); - } - } - - KDGameData.JailFaction = []; - if (mapMod?.jailType) KDGameData.JailFaction.push(mapMod.jailType); - else if (altType?.jailType) KDGameData.JailFaction.push(altType.jailType); - - KDGameData.GuardFaction = []; - if (mapMod?.guardType) KDGameData.GuardFaction.push(mapMod.guardType); - else if (altType?.guardType) KDGameData.GuardFaction.push(mapMod.guardType); - - // Place enemies after player - if (!altType || altType.enemies) { - let bonus = (mapMod && mapMod.bonusTags) ? mapMod.bonusTags : undefined; - if (altType && altType.bonusTags) { - if (!bonus) bonus = altType.bonusTags; - else bonus = Object.assign(Object.assign(Object.assign({}, bonus)), altType.bonusTags); - } - KinkyDungeonPlaceEnemies(spawnPoints, false, tags, bonus, Floor, width, height, altRoom, - factionList); - } - if (KDDebug) { - console.log(`${performance.now() - startTime} ms for enemy creation`); - startTime = performance.now(); - } - - if (MapParams.worldGenCode) MapParams.worldGenCode(); - - KinkyDungeonReplaceVert(width, height); - } - - if (KDGameData.PrisonerState == 'jail' && seed) { - // The above condition is the condition to start in jail - // We move the player to the jail after generating one - let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - if (nearestJail) { - - KDMovePlayer(nearestJail.x, nearestJail.y, false); - KDLockNearbyJailDoors(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - } - } - - if (KDGameData.KinkyDungeonSpawnJailers > 0) KDGameData.KinkyDungeonSpawnJailers -= 1; - if (KDGameData.KinkyDungeonSpawnJailers > 3 && KDGameData.KinkyDungeonSpawnJailers < KDGameData.KinkyDungeonSpawnJailersMax - 1) KDGameData.KinkyDungeonSpawnJailers -= 1; // Reduce twice as fast when you are in deep... - - // Set map brightness - KinkyDungeonMapBrightness = MapParams.brightness; - KinkyDungeonMakeGhostDecision(); - - // Place the jail keys AFTER making the map! - KinkyDungeonLoseJailKeys(false, bossRules); // if (!KDGameData.JailKey || (KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail') || boss) - - if (KDTileToTest || (KinkyDungeonNearestJailPoint(1, 1) || (altType && altType.nojail)) && (!altType || KDStageBossGenerated || !bossRules) - && KinkyDungeonFindPath(KinkyDungeonStartPosition.x, KinkyDungeonStartPosition.y, KinkyDungeonEndPosition.x, KinkyDungeonEndPosition.y, false, false, true, KinkyDungeonMovableTilesSmartEnemy, - false, false, false, undefined, false).length > 0) iterations = 100000; - else console.log("This map failed to generate! Please screenshot and send your save code to Ada on deviantart or discord!"); - - if (iterations == 100000) { - if (!KinkyDungeonMapIndex[KDGameData.MainPath] || !KinkyDungeonMapIndex[KDGameData.ShortcutPath]) - KDInitializeJourney(KDGameData.Journey); - - KinkyDungeonSendEvent("postMapgen", {}); - - KDQuestTick(KDGameData.Quests); - if (altType && altType.tickFlags) - KinkyDungeonSendEvent("tickFlags", {delta: 1}); - KinkyDungeonSendEvent("postQuest", {}); - - for (let e of KinkyDungeonGetAllies()) { - KDMoveEntity(e, KinkyDungeonStartPosition.x, KinkyDungeonStartPosition.y, false,undefined, undefined, true); - e.visual_x = KinkyDungeonStartPosition.x; - e.visual_y = KinkyDungeonStartPosition.y; - } - - KinkyDungeonAdvanceTime(0); - } - } - - KDTileToTest = null; - KDPathCache = new Map(); - KDPathCacheIgnoreLocks = new Map(); -} - -let KDStageBossGenerated = false; - -/** - * Creates a list of all tiles accessible and not hidden by doors - */ -function KinkyDungeonGenNavMap() { - KinkyDungeonRandomPathablePoints = {}; - let accessible = KinkyDungeonGetAccessible(KinkyDungeonEndPosition.x, KinkyDungeonEndPosition.y); - for (let a of Object.entries(accessible)) { - let X = a[1].x; - let Y = a[1].y; - let tags = []; - if (!KinkyDungeonTilesGet(a[0]) || !KinkyDungeonTilesGet(a[0]).OffLimits) - KinkyDungeonRandomPathablePoints[a[0]] = {x: X, y:Y, tags:tags}; - } -} - -// Checks everything that is accessible to the player -function KinkyDungeonGetAccessible(startX, startY, testX, testY) { - let tempGrid = {}; - let checkGrid = {}; - checkGrid[(startX + "," + startY)] = {x: startX, y: startY}; - while (Object.entries(checkGrid).length > 0) { - for (let g of Object.entries(checkGrid)) { - let X = g[1].x; - let Y = g[1].y; - for (let XX = -1; XX <= 1; XX++) - for (let YY = -1; YY <= 1; YY++) { - let testLoc = ((X+XX) + "," + (Y+YY)); - let locked = (testX != undefined && testY != undefined && X+XX == testX && Y+YY == testY) - || (KinkyDungeonTilesGet("" + (X+XX) + "," + (Y+YY)) && KinkyDungeonTilesGet("" + (X+XX) + "," + (Y+YY)).Lock); - if (!checkGrid[testLoc] && !tempGrid[testLoc] && X+XX > 0 && X+XX < KinkyDungeonGridWidth-1 && Y+YY > 0 && Y+YY < KinkyDungeonGridHeight-1 - && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(X+XX, Y+YY)) && !locked) { - checkGrid[testLoc] = {x:X+XX,y:Y+YY}; - tempGrid[testLoc] = {x:X+XX,y:Y+YY}; - } - } - - delete checkGrid[g[0]]; - } - } - - return tempGrid; -} - -// Checks everything that is accessible to the player, treating all doors as walls -function KinkyDungeonGetAccessibleRoom(startX, startY) { - let tempGrid = {}; - let checkGrid = {}; - checkGrid[startX + "," + startY] = {x: startX, y: startY}; - while (Object.entries(checkGrid).length > 0) { - for (let g of Object.entries(checkGrid)) { - for (let XX = -1; XX <= 1; XX++) - for (let YY = -1; YY <= 1; YY++) { - let test = ((g[1].x+XX) + "," + (g[1].y+YY)); - let Tiles = KinkyDungeonMovableTiles.replace("D", "").replace("d", ""); - if (!checkGrid[test] && !tempGrid[test] && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(g[1].x+XX, g[1].y+YY))) { - if (Tiles.includes(KinkyDungeonMapGet(g[1].x+XX, g[1].y+YY))) - checkGrid[test] = {x: g[1].x+XX, y:g[1].y+YY}; - tempGrid[test] = true; - } - } - - delete checkGrid[g[0]]; - } - } - - return Object.keys(tempGrid); -} - -// Tests if the player can reach the end stair even if the test spot is blocked -function KinkyDungeonIsAccessible(testX, testY) { - let accessible = KinkyDungeonGetAccessible(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, testX, testY); - for (let a of Object.entries(accessible)) { - let X = a[1].x; - let Y = a[1].y; - if (KinkyDungeonMapGet(X, Y) == 's') return true; - } - return false; -} - -// Tests if the player can reach the spot from the start point -function KinkyDungeonIsReachable(testX, testY, testLockX, testLockY) { - let accessible = KinkyDungeonGetAccessible(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, testLockX, testLockY); - for (let a of Object.entries(accessible)) { - let X = a[1].x; - let Y = a[1].y; - if (X == testX && Y == testY) return true; - } - return false; -} - -function KinkyDungeonGetAllies() { - let temp = []; - for (let e of KinkyDungeonEntities) { - if (e.Enemy && e.Enemy.keepLevel) { - KDMoveEntity(e, KinkyDungeonStartPosition.x, KinkyDungeonStartPosition.y, false,undefined, undefined, true); - e.visual_x = KinkyDungeonStartPosition.x; - e.visual_y = KinkyDungeonStartPosition.y; - temp.push(e); - } - } - - return temp; -} - -// @ts-ignore -// @ts-ignore -function KinkyDungeonPlaceEnemies(spawnPoints, InJail, Tags, BonusTags, Floor, width, height, altRoom, factionList) { - KinkyDungeonHuntDownPlayer = false; - KinkyDungeonFirstSpawn = true; - KinkyDungeonSearchTimer = 0; - - let enemyCount = 8 + Math.floor(Math.sqrt(Floor) + width/16 + height/16 + KinkyDungeonDifficulty/7); - if (KinkyDungeonStatsChoice.get("Stealthy")) enemyCount = Math.round(enemyCount * KDStealthyEnemyCountMult); - let neutralCount = 0.4 * enemyCount; - if (KDTileToTest) { - enemyCount = 1; - } - let count = 0; - let ncount = 0; - let tries = 0; - let miniboss = false; - let boss = false; - let jailerCount = 0; - let EnemyNames = []; - - if (altRoom) { - if (altRoom.enemyMult) { - enemyCount *= altRoom.enemyMult; - neutralCount *= altRoom.enemyMult; - } - } - - // Determine factions to spawn - let factions = factionList || Object.keys(KinkyDungeonFactionTag); - let primaryFaction = factions[Math.floor(KDRandom() * factions.length)]; - let randomFactions = [ - primaryFaction - ]; - - // Add up to one friend of the faction and one enemy - let allyCandidates = []; - for (let f of factions) { - if (KDFactionRelation(primaryFaction, f) > 0.2) allyCandidates.push(f); - } - let enemyCandidates = []; - for (let f of factions) { - if (KDFactionRelation(primaryFaction, f) < -0.2) enemyCandidates.push(f); - } - - let factionAllied = allyCandidates.length > 0 ? allyCandidates[Math.floor(KDRandom() * allyCandidates.length)] : ""; - let factionEnemy = enemyCandidates.length > 0 ? enemyCandidates[Math.floor(KDRandom() * enemyCandidates.length)] : ""; - - if (factionAllied) randomFactions.push(factionAllied); - if (factionEnemy) randomFactions.push(factionEnemy); - - KDGameData.JailFaction.push(primaryFaction); - KDGameData.GuardFaction.push(primaryFaction); - if (factionAllied) { - KDGameData.GuardFaction.push(factionAllied); - } - - console.log(randomFactions[0] + "," + randomFactions[1] + "," + randomFactions[2]); - - // These tags are disallowed unless working in the specific box - let filterTags = ["boss", "miniboss", "elite", "minor"]; - let filterTagsCluster = ["boss", "miniboss"]; - - let spawnBoxes = [ - {requiredTags: ["boss"], tags: [], currentCount: 0, maxCount: 0.025}, - {requiredTags: ["miniboss"], tags: [], currentCount: 0, maxCount: 0.075}, - {requiredTags: ["elite"], tags: [], currentCount: 0, maxCount: 0.15}, - {requiredTags: ["minor"], tags: [], currentCount: 0, maxCount: 0.1}, - ]; - if (KDGameData.MapMod) { - let mapMod = KDMapMods[KDGameData.MapMod]; - if (mapMod && mapMod.spawnBoxes) { - for (let m of mapMod.spawnBoxes) { - spawnBoxes.unshift(Object.assign({}, m)); - } - } - } else { - for (let rf of randomFactions) { - spawnBoxes.push({requiredTags: [KinkyDungeonFactionTag[rf]], filterTags: ["boss", "miniboss"], tags: [KinkyDungeonFactionTag[rf]], currentCount: 0, maxCount: 0.15, bias: rf == factionEnemy ? 2 : 1}); - spawnBoxes.push({requiredTags: ["miniboss", KinkyDungeonFactionTag[rf]], tags: [KinkyDungeonFactionTag[rf]], currentCount: 0, maxCount: 0.1, bias: rf == factionEnemy ? 2 : 1}); - spawnBoxes.push({requiredTags: ["boss", KinkyDungeonFactionTag[rf]], tags: [KinkyDungeonFactionTag[rf]], currentCount: 0, maxCount: 0.01, bias: rf == factionEnemy ? 2 : 1}); - } - } - - let currentCluster = null; - - let spawns = []; - for (let sp of spawnPoints) { - spawns.push(sp); - } - - let enemyPoints = []; - - // Create a quasirandom distribution - // This is to get the enemies more spread out - // Higher dd = more spread out - let dd = 3.5; - for (let X = 1; X < width - 1.01 - dd; X += dd) - for (let Y = 1; Y < width - 1.01 - dd; Y += dd) { - enemyPoints.push({x: Math.round(X + KDRandom() * dd), y: Math.round(Y + KDRandom() * dd)}); - } - - let eep = []; - // Shuffle - while (enemyPoints.length > 0) { - let index = Math.floor(KDRandom() * enemyPoints.length); - eep.push(enemyPoints[index]); - enemyPoints.splice(index, 1); - } - - // Sort so that smaller rooms are prioritized - enemyPoints.sort((a, b) => { - let sizea = KinkyDungeonGetAccessibleRoom(a.x, a.y).length; - let sizeb = KinkyDungeonGetAccessibleRoom(b.x, b.y).length; - return sizeb - sizea; - - }); - - let culledSpawns = false; - // Create this number of enemies - while (((count < enemyCount) || (spawns.length > 0)) && tries < 10000) { - if (count >= enemyCount && !culledSpawns) { - spawns = spawns.filter((spawn) => { - return spawn.force; - }); - culledSpawns = true; - if (spawns.length == 0) break; - } - - let pointIndex = Math.floor(KDRandom() * 0.5 * enemyPoints.length); - let point = enemyPoints[pointIndex]; - let X = point ? point.x : (1 + Math.floor(KDRandom()*(width - 1))); - let Y = point ? point.y : (1 + Math.floor(KDRandom()*(height - 1))); - - - - if (point && KinkyDungeonBoringGet(X, Y) > 0 && KDRandom() < 0.5) { - continue; - // Half of all enemies will be placed along the main path - } - - if (point) { - enemyPoints.splice(pointIndex); - } - - let required = []; - let spawnPoint = false; - let AI = undefined; - let faction = undefined; - let tags = []; - - if (currentCluster && !(3 * KDRandom() < currentCluster.count)) { - required.push(currentCluster.required); - X = currentCluster.x - 2 + Math.floor(KDRandom() * 5); - Y = currentCluster.y - 2 + Math.floor(KDRandom() * 5); - - if (!KinkyDungeonCheckPath(currentCluster.x, currentCluster.y, X, Y, false, true)) { - if (5 * KDRandom() < currentCluster.count) currentCluster = null; - continue; - } - } else { - currentCluster = null; - if (spawns.length > 0 && KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(spawns[0].x, spawns[0].y))) { - spawnPoint = true; - let specific = false; - if (spawns[0].required) { - required = Object.assign([], spawns[0].required); - for (let t of required) { - if (filterTags.includes(t)) filterTags.splice(filterTags.indexOf(t), 1); - } - } - - if (spawns[0].tags) { - specific = true; - tags = spawns[0].tags; - for (let t of tags) { - if (filterTags.includes(t)) filterTags.splice(filterTags.indexOf(t), 1); - } - } - - if (spawns[0].ftags) { - for (let t of spawns[0].ftags) { - filterTags.push(t); - } - } - - if (!specific) { - tags.push(randomFactions[Math.floor(randomFactions.length * KDRandom())]); - } - X = spawns[0].x; - Y = spawns[0].y; - AI = spawns[0].AI; - faction = spawns[0].faction; - spawns.splice(0, 1); - } - } - - let playerDist = 6; - let PlayerEntity = KinkyDungeonStartPosition; - - let spawnBox_filter = spawnBoxes.filter((bb) => { - return bb.currentCount < bb.maxCount * enemyCount && (!bb.bias - // This part places allied faction toward the center of the map and enemy faction around the edges - || (bb.bias == 1 && X > width * 0.25 && X < width * 0.75 && Y > height * 0.25 && Y < height * 0.75) - || (bb.bias == 2 && (X < width * 0.25 || X > width * 0.75) && (Y < height * 0.25 || Y > height * 0.75)) - ); - }); - let box = null; - if (spawnBox_filter.length > 0) { - box = spawnBox_filter[Math.floor(KDRandom() * spawnBox_filter.length)]; - } - - if (box && (!spawnPoint || box.addToSpawn) && !currentCluster) { - if (!spawnPoint) { - for (let rtag of box.requiredTags) { - if (filterTags.includes(rtag)) filterTags.splice(filterTags.indexOf(rtag), 1); - required.push(rtag); - } - if (box.filterTags) - for (let ftag of box.filterTags) { - if (!filterTags.includes(ftag)) filterTags.push(ftag); - } - } - for (let tag of box.tags) { - if (filterTags.includes(tag)) filterTags.splice(filterTags.indexOf(tag), 1); - tags.push(tag); - } - } else { - box = null; - } - - if ((spawnPoint && KinkyDungeonNoEnemy(X, Y, true)) || ((!KinkyDungeonTilesGet("" + X + "," + Y) || !KinkyDungeonTilesGet("" + X + "," + Y).OffLimits) - && Math.sqrt((X - PlayerEntity.x) * (X - PlayerEntity.x) + (Y - PlayerEntity.y) * (Y - PlayerEntity.y)) > playerDist && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y)) - && KinkyDungeonNoEnemy(X, Y, true) && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits))) { - - if (KDGameData.KinkyDungeonSpawnJailers > 0 && jailerCount < KDGameData.KinkyDungeonSpawnJailersMax) tags.push("jailer"); - if (KinkyDungeonMapGet(X, Y) == 'R' || KinkyDungeonMapGet(X, Y) == 'r') tags.push("rubble"); - if (KinkyDungeonMapGet(X, Y) == 'D' || KinkyDungeonMapGet(X, Y) == 'd') tags.push("door"); - if (KinkyDungeonMapGet(X, Y) == 'g') tags.push("grate"); - if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y+1)) && !KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y-1))) tags.push("passage"); - else if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X+1, Y)) && !KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X-1, Y))) tags.push("passage"); - else if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X+1, Y+1)) - && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X+1, Y-1)) - && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X-1, Y+1)) - && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X-1, Y-1))) tags.push("open"); - - for (let XX = X-1; XX <= X+1; XX += 1) - for (let YY = Y-1; YY <= Y+1; YY += 1) - if (!(XX == X && YY == Y)) { - if (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X') tags.push("adjWall"); - if (KinkyDungeonMapGet(XX, YY) == 'D' || KinkyDungeonMapGet(XX, YY) == 'd') tags.push("adjDoor"); - if (KinkyDungeonMapGet(XX, YY) == 'D') tags.push("adjClosedDoor"); - if (KinkyDungeonMapGet(XX, YY) == 'c' || KinkyDungeonMapGet(XX, YY) == 'C') tags.push("adjChest"); - if (KinkyDungeonMapGet(XX, YY) == 'r' || KinkyDungeonMapGet(XX, YY) == 'R') tags.push("adjRubble"); - - } - - if (miniboss) tags.push("miniboss"); - if (boss) tags.push("boss"); - - KinkyDungeonAddTags(tags, Floor); - for (let t of Tags) { - tags.push(t); - } - if (randomFactions.length > 0 && !box && !currentCluster && !spawnPoint) - tags.push(randomFactions[Math.floor(randomFactions.length * KDRandom())]); - if (required.length == 0) required = undefined; - let Enemy = KinkyDungeonGetEnemy( - tags, - Floor + KinkyDungeonDifficulty/5, - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - KinkyDungeonMapGet(X, Y), - required, - ncount > neutralCount && (!box || !box.ignoreAllyCount), - BonusTags, - currentCluster ? filterTagsCluster : filterTags); - if (box && !Enemy) { - box.currentCount += 0.05; - } - if (Enemy && (!InJail || (Enemy.tags.jailer || Enemy.tags.jail || Enemy.tags.leashing))) { - let e = {Enemy: Enemy, id: KinkyDungeonGetEnemyID(), x:X, y:Y, hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0, AI: AI, faction: faction}; - KDAddEntity(e); - // Give it a custom name, 5% chance - KDProcessCustomPatron(Enemy, e); - let incrementCount = 1; - KinkyDungeonSetEnemyFlag(e, "NoFollow", -1); - let shop = KinkyDungeonGetShopForEnemy(e, false); - if (shop) { - KinkyDungeonSetEnemyFlag(e, "Shop", -1); - KinkyDungeonSetEnemyFlag(e, shop, -1); - } - let loadout = KinkyDungeonGetLoadoutForEnemy(e, false); - KDSetLoadout(e, loadout); - - if (!spawnPoint && !currentCluster && Enemy.clusterWith) { - let clusterChance = 0.5; //1.1 + 0.9 * MiniGameKinkyDungeonLevel/KinkyDungeonMaxLevel; - if (Enemy.tags.boss) clusterChance = 0; - else if (Enemy.tags.miniboss) clusterChance = 0; - else if (Enemy.tags.elite) clusterChance = 0.15; - //else if (Enemy.tags.elite || Enemy.tags.miniboss) clusterChance *= 0.6; - if (KDRandom() < clusterChance) - currentCluster = { - x : X, - y : Y, - required: Enemy.clusterWith, - count: 1, - AI: Enemy.guardChance && KDRandom() < Enemy.guardChance ? "looseguard" : undefined, - }; - } else if (currentCluster) currentCluster.count += 1; - if (!currentCluster && Enemy.guardChance && KDRandom() < Enemy.guardChance) { - e.AI = "looseguard"; - } else if (currentCluster && currentCluster.AI) e.AI = currentCluster.AI; - if (Enemy.tags.mimicBlock && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y))) KinkyDungeonMapSet(X, Y, '3'); - if (Enemy.tags.minor) incrementCount = 0.2; else incrementCount = currentCluster ? 0.5 : 1.0; // Minor enemies count as 1/5th of an enemy - if (Enemy.difficulty) incrementCount += Enemy.difficulty; - if (Enemy.tags.boss) { - //boss = true; - } - else if (Enemy.tags.miniboss) miniboss = true; // Adds miniboss as a tag - if (Enemy.tags.removeDoorSpawn && KinkyDungeonMapGet(X, Y) == "d") { - KinkyDungeonMapSet(X, Y, '0'); - KinkyDungeonTilesDelete(X + "," + Y); - } - if (Enemy.tags.jailer) jailerCount += 1; - - if (Enemy.summon) { - for (let sum of Enemy.summon) { - if (!sum.chance || KDRandom() < sum.chance) - KinkyDungeonSummonEnemy(X, Y, sum.enemy, sum.count, sum.range, sum.strict); - } - } - if (incrementCount) count += spawnPoint ? 0.025 : incrementCount; - if (!spawnPoint && box) - box.currentCount += incrementCount; - if (KDFactionRelation("Player", KDGetFaction(e)) > -0.5) { - ncount += 1; - } - EnemyNames.push(Enemy.name + `_${box?`box-${box.requiredTags}, ${box.tags}`:""},${currentCluster?"cluster":""},${spawnPoint}`); - } - } - tries += 1; - } - console.log(EnemyNames); - - KinkyDungeonCurrentMaxEnemies = KinkyDungeonEntities.length; -} - -let KinkyDungeonSpecialAreas = []; - -function KinkyDungeonGetClosestSpecialAreaDist(x ,y) { - let minDist = 10000; - for (let area of KinkyDungeonSpecialAreas) { - let dist = KDistChebyshev(x - area.x, y - area.y) - area.radius; - if (dist < minDist) minDist = dist; - } - - return minDist; -} - -// Type 0: empty border, hollow -// Type 1: hollow, no empty border -// Type 2: only empty space -// Type 3: completely filled -function KinkyDungeonCreateRectangle(Left, Top, Width, Height, Border, Fill, Padding, OffLimits, NoWander, flexCorner, Jail) { - let pad = Padding ? Padding : 0; - let borderType = (Border) ? '1' : '0'; - let fillType = (Fill) ? '1' : '0'; - for (let X = -pad; X < Width + pad; X++) - for (let Y = - pad; Y < Height + pad; Y++) { - if (X + Left < KinkyDungeonGridWidth-1 && Y + Top < KinkyDungeonGridHeight-1 && X + Left > 0 && Y + Top > 0) { - let setTo = ""; - let offlimit = true; - if (X < 0 || Y < 0 || X >= Width || Y >= Height) { - setTo = '0'; - offlimit = false; - } else { - if (X == 0 || X == Width - 1 || Y == 0 || Y == Height-1) { - setTo = borderType; - } else setTo = fillType; - } - if (setTo != "" && KinkyDungeonMapGet(Left + X, Top + Y) != "s") { - KinkyDungeonMapSet(Left + X, Top + Y, setTo); - delete KinkyDungeonEffectTiles[(Left + X) + "," + (Top + Y)]; - if (offlimit && (OffLimits || Jail || NoWander)) { - KinkyDungeonTilesSet((Left + X) + "," + (Top + Y), {OffLimits: OffLimits, Jail: Jail, NoWander: NoWander}); - } - } - } - - - /* - if ((X == cellWidth || X == 0) && (Y > KinkyDungeonStartPosition.y - cellHeight && Y < KinkyDungeonStartPosition.y + cellHeight)) { - wall = true; - if (KDRandom() < barchance) bar = true; - } - if (Y == KinkyDungeonStartPosition.y - cellHeight && X <= cellWidth || Y == KinkyDungeonStartPosition.y + cellHeight && X <= cellWidth) { - wall = true; - if (KDRandom() < grateChance/(grateCount*3) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(X, Y+1)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(X, Y-1))) grate = true; - } - if (X == cellWidth && Y == KinkyDungeonStartPosition.y) { - wall = false; - door = true; - } - if (door) { - KinkyDungeonMapSet(X, Y, 'D'); - KinkyDungeonTilesGet(X + "," + Y] = {Type: "Door"}; - if (lock) KinkyDungeonTilesGet(X + "," + Y].Lock = lock; - } else if (wall) { - if (bar) - KinkyDungeonMapSet(X, Y, 'b'); - else if (grate) { - KinkyDungeonMapSet(X, Y, 'g'); - grateCount += 1; - } else - KinkyDungeonMapSet(X, Y, '1'); - } else KinkyDungeonMapSet(X, Y, '0');*/ - } - - if (flexCorner) { - // flexCorner is a feature to place doodads to avoid unnecessary passageways into other tiles - if (!KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad - 1, Top -pad)) - && !KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad, Top -pad - 1)) - && KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad - 1, Top -pad - 1))) { - KinkyDungeonMapSet(Left -pad, Top -pad, 'X'); - } - if (!KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad - 1, Top -1 + Height + pad)) - && !KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad, Top -1 + Height + pad + 1)) - && KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad - 1, Top -1 + Height + pad + 1))) { - KinkyDungeonMapSet(Left-pad, Top -1 + Height + pad, 'X'); - } - if (!KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad + 1, Top -pad)) - && !KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad, Top -pad - 1)) - && KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad + 1, Top -pad - 1))) { - KinkyDungeonMapSet(Left-1 + Height + pad, Top -pad, 'X'); - } - if (!KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad + 1, Top -1 + Height + pad)) - && !KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad, Top -1 + Height + pad + 1)) - && KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad + 1, Top -1 + Height + pad + 1))) { - KinkyDungeonMapSet(Left-1 + Height + pad, Top -1 + Height + pad, 'X'); - } - } -} - -function KinkyDungeonPlaceStairs(checkpoint, startpos, width, height, noStairs, nostartstairs) { - // Starting stairs are predetermined and guaranteed to be open - if (!nostartstairs) - KinkyDungeonMapSet(1, startpos, 'S'); - /*if (startpos > 1) KinkyDungeonMapSet(2, startpos - 1, '0'); - KinkyDungeonMapSet(2, startpos, '0'); - if (startpos < KinkyDungeonGridHeight-1) KinkyDungeonMapSet(2, startpos + 1, '0'); - if (startpos > 1) KinkyDungeonMapSet(3, startpos - 1, '0'); - KinkyDungeonMapSet(3, startpos, '0'); - if (startpos < KinkyDungeonGridHeight-1) KinkyDungeonMapSet(3, startpos + 1, '0');*/ - - if (!noStairs) { - // Ending stairs are not. - let placed = false; - - if (KinkyDungeonEndPosition) { - placed = true; - KinkyDungeonMapSet(KinkyDungeonEndPosition.x, KinkyDungeonEndPosition.y, 's'); - } - - // shop around for space if that didn't work for some reason - if (!placed) - for (let X = width - 2; X > 0.75 * width - 2 && !placed; X--) - for (let L = 100; L > 0; L -= 1) { // Try up to 100 times - //let X = width - 2; - let Y = 1 + 2*Math.floor(KDRandom()*0.5 * (height - 2)); - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y))) { - // Check the 3x3 area - let wallcount = 0; - for (let XX = X-1; XX <= X+1; XX += 1) - for (let YY = Y-1; YY <= Y+1; YY += 1) - if (!(XX == X && YY == Y) && (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X')) - wallcount += 1; - if (wallcount == 7 - || (wallcount >= 5 - && (KinkyDungeonMapGet(X+1, Y) == '1' || KinkyDungeonMapGet(X-1, Y) == '1') - && (KinkyDungeonMapGet(X, Y+1) == '1' || KinkyDungeonMapGet(X, Y-1) == '1'))) { - placed = true; - KinkyDungeonMapSet(X, Y, 's'); - KinkyDungeonEndPosition = {x: X, y: Y}; - L = 0; - break; - } - } - } - - if (!placed) // Loosen the constraints - for (let L = 100; L > 0; L -= 1) { // Try up to 100 times - let X = width - 2 - Math.floor(KDRandom() * width/(4)); - let Y = 1 + Math.floor(KDRandom() * (height - 2)); - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y))) { - KinkyDungeonMapSet(X, Y, 's'); - KinkyDungeonEndPosition = {x: X, y: Y}; - L = 0; - } - } - - } - - KDGameData.MainPath = checkpoint; - if (KDGameData.MainPath != MiniGameKinkyDungeonCheckpoint) KinkyDungeonSkinArea({skin: KDGameData.MainPath}, KinkyDungeonEndPosition.x, KinkyDungeonEndPosition.y, 4.99); - KinkyDungeonSpecialAreas.push({x: KinkyDungeonEndPosition.x, y: KinkyDungeonEndPosition.y, radius: 2}); -} - -function KinkyDungeonSkinArea(skin, X, Y, Radius, NoStairs) { - for (let xx = Math.floor(X - Radius); xx <= Math.ceil(X + Radius); xx++) { - for (let yy = Math.floor(Y - Radius); yy <= Math.ceil(Y + Radius); yy++) { - if (xx >= 0 && xx <= KinkyDungeonGridWidth - 1 && yy >= 0 && yy <= KinkyDungeonGridHeight - 1) { - if (KDistEuclidean(xx - X, yy - Y) <= Radius + 0.01 && (!NoStairs || KinkyDungeonMapGet(xx, yy) != 's')) { - if (!KinkyDungeonTilesSkin[xx + "," + yy]) { - KinkyDungeonTilesSkin[xx + "," + yy] = skin; - } else { - // - } - } - } - } - } -} - - -// @ts-ignore -function KinkyDungeonGetMainPath(level, altType) { - if (altType && altType.keepMainPath) return MiniGameKinkyDungeonCheckpoint; - let params = KinkyDungeonMapParams[MiniGameKinkyDungeonCheckpoint]; - let paths = params ? params.mainpath : null; - let path = null; - let chanceRoll = KDRandom(); // This is always rolled, in order to not break saves - if (paths) { - for (let p of paths) { - if (p.Level == MiniGameKinkyDungeonLevel) { - path = p; - break; - } - } - } - if (path) { - if (chanceRoll < path.chance || !path.chance) { - return path.checkpoint; - } - } - if ((MiniGameKinkyDungeonLevel) % KDLevelsPerCheckpoint == 0) { - return KDDefaultJourney[Math.min(KDDefaultJourney.length - 1, Math.floor((MiniGameKinkyDungeonLevel + 1) / KDLevelsPerCheckpoint))]; - } - return MiniGameKinkyDungeonCheckpoint; -} - -// @ts-ignore -function KinkyDungeonGetShortcut(level, altType) { - let params = KinkyDungeonMapParams[MiniGameKinkyDungeonCheckpoint]; - let paths = params ? params.shortcuts : null; - let path = null; - let chanceRoll = KDRandom(); // This is always rolled, in order to not break saves - if (paths) { - for (let p of paths) { - if (p.Level == MiniGameKinkyDungeonLevel) { - path = p; - break; - } - } - } - if (path) { - if (chanceRoll < path.chance || !path.chance) { - return path.checkpoint; - } - } - return "grv"; -} - -function KinkyDungeonPlaceShortcut(checkpoint, width, height) { - - if (checkpoint != "grv") { - - // Ending stairs are not. - let placed = false; - - // Place along the top and bottom of the map - - if (!KinkyDungeonShortcutPosition) { - for (let L = 1000; L > 0; L -= 1) { // Try up to 1000 times - let X = Math.floor(width * 0.75) - 2 - Math.floor(KDRandom() * width/2); - let Y = 1 + 2*Math.floor(KDRandom()*0.5 * (height - 2)); - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits)) { - // Check the 3x3 area - let wallcount = 0; - for (let XX = X-1; XX <= X+1; XX += 1) - for (let YY = Y-1; YY <= Y+1; YY += 1) - if (!(XX == X && YY == Y) && (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X')) - wallcount += 1; - if (wallcount == 7 - || (wallcount >= 5 - && (KinkyDungeonMapGet(X+1, Y) == '1' || KinkyDungeonMapGet(X-1, Y) == '1') - && (KinkyDungeonMapGet(X, Y+1) == '1' || KinkyDungeonMapGet(X, Y-1) == '1'))) { - placed = true; - KinkyDungeonShortcutPosition = {x:X, y:Y}; - L = 0; - break; - } - } - } - } else { - placed = true; - } - - if (!placed) // Loosen the constraints - for (let L = 1000; L > 0; L -= 1) { // Try up to 1000 times - let X = Math.floor(width * 0.75) - 2 - Math.floor(KDRandom() * width/2); - let Y = 1 + Math.floor(KDRandom() * (height - 2)); - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) - && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits)) { - L = 0; - placed = true; - KinkyDungeonShortcutPosition = {x:X, y:Y}; - } - } - - if (KinkyDungeonShortcutPosition) { - KinkyDungeonMapSet(KinkyDungeonShortcutPosition.x, KinkyDungeonShortcutPosition.y, 'H'); - } - - if (placed) { - KDGameData.ShortcutPath = checkpoint; - if (KDGameData.ShortcutPath != MiniGameKinkyDungeonCheckpoint) KinkyDungeonSkinArea({skin: KDGameData.ShortcutPath}, KinkyDungeonShortcutPosition.x, KinkyDungeonShortcutPosition.y, 2.99, true); - } - } -} - - -let KDMinBoringness = 0; // Minimum boringness for treasure spawn - -function KinkyDungeonPlaceChests(chestlist, shrinelist, treasurechance, treasurecount, rubblechance, Floor, width, height) { - - let shrinePoints = new Map(); - - for (let s of shrinelist) { - shrinePoints.set(s.x + "," + s.y, true); - } - let chestPoints = new Map(); - - for (let s of chestlist) { - if (KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(s.x, s.y))) - chestPoints.set(s.x + "," + s.y, true); - } - - let extra = KDRandom() < treasurechance; - treasurecount += (extra ? 1 : 0); - - if (KinkyDungeonStatsChoice.get("Stealthy")) treasurecount *= 2; - - if (chestlist.length < treasurecount) { - // Populate the chests - for (let X = 1; X < width; X += 1) - for (let Y = 1; Y < height; Y += 1) { - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && KDistChebyshev(X - KinkyDungeonStartPosition.x, Y - KinkyDungeonStartPosition.y) > 10 && - (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits)) { - // Check the 3x3 area - let wallcount = 0; - let adjcount = 0; - let diagadj = 0; - for (let XX = X-1; XX <= X+1; XX += 1) - for (let YY = Y-1; YY <= Y+1; YY += 1) { - if (!(XX == X && YY == Y) && (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X')) { - wallcount += 1; - // Adjacent wall - if (XX == X || YY == Y) adjcount += 1; - } else if (!(XX == X && YY == Y) && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) { - if (!(XX == X || YY == Y)) {// Diagonal floor. We check the adjacent floors around the diagonals to determine if this is an alcove or a passage - if (XX == X + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X + 1, Y))) diagadj += 1; - else if (XX == X - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X - 1, Y))) diagadj += 1; - else if (YY == Y + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y + 1))) diagadj += 1; - else if (YY == Y - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y - 1))) diagadj += 1; - } - } - } - - if (wallcount == 7 - || (wallcount >= 4 && (wallcount - adjcount - diagadj == 0 || (wallcount == 5 && adjcount == 2 && diagadj == 1) || (wallcount > 4 && adjcount == 3 && diagadj == 7 - wallcount)) - && (KinkyDungeonMapGet(X+1, Y) == '1' || KinkyDungeonMapGet(X-1, Y) == '1') - && (KinkyDungeonMapGet(X, Y+1) == '1' || KinkyDungeonMapGet(X, Y-1) == '1') - && (!(KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X-1, Y) == '1') || (wallcount > 4 && adjcount == 3 && diagadj == 7 - wallcount)) - && (!(KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X, Y-1) == '1') || (wallcount > 4 && adjcount == 3 && diagadj == 7 - wallcount)))) { - if (!chestPoints.get((X+1) + "," + (Y)) - && !chestPoints.get((X-1) + "," + (Y)) - && !chestPoints.get((X+1) + "," + (Y+1)) - && !chestPoints.get((X+1) + "," + (Y-1)) - && !chestPoints.get((X-1) + "," + (Y+1)) - && !chestPoints.get((X-1) + "," + (Y-1)) - && !chestPoints.get((X) + "," + (Y+1)) - && !chestPoints.get((X) + "," + (Y-1)) - && !shrinePoints.get((X) + "," + (Y)) - && !shrinePoints.get((X+1) + "," + (Y)) - && !shrinePoints.get((X-1) + "," + (Y)) - && !shrinePoints.get((X+1) + "," + (Y+1)) - && !shrinePoints.get((X+1) + "," + (Y-1)) - && !shrinePoints.get((X-1) + "," + (Y+1)) - && !shrinePoints.get((X-1) + "," + (Y-1)) - && !shrinePoints.get((X) + "," + (Y+1)) - && !shrinePoints.get((X) + "," + (Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y+1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y+1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y+1))) { - chestlist.push({x:X, y:Y, boringness: KinkyDungeonBoringGet(X, Y)}); - chestPoints.set(X + "," + Y, true); - } - } - } - } - } - - // Truncate down to max chest count in a location-neutral way - let count = 0; - // Removed due to the way the jail system was reworked - let alreadyOpened = 0;//(KinkyDungeonChestsOpened.length > Floor) ? KinkyDungeonChestsOpened[Floor] : 0; - if (KinkyDungeonNewGame < 1) treasurecount -= alreadyOpened; - let list = []; - let maxBoringness = Math.max(...KinkyDungeonBoringness); - while (chestlist.length > 0) { - let N = Math.floor(KDRandom()*chestlist.length); - let chest = chestlist[N]; - if (!chest.boringness) chest.boringness = KinkyDungeonBoringGet(chest.x, chest.y); - if (chest.boringness > 0) - chest.boringness = chest.boringness + (0.05 + 0.1 * KDRandom()) * maxBoringness; - else - chest.boringness = chest.boringness + 0.05 * KDRandom() * maxBoringness; - if (chest.priority) { - list.unshift(chest); - } else list.push(chest); - - chestlist.splice(N, 1); - } - list.sort((a, b) => { - let boringa = a.boringness ? a.boringness : 0; - let boringb = b.boringness ? b.boringness : 0; - if (a.priority) boringa += 1000; - if (b.priority) boringb += 1000; - return boringb - boringa; - - }); - let silverchest = 0; - while (list.length > 0) { - let N = 0; - if (count < treasurecount) { - let chest = list[N]; - KinkyDungeonMapSet(chest.x, chest.y, 'C'); - - // Add a lock on the chest! For testing purposes ATM - let lock = KinkyDungeonGenerateLock((extra && count == 0) ? true : false, Floor); - if (chest.Loot) lock = chest.Lock; - if (silverchest == 0 && !chest.Loot) { - silverchest += 1; - KDGameData.ChestsGenerated.push("silver"); - KinkyDungeonTilesSet("" + chest.x + "," +chest.y, { - Loot: "silver", Roll: KDRandom(), NoTrap: chest.NoTrap, Faction: chest.Faction, - lootTrap: KDGenChestTrap(false, chest.x, chest.y, "silver", lock, chest.noTrap),}); - } else if (lock) { - KDGameData.ChestsGenerated.push(lock == "Blue" ? "blue" : (chest.Loot ? chest.Loot : "chest")); - KinkyDungeonTilesSet("" + chest.x + "," +chest.y, { - NoTrap: chest.NoTrap, Type: "Lock", Lock: lock, - Loot: lock == "Blue" ? "blue" : (chest.Loot ? chest.Loot : "chest"), - Faction: chest.Faction, - Roll: KDRandom(), - Special: lock == "Blue", - RedSpecial: lock == "Red", - lootTrap: KDGenChestTrap(false, chest.x, chest.y, (chest.Loot ? chest.Loot : "chest"), lock, chest.noTrap),}); - } else { - KDGameData.ChestsGenerated.push(chest.Loot ? chest.Loot : "chest"); - KinkyDungeonTilesSet("" + chest.x + "," +chest.y, {Loot: chest.Loot ? chest.Loot : "chest", Faction: chest.Faction, Roll: KDRandom(), - NoTrap: chest.NoTrap, - lootTrap: KDGenChestTrap(false, chest.x, chest.y, (chest.Loot ? chest.Loot : "chest"), lock, chest.noTrap),}); - } - - if (KDAlreadyOpened(chest.x, chest.y)) { - KinkyDungeonMapSet(chest.x, chest.y, 'c'); - KinkyDungeonTilesDelete("" + chest.x + "," +chest.y); - } - count += 1; - } /*else { - - let chest = list[N]; - if (KDRandom() < rubblechance) { - KinkyDungeonMapSet(chest.x, chest.y, 'R'); - if (KDAlreadyOpened(chest.x, chest.y)) KinkyDungeonMapSet(chest.x, chest.y, 'r'); - } else if (KDRandom() * KDRandom() < rubblechance - 0.01) KinkyDungeonMapSet(chest.x, chest.y, '/'); - //else if (KDRandom() < rubblechance - 0.05) KinkyDungeonMapSet(chest.x, chest.y, 'r'); - - }*/ - list.splice(N, 1); - } - - - for (let tile of Object.entries(KinkyDungeonTiles)) { - if (tile[1].lootTrap) { - let x = parseInt(tile[0].split(',')[0]); - let y = parseInt(tile[0].split(',')[1]); - let spawned = 0; - let mult = tile[1].lootTrap.mult; - let trap = tile[1].lootTrap.trap; - //let duration = tile[1].lootTrap.duration; - let maxspawn = 1 + Math.round(Math.min(2 + KDRandom() * 2, KinkyDungeonDifficulty/25) + Math.min(2 + KDRandom() * 2, 0.5*MiniGameKinkyDungeonLevel/KDLevelsPerCheckpoint)); - if (mult) maxspawn *= mult; - let requireTags = trap ? [trap] : undefined; - - let tags = ["trap", trap]; - KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); - - for (let i = 0; i < 30; i++) { - if (spawned < maxspawn) { - let Enemy = KinkyDungeonGetEnemy( - tags, MiniGameKinkyDungeonLevel + KinkyDungeonDifficulty/5, - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - '0', requireTags, true); - if (Enemy) { - let point = KinkyDungeonGetNearbyPoint(x, y, true, undefined, undefined, false, (xx, yy) => { - return !KDEffectTileTags(xx, yy).rune; - }); - - //KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, Enemy.name, 1, 7, true, (duration || Enemy.tags.construct) ? (duration || 40) : undefined, undefined, false, "Ambush", true, 1.5, true, undefined, true, true); - if (point) { - if (!KinkyDungeonTilesGet(point.x + ',' + point.y)) KinkyDungeonTilesSet(point.x + ',' + point.y, {}); - KinkyDungeonTilesGet(point.x + ',' + point.y).lootTrapEnemy = Enemy.name; - KDCreateEffectTile(point.x, point.y, { - name: "Runes", - duration: 9999, - }, 0); - if (Enemy.tags.minor) spawned += 0.5; - else if (Enemy.tags.elite) spawned += 1.5; - else if (Enemy.tags.miniboss) spawned += 2; - else if (Enemy.tags.boss) spawned += 4; - else spawned += 1; - if (Enemy.summonTags) { - for (let t of Enemy.summonTags) { - if (!tags.includes(t)) tags.push(t); - } - } - if (Enemy.summonTagsMulti) { - for (let t of Enemy.summonTagsMulti) { - tags.push(t); - } - } - } - } - } - } - } - } -} - - -function KinkyDungeonPlaceLore(width, height) { - let loreList = []; - - // Populate the lore - for (let X = 1; X < width; X += 1) - for (let Y = 1; Y < height; Y += 1) - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits) && KDRandom() < 0.6) loreList.push({x:X, y:Y}); - - let count = 0; - let maxcount = 2; - while (loreList.length > 0) { - let N = Math.floor(KDRandom()*loreList.length); - KinkyDungeonGroundItems.push({x:loreList[N].x, y:loreList[N].y, name: "Lore"}); - count += 1; - if (count >= maxcount) - return count; - } - return count; -} - -function KinkyDungeonPlaceHeart(width, height, Floor) { - let heartList = []; - - // Populate the lore - for (let X = 1; X < width; X += 1) - for (let Y = 1; Y < height; Y += 1) - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) - && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits) - && KDistChebyshev(X - KinkyDungeonStartPosition.x, Y - KinkyDungeonStartPosition.y) > 8 - ) heartList.push({x:X, y:Y}); - - while (heartList.length > 0) { - let N = Math.floor(KDRandom()*heartList.length); - if (!KDGameData.HeartTaken) { - KinkyDungeonGroundItems.push({x:heartList[N].x, y:heartList[N].y, name: "Heart"}); - } - return true; - } - -} - - - -// @ts-ignore -// @ts-ignore -// @ts-ignore -function KinkyDungeonPlaceShrines(chestlist, shrinelist, shrinechance, shrineTypes, shrinecount, shrinefilter, ghostchance, manaChance, orbcount, filterTypes, Floor, width, height) { - KinkyDungeonCommercePlaced = 0; - - - let chestPoints = new Map(); - - for (let s of chestlist) { - chestPoints.set(s.x + "," + s.y, true); - } - - let shrinePoints = new Map(); - - for (let s of shrinelist) { - if (KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(s.x, s.y))) - shrinePoints.set(s.x + "," + s.y, true); - } - - let maxcount = shrinecount + orbcount; - - - let tablets = { - //"Cursed": 0, - "Determination": 0, - }; - let tabletsAmount = { - //"Cursed": 1, - "Determination": 3, - }; - for (let goddess of Object.keys(KinkyDungeonShrineBaseCosts)) { - tablets[goddess] = 0; - tabletsAmount[goddess] = Math.max(0, KinkyDungeonGoddessRep[goddess] / 5); - maxcount += Math.floor(Math.max(0, KinkyDungeonGoddessRep[goddess] / 5)); - } - - - if (shrinelist <= maxcount) - // Populate the chests - for (let X = 1; X < width; X += 1) - for (let Y = 1; Y < height; Y += 1) - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && Math.max(Math.abs(X - KinkyDungeonStartPosition.x), Math.abs(Y - KinkyDungeonStartPosition.y)) > KinkyDungeonJailLeash - && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits)) { - // Check the 3x3 area - let wallcount = 0; - let adjcount = 0; - let diagadj = 0; - for (let XX = X-1; XX <= X+1; XX += 1) - for (let YY = Y-1; YY <= Y+1; YY += 1) { - if (!(XX == X && YY == Y) && (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X')) { - wallcount += 1; - // Adjacent wall - if (XX == X || YY == Y) adjcount += 1; - } else if (!(XX == X && YY == Y) && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) { - if (!(XX == X || YY == Y)) {// Diagonal floor. We check the adjacent floors around the diagonals to determine if this is an alcove or a passage - if (XX == X + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X + 1, Y))) diagadj += 1; - else if (XX == X - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X - 1, Y))) diagadj += 1; - else if (YY == Y + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y + 1))) diagadj += 1; - else if (YY == Y - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y - 1))) diagadj += 1; - } - } - } - - if (wallcount == 7 - || (wallcount >= 4 && (wallcount - adjcount - diagadj == 0 || (wallcount == 5 && adjcount == 2 && diagadj == 1) || (wallcount == 6 && adjcount == 3 && diagadj == 1)) - && (KinkyDungeonMapGet(X+1, Y) == '1' || KinkyDungeonMapGet(X-1, Y) == '1') - && (KinkyDungeonMapGet(X, Y+1) == '1' || KinkyDungeonMapGet(X, Y-1) == '1') - && (!(KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X-1, Y) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)) - && (!(KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X, Y-1) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)))) { - if (!shrinePoints.get((X+1) + "," + (Y)) - && !shrinePoints.get((X-1) + "," + (Y)) - && !shrinePoints.get((X+1) + "," + (Y+1)) - && !shrinePoints.get((X+1) + "," + (Y-1)) - && !shrinePoints.get((X-1) + "," + (Y+1)) - && !shrinePoints.get((X-1) + "," + (Y-1)) - && !shrinePoints.get((X) + "," + (Y+1)) - && !shrinePoints.get((X) + "," + (Y-1)) - && !chestPoints.get((X+1) + "," + (Y)) - && !chestPoints.get((X-1) + "," + (Y)) - && !chestPoints.get((X+1) + "," + (Y+1)) - && !chestPoints.get((X+1) + "," + (Y-1)) - && !chestPoints.get((X-1) + "," + (Y+1)) - && !chestPoints.get((X-1) + "," + (Y-1)) - && !chestPoints.get((X) + "," + (Y+1)) - && !chestPoints.get((X) + "," + (Y-1)) - && !chestPoints.get((X) + "," + (Y)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y+1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y+1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y+1))) { - shrinelist.push({x:X, y:Y, boringness: KinkyDungeonBoringGet(X, Y)}); - shrinePoints.set(X + "," + Y, true); - } - } - - - }// else if (KinkyDungeonMapGet(X, Y) == "R" || KinkyDungeonMapGet(X, Y) == "r") - //shrinelist.push({x:X, y:Y}); - - // Truncate down to max chest count in a location-neutral way - let count = 0; - - let orbs = 0; - let list = []; - let maxBoringness = Math.max(...KinkyDungeonBoringness); - while (shrinelist.length > 0) { - let N = Math.floor(KDRandom()*shrinelist.length); - let chest = shrinelist[N]; - if (!chest.boringness) chest.boringness = KinkyDungeonBoringGet(chest.x, chest.y); - if (chest.boringness > 0) - chest.boringness = chest.boringness + (0.05 + 0.1 * KDRandom()) * maxBoringness; - else - chest.boringness = chest.boringness + 0.05 * KDRandom() * maxBoringness; - if (chest.priority) { - list.unshift(chest); - } else list.push(chest); - - shrinelist.splice(N, 1); - } - list.sort((a, b) => { - let boringa = a.boringness ? a.boringness : 0; - let boringb = b.boringness ? b.boringness : 0; - if (a.priority) boringa += 1000; - if (b.priority) boringb += 1000; - return boringb - boringa; - - }); - while (list.length > 0) { - let N = 0; - if (count <= shrinecount) { - - let shrine = list[N]; - if (count == shrinecount && KDRandom() > shrinechance) - KinkyDungeonMapSet(shrine.x, shrine.y, 'a'); - else { - let playerTypes = KinkyDungeonRestraintTypes(shrinefilter); - /** - * @type {{type: string, drunk?: boolean}} - */ - let stype = shrineTypes.length < orbcount ? {type: "Orb"} - : (shrineTypes.length == orbcount && playerTypes.length > 0 ? - {type: playerTypes[Math.floor(KDRandom() * playerTypes.length)]} - : KinkyDungeonGenerateShrine(Floor, filterTypes, manaChance)); - let type = stype.type; - let tile = 'A'; - if (type != "Orb" && shrineTypes.includes(type) && (KDRandom() < 0.5 || type == "Commerce")) type = ""; - if (type == "Orb") { - if (orbs < orbcount) { - tile = 'O'; - orbs += 1; - } else tile = 'o'; - if (KDAlreadyOpened(shrine.x, shrine.y)) { - tile = 'o'; - } - shrineTypes.push("Orb"); - } else if (type) { - if (KDAlreadyOpened(shrine.x, shrine.y)) { - tile = 'a'; - } else { - KinkyDungeonTilesSet("" + shrine.x + "," +shrine.y, {Type: "Shrine", Name: type, drunk: stype.drunk}); - } - shrineTypes.push(type); - } else if (!shrineTypes.includes("Ghost") || KDRandom() < 0.5) { - shrineTypes.push("Ghost"); - tile = 'G'; - KinkyDungeonTilesSet("" + shrine.x + "," +shrine.y, {Type: "Ghost"}); - } else tile = 'a'; - - KinkyDungeonMapSet(shrine.x, shrine.y, tile); - //console.log(`Placed ${type} in boringness ${KinkyDungeonBoringGet(shrine.x, shrine.y)}, prioritized? ${shrine.priority}`); - } - - count += 1; - } else for (let goddess of Object.keys(tablets)) { - if (tablets[goddess] < tabletsAmount[goddess]) { - let shrine = list[N]; - KinkyDungeonTilesSet("" + shrine.x + "," +shrine.y, {Type: "Tablet", Name: goddess, Light: 3, lightColor: 0x8888ff}); - KinkyDungeonMapSet(shrine.x, shrine.y, 'M'); - - tablets[goddess] += 1; - } - } - - list.splice(N, 1); - } -} - - -function KinkyDungeonPlaceChargers(chargerlist, chargerchance, litchargerchance, chargercount, Floor, width, height) { - let chargerPoints = new Map(); - - for (let s of chargerlist) { - if (KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(s.x, s.y))) - chargerPoints.set(s.x + "," + s.y, true); - } - - - if (chargerlist.length < chargercount) - // Populate the chests - for (let X = 1; X < width; X += 1) - for (let Y = 1; Y < height; Y += 1) - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && Math.max(Math.abs(X - KinkyDungeonStartPosition.x), Math.abs(Y - KinkyDungeonStartPosition.y)) > KinkyDungeonJailLeash - && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits)) { - // Check the 3x3 area - let wallcount = 0; - let adjcount = 0; - let diagadj = 0; - for (let XX = X-1; XX <= X+1; XX += 1) - for (let YY = Y-1; YY <= Y+1; YY += 1) { - if (!(XX == X && YY == Y) && (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X')) { - wallcount += 1; - // Adjacent wall - if (XX == X || YY == Y) adjcount += 1; - } else if (!(XX == X && YY == Y) && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) { - if (!(XX == X || YY == Y)) {// Diagonal floor. We check the adjacent floors around the diagonals to determine if this is an alcove or a passage - if (XX == X + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X + 1, Y))) diagadj += 1; - else if (XX == X - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X - 1, Y))) diagadj += 1; - else if (YY == Y + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y + 1))) diagadj += 1; - else if (YY == Y - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y - 1))) diagadj += 1; - } - } - } - - if (wallcount == 7 || wallcount == 0 - || (wallcount >= 4 && (wallcount - adjcount - diagadj == 0 || (wallcount == 5 && adjcount == 2 && diagadj == 1) || (wallcount == 6 && adjcount == 3 && diagadj == 1)) - && (KinkyDungeonMapGet(X+1, Y) == '1' || KinkyDungeonMapGet(X-1, Y) == '1') - && (KinkyDungeonMapGet(X, Y+1) == '1' || KinkyDungeonMapGet(X, Y-1) == '1') - && (!(KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X-1, Y) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)) - && (!(KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X, Y-1) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)))) { - if (!chargerPoints.get((X+1) + "," + (Y)) - && !chargerPoints.get((X-1) + "," + (Y)) - && !chargerPoints.get((X+1) + "," + (Y+1)) - && !chargerPoints.get((X+1) + "," + (Y-1)) - && !chargerPoints.get((X-1) + "," + (Y+1)) - && !chargerPoints.get((X-1) + "," + (Y-1)) - && !chargerPoints.get((X) + "," + (Y+1)) - && !chargerPoints.get((X) + "," + (Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y+1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y+1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y+1))) { - chargerlist.push({x:X, y:Y}); - chargerPoints.set(X + "," + Y, true); - } - } - - - } - - // Truncate down to max chest count in a location-neutral way - let count = 0; - let list = []; - while (chargerlist.length > 0) { - let N = Math.floor(KDRandom()*chargerlist.length); - let chest = chargerlist[N]; - if (chest.priority) { - list.unshift(chest); - } else list.push(chest); - chargerlist.splice(N, 1); - } - while (list.length > 0) { - let N = 0; - if (count <= chargercount) { - - let charger = list[N]; - let tile = KDRandom() > chargerchance ? '-' : (KDRandom() < litchargerchance ? '=' : '+'); - - if (tile != '-') { - KinkyDungeonTilesSet("" + charger.x + "," +charger.y, {Type: "Charger", NoRemove: tile == '=', lightColor: KDChargerColor, Light: (tile == '=' ? KDChargerLight : undefined)}); - } - - KinkyDungeonMapSet(charger.x, charger.y, tile); - - count += (tile == '-' ? 0.4 : 1.0); - } - - list.splice(N, 1); - } -} - -let KinkyDungeonCommercePlaced = 0; - -/** - * - * @param {number} Floor - * @param {number} manaChance - * @param {string[]} filterTypes - * @returns - */ -function KinkyDungeonGenerateShrine(Floor, filterTypes, manaChance) { - let Params = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]]; - let drunk = !(KDRandom() < manaChance); - - if (Params.shrines) { - - let shrineWeightTotal = 0; - let shrineWeights = []; - - for (let shrine of Params.shrines) { - shrineWeights.push({shrine: shrine, weight: shrineWeightTotal}); - if (!filterTypes || !filterTypes.includes(shrine.Type)) { - shrineWeightTotal += shrine.Weight; - if (shrine.Type == "Commerce" && KinkyDungeonStatsChoice.has("Supermarket")) { - shrineWeightTotal += 15; // Increase weight of shop shrines - } - } - - } - - let selection = KDRandom() * shrineWeightTotal; - - for (let L = shrineWeights.length - 1; L >= 0; L--) { - if (selection > shrineWeights[L].weight) { - return {type: shrineWeights[L].shrine.Type, drunk: drunk}; - } - } - } - - return {type: ""}; -} - - -// @ts-ignore -function KinkyDungeonPlaceSpecialTiles(gaschance, gasType, Floor, width, height) { - for (let X = 1; X < width; X += 1) - for (let Y = 1; Y < height; Y += 1) - // Happy Gas - if (KinkyDungeonMapGet(X, Y) == '0') { - let chance = 0; - // Check the 3x3 area - for (let XX = X-1; XX <= X+1; XX += 1) - for (let YY = Y-1; YY <= Y+1; YY += 1) { - if (!(XX == X && YY == Y) && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(XX, YY))) - chance += gaschance; - } - - if (KDRandom() < chance) - KinkyDungeonMapSet(X, Y, gasType); - } -} - -// @ts-ignore -// @ts-ignore -// @ts-ignore -function KinkyDungeonPlaceBrickwork( brickchance, Floor, width, height) { - // Populate the chests - for (let X = 1; X < width; X += 1) - for (let Y = 1; Y < height; Y += 1) - if (KinkyDungeonMapGet(X, Y) == '0') { - let chance = brickchance; - // Check the 3x3 area - for (let XX = X-1; XX <= X+1; XX += 1) - for (let YY = Y-1; YY <= Y+1; YY += 1) { - if (!(XX == X && YY == Y) && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(XX, YY))) - chance += 0.01; - if (KinkyDungeonMapGet(XX, YY) == 'A') - chance += 0.5; - else if (KinkyDungeonMapGet(XX, YY) == 'a') - chance += 0.25; - } - - if (KDRandom() < chance) - KinkyDungeonMapSet(X, Y, '2'); - } -} - -// @ts-ignore -// @ts-ignore -// @ts-ignore -function KinkyDungeonPlaceTraps( traps, traptypes, trapchance, doorlocktrapchance, Floor, width, height) { - for (let X = 1; X < width-1; X += 1) - for (let Y = 1; Y < height-1; Y += 1) { - let hosttile = KinkyDungeonMapGet(X, Y); - let chance = KDTrappableNeighbors.includes(hosttile) ? trapchance * trapchance : (KDTrappableNeighborsLikely.includes(hosttile) ? trapchance : 0); - // Check the 3x3 area - if (chance > 0) { - for (let XX = X-1; XX <= X+1; XX += 1) - for (let YY = Y-1; YY <= Y+1; YY += 1) { - let tile = KinkyDungeonMapGet(XX, YY); - if (KinkyDungeonGroundTiles.includes(tile)) { - if (KDRandom() < chance) { - traps.push({x: XX, y: YY}); - } - } - } - } - if (hosttile == 'L' && KinkyDungeonStatsChoice.has("Nowhere") && KDRandom() < 0.25) { - let tile = KinkyDungeonTilesGet(X + "," + Y) ? KinkyDungeonTilesGet(X + "," + Y) : {}; - KinkyDungeonTilesSet(X + "," + Y, Object.assign(tile, { - Type: "Trap", - Trap: tile.Furniture ? tile.Furniture + "Trap" : "BarrelTrap", - })); - } - } - for (let trap of traps) { - if (KinkyDungeonMapGet(trap.x, trap.y) != 'T') { - if ((KinkyDungeonMapGet(trap.x, trap.y) == 'D' || KinkyDungeonMapGet(trap.x, trap.y) == 'd') && KDRandom() < doorlocktrapchance) { - if (KinkyDungeonTilesGet(trap.x + "," + trap.y)) { - KinkyDungeonTilesGet(trap.x + "," + trap.y).StepOffTrap = "DoorLock"; - KinkyDungeonTilesGet(trap.x + "," + trap.y).Lock = undefined; - for (let item of KinkyDungeonGroundItems) { - if (item.x == trap.x && item.y == trap.y && item.name == "Gold") { - KinkyDungeonGroundItems.splice(KinkyDungeonGroundItems.indexOf(item), 1); - } - } - } - } else { - KinkyDungeonMapSet(trap.x, trap.y, 'T'); - let t = KinkyDungeonGetTrap(traptypes, Floor, []); - let tile = KinkyDungeonTilesGet(trap.x + "," + trap.y); - KinkyDungeonTilesSet(trap.x + "," + trap.y, { - Type: "Trap", - Trap: t.Name, - Restraint: t.Restraint, - Enemy: t.Enemy, - Spell: t.Spell, - extraTag: t.extraTag, - Power: t.Power, - OffLimits: tile?.OffLimits, - }); - if (KDRandom() < 0.05) { - let dropped = {x:trap.x, y:trap.y, name: "Gold", amount: 1}; - KinkyDungeonGroundItems.push(dropped); - } - let spell = t.Spell ? KinkyDungeonFindSpell(t.Spell, true) : ""; - if (spell && !spell.nonmagical) { - KDCreateEffectTile(trap.x, trap.y, { - name: "RunesTrap", - duration: 9999, - }, 0); - } - } - } - } - - -} - -// @ts-ignore -function KinkyDungeonPlacePatrols(Count, width, height) { - for (let i = 1; i <= Count; i++) { - if (KinkyDungeonPatrolPoints.length < Count) - for (let L = 1000; L > 0; L -= 1) { // Try up to 1000 times - let X = Math.floor(i * width / (Count + 1)) + Math.floor(KDRandom() * width/(Count + 1)); - let Y = Math.floor(KDRandom()*height); - if (!KinkyDungeonPointInCell(X, Y) && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits)) { - KinkyDungeonPatrolPoints.push({x: X, y: Y}); - break; - } - } - } -} - -/** - * - * @returns {number} - */ -function KDGetEffLevel() { - let effLevel = MiniGameKinkyDungeonLevel + Math.round(KinkyDungeonDifficulty/5); - if (KinkyDungeonNewGame) effLevel += KinkyDungeonMaxLevel; - - return effLevel; -} - -/** - * @returns {string} - */ -function KDRandomizeRedLock() { - let level = KDGetEffLevel(); - if (KDRandom() < -0.1 + Math.min(0.5, level * 0.03)) return "Red_Hi"; - if (KDRandom() < 0.25 + Math.min(0.55, level * 0.03)) return "Red_Med"; - return "Red"; -} - -/** - * Generates a lock - * @param {boolean} [Guaranteed] - * @param {number} [Floor] - * @param {boolean} [AllowGold] - * @param {string} [Type] - Used to customize the type - * @returns {string} - */ -function KinkyDungeonGenerateLock(Guaranteed, Floor, AllowGold, Type) { - let level = (Floor) ? Floor : MiniGameKinkyDungeonLevel; - //let Params = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]]; - - let chance = (level == 0) ? 0 : KinkyDungeonBaseLockChance; - chance += KinkyDungeonScalingLockChance * level / KDLevelsPerCheckpoint; - - if (Guaranteed) chance = 1.0; - - let lock = undefined; - - if (KDRandom() < chance) { - // Now we get the amount failed by - // Default: red lock - let locktype = KDRandom(); - let locktype2 = KDRandom(); - - let modifiers = ""; - let bmax = KinkyDungeonBlueLockChanceScalingMax + Math.min(0.25, KinkyDungeonDifficulty * 0.002); - let pmax = KinkyDungeonPurpleLockChanceScalingMax + Math.min(0.8, KinkyDungeonDifficulty * 0.004); - let BlueChance = Math.min(KinkyDungeonBlueLockChance + (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.5 : 1.0) * level * KinkyDungeonBlueLockChanceScaling, (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.6 : 1.0) * bmax); - let PurpleChance = Math.min(KinkyDungeonPurpleLockChance + (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.5 : 1.0) * level * KinkyDungeonPurpleLockChanceScaling, (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.6 : 1.0) * pmax); - - if (KinkyDungeonStatsChoice.get("HighSecurity")) { - BlueChance *= 1.5; - BlueChance += 0.05; - PurpleChance *= 1.5; - PurpleChance += 0.05; - } - if (locktype2 < PurpleChance && locktype2*PurpleChance > locktype*BlueChance) { - lock = "Purple" + modifiers; - } else if (locktype < BlueChance) { - let max = KinkyDungeonGoldLockChanceScalingMax + Math.min(0.4, KinkyDungeonDifficulty * 0.001); - let GoldChance = Math.min(KinkyDungeonGoldLockChance + (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.6 : 1.0) * level * KinkyDungeonGoldLockChanceScaling, (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.9 : 1.0) * max); - - if (AllowGold && KDRandom() < GoldChance) lock = "Gold" + modifiers; - else lock = "Blue" + modifiers; - } else { - lock = KDRandomizeRedLock() + modifiers; - } - } - if (Type == "Door") { - if (lock.includes("Blue") || lock.includes("Gold")) lock = KDRandomizeRedLock(); - } - - return lock; -} - -function KinkyDungeonPlaceDoors(doorchance, nodoorchance, doorlockchance, trapChance, grateChance, Floor, width, height) { - let doorlist = []; - let doorlist_2ndpass = []; - let trapLocations = []; - - // Populate the doors - for (let X = 1; X < width; X += 1) - for (let Y = 1; Y < height; Y += 1) - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && KinkyDungeonMapGet(X, Y) != 'D' && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits)) { - // Check the 3x3 area - let wallcount = 0; - let up = false; - let down = false; - let left = false; - let right = false; - for (let XX = X-1; XX <= X+1; XX += 1) - for (let YY = Y-1; YY <= Y+1; YY += 1) { - let get = KinkyDungeonMapGet(XX, YY); - if (!(XX == X && YY == Y) && (get == '1' || get == 'X' || get == 'C')) { - wallcount += 1; // Get number of adjacent walls - if (XX == X+1 && YY == Y && get == '1') right = true; - else if (XX == X-1 && YY == Y && get == '1') left = true; - else if (XX == X && YY == Y+1 && get == '1') down = true; - else if (XX == X && YY == Y-1 && get == '1') up = true; - } else if (get == 'D') // No adjacent doors - wallcount = 100; - } - if (wallcount < 5 && ((up && down) != (left && right)) && KDRandom() > nodoorchance) { // Requirements: 4 doors and either a set in up/down or left/right but not both - doorlist.push({x:X, y:Y}); - doorlist_2ndpass.push({x:X, y:Y}); - } - } - - while (doorlist.length > 0) { - let N = Math.floor(KDRandom()*doorlist.length); - - let door = doorlist[N]; - let X = door.x; - let Y = door.y; - - let closed = KDRandom() < doorchance; - KinkyDungeonMapSet(X, Y, (closed ? 'D' : 'd')); - KinkyDungeonTilesSet("" + X + "," + Y, {Type: "Door"}); - if (closed && KDRandom() < doorlockchance && KinkyDungeonIsAccessible(X, Y)) { - KinkyDungeonTilesGet("" + X + "," + Y).Lock = KinkyDungeonGenerateLock(true, Floor); - } - - doorlist.splice(N, 1); - } - - while (doorlist_2ndpass.length > 0) { - let N = Math.floor(KDRandom()*doorlist_2ndpass.length); - let minLockedRoomSize = 12; - let maxPlayerDist = 4; - - let door = doorlist_2ndpass[N]; - let X = door.x; - let Y = door.y; - - let roomDoors = []; - - let trap = KDRandom() < trapChance; - let grate = KDRandom() < grateChance; - - if ((trap || grate) && KinkyDungeonTilesGet(X + "," + Y) && !KinkyDungeonTilesGet(X + "," + Y).NoTrap && !KinkyDungeonTilesGet(X + "," + Y).OffLimits) { - let accessible = KinkyDungeonGetAccessibleRoom(X, Y); - - if (accessible.length > minLockedRoomSize) { - for (let a of accessible) { - let split = a.split(','); - let XX = parseInt(split[0]); - let YY = parseInt(split[1]); - let tileType = KinkyDungeonMapGet(XX, YY); - if ((tileType == "D" || tileType == 'd') && !KinkyDungeonTilesGet(a).Lock && XX != X && YY != Y) { - roomDoors.push({x: XX, y: YY}); - } - } - let rooms = []; - let room2 = KinkyDungeonGetAccessibleRoom(X, Y); - for (let ddoor of roomDoors) { - rooms.push({door: ddoor, room: room2}); - } - for (let room of rooms) { - let success = room.room.length == accessible.length; - for (let tile of accessible) { - if (!room.room.includes(tile)) { - success = false; - break; - } - } - if (success) { - if (!KinkyDungeonTilesGet(room.door.x + "," + room.door.y).Lock && !KinkyDungeonTilesGet(X + "," + Y).Lock && !KinkyDungeonTilesGet(room.door.x + "," + room.door.y).NoTrap - && ((KinkyDungeonGetAccessibleRoom(X+1, Y).length != KinkyDungeonGetAccessibleRoom(X-1, Y).length - && KinkyDungeonIsReachable(X+1, Y, X, Y) && KinkyDungeonIsReachable(X-1, Y, X, Y)) - || (KinkyDungeonGetAccessibleRoom(X, Y+1).length != KinkyDungeonGetAccessibleRoom(X, Y-1).length) - && KinkyDungeonIsReachable(X, Y+1, X, Y) && KinkyDungeonIsReachable(X, Y-1, X, Y)) - && KinkyDungeonIsAccessible(X, Y)) { - let lock = false; - //console.log(X + "," + Y + " locked") - if (trap && Math.max(Math.abs(room.door.x - KinkyDungeonPlayerEntity.x), Math.abs(room.door.y - KinkyDungeonPlayerEntity.y)) > maxPlayerDist) { - // Place a trap or something at the other door if it's far enough from the player - if (KDDebug) - console.log("Trap at " + X + "," + Y); - trapLocations.push({x: room.door.x, y: room.door.y}); - if (KDRandom() < 0.1) { - let dropped = {x:room.door.x, y:room.door.y, name: "Gold", amount: 1}; - KinkyDungeonGroundItems.push(dropped); - } - lock = true; - } else if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(room.door.x, room.door.y+1)) && ((grate && (!room.room || room.room.length > minLockedRoomSize)) - || (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y+1)) && Math.max(Math.abs(room.door.x - KinkyDungeonPlayerEntity.x), Math.abs(room.door.y - KinkyDungeonPlayerEntity.y)) <= maxPlayerDist)) - && room.door.y != KinkyDungeonStartPosition.y) { - // Place a grate instead - KinkyDungeonMapSet(room.door.x, room.door.y, 'g'); - lock = true; - } - if (lock) { - KinkyDungeonTilesGet("" + X + "," + Y).Lock = KinkyDungeonGenerateLock(true, Floor, false, "Door"); - KinkyDungeonMapSet(X, Y, 'D'); - } - } - break; - } - } - } - } - doorlist_2ndpass.splice(N, 1); - } - return trapLocations; -} - -function KinkyDungeonReplaceDoodads(Chance, barchance, wallRubblechance, wallhookchance, ceilinghookchance, width, height, altType) { - for (let X = 1; X < width-1; X += 1) - for (let Y = 1; Y < height-1; Y += 1) { - if (KinkyDungeonMapGet(X, Y) == '1' && KDRandom() < Chance) - KinkyDungeonMapSet(X, Y, '4'); - else - if (KinkyDungeonMapGet(X, Y) == '1' && KDRandom() < wallRubblechance && !KinkyDungeonTilesSkin[X + "," + Y]) { - KinkyDungeonMapSet(X, Y, 'Y'); - if (KDAlreadyOpened(X, Y)) { - KinkyDungeonMapSet(X, Y, '1'); - } - } - - } - - - if (altType && !altType.noClutter) { - // Make it so you dont ever move through square corners - for (let X = 1; X < width - 1; X += 1) - for (let Y = 1; Y < height - 1; Y += 1) { - let tl = KinkyDungeonMapGet(X, Y); - let tr = KinkyDungeonMapGet(X+1, Y); - let bl = KinkyDungeonMapGet(X, Y+1); - let br = KinkyDungeonMapGet(X+1, Y+1); - if (tl == '1' && br == '1' && KinkyDungeonMovableTilesEnemy.includes(tr) && KinkyDungeonMovableTilesEnemy.includes(bl)) - KinkyDungeonMapSet(X, Y, 'X'); - else if (tr == '1' && bl == '1' && KinkyDungeonMovableTilesEnemy.includes(tl) && KinkyDungeonMovableTilesEnemy.includes(br)) - KinkyDungeonMapSet(X, Y+1, 'X'); - } - - for (let X = 1; X < width-1; X += 1) - for (let Y = 1; Y < height-1; Y += 1) { - if (KinkyDungeonMapGet(X, Y) == '1' && KDRandom() < barchance - && ((KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X-1, Y) == '0' && KinkyDungeonMapGet(X+1, Y) == '0') - || (KinkyDungeonMapGet(X-1, Y) == '1' && KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X, Y-1) == '0' && KinkyDungeonMapGet(X, Y+1) == '0'))) { - KinkyDungeonMapSet(X, Y, 'b'); - } else if ((KinkyDungeonMapGet(X, Y) == '2' || KinkyDungeonMapGet(X, Y) == '0') && ( - (KDRandom() < wallhookchance && KinkyDungeonMapGet(X-1, Y) == '1' && KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X+1, Y) == '0' && KinkyDungeonMapGet(X+1, Y-1) == '0' && KinkyDungeonMapGet(X+1, Y+1) == '0') - || (KDRandom() < wallhookchance && KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X-1, Y) == '0' && KinkyDungeonMapGet(X-1, Y-1) == '0' && KinkyDungeonMapGet(X-1, Y+1) == '0') - || (KDRandom() < wallhookchance && KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X, Y+1) == '0' && KinkyDungeonMapGet(X+1, Y+1) == '0' && KinkyDungeonMapGet(X-1, Y+1) == '0') - || (KDRandom() < wallhookchance && KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X, Y-1) == '0' && KinkyDungeonMapGet(X+1, Y-1) == '0' && KinkyDungeonMapGet(X-1, Y-1) == '0'))) { - KinkyDungeonMapSet(X, Y-1, ','); // Wall hook - } else if (KDRandom() < ceilinghookchance && (KinkyDungeonMapGet(X, Y) == '2' || KinkyDungeonMapGet(X, Y) == '0' && - (KinkyDungeonMapGet(X-1, Y) != '1' - && KinkyDungeonMapGet(X+1, Y) != '1' - && KinkyDungeonMapGet(X, Y-1) != '1' - && KinkyDungeonMapGet(X, Y+1) != '1' - && KinkyDungeonMapGet(X+1, Y+1) != '1' - && KinkyDungeonMapGet(X+1, Y-1) != '1' - && KinkyDungeonMapGet(X-1, Y+1) != '1' - && KinkyDungeonMapGet(X-1, Y-1) != '1' - ))) { - KinkyDungeonMapSet(X, Y, '?'); // Ceiling hook - } - } - } - -} - -function KinkyDungeonPlaceFurniture(barrelChance, cageChance, width, height, altType) { - // Add special stuff - if (!altType || !altType.noClutter) - for (let X = 1; X < width-1; X += 1) - for (let Y = 1; Y < height-1; Y += 1) { - if (KinkyDungeonMapGet(X, Y) == '0' && !(KinkyDungeonTilesGet(X + "," + Y) && KinkyDungeonTilesGet(X + "," + Y).OffLimits) - && (KinkyDungeonMapGet(X+1, Y) != 'd' && KinkyDungeonMapGet(X+1, Y) != 'D' - && KinkyDungeonMapGet(X-1, Y) != 'd' && KinkyDungeonMapGet(X-1, Y) != 'D' - && KinkyDungeonMapGet(X, Y+1) != 'd' && KinkyDungeonMapGet(X, Y+1) != 'D' - && KinkyDungeonMapGet(X, Y-1) != 'd' && KinkyDungeonMapGet(X, Y-1) != 'D') - && ((KDRandom() < barrelChance*4 && KinkyDungeonMapGet(X-2, Y) == '1' && KinkyDungeonMapGet(X+2, Y) == '1' && KinkyDungeonMapGet(X, Y-2) == '1' && KinkyDungeonMapGet(X, Y+2) == '1') - || (KDRandom() < barrelChance*2 && KinkyDungeonMapGet(X-1, Y-1) == '1' && KinkyDungeonMapGet(X+1, Y-1) == '1' && KinkyDungeonMapGet(X-1, Y+1) == '1' && KinkyDungeonMapGet(X-1, Y+1) == '1') - || (KDRandom() < barrelChance && KinkyDungeonMapGet(X-1, Y) == '1' && KinkyDungeonMapGet(X+1, Y) == '0' && KinkyDungeonMapGet(X+1, Y-1) == '0' && KinkyDungeonMapGet(X+1, Y+1) == '0') - || (KDRandom() < barrelChance && KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X-1, Y) == '0' && KinkyDungeonMapGet(X-1, Y-1) == '0' && KinkyDungeonMapGet(X-1, Y+1) == '0') - || (KDRandom() < barrelChance && KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X, Y+1) == '0' && KinkyDungeonMapGet(X+1, Y+1) == '0' && KinkyDungeonMapGet(X-1, Y+1) == '0') - || (KDRandom() < barrelChance && KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X, Y-1) == '0' && KinkyDungeonMapGet(X+1, Y-1) == '0' && KinkyDungeonMapGet(X-1, Y-1) == '0'))) { - KinkyDungeonMapSet(X, Y, 'L'); // Barrel - if (KDRandom() < cageChance) { - let furn = KDRandom() ? "Cage" : "DisplayStand"; - KinkyDungeonTilesSet(X + "," + Y, {Furniture: furn}); - KDGameData.JailPoints.push({x: X, y: Y, type: "furniture", radius: 1}); // , requireFurniture: true Standing in the cage alone will prevent jailbreak--good for stealth! - } - } - } -} - -let KDFood = [ - { - Food: "", - Weight: 10, - }, - { - Food: "Plate", - Weight: 1, - }, - { - Food: "Cookies", - Weight: 8, - }, - { - Food: "Pizza", - Weight: 4, - }, -]; - -function KinkyDungeonPlaceFood(foodChance, width, height, altType) { - - if (altType && altType.noClutter) return; - - let foodPoints = new Map(); - let foodList = []; - - - // Populate the chests - for (let X = 1; X < width; X += 1) - for (let Y = 1; Y < height; Y += 1) - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && Math.max(Math.abs(X - KinkyDungeonStartPosition.x), Math.abs(Y - KinkyDungeonStartPosition.y)) > KinkyDungeonJailLeash - && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits)) { - // Check the 3x3 area - let wallcount = 0; - let adjcount = 0; - let diagadj = 0; - for (let XX = X-1; XX <= X+1; XX += 1) - for (let YY = Y-1; YY <= Y+1; YY += 1) { - if (!(XX == X && YY == Y) && (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X')) { - wallcount += 1; - // Adjacent wall - if (XX == X || YY == Y) adjcount += 1; - } else if (!(XX == X && YY == Y) && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) { - if (!(XX == X || YY == Y)) {// Diagonal floor. We check the adjacent floors around the diagonals to determine if this is an alcove or a passage - if (XX == X + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X + 1, Y))) diagadj += 1; - else if (XX == X - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X - 1, Y))) diagadj += 1; - else if (YY == Y + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y + 1))) diagadj += 1; - else if (YY == Y - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y - 1))) diagadj += 1; - } - } - } - - if (wallcount == 7 - || (wallcount >= 4 && (wallcount - adjcount - diagadj == 0 || (wallcount == 5 && adjcount == 2 && diagadj == 1) || (wallcount == 6 && adjcount == 3 && diagadj == 1)) - && (KinkyDungeonMapGet(X+1, Y) == '1' || KinkyDungeonMapGet(X-1, Y) == '1') - && (KinkyDungeonMapGet(X, Y+1) == '1' || KinkyDungeonMapGet(X, Y-1) == '1') - && (!(KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X-1, Y) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)) - && (!(KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X, Y-1) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)))) { - if (!foodPoints.get((X+1) + "," + (Y)) - && !foodPoints.get((X-1) + "," + (Y)) - && !foodPoints.get((X+1) + "," + (Y+1)) - && !foodPoints.get((X+1) + "," + (Y-1)) - && !foodPoints.get((X-1) + "," + (Y+1)) - && !foodPoints.get((X-1) + "," + (Y-1)) - && !foodPoints.get((X) + "," + (Y+1)) - && !foodPoints.get((X) + "," + (Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y-1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y+1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y+1)) - && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y+1))) { - foodList.push({x:X, y:Y, boringness: KinkyDungeonBoringGet(X, Y), priority: 0}); - foodPoints.set(X + "," + Y, true); - } - } - - - }// else if (KinkyDungeonMapGet(X, Y) == "R" || KinkyDungeonMapGet(X, Y) == "r") - //foodList.push({x:X, y:Y}); - - // Truncate down to max chest count in a location-neutral way - let count = 0; - let list = []; - let maxBoringness = Math.max(...KinkyDungeonBoringness); - while (foodList.length > 0) { - let N = Math.floor(KDRandom()*foodList.length); - let chest = foodList[N]; - if (!chest.boringness) chest.boringness = KinkyDungeonBoringGet(chest.x, chest.y); - if (chest.boringness > 0) - chest.boringness = chest.boringness + (0.05 + 0.1 * KDRandom()) * maxBoringness; - else - chest.boringness = chest.boringness + 0.05 * KDRandom() * maxBoringness; - if (chest.priority) { - list.unshift(chest); - } else list.push(chest); - - foodList.splice(N, 1); - } - list.sort((a, b) => { - let boringa = a.boringness ? a.boringness : 0; - let boringb = b.boringness ? b.boringness : 0; - if (a.priority) boringa += 1000; - if (b.priority) boringb += 1000; - return boringb - boringa; - - }); - let foodcount = list.length * foodChance; - while (list.length > 0) { - let N = 0; - if (count <= foodcount) { - - let shrine = list[N]; - let tile = 'F'; - let type = undefined; - - let WeightTotal = 0; - let Weights = []; - - for (let obj of Object.values(KDFood)) { - Weights.push({event: obj, weight: WeightTotal}); - WeightTotal += obj.Weight; - } - - let selection = KDRandom() * WeightTotal; - - for (let L = Weights.length - 1; L >= 0; L--) { - if (selection > Weights[L].weight) { - type = Weights[L].event.Food; - break; - } - } - - KinkyDungeonTilesSet("" + shrine.x + "," +shrine.y, {Food: type, Type: "Food"}); - - KinkyDungeonMapSet(shrine.x, shrine.y, tile); - - count += 1; - } - list.splice(N, 1); - } -} -function KinkyDungeonPlaceTorches(torchchance, torchlitchance, torchchanceboring, width, height, altType, torchreplace) { - for (let X = 1; X < width-1; X += 1) - for (let Y = 1; Y < height-1; Y += 1) { - if (KinkyDungeonMapGet(X, Y) == '1' - && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(X, Y + 1)) - && !KinkyDungeonEffectTilesGet((X - 1) + "," + (Y+1)) - && !KinkyDungeonEffectTilesGet((X) + "," + (Y+1)) - && !KinkyDungeonEffectTilesGet((X + 1) + "," + (Y+1)) - && !KinkyDungeonTilesGet((X - 1) + "," + (Y+1)) - && !KinkyDungeonTilesGet((X) + "," + (Y+1)) - && !KinkyDungeonTilesGet((X + 1) + "," + (Y+1)) - && KDRandom() < torchchance + KinkyDungeonBoringGet(X, Y) * torchchanceboring) { - let spr = torchreplace ? torchreplace.sprite : "Torch"; - if ((!torchreplace || torchreplace.unlitsprite) && KDRandom() > torchlitchance) { - spr = torchreplace ? torchreplace.unlitsprite : "TorchUnlit"; - } - let torchref = { - name: spr, - duration: 9999, - }; - KDCreateEffectTile(X, Y + 1, torchref, 0); - } - } -} - -/** - * Replace vertical wall '1' with '|' - * @param {number} width - * @param {number} height - */ -function KinkyDungeonReplaceVert(width, height) { - for (let X = 0; X <= width-1; X += 1) - for (let Y = 0; Y <= height-1; Y += 1) { - let tileUp = KinkyDungeonMapGet(X, Y); - let tileBelow = KinkyDungeonMapGet(X, Y + 1); - if ( - ( // These are the tiles that get replaced - tileUp == '1' - || tileUp == '4' - ) && ( // These are the tiles that trigger a replacement - tileBelow == '1' - || tileBelow == '4' - || tileBelow == 'd' - || tileBelow == 'D' - || tileBelow == ',' - )) { - // meep - } - //if (tileUp == '4') - //KinkyDungeonMapSetForce(X, Y, '\\'); - //else - //KinkyDungeonMapSetForce(X, Y, '|'); - } -} - - -function KinkyDungeonMazeWalls(Cell, Walls, WallsList) { - if (Walls[(Cell.x+1) + "," + Cell.y]) WallsList[(Cell.x+1) + "," + Cell.y] = {x:Cell.x+1, y:Cell.y}; - if (Walls[(Cell.x-1) + "," + Cell.y]) WallsList[(Cell.x-1) + "," + Cell.y] = {x:Cell.x-1, y:Cell.y}; - if (Walls[Cell.x + "," + (Cell.y+1)]) WallsList[Cell.x + "," + (Cell.y+1)] = {x:Cell.x, y:Cell.y+1}; - if (Walls[Cell.x + "," + (Cell.y-1)]) WallsList[Cell.x + "," + (Cell.y-1)] = {x:Cell.x, y:Cell.y-1}; -} - -function KinkyDungeonMapSet(X, Y, SetTo, VisitedRooms) { - let height = KinkyDungeonGridHeight; - let width = KinkyDungeonGridWidth; - - if (X > 0 && X < width-1 && Y > 0 && Y < height-1) { - KinkyDungeonGrid = KinkyDungeonGrid.replaceAt(X + Y*(width+1), SetTo); - if (VisitedRooms) - VisitedRooms.push({x: X, y: Y}); - return true; - } - return false; -} -function KinkyDungeonMapSetForce(X, Y, SetTo, VisitedRooms) { - let width = KinkyDungeonGridWidth; - - KinkyDungeonGrid = KinkyDungeonGrid.replaceAt(X + Y*(width+1), SetTo); - if (VisitedRooms) - VisitedRooms.push({x: X, y: Y}); - return true; - -} - - -function KinkyDungeonBoringGet(X, Y) { - return KinkyDungeonBoringness[X + Y*(KinkyDungeonGridWidth)]; -} - -function KinkyDungeonBoringSet(X, Y, SetTo) { - if (X >= 0 && X <= KinkyDungeonGridWidth-1 && Y >= 0 && Y <= KinkyDungeonGridHeight-1) { - KinkyDungeonBoringness[X + Y*(KinkyDungeonGridWidth)] = SetTo; - return true; - } - return false; -} - -function KinkyDungeonMapGet(X, Y) { - //let height = KinkyDungeonGrid.split('\n').length; - //let width = //KinkyDungeonGrid.split('\n')[0].length; - - return KinkyDungeonGrid[X + Y*(KinkyDungeonGridWidth+1)]; -} - -function KinkyDungeonVisionSet(X, Y, SetTo) { - if (X >= 0 && X <= KinkyDungeonGridWidth-1 && Y >= 0 && Y <= KinkyDungeonGridHeight-1) { - KinkyDungeonVisionGrid[X + Y*(KinkyDungeonGridWidth)] = SetTo; - return true; - } - return false; -} - -function KinkyDungeonBrightnessSet(X, Y, SetTo, monotonic) { - if (X >= 0 && X <= KinkyDungeonGridWidth-1 && Y >= 0 && Y <= KinkyDungeonGridHeight-1) { - if (!monotonic || SetTo > KinkyDungeonBrightnessGrid[X + Y*(KinkyDungeonGridWidth)]) - KinkyDungeonBrightnessGrid[X + Y*(KinkyDungeonGridWidth)] = SetTo; - return true; - } - return false; -} - -function KinkyDungeonColorSet(X, Y, SetTo, monotonic) { - if (X >= 0 && X <= KinkyDungeonGridWidth-1 && Y >= 0 && Y <= KinkyDungeonGridHeight-1) { - if (!monotonic || SetTo > KinkyDungeonColorGrid[X + Y*(KinkyDungeonGridWidth)]) - KinkyDungeonColorGrid[X + Y*(KinkyDungeonGridWidth)] = SetTo; - return true; - } - return false; -} -function KinkyDungeonShadowSet(X, Y, SetTo, monotonic) { - if (X >= 0 && X <= KinkyDungeonGridWidth-1 && Y >= 0 && Y <= KinkyDungeonGridHeight-1) { - if (!monotonic || SetTo > KinkyDungeonShadowGrid[X + Y*(KinkyDungeonGridWidth)]) - KinkyDungeonShadowGrid[X + Y*(KinkyDungeonGridWidth)] = SetTo; - return true; - } - return false; -} - -function KinkyDungeonVisionGet(X, Y) { - return KinkyDungeonVisionGrid[X + Y*(KinkyDungeonGridWidth)]; -} - -function KinkyDungeonBrightnessGet(X, Y) { - return KinkyDungeonBrightnessGrid[X + Y*(KinkyDungeonGridWidth)]; -} -function KinkyDungeonColorGet(X, Y) { - return KinkyDungeonColorGrid[X + Y*(KinkyDungeonGridWidth)]; -} -function KinkyDungeonShadowGet(X, Y) { - return KinkyDungeonShadowGrid[X + Y*(KinkyDungeonGridWidth)]; -} - -function KinkyDungeonFogGet(X, Y) { - return KinkyDungeonFogGrid[X + Y*(KinkyDungeonGridWidth)]; -} - -let canvasOffsetX = 0; -let canvasOffsetY = 0; -const canvasOffsetX_ui = 500; -const canvasOffsetY_ui = 164; - -// returns an object containing coordinates of which direction the player will move after a click, plus a time multiplier -function KinkyDungeonGetDirection(dx, dy) { - - let X = 0; - let Y = 0; - - if (Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5) - return {x:0, y:0, delta:1}; - - // Cardinal directions first - up down left right - if (dy > 0 && Math.abs(dx) < Math.abs(dy)/2.61312593) Y = 1; - else if (dy < 0 && Math.abs(dx) < Math.abs(dy)/2.61312593) Y = -1; - else if (dx > 0 && Math.abs(dy) < Math.abs(dx)/2.61312593) X = 1; - else if (dx < 0 && Math.abs(dy) < Math.abs(dx)/2.61312593) X = -1; - - // Diagonals - else if (dy > 0 && dx > dy/2.61312593) {Y = 1; X = 1;} - else if (dy > 0 && -dx > dy/2.61312593) {Y = 1; X = -1;} - else if (dy < 0 && dx > -dy/2.61312593) {Y = -1; X = 1;} - else if (dy < 0 && -dx > -dy/2.61312593) {Y = -1; X = -1;} - - return {x:X, y:Y, delta:Math.round(Math.sqrt(X*X+Y*Y)*2)/2}; // Delta is always in increments of 0.5 -} - -// GetDirection, but it also pivots randomly 45 degrees to either side -function KinkyDungeonGetDirectionRandom(dx, dy) { - let dir = KinkyDungeonGetDirection(dx, dy); - let pivot = Math.floor(KDRandom()*3)-1; - - if (dir.x == 0 && dir.y == 1) dir.x = pivot; - else if (dir.x == 0 && dir.y == -1) dir.x = -pivot; - else if (dir.x == 1 && dir.y == 0) dir.y = pivot; - else if (dir.x == -1 && dir.y == 0) dir.y = -pivot; - else if (dir.x == 1 && dir.y == 1) {if (pivot == 1) {dir.y = 0;} else if (pivot == -1) {dir.x = 0;}} - else if (dir.x == 1 && dir.y == -1) {if (pivot == 1) {dir.x = 0;} else if (pivot == -1) {dir.y = 0;}} - else if (dir.x == -1 && dir.y == 1) {if (pivot == 1) {dir.x = 0;} else if (pivot == -1) {dir.y = 0;}} - else if (dir.x == -1 && dir.y == -1) {if (pivot == 1) {dir.y = 0;} else if (pivot == -1) {dir.x = 0;}} - - dir.delta = Math.round(Math.sqrt(dir.x*dir.x+dir.y*dir.y)*2)/2; - return dir; // Delta is always in increments of 0.5 -} - - -let KinkyDungeonAutoWaitSuppress = false; - -function KinkyDungeonControlsEnabled() { - return !KinkyDungeonInspect && KinkyDungeonSlowMoveTurns < 1 && KinkyDungeonStatFreeze < 1 && KDGameData.SleepTurns < 1 && !KDGameData.CurrentDialog && !KinkyDungeonMessageToggle; -} - -function KDStartSpellcast(tx, ty, SpellToCast, enemy, player, bullet, data) { - let spell = KinkyDungeonFindSpell(SpellToCast.name, true); - let spellname = undefined; - if (spell) { - spellname = spell.name; - spell = undefined; - } else spell = SpellToCast; - return KDSendInput("tryCastSpell", {tx: tx, ty: ty, spell: spell, spellname: spellname, enemy: enemy, player: player, bullet: bullet, ...data}); -} - -// Click function for the game portion -// @ts-ignore -// @ts-ignore -// @ts-ignore -function KinkyDungeonClickGame(Level) { - let _CharacterRefresh = CharacterRefresh; - let _CharacterAppearanceBuildCanvas = CharacterAppearanceBuildCanvas; - // @ts-ignore - CharacterRefresh = () => {KDRefresh = true;}; - // @ts-ignore - CharacterAppearanceBuildCanvas = () => {}; - - // First we handle buttons - let prevSpell = KinkyDungeonTargetingSpell; - let prevInv = KinkyDungeonShowInventory; - if (KDGameData.CurrentDialog) { - let result = false; - try { - result = KDHandleDialogue(); - } finally { - // @ts-ignore - CharacterRefresh = _CharacterRefresh; - // @ts-ignore - CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; - // Done, converted to input - } - return result; - } - if (KinkyDungeonControlsEnabled() && KinkyDungeonHandleHUD()) { - try { - if (prevSpell) { - if (prevInv) KDCloseQuickInv(); - else KinkyDungeonTargetingSpell = null; - } - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - KinkyDungeonGameKey.keyPressed = [ - false, - false, - false, - false, - false, - false, - false, - false, - ]; - if (KinkyDungeonAutoWaitSuppress) KinkyDungeonAutoWaitSuppress = false; - else if (KDIsAutoAction()) { - KDDisableAutoWait(); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Damage.ogg"); - } - } finally { - // @ts-ignore - CharacterRefresh = _CharacterRefresh; - // @ts-ignore - CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; - } - return; - } - // beep - else if (KDIsAutoAction() && MouseIn(canvasOffsetX, canvasOffsetY, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height)) { - KDDisableAutoWait(); - - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Damage.ogg"); - } - // If no buttons are clicked then we handle move - else if (KinkyDungeonControlsEnabled() && KinkyDungeonDrawState == "Game") { - try { - - if (KDModalArea || KinkyDungeonTargetTile) { - KDModalArea = false; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - } else { - KinkyDungeonSetMoveDirection(); - - if (KinkyDungeonTargetingSpell) { - if (MouseIn(canvasOffsetX, canvasOffsetY, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height)) { - if (KinkyDungeoCheckComponents(KinkyDungeonTargetingSpell).length == 0 || ( - (KinkyDungeonStatsChoice.get("Slayer") && KinkyDungeonTargetingSpell.school == "Elements") - || (KinkyDungeonStatsChoice.get("Conjurer") && KinkyDungeonTargetingSpell.school == "Conjure") - || (KinkyDungeonStatsChoice.get("Magician") && KinkyDungeonTargetingSpell.school == "Illusion"))) { - if (KinkyDungeonSpellValid) { - KDStartSpellcast(KinkyDungeonTargetX, KinkyDungeonTargetY, KinkyDungeonTargetingSpell, undefined, KinkyDungeonPlayerEntity, undefined, {targetingSpellItem: KinkyDungeonTargetingSpellItem, targetingSpellWeapon: KinkyDungeonTargetingSpellWeapon}); - - KinkyDungeonTargetingSpell = null; - } - } else KinkyDungeonTargetingSpell = null; - } else KinkyDungeonTargetingSpell = null; - } else if (KinkyDungeonIsPlayer() && MouseIn(canvasOffsetX, canvasOffsetY, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height)) { - let fastMove = KinkyDungeonFastMove && !KinkyDungeonToggleAutoSprint; - if (fastMove && Math.max(Math.abs(KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x), Math.abs(KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y)) > 1 - && (KinkyDungeonVisionGet(KinkyDungeonTargetX, KinkyDungeonTargetY) > 0 || KinkyDungeonFogGet(KinkyDungeonTargetX, KinkyDungeonTargetY) > 0 || KDistChebyshev(KinkyDungeonPlayerEntity.x - KinkyDungeonTargetX, KinkyDungeonPlayerEntity.y - KinkyDungeonTargetY) < 1.5)) { - let requireLight = KinkyDungeonVisionGet(KinkyDungeonTargetX, KinkyDungeonTargetY) > 0; - let path = KinkyDungeonFindPath(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonTargetX, KinkyDungeonTargetY, false, false, false, KinkyDungeonMovableTilesEnemy, requireLight, false, true); - if (path) { - KinkyDungeonFastMovePath = path; - KinkyDungeonSleepTime = 100; - } - } else if (!fastMove || Math.max(Math.abs(KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x), Math.abs(KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y)) <= 1) { - KDSendInput("move", {dir: KinkyDungeonMoveDirection, delta: 1, AllowInteract: true, AutoDoor: KinkyDungeonToggleAutoDoor, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}); - } - } - } - } finally { - // @ts-ignore - CharacterRefresh = _CharacterRefresh; - // @ts-ignore - CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; - } - } - - // @ts-ignore - CharacterRefresh = _CharacterRefresh; - // @ts-ignore - CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; - return; -} - -function KinkyDungeonGetMovable() { - let MovableTiles = KinkyDungeonMovableTiles; - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Squeeze") > 0) MovableTiles = MovableTiles + "b"; - return MovableTiles; -} - -function KinkyDungeonListenKeyMove() { - if (KinkyDungeonLastMoveTimer < performance.now() && KinkyDungeonControlsEnabled() && KinkyDungeonDrawState == "Game" && !KDModalArea) { - let moveDirection = null; - let moveDirectionDiag = null; - - let MovableTiles = KinkyDungeonGetMovable(); - - if ((KinkyDungeonGameKey.keyPressed[0]) && MovableTiles.includes(KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y - 1))) moveDirection = KinkyDungeonGetDirection(0, -1); - else if ((KinkyDungeonGameKey.keyPressed[1]) && MovableTiles.includes(KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y + 1))) moveDirection = KinkyDungeonGetDirection(0, 1); - else if ((KinkyDungeonGameKey.keyPressed[2]) && MovableTiles.includes(KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x - 1, KinkyDungeonPlayerEntity.y))) moveDirection = KinkyDungeonGetDirection(-1, 0); - else if ((KinkyDungeonGameKey.keyPressed[3]) && MovableTiles.includes(KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x + 1, KinkyDungeonPlayerEntity.y))) moveDirection = KinkyDungeonGetDirection(1, 0); - // Diagonal moves - if ((KinkyDungeonGameKey.keyPressed[4]) || (KinkyDungeonGameKey.keyPressed[2] && KinkyDungeonGameKey.keyPressed[0])) moveDirectionDiag = KinkyDungeonGetDirection(-1, -1); - else if ((KinkyDungeonGameKey.keyPressed[5]) || (KinkyDungeonGameKey.keyPressed[3] && KinkyDungeonGameKey.keyPressed[0])) moveDirectionDiag = KinkyDungeonGetDirection(1, -1); - else if ((KinkyDungeonGameKey.keyPressed[6]) || (KinkyDungeonGameKey.keyPressed[2] && KinkyDungeonGameKey.keyPressed[1])) moveDirectionDiag = KinkyDungeonGetDirection(-1, 1); - else if ((KinkyDungeonGameKey.keyPressed[7]) || (KinkyDungeonGameKey.keyPressed[3] && KinkyDungeonGameKey.keyPressed[1])) moveDirectionDiag = KinkyDungeonGetDirection(1, 1); - - if ((KinkyDungeonGameKey.keyPressed[8])) {moveDirection = KinkyDungeonGetDirection(0, 0); moveDirectionDiag = null;} - - if (moveDirectionDiag && MovableTiles.includes(KinkyDungeonMapGet(moveDirectionDiag.x + KinkyDungeonPlayerEntity.x, moveDirectionDiag.y + KinkyDungeonPlayerEntity.y))) { - moveDirection = moveDirectionDiag; - } - - if (moveDirection) { - if (KinkyDungeonLastMoveTimerStart < performance.now() && KinkyDungeonLastMoveTimerStart > 0) { - - let _CharacterRefresh = CharacterRefresh; - let _CharacterAppearanceBuildCanvas = CharacterAppearanceBuildCanvas; - // @ts-ignore - CharacterRefresh = () => {KDRefresh = true;}; - // @ts-ignore - CharacterAppearanceBuildCanvas = () => {}; - - try { - KDSendInput("move", {dir: moveDirection, delta: 1, AllowInteract: KinkyDungeonLastMoveTimer == 0, AutoDoor: KinkyDungeonToggleAutoDoor, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: false}); - KinkyDungeonLastMoveTimer = performance.now() + KinkyDungeonLastMoveTimerCooldown; - } finally { - // @ts-ignore - CharacterRefresh = _CharacterRefresh; - // @ts-ignore - CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; - } - } else if (KinkyDungeonLastMoveTimerStart == 0) { - KinkyDungeonLastMoveTimerStart = performance.now()+ KinkyDungeonLastMoveTimerCooldownStart; - } - - - } - } - if (KinkyDungeonLastMoveTimerStart < performance.now() && KinkyDungeonLastMoveTimer == 0) KinkyDungeonLastMoveTimerStart = 0; - if (!KinkyDungeonGameKey.keyPressed.some((element)=>{return element;})) { KinkyDungeonLastMoveTimer = 0;} -} - -let KDShopBuyConfirm = false; - -function KinkyDungeonGameKeyDown() { - let moveDirection = null; - - for (let keybinding of Object.values(KDKeyCheckers)) { - if (keybinding()) return true; - } - KDShopBuyConfirm = false; - - if (KinkyDungeonState == "TileEditor") { - if (KinkyDungeonKey[0] == KinkyDungeonKeybindingCurrentKey) { - KDClickButton("maptileU"); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } else if (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey) { - KDClickButton("maptileL"); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } else if (KinkyDungeonKey[2] == KinkyDungeonKeybindingCurrentKey) { - KDClickButton("maptileD"); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } else if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey) { - KDClickButton("maptileR"); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } - } - - if (KDGameData.CurrentDialog) return; - if (!KinkyDungeonControlsEnabled()) return; - - - if (moveDirection && KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game") { - KDSendInput("move", {dir: moveDirection, delta: 1, AutoDoor: KinkyDungeonToggleAutoDoor, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: false}); - return true; - // @ts-ignore - } else if (KinkyDungeonKeySpell.includes(KinkyDungeonKeybindingCurrentKey)) { - if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Magic") { - if (KinkyDungeonSpellChoices.includes(KinkyDungeonCurrentPage)) { - KDSendInput("spellRemove", {I:KinkyDungeonSpellChoices.indexOf(KinkyDungeonCurrentPage)}); - } - KinkyDungeonClickSpellChoice(KinkyDungeonKeySpell.indexOf(KinkyDungeonKeybindingCurrentKey), KinkyDungeonCurrentPage); - } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game") { - // @ts-ignore - KinkyDungeonSpellPress = KinkyDungeonKeybindingCurrentKey; - KinkyDungeonHandleSpell(); - } - return true; - } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonKeyWeapon.includes(KinkyDungeonKeybindingCurrentKey)) { - // @ts-ignore - KinkyDungeonSpellPress = KinkyDungeonKeybindingCurrentKey; - KinkyDungeonRangedAttack(); - return true; - } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonKeyUpcast.includes(KinkyDungeonKeybindingCurrentKey)) { - // @ts-ignore - if (KinkyDungeonKeybindingCurrentKey == KinkyDungeonKeyUpcast[0]) { - KDSendInput("upcast", {}); - } else { - KDSendInput("upcastcancel", {}); - } - return true; - } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonKeySprint.includes(KinkyDungeonKeybindingCurrentKey)) { - KinkyDungeonToggleAutoSprint = !KinkyDungeonToggleAutoSprint; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonKeySpellPage.includes(KinkyDungeonKeybindingCurrentKey)) { - KDCycleSpellPage(); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonKeySwitchWeapon.includes(KinkyDungeonKeybindingCurrentKey)) { - KDSwitchWeapon(); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } else if (KinkyDungeonState == "Stats") { - if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey) { - KDClickButton("perks>"); - } else if (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey) { - KDClickButton("perks<"); - } - } else if (KinkyDungeonDrawState != "Restart" && KinkyDungeonDrawState != "Keybindings" && KinkyDungeonDrawState != "Perks2") { - if (KinkyDungeonDrawState == "Inventory" && (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey)) { - if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey) { - KinkyDungeonCurrentPageInventory += 1; - } else if (KinkyDungeonCurrentPageInventory > 0) { - KinkyDungeonCurrentPageInventory -= 1; - } else if (KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey) { - KinkyDungeonDrawState = "Game"; - } - } else if (KinkyDungeonDrawState == "Magic" && (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey)) { - if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey) { - KinkyDungeonCurrentPage += 1; - if (KinkyDungeonCurrentPage >= KinkyDungeonSpells.length) { - KinkyDungeonCurrentPage = 0; - } - } else if (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey && KinkyDungeonCurrentPage > 0) { - KinkyDungeonCurrentPage -= 1; - } else if (KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey) { - if (KinkyDungeonPreviewSpell) { - if (KinkyDungeonPreviewSpell.hideLearned) KinkyDungeonDrawState = "MagicSpells"; - KDSendInput("spellLearn", {SpellName: KinkyDungeonPreviewSpell.name}); - } - else KinkyDungeonDrawState = "MagicSpells"; - } - } else if (KinkyDungeonDrawState == "MagicSpells" && (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey)) { - if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey) { - KinkyDungeonCurrentSpellsPage += 1; - if (KinkyDungeonCurrentSpellsPage >= KinkyDungeonLearnableSpells.length) KinkyDungeonCurrentSpellsPage = 0; - } else if (KinkyDungeonCurrentSpellsPage > 0) { - KinkyDungeonCurrentSpellsPage -= 1; - } else if (KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey) { - KinkyDungeonDrawState = "Game"; - } - } else - if (KinkyDungeonKeyMenu.includes(KinkyDungeonKeybindingCurrentKey)) { - switch (KinkyDungeonKeybindingCurrentKey) { - // QuikInv, Inventory, Reputation, Magic, Log - case KinkyDungeonKeyMenu[0]: KinkyDungeonShowInventory = !KinkyDungeonShowInventory; break; - case KinkyDungeonKeyMenu[1]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Inventory" ? "Game" : "Inventory"; break; - case KinkyDungeonKeyMenu[2]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Reputation" ? "Game" : "Reputation"; break; - case KinkyDungeonKeyMenu[3]: KinkyDungeonDrawState = KinkyDungeonDrawState == "MagicSpells" ? "Game" : "MagicSpells"; break; - case KinkyDungeonKeyMenu[4]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Logbook" ? "Game" : "Logbook"; break; - } - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } - } - KinkyDungeonKeybindingCurrentKey = ''; - return false; -} - - -function KinkyDungeonGameKeyUp(lastPress) { - //if (KDGameData.CurrentDialog) return; - //if (!KinkyDungeonControlsEnabled()) return; - let delta = CommonTime() - lastPress; - - // Holding for a minute = fail - if (delta > 60000) return; - // tap = fail - if (delta < 250) return; - - if (KinkyDungeonState == "Game") { - if (document.activeElement) { - if (KinkyDungeonKeySpell.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { - if (KinkyDungeonDrawState == "Game") { - KinkyDungeonTargetingSpell = null; - } - return true; - } else if (KinkyDungeonDrawState == "Game" && KinkyDungeonKeyWeapon.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { - KinkyDungeonTargetingSpell = null; - return true; - } else if (KinkyDungeonDrawState == "Game" && KinkyDungeonKeySprint.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { - KinkyDungeonToggleAutoSprint = !KinkyDungeonToggleAutoSprint; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } else if (KinkyDungeonDrawState == "Game" && KinkyDungeonKeySpellPage.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { - KDCycleSpellPage(true); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } else if (KinkyDungeonDrawState == "Game" && KinkyDungeonKeySwitchWeapon.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { - KDSwitchWeapon(); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } - } - if (KinkyDungeonKeyMenu.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { - switch (KinkyDungeonKeybindingCurrentKeyRelease) { - // QuikInv, Inventory, Reputation, Magic, Log - case KinkyDungeonKeyMenu[0]: KinkyDungeonShowInventory = !KinkyDungeonShowInventory; break; - case KinkyDungeonKeyMenu[1]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Inventory" ? "Game" : "Inventory"; break; - case KinkyDungeonKeyMenu[2]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Reputation" ? "Game" : "Reputation"; break; - case KinkyDungeonKeyMenu[3]: KinkyDungeonDrawState = KinkyDungeonDrawState == "MagicSpells" ? "Game" : "MagicSpells"; break; - case KinkyDungeonKeyMenu[4]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Logbook" ? "Game" : "Logbook"; break; - } - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } else if (KinkyDungeonKeyToggle.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { - switch (KinkyDungeonKeybindingCurrentKeyRelease) { - // Log, Passing, Door, Auto Struggle, Auto Pathfind - case KinkyDungeonKeyToggle[0]: KinkyDungeonMessageToggle = !KinkyDungeonMessageToggle; break; - case KinkyDungeonKeyToggle[1]: KinkyDungeonToggleAutoPass = !KinkyDungeonToggleAutoPass; break; - case KinkyDungeonKeyToggle[2]: KinkyDungeonToggleAutoDoor = !KinkyDungeonToggleAutoDoor; break; - case KinkyDungeonKeyToggle[3]: KDAutoStruggleClick(); break; - case KinkyDungeonKeyToggle[4]: KinkyDungeonFastMove = !KinkyDungeonFastMove; break; - case KinkyDungeonKeyToggle[5]: KinkyDungeonInspect = !KinkyDungeonInspect; break; - } - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } - } - - KinkyDungeonKeybindingCurrentKey = ''; - return false; -} - -function KinkyDungeonSendTextMessage(priority, text, color, time, noPush, noDupe, entity) { - if (entity && KinkyDungeonVisionGet(entity.x, entity.y) < 1) return false; - if (text) { - if (!noPush) - if (!noDupe || KinkyDungeonMessageLog.length == 0 || !KinkyDungeonMessageLog[KinkyDungeonMessageLog.length-1] || text != KinkyDungeonMessageLog[KinkyDungeonMessageLog.length-1].text) { - if (KDLogIndex > 0) KDLogIndex += 1; - KinkyDungeonMessageLog.push({text: text, color: color, time: KinkyDungeonCurrentTick}); - } - - if ( priority >= KinkyDungeonTextMessagePriority || KinkyDungeonActionMessageTime < 0.5) { - KinkyDungeonTextMessageTime = time; - KinkyDungeonTextMessage = text; - KinkyDungeonTextMessageColor = color; - KinkyDungeonTextMessagePriority = priority; - KinkyDungeonTextMessageNoPush = noPush; - return true; - } - } - return false; -} - - -function KinkyDungeonSendActionMessage(priority, text, color, time, noPush, noDupe, entity) { - if (entity && KinkyDungeonVisionGet(entity.x, entity.y) < 1) return false; - if (text) { - if (!noPush) - if (!noDupe || KinkyDungeonMessageLog.length == 0 || !KinkyDungeonMessageLog[KinkyDungeonMessageLog.length-1] || text != KinkyDungeonMessageLog[KinkyDungeonMessageLog.length-1].text){ - if (KDLogIndex > 0) KDLogIndex += 1; - KinkyDungeonMessageLog.push({text: text, color: color, time: KinkyDungeonCurrentTick}); - } - if ( priority >= KinkyDungeonActionMessagePriority || KinkyDungeonActionMessageTime < 0.5) { - KinkyDungeonActionMessageTime = time; - KinkyDungeonActionMessage = text; - KinkyDungeonActionMessageColor = color; - KinkyDungeonActionMessagePriority = priority; - KinkyDungeonActionMessageNoPush = noPush; - return true; - } - } - return false; -} - -let KinkyDungeonNoMoveFlag = false; - -function KDAttackCost() { - let attackCost = KinkyDungeonStatStaminaCostAttack; - if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.staminacost) attackCost = -KinkyDungeonPlayerDamage.staminacost; - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackStamina")) { - attackCost = Math.min(0, attackCost * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackStamina"))); - } - return attackCost; -} - -function KinkyDungeonLaunchAttack(Enemy, skip) { - let attackCost = KDAttackCost(); - let capture = false; - - if (Enemy && KDHelpless(Enemy) && Enemy.hp < 0.52) { - attackCost = 0; - capture = true; - } - let noadvance = false; - if (KinkyDungeonHasStamina(Math.abs(attackCost), true)) { - if (!KDGameData.ConfirmAttack && (!KinkyDungeonAggressive(Enemy) || KDAllied(Enemy)) && !(Enemy.playWithPlayer && KDCanDom(Enemy))) { - if ((!Enemy.lifetime || Enemy.lifetime > 9000) && !Enemy.Enemy.tags.notalk) { // KDAllied(Enemy) - let d = Enemy.Enemy.specialdialogue ? Enemy.Enemy.specialdialogue : "GenericAlly"; - if (Enemy.specialdialogue) d = Enemy.specialdialogue; // Special dialogue override - KDStartDialog(d, Enemy.Enemy.name, true, Enemy.personality, Enemy); - noadvance = true; - } - /*} else if (KDEnemyHasFlag(Enemy, "Shop")) { - for (let shop of KDShops) { - if (KDEnemyHasFlag(Enemy, shop.name)) { - KDStartDialog(shop.name, Enemy.Enemy.name, true, Enemy.personality, Enemy); - noadvance = true; - break; - } - } - if (!KDGameData.CurrentDialog) { - KinkyDungeonSendActionMessage(10, TextGet("KDGameData.ConfirmAttack"), "#ff0000", 1); - KDGameData.ConfirmAttack = true; - noadvance = true; - } - }*/ - else { - KinkyDungeonSendActionMessage(10, TextGet("KDGameData.ConfirmAttack"), "#ff0000", 1); - KDGameData.ConfirmAttack = true; - noadvance = true; - } - - } else { - if (!capture) { - if (attackCost < 0 && KinkyDungeonStatsChoice.has("BerserkerRage")) { - KinkyDungeonChangeDistraction(0.7 - 0.5 * attackCost, false, 0.33); - } - KinkyDungeonAttackEnemy(Enemy, { - damage: KinkyDungeonPlayerDamage.dmg, - type: KinkyDungeonPlayerDamage.type, - distract: KinkyDungeonPlayerDamage.distract, - distractEff: KinkyDungeonPlayerDamage.distractEff, - bind: KinkyDungeonPlayerDamage.bind, - bindType: KinkyDungeonPlayerDamage.bindType, - bindEff: KinkyDungeonPlayerDamage.bindEff, - boundBonus: KinkyDungeonPlayerDamage.boundBonus, - novulnerable: KinkyDungeonPlayerDamage.novulnerable, - tease: KinkyDungeonPlayerDamage.tease}); - - KinkyDungeonChangeStamina(attackCost, false, 1); - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "attack", 1); - } else { - KinkyDungeonAggro(Enemy, undefined, KinkyDungeonPlayerEntity); - Enemy.hp = 0; - KinkyDungeonKilledEnemy = Enemy; - KinkyDungeonSendEvent("capture", {enemy: Enemy, attacker: KinkyDungeonPlayerEntity, skip: skip}); - KinkyDungeonChangeStamina(attackCost, false, 1); - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "capture", 1); - } - - KinkyDungeonLastAction = "Attack"; - KDGameData.ConfirmAttack = false; - } - } else { - KinkyDungeonWaitMessage(); - } - - if (!noadvance) { - KinkyDungeonInterruptSleep(); - if (!skip) - KinkyDungeonAdvanceTime(1); - } -} - -function KinkyDungeonMove(moveDirection, delta, AllowInteract, SuppressSprint) { - let moveX = moveDirection.x + KinkyDungeonPlayerEntity.x; - let moveY = moveDirection.y + KinkyDungeonPlayerEntity.y; - let moved = false; - let Enemy = KinkyDungeonEnemyAt(moveX, moveY); - let passThroughSprint = false; - let nextPosX = moveX*2-KinkyDungeonPlayerEntity.x; - let nextPosY = moveY*2-KinkyDungeonPlayerEntity.y; - let nextTile = KinkyDungeonMapGet(nextPosX, nextPosY); - if (KinkyDungeonMovableTilesEnemy.includes(nextTile) && KinkyDungeonNoEnemy(nextPosX, nextPosY) && KinkyDungeonToggleAutoSprint) { - let data = { - canSprint: KDCanSprint(), - passThru: false, - nextPosx: moveX, - nextPosy: moveY, - }; - KinkyDungeonSendEvent("canSprint", data); - if (data.canSprint && data.passThru) { - passThroughSprint = true; - } - } - - let allowPass = Enemy - && KDCanPassEnemy(KinkyDungeonPlayerEntity, Enemy); - if (Enemy && !allowPass && !passThroughSprint) { - if (AllowInteract) { - KDDelayedActionPrune(["Action", "Attack"]); - KinkyDungeonLaunchAttack(Enemy); - } - } else { - let MovableTiles = KinkyDungeonGetMovable(); - let moveObject = KinkyDungeonMapGet(moveX, moveY); - if (MovableTiles.includes(moveObject) && (passThroughSprint || KinkyDungeonNoEnemy(moveX, moveY) || (Enemy && Enemy.allied) || allowPass)) { // If the player can move to an empy space or a door - KDGameData.ConfirmAttack = false; - let quick = false; - - if (KinkyDungeonTilesGet("" + moveX + "," + moveY) - && KinkyDungeonTilesGet("" + moveX + "," + moveY).Type - && ( - (KinkyDungeonToggleAutoDoor - && moveObject == 'd' - && KinkyDungeonTargetTile == null - && KinkyDungeonNoEnemy(moveX, moveY, true)) - || ( - ( - KDObjectDraw[KinkyDungeonTilesGet("" + moveX + "," + moveY).Type] - || KDObjectClick[KinkyDungeonTilesGet("" + moveX + "," + moveY).Type] - ) - && (KinkyDungeonTilesGet("" + moveX + "," + moveY).Type != "Door" - || (KinkyDungeonTilesGet("" + moveX + "," + moveY).Lock - && KinkyDungeonTilesGet("" + moveX + "," + moveY).Type == "Door"))))) { - if (AllowInteract) { - if (KDObjectClick[KinkyDungeonTilesGet("" + moveX + "," + moveY).Type]) { - KDObjectClick[KinkyDungeonTilesGet("" + moveX + "," + moveY).Type](moveX, moveY); - } else { - KDDelayedActionPrune(["Action", "World"]); - KinkyDungeonTargetTileLocation = "" + moveX + "," + moveY; - KinkyDungeonTargetTile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); - if (moveObject == 'd') { - KinkyDungeonCloseDoor({targetTile: KinkyDungeonTargetTileLocation}); - } else { - KinkyDungeonTargetTileMsg(); - } - } - } - } else if (moveX != KinkyDungeonPlayerEntity.x || moveY != KinkyDungeonPlayerEntity.y) { - KDDelayedActionPrune(["Action", "Move"]); - let newDelta = 1; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - if (!KinkyDungeonHandleMoveObject(moveX, moveY, moveObject)) {// Move - // We can pick up items inside walls, in case an enemy drops it into bars - KinkyDungeonItemCheck(moveX, moveY, MiniGameKinkyDungeonLevel); - KinkyDungeonNoMoveFlag = false; - KinkyDungeonConfirmStairs = false; - KinkyDungeonSendEvent("beforeMove", {x:moveX, y:moveY}); - if (!KinkyDungeonNoMoveFlag) { - //if (KinkyDungeonHasStamina(0)) { // You can only move if your stamina is > 0 - KinkyDungeonMovePoints = Math.min(Math.ceil(KinkyDungeonSlowLevel + 1), KinkyDungeonMovePoints + delta); // Can't store extra move points - - if (KinkyDungeonFlags.has("Quickness") && KinkyDungeonSlowLevel < 9) { - KinkyDungeonMovePoints = 1; - quick = true; - } - - if (KinkyDungeonStatBind) KinkyDungeonMovePoints = 0; - - if (KinkyDungeonMovePoints >= 1) {// Math.max(1, KinkyDungeonSlowLevel) // You need more move points than your slow level, unless your slow level is 1 - if (Enemy && allowPass) { - KDMoveEntity(Enemy, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true,undefined, undefined, true); - if (KinkyDungeonFlags.has("Passthrough")) - KinkyDungeonSetFlag("Passthrough", 2); - } - newDelta = Math.max(newDelta, KinkyDungeonMoveTo(moveX, moveY, SuppressSprint)); - KinkyDungeonLastAction = "Move"; - moved = true; - if (KDToggles.Sound) { - if (quick) { - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Miss.ogg"); - } else { - if (moveObject == 'w') - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/FootstepWater.ogg"); - else KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Footstep.ogg"); - } - - } - - if (moveObject == 'g') { - KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonGrateEnter"), "white", 3); - KinkyDungeonSlowMoveTurns = Math.max(KinkyDungeonSlowMoveTurns, 1); - KDGameData.SleepTurns = CommonTime() + 250; - } - } - - // Messages to inform player they are slowed - let plugLevel = Math.round(Math.min(3, KinkyDungeonStatPlugLevel)); - let dict = KinkyDungeonPlugCount > 1 ? "plugs" : "plug"; - let dicts = KinkyDungeonPlugCount > 1 ? "" : "s"; - if (KinkyDungeonSlowLevel == 0 && KinkyDungeonPlugCount > 0) KinkyDungeonSendTextMessage(0, TextGet("KinkyDungeonPlugWalk" + plugLevel).replace("plugs", dict).replace("(s)", dicts), "yellow", 2, true); - if (KinkyDungeonSlowLevel == 1 && !KinkyDungeonStatsChoice.has("HeelWalker")) KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonSlowed" + plugLevel).replace("plugs", dict).replace("(s)", dicts), "yellow", 2, true); - else if (KinkyDungeonSlowLevel == 2) KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonHopping" + plugLevel).replace("plugs", dict).replace("(s)", dicts), "orange", 2, true); - else if (KinkyDungeonSlowLevel == 3) KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonInching" + plugLevel).replace("plugs", dict).replace("(s)", dicts), "#ff0000", 2, true); - else if (KinkyDungeonSlowLevel > 3 && KinkyDungeonSlowLevel < 10) KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonCrawling" + plugLevel).replace("plugs", dict).replace("(s)", dicts), "#ff0000", 2, true); - else if (KinkyDungeonSlowLevel >= 10) KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonCantMove" + plugLevel).replace("plugs", dict).replace("(s)", dicts), "#ff0000", 2, true); - - let moveMult = Math.max(1, KinkyDungeonSlowLevel); - - if (KinkyDungeonStatsChoice.has("Quickness")) { - KinkyDungeonSetFlag("BlockQuicknessPerk", 3 + moveMult); - } - if (quick) moveMult = 1; - if (KinkyDungeonSlowLevel > 9) moveMult = 1; - if ((moveDirection.x != 0 || moveDirection.y != 0)) { - if (KinkyDungeonSlowLevel > 1 || (!KinkyDungeonStatsChoice.has("HeelWalker") && KinkyDungeonSlowLevel > 0)) { - if (KinkyDungeonSlowLevel < 10) { - KinkyDungeonChangeStamina(moveMult * (KinkyDungeonStatStaminaRegenPerSlowLevel * KinkyDungeonSlowLevel) * delta, false, moveMult, true); - } - } - let plugIncreaseAmount = (KinkyDungeonStatPlugLevel * KinkyDungeonDistractionPerPlug); - KinkyDungeonStatDistraction += plugIncreaseAmount; - if (plugIncreaseAmount > 0) KinkyDungeonStatDistractionLower += plugIncreaseAmount * 0.2; - if (KinkyDungeonHasCrotchRope) { - if (KinkyDungeonStatPlugLevel == 0) KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonCrotchRope"), "pink", 2); - KinkyDungeonStatDistraction += (KinkyDungeonCrotchRopeDistraction); - - if (moveMult > 0) KinkyDungeonStatDistractionLower += (KinkyDungeonCrotchRopeDistraction) * 0.2; - } - } else if (KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax) { - KinkyDungeonWaitMessage(); - } - KinkyDungeonMovePoints = Math.min(KinkyDungeonMovePoints + 1, 0); - - if (moveObject == 'R') { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Coins.ogg"); - KinkyDungeonLoot(MiniGameKinkyDungeonLevel, MiniGameKinkyDungeonCheckpoint, "rubble"); - - KinkyDungeonMapSet(moveX, moveY, 'r'); - KinkyDungeonAggroAction('rubble', {}); - } - //} - } - - KinkyDungeonAdvanceTime(quick ? 0 : 1); - } - KinkyDungeonInterruptSleep(); - //for (let d = 0; d < newDelta; d++) - // KinkyDungeonAdvanceTime(1, false, d != 0); // was moveDirection.delta, but became too confusing - if (newDelta > 1 && newDelta < 10 && !quick) { - KinkyDungeonSlowMoveTurns = newDelta -1; - KinkyDungeonSleepTime = CommonTime() + 200; - } - } else { - KinkyDungeonMovePoints = Math.min(KinkyDungeonMovePoints + 1, 0); - KinkyDungeonWaitMessage(); - KinkyDungeonAdvanceTime(1); // was moveDirection.delta, but became too confusing - } - } else if (KinkyDungeonGroundItems.some((item) => {return item.x == moveX && item.y == moveY;})) { - // We can pick up items inside walls, in case an enemy drops it into bars - KinkyDungeonItemCheck(moveX, moveY, MiniGameKinkyDungeonLevel); - KinkyDungeonInterruptSleep(); - KinkyDungeonAdvanceTime(1); - } else { // If we are blind we can bump into walls! - if (KinkyDungeonGetVisionRadius() <= 1) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Footstep.ogg"); - KinkyDungeonSendActionMessage(2, TextGet("KDWallBump"), "white", 2); - KinkyDungeonInterruptSleep(); - KinkyDungeonAdvanceTime(1); - } - } - } - - KinkyDungeonLastMoveDirection = moveDirection; - - return moved; -} - -function KinkyDungeonWaitMessage(NoTime) { - if (!KDIsAutoAction()) { - if (KinkyDungeonStatWillpowerExhaustion > 1) KinkyDungeonSendActionMessage(3, TextGet("WaitSpellExhaustion"), "orange", 2); - else if (!KinkyDungeonHasStamina(2.5, false)) KinkyDungeonSendActionMessage(1, TextGet("WaitExhaustion" - + (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.33 ? - ((KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.67 ? - "ArousedHeavy" - : "Aroused")) - : "")), "yellow", 2); - else KinkyDungeonSendActionMessage(1, TextGet("Wait" + (KinkyDungeonStatDistraction > 12 ? "Aroused" : "")), "silver", 2); - } - - if (!NoTime && KinkyDungeonStatStamina < KinkyDungeoNStatStaminaLow) - KinkyDungeonStatStamina += KinkyDungeonStatStaminaRegenWait; - - KinkyDungeonLastAction = "Wait"; - KinkyDungeonTrapMoved = false; -} - - -// Returns th number of turns that must elapse -function KinkyDungeonMoveTo(moveX, moveY, SuppressSprint) { - //if (KinkyDungeonNoEnemy(moveX, moveY, true)) { - let stepOff = false; - let xx = KinkyDungeonPlayerEntity.x; - let yy = KinkyDungeonPlayerEntity.y; - if (KinkyDungeonPlayerEntity.x != moveX || KinkyDungeonPlayerEntity.y != moveY) { - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "move", 1); - stepOff = true; - } - if (xx != moveX || yy != moveY) { - KinkyDungeonTrapMoved = true; - } - let willSprint = KinkyDungeonToggleAutoSprint && (xx != moveX || yy != moveY) && !SuppressSprint; - let cencelled = !KinkyDungeonUpdateTether(true, KinkyDungeonPlayerEntity, moveX, moveY) ? KDMovePlayer(moveX, moveY, true, willSprint) : true; - - - if (stepOff) KinkyDungeonHandleStepOffTraps(KinkyDungeonPlayerEntity, xx, yy, moveX, moveY); - - KinkyDungeonMovePoints = 0; - KinkyDungeonSetFlag("Quickness", 0); - if (KinkyDungeonStatsChoice.has("Quickness")) { - KinkyDungeonSetFlag("BlockQuicknessPerk", 4); - } - if (!cencelled && willSprint) { - if (KDCanSprint()) { - let unblocked = KinkyDungeonSlowLevel > 1; - if (!unblocked) { - let nextPosX = moveX*2 - xx; - let nextPosY = moveY*2 - yy; - let nextTile = KinkyDungeonMapGet(nextPosX, nextPosY); - if (KinkyDungeonMovableTilesEnemy.includes(nextTile) && KinkyDungeonNoEnemy(nextPosX, nextPosY)) { - unblocked = true; - } - } - if (unblocked) { - let data = { - player: KinkyDungeonPlayerEntity, - xTo: moveX*2 - xx, - yTo: moveY*2 - yy, - cancelSprint: false, - sprintCostMult: KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SprintEfficiency")), - }; - - KinkyDungeonSendEvent("sprint", data); - - if (!data.cancelSprint) { - KinkyDungeonChangeStamina((-KDSprintCostBase - KDSprintCostSlowLevel[Math.round(KinkyDungeonSlowLevel)]) * data.sprintCostMult, false, 1); - KinkyDungeonSendActionMessage(5, TextGet("KDSprinting" + (KinkyDungeonSlowLevel > 1 ? "Hop" : "")), "lightgreen", 2); - if (KinkyDungeonSlowLevel < 2) { - // Move faster - KinkyDungeonTrapMoved = true; - KDMovePlayer(moveX*2 - xx, moveY*2 - yy, true); - } - } - } - - return 1; - } - } - return Math.max(1, KinkyDungeonSlowLevel); - //} - //return 0; -} - -function KDCanSprint() { - return KinkyDungeonSlowLevel < 4 && KinkyDungeonHasStamina(KDSprintCostBase + KDSprintCostSlowLevel[Math.min(Math.round(KinkyDungeonSlowLevel), KDSprintCostSlowLevel.length)]) && KinkyDungeonCanStand(); -} - -let KinkyDungeonLastAction = ""; -let KinkyDungeonLastTurnAction = ""; -let KDDrawUpdate = 0; -let KDVisionUpdate = 0; - -let KDLastTick = 0; - -function KinkyDungeonAdvanceTime(delta, NoUpdate, NoMsgTick) { - KDUpdateFog = true; - KDLastTick = performance.now(); - - if (delta > 0 && CommonTime() > lastFloaterRefresh + 1000) { - KDEntitiesFloaterRegisty = new Map(); - lastFloaterRefresh = CommonTime(); - } - - - let _CharacterRefresh = CharacterRefresh; - let _CharacterAppearanceBuildCanvas = CharacterAppearanceBuildCanvas; - // @ts-ignore - CharacterRefresh = () => {KDRefresh = true;}; - // @ts-ignore - CharacterAppearanceBuildCanvas = () => {}; - let start = performance.now(); - - if (KinkyDungeonMovePoints < -1 && KDGameData.KinkyDungeonLeashedPlayer < 1) KinkyDungeonMovePoints += delta; - if (delta > 0) { - KDDrawUpdate = delta; - KDVisionUpdate = delta; - } - KDRecentRepIndex = 0; - KinkyDungeonRestraintAdded = false; - KinkyDungeonSFX = []; - KDPlayerHitBy = []; - - //if (KinkyDungeonMovePoints < 0 && KinkyDungeonStatBind < 1) KinkyDungeonMovePoints = 0; - KinkyDungeonUpdateAngel(delta); - - KinkyDungeonUpdateTether(true, KinkyDungeonPlayerEntity); - - KinkyDungeonResetEventVariablesTick(delta); - KinkyDungeonSendEvent("tick", {delta: delta}); - - // Here we move enemies and such - KinkyDungeonUpdateLightGrid = true; - if (!NoMsgTick) { - if (KinkyDungeonTextMessageTime > 0) KinkyDungeonTextMessageTime -= 1; - if (KinkyDungeonTextMessageTime <= 0) KinkyDungeonTextMessagePriority = 0; - if (KinkyDungeonActionMessageTime > 0) KinkyDungeonActionMessageTime -= 1; - if (KinkyDungeonActionMessageTime <= 0) KinkyDungeonActionMessagePriority = 0; - } - - // Updates the character's stats - KinkyDungeonCurrentTick += 1; - if (KinkyDungeonCurrentTick > 100000) KinkyDungeonCurrentTick = 0; - KinkyDungeonItemCheck(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, MiniGameKinkyDungeonLevel); //console.log("Item Check " + (performance.now() - now)); - KinkyDungeonUpdateBuffs(delta); - KinkyDungeonUpdateEnemies(delta, true); //console.log("Enemy Check " + (performance.now() - now)); - KinkyDungeonSendEvent("afterEnemyTick", {delta: delta, allied: true}); - KinkyDungeonUpdateBullets(delta, true); //console.log("Bullets Check " + (performance.now() - now)); - KinkyDungeonUpdateBulletsCollisions(delta); //console.log("Bullet Check " + (performance.now() - now)); - KinkyDungeonUpdateEnemies(delta, false); //console.log("Enemy Check " + (performance.now() - now)); - KinkyDungeonSendEvent("afterEnemyTick", {delta: delta, allied: false}); - - KinkyDungeonUpdateTether(true, KinkyDungeonPlayerEntity); - KinkyDungeonUpdateBullets(delta); //console.log("Bullets Check " + (performance.now() - now)); - KinkyDungeonUpdateBulletsCollisions(delta, true); //"catchup" phase for explosions! - - KinkyDungeonUpdateJailKeys(); - - KDUpdateEffectTiles(delta); - KinkyDungeonUpdateTileEffects(delta); - for (let E = 0; E < KinkyDungeonEntities.length; E++) { - let enemy = KinkyDungeonEntities[E]; - if (KinkyDungeonEnemyCheckHP(enemy, E)) { E -= 1; continue;} - } - - KinkyDungeonUpdateStats(delta); - - let toTile = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - KinkyDungeonHandleMoveToTile(toTile); - // else if (KinkyDungeonStatWillpower == 0) { - // KinkyDungeonState = "Lose"; - //} - - // Handle delayed actions - if (!KDGameData.DelayedActions) KDGameData.DelayedActions = []; - let runActions = Object.assign([], KDGameData.DelayedActions); - // Trim actions that have happened - KDGameData.DelayedActions = KDGameData.DelayedActions.filter((action) => { - return action.time - delta > 0; - }); - for (let action of runActions) { - action.time -= delta; - if (action.time <= 0) { - if (KDDelayedActionCommit[action.commit]) { - KDDelayedActionCommit[action.commit](action); - } - } else if (action.update && KDDelayedActionUpdate[action.update]) { - KDDelayedActionUpdate[action.update](action); - } - } - - if (!NoUpdate) - KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); - - if (KinkyDungeonStatStamina < 5) { - let msg = "KinkyDungeonStaminaWarningMed"; - if (KinkyDungeonStatStamina < 2.5) msg = "KinkyDungeonStaminaWarningLow"; - if (KinkyDungeonStatStamina < 1) msg = "KinkyDungeonStaminaWarningNone"; - if (!KinkyDungeonSendActionMessage(1, TextGet(msg), "#448844", 1, true)) - KinkyDungeonSendTextMessage(1, TextGet(msg), "#448844", 1, true); - } - let gagchance = KinkyDungeonGagMumbleChance; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv)) - gagchance += KinkyDungeonGagMumbleChancePerRestraint; - } - if (!KinkyDungeonCanTalk() && KDRandom() < gagchance) { - let msg = "KinkyDungeonGagMumble"; - let gagMsg = Math.floor(KDRandom() * 5); - const GagEffect = -2 + SpeechGetGagLevel(KinkyDungeonPlayer, ["ItemMouth", "ItemMouth2", "ItemMouth3"]); - gagMsg += GagEffect/3; - gagMsg = Math.max(0, Math.min(7, Math.floor(gagMsg))); - - if (KDRandom() < KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax) msg = "KinkyDungeonGagMumbleAroused"; - - msg = msg + gagMsg; - - KinkyDungeonSendDialogue(KinkyDungeonPlayerEntity, TextGet(msg), "#ffffff", 2, 0); - } - let end = performance.now(); - if (KDDebug) console.log(`Tick ${KinkyDungeonCurrentTick} took ${(end - start)} milliseconds.`); - - KinkyDungeonLastTurnAction = KinkyDungeonLastAction; - KinkyDungeonLastAction = ""; - - if (KDGameData.AncientEnergyLevel > 1) KDGameData.AncientEnergyLevel = 1; - - KinkyDungeonUpdateBulletVisuals(delta); - - // @ts-ignore - CharacterRefresh = _CharacterRefresh; - // @ts-ignore - CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; - - if (KinkyDungeonInDanger()) KinkyDungeonSetFlag("DangerFlag", 3); - if (KinkyDungeonStatsChoice.has("Quickness") && !KinkyDungeonFlags.has("BlockQuicknessPerk")) { - KinkyDungeonSetFlag("Quickness", -1); - } - - if (KinkyDungeonMovePoints < 0 || KinkyDungeonStatBlind) { - KinkyDungeonSetFlag("Quickness", 0); - } - KinkyDungeonSendEvent("tickAfter", {delta: delta}); - - KinkyDungeonUpdateStats(0); - - KinkyDungeonDressPlayer(); - KDGetEnemyCache(); - - KDAllowDialogue = true; -} -let KDAllowDialogue = true; - -let lastFloaterRefresh = 0; - -function KinkyDungeonTargetTileMsg() { - if (KDObjectMessages[KinkyDungeonTargetTile.Type]) { - KDObjectMessages[KinkyDungeonTargetTile.Type](); - } else if (KinkyDungeonTargetTile.Lock) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Locked.ogg"); - KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonObjectLock").replace("TYPE", TextGet("KinkyDungeonShrine" + KinkyDungeonTargetTile.Name)), "#ffffff", 1, true); - } else { - let suff = ""; - if (KinkyDungeonTargetTile.Name == "Commerce") suff = "Commerce"; - KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonObject" + KinkyDungeonTargetTile.Type + suff).replace("TYPE", TextGet("KinkyDungeonShrine" + KinkyDungeonTargetTile.Name)), "#ffffff", 1, true); - } -} - -/** - * Sets an item in the character appearance - * @param {Character} C - The character whose appearance should be changed - * @param {string} Group - The name of the corresponding groupr for the item - * @param {Asset|null} ItemAsset - The asset collection of the item to be changed - * @param {string|string[]} NewColor - The new color (as "#xxyyzz" hex value) for that item - * @param {number} [DifficultyFactor=0] - The difficulty, on top of the base asset difficulty, that should be assigned - * to the item - * @param {number} [ItemMemberNumber=-1] - The member number of the player adding the item - defaults to -1 - * @param {boolean} [Refresh=true] - Determines, wether the character should be redrawn after the item change - * @param {item} [item] - The item, to pass to the event - * @returns {Item} - the item itself - */ -function KDAddAppearance(C, Group, ItemAsset, NewColor, DifficultyFactor, ItemMemberNumber, Refresh, item) { - DifficultyFactor = 0; - - // Unlike the stock function, we do NOT remove the previous one - let data = { - color: NewColor, - item: item, - }; - - KinkyDungeonSendEvent("onWear", data); - - // Add the new item to the character appearance - if (ItemAsset != null) { - /** @type {Item} */ - const NA = { - Asset: ItemAsset, - Difficulty: parseInt((ItemAsset.Difficulty == null) ? 0 : ItemAsset.Difficulty) + parseInt(DifficultyFactor), - Color: data.color, - Property: ItemAsset.CharacterRestricted ? {ItemMemberNumber: ItemMemberNumber == null ? -1 : ItemMemberNumber} : undefined - }; - C.Appearance.push(NA); - return NA; - } - return null; -} - -function KinkyDungeonCloseDoor(data) { - KinkyDungeonTargetTileLocation = data.targetTile; - KinkyDungeonTargetTile = null; - KinkyDungeonMapSet(parseInt(KinkyDungeonTargetTileLocation.split(',')[0]), parseInt(KinkyDungeonTargetTileLocation.split(',')[1]), "D"); - KinkyDungeonTargetTileLocation = ""; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/DoorClose.ogg"); - if (!KDLastKeyTime[KinkyDungeonKeyToggle[2]]) - KinkyDungeonToggleAutoDoor = false; - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonCloseDoorDone"), "white", 2); - KinkyDungeonAdvanceTime(1, true); - KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); -} - -/** - * @type {Map} - */ -let KDEnemyCache = null; -let KDUpdateEnemyCache = true; - -function KDGetEnemyCache() { - if (KDUpdateEnemyCache || !KDEnemyCache) { - KDUpdateEnemyCache = false; - KDEnemyCache = new Map(); - for (let e of KinkyDungeonEntities) { - KDEnemyCache.set(e.x + "," + e.y, e); - } - } - return KDEnemyCache; -} - -let KDTileQuery = ""; -let KDTileLast = null; - -/** - * - * @param {number} [x] - * @param {number} [y] - */ -function KDTile(x, y) { - if (x == undefined) x = KinkyDungeonPlayerEntity.x; - if (y == undefined) y = KinkyDungeonPlayerEntity.y; - let q = x + "," + y; - if (q == KDTileQuery) return KDTileLast; - else { - let t = KinkyDungeonTilesGet(q); - KDTileLast = t; - KDTileQuery = q; - return t; - } -} - -/** - * - * @param {number} [x] - * @param {number} [y] - */ -function KDTileDelete(x, y) { - if (x == undefined) x = KinkyDungeonPlayerEntity.x; - if (y == undefined) y = KinkyDungeonPlayerEntity.y; - KinkyDungeonTilesDelete(x + "," + y); -} - -/** - * Stuns the player for [turns] turns - * @param {number} turns - * @param {boolean} [noFlag] - Doesn't add the 'stun' flag which makes the game think you are in trouble - */ -function KDStunTurns(turns, noFlag) { - if (!noFlag) - KinkyDungeonSetFlag("playerStun", turns + 1); - KinkyDungeonSlowMoveTurns = Math.max(KinkyDungeonSlowMoveTurns, turns); - KinkyDungeonSleepTime = CommonTime() + 200; -} - -/** - * Kneels the player for [turns] turns - * @param {number} turns - */ -function KDKneelTurns(turns) { - KinkyDungeonSetFlag("playerStun", turns + 1); - KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns || 0, turns); -} - -/** - * Picks a string based on weights - * @param {Record} list - a list of weights with string keys - * @returns {string} - the key that was selected - */ -function KDGetByWeight(list) { - let WeightTotal = 0; - let Weights = []; - let type = ""; - - for (let obj of Object.entries(list)) { - Weights.push({obj: obj[0], weight: WeightTotal}); - WeightTotal += obj[1]; - } - - let selection = KDRandom() * WeightTotal; - - for (let L = Weights.length - 1; L >= 0; L--) { - if (selection > Weights[L].weight) { - type = Weights[L].obj; - break; - } - } - return type; -} - -let KDKeyCheckers = { - "Toggles": () => { - if (KinkyDungeonState == 'Game' && KinkyDungeonDrawState == 'Game' && KinkyDungeonKeyToggle.includes(KinkyDungeonKeybindingCurrentKey)) { - switch (KinkyDungeonKeybindingCurrentKey) { - // Log, Passing, Door, Auto Struggle, Auto Pathfind - case KinkyDungeonKeyToggle[0]: KinkyDungeonMessageToggle = !KinkyDungeonMessageToggle; break; - case KinkyDungeonKeyToggle[1]: KinkyDungeonToggleAutoPass = !KinkyDungeonToggleAutoPass; break; - case KinkyDungeonKeyToggle[2]: KinkyDungeonToggleAutoDoor = !KinkyDungeonToggleAutoDoor; break; - case KinkyDungeonKeyToggle[3]: KDAutoStruggleClick(); break; - case KinkyDungeonKeyToggle[4]: KinkyDungeonFastMove = !KinkyDungeonFastMove; break; - case KinkyDungeonKeyToggle[5]: KinkyDungeonInspect = !KinkyDungeonInspect; break; - } - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - return true; - } - }, - - "Shop": () => { - if (KinkyDungeonState == 'Game' && KinkyDungeonDrawState == 'Game' && KinkyDungeonTargetTile?.Type == "Shrine" && KinkyDungeonTargetTile.Name == "Commerce") { - if (KinkyDungeonKey[0] == KinkyDungeonKeybindingCurrentKey) { - KinkyDungeonShopIndex = (KinkyDungeonShopIndex + 1) % KDGameData.ShopItems.length; - KDShopBuyConfirm = false; - return true; - } else if (KinkyDungeonKey[2] == KinkyDungeonKeybindingCurrentKey) { - KinkyDungeonShopIndex = KinkyDungeonShopIndex - 1; - if (KinkyDungeonShopIndex < 0) KinkyDungeonShopIndex = KDGameData.ShopItems.length - 1; - KDShopBuyConfirm = false; - return true; - } else if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey) { - let cost = KinkyDungeonShrineCost("Commerce"); - if (cost <= KinkyDungeonGold) { - if (!KDShopBuyConfirm) KDShopBuyConfirm = true; - else { - KDSendInput("shrineBuy", {type: "Commerce", shopIndex: KinkyDungeonShopIndex}); - KDShopBuyConfirm = false; - } - } - return true; - } else if (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey) { - KDShopBuyConfirm = false; - return true; - } - } - }, - - "Dialogue": () => { - if (KDGameData.CurrentDialog && !(KinkyDungeonSlowMoveTurns > 0)) { - - if (KinkyDungeonState == 'Game' && KinkyDungeonDrawState == 'Game' && KDGameData.CurrentDialog) { - if (KinkyDungeonKey[2] == KinkyDungeonKeybindingCurrentKey) { - KDDialogueData.CurrentDialogueIndex += 1; - return true; - } else if (KinkyDungeonKey[0] == KinkyDungeonKeybindingCurrentKey) { - KDDialogueData.CurrentDialogueIndex = Math.max(0, KDDialogueData.CurrentDialogueIndex - 1); - return true; - } else if (KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey) { - KDClickButton("dialogue" + KDDialogueData.CurrentDialogueIndex); - return true; - } else if (KinkyDungeonKeySkip[0] == KinkyDungeonKeybindingCurrentKey) { - // Get the current dialogue and traverse down the tree - let dialogue = KDGetDialogue(); - if (dialogue.options) { - let entries = Object.entries(dialogue.options); - - let II = 0; - let gagged = KDDialogueGagged(); - for (let i = KDOptionOffset; i < entries.length && II < KDMaxDialogue; i++) { - if ((!entries[i][1].prerequisiteFunction || entries[i][1].prerequisiteFunction(gagged, KinkyDungeonPlayerEntity)) - && (!entries[i][1].gagRequired || gagged) - && (!entries[i][1].gagDisabled || !gagged)) { - if (entries[i][0] == "Leave" || entries[i][0] == "Continue" || entries[i][1].skip) { - KDClickButton("dialogue" + i); - return true; - } - } - } - } - return true; - } - } - } - }, -}; - -function KDGetAltType(Floor) { - let mapMod = null; - if (KDGameData.MapMod) { - mapMod = KDMapMods[KDGameData.MapMod]; - } - let altRoom = KDGameData.RoomType; - let altType = altRoom ? KinkyDungeonAltFloor((mapMod && mapMod.altRoom) ? mapMod.altRoom : altRoom) : KinkyDungeonBossFloor(Floor); - return altType; -} - -function KDCanPassEnemy(player, Enemy) { - return !KDIsImmobile(Enemy) - && ((!KinkyDungeonAggressive(Enemy) && !Enemy.playWithPlayer) || (KDHelpless(Enemy))) - && (KinkyDungeonToggleAutoPass || KDEnemyHasFlag(Enemy, "passthrough") || (KinkyDungeonFlags.has("Passthrough")) || Enemy.Enemy.noblockplayer); -} \ No newline at end of file diff --git a/Game/KinkyDungeonHUD.js b/Game/KinkyDungeonHUD.js deleted file mode 100644 index b9cccdce6..000000000 --- a/Game/KinkyDungeonHUD.js +++ /dev/null @@ -1,2001 +0,0 @@ -"use strict"; -let KinkyDungeonStruggleGroups = []; -let KinkyDungeonStruggleGroupsBase = [ - "ItemH", - "ItemDevices", - "ItemM", - "ItemEars", - "ItemArms", - "ItemNeck", - "ItemHands", - "ItemNeckRestraints", - "ItemBreast", - "ItemNipples", - "ItemTorso", - "ItemButt", - "ItemVulva", - "ItemVulvaPiercings", - "ItemPelvis", - "ItemLegs", - "ItemFeet", - "ItemBoots", -]; -let KinkyDungeonDrawStruggle = 1; -let KinkyDungeonDrawStruggleHover = false; -let KinkyDungeonDrawState = "Game"; -let KinkyDungeonDrawStatesModal = ["Heart", "Orb"]; -let KinkyDungeonSpellValid = false; -let KinkyDungeonCamX = 0; -let KinkyDungeonCamY = 0; -let KinkyDungeonTargetX = 0; -let KinkyDungeonTargetY = 0; -let KinkyDungeonLastDraw = 0; -let KinkyDungeonLastDraw2 = 0; -let KinkyDungeonDrawDelta = 0; - -const KinkyDungeonLastChatTimeout = 10000; - -let KinkyDungeonStatBarHeight = 50; -let KinkyDungeonToggleAutoDoor = false; -let KinkyDungeonToggleAutoPass = false; -let KinkyDungeonToggleAutoSprint = false; -let KinkyDungeonInspect = false; - -let KinkyDungeonFastMove = true; -let KinkyDungeonFastMovePath = []; -let KinkyDungeonFastStruggle = false; -let KinkyDungeonFastStruggleType = ""; -let KinkyDungeonFastStruggleGroup = ""; - -/** - * - * @param {item} item - * @param {boolean} [includeItem] - * @returns {item[]} - */ -function KDDynamicLinkList(item, includeItem) { - let ret = []; - if (includeItem) ret.push(item); - if (item && item.dynamicLink) { - let link = item.dynamicLink; - while (link) { - ret.push(link); - link = link.dynamicLink; - } - } - return ret; -} - -/** - * Returns a list of items on the 'surface' of a dynamic link, i.e items that can be accessed - * @param {item} item - * @returns {item[]} - */ -function KDDynamicLinkListSurface(item) { - // First we get the whole stack - let stack = []; - if (item && item.dynamicLink) { - let last = item; - let link = item.dynamicLink; - while (link) { - stack.push({item: link, host: last}); - link = link.dynamicLink; - last = link; - } - } - let ret = [item]; - // Now that we have the stack we sum things up - for (let tuple of stack) { - let inv = tuple.item; - let host = tuple.host; - if ( - (!KDRestraint(host).inaccessible) - && ((KDRestraint(host).accessible) || (KDRestraint(inv).renderWhenLinked && KDRestraint(item).shrine && KDRestraint(inv).renderWhenLinked.some((link) => {return KDRestraint(item).shrine.includes(link);}))) - ) { - ret.push(inv); - } - } - return ret; -} - -/** - * - * @param {restraint} restraint - * @returns {number} - */ -function KDLinkSize(restraint) { - return restraint.linkSize ? restraint.linkSize : 1; -} - -/** - * - * @param {item} item - * @param {string} linkCategory - * @param {item} [ignoreItem] - * @returns {number} - */ -function KDLinkCategorySize(item, linkCategory, ignoreItem) { - let total = 0; - // First we get the whole stack - let stack = [item]; - if (item && item.dynamicLink) { - let link = item.dynamicLink; - while (link) { - stack.push(link); - link = link.dynamicLink; - } - } - // Now that we have the stack we sum things up - for (let inv of stack) { - if (KDRestraint(inv).linkCategory == linkCategory && ignoreItem?.id != inv.id) { - total += KDLinkSize(KDRestraint(inv)); - } - } - return total; -} - -let KDBuffSprites = { - "Camo": true, - "Drenched": true, - "StoneSkin": true, - "Conduction": true, - "Ignite": true, - "Burning": true, - "Unsteady": true, - "Unsteady2": true, - "Chilled": true, - "ChillWalk": true, - "Slimed": true, - "LightningRod": true, - "PoisonDagger": true, - "Cutting": true, - "Slippery": true, - "ScrollVerbal": true, - "ScrollArms": true, - "ScrollLegs": true, - "Empower": true, - "SlimeMimic": true, - "DisenchantSelf": true, - "LeatherBurst": true, - - "TabletElements": true, - "TabletConjure": true, - "TabletIllusion": true, - "TabletRope": true, - "TabletWill": true, - "TabletMetal": true, - "TabletLatex": true, - "TabletLeather": true, - - "AvatarFire": true, - "AvatarWater": true, - "AvatarEarth": true, - "AvatarAir": true, - - "DistractionCast": true, - - "BoundByFate": true, - - //KinkyDungeonBuffShrineElements,"Arcane Power: Deals bonus damage when you hit an enemy." - //KinkyDungeonBuffShrineConjure,"Arcane Protection: Reduces damage taken, and deals retaliation damage." - //KinkyDungeonBuffShrineIllusion,"Arcane Cunning: You turn invisible briefly after attacking." - - //KinkyDungeonBuffSlimeForm,"Slime Form: You gain bonuses and can slip through bars!" - //KinkyDungeonBuffShroud2,"Shroud: Visibility decreased, evasion increased." - //KinkyDungeonBuffShadowBlade,"Darkblade: Increased damage." - //KinkyDungeonBuffShield,"Runic Ward: Increased Spell Ward." - //KinkyDungeonBuffInvisibility,"Invisibility: It is very difficult for enemies to see you." - //KinkyDungeonBuffLesserInvisibility,"Lesser Invisibility: It is harder for enemies to see you." - //KinkyDungeonBuffCutting,"FULL POWER: Cutting power increased!!!" - //KinkyDungeonBuffSlippery,"Graceful: Struggling power increased." - //KinkyDungeonBuffIronBlood,"Iron Blood: Reduced melee cost, increased mana costs." - //KinkyDungeonBuffSleepy,"Sleepy: You are sluggish and have a hard time keeping your eyes open." - //KinkyDungeonBuffEvasion,"Afterimage: Evasion greatly increased." - - //KinkyDungeonBuffStraitjacketBolt,"Locked Down: Struggling power is greatly reduced." - //KinkyDungeonBuffLockdown,"Locked Down: Struggling power is greatly reduced." - - //KinkyDungeonBuffScrollVerbal,"Verbose: You can cast verbal spells while gagged." - //KinkyDungeonBuffScrollArms,"Dextrous: You can cast arm spells while tied up." - //KinkyDungeonBuffScrollLegs,"Spell Dance: You can cast leg spells while tied up." - - //KinkyDungeonBuffBondageBusterCharge,"Bondage Buster: Lazor is charging..." - //KinkyDungeonBuffKatanaCharge,"Katana: Patience is key..." - //KinkyDungeonBuffStormCharge,"Stormbreaker: You have the Power." -}; - -let KDStatsSkipLine = { - "info": 1, - "status": 1, - "dmg": 1, -}; -let KDStatsSkipLineBefore = { - "kinky": 1, -}; - -let KDStatsOrder = { - "info": 10000, - "help": 3500, // Always good, so since they are buffs they should be high priority - "status": 7000, - "buffs": 1000, - "dmg": 2000, - "kinky": -1000, -}; - -function KinkyDungeonDrawInputs() { - /** - * @type {Record} - */ - let statsDraw = {}; - - if (ServerURL == "foobar") DrawButtonVis(1880, 82, 100, 50, TextGet("KinkyDungeonRestart"), "#ffffff"); - else DrawButtonVis(1750, 20, 100, 50, TextGet("KinkyDungeonRestart"), "#ffffff"); - - //let X1 = 1640; - //let X2 = 1360; - //let X3 = 1090; - - let i = 0; - - if (KinkyDungeonPlayerDamage) { - let accuracy = KinkyDungeonGetEvasion(); - //if (accuracy != 1.0) { - let weapon = KinkyDungeonWeapons[KinkyDungeonPlayerWeapon] || KinkyDungeonPlayerDamage; - statsDraw.accuracy = { - text: TextGet("KinkyDungeonAccuracy") + Math.round(accuracy * 100) + "%", - count: Math.round(accuracy * 100) + "%", - icon: "infoAccuracy",//accuracy > weapon.chance * 1.01 ? "infoAccuracyBuff" : (accuracy < weapon.chance * 0.99 ? "infoAccuracyDebuff" : "infoAccuracy"), - countcolor: accuracy > weapon.chance * 1.01 ? "#c4efaa" : (accuracy < weapon.chance * 0.99 ? "#ff5555" : "#ffffff"), - category: "info", color: "#ffffff", bgcolor: "#000000", priority: 10 - }; - //} - } - //if (KinkyDungeonMiscastChance > 0) { - statsDraw.miscast = { - text: TextGet("StatMiscastChance") + Math.round(KinkyDungeonMiscastChance * 100) + "%", - count: Math.round(KinkyDungeonMiscastChance * 100) + "%", - icon: "infoMiscast", - countcolor: KinkyDungeonMiscastChance > 0 ? "#ff5555" : "#ffffff", - category: "info", color: "#ffffff", bgcolor: "#000000", priority: 9 - }; - //} - let evasion = KinkyDungeonPlayerEvasion(); - //if (evasion != 1.0) { - statsDraw.evasion = { - text: TextGet("StatEvasion") - .replace("Percent", ("") + Math.round((1 - evasion) * 100)) - .replace("EVASIONSUM", ("") + Math.round((KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Evasion")) * 100)) - .replace("EVASIONPENALTY", ("") + Math.round((KDPlayerEvasionPenalty()) * 100)), - count: ("") + Math.round((1 - evasion) * 100) + "%", - icon: "infoEvasion", - countcolor: evasion < 1 ? "#65d45d" : (evasion == 1 ? "#ffffff" : "#ff5555"), - category: "info", color: "#ffffff", bgcolor: "#000000", priority: 8 - }; - //} - - - - let jailstatus = "KinkyDungeonPlayerNotJailed"; - if (KDGameData.PrisonerState == 'jail') { - jailstatus = "KinkyDungeonPlayerJail"; - } else if (KDGameData.PrisonerState == 'parole') { - jailstatus = "KinkyDungeonPlayerParole"; - } else if (KDGameData.PrisonerState == 'chase') { - jailstatus = "KinkyDungeonPlayerChase"; - } - if (jailstatus == "KinkyDungeonPlayerJail") { - statsDraw.jail = { - text: TextGet(jailstatus), - icon: "infoJailPrisoner", - category: "help", color: "#ffffff", bgcolor: "#000000", priority: 12 - }; - } else if (jailstatus == "KinkyDungeonPlayerParole") { - statsDraw.jail = { - text: TextGet(jailstatus), - icon: "infoJailSubmissive", - category: "help", color: "#ffffff", bgcolor: "#000000", priority: 12 - }; - } else if (jailstatus == "KinkyDungeonPlayerChase") { - statsDraw.jail = { - text: TextGet(jailstatus), - icon: "infoJailPrisoner", - category: "help", color: "#ffffff", bgcolor: "#000000", priority: 12 - }; - } - - let escape = KDCanEscape(); - statsDraw.key = { - text: TextGet(escape ? "StatKeyEscapeKey" : "StatKeyEscapeNoKey"), - icon: escape ? "infoKey" : "infoNoKey", - category: "info", color: "#ffffff", bgcolor: "#000000", priority: 5 - }; - - - - if (KinkyDungeonIsHandsBound(false, false)) { - statsDraw.b_hands = {text: TextGet("KDStatHands"), category: "status", icon: "boundHands", color: "#ff5555", bgcolor: "#333333", priority: 10}; - } else { - if (KDHandBondageTotal() > 0) - statsDraw.b_hands = {text: TextGet("KDStatHandsPartial"), category: "status", icon: "boundHandsPartial", color: "#ff5555", bgcolor: "#333333", priority: 10}; - else - statsDraw.b_hands = {text: TextGet("KDStatFreeHands"), category: "status", icon: "status/freeHands", color: "#55ff55", bgcolor: "#333333", priority: 10}; - } - if (KinkyDungeonIsArmsBound(false, false)) { - statsDraw.b_arms = {text: TextGet("KDStatArms"), category: "status", icon: "boundArms", color: "#ff5555", bgcolor: "#333333", priority: 11}; - } else { - statsDraw.b_arms = {text: TextGet("KDStatFreeArms"), category: "status", icon: "status/freeArms", color: "#55ff55", bgcolor: "#333333", priority: 11}; - } - let gag = KinkyDungeonGagTotal(false); - if (gag >= 0.99) { - statsDraw.b_gag = {text: TextGet("KDStatGagFull"), category: "status", icon: "boundGagFull", color: "#ff5555", bgcolor: "#333333", priority: 7}; - } else if (gag > 0) { - statsDraw.b_gag = {text: TextGet("KDStatGag"), category: "status", icon: "boundGag", color: "#ff5555", bgcolor: "#333333", priority: 7}; - } else { - statsDraw.b_gag = {text: TextGet("KDStatFreeMouth"), category: "status", icon: "status/freeMouth", color: "#55ff55", bgcolor: "#333333", priority: 7}; - } - if (KinkyDungeonBlindLevel > 0 || KinkyDungeonStatBlind > 0) { - statsDraw.b_blind = {text: TextGet("KDStatBlind"), category: "status", icon: "boundBlind", color: "#ff5555", bgcolor: "#333333", priority: 8}; - } else { - statsDraw.b_blind = {text: TextGet("KDStatFreeEyes"), category: "status", icon: "status/freeEyes", color: "#55ff55", bgcolor: "#333333", priority: 8}; - } - if (KinkyDungeonMovePoints < 0) { - statsDraw.b_speed = {text: TextGet("KDStatStun"), category: "status", icon: "boundStun", color: "#ff5555", bgcolor: "#333333", priority: 9}; - } else if (KinkyDungeonSlowLevel > 9) { - statsDraw.b_speed = {text: TextGet("KDStatSpeedImmobile"), category: "status", icon: "boundImmobile", color: "#ff5555", bgcolor: "#333333", priority: 9}; - } else if (KinkyDungeonSlowLevel > 3) { - statsDraw.b_speed = {text: TextGet("KDStatSpeedNoSprint"), category: "status", icon: "boundSlow4", color: "#ff5555", bgcolor: "#333333", priority: 9}; - } else if (KinkyDungeonSlowLevel > 2) { - statsDraw.b_speed = {text: TextGet("KDStatSpeedVerySlow"), category: "status", icon: "boundSlow3", color: "#ff5555", bgcolor: "#333333", priority: 9}; - } else if (KinkyDungeonSlowLevel == 2) { - statsDraw.b_speed = {text: TextGet("KDStatSpeedSlow"), category: "status", icon: "boundSlow2", color: "#ff5555", bgcolor: "#333333", priority: 9}; - } else if (KinkyDungeonSlowLevel > 0) { - statsDraw.b_speed = {text: TextGet("KDStatSpeedSlightlySlow"), category: "status", icon: "boundSlow1", color: "#ffff00", bgcolor: "#333333", priority: 9}; - } else { - statsDraw.b_speed = {text: TextGet("KDStatFreeLegs"), category: "status", icon: "status/freeLegs", color: "#55ff55", bgcolor: "#333333", priority: 9}; - } - if (KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) < 1.5) { - statsDraw.shadow = {text: TextGet("KinkyDungeonPlayerShadow"), icon: "shadow", category: "status", color: "#a3a7c2", bgcolor: "#5e52ff", priority: 1}; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerShadow"), X1, 900 - i * 35, 200, KDTextGray0, "#5e52ff", ); i++; - } - let sneak = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak", true); - if (sneak > 2.5) { - statsDraw.sneak = {text: TextGet("KinkyDungeonPlayerSneak"), category: "status", icon: "invisible", color: "#ceaaed", bgcolor: "#333333", priority: 2}; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerSneak"), X1, 900 - i * 35, 200, KDTextGray0,"#ceaaed"); i++; - } else { - let visibility = KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowDetection")); - if (visibility != 1.0) { - statsDraw.visibility = { - text: TextGet("KinkyDungeonPlayerVisibility") + Math.round(visibility * 100) + "%", - count: Math.round(visibility * 100) + "%", - icon: "visibility", - countcolor: visibility < 1 ? "#c4efaa" : "#ff5555", - category: "status", color: "#ceaaed", bgcolor: KDTextGray0, priority: 2 - }; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerVisibility") + Math.round(visibility * 100) + "%", X1, 900 - i * 35, 200, KDTextGray0, "#ceaaed"); i++; - } - } - let help = KinkyDungeonHasAllyHelp() || KinkyDungeonHasGhostHelp(); - if (help) { - statsDraw.hashelp = {text: TextGet("KinkyDungeonPlayerHelp"), icon: "Help", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerHelp"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; - } else { - if (KinkyDungeonGetAffinity(false, "Hook")) { - statsDraw.helphook = {text: TextGet("KinkyDungeonPlayerHook"), icon: "HelpHook", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerHook"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; - } - if (KinkyDungeonGetAffinity(false, "Sharp") || KinkyDungeonWeaponCanCut(true)) { - statsDraw.helpsharp = {text: TextGet("KinkyDungeonPlayerSharp"), icon: "HelpSharp", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerSharp"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; - } - if (KinkyDungeonGetAffinity(false, "Edge")) { - statsDraw.helpedge = {text: TextGet("KinkyDungeonPlayerEdge"), icon: "HelpCorner", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerEdge"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; - } - if (KinkyDungeonGetAffinity(false, "Sticky")) { - statsDraw.helpsticky = {text: TextGet("KinkyDungeonPlayerSticky"), icon: "HelpSticky", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerSticky"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; - } - if (KinkyDungeonWallCrackAndKnife(false)) { - statsDraw.helpcrack = {text: TextGet("KinkyDungeonPlayerCrack"), icon: "HelpCrack", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerSticky"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; - } - } - - if (KinkyDungeonFlags.has("Quickness")) { - statsDraw.quickness = {text: TextGet("KinkyDungeonPlayerQuickness"), icon: "quickness", category: "buffs", color: "#ffff00", bgcolor: "#333333", priority: 100}; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerQuickness"), X1, 900 - i * 35, 200, "#ffff00", "#333333"); i++; - } - i = 0; - - let armor = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Armor"); - if (armor != 0) { - statsDraw.armor = {text: TextGet("KinkyDungeonPlayerArmor") + Math.round(armor*10), count: (armor > 0 ? "+" : "") + Math.round(armor*10), category: "buffs", icon: "armor", color: "#fca570", bgcolor: "#333333", priority: armor}; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerArmor") + Math.round(armor*10), X2, 900 - i * 25, 200, "#fca570", "#333333"); i++; i++; - } - let spellarmor = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellResist"); - if (spellarmor != 0) { - statsDraw.spellarmor = {text: TextGet("KinkyDungeonPlayerSpellResist") + Math.round(spellarmor*10), count: (spellarmor > 0 ? "+" : "") + Math.round(spellarmor*10), category: "buffs", icon: "spellarmor", color: "#73efe8", bgcolor: "#333333", priority: spellarmor + 1}; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerSpellResist") + Math.round(spellarmor*10), X2, 900 - i * 25, 200, "#73efe8", "#333333"); i++; i++; - } - let restraintblock = KDRestraintBlockPower(KinkyDungeonGetPlayerStat("RestraintBlock"), 10); - if (restraintblock < 1) - statsDraw.restraintblock = { - text: TextGet("StatRestraintBlock").replace("Percent", ("") + Math.round((1 - restraintblock) * 100)), - count: ("") + Math.round((1 - restraintblock) * 100) + "%", - icon: "restraintblock", - countcolor: "#65d45d", - category: "buffs", color: "#ffffff", bgcolor: "#000000", priority: 20 - }; - let damageReduction = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "DamageReduction"); - if (damageReduction > 0) { - statsDraw.damageReduction = { - text: TextGet("KinkyDungeonPlayerReduction") + Math.round(damageReduction*10), - count: "-" + Math.round(damageReduction*10), - category: "buffs", color: "#73efe8", bgcolor: "#333333", icon: "damageresist", priority: damageReduction * 3 - }; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerReduction") + Math.round(damageReduction*10), X2, 900 - i * 25, 150, "#73efe8", "#333333"); i++; i++; - } - if (KinkyDungeonPlayerDamage) { - let data = { - buffdmg: 0, - Damage: KinkyDungeonPlayerDamage, - }; - KinkyDungeonSendEvent("calcDisplayDamage", data); - let meleeDamage = (KinkyDungeonPlayerDamage.dmg) + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackDmg") + data.buffdmg; - statsDraw.meleeDamage = { - text: TextGet("KinkyDungeonPlayerDamage") - .replace("DAMAGEDEALT", "" + Math.round(meleeDamage*10)) - .replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + KinkyDungeonPlayerDamage.type)), - count: "" + Math.round(meleeDamage*10), - category: "info", color: "#ffffff", bgcolor: "#333333", icon: "infoDamageMelee", priority: 10.1 - }; - } - let bindAmp = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BindAmp"); - if (bindAmp > 0) { - statsDraw.bindAmp = { - text: TextGet("KinkyDungeonPlayerBindBuff").replace("PERCENT", Math.round(bindAmp * 100) + "%"), - count: "+" + Math.round(bindAmp * 100) + "%", - countcolor: "#ffffff", - icon: "dmgPlus/dmgbind", - category: "dmg", color: "#ffae70", bgcolor: "#333333", priority: 5 + bindAmp * 20 - }; - } - let magicResist = KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "magicDamageResist")); - let meleeResist = KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "meleeDamageResist")); - for (let dt of Object.values(KinkyDungeonDamageTypes)) { - let color = dt.color; - let type = dt.name; - let DR = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, type + "DamageResist"); - let resist = KinkyDungeonMultiplicativeStat(DR); - let boost = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, type + "DamageBuff"); - let melee = KinkyDungeonMeleeDamageTypes.includes(type); - switch (type) { - case "melee": boost += KDDamageAmpPerks + KDDamageAmpPerksMelee; break; - case "magic": boost += KDDamageAmpPerks + KDDamageAmpPerksMagic; break; - case "spell": boost += KDDamageAmpPerksSpell; break; - } - if (resist != 1.0) { - statsDraw[type + "_resist"] = { - text: TextGet("KinkyDungeonPlayerDamageResist") - .replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + type).toLocaleLowerCase()) - .replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + type).toLocaleLowerCase()) - .replace("DAMAGECATEGORY", TextGet(melee ? "KinkyDungeonDamageTypemelee" : "KinkyDungeonDamageTypemagic").toLocaleLowerCase()) - .replace("PERCENT1", Math.round(resist * (melee ? meleeResist : magicResist) * 100) + "%") - .replace("PERCENT2", Math.round(DR * 100) + "") - .replace("PERCENT3", Math.round((melee ? meleeResist : magicResist) * 100) + "%"), - count: (resist > 1 ? '+' : "") + Math.round(resist * 100 - 100) + "%", - countcolor: resist < 1 ? "#c4efaa" : "#ff5555", - icon: "dmg" + type, - category: "dmg", color: color, bgcolor: "#333333", priority: resist * 10 - }; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerDamageResist").replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + type)) + Math.round(resist * 100) + "%", X2, 900 - i * 25, 150, color, "#333333"); i++; - } - - if (boost > 0) { - statsDraw[type + "_buff"] = { - text: TextGet("KinkyDungeonPlayerDamageBuff").replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + type)).replace("PERCENT", Math.round(boost * 100) + "%"), - count: "+" + Math.round(boost * 100) + "%", - countcolor: "#ffffff", - icon: "dmgPlus/dmg" + type, - category: "dmg", color: color, bgcolor: "#333333", priority: 5 + boost * 10 - }; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerDamageResist").replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + type)) + Math.round(resist * 100) + "%", X2, 900 - i * 25, 150, color, "#333333"); i++; - } - } - - i = 0; - if (KinkyDungeonPlugCount > 0) { - statsDraw.plugs = { - text: TextGet("KinkyDungeonPlayerPlugged"), - icon: "Plugged", - category: "kinky", color: "#ff8888", bgcolor: "#333333", priority: 1, - }; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerPlugged"), X3, 900 - i * 35, 260, "#ff8888", "#333333"); i++; - if (KinkyDungeonPlugCount > 1) { - statsDraw.plugs = { - text: TextGet("KinkyDungeonPlayerPluggedExtreme"), - icon: "PluggedFull", - category: "kinky", color: "#ff8888", bgcolor: "#333333", priority: 2, - }; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerPluggedExtreme"), X3, 900 - i * 35, 260, "#ff8888", "#333333"); i++; - } - } - if (KinkyDungeonVibeLevel > 0) { - let locations = KDSumVibeLocations(); - let suff = ""; - if (locations.length == 1 && locations[0] == "ItemVulva") { - suff = ""; - } else { - let sum = ""; - if (locations.length > 3) - sum = TextGet("KinkyDungeonPlayerVibratedLocationMultiple"); - else for (let l of locations) { - if (sum) sum = sum + ", "; - sum = sum + TextGet("KinkyDungeonPlayerVibratedLocation" + l); - } - suff = ` (${sum})`; - } - statsDraw.vibe = { - text: TextGet("KinkyDungeonPlayerVibrated" + Math.max(0, Math.min(Math.floor(KinkyDungeonVibeLevel), 5))) + suff, - category: "kinky", color: "#ff8888", bgcolor: "#333333", priority: 11, - icon: "Vibe" + Math.max(0, Math.min(Math.floor(KinkyDungeonVibeLevel), 5)), - }; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerVibrated" + Math.max(0, Math.min(Math.floor(KinkyDungeonVibeLevel), 5))) + suff, X3, 900 - i * 35, 260, "#ff8888", "#333333"); i++; - } - if (KDGameData.OrgasmStamina > 0) { - statsDraw.sex = { - text: TextGet("KinkyDungeonPlayerStatisfied"), - icon: "Satisfied", - category: "kinky", color: "#ff88aa", bgcolor: "#333333", priority: 7, - }; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerStatisfied"), X3, 900 - i * 35, 260, "#ff8888", "#333333"); i++; - } else if (KDGameData.OrgasmTurns > KinkyDungeonOrgasmTurnsCrave) { - statsDraw.sex = { - text: TextGet("KinkyDungeonPlayerEdged"), - icon: "Edged", - category: "kinky", color: "#ff0000", bgcolor: "#333333", priority: 7, - }; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerEdged"), X3, 900 - i * 35, 260, "#ff0000", "#333333"); i++; - } - if (KDGameData.CurrentVibration && KDGameData.CurrentVibration.denyTimeLeft > 0) { - statsDraw.deny = { - text: TextGet("KinkyDungeonPlayerDenied"), - icon: "Denied", - category: "kinky", color: "#ff0000", bgcolor: "#333333", priority: 12, - }; - //DrawTextFitKD(TextGet("KinkyDungeonPlayerDenied"), X3, 900 - i * 35, 260, "#ff8888", "#333333"); i++; - } - - i = 0; - for (let b of Object.values(KinkyDungeonPlayerBuffs)) { - if ((b.aura || b.labelcolor) && b.duration > 0) { - let count = b.maxCount > 1 ? b.maxCount - (b.currentCount ? b.currentCount : 0) : 0; - let pri = 0; - if (b.duration) pri += Math.min(90, b.duration); - if (count) pri += Math.min(10, count); - statsDraw[b.id] = { - text: TextGet("KinkyDungeonBuff" + b.id) + (count ? ` ${count}/${b.maxCount}` : "") + ((b.duration > 1 && b.duration < 1000) ? ` (${b.duration})` : ""), - count: (count ? `${count}/${b.maxCount}` : "") + ((b.duration > 1 && b.duration < 1000) ? ((count ? " " : "") + `${b.duration}`) : ""), - icon: KDBuffSprites[b.id] ? "buff/buff" + b.id : undefined, - //countcolor: b.aura ? b.aura : b.labelcolor, - category: "buffs", color: b.aura ? b.aura : b.labelcolor, bgcolor: "#333333", priority: pri, - }; - //DrawTextFitKD(TextGet("KinkyDungeonBuff" + b.id) + (count ? ` ${count}/${b.maxCount}` : "") + ((b.duration > 1 && b.duration < 1000) ? ` (${b.duration})` : ""), 790, 900 - i * 35, 275, b.aura ? b.aura : b.labelcolor, "#333333"); i++; - } - - } - - i = 0; - for (let perk of KinkyDungeonStatsChoice.keys()) { - if (KDPerkIcons[perk] && KDPerkIcons[perk]()) { - statsDraw["p" + perk] = { - text: TextGet("KinkyDungeonStatDesc" + KinkyDungeonStatsPresets[perk].id), - count: KDPerkCount[perk] ? KDPerkCount[perk]() : undefined, - icon: "perk/perk" + perk, - //countcolor: b.aura ? b.aura : b.labelcolor, - category: "perks", color: "#ffffff", bgcolor: "#333333", priority: 0, - }; - } - } - - let II = 0; - let spriteSize = 46; - let sorted = Object.values(statsDraw).sort((a, b) => { - return (b.priority + KDStatsOrder[b.category]) - (a.priority + KDStatsOrder[a.category]); - }); - let minYY = 510; - let minXX = 1750; - let maxXX = 2000 - 5 - spriteSize; - let YY = minYY; - let textWidth = 44; - let XX = minXX; - let XXspacing = spriteSize + 3; - let YYspacing = spriteSize + 3; - let currCategory = ""; - for (let stat of sorted) { - if (XX > minXX && (KDStatsSkipLine[currCategory] || KDStatsSkipLineBefore[stat.category]) && currCategory != stat.category) { - XX = minXX; - YY += YYspacing; - } - currCategory = stat.category; - - if (stat.count) - DrawTextFitKD(stat.count, XX + spriteSize/2, YY + spriteSize/2 - 10, textWidth, stat.countcolor || "#ffffff", "#000000", 16, undefined, 114, 0.8, 5); - KDDraw(kdcanvas, kdpixisprites, "stat" + II, KinkyDungeonRootDirectory + "Buffs/" + (stat.icon || "buff/buff") + ".png", - XX, YY - Math.ceil(spriteSize/2), undefined, undefined); - - if (MouseIn(XX, YY - Math.ceil(spriteSize/2), spriteSize, spriteSize)) { - DrawTextFitKD(stat.text, XX - 10, YY, 1250, stat.color, "#000000", 22, "right", 160, 1.0, 8); - } - XX += XXspacing; - if (XX > maxXX) { - XX = minXX; - YY += YYspacing; - } - II++; - } - - // Draw the struggle buttons if applicable - KinkyDungeonDrawStruggleHover = false; - if (!KDShowQuickInv() && ((KinkyDungeonDrawStruggle > 0 || MouseIn(0, 0, 500, 1000)) && KinkyDungeonStruggleGroups)) - for (let sg of KinkyDungeonStruggleGroups) { - let ButtonWidth = 60; - let x = 5 + ((!sg.left) ? (490 - ButtonWidth) : 0); - let y = 42 + sg.y * (ButtonWidth + 46); - - let item = KinkyDungeonGetRestraintItem(sg.group); - let drawLayers = 0; - - let MY = 200; - let surfaceItems = []; - let dynamicList = []; - let noRefreshlists = false; - if (KDStruggleGroupLinkIndex[sg.group] && item && item.dynamicLink) { - surfaceItems = KDDynamicLinkListSurface(item); - dynamicList = KDDynamicLinkList(item, true); - noRefreshlists = true; - if (!KDStruggleGroupLinkIndex[sg.group] || KDStruggleGroupLinkIndex[sg.group] >= surfaceItems.length) { - KDStruggleGroupLinkIndex[sg.group] = 0; - } - item = surfaceItems[KDStruggleGroupLinkIndex[sg.group]]; - } - if (MouseIn(((!sg.left) ? (260) : 0), y-48, 230, (ButtonWidth + 45)) && sg) { - - if (MouseY < y) - KinkyDungeonDrawInventorySelected(KDGetItemPreview(item), false, true, 500); - - let data = { - struggleGroup: sg, - struggleIndex: KDStruggleGroupLinkIndex ? KDStruggleGroupLinkIndex[sg.group] : 0, - surfaceItems: surfaceItems, - dynamicList: dynamicList, - item: item, - group: sg.group, - extraLines: [], - extraLineColor: [], - }; - KinkyDungeonSendEvent("drawSGTooltip", data); - let lastO = 0; - - if (data.extraLines.length > 0) { - for (let lineIndex = 0; lineIndex < data.extraLines.length; lineIndex++) { - DrawTextKD(data.extraLines[lineIndex], 530, MY + lastO * 45, data.extraLineColor[lineIndex] || "#ffffff", "#333333", undefined, "left"); - lastO += 1; - } - } - let OInit = lastO; - - // 0 = no draw - // 1 = grey - // 2 = white - if (dynamicList.length > 0 || (item && item.dynamicLink)) { - if (!noRefreshlists) { - surfaceItems = KDDynamicLinkListSurface(item); - dynamicList = KDDynamicLinkList(item, true); - } - if (surfaceItems.length <= 1) { - // Delete if there are no additional surface items - delete KDStruggleGroupLinkIndex[sg.group]; - drawLayers = 1; - } else { - if (!KDStruggleGroupLinkIndex[sg.group] || KDStruggleGroupLinkIndex[sg.group] >= surfaceItems.length) { - KDStruggleGroupLinkIndex[sg.group] = 0; - } - item = surfaceItems[KDStruggleGroupLinkIndex[sg.group]]; - - drawLayers = 2; - } - - let O = OInit + 1; - MainCanvas.textAlign = "left"; - let drawn = false; - for (let d of dynamicList) { - if (d != item)//KDRestraint(item) && (!KDRestraint(item).UnLink || d.name != KDRestraint(item).UnLink)) - { - drawn = true; - let msg = TextGet("Restraint" + d.name); - DrawTextKD(msg, 530, MY + O * 45, "#ffffff", "#333333"); - O++; - } - } - lastO = O; - O = OInit; - if (drawn) { - DrawTextKD(TextGet("KinkyDungeonItemsUnderneath"), 530, MY + O * 45, "#ffffff", "#333333"); - } - O = lastO + 1; - MainCanvas.textAlign = "center"; - } - if (lastO) lastO += 1; - if (item && KDRestraint(item) && KinkyDungeonStrictness(false, KDRestraint(item).Group, item)) { - let strictItems = KinkyDungeonGetStrictnessItems(KDRestraint(item).Group, item); - let O = lastO + 1; - MainCanvas.textAlign = "left"; - let drawn = false; - for (let s of strictItems) { - drawn = true; - let msg = TextGet("Restraint" + s); - DrawTextKD(msg, 530, MY + O * 45, "#ffffff", "#333333"); - O++; - } - O = lastO; - if (drawn) { - DrawTextKD(TextGet("KinkyDungeonItemsStrictness"), 530, MY + O * 45, "#ffffff", "#333333"); - } - MainCanvas.textAlign = "center"; - } - } - - if (sg.left) { - MainCanvas.textAlign = "left"; - } else { - MainCanvas.textAlign = "right"; - } - - let color = "#ffffff"; - let locktext = ""; - if (item && item.lock) {color = "#ffaadd";} - - let GroupText = (sg.name && item) ? ("Restraint" + item.name) : ("KinkyDungeonGroup"+ sg.group); // The name of the group to draw. - - DrawTextFitKD(TextGet(GroupText) + locktext, x + ((!sg.left) ? ButtonWidth - (drawLayers ? ButtonWidth : 0) : 0), y-24, 240 - (drawLayers ? ButtonWidth : 0), color, "#333333"); - MainCanvas.textAlign = "center"; - - if (drawLayers) { - DrawButtonKDEx("surfaceItems"+sg.group, (bdata) => { - if (surfaceItems.length > 1 && MouseInKD("surfaceItems"+sg.group)) { - if (!KDStruggleGroupLinkIndex[sg.group]) KDStruggleGroupLinkIndex[sg.group] = 1; - else KDStruggleGroupLinkIndex[sg.group] = KDStruggleGroupLinkIndex[sg.group] + 1; - } - return true; - }, drawLayers == 2, x + (sg.left ? 240 - ButtonWidth : 12), y - ButtonWidth/2 - 20, 48, 48, "", drawLayers == 2 ? "#ffffff" : "#888888", KinkyDungeonRootDirectory + "Layers.png", ""); - } - - i = 0; - - if (item && (MouseIn(((!sg.left) ? (260) : 0), y-48, 230, (ButtonWidth + 45)) || KinkyDungeonDrawStruggle > 1)) { - let r = KDRestraint(item); - - if (!KinkyDungeonDrawStruggleHover) { - KinkyDungeonDrawStruggleHover = true; - } - - - let buttons = ["Struggle", "CurseInfo", "CurseUnlock", "Cut", "Remove", "Pick"]; - - if (KinkyDungeonControlsEnabled()) - for (let button_index = 0; button_index < buttons.length; button_index++) { - let btn = buttons[sg.left ? button_index : (buttons.length - 1 - button_index)]; - if (btn == "Struggle") { - DrawButtonVis(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, "", "#ffffff", KinkyDungeonRootDirectory + "Struggle.png", "", undefined, undefined, KDButtonColorIntense); i++; - } else if ((item.curse || r.curse) && btn == "CurseInfo") { - DrawButtonVis(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, "", "#ffffff", KinkyDungeonRootDirectory + "CurseInfo.png", "", undefined, undefined, KDButtonColorIntense); i++; - } else if ((item.curse || r.curse) && btn == "CurseUnlock" && KinkyDungeonCurseAvailable(item, (item.curse || r.curse))) { - DrawButtonVis(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, "", "#ffffff", KinkyDungeonRootDirectory + "CurseUnlock.png", "", undefined, undefined, KDButtonColorIntense); i++; - } else if (!(item.curse || r.curse) && !sg.blocked && btn == "Remove") { - let toolSprite = (item.lock) ? KDGetLockVisual(item) : "Buckle.png"; - DrawButtonVis(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, "", "#ffffff", KinkyDungeonRootDirectory + toolSprite, "", undefined, undefined, KDButtonColorIntense); i++; - } else if (!(item.curse || r.curse) && !sg.blocked && btn == "Cut" - && (KinkyDungeonAllWeapon().some((inv) => {return KDWeapon(inv).light && KDWeapon(inv).cutBonus != undefined;}) || KinkyDungeonGetAffinity(false, "Sharp")) - && !sg.noCut) { - let name = ((KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.name && !KinkyDungeonPlayerDamage.unarmed) ? "Items/" + KinkyDungeonPlayerDamage.name + ".png" : "Cut.png"); - DrawButtonVis(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, "", - (sg.magic) ? "#8394ff" : "#ffffff", KinkyDungeonRootDirectory + name, "", undefined, undefined, KDButtonColorIntense, undefined, undefined, true); - i++; - } else if (!(item.curse || r.curse) && !sg.blocked && btn == "Pick" && KinkyDungeonLockpicks > 0 && item.lock) { - DrawButtonVis(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, "", "#ffffff", KinkyDungeonRootDirectory + "UseTool.png", "", undefined, undefined, KDButtonColorIntense); i++; - } - } - } - } - - - if (KinkyDungeonDrawStruggle > 0) DrawButtonVis(510, 925, 120, 60, "", KinkyDungeonStruggleGroups.length > 0 ? "#ffffff" : "#333333", KinkyDungeonRootDirectory + "Hide" + (KinkyDungeonDrawStruggle > 1 ? "Full" : "True") + ".png", ""); - else DrawButtonVis(510, 925, 120, 60, "", KinkyDungeonStruggleGroups.length > 0 ? "#ffffff" : "#333333", KinkyDungeonRootDirectory + "HideFalse.png", ""); - - DrawButtonVis(510, 825, 60, 90, "", "#ffffff", KinkyDungeonRootDirectory + (KinkyDungeonShowInventory ? "BackpackOpen.png" : "Backpack.png"), ""); - if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.special) { - if (MouseIn(580, 825, 50, 90)) DrawTextFitKD(TextGet("KinkyDungeonSpecial" + KinkyDungeonPlayerDamage.name), MouseX, MouseY - 150, 750, "#ffffff", "#333333"); - DrawButtonVis(580, 825, 50, 90, "", "#ffffff", KinkyDungeonRootDirectory + "Ranged.png", ""); - } - - - if (KinkyDungeonTargetTile) { - if (KDObjectDraw[KinkyDungeonTargetTile.Type]) { - KDObjectDraw[KinkyDungeonTargetTile.Type](); - } - } - - let bx = 650 + 15; - let bwidth = 165; - let bspacing = 5; - let bindex = 0; - DrawButtonKDEx("goInv", (bdata) => { - KinkyDungeonDrawState = "Inventory"; - return true; - }, true, bx + bindex * (bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonInventory"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_inventory.png", undefined, undefined, false, "", 24, true); bindex++; - DrawButtonKDEx("goRep", (bdata) => { - KinkyDungeonDrawState = "Reputation"; - return true; - }, true, bx + bindex * (bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonReputation"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_reputation.png", undefined, undefined, false, "", 24, true); bindex++; - DrawButtonKDEx("goSpells", (bdata) => { - KinkyDungeonDrawState = "MagicSpells"; - return true; - }, true, bx + bindex * (bwidth + bspacing), 925, bwidth, 60, TextGet("KinkyDungeonMagic"), "#ffffff", KinkyDungeonRootDirectory + "UI/button_spells.png", undefined, undefined, false, "", 24, true); bindex++; - - let logtxt = KinkyDungeonNewLoreList.length > 0 ? TextGet("KinkyDungeonLogbookN").replace("N", KinkyDungeonNewLoreList.length): TextGet("KinkyDungeonLogbook"); - DrawButtonKDEx("goLog", (bdata) => { - KinkyDungeonDrawState = "Logbook"; - KinkyDungeonUpdateLore(localStorage.getItem("kinkydungeonexploredlore") ? JSON.parse(localStorage.getItem("kinkydungeonexploredlore")) : []); - return true; - }, true, bx + bindex * (bwidth + bspacing), 925, bwidth, 60, logtxt, "#ffffff", KinkyDungeonRootDirectory + "UI/button_logbook.png", undefined, undefined, false, "", 24, true); bindex++; - - - bx = 650 + bindex * (bwidth + bspacing) + 45; - bwidth = 145; - bspacing = 5; - bindex = 0; - - if (KinkyDungeonSpellChoices.length > KinkyDungeonSpellChoiceCountPerPage) { - DrawButtonKDEx("CycleSpellButton", () => { - KDCycleSpellPage(); - return true; - }, true, 1650, 95, 90, 35, `pg. ${KDSpellPage}`, "#ffffff"); - } - for (let ii = KinkyDungeonSpellChoiceCount - 1; ii > 0; ii--) { - if (!(KinkyDungeonSpellChoices[ii] >= 0)) KinkyDungeonSpellChoices = KinkyDungeonSpellChoices.slice(0, ii); - else break; - } - - let KDUpcastLevel = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellEmpower"); - - if (KinkyDungeonSpellChoices.length > 0) { - let empowerY = Math.min(7, KinkyDungeonSpellChoices.length); - let empowerYY = empowerY * KinkyDungeonSpellChoiceOffset + 140; - let hasUpcast = KDCanUpcast(); - let padY = 90 + (KinkyDungeonSpellChoices.length > KinkyDungeonSpellChoiceCountPerPage ? 0 : 40); - let pages = Math.floor(KinkyDungeonSpellChoices.length / KinkyDungeonSpellChoiceCountPerPage); - let pageExtra = 40; - FillRectKD( - kdcanvas, kdpixisprites, "spellbg", { - Left: 1600 - pages * pageExtra, Top: padY, Width: 145 + pages * pageExtra, - Height: empowerYY - padY + 80, - Color: "#000000", alpha: 0.4, zIndex: 70 - } - ); - DrawButtonKDEx("empowerSpell", - (bdata) => { - KDSendInput("upcast", {}); - return true; - }, true, - 1700 - 80, empowerYY, 76, 76, "", "", - KinkyDungeonRootDirectory + "/Spells/" + KDEmpowerSprite + (hasUpcast ? "" : "Fail") + ".png", undefined, false, true, - ); - if (KDUpcastLevel > 0) - DrawButtonKDEx("empowerSpellCancel", - (bdata) => { - KDSendInput("upcastcancel", {}); - return true; - }, true, - 1700 - 80, empowerYY + KinkyDungeonSpellChoiceOffset, 76, 76, "", "", - KinkyDungeonRootDirectory + "/Spells/" + KDEmpowerSprite + "Cancel" + ".png", undefined, false, true, - ); - if (MouseIn(1700 - 80, empowerYY, 76, 76)) { - DrawTextFitKD(TextGet("KDSpellEmpower" + (hasUpcast ? "" : "Fail")), 1700 - 100, empowerYY + 40, 1000, "#ffffff", undefined, undefined, "right"); - } - if (MouseIn(1700 - 80, empowerYY + KinkyDungeonSpellChoiceOffset, 76, 76)) { - DrawTextFitKD(TextGet("KDSpellEmpowerCancel"), 1700 - 100, empowerYY + 40 + KinkyDungeonSpellChoiceOffset, 1000, "#ffffff", undefined, undefined, "right"); - } - } - - - for (i = 0; i < KinkyDungeonSpellChoiceCountPerPage; i++) { - let index = i + KDSpellPage * KinkyDungeonSpellChoiceCountPerPage; - let buttonWidth = 40; - let buttonPad = 80; - if (KinkyDungeonSpellChoices[i]) - DrawButtonVis(1650 + (90 - buttonWidth), 140 + i*KinkyDungeonSpellChoiceOffset, buttonWidth, buttonWidth, "", "#ffffff", KinkyDungeonRootDirectory + "ChangeSpell.png", undefined, undefined, true); - let tooltip = false; - let buttonDim = { - x: 1700 - buttonPad, - y: 140 + i*KinkyDungeonSpellChoiceOffset, - w: 76, - h: 76, - wsmall: 46, - hsmall: 46, - }; - - - if (KinkyDungeonSpells[KinkyDungeonSpellChoices[index]] && !KinkyDungeonSpells[KinkyDungeonSpellChoices[index]].passive) { - let spell = KDGetUpcast(KinkyDungeonSpells[KinkyDungeonSpellChoices[index]].name, KDUpcastLevel) || KinkyDungeonSpells[KinkyDungeonSpellChoices[index]];//KinkyDungeonSpells[KinkyDungeonSpellChoices[index]]; - let components = KinkyDungeonGetCompList(spell); - let comp = ""; - - - if (spell.components && spell.components.length > 0) comp = components; - // Render MP cost - let cost = Math.round(KinkyDungeonGetManaCost(spell) * 10) + "m"; - DrawTextFitKD(cost, 1650 + (89 - buttonWidth/2), 140 + i*KinkyDungeonSpellChoiceOffset + buttonWidth*1.4, buttonWidth * 0.35 * Math.min(3, cost.length), "#ccddFF", "#333333"); - - MainCanvas.textAlign = "center"; - - // Draw the main spell icon - if (spell.type == "passive" && KinkyDungeonSpellChoicesToggle[index]) { - FillRectKD(kdcanvas, kdpixisprites, "rectspell" + i, { - Left: 1700 - buttonPad - 4, - Top: 140 - 4 + i*KinkyDungeonSpellChoiceOffset, - Width: 84, - Height: 84, - Color: "#dbdbdb", - zIndex: 70, - }); - FillRectKD(kdcanvas, kdpixisprites, "rectspell2" + i, { - Left: 1700 - buttonPad - 4 + 5, - Top: 140 - 4 + i*KinkyDungeonSpellChoiceOffset + 5, - Width: 74, - Height: 74, - Color: "#101010", - zIndex: 70, - }); - } - DrawButtonKD("SpellCast" + index, true, buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, "", "rgba(0, 0, 0, 0)", KinkyDungeonRootDirectory + "Spells/" + spell.name + ".png", "", false, true); - if ((KinkyDungeoCheckComponents(spell).length > 0 || (spell.components.includes("Verbal") && !KinkyDungeonStatsChoice.get("Incantation") && KinkyDungeonGagTotal() > 0 && !spell.noMiscast))) { - let sp = "SpellFail"; - if (spell.components.includes("Verbal") && !KinkyDungeonStatsChoice.get("Incantation") && KinkyDungeonGagTotal() < 1) { - sp = "SpellFailPartial"; - } - KDDraw(kdcanvas, kdpixisprites, "spellFail" + "SpellCast" + i, KinkyDungeonRootDirectory + "Spells/" + sp + ".png", - buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, undefined, { - zIndex: 115, - }); - //DrawImage(KinkyDungeonRootDirectory + "Spells/" + sp + ".png", buttonDim.x + 2, buttonDim.y + 2,); - } - if (KDHasUpcast(spell.name)) { - KDDraw(kdcanvas, kdpixisprites, "spellCanUpcast" + i, KinkyDungeonRootDirectory + "Spells/" + "CanUpcast" + ".png", - buttonDim.x, buttonDim.y, 72, 72, undefined, { - zIndex: 114, - }); - } - - if (MouseIn(buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h)) { - MainCanvas.textAlign = "right"; - DrawTextFitKD(TextGet("KinkyDungeonSpell"+ spell.name), 1700 - buttonPad - 30, 140 + buttonPad/2 + i*KinkyDungeonSpellChoiceOffset, 300, "#ffffff", "#333333"); - MainCanvas.textAlign = "center"; - DrawTextFitKD(comp, 1700 - 2 - buttonPad / 2, 200 + i*KinkyDungeonSpellChoiceOffset, Math.min(10 + comp.length * 8, buttonPad), "#ffffff", KDTextGray0); - tooltip = true; - } - // Render number - DrawTextFitKD((i+1) + "", buttonDim.x + 10, buttonDim.y + 13, 10, "#ffffff", KDTextGray0); - - - //let cost = KinkyDungeonGetManaCost(spell) + TextGet("KinkyDungeonManaCost") + comp; - } - if (!tooltip) { - let icon = 0; - // Draw icons for the other pages, if applicable - for (let page = 1; page <= Math.floor((KinkyDungeonSpellChoices.length - 1) / KinkyDungeonSpellChoiceCountPerPage); page += 1) { - let pg = KDSpellPage + page; - if (pg > Math.floor(KinkyDungeonSpellChoices.length / KinkyDungeonSpellChoiceCountPerPage)) pg -= 1 + Math.floor((KinkyDungeonSpellChoices.length - 1) / KinkyDungeonSpellChoiceCountPerPage); - - // Now we have our page... - let indexPaged = (i + pg * KinkyDungeonSpellChoiceCountPerPage) % (KinkyDungeonSpellChoiceCount); - let spellPaged = KinkyDungeonSpells[KinkyDungeonSpellChoices[indexPaged]]; - if (spellPaged) { - // Draw the main spell icon - if (spellPaged.type == "passive" && KinkyDungeonSpellChoicesToggle[indexPaged]) { - FillRectKD(kdcanvas, kdpixisprites, page + "pgspell" + i, { - Left: 1700 - buttonPad - 4 - buttonDim.wsmall * page, - Top: 140 - 4 + i*KinkyDungeonSpellChoiceOffset, - Width: 54, - Height: 54, - Color: "#333333", - zIndex: 70, - }); - FillRectKD(kdcanvas, kdpixisprites, page + "pgspell2" + i, { - Left: 1700 - buttonPad - 4 - buttonDim.wsmall * page + 5, - Top: 140 - 4 + i*KinkyDungeonSpellChoiceOffset + 5, - Width: 44, - Height: 44, - Color: KDTextGray0, - zIndex: 70, - }); - } - icon += 1; - DrawButtonKD("SpellCast" + indexPaged, true, buttonDim.x - buttonDim.wsmall * page, buttonDim.y, buttonDim.wsmall, buttonDim.hsmall, "", - "rgba(0, 0, 0, 0)", "", "", false, true); - KDDraw(kdcanvas, kdpixisprites, "spellIcon" + icon + "," + indexPaged, KinkyDungeonRootDirectory + "Spells/" + spellPaged.name + ".png" - ,buttonDim.x - buttonDim.wsmall * page, buttonDim.y, buttonDim.wsmall, buttonDim.hsmall, undefined, { - zIndex: 114, - }); - //DrawImageEx(KinkyDungeonRootDirectory + "Spells/" + spellPaged.name + ".png", buttonDim.x - buttonDim.wsmall * page, buttonDim.y, { - //Width: buttonDim.wsmall, - //Height: buttonDim.hsmall, - //}); - if ((KinkyDungeoCheckComponents(spellPaged).length > 0 || (spellPaged.components.includes("Verbal") && !KinkyDungeonStatsChoice.get("Incantation") && KinkyDungeonGagTotal() > 0 && !spellPaged.noMiscast))) { - let sp = "SpellFail"; - if (spellPaged.components.includes("Verbal") && !KinkyDungeonStatsChoice.get("Incantation") && KinkyDungeonGagTotal() < 1) { - sp = "SpellFailPartial"; - } - KDDraw(kdcanvas, kdpixisprites, "spellFail" + icon + "," + page + "," + indexPaged, KinkyDungeonRootDirectory + "Spells/" + sp + ".png", - buttonDim.x + 2 - buttonDim.wsmall * page, buttonDim.y + 2, buttonDim.wsmall, buttonDim.hsmall, undefined, { - zIndex: 115, - }); - - //DrawImageEx(KinkyDungeonRootDirectory + "Spells/" + sp + ".png", buttonDim.x + 2 - buttonDim.wsmall * page, buttonDim.y + 2, { - //Width: buttonDim.wsmall, - //Height: buttonDim.hsmall, - //}); - } - } - } - } - } - KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelayPing); - -} - -function KDCycleSpellPage(reverse) { - if (reverse) { - if (KDSpellPage <= 0) { - KDSpellPage = KinkyDungeonSpellChoices.length - 1; - } else KDSpellPage -= 1; - } else if (KDSpellPage * KinkyDungeonSpellChoiceCountPerPage + KinkyDungeonSpellChoiceCountPerPage >= KinkyDungeonSpellChoices.length) { - KDSpellPage = 0; - } else KDSpellPage += 1; -} - -function KinkyDungeonDrawProgress(x, y, amount, totalIcons, maxWidth, sprite) { - let iconCount = 6; - let scale = maxWidth / (72 * iconCount); - let interval = 1/iconCount; - let numIcons = amount / interval; - let xOffset = (6 - totalIcons) * maxWidth / 6 / 2; - for (let icon = 0; icon < totalIcons; icon += 1) { - DrawImageZoomCanvas(KinkyDungeonRootDirectory + "Icons/" + sprite +"Empty.png", MainCanvas, 0, 0, 72, 72, xOffset + x + 72 * scale * icon, y, 72*scale, 72*scale, false); - } - for (let icon = 0; icon < numIcons && numIcons > 0; icon += 1) { - DrawImageZoomCanvas(KinkyDungeonRootDirectory + "Icons/" + sprite + ((icon + 0.5 <= numIcons) ? "Full.png" : "Half.png"), MainCanvas, 0, 0, 72, 72, xOffset + x + 72 * scale * icon, y, 72*scale, 72*scale, false); - } -} - -function KinkyDungeonCanSleep() { - if (KDGameData.CurrentVibration) return false; - else return true; -} - -function KDLinspace(min, max, steps) { - if (steps == 0 || Number.isNaN(steps)) return []; - let spaces = []; - for (let i = 0; i < steps; i+= 1) { - spaces.push(min + i * (max - min) / steps); - } - return spaces; -} - -function KDSteps(max, step, maxStep = 20) { - if (step == 0 || Number.isNaN(step)) return []; - let spaces = []; - for (let i = 0; i < Math.ceil(Math.abs(max / step)) && i < maxStep; i+= 1) { - spaces.push(step > 0 ? step * i : max + step * i); - } - return spaces; -} - -function KinkyDungeonDrawStats(x, y, width, heightPerBar) { - // Draw labels - let buttonWidth = 48; - let suff = (!KinkyDungeonCanDrink()) ? "Unavailable" : ""; - if (suff == "Unavailable") { - let allowPotions = KinkyDungeonPotionCollar(); - if (allowPotions) - suff = "Inject"; - } - let buttonOff = 5; - let offBarHeight = heightPerBar*0.12; - - let distRate = KDGetDistractionRate(0); - - // Draw distraction - KinkyDungeonBar(x, y + heightPerBar*0.45, width, heightPerBar*0.45, 100*KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax, "#ff5277", - "#692464", KDGameData.LastAP/KinkyDungeonStatDistractionMax * 100, "#ffa1b4", - distRate < 0 ? KDSteps(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax, KDGetDistractionRate(0)/KinkyDungeonStatDistractionMax, 3) : undefined, distRate < 0 ? "#692464" : undefined, distRate < 0 ? "#692464" : undefined); - //KinkyDungeonBar(x, y + heightPerBar*0.9 - offBarHeight, width, offBarHeight, 100*KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax, "#ffa4b8", "none", undefined, undefined, undefined, undefined, undefined, 56); - if (KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax >= 0.05) - KDDraw(kdcanvas, kdpixisprites, "dist_lower", KinkyDungeonRootDirectory + "UI/Heart.png", - x - heightPerBar*0.32 + width * KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax, - y + heightPerBar*0.53, - undefined, undefined, undefined, { - zIndex: 150, - }); - MainCanvas.textAlign = "right"; - DrawTextFitKD(TextGet("StatDistraction").replace("PERCENT", "" + Math.round(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * 100)), x+width, y + 10, width - 2*buttonWidth, (KinkyDungeonStatDistraction > 0) ? "#ffffff" : "pink", "#333333", 24); - DrawButtonVis(x, y - buttonOff, buttonWidth, buttonWidth, "", (KinkyDungeonStatDistraction > 0 && KinkyDungeonItemCount("PotionFrigid")) ? "#333333" : "Pink", - KinkyDungeonRootDirectory + "UI/UsePotion" + ((suff == "Unavailable") ? "" : "Frigid") + suff + ".png", "", false, true); - MainCanvas.textAlign = "left"; - DrawTextFitKD("x" + KinkyDungeonItemCount("PotionFrigid"), x + buttonWidth, y+10, buttonWidth, "#ffffff", "#333333", 18); - - let attackCost = Math.min(-0.5, KDAttackCost()); - // Draw Stamina/Mana - KinkyDungeonBar(x, y + heightPerBar*1.45, width, heightPerBar*0.45, 100*KinkyDungeonStatStamina/KinkyDungeonStatStaminaMax, - "#63ab3f", "#283540", KDGameData.LastSP/KinkyDungeonStatStaminaMax * 100, "#ffee83", - KDSteps(KinkyDungeonStatStamina/KinkyDungeonStatStaminaMax, attackCost/KinkyDungeonStatStaminaMax), "#283540", "#63ab3f"); - MainCanvas.textAlign = "right"; - DrawTextFitKD(TextGet("StatStamina").replace("MAX", KinkyDungeonStatStaminaMax*10 + "").replace("CURRENT", Math.floor(KinkyDungeonStatStamina*10) + ""), x+width, y + 10 + heightPerBar, width - 2*buttonWidth, (KinkyDungeonStatStamina > 0.5) ? "#ffffff" : "pink", "#333333", 24); - DrawButtonVis(x, y+heightPerBar - buttonOff, buttonWidth, buttonWidth, "", (KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax && KinkyDungeonItemCount("PotionStamina")) ? "#AAFFAA" : "#333333", - KinkyDungeonRootDirectory + "UI/UsePotion" + ((suff == "Unavailable") ? "" : "Stamina") + suff + ".png", "", false, true); - MainCanvas.textAlign = "left"; - DrawTextFitKD("x" + KinkyDungeonItemCount("PotionStamina"), x + buttonWidth, y+1*heightPerBar+10, buttonWidth, "#ffffff", "#333333", 18); - - - // Draw mana - KinkyDungeonBar(x, y + heightPerBar*2.45, width, heightPerBar*0.45, 100*KinkyDungeonStatMana/KinkyDungeonStatManaMax, - "#4fa4b8", "#4c6885", KDGameData.LastMP/KinkyDungeonStatManaMax * 100, "#92e8c0", - KDLinspace(0, 1, Math.ceil(KinkyDungeonStatManaMax/5)), "#4c6885", "#4fa4b8"); - KinkyDungeonBar(x, y + heightPerBar*2.9 - offBarHeight, width, offBarHeight, 100*KinkyDungeonStatManaPool/KinkyDungeonStatManaPoolMax, "#efefff", "none", undefined, undefined, undefined, undefined, undefined, 56); - MainCanvas.textAlign = "right"; - - DrawTextFitKD(TextGet("StatMana").replace("MAX", KinkyDungeonStatManaMax*10 + "").replace("CURRENT", Math.floor(KinkyDungeonStatMana*10) + ""), x+width, y + 10 + heightPerBar * 2, width - 2*buttonWidth, (KinkyDungeonStatMana > 0.5) ? "#ffffff" : "pink", "#333333", 24); - DrawButtonVis(x, y+2*heightPerBar - buttonOff, buttonWidth, buttonWidth, "", (KinkyDungeonStatMana < KinkyDungeonStatManaMax && KinkyDungeonItemCount("PotionMana")) ? "#AAAAFF" : "#333333", - KinkyDungeonRootDirectory + "UI/UsePotion" + ((suff == "Unavailable") ? "" : "Mana") + suff + ".png", "", false, true); - MainCanvas.textAlign = "left"; - DrawTextFitKD("x" + KinkyDungeonItemCount("PotionMana"), x + buttonWidth, y+2*heightPerBar+10, buttonWidth, "#ffffff", "#333333", 18); - - - // Draw will - KinkyDungeonBar(x, y + heightPerBar*3.45, width, heightPerBar*0.45, 100*KinkyDungeonStatWill/KinkyDungeonStatWillMax, "#ff4444", "#222222", - KDGameData.LastWP/KinkyDungeonStatWillMax * 100, "#aa0000", - KDLinspace(0, 1, 4), "#222222", "#ff4444"); - MainCanvas.textAlign = "right"; - DrawTextFitKD(TextGet("StatWill").replace("MAX", KinkyDungeonStatWillMax*10 + "").replace("CURRENT", Math.floor(KinkyDungeonStatWill*10) + ""), x+width, y + 10 + heightPerBar * 3, width - 2*buttonWidth, (KinkyDungeonStatWill > 0.5) ? "#ffffff" : "pink", "#333333", 24); - DrawButtonVis(x, y+3*heightPerBar - buttonOff, buttonWidth, buttonWidth, "", (KinkyDungeonStatWill < KinkyDungeonStatWillMax && KinkyDungeonItemCount("PotionWill")) ? "#ff4444" : "#333333", - KinkyDungeonRootDirectory + "UI/UsePotion" + ((suff == "Unavailable") ? "" : "Will") + suff + ".png", "", false, true); - MainCanvas.textAlign = "left"; - DrawTextFitKD("x" + KinkyDungeonItemCount("PotionWill"), x + buttonWidth, y+3*heightPerBar+10, buttonWidth, "#ffffff", "#333333", 18); - - - // Draw ancient - if (KDGameData.AncientEnergyLevel > 0 || KinkyDungeonInventoryGet("AncientPowerSource")) { - KinkyDungeonBar(x, y + heightPerBar*4.45, width, heightPerBar*0.45, 100*KDGameData.AncientEnergyLevel, "#ffee83", "#3b2027", 100*KDGameData.OrigEnergyLevel, "#ffffff"); - MainCanvas.textAlign = "right"; - DrawTextFitKD(TextGet("StatAncient").replace("PERCENT", Math.round(KDGameData.AncientEnergyLevel*1000) + ""), x+width, y + 10 + heightPerBar * 4, width - 2*buttonWidth, (KDGameData.AncientEnergyLevel > 0.01) ? "#ffffff" : "pink", "#333333", 24); - DrawButtonKDEx("potionAncient", - (bdata) => { - KDSendInput("consumable", {item: "AncientPowerSource", quantity: 1}); - return true; - }, KDGameData.AncientEnergyLevel < 1.0 && KinkyDungeonItemCount("AncientPowerSource"), x, y+4*heightPerBar - buttonOff, buttonWidth, buttonWidth, "", - (KDGameData.AncientEnergyLevel < 1.0 && KinkyDungeonItemCount("AncientPowerSource")) ? "#ffee83" : "#333333", - KinkyDungeonRootDirectory + "UI/UsePotionAncientInject.png", "", false, true); - MainCanvas.textAlign = "left"; - DrawTextFitKD("x" + KinkyDungeonItemCount("AncientPowerSource"), x + buttonWidth, y+4*heightPerBar+10, buttonWidth, "#ffffff", "#333333", 18); - } - let ttOffset = 250; - - if (MouseIn(x, y + heightPerBar*0.45, width, heightPerBar*0.45)) { - DrawTextFitKD(TextGet("TooltipDistraction"), x-ttOffset, MouseY, 1000, "#ffffff", "#333333", 20, "right"); - } - if (MouseIn(x, y + heightPerBar*1.45, width, heightPerBar*0.45)) { - DrawTextFitKD(TextGet("TooltipStamina"), x-ttOffset, MouseY, 1000, "#ffffff", "#333333", 20, "right"); - } - if (MouseIn(x, y + heightPerBar*2.45, width, heightPerBar*0.45)) { - DrawTextFitKD(TextGet("TooltipMana").replace("POOLMANA", "" + KinkyDungeonStatManaPoolMax * 10), x-ttOffset, MouseY, 1000, "#ffffff", "#333333", 20, "right"); - } - if (MouseIn(x, y + heightPerBar*3.45, width, heightPerBar*0.45)) { - DrawTextFitKD(TextGet("TooltipWill"), x-ttOffset, MouseY, 1000, "#ffffff", "#333333", 20, "right"); - } - if ((KDGameData.AncientEnergyLevel > 0 || KinkyDungeonInventoryGet("AncientPowerSource")) && MouseIn(x, y + heightPerBar*4.45, width, heightPerBar*0.45)) { - DrawTextFitKD(TextGet("TooltipCharge"), x-ttOffset, MouseY, 1000, "#ffffff", "#333333", 20, "right"); - } - - MainCanvas.textAlign = "center"; - - - let i = 4.6; - - let itemsAdj = 20; - - itemsAdj = 25; - - MainCanvas.textAlign = "center"; - let fs = 18; - - let textheight = 15; - - //DrawRectKD(kdcanvas, kdpixisprites, TODOID,x, y + 40 - 40 + i * heightPerBar + itemsAdj, 240, 80, "rgba(0, 0, 0, 0.2)"); - - DrawImageEx(KinkyDungeonRootDirectory + "Items/Pick.png", x, y + 40 - 25 + i * heightPerBar + itemsAdj, {Width: 50, Height: 50}); - DrawTextFitKD("" + KinkyDungeonLockpicks, x+25, y + textheight + i * heightPerBar + itemsAdj, 50, "#ffffff", "#333333", fs); - if (MouseIn(x, y + 40 - 40 + i * heightPerBar + itemsAdj, 50, 50)) DrawTextKD(TextGet("KinkyDungeonInventoryItemLockpick"), MouseX - 10, MouseY, "#ffffff", "#333333"); - - DrawImageEx(KinkyDungeonRootDirectory + "Items/RedKey.png", x+50, y + 40 - 25 + i * heightPerBar + itemsAdj, {Width: 50, Height: 50}); - DrawTextFitKD("" + KinkyDungeonRedKeys, x+50+25, y + textheight + i * heightPerBar + itemsAdj, 50, "#ffffff", "#333333", fs); - if (MouseIn(x+50, y + 40 - 40 + i * heightPerBar + itemsAdj, 50, 50)) DrawTextKD(TextGet("KinkyDungeonInventoryItemRedKey"), MouseX - 10, MouseY, "#ffffff", "#333333"); - - if (KinkyDungeonBlueKeys > 0) { - DrawImageEx(KinkyDungeonRootDirectory + "Items/BlueKey.png", x+100, y + 40 - 25 + i * heightPerBar + itemsAdj, {Width: 50, Height: 50}); - DrawTextFitKD("" + KinkyDungeonBlueKeys, x+50+50+25, y + textheight + i * heightPerBar + itemsAdj, 50, "#ffffff", "#333333", fs); - if (MouseIn(x+100, y + 40 - 40 + i * heightPerBar + itemsAdj, 50, 50)) DrawTextKD(TextGet("KinkyDungeonInventoryItemMagicKey"), MouseX - 10, MouseY, "#ffffff", "#333333"); - } - - DrawImageEx(KinkyDungeonRootDirectory + "Items/Gold.png", x+150, y + 40 - 40 + i * heightPerBar + itemsAdj, {Width: 80, Height: 80}); - - DrawTextFitKD("" + KinkyDungeonGold, x+50+50+50+40, y + textheight + i * heightPerBar + itemsAdj, 50, "#ffffff", "#333333", fs); - if (MouseIn(x+150, y + 40 - 40 + i * heightPerBar + itemsAdj, 80, 80)) DrawTextKD(TextGet("KinkyDungeonInventoryItemGold"), MouseX - 10, MouseY, "#ffffff", "#333333"); - - MainCanvas.textAlign = "center"; - - /* - let statAdj = 98; - let stati = 0; - let statspacing = 40; - DrawButtonVis(x + 10, y + statAdj + statspacing * stati + i * heightPerBar, width - 15, 40, TextGet("StatMiscastChance").replace("Percent", Math.round(100 * Math.max(0, KinkyDungeonMiscastChance)) + "%"), - (KinkyDungeonMiscastChance > 0.5) ? "#ff0000" : ((KinkyDungeonMiscastChance > 0) ? "pink" : "#ffffff"), KinkyDungeonRootDirectory + "UI/miscast.png", undefined, undefined, true, "", 24, true); stati++; - if (KinkyDungeonPlayerDamage) { - DrawButtonVis(x + 10, y + statAdj + statspacing * stati + i * heightPerBar, width - 15, 40, TextGet("KinkyDungeonAccuracy") + Math.round(KinkyDungeonGetEvasion() * 100) + "%", - (KinkyDungeonGetEvasion() < KinkyDungeonPlayerDamage.chance * 0.99) ? "#ff0000" : - (KinkyDungeonGetEvasion() > KinkyDungeonPlayerDamage.chance * 1.01) ? "lightgreen" : "#ffffff", KinkyDungeonRootDirectory + "UI/accuracy.png", undefined, undefined, true, "", 24, true); stati++; - } - let evasion = KinkyDungeonPlayerEvasion(); - DrawButtonVis(x + 10, y + statAdj + statspacing * stati + i * heightPerBar, width - 15, 40, TextGet("StatEvasion").replace("Percent", ("") + Math.round((1 - evasion) * 100)), - (evasion > 1) ? "#ff0000" : (evasion < 1 ? "lightgreen" : "#ffffff"), KinkyDungeonRootDirectory + "UI/evasion.png", undefined, undefined, true, "", 24, true); stati++; - let speed = TextGet("StatSpeed" + (KinkyDungeonSlowLevel > 9 ? "Immobile" : (KinkyDungeonMovePoints < 0 ? "Stun" : (KinkyDungeonSlowLevel > 2 ? "VerySlow" : (KinkyDungeonSlowLevel > 1 ? "Slow" : "Normal"))))); - DrawButtonVis(x + 10, y + statAdj + statspacing * stati + i * heightPerBar, width - 15, 40, TextGet("StatSpeed").replace("SPD", speed), - (KinkyDungeonMiscastChance > 0.5) ? "#ff0000" : ((KinkyDungeonSlowLevel > 1 || KinkyDungeonMovePoints < 0) ? (KinkyDungeonSlowLevel < 10 ? "pink" : "#ff0000") : "#ffffff"), KinkyDungeonRootDirectory + "UI/speed.png", undefined, undefined, true, "", 24, true); stati++; - let radius = KinkyDungeonGetVisionRadius(); - DrawButtonVis(x + 10, y + statAdj + statspacing * stati + i * heightPerBar, width - 15, 40, TextGet("StatVision").replace("RADIUS", "" + radius), - (KinkyDungeonMiscastChance > 0.5) ? "#ff0000" : ((radius < 6) ? (radius > 3 ? "pink" : "#ff0000") : "#ffffff"), KinkyDungeonRootDirectory + "UI/vision.png", undefined, undefined, true, "", 24, true); stati++; - let jailstatus = "KinkyDungeonPlayerNotJailed"; - if (KDGameData.PrisonerState == 'jail') { - jailstatus = "KinkyDungeonPlayerJail"; - } else if (KDGameData.PrisonerState == 'parole') { - jailstatus = "KinkyDungeonPlayerParole"; - } else if (KDGameData.PrisonerState == 'chase') { - jailstatus = "KinkyDungeonPlayerChase"; - } - DrawButtonVis(x + 10, y + statAdj + statspacing * stati + i * heightPerBar, width - 15, 40, TextGet(jailstatus), - (!KDGameData.PrisonerState) ? "#ffffff" : (KDGameData.PrisonerState == "parole" ? "lightgreen" : (KDGameData.PrisonerState == "jail" ? "yellow" : "#ff0000")), KinkyDungeonRootDirectory + "UI/jail.png", undefined, undefined, true, "", 24, true); stati++; - DrawButtonVis(x + 10, y + statAdj + statspacing * stati + i * heightPerBar, width - 15, 40, TextGet("StatKey" + (KDCanEscape() ? "Escape" : "")), - KDCanEscape() ? "lightgreen" : "#ffffff", KinkyDungeonRootDirectory + "UI/key.png", undefined, undefined, true, "", 24, true); stati++; - */ - let switchAdj = 460;//395; - let actionButtonAdj = 460; - let actionBarWidth = 64; - let actionBarSpacing = actionBarWidth + 5; - let actionBarII = 0; - let actionBarXX = 1360; - let actionBarYY = 925; - - if (KDToggles.TurnCounter) - DrawTextKD(TextGet("TurnCounter") + KinkyDungeonCurrentTick, 1995, 995, "#ffffff", "#333333", 12, "right"); - - DrawButtonKDEx("switchWeapon", (bdata) => { - if (!KinkyDungeonControlsEnabled()) return false; - KDSwitchWeapon(); - return true; - }, KDGameData.PreviousWeapon != undefined, x, y+i*heightPerBar + switchAdj, width + 5, 60, "", "#ffffff", undefined, undefined, undefined, true); - - if (KDGameData.PreviousWeapon) - DrawImageZoomCanvas(KinkyDungeonRootDirectory + "/Items/" + KDGameData.PreviousWeapon + ".png", MainCanvas, 0, 0, 72, 72, x + width - 40 + 10, y + switchAdj + 10 + i * heightPerBar, 40, 40); - if (KinkyDungeonPlayerWeapon) { - DrawTextFitKD(TextGet("StatWeapon") + TextGet("KinkyDungeonInventoryItem" + KinkyDungeonPlayerWeapon), x + (width - 80)/2, y + switchAdj + 30 + i * heightPerBar, width - 80, "#ffffff", "#333333", 24); - DrawImageZoomCanvas(KinkyDungeonRootDirectory + "/Items/" + KinkyDungeonPlayerWeapon + ".png", MainCanvas, 0, 0, 72, 72, x + width - 100 + 20, y + switchAdj + i * heightPerBar, 60, 60); - } //else KinkyDungeonNoWeapon - - let playColor = "#283540"; - - if (KinkyDungeonCanTryOrgasm()) { - playColor = "#ff5277"; - } else if (KinkyDungeonCanPlayWithSelf()) { - if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax * KinkyDungeonDistractionSleepDeprivationThreshold) playColor = "#4b1d52"; - else if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax * 0.5) playColor = "#692464"; - else if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax * 0.75) playColor = "#9c2a70"; - else playColor = "#cc2f7b"; - } else playColor = "#283540"; - DrawButtonKDEx("PlayButton", (bdata) => { - if (!KinkyDungeonControlsEnabled()) return false; - if (KinkyDungeonCanTryOrgasm()) { - // Done, converted to input - KDSendInput("tryOrgasm", {}); - } else if (KinkyDungeonCanPlayWithSelf()) { - // Done, converted to input - KDSendInput("tryPlay", {}); - } else { - KinkyDungeonSendActionMessage(10, TextGet("KDNotFeeling"), "#ff0000", 1, false, true); - } - return true; - }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, 60, "", playColor, - KinkyDungeonRootDirectory + (KinkyDungeonCanTryOrgasm() ? "UI/LetGo.png" : (KDGameData.OrgasmTurns > KinkyDungeonOrgasmTurnsCrave ? "UI/Edged.png" : "UI/Play.png")), undefined, undefined, !KinkyDungeonCanTryOrgasm()); // KinkyDungeonCanTryOrgasm() ? TextGet("KinkyDungeonTryOrgasm") : TextGet("KinkyDungeonPlayWithSelf") - /* - DrawButtonKDEx("SleepButton", (bdata) => { - if (KinkyDungeonCanSleep()) { - KDSendInput("sleep", {}); - } else { - KinkyDungeonSendActionMessage(10, TextGet("KDCantSleep"), "#ff0000", 1); - } - return true; - }, true, x + 160, y+i*heightPerBar + actionButtonAdj, 75, 64, "", sleepColor, KinkyDungeonRootDirectory + (KinkyDungeonCanSleep() ? "UI/Sleep.png" : (KDGameData.CurrentVibration ? "UI/SleepVibe.png" : "UI/SleepFail.png"))); // TextGet("KinkyDungeonSleep") - */ - - DrawButtonKDEx("WaitButton", (bdata) => { - if (!KinkyDungeonControlsEnabled()) return false; - if (KinkyDungeonAutoWait) { - KinkyDungeonAutoWait = false; - KinkyDungeonTempWait = false; - KinkyDungeonAutoWaitSuppress = false; - } else { - KinkyDungeonAutoWait = true; - KinkyDungeonTempWait = true; - KinkyDungeonAutoWaitSuppress = true; - KinkyDungeonSleepTime = CommonTime() + 100; - } - return true; - }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, 60, "", "", - KinkyDungeonRootDirectory + (KDGameData.KinkyDungeonLeashedPlayer ? "UI/WaitJail.png" : "UI/Wait.png"), undefined, undefined, !KinkyDungeonAutoWait); - DrawButtonKDEx("AutoStruggle", (bdata) => { - if (!KinkyDungeonControlsEnabled()) return false; - KDAutoStruggleClick(); - return true; - }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, 60, "", "", - KinkyDungeonRootDirectory + ("UI/AutoStruggle.png"), undefined, undefined, !KinkyDungeonAutoWaitStruggle); - DrawButtonKDEx("HelpButton", (bdata) => { - if (!KinkyDungeonControlsEnabled()) return false; - KDSendInput("noise", {}); - return true; - }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, 60, "", "#aaaaaa", - KinkyDungeonRootDirectory + ("UI/Help.png"), undefined, undefined, true); // TextGet("KinkyDungeonSleep") - DrawButtonKDEx("togglePass", (bdata) => { - KinkyDungeonToggleAutoPass = !KinkyDungeonToggleAutoPass; - return true; - }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, 60, "", "", - KinkyDungeonRootDirectory + (KinkyDungeonToggleAutoPass ? "UI/Pass.png" : "UI/NoPass.png"), undefined, undefined, !KinkyDungeonToggleAutoPass); - - DrawButtonKDEx("toggleSprint", () => {KinkyDungeonToggleAutoSprint = !KinkyDungeonToggleAutoSprint; return true;}, - true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, 60, - "", "", KinkyDungeonRootDirectory + (KinkyDungeonToggleAutoSprint ? "UI/Sprint.png" : "UI/NoSprint.png"), undefined, undefined, !KinkyDungeonToggleAutoSprint); - //if (KinkyDungeonToggleAutoSprint) - //DrawImage(KinkyDungeonRootDirectory + "SprintWarning.png", bx + bindex * (bwidth + bspacing), 905); bindex++; - - DrawButtonKDEx("toggleDoor", (bdata) => { - KinkyDungeonToggleAutoDoor = !KinkyDungeonToggleAutoDoor; - return true; - }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, 60, - "", "", KinkyDungeonRootDirectory + (KinkyDungeonToggleAutoDoor ? "UI/DoorClose.png" : "UI/Door.png"), undefined, undefined, !KinkyDungeonToggleAutoDoor); - - /*DrawButtonKDEx("toggleAutoStruggle", (bdata) => { - if (!KinkyDungeonFastStruggleSuppress) - KinkyDungeonFastStruggle = !KinkyDungeonFastStruggle; - KinkyDungeonFastStruggleSuppress = false; - KinkyDungeonFastStruggleGroup = ""; - KinkyDungeonFastStruggleType = ""; - return true; - }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, 60, - "", "", KinkyDungeonRootDirectory + (KinkyDungeonFastStruggle ? "AutoStruggle" : "AutoStruggleOff") + ".png", undefined, undefined, !KinkyDungeonFastStruggle);*/ - DrawButtonKDEx("toggleFastMove", (bdata) => { - if (!KinkyDungeonFastMoveSuppress) - KinkyDungeonFastMove = !KinkyDungeonFastMove; - KinkyDungeonFastMoveSuppress = false; - KinkyDungeonFastMovePath = []; - return true; - }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, 60, - "", "", KinkyDungeonRootDirectory + (KinkyDungeonFastMove ? "FastMove" : "FastMoveOff") + ".png", undefined, undefined, !KinkyDungeonFastMove); - DrawButtonKDEx("toggleInspect", (bdata) => { - KinkyDungeonInspect = !KinkyDungeonInspect; - return true; - }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, 60, - "", "", KinkyDungeonRootDirectory + (KinkyDungeonInspect ? "UI/Inspect" : "UI/Inspect") + ".png", undefined, undefined, !KinkyDungeonInspect); - - //DrawButtonVis(1925, 925, 60, 60, "", KDTextGray2, KinkyDungeonRootDirectory + (KinkyDungeonFastMove ? "FastMove" : "FastMoveOff") + ".png"); - //DrawButtonVis(1860, 925, 60, 60, "", KDTextGray2, KinkyDungeonRootDirectory + (KinkyDungeonFastStruggle ? "AutoStruggle" : "AutoStruggleOff") + ".png"); - - //if (MouseIn(x, y+i*heightPerBar + actionButtonAdj - 250, 260, 64) || MouseIn(1855, 925, 200, 60)) { - let str = ""; - actionBarII = 0; - if (MouseIn(actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, 75, 64)) {str = KinkyDungeonCanTryOrgasm() ? "KDLetGo" : "KDPlay";} - // eslint-disable-next-line no-dupe-else-if - else if (MouseIn(actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, 75, 64)) {str = "KDWait";} - // eslint-disable-next-line no-dupe-else-if - else if (MouseIn(actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, 75, 64)) {str = "KDAutoStruggle";} - // eslint-disable-next-line no-dupe-else-if - else if (MouseIn(actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, 75, 64)) {str = "KDHelp";} - // eslint-disable-next-line no-dupe-else-if - else if (MouseIn(actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, 75, 64)) {str = "KDPass";} - // eslint-disable-next-line no-dupe-else-if - else if (MouseIn(actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, 75, 64)) {str = "KDSprint";} - // eslint-disable-next-line no-dupe-else-if - else if (MouseIn(actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, 75, 64)) {str = "KDDoor";} - // eslint-disable-next-line no-dupe-else-if - //else if (MouseIn(actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, 75, 64)) {str = "KDAutoStruggle";} - // eslint-disable-next-line no-dupe-else-if - else if (MouseIn(actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, 75, 64)) {str = "KDAutoPath";} - // eslint-disable-next-line no-dupe-else-if - else if (MouseIn(actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, 75, 64)) {str = "KDInspect";} - - else if (MouseIn(x, y+i*heightPerBar + switchAdj, width + 5, 60)) { - str = "KDSwitchWeapon"; - if (KinkyDungeonPlayerWeapon) { - let inv = KinkyDungeonInventoryGet(KinkyDungeonPlayerWeapon); - if (inv) KinkyDungeonDrawInventorySelected(KDGetItemPreview(inv)); - } - } - if (str) { - DrawTextFitKD(TextGet(str), Math.min(1900, MouseX), y+i*heightPerBar + actionButtonAdj - 15, 250, "#ffffff", undefined, 18); - } - - //} -} - -function KDAutoStruggleClick() { - if (KinkyDungeonAutoWaitStruggle) { - KDDisableAutoWait(); - KinkyDungeonTempWait = false; - KinkyDungeonAutoWaitSuppress = false; - } else { - KinkyDungeonAutoWaitStruggle = true; - KinkyDungeonSleepTime = CommonTime() + 100; - } -} - -function KinkyDungeonActivateWeaponSpell(instant) { - if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.special) { - let energyCost = KinkyDungeonPlayerDamage.special.energyCost; - if (KDGameData.AncientEnergyLevel < energyCost) { - KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonInsufficientEnergy"), "#ff0000", 1); - return true; - } - if (KinkyDungeonPlayerDamage.special.selfCast) { - KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; - KDStartSpellcast(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonFindSpell(KinkyDungeonPlayerDamage.special.spell, true), undefined, KinkyDungeonPlayerEntity, undefined, { - targetingSpellWeapon: KinkyDungeonTargetingSpellWeapon, - }); - KinkyDungeonTargetingSpellWeapon = null; - //KinkyDungeonCastSpell(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, , undefined, undefined, undefined); - } else if (!instant) { - KinkyDungeonTargetingSpell = KinkyDungeonFindSpell(KinkyDungeonPlayerDamage.special.spell, true); - KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; - KDModalArea = false; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = null; - } else { - KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; - KDStartSpellcast(KinkyDungeonTargetX, KinkyDungeonTargetY, KinkyDungeonFindSpell(KinkyDungeonPlayerDamage.special.spell, true), undefined, KinkyDungeonPlayerEntity, undefined, { - targetingSpellWeapon: KinkyDungeonTargetingSpellWeapon, - }); - //KinkyDungeonCastSpell(KinkyDungeonTargetX, KinkyDungeonTargetY, KinkyDungeonFindSpell(KinkyDungeonPlayerDamage.special.spell, true), undefined, KinkyDungeonPlayerEntity, undefined); - KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; - } - return true; - } - return false; -} - -function KinkyDungeonRangedAttack() { - if (!KinkyDungeonPlayerDamage.special) return; - if (KinkyDungeonPlayerDamage.special.type) { - if (KinkyDungeonPlayerDamage.special.type == "hitorspell") { - KinkyDungeonTargetingSpell = {name: "WeaponAttack", components: [], level:1, type:"special", special: "weaponAttackOrSpell", noMiscast: true, manacost: 0, - onhit:"", time:25, power: 0, range: KinkyDungeonPlayerDamage.special.range ? KinkyDungeonPlayerDamage.special.range : 1.5, size: 1, damage: ""}; - KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; - KDModalArea = false; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = null; - return true; - } else if (KinkyDungeonPlayerDamage.special.type == "attack") { - KinkyDungeonTargetingSpell = {name: "WeaponAttack", components: [], level:1, type:"special", special: "weaponAttack", noMiscast: true, manacost: 0, - onhit:"", time:25, power: 0, range: KinkyDungeonPlayerDamage.special.range ? KinkyDungeonPlayerDamage.special.range : 1.5, size: 1, damage: ""}; - KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; - KDModalArea = false; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = null; - return true; - } else if (KinkyDungeonPlayerDamage.special.type == "ignite") { - KDCreateEffectTile(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, { - name: "Ignition", - duration: 1, - }, 0); - return true; - } /*else if (KinkyDungeonPlayerDamage.special.type == "attack") { - KinkyDungeonTargetingSpell = {name: "WeaponAttack", components: [], level:1, type:"special", special: "weaponAttack", noMiscast: true, - onhit:"", time:25, power: 0, range: KinkyDungeonPlayerDamage.special.range ? KinkyDungeonPlayerDamage.special.range : 1.5, size: 1, damage: ""}; - KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; - return true; - }*/ else { - return KinkyDungeonActivateWeaponSpell(); - } - - } - return false; -} - -let KDModalArea_x = 600; -let KDModalArea_y = 700; -let KDModalArea_width = 800; -let KDModalArea_height = 100; -let KDModalArea = true; -let KDConfirmDeleteSave = false; - -function KinkyDungeonHandleHUD() { - let buttonWidth = 48; - if (KinkyDungeonDrawState == "Game") { - if (KinkyDungeonShowInventory) { - // Done, converted to input - KinkyDungeonhandleQuickInv(); - return true; - } - if (KinkyDungeonMessageToggle) { - /*if (KinkyDungeonMessageLog.length > KDMaxLog) { - if (MouseIn(500 + 1250/2 - 200, KDLogTopPad + KDLogHeight + 50, 90, 40)) { - if (KDLogIndex > 0) - KDLogIndex = Math.max(0, KDLogIndex - KDLogIndexInc); - return true; - } else if (MouseIn(500 + 1250/2 + 100, KDLogTopPad + KDLogHeight + 50, 90, 40)) { - if (KDLogIndex < KinkyDungeonMessageLog.length - KDMaxLog) - KDLogIndex = Math.min(Math.max(0, KinkyDungeonMessageLog.length - KDMaxLog), KDLogIndex + KDLogIndexInc); - return true; - } - }*/ - if (MouseIn(500, KDLogTopPad, 1250, KDLogHeight + 175)) { - return true; - } - } - /*if (KinkyDungeonIsPlayer() && MouseIn(1925, 925, 60, 60)) { - if (!KinkyDungeonFastMoveSuppress) - KinkyDungeonFastMove = !KinkyDungeonFastMove; - KinkyDungeonFastMoveSuppress = false; - KinkyDungeonFastMovePath = []; - return true; - } else if (KinkyDungeonIsPlayer() && MouseIn(1860, 925, 60, 60)) { - if (!KinkyDungeonFastStruggleSuppress) - KinkyDungeonFastStruggle = !KinkyDungeonFastStruggle; - KinkyDungeonFastStruggleSuppress = false; - KinkyDungeonFastStruggleGroup = ""; - KinkyDungeonFastStruggleType = ""; - return true; - }*/ - - if (KinkyDungeonIsPlayer() && MouseIn(canvasOffsetX, canvasOffsetY, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height)) - KinkyDungeonSetTargetLocation(); - - // Old Nav bar - /*if (MouseIn(650, 925, 165, 60)) { KinkyDungeonDrawState = "Inventory"; return true;} - else if (MouseIn(990, 935, 165, 50)) { - KinkyDungeonDrawState = "Logbook"; - KinkyDungeonUpdateLore(localStorage.getItem("kinkydungeonexploredlore") ? JSON.parse(localStorage.getItem("kinkydungeonexploredlore")) : []); - return true;} - else if (MouseIn(820, 925, 165, 60)) { KinkyDungeonDrawState = "Reputation"; return true;} - else - if (MouseIn(1630, 925, 200, 60)) { - KinkyDungeonDrawState = "MagicSpells"; - return true;}*/ - - if (MouseIn(510, 925, 120, 60)) { - KinkyDungeonDrawStruggle += 1; - if (KinkyDungeonDrawStruggle > 2) KinkyDungeonDrawStruggle = 0; - return true; - } else if (MouseIn(510, 825, 60, 90)) { - KinkyDungeonShowInventory = !KinkyDungeonShowInventory; - return true; - } else if (KinkyDungeonIsPlayer() && MouseIn(580, 825, 50, 90) && KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.special) { - // Done, converted to input - return KinkyDungeonRangedAttack(); - } - - if ((ServerURL == "foobar" && MouseIn(1880, 82, 100, 50)) || (ServerURL != "foobar" && MouseIn(1750, 20, 100, 50))) { - KinkyDungeonDrawState = "Restart"; - KDConfirmDeleteSave = false; - if (KDDebugMode) { - ElementCreateTextArea("DebugEnemy"); - ElementValue("DebugEnemy", "Maidforce"); - ElementCreateTextArea("DebugItem"); - ElementValue("DebugItem", "TrapArmbinder"); - } - return true; - } - - // Done, converted to input - if (!KinkyDungeonTargetingSpell) { - KinkyDungeonSpellPress = ""; - if (KinkyDungeonHandleSpell()) return true; - } else { - KinkyDungeonSpellPress = ""; - } - - if (KinkyDungeonIsPlayer() && KinkyDungeonTargetTile) { - if (KinkyDungeonTargetTile.Type && - ((KinkyDungeonTargetTile.Type == "Lock" && KinkyDungeonTargetTile.Lock) || (KinkyDungeonTargetTile.Type == "Door" && KinkyDungeonTargetTile.Lock))) { - if (KinkyDungeonLockpicks > 0 && (KinkyDungeonTargetTile.Lock.includes("Red") || KinkyDungeonTargetTile.Lock.includes("Blue")) && MouseIn(KDModalArea_x + 313, KDModalArea_y + 25, 112, 60)) { - // Done, converted to input - KDSendInput("pick", {targetTile: KinkyDungeonTargetTileLocation}); - return true; - } - - if (((KinkyDungeonTargetTile.Lock.includes("Red") && KinkyDungeonRedKeys > 0) - || (KinkyDungeonTargetTile.Lock.includes("Blue") && KinkyDungeonBlueKeys > 0)) && MouseIn(KDModalArea_x + 175, KDModalArea_y + 25, 112, 60)) { - // Done, converted to input - KDSendInput("unlock", {targetTile: KinkyDungeonTargetTileLocation}); - return true; - } - if (((KinkyDungeonTargetTile.Lock.includes("Purple") && KinkyDungeonStatMana > KinkyDungeonGetManaCost(KinkyDungeonFindSpell("CommandWord", true)))) && MouseIn(KDModalArea_x + 175, KDModalArea_y + 25, 112, 60)) { - // Done, converted to input - KDSendInput("commandunlock", {targetTile: KinkyDungeonTargetTileLocation}); - return true; - } - } else if (KinkyDungeonTargetTile.Type == "Shrine") { - // Done, converted to input - if (KinkyDungeonHandleShrine()) { - return true; - // if (KinkyDungeonSound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - } - } else if (KDObjectHandle[KinkyDungeonTargetTile.Type]) { - return KDObjectHandle[KinkyDungeonTargetTile.Type](); - } else if (KinkyDungeonTargetTile.Type == "Door") { - if (MouseIn(KDModalArea_x + 25, KDModalArea_y + 25, 350, 60)) { - // Done, converted to input - KDSendInput("closeDoor", {targetTile: KinkyDungeonTargetTileLocation}); - return true; - } - } - } else { - /*if (MouseIn(1160, 935, 145, 50)) { - KinkyDungeonToggleAutoDoor = !KinkyDungeonToggleAutoDoor; - return true; - } else if (MouseIn(1310, 935, 145, 50)) { - KinkyDungeonToggleAutoPass = !KinkyDungeonToggleAutoPass; - return true; - }*/ - } - - // Done, converted to input - if (KinkyDungeonStruggleGroups && KinkyDungeonDrawStruggleHover) - for (let sg of KinkyDungeonStruggleGroups) { - let ButtonWidth = 60; - let x = 5 + ((!sg.left) ? (490 - ButtonWidth) : 0); - let y = 42 + sg.y * (ButtonWidth + 46); - - let i = 0; - let buttons = ["Struggle", "CurseInfo", "CurseUnlock", "Cut", "Remove", "Pick"]; - - let item = KinkyDungeonGetRestraintItem(sg.group); - let surfaceItems = KDDynamicLinkListSurface(item); - - - if (KDStruggleGroupLinkIndex[sg.group]) { - if (!KDStruggleGroupLinkIndex[sg.group] || KDStruggleGroupLinkIndex[sg.group] >= surfaceItems.length) { - KDStruggleGroupLinkIndex[sg.group] = 0; - } - item = surfaceItems[KDStruggleGroupLinkIndex[sg.group]]; - } - let r = KDRestraint(item); - - if (KinkyDungeonControlsEnabled()) - for (let button_index = 0; button_index < buttons.length; button_index++) { - let btn = buttons[sg.left ? button_index : (buttons.length - 1 - button_index)]; - if (btn == "Struggle") { - if (MouseIn(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth)) { - if ((item.curse || r.curse)) KDSendInput("struggleCurse", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], curse: (item.curse || r.curse)}); - else { - if (KinkyDungeonFastStruggle) { - KinkyDungeonFastStruggleGroup = sg.group; - KinkyDungeonFastStruggleType = "Struggle"; - } else - KDSendInput("struggle", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], type: "Struggle"}); - //KinkyDungeonStruggle(sg, "Struggle"); - } return true; - } i++; - } else if ((item.curse || r.curse) && btn == "CurseInfo") { - if (MouseIn(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth)) {KinkyDungeonCurseInfo(item, (item.curse || r.curse)); return true;} i++; - } else if ((item.curse || r.curse) && btn == "CurseUnlock" && KinkyDungeonCurseAvailable(sg, (item.curse || r.curse))) { - if (MouseIn(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth) && KinkyDungeonCurseAvailable(item, (item.curse || r.curse))) { - KDSendInput("curseUnlock", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], curse: (item.curse || r.curse)}); - return true;} i++; - } else if (!(item.curse || r.curse) && !sg.blocked && btn == "Remove") { - if (MouseIn(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth) && item.lock != "Jammed") { - if (KinkyDungeonFastStruggle) { - KinkyDungeonFastStruggleGroup = sg.group; - KinkyDungeonFastStruggleType = (item.lock) ? "Unlock" : "Remove"; - } else - KDSendInput("struggle", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], type: (item.lock) ? "Unlock" : "Remove"}); - return true; - } i++; - } else if (!(item.curse || r.curse) && !sg.blocked && btn == "Cut" - && (KinkyDungeonAllWeapon().some((inv) => {return KDWeapon(inv).light && KDWeapon(inv).cutBonus != undefined;}) || KinkyDungeonGetAffinity(false, "Sharp")) - && !sg.noCut) { - if (MouseIn(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth)) { - if (KinkyDungeonFastStruggle) { - KinkyDungeonFastStruggleGroup = sg.group; - KinkyDungeonFastStruggleType = "Cut"; - } else - KDSendInput("struggle", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], type: "Cut"}); - //KinkyDungeonStruggle(sg, "Cut"); - return true; - } i++; - } else if (!(item.curse || r.curse) && !sg.blocked && btn == "Pick" && KinkyDungeonLockpicks > 0 && item.lock) { - if (KinkyDungeonLockpicks > 0 && item.lock) { - if (MouseIn(x + ((!sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth)) { - if (KinkyDungeonFastStruggle) { - KinkyDungeonFastStruggleGroup = sg.group; - KinkyDungeonFastStruggleType = "Pick"; - } else - KDSendInput("struggle", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], type: "Pick"}); - //KinkyDungeonStruggle(sg, "Pick"); - return true; - } i++; - } - } - } - } - - let xxx = 1750; - let yyy = 164; - if (MouseIn(xxx, yyy + 0 * KinkyDungeonStatBarHeight, buttonWidth, buttonWidth) && KinkyDungeonItemCount("PotionFrigid") && KinkyDungeonStatDistraction > 0) { - if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) - // Done, converted to input - KDSendInput("consumable", {item: "PotionFrigid", quantity: 1}); - else KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonPotionGagged"), "orange", 1); - return true; - } else if (MouseIn(xxx, yyy + 1 * KinkyDungeonStatBarHeight, buttonWidth, buttonWidth) && KinkyDungeonItemCount("PotionStamina") && KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax) { - if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) - // Done, converted to input - KDSendInput("consumable", {item: "PotionStamina", quantity: 1}); - else KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonPotionGagged"), "orange", 1); - return true; - } else if (MouseIn(xxx, yyy + 2 * KinkyDungeonStatBarHeight, buttonWidth, buttonWidth) && KinkyDungeonItemCount("PotionMana") && (KinkyDungeonStatMana < KinkyDungeonStatManaMax || KinkyDungeonStatManaPool < KinkyDungeonStatManaPoolMax)) { - if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) - // Done, converted to input - KDSendInput("consumable", {item: "PotionMana", quantity: 1}); - else KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonPotionGagged"), "orange", 1); - return true; - } if (MouseIn(xxx, yyy + 3 * KinkyDungeonStatBarHeight, buttonWidth, buttonWidth) && KinkyDungeonItemCount("PotionWill") && KinkyDungeonStatWill < KinkyDungeonStatWillMax) { - if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) - // Done, converted to input - KDSendInput("consumable", {item: "PotionWill", quantity: 1}); - else KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonPotionGagged"), "orange", 1); - return true; - } else if (MouseIn(xxx, yyy + 0 * KinkyDungeonStatBarHeight, buttonWidth, buttonWidth)) return true; - else if (MouseIn(xxx, yyy + 1 * KinkyDungeonStatBarHeight, buttonWidth, buttonWidth)) return true; - else if (MouseIn(xxx, yyy + 2 * KinkyDungeonStatBarHeight, buttonWidth, buttonWidth)) return true; - } else if (KinkyDungeonDrawState == "Orb") { - // Done, converted to input - return KinkyDungeonHandleOrb(); - } else if (KinkyDungeonDrawState == "Heart") { - // Done, converted to input - return KinkyDungeonHandleHeart(); - } else if (KinkyDungeonDrawState == "Magic") { - // Done, converted to input - return KinkyDungeonHandleMagic(); - } else if (KinkyDungeonDrawState == "MagicSpells") { - // Nothing to convert - return KinkyDungeonHandleMagicSpells(); - } else if (KinkyDungeonDrawState == "Inventory") { - // Done, converted to input - return KinkyDungeonHandleInventory(); - } else if (KinkyDungeonDrawState == "Logbook") { - // Done, converted to input - return KinkyDungeonHandleLore(); - } else if (KinkyDungeonDrawState == "Reputation") { - // Done, converted to input - return KinkyDungeonHandleReputation(); - } else if (KinkyDungeonDrawState == "Lore") { - // Done, converted to input - return KinkyDungeonHandleLore(); - } else if (KinkyDungeonDrawState == "Perks2") { - if (MouseIn(1650, 920, 300, 64)) { - KinkyDungeonDrawState = "Restart"; - KDConfirmDeleteSave = false; - if (KDDebugMode) { - ElementCreateTextArea("DebugEnemy"); - ElementValue("DebugEnemy", "Maidforce"); - ElementCreateTextArea("DebugItem"); - ElementValue("DebugItem", "TrapArmbinder"); - } - return true; - } - } else if (KinkyDungeonDrawState == "Restart") { - if (MouseIn(600, 20, 64, 64)) { - if (TestMode) { - KDDebugMode = !KDDebugMode; - ElementCreateTextArea("DebugEnemy"); - ElementValue("DebugEnemy", "Maidforce"); - ElementCreateTextArea("DebugItem"); - ElementValue("DebugItem", "TrapArmbinder"); - return true; - } - } - if (KDDebugMode) { - if (MouseIn(1100, 20, 64, 64)) { - KDDebug = !KDDebug; - return true; - } else - if (MouseIn(1100, 100, 64, 64)) { - KDDebugPerks = !KDDebugPerks; - return true; - } else - if (MouseIn(1100, 180, 64, 64)) { - if (KDDebugGold) { - KDDebugGold = false; - KinkyDungeonGold = 0; - } else { - KDDebugGold = true; - KinkyDungeonGold = 100000; - } - return true; - } else - if (MouseIn(1500, 100, 100, 64)) { - let enemy = KinkyDungeonEnemies.find((element) => {return element.name.toLowerCase() == ElementValue("DebugEnemy").toLowerCase();}); - if (enemy) { - KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, enemy.name, 1, 1.5); - } - return true; - }else - if (MouseIn(1600, 100, 100, 64)) { - let enemy = KinkyDungeonEnemies.find((element) => {return element.name.toLowerCase() == ElementValue("DebugEnemy").toLowerCase();}); - if (enemy) { - let e = DialogueCreateEnemy(KinkyDungeonPlayerEntity.x -1, KinkyDungeonPlayerEntity.y, enemy.name); - e.allied = 9999; - } - return true; - }else - if (MouseIn(1700, 100, 100, 64)) { - let enemy = KinkyDungeonEnemies.find((element) => {return element.name.toLowerCase() == ElementValue("DebugEnemy").toLowerCase();}); - if (enemy) { - let e = DialogueCreateEnemy(KinkyDungeonPlayerEntity.x -1, KinkyDungeonPlayerEntity.y, enemy.name); - e.ceasefire = 1000; - let shop = KinkyDungeonGetShopForEnemy(e, true); - if (shop) { - KinkyDungeonSetEnemyFlag(e, "Shop", -1); - KinkyDungeonSetEnemyFlag(e, shop, -1); - } - } - return true; - } else - if (MouseIn(1500, 260, 300, 64)) { - let item = null; - if (KinkyDungeonConsumables[ElementValue("DebugItem")]) KinkyDungeonChangeConsumable(KinkyDungeonConsumables[ElementValue("DebugItem")], 10); - else if (KinkyDungeonWeapons[ElementValue("DebugItem")]) KinkyDungeonInventoryAddWeapon(ElementValue("DebugItem")); - else if (KinkyDungeonGetRestraintByName(ElementValue("DebugItem"))) { - let restraint = KinkyDungeonGetRestraintByName(ElementValue("DebugItem")); - KinkyDungeonInventoryAdd({name: ElementValue("DebugItem"), type: LooseRestraint, events: restraint.events, quantity: 10, id: KinkyDungeonGetItemID()}); - } else if (KinkyDungeonOutfitsBase.filter((outfit) => {return outfit.name == ElementValue("DebugItem");}).length > 0) { - KinkyDungeonInventoryAdd({name: KinkyDungeonOutfitsBase.filter((outfit) => {return outfit.name == ElementValue("DebugItem");})[0].name, type: Outfit, id: KinkyDungeonGetItemID()}); - } - - if (item) - KinkyDungeonInventoryAdd(item); - return true; - } - if (MouseIn(1500, 320, 300, 64)) { - let saveData = KinkyDungeonSaveGame(true); - KinkyDungeonState = "Save"; - ElementCreateTextArea("saveDataField"); - ElementValue("saveDataField", saveData); - return true; - } - if (MouseIn(1100, 260, 300, 64)) { - - KDMovePlayer(KinkyDungeonEndPosition.x, KinkyDungeonEndPosition.y, false); - KDGameData.JailKey = true; - KinkyDungeonUpdateLightGrid = true; - return true; - } else - if (MouseIn(1100, 320, 300, 64)) { - KDGameData.PrisonerState = 'parole'; - return true; - } - } - - if (MouseIn(1650, 900, 300, 64)) { - KinkyDungeonDrawState = "Perks2"; - return true; - } - - //if (MouseIn(600, 650, 64, 64)) { - //KinkyDungeonFastWait = !KinkyDungeonFastWait; - //return true; - //} - // Done, converted to input - if (KinkyDungeonIsPlayer() && MouseIn(975, 800, 550, 64) && KDGameData.PrisonerState != 'jail' && KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)) { - - if (KDConfirmDeleteSave) { - KDSendInput("defeat", {}); - KinkyDungeonDrawState = "Game"; - } else { - KDConfirmDeleteSave = true; - } - return true; - } - // Done, converted to input - if (KinkyDungeonIsPlayer() && MouseIn(975, 900, 550, 64)) { - if (KDConfirmDeleteSave) { - KDSendInput("lose", {}); - //Player.KinkyDungeonSave = {}; - //ServerAccountUpdate.QueueData({KinkyDungeonSave : Player.KinkyDungeonSave}); - // Update bones here once we create them - localStorage.setItem('KinkyDungeonSave', ""); - } else { - KDConfirmDeleteSave = true; - } - - - return true; - } else if (MouseIn(975, 550, 550, 64)) { - KinkyDungeonDrawState = "Game"; - return true; - } else if (KinkyDungeonIsPlayer() && MouseIn(975, 650, 550, 64)) { - KinkyDungeonSaveGame(); - KinkyDungeonState = "Menu"; - //KinkyDungeonAutoWait = true; - //KinkyDungeonTempWait = false; - //KinkyDungeonAutoWaitSuppress = true; - //KinkyDungeonSleepTime = CommonTime() + 500; - return true; - } - KDConfirmDeleteSave = false; - return true; - } - - if (KDModalArea && MouseIn(KDModalArea_x, KDModalArea_y, KDModalArea_width, KDModalArea_height)) return true; - if (MouseIn(0, 0, 500, 1000)) return true; - if (MouseIn(1650, 0, 350, 1000)) return true; - KDModalArea = false; - return false; -} - -let KDStruggleGroupLinkIndex = {}; - -function KinkyDungeonUpdateStruggleGroups() { - let struggleGroups = KinkyDungeonStruggleGroupsBase; - KinkyDungeonStruggleGroups = []; - - KinkyDungeonCheckClothesLoss = true; - - for (let S = 0; S < struggleGroups.length; S++) { - let sg = struggleGroups[S]; - let Group = sg; - if (sg == "ItemM") { - //if (InventoryGet(KinkyDungeonPlayer, "ItemMouth3")) Group = "ItemMouth3"; - //else if (InventoryGet(KinkyDungeonPlayer, "ItemMouth2")) Group = "ItemMouth2"; - //else Group = "ItemMouth"; - Group = "ItemMouth"; - } - if (sg == "ItemH") { - //if (KinkyDungeonGetRestraintItem("ItemHood")) Group = "ItemHood"; - //else Group = "ItemHead"; - Group = "ItemHead"; - } - - let restraint = KinkyDungeonGetRestraintItem(Group); - - if (restraint) { - KinkyDungeonStruggleGroups.push( - { - group:Group, - left: S % 2 == 0, - y: Math.floor(S/2), - icon:sg, - name:(KDRestraint(restraint)) ? KDRestraint(restraint).name : "", - lock:restraint.lock, - magic:KDRestraint(restraint) ? KDRestraint(restraint).magic : undefined, - noCut:KDRestraint(restraint) && KDRestraint(restraint).escapeChance && KDRestraint(restraint).escapeChance.Cut == undefined, - curse:KDRestraint(restraint)? (restraint.curse || KDRestraint(restraint).curse) : undefined, - blocked: !KDRestraint(restraint).alwaysStruggleable && KDGroupBlocked(Group)}); - } - } -} diff --git a/Game/KinkyDungeonInput.js b/Game/KinkyDungeonInput.js deleted file mode 100644 index 7da1f7e5b..000000000 --- a/Game/KinkyDungeonInput.js +++ /dev/null @@ -1,734 +0,0 @@ -"use strict"; - -/** - * @type {{type: string, data: any}[]} - */ -let KinkyDungeonInputQueue = []; - -/** - * @returns {string} - * Delegate to KDProcessInputs */ -function KDProcessInput(type, data) { - let Result = null; - let loose = null; - let msg = ""; - let success = 0; - let tile = null; - - KDUpdateEnemyCache = true; - switch (type) { - case "move": - KinkyDungeonToggleAutoDoor = data.AutoDoor; - KinkyDungeonToggleAutoPass = data.AutoPass; - KinkyDungeonToggleAutoSprint = data.sprint; - KinkyDungeonSuppressSprint = data.SuppressSprint; - KinkyDungeonMove(data.dir, data.delta, data.AllowInteract, data.SuppressSprint); - break; - case "setMoveDirection": - KinkyDungeonMoveDirection = data.dir; - break; - case "tick": - if (data.sleep == 10 && (KDGameData.PrisonerState == 'jail' || KDGameData.PrisonerState == 'parole') && KinkyDungeonPlayerInCell()) { - KDKickEnemies(KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)); - } - if (data.sleep && KinkyDungeonStatWill < KinkyDungeonStatWillMax * KDGetSleepWillFraction()) KinkyDungeonChangeWill(KinkyDungeonStatWillMax/KDMaxStatStart * KDSleepRegenWill, false); - KinkyDungeonAdvanceTime(data.delta, data.NoUpdate, data.NoMsgTick); - break; - case "tryCastSpell": { - KDDelayedActionPrune(["Action", "Cast"]); - let sp = data.spell ? data.spell : KinkyDungeonFindSpell(data.spellname, true); - if (!data.spell) data.spell = sp; - if (sp) { - /** @type {{result: string, data: any}} */ - let res = KinkyDungeonCastSpell(data.tx, data.ty, sp, data.enemy, data.player, data.bullet, undefined, data); - if (res.result == "Cast" && sp.sfx) { - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + sp.sfx + ".ogg"); - } - if (res.result != "Fail") { - KinkyDungeonAdvanceTime(res.data.delta); - } - KinkyDungeonInterruptSleep(); - Result = res.result; - return Result; - } - return "Fail"; - } - case "struggle": - KDDelayedActionPrune(["Action", "Struggle"]); - return KinkyDungeonStruggle(data.group, data.type, data.index); - case "struggleCurse": { - KDDelayedActionPrune(["Action", "Struggle"]); - let item = KinkyDungeonGetRestraintItem(data.group); - if (data.index) { - let surfaceItems = KDDynamicLinkListSurface(item); - if (surfaceItems[data.index]) - item = surfaceItems[data.index]; - else console.log("Error! Please report the item combination and screenshot to Ada!"); - } - KinkyDungeonCurseStruggle(item, data.curse); - break; - } - case "curseUnlock": - KDDelayedActionPrune(["Action", "Struggle"]); - KinkyDungeonCurseUnlock(data.group, data.index, data.curse); - break; - case "toggleSpell": - KinkyDungeonSpellChoicesToggle[data.i] = !KinkyDungeonSpellChoicesToggle[data.i]; - KinkyDungeonSendEvent("toggleSpell", {index: data.i, spell: KinkyDungeonSpells[KinkyDungeonSpellChoices[data.i]]}, KinkyDungeonSpells[KinkyDungeonSpellChoices[data.i]]); - if (KinkyDungeonSpellChoicesToggle[data.i] && KinkyDungeonSpells[KinkyDungeonSpellChoices[data.i]].costOnToggle) { - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(KinkyDungeonSpells[KinkyDungeonSpellChoices[data.i]]))) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(KinkyDungeonSpells[KinkyDungeonSpellChoices[data.i]])); - } else KinkyDungeonSpellChoicesToggle[data.i] = false; - } - break; - case "consumable": - KDModalArea = false; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = null; - KinkyDungeonAttemptConsumable(data.item, data.quantity); - break; - case "switchWeapon": { - KDDelayedActionPrune(["Action", "SwitchWeapon"]); - let oldweapon = KinkyDungeonPlayerWeapon; - KDGameData.PreviousWeapon = oldweapon; - KDSetWeapon(data.weapon); - KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); - if (KinkyDungeonStatsChoice.has("Disorganized")) { - KinkyDungeonAdvanceTime(1); - KinkyDungeonSlowMoveTurns = 2; - } else if (!KinkyDungeonStatsChoice.has("QuickDraw")) - KinkyDungeonAdvanceTime(1); - KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonEquipWeapon").replace("WEAPONNAME", TextGet("KinkyDungeonInventoryItem" + data.weapon)), "white", 5); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Equip.ogg"); - break; - } - case "unequipWeapon": - KDDelayedActionPrune(["Action", "SwitchWeapon"]); - KDGameData.PreviousWeapon = data.weapon; - KDSetWeapon(null); - KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); - KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonUnEquipWeapon").replace("WEAPONNAME", TextGet("KinkyDungeonInventoryItem" + data.weapon)), "white", 5); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Equip.ogg"); - break; - case "dress": - KDDelayedActionPrune(["Action", "Dress"]); - KinkyDungeonSetDress(data.dress, data.outfit); - KinkyDungeonSlowMoveTurns = 5; - KinkyDungeonSleepTime = CommonTime() + 200; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Equip.ogg"); - break; - case "equip": - KDDelayedActionPrune(["Action", "Equip"]); - success = KinkyDungeonAddRestraintIfWeaker(KinkyDungeonRestraintsCache.get(data.name), 0, true, "", KinkyDungeonGetRestraintItem(data.Group) && !KinkyDungeonLinkableAndStricter(KinkyDungeonRestraintsCache.get(data.currentItem), KinkyDungeonRestraintsCache.get(data.name)), false, data.events, data.faction, false, data.curse); - if (success != undefined) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Unlock.ogg"); - KDSendStatus('bound', data.name, "self"); - loose = KinkyDungeonInventoryGetLoose(data.name); - if (!(loose.quantity > 1)) { - KinkyDungeonInventoryRemove(loose); - } else { - loose.quantity -= 1; - } - - KDStunTurns(2); - - msg = "KinkyDungeonSelfBondage"; - if (KDRestraint(loose).Group == "ItemVulvaPiercings" || KDRestraint(loose).Group == "ItemVulva" || KDRestraint(loose).Group == "ItemButt") { - if (KinkyDungeonIsChaste(false)) { - msg = "KinkyDungeonSelfBondagePlug"; - } - } else if (KDRestraint(loose).Group == "Item") { - if (KinkyDungeonIsChaste(true)) { - msg = "KinkyDungeonSelfBondageNipple"; - } - } else if (KDRestraint(loose).enchanted) { - msg = "KinkyDungeonSelfBondageEnchanted"; - } - KinkyDungeonSendTextMessage(10, TextGet(msg).replace("RestraintName", TextGet("Restraint" + KDRestraint(loose).name)), "yellow", 1); - - return msg; - } else return "KDCantEquip"; - case "tryOrgasm": - KDDelayedActionPrune(["Action", "Sexy"]); - KinkyDungeonDoTryOrgasm(data.bonus); - break; - case "tryPlay": - KDDelayedActionPrune(["Action", "Sexy"]); - KinkyDungeonDoPlayWithSelf(); - break; - case "sleep": - KDGameData.SleepTurns = KinkyDungeonSleepTurnsMax; - break; - case "noise": { - KDDelayedActionPrune(["Action", "Dialogue"]); - let gagTotal = KinkyDungeonGagTotal(true); - KinkyDungeonMakeNoise(Math.ceil(10 - 8 * Math.min(1, gagTotal * gagTotal)), KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - KinkyDungeonSendTextMessage(10, TextGet("KDShoutHelp" + Math.min(3, Math.floor(gagTotal *3.3))), "yellow", 1); - break; - } - case "pick": - KDDelayedActionPrune(["Action", "Struggle"]); - tile = KinkyDungeonTilesGet(data.targetTile); - KinkyDungeonTargetTile = tile; - KinkyDungeonTargetTileLocation = data.targetTile; - if (KinkyDungeonTargetTile?.Lock) { - KinkyDungeonAdvanceTime(1, true); - if (KinkyDungeonPickAttempt()) { - KinkyDungeonTargetTile.Lock = undefined; - if (KinkyDungeonTargetTile.Type == "Lock") delete KinkyDungeonTargetTile.Type; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - } - KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); - } - break; - case "unlock": - KDDelayedActionPrune(["Action", "Struggle"]); - tile = KinkyDungeonTilesGet(data.targetTile); - KinkyDungeonTargetTile = tile; - KinkyDungeonTargetTileLocation = data.targetTile; - - if (KinkyDungeonTargetTile?.Lock) { - KDUpdateDoorNavMap(); - KinkyDungeonAdvanceTime(1, true); - if (KinkyDungeonUnlockAttempt(KinkyDungeonTargetTile.Lock)) { - KinkyDungeonTargetTile.Lock = undefined; - if (KinkyDungeonTargetTile.Type == "Lock") delete KinkyDungeonTargetTile.Type; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - } - KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); - } - break; - case "commandunlock": { - KDDelayedActionPrune(["Action", "Cast"]); - tile = KinkyDungeonTilesGet(data.targetTile); - KinkyDungeonTargetTile = tile; - KinkyDungeonTargetTileLocation = data.targetTile; - - - if (KinkyDungeonTargetTile?.Lock) { - KinkyDungeonAdvanceTime(1, true); - let spell = KinkyDungeonFindSpell("CommandWord", true); - let miscast = KinkyDungeonMiscastChance; - let gagTotal = KinkyDungeonGagTotal(); - if (KinkyDungeoCheckComponents(KinkyDungeonFindSpell("CommandWord"), KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y).length > 0) { - miscast = miscast + Math.max(0, 1 - miscast) * Math.min(1, gagTotal); - } - if (KDRandom() > miscast) { - KinkyDungeonTargetTile.Lock = undefined; - if (KinkyDungeonTargetTile.Type == "Lock") delete KinkyDungeonTargetTile.Type; - KDUpdateDoorNavMap(); - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - if (gagTotal) { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonUnlockDoorPurpleUseGagged"), "#aa44ff", 1); - } else { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonUnlockDoorPurpleUse"), "#aa44ff", 1); - } - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - } else { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonUnlockDoorPurpleUseGaggedFail"), "#ff0000", 1); - } - KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); - } - - break; - } - case "closeDoor": - KDDelayedActionPrune(["Action", "World"]); - KinkyDungeonCloseDoor(data); - break; - case "shrineBuy": - KDDelayedActionPrune(["Action", "World"]); - KinkyDungeonShopIndex = data.shopIndex; - KinkyDungeonPayShrine(data.type); - KinkyDungeonAggroAction('shrine', {}); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - break; - case "shrineUse": - KDDelayedActionPrune(["Action", "World"]); - tile = KinkyDungeonTilesGet(data.targetTile); - //KinkyDungeonTargetTile = tile; - //KinkyDungeonTargetTileLocation = data.targetTile; - KinkyDungeonAdvanceTime(1, true); - //KinkyDungeonTargetTile = null; - if (KinkyDungeonGold >= data.cost) { - KinkyDungeonPayShrine(data.type); - KinkyDungeonTilesDelete(KinkyDungeonTargetTileLocation); - let x = data.targetTile.split(',')[0]; - let y = data.targetTile.split(',')[1]; - KinkyDungeonMapSet(parseInt(x), parseInt(y), "a"); - //KinkyDungeonTargetTileLocation = ""; - KinkyDungeonAggroAction('shrine', {x: parseInt(x), y:parseInt(y)}); - KDGameData.AlreadyOpened.push({x: parseInt(x), y: parseInt(y)}); - KinkyDungeonUpdateStats(0); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - } else { - if (KinkyDungeonShrineTypeRemove.includes(type)) - KinkyDungeonSendActionMessage(9, TextGet("KDNoRestraints"), "#ff5555", 1, true); - else - KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonPayShrineFail"), "#ff5555", 1, true); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Damage.ogg"); - } - KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); - break; - case "shrineDrink": { - if (!KDCanDrinkShrine(false)) { - KinkyDungeonSendActionMessage(9, TextGet("KDNoMana"), "#ff5555", 2, true); - break; - } - KDDelayedActionPrune(["Action", "World"]); - tile = KinkyDungeonTilesGet(data.targetTile); - if (tile) tile.drunk = true; - KinkyDungeonAdvanceTime(1, true); - - // KinkyDungeonStatsChoice.get("Blessed") - let slimed = 0; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).slimeLevel) { - slimed += 1; - KinkyDungeonRemoveRestraint(KDRestraint(inv).Group, false); - } - } - if (slimed) { - KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonPoolDrinkSlime"), "#FF00FF", 2); - KinkyDungeonChangeRep(data.type, -slimed * 2); - } - else KinkyDungeonSendActionMessage(9, TextGet(KinkyDungeonGagTotal() > 0 ? "KinkyDungeonPoolDrinkFace" : "KinkyDungeonPoolDrink"), "#AAFFFF", 2); - KinkyDungeonChangeMana(5, false, 0, false, true); - KDSendStatus('goddess', data.type, 'shrineDrink'); - KinkyDungeonAggroAction('shrine', {}); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - - let x = data.targetTile.split(',')[0]; - let y = data.targetTile.split(',')[1]; - KDSummonRevengeMobs(parseInt(x), parseInt(y), tile.type, slimed ? 1.5 : 1); - - KDGameData.PoolUses += 1; - break; - } - case "shrineBottle": { - if (!KDCanDrinkShrine(true)) { - KinkyDungeonSendTextMessage(9, TextGet("KDNoMana"), "#ff5555", 2, true); - break; - } - KDDelayedActionPrune(["Action", "World"]); - tile = KinkyDungeonTilesGet(data.targetTile); - if (tile) tile.drunk = true; - - KinkyDungeonAdvanceTime(1, true); - let x = data.targetTile.split(',')[0]; - let y = data.targetTile.split(',')[1]; - KDSummonRevengeMobs(parseInt(x), parseInt(y), tile.type, 1.0); - - // KinkyDungeonStatsChoice.get("Blessed") - KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonPoolBottle"), "#AAFFFF", 2); - KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("PotionMana"), 1); - KDSendStatus('goddess', data.type, 'shrineBottle'); - KinkyDungeonAggroAction('shrine', {}); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/PotionDrink.ogg"); - - KDGameData.PoolUses += 1; - break; - } - case "defeat": - KDDelayedActionPrune(["Action", "World"]); - KinkyDungeonDefeat(); - KinkyDungeonChangeRep("Ghost", 4); - break; - case "lose": - KinkyDungeonState = "Menu"; - KDLose = true; - MiniGameKinkyDungeonLevel = -1; - break; - case "orb": - if (KinkyDungeonMapGet(data.x, data.y) == 'O') { - KDDelayedActionPrune(["Action", "World"]); - if (KinkyDungeonGoddessRep[data.shrine] < -45) { - KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, "OrbGuardian", 3 + Math.floor(Math.sqrt(1 + MiniGameKinkyDungeonLevel)), 10, false, 30); - } - KinkyDungeonChangeRep(data.shrine, data.Amount * -10); - - KDSendStatus('goddess', data.shrine, 'takeOrb'); - if (KinkyDungeonStatsChoice.get("randomMode")) { - let spell = null; - let spellList = []; - let maxSpellLevel = 4; - for (let k of Object.keys(KinkyDungeonSpellList)) { - for (let sp of KinkyDungeonSpellList[k]) { - if (KinkyDungeonCheckSpellPrerequisite(sp) && sp.school == k && !sp.secret) { - for (let iii = 0; iii < maxSpellLevel - sp.level; iii++) - spellList.push(sp); - } - } - } - - for (let sp of KinkyDungeonSpells) { - for (let S = 0; S < spellList.length; S++) { - if (sp.name == spellList[S].name) { - spellList.splice(S, 1); - S--; - } - } - } - - spell = spellList[Math.floor(KDRandom() * spellList.length)]; - - if (spell) { - KinkyDungeonSpells.push(spell); - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonOrbSpell").replace("SPELL", TextGet("KinkyDungeonSpell" + spell.name)), "lightblue", 2); - } - } else { - KinkyDungeonSpellPoints += data.Amount; - } - KinkyDungeonMapSet(data.x, data.y, 'o'); - KinkyDungeonAggroAction('orb', {}); - } - break; - case "perkorb": - if (KinkyDungeonMapGet(data.x, data.y) == 'P') { - KDDelayedActionPrune(["Action", "World"]); - KDSendStatus('goddess', data.perks, 'takePerkOrb'); - - if (data.perks) { - for (let p of data.perks) { - KinkyDungeonStatsChoice.set(p, true); - } - } - - KinkyDungeonMapSet(data.x, data.y, 'p'); - for (let x = 0; x < KinkyDungeonGridWidth; x++) { - if (KinkyDungeonMapGet(x, data.y) == 'P') { - KinkyDungeonMapSet(x, data.y, 'p'); - } - } - KinkyDungeonSendEvent("perkOrb", {x: data.x, y: data.y, perks: data.perks}); - } - break; - case "heart": - if (data.type == "AP") { - if (KinkyDungeonStatDistractionMax < KDMaxStat) KinkyDungeonSpells.push(KinkyDungeonFindSpell("APUp1")); - KinkyDungeonUpdateStats(0); - }else if (data.type == "SP") { - if (KinkyDungeonStatStaminaMax < KDMaxStat) KinkyDungeonSpells.push(KinkyDungeonFindSpell("SPUp1")); - KinkyDungeonUpdateStats(0); - } else if (data.type == "MP") { - if (KinkyDungeonStatManaMax < KDMaxStat) KinkyDungeonSpells.push(KinkyDungeonFindSpell("MPUp1")); - KinkyDungeonUpdateStats(0); - } else if (data.type == "WP") { - if (KinkyDungeonStatWillMax < KDMaxStat) KinkyDungeonSpells.push(KinkyDungeonFindSpell("WPUp1")); - KinkyDungeonUpdateStats(0); - } - KDGameData.CollectedHearts = (KDGameData.CollectedHearts || 0) + 1; - break; - case "champion": - KDGameData.Champion = data.rep; - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonBecomeChampion").replace("GODDESS", TextGet("KinkyDungeonShrine" + data.rep)), "yellow", 1); - KDSendStatus('goddess', data.rep, 'helpChampion'); - break; - case "aid": - KDDelayedActionPrune(["Action", "World"]); - KinkyDungeonChangeRep(data.rep, -KinkyDungeonAidManaCost(data.rep, data.value)); - KinkyDungeonChangeMana(KinkyDungeonAidManaAmount(data.rep, data.value)); - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonAidManaMe"), "purple", 2); - KDSendStatus('goddess', data.rep, 'helpMana'); - break; - case "rescue": - KinkyDungeonRescued[data.rep] = true; - - if (KDRandom() < 0.5 + data.value/100) { - KDDelayedActionPrune(["Action", "World"]); - /*let allies = KinkyDungeonGetAllies(); - // Tie up all non-allies - for (let e of KinkyDungeonEntities) { - if (e.Enemy.bound && !e.Enemy.tags.angel) { - allies.push(e); - if (!e.boundLevel) e.boundLevel = e.Enemy.maxhp; - else e.boundLevel += e.Enemy.maxhp; - e.hp = 0.1; - e.rescue = true; - } - } - KinkyDungeonEntities = allies; - KDGameData.PrisonerState = ''; - KDGameData.KinkyDungeonJailGuard = 0; - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonRescueMe"), "purple", 10); - for (let T of Object.values(KinkyDungeonTiles)) { - if (T.Lock) T.Lock = undefined; - if (T.Type == "Lock") T.Type = undefined; - if (T.Type == "Trap") T.Type = undefined; - }*/ - let tiles = KinkyDungeonRescueTiles(); - if (tiles.length > 0) { - KDSendStatus('goddess', data.rep, 'helpRescue'); - KinkyDungeonChangeRep(data.rep, -10); - tile = tiles[Math.floor(tiles.length * KDRandom())]; - if (tile) { - KinkyDungeonMapSet(tile.x, tile.y, "$"); - KinkyDungeonTilesSet(tile.x + "," + tile.y, {Type: "Angel"}); - KDStartDialog("AngelHelp","Angel", true, ""); - } - KDGameData.RescueFlag = true; - } - return "Rescue"; - } else { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonNoRescue"), "purple", 10); - KDSendStatus('goddess', data.rep, 'helpNoRescue'); - return "FailRescue"; - } - case "penance": - KDGameData.KinkyDungeonPenance = true; - KDGameData.KDPenanceMode = ""; - KDGameData.KDPenanceStage = 0; - KDGameData.KDPenanceStageEnd = 0; - KDGameData.AngelCurrentRep = data.rep; - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonPenanceHappen"), "purple", 4); - KDGameData.KinkyDungeonPenanceCostCurrent = KinkyDungeonPenanceCosts[data.rep] ? KinkyDungeonPenanceCosts[data.rep] : KinkyDungeonPenanceCostDefault; - if (KinkyDungeonGold >= KDGameData.KinkyDungeonPenanceCostCurrent) { - if (KinkyDungeonPenanceCosts[data.rep]) KinkyDungeonPenanceCosts[data.rep] += KinkyDungeonPenanceCostGrowth; - else KinkyDungeonPenanceCosts[data.rep] = KinkyDungeonPenanceCostDefault + KinkyDungeonPenanceCostGrowth; - } - KDSendStatus('goddess', data.rep, 'helpPenance'); - break; - case "spellChoice": - KDDelayedActionPrune(["Action", "SwitchSpell"]); - KinkyDungeonEvasionPityModifier = 0.0; - KinkyDungeonSpellChoices[data.I] = data.CurrentSpell; - KinkyDungeonSpellChoicesToggle[data.I] = !KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]].defaultOff; - if (KinkyDungeonSpellChoicesToggle[data.I] && KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]].costOnToggle) { - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]]))) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]])); - } else KinkyDungeonSpellChoicesToggle[data.I] = false; - } - if (KinkyDungeonStatsChoice.has("Disorganized")) { - KinkyDungeonAdvanceTime(1); - KinkyDungeonSlowMoveTurns = 2; - } else if (!KinkyDungeonStatsChoice.has("QuickDraw")) - KinkyDungeonAdvanceTime(1); - break; - case "spellRemove": - KinkyDungeonEvasionPityModifier = 0.0; - KinkyDungeonSpellChoices[data.I] = -1; - KinkyDungeonSpellChoicesToggle[data.I] = true; - break; - case "spellCastFromBook": { - KDDelayedActionPrune(["Action", "Cast"]); - let spell = KinkyDungeonHandleSpellCast(KinkyDungeonSpells[data.CurrentSpell]); - if (spell && !(KinkyDungeonSpells[data.CurrentSpell].type == "passive") && !KinkyDungeonSpells[data.CurrentSpell].passive && !KinkyDungeonSpells[data.CurrentSpell].upcastFrom) { - if (KinkyDungeonStatsChoice.has("Disorganized")) { - KinkyDungeonAdvanceTime(1); - KinkyDungeonSlowMoveTurns = 2; - } else if (!KinkyDungeonStatsChoice.has("QuickDraw")) - KinkyDungeonAdvanceTime(1); - KinkyDungeonSendActionMessage(5, TextGet("KinkyDungeonSpellTarget" + spell.name).replace("SpellArea", "" + Math.floor(spell.aoe)), "white", 0.1, true); - } - break; - } - case "upcast": { - KDDelayedActionPrune(["Action", "Cast"]); - KDEmpower(data, KinkyDungeonPlayerEntity); - break; - } - case "upcastcancel": { - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "upcast", 1); - break; - } - case "spellLearn": { - KDDelayedActionPrune(["Action", "SwitchSpell"]); - KinkyDungeonEvasionPityModifier = 0.0; - let spell = KinkyDungeonFindSpell(data.SpellName, true); - let cost = KinkyDungeonGetCost(spell); - if (KinkyDungeonCheckSpellPrerequisite(spell)) { - if (KinkyDungeonSpellPoints >= cost) { - if (spell.manacost <= KinkyDungeonStatManaMax) { - KinkyDungeonSpellPoints -= cost; - KinkyDungeonSpells.push(spell); - KDSendStatus('learnspell', spell.name); - if (spell.goToPage) { - KinkyDungeonCurrentSpellsPage = spell.goToPage; - } - if (spell.autoLearn) { - for (let sp of spell.autoLearn) { - if (KinkyDungeonSpellIndex(sp) < 0) { - KinkyDungeonSpells.push(KinkyDungeonFindSpell(sp, true)); - KDSendStatus('learnspell', sp); - } - } - } - KinkyDungeonSetMaxStats(); - if (KDToggles.Sound && KinkyDungeonIsPlayer()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - KinkyDungeonCurrentPage = KinkyDungeonSpellIndex(spell.name); - if (KinkyDungeonStatsChoice.has("Disorganized")) { - KinkyDungeonAdvanceTime(1); - KinkyDungeonSlowMoveTurns = 2; - } else if (!KinkyDungeonStatsChoice.has("QuickDraw")) - KinkyDungeonAdvanceTime(1); - if (KinkyDungeonIsPlayer()) { - KinkyDungeonPreviewSpell = undefined; - //if (KinkyDungeonTextMessageTime > 0) - //KinkyDungeonDrawState = "Game"; - } - } else if (KinkyDungeonIsPlayer()) KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSpellsNotEnoughMana"), "#b4dbfc", 1); - } else if (KinkyDungeonIsPlayer()) KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSpellsNotEnoughPoints"), "#ffff00", 1); - } else if (KinkyDungeonIsPlayer()) KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSpellsNotPrerequisite").replace("REQUIREDSPELL", TextGet("KinkyDungeonSpell" + spell.prerequisite)), "#ff4444", 1); - break; - } - case "tabletInteract": { - KDDelayedActionPrune(["Action", "World"]); - if (data.action == "read") { - tile = KinkyDungeonTilesGet(data.targetTile); - if (tile && tile.Type == "Tablet") { - // Perform the tablet buff action - if (tile.Name == "Will") { - // Restoration shrine gets a regeneration buff - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "TabletWill", type: "restore_mp", power: 0.5, duration: 20}); - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "TabletWill2", type: "restore_sp", power: 0.5, duration: 20}); - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "TabletWill3", type: "restore_wp", power: 0.5, duration: 5}); - } else if (tile.Name == "Determination") { - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "TabletDetermination", type: "restore_wp", power: 1, duration: 5}); - } else { - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, - {id: "Tablet" + tile.Name, aura: KDGoddessColor(tile.Name), type: "event", duration: 9999, power: 2, player: true, enemies: false, maxCount: 3, tags: ["cast_" + tile.Name.toLowerCase()], events: [ - {trigger: "calcMana", type: "Tablet", requiredTag: tile.Name.toLowerCase(), power: 0.5}, - ]} - ); - } - - // Send the message and advance time - KinkyDungeonAdvanceTime(1); - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonTabletReadSuccess"), "lightgreen", 1); - - // Remove the tile - let x = parseInt(data.targetTile.split(',')[0]); - let y = parseInt(data.targetTile.split(',')[1]); - if (x && y) { - KinkyDungeonMapSet(x, y, 'm'); - KinkyDungeonTilesDelete(data.targetTile); - } - } - } - break; - } - case "foodInteract": { - KDDelayedActionPrune(["Action", "World"]); - if (data.action == "eat") { - tile = KinkyDungeonTilesGet(data.targetTile); - if (tile && tile.Type == "Food") { - let gagged = KinkyDungeonGagTotal(); - if (gagged > 0) { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonFoodEatenGag"), "#ff8800", 1); - } else { - // Perform the deed - let Willmulti = Math.max(KinkyDungeonStatWillMax / KDMaxStatStart); - let amount = tile.Amount ? tile.Amount : 1.0; - KinkyDungeonChangeWill(amount * Willmulti); - - - // Send the message and advance time - KinkyDungeonAdvanceTime(1); - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonFoodEaten"), "lightgreen", 1); - - // Remove the food - tile.Food = "Plate"; - } - } - } - break; - } - case "chargerInteract": - KDDelayedActionPrune(["Action", "World"]); - if (data.action == "charge") { - if (KinkyDungeonInventoryGet("AncientPowerSourceSpent") && KinkyDungeonGold >= KDRechargeCost) { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSourceSpent, -1); - KinkyDungeonAddGold(-KDRechargeCost); - KinkyDungeonAdvanceTime(1); - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChargerChargeSuccess").replace("VALUE", "" + KDRechargeCost), "yellow", 1); - let x = parseInt(data.targetTile.split(',')[0]); - let y = parseInt(data.targetTile.split(',')[1]); - if (x && y) { - KinkyDungeonTilesDelete(data.targetTile); - KinkyDungeonMapSet(x, y, '-'); - } - return "Pass"; - } else { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChargerChargeFailure"), "orange", 1); - return "Fail"; - } - } else if (data.action == "place") { - tile = KinkyDungeonTilesGet(data.targetTile); - if (tile && tile.Type == "Charger" && KinkyDungeonInventoryGet("AncientPowerSource")) { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, -1); - tile.Light = KDChargerLight; - KinkyDungeonAdvanceTime(1); - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChargerPlace"), "yellow", 1); - let x = parseInt(data.targetTile.split(',')[0]); - let y = parseInt(data.targetTile.split(',')[1]); - if (x && y) { - KinkyDungeonMapSet(x, y, '='); - } - } - } else if (data.action == "remove") { - tile = KinkyDungeonTilesGet(data.targetTile); - if (tile && tile.Type == "Charger" && tile.Light > 0 && !tile.NoRemove) { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); - tile.Light = undefined; - KinkyDungeonAdvanceTime(1); - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChargerRemove"), "yellow", 1); - let x = parseInt(data.targetTile.split(',')[0]); - let y = parseInt(data.targetTile.split(',')[1]); - if (x && y) { - KinkyDungeonMapSet(x, y, '+'); - } - } else if (tile && tile.NoRemove) { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChargerNoRemove"), "yellow", 1); - } - } - break; - case "dialogue": { - KDDoDialogue(data); - break; - - } - } - return ""; -} - -/** - * - * @param {string} type - * @param {any} data - * @returns {string} - */ -function KDSendInput(type, data, frame, noUpdate) { - - if (!noUpdate) { - KDGameData.OrigEnergyLevel = KDGameData.AncientEnergyLevel; - KDGameData.LastSP = KinkyDungeonStatStamina; - KDGameData.LastMP = KinkyDungeonStatMana; - KDGameData.LastAP = KinkyDungeonStatDistraction; - KDGameData.LastWP = KinkyDungeonStatWill; - } - - KinkyDungeonInputQueue.push({type: type, data: data}); - return KDProcessInputs(true); -} - -/** - * Handles inputs once per frame - * @returns {string} - */ -function KDProcessInputs(ReturnResult) { - for (let i = 0; i < 3; i++) { - if (KinkyDungeonInputQueue.length > 0) { - let input = KinkyDungeonInputQueue.splice(0, 1)[0]; - if (input) { - let res = KDProcessInput(input.type, input.data); - if (ReturnResult) return res; - } - } - } - - return ""; -} \ No newline at end of file diff --git a/Game/KinkyDungeonInventory.js b/Game/KinkyDungeonInventory.js deleted file mode 100644 index 5b833fc13..000000000 --- a/Game/KinkyDungeonInventory.js +++ /dev/null @@ -1,872 +0,0 @@ -"use strict"; - - -var KinkyDungeonFilters = [ - Consumable, - Restraint, - Weapon, - Outfit, - LooseRestraint, - Misc, -]; - -var KinkyDungeonCurrentFilter = KinkyDungeonFilters[0]; -var KinkyDungeonCurrentPageInventory = 0; - -let KinkyDungeonShowInventory = false; -let KinkyDungeonInventoryOffset = 0; - -function KDCloseQuickInv() { - KinkyDungeonShowInventory = false; - KDHideQuickInv = false; -} - -function KDSwitchWeapon() { - let previousWeapon = KDGameData.PreviousWeapon ? KDGameData.PreviousWeapon : null; - if (!previousWeapon || KinkyDungeonInventoryGet(previousWeapon)) - KDSendInput("switchWeapon", {weapon: previousWeapon}); -} - -function KinkyDungeonHandleInventory() { - let filteredInventory = KinkyDungeonFilterInventory(KinkyDungeonCurrentFilter); - - if (KinkyDungeonCurrentPageInventory > 0 && MouseIn(canvasOffsetX_ui + 100, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 60)) { - KinkyDungeonCurrentPageInventory -= 1; - return true; - } - if (KinkyDungeonCurrentPageInventory < filteredInventory.length-1 && MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale - 325, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 60)) { - KinkyDungeonCurrentPageInventory += 1; - return true; - } - - for (let I = 0; I < KinkyDungeonFilters.length; I++) - if (KinkyDungeonFilterInventory(KinkyDungeonFilters[I]).length > 0 || I == 1) - if (MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale - 20, canvasOffsetY_ui + 115 + I*65, 225, 60)) { - KinkyDungeonCurrentFilter = KinkyDungeonFilters[I]; - KinkyDungeonCurrentPageInventory = 0; - return true; - } - - if (filteredInventory.length > 0) { - if (MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 400, canvasOffsetY_ui, 90, 40) && KinkyDungeonInventoryOffset > 0) { - KinkyDungeonInventoryOffset -= 2; - return true; - } - if (MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 400, 480*KinkyDungeonBookScale + canvasOffsetY_ui - 15, 90, 40) && KinkyDungeonInventoryOffset + 24 < filteredInventory.length) { - KinkyDungeonInventoryOffset += 2; - return true; - } - - for (let i = 0; i < 24; i++) { - let xx = i % 2; - let yy = Math.floor(i / 2); - let index = i + KinkyDungeonInventoryOffset; - if (filteredInventory[index] && filteredInventory[index].item) { - if (MouseIn(canvasOffsetX_ui + xx * 200 + 640*KinkyDungeonBookScale + 250, canvasOffsetY_ui + 50 + 45 * yy, 195, 40)) { - KinkyDungeonCurrentPageInventory = index; - return true; - } - } - } - } - - if (KinkyDungeonDrawInventorySelected(filteredInventory[KinkyDungeonCurrentPageInventory])) { - if (KinkyDungeonCurrentFilter == Consumable && MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 350, 60)) { - let item = KinkyDungeonFilterInventory(KinkyDungeonCurrentFilter)[KinkyDungeonCurrentPageInventory]; - if (!item || !item.name) return true; - - KDSendInput("consumable", {item: item.name, quantity: 1}); - //KinkyDungeonAttemptConsumable(item.name, 1); - } else if (KinkyDungeonCurrentFilter == Weapon) { - let weapon = ((filteredInventory[KinkyDungeonCurrentPageInventory] != null) ? filteredInventory[KinkyDungeonCurrentPageInventory].name : null); - if (weapon && weapon != "Unarmed") { - let equipped = weapon == KinkyDungeonPlayerWeapon; - if (MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 350, 60) && !equipped) { - KDSendInput("switchWeapon", {weapon: weapon}); - } else if (MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale + 70, 350, 60) && equipped) { - KDSendInput("unequipWeapon", {weapon: weapon}); - } - } - } else if (KinkyDungeonCurrentFilter == Outfit && MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 350, 60)) { - let outfit = ((filteredInventory[KinkyDungeonCurrentPageInventory] != null) ? filteredInventory[KinkyDungeonCurrentPageInventory].name : null); - let toWear = KinkyDungeonGetOutfit(outfit); - if (toWear) { - let dress = toWear.dress; - if (dress == "JailUniform" && KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]]) - dress = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]].defeat_outfit; - KDSendInput("dress", {dress: dress, outfit: outfit}); - } - } else if (KinkyDungeonCurrentFilter == LooseRestraint && MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 350, 60)) { - let equipped = false; - let newItem = null; - let currentItem = null; - - if (filteredInventory[KinkyDungeonCurrentPageInventory] - && filteredInventory[KinkyDungeonCurrentPageInventory].item) { - newItem = KDRestraint(filteredInventory[KinkyDungeonCurrentPageInventory].item); - if (newItem) { - currentItem = KinkyDungeonGetRestraintItem(newItem.Group); - if (!currentItem - || (KinkyDungeonLinkableAndStricter(KDRestraint(currentItem), newItem, currentItem) && - ((newItem.linkCategory && KDLinkCategorySize(currentItem, newItem.linkCategory) + KDLinkSize(newItem) <= 1.0) - || (!newItem.linkCategory && !KDDynamicLinkList(currentItem, true).some((item) => {return newItem.name == item.name;}))))) { - equipped = false; - } else equipped = true; - } - } - if (!equipped && newItem) { - if (KDSendInput("equip", {name: newItem.name, group: newItem.Group, curse: filteredInventory[KinkyDungeonCurrentPageInventory].item.curse, currentItem: currentItem ? currentItem.name : undefined, events: Object.assign([], filteredInventory[KinkyDungeonCurrentPageInventory].item.events)})) return true; - - } - } - - } - - return true; -} - -function KinkyDungeonInventoryAddWeapon(Name) { - if (!KinkyDungeonInventoryGetWeapon(Name) && KinkyDungeonWeapons[Name]) - KinkyDungeonInventoryAdd({name:Name, type:Weapon, events: Object.assign([], KinkyDungeonWeapons[Name].events), id: KinkyDungeonGetItemID()}); -} - -function KinkyDungeonInventoryAddLoose(Name, UnlockCurse) { - if (!KinkyDungeonInventoryGetLoose(Name) || UnlockCurse) - KinkyDungeonInventoryAdd({name: Name, type: LooseRestraint, curse: UnlockCurse, events:KDRestraint(KinkyDungeonGetRestraintByName(Name)).events, quantity: 1, id: KinkyDungeonGetItemID()}); - else { - KinkyDungeonInventoryGetLoose(Name).quantity += 1; - } -} - -function KinkyDungeonInventoryAddOutfit(Name) { - if (!KinkyDungeonInventoryGetOutfit(Name) && KinkyDungeonOutfitCache.has(Name)) - KinkyDungeonInventoryAdd({name:Name, type:Outfit, id: KinkyDungeonGetItemID()}); -} -/** - * - * @param item {item} - * @return {string} - */ -function KDInventoryType(item) {return item.type;} - -function KinkyDungeonFullInventory() { - let ret = []; - for (let m of KinkyDungeonInventory.values()) { - for (let item of m.values()) { - ret.push(item); - } - } - return ret; -} - -function KinkyDungeonInventoryLength() { - let size = 0; - for (let m of KinkyDungeonInventory.values()) { - size += m.size; - } - return size; -} - -/** - * - * @param item {item} - */ -function KinkyDungeonInventoryAdd(item) { - let type = KDInventoryType(item); - if (KinkyDungeonInventory.has(type)) { - KinkyDungeonInventory.get(type).set(item.name, item); - } -} - -/** - * - * @param item {item} - */ -function KinkyDungeonInventoryRemove(item) { - if (item) { - let type = KDInventoryType(item); - if (KinkyDungeonInventory.has(type)) { - KinkyDungeonInventory.get(type).delete(item.name); - } - } -} - -/** - * - * @param Name - * @return {null|item} - */ -function KinkyDungeonInventoryGet(Name) { - for (let m of KinkyDungeonInventory.values()) { - if (m.has(Name)) return m.get(Name); - } - return null; -} - -/** - * - * @param Name - * @return {null|item} - */ -function KinkyDungeonInventoryGetLoose(Name) { - return KinkyDungeonInventory.get(LooseRestraint).get(Name); -} - -/** - * - * @param Name - * @return {null|item} - */ -function KinkyDungeonInventoryGetConsumable(Name) { - return KinkyDungeonInventory.get(Consumable).get(Name); -} - -/** - * - * @param Name - * @return {null|item} - */ -function KinkyDungeonInventoryGetWeapon(Name) { - return KinkyDungeonInventory.get(Weapon).get(Name); -} - -/** - * - * @param Name - * @return {null|item} - */ -function KinkyDungeonInventoryGetOutfit(Name) { - return KinkyDungeonInventory.get(Outfit).get(Name); -} - -/** - * Returns list - * @return {item[]} - */ -function KinkyDungeonAllRestraint() { - return KinkyDungeonInventory.get(Restraint) ? Array.from(KinkyDungeonInventory.get(Restraint).values()) : []; -} - - -/** - * Returns list of tuples of restraints, including dynamics and their hosts - * @return {{item: item, host: item}[]} - */ -function KinkyDungeonAllRestraintDynamic() { - let ret = []; - for (let inv of KinkyDungeonAllRestraint()) { - ret.push({item: inv, host: null}); - if (inv.dynamicLink) { - let link = inv.dynamicLink; - let host = inv; - while (link) { - ret.push({item: link, host: host}); - link = link.dynamicLink; - } - } - } - return ret; -} - -/** - * Returns list - * @return {item[]} - */ -function KinkyDungeonAllLooseRestraint() { - return KinkyDungeonInventory.get(LooseRestraint) ? Array.from(KinkyDungeonInventory.get(LooseRestraint).values()) : []; -} -/** - * Returns list - * @return {item[]} - */ -function KinkyDungeonAllConsumable() { - return KinkyDungeonInventory.get(Consumable) ? Array.from(KinkyDungeonInventory.get(Consumable).values()) : []; -} -/** - * Returns list - * @return {item[]} - */ -function KinkyDungeonAllOutfit() { - return KinkyDungeonInventory.get(Outfit) ? Array.from(KinkyDungeonInventory.get(Outfit).values()) : []; -} -/** - * Returns list - * @return {item[]} - */ -function KinkyDungeonAllWeapon() { - return KinkyDungeonInventory.get(Weapon) ? Array.from(KinkyDungeonInventory.get(Weapon).values()) : []; -} - -/*for (let item of KinkyDungeonInventory.get(LooseRestraint).values()) { - if (item.looserestraint && item.looserestraint.name == Name) return item; -} -return null;*/ - -function KDGetItemPreview(item) { - let ret = null; - let Group = ""; - if (item.type == Restraint && KDRestraint(item).Group) Group = KDRestraint(item).Group; - else if (item.type == LooseRestraint && KDRestraint(item).Group) Group = KDRestraint(item).Group; - if ((item.type == Restraint || item.type == LooseRestraint) && KDRestraint(item).AssetGroup) Group = KDRestraint(item).AssetGroup; - if (Group == "ItemMouth2" || Group == "ItemMouth3") Group = "ItemMouth"; - - if (item.type == Restraint) { - ret = {name: item.name, item: item, preview: `Assets/Female3DCG/${Group}/Preview/${KDRestraint(item).Asset}.png`}; - } - else if (item.type == LooseRestraint) { - ret = {name: KDRestraint(item).name, item: item, preview: `Assets/Female3DCG/${Group}/Preview/${KDRestraint(item).Asset}.png`}; - } - else if (item.type == Consumable) ret = {name: KDConsumable(item).name, item: item, preview: KinkyDungeonRootDirectory + `/Items/${KDConsumable(item).name}.png`}; - else if (item.type == Weapon) ret = {name: KDWeapon(item).name, item: item, preview: KinkyDungeonRootDirectory + `/Items/${KDWeapon(item).name}.png`}; - else if (item.type == Outfit) ret = {name: KDOutfit(item) ? KDOutfit(item).name : "Prisoner", item: item, preview: KinkyDungeonRootDirectory + `/Outfits/${KDOutfit(item).name}.png`}; - //else if (item && item.name) ret.push({name: item.name, item: item, preview: ``}); - return ret; -} - -/** - * - * @param {string} Filter - * @param {boolean} [enchanted] - * @param {boolean} [ignoreHidden] - * @returns {any[]} - */ -function KinkyDungeonFilterInventory(Filter, enchanted, ignoreHidden) { - let ret = []; - let category = KinkyDungeonInventory.get(Filter); - if (category) - for (let item of category.values()) { - if (ignoreHidden && KDGameData.HiddenItems && KDGameData.HiddenItems[item.name]) continue; - let preview = KDGetItemPreview(item); - if (preview && (item.type != LooseRestraint || (!enchanted || KDRestraint(item).enchanted || KDRestraint(item).showInQuickInv))) - ret.push(preview); - if (item.dynamicLink) { - let link = item.dynamicLink; - for (let I = 0; I < 30; I++) { - preview = KDGetItemPreview(link); - if (preview && (link.type == Restraint)) - ret.push(preview); - if (link.dynamicLink) { - link = link.dynamicLink; - } else I = 1000; - } - } - - } - - return ret; -} - -/** - * - * @param {{name: any, item: item, preview: string}} item - * @param {boolean} [noscroll] - * @param {boolean} [treatAsHover] - * @param {number} xOffset - * @returns {boolean} - */ -function KinkyDungeonDrawInventorySelected(item, noscroll, treatAsHover, xOffset = 0) { - if (!noscroll) { - KDDraw(kdcanvas, kdpixisprites, "magicBook", - KinkyDungeonRootDirectory + "MagicBook.png", xOffset + canvasOffsetX_ui, canvasOffsetY_ui, 640*KinkyDungeonBookScale, 483*KinkyDungeonBookScale, undefined, { - zIndex: 128, - }); - //DrawImageZoomCanvas(, MainCanvas, 0, 0, 640, 483, canvasOffsetX_ui, canvasOffsetY_ui, 640*KinkyDungeonBookScale, 483*KinkyDungeonBookScale, false); - } - if (!item) return false; - let name = item.name; - let prefix = "KinkyDungeonInventoryItem"; - if (item.item.type == Restraint || item.item.type == LooseRestraint) prefix = "Restraint"; - - DrawTextFitKD(TextGet(prefix + name), xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5, 300, "#000000", KDTextTan, undefined, undefined, 129); - //let wrapAmount = KDBigLanguages.includes(TranslationLanguage) ? 9 : 22; - let textSplit = KinkyDungeonWordWrap(TextGet(prefix + name + "Desc"), 12, 28).split('\n'); - let textSplit2 = KinkyDungeonWordWrap(TextGet(prefix + name + "Desc2"), 12, 28).split('\n'); - - - let showpreview = (item.preview && !MouseIn(xOffset + canvasOffsetX_ui, canvasOffsetY_ui, 840, 583)); - - - let i = 2; - if (showpreview) { - //DrawPreviewBox(canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35 - 100, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 45, item.preview, "", {Background: "#00000000"}); - if (!treatAsHover) { - KDDraw(kdcanvas, kdpixisprites, "preview", - item.preview, xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35 - 100, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 45, 200, 200, undefined, { - zIndex: 129, - }); - } else { - for (let N = 0; N < textSplit.length; N++) { - DrawTextKD(textSplit[N], - xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + i * 40, "#000000", KDTextTan, 24, undefined, 130); i++;} - } - - if (item.item.type == Restraint || item.item.type == LooseRestraint) { - let restraint = KDRestraint(item.item); - DrawTextKD(TextGet("KinkyDungeonRestraintLevel").replace("RestraintLevel", "" + Math.max(1, restraint.displayPower != undefined ? restraint.displayPower : restraint.power)).replace("Rarity", TextGet("KinkyDungeonRarity" + Math.max(0, Math.min(Math.floor((restraint.displayPower != undefined ? restraint.displayPower : restraint.power)/3),10)))), xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 330, "#000000", KDTextTan, undefined, undefined, 130); - DrawTextKD( - restraint.escapeChance ? (item.item.lock ? (TextGet("KinkyLocked") + " " + TextGet("Kinky" + item.item.lock + "LockType")) : - (restraint.DefaultLock && !restraint.HideDefaultLock ? (TextGet("KinkyLocked") + " " + TextGet("Kinky" + restraint.DefaultLock + "LockType")) : TextGet("KinkyUnlocked"))) - : (restraint.escapeChance.Pick != null ? TextGet("KinkyLockable") : TextGet("KinkyNonLockable")), xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 370, "#000000", KDTextTan, undefined, undefined, 130); - - let goddesses = ""; - if (restraint.shrine) - for (let shrine of restraint.shrine) { - if (KinkyDungeonGoddessRep[shrine] != undefined) { - if (goddesses) { - goddesses = goddesses + ", "; - } - goddesses = goddesses + TextGet("KinkyDungeonShrine" + shrine); - } - } - if (goddesses) - DrawTextFitKD("Goddess: " + goddesses, xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 425, 300, "#000000", KDTextTan, undefined, undefined, 130); - } else if (item.item.type == Consumable) { - let consumable = KDConsumable(item.item); - DrawTextKD(TextGet("KinkyDungeonConsumableQuantity") + item.item.quantity, xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 330, "#000000", KDTextTan, undefined, undefined, 130); - DrawTextKD(TextGet("KinkyDungeonRarity") + TextGet("KinkyDungeonRarity" + consumable.rarity), xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 370, "#000000", KDTextTan, undefined, undefined, 130); - } else if (item.item.type == Weapon) { - let weapon = KDWeapon(item.item); - DrawTextKD(TextGet("KinkyDungeonWeaponDamage") + (weapon.dmg * 10), xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 310, "#000000", KDTextTan, undefined, undefined, 130); - DrawTextKD(TextGet("KinkyDungeonWeaponAccuracy") + Math.round(weapon.chance * 100) + "%", xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 350, "#000000", KDTextTan, undefined, undefined, 130); - let cost = -KinkyDungeonStatStaminaCostAttack; - if (weapon.staminacost) cost = weapon.staminacost; - DrawTextKD(TextGet("KinkyDungeonWeaponStamina") + Math.round(-10*cost), xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 390, "#000000", KDTextTan, undefined, undefined, 130); - } - - } else { - for (let N = 0; N < textSplit.length; N++) { - DrawTextKD(textSplit[N], - xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + i * 40, "#000000", KDTextTan, 24, undefined, 130); i++;} - } - i = 0; - for (let N = 0; N < textSplit2.length; N++) { - DrawTextKD(textSplit2[N], - xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale*(1-1/3.35), canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + i * 40, "#000000", KDTextTan, 24, undefined, 130); i++;} - - i = 0; - - return true; -} - - - -function KinkyDungeonDrawInventory() { - KinkyDungeonDrawMessages(true); - - let filteredInventory = KinkyDungeonFilterInventory(KinkyDungeonCurrentFilter); - - if (KinkyDungeonCurrentPageInventory >= filteredInventory.length) KinkyDungeonCurrentPageInventory = 0; - - let defaultIndex = 0; - if (KinkyDungeonFilterInventory(KinkyDungeonFilters[0]).length == 0) defaultIndex = 1; - - for (let I = 0; I < KinkyDungeonFilters.length; I++) { - let col = KDTextGray2; - if (KinkyDungeonFilterInventory(KinkyDungeonFilters[I]).length > 0 || I == defaultIndex) { - col = "#888888"; - } - else if (KinkyDungeonFilters.indexOf(KinkyDungeonCurrentFilter) == I) KinkyDungeonCurrentFilter = KinkyDungeonFilters[defaultIndex]; - - DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale - 20, canvasOffsetY_ui + 115 + I*65, 225, 60, TextGet("KinkyDungeonCategoryFilter" + KinkyDungeonFilters[I]), (KinkyDungeonCurrentFilter == KinkyDungeonFilters[I]) ? "White" : col, "", ""); - } - - - if (filteredInventory.length > 0) { - DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 400, canvasOffsetY_ui, 90, 40, "", KinkyDungeonInventoryOffset > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png"); - DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 400, 480*KinkyDungeonBookScale + canvasOffsetY_ui - 15, 90, 40, "", (KinkyDungeonInventoryOffset + 24 < filteredInventory.length) ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png"); - - for (let i = 0; i < 24; i++) { - let xx = i % 2; - let yy = Math.floor(i / 2); - let index = i + KinkyDungeonInventoryOffset; - if (filteredInventory[index] && filteredInventory[index].item) { - let text = "KinkyDungeonInventoryItem" + filteredInventory[index].name; - if (filteredInventory[index].item.type == Restraint || filteredInventory[index].item.type == LooseRestraint) - text = "Restraint" + filteredInventory[index].name; - let suff = ""; - if (filteredInventory[index].item.quantity) { - suff = " x" + filteredInventory[index].item.quantity; - } - DrawButtonVis(canvasOffsetX_ui + xx * 200 + 640*KinkyDungeonBookScale + 250, canvasOffsetY_ui + 50 + 45 * yy, 195, 40, TextGet(text) + suff, index == KinkyDungeonCurrentPageInventory ? "white" : "#888888"); - } else { - if (i + KinkyDungeonInventoryOffset > filteredInventory.length + 2) - KinkyDungeonInventoryOffset = 0; - break; - } - } - } - - if (KinkyDungeonDrawInventorySelected(filteredInventory[KinkyDungeonCurrentPageInventory])) { - if (KinkyDungeonCurrentFilter == Consumable) - DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 350, 60, TextGet("KinkyDungeonConsume"), "White", "", ""); - if (KinkyDungeonCurrentFilter == Weapon && filteredInventory[KinkyDungeonCurrentPageInventory].name != "Unarmed") { - let equipped = filteredInventory[KinkyDungeonCurrentPageInventory] && filteredInventory[KinkyDungeonCurrentPageInventory].name == KinkyDungeonPlayerWeapon; - DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 350, 60, TextGet(equipped ? "KinkyDungeonEquipped" : "KinkyDungeonEquip"), equipped ? "grey" : "White", "", ""); - if (equipped) DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale + 70, 350, 60, TextGet("KinkyDungeonUnEquip"), "White", "", ""); - } - if (KinkyDungeonCurrentFilter == Outfit) { - let outfit = ((filteredInventory[KinkyDungeonCurrentPageInventory] != null) ? filteredInventory[KinkyDungeonCurrentPageInventory].name : ""); - let toWear = KinkyDungeonGetOutfit(outfit); - if (toWear) { - DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 350, 60, TextGet("KinkyDungeonEquip"), KDGameData.Outfit == outfit ? "grey" : "White", "", ""); - } - } - if (KinkyDungeonCurrentFilter == LooseRestraint) { - let equipped = false; - - if (filteredInventory[KinkyDungeonCurrentPageInventory] - && filteredInventory[KinkyDungeonCurrentPageInventory].item) { - let newItem = KDRestraint(filteredInventory[KinkyDungeonCurrentPageInventory].item); - if (newItem) { - let currentItem = KinkyDungeonGetRestraintItem(newItem.Group); - if (!currentItem - || (KinkyDungeonLinkableAndStricter(KDRestraint(currentItem), newItem, currentItem) && - ((newItem.linkCategory && KDLinkCategorySize(currentItem, newItem.linkCategory) + KDLinkSize(newItem) <= 1.0) - || (!newItem.linkCategory && !KDDynamicLinkList(currentItem, true).some((item) => {return newItem.name == item.name;}))))) { - equipped = false; - } else equipped = true; - } - } - DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 350, 60, TextGet("KinkyDungeonEquip"), equipped ? "grey" : "White", "", ""); - } - } - if (KinkyDungeonCurrentPageInventory >= filteredInventory.length) KinkyDungeonCurrentPageInventory = Math.max(0, KinkyDungeonCurrentPageInventory - 1); - - if (KinkyDungeonCurrentPageInventory > 0) { - DrawButtonVis(canvasOffsetX_ui + 100, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 60, TextGet("KinkyDungeonBookLastPage"), "White", "", ""); - } - if (KinkyDungeonCurrentPageInventory < filteredInventory.length-1) { - DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale - 325, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 60, TextGet("KinkyDungeonBookNextPage"), "White", "", ""); - } - -} - -function KinkyDungeonSendInventoryEvent(Event, data) { - if (!KDMapHasEvent(KDEventMapInventory, Event)) return; - for (let item of KinkyDungeonAllRestraint()) { - if (item.dynamicLink) - for (let d_item of KDDynamicLinkList(item)) { - let oldEvents = d_item.events; - if (oldEvents) - for (let e of oldEvents) { - if (e.inheritLinked && e.trigger === Event && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { - KinkyDungeonHandleInventoryEvent(Event, e, d_item, data); - } - } - } - if (item.events) { - for (let e of item.events) { - if (e.trigger === Event && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { - KinkyDungeonHandleInventoryEvent(Event, e, item, data); - } - } - } - if (item.curse && KDCurses[item.curse]?.events) { - for (let e of KDCurses[item.curse].events) { - if (e.trigger === Event && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { - KinkyDungeonHandleInventoryEvent(Event, e, item, data); - } - } - } - } -} - -let KinkyDungeonInvDraw = []; - -function KinkyDungeonQuickGrid(I, Width, Height, Xcount) { - let i = 0; - let h = 0; - let v = 0; - while (i < I) { - if (h < Xcount - 1) h++; else { - h = 0; - v++; - } - i++; - } - return {x: Width*h, y: Height*v}; -} - -let KDScrollOffset = { - "Consumable": 0, - "Restraint": 0, - "Weapon": 0, -}; - -let KDItemsPerScreen = { - "Consumable": 18, - "Restraint": 18, - "Weapon": 18, -}; - -let KDScrollAmount = 6; -let KDHideQuickInv = false; - -function KinkyDungeonDrawQuickInv() { - let H = 80; - let V = 80; - let fC = KinkyDungeonFilterInventory(Consumable, false, !KDHideQuickInv); - let consumables = fC.slice(KDScrollOffset.Consumable, KDScrollOffset.Consumable + KDItemsPerScreen.Consumable); - let fW = KinkyDungeonFilterInventory(Weapon, false, !KDHideQuickInv); - let weapons = fW.slice(KDScrollOffset.Weapon, KDScrollOffset.Weapon + KDItemsPerScreen.Weapon); - let fR = KinkyDungeonFilterInventory(LooseRestraint, true, !KDHideQuickInv); - let restraints = fR.slice(KDScrollOffset.Restraint, KDScrollOffset.Restraint + KDItemsPerScreen.Restraint); - let Wheight = KinkyDungeonQuickGrid(weapons.length-1, H, V, 6).y; - let Rheight = 480; - - KDScrollOffset.Consumable = Math.max(0, Math.min(Math.ceil((fC.length - KDItemsPerScreen.Consumable)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Consumable)); - KDScrollOffset.Restraint = Math.max(0, Math.min(Math.ceil((fR.length - KDItemsPerScreen.Consumable)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Restraint)); - KDScrollOffset.Weapon = Math.max(0, Math.min(Math.ceil((fW.length - KDItemsPerScreen.Consumable)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Weapon)); - - if (fC.length > KDItemsPerScreen.Consumable) { - DrawButtonVis(510, 5, 90, 40, "", "white", KinkyDungeonRootDirectory + "Up.png"); - DrawButtonVis(510, 50, 90, 40, "", "white", KinkyDungeonRootDirectory + "Down.png"); - } - if (fW.length > KDItemsPerScreen.Weapon) { - DrawButtonVis(510, 705, 90, 40, "", "white", KinkyDungeonRootDirectory + "Up.png"); - DrawButtonVis(510, 750, 90, 40, "", "white", KinkyDungeonRootDirectory + "Down.png"); - } - if (fR.length > KDItemsPerScreen.Restraint) { - DrawButtonVis(510, 455, 90, 40, "", "white", KinkyDungeonRootDirectory + "Up.png"); - DrawButtonVis(510, 500, 90, 40, "", "white", KinkyDungeonRootDirectory + "Down.png"); - } - - FillRectKD(kdcanvas, kdpixisprites, "quickinvbg", { - Left: 5, - Top: 5, - Width: 490, - Height: 990, - Color: "#000000", - LineWidth: 1, - zIndex: 59, - alpha: 0.9 - }); - - DrawButtonKDEx("inventoryhide", (bdata) => { - if (!KDGameData.HiddenItems) - KDGameData.HiddenItems = {}; - KDHideQuickInv = !KDHideQuickInv; - return true; - }, true, 510, 625, 120, 60, "", "white", KinkyDungeonRootDirectory + (KDHideQuickInv ? "InvHide.png" : "InvNoHide.png")); - - - for (let c = 0; c < consumables.length; c++) { - let item = consumables[c]; - if (item.preview) { - let point = KinkyDungeonQuickGrid(c, H, V, 6); - if (MouseIn(point.x + 1, 1+ point.y + 30, H-2, V-2)) { - FillRectKD(kdcanvas, kdpixisprites, "consumables" + c, { - Left: point.x, - Top: point.y + 30, - Width: H, - Height: V, - Color: KDTextGray3, - LineWidth: 1, - zIndex: 60, - alpha: 0.5 - }); - KinkyDungeonDrawInventorySelected(item, false, true); - } - KDDraw(kdcanvas, kdpixisprites, "consumablesicon" + c, - item.preview, point.x, point.y + 30, 80, 80, undefined, { - zIndex: 109, - }); - if (KDGameData.HiddenItems && KDGameData.HiddenItems[item.name]) { - KDDraw(kdcanvas, kdpixisprites, "consumablesiconhidden" + c, - KinkyDungeonRootDirectory + "InvHidden.png", point.x, point.y + 30, 80, 80, undefined, { - zIndex: 110, - }); - } - //DrawImageEx(item.preview, point.x, point.y + 30, {Width: 80, Height: 80}); - - MainCanvas.textAlign = "left"; - DrawTextKD("" + item.item.quantity, point.x+1, point.y+1 + 30, "black"); - DrawTextKD("" + item.item.quantity, point.x, point.y + 30, "white"); - MainCanvas.textAlign = "center"; - } - } - - for (let w = 0; w < weapons.length; w++) { - let item = weapons[w]; - if (item.preview) { - let point = KinkyDungeonQuickGrid(w, H, V, 6); - if (MouseIn(point.x + 1, 1+ 1000 - V - Wheight + point.y, H-2, V-2)) { - FillRectKD(kdcanvas, kdpixisprites, "weapons" + w, { - Left: point.x, - Top: 1000 - V - Wheight + point.y, - Width: H, - Height: V, - Color: KDTextGray3, - LineWidth: 1, - zIndex: 60, - alpha: 0.5 - }); - KinkyDungeonDrawInventorySelected(item, false, true); - } - - KDDraw(kdcanvas, kdpixisprites, "weaponsicon" + w, - item.preview, point.x, 1000 - V - Wheight + point.y, 80, 80, undefined, { - zIndex: 109, - }); - if (KDGameData.HiddenItems && KDGameData.HiddenItems[item.name]) { - KDDraw(kdcanvas, kdpixisprites, "weaponsiconhid" + w, - KinkyDungeonRootDirectory + "InvHidden.png", point.x, 1000 - V - Wheight + point.y, 80, 80, undefined, { - zIndex: 110, - }); - } - //DrawImageEx(item.preview, point.x, 1000 - V - Wheight + point.y, {Width: 80, Height: 80}); - } - } - - for (let w = 0; w < restraints.length; w++) { - let item = restraints[w]; - if (item.preview) { - let point = KinkyDungeonQuickGrid(w, H, V, 6); - if (MouseIn(point.x +1, 1+ 1000 - V - Rheight + point.y, H - 2, V - 2)) { - FillRectKD(kdcanvas, kdpixisprites, "restraints" + w, { - Left: point.x, - Top: 1000 - V - Rheight + point.y, - Width: H, - Height: V, - Color: KDTextGray3, - LineWidth: 1, - zIndex: 60, - alpha: 0.5 - }); - KinkyDungeonDrawInventorySelected(item, false, true); - } - //DrawImageEx(item.preview, point.x, 1000 - V - Rheight + point.y, {Width: 80, Height: 80}); - KDDraw(kdcanvas, kdpixisprites, "restraintsicon" + w, - item.preview, point.x, 1000 - V - Rheight + point.y, 80, 80, undefined, { - zIndex: 109, - }); - if (KDGameData.HiddenItems && KDGameData.HiddenItems[item.name]) { - KDDraw(kdcanvas, kdpixisprites, "restraintsiconhid" + w, - KinkyDungeonRootDirectory + "InvHidden.png", point.x, 1000 - V - Rheight + point.y, 80, 80, undefined, { - zIndex: 109, - }); - } - } - } -} - -function KinkyDungeonhandleQuickInv(NoUse) { - - - let H = 80; - let V = 80; - let fC = KinkyDungeonFilterInventory(Consumable, false, !KDHideQuickInv); - let consumables = fC.slice(KDScrollOffset.Consumable, KDScrollOffset.Consumable + KDItemsPerScreen.Consumable); - let fW = KinkyDungeonFilterInventory(Weapon, false, !KDHideQuickInv); - let weapons = fW.slice(KDScrollOffset.Weapon, KDScrollOffset.Weapon + KDItemsPerScreen.Weapon); - let fR = KinkyDungeonFilterInventory(LooseRestraint, true, !KDHideQuickInv); - let restraints = fR.slice(KDScrollOffset.Restraint, KDScrollOffset.Restraint + KDItemsPerScreen.Restraint); - let Wheight = KinkyDungeonQuickGrid(weapons.length-1, H, V, 6).y; - let Rheight = 480; - - if (fC.length > KDItemsPerScreen.Consumable) { - if (MouseIn(510, 5, 90, 40)) { - KDScrollOffset.Consumable = Math.max(0, KDScrollOffset.Consumable - KDScrollAmount); - return true; - } - if (MouseIn(510, 50, 90, 40)) { - KDScrollOffset.Consumable = Math.min(Math.ceil((fC.length - KDItemsPerScreen.Consumable)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Consumable + KDScrollAmount); - return true; - } - } - if (fW.length > KDItemsPerScreen.Weapon) { - if (MouseIn(510, 705, 90, 40)) { - KDScrollOffset.Weapon = Math.max(0, KDScrollOffset.Weapon - KDScrollAmount); - return true; - } - if (MouseIn(510, 750, 90, 40)) { - KDScrollOffset.Weapon = Math.min(Math.ceil((fW.length - KDItemsPerScreen.Consumable)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Weapon + KDScrollAmount); - return true; - } - } - if (fR.length > KDItemsPerScreen.Restraint) { - if (MouseIn(510, 455, 90, 40)) { - KDScrollOffset.Restraint = Math.max(0, KDScrollOffset.Restraint - KDScrollAmount); - return true; - } - if (MouseIn(510, 500, 90, 40)) { - KDScrollOffset.Restraint = Math.min(Math.ceil((fR.length - KDItemsPerScreen.Consumable)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Restraint + KDScrollAmount); - return true; - } - } - - if (NoUse) { - return false; - } - if (MouseX > 500) { - KDCloseQuickInv(); - return false; - } - - for (let c = 0; c < consumables.length; c++) { - let item = consumables[c]; - if (item.preview) { - let point = KinkyDungeonQuickGrid(c, H, V, 6); - if (MouseIn(point.x, point.y + 30, H, V)) { - if (KDHideQuickInv) { - KDGameData.HiddenItems[item.name] = !KDGameData.HiddenItems[item.name]; - } else { - KDSendInput("consumable", {item: item.name, quantity: 1}); - } - } - } - } - - for (let w = 0; w < weapons.length; w++) { - let item = weapons[w]; - if (item.preview) { - let point = KinkyDungeonQuickGrid(w, H, V, 6); - if (MouseIn(point.x, 1000 - V - Wheight + point.y, H, V)) { - if (KDHideQuickInv) { - KDGameData.HiddenItems[item.name] = !KDGameData.HiddenItems[item.name]; - } else { - let weapon = item.name != "Unarmed" ? item.name : null; - KDSendInput("switchWeapon", {weapon: weapon}); - KDCloseQuickInv(); - } - } - } - } - - for (let w = 0; w < restraints.length; w++) { - let item = restraints[w]; - if (item.preview) { - let point = KinkyDungeonQuickGrid(w, H, V, 6); - if (MouseIn(point.x, 1000 - V - Rheight + point.y, H, V)) { - if (KDHideQuickInv) { - KDGameData.HiddenItems[item.name] = !KDGameData.HiddenItems[item.name]; - } else { - let equipped = false; - let newItem = null; - let currentItem = null; - - if (item - && item.item) { - newItem = KDRestraint(item.item); - if (newItem) { - currentItem = KinkyDungeonGetRestraintItem(newItem.Group); - if (!currentItem - || (KinkyDungeonLinkableAndStricter(KDRestraint(currentItem), newItem, currentItem) && - ((newItem.linkCategory && KDLinkCategorySize(currentItem, newItem.linkCategory) + KDLinkSize(newItem) <= 1.0) - || (!newItem.linkCategory && !KDDynamicLinkList(currentItem, true).some((ii) => {return newItem.name == ii.name;}))))) { - equipped = false; - } else equipped = true; - } - } - if (!equipped && newItem) { - if (KDSendInput("equip", {name: newItem.name, group: newItem.Group, curse: item.item.curse, currentItem: currentItem ? currentItem.name : undefined, events: Object.assign([], item.item.events)})) return true; - } - } - - } - } - } - - - return false; -} diff --git a/Game/KinkyDungeonItem.js b/Game/KinkyDungeonItem.js deleted file mode 100644 index c2f26c8b8..000000000 --- a/Game/KinkyDungeonItem.js +++ /dev/null @@ -1,316 +0,0 @@ -"use strict"; -let KinkyDungeonGroundItems = []; // Tracking all items on the ground - -/** Certain items, when dropped, have specific properties - * @type {Record} -*/ -let KDDroppedItemProperties = { - "RedKey": { - tinyness: 2, - }, - "Pick": { - tinyness: 1, - }, - "BlueKey": { - tinyness: 2, - }, - "Knife": { - tinyness: 3, - }, - "EnchKnife": { - tinyness: 3, - }, - "Dirk": { - tinyness: 3, - }, - "Scissors": { - tinyness: 3, - }, - -}; - -function KinkyDungeonItemDrop(x, y, dropTable, summoned) { - if (dropTable) { - let dropWeightTotal = 0; - let dropWeights = []; - - for (let drop of dropTable) { - let weight = drop.weight; - dropWeights.push({drop: drop, weight: dropWeightTotal}); - if (drop.ignoreInInventory && (KinkyDungeonInventoryGet(drop.name) || KinkyDungeonFlags.get("ItemDrop_" + drop.name))) weight = 0; - if (drop.chance && KDRandom() > drop.chance) weight = 0; - dropWeightTotal += Math.max(weight, 0); - } - - let selection = KDRandom() * dropWeightTotal; - - for (let L = dropWeights.length - 1; L >= 0; L--) { - if (selection > dropWeights[L].weight) { - if (dropWeights[L].drop.name != "Nothing" && (!KinkyDungeonStatsChoice.get("Stealthy") || dropWeights[L].drop.name != "Gold") && (!summoned || !dropWeights[L].drop.noSummon)) { - let dropped = {x:x, y:y, name: dropWeights[L].drop.name, amount: dropWeights[L].drop.amountMin + Math.floor(KDRandom()*dropWeights[L].drop.amountMax)}; - if (!KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x, y))) { - let newPoint = KinkyDungeonGetNearbyPoint(x, y, false, undefined, true); - if (newPoint) { - dropped.x = newPoint.x; - dropped.y = newPoint.y; - } else { - console.log("Failed to find point to drop " + TextGet("KinkyDungeonInventoryItem" + dropWeights[L].drop.name)); - } - } - KinkyDungeonGroundItems.push(dropped); - KinkyDungeonSetFlag("ItemDrop_" + dropped.name, Math.round(12 + KDRandom() * 8)); - return dropped; - } - return false; - } - } - } - return false; -} - -function KinkyDungeonDropItem(Item, Origin, AllowOrigin, noMsg, allowEnemies) { - let slots = []; - for (let X = -Math.ceil(1); X <= Math.ceil(1); X++) - for (let Y = -Math.ceil(1); Y <= Math.ceil(1); Y++) { - if ((X != 0 || Y != 0)) - slots.push({x:X, y:Y}); - } - - let foundslot = AllowOrigin ? {x:Origin.x, y:Origin.y} : null; - if (!(Origin == KinkyDungeonPlayerEntity && AllowOrigin && KinkyDungeonPlayer.IsEnclose())) { - if (!foundslot || !(KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(foundslot.x, foundslot.y)) - && (allowEnemies || KinkyDungeonNoEnemy(foundslot.x, foundslot.y, true)))) - for (let C = 0; C < 100; C++) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Origin.x+slot.x, Origin.y+slot.y)) - && (allowEnemies || KinkyDungeonNoEnemy(Origin.x+slot.x, Origin.y+slot.y, true))) { - foundslot = {x: Origin.x+slot.x, y: Origin.y+slot.y}; - - C = 100; - } else slots.splice(C, 1); - } - } - - - if (foundslot) { - - let dropped = {x:foundslot.x, y:foundslot.y, name: Item.name}; - if (Item.amountMin && Item.amountMax) { - dropped.amount = Item.amountMin + Math.floor(KDRandom()*Item.amountMax); - } else if (Item.amount) { - dropped.amount = Item.amount; - } - - KinkyDungeonGroundItems.push(dropped); - if (!noMsg) - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonDrop" + Item.name), "#ff0000", 2); - - return true; - } - - return false; -} - -function KinkyDungeonItemEvent(Item) { - let color = "white"; - let priority = 1; - let sfx = "Coins"; - let name = Item.name; - let replace = ""; - if (KDCustomItems[name]) { - let ret = KDCustomItems[name](Item); - if (ret.sfx != undefined) sfx = ret.sfx; - if (ret.replace != undefined) replace = ret.replace; - if (ret.priority != undefined) priority = ret.priority; - if (ret.color != undefined) color = ret.color; - if (ret.name != undefined) name = ret.name; - } else if (Item.name == "Gold") { - color = "yellow"; - KinkyDungeonAddGold(Item.amount); - } else if (Item.name == "Lore") { - return KinkyDungeonNewLore(); - } else if (Item.name == "Pick") { - priority = 2; - color = "lightgreen"; - KinkyDungeonLockpicks += 1; - } else if (Item.name == "MagicSword") { - priority = 8; - color = "orange"; - KinkyDungeonInventoryAddWeapon("MagicSword"); - } else if (Item.name == "Scrolls") { - priority = 4; - color = "lightgreen"; - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollArms, 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollLegs, 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollVerbal, 1); - } else if (Item.name == "Knife") { - priority = 2; - color = "lightgreen"; - KinkyDungeonInventoryAddWeapon("Knife"); - } else if (Item.name == "Knives") { - priority = 3; - color = "lightgreen"; - KinkyDungeonInventoryAddWeapon("Knife"); - if (!KinkyDungeonPlayerDamage || KinkyDungeonPlayerDamage.unarmed) { - KDSetWeapon("Knife"); - KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); - } - } else if (Item.name == "EnchKnife") { - priority = 2; - color = "lightgreen"; - KinkyDungeonInventoryAddWeapon("EnchKnife"); - if (!KinkyDungeonPlayerDamage || KinkyDungeonPlayerDamage.unarmed) { - KDSetWeapon("EnchKnife"); - KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); - } - } else if (Item.name == "RedKey") { - priority = 2; - color = "lightgreen"; - KinkyDungeonRedKeys += 1; - } else if (Item.name == "BlueKey") { - priority = 2; - color = "lightgreen"; - KinkyDungeonBlueKeys += 1; - } else if (Item.name == "PotionMana") { - priority = 3; - color = "lightblue"; - sfx = "PotionDrink"; - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 1); - } else if (Item.name == "PotionStamina") { - priority = 3; - sfx = "PotionDrink"; - color = "lightgreen"; - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionStamina, 1); - } else if (Item.name == "PotionFrigid") { - priority = 3; - sfx = "PotionDrink"; - color = "white"; - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionFrigid, 1); - } else if (KinkyDungeonFindConsumable(Item.name)) { - let item = KinkyDungeonFindConsumable(Item.name); - priority = item.rarity; - if (item.potion) sfx = "PotionDrink"; - color = "white"; - KinkyDungeonChangeConsumable(item, 1); - } else if (KinkyDungeonFindWeapon(Item.name)) { - let item = KinkyDungeonFindWeapon(Item.name); - priority = Math.min(8, item.rarity + 4); - color = "orange"; - KinkyDungeonInventoryAddWeapon(Item.name); - } else if (Item.name == "Heart") { - if (KinkyDungeonStatDistractionMax >= KDMaxStat && KinkyDungeonStatStaminaMax >= KDMaxStat && KinkyDungeonStatManaMax >= KDMaxStat && KinkyDungeonStatWillMax >= KDMaxStat) { - KinkyDungeonDrawState = "Game"; - KinkyDungeonChangeStamina(30); - KinkyDungeonChangeMana(5); - KinkyDungeonChangeWill(2.5); - KDGameData.HeartTaken = true; - } else if (KinkyDungeonIsPlayer()) { - KinkyDungeonDrawState = "Heart"; - KinkyDungeonInterruptSleep(); - KinkyDungeonSetFlag("NoDialogue", 3); - } - } else if (Item.name == "Keyring") { - KDGameData.JailKey = true; - KinkyDungeonAggroAction('key', {}); - } else if (KinkyDungeonGetRestraintByName(Item.name)) { - if (!KinkyDungeonInventoryGetLoose(Item.name)) { - KinkyDungeonInventoryAdd({name: Item.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:Item.events, quantity: 1}); - } else { - if (!KinkyDungeonInventoryGetLoose(Item.name).quantity) KinkyDungeonInventoryGetLoose(Item.name).quantity = 0; - KinkyDungeonInventoryGetLoose(Item.name).quantity += 1; - } - color = "#ffffff"; - name = "Generic"; - replace = TextGet("Restraint" + Item.name); - } - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" + sfx + ".ogg"); - KinkyDungeonSendActionMessage(priority, TextGet("ItemPickup" + name).replace("XXX", Item.amount).replace("ReplaceValue", replace), color, 1); - if (!KDCanSeeDroppedItem(Item)) - KinkyDungeonSendActionMessage(priority + 1, TextGet("ItemFoundHidden").replace("XXX", Item.amount).replace("ReplaceValue", replace), color, 1); -} - - -function KinkyDungeonItemCheck(x, y, Index) { - for (let I = 0; I < KinkyDungeonGroundItems.length; I++) { - let item = KinkyDungeonGroundItems[I]; - if (x == item.x && y == item.y) { - KinkyDungeonGroundItems.splice(I, 1); - I -= 1; - KinkyDungeonItemEvent(item); - } - } -} - -function KDCanSeeDroppedItem(item) { - if (KDDroppedItemProperties[item.name]?.tinyness <= KinkyDungeonBlindLevel) return false; - return true; -} - -function KinkyDungeonDrawItems(canvasOffsetX, canvasOffsetY, CamX, CamY) { - for (let item of KinkyDungeonGroundItems) { - let sprite = item.name; - if (KinkyDungeonRestraintsCache.has(item.name)) sprite = "Restraint"; - if (item.x >= CamX && item.y >= CamY && item.x < CamX + KinkyDungeonGridWidthDisplay && item.y < CamY + KinkyDungeonGridHeightDisplay && KinkyDungeonVisionGet(item.x, item.y) > 0) { - if (KDCanSeeDroppedItem(item)) - KDDraw(kdgameboard, kdpixisprites, item.x + "," + item.y + "_" + item.name, KinkyDungeonRootDirectory + "Items/" + sprite + ".png", - (item.x - CamX)*KinkyDungeonGridSizeDisplay, (item.y - CamY)*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); - } - } -} - - - -function KinkyDungeonDrawHeart() { - - DrawTextKD(TextGet("KinkyDungeonHeartIntro"), 1250, 200, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonHeartIntro1"), 1250, 300, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonHeartIntro2"), 1250, 350, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonHeartIntro3"), 1250, 400, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonHeartIntro4"), 1250, 450, "#ffffff", KDTextGray2); - - DrawTextKD(TextGet("StatDistraction").replace("PERCENT", "" + Math.round(100*KinkyDungeonStatDistractionMax / KDMaxStatStart)), 650 + 250/2, 650, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("StatStamina").replace("CURRENT/MAX", "" + KinkyDungeonStatStaminaMax * KDMaxStatStart), 950 + 250/2, 650, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("StatMana").replace("CURRENT/MAX", "" + KinkyDungeonStatManaMax * KDMaxStatStart), 1250 + 250/2, 650, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("StatWill").replace("CURRENT/MAX", "" + KinkyDungeonStatWillMax * KDMaxStatStart), 1550 + 250/2, 650, "#ffffff", KDTextGray2); - - DrawButtonVis(650, 700, 250, 60, TextGet("KinkyDungeonHeartDistraction"), KinkyDungeonStatDistractionMax < KDMaxStat ? "#ffffff" : "#999999"); - DrawButtonVis(950, 700, 250, 60, TextGet("KinkyDungeonHeartStamina"), KinkyDungeonStatStaminaMax < KDMaxStat ? "#ffffff" : "#999999"); - DrawButtonVis(1250, 700, 250, 60, TextGet("KinkyDungeonHeartMana"), KinkyDungeonStatManaMax < KDMaxStat ? "#ffffff" : "#999999"); - DrawButtonVis(1550, 700, 250, 60, TextGet("KinkyDungeonHeartWill"), KinkyDungeonStatWillMax < KDMaxStat ? "#ffffff" : "#999999"); - - DrawButtonKDEx("discardheart", (bdata) => { - KinkyDungeonDrawState = "Game"; - return true; - }, true, 1000, 850, 450, 60, TextGet("KinkyDungeonHeartDiscard"), KinkyDungeonStatWillMax < KDMaxStat ? "#ffffff" : "#999999"); -} - -function KinkyDungeonHandleHeart() { - if (MouseIn(650, 700, 250, 60) && KinkyDungeonStatDistractionMax < KDMaxStat) { - KDSendInput("heart", {type: "AP"}); - KinkyDungeonDrawState = "Game"; - } else if (MouseIn(950, 700, 250, 60) && KinkyDungeonStatStaminaMax < KDMaxStat) { - KDSendInput("heart", {type: "SP"}); - KinkyDungeonDrawState = "Game"; - } else if (MouseIn(1250, 700, 250, 60) && KinkyDungeonStatManaMax < KDMaxStat) { - KDSendInput("heart", {type: "MP"}); - KinkyDungeonDrawState = "Game"; - } else if (MouseIn(1550, 700, 250, 60) && KinkyDungeonStatWillMax < KDMaxStat) { - KDSendInput("heart", {type: "WP"}); - KinkyDungeonDrawState = "Game"; - } - - return true; -} - -let KDCustomItems = { - "LeylineMap": () => { - KDStartDialog("LeylineMap", "", true, ""); - return { - sfx: undefined, - replace: undefined, - priority: undefined, - color: undefined, - }; - }, -}; \ No newline at end of file diff --git a/Game/KinkyDungeonJail.js b/Game/KinkyDungeonJail.js deleted file mode 100644 index 16596c509..000000000 --- a/Game/KinkyDungeonJail.js +++ /dev/null @@ -1,1230 +0,0 @@ -"use strict"; - -/** Time spent in cage before guards start getting teleported */ -let KDMaxCageTime = 100; - -/** Only these have jail events */ -let KDJailFilters = ['jail']; - -function KDAssignGuardAction(guard, xx, yy) { - let eventWeightTotal = 0; - let eventWeights = []; - - for (let event of Object.values(KDGuardActions)) { - eventWeights.push({event: event, weight: eventWeightTotal}); - eventWeightTotal += event.weight(guard, xx, yy); - } - - let selection = KDRandom() * eventWeightTotal; - - for (let L = eventWeights.length - 1; L >= 0; L--) { - if (selection > eventWeights[L].weight) { - eventWeights[L].event.assign(guard, xx, yy); - return; - } - } -} - -function KDGetJailEvent(guard, xx, yy) { - let eventWeightTotal = 0; - let eventWeights = []; - - for (let event of Object.values(KDJailEvents)) { - eventWeights.push({event: event, weight: eventWeightTotal}); - eventWeightTotal += event.weight(guard, xx, yy); - } - - let selection = KDRandom() * eventWeightTotal; - - for (let L = eventWeights.length - 1; L >= 0; L--) { - if (selection > eventWeights[L].weight) { - return eventWeights[L].event.trigger; - } - } - return (g, x, y) => {}; -} - - -function KinkyDungeonLoseJailKeys(Taken, boss, enemy) { - // KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail' || KDGameData.PrisonerState == 'chase' - if (KinkyDungeonFlags.has("BossUnlocked")) return; - if (KDGameData.JailKey) { - if (Taken) { - KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonRemoveJailKey"), "#ff0000", 3); - if (enemy) { - if (!enemy.items) enemy.items = []; - if (!enemy.items.includes("Keyring")) - enemy.items.push("Keyring"); - } - } - KDGameData.JailKey = false; - } - if (boss) { - KDGameData.JailKey = false; - KinkyDungeonGroundItems = KinkyDungeonGroundItems.filter((item) => {return item.name != "Keyring";}); - } -} - -function KinkyDungeonUpdateJailKeys() { - if (!KDGameData.JailKey) { - let altRoom = KinkyDungeonAltFloor(KDGameData.RoomType); - if ((!altRoom || !altRoom.nokeys) && (!KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel) || !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel).nokeys)) { - let keyCount = KinkyDungeonGroundItems.filter((item) => {return item.name == "Keyring";}).length; - for (let i = 0; i < 2 - keyCount; i++) { - KinkyDungeonPlaceJailKeys(); - } - } - } -} - -function KinkyDungeonAggroFaction(faction, noAllyRepPenalty) { - let list = []; - let list2 = []; - for (let enemy of KinkyDungeonEntities) { - if (enemy.Enemy.tags.peaceful) continue; - let enemyfaction = KDGetFaction(enemy); - if ((enemyfaction == faction || KDFactionRelation(enemyfaction, faction) > 0.4)) { - let dist = KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y); - if (KinkyDungeonCheckLOS(enemy, KinkyDungeonPlayerEntity, dist, enemy.Enemy.visionRadius, false, true)) { - list.push(enemy); - } - } else if (enemyfaction == "Player" && KDGetFactionOriginal(enemy) == faction) { - let dist = KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y); - if (KinkyDungeonCheckLOS(enemy, KinkyDungeonPlayerEntity, dist, enemy.Enemy.visionRadius, false, true)) { - list2.push(enemy); - } - } - } - if (faction) { - let amount = 0.04; - if (list.length > 0) { - for (let e of list) { - if (!e.allied) { - KDMakeHostile(e); - } - } - - KinkyDungeonChangeFactionRep(faction, -amount); - return true; - } else if (list2.length > 0 && !noAllyRepPenalty) { - KinkyDungeonChangeFactionRep(faction, -amount); - return false; - } - } - - return false; -} - -function KinkyDungeonPlayerIsVisibleToJailers() { - let list = []; - for (let enemy of KinkyDungeonEntities) { - if (KDHostile(enemy) && !(enemy.rage > 0) && (enemy.Enemy.tags.leashing || enemy.Enemy.tags.jail || enemy.Enemy.tags.jailer || enemy.Enemy.playLine)) { - if (KinkyDungeonCheckLOS(enemy, KinkyDungeonPlayerEntity, KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y), enemy.Enemy.visionRadius, false, true)) { - list.push(enemy); - } - } - } - if (list.length > 0) return list[Math.floor(Math.random() * list.length)]; - return null; -} - -/** - * - * @param {entity} enemy - * @returns {boolean} - */ -function KinkyDungeonCanPlay(enemy) { - return KDGameData.PrisonerState == 'parole' || (!KDHostile(enemy) && !KDAllied(enemy)) && (enemy.ambushtrigger || !KDAIType[KDGetAI(enemy)] || !KDAIType[KDGetAI(enemy)].ambush) && !enemy.Enemy.Behavior?.noPlay; -} - -function KinkyDungeonCheckRelease() { - if (KDGameData.RoomType) { - let altRoom = KinkyDungeonAltFloor(KDGameData.RoomType); - if (altRoom && altRoom.noRelease) return altRoom.releaseOnLowSec ? (KinkyDungeonGoddessRep.Prisoner >= KDSecurityLevelHiSec ? -1 : 1) : -1; - } - let sub = KinkyDungeonGoddessRep.Ghost + 50; - let security = KinkyDungeonGoddessRep.Prisoner + 50; - if (sub == undefined || isNaN(sub)) sub = 0; - if (security == undefined || isNaN(security)) security = 0; - let turns = KDGameData.JailTurns - security; - for (let i = 0; i < KDJailReleaseTurns.length; i++) { - let condition = KDJailReleaseTurns[i]; - if (sub >= condition.minSub && turns >= condition.releaseTurns) return i; - } - return -1; -} - -/** Max turns for the alert timer until the whole map becomes hostile */ -let KDMaxAlertTimer = 14; -let KDMaxAlertTimerAggro = 300; - -/** - * - * @param {string} action - * @param {{enemy?: entity, x?: number, y?: number, faction?: string}} data - */ -function KinkyDungeonAggroAction(action, data) { - let e = null; - switch (action) { - // Attacking ALWAYS makes the enemy angry - case 'attack': - KinkyDungeonStartChase(data.enemy, "Attack"); - break; - - // Magic ALWAYS makes the enemy angry - case 'magic': - e = KinkyDungeonPlayerIsVisibleToJailers(); - if (e) { - KinkyDungeonStartChase(e, "Spell"); - } - break; - // Magic ALWAYS makes the enemy angry - case 'item': - e = KinkyDungeonPlayerIsVisibleToJailers(); - if (e) { - KinkyDungeonStartChase(e, "SpellItem"); - } - break; - - // Having a guard called ALWAYS makes the enemy angry - case 'call': - KinkyDungeonStartChase(data.enemy, ""); - break; - - // Chests ALWAYS make the enemy angry - case 'chest': - e = KinkyDungeonPlayerIsVisibleToJailers(); - if (e) { - KinkyDungeonStartChase(e, "Chest"); - } - if (data.faction) - KinkyDungeonAggroFaction(data.faction); - break; - - // Chests ALWAYS make the enemy angry - case 'rubble': - e = KinkyDungeonPlayerIsVisibleToJailers(); - if (e) { - KinkyDungeonPlayExcuse(e, "Loot"); - } - break; - - // Altars ALWAYS make the enemy angry - case 'shrine': - e = KinkyDungeonPlayerIsVisibleToJailers(); - if (e) { - KinkyDungeonStartChase(e, "Shrine"); - } - break; - - // Chests ALWAYS make the enemy angry - case 'orb': - e = KinkyDungeonPlayerIsVisibleToJailers(); - if (e) { - KinkyDungeonStartChase(e, "Orb"); - } - break; - - case 'struggle': - if (data.enemy) // KDGameData.PrisonerState == "parole" && - KinkyDungeonPlayExcuse(data.enemy, "Struggle"); - break; - - case 'unrestrained': - if (KDGameData.PrisonerState == "parole" && data.enemy) - KinkyDungeonPlayExcuse(data.enemy, "Free"); - break; - - // Roaming free only makes them angry if you are a prisoner - case 'jailbreak': - if (KDGameData.PrisonerState == "jail"){ - KinkyDungeonStartChase(data.enemy, "Jailbreak"); - } - break; - - // Roaming free only makes them angry if you are a prisoner - case 'key': - e = KinkyDungeonPlayerIsVisibleToJailers(); - if (e) { - KinkyDungeonPlayExcuse(e, "Key"); - } - break; - } -} - -/** - * @type {string[]} - */ -let KDLocalChaseTypes = ["Refusal", "Attack", "Spell", "SpellItem", "Shrine", "Orb", "Chest"]; - -/** - * - * @param {entity} enemy - * @param {string} Type - * @param {string} [faction] - * @param {boolean} [force] - */ -function KinkyDungeonStartChase(enemy, Type, faction, force) { - if (!force && enemy && (!enemy.aware && !(enemy.vp > 0.5))) return; - if ((!enemy && !KDLocalChaseTypes.includes(Type))) { - if (KDGameData.PrisonerState == 'jail' || KDGameData.PrisonerState == 'parole') { - KinkyDungeonChangeRep("Ghost", -10); - KinkyDungeonChangeRep("Prisoner", 20); - KDGameData.PrisonerState = "chase"; - KinkyDungeonInterruptSleep(); - } - if (KDGameData.PrisonerState == 'jail' || KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'chase') - KDGameData.PrisonerState = "chase"; - } else if (KDLocalChaseTypes.includes(Type) && (enemy || faction)) { - for (let e of KinkyDungeonEntities) { - if (KDHostile(e) && KDFactionAllied(faction ? faction : KDGetFaction(enemy), e) && (!enemy || !enemy.Enemy.tags.peaceful) && KinkyDungeonCheckLOS(e, KinkyDungeonPlayerEntity, 7, 8, false, false)) { - if (!e.hostile) e.hostile = KDMaxAlertTimerAggro; - else KDMakeHostile(e);//e.hostile = Math.max(KDMaxAlertTimerAggro, e.hostile); - e.ceasefire = undefined; - } - } - } - - if (Type && enemy && (enemy.Enemy.tags.jail || enemy.Enemy.tags.jailer || enemy.Enemy.playLine)) { - let suff = enemy.Enemy.playLine ? enemy.Enemy.playLine + Type : Type; - let index = (Type == "Attack" || Type == "Spell") ? ("" + Math.floor(Math.random() * 3)) : ""; - - if (!enemy.dialogue || !enemy.dialogueDuration) - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailChase" + suff + index).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, (!KDGameData.PrisonerState) ? 3 : 5); - } - if (enemy && KDFactionRelation(KDGetFaction(enemy), "Jail") > -0.1 && !enemy.Enemy.tags.peaceful) { - if (!enemy.hostile) KDMakeHostile(enemy);//enemy.hostile = KDMaxAlertTimerAggro; - else KDMakeHostile(enemy);//Math.max(KDMaxAlertTimerAggro, enemy.hostile); - enemy.ceasefire = undefined; - } -} - -/** - * - * @param {entity} enemy - * @param {string} Type - */ -function KinkyDungeonPlayExcuse(enemy, Type) { - if (Type == "Free" && enemy && enemy.Enemy.noChaseUnrestrained) { - return; - } - if (KinkyDungeonCanPlay(enemy) && !(enemy.playWithPlayer > 0) && enemy.aware && !(enemy.playWithPlayerCD > 0) && (enemy.Enemy.tags.jail || enemy.Enemy.tags.jailer || enemy.Enemy.playLine)) { - enemy.playWithPlayer = 17; - KDSetPlayCD(enemy, 1.5); - KinkyDungeonSetEnemyFlag(enemy, "playstart", 3); - if (Type == "Key") { - enemy.playWithPlayer = 30; - enemy.playWithPlayerCD = enemy.playWithPlayer; - } - let suff = enemy.Enemy.playLine ? enemy.Enemy.playLine + Type : Type; - KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 4); - } -} - -/** - * - * @param {entity} enemy - * @param {number} mult - * @param {number} base - */ -function KDSetPlayCD(enemy, mult, base = 10) { - enemy.playWithPlayerCD = Math.max(enemy.playWithPlayerCD, base * mult + enemy.playWithPlayer * mult); -} - -/** - * - * @param {string} Group - * @returns {restraint} - */ -function KinkyDungeonGetJailRestraintForGroup(Group) { - /** - * @type {restraint} - */ - let cand = null; - let candLevel = 0; - for (let r of KDGetJailRestraints()) { - let level = 0; - if (KinkyDungeonGoddessRep.Prisoner) level = Math.max(0, KinkyDungeonGoddessRep.Prisoner + 50); - if (!r.Level || level >= r.Level) { - let candidate = KinkyDungeonGetRestraintByName(r.Name); - if (candidate.Group == Group && (!candidate.nonbinding || cand == null)) { - if (candLevel == 0 || r.Level > candLevel) { - cand = candidate; - candLevel = candidate.nonbinding ? 0 : r.Level; - } - } - } - } - return cand; -} - -function KinkyDungeonGetJailRestraintLevelFor(Name) { - for (let r of KDGetJailRestraints()) { - if (r.Name === Name) { - return r.Level; - } - } - return -1; -} - -/** - * - * @param {string[]} [filter] - Have to be in a jail, not a dropoff - * @returns {boolean} - */ -function KinkyDungeonInJail(filter) { - return KinkyDungeonPlayerInCell(false, false, filter);//KDGameData.KinkyDungeonSpawnJailers > 0 && KDGameData.KinkyDungeonSpawnJailers + 1 >= KDGameData.KinkyDungeonSpawnJailersMax; -} - - -function KinkyDungeonPlaceJailKeys() { - let jailKeyList = []; - - // Populate the key - for (let X = 1; X < KinkyDungeonGridWidth; X += 1) - for (let Y = 1; Y < KinkyDungeonGridHeight; Y += 1) - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) - && KDistChebyshev(X - KinkyDungeonPlayerEntity.x, Y - KinkyDungeonPlayerEntity.y) > 15 - && KDistChebyshev(X - KinkyDungeonEndPosition.x, Y - KinkyDungeonEndPosition.y) > 15 - && (!KinkyDungeonShortcutPosition || KDistChebyshev(X - KinkyDungeonShortcutPosition.x, Y - KinkyDungeonShortcutPosition.y) > 15) - && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OffLimits)) - jailKeyList.push({x:X, y:Y}); - - let i = 0; - - while (jailKeyList.length > 0) { - let N = Math.floor(KDRandom()*jailKeyList.length); - let slot = jailKeyList[N]; - if (KDGameData.KeyringLocations && i < KDGameData.KeyringLocations.length) { - slot = KDGameData.KeyringLocations[Math.floor(KDRandom() * KDGameData.KeyringLocations.length)]; - } - if (i < 1000 && !KinkyDungeonGroundItems.some((item) => {return item.name == "Keyring" && KDistChebyshev(item.x - slot.x, item.y - slot.y) < KinkyDungeonGridHeight / 3;})) { - KinkyDungeonGroundItems.push({x:slot.x, y:slot.y, name: "Keyring"}); - } - i++; - return true; - } - -} - -function KinkyDungeonHandleJailSpawns(delta) { - if (KDGameData.JailTurns) KDGameData.JailTurns += delta; - else KDGameData.JailTurns = 1; - if (KinkyDungeonInJail(KDJailFilters)) KDGameData.JailRemoveRestraintsTimer += delta; - - let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - - if (!nearestJail) return; - - let xx = nearestJail.x + KinkyDungeonJailLeashX; - let yy = nearestJail.y; - let playerInCell = (Math.abs(KinkyDungeonPlayerEntity.x - nearestJail.x) < KinkyDungeonJailLeashX - 1 && Math.abs(KinkyDungeonPlayerEntity.y - nearestJail.y) <= KinkyDungeonJailLeash); - - // This is an important piece to make it so guards don't clog up the jail space - for (let enemy of KinkyDungeonEntities) { - if (enemy.gxx == xx && enemy.gyy == yy && KDGetAI(enemy) == "guard") { - enemy.AI = "hunt"; - } - } - - // Start jail event, like spawning a guard, spawning rescues, etc - if (KinkyDungeonInJail(KDJailFilters) && KDGameData.PrisonerState == "jail" && (KDGameData.KinkyDungeonGuardSpawnTimer <= 1 || KDGameData.SleepTurns == 3) && !KinkyDungeonJailGuard() && playerInCell) { - KDGetJailEvent(KinkyDungeonJailGuard(), xx, yy)(KinkyDungeonJailGuard(), xx, yy); - } else if (KDGameData.KinkyDungeonGuardSpawnTimer > 0 && KDGameData.SleepTurns < 1 && !KinkyDungeonAngel()) KDGameData.KinkyDungeonGuardSpawnTimer -= delta; - - // Assign and handle the current jail action if there is a guard - if (KinkyDungeonJailGuard() && KDGameData.KinkyDungeonGuardTimer > 0 && KDGameData.KinkyDungeonGuardTimerMax - KDGameData.KinkyDungeonGuardTimer > 6 && KDGameData.PrisonerState == 'jail') { - if (KDGuardActions[KinkyDungeonJailGuard().CurrentAction] && KDGuardActions[KinkyDungeonJailGuard().CurrentAction].assignable && KDGuardActions[KinkyDungeonJailGuard().CurrentAction].assignable(KinkyDungeonJailGuard(), xx, yy)) { - KDAssignGuardAction(KinkyDungeonJailGuard(), xx, yy); - } - } - - if (KinkyDungeonJailGuard()) { - if (KDGuardActions[KinkyDungeonJailGuard().CurrentAction] && KDGuardActions[KinkyDungeonJailGuard().CurrentAction].handle) { - KDGuardActions[KinkyDungeonJailGuard().CurrentAction].handle(KinkyDungeonJailGuard(), xx, yy, delta); - } - - // Return guard to wandering if the jail is over - if (KDGameData.PrisonerState != 'jail') { - KinkyDungeonJailGuard().CurrentAction = "jailWander"; - } - - KinkyDungeonJailGuard().gxx = KDGameData.PrisonerState == 'jail' && KDGameData.KinkyDungeonGuardTimer > 0 ? KinkyDungeonJailGuard().gx : xx; - KinkyDungeonJailGuard().gyy = KDGameData.PrisonerState == 'jail' && KDGameData.KinkyDungeonGuardTimer > 0 ? KinkyDungeonJailGuard().gy : yy; - if (KDGameData.KinkyDungeonGuardTimer > 0) { - // Decrease timer when not on a tour - if (!KinkyDungeonFlags.has("notickguardtimer") && !KinkyDungeonAngel()) { - KDGameData.KinkyDungeonGuardTimer -= 1; - if (KDGameData.KinkyDungeonGuardTimer <= 0) { - KinkyDungeonJailGuard().gx = xx; - KinkyDungeonJailGuard().gy = yy; - } - } - } else { - // Leave the cell and lock the door - // Despawn jailer - if (KinkyDungeonJailGuard() - && KinkyDungeonJailGuard().x == xx - && KinkyDungeonJailGuard().y == yy - && (!KinkyDungeonJailGuard().IntentAction || KinkyDungeonJailGuard().IntentAction.startsWith('jail')) - && KDGameData.PrisonerState - && !KinkyDungeonJailGuard().hostile - && !KinkyDungeonFlags.has("notickguardtimer") - && !KinkyDungeonFlags.has("nojailbreak")) { - let g = KinkyDungeonJailGuard(); - KDClearItems(g); - KDSpliceIndex(KinkyDungeonEntities.indexOf(KinkyDungeonJailGuard()), 1); - if (KinkyDungeonTilesGet((xx-1) + "," + yy) && KinkyDungeonTilesGet((xx-1) + "," + yy).Type == "Door") { - KinkyDungeonMapSet(xx-1, yy, 'D'); - if (KDGameData.PrisonerState == 'jail') - KinkyDungeonTilesGet((xx-1) + "," + yy).Lock = KinkyDungeonGenerateLock(true, MiniGameKinkyDungeonLevel); - if (KDGameData.PrisonerState == 'jail' && KinkyDungeonVisionGet(g.x, g.y)) - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonGuardDisappear").replace("EnemyName", TextGet("Name" + g.Enemy.name)), "#ff0000", 6); - if (KinkyDungeonPlayerInCell(true)) - KinkyDungeonChangeRep("Ghost", 1 + KDGameData.KinkyDungeonPrisonExtraGhostRep); - KDGameData.KinkyDungeonPrisonExtraGhostRep = 0; - } - } else if (!KinkyDungeonJailGuard().IntentAction || KinkyDungeonJailGuard().IntentAction.startsWith('jail')) { - KinkyDungeonJailGuard().gx = xx; - KinkyDungeonJailGuard().gy = yy; - } - } - } - - // Unlock all jail doors when chasing - if (!KDGameData.PrisonerState || KDGameData.PrisonerState == 'chase') { - for (let T of Object.values(KinkyDungeonTiles)) { - if (T.Lock && T.Type == "Door" && T.Jail) T.Lock = undefined; - } - } - - if (!KinkyDungeonJailGuard()) { - KDGameData.KinkyDungeonGuardTimer = 0; - } else { - if (KDHelpless(KinkyDungeonJailGuard())) { - KDGameData.KinkyDungeonJailGuard = 0; - } - if (KinkyDungeonJailGuard() && KDistChebyshev(KinkyDungeonJailGuard().x - KinkyDungeonPlayerEntity.x, KinkyDungeonJailGuard().y - KinkyDungeonPlayerEntity.y) > 10 && KDGameData.KinkyDungeonGuardTimer < 4) { - KDGameData.KinkyDungeonJailGuard = 0; - } - } - if (!KinkyDungeonEntities.includes(KinkyDungeonJailGuard())) { - if (KDGameData.KinkyDungeonGuardSpawnTimer == 0 || KinkyDungeonJailGuard()) - KDGameData.KinkyDungeonGuardSpawnTimer = 14 + Math.floor(KDRandom() * (KDGameData.KinkyDungeonGuardSpawnTimerMax - KDGameData.KinkyDungeonGuardSpawnTimerMin)); - KDGameData.KinkyDungeonJailGuard = 0; - } -} - -function KinkyDungeonLockableItems() { - let LockableGroups = []; - for (let gr of KinkyDungeonStruggleGroupsBase) { - let g = gr; - if (gr == "ItemM") { - if (KinkyDungeonGetRestraintItem("ItemMouth2")) g = "ItemMouth3"; - else if (KinkyDungeonGetRestraintItem("ItemMouth")) g = "ItemMouth2"; - else g = "ItemMouth"; - } - if (gr == "ItemH") { - if (KinkyDungeonGetRestraintItem("ItemHood")) g = "ItemHood"; - else g = "ItemHead"; - } - let currentItem = KinkyDungeonGetRestraintItem(g); - if (currentItem && !currentItem.lock && KinkyDungeonIsLockable(KDRestraint(currentItem))) { - LockableGroups.push(g); - } - } - return LockableGroups; -} - -function KinkyDungeonMissingJailUniform() { - let MissingGroups = []; - for (let gr of KinkyDungeonStruggleGroupsBase) { - let g = gr; - if (gr == "ItemM") { - if (KinkyDungeonGetRestraintItem("ItemMouth2")) g = "ItemMouth3"; - else if (KinkyDungeonGetRestraintItem("ItemMouth")) g = "ItemMouth2"; - else g = "ItemMouth"; - } - if (gr == "ItemH") { - if (KinkyDungeonGetRestraintItem("ItemHood")) g = "ItemHood"; - else g = "ItemHood"; - } - let rest = KinkyDungeonGetJailRestraintForGroup(g); - let currentItem = KinkyDungeonGetRestraintItem(g); - if (rest - && (!currentItem || ( - KDCanAddRestraint(rest, - KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, - undefined, - !KinkyDungeonStatsChoice.has("TightRestraints") ? true : undefined, - undefined, - KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, KinkyDungeonJailGuard()) - && (!currentItem.dynamicLink || !KDDynamicLinkList(currentItem, true).some((item) => {return rest.name == item.name;}))) - ) - && (KinkyDungeonStatsChoice.get("arousalMode") || !rest.arousalMode) - && (KinkyDungeonStatsChoice.get("arousalModePlug") || rest.Group != "ItemButt") - && (KinkyDungeonStatsChoice.get("arousalModePiercing") || !rest.piercing)) { - MissingGroups.push(g); - } - } - return MissingGroups; -} - -function KinkyDungeonTooMuchRestraint() { - let Groups = ["ItemArms", "ItemHands", "ItemHead", "ItemMouth", "ItemMouth2", "ItemMouth3", "ItemHood", "ItemLegs", "ItemFeet", "ItemHands"]; - - for (let g of KinkyDungeonStruggleGroupsBase) { - let rest = KinkyDungeonGetJailRestraintForGroup(g); - if (rest && !Groups.includes(g)) Groups.push(g); - } - let RemoveGroups = []; - for (let g of Groups) { - let rest = KinkyDungeonGetJailRestraintForGroup(g); - let currentItem = KinkyDungeonGetRestraintItem(g); - let cutoffpower = KinkyDungeonStatsChoice.get("KinkyPrison") ? -50 : 4; - let lockMult = currentItem ? Math.max(1, KinkyDungeonGetLockMult(currentItem.lock) - 0.5) : (currentItem && KinkyDungeonIsLockable(KDRestraint(currentItem)) ? 0.4 : 1); - if ( - (!rest && currentItem && KDRestraint(currentItem).power * lockMult <= Math.max(cutoffpower + 0.1, rest ? rest.power : cutoffpower)) // There shouldnt be one here - || (rest && currentItem && currentItem && rest.name != currentItem.name - && (KDRestraint(currentItem).power < rest.power || KDRestraint(currentItem).power * lockMult <= Math.max(cutoffpower + 0.1, rest ? rest.power : cutoffpower))) // Wrong item equipped - ) { - if (!currentItem || (!currentItem.curse && !KDRestraint(currentItem).curse && !KDRestraint(currentItem).enchanted)) - RemoveGroups.push(g); - } - } - return RemoveGroups; -} - -/** - * - * @param {number} xx - * @param {number} yy - * @param {string} type - */ -function KinkyDungeonHandleLeashTour(xx, yy, type) { - // Remove the leash when we are done - if (!KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints && KinkyDungeonJailGuard().x === KinkyDungeonJailGuard().NextJailLeashTourWaypointX && KinkyDungeonJailGuard().y === KinkyDungeonJailGuard().NextJailLeashTourWaypointY) { - let leashItemToRemove = KinkyDungeonGetRestraintItem("ItemNeckRestraints"); - if (leashItemToRemove) { - KinkyDungeonRemoveRestraint("ItemNeckRestraints", false); - let msg = TextGet("KinkyDungeonRemoveRestraints").replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)); - msg = msg.replace("OldRestraintName", TextGet("Restraint"+leashItemToRemove.name)); - KinkyDungeonSendTextMessage(5, msg, "yellow", 1); - } - KDGameData.KinkyDungeonPrisonExtraGhostRep += 2; - let entity = KinkyDungeonJailGuard() ? KinkyDungeonJailGuard() : KinkyDungeonPlayerEntity; - let nearestJail = KinkyDungeonNearestJailPoint(entity.x, entity.y); - let jailRadius = (nearestJail && nearestJail.radius) ? nearestJail.radius : 1.5; - let playerInCell = nearestJail ? (Math.abs(KinkyDungeonPlayerEntity.x - nearestJail.x) < jailRadius - 1 && Math.abs(KinkyDungeonPlayerEntity.y - nearestJail.y) <= jailRadius) - : null; - if (!playerInCell) { - let point = {x: nearestJail.x, y: nearestJail.y};//KinkyDungeonGetNearbyPoint(nearestJail.x, nearestJail.y, true, undefined, true); - if (point) { - KDMovePlayer(point.x, point.y, false); - } - } - - if (KinkyDungeonJailGuard()?.KinkyDungeonJailTourInfractions < 1) { - let item = "CookieJailer"; - KinkyDungeonSendDialogue(KinkyDungeonJailGuard(), TextGet("KinkyDungeonJailerReleaseGoodGirl").replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)), "#ffff00", 4, 9); - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonJailerReleaseGoodGirlMsg") - .replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)) - .replace("ItemName", TextGet("KinkyDungeonInventoryItem" + item)), - "#88ff88", 1); - KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable(item), 1); - } - - let enemy = KinkyDungeonEnemyAt(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - if (enemy) enemy.x += 1; - KinkyDungeonJailGuard().CurrentAction = "jailWander"; - KDGameData.KinkyDungeonJailTourTimer = KDGameData.KinkyDungeonJailTourTimerMin + Math.floor((KDGameData.KinkyDungeonJailTourTimerMax - KDGameData.KinkyDungeonJailTourTimerMin) * KDRandom()); - KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().x; - KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().y; - } else { - // Run the leash - let playerDist = KDistChebyshev(KinkyDungeonJailGuard().x - KinkyDungeonPlayerEntity.x, KinkyDungeonJailGuard().y - KinkyDungeonPlayerEntity.y);//Math.sqrt((KinkyDungeonJailGuard().x - KinkyDungeonPlayerEntity.x)*(KinkyDungeonJailGuard().x - KinkyDungeonPlayerEntity.x) + (KinkyDungeonJailGuard().y - KinkyDungeonPlayerEntity.y)*(KinkyDungeonJailGuard().y - KinkyDungeonPlayerEntity.y)); - let wearingLeash = KinkyDungeonIsWearingLeash(); - if (!wearingLeash) { - let touchesPlayer = KinkyDungeonCheckLOS(KinkyDungeonJailGuard(), KinkyDungeonPlayerEntity, playerDist, 1.5, false, false); - if (touchesPlayer) { - if (!KinkyDungeonGetRestraintItem("ItemNeck")) { - let collar = KinkyDungeonGetRestraintByName("BasicCollar"); - KinkyDungeonAddRestraintIfWeaker(collar, KinkyDungeonJailGuard().Enemy.power, true, "", undefined, undefined, undefined, KDGetFaction(KinkyDungeonJailGuard()), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, KinkyDungeonJailGuard()); - let msg = TextGet("KinkyDungeonAddRestraints").replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)); - msg = msg.replace("NewRestraintName", TextGet("Restraint"+collar.name)); - KinkyDungeonSendTextMessage(5, msg, "yellow", 1); - KinkyDungeonJailGuard().NextJailLeashTourWaypointX = KinkyDungeonJailGuard().x; - KinkyDungeonJailGuard().NextJailLeashTourWaypointY = KinkyDungeonJailGuard().y; - KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().x; - KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().y; - } else { - let leash = KinkyDungeonGetRestraintByName("BasicLeash"); - KinkyDungeonAddRestraintIfWeaker(leash, KinkyDungeonJailGuard().Enemy.power, true, "", undefined, undefined, undefined, KDGetFaction(KinkyDungeonJailGuard()), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, KinkyDungeonJailGuard()); - let msg = TextGet("KinkyDungeonAddRestraints").replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)); - msg = msg.replace("NewRestraintName", TextGet("Restraint"+leash.name)); - KinkyDungeonSendTextMessage(5, msg, "yellow", 1); - KinkyDungeonJailGuard().NextJailLeashTourWaypointX = KinkyDungeonJailGuard().x; - KinkyDungeonJailGuard().NextJailLeashTourWaypointY = KinkyDungeonJailGuard().y; - KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().x; - KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().y; - } - KinkyDungeonAttachTetherToEntity(2, KinkyDungeonJailGuard()); - } else { - KinkyDungeonJailGuard().gx = KinkyDungeonPlayerEntity.x; - KinkyDungeonJailGuard().gy = KinkyDungeonPlayerEntity.y; - } - } else if (!KinkyDungeonTetherLength()) { - KinkyDungeonJailGuard().gx = KinkyDungeonPlayerEntity.x; - KinkyDungeonJailGuard().gy = KinkyDungeonPlayerEntity.y; - if (playerDist < 1.5) { - KinkyDungeonAttachTetherToEntity(2, KinkyDungeonJailGuard()); - } - } else if (KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints > 0 - && (KDistChebyshev(KinkyDungeonJailGuard().x - KinkyDungeonJailGuard().NextJailLeashTourWaypointX, KinkyDungeonJailGuard().y - KinkyDungeonJailGuard().NextJailLeashTourWaypointY) < 2 - || (KDRandom() < 0.05 && KDistChebyshev(KinkyDungeonJailGuard().x - KinkyDungeonJailGuard().NextJailLeashTourWaypointX, KinkyDungeonJailGuard().y - KinkyDungeonJailGuard().NextJailLeashTourWaypointY) < 5) - || KDRandom() < 0.01)) { - KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints--; - if (KinkyDungeonJailGuard().NextJailLeashTourWaypointX > KinkyDungeonJailLeashX + 2) { - if (KDRandom() < 0.5 && KinkyDungeonLastAction == "Move") { - let index = "0"; - if (KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions < 1) { - index = "" + Math.floor(KDRandom() * 6); - //KinkyDungeonChangeRep("Ghost", 8); - } - KinkyDungeonSendDialogue(KinkyDungeonJailGuard(), TextGet("KinkyDungeonJailerGoodGirl" + index).replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)), "#ffff00", 4, 9); - } - } - KinkyDungeonJailGuardGetLeashWaypoint(xx, yy, type); - } else { - let pullDist = 2.5;//KinkyDungeonTetherLength() - 1;//KinkyDungeonJailGuard().Enemy.pullDist ? KinkyDungeonJailGuard().Enemy.pullDist : 1; - if (playerDist < 1.5) { - KinkyDungeonAttachTetherToEntity(2, KinkyDungeonJailGuard()); - } - if (playerDist > pullDist && KinkyDungeonSlowLevel < 2 && KinkyDungeonCheckProjectileClearance(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y)) { - // Guard goes back towards the player and reminds them - let msg = TextGet("KinkyDungeonRemindJailTour" + KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions).replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)); - let msgPrev = TextGet("KinkyDungeonRemindJailTour" + Math.max(0, KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions-1)).replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)); - if (KinkyDungeonLastAction == "Move") { - - KinkyDungeonSendDialogue(KinkyDungeonJailGuard(), msg, "#ffff00", 4, 7 + KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions); - if (KinkyDungeonJailGuard().gx != KinkyDungeonPlayerEntity.x || KinkyDungeonJailGuard().gy != KinkyDungeonPlayerEntity.y && KinkyDungeonTextMessage != msgPrev) { - KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions = Math.min(3, KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions + 1); - } - } - if (KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions == 3 && KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints > 1) KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints = 1; - KinkyDungeonJailGuard().gx = KinkyDungeonPlayerEntity.x; - KinkyDungeonJailGuard().gy = KinkyDungeonPlayerEntity.y; - KinkyDungeonUpdateTether(true, KinkyDungeonPlayerEntity); - } else { - KDGameData.KinkyDungeonLeashedPlayer = 2; - KDGameData.KinkyDungeonLeashingEnemy = KinkyDungeonJailGuard().id; - KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().NextJailLeashTourWaypointX; - KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().NextJailLeashTourWaypointY; - let guardPath = KinkyDungeonFindPath(KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y, KinkyDungeonJailGuard().gx, KinkyDungeonJailGuard().gy, false, false, true, KinkyDungeonMovableTilesEnemy); - if (guardPath && guardPath.length > 0 && KDistChebyshev(guardPath[0].x - KinkyDungeonJailGuard().x, guardPath[0].y - KinkyDungeonJailGuard().y) < 1.5) { - if (guardPath[0].x === KinkyDungeonPlayerEntity.x && guardPath[0].y === KinkyDungeonPlayerEntity.y) { - // Swap the player and the guard - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - KDMovePlayer(KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y, false); - KinkyDungeonJailGuard().x = guardPath[0].x; - KinkyDungeonJailGuard().y = guardPath[0].y; - } - let enemy = KinkyDungeonEnemyAt(guardPath[0].x, guardPath[0].y); - if (enemy) { - KDMoveEntity(enemy, KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y, true, undefined, undefined, true); - KinkyDungeonJailGuard().x = guardPath[0].x; - KinkyDungeonJailGuard().y = guardPath[0].y; - } - } else KinkyDungeonJailGuardGetLeashWaypoint(xx, yy, type); - KinkyDungeonUpdateTether(true, KinkyDungeonPlayerEntity); - } - } - } -} - -/** - * - * @param {number} xx - * @param {number} yy - * @param {string} type - */ -function KinkyDungeonJailGuardGetLeashWaypoint(xx, yy, type) { - if (type == "transfer") { - // Go back to a random mcell - let nearestJail = KinkyDungeonRandomJailPoint(["jail"], [KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)]); - if (nearestJail) { - KinkyDungeonJailGuard().NextJailLeashTourWaypointX = nearestJail.x; - KinkyDungeonJailGuard().NextJailLeashTourWaypointY = nearestJail.y; - KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().NextJailLeashTourWaypointX; - KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().NextJailLeashTourWaypointY; - } - } else { - if (KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints === 0) { - // Go back to the cell's bed - let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - KinkyDungeonJailGuard().NextJailLeashTourWaypointX = nearestJail.x; - KinkyDungeonJailGuard().NextJailLeashTourWaypointY = nearestJail.y; - KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().NextJailLeashTourWaypointX; - KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().NextJailLeashTourWaypointY; - } else { - // Get a random next waypoint in an acceptable range outside of the cell - let randomPoint = KinkyDungeonJailGetLeashPoint(xx, yy, KinkyDungeonJailGuard()); - KinkyDungeonJailGuard().NextJailLeashTourWaypointX = randomPoint.x; - KinkyDungeonJailGuard().NextJailLeashTourWaypointY = randomPoint.y; - KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().NextJailLeashTourWaypointX; - KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().NextJailLeashTourWaypointY; - } - } -} - -function KinkyDungeonJailGetLeashPoint(xx, yy, enemy) { - let randomPoint = { x: xx, y: yy }; - for(let i = 0; i < 40; ++i) { - let candidatePoint = KinkyDungeonGetRandomEnemyPoint(true, false, enemy); - if (candidatePoint) { - let distanceFromCell = Math.sqrt((xx - candidatePoint.x) * (xx - candidatePoint.x) + (yy - candidatePoint.y) * (yy - candidatePoint.y)); - if (distanceFromCell > KinkyDungeonJailLeash * 2 && distanceFromCell < KinkyDungeonJailLeash * 6) { - randomPoint = candidatePoint; - break; - } - } - } - return randomPoint; -} - -/** - * @param {boolean} [any] - * @param {boolean} [qualified] - Makes sure the player is qualified - * @param {string[]} [filter] - * @returns {boolean} - Returns if the player is inside the nearest jail cell - */ -function KinkyDungeonPlayerInCell(any, qualified, filter) { - if (!filter && KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)?.Jail) { - return true; - } - let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, filter, any, qualified); - if (!nearestJail || nearestJail.type != "jail") return false; - return KDistChebyshev(KinkyDungeonPlayerEntity.x - nearestJail.x, KinkyDungeonPlayerEntity.y - nearestJail.y) < 2; - //return (Math.abs(KinkyDungeonPlayerEntity.x - KinkyDungeonStartPosition.x) < KinkyDungeonJailLeashX - 1 && Math.abs(KinkyDungeonPlayerEntity.y - KinkyDungeonStartPosition.y) <= KinkyDungeonJailLeash); -} - -function KinkyDungeonPointInCell(x, y) { - let nearestJail = KinkyDungeonNearestJailPoint(x, y); - if (!nearestJail) return false; - return KDistChebyshev(x - nearestJail.x, y - nearestJail.y) < 2; - //return (Math.abs(x - KinkyDungeonStartPosition.x) < KinkyDungeonJailLeashX - 1 && Math.abs(y - KinkyDungeonStartPosition.y) <= KinkyDungeonJailLeash); -} - -function KinkyDungeonPassOut(noteleport) { - KDDefeatedPlayerTick(); - KDBreakTether(); - KDGameData.KinkyDungeonLeashedPlayer = 0; - KinkyDungeonBlindLevel = 6; - KinkyDungeonStatBlind = 10; - KinkyDungeonUpdateLightGrid = true; - KDGameData.AlertTimer = 0; - KinkyDungeonRemoveBuffsWithTag(KinkyDungeonPlayerEntity, ["passout"]); - KinkyDungeonSendEvent("passout", {}); - - KinkyDungeonStripInventory(false); - - KinkyDungeonSetDress("Bikini", "Bikini"); - KinkyDungeonDressPlayer(); - - KinkyDungeonChangeStamina(-100); - KinkyDungeonChangeMana(-100); - KinkyDungeonChangeDistraction(-100); - - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonPassOut"), "#ff0000", 5); - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonPassOut2"), "#ff0000", 5); - - - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/StoneDoor_Close.ogg"); - - KDGameData.JailKey = false; - KDResetAllAggro(); - KinkyDungeonSaveGame(); - - //if (KinkyDungeonMapGet(nearestJail.x, nearestJail.y) != "B") { - // KinkyDungeonCreateMap(params, MiniGameKinkyDungeonLevel); - //} else { - if (!noteleport) { - let point = KinkyDungeonGetRandomEnemyPoint(true, false, undefined); - if (point) { - KDMovePlayer(point.x, point.y, false); - } - } - - - for (let e of KinkyDungeonEntities) { - if (e.hostile < 9000) e.hostile = 0; - if (e.vp > 0) e.vp = 0; - if (e.aware) e.aware = false; - if (e.maxlifetime && e.maxlifetime < 9000) e.lifetime = 0; - KDExpireFlags(e); - } - - KinkyDungeonLoseJailKeys(); - KinkyDungeonSlowMoveTurns = 10; -} - -function KDGetJailDoor(x, y) { - let point = KinkyDungeonNearestJailPoint(x, y); - if (point) { - x = point.x; - y = point.y; - } - x += KinkyDungeonJailLeashX - 1; - return {tile: KinkyDungeonTilesGet((x) + "," + y), x: x, y: y}; -} - -function KDDefeatedPlayerTick() { - KinkyDungeonSetFlag("playerDefeated", 1); -} - -function KDEnterDollTerminal(willing, cancelDialogue = true) { - KinkyDungeonSetFlag("refusedShopkeeperRescue", 5); // To prevent spawning instantly - KDGameData.PrisonerState = 'jail'; - KDGameData.RoomType = "DollRoom"; // We do a tunnel every other room - KDGameData.MapMod = ""; // Reset the map mod - if (cancelDialogue) KDGameData.CurrentDialog = ""; - let params = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]]; - KDGameData.DollRoomCount = 0; - KinkyDungeonCreateMap(params, MiniGameKinkyDungeonLevel); - - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).removePrison && (!KinkyDungeonStatsChoice.get("KinkyPrison") || KDRestraint(inv).removeOnLeash || KDRestraint(inv).freeze || KDRestraint(inv).immobile)) { - KinkyDungeonRemoveRestraint(KDRestraint(inv).Group, false); - } - } - - if (!willing) { - let defeat_outfit = "DollSuit"; - if (KinkyDungeonPlayerTags.has("Cyber")) defeat_outfit = "CyberDoll"; - if (KinkyDungeonStatsChoice.has("KeepOutfit")) defeat_outfit = "Default"; - - KinkyDungeonSetDress(defeat_outfit, defeat_outfit); - } - - KinkyDungeonDressPlayer(); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/StoneDoor_Close.ogg"); - - KDGameData.JailKey = false; - - KDMovePlayer(Math.floor(KinkyDungeonGridWidth/2), Math.floor(KinkyDungeonGridHeight/2), false); - - KinkyDungeonLoseJailKeys(); - KDResetAllAggro(); - - KinkyDungeonSaveGame(); -} - -function KinkyDungeonDefeat(PutInJail) { - KinkyDungeonInterruptSleep(); - - if (KinkyDungeonTempWait) - KDDisableAutoWait(); - - KDDefeatedPlayerTick(); - KDBreakTether(); - KDGameData.CurrentDialog = ""; - KDGameData.CurrentDialogStage = ""; - KDGameData.KinkyDungeonLeashedPlayer = 0; - if (KinkyDungeonFlags.get("JailIntro")) - KinkyDungeonSetFlag("JailRepeat", -1); - KinkyDungeonBlindLevel = 3; - KinkyDungeonStatBlind = 3; - KinkyDungeonUpdateLightGrid = true; - if (!KDGameData.TimesJailed) KDGameData.TimesJailed = 1; - else KDGameData.TimesJailed += 1; - KDGameData.JailTurns = 0; - //if (PutInJail) - // KDGameData.PriorJailbreaks = 0; - KDGameData.PrisonerState = "jail"; - KDGameData.AlertTimer = 0; - let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - if (!nearestJail) { - nearestJail = Object.assign({type: "jail", radius: 1}, KinkyDungeonStartPosition); - } - KDSendStatus('jailed'); - KDSendEvent('jail'); - KDGameData.WarningLevel = 0; - KDGameData.AncientEnergyLevel = 0; - KDGameData.JailRemoveRestraintsTimer = 0; - //MiniGameKinkyDungeonLevel = Math.min(MiniGameKinkyDungeonLevel, Math.max(Math.floor(MiniGameKinkyDungeonLevel/10)*10, MiniGameKinkyDungeonLevel - KinkyDungeonSpawnJailers + KinkyDungeonSpawnJailersMax - 1)); - KinkyDungeonSendEvent("defeat", {}); - - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).removePrison && (!KinkyDungeonStatsChoice.get("KinkyPrison") || KDRestraint(inv).removeOnLeash || KDRestraint(inv).freeze)) { - KinkyDungeonRemoveRestraint(KDRestraint(inv).Group, false); - } - } - KDGameData.KinkyDungeonPrisonReduction = 0; - //let firstTime = KDGameData.KinkyDungeonSpawnJailersMax == 0; - KDGameData.KinkyDungeonGuardSpawnTimer = 4 + Math.floor(KDRandom() * (KDGameData.KinkyDungeonGuardSpawnTimerMax - KDGameData.KinkyDungeonGuardSpawnTimerMin)); - KDGameData.KinkyDungeonSpawnJailersMax = 2; - if (KinkyDungeonGoddessRep.Prisoner) KDGameData.KinkyDungeonSpawnJailersMax += Math.round(6 * (KinkyDungeonGoddessRep.Prisoner + 50)/100); - //let securityBoost = (firstTime) ? 0 : Math.max(2, Math.ceil(4 * (KDGameData.KinkyDungeonSpawnJailersMax - KDGameData.KinkyDungeonSpawnJailers + 1)/KDGameData.KinkyDungeonSpawnJailersMax)); - - KinkyDungeonStatBlind = 3; - - //MiniGameKinkyDungeonLevel = Math.floor((MiniGameKinkyDungeonLevel + Math.max(0, KinkyDungeonSpawnJailersMax - KinkyDungeonSpawnJailers))/5)*5; - //MiniGameKinkyDungeonLevel = Math.floor(MiniGameKinkyDungeonLevel/2)*2; - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonLeashed"), "#ff0000", 3); - if (!KinkyDungeonJailedOnce) { - KinkyDungeonJailedOnce = true; - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonLeashed2"), "#ff0000", 3); - } - let params = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]]; - KDGameData.KinkyDungeonSpawnJailers = KDGameData.KinkyDungeonSpawnJailersMax; - let defeat_outfit = params.defeat_outfit; - // Handle special cases - let collar = KinkyDungeonGetRestraintItem("ItemNeck"); - if (collar && KDRestraint(collar)) { - if (KDRestraint(collar).name == "DragonCollar") defeat_outfit = "Dragon"; - if (KDRestraint(collar).name == "MaidCollar") defeat_outfit = "Maid"; - if (KDRestraint(collar).name == "ExpCollar") defeat_outfit = "BlueSuitPrison"; - if (KDRestraint(collar).name == "WolfCollar") defeat_outfit = "Wolfgirl"; - if (KDRestraint(collar).name == "MithrilCollar") defeat_outfit = "Elven"; - if (KDRestraint(collar).name == "ObsidianCollar") defeat_outfit = "Obsidian"; - } - if (KinkyDungeonStatsChoice.has("KeepOutfit")) defeat_outfit = "Default"; - - KinkyDungeonSetDress(defeat_outfit, "JailUniform"); - KinkyDungeonDressPlayer(); - KinkyDungeonStripInventory(true); - - if (defeat_outfit != params.defeat_outfit) { - if (!KinkyDungeonInventoryGet(defeat_outfit)) KinkyDungeonInventoryAdd({name: defeat_outfit, type: Outfit, id: KinkyDungeonGetItemID()}); - } else if (!KinkyDungeonInventoryGet("JailUniform")) KinkyDungeonInventoryAdd({name: "JailUniform", type: Outfit, id: KinkyDungeonGetItemID()}); - - //KinkyDungeonChangeRep("Ghost", 1 + Math.round(KinkyDungeonSpawnJailers/2)); - //KinkyDungeonChangeRep("Prisoner", securityBoost); // Each time you get caught, security increases... - - KinkyDungeonDressPlayer(); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/StoneDoor_Close.ogg"); - - KDGameData.JailKey = false; - KinkyDungeonSaveGame(); - - if (PutInJail) { - KDGameData.RoomType = "Jail"; // We do a tunnel every other room - KDGameData.MapMod = ""; // Reset the map mod - KinkyDungeonCreateMap(params, MiniGameKinkyDungeonLevel); - KinkyDungeonSetFlag("LeashToPrison", 0); - - nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - - } - - KDMovePlayer(nearestJail.x + (nearestJail.direction?.x || 0), nearestJail.y + (nearestJail.direction?.y || 0), false); - if (nearestJail.direction) { - KinkyDungeonSetFlag("conveyed", 1); - } - if (nearestJail.restraint) { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(nearestJail.restraint), MiniGameKinkyDungeonLevel, false, undefined); - } - if (nearestJail.restrainttags) { - let restraint = KinkyDungeonGetRestraint({tags: nearestJail.restrainttags}, MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], false, undefined); - if (restraint) - KinkyDungeonAddRestraintIfWeaker(restraint, MiniGameKinkyDungeonLevel, false, undefined); - } - - KinkyDungeonLoseJailKeys(); - - let leash = KinkyDungeonGetRestraintItem("ItemNeckRestraints"); - if (leash && (leash.tx || leash.ty)) { - leash.tx = undefined; - leash.ty = undefined; - } - KDGameData.KinkyDungeonSpawnJailers = KDGameData.KinkyDungeonSpawnJailersMax - 1; - - // Lock all jail doors - for (let X = 1; X < KinkyDungeonGridWidth - 1; X++) - for (let Y = 1; Y < KinkyDungeonGridHeight - 1; Y++) { - let tile = KinkyDungeonTilesGet(X + "," + Y); - if (tile && tile.Jail && tile.ReLock && (KinkyDungeonMapGet(X, Y) == 'd' || KinkyDungeonMapGet(X, Y) == 'D')) { - KinkyDungeonMapSet(X, Y, 'D'); - if (tile && !tile.Lock) { - tile.Lock = "Red"; - KDUpdateDoorNavMap(); - } - } - } - - KDKickEnemies(nearestJail); - KDResetAllAggro(); -} - -/** - * - * @param {entity} enemy - * @returns {boolean} - */ -function KDEnemyIsTemporary(enemy) { - return enemy.Enemy.tags.temporary || (enemy.lifetime > 0); -} - -/** Kicks enemies away, and also out of offlimits zones if they are aware */ -function KDKickEnemies(nearestJail) { - let enemies = []; - for (let e of KinkyDungeonEntities) { - if (!e.Enemy.tags.temporary) { - if ((e.x == nearestJail.x && e.y == nearestJail.y) || (!e.Enemy.tags.prisoner && !e.Enemy.tags.peaceful && !KDEnemyHasFlag(e, "imprisoned"))) { - if (KDistChebyshev(e.x - nearestJail.x, e.y - nearestJail.y) <= 4 || (e.aware || e.vp > 0.01 || e.aggro > 0)) { - let p = KinkyDungeonGetRandomEnemyPoint(true); - if (p) { - e.x = p.x; - e.y = p.y; - e.path = undefined; - e.gx = e.x; - e.gy = e.y; - } - } - - - if (e.boundLevel && e.boundLevel < 9000) e.boundLevel = 0; - } - if (e.hostile < 9000) e.hostile = 0; - KDExpireFlags(e); - KDResetIntent(e, {}); - enemies.push(e); - } - } - KinkyDungeonEntities = enemies; - KDUpdateEnemyCache = true; -} - -function KDResetAllIntents() { - for (let e of KinkyDungeonEntities) { - if (e.IntentAction && !KDIntentEvents[e.IntentAction].noMassReset) - KDResetIntent(e); - } -} -function KDResetAllAggro() { - for (let e of KinkyDungeonEntities) { - if (e.hostile && !KDIntentEvents[e.IntentAction]?.noMassReset) - e.hostile = 0; - } -} - -/** - * Moves an enemy to a random position on the map - * @param {entity} e - */ -function KDKickEnemy(e) { - if (!e.Enemy.tags.temporary) { - if (!e.Enemy.tags.prisoner && !KDEnemyHasFlag(e, "imprisoned")) { - let p = KinkyDungeonGetRandomEnemyPoint(true); - if (p) { - e.x = p.x; - e.y = p.y; - e.path = undefined; - e.gx = e.x; - e.gy = e.y; - } - - - if (e.boundLevel && e.boundLevel < 9000) e.boundLevel = 0; - } - if (e.hostile < 9000) e.hostile = 0; - KDExpireFlags(e); - KDResetIntent(e, {}); - } - KDClearItems(e); -} - -/** - * Moves an enemy to a random position on the map - * @param {entity} e - */ -function KDKickEnemyLocal(e) { - let point = KinkyDungeonGetNearbyPoint(e.x, e.y, true, undefined, true, true); - if (point) { - KDMoveEntity(e, point.x, point.y, false); - } -} - -function KinkyDungeonStripInventory(KeepPicks) { - KinkyDungeonRedKeys = 0; - KinkyDungeonBlueKeys = 0; - KinkyDungeonLockpicks = KeepPicks ? (Math.min(Math.max(0, Math.round(3 * (1 - (KinkyDungeonGoddessRep.Prisoner + 50)/100))), KinkyDungeonLockpicks)) : 0; - - let newInv = KinkyDungeonInventory.get(Restraint); - let HasBound = false; - let boundWeapons = []; - if (HasBound) { - // TODO add bound weapons here - } - KinkyDungeonAddLostItems(KinkyDungeonFullInventory(), HasBound); - KDInitInventory(); - KinkyDungeonInventory.set(Restraint, newInv); - KinkyDungeonInventoryAddWeapon("Unarmed"); - KDSetWeapon(null, true); - for (let b of boundWeapons) { - KinkyDungeonInventoryAddWeapon(b); - } -} - -function KDExpireFlags(enemy) { - if (enemy.flags) { - for (let f of Object.entries(enemy.flags)) { - if (f[1] > 0 && f[1] < 9000) enemy.flags[f[0]] = 0; - } - } -} - -/** - * Gets the jail outfit of the guard, or using overrideTags instead of the guard's taggs - * @param {string[]} [overrideTags] - * @param {boolean} [requireJail] - * @param {boolean} [requireParole] - * @returns {{Name: string, Level: number}[]} - */ -function KDGetJailRestraints(overrideTags, requireJail, requireParole) { - let restraints = []; - //let pris = {}; - let guard = KinkyDungeonJailGuard(); - let tags = overrideTags ? overrideTags : []; - if (!overrideTags) { - if (!guard) tags.push("jailer"); - else { - for (let t of Object.keys(KinkyDungeonJailGuard().Enemy.tags)) { - if (KDJailOutfits[t] && (!requireJail || KDJailOutfits[t].jail) && (!requireParole || KDJailOutfits[t].parole)) tags.push(t); - } - } - } - - let newtags = []; - - for (let t of tags) { - newtags.push(t); - } - - for (let t of tags) { - let tag = KDJailOutfits[t]; - if (tag.overridelowerpriority) { - // Go over all tags and remove those with lower priority - let pri = tag.priority; - for (let tt of newtags) { - let tag2 = KDJailOutfits[tt]; - if (tag2.priority < pri) newtags.splice(newtags.indexOf(tt), 1); - } - } - } - - tags = newtags; - - for (let t of tags) { - for (let r of KDJailOutfits[t].restraints) { - //let restraint = KinkyDungeonRestraintsCache.get(r.Name); - //if (restraint && (!pris[restraint.Group] || r.priority > pris[restraint.Group])) { - restraints.push(r); - //pris[restraint.Group] = r.priority; - //} - } - } - - return restraints; -} \ No newline at end of file diff --git a/Game/KinkyDungeonJailList.js b/Game/KinkyDungeonJailList.js deleted file mode 100644 index 5f5d4a914..000000000 --- a/Game/KinkyDungeonJailList.js +++ /dev/null @@ -1,596 +0,0 @@ -"use strict"; - -/** - * @type {Record number, trigger: (guard: any, xx: any, yy: any) => void}>} - */ -let KDJailEvents = { - "spawnGuard": { - // Determines the weight - weight: (guard, xx, yy) => { - return 70; - }, - // Occurs when the jail event triggers - trigger: (g, xx, yy) => { - // Allow the player to sleep 150 turns after the guard shows up - if (KinkyDungeonFlags.get("slept") == -1) { - KinkyDungeonSetFlag("slept", 0); - KinkyDungeonSetFlag("slept", 150); - } - // Jail tag - let jt = KDGameData.JailFaction?.length > 0 ? KinkyDungeonFactionTag[[KDGameData.JailFaction[Math.floor(KDRandom() * KDGameData.JailFaction.length)]]] : "jailer"; - let Enemy = KinkyDungeonGetEnemy(["jailGuard", jt], MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', [jt, "jailer"], false, undefined, ["gagged"]); - if (!Enemy) { - Enemy = KinkyDungeonGetEnemy(["jailGuard", jt], MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', [jt, "jailer"], false, undefined, ["gagged"]); - if (!Enemy) { - jt = "genericJailer"; - Enemy = KinkyDungeonGetEnemy(["jailGuard", jt], MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', [jt, "jailer"]); - } - } - //KinkyDungeonGetEnemyByName((KinkyDungeonGoddessRep.Prisoner < 0 ? "Guard" : "GuardHeavy")); - let guard = {summoned: true, Enemy: Enemy, id: KinkyDungeonGetEnemyID(), - x:xx, y:yy, gx: xx - 2, gy: yy, CurrentAction: "jailWander", keys: true, AI: "guard", - hp: (Enemy && Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0}; - - if (!KinkyDungeonFlags.get("JailIntro")) { - KinkyDungeonSetFlag("JailIntro", -1); - KDStartDialog("PrisonIntro", guard.Enemy.name, true, ""); - } else if (KinkyDungeonFlags.get("JailRepeat")) { - KinkyDungeonSetFlag("JailRepeat", 0); - KDStartDialog("PrisonRepeat", guard.Enemy.name, true, ""); - } - - if (KinkyDungeonTilesGet((xx-1) + "," + yy) && KinkyDungeonTilesGet((xx-1) + "," + yy).Type == "Door") { - KinkyDungeonTilesGet((xx-1) + "," + yy).Lock = undefined; - } - KDGameData.KinkyDungeonJailGuard = guard.id; - if (KinkyDungeonEnemyAt(guard.x, guard.y)) KDKickEnemy(KinkyDungeonEnemyAt(guard.x, guard.y)); - KDAddEntity(guard); - if (KinkyDungeonVisionGet(guard.x, guard.y)) - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonGuardAppear").replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "white", 6); - KDGameData.KinkyDungeonGuardTimer = KDGameData.KinkyDungeonGuardTimerMax; - KDGameData.KinkyDungeonGuardSpawnTimer = KDGameData.KinkyDungeonGuardSpawnTimerMin + Math.floor(KDRandom() * (KDGameData.KinkyDungeonGuardSpawnTimerMax - KDGameData.KinkyDungeonGuardSpawnTimerMin)); - }, - }, - "spawnRescue": { - // Determines the weight - weight: (guard, xx, yy) => { - return KDCanSpawnShopkeeper() ? 100 : 0; - }, - // Occurs when the jail event triggers - trigger: (g, xx, yy) => { - KDStartDialog("ShopkeeperRescue", "ShopkeeperRescue", true, "", undefined); - }, - }, -}; - - -for (let rescue of Object.entries(KDPrisonRescues)) { - KDJailEvents[rescue[0]] = { - // Determines the weight - weight: (guard, xx, yy) => { - if (guard) return 0; - if (KinkyDungeonStatsChoice.get("norescueMode")) return 0; - if (KDGameData.JailTurns <= 70 || KDFactionRelation("Player", rescue[1].faction) < 0.09) return 0; - return 100 * Math.min(0.05, Math.max(0.1, 0.35 * KDFactionRelation("Player", rescue[1].faction)) - 0.005 * (KDGameData.PriorJailbreaks ? (KDGameData.PriorJailbreaks - (KDGameData.PriorJailbreaksDecay || 0)) : 0)); - }, - // Occurs when the jail event triggers - trigger: (guard, xx, yy) => { - KDStartDialog(rescue[0], rescue[1].speaker, true, "", undefined); - }, - }; -} - -/** - * - * @param {boolean} [override] - Override jailing requirement - * @returns {boolean} - */ -function KDCanSpawnShopkeeper(override) { - return (KinkyDungeonStatsChoice.get("easyMode") && (override || (KinkyDungeonFlags.get("JailIntro") && !KinkyDungeonFlags.get("JailRepeat"))) && !KinkyDungeonFlags.get("refusedShopkeeperRescue") && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)); -} - -// if (KinkyDungeonGoddessRep.Prisoner) securityLevel = Math.max(0, KinkyDungeonGoddessRep.Prisoner + 50); - -let KDGuardActions = { - "jailWander": { - weight: (guard, xx, yy) => { - return 100; - }, - assignable: (guard, xx, yy) => { // Can assign a new behavior on top of this one - return KDistChebyshev(guard.gx - guard.x, guard.gy - guard.y) < 1.5; - }, - assign: (guard, xx, yy) => { - - }, - handle: (guard, xx, yy) => { - // Random meandering about the cell, sometimes stopping near the player - if (KDRandom() < 0.2) { - guard.gx = xx - 2; - if (KDRandom() < 0.5) - guard.gy = yy + Math.round(KDRandom() * KinkyDungeonJailLeash * 2 - KinkyDungeonJailLeash); - else - guard.gy = KinkyDungeonPlayerEntity.y; - } - KDGameData.GuardApplyTime = 0; - }, - }, - "release": { - weight: (guard, xx, yy) => { - let missingJailUniform = KinkyDungeonMissingJailUniform(); - return (KinkyDungeonCheckRelease() >= 0 && KinkyDungeonLockableItems().length == 0 && missingJailUniform.length < 1) ? 1000 : 0; - }, - assign: (guard, xx, yy) => { - KinkyDungeonInterruptSleep(); - if (KinkyDungeonGoddessRep.Prisoner >= KDSecurityLevelHiSec && KDGameData.RoomType != "Jail" && (!(KDGameData.JailFaction?.length > 0) || KDFactionRelation("Player", KDGameData.JailFaction[0]) < 0.4)) { - KDStartDialog("JailerHiSec", guard.Enemy.name, true, "", guard); - } else { - KinkyDungeonSendDialogue(guard, TextGet("KinkyDungeonRemindJailRelease" + KinkyDungeonCheckRelease()).replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "#ffff00", 4, 8); - KDGameData.PrisonerState = 'parole'; - guard.CurrentAction = "jailWander"; - // Unlock all jail doors - for (let T of Object.values(KinkyDungeonTiles)) { - if (T.Lock && T.Jail) T.Lock = undefined; - if (T.Type == "Lock") T.Type = undefined; - } - } - }, - handle: (guard, xx, yy) => { - - }, - }, - "jailTease": { - weight: (guard, xx, yy) => { - return 10 + (KinkyDungeonGoddessRep.Ghost + 50); - }, - assign: (guard, xx, yy) => { - // Always a random chance to tease - guard.CurrentAction = "jailTease"; - }, - handle: (guard, xx, yy, delta) => { - let playerHasVibrator = Array.from(KinkyDungeonAllRestraint()).some(i => KDRestraint(i).allowRemote); - guard.gx = guard.x; - guard.gy = guard.y; - if (playerHasVibrator) { - let extraCharge = Math.round(2 + (KinkyDungeonGoddessRep.Ghost + 50) * KDRandom() * 0.15); - KinkyDungeonSendEvent("remoteVibe", {enemy: guard.Enemy.name, power: extraCharge, overcharge: true, noSound: false}); - } else if (guard.Enemy.dmgType === "grope" || guard.Enemy.dmgType === "tickle") { - let touchesPlayer = KinkyDungeonCheckLOS(KinkyDungeonJailGuard(), KinkyDungeonPlayerEntity, KDistChebyshev(guard.x - KinkyDungeonPlayerEntity.x, guard.y - KinkyDungeonPlayerEntity.y), 1.5, false, false); - if (touchesPlayer) { - let dmg = KinkyDungeonDealDamage({damage: guard.Enemy.power * 0.1, type: guard.Enemy.dmgType}, undefined, undefined, true); - if (dmg && dmg.string) - KinkyDungeonSendTextMessage(5, TextGet("Attack" + guard.Enemy.name).replace("DamageTaken", dmg.string), "yellow", 3); - } else { - guard.gx = KinkyDungeonPlayerEntity.x; - guard.gy = KinkyDungeonPlayerEntity.y; - } - } - if (KDRandom() < 0.02 || (KinkyDungeonStatStamina < 10 && KDRandom() < 0.1)) - guard.CurrentAction = "jailWander"; - } - }, - "bindings": { - weight: (guard, xx, yy) => { - let missingJailUniform = KinkyDungeonMissingJailUniform(); - let tooMuchRestraint = KinkyDungeonTooMuchRestraint(); - let lockableRestraint = KinkyDungeonLockableItems(); - - return ( - lockableRestraint.length > 0 - || missingJailUniform.length > 0 - || (tooMuchRestraint.length > 0 && KDGameData.JailRemoveRestraintsTimer > KinkyDungeonJailRemoveRestraintsTimerMin)) ? (100 + (missingJailUniform.length > 0 ? 100 : 0)) : 0; - }, - assign: (guard, xx, yy) => { - let missingJailUniform = KinkyDungeonMissingJailUniform(); - let tooMuchRestraint = KinkyDungeonTooMuchRestraint(); - let lockableRestraint = KinkyDungeonLockableItems(); - - if (missingJailUniform.length > 0 || KDRandom() < 0.2) { - if (tooMuchRestraint.length > 0 && (KDRandom() < 0.5 || missingJailUniform.length < 1) && KDGameData.JailRemoveRestraintsTimer > KinkyDungeonJailRemoveRestraintsTimerMin) { - let group = ""; - if (tooMuchRestraint.includes("ItemMouth3")) group = "ItemMouth3"; - else if (tooMuchRestraint.includes("ItemMouth2")) group = "ItemMouth2"; - else if (tooMuchRestraint.includes("ItemMouth")) group = "ItemMouth"; - else group = tooMuchRestraint[Math.floor(tooMuchRestraint.length * KDRandom())]; - if (group) { - guard.CurrentAction = "jailRemoveRestraints"; - guard.CurrentRestraintSwapGroup = group; - } - - KinkyDungeonSendDialogue(guard, TextGet("KinkyDungeonJailerRemove").replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "#ffff00", 4, 3); - } else if (missingJailUniform.length > 0) { - let group = ""; - if (missingJailUniform.includes("ItemMouth3")) group = "ItemMouth3"; - else if (missingJailUniform.includes("ItemMouth2")) group = "ItemMouth2"; - else if (missingJailUniform.includes("ItemMouth")) group = "ItemMouth"; - else group = missingJailUniform[Math.floor(missingJailUniform.length * KDRandom())]; - if (group) { - guard.CurrentAction = "jailAddRestraints"; - guard.CurrentRestraintSwapGroup = group; - } - - KinkyDungeonSendDialogue(guard, TextGet("KinkyDungeonJailerAdd").replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "#ffff00", 4, 3); - } - } else if (lockableRestraint.length > 0) { - let group = ""; - if (lockableRestraint.includes("ItemMouth3")) group = "ItemMouth3"; - else if (lockableRestraint.includes("ItemMouth2")) group = "ItemMouth2"; - else if (lockableRestraint.includes("ItemMouth")) group = "ItemMouth"; - else group = lockableRestraint[Math.floor(lockableRestraint.length * KDRandom())]; - if (group) { - guard.CurrentAction = "jailLockRestraints"; - guard.CurrentRestraintSwapGroup = group; - } - - KinkyDungeonSendDialogue(guard, TextGet("KinkyDungeonJailerLock").replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "#ffff00", 4, 3); - } - }, - handle: (guard, xx, yy, delta) => { - // Dummy, this one assigns to a different style - }, - }, - "jailRemoveRestraints": { - weight: (guard, xx, yy) => { - return 0; // Assigned by JailBindings - }, - assign: (guard, xx, yy) => { - // Assigned by JailBindings - }, - handle: (guard, xx, yy, delta) => { - let applyTime = 2; - let playerDist = Math.sqrt((guard.x - KinkyDungeonPlayerEntity.x)*(guard.x - KinkyDungeonPlayerEntity.x) + (guard.y - KinkyDungeonPlayerEntity.y)*(guard.y - KinkyDungeonPlayerEntity.y)); - let touchesPlayer = KinkyDungeonCheckLOS(guard, KinkyDungeonPlayerEntity, playerDist, 1.5, false, false); - if (touchesPlayer) { - KDGameData.KinkyDungeonGuardTimer = Math.max(KDGameData.KinkyDungeonGuardTimer, 2); - let oldRestraintItem = KinkyDungeonGetRestraintItem(guard.CurrentRestraintSwapGroup); - if (KDGameData.GuardApplyTime > applyTime) { - if (oldRestraintItem && KDRestraint(oldRestraintItem) && !KDRestraint(oldRestraintItem).noJailRemove) { - KinkyDungeonRemoveRestraint(KDRestraint(oldRestraintItem).Group, false, false, false); - let msg = TextGet("KinkyDungeonRemoveRestraints") - .replace("EnemyName", TextGet("Name" + guard.Enemy.name)); - //let msg = TextGet("Attack" + guard.Enemy.name + "RemoveRestraints"); - if (oldRestraintItem) msg = msg.replace("OldRestraintName", TextGet("Restraint"+oldRestraintItem.name)); - KinkyDungeonSendTextMessage(5, msg, "yellow", 1); - } - guard.CurrentAction = "jailWander"; - guard.gx = guard.x; - guard.gy = guard.y; - KDGameData.GuardApplyTime = 0; - } else if (oldRestraintItem) { - KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonJailerStartRemoving") - .replace("EnemyName", TextGet("Name" + guard.Enemy.name)) - .replace("RestraintName", TextGet("Restraint" + oldRestraintItem.name)), "yellow", 2, true); - KDGameData.GuardApplyTime += delta; - } else { - guard.CurrentAction = "jailWander"; - guard.gx = guard.x; - guard.gy = guard.y; - KDGameData.GuardApplyTime = 0; - } - } else { - KDGameData.KinkyDungeonGuardTimer = Math.max(KDGameData.KinkyDungeonGuardTimer, 2); - KDGameData.GuardApplyTime = 0; - guard.gx = KinkyDungeonPlayerEntity.x; - guard.gy = KinkyDungeonPlayerEntity.y; - } - }, - }, - "jailAddRestraints": { - weight: (guard, xx, yy) => { - return 0; // Assigned by JailBindings - }, - assign: (guard, xx, yy) => { - // Assigned by JailBindings - }, - handle: (guard, xx, yy, delta) => { - let applyTime = 2; - let playerDist = Math.sqrt((guard.x - KinkyDungeonPlayerEntity.x)*(guard.x - KinkyDungeonPlayerEntity.x) + (guard.y - KinkyDungeonPlayerEntity.y)*(guard.y - KinkyDungeonPlayerEntity.y)); - let touchesPlayer = KinkyDungeonCheckLOS(guard, KinkyDungeonPlayerEntity, playerDist, 1.5, false, false); - if (touchesPlayer) { - KDGameData.KinkyDungeonGuardTimer = Math.max(KDGameData.KinkyDungeonGuardTimer, 7); - let newRestraint = KinkyDungeonGetJailRestraintForGroup(guard.CurrentRestraintSwapGroup); - if (KDGameData.GuardApplyTime > applyTime) { - if (newRestraint) { - let oldRestraintItem = KinkyDungeonGetRestraintItem(guard.CurrentRestraintSwapGroup); - let added = KinkyDungeonAddRestraintIfWeaker(newRestraint, 0, - true, undefined, undefined, undefined, undefined, KDGetFaction(KinkyDungeonJailGuard()), - KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, KinkyDungeonJailGuard()); - if (added) { - let restraintModification = oldRestraintItem ? "ChangeRestraints" : "AddRestraints"; - let msg = TextGet("KinkyDungeon" + restraintModification).replace("EnemyName", TextGet("Name" + guard.Enemy.name)); - if (oldRestraintItem) msg = msg.replace("OldRestraintName", TextGet("Restraint"+oldRestraintItem.name)); - msg = msg.replace("NewRestraintName", TextGet("Restraint"+newRestraint.name)); - KinkyDungeonSendTextMessage(5, msg, "yellow", 1); - } else - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonJailerCheck"), "yellow", 3, true); - } - guard.CurrentAction = "jailWander"; - guard.gx = guard.x; - guard.gy = guard.y; - KDGameData.GuardApplyTime = 0; - } else if (newRestraint) { - KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonJailerStartAdding") - .replace("RestraintName", TextGet("Restraint" + newRestraint.name)) - .replace("EnemyName", TextGet("Name" + guard.Enemy.name)), - "yellow", 2, true); - - KDGameData.GuardApplyTime += delta; - } - } else { - KDGameData.KinkyDungeonGuardTimer = Math.max(KDGameData.KinkyDungeonGuardTimer, 7); - KDGameData.GuardApplyTime = 0; - guard.gx = KinkyDungeonPlayerEntity.x; - guard.gy = KinkyDungeonPlayerEntity.y; - } - }, - }, - "jailLockRestraints": { - weight: (guard, xx, yy) => { - return 0; // Assigned by JailBindings - }, - assign: (guard, xx, yy) => { - // Assigned by JailBindings - }, - handle: (guard, xx, yy, delta) => { - let applyTime = 2; - let playerDist = Math.sqrt((guard.x - KinkyDungeonPlayerEntity.x)*(guard.x - KinkyDungeonPlayerEntity.x) + (guard.y - KinkyDungeonPlayerEntity.y)*(guard.y - KinkyDungeonPlayerEntity.y)); - let touchesPlayer = KinkyDungeonCheckLOS(guard, KinkyDungeonPlayerEntity, playerDist, 1.5, false, false); - if (touchesPlayer) { - - KDGameData.KinkyDungeonGuardTimer = Math.max(KDGameData.KinkyDungeonGuardTimer, 2); - let oldRestraintItem = KinkyDungeonGetRestraintItem(guard.CurrentRestraintSwapGroup); - if (KDGameData.GuardApplyTime > applyTime) { - if (oldRestraintItem && !oldRestraintItem.lock && KinkyDungeonIsLockable(KDRestraint(oldRestraintItem))) { - let lock = KinkyDungeonGenerateLock(true, MiniGameKinkyDungeonLevel, false); - KinkyDungeonLock(oldRestraintItem, lock); - let msg = TextGet("KinkyDungeonJailerFinishLocking") - .replace("EnemyName", TextGet("Name" + guard.Enemy.name)) - .replace("RestraintName", TextGet("Restraint"+oldRestraintItem.name)) - .replace("LockType", TextGet("Kinky" + lock + "Lock")); - KinkyDungeonSendTextMessage(5, msg, "yellow", 1); - } - guard.CurrentAction = "jailWander"; - guard.gx = guard.x; - guard.gy = guard.y; - KDGameData.GuardApplyTime = 0; - } else if (oldRestraintItem) { - KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonJailerStartLocking") - .replace("EnemyName", TextGet("Name" + guard.Enemy.name)) - .replace("RestraintName", TextGet("Restraint" + oldRestraintItem.name)), "yellow", 2, true); - KDGameData.GuardApplyTime += delta; - } else { - guard.CurrentAction = "jailWander"; - guard.gx = guard.x; - guard.gy = guard.y; - KDGameData.GuardApplyTime = 0; - } - } else { - KDGameData.KinkyDungeonGuardTimer = Math.max(KDGameData.KinkyDungeonGuardTimer, 2); - KDGameData.GuardApplyTime = 0; - guard.gx = KinkyDungeonPlayerEntity.x; - guard.gy = KinkyDungeonPlayerEntity.y; - } - }, - }, - "jailLeashTour": { - weight: (guard, xx, yy) => { - KDGameData.KinkyDungeonJailTourTimer = 0; - return (KDGameData.SleepTurns < 1 && KDGameData.KinkyDungeonJailTourTimer < 1 && KinkyDungeonGoddessRep.Ghost >= -45) ? (5 + Math.max(0, (50 + KinkyDungeonGoddessRep.Ghost)/5)) : 0; - }, - assign: (guard, xx, yy) => { - guard.RemainingJailLeashTourWaypoints = 2 + Math.ceil(KDRandom() * 4); - guard.CurrentAction = "jailLeashTour"; - guard.KinkyDungeonJailTourInfractions = 0; - KinkyDungeonInterruptSleep(); - let msg = TextGet("KinkyDungeonRemindJailTourStart").replace("EnemyName", TextGet("Name" + guard.Enemy.name)); - - KinkyDungeonSendDialogue(guard, msg, "#ffff00", 4, 9); - }, - handle: (guard, xx, yy, delta) => { - if (KDGameData.KinkyDungeonJailTourTimer > 0) { - KDGameData.KinkyDungeonJailTourTimer = Math.max(0, KDGameData.KinkyDungeonJailTourTimer - delta); - } - KinkyDungeonSetFlag("nojailbreak", 2); - KinkyDungeonSetFlag("noclosedoors", 2); - KinkyDungeonSetFlag("notickguardtimer", 7); - KinkyDungeonHandleLeashTour(xx, yy, "tour"); - }, - }, - "jailLeashTransfer": { - weight: (guard, xx, yy) => { - KDGameData.KinkyDungeonJailTourTimer = 0; - return (KDGameData.JailTurns > 30 && KinkyDungeonRandomJailPoint(["jail"], [KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)])) ? 5 : 0; - }, - assign: (guard, xx, yy) => { - guard.RemainingJailLeashTourWaypoints = 1; - guard.CurrentAction = "jailLeashTransfer"; - guard.KinkyDungeonJailTourInfractions = 0; - KinkyDungeonInterruptSleep(); - let msg = TextGet("KinkyDungeonRemindJailTourStartCell").replace("EnemyName", TextGet("Name" + guard.Enemy.name)); - - KinkyDungeonSendDialogue(guard, msg, "#ffff00", 4, 9); - }, - handle: (guard, xx, yy, delta) => { - if (KDGameData.KinkyDungeonJailTourTimer > 0) { - KDGameData.KinkyDungeonJailTourTimer = Math.max(0, KDGameData.KinkyDungeonJailTourTimer - delta); - } - KinkyDungeonSetFlag("nojailbreak", 2); - KinkyDungeonSetFlag("noclosedoors", 2); - KinkyDungeonSetFlag("notickguardtimer", 7); - KinkyDungeonHandleLeashTour(xx, yy, "transfer"); - }, - }, -}; - - -let KinkyDungeonJailRemoveRestraintsTimerMin = 90; -let KinkyDungeonJailedOnce = false; -let KDJailReleaseTurns = [ - {minSub: 0, releaseTurns: 250}, - {minSub: 5, releaseTurns: 140}, - {minSub: 40, releaseTurns: 80}, - {minSub: 90, releaseTurns: 40}, -]; - -let KDSecurityLevelHiSec = 0; - -/** - * @type {Record} -*/ -let KDJailOutfits = { - "jailer": { - overridelowerpriority: false, - priority: -1, - jail: true, - parole: false, - restraints: [ - {Name: "Stuffing", Level: 20}, - {Name: "TrapGag", Level: 20}, - {Name: "HighsecBallGag", Level: 50}, - {Name: "FeetShackles", Level: 5}, - {Name: "HighsecShackles", Level: 40}, - {Name: "LegShackles", Level: 15}, - {Name: "HighsecLegbinder", Level: 35}, - {Name: "WristShackles", Level: 0}, - {Name: "TrapArmbinder", Level: 40}, - {Name: "HighsecArmbinder", Level: 70}, - {Name: "PrisonBelt", Level: 30}, - {Name: "TrapPlug", Level: 30}, - {Name: "TrapPlug2", Level: 45}, - {Name: "TrapPlug3", Level: 60}, - {Name: "TrapPlug4", Level: 75}, - {Name: "TrapPlug5", Level: 90}, - {Name: "TrapBlindfold", Level: 90}, - {Name: "TrapBoots", Level: 60}, - ], - }, - "ropeRestraints": { - overridelowerpriority: false, - priority: 1, - jail: true, - parole: true, - restraints: [ - {Name: "RopeSnakeCuffs", Level: 0}, - {Name: "RopeSnakeArmsWrist", Level: 0}, - {Name: "RopeSnakeFeet", Level: 20}, - {Name: "RopeSnakeCrotch", Level: 10}, - {Name: "RopeSnakeLegs", Level: 30}, - {Name: "RopeSnakeHogtie", Level: 100}, - ], - }, - "latexRestraints": { - overridelowerpriority: false, - priority: 1, - jail: true, - parole: false, - restraints: [ - {Name: "LatexBoots", Level: 40}, - {Name: "LatexBallGag", Level: 0}, - {Name: "LatexCorset", Level: 65}, - {Name: "LatexLegbinder", Level: 80}, - {Name: "LatexArmbinder", Level: 30}, - {Name: "LatexStraitjacket", Level: 60}, - {Name: "LatexCatsuit", Level: 100}, - ], - }, - "wolfRestraints": { - overridelowerpriority: true, - priority: 2, - jail: true, - parole: false, - restraints: [ - {Name: "WolfCuffs", Level: 0}, - {Name: "WolfArmbinder", Level: 30}, - {Name: "WolfAnkleCuffs", Level: 10}, - {Name: "WolfHarness", Level: 20}, - {Name: "ControlHarness", Level: 80}, - {Name: "WolfBallGag", Level: 30}, - {Name: "WolfCollar", Level: 0}, - {Name: "WolfPanties", Level: 60}, - ], - }, - "expRestraints": { - overridelowerpriority: true, - priority: 2, - jail: true, - parole: false, - restraints: [ - {Name: "ExpArmbinder", Level: 0}, - {Name: "ExpArmbinderHarness", Level: 60}, - {Name: "ExpAnkleCuffs", Level: 30}, - {Name: "LatexBallGag", Level: 5}, - {Name: "ExpCollar", Level: 40}, - {Name: "ExpBoots", Level: 50}, - ], - }, - "dragonRestraints": { - overridelowerpriority: true, - priority: 2, - jail: true, - parole: false, - restraints: [ - {Name: "ScaleArmCuffs", Level: 0}, - {Name: "DragonStraps", Level: 20}, - {Name: "DragonLegCuffs", Level: 60}, - {Name: "DragonAnkleCuffs", Level: 10}, - {Name: "DragonBoots", Level: 90}, - {Name: "DragonBallGag", Level: 30}, - {Name: "DragonMuzzleGag", Level: 60}, - {Name: "DragonCollar", Level: 0}, - ], - }, - "kittyRestraints": { - overridelowerpriority: false, - priority: 2, - jail: true, - parole: true, - restraints: [ - {Name: "KittyPaws", Level: 0}, - {Name: "KittyGag", Level: 10}, - {Name: "KittyMuzzle", Level: 45}, - {Name: "KittyBlindfold", Level: 60}, - {Name: "KittySuit", Level: 80}, - {Name: "KittyPetSuit", Level: 100}, - ], - }, - "obsidianRestraints": { - overridelowerpriority: false, - priority: 2, - jail: true, - parole: false, - restraints: [ - {Name: "ObsidianArmCuffs", Level: 0}, - {Name: "ObsidianLegCuffs", Level: 60}, - {Name: "ObsidianAnkleCuffs", Level: 10}, - {Name: "ObsidianGag", Level: 30}, - {Name: "ObsidianCollar", Level: 0}, - ], - }, - "leatherRestraints": { - overridelowerpriority: false, - priority: 1, - jail: true, - parole: true, - restraints: [ - {Name: "LeatherArmCuffs", Level: 5}, - {Name: "SturdyLeatherBeltsArms", Level: 30}, - {Name: "SturdyLeatherBeltsLegs", Level: 80}, - {Name: "SturdyLeatherBeltsFeet", Level: 60}, - {Name: "TrapArmbinder", Level: 50}, - {Name: "TrapMittens", Level: 0}, - {Name: "TrapGag", Level: 10}, - {Name: "PanelGag", Level: 20}, - {Name: "TrapHarness", Level: 40}, - ], - }, - "dressRestraints": { - overridelowerpriority: false, - priority: 1, - jail: true, - parole: true, - restraints: [ - {Name: "BindingDress", Level: 0}, - {Name: "NippleClamps", Level: 60}, - {Name: "DressBra", Level: 60}, - ], - }, -}; \ No newline at end of file diff --git a/Game/KinkyDungeonLoot.js b/Game/KinkyDungeonLoot.js deleted file mode 100644 index d6937d06a..000000000 --- a/Game/KinkyDungeonLoot.js +++ /dev/null @@ -1,784 +0,0 @@ -"use strict"; - -/** @type {item[]} */ -let KinkyDungeonLostItems = []; -let KDTightRestraintsMod = 6; -let KDTightRestraintsMult = 2; - -/** - * @param {item[]} list - * @param {boolean} excludeBound - bound weapons, i.e. magic knives and weapons - */ -function KinkyDungeonAddLostItems(list, excludeBound) { - for (let item of list) { - let unique = true; - if (item.type && item.name == "Knife") unique = false; - for (let item2 of KinkyDungeonLostItems) { - if (item2.name == item.name) { - unique = false; - break; - } - } - if (unique && (!excludeBound || item.type != Weapon || (KDWeapon(item).magic))) { - KinkyDungeonLostItems.push(item); - if (item.type == Consumable) { - item.quantity = Math.min(item.quantity, 10); - } - } else if (!unique && item.type == Consumable && item.quantity) { - for (let item2 of KinkyDungeonLostItems) { - if (item2.name == item.name) { - item2.quantity = Math.min(item2.quantity + item.quantity, 10); - break; - } - } - } - } -} - -let cursedRestraintCache = { - -}; - - -// Determines if you get a good loot from a blue locked chest -let KinkyDungeonSpecialLoot = false; -let KinkyDungeonLockedLoot = false; - -function KinkyDungeonLoot(Level, Index, Type, roll, tile, returnOnly, noTrap) { - let lootWeightTotal = 0; - let lootWeights = []; - - let lootType = KinkyDungeonLootTable[Type]; - for (let loot of lootType) { - let effLevel = Level; - if (loot.trap && KinkyDungeonStatsChoice.has("TightRestraints")) { - effLevel *= KDTightRestraintsMult; - effLevel += KDTightRestraintsMod; - } - if ((effLevel >= loot.minLevel || KinkyDungeonNewGame > 0) && (loot.allFloors || loot.floors[Index])) { - let prereqs = true; - if (loot.arousalMode && !KinkyDungeonStatsChoice.get("arousalMode")) prereqs = false; - - if (loot.prerequisites) { - - let maxlevel = 999; - let minlevel = 0; - let SpellList = null; - if (prereqs && loot.prerequisites.includes("vibe") && KinkyDungeonPlayerTags.has("NoVibes")) prereqs = false; - if (prereqs && loot.prerequisites.includes("alreadyBelted") && KinkyDungeonChastityMult() < 0.9) prereqs = false; - if (prereqs && loot.prerequisites.includes("lowlevel")) maxlevel = 2; - if (prereqs && loot.prerequisites.includes("fewpick") && KinkyDungeonLockpicks > 3) prereqs = false; - if (prereqs && loot.prerequisites.includes("lowpotions") && ( - KinkyDungeonItemCount("PotionFrigid") + KinkyDungeonItemCount("PotionMana") + KinkyDungeonItemCount("PotionStamina") > 10 - )) prereqs = false; - if (prereqs && loot.prerequisites.includes("lowmanapotions") && ( - KinkyDungeonItemCount("PotionMana") > 20 - )) prereqs = false; - if (prereqs && loot.prerequisites.includes("lowwillpotions") && ( - KinkyDungeonItemCount("PotionWill") > 15 - )) prereqs = false; - if (prereqs && loot.prerequisites.includes("UnlearnedElements")) SpellList = KinkyDungeonSpellList.Elements; - if (prereqs && loot.prerequisites.includes("UnlearnedConjure")) SpellList = KinkyDungeonSpellList.Conjure; - if (prereqs && loot.prerequisites.includes("UnlearnedIllusion")) SpellList = KinkyDungeonSpellList.Illusion; - if (prereqs && loot.prerequisites.includes("NoBoltCutters") && KinkyDungeonInventoryGet("BoltCutters")) prereqs = false; - else if (prereqs && loot.prerequisites.includes("LostItems") && KinkyDungeonLostItems.length < 1) prereqs = false; - else if (prereqs && loot.prerequisites.includes("LightRestraint") && KinkyDungeonAllRestraint().length < 1) prereqs = false; - else if (prereqs && loot.prerequisites.includes("ModerateRestraint") && KinkyDungeonAllRestraint().length < 4 && !(!KinkyDungeonIsHandsBound() && !KinkyDungeonCanTalk() && KinkyDungeonSlowLevel < 1)) prereqs = false; - if (prereqs && loot.prerequisites.includes("pearlChest") && !KDPearlRequirement) prereqs = false; - - if (prereqs) - for (let prereq of loot.prerequisites) { - if (prereq.startsWith("Group_")) { - let group = prereq.substring(6); - let item = KinkyDungeonGetRestraintItem(group); - let power = item && KDRestraint(item) && KDRestraint(item).power ? KinkyDungeonRestraintPower(item) : 0; - if (power && (power >= loot.power || KDRestraint(item).enchanted)) { - prereqs = false; - break; - } - } - } - - if (SpellList != null && KinkyDungeonGetUnlearnedSpells(minlevel, maxlevel, SpellList).length == 0) { - prereqs = false; - } - } - if (KinkyDungeonGoddessRep.Ghost && loot.submissive && (KinkyDungeonGoddessRep.Ghost + 50 < loot.submissive)) prereqs = false; - if (loot.noweapon) { - for (let w of loot.noweapon) { - if (KinkyDungeonInventoryGet(w)) { - prereqs = false; - break; - } - } - } - if (loot.norestraint) { - for (let r of loot.norestraint) { - if (KinkyDungeonInventoryGet(r)) { - prereqs = false; - break; - } - } - } - // Check for cursed norestraint as well - if (loot.norestraintcursed) { - let id = loot.norestraintcursed + `${loot.curselevelmin || 0},${loot.curselevelmax || 0}`; - if (!cursedRestraintCache[id]) cursedRestraintCache[id] = [...KinkyDungeonGetCurses(loot.norestraintcursed, true, loot.curselevelmin, loot.curselevelmax)]; - for (let r of cursedRestraintCache[id]) { - if (KinkyDungeonInventoryGet(r)) { - prereqs = false; - break; - } - } - } - - if (prereqs) { - let weightMult = 1.0; - let weightBonus = 0; - if (loot.goddess) { - let grep = KinkyDungeonGoddessRep[loot.goddess]; - if (grep) { - weightBonus += loot.goddessWeight * grep/50; - } - } - if (loot.playerTags) - for (let tag in loot.playerTags) - if (KinkyDungeonPlayerTags.get(tag)) weightBonus += loot.playerTags[tag]; - if (Type == "chest") { - if (tile && tile.Special && loot.special) weightBonus += loot.special; - else if (tile && tile.Special) weightMult = 0; - if (tile && tile.RedSpecial && loot.redspecial) weightBonus += loot.redspecial; - } - - let rep = (KinkyDungeonGoddessRep.Ghost + 50)/100; - if (loot.trap || loot.magic) weightMult *= (1 + rep); - if (loot.trap && KinkyDungeonCurrentMaxEnemies > 0) { - let nonSumEnemies = 0; - for (let e of KinkyDungeonEntities) {if (!e.summoned) nonSumEnemies++;} - weightMult *= Math.max(0, 1 - 0.5*nonSumEnemies/KinkyDungeonCurrentMaxEnemies); - } - if (loot.trap && noTrap) - weightMult = 0; - - lootWeights.push({loot: loot, weight: lootWeightTotal}); - lootWeightTotal += Math.max(0, (loot.weight + weightBonus) * weightMult); - } - } - } - - let selection = (roll ? roll : KDRandom()) * lootWeightTotal; - - for (let L = lootWeights.length - 1; L >= 0; L--) { - if (selection > lootWeights[L].weight) { - if (returnOnly) return lootWeights[L].loot; - let replace = KinkyDungeonLootEvent(lootWeights[L].loot, Level, TextGet(lootWeights[L].loot.message), lootWeights[L].loot.lock); - - if (!KinkyDungeonSendActionMessage(8, replace, lootWeights[L].loot.messageColor, lootWeights[L].loot.messageTime || 2)) - KinkyDungeonSendTextMessage(8, replace, lootWeights[L].loot.messageColor, lootWeights[L].loot.messageTime || 2, true, true); - - break; - } - } -} - -function KinkyDungeonGetUnlearnedSpells(minlevel, maxlevel, SpellList) { - let SpellsUnlearned = []; - - for (let spell of SpellList) { - if (spell.level >= minlevel && spell.level <= maxlevel && !spell.passive && KinkyDungeonCheckSpellPrerequisite(spell)) { - SpellsUnlearned.push(spell); - } - } - - for (let spell of KinkyDungeonSpells) { - for (let S = 0; S < SpellsUnlearned.length; S++) { - if (spell.name == SpellsUnlearned[S].name) { - SpellsUnlearned.splice(S, 1); - S--; - } - } - } - - return SpellsUnlearned; -} - -/* -You find a scrap of a journal! (pg. 24) -From the journal of Catherine Edgar Willows, well-known explorer (who vanished in the dungeon 30 years ago) - -"Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?' - -They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. -Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence. - -So the question is not "why did somebody lay these traps." The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. - -As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with." -*/ - - -function KinkyDungeonLootEvent(Loot, Floor, Replacemsg, Lock) { - let value = 0; - if (Loot.weapon) { - KinkyDungeonInventoryAddWeapon(Loot.weapon); - if (Replacemsg) - Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItem" + Loot.weapon)); - } - else if (Loot.armor) { - let armor = Loot.armor; - let unlockcurse = null; - if (Loot.curselevelmin != undefined || Loot.curselevelmax != undefined) - armor = CommonRandomItemFromList("", KinkyDungeonGetCurses(Loot.armor, false, Loot.curselevelmin, Loot.curselevelmax)); - if (Loot.unlockcurse) { - let curselist = []; - for (let c of Loot.unlockcurse) { - curselist.push(...KDCurseUnlockList[c]); - } - unlockcurse = CommonRandomItemFromList("", curselist); - } - KinkyDungeonInventoryAddLoose(armor, unlockcurse); - if (Replacemsg) - Replacemsg = Replacemsg.replace("ArmorAcquired", TextGet("Restraint" + Loot.armor)); - } - else if (Loot.name == "spell_points") { - let amount = 1; - KinkyDungeonSpellPoints += amount; - KinkyDungeonSendFloater({x: 1100, y: 800 - KDRecentRepIndex * 40}, `+${amount} Spell Points!!!`, "#8888ff", 5, true); - KDRecentRepIndex += 1; - if (Replacemsg) - Replacemsg = Replacemsg.replace("AMOUNT", "" + amount); - } - else if (Loot.name == "spell_illusion_low") { - let SpellsUnlearned = KinkyDungeonGetUnlearnedSpells(0, 2, KinkyDungeonSpellList.Illusion); - let spellIndex = Math.floor(KDRandom()*SpellsUnlearned.length); - - let spell = SpellsUnlearned[spellIndex]; - if (Replacemsg) - Replacemsg = Replacemsg.replace("SpellLearned", TextGet("KinkyDungeonSpell" + spell.name)); - KinkyDungeonSpells.push(spell); - } - else if (Loot.name == "spell_conjuration_low") { - let SpellsUnlearned = KinkyDungeonGetUnlearnedSpells(0, 2, KinkyDungeonSpellList.Conjure); - let spellIndex = Math.floor(KDRandom()*SpellsUnlearned.length); - - let spell = SpellsUnlearned[spellIndex]; - if (Replacemsg) - Replacemsg = Replacemsg.replace("SpellLearned", TextGet("KinkyDungeonSpell" + spell.name)); - KinkyDungeonSpells.push(spell); - } - else if (Loot.name == "spell_elemental_low") { - let SpellsUnlearned = KinkyDungeonGetUnlearnedSpells(0, 2, KinkyDungeonSpellList.Elements); - let spellIndex = Math.floor(KDRandom()*SpellsUnlearned.length); - - let spell = SpellsUnlearned[spellIndex]; - if (Replacemsg) - Replacemsg = Replacemsg.replace("SpellLearned", TextGet("KinkyDungeonSpell" + spell.name)); - KinkyDungeonSpells.push(spell); - } - else if (Loot.name == "pearlReward") { - let rewardAvailable = []; - for (let rep of Object.entries(KinkyDungeonGoddessRep)) { - let rewards = KDBlessedRewards[rep[0]]; - if (rewards && rep[1] > 45) { - for (let r of rewards) { - if (!KinkyDungeonInventoryGet(r)) { - rewardAvailable.push(r); - } - } - } - } - let reward = rewardAvailable[Math.floor(KDRandom() * rewardAvailable.length)]; - if (KinkyDungeonWeapons[reward]) { - KinkyDungeonInventoryAddWeapon(reward); - if (Replacemsg) - Replacemsg = Replacemsg.replace("ITEMGET", TextGet("KinkyDungeonInventoryItem" + reward)); - } - else if (KinkyDungeonFindSpell(reward, true)) { - KinkyDungeonSpells.push(KinkyDungeonFindSpell(reward, true)); - if (Replacemsg) - Replacemsg = Replacemsg.replace("ITEMGET", TextGet("KinkyDungeonSpell" + reward)); - } - else if (KinkyDungeonConsumables[reward]) { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables[reward], 1); - if (Replacemsg) - Replacemsg = Replacemsg.replace("ITEMGET", TextGet("KinkyDungeonInventoryItem" + reward)); - } - else { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); - if (Replacemsg) - Replacemsg = Replacemsg.replace("ITEMGET", TextGet("KinkyDungeonInventoryItemAncientPowerSource")); - } - - } - else if (Loot.name == "gold") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - } - else if (Loot.name == "biggold") { - value = Math.ceil((250 + 100 * KDRandom()) * (1 + Floor/40)); - } - else if (Loot.name == "smallgold") { - value = Math.ceil((25 + 15 * KDRandom()) * (1 + Floor/35)); - } - else if (Loot.name == "knife") { - KinkyDungeonInventoryAddWeapon("Knife"); - } - else if (Loot.name == "magicknife") { - KinkyDungeonInventoryAddWeapon("EnchKnife"); - } - else if (Loot.name == "pick") { - KinkyDungeonLockpicks += 1; - } - else if (Loot.name == "redkey") { - KinkyDungeonRedKeys += 1; - } - else if (Loot.name == "bluekey") { - KinkyDungeonBlueKeys += 1; - } - else if (Loot.name == "grinder") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.EnchantedGrinder, 1); - } - else if (Loot.name == "bola") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.Bola, 2); - } - else if (Loot.name == "bomb") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.Bomb, 1); - } - else if (Loot.name == "MistressKey") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.MistressKey, 1); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 2); - } - else if (Loot.name == "Scrolls") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 2); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollArms, 2 + Math.floor(KDRandom() * 3)); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollLegs, 2 + Math.floor(KDRandom() * 3)); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollVerbal, 2 + Math.floor(KDRandom() * 3)); - } - else if (Loot.name == "scroll_legs") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollLegs, 1); - } - else if (Loot.name == "scroll_arms") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollArms, 1); - } - else if (Loot.name == "scroll_verbal") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollVerbal, 1); - } - else if (Loot.name == "scrolls_basic") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollArms, 1 + Math.floor(KDRandom() * 3)); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollLegs, 1 + Math.floor(KDRandom() * 3)); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollVerbal, 1 + Math.floor(KDRandom() * 3)); - } - else if (Loot.name == "scrolls_purity") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollPurity, 1); - } - else if (Loot.name == "AncientCores") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, Loot.count ? Loot.count : 2); - } - else if (Loot.name == "EnchantedBelt"||Loot.name == "EnchantedBra"||Loot.name == "EnchantedHeels"||Loot.name == "EnchantedAnkleCuffs"||Loot.name == "EnchantedMuzzle"||Loot.name == "EnchantedBlindfold"||Loot.name == "EnchantedMittens"||Loot.name == "EnchantedBallGag"||Loot.name == "EnchantedArmbinder") { - let restraint = KinkyDungeonGetRestraintByName(Loot.name); - KinkyDungeonInventoryAdd({name: Loot.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events: Object.assign([], restraint.events)}); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); - } - else if (Loot.name == "PotionCollar") { - let restraint = KinkyDungeonGetRestraintByName("PotionCollar"); - KinkyDungeonInventoryAdd({name: Loot.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events: Object.assign([], restraint.events)}); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); - } - else if (Loot.name == "weapon_boltcutters") { - KinkyDungeonInventoryAddWeapon("BoltCutters"); - if (Replacemsg) - Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItemBoltCutters")); - } - else if (Loot.name == "weapon_spear") { - KinkyDungeonInventoryAddWeapon("Spear"); - if (Replacemsg) - Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItemSpear")); - } - else if (Loot.name == "weapon_flail") { - KinkyDungeonInventoryAddWeapon("Flail"); - if (Replacemsg) - Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItemFlail")); - } - else if (Loot.name == "staff_flame") { - KinkyDungeonInventoryAddWeapon("StaffFlame"); - if (Replacemsg) - Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItemStaffFlame")); - } - else if (Loot.name == "staff_bind") { - KinkyDungeonInventoryAddWeapon("StaffBind"); - if (Replacemsg) - Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItemStaffBind")); - } - else if (Loot.name == "potions_mana") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 3+Math.floor(KDRandom()*2)); - } - else if (Loot.name == "manaorb") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ManaOrb, 1); - } - else if (Loot.name == "manaorbmany") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ManaOrb, 3); - } - else if (Loot.name == "potions_will") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, 2+Math.floor(KDRandom()*2)); - } - else if (Loot.name == "potions_many") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 2+Math.floor(KDRandom()*2)); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionStamina, 1+Math.floor(KDRandom()*3)); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionFrigid, Math.floor(KDRandom()*3)); - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, Math.floor(KDRandom()*3)); - } - else if (Loot.name == "potion_mana") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 1); - } - else if (Loot.name == "potion_stamina") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionStamina, 1); - } - else if (Loot.name == "potion_will") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, 1); - } - else if (Loot.name == "potion_frigid") { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionFrigid, 1); - } - else if (Loot.name == "trap_armbinder") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapArmbinder"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, "", undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapArmbinder")); - } - else if (Loot.name == "trap_armbinderHeavy") { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapArmbinder"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - let harness = KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapArmbinderHarness"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, KinkyDungeonGenerateLock(true)); - if (Replacemsg) - if (!harness) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapArmbinder")); - else Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapArmbinderHarness")); - } - else if (Loot.name == "trap_cuffs") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapCuffs"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapCuffs")); - } - else if (Loot.name == "trap_harness") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapHarness"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapHarness")); - } - else if (Loot.name == "trap_gag") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapGag"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapGag")); - } - else if (Loot.name == "trap_gagHeavy") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("PanelGag"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintPanelGag")); - } - else if (Loot.name == "trap_mithrilankle") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MithrilAnkleCuffs"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintMithrilAnkleCuffs")); - } - else if (Loot.name == "trap_mitts") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapMittens"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapMittens")); - } - else if (Loot.name == "trap_blindfold") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBlindfold"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapBlindfold")); - } - else if (Loot.name == "trap_boots") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBoots"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapBoots")); - } - else if (Loot.name == "trap_legirons") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapLegirons"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapLegirons")); - } - else if (Loot.name == "trap_belt") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibe"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapVibe")); - } - else if (Loot.name == "trap_protobelt") { - value = Math.ceil((200 + 100 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibeProto"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBeltProto"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapVibe")); - } - else if (Loot.name == "trap_beltonly") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapBelt")); - } - else if (Loot.name == "trap_plug") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug")); - } - else if (Loot.name == "trap_plug_tease") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug2"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug2")); - } - else if (Loot.name == "trap_plug_torment") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug3"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug3")); - } - else if (Loot.name == "trap_plug_thunder") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug4"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug4")); - } - else if (Loot.name == "trap_nipple") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("NippleClamps"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBra"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintNippleClamps")); - } - else if (Loot.name == "trap_plug2") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibe"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt2"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, (MiniGameKinkyDungeonLevel > 5 || KinkyDungeonNewGame > 0) ? "Gold" : "Red", undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug")); - } - else if (Loot.name == "trap_plug2_torment") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibe"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug3"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt2"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, (MiniGameKinkyDungeonLevel > 5 || KinkyDungeonNewGame > 0) ? "Gold" : "Red", undefined, Loot.trap); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug3")); - } - else if (Loot.name == "trap_nipple2") { - value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("NippleClamps"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBra2"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, (MiniGameKinkyDungeonLevel > 5 || KinkyDungeonNewGame > 0) ? "Gold" : "Red", undefined, false); - if (Replacemsg) - Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapBra2")); - } - else if (Loot.name == "trap_book") { - let spell = null; - if (KDRandom() < 0.33) { - spell = KinkyDungeonFindSpell("TrapRopeStrong", true); - } else if (KDRandom() < 0.5) { - spell = KinkyDungeonFindSpell("TrapMagicChainsWeak", true); - } else { - spell = KinkyDungeonFindSpell("TrapRibbons", true); - } - if (spell) { - KinkyDungeonCastSpell(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, spell, undefined, undefined, undefined); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/MagicSlash.ogg"); - } - } - - else if (Loot.name == "lost_items") { - if (!KinkyDungeonInventoryGet("Default")) { - KinkyDungeonInventoryAdd({name: "Default", id: KinkyDungeonGetItemID(), type: Outfit}); - } - for (let I = 0; I < KinkyDungeonLostItems.length; I++) { - let lostitem = KinkyDungeonLostItems[I]; - if (lostitem) { - let remove = false; - let existingitem = KinkyDungeonGetInventoryItem(lostitem.name, lostitem.type); - if (existingitem && existingitem.item) { - if (KDConsumable(existingitem.item)) { - if (lostitem.name != "MistressKey") { - if (!existingitem.item.quantity) existingitem.item.quantity = lostitem.quantity; - else existingitem.item.quantity += lostitem.quantity; - KinkyDungeonSendFloater({x: KinkyDungeonPlayerEntity.x - 1 + 2 * KDRandom(), y: KinkyDungeonPlayerEntity.y - 1 + 2 * KDRandom()}, - `+${lostitem.quantity} ${TextGet("KinkyDungeonInventoryItem" + lostitem.name)}`, "white", 5); - } else - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonMistressKeysTakenAway"), "orange", 2); - } - } else { - if (lostitem.type == Consumable && KinkyDungeonFindConsumable(lostitem.name)) { - if (lostitem.name != "MistressKey") - KinkyDungeonSendFloater({x: KinkyDungeonPlayerEntity.x - 1 + 2 * KDRandom(), y: KinkyDungeonPlayerEntity.y - 1 + 2 * KDRandom()}, - `+${lostitem.quantity} ${TextGet("KinkyDungeonInventoryItem" + lostitem.name)}`, "white", 4); - else - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonMistressKeysTakenAway"), "orange", 2); - remove = true; - } if (lostitem.type == Weapon && KinkyDungeonFindWeapon(lostitem.name)) { - KinkyDungeonSendFloater({x: KinkyDungeonPlayerEntity.x - 1 + 2 * KDRandom(), y: KinkyDungeonPlayerEntity.y - 1 + 2 * KDRandom()}, - `+${TextGet("KinkyDungeonInventoryItem" + lostitem.name)}`, "white", 6); - remove = true; - } else if (lostitem.type == Outfit && KinkyDungeonGetOutfit(lostitem.name)) { - KinkyDungeonSendFloater({x: KinkyDungeonPlayerEntity.x - 1 + 2 * KDRandom(), y: KinkyDungeonPlayerEntity.y - 1 + 2 * KDRandom()}, - `+${TextGet("KinkyDungeonInventoryItem" + lostitem.name)}`, "white", 7); - remove = true; - } else if (lostitem.type == LooseRestraint && KinkyDungeonGetRestraintByName(lostitem.name)) { - KinkyDungeonSendFloater({x: KinkyDungeonPlayerEntity.x - 1 + 2 * KDRandom(), y: KinkyDungeonPlayerEntity.y - 1 + 2 * KDRandom()}, - `+ (loose) ${TextGet("Restraint" + lostitem.name)}`, "white", 5); - remove = true; - } - } - if (remove) { - if (lostitem.name != "MistressKey") { - //if (lostitem.looserestraint && lostitem.looserestraint.enchanted) { - //KinkyDungeonInventory.unshift(lostitem); - //} else - KinkyDungeonInventoryAdd(lostitem); - } - //KinkyDungeonLostItems.splice(I, 1); - //I -= 1; - } - } - } - KinkyDungeonLostItems = []; - } - if (KDLootEvents[Loot.name]) { - let ret = KDLootEvents[Loot.name](Loot, Floor, Replacemsg, Lock); - if (ret.value) value = ret.value; - if (ret.Replacemsg) Replacemsg = ret.Replacemsg; - } - - - if (Loot.trap) { - if (!Loot.noSmoke) { - KDSmokePuff(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 2.9, 0.4); - } - KDSendStatus('bound', Loot.name, "chest"); - } - - if (value > 0) { - if (Replacemsg) - Replacemsg = Replacemsg.replace("XXX", "" + value); - KinkyDungeonAddGold(value); - } - return Replacemsg; -} - - -function KinkyDungeonAddGold(value) { - if (!isNaN(value)) { - KinkyDungeonGold += value; - // @ts-ignore - if (ArcadeDeviousChallenge && KinkyDungeonDeviousDungeonAvailable()) CharacterChangeMoney(Player, Math.round(value/10)); - let pre = value >= 0 ? "+" : ""; - KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, pre + `${value} GP`, "white", 3.5); - } else KinkyDungeonSendActionMessage(10, "Error, the thing you just did would have set your gold to infinity. Please report.", "white", 4); - -} - - -function KDSpawnLootTrap(x, y, trap, mult, duration) { - let spawned = 0; - /*let maxspawn = 1 + Math.round(Math.min(2 + KDRandom() * 2, KinkyDungeonDifficulty/25) + Math.min(2 + KDRandom() * 2, 0.5*MiniGameKinkyDungeonLevel/KDLevelsPerCheckpoint)); - if (mult) maxspawn *= mult; - let requireTags = trap ? [trap] : undefined; - - let tags = ["trap", trap]; - KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); - - for (let i = 0; i < 30; i++) { - if (spawned < maxspawn) { - let Enemy = KinkyDungeonGetEnemy( - tags, MiniGameKinkyDungeonLevel + KinkyDungeonDifficulty/5, - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - '0', requireTags, true); - if (Enemy) { - let pass = false; //KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, Enemy.name, 1, 7, true, (duration || Enemy.tags.construct) ? (duration || 40) : undefined, undefined, false, "Ambush", true, 1.5, true, undefined, true, true); - if (pass) { - if (Enemy.tags.minor) spawned += 0.5; - else if (Enemy.tags.elite) spawned += 1.5; - else if (Enemy.tags.miniboss) spawned += 2; - else if (Enemy.tags.boss) spawned += 4; - else spawned += 1; - if (Enemy.summonTags) { - for (let t of Enemy.summonTags) { - if (!tags.includes(t)) tags.push(t); - } - } - if (Enemy.summonTagsMulti) { - for (let t of Enemy.summonTagsMulti) { - tags.push(t); - } - } - } - } - } - }*/ - - for (let tile of KDNearbyTiles(x, y, 2.5)) { - if (tile.tile.lootTrapEnemy) { - let etiles = Object.values(KDGetEffectTiles(tile.x, tile.y)).filter((etile) => { - return etile.tags && etile.tags.includes("runesummon"); - }); - if (etiles?.length > 0) { - let Enemy = KinkyDungeonGetEnemyByName(tile.tile.lootTrapEnemy); - if (Enemy) { - if (KinkyDungeonSummonEnemy(tile.x, tile.y, Enemy.name, 1, 0.5, true, (duration || Enemy.tags.construct) ? (duration || 40) : undefined, undefined, false, "Ambush", true, undefined, true, undefined, duration > 300, false)) - spawned += 1; - for (let et of etiles) { - et.duration = 0; - } - delete tile.tile.lootTrapEnemy; - } - } - } - - } - if (spawned > 0) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/MagicSlash.ogg"); - KinkyDungeonMakeNoise(12, x, y); - KinkyDungeonSendTextMessage(10, TextGet("LootChestTrap"), "#ff8800", 2); - } -} - -function KDGenChestTrap(guaranteed, x, y, chestType, lock, noTrap) { - let trap = undefined; - if (chestType && chestType != "cache" && chestType != "chest" && chestType != "silver" && !KDTrapChestType[chestType]) return undefined; - if (lock && KDRandom() < 0.8) return undefined; - if (guaranteed || KDRandom() < (noTrap ? 0.4 : 1.0)) { - if (KDTrapChestType[chestType]) return KDTrapChestType[chestType](guaranteed, x, y, chestType, lock, noTrap); - else return KDTrapChestType.default(guaranteed, x, y, chestType, lock, noTrap); - } - return trap; -} - -let KDTrapChestType = { - "default" : (guaranteed, x, y, chestType, lock, noTrap) => { - if (KDRandom() < 0.33) - return {trap: "metalTrap", mult: 1}; - else if (KDRandom() < 0.34) - return {trap: "leatherTrap", mult: 1.2}; - else - return {trap: "ropeTrap", mult: 1.4}; - }, - "shadow" : (guaranteed, x, y, chestType, lock, noTrap) => { - return {trap: "shadowTrap", mult: 2.5, duration: 300}; - }, -}; - -function KDTriggerLoot(Loot, Type) { - let lootobj = KinkyDungeonLootTable[Type].find((element) => {return element.name == Loot;}); - console.log(KinkyDungeonLootEvent(lootobj, KinkyDungeonMapIndex, lootobj.message)); -} \ No newline at end of file diff --git a/Game/KinkyDungeonLootList.js b/Game/KinkyDungeonLootList.js deleted file mode 100644 index 59d528c07..000000000 --- a/Game/KinkyDungeonLootList.js +++ /dev/null @@ -1,315 +0,0 @@ -"use strict"; - -let KDBasicArmorWeight = 1.0; -let KDBasicArmorWeight_Cursed = 0.5; -let KDAdvancedArmorWeight = 1.5; -let KDAdvancedArmorWeight_Cursed = 1.0; - -let KDBasicArmor = [ - {name: "Breastplate", minLevel: 0, weight: KDBasicArmorWeight, - armor: "Breastplate", - norestraint: [...KinkyDungeonGetCurses("Breastplate", true)], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "Bustier", minLevel: 0, weight: KDBasicArmorWeight, - armor: "Bustier", - norestraint: [...KinkyDungeonGetCurses("Bustier", true)], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "ChainTunic", minLevel: 0, weight: KDBasicArmorWeight * 0.7, - armor: "ChainTunic", - norestraint: [...KinkyDungeonGetCurses("ChainTunic", true)], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "Bracers", minLevel: 0, weight: KDBasicArmorWeight, - armor: "Bracers", - norestraint: [...KinkyDungeonGetCurses("Bracers", true)], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "LeatherGloves", minLevel: 0, weight: KDBasicArmorWeight, - armor: "LeatherGloves", - norestraint: [...KinkyDungeonGetCurses("LeatherGloves", true)], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "Gauntlets", minLevel: 0, weight: KDBasicArmorWeight, - armor: "Gauntlets", - norestraint: [...KinkyDungeonGetCurses("Gauntlets", true)], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "SteelBoots", minLevel: 0, weight: KDBasicArmorWeight, - armor: "SteelBoots", - norestraint: [...KinkyDungeonGetCurses("SteelBoots", true)], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "LeatherBoots", minLevel: 0, weight: KDBasicArmorWeight, - armor: "LeatherBoots", - norestraint: [...KinkyDungeonGetCurses("LeatherBoots", true)], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, -]; -let KDAdvancedArmor = [ - {name: "SteelArmor", minLevel: 0, weight: KDAdvancedArmorWeight, - armor: "SteelArmor", - norestraint: [...KinkyDungeonGetCurses("SteelArmor", true)], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "SteelSkirt", minLevel: 0, weight: KDAdvancedArmorWeight, - armor: "SteelSkirt", - norestraint: [...KinkyDungeonGetCurses("SteelArmor", true)], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "MageArmor", minLevel: 0, weight: KDAdvancedArmorWeight, - armor: "MageArmor", - norestraint: [...KinkyDungeonGetCurses("MageArmor", true)], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, -]; -let KDBasicArmor_Cursed = [ - {name: "Breastplate_Cursed", minLevel: 0, weight: KDBasicArmorWeight_Cursed, - armor: "Breastplate", - //curses: [...KinkyDungeonGetCurses("Breastplate")], - curselevelmin: 0, curselevelmax: 10, - unlockcurse: ["Basic"], - norestraintcursed: "Breastplate", message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "Bustier_Cursed", minLevel: 0, weight: KDBasicArmorWeight_Cursed, - armor: "Bustier", - //curses: [...KinkyDungeonGetCurses("Bustier")], - curselevelmin: 0, curselevelmax: 10, - unlockcurse: ["Basic"], - norestraintcursed: "Bustier", message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "ChainTunic_Cursed", minLevel: 0, weight: KDBasicArmorWeight_Cursed * 0.7, - armor: "ChainTunic", - //curses: [...KinkyDungeonGetCurses("ChainTunic")], - curselevelmin: 0, curselevelmax: 10, - unlockcurse: ["Basic"], - norestraintcursed: "ChainTunic", message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "Bracers_Cursed", minLevel: 0, weight: KDBasicArmorWeight_Cursed, - armor: "Bracers", - //curses: [...KinkyDungeonGetCurses("Bracers")], - curselevelmin: 0, curselevelmax: 10, - unlockcurse: ["Basic"], - norestraintcursed: "Bracers", message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "LeatherGloves_Cursed", minLevel: 0, weight: KDBasicArmorWeight_Cursed, - armor: "LeatherGloves", - //curses: [...KinkyDungeonGetCurses("LeatherGloves")], - curselevelmin: 0, curselevelmax: 10, - unlockcurse: ["Basic"], - norestraintcursed: "LeatherGloves", message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "Gauntlets_Cursed", minLevel: 0, weight: KDBasicArmorWeight_Cursed, - armor: "Gauntlets", - //curses: [...KinkyDungeonGetCurses("Gauntlets")], - curselevelmin: 0, curselevelmax: 10, - unlockcurse: ["Basic"], - norestraintcursed: "Gauntlets", message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "SteelBoots_Cursed", minLevel: 0, weight: KDBasicArmorWeight_Cursed, - armor: "SteelBoots", - //curses: [...KinkyDungeonGetCurses("SteelBoots")], - curselevelmin: 0, curselevelmax: 10, - unlockcurse: ["Basic"], - norestraintcursed: "SteelBoots", message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "LeatherBoots_Cursed", minLevel: 0, weight: KDBasicArmorWeight_Cursed, - armor: "LeatherBoots", - //curses: [...KinkyDungeonGetCurses("LeatherBoots")], - curselevelmin: 0, curselevelmax: 10, - unlockcurse: ["Basic"], - norestraintcursed: "LeatherBoots", message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, -]; -let KDAdvancedArmor_Cursed = [ - {name: "SteelArmor_Cursed", minLevel: 0, weight: KDAdvancedArmorWeight_Cursed, - armor: "SteelArmor", - //curses: [...KinkyDungeonGetCurses("SteelArmor")], - curselevelmin: 0, curselevelmax: 10, - unlockcurse: ["Basic"], - norestraintcursed: "SteelArmor", message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "SteelSkirt_Cursed", minLevel: 0, weight: KDAdvancedArmorWeight_Cursed, - armor: "SteelSkirt", - //curses: [...KinkyDungeonGetCurses("SteelSkirt")], - curselevelmin: 0, curselevelmax: 10, - unlockcurse: ["Basic"], - norestraintcursed: "SteelSkirt", message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "MageArmor_Cursed", minLevel: 0, weight: KDAdvancedArmorWeight_Cursed, - armor: "MageArmor", - //curses: [...KinkyDungeonGetCurses("MageArmor")], - curselevelmin: 0, curselevelmax: 10, - unlockcurse: ["Basic"], - norestraintcursed: "MageArmor", message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, -]; - -let KinkyDungeonLootTable = { - "cursedrestraint": [ - ...KDBasicArmor_Cursed, - ...KDAdvancedArmor_Cursed, - ], - "rubble": [ - //{name: "nothing", minLevel: 0, weight:9, message:"LootRubbleFail", messageColor:"#aaaaaa", messageTime: 2, allFloors: true}, - {name: "smallgold", minLevel: 0, weight:12, message:"LootRubbleSmallGold", messageColor:"yellow", messageTime: 3, allFloors: true}, - {name: "knife", minLevel: 0, weight:5.5, message:"LootRubbleKnife", messageColor:"lightgreen", messageTime: 3, allFloors: true, noweapon: ["Knife"]}, - {name: "pick", minLevel: 0, weight:2.5, message:"LootRubbleLockpick", messageColor:"lightgreen", messageTime: 3, allFloors: true, prerequisites: ["fewpick"],}, - {name: "redkey", key: true, minLevel: 0, weight:1, message:"LootRubbleRedKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, - //{name: "greenkey", minLevel: 2, weight:2, message:"LootRubbleGreenKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, - //{name: "bluekey", key: true, minLevel: 2, weight:0.33, message:"LootRubbleBlueKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, - {name: "potion_mana", minLevel: 0, weight:3, message:"LootPotionMana", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "potion_will", minLevel: 0, weight:1, message:"LootPotionWill", messageColor:"#ff4444", messageTime: 3, allFloors: true}, - {name: "potion_stamina", minLevel: 0, weight:4, message:"LootPotionStamina", messageColor:"lightgreen", messageTime: 3, allFloors: true}, - {name: "potion_frigid", minLevel: 0, weight:2, message:"LootPotionFrigid", messageColor:"lightgreen", messageTime: 3, allFloors: true}, - ], - "shelf": [ - {name: "redkey", key: true, minLevel: 1, weight:1, message:"LootBookshelfKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, - {name: "bluekey", key: true, minLevel: 0, weight:0.33, message:"LootBookshelfBlueKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, - {name: "scroll_arms", minLevel: 0, weight:1, message:"LootBookshelfScroll", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "scroll_legs", minLevel: 0, weight:1, message:"LootBookshelfScroll", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "scroll_verbal", minLevel: 0, weight:1, message:"LootBookshelfScroll", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "trap_book", minLevel: 1, weight:5, message:"LootBookshelfTrap", messageColor:"#ff0000", messageTime: 3, allFloors: true}, - ], - "pearl": [ - {name: "pearlReward", minLevel: 0, weight:1, message:"LootPearlChest", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["pearlChest"],}, - ], - "shadow": [ - {name: "slimeThrower", minLevel: 0, weapon: "Slimethrower", weight:2, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["Slimethrower"]}, - {name: "StaffDoll", minLevel: 0, weapon: "StaffDoll", weight:2, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["StaffDoll"]}, - {name: "staff_incineration", minLevel: 0, weight:.5, weapon: "StaffIncineration", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["StaffIncineration"]}, - {name: "staff_storms", minLevel: 0, weight:.5, weapon: "StaffStorm", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["StaffStorm"]}, - {name: "staff_frostbite", minLevel: 0, weight:.5, weapon: "StaffFrostbite", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["StaffFrostbite"]}, - {name: "staff_bind", minLevel: 0, weight:.5, weapon: "StaffBind", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["StaffBind"]}, - {name: "AncientCores", minLevel: 0, weight:0.5, message:"LootChestAncientCores", messageColor:"yellow", messageTime: 3, allFloors: true, max: 1}, - {name: "bluekey", minLevel: 0, weight:0.5, message:"LootChestBlueKey", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "spell_points", magic: true, minLevel: 0, weight:5, message:"LootChestSpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, - ...KDAdvancedArmor, ...KDAdvancedArmor_Cursed, - ], - "storage": [ - {name: "redkey", key: true, minLevel: 0, weight:1, message:"LootChestRedKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, - {name: "bola", minLevel: 0, weight:3, message:"LootChestBola", messageColor:"lightgreen", messageTime: 3, allFloors: true}, - {name: "bomb", minLevel: 0, weight:2, message:"LootChestBomb", messageColor:"lightgreen", messageTime: 3, allFloors: true}, - {name: "rope", minLevel: 0, weight:1, weapon: "Rope", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["Rope"]}, - ], - "blue": [ - {name: "spell_points", magic: true, minLevel: 0, weight:1, message:"LootChestSpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, - ], - "tutorial1": [ - {name: "trap_cuffs", minLevel: 1, weight:1, lock: "Red", message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms"], power: 2}, - ], - "tutorial2": [ - {name: "trap_armbinder", minLevel: 1, weight:1, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms"], power: 6}, - ], - "chest": [ - {name: "gold", minLevel: 0, weight:10, message:"LootChestGold", messageColor:"#ffff00", messageTime: 3, allFloors: true}, - {name: "magicknife", minLevel: 0, weight:1.5, weapon: "EnchKnife", message:"LootChestMagicKnife", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["EnchKnife"]}, - {name: "bluekey", redspecial: 8.5, key: true, minLevel: 3, weight:0.65, message:"LootChestBlueKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, - {name: "weapon_boltcutters", minlevel: 5, weight:0.7, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["BoltCutters"]}, - {name: "hammer", minLevel: 0, weight:1, weapon: "Hammer", noweapon: ["Hammer"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "flail", minLevel: 0, weight:1, weapon: "Flail", noweapon: ["Flail"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "axe", minLevel: 0, weight:1, weapon: "Axe", noweapon: ["Axe"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "spear", minLevel: 0, weight:1, weapon: "Spear", noweapon: ["Spear"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "sword", minLevel: 0, weight:1, weapon: "Sword", noweapon: ["Sword"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "Dirk", minLevel: 0, weight:1, weapon: "Dirk", noweapon: ["Dirk"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "Foil", minLevel: 0, weight:0.5, weapon: "Foil", noweapon: ["Foil"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - ...KDBasicArmor, ...KDBasicArmor_Cursed, - /*{name: "trap_armbinder", trap: true, minLevel: 1, weight:2, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms", "ModerateRestraint"], power: 6}, - {name: "trap_armbinderHeavy", minLevel: 1, weight:2, message:"LootChestTrapMagicHarness", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms", "ModerateRestraint"], submissive: 15, power: 8}, - {name: "trap_cuffs", trap: true, minLevel: 1, weight:1, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms"], power: 2}, - {name: "trap_harness", trap: true, minLevel: 1, weight:2, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemTorso"], power: 4}, - {name: "trap_gag", trap: true, minLevel: 1, weight:3, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemMouth"], power: 6}, - {name: "trap_blindfold", trap: true, minLevel: 1, weight:2, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemHead"], power: 6}, - {name: "trap_boots", trap: true, minLevel: 1, weight:1.5, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemBoots"], power: 6}, - {name: "trap_legirons", trap: true, minLevel: 1, weight:1, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemFeet"], power: 8}, - {name: "trap_beltonly", arousalMode: true, trap: true, minLevel: 1, weight:3, message:"LootChestTrapMagicBelt", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemPelvis"], power: 5}, - {name: "trap_belt", arousalMode: true, trap: true, minLevel: 1, weight:1.5, message:"LootChestTrapMagicVibe", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulvaPiercings", "alreadyBelted", "vibe"], power: 1}, - */ - {name: "trap_plug", arousalMode: true, trap: true, minLevel: 1, weight:1.5, message:"LootChestTrapMagicPlug", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 3}, - {name: "trap_nipple", arousalMode: true, trap: true, minLevel: 1, weight:1.5, message:"LootChestTrapMagicNipple", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemNipples", "alreadyBelted", "vibe"], power: 3}, - //{name: "trap_mitts", trap: true, minlevel: 7, weight:2, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemHands", "LightRestraint"], power: 10}, - {name: "potions_mana", minLevel: 0, weight:1, message:"LootPotionsMana", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["lowmanapotions"]}, - {name: "manaorb", minLevel: 0, weight:0.25, message:"LootManaOrb", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "potions_will", minLevel: 0, weight:1, message:"LootPotionsWill", messageColor:"#ff4444", messageTime: 3, allFloors: true, prerequisites: ["lowwillpotions"]}, - //{name: "potions_many", minLevel: 1, weight:0.5, message:"LootPotionsMedley", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["lowpotions"]}, - ], - "lost_items": [ - {name: "lost_items", minLevel: 0, weight:999999999999, message:"LootCacheLostItems", messageColor:"lightgreen", messageTime: 3, allFloors: true, prerequisites: ["LostItems"]}, - ], - "cache": [ - //{name: "lost_items", minLevel: 0, weight:999999999999, message:"LootCacheLostItems", messageColor:"lightgreen", messageTime: 3, allFloors: true, prerequisites: ["LostItems"]}, - {name: "potions_many", minLevel: 0, weight:0.001, message:"LootPotionsMedley", messageColor:"lightblue", messageTime: 3, allFloors: true}, - - {name: "weapon_boltcutters", minLevel: 3, weight:1, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["BoltCutters"]}, - {name: "flamberge", minLevel: 3, weight:0.8, weapon: "Flamberge", noweapon: ["Flamberge"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "Rapier", minLevel: 3, weight:0.8, weapon: "Rapier", noweapon: ["Rapier"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "Katana", minLevel: 3, weight:0.8, weapon: "Katana", noweapon: ["Katana"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - - {name: "StaffFlame", minLevel: 0, weight:1, weapon: "StaffFlame", noweapon: ["StaffFlame"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "StaffChain", minLevel: 0, weight:1, weapon: "StaffChain", noweapon: ["StaffChain"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "StaffGlue", minLevel: 0, weight:1, weapon: "StaffGlue", noweapon: ["StaffGlue"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "StaffElectric", minLevel: 0, weight:1, weapon: "StaffElectric", noweapon: ["StaffElectric"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "StaffPermafrost", minLevel: 0, weight:1, weapon: "StaffPermafrost", noweapon: ["StaffPermafrost"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - - {name: "StaffDoll", minLevel: 5, weight:0.25, weapon: "StaffDoll", goddess: "Latex", goddessWeight: 1.25, noweapon: ["StaffDoll"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "StaffIncineration", minLevel: 5, weight:1, weapon: "StaffIncineration", goddess: "Elements", goddessWeight: 0.75, noweapon: ["StaffIncineration"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "StaffStorm", minLevel: 5, weight:1, weapon: "StaffStorm", goddess: "Elements", goddessWeight: 0.75, noweapon: ["StaffStorm"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "StaffFrostbite", minLevel: 5, weight:1, weapon: "StaffElectric", goddess: "Elements", goddessWeight: 0.75, noweapon: ["StaffFrostbite"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "StaffBind", minLevel: 5, weight:1, weapon: "StaffBind", goddess: "Rope", goddessWeight: 2.75, noweapon: ["StaffBind"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - - {name: "Slimethrower", minLevel: 5, weight:1, weapon: "Slimethrower", goddess: "Latex", goddessWeight: 1.25, noweapon: ["Slimethrower"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, - - ...KDBasicArmor, ...KDBasicArmor_Cursed, - ], - "gold": [ - {name: "MistressKey", minLevel: 0, weight:6, message:"LootChestMistressKey", messageColor:"yellow", messageTime: 3, allFloors: true}, - {name: "AncientCores", max: 1, minLevel: 0, weight:7, count: 3, message:"LootChestAncientCores", messageColor:"yellow", messageTime: 3, allFloors: true, submissive: 50}, - {name: "EnchantedBelt", arousalMode: true, minLevel: 0, weight:4, message:"LootChestEnchantedBelt", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedBelt"]}, - {name: "EnchantedBra", arousalMode: true, minLevel: 0, weight:4, message:"LootChestEnchantedBra", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedBra"]}, - {name: "EnchantedHeels", minLevel: 0, weight:4, message:"LootChestEnchantedHeels", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedHeels"]}, - {name: "EnchantedAnkleCuffs", minLevel: 0, weight:4, message:"LootChestEnchantedAnkleCuffs", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedAnkleCuffs", "EnchantedAnkleCuffs2"]}, - {name: "EnchantedBlindfold", minLevel: 3, weight:4, message:"LootChestEnchantedBlindfold", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedBlindfold"]}, - {name: "EnchantedMuzzle", minLevel: 0, weight:4, message:"LootChestEnchantedMuzzle", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedMuzzle"]}, - {name: "EnchantedMittens", minLevel: 3, weight:4, message:"LootChestEnchantedMittens", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedMittens"]}, - {name: "EnchantedArmbinder", minlevel: 5, weight:4, message:"LootChestEnchantedArmbinder", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedArmbinder"], submissive: 5}, - {name: "EnchantedBallGag", minLevel: 0, weight:4, message:"LootChestEnchantedBallGag", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedBallGag"]}, - {name: "PotionCollar", minLevel: 1, weight:10, message:"LootPotionCollar", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["PotionCollar"]}, - ], - "lessergold": [ - {name: "scrolls_purity", minLevel: 0, weight: 1, message:"LootChestScrollsPurity", messageColor:"yellow", messageTime: 3, allFloors: true}, - {name: "MistressKey", minLevel: 0, weight:1, message:"LootChestMistressKey", messageColor:"yellow", messageTime: 3, allFloors: true}, - {name: "AncientCores", max: 1, minLevel: 0, weight:3, message:"LootChestAncientCores", messageColor:"yellow", messageTime: 3, allFloors: true}, - {name: "magicknife", minLevel: 0, weight:1, weapon: "EnchKnife", message:"LootChestMagicKnife", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["EnchKnife"]}, - {name: "Scrolls", minLevel: 0, weight:2, message:"LootChestScrolls", messageColor:"yellow", messageTime: 3, allFloors: true}, - {name: "spell_points", magic: true, minLevel: 3, weight: 3, message:"LootChestSpellPoints", messageColor:"lightblue", messageTime: 3, special:100, allFloors: true, max: 1}, - {name: "manaorbmany", minLevel: 0, weight:1, message:"LootManaOrbMany", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "MagicSword", minLevel: 3, weight:0.33, weapon: "MagicSword", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, - allFloors: true, noweapon: ["MagicSword"]}, - {name: "MagicAxe", minLevel: 3, weight:0.33, weapon: "MagicAxe", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, - allFloors: true, noweapon: ["MagicAxe"]}, - {name: "MagicSpear", minLevel: 3, weight:0.33, weapon: "MagicSpear", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, - allFloors: true, noweapon: ["MagicSpear"]}, - {name: "MagicFlail", minLevel: 3, weight:0.33, weapon: "MagicFlail", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, - allFloors: true, noweapon: ["MagicFlail"]}, - {name: "MagicHammer", minLevel: 3, weight:0.33, weapon: "MagicHammer", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, - allFloors: true, noweapon: ["MagicHammer"]}, - {name: "IceBreaker", minLevel: 2, weight:0.33, weapon: "IceBreaker", goddess: "Elements", goddessWeight: 3, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, - allFloors: true, noweapon: ["IceBreaker"]}, - {name: "StormBreaker", minLevel: 2, weight:0.33, weapon: "StormBreaker", goddess: "Elements", goddessWeight: 3, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, - allFloors: true, noweapon: ["StormBreaker"]}, - {name: "DarkKatana", minLevel: 2, weight:0.33, goddess: "Illusion", goddessWeight: 6, weapon: "DarkKatana", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, - allFloors: true, noweapon: ["DarkKatana"]}, - //{name: "trap_protobelt", arousalMode: true, trap: true, minlevel: 9, goddess: "Metal", goddessWeight: 4, weight:0, message:"LootChestTrapMagicVibe", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulvaPiercings"], power: 15}, - {name: "trap_plug2", arousalMode: true, trap: true, minlevel: 6, weight:1.5, message:"LootChestTrapMagicPlug", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 3}, - {name: "trap_plug2_torment", arousalMode: true, trap: true, lock: "Gold", minlevel: 11, weight:1, message:"LootChestTrapMagicPlug", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 5}, - {name: "trap_nipple2", arousalMode: true, trap: true, minlevel: 7, weight:4, message:"LootChestTrapMagicNipple", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemNipples", "vibe"], power: 3}, - {name: "PotionCollar", minLevel: 1, weight:1.5, message:"LootPotionCollar", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["PotionCollar"]}, - ], - "silver": [ - {name: "manaorb", minLevel: 0, weight:4, message:"LootManaOrb", messageColor:"lightblue", messageTime: 3, allFloors: true}, - {name: "biggold", minLevel: 0, weight:10, message:"LootChestGold", messageColor:"#ffff00", messageTime: 3, allFloors: true}, - {name: "magicknife", minLevel: 0, weight:2.5, weapon: "EnchKnife", message:"LootChestMagicKnife", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["EnchKnife"]}, - {name: "scrolls_basic", minLevel: 0, weight: 1.75, message:"LootChestScrollsBasic", messageColor:"yellow", messageTime: 3, allFloors: true}, - {name: "scrolls_purity", minLevel: 0, weight: 0.75, message:"LootChestScrollsPurity", messageColor:"yellow", messageTime: 3, allFloors: true}, - {name: "spell_illusion_low", magic: true, minLevel: 0, weight: 0.75, message:"LootChestSpell", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["UnlearnedIllusion", "lowlevel"]}, // lowlevel is spell levels 1-2 - {name: "spell_conjuration_low", magic: true, minLevel: 0, weight: 0.75, message:"LootChestSpell", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["UnlearnedConjure", "lowlevel"]}, // lowlevel is spell levels 1-2 - {name: "spell_elemental_low", magic: true, minLevel: 0, weight: 0.75, message:"LootChestSpell", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["UnlearnedElements", "lowlevel"]}, // lowlevel is spell levels 1-2 - /*{name: "trap_armbinderHeavy", trap:true, minlevel: 5, weight:2, message:"LootChestTrapMagicHarness", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms", "ModerateRestraint"], power: 6}, - {name: "trap_harness", trap: true, minLevel: 1, weight:2, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemTorso"], power: 4}, - {name: "trap_gagHeavy", trap:true, minLevel: 3, weight:3, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemMouth2"], power: 10}, - {name: "trap_mithrilankle", trap:true, minlevel: 4, weight:3, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemFeet"], power: 18}, - {name: "trap_beltonly", arousalMode: true, trap: true, minLevel: 1, weight:2, message:"LootChestTrapMagicBelt", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemPelvis"], power: 5}, - {name: "trap_belt", arousalMode: true, trap: true, minLevel: 3, weight:2, message:"LootChestTrapMagicVibe", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulvaPiercings", "alreadyBelted"], power: 1}, - */ - {name: "trap_plug", arousalMode: true, trap: true, minlevel: 5, weight:1.5, message:"LootChestTrapMagicPlug", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 3}, - {name: "trap_plug_tease", arousalMode: true, trap: true, minlevel: 11, weight:1, message:"LootChestTrapMagicPlug", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 4}, - {name: "trap_plug_torment", arousalMode: true, trap: true, minlevel: 15, weight:0.5, message:"LootChestTrapMagicPlug", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 5}, - {name: "trap_plug_thunder", arousalMode: true, trap: true, minlevel: 15, weight:0.5, message:"LootChestTrapMagicPlug", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 5}, - {name: "trap_nipple", arousalMode: true, trap: true, minLevel: 2, weight:2, message:"LootChestTrapMagicNipple", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemNipples", "vibe"], power: 3}, - //{name: "trap_mitts", trap: true, minlevel: 5, weight:2, message:"LootChestTrapMagic", messageColor:"#ff0000", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemHands", "LightRestraint"], power: 10}, - {name: "potions_mana", minLevel: 0, weight:3, message:"LootPotionsMana", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["lowmanapotions"]}, - {name: "potions_will", minLevel: 0, weight:2, message:"LootPotionsWill", messageColor:"#ff4444", messageTime: 3, allFloors: true, prerequisites: ["lowwillpotions"]}, - {name: "potions_many", minLevel: 1, weight:2, message:"LootPotionsMedley", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["lowpotions"]}, - {name: "grinder", minLevel: 1, weight:2, message:"LootChestGrinder", messageColor:"yellow", messageTime: 3, allFloors: true}, - {name: "PotionCollar", minLevel: 1, weight:0.5, message:"LootPotionCollar", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["PotionCollar"]}, - ], - -}; - - -let KDLootEvents = { - "Armor": (Loot, Floor, Replacemsg, Lock) => { - return { - value: 0, - Replacemsg: Replacemsg, - }; - }, -}; \ No newline at end of file diff --git a/Game/KinkyDungeonLore.js b/Game/KinkyDungeonLore.js deleted file mode 100644 index 3a6f1fe12..000000000 --- a/Game/KinkyDungeonLore.js +++ /dev/null @@ -1,234 +0,0 @@ -"use strict"; - -let KinkyDungeonCurrentLore = -1; -/** - * @type {any} - */ -let KinkyDungeonCurrentLoreTab = -1; -/** - * @type {any[]} - */ -let KinkyDungeonCurrentLoreTabs = [-1]; -let KinkyDungeonCurrentLoreItems = []; -let KinkyDungeonCurrentLoreItemOffset = 0; -let KinkyDungeonCurrentLoreTabOffset = 0; -let KinkyDungeonLore = [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28]; -let KinkyDungeonCheckpointLore = { - "Combat": [23, 24, 25, 26, 27], - "School": [20, 21, 22, 28], - "History": [29, 30, 31, 32, 33, 34, 35, 36, 37], - "Enemy": [4, 5, 6, 19, 101, 102, 103, 104, 105, 106, 107, 108, 109, 111, 112, 1100, 1104, 201, 203], - /*0*/ "grv": [29, 1, 19], - /*1*/ "tmb": [30, 9, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112], - /*2*/ "cat": [31, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 9,], - /*3*/ "lib": [32], - /*4*/ "jng": [33, 29, 201, 202, 203, 204, 205], - /*5*/ "cry": [34], - /*6*/ "tmp": [35], - /*7*/ "ore": [36, 1400, 1401, 1402], - /*8*/ "bel": [37, 400], - - -}; -let KinkyDungeonLoreScale = 1.5; -let KinkyDungeonRepeatLoreChance = 0.4; // Chance you will find a duplicate piece of lore -let KinkyDungeonGenericLoreChance = 0.33; // Chance you will find a generic note instead of a previous note - -let KinkyDungeonNewLoreList = localStorage.getItem("kinkydungeonnewlore") ? JSON.parse(localStorage.getItem("kinkydungeonnewlore")) : []; - -function KinkyDungeonNewLore() { - let availableLore = []; - let exploredLore = localStorage.getItem("kinkydungeonexploredlore") ? JSON.parse(localStorage.getItem("kinkydungeonexploredlore")) : []; - let newLore = localStorage.getItem("kinkydungeonnewlore") ? JSON.parse(localStorage.getItem("kinkydungeonnewlore")) : []; - - let checkpoint = KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]; - - if (!exploredLore || exploredLore.length == 0) { - availableLore = [0]; - } else if (KinkyDungeonCheckpointLore[checkpoint]) { - for (let L = 0; L < KinkyDungeonCheckpointLore[checkpoint].length; L++) { - availableLore.push(KinkyDungeonCheckpointLore[checkpoint][L]); - } - - if (Math.random() < KinkyDungeonRepeatLoreChance) { - if (Math.random() > KinkyDungeonGenericLoreChance) { - availableLore = KinkyDungeonLore; - } else { - availableLore = []; - } - - } else KinkyDungeonLore.forEach((element) => {if (!exploredLore.includes(element)) {availableLore.push(element);}}); - - } - - let result = false; - - if (availableLore.length > 0) { - KinkyDungeonCurrentLore = availableLore[Math.floor(Math.random() * availableLore.length)]; - if (!exploredLore.includes(KinkyDungeonCurrentLore)) { - - KinkyDungeonSendActionMessage(5, TextGet("ItemPickupLore"), "white", 2); - exploredLore.push(KinkyDungeonCurrentLore); - newLore.push(KinkyDungeonCurrentLore); - - KinkyDungeonCurrentLoreTab = -1; - for (let i = 0; i < Object.keys(KinkyDungeonCheckpointLore).length; i++) { - if (Object.values(KinkyDungeonCheckpointLore)[i].includes(KinkyDungeonCurrentLore)) { - KinkyDungeonCurrentLoreTab = i; - break; - } - } - - //ServerAccountUpdate.QueueData({ KinkyDungeonExploredLore: Player.KinkyDungeonExploredLore }); - } else { - KinkyDungeonSendActionMessage(4, TextGet("ItemPickupLoreOld"), "gray", 2); - KinkyDungeonCurrentLore = -(1 + Math.floor(Math.random() * 10)); - } - result = true; - } else { - KinkyDungeonSendActionMessage(4, TextGet("ItemPickupLoreOld"), "gray", 2); - KinkyDungeonCurrentLore = -(1 + Math.floor(Math.random() * 10)); - } - - localStorage.setItem("kinkydungeonexploredlore", JSON.stringify(exploredLore)); - KinkyDungeonNewLoreList = newLore; - localStorage.setItem("kinkydungeonnewlore", JSON.stringify(newLore)); - - KinkyDungeonUpdateTabs(exploredLore); - - return result; -} - -function KinkyDungeonUpdateTabs(exploredLore) { - KinkyDungeonCurrentLoreTabs = [-1]; - for (let lore of exploredLore) { - for (let i = 0; i < Object.keys(KinkyDungeonCheckpointLore).length; i++) { - if (Object.values(KinkyDungeonCheckpointLore)[i].includes(lore)) KinkyDungeonCurrentLoreTabs.push(Object.keys(KinkyDungeonCheckpointLore)[i]); - } - } -} - -KinkyDungeonUpdateTabs(localStorage.getItem("kinkydungeonexploredlore") ? JSON.parse(localStorage.getItem("kinkydungeonexploredlore")) : []); - -function KinkyDungeonDrawLore() { - DrawImageZoomCanvas(KinkyDungeonRootDirectory + "MagicBook.png", MainCanvas, 0, 0, 640, 483, canvasOffsetX_ui, canvasOffsetY_ui - 100, 640*KinkyDungeonLoreScale, 483*KinkyDungeonLoreScale, false); - - // Draw the current note - MainCanvas.textAlign = "left"; - - //let wrapAmount = KDBigLanguages.includes(TranslationLanguage) ? 19 : 45; - let loreOrig = TextGet("KinkyDungeonLore" + KinkyDungeonCurrentLore).split('|'); - let lore = []; - for (let str of loreOrig) { - lore.push(...(KinkyDungeonWordWrap(str, 19, 45).split('\n'))); - } - let i = 0; - for (let N = 0; N < lore.length; N++) { - DrawTextFitKD(lore[N], - canvasOffsetX_ui + 640*KinkyDungeonLoreScale/8, canvasOffsetY_ui - 100 + 483*KinkyDungeonLoreScale/6 + i * 40, 0.75 * 640*KinkyDungeonLoreScale, "#000000", KDTextTan); i++;} - - if (KinkyDungeonNewLoreList.includes(KinkyDungeonCurrentLore)) { - KinkyDungeonNewLoreList.splice(KinkyDungeonNewLoreList.indexOf(KinkyDungeonCurrentLore), 1); - localStorage.setItem("kinkydungeonnewlore", JSON.stringify(KinkyDungeonNewLoreList)); - } - - MainCanvas.textAlign = "center"; - - // Draw the tabs - let tabs = Object.values(KinkyDungeonCheckpointLore); - let tabNames = Object.keys(KinkyDungeonCheckpointLore); - let numTabs = 20; - for (i = -1; i < numTabs; i++) { - if (i + KinkyDungeonCurrentLoreTabOffset < tabs.length) { - let newLore = false; - for (let ll of KinkyDungeonNewLoreList) { - if ((i == -1 && KinkyDungeonLore.includes(ll)) || (i >= 0 && KinkyDungeonCheckpointLore[tabNames[i + KinkyDungeonCurrentLoreTabOffset]].includes(ll))) { - newLore = true; - break; - } - } - if (i == -1) - DrawButtonVis(1800, 142 + i * 42, 190, 40, TextGet("KinkyDungeonCheckpointLore-1"), tabNames[i + KinkyDungeonCurrentLoreTabOffset] == KinkyDungeonCurrentLoreTab ? "white" : (newLore ? "#88ff88" :"#888888")); - else - DrawButtonVis(1800, 142 + i * 42, 190, 40, KinkyDungeonCurrentLoreTabs.includes(tabNames[i + KinkyDungeonCurrentLoreTabOffset]) ? - TextGet("KinkyDungeonCheckpointLore" + tabNames[i + KinkyDungeonCurrentLoreTabOffset]) : - TextGet("KinkyDungeonCheckpointLoreUnknown"), - tabNames[i + KinkyDungeonCurrentLoreTabOffset] == KinkyDungeonCurrentLoreTab ? "white" : (newLore ? "#88ff88" :"#888888")); - } else { - if (i + KinkyDungeonCurrentLoreTabOffset > tabs.length + 3) - KinkyDungeonCurrentLoreTabOffset = 0; - break; - } - - - DrawButtonVis(1850, 30, 90, 40, "", KinkyDungeonCurrentLoreTabOffset > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png"); - DrawButtonVis(1850, 930, 90, 40, "", numTabs + KinkyDungeonCurrentLoreTabOffset < KinkyDungeonCurrentLoreTabs.length ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png"); - } - - let numNotes = 57; - - // Draw the lore itself - DrawButtonVis(1550, 80, 90, 40, "", KinkyDungeonCurrentLoreItemOffset > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png"); - DrawButtonVis(1550, 860, 90, 40, "", numNotes + KinkyDungeonCurrentLoreItemOffset < KinkyDungeonCurrentLoreItems.length ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png"); - for (i = 0; i < numNotes; i++) { - let ii = Math.floor(i / 3); - let xx = i % 3; - if (i + KinkyDungeonCurrentLoreItemOffset < KinkyDungeonCurrentLoreItems.length) { - let loreNum = KinkyDungeonCurrentLoreItems[i + KinkyDungeonCurrentLoreItemOffset]; - DrawButtonVis(1450 + 100 * xx, 142 + (ii) * 42, 90, 40, "#" + loreNum, loreNum == KinkyDungeonCurrentLore ? "white" : (KinkyDungeonNewLoreList.includes(loreNum) ? "#88ff88": "#888888")); - } else { - if (i + KinkyDungeonCurrentLoreItemOffset > KinkyDungeonCurrentLoreItems.length + 3) - KinkyDungeonCurrentLoreItemOffset = 0; - break; - } - } -} - -function KinkyDungeonUpdateLore(exploredLore) { - KinkyDungeonCurrentLoreItems = []; - for (let lore of exploredLore) { - if (KinkyDungeonCurrentLoreTab == -1 && KinkyDungeonLore.includes(lore)) { - KinkyDungeonCurrentLoreItems.push(lore); - } else if (KinkyDungeonCheckpointLore[KinkyDungeonCurrentLoreTab] && KinkyDungeonCheckpointLore[KinkyDungeonCurrentLoreTab].includes(lore)) { - KinkyDungeonCurrentLoreItems.push(lore); - } - } -} - -function KinkyDungeonHandleLore() { - let tabs = Object.values(KinkyDungeonCheckpointLore); - let tabNames = Object.keys(KinkyDungeonCheckpointLore); - let numTabs = 20; - for (let i = -1; i + KinkyDungeonCurrentLoreTabOffset < tabs.length && i < numTabs; i++) { - if (MouseIn(1800, 142 + i * 42, 190, 40) && (KinkyDungeonCurrentLoreTabs.includes(tabNames[i + KinkyDungeonCurrentLoreTabOffset]) || i == -1)) { - if (tabNames[i + KinkyDungeonCurrentLoreTabOffset]) { - KinkyDungeonCurrentLoreTab = tabNames[i + KinkyDungeonCurrentLoreTabOffset]; - KinkyDungeonUpdateLore(localStorage.getItem("kinkydungeonexploredlore") ? JSON.parse(localStorage.getItem("kinkydungeonexploredlore")) : []); - } else if (i == -1) { - KinkyDungeonCurrentLoreTab = -1; - KinkyDungeonUpdateLore(localStorage.getItem("kinkydungeonexploredlore") ? JSON.parse(localStorage.getItem("kinkydungeonexploredlore")) : []); - } - } - } - - if (MouseIn(1850, 30, 90, 40) && KinkyDungeonCurrentLoreTabOffset > 0) KinkyDungeonCurrentLoreTabOffset -= 3; - if (MouseIn(1850, 930, 90, 40) && numTabs + KinkyDungeonCurrentLoreTabOffset < KinkyDungeonCurrentLoreTabs.length) KinkyDungeonCurrentLoreTabOffset += 3; - - let numNotes = 57; - if (MouseIn(1550, 80, 90, 40) && KinkyDungeonCurrentLoreItemOffset > 0) KinkyDungeonCurrentLoreItemOffset -= 3; - if (MouseIn(1550, 860, 90, 40) && numNotes + KinkyDungeonCurrentLoreItemOffset < KinkyDungeonCurrentLoreItems.length) KinkyDungeonCurrentLoreItemOffset += 3; - for (let i = 0; i < numNotes; i++) { - let ii = Math.floor(i / 3); - let xx = i % 3; - if (i + KinkyDungeonCurrentLoreItemOffset < KinkyDungeonCurrentLoreItems.length) { - let loreNum = KinkyDungeonCurrentLoreItems[i + KinkyDungeonCurrentLoreItemOffset]; - if (MouseIn(1450 + 100 * xx, 142 + (ii) * 42, 90, 40)) { - KinkyDungeonCurrentLore = loreNum; - } - } else { - break; - } - } - - return true; -} diff --git a/Game/KinkyDungeonMagic.js b/Game/KinkyDungeonMagic.js deleted file mode 100644 index bbc67d8bb..000000000 --- a/Game/KinkyDungeonMagic.js +++ /dev/null @@ -1,1481 +0,0 @@ -"use strict"; -let KinkyDungeonManaCost = 10; // The base mana cost of a spell, multiplied by the spell's level - -let KDEmpowerSprite = "Empower"; -let KDMaxEmpower = 3; // Max upcast level - -let KinkyDungeonBookScale = 1.3; - -let KinkyDungeonMysticSeals = 0; // Mystic seals are used to unlock a spell from one of 3 books: -// 0 Ars Pyrotecnica - Elemental magic such as fireballs, ice, wind, etc -// 1 Codex Imaginus - Conjuring things such as weapons and restraints, and also enchanting (and disenchanting) -// 2 Clavicula Romantica - Illusory magic, disorientation and affecting enemy AI - -// Magic book image source: https://www.pinterest.es/pin/54324739242326557/ - -// Note that you have these 3 books in your inventory at the start; you select the page open in each of them but you need to have hands free or else you can only turn to a random page at a time. If you are blind, you also can't see any page after you turn the page - -let KinkyDungeonCurrentBook = "Elements"; -let KinkyDungeonCurrentPage = 0; -let KinkyDungeonCurrentSpellsPage = 0; -let KinkyDungeonBooks = ["Elements", "Conjure", "Illusion"]; -let KinkyDungeonPreviewSpell = null; - -let KinkyDungeonSpellChoices = [0, 1, 2]; -let KinkyDungeonSpellChoicesToggle = [true, true]; -let KinkyDungeonSpellChoiceCount = 21; -let KinkyDungeonSpellChoiceCountPerPage = 7; -let KDSpellPage = 0; - -let KinkyDungeonSpellOffset = 100; -let KinkyDungeonSpellChoiceOffset = 80; - -let KDPlayerHitBy = []; - -let KinkyDungeonMiscastPityModifier = 0; // Current value -let KinkyDungeonMiscastPityModifierIncrementPercentage = 0.5; // Percent of the base hit chance to add - -function KinkyDungeonSearchSpell(list, name) { - for (let spell of list) { - if (spell.name == name) return spell; - } - return null; -} - -function KinkyDungeonFindSpell(name, SearchEnemies) { - if (SearchEnemies) { - let spell = KinkyDungeonSearchSpell(KinkyDungeonSpellListEnemies, name); - if (spell) return spell; - } - let spell2 = KinkyDungeonSearchSpell(KinkyDungeonSpellsStart, name); - if (spell2) return spell2; - for (let key in KinkyDungeonSpellList) { - let list = KinkyDungeonSpellList[key]; - let spell = KinkyDungeonSearchSpell(list, name); - if (spell) return spell; - } - return KinkyDungeonSearchSpell(KinkyDungeonSpells, name); -} - -function KinkyDungeonDisableSpell(Name) { - for (let i = 0; i < KinkyDungeonSpellChoices.length; i++) { - if (KinkyDungeonSpells[KinkyDungeonSpellChoices[i]] && KinkyDungeonSpells[KinkyDungeonSpellChoices[i]].name == Name) { - KinkyDungeonSpellChoicesToggle[i] = false; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Click.ogg"); - } - } -} - -let KinkyDungeonSpellPress = ""; - -function KinkyDungeonResetMagic() { - KinkyDungeonSpellChoices = []; - KinkyDungeonSpellChoicesToggle = []; - KinkyDungeonSpellChoiceCount = 21; - KinkyDungeonSpells = []; - Object.assign(KinkyDungeonSpells, KinkyDungeonSpellsStart); // Copy the dictionary - KinkyDungeonMysticSeals = 1.3; - KinkyDungeonSpellPress = ""; - KinkyDungeonCurrentPage = 0; - KinkyDungeonCurrentSpellsPage = 0; - KinkyDungeonSpellPoints = 3; - KDSpellPage = 0; - if (KinkyDungeonStatsChoice.get("randomMode")) { - KinkyDungeonSpells.push({name: "ApprenticeFire", hideLearned: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeWater", hideLearned: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeEarth", hideLearned: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeAir", hideLearned: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeIce", hideLearned: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeLightning", hideLearned: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - - KinkyDungeonSpells.push({name: "ApprenticeLeather", hideLearned: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeRope", hideLearned: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeMetal", hideLearned: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeSummon", hideLearned: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeLatex", hideLearned: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticePhysics", hideLearned: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - - KinkyDungeonSpells.push({name: "ApprenticeShadow", hideLearned: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeLight", hideLearned: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeMystery", hideLearned: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeKnowledge", hideLearned: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - KinkyDungeonSpells.push({name: "ApprenticeProjection", hideLearned: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"},); - - - //KinkyDungeonSpells.push({name: "SpellChoiceUp1", school: "Any", manacost: 0, components: [], spellPointCost: 1, level:3, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}); - //KinkyDungeonSpells.push({name: "SpellChoiceUp2", school: "Any", manacost: 0, components: [], spellPointCost: 1, level:4, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}); - //KinkyDungeonSpells.push({name: "SpellChoiceUp3", school: "Any", manacost: 0, components: [], spellPointCost: 1, level:5, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}); - } -} - -/** - * - * @param {string} name - * @returns {boolean} - */ -function KDHasSpell(name) { - for (let s of KinkyDungeonSpells) { - if (s.name == name) return true; - } - return false; -} - -/** - * - * @param {string} name - * @param {number} Level - Spell level. Set to -1 to allow any level - * @returns {spell} - */ -function KDGetUpcast(name, Level) { - if (Level < 0) { - for (let sp of KinkyDungeonSpells) { - if (sp.upcastFrom && sp.upcastFrom == name) { - return sp; - } - } - } else { - for (let i = Level; i > 0; i--) { - for (let sp of KinkyDungeonSpells) { - if (i == sp.upcastLevel && sp.upcastFrom && sp.upcastFrom == name) { - return sp; - } - } - } - } - return null; -} - -/** - * - * @param {string} name - * @returns {boolean} - */ -function KDHasUpcast(name) { - for (let sp of KinkyDungeonSpells) { - if (sp.upcastFrom && sp.upcastFrom == name) { - return true; - } - } - return false; -} -/** - * - * @returns {boolean} - */ -function KDCanUpcast() { - for (let i of KinkyDungeonSpellChoices) { - let spell = KinkyDungeonSpells[i]; - if (spell) { - let upcast = KDGetUpcast(spell.name, -1); - if (upcast) { - return true; - } - } - - } - return false; -} - -// @ts-ignore -function KDEmpower(data, entity) { - let Level = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellEmpower"); - if (!KDCanUpcast()) { - KinkyDungeonSendActionMessage(10, TextGet("KDSpellEmpowerFail"), "#ffffff", 1); - } else { - KinkyDungeonTargetingSpell = null; - // Success, we upcast - let newLevel = Math.min(KDMaxEmpower, Level + 1); - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { - id: "Empower", - aura: "#aaaaff", - type: "SpellEmpower", - maxCount: 1, - currentCount: 1, - power: newLevel, - duration: 13, - tags: ["cast", "upcast"], - }); - KinkyDungeonSendActionMessage(5, TextGet("KDSpellEmpowerMsg").replace("LEVEL", "" + newLevel), "#aaaaff", 2); - KinkyDungeonAdvanceTime(1, true); - } -} - -function KinkyDungeoCheckComponents(spell, x, y) { - let failedcomp = []; - if (spell.components.includes("Verbal") && !KinkyDungeonCanTalk(true) && !(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoVerbalComp") > 0)) failedcomp.push("Verbal"); - if (spell.components.includes("Arms") && KinkyDungeonIsArmsBound() && !(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoArmsComp") > 0)) failedcomp.push("Arms"); - if (spell.components.includes("Legs") && (KinkyDungeonSlowLevel > 1 || KinkyDungeonLegsBlocked()) && !(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoLegsComp") > 0)) failedcomp.push("Legs"); - - let data = { - spell: spell, - failed: failedcomp, - x: x || KinkyDungeonPlayerEntity.x, - y: y || KinkyDungeonPlayerEntity.y}; - KinkyDungeonSendEvent("calcComp", data); - return data.failed; -} - -function KinkyDungeonHandleSpellChoice(SpellChoice) { - let spell = KinkyDungeonHandleSpellCast(KDGetUpcast(KinkyDungeonSpells[SpellChoice].name, - KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellEmpower")) || KinkyDungeonSpells[SpellChoice]); - return spell; -} - -function KDSpellIgnoreComp(spell) { - return (KinkyDungeonStatsChoice.get("Slayer") && spell.school == "Elements") - || (KinkyDungeonStatsChoice.get("Conjurer") && spell.school == "Conjure") - || (KinkyDungeonStatsChoice.get("Magician") && spell.school == "Illusion"); -} - -function KinkyDungeonHandleSpellCast(spell) { - if (KinkyDungeoCheckComponents(spell).length == 0 || ( - KDSpellIgnoreComp(spell) - )) { - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) - && (!spell.staminacost || KinkyDungeonHasStamina(spell.staminacost))) - return spell; - else KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonNoMana"), "#ff0000", 1); - } else { - KinkyDungeonTargetingSpell = null; - KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonComponentsFail" + KinkyDungeoCheckComponents(spell)[0]), "#ff0000", 1); - } - return null; -} - -function KinkyDungeonClickSpell(i) { - let spell = null; - let clicked = false; - if (KinkyDungeonSpells[KinkyDungeonSpellChoices[i]]) { - if (KinkyDungeonSpells[KinkyDungeonSpellChoices[i]] && KinkyDungeonSpells[KinkyDungeonSpellChoices[i]].type == "passive") { - KDSendInput("toggleSpell", {i: i}); - if (KinkyDungeonSpellChoicesToggle[i] && KinkyDungeonSpells[KinkyDungeonSpellChoices[i]].cancelAutoMove) { - KinkyDungeonFastMove = false; - KinkyDungeonFastMoveSuppress = false; - } - KinkyDungeonSpellPress = ""; - clicked = true; - } else { - spell = KinkyDungeonHandleSpellChoice(KinkyDungeonSpellChoices[i]); - clicked = true; - } - } - return {spell: spell, clicked: clicked}; -} - -let KDSwapSpell = -1; - -function KinkyDungeonHandleSpell() { - let spell = null; - let clicked = false; - for (let i = 0; i < KinkyDungeonSpellChoiceCountPerPage; i++) { - let index = i + KDSpellPage*KinkyDungeonSpellChoiceCountPerPage; - let buttonWidth = 40; - if (MouseIn(1650 + (90 - buttonWidth), 180 + i*KinkyDungeonSpellChoiceOffset - buttonWidth, buttonWidth, buttonWidth) && KinkyDungeonSpellChoices[i]) { - KinkyDungeonDrawState = "MagicSpells"; - KDSwapSpell = index; - return true; - } - if (KinkyDungeonSpellPress == KinkyDungeonKeySpell[i]) { - let result = KinkyDungeonClickSpell(index); - spell = result.spell; - clicked = result.clicked; - } - } - for (let ii = 0; ii < KinkyDungeonSpellChoiceCount; ii++) { - if (MouseInKD("SpellCast" + ii)) { - let result = KinkyDungeonClickSpell(ii); - spell = result.spell; - clicked = result.clicked; - } - } - if (spell) { - // Otherwise. - KinkyDungeonTargetingSpell = spell; - KDModalArea = false; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = null; - KinkyDungeonSendActionMessage(5, TextGet("KinkyDungeonSpellTarget" + spell.name).replace("SpellArea", "" + Math.floor(spell.aoe)), "white", 0.1, true); - return true; - } - if (clicked) return true; - return false; -} - -function KinkyDungeonGetManaCost(Spell) { - let data = { - spell: Spell, - cost: Spell.manacost, - costscale: KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ManaCostMult")), - lvlcostscale: KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ManaCostLevelMult"), - }; - KinkyDungeonSendEvent("calcMana", data); - if (data.costscale) data.cost = Math.floor(data.cost * data.costscale); - //if (data.costscale > 0) data.cost = Math.max(0, data.cost); // Keep it from rounding to 0 - if (data.lvlcostscale && Spell.level && Spell.manacost) data.cost += Spell.level * data.lvlcostscale; - KinkyDungeonSendEvent("beforeMultMana", data); - KinkyDungeonSendEvent("afterCalcMana", data); - - if (KinkyDungeonStatsChoice.get("Slayer") && Spell.school == "Elements" && KinkyDungeoCheckComponents(Spell).length > 0) data.cost *= 2; - if (KinkyDungeonStatsChoice.get("Conjurer") && Spell.school == "Conjure" && KinkyDungeoCheckComponents(Spell).length > 0) data.cost *= 2; - if (KinkyDungeonStatsChoice.get("Magician") && Spell.school == "Illusion" && KinkyDungeoCheckComponents(Spell).length > 0) data.cost *= 2; - - return data.cost; -} - -function KinkyDungeonGetCost(Spell) { - let cost = Spell.level; - if (Spell.level > 1 && !Spell.passive && KinkyDungeonStatsChoice.get("Novice")) cost *= 2; - if (Spell.spellPointCost) return Spell.spellPointCost; - return cost; -} - -function KinkyDungeonMakeNoise(radius, noiseX, noiseY) { - for (let e of KinkyDungeonEntities) { - if (!e.aware && !e.Enemy.tags.deaf && !KDAmbushAI(e) && KDistChebyshev(e.x - noiseX, e.y - noiseY) <= radius) { - e.gx = noiseX; - e.gy = noiseY; - KDAddThought(e.id, "Search", 2, 1 + KDistChebyshev(e.x - noiseX, e.y - noiseY)); - } - } -} - -/** - * - * @param {number} targetX - * @param {number} targetY - * @param {spell} spell - * @param {*} enemy - * @param {*} player - * @param {*} bullet - * @param {string} [forceFaction] - * @param {any} [castData] - * @returns {{result: string, data: any}} - */ -function KinkyDungeonCastSpell(targetX, targetY, spell, enemy, player, bullet, forceFaction, castData) { - let entity = KinkyDungeonPlayerEntity; - let moveDirection = KinkyDungeonMoveDirection; - let flags = { - miscastChance: KinkyDungeonMiscastChance, - }; - - let faction = spell.allySpell ? "Player" : spell.enemySpell ? "Enemy" : "Player"; - if (forceFaction) faction = forceFaction; - else { - if (!enemy && !bullet && player) faction = "Player"; - else if (enemy) { - let f = KDGetFaction(enemy); - if (f) faction = f; - } else if (bullet && bullet.bullet) { - let f = bullet.bullet.faction; - if (f) faction = f; - } - if (spell.faction) faction = spell.faction; - } - - - let gaggedMiscastFlag = false; - if (!enemy && !bullet && player && spell.components && spell.components.includes("Verbal") && !KDSpellIgnoreComp(spell) && !(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoVerbalComp") > 0)) { - let gagTotal = (KinkyDungeonStatsChoice.get("Incantation") && KinkyDungeonGagTotal() > 0) ? 1.0 : KinkyDungeonGagTotal(); - flags.miscastChance = flags.miscastChance + Math.max(0, 1 - flags.miscastChance) * Math.min(1, gagTotal); - if (gagTotal > 0) - gaggedMiscastFlag = true; - } - - let data = Object.assign({...castData}, { - spell: spell, - bulletfired: null, - target: null, - targetX: targetX, - targetY: targetY, - originX: KinkyDungeonPlayerEntity.x, - originY: KinkyDungeonPlayerEntity.y, - flags: flags, - enemy: enemy, - bullet: bullet, - player: player, - delta: 1, - }); - - - - if (!enemy && !bullet && player) { - KinkyDungeonSendEvent("beforeCast", data); - } - let tX = targetX; - let tY = targetY; - let miscast = false; - let selfCast = !enemy && !bullet && player && targetX == KinkyDungeonPlayerEntity.x && targetY == KinkyDungeonPlayerEntity.y; - if (!enemy && !player && !bullet) { - moveDirection = {x:0, y:0, delta:1}; - } - - let noiseX = targetX; - let noiseY = targetY; - - if (enemy && player) { - entity = enemy; - moveDirection = KinkyDungeonGetDirection(player.x - entity.x, player.y - entity.y); - flags.miscastChance = 0; - } - if (bullet) { - entity = bullet; - if (bullet.bullet.cast) { - moveDirection = {x:bullet.bullet.cast.mx, y:bullet.bullet.cast.my, delta: 1}; - } else { - moveDirection = {x:0, y:0, delta: 0}; - } - flags.miscastChance = 0; - } - if (!spell.noMiscast && !enemy && !bullet && player && Math.min(1, KDRandom() + KinkyDungeonMiscastPityModifier) < flags.miscastChance) { - // Increment the pity timer - KinkyDungeonMiscastPityModifier += KinkyDungeonMiscastPityModifierIncrementPercentage * Math.max(1 - flags.miscastChance, 0); - - if (gaggedMiscastFlag) - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSpellMiscastGagged"), "#FF8800", 2); - else - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSpellMiscast"), "#FF8800", 2); - - moveDirection = {x:0, y:0, delta:1}; - tX = entity.x; - tY = entity.y; - miscast = true; - return {result: "Miscast", data: data}; - } - - - - let spellRange = spell.range * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "spellRange")); - - if (spell.type != "bolt" && spell.effectTilePre) { - KDCreateAoEEffectTiles(tX,tY, spell.effectTilePre, spell.effectTileDurationModPre, (spell.aoe) ? spell.aoe : 0.5); - } - - let originaltX = tX; - let originaltY = tY; - let originalSpeed = spell.speed; - let castCount = spell.shotgunCount ? spell.shotgunCount : 1; - for (let castI = 0; castI < castCount; castI++) { - // Reset tx - tX = originaltX; - tY = originaltY; - // Project out to shotgundistance - if (spell.shotgunDistance) { - let dx = tX - entity.x; - let dy = tY - entity.y; - let dmult = KDistEuclidean(dx, dy); - if (dmult != 0) dmult = 1/dmult; - - tX = entity.x + dx*dmult * spell.shotgunDistance; - tY = entity.y + dy*dmult * spell.shotgunDistance; - } - // Add spread - if (spell.shotgunSpread) { - let ang = KDRandom() * 2 * Math.PI; - tX += spell.shotgunSpread * ((castI+1) / castCount) * Math.cos(ang); - tY += spell.shotgunSpread * ((castI+1) / castCount) * Math.sin(ang); - } - - let speed = originalSpeed; - // Add speedSpread - if (spell.shotgunSpeedBonus && castCount > 1) { - speed += spell.shotgunSpeedBonus * (castI / (castCount - 1)); - } - - - let cast = spell.spellcast ? Object.assign({}, spell.spellcast) : undefined; - - if (cast) { - if (cast.target == "target") { - if (tX == entity.x + moveDirection.x && tY == entity.y + moveDirection.y && !cast.noTargetMoveDir) { - cast.tx = tX + moveDirection.x; - cast.ty = tY + moveDirection.y; - } else { - cast.tx = tX; - cast.ty = tY; - } - } else if (cast.target == "origin") { - cast.tx = entity.x; - cast.ty = entity.y; - } - if (cast.directional) { - if (cast.randomDirection) { - let slots = []; - for (let XX = -1; XX <= 1; XX++) { - for (let YY = -1; YY <= 1; YY++) { - if ((XX != 0 || YY != 0) && KinkyDungeonNoEnemy(entity.x + XX, entity.y + YY, true) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(entity.x + XX, entity.y + YY))) slots.push({x:XX, y:YY}); - } - } - if (slots.length > 0) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - cast.mx = slot.x; - cast.my = slot.y; - moveDirection.x = slot.x; - moveDirection.y = slot.y; - } else { - cast.mx = moveDirection.x; - cast.my = moveDirection.y; - } - } else if (cast.randomDirectionPartial || cast.randomDirectionFallback) { - if (cast.randomDirectionFallback && (!cast.alwaysRandomBuff || !KDEntityHasBuff(entity, cast.alwaysRandomBuff)) - && KinkyDungeonNoEnemy(entity.x + moveDirection.x, entity.y + moveDirection.y, true) - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(entity.x + moveDirection.x, entity.y + moveDirection.y))) { - - cast.mx = moveDirection.x; - cast.my = moveDirection.y; - } else { - let slots = []; - let dist = KDistEuclidean(entity.x - tX, entity.y - tY); - for (let XX = -1; XX <= 1; XX++) { - for (let YY = -1; YY <= 1; YY++) { - if ((XX != 0 || YY != 0) && KinkyDungeonNoEnemy(entity.x + XX, entity.y + YY, true) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(entity.x + XX, entity.y + YY)) - && (entity.x + XX != tX || entity.y + YY != tY) - && KDistEuclidean(entity.x + XX - tX, entity.y + YY - tY) <= dist + 0.1) slots.push({x:XX, y:YY}); - } - } - if (slots.length > 0) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - cast.mx = slot.x; - cast.my = slot.y; - moveDirection.x = slot.x; - moveDirection.y = slot.y; - } else { - cast.mx = moveDirection.x; - cast.my = moveDirection.y; - if (entity.x + cast.mx == tX && entity.y + cast.my == tY) { - cast.tx += moveDirection.x; - cast.ty += moveDirection.y; - } - } - } - } else { - cast.mx = moveDirection.x; - cast.my = moveDirection.y; - } - - } - if (cast.aimAtTarget && KinkyDungeonEnemyAt(targetX, targetY) && KDCanSeeEnemy(KinkyDungeonEnemyAt(targetX, targetY), KDistEuclidean(entity.x - targetX, entity.y - targetY))) { - cast.targetID = KinkyDungeonEnemyAt(targetX, targetY).id; - } - } - - - if (spell.type == "bolt") { - let size = (spell.size) ? spell.size : 1; - let xx = entity.x; - let yy = entity.y; - noiseX = entity.x; - noiseY = entity.y; - if (!bullet || (bullet.spell && bullet.spell.cast && bullet.spell.cast.offset)) { - xx += moveDirection.x; - yy += moveDirection.y; - } - if (spell.effectTilePre) { - KDCreateAoEEffectTiles(tX-entity.x,tY - entity.y, spell.effectTilePre, spell.effectTileDurationModPre, (spell.aoe) ? spell.aoe : 0.5); - } - let b = KinkyDungeonLaunchBullet(xx, yy, - tX-entity.x,tY - entity.y, - speed, {noSprite: spell.noSprite, faction: faction, name:spell.name, block: spell.block, width:size, height:size, summon:spell.summon, - targetX: tX, targetY: tY, - source: entity?.player ? -1 : entity?.id, cast: cast, dot: spell.dot, - bulletColor: spell.bulletColor, bulletLight: spell.bulletLight, - bulletSpin: spell.bulletSpin, - effectTile: spell.effectTile, effectTileDurationMod: spell.effectTileDurationMod, - effectTileTrail: spell.effectTileTrail, effectTileDurationModTrail: spell.effectTileDurationModTrail, effectTileTrailAoE: spell.effectTileTrailAoE, - passthrough: spell.noTerrainHit, noEnemyCollision: spell.noEnemyCollision, alwaysCollideTags: spell.alwaysCollideTags, nonVolatile:spell.nonVolatile, noDoubleHit: spell.noDoubleHit, - pierceEnemies: spell.pierceEnemies, piercing: spell.piercing, events: spell.events, - lifetime:miscast || selfCast ? 1 : (spell.bulletLifetime ? spell.bulletLifetime : 1000), origin: {x: entity.x, y: entity.y}, range: spellRange, hit:spell.onhit, - damage: {evadeable: spell.evadeable, damage:spell.power, type:spell.damage, distract: spell.distract, distractEff: spell.distractEff, bindEff: spell.bindEff, bind: spell.bind, bindType: spell.bindType, boundBonus: spell.boundBonus, time:spell.time, flags:spell.damageFlags}, spell: spell}, miscast); - b.visual_x = entity.x; - b.visual_y = entity.y; - data.bulletfired = b; - } else if (spell.type == "inert" || spell.type == "dot") { - let sz = spell.size; - if (!sz) sz = 1; - if (spell.meleeOrigin) { - tX = entity.x + moveDirection.x; - tY = entity.y + moveDirection.y; - } - let b = KinkyDungeonLaunchBullet(tX, tY, - moveDirection.x,moveDirection.y, - 0, { - noSprite: spell.noSprite, faction: faction, name:spell.name, block: spell.block, width:sz, height:sz, summon:spell.summon, - targetX: tX, targetY: tY, - source: entity?.player ? -1 : entity?.id, lifetime:spell.delay + - (spell.delayRandom ? Math.floor(KDRandom() * spell.delayRandom) : 0), cast: cast, dot: spell.dot, events: spell.events, alwaysCollideTags: spell.alwaysCollideTags, - bulletColor: spell.bulletColor, bulletLight: spell.bulletLight, - bulletSpin: spell.bulletSpin, - passthrough:(spell.CastInWalls || spell.WallsOnly || spell.noTerrainHit), hit:spell.onhit, noDoubleHit: spell.noDoubleHit, effectTile: spell.effectTile, effectTileDurationMod: spell.effectTileDurationMod, - damage: spell.type == "inert" ? null : {evadeable: spell.evadeable, damage:spell.power, type:spell.damage, distract: spell.distract, distractEff: spell.distractEff, bindEff: spell.bindEff, bind: spell.bind, bindType: spell.bindType, boundBonus: spell.boundBonus, time:spell.time, flags:spell.damageFlags}, spell: spell - }, miscast); - data.bulletfired = b; - } else if (spell.type == "hit") { - let sz = spell.size; - if (!sz) sz = 1; - if (spell.meleeOrigin) { - tX = entity.x + moveDirection.x; - tY = entity.y + moveDirection.y; - } - let b = {x: tX, y:tY, - vx: moveDirection.x,vy: moveDirection.y, born: 1, - bullet: {noSprite: spell.noSprite, faction: faction, name:spell.name, block: spell.block, width:sz, height:sz, summon:spell.summon, - targetX: tX, targetY: tY, - source: entity?.player ? -1 : entity?.id, lifetime:spell.lifetime, cast: cast, dot: spell.dot, events: spell.events, aoe: spell.aoe, - passthrough:(spell.CastInWalls || spell.WallsOnly || spell.noTerrainHit), hit:spell.onhit, noDoubleHit: spell.noDoubleHit, effectTile: spell.effectTile, effectTileDurationMod: spell.effectTileDurationMod, - damage: {evadeable: spell.evadeable, damage:spell.power, type:spell.damage, distract: spell.distract, distractEff: spell.distractEff, bindEff: spell.bindEff, bind: spell.bind, bindType: spell.bindType, boundBonus: spell.boundBonus, time:spell.time, flags:spell.damageFlags}, spell: spell}}; - KinkyDungeonBulletHit(b, 1); - data.bulletfired = b; - } else if (spell.type == "buff") { - let aoe = spell.aoe; - let casted = false; - if (!aoe) aoe = 0.1; - if (Math.sqrt((KinkyDungeonPlayerEntity.x - targetX) * (KinkyDungeonPlayerEntity.x - targetX) + (KinkyDungeonPlayerEntity.y - targetY) * (KinkyDungeonPlayerEntity.y - targetY)) <= aoe) { - for (let buff of spell.buffs) { - if (buff.player) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff); - if (KinkyDungeonPlayerEntity.x == targetX && KinkyDungeonPlayerEntity.y == targetY) data.target = KinkyDungeonPlayerEntity; - casted = true; - } - } - } - for (let e of KinkyDungeonEntities) { - if (Math.sqrt((e.x - targetX) * (e.x - targetX) + (e.y - targetY) * (e.y - targetY)) <= aoe) { - for (let buff of spell.buffs) { - if (!spell.filterTags || KDMatchTags(spell.filterTags, e)) { - if (!e.buffs) e.buffs = {}; - KinkyDungeonApplyBuff(e.buffs, buff); - if (e.x == targetX && e.y == targetY) data.target = e; - casted = true; - } - } - } - } - if (!casted) - return {result: "Fail", data: data}; - } else if (spell.type == "special") { - let ret = KinkyDungeonSpellSpecials[spell.special](spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast); - if (ret) { - if (!enemy && !bullet && player) { - KinkyDungeonSendEvent("playerCast", data); - } - return {result: ret, data: data}; - } - } - } - - tX = originaltX; - tY = originaltY; - - if (spell.extraCast) { - for (let extraCast of spell.extraCast) - KinkyDungeonCastSpell(targetX, targetY, KinkyDungeonFindSpell(extraCast.spell, true), undefined, undefined, undefined); - } - - if (spell.noise) { - KinkyDungeonMakeNoise(spell.noise, noiseX, noiseY); - } - - if (!enemy && !bullet && player) { // Costs for the player - KinkyDungeonSetFlag("PlayerCombat", 8); - - if (data.targetingSpellItem) { - KinkyDungeonChangeConsumable(KinkyDungeonTargetingSpellItem, -(KinkyDungeonTargetingSpellItem.useQuantity ? KinkyDungeonTargetingSpellItem.useQuantity : 1)); - KinkyDungeonTargetingSpellItem = null; - if (!spell.noAggro) - KinkyDungeonAggroAction('item', {}); - } else if (data.targetingSpellWeapon) { - let special = KinkyDungeonPlayerDamage ? KinkyDungeonPlayerDamage.special : null; - if (special) { - let energyCost = KinkyDungeonPlayerDamage.special.energyCost; - if (KDGameData.AncientEnergyLevel < energyCost) return; - if (energyCost) KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - energyCost); - } - KinkyDungeonTargetingSpellItem = null; - if (!spell.noAggro) - KinkyDungeonAggroAction('item', {}); - } else { - if (!spell.noAggro) - KinkyDungeonAggroAction('magic', {}); - if (spell.school) KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "cast_" + spell.school.toLowerCase(), 1); - } - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - KDSendSpellCast(spell.name); - - KinkyDungeonSendEvent("playerCast", data); - - //let cost = spell.staminacost ? spell.staminacost : KinkyDungeonGetCost(spell.level); - - //KinkyDungeonStatWillpowerExhaustion += spell.exhaustion + 1; - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "cast", 1); - if (spell.tags) { - for (let t of spell.tags) { - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "cast_" + t, 1); - } - } - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - if (spell.staminacost) KinkyDungeonChangeStamina(-spell.staminacost); - if (spell.channel) { - KinkyDungeonSetFlag("channeling", spell.channel); - KinkyDungeonSlowMoveTurns = Math.max(KinkyDungeonSlowMoveTurns, spell.channel); - KinkyDungeonSleepTime = CommonTime() + 200; - } - if (spell.noise) { - if (spell.components && spell.components.includes("Verbal")) - KinkyDungeonAlert = 3;//Math.max(spell.noise, KinkyDungeonAlert); - } - KinkyDungeonLastAction = "Spell"; - KinkyDungeonMiscastPityModifier = 0; - } else { - KinkyDungeonSendEvent("spellCast", data); - } - - return {result: "Cast", data: data}; -} - -function KinkyDungeonClickSpellChoice(I, CurrentSpell) { - // Set spell choice - KDSendInput("spellChoice", {I:I, CurrentSpell: CurrentSpell}); - //if (KinkyDungeonTextMessageTime > 0 && KinkyDungeonTextMessagePriority > 3) - //KinkyDungeonDrawState = "Game"; - if (KinkyDungeonSpellChoicesToggle[I] && KinkyDungeonSpells[KinkyDungeonSpellChoices[I]].cancelAutoMove) { - KinkyDungeonFastMove = false; - KinkyDungeonFastMoveSuppress = false; - } -} - -function KinkyDungeonHandleMagic() { - //if (KinkyDungeonPlayer.CanInteract()) { // Allow turning pages - if (KinkyDungeonCurrentPage > 0 && MouseIn(canvasOffsetX_ui + 100, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 60)) { - if (KinkyDungeonPreviewSpell) KinkyDungeonPreviewSpell = undefined; - else { - KinkyDungeonCurrentPage -= 1; - for (let i = 0; i < 30; i++) - if (KinkyDungeonCurrentPage > 0 && KinkyDungeonSpells[KinkyDungeonCurrentPage] && (KinkyDungeonSpells[KinkyDungeonCurrentPage].hide)) KinkyDungeonCurrentPage -= 1; - } - return true; - } - if (KinkyDungeonCurrentPage < KinkyDungeonSpells.length-1 && MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale - 325, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 60)) { - if (KinkyDungeonPreviewSpell) KinkyDungeonPreviewSpell = undefined; - else { - KinkyDungeonCurrentPage += 1; - for (let i = 0; i < 30; i++) - if (KinkyDungeonSpells[KinkyDungeonCurrentPage] && KinkyDungeonSpells[KinkyDungeonCurrentPage].hide) KinkyDungeonCurrentPage += 1; - } - return true; - } - - if (KinkyDungeonSpells[KinkyDungeonCurrentPage] && !KinkyDungeonPreviewSpell) { - - if (MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale * 0.5 - 200, canvasOffsetY_ui - 70 + 483*KinkyDungeonBookScale, 400, 60)) { - KDSendInput("spellCastFromBook", {CurrentSpell: KinkyDungeonCurrentPage}); - KinkyDungeonTargetingSpell = KinkyDungeonHandleSpellCast(KinkyDungeonSpells[KinkyDungeonCurrentPage]); - KDModalArea = false; - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = null; - KinkyDungeonDrawState = "Game"; - } - } else if (KinkyDungeonPreviewSpell && MouseIn(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 40, canvasOffsetY_ui + 125, 225, 60)) { - if (KinkyDungeonPreviewSpell.hideLearned) KinkyDungeonDrawState = "MagicSpells"; - KDSendInput("spellLearn", {SpellName: KinkyDungeonPreviewSpell.name}); - return true; - } - - return true; -} - -function KDGetPrerequisite(spell) { - if (!spell.prerequisite) return ""; - if (typeof spell.prerequisite === "string") { - return TextGet("KinkyDungeonSpell" + spell.prerequisite); - } - let str = ""; - for (let pr of spell.prerequisite) { - if (!str) { - str = TextGet("KinkyDungeonSpell" + pr); - } else { - str = str + "/" + TextGet("KinkyDungeonSpell" + pr); - } - } - return str; -} - -function KinkyDungeonCheckSpellPrerequisite(spell) { - if (!spell || !spell.prerequisite) return true; - if (spell.upcastFrom && !KDHasSpell(spell.upcastFrom)) return false; - if (typeof spell.prerequisite === "string") { - let spell_prereq = KinkyDungeonSearchSpell(KinkyDungeonSpells, spell.prerequisite); - if (spell_prereq) return true; - return false; - } else { - for (let pr of spell.prerequisite) { - let spell_prereq = KinkyDungeonSearchSpell(KinkyDungeonSpells, pr); - if (spell_prereq) return true; - } - return false; - } -} - -// Patch un-translated english string display issue in chinese Language game mode -// the using detect lib from https://github.com/richtr/guessLanguage.js -// i rewrite the origin lib useless callback mode to return mode -// now only fix chinese -function KinkyDungeonDetectLanguageForMaxWidth(str, maxWidthTranslate, maxWidthEnglish) { - try { - // @ts-ignore - if (KDBigLanguages.includes(TranslationLanguage) && guessLanguage) { - // @ts-ignore - let languageName = guessLanguage.name(str); - // console.log('KinkyDungeonDetectLanguageForMaxWidth languageName', languageName); - if (languageName === "unknown") { - return maxWidthTranslate; - } else if (KDBigLanguages2.includes(languageName)) { - return maxWidthTranslate; - } else if (languageName === "English") { - return maxWidthEnglish; - } else { - // if not Chinese then all are english fallback - return maxWidthEnglish; - } - } else { - return maxWidthEnglish; - } - } catch (e) { - return maxWidthEnglish; - } -} - -// https://stackoverflow.com/questions/14484787/wrap-text-in-javascript -function KinkyDungeonWordWrap(str, maxWidthTranslate, maxWidthEnglish) { - let newLineStr = "\n"; - let res = ''; - // console.log('KinkyDungeonDetectLanguageForMaxWidth before', str, maxWidth); - let maxWidth = KinkyDungeonDetectLanguageForMaxWidth(str, maxWidthTranslate, maxWidthEnglish); - // console.log('KinkyDungeonDetectLanguageForMaxWidth after', maxWidth); - - // Check language - if (maxWidth == maxWidthTranslate){ - //CJK - while (str.length > maxWidth) { - let found = false; - let maxCJKWidth = maxWidth; - - for (let i = 0; i <= maxCJKWidth+1; i++) { - //Numbers are calculated as 0.5 characters,Space are calculated as 0 characters - if (KinkyDungeonTestWhite(str.charAt(i),"Num")) {maxCJKWidth += 0.5;} - if (KinkyDungeonTestWhite(str.charAt(i),"English")) {maxCJKWidth += 1;} - if (KinkyDungeonTestWhite(str.charAt(i),"CJKP") && (maxCJKWidth-i) <= 2) { - //Inserts new line at first punctuation and seventh character of the line - res = res + [str.slice(0, i+1), newLineStr].join(''); - str = str.slice(i + 1); - found = true; - break; - } - } - - //Round up - maxCJKWidth = Math.ceil(maxCJKWidth); - - if (!found) { - if ((str.length - maxCJKWidth) <= 2) { - //If the last line does not satisfy at least 2 characters, the last 2 characters are moved to the previous line - res += [str.slice(0, maxCJKWidth+3), newLineStr].join(''); - str = str.slice(maxCJKWidth+3); - } else if ((str.length - maxCJKWidth) <= 5){ - //If the last line does not satisfy at least 5 characters, the last character of the previous line is moved to the last line - res += [str.slice(0, maxCJKWidth-1), newLineStr].join(''); - str = str.slice(maxCJKWidth-1); - } else { - res += [str.slice(0, maxCJKWidth), newLineStr].join(''); - str = str.slice(maxCJKWidth); - } - } - } - } else { - //Engilsh - while (str.length > maxWidth) { - let found = false; - // Inserts new line at first whitespace of the line - for (let i = maxWidth - 1; i >= 0; i--) { - if (KinkyDungeonTestWhite(str.charAt(i),"English")) { - res = res + [str.slice(0, i), newLineStr].join(''); - str = str.slice(i + 1); - found = true; - break; - } - } - // Inserts new line at maxWidth position, the word is too long to wrap - if (!found) { - res += [str.slice(0, maxWidth), newLineStr].join(''); - str = str.slice(maxWidth); - } - - } - } - - - return res + str; -} - -function KinkyDungeonTestWhite(x,language) { - if (language == "English") { - let white = new RegExp(/^\s$/); - return white.test(x.charAt(0)); - } - if (language == "CJKP") { - return CJKcheck(x.charAt(0),3,"test"); - } - if (language == "Num") { - let white = new RegExp(/^[0-9.]$/); - return white.test(x.charAt(0)); - } -} - -function KDSchoolColor(school) { - switch (school) { - case "Elements": return "#ff4444"; - case "Conjure": return "#77cc99"; - case "Illusion": return "#8877ff"; - } - - return KDTextTan; -} - -function KinkyDungeonDrawMagic() { - KinkyDungeonDrawMessages(true); - DrawImageZoomCanvas(KinkyDungeonRootDirectory + "MagicBook.png", MainCanvas, 0, 0, 640, 483, canvasOffsetX_ui, canvasOffsetY_ui, 640*KinkyDungeonBookScale, 483*KinkyDungeonBookScale, false); - - if (KinkyDungeonSpells[KinkyDungeonCurrentPage] || KinkyDungeonPreviewSpell) { - let spell = KinkyDungeonPreviewSpell ? KinkyDungeonPreviewSpell : KinkyDungeonSpells[KinkyDungeonCurrentPage]; - - let SchoolColor = KDTextTan; - if (spell.school) SchoolColor = KDSchoolColor(spell.school); - - DrawTextKD(TextGet("KinkyDungeonSpell"+ spell.name), canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5, "#000000", SchoolColor); - DrawTextKD(TextGet("KinkyDungeonSpellsSchool" + spell.school), canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 40, "#000000", SchoolColor); - - if (spell.prerequisite) { - DrawTextKD(TextGet("KDPrerequisite"), canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale*0.6, KDTextGray0, KDTextTan); - DrawTextFitKD(KDGetPrerequisite(spell), canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale*0.6 + 40, 640*KinkyDungeonBookScale * 0.35, KDTextGray0, KDTextTan); - } - - if (spell.upcastFrom) { - DrawTextFitKD(TextGet("KDUpcastFrom").replace("SPELL", TextGet("KinkyDungeonSpell" + spell.upcastFrom)), - canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale*0.4 + 40, 640*KinkyDungeonBookScale * 0.35, KDTextGray0, KDTextTan); - DrawTextFitKD(TextGet("KDUpcastLevel").replace("LEVEL", "" + spell.upcastLevel), - canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale*0.4, 640*KinkyDungeonBookScale * 0.35, KDTextGray0, KDTextTan); - } - - if (KinkyDungeonPreviewSpell) DrawTextKD(TextGet("KinkyDungeonMagicCost") + KinkyDungeonGetCost(spell), canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/2 + 150, KDTextGray0, KDTextTan); - DrawTextKD(TextGet("KinkyDungeonMagicManaCost") + (spell.manacost * 10), canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/2 + 195, KDTextGray0, KDTextTan); - let textSplit = KinkyDungeonWordWrap(TextGet("KinkyDungeonSpellDescription"+ spell.name).replace("DamageDealt", "" + (spell.power * 10)).replace("Duration", spell.time).replace("LifeTime", spell.lifetime).replace("DelayTime", spell.delay).replace("BlockAmount", "" + (10 * spell.block)), 14, 32).split('\n'); - let i = 0; - for (let N = 0; N < textSplit.length; N++) { - DrawTextKD(textSplit[N], - canvasOffsetX_ui + 640*KinkyDungeonBookScale*(1-1/3), canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + i * 36, KDTextGray0, KDTextTan, 24); i++;} - - i = 0; - if (spell.components.length > 0) { - - if (spell.components.includes("Verbal")) {DrawTextKD(TextGet("KinkyDungeonComponentsVerbal"), canvasOffsetX_ui + 640*KinkyDungeonBookScale*(1-1/3), canvasOffsetY_ui + 483*KinkyDungeonBookScale/2 + 215 - 40*i, KDTextGray0, KDTextTan); i++;} - if (spell.components.includes("Arms")) {DrawTextKD(TextGet("KinkyDungeonComponentsArms"), canvasOffsetX_ui + 640*KinkyDungeonBookScale*(1-1/3), canvasOffsetY_ui + 483*KinkyDungeonBookScale/2 + 215 - 40*i, KDTextGray0, KDTextTan); i++;} - if (spell.components.includes("Legs")) {DrawTextKD(TextGet("KinkyDungeonComponentsLegs"), canvasOffsetX_ui + 640*KinkyDungeonBookScale*(1-1/3), canvasOffsetY_ui + 483*KinkyDungeonBookScale/2 + 215 - 40*i, KDTextGray0, KDTextTan); i++;} - DrawTextKD(TextGet("KinkyDungeonComponents"), canvasOffsetX_ui + 640*KinkyDungeonBookScale*(1-1/3), canvasOffsetY_ui + 483*KinkyDungeonBookScale/2 + 215 - 40*i, "#000000", KDTextTan); i = 1; - - } - - if (!KinkyDungeonPreviewSpell) { - - if (!spell.passive && !spell.upcastFrom) { - let w = 225; - let h = 50; - let x_start = canvasOffsetX_ui + 640*KinkyDungeonBookScale + 40; - let y_start = canvasOffsetY_ui + 150; - for (let I = 0; I < KinkyDungeonSpellChoiceCount; I++) { - let x = x_start + w * Math.floor(I / KinkyDungeonSpellChoiceCountPerPage); - let y = y_start + h * (I % KinkyDungeonSpellChoiceCountPerPage); - - if (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]]) - DrawImageEx(KinkyDungeonRootDirectory + "Spells/" + KinkyDungeonSpells[KinkyDungeonSpellChoices[I]].name + ".png", x - h, y, { - Width: h, - Height: h, - }); - DrawTextFitKD(`${1 + (I % KinkyDungeonSpellChoiceCountPerPage)}`, x - h, y + h*0.5, h*0.25, "#efefef", "#888888"); - // @ts-ignore - DrawButtonKDEx("SpellSlotBook" + I, (bdata) => { - if (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]] == spell) { - KDSendInput("spellRemove", {I:I}); - } else { - if (KinkyDungeonSpellChoices.includes(KinkyDungeonCurrentPage)) { - KDSendInput("spellRemove", {I:KinkyDungeonSpellChoices.indexOf(KinkyDungeonCurrentPage)}); - } - KinkyDungeonClickSpellChoice(I, KinkyDungeonCurrentPage); - } - return true; - }, true, x, y, w - 25 - h, h - 5, (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]] ? (TextGet("KinkyDungeonSpell" + KinkyDungeonSpells[KinkyDungeonSpellChoices[I]].name)) : ""), - KinkyDungeonSpells[KinkyDungeonSpellChoices[I]] && KinkyDungeonSpells[KinkyDungeonSpellChoices[I]].name == spell.name ? "White" : KDTextGray3, "", ""); - } - } - - - if (!spell.passive && !(spell.type == "passive") && !spell.upcastFrom) - DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale * 0.5 - 200, canvasOffsetY_ui - 70 + 483*KinkyDungeonBookScale, 400, 60, TextGet("KinkyDungeonSpellCastFromBook") - .replace("XXX", KinkyDungeonStatsChoice.has("Disorganized") ? "3" : (KinkyDungeonStatsChoice.has("QuickDraw") ? "No" : "1")), "White", "", "", false, true, KDButtonColor); - } else { - let cost = KinkyDungeonGetCost(spell); - DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale + 40, canvasOffsetY_ui + 125, 225, 60, TextGet("KinkyDungeonSpellsBuy"), - (KinkyDungeonSpellPoints >= cost && KinkyDungeonCheckSpellPrerequisite(spell)) ? "White" : "Pink", "", ""); - } - } - - if (KinkyDungeonCurrentPage > 0) { - DrawButtonVis(canvasOffsetX_ui + 100, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 60, TextGet("KinkyDungeonBookLastPage"), "White", "", "", false, true, KDButtonColor); - } - if (KinkyDungeonCurrentPage < KinkyDungeonSpells.length-1) { - DrawButtonVis(canvasOffsetX_ui + 640*KinkyDungeonBookScale - 325, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 60, TextGet("KinkyDungeonBookNextPage"), "White", "", "", false, true, KDButtonColor); - } - if (KDSwapSpell != -1) { - DrawTextKD(TextGet("KinkyDungeonMagicSpellsQuick").replace("SPELLNAME", TextGet("KinkyDungeonSpell" + KinkyDungeonSpells[KinkyDungeonSpellChoices[KDSwapSpell]].name)), canvasOffsetX_ui + 600, 900, "white", KDTextGray0); - } else { - DrawTextKD(TextGet("KinkyDungeonSpellsLevels") - .replace("SPELLPOINTS", "" + KinkyDungeonSpellPoints), canvasOffsetX_ui + 600, 890, "white", KDTextGray0); - } - -} - - -let selectedFilters = ["learnable"]; -let genericfilters = ['learnable', 'unlearned', 'noupgrade', 'yesupgrade', "upcast"]; - -let KDSpellListIndex = 0; -let KDSpellListIndexVis = 0; -let KDMaxSpellPerColumn = 8; -let KDMaxSpellYY = 480; - -function KDFilterSpellPages() { - if (!KDGameData.HiddenSpellPages) return KinkyDungeonLearnableSpells; - let pages = []; - for (let i = 0; i < KinkyDungeonLearnableSpells.length; i++) { - if (!KDGameData.HiddenSpellPages[KinkyDungeonSpellPages[i]]) { - pages.push(KinkyDungeonLearnableSpells[i]); - } - } - return pages; -} -function KDFilterSpellPageNames() { - if (!KDGameData.HiddenSpellPages) return KinkyDungeonSpellPages; - let pages = []; - for (let i = 0; i < KinkyDungeonLearnableSpells.length; i++) { - if (!KDGameData.HiddenSpellPages[KinkyDungeonSpellPages[i]]) { - pages.push(KinkyDungeonSpellPages[i]); - } - } - return pages; -} - -// @ts-ignore -function KDCorrectCurrentSpellPage(pages) { - let ret = 0; - for (let i = 0; i < KinkyDungeonCurrentSpellsPage; i++) { - if (!KDGameData.HiddenSpellPages[KinkyDungeonSpellPages[i]]) { - ret += 1; - } - } - return ret; -} - -function KinkyDungeonListSpells(Mode) { - let i = 0; - //let ii = 0; - //let maxY = 560; - let XX = 0; - let spacing = 60; - let subspell_reduction = 20; - let ypadding = 10; - let yPad = 120 + MagicSpellsUIShift; - let buttonwidth = 280; - let xpadding = 20; - let col = 0; - let ypadding_min = -2; - - let weight = 5; - KDSpellListIndexVis = (KDSpellListIndex + KDSpellListIndexVis * (weight-1)) / weight; - - let pages = KDFilterSpellPages(); - let currentPage = KinkyDungeonCurrentSpellsPage; - let spellPages = pages[currentPage]; - let pageNames = KDFilterSpellPageNames(); - let columnLabels = KDColumnLabels[currentPage]; - let extraFilters = filtersExtra[currentPage]; - - // Draw filters - if (Mode == "Draw") { - let x = 4 * (buttonwidth + xpadding); - let y = 25 + canvasOffsetY_ui; - let filterlist = Object.assign([], filters); - if (extraFilters) { - for (let ff of extraFilters) { - filterlist.push(ff); - } - } - // Now we have our total filters, time to draw - for (let f of filterlist) { - let ticked = selectedFilters.includes(f); - // @ts-ignore - DrawButtonKDEx("filter" + f, (bdata) => { - if (selectedFilters.includes(f)) - selectedFilters.splice(selectedFilters.indexOf(f), 1); - else - selectedFilters.push(f); - return true; - }, true, canvasOffsetX_ui + x, y, buttonwidth, 36, TextGet("KinkyDungeonFilter" + f), selectedFilters.includes(f) ? "#ffffff" : "#999999", ticked ? (KinkyDungeonRootDirectory + "UI/Tick.png") : "", "", false, true); - y += 42; - } - } - - if (columnLabels) { - for (let column = 0; column < columnLabels.length; column++) { - let x = canvasOffsetX_ui + column * (buttonwidth + xpadding); - let y = yPad - 40 + canvasOffsetY_ui; - DrawTextKD(TextGet("KinkyDungeonColumn" + columnLabels[column]), x + buttonwidth/2, y + 20, "#ffffff", KDTextGray0); - } - } - - - let longestList = 0; - for (let pg of spellPages) { - longestList = Math.max(longestList, pg.length); - } - if (KDSpellListIndex > longestList) KDSpellListIndex = 0; - - // @ts-ignore - DrawButtonKDEx("spellsUp", (bdata) => { - KDSpellListIndex = Math.max(0, KDSpellListIndex - 3); - return true; - }, KDSpellListIndex > 0, 910, 800, 90, 40, "", KDSpellListIndex > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png"); - // @ts-ignore - DrawButtonKDEx("spellsDown", (bdata) => { - KDSpellListIndex = Math.max(0, Math.min(longestList - KDMaxSpellPerColumn + 1, KDSpellListIndex + 3)); - return true; - }, KDSpellListIndex < longestList - KDMaxSpellPerColumn + 1, 1160, 800, 90, 40, "", KDSpellListIndex < longestList - KDMaxSpellPerColumn + 1 ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png"); - - // Draw the spells themselves - for (let pg of spellPages) { - let column = col;//Math.floor((spacing * i) / (maxY)); - i = 0; - let iii = 0; - - let YY = 0; - for (let sp of pg) { - let spell = KinkyDungeonFindSpell(sp, false); - let prereq = spell ? KinkyDungeonCheckSpellPrerequisite(spell) : false; - let prereqHost = spell ? (spell.upcastFrom && KinkyDungeonCheckSpellPrerequisite(KinkyDungeonFindSpell(spell.upcastFrom))) : false; - let learned = spell ? KinkyDungeonSpellIndex(spell.name) >= 0 : false; - let upgrade = spell ? spell.passive : false; - let passive = spell ? spell.type == "passive" : false; - let upcast = spell ? spell.upcastFrom : false; - if (spell - && (KDSwapSpell == -1 || KinkyDungeonSpellIndex(spell.name) >= 0) - //&& i < KDMaxSpellPerColumn - && YY < KDMaxSpellYY + spacing - && (!spell.hideLearned || !learned) - && (!spell.hideUnlearnable || prereq || learned) - && (selectedFilters.length == 0 || (selectedFilters.every((element) => {return genericfilters.includes(element) || (spell.tags && spell.tags.includes(element));}))) - && (!selectedFilters.includes("learnable") || (prereq || learned || prereqHost)) - && (!selectedFilters.includes("unlearned") || (!learned)) - && (!selectedFilters.includes("noupgrade") || (!upgrade && !upcast)) - && (!selectedFilters.includes("yesupgrade") || (upgrade || passive)) - && (!selectedFilters.includes("upcast") || (upcast))) { - - if (iii < Math.round(KDSpellListIndexVis)) { - iii += 1; - continue; - } - XX = column * (buttonwidth + xpadding); - //ii = i;// - column * Math.ceil(maxY / spacing); - - if (!spell.upcastFrom && i > 0) { - YY += ypadding; - } - - let cost = KinkyDungeonGetCost(spell); - let suff = `${cost}`; - let yy = yPad + canvasOffsetY_ui + YY + (spell.upcastFrom ? 2 : 0); - let h = spacing - ypadding + (spell.upcastFrom ? -subspell_reduction : 0); - let w = buttonwidth + (spell.upcastFrom ? -30 : 0); - let xx = canvasOffsetX_ui + XX + (spell.upcastFrom ? 30 : 0); - - if (Mode == "Draw") { - let color = KDSwapSpell == -1 ? "#bcbcbc" : "#777777"; - let index = KinkyDungeonSpellIndex(spell.name); - if (index >= 0 && (KDSwapSpell == -1 || !KinkyDungeonSpellChoices.includes(index))) { - color = "#ffffff"; - suff = ""; - } else if (!KinkyDungeonCheckSpellPrerequisite(spell)) { - color = "#555555"; - //suff = ""; - } - if (!spell.passive) - KDDraw(kdcanvas, kdpixisprites, "spIcon" + spell.name, KinkyDungeonRootDirectory + "Spells/" + spell.name + ".png", - xx, - yy, - h, - h, - undefined, - { - zIndex: 110, - alpha: index >= 0 ? 1.0 : 0.5 - }, - ); - if (index >= 0) - KDDraw(kdcanvas, kdpixisprites, "spIconTick" + spell.name, KinkyDungeonRootDirectory + "UI/" + "CheckSmall" + ".png", - xx + w - 30, - yy + h/2-15, - 30, - 30, - undefined, - { - zIndex: 110, - }, - ); - DrawButtonVis(xx, - yy, - w, - h, - "", color, - "", "", false, true, (index >= 0) ? "#070707" : "#040404", - // Image: KinkyDungeonSpellChoices.includes(index) ? (KinkyDungeonRootDirectory + "UI/Tick.png") : "" - (spell.upcastFrom ? 20 : 24), - false, - false, - 20, - { - alpha: index >= 0 ? 0.9 : 0.9 - }); - DrawTextFitKD(TextGet("KinkyDungeonSpell" + spell.name), - xx + h + 2 + (spell.upcastFrom ? 0 : 8), - yy + h/2, - w - h*1.75, color, undefined, (spell.upcastFrom ? 18 : 22), "left", undefined, undefined, false); - DrawTextFitKD(suff, - xx + w - 8, - yy + h/2, - h, KinkyDungeonSpellPoints >= cost ? color : "#ff5555", undefined, 20, "right", undefined, undefined, false); - } else if (Mode == "Click") { - if (MouseIn(canvasOffsetX_ui + XX, yPad + canvasOffsetY_ui + YY, buttonwidth, spacing - ypadding)) return spell; - } - i++; - YY += h + ypadding_min; - } - } - col++; - } - - let procList = pageNames; - let adjLists = GetAdjacentList(procList, currentPage, 1); - let left = adjLists.left; - let right = adjLists.right; - - drawVertList(left.reverse(), canvasOffsetX_ui + 200/2 + 100, 100, 200, 25, 5, 18, (data) => { - // @ts-ignore - return (bdata) => { - KinkyDungeonCurrentSpellsPage = procList.indexOf(data.name); - return true; - }; - }, "KinkyDungeonSpellsPage"); - drawVertList(right, canvasOffsetX_ui - 200/2 + 1050, 100, 200, 25, 5, 18, (data) => { - // @ts-ignore - return (bdata) => { - KinkyDungeonCurrentSpellsPage = procList.indexOf(data.name); - return true; - }; - }, "KinkyDungeonSpellsPage"); - - return undefined; -} - -let MagicSpellsUIShift = -80; - -function KinkyDungeonDrawMagicSpells() { - - KinkyDungeonListSpells("Draw"); - MainCanvas.textAlign = "center"; - - - let pages = KDFilterSpellPages(); - let currentPage = KinkyDungeonCurrentSpellsPage;//KDCorrectCurrentSpellPage(pages); - let pageNames = KDFilterSpellPageNames(); - - DrawTextKD( - TextGet("KinkyDungeonSpellsPage").replace("NUM", "" + (currentPage + 1)).replace("TOTAL", "" + (pages.length)) + ": " + TextGet("KinkyDungeonSpellsPage" + pageNames[currentPage]), - canvasOffsetX_ui + 575, canvasOffsetY_ui + 25 + MagicSpellsUIShift, "white", KDTextGray0); - //DrawTextKD(TextGet("KinkyDungeonSpellsPoints") + KinkyDungeonSpellPoints, 650, 900, "white", KDTextGray0); - - MainCanvas.beginPath(); - MainCanvas.lineWidth = 3; - MainCanvas.strokeStyle = KDBorderColor; - MainCanvas.moveTo(canvasOffsetX_ui, canvasOffsetY_ui + 70 + MagicSpellsUIShift); - MainCanvas.lineTo(canvasOffsetX_ui + 1150, canvasOffsetY_ui + 70 + MagicSpellsUIShift); - MainCanvas.stroke(); - MainCanvas.closePath(); - - MainCanvas.textAlign = "center"; - if (KDSwapSpell != -1) { - DrawTextKD(TextGet( - "KinkyDungeonMagicSpellsQuick").replace( - "SPELLNAME", - (KinkyDungeonSpells[KinkyDungeonSpellChoices[KDSwapSpell]]) ? - TextGet("KinkyDungeonSpell" + KinkyDungeonSpells[KinkyDungeonSpellChoices[KDSwapSpell]].name) - : TextGet("KinkyDungeonSpellNone")), - canvasOffsetX_ui + 600, 900, "white", KDTextGray0); - } else { - DrawTextKD(TextGet("KinkyDungeonSpellsLevels") - .replace("SPELLPOINTS", "" + KinkyDungeonSpellPoints), canvasOffsetX_ui + 600, 890, "white", KDTextGray0); - } - DrawButtonVis(canvasOffsetX_ui + 0, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50, TextGet("KinkyDungeonSpellsPageBackFast"), "White", "", "", false, false, KDButtonColor); - DrawButtonVis(canvasOffsetX_ui + 1100, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50, TextGet("KinkyDungeonSpellsPageNextFast"), "White", "", "", false, false, KDButtonColor); - DrawButtonVis(canvasOffsetX_ui + 55, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50, TextGet("KinkyDungeonSpellsPageBack"), "White", "", "", false, false, KDButtonColor); - DrawButtonVis(canvasOffsetX_ui + 1045, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50, TextGet("KinkyDungeonSpellsPageNext"), "White", "", "", false, false, KDButtonColor); -} - - -function KinkyDungeonHandleMagicSpells() { - - - let pages = KDFilterSpellPages(); - - if (MouseIn(canvasOffsetX_ui + 50, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50)) { - if (KinkyDungeonCurrentSpellsPage > 0) KinkyDungeonCurrentSpellsPage -= 1; - else KinkyDungeonCurrentSpellsPage = pages.length - 1; - KDSpellListIndex = 0; - selectedFilters = selectedFilters.filter((filter) => { - return filters.includes(filter); - }); - return true; - } else if (MouseIn(canvasOffsetX_ui + 1045, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50)) { - if (KinkyDungeonCurrentSpellsPage < pages.length - 1) KinkyDungeonCurrentSpellsPage += 1; - else KinkyDungeonCurrentSpellsPage = 0; - KDSpellListIndex = 0; - selectedFilters = selectedFilters.filter((filter) => { - return filters.includes(filter); - }); - return true; - } else if (MouseIn(canvasOffsetX_ui + 0, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50)) { - if (KinkyDungeonCurrentSpellsPage > 0) { - if (KinkyDungeonCurrentSpellsPage > 2) KinkyDungeonCurrentSpellsPage -= 3; - else KinkyDungeonCurrentSpellsPage = 0; - } else KinkyDungeonCurrentSpellsPage = pages.length - 1; - KDSpellListIndex = 0; - selectedFilters = selectedFilters.filter((filter) => { - return filters.includes(filter); - }); - return true; - } else if (MouseIn(canvasOffsetX_ui + 1100, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50)) { - if (KinkyDungeonCurrentSpellsPage < pages.length - 1) { - if (KinkyDungeonCurrentSpellsPage < pages.length - 3) KinkyDungeonCurrentSpellsPage += 3; - else KinkyDungeonCurrentSpellsPage = pages.length - 1; - } - else KinkyDungeonCurrentSpellsPage = 0; - selectedFilters = selectedFilters.filter((filter) => { - return filters.includes(filter); - }); - KDSpellListIndex = 0; - return true; - } - - let spell = KinkyDungeonListSpells("Click"); - if (spell) { - if (KDSwapSpell == -1) { - KinkyDungeonSetPreviewSpell(spell); - } else if (!spell.upcastFrom) { - let index = KinkyDungeonSpellIndex(spell.name); - if (!KinkyDungeonSpellChoices.includes(index)) { - KinkyDungeonClickSpellChoice(KDSwapSpell, index); - KinkyDungeonDrawState = "Game"; - } - } - return true; - } - - return true; -} - -function KinkyDungeonSpellIndex(Name) { - for (let i = 0; i < KinkyDungeonSpells.length; i++) { - if (KinkyDungeonSpells[i].name == Name) return i; - } - return -1; -} - -function KinkyDungeonSetPreviewSpell(spell) { - let index = KinkyDungeonSpellIndex(spell.name); - KinkyDungeonPreviewSpell = index >= 0 ? null : spell; - if (!KinkyDungeonPreviewSpell) KinkyDungeonCurrentPage = index; - KinkyDungeonDrawState = "Magic"; -} - -function KinkyDungeonGetCompList(spell) { - let ret = ""; - if (spell.components) - for (let c of spell.components) { - if (ret) ret = ret + "/"; - if (c == "Verbal") ret = ret + (ret ? "V" : "Verbal"); - else if (c == "Arms") ret = ret + (ret ? "A" : "Arms"); - else if (c == "Legs") ret = ret + (ret ? "L" : "Legs"); - } - - //if (ret) - //return "(" + ret + ")"; - //else - return ret; -} - -function KinkyDungeonSendMagicEvent(Event, data, forceSpell) { - if (!KDMapHasEvent(KDEventMapSpell, Event)) return; - for (let i = 0; i < KinkyDungeonSpellChoices.length; i++) { - let spell = KinkyDungeonSpells[KinkyDungeonSpellChoices[i]]; - if (spell && spell.events) { - for (let e of spell.events) { - if (e.trigger == Event && (KinkyDungeonSpellChoicesToggle[i] || e.always || spell.name == forceSpell?.name)) { - KinkyDungeonHandleMagicEvent(Event, e, spell, data); - } - } - } - } - for (let i = 0; i < KinkyDungeonSpells.length; i++) { - let spell = KinkyDungeonSpells[i]; - if (spell && spell.passive && spell.events) { - for (let e of spell.events) { - if (e.trigger == Event) { - KinkyDungeonHandleMagicEvent(Event, e, spell, data); - } - } - } - } -} - - -function KDCastSpellToEnemies(fn, tX, tY, spell) { - let enList = KDNearbyEnemies(tX, tY, spell.aoe); - let cast = false; - - if (enList.length > 0) { - for (let en of enList) { - if (fn(en)) cast = true; - } - } - - return cast; -} - -/** - * Returns true if the enemy matches one of the tags - * @param {string[]} tags - * @param {entity} entity - * @returns {boolean} - */ -function KDMatchTags(tags, entity) { - if (tags) { - for (let tag of tags) { - if (entity?.Enemy?.tags[tag]) return true; - } - } - return false; -} diff --git a/Game/KinkyDungeonMagicCode.js b/Game/KinkyDungeonMagicCode.js deleted file mode 100644 index e34e57d00..000000000 --- a/Game/KinkyDungeonMagicCode.js +++ /dev/null @@ -1,981 +0,0 @@ -"use strict"; - -/** - * @type {Record void | string>} - */ -let KinkyDungeonSpellSpecials = { - "analyze": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let en = KinkyDungeonEnemyAt(targetX, targetY); - if (en) { - if (!en.buffs || !en.buffs.Analyze) { - if (!en.buffs) en.buffs = {}; - KinkyDungeonApplyBuff(en.buffs, {id: "Analyze", aura: "#ffffff", type: "DamageAmp", duration: 99999, power: 0.3, player: false, enemies: true, maxCount: 3, tags: ["defense", "damageTaken"]},); - KinkyDungeonApplyBuff(en.buffs, {id: "Analyze2", type: "Info", duration: 99999, power: 1.0, player: false, enemies: true, tags: ["info"]},); - } else return "Fail"; - } else { - let tile = KinkyDungeonTilesGet(targetX + "," + targetY); - if (tile) { - if (tile.Loot && tile.Roll) { - let event = KinkyDungeonLoot(MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], tile.Loot, tile.Roll, tile, true); - if (event.trap || tile.lootTrap) KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonShrineTooltipTrap"), "#ff0000", 2); - else KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonShrineTooltipNoTrap"), "lightgreen", 2); - - } else return "Fail"; - } else return "Fail"; - } - }, - "BoulderKick": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let en = KinkyDungeonEnemyAt(targetX, targetY); - if (en) { - if (en.Enemy.tags.summonedRock) { - en.hp = 0; - en.faction = "Player"; - en.rage = 0; - en.hostile = 0; - let spell2 = KinkyDungeonFindSpell("BoulderKicked", true); - let size = (spell2.size) ? spell2.size : 1; - let xx = entity.x; - let yy = entity.y; - if (!bullet || (bullet.spell && bullet.spell.cast && bullet.spell.cast.offset)) { - xx += moveDirection.x; - yy += moveDirection.y; - } - let b = KinkyDungeonLaunchBullet(xx, yy, - tX-entity.x,tY - entity.y, - spell2.speed, {noSprite: spell2.noSprite, faction: faction, name:spell2.name, block: spell2.block, width:size, height:size, summon:spell2.summon, cast: cast, dot: spell2.dot, - bulletColor: spell.bulletColor, bulletLight: spell.bulletLight, - effectTile: spell2.effectTile, effectTileDurationMod: spell2.effectTileDurationMod, - effectTileTrail: spell2.effectTileTrail, effectTileDurationModTrail: spell2.effectTileDurationModTrail, effectTileTrailAoE: spell2.effectTileTrailAoE, - passthrough: spell2.noTerrainHit, noEnemyCollision: spell2.noEnemyCollision, alwaysCollideTags: spell2.alwaysCollideTags, nonVolatile:spell2.nonVolatile, noDoubleHit: spell2.noDoubleHit, - pierceEnemies: spell2.pierceEnemies, piercing: spell2.piercing, events: spell2.events, - lifetime:miscast || selfCast ? 1 : (spell2.bulletLifetime ? spell2.bulletLifetime : 1000), origin: {x: entity.x, y: entity.y}, range: spell2.range, hit:spell2.onhit, - damage: {evadeable: spell2.evadeable, damage:spell2.power, type:spell2.damage, bind: spell2.bind, bindEff: spell2.bindEff, distract: spell2.distract, distractEff: spell2.distractEff, boundBonus: spell2.boundBonus, time:spell2.time, flags:spell2.damageFlags}, spell: spell2}, miscast); - b.visual_x = entity.x; - b.visual_y = entity.y; - } else return "Fail"; - } else return "Fail"; - }, - "Volcanism": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let rocks = []; - for (let e of KinkyDungeonEntities) { - if (spell.filterTags.some((tag) => {return e.Enemy.tags[tag];}) && KDistEuclidean(targetX - e.x, targetY - e.y) <= spell.aoe - && (!e.buffs || !KinkyDungeonHasBuff(e.buffs, KDVolcanism.id))) { - rocks.push(e); - } - } - if (rocks.length == 0) return "Fail"; - for (let rock of rocks) { - KinkyDungeonApplyBuffToEntity(rock, KDVolcanism); - rock.hostile = 9999; - } - }, - "dress": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - KinkyDungeonSetDress(spell.outfit); - }, - "CommandWord": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let en = KinkyDungeonEnemyAt(targetX, targetY); - if (en) { - if (en.boundLevel > 0) { - if (KDHostile(en) && en.hp <= en.Enemy.maxhp * 0.1) { - en.ceasefire = 50; - } else if (!KDHostile(en) && en.hp <= en.Enemy.maxhp * 0.1) { - en.allied = 100; - let ff = KDGetFactionOriginal(en); - if (!KinkyDungeonHiddenFactions.includes(ff)) { - KinkyDungeonChangeFactionRep(ff, 0.005); - } - } - if (en.buffs) - for (let b of Object.values(en.buffs)) { - if (b.tags && b.tags.includes("commandword")) { - b.duration = 0; - } - } - en.boundLevel = Math.max(0, en.boundLevel); - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - return "Cast"; - } - KinkyDungeonSendTextMessage(8, TextGet("KDCommandWordFail_NoEnemy"), "#ff5555", 1, true); - return "Fail"; - } else if (targetX == KinkyDungeonPlayerEntity.x && targetY == KinkyDungeonPlayerEntity.y) { - if (KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks).length > 0) { - for (let r of KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks, true)) { - KinkyDungeonLock(r, ""); - } - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonPurpleLockRemove"), "#ffff00", 2); - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - return "Cast"; - } - KinkyDungeonSendTextMessage(8, TextGet("KDCommandWordFail_NoLocks"), "#ff5555", 1, true); - return "Fail"; - } else if (KinkyDungeonTilesGet(targetX + "," + targetY) && KinkyDungeonTilesGet(targetX + "," + targetY).Type == "Charger" && KinkyDungeonTilesGet(targetX + "," + targetY).NoRemove) { - KinkyDungeonTilesGet(targetX + "," + targetY).NoRemove = false; - KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonPurpleLockRemoveCharger"), "#ffff00", 2); - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - return "Cast"; - } - KinkyDungeonSendTextMessage(8, TextGet("KDCommandWordFail_NoTarget"), "#ff5555", 1, true); - return "Fail"; - }, - "Lockdown": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let en = KinkyDungeonEnemyAt(targetX, targetY); - if (en && en.boundLevel > 0) { - KinkyDungeonApplyBuffToEntity(en, { - id: "Lockdown", aura: "#a96ef5", type: "MinBoundLevel", duration: 9000, power: Math.min(en.Enemy.maxhp, en.boundLevel), maxCount: 1, tags: ["lock", "debuff", "commandword", "CM1"] - }); - KinkyDungeonCastSpell(targetX, targetY, KinkyDungeonFindSpell("EffectEnemyLock1", true), undefined, undefined, undefined); - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - return "Cast"; - } else return "Fail"; - }, - "Enemy_CM1": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let en = KinkyDungeonEnemyAt(targetX, targetY); - if (en) { - KinkyDungeonTickBuffTag(en.buffs, "CM1", 1); - KinkyDungeonCastSpell(targetX, targetY, KinkyDungeonFindSpell("EffectEnemyCM" + (entity?.Enemy?.unlockCommandLevel || 1), true), undefined, undefined, undefined); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - if (entity?.Enemy) { - KinkyDungeonSetEnemyFlag(entity, "commandword", entity.Enemy.unlockCommandCD || 90); - KinkyDungeonSendActionMessage(7, - TextGet("KDCastCM1").replace("EnemyName", TextGet("Name" + entity.Enemy.name)).replace("TargetName", TextGet("Name" + en.Enemy.name)), - "#ff5555", 4); - } - return "Cast"; - } - return "Fail"; - }, - "Chastity": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let en = KinkyDungeonEnemyAt(targetX, targetY); - if (en && en.Enemy.bound && KinkyDungeonIsDisabled(en)) { - KDTieUpEnemy(en, spell.power, "Metal"); - KinkyDungeonApplyBuffToEntity(en, KDChastity); - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - return "Cast"; - } else { - if (KinkyDungeonPlayerEntity.x == tX && KinkyDungeonPlayerEntity.y == tY) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["magicBeltForced"]}, MiniGameKinkyDungeonLevel + 10, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonSendActionMessage(3, TextGet("KDZoneOfPuritySelf"), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - KinkyDungeonAddRestraintIfWeaker(restraintAdd, 0, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - return "Cast"; - } - } - return "Fail"; - } - }, - "DisplayStand": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let en = KinkyDungeonEntityAt(targetX, targetY); - if (en && en.player) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["displaySpell"]}, MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCastSelf"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - KinkyDungeonAddRestraintIfWeaker(restraintAdd, 0, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - return "Cast"; - } - - - } else if (en && KDCanBind(en) && KDHelpless(en)) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - // Summon a pet - let Enemy = KinkyDungeonGetEnemyByName("PetDisplay"); - if (Enemy) { - // Deal 0 damage to aggro - KinkyDungeonDamageEnemy(en, { - type: "chain", - damage: 0, - time: 0, - bind: 0, - }, false, true, undefined, undefined, entity); - en.hp = 0; - - let doll = { - summoned: true, - rage: Enemy.summonRage ? 9999 : undefined, - Enemy: Enemy, - id: KinkyDungeonGetEnemyID(), - x: en.x, - y: en.y, - hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, - movePoints: 0, - attackPoints: 0 - }; - KDAddEntity(doll); - - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - KinkyDungeonChangeCharge(0.05); - return "Cast"; - } - return "Fail"; - } else return "Fail"; - }, - "Petsuit": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let en = KinkyDungeonEntityAt(targetX, targetY); - if (en && en.player) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["petsuitSpell"]}, MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCastSelf"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - KinkyDungeonAddRestraintIfWeaker(restraintAdd, 0, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - return "Cast"; - } - - - } else if (en && KDCanBind(en) && KDHelpless(en)) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - // Summon a pet - let Enemy = KinkyDungeonGetEnemyByName("Pet"); - if (Enemy) { - // Deal 0 damage to aggro - KinkyDungeonDamageEnemy(en, { - type: "chain", - damage: 0, - time: 0, - bind: 0, - }, false, true, undefined, undefined, entity); - en.hp = 0; - - let doll = { - summoned: true, - rage: Enemy.summonRage ? 9999 : undefined, - Enemy: Enemy, - id: KinkyDungeonGetEnemyID(), - x: en.x, - y: en.y, - hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, - movePoints: 0, - attackPoints: 0 - }; - KDAddEntity(doll); - - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - return "Cast"; - } - return "Fail"; - } else return "Fail"; - }, - "CommandCapture": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let en = KinkyDungeonEntityAt(targetX, targetY); - if (en && (en.player || en.Enemy.bound)) { - // Only bind bindable targets - let bindTypes = []; - let bindCounts = {}; - for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) - for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { - if (KDistEuclidean(X, Y) <= spell.aoe) { - let loc = (tX + X) + "," + (tY + Y); - if (KinkyDungeonEffectTilesGet(loc)) { - for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { - if (tile.tags && tile.tags.includes("bind")) { - for (let t of tile.tags) { - // Run the special feature per restraint type - if (KDCommandCaptureBindings[t]) { - bindTypes.push(t); - if (!bindCounts[t]) bindCounts[t] = 0; - bindCounts[t] += 1; - KDCommandCaptureBindings[t](spell, en, faction, bullet, miscast, entity, bindCounts[t]); - } - } - } - } - } - } - } - if (bindTypes.length > 0) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - if (!en.player) - KinkyDungeonDamageEnemy(en, { - type: "chain", - damage: spell.power, - time: spell.time, - bind: spell.bind, - }, false, false, undefined, undefined, entity); - return "Cast"; - } else return "Fail"; - } else return "Fail"; - }, - "AnimatePuppet": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let maxCount = 3; - let enemies = []; - for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) - for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { - if (KDistEuclidean(X, Y) <= spell.aoe) { - let en = KinkyDungeonEntityAt(tX+X, tY+Y); - if (en && !en.player && en.Enemy && KDHelpless(en) && KDEntityBuffedStat(en, "SlimeProgress") >= 1.99) { - if (KDRandom() < 0.5) - enemies.push(en); - else - enemies.unshift(en); - } - } - } - if (enemies.length > 0) { - let n = 0; - let cost = KinkyDungeonGetManaCost(spell) / 3; - for (let s of enemies) { - if (n < maxCount) { - KinkyDungeonChangeMana(-cost); - s.hp = 0; - let Enemy = KinkyDungeonGetEnemyByName("AllyDoll"); - let doll = { - summoned: true, - rage: Enemy.summonRage ? 9999 : undefined, - Enemy: Enemy, - id: KinkyDungeonGetEnemyID(), - x: s.x, - y: s.y, - hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, - movePoints: 0, - attackPoints: 0 - }; - KDAddEntity(doll); - n += 1; - } - } - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - return "Cast"; - } else return "Fail"; - }, - "Animate": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let maxCount = 3; - let slots = []; - for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) - for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { - if (KDistEuclidean(X, Y) <= spell.aoe) { - let loc = (tX + X) + "," + (tY + Y); - if (KinkyDungeonEffectTilesGet(loc)) { - for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { - if (tile.tags && tile.tags.includes("slime") && !KinkyDungeonEntityAt(tX+X, tY+Y)) { - if (KDRandom() < 0.5) - slots.push({x: tX+X, y:tY+Y}); - else - slots.unshift({x: tX+X, y:tY+Y}); - } - } - } - } - } - if (slots.length > 0) { - let n = 0; - let cost = KinkyDungeonGetManaCost(spell) / 3; - for (let s of slots) { - if (n < maxCount) { - KinkyDungeonChangeMana(-cost); - KinkyDungeonSummonEnemy(s.x, s.y, "SmallSlime", 1, 0.5, undefined, 50, undefined, undefined, "Player"); - n += 1; - } - } - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - return "Cast"; - } else return "Fail"; - }, - "AnimateLarge": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let slimeCount = 0; - let slots = []; - for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) - for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { - if (KDistEuclidean(X, Y) <= spell.aoe) { - let loc = (tX + X) + "," + (tY + Y); - if (KinkyDungeonEffectTilesGet(loc)) { - for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { - if (tile.tags && tile.tags.includes("slime")) { - if (!KinkyDungeonEntityAt(tX+X, tY+Y)) { - if (KDRandom() < 0.5) - slots.push({x: tX+X, y:tY+Y}); - else - slots.unshift({x: tX+X, y:tY+Y}); - } - slimeCount += 1; - } - } - } - } - } - if (slimeCount > 0 && slots.length > 0) { - let cost = KinkyDungeonGetManaCost(spell) / 3; - let s = slots[Math.floor(KDRandom() * slots.length)]; - KinkyDungeonChangeMana(-cost); - KinkyDungeonSummonEnemy(s.x, s.y, "BigSlime", 1, 0.5, undefined, 90, undefined, undefined, "Player"); - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - return "Cast"; - } else return "Fail"; - }, - "ElasticGrip": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - if (!KinkyDungeonCheckPath(entity.x, entity.y, tX, tY, true, false)) { - KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonSpellCastFail"+spell.name), "#ff5555", 1); - return "Fail"; - } - let en = KinkyDungeonEntityAt(targetX, targetY); - if (en && !en.player) { - if (!KDIsImmobile(en)) { - if (!en.player) - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - let dist = Math.min(KDistEuclidean(en.x - entity.x, en.y - entity.y), - Math.max(1, KDPushModifier(4, en))) + 0.01; - let pullToX = entity.x; - let pullToY = entity.y; - KDCreateParticle(tX, tY, "ElasticGripHit"); - let lastx = en.x; - let lasty = en.y; - - for (let i = dist; i > 0; i -= 0.2499) { - if (KDistChebyshev(pullToX - en.x, pullToY - en.y) > 1.5) { - let newX = pullToX + Math.round((en.x - pullToX) * i / dist); - let newY = pullToY + Math.round((en.y - pullToY) * i / dist); - if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) - && (KinkyDungeonCheckProjectileClearance(en.x, en.y, newX, newY))) { - KDMoveEntity(en, newX, newY, false, true, KDHostile(en)); - if (en.x != lastx || en.y != lasty) { - lastx = en.x; - lasty = en.y; - KDCreateParticle(en.x, en.y, "ElasticGripHit"); - } - } - } else break; - } - - - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - KDCreateParticle(en.x, en.y, "ElasticGripHit"); - - if (!en.player) - KinkyDungeonDamageEnemy(en, { - type: "glue", - damage: spell.power, - time: spell.time, - bind: spell.bind, - }, false, true, undefined, undefined, entity); - return "Cast"; - } else return "Fail"; - } else return "Fail"; - }, - "Awaken": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let count = 0; - for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) - for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { - if (KDistEuclidean(X, Y) <= spell.aoe) { - let loc = (tX + X) + "," + (tY + Y); - if (KinkyDungeonEffectTilesGet(loc)) { - for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { - if (tile.tags && (tile.tags.includes("slime") || tile.tags.includes("latex"))) { - //for (let t of tile.tags) { - // Run the special feature per restraint type - count += 1; - KinkyDungeonCastSpell(tX + X, tY + Y, KinkyDungeonFindSpell("AwakenStrike", true), undefined, undefined, undefined, "Player"); - //} - } - } - } - } - } - if (count > 0) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - return "Cast"; - } else return "Fail"; - }, - "Spread": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let slots = []; - for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) - for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { - if (KDistEuclidean(X, Y) <= spell.aoe) { - let loc = (tX + X) + "," + (tY + Y); - if (KinkyDungeonEffectTilesGet(loc)) { - for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { - if (tile.tags && (tile.tags.includes("slime"))) { - slots.push({x: tX + X, y: tY+Y, duration: tile.duration}); - } - } - } - } - } - if (slots.length > 0) { - for (let s of slots) { - for (let xx = -1; xx <= 1; xx++) - for (let yy = -1; yy <= 1; yy++) { - if ((xx == 0 || yy == 0) && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(s.x + xx, s.y + yy))) - KDCreateEffectTile(s.x + xx, s.y + yy, { - name: "Slime", - duration: Math.max(s.duration, 12), - }, 8); - } - - } - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - return "Cast"; - } else return "Fail"; - }, - "CommandBind": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let count = 0; - for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) - for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { - if (KDistEuclidean(X, Y) <= spell.aoe) { - let loc = (tX + X) + "," + (tY + Y); - if (KinkyDungeonEffectTilesGet(loc)) { - for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { - if (tile.tags && tile.tags.includes("bind")) { - for (let t of tile.tags) { - // Run the special feature per restraint type - if (KDCommandCaptureBindings[t]) { - count += 1; - KDCommandBindBindings[t](spell, tX + X, tY + Y, faction, bullet, miscast, entity); - } - } - } - } - } - } - } - if (count > 0) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - return "Cast"; - } else return "Fail"; - }, - "Coalesce": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let count = 0; - let finalTile = "Slime"; - let finalTilePri = -1; - let finalTileDuration = 0; - for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) - for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { - if (KDistEuclidean(X, Y) <= spell.aoe) { - let loc = (tX + X) + "," + (tY + Y); - if (KinkyDungeonEffectTilesGet(loc)) { - for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { - if (tile.tags && tile.tags.includes("slime")) { - count += 1; - if (tile.duration > finalTileDuration) finalTileDuration = tile.duration; - if (tile.priority > finalTilePri) { - finalTile = tile.name; - finalTilePri = tile.priority; - } - tile.duration = 0; - tile.pauseDuration = 0; - } - } - } - } - } - if (count == 0) return "Fail"; - - KDCreateEffectTile(tX, tY, { - name: finalTile, - duration: finalTileDuration, - }, 10); - - let enList = KDNearbyEnemies(tX, tY, spell.aoe); - - if (enList.length > 0) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - for (let en of enList) { - if (en.buffs && KinkyDungeonGetBuffedStat(en.buffs, "SlimeProgress")) { - KinkyDungeonApplyBuffToEntity(en, KDEncased); - KinkyDungeonDamageEnemy(en, { - type: spell.damage, - damage: spell.power * count, - time: spell.time, - bind: spell.bind, - }, false, true, undefined, undefined, entity); - // Get a point near the target point - let point = KinkyDungeonEntityAt(tX, tY) ? KinkyDungeonGetNearbyPoint(tX, tY, true, undefined, true) : {x:tX, y:tY}; - if (point) KDMoveEntity(en, point.x, point.y, false, true); - } - } - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)/2); - } - - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)/2); - return "Cast"; - }, - "SlimeToLatex": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let count = 0; - for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) - for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { - if (KDistEuclidean(X, Y) <= spell.aoe) { - let loc = (tX + X) + "," + (tY + Y); - if (KinkyDungeonEffectTilesGet(loc)) { - for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { - if (tile.tags && tile.tags.includes("slime")) { - count += 1; - tile.duration = 0; - tile.pauseDuration = 0; - KDCreateEffectTile(tX + X, tY + Y, { - name: "Latex" - }, 20); - } - } - } - } - } - if (count == 0) return "Fail"; - - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - return "Cast"; - }, - "CommandDisenchant": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let enList = KDNearbyEnemies(tX, tY, spell.aoe); - - if (enList.length > 0) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - for (let en of enList) { - if (en.Enemy.tags.construct && (!en.buffs || !en.buffs.Disenchant1)) { - KinkyDungeonApplyBuffToEntity(en, KDDisenchant1); - KinkyDungeonApplyBuffToEntity(en, KDDisenchant2); - KinkyDungeonDamageEnemy(en, { - type: "cold", - damage: spell.power, - time: 0, - bind: 0, - }, false, true, undefined, undefined, entity); - } - } - cast = true; - } - - if (AOECondition(tX, tY, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, spell.aoe, KinkyDungeonTargetingSpell.aoetype || "")) { - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, KDDisenchantSelf); - cast = true; - } - if (cast) { - KinkyDungeonChangeMana(-(1 - 0.5 * Math.min(1, (enList.length-1) / 2)) * (KinkyDungeonGetManaCost(spell))); - return "Cast"; - } else return "Fail"; - }, - "DollConvert": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let enList = KDNearbyEnemies(tX, tY, spell.aoe); - - if (enList.length > 0) { - let count = 0; - let seen = 0; - for (let en of enList) { - if (!KDHelpless(en) && en.Enemy.tags?.dollmakerconvert) { - en.hp = 0; - let e = DialogueCreateEnemy(en.x, en.y, "DollsmithDoll"); - if (entity) - e.faction = KDGetFaction(entity); - count += 1; - KDCreateEffectTile(en.x, en.y, { - name: "Latex", - duration: 4, - }, 0); - if (KinkyDungeonVisionGet(en.x, en.y) > 0) - seen += 1; - } - if (count >= 3) break; - } - if (count > 0) { - if (KinkyDungeonVisionGet(entity?.x||0, entity?.y||0) > 0 || seen > 0) - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSpellCast"+spell.name).replace("ENEMYNAME", TextGet("Name" + entity?.Enemy?.name)), "#ff4488", 2); - - return "Cast"; - } - - } - return "Fail"; - }, - - "CommandVibrate": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - if (!KDGameData.CurrentVibration && AOECondition(tX, tY, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, spell.aoe, KinkyDungeonTargetingSpell.aoetype || "") - && (KinkyDungeonPlayerTags.get("ItemVulvaFull") || KinkyDungeonPlayerTags.get("ItemButtFull") || KinkyDungeonPlayerTags.get("ItemVulvaPiercingsFull"))) { - - let vibes = []; - if (KinkyDungeonPlayerTags.get("ItemVulvaFull")) vibes.push("ItemVulva"); - if (KinkyDungeonPlayerTags.get("ItemButtFull")) vibes.push("ItemButt"); - if (KinkyDungeonPlayerTags.get("ItemVulvaPiercingsFull")) vibes.push("ItemVulvaPiercings"); - KinkyDungeonStartVibration(KinkyDungeonGetRestraintItem(vibes[Math.floor(KDRandom() * vibes.length)]).name, "tease", vibes, 0.5, 30, undefined, undefined, undefined, undefined, true); - - cast = true; - } - cast = cast || KDCastSpellToEnemies((en) => { - if (en.Enemy.bound && KDEntityBuffedStat(en, "Plug") > 0) { - KDApplyGenBuffs(en, "Vibrate1", spell.time); - return true; - } - }, tX, tY, spell); - if (cast) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - return "Cast"; - } else return "Fail"; - }, - "CommandOrgasm": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - if (!KDGameData.CurrentVibration && AOECondition(tX, tY, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, spell.aoe, KinkyDungeonTargetingSpell.aoetype || "") - && (KinkyDungeonPlayerTags.get("ItemVulvaFull") || KinkyDungeonPlayerTags.get("ItemButtFull") || KinkyDungeonPlayerTags.get("ItemVulvaPiercingsFull"))) { - - let vibes = []; - if (KinkyDungeonPlayerTags.get("ItemVulvaFull")) vibes.push("ItemVulva"); - if (KinkyDungeonPlayerTags.get("ItemButtFull")) vibes.push("ItemButt"); - if (KinkyDungeonPlayerTags.get("ItemVulvaPiercingsFull")) vibes.push("ItemVulvaPiercings"); - KinkyDungeonStartVibration(KinkyDungeonGetRestraintItem(vibes[Math.floor(KDRandom() * vibes.length)]).name, "tease", vibes, 3.0, 10, undefined, undefined, undefined, undefined, true); - KinkyDungeonCastSpell(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonFindSpell("OrgasmStrike", true), undefined, undefined, undefined, "Player"); - cast = true; - } - cast = cast || KDCastSpellToEnemies((en) => { - if (en.Enemy.bound && en.distraction > 0) { - let dist = en.distraction / en.Enemy.maxhp; - if (dist < 0.9) dist *= 2; - KinkyDungeonDamageEnemy(en, { - type: "charm", - damage: spell.power * Math.max(0.1, dist), - }, true, false, spell); - KinkyDungeonCastSpell(en.x, en.y, KinkyDungeonFindSpell("OrgasmStrike", true), undefined, undefined, undefined, "Player"); - en.distraction = 0; - return true; - } - }, tX, tY, spell); - if (cast) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - return "Cast"; - } else return "Fail"; - }, - "CommandSlime": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let enList = KDNearbyEnemies(tX, tY, spell.aoe); - let count = 0; - - if (enList.length > 0) { - count += enList.length; - for (let en of enList) { - if (en.boundLevel) { - en.boundLevel = Math.max(0, en.boundLevel - 5); - } - KinkyDungeonRemoveBuffsWithTag(en, ["encased", "slimed"]); - KinkyDungeonApplyBuffToEntity(en, KDGlueResist, {duration: 10}); - } - } - - let tried = false; - let playerInRange = KDistEuclidean(KinkyDungeonPlayerEntity.x - tX, KinkyDungeonPlayerEntity.y - tY) <= spell.aoe; - if (playerInRange) { - let active = false; - let restraints = KinkyDungeonAllRestraint(); - for (let r of restraints) { - if (KDRestraint(r).shrine && KDRestraint(r).shrine.includes("Slime")) { - KinkyDungeonRemoveRestraint(KDRestraint(r).Group); - active = true; - tried = true; - } else if (!tried && KDRestraint(r).shrine && KDRestraint(r).shrine.includes("SlimeHard")) { - tried = true; - } - } - if (active) count += 1; - } - - if (count > 0) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - return "Cast"; - } else { - if (tried && playerInRange) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCastFail"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - } - return "Fail"; - } - }, - "CommandRelease": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let enList = KDNearbyEnemies(tX, tY, spell.aoe); - let count = 0; - - if (enList.length > 0) { - count += enList.length; - for (let en of enList) { - if (en.boundLevel) { - en.boundLevel = Math.max(0, en.boundLevel - spell.power); - } - } - } - - let tried = false; - let playerInRange = KDistEuclidean(KinkyDungeonPlayerEntity.x - tX, KinkyDungeonPlayerEntity.y - tY) <= spell.aoe; - if (playerInRange) { - let active = false; - let restraints = KinkyDungeonAllRestraint(); - if (restraints.length > 0) tried = true; - for (let r of restraints) { - if (!r.lock && KDGetEscapeChance(KDRestraint(r), "Remove", undefined, undefined, false, false).escapeChance > 0 && !KDGroupBlocked(KDRestraint(r).Group)) { - KinkyDungeonRemoveRestraint(KDRestraint(r).Group); - active = true; - } - } - if (active) count += 1; - } - - if (count > 0) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); - return "Cast"; - } else { - if (tried && playerInRange) { - KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCastFail"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); - } - return "Fail"; - } - }, - "Disarm": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - let en = KinkyDungeonEnemyAt(targetX, targetY); - if (en) { - let time = Math.max(1, spell.time - - (en.Enemy.disarm ? en.Enemy.disarm : 0) - - (en.Enemy.tags.elite ? 1 : 0) - - (en.Enemy.tags.miniboss ? 2 : 0) - - (en.Enemy.tags.boss ? 4 : 0)); - en.disarm = Math.max(0, time); - return "Cast"; - } else return "Fail"; - }, - "weaponAttack": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - KinkyDungeonTargetingSpellWeapon = null; - let en = KinkyDungeonEnemyAt(targetX, targetY); - if (en) { - KinkyDungeonLaunchAttack(en, true); - return "Cast"; - } else return "Fail"; - }, - "weaponAttackOrSpell": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { - KinkyDungeonTargetingSpellWeapon = null; - let en = KinkyDungeonEnemyAt(targetX, targetY); - if (en) { - KinkyDungeonLaunchAttack(en, true); - return "Cast"; - } else { - return KinkyDungeonActivateWeaponSpell(true) ? "Cast" : "Fail"; - } - } -}; - -let KDCommandCaptureBindings = { - "vine": (spell, entity, faction, bullet, miscast, attacker, counter) => { - // Vines slow the target down - if (entity.player) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["vineRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleVine"), "#ff0000", spell.time); - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", spell.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } - } else { - if (!(entity.slow)) entity.slow = spell.level * 5; - } - }, - "rope": (spell, entity, faction, bullet, miscast, attacker, counter) => { - // Ropes slow the target down - if (entity.player) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleRope"), "#ff0000", spell.time); - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", spell.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } - } else { - if (!(entity.slow)) entity.bind = counter * spell.level * 3; - else entity.bind = Math.max(entity.bind, counter * spell.level * 3); - KinkyDungeonDamageEnemy(entity, { - type: "chain", - damage: 0, - time: 0, - bind: 0, - }, false, false, undefined, undefined, attacker); - } - }, - "fabric": (spell, entity, faction, bullet, miscast, attacker, counter) => { - // Ropes slow the target down - if (entity.player) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["ribbonRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleFabric"), "#ff0055", spell.time); - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", spell.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } - } else { - if (!(entity.slow)) entity.bind = counter * spell.level * 3; - else entity.bind = Math.max(entity.bind, counter * spell.level * 3); - KinkyDungeonDamageEnemy(entity, { - type: "glue", - damage: 0, - time: 0, - bind: 0, - }, false, false, undefined, undefined, attacker); - } - }, - "belt": (spell, entity, faction, bullet, miscast, attacker, counter) => { - // Belts apply extra binding (10 per spell level) - if (entity.player) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["leatherRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleBelt"), "#ff0000", spell.time); - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", spell.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } - } else { - KinkyDungeonDamageEnemy(entity, { - type: "chain", - damage: 0, - time: 0, - bind: spell.level * 2.0, - }, false, true, undefined, undefined, attacker); - } - }, - "chain": (spell, entity, faction, bullet, miscast, attacker, counter) => { - // Chains deal crush damage - if (entity.player) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["chainRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleChain"), "#ff0000", spell.time); - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", spell.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } - } else { - KinkyDungeonDamageEnemy(entity, { - type: "crush", - damage: spell.level * 1.5, - time: 0, - bind: 0, - }, false, true, undefined, undefined, attacker); - } - }, -}; - - -let KDCommandBindBindings = { - "vine": (spell, x, y, faction, bullet, miscast, attacker, counter) => { - KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindVine", true), undefined, undefined, undefined, "Player"); - }, - "rope": (spell, x, y, faction, bullet, miscast, attacker, counter) => { - KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindRope", true), undefined, undefined, undefined, "Player"); - }, - "rofabricpe": (spell, x, y, faction, bullet, miscast, attacker, counter) => { - KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindRope", true), undefined, undefined, undefined, "Player"); - }, - "chain": (spell, x, y, faction, bullet, miscast, attacker, counter) => { - KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindChain", true), undefined, undefined, undefined, "Player"); - }, - "belt": (spell, x, y, faction, bullet, miscast, attacker, counter) => { - KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindBelt", true), undefined, undefined, undefined, "Player"); - }, -}; diff --git a/Game/KinkyDungeonMagicList.js b/Game/KinkyDungeonMagicList.js deleted file mode 100644 index 03c30c60c..000000000 --- a/Game/KinkyDungeonMagicList.js +++ /dev/null @@ -1,1663 +0,0 @@ -"use strict"; -// Glossary of spell effects -// manacost: Number of turns of no stamina regen after casting the spell. Stacks -// Components: Components required to cast the spell. All of them need to be met -// Level: Determines mana cost and availability. On enemies, increases cooldown -// Power: Determines damage -// Type: "bolt" is a projectile. "inert" is a static delayed blast. "self" is a spell that casts on the player. -// Delay: If the spell's type is "inert", this determines how long before it explodes -// Range: Max targeting range -// damage: damage TYPE. Various damage types have different effects, see KinkyDungeonDealDamage -// speed: speed of a "bolt" projectile -// playerEffect: What happens when the effect hits a player -// trail, trailchance, traildamage, traillifetime: for lingering projectiles left behind the projectile -// onhit: What happens on AoE. Deals aoepower damage, or just power otherwise - -let KDCommandWord = {name: "CommandWord", tags: ["command", "binding", "utility", "defense"], sfx: "Magic", school: "Conjure", manacost: 9, components: ["Verbal"], level:1, type:"special", special: "CommandWord", noMiscast: true, - onhit:"", time:25, power: 0, range: 2.8, size: 1, damage: ""}; - -/** - * These are starting spells - */ -let KinkyDungeonSpellsStart = [ - //{name: "FleetFooted", sfx: "FireSpell", school: "Illusion", manacost: 0.5, components: [], level:1, type:"passive", - //events: [{type: "FleetFooted", trigger: "beforeMove", power: 1}, {type: "FleetFooted", trigger: "afterMove"}, {type: "FleetFooted", trigger: "beforeTrap", msg: "KinkyDungeonFleetFootedIgnoreTrapFail", chance: 0.35}]}, -]; - -// Filters -let filters = genericfilters.concat(...["buff", "bolt", "aoe", "dot", "offense", "defense", "utility"]); -/** Extra filters, indexed according to the learnable spells menu */ -let filtersExtra = [ - ["upgrade", "magic"], - ["fire", "ice", "earth", "electric", "air", "water"], - ["binding", "slime", "summon", "physics", "metal", "leather", "rope"], - ["stealth", "light", "shadow", "knowledge"], - ["will", "stamina", "mana", "damage"], -]; - -let KDColumnLabels = [ - ["Elements", "Conjure", "Illusion", "Other"], - ["Verbal", "Arms", "Legs", "Passive"], - ["Verbal", "Arms", "Legs", "Passive"], - ["Verbal", "Arms", "Legs", "Passive"], - ["Strength", "Dexterity", "Intelligence", "Misc"], -]; - -let KinkyDungeonSpellPages = [ - "Upgrade", - "Elements", - "Conjure", - "Illusion", - "Upgrades", -]; - -/** - * These spells occur in the menu and the player can learn them - * Spells with NoBuy cannot be bought, but can be looked at. - * Spells with NoMenu do not appear in the menu until the player has them - */ -let KinkyDungeonLearnableSpells = [ - //Page 0: Spell Tree - [ - // Elements - ["ApprenticeFire", "ApprenticeLightning", "ApprenticeAir", "ApprenticeIce", "ApprenticeWater", "ApprenticeEarth"], - // Conjure - ["ApprenticeRope", "ApprenticeLeather", "ApprenticeMetal", "ApprenticeLatex", "ApprenticePhysics", "ApprenticeSummon"], - // Illusion - ["ApprenticeLight", "ApprenticeShadow", "ApprenticeMystery", "ApprenticeProjection", "ApprenticeKnowledge"], - // Perk exclusive - ["DistractionCast"], - ], - - //Page 1: Elements - [ - // Verbal - ["Firecracker", "Incinerate", "Gust", "Freeze", "FlashFreeze", "Hailstorm", "IceBreath", "Tremor", "Earthquake", "Shield", "GreaterShield", "IronBlood", "Electrify", "Thunderstorm", "StaticSphere", "Rainstorm"], - // Arms - ["Firebolt", "Fireball", "WindBlast", "Icebolt", "Snowball", "IceOrb", "Icicles", "IceLance", "StoneSkin", "Shock", "Crackle", "LightningBolt", "WaterBall", "TidalBall"], - // Legs - ["Ignite", "Fissure", "Sleet", "BoulderLaunch", "BigBoulderLaunch", "Earthform", "EarthformRing", "EarthformMound", "EarthformLine", "BoulderKick", "Volcanism", "FlameRune", "FreezeRune", "LightningRune",], - // Passive - ["FlameBlade", "Burning", "TemperaturePlay", "Strength", "Shatter", "IcePrison", "LightningRod"], - ], - - //Page 2: Conjuration - [ - // Verbal - ["CommandWord", "CommandDisenchant", "CommandRelease", "CommandCapture", "CommandBind", "CommandVibrate", "CommandOrgasm", "ZoneOfExcitement", "Lockdown", "Chastity", "ZoneOfPurity", "Heal", "Heal2", "Bomb", "RopeBoltLaunch", "RopeStrike", "Leap", "Blink", "CommandSlime", "Spread", "Awaken", "Animate", "AnimateLarge", "AnimatePuppet", "Coalesce", "FireElemental", "AirMote"], - // Arms - ["TickleCloud", "FeatherCloud", "ChainBolt", "SteelRainPlug", "SteelRainBurst", "DisplayStand", "SummonGag", "SummonBlindfold", "SummonCuffs", "SummonLeatherCuffs", "SummonArmbinder", "SummonStraitjacket", "SummonLegbinder", "SummonHarness", "Petsuit", "SlimeBall", "ElasticGrip", "WaterMote"], - // Legs - ["Snare", "Wall", "SlimeSplash", "Slime", "SlimeEruption", "SlimeWall", "SlimeWallVert", "LatexWallVert", "SlimeWallHoriz", "LatexWallHoriz", "LatexWall", "SlimeToLatex", "StormCrystal", "Ally", "EarthMote", "Golem"], - // Passive - ["Frustration", "LeatherBurst", "OneWithSlime", "SlimeWalk", "SlimeMimic", "Engulf", "FloatingWeapon"], - ], - - //Page 3: Illusion - [ - // Verbal - ["Flash", "GreaterFlash", "FocusedFlash", "ShadowWarrior", "Shroud", "Invisibility"], - // Arms - ["ShadowBlade", "ShadowSlash", "Dagger", "TrueSteel", "Ring", "Light", "Corona"], - // Legs - ["Evasion", "Camo", "Decoy"], - // Passive - ["Analyze", "TrueSight", "EnemySense"], - ], - - //Page 4: Upgrades - [ - // Strength - ["IronWill", "SteadfastGuard", "WillStruggle"], - // Dex - ["Athlete", "Vault", "Sneaky", "Evasive1", "Evasive2", "Evasive3"], - // Intellect - ["SummonUp1", "SummonUp2", "StaffUser1", "StaffUser2", "StaffUser3"], - // Misc - ["CriticalStrike"], - ], -]; - - - - -/** - * Spells that the player can choose - * @type {Record} - */ -let KinkyDungeonSpellList = { // List of spells you can unlock in the 3 books. When you plan to use a mystic seal, you get 3 spells to choose from. - "Elements": [ - {goToPage: 1, name: "ApprenticeFire", tags: ["magic"], autoLearn: ["Firebolt"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 1, name: "ApprenticeWater", tags: ["magic"], autoLearn: ["WaterBall"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 1, name: "ApprenticeEarth", tags: ["magic"], autoLearn: ["StoneSkin"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 1, name: "ApprenticeAir", tags: ["magic"], autoLearn: ["WindBlast"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 1, name: "ApprenticeLightning", tags: ["magic"], autoLearn: ["Electrify"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 1, name: "ApprenticeIce", tags: ["magic"], autoLearn: ["Freeze"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - - {name: "Earthform", tags: ["earth", "utility", "summon"], hide: true, autoLearn: ["EarthformRing", "EarthformMound", "EarthformLine"], prerequisite: "ApprenticeEarth", hideLearned: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "BoulderKick", tags: ["earth", "offense", "utility"], sfx: "HeavySwing", school: "Elements", prerequisite: "Earthform", manacost: 1, components: [], level:1, type:"special", special: "BoulderKick", noMiscast: true, - onhit:"", power: 4.0, range: 1.5, size: 1, damage: ""}, - {name: "Volcanism", tags: ["earth", "fire", "offense"], sfx: "FireSpell", school: "Elements", prerequisite: "Earthform", manacost: 6, components: [], level:1, type:"special", special: "Volcanism", noMiscast: true, - filterTags: ["summonedRock"], onhit:"", power: 6.0, range: 5.99, aoe: 2.5, size: 1, damage: ""}, - {name: "EarthformRing", secret: true, tags: ["earth", "utility", "summon"], noSprite: true, noise: 6, minRange: 0, landsfx: "Bones", school: "Elements", hideUnlearnable: true, manacost: 4, components: ["Legs"], prerequisite: ["Earthform"], - level:1, type:"hit", onhit:"summon", summon: [{name: "EarthenMonolith", faction: "Rock", count: 30, minRange: 2.5, time: 9999, bound: true}], power: 0, time: 9999, delay: 1, range: 2.5, size: 1, aoe: 3.99, lifetime: 1, damage: "inert", - effectTileDurationMod: 40, effectTile: { - name: "Cracked", - duration: 100, - }, effectTileDensity: 0.3}, - {name: "EarthformMound", secret: true, tags: ["earth", "utility", "summon"], noSprite: true, noise: 6, minRange: 0, landsfx: "Bones", school: "Elements", hideUnlearnable: true, manacost: 3, components: ["Legs"], prerequisite: ["Earthform"], - level:1, type:"hit", onhit:"summon", summon: [{name: "EarthenMonolith", count: 9, faction: "Rock", time: 9999, bound: true}], power: 0, time: 9999, delay: 1, range: 4, size: 1, aoe: 1.5, lifetime: 1, damage: "inert", - effectTileDurationMod: 40, effectTile: { - name: "Cracked", - duration: 100, - }}, - - {name: "EarthformLine", secret: true, tags: ["earth", "utility", "summon"], noSprite: true, noise: 6, sfx: "Bones", school: "Elements", hideUnlearnable: true, manacost: 2, components: ["Legs"], level:1, type:"bolt", prerequisite: ["Earthform"], - piercing: true, projectileTargeting:true, castRange: 3, nonVolatile: true, onhit:"", power: 3, delay: 0, range: 4.99, speed: 7, size: 1, damage: "inert", - trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"cast", trailChance: 1.0, trailOnSelf: true, - trailcast: {spell: "EarthformSingle", target: "onhit", directional:true, offset: false}, - effectTileDurationModTrail: 40, effectTileTrail: { - name: "Cracked", - duration: 100, - }, - }, - - {name: "DistractionCast", tags: ["will", "defense"], school: "Elements", manacost: 0, components: [], prerequisite: "Null", hideUnlearnable: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "DistractionCast", trigger: "calcMiscast"}, - {type: "DistractionCast", trigger: "tick"}, - {type: "DistractionCast", trigger: "playerCast"}, - ]}, - - {name: "SPUp1", school: "Any", hide: true, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "WPUp1", school: "Any", hide: true, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "TemperaturePlay", tags: ["fire", "ice", "offense"], prerequisite: ["ApprenticeIce", "ApprenticeFire"], school: "Elements", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "TemperaturePlay", trigger: "beforeDamageEnemy", power: 0.3}, - ]}, - {name: "IronWill", tags: ["will", "defense"], school: "Elements", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "IronWill", trigger: "calcMaxStats", power: 0.4}, - ]}, - {name: "SteadfastGuard", tags: ["will", "defense"], school: "Elements", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "SteadfastGuard", trigger: "calcMaxStats", mult: 0.5, power: 5, }, - ]}, - {name: "WillStruggle", tags: ["will", "utility"], school: "Elements", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "WillStruggle", mult: 0.01, power: 5, StruggleType: "Struggle", trigger: "beforeStruggleCalc", msg: "KinkyDungeonSpellWillStruggleMsg"}, - ]}, - {name: "StaffUser1", tags: ["utility"], school: "Elements", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "StaffUser1", trigger: "afterCalcMana", power: 0.8}, - ]}, - {name: "StaffUser2", tags: ["utility"], prerequisite: "StaffUser1", school: "Elements", manacost: 0, components: [], level:2, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0.5, damage: "inert", events: [ - {type: "IncreaseManaPool", trigger: "calcMaxStats", power: 10}, - ]}, - {name: "ManaPoolUp", tags: ["utility"], hideUnlearnable: true, school: "Elements", manacost: 0, components: [], level:2, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0.5, damage: "inert", events: [ - {type: "IncreaseManaPool", trigger: "calcMaxStats", power: 10}, - ]}, - {name: "StaffUser3", tags: ["utility"], prerequisite: "StaffUser2", school: "Elements", manacost: 0, components: [], level:3, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "StaffUser3", trigger: "beforeMultMana", power: 0.75}, - ]}, - {name: "Burning", tags: ["fire", "offense"], prerequisite: "ApprenticeFire", school: "Elements", spellPointCost: 2, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "Burning", trigger: "beforeDamageEnemy", damage: "fire"}, - ]}, - {name: "IcePrison", tags: ["ice", "offense"], prerequisite: "ApprenticeIce", school: "Elements", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "IcePrison", trigger: "afterDamageEnemy"}, - ]}, - {name: "LightningRod", tags: ["electric", "air", "defense", "utility"], prerequisite: "ApprenticeLightning", school: "Elements", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "LightningRod", trigger: "playerCast", power: 3.0}, - ]}, - {name: "Incinerate", prerequisite: "Firecracker", tags: ["fire", "aoe", "dot", "offense", "denial"], noUniqueHits: true, noise: 3, landsfx: "FireSpell", school: "Elements", manacost: 8, - upcastFrom: "Firecracker", upcastLevel: 1, hitSpin: 1, - components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 1, power: 2.5, range: 2.5, size: 3, aoe: 1.5, lifetime: 6, damage: "fire", playerEffect: {name: "Damage"}, - effectTileDurationMod: 12, effectTile: { - name: "Ember", - duration: -6, - } - }, - - {name: "Tremor", prerequisite: "ApprenticeEarth", tags: ["earth", "offense", "utility"], sfx: "Telekinesis", school: "Elements", manacost: 2, components: ["Verbal"], level:1, - type:"hit", onhit:"instant", evadeable: true, time:8, power: 2, range: 3.99, size: 3, lifetime: 1, aoe: 1.5, damage: "crush", - events: [{trigger: "beforeDamageEnemy", type: "MakeVulnerable", time: 8}], - effectTileDurationMod: 40, effectTile: { - name: "Cracked", - duration: 100, - }, effectTileDensity: 0.5, - }, - - {name: "Earthquake", prerequisite: "Tremor", landsfx: "Telekinesis", school: "Elements", manacost: 9, components: ["Verbal"], level:1, type:"inert", onhit:"cast", - upcastFrom: "Tremor", upcastLevel: 2, - dot: true, time: 4, delay: 6, range: 2.99, size: 5, aoe: 1.5, lifetime: 1, power: 1, damage: "inert", noEnemyCollision: true, noTerrainHit: true, - spellcasthit: {spell: "Tremor", target: "onhit", chance: 1.0, countPerCast: 2, directional:false, offset: false}, channel: 7}, - - {name: "Firecracker", prerequisite: "ApprenticeFire", landsfx: "Lightning", tags: ["fire", "aoe", "offense"], noUniqueHits: true, noise: 7, sfx: "FireSpell", school: "Elements", manacost: 4, - components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 1, power: 3.5, range: 3.99, size: 3, aoe: 1, lifetime: 1, damage: "fire", playerEffect: {name: "Damage"}, - effectTileDurationMod: 8, effectTile: { - name: "Ember", - duration: -4, - } - }, - {name: "Hailstorm", color: "#92e8c0", prerequisite: "ApprenticeIce", tags: ["ice", "aoe", "dot", "offense", "utility", "denial"], noUniqueHits: true, noise: 3, sfx: "FireSpell", school: "Elements", manacost: 7, - components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 1, power: 1.0, time: 2, range: 2.5, size: 3, aoe: 1.5, lifetime: 8, damage: "frost", playerEffect: {name: "Damage"}, - effectTileDurationMod: 12, effectTile: { - name: "Ice", - duration: -6, - } - }, - {name: "Rainstorm", prerequisite: "ApprenticeWater", tags: ["water", "aoe", "dot", "offense", "utility", "denial"], noUniqueHits: true, noise: 3, sfx: "FireSpell", school: "Elements", manacost: 4.5, - components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 3, power: 3.5, time: 2, range: 2.5, size: 3, aoe: 1.5, lifetime: 1, damage: "acid", - effectTileDurationMod: 8, effectTile: { - name: "Water", - duration: 14, - } - }, - {name: "Freeze", color: "#92e8c0", tags: ["ice", "utility", "offense"], prerequisite: "ApprenticeIce", sfx: "Freeze", school: "Elements", manacost: 3, components: ["Verbal"], noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, time:6, power: 0, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "ice"}, - {name: "FlashFreeze", color: "#92e8c0", tags: ["ice", "utility", "offense", "aoe"], prerequisite: "Freeze", sfx: "Freeze", school: "Elements", manacost: 5, components: ["Verbal"], - level:2, type:"hit", onhit:"instant", evadeable: false, power: 2.0, range: 2.99, size: 3, lifetime: 1, aoe: 1.5, damage: "ice", - events: [{type: "ElementalOnDrench", trigger: "bulletHitEnemy", damage: "ice", time: 8, power: 0.0},]}, - {name: "Sleet", color: "#92e8c0", tags: ["ice", "aoe", "dot", "offense", "denial"], prerequisite: "ApprenticeIce", effectTileDurationMod: 10, effectTile: { - name: "Ice", - duration: 20, - }, hitSpin: 0.5, bulletSpin: 0.25, noUniqueHits: true, noise: 8, sfx: "FireSpell", school: "Elements", manacost: 10, components: ["Legs"], level:1, type:"inert", onhit:"aoe", delay: 1, power: 1, range: 4.5, size: 5, aoe: 2.9, lifetime: 15, time: 2, damage: "frost"}, - {name: "WindBlast", tags: ["air", "bolt", "offense", "utility"], - prerequisite: "ApprenticeAir", sfx: "FireSpell", school: "Elements", manacost: 2.5, components: ["Arms"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", power: 1.0, time: 2, delay: 0, range: 2.99, damage: "stun", speed: 3, hitSpin: 1, bulletSpin: 1, - pierceEnemies: true, - shotgunCount: 3, shotgunDistance: 4, shotgunSpread: 3, shotgunSpeedBonus: 1, - events: [{type: "Knockback", trigger: "bulletHitEnemy", power: 1.0, dist: 1.0},]}, - {name: "Gust", tags: ["air", "bolt", "offense", "utility"], - prerequisite: "ApprenticeAir", sfx: "FireSpell", school: "Elements", manacost: 4.5, components: ["Verbal"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", power: 1.5, delay: 0, range: 7.99, damage: "stun", speed: 1, hitSpin: 1, bulletSpin: 1, - pierceEnemies: true, - shotgunCount: 3, shotgunDistance: 8, shotgunSpread: .25, shotgunSpeedBonus: 2, - events: [{type: "Knockback", trigger: "bulletHitEnemy", power: 0.8, dist: 1.0},]}, - - {name: "Firebolt", tags: ["fire", "bolt", "offense"], prerequisite: "ApprenticeFire", sfx: "FireSpell", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", - bulletColor: 0xb83716, bulletLight: 4, - hitColor: 0xe64539, hitLight: 6, - projectileTargeting:true, onhit:"", power: 4.0, delay: 0, range: 50, damage: "fire", speed: 3, playerEffect: {name: "Damage"}, - effectTileDurationMod: 3, effectTile: { - name: "Ember", - duration: 3, - }}, // Throws a fireball in a direction that moves 1 square each turn - {name: "Fireball", prerequisite: "Firebolt", tags: ["fire", "bolt", "aoe", "offense"], noise: 3, sfx: "FireSpell", school: "Elements", manacost: 7, components: ["Arms"], level:1, - upcastFrom: "Firebolt", upcastLevel: 2, - bulletColor: 0xb83716, bulletLight: 5.5, - hitColor: 0xe64539, hitLight: 8, - landsfx: "Lightning", - type:"bolt", projectileTargeting:true, onhit:"aoe", power: 6, delay: 0, range: 50, aoe: 1.5, size: 3, lifetime:1, damage: "fire", speed: 2, playerEffect: {name: "Damage"}, - effectTileDurationModTrail: 8, effectTileTrail: { - name: "Smoke", - duration: 2, - }, - effectTileDurationMod: 6, effectTile: { - name: "Ember", - duration: 4, - }}, // Throws a fireball in a direction that moves 1 square each turn - {name: "Icebolt", tags: ["ice", "bolt", "offense"], prerequisite: "ApprenticeIce", sfx: "MagicSlash", hitsfx: "Freeze", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", - bulletColor: 0x92e4e8, bulletLight: 3, - hitColor: 0x92e4e8, hitLight: 5, - effectTileDurationMod: 10, effectTile: { - name: "Ice", - duration: 20, - }, - projectileTargeting:true, onhit:"", time: 4, power: 3.5, delay: 0, range: 50, damage: "frost", speed: 3, playerEffect: {name: "Chill", damage: "ice", power: 3, time: 3}, - events: [{type: "ElementalOnSlowOrBindOrDrench", trigger: "bulletHitEnemy", damage: "ice", time: 4, power: 0},]}, - {name: "Snowball", color: "#92e8c0", tags: ["ice", "bolt", "offense"], prerequisite: "ApprenticeIce", sfx: "Freeze", hitsfx: "LesserFreeze", school: "Elements", manacost: 5, components: ["Arms"], level:1, type:"bolt", - bulletColor: 0x92e4e8, bulletLight: 6, - projectileTargeting:true, onhit:"lingering", time: 3, power: 2.0, delay: 0, lifetime: 6, lifetimeHitBonus: 2, range: 50, aoe: 2.5, damage: "frost", speed: 3, playerEffect: {name: "Damage"}, - effectTileDurationMod: 2, effectTile: { - name: "Ice", - duration: 6, - }, effectTileDensity: 0.5}, - {name: "IceLance", color: "#92e8c0", tags: ["ice", "bolt", "offense", "aoe"], prerequisite: "Icicles", sfx: "Lightning", hitsfx: "Freeze", school: "Elements", pierceEnemies: true, - upcastFrom: "Icicles", upcastLevel: 2, - manacost: 7, components: ["Arms"], level:1, type:"bolt", - bulletColor: 0x92e4e8, bulletLight: 4, - hitColor: 0x92e4e8, hitLight: 7, - effectTileDurationModTrail: 10, effectTileTrail: { - name: "Ice", - duration: 20, - }, - projectileTargeting:true, onhit:"", time: 3, power: 10, delay: 0, range: 50, damage: "frost", speed: 6, playerEffect: {name: "Damage"}, - events: [{type: "ElementalOnSlowOrBindOrDrench", trigger: "bulletHitEnemy", damage: "ice", time: 3, power: 0},]}, - {name: "IceOrb", color: "#92e8c0", tags: ["ice", "bolt", "offense", "utility", "aoe"], prerequisite: "Snowball", sfx: "LesserFreeze", hitsfx: "LesserFreeze", school: "Elements", - upcastFrom: "Snowball", upcastLevel: 1, - manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, pierceEnemies: true, delay: 0, range: 50, damage: "frost", speed: 2, - bulletColor: 0x92e4e8, bulletLight: 5, - effectTileDurationModTrail: 4, effectTileTrailAoE: 1.5, noTrailOnPlayer: true, effectTileTrail: { - name: "Ice", - duration: 10, - }}, - {name: "Icicles", tags: ["ice", "bolt", "offense"], prerequisite: "Icebolt", noise: 3, sfx: "MagicSlash", school: "Elements", manacost: 6, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, - spellcast: {spell: "Icicle", target: "target", directional:true, offset: false}, channel: 3}, - {name: "BoulderLaunch", tags: ["earth", "bolt", "offense"], prerequisite: "ApprenticeEarth", sfx: "Telekinesis", school: "Elements", manacost: 2, components: ["Legs"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 4, delay: 1, power: 4, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "Boulder", target: "target", directional:true, offset: false}, channel: 1}, - {name: "BigBoulderLaunch", tags: ["earth", "bolt", "offense", "aoe"], prerequisite: "BoulderLaunch", sfx: "Telekinesis", school: "Elements", - upcastFrom: "BoulderLaunch", upcastLevel: 2, - manacost: 6, components: ["Legs"], projectileTargeting: true, noTargetPlayer: true, noEnemyCollision: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 8, delay: 1, power: 12, range: 50, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "BigBoulder", target: "target", directional:true, offset: false}, channel: 1}, - {name: "Electrify", tags: ["electric", "offense"], prerequisite: "ApprenticeLightning", noise: 6, - effectTileDurationMod: 2, effectTile: { - name: "Sparks", - duration: 3, - }, - sfx: "FireSpell", landsfx: "Shock", school: "Elements", manacost: 5, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", power: 9, time: 4, delay: 1, range: 4, size: 1, aoe: 0.75, lifetime: 1, damage: "electric", playerEffect: {name: "Shock", time: 1}}, // A series of light shocks incapacitate you - {name: "Shock", tags: ["electric", "bolt", "offense", "dot"], prerequisite: "ApprenticeLightning", sfx: "FireSpell", - effectTileDurationMod: 2, effectTile: { - name: "Sparks", - duration: 3, - }, - school: "Elements", manacost: 5, components: ["Arms"], noEnemyCollision: true, level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2.5, delay: 0, range: 50, damage: "inert", speed: 1, - events: [{type: "CastSpellNearbyEnemy", trigger: "bulletTick", spell: "ShockStrike", aoe: 1.5},]}, - {name: "Crackle", tags: ["electric", "offense", "aoe"], prerequisite: "Shock", noise: 6, sfx: "Shock", - effectTileDurationModTrail: 2, effectTileTrail: { - name: "Sparks", - duration: 3, - }, - school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 4.0, delay: 0, time: 1, range: 4, speed: 4, size: 1, damage: "electric", - trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1.0, playerEffect: {name: "Shock", time: 1}}, - {name: "Fissure", tags: ["fire", "denial", "dot", "aoe", "offense"], noUniqueHits: true, prerequisite: "Ignite", noise: 7, sfx: "FireSpell", school: "Elements", manacost: 8, components: ["Legs"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 5.5, delay: 0, range: 4, speed: 4, size: 1, damage: "fire", - trailPower: 1.5, trailLifetime: 6, piercingTrail: true, trailDamage:"fire", trail:"lingering", trailChance: 1, playerEffect: {name: "DamageNoMsg", hitTag: "Fissure", time: 1, damage:"fire", power: 3}}, - //{name: "Shield", sfx: "MagicSlash", school: "Elements", manacost: 1, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, level:1, type:"inert", block: 10, onhit:"", power: 0, delay: 2, range: 1.5, size: 1, damage: ""}, // Creates a shield that blocks projectiles for 1 turn - {name: "Shield", tags: ["shield", "defense"], prerequisite: "ApprenticeEarth", sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Verbal"], mustTarget: true, level:1, type:"buff", - buffs: [ - {id: "Shield", type: "SpellResist", aura: "#73efe8", duration: 50, power: 3.0, player: true, enemies: true, tags: ["defense", "damageTaken"]}, - ], onhit:"", time:50, power: 0, range: 2, size: 1, damage: ""}, - {name: "GreaterShield", tags: ["shield", "defense", "utility"], prerequisite: "Shield", spellPointCost: 1, sfx: "MagicSlash", school: "Elements", manacost: 1, components: ["Verbal"], noTargetEnemies: true, noTargetPlayer: true, level:1, type:"inert", block: 20, onhit:"", power: 0, delay: 5, range: 2.99, size: 1, damage: ""}, // Creates a shield that blocks projectiles for 5 turns - {name: "IceBreath", tags: ["ice", "denial", "offense", "utility", "aoe"], prerequisite: "Hailstorm", sfx: "MagicSlash", hitsfx: "Freeze", school: "Elements", manacost: 8, - upcastFrom: "Hailstorm", upcastLevel: 1, - components: ["Verbal"], level:1, type:"inert", onhit:"lingering", time: 1, delay: 1, range: 3, size: 3, aoe: 1.5, lifetime: 10, power: 5, lifetimeHitBonus: 5, damage: "ice"}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - {name: "LightningBolt", tags: ["electric", "aoe", "offense"], prerequisite: "Crackle", noise: 11, sfx: "Lightning", - school: "Elements", spellPointCost: 1, manacost: 8, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 8.5, delay: 0, time: 2, range: 50, speed: 50, size: 1, damage: "electric", - upcastFrom: "Crackle", upcastLevel: 2, - trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1, playerEffect: {name: "Shock", time: 3}, - effectTileDurationModTrail: 4, effectTileDensityTrail: 0.6, effectTileTrail: { - name: "Sparks", - duration: 2, - } - }, - {name: "StoneSkin", tags: ["earth", "buff", "defense"], prerequisite: "ApprenticeEarth", sfx: "Bones", school: "Elements", manacost: 6, components: ["Arms"], mustTarget: true, level:1, type:"buff", buffs: [{id: "StoneSkin", aura: "#FF6A00", type: "Armor", duration: 50, power: 2.0, player: true, enemies: true, tags: ["defense", "armor"]}], onhit:"", time:50, power: 0, range: 2, size: 1, damage: ""}, - {name: "IronBlood", tags: ["earth", "buff", "offense"], prerequisite: "ApprenticeEarth", sfx: "FireSpell", school: "Elements", manacost: 0, components: ["Verbal"], mustTarget: true, selfTargetOnly: true, level:1, type:"buff", channel: 4, - buffs: [ - {id: "IronBlood", aura: "#ff0000", type: "AttackStamina", duration: 99999, cancelOnReapply: true, endSleep: true, power: 1, player: true, enemies: false, tags: ["attack", "stamina"]}, - {id: "IronBlood2", type: "ManaCostMult", duration: 99999, cancelOnReapply: true, endSleep: true, power: 0.25, player: true, enemies: false, tags: ["manacost"]}, - ], onhit:"", time:30, power: 0, range: 2, size: 1, damage: ""}, - {name: "FlameBlade", tags: ["fire", "aoe", "offense", "buff"], prerequisite: "ApprenticeFire", sfx: "FireSpell", school: "Elements", manacost: 3, components: [], level:1, type:"passive", events: [{type: "FlameBlade", trigger: "playerAttack"}]}, - {name: "Strength", tags: ["earth", "struggle", "buff", "utility", "offense"], prerequisite: "ApprenticeEarth", sfx: "FireSpell", school: "Elements", manacost: 1, components: [], level:1, type:"passive", events: [ - //{type: "ElementalEffect", power: 2, damage: "crush", trigger: "playerAttack"}, - {trigger: "beforePlayerAttack", type: "BoostDamage", prereq: "damageType", kind: "melee", power: 2}, - {trigger: "calcDisplayDamage", type: "BoostDamage", prereq: "damageType", kind: "melee", power: 2}, - {type: "ModifyStruggle", mult: 1.5, power: 0.2, StruggleType: "Struggle", trigger: "beforeStruggleCalc", msg: "KinkyDungeonSpellStrengthStruggle"}, - ]}, - {name: "Ignite", tags: ["fire", "aoe", "dot", "buff"], prerequisite: "ApprenticeFire", sfx: "FireSpell", school: "Elements", - manacost: 2, spellPointCost: 1, components: ["Legs"], mustTarget: true, noTargetEnemies: true, exceptionFactions: ["Player", "Rock"], level:1, type:"buff", - buffs: [ - {id: "Ignite", aura: "#ff8400", type: "SpellCastConstant", duration: 6, power: 10.0, player: true, enemies: true, spell: "Ignition", tags: ["offense"]}, - ], - onhit:"", time:6, power: 1.5, range: 2.9, size: 1, damage: ""}, - - {name: "Thunderstorm", tags: ["aoe", "utility", "offense", "electric"], prerequisite: "ApprenticeLightning", spellPointCost: 1, sfx: "Fwoosh", school: "Elements", manacost: 4, components: ["Verbal"], level:1, type:"inert", buffs: [ - Object.assign({}, KDConduction), - ], bulletSpin: 0.1, onhit:"", time:8, aoe: 1.5, power: 0, delay: 8, range: 4, size: 3, damage: ""}, // Creates a shroud. Enemies within are hard to hit with melee attacks. - {name: "StaticSphere", tags: ["electric", "metal", "summon", "aoe", "offense"], prerequisite: "Thunderstorm", sfx: "MagicSlash", school: "Elements", manacost: 8, - upcastFrom: "Thunderstorm", upcastLevel: 2, - components: ["Verbal"], noTargetEnemies: true, noTargetPlayer: true, level:1, type:"hit", noSprite: true, onhit:"summon", - summon: [{name: "StaticSphere", count: 1, time: 12, bound: true}], power: 1.5, time: 12, delay: -1, range: 6, size: 1, aoe: 0, lifetime: 1, damage: "inert"}, - - {name: "LightningRune", tags: ["electric", "offense", "defense", "utility"], prerequisite: "ApprenticeLightning", noise: 0, sfx: "Fwoosh", school: "Elements", spellPointCost: 1, manacost: 2, - components: ["Legs"], noTargetPlayer: true, CastInWalls: false, level:1, type:"inert", - onhit:"aoe", time: 5, delay: 3, power: 4.5, range: 2.99, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "LightningRuneStrike", target: "onhit", directional:false, offset: false}, channel: 5}, - {name: "FlameRune", tags: ["fire", "offense", "defense"], prerequisite: "ApprenticeFire", noise: 0, sfx: "Fwoosh", school: "Elements", spellPointCost: 1, manacost: 2, - components: ["Legs"], noTargetPlayer: true, CastInWalls: false, level:1, type:"inert", - onhit:"aoe", delay: 3, power: 5.5, range: 2.99, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "FlameRuneStrike", target: "onhit", directional:false, offset: false}, channel: 5}, - {name: "FreezeRune", tags: ["ice", "offense", "defense", "utility"], prerequisite: "ApprenticeIce", noise: 0, sfx: "Fwoosh", school: "Elements", spellPointCost: 1, manacost: 5, - components: ["Legs"], noTargetPlayer: true, CastInWalls: false, level:1, type:"inert", - onhit:"aoe", time: 30, delay: 3, power: 3, range: 2.99, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "FreezeRuneStrike", target: "onhit", directional:false, offset: false}, channel: 5}, - - {name: "WaterBall", color: "#4f7db8", tags: ["water", "bolt", "offense", "utility"], prerequisite: "ApprenticeWater", sfx: "FireSpell", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"buff", - power: 3.5, delay: 0, range: 50, damage: "acid", speed: 3, playerEffect: {name: "Drench"}, - buffs: [ - Object.assign({}, KDDrenched), - Object.assign({}, KDDrenched2), - Object.assign({}, KDDrenched3), - ], - effectTileDurationMod: 40, effectTile: { - name: "Water", - duration: 40, - }, - }, - {name: "TidalBall", color: "#4f7db8", tags: ["water", "bolt", "offense", "utility"], prerequisite: "WaterBall", sfx: "FireSpell", school: "Elements", manacost: 6, components: ["Arms"], level:1, type:"bolt", size: 3, aoe: 1.5, projectileTargeting:true, onhit:"", power: 3.5, pierceEnemies: true, delay: 0, range: 50, damage: "acid", speed: 1, - upcastFrom: "WaterBall", upcastLevel: 1, - effectTileDurationModTrail: 100, effectTileTrailAoE: 1.5, noTrailOnPlayer: true, effectTileTrail: { - name: "Water", - duration: 40, - }}, - - // Passive spells - {name: "Shatter", tags: ["ice", "aoe", "offense"], prerequisite: "ApprenticeIce", school: "Elements", manacost: 1, components: [], power: 1.5, time: 4, level:1, type:"passive", events: [ - {type: "Shatter", trigger: "enemyStatusEnd"}, - {type: "Shatter", trigger: "beforePlayerAttack"}, - {type: "Shatter", trigger: "kill"}, - ]}, - - ], - "Conjure": [ - {goToPage: 2, name: "ApprenticeRope", tags: ["magic"], autoLearn: ["RopeBoltLaunch"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 2, name: "ApprenticeMetal", tags: ["magic"], autoLearn: ["SummonCuffs"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 2, name: "ApprenticeLeather", tags: ["magic"], autoLearn: ["SummonGag"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 2, name: "ApprenticeSummon", tags: ["magic"], autoLearn: ["Ally"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 2, name: "ApprenticeLatex", tags: ["magic"], autoLearn: ["SlimeBall"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 2, name: "ApprenticePhysics", tags: ["magic"], autoLearn: ["Wall"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - - {name: "MPUp1", hide: true, school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "MPUp2", hide: true, school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "MPUp3", hide: true, school: "Any", manacost: 0, components: [], level:4, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "SummonUp1", hide: true, tags: ["upgrade"], hideLearned: true, hideUnlearnable: true, school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "SummonUp2", hide: true, tags: ["upgrade"], hideLearned: false, hideUnlearnable: true, prerequisite: "SummonUp1", school: "Any", manacost: 0, components: [], level:2, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "Bomb", color: "#ff0000", prerequisite: "ApprenticeSummon", tags: ["aoe", "offense"], noise: 5, sfx: "FireSpell", school: "Conjure", manacost: 5, components: ["Verbal"], level:1, - effectTileDurationMod: 7, hitSpin: 0.2, effectTile: { - name: "Smoke", - duration: -1, - }, type:"inert", onhit:"aoe", time: 3, delay: 5, power: 10, range: 3, size: 3, aoe: 1.5, lifetime: 1, damage: "fire", playerEffect: {name: "Damage"}, channel: 1}, - - {name: "FeatherCloud", color: "#ffffff", prerequisite: "TickleCloud", tags: ["tickle", "aoe", "dot", "offense", "utility", "denial"], noUniqueHits: true, noise: 1, landsfx: "Tickle", hitsfx: "Tickle", school: "Elements", manacost: 4, - components: ["Arms"], hitSpin: 0.7, bulletSpin: 0.4, level:1, type:"inert", onhit:"aoe", delay: 1, power: 2.0, distract: 6.0, range: 2.5, size: 3, aoe: 1, lifetime: 3, damage: "tickle", playerEffect: {name: "Damage"}, - }, - {name: "TickleCloud", color: "#ffffff", prerequisite: "ApprenticeSummon", tags: ["tickle", "aoe", "dot", "offense", "utility", "denial"], piercing: true, noUniqueHits: true, noise: 1, landsfx: "Tickle", hitsfx: "Tickle", school: "Elements", manacost: 2, - components: ["Arms"], hitSpin: 1, bulletSpin: 0.4, level:1, type:"dot", onhit:"aoe", delay: 9, power: 0.5, range: 3.99, size: 1, aoe: 0.5, lifetime: 1, damage: "tickle", playerEffect: {name: "Damage"}, - },//, distractEff: 2.0 - {name: "Snare", color: "#ff8899", prerequisite: "ApprenticeRope", tags: ["rope", "binding", "denial", "utility", "offense"], sfx: "FireSpell", - school: "Conjure", manacost: 2, components: ["Legs"], noTargetEnemies: true, level:1, type:"inert", onhit:"lingering", lifetime:90, bindType: "Rope", - time: 8, bind: 15, delay: 5, range: 1, damage: "stun", playerEffect: {name: "MagicRope", time: 3}}, // Creates a magic rope trap that creates magic ropes on anything that steps on it. They are invisible once placed. Enemies get rooted, players get fully tied! - - {name: "LeatherBurst", prerequisite: "ApprenticeLeather", tags: ["buff", "offense", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0, components: [], level:1, passive: true, type:"", - events: [{type: "LeatherBurst", trigger: "playerCast", power: 3}]}, - {name: "SummonGag", prerequisite: "ApprenticeLeather", tags: ["leather", "bolt", "binding", "burst", "gag", "utility", "offense"], components: ["Arms"], noise: 1, - sfx: "MagicSlash", school: "Conjure", manacost: 1.5, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", - time: 0, delay: 1, power: 2, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "GagBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, - {name: "SummonBlindfold", prerequisite: "ApprenticeLeather", tags: ["leather", "bolt", "binding", "burst", "blindfold", "utility", "offense"], components: ["Arms"], noise: 1, - sfx: "MagicSlash", school: "Conjure", manacost: 1.5, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", - time: 0, delay: 1, power: 2, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "BlindfoldBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, - {name: "SummonArmbinder", prerequisite: "SummonLeatherCuffs", tags: ["leather", "bolt", "binding", "burst", "armbinder", "utility", "offense"], components: ["Arms"], noise: 1, - upcastFrom: "SummonLeatherCuffs", upcastLevel: 1, - sfx: "MagicSlash", school: "Conjure", manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", - time: 0, delay: 1, power: 5, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "ArmbinderBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, - {name: "SummonLeatherCuffs", prerequisite: "ApprenticeLeather", tags: ["leather", "bolt", "binding", "burst", "cuffs", "utility", "offense"], components: ["Arms"], noise: 1, - sfx: "MagicSlash", school: "Conjure", manacost: 2.5, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", - time: 0, delay: 1, power: 1, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "LeatherCuffsBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, - {name: "SummonCuffs", prerequisite: "ApprenticeMetal", tags: ["metal", "bolt", "binding", "burst", "cuffs", "utility", "offense"], components: ["Arms"], noise: 1, - sfx: "MagicSlash", school: "Conjure", manacost: 2, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", - time: 0, delay: 1, power: 3, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "CuffsBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, - {name: "SummonLegbinder", prerequisite: "SummonLeatherCuffs", tags: ["leather", "bolt", "binding", "burst", "legbinder", "utility", "offense"], components: ["Arms"], noise: 1, - sfx: "MagicSlash", school: "Conjure", manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", - time: 0, delay: 1, power: 4, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "LegbinderBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, - {name: "SummonHarness", prerequisite: "ApprenticeLeather", tags: ["leather", "bolt", "binding", "burst", "harness", "utility", "offense"], components: ["Arms"], noise: 1, - sfx: "MagicSlash", school: "Conjure", manacost: 3, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", - time: 0, delay: 1, power: 5, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "HarnessBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, - {name: "SummonStraitjacket", prerequisite: "SummonLeatherCuffs", tags: ["leather", "bolt", "binding", "burst", "straitjacket", "utility", "offense"], components: ["Arms"], noise: 1, - upcastFrom: "SummonLeatherCuffs", upcastLevel: 2, - sfx: "MagicSlash", school: "Conjure", manacost: 7, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", - time: 0, delay: 1, power: 12, range: 6, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "StraitjacketBolt", target: "target", directional:true, randomDirectionFallback: true, aimAtTarget: true, noTargetMoveDir: true, offset: false}}, - - - {name: "Petsuit", prerequisite: "SummonHarness", tags: ["leather", "summon", "utility", "petsuit"], sfx: "Magic", school: "Conjure", manacost: 1, components: [], level:1, - type:"special", special: "Petsuit", - onhit:"", time:0, power: 0.0, range: 2.99, size: 1, aoe: 0.5, damage: "glue"}, - - {name: "DisplayStand", prerequisite: "ApprenticeMetal", tags: ["metal", "summon", "utility", "petsuit"], sfx: "Magic", school: "Conjure", manacost: 1, components: [], level:1, - type:"special", special: "DisplayStand", - onhit:"", time:0, power: 0.0, range: 2.99, size: 1, aoe: 0.5, damage: "glue"}, - - {name: "RopeBoltLaunch", tags: ["rope", "bolt", "binding", "offense"], prerequisite: "ApprenticeRope", sfx: "MagicSlash", school: "Conjure", - manacost: 3, components: ["Verbal"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 1, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, - spellcast: {spell: "RopeBolt", target: "target", directional:true, offset: false}}, - - {name: "RopeStrike", prerequisite: "RopeBoltLaunch", tags: ["rope", "binding", "aoe", "offense"], sfx: "MagicSlash", effectTileDurationMod: 10, effectTile: { - name: "Ropes", - duration: 20, - }, bulletSpin: 1, school: "Conjure", manacost: 3.5, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 1, power: 3, bind: 4, time: 6, range: 3.5, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", bindType: "Rope", playerEffect: {name: "MagicRope", time: 4}}, - {name: "Slime", color: "#ff00ff", prerequisite: "SlimeSplash", tags: ["latex", "slime", "aoe", "offense"], landsfx: "MagicSlash", school: "Conjure", manacost: 4, components: ["Legs"], level:1, type:"inert", - upcastFrom: "SlimeSplash", upcastLevel: 1, - effectTileDurationMod: 12, effectTile: { - name: "Slime", - duration: 8, - }, - onhit:"lingering", time: 4, delay: 1, range: 3.5, size: 3, aoe: 1.5, lifetime: 3, power: 4, damage: "glue", playerEffect: {name: "SlimeTrap", time: 3}}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - {name: "SlimeSplash", color: "#ff00ff", prerequisite: "ApprenticeLatex", tags: ["latex", "slime", "aoe", "offense"], landsfx: "MagicSlash", school: "Conjure", manacost: 1.4, components: ["Legs"], level:1, type:"inert", - effectTileDurationMod: 4, effectTile: { - name: "Slime", - duration: 6, - }, - onhit:"lingering", time: 0, delay: 1, range: 2.5, size: 1, aoe: 1.01, lifetime: 1, power: 1, damage: "glue", playerEffect: {name: "SlimeTrap", time: 3}}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - {name: "SlimeEruption", color: "#ff00ff", prerequisite: "Slime", tags: ["latex", "slime", "aoe", "denial", "offense"], landsfx: "MagicSlash", school: "Conjure", manacost: 7, components: ["Legs"], level:1, type:"inert", - upcastFrom: "SlimeSplash", upcastLevel: 2, - effectTileDurationMod: 16, effectTile: { - name: "Slime", - duration: 8, - }, - onhit:"lingering", time: 4, delay: 1, range: 4, size: 3, aoe: 2.99, lifetime: 8, power: 5, lifetimeHitBonus: 4, damage: "glue", playerEffect: {name: "SlimeTrap", time: 3}}, - //{name: "PinkGas", manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"lingering", time: 1, delay: 2, range: 4, size: 3, aoe: 2.5, lifetime: 9999, damage: "stun", playerEffect: {name: "PinkGas", time: 3}}, // Dizzying gas, increases distraction - {name: "ChainBolt", color: "#ffffff", prerequisite: "ApprenticeMetal", tags: ["metal", "binding", "bolt", "offense"], noise: 5, - sfx: "FireSpell", school: "Conjure", manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 0, power: 2.5, delay: 0, range: 50, damage: "chain", speed: 3, bindType: "Metal", - playerEffect: {name: "SingleChain", time: 1}, effectTileDurationMod: 10, effectTile: { - name: "Chains", - duration: 20, - }, - events: [ - {type: "ElementalIfHalfBound", trigger: "bulletHitEnemy", damage: "crush", power: 5.0, time: 4}, - ] - - }, - {name: "SlimeBall", color: "#ff00ff", prerequisite: "ApprenticeLatex", tags: ["latex", "slime", "denial", "bolt", "offense"], noise: 1, sfx: "FireSpell", school: "Conjure", manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 3, power: 4, delay: 0, range: 50, damage: "glue", speed: 2, - trailPower: 4, trailLifetime: 10, trailTime: 3, trailDamage:"glue", trail:"lingering", trailChance: 1.0, - effectTileDurationModTrail: 4, effectTileTrail: { - name: "Slime", - duration: 4, - }}, // Throws a ball of slime which oozes more slime - {name: "Leap", prerequisite: "ApprenticePhysics", tags: ["physics", "utility", "defense"], sfx: "Teleport", school: "Conjure", spellPointCost: 2, - manacost: 3, components: ["Verbal"], requireLOS: true, noTargetEnemies: true, level:1, type:"hit", onhit:"teleport", delay: 1, lifetime:1, range: 3, damage: ""}, // A quick blink which takes effect instantly, but requires legs to be free - {name: "Blink", prerequisite: "Leap", tags: ["physics", "utility", "defense"], sfx: "Teleport", school: "Conjure", upcastFrom: "Leap", upcastLevel: 2, - manacost: 6, components: ["Verbal"], noTargetEnemies: true, level:1, type:"hit", onhit:"teleport", delay: 1, lifetime:1, range: 5.99, damage: ""}, // A slow blink with short range, but it uses verbal components - {name: "Wall", prerequisite: "ApprenticePhysics", tags: ["summon", "utility", "defense", "physics"], sfx: "MagicSlash", school: "Conjure", manacost: 3, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "Wall", count: 1, time: 10, bound: true}], power: 0, time: 10, delay: -1, range: 6, size: 1, aoe: 0.5, lifetime: 1, damage: "fire"}, - {name: "Ally", prerequisite: "ApprenticeSummon", tags: ["summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 8, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", onhit:"summon", noSprite: true, summon: [{name: "Ally", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 2.9, size: 1, aoe: 0.5, lifetime: 1, damage: "fire"}, - {name: "FireElemental", prerequisite: "ApprenticeSummon", tags: ["fire", "summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 15, components: ["Verbal"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "FireElemental", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 3.5, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, - {name: "WaterMote", prerequisite: "ApprenticeSummon", tags: ["water", "summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 15, components: ["Arms"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "WaterMote", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 3.5, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, - {name: "AirMote", prerequisite: "ApprenticeSummon", tags: ["air", "summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 15, components: ["Verbal"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "AirMote", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 3.5, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, - {name: "EarthMote", prerequisite: "ApprenticeSummon", tags: ["earth", "summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 15, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "EarthMote", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 3.5, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, - {name: "Golem", prerequisite: "Ally", tags: ["summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 20, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:3, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "Golem", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 2.5, size: 1, aoe: 0.5, lifetime: 1, damage: "fire"}, - {name: "StormCrystal", prerequisite: "ApprenticeSummon", tags: ["summon", "denial", "offense"], noise: 7, sfx: "MagicSlash", school: "Conjure", manacost: 10, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "StormCrystal", count: 1, time: 9999, bound: true}], power: 0, time: 30, delay: -1, range: 2.5, size: 1, aoe: 0.5, lifetime: 1, damage: "fire"}, - {noAggro: true, name: "Heal", prerequisite: "ApprenticeSummon", bulletSpin: 0.1, hitSpin: 0.4, noise: 3, sfx: "FireSpell", school: "Conjure", manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 1, power: 1.5, range: 4.5, size: 5, aoe: 2.9, lifetime: 4, time: 2, damage: "heal", channel: 4}, - {noAggro: true, buff: true, heal: true, name: "Heal2", prerequisite: "ApprenticeSummon", sfx: "MagicSlash", school: "Conjure", manacost: 3, components: ["Verbal"], noTargetPlayer: true, mustTarget: true, level:1, type:"hit", - onhit:"heal", time:2, lifetime: 1, delay: 1, power: 4.5, aoe: 0.9, range: 7, size: 1, damage: "inert"}, - {name: "FloatingWeapon", prerequisite: "ApprenticePhysics", tags: ["buff", "offense", "physics"], sfx: "MagicSlash", school: "Conjure", manacost: 2, components: [], level:3, type:"passive", - events: [{type: "FloatingWeapon", trigger: "playerAttack"}, {type: "HandsFree", trigger: "getWeapon"}, {type: "HandsFree", trigger: "calcDamage"}]}, - {name: "Lockdown", prerequisite: "ApprenticeMetal", tags: ["metal", "lock", "binding", "utility", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 4.5, components: ["Verbal"], mustTarget: true, level:1, - /*buffs: [ - {id: "Lockdown", aura: "#a96ef5", type: "Locked", duration: 8, power: 1.0, player: true, enemies: true, tags: ["lock", "debuff"]}, - {id: "Lockdown2", type: "MoveSpeed", duration: 8, power: -1.0, player: false, enemies: true, noAlly: true, tags: ["slow", "debuff"]}, - {id: "Lockdown3", type: "AttackSlow", duration: 8, power: 1.0, player: false, enemies: true, noAlly: true, tags: ["slow", "debuff"]}, - ], */ - type:"special", special: "Lockdown", - onhit:"", time:8, power: 0, range: 1.5, size: 1, damage: ""}, - {name: "Chastity", prerequisite: "Lockdown", tags: ["metal", "binding", "utility"], sfx: "MagicSlash", school: "Conjure", manacost: 3.5, components: ["Verbal"], mustTarget: true, level:1, - type:"special", special: "Chastity", - onhit:"", time:8, power: 3.5, range: 1.5, size: 1, damage: ""}, - {name: "ZoneOfPurity", color: "#ffff00", prerequisite: "Chastity", tags: ["metal", "binding", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 7, components: ["Verbal"], level:1, type:"inert", - onhit:"aoe", power: 0, delay: 40, range: 4.5, size: 3, lifetime: 1, aoe: 2.5, damage: "charm", - events: [{trigger: "bulletTick", type: "ZoneOfPurity", aoe: 2.5, power: 0.5}] - }, - {name: "ZoneOfExcitement", color: "#ff8888", prerequisite: "CommandVibrate", tags: ["binding", "utility"], sfx: "MagicSlash", school: "Conjure", manacost: 3.5, components: ["Verbal"], level:1, type:"inert", - onhit:"aoe", power: 0, delay: 30, range: 4.5, size: 3, lifetime: 1, aoe: 1.99, damage: "charm", - events: [{trigger: "bulletTick", type: "ZoneOfExcitement", aoe: 1.99, power: 0.5}] - }, - {name: "Frustration", tags: ["metal", "offense", "utility"], prerequisite: "Chastity", sfx: "FireSpell", school: "Conjure", manacost: 0, components: [], level:1, type:"passive", events: [ - {type: "Frustration", trigger: "tickAfter"} - ]}, - - - {name: "CommandCapture", prerequisite: "CommandDisenchant", tags: ["command", "binding", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 4.5, components: ["Verbal"], mustTarget: true, level:1, - type:"special", special: "CommandCapture", - onhit:"", time:0, power: 2.5, range: 3.5, bind: 5, size: 1, aoe: 1.5, damage: "chain"}, - {name: "CommandBind", prerequisite: "CommandDisenchant", tags: ["command", "binding", "offense", "aoe"], sfx: "MagicSlash", school: "Conjure", manacost: 4.5, components: ["Verbal"], level:1, - type:"special", special: "CommandBind", - onhit:"", time:0, power: 0, range: 2.5, size: 1, aoe: 2.5, damage: "inert"}, - {name: "CommandDisenchant", prerequisite: "CommandWord", tags: ["command", "offense", "aoe"], sfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Verbal"], level:1, - type:"special", special: "CommandDisenchant", - onhit:"", time:0, power: 3.0, range: 3.5, size: 1, aoe: 3.5, damage: "inert"}, - {name: "CommandVibrate", prerequisite: "CommandWord", tags: ["command", "offense", "aoe", "sexy"], sfx: "MagicSlash", school: "Conjure", manacost: 4.5, components: ["Verbal"], level:1, - type:"special", special: "CommandVibrate", - onhit:"", time:30, power: 5, range: 3.5, size: 1, aoe: 3.5, damage: "charm"}, - {name: "CommandOrgasm", prerequisite: "CommandVibrate", tags: ["command", "offense", "aoe", "sexy"], sfx: "MagicSlash", school: "Conjure", manacost: 4.5, components: ["Verbal"], level:1, - type:"special", special: "CommandOrgasm", - onhit:"", time:0, power: 5, range: 7, size: 1, aoe: 4.99, damage: "charm"}, - {name: "CommandRelease", prerequisite: "CommandDisenchant", tags: ["command", "binding", "defense"], sfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Verbal"], level:1, - type:"special", special: "CommandRelease", - onhit:"", time:0, power: 10.0, range: 2.5, size: 1, aoe: 1.5, damage: "inert"}, - KDCommandWord, - - {name: "CommandSlime", prerequisite: "ApprenticeLatex", tags: ["command", "slime", "defense"], sfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Verbal"], level:1, - type:"special", special: "CommandSlime", - onhit:"", time:0, power: 9.9, range: 2.5, size: 1, aoe: 1.5, damage: "inert"}, - - {name: "SlimeWalk", tags: ["slime", "latex", "defense"], prerequisite: "ApprenticeLatex", school: "Conjure", spellPointCost: 2, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "Buff", trigger: "tick", power: 0.5, buffType: "glueDamageResist"}, - ]}, - - {name: "SlimeWall", tags: ["latex", "utility", "slime", "wall"], hide: true, autoLearn: ["SlimeWallHoriz", "SlimeWallVert"], prerequisite: "ApprenticeLatex", hideLearned: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "SlimeWallVert", secret: true, color: "#ff00ff", hideUnlearnable: true, prerequisite: "SlimeWall", tags: ["latex", "slime", "defense", "aoe", "denial", "utility", "wall"], landsfx: "MagicSlash", school: "Conjure", manacost: 4, components: ["Legs"], level:1, type:"inert", - onhit:"lingering", aoetype: "vert", pierceEnemies: true, time: 2, delay: 2, range: 4, size: 3, aoe: 2.5, lifetime: 20, power: 0, lifetimeHitBonus: 4, damage: "glue", secondaryhit: "buffnoAoE", - hitColor: 0xff00ff, hitLight: 2.5, bulletColor: 0xff00ff, bulletLight: 3.5, - buffs: [KDSlimed]}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - {name: "SlimeWallHoriz", secret: true, color: "#ff00ff", hideUnlearnable: true, prerequisite: "SlimeWall", tags: ["latex", "slime", "defense", "aoe", "denial", "utility", "wall"], landsfx: "MagicSlash", school: "Conjure", manacost: 4, components: ["Legs"], level:1, type:"inert", - onhit:"lingering", aoetype: "horiz", pierceEnemies: true, time: 2, delay: 2, range: 4, size: 3, aoe: 2.5, lifetime: 20, power: 0, lifetimeHitBonus: 4, damage: "glue", secondaryhit: "buffnoAoE", - hitColor: 0xff00ff, hitLight: 2.5, bulletColor: 0xff00ff, bulletLight: 3.5, - buffs: [KDSlimed]}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - - {name: "LatexWall", tags: ["latex", "utility", "slime", "wall"], hide: true, autoLearn: ["LatexWallVert", "LatexWallHoriz"], - prerequisite: "SlimeWall", hideLearned: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "LatexWallVert", secret: true, color: "#aa00ff", hideUnlearnable: true, prerequisite: "LatexWall", tags: ["latex", "slime", "defense", "aoe", "denial", "utility", "wall"], landsfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Legs"], level:1, type:"inert", - upcastFrom: "SlimeWallVert", upcastLevel: 1, - hitColor: 0xff00ff, hitLight: 2.5, bulletColor: 0xff00ff, bulletLight: 3.5, - onhit:"lingering", aoetype: "vert", pierceEnemies: true, time: 0, delay: 2, range: 4, size: 3, aoe: 2.5, lifetime: 20, power: 0, lifetimeHitBonus: 4, damage: "glue", secondaryhit: "buffnoAoE", - hitevents: [ - {trigger: "bulletHitEnemy", type: "LatexWall", power: 5, damage: "glue", time: 6}, - ], - buffs: [KDEncased]}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - {name: "LatexWallHoriz", secret: true, color: "#aa00ff", hideUnlearnable: true, prerequisite: "LatexWall", tags: ["latex", "slime", "defense", "aoe", "denial", "utility", "wall"], landsfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Legs"], level:1, type:"inert", - upcastFrom: "SlimeWallHoriz", upcastLevel: 1, - hitColor: 0xff00ff, hitLight: 2.5, bulletColor: 0xff00ff, bulletLight: 3.5, - onhit:"lingering", aoetype: "horiz", pierceEnemies: true, time: 0, delay: 2, range: 4, size: 3, aoe: 2.5, lifetime: 20, power: 0, lifetimeHitBonus: 4, damage: "glue", secondaryhit: "buffnoAoE", - hitevents: [ - {trigger: "bulletHitEnemy", type: "LatexWall", power: 5, damage: "glue", time: 6}, - ], - buffs: [KDEncased]}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - - {name: "Coalesce", prerequisite: "Spread", tags: ["latex", "slime", "aoe", "utility", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 4, components: ["Verbal"], level:1, - type:"special", special: "Coalesce", - onhit:"", time:0, power: 0.5, range: 3.5, size: 1, aoe: 2.5, damage: "glue"}, - - {name: "ElasticGrip", prerequisite: "ApprenticeLatex", tags: ["latex", "utility"], sfx: "FireSpell", school: "Conjure", manacost: 2, components: ["Arms"], level:1, - type:"special", special: "ElasticGrip", - onhit:"", time:0, power: 1.0, range: 7.99, size: 1, damage: "glue"}, - - {name: "SlimeToLatex", prerequisite: "ApprenticeLatex", tags: ["latex", "aoe", "utility", "denial"], sfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Legs"], level:1, - type:"special", special: "SlimeToLatex", - onhit:"", time:0, power: 2, range: 3.0, size: 1, aoe: 1.5, damage: "glue"}, - - {name: "Engulf", tags: ["latex", "slime", "buff", "offense"], prerequisite: "ApprenticeLatex", sfx: "MagicSlash", school: "Conjure", manacost: 1.5, components: [], level:1, type:"passive", events: [ - {type: "ElementalEffect", power: 2, damage: "glue", trigger: "playerAttack", cost: 1.0}, - {type: "EffectTile", kind: "Slime", duration: 8, trigger: "playerAttack", cost: 0.5}, - ]}, - - {name: "Awaken", prerequisite: "Spread", tags: ["slime", "latex", "binding", "offense", "aoe"], sfx: "MagicSlash", school: "Conjure", manacost: 2.0, components: ["Verbal"], level:1, - type:"special", special: "Awaken", - onhit:"", time:0, power: 0, range: 3.99, size: 1, aoe: 2.5, damage: "inert"}, - - {name: "Spread", prerequisite: "ApprenticeLatex", tags: ["slime", "latex", "utility",], sfx: "MagicSlash", school: "Conjure", manacost: 1.0, components: ["Verbal"], level:1, - type:"special", special: "Spread", - onhit:"", time:0, power: 0, range: 3.99, size: 1, aoe: 2, damage: "inert"}, - - {name: "Animate", prerequisite: "Awaken", tags: ["slime", "latex", "summon"], sfx: "MagicSlash", school: "Conjure", manacost: 6, components: ["Verbal"], level:1, - type:"special", special: "Animate", upcastFrom: "Awaken", upcastLevel: 1, - onhit:"", time:0, power: 0, range: 3.99, size: 1, aoe: 1.5, damage: "inert"}, - - {name: "AnimateLarge", prerequisite: "Animate", tags: ["slime", "latex", "summon"], sfx: "MagicSlash", school: "Conjure", manacost: 10, components: ["Verbal"], level:1, - type:"special", special: "AnimateLarge", upcastFrom: "Awaken", upcastLevel: 2, - onhit:"", time:0, power: 0, range: 3.99, size: 1, aoe: 1.1, damage: "inert"}, - - {name: "AnimatePuppet", prerequisite: "Awaken", tags: ["slime", "latex", "summon"], sfx: "MagicSlash", school: "Conjure", manacost: 6, components: ["Verbal"], level:2, - type:"special", special: "AnimatePuppet", - onhit:"", time:0, power: 0, range: 3.99, size: 1, aoe: 2.5, damage: "inert"}, - - {name: "OneWithSlime", tags: ["slime", "latex", "utility"], prerequisite: "ApprenticeLatex", school: "Elements", spellPointCost: 3, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "OneWithSlime", trigger: "calcComp", requiredTag: "slime"}, - ]}, - - {name: "SlimeMimic", tags: ["slime", "latex", "utility"], prerequisite: "ApprenticeLatex", school: "Elements", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "SlimeMimic", trigger: "tick"}, - ]}, - - - {name: "SteelRainPlug", color: "#ffffff", tags: ["binding", "metal", "bolt", "offense"], prerequisite: "ApprenticeMetal", sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 2, components: ["Arms"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", time: 0, power: 2.0, delay: 0, range: 15, damage: "pierce", speed: 3, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "pierce", power: 2, tag: "plugSpell"}, - bulletColor: 0xffffff, bulletLight: 1, - events: [ - {type: "PlugEnemy", trigger: "bulletHitEnemy"}, - ] - }, - {name: "SteelRainBurst", tags: ["binding", "metal", "bolt", "offense"], prerequisite: "SteelRainPlug", sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 5, components: ["Arms"], level:1, - upcastFrom: "SteelRainPlug", upcastLevel: 1, - projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, type:"inert", onhit:"aoe", - time: 0, delay: 1, power: 5, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - shotgunCount: 4, shotgunDistance: 4, shotgunSpread: 1, shotgunSpeedBonus: 1, - spellcast: {spell: "SteelRainPlug", target: "target", directional:true, randomDirectionPartial: true, aimAtTarget: true, noTargetMoveDir: true, offset: false}}, - - - ], - "Illusion": [ - {goToPage: 3, name: "ApprenticeShadow", tags: ["magic"], autoLearn: ["Dagger"], hideLearned: true, hideUnlearnable: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 3, name: "ApprenticeLight", tags: ["magic"], autoLearn: ["Flash"], hideLearned: true, hideUnlearnable: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 3, name: "ApprenticeMystery", tags: ["magic"], autoLearn: ["Camo"], hideLearned: true, hideUnlearnable: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 3, name: "ApprenticeProjection", tags: ["magic"], autoLearn: ["Decoy"], hideLearned: true, hideUnlearnable: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {goToPage: 3, name: "ApprenticeKnowledge", tags: ["magic"], autoLearn: ["TrueSteel"], hideLearned: true, hideUnlearnable: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - - {name: "Athlete", tags: ["stamina", "utility"], school: "Illusion", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "Buff", trigger: "tick", power: 0.67, buffType: "SprintEfficiency"}, - ]}, - {name: "Sneaky", tags: ["buff", "utility"], school: "Illusion", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "Buff", trigger: "tick", power: 0.5, prereq: "Waiting", buffType: "Sneak", mult: 1, tags: ["SlowDetection", "move", "cast"]}, - ]}, - {name: "Evasive1", tags: ["buff", "defense"], school: "Illusion", spellPointCost: 1, hideLearned: true, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "Buff", trigger: "tick", power: 0.1, buffType: "Evasion"}, - ]}, - {name: "Evasive2", tags: ["buff", "defense"], school: "Illusion", spellPointCost: 1, hideLearned: true, prerequisite: "Evasive1", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "Buff", trigger: "tick", power: 0.15, buffType: "Evasion"}, - ]}, - {name: "Evasive3", tags: ["buff", "defense"], school: "Illusion", spellPointCost: 1, prerequisite: "Evasive2", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {type: "Buff", trigger: "tick", power: 0.25, buffType: "Evasion"}, - ]}, - {name: "CriticalStrike", tags: ["damage", "offense", "buff"], school: "Illusion", spellPointCost: 2, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {trigger: "beforePlayerAttack", type: "CritBoost", prereq: "damageType", kind: "melee", power: 0.5}, - {trigger: "calcDisplayDamage", type: "CritBoost", prereq: "damageType", kind: "melee", power: 0.5}, - ]}, - {name: "Vault", tags: ["damage", "utility", "buff"], school: "Illusion", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ - {trigger: "canSprint", type: "Vault"}, - ]}, - - {name: "Analyze", prerequisite: "ApprenticeKnowledge", tags: ["buff", "utility", "knowledge"], school: "Illusion", manacost: 2.5, defaultOff: true, cancelAutoMove: true, costOnToggle: true, components: [], level:1, type:"passive", - events: [{type: "Analyze", trigger: "toggleSpell", power: 5, time: 20}, {type: "Analyze", trigger: "tick", power: 5, time: 20}]}, - - {name: "APUp1", hide: true, school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "APUp2", hide: true, school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "APUp3", hide: true, school: "Any", manacost: 0, components: [], level:4, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, - {name: "Dagger", prerequisite: "ApprenticeShadow", tags: ["bolt", "shadow", "offense"], sfx: "MagicSlash", school: "Illusion", manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, noDoubleHit: true, piercing: true, onhit:"", power: 2.5, time: 0, delay: 0, range: 6, damage: "cold", speed: 4, playerEffect: {name: "Damage"}}, // Throws a fireball in a direction that moves 1 square each turn - {name: "Flash", color: "#ffffff", prerequisite: "ApprenticeLight", tags: ["light", "utility", "aoe", "offense"], noise: 8, sfx: "FireSpell", - hitColor: 0xffffff, hitLight: 6, - school: "Illusion", manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 4, delay: 1, power: 1, range: 2.5, size: 3, aoe: 1.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 4}}, - {name: "Ring", prerequisite: "ApprenticeLight", tags: ["aoe", "utility", "stealth"], noise: 10, sfx: "MagicSlash", school: "Illusion", manacost: 1, components: ["Arms"], level:1, type:"inert", onhit:"aoe", time: 2, delay: 1, power: 1, range: 7, size: 3, aoe: 1.5, lifetime: 1, damage: "stun"}, - {name: "GreaterFlash", color: "#ffffff", tags: ["light", "utility", "aoe", "offense"], prerequisite: "Flash", spellPointCost: 1, - upcastFrom: "Flash", upcastLevel: 1, - hitColor: 0xffffff, hitLight: 8, - noise: 10, sfx: "FireSpell", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 8, delay: 1, power: 1, range: 2.5, size: 3, aoe: 1.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 6}}, // Much greater AoE. Careful not to get caught! - {name: "FocusedFlash", color: "#ffffff", tags: ["light", "utility", "aoe", "offense"], prerequisite: "GreaterFlash", spellPointCost: 1, - upcastFrom: "Flash", upcastLevel: 2, - hitColor: 0xffffff, hitLight: 11, - noise: 10, sfx: "FireSpell", school: "Illusion", manacost: 7, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 12, delay: 2, power: 1, range: 2.5, size: 5, aoe: 2.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 10}}, // Longer delay, but the stun lasts much longer. - {name: "Shroud", prerequisite: "ApprenticeShadow", tags: ["aoe", "buff", "utility", "stealth", "defense"], sfx: "Fwoosh", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", buffs: [ - {id: "Shroud", type: "Evasion", power: 7.0, player: true, enemies: true, tags: ["darkness"], range: 1.5}, - {id: "Shroud2", aura: "#444488", type: "Sneak", power: 4.0, player: true, duration: 8, enemies: false, tags: ["darkness"], range: 1.5} - ], onhit:"", time:8, aoe: 1.5, power: 0, delay: 8, range: 4, size: 3, damage: "", - effectTileDurationModPre: 3, effectTilePre: { - name: "Smoke", - duration: 8, - }}, // Creates a shroud. Enemies within are hard to hit with melee attacks. - {name: "Invisibility", prerequisite: "ApprenticeMystery", tags: ["buff", "utility", "stealth", "defense"], sfx: "Invis", school: "Illusion", manacost: 8, components: ["Verbal"], mustTarget: true, level:1, type:"buff", - buffs: [ - {id: "Invisibility", aura: "#888888", type: "Sneak", duration: 10, power: 10.0, player: true, enemies: true, tags: ["invisibility"]}, - {id: "Invisibility2", type: "SlowDetection", duration: 14, power: 0.5, player: true, enemies: false, tags: ["invisibility"]}, - ], onhit:"", time:14, power: 0, range: 2, size: 1, damage: ""}, - {name: "TrueSteel", prerequisite: "ApprenticeKnowledge", tags: ["offense", "stealth", "knowledge"], sfx: "MagicSlash", school: "Illusion", manacost: 2, components: ["Arms"], noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, time:1, power: 4, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "slash", - events: [{trigger: "beforeDamageEnemy", type: "MultiplyDamageStealth", power: 2.5, humanOnly: true}] - }, - {name: "Camo", prerequisite: "ApprenticeMystery", tags: ["buff", "utility", "stealth", "defense"], sfx: "MagicSlash", school: "Illusion", manacost: 3, components: ["Legs"], mustTarget: true, noTargetEnemies: true, level:1, type:"buff", - buffs: [ - {id: "Camo", aura: "#3b7d4f", type: "SlowDetection", duration: 50, power: 49.0, player: true, enemies: true, endSleep: true, currentCount: -1, maxCount: 1, tags: ["SlowDetection", "move", "cast"]} - ], onhit:"", time:50, power: 0, range: 2, size: 1, damage: ""}, - {name: "ShadowBlade", prerequisite: "ApprenticeShadow", tags: ["buff", "offense", "shadow"], sfx: "MagicSlash", school: "Illusion", manacost: 6, components: ["Arms"], mustTarget: true, level:1, type:"buff", - buffs: [{id: "ShadowBlade", aura: "#7022a0", type: "AttackDmg", duration: 50, power: 2.0, player: true, enemies: true, maxCount: 5, tags: ["attack", "damage"]}], onhit:"", time:50, power: 0, range: 2, size: 1, damage: ""}, - {name: "ShadowSlash", tags: ["aoe", "offense", "shadow"], prerequisite: "ShadowBlade", sfx: "MagicSlash", school: "Illusion", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, piercing: true, noTerrainHit: true, noEnemyCollision: true, onhit:"aoe", power: 4.5, delay: 0, range: 1.5, aoe: 1.5, size: 3, lifetime:1, damage: "cold", speed: 1, time: 2, - trailspawnaoe: 1.5, trailPower: 0, trailLifetime: 1.1, trailHit: "", trailDamage:"inert", trail:"lingering", trailChance: 0.4}, - {name: "Decoy", tags: ["summon", "utility", "stealth", "defense"], prerequisite: "ApprenticeProjection", sfx: "MagicSlash", school: "Illusion", manacost: 6, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "Decoy", count: 1, time: 20}], power: 0, time: 20, delay: -1, range: 4, size: 1, aoe: 0, lifetime: 1, damage: "fire"}, - {name: "ShadowWarrior", prerequisite: "ApprenticeShadow", tags: ["summon", "offense", "shadow", "dot"], sfx: "MagicSlash", school: "Illusion", manacost: 10, components: ["Verbal"], noTargetEnemies: true, noTargetPlayer: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "ShadowWarrior", count: 1, time: 12}], power: 6, time: 12, delay: -1, range: 3.5, size: 1, aoe: 0, lifetime: 1, damage: "inert"}, - {name: "Corona", color: "#ffffff", - bulletColor: 0xffff77, bulletLight: 5, - tags: ["light", "offense"], prerequisite: "Light", noise: 4, sfx: "MagicSlash", school: "Illusion", spellPointCost: 1, manacost: 7, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 12, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "CoronaBeam", target: "target", directional:true, offset: false}, channel: 2}, - {name: "TrueSight", prerequisite: "ApprenticeKnowledge", tags: ["buff", "utility", "knowledge"], school: "Illusion", manacost: 1, defaultOff: true, cancelAutoMove: true, components: [], level:1, type:"passive", events: [ - {type: "TrueSight", trigger: "vision"}, - {type: "Blindness", trigger: "calcStats", power: -1}, - {type: "AccuracyBuff", trigger: "tick", power: 0.4}, - ]}, - {name: "EnemySense", prerequisite: "ApprenticeKnowledge", tags: ["buff", "utility", "knowledge"], school: "Illusion", manacost: 2, defaultOff: true, cancelAutoMove: true, costOnToggle: true, components: [], level:1, type:"passive", - events: [{type: "EnemySense", trigger: "draw", dist: 12, distStealth: 6}]}, - {name: "Light", prerequisite: "ApprenticeLight", tags: ["buff", "utility", "light"], school: "Illusion", manacost: 2, spellPointCost: 1, defaultOff: true, cancelAutoMove: true, costOnToggle: true, time: 12, components: [], level:1, type:"passive", - events: [{type: "Light", trigger: "getLights", power: 12, time: 12}, {type: "Light", trigger: "toggleSpell", power: 12, time: 12}]}, - {name: "Evasion", prerequisite: "ApprenticeMystery", tags: ["buff", "utility", "defense"], sfx: "Fwoosh", school: "Illusion", manacost: 5, components: ["Legs"], mustTarget: true, level:1, type:"buff", - buffs: [ - {id: "Evasion", type: "Evasion", labelcolor: "#a288b6", duration: 25, power: 3.0, player: true, enemies: true, maxCount: 5, tags: ["defense", "incomingHit"]}, - ], onhit:"", time:25, power: 0, range: 2, size: 1, damage: ""}, - ], -}; -/** - * Spells that are not in the base spell lists - * @type {spell[]} - */ -let KinkyDungeonSpellListEnemies = [ - {name: "AwakenStrike", tags: ["offense", "latex", "slime", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 2.5, time: 5, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "glue", - playerEffect: {name: "Bind", damage: "glue", power: 3, tag: "slimeRestraints"}, - events: [ - {trigger: "bulletHitEnemy", type: "EncaseBound"}, - ], - }, - - /** The following are particle effects */ - {name: "OrgasmStrike", tags: ["offense", "nature", "binding"], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 0, time: 10, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "inert", - }, - {name: "EffectEnemyCM1", tags: [], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 0, time: 10, range: 1.5, size: 3, lifetime: 1, aoe: 0.5, damage: "inert", - }, - {name: "EffectEnemyCM2", tags: [], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 0, time: 10, range: 1.5, size: 3, lifetime: 1, aoe: 0.5, damage: "inert", - }, - {name: "EffectEnemyCM3", tags: [], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 0, time: 10, range: 1.5, size: 3, lifetime: 1, aoe: 0.5, damage: "inert", - }, - {name: "EffectEnemyLock1", tags: [], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 0, time: 10, range: 1.5, size: 3, lifetime: 1, aoe: 0.5, damage: "inert", - }, - {name: "EnemyMiscast", tags: [], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 0, time: 10, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "inert", - }, - {name: "Summon", faction: "Enemy", school: "Conjure", manacost: 0, components: ["Verbal"], level:1, type:"hit", onhit:"instant", time:0, power: 0, delay: 0, range: 4, size: 1, lifetime: 1, damage: "inert"}, // Creates a shroud. Enemies within are hard to hit with melee attacks. - - /** End particle effects */ - - {name: "BindRope", tags: ["offense", "rope", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 3.0, time: 5, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "chain", - playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "ropeRestraints"}, - }, - {name: "BindFabric", tags: ["offense", "fabric", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 3.0, time: 5, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "glue", - playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "ribbonRestraints"}, - }, - {name: "BindVine", tags: ["offense", "nature", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 3.0, time: 10, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "crush", - playerEffect: {name: "Bind", damage: "crush", power: 2, tag: "vineRestraints"}, - }, - {name: "BindChain", tags: ["offense", "metal", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 3.0, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "crush", - events: [{trigger: "bulletHitEnemy", type: "DisarmHumanoid", time: 8}], - playerEffect: {name: "Bind", damage: "crush", power: 2, tag: "chainRestraints"}, - }, - {name: "BindBelt", tags: ["offense", "leather", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], - noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, power: 0, bind: 4.0, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "chain", - events: [{type: "MakeVulnerable", trigger: "beforeDamageEnemy", time: 3,},], - playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "leatherRestraints"}, - }, - - {name: "GagBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 3, components: ["Arms"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", time: 0, power: 2.0, delay: 0, range: 15, damage: "chain", speed: 5, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "gagSpell"}, - events: [ - {type: "SilenceHumanoid", trigger: "bulletHitEnemy", time: 15}, - {type: "ElementalIfNotSilenced", trigger: "bulletHitEnemy", damage: "chain", power: 0, bind: 4}, - ], effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { - name: "Belts", - duration: 20, - }, - }, - {name: "ArmbinderBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 3, components: ["Arms"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", time: 0, power: 5.0, delay: 0, range: 15, damage: "chain", speed: 2, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "armbinderSpell"}, - events: [ - {type: "DisarmHumanoid", trigger: "bulletHitEnemy", time: 14}, - {type: "SilenceHumanoid", trigger: "bulletHitEnemy", time: 14, prereq: "silenced"}, - {type: "BlindHumanoid", trigger: "bulletHitEnemy", time: 14, prereq: "blinded"}, - ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { - name: "Belts", - duration: 20, - }, - }, - {name: "LeatherCuffsBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 3, components: ["Arms"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", time: 0, power: 1.0, bind: 4, delay: 0, range: 15, damage: "chain", speed: 2, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "leathercuffsSpell"}, - events: [ - {type: "ApplyGenBuff", trigger: "bulletHitEnemy", buff: "RestraintDisarmLight", time: 9999}, - ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { - name: "Belts", - duration: 20, - }, - }, - {name: "BlindfoldBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 3, components: ["Arms"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", time: 0, power: 2.0, delay: 0, range: 15, damage: "chain", speed: 5, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "blindfoldSpell"}, - events: [ - {type: "BlindHumanoid", trigger: "bulletHitEnemy", time: 20}, - {type: "ElementalIfNotBlinded", trigger: "bulletHitEnemy", damage: "chain", power: 0, bind: 4}, - ], effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { - name: "Belts", - duration: 20, - }, - }, - {name: "CuffsBolt", tags: ["binding", "metal", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 4, components: ["Arms"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", time: 0, power: 3.0, delay: 0, range: 15, damage: "chain", speed: 5, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 3, tag: "cuffsSpell"}, - events: [ - {type: "DisarmHumanoid", trigger: "bulletHitEnemy", time: 6}, - {type: "ElementalIfNotDisarmed", trigger: "bulletHitEnemy", damage: "chain", power: 0, bind: 4}, - ], effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { - name: "Chains", - duration: 20, - }, - }, - {name: "LegbinderBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 6, components: ["Arms"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", time: 11, power: 4.0, delay: 0, range: 15, damage: "chain", speed: 3, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 4, tag: "legbinderSpell"}, - events: [ - {type: "ElementalIfNotSnared", trigger: "bulletHitEnemy", damage: "chain", power: 0, bind: 5}, - ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { - name: "Belts", - duration: 20, - }, - }, - {name: "HarnessBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 6, components: ["Arms"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", time: 0, power: 5.0, delay: 0, range: 15, damage: "crush", speed: 3, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 5, tag: "harnessSpell"}, - events: [ - {type: "BoundBonus", trigger: "bulletHitEnemy", damage: "chain", power: 0, bind: 5}, - ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { - name: "Belts", - duration: 20, - }, - }, - {name: "StraitjacketBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 6, components: ["Arms"], level:1, type:"bolt", - projectileTargeting:true, onhit:"buff", time: 0, bind: 12, power: 1.0, delay: 0, range: 6, damage: "crush", speed: 2, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 5, tag: "jacketSpell"}, - buffs: [ - {id: "StraitjacketBolt", aura: "#ff4400", type: "Locked", duration: 14, power: 2.0, player: true, enemies: true, tags: ["lock", "debuff"]}, - ], - events: [ - {type: "DisarmHumanoid", trigger: "bulletHitEnemy", time: 10}, - ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.75, effectTile: { - name: "Belts", - duration: 20, - }, - }, - - // A puff of smoke - {name: "SmokePuff", school: "Illusion", manacost: 1, components: ["Verbal"], level:1, type:"inert", buffs: [ - {id: "SmokePuff", type: "Evasion", power: 3.0, player: true, enemies: true, tags: ["darkness"], range: 0.5}, - {id: "SmokePuff2", type: "Sneak", power: 3.0, player: true, duration: 1, enemies: true, tags: ["darkness"], range: 0.5} - ], onhit:"", time:5, aoe: 0.5, power: 0, delay: 2, delayRandom: 5, range: 4, size: 1, damage: ""}, // Creates a shroud. Enemies within are hard to hit with melee attacks. - {name: "SteamPuff", school: "Illusion", manacost: 1, components: ["Verbal"], level:1, type:"inert", buffs: [ - {id: "SmokePuff", type: "Evasion", power: 5.0, player: true, enemies: true, tags: ["darkness"], range: 0.5}, - {id: "SmokePuff2", type: "Sneak", power: 3.0, player: true, duration: 1, enemies: true, tags: ["darkness"], range: 0.5} - ], onhit:"", time:5, aoe: 0.5, power: 0, delay: 2, delayRandom: 5, range: 4, size: 1, damage: ""}, - - {name: "LesserInvisibility", sfx: "MagicSlash", school: "Illusion", manacost: 0, components: ["Verbal"], mustTarget: true, level:1, type:"buff", buffs: [{id: "LesserInvisibility", aura: "#888888", type: "Sneak", duration: 10, power: 3, player: true, enemies: true, tags: ["invisibility"]}], onhit:"", time:10, power: 0, range: 1.5, size: 1, damage: ""}, - - - // Divine Gifts - {name: "Disarm", tags: ["weapon"], sfx: "Chain", school: "Illusion", manacost: 0, components: [], level:1, type:"special", special: "Disarm", noMiscast: true, - onhit:"", time:5, power: 0, range: 3.99, size: 1, damage: ""}, - {name: "Freedom", sfx: "Magic", hitsfx: "Struggle", school: "Conjure", manacost: 15, components: [], mustTarget: true, selfTargetOnly: true, level:5, type:"hit", - onhit:"instant", time:4, lifetime: 1, bind: 8, delay: 1, power: 4, aoe: 2.99, range: 1.5, size: 5, damage: "chain", playerEffect: {name: "RemoveLowLevelRope"}}, - - {allySpell: true, name: "BeltStrike", noise: 2, sfx: "Struggle", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, castRange: 3, nonVolatile: true, onhit:"", power: 4, delay: 0, range: 4, speed: 4, size: 1, damage: "inert", - trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"cast", trailChance: 1.0, - trailcast: {spell: "SingleBelt", target: "onhit", directional:true, offset: false}}, - - {allySpell: true, name: "SingleBelt", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 4, bind: 4, range: 2, size: 1, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsLeatherWeak", tags: ["leatherRestraints", "leatherRestraintsHeavy"], power: 3, damage: "chain", count: 2, noGuard: true}}, - {allySpell: true, name: "Slimethrower", landsfx: "FireSpell", manacost: 0, components: ["Legs"], level:1, type:"hit", onhit:"lingering", time: 3, range: 3.9, power: 3.5, size: 1, aoe: 1, lifetime: 1, lifetimeHitBonus: 9, damage: "glue", playerEffect: {name: "SlimeTrap", time: 3}}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - {allySpell: true, name: "Slimethrower2", landsfx: "FireSpell", manacost: 0, components: [], level:1, type:"hit", onhit:"lingering", time: 3, range: 3.9, power: 2.5, size: 1, aoe: 1, lifetime: 1, lifetimeHitBonus: 9, damage: "glue"}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - {name: "SlimeSuit", sfx: "MagicSlash", school: "Illusion", manacost: 5, components: [], level:1, type:"special", special: "dress", outfit: "SlimeSuit", noMiscast: true, - onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, - - {name: "SlimeForm", sfx: "MagicSlash", school: "Illusion", manacost: 8, components: ["Verbal"], mustTarget: true, level:1, type:"buff", noMiscast: true, - buffs: [ - {id: "SlimeForm", type: "glueDamageResist", aura: "#ff00ff", duration: 25, power: 0.5, player: true, enemies: false, tags: ["defense"]}, - {id: "SlimeForm2", type: "Squeeze", duration: 25, power: 0.5, player: true, enemies: false, tags: ["mobility"]}, - {id: "SlimeForm3", type: "Evasion", duration: 25, power: 0.5, player: true, enemies: false, tags: ["defense"]}, - {id: "SlimeForm4", type: "Counterattack", duration: 25, power: 2.5, player: true, enemies: false, tags: ["counter"], events: [ - {trigger: "beforeAttack", type: "CounterattackDamage", power: 2.5, damage: "glue"}, - ]}, - ], onhit:"", time:10, power: 0, range: 2, size: 1, damage: "", - extraCast: [{spell: "Slimethrower2"}, {spell: "SlimeSuit"}]}, - {name: "AvatarForm", sfx: "PowerMagic", school: "Elements", manacost: 8, components: ["Verbal"], mustTarget: true, level:1, type:"buff", noMiscast: true, - buffs: [ - {id: "AvatarFire", aura: "#f1641f", type: "event", duration: 9999, power: 5, player: true, enemies: false, maxCount: 1, tags: ["cast_fire"], events: [ - {trigger: "calcMana", type: "AvatarFire", power: 5.0}, - ]}, - {id: "AvatarWater", aura: "#2789cd", type: "event", duration: 9999, power: 5, player: true, enemies: false, maxCount: 1, tags: ["cast_water"], events: [ - {trigger: "calcMana", type: "AvatarWater", power: 5.0}, - ]}, - {id: "AvatarAir", aura: "#c9d4fd", type: "event", duration: 9999, power: 5, player: true, enemies: false, maxCount: 1, tags: ["cast_air"], events: [ - {trigger: "calcMana", type: "AvatarAir", power: 5.0}, - ]}, - {id: "AvatarEarth", aura: "#61a53f", type: "event", duration: 9999, power: 5, player: true, enemies: false, maxCount: 1, tags: ["cast_earth"], events: [ - {trigger: "calcMana", type: "AvatarEarth", power: 5.0}, - ]}, - ], onhit:"", time:10, power: 0, range: 2, size: 1, damage: ""}, - - - // Rest of the spells - {name: "ShockStrike", sfx: "Shock", manacost: 1, bulletColor: 0x8888ff, bulletLight: 2, - hitColor: 0x8888ff, hitLight: 6, components: ["Arms"], level:1, type:"hit", noTerrainHit: true, onhit:"aoe", time: 1, delay: 1, power: 2.5, range: 2, size: 1, aoe: 0.5, lifetime: 1, damage: "electric"}, - {name: "StaticSphereStrike", sfx: "Shock", manacost: 2, bulletColor: 0x8888ff, bulletLight: 2, - hitColor: 0x8888ff, hitLight: 6, components: ["Verbal"], level:1, type:"hit", noTerrainHit: true, onhit:"aoe", time: 1, delay: 1, power: 1.5, range: 2, size: 1, aoe: 0.5, lifetime: 1, damage: "electric"}, - {name: "LightningRuneStrike", bulletColor: 0x8888ff, bulletLight: 2, - effectTileDurationMod: 2, effectTile: { - name: "Sparks", - duration: 3, - }, - hitColor: 0x8888ff, hitLight: 6, hitsfx: "Shock", manacost: 2, components: ["Legs"], level:1, type:"dot", noTerrainHit: true, onhit:"", time: 4, delay: 300, power: 4.5, range: 2, size: 1, aoe: 0.5, lifetime: 1, damage: "electric"}, - {name: "FlameRuneStrike", bulletColor: 0xb83716, bulletLight: 2, - hitColor: 0xe64539, hitLight: 6, hitsfx: "Lightning", manacost: 2, components: ["Legs"], level:1, type:"dot", noTerrainHit: true, onhit:"", delay: 300, power: 5.5, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "fire"}, - {name: "FreezeRuneStrike", hitsfx: "Freeze", manacost: 2, bulletColor: 0x8888ff, bulletLight: 2, - hitColor: 0x8888ff, hitLight: 6, components: ["Legs"], level:1, type:"dot", noTerrainHit: true, onhit:"", time: 30, delay: 300, power: 3.0, range: 2, size: 3, aoe: 0.5, lifetime: 1, damage: "ice"}, - {name: "EarthformSingle", tags: ["earth", "utility", "summon"], noSprite: true, minRange: 0, landsfx: "Bones", hideUnlearnable: true, manacost: 4, components: ["Legs"], prerequisite: ["Earthform"], - level:1, type:"hit", onhit:"summon", summon: [{name: "EarthenMonolith", faction: "Rock" , count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: 1, range: 4, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, - - {name: "DarkShroud", sfx: "FireSpell", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", buffs: [{id: "DarkShroud", type: "Evasion", power: 1.5, player: false, enemies: true, tags: ["heavydarkness"], range: 1.5},], - onhit:"", time:8, aoe: 1.5, power: 0, delay: 8, range: 4, size: 3, damage: "", - effectTileDurationModPre: 3, effectTilePre: { - name: "Smoke", - duration: 8, - }}, // Creates a shroud. Enemies within are hard to hit with melee attacks. - {name: "Slippery", sfx: "FireSpell", school: "Elements", manacost: 0, components: ["Verbal"], mustTarget: true, selfTargetOnly: true, level:1, type:"buff", channel: 4, - buffs: [ - {id: "Slippery", aura: "#00ff00", type: "BoostStruggle", duration: 10, power: 0.1, player: true, enemies: false, tags: ["struggle"]}, - ], onhit:"", time:10, power: 0, range: 2, size: 1, damage: ""}, - {name: "Cutting", sfx: "FireSpell", school: "Elements", manacost: 0, components: ["Verbal"], mustTarget: true, selfTargetOnly: true, level:1, type:"buff", channel: 4, - buffs: [ - {id: "Cutting", aura: "#ffff00", type: "BoostCutting", duration: 10, power: 0.3, player: true, enemies: false, tags: ["struggle"]}, - {id: "Cutting2", type: "BoostCuttingMinimum", duration: 10, power: 0.8, player: true, enemies: false, tags: ["struggle", "allowCut"]}, - ], onhit:"", time:10, power: 0, range: 2, size: 1, damage: ""}, - {enemySpell: true, name: "EnemyCorona", - bulletColor: 0xffff77, bulletLight: 5, - minRange: 0, noise: 4, sfx: "MagicSlash", school: "Illusion", manacost: 7, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 12, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, - spellcast: {spell: "EnemyCoronaBeam", target: "target", directional:true, offset: false}, channel: 2}, - {enemySpell: true, name: "EnemyCoronaBeam", - trailColor: 0xffff77, trailLight: 3, - sfx: "FireSpell", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 4, delay: 0, range: 8, speed: 50, size: 1, damage: "fire", - trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1, playerEffect: {name: "CoronaShock", time: 3}}, - {enemySpell: true, name: "MonolithBeam", - bulletColor: 0xff5555, bulletLight: 5, - minRange: 0, noise: 4, sfx: "MagicSlash", school: "Illusion", manacost: 7, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 12, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, - spellcast: {spell: "MonolithBeamBeam", target: "target", directional:true, offset: false}, channel: 2}, - {enemySpell: true, name: "MonolithBeamBeam", - trailColor: 0xff5555, trailLight: 3, - sfx: "MagicSlash", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 6, delay: 0, range: 8, speed: 50, size: 1, damage: "chain", - trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1, playerEffect: {name: "CrystalBind", time: 3}}, - - {enemySpell: true, name: "ClericBeam", - bulletColor: 0x88ff88, bulletLight: 5, - color: "#88ff88", minRange: 0, noise: 4, sfx: "MagicSlash", school: "Illusion", manacost: 7, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 12, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, - spellcast: {spell: "ClericBeamBeam", target: "target", directional:true, offset: false}, channel: 2}, - {enemySpell: true, name: "ClericBeamBeam", - trailColor: 0x88ff88, trailLight: 3, - sfx: "MagicSlash", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 6, delay: 0, range: 8, speed: 50, size: 1, damage: "fire", - trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1, playerEffect: {name: "MysticShock", time: 3}}, - - {name: "BlasterBlast", hitsfx: "Shock", sfx: "Laser", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 2.5, time: 1, delay: 0, - bulletColor: 0xffff00, bulletLight: 5, noMiscast: true, - range: 8, speed: 3, size: 1, damage: "electric", playerEffect: {name: "Shock", time: 3}}, - {enemySpell: true, name: "EnemyBlast", noFirstChoice: true, hitsfx: "Shock", sfx: "Laser", school: "Elements", manacost: 6, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 2.5, time: 1, delay: 0, - bulletColor: 0x00ffff, bulletLight: 5, - range: 8, speed: 3, size: 1, damage: "electric", playerEffect: {name: "Shock", time: 1}}, - - {name: "BondageBust", noise: 7, sfx: "Laser", school: "Illusion", manacost: 0, components: [], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - bulletColor: 0xffff00, bulletLight: 5, - spellcast: {spell: "BondageBustBeam", target: "target", directional:true, offset: false}, noMiscast: true, channel: 1}, - {name: "BondageBustBeam", hitsfx: "Shock", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 3, time: 3, delay: 0, range: 8, speed: 50, size: 1, damage: "electric", - trailColor: 0xffff00, trailLight: 3, - trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1, playerEffect: {name: "Shock", time: 3}}, - {name: "HeartArrow", sfx: "MagicSlash", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "soul", speed: 2, - events: [ - {type: "GreaterRage", trigger: "bulletHitEnemy"}, - ], - }, - - - {enemySpell: true, name: "BearTrap", tags: ["fire", "offense", "defense"], noise: 0, sfx: "Miss", school: "Elements", spellPointCost: 1, manacost: 4, - components: ["Legs"], level:1, type:"inert", - selfcast: true, - onhit:"aoe", delay: 2, power: 2, range: 2.99, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "BearTrapStrike", target: "onhit", directional:false, offset: false}}, - {enemySpell: true, name: "BearTrapStrike", bulletColor: 0xaaaaaa, hideWarnings: true, - hitsfx: "Clang", manacost: 2, components: ["Legs"], level:1, type:"dot", noTerrainHit: true, onhit:"", delay: 20, power: 1, range: 2, bind: 4, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", - playerEffect: {name: "BearTrapStun", count: 1, power: 2.0, damage: "chain", time: 3}}, - - - {name: "CoronaBeam", sfx: "FireSpell", - trailColor: 0xffff77, trailLight: 3, - school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 12, delay: 0, range: 8, speed: 50, size: 1, damage: "fire", - trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1}, - {name: "AllyCrackle", sfx: "Shock", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 4, delay: 0, time: 1, range: 4, speed: 4, size: 1, damage: "electric", - trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1.0}, - {allySpell: true, name: "AllyFirebolt", sfx: "FireSpell", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4.5, delay: 0, range: 50, damage: "fire", speed: 3}, - {allySpell: true, name: "AllyWindBlast", sfx: "FireSpell", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", power: 2.0, time: 2, delay: 0, range: 50, damage: "stun", speed: 1, hitSpin: 1, bulletSpin: 1, - events: [{type: "Knockback", trigger: "bulletHitEnemy", power: 1.0, dist: 1.0},]}, - {allySpell: true, name: "AllyShadowStrike", minRange: 0, sfx: "MagicSlash", school: "Illusion", manacost: 3, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", power: 6, time: 2, delay: 1, range: 1.5, size: 1, aoe: 0.75, lifetime: 1, damage: "cold"}, - {allySpell: true, name: "HeelShadowStrike", sfx: "MagicSlash", school: "Illusion", manacost: 3, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", power: 2.5, time: 4, delay: 1, range: 1.5, size: 1, aoe: 0.75, lifetime: 1, damage: "cold"}, - {allySpell: true, name: "FlameStrike", sfx: "FireSpell", school: "Element", manacost: 6, components: [], level:1, type:"inert", onhit:"aoe", noTerrainHit: true, power: 3, delay: 1, range: 1.5, size: 3, aoe: 1.5, lifetime: 1, damage: "fire"}, - {allySpell: true, name: "ShatterStrike", sfx: "MagicSlash", school: "Element", manacost: 0, components: [], level:1, type:"hit", onhit:"instant", noTerrainHit: true, power: 1.5, delay: 1, range: 1.5, time: 4, size: 3, aoe: 1.5, lifetime: 1, damage: "frost"}, - {name: "Ignition", faction: "Rage", school: "Element", manacost: 0, components: [], level:1, type:"hit", onhit:"instant", noTerrainHit: true, power: 1.5, delay: 1, range: 1.5, size: 3, aoe: 1.5, lifetime: 1, damage: "fire", playerEffect: {name: "Ignition", power: 1, damage: "fire"}}, - {name: "VolcanicStrike", school: "Element", manacost: 0, components: [], level:1, hitsfx: "Lightning", type:"hit", onhit:"instant", noTerrainHit: true, power: 6.0, delay: 1, range: 1.5, size: 5, aoe: 2.99, damageFlags: ["VolcanicDamage"], lifetime: 1, damage: "fire", playerEffect: {name: "Damage"}}, - {allySpell: true, name: "ArcaneStrike", school: "Element", manacost: 0, components: [], level:1, type:"hit", onhit:"instant", noTerrainHit: true, power: 2.5, delay: 1, range: 1.5, size: 3, aoe: 1.5, lifetime: 1, damage: "soul"}, - {enemySpell: true, name: "ShadowStrike", sfx: "MagicSlash", school: "Illusion", manacost: 3, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", power: 6, time: 2, delay: 1, range: 1.5, size: 1, aoe: 0.75, lifetime: 1, damage: "cold", playerEffect: {name: "ShadowStrike", damage: "cold", power: 4, count: 1}}, - - - {name: "RopeBolt", color: "#ffff00", sfx: "Miss", school: "Conjure", manacost: 1, tags: ["rope"], components: ["Verbal"], level:1, type:"bolt", - projectileTargeting:true, onhit:"", power: 2.0, bind: 2.2, delay: 0, range: 50, damage: "chain", bindType: "Rope", speed: 3, playerEffect: {name: "SingleRope"}, - effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { - name: "Ropes", - duration: 20, - },}, - - - {name: "Icicle", sfx: "MagicSlash", hitsfx: "Freeze", school: "Elements", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 4, - power: 3, delay: 0, range: 50, damage: "frost", speed: 2, playerEffect: {name: "Damage"}, - bulletColor: 0x92e4e8, bulletLight: 3, - events: [{type: "ElementalOnSlowOrBindOrDrench", trigger: "bulletHitEnemy", damage: "ice", time: 3, power: 0},]}, - {name: "Boulder", sfx: "Bones", hitsfx: "HeavySwing", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", block: 8, time: 4, power: 4, delay: 0, range: 50, damage: "crush", speed: 2, playerEffect: {name: "Damage"}}, // Throws a blast of ice which stuns the target for 4 turns - {allySpell: true, name: "BoulderKicked", sfx: "Bones", hitsfx: "HeavySwing", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 4, power: 4, delay: 0, range: 50, damage: "crush", speed: 2, playerEffect: {name: "Damage"}}, // Throws a blast of ice which stuns the target for 4 turns - {name: "BigBoulder", sfx: "Bones", hitsfx: "HeavySwing", school: "Elements", manacost: 7, components: ["Arms"], level:1, type:"bolt", noDirectDamage: true, - projectileTargeting:true, alwaysCollideTags: ["summonedRock"], onhit:"aoe", block: 20, time: 8, power: 12, aoe: 1.5, size: 3, delay: 0, lifetime: 1, range: 50, damage: "crush", speed: 1, playerEffect: {name: "Damage"}}, // Throws a blast of ice which stuns the target for 4 turns - - - {enemySpell: true, name: "Ribbons", color: "#6700ff", noise: 6, sfx: "Struggle", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, castRange: 3, nonVolatile: true, onhit:"", power: 3, delay: 0, range: 4, speed: 4, size: 1, damage: "inert", - trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"cast", trailChance: 1.0, - trailcast: {spell: "SingleRibbon", target: "onhit", directional:true, offset: false}}, - {enemySpell: true, name: "SingleRibbon", color: "#6700ff", sfx: "Struggle", manacost: 4, components: [], level:1, - effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { - name: "Fabric", - duration: 20, - }, - type:"inert", onhit:"aoe", time: 5, delay: 1, power: 4, range: 2, size: 1, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsRibbons", tags: ["magicRibbons"], power: 3, damage: "chain", count: 1, noGuard: true}}, - - {enemySpell: true, msg: true, name: "AreaElectrify", minRange: 0, landsfx: "Shock", school: "Conjure", specialCD: 10, manacost: 10, components: ["Legs"], level:1, type:"inert", onhit:"cast", - dot: true, time: 4, delay: 3, range: 2.5, size: 3, aoe: 2.5, lifetime: 1, power: 1, damage: "inert", - spellcasthit: {spell: "WitchElectrify", target: "onhit", chance: 0.22, directional:false, offset: false}, channel: 2}, - - {enemySpell: true, name: "IceDragonBreath", color: "#00ffff", sfx: "Freeze", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", time: 1, power: 4, delay: 0, range: 4, speed: 50, size: 1, damage: "inert", - trailPower: 4, trailLifetime: 1, trailLifetimeBonus: 4, trailTime: 3, trailspawnaoe: 1.5, trailDamage:"ice", trail:"lingering", trailChance: 0.3, trailPlayerEffect: {name: "Freeze", time: 3}}, - {enemySpell: true, name: "IceDragonBreathPrepare", color: "#00ffff", minRange: 0, sfx: "MagicSlash", school: "Illusion", manacost: 8, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 12, range: 5, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "IceDragonBreath", target: "target", directional:true, offset: false}, channel: 2}, - - {enemySpell: true, name: "IceSlow", color: "#00ffff", sfx: "Freeze", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 1, delay: 0, time: 2, range: 4, speed: 50, size: 1, damage: "inert", - trailPower: 4, trailLifetime: 2, trailLifetimeBonus: 8, trailTime: 3, trailspawnaoe: 1.5, trailDamage:"ice", trail:"lingering", trailChance: 0.5, trailPlayerEffect: {name: "Chill", time: 3, damage: "ice", power: 1}}, - {enemySpell: true, name: "IceSlowPrepare", color: "#00ffff", minRange: 0, sfx: "MagicSlash", school: "Illusion", manacost: 8, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 12, range: 5, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", - spellcast: {spell: "IceSlow", target: "target", directional:true, offset: false}, channel: 1}, - - {enemySpell: true, name: "FlashBomb", color: "#ff2200", minRange: 0, sfx: "Miss", school: "Illusion", manacost: 3, specialCD: 12, components: ["Verbal"], - hitColor: 0xffffff, hitLight: 7, - level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 1, range: 4, size: 3, aoe: 1.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 3}}, - {enemySpell: true, name: "EnemyFlash", color: "#ffffff", minRange: 0, noise: 8, sfx: "FireSpell", school: "Illusion", manacost: 4, components: ["Verbal"], level:1, - hitColor: 0xffffff, hitLight: 7, - type:"inert", onhit:"aoe", time: 3, delay: 1, power: 1, range: 2.5, size: 3, aoe: 1.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 4}}, - - {enemySpell: true, name: "SleepGas", color: "#00ff00", sfx: "Miss", school: "Illusion", manacost: 4, specialCD: 24, components: ["Verbal"], level:1, type:"inert", passthrough: true, noTerrainHit: true, buffs: [ - {id: "SleepGas", type: "Sleepiness", power: 1, player: true, enemies: false, tags: ["sleep"], range: 1.5}], onhit:"", time:6, aoe: 1.5, power: 1, delay: 8, range: 4, size: 3, damage: "poison", playerEffect: {name: "DamageNoMsg", damage: "poison", power: 1}}, // Creates a shroud. Enemies within are hard to hit with melee attacks. - - {enemySpell: true, name: "Glue", color: "#ffff00", landsfx: "Freeze", school: "Conjure", manacost: 9, components: ["Legs"], level:1, type:"inert", onhit:"lingering", time: 4, delay: 1, range: 4, size: 3, aoe: 1.5, lifetime: 24, power: 4, lifetimeHitBonus: 76, damage: "glue", playerEffect: {name: "Glue", count: 1, damage: "glue", power: 4, time: 1}}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - - {enemySpell: true, name: "RedSlime", sfx: "Miss", manacost: 4, specialCD: 15, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "glue", speed: 1.5, playerEffect: {name: "DamageNoMsg", power: 4, damage: "glue"}, - spellcast: {spell: "SummonSingleRedSlime", target: "onhit", directional:false, offset: false, strict: true}}, - - {enemySpell: true, name: "AmpuleBlue", sfx: "Miss", manacost: 5, specialCD: 15, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "glue", speed: 1, playerEffect: {name: "AmpuleBlue", damage: "glue", power: 4, count: 1}}, - - {enemySpell: true, name: "AmpuleGreen", sfx: "Miss", manacost: 4, specialCD: 15, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1, delay: 0, range: 50, damage: "crush", speed: 1, playerEffect: {name: "Ampule", damage: "inert"}, - spellcast: {spell: "SleepGas", target: "onhit", directional:false, offset: false}}, - {enemySpell: true, name: "AmpuleYellow", sfx: "Miss", manacost: 7, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1, delay: 0, range: 50, damage: "crush", speed: 1, playerEffect: {name: "Ampule", damage: "inert"}, - spellcast: {spell: "Glue", target: "onhit", directional:false, offset: false}}, - {enemySpell: true, name: "AmpuleRed", sfx: "Miss", manacost: 7, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1, delay: 0, range: 50, damage: "crush", speed: 1, playerEffect: {name: "Ampule", damage: "inert"}, - spellcast: {spell: "SummonRedSlime", target: "onhit", directional:true, offset: false}}, - - {name: "ManyOrbs", sfx: "MagicSlash", minRange: 0, manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, - spellcast: {spell: "ZombieOrbMini", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 2.5, offset: false}, channel: 3}, - {enemySpell: true, name: "ZombieOrbMini", sfx: "MagicSlash", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1.5, delay: 0, range: 50, damage: "chain", speed: 1, - playerEffect: {name: "MysticShock", time: 3}}, - - {enemySpell: true, name: "ZombieOrb", sfx: "MagicSlash", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, delay: 0, range: 50, damage: "chain", speed: 1, - playerEffect: {name: "CharmWraps", power: 2, damage: "ice", time: 1}}, - {enemySpell: true, name: "ZombieOrbIce", color: "#00ffff", specialCD: 12, sfx: "MagicSlash", hitsfx: "Freeze", manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, time: 3, onhit:"", power: 3, delay: 0, range: 50, damage: "ice", speed: 1, - playerEffect: {name: "Freeze", power: 4, damage: "ice", time: 4}}, - - {enemySpell: true, name: "SarcoEngulf", castCondition: "sarcoEngulf", color: "#ff2200", sfx: "Fwoosh", effectTileDurationMod: 10, effectTileDensity: 0.33, effectTile: { - name: "FabricGreen", - duration: 20, - }, manacost: 3, minRange: 0, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 3, range: 2.5, size: 3, aoe: 1, lifetime: 1, damage: "chain", playerEffect: {name: "SarcoEngulf", power: 2}}, - - {enemySpell: true, name: "SarcoHex", castCondition: "sarcoHex", color: "#ff2200", sfx: "Fwoosh", manacost: 3, minRange: 0, components: ["Verbal"], - level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 4, range: 2.5, size: 3, aoe: 1, lifetime: 1, damage: "charm", playerEffect: {name: "SarcoHex", power: 2}}, - - - {enemySpell: true, name: "RopeEngulf", color: "#ff2200", sfx: "Struggle", effectTileDurationMod: 10, effectTileDensity: 0.33, effectTile: { - name: "Ropes", - duration: 20, - }, manacost: 3, minRange: 0, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 4.5, range: 2, size: 3, aoe: 1, lifetime: 1, damage: "chain", playerEffect: {name: "RopeEngulf", power: 2}}, - {enemySpell: true, name: "RopeEngulfWeak", color: "#ff2200", sfx: "Struggle", effectTileDurationMod: 10, effectTile: { - name: "Ropes", - duration: 20, - }, manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 3, range: 3.5, size: 3, aoe: 1, lifetime: 1, damage: "chain", playerEffect: {name: "RopeEngulfWeak", power: 1, damage: "chain"}}, - {enemySpell: true, name: "Entangle", color: "#88ff88", minRange: 0, sfx: "Struggle", effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { - name: "Vines", - duration: 20, - }, manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 4, range: 6, size: 3, aoe: 1, lifetime: 1, damage: "chain", playerEffect: {name: "VineEngulf", power: 2}}, - - {enemySpell: true, name: "CrushingFate", color: "#dddddd", minRange: 0, sfx: "MagicSlash", bulletSpin: 0.25, - manacost: 7, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 4, delay: 6, power: 5, range: 7, size: 5, aoe: 2.5, lifetime: 1, damage: "crush", playerEffect: {name: "MoonBondage", count: 2, kind: "mithrilRestraints"}}, - {enemySpell: true, name: "BoundByFate", color: "#dddddd", minRange: 0, sfx: "MagicSlash", bulletSpin: -0.25, - manacost: 7, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 4, range: 7, size: 3, aoe: 1.5, lifetime: 1, damage: "soul", playerEffect: {name: "BoundByFate", time: 6}}, - - {enemySpell: true, name: "Feathers", color: "#ffffff", sfx: "Tickle", manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 5, range: 6, size: 3, aoe: 1.5, lifetime: 1, damage: "tickle", playerEffect: {name: "Damage"}}, - {enemySpell: true, name: "NurseBola", color: "#ff2200", sfx: "Miss", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 3, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "NurseBola"}}, // Throws a chain which stuns the target for 1 turn - {enemySpell: true, name: "NurseSyringe", color: "#ff00ff", minRange: 1.5, sfx: "Miss", manacost: 2, castRange: 6, components: ["Arms"], level:1, speed: 1, - type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "pain", playerEffect: {name: "NurseSyringe", power: 4, type: "chain", time: 8},}, - {enemySpell: true, name: "RibbonBurst", color: "#ff00ff", sfx: "MagicSlash", manacost: 5, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 4, range: 6, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsRibbons", tags: ["magicRibbons"], power: 3, damage: "chain", count: 2, noGuard: true}}, - {enemySpell: true, name: "Spores", color: "#6733aa", sfx: "MagicSlash", manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 3, range: 6, size: 3, aoe: 1.5, lifetime: 1, damage: "poison", playerEffect: {name: "Spores", power: 2, damage: "poison"}}, - {enemySpell: true, name: "SporesHappy", color: "#ff00ff", sfx: "FireSpell", noCastMsg: true, selfcast: true, manacost: 3, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 0.5, range: 3, size: 3, aoe: 1.5, lifetime: 1, damage: "poison", playerEffect: {name: "SporesHappy", power: 2, damage: "poison", distraction: 10}}, - {enemySpell: true, name: "SporesSick", color: "#55ff55", noCastMsg: true, hitsfx: "DamageWeak", selfcast: true, manacost: 0, components: ["Verbal"], level:1, type:"hit", onhit:"aoe", time: 5, delay: 0, power: 0.5, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "poison", playerEffect: {name: "SporesSick", power: 2, damage: "poison"}}, - {enemySpell: true, name: "SoulCrystalBind", color: "#ff5277", minRange: 0, sfx: "Evil", manacost: 7, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 6, range: 6, size: 3, aoe: 1.5, lifetime: 1, damage: "drain", playerEffect: {name: "ObsidianEngulf", count: 1, power: 6, damage: "drain"}}, - - {enemySpell: true, name: "MinerBomb", color: "#ff2200", selfcast: true, noise: 5, sfx: "FireSpell", hitsfx: "FireSpell", school: "Conjure", manacost: 5, components: ["Verbal"], level:1, - effectTileDurationMod: 7, effectTile: { - name: "Smoke", - duration: -1, - }, type:"inert", onhit:"aoe", delay: 5, power: 6, range: 3, size: 3, aoe: 1.5, lifetime: 1, damage: "fire", playerEffect: {name: "HeatBlast", time: 3, damage: "pain", power: 6}}, - - {name: "ManyChains", sfx: "MagicSlash", minRange: 0, manacost: 3, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, - spellcast: {spell: "WitchChainBolt", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 1, offset: false}, channel: 3}, - - {enemySpell: true, name: "WitchChainBolt", color: "#ffffff", sfx: "FireSpell", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", bind: 12, time: 6, power: 6, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "SingleChain", time: 1}, effectTileDurationMod: 10, effectTile: { - name: "Chains", - duration: 20, - },}, // Throws a chain which stuns the target for 1 turn - {enemySpell: true, name: "MagicChain", color: "#ff00ff", sfx: "FireSpell", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 6, power: 6, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "SingleMagicChain", time: 1}, effectTileDurationMod: 10, effectTile: { - name: "Chains", - duration: 20, - },}, // Throws a chain which stuns the target for 1 turn - {enemySpell: true, name: "BanditBola", bindType: "Rope", color: "#ff2200", sfx: "Miss", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1.5, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "BanditBola"}}, // Throws a chain which stuns the target for 1 turn - {enemySpell: true, name: "WitchRope", bindType: "Rope", color: "#ff2200", sfx: "Miss", effectTileDurationMod: 10, effectTile: { - name: "Ropes", - duration: 20, - }, manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, delay: 0, range: 50, damage: "chain", speed: 3, playerEffect: {name: "SingleRope"}}, - {allySpell: true, name: "PlayerBola", bindType: "Rope", fastStart: true, color: "#ff2200", noMiscast: true, sfx: "Miss", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 4, power: 3, bind: 9, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "BanditBola", time: 1}}, // Throws a chain which stuns the target for 1 turn - - {enemySpell: true, name: "RestrainingDevice", bindType: "Metal", color: "#19fac1", sfx: "Miss", manacost: 6, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", - effectTileDurationMod: 8, effectTile: { - name: "Chains", - duration: 10, - }, - power: 6, delay: 0, range: 4.99, damage: "chain", speed: 1, playerEffect: {name: "RestrainingDevice", count: 3, time: 3, power: 5, damage: "crush"}}, - - {enemySpell: true, name: "MiniCable", bindType: "Metal", color: "#19fac1", sfx: "MechLaunch", manacost: 6, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", - effectTileDurationMod: 8, effectTile: { - name: "Chains", - duration: 10, - }, - power: 6, delay: 0, range: 4.99, damage: "chain", speed: 1, playerEffect: {name: "RestrainingDevice", count: 1, time: 3, power: 5, damage: "crush"}}, - {enemySpell: true, name: "ManyCables", sfx: "MechEngage", minRange: 0, manacost: 12, color: "#19fac1", projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", - time: 5, delay: 3, power: 3, range: 6.99, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, - spellcast: {spell: "MiniCable", sfx: "MechLaunch", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 1, offset: false}, channel: 3}, - - - - {enemySpell: true, name: "ShadowBolt", bindType: "Slime", color: "#6a15fa", sfx: "Evil", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 3, delay: 0, range: 50, damage: "cold", speed: 2, playerEffect: {name: "ShadowBolt", count: 1, time: 3, power: 3, damage: "cold"}}, - {enemySpell: true, name: "ObsidianBolt", bindType: "Metal", color: "#ff5277", sfx: "Evil", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 3, delay: 0, range: 50, damage: "cold", speed: 2, playerEffect: {name: "ObsidianBolt", count: 1, time: 3, power: 3, damage: "cold"}}, - {enemySpell: true, name: "RubberBolt", bindType: "Slime", color: "#ff3388", sfx: "RubberBolt", manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "glue", speed: 2, playerEffect: {name: "RubberBolt", count: 1, time: 4, power: 4, damage: "glue"}}, - {enemySpell: true, name: "EncaseBolt", bindType: "Slime", color: "#a04abd", sfx: "RubberBolt", manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, delay: 0, range: 50, damage: "glue", speed: 2, playerEffect: {name: "EncaseBolt", count: 1, time: 4, power: 2, damage: "glue"}}, - {enemySpell: true, name: "EncaseBoltDrone", bindType: "Slime", color: "#a04abd", sfx: "RubberBolt", manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1, delay: 0, range: 50, damage: "glue", speed: 2, playerEffect: {name: "EncaseBoltDrone", count: 1, time: 4, power: 1, damage: "glue"}}, - - {enemySpell: true, name: "RubberNuke", bindType: "Slime", color: "#ff3388", sfx: "Missile", manacost: 8, components: ["Arms"], - spellcast: {spell: "RubberNukeExplosion", target: "onhit", directional:true, offset: false}, - events: [{type: "RubberMissileHoming", trigger: "bulletAfterTick", power: 1.0, dist: 5.5, count: 0.25, limit: 0.7},], - level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 12, delay: 0, range: 50, damage: "crush", speed: 0.5, playerEffect: {name: "RubberMissile", count: 4, time: 4, power: 8, damage: "glue"}}, - {enemySpell: true, name: "RubberNukeExplosion", landsfx: "Lightning", bindType: "Slime", school: "Element", manacost: 0, components: [], - effectTileDurationMod: 3, effectTile: { - name: "Slime", - duration: 12, - }, - level:1, type:"hit", onhit:"instant", noTerrainHit: true, power: 20, delay: 1, range: 2.5, size: 5, aoe: 2.5, lifetime: 1, damage: "glue"}, - - {enemySpell: true, name: "RubberMissile", bindType: "Slime", color: "#ff3388", sfx: "Missile", manacost: 8, components: ["Arms"], - spellcast: {spell: "RubberMissileExplosion", target: "onhit", directional:true, offset: false}, - events: [{type: "RubberMissileHoming", trigger: "bulletAfterTick", power: 1.0, dist: 5.5, count: 0.5, limit: 0.7},], - level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "crush", speed: 0.5, playerEffect: {name: "RubberMissile", count: 2, time: 4, power: 4, damage: "glue"}}, - {enemySpell: true, name: "RubberMissileExplosion", landsfx: "Lightning", bindType: "Slime", school: "Element", manacost: 0, components: [], - effectTileDurationMod: 3, effectTile: { - name: "Slime", - duration: 12, - }, - level:1, type:"hit", onhit:"instant", noTerrainHit: true, power: 1.5, bind: 7, delay: 1, range: 1.5, size: 3, aoe: 1.5, lifetime: 1, damage: "glue"}, - - - {enemySpell: true, name: "CelestialBolt", bindType: "Rope", color: "#ffff44", sfx: "MagicSlash", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 3, delay: 0, range: 50, damage: "cold", bind: 6, speed: 4, playerEffect: {name: "CelestialBolt", count: 2, time: 3, power: 3, damage: "cold"}}, - {enemySpell: true, name: "WolfCrackle", color: "#8789fd", tags: ["electric", "offense", "aoe"], prerequisite: "Shock", noise: 6, sfx: "Shock", slowStart: true, - effectTileDurationModTrail: 2, effectTileTrail: { - name: "Sparks", - duration: 3, - }, - school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 2.0, delay: 0, time: 1, range: 4, speed: 4, size: 1, damage: "electric", - trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1.0, playerEffect: {name: "Shock", time: 1}}, - - - {enemySpell: true, name: "MummyBolt", color: "#88ff88", sfx: "FireSpell", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "fire", speed: 3, playerEffect: {name: "MysticShock", time: 3}}, - {enemySpell: true, name: "RobotBolt", color: "#ff5277", sfx: "Laser", manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "electric", speed: 2, playerEffect: {name: "RobotShock", time: 2}}, - {enemySpell: true, name: "RubberBullets", bindType: "Slime", color: "#ffff00", minRange: 2.9, sfx: "Gunfire", manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, time: 0, delay: 0, range: 50, damage: "glue", speed: 3, playerEffect: {name: "RubberBullets", power: 4, count: 1, damage: "glue"}}, - {enemySpell: true, name: "HeatBolt", color: "#ffff00", sfx: "FireSpell", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "fire", speed: 2, playerEffect: {name: "HeatBlast", time: 1, damage: "pain", power: 5}}, - {enemySpell: true, noFirstChoice: true, name: "Hairpin", color: "#ffffff", minRange: 2.9, sfx: "Miss", manacost: 2, castRange: 6, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "pain", speed: 2, playerEffect: {name: "Hairpin", power: 2, damage: "pain", time: 1}}, - {enemySpell: true, name: "PoisonDragonBlast", bindType: "Vine", color: "#88ff88", sfx: "FireSpell", hitsfx: "Bones", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "grope", speed: 3, effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { - name: "Vines", - duration: 20, - }, playerEffect: {name: "VineEngulf", power: 2}}, - {enemySpell: true, name: "ElfArrow", bindType: "Vine", color: "#88ff88", sfx: "Miss", hitsfx: "FireSpell", manacost: 3, components: ["Arms"], level: 1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, delay: 0, range: 50, damage: "fire", speed: 1, playerEffect: {name: "EnchantedArrow", power: 2, count: 1}}, - {enemySpell: true, name: "ShadowOrb", color: "#8833ff", minRange: 2.9, sfx: "MagicSlash", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 5, damage: "inert", speed: 2, playerEffect: {name: ""}, - spellcast: {spell: "ShadowScythe", target: "onhit", directional:true, offset: false}}, - {enemySpell: true, name: "ShadowScythe", color: "#0000ff", sfx: "MagicSlash", manacost: 4, components: ["Verbal"], level:1, type:"inert", noTerrainHit: true, onhit:"aoe", time: 5, delay: 1, power: 6, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "ShadowBind", time: 4}}, - {enemySpell: true, name: "WitchSlime", bindType: "Slime", color: "#ff00ff", minRange: 0, landsfx: "MagicSlash", manacost: 7, components: ["Legs"], level:1, type:"inert", onhit:"lingering", - time: 2, delay: 1, range: 4, power: 2, size: 3, aoe: 1, lifetime: 1, lifetimeHitBonus: 9, damage: "glue", playerEffect: {name: "SlimeTrap", time: 3}, - effectTileDurationModLinger: 8, effectTileLinger: { - name: "Slime", - duration: 10, - },}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - {enemySpell: true, name: "RubberSlime", bindType: "Slime", color: "#ff00ff", minRange: 0, landsfx: "MagicSlash", manacost: 7, components: ["Legs"], level:1, type:"inert", onhit:"lingering", - time: 2, delay: 1, range: 4, power: 2, size: 3, aoe: 1, lifetime: 1, lifetimeHitBonus: 9, damage: "glue", playerEffect: {name: "EncaseBolt", count: 1, time: 4, power: 5, damage: "glue"}, - effectTileDurationModLinger: 8, effectTileLinger: { - name: "Slime", - duration: 10, - },}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - {enemySpell: true, name: "WitchSlimeBall", bindType: "Slime", color: "#ff00ff", sfx: "FireSpell", manacost: 6, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", - time: 2, power: 2, delay: 0, range: 50, damage: "glue", speed: 1, trailLifetime: 10, trailDamage:"glue", trail:"lingering", trailPower: 2, trailChance: 1.0, playerEffect: {name: "Slime", time: 3}, - effectTileDurationModTrail: 4, effectTileTrail: { - name: "Slime", - duration: 4, - } - }, // Throws a ball of slime which oozes more slime - {enemySpell: true, name: "SlimePuddle", bindType: "Slime", color: "#ff00ff", sfx: "FireSpell", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"lingering", - time: 2, power: 2, lifetime: 5, lifetimeHitBonus: 5, aoe: 1.5, delay: 0, range: 50, damage: "glue", speed: 1, playerEffect: {name: "SlimeTrap", time: 3}, - effectTileDurationModLinger: 8, effectTileLinger: { - name: "Slime", - duration: 10, - }, - }, - - {enemySpell: true, name: "MiniSlime", color: "#ff00ff", sfx: "MagicSlash", landsfx: "MagicSlash", manacost: 1, level:1, type:"bolt", projectileTargeting:true, onhit:"", - time: 2, power: 2, delay: 0, range: 50, damage: "glue", speed: 1, playerEffect: {name: "MiniSlime", time: 2}, - effectTileDurationMod: 8, effectTile: { - name: "Slime", - duration: 10, - },}, // Throws a ball of slime which oozes more slime - {enemySpell: true, name: "ManySlimes", sfx: "MagicSlash", minRange: 0, manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, - spellcast: {spell: "MiniSlime", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 1, offset: false}, channel: 3}, - - // Bandit trader - {enemySpell: true, name: "PoisonDagger", color: "#ff00ff", minRange: 1.5, sfx: "Miss", manacost: 2, castRange: 6, components: ["Arms"], level:1, speed: 1, - type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "poison", playerEffect: {name: "PoisonDagger", power: 4, type: "poison", time: 8},}, - {enemySpell: true, name: "LustBomb", color: "#ff5277", minRange: 0, sfx: "Miss", school: "Illusion", manacost: 2, specialCD: 12, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 2.5, range: 4, size: 3, aoe: 1.5, lifetime: 1, damage: "charm", playerEffect: {name: "LustBomb", damage: "charm", power: 3.5 }}, - - // Fungal spells - {enemySpell: true, name: "CrystalPuff", color: "#b37bdc", minRange: 0, landsfx: "MagicSlash", manacost: 4, components: ["Arms"], level:1, type:"inert", onhit:"aoe", power: 3.5, time: 1, delay: 1, range: 4, size: 1, aoe: 0.75, lifetime: 1, damage: "souldrain", playerEffect: {name: "CrystalBind", time: 1}}, - {enemySpell: true, name: "HighBolt", color: "#8888ff", sfx: "MagicSlash", manacost: 3, specialCD: 7, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", - power: 6, delay: 0, range: 50, damage: "poison", speed: 1, playerEffect: {name: "Flummox", time: 1, damage: "poison", power: 6}}, - - // Shockwitch spells - {enemySpell: true, name: "WitchElectrify", color: "#8888ff", minRange: 0, landsfx: "Shock", manacost: 5, - effectTileDurationMod: 2, effectTile: { - name: "Sparks", - duration: 3, - }, - components: ["Arms"], level:1, type:"inert", onhit:"aoe", power: 3.5, time: 1, delay: 1, range: 4, size: 1, aoe: 0.75, lifetime: 1, damage: "electric", playerEffect: {name: "Shock", time: 1}}, // A series of light shocks incapacitate you - {enemySpell: true, name: "WitchElectricOrb", color: "#8888ff", sfx: "MagicSlash", manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 0, delay: 0, range: 5, damage: "electric", speed: 1, playerEffect: {name: ""}, - spellcast: {spell: "WitchElectricBurst", target: "onhit", directional:true, offset: false}}, - {enemySpell: true, name: "WitchElectricBurst", sfx: "Shock", manacost: 4, components: ["Verbal"], level:1, type:"hit", - effectTileDurationMod: 2, effectTile: { - name: "Sparks", - duration: 3, - }, - noTerrainHit: true, onhit:"aoe", time: 5, delay: 1, power: 4, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "electric", playerEffect: {name: "Shock", time: 1}}, - - // Elemental witch spells - {enemySpell: true, name: "WitchWaterBall", color: "#4f7db8", tags: ["water", "bolt", "offense", "utility"], sfx: "FireSpell", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"buff", - power: 3.0, delay: 0, range: 50, damage: "acid", speed: 3, playerEffect: {name: "Drench"}, - buffs: [ - Object.assign({}, KDDrenched), - Object.assign({}, KDDrenched2), - Object.assign({}, KDDrenched3), - ], - effectTileDurationMod: 40, effectTile: { - name: "Water", - duration: 40, - }, - }, - {enemySpell: true, name: "WitchIcebolt", color: "#92e8c0", tags: ["ice", "bolt", "offense"], sfx: "MagicSlash", hitsfx: "Freeze", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", - effectTileDurationMod: 10, effectTile: { - name: "Ice", - duration: 20, - }, - projectileTargeting:true, onhit:"", time: 4, power: 3.5, delay: 0, range: 50, damage: "frost", speed: 2, playerEffect: {name: "Chill", damage: "ice", power: 3, time: 3}, - events: [{type: "ElementalOnSlowOrBindOrDrench", trigger: "bulletHitEnemy", damage: "ice", time: 4, power: 0},]}, - {enemySpell: true, name: "WitchBoulder", sfx: "Bones", hitsfx: "HeavySwing", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", block: 8, time: 4, power: 4, delay: 0, range: 50, damage: "crush", speed: 2, playerEffect: {name: "WitchBoulder", time: 2}}, - - {enemySpell: true, name: "SummonSlimeMold", noSprite: true, minRange: 0, sfx: "Bones", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "SlimeMold", count: 1, strict: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}}, - - {enemySpell: true, name: "SummonSkeleton", landsfx: "Bones", minRange: 0, manacost: 8, components: ["Verbal"], level:3, type:"inert", onhit:"summon", summon: [{name: "SummonedSkeleton", count: 1, time: 12, strict: true, bound: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 4, size: 3, aoe: 2.1, lifetime: 1, damage: "inert"}, - {enemySpell: true, name: "SummonSkeletons", landsfx: "Bones", minRange: 0, manacost: 18, components: ["Verbal"], level:4, type:"inert", onhit:"summon", summon: [{name: "SummonedSkeleton", count: 4, time: 16, strict: true, bound: true, weakBinding: true}], power: 0, time: 16, delay: 1, range: 4, size: 3, aoe: 2.6, lifetime: 1, damage: "inert"}, - {enemySpell: true, name: "SummonZombies", landsfx: "Bones", specialCD:16, minRange: 0, manacost: 4, components: ["Verbal"], level:4, type:"inert", onhit:"summon", summon: [{name: "SummonedZombie", count: 4, strict: true, minRange: 1.5, bound: true, weakBinding: true}], power: 0, time: 16, delay: 1, range: 4, size: 3, aoe: 4.6, lifetime: 1, damage: "inert"}, - {enemySpell: true, name: "SummonDrones", landsfx: "Teleport", specialCD:12, selfcast: true, minRange: 0, manacost: 4, components: ["Verbal"], level:4, type:"inert", onhit:"summon", - summon: [{name: "SummonedDrone", count: 2, strict: true, bound: true, time: 16, faction: "Ambush"}], power: 0, time: 15, delay: 3, range: 8, size: 3, aoe: 4.6, lifetime: 1, damage: "inert"}, - {enemySpell: true, name: "SummonCaptureDrones", landsfx: "Teleport", specialCD:7, minRange: 0, manacost: 4, components: ["Verbal"], level:4, type:"inert", onhit:"summon", - summon: [{name: "SummonedCaptureDrone", count: 2, strict: true, bound: true, time: 17, faction: "Ambush"}], power: 0, time: 15, delay: 3, range: 14, size: 3, aoe: 4.6, lifetime: 1, damage: "inert"}, - {enemySpell: true, name: "RopeAttack", hitsfx: "Struggle", manacost: 6, components: ["Verbal"], level:4, type:"hit", onhit:"null", noSprite: true, noSumMsg: true, summon: [ - {name: "LearnedRope", count: 1, chance: 0.5, time: 20, strict: true, bound: true}, - {name: "UnforseenRope", count: 1, chance: 0.5, time: 20, strict: true, bound: true} - ], power: 0, time: 12, delay: 1, range: 8, size: 3, aoe: 10, lifetime: 1, damage: "fire"}, - {enemySpell: true, name: "SummonCrystals", noSprite: true, minRange: 0, landsfx: "Freeze", manacost: 12, components: ["Verbal"], level:4, type:"inert", onhit:"summon", summon: [{name: "ChaoticCrystal", count: 3, time: 10, bound: true, weakBinding: true}], power: 0, time: 10, delay: 1, range: 40, size: 1, aoe: 2.01, lifetime: 1, damage: "inert"}, - {enemySpell: true, name: "SummonChainWalls", noSprite: true, minRange: 0, landsfx: "MagicSlash", manacost: 2, specialCD: 12, components: ["Verbal"], level:4, type:"inert", onhit:"summon", summon: [{name: "ChainWall", count: 3, time: 0, bound: true, weakBinding: true}], power: 0, time: 10, delay: 1, range: 40, size: 1, aoe: 3.5, lifetime: 1, damage: "inert"}, - {enemySpell: true, name: "SummonForceFields", noSprite: true, minRange: 0, landsfx: "MagicSlash", manacost: 2, specialCD: 12, components: ["Verbal"], level:4, type:"inert", onhit:"summon", summon: [{name: "ForceField", count: 3, time: 0, bound: true, weakBinding: true}], power: 0, time: 10, delay: 1, range: 40, size: 1, aoe: 3.5, lifetime: 1, damage: "inert"}, - {enemySpell: true, name: "SummonTickleHand", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "TickleHand", count: 3, time: 12, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "SummonShadowHand", noSprite: true, minRange: 0, sfx: "Evil", castCondition: "shadowHand3count", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "ShadowHand", count: 1, time: 40, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "SummonMikoGhosts", noSprite: true, minRange: 0, specialCD: 20, sfx: "MagicSlash", manacost: 4, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "MikoGhost", count: 8, minRange: 8, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 12.9, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "SummonSingleTickleHand", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 6, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "TickleHand", count: 1, time: 12, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "SummonEnemyGag", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 6, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "Gag", count: 1, time: 12, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "SummonCuff", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 6, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "Cuffs", count: 1, time: 12, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "SummonLock", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 6, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "Lock", count: 1, time: 12, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "SummonRedSlime", noSprite: true, minRange: 0, sfx: "Freeze", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "RedSlime", count: 1, time: 12, strict: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 1, aoe: 2.01, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "SummonSingleRedSlime", noSprite: true, minRange: 0, sfx: "Freeze", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "RedSlime", count: 1, time: 12, strict: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "SummonLatexElemental", noSprite: true, sfx: "MagicSlash", manacost: 6, specialCD: 40, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "ElementalLatex", count: 1, time: 40, bound: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "SummonWolfDrone", noSprite: true, sfx: "MagicSlash", castCondition: "wolfDrone", manacost: 3, specialCD: 10, components: ["Verbal"], level:1, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "WolfDrone", count: 1, time: 40, bound: true}], power: 0, damage: "inert", time: 34, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "SummonRopeTentacle", noSprite: true, sfx: "MagicSlash", castCondition: "ropeKraken", manacost: 2, specialCD: 4, components: ["Verbal"], level:1, - projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "RopeMinion", count: 1, bound: true}], - power: 0, damage: "inert", time: 34, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}, - }, - {enemySpell: true, name: "SummonSarcoTentacle", noSprite: true, sfx: "Evil", castCondition: "sarcoKraken", manacost: 2, specialCD: 4, components: ["Verbal"], level:1, - projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "SarcoMinion", count: 1, bound: true}], - power: 0, damage: "inert", time: 34, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}, - }, - {enemySpell: true, name: "SummonTapeDrone", noSprite: true, sfx: "MagicSlash", castCondition: "wolfTapeDrone", manacost: 3, specialCD: 10, components: ["Verbal"], level:1, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "WolfDrone", count: 1, time: 40, bound: true}], power: 0, damage: "inert", time: 34, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}}, - {enemySpell: true, name: "MirrorImage", noSprite: true, minRange: 0, selfcast: true, sfx: "FireSpell", manacost: 12, components: ["Verbal"], level:4, castRange: 50, type:"inert", onhit:"summon", summon: [{name: "MaidforceStalkerImage", count: 1, time: 12}], power: 0, time: 12, delay: 1, range: 2.5, size: 3, aoe: 1.5, lifetime: 1, damage: "inert", - spellcast: {spell: "DarkShroud", target: "origin", directional:false, offset: false}}, - - {enemySpell: true, name: "SummonBookChain", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookChain", bound: true, count: 3, time: 12, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, - {enemySpell: true, name: "SummonBookNature", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookNature", bound: true, count: 2, time: 12, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, - {enemySpell: true, name: "SummonBookElectric", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookElectric", bound: true, count: 1, time: 12, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, - {enemySpell: true, name: "SummonBookIce", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookIce", bound: true, count: 3, time: 12, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, - {enemySpell: true, name: "SummonBookCelestial", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookCelestial", bound: true, count: 3, time: 12, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, - {enemySpell: true, name: "SummonBookArcane", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookArcane", bound: true, count: 3, time: 12, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, - {enemySpell: true, name: "SummonBookForbidden", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookForbidden", bound: true, count: 3, time: 12, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, - {enemySpell: true, name: "SummonBookSlime", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookSlime", bound: true, count: 2, time: 12, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, - - {enemySpell: true, selfcast: true, buff: true, minRange: 0, name: "ArmorUp", sfx: "Bones", school: "Elements", manacost: 8, components: ["Arms"], mustTarget: true, level:1, type:"buff", buffs: [{id: "ArmorUp", type: "Armor", duration: 6, power: 1.0, player: true, enemies: true, tags: ["defense", "armor"]}], onhit:"", time:6, power: 0, range: 2, size: 1, damage: ""}, - {enemySpell: true, selfcast: true, buff: true, minRange: 0, name: "ArmorUpArea", sfx: "MagicSlash", school: "Elements", manacost: 8, components: ["Arms"], mustTarget: true, level:1, - type:"buff", buffs: [{id: "ArmorUpArea", type: "Armor", duration: 6, power: 2.0, player: false, enemies: true, tags: ["defense", "armor"]}], onhit:"", time:6, power: 0, range: 2.9, aoe: 2.9, size: 1, damage: ""}, - - {enemySpell: true, selfcast: true, buff: true, minRange: 0, name: "SpellArmorUpAreaNevermere", sfx: "MagicSlash", school: "Elements", manacost: 8, components: ["Arms"], mustTarget: true, level:1, filterTags: ["wolfPet", "robot"], - type:"buff", buffs: [ - {id: "SpellArmorUpAreaNevermere", type: "SpellResist", duration: 6, power: 2.0, player: false, enemies: true, tags: ["defense", "spellresist"]}, - {id: "ArmorUpAreaNevermere", type: "Armor", duration: 6, power: 1.5, player: false, enemies: true, tags: ["defense", "armor"]} - ], onhit:"", time:6, power: 0, range: 4.9, aoe: 4.9, size: 1, damage: ""}, - {enemySpell: true, selfcast: true, buff: true, minRange: 0, name: "NevermereBoost", sfx: "MagicSlash", school: "Elements", manacost: 4, specialCD: 18, components: ["Arms"], mustTarget: true, level:1, filterTags: ["wolfSub"], - type:"buff", buffs: [ - {id: "NevermereBoost", aura: "#ffaaaa", type: "MoveSpeed", duration: 10, power: 1.0, player: false, enemies: true, tags: ["offense", "speed"]}, - {id: "NevermereBoost2", type: "Evasion", duration: 6, power: 0.3, player: false, enemies: true, tags: ["offense", "evasion"]}, - {id: "NevermereBoost3", type: "AttackSpeed", duration: 6, power: 0.5, player: false, enemies: true, tags: ["offense", "attackspeed"]}, - ], onhit:"", time:6, power: 0, range: 4.9, aoe: 4.9, size: 1, damage: ""}, - - {enemySpell: true, selfcast: true, buff: true, minRange: 0, name: "DollBoost", sfx: "MagicSlash", school: "Elements", manacost: 4, specialCD: 18, components: ["Arms"], mustTarget: true, level:1, filterTags: ["smithdoll"], - type:"buff", buffs: [ - {id: "NevermereBoost", aura: "#ffaaaa", type: "MoveSpeed", duration: 10, power: 1.0, player: false, enemies: true, tags: ["offense", "speed"]}, - {id: "NevermereBoost2", type: "Evasion", duration: 6, power: 0.3, player: false, enemies: true, tags: ["offense", "evasion"]}, - {id: "NevermereBoost3", type: "AttackSpeed", duration: 6, power: 0.5, player: false, enemies: true, tags: ["offense", "attackspeed"]}, - ], onhit:"", time:6, power: 0, range: 4.9, aoe: 4.9, size: 1, damage: ""}, - - {name: "DollConvert", tags: ["dummy"], sfx: "Dollify", school: "Illusion", manacost: 0, components: [], level:1, type:"special", special: "DollConvert", noMiscast: true, castCondition: "dollConvert", - onhit:"", time:5, power: 0, range: 5.5, aoe: 5.5, size: 1, damage: ""}, - - {name: "DollConvertMany", tags: ["dummy"], sfx: "Dollify", school: "Illusion", manacost: 0, components: [], level:1, type:"special", special: "DollConvert", noMiscast: true, castCondition: "dollConvert", - onhit:"", time:5, power: 0, range: 5.5, aoe: 5.5, size: 1, damage: ""}, - - {enemySpell: true, buff: true, name: "ParasolBuff", minRange: 0, sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Arms"], mustTarget: true, level:3, type:"buff", - buffs: [ - {id: "ParasolBuff", type: "Armor", duration: 5, power: 1.0, player: false, enemies: true, tags: ["defense", "armor"]}, - {id: "ParasolBuff2", type: "Evasion", duration: 5, power: 0.33, player: false, enemies: true, tags: ["defense", "evasion"]}, - {id: "ParasolBuff3", type: "SpellResist", duration: 5, power: 2.5, player: false, enemies: true, tags: ["defense", "spellresist"]}, - ], onhit:"", time:5, power: 0, range: 6, size: 1, damage: ""}, - {enemySpell: true, commandword: true, buff: true, buffallies: true, castCondition: "commandword", name: "EnemyCM1", minRange: 0, sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Arms"], mustTarget: true, level:3, type:"special", special: "Enemy_CM1", - onhit:"", time:5, power: 0, range: 6, size: 1, damage: "", noCastMsg: true}, - {enemySpell: true, commandword: true, buff: true, buffallies: true, selfbuff: true, castCondition: "commandword", name: "EnemyCM_self", minRange: 0, sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Arms"], mustTarget: true, level:3, type:"special", special: "Enemy_CM1", - onhit:"", time:5, power: 0, range: 6, size: 1, damage: "", noCastMsg: true}, - {enemySpell: true, buff: true, name: "ZombieBuff", minRange: 0, sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Arms"], mustTarget: true, level:3, type:"buff", filterTags: ["zombie", "mummy"], - buffs: [ - {id: "ZombieBuff", type: "Armor", duration: 8, power: 2.0, player: false, enemies: true, tags: ["defense", "armor"]}, - {id: "ZombieBuff2", type: "MoveSpeed", duration: 8, power: 2.1, player: false, enemies: true, tags: ["offense", "speed"]}, - ], onhit:"", time:5, power: 0, range: 6, size: 1, damage: ""}, - {enemySpell: true, buff: true, heal: true, name: "OrbHeal", minRange: 0, sfx: "MagicSlash", school: "Elements", manacost: 1, components: ["Arms"], mustTarget: true, level:3, type:"hit", - onhit:"heal", time:2, lifetime: 1, delay: 1, power: 2, aoe: 1.5, range: 8, size: 3, damage: "inert"}, - {enemySpell: true, name: "Earthfield", selfcast: true, sfx: "Bones", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", buffs: [{id: "Earthfield", type: "Armor", power: 2.0, player: false, enemies: true, noAlly: true, tags: ["armor", "defense"], range: 1.5}], onhit:"", time:6, aoe: 1.5, power: 0, delay: 8, range: 4, size: 3, damage: ""}, // Creates a shroud. Enemies within are hard to hit with melee attacks. - {name: "Earthrune", selfcast: true, sfx: "Bones", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", buffs: [{id: "Earthfield", type: "Armor", power: 2.0, player: true, enemies: true, onlyAlly: true, tags: ["armor", "defense"], range: 1.5}], onhit:"", time:9, aoe: 1.5, power: 0, delay: 9, range: 4, size: 3, damage: ""}, // Creates a shroud. Enemies within are hard to hit with melee attacks. - {name: "Icerune", sfx: "MagicSlash", hitsfx: "Freeze", school: "Elements", manacost: 8, components: ["Verbal"], level:1, type:"inert", onhit:"lingering", time: 1, delay: 1, range: 3, size: 3, aoe: 1.5, lifetime: 5, power: 4, lifetimeHitBonus: 3, damage: "ice"}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! - {name: "Waterrune", selfcast: true, sfx: "Bones", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", - buffs: [ - {id: "WaterRune", type: "SpellResist", power: 3.0, player: true, enemies: true, onlyAlly: true, tags: ["spellresist", "defense"], range: 1.5}, - {id: "WaterRune2", type: "MoveSpeed", power: -1.0, player: false, enemies: true, noAlly: true, tags: ["slow", "debuff"], range: 1.5}, - ], onhit:"", time:9, aoe: 1.5, power: 0, delay: 9, range: 4, size: 3, damage: ""}, // Creates a shroud. Enemies within are hard to hit with melee attacks. - - {enemySpell: true, name: "TrapCharmWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsCharmWeak", tags: ["ribbonRestraints"], count: 4}}, - {enemySpell: true, name: "TrapRibbons", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 4, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsRibbons", tags: ["magicRibbons"], count: 3}}, - {enemySpell: true, name: "TrapShackleWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsShackleWeak", tags: ["shackleRestraints"], count: 2}}, - {enemySpell: true, name: "TrapMummyWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsMummyWeak", tags: ["mummyRestraints"], count: 2}}, - {enemySpell: true, name: "TrapRopeWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsRopeWeak", tags: ["ropeMagicWeak", "clothRestraints"], count: 3}}, - {enemySpell: true, name: "TrapRopeStrong", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsRopeStrong", tags: ["ropeMagicStrong", "ropeAuxiliary", "clothRestraints", "tapeRestraints"], count: 4}}, - {enemySpell: true, name: "TrapRopeHoly", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "cold", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsRopeHoly", tags: ["celestialRopes"], count: 2}}, - {enemySpell: true, name: "TrapLeatherWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsLeatherWeak", tags: ["leatherRestraints", "leatherRestraintsHeavy"], count: 3}}, - {enemySpell: true, name: "TrapCableWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsCableWeak", tags: ["hitechCables"], count: 3}}, - {enemySpell: true, name: "TrapSlimeWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "glue", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsSlimeWeak", tags: ["slimeRestraints"], count: 2}}, - {enemySpell: true, name: "TrapMagicChainsWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsMagicChainsWeak", tags: ["chainRestraintsMagic"], count: 3}}, - {nonmagical: true, enemySpell: true, name: "TrapSleepDart", sfx: "Gunfire", manacost: 1, components: [], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, time: 0, delay: 0, range: 50, damage: "pain", speed: 2, playerEffect: {name: "TrapSleepDart", power: 5}}, - {enemySpell: true, name: "TrapLustCloud", sfx: "Freeze", manacost: 1, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "glue", playerEffect: {name: "TrapLustCloud", damage: "happygas", power: 8 }}, - {enemySpell: true, name: "TrapSCloud", sfx: "Freeze", manacost: 1, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "glue", playerEffect: {name: "TrapSPCloud", damage: "pain", power: 5.0 }}, - {nonmagical: true, enemySpell: true, name: "SleepDart", sfx: "Miss", manacost: 1, components: [], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, time: 0, delay: 0, range: 50, damage: "pain", speed: 1, playerEffect: {name: "TrapSleepDart", power: 5}}, -]; - - - -/** @type {Record} */ -let KDSpecialBondage = { - "Leather": { - priority: 0, - color: "#ad2f45", - struggleRate: 1.0, - powerStruggleBoost: 1.0, - healthStruggleBoost: 1.0, - }, - "Rope": { - priority: -3, - color: "#ffae70", - struggleRate: 2.0, - powerStruggleBoost: 1.0, - healthStruggleBoost: 1.0, - }, - "Metal": { - priority: 10, - color: "#aaaaaa", - struggleRate: 0.5, - powerStruggleBoost: 0.25, - healthStruggleBoost: 1.5, - }, - "Slime": { - priority: -10, - color: "#f23db7", - struggleRate: 1.5, - powerStruggleBoost: 2.0, - healthStruggleBoost: 0.75, - }, - "Tape": { - priority: -5, - color: "#3454f4", - struggleRate: 1.35, - powerStruggleBoost: 0.75, - healthStruggleBoost: 1.5, - }, - "Vine": { - priority: -7, - color: "#00ff00", - struggleRate: 1.25, - powerStruggleBoost: 2.0, - healthStruggleBoost: 1.0, - }, - "Ice": { - priority: -15, - color: "#00ffff", - struggleRate: 0.6, - powerStruggleBoost: 3.0, - healthStruggleBoost: 0.7, - }, -}; - -let KDMagicDefs = { - RopeKraken_TentacleCost:0.05, - RopeKraken_TentacleThreshold: 0.16, - RopeKraken_TentacleCountMin: 1, - RopeKraken_TentacleCountShare: 0.29, //1 tentacle max per this much hp - SarcoKraken_TentacleCost:0.00, - SarcoKraken_TentacleThreshold: 0.05, - SarcoKraken_TentacleCountMin: 1, - SarcoKraken_TentacleCountMax: 3, - SarcoKraken_TentacleCountShare: 0.2, //1 tentacle max per this much hp -}; - -/** @type {Record boolean>} */ -let KDCastConditions = { - "commandword": (enemy, target) => { - if (KDEnemyHasFlag(enemy, "commandword")) return false; - return KDEntityHasBuffTags(target, "commandword"); - }, - "dollConvert": (enemy, target, spell) => { - if (KDNearbyEnemies(enemy.x, enemy.y, spell.range).filter((en) => {return en.Enemy?.tags.smithdoll;}).length > 3 || KDNearbyEnemies(enemy.x, enemy.y, spell.aoe).filter((en) => {return !en.allied && en.Enemy?.tags.dollmakerconvert;}).length < 1) return false; - return true; - }, - "dollConvertMany": (enemy, target, spell) => { - if (KDNearbyEnemies(enemy.x, enemy.y, spell.range).filter((en) => {return en.Enemy?.tags.smithdoll;}).length > 8 || KDNearbyEnemies(enemy.x, enemy.y, spell.aoe).filter((en) => {return !en.allied && en.Enemy?.tags.dollmakerconvert;}).length < 1) return false; - return true; - }, - "wolfDrone": (enemy, target) => { - if (KDNearbyEnemies(enemy.x, enemy.y, 10).filter((en) => {return en.Enemy?.tags.wolfdrone;}).length > 3) return false; - return true; - }, - "wolfTapeDrone": (enemy, target) => { - if (KDNearbyEnemies(enemy.x, enemy.y, 10).filter((en) => {return en.Enemy?.tags.wolfdrone;}).length > 3) return false; - return true; - }, - "shadowHand3count": (enemy, target) => { - if (KDNearbyEnemies(enemy.x, enemy.y, 10).filter((en) => {return en.Enemy?.name == "ShadowHand";}).length > 3) return false; - return true; - }, - "ropeKraken": (enemy, target) => { - if (enemy.hp <= KDMagicDefs?.RopeKraken_TentacleThreshold) return false; - if (KDNearbyEnemies(enemy.x, enemy.y, 10).filter((en) => {return en.Enemy?.tags.krakententacle;}).length - > KDMagicDefs?.RopeKraken_TentacleCountMin + Math.floor(enemy.hp/enemy.Enemy.maxhp/KDMagicDefs?.RopeKraken_TentacleCountShare)) return false; - return true; - }, - "sarcoKraken": (enemy, target) => { - if (target.player) { - if (KinkyDungeonPlayerTags.get("Sarcophagus")) return false; - - let restraint = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); - if (!restraint) return false; - } - if (enemy.hp <= KDMagicDefs?.SarcoKraken_TentacleThreshold) return false; - if (KDNearbyEnemies(enemy.x, enemy.y, 10).filter((en) => {return en.Enemy?.tags.sarcotentacle;}).length - > Math.min(KDMagicDefs?.SarcoKraken_TentacleCountMax - 1, KDMagicDefs?.SarcoKraken_TentacleCountMin + Math.floor(enemy.hp/enemy.Enemy.maxhp/KDMagicDefs?.SarcoKraken_TentacleCountShare))) return false; - return true; - }, - "sarcoEngulf": (enemy, target) => { - if (target.player && !KinkyDungeonPlayerTags.get("Sarcophagus")) { - let restraint = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); - if (!restraint) return false; - return true; - } - return false; - }, - "sarcoHex": (enemy, target) => { - if (target.player && !KinkyDungeonPlayerTags.get("Sarcophagus")) { - let restraint = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); - if (!restraint) return true; - return false; - } - return false; - }, -}; diff --git a/Game/KinkyDungeonMapMods.js b/Game/KinkyDungeonMapMods.js deleted file mode 100644 index 8a4613d6d..000000000 --- a/Game/KinkyDungeonMapMods.js +++ /dev/null @@ -1,187 +0,0 @@ -"use strict"; - -/** - * @type {Record} - */ -let KDMapMods = { - "None": { - name: "None", - roomType: "", - weight: 100, - tags: [], - bonusTags: {}, - bonussetpieces: [ - {Type: "BanditPrison", Weight: 12}, - ], - altRoom: "", - }, - "Mold": { - name: "Mold", - roomType: "", - weight: 100, - tags: ["maid", "mold"], - faction: "Slime", - tagsOverride: ["maid", "mold"], - jailType: "maid", - guardType: "maid", - bonusTags: { - "mold": {bonus: 4, mult: 2.5}, - "maid": {bonus: 5, mult: 1.5}, - "construct": {bonus: 0, mult: 0}, - }, - altRoom: "", - spawnBoxes: [ - {requiredTags: ["mold"], tags: [], currentCount: 0, maxCount: 0.5, ignoreAllyCount: true}, - {requiredTags: ["maid"], tags: [], currentCount: 0, maxCount: 0.25, ignoreAllyCount: true}, - ], - }, - "Bandit": { - name: "Bandit", - roomType: "", - weight: 50, - tags: ["bandit", "banditleader", "bountyhunter", "dragon"], - faction: "Bandit", - jailType: "bandit", - guardType: "bandit", - bonusTags: { - "bandit": {bonus: 4, mult: 2.5}, - "bountyhunter": {bonus: 1, mult: 2.5}, - "banditleader": {bonus: 40, mult: 0.3}, - }, - altRoom: "", - spawnBoxes: [ - {requiredTags: ["bandit"], tags: [], currentCount: 0, maxCount: 0.4, ignoreAllyCount: true}, - {requiredTags: ["bountyhunter"], tags: [], currentCount: 0, maxCount: 0.2, ignoreAllyCount: true}, - ], - }, - "Dragon": { - name: "Dragon", - roomType: "", - weight: 50, - tags: ["witch", "elemental", "dragon"], - faction: "Dragon", - jailType: "dragon", - guardType: "dragon", - bonusTags: { - "dragon": {bonus: 7, mult: 2}, - "elemental": {bonus: 3, mult: 1.5}, - }, - bonussetpieces: [ - {Type: "BanditPrison", Weight: 8}, - ], - altRoom: "", - spawnBoxes: [ - {requiredTags: ["dragon"], tags: [], currentCount: 0, maxCount: 0.33, ignoreAllyCount: true}, - {requiredTags: ["elemental"], tags: [], currentCount: 0, maxCount: 0.33, ignoreAllyCount: true}, - ], - }, - "Witch": { - name: "Witch", - roomType: "", - weight: 50, - tags: ["witch", "apprentice", "skeleton"], - faction: "Witch", - jailType: "witch", - guardType: "apprentice", - bonusTags: { - "witch": {bonus: 3, mult: 1.5}, - "apprentice": {bonus: 3, mult: 1.4}, - }, - altRoom: "", - spawnBoxes: [ - {requiredTags: ["witch"], tags: [], currentCount: 0, maxCount: 0.25, ignoreAllyCount: true}, - {requiredTags: ["apprentice"], tags: [], currentCount: 0, maxCount: 0.25, ignoreAllyCount: true}, - ], - }, - "Wolf": { - name: "Wolf", - roomType: "", - weight: 70, - tags: ["nevermere"], - faction: "Nevermmere", - jailType: "trainer", - guardType: "trainer", - bonusTags: { - "nevermere": {bonus: 11, mult: 1.5}, - "trainer": {bonus: 11, mult: 0.75}, - }, - altRoom: "", - spawnBoxes: [ - {requiredTags: ["nevermere"], tags: [], currentCount: 0, maxCount: 0.3, ignoreAllyCount: true}, - ], - }, - "Robot": { - name: "Robot", - roomType: "", - weight: 35, - tags: ["robot"], - faction: "AncientRobots", - bonusTags: { - "robot": {bonus: 10, mult: 4}, - }, - altRoom: "", - spawnBoxes: [ - {requiredTags: ["robot"], tags: [], currentCount: 0, maxCount: 0.3, ignoreAllyCount: true}, - ], - }, - "Plant": { - name: "Plant", - roomType: "", - weight: 50, - tags: ["plant", "elf"], - jailType: "elf", - guardType: "elf", - faction: "Beast", - bonusTags: { - "plant": {bonus: 5, mult: 2}, - "maid": {bonus: 4.5, mult: 1}, - }, - altRoom: "", - spawnBoxes: [ - {requiredTags: ["plant"], tags: [], currentCount: 0, maxCount: 0.35, ignoreAllyCount: true}, - ], - }, - "Slime": { - name: "Slime", - roomType: "", - weight: 50, - tags: ["slime", "alchemist"], - faction: "Slime", - jailType: "alchemist", - guardType: "alchemist", - bonusTags: { - "slime": {bonus: 4, mult: 3}, - "maid": {bonus: 4.5, mult: 1.5}, - }, - altRoom: "", - spawnBoxes: [ - {requiredTags: ["slime"], tags: [], currentCount: 0, maxCount: 0.3, ignoreAllyCount: true}, - ], - }, -}; - -// KDGetMapGenList(3, KDMapMods); -function KDGetMapGenList(count, mods) { - let ret = []; - for (let i = 0; i < count; i++) { - let genWeightTotal = 0; - let genWeights = []; - - for (let mod of Object.values(mods)) { - if (!ret.includes(mod)) { - genWeights.push({mod: mod, weight: genWeightTotal}); - genWeightTotal += mod.weight; - } - } - - let selection = KDRandom() * genWeightTotal; - - for (let L = genWeights.length - 1; L >= 0; L--) { - if (selection > genWeights[L].weight) { - ret.push(genWeights[L].mod); - break; - } - } - } - return ret; -} \ No newline at end of file diff --git a/Game/KinkyDungeonMistress.js b/Game/KinkyDungeonMistress.js deleted file mode 100644 index c099a8f3c..000000000 --- a/Game/KinkyDungeonMistress.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; - -let Ally = "ally"; -let Sub = "sub"; -let Enemy = "enemy"; -let Jailer = "jail"; - -let KDMistress = { - "Adventurer": { - name: "Adventurer", - alignment: Ally, - } -}; - diff --git a/Game/KinkyDungeonMultiplayer.js b/Game/KinkyDungeonMultiplayer.js deleted file mode 100644 index e6edd4b7b..000000000 --- a/Game/KinkyDungeonMultiplayer.js +++ /dev/null @@ -1,248 +0,0 @@ -"use strict"; - -/** - * Sends a multiplayer update, trimming off stuff that doesnt need to get sent yet - * @returns {void} - */ -function KinkyDungeonMultiplayerUpdate(Delay) { - if (KinkyDungeonIsPlayer() && ChatRoomCharacter && ChatRoomCharacter.length > 1 && DialogGamingPreviousRoom == "ChatRoom" && KinkyDungeonNextDataSendTime + Delay < CommonTime()) { - let MN = []; - - for (let C = 0; C < ChatRoomCharacter.length; C++) { - let Char = ChatRoomCharacter[C]; - - if (KinkyDungeonStreamingPlayers.includes(Char.MemberNumber) && Char.ID != 0 && Char.Effect.includes("VR")) MN.push(Char.MemberNumber); - } - - if (MN.length > 0) { - let data = KinkyDungeonPackData(KinkyDungeonGrid_Last != KinkyDungeonGrid, true, KinkyDungeonMultiplayerInventoryFlag, CommonTime() > KinkyDungeonNextDataSendStatsTime + KinkyDungeonNextDataSendStatsTimeDelay); - KinkyDungeonSendData(data); - } - - KinkyDungeonNextDataSendTime = CommonTime(); - - if (CommonTime() > KinkyDungeonNextDataSendStatsTime + KinkyDungeonNextDataSendStatsTimeDelay) KinkyDungeonNextDataSendStatsTime = CommonTime(); - KinkyDungeonGrid_Last = KinkyDungeonGrid; - KinkyDungeonMultiplayerInventoryFlag = false; - } -} - - - -/** - * Converts a string into Kinky Game Data - * @returns {void} - */ -function KinkyDungeonUnpackData(KinkyData) { - if (CurrentScreen != "KinkyDungeon" || KinkyDungeonState != "Game" || !KinkyDungeonPlayerCharacter) return; - if (KinkyDungeonIsPlayer()) return; // Prevent griefing - let data = JSON.parse(LZString.decompressFromBase64(KinkyData)); - - if (!KinkyDungeonGameData) KinkyDungeonGameData = {}; - - if (!data) return; - - if (data.enemies != null) { - KinkyDungeonGameData.enemies = data.enemies; - } - if (data.items != null) { - KinkyDungeonGameData.items = data.items; - } - if (data.bullets != null) { - KinkyDungeonGameData.bullets = data.bullets; - } - if (data.map != null) { - KinkyDungeonGameData.map = data.map; - } - if (data.inventory != null) { - KinkyDungeonGameData.inventory = data.inventory; - } - if (data.meta != null) { - KinkyDungeonGameData.meta = data.meta; - } - - KinkyDungeonUpdateFromData(); - KinkyDungeonNextDataLastTimeReceived = CommonTime(); -} - -function KinkyDungeonUpdateFromData() { - if (KinkyDungeonGameData.map == null || - KinkyDungeonGameData.inventory == null || - KinkyDungeonGameData.bullets == null || - KinkyDungeonGameData.items == null || - KinkyDungeonGameData.enemies == null) { - KinkyDungeonGameData = null; // We need the full data before rendering anything! - return false; - } - if (KinkyDungeonGameData.enemies) { - KinkyDungeonEntities = []; - KDUpdateEnemyCache = true; - let enemies = JSON.parse(KinkyDungeonGameData.enemies); - - for (let N = 0; N < enemies.length; N++) { - let enemy = enemies[N].split('/'); - let i = 1; - // @ts-ignore - KDAddEntity({Enemy: {name: enemy[i++]}, stun: enemy[i++], x:enemy[i++], y:enemy[i++]}); // Push the enemy - } - } - if (KinkyDungeonGameData.inventory) { - KDInitInventory(); - // TODO fix this... - let inventory = JSON.parse(KinkyDungeonGameData.inventory); - - CharacterReleaseTotal(KinkyDungeonPlayer); - - if (typeof inventory !== "string") - for (let N = 0; N < inventory.length; N++) { - let item = inventory[N].split('/'); - if (item.length > 1) { - let i = 1; - let restraint = KinkyDungeonGetRestraintByName(item[i++]); - KinkyDungeonAddRestraint(restraint, 0, true); // Add the item - let createdrestraint = KinkyDungeonGetRestraintItem(restraint.Group); - if (createdrestraint) - createdrestraint.lock = undefined; // Lock if applicable - } - } - KinkyDungeonUpdateStats(0); - KinkyDungeonDressPlayer(); - } - - if (KinkyDungeonGameData.bullets) { - KinkyDungeonBullets = []; - let bullets = JSON.parse(KinkyDungeonGameData.bullets); - - for (let N = 0; N < bullets.length; N++) { - let bullet = bullets[N].split('/'); - let i = 1; - let name = bullet[i++]; - KinkyDungeonBullets.push({spriteID:name + CommonTime(), x:bullet[i], xx:bullet[i++], y:bullet[i], yy:bullet[i++], vx:bullet[i++], vy:bullet[i++], - bullet:{name: name, width:bullet[i++], height:bullet[i++]}}); - } - } - if (KinkyDungeonGameData.items) { - KinkyDungeonGroundItems = []; - let items = JSON.parse(KinkyDungeonGameData.items); - - for (let N = 0; N < items.length; N++) { - let item = items[N].split('/'); - let i = 1; - KinkyDungeonGroundItems.push({name:item[i++], x:item[i++], y:item[i++]}); - } - } - - if (KinkyDungeonGameData.map) - KinkyDungeonGrid = KinkyDungeonGameData.map; - if (KinkyDungeonGameData.meta) { - KinkyDungeonUpdateLightGrid = true; - - KinkyDungeonGridWidth = Math.round(KinkyDungeonGameData.meta.w); - KinkyDungeonGridHeight = Math.round(KinkyDungeonGameData.meta.h); - KinkyDungeonPlayerEntity.x = Math.round(KinkyDungeonGameData.meta.x); - KinkyDungeonPlayerEntity.y = Math.round(KinkyDungeonGameData.meta.y); - - if (KinkyDungeonGameData.meta.sp != null) KinkyDungeonStatStamina = Math.round(KinkyDungeonGameData.meta.sp); - if (KinkyDungeonGameData.meta.mp != null) KinkyDungeonStatMana = Math.round(KinkyDungeonGameData.meta.mp); - if (KinkyDungeonGameData.meta.ap != null) KinkyDungeonStatDistraction = Math.round(KinkyDungeonGameData.meta.ap); - if (KinkyDungeonGameData.meta.rk != null) KinkyDungeonRedKeys = Math.round(KinkyDungeonGameData.meta.rk); - if (KinkyDungeonGameData.meta.bk != null) KinkyDungeonBlueKeys = Math.round(KinkyDungeonGameData.meta.bk); - if (KinkyDungeonGameData.meta.lp != null) KinkyDungeonLockpicks = Math.round(KinkyDungeonGameData.meta.lp); - if (KinkyDungeonGameData.meta.gp != null) KinkyDungeonGold = Math.round(KinkyDungeonGameData.meta.gp); - if (KinkyDungeonGameData.meta.lv != null) { - MiniGameKinkyDungeonLevel = Math.round(KinkyDungeonGameData.meta.lv); - if (KinkyDungeonGameData.meta.cp) - KinkyDungeonSetCheckPoint(KinkyDungeonGameData.meta.cp); - else KinkyDungeonSetCheckPoint(); - } - } -} - -/** - * Turns the game state into a string that can be sent over - * @returns {string} - String containing game data - */ -function KinkyDungeonPackData(IncludeMap, IncludeItems, IncludeInventory, IncludeStats) { - let enemies = JSON.stringify(KinkyDungeonEntities, (key, value) => { - if (CommonIsNumeric(key) && typeof value === "object") { - if (value.Enemy) { - return "E/" + value.Enemy.name + "/" + (value.stun ? value.stun : 0) + "/"+value.x+"/"+value.y; - } - } - return value; - }); - - let items = IncludeItems ? JSON.stringify(KinkyDungeonGroundItems, (key, value) => { - if (CommonIsNumeric(key) && typeof value === "object") { - if (value.name) { - return "G/" + value.name + "/"+value.x+"/"+value.y; - } - } - return value; - }) : ""; - - let bullets = JSON.stringify(KinkyDungeonBullets, (key, value) => { - if (CommonIsNumeric(key) && typeof value === "object") { - if (value.bullet) { - return "B/" + value.bullet.name + "/"+value.x+"/"+value.y + "/"+(Math.round(value.vx*10)/10)+"/"+(Math.round(value.vy*10)/10 + "/"+value.bullet.width + "/"+value.bullet.height); - } - } - return ""; - }); - - let map = IncludeMap ? KinkyDungeonGrid : ""; - - let inventory = IncludeInventory ? JSON.stringify(Array.from(KinkyDungeonInventory.get(Restraint).values()), (key, value) => { - if (CommonIsNumeric(key) && typeof value === "object") { - if (value.restraint) { - return "I/" + value.restraint.name + "/l" + value.lock; - } - } - return ""; - }) : ""; - - let meta = {w: KinkyDungeonGridWidth, h: KinkyDungeonGridHeight, x:KinkyDungeonPlayerEntity ? KinkyDungeonPlayerEntity.x : 0, y:KinkyDungeonPlayerEntity ? KinkyDungeonPlayerEntity.y : 0,}; - - if (IncludeStats) { - meta.sp = Math.round(KinkyDungeonStatStamina); - meta.mp = Math.round(KinkyDungeonStatMana); - meta.ap = Math.round(KinkyDungeonStatDistraction); - meta.rk = KinkyDungeonRedKeys; - meta.bk = KinkyDungeonBlueKeys; - meta.lp = KinkyDungeonLockpicks; - meta.gp = KinkyDungeonGold; - meta.lv = MiniGameKinkyDungeonLevel; - meta.cp = MiniGameKinkyDungeonCheckpoint; - } - - let result = { - enemies: enemies, - items: items, - bullets: bullets, - map: map, - inventory: inventory, - meta: meta, - }; - let stringToSend = LZString.compressToBase64(JSON.stringify(result));// The replace is needed to avoid artifacts during decompression - - return stringToSend; -} - - -/** - * Sends kinky dungeon data to the target member - * @returns {void} - */ -function KinkyDungeonSendData(data) { - ServerSend("ChatRoomGame", { KinkyDungeon: data }); -} - -/** - * Handles kinky dungeon data after receiving it from another player - * @returns {void} - */ -function KinkyDungeonHandleData(data, SourceMemberNumber) { - if (CurrentScreen == "KinkyDungeon" && SourceMemberNumber == KinkyDungeonPlayerCharacter.MemberNumber) - KinkyDungeonUnpackData(data); // Unpack the rest of the data -} - diff --git a/Game/KinkyDungeonMusic.js b/Game/KinkyDungeonMusic.js deleted file mode 100644 index 1871416a5..000000000 --- a/Game/KinkyDungeonMusic.js +++ /dev/null @@ -1,129 +0,0 @@ -"use strict"; - -/** These tracks will loop with a certain chance of forcibly continuing the loop. 0 = no loop*/ -let KDMusicLoopTracksChance = { - "AREA1-GRAVEYARD.ogg": 0.5, - "AREA2-ANCIENTTOMBS.ogg": 0.5, - "GENERIC-DOLLRACK.ogg": 0.15, - "AREA4-MAGICLIBRARY.ogg": 0.5, - "AREA5-UNDERGROUNDJUNGLE.ogg": 0.5, - "AREA6-CRYSTALCAVE.ogg": 0.5, - "AREA7-LOSTTEMPLE.ogg": 0.5, - "AREA8-ORRERY.ogg": 0.7, - "AREA9-BELLOWS.ogg": 0.5, -}; - -let KDCurrentSong = ""; -let KDNewSong = "AREA1-GRAVEYARD.ogg"; -let KDLastSong = ""; -let KDCurrentLoops = 0; -let KDCurrentFade = 1; -let KDMusicFadeTime = 2500; // 2 seconds -let KDMusicFadeInTime = 2500; // 2 seconds -let KDMusicTickRate = 100; -/** @type {HTMLAudioElement} */ -let KDCurrentMusicSound = null; -let KDCurrentMusicSoundUpdate = null; - -function KDGetCheckpoint() { - return KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || 'grv'; -} - -let lastKDMusicTick = 0; - -function KDUpdateMusic() { - - if (KDPatched) { - KDCurrentMusicSoundUpdate = false; - let KDMusic = KinkyDungeonMapParams[KDGetCheckpoint()].music; - - if (!KDNewSong) { - let iter = 0; - let maxiter = 2; // 1 reroll - KDNewSong = KDLastSong; - while (iter < maxiter && KDNewSong == KDLastSong) { - KDNewSong = KDGetByWeight(KDMusic); - iter++; - } - } - if (performance.now() - lastKDMusicTick < KDMusicTickRate) return; - if (KDCurrentMusicSound) { - if (!KDCurrentSong && KDNewSong != KDLastSong) { - if (KDCurrentFade > 0) { - let dd = (performance.now() - lastKDMusicTick) / KDMusicFadeTime; - KDCurrentFade = Math.max(0, KDCurrentFade - dd); - } - } else { - if (KDCurrentFade < 1) { - let dd = (performance.now() - lastKDMusicTick) / KDMusicFadeInTime; - KDCurrentFade = Math.min(1, KDCurrentFade + dd); - } - } - } - - - - let globalVolume = KDToggles.Sound && KDToggles.Music ? KDMusicVolume * KDMusicVolumeMult : 0; - if (globalVolume > 0 && (!KDCurrentMusicSound || KDCurrentMusicSound.ended || KDCurrentMusicSound.paused || (!KDCurrentSong && KDCurrentFade == 0))) { - KDPlayMusic(KDNewSong, globalVolume); - } - else if (KDCurrentMusicSound && KDCurrentSong && !Object.keys(KDMusic).includes(KDCurrentSong)) { - if (!KDCurrentMusicSoundUpdate) - KDEndMusic(); - } - - if (KDCurrentMusicSound) { - KDCurrentMusicSound.volume = Math.min(Player.AudioSettings.Volume * globalVolume, 1) * KDCurrentFade; - } - - lastKDMusicTick = performance.now(); - } - - -} - -function KDPlayMusic(Sound, Volume) { - - // Start the new sound - let audio = KDCurrentMusicSound || new Audio(); - let vol = Player.AudioSettings.Volume * (Volume != undefined ? Volume : 1.0); - KDCurrentMusicSound = audio; - KDCurrentMusicSoundUpdate = true; - if (ServerURL == 'foobar') { - audio.crossOrigin = "Anonymous"; - // @ts-ignore - audio.src = remap("Music/" + (KDModFiles[Sound] || Sound)); - } else - audio.src = "Music/" + (KDModFiles[Sound] || Sound); - audio.volume = Math.min(vol, 1); - audio.loop = false; - audio.addEventListener('ended', function () { - this.currentTime = 0; - this.play(); - lastKDMusicTick = performance.now() - 100; - // Current audio is now stale--chance of not being stale though - if (KDRandom() < KDMusicLoopTracksChance[KDCurrentSong]) { - KDCurrentLoops += 1; - } else { - KDCurrentSong = ""; - KDNewSong = ""; - } - }, false); - audio.play(); - KDCurrentLoops = 0; - //KDCurrentFade = 1; - - KDLastSong = Sound; - KDCurrentSong = Sound; - KDNewSong = ""; -} - -function KDEndMusic() { - KDCurrentSong = ""; - KDNewSong = ""; - if (KDCurrentMusicSound) { - KDCurrentMusicSound.pause(); - KDCurrentMusicSound.currentTime = 0; - KDCurrentMusicSoundUpdate = true; - } -} \ No newline at end of file diff --git a/Game/KinkyDungeonObject.js b/Game/KinkyDungeonObject.js deleted file mode 100644 index 7c32c7284..000000000 --- a/Game/KinkyDungeonObject.js +++ /dev/null @@ -1,284 +0,0 @@ -"use strict"; - -/** - * Script happens when you display an object message - * @type {Record void>} - */ -let KDObjectMessages = { - "Ghost": () => KinkyDungeonGhostMessage(), - "Angel": () => KinkyDungeonAngelMessage(), - "Food": () => KinkyDungeonFoodMessage(), -}; -/** - * Script happens when you move to an object - * MUTUALLY exclusive with KDObjectDraw, as this - * overrides the default behavior of clicking on the object and bringing up a modal - * @type {Record void>} - */ -let KDObjectClick = { - "Food": (x, y) => { - let tile = KinkyDungeonTilesGet(x + "," + y); - if (tile.Food && !tile.Eaten) { - KinkyDungeonTargetTileLocation = x + "," + y; - KinkyDungeonTargetTile = tile; - KDStartDialog("TableFood", "", true, ""); - } else - KinkyDungeonFoodMessage(tile); - }, -}; -/** - * Script to handle click in an object's modal - * tbh should remove this soon - * @type {Record boolean>} - */ -let KDObjectHandle = { - "Charger": () => KinkyDungeonHandleCharger(), -}; -/** - * Determines if an object has an interface and also if it pauses the game when you click on it - * You dont need an interface (for example the updated food table) but then you need - * an entry in KDObjectClick instead. - * @type {Record void>} - */ -let KDObjectDraw = { - "Ghost": () => KinkyDungeonDrawGhost(), - "Angel": () => KinkyDungeonDrawAngel(), - "Charger": () => KinkyDungeonDrawCharger(), - "Tablet": () => KinkyDungeonDrawTablet(), - //"Food": () => KinkyDungeonDrawFood(), - "Lock": () => KinkyDungeonDrawLock(), - "Shrine": () => KinkyDungeonDrawShrine(), - "Door": () => KinkyDungeonDrawDoor(), -}; - -function KinkyDungeonDrawDoor() { - if (KinkyDungeonTargetTile.Lock) { - let action = false; - if (KinkyDungeonLockpicks > 0 && (KinkyDungeonTargetTile.Lock.includes("Red") || KinkyDungeonTargetTile.Lock.includes("Blue"))) { - DrawButtonVis(KDModalArea_x + 313, KDModalArea_y + 25, 112, 60, TextGet("KinkyDungeonPickDoor"), "#ffffff", "", ""); - action = true; - KDModalArea = true; - } - - if (KinkyDungeonTargetTile.Lock.includes("Red") || KinkyDungeonTargetTile.Lock.includes("Blue")) { - DrawButtonVis(KDModalArea_x + 175, KDModalArea_y + 25, 112, 60, TextGet("KinkyDungeonUnlockDoor"), - (KinkyDungeonTargetTile.Lock.includes("Red") && KinkyDungeonRedKeys > 0) - || (KinkyDungeonTargetTile.Lock.includes("Blue") && KinkyDungeonBlueKeys > 0) ? "#ffffff" : "#ff0000", "", ""); - action = true; - KDModalArea = true; - } - - if ((KinkyDungeonTargetTile.Lock.includes("Purple"))) { - let spell = KinkyDungeonFindSpell("CommandWord", true); - DrawButtonVis(KDModalArea_x + 175, KDModalArea_y + 25, 112, 60, TextGet("KinkyDungeonUnlockDoorPurple"), - (KinkyDungeonStatMana >= KinkyDungeonGetManaCost(spell)) ? "#ffffff" : "#ff0000", - "", ""); - action = true; - KDModalArea = true; - } - - if (!action) DrawTextKD(TextGet("KinkyDungeonLockedDoor"), KDModalArea_x + 300, KDModalArea_y + 50, "#ffffff", "#333333"); - - if (KinkyDungeonTargetTile.Lock.includes("Red")) - DrawTextKD(TextGet("KinkyRedLock"), KDModalArea_x + 25, KDModalArea_y + 50, "#ffffff", "#333333"); - else if (KinkyDungeonTargetTile.Lock.includes("Blue")) - DrawTextKD(TextGet("KinkyBlueLock"), KDModalArea_x + 25, KDModalArea_y + 50, "#ffffff", "#333333"); - else if (KinkyDungeonTargetTile.Lock.includes("Purple")) - DrawTextKD(TextGet("KinkyPurpleLock"), KDModalArea_x + 50, KDModalArea_y + 50, "#ffffff", "#333333"); - } else { - KDModalArea = true; - DrawButtonVis(KDModalArea_x + 25, KDModalArea_y + 25, 250, 60, TextGet("KinkyDungeonCloseDoor"), "#ffffff"); - } -} - -/** Chest lock */ -function KinkyDungeonDrawLock() { - if (KinkyDungeonTargetTile.Lock) { - let action = false; - if (KinkyDungeonLockpicks > 0 && (KinkyDungeonTargetTile.Lock.includes("Red") || KinkyDungeonTargetTile.Lock.includes("Blue"))) { - DrawButtonVis(KDModalArea_x + 313, KDModalArea_y + 25, 112, 60, TextGet("KinkyDungeonPickDoor"), "#ffffff", "", ""); - action = true; - KDModalArea = true; - } - - if (KinkyDungeonTargetTile.Lock.includes("Red") || KinkyDungeonTargetTile.Lock.includes("Blue")) { - DrawButtonVis(KDModalArea_x + 175, KDModalArea_y + 25, 112, 60, TextGet("KinkyDungeonUnlockDoor"), - (KinkyDungeonTargetTile.Lock.includes("Red") && KinkyDungeonRedKeys > 0) - || (KinkyDungeonTargetTile.Lock.includes("Blue") && KinkyDungeonBlueKeys > 0) ? "#ffffff" : "#ff0000", "", ""); - action = true; - KDModalArea = true; - } - if ((KinkyDungeonTargetTile.Lock.includes("Purple"))) { - let spell = KinkyDungeonFindSpell("CommandWord", true); - DrawButtonVis(KDModalArea_x + 175, KDModalArea_y + 25, 112, 60, TextGet("KinkyDungeonUnlockDoorPurple"), - (KinkyDungeonStatMana >= KinkyDungeonGetManaCost(spell)) ? "#ffffff" : "#ff0000", - "", ""); - action = true; - KDModalArea = true; - } - - if (!action) DrawTextKD(TextGet("KinkyDungeonLockedDoor"), KDModalArea_x + 300, KDModalArea_y + 50, "#ffffff", "#333333"); - - if (KinkyDungeonTargetTile.Lock.includes("Red")) - DrawTextKD(TextGet("KinkyRedLock"), KDModalArea_x + 50, KDModalArea_y + 50, "#ffffff", "#333333"); - else if (KinkyDungeonTargetTile.Lock.includes("Blue")) - DrawTextKD(TextGet("KinkyBlueLock"), KDModalArea_x + 50, KDModalArea_y + 50, "#ffffff", "#333333"); - else if (KinkyDungeonTargetTile.Lock.includes("Purple")) - DrawTextKD(TextGet("KinkyPurpleLock"), KDModalArea_x + 50, KDModalArea_y + 50, "#ffffff", "#333333"); - } -} - -function KinkyDungeonDrawGhost() { - if (KDGameData.CurrentDialog) return; - if (KinkyDungeonTargetTile.GhostDecision == 0) DrawTextKD(TextGet("KinkyDungeonDrawGhostHelpful"), KDModalArea_x + 200, KDModalArea_y + 50, "white", KDTextGray2); - else DrawTextKD(TextGet("KinkyDungeonDrawGhostUnhelpful"), KDModalArea_x + 200, KDModalArea_y + 50, "white", KDTextGray2); -} -function KinkyDungeonDrawAngel() { - DrawTextKD(TextGet("KinkyDungeonDrawAngelHelpful"), KDModalArea_x + 200, KDModalArea_y + 50, "white", KDTextGray2); -} - -function KinkyDungeonGhostMessage() { - - if (KinkyDungeonTargetTile.Dialogue) { - KDStartDialog(KinkyDungeonTargetTile.Dialogue, "Ghost", true, "", undefined); - if (KinkyDungeonTargetTile.Msg && KDGameData.CurrentDialog) { - KDGameData.CurrentDialogMsg = KinkyDungeonTargetTile.Msg; - } - return; - } else if (KinkyDungeonTargetTile.Msg) { - KDStartDialog("GhostInfo", "Ghost", true, "", undefined); - if (KDGameData.CurrentDialog) { - KDGameData.CurrentDialogMsg = KinkyDungeonTargetTile.Msg; - } - return; - } - let restraints = KinkyDungeonAllRestraint(); - let msg = ""; - if (restraints.length == 0) { - msg = TextGet("KinkyDungeonGhostGreet" + KinkyDungeonTargetTile.GhostDecision); - } else { - if (KinkyDungeonTargetTile.GhostDecision <= 1) { - msg = TextGet("KinkyDungeonGhostHelpful" + KinkyDungeonTargetTile.GhostDecision); - } else { - let BoundType = "Generic"; - if (!KinkyDungeonCanTalk() && Math.random() < 0.33) BoundType = "Gag"; - if (!KinkyDungeonPlayer.CanInteract() && Math.random() < 0.33) BoundType = "Arms"; - if (!KinkyDungeonPlayer.CanWalk() && Math.random() < 0.33) BoundType = "Feet"; - if (KinkyDungeonPlayer.IsChaste() && Math.random() < 0.33) BoundType = "Chaste"; - - msg = TextGet("KinkyDungeonGhostUnhelpful" + BoundType + KinkyDungeonTargetTile.GhostDecision); - } - } - if (msg) { - KinkyDungeonSendActionMessage(3, msg, "white", 3); - } -} - -function KinkyDungeonAngelMessage() { - let restraints = KinkyDungeonAllRestraint(); - let msg = ""; - if (restraints.length == 0) { - msg = TextGet("KinkyDungeonAngelGreet"); - } else { - msg = TextGet("KinkyDungeonAngelHelpful"); - } - if (msg) { - KinkyDungeonSendActionMessage(3, msg, "#ffffff", 1, true); - } -} - -function KinkyDungeonFoodMessage(Tile) { - let tile = Tile || KinkyDungeonTargetTile; - if (tile) { - let msg = TextGet("KinkyDungeonFood" + (tile.Food ? tile.Food : "")); - - if (msg) { - KinkyDungeonSendActionMessage(3, msg, "#ffffff", 1, true); - } - } - -} - -function KinkyDungeonMakeGhostDecision() { - for (let tile of Object.values(KinkyDungeonTiles)) { - if (tile.Type == "Ghost") { - tile.GhostDecision = 0; - - let rep = KinkyDungeonGoddessRep.Ghost; - - if (rep > 0) tile.GhostDecision += 1; - if (rep != undefined) { - let mult = KinkyDungeonStatsChoice.get("Oppression") ? 1.5 : (KinkyDungeonStatsChoice.has("Dominant") ? 0.5 : 1.0); - if (KDRandom() * 100 * mult > -rep + 75) tile.GhostDecision += 1; - if (KDRandom() * 100 * mult > -rep + 85) tile.GhostDecision += 1; - if (KDRandom() * 100 * mult > -rep + 95) tile.GhostDecision += 1; - } - } - } -} - -function KinkyDungeonDrawCharger() { - KDModalArea = true; - //DrawTextKD(TextGet("KinkyDungeonCharger"), KDModalArea_x + 200, KDModalArea_y + 50, "white", KDTextGray2); - if (KinkyDungeonTargetTile && KinkyDungeonTargetTile.Light == KDChargerLight) { - DrawButtonVis(KDModalArea_x + 25, KDModalArea_y + 25, 400, 60, TextGet("KinkyDungeonChargerRemoveCrystal"), "white", "", ""); - } else { - DrawButtonVis(KDModalArea_x + 250, KDModalArea_y + 25, 200, 60, TextGet("KinkyDungeonChargerCharge"), KinkyDungeonInventoryGet("AncientPowerSourceSpent") ? "white" : "#888888", "", ""); - DrawButtonVis(KDModalArea_x + 25, KDModalArea_y + 25, 200, 60, TextGet("KinkyDungeonChargerPlaceCrystal"), KinkyDungeonInventoryGet("AncientPowerSource") ? "white" : "#888888", "", ""); - } - - -} - -function KinkyDungeonDrawTablet() { - KDModalArea = true; - //DrawTextKD(TextGet("KinkyDungeonCharger"), KDModalArea_x + 200, KDModalArea_y + 50, "white", KDTextGray2); - if (KinkyDungeonTargetTile) { - DrawButtonKDEx("Tablet",(bdata) => { - KDSendInput("tabletInteract", {action: "read", targetTile: KinkyDungeonTargetTileLocation}); - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - return true; - }, true, KDModalArea_x + 25, KDModalArea_y + 25, 400, 60, TextGet("KinkyDungeonTabletRead"), "white", "", ""); - } -} - -function KinkyDungeonDrawFood() { - KDModalArea = true; - if (KinkyDungeonTargetTile && KinkyDungeonTargetTile.Food && KinkyDungeonTargetTile.Food != "Plate") { - DrawButtonKDEx("Food",(bdata) => { - KDSendInput("foodInteract", {action: "eat", targetTile: KinkyDungeonTargetTileLocation}); - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - return true; - }, true, KDModalArea_x + 25, KDModalArea_y + 25, 400, 60, TextGet("KinkyDungeonFoodEat"), "white", "", ""); - } -} - -let KDChargerLight = 6.5; -let KDChargerColor = 0xffee83; -let KDLeylineLightColor = 0x4477ff; -let KDLeylineLight = 8; - -function KinkyDungeonHandleCharger() { - if (KinkyDungeonTargetTile && KinkyDungeonTargetTile.Light == KDChargerLight) { - if (MouseIn(KDModalArea_x + 25, KDModalArea_y + 25, 400, 60) && KinkyDungeonTargetTile) { - KDSendInput("chargerInteract", {action: "remove", targetTile: KinkyDungeonTargetTileLocation}); - return true; - } - } else { - if (MouseIn(KDModalArea_x + 250, KDModalArea_y + 25, 200, 60)) { - if (KDSendInput("chargerInteract", {action: "charge", targetTile: KinkyDungeonTargetTileLocation})) { - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - } - return true; - } else if (MouseIn(KDModalArea_x + 25, KDModalArea_y + 25, 200, 60) && KinkyDungeonTargetTile) { - KDSendInput("chargerInteract", {action: "place", targetTile: KinkyDungeonTargetTileLocation}); - return true; - } - } - - return false; -} - diff --git a/Game/KinkyDungeonParams.js b/Game/KinkyDungeonParams.js deleted file mode 100644 index e2022c25b..000000000 --- a/Game/KinkyDungeonParams.js +++ /dev/null @@ -1,1047 +0,0 @@ -"use strict"; -/** - * @type {Record} - */ -const KinkyDungeonMapParams = { - "grv":{//DungeonName0,-Graveyard- - "background" : "RainyForstPathNight", - "openness" : 3, // Openness of rooms - "density" : 3, // Density of tunnels (inverse of room spawn chance) - "crackchance" : 0.07, - "barchance" : 0.2, - "brightness" : 7, - "chestcount" : 5, - "shrinecount" : 11, - "shrinechance" : 0.75, - "ghostchance" : 1, - "doorchance" : 0.67, - "nodoorchance" : 0.1, - "doorlockchance" : -0.1, - "trapchance" : 0.5, - "grateChance" : 0.4, - "rubblechance" : 0.4, - "brickchance" : 0.1, - "cacheInterval" : 1, - "forbiddenChance" : 0.7, // If a forbidden gold chance is generated. Otherwise a silver chest will appear - "forbiddenGreaterChance" : 0.33, // Chance after a forbidden area is generated with a restraint, otherwise its a lesser gold chest - "torchchance": 0.35, - "torchchanceboring": 1.0, - - music: { - "AREA1-GRAVEYARD.ogg": 10, - "GENERIC-DOLLRACK.ogg": 4, - }, - - tagModifiers: { - "temple": 0.4, - "jungle": 0, - "cavern": 0, - }, - - enemyTags: ["magical", "zombie", "leather", "tape", "ribbon"], - - "setpieces": [ - {Type: "Bedroom", Weight: 3}, - {Type: "Graveyard", Weight: 6}, - {Type: "Altar", Weight: 3}, - {Type: "SmallAltar", Weight: 18}, - {Type: "GuardedChest", Weight: 30}, - {Type: "LargeGuardedChest", Weight: 20}, - {Type: "QuadCell", Weight: 3}, - {Type: "Storage", Weight: 5}, - ], - - "shortcuts": [ - {Level: 1, checkpoint: "tmb", chance: 1.0}, - {Level: 3, checkpoint: "tmb", chance: 1.0}, - ], - "mainpath": [ - {Level: 4, checkpoint: "cat"}, - ], - - "traps": [ - {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapCharmWeak", Level: 0, Power: 1, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapLustCloud", Level: 0, Power: 3, Weight: 30}, - {Name: "SpawnEnemies", Enemy: "SummonedSkeleton", strict: true, Level: 0, Power: 4, Weight: 10}, - {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 1, Weight: 10}, - ], - - factionList: ["Bandit", "Apprentice", "Bountyhunter", "Elemental", "Dragon", "Maidforce"], - - "min_width" : 5, - "max_width" : 7, - "min_height" : 5, - "max_height" : 6, - "defeat_outfit": "Prisoner", - "shrines": [ - //{Type: "Charms", Weight: 5}, - {Type: "Latex", Weight: 3}, - {Type: "Commerce", Weight: 0}, - {Type: "Elements", Weight: 5}, - {Type: "Conjure", Weight: 5}, - {Type: "Illusion", Weight: 5}, - {Type: "Leather", Weight: 5}, - {Type: "Metal", Weight: 3}, - {Type: "Rope", Weight: 2}, - {Type: "Will", Weight: 7},] - - - }, - "cat":{// DungeonName1,-Catacombs- - "background" : "Dungeon", - "openness" : 0, - "density" : 2, - "crackchance" : 0.09, - "barchance" : 0.2, - "brightness" : 4, - "chestcount" : 7, - "shrinecount" : 12, - "chargerchance": 0.5, - "litchargerchance": 0.5, - "chargercount": 7, - "shrinechance" : 0.6, - "ghostchance" : 0.5, - "doorchance" : 0.8, - "nodoorchance" : 0.05, - "doorlockchance" : -0.05, - "trapchance" : 0.65, - "grateChance" : 0.1, - "rubblechance" : 0.3, - "brickchance" : 0.4, - "cacheInterval" : 1, - "forbiddenChance" : 0.72, - "forbiddenGreaterChance" : 0.33, - cageChance: 0.8, - torchchance: 0.05, - torchchanceboring: 0.7, - - music: { - "GENERIC-DOLLRACK.ogg": 10, - "AREA2-ANCIENTTOMBS.ogg": 2, - }, - - tagModifiers: { - "narrow": 2, - "dungeon": 2, - "open": 0.5, - "jungle": 0, - "cavern": 0, - }, - - "setpieces": [ - {Type: "Bedroom", Weight: 2}, - {Type: "Altar", Weight: 3}, - {Type: "QuadCell", Weight: 8}, - {Type: "Storage", Weight: 5}, - {Type: "SmallAltar", Weight: 18}, - {Type: "GuardedChest", Weight: 30}, - {Type: "LargeGuardedChest", Weight: 20}, - {Type: "ExtraCell", Weight: 10}, - ], - - "shortcuts": [ - {Level: 5, checkpoint: "lib", chance: 0.5}, - {Level: 6, checkpoint: "lib", chance: 1.0}, - {Level: 7, checkpoint: "lib", chance: 0.25}, - {Level: 8, checkpoint: "lib", chance: 0.25}, - ], - "mainpath": [ - {Level: 8, checkpoint: "jng"}, - ], - - "traps": [ - {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapShackleWeak", Level: 0, Power: 1, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapLustCloud", Level: 0, Power: 3, Weight: 30}, - {Name: "SpawnEnemies", Enemy: "SummonedSkeleton", strict: true, Level: 0, Power: 4, Weight: 10}, - {Name: "SpawnEnemies", Enemy: "HeavySkeleton", extraTag: "Single", strict: true, Level: 0, Power: 2, Weight: 2}, - {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 2, Weight: 10}, - ], - - "min_width" : 5, - "max_width" : 7, - "min_height" : 5, - "max_height" : 6, - - factionList: ["AncientRobot", "Bandit", "Apprentice", "Bountyhunter", "Bast", "Dragon", "Maidforce", "Alchemist"], - - enemyTags: ["skeleton", "metal", "rope", "leather"], - "defeat_outfit": "Dungeon", - "shrines": [ - {Type: "Latex", Weight: 3}, - {Type: "Commerce", Weight: 0}, - {Type: "Elements", Weight: 5}, - {Type: "Conjure", Weight: 5}, - {Type: "Illusion", Weight: 5}, - {Type: "Leather", Weight: 5}, - {Type: "Metal", Weight: 3}, - {Type: "Rope", Weight: 2}, - {Type: "Will", Weight: 7},] - - }, - "jng":{//DungeonName2,-Underground Jungle- - "background" : "DeepForest", - noReplace: "b", - "openness" : 1, - "density" : 1, - "crackchance" : 0.15, - "barchance" : 0.05, - "brightness" : 6, - "chestcount" : 7, - "shrinecount" : 13, - "shrinechance" : 0.4, - "ghostchance" : 0.5, - "doorchance" : 0.2, - "nodoorchance" : 0.7, - "doorlockchance" : -0.05, - "trapchance" : 0.4, - "grateChance" : 0.1, - "rubblechance" : 0.25, - "brickchance" : 0.25, - "cacheInterval" : 1, - "forbiddenChance" : 0.72, - "forbiddenGreaterChance" : 0.33, - torchchance: 0.2, - torchchanceboring: 0.25, - - tagModifiers: { - "open": 6, - "door": 0.5, - "jungle": 100, - "cavern": 60, - }, - - music: { - "AREA5-UNDERGROUNDJUNGLE.ogg": 10, - }, - - "setpieces": [ - {Type: "Altar", Weight: 6}, - {Type: "SmallAltar", Weight: 20}, - {Type: "GuardedChest", Weight: 30}, - {Type: "LargeGuardedChest", Weight: 20}, - {Type: "JungleLight", Weight: 8}, - {Type: "Fireflies", Weight: 40}, - ], - - "shortcuts": [ - {Level: 9, checkpoint: "cry", chance: 1.0}, - {Level: 10, checkpoint: "cry", chance: 1.0}, - ], - "mainpath": [ - {Level: 12, checkpoint: "tmp"}, - ], - - "traps": [ - {Name: "CustomVine", Level: 0, Power: 1, Weight: 30}, - {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 10}, - {Name: "SpecificSpell", Spell: "TrapSlimeWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 10}, - {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 10}, - {Name: "SpecificSpell", Spell: "TrapLustCloud", Level: 0, Power: 3, Weight: 30}, - {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 3, Weight: 10}, - ], - - "min_width" : 5, - "max_width" : 6, - "min_height" : 5, - "max_height" : 5, - - factionList: ["AncientRobot", "Nevermere", "Bandit", "Bountyhunter", "Elf", "Bast", "Dragon", "Maidforce", "Alchemist"], - - enemyTags: ["plant", "jungle", "slime", "earth"], - "defeat_outfit": "LatexPrisoner", - "shrines": [ - {Type: "Latex", Weight: 5}, - {Type: "Commerce", Weight: 0}, - {Type: "Elements", Weight: 5}, - {Type: "Conjure", Weight: 5}, - {Type: "Illusion", Weight: 5}, - {Type: "Leather", Weight: 5}, - {Type: "Metal", Weight: 3}, - {Type: "Rope", Weight: 5}, - {Type: "Will", Weight: 5},] - }, - "tmp":{//DungeonName3,-Lost Temple- - "background" : "SpookyForest", - "openness" : 2, - "density" : 2, - "crackchance" : 0.05, - "barchance" : 0.1, - "brightness" : 3, - "chestcount" : 7, - "chargerchance": 0.9, - "litchargerchance": 0.2, - "chargercount": 10, - "shrinecount" : 10, - "shrinechance" : 0.5, - "ghostchance" : 0.5, - "doorchance" : 0.9, - "nodoorchance" : 0.25, - "doorlockchance" : -0.05, - "trapchance" : 0.5, - "grateChance" : 0.8, - "rubblechance" : 0.35, - "brickchance" : 0.1, - "floodchance" : 0.33, - "gaschance" : 0.5, // Chance for gas to appear on the level - "gasdensity" : 0.1, // Chance for a passage to be filled with happy gas - "gastype" : ']', // Gas type - "cacheInterval" : 1, - "forbiddenChance" : 0.8, - "forbiddenGreaterChance" : 0.4, - torchchance: 0.4, - torchchanceboring: -0.4, - torchlitchance: 0.15, - torchreplace: { - sprite: "Lantern", - unlitsprite: "LanternUnlit", - brightness: 6, - }, - - music: { - "AREA7-LOSTTEMPLE.ogg": 14, - "AREA9-BELLOWS.ogg": 2, - }, - - tagModifiers: { - "jungle": 0, - "cavern": 0, - "temple": 3, - }, - globalTags: { - "temple": true, - }, - - shadowColor: 0x000703, - - "setpieces": [ - {Type: "Bedroom", Weight: 1}, - {Type: "Altar", Weight: 6}, - {Type: "SmallAltar", Weight: 20}, - {Type: "GuardedChest", Weight: 30}, - {Type: "LargeGuardedChest", Weight: 20}, - {Type: "Magicflies", Weight: 12}, - ], - - "shortcuts": [ - {Level: 13, checkpoint: "ore", chance: 1.0}, - ], - "mainpath": [ - {Level: 17, checkpoint: "bel"}, - ], - - "traps": [ - {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, - {Name: "SpecificSpell", Spell: "TrapSlimeWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 10}, - {Name: "SpecificSpell", Spell: "TrapShackleWeak", Level: 0, Power: 3, Weight: 10}, - {Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpawnEnemies", Enemy: "GreaterSkeleton", strict: true, Level: 0, Power: 3, Weight: 10}, - {Name: "SpawnEnemies", Enemy: "HeavySkeleton", strict: true, Level: 0, Power: 1, Weight: 10}, - ], - - "min_width" : 5, - "max_width" : 7, - "min_height" : 5, - "max_height" : 5, - - factionList: ["Apprentice", "Bandit", "Bountyhunter", "Elemental", "Dragon", "Maidforce", "Alchemist"], - - enemyTags: ["skeleton", "temple", "ghost", "magical"], - "defeat_outfit": "LatexPrisoner", - "shrines": [ - {Type: "Latex", Weight: 5}, - {Type: "Commerce", Weight: 0}, - {Type: "Elements", Weight: 5}, - {Type: "Conjure", Weight: 5}, - {Type: "Illusion", Weight: 5}, - {Type: "Leather", Weight: 3}, - {Type: "Metal", Weight: 5}, - {Type: "Rope", Weight: 3}, - {Type: "Will", Weight: 7},], - - "lockmult" : 1.5, - }, - "tmb":{//DungeonName11,-Ancient Tombs- - "background" : "EgyptianTomb", - "openness" : 1, - "density" : 3, - "crackchance" : 0.06, - "barchance" : 0.05, - "brightness" : 3, - "chestcount" : 9, - "chargerchance": 0.8, - "litchargerchance": 0.65, - "chargercount": 6, - "shrinecount" : 13, - "shrinechance" : 0.5, - "ghostchance" : 0.5, - "doorchance" : 0.4, - "nodoorchance" : 0.25, - "doorlockchance" : -0.05, - "trapchance" : 0.65, - "grateChance" : 0.3, - "rubblechance" : 0.35, - "brickchance" : 0.4, - "cacheInterval" : 1, - // Side routes have more high-value loot - "forbiddenChance" : 1.0, - "forbiddenGreaterChance" : 0.45, - torchchance: 0.1, - torchchanceboring: 0.1, - - music: { - "AREA2-ANCIENTTOMBS.ogg": 10, - }, - - worldGenCode: () => { - for (let X = 1; X < KinkyDungeonGridWidth - 1; X++) { - for (let Y = 1; Y < KinkyDungeonGridHeight - 1; Y++) { - if (KinkyDungeonMapGet(X, Y) == 'X' && KDRandom() < 0.15 + 0.45 * Math.min(1, KinkyDungeonDifficulty/30)) { - KinkyDungeonMapSet(X, Y, '3'); - DialogueCreateEnemy(X, Y, "MummyCursed"); - } - } - } - }, - - "setpieces": [ - {Type: "Altar", Weight: 6}, - {Type: "SmallAltar", Weight: 20}, - {Type: "GuardedChest", Weight: 30}, - {Type: "LargeGuardedChest", Weight: 20}, - {Type: "Storage", Weight: 7}, - ], - - tagModifiers: { - "temple": 2, - "jungle": 0, - "cavern": 0, - }, - globalTags: { - "egyptian": true, - }, - - "shortcuts": [ - {Level: 3, checkpoint: "cry", chance: 1.0}, - ], - "mainpath": [ - {Level: 4, checkpoint: "cat"}, - ], - - "traps": [ - {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, - {Name: "SpecificSpell", Spell: "TrapMummyWeak", Level: 0, Power: 1, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapLustCloud", Level: 0, Power: 3, Weight: 30}, - {Name: "SpawnEnemies", Enemy: "SummonedSkeleton", strict: true, Level: 0, Power: 5, Weight: 10}, - {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 3, Weight: 10}, - ], - - "min_width" : 5, - "max_width" : 6, - "min_height" : 5, - "max_height" : 7, - - factionList: ["Bast", "Bandit", "AncientRobot", "Elemental", "Dragon"], - - enemyTags: ["mummy", "ghost", "tape", "ribbon", "nature"], - "defeat_outfit": "Bast", - "shrines": [ - {Type: "Latex", Weight: 3}, - {Type: "Commerce", Weight: 0}, - {Type: "Elements", Weight: 5}, - {Type: "Conjure", Weight: 5}, - {Type: "Illusion", Weight: 5}, - {Type: "Metal", Weight: 3}, - {Type: "Rope", Weight: 4}, - {Type: "Leather", Weight: 6}, - {Type: "Will", Weight: 7},] - }, - "lib":{//DungeonName12,-Magic Library- - "background" : "MagicSchoolLaboratory", - noReplace: "Ddb", - "openness" : 5, - "density" : 6, - "crackchance" : 0.0, - "wallRubblechance" : 0.035, - "barchance" : 0.1, - "brightness" : 6, - "chestcount" : 10, - "chargerchance": 0.8, - "litchargerchance": 0.25, - "chargercount": 6, - "shrinecount" : 15, - "shrinechance" : 0.5, - "ghostchance" : 0.5, - "doorchance" : 0.0, - "nodoorchance" : 1.0, - "doorlockchance" : -0.05, - "trapchance" : 0.3, - "grateChance" : 0.7, - "rubblechance" : 0.3, - "brickchance" : 0.01, - "cacheInterval" : 1, - // Side routes have more high-value loot - "forbiddenChance" : 1.0, - "forbiddenGreaterChance" : 0.45, - torchchance: 0.6, - torchchanceboring: -0.4, - torchreplace: { - sprite: "TorchOrb", - brightness: 4, - }, - - music: { - "AREA4-MAGICLIBRARY.ogg": 10, - "GENERIC-DOLLRACK.ogg": 4, - }, - - "setpieces": [ - {Type: "SmallAltar", Weight: 20}, - {Type: "GuardedChest", Weight: 30}, - {Type: "LargeGuardedChest", Weight: 20}, - ], - - tagModifiers: { - "urban": 2, - "jungle": 0, - "cavern": 0, - }, - - "shortcuts": [ - {Level: 7, checkpoint: "cat", chance: 1.0}, - ], - "mainpath": [ - {Level: 8, checkpoint: "ore"}, - ], - - "traps": [ - {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, - {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapRopeStrong", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpawnEnemies", Enemy: "Dressmaker", strict: true, Level: 0, Power: 2, Weight: 10}, - {Name: "SpawnEnemies", Enemy: "Librarian", strict: true, Level: 4, Power: 1, Weight: 5}, - ], - - "min_width" : 5, - "max_width" : 5, - "min_height" : 5, - "max_height" : 5, - - factionList: ["Elf", "Bandit", "Apprentice", "Elemental", "Dragon", "Maidforce", "Alchemist"], - - enemyTags: ["book", "witch", "dressmaker", "magical"], - "defeat_outfit": "Prisoner", - "shrines": [ - {Type: "Latex", Weight: 3}, - {Type: "Commerce", Weight: 0}, - {Type: "Elements", Weight: 5}, - {Type: "Conjure", Weight: 5}, - {Type: "Illusion", Weight: 5}, - {Type: "Metal", Weight: 3}, - {Type: "Rope", Weight: 4}, - {Type: "Leather", Weight: 6}, - {Type: "Will", Weight: 7},] - }, - "cry":{//DungeonName13,-Crystal Cave- - "background" : "MagicSchoolEscape", - "openness" : 6, - "density" : 2, - "crackchance" : 0.11, - "barchance" : 0.03, - "brightness" : 5, - "chargerchance": 1.0, - "litchargerchance": 1.0, - "chargercount": 4, - "chestcount" : 10, - "shrinecount" : 13, - "shrinechance" : 0.8, - "ghostchance" : 0.5, - "doorchance" : 0.05, - "nodoorchance" : 0.5, - "doorlockchance" : -0.05, - "trapchance" : 0.5, - "grateChance" : 0.7, - "rubblechance" : 0.45, - "brickchance" : 0.2, - torchchance: 0.3, - torchchanceboring: 0.1, - - music: { - "AREA6-CRYSTALCAVE.ogg": 10, - "AREA9-BELLOWS.ogg": 3, - }, - - shadowColor: 0x080311, - - "gaschance" : 0.33, // Chance for gas to appear on the level - "gasdensity" : 0.05, // Chance for a passage to be filled with happy gas - "gastype" : '[', // Gas type - - "floodchance" : 0.25, - "cacheInterval" : 1, - // Side routes have more high-value loot - "forbiddenChance" : 1.0, - "forbiddenGreaterChance" : 0.45, - - tagModifiers: { - "open": 4, - "jungle": 20, - "cavern": 80, - "urban": 0.5, - "door": 0.5, - }, - - "setpieces": [ - {Type: "Altar", Weight: 6}, - {Type: "SmallAltar", Weight: 20}, - {Type: "GuardedChest", Weight: 30}, - {Type: "LargeGuardedChest", Weight: 20}, - {Type: "Storage", Weight: 2}, - {Type: "Magicflies", Weight: 40}, - ], - - "shortcuts": [ - {Level: 9, checkpoint: "jng", chance: 0.33}, - {Level: 10, checkpoint: "jng", chance: 0.4}, - {Level: 11, checkpoint: "jng", chance: 1.0}, - ], - "mainpath": [ - {Level: 4, checkpoint: "cry"}, - {Level: 6, checkpoint: "cat"}, - {Level: 12, checkpoint: "ore"}, - ], - - "traps": [ - {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, - {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapLustCloud", Level: 0, Power: 3, Weight: 30}, - {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 3, Weight: 10}, - ], - - "min_width" : 4, - "max_width" : 5, - "min_height" : 5, - "max_height" : 7, - - factionList: ["Nevermere", "Elf", "Bandit", "Apprentice", "Bountyhunter", "Elemental", "Dragon", "Maidforce", "Alchemist"], - - enemyTags: ["mushroom", "slimeBonus", "crystalline", "earth", "slime", "shadow"], - "defeat_outfit": "Prisoner", - "shrines": [ - {Type: "Latex", Weight: 3}, - {Type: "Commerce", Weight: 0}, - {Type: "Elements", Weight: 5}, - {Type: "Conjure", Weight: 5}, - {Type: "Illusion", Weight: 5}, - {Type: "Metal", Weight: 3}, - {Type: "Rope", Weight: 4}, - {Type: "Leather", Weight: 6}, - {Type: "Will", Weight: 7},] - }, - - "ore":{//DungeonName8,-Orrery- - "background" : "SpookyForest", - "openness" : 2, - "density" : 2, - "crackchance" : 0.05, - "barchance" : 0.1, - "brightness" : 1, - "chestcount" : 7, - "chargerchance": 0.9, - "litchargerchance": 0.2, - "chargercount": 10, - "shrinecount" : 10, - "shrinechance" : 0.5, - "ghostchance" : 0.7, - "doorchance" : 0.9, - "nodoorchance" : 0.25, - "doorlockchance" : -0.05, - "trapchance" : 0.5, - "grateChance" : 0.8, - "rubblechance" : 0.35, - "brickchance" : 0.1, - "cacheInterval" : 1, - "forbiddenChance" : 1.0, - "forbiddenGreaterChance" : 0.45, - torchlitchance: 0.2, - torchchance: 1.0, - torchchanceboring: -0.4, - torchreplace: { - sprite: "IllusOrb", - unlitsprite: "IllusOrbDead", - brightness: 2, - }, - - music: { - "AREA8-ORRERY.ogg": 30, - }, - - factionList: ["Apprentice", "Elf", "Bandit", "Dressmaker", "Bountyhunter", "Elemental", "Dragon", "Maidforce", "Alchemist"], - - tagModifiers: { - "jungle": 0, - "cavern": 0, - "temple": 3, - "urban": 0.4, - "dungeon": 0, - }, - globalTags: { - "temple": true, - "orrery": true, - }, - - shadowColor: 0x000703, - - "setpieces": [ - {Type: "Bedroom", Weight: 1}, - {Type: "Altar", Weight: 6}, - {Type: "SmallAltar", Weight: 20}, - {Type: "GuardedChest", Weight: 30}, - {Type: "LargeGuardedChest", Weight: 20}, - ], - - "shortcuts": [ - {Level: 14, checkpoint: "tmp", chance: 1.0}, - ], - "mainpath": [ - {Level: 17, checkpoint: "bel"}, - ], - - "traps": [ - {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, - {Name: "SpecificSpell", Spell: "TrapRopeHoly", Level: 0, Power: 3, Weight: 30}, - {Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpawnEnemies", Enemy: "ShadowHand", strict: true, Level: 0, Power: 3, Weight: 10}, - {Name: "SpawnEnemies", Enemy: "TickleTerror", strict: true, Level: 0, Power: 1, Weight: 10}, - {Name: "SpawnEnemies", Enemy: "HugHorror", strict: true, Level: 0, Power: 1, Weight: 10}, - ], - - "min_width" : 5, - "max_width" : 7, - "min_height" : 5, - "max_height" : 7, - - enemyTags: ["shadowcreature", "magical", "shadow", "elemental", "angel"], - "defeat_outfit": "LatexPrisoner", - "shrines": [ - {Type: "Latex", Weight: 5}, - {Type: "Commerce", Weight: 0}, - {Type: "Elements", Weight: 5}, - {Type: "Conjure", Weight: 5}, - {Type: "Illusion", Weight: 10}, - {Type: "Leather", Weight: 5}, - {Type: "Metal", Weight: 3}, - {Type: "Rope", Weight: 5}, - {Type: "Will", Weight: 7},], - - "lockmult" : 1.6, - }, - - "bel":{//DungeonName8,-Orrery- - "background" : "SpookyForest", - "openness" : 1, - "density" : 9, - "crackchance" : 0.12, - "barchance" : 0.1, - "brightness" : 1, - "chestcount" : 7, - "chargerchance": 0.8, - "litchargerchance": 0.2, - "chargercount": 0, - "shrinecount" : 10, - "shrinechance" : 0.5, - "ghostchance" : 0.7, - "doorchance" : 0.9, - "nodoorchance" : 0.25, - "doorlockchance" : -0.05, - "trapchance" : 0.1, - "grateChance" : 0.8, - "rubblechance" : 0.35, - "brickchance" : 0.0, - "cacheInterval" : 1, - "forbiddenChance" : 1.0, - "forbiddenGreaterChance" : 0.45, - torchlitchance: 0.45, - torchchance: 1.0, - torchchanceboring: -0.7, - torchreplace: { - sprite: "Lantern", - unlitsprite: "LanternUnlit", - brightness: 5, - }, - - music: { - "AREA9-BELLOWS.ogg": 30, - }, - - tagModifiers: { - "jungle": 0, - "cavern": 0, - "temple": 0.0, - "urban": 0, - "industrial": 2.0, - "dungeon": 0, - "factory": 2.0, - "bellows": 3.0, - }, - globalTags: { - "factory": true, - "bellows": true, - "industrial": true, - }, - - shadowColor: 0x000703, - - "setpieces": [ - {Type: "Bedroom", Weight: 1}, - {Type: "LargeGuardedChest", Weight: 20}, - ], - - "shortcuts": [ - ], - "mainpath": [ - {Level: 21, checkpoint: "grv"}, - ], - - "traps": [ - {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, - {Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 30}, - {Name: "SpawnEnemies", strict: true, Enemy: "Drone", Level: 0, Power: 3, Weight: 100}, - {Name: "SpawnEnemies", strict: true, Enemy: "CaptureBot", Level: 0, Power: 2, Weight: 100}, - ], - - "min_width" : 6, - "max_width" : 8, - "min_height" : 4, - "max_height" : 4, - - factionList: ["Nevermere", "AncientRobot", "Bandit", "Dressmaker", "Bountyhunter", "Maidforce", "Alchemist"], - - enemyTags: ["dollsmith", "dollrare", "oldrobot", "oldrobotturret", "tech", "metal", "electric", "fire"], - "defeat_outfit": "DollSuit", - "shrines": [ - {Type: "Latex", Weight: 5}, - {Type: "Commerce", Weight: 0}, - {Type: "Elements", Weight: 5}, - {Type: "Conjure", Weight: 5}, - {Type: "Illusion", Weight: 5}, - {Type: "Leather", Weight: 7}, - {Type: "Metal", Weight: 10}, - {Type: "Rope", Weight: 3}, - {Type: "Will", Weight: 7},], - - "lockmult" : 2.0, - }, -}; - - -/*"fun":{//DungeonName4,-Fungal Caverns- - "openness" : 4, - "density" : 4, - "crackchance" : 0.15, - "barchance" : 0.15, - "brightness" : 7, - "chestcount" : 5, - "shrinecount" : 10, - "shrinechance" : 0.8, - "ghostchance" : 0.5, - "doorchance" : 0.05, - "nodoorchance" : 0.5, - "doorlockchance" : -0.05, - "trapchance" : 0.5, - "grateChance" : 0.7, - "rubblechance" : 0.9, - "brickchance" : 0.2, - - "traps": [ - {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, - ], - - "min_width" : 15, - "max_width" : 25, - "min_height" : 15, - "max_height" : 25, - }, - "blw":{//DungeonName5,-The Bellows- - "openness" : 1, - "density" : 1, - "crackchance" : 0.05, - "barchance" : 0.03, - "brightness" : 8, - "chestcount" : 6, - "shrinecount" : 8, - "shrinechance" : 0.75, - "ghostchance" : 0.5, - "doorchance" : 0.67, - "nodoorchance" : 0.1, - "doorlockchance" : -0.05, - "trapchance" : 0.5, - "grateChance" : 0.7, - "rubblechance" : 0.7, - "brickchance" : 0.3, - - "traps": [ - {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, - ], - - "min_width" : 25, - "max_width" : 51, - "min_height" : 13, - "max_height" : 15, - - "lockmult" : 2.0, - }, - "des":{//DungeonName6,-Underground Desert- - "openness" : 4, - "density" : 2, - "crackchance" : 0.13, - "barchance" : 0.03, - "brightness" : 5, - "chestcount" : 4, - "shrinecount" : 12, - "shrinechance" : 0.5, - "ghostchance" : 0.5, - "doorchance" : 0.0, - "nodoorchance" : 0.3, - "doorlockchance" : -0.05, - "trapchance" : 0.5, - "grateChance" : 0.7, - "rubblechance" : 0.3, - "brickchance" : 0.3, - - "traps": [ - {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, - ], - - "min_width" : 25, - "max_width" : 31, - "min_height" : 17, - "max_height" : 25, - }, - "ice":{//DungeonName7,-Kingdom of Ice- - "openness" : 2, - "density" : 1, - "crackchance" : 0.12, - "barchance" : 0.03, - "brightness" : 4, - "chestcount" : 4, - "shrinecount" : 10, - "shrinechance" : 0.8, - "ghostchance" : 0.5, - "doorchance" : 0.8, - "trapchance" : 0.5, - "grateChance" : 0.7, - "nodoorchance" : 0.2, - "rubblechance" : 0.5, - "brickchance" : 0.7, - - "traps": [ - {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, - ], - - "min_width" : 25, - "max_width" : 31, - "min_height" : 13, - "max_height" : 19, - - "lockmult" : 2.0, - }, - "mar":{//DungeonName8,-Marble Halls- - "openness" : 4, - "density" : 1, - "crackchance" : 0.12, - "barchance" : 0.03, - "brightness" : 8, - "chestcount" : 8, - "shrinecount" : 8, - "shrinechance" : 0.75, - "ghostchance" : 0.5, - "doorchance" : 1.0, - "nodoorchance" : 0.0, - "doorlockchance" : -0.05, - "trapchance" : 0.5, - "grateChance" : 0.7, - "rubblechance" : 0.7, - "brickchance" : 0.5, - - "traps": [ - {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, - ], - - "min_width" : 15, - "max_width" : 21, - "min_height" : 25, - "max_height" : 37, - - "lockmult" : 1.5, - }, - "lab":{//DungeonName9,-Ancient Laboratory- - "openness" : 2, - "density" : 1, - "crackchance" : 0.08, - "barchance" : 0.03, - "brightness" : 4, - "chestcount" : 10, - "shrinecount" : 6, - "shrinechance" : 0.75, - "ghostchance" : 0.5, - "doorchance" : 1.0, - "nodoorchance" : 0.0, - "doorlockchance" : -0.05, - "trapchance" : 0.5, - "grateChance" : 0.7, - "rubblechance" : 0.6, - "brickchance" : 0.9, - - "traps": [ - {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, - ], - - "min_width" : 25, - "max_width" : 31, - "min_height" : 13, - "max_height" : 19, - - "lockmult" : 4.0, - }, - "man":{//DungeonName10,-The Mansion- - "openness" : 10, - "density" : 1, - "crackchance" : 0.05, - "barchance" : 0.03, - "brightness" : 100, - "chestcount" : 0, - "shrinecount" : 0, - "shrinechance" : 0.25, - "ghostchance" : 0.5, - "doorchance" : 1.0, - "nodoorchance" : 0.0, - "doorlockchance" : -0.05, - "trapchance" : 0.5, - "grateChance" : 0.7, - "rubblechance" : 1.0, - "brickchance" : 0.7, - - "traps": [ - {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, - ], - - "min_width" : 31, - "max_width" : 31, - "min_height" : 19, - "max_height" : 19, - - "lockmult" : 0.0, - },*/ \ No newline at end of file diff --git a/Game/KinkyDungeonPathfinding.js b/Game/KinkyDungeonPathfinding.js deleted file mode 100644 index 3aae30b0b..000000000 --- a/Game/KinkyDungeonPathfinding.js +++ /dev/null @@ -1,217 +0,0 @@ -"use strict"; - -/** - * @type {Map} - */ -let KDPathCache = new Map(); - -/** - * @type {Map} - */ -let KDPathCacheIgnoreLocks = new Map(); - -function KDUpdateDoorNavMap() { - KDPathCache = new Map(); -} - -let KDPathfindingCacheHits = 0; -let KDPathfindingCacheFails = 0; - -let KDPFTrim = 40; - -/** - * @param {number} startx - the start position - * @param {number} starty - the start position - * @param {number} endx - the end positon - * @param {number} endy - the end positon - * @param {boolean} blockEnemy - Do enemies block movement? - * @param {boolean} blockPlayer - Does player block movement? - * @param {string} Tiles - Allowed move tiles! - * @param {entity} [Enemy] - Enemy trying to pathfind - * @param {boolean} [trimLongDistance] - Give up after 1000 or so tiles checked - * @returns {any} - Returns an array of x, y points in order - */ -function KinkyDungeonFindPath(startx, starty, endx, endy, blockEnemy, blockPlayer, ignoreLocks, Tiles, RequireLight, noDoors, needDoorMemory, Enemy, trimLongDistance) { - let tileShort = Tiles; - if (Tiles == KinkyDungeonMovableTilesSmartEnemy) tileShort = "TSE"; - else if (Tiles == KinkyDungeonMovableTilesEnemy) tileShort = "TE"; - else if (Tiles == KinkyDungeonGroundTiles) tileShort = "TG"; - let index = `${startx},${starty},${endx},${endy},${tileShort}`; - if (!blockEnemy && !blockPlayer && !RequireLight && !noDoors && !needDoorMemory) { - if (ignoreLocks) { - if (KDPathCacheIgnoreLocks.has(index)) { - KDPathfindingCacheHits++; - return Object.assign([], KDPathCacheIgnoreLocks.get(index)); - } - } else { - if (KDPathCache.has(index)) { - KDPathfindingCacheHits++; - return Object.assign([], KDPathCache.get(index)); - } - } - - } - - if (KDistChebyshev(startx - endx, starty - endy) < 1.5) { - return [{x: endx, y: endy}]; - } - - function heuristic(xx, yy, endxx, endyy) { - return ((xx - endxx) * (xx - endxx) + (yy - endyy) * (yy - endyy)) ** 0.5; - } - // g = cost - // f = cost with heuristic - // s = source - let TilesTemp = Tiles; - if (noDoors) TilesTemp = Tiles.replace("D", ""); - let start = {x: startx, y: starty, g: 0, f: 0, s: ""}; - - // We generate a grid based on map size - let open = new Map(); - open.set(startx + "," + starty, start); - let closed = new Map(); - - let costBonus = 0; - let MapTile = null; - let moveCost = 1; - let succ = new Map(); - - while(open.size > 0) { - // Trim if it takes too long - if (trimLongDistance && open.size > KDPFTrim) { - console.log("Quit pathfinding"); - return undefined; // Give up - } - let lowest = {}; - lowest = undefined; - let lc = 1000000000; - // Get the open tile with the lowest weight - open.forEach(o => { - if (o.f < lc) { - lc = o.f; - lowest = o; - } - }); - if (lowest) { - let lowLoc = lowest.x + "," + lowest.y; - moveCost = 1; - succ = new Map(); - // Check bordering tiles on the lowest - for (let x = -1; x <= 1; x++) { - for (let y = -1; y <= 1; y++) { - if (x != 0 || y != 0) { - let xx = lowest.x + x; - let yy = lowest.y + y; - let tile = (xx == endx && yy == endy) ? "" : KinkyDungeonMapGet(xx, yy); - MapTile = KinkyDungeonTilesGet((xx) + "," + (yy)); - let locIndex = `${lowLoc},${endx},${endy},${tileShort}`; - // If we have found the end - if (xx == endx && yy == endy) { - closed.set(lowLoc, lowest); - let newPath = KinkyDungeonGetPath(closed, lowest.x, lowest.y, endx, endy); - if (!blockEnemy && !blockPlayer && !RequireLight && !noDoors && !needDoorMemory) { - if (ignoreLocks) { - if (!KDPathCacheIgnoreLocks.has(index)) KDSetPathfindCache(KDPathCacheIgnoreLocks, newPath, endx, endy, tileShort, index); - } else { - if (!KDPathCache.has(index)) KDSetPathfindCache(KDPathCache, newPath, endx, endy, tileShort, index); - } - } - KDPathfindingCacheFails++; - if (newPath.length > 0 && TilesTemp.includes(KinkyDungeonMapGet(newPath[0].x, newPath[0].y))) - return newPath; - else return undefined; - } else if (!blockEnemy && !blockPlayer && !RequireLight && !noDoors && !needDoorMemory - && ((ignoreLocks && KDPathCacheIgnoreLocks.has(locIndex)) || (!ignoreLocks && KDPathCache.has(locIndex)))) { - let newPath = []; - if (ignoreLocks) { - closed.set(lowLoc, lowest); - newPath = KinkyDungeonGetPath(closed, lowest.x, lowest.y); - let endPath = KDPathCacheIgnoreLocks.get(locIndex); - KDPathfindingCacheHits++; - newPath.push.apply(newPath, endPath); - } else { - closed.set(lowLoc, lowest); - newPath = KinkyDungeonGetPath(closed, lowest.x, lowest.y); - let endPath = KDPathCache.get(locIndex); - KDPathfindingCacheHits++; - newPath.push.apply(newPath, endPath); - } - if (newPath.length > 0) { - if (ignoreLocks) { - if (!KDPathCacheIgnoreLocks.has(index)) KDSetPathfindCache(KDPathCacheIgnoreLocks, newPath, endx, endy, tileShort, index); - } else { - if (!KDPathCache.has(index)) KDSetPathfindCache(KDPathCache, newPath, endx, endy, tileShort, index); - } - return newPath; - } else return undefined; - } - // Give up and add to the test array - else if (TilesTemp.includes(tile) && (!RequireLight || KinkyDungeonVisionGet(xx, yy) > 0) - && (ignoreLocks || !MapTile || !MapTile.Lock) - && (!blockEnemy || KinkyDungeonNoEnemyExceptSub(xx, yy, false, Enemy)) - && (!blockPlayer || KinkyDungeonPlayerEntity.x != xx || KinkyDungeonPlayerEntity.y != yy) - && (!needDoorMemory || tile != "d" || KDOpenDoorTiles.includes(KinkyDungeonTilesMemory[xx + "," + yy]))) { - costBonus = 0; - if (KinkyDungeonMapGet(xx, yy) == "D") costBonus = 2; - else if (KinkyDungeonMapGet(xx, yy) == "d") costBonus = 1; - else if (KinkyDungeonMapGet(xx, yy) == "g") costBonus = 2; - else if (KinkyDungeonMapGet(xx, yy) == "L") costBonus = 2; - costBonus = (MapTile && MapTile.Lock) ? costBonus + 2 : costBonus; - costBonus = (MapTile && MapTile.OffLimits) ? costBonus + 8 : costBonus; - succ.set(xx + "," + yy, {x: xx, y: yy, - g: moveCost + costBonus + lowest.g, - f: moveCost + costBonus + lowest.g + heuristic(xx, yy, endx, endy), - s: lowLoc}); - } - } - } - } - succ.forEach(s => { - let q = s.x + "," + s.y; - let openSucc = open.get(q); - if (!openSucc || openSucc.f > s.f) { - let closedSucc = closed.get(q); - if (!closedSucc || closedSucc.f > s.f) { - open.set(q, s); - } - } - }); - - - open.delete(lowLoc); - - closed.set(lowLoc, lowest); - } else { - open.clear(); - console.log("Pathfinding error! Please report this!"); - } - } - - return undefined; -} - -// Goes back and gets path backwards from xx, adding endx and endy -function KinkyDungeonGetPath(closed, xx, yy, endx, endy) { - let list = []; - if (endx && endy) list.push({x: endx, y: endy}); - - let current = closed.get(xx + "," + yy); - while (current) { - if (current.s) { - list.push({x: current.x, y: current.y}); - current = closed.get(current.s); - } else current = undefined; - } - - return list.reverse(); -} - -function KDSetPathfindCache(PathMap, newPath, endx, endy, Tiles, Finalindex) { - for (let i = 0; i < newPath.length - 1; i++) { - let path = newPath.slice(i); - let index = `${path[0].x},${path[0].y},${endx},${endy},${Tiles}`; - PathMap.set(index, path.slice(1)); - } - if (Finalindex) - PathMap.set(Finalindex, newPath); -} \ No newline at end of file diff --git a/Game/KinkyDungeonPerks.js b/Game/KinkyDungeonPerks.js deleted file mode 100644 index c932fe93c..000000000 --- a/Game/KinkyDungeonPerks.js +++ /dev/null @@ -1,854 +0,0 @@ -"use strict"; - -let KDDoorKnobChance = 0.1; // Chance to open door with mitts and arms bound -let KDDoorKnobChanceArms = 0.5; // Chance to open door with mitts but no arm bindings -let KDDoorAttractChance = 0.25; // Chance to attract someone by banging -let KDDoorAttractChanceArms = 0.1; // Chance to attract someone by rattling - -let KDCategoriesStart = [ - {name: "Toggles", buffs: [], debuffs: [],}, - {name: "Multiclass", buffs: [], debuffs: [],}, - {name: "Restraints", buffs: [], debuffs: [],}, - {name: "Kinky", buffs: [], debuffs: [],}, - {name: "Damage", buffs: [], debuffs: [],}, - {name: "Combat", buffs: [], debuffs: [],}, - {name: "Magic", buffs: [], debuffs: [],}, - {name: "Enemies", buffs: [], debuffs: [],}, - {name: "Map", buffs: [], debuffs: [],}, - {name: "Start", buffs: [], debuffs: [],}, - {name: "Boss", buffs: [], debuffs: [],}, -]; - -let KDPerkIcons = { - "Pacifist" : () => {return true;}, - "BerserkerRage" : () => {return true;}, - "BoundPower" : () => {return true;}, - "UnstableMagic" : () => {return true;}, - "BurningDesire" : () => {return true;}, - "FrigidPersonality" : () => {return true;}, - "ImmovableObject" : () => {return KinkyDungeonStatWill >= KinkyDungeonStatWillMax * 0.90;}, - "GroundedInReality" : () => {return KinkyDungeonPlayerDamage && KinkyDungeonStatMana >= KinkyDungeonStatManaMax * 0.999;}, - "LikeTheWind" : () => {return KinkyDungeonStatStamina >= KinkyDungeonStatStaminaMax * 0.95;}, - "LeastResistance" : () => {return KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.01;}, - //"DistractionCast" : () => {return KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.99;}, -}; - -let KDPerkUpdateStats = { - "Rigger": () => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "Rigger1", - type: "glueDamageBuff", - power: KDRiggerDmgBoost, - duration: 2 - }); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "Rigger2", - type: "chainDamageBuff", - power: KDRiggerDmgBoost, - duration: 2 - }); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "Rigger3", - type: "BindAmp", - power: KDRiggerBindBoost, - duration: 2 - }); - }, - "Ticklish": () => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "Ticklish", type: "tickleDamageResist", power: -0.5, duration: 2 - }); - }, - "Stoic": () => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "Stoic", type: "tickleDamageResist", power: 0.82, duration: 2 - }); - }, - "Lascivious": () => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "Lascivious", type: "gropeDamageResist", power: -0.5, duration: 2 - }); - }, - "Unperturbed": () => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "Unperturbed", type: "gropeDamageResist", power: 0.82, duration: 2 - }); - }, - "PainTolerance": () => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "PainTolerance", type: "painDamageResist", power: 2.0, duration: 2 - }); - }, - "Sticky": () => { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "StickySituation", type: "glueDamageResist", power: -0.4, duration: 2 - }); - }, - "BoundPower": () => { - KDDamageAmpPerks += KDBoundPowerLevel * KDBoundPowerMult; - }, - "BerserkerRage": () => { - KDDamageAmpPerksMelee += KDBerserkerAmp * KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax; - }, - "Dodge": () => { - if (KinkyDungeonMiscastChance < 0.001) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id: "FocusedDodge", type: "Evasion", power: 0.4, duration: 1, sfxApply: "Fwoosh" - }); - } - }, - "UnstableMagic": () => { - KDDamageAmpPerksSpell += KDUnstableAmp * Math.min(1, Math.max(KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax, KinkyDungeonMiscastChance)); - }, - - "CommonLatex": () => { - KDExtraEnemyTags.latexRestraints = 0; - KDExtraEnemyTags.latexRestraintsHeavy = 3; - }, - "CommonLeather": () => { - KDExtraEnemyTags.leatherRestraints = 0; - KDExtraEnemyTags.leatherRestraintsHeavy = 3; - }, - "CommonMaid": () => { - KDExtraEnemyTags.maidRestraints = 0; - KDExtraEnemyTags.maidVibeRestraintsLimited = 0; - }, - "CommonWolf": () => { - KDExtraEnemyTags.wolfRestraints = 0; - KDExtraEnemyTags.wolfCuffs = 3; - KDExtraEnemyTags.wolfGear = 0; - }, - "CommonDress": () => { - KDExtraEnemyTags.dressRestraints = 0; - }, - "CommonFuuka": () => { - KDExtraEnemyTags.mikoRestraints = 0; - }, - "CommonCyber": () => { - KDExtraEnemyTags.cyberdollrestraints = 0; - KDExtraEnemyTags.cyberdollchastity = 3; - KDExtraEnemyTags.cyberdollheavy = 7; - }, - "CommonExp": () => { - KDExtraEnemyTags.expRestraints = 0; - }, - "CommonKitty": () => { - KDExtraEnemyTags.kittyRestraints = 0; - }, -}; - -/** - * @type {Record string>} - */ -let KDPerkCount = { - "BerserkerRage": () => { - return " " - + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.25 ? "! " : "") - + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.5 ? "! " : "") - + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.75 ? "! " : ""); - }, - "UnstableMagic": () => { - return " " - + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.25 ? "! " : "") - + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.5 ? "! " : "") - + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.75 ? "! " : ""); - }, - "BoundPower": () => { - return KDBoundPowerLevel > 0 ? Math.round(KDBoundPowerLevel * 100) + "%" : ""; - }, -}; - -/** - * @type {Record} - */ -let KinkyDungeonStatsPresets = { - "MC_Trainee": {category: "Multiclass", id: "MC_Trainee", cost: 2, requireArousal: true, blockclass: ["Trainee"], tags: ["start", "mc"]}, - - - "FutileStruggles": {category: "Restraints", id: "FutileStruggles", cost: -1, block: ["SecondWind"]}, - "SecondWind": {category: "Restraints", id: "SecondWind", cost: 1, block: ["FutileStruggles"]}, - - "Stranger": {startPriority: 1000, category: "Enemies", id: "Stranger", cost: 0, block: ["WrongNeighborhood"], tags: ["start"]}, - "WrongNeighborhood": {startPriority: 1000, category: "Enemies", id: "WrongNeighborhood", cost: -1, block: ["Stranger"], tags: ["start"]}, - - "Strong": {category: "Restraints", id: 0, cost: 2, block: ["Weak"]}, - "Weak": {category: "Restraints", id: 1, cost: -1, block: ["Strong"]}, - "Flexible": {category: "Restraints", id: 2, cost: 2, block: ["Inflexible"]}, - "Inflexible": {category: "Restraints", id: 3, cost: -1, block: ["Flexible"]}, - "Locksmith": {category: "Restraints", id: 4, cost: 2, block: ["Clueless"]}, - "Clueless": {category: "Restraints", id: 5, cost: -1, block: ["Locksmith"]}, - "HighSecurity": {category: "Restraints", id: 48, cost: -1}, - //"SearchParty": {category: "Enemies", id: 51, cost: -1}, - "NoWayOut": {category: "Restraints", id: 52, cost: -1}, - "TightRestraints": {category: "Restraints", id: 54, cost: -1}, - "MagicHands": {category: "Restraints", id: "MagicHands", cost: -1}, - "CursedLocks": {category: "Restraints", id: "CursedLocks", cost: -1}, - "FranticStruggle": {category: "Restraints", id: "FranticStruggle", cost: 1}, - "Unchained": {category: "Kinky", id: 26, cost: 2, block: ["Damsel"]}, - "Damsel": {category: "Kinky", id: 27, cost: -1, block: ["Unchained"]}, - "Artist": {category: "Kinky", id: 28, cost: 2, block: ["Bunny"]}, - "Bunny": {category: "Kinky", id: 29, cost: -1, block: ["Artist"]}, - "Slippery": {category: "Kinky", id: 30, cost: 2, block: ["Doll"]}, - "Doll": {category: "Kinky", id: 31, cost: -1, block: ["Slippery"]}, - "Escapee": {category: "Kinky", id: 32, cost: 2, block: ["Dragon"]}, - "Dragon": {category: "Kinky", id: 33, cost: -1, block: ["Escapee"]}, - "Dodge": {category: "Combat", id: 18, cost: 3, block: ["Distracted"]}, - "Distracted": {category: "Combat", id: 19, cost: -1, block: ["Dodge"]}, - "Submissive": {startPriority: 0, category: "Kinky", id: 10, cost: 0}, - "Wanted": {category: "Kinky", id: 11, cost: -1}, - "QuickDraw": {category: "Combat", id: 55, cost: 1, block: ["Disorganized"]}, - "Disorganized": {category: "Combat", id: 57, cost: -2, block: ["QuickDraw", "QuickScribe"]}, - "Brawler": {category: "Combat", id: 20, cost: 1}, - "Clumsy": {category: "Combat", id: 21, cost: -1}, - "Unfocused": {category: "Combat", id: "Unfocused", cost: -1}, - "HeelWalker": {category: "Combat", id: 53, cost: 1}, - "BondageLover": {category: "Kinky", id: 15, cost: -1}, - "Undeniable": {category: "Kinky", id: "Undeniable", cost: -1}, - "Needs": {category: "Kinky", id: "Needs", cost: -1}, - "BoundPower": {category: "Combat", id: 40, cost: 3}, - "SavourTheTaste": {category: "Combat", id: "SavourTheTaste", cost: -1}, - "ResilientFoes": {category: "Enemies", id: "ResilientFoes", cost: -1}, - "KillSquad": {category: "Enemies", id: 41, cost: -3, block: ["Conspicuous"]}, - "Stealthy": {category: "Enemies", id: 38, cost: 0}, - "Conspicuous": {category: "Enemies", id: 39, cost: -1, block: ["KillSquad"]}, - "Dominant": {category: "Map", id: "Dominant", cost: 2, block: ["Oppression"]}, - "Oppression": {category: "Map", id: 50, cost: -1, block: ["Dominant"]}, - "Supermarket": {category: "Map", id: 42, cost: 1}, - "PriceGouging": {category: "Map", id: 43, cost: -2}, - "Psychic": {category: "Restraints", id: 6, cost: 4}, - "Slayer": {category: "Magic", id: 34, cost: 3}, - //"Narcoleptic": {category: "Combat", id: 37, cost: -4}, - "Magician": {category: "Magic", id: 36, cost: 3}, - "Pristine": {category: "Map", id: 22, cost: -1}, - "Conjurer": {category: "Magic", id: 35, cost: 3}, - "LostTechnology": {category: "Map", id: 23, cost: -1}, - //"Blessed": {category: "Map", id: 8, cost: 1}, - "Cursed": {category: "Enemies", id: 9, cost: -3}, - "Studious": {category: "Magic", id: 12, cost: 1, tags: ["start"]}, - //"Novice": {category: "Magic", id: 7, cost: -1}, - //"Meditation": {category: "Magic", id: 13, cost: 2}, - //"DistractionCast": {category: "Magic", id: "DistractionCast", cost: 2}, - "Clearheaded": {category: "Magic", id: "Clearheaded", cost: 1, block: ["ArousingMagic"]}, - "ArousingMagic": {category: "Magic", id: "ArousingMagic", cost: -1, block: ["Clearheaded"]}, - //"QuickScribe": {category: "Magic", id: 56, cost: 1, block: ["Disorganized"]}, - "BerserkerRage": {category: "Combat", id: "BerserkerRage", cost: 3}, - "UnstableMagic": {category: "Magic", id: "UnstableMagic", cost: 2}, - "Vengeance": {category: "Enemies", id: "Vengeance", cost: -1}, - "AbsoluteFocus": {category: "Magic", id: "AbsoluteFocus", cost: -1}, - - "Hogtied": {startPriority: 50, category: "Start", id: "Hogtied", cost: -1, tags: ["start"]}, - "StartObsidian": {startPriority: 5, category: "Start", id: "StartObsidian", cost: -2, outfit: "Obsidian", tags: ["start"]}, - "StartWolfgirl": {startPriority: 10, category: "Start", id: "StartWolfgirl", cost: -2, outfit: "Wolfgirl", tags: ["start"]}, - "StartMaid": {startPriority: 20, category: "Start", id: "StartMaid", cost: -2, outfit: "Maid", tags: ["start"]}, - "StartLatex": {startPriority: 15, category: "Start", id: "StartLatex", cost: -2, tags: ["start"]}, - - "StartCyberDoll": {startPriority: 7, category: "Boss", id: "StartCyberDoll", cost: -2, locked: true, tags: ["start"]}, - - "DollmakerVisor": {startPriority: 31, category: "Boss", id: "DollmakerVisor", cost: -1, locked: true, tags: ["start"]}, - "FuukaCollar": {startPriority: 40, category: "Boss", buff: true, id: "FuukaCollar", cost: -2, locked: true, tags: ["start"]}, - - - "CommonCyber": {category: "Boss", id: "CommonCyber", cost: -1, locked: true}, - "CommonFuuka": {category: "Boss", id: "CommonFuuka", buff: true, cost: -1, locked: true}, - - "Nowhere": {category: "Enemies", id: "Nowhere", cost: -1}, - "Prisoner": {category: "Start", id: "Prisoner", cost: 0}, - - "Panic": {category: "Map", id: "Panic", cost: -1}, - - "Rusted": {category: "Map", id: "Rusted", cost: 1}, - "Forgetful": {category: "Map", id: "Forgetful", cost: -1, block: ["TotalBlackout"]}, - "Unmasked": {category: "Toggles", id: "Unmasked", cost: 0, tags: ["start"]}, - "NoNurse": {category: "Toggles", id: "NoNurse", cost: 0, tags: ["start"]}, - "NoBrats": {category: "Toggles", id: "NoBrats", cost: 0, tags: ["start"], debuff: true, block: ["OnlyBrats"]}, - "OnlyBrats": {category: "Toggles", id: "OnlyBrats", cost: 0, tags: ["start"], debuff: true, block: ["NoBrats"]}, - "TapePref": {category: "Toggles", id: "TapePref", cost: 0, tags: ["start"], block: ["TapeOptout"]}, - "TapeOptout": {category: "Toggles", id: "TapeOptout", cost: 0, tags: ["start"], debuff: true, block: ["TapePref"]}, - "NoDoll": {category: "Toggles", id: "NoDoll", cost: 0, tags: ["start"], debuff: true}, - - "Quickness": {category: "Combat", id: "Quickness", cost: 2}, - - "BoundCrusader": {category: "Kinky", id: "BoundCrusader", cost: -1}, - - "Trespasser": {category: "Map", id: "Trespasser", cost: -2}, - - - "Butterfingers": {category: "Restraints", id: "Butterfingers", cost: -1}, - "WeakGrip": {category: "Restraints", id: "WeakGrip", cost: -1}, - "Blackout": {category: "Combat", id: "Blackout", cost: -1, block: ["TotalBlackout"]}, - "TotalBlackout": {category: "Combat", id: "TotalBlackout", cost: -2, block: ["Blackout", "Forgetful"]}, - "Incantation": {category: "Magic", id: "Incantation", cost: -1}, - - - "Stoic": {category: "Damage", id: "Stoic", cost: 1, block: ["Ticklish"]}, - "Ticklish": {category: "Damage", id: "Ticklish", cost: -1, block: ["Stoic"]}, - "Unperturbed": {category: "Damage", id: "Unperturbed", cost: 1, block: ["Lascivious"]}, - "Lascivious": {category: "Damage", id: "Lascivious", cost: -1, block: ["Unperturbed"]}, - "Masochist": {category: "Damage", id: "Masochist", cost: -1}, - "PainTolerance": {category: "Damage", id: "PainTolerance", cost: 1}, - - "Rigger": {category: "Damage", id: 24, cost: 2}, - "Pacifist": {category: "Damage", id: 25, cost: -2}, - "BurningDesire": {category: "Damage", id: "BurningDesire", cost: 1}, - "FrigidPersonality": {category: "Damage", id: "FrigidPersonality", cost: 2}, - "GroundedInReality": {category: "Damage", id: "GroundedInReality", cost: 2}, - "LikeTheWind": {category: "Damage", id: "LikeTheWind", cost: 1}, - "ImmovableObject": {category: "Damage", id: "ImmovableObject", cost: 2}, - "LeastResistance": {category: "Damage", id: "LeastResistance", cost: 1}, - - "Sticky": {category: "Damage", id: "Sticky", cost: -1}, - "Breathless": {category: "Damage", id: "Breathless", cost: -1}, - - "CommonMaid": {category: "Enemies", id: "CommonMaid", cost: -1, costGroup: "common"}, - "CommonLatex": {category: "Enemies", id: "CommonLatex", cost: -1, costGroup: "common"}, - "CommonLeather": {category: "Enemies", id: "CommonLeather", cost: -1, costGroup: "common"}, - "CommonExp": {category: "Enemies", id: "CommonExp", cost: -1, costGroup: "common"}, - "CommonDress": {category: "Enemies", id: "CommonDress", cost: -1, costGroup: "common"}, - "CommonWolf": {category: "Enemies", id: "CommonWolf", cost: -1, costGroup: "common"}, - "CommonKitty": {category: "Enemies", id: "CommonKitty", cost: -1, costGroup: "common"}, - - "KeepOutfit": {category: "Kinky", id: "KeepOutfit", cost: 0}, - - "KinkyPrison": {category: "Map", id: "KinkyPrison", cost: -1}, - "Doorknobs": {category: "Map", id: "Doorknobs", cost: -1}, - - - "MapLarge": {category: "Map", id: "MapLarge", cost: 0, tags: ["start", "mapsize"], blocktags: ["mapsize"]}, - "MapHuge": {category: "Map", id: "MapHuge", cost: 0, tags: ["start", "mapsize"], blocktags: ["mapsize"]}, - "MapGigantic": {category: "Map", id: "MapGigantic", cost: 0, tags: ["start", "mapsize"], blocktags: ["mapsize"]}, -}; - - - -function KDGetPerkCost(perk) { - if (!perk) return 0; - if (!perk.costGroup) return perk.cost; - let costGroups = {}; - let first = false; - // Only the first one has a cost - for (let p of KinkyDungeonStatsChoice.keys()) { - if (KinkyDungeonStatsPresets[p] && KinkyDungeonStatsPresets[p].costGroup) { - if (!first) { - first = true; - if (KinkyDungeonStatsPresets[p].id == perk.id) { - return KinkyDungeonStatsPresets[p].cost; - } - } - costGroups[KinkyDungeonStatsPresets[p].costGroup] = KinkyDungeonStatsPresets[p].cost; - } - } - if (costGroups[perk.costGroup] != undefined && perk.cost >= costGroups[perk.costGroup]) return 0; - else return perk.cost; -} - -function KinkyDungeonGetStatPoints(Stats) { - let total = 0; - for (let k of Stats.keys()) { - if (Stats.get(k)) { - if (KinkyDungeonStatsPresets[k]) { - total -= KDGetPerkCost(KinkyDungeonStatsPresets[k]); - } - } - } - return total; -} -/** - * Determine if a perk can be picked with a certain number of points remaining - * @param {string} Stat - * @param {number} [points] - * @returns {boolean} - */ -function KinkyDungeonCanPickStat(Stat, points) { - let stat = KinkyDungeonStatsPresets[Stat]; - if (!stat) return false; - if (KDGetPerkCost(stat) > 0 && (points != undefined ? points : KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice)) < KDGetPerkCost(stat)) return false; - if (!KDValidatePerk(stat)) return false; - for (let k of KinkyDungeonStatsChoice.keys()) { - if (KinkyDungeonStatsChoice.get(k)) { - if (KinkyDungeonStatsPresets[k] && KinkyDungeonStatsPresets[k].block && KinkyDungeonStatsPresets[k].block.includes(Stat)) { - return false; - } - if (KinkyDungeonStatsPresets[k] && stat.tags && KinkyDungeonStatsPresets[k].blocktags) { - for (let t of KinkyDungeonStatsPresets[k].blocktags) - if (stat.tags.includes(t)) return false; - } - } - } - return true; -} - -/** - * General validation for a perk - * @param {KDPerk} stat - * @returns {boolean} - */ -function KDValidatePerk(stat) { - if (stat.requireArousal && !KinkyDungeonStatsChoice.get("arousalMode")) return false; - if (stat.blockclass) { - for (let t of stat.blockclass) - if (KinkyDungeonClassMode == t) return false; - } - return true; -} - -/** - * @param {string} perk1 - * @param {string} perk2 - * @returns {boolean} - * Determines if perk1 is blocked by another perk or in general */ -function KDPerkBlocked(perk1, perk2) { - if (KinkyDungeonStatsPresets[perk2] && KinkyDungeonStatsPresets[perk1]) { - if (!KDValidatePerk(KinkyDungeonStatsPresets[perk1])) return false; - if (KinkyDungeonStatsPresets[perk2].block && KinkyDungeonStatsPresets[perk2].block.includes(perk1)) { - return true; - } - if (KinkyDungeonStatsPresets[perk2] && KinkyDungeonStatsPresets[perk1].tags && KinkyDungeonStatsPresets[perk2].blocktags) { - for (let t of KinkyDungeonStatsPresets[perk2].blocktags) - if (KinkyDungeonStatsPresets[perk1].tags.includes(t)) return true; - } - } - return false; -} - -function KinkyDungeonCanUnPickStat(Stat) { - let stat = KinkyDungeonStatsPresets[Stat]; - if (!stat) return false; - if (KDGetPerkCost(stat) < 0 && KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice) < -KDGetPerkCost(stat)) return false; - for (let k of KinkyDungeonStatsChoice.keys()) { - if (KinkyDungeonStatsChoice.get(k)) { - if (KinkyDungeonStatsPresets[k] && KinkyDungeonStatsPresets[k].require == Stat) { - return false; - } - } - } - return true; -} - - -let KDPerkStart = { - Studious: () => { - KinkyDungeonSpellPoints += 3; - }, - - Submissive: () => { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BasicCollar"), 0, true, "Red", false, undefined, undefined, undefined, true); - }, - Pacifist: () =>{ - KinkyDungeonInventoryAddWeapon("Rope"); - }, - Rigger: () =>{ - KinkyDungeonInventoryAddWeapon("Rope"); - KinkyDungeonInventoryAddWeapon("Scissors"); - }, - Unchained: () =>{ - KinkyDungeonRedKeys += 1; - }, - - FuukaCollar: () =>{ - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true, undefined, false, undefined, undefined, undefined, true); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoDress"), 0, true, undefined, false, undefined, undefined, undefined, true); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoGag"), 0, true, undefined, false, undefined, undefined, undefined, true); - }, - Prisoner: () =>{ - KDGameData.PrisonerState = 'parole'; - }, - Slayer: () =>{ - KinkyDungeonSpells.push(KinkyDungeonFindSpell("Firebolt")); - KinkyDungeonSpellChoices[0] = KinkyDungeonSpells.length - 1; - }, - Conjurer: () =>{ - KinkyDungeonSpells.push(KinkyDungeonFindSpell("ChainBolt")); - KinkyDungeonSpellChoices[0] = KinkyDungeonSpells.length - 1; - }, - Magician: () =>{ - KinkyDungeonSpells.push(KinkyDungeonFindSpell("Dagger")); - KinkyDungeonSpellChoices[0] = KinkyDungeonSpells.length - 1; - }, - Brawler: () =>{ - KinkyDungeonInventoryAddWeapon("Knife"); - KDSetWeapon("Knife"); - KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); - }, - StartLatex: () =>{ - KinkyDungeonChangeRep("Latex", 10); - KinkyDungeonAddRestraintIfWeaker("LatexCatsuit", 5, true, "Red", false, undefined, undefined, "Jail", true); - for (let i = 0; i < 30; i++) { - let r = KinkyDungeonGetRestraint({tags: ["latexRestraints", "latexStart", "latexCollar", "latexRestraintsForced"]}, 12, "grv", true, "Red"); - if (r) - KinkyDungeonAddRestraintIfWeaker(r, 0, true, r.Group == "ItemNeck" ? "Blue" : "Purple", undefined, undefined, undefined, "Jail", true); - } - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("KiguMask"), 0, true, "Purple"); - }, - DollmakerVisor: () =>{ - KinkyDungeonAddRestraintIfWeaker("DollmakerVisor", 5, true, "Gold", false, undefined, undefined, undefined, true); - }, - StartCyberDoll: () =>{ - KinkyDungeonChangeRep("Metal", 10); - KinkyDungeonAddRestraintIfWeaker("ControlHarness", 5, true, "Blue", false, undefined, undefined, undefined, true); - KinkyDungeonAddRestraintIfWeaker("TrackingCollar", 5, true, "Blue", false, undefined, undefined, undefined, true); - - - KinkyDungeonAddRestraintIfWeaker("CyberBelt", 5, true, "Blue", false, undefined, undefined, undefined, true); - KinkyDungeonAddRestraintIfWeaker("CyberBra", 5, true, "Blue", false, undefined, undefined, undefined, true); - - KinkyDungeonAddRestraintIfWeaker("CyberHeels", 5, true, "Blue", false, undefined, undefined, undefined, true); - //KinkyDungeonAddRestraintIfWeaker("CyberBallGag", 5, true, "Red", false, undefined, undefined, undefined, true); - KinkyDungeonAddRestraintIfWeaker("CyberPlugGag", 5, true, "Red", false, undefined, undefined, undefined, true); - KinkyDungeonAddRestraintIfWeaker("CyberMuzzle", 5, true, "Red", false, undefined, undefined, undefined, true); - //KinkyDungeonAddRestraintIfWeaker("DollmakerVisor", 5, true, "Gold", false, undefined, undefined, undefined, true); - - - - KinkyDungeonAddRestraintIfWeaker("CyberArmCuffs", 5, true, "Blue", false, undefined, undefined, undefined, true); - KinkyDungeonAddRestraintIfWeaker("CyberLegCuffs", 5, true, "Blue", false, undefined, undefined, undefined, true); - KinkyDungeonAddRestraintIfWeaker("CyberAnkleCuffs", 5, true, "Blue", false, undefined, undefined, undefined, true); - - //KinkyDungeonAddRestraintIfWeaker("CyberDollJacket", 5, true, "Red", false, undefined, undefined, undefined, true); - - KinkyDungeonSetDress("CyberDoll", "CyberDoll"); - }, - StartMaid: () =>{ - KDChangeFactionRelation("Player", "Maidforce", 0.2 - KDFactionRelation("Player", "Maidforce"), true); - for (let i = 0; i < 30; i++) { - let r = KinkyDungeonGetRestraint({tags: ["maidRestraints", "maidVibeRestraints", "noMaidJacket", "handcuffer"]}, 12, "grv", true, "Purple"); - if (r) - KinkyDungeonAddRestraintIfWeaker(r, 0, true, r.Group == "ItemNeck" ? "Blue" : "Purple", undefined, undefined, undefined, undefined, true); - } - let outfit = {name: "Maid", id: KinkyDungeonGetItemID(), type: Outfit}; - if (!KinkyDungeonInventoryGet("Maid")) KinkyDungeonInventoryAdd(outfit); - if (KinkyDungeonInventoryGet("Default")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Default")); - KinkyDungeonSetDress("Maid", "Maid"); - }, - StartWolfgirl: () =>{ - KDChangeFactionRelation("Player", "Nevermere", 0.2 - KDFactionRelation("Player", "Nevermere"), true); - for (let i = 0; i < 30; i++) { - let r = KinkyDungeonGetRestraint({tags: (i < (KinkyDungeonStatsChoice.has("NoWayOut") ? 3 : 1) ? ["wolfCuffs"] : ["wolfGear", "wolfRestraints"])}, 12, "grv", true, "Red"); - if (r) { - KinkyDungeonAddRestraintIfWeaker(r, 0, true, r.Group == "ItemNeck" ? "Blue" : "Red", undefined, undefined, undefined, undefined, true); - if (r.Link) { - let newRestraint = KinkyDungeonGetRestraintByName(r.Link); - KinkyDungeonAddRestraintIfWeaker(newRestraint, 0, true, "Red", undefined, undefined, undefined, undefined, true); - } - } - } - KDAddQuest("WolfgirlHunters"); - let outfit = {name: "Wolfgirl", id: KinkyDungeonGetItemID(), type: Outfit}; - if (!KinkyDungeonInventoryGet("Wolfgirl")) KinkyDungeonInventoryAdd(outfit); - if (KinkyDungeonInventoryGet("Default")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Default")); - KinkyDungeonSetDress("Wolfgirl", "Wolfgirl"); - }, - StartObsidian: () =>{ - KDChangeFactionRelation("Player", "Elemental", 0.2 - KDFactionRelation("Player", "Elemental"), true); - for (let i = 0; i < 30; i++) { - let r = KinkyDungeonGetRestraint({tags: ["obsidianRestraints", "ornateChastity", "genericToys"]}, 12, "grv", true, "Red"); - if (r) { - KinkyDungeonAddRestraintIfWeaker(r, 0, true, r.Group == "ItemNeck" ? "Blue" : "Purple", false, undefined, undefined, undefined, true); - let item = r; - for (let j = 0; j < 2; j++) { - if (item && item.Link) { - let newRestraint = KinkyDungeonGetRestraintByName(item.Link); - KinkyDungeonAddRestraintIfWeaker(newRestraint, 0, true, "Purple", undefined, undefined, undefined, undefined, true); - item = newRestraint; - } - } - } - } - let outfit = {name: "Obsidian", id: KinkyDungeonGetItemID(), type: Outfit}; - if (!KinkyDungeonInventoryGet("Obsidian")) KinkyDungeonInventoryAdd(outfit); - if (KinkyDungeonInventoryGet("Default")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Default")); - KinkyDungeonSetDress("Obsidian", "Obsidian"); - }, - Hogtied: () =>{ - for (let i = 0; i < 30; i++) { - let r = KinkyDungeonGetRestraint({tags: ["ropeRestraints", "ropeRestraints2", "ropeRestraintsHogtie", "ropeRestraintsWrist", "tapeRestraints", "genericToys"]}, 24, "grv", true, undefined); - if (r) { - KinkyDungeonAddRestraintIfWeaker(r, 8, true, undefined, false, undefined, undefined, undefined, true); - let item = r; - for (let j = 0; j < 2; j++) { - if (item && item.Link) { - let newRestraint = KinkyDungeonGetRestraintByName(item.Link); - KinkyDungeonAddRestraintIfWeaker(newRestraint, 8, true, undefined, undefined, undefined, undefined, undefined, true); - item = newRestraint; - } - } - } - } - KinkyDungeonAddRestraintIfWeaker("TrapMittens", 5, true, undefined, false, undefined, undefined, undefined, true); - KinkyDungeonAddRestraintIfWeaker("Stuffing", 5, true, undefined, false, undefined, undefined, undefined, true); - KinkyDungeonAddRestraintIfWeaker("PanelGag", 5, true, undefined, false, undefined, undefined, undefined, true); - KinkyDungeonAddRestraintIfWeaker("TrapBlindfold", 5, true, undefined, false, undefined, undefined, undefined, true); - - if (KinkyDungeonInventoryGet("Knife")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Knife")); - if (KinkyDungeonInventoryGet("Dirk")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Dirk")); - }, - Stranger: () => { - for (let key of Object.keys(KinkyDungeonFactionTag)) { - KDSetFactionRelation("Player", key, -1 + 0.45 * KDRandom() + 0.45 * KDRandom() + 0.45 * KDRandom()); - } - }, - WrongNeighborhood: () => { - for (let key of Object.keys(KinkyDungeonFactionTag)) { - KDSetFactionRelation("Player", key, -1); - for (let key2 of Object.keys(KinkyDungeonFactionTag)) { - KDSetFactionRelation(key, key2, 0.5); - } - } - }, - Cursed: () => { - KinkyDungeonChangeFactionRep("Angel", -100); - }, - MC_Trainee: () => { - KinkyDungeonSpells.push(KinkyDungeonFindSpell("DistractionCast")); - }, -}; - - -let KDPerksFilter = ""; - -let KDPerksButtonWidth = 298; -let KDPerksButtonWidthPad = 2; -let KDPerksButtonHeight = 44; -let KDPerksButtonHeightPad = 2; -let KDPerksXPad = 50; -let KDPerksYPad = 50; -let KDPerksYStart = 220; -let KDPerksXStart = 50; -let KDPerksMaxY = 900; -let KDPerksScroll = KDPerksButtonWidth * 2 + KDPerksButtonWidthPad * 2 + KDPerksXPad; -let KDPerksIndex = 0; -let KDPerksIndexUI = 0; -let KDPerksIndexUIWeight = 4; - -let KDCategories = [ - -]; -function KinkyDungeonDrawPerks(NonSelectable) { - let fadeColor = NonSelectable ? "#808080" : "#999999"; - let X = Math.round(KDPerksXStart - KDPerksScroll * KDPerksIndexUI); - let Y = KDPerksYStart; - let Y_alt = KDPerksYStart; - if (CommonIsMobile) KDPerksIndexUIWeight = 1; - KDPerksIndexUI = (KDPerksIndex + (KDPerksIndexUIWeight - 1) * KDPerksIndexUI) / KDPerksIndexUIWeight; - - MainCanvas.beginPath(); - MainCanvas.lineWidth = 3; - MainCanvas.strokeStyle = KDBorderColor; - MainCanvas.moveTo(50, 120); - MainCanvas.lineTo(1950, 120); - MainCanvas.stroke(); - MainCanvas.closePath(); - - let tooltip = false; - let catsdrawn = 0; - let catsdrawnStrict = 0; - - function inView() { - return X > -2 * KDPerksButtonWidth - KDPerksButtonWidthPad && X < 2000 - KDPerksButtonWidth; - } - function inViewStrict() { - return X > 0 && X < 2000 - KDPerksButtonWidth; - } - - let indexX = 0; - let indexList = {}; - - let firstDrawn = ""; - - let filled_x = { - - }; - for (let c of KDCategories) { - Y = Math.max(Y, Y_alt); - let height = KDPerksYPad + KDPerksButtonHeight*Math.max(c.buffs.length, c.debuffs.length); - if (Y + height > KDPerksMaxY) { - X += (KDPerksButtonWidth + KDPerksButtonWidthPad)*2 + KDPerksXPad; - indexX += 1; - Y = KDPerksYStart; - } - - Y += KDPerksYPad; - Y_alt = Y; - //MainCanvas.textAlign = "left"; - DrawTextFitKD(TextGet("KDCategory" + c.name), X + KDPerksButtonWidth + KDPerksButtonWidthPad/2, Y - KDPerksButtonHeight/2 - 5, KDPerksButtonWidth*2, "#ffffff"); - //MainCanvas.textAlign = "center"; - if (inView()) { - catsdrawn += 1; - } - if (inViewStrict()) { - catsdrawnStrict += 1; - if (!firstDrawn) firstDrawn = c.name; - } - for (let stat of c.buffs.concat(c.debuffs)) { - if ((!stat[1].locked || KDUnlockedPerks.includes(stat[0])) - && (NonSelectable|| !KDPerksFilter || TextGet("KinkyDungeonStat" + ("" + stat[1].id)).toLocaleLowerCase().includes(KDPerksFilter.toLocaleLowerCase()))) { - let YY = (!stat[1].buff && (stat[1].cost < 0 || stat[1].debuff)) ? Y_alt : Y; - let XX = (!stat[1].buff && (stat[1].cost < 0 || stat[1].debuff)) ? X + KDPerksButtonWidth + KDPerksButtonWidthPad : X; - - if (inView()) { - let colorAvailable = NonSelectable ? - fadeColor : - KDGetPerkCost(stat[1]) > 0 ? - "#aaaacc" : - KDGetPerkCost(stat[1]) < 0 ? - "#ccaaaa" : - "#aaaacc"; - let colorSelected = KDGetPerkCost(stat[1]) > 0 ? "#eeeeff" : KDGetPerkCost(stat[1]) < 0 ? "#ffeeee" : "#eeeeff"; - let colorExpensive = KDGetPerkCost(stat[1]) > 0 ? "#555588" : KDGetPerkCost(stat[1]) < 0 ? "#885555" : "#555588"; - - DrawButtonKDEx(stat[0], (bdata) => { - if (!KinkyDungeonStatsChoice.get(stat[0]) && KinkyDungeonCanPickStat(stat[0])) { - KinkyDungeonStatsChoice.set(stat[0], true); - localStorage.setItem('KinkyDungeonStatsChoice' + KinkyDungeonPerksConfig, JSON.stringify(Array.from(KinkyDungeonStatsChoice.keys()))); - } else if (KinkyDungeonStatsChoice.get(stat[0])) { - KinkyDungeonStatsChoice.delete(stat[0]); - localStorage.setItem('KinkyDungeonStatsChoice' + KinkyDungeonPerksConfig, JSON.stringify(Array.from(KinkyDungeonStatsChoice.keys()))); - } - return true; - }, !NonSelectable && (KinkyDungeonState == "Stats" || (KinkyDungeonDrawState == "Perks2" && KDDebugPerks)), XX, YY, KDPerksButtonWidth, KDPerksButtonHeight, TextGet("KinkyDungeonStat" + (stat[1].id)) + ` (${KDGetPerkCost(stat[1])})`, - (!KinkyDungeonStatsChoice.get(stat[0]) && KinkyDungeonCanPickStat(stat[0])) ? colorAvailable : (KinkyDungeonStatsChoice.get(stat[0]) ? colorSelected : (NonSelectable ? colorAvailable : colorExpensive)), - KinkyDungeonStatsChoice.get(stat[0]) ? (KinkyDungeonRootDirectory + "UI/TickPerk.png") : "", undefined, false, true, - KinkyDungeonStatsChoice.get(stat[0]) ? "rgba(140, 140, 140, 0.5)" : KDButtonColor, undefined, undefined, { - noTextBG: true - }); - if (MouseIn(XX, YY, KDPerksButtonWidth, KDPerksButtonHeight)) { - DrawTextFitKD(TextGet("KinkyDungeonStatDesc" + (stat[1].id)), 1000, 150, 1500, KDTextWhite, KDTextGray1); - DrawTextFitKD(TextGet("KinkyDungeonStatCost").replace("AMOUNT", KDGetPerkCost(stat[1]) + ""), 1000, 190, 1400, KDTextWhite, KDTextGray1); - tooltip = true; - } - } - if (!filled_x[X]) { - FillRectKD(kdcanvas, kdpixisprites, c.name, { - Left: X - KDPerksButtonWidthPad, - Top: KDPerksYStart, - Width: 2 * KDPerksButtonWidth + 3 * KDPerksButtonWidthPad, - Height: KDPerksMaxY - KDPerksYStart, - Color: KDTextGray0, - LineWidth: 1, - zIndex: 60, - alpha: 0.4, - }); - filled_x[X] = X; - } - if (!stat[1].buff && (stat[1].cost < 0 || stat[1].debuff)) Y_alt += KDPerksButtonHeight + KDPerksButtonHeightPad; - else Y += KDPerksButtonHeight + KDPerksButtonHeightPad; - } - } - indexList[c.name] = indexX; - } - - - DrawButtonKDEx("perks>", (bdata) => { - // @ts-ignore - if (catsdrawn > 2 && !(document.activeElement?.id == 'PerksFilter')) { - KDPerksIndex += 1; - } - return true; - }, true, 1750, 50, 100, 50, ">>", KDTextWhite); - - DrawButtonKDEx("perks<", (bdata) => { - // @ts-ignore - if (KDPerksIndex > 0 && !(document.activeElement?.id == 'PerksFilter')) { - KDPerksIndex -= 1; - } - return true; - }, true, 150, 50, 100, 50, "<<", KDTextWhite); - - let procList = KDCategoriesStart.map((e) => {return e.name;}); - let adjLists = GetAdjacentList(procList, procList.indexOf(firstDrawn), catsdrawnStrict); - let left = adjLists.left; - let right = adjLists.right; - - drawVertList(left.reverse(), 380, 85, 250, 25, 4, 18, (data) => { - return (bdata) => { - KDPerksIndex = indexList[data.name]; - return true; - }; - }, "KDCategory"); - drawVertList(right, 1620, 85, 250, 25, 4, 18, (data) => { - return (bdata) => { - KDPerksIndex = Math.max(0, indexList[data.name] - 2); - return true; - }; - }, "KDCategory"); - - if (catsdrawn < 3 && KDPerksIndex > 0) KDPerksIndex -= 1; - - return tooltip; -} - -/** - * - * @param {any[]} list - * @param {number} x - * @param {number} y - * @param {number} w - * @param {number} h - * @param {number} max - * @param {number} fontSize - * @param {(any) => ((any) => boolean)} clickfnc - * @param {string} prefix - */ -function drawVertList(list, x, y, w, h, max, fontSize, clickfnc, prefix) { - for (let i = 0; i < list.length && i < max; i++) { - let name = list[i]; - DrawButtonKDEx(name + x + "," + y, clickfnc({name: name}), true, x - w/2, y - (h+1) * i, w, h, TextGet(prefix + name), KDTextWhite, undefined, undefined, undefined, true, undefined, fontSize); - } -} - -/** - * - * @param {Record} existing - * @returns {string[]} - */ -function KDGetRandomPerks(existing) { - let poscandidates = []; - let singlepointcandidates = []; - let negcandidates = []; - for (let p of Object.entries(KinkyDungeonStatsPresets)) { - if (!existing[p[0]] && !KinkyDungeonStatsChoice.get(p[0]) && KinkyDungeonCanPickStat(p[0], 999)) { // No dupes - if ((!p[1].tags || !p[1].tags.includes("start"))) { - if (!p[1].locked || KDUnlockedPerks.includes(p[0])) { - if (KDGetPerkCost(p[1]) > 0) { - poscandidates.push(p); - if (KDGetPerkCost(p[1]) == 1) - singlepointcandidates.push(p); - } else if (KDGetPerkCost(p[1]) < 0) { - negcandidates.push(p); - } - } - } - } - } - - let poscandidate = poscandidates[Math.floor(poscandidates.length * KDRandom())]; - if (!poscandidate) return []; - - let netcost = KDGetPerkCost(poscandidate[1]); - let perks = [poscandidate[0]]; - if (KDGetPerkCost(poscandidate[1]) > 1) { - negcandidates = negcandidates.filter((p) => { - return (KinkyDungeonCanPickStat(p[0], 999)) - && !KDPerkBlocked(p[0], poscandidate[0]) - && (-KDGetPerkCost(p[1])) >= (KDGetPerkCost(poscandidate[1]) - 1); - }); - let negperk = null; - if (negcandidates.length > 0) { - negperk = negcandidates[Math.floor(negcandidates.length * KDRandom())]; - perks.push(negperk[0]); - netcost += KDGetPerkCost(negperk[1]); - } - - if (netcost < 0 && negperk) { - singlepointcandidates = negcandidates.filter((p) => { - return (KinkyDungeonCanPickStat(p[0], 999) - && p[0] != poscandidate[0] - && p[0] != negperk[0] - && !KDPerkBlocked(p[0], poscandidate[0]) - && !KDPerkBlocked(p[0], negperk[0])); - }); - let newperk = singlepointcandidates[Math.floor(singlepointcandidates.length * KDRandom())]; - perks = [perks[0], newperk[0], perks[1]]; - } - } - return perks; -} diff --git a/Game/KinkyDungeonPersonality.js b/Game/KinkyDungeonPersonality.js deleted file mode 100644 index 9cf547e11..000000000 --- a/Game/KinkyDungeonPersonality.js +++ /dev/null @@ -1,112 +0,0 @@ -"use strict"; - -let KDJailPersonalities = { - "Robot": true, - "Dom": true, - "Sub": true, -}; - -let KDStrictPersonalities = [ - "Dom", -]; -let KDLoosePersonalities = [ - "Sub", -]; - -let KDEnemyPersonalities = { - "": {weight: 10, - loose: false, - strict: false, - brat: false, - domVariance: 0.4, - tags: { - "robot": -100, - }, - }, - "Robot": {weight: -100, - loose: false, - strict: false, - brat: false, - tags: { - "robot": 200, - }, - }, - "Dom": {weight: 1, - loose: false, - strict: true, - brat: false, - tags: { - "minor": -3, - "alchemist": 2, - "elite": 3, - "boss": 3, - "robot": -100, - }, - }, - "Sub": {weight: 0, - loose: true, - strict: false, - brat: false, - tags: { - "minor": 3, - "human": 1, - "elite": -2, - "boss": -10, - "robot": -100, - }, - }, - "Brat": {weight: 0, - loose: true, - strict: false, - brat: true, - domMod: 0.7, - tags: { - "minor": 3, - "human": 1, - "boss": -3, - "robot": -100, - }, - }, -}; - -/** - * - * @param {entity} enemy - * @returns {string} - */ -function KDGetPersonality(enemy) { - let WeightTotal = 0; - let Weights = []; - - for (let p of Object.entries(KDEnemyPersonalities)) { - let weight = p[1].weight; - Weights.push({p: p[0], weight: WeightTotal}); - if (p[1].tags) - for (let tag of Object.entries(p[1].tags)) { - if (enemy.Enemy.tags[tag[0]]) weight += tag[1]; - } - WeightTotal += Math.max(weight, 0); - } - - let selection = KDRandom() * WeightTotal; - - for (let L = Weights.length - 1; L >= 0; L--) { - if (selection > Weights[L].weight) { - if (Weights[L].p != undefined) { - return Weights[L].p; - } - return ""; - } - } - - return ""; -} - -/** - * - * @param {entity} enemy - * @returns {string} - */ -function KDJailPersonality(enemy) { - return (enemy.personality && KDJailPersonalities[enemy.personality]) ? enemy.personality : ""; -} \ No newline at end of file diff --git a/Game/KinkyDungeonPlayerEffects.js b/Game/KinkyDungeonPlayerEffects.js deleted file mode 100644 index 980b55574..000000000 --- a/Game/KinkyDungeonPlayerEffects.js +++ /dev/null @@ -1,863 +0,0 @@ -'use strict'; - -/** - * @type {Record {sfx: string, effect: boolean}>} - */ -let KDPlayerEffects = { - "EnvDamage": (target, damage, playerEffect, spell, faction, bullet) => { - let dmg = KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - KinkyDungeonSendTextMessage(Math.min(playerEffect.power, 5), TextGet("KinkyDungeonDamageSelf").replace("DamageDealt", dmg.string), "#ff0000", 1); - if (dmg.happened) return {sfx: undefined, effect: true}; return {sfx: undefined, effect: false}; - }, - "MaidChastity": (target, damage, playerEffect, spell, faction, bullet) => { - if (KinkyDungeonFlags.get("ChastityBelts")) { - // Tease the player - /*if (KinkyDungeonFlags.get("Vibes")) { - let dmg = KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - KinkyDungeonSendTextMessage(Math.min(playerEffect.power, 5), TextGet("KDMaidforceHeadVibe").replace("DamageDealt", dmg.string), "#ff9999", 1); - if (dmg.happened) return {sfx: "Vibe", effect: true}; return {sfx: undefined, effect: false}; - }*/ - } else { - let restrained = false; - for (let i = 0; i < 4; i++) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["maidVibeRestraints"]}, MiniGameKinkyDungeonLevel + (playerEffect.level || 0), KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, playerEffect.tightness || 0, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "maidhead"); - restrained = true; - } - } - if (restrained) - KinkyDungeonSendTextMessage(8, TextGet("KDMaidforceHeadBelting"), "#ff5555", 2, false, true); - - return {sfx: "LockHeavy", effect: restrained}; - } - return {sfx: undefined, effect: false}; - }, - "ShadowBolt": (target, damage, playerEffect, spell, faction, bullet) => { - KDPlayerEffectRestrain(spell, playerEffect.count, ["shadowHands"], "Ghost"); - - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonShadowBolt"), "yellow", playerEffect.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - return {sfx: "Evil", effect: true}; - }, - "BearTrapStun": (target, damage, playerEffect, spell, faction, bullet) => { - KDStunTurns(playerEffect.time); - KinkyDungeonSendTextMessage(4, TextGet("KDBearTrapHit"), "yellow", playerEffect.time+1); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - return {sfx: "Clang", effect: true}; - }, - "RubberBolt": (target, damage, playerEffect, spell, faction, bullet) => { - KDPlayerEffectRestrain(spell, playerEffect.count, ["redLatexBasic"], "Dollsmith"); - - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRubberBolt"), "yellow", 1); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - return {sfx: "Dollify", effect: true}; - }, - "EncaseBolt": (target, damage, playerEffect, spell, faction, bullet) => { - KDPlayerEffectRestrain(spell, playerEffect.count, ["latexEncaseRandom"], "Dollsmith"); - - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonEncaseBolt"), "yellow", 1); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - return {sfx: "Dollify", effect: true}; - }, - "EncaseBoltDrone": (target, damage, playerEffect, spell, faction, bullet) => { - if (KinkyDungeonMovePoints >= 0) { - KinkyDungeonMovePoints = -1; - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonEncaseBoltDroneSlow"), "yellow", 1); - } else { - KDPlayerEffectRestrain(spell, playerEffect.count, ["latexEncaseRandom"], "Dollsmith"); - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonEncaseBoltDrone"), "yellow", 1); - } - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - return {sfx: "Dollify", effect: true}; - }, - "RubberMissile": (target, damage, playerEffect, spell, faction, bullet) => { - KDPlayerEffectRestrain(spell, playerEffect.count, ["latexEncaseRandom"], "Dollsmith"); - - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRubberMissile"), "yellow", 1); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - return {sfx: "Lightning", effect: true}; - }, - "ObsidianBolt": (target, damage, playerEffect, spell, faction, bullet) => { - KDPlayerEffectRestrain(spell, playerEffect.count, ["obsidianRestraints"], "Elemental"); - - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonObsidianBolt"), "yellow", playerEffect.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - return {sfx: "Evil", effect: true}; - }, - "CelestialBolt": (target, damage, playerEffect, spell, faction, bullet) => { - KDPlayerEffectRestrain(spell, playerEffect.count, ["celestialRopes"], "Angel"); - - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonCelestialBolt"), "yellow", playerEffect.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - return {sfx: "Evil", effect: true}; - }, - "BoundByFate": (target, damage, playerEffect, spell, faction, bullet) => { - KDCreateAoEEffectTiles( - bullet.x, - bullet.y, - { - name: "FateBoundGround", - duration: playerEffect.time + 1, - }, 0, 2.5, undefined, undefined, undefined); - - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonBoundByFate"), "yellow", playerEffect.time); - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, KDBoundByFate, { - duration: playerEffect.time, - }); - - return {sfx: "Evil", effect: true}; - }, - "StarBondage": (target, damage, playerEffect, spell, faction, bullet) => { - KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonStarBondage"), "#ff5555", 4); - KDPlayerEffectRestrain(spell, playerEffect.count, [playerEffect.kind], "Demon"); - - return {sfx: "Evil", effect: true}; - }, - "MoonBondage": (target, damage, playerEffect, spell, faction, bullet) => { - let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonMoonBondage").replace("DamageTaken", dmg.string), "#ff5555", 1); - KDPlayerEffectRestrain(spell, playerEffect.count, [playerEffect.kind], "Demon"); - return {sfx: "Evil", effect: true}; - }, - "SarcoEngulf": (target, damage, playerEffect, spell, faction, bullet) => { - let added = []; - let effect = false; - for (let i = 0; i < playerEffect.power; i++) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - added.push(restraintAdd); - effect = true; - } - } - if (added.length > 0) { - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonRopeEngulf"), "#ff0000", 2); - effect = true; - } else { - let RopeDresses = ["Leotard", "Bikini", "Lingerie"]; - if (!RopeDresses.includes(KinkyDungeonCurrentDress)) { - KinkyDungeonSetDress(RopeDresses[Math.floor(Math.random() * RopeDresses.length)], ""); - KinkyDungeonDressPlayer(); - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonHexEngulfDress"), "#ff0000", 3); - effect = true; - } else { - //KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeMagicHogtie"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSarcoEngulf"), "#ff0000", 2); - effect = true; - } - } - } - return {sfx: "MagicSlash", effect: effect}; - }, - "SarcoHex": (target, damage, playerEffect, spell, faction, bullet) => { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); - if (!restraintAdd && !KinkyDungeonPlayerTags.get("Sarcophagus")) { - KDTripleBuffKill("SarcoHexEnd", KinkyDungeonPlayerEntity, 6, (tt) => { - // Remove the nearby sarcokraken and all tentacles - let kraken = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 10); - for (let enemy of kraken) { - if (enemy.Enemy.name == "SarcoKraken" || enemy.Enemy.name == "SarcoMinion") enemy.hp = 0; - } - // Put the player somewhere - let candidates = KDGameData.JailPoints?.filter((point) => {return point.type == "furniture";}); - if (candidates && candidates.length > 0) { - let candidate = candidates[Math.floor(KDRandom() * candidates.length)]; - KDMovePlayer(candidate.x, candidate.y, false); - } - // Add the sarcophagus - let newAdd = KinkyDungeonGetRestraint({tags: ["sarcophagus"]}, 100, "tmb"); - if (newAdd) { - KinkyDungeonAddRestraintIfWeaker(newAdd, spell.power, false, undefined, false, false, undefined, faction); - } - }, "Blindness"); - return {sfx: "Evil", effect: true}; - } - return {sfx: "Struggle", effect: false}; - }, - - -}; - -/** - * - * @param {any} spell - * @param {number} count - * @param {string[]} tags - * @param {string} faction - * @param {boolean} [noDeep] - * @param {boolean} [bypass] - Bypass inaccessible things - * @returns {restraint[]} - */ -function KDPlayerEffectRestrain(spell, count, tags, faction, noDeep, bypass) { - let added = []; - for (let i = 0; i < count; i++) { - let restraintAdd = KinkyDungeonGetRestraint({tags: tags}, MiniGameKinkyDungeonLevel + (spell?.power || 0), KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, (spell?.power || 0), bypass, undefined, false, false, undefined, faction, !noDeep)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell?.name); - added.push(restraintAdd); - } - } - return added; -} - -function KinkyDungeonPlayerEffect(target, damage, playerEffect, spell, faction, bullet) { - if (!playerEffect.name) return; - let effect = false; - let sfx = spell ? spell.hitsfx : undefined; - if (!sfx) sfx = (playerEffect.power && playerEffect.power < 2) ? "DamageWeak" : "Damage"; - if (damage == "inert") return; - if (playerEffect.hitTag && !KDPlayerHitBy.includes(playerEffect.hitTag)) KDPlayerHitBy.push(playerEffect.hitTag); - else if (playerEffect.hitTag) return; - if (!playerEffect.chance || KDRandom() < playerEffect.chance) { - if (KDPlayerEffects[playerEffect.name]) { - let ret = KDPlayerEffects[playerEffect.name](target, damage, playerEffect, spell, faction, bullet); - if (ret.sfx) sfx = ret.sfx; - effect = ret.effect; - } else if (playerEffect.name == "Ampule") { - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpellShatter" + spell.name), "#ff0000", 1); - effect = true; - } else if (playerEffect.name == "AmpuleBlue") { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["latexRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpellShatterBind" + spell.name), "#ff0000", 1); - effect = true; - } else { - if (KinkyDungeonCurrentDress != "BlueSuit") { - KinkyDungeonSetDress("BlueSuit", "Latex"); - KinkyDungeonDressPlayer(); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpellShatterDress" + spell.name), "#ff0000", 1); - effect = true; - } else { - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpellShatter" + spell.name), "#ff0000", 1); - } - let dmg = KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - if (dmg.happened) effect = true; - } - } else if (playerEffect.name == "Bind") { - let restraintAdd = KinkyDungeonGetRestraint({tags: [playerEffect.tag]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpell" + spell.name + "Bind"), "#ff0000", 2); - effect = true; - } else { - let dmg = KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpell" + spell.name + "Damage").replace("DamageDealt", dmg.string), "#ff0000", 2); - if (dmg.happened) effect = true; - } - } else if (playerEffect.name == "ShadowStrike") { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["shadowRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpellShadowStrike"), "#ff0000", 1); - effect = true; - } - let dmg = KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - if (dmg.happened) effect = true; - } else if (playerEffect.name == "Damage") { - let dmg = KinkyDungeonDealDamage({damage: Math.max((spell.aoepower) ? spell.aoepower : 0, spell.power), type: spell.damage}, bullet); - KinkyDungeonSendTextMessage(Math.min(spell.power, 5), TextGet("KinkyDungeonDamageSelf").replace("DamageDealt", dmg.string), "#ff0000", 1); - if (dmg.happened) effect = true; - } else if (playerEffect.name == "WitchBoulder") { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); - KDGameData.KneelTurns = 2; - let dmg = KinkyDungeonDealDamage({damage: Math.max((spell.aoepower) ? spell.aoepower : 0, spell.power), type: spell.damage}, bullet); - KinkyDungeonSendTextMessage(Math.min(spell.power, 5), TextGet("KDEffectWitchBoulder").replace("DamageDealt", dmg.string), "#ff0000", 1); - if (dmg.happened) effect = true; - } else if (playerEffect.name == "IceBolt") { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); - let dmg = KinkyDungeonDealDamage({damage: Math.max((spell.aoepower) ? spell.aoepower : 0, spell.power), type: spell.damage}, bullet); - KinkyDungeonSendTextMessage(Math.min(spell.power, 5), TextGet("KDEffectWitchBoulder").replace("DamageDealt", dmg.string), "#ff0000", 1); - if (dmg.happened) effect = true; - } else if (playerEffect.name == "Ignition") { - let dmg = KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - KinkyDungeonSendTextMessage(playerEffect.power, TextGet("KinkyDungeonBuffIgniteDamage").replace("DamageDealt", dmg.string), "#ff0000", 1); - if (dmg.happened) effect = true; - } else if (playerEffect.name == "DamageNoMsg") { - let dmg = KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - if (dmg.happened) effect = true; - } else if (playerEffect.name == "Blind") { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonBlindSelf"), "#ff0000", playerEffect.time); - effect = true; - } else if (playerEffect.name == "Hairpin") { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonHairpin"), "#ff0000", playerEffect.time); - if (spell.power > 0) { - effect = true; - KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - } - effect = true; - } else if (playerEffect.name == "MagicRope") { - let roped = false; - roped = roped || KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WeakMagicRopeArms"), 0, false, undefined, false, false, undefined, faction) > 0; - roped = roped || KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WeakMagicRopeLegs"), 0, false, undefined, false, false, undefined, faction) > 0; - - if (roped) KDSendStatus('bound', "WeakMagicRopeArms", "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonMagicRopeSelf"), "#ff0000", playerEffect.time); - if (roped) - effect = true; - } else if (playerEffect.name == "SlimeTrap") { - let slimeWalker = false; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).slimeWalk) { - slimeWalker = true; - break; - } - } - if (!slimeWalker) { - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") < 0.45) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["slimeRestraintsRandomLight"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - effect = true; - } - //effect = KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("StickySlime"), 0, false, undefined, false, false, undefined, faction) > 0; - //if (effect) KDSendStatus('bound', "StickySlime", "spell_" + spell.name); - //KinkyDungeonMovePoints = -1; - } - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSlime"), "#ff0000", playerEffect.time); - - if (spell.power > 0) { - effect = true; - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } - } - } else if (playerEffect.name == "Slime") { - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") < 0.45) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["slimeRestraintsRandomLight"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - effect = true; - } - //effect = KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("StickySlime"), 0, false, undefined, false, false, undefined, faction) > 0; - //if (effect) KDSendStatus('bound', "StickySlime", "spell_" + spell.name); - KinkyDungeonMovePoints = -1; - } - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSlime"), "#ff0000", playerEffect.time); - - if (spell.power > 0) { - effect = true; - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } - } else if (playerEffect.name == "MiniSlime") { - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") < 0.45 && KDRandom() < 0.33) { - KinkyDungeonMovePoints = -1; - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonMiniSlime2"), "#ff0000", 2); - } else - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonMiniSlime"), "#ff0000", 1); - - if (spell.power > 0) { - effect = true; - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } - } else if (playerEffect.name == "RemoveLowLevelRope") { - let restraints = []; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).power < 5 && KDRestraint(inv).shrine && KDRestraint(inv).shrine.includes("Rope")) { - restraints.push(KDRestraint(inv).Group); - } - } - for (let r of restraints) { - if (effect) KDSendStatus('escape', KinkyDungeonGetRestraintItem(r).name, "spell_" + spell.name); - KinkyDungeonRemoveRestraint(r, false); - } - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonRemoveLowLevelRope"), "lightGreen", 2); - } else if (playerEffect.name == "Shock") { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonShock"), "#ff0000", playerEffect.time); - effect = true; - } else if (playerEffect.name == "CoronaShock") { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["celestialRopes"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - }// else if (KDGameData.PrisonerState != 'jail' && KDGameData.PrisonerState != 'parole') { - //KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - //} - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonCoronaShock"), "#ff0000", playerEffect.time); - effect = true; - } else if (playerEffect.name == "CrystalBind") { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["crystalRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - }//else if (KDGameData.PrisonerState != 'jail' && KDGameData.PrisonerState != 'parole') { - //KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - //} - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonCrystalBind"), "#ff0000", 3); - effect = true; - } else if (playerEffect.name == "MysticShock") { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonMysticShock"), "#ff0000", playerEffect.time); - if (spell.power > 0) { - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } - effect = true; - } else if (playerEffect.name == "RobotShock") { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonRobotShock"), "#ff0000", playerEffect.time); - if (spell.power > 0) { - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } - effect = true; - } else if (playerEffect.name == "HeatBlast") { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns || 0, KinkyDungeonSlowMoveTurns + 2); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonHeatBlast"), "#ff0000", playerEffect.time + 1); - if (spell.power > 0) { - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } - effect = true; - } else if (playerEffect.name == "RubberBullets") { - if (KDRandom() < 0.25 && KinkyDungeonStatWill < KinkyDungeonStatWillMax/2) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["slimeRestraintsRandom"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonRubberBulletsAttach"), "#ff0000", 2); - } - } else KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonRubberBullets"), "#ff0000", 2); - if (spell.power > 0) { - KinkyDungeonDealDamage({damage: KinkyDungeonStatWill < KinkyDungeonStatWillMax/2 ? spell.power : spell.power*1.5, type: spell.damage}, bullet); - } - effect = true; - } else if (playerEffect.name == "SingleChain") { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["chainRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleChain"), "#ff0000", playerEffect.time); - effect = true; - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", playerEffect.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - effect = true; - } - - } else if (playerEffect.name == "SingleMagicChain") { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["chainRestraintsMagic"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleChain"), "#ff0000", playerEffect.time); - effect = true; - } - - } else if (playerEffect.name == "Spores") { - KinkyDungeonSleepiness = Math.max(KinkyDungeonSleepiness, 6); - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSpores"), "#a583ff", 2); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - effect = true; - } else if (playerEffect.name == "PoisonDagger") { - KinkyDungeonSendTextMessage(6, TextGet("KDPoisonDagger"), "#33ff00", 2); - KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "PoisonDagger", aura: "#22ff44", type: "Sleepiness", power: 1, duration: playerEffect.time, player: true, enemies: false, tags: ["sleep"], range: 1.5}); - effect = true; - } else if (playerEffect.name == "SporesSick") { - KinkyDungeonSleepiness += 1.5; - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSporesSick"), "#63ab3f", 2); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - effect = true; - } else if (playerEffect.name == "Flummox") { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "Flummox", type: "Flummox", duration: 5, power: 1.0, player: true, mushroom: true, tags: ["overlay", "darkness"]}); - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonFlummox"), "#a583ff", 2); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - effect = true; - } else if (playerEffect.name == "NurseBola") { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["nurseCuffRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonNurseBola"), "#ff0000", playerEffect.time); - effect = true; - } - - } else if (playerEffect.name == "SingleRope" || playerEffect.name == "BanditBola") { - if (playerEffect.name == "BanditBola") { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - } - let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd) { - KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleRope"), "#ff0000", playerEffect.time); - effect = true; - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", playerEffect.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - effect = true; - } - - } else if (playerEffect.name == "RestrainingDevice") { - let added = []; - for (let i = 0; i < playerEffect.count; i++) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["hitechCables"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - added.push(restraintAdd); - effect = true; - } - } - if (added.length > 0) { - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonRestrainingDevice"), "#ff0000", 2); - effect = true; - } else { - KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonRestrainingDeviceStun"), "yellow", playerEffect.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - effect = true; - } - - } else if (playerEffect.name == "Glue") { - let added = []; - if (KinkyDungeonLastAction == "Move") - for (let i = 0; i < playerEffect.count; i++) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["glueRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - added.push(restraintAdd); - effect = true; - } - } - if (added.length > 0) { - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonGlue"), "yellow", 2); - effect = true; - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonGlueSlow"), "yellow", playerEffect.time); - if (playerEffect.power) { - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonGlueSlowDamage").replace("DamageDealt", playerEffect.power), "yellow", 2); - KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - } else KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonGlueSlow"), "yellow", playerEffect.time); - effect = true; - } - - } else if (playerEffect.name == "RopeEngulf") { - let added = []; - for (let i = 0; i < playerEffect.power; i++) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeMagicStrong", "ropeAuxiliary", "clothRestraints", "tapeRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - added.push(restraintAdd); - effect = true; - } - } - if (added.length > 0) { - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonRopeEngulf"), "#ff0000", 2); - effect = true; - } else { - let RopeDresses = ["Leotard", "Bikini", "Lingerie"]; - if (!RopeDresses.includes(KinkyDungeonCurrentDress)) { - KinkyDungeonSetDress(RopeDresses[Math.floor(Math.random() * RopeDresses.length)], ""); - KinkyDungeonDressPlayer(); - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonRopeEngulfDress"), "#ff0000", 3); - effect = true; - } else { - //KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeMagicHogtie"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonRopeEngulf"), "#ff0000", 2); - effect = true; - } else { - let buff1 = {id: "KrakenEngulf", type: "Blindness", duration: 8, power: 1.0, player: true, tags: ["passout"]}; - let buff2 = {id: "KrakenEngulf2", type: "Blindness", duration: 8, power: 2.0, player: true, tags: ["passout"]}; - let buff3 = {id: "KrakenEngulf3", type: "Blindness", duration: 8, power: 4.0, player: true, tags: ["passout"]}; - if (KinkyDungeonPlayerBuffs[buff3.id]) { - KinkyDungeonPassOut(); - } else if (KinkyDungeonPlayerBuffs[buff2.id]) { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonRopeEngulfEnd3"), "#ff0000", 5); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff1); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff2); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff3); - } else if (KinkyDungeonPlayerBuffs[buff1.id]) { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonRopeEngulfEnd2"), "#ff0000", 4); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff1); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff2); - } else { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonRopeEngulfEnd1"), "#ff0000", 4); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff1); - } - } - - //KinkyDungeonSetFlag("kraken", 4); - } - } - } else if (playerEffect.name == "RopeEngulfWeak") { - let added = []; - for (let i = 0; i < playerEffect.power; i++) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeRestraints", "ropeRestraints2", "ropeRestraintsWrist"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - added.push(restraintAdd); - effect = true; - } - } - if (added.length > 0) { - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonRopeEngulfWeak"), "#ff0000", 2); - effect = true; - } else { - let RopeDresses = ["Leotard", "Bikini", "Lingerie"]; - if (!RopeDresses.includes(KinkyDungeonCurrentDress)) { - KinkyDungeonSetDress(RopeDresses[Math.floor(Math.random() * RopeDresses.length)], ""); - KinkyDungeonDressPlayer(); - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonRopeEngulfDress"), "#ff0000", 3); - effect = true; - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", playerEffect.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - effect = true; - } - } - } else if (playerEffect.name == "VineEngulf") { - let added = []; - for (let i = 0; i < playerEffect.power; i++) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["vineRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - added.push(restraintAdd); - effect = true; - } - } - if (added.length > 0) { - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonVineEngulf"), "#ff0000", 2); - effect = true; - } else { - let RopeDresses = ["GreenLeotard", "Lingerie"]; - if (!RopeDresses.includes(KinkyDungeonCurrentDress) && KinkyDungeonCurrentDress != "Elven") { - KinkyDungeonSetDress(RopeDresses[Math.floor(Math.random() * RopeDresses.length)], ""); - KinkyDungeonDressPlayer(); - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonVineEngulfDress"), "#ff0000", 3); - effect = true; - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", playerEffect.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - effect = true; - } - } - } else if (playerEffect.name == "ObsidianEngulf") { - let added = []; - for (let i = 0; i < playerEffect.count; i++) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["obsidianRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - added.push(restraintAdd); - effect = true; - } - } - if (added.length > 0) { - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonObsidianEngulf"), "#ff0000", 2); - effect = true; - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", playerEffect.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - effect = true; - } - } else if (playerEffect.name == "CharmWraps") { - let added = []; - for (let i = 0; i < playerEffect.power; i++) { - let restraintAdd = KinkyDungeonGetRestraint({tags: ["ribbonRestraintsLight"]}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - added.push(restraintAdd); - effect = true; - } - } - if (added.length > 0) { - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonCharmWraps"), "#ff0000", 2); - effect = true; - } else { - let CharmDresses = ["Leotard", "Bikini", "Lingerie"]; - if (!CharmDresses.includes(KinkyDungeonCurrentDress) && KinkyDungeonCurrentDress != "Prisoner") { - KinkyDungeonSetDress(CharmDresses[Math.floor(Math.random() * CharmDresses.length)], ""); - KinkyDungeonDressPlayer(); - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonCharmWrapsDress"), "#ff0000", 3); - effect = true; - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", playerEffect.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - effect = true; - } - } - } else if (playerEffect.name == "EnchantedArrow") { - let added = []; - for (let i = 0; i < playerEffect.count; i++) { - let ropeRests = ["mithrilRope"]; - if (KinkyDungeonStatStamina < KinkyDungeonStatStamina * 0.25) { - ropeRests.push("mithrilRopeHogtie"); - } - let restraintAdd = KinkyDungeonGetRestraint({tags: ropeRests}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - added.push(restraintAdd); - effect = true; - } - } - if (added.length > 0) { - KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonEnchantedArrow"), "#ff0000", 2); - effect = true; - } else { - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); // This is to prevent stunlock while slowed heavily - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", playerEffect.time); - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - effect = true; - } - - } else if (playerEffect.name == "TrapBindings") { - let added = []; - for (let i = 0; i < playerEffect.count; i++) { - let restraintAdd = KinkyDungeonGetRestraint({tags: playerEffect.tags}, MiniGameKinkyDungeonLevel + spell.power, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]); - if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction)) { - KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); - added.push(restraintAdd); - effect = true; - } - } - if (added.length > 0) { - KinkyDungeonSendTextMessage(6, TextGet(playerEffect.text), "#ff0000", 2); - effect = true; - } else { - let PossibleDresses = ["Leotard", "Bikini", "Lingerie"]; - if (!PossibleDresses.includes(KinkyDungeonCurrentDress)) { - KinkyDungeonSetDress(PossibleDresses[Math.floor(Math.random() * PossibleDresses.length)], ""); - KinkyDungeonDressPlayer(); - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonTrapBindingsDress"), "#ff0000", 3); - effect = true; - } - // else if (!playerEffect.noGuard && KDGameData.PrisonerState != 'jail' && KDGameData.PrisonerState != 'parole') { - //KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - //} - if (playerEffect.power > 0 && playerEffect.damage) { - KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - } - } - } else if (playerEffect.name == "NurseSyringe") { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonNurseSyringe"), "#ff0000", 8); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "NurseSyringe", aura: "#22ff44", type: "Sleepiness", power: 1, duration: playerEffect.time, player: true, enemies: false, tags: ["sleep"], range: 1.5}); - effect = true; - } else if (playerEffect.name == "TrapSleepDart") { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonTrapSleepDart"), "#ff0000", 8); - KDStunTurns(8); - KinkyDungeonStatBlind = 8; - KinkyDungeonSleepiness = 8; - KinkyDungeonAlert = 5; - effect = true; - } else if (playerEffect.name == "Drench") { - KinkyDungeonSendTextMessage(4, TextGet("KDEffectDrench"), "#9999ff", 3); - for (let b of spell.buffs) { - if (b.id.includes("Drenched")) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, b); - } - } - if (spell.power > 0 && spell.damage == 'acid') - KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); - } else if (playerEffect.name == "LustBomb") { - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonLustBomb"), "pink", 4); - if (playerEffect.power > 0) { - KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - } - effect = true; - } else if (playerEffect.name == "TrapLustCloud") { - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonTrapLustCloud"), "yellow", 4); - if (playerEffect.power > 0) { - KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - } - effect = true; - } else if (playerEffect.name == "TrapSPCloud") { - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonTrapSPCloud"), "yellow", 4); - if (playerEffect.power > 0) { - KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - } - KDGameData.StaminaPause = 10; - effect = true; - } else if (playerEffect.name == "Freeze") { - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonFreeze"), "#ff0000", playerEffect.time); - if (playerEffect.power > 0) { - KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - } - KinkyDungeonStatFreeze = Math.max(0, playerEffect.time); - KinkyDungeonSleepTime = CommonTime() + KinkyDungeonFreezeTime; - effect = true; - } else if (playerEffect.name == "Chill") { - if (playerEffect.power > 0 && !KinkyDungeonFlags.get("chill")) { - KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}, bullet); - } - if (KinkyDungeonPlayerBuffs.Drenched || KinkyDungeonPlayerBuffs.Chilled) { - sfx = "Freeze"; - KinkyDungeonStatFreeze = Math.max(0, playerEffect.time); - KinkyDungeonSleepTime = CommonTime() + KinkyDungeonFreezeTime; - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonFreeze"), "#ff0000", playerEffect.time); - } else { - sfx = "Bones"; - KinkyDungeonMovePoints = Math.max(-1, KinkyDungeonMovePoints-1); - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonChill"), "#ff0000", playerEffect.time); - } - KinkyDungeonSetFlag("chill", 1); - effect = true; - } else if (playerEffect.name == "ShadowBind") { - KinkyDungeonStatBind = Math.max(0, playerEffect.time); - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonShadowBind"), "#ff0000", playerEffect.time); - effect = true; - } - } - - if (sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + sfx + ".ogg"); - if (effect) KinkyDungeonInterruptSleep(); - - return effect; -} - -/** - * For those 'three strikes you're out' effects - * @param {string} Name - * @param {entity} Target - * @param {number} time - Time for the buff to wear off - * @param {(target: entity) => void} FinalEffect - * @param {string} buffType - Buff effect - */ -function KDTripleBuffKill(Name, Target, time, FinalEffect = (target) => KinkyDungeonPassOut(), buffType = "Blindness") { - let buff1 = {id: Name + "1", type: buffType, duration: time + 3, power: 1.0, player: true, tags: ["passout"]}; - let buff2 = {id: Name + "2", type: buffType, duration: time + 3, power: 2.0, player: true, tags: ["passout"]}; - let buff3 = {id: Name + "3", type: buffType, duration: time + 3, power: 4.0, player: true, tags: ["passout"]}; - if (KinkyDungeonPlayerBuffs[buff3.id]) { - FinalEffect(Target); - } else if (KinkyDungeonPlayerBuffs[buff2.id]) { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeon" + Name + "3"), "#ff5555", time + 1); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff1); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff2); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff3); - } else if (KinkyDungeonPlayerBuffs[buff1.id]) { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeon" + Name + "2"), "#ff5555", time); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff1); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff2); - } else { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeon" + Name + "1"), "#ff5555", time); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, buff1); - } -} \ No newline at end of file diff --git a/Game/KinkyDungeonQuest.js b/Game/KinkyDungeonQuest.js deleted file mode 100644 index 394d170a9..000000000 --- a/Game/KinkyDungeonQuest.js +++ /dev/null @@ -1,315 +0,0 @@ -"use strict"; - -let QuestCompleteWeight = 1000; - -/** - * @type {Record} - */ -let KDQuests = { - "DressmakerQuest": { - name: "DressmakerQuest", - npc: "DressmakerQuest", - worldgenstart: () => { - if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { - for (let i = 0; i < 3; i++) { - let point = KinkyDungeonGetRandomEnemyPoint(true); - if (point) { - KinkyDungeonSummonEnemy(point.x, point.y, "Dressmaker", 1, 2.9); - } - } - } - }, - weight: (RoomType, MapMod, data) => { - if (RoomType == "Tunnel") { - let weight = 15; - if (KinkyDungeonPlayerTags.has("BindingDress")) { - return weight * QuestCompleteWeight; - } - return weight; - } - return 0; - }, - prerequisite: (RoomType, MapMod, data) => { - //if (KinkyDungeonFlags.has("DressmakerQuest") && KinkyDungeonPlayerTags.has("BindingDress")) { - //return false; - //} - if (RoomType == "Tunnel") { - return true; - } - return false; - } - }, - "ApprenticeQuest": { - name: "ApprenticeQuest", - npc: "ApprenticeQuest", - worldgenstart: () => { - if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel) && !KinkyDungeonFlags.get("ApprenticeQuestSpawn")) { - let point = KinkyDungeonGetRandomEnemyPoint(true); - if (point) { - KinkyDungeonSummonEnemy(point.x, point.y, "Librarian", 1, 2.9); - } - KinkyDungeonSetFlag("ApprenticeQuestSpawn", -1); - - } - }, - weight: (RoomType, MapMod, data) => { - if (RoomType == "Tunnel") { - let weight = 30; - if ( - KinkyDungeonInventoryGet("ScrollLegs") - || KinkyDungeonInventoryGet("ScrollArms") - || KinkyDungeonInventoryGet("ScrollVerbal") - || KinkyDungeonInventoryGet("ScrollPurity") - ) { - return weight * QuestCompleteWeight; - } - return weight; - } - return 0; - }, - accept: (data) => { - KinkyDungeonSetFlag("ApprenticeQuestSpawn", 0); - }, - prerequisite: (RoomType, MapMod, data) => { - if (KDHasQuest("ApprenticeQuest") && !(KinkyDungeonInventoryGet("ScrollLegs") - || KinkyDungeonInventoryGet("ScrollArms") - || KinkyDungeonInventoryGet("ScrollVerbal") - || KinkyDungeonInventoryGet("ScrollPurity") - )) { - return false; - } - if (RoomType == "Tunnel") { - return true; - } - return false; - } - }, - "DragonheartQuest": { - name: "DragonheartQuest", - npc: "DragonheartQuest", - weight: (RoomType, MapMod, data) => { - if (RoomType == "Tunnel") { - let weight = 20; - return weight; - } - return 0; - }, - worldgenstart: () => { - if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { - let point = KinkyDungeonGetRandomEnemyPoint(true); - if (point) { - KinkyDungeonSummonEnemy(point.x, point.y, "DragonLeaderDuelist", 1, 2.9); - } - KDRemoveQuest("DragonheartQuest"); // Only lasts 1 floor - } - }, - prerequisite: (RoomType, MapMod, data) => { - if (KDHasQuest("DragonheartQuest")) { - return false; - } - if (KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel + 1)) return false; - if (RoomType == "Tunnel") { - return true; - } - return false; - } - }, - "MaidforceQuest": { - name: "MaidforceQuest", - npc: "MaidforceQuest", - weight: (RoomType, MapMod, data) => { - if (RoomType == "Tunnel") { - let weight = 20; - return weight; - } - return 0; - }, - worldgenstart: () => { - if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { - let point = KinkyDungeonGetRandomEnemyPoint(true); - if (point) { - let e = KinkyDungeonGetEnemy(["maid", "miniboss"], MiniGameKinkyDungeonLevel + 2, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', ["maid", "miniboss"], false, {"maid": {mult: 4, bonus: 10}}); - if (e) { - let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); - if (epoint) { - let ee = DialogueCreateEnemy(point.x, point.y, e.name); - if (ee) { - ee.faction = "Delinquent"; - ee.factionrep = {"Maidforce": 0.01}; - ee.AI = "looseguard"; - } - } - } - let count = 3 + KDRandom() * Math.min(4, KinkyDungeonDifficulty / 20); - for (let i = 0; i < count; i++) { - e = KinkyDungeonGetEnemy(["maid"], MiniGameKinkyDungeonLevel + 2, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', ["maid"], false, {"maid": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); - let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); - if (epoint) { - let ee = DialogueCreateEnemy(point.x, point.y, e.name); - if (ee) { - ee.faction = "Delinquent"; - ee.factionrep = {"Maidforce": 0.0025}; - ee.AI = "looseguard"; - } - } - } - } - KDRemoveQuest("MaidforceQuest"); // Only lasts 1 floor - } - }, - prerequisite: (RoomType, MapMod, data) => { - if (KDHasQuest("MaidforceQuest")) { - return false; - } - if (KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel + 1)) return false; - if (RoomType == "Tunnel") { - return true; - } - return false; - } - }, - "WolfgirlHunters": { - name: "WolfgirlHunters", - npc: "MaidforceQuest", - weight: (RoomType, MapMod, data) => { - return 0; - }, - worldgenstart: () => { - if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { - let point = KinkyDungeonGetRandomEnemyPoint(true); - if (point) { - let e = KinkyDungeonGetEnemy(["wolfgirl", "miniboss"], MiniGameKinkyDungeonLevel + 2, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', ["wolfgirl", "miniboss"], false, {"wolfgirl": {mult: 4, bonus: 10}}); - if (e) { - let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); - if (epoint) { - let ee = DialogueCreateEnemy(point.x, point.y, e.name); - if (ee) { - ee.faction = "Wolfhunter"; - ee.AI = "looseguard"; - } - } - } - let count = 3 + KDRandom() * Math.min(4, KinkyDungeonDifficulty / 20); - for (let i = 0; i < count; i++) { - e = KinkyDungeonGetEnemy(["nevermere"], MiniGameKinkyDungeonLevel + 2, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', ["nevermere"], false, {"wolfgirl": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); - let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); - if (epoint) { - let ee = DialogueCreateEnemy(point.x, point.y, e.name); - if (ee) { - ee.faction = "Wolfhunter"; - ee.AI = "looseguard"; - } - } - } - } - } - }, - prerequisite: (RoomType, MapMod, data) => { - return false; - } - }, - "BanditQuest": { - name: "BanditQuest", - npc: "BanditQuest", - weight: (RoomType, MapMod, data) => { - if (RoomType == "Tunnel") { - let weight = 20; - return weight; - } - return 0; - }, - worldgenstart: () => { - if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { - let point = KinkyDungeonGetRandomEnemyPoint(true); - if (point) { - point = KinkyDungeonNearestJailPoint(point.x, point.y); - if (point) { - KinkyDungeonSummonEnemy(point.x, point.y, "PrisonerBandit", 1, 1.5); - } - } - KDRemoveQuest("BanditPrisoner"); // Only lasts 1 floor - } - }, - prerequisite: (RoomType, MapMod, data) => { - if (KDHasQuest("BanditPrisoner")) { - return false; - } - if (KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel + 1)) return false; - if (RoomType == "Tunnel") { - return true; - } - return false; - } - }, - "BlacksmithQuest": { - name: "BlacksmithQuest", - npc: "BlacksmithQuest", - weight: (RoomType, MapMod, data) => { - return 100; - }, - prerequisite: (RoomType, MapMod, data) => { - if (RoomType == "Tunnel") { - return true; - } - return false; - } - }, -}; - - - -function KDQuestList(count, mods, RoomType, MapMod, data) { - let ret = []; - for (let i = 0; i < count; i++) { - let genWeightTotal = 0; - let genWeights = []; - - for (let mod of Object.values(mods)) { - if (!ret.includes(mod) && mod.prerequisite(RoomType, MapMod, data)) { - genWeights.push({mod: mod, weight: genWeightTotal}); - genWeightTotal += mod.weight(RoomType, MapMod, data); - } - } - - let selection = KDRandom() * genWeightTotal; - - for (let L = genWeights.length - 1; L >= 0; L--) { - if (selection > genWeights[L].weight) { - ret.push(genWeights[L].mod); - break; - } - } - } - return ret; -} - -function KDQuestTick(quests) { - if (quests) { - for (let q of quests) { - if (KDQuests[q] && KDQuests[q].worldgenstart) { - KDQuests[q].worldgenstart(); - } - } - } -} - -function KDRemoveQuest(quest) { - if (!KDGameData.Quests) - KDGameData.Quests = []; - else - KDGameData.Quests.splice(KDGameData.Quests.indexOf(quest), 1); -} -function KDAddQuest(quest) { - if (!KDGameData.Quests) KDGameData.Quests = []; - if (!KDGameData.Quests.includes(quest)) { - if (KDQuests[quest]?.accept) { - KDQuests[quest].accept(); - } - KDGameData.Quests.push(quest); - } -} - -function KDHasQuest(quest) { - if (!KDGameData.Quests) return false; - return KDGameData.Quests.includes(quest); -} \ No newline at end of file diff --git a/Game/KinkyDungeonReputation.js b/Game/KinkyDungeonReputation.js deleted file mode 100644 index 72449772a..000000000 --- a/Game/KinkyDungeonReputation.js +++ /dev/null @@ -1,783 +0,0 @@ -"use strict"; - -const KDANGER = -19; -const KDRAGE = -31; -const KDPLEASED = 15; -const KDFRIENDLY = 35; - -let KDFactionGoddess = { - "Metal": { - "Angel": 0.002, - "Demon": -0.001, - "Nevermere": -0.001, - "AncientRobot": 0.007, - "Elemental": 0.001, - }, - "Rope": { - "Angel": 0.002, - "Demon": -0.001, - "KinkyConstruct": 0.005, - "Dressmaker": 0.005, - "Bountyhunter": 0.002, - "Bast": 0.0025, - "AncientRobot": 0.001, - }, - "Elements": { - "Angel": 0.007, - "Demon": -0.001, - "Witch": 0.003, - "Apprentice": 0.0015, - "Elemental": 0.01, - //"Mushy": 0.001, - "AncientRobot": -0.001, - }, - "Leather": { - "Angel": 0.002, - "Demon": -0.001, - "Elf": 0.001, - "Dragon": 0.005, - "Bandit": 0.01, - "Elemental": 0.002, - "AncientRobot": 0.001, - }, - "Latex": { - "Angel": 0.002, - "Demon": -0.001, - "Maidforce": 0.0015, - "Alchemist": 0.01, - "Nevermere": 0.003, - "AncientRobot": 0.001, - }, - "Will": { - "Angel": 0.007, - "Demon": -0.005, - "Elf": 0.005, - //"Mushy": 0.0035, - "Bast": 0.005, - "Apprentice": 0.001, - "AncientRobot": -0.001, - }, - "Conjure": { - "Angel": 0.007, - "Demon": -0.001, - "Alchemist": 0.002, - "Witch": 0.003, - "Apprentice": 0.0015, - "Dressmaker": 0.005, - "AncientRobot": -0.001, - }, - "Illusion": { - "Angel": 0.007, - "Demon": -0.001, - "Witch": 0.003, - "Apprentice": 0.0015, - "Maidforce": 0.007, - "Bountyhunter": 0.002, - "AncientRobot": -0.001, - //"Ghost": 0.005, - }, -}; - -/** - * @type {Record} - */ -let KinkyDungeonGoddessRep = { -}; - -/** - * @type {Record} - */ -let KinkyDungeonRescued = {}; -/** - * @type {Record} - */ -let KinkyDungeonAid = {}; - -let KDRepSelectionMode = ""; - -/** - * - * @type {Object.} - */ -let KDBlessedRewards = { - "Latex": ["TheEncaser"], - "Rope": ["MoiraiScissors"], - "Metal": ["BondageBuster"], - "Leather": ["Dragonslaver"], - "Will": ["MessengerOfLove"], - "Elements": ["FourSeasons",], - "Conjure": ["Arbiter"], - "Illusion": ["Dreamcatcher"], -}; - -/** - * Returns whether or not the player meets a requirement for a pearl reward chest - * @returns {boolean} - */ -function KDPearlRequirement() { - let has = false; - for (let rep of Object.entries(KinkyDungeonGoddessRep)) { - let rewards = KDBlessedRewards[rep[0]]; - if (rewards) { - let missing = true; - for (let r of rewards) { - if (KinkyDungeonInventoryGet(r)) { - missing = false; - break; - } - } - if (missing && rep[1] > 45) { - has = true; - break; - } - } - - } - return has; -} - -function KinkyDungeonInitReputation() { - KinkyDungeonGoddessRep = {"Ghost" : -50, "Prisoner" : -50}; - for (let shrine in KinkyDungeonShrineBaseCosts) { - KinkyDungeonGoddessRep[shrine] = KinkyDungeonStatsChoice.get("Cursed") ? -50 : 0; - } - if (KinkyDungeonStatsChoice.get("Wanted")) KinkyDungeonChangeRep("Prisoner", 100); - if (KinkyDungeonStatsChoice.get("Submissive")) KinkyDungeonChangeRep("Ghost", 100); - - if (KinkyDungeonStatsChoice.get("Unchained")) KinkyDungeonChangeRep("Metal", 10); - if (KinkyDungeonStatsChoice.get("Artist")) KinkyDungeonChangeRep("Rope", 10); - if (KinkyDungeonStatsChoice.get("Slippery")) KinkyDungeonChangeRep("Latex", 10); - if (KinkyDungeonStatsChoice.get("Escapee")) KinkyDungeonChangeRep("Leather", 10); - - if (KinkyDungeonStatsChoice.get("Damsel")) KinkyDungeonChangeRep("Metal", -10); - if (KinkyDungeonStatsChoice.get("Bunny")) KinkyDungeonChangeRep("Rope", -10); - if (KinkyDungeonStatsChoice.get("Doll")) KinkyDungeonChangeRep("Latex", -10); - if (KinkyDungeonStatsChoice.get("Dragon")) KinkyDungeonChangeRep("Leather", -10); -} - -/** - * - * @param {number} Amount - * @returns {string} - */ -function KinkyDungeonRepName(Amount) { - let name = ""; - - if (Amount >= 10) name = "Thankful"; - if (Amount >= 30) name = "Pleased"; - if (Amount >= 45) name = "Blessed"; - if (Amount < KDANGER) name = "Angered"; - if (Amount < KDRAGE) name = "Enraged"; - if (Amount < -45) name = "Cursed"; - - return TextGet("KinkyDungeonRepName" + name); -} - -/** - * - * @param {number} Amount - * @returns {string} - */ -function KinkyDungeonRepNameFaction(Amount) { - let name = ""; - - if (Amount > 0.2) name = "Thankful"; - if (Amount >= 0.4) name = "Pleased"; - if (Amount > 0.7) name = "Blessed"; - if (Amount < -0.1) name = "Angered"; - if (Amount <= -0.5) name = "Enraged"; - if (Amount < -0.9) name = "Cursed"; - - return TextGet("KinkyDungeonRepNameFaction" + name); -} - -/** - * - * @param {string} Rep - * @param {number} Amount - * @returns {boolean} - */ -function KinkyDungeonChangeFactionRep(Rep, Amount) { - let last = KDFactionRelation("Player", Rep); - KDChangeFactionRelation("Player", Rep, Amount); - let curr = KDFactionRelation("Player", Rep); - - if (curr != last) { - let amount = 0.5*Math.round((curr - last)*1000)/10; // 0.5% due to the fact that the scale is -1 to +1 but it gets mapped from 0 to 100% - KinkyDungeonSendFloater({x: 1100, y: 800 - KDRecentRepIndex * 40}, `${amount > 0 ? '+' : ''}${amount}% ${TextGet("KinkyDungeonFaction" + Rep)} rep`, "white", 5, true); - KDRecentRepIndex += 1; - } - - return false; -} - -/** - * - * @param {string} Rep - * @param {number} Amount - * @returns {boolean} - */ -function KinkyDungeonChangeRep(Rep, Amount) { - if (KinkyDungeonGoddessRep[Rep] != undefined) { - let last = KinkyDungeonGoddessRep[Rep]; - let minimum = (Rep == "Ghost" && KinkyDungeonStatsChoice.get("Submissive")) || (Rep == "Prisoner" && KinkyDungeonStatsChoice.get("Wanted")) ? 20: -50; - let maximum = (KinkyDungeonStatsChoice.get("Cursed") && (Rep != "Ghost" && Rep != "Prisoner")) ? -25: 50; - //let target = -50; - //let interval = 0.02; - let start = KinkyDungeonGoddessRep[Rep]; - //if (Amount >= 0) target = 50; - /*for (let i = 0; i < Math.abs(Amount); i++) { - KinkyDungeonGoddessRep[Rep] += (target - KinkyDungeonGoddessRep[Rep]) * interval; - }*/ - KinkyDungeonGoddessRep[Rep] += Amount; - KinkyDungeonGoddessRep[Rep] = Math.min(maximum, Math.max(minimum, KinkyDungeonGoddessRep[Rep])); - if (Math.abs(KinkyDungeonGoddessRep[Rep] - start) > 0.1) { - let value = KinkyDungeonGoddessRep[Rep] - start; - let amount = Math.round((value)*10)/10; - KinkyDungeonSendFloater({x: 1100, y: 800 - KDRecentRepIndex * 40}, `${amount > 0 ? '+' : ''}${amount}% ${TextGet("KinkyDungeonShrine" + Rep)} rep`, "white", 5, true); - KDRecentRepIndex += 1; - } - - if (KDFactionGoddess[Rep]) { - for (let f of Object.entries(KDFactionGoddess[Rep])) { - let mult = (Amount > 0 ? 1 : 1); - if (Amount > 0) { - if (KDFactionRelation("Player", f[0]) <= -0.25) mult *= 0.5; - else if (KDFactionRelation("Player", f[0]) <= -0.1) mult *= 0.75; - else if (KDFactionRelation("Player", f[0]) >= 0.55) mult *= 0; - else if (KDFactionRelation("Player", f[0]) >= 0.35) mult *= 0.25; - else if (KDFactionRelation("Player", f[0]) >= 0.25) mult *= 0.5; - else if (KDFactionRelation("Player", f[0]) >= 0.1) mult *= 0.75; - } - KDChangeFactionRelation("Player", f[0], f[1] * mult * Amount); - } - } - - if (KinkyDungeonGoddessRep[Rep] != last) return true; - return false; - } - return false; -} - -function KinkyDungeonHandleReputation() { - let i = 0; - let maxY = 560; - let XX = 0; - let spacing = 60; - let yPad = 50; - if (KDFactionRepIndex < 0.1) - for (let rep in KinkyDungeonGoddessRep) { - let value = KinkyDungeonGoddessRep[rep]; - - if (rep) { - if (spacing * i > maxY) { - if (XX == 0) i = 0; - XX = 600; - } - if (KinkyDungeonShrineBaseCosts[rep]) { - if (KDRepSelectionMode == "" && KinkyDungeonAllRestraint().length > 0 && MouseIn(600, 800, 250, 50)) { - KDRepSelectionMode = "Rescue"; - return true; - } else if (KDRepSelectionMode == "" && MouseIn(900, 800, 250, 50)) { - KDRepSelectionMode = "Champion"; - return true; - } - - - - if (KDRepSelectionMode == "Aid" && MouseIn(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40) && KinkyDungeonCanAidMana(rep, value)) { - // Aid - KDSendInput("aid", {rep: rep, value: value}); - KinkyDungeonDrawState = "Game"; - KDRepSelectionMode = ""; - } else if (KDRepSelectionMode == "Rescue" && MouseIn(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40) && KinkyDungeonCanRescue(rep, value)) { - // Rescue - if (KDSendInput("rescue", {rep: rep, value: value}) != "FailRescue") { - KinkyDungeonDrawState = "Game"; - KDRepSelectionMode = ""; - } - return true; - } else if (KDRepSelectionMode == "Penance" && MouseIn(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40) && KinkyDungeonCanPenance(rep, value)) { - // Penance - KDSendInput("penance", {rep: rep, value: value}); - KDRepSelectionMode = ""; - KinkyDungeonDrawState = "Game"; - return true; - } else if (KDRepSelectionMode == "Champion" && MouseIn(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40)) { - // Champion - KDSendInput("champion", {rep: rep, value: value}); - return true; - } - } - - i++; - } - } - //if (!noReturn) - KDRepSelectionMode = ""; - return true; -} - -function KinkyDungeonDrawReputation() { - KinkyDungeonDrawMessages(true); - let i = 0; - let XX = 0; - let spacing = 600 / Object.keys(KinkyDungeonGoddessRep).length; - let yPad = 50; - let tooltip = ""; - - if (!KDRepSelectionMode) { - tooltip = KinkyDungeonDrawFactionRep(); - } - - for (let rep in KinkyDungeonGoddessRep) { - MainCanvas.textAlign = "left"; - let value = KinkyDungeonGoddessRep[rep]; - - if (rep) { - let color = "#ffff00"; - let goddessColor = "white"; - let goddessSuff = ""; - if (value < -10) { - if (value < -30) color = "#ff0000"; - else color = "#ff8800"; - } else if (value >= 10) { - if (value >= 30) color = "#00ff00"; - else color = "#88ff00"; - } - if (tooltip) { - goddessColor = "#888888"; - if (KDFactionGoddess[rep] && KDFactionGoddess[rep][tooltip] != 0) { - goddessColor = KDFactionGoddess[rep][tooltip] > 0 ? "#ffffff" : (KDFactionGoddess[rep][tooltip] < 0 ? "#ff5555" : "#999999"); - if (KDFactionGoddess[rep][tooltip] >= 0.006) goddessSuff = "+++"; - else if (KDFactionGoddess[rep][tooltip] >= 0.003) goddessSuff = "++"; - else if (KDFactionGoddess[rep][tooltip] >= 0.00001) goddessSuff = "+"; - else if (KDFactionGoddess[rep][tooltip] <= -0.00001) goddessSuff = "-"; - else if (KDFactionGoddess[rep][tooltip] <= 0.004) goddessSuff = "--"; - else if (KDFactionGoddess[rep][tooltip] <= 0.006) goddessSuff = "---"; - } - } - let suff = ""; - if (rep != "Ghost" && rep != "Prisoner") suff = "" + KinkyDungeonRepName(value); - DrawTextKD(TextGet("KinkyDungeonShrine" + rep) + goddessSuff, canvasOffsetX_ui + XX, yPad + canvasOffsetY_ui + spacing * i, goddessColor, "black"); - if (suff) { - DrawTextFitKD(suff, canvasOffsetX_ui + 275 + XX + 250, yPad + canvasOffsetY_ui + spacing * i, 100, "white", "black"); - } - DrawProgressBar(canvasOffsetX_ui + 275 + XX, yPad + canvasOffsetY_ui + spacing * i - spacing/4, 200, spacing/2, 50 + value, color, KDTextGray2); - if (KinkyDungeonShrineBaseCosts[rep]) - KDDrawRestraintBonus(rep, canvasOffsetX_ui + 275 + XX - 70, yPad + canvasOffsetY_ui + spacing * i, undefined, 24); - - MainCanvas.textAlign = "center"; - DrawTextKD(" " + (Math.round(value)+50) + " ", canvasOffsetX_ui + 275 + XX + 100, 2+yPad + canvasOffsetY_ui + spacing * i, "white", "black"); - - if (KDFactionRepIndex < 0.1) { - if (KDRepSelectionMode == "") { - DrawButtonVis(600, 800, 250, 50, TextGet("KinkyDungeonAskRescue"), KinkyDungeonAllRestraint().length > 0 ? "white" : "#999999"); - //DrawButtonVis(1200, 800, 250, 50, TextGet("KinkyDungeonAskPenance"), "white"); - //DrawButtonVis(900, 800, 250, 50, TextGet("KinkyDungeonAskAid"), "white"); - DrawButtonVis(900, 800, 250, 50, TextGet("KinkyDungeonAskChampion"), "white"); - } else { - DrawButtonVis(900, 800, 250, 50, TextGet("KinkyDungeonBack"), "white"); - } - - if (KinkyDungeonShrineBaseCosts[rep]) { - MainCanvas.textAlign = "center"; - //DrawButtonVis(canvasOffsetX_ui + 275 + XX + 400, yPad + canvasOffsetY_ui + spacing * i - 20, 100, 40, TextGet("KinkyDungeonAid"), value > 10 ? "white" : "pink"); - if (KDRepSelectionMode == "Rescue") { - DrawButtonVis(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40, TextGet("KinkyDungeonRescue"), (KinkyDungeonCanRescue(rep, value)) ? "white" : (KinkyDungeonAllRestraint().length > 0 && !KinkyDungeonRescued[rep] ? "pink" : "#999999")); - if (MouseIn(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40)) { - DrawTextFitKD(TextGet("KinkyDungeonRescueDesc"), 1100, 900, 1250, "white", "black"); - // Rescue - } - } - if (KDRepSelectionMode == "Penance") { - DrawButtonVis(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40, TextGet("KinkyDungeonPenance"), (KinkyDungeonCanPenance(rep, value)) ? "white" : (KDGameData.KinkyDungeonPenance ? "purple" : "#999999")); - if (MouseIn(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40)) { - DrawTextFitKD(TextGet("KinkyDungeonPenanceDesc").replace("AMOUNT", "" + KinkyDungeonPenanceCost(rep)), 1100, 900, 1250, "white", "black"); - // Rescue - } - } - if (KDRepSelectionMode == "Aid") { - DrawButtonVis(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40, TextGet("KinkyDungeonAidMana"), (KinkyDungeonCanAidMana(rep, value)) ? "white" : "#999999"); - if (MouseIn(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40)) { - DrawTextFitKD(TextGet("KinkyDungeonAidManaDesc").replace("AMOUNT", "" + (KinkyDungeonAidManaCost(rep, value))).replace("MANALEVEL", "" + (KinkyDungeonAidManaAmount(rep, value) * 10)), 1100, 900, 1250, "white", "black"); - // Rescue - } - } - if (KDRepSelectionMode == "Champion") { - let isChampion = KDGameData.Champion == rep; - DrawButtonVis(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40, TextGet(isChampion ? "KinkyDungeonChampionCurrent" : "KinkyDungeonChampionSwitch"), - (isChampion) ? "white" : "#999999"); - if (MouseIn(canvasOffsetX_ui + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40)) { - DrawTextFitKD(TextGet("KinkyDungeonChampionDesc"), 1100, 900, 1250, "white", "black"); - // Rescue - } - } - - //DrawButtonVis(canvasOffsetX_ui + 275 + XX + 690, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40, TextGet("KinkyDungeonPenance"), "white"); - } - } else KDRepSelectionMode = ""; - - i++; - } - } - MainCanvas.textAlign = "center"; -} - -let KDFactionRepIndex = 0; -let KDMaxFactionsPerBar = 14; - -function KinkyDungeonDrawFactionRep() { - let i = 0; - let XX = 675; - let spacing = 42; - let yPad = 45; - let barSpacing = 375; - let tooltip = ""; - - let index = 0; - - for (let e of Object.keys(KinkyDungeonFactionRelations.Player)) { - let rep = e; - if (rep && !KinkyDungeonHiddenFactions.includes(rep)) { - index++; - if (index < KDFactionRepIndex * KDMaxFactionsPerBar + 1) continue; - if (index > KDFactionRepIndex * KDMaxFactionsPerBar + KDMaxFactionsPerBar) continue; - if (!tooltip && MouseIn(canvasOffsetX_ui + XX, yPad + canvasOffsetY_ui + spacing * i - spacing/2, barSpacing + 200, yPad)) { - tooltip = rep; - } - i++; - } - } - i = 0; - index = 0; - - DrawButtonKDEx("FactionIndexUp", () => { - KDFactionRepIndex -= 0.5; - return true; - }, KDFactionRepIndex > 0, - 1802, 140, 90, 40, "", KDFactionRepIndex > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png"); - - DrawButtonKDEx("FactionIndexDown", () => { - KDFactionRepIndex += 0.5; - return true; - }, KDFactionRepIndex < (Object.keys(KinkyDungeonFactionRelations.Player).length - KinkyDungeonHiddenFactions.length) / KDMaxFactionsPerBar, - 1802, 790, 90, 40, "", KDFactionRepIndex < (Object.keys(KinkyDungeonFactionRelations.Player).length - KinkyDungeonHiddenFactions.length) / KDMaxFactionsPerBar ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png"); - - let text = false; - - for (let e of Object.keys(KinkyDungeonFactionRelations.Player)) { - let rep = e; - MainCanvas.textAlign = "left"; - - if (rep && !KinkyDungeonHiddenFactions.includes(rep)) { - index++; - if (index < KDFactionRepIndex * KDMaxFactionsPerBar + 1) continue; - if (index > KDFactionRepIndex * KDMaxFactionsPerBar + KDMaxFactionsPerBar) continue; - - let value = KinkyDungeonFactionRelations.Player[rep]; - let color = "#ffff00"; - if (value <= -0.1) { - if (value <= -0.5) color = "#ff0000"; - else color = "#ff8800"; - } else if (value >= 0.1) { - if (value >= 0.5) color = "#00ff00"; - else color = "#88ff00"; - } - let suff = KinkyDungeonRepNameFaction(value); - let tcolor = "white"; - switch (rep) { - case "Bountyhunter": tcolor ="#448844"; break; - case "Bandit": tcolor ="orange"; break; - case "Alchemist": tcolor ="lightgreen"; break; - case "Nevermere": tcolor ="teal"; break; - case "Apprentice": tcolor ="lightblue"; break; - case "Dressmaker": tcolor ="#ceaaed"; break; - case "Witch": tcolor ="purple"; break; - case 'Elemental': tcolor ="#f1641f"; break; - case 'Dragon': tcolor ="#b9451d"; break; - case 'Maidforce': tcolor ="white"; break; - case "Bast": tcolor ="#ff0000"; break; - case "Elf": tcolor ="#42a459"; break; - //case 'Mushy': tcolor ="cyan"; break; - case 'AncientRobot': tcolor ="grey"; break; - } - - if (MouseIn(canvasOffsetX_ui + XX, yPad + canvasOffsetY_ui + spacing * i - spacing/2, barSpacing + 200, yPad)) { - let allytext = ""; - let enemytext = ""; - let friendstext = ""; - for (let ee of Object.keys(KinkyDungeonFactionRelations.Player)) { - if (!KinkyDungeonHiddenFactions.includes(ee)) { - if (rep != ee && KDFactionRelation(rep, ee) >= 0.5) { - if (allytext) allytext += ", "; - allytext += TextGet("KinkyDungeonFaction" + ee); - } - if (rep != ee && KDFactionRelation(rep, ee) > 0.15 && KDFactionRelation(rep, ee) < 0.5) { - if (friendstext) friendstext += ", "; - friendstext += TextGet("KinkyDungeonFaction" + ee); - } - if (rep != ee && KDFactionRelation(rep, ee) <= -0.5) { - if (enemytext) enemytext += ", "; - enemytext += TextGet("KinkyDungeonFaction" + ee); - } - } - } - let loc = {x: 1175, y: 812, fit: 600}; - if (KDFactionRepIndex > 0.1) { - loc = {x: canvasOffsetX_ui, y: 820, fit: 1400}; - } - if (!text) { - if (enemytext) { - text = true; - DrawTextFitKD(TextGet("KDFriendsWith") + friendstext, loc.x, loc.y, loc.fit, "white", KDTextGray1, 20); - } - if (allytext) { - text = true; - DrawTextFitKD(TextGet("KDAlliedWith") + allytext, loc.x, loc.y + 30, loc.fit, "white", KDTextGray1, 20); - } - if (enemytext) { - text = true; - DrawTextFitKD(TextGet("KDHostileWith") + enemytext, loc.x, loc.y + 60, loc.fit, "white", KDTextGray1, 20); - } - } - - } - - if (tooltip && tooltip != rep) { - tcolor = "gray"; - if (KDFactionRelation(rep, tooltip) <= -0.5) tcolor = "#ff0000"; - else if (KDFactionRelation(rep, tooltip) <= -0.25) tcolor = "orange"; - else if (KDFactionRelation(rep, tooltip) <= -0.1) tcolor = "yellow"; - else if (KDFactionRelation(rep, tooltip) >= 0.5) tcolor = "cyan"; - else if (KDFactionRelation(rep, tooltip) >= 0.25) tcolor = "#569eb8"; - else if (KDFactionRelation(rep, tooltip) >= 0.1) tcolor = "#597085"; - } else if (tooltip == rep) { - tcolor = "white"; - } - - DrawTextKD(TextGet("KinkyDungeonFaction" + rep), canvasOffsetX_ui + XX, yPad + canvasOffsetY_ui + spacing * i, tcolor, KDTextGray1); - if (suff) { - DrawTextFitKD(suff, canvasOffsetX_ui + barSpacing + XX + 250, yPad + canvasOffsetY_ui + spacing * i, 100, "white", "black"); - } - DrawProgressBar(canvasOffsetX_ui + barSpacing + XX, yPad + canvasOffsetY_ui + spacing * i - spacing/4, 200, spacing/2, 50 + value * 50, color, KDTextGray2); - - MainCanvas.textAlign = "center"; - DrawTextKD(" " + (Math.round(value * 50)+50) + " ", canvasOffsetX_ui + barSpacing + XX + 100, 1+yPad + canvasOffsetY_ui + spacing * i, "white", "black"); - - - i++; - if (i > KDMaxFactionsPerBar + 1) { - break; - } - } - - } - MainCanvas.textAlign = "center"; - return tooltip; -} - -/** - * Current costs multipliers for shrines - * @type {Record} - */ -let KinkyDungeonPenanceCosts = {}; -let KinkyDungeonPenanceRepBonus = 5; -let KinkyDungeonPenanceRepBonusFail = 1; -let KinkyDungeonPenanceCostGrowth = 50; -let KinkyDungeonPenanceCostDefault = 200; - -/** - * - * @param {string} rep - * @returns {number} - */ -function KinkyDungeonPenanceCost(rep) { - if (KinkyDungeonGoddessRep[rep]) { - if (KinkyDungeonPenanceCosts[rep]) { - return KinkyDungeonPenanceCosts[rep]; - } - } - return KinkyDungeonPenanceCostDefault; -} - -/** - * - * @param {string} rep - * @param {number} value - * @returns {boolean} - */ -function KinkyDungeonCanPenance(rep, value) { - return value < 40 && !KDGameData.KinkyDungeonPenance && KinkyDungeonBullets.length < 1; -} - -/** - * - * @param {string} rep - * @returns {number} - */ -function KinkyDungeonAidManaCost(rep, value) { - let percent = (value + 50)/100; - return Math.ceil((1 - KinkyDungeonStatMana/KinkyDungeonStatManaMax) * 15 * Math.max(0.3, Math.min(1, 1.3 - percent))); -} - -/** - * - * @param {string} rep - * @param {number} value - * @returns {number} - */ -function KinkyDungeonAidManaAmount(rep, value) { - return KinkyDungeonStatManaMax - KinkyDungeonStatMana;//1 + Math.floor(19 * (value + 50) / 100); -} - -/** - * - * @param {string} rep - * @param {number} value - * @returns {boolean} - */ -function KinkyDungeonCanAidMana(rep, value) { - return value > -30 && KinkyDungeonStatMana < KinkyDungeonStatManaMax; -} - -function KinkyDungeonRescueTiles() { - let tiles = []; - for (let X = KinkyDungeonPlayerEntity.x - 1; X <= KinkyDungeonPlayerEntity.x + 1; X++) - for (let Y = KinkyDungeonPlayerEntity.y - 1; Y <= KinkyDungeonPlayerEntity.y + 1; Y++) { - if (X != 0 || Y != 0) { - if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && KinkyDungeonNoEnemy(X, Y, true)) { - tiles.push({x:X, y:Y}); - } - } - } - return tiles; -} - -/** - * - * @param {string} rep - * @param {number} value - * @returns {boolean} - */ -function KinkyDungeonCanRescue(rep, value) { - return KinkyDungeonAllRestraint().length > 0 && value > KDRAGE && !KinkyDungeonRescued[rep] && KinkyDungeonRescueTiles().length > 0; -} - -/** - * - * @param {number} delta - */ -function KinkyDungeonUpdateAngel(delta) { - // Remove it - if (KinkyDungeonFlags.get("AngelHelp") > 0 && KinkyDungeonFlags.get("AngelHelp") < 5) { - for (let t of Object.entries(KinkyDungeonTiles)) { - if (t[1].Type == "Angel") { - let x = parseInt(t[0].split(',')[0]); - let y = parseInt(t[0].split(',')[1]); - if (x && y) { - if (t[0] == KinkyDungeonTargetTile) { - KinkyDungeonTargetTile = null; - KinkyDungeonTargetTileLocation = ""; - } - KinkyDungeonTilesDelete(t[0]); - KinkyDungeonMapSet(x, y, '0'); - } - } - } - } - if (KDGameData.KinkyDungeonPenance) { - if (!KinkyDungeonAngel()) { - KinkyDungeonCreateAngel(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - } - if (KinkyDungeonAngel()) { - KinkyDungeonAngel().gx = KinkyDungeonPlayerEntity.x; - KinkyDungeonAngel().gy = KinkyDungeonPlayerEntity.y; - if (KDGameData.KDPenanceMode == "") { - KinkyDungeonBullets = []; - if (KDGameData.KDPenanceStage == 0) { - let divineRestraints = []; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).divine) { - divineRestraints.push(inv); - } - } - if (divineRestraints.length > 0) { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonAngelUnlock"), "yellow", 3); - for (let r of divineRestraints) { - KinkyDungeonRemoveRestraint(KDRestraint(r).Group, false, false, true, true); - } - } else KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonAngelIntro"), "yellow", 2); - - } - if (KDGameData.KDPenanceStage > 1 && (KDistChebyshev(KinkyDungeonAngel().x - KinkyDungeonPlayerEntity.x, KinkyDungeonAngel().y - KinkyDungeonPlayerEntity.y) < 1.5 || KDGameData.KDPenanceStage > 3)) { - if (KinkyDungeonGold >= KDGameData.KinkyDungeonPenanceCostCurrent) { - KDGameData.KDPenanceMode = "Success"; - KDGameData.KDPenanceStage = -delta; - } else { - KDGameData.KDPenanceMode = "Anger"; - KDGameData.KDPenanceStage = -delta; - } - } if (KDGameData.KDPenanceStage > 1) { - if (KDGameData.KDPenanceStage == 1) - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonAngelWarn"), "yellow", 2); - //KinkyDungeonSlowMoveTurns = 1; - } - KDGameData.KDPenanceStage += delta; - } else if (KDGameData.KDPenanceMode == "Success") { - if (KDGameData.KDPenanceStage < 2) - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonAngel" + KDGameData.KDPenanceMode + KDGameData.KDPenanceStage), "yellow", 2); - KDGameData.KDPenanceStage += delta; - if (KinkyDungeonGold >= KDGameData.KinkyDungeonPenanceCostCurrent) { - if (KDGameData.KDPenanceStage >= 2) { - KinkyDungeonAddGold(-KDGameData.KinkyDungeonPenanceCostCurrent); - KinkyDungeonChangeRep(KDGameData.AngelCurrentRep, KinkyDungeonPenanceRepBonus); - KDGameData.KinkyDungeonPenance = false; - } - } else { - KDGameData.KDPenanceMode = "Anger"; - KDGameData.KDPenanceStage = 0; - KDGameData.KDPenanceStageEnd = 0; - } - } else if (KDGameData.KDPenanceMode == "Anger") { - if (KDGameData.KDPenanceStage < 4) - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonAngel" + KDGameData.KDPenanceMode + ("" + (KDGameData.KDPenanceStage))), "yellow", 2); - else { - KinkyDungeonAggro(KinkyDungeonAngel()); - } - KDGameData.KDPenanceStage += delta; - } - } - } - if (!KDGameData.KinkyDungeonPenance || (KinkyDungeonAngel())) { - if (KDGameData.KinkyDungeonAngel) { - KDGameData.KDPenanceStageEnd += delta; - if (!KinkyDungeonEntities.includes(KinkyDungeonAngel())) { - KDGameData.KinkyDungeonAngel = 0; - } else if (KDAllied(KinkyDungeonAngel()) && KinkyDungeonAngel() && (!KDGameData.KinkyDungeonPenance || KDHostile(KinkyDungeonAngel())) && (KDGameData.KDPenanceStageEnd > 10 && KDRandom() < 0.2)) { - KDClearItems(KinkyDungeonAngel()); - KDSpliceIndex(KinkyDungeonEntities.indexOf(KinkyDungeonAngel()), 1); - KDGameData.KinkyDungeonAngel = 0; - KDGameData.KinkyDungeonPenance = false; - } - } - } - -} - -/** - * - * @param {number} x - * @param {number} y - */ -function KinkyDungeonCreateAngel(x, y) { - let point = KinkyDungeonGetNearbyPoint(x, y, true, undefined, true); - if (point) { - let Enemy = KinkyDungeonGetEnemyByName("Angel"); - let angel = {summoned: true, Enemy: Enemy, id: KinkyDungeonGetEnemyID(), - x:point.x, y:point.y, gx: point.x, gy: point.y, - hp: (Enemy && Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0}; - KDGameData.KinkyDungeonAngel = angel.id; - KDAddEntity(angel); - } -} diff --git a/Game/KinkyDungeonRestraints.js b/Game/KinkyDungeonRestraints.js deleted file mode 100644 index aa26c766b..000000000 --- a/Game/KinkyDungeonRestraints.js +++ /dev/null @@ -1,3477 +0,0 @@ -"use strict"; -// Escape chances -// Struggle : How difficult it is to struggle out of the item. Shouldn't be below 0.1 as that would be too tedious. Negative values help protect against spells. -// Cut : How difficult it is to cut with a knife. Metal items should have 0, rope and leather should be low but possible, and stuff like tape should be high -// Remove : How difficult it is to get it off by unbuckling. Most items should have a high chance if they have buckles, medium chance if they have knots, and low chance if they have a difficult mechanism. -// Pick : How hard it is to pick the lock on the item. Higher level items have more powerful locks. The general formula is 0.33 for easy items, 0.1 for medium items, 0.05 for hard items, and 0.01 for super punishing items -// Unlock : How hard it is to reach the lock. Should be higher than the pick chance, and based on accessibility. Items like the - -// Note that there is a complex formula for how the chances are manipulated based on whether your arms are bound. Items that bind the arms are generally unaffected, and items that bind the hands are unaffected, but they do affect each other - -// Power is a scale of how powerful the restraint is supposed to be. It should roughly match the difficulty of the item, but can be higher for special items. Power 10 or higher might be totally impossible to struggle out of. - -// These are groups that the game is not allowed to remove because they were tied at the beginning -let KinkyDungeonRestraintsLocked = []; - -let KDWillEscapePenalty = 0.25; -let KDWillEscapePenaltyArms = 0.1; -let KDWillEscapePenaltyStart = 0.0; -let KDWillEscapePenaltyStartArms = 0.0; -let KDWillEscapePenaltyEnd = 0.0; - -let KDMinEscapeRate = 0.2; -let KDMinPickRate = 0.2; -let KDStruggleTime = 3; - -/** Thresholds for hand bondage */ -let StruggleTypeHandThresh = { - Struggle: 0.01, // Any hand bondage will affect struggling - Unlock: 0.85, // Keys are easy - Pick: 0.45, // Picking requires dexterity - Cut: 0.7, // Cutting requires a bit of dexterity - Remove: 0.99, // Removing only requires a solid corner -}; - -/** - * - * @returns {number} - */ -function KDGetWillPenalty() { - let perc = KinkyDungeonStatWill/KinkyDungeonStatWillMax; - let scale = 0; - let scalestart = KDWillEscapePenaltyStart; - let max = KDWillEscapePenalty; - if (!KinkyDungeonIsArmsBound(true)) { - scalestart = KDWillEscapePenaltyStartArms; - max = KDWillEscapePenaltyArms; - } - if (perc < scalestart) { - if (scalestart - KDWillEscapePenaltyEnd > 0) - scale = Math.min(1.0, (scalestart - perc) / (scalestart - KDWillEscapePenaltyEnd)); - else if (perc <= 0) scale = 1.0; - } - return scale * max; -} - -let KinkyDungeonCurrentEscapingItem = null; -let KinkyDungeonCurrentEscapingMethod = null; -let KinkyDungeonStruggleTime = 0; - -let KinkyDungeonMultiplayerInventoryFlag = false; -let KinkyDungeonItemDropChanceArmsBound = 0.2; // Chance to drop item with just bound arms and not bound hands. - -//let KinkyDungeonKnifeBreakChance = 0.15; -let KinkyDungeonKeyJamChance = 0.33; -let KinkyDungeonKeyPickBreakAmount = 12; // Number of tries per pick on average 5-11 -let KinkyDungeonKeyPickBreakAmountBase = 12; // Number of tries per pick on average 5-11 -let KinkyDungeonPickBreakProgress = 0; -let KinkyDungeonKnifeBreakAmount = 10; // Number of tries per knife on average 6-12 -let KinkyDungeonKnifeBreakAmountBase = 10; // Number of tries per knife on average 6-12 -let KinkyDungeonKnifeBreakProgress = 0; -let KinkyDungeonEnchKnifeBreakAmount = 24; // Number of tries per knife on average -let KinkyDungeonEnchKnifeBreakAmountBase = 24; // Number of tries per knife on average -let KinkyDungeonEnchKnifeBreakProgress = 0; - -let KinkyDungeonMaxImpossibleAttempts = 3; // base, more if the item is close to being impossible - -let KinkyDungeonEnchantedKnifeBonus = 0.1; // Bonus whenever you have an enchanted knife - -let KDLocksmithPickBonus = 0.15; // Locksmith bonus to pick effectiveness -let KDLocksmithBonus = 0.15; // Locksmith bonus to base escape chance -let KDLocksmithSpeedBonus = 2.0; -let KDCluelessPickBonus = -0.2; // Clueless background -let KDCluelessBonus = -0.25; // Clueless background -let KDCluelessSpeedBonus = 0.5; - -let KDFlexibleBonus = 0.1; -let KDFlexibleSpeedBonus = 1.5; -let KDInflexibleMult = 0.5; -let KDInflexibleSpeedBonus = 0.75; - -let KDUnchainedBonus = 0.12; -let KDDamselBonus = -0.2; -let KDDamselPickAmount = 6; -let KDArtistBonus = 0.15; -let KDBunnyBonus = -0.2; -let KDBunnyKnifeAmount = 5; -let KDBunnyEnchKnifeAmount = 12; -let KDSlipperyBonus = 0.15; -let KDDollBonus = -0.2; -let KDEscapeeBonus = 0.12; -let KDDragonBonus = -0.2; - -let KDStrongBonus = 0.15; -let KDWeakBonus = -0.15; - -let KDBondageLoverAmount = 1; - -/** - * @type {Map} - */ -let KinkyDungeonRestraintsCache = new Map(); - -/** - * gets a restraint - * @param {Named} item - * @returns {restraint} - */ -function KDRestraint(item) { - return KinkyDungeonRestraintsCache.get(item.name); -} - -/** - * gets a restraint - * @param {item} item - * @returns {boolean} - */ -function KDItemIsMagic(item) { - let res = KinkyDungeonRestraintsCache.get(item.name); - if (!res.magic) return false; - let disenchlevel = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Disenchant"); - return !(disenchlevel > res.power); -} - - -// Format: strict group => [list of groups the strictness applies to] -const KinkyDungeonStrictnessTable = new Map([ - ["ItemHood", ["ItemHead", "ItemEars","ItemMouth","ItemMouth2","ItemMouth3"]], - ["ItemHead", ["ItemEars","ItemMouth"]], - ["ItemMouth", ["ItemMouth"]], - ["ItemNeck", ["ItemMouth", "ItemArms"]], - ["ItemArms", ["ItemHands"]], - ["ItemHands", ["ItemHands"]], - ["ItemTorso", ["ItemArms", "ItemLegs", "ItemPelvis", "ItemBreast"]], - ["ItemLegs", ["ItemFeet", "ItemBoots"]], - ["ItemFeet", ["ItemBoots"]], -]); - -/** Enforces a sort of progression of restraining loosely based on strictness, useful for progressive stuff like applying curses to zones */ -let KDRestraintGroupProgressiveOrderStrict = [ - "ItemPelvis", // Chastity for good girls! - "ItemBreast", // Goes well with belts - "ItemTorso", // Usually just makes other restraints harder - "ItemBoots", // Typically doesnt hobble completely - "ItemEars", // Sensory - "ItemHead", // Blind, but does not stop from wielding anything - "ItemLegs", // Typically doesnt hobble completely, but sometimes does (hobbleskirts) - "ItemHands", // Blocks weapons but no spells - "ItemMouth", // Blocks spells and potions - "ItemFeet", // Makes you very slow - "ItemArms", // Blocks spells and escaping -]; - -/** A funner restraining order, starting with non-impactful then locking down spells and finally sealing in helplessness */ -let KDRestraintGroupProgressiveOrderFun = [ - "ItemPelvis", // Chastity for good girls! - "ItemBreast", // Goes well with belts - "ItemTorso", // Usually just makes other restraints harder - "ItemBoots", // Typically doesnt hobble completely - "ItemMouth", // Blocks spells and potions - "ItemHands", // Blocks weapons but no spells - "ItemLegs", // Typically doesnt hobble completely, but sometimes does (hobbleskirts) - "ItemArms", // Blocks spells and escaping - "ItemFeet", // Makes you very slow - "ItemHead", // Blind, but does not stop from wielding anything - "ItemEars", // Sensory -]; - -/** - * @type {Map} - */ -let KDRestraintsCache = new Map(); - -/** - * - * @param {entity} Entity - * @param {number} CamX - * @param {number} CamY - * @returns {void} - */ -function KinkyDungeonDrawTether(Entity, CamX, CamY) { - for (let inv of KinkyDungeonAllRestraint()) { - if (inv && KDRestraint(inv).tether && inv.tx && inv.ty) { - let vx = inv.tx; - let vy = inv.ty; - if (inv.tetherToLeasher && KinkyDungeonLeashingEnemy()) { - vx = KinkyDungeonLeashingEnemy().visual_x; - vy = KinkyDungeonLeashingEnemy().visual_y; - } - if (inv.tetherToGuard && KinkyDungeonJailGuard()) { - vx = KinkyDungeonJailGuard().visual_x; - vy = KinkyDungeonJailGuard().visual_y; - } - - //let dist = KDistEuclidean(inv.tx - Entity.visual_x, inv.ty - Entity.visual_y); - let xx = canvasOffsetX + (Entity.visual_x - CamX)*KinkyDungeonGridSizeDisplay; - let yy = canvasOffsetY + (Entity.visual_y - CamY)*KinkyDungeonGridSizeDisplay; - let txx = canvasOffsetX + (vx - CamX)*KinkyDungeonGridSizeDisplay; - let tyy = canvasOffsetY + (vy - CamY)*KinkyDungeonGridSizeDisplay; - let dx = (txx - xx); - let dy = (tyy - yy); - let dd = 0.1; // Increments - for (let d = 0; d < 1; d += dd) { - let yOffset = 30 * Math.sin(Math.PI * d); - let yOffset2 = 30 * Math.sin(Math.PI * (d + dd)); - - MainCanvas.beginPath(); - MainCanvas.lineWidth = 4; - MainCanvas.moveTo(KinkyDungeonGridSizeDisplay/2 + xx + dx*d, KinkyDungeonGridSizeDisplay*0.8 + yOffset + yy + dy*d); - MainCanvas.lineTo(KinkyDungeonGridSizeDisplay/2 + xx + dx*(d+dd), KinkyDungeonGridSizeDisplay*0.8 + yOffset2 + yy + dy*(d+dd)); - let color = KDRestraint(inv).Color[0]?.length > 3 ? KDRestraint(inv).Color[0] : KDRestraint(inv).Color; - // @ts-ignore - MainCanvas.strokeStyle = (!color || color == "Default") ? "#aaaaaa" : color; - MainCanvas.stroke(); - } - return; - } - } -} - - -function KDIsPlayerTethered(player) { - let inv = KinkyDungeonGetRestraintItem("ItemNeckRestraints"); - if (inv && KDRestraint(inv).tether && (inv.tx || inv.ty)) { - return true; - } - let found = KinkyDungeonFindID(KDGameData.KinkyDungeonLeashingEnemy); - if (!found) KDGameData.KinkyDungeonLeashingEnemy = 0; - return KDGameData.KinkyDungeonLeashedPlayer > 0; -} -function KinkyDungeonAttachTetherToEntity(dist, entity) { - let inv = KinkyDungeonGetRestraintItem("ItemNeckRestraints"); - if (inv && KDRestraint(inv).tether) { - let newLeash = inv.tetherEntity != entity.id; - inv.tetherEntity = entity.id; - if (dist) inv.tetherLength = dist; - return newLeash; - } - return false; -} - -function KDBreakTether() { - for (let pair of KinkyDungeonAllRestraintDynamic()) { - let inv = pair.item; - if (inv && KDRestraint(inv).tether) { - inv.tetherToLeasher = false; - inv.tetherToGuard = false; - inv.tetherEntity = undefined; - inv.tx = undefined; - inv.ty = undefined; - } - } -} - -let KDLeashPullCost = 0.5; -let KDLeashPullKneelTime = 5; - -/** - * - * @param {boolean} Msg - * @param {entity} Entity - * @param {number} [xTo] - * @param {number} [yTo] - * @returns {boolean} - */ -function KinkyDungeonUpdateTether(Msg, Entity, xTo, yTo) { - if (Entity.player && KinkyDungeonFlags.get("pulled")) return false; - else if (KDEnemyHasFlag(Entity, "pulled")) return false; - let exceeded = false; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).tether && (inv.tx && inv.ty || inv.tetherToLeasher || inv.tetherToGuard || inv.tetherEntity)) { - let tether = inv.tetherLength ? inv.tetherLength : KDRestraint(inv).tether; - - if (inv.tetherToLeasher && KinkyDungeonLeashingEnemy()) { - inv.tx = KinkyDungeonLeashingEnemy().x; - inv.ty = KinkyDungeonLeashingEnemy().y; - } else if (inv.tetherToLeasher && !KinkyDungeonLeashingEnemy()) { - inv.tetherToLeasher = undefined; - inv.tx = undefined; - inv.ty = undefined; - } - if (inv.tetherToGuard && KinkyDungeonJailGuard()) { - inv.tx = KinkyDungeonJailGuard().x; - inv.ty = KinkyDungeonJailGuard().y; - } else if (inv.tetherToGuard && !KinkyDungeonJailGuard()) { - inv.tetherToGuard = undefined; - inv.tx = undefined; - inv.ty = undefined; - } - if (inv.tetherEntity && KinkyDungeonFindID(inv.tetherEntity) && !KinkyDungeonIsDisabled(KinkyDungeonFindID(inv.tetherEntity))) { - inv.tx = KinkyDungeonFindID(inv.tetherEntity).x; - inv.ty = KinkyDungeonFindID(inv.tetherEntity).y; - } else if (inv.tetherEntity) { - inv.tetherEntity = undefined; - inv.tx = undefined; - inv.ty = undefined; - } - - if (inv.tx && inv.ty) KDGameData.KinkyDungeonLeashedPlayer = Math.max(KDGameData.KinkyDungeonLeashedPlayer, 5); - - if (xTo || yTo) {// This means we arre trying to move - let pathToTether = KinkyDungeonFindPath(xTo, yTo, inv.tx, inv.ty, false, !Entity.player, false, KinkyDungeonMovableTilesSmartEnemy); - let playerDist = Math.max(pathToTether?.length || 0, KDistChebyshev(xTo-inv.tx, yTo-inv.ty)); - // Fallback - if (playerDist > KDRestraint(inv).tether) { - if (Msg) KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonTetherTooShort").replace("TETHER", TextGet("Restraint" + inv.name)), "#ff0000", 2, true); - if (KinkyDungeonCanStand()) { - KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns, KDLeashPullKneelTime + KinkyDungeonSlowMoveTurns); - KinkyDungeonChangeWill(-KDLeashPullCost, false); - } - return true; - } - } else {// Then we merely update - for (let i = 0; i < 10; i++) { - // Distance is in pathing units - let pathToTether = KinkyDungeonFindPath(Entity.x, Entity.y, inv.tx, inv.ty, false, !Entity.player, false, KinkyDungeonMovableTilesSmartEnemy); - let playerDist = pathToTether?.length; - // Fallback - if (!pathToTether) playerDist = KDistChebyshev(Entity.x-inv.tx, Entity.y-inv.ty); - if (playerDist > tether) { - let slot = null; - if (pathToTether - && pathToTether?.length > 0 - && ( - KDistEuclidean(pathToTether[0].x - inv.tx, pathToTether[0].y - inv.ty) > -0.01 + KDistEuclidean(Entity.x - inv.tx, Entity.y - inv.ty) - || KinkyDungeonFindPath(pathToTether[0].x, pathToTether[0].y, inv.tx, inv.ty, false, !Entity.player, false, KinkyDungeonMovableTilesSmartEnemy)?.length < pathToTether.length - ) && KDistChebyshev(pathToTether[0].x - Entity.x, pathToTether[0].y - Entity.y) < 1.5) - slot = pathToTether[0]; - if (!slot) { - let mindist = playerDist; - for (let X = Entity.x-1; X <= Entity.x+1; X++) { - for (let Y = Entity.y-1; Y <= Entity.y+1; Y++) { - if ((X != Entity.x || Y != Entity.y) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y)) && KDistEuclidean(X-inv.tx, Y-inv.ty) < mindist) { - mindist = KDistEuclidean(X-inv.tx, Y-inv.ty); - slot = {x:X, y:Y}; - } - } - } - } - if (!slot) { //Fallback - slot = {x:inv.tx, y:inv.ty}; - } - if (slot) { - let enemy = KinkyDungeonEnemyAt(slot.x, slot.y); - if (enemy) { - let slot2 = null; - let mindist2 = playerDist; - for (let X = enemy.x-1; X <= enemy.x+1; X++) { - for (let Y = enemy.y-1; Y <= enemy.y+1; Y++) { - if ((X != enemy.x || Y != enemy.y) && !KinkyDungeonEntityAt(slot.x, slot.y) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y)) && KDistEuclidean(X-Entity.x, Y-Entity.y) < mindist2) { - mindist2 = KDistEuclidean(X-Entity.x, Y-Entity.y); - slot2 = {x:X, y:Y}; - } - } - } - if (slot2) { - KDMoveEntity(enemy, slot2.x, slot2.y, false); - } else { - let pointSwap = KinkyDungeonGetNearbyPoint(slot.x, slot.y, true, undefined, true, true); - if (pointSwap) - KDMoveEntity(enemy, pointSwap.x, pointSwap.y, false); - else - KDMoveEntity(enemy, Entity.x, Entity.y, false,undefined, undefined, true); - } - } - // Force open door - if (KinkyDungeonMapGet(slot.x, slot.y) == 'D') KinkyDungeonMapSet(slot.x, slot.y, 'd'); - - KDMoveEntity(Entity, slot.x, slot.y, false, undefined, undefined, true); - if (Entity.player) KinkyDungeonSetFlag("pulled", 1); - else KinkyDungeonSetEnemyFlag(Entity, "pulled"); - if (Entity.player) { - KinkyDungeonInterruptSleep(); - KinkyDungeonSendEvent("leashTug", {Entity: Entity, slot: slot, item: inv}); - if (KinkyDungeonLeashingEnemy()) { - KinkyDungeonSetEnemyFlag(KinkyDungeonLeashingEnemy(), "harshpull", 5); - } - if (Msg) KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonTetherPull").replace("TETHER", TextGet("Restraint" + inv.name)), "#ff0000", 2, true); - exceeded = true; - } - - } - } - } - } - } - } - - return exceeded; -} - - -/** - * Gets the length of the neck tether - * @returns {number} - */ -function KinkyDungeonTetherLength() { - let inv = KinkyDungeonGetRestraintItem("ItemNeckRestraints"); - if (inv && KDRestraint(inv).tether && inv.tx && inv.ty) { - return KDRestraint(inv).tether; - } - return undefined; -} - -/** - * - * @param {number} [modifier] - * @returns {number} - */ -function KinkyDungeonKeyGetPickBreakChance(modifier) { - let mult = (modifier) ? modifier : 1.0; - let chance = 0; - - KinkyDungeonPickBreakProgress += mult; - - if (KinkyDungeonPickBreakProgress > KinkyDungeonKeyPickBreakAmount/1.5) chance = (KinkyDungeonPickBreakProgress - KinkyDungeonKeyPickBreakAmount/1.5) / (KinkyDungeonKeyPickBreakAmount + 1); - - return chance; -} - -/** - * - * @param {number} [modifier] - * @returns {number} - */ -function KinkyDungeonGetKnifeBreakChance(modifier) { - let mult = (modifier) ? modifier : 1.0; - let chance = 0; - - KinkyDungeonKnifeBreakProgress += mult; - - if (KinkyDungeonKnifeBreakProgress > KinkyDungeonKnifeBreakAmount/1.5) chance = (KinkyDungeonKnifeBreakProgress - KinkyDungeonKnifeBreakAmount/1.5) / (KinkyDungeonKnifeBreakAmount + 1); - - return chance; -} - -/** - * - * @param {number} [modifier] - * @returns {number} - */ -function KinkyDungeonGetEnchKnifeBreakChance(modifier) { - let mult = (modifier) ? modifier : 1.0; - let chance = 0; - - KinkyDungeonEnchKnifeBreakProgress += mult; - - if (KinkyDungeonEnchKnifeBreakProgress > KinkyDungeonEnchKnifeBreakAmount/1.5) chance = (KinkyDungeonEnchKnifeBreakProgress - KinkyDungeonEnchKnifeBreakAmount/1.5) / (KinkyDungeonEnchKnifeBreakAmount + 1); - - return chance; -} - -function KinkyDungeonIsLockable(restraint) { - if (restraint && restraint.escapeChance && (restraint.escapeChance.Pick != undefined || restraint.escapeChance.Unlock != undefined)) return true; - return false; -} - -/** - * - * @param {item} item - * @param {string} lock - */ -function KinkyDungeonLock(item, lock) { - if (lock != "") { - if (KinkyDungeonIsLockable(KDRestraint(item))) { - item.lock = lock; - if (lock == "Gold") item.lockTimer = MiniGameKinkyDungeonLevel + 2; - InventoryLock(KinkyDungeonPlayer, InventoryGet(KinkyDungeonPlayer, KDRestraint(item).AssetGroup ? KDRestraint(item).AssetGroup : KDRestraint(item).Group), "IntricatePadlock", Player.MemberNumber, true); - item.pickProgress = 0; - if (ArcadeDeviousChallenge && InventoryGet(KinkyDungeonPlayer, KDRestraint(item).AssetGroup ? KDRestraint(item).AssetGroup : KDRestraint(item).Group) && !KinkyDungeonRestraintsLocked.includes(KDRestraint(item).AssetGroup ? KDRestraint(item).AssetGroup : KDRestraint(item).Group)) { - InventoryLock(Player, InventoryGet(Player, KDRestraint(item).AssetGroup ? KDRestraint(item).AssetGroup : KDRestraint(item).Group), "IntricatePadlock", null, false); - KinkyDungeonPlayerNeedsRefresh = true; - } - } - } else { - item.lock = lock; - InventoryUnlock(KinkyDungeonPlayer, KDRestraint(item).AssetGroup ? KDRestraint(item).AssetGroup : KDRestraint(item).Group); - if (!KinkyDungeonRestraintsLocked.includes( KDRestraint(item).AssetGroup ? KDRestraint(item).AssetGroup : KDRestraint(item).Group)) - InventoryUnlock(Player, KDRestraint(item).AssetGroup ? KDRestraint(item).AssetGroup : KDRestraint(item).Group); - } - -} - -/** - * Gets the curse of an item, ither intrinsic or applied - * @param {item} item - * @returns {string} - */ -function KDGetCurse(item) { - return item.curse || KDRestraint(item)?.curse; -} - -/** - * - * @param {string} shrine - * @returns {item[]} - */ -function KinkyDungeonGetRestraintsWithShrine(shrine, ignoreGold, recursive, ignoreNoShrine) { - /** - * @type {item[]} - */ - let ret = []; - - for (let item of KinkyDungeonAllRestraint()) { - if (((!KDRestraint(item).noShrine && (!KDGetCurse(item) || !KDCurses[KDGetCurse(item)].noShrine)) || ignoreNoShrine) && KDRestraint(item).shrine && KDRestraint(item).shrine.includes(shrine) && (ignoreGold || item.lock != "Gold")) { - ret.push(item); - } - if (recursive) { - let link = item.dynamicLink; - while (link) { - if (((!KDRestraint(link).noShrine && (!KDGetCurse(link) || !KDCurses[KDGetCurse(link)].noShrine)) || ignoreNoShrine) && KDRestraint(link).shrine && KDRestraint(link).shrine.includes(shrine) && (ignoreGold || link.lock != "Gold")) { - ret.push(link); - } - link = link.dynamicLink; - } - } - } - - return ret; -} - -/** - * - * @param {string} shrine - * @returns {number} - */ -function KinkyDungeonRemoveRestraintsWithShrine(shrine, maxCount, recursive, noPlayer, ignoreGold, ignoreNoShrine) { - let count = 0; - - for (let i = 0; i < (maxCount ? maxCount : 100); i++) { - /** - * @type {item[]} - */ - let items = KinkyDungeonAllRestraint().filter((r) => {return ((!KDRestraint(r).noShrine && (!KDGetCurse(r) || !KDCurses[KDGetCurse(r)].noShrine)) || ignoreNoShrine) && KDRestraint(r).shrine && KDRestraint(r).shrine.includes(shrine) && (ignoreGold || r.lock != "Gold");}); - // Get the most powerful item - let item = items.length > 0 ? items.reduce((prev, current) => (KDRestraint(prev).power * KinkyDungeonGetLockMult(prev.lock) > KDRestraint(current).power * KinkyDungeonGetLockMult(current.lock)) ? prev : current) : null; - if (item) { - KinkyDungeonRemoveRestraint(KDRestraint(item).Group, false, false, false, true, undefined, !noPlayer ? KinkyDungeonPlayerEntity : undefined); - KDSendStatus('escape', item.name, "shrine_" + shrine); - count++; - } - - if (recursive) { - // Get all items, including dynamically linked ones - items = KinkyDungeonGetRestraintsWithShrine(shrine, ignoreGold, true); - - // Get the most powerful item - item = items.length > 0 ? items.reduce((prev, current) => (KDRestraint(prev).power * KinkyDungeonGetLockMult(prev.lock) > KDRestraint(current).power * KinkyDungeonGetLockMult(current.lock)) ? prev : current) : null; - if (item) { - let groupItem = KinkyDungeonGetRestraintItem(KDRestraint(item).Group); - if (groupItem == item) { - KinkyDungeonRemoveRestraint(KDRestraint(item).Group, false, false, false, true, undefined, !noPlayer ? KinkyDungeonPlayerEntity : undefined); - KDSendStatus('escape', item.name, "shrine_" + shrine); - count++; - } else { - let host = groupItem; - let link = host.dynamicLink; - while (link) { - if (link == item) { - KinkyDungeonRemoveDynamicRestraint(host, false, false, !noPlayer ? KinkyDungeonPlayerEntity : undefined); - KDSendStatus('escape', item.name, "shrine_" + shrine); - count++; - link = null; - } else { - host = link; - link = link.dynamicLink; - } - } - } - } - } - } - - - return count; -} - -/** - * - * @param {string} shrine - * @returns {number} - */ -function KinkyDungeonUnlockRestraintsWithShrine(shrine) { - let count = 0; - - for (let item of KinkyDungeonAllRestraint()) { - if (item.lock && !KDRestraint(item).noShrine && (!KDGetCurse(item) || !KDCurses[KDGetCurse(item)].noShrine) && KDRestraint(item).shrine && KDRestraint(item).shrine.includes(shrine) && KDLocks[item.lock] && !KDLocks[item.lock].shrineImmune) { - - KinkyDungeonLock(item, ""); - count++; - } - } - - return count; -} - -/** - * - * @returns {item[]} - */ -function KinkyDungeonPlayerGetLockableRestraints() { - /** - * @type {item[]} - */ - let ret = []; - - for (let item of KinkyDungeonAllRestraint()) { - if (!item.lock && KDRestraint(item).escapeChance && KDRestraint(item).escapeChance.Pick != undefined) { - ret.push(item); - } - } - - return ret; -} - -/** - * @param {string[]} Locks - * @returns {item[]} - */ -function KinkyDungeonPlayerGetRestraintsWithLocks(Locks, recursive) { - /** - * @type {item[]} - */ - let ret = []; - - for (let itemhost of (recursive ? KinkyDungeonAllRestraintDynamic() : KinkyDungeonAllRestraint())) { - // @ts-ignore - let item = itemhost.item ? itemhost.item : itemhost; - if (item && item.lock && Locks.includes(item.lock)) { - ret.push(item); - } - } - - return ret; -} - -/** - * - * @param {string} lock - */ -function KinkyDungeonRemoveKeysUnlock(lock) { - if (KDLocks[lock]) KDLocks[lock].removeKeys({unlock: true}); -} - -/** - * - * @param {string} lock - * @returns {string} - */ -function KinkyDungeonGetKey(lock) { - if (KDLocks[lock]) return KDLocks[lock].key; - return ""; -} - -/** - * - * @returns {boolean} - */ -function KinkyDungeonHasGhostHelp() { - return ((KinkyDungeonTargetTile && ((KinkyDungeonTargetTile.Type == "Ghost" && KinkyDungeonTargetTile.GhostDecision <= 0) || KinkyDungeonTargetTile.Type == "Angel"))); -} - - -/** - * - * @returns {boolean} - */ -function KinkyDungeonHasAllyHelp() { - return (KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some( - (enemy) => { - return (KDEnemyHasFlag(enemy, "HelpMe") || enemy.Enemy.tags.alwayshelp) - && enemy.Enemy.bound - && !enemy.Enemy.tags.nohelp - && !KDHelpless(enemy) - && KDBoundEffects(enemy) < 4; - }) - || KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some((enemy) => { - return enemy.Enemy.bound - && !enemy.Enemy.tags.nohelp - && KDAllied(enemy) - && !KDHelpless(enemy) - && KDBoundEffects(enemy) < 4; - }) - ); -} - -KinkyDungeonSetFlag("HelpMeFlag", 20); -/** - * - * @returns {boolean} - */ -function KinkyDungeonHasAngelHelp() { - return (KinkyDungeonTargetTile && KinkyDungeonTargetTile.Type == "Angel"); -} - -/** - * - * @returns {boolean} - */ -function KinkyDungeonIsWearingLeash() { - for (let restraint of KinkyDungeonAllRestraint()) { - if (KDRestraint(restraint) && KDRestraint(restraint).leash) { - return true; - } - } - return false; -} - -let KDAffinityList = ["Hook", "Edge", "Sticky", "Sharp"]; - -/** - * - * @param {boolean} Message - Show a message? - * @param {string} affinity - * @returns {boolean} - */ -function KinkyDungeonGetAffinity(Message, affinity, group) { - let effectTiles = KDGetEffectTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - let groupIsHigh = !group || ( - group.startsWith("ItemM") - || group == "ItemArms" - || (group == "ItemHands" || !KinkyDungeonIsArmsBound()) - || group == "ItemEars" - || group == "ItemHood" - || group == "ItemHead" - || group == "ItemNeck" - || group == "ItemNeckAccessories" - || group == "ItemNeckRestraints" - ); - let canStand = KinkyDungeonCanStand(); - if (effectTiles) - for (let t of Object.values(effectTiles)) { - if (t.affinities && t.affinities.includes(affinity)) return true; - else if (canStand && groupIsHigh && t.affinitiesStanding && t.affinitiesStanding.includes(affinity)) return true; - } - if (affinity == "Hook") { - let tile = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - if (tile == '?') { - if (canStand && groupIsHigh) return true; - else KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonHookHighFail"), "#ff0000", 2); - } else if (KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y - 1) == ',') return true; - return KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp(); - } else if (affinity == "Edge") { - for (let X = KinkyDungeonPlayerEntity.x - 1; X <= KinkyDungeonPlayerEntity.x + 1; X++) { - for (let Y = KinkyDungeonPlayerEntity.y - 1; Y <= KinkyDungeonPlayerEntity.y + 1; Y++) { - let tile = KinkyDungeonMapGet(X, Y); - if (tile == 'A' - || tile == 'a' - || tile == 'c' - || tile == 'O' - || tile == '-' - || tile == '=' - || tile == '+' - || tile == 'o' - || tile == 'B') { - return true; - } else if (tile == 'C' && Message) { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonNeedOpenChest"), "#ff0000", 2, true); - } - } - } - return KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp(); - } else if (affinity == "Sticky") { - return KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp(); - } else if (affinity == "Sharp") { - if (((KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && KinkyDungeonAllWeapon().some((inv) => {return KDWeapon(inv).light && KDWeapon(inv).cutBonus != undefined;})) || KinkyDungeonWeaponCanCut(true)) return true; - if (KinkyDungeonAllWeapon().some((inv) => {return KDWeapon(inv).light && KDWeapon(inv).cutBonus != undefined;}) && (!KinkyDungeonIsArmsBound() || KinkyDungeonStatsChoice.has("Psychic") || KinkyDungeonWallCrackAndKnife(false))) return true; - let tile = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - if (tile == '/') { - if (Message) - KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonScrapUse"), "lightgreen", 2); - return true; - } - for (let X = KinkyDungeonPlayerEntity.x - 1; X <= KinkyDungeonPlayerEntity.x + 1; X++) { - for (let Y = KinkyDungeonPlayerEntity.y - 1; Y <= KinkyDungeonPlayerEntity.y + 1; Y++) { - let tile2 = KinkyDungeonMapGet(X, Y); - if (tile2 == '-' - || tile == 'a') { - if (Message) - KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonScrapObjectUse"), "lightgreen", 2); - return true; - } - } - } - return false; - } - return KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp(); -} - -function KinkyDungeonWallCrackAndKnife(Message) { - for (let X = KinkyDungeonPlayerEntity.x - 1; X <= KinkyDungeonPlayerEntity.x + 1; X++) { - for (let Y = KinkyDungeonPlayerEntity.y - 1; Y <= KinkyDungeonPlayerEntity.y + 1; Y++) { - if (X == KinkyDungeonPlayerEntity.x || Y == KinkyDungeonPlayerEntity.y) { - let tile = KinkyDungeonMapGet(X, Y); - if (tile == '4' || tile == '\\') { - if (!KinkyDungeonIsArmsBound(true) || KinkyDungeonCanStand()) { - if (Message) { - if (!KinkyDungeonIsArmsBound(true)) - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonUseCrack"), "lightgreen", 2, true); - else KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonUseCrackLegs"), "lightgreen", 2, true); - } - return true; - } else { - if (Message) { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonNeedCrack"), "#ff0000", 2, true); - } - return false; - } - } - } - } - } - return false; -} - -/** - * Determines if the entire dynamic item tree has at least one inaccessable item - * @param {item} item - * @returns {boolean} - */ -function KDIsTreeAccessible(item) { - let link = item; - while (link && KDRestraint(link)) { - if (KDRestraint(link).inaccessible) return false; - link = link.dynamicLink; - } - return true; -} - -/** - * Determines if the entire dynamic item tree has at least one chastity item - * @param {item} item - * @returns {boolean} - */ -function KDIsTreeChastity(item) { - let link = item; - while (link && KDRestraint(link)) { - if (KDRestraint(link).chastity) return false; - link = link.dynamicLink; - } - return true; -} - -/** - * Determines if the entire dynamic item tree has at least one chastity bra item - * @param {item} item - * @returns {boolean} - */ -function KDIsTreeChastityBra(item) { - let link = item; - while (link && KDRestraint(link)) { - if (KDRestraint(link).chastitybra) return false; - link = link.dynamicLink; - } - return true; -} - -/** - * - * @param {string} Group - Group - * @param {boolean} [External] - By enemies or by player? - * @returns {boolean} - */ -// @ts-ignore -function KDGroupBlocked(Group, External) { - if (KinkyDungeonPlayerTags.get("ChastityLower") && ["ItemVulva", "ItemVulvaPiercings", "ItemButt"].includes(Group)) return true; - if (KinkyDungeonPlayerTags.get("ChastityUpper") && ["ItemNipples", "ItemNipplesPiercings"].includes(Group)) return true; - if (KinkyDungeonPlayerTags.get("Block_" + Group)) return true; - - if (Group.includes("ItemHands")) { - let arms = KinkyDungeonGetRestraintItem("ItemArms"); - if (arms && !KDIsTreeAccessible(arms)) return true; - } - - return false; - //let device = null; - - //if (device && KDRestraint(device) && KDRestraint(device).enclose) return true; - -} - -/** - * @param {string} Group - * @param {boolean} External - * @return {item[]} - * Gets a list of restraints blocking this group */ -function KDGetBlockingRestraints(Group, External) { - // Create the storage system - /** @type {Map} */ - let map = new Map(); - let all = KinkyDungeonAllRestraintDynamic(); - // For this section we just create a set of items that block this one - if (KinkyDungeonPlayerTags.get("ChastityLower") && ["ItemVulva", "ItemVulvaPiercings", "ItemButt"].includes(Group)) { - for (let item of all) { - if (!map.get(item.item) && (KDRestraint(item.item)?.chastity)) { - map.set(item.item, true); - } - } - } - if (KinkyDungeonPlayerTags.get("ChastityUpper") && ["ItemNipples", "ItemNipplesPiercings"].includes(Group)) { - for (let item of all) { - if (!map.get(item.item) && (KDRestraint(item.item)?.chastitybra)) { - map.set(item.item, true); - } - } - } - if (KinkyDungeonPlayerTags.get("Block_" + Group)) { - for (let item of all) { - if (!map.get(item.item) && KDRestraint(item.item)?.shrine?.includes("Block_" + Group)) { - map.set(item.item, true); - } - } - } - - if (Group.includes("ItemHands")) { - let arms = KinkyDungeonGetRestraintItem("ItemArms"); - if (arms) { - let link = arms; - while (link && KDRestraint(link)) { - if (KDRestraint(link).inaccessible && !map.get(link)) { - map.set(link, true); - } - link = link.dynamicLink; - } - } - } - - // Return restraints still in the list - return [...map.keys()]; -} - -/** - * @param {string} Group - * @param {boolean} External - * @return {item[]} - * Gets a list of restraints with Security that block this */ -function KDGetBlockingSecurity(Group, External) { - let items = KDGetBlockingRestraints(Group, External); - items = items.filter((item) => { - return KDRestraint(item)?.Security != undefined; - }); - return items; -} - -function KinkyDungeonCanUseKey() { - return !KinkyDungeonIsHandsBound(true, false, 0.7) || KinkyDungeonStatsChoice.has("Psychic"); -} - -/** - * - * @param {boolean} [ApplyGhost] - Can you receive help in this context? - * @param {boolean} [Other] - Is this on yourself or another? - * @param {number} Threshold - Threshold - * @returns {boolean} - */ -function KinkyDungeonIsHandsBound(ApplyGhost, Other, Threshold = 0.99) { - /*let blocked = InventoryItemHasEffect(InventoryGet(KinkyDungeonPlayer, "ItemHands"), "Block", true) || KDGroupBlocked("ItemHands"); - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).bindhands) { - blocked = true; - break; - } - }*/ - let blocked = KDHandBondageTotal() > Threshold; - let help = ApplyGhost && (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()); - if (!Other && (!ApplyGhost || !(help)) && KinkyDungeonStatsChoice.get("Butterfingers") && KinkyDungeonIsArmsBound(ApplyGhost, Other)) return true; - return (!ApplyGhost || !(help)) && - blocked; -} - -/** - * Returns the total level of hands bondage, 1.0 or higher meaning unable to use hands - * @return {number} - The bindhands level, sum of all bindhands properties of worn restraints - */ -function KDHandBondageTotal() { - let total = 0; - for (let rest of KinkyDungeonAllRestraintDynamic()) { - let inv = rest.item; - if (KDRestraint(inv).bindhands) total += KDRestraint(inv).bindhands; - } - return total; -} - -/** - * - * @returns {boolean} - */ -function KinkyDungeonCanUseFeet() { - return KinkyDungeonStatsChoice.get("Flexible") && KinkyDungeonSlowLevel < 1; -} - -/** - * - * @param {boolean} [ApplyGhost] - * @param {boolean} [Other] - Is this on yourself or another? - * @returns {boolean} - */ -function KinkyDungeonIsArmsBound(ApplyGhost, Other) { - let blocked = InventoryItemHasEffect(InventoryGet(KinkyDungeonPlayer, "ItemArms"), "Block", true) || KDGroupBlocked("ItemArms"); - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).bindarms) { - blocked = true; - break; - } - } - return (!ApplyGhost || !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp())) && - blocked; -} - -/** - * - * @param {boolean} ApplyGhost - * @param {string} Group - * @param {item} [excludeItem] - * @returns {number} - */ -function KinkyDungeonStrictness(ApplyGhost, Group, excludeItem) { - if (ApplyGhost && (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp())) return 0; - let strictness = 0; - for (let invItem of KinkyDungeonAllRestraint()) { - let inv = invItem; - while (inv) { - if (inv != excludeItem && ((KDRestraint(inv).strictness && KDRestraint(inv).strictness > strictness))) { - let strictGroups = KDRestraint(inv).strictnessZones || KinkyDungeonStrictnessTable.get(KDRestraint(inv).Group); - if (strictGroups) { - for (let s of strictGroups) { - if (s == Group) { - if (KDRestraint(inv).strictness > strictness) - strictness = KDRestraint(inv).strictness; - break; - } - } - } - } - inv = inv.dynamicLink; - } - } - return strictness; -} - -/** - * Gets the list of restraint nammes affecting the Group - * @param {string} Group - * @param {item} excludeItem - * @returns {string[]} - */ -function KinkyDungeonGetStrictnessItems(Group, excludeItem) { - let list = []; - for (let invItem of KinkyDungeonAllRestraint()) { - let inv = invItem; - while (inv) { - if (inv != excludeItem && KDRestraint(inv).strictness) { - let strictGroups = KDRestraint(inv).strictnessZones || KinkyDungeonStrictnessTable.get(KDRestraint(inv).Group); - if (strictGroups) { - for (let s of strictGroups) { - if (s == Group) { - // Add the top item - if (KDRestraint(inv).strictness) - list.push(KDRestraint(inv).name); - // Add the items underneath it!! - break; - } - } - } - } - inv = inv.dynamicLink; - } - } - return list; -} - - -/** - * - * @returns {number} - */ -function KinkyDungeonGetPickBaseChance() { - let bonus = 0; - if (KinkyDungeonStatsChoice.get("Locksmith")) bonus += KDLocksmithPickBonus; - if (KinkyDungeonStatsChoice.get("Clueless")) bonus += KDCluelessPickBonus; - if (KinkyDungeonStatsChoice.get("LocksmithMaster")) bonus += 0.15; - return 0.33 / (1.0 + 0.02 * MiniGameKinkyDungeonLevel) + bonus; -} - -/** - * - * @returns {number} - */ -function KinkyDungeonGetPickBonus() { - let bonus = 0; - if (KinkyDungeonStatsChoice.get("Locksmith")) bonus += KDLocksmithBonus; - if (KinkyDungeonStatsChoice.get("Clueless")) bonus += KDCluelessBonus; - if (KinkyDungeonStatsChoice.get("LocksmithMaster")) bonus += 0.15; - return bonus; -} - -/** - * - * @returns {boolean} - */ -function KinkyDungeonPickAttempt() { - let Pass = "Fail"; - let escapeChance = KinkyDungeonGetPickBaseChance(); - let cost = KinkyDungeonStatStaminaCostPick; - let wcost = KinkyDungeonStatWillCostPick; - let lock = KinkyDungeonTargetTile.Lock; - if (!KinkyDungeonTargetTile.pickProgress) KinkyDungeonTargetTile.pickProgress = 0; - - if (!lock) return; - - KinkyDungeonInterruptSleep(); - - if (KDLocks[lock] && !KDLocks[lock].pickable) { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggleCantPick" + lock + "Lock"), "orange", 2, true); - Pass = "Fail"; - } - - let handsBound = KinkyDungeonIsHandsBound(false, true, 0.55) && !KinkyDungeonCanUseFeet(); - let armsBound = KinkyDungeonIsArmsBound(); - let strict = KinkyDungeonStrictness(false, "ItemHands"); - if (!strict) strict = 0; - if (!KinkyDungeonPlayer.CanInteract()) escapeChance /= 2; - if (armsBound) escapeChance = Math.max(0.0, escapeChance - 0.25); - if (handsBound && strict < 0.5) escapeChance = Math.max(0, escapeChance - 0.5); - else if (strict) escapeChance = Math.max(0, escapeChance - strict); - - escapeChance /= 1.0 + KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax*KinkyDungeonDistractionUnlockSuccessMod; - - let chargecosts = true; - if (wcost > 0 && !KinkyDungeonHasWill(-wcost, false)) { - chargecosts = false; - KinkyDungeonSendActionMessage(10, TextGet("KDWillStruggle"), "#ff0000", 2, true); - } else if (!KinkyDungeonHasStamina(-cost, true)) { - chargecosts = false; - KinkyDungeonWaitMessage(true); - } else if (KinkyDungeonTargetTile && KinkyDungeonTargetTile.pickProgress >= 1){//KDRandom() < escapeChance - Pass = "Success"; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Unlock.ogg"); - } else if (KDLocks[lock] && KDLocks[lock].breakChance({})) { // Blue locks cannot be picked or cut! - Pass = "Break"; - KinkyDungeonLockpicks -= 1; - KinkyDungeonPickBreakProgress = 0; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/PickBreak.ogg"); - } else if (!KinkyDungeonStatsChoice.get("Psychic") && (handsBound || (armsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound))) { - KinkyDungeonDropItem({name: "Pick"}, KinkyDungeonPlayerEntity, true); - KinkyDungeonLockpicks -= 1; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Miss.ogg"); - } else { - KinkyDungeonTargetTile.pickProgress += escapeChance; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Pick.ogg"); - } - KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonAttemptPick" + Pass).replace("TargetRestraint", TextGet("KinkyDungeonObject")), (Pass == "Success") ? "lightgreen" : "#ff0000", 1); - if (chargecosts) { - KinkyDungeonChangeStamina(cost, 1); - KinkyDungeonChangeWill(wcost); - } - return Pass == "Success"; -} - -/** - * - * @param {string} lock - * @returns {boolean} - */ -function KinkyDungeonUnlockAttempt(lock) { - let Pass = "Fail"; - let escapeChance = 1.0; - - KinkyDungeonInterruptSleep(); - - let handsBound = KinkyDungeonIsHandsBound(false, true, 0.85) && !KinkyDungeonCanUseFeet(); - let armsBound = KinkyDungeonIsArmsBound(); - let strict = KinkyDungeonStrictness(false, "ItemHands"); - if (!strict) strict = 0; - if (!KinkyDungeonPlayer.CanInteract()) escapeChance /= 2; - if (armsBound) escapeChance = Math.max(0.1, escapeChance - 0.25); - if (handsBound && strict < 0.5) escapeChance = Math.max(0, escapeChance - 0.5); - else if (strict) escapeChance = Math.max(0, escapeChance - strict); - - if (KinkyDungeonStatsChoice.get("Psychic")) escapeChance = Math.max(escapeChance, 0.33); - if (KDRandom() < escapeChance) - Pass = "Success"; - KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonStruggleUnlock" + Pass).replace("TargetRestraint", TextGet("KinkyDungeonObject")), (Pass == "Success") ? "lightgreen" : "#ff0000", 1); - if (Pass == "Success") { - KinkyDungeonRemoveKeysUnlock(lock); - if (KDLocks[lock] && KDLocks[lock].loot_special && KinkyDungeonTargetTile && KinkyDungeonTargetTile.Loot == "normal") KinkyDungeonSpecialLoot = true; - else if (KDLocks[lock] && KDLocks[lock].loot_locked && KinkyDungeonTargetTile && KinkyDungeonTargetTile.Loot == "normal") KinkyDungeonLockedLoot = true; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Unlock.ogg"); - return true; - } else if (!KinkyDungeonStatsChoice.get("Psychic") && (handsBound || (armsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound))) { - let keytype = KinkyDungeonGetKey(lock); - if (keytype) { - KinkyDungeonDropItem({name: keytype+"Key"}, KinkyDungeonPlayerEntity, true); - KDLocks[lock].removeKeys({dropped: true}); - } - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Miss.ogg"); - } else { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Pick.ogg"); - } - return false; -} - -/** Gets the affinity of a restraint */ -function KDGetRestraintAffinity(item, data) { - data.item = item; - data.affinity = ""; - data.overrideAffinity = false; - if (KDRestraint(item) && KDRestraint(item).affinity) { - if (KDRestraint(item).affinity[data.StruggleType]) { - for (let a of KDRestraint(item).affinity[data.StruggleType]) { - data.affinity = a; - if (KinkyDungeonGetAffinity(false, a, data.StruggleGroup)) break; - } - } - } - KinkyDungeonSendEvent("beforeAffinityCalc", data); - if (!data.overrideAffinity && data.affinity == "") { - switch (data.StruggleType) { - case "Struggle": data.affinity = "Hook"; break; - case "Remove": data.affinity = "Edge"; break; - case "Cut": data.affinity = "Sharp"; break; - case "Pick": data.affinity = ""; break; - case "Unlock": data.affinity = "Sticky"; break; - } - } - return data.affinity; -} - -/** - * - */ -function KDGetEscapeChance(restraint, StruggleType, escapeChancePre, limitChancePre, ApplyGhost, ApplyPlayerBonus, Msg) { - let escapeChance = escapeChancePre != undefined ? escapeChancePre : KDRestraint(restraint).escapeChance[StruggleType] != undefined ? KDRestraint(restraint).escapeChance[StruggleType] : 1.0; - let limitChance = limitChancePre != undefined ? limitChancePre : (KDRestraint(restraint).limitChance != undefined && KDRestraint(restraint).limitChance[StruggleType] != undefined) ? KDRestraint(restraint).limitChance[StruggleType] : - ((StruggleType == "Unlock" || StruggleType == "Pick") ? 0 : 0.05); - - if ((!ApplyGhost || !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp())) && !ApplyPlayerBonus) { - if (StruggleType == "Pick") { - if (KinkyDungeonStatsChoice.get("Locksmith")) escapeChance += KDLocksmithBonus; - if (KinkyDungeonStatsChoice.get("Clueless")) escapeChance += KDCluelessBonus; - } else if (StruggleType == "Remove" || StruggleType == "Unlock") { - if (KinkyDungeonStatsChoice.get("Flexible")) escapeChance += KDFlexibleBonus; - if (KinkyDungeonStatsChoice.get("Inflexible")) escapeChance *= KDInflexibleMult; - } else if (StruggleType == "Struggle") { - if (KinkyDungeonStatsChoice.get("Strong")) escapeChance += KDStrongBonus; - if (KinkyDungeonStatsChoice.get("Weak")) escapeChance += KDWeakBonus; - } - } - - if (KinkyDungeonStatsChoice.get("Unchained") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Metal")) - escapeChance += KDUnchainedBonus; - if (KinkyDungeonStatsChoice.get("Damsel") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Metal")) { - if (escapeChance > 0) - escapeChance /= 1.5; - if (StruggleType != "Pick" && StruggleType != "Unlock" && limitChance > 0 && limitChance < KDDamselBonus) - limitChance = KDDamselBonus; - } - if (KinkyDungeonStatsChoice.get("HighSecurity")) { - KinkyDungeonKeyPickBreakAmount = KDDamselPickAmount; - } else { - KinkyDungeonKeyPickBreakAmount = KinkyDungeonKeyPickBreakAmountBase; - } - - if (KinkyDungeonStatsChoice.get("FreeSpirit") && (KDRestraint(restraint).chastity || KDRestraint(restraint).chastitybra)) escapeChance += 0.5; - if (KinkyDungeonStatsChoice.get("Artist") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Rope")) - escapeChance += KDArtistBonus; - if (KinkyDungeonStatsChoice.get("Bunny") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Rope")) { - if (escapeChance > 0) - escapeChance /= 1.5; - if (StruggleType != "Pick" && StruggleType != "Unlock" && limitChance > 0 && limitChance < KDBunnyBonus) - limitChance = KDBunnyBonus; - } - if (KinkyDungeonStatsChoice.get("ShoddyKnives")) { - KinkyDungeonKnifeBreakAmount = KDBunnyKnifeAmount; - KinkyDungeonEnchKnifeBreakAmount = KDBunnyEnchKnifeAmount; - } else { - KinkyDungeonKnifeBreakAmount = KinkyDungeonKnifeBreakAmountBase; - KinkyDungeonEnchKnifeBreakAmount = KinkyDungeonEnchKnifeBreakAmountBase; - } - - if (KinkyDungeonStatsChoice.get("Slippery") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Latex")) - escapeChance += KDSlipperyBonus; - else if (KinkyDungeonStatsChoice.get("Doll") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Latex")) { - if (escapeChance > 0) - escapeChance /= 1.5; - if (StruggleType != "Pick" && StruggleType != "Unlock" && limitChance > 0 && limitChance < KDDollBonus) - limitChance = KDDollBonus; - } - - if (KinkyDungeonStatsChoice.get("Escapee") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Leather")) - escapeChance += KDEscapeeBonus; - else if (KinkyDungeonStatsChoice.get("Dragon") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Leather")) { - if (escapeChance > 0) - escapeChance /= 1.5; - if (StruggleType != "Pick" && StruggleType != "Unlock" && limitChance > 0 && limitChance < KDDragonBonus) - limitChance = KDDragonBonus; - } - - let data = { - restraint: restraint, - escapeChance: escapeChance, - limitChance: limitChance, - struggleType: StruggleType, - escapeChancePre: escapeChancePre, - limitChancePre: limitChancePre, - ApplyGhost: ApplyGhost, - ApplyPlayerBonus: ApplyPlayerBonus, - GoddessBonus: 0, - Msg: Msg, - - }; - - let GoddessBonus = KDGetItemGoddessBonus(restraint, data); - //if (data.escapeChance > 0) - //data.escapeChance *= Math.max(0, 1 + GoddessBonus); - //else - //data.escapeChance /= Math.max(0.1, 1 + GoddessBonus); - data.escapeChance += GoddessBonus; - data.GoddessBonus = GoddessBonus; - - KinkyDungeonSendEvent("perksStruggleCalc", data); - - return { - escapeChance: data.escapeChance, - limitChance: data.limitChance, - escapeChanceData: data, - }; - -} - -let KDUnboundAffinityOverride = { - "Sticky": true, - "Edge": true, - "Hook": true, -}; - -function KDGetDynamicItem(group, index) { - let restraint = KinkyDungeonGetRestraintItem(group); - let host = restraint; - if (index) { - let surfaceItems = KDDynamicLinkListSurface(restraint); - if (surfaceItems[index]) { - host = surfaceItems[index - 1]; - restraint = surfaceItems[index]; - } - else console.log("Error! Please report the item combination and screenshot to Ada!"); - } - return {restraint: restraint, host: host}; -} - -// Lockpick = use tool or cut -// Otherwise, just a normal struggle -/** - * - * @param {string} struggleGroup - * @param {string} StruggleType - * @returns {string} - */ -function KinkyDungeonStruggle(struggleGroup, StruggleType, index) { - let restraint = KinkyDungeonGetRestraintItem(struggleGroup); - let host = restraint; - if (index) { - let surfaceItems = KDDynamicLinkListSurface(restraint); - if (surfaceItems[index]) { - host = surfaceItems[index - 1]; - restraint = surfaceItems[index]; - } - else console.log("Error! Please report the item combination and screenshot to Ada!"); - } - let failSuffix = ""; - if (restraint && KDRestraint(restraint).failSuffix && KDRestraint(restraint).failSuffix[StruggleType]) { - failSuffix = KDRestraint(restraint).failSuffix[StruggleType]; - } - if (!restraint) return "Fail"; - KinkyDungeonCurrentEscapingItem = restraint; - KinkyDungeonCurrentEscapingMethod = StruggleType; - KinkyDungeonStruggleTime = CommonTime() + 750; - let Pass = "Fail"; - let restraintEscapeChancePre = KDRestraint(restraint).escapeChance[StruggleType] != undefined ? KDRestraint(restraint).escapeChance[StruggleType] : 1.0; - let helpChance = (KDRestraint(restraint).helpChance != undefined && KDRestraint(restraint).helpChance[StruggleType] != undefined) ? KDRestraint(restraint).helpChance[StruggleType] : 0.0; - let limitChance = (KDRestraint(restraint).limitChance != undefined && KDRestraint(restraint).limitChance[StruggleType] != undefined) ? KDRestraint(restraint).limitChance[StruggleType] : - ((StruggleType == "Unlock" || StruggleType == "Pick") ? 0 : 0.05); - if (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) { - KinkyDungeonSetFlag("HelpMeFlag", 8); - if (helpChance) - restraintEscapeChancePre = helpChance; - limitChance = 0; - } - if (KinkyDungeonHasAngelHelp()) { - restraintEscapeChancePre += 0.1; - } - - let affinity = KDGetRestraintAffinity(restraint, {StruggleType: StruggleType}); - - /** - * @type {{ - * restraint: item, - * struggleType: string, - * struggleGroup: string, - * escapeChance: number, - * origEscapeChance: number, - * helpChance: number, - * limitChance: number, - * strict: number, - * cutSpeed: number, - * affinity: string, - * hasAffinity: boolean, - * restraintEscapeChance: number, - * cost: number, - * wcost: number, - * escapePenalty: number, - * willEscapePenalty: number, - * canCutMagic: boolean, - * }} - */ - let data = { - restraint: restraint, - struggleType: StruggleType, - struggleGroup: struggleGroup, - escapeChance: restraintEscapeChancePre, - origEscapeChance: restraintEscapeChancePre, - limitChance: limitChance, - helpChance: helpChance, - cutSpeed: 0.25, - affinity: affinity, - strict: KinkyDungeonStrictness(true, struggleGroup, restraint), - hasAffinity: KinkyDungeonGetAffinity(true, affinity, struggleGroup), - restraintEscapeChance: KDRestraint(restraint).escapeChance[StruggleType], - cost: KinkyDungeonStatStaminaCostStruggle, - wcost: KinkyDungeonStatWillCostStruggle, - escapePenalty: 0, - willEscapePenalty: KDGetWillPenalty(), - canCutMagic: KinkyDungeonWeaponCanCut(true, true), - }; - - if (StruggleType == "Cut") data.cost = KinkyDungeonStatStaminaCostTool; - else if (StruggleType == "Pick") data.cost = KinkyDungeonStatStaminaCostPick; - else if (StruggleType == "Remove") data.cost = KinkyDungeonStatStaminaCostRemove; - else if (StruggleType == "Unlock") data.cost = KinkyDungeonStatStaminaCostPick; - if (StruggleType == "Cut") data.wcost = KinkyDungeonStatWillCostTool; - else if (StruggleType == "Pick") data.wcost = KinkyDungeonStatWillCostPick; - else if (StruggleType == "Remove") data.wcost = KinkyDungeonStatWillCostRemove; - else if (StruggleType == "Unlock") data.wcost = KinkyDungeonStatWillCostUnlock; - if (StruggleType == "Unlock") data.cost = 0; - KinkyDungeonSendEvent("beforeStruggleCalc", data); - if (!restraint.pickProgress) restraint.pickProgress = 0; - if (!restraint.struggleProgress) restraint.struggleProgress = 0; - if (!restraint.unlockProgress) restraint.unlockProgress = 0; - if (!restraint.cutProgress) restraint.cutProgress = 0; - let EC = KDGetEscapeChance(restraint, StruggleType, data.escapeChance, data.limitChance, true, true, true); - data.escapeChance = EC.escapeChance; - data.limitChance = EC.limitChance; - - data.origEscapeChance = data.escapeChance; - - KinkyDungeonInterruptSleep(); - - let increasedAttempts = false; - - let handsBound = KinkyDungeonIsHandsBound(true, false, StruggleTypeHandThresh[StruggleType]) && !KinkyDungeonCanUseFeet(); - - // Bonuses go here. Buffs dont get added to orig escape chance, but - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostStruggle")) data.escapeChance += KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostStruggle"); - if (StruggleType == "Cut") { - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostCutting")) data.escapeChance += KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostCutting"); - if (data.hasAffinity) { - if (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp() || !KinkyDungeonPlayerDamage) { - let maxBonus = 0; - let weaponsToTest = KinkyDungeonAllWeapon();//KinkyDungeonCanUseWeapon() ? KinkyDungeonAllWeapon() : [KinkyDungeonPlayerDamage]; - for (let inv of weaponsToTest) { - if (KDWeapon(inv).cutBonus > maxBonus) maxBonus = KDWeapon(inv).cutBonus; - if (KDWeapon(inv).cutBonus != undefined && KDWeapon(inv).magic) data.canCutMagic = true; - } - data.escapeChance += maxBonus; - data.origEscapeChance += maxBonus; - } else if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.cutBonus) { - data.escapeChance += KinkyDungeonPlayerDamage.cutBonus; - data.origEscapeChance += KinkyDungeonPlayerDamage.cutBonus; - } - } - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostCuttingMinimum")) data.escapeChance = Math.max(data.escapeChance, KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostCuttingMinimum")); - } - if (StruggleType == "Cut" && !KDRestraint(restraint).magic && KinkyDungeonWeaponCanCut(true, true)) { - data.escapeChance += KinkyDungeonEnchantedKnifeBonus; - data.origEscapeChance += KinkyDungeonEnchantedKnifeBonus; - } - let escapeSpeed = 2.0; - - // Finger extensions will help if your hands are unbound. Some items cant be removed without them! - // Mouth counts as a finger extension on your hands if your arms aren't tied - let armsBound = KinkyDungeonIsArmsBound(true); - let armsBoundOverride = false; - let handsBoundOverride = false; - - if (KDUnboundAffinityOverride[affinity] && (!handsBound || handsBoundOverride) && (!armsBound || armsBoundOverride)) data.hasAffinity = true; - - if (StruggleType == "Remove" && - (!handsBound && (KinkyDungeonWeaponCanCut(true) || KinkyDungeonLockpicks > 0) - || (struggleGroup == "ItemHands" && KinkyDungeonCanTalk() && !armsBound))) { - data.escapeChance = Math.max(data.escapeChance, Math.min(1, data.escapeChance + 0.15)); - data.origEscapeChance = Math.max(data.origEscapeChance, Math.min(1, data.origEscapeChance + 0.15)); - } - - // You can tug using unbound hands - // REMOVED due to same thing as Unbound Affinity Override - /*if (StruggleType == "Struggle" && - (!handsBound && !armsBound && struggleGroup != "ItemHands" && struggleGroup != "ItemArms")) { - escapeSpeed *= 1.4; - data.escapeChance = Math.max(data.escapeChance, Math.min(1, data.escapeChance + 0.05)); - data.origEscapeChance = Math.max(data.origEscapeChance, Math.min(1, data.origEscapeChance + 0.05)); - }*/ - - // Psychic doesnt modify original chance, so that you understand its the perk helping you - if (StruggleType == "Unlock" && KinkyDungeonStatsChoice.get("Psychic")) data.escapeChance = Math.max(data.escapeChance, 0.25); - - let edgeBonus = 0.12; - if (StruggleType == "Struggle" && data.hasAffinity) data.escapeChance += edgeBonus; - - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Lockdown")) { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonBuffLockdownTry") - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 1); - data.escapeChance -= KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Lockdown") * 0.1; - } - - if ((StruggleType == "Struggle") && !data.hasAffinity && data.escapeChance <= 0 && data.escapeChance >= -edgeBonus && (!KDRestraint(restraint).alwaysEscapable || !KDRestraint(restraint).alwaysEscapable.includes(StruggleType))) { - let typesuff = ""; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Struggle.ogg"); - if (affinity && !KinkyDungeonGetAffinity(false, affinity, struggleGroup)) typesuff = "Wrong" + affinity; - if (typesuff == "" && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) typesuff = typesuff + "Aroused"; - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggle" + StruggleType + "NeedEdge" + typesuff) - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2, true); - KinkyDungeonLastAction = "Struggle"; - KinkyDungeonSendEvent("struggle", { - restraint: restraint, - group: struggleGroup, - struggleType: StruggleType, - result: "NeedEdge", - }); - return "NeedEdge"; - } - - let removeFail = (data.struggleType == "Unlock" || data.struggleType == "Pick") && !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && KDGetEscapeChance(restraint, "Remove", undefined, undefined, false, false).escapeChance <= 0; - - if (removeFail) data.escapeChance = 0; - - if (data.escapeChance <= 0) { - if (!restraint.attempts) restraint.attempts = 0; - if (restraint.attempts < KinkyDungeonMaxImpossibleAttempts) { - increasedAttempts = true; - restraint.attempts += 1; - if (data.escapeChance <= -0.5) restraint.attempts += 1; - } else { - let typesuff = ""; - if (removeFail || (data.origEscapeChance <= 0 && data.helpChance)) typesuff = "3"; - else if (KDRestraint(restraint).specStruggleTypes && KDRestraint(restraint).specStruggleTypes.includes(StruggleType)) typesuff = "2"; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Struggle.ogg"); - if (typesuff == "" && failSuffix) typesuff = failSuffix; - if (typesuff == "" && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) typesuff = typesuff + "Aroused"; - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggle" + StruggleType + "Impossible" + typesuff) - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2, true); - if (EC.escapeChanceData.GoddessBonus < 0 && EC.escapeChanceData.escapeChance < 0 && EC.escapeChance - EC.escapeChanceData.GoddessBonus > 0) { - KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonStruggle" + StruggleType + "ImpossibleGoddess") - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2, true); - } - - if (KinkyDungeonHasStamina(-data.cost)) { - KinkyDungeonLastAction = "Struggle"; - KinkyDungeonSendEvent("struggle", { - restraint: restraint, - group: struggleGroup, - struggleType: StruggleType, - result: "Impossible", - }); - KinkyDungeonChangeStamina(data.cost, true, 1); - KinkyDungeonChangeWill(data.wcost); - if (KinkyDungeonStatsChoice.get("BondageLover")) KinkyDungeonChangeDistraction(KDBondageLoverAmount, false, 0.5); - } - KinkyDungeonAdvanceTime(1); - return "Impossible"; - } - } - - // Struggling is unaffected by having arms bound - let minAmount = 0.1 - Math.max(0, 0.01*KDRestraint(restraint).power); - if (StruggleType == "Remove" && !data.hasAffinity) minAmount = 0; - if (!(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && StruggleType != "Struggle" && (struggleGroup != "ItemArms" && struggleGroup != "ItemHands" ) && (handsBound || armsBound)) data.escapeChance /= 1.5; - if (StruggleType != "Struggle" && struggleGroup != "ItemArms" && armsBound) data.escapeChance = Math.max(minAmount, data.escapeChance - 0.3); - - // Covered hands makes it harder to unlock, and twice as hard to remove - if (((StruggleType == "Pick" && !KinkyDungeonStatsChoice.get("Psychic")) || StruggleType == "Unlock" || StruggleType == "Remove") && struggleGroup != "ItemHands" && handsBound) - data.escapeChance = (StruggleType == "Remove" && data.hasAffinity) ? data.escapeChance / 2 : Math.max(0, data.escapeChance - 0.5); - - if (StruggleType == "Unlock" && KinkyDungeonStatsChoice.get("Psychic")) data.escapeChance = Math.max(data.escapeChance, 0.2); - - if ((StruggleType == "Remove") && !data.hasAffinity && data.escapeChance == 0 && (!KDRestraint(restraint).alwaysEscapable || !KDRestraint(restraint).alwaysEscapable.includes(StruggleType))) { - let typesuff = ""; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Struggle.ogg"); - if (affinity && !KinkyDungeonGetAffinity(false, affinity, struggleGroup)) typesuff = "Wrong" + affinity; - if (typesuff == "" && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) typesuff = typesuff + "Aroused"; - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggle" + StruggleType + "NeedEdge" + typesuff) - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2, true); - KinkyDungeonLastAction = "Struggle"; - KinkyDungeonSendEvent("struggle", { - restraint: restraint, - group: struggleGroup, - struggleType: StruggleType, - result: "NeedEdge", - }); - return "NeedEdge"; - } - - let possible = data.escapeChance > 0; - // Strict bindings make it harder to escape - if (data.strict) data.escapeChance = Math.max(0, data.escapeChance - data.strict); - - if (StruggleType == "Unlock" && KinkyDungeonStatsChoice.get("Psychic")) data.escapeChance = Math.max(data.escapeChance, 0.2); - - if (possible && data.escapeChance == 0 && (!KDRestraint(restraint).alwaysEscapable || !KDRestraint(restraint).alwaysEscapable.includes(StruggleType))) { - let typesuff = ""; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Struggle.ogg"); - if (typesuff == "" && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) typesuff = typesuff + "Aroused"; - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggle" + StruggleType + "Strict" + typesuff) - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2, true); - KinkyDungeonLastAction = "Struggle"; - KinkyDungeonSendEvent("struggle", { - restraint: restraint, - group: struggleGroup, - struggleType: StruggleType, - result: "Strict", - }); - return "Strict"; - } - - // Reduce cutting power if you dont have hands - if (StruggleType == "Cut" && !KinkyDungeonWeaponCanCut(true) && KinkyDungeonIsHandsBound(true)) { - if (KinkyDungeonAllWeapon().some((inv) => {return KDWeapon(inv).light && KDWeapon(inv).cutBonus != undefined;})) { - if (KinkyDungeonWallCrackAndKnife(true)) { - data.escapeChance *= 0.92; - } else if (!KinkyDungeonIsArmsBound(true)) { - data.escapeChance *= 0.7; - } else if (KinkyDungeonStatsChoice.get("Psychic")) { - data.escapeChance *= 0.55; - } else if (data.hasAffinity) { - data.escapeChance *= 0.4; - } else { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonNeedGrip"), "#ff0000", 2, true); - data.escapeChance *= 0.0; - } - } else if (data.hasAffinity) data.escapeChance *= 0.4; - else data.escapeChance = 0; - - data.escapeChance = Math.max(0, data.escapeChance - 0.05); - - } - - if (!(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && (StruggleType == "Pick" || StruggleType == "Unlock" || StruggleType == "Remove")) data.escapeChance /= 1.0 + KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax*KinkyDungeonDistractionUnlockSuccessMod; - - if (KDGroupBlocked(struggleGroup) && !KDRestraint(restraint).alwaysStruggleable) data.escapeChance = 0; - - // Blue locks make it harder to escape an item - let lockType = restraint.lock && KDLocks[restraint.lock] ? KDLocks[restraint.lock] : null; - - if (lockType && lockType.penalty && lockType.penalty[StruggleType]) data.escapeChance = Math.max(0, data.escapeChance - lockType.penalty[StruggleType]); - - if (StruggleType == "Cut" && struggleGroup != "ItemHands" && handsBound) - data.escapeChance = data.escapeChance / 2; - - // Struggling is affected by tightness - if (data.escapeChance > 0 && StruggleType == "Struggle") { - for (let T = 0; T < restraint.tightness; T++) { - data.escapeChance *= 0.8; // Tougher for each tightness, however struggling will reduce the tightness - } - } - - if (StruggleType == "Pick") data.escapeChance += KinkyDungeonGetPickBonus(); - - if (StruggleType == "Unlock" && KinkyDungeonStatsChoice.get("Psychic")) data.escapeChance = Math.max(data.escapeChance, 0.15); - - if (data.escapePenalty > 0) { - data.escapeChance = Math.max(0, data.escapeChance - data.escapePenalty); - } - - let belt = null; - let bra = null; - - if (struggleGroup == "ItemVulva" || struggleGroup == "ItemVulvaPiercings" || struggleGroup == "ItemButt") belt = KinkyDungeonGetRestraintItem("ItemPelvis"); - if (belt && KDRestraint(belt) && KDRestraint(belt).chastity) data.escapeChance = 0.0; - - if (struggleGroup == "ItemNipples" || struggleGroup == "ItemNipplesPiercings") bra = KinkyDungeonGetRestraintItem("ItemBreast"); - if (bra && KDRestraint(bra) && KDRestraint(bra).chastitybra) data.escapeChance = 0.0; - - - if (data.escapeChance <= 0 && (!KDRestraint(restraint).alwaysEscapable || !KDRestraint(restraint).alwaysEscapable.includes(StruggleType))) { - if (!restraint.attempts) restraint.attempts = 0; - if (restraint.attempts < KinkyDungeonMaxImpossibleAttempts || increasedAttempts) { - if (!increasedAttempts) { - restraint.attempts += 0.5; - if (data.escapeChance <= -0.5) restraint.attempts += 0.5; - } - } else { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Struggle.ogg"); - let suff = ""; - if (suff == "" && failSuffix) suff = failSuffix; - if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) suff = suff + "Aroused"; - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggle" + StruggleType + "ImpossibleBound" + suff) - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2, true); - - - if (KinkyDungeonHasStamina(-data.cost)) { - KinkyDungeonLastAction = "Struggle"; - KinkyDungeonSendEvent("struggle", { - restraint: restraint, - group: struggleGroup, - struggleType: StruggleType, - result: "Impossible", - }); - KinkyDungeonChangeStamina(data.cost, true, 1); - KinkyDungeonChangeWill(data.wcost); - if (KinkyDungeonStatsChoice.get("BondageLover")) KinkyDungeonChangeDistraction(KDBondageLoverAmount, false, 0.5); - } - KinkyDungeonAdvanceTime(1); - return "Impossible"; - } - } - - if (KDRestraint(restraint) && KDRestraint(restraint).escapeMult != undefined) data.escapeChance *= KDRestraint(restraint).escapeMult; - - if (KDRestraint(restraint) && KDRestraint(restraint).struggleMult && KDRestraint(restraint).struggleMult[StruggleType] != undefined) - data.escapeChance *= KDRestraint(restraint).struggleMult[StruggleType]; - - if (data.escapeChance > 0) { - // Min struggle speed is always 0.05 = 20 struggle attempts - let minSpeed = (KDRestraint(restraint).struggleMinSpeed && KDRestraint(restraint).struggleMinSpeed[StruggleType]) ? KDRestraint(restraint).struggleMinSpeed[StruggleType] : 0.05; - data.escapeChance = Math.max(data.escapeChance, minSpeed); - } - - if (KDRestraint(restraint) && KDRestraint(restraint).struggleMaxSpeed && KDRestraint(restraint).struggleMaxSpeed[StruggleType] != undefined) - data.escapeChance = Math.min(data.escapeChance, KDRestraint(restraint).struggleMaxSpeed[StruggleType]); - - // Handle cases where you can't even attempt to unlock or pick - if (lockType && (StruggleType == "Unlock" && !lockType.canUnlock(data)) - || (StruggleType == "Pick" && lockType && !lockType.pickable)) { - if (StruggleType == "Unlock") - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggleUnlockNo" + restraint.lock + "Key") - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "orange", 2, true); - else - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggleCantPick" + restraint.lock + "Lock") - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "orange", 2, true); - } else { - - // Limit of what you can struggle to given current limit chance - let maxLimit = 100; - - - // Main struggling block - if ((data.wcost > 0 && !KinkyDungeonHasWill(-data.wcost, false)) && (data.escapeChance <= data.willEscapePenalty && !KinkyDungeonHasWill(0.01, false))) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.NoWill) ? KDRestraint(restraint).sfxEscape.NoWill : "Struggle") - + ".ogg"); - KinkyDungeonSendActionMessage(10, TextGet("KDWillStruggle") - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2, true); - KinkyDungeonLastAction = "Struggle"; - KinkyDungeonSendEvent("struggle", { - restraint: restraint, - group: struggleGroup, - struggleType: StruggleType, - result: "Will", - }); - return "Will"; - } else if (!KinkyDungeonHasStamina(-data.cost, true)) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.NoStamina) ? KDRestraint(restraint).sfxEscape.NoStamina : "Struggle") - + ".ogg"); - KinkyDungeonWaitMessage(true); - } else if (data.escapeChance > 0) { - - let extraLim = (StruggleType == "Pick" && lockType.pick_lim) ? Math.max(0, lockType.pick_lim) : 0; - let extraLimPenalty = (StruggleType == "Pick") ? extraLim * restraint.pickProgress : 0; - let extraLimThreshold = Math.min(1, (data.escapeChance / extraLim)); - // One last check: check limits - if ((data.limitChance > 0 || extraLim > 0) && data.escapeChance > 0) { - let threshold = 0.75; - if (data.limitChance > data.escapeChance) { - threshold = Math.min(threshold, 0.9*(data.escapeChance / data.limitChance)); - } - let limitProgress = restraint.struggleProgress ? (StruggleType == "Struggle" ? - (restraint.struggleProgress < threshold ? threshold * restraint.struggleProgress : 1.0) : - Math.min(1, 1.15 - 1.15 * restraint.struggleProgress)) - : (StruggleType == "Struggle" ? 0 : 1); - let limitPenalty = Math.max(0, Math.min(1, limitProgress) * data.limitChance, extraLimPenalty); - let maxPossible = 1; - if ((data.limitChance > 0 && data.limitChance > data.escapeChance && StruggleType == "Struggle")) { - // Find the intercept - maxPossible = threshold; - } - if (extraLim > data.escapeChance) { - // Find the intercept - maxPossible = Math.min(extraLimThreshold, maxPossible); - } - - - // Prevent struggling past this - if (maxPossible < 1) maxLimit = maxPossible; - - if (extraLimPenalty > 0 && extraLimPenalty > limitPenalty) { - data.escapeChance -= extraLimPenalty; - if (data.escapeChance <= 0) { - // Replace with frustrated moan later~ - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Struggle.ogg"); - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeon" + StruggleType + "Limit") - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2, true); - KinkyDungeonLastAction = "Struggle"; - KinkyDungeonSendEvent("struggle", { - restraint: restraint, - group: struggleGroup, - struggleType: StruggleType, - result: "LimitExtra", - }); - return "LimitExtra"; - } - } else if (limitPenalty > 0) { - data.escapeChance -= limitPenalty; - if (data.escapeChance <= 0) { - // Replace with frustrated moan later~ - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Struggle.ogg"); - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeon" + StruggleType + "Limit") - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2, true); - KinkyDungeonLastAction = "Struggle"; - KinkyDungeonSendEvent("struggle", { - restraint: restraint, - group: struggleGroup, - struggleType: StruggleType, - result: "Limit", - }); - return "Limit"; - } - } - } - - if (data.escapeChance > 0 && KinkyDungeonHasWill(0.01, false)) { - data.escapeChance -= data.willEscapePenalty; - if (data.escapeChance <= 0) { - // Replace with frustrated moan later~ - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.NoWill) ? KDRestraint(restraint).sfxEscape.NoWill : "Struggle") - + ".ogg"); - KinkyDungeonSendActionMessage(10, TextGet("KDWillStruggle") - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2, true); - KinkyDungeonLastAction = "Struggle"; - KinkyDungeonSendEvent("struggle", { - restraint: restraint, - group: struggleGroup, - struggleType: StruggleType, - result: "Will", - }); - return "Will"; - } - } - - if (data.escapeChance <= 0) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Struggle.ogg"); - // Replace with frustrated moan later~ - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeon" + StruggleType + "Barely") - .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2, true); - KinkyDungeonLastAction = "Struggle"; - KinkyDungeonSendEvent("struggle", { - restraint: restraint, - group: struggleGroup, - struggleType: StruggleType, - result: "Barely", - }); - return "Barely"; - } - - // Pass block - let progress = restraint.cutProgress ? restraint.cutProgress : 0; - let struggleTime = KinkyDungeonStatsChoice.get("FranticStruggle") ? 1 : KDStruggleTime; - if (KinkyDungeonStatsChoice.get("FranticStruggle")) data.cost *= 1.5; - - if (((StruggleType == "Cut" && progress >= 1 - data.escapeChance) - || (StruggleType == "Pick" && restraint.pickProgress >= 1 - data.escapeChance) - || (StruggleType == "Unlock" && restraint.unlockProgress >= 1 - data.escapeChance) - || (StruggleType == "Remove" && progress >= 1 - data.escapeChance) - || (progress >= 1 - data.escapeChance)) - && !(StruggleType == "Pick" && lockType && !lockType.canPick(data))) { - Pass = "Success"; - KDSuccessRemove(StruggleType, restraint, lockType, index, data, host); - } else { - // Failure block for the different failure types - if (StruggleType == "Cut") { - if (((handsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound) || (armsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound)) && KinkyDungeonWeaponCanCut(true) && KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.name) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.KnifeDrop) ? KDRestraint(restraint).sfxEscape.KnifeDrop : "Miss") - + ".ogg"); - Pass = "Drop"; - KinkyDungeonDisarm(KinkyDungeonPlayerEntity, "Cut"); - } else { - if (KDItemIsMagic(restraint) && !data.canCutMagic) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.NoMagic) ? KDRestraint(restraint).sfxEscape.NoMagic : "SoftShield") - + ".ogg"); - Pass = "Fail"; - } else { - if (KDToggles.Sound) { - if (KDItemIsMagic(restraint)) - AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.MagicCut) ? KDRestraint(restraint).sfxEscape.MagicCut : "Cut") - + ".ogg"); - else AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.Cut) ? KDRestraint(restraint).sfxEscape.Cut : "Cut") - + ".ogg"); - } - let mult = 1.0 - 0.9 * Math.min(1.0, progress); - if (KinkyDungeonStatsChoice.get("Flexible")) mult *= KDFlexibleSpeedBonus; - if (KinkyDungeonStatsChoice.get("Inflexible")) mult *= KDInflexibleSpeedBonus; - // Speed = minimum for cutting - let speed = data.cutSpeed * mult + Math.max(0, data.escapeChance) * 0.5; - mult *= 0.75 + 0.25 * (KinkyDungeonStatWill / KinkyDungeonStatWillMax); - KDAddDelayedStruggle( - escapeSpeed * speed * (0.3 + 0.2 * KDRandom() + 0.6 * Math.max(0, (KinkyDungeonStatStamina)/KinkyDungeonStatStaminaMax)), - struggleTime, StruggleType, struggleGroup, index, data, - restraint.cutProgress, maxLimit - ); - if (speed > 0) { - let debris = ""; - let debrisFlag = KDRestraint(restraint).Group + "deb"; - if (!KinkyDungeonFlags.get(debrisFlag)) { - if (KDRestraint(restraint)?.debris && KDRandom() < KDRestraint(restraint)?.debrisChance ? KDRestraint(restraint)?.debrisChance : 1.0) debris = KDRestraint(restraint)?.debris; - } - - if (debris) { - KinkyDungeonSetFlag(debrisFlag, 4); - KDCreateDebris(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, { - aoe: 1.5, - dist: 0.5, - kind: debris, - number: 1, - }); - } - } - } - } - } else if (StruggleType == "Pick") { - if (lockType && lockType.breakChance(data)) { // Chance to break pick - Pass = "Break"; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.PickBreak) ? KDRestraint(restraint).sfxEscape.PickBreak : "PickBreak") - + ".ogg"); - KinkyDungeonLockpicks -= 1; - KinkyDungeonPickBreakProgress = 0; - } else if (!KinkyDungeonStatsChoice.get("Psychic") && (handsBound || (armsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound))) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.PickDrop) ? KDRestraint(restraint).sfxEscape.PickDrop : "Miss") - + ".ogg"); - Pass = "Drop"; - KinkyDungeonDropItem({name: "Pick"}, KinkyDungeonPlayerEntity, true); - KinkyDungeonLockpicks -= 1; - } else { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.Pick) ? KDRestraint(restraint).sfxEscape.Pick : "Pick") - + ".ogg"); - if (!restraint.pickProgress) restraint.pickProgress = 0; - let mult = 0.5 + 0.6 * (progress); - if (KinkyDungeonStatsChoice.get("Locksmith")) mult *= KDLocksmithSpeedBonus; - if (KinkyDungeonStatsChoice.get("Clueless")) mult *= KDCluelessSpeedBonus; - mult *= 0.5 + 0.5 * (KinkyDungeonStatWill / KinkyDungeonStatWillMax); - KDAddDelayedStruggle( - escapeSpeed * mult * (data.escapeChance > 0 ? (KDMinPickRate * (data.escapeChance > 0.5 ? 2 : 1)) : 0) * (0.8 + 0.4 * KDRandom() - 0.4 * Math.max(0, (KinkyDungeonStatDistraction)/KinkyDungeonStatDistractionMax)), - struggleTime, StruggleType, struggleGroup, index, data, - restraint.pickProgress, maxLimit - ); - } - } else if (StruggleType == "Unlock") { - if (!KinkyDungeonStatsChoice.get("Psychic") && (handsBound || (armsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound))) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.KeyDrop) ? KDRestraint(restraint).sfxEscape.KeyDrop : "Miss") - + ".ogg"); - Pass = "Drop"; - let keytype = KinkyDungeonGetKey(restraint.lock); - if (keytype) { - KinkyDungeonDropItem({name: keytype+"Key"}, KinkyDungeonPlayerEntity, true); - KinkyDungeonRemoveKeysUnlock(restraint.lock); - } - } else { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.Pick) ? KDRestraint(restraint).sfxEscape.Pick : "Pick") - + ".ogg"); - let mult = 0.2 + 1.8 * (progress); - if (KinkyDungeonStatsChoice.get("Flexible")) mult *= KDFlexibleSpeedBonus; - if (KinkyDungeonStatsChoice.get("Inflexible")) mult *= KDInflexibleSpeedBonus; - mult *= 0.5 + 0.5 * (KinkyDungeonStatWill / KinkyDungeonStatWillMax); - KDAddDelayedStruggle( - escapeSpeed * mult * Math.max(data.escapeChance > 0 ? KDMinEscapeRate : 0, data.escapeChance) * (0.8 + 0.4 * KDRandom() - 0.4 * Math.max(0, (KinkyDungeonStatDistraction)/KinkyDungeonStatDistractionMax)), - struggleTime, StruggleType, struggleGroup, index, data, - restraint.unlockProgress, maxLimit - ); - } - } else if (StruggleType == "Remove") { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.Remove) ? KDRestraint(restraint).sfxEscape.Remove : "Struggle") - + ".ogg"); - let mult = 0.3 + 1.7 * (progress * progress); - if (KinkyDungeonStatsChoice.get("Flexible")) mult *= KDFlexibleSpeedBonus; - if (KinkyDungeonStatsChoice.get("Inflexible")) mult *= KDInflexibleSpeedBonus; - mult *= 0.75 + 0.25 * (KinkyDungeonStatWill / KinkyDungeonStatWillMax); - KDAddDelayedStruggle( - escapeSpeed * mult * Math.max(data.escapeChance > 0 ? KDMinEscapeRate : 0, data.escapeChance) * (0.8 + 0.4 * KDRandom() - 0.3 * Math.max(0, (KinkyDungeonStatDistraction)/KinkyDungeonStatDistractionMax)), - struggleTime, StruggleType, struggleGroup, index, data, - restraint.struggleProgress, maxLimit - ); - } else if (StruggleType == "Struggle") { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxEscape && KDRestraint(restraint).sfxEscape.Struggle) ? KDRestraint(restraint).sfxEscape.Struggle : "Struggle") - + ".ogg"); - let mult = 1.25 - 0.75 * (progress); - if (KinkyDungeonStatsChoice.get("Flexible")) mult *= KDFlexibleSpeedBonus; - if (KinkyDungeonStatsChoice.get("Inflexible")) mult *= KDInflexibleSpeedBonus; - mult *= 0.5 + 0.5 * (KinkyDungeonStatWill / KinkyDungeonStatWillMax); - KDAddDelayedStruggle( - escapeSpeed * mult * Math.max(data.escapeChance > 0 ? KDMinEscapeRate : 0, data.escapeChance) * (0.5 + 0.4 * KDRandom() + 0.3 * Math.max(0, (KinkyDungeonStatStamina)/KinkyDungeonStatStaminaMax)), - struggleTime, StruggleType, struggleGroup, index, data, - restraint.struggleProgress, maxLimit - ); - } - } - } - - // Aftermath - let suff = ""; - if (Pass == "Fail" && data.escapeChance > 0 && data.origEscapeChance <= 0) { - if ((KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && data.helpChance) suff = "3"; - else suff = "2"; - } else if (Pass == "Fail") { - if (suff == "" && failSuffix) suff = failSuffix; - } - if ((suff == "" || (Pass == "Fail" && suff == failSuffix)) && (Pass == "Fail" || Pass == "Success") && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) suff = suff + "Aroused"; - - if (Pass != "Success") - KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonStruggle" + StruggleType + Pass + suff).replace("TargetRestraint", TextGet("Restraint" + KDRestraint(restraint).name)), (Pass == "Success") ? "lightgreen" : "#ff0000", 2); - - if (KinkyDungeonHasStamina(-data.cost)) { - KinkyDungeonChangeStamina(data.cost, true, 1); - KinkyDungeonChangeWill(data.wcost); - if (KinkyDungeonStatsChoice.get("BondageLover")) KinkyDungeonChangeDistraction(KDBondageLoverAmount, false, 0.5); - - if (Pass != "Success") { - // Reduce the progress - if (StruggleType == "Struggle") { - restraint.pickProgress = Math.max(0, restraint.pickProgress * 0.5 - 0.01); - restraint.unlockProgress = Math.max(0, restraint.unlockProgress * 0.5 - 0.01); - } else if (StruggleType == "Pick") { - restraint.unlockProgress = Math.max(0, restraint.unlockProgress * 0.5 - 0.01); - } else if (StruggleType == "Unlock") { - restraint.pickProgress = Math.max(0, restraint.pickProgress* 0.5 - 0.01); - } if (StruggleType == "Remove") { - restraint.pickProgress = Math.max(0, restraint.pickProgress* 0.5 - 0.01); - restraint.unlockProgress = Math.max(0, restraint.unlockProgress * 0.5 - 0.01); - } - - // reduces the tightness of the restraint slightly - if (StruggleType == "Struggle") { - let tightness_reduction = 1; - - // eslint-disable-next-line no-unused-vars - for (let _item of KinkyDungeonAllRestraint()) { - tightness_reduction *= 0.8; // Reduced tightness reduction for each restraint currently worn - } - - restraint.tightness = Math.max(0, restraint.tightness - tightness_reduction); - } - } else if (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) - KinkyDungeonChangeRep("Ghost", 1); - - - KinkyDungeonSendEvent("struggle", { - restraint: restraint, - group: struggleGroup, - struggleType: StruggleType, - result: Pass, - }); - KinkyDungeonLastAction = "Struggle"; - if (StruggleType == "Struggle") { - KinkyDungeonMakeNoise(4, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - KinkyDungeonAlert = 3; - } - } - - KinkyDungeonAdvanceTime(1); - if (Pass == "Success") KinkyDungeonCurrentEscapingItem = null; - return Pass; - } - return "Impossible"; -} - -/** - * "Return the first restraint item in the game that belongs to the given group." - * @param {string} group - The group of the restraint item you want to get. - * @param {number} [index] - The index of the restraint item you want to get. - * @returns {item} The item that matches the group. - */ -function KinkyDungeonGetRestraintItem(group, index) { - for (let item of KinkyDungeonAllRestraint()) { - if (item.type == Restraint && KDRestraint(item).Group == group) { - if (index) { - let link = item; - let count = 0; - while (count < index && link) { - count += 1; - link = link.dynamicLink; - } - if (count == index) return link; - return null; - } - return item; - } - } - return null; -} - -/** - * Refreshes the restraints map - */ -function KinkyDungeonRefreshRestraintsCache() { - KinkyDungeonRestraintsCache = new Map(); - for (let r of KinkyDungeonRestraints) { - KinkyDungeonRestraintsCache.set(r.name, r); - } -} - - -/** - * - * @param {string} Name - * @returns {restraint} - */ -function KinkyDungeonGetRestraintByName(Name) { - if (KinkyDungeonRestraintsCache.size > 0) { - return KinkyDungeonRestraintsCache.get(Name); - } else { - KinkyDungeonRefreshRestraintsCache(); - return KinkyDungeonRestraintsCache.get(Name); - } -} - -/** - * - * @param {string} Lock - * @returns {number} - */ -function KinkyDungeonGetLockMult(Lock) { - if (KDLocks[Lock]) return KDLocks[Lock].lockmult; - - return 1; -} - -/** Tags which the 'agnostic' option on KinkyDungeonGetRestraint does not override */ -let KDNoOverrideTags = [ - "NoVibes", - "Unmasked", - "Unchained", - "Damsel", -]; -/** - * - * @param {KDHasTags} enemy - * @param {*} Level - * @param {*} Index - * @param {*} Bypass - * @param {*} Lock - * @param {*} RequireWill - * @param {*} LeashingOnly - * @param {*} NoStack - * @param {*} extraTags - * @param {*} agnostic - Determines if playertags and current bondage are ignored - * @param {entity} [securityEnemy] - Bypass is treated separately for these groups - * @param {{minPower?: number, maxPower?: number, onlyLimited?: boolean, noUnlimited?: boolean, noLimited?: boolean, onlyUnlimited?: boolean, ignore?: string[], require?: string[], looseLimit?: boolean, ignoreTags?: string[]}} [filter] - Filters for items - * @returns {{restraint: restraint, weight: number}[]} - */ -function KDGetRestraintsEligible(enemy, Level, Index, Bypass, Lock, RequireWill, LeashingOnly, NoStack, extraTags, agnostic, filter, securityEnemy) { - let RestraintsList = []; - - if (KinkyDungeonStatsChoice.has("NoWayOut")) RequireWill = false; - let willPercent = (KinkyDungeonStatWill / KinkyDungeonStatWillMax - 0.15 * KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax) - /(1 + (KinkyDungeonGoddessRep.Ghost + 50)/100); - - if (KinkyDungeonSlowLevel > 0) willPercent = willPercent * (0.6 + 0.4 * Math.min(1, Math.max(0, 1 - KinkyDungeonSlowLevel/3))); - - let tags = new Map(); - if (enemy.tags.length) { - for (let t of enemy.tags) { - tags.set(t, true); - } - } else { - for (let t of Object.keys(enemy.tags)) { - tags.set(t, true); - } - } - if (extraTags) - for (let t of Object.entries(extraTags)) { - if (Level >= t[1]) - tags.set(t[0], true); - } - - if (filter?.ignoreTags) { - for (let ft of filter.ignoreTags) { - tags.delete(ft); - } - } - - let arousalMode = KinkyDungeonStatsChoice.get("arousalMode"); - let cache = []; - for (let restraint of KinkyDungeonRestraints) { - let effLevel = Level; - if (KinkyDungeonStatsChoice.has("TightRestraints")) { - effLevel *= KDTightRestraintsMult; - effLevel += KDTightRestraintsMod; - } - if ((effLevel >= restraint.minLevel || KinkyDungeonNewGame > 0 || filter?.require?.includes(restraint.name)) && (!restraint.maxLevel || effLevel < restraint.maxLevel) && (restraint.allFloors || restraint.floors[Index])) { - if (!restraint.arousalMode || arousalMode) { - let enabled = false; - let weight = 0; - for (let t of tags.keys()) - if (restraint.enemyTags[t] != undefined) { - weight += restraint.enemyTags[t]; - enabled = true; - } - if (enabled) { - cache.push({r: restraint, w:weight}); - } - } - } - } - - for (let r of cache) { - let restraint = r.r; - if (filter) { - if (filter.maxPower && r.r.power > filter.maxPower && (!filter.looseLimit || !r.r.unlimited)) continue; - if (filter.minPower && r.r.power < filter.minPower && (!filter.looseLimit || !r.r.limited) && !r.r.unlimited) continue; - if (filter.onlyUnlimited && r.r.limited) continue; - if (filter.noUnlimited && r.r.unlimited) continue; - if (filter.noLimited && r.r.limited) continue; - if (filter.onlyLimited && !r.r.limited && !r.r.unlimited) continue; - if (filter.ignore && filter.ignore.includes(r.r.name)) continue; - if (filter.require && !filter.require.includes(r.r.name)) continue; - } - if ((!LeashingOnly || (restraint.Group == "ItemNeck" || restraint.Group == "ItemNeckRestraints")) - && (!RequireWill || !restraint.maxwill || willPercent <= restraint.maxwill || (LeashingOnly && (restraint.Group == "ItemNeck" || restraint.Group == "ItemNeckRestraints")))) - if (agnostic || KDCanAddRestraint(restraint, Bypass, Lock, NoStack, undefined, KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, securityEnemy)) { - if (restraint.playerTags) - for (let tag in restraint.playerTags) - if ((!agnostic || !KDNoOverrideTags.includes(tag)) && KinkyDungeonPlayerTags.get(tag)) r.w += restraint.playerTags[tag]; - - if (r.w > 0) - RestraintsList.push({ - restraint: restraint, - weight: r.w, - }); - } - } - - return RestraintsList; -} - -/** - * - * @param {KDHasTags} enemy - * @param {*} Level - * @param {*} Index - * @param {*} Bypass - * @param {*} Lock - * @param {*} RequireWill - * @param {*} LeashingOnly - * @param {*} NoStack - * @param {*} extraTags - * @param {*} agnostic - Determines if playertags and current bondage are ignored - * @param {entity} [securityEnemy] - Bypass is treated separately for these groups - * @param {{minPower?: number, maxPower?: number, onlyLimited?: boolean, noUnlimited?: boolean, noLimited?: boolean, onlyUnlimited?: boolean, ignore?: string[], require?: string[], looseLimit?: boolean, ignoreTags?: string[]}} [filter] - Filters for items - * @returns - */ -function KinkyDungeonGetRestraint(enemy, Level, Index, Bypass, Lock, RequireWill, LeashingOnly, NoStack, extraTags, agnostic, filter, securityEnemy) { - let restraintWeightTotal = 0; - let restraintWeights = []; - - let Restraints = KDGetRestraintsEligible(enemy, Level, Index, Bypass, Lock, RequireWill, LeashingOnly, NoStack, extraTags, agnostic, filter, securityEnemy); - - for (let rest of Restraints) { - let restraint = rest.restraint; - let weight = rest.weight; - restraintWeights.push({restraint: restraint, weight: restraintWeightTotal}); - weight += restraint.weight; - restraintWeightTotal += Math.max(0, weight); - } - - let selection = KDRandom() * restraintWeightTotal; - - for (let L = restraintWeights.length - 1; L >= 0; L--) { - if (selection > restraintWeights[L].weight) { - return restraintWeights[L].restraint; - } - } -} - -// @ts-ignore -// @ts-ignore -function KinkyDungeonUpdateRestraints(delta) { - let playerTags = new Map(); - for (let inv of KinkyDungeonAllRestraint()) { - let group = KDRestraint(inv).Group; - if (group) { - if (KDGroupBlocked(group)) playerTags.set(group + "Blocked", true); - playerTags.set(group + "Full", true); - playerTags.set(inv.name + "Worn", true); - } - } - for (let sg of KinkyDungeonStruggleGroupsBase) { - let group = sg; - if (group == "ItemM") { - if (!KinkyDungeonGetRestraintItem("ItemMouth")) playerTags.set("ItemMouth" + "Empty", true); - if (!KinkyDungeonGetRestraintItem("ItemMouth2")) playerTags.set("ItemMouth2" + "Empty", true); - if (!KinkyDungeonGetRestraintItem("ItemMouth3")) playerTags.set("ItemMouth3" + "Empty", true); - } else if (group == "ItemH") { - if (!KinkyDungeonGetRestraintItem("ItemHood")) playerTags.set("ItemHood" + "Empty", true); - if (!KinkyDungeonGetRestraintItem("ItemHead")) playerTags.set("ItemHead" + "Empty", true); - } else if (!KinkyDungeonGetRestraintItem(group)) playerTags.set(group + "Empty", true); - } - for (let inv2 of KinkyDungeonAllRestraintDynamic()) { - let inv = inv2.item; - playerTags.set("Item_"+inv.name, true); - - if (KDRestraint(inv).Link) - playerTags.set("LinkTo_"+KDRestraint(inv).Link, true); - if (KDRestraint(inv).UnLink) - playerTags.set("UnLinkTo_"+KDRestraint(inv).UnLink, true); - if (KDRestraint(inv).addTag) - for (let tag of KDRestraint(inv).addTag) { - if (!playerTags.get(tag)) playerTags.set(tag, true); - } - if (KDRestraint(inv).chastity) - playerTags.set("ChastityLower", true); - if (KDRestraint(inv).chastitybra) - playerTags.set("ChastityUpper", true); - if (KDRestraint(inv).hobble) - playerTags.set("Hobble", true); - if (KDRestraint(inv).blockfeet) - playerTags.set("BoundFeet", true); - if (KDRestraint(inv).bindarms) - playerTags.set("BoundHands", true); - if (KDRestraint(inv).bindhands) - playerTags.set("BoundHands", true); - if (KDRestraint(inv).blindfold) - playerTags.set("Blindfolded", true); - if (KDRestraint(inv).shrine) { - for (let tag of KDRestraint(inv).shrine) { - if (!playerTags.get(tag)) playerTags.set(tag, true); - } - let link = inv.dynamicLink; - while (link) { - for (let tag of KDRestraint(link).shrine) { - if (!playerTags.get(tag)) playerTags.set(tag, true); - } - link = link.dynamicLink; - } - } - - } - if (KinkyDungeonStatsChoice.get("Deprived")) playerTags.set("NoVibes", true); - if (KinkyDungeonStatsChoice.get("Unmasked")) playerTags.set("Unmasked", true); - if (KinkyDungeonStatsChoice.get("Unchained")) playerTags.set("Unchained", true); - if (KinkyDungeonStatsChoice.get("Damsel")) playerTags.set("Damsel", true); - if (KinkyDungeonStatsChoice.get("arousalMode")) playerTags.set("arousalMode", true); - if (KinkyDungeonStatsChoice.get("arousalModePlug")) playerTags.set("arousalModePlug", true); - if (KinkyDungeonStatsChoice.get("arousalModePiercing")) playerTags.set("arousalModePiercing", true); - - let tags = []; - KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); - for (let t of tags) { - playerTags.set(t, true); - } - - KinkyDungeonSendEvent("updatePlayerTags", {tags: playerTags, player:KinkyDungeonPlayerEntity}); - return playerTags; -} - -/** - * - * @param {item} item - * @param {boolean} [NoLink] - * @param {restraint} [toLink] - * @returns - */ -function KinkyDungeonRestraintPower(item, NoLink, toLink) { - if (item && item.type == Restraint) { - let lockMult = item ? KinkyDungeonGetLockMult(item.lock) : 1; - let power = (item.lock ? KDRestraint(item).power * lockMult : KDRestraint(item).power); - - if (item.dynamicLink && !NoLink) { - let link = item.dynamicLink; - if (!toLink || !KinkyDungeonIsLinkable(KinkyDungeonGetRestraintByName(link.name), toLink, link)) { - let lock = link.lock; - let mult = lock ? KinkyDungeonGetLockMult(lock) : 1; - let pp = link ? (KDRestraint({name: link.name}).power) : 0; - power = Math.max(power, pp * mult); - } - } - return power; - } - return 0; -} - -/** - * @param {restraint} oldRestraint - * @param {restraint} newRestraint - * @param {item} [item] - * @param {string} [newLock] - * @returns {boolean} - */ -// @ts-ignore -function KinkyDungeonLinkableAndStricter(oldRestraint, newRestraint, item, newLock) { - if (oldRestraint && newRestraint) { - return KinkyDungeonIsLinkable(oldRestraint, newRestraint, item); - //} - } - return false; -} - -function KinkyDungeonGenerateRestraintTrap() { - let enemy = KinkyDungeonGetEnemy(["chestTrap"], MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', ["chestTrap"]); - if (enemy) return enemy.name; - return "GreedyGhast"; -} - -function KDGetLockVisual(item) { - //if (KinkyDungeonBlindLevel > 0) return `Locks/Blind.png`; - return `Locks/${item.lock}.png`; -} - -/** - * - * @param {restraint} restraint - * @param {boolean} Bypass - * @param {boolean} NoStack - * @param {string} Lock - * @param {item} [r] - * @param {boolean} [Deep] - * @param {boolean} [noOverpower] - * @param {entity} [securityEnemy] - Bypass is treated separately for these groups - * @returns {boolean} - Restraint can be added - */ -function KDCanAddRestraint(restraint, Bypass, Lock, NoStack, r, Deep, noOverpower, securityEnemy) { - if (restraint.bypass) Bypass = true; - // Limits - if (restraint.shrine && restraint.shrine.includes("Vibes") && KinkyDungeonPlayerTags.get("NoVibes")) return false; - if (restraint.arousalMode && !KinkyDungeonStatsChoice.get("arousalMode")) return false; - if (restraint.Group == "ItemButt" && !KinkyDungeonStatsChoice.get("arousalModePlug")) return false; - if (restraint.Group == "ItemNipplesPiercing" && !KinkyDungeonStatsChoice.get("arousalModePiercing")) return false; - - if (restraint.requireSingleTagToEquip) { - let pass = false; - for (let tag of restraint.requireSingleTagToEquip) { - if (KinkyDungeonPlayerTags.has(tag)) { - pass = true; - break; - } - } - if (!pass) return false; - } - if (!r) r = KinkyDungeonGetRestraintItem(restraint.Group); - let power = KinkyDungeonRestraintPower(r, false, restraint); - let linkUnder = KDGetLinkUnder(r, restraint, Bypass, NoStack, Deep, securityEnemy); - - let linkableCurrent = r && KDRestraint(r) && KinkyDungeonLinkableAndStricter(KDRestraint(r), restraint, r); - - if (linkUnder) return true; - - // We raise the power if the current item cannot be linked, but the item underneath also cannot be linked - let link = r?.dynamicLink; - while (link && !linkableCurrent) { - let linkableUnder = KinkyDungeonLinkableAndStricter(KDRestraint(link), restraint, link); - if (!linkableUnder) { - power = Math.max(power, KinkyDungeonRestraintPower(link, false, restraint)); - link = link.dynamicLink; - } else { - link = null; - } - } - - let newLock = (Lock && KinkyDungeonIsLockable(restraint)) ? Lock : restraint.DefaultLock; - if ( - // Nothing to overwrite so we good - !r - // We can link - || linkableCurrent - // We are weak enough to override - || (!KDRestraint(r).enchanted - && (!noOverpower && power < restraint.power * KinkyDungeonGetLockMult(newLock))) - ) { - if (Bypass || restraint.bypass || !KDGroupBlocked(restraint.Group, true) || KDEnemyPassesSecurity(restraint.Group, securityEnemy)) - return true; // Recursion!! - } - return false; -} - -/** - * - * @param {string} Group - * @param {entity} enemy - * @returns {boolean} - */ -function KDEnemyPassesSecurity(Group, enemy) { - if (!enemy) return false; - let blockers = KDGetBlockingRestraints(Group, true); - for (let blocker of blockers) { - if (!KDRestraint(blocker)?.Security) return false; - for (let secure of Object.entries(KDRestraint(blocker).Security)) { - if (KDGetSecurity(enemy, secure[0]) >= secure[1]) return true; - } - } - return false; -} - -/** - * Returns the first restraint in the stack that can link the given restraint - * @param {item} currentRestraint - * @param {restraint} restraint - * @param {boolean} [bypass] - * @param {boolean} [NoStack] - * @param {boolean} [Deep] - Whether or not it can look deeper into the stack - * @param {entity} [securityEnemy] - Bypass is treated separately for these groups - * @returns {item} - */ -function KDGetLinkUnder(currentRestraint, restraint, bypass, NoStack, Deep, securityEnemy) { - let link = currentRestraint; - if (restraint.bypass) bypass = true; - while (link) { - if (KDCanLinkUnder(link, restraint, bypass, NoStack, securityEnemy)) { - return link; - } - if (Deep) - link = link.dynamicLink; - else link = null; - } - return null; -} - -/** - * Returns whether or not the restraint can go under the currentRestraint - * @param {item} currentRestraint - * @param {restraint} restraint - * @param {boolean} [bypass] - * @param {boolean} [NoStack] - * @param {entity} [securityEnemy] - Bypass is treated separately for these groups - * @returns {boolean} - */ -function KDCanLinkUnder(currentRestraint, restraint, bypass, NoStack, securityEnemy) { - if (restraint.bypass) bypass = true; - let linkUnder = currentRestraint - && (bypass || (KDRestraint(currentRestraint).accessible) || (KDRestraint(currentRestraint).deepAccessible) || KDEnemyPassesSecurity(KDRestraint(currentRestraint).Group, securityEnemy)) - && KinkyDungeonIsLinkable(restraint, KDRestraint(currentRestraint), {name: restraint.name, id: -1}, currentRestraint, currentRestraint) - && (!currentRestraint.dynamicLink || KinkyDungeonIsLinkable(KDRestraint(currentRestraint.dynamicLink), restraint, currentRestraint.dynamicLink, currentRestraint)); - - if (!linkUnder) return false; - if ( - KDCheckLinkSize(currentRestraint, restraint, bypass, NoStack, securityEnemy) - ) { - return true; - } -} - -/** - * - * @param {item} currentRestraint - * @param {item} [ignoreItem] - Item to ignore - * @param {restraint} restraint - * @param {boolean} [bypass] - * @param {boolean} [NoStack] - * @param {entity} [securityEnemy] - Bypass is treated separately for these groups - * @returns {boolean} - */ -function KDCheckLinkSize(currentRestraint, restraint, bypass, NoStack, securityEnemy, ignoreItem) { - if (restraint.bypass) bypass = true; - return (restraint.linkCategory && KDLinkCategorySize(KinkyDungeonGetRestraintItem(KDRestraint(currentRestraint).Group), - restraint.linkCategory, ignoreItem) + KDLinkSize(restraint) <= (NoStack ? 0.1 : 1.0)) - || (!restraint.linkCategory - && !KDDynamicLinkList(KinkyDungeonGetRestraintItem(KDRestraint(currentRestraint).Group), true).some((item) => { - return restraint.name == item.name && ignoreItem?.id != item.id; - })); -} - -/** - * @param {restraint | string} restraint - * @param {number} [Tightness] - * @param {boolean} [Bypass] - * @param {string} [Lock] - * @param {boolean} [Keep] - * @param {boolean} [Trapped] - * @param {KinkyDungeonEvent[]} [events] - * @param {string} [faction] - * @param {boolean} [Deep] - whether or not it can go deeply in the stack - * @param {string} [Curse] - Curse to apply - * @param {entity} [securityEnemy] - Bypass is treated separately for these groups - * @returns {number} - */ -function KinkyDungeonAddRestraintIfWeaker(restraint, Tightness, Bypass, Lock, Keep, Trapped, events, faction, Deep, Curse, securityEnemy) { - if (typeof restraint === "string") restraint = KinkyDungeonGetRestraintByName(restraint); - if (restraint.bypass) Bypass = true; - if (KDCanAddRestraint(restraint, Bypass, Lock, false, undefined, Deep, false, securityEnemy)) { - let r = KinkyDungeonGetRestraintItem(restraint.Group); - let linkUnder = null; - linkUnder = KDGetLinkUnder(r, restraint, Bypass, undefined, Deep, securityEnemy); - let linkableCurrent = r - && KDRestraint(r) - && KinkyDungeonLinkableAndStricter(KDRestraint(r), restraint, r); - - let ret = 0; - let alwaysLinkUnder = false; - if (!linkableCurrent && linkUnder && (!linkableCurrent || !restraint.inaccessible || alwaysLinkUnder)) { - // Insert the item underneath - ret = Math.max(1, Tightness); - linkUnder.dynamicLink = {name: restraint.name, id: KinkyDungeonGetItemID(), type: Restraint, events:events ? events : Object.assign([], restraint.events), tightness: Tightness, lock: "", faction: faction, dynamicLink: linkUnder.dynamicLink }; - KinkyDungeonLock(linkUnder.dynamicLink, Lock); - - if (Curse && KDCurses[Curse] && KDCurses[Curse].onApply) { - KDCurses[Curse].onApply(linkUnder.dynamicLink, linkUnder); - } - if (r) KDUpdateLinkCaches(r); - KinkyDungeonSendEvent("postApply", {player: KinkyDungeonPlayerEntity, item: linkUnder.dynamicLink, host: linkUnder, keep: Keep, Link: true}); - } else { - ret = KinkyDungeonAddRestraint(restraint, Tightness + Math.round(0.1 * KinkyDungeonDifficulty), Bypass, Lock, Keep, false, !linkableCurrent, events, faction, undefined, undefined, Curse, undefined, securityEnemy); - } - if (Trapped) { - let rest = KinkyDungeonGetRestraintItem(restraint.Group); - if (rest && KDRestraint(rest) && KDRestraint(rest).trappable && !rest.trap) { - rest.trap = KinkyDungeonGenerateRestraintTrap(); - } - } - return ret; - } - return 0; -} - -/** - * - * @param {restraint} oldRestraint - * @param {restraint} newRestraint - * @param {item} [item] - * @param {item} [ignoreItem] - Item to ignore for purpose of calculating size - * @param {item} [linkUnderItem] - Item to ignore for total link chain calculation - * @returns {boolean} - */ -function KinkyDungeonIsLinkable(oldRestraint, newRestraint, item, ignoreItem, linkUnderItem) { - if (!oldRestraint.nonbinding && newRestraint.nonbinding) return false; - if (oldRestraint && newRestraint && oldRestraint && oldRestraint.Link) { - if (newRestraint.name == oldRestraint.Link) return true; - } - if (item && !KDCheckLinkSize(item, newRestraint, false, false, undefined, ignoreItem)) return false; - if (item && !KDCheckLinkTotal(item, newRestraint, linkUnderItem)) return false; - if (oldRestraint && newRestraint && oldRestraint && oldRestraint.LinkableBy && newRestraint.shrine) { - for (let l of oldRestraint.LinkableBy) { - for (let s of newRestraint.shrine) { - if (l == s) { - return true; - } - } - } - } - return false; -} - -/** - * Checks if all the items linked under allow this item - * @param {item} oldRestraint - * @param {restraint} newRestraint - * @param {item} [ignoreItem] - * @returns {boolean} - */ -function KDCheckLinkTotal(oldRestraint, newRestraint, ignoreItem) { - if (KDRestraint(oldRestraint).Link && KDRestraint(oldRestraint).Link == newRestraint.name) { - return true; - } - if (newRestraint.UnLink && oldRestraint.name == newRestraint.UnLink) { - return true; - } - let link = oldRestraint; - if (oldRestraint.linkCache) { - for (let s of newRestraint.shrine) { - if (oldRestraint.linkCache.includes(s)) return true; - } - } - while (link) { - let pass = false; - let r = KDRestraint(link); - if (link != ignoreItem) { - if (r.LinkableBy && newRestraint.shrine) { - for (let l of r.LinkableBy) { - if (!pass) - for (let s of newRestraint.shrine) { - if (l == s) { - pass = true; - } - } - } - } - if (!pass) return false; - } - link = link.dynamicLink; - } - return true; -} - -/** - * Gets the linkability cache - * @param {item} restraint - */ -function KDUpdateLinkCaches(restraint) { - let link = restraint; - while (link) { - link.linkCache = KDGetLinkCache(link); - link = link.dynamicLink; - } -} - -/** - * Gets the linkability cache - * @param {item} restraint - * @returns {string[]} - */ -function KDGetLinkCache(restraint) { - let cache = Object.assign([], KDRestraint(restraint).LinkableBy); - let link = restraint.dynamicLink; - while (link) { - let r = KDRestraint(link); - if (r.LinkableBy) { - for (let l of cache) { - if (!r.LinkableBy.includes(l)) cache.splice(cache.indexOf(l), 1); - } - } else return []; - link = link.dynamicLink; - } - return cache; -} - -let KinkyDungeonRestraintAdded = false; -let KinkyDungeonCancelFlag = false; - -/** - * @param {restraint} restraint - * @param {number} Tightness - * @param {boolean} [Bypass] - * @param {string} [Lock] - * @param {boolean} [Keep] - * @param {boolean} [Link] - * @param {boolean} [SwitchItems] - * @param {KinkyDungeonEvent[]} [events] - * @param {boolean} [Unlink] - * @param {string} [faction] - * @param {item} [dynamicLink] - * @param {string} [Curse] - Curse to apply - * @param {boolean} [autoMessage] - Whether or not to automatically dispatch messages - * @param {entity} [securityEnemy] - Whether or not to automatically dispatch messages - * @returns - */ -function KinkyDungeonAddRestraint(restraint, Tightness, Bypass, Lock, Keep, Link, SwitchItems, events, faction, Unlink, dynamicLink, Curse, autoMessage = true, securityEnemy = undefined) { - KDDelayedActionPrune(["Restrain"]); - if (restraint.bypass) Bypass = true; - KDStruggleGroupLinkIndex = {}; - let start = performance.now(); - let tight = (Tightness) ? Tightness : 0; - let AssetGroup = restraint.AssetGroup ? restraint.AssetGroup : restraint.Group; - if (restraint) { - if (!KDGroupBlocked(restraint.Group, true) || Bypass || KDEnemyPassesSecurity(restraint.Group, securityEnemy)) { - KinkyDungeonEvasionPityModifier = 0; - KinkyDungeonMiscastPityModifier = 0; - let r = KinkyDungeonGetRestraintItem(restraint.Group); - let linkable = !Unlink && (!Link && r && KinkyDungeonIsLinkable(KDRestraint(r), restraint, r)); - let linked = false; - if (linkable) { - linked = true; - KinkyDungeonCancelFlag = KinkyDungeonLinkItem(restraint, r, Tightness, Lock, Keep, faction, Curse, autoMessage); - } - - let eventsAdd = false; - let oldevents = null; - let prevR = null; - - // Some confusing stuff here to prevent recursion. If Link = true this means we are in the middle of linking, we dont want to do that - if (!KinkyDungeonCancelFlag) { - // We block events because there may be linking happening... - KinkyDungeonRemoveRestraint(restraint.Group, Keep && !Link, Link || Unlink, undefined, undefined, r && r.dynamicLink && restraint.name == r.dynamicLink.name); - - let newR = KinkyDungeonGetRestraintItem(restraint.Group); - // Run events AFTER - if (r && r.events) { - oldevents = r.events; - eventsAdd = newR != undefined; - prevR = r; - } - - r = newR; - //if (prevR.dynamicLink && KinkyDungeonIsLinkable(KDRestraint(prevR.dynamicLink), KDRestraint(r))) { - ////r.dynamicLink = prevR.dynamicLink; - //KinkyDungeonLinkItem(restraint, r, Tightness, Lock, Keep); - //} - KinkyDungeonCancelFlag = r != undefined; - - } - - - - let color = (typeof restraint.Color === "string") ? [restraint.Color] : Object.assign([], restraint.Color); - if (restraint.factionColor && faction && KinkyDungeonFactionColors[faction]) { - for (let i = 0; i < restraint.factionColor.length; i++) { - for (let n of restraint.factionColor[i]) { - if (KinkyDungeonFactionColors[faction][i]) - color[n] = KinkyDungeonFactionColors[faction][i]; // 0 is the primary color - } - } - } - - // If we did not link an item (or unlink one) then we proceed as normal - if (!KinkyDungeonCancelFlag) { - KinkyDungeonRemoveRestraint(restraint.Group, Keep, false, undefined, undefined, r && r.dynamicLink&& restraint.name == r.dynamicLink.name); - if (restraint.remove) - for (let remove of restraint.remove) { - InventoryRemove(KinkyDungeonPlayer, remove); - } - if (restraint.removeShrine) - for (let remove of restraint.removeShrine) { - for (let removeR of KinkyDungeonAllRestraint()) { - let host = removeR; - let link = removeR.dynamicLink; - let iter = 0; - while (link && iter < 100) { - if (KDRestraint(link).shrine && KDRestraint(link).shrine.includes(remove)) { - KinkyDungeonRemoveDynamicRestraint(host, Keep, false); - host = removeR; - link = removeR.dynamicLink; - } else { - host = link; - link = link.dynamicLink; - } - iter += 1; - } - - if (KDRestraint(removeR).shrine && KDRestraint(removeR).shrine.includes(remove)) { - KinkyDungeonRemoveRestraint(KDRestraint(removeR).Group, Keep, false, false, false, false); - } - } - } - //KDInventoryWear(restraint.Asset, AssetGroup, undefined, color); - KinkyDungeonSendFloater({x: 1100, y: 600 - KDRecentRepIndex * 40}, `+${TextGet("Restraint" + restraint.name)}!`, "pink", 5, true); - KDRecentRepIndex += 1; - //let placed = InventoryGet(KinkyDungeonPlayer, AssetGroup); - let placedOnPlayer = false; - //if (!placed) console.log(`Error placing ${restraint.name} on player!!!`); - if (ArcadeDeviousChallenge && KinkyDungeonDeviousDungeonAvailable() && !KinkyDungeonRestraintsLocked.includes(AssetGroup) && AssetGroup != "ItemHead" && InventoryAllow( - Player, AssetGet("3DCGFemale", AssetGroup, restraint.Asset)) && - (!InventoryGetLock(InventoryGet(Player, AssetGroup)) - || (InventoryGetLock(InventoryGet(Player, AssetGroup)).Asset.OwnerOnly == false && InventoryGetLock(InventoryGet(Player, AssetGroup)).Asset.LoverOnly == false))) { - //(!InventoryGetLock(InventoryGet(Player, AssetGroup)) - //|| (InventoryGetLock(InventoryGet(Player, AssetGroup)).Asset.OwnerOnly == false && InventoryGetLock(InventoryGet(Player, AssetGroup)).Asset.LoverOnly == false))) { - const asset = AssetGet(Player.AssetFamily, AssetGroup, restraint.Asset); - if (asset) { - placedOnPlayer = true; - CharacterAppearanceSetItem(Player, AssetGroup, asset, color || asset.DefaultColor, 0, null, false); - KinkyDungeonPlayerNeedsRefresh = true; - } - } - //if (placed && !placed.Property) placed.Property = {}; - if (placedOnPlayer && restraint.Type) { - let options = window["Inventory" + ((AssetGroup.includes("ItemMouth")) ? "ItemMouth" : AssetGroup) + restraint.Asset + "Options"]; - if (!options) options = TypedItemDataLookup[`${AssetGroup}${restraint.Asset}`].options; // Try again - const option = options.find(o => o.Name === restraint.Type); - const playerItem = InventoryGet(Player, AssetGroup); - if (playerItem) { - TypedItemSetOption(Player, playerItem, options, option, false); - KinkyDungeonPlayerNeedsRefresh = true; - } - } - if (placedOnPlayer && restraint.Modules) { - let data = ModularItemDataLookup[AssetGroup + restraint.Asset]; - let asset = data.asset; - let modules = data.modules; - // @ts-ignore - InventoryGet(Player, AssetGroup).Property = ModularItemMergeModuleValues({ asset, modules }, restraint.Modules); - } - /*if (restraint.OverridePriority) { - if (!InventoryGet(KinkyDungeonPlayer, AssetGroup).Property) InventoryGet(KinkyDungeonPlayer, AssetGroup).Property = {OverridePriority: restraint.OverridePriority}; - else InventoryGet(KinkyDungeonPlayer, AssetGroup).Property.OverridePriority = restraint.OverridePriority; - }*/ - if (placedOnPlayer && color) { - // @ts-ignore - KDCharacterAppearanceSetColorForGroup(Player, color, AssetGroup); - } - let item = {name: restraint.name, id: KinkyDungeonGetItemID(), type: Restraint, curse: Curse, events:events ? events : Object.assign([], restraint.events), tightness: tight, lock: "", faction: faction, dynamicLink: dynamicLink }; - KinkyDungeonInventoryAdd(item); - KinkyDungeonSendEvent("postApply", {player: KinkyDungeonPlayerEntity, item: item, host: undefined, keep: Keep, Link: Link}); - - if (Curse && KDCurses[Curse] && KDCurses[Curse].onApply) { - KDCurses[Curse].onApply(item, undefined); - } - - if (Lock) KinkyDungeonLock(item, Lock); - else if (restraint.DefaultLock && !Unlink) KinkyDungeonLock(item, KDProcessLock(restraint.DefaultLock)); - - KDUpdateLinkCaches(item); - } else if ((!Link && !linked) || SwitchItems) { - KinkyDungeonCancelFlag = false; - // Otherwise, if we did unlink an item, and we are not in the process of linking (very important to prevent loops) - // Then we link the new item to the unlinked item if possible - r = KinkyDungeonGetRestraintItem(restraint.Group); - if (SwitchItems) { - KinkyDungeonAddRestraintIfWeaker(restraint, Tightness, Bypass, Lock, Keep, false, undefined, faction, undefined, Curse, securityEnemy); - } else if (r && KDRestraint(r) && KinkyDungeonIsLinkable(KDRestraint(r), restraint, r)) { - KinkyDungeonLinkItem(restraint, r, Tightness, Lock, Keep, faction, Curse); - } - } - // Run events AFTER the swappen - if (oldevents) { - if (prevR.events) { - for (let e of oldevents) { - if (e.trigger == "postRemoval" && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { - KinkyDungeonHandleInventoryEvent("postRemoval", e, prevR, {item: prevR, add: eventsAdd, keep: Keep, Link: Link, shrine: undefined}); - } - } - } - KinkyDungeonSendEvent("postRemoval", {item: prevR, add: eventsAdd, keep: Keep, Link: Link, shrine: undefined}); - } - KinkyDungeonCancelFlag = false; - } - - //KinkyDungeonWearForcedClothes(); - - KinkyDungeonPlayerTags = KinkyDungeonUpdateRestraints(); // We update the restraints but no time drain on batteries, etc - - KinkyDungeonCalculateSlowLevel(); - KinkyDungeonCheckClothesLoss = true; // We signal it is OK to check whether the player should get undressed due to restraints - - KinkyDungeonDressPlayer(); - KinkyDungeonMultiplayerInventoryFlag = true; // Signal that we can send the inventory now - KinkyDungeonSleepTime = 0; - KinkyDungeonUpdateStruggleGroups(); - if (!KinkyDungeonRestraintAdded) { - KinkyDungeonRestraintAdded = true; - let sfx = (restraint && restraint.sfx) ? restraint.sfx : "Struggle"; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" + sfx + ".ogg"); - } - let end = performance.now(); - if (KDDebug) - console.log(`Took ${end - start} milliseconds to add restraint ${restraint.name}`); - return Math.max(1, restraint.power); - } - return 0; -} - -/** - * It removes a restraint from the player - * @param {string} Group - The group of the item to remove. - * @param {boolean} [Keep] - If true, the item will be kept in the player's inventory. - * @param {boolean} [Add] - If true, this is part of the process of adding another item and should not trigger infinite recursion - * @param {boolean} [NoEvent] - If true, the item will not trigger any events. - * @param {boolean} [Shrine] - If the item is being removed from a shrine, this is true. - * @param {boolean} [UnLink] - If the item is being removed as part of an unlinking process - * @param {entity} [Remover] - Who removes this - * @returns {boolean} true if the item was removed, false if it was not. - */ -function KinkyDungeonRemoveRestraint(Group, Keep, Add, NoEvent, Shrine, UnLink, Remover) { - KDDelayedActionPrune(["Remove"]); - KDStruggleGroupLinkIndex = {}; - for (let item of KinkyDungeonAllRestraint()) { - const rest = KinkyDungeonRestraintsCache.get(item.name); - if (rest.Group == Group) { - let AssetGroup = rest && rest.AssetGroup ? rest.AssetGroup : Group; - if (!NoEvent) - KinkyDungeonSendEvent("remove", {item: rest, add: Add, keep: Keep, shrine: Shrine}); - - if (!KinkyDungeonCancelFlag && !Add && !UnLink) { - KinkyDungeonCancelFlag = KinkyDungeonUnLinkItem(item, Keep); - } - - if (!KinkyDungeonCancelFlag) { - if (ArcadeDeviousChallenge && KinkyDungeonDeviousDungeonAvailable() && !KinkyDungeonRestraintsLocked.includes(AssetGroup) && InventoryGet(Player, AssetGroup) && - (!InventoryGetLock(InventoryGet(Player, AssetGroup)) || (InventoryGetLock(InventoryGet(Player, AssetGroup))?.Asset.OwnerOnly == false && InventoryGetLock(InventoryGet(Player, Group))?.Asset.LoverOnly == false)) - && Group != "ItemHead") { - InventoryRemove(Player, AssetGroup, false); - if (Group == "ItemNeck" && !Add) { - InventoryRemove(Player, "ItemNeckAccessories", false); - InventoryRemove(Player, "ItemNeckRestraints", false); - } - KinkyDungeonPlayerNeedsRefresh = true; - } - let inventoryAs = Remover?.player ? rest.inventoryAsSelf : rest.inventoryAs; - if (rest.inventory && (Keep || ((rest.enchanted || rest.alwaysKeep) && !KinkyDungeonInventoryGetLoose(inventoryAs|| rest.name)))) { - if (inventoryAs) { - let origRestraint = KinkyDungeonGetRestraintByName(inventoryAs); - if (origRestraint && rest.shrine?.includes("Cursed") && !origRestraint.shrine?.includes("Cursed")) { - KinkyDungeonSendTextMessage(10, TextGet("KDCursedArmorUncurse").replace("RestraintName", TextGet("Restraint" + rest.name)), "#aaffaa", 1); - } - - if (!KinkyDungeonInventoryGetLoose(origRestraint.name)) { - KinkyDungeonInventoryAdd({name: origRestraint.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:origRestraint.events, quantity: 1}); - } else { - if (!KinkyDungeonInventoryGetLoose(origRestraint.name).quantity) KinkyDungeonInventoryGetLoose(origRestraint.name).quantity = 0; - KinkyDungeonInventoryGetLoose(origRestraint.name).quantity += 1; - } - } else { - if (!KinkyDungeonInventoryGetLoose(rest.name)) { - KinkyDungeonInventoryAdd({name: rest.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:rest.events, quantity: 1}); - } else { - if (!KinkyDungeonInventoryGetLoose(rest.name).quantity) KinkyDungeonInventoryGetLoose(rest.name).quantity = 0; - KinkyDungeonInventoryGetLoose(rest.name).quantity += 1; - } - - } - } - - InventoryRemove(KinkyDungeonPlayer, AssetGroup); - - for (let _item of KinkyDungeonInventory.get(Restraint).values()) { - if (_item && KDRestraint(_item).Group == Group) { - KinkyDungeonInventoryRemove(_item); - break; - } - } - - - if (rest.Group == "ItemNeck" && !Add && KinkyDungeonGetRestraintItem("ItemNeckRestraints")) KinkyDungeonRemoveRestraint("ItemNeckRestraints", KDRestraint(KinkyDungeonGetRestraintItem("ItemNeckRestraints")).inventory); - - if (!NoEvent) { - if (rest.events) { - for (let e of rest.events) { - if (e.trigger == "postRemoval" && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { - KinkyDungeonHandleInventoryEvent("postRemoval", e, item, {item: item, id: KinkyDungeonGetItemID(), add: Add, keep: Keep, shrine: Shrine}); - } - } - } - KinkyDungeonSendEvent("postRemoval", {item: rest, add: Add, keep: Keep, shrine: Shrine}); - } - - let sfx = (rest && rest.sfxRemove) ? rest.sfxRemove : "Struggle"; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" + sfx + ".ogg"); - - KinkyDungeonCalculateSlowLevel(); - KinkyDungeonCheckClothesLoss = true; - KinkyDungeonDressPlayer(); - - KinkyDungeonMultiplayerInventoryFlag = true; - KinkyDungeonUpdateStruggleGroups(); - - } - KinkyDungeonCancelFlag = false; - if (KinkyDungeonPlayerWeapon != KinkyDungeonPlayerWeaponLastEquipped && KinkyDungeonInventoryGet(KinkyDungeonPlayerWeaponLastEquipped)) { - KDSetWeapon(KinkyDungeonPlayerWeaponLastEquipped); - } - return true; - } - } - return false; -} - -function KDIInsertRestraintUnderneath(restraint) { - - return false; -} - -/** - * It removes the item's dynamic link - * @param {item} hostItem - The group of the item to remove. - * @param {boolean} [Keep] - If true, the item will be kept in the player's inventory. - * @param {boolean} [NoEvent] - If true, the item will not trigger any events. - * @param {entity} [Remover] - Who removes this - * @returns {boolean} true if the item was removed, false if it was not. - */ -function KinkyDungeonRemoveDynamicRestraint(hostItem, Keep, NoEvent, Remover) { - let item = hostItem.dynamicLink; - if (item) { - const rest = KDRestraint(item); - if (!NoEvent) - KinkyDungeonSendEvent("remove", {item: rest, keep: Keep, shrine: false, dynamic: true}); - - if (!KinkyDungeonCancelFlag) { - if (rest.inventory && (Keep || rest.enchanted || rest.alwaysKeep) && !KinkyDungeonInventoryGetLoose(rest.name)) { - let inventoryAs = Remover?.player ? rest.inventoryAsSelf : rest.inventoryAs; - if (inventoryAs) { - let origRestraint = KinkyDungeonGetRestraintByName(inventoryAs); - if (origRestraint && rest.shrine?.includes("Cursed") && !origRestraint.shrine?.includes("Cursed")) - KinkyDungeonSendTextMessage(10, TextGet("KDCursedArmorUncurse").replace("RestraintName", TextGet("Restraint" + rest.name)), "#aaffaa", 1); - if (!KinkyDungeonInventoryGetLoose(origRestraint.name)) { - KinkyDungeonInventoryAdd({name: origRestraint.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:origRestraint.events, quantity: 1}); - } else KinkyDungeonInventoryGetLoose(origRestraint.name).quantity += 1; - } else KinkyDungeonInventoryAdd({name: rest.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:rest.events}); - } - - // Remove the item itself by unlinking it from the chain - hostItem.dynamicLink = item.dynamicLink; - let r = KinkyDungeonGetRestraintItem(KDRestraint(hostItem).Group); - if (r) KDUpdateLinkCaches(r); - - if (!NoEvent) { - if (rest.events) { - for (let e of rest.events) { - if (e.trigger == "postRemoval" && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { - KinkyDungeonHandleInventoryEvent("postRemoval", e, item, {item: item, id: KinkyDungeonGetItemID(), keep: Keep, shrine: false, dynamic: true}); - } - } - } - KinkyDungeonSendEvent("postRemoval", {item: rest, keep: Keep, shrine: false, dynamic: true}); - } - - let sfx = (rest && rest.sfxRemove) ? rest.sfxRemove : "Struggle"; - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" + sfx + ".ogg"); - - KinkyDungeonCalculateSlowLevel(); - KinkyDungeonCheckClothesLoss = true; - KinkyDungeonDressPlayer(); - - KinkyDungeonMultiplayerInventoryFlag = true; - KinkyDungeonUpdateStruggleGroups(); - } - KinkyDungeonCancelFlag = false; - return true; - } - return false; -} - -/** - * "Returns an array of all the shrine types that have at least one restraint item." - * - * The function takes one argument, `ShrineFilter`, which is an array of shrine types. If the argument is not provided, the - * function will return all shrine types. If the argument is provided, the function will only return shrine types that are - * in the argument - * @param ShrineFilter - An array of strings, each string being the name of a shrine. - * @returns An array of all the restraint types that can be used in the shrine. - */ -function KinkyDungeonRestraintTypes(ShrineFilter) { - let ret = []; - - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).shrine) { - for (let shrine of KDRestraint(inv).shrine) { - if (ShrineFilter.includes(shrine) && !ret.includes(shrine)) ret.push(shrine); - } - } - } - - return ret; -} - - -/** - * - * @param {restraint} newRestraint - * @param {item} oldItem - * @param {number} tightness - * @param {string} [Lock] - * @param {boolean} [Keep] - * @param {string} [faction] - * @param {string} [Curse] - * @param {boolean} [autoMessage] - Whether or not to automatically dispatch a message - * @returns {boolean} - */ -function KinkyDungeonLinkItem(newRestraint, oldItem, tightness, Lock, Keep, faction, Curse, autoMessage = true) { - if (newRestraint && oldItem && oldItem.type == Restraint) { - if (newRestraint) { - KinkyDungeonAddRestraint(newRestraint, tightness, true, Lock, Keep, true, undefined, undefined, faction, undefined, oldItem, Curse); - let newItem = KinkyDungeonGetRestraintItem(newRestraint.Group); - if (newItem) - newItem.dynamicLink = oldItem; - if (newRestraint.UnLink && KDRestraint(oldItem).Link == newRestraint.name) { - oldItem.name = newRestraint.UnLink; - oldItem.events = Object.assign([], KDRestraint(oldItem).events); - } - KDUpdateLinkCaches(newItem); - if (autoMessage && KDRestraint(oldItem).Link) - KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonLink" + oldItem.name), "#ff0000", 2); - - - KinkyDungeonSendEvent("postApply", {player: KinkyDungeonPlayerEntity, item: newItem, host: undefined, keep: Keep, Link: true}); - return true; - } - } - return false; -} - -/** - * - * @param {item} item - * @param {boolean} Keep - * @returns - */ -// @ts-ignore -function KinkyDungeonUnLinkItem(item, Keep, dynamic) { - //if (!data.add && !data.shrine) - if (item.type == Restraint) { - /** - * @type {item} - */ - let UnLink = null; - if (item.dynamicLink) { - UnLink = item.dynamicLink; - } - if (UnLink) { - let newRestraint = KinkyDungeonGetRestraintByName(UnLink.name); - if (newRestraint) { - KinkyDungeonAddRestraint(newRestraint, UnLink.tightness, true, UnLink.lock, Keep, undefined, undefined, undefined, UnLink.faction, true, UnLink.dynamicLink); - - KinkyDungeonSendEvent("postRemoval", {item: null, keep: Keep, shrine: false, Link: false, dynamic: true}); - if (KDRestraint(item).UnLink) { - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonUnLink" + item.name), "lightgreen", 2); - } else - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonUnLink"), "lightgreen", 2); - return true; - } - } - } - return false; -} - -/** - * - * @param {number} x - * @param {number} y - * @param {{aoe: number, number: number, dist: number, kind: string, duration?: number, durationExtra?: number}} options - */ -function KDCreateDebris(x, y, options) { - let count = options.number ? options.number : 1; - let rad = options.aoe ? options.aoe : 1.5; - let minrad = options.dist; - for (let i = 0; i < count; i++) { - let slots = []; - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (Math.sqrt(X*X+Y*Y) <= rad && (!minrad || Math.sqrt(X*X+Y*Y) >= minrad)) { - if ((x + X > 0 && y + Y > 0 && x + X < KinkyDungeonGridWidth && y + Y < KinkyDungeonGridHeight) - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x + X, y + Y))) - slots.push({x:X, y:Y}); - } - } - - if (slots.length > 0) { - let slot = slots[Math.floor(KDRandom() * slots.length)]; - if (slot) { - KDCreateEffectTile(x + slot.x, y + slot.y, { - name: options.kind, - duration: options.duration - }, options.durationExtra || 0); - } - } - - } -} - -/** - * - * @param {string} StruggleType - * @param {item} restraint - * @param {KDLockType} lockType - * @param {number} index - * @param {any} data - * @param {item} host - */ -function KDSuccessRemove(StruggleType, restraint, lockType, index, data, host) { - let progress = restraint.cutProgress ? restraint.cutProgress : 0; - let destroyChance = (StruggleType == "Cut" || restraint.cutProgress) ? 1.0 : 0; - if (restraint.struggleProgress && restraint.struggleProgress > 0) { - progress += restraint.struggleProgress; - destroyChance = restraint.cutProgress / progress; - } - let destroy = false; - - KinkyDungeonFastStruggleType = ""; - KinkyDungeonFastStruggleGroup = ""; - - if (StruggleType == "Pick" || StruggleType == "Unlock") { - if (StruggleType == "Unlock") { - if (lockType && lockType.canUnlock(data)) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxFinishEscape && KDRestraint(restraint).sfxFinishEscape.Unlock) ? KDRestraint(restraint).sfxFinishEscape.Unlock : "Unlock") - + ".ogg"); - KinkyDungeonRemoveKeysUnlock(restraint.lock); - KinkyDungeonLock(restraint, ""); - } - } else { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxFinishEscape && KDRestraint(restraint).sfxFinishEscape.Unlock) ? KDRestraint(restraint).sfxFinishEscape.Unlock : "Unlock") - + ".ogg"); - KinkyDungeonLock(restraint, ""); - } - } else { - if (KDToggles.Sound) { - if (StruggleType == "Cut") AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxFinishEscape && KDRestraint(restraint).sfxFinishEscape.Cut) ? KDRestraint(restraint).sfxFinishEscape.Cut : "Cut") - + ".ogg"); - else if (StruggleType == "Remove") AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxFinishEscape && KDRestraint(restraint).sfxFinishEscape.Remove) ? KDRestraint(restraint).sfxFinishEscape.Remove : "Unbuckle") - + ".ogg"); - else AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + ((KDRestraint(restraint).sfxFinishEscape && KDRestraint(restraint).sfxFinishEscape.Struggle) ? KDRestraint(restraint).sfxFinishEscape.Struggle : "Struggle") - + ".ogg"); - } - if (KDRandom() < destroyChance) { - KinkyDungeonSendTextMessage(9, TextGet("KinkyDungeonStruggleCutDestroy").replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff0000", 2); - destroy = true; - } - let trap = restraint.trap; - KDSendStatus('escape', restraint.name, StruggleType); - if (KDToggles.Sound && destroy) { - if (KDRestraint(restraint).sfxFinishEscape && KDRestraint(restraint).sfxFinishEscape.Destroy) { - AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/" - + (KDRestraint(restraint).sfxFinishEscape.Destroy) - + ".ogg"); - } - } - if (index) { - //if (KDStruggleGroupLinkIndex[KDRestraint(restraint).Group]) KDStruggleGroupLinkIndex[KDRestraint(restraint).Group] = 0; - KinkyDungeonRemoveDynamicRestraint(host, (StruggleType != "Cut") || !destroy, false, KinkyDungeonPlayerEntity); - } else { - KinkyDungeonRemoveRestraint(KDRestraint(restraint).Group, (StruggleType != "Cut") || !destroy, undefined, undefined, undefined, undefined, KinkyDungeonPlayerEntity); - } - if (KinkyDungeonStatsChoice.get("FutileStruggles") && data.escapeChance < 0.25) KinkyDungeonChangeWill(KinkyDungeonStatWillCostEscape); - else if (KinkyDungeonStatsChoice.get("SecondWind") && data.escapeChance < 0.25) { - KinkyDungeonChangeWill(KinkyDungeonStatWillBonusEscape); - destroy = true; - } - if (trap) { - let summon = KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, trap, 1, 2.5); - if (summon) { - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonSummonTrapMonster"), "#ff0000", 2); - } - } - } - let suff = ""; - if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) suff = "Aroused"; - KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonStruggle" + StruggleType + "Success" + suff).replace("TargetRestraint", TextGet("Restraint" + KDRestraint(restraint).name)), "lightgreen", 2); - - return destroy; -} - -function KDAddDelayedStruggle(amount, time, StruggleType, struggleGroup, index, data, progress = 0, limit = 100) { - let cur = progress; - for (let t = 1; t <= time; t++) { - let plus = amount/time * Math.max(0, 1 - (limit > 0 ? (cur / limit) : 1)); - if (plus > 0 && plus < 0.04) plus = 0.04; - cur += plus; - KDAddDelayedAction({ - commit: "Struggle", - data: { - group: struggleGroup, - index: index, - amount: plus, - escapeData: data, - }, - time: t, - tags: ["Action", "Remove", "Restrain", "Hit"], - }); - } -} - -/** - * Gets the goddess bonus for this item - * @param {item} item - * @param {any} data - Escape chance data - */ -function KDGetItemGoddessBonus(item, data) { - if (!item) return 0; - if (data) { - if (data.struggleType == "Unlock") return 0; - } - let bonus = 0; - let avg = 0; - for (let s of KDRestraint(item)?.shrine) { - if (KinkyDungeonGoddessRep[s] != undefined) { - bonus += KDGetGoddessBonus(s); - avg += 1; - } - } - if (avg > 0) - bonus = bonus/avg; - return bonus; -} - -/** - * Gets string data from an item - * @param {item} item - * @param {string} key - * @returns {string | undefined} - */ -function getItemDataString(item, key) { - if (item.dataString) return item.dataString[key]; - return undefined; -} -/** - * Gets string data from an item - * @param {item} item - * @param {string} key - * @returns {number | undefined} - */ -function getItemDataNumber(item, key) { - if (item.dataNumber) return item.dataNumber[key]; - return undefined; -} - - -/** - * Sets string data for - * @param {item} item - * @param {string} key - * @param {string | undefined} value - */ -function setItemDataString(item, key, value) { - if (key != undefined && !item.dataString) item.dataString = {}; - if (key != undefined) { - item.dataString[key] = value; - } else if (item.dataString) { - delete item.dataString[key]; - } -} -/** - * Sets string data for - * @param {item} item - * @param {string} key - * @param {number | undefined} value - */ -function setItemDataNumber(item, key, value) { - if (key != undefined && !item.dataNumber) item.dataNumber = {}; - if (key != undefined) { - item.dataNumber[key] = value; - } else if (item.dataNumber) { - delete item.dataNumber[key]; - } -} - -/** - * Gets a restraint from a list of eligible restraints and a group prioritization order - * @param {{restraint: restraint, weight: number}[]} RestraintList - * @param {string[]} GroupOrder - * @returns {restraint} - */ -function KDChooseRestraintFromListGroupPri(RestraintList, GroupOrder) { - for (let i = 0; i < GroupOrder.length; i++) { - let group = GroupOrder[i]; - let Restraints = RestraintList.filter((rest) => { - return rest.restraint.Group == group; - }); - - if (Restraints.length > 0) { - let restraintWeightTotal = 0; - let restraintWeights = []; - - - for (let rest of Restraints) { - let restraint = rest.restraint; - let weight = rest.weight; - restraintWeights.push({restraint: restraint, weight: restraintWeightTotal}); - weight += restraint.weight; - restraintWeightTotal += Math.max(0, weight); - } - - let selection = KDRandom() * restraintWeightTotal; - - for (let L = restraintWeights.length - 1; L >= 0; L--) { - if (selection > restraintWeights[L].weight) { - return restraintWeights[L].restraint; - } - } - } - } - return null; -} \ No newline at end of file diff --git a/Game/KinkyDungeonRestraintsList.js b/Game/KinkyDungeonRestraintsList.js deleted file mode 100644 index cc1a2789f..000000000 --- a/Game/KinkyDungeonRestraintsList.js +++ /dev/null @@ -1,2635 +0,0 @@ -"use strict"; - -let KDMagicLocks = ["Purple"]; // Magical locks -let KDKeyedLocks = ["Red", "White", "Blue"]; - -// LinkableBy array templates -let KDHarnessLink = ["Wrapping", "HeavyCorsets", "Corsets", "ArmbinderHarness", "Ties", "Belts", "Harnesses"]; -let KDCorsetLink = ["Wrapping", "Harnesses", "ArmbinderHarness", "Ties", "Belts"]; -let KDBindable = ["Wrapping", "Belts", "Tape", "Ties", "Cuffs"]; // Things that can be wrapped in various restraints -let KDDevices = ["Armbinders", "Straitjackets", "Legbinders", "BindingDress", "Boxbinders", "Petsuits"]; // More complex devices -let KDElbowBind = ["Armbinders", "BindingDress", "Hogties"]; // More complex devices -let KDBoxBind = ["Boxbinders", "Hogties"]; // More complex devices -let KDWrappable = ["Wrapping", "Belts", "Tape"]; // Things that can be wrapped in various restraints but not tied due to covering -let KDArmbinderLink = ["Wrapping", "Belts", "BindingDress", "Hogties"]; // Standard link for an armbinder -let KDDressLink = ["Armbinders", "Ties", "Wrapping", "Belts", "BindingDress", "Hogties", "Straitjackets"]; -let KDJacketLink = ["Wrapping", "Belts", "Hogties"]; // Standard link for an armbinder -let KDJacketRender = ["Wrapping", "Belts", "BindingDress"]; // Standard link for an armbinder -let KDLegbinderLink = ["Belts", "Tape", "Wrapping", "Hobbleskirts"]; -let KDLegbinderRender = ["Belts", "Tape", "Wrapping"]; -let KDLegRopesBind = ["Legbinders", "Hobbleskirts", "Tape", "Belts", "Wrapping"]; -let KDLegRopesRender = ["Belts", "Ties"]; -let KDTapeLink = ["Wrapping", "Belts", "Masks", "Mittens", "FlatGags"]; // Standard link for tape style items -let KDTapeRender = ["Wrapping", "Tape", "Belts", "Masks", "Mittens", "FlatGags", "Ties", "Harnesses", "Corsets"]; // Standard link for tape style items -let KDRubberLink = ["Wrapping", "Tape", "Belts", "Masks", "Mittens"]; // Standard link for rubber style items -let KDBlindfoldLink = ["Wrapping", "Masks", "Tape"]; -let KDVisorLink = ["Wrapping", "Masks", "Tape"]; -let KDWrappingLink = ["Masks", "Wrapping"]; -let KDMaskLink = []; -let KDStuffingLink = ["BallGags", "FlatGags", "Stuffing", "Tape", "Wrapping"]; -let KDBallGagLink = ["FlatGags", "Tape", "Wrapping"]; -let KDFlatGagLink = ["FlatGags", "Tape", "Wrapping"]; -let KDPlugGagLink = ["FlatGags", "Tape", "Wrapping"]; -let KDCollarLink = ["Collars", "HighCollars"]; -//let KDCorsetRender = ["Harnesses", "ArmbinderHarness", "Ties", "Belts"]; - -/** - * @type {restraint[]} - */ -const KinkyDungeonRestraints = [ - {name: "ScarfArms", unlimited: true, accessible: true, debris: "Fabric", Asset: "DuctTape", Color: "#880022", Group: "ItemArms", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], bindarms: true, power: 0, weight: 0, escapeChance: {"Struggle": 0.5, "Cut": 0.9, "Remove": 0.2}, - affinity: {Remove: ["Hook"],}, - enemyTags: {"scarfRestraints":2}, playerTags: {"ItemArmsFull":2}, minLevel: 0, allFloors: true, shrine: ["Rope", "Tape"]}, - {name: "ScarfLegs", unlimited: true, accessible: true, debris: "Fabric", OverridePriority: 25.1, Asset: "DuctTape", Color: "#880022", Group: "ItemLegs", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], hobble: true, power: 0, weight: 0, escapeChance: {"Struggle": 0.5, "Cut": 0.9, "Remove": 0.2}, - affinity: {Remove: ["Hook"],}, - enemyTags: {"scarfRestraints":2}, playerTags: {"ItemLegsFull":2}, minLevel: 0, allFloors: true, shrine: ["Rope","Tape"]}, - {name: "ScarfFeet", unlimited: true, accessible: true, debris: "Fabric", Asset: "DuctTape", Color: "#880022", Group: "ItemFeet", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], blockfeet: true, power: 0, weight: 0, escapeChance: {"Struggle": 0.5, "Cut": 0.9, "Remove": 0.2}, - affinity: {Remove: ["Hook"],}, - enemyTags: {"scarfRestraints":2}, playerTags: {"ItemFeetFull":2}, minLevel: 0, allFloors: true, shrine: ["Rope", "Tape"]}, - // Simple cloth stuff - {name: "ScarfGag", unlimited: true, Asset: "ScarfGag", debris: "Fabric", accessible: true, gag: 0.3, Type: "OTN", Color: "#880022", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, - affinity: {Remove: ["Hook"],}, - enemyTags: {"scarfRestraints":8, "ropeAuxiliary": 1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Gags", "Tape"]}, - {name: "ScarfBlindfold", unlimited: true, Asset: "ScarfBlindfold", debris: "Fabric", accessible: true, Color: "#880022", Group: "ItemHead", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, - affinity: {Struggle: ["Sticky", "Hook"], Remove: ["Hook"],}, - blindfold: 1, enemyTags: {"scarfRestraints":8, "ropeAuxiliary": 1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Blindfolds", "Tape"]}, - - - // region Kigu - {inventory: true, name: "KiguMask", inaccessible: true, Asset: "KirugumiMask", Color: ["Default", "Default"], AssetGroup: "ItemHood", Group: "ItemHead", LinkableBy: [...KDMaskLink], gag: 0.3, blindfold: 1, power: 7, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.1, "Remove": 0.33, "Pick": 0.15, "Unlock": 0.6}, - enemyTags: {"kiguRestraints":1}, playerTags: {"ItemMouth1Full":2, "ItemMouth2Full":1, "Unmasked": -1000}, minLevel: 0, allFloors: true, shrine: ["Latex", "Masks", "Block_ItemMouth"], events: [ - {trigger: "onWear", type: "setSkinColor"}, - ]}, - // endregion - - //region DuctTape - // Not super punishing but would be hard to apply IRL - {inventory: true, name: "DuctTapeHands", unlimited: true, inaccessible: true, Asset: "DuctTape", Color: "Default", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHands", - factionColor: [[], [0]], - bindhands: 0.9, power: 1, weight: 0, escapeChance: {"Struggle": -0.1, "Cut": 0.4, "Remove": 0.4}, struggleMaxSpeed: {"Remove": 0.1}, - strictness: 0.05, strictnessZones: ["ItemHands"], failSuffix: {"Remove": "Tape"}, - maxwill: 0.6, enemyTags: {"tapeRestraints":8}, playerTags: {"ItemHandsFull": -4}, minLevel: 0, allFloors: true, shrine: ["Tape"]}, - - {removePrison: true, name: "DuctTapeArms", unlimited: true, debris: "Fabric", accessible: true, Asset: "DuctTape", Color: "#AA2222", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemArms", bindarms: true, power: -2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {"ItemArmsFull":8}, minLevel: 0, allFloors: true, shrine: ["Charms", "Tape", "Will"]}, - {removePrison: true, name: "DuctTapeFeet", unlimited: true, debris: "Fabric", accessible: true, Asset: "DuctTape", Color: "#AA2222", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemFeet", blockfeet: true, power: -2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {"ItemLegsFull":8}, minLevel: 0, allFloors: true, shrine: ["Charms", "Tape", "Will"]}, - {removePrison: true, name: "DuctTapeBoots", unlimited: true, debris: "Fabric", inaccessible: true, Asset: "ToeTape", Type: "Full", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Color: "#AA2222", Group: "ItemBoots", blockfeet: true, power: -2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {"ItemFeetFull":8}, minLevel: 0, allFloors: true, shrine: ["Charms", "Wrapping", "Will"]}, - {removePrison: true, name: "DuctTapeLegs", OverridePriority: 25.1, unlimited: true, debris: "Fabric", accessible: true, Asset: "DuctTape", Color: "#AA2222", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemLegs", hobble: true, power: -2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {"ItemFeetFull":8}, minLevel: 0, allFloors: true, shrine: ["Charms", "Tape", "Will"]}, - {removePrison: true, name: "DuctTapeHead", unlimited: true, debris: "Fabric", inaccessible: true, Type: "Wrap", Asset: "DuctTape", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Color: "#AA2222", Group: "ItemHead", power: -2, blindfold: 2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Charms", "Tape", "Will"]}, - {removePrison: true, name: "DuctTapeMouth", unlimited: true, debris: "Fabric", Asset: "DuctTape", Color: "#AA2222", Group: "ItemMouth", AssetGroup: "ItemMouth2", gag: 0.5, power: -2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {"ItemMouth1Full":8}, minLevel: 0, allFloors: true, shrine: ["Charms", "Gags", "Tape", "Will"]}, - {removePrison: true, name: "DuctTapeHeadMummy", unlimited: true, debris: "Fabric", inaccessible: true, Asset: "LeatherSlimMask", LinkableBy: [...KDWrappingLink], renderWhenLinked: [...KDWrappingLink], Color: "#AA2222", Group: "ItemHead", gag: 0.5, blindfold: 3, power: 2, weight: 0, escapeChance: {"Struggle": 0.15, "Cut": 0.8, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"ribbonRestraints":1}, playerTags: {"ItemMouth1Full":2, "ItemMouth2Full":1, "Unmasked": -1000}, minLevel: 2, allFloors: true, shrine: ["Charms", "Wrapping", "Block_ItemMouth", "Will"]}, - {removePrison: true, name: "DuctTapeArmsMummy", unlimited: true, debris: "Fabric", inaccessible: true, Type: "Complete", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], remove: ["Cloth", "ClothLower"], Asset: "DuctTape", Color: "#AA2222", Group: "ItemArms", bindarms: true, power: 2, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.8, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"ribbonRestraints":1}, playerTags: {"ItemArmsFull":3}, minLevel: 0, allFloors: true, shrine: ["Charms", "Wrapping", "Will"]}, - {removePrison: true, name: "DuctTapeLegsMummy", OverridePriority: 25.1, unlimited: true, debris: "Fabric", inaccessible: true, Type: "CompleteLegs", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], remove: ["ClothLower"], Asset: "DuctTape", Color: "#AA2222", Group: "ItemLegs", hobble: true, power: 2, weight: 0, escapeChance: {"Struggle": 0.15, "Cut": 0.8, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"ribbonRestraints":1}, playerTags: {"ItemLegsFull":3}, minLevel: 0, allFloors: true, shrine: ["Charms", "Hobbleskirts", "Wrapping", "Will"]}, - {removePrison: true, name: "DuctTapeFeetMummy", unlimited: true, debris: "Fabric", inaccessible: true, Type: "CompleteFeet", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Asset: "DuctTape", Color: "#AA2222", Group: "ItemFeet", blockfeet: true, power: 2, weight: 0, escapeChance: {"Struggle": 0.15, "Cut": 0.8, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"ribbonRestraints":1}, playerTags: {"ItemFeetFull":3}, minLevel: 0, allFloors: true, shrine: ["Charms", "Wrapping", "Will"]}, - //endregion - - //region MysticDuctTape - {removePrison: true, name: "MysticDuctTapeHead", unlimited: true, debris: "FabricGreen", inaccessible: true, Type: "Wrap", Asset: "DuctTape", Color: "#55AA22", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHead", blindfold: 3, power: 1, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": 0.6, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"mummyRestraints":-399}, playerTags: {"ItemMouth2Full":99, "ItemArmsFull":99, "ItemLegsFull":99, "ItemFeetFull":99, "ItemBootsFull":99}, minLevel: 0, allFloors: true, shrine: ["Charms", "Wrapping", "Block_ItemMouth", "Will"]}, - {removePrison: true, name: "MysticDuctTapeMouth", unlimited: true, debris: "FabricGreen", inaccessible: true, Asset: "DuctTape", Color: "#55AA22", Group: "ItemMouth", AssetGroup: "ItemMouth2", gag: 0.5, power: 1, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": 0.6, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"mummyRestraints":-299}, playerTags: {"ItemArmsFull":99, "ItemLegsFull":99, "ItemFeetFull":99, "ItemBootsFull":99}, minLevel: 0, allFloors: true, shrine: ["Charms", "Gags", "Tape", "Will"]}, - {removePrison: true, name: "MysticDuctTapeArmsMummy", unlimited: true, debris: "FabricGreen", inaccessible: true, Type: "Complete", remove: ["Cloth", "ClothLower"], LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Asset: "DuctTape", Color: "#55AA22", Group: "ItemArms", bindarms: true, power: 3, weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.5, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"mummyRestraints":-199}, playerTags: {"ItemLegsFull":99, "ItemFeetFull":99, "ItemBootsFull":99}, minLevel: 0, allFloors: true, shrine: ["Charms", "Wrapping", "Will"]}, - {removePrison: true, name: "MysticDuctTapeLegsMummy", unlimited: true, OverridePriority: 25.1, debris: "FabricGreen", inaccessible: true, Type: "CompleteLegs", remove: ["ClothLower"], LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Asset: "DuctTape", Color: "#55AA22", Group: "ItemLegs", hobble: true, power: 3, weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.5, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"mummyRestraints":-99}, playerTags: {"ItemFeetFull":99, "ItemBootsFull":99}, minLevel: 0, allFloors: true, shrine: ["Charms", "Hobbleskirts", "Will", "Wrapping"]}, - {removePrison: true, name: "MysticDuctTapeFeetMummy", unlimited: true, debris: "FabricGreen", inaccessible: true, Type: "CompleteFeet", Asset: "DuctTape", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Color: "#55AA22", Group: "ItemFeet", blockfeet: true, power: 3, weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.5, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"mummyRestraints":-1}, playerTags: {"ItemBootsFull":99}, minLevel: 0, allFloors: true, shrine: ["Charms", "Wrapping", "Will"]}, - {removePrison: true, name: "MysticDuctTapeBoots", unlimited: true, debris: "FabricGreen", inaccessible: true, Asset: "ToeTape", Type: "Full", Color: "#55AA22", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemBoots", blockfeet: true, power: 3, weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.5, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"mummyRestraints":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Charms", "Wrapping", "Will"]}, - //endregion - - //region AutoTape - {inventory: true, name: "AutoTapeHands", unlimited: true, inaccessible: true, Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHands", - bindhands: 1.0, power: 6, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0.}, struggleMaxSpeed: {"Remove": 0.1}, failSuffix: {"Remove": "Tape"}, - strictness: 0.1, strictnessZones: ["ItemHands"], limitChance: {Struggle: 0.12}, - maxwill: 0.6, enemyTags: {"autoTape":8}, playerTags: {"ItemHandsFull": -4}, minLevel: 8, allFloors: true, shrine: ["Tape"]}, - {removePrison: true, name: "AutoTapeArms", unlimited: true, accessible: true, Type: "Top", Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemArms", - bindarms: true, power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"autoTape":10}, playerTags: {"ItemArmsFull":8}, minLevel: 0, allFloors: true, shrine: ["Tape"]}, - {removePrison: true, name: "AutoTapeFeet", unlimited: true, accessible: true, Asset: "DuctTape", Color: "#6E9FA3", Group: "ItemFeet", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], blockfeet: true, power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"autoTape":10}, playerTags: {"ItemLegsFull":8}, minLevel: 0, allFloors: true, shrine: ["Tape"]}, - {removePrison: true, name: "AutoTapeBoots", unlimited: true, accessible: true, Asset: "ToeTape", Type: "Full", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemBoots", blockfeet: true, power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"autoTape":10}, playerTags: {"ItemFeetFull":8}, minLevel: 0, allFloors: true, shrine: ["Tape", "Wrapping"]}, - {removePrison: true, name: "AutoTapeLegs", unlimited: true, accessible: true, Type: "MostLegs", Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemLegs", hobble: true, power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"autoTape":10}, playerTags: {"ItemFeetFull":8}, minLevel: 0, allFloors: true, shrine: ["Tape"]}, - {removePrison: true, name: "AutoTapeHead", unlimited: true, inaccessible: true, Type: "Wrap", Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHead", power: 5, blindfold: 3, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Tape"]}, - {removePrison: true, name: "AutoTapeMouth", unlimited: true, accessible: true, Asset: "DuctTape", Type: "Double", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemMouth", AssetGroup: "ItemMouth2", gag: 0.5, power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, - enemyTags: {"autoTape":10}, playerTags: {"ItemMouth1Full":8}, minLevel: 0, allFloors: true, shrine: ["Gags", "Tape"]}, - //endregion - - {removePrison: true, name: "ShadowHandMouth", unlimited: true, inaccessible: true, tether: 1.5, Asset: "DuctTape", Type: "Double", Color: ["#3c115c"], Group: "ItemMouth", AssetGroup: "ItemMouth3", gag: 0.5, - power: 4, weight: 0, escapeChance: {"Struggle": 0.5, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, - enemyTags: {"shadowHands":10, "shadowBolt": 10}, playerTags: {"ItemMouth1Full":-9}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Wrapping", "Shadow", "Illusion"], - events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, - - {removePrison: true, name: "ShadowHandArms", unlimited: true, LinkableBy: ["Shadow"], accessible: true, tether: 1.5, Asset: "DuctTape", Color: ["#3c115c"], Group: "ItemArms", bindarms: true, - power: 4, weight: 0, escapeChance: {"Struggle": 0.35, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, - enemyTags: {"shadowHands":10, "shadowBolt": 6}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Tape", "Shadow", "Illusion"], - events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, - - {removePrison: true, name: "ShadowHandArmsHeavy", unlimited: true, inaccessible: true, tether: 1.5, Asset: "DuctTape", Type: "Top", Color: ["#3c115c"], Group: "ItemArms", bindarms: true, bindhands: 0.5, - power: 5, weight: -9, escapeChance: {"Struggle": 0.1, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, - enemyTags: {"shadowHands":1, "shadowBolt": 1}, playerTags: {"ItemArmsFull":9}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Wrapping", "Shadow", "Illusion"], - events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, - - {removePrison: true, name: "ShadowHandLegs", unlimited: true, LinkableBy: ["Shadow"], accessible: true, tether: 1.5, Asset: "DuctTape", Color: ["#3c115c"], Group: "ItemLegs", hobble: true, - power: 4, weight: 0, escapeChance: {"Struggle": 0.5, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, - enemyTags: {"shadowHands":10, "shadowBolt": 1}, playerTags: {"ItemArmsEmpty": -1}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Tape", "Shadow", "Illusion"], - events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, - {removePrison: true, name: "ShadowHandLegsHeavy", unlimited: true, inaccessible: true, tether: 1.5, Asset: "DuctTape", Color: ["#3c115c"], Group: "ItemLegs", Type: "MostLegs", hobble: true, blockfeet: true, - power: 5, weight: -5, escapeChance: {"Struggle": 0.1, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, - enemyTags: {"shadowHands":1, "shadowBolt": 1}, playerTags: {"ItemLegsFull": 5, "ItemFeetFull": 3}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Wrapping", "Shadow", "Illusion"], - events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, - - - {removePrison: true, name: "ShadowHandCrotch", unlimited: true, accessible: true, tether: 1.5, Asset: "Ribbons", Color: ["#3c115c"], Group: "ItemPelvis", crotchrope: true, strictness: 0.15, - power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, - enemyTags: {"shadowHands":10, "shadowBolt": 2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Wrapping", "Shadow", "Illusion"], - events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, - - {removePrison: true, name: "ShadowHandFeet", unlimited: true, accessible: true, tether: 1.5, Asset: "DuctTape", Color: ["#3c115c"], Group: "ItemFeet", blockfeet: true, - power: 4, weight: 0, escapeChance: {"Struggle": 0.4, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, - enemyTags: {"shadowHands":10, "shadowBolt": 2}, playerTags: {"ItemLegsEmpty": -2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Wrapping", "Shadow", "Illusion"], - events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, - - //region Slime - {removePrison: true, name: "SlimeBoots", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, Asset: "ToeTape", Type: "Full", Color: "#9B49BD", Group: "ItemBoots", blockfeet: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0, "Remove": 0}, - events: [{trigger: "tick", type: "slimeSpread", power: 0.04}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 1, - failSuffix: {"Remove": "Slime"}, - factionColor: [[], [0]], - enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 2, "slimeRestraintsRandomLight": 2}, playerTags: {}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "Slime"], addTag: ["slime"]}, - {removePrison: true, name: "SlimeFeet", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, Asset: "DuctTape", Type: "CompleteFeet", OverridePriority: 24, Color: "#9B49BD", Group: "ItemFeet", blockfeet: true, power: 4, weight: -100, escapeChance: {"Struggle": 0.3, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.05}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 1, - failSuffix: {"Remove": "Slime"}, - factionColor: [[], [0]], - enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 101, "slimeRestraintsRandomLight": 101}, playerTags: {"ItemBootsFull":15}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "Slime"], addTag: ["slime"]}, - {removePrison: true, name: "SlimeLegs", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, remove: ["ClothLower"], Asset: "SeamlessHobbleSkirt", Color: "#9B49BD", Group: "ItemLegs", hobble: true, power: 4, weight: -102, escapeChance: {"Struggle": 0.22, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.07}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 1, - failSuffix: {"Remove": "Slime"}, - factionColor: [[], [0]], - enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 103, "slimeRestraintsRandomLight": 103}, playerTags: {"ItemFeetFull":2, "ItemBootsFull":2}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Hobbleskirts", "Slime"], addTag: ["slime"]}, - {removePrison: true, name: "SlimeArms", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, remove: ["Bra"], Asset: "StraitLeotard", Modules: [0, 0, 0, 0], Color: ["#9B49BD", "#9B49BD", "#9B49BD"], Group: "ItemArms", bindarms: true, bindhands: 0.25, power: 6, weight: -102, escapeChance: {"Struggle": 0.2, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.1}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 1, - failSuffix: {"Remove": "Slime"}, - factionColor: [[], [0, 1, 2]], - enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 103}, playerTags: {"ItemFeetFull":2, "ItemBootsFull":2, "ItemLegsFull":2}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Slime"], addTag: ["slime"]}, - {removePrison: true, name: "SlimeHands", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, Asset: "DuctTape", Color: "#9B49BD", Group: "ItemHands", bindhands: 0.5, power: 1, weight: -102, escapeChance: {"Struggle": 0.4, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.05}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 1, - failSuffix: {"Remove": "Slime"}, - factionColor: [[], [0]], - enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 103, "slimeRestraintsRandomLight": 103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHeadFull":1}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Slime"], addTag: ["slime"]}, - {removePrison: true, name: "SlimeMouth", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, Asset: "LatexBallMuzzleGag", Color: "#9B49BD", Group: "ItemMouth", AssetGroup: "ItemMouth3", gag: 0.75, power: 4, weight: -102, escapeChance: {"Struggle": 0.22, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.05}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 1, - failSuffix: {"Remove": "Slime"}, - factionColor: [[], [0, 1, 2]], - enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHandsFull":1, "ItemArmsFull":1}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "Slime", "Gags"], addTag: ["slime"]}, - {removePrison: true, name: "SlimeHead", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, Asset: "LeatherSlimMask", Color: "#9B49BD", Group: "ItemHead", gag: 0.5, blindfold: 4, power: 4, weight: -103, escapeChance: {"Struggle": 0.22, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.05}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 1, - failSuffix: {"Remove": "Slime"}, - factionColor: [[], [0]], - enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 100}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHandsFull":1, "ItemArmsFull":1, "ItemMouth3Full":1, "Unmasked": -1000}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "Block_ItemMouth", "Slime"], addTag: ["slime"]}, - //endregion - - //region HardSlime - {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeBoots", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "ToeTape", Type: "Full", Color: "#9B49BD", Group: "ItemBoots", blockfeet: true, power: 5, weight: 0, - escapeChance: {"Struggle": 0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - factionColor: [[], [0]], - enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "SlimeHard"]}, - {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeFeet", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "DuctTape", Type: "CompleteFeet", OverridePriority: 24, Color: "#9B49BD", Group: "ItemFeet", blockfeet: true, power: 6, weight: -100, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - factionColor: [[], [0]], - enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemBootsFull":15}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "SlimeHard"]}, - {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeLegs", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, remove: ["ClothLower"], Asset: "SeamlessHobbleSkirt", Color: "#9B49BD", Group: "ItemLegs", hobble: true, power: 6, weight: -102, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - factionColor: [[], [0]], - enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemFeetFull":2, "ItemBootsFull":2}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Hobbleskirts", "Wrapping", "SlimeHard"]}, - {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeArms", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, remove: ["Bra"], Asset: "StraitLeotard", Modules: [0, 0, 0, 0], Color: ["#9B49BD", "#9B49BD", "#9B49BD"], Group: "ItemArms", bindarms: true, bindhands: 0.35, power: 8, weight: -102, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - factionColor: [[], [0, 1, 2]], - enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemFeetFull":2, "ItemBootsFull":2, "ItemLegsFull":2}, - minLevel: 0, allFloors: true, shrine: ["Latex", "SlimeHard", "Wrapping"]}, - {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeHands", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "DuctTape", Color: "#9B49BD", Group: "ItemHands", bindhands: 0.65, power: 5, weight: -102, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - factionColor: [[], [0]], - enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHeadFull":1}, - minLevel: 0, allFloors: true, shrine: ["Latex", "SlimeHard"]}, - {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeMouth", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, inaccessible: true, Asset: "KittyGag", LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], Color: ["#9B49BD", "#9B49BD", "#9B49BD"], Group: "ItemMouth", AssetGroup: "ItemMouth3", gag: 0.75, power: 6, weight: -102, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - factionColor: [[], [0, 1, 2]], - enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHandsFull":1, "ItemArmsFull":1}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "SlimeHard", "Gags"]}, - {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeHead", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "LeatherSlimMask", Color: "#9B49BD", Group: "ItemHead", gag: 0.5, blindfold: 4, power: 6, weight: -102, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - factionColor: [[], [0]], - enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHandsFull":1, "ItemArmsFull":1, "ItemMouth3Full":1, "Unmasked": -1000}, - minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "Block_ItemMouth", "SlimeHard"]}, - - - - //region Slime - {removePrison: true, name: "ProtoSlimeBoots", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, Asset: "ToeTape", Type: "Full", Color: "#404973", Group: "ItemBoots", blockfeet: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.4, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", restraint: "Proto", power: 0.02}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 0.5, - failSuffix: {"Remove": "Slime"}, enemyTags: {"moldRestraints":100, "moldRestraintsRandom": 2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "Slime"], addTag: ["slime"]}, - {removePrison: true, name: "ProtoSlimeFeet", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, Asset: "DuctTape", Type: "CompleteFeet", OverridePriority: 24, Color: "#404973", Group: "ItemFeet", blockfeet: true, power: 4, weight: -100, escapeChance: {"Struggle": 0.4, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", restraint: "Proto", power: 0.03}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 0.5, - failSuffix: {"Remove": "Slime"}, enemyTags: {"moldRestraints":100, "moldRestraintsRandom": 101}, playerTags: {"ItemBootsFull":15}, minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "Slime"], addTag: ["slime"]}, - {removePrison: true, name: "ProtoSlimeLegs", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, remove: ["ClothLower"], Asset: "SeamlessHobbleSkirt", Color: "#404973", Group: "ItemLegs", hobble: true, power: 4, weight: -102, escapeChance: {"Struggle": 0.3, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", restraint: "Proto", power: 0.02}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 0.5, - failSuffix: {"Remove": "Slime"}, enemyTags: {"moldRestraints":100, "moldRestraintsRandom": 103}, playerTags: {"ItemFeetFull":2, "ItemBootsFull":2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Hobbleskirts", "Slime"], addTag: ["slime"]}, - {removePrison: true, name: "ProtoSlimeArms", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, remove: ["Bra"], Asset: "StraitLeotard", Modules: [0, 0, 0, 0], Color: ["#404973", "#404973", "#404973"], Group: "ItemArms", bindarms: true, bindhands: 0.2, power: 6, weight: -102, escapeChance: {"Struggle": 0.3, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", restraint: "Proto", power: 0.05}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 0.5, - failSuffix: {"Remove": "Slime"}, enemyTags: {"moldRestraints":100, "moldRestraintsRandom": 103}, playerTags: {"ItemFeetFull":2, "ItemBootsFull":2, "ItemLegsFull":2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Slime"], addTag: ["slime"]}, - {removePrison: true, name: "ProtoSlimeHands", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, Asset: "DuctTape", Color: "#404973", Group: "ItemHands", bindhands: 0.4, power: 1, weight: -102, escapeChance: {"Struggle": 0.45, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", restraint: "Proto", power: 0.02}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 0.5, - failSuffix: {"Remove": "Slime"}, enemyTags: {"moldRestraints":100, "moldRestraintsRandom": 103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHeadFull":1}, minLevel: 0, allFloors: true, shrine: ["Latex", "Slime"], addTag: ["slime"]}, - {removePrison: true, name: "ProtoSlimeMouth", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, Asset: "LatexBallMuzzleGag", Color: "#404973", Group: "ItemMouth", AssetGroup: "ItemMouth3", gag: 0.6, power: 4, weight: -102, escapeChance: {"Struggle": 0.3, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", restraint: "Proto", power: 0.02}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 0.5, - failSuffix: {"Remove": "Slime"}, enemyTags: {"moldRestraints":100, "moldRestraintsRandom": 103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHandsFull":1, "ItemArmsFull":1}, minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "Slime", "Gags"], addTag: ["slime"]}, - {removePrison: true, name: "ProtoSlimeHead", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "Slime", linkSize: 0.6, Asset: "LeatherSlimMask", Color: "#404973", Group: "ItemHead", gag: 0.3, blindfold: 4, power: 4, weight: -103, escapeChance: {"Struggle": 0.3, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", restraint: "Proto", power: 0.02}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 0.5, - failSuffix: {"Remove": "Slime"}, enemyTags: {"moldRestraints":100, "moldRestraintsRandom": 100}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHandsFull":1, "ItemArmsFull":1, "ItemMouth3Full":1, "Unmasked": -1000}, minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "Block_ItemMouth", "Slime"], addTag: ["slime"]}, - //endregion - - //region HardSlime - {inventory: true, removePrison: true, name: "HardProtoSlimeBoots", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "ToeTape", Type: "Full", Color: "#404973", Group: "ItemBoots", blockfeet: true, power: 5, weight: 0, - escapeChance: {"Struggle": 0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "SlimeHard"]}, - {inventory: true, removePrison: true, name: "HardProtoSlimeFeet", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "DuctTape", Type: "CompleteFeet", OverridePriority: 24, Color: "#404973", Group: "ItemFeet", blockfeet: true, power: 6, weight: -100, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "SlimeHard"]}, - {inventory: true, removePrison: true, name: "HardProtoSlimeLegs", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, remove: ["ClothLower"], Asset: "SeamlessHobbleSkirt", Color: "#404973", Group: "ItemLegs", hobble: true, power: 6, weight: -102, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Hobbleskirts", "SlimeHard"]}, - {inventory: true, removePrison: true, name: "HardProtoSlimeArms", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, remove: ["Bra"], Asset: "StraitLeotard", Modules: [0, 0, 0, 0], Color: ["#404973", "#404973", "#404973"], Group: "ItemArms", bindarms: true, bindhands: 0.25, power: 8, weight: -102, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "SlimeHard"]}, - {inventory: true, removePrison: true, name: "HardProtoSlimeHands", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "DuctTape", Color: "#404973", Group: "ItemHands", bindhands: 0.5, power: 5, weight: -102, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "SlimeHard"]}, - {inventory: true, removePrison: true, name: "HardProtoSlimeMouth", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "KittyGag", Color: ["#404973", "#404973", "#404973"], Group: "ItemMouth", AssetGroup: "ItemMouth3", gag: 0.6, power: 6, weight: -102, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "SlimeHard", "Gags"]}, - {inventory: true, removePrison: true, name: "HardProtoSlimeHead", debris: "Slime", linkCategory: "Slime", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "LeatherSlimMask", Color: "#404973", Group: "ItemHead", gag: 0.3, blindfold: 4, power: 6, weight: -102, - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, - enemyTags: {}, playerTags: {"Unmasked": -1000}, minLevel: 0, allFloors: true, shrine: ["Latex", "Wrapping", "Block_ItemMouth", "SlimeHard"]}, - //endregion - - //region Glue - {removePrison: true, name: "GlueBoots", unlimited: true, debris: "Slime", inaccessible: true, Asset: "ToeTape", Type: "Full", Color: "#f0b541", Group: "ItemBoots", blockfeet: true, power: 1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.0, "Remove": 0.05}, - enemyTags: {"glueRestraints":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Slime"]}, - {removePrison: true, name: "GlueFeet", unlimited: true, debris: "Slime", inaccessible: true, Asset: "DuctTape", Type: "CompleteFeet", OverridePriority: 24, Color: "#f0b541", Group: "ItemFeet", blockfeet: true, power: 1, weight: -100, escapeChance: {"Struggle": 0.25, "Cut": 0.0, "Remove": 0.05}, - enemyTags: {"glueRestraints":100}, playerTags: {"ItemBootsFull":15}, minLevel: 0, allFloors: true, shrine: ["Latex", "Slime"]}, - {removePrison: true, name: "GlueLegs", unlimited: true, debris: "Slime", inaccessible: true, remove: ["ClothLower"], Asset: "SeamlessHobbleSkirt", Color: "#f0b541", Group: "ItemLegs", blockfeet: true, power: 1, weight: -102, escapeChance: {"Struggle": 0.2, "Cut": 0.0, "Remove": 0.05}, - enemyTags: {"glueRestraints":100}, playerTags: {"ItemBootsFull":2, "ItemFeetFull":2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Hobbleskirts", "Slime"]}, - //endregion - - - //region CyberDoll - {inventory: true, sfx: "FutureLock", arousalMode: true, name: "CyberBelt", Asset: "FuturisticChastityBelt", Modules: [3, 1, 1, 1, 1], OverridePriority: 26, - Color: ['#222222', '#499ed6', '#555555', '#000000', '#555555', '#b927a8', '#3868E8', '#555555', '#222222'], - // Body, Display, Panel, Lock, band, trim, band, underplug, plug, strap - factionColor: [[0], [5], [1]], - Group: "ItemPelvis", chastity: true, power: 20, weight: 0, DefaultLock: "Red", - Security: { - level_tech: 2, - }, - maxwill: 0.4, - escapeChance: {"Struggle": -1.3, "Cut": -0.8, "Remove": 1.0, "Pick": -0.35}, - enemyTags: {"cyberdollchastity" : 10}, - playerTags: {"ItemVulvaEmpty" : -5, "ItemVulvaPiercingsEmpty" : -5}, - minLevel: 7, allFloors: true, shrine: ["Metal", "Chastity", "Cyber", "CyberChastityL"]}, - {inventory: true, sfx: "FutureLock", arousalMode: true, trappable: true, name: "CyberBra", Asset: "FuturisticBra2", OverridePriority: 26, - Color: ['#499ed6', '#555555', '#222222', '#ffffff', '#555555', '#000000', "#000000"], Group: "ItemBreast", - factionColor: [[2, 5], [2], [0]], - chastitybra: true, power: 15, weight: 0, DefaultLock: "Gold", - Security: { - level_tech: 2, - }, - maxwill: 0.6, - escapeChance: {"Struggle": -1.1, "Cut": -0.8, "Remove": 1.0, "Pick": -0.35}, - enemyTags: {"cyberdollchastity" : 10}, - playerTags: {}, - minLevel: 4, allFloors: true, shrine: ["Metal", "Chastity", "Cyber", "CyberChastityU"]}, - - - {alwaysRender: true, sfx: "FutureLock", inventory: true, name: "ControlHarness", debris: "Chains", accessible: true, Asset: "FuturisticHarness", LinkableBy: [...KDHarnessLink], strictness: 0.1, - Color: ['#499ed6', '#555555', '#555555', '#000000'], - factionColor: [[], [], [0]], - Group: "ItemTorso", power: 10, weight: 0, - escapeChance: {"Struggle": -0.4, "Cut": -0.2, "Remove": 0.4, "Pick": 0.1}, - DefaultLock: "Red", - maxwill: 0.5, - enemyTags: {"controlHarness" : 20, "roboPrisoner" : 10, "cyberdollrestraints" : 100}, - playerTags: {}, - minLevel: 7, allFloors: true, shrine: ["Metal", "Harnesses", "Cyber"], - events: [ - {trigger: "postApply", type: "ControlHarness", power: 1, inheritLinked: true}, - ]}, - - {inventory: true, sfx: "FutureLock", name: "TrackingCollar", debris: "Chains", accessible: true, Asset: "FuturisticCollar", - Color: ['#499ed6', '#555555', '#b927a8', '#000000'], - factionColor: [[], [2], [0]], - Group: "ItemNeck", LinkableBy: [...KDCollarLink], power: 9, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.25, "Pick": -0.1}, - maxwill: 0.5, - enemyTags: {"controlHarness":5, "roboPrisoner" : 100, "cyberdollrestraints" : 10}, - playerTags: {"ItemNeckEmpty":10}, - minLevel: 0, allFloors: true, shrine: ["Metal", "Collars", "Cyber"], - events: [ - {trigger: "playerAttack", type: "AlertEnemies", chance: 1.0, power: 10, sfx: "RobotBeep", inheritLinked: true}, - ]}, - - - { - inventory: true, sfx: "FutureLock", name: "DollmakerVisor", accessible: true, Asset: "InteractiveVisor", - curse: "DollLock", - Color: ['#91023a'], - Group: "ItemHead", LinkableBy: [...KDVisorLink], - power: 40, weight: 0, escapeChance: {"Struggle": -0.6, "Cut": -1.0, "Remove": 0.5, "Pick": -0.5}, - maxwill: 0.1, - enemyTags: {}, - playerTags: {}, - events: [ - {trigger: "tick", type: "DollmakerMask", inheritLinked: true}, - {trigger: "calcBlind", type: "DollmakerMask", inheritLinked: true}, - {trigger: "kill", type: "DollmakerMask", inheritLinked: true}, - {trigger: "draw", type: "DollmakerMask", inheritLinked: true}, - ], - minLevel: 0, allFloors: true, shrine: ["Visors", "Cyber"], - }, - { - inventory: true, sfx: "FutureLock", name: "DollmakerMask", inaccessible: true, - curse: "DollLock", - factionColor: [[2]], Color: ["#ff5277"], Group: "ItemHead", Asset: "DroneMask", LinkableBy: [...KDMaskLink], - power: 50, weight: 0, escapeChance: {"Struggle": -0.6, "Cut": -1.0, "Remove": 0.5, "Pick": -0.5}, - maxwill: 0.1, - enemyTags: {}, - playerTags: {}, - events: [ - {trigger: "tick", type: "DollmakerMask", inheritLinked: true}, - {trigger: "calcBlind", type: "DollmakerMask", inheritLinked: true}, - {trigger: "kill", type: "DollmakerMask", inheritLinked: true}, - {trigger: "draw", type: "DollmakerMask", inheritLinked: true}, - ], - minLevel: 0, allFloors: true, shrine: ["Masks", "Block_ItemMouth", "Cyber"], - }, - - {inventory: true, sfx: "FutureLock", name: "CyberBallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], - Asset: "FuturisticHarnessBallGag", strictness: 0.35, gag: 0.65, - Color: ['#499ed6', '#b927a8', '#222222', '#FFFFFF', '#000000'], Group: "ItemMouth", power: 12, weight: 0, - factionColor: [[2], [1], [0]], - maxwill: 0.75, escapeChance: {"Struggle": -0.4, "Cut": -0.2, "Remove": 0.05, "Pick": -0.1}, - enemyTags: {"cyberdollrestraints" : 10}, - events: [ - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.2, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.15, requiredTag: "Blindfolds"}, - ], - playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Gags", "BallGags", "Metal", "Cyber"]}, - {inventory: true, sfx: "FutureLock", name: "CyberPlugGag", debris: "Belts", LinkableBy: [...KDPlugGagLink], renderWhenLinked: [...KDPlugGagLink], - events: [ - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.2, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.15, requiredTag: "Blindfolds"}, - ], - Asset: "FuturisticHarnessPanelGag", strictness: 0.35, gag: 1.0, - Color: ['#499ed6', '#222222', '#555555', '#FFFFFF', '#000000'], Group: "ItemMouth", power: 15, weight: 0, - factionColor: [[], [], [0]], - maxwill: 0.75, escapeChance: {"Struggle": -0.4, "Cut": -0.2, "Remove": 0.05, "Pick": -0.1}, - enemyTags: {"cyberdollrestraints" : 10}, - playerTags: {}, minLevel: 15, allFloors: true, shrine: ["Gags", "PlugGags", "Metal", "Cyber"]}, - - {inventory: true, sfx: "FutureLock", name: "CyberMuzzle", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], - inaccessible: true, - Asset: "FuturisticMuzzle", strictness: 0.35, gag: 0.5, - Color: ['#499ed6', '#222222', '#555555', '#FFFFFF', '#000000'], Group: "ItemMouth", power: 12, weight: 0, - factionColor: [[], [], [0]], - maxwill: 0.25, escapeChance: {"Struggle": -0.25, "Cut": -0.8, "Remove": 0.05, "Pick": -0.25}, - enemyTags: {"cyberdollheavy": 1}, - playerTags: {}, minLevel: 9, allFloors: true, shrine: ["Gags", "FlatGags", "Metal", "Cyber", "ControlHMouth"]}, - - {inventory: true, sfx: "FutureLock", name: "CyberDollJacket", inaccessible: true, remove: ["Bra"], Asset: "FuturisticStraitjacket", - Modules: [1, 1, 1, 1], - factionColor: [[0], [1], [3]], - Color: ["#222222", "#b927a8", "#000000", "#499ed6", "#222222", "#000000"], - Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 15, weight: 0, strictness: 0.2, - escapeChance: {"Struggle": -0.2, "Cut": -.3, "Remove": -0.3, "Pick": -0.1}, - limitChance: {"Struggle": -0.2, "Cut": 0.3, "Remove": 0.1, "Unlock": 0.75}, // Hard to escape the arms box by struggling - maxwill: 0.1, DefaultLock: "Red", - enemyTags: {"cyberdollheavy": 1}, - playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Straitjackets", "Cyber"]}, - - {inventory: true, sfx: "FutureLock", name: "CyberHeels", inaccessible: true, Asset: "FuturisticHeels2", - factionColor: [[0], [4], [1]], - Color: ["#222222", "#499ed6", "#ffffff", "Default", "#b927a8", "#222222", "#000000"], - Group: "ItemBoots", hobble: true, power: 10, weight: 0, - escapeChance: {"Struggle": -0.4, "Cut": -0.35, "Remove": 0.2, "Pick": -0.25}, - maxwill: 0.25, enemyTags: {"cyberdollrestraints" : 10}, - playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Boots", "Cyber"]}, - - - {inventory: true, sfx: "FutureLock", name: "CyberAnkleCuffs", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", Link: "CyberAnkleCuffs2", LinkableBy: [...KDBindable, ...KDDevices], - Color: ["#499ed6", "#499ed6", "#b927a8", "#000000"], - factionColor: [[], [2], [0,1]], - Group: "ItemFeet", power: 12, weight: 0, - escapeChance: {"Struggle": -0.8, "Cut": -0.65, "Remove": 0.25, "Pick": -0.15}, - enemyTags: {"cyberdollcuffs":6, "cyberdollrestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Cyber", "Cuffs", "AnkleCuffsBase"], - events: [ - {trigger: "hit", type: "linkItem", sfx: "FutureLock", chance: 0.0, subMult: 0.0, tags: ["lowwill"], noLeash: true} - ]}, - {name: "CyberAnkleCuffs2", sfx: "FutureLock", accessible: true, Asset: "FuturisticAnkleCuffs", debris: "Chains", DefaultLock: "Red", Link: "CyberAnkleCuffs3", UnLink: "CyberAnkleCuffs", LinkableBy: [...KDBindable, ...KDDevices], Type: "Chained", - Color: ["#499ed6", "#499ed6", "#b927a8", "#000000"], - factionColor: [[], [2], [0,1]], - Group: "ItemFeet", hobble: true, power: 12, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": -0.15, "Pick": 0}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "ControlHAnkle"], - events: [ - {trigger: "remove", type: "unlinkItem"}, - {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}, - {trigger: "hit", type: "linkItem", sfx: "FutureLock", chance: 0.0, subMult: 0.0, tags: ["lowwill"], noLeash: true} - ]}, - {name: "CyberAnkleCuffs3", sfx: "FutureLock", accessible: true, Asset: "FuturisticAnkleCuffs", debris: "Chains", DefaultLock: "Red", UnLink: "CyberAnkleCuffs2", LinkableBy: [...KDBindable, ...KDDevices], Type: "Closed", - Color: ["#499ed6", "#499ed6", "#b927a8", "#000000"], - factionColor: [[], [2], [0,1]], - Group: "ItemFeet", blockfeet: true, power: 12, weight: 0, - escapeChance: {"Struggle": -0.3, "Remove": -0.15, "Pick": -0.05}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "ControlHAnkle"], - events: [ - {trigger: "remove", type: "unlinkItem"}, - {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"} - ]}, - {inventory: true, sfx: "FutureLock", name: "CyberLegCuffs", debris: "Chains", accessible: true, Asset: "FuturisticLegCuffs", Link: "CyberLegCuffs2", LinkableBy: [...KDBindable, ...KDDevices], - Color: ["#499ed6", "#499ed6", "#b927a8", "#000000"], - factionColor: [[], [2], [0,1]], - Group: "ItemLegs", power: 12, weight: 0, - escapeChance: {"Struggle": -0.8, "Cut": -0.65, "Remove": 0.25, "Pick": -0.15}, - enemyTags: {"cyberdollcuffs":6, "cyberdollrestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Cyber", "Cuffs", "LegCuffsBase"], - events: [ - {trigger: "hit", type: "linkItem", sfx: "FutureLock", chance: 0.0, subMult: 0.0, tags: ["lowwill"], noLeash: true}]}, - {name: "CyberLegCuffs2", sfx: "FutureLock", accessible: true, Asset: "FuturisticLegCuffs", debris: "Chains", DefaultLock: "Red", UnLink: "CyberLegCuffs", LinkableBy: [...KDBindable, ...KDDevices], Type: "Closed", - Color: ["#499ed6", "#499ed6", "#b927a8", "#000000"], - factionColor: [[], [2], [0,1]], - Group: "ItemLegs", hobble: true, power: 12, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": -0.15, "Pick": 0}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "ControlHLeg"], - events: [ - {trigger: "remove", type: "unlinkItem"}, - {trigger: "postRemoval", type: "RequireBaseLegCuffs"} - ]}, - {renderWhenLinked: ["Ties"], sfx: "FutureLock", nonbinding: true, inventory: true, name: "CyberArmCuffs", debris: "Chains", DefaultLock: "Red", accessible: true, - Asset: "FuturisticCuffs", linkCategory: "Cuffs", linkSize: 0.55, LinkableBy: [...KDDevices, ...KDBindable], Link: "CyberArmCuffs2", - Color: ["#499ed6", "#b927a8", "#000000"], - factionColor: [[], [1], [0]], - Group: "ItemArms", bindarms: false, power: 12, weight: 0, - escapeChance: {"Struggle": -0.8, "Cut": -0.65, "Remove": 0.25, "Pick": -0.15}, - enemyTags: {"cyberdollcuffs":20, "cyberdollrestraints":6}, playerTags: {"ItemArmsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Cuffs", "ArmCuffsBase", "Cyber"], - maxwill: 0.8, events: [ - {trigger: "hit", type: "linkItem", sfx: "FutureLock", chance: 0.0, tags: ["lowwill"]}, - {trigger: "defeat", type: "linkItem", chance: 1.0} - ]}, - {name: "CyberArmCuffs2", sfx: "FutureLock", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Link: "CyberArmCuffs3", UnLink: "CyberArmCuffs", - Color: ["#499ed6", "#b927a8", "#000000"], - factionColor: [[], [1], [0]], - Group: "ItemArms", bindarms: true, power: 12, weight: 0, - escapeChance: {"Struggle": -0.2, "Remove": 0.2, "Pick": 0.1}, - helpChance: {"Remove": 0.4}, - enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "ControlHArm"], - events: [ - {trigger: "remove", type: "unlinkItem"}, - {trigger: "hit", type: "linkItem", sfx: "FutureLock", chance: 0, tags: ["lowwill"]}, - {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, - {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true} - ]}, - {name: "CyberArmCuffs3", sfx: "FutureLock", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", Type: "Both", LinkableBy: [...KDElbowBind, ...KDBindable], UnLink: "CyberArmCuffs4", - Color: ["#499ed6", "#b927a8", "#000000"], - factionColor: [[], [1], [0]], - Group: "ItemArms", bindarms: true, power: 12, - weight: 0, strictness: 0.1, - escapeChance: {"Struggle": -0.2, "Remove": -0.1, "Pick": 0}, - helpChance: {"Remove": 0.4}, - enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "ControlHArm"], - events: [ - {trigger: "remove", type: "unlinkItem"}, - {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, - {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true} - ]}, - {name: "CyberArmCuffs4", sfx: "FutureLock", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", Type: "Elbow", LinkableBy: [...KDElbowBind, ...KDBindable], Link: "CyberArmCuffs3", UnLink: "CyberArmCuffs", - Color: ["#499ed6", "#b927a8", "#000000"], - factionColor: [[], [1], [0]], - Group: "ItemArms", bindarms: true, power: 12, weight: 0, - escapeChance: {"Struggle": -0.3, "Remove": -0.15, "Pick": -0.05}, - helpChance: {"Remove": 0.4}, - enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "ControlHArm"], - events: [{trigger: "remove", type: "unlinkItem"}, - {trigger: "hit", type: "linkItem", sfx: "FutureLock", chance: 0, tags: ["lowwill"]}, - {trigger: "beforeStruggleCalc", type: "elbowCuffsBlock", inheritLinked: true}, - {trigger: "postRemoval", type: "RequireBaseArmCuffs"} - ]}, - - - //endregion - - //region Latex - {inventory: true, name: "LatexStraitjacket", inaccessible: true, factionColor: [[0, 1, 2]], remove: ["Bra"], Asset: "StraitLeotard", Modules: [1, 1, 1, 1], Color: ["#499ed6", "#499ed6", "#499ed6"], Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7, weight: 0, strictness: 0.2, - escapeChance: {"Struggle": 0.1, "Cut": 0.15, "Remove": 0.1, "Pick": 0.35}, - limitChance: {"Struggle": 0.25, "Cut": 0.14, "Remove": 0.08, "Unlock": 0.75}, // Hard to escape the arms box by struggling - maxwill: 0.25, enemyTags: {"latexRestraintsHeavy" : 3, "jailRestraints": 1}, playerTags: {"posLatex": -1, "latexRage": 4, "ItemArmsEmpty": -10}, minLevel: 0, allFloors: true, shrine: ["Latex", "Straitjackets"]}, - {inventory: true, name: "LatexArmbinder", inaccessible: true, factionColor: [[0]], Asset: "SeamlessLatexArmbinder", strictness: 0.1, LinkableBy: [...KDArmbinderLink], Color: ["#499ed6"], Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7, weight: 0, escapeChance: {"Struggle": 0.15, "Cut": 0.15, "Remove": 0.1, "Pick": 0.35}, - limitChance: {"Struggle": 0.2, "Cut": 0.1, "Remove": 0.85, "Unlock": 0.2}, - maxwill: 0.35, enemyTags: {"latexRestraints" : 5, "latexRestraintsForced" : 15, "jailRestraints": 5}, playerTags: {"posLatex": -1, "latexAnger": 1, "latexRage": 1, "ItemArmsEmpty": -10}, minLevel: 0, allFloors: true, shrine: ["Latex", "Armbinders"]}, - {renderWhenLinked: [...KDLegbinderRender], inventory: true, name: "LatexLegbinder", inaccessible: true, factionColor: [[0]], Asset: "SeamlessLegBinder", LinkableBy: [...KDLegbinderLink], Color: ["#499ed6"], Group: "ItemLegs", hobble: true, power: 7, weight: 0, escapeChance: {"Struggle": -0.05, "Cut": 0.15, "Remove": 0.1, "Pick": 0.35}, - maxwill: 0.6, enemyTags: {"latexRestraintsHeavy" : 6, "jailRestraints": 1, "latexStart": 10}, playerTags: {"posLatex": -1, "latexAnger": 1, "latexRage": 2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Legbinders"]}, - {inventory: true, name: "LatexBoots", inaccessible: true, factionColor: [[0]], Asset: "HighThighBoots", Color: ["#3873C3"], Group: "ItemBoots", hobble: true, power: 6, weight: 0, escapeChance: {"Struggle": -0.15, "Cut": 0.12, "Remove": 0.07, "Pick": 0.25}, - enemyTags: {"latexRestraints" : 8, "latexBoots" : 3, "jailRestraints": 1, "latexUniform": 12}, playerTags: {"posLatex": -1, "latexAnger": 2, "latexRage": 2}, minLevel: 0, allFloors: true, shrine: ["Latex"]}, - {alwaysRender: true, inventory: true, name: "LatexCorset", linkCategory: "Corset", linkSize: 0.55, inaccessible: true, deepAccessible: true, factionColor: [[0]], OverridePriority: 25.9, Asset: "HeavyLatexCorset", LinkableBy: KDCorsetLink, strictness: 0.1, Color: ["#5196EF"], Group: "ItemTorso", power: 8, weight: 0, escapeChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": 0.15, "Pick": 0.3}, struggleMinSpeed: {"Remove": 0.05}, struggleMaxSpeed: {"Remove": 0.1}, - failSuffix: {"Remove": "Corset"}, enemyTags: {"latexRestraints" : 7, "jailRestraints": 1, "latexUniform": 12}, playerTags: {"ItemTorsoFull": -5, "posLatex": -1, "latexAnger": 2, "latexRage": 2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Corsets", "HeavyCorsets"]}, - - {inventory: true, name: "LatexBallGag", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], Asset: "BallGag", gag: 0.75, Color: ["#4EA1FF", "Default"], Type: "Tight", Group: "ItemMouth", power: 7, weight: 0, escapeChance: {"Struggle": -0.05, "Cut": 0.04, "Remove": 0.4, "Pick": 0.25}, - maxwill: 0.8, enemyTags: {"latexRestraints" : 3, "latexGag" : 10, "jailRestraints": 1}, playerTags: {"posLatex": -1, "latexAnger": 2, "latexRage": 2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Gags", "BallGags"]}, - - {inventory: true, name: "LatexOTNGag", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], factionColor: [[0], [0], [0]], Asset: "KittyGag", gag: 0.5, Color: ["#4EA1FF", "#4EA1FF", "#4EA1FF"], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 4, weight: -6, escapeChance: {"Struggle": 0.05, "Cut": 0.18, "Remove": 0.1}, - maxwill: 0.5, enemyTags: {"latexRestraints":6}, playerTags: {"ItemMouthFull": 6}, minLevel: 0, allFloors: true, shrine: ["Latex", "Gags", "FlatGags"]}, - - {renderWhenLinked: ["Corsets", "Harnesses", ...KDBindable, "Latex", "Leather", "Metal", "Rope"], inventory: true, name: "LatexCatsuit", inaccessible: true, factionColor: [[0]], Asset: "SeamlessCatsuit", AssetGroup: "Suit", Color: ["#3873C3"], - LinkableBy: ["Corsets", "Harnesses", ...KDBindable, "Ribbon"], - Group: "ItemTorso", power: 7, weight: 0, escapeChance: {"Struggle": -1.0, "Cut": 0.1, "Remove": 0.05}, - enemyTags: {"latexRestraintsHeavy" : 6, "latexCatsuits": 12, "latexUniform": 12, "latexStart": 10}, playerTags: {"posLatex": -1, "latexAnger": 2, "latexRage": 2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Suits"], - alwaysDress: [ - {Item: "SeamlessCatsuit", Group: "Suit", Color: ['#3873C3'], override: true, factionColor: [[0]]}, - {Item: "SeamlessCatsuit", Group: "SuitLower", Color: ['#3873C3'], override: true, factionColor: [[0]]}, - {Item: "Catsuit", Group: "Gloves", Color: ['#3873C3'], override: true, factionColor: [[0]]}], - events: [ - {trigger: "beforeStruggleCalc", type: "latexDebuff", power: 0.15, inheritLinked: true} - ] - }, - //endregion - - //region redLatex - - {inventory: true, unlimited: true, name: "RedLatexOTNGag", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], - factionColor: [[2], [2], [2]], Asset: "KittyGag", gag: 0.5, Color: ["#ff5277", "#ff5277", "#ff5277"], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 7, weight: -6, - escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1}, - maxwill: 0.8, enemyTags: {"redLatexBasic":6}, playerTags: {"ItemMouthFull": 6}, minLevel: 0, allFloors: true, shrine: ["Latex", "RedLatex", "Gags", "FlatGags"]}, - {inventory: true, unlimited: true, name: "RedLatexBallGag", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], Asset: "BallGag", gag: 0.75, Color: ["#ff5277", "#882222"], - Type: "Tight", Group: "ItemMouth", power: 6, weight: 0, escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1}, - maxwill: 0.8, enemyTags: {"redLatexBasic" : 5}, playerTags: {"latexAnger": 2, "latexRage": 2}, minLevel: 0, allFloors: true, shrine: ["Latex", "RedLatex", "Gags", "BallGags"]}, - - {inventory: true, unlimited: true, name: "RedLatexMask", LinkableBy: [...KDMaskLink], - gag: 0.3, blindfold: 4, power: 7, weight: -6, - factionColor: [[2]], Color: ["#ff5277"], Group: "ItemHead", Asset: "DroneMask", - escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1}, - maxwill: 0.8, enemyTags: {"redLatexBasic":6}, playerTags: {"ItemMouthFull": 6, "Unmasked": -1000}, minLevel: 0, allFloors: true, shrine: ["Latex", "RedLatex", "Masks", "Block_ItemMouth"]}, - - {inventory: true, unlimited: true, name: "RedLatexHands", - Asset: "LatexElbowGloves", Color: "#ff5277", LinkableBy: ["Mittens"], Group: "ItemHands", AssetGroup: "Gloves", - bindhands: 0.5, power: 10, weight: 0, - affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, - escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1}, - maxwill: 0.4, enemyTags: {"redLatexBasic":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "RedLatex",]}, - - {inventory: true, unlimited: true, name: "RedLatexBoots", LinkableBy: ["Boots"], renderWhenLinked: ["Boots"], deepAccessible: true, alwaysAccessible: true, - hobble: true, power: 5, weight: 0, - factionColor: [[2]], Color: ["#ff5277"], Group: "ItemBoots", AssetGroup: "Socks", Asset: "LatexSocks1", - escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1}, - maxwill: 0.8, enemyTags: {"redLatexBasic":5}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "RedLatex", "Socks"]}, - - //endregion - - //region Wolf - {inventory: true, name: "WolfArmbinder", debris: "Belts", inaccessible: true, Asset: "SeamlessLatexArmbinder", strictness: 0.1, LinkableBy: [...KDArmbinderLink], Color: "#2E2E2E", Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7.5, weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.15, "Remove": 0.07, "Pick": 0.2}, - limitChance: {"Cut": 0.1, "Remove": 0.04, "Unlock": 0.2}, - maxwill: 0.35, enemyTags: {"wolfRestraints" : 5}, playerTags: {"ItemArmsEmpty": -10}, minLevel: 0, allFloors: true, shrine: ["Latex", "Metal", "Armbinders"]}, - {inventory: true, name: "WolfCuffs", debris: "Chains", Asset: "MetalCuffs", accessible: true, linkCategory: "Cuffs", linkSize: 0.33, LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Color: "Default", Group: "ItemArms", bindarms: true, power: 5, weight: 2, DefaultLock: "Red", - maxwill: 0.8, escapeChance: {"Struggle": -0.5, "Cut": -0.1, "Remove": 10, "Pick": 0.0}, enemyTags: {"wolfCuffs": 8, "cuffsSpell": 100}, playerTags: {}, minLevel: 5, allFloors: true, shrine: ["Metal", "Cuffs"]}, - {inventory: true, name: "WolfAnkleCuffs", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", Link: "WolfAnkleCuffs2", LinkableBy: [...KDBindable], Type: "Chained", Color: ['#4F91DE', '#4F91DE', '#3F6945', '#000000'], Group: "ItemFeet", hobble: true, power: 8, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.4, "Remove": 0.4, "Pick": 0.15}, - maxwill: 1.0, enemyTags: {"wolfRestraints":7}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "AnkleCuffsBase"], - events: [ - {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.3, subMult: 0.5, tags: ["lowwill"], noLeash: true}, - {trigger: "remotePunish", type: "RemoteLinkItem", sfx: "LightJingle", noLeash: true, enemyDialogue: "KDDialogueRemoteLinkCuffs", msg: "KDMsgRemoteLinkCuffs"}, - ]}, - {name: "WolfAnkleCuffs2", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", UnLink: "WolfAnkleCuffs", LinkableBy: ["AnkleCuffsBase", ...KDBindable], Type: "Closed", Color: ['#4F91DE', '#4F91DE', '#3F6945', '#000000'], Group: "ItemFeet", blockfeet: true, power: 8, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.4, "Pick": 0.15}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}]}, - {alwaysRender: true, inventory: true, name: "WolfHarness", debris: "Belts", accessible: true, remove: ["Cloth"], Asset: "FuturisticHarness", LinkableBy: [...KDHarnessLink], strictness: 0.05, harness: true, Color: ['#4F91DE', '#346942', '#889FA7', "#000000"], Group: "ItemTorso", power: 4, weight: 0, - escapeChance: {"Struggle": -0.15, "Cut": 0.2, "Remove": 0.1, "Pick": 0.35}, - maxwill: 1.0, enemyTags: {"wolfRestraints" : 6, "wolfGear":6}, playerTags: {"ItemTorsoFull": -5}, minLevel: 0, allFloors: true, shrine: ["Latex", "Harnesses"]}, - {inventory: true, name: "WolfBallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], - Asset: "FuturisticHarnessBallGag", strictness: 0.35, gag: 0.65, - events: [ - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.2, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.15, requiredTag: "Blindfolds"}, - ], - Color: ['#5edc73', '#428E4F', '#6E6E6E', '#FFFFFF', '#000000'], Group: "ItemMouth", power: 9, weight: 0, - maxwill: 0.75, escapeChance: {"Struggle": -0.3, "Cut": 0.0, "Remove": 0.05, "Pick": 0.2}, - enemyTags: {"wolfRestraints" : 8}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Gags", "BallGags", "Metal"]}, - {inventory: true, name: "WolfCollar", debris: "Belts", accessible: true, Asset: "AutoShockCollar", Color: ['#6EAF81', '#6EAF81'], Group: "ItemNeck", LinkableBy: [...KDCollarLink], power: 11, weight: 0, escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0.1, "Pick": -0.05}, - maxwill: 0.5, enemyTags: {"wolfRestraints":3, "wolfGear":3, "wolfLeash": 1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Collars", "HighCollars"], - events: [ - {trigger: "playerAttack", type: "PunishPlayer", chance: 0.25, stun: 2, warningchance: 1.0, damage: "electric", power: 2, sfx: "Shock", inheritLinked: true,}, - {trigger: "beforeStruggleCalc", type: "ShockForStruggle", chance: 0.75, stun: 2, warningchance: 0.6, damage: "electric", power: 2, sfx: "Shock", bind: 0.2, inheritLinked: true,}, - {trigger: "playerCast", type: "PunishPlayer", chance: 1.0, punishComponent: "Verbal", damage: "electric", power: 2, sfx: "Shock", inheritLinked: true,}, - {trigger: "remotePunish", type: "RemoteActivatedShock", chance: 0.1, stun: 2, damage: "electric", power: 1, sfx: "Shock", noLeash: true, inheritLinked: true,} - ]}, - {inventory: true, removePrison: true, name: "WolfLeash", debris: "Belts", tether: 2.9, Asset: "CollarLeash", Color: "#44fF76", Group: "ItemNeckRestraints", leash: true, power: 1, weight: -99, harness: true, - unlimited: true, - events: [ - {trigger: "postRemoval", type: "RequireCollar"}, - ], - escapeChance: {"Struggle": -0.3, "Cut": -0.2, "Remove": 0.4, "Pick": 0.35}, enemyTags: {"wolfRestraints":9, "wolfLeash": 10}, playerTags: {"ItemNeckRestraintsFull":-2, "ItemNeckFull":999}, minLevel: 0, allFloors: true, shrine: []}, - - //endregion - - //region Cosplay - {inventory: true, name: "BindingDress", debris: "Fabric", inaccessible: true, remove: ["Cloth", "Bra"], Type: "Strap", Asset: "LeatherArmbinder", strictness: 0.25, Color: ['#473488'], Group: "ItemArms", LinkableBy: [...KDDressLink], bindarms: true, bindhands: 1.0, power: 8, weight: 0, - escapeChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": -0.2, "Pick": 0.15}, helpChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": 0.075}, - limitChance: {"Struggle": 0.125, "Cut": 0.125, "Remove": 0.1, "Unlock": 0.5}, - alwaysDress: [ - {Item: "PleatedSkirt", Group: "ClothLower", Color: ['#6B48E0'], override: true}, - {Item: "SleevelessCatsuit", Group: "Suit", Color: ['#473488'], override: true}, - {Item: "CatsuitPanties", Group: "SuitLower", Color: ['#473488'], override: true}], - maxwill: 0.5, enemyTags: {"dressRestraints" : 10, "bindingDress": 10}, playerTags: {"ItemArmsEmpty": -10}, minLevel: 0, allFloors: true, shrine: ["Latex", "BindingDress"]}, - {inventory: true, trappable: true, name: "DressGag", debris: "Fabric", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], Asset: "HarnessBallGag", - events: [ - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.2, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.15, requiredTag: "Blindfolds"}, - ], - gag: 0.65, Type: "Tight", Color: ["#8762c7", "Default"], Group: "ItemMouth", power: 8, strictness: 0.2, weight: 5, magic: true, - escapeChance: {"Struggle": -0.2, "Cut": 0.2, "Remove": 0.2, "Pick": 0.2}, - maxwill: 0.6, enemyTags: {"dressRestraints":3}, playerTags: {}, minLevel: 2, allFloors: true, shrine: ["Rope", "Gags", "BallGags"]}, - {inventory: true, trappable: true, name: "DressMuzzle", debris: "Fabric", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Asset: "MuzzleGag", gag: 0.3, Color: ["#6B48E0", "#39339c"], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 9, strictness: 0.3, weight: 1, magic: true, - escapeChance: {"Struggle": -0.4, "Cut": 0.15, "Remove": 0.2, "Pick": 0.1}, DefaultLock: "Blue", - maxwill: 0.1, enemyTags: {"dressRestraints":3, "dressGags": 3}, playerTags: {"ItemMouthEmpty": -10}, minLevel: 6, allFloors: true, shrine: ["Rope", "Gags", "FlatGags"]}, - - - - {alwaysRender: true, inventory: true, name: "DressCorset", debris: "Fabric", linkCategory: "Corset", linkSize: 0.55, inaccessible: true, factionColor: [[0]], OverridePriority: 26, Asset: "HeavyLatexCorset", - LinkableBy: KDCorsetLink, strictness: 0.1, Color: ["#473488"], Group: "ItemTorso", power: 8, weight: 0, - escapeChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": -0.2, "Pick": 0.15}, helpChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": 0.025}, struggleMinSpeed: {"Remove": 0.05}, struggleMaxSpeed: {"Remove": 0.1}, - failSuffix: {"Remove": "Corset"}, enemyTags: {"dressRestraints": 1, "dressUniform": 12}, playerTags: {"ItemTorsoFull": -5, "conjureAnger": 2, "conjureRage": 2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Corsets", "HeavyCorsets"], - alwaysDress: [ - {Item: "AsymmetricSkirt", Group: "ClothLower", Color: ['#6B48E0'], override: true}, - {Item: "SleevelessCatsuit", Group: "Suit", Color: ['#473488'], override: true}, - {Item: "CatsuitPanties", Group: "SuitLower", Color: ['#F8BD01'], override: true}],}, - - {inventory: true, name: "DressBra", debris: "Fabric", inaccessible: true, Asset: "FuturisticBra2", Color: ['#6B48E0', '#F8BD01', '#6B48E0', '#6B48E0', '#F8BD01', '#6B48E0'], Group: "ItemBreast", LinkableBy: ["Ornate"], chastitybra: true, power: 8, weight: -2, - Security: { - level_key: 2, - level_magic: 2, - }, - escapeChance: {"Struggle": -0.5, "Cut": -0.05, "Remove": 0.4, "Pick": 0.15}, bypass: true, - maxwill: 0.9, enemyTags: {"dressRestraints" : 10, "dressUniform" : 10}, playerTags: {"ItemNipplesFull": 2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Harnesses"]}, - - {inventory: true, name: "AsylumJacket", debris: "Belts", Asset: "HighSecurityStraitJacket", Modules: [1, 2, 3], Color: ["#333333", "#333333", '#808080', '#808080'], LinkableBy: ["TransportJackets", "Wrapping"], Group: "ItemArms", power: 8, weight: 0, bindarms: true, bindhands: 1.0,strictness: 0.2, - limitChance: {"Struggle": 0.12, "Cut": 0.03, "Remove": 0.1, "Unlock": 0.75}, - escapeChance: {"Struggle": -0.175, "Cut": 0.15, "Remove": 0.1, "Pick": 0.15}, - enemyTags: {"nurseRestraints": 5, "jacketSpell": 50}, playerTags: {"ItemArmsFull":-2, "ItemArmsEmpty": -10}, minLevel: 0, maxwill: 0.35, allFloors: true, shrine: ["Straitjackets", "Leather"]}, - - {inventory: true, name: "TransportJacket", debris: "Belts", Asset: "TransportJacket", events: [{type: "PrisonerJacket", trigger: "afterDress"}], Color: ["#808080", "#202020", "#808080", "#EEEEEE", "#202020", "#808080"], - Group: "ItemArms", power: 10, weight: 0, bindarms: true, bindhands: 1.0, strictness: 0.3, LinkableBy: ["Wrapping"], - limitChance: {"Struggle": 0.12, "Cut": 0.1, "Remove": 0.15, "Unlock": 0.75}, - escapeChance: {"Struggle": -0.175, "Cut": 0.1, "Remove": 0.1, "Pick": 0.15}, - enemyTags: {"nurseRestraints": 1}, playerTags: {"ItemArmsEmpty": -10, "AsylumJacketWorn": 20}, minLevel: 0, maxwill: 0.1, allFloors: true, shrine: ["Straitjackets", "TransportJackets", "Leather"]}, - - {renderWhenLinked: [...KDLegbinderRender], inventory: true, name: "AsylumLegbinder", debris: "Belts", inaccessible: true, Asset: "LegBinder", LinkableBy: [...KDLegbinderLink], Color: "Default", Group: "ItemLegs", blockfeet: true, - power: 6, weight: 2, escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": 0.3, "Pick": 0.25}, enemyTags: {"nurseRestraints": 1}, playerTags: {"ItemArmsFull":3}, - struggleMaxSpeed: {"Remove": 0.1}, // Easy to remove but takes a while - minLevel: 0, allFloors: true, shrine: ["Leather", "Legbinders"]}, - - {inventory: true, name: "AsylumMuzzle", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.4, Asset: "FuturisticMuzzle", Modules: [1, 1, 0], Group: "ItemMouth", AssetGroup: "ItemMouth3", Color: ["#814F21","#814F21","#814F21","#814F21"], power: 8, weight: 2, - escapeChance: {"Struggle": -0.14, "Cut": 0.18, "Remove": 0.25, "Pick": 0.2}, maxwill: 0.9, - enemyTags: {"nurseRestraints":3}, playerTags: {"ItemMouthFull":1}, minLevel: 0, allFloors: true, shrine: ["Leather", "Gags", "FlatGags"]}, - - //endregion - - //region Fuuka's stuff - {inventory: true, curse: "GhostLock", name: "MikoCollar", Asset: "HighCollar", Color: ["#ffffff", "#AA2222"],Group: "ItemNeck", LinkableBy: [...KDCollarLink], magic: true, power: 40, weight: 0, difficultyBonus: 10, - escapeChance: {"Struggle": -100, "Cut": -0.8, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Collars", "HighCollars"], - unlimited: true, - events: [{trigger: "kill", type: "MikoGhost"}], - }, - // Generic stronger gag - {inventory: true, name: "MikoGag", Asset: "OTNPlugGag", debris: "Belts", LinkableBy: [...KDPlugGagLink], renderWhenLinked: [...KDPlugGagLink], Type: "Plug", gag: 1.0, Color: ["#ffffff", "#AA2222", "#ffffff"], Group: "ItemMouth", power: 9, weight: 2, DefaultLock: "Blue", magic: true, - escapeChance: {"Struggle": -0.2, "Cut": 0.2, "Remove": 0.15, "Pick": 0.07}, - maxwill: 0.6, enemyTags: {"mikoRestraints" : 10}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Gags", "PlugGags"]}, - {inventory: true, name: "MikoDress", debris: "Fabric", inaccessible: true, remove: ["Cloth", "Bra"], Type: "Strap", Asset: "LeatherArmbinder", strictness: 0.25, Color: ['#ffffff'], Group: "ItemArms", LinkableBy: [...KDDressLink], bindarms: true, bindhands: 1.0, power: 8, weight: 0, DefaultLock: "Blue", - escapeChance: {"Struggle": -0.2, "Cut": 0.2, "Remove": -0.2, "Pick": 0.15}, helpChance: {"Struggle": -0.15, "Cut": 0.2, "Remove": 0.025}, - limitChance: {"Struggle": 0.125, "Cut": 0.125, "Remove": 0.1, "Unlock": 0.5}, - alwaysDress: [ - {Item: "PleatedSkirt", Group: "ClothLower", Color: ['#AA2222'], override: true}, - {Item: "SleevelessCatsuit", Group: "Suit", Color: ['#AA2222'], override: true}, - {Item: "LatexCorset1", Group: "Corset", Color: ['#ffffff'], override: true}, - {Item: "CatsuitPanties", Group: "SuitLower", Color: ['#AA2222'], override: true}], - maxwill: 0.5, enemyTags: {"mikoRestraints" : 10}, playerTags: {"ItemArmsEmpty": -10}, minLevel: 0, allFloors: true, shrine: ["Latex", "BindingDress"]}, - //endregion - - - - - // collar #6EAF81 - - //region Exp - {inventory: true, name: "ExpArmbinder", debris: "Belts", inaccessible: true, Asset: "BoxTieArmbinder", strictness: 0.08, LinkableBy: ["Wrapping"], Color: ["#415690", "#ffffff"], Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7, weight: 0, - limitChance: {"Struggle": 0.15, "Cut": 0.1, "Remove": 0.035, "Unlock": 0.5}, // Hard to escape the arms box by struggling - escapeChance: {"Struggle": 0.1, "Cut": 0.15, "Remove": 0.1, "Pick": 0.35}, - maxwill: 0.25, enemyTags: {"expRestraints" : 5}, playerTags: {"ItemArmsEmpty": -10}, minLevel: 0, allFloors: true, shrine: ["Latex", "Boxbinders"]}, - {alwaysRender: true, inventory: true, name: "ExpArmbinderHarness", debris: "Belts", accessible: true, Asset: "Corset4", Color: "#383E4D", Group: "ItemTorso", strictness: 0.1, power: 9, weight: -10, OverridePriority: 26, LinkableBy: [...KDHarnessLink], - escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0.15}, - maxwill: 0.6, enemyTags: {"expRestraints" : 9}, playerTags: {"Boxbinders": 20, "Armbinders": 20}, minLevel: 7, allFloors: true, shrine: ["Latex", "ArmbinderHarness"], - events: [{trigger: "postRemoval", type: "armbinderHarness"}], requireSingleTagToEquip: ["Armbinders", "Boxbinders"]}, - {inventory: true, name: "ExpCollar", debris: "Belts", inaccessible: true, Asset: "LatexPostureCollar", gag: 0.4, Color: "#4E7DFF", Group: "ItemNeck", LinkableBy: [...KDCollarLink], factionColor: [[0]], power: 8, weight: -2, strictness: 0.05, escapeChance: {"Struggle": 0, "Cut": 0.15, "Remove": 0.2, "Pick": 0.25}, - maxwill: 0.25, enemyTags: {"expRestraints" : 2.1, "latexCollar": 1}, playerTags: {"ItemMouthFull": 2, "ItemMouth2Full": 2, "ItemMouth3Full": 2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Posture", "Collars", "HighCollars"]}, - {inventory: true, name: "ExpBoots", debris: "Belts", inaccessible: true, Asset: "BalletWedges", Color: "#748395", Group: "ItemBoots", LinkableBy: ["Wrapping"], hobble: true, power: 8, weight: 0, escapeChance: {"Struggle": -0.25, "Cut": 0.0, "Remove": 0.07, "Pick": 0.25}, - maxwill: 0.9, enemyTags: {"expRestraints" : 6, "latexBoots" : 3, "wolfRestraints": 6, "blacksteelrestraints":10}, playerTags: {}, minLevel: 2, allFloors: true, shrine: ["Metal", "Boots"]}, - //endregion - - //region blacksteel - {inventory: true, name: "ExpAnkleCuffs", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", Link: "ExpAnkleCuffs2", LinkableBy: [...KDBindable, ...KDDevices], Type: "Chained", - Color: ["#92e8c0", "#171222", "#333333"], Group: "ItemFeet", hobble: true, power: 10, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.4, "Remove": 0.1, "Pick": 0.15}, - enemyTags: {"expRestraints":7, "blacksteelrestraints":10, "blacksteelcuffs":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Blacksteel", "Cuffs", "AnkleCuffsBase"], - events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.2, subMult: 0.5, tags: ["lowwill"], noLeash: true}]}, - {name: "ExpAnkleCuffs2", accessible: true, Asset: "FuturisticAnkleCuffs", debris: "Chains", DefaultLock: "Red", UnLink: "ExpAnkleCuffs", LinkableBy: [...KDBindable, ...KDDevices], Type: "Closed", - Color: ["#92e8c0", "#171222", "#333333"], Group: "ItemFeet", blockfeet: true, power: 10, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.1, "Pick": 0.15}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Blacksteel", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}]}, - {inventory: true, name: "BlacksteelLegCuffs", debris: "Chains", accessible: true, Asset: "FuturisticLegCuffs", DefaultLock: "Red", LinkableBy: ["Legbinders", "Hobbleskirts", "Belts", "Ties"], Type: "Chained", - Color: ["#92e8c0", "#171222", "#333333"], Group: "ItemLegs", hobble: true, power: 10, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.2, "Pick": 0.25}, - maxwill: 0.8, enemyTags: {"blacksteelrestraints":6, "blacksteelcuffs":6}, playerTags: {"ItemLegsFull":-2}, minLevel: 6, allFloors: true, shrine: ["Metal", "Cuffs", "Blacksteel", "Elements"]}, - {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "BlacksteelArmCuffs", debris: "Chains", DefaultLock: "Red", accessible: true, - Asset: "FuturisticCuffs", linkCategory: "Cuffs", linkSize: 0.55, LinkableBy: [...KDDevices, ...KDBindable], Link: "BlacksteelArmCuffs2", - Color: ["#333333", "#171222", "#92e8c0",], Group: "ItemArms", bindarms: false, power: 10, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.25, "Pick": 0.35}, enemyTags: {"blacksteelrestraints":54, "blacksteelcuffs":20}, playerTags: {"ItemArmsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Cuffs", "ArmCuffsBase", "Blacksteel", "Elements"], - maxwill: 0.8, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "defeat", type: "linkItem", chance: 1.0}]}, - {name: "BlacksteelArmCuffs2", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Link: "BlacksteelArmCuffs3", UnLink: "BlacksteelArmCuffs", - Color: ["#333333", "#171222", "#92e8c0",], - Group: "ItemArms", bindarms: true, power: 10, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.4, "Remove": 0.2, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Blacksteel", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true}]}, - {name: "BlacksteelArmCuffs3", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", Type: "Both", LinkableBy: [...KDElbowBind, ...KDBindable], UnLink: "BlacksteelArmCuffs4", - Color: ["#333333", "#171222", "#92e8c0",], Group: "ItemArms", bindarms: true, power: 10, - weight: 0, strictness: 0.1, - escapeChance: {"Struggle": -0.2, "Cut": -0.4, "Remove": -0.1, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Blacksteel", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true}]}, - {name: "BlacksteelArmCuffs4", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", Type: "Elbow", LinkableBy: [...KDElbowBind, ...KDBindable], Link: "BlacksteelArmCuffs3", UnLink: "BlacksteelArmCuffs", - Color: ["#333333", "#171222", "#92e8c0",], - Group: "ItemArms", bindarms: true, power: 10, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.4, "Remove": -0.15, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Blacksteel", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.5, tags: ["lowwill"]}, {trigger: "beforeStruggleCalc", type: "elbowCuffsBlock", inheritLinked: true}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}]}, - - //endregion - - // TODO AlwaysDebris - {inventory: true, name: "Stuffing", unlimited: true, debris: "Fabric", Asset: "ClothStuffing", LinkableBy: [...KDStuffingLink], Color: "Default", Group: "ItemMouth", power: -20, weight: 0, gag: 0.4, - escapeChance: {"Struggle": 1, "Cut": 1, "Remove": 1}, enemyTags: {"stuffedGag": 100, "clothRestraints":12, "ribbonRestraints":6}, playerTags: {}, minLevel: 0, - allFloors: true, shrine: ["Stuffing"]}, - - //region MagicRope - {unlimited: true, inventory: true, renderWhenLinked: ["Boxbinders"], changeRenderType: {"ArmBind": "WristElbowHarnessTie"}, name: "WeakMagicRopeArms", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Color: "#ff88AA", LinkableBy: ["Boxbinders", "Wrapping"], Group: "ItemArms", bindarms: true, power: 0, weight: 1, escapeChance: {"Struggle": 0.3, "Cut": 0.67, "Remove": 0.2}, - affinity: {Remove: ["Hook"],}, - failSuffix: {"Remove": "MagicRope"}, maxwill: 0.65, enemyTags: {"ropeMagicWeak":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure"]}, - {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "WeakMagicRopeLegs", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "FullBinding", LinkableBy: [...KDLegRopesBind], Color: "#ff88AA", Group: "ItemLegs", hobble: true, power: 0, weight: 1, - affinity: {Remove: ["Hook"],}, - failSuffix: {"Remove": "MagicRope"}, escapeChance: {"Struggle": 0.3, "Cut": 0.67, "Remove": 0.15}, enemyTags: {"ropeMagicWeak":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure"]}, - {unlimited: true, inventory: true, name: "StrongMagicRopeCuffs", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Color: "#ff00dd", Type: "RopeCuffs", linkCategory: "Cuffs", linkSize: 0.33, LinkableBy: ["Boxbinders", "Armbinders", ...KDBindable, "Cuffs"], Group: "ItemArms", bindarms: true, power: 2, weight: 1, escapeChance: {"Struggle": 0.3, "Cut": 0.35, "Remove": -0.1}, specStruggleTypes: ["Remove", "Struggle"], - affinity: {Remove: ["Hook"],}, - failSuffix: {"Remove": "MagicRope"}, maxwill: 1.0, enemyTags: {"ropeMagicStrong":5}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Cuffs", "Conjure"]}, - {unlimited: true, inventory: true, name: "StrongMagicRopeCuffsAdv", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Color: "#ff00dd", Type: "RopeCuffs", linkCategory: "Cuffs", linkSize: 0.51, LinkableBy: ["Boxbinders", "Armbinders", ...KDBindable, "Cuffs"], Group: "ItemArms", bindarms: true, power: 2, weight: 1, escapeChance: {"Struggle": 0.2, "Cut": 0.35, "Remove": -0.1}, specStruggleTypes: ["Remove", "Struggle"], - affinity: {Remove: ["Hook"],}, strictness: 0.1, strictnessZones: ["ItemHands"], - failSuffix: {"Remove": "MagicRope"}, maxwill: 1.0, enemyTags: {"ropeMagicStrong":7}, playerTags: {}, minLevel: 9, allFloors: true, shrine: ["Rope", "Cuffs", "Conjure"]}, - {unlimited: true, renderWhenLinked: ["Boxbinders"], changeRenderType: {"ArmBind": "WristElbowHarnessTie"}, inventory: true, name: "StrongMagicRopeArms", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Color: "#ff00dd", LinkableBy: ["Boxbinders", "Wrapping"], Group: "ItemArms", bindarms: true, power: 6, weight: 1, escapeChance: {"Struggle": 0.15, "Cut": 0.2, "Remove": -0.1}, specStruggleTypes: ["Remove", "Struggle"], - affinity: {Remove: ["Hook"],}, - failSuffix: {"Remove": "MagicRope"}, maxwill: 0.65, enemyTags: {"ropeMagicStrong":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure"]}, - {unlimited: true, inventory: false, name: "StrongMagicRopeHogtie", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Color: "#ff00dd", Type: "Hogtied", Group: "ItemArms", bindarms: true, power: 8, weight: 1, escapeChance: {"Struggle": -0.1, "Cut": 0.15, "Remove": -0.1}, specStruggleTypes: ["Remove", "Struggle"], - affinity: {Remove: ["Hook"],}, - maxwill: 0.25, enemyTags: {"ropeMagicHogtie":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Hogties", "Conjure"], - failSuffix: {"Remove": "MagicRope"}, events: [{trigger: "postRemoval", type: "replaceItem", list: ["StrongMagicRopeArms"], power: 6}] - }, - {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "StrongMagicRopeLegs", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "FullBinding", LinkableBy: [...KDLegRopesBind], Color: "#ff00dd", Group: "ItemLegs", hobble: true, power: 5, weight: 1, - affinity: {Remove: ["Hook"],}, - escapeChance: {"Struggle": 0.15, "Cut": 0.2, "Remove": -0.1}, specStruggleTypes: ["Remove", "Struggle"], - failSuffix: {"Remove": "MagicRope"}, maxwill: 0.8, enemyTags: {"ropeMagicStrong":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure"]}, - {unlimited: true, inventory: true, name: "StrongMagicRopeFeet", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Color: "#ff00dd", LinkableBy: ["Wrapping"], Group: "ItemFeet", blockfeet: true, power: 5, weight: 1, - affinity: {Remove: ["Hook"],}, - escapeChance: {"Struggle": 0.15, "Cut": 0.2, "Remove": -0.1}, specStruggleTypes: ["Remove", "Struggle"], - failSuffix: {"Remove": "MagicRope"}, enemyTags: {"ropeMagicStrong":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure"]}, - {unlimited: true, inventory: true, name: "StrongMagicRopeCrotch", debris: "Ropes", accessible: true, factionColor: [[], [0]], crotchrope: true, strictness: 0.15, Asset: "HempRope", Type: "OverPanties", OverridePriority: 26, Color: "#ff00dd", Group: "ItemPelvis", power: 5, weight: 1, - affinity: {Remove: ["Hook"],}, - escapeChance: {"Struggle": 0.15, "Cut": 0.2, "Remove": -0.1}, specStruggleTypes: ["Remove", "Struggle"], enemyTags: {"ropeMagicStrong":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure"], - failSuffix: {"Remove": "MagicRope"}, events: [{trigger: "struggle", type: "crotchrope"}]}, - {unlimited: true, inventory: true, name: "StrongMagicRopeToe", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "ToeTie", OverridePriority: 26, LinkableBy: ["Wrapping"], Color: "#ff00dd", Group: "ItemBoots", blockfeet: true, power: 5, weight: 1, - affinity: {Remove: ["Hook"],}, - failSuffix: {"Remove": "MagicRope"}, escapeChance: {"Struggle": 0.15, "Cut": 0.2, "Remove": -0.1}, specStruggleTypes: ["Remove", "Struggle"], enemyTags: {"ropeMagicStrong":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure"]}, - //endregion - - //region MithrilRope - {unlimited: true, renderWhenLinked: ["Boxbinders"], changeRenderType: {"ArmBind": "WristElbowHarnessTie"}, inventory: true, name: "MithrilRopeArms", debris: "Ropes", accessible: true, Asset: "NylonRope", Color: "#ffffff", LinkableBy: ["Armbinders", "Wrapping"], Group: "ItemArms", bindarms: true, power: 6, weight: 1, magic: true, - affinity: {Remove: ["Hook"],}, - escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0.05}, specStruggleTypes: ["Remove", "Struggle"], - maxwill: 0.7, enemyTags: {"mithrilRope":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Will"]}, - {unlimited: true, inventory: false, name: "MithrilRopeHogtie", debris: "Ropes", accessible: true, Asset: "HempRope", Color: "#ffffff", Type: "KneelingHogtie", Group: "ItemArms", bindarms: true, power: 8, weight: 1, magic: true, - affinity: {Remove: ["Hook"],}, - escapeChance: {"Struggle": -0.1, "Cut": 0.15, "Remove": 0.05}, specStruggleTypes: ["Remove", "Struggle"], - maxwill: 0.15, enemyTags: {"mithrilRopeHogtie":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Hogties", "Will"], - events: [{trigger: "postRemoval", type: "replaceItem", list: ["MithrilRopeArms"], power: 6}] - }, - {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "MithrilRopeLegs", debris: "Ropes", accessible: true, Asset: "NylonRope", LinkableBy: [...KDLegRopesBind], Color: "#ffffff", Group: "ItemLegs", hobble: true, power: 5, weight: 1, magic: true, - affinity: {Remove: ["Hook"],}, - escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0.05}, specStruggleTypes: ["Remove", "Struggle"], strictness: 0.1, - maxwill: 0.8, enemyTags: {"mithrilRope":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Will"]}, - {unlimited: true, inventory: true, name: "MithrilRopeFeet", debris: "Ropes", accessible: true, Asset: "NylonRope", Color: "#ffffff", LinkableBy: ["Wrapping"], Group: "ItemFeet", blockfeet: true, power: 5, weight: 1, magic: true, - affinity: {Remove: ["Hook"],}, - escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0.05}, specStruggleTypes: ["Remove", "Struggle"], strictness: 0.1, - enemyTags: {"mithrilRope":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Will"]}, - {unlimited: true, inventory: true, name: "MithrilRopeHarness", debris: "Ropes", accessible: true, Asset: "NylonRopeHarness", Type: "Star", harness: true, OverridePriority: 26, Color: "#ffffff", Group: "ItemTorso", power: 5, weight: 1, magic: true, - affinity: {Remove: ["Hook"],}, - escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0.05}, specStruggleTypes: ["Remove", "Struggle"], strictness: 0.1, - enemyTags: {"mithrilRope":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Will"]}, - {unlimited: true, inventory: true, name: "MithrilRopeCrotch", debris: "Ropes", accessible: true, crotchrope: true, strictness: 0.15, Asset: "HempRope", Type: "OverPanties", OverridePriority: 26, Color: "#ffffff", Group: "ItemPelvis", power: 5, weight: 1, magic: true, - affinity: {Remove: ["Hook"],}, - escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0.05}, specStruggleTypes: ["Remove", "Struggle"], - enemyTags: {"mithrilRope":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Will"], - events: [{trigger: "struggle", type: "crotchrope"}]}, - {unlimited: true, inventory: true, name: "MithrilRopeToe", debris: "Ropes", accessible: true, Asset: "ToeTie", OverridePriority: 26, LinkableBy: ["Wrapping"], Color: "#ffffff", Group: "ItemBoots", blockfeet: true, power: 5, weight: 1, magic: true, - affinity: {Remove: ["Hook"],}, - escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0.05}, specStruggleTypes: ["Remove", "Struggle"], - enemyTags: {"mithrilRope":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Will"]}, - //endregion - - //region Mithril - {inventory: true, name: "MithrilLegCuffs", debris: "Chains", accessible: true, Asset: "FuturisticLegCuffs", LinkableBy: ["Legbinders", "Wrapping", "Hobbleskirts", "Belts"], Type: "Chained", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], Group: "ItemLegs", hobble: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, - maxwill: 0.6, enemyTags: {"mithrilRestraints":6}, playerTags: {"ItemLegsFull":-2}, minLevel: 7, allFloors: true, shrine: ["Metal", "Cuffs", "Will"]}, - {inventory: true, name: "MithrilAnkleCuffs", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", LinkableBy: [...KDBindable], Link: "MithrilAnkleCuffs2", Type: "Chained", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], Group: "ItemFeet", hobble: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, enemyTags: {"mithrilRestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "Will", "AnkleCuffsBase"], - maxwill: 0.5, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.2, subMult: 0.5, tags: ["lowwill"], noLeash: true}]}, - {name: "MithrilAnkleCuffs2", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", LinkableBy: [...KDBindable], UnLink: "MithrilAnkleCuffs", Type: "Closed", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], Group: "ItemFeet", blockfeet: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, enemyTags: {"mithrilRestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "Will"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}]}, - {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "MithrilArmCuffs", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", linkCategory: "Cuffs", linkSize: 0.55, LinkableBy: [...KDDevices, ...KDBindable], Link: "MithrilArmCuffs2", Color: ['#FFFFFF', '#CFBE88', '#000000'], Group: "ItemArms", bindarms: false, power: 9, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.25, "Pick": 0.35}, enemyTags: {"mithrilRestraints":24}, playerTags: {"ItemArmsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Cuffs", "Will", "ArmCuffsBase"], - maxwill: 0.4, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "defeat", type: "linkItem", chance: 1.0}]}, - {name: "MithrilArmCuffs2", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Link: "MithrilArmCuffs3", UnLink: "MithrilArmCuffs", Color: ['#FFFFFF', '#CFBE88', '#000000'], Group: "ItemArms", bindarms: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.1, "Cut": -0.3, "Remove": 0.2, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Will"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true}]}, - {name: "MithrilArmCuffs3", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", Type: "Both", LinkableBy: [...KDElbowBind, ...KDBindable], UnLink: "MithrilArmCuffs4", Color: ['#FFFFFF', '#CFBE88', '#000000'], Group: "ItemArms", bindarms: true, power: 9, weight: 0, strictness: 0.1, - escapeChance: {"Struggle": -0.175, "Cut": -0.3, "Remove": -0.1, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Will"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true}]}, - {name: "MithrilArmCuffs4", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", Type: "Elbow", LinkableBy: [...KDElbowBind, ...KDBindable], Link: "MithrilArmCuffs3", UnLink: "MithrilArmCuffs", Color: ['#FFFFFF', '#CFBE88', '#000000'], Group: "ItemArms", bindarms: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.1, "Cut": -0.3, "Remove": -0.15, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Will"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.5, tags: ["lowwill"]}, {trigger: "beforeStruggleCalc", type: "elbowCuffsBlock", inheritLinked: true}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}]}, - {inventory: true, name: "MithrilCollar", Asset: "ShinySteelCollar", Color: ['#C9B883', '#C9B883'], Group: "ItemNeck", LinkableBy: [...KDCollarLink], power: 9, weight: -2, - unlimited: true, escapeChance: {"Struggle": -0.1, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, - maxwill: 0.25, enemyTags: {"mithrilRestraints":4}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Collars", "Will"]}, - //endregion - - // Slime, added by slime effects. Easy to struggle out, not debilitating, but slows you greatly - {unlimited: true, removePrison: true, name: "StickySlime", debris: "Slime", Asset: "Web", Type: "Wrapped", Color: "#ff77ff", Group: "ItemArms", bindarms: true, bindhands: 0.5, power: 0.1, weight: 1, removeOnLeash: true, freeze: true, escapeChance: {"Struggle": 10, "Cut": 10, "Remove": 10}, enemyTags: {"slime":100}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Slime"]}, - // Barrel trap, always possible to struggle out but takes time - {removePrison: true, name: "BarrelTrap", Asset: "SmallWoodenBox", Color: "Default", Group: "ItemDevices", power: 2, weight: 1, immobile: true, alwaysStruggleable: true, blindfold: 5, enclose: true, - escapeChance: {"Struggle": 0.1, "Cut": 0.025, "Remove": 0.025, "Pick": -1.0, "Unlock": -1.0}, - struggleMinSpeed: {"Struggle": 0.07, "Cut": 0.03, "Remove": 0.05}, alwaysEscapable: ["Struggle"], - struggleMaxSpeed: {"Struggle": 0.15, "Cut": 0.15, "Remove": 0.15}, - helpChance: {"Remove": 0.4, "Pick": 0.2, "Unlock": 1.0}, - limitChance: {"Struggle": 0.01, "Cut": 0, "Remove": 0.01, "Pick": 0, "Unlock": 0}, - enemyTags: {"barrel":100}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Furniture"], ignoreSpells: true, removeOnLeash: true, ignoreIfNotLeash: true, - events: [{trigger: "tick", type: "barrelDebuff", inheritLinked: true}, {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}]}, - // Cage trap - {removePrison: true, name: "CageTrap", Asset: "Cage", Color: ['Default', 'Default', '#000000'], Group: "ItemDevices", power: 3, weight: 1, immobile: true, alwaysStruggleable: true, - DefaultLock: "Red", - escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": 0.35, "Pick": 0.33, "Unlock": 0.7}, - helpChance: {"Remove": 0.5, "Pick": 0.5, "Unlock": 1.0}, - enemyTags: {"cage":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture"], ignoreSpells: true, removeOnLeash: true, - events: [{trigger: "tick", type: "cageDebuff", inheritLinked: true}, {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}]}, - // Sarcophagus - {removePrison: true, name: "Sarcophagus", Asset: "DisplayCase", Color: ['Default'], Group: "ItemDevices", power: 10, weight: 1, immobile: true, alwaysStruggleable: true, - DefaultLock: "Blue", - escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": 0.35, "Pick": -0.5, "Unlock": 0.7}, - helpChance: {"Remove": 0.5, "Pick": 0.5, "Unlock": 1.0}, - enemyTags: {"sarcophagus":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Sarcophagus"], ignoreSpells: true, removeOnLeash: true, - events: [{trigger: "tick", type: "cageDebuff", inheritLinked: true}, {trigger: "tick", type: "callGuardFurniture", inheritLinked: true, chance: 0.04}, {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}]}, - // Display trap - {removePrison: true, name: "DisplayTrap", Asset: "TheDisplayFrame", Color: ['Default'], Group: "ItemDevices", power: 5, weight: 1, immobile: true, alwaysStruggleable: true, - DefaultLock: "Red", - bindarms: true, - escapeChance: {"Struggle": -0.1, "Cut": -0.8, "Remove": 0.15, "Pick": -0.1, "Unlock": -0.1}, - helpChance: {"Remove": 0.35, "Pick": 0.25, "Unlock": 0.5}, - removeShrine: ["Hogties"], - enemyTags: {"displaySpell":100, "display": 100, "displaystand": 100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture"], ignoreSpells: true, removeOnLeash: true, - events: [{trigger: "tick", type: "cageDebuff", inheritLinked: true}, {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}]}, - {removePrison: true, name: "DollStand", arousalMode: true, Asset: "OneBarPrison", Color: ['Default'], Group: "ItemDevices", power: 5, weight: 1, immobile: true, alwaysStruggleable: true, - DefaultLock: "Red", - escapeChance: {"Struggle": -0.1, "Cut": -0.6, "Remove": 0.5, "Pick": 0.1, "Unlock": -0.05}, - helpChance: {"Remove": 0.8, "Pick": 0.35, "Unlock": 0.8}, - removeShrine: ["Hogties"], - enemyTags: {"dollstandSpell":100, "dollstand": 100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture"], ignoreSpells: true, removeOnLeash: true, - }, - {removePrison: true, name: "DollStandSFW", Asset: "TheDisplayFrame", Color: ['Default'], Group: "ItemDevices", power: 5, weight: 1, immobile: true, alwaysStruggleable: true, - DefaultLock: "Red", - escapeChance: {"Struggle": -0.1, "Cut": -0.6, "Remove": 0.5, "Pick": 0.1, "Unlock": -0.05}, - helpChance: {"Remove": 0.8, "Pick": 0.35, "Unlock": 0.8}, - removeShrine: ["Hogties"], - enemyTags: {"dollstandSpell":100, "dollstand": 100}, playerTags: {"arousalMode": -1000}, minLevel: 0, allFloors: true, shrine: ["Furniture"], ignoreSpells: true, removeOnLeash: true, - }, - // Bed trap, always possible to struggle out but takes time - {removePrison: true, name: "BedTrap", debris: "Belts", Asset: "Bed", Color: ["#523629", "#4c6885", "#808284"], Group: "ItemDevices", power: 2, weight: 1, immobile: true, alwaysStruggleable: true, - escapeChance: {"Struggle": 0.2, "Cut": 0.2, "Remove": 0.05, "Pick": -1.0, "Unlock": -1.0}, - struggleMinSpeed: {"Struggle": 0.025}, alwaysEscapable: ["Struggle"], - struggleMaxSpeed: {"Struggle": 0.05, "Cut": 0.03, "Remove": 0.05}, helpChance: {"Remove": 0.4, "Pick": 0.2, "Unlock": 1.0}, - limitChance: {"Struggle": 0.01, "Cut": 0, "Remove": 0.01, "Pick": 0, "Unlock": 0}, - alwaysDress: [ - {Item: "BedStraps", Group: "ItemAddon", Color: ['Default'], override: false}, - ], - enemyTags: {"bed":100}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Furniture"], ignoreSpells: true, removeOnLeash: true, - events: [{trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}]}, - //region High security prison restraints - {inventory: true, name: "HighsecArmbinder", debris: "Belts", strictness: 0.1, Asset: "LeatherArmbinder", inaccessible: true, LinkableBy: [...KDArmbinderLink], Type: "Strap", Group: "ItemArms", bindarms: true, bindhands: 1.0, Color: "#333333", - limitChance: {"Unlock": 0.2}, power: 7, weight: 2, - escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": 0.35, "Pick": 0.2}, enemyTags: {"leatherRestraintsHeavy":4, "armbinderSpell": 100}, playerTags: {"ItemArmsEmpty": -10}, minLevel: 8, allFloors: true, shrine: ["Leather", "Armbinders"]}, - {inventory: true, name: "HighsecShackles", debris: "Chains", Asset: "SteelAnkleCuffs", Type: "Chained", LinkableBy: [...KDBindable, ...KDDevices], Group: "ItemFeet", hobble: true, Color: ["Default", "Default"], power: 6, weight: 2, - escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 1.1, "Pick": 0.3}, enemyTags: {}, playerTags: {}, minLevel: 7, allFloors: true, shrine: ["Metal", "Cuffs"]}, - {inventory: true, name: "HighsecBallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], Asset: "HarnessBallGag", - events: [ - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.2, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.15, requiredTag: "Blindfolds"}, - ], - strictness: 0.2, gag: 0.65, Type: "Tight", Color: ["Default", "Default"], Group: "ItemMouth", power: 8, weight: 2, - escapeChance: {"Struggle": -0.25, "Cut": -0.05, "Remove": 0.5, "Pick": 0.25}, enemyTags: {"ballGagRestraints" : 4, "gagSpell": 100}, playerTags: {}, minLevel: 5, allFloors: true, shrine: ["Leather", "Latex", "Gags", "BallGags"]}, - {renderWhenLinked: [...KDLegbinderRender], inventory: true, name: "HighsecLegbinder", debris: "Belts", Asset: "LegBinder", inaccessible: true, LinkableBy: [...KDLegbinderLink], Color: "Default", Group: "ItemLegs", blockfeet: true, - power: 8, weight: 2, escapeChance: {"Struggle": -0.1, "Cut": 0.1, "Remove": 0.35, "Pick": 0.25}, enemyTags: {"legbinderSpell": 10}, playerTags: {}, minLevel: 0, allFloors: true, - shrine: ["Leather", "Legbinders"]}, - - - {inventory: true, arousalMode: true, name: "PrisonBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "#444444", Group: "ItemPelvis", LinkableBy: ["Ornate"], chastity: true, - Security: { - level_key: 2, - level_tech: 1, - }, - power: 8, weight: 2, escapeChance: {"Struggle": -0.5, "Cut": -0.30, "Remove": 100.0, "Pick": 0.25}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Chastity"]}, - {inventory: true, arousalMode: true, name: "PrisonBelt2", Asset: "OrnateChastityBelt", OverridePriority: 26, Color: ["#272727", "#AA0000"], Group: "ItemPelvis", chastity: true, - Security: { - level_key: 3, - level_magic: 2, - }, - power: 9, weight: 2, escapeChance: {"Struggle": -0.5, "Cut": -0.30, "Remove": 100.0, "Pick": 0.22}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Chastity", "Ornate"]}, - //endregion - - //region Trap items. Note that traps do not respect stamina, so its okay for these to have reasonable maxwill - {alwaysRender: true, inventory: true, name: "TrapArmbinderHarness", debris: "Belts", Asset: "LeatherHarness", accessible: true, Color: "Default", Group: "ItemTorso", OverridePriority: 26, LinkableBy: [...KDHarnessLink], power: 3, strictness: 0.1, weight: -100, escapeChance: {"Struggle": -0.1, "Cut": 0.25, "Remove": 0.25, "Pick": 0.15}, - enemyTags: {"leatherRestraintsHeavy":2, "armbinderSpell": 1, "harnessSpell": 1}, playerTags: {"ItemArmsEmpty": -1000, "Armbinders": 100}, minLevel: 4, allFloors: true, shrine: ["Leather", "ArmbinderHarness"], - maxwill: 0.6, events: [{trigger: "postRemoval", type: "armbinderHarness"}], requireSingleTagToEquip: ["Armbinders", "Boxbinders"]}, - {renderWhenLinked: ["Belts"], inventory: true, trappable: true, name: "TrapArmbinder", debris: "Belts", inaccessible: true, strictness: 0.1, Asset: "LeatherArmbinder", LinkableBy: [...KDArmbinderLink], Type: "WrapStrap", Group: "ItemArms", Color: "Default", bindarms: true, bindhands: 1.0, power: 6, weight: 2, - limitChance: {"Struggle": 0.15, "Cut": 0.1, "Unlock": 0.2}, - maxwill: 0.25, escapeChance: {"Struggle": 0.1, "Cut": 0.5, "Remove": 0.35, "Pick": 0.5}, enemyTags: {"trap":100, "leatherRestraintsHeavy":6, "armbinderSpell": 10}, playerTags: {"ItemArmsEmpty": -8}, minLevel: 4, allFloors: true, shrine: ["Leather", "Armbinders"]}, - {inventory: true, trappable: true, name: "TrapCuffs", debris: "Chains", Asset: "MetalCuffs", accessible: true, linkCategory: "Cuffs", linkSize: 0.33, LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Group: "ItemArms", - Color: "Default", bindarms: true, power: 2, weight: 2, DefaultLock: "Red", - escapeChance: {"Struggle": -0.5, "Cut": -0.1, "Remove": 10, "Pick": 0.5}, enemyTags: {"trap":100, "cuffsSpell": 10}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs"]}, - {inventory: true, trappable: true, name: "TrapYoke", Asset: "Yoke", accessible: true, Group: "ItemArms", - Color: "Default", bindarms: true, power: 6, weight: 0, DefaultLock: "Red", - escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 10, "Pick": -0.15, "Unlock": -0.15}, - helpChance: {"Pick": 0.5, "Unlock": 1.0}, enemyTags: {"trap":9, "yokeSpell": 10, "Unchained": -9}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Yokes"]}, - {alwaysRender: true, inventory: true, trappable: true, name: "TrapHarness", debris: "Belts", strictness: 0.05, Asset: "LeatherStrapHarness", accessible: true, LinkableBy: [...KDHarnessLink], OverridePriority: 26, Color: "#222222", Group: "ItemTorso", power: 2, weight: 2, - escapeChance: {"Struggle": 0.1, "Cut": 0.3, "Remove": 0.8, "Pick": 0.4}, enemyTags: {"trap":100, "leatherRestraintsHeavy":6, "harnessSpell": 10}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Harnesses"]}, - {inventory: true, trappable: true, name: "TrapGag", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], Asset: "BallGag", factionColor: [[], [0]], gag: 0.35, Type: "Tight", Color: ["Default", "Default"], Group: "ItemMouth", power: 3, weight: 2, - maxwill: 0.6, escapeChance: {"Struggle": 0.35, "Cut": 0.45, "Remove": 0.3, "Pick": 0.4}, enemyTags: {"trap":100, "leatherRestraintsHeavy":6, "gagSpell": 8}, playerTags: {}, minLevel: 0, allFloors: true, - shrine: ["Leather", "Latex", "Gags", "BallGags"]}, - {inventory: true, trappable: true, name: "TrapBlindfold", debris: "Belts", Asset: "LeatherBlindfold", LinkableBy: [...KDBlindfoldLink], renderWhenLinked: [...KDBlindfoldLink], Color: "Default", Group: "ItemHead", power: 3, weight: 2, - maxwill: 0.5, blindfold: 2, escapeChance: {"Struggle": 0.4, "Cut": 0.6, "Remove": 0.3, "Pick": 0.4}, enemyTags: {"trap":100, "leatherRestraintsHeavy":6, "ropeAuxiliary": 4, "blindfoldSpell": 10}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Blindfolds"]}, - {inventory: true, trappable: true, name: "TrapBoots", debris: "Belts", Asset: "BalletHeels", Color: "Default", Group: "ItemBoots", hobble: true, power: 3, weight: 2, - maxwill: 0.9, escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.4, "Pick": 0.4}, enemyTags: {"trap":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Boots"]}, - {inventory: true, trappable: true, name: "TrapLegirons", debris: "Chains", Asset: "Irish8Cuffs", LinkableBy: ["Wrapping", "Belts"], Color: "Default", Group: "ItemFeet", blockfeet: true, power: 4, weight: 2, - escapeChance: {"Struggle": -0.5, "Cut": -0.4, "Remove": 10, "Pick": 0.5}, enemyTags: {"trap":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs"]}, - {inventory: true, arousalMode: true, trappable: true, name: "TrapBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "Default", Group: "ItemPelvis", LinkableBy: ["Ornate"], chastity: true, - power: 5, weight: 0, DefaultLock: "Red", - Security: { - level_key: 2, - }, - maxwill: 0.75, escapeChance: {"Struggle": -0.5, "Cut": -0.10, "Remove": 10.0, "Pick": 0.35}, enemyTags: {"trap":10, 'machineChastity': 2, "maidRestraints": 6, "maidRestraintsLight": 6, "genericChastity": 12, "chastitySpell": 10,}, playerTags: {"ItemVulvaEmpty" : -4, "ItemVulvaPiercingsEmpty" : -4}, minLevel: 0, allFloors: true, shrine: ["Metal", "Chastity"]}, - {inventory: true, arousalMode: true, trappable: true, name: "BlacksteelBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "#333333", Group: "ItemPelvis", LinkableBy: ["Ornate"], chastity: true, - power: 10, weight: 0, DefaultLock: "Blue", - Security: { - level_key: 2, - }, - maxwill: 0.75, escapeChance: {"Struggle": -0.6, "Cut": -0.50, "Remove": 10.0, "Pick": 0.2}, enemyTags: {"trap":10, 'machineChastity': 2, "maidRestraints": 9, "maidRestraintsLight": 6, "genericChastity": 32, "blacksteelrestraints": 12, "blacksteelchastity": 50, "chastitySpell": 30,}, playerTags: {"ItemVulvaEmpty" : -4, "ItemVulvaPiercingsEmpty" : -4}, minLevel: 9, allFloors: true, shrine: ["Metal", "Chastity"]}, - {inventory: true, arousalMode: true, trappable: true, name: "BlacksteelBra", Asset: "FuturisticBra2", OverridePriority: 26, Color: ['#333333', '#999999', '#333333', '#333333', '#999999', '#333333'], Group: "ItemBreast", - chastitybra: true, power: 7, weight: 0, DefaultLock: "Blue", - Security: { - level_tech: 1, - level_key: 2, - }, - escapeChance: {"Struggle": -0.6, "Cut": -0.5, "Remove": 10.0, "Pick": 0.1}, enemyTags: {"genericChastity": 8, "blacksteelrestraints": 4, "blacksteelBra": 8, "blacksteelchastity": 25, "roboAngry": 6}, playerTags: {}, minLevel: 9, allFloors: true, shrine: ["Metal", "Chastity", "Ornate"]}, - - - {inventory: true, arousalMode: true, trappable: true, name: "MagicBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "#8f60b1", Group: "ItemPelvis", LinkableBy: ["Ornate"], chastity: true, - power: 7, weight: 0, - Security: { - level_magic: 1, - }, - maxwill: 0.75, escapeChance: {"Struggle": -1.0, "Cut": -0.10, "Remove": 10.0, "Pick": 0.5}, magic: true, DefaultLock: "Purple", - enemyTags: {"magicBelt": 4, "magicBeltForced": 10, "chastitySpell": 5,}, playerTags: {"ItemVulvaEmpty" : -4, "ItemVulvaPiercingsEmpty" : -4}, minLevel: 12, allFloors: true, shrine: ["Metal", "Chastity"]}, - {inventory: true, arousalMode: true, name: "TrapBeltProto", Asset: "FuturisticChastityBelt", Modules: [3, 1, 1, 1, 1], OverridePriority: 26, Color: ['#5E5E6B', '#4A5FC1', '#CD9F0E', '#43B2BA', '#A68009', '#F8BD01', '#3868E8', '#A68009', '#FFC81D'], - Group: "ItemPelvis", LinkableBy: ["Ornate"], chastity: true, power: 15, weight: 0, DefaultLock: "Red", - Security: { - level_tech: 1, - level_key: 3, - }, - maxwill: 0.75, escapeChance: {"Struggle": -0.8, "Cut": -0.50, "Remove": 1.0, "Pick": -0.1}, enemyTags: {"protoRestraints": 10, 'machineChastity': 8, "roboAngry": 10}, playerTags: {"ItemVulvaEmpty" : -5, "ItemVulvaPiercingsEmpty" : -5}, minLevel: 7, allFloors: true, shrine: ["Metal", "Chastity"]}, - {inventory: true, arousalMode: true, trappable: true, name: "TrapBra", Asset: "PolishedChastityBra", debris: "Chains", OverridePriority: 26, Color: "Default", Group: "ItemBreast", LinkableBy: ["Ornate"], chastitybra: true, - power: 4, weight: 0, DefaultLock: "Red", - Security: { - level_key: 2, - }, - maxwill: 0.75, escapeChance: {"Struggle": -0.5, "Cut": -0.10, "Remove": 10.0, "Pick": 0.35}, enemyTags: {"trap":10, "maidRestraints": 6, "maidRestraintsLight": 6, "genericChastity": 10}, playerTags: {"ItemNipplesEmpty" : -5}, minLevel: 0, allFloors: true, shrine: ["Metal", "Chastity"]}, - - - - {inventory: true, trappable: true, name: "TrapMittens", debris: "Belts", inaccessible: true, Asset: "LeatherMittens", Color: "Default", Group: "ItemHands", bindhands: 1.0, power: 5, weight: 0, - maxwill: 0.5, escapeChance: {"Struggle": 0.05, "Cut": 0.4, "Remove": 0.15, "Pick": 1.0}, enemyTags: {"leatherRestraintsHeavy":6, "mittensSpell": 10}, playerTags: {"ItemHandsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Leather", "Mittens"]}, - // These ones are tougher - {inventory: true, arousalMode: true, trappable: true, name: "TrapBelt2", Asset: "OrnateChastityBelt", OverridePriority: 26, Color: ["#272727", "#D3B24B"], Group: "ItemPelvis", LinkableBy: ["Shadow"], chastity: true, - power: 9, weight: 0, DefaultLock: "Gold", - Security: { - level_magic: 2, - level_key: 3, - }, - escapeChance: {"Struggle": -0.5, "Cut": -0.125, "Remove": 10.0, "Pick": 0.1}, enemyTags: {"genericChastity": 8, "ornateChastity": 8}, playerTags: {}, minLevel: 4, allFloors: true, shrine: ["Metal", "Chastity", "Ornate"]}, - {inventory: true, arousalMode: true, trappable: true, name: "TrapBra2", Asset: "FuturisticBra2", OverridePriority: 26, Color: ['#5E5E6B', '#F8BD01', '#5E5E6B', '#5E5E6B', '#F8BD01', '#5E5E6B'], Group: "ItemBreast", - chastitybra: true, power: 9, weight: 0, DefaultLock: "Gold", - Security: { - level_magic: 2, - level_key: 3, - }, - escapeChance: {"Struggle": -0.5, "Cut": -0.125, "Remove": 10.0, "Pick": 0.1}, enemyTags: {"genericChastity": 8, "ornateChastity": 8, "roboAngry": 10}, playerTags: {}, minLevel: 4, allFloors: true, shrine: ["Metal", "Chastity", "Ornate"]}, - //endregion - - // Toys - - {renderWhenLinked: ["Chastity"], inventory: true, arousalMode: true, name: "WolfPanties", debris: "Belts", inaccessible: true, Asset: "SciFiPleasurePanties", strictness: 0.05, Color: ["#4F91DE", "#2E2E2E", "#3b7d4f", "#2f5753", "#4F91DE", "#4F91DE", "#000000"] ,Group: "ItemPelvis", LinkableBy: ["Chastity"], power: 4, - weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.3, "Remove": 0.05, "Pick": 0.35}, escapeMult: 3.0, vibeLocation: "ItemVulva", - linkedVibeTags: ["teaser"], allowRemote: true, events: [ - {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 20, edgeOnly: true}, - {trigger:"tick", type: "PeriodicTeasing", power: 1, time: 48, edgeOnly: true, cooldown: {"normal": 120, "tease": 20}, chance: 0.02}, - {trigger:"tick", type: "PeriodicDenial", power: 2, time: 42, edgeOnly: true, cooldown: {"normal": 100, "tease": 20}, chance: 0.03}, - {trigger:"tick", type: "PeriodicTeasing", power: 3, time: 14, edgeOnly: false, cooldown: {"normal": 140, "tease": 20}, chance: 0.01}, - ], - maxwill: 0.5, enemyTags: {"wolfRestraints" : 6, "wolfGear":6}, playerTags: {"ItemPelvisFull": -5, "NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Latex", "Panties", "Vibes"]}, - - - // Nipple vibes - these generally trigger on attack - {inventory: true, arousalMode: true, name: "NippleClamps", unlimited: true, Asset: "HeartPasties", Color: "Default", Group: "ItemNipples", power: 3, weight: 0, - vibeLocation: "ItemNipples", - escapeChance: {"Struggle": -10, "Cut": -0.05, "Remove": 0.5, "Pick": 0.25}, failSuffix: {"Struggle": "Clamps"}, - maxwill: 1.0, enemyTags: {"dressRestraints" : 5, "genericToys": 5, "maidRestraints": 3, "maidRestraintsLight": 1, "roboAngry": 10, "teasetoys": 3}, playerTags: {"NoVibes": -1000}, minLevel: 0, maxLevel: 8, allFloors: true, shrine: ["Vibes"], linkedVibeTags: ["teaser", "piercings"], - allowRemote: true, events: [ - {trigger:"playerAttack", type: "MotionSensitive", chance: 0.5, msg: "KDPunishAttack"}, - {trigger:"punish", type: "PunishSelf", power: 1, time: 24, edgeOnly: true}, - ]}, - {inventory: true, arousalMode: true, name: "NippleClamps2", unlimited: true, Asset: "HeartPasties", Color: "Default", Group: "ItemNipples", power: 3, weight: 0, - vibeLocation: "ItemNipples", - escapeChance: {"Struggle": -10, "Cut": -0.05, "Remove": 0.5, "Pick": 0.25}, failSuffix: {"Struggle": "Clamps"}, - maxwill: 1.0, enemyTags: {"dressRestraints" : 3, "genericToys": 3, "maidRestraints": 2, "maidRestraintsLight": 1, "roboAngry": 10, "teasetoys": 2}, playerTags: {"NoVibes": -1000}, minLevel: 4, allFloors: true, shrine: ["Vibes"], linkedVibeTags: ["teaser", "piercings"], - allowRemote: true, events: [ - {trigger:"playerAttack", type: "MotionSensitive", chance: 0.5, msg: "KDPunishAttack"}, - {trigger:"struggle", type: "VibeOnStruggle", chance: 0.5, msg: "KDPunishStruggle"}, - {trigger:"punish", type: "PunishSelf", power: 1, time: 24, edgeOnly: true}, - ]}, - {inventory: true, arousalMode: true, name: "NippleClamps3", unlimited: true, Asset: "HeartPasties", Color: "Default", Group: "ItemNipples", power: 3, weight: 0, - vibeLocation: "ItemNipples", - escapeChance: {"Struggle": -10, "Cut": -0.05, "Remove": 0.5, "Pick": 0.25}, failSuffix: {"Struggle": "Clamps"}, - maxwill: 1.0, enemyTags: {"dressRestraints" : 1, "genericToys": 1, "maidRestraints": 1, "roboAngry": 10, "teasetoys": 1}, playerTags: {"NoVibes": -1000}, minLevel: 8, allFloors: true, shrine: ["Vibes"], linkedVibeTags: ["teaser", "piercings"], - allowRemote: true, events: [ - {trigger:"playerAttack", type: "MotionSensitive", chance: 1.0, msg: "KDPunishAttack"}, - {trigger:"struggle", type: "VibeOnStruggle", chance: 1.0, msg: "KDPunishStruggle"}, - {trigger:"sprint", type: "MotionSensitive", chance: 0.5, msg: "KDPunishSprint"}, - {trigger:"punish", type: "PunishSelf", power: 1, time: 24, edgeOnly: true}, - ]}, - - // Vibrators - These generally trigger on magic - {inventory: true, arousalMode: true, name: "TrapVibe", Asset: "TapedClitEgg", Color: "Default", Group: "ItemVulvaPiercings", power: 1, weight: 2, - failSuffix: {"Struggle": "Egg"}, - escapeChance: {"Struggle": 0.15}, enemyTags: {"trap":100, "maidRestraintsLight": 5, "genericToys": 2, "teasetoys": 2}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes"], linkedVibeTags: ["teaser"], vibeLocation: "ItemVulvaPiercings", - allowRemote: true, events: [ - {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, // Harder to remove by crotch rope - {trigger:"playerCast", type: "MagicallySensitive"}, - {trigger:"punish", type: "PunishSelf", power: 1, time: 24, edgeOnly: true}, - ]}, - {inventory: true, arousalMode: true, name: "TrapVibeProto", Asset: "TapedClitEgg", Color: "Default", Group: "ItemVulvaPiercings", power: 1, weight: 2, - failSuffix: {"Struggle": "Egg"}, - escapeChance: {"Struggle": 0.25}, enemyTags: {"protoToys": 2, "roboAngry": 10}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes"], linkedVibeTags: ["teaser", "piercings"], vibeLocation: "ItemVulvaPiercings", - allowRemote: true, events: [ - {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, // Harder to remove by crotch rope - {trigger:"playerCast", type: "MagicallySensitive"}, - {trigger:"punish", type: "PunishSelf", power: 3, time: 12, edgeOnly: true}, - {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 1, time: 48, edgeOnly: true}, - {trigger:"tick", type: "PeriodicTeasing", power: 2, time: 20, edgeOnly: true, cooldown: {"normal": 90, "tease": 20}, chance: 0.02}, - {trigger:"tick", type: "PeriodicTeasing", power: 3, time: 15, edgeOnly: false, cooldown: {"normal": 90, "tease": 20}, chance: 0.02}, - ]}, - {inventory: true, arousalMode: true, name: "MaidVibe", Asset: "TapedClitEgg", Color: "Default", Group: "ItemVulvaPiercings", power: 4, weight: 2, escapeChance: {"Struggle": 0.15}, - failSuffix: {"Struggle": "Egg"}, - enemyTags: {"maidVibeRestraints": 1000, "maidVibeRestraintsLimited": 100}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes"], linkedVibeTags: ["teaser"], vibeLocation: "ItemVulva", - allowRemote: true, events: [ - {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, // Harder to remove by crotch rope - {trigger:"playerCast", type: "MagicallySensitive", chance: 0.5}, - {trigger:"punish", type: "PunishSelf", power: 2, time: 12, edgeOnly: true}, - {trigger:"tick", type: "PeriodicTeasing", power: 2, time: 32, edgeOnly: true, cooldown: {"normal": 90, "tease": 20}, chance: 0.015}, - ]}, - - {inventory: true, arousalMode: true, name: "TrapPlug", unlimited: true, Asset: "VibratingDildo", Color: "Default", Group: "ItemVulva", plugSize: 1.0, power: 3, weight: 2, - failSuffix: {"Struggle": "Plug"}, - escapeChance: {"Struggle": 0.25}, enemyTags: {"trap":10, "maidRestraintsLight": 2, "genericToys": 2, 'machinePlug': 5}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes", "Plugs"], linkedVibeTags: ["plugs"], - allowRemote: true, events: [ - {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, - {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: true}, - {trigger:"tick", type: "PeriodicTeasing", power: 1, time: 12, edgeOnly: true, cooldown: {"normal": 60, "tease": 20}, chance: 0.02}, - {trigger:"tick", type: "PeriodicDenial", power: 1, time: 36, edgeOnly: false, cooldown: {"normal": 60, "tease": 20}, chance: 0.02}, - {trigger:"tick", type: "PeriodicTeasing", power: 3, time: 16, edgeOnly: false, cooldown: {"normal": 60, "tease": 20}, chance: 0.02}, - ]}, - {inventory: true, arousalMode: true, name: "TrapPlug2", unlimited: true, Asset: "VibratingDildo", Color: "Default", Group: "ItemVulva", plugSize: 1.0, power: 4, weight: 2, - failSuffix: {"Struggle": "Plug"}, - escapeChance: {"Struggle": 0.25}, enemyTags: {"trap":0, 'machinePlug': 5, "teasetoys": 2}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes", "Plugs"], linkedVibeTags: ["plugs"], - allowRemote: true, events: [ - {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, - {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: true}, - {trigger:"tick", type: "PeriodicTeasing", power: 1, time: 24, edgeOnly: true, cooldown: {"normal": 30, "tease": 8}, chance: 0.05}, - ]}, - {inventory: true, arousalMode: true, name: "TrapPlug3", unlimited: true, Asset: "VibratingDildo", Color: "Default", Group: "ItemVulva", plugSize: 1.0, power: 5, weight: 2, - failSuffix: {"Struggle": "Plug"}, - escapeChance: {"Struggle": 0.25}, enemyTags: {"trap":0, 'machinePlug': 5, "teasetoys": 2}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes", "Plugs"], linkedVibeTags: ["plugs"], - allowRemote: true, events: [ - {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, - {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: true}, - {trigger:"tick", type: "PeriodicDenial", power: 2, time: 36, cooldown: {"normal": 150, "tease": 40}, chance: 0.05}, - ]}, - {inventory: true, arousalMode: true, name: "TrapPlug4", unlimited: true, Asset: "VibratingDildo", Color: "Default", Group: "ItemVulva", plugSize: 1.0, power: 5, weight: 1, - failSuffix: {"Struggle": "Plug"}, - escapeChance: {"Struggle": 0.25}, enemyTags: {"trap":0, 'machinePlug': 2}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes", "Plugs"], linkedVibeTags: ["plugs"], - allowRemote: true, events: [ - {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, - {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: true}, - {trigger:"tick", type: "PeriodicTeasing", power: 3, time: 20, edgeOnly: false, cooldown: {"normal": 40, "tease": 20}, chance: 0.01}, - {trigger:"tick", type: "PeriodicDenial", power: 2, time: 30, edgeOnly: true, cooldown: {"normal": 70, "tease": 20}, chance: 0.02}, - {trigger:"tick", type: "PeriodicTeasing", power: 4, time: 10, edgeOnly: false, cooldown: {"normal": 90, "tease": 5}, chance: 0.03}, - ]}, - - {inventory: true, arousalMode: true, name: "TrapPlug5", unlimited: true, Asset: "VibratingDildo", Color: "Default", Group: "ItemVulva", plugSize: 1.0, power: 5, weight: 1, - failSuffix: {"Struggle": "Plug"}, - escapeChance: {"Struggle": 0.25}, enemyTags: {"trap":0, 'machinePlug': 2, "intensetoys": 2}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes", "Plugs"], linkedVibeTags: ["plugs"], - allowRemote: true, events: [ - {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, - {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: true}, - {trigger:"tick", type: "PeriodicTeasing", power: 2, time: 36, edgeOnly: false, cooldown: {"normal": 60, "tease": 30}, chance: 0.05}, - {trigger:"tick", type: "PeriodicTeasing", power: 4, time: 24, edgeOnly: false, cooldown: {"normal": 90, "tease": 15}, chance: 0.03}, - ]}, - - - {inventory: true, arousalMode: true, name: "SteelPlugF", Asset: "VibratingDildo", Color: "#ffffff", Group: "ItemVulva", plugSize: 1.5, power: 1, weight: 2, - escapeChance: {"Struggle": 0.35}, enemyTags: {"plugSpell":1}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Plugs"], - events: [ - {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, - ], - failSuffix: {"Struggle": "Plug"}, - }, - {inventory: true, arousalMode: true, name: "SteelPlugR", Asset: "VibratingDildoPlug", Color: "#ffffff", Group: "ItemButt", plugSize: 1.5, power: 1, weight: 2, - escapeChance: {"Struggle": 0.35}, enemyTags: {"plugSpell":1, 'machinePlug': 4}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Plugs"], - events: [ - {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, - ], - failSuffix: {"Struggle": "Plug"}, - }, - {inventory: true, arousalMode: true, name: "RearVibe1", Asset: "VibratingDildo", Color: "Default", Group: "ItemButt", plugSize: 1.0, power: 5, weight: 1, escapeChance: {"Struggle": 0.25}, - enemyTags: {"genericToys": 1, "rearToys": 10}, - playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes", "Plugs"], - failSuffix: {"Struggle": "Plug"}, - linkedVibeTags: ["plugs"], allowRemote: true, events: [ - {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, - {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: true}, - {trigger:"tick", type: "PeriodicTeasing", power: 1, time: 30, edgeOnly: true, cooldown: {"normal": 120, "tease": 20}, chance: 0.02}, - ]}, - - // Generic ball gag thats stronger than the trap one - {inventory: true, name: "MagicGag", Asset: "BallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], gag: 0.35, Type: "Tight", Color: ["Default", "Default"], Group: "ItemMouth", DefaultLock: "Red", power: 3, weight: 2, - escapeChance: {"Struggle": 0.0, "Cut": 0.45, "Remove": 0.65, "Pick": 0.3}, - maxwill: 0.9, enemyTags: {"ballGagRestraints" : 4, "gagSpell": 10}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Gags", "BallGags"]}, - {inventory: true, name: "MagicGag2", Asset: "BallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], gag: 0.45, Type: "Tight", Color: ["Default", "##ff00ff"], Group: "ItemMouth", DefaultLock: "Purple", magic: true, power: 5, weight: 2, - escapeChance: {"Struggle": -0.1, "Cut": 0.12, "Remove": 0.45, "Pick": 0.25}, - enemyTags: {"ballGagRestraintsMagic" : 4, "gagSpellStrong": 10}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Gags", "BallGags", "Conjure"]}, - - // Generic stronger gag - {inventory: true, trappable: true, name: "PanelGag", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Asset: "HarnessPanelGag", gag: 0.7, - events: [ - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.2, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.15, requiredTag: "Blindfolds"}, - ], - Color: "#888888", Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 5, strictness: 0.2, weight: 2, - escapeChance: {"Struggle": 0, "Cut": 0.3, "Remove": 0.4, "Pick": 0.3}, - maxwill: 0.6, enemyTags: {"leatherRestraintsHeavy":8, "ropeAuxiliary": 4}, playerTags: {}, minLevel: 4, allFloors: true, shrine: ["Leather", "Gags", "FlatGags"]}, - {inventory: true, trappable: true, name: "HarnessGag", debris: "Belts", Asset: "HarnessBallGag", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], - events: [ - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.15, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.1, requiredTag: "Blindfolds"}, - ], - gag: 0.65, Type: "Tight", Color: ["Default", "Default"], Group: "ItemMouth", power: 4, strictness: 0.2, weight: 3, - escapeChance: {"Struggle": 0.05, "Cut": 0.3, "Remove": 0.4, "Pick": 0.35}, - maxwill: 0.6, enemyTags: {"leatherRestraints":1, "leatherRestraintsHeavy": 1, "ropeAuxiliary": 8}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Gags", "BallGags"]}, - {inventory: true, name: "PanelPlugGag", Asset: "OTNPlugGag", debris: "Belts", LinkableBy: [...KDPlugGagLink], renderWhenLinked: [...KDPlugGagLink], Type: "Plug", gag: 1.0, - events: [ - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.2, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.15, requiredTag: "Blindfolds"}, - ], - Color: ["#888888", "#444444", "#aaaaaa"], Group: "ItemMouth", strictness: 0.4, power: 7, weight: 1, - escapeChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": 0.15, "Pick": 0.07}, - maxwill: 0.2, enemyTags: {"leatherRestraintsHeavy" : 10, "ropeAuxiliary": 1}, playerTags: {}, minLevel: 8, allFloors: true, shrine: ["Leather", "Gags", "PlugGags"]}, - - // Simple cloth stuff - {inventory: true, name: "ClothGag", LinkableBy: [...KDBallGagLink], debris: "Fabric", renderWhenLinked: [...KDBallGagLink], Asset: "ClothGag", gag: 0.35, Type: "Knotted", Color: "#959595", Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, - maxwill: 0.75, enemyTags: {"clothRestraints":8, "ropeAuxiliary": 1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Gags", "BallGags"]}, - {inventory: true, name: "ClothGagOver", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Asset: "ClothGag", gag: 0.35, Type: "OTN", Color: "#959595", Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, - maxwill: 0.75, enemyTags: {"clothRestraints":4, "ropeAuxiliary": 1}, debris: "Fabric", playerTags: {"ItemMouthEmpty": -4, "ItemMouth2Empty": -4}, minLevel: 0, allFloors: true, shrine: ["Rope", "Gags", "FlatGags"]}, - {inventory: true, name: "ClothBlindfold", Asset: "ClothBlindfold", debris: "Fabric", Color: "#959595", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHead", power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, - affinity: {Struggle: ["Sticky", "Hook"], Remove: ["Hook"],}, - maxwill: 0.85, blindfold: 1, enemyTags: {"clothRestraints":8, "ropeAuxiliary": 1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Blindfolds"]}, - - //region Baast warriors only apply two things so its okay that these have a high maxwill - {inventory: true, name: "KittyGag", Asset: "KittyHarnessPanelGag", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.6, - events: [ - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.2, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.15, requiredTag: "Blindfolds"}, - ], - Color: ["#FFFFFF", "#FFFFFF", "#000000", "#E496E7"], Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 5, weight: 2, escapeChance: {"Struggle": 0, "Cut": 0.3, "Remove": 0.25, "Pick": 0.2}, - enemyTags: {"kittyRestraints":8}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Gags", "FlatGags", "Will"]}, - {inventory: true, name: "KittyMuzzle", debris: "Belts", Asset: "KittyGag", gag: 0.4, Color: ["#FFFFFF", "#000000", "#E496E7"], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 5, weight: -6, escapeChance: {"Struggle": -0.1, "Cut": 0.18, "Remove": 0.4, "Pick": 0.2}, - maxwill: 0.9, enemyTags: {"kittyRestraints":6}, playerTags: {"ItemMouth2Full": 4, "ItemMouthFull": 4}, minLevel: 0, allFloors: true, shrine: ["Leather", "Gags", "FlatGags", "Will"]}, - {inventory: true, name: "KittyBlindfold", debris: "Belts", Asset: "KittyBlindfold", blindfold: 2, LinkableBy: [...KDBlindfoldLink], renderWhenLinked: [...KDBlindfoldLink], Color: ["#FFFFFF","#000000","#E48FE9"], Group: "ItemHead", power: 5, weight: 2, escapeChance: {"Struggle": 0.1, "Cut": 0.3, "Remove": 0.25, "Pick": 0.2}, - enemyTags: {"kittyRestraints":8}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Gags", "Will"]}, - {inventory: true, name: "KittyPaws", debris: "Belts", Asset: "PawMittens", Color: ["#FFFFFF","#FFFFFF","#FFFFFF","#B38295"], Group: "ItemHands", bindhands: 1.0, power: 5, weight: 2, escapeChance: {"Struggle": 0.1, "Cut": 0.3, "Remove": 0.3, "Pick": 0.2}, - maxwill: 0.9, enemyTags: {"kittyRestraints":8}, playerTags: {}, minLevel: 4, allFloors: true, shrine: ["Leather", "Mittens", "Will"]}, - {inventory: true, name: "KittySuit", debris: "Belts", Asset: "BitchSuit", Color: "Default", Group: "ItemArms", DefaultLock: "Red", bindarms: true, bindhands: 1.0, power: 11, weight: 0, escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": -0.1, "Pick": 0.15}, - events:[ - {trigger:"defeat", type:"Kittify"}, - ], - helpChance: {"Remove": 0.1}, maxwill: 0.15, enemyTags: {"kittyRestraints":3}, playerTags: {}, minLevel: 7, allFloors: true, shrine: ["Latex", "Petsuits", "Will"]}, - {inventory: true, name: "MagicPetsuit", inaccessible: true, debris: "Belts", Asset: "StrictLeatherPetCrawler", magic: true, Color: "Default", Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 12, weight: 0, escapeChance: {"Struggle": -0.15, "Cut": 0.12, "Remove": -0.05, "Pick": 0.15}, - helpChance: {"Remove": 0.2}, maxwill: 0.15, enemyTags: {"petsuitSpell": 1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Petsuits", "Conjure"]}, - // Only apply if already wearing KittySuit - {inventory: true, name: "KittyPetSuit", inaccessible: true, debris: "Belts", Asset: "BitchSuit", Color: "Default", Group: "ItemArms", DefaultLock: "Blue", bindarms: true, bindhands: 1.0, blockfeet: true, power: 14, weight: 0, escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": -0.1, "Pick": 0.15}, - alwaysDress: [ - {Item: "KittenEars2", Group: "HairAccessory2", Color: ['Default'], override: false, useHairColor: true,}, - {Item: "TailStrap", Group: "TailStraps", Color: ['Default'], override: false, useHairColor: true,}, - //{Item: "LeatherBreastBinder", Group: "Bra", Color: ['Default'], drawOver: true}, - //{Item: "LeatherHarness", Group: "ItemTorso", Color: ['Default'], drawOver: true} - ], - helpChance: {"Remove": 0.01}, maxwill: 0.15, enemyTags: {"kittyRestraints":0}, playerTags: {}, minLevel: 7, allFloors: true, shrine: ["Latex", "Petsuits", "Will"]}, - //endregion - - //region These restraints are easy, so they dont have maxwill - {inventory: true, name: "WristShackles", debris: "Chains", Asset: "WristShackles", linkCategory: "Cuffs", linkSize: 0.33, LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Group: "ItemArms", Color: "Default", bindarms: true, Type: "Behind", power: 1, weight: 2, escapeChance: {"Struggle": -0.05, "Cut": -0.25, "Remove": 10, "Pick": 5}, enemyTags: {"shackleRestraints":7, "handcuffer": 6, "Unchained": -8}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs"]}, - {inventory: true, name: "LegShackles", debris: "Chains", Asset: "LeatherLegCuffs", LinkableBy: ["Legbinders", "Hobbleskirts", "Belts", "Ties"], Group: "ItemLegs", hobble: true, Type: "Chained", Color: ["Default", "#888888", "#AAAAAA"], power: 3, weight: 2, escapeChance: {"Struggle": -0.1, "Cut": -0.3, "Remove": 10, "Pick": 5}, enemyTags: {"shackleRestraints":2}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs"]}, - {inventory: true, name: "FeetShackles", debris: "Chains", Asset: "SteelAnkleCuffs", LinkableBy: [...KDBindable, ...KDDevices], Link: "FeetShackles2", Group: "ItemFeet", hobble: true, Type: "Chained", Color: ["Default", "Default"], power: 5, weight: 2, escapeChance: {"Struggle": -0.1, "Cut": -0.3, "Remove": 10, "Pick": 5}, enemyTags: {"shackleRestraints":2}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs"], - events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.2, subMult: 0.5, tags: ["lowwill"], noLeash: true}]}, - // Dummy, remove in future - {inventory: true, name: "AnkleShackles", debris: "Chains", Asset: "SteelAnkleCuffs", LinkableBy: [...KDBindable, ...KDDevices], Link: "FeetShackles2", Group: "ItemFeet", hobble: true, Type: "Chained", Color: ["Default", "Default"], power: 5, weight: -9999, escapeChance: {"Struggle": -0.1, "Cut": -0.3, "Remove": 10, "Pick": 5}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs"], - events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.2, subMult: 0.5, tags: ["lowwill"], noLeash: true}]}, - {name: "FeetShackles2", debris: "Chains", Asset: "SteelAnkleCuffs", LinkableBy: [...KDBindable, ...KDDevices], UnLink: "FeetShackles", Group: "ItemFeet", blockfeet: true, Type: "Closed", Color: ["Default", "Default"], power: 5, weight: 2, escapeChance: {"Struggle": -0.05, "Cut": -0.3, "Remove": 10, "Pick": 5}, enemyTags: {"shackleRestraints":2}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}]}, - {inventory: true, name: "SteelMuzzleGag", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.3, Asset: "MuzzleGag", Group: "ItemMouth", AssetGroup: "ItemMouth3", Color: "#999999", - power: 3, weight: 2, escapeChance: {"Struggle": -0.3, "Cut": -0.25, "Remove": 10, "Pick": 5}, enemyTags: {"shackleGag":1}, playerTags: {"ItemMouthFull":1}, minLevel: 0, allFloors: true, shrine: ["Metal", "Gags", "FlatGags"]}, - //endregion - - {name: "ComfyGag", gag: 0.5, Asset: "MuzzleGag", Group: "ItemMouth", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], AssetGroup: "ItemMouth3", Color: "#cccccc", power: 1, weight: 4, escapeChance: {"Struggle": 0.2, "Cut": 0.2, "Remove": 0.4, "Pick": 5}, maxwill: 0.9, - enemyTags: {"comfyRestraints":1}, playerTags: {"ItemMouthFull":1}, minLevel: 0, allFloors: true, shrine: ["Gags", "FlatGags", "Illusion"]}, - {name: "ComfyStraitjacket", Asset: "HighSecurityStraitJacket", Modules: [0, 2, 1], Color: ['#cccccc', '#cccccc', '#cccccc'], Group: "ItemArms", power: 3, weight: 1, bindarms: true, bindhands: 0.9, - limitChance: {"Struggle": 0.2, "Cut": 0.07, "Remove": 0.35, "Unlock": 0.75}, // Hard to escape the arms box by struggling - escapeChance: {"Struggle": 0.2, "Cut": 0.2, "Remove": 0.4, "Pick": 5}, enemyTags: {"comfyRestraints": 1}, playerTags: {}, minLevel: 0, maxwill: 0.35, - allFloors: true, shrine: ["Straitjackets", "Illusion"]}, - - {curse: "5Keys", name: "GhostCollar", Asset: "OrnateCollar", Group: "ItemNeck", LinkableBy: [...KDCollarLink], magic: true, Color: ["#555555", "#AAAAAA"], power: 20, weight: 0, difficultyBonus: 30, - escapeChance: {"Struggle": -100, "Cut": -0.8, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: []}, - - {renderWhenLinked: ["Ties"], inventory: true, name: "SturdyLeatherBeltsArms", debris: "Belts", accessible: true, Asset: "SturdyLeatherBelts", LinkableBy: ["Wrapping", "Ties"], Type: "Three", Color: "Default", Group: "ItemArms", bindarms: true, power: 2.5, weight: 0, - escapeChance: {"Struggle": -0.1, "Cut": 0.5, "Remove": 0.22}, - maxwill: 0.9, enemyTags: {"leatherRestraints":6}, playerTags: {"ItemArmsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Leather", "Belts", "ArmBind"]}, - {renderWhenLinked: ["Ties"], inventory: true, name: "SturdyLeatherBeltsFeet", debris: "Belts", accessible: true, Asset: "SturdyLeatherBelts", LinkableBy: ["Wrapping", "Ties"], Type: "Three", Color: "Default", Group: "ItemFeet", blockfeet: true, power: 2, weight: 0, - escapeChance: {"Struggle": -0.1, "Cut": 0.5, "Remove": 0.5}, - maxwill: 1.0, enemyTags: {"leatherRestraints":6}, playerTags: {"ItemLegsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Leather", "Belts", "LegBind"]}, - {renderWhenLinked: ["Legbinders", "Hobbleskirts", "Ties"], accessible: true, inventory: true, name: "SturdyLeatherBeltsLegs", debris: "Belts", Asset: "SturdyLeatherBelts", LinkableBy: ["Wrapping", "Legbinders", "Hobbleskirts", "Ties"], Type: "Two", Color: "Default", Group: "ItemLegs", hobble: true, power: 2, weight: 0, - escapeChance: {"Struggle": -0.1, "Cut": 0.5, "Remove": 0.5}, - maxwill: 0.8, enemyTags: {"leatherRestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Leather", "Belts", "LegBind"]}, - - - {inventory: true, name: "AsylumAnkleCuffs", debris: "Belts", Asset: "LeatherAnkleCuffs", LinkableBy: ["Wrapping", "Ties", "Belts"], Link: "AsylumAnkleCuffs2", Type: "Chained", Color: ["Default", "#814F21", "Default"], Group: "ItemFeet", hobble: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.05, "Remove": 0.35, "Pick": 0.25}, enemyTags: {"nurseRestraints": 3, "nurseCuffRestraints": 5, "leathercuffsSpell": 3}, playerTags: {"ItemFeetFull":-2}, minLevel: 2, allFloors: true, shrine: ["Leather", "Cuffs", "AnkleCuffsBase"], - maxwill: 1.0, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.2, subMult: 0.5, tags: ["lowwill"], noLeash: true}]}, - {name: "AsylumAnkleCuffs2", debris: "Belts", Asset: "LeatherAnkleCuffs", LinkableBy: ["Wrapping", "Ties", "Belts"], UnLink: "AsylumAnkleCuffs", Type: "Closed", Color: ["Default", "#814F21", "Default"], Group: "ItemFeet", blockfeet: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.05, "Remove": 0.35, "Pick": 0.25}, enemyTags: {}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}]}, - - {inventory: true, name: "AsylumLegCuffs", debris: "Belts", Asset: "LeatherLegCuffs", LinkableBy: ["Legbinders", "Ties", "Belts", "Hobbleskirts"], Type: "Chained", Color: ["Default", "#814F21", "Default"], Group: "ItemLegs", hobble: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.05, "Remove": 0.3, "Pick": 0.25}, - maxwill: 0.8, enemyTags: {"nurseRestraints": 3, "nurseCuffRestraints": 5, "leathercuffsSpell": 3}, playerTags: {"ItemLegsFull":-2}, minLevel: 2, allFloors: true, shrine: ["Leather", "Cuffs"]}, - - {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "AsylumArmCuffs", debris: "Belts", Color: ["#814F21", "Default"], accessible: true, Asset: "LeatherCuffs", linkCategory: "Cuffs", linkSize: 0.55, LinkableBy: [...KDDevices,...KDBindable], Link: "AsylumArmCuffs2", Group: "ItemArms", bindarms: false, power: 8, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.05, "Remove": 0.25, "Pick": 0.35}, enemyTags: {"nurseRestraints": 3, "nurseCuffRestraints": 5, "leathercuffsSpell": 3}, playerTags: {"ItemArmsFull":-2, "Unchained": 9}, minLevel: 0, allFloors: true, shrine: ["Leather", "Cuffs", "ArmCuffsBase"], - maxwill: 1.0, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "defeat", type: "linkItem", chance: 1.0}]}, - {name: "AsylumArmCuffs2", debris: "Belts", accessible: true, Asset: "LeatherCuffs", Type: "Wrist", Color: ["#814F21", "Default"], LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Link: "AsylumArmCuffs3", UnLink: "AsylumArmCuffs", Group: "ItemArms", bindarms: true, power: 6, weight: 0, - escapeChance: {"Struggle": 0, "Cut": -0.15, "Remove": 0.2, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true}]}, - {name: "AsylumArmCuffs3", debris: "Belts", accessible: true, Asset: "LeatherCuffs", Type: "Both", Color: ["#814F21", "Default"], LinkableBy: [...KDElbowBind, ...KDBindable], UnLink: "AsylumArmCuffs4", Group: "ItemArms", bindarms: true, power: 5, weight: 0, strictness: 0.1, - escapeChance: {"Struggle": -0.1, "Cut": -0.15, "Remove": -0.1, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true}]}, - {name: "AsylumArmCuffs4", debris: "Belts", accessible: true, Asset: "LeatherCuffs", Type: "Elbow", Color: ["#814F21", "Default"], LinkableBy: [...KDElbowBind, ...KDBindable], Link: "AsylumArmCuffs3", UnLink: "AsylumArmCuffs", Group: "ItemArms", bindarms: true, power: 7, weight: 0, - escapeChance: {"Struggle": 0, "Cut": -0.175, "Remove": -0.15, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.5, tags: ["lowwill"]}, {trigger: "beforeStruggleCalc", type: "elbowCuffsBlock", inheritLinked: true}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}]}, - - {inventory: true, name: "LeatherAnkleCuffs", debris: "Belts", Asset: "LeatherAnkleCuffs", LinkableBy: ["Wrapping", "Ties", "Belts"], Link: "LeatherAnkleCuffs2", Type: "Chained", Color: ["Default", "Default", "Default"], Group: "ItemFeet", hobble: true, power: 4, weight: 0, - escapeChance: {"Struggle": 0.1, "Cut": 0.1, "Remove": 0.25, "Pick": 0.25}, enemyTags: {"leatherRestraintsHeavy":4, "dragonRestraints":6, "handcuffer": 10, "leathercuffsSpell": 8}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Leather", "Cuffs", "AnkleCuffsBase"], - maxwill: 1.0, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.2, subMult: 0.5, tags: ["lowwill"], noLeash: true}]}, - {name: "LeatherAnkleCuffs2", debris: "Belts", Asset: "LeatherAnkleCuffs", LinkableBy: ["Wrapping", "Ties", "Belts"], UnLink: "LeatherAnkleCuffs", Type: "Closed", Color: ["Default", "Default", "Default"], Group: "ItemFeet", blockfeet: true, power: 4, weight: 0, - escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": 0.15, "Pick": 0.25}, enemyTags: {}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}]}, - - - {inventory: true, name: "LeatherLegCuffs", debris: "Belts", Asset: "LeatherLegCuffs", LinkableBy: ["Legbinders", "Ties", "Belts", "Hobbleskirts"], Type: "Chained", Color: ["Default", "Default", "Default"], Group: "ItemLegs", hobble: true, power: 4, weight: 0, - escapeChance: {"Struggle": 0.1, "Cut": 0.1, "Remove": 0.3, "Pick": 0.3}, - maxwill: 0.8, enemyTags: {"leatherRestraints":6, "handcuffer": 2, "leathercuffsSpell": 8}, playerTags: {"ItemLegsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Leather", "Cuffs"]}, - - {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "LeatherArmCuffs", debris: "Belts", accessible: true, Asset: "LeatherCuffs", linkCategory: "Cuffs", linkSize: 0.55, LinkableBy: [...KDDevices,...KDBindable], Link: "LeatherArmCuffs2", Color: ['Default', 'Default'], Group: "ItemArms", bindarms: false, power: 3, weight: 0, - escapeChance: {"Struggle": 0.1, "Cut": 0.1, "Remove": 0.25, "Pick": 0.35}, enemyTags: {"leatherRestraintsHeavy":4, "dragonRestraints":6, "handcuffer": 10, "leathercuffsSpell": 8}, playerTags: {"ItemArmsFull":-2, "Unchained": 9}, minLevel: 0, allFloors: true, shrine: ["Leather", "Cuffs", "ArmCuffsBase"], - maxwill: 1.0, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "defeat", type: "linkItem", chance: 1.0}]}, - {name: "LeatherArmCuffs2", debris: "Belts", accessible: true, Asset: "LeatherCuffs", Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Link: "LeatherArmCuffs3", UnLink: "LeatherArmCuffs", Color: ['Default', 'Default'], Group: "ItemArms", bindarms: true, power: 4, weight: 0, - escapeChance: {"Struggle": 0, "Cut": -0.1, "Remove": 0.2, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true}]}, - {name: "LeatherArmCuffs3", debris: "Belts", accessible: true, Asset: "LeatherCuffs", Type: "Both", LinkableBy: [...KDElbowBind, ...KDBindable], UnLink: "LeatherArmCuffs4", Color: ['Default', 'Default'], Group: "ItemArms", bindarms: true, power: 5, weight: 0, strictness: 0.1, - escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true}]}, - {name: "LeatherArmCuffs4", debris: "Belts", accessible: true, Asset: "LeatherCuffs", Type: "Elbow", LinkableBy: [...KDElbowBind, ...KDBindable], Link: "LeatherArmCuffs3", UnLink: "LeatherArmCuffs", Color: ['Default', 'Default'], Group: "ItemArms", bindarms: true, power: 4, weight: 0, - escapeChance: {"Struggle": 0, "Cut": -0.125, "Remove": -0.15, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.5, tags: ["lowwill"]}, {trigger: "beforeStruggleCalc", type: "elbowCuffsBlock", inheritLinked: true}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}]}, - - {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "SteelArmCuffs", debris: "Chains", accessible: true, Asset: "SteelCuffs", linkCategory: "Cuffs", linkSize: 0.55, LinkableBy: [...KDDevices,...KDBindable], Link: "SteelArmCuffs2", Color: ['Default', 'Default'], Group: "ItemArms", bindarms: false, power: 4, weight: 0, - escapeChance: {"Struggle": -0.1, "Cut": -0.5, "Remove": 0.15, "Pick": 0.25}, enemyTags: {"steelCuffs":4}, playerTags: {"ItemArmsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Cuffs", "ArmCuffsBase"], - maxwill: 0.9, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.4}, {trigger: "defeat", type: "linkItem", chance: 1.0}]}, - {name: "SteelArmCuffs2", debris: "Chains", accessible: true, Asset: "SteelCuffs", Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], UnLink: "SteelArmCuffs", Color: ['Default', 'Default'], Group: "ItemArms", bindarms: true, power: 4, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.5, "Remove": 0.2, "Pick": 0.15}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true}]}, - - - // Magnetic cuffs - {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "MagneticArmCuffs", debris: "Chains", accessible: true, Asset: "SteelCuffs", linkCategory: "Cuffs", linkSize: 0.55, - LinkableBy: [...KDDevices,...KDBindable], Link: "MagneticArmCuffs2", Color: ['#444444', '#444444'], Group: "ItemArms", bindarms: false, power: 5, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.5, "Remove": 0.15, "Pick": 0.15}, enemyTags: {"magnetCuffs":10}, playerTags: {"ItemArmsFull":-4}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "ArmCuffsBase", "Elements"], - maxwill: 0.9, events: [ - {trigger: "beforePlayerDamage", type: "linkItemOnDamageType", sfx: "LightJingle", damage: "electric", chance: 1.0, requiredTag: "locked"}, - {trigger: "beforePlayerDamage", type: "lockItemOnDamageType", sfx: "LightJingle", damage: "electric", chance: 1.0, lock: "Blue"}, - {trigger: "defeat", type: "linkItem", chance: 1.0} - ]}, - {name: "MagneticArmCuffs2", debris: "Chains", accessible: true, Asset: "SteelCuffs", Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], UnLink: "MagneticArmCuffs", Color: ['#444444', '#444444'], - Group: "ItemArms", bindarms: true, power: 5, weight: 0, helpChance: {"Remove": 0.25}, - escapeChance: {"Struggle": 0.05, "Remove": -0.2}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true}]}, - - - {inventory: true, nonbinding: true, name: "MagneticAnkleCuffs", Asset: "SteelAnkleCuffs", debris: "Chains", LinkableBy: [...KDBindable, ...KDDevices], Link: "MagneticAnkleCuffs2", Color: "#444444", Group: "ItemFeet", power: 5, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": 0.1, "Pick": 0.15}, - enemyTags: {"magnetCuffs": 5}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "AnkleCuffsBase", "Elements"], - maxwill: 0.8, events: [ - {trigger: "beforePlayerDamage", type: "linkItemOnDamageType", sfx: "LightJingle", damage: "electric", chance: 1.0, requiredTag: "locked"}, - {trigger: "beforePlayerDamage", type: "lockItemOnDamageType", sfx: "LightJingle", damage: "electric", chance: 1.0, lock: "Blue"}, - {trigger: "defeat", type: "linkItem", chance: 1.0} - ]}, - {name: "MagneticAnkleCuffs2", debris: "Chains", Asset: "SteelAnkleCuffs", LinkableBy: [...KDBindable, ...KDDevices], UnLink: "MagneticAnkleCuffs", Type: "Closed", Color: "#444444", Group: "ItemFeet", blockfeet: true, power: 5, weight: 0, - escapeChance: {"Struggle": 0.05, "Remove": 0.05}, helpChance: {"Remove": 0.25}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}]}, - - // End magnetic cuffs - - {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "ScaleArmCuffs", debris: "Belts", accessible: true, Asset: "LeatherCuffs", linkCategory: "Cuffs", linkSize: 0.55, LinkableBy: [...KDDevices,...KDBindable], Link: "ScaleArmCuffs2", Color: ["#9B1818", "#675F50"], Group: "ItemArms", bindarms: false, power: 7, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.05, "Remove": 0.25, "Pick": 0.35}, enemyTags: {"dragonRestraints":1}, playerTags: {"ItemArmsFull":2}, minLevel: 7, allFloors: true, shrine: ["Leather", "Cuffs", "ArmCuffsBase"], - maxwill: 0.7, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "defeat", type: "linkItem", chance: 1.0}]}, - {name: "ScaleArmCuffs2", debris: "Belts", accessible: true, Asset: "LeatherCuffs", Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Link: "ScaleArmCuffs3", UnLink: "ScaleArmCuffs", Color: ["#9B1818", "#675F50"], Group: "ItemArms", bindarms: true, power: 7, weight: 0, - escapeChance: {"Struggle": -0.1, "Cut": -0.15, "Remove": 0.2, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true}]}, - {name: "ScaleArmCuffs3", debris: "Belts", accessible: true, Asset: "LeatherCuffs", Type: "Both", LinkableBy: [...KDElbowBind, ...KDBindable], UnLink: "ScaleArmCuffs4", Color: ["#9B1818", "#675F50"], Group: "ItemArms", bindarms: true, power: 7, weight: 0, strictness: 0.1, - escapeChance: {"Struggle": -0.15, "Cut": -0.15, "Remove": -0.1, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true}]}, - {name: "ScaleArmCuffs4", debris: "Belts", accessible: true, Asset: "LeatherCuffs", Type: "Elbow", LinkableBy: [...KDElbowBind, ...KDBindable], Link: "ScaleArmCuffs3", UnLink: "ScaleArmCuffs", Color: ["#9B1818", "#675F50"], Group: "ItemArms", bindarms: true, power: 7, weight: 0, - escapeChance: {"Struggle": -0.15, "Cut": -0.15, "Remove": -0.15, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.5, tags: ["lowwill"]}, {trigger: "beforeStruggleCalc", type: "elbowCuffsBlock", inheritLinked: true}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}]}, - - //region Maid - {inventory: true, name: "MaidJacket", debris: "Belts", Asset: "Bolero", Color: ["#191919", "#A3A3A3"], Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7.5, weight: 0, strictness: 0.2, - LinkableBy: [...KDJacketLink], renderWhenLinked: [...KDJacketRender], - limitChance: {"Struggle": 0.12, "Cut": 0.03, "Remove": 0.1, "Unlock": 0.75}, // Hard to escape the arms box by struggling - escapeChance: {"Struggle": -0.175, "Cut": 0.1, "Remove": 0.15, "Pick": 0.15}, - maxwill: 0.3, enemyTags: {"maidRestraints":5, "maidRestraintsNonChastity": 10, "noMaidJacket":-5}, playerTags: {"ItemArmsEmpty": -9}, minLevel: 7, allFloors: true, shrine: ["Latex", "Straitjackets", "Illusion"]}, - {inventory: true, name: "MaidDress", debris: "Fabric", inaccessible: true, Type: "Strap", Asset: "LeatherArmbinder", strictness: 0.25, Color: ['#191919'], Group: "ItemArms", LinkableBy: [...KDDressLink], bindarms: true, bindhands: 1.0, power: 8.5, weight: 0, - escapeChance: {"Struggle": -0.175, "Cut": 0.1, "Remove": -0.2, "Pick": 0.15}, - helpChance: {"Remove": 0.075}, - limitChance: {"Struggle": 0.12, "Cut": 0.03, "Remove": 0.1, "Unlock": 0.75}, // Hard to escape the arms box by struggling - alwaysDress: [ - {Item: "SleevelessCatsuit", Group: "Suit", Color: "#aaaaaa", override: true}, - {Item: "MaidApron2", Group: "Cloth", Color: "Default", override: true}, - {Item: "FullLatexBra2", Group: "Bra", Color: ["#333333", "#aaaaaa"], override: true}, - {Item: "Pantyhose2", Group: "SuitLower", Color: "#939393", override: true}, - {Item: "LaceBands", Group: "Bracelet", Color: ['Default', '#151515'], override: true}, - {Item: "MageSkirt", Group: "ClothLower", Color: ["#676767", "#2E2E2E"], override: true}, - {Item: "Corset4", Group: "Corset", Color: "#4B4B4B", override: true}, - {Item: "Band1", Group: "Hat", Color: "#767676", override: true}, - {Item: "Shoes5", Group: "Shoes", Color: "#575757", override: true}, - {Item: "Socks6", Group: "Socks", Color: ['#080808', 'Default'], override: true} - ], maxwill: 0.3, enemyTags: {"maidRestraints":3, "maidRestraintsNonChastity": 5}, playerTags: {"ItemArmsEmpty": -10}, minLevel: 7, allFloors: true, shrine: ["Latex", "Armbinders", "BindingDress", "Illusion"]}, - {inventory: true, name: "MaidBelt", debris: "Belts", Asset: "LeatherBelt", Color: "#DBDBDB", Group: "ItemLegs", LinkableBy: ["Wrapping", "Legbinders", "Hobbleskirts", "Ties"], hobble: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": 0.05, "Remove": 0.1, "Pick": 0.25}, - maxwill: 1.0, enemyTags: {"maidRestraints":10, "maidRestraintsNonChastity": 10, "maidRestraintsLight":1}, playerTags: {"ItemLegsFull":-2}, minLevel: 2, allFloors: true, shrine: ["Leather", "Belts"]}, - {inventory: true, name: "MaidAnkleCuffs", debris: "Chains", Asset: "SteelAnkleCuffs", LinkableBy: [...KDBindable, ...KDDevices], Link: "MaidAnkleCuffs2", Type: "Chained", Color: "Default", Group: "ItemFeet", hobble: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": 0.1, "Pick": 0.15}, - enemyTags: {"maidRestraints":7, "maidRestraintsNonChastity": 10, "steelCuffs": 5}, playerTags: {"ItemFeetFull":-2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Cuffs", "AnkleCuffsBase", "Illusion"], - maxwill: 0.8, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.2, subMult: 0.5, tags: ["lowwill"], noLeash: true}]}, - {name: "MaidAnkleCuffs2", debris: "Chains", Asset: "SteelAnkleCuffs", LinkableBy: [...KDBindable, ...KDDevices], UnLink: "MaidAnkleCuffs", Type: "Closed", Color: "Default", Group: "ItemFeet", blockfeet: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": 0.1, "Pick": 0.15}, - enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "Illusion"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}]}, - {inventory: true, name: "MaidCollar", debris: "Belts", Asset: "HighCollar", Color: ["#C9C9C9", "#FFFFFF"], Group: "ItemNeck", LinkableBy: [...KDCollarLink], power: 11, weight: 0, - escapeChance: {"Struggle": -0.3, "Cut": -0.25, "Remove": 0.4, "Pick": -0.1}, - unlimited: true, - maxwill: 0.25, enemyTags: {"maidRestraints":3, "maidRestraintsNonChastity": 10, "maidCollar":1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Collars", "HighCollars", "Illusion"]}, - {inventory: true, name: "MaidGag", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.75, - Asset: "MuzzleGag", Color: "Default", Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 8, weight: 0, - limitChance: {"Struggle": 0.12}, - escapeChance: {"Struggle": -0.18, "Cut": 0.05, "Remove": 0.33, "Pick": 0.15}, - maxwill: 0.75, enemyTags: {"maidRestraints":7, "maidRestraintsNonChastity": 10, }, playerTags: {}, minLevel: 4, allFloors: true, shrine: ["Leather", "Gags", "FlatGags", "Illusion"]}, - // Maid chastity. - {inventory: true, arousalMode: true, name: "MaidCBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "Default", Group: "ItemPelvis", LinkableBy: ["Ornate"], chastity: true, power: 9, weight: 0, - Security: { - level_key: 3, - }, - escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": 0.5, "Pick": 0.12}, - maxwill: 0.75, enemyTags: {"maidVibeRestraints": 200, "maidVibeRestraintsLimited": 100, "maidChastityBelt": 200}, playerTags: {"ItemVulvaEmpty" : -50, "ItemVulvaPiercingsEmpty" : -50}, minLevel: 0, allFloors: true, shrine: ["Metal", "Chastity", "Illusion"]}, - - //endregion - - //region Dragon - {inventory: true, name: "DragonArmbinder", debris: "Belts", inaccessible: true, Asset: "BoxTieArmbinder", strictness: 0.08, LinkableBy: ["Wrapping"], Color: ["#9B1818", "#ffffff"], Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7, weight: 0, - escapeChance: {"Struggle": 0.0, "Cut": -0.05, "Remove": 0.1, "Pick": 0.25}, // Hard to escape the arms box by struggling - limitChance: {"Struggle": 0.1, "Remove": 0.1, "Pick": 0.05, "Unlock": 0.5}, - maxwill: 0.25, enemyTags: {"dragonRestraints" : 2}, playerTags: {"ItemArmsEmpty": -10}, minLevel: 0, allFloors: true, shrine: ["Leather", "Boxbinders"]}, - {inventory: true, name: "DragonStraps", debris: "Belts", Asset: "ThinLeatherStraps", LinkableBy: ["Boxbinders"], Color: "#9B1818", Group: "ItemArms", bindarms: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.175, "Cut": -0.05, "Remove": 0.1, "Pick": 0.25}, - maxwill: 0.7, enemyTags: {"dragonRestraints":6}, playerTags: {"ItemArmsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Leather", "Belts"]}, - {inventory: true, name: "DragonLegCuffs", debris: "Belts", Asset: "LeatherLegCuffs", LinkableBy: ["Legbinders", "Ties", "Belts", "Hobbleskirts"], Type: "Chained", Color: ["Default", "#9B1818", "#675F50"], Group: "ItemLegs", hobble: true, power: 7, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.05, "Remove": 0.3, "Pick": 0.25}, - maxwill: 0.8, enemyTags: {"dragonRestraints":6}, playerTags: {"ItemLegsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Leather", "Cuffs"]}, - {inventory: true, name: "DragonAnkleCuffs", debris: "Belts", Asset: "LeatherAnkleCuffs", LinkableBy: [...KDBindable], Link: "DragonAnkleCuffs2", Type: "Chained", Color: ["Default", "#9B1818", "#675F50"], Group: "ItemFeet", hobble: true, power: 7, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.05, "Remove": 0.3, "Pick": 0.25}, enemyTags: {"dragonRestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 2, allFloors: true, shrine: ["Leather", "Cuffs", "AnkleCuffsBase"], - maxwill: 1.0, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.2, subMult: 0.5, tags: ["lowwill"], noLeash: true}]}, - {name: "DragonAnkleCuffs2", debris: "Chains", Asset: "LeatherAnkleCuffs", LinkableBy: [...KDBindable], UnLink: "DragonAnkleCuffs", Type: "Closed", Color: ["Default", "#9B1818", "#675F50"], Group: "ItemFeet", blockfeet: true, power: 7, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.05, "Remove": 0.3, "Pick": 0.25}, enemyTags: {"dragonRestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Leather", "Cuffs"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}]}, - {inventory: true, name: "DragonBoots", debris: "Belts", Asset: "BalletWedges", Color: "#424242", Group: "ItemBoots", hobble: true, power: 7, weight: 0, - escapeChance: {"Struggle": 0.025, "Cut": -0.05, "Remove": 0.05, "Pick": 0.25}, - enemyTags: {"dragonRestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 2, allFloors: true, shrine: ["Leather", "Boots"]}, - {inventory: true, name: "DragonBallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], gag: 0.65, Asset: "FuturisticHarnessBallGag", - events: [ - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.2, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.15, requiredTag: "Blindfolds"}, - ], - strictness: 0.3, Color: ['#680000', '#680000', '#680000', '#680000', '#680000'], Group: "ItemMouth", power: 7, weight: 0, - escapeChance: {"Struggle": -0.5, "Cut": -0.05, "Remove": 0.1, "Pick": 0.25}, - maxwill: 0.6, enemyTags: {"dragonRestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 7, allFloors: true, shrine: ["Leather", "Latex", "Gags", "BallGags"]}, - {inventory: true, name: "DragonMuzzleGag", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.3, Asset: "StitchedMuzzleGag", Color: "#9B1818", Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 7, weight: -6, - escapeChance: {"Struggle": 0.05, "Cut": 0.0, "Remove": 0.1}, - maxwill: 0.75, enemyTags: {"dragonRestraints":6}, playerTags: {"ItemMouthFull":4, "ItemMouth2Full":4}, minLevel: 0, allFloors: true, shrine: ["Leather", "Gags", "FlatGags"]}, - {inventory: true, name: "DragonCollar", debris: "Belts", Asset: "LatexCollar2", Color: "#9B1818", Group: "ItemNeck", LinkableBy: [...KDCollarLink], power: 9, weight: 4, - escapeChance: {"Struggle": -0.2, "Cut": -0.1, "Remove": 0.1}, - unlimited: true, - maxwill: 0.25, enemyTags: {"dragonRestraints":6, "dragonCollar": 4}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["Collars"]}, - //endregion - - //region Obsidian - {inventory: true, name: "ObsidianLegCuffs", debris: "Chains", accessible: true, Asset: "OrnateLegCuffs", LinkableBy: ["Legbinders", "Hobbleskirts", "Belts", "Ties"], Type: "Chained", Color: ["#675F50", "#171222", "#9B63C5"], Group: "ItemLegs", hobble: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.6, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, - maxwill: 0.8, enemyTags: {"obsidianRestraints":6, "obsidianCuffs":6}, playerTags: {"ItemLegsFull":-2}, minLevel: 7, allFloors: true, shrine: ["Metal", "Cuffs", "Obsidian", "Elements"]}, - {inventory: true, name: "ObsidianAnkleCuffs", debris: "Chains", accessible: true, Asset: "OrnateAnkleCuffs", LinkableBy: [...KDBindable], Link: "ObsidianAnkleCuffs2", Type: "Chained", Color: ["#675F50", "#171222", "#9B63C5"], Group: "ItemFeet", hobble: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.6, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, enemyTags: {"obsidianRestraints":6, "obsidianCuffs":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "AnkleCuffsBase", "Obsidian"], - maxwill: 1.0, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.2, subMult: 0.5, tags: ["lowwill"], noLeash: true}]}, - {name: "ObsidianAnkleCuffs2", debris: "Chains", accessible: true, Asset: "OrnateAnkleCuffs", LinkableBy: ["AnkleCuffsBase", ...KDBindable], UnLink: "ObsidianAnkleCuffs", Type: "Closed", Color: ["#675F50", "#171222", "#9B63C5"], Group: "ItemFeet", blockfeet: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.6, "Cut": -0.3, "Remove": 0.2, "Pick": 0.25}, enemyTags: {}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "Obsidian", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}]}, - {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "ObsidianArmCuffs", debris: "Chains", DefaultLock: "Purple", accessible: true, Asset: "OrnateCuffs", linkCategory: "Cuffs", linkSize: 0.55, LinkableBy: [...KDDevices, ...KDBindable], Link: "ObsidianArmCuffs2", Color: ["#171222", "#9B63C5"], Group: "ItemArms", bindarms: false, power: 9, weight: 0, - escapeChance: {"Struggle": -0.6, "Cut": -0.2, "Remove": 0.25, "Pick": 0.35}, enemyTags: {"obsidianRestraints":24, "obsidianCuffs":20}, playerTags: {"ItemArmsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Cuffs", "ArmCuffsBase", "Obsidian", "Elements"], - maxwill: 0.8, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "defeat", type: "linkItem", chance: 1.0}]}, - {name: "ObsidianArmCuffs2", debris: "Chains", accessible: true, Asset: "OrnateCuffs", Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Link: "ObsidianArmCuffs3", UnLink: "ObsidianArmCuffs", Color: ["#171222", "#9B63C5"], - Group: "ItemArms", bindarms: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.3, "Remove": 0.2, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Obsidian", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true}]}, - {name: "ObsidianArmCuffs3", debris: "Chains", accessible: true, Asset: "OrnateCuffs", Type: "Both", LinkableBy: [...KDElbowBind, ...KDBindable], UnLink: "ObsidianArmCuffs4", Color: ["#171222", "#9B63C5"], Group: "ItemArms", bindarms: true, power: 9, - weight: 0, strictness: 0.1, - escapeChance: {"Struggle": -0.2, "Cut": -0.3, "Remove": -0.1, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Obsidian", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true}]}, - {name: "ObsidianArmCuffs4", debris: "Chains", accessible: true, Asset: "OrnateCuffs", Type: "Elbow", LinkableBy: [...KDElbowBind, ...KDBindable], Link: "ObsidianArmCuffs3", UnLink: "ObsidianArmCuffs", Color: ["#171222", "#9B63C5"], - Group: "ItemArms", bindarms: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.3, "Remove": -0.15, "Pick": 0.25}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Obsidian", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.5, tags: ["lowwill"]}, {trigger: "beforeStruggleCalc", type: "elbowCuffsBlock", inheritLinked: true}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}]}, - {inventory: true, name: "ObsidianGag", debris: "Chains", gag: 0.75, Asset: "MuzzleGag", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Color: ["#1C1847", "#1C1847"], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 9, weight: -7, escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, - maxwill: 0.7, enemyTags: {"obsidianRestraints":8}, playerTags: {"ItemMouth3Full":-2, "ItemMouth2Full":2, "ItemMouth1Full":2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Gags", "Obsidian", "Elements", "FlatGags"]}, - {inventory: true, name: "ObsidianCollar", debris: "Chains", Asset: "OrnateCollar", Color: ["#171222", "#9B63C5"], Group: "ItemNeck", LinkableBy: [...KDCollarLink], power: 9, weight: -2, escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, - maxwill: 0.25, enemyTags: {"obsidianRestraints":4, "obsidianCuffs":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Collars", "Obsidian", "Elements", "HighCollars"], - unlimited: true, - events: [ - {trigger: "beforeStruggleCalc", type: "obsidianDebuff", power: 0.15, inheritLinked: true} - ]}, - //endregion - - //region CrystalCuffs - {inventory: true, name: "CrystalLegCuffs", debris: "Chains", accessible: true, Asset: "OrnateLegCuffs", LinkableBy: ["Legbinders", "Hobbleskirts", "Belts", "Ties"], Type: "Chained", Color: ["#675F50", "#a694cb", "#ff5277"], Group: "ItemLegs", hobble: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": 0.0, "Remove": 0.2, "Pick": 0.35}, - maxwill: 0.8, enemyTags: {"crystalRestraints":6}, playerTags: {"ItemLegsFull":-2}, minLevel: 7, - allFloors: true, shrine: ["Metal", "Cuffs", "Crystal", "Elements"], - events: [{trigger: "tick", type: "crystalDrain", power: -0.034, inheritLinked: true}, {trigger: "struggle", type: "crystalPunish"}]}, - {inventory: true, name: "CrystalAnkleCuffs", debris: "Chains", accessible: true, Asset: "OrnateAnkleCuffs", LinkableBy: [...KDBindable], Link: "CrystalAnkleCuffs2", Type: "Chained", Color: ["#675F50", "#a694cb", "#ff5277"], Group: "ItemFeet", hobble: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": 0, "Remove": 0.2, "Pick": 0.35}, enemyTags: {"crystalRestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "Crystal", "Elements", "AnkleCuffsBase"], - maxwill: 1.0, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.2, subMult: 0.5, tags: ["lowwill"], noLeash: true}, {trigger: "tick", type: "crystalDrain", power: -0.033, inheritLinked: true}, {trigger: "struggle", type: "crystalPunish"}]}, - {name: "CrystalAnkleCuffs2", debris: "Chains", accessible: true, Asset: "OrnateAnkleCuffs", LinkableBy: [...KDBindable], UnLink: "CrystalAnkleCuffs", Type: "Closed", Color: ["#675F50", "#a694cb", "#ff5277"], Group: "ItemFeet", blockfeet: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": -0.1, "Remove": 0.2, "Pick": 0.35}, enemyTags: {}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "Crystal", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "struggle", type: "crystalPunish"}, {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}]}, - {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "CrystalArmCuffs", debris: "Chains", accessible: true, Asset: "OrnateCuffs", linkCategory: "Cuffs", linkSize: 0.55, LinkableBy: [...KDDevices, ...KDBindable], Link: "CrystalArmCuffs2", Color: ["#a694cb", "#ff5277"], Group: "ItemArms", bindarms: false, power: 9, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": 0, "Remove": 0.25, "Pick": 0.45}, enemyTags: {"crystalRestraints":24}, playerTags: {"ItemArmsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Cuffs", "Crystal", "Elements", "ArmCuffsBase"], - maxwill: 0.6, events: [{trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "defeat", type: "linkItem", chance: 1.0}, {trigger: "tick", type: "crystalDrain", power: -0.034, inheritLinked: true}, {trigger: "struggle", type: "crystalPunish"}]}, - {name: "CrystalArmCuffs2", debris: "Chains", accessible: true, Asset: "OrnateCuffs", Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Link: "CrystalArmCuffs3", UnLink: "CrystalArmCuffs", Color: ["#a694cb", "#ff5277"], Group: "ItemArms", bindarms: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.15, "Cut": -0.1, "Remove": 0.2, "Pick": 0.35}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Crystal", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, {trigger: "struggle", type: "crystalPunish"}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true}]}, - {name: "CrystalArmCuffs3", debris: "Chains", accessible: true, Asset: "OrnateCuffs", Type: "Both", LinkableBy: [...KDElbowBind, ...KDBindable], UnLink: "CrystalArmCuffs4", Color: ["#a694cb", "#ff5277"], Group: "ItemArms", bindarms: true, power: 9, weight: 0, strictness: 0.1, - escapeChance: {"Struggle": -0.2, "Cut": -0.1, "Remove": -0.1, "Pick": 0.35}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Crystal", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "struggle", type: "crystalPunish"}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true}]}, - {name: "CrystalArmCuffs4", debris: "Chains", accessible: true, Asset: "OrnateCuffs", Type: "Elbow", LinkableBy: [...KDElbowBind, ...KDBindable], Link: "CrystalArmCuffs3", UnLink: "CrystalArmCuffs", Color: ["#a694cb", "#ff5277"], Group: "ItemArms", bindarms: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.15, "Cut": -0.1, "Remove": -0.15, "Pick": 0.35}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs", "Crystal", "Elements"], - events: [{trigger: "remove", type: "unlinkItem"}, {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.5, tags: ["lowwill"]}, {trigger: "struggle", type: "crystalPunish"}, {trigger: "beforeStruggleCalc", type: "elbowCuffsBlock", inheritLinked: true}, {trigger: "postRemoval", type: "RequireBaseArmCuffs"}]}, - //endregion - - - //region BanditCuffs - {inventory: true, name: "BanditLegCuffs", debris: "Chains", accessible: true, Asset: "OrnateLegCuffs", LinkableBy: ["Legbinders", "Hobbleskirts", "Belts", "Ties"], Type: "Chained", Color: ["#aaaaaa", "#f0b541", "#ff5277"], Group: "ItemLegs", hobble: true, power: 7, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": 0.2, "Pick": 0.35}, - maxwill: 0.8, enemyTags: {"banditMagicRestraints":6}, playerTags: {"ItemLegsFull":-2}, minLevel: 7, - allFloors: true, shrine: ["Metal", "Cuffs"], - events: [ - {trigger: "struggle", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, - {trigger: "playerAttack", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, - ]}, - {inventory: true, name: "BanditAnkleCuffs", debris: "Chains", accessible: true, Asset: "OrnateAnkleCuffs", LinkableBy: [...KDBindable], Link: "BanditAnkleCuffs2", Type: "Chained", Color: ["#675F50", "#f0b541", "#ff5277"], Group: "ItemFeet", hobble: true, power: 7, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": 0.2, "Pick": 0.35}, enemyTags: {"banditMagicRestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 2, allFloors: true, shrine: ["Metal", "Cuffs", "AnkleCuffsBase"], - maxwill: 1.0, events: [ - {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.2, subMult: 0.5, tags: ["lowwill"], noLeash: true}, - {trigger: "struggle", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, - {trigger: "playerAttack", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, - ]}, - {name: "BanditAnkleCuffs2", debris: "Chains", accessible: true, Asset: "OrnateAnkleCuffs", LinkableBy: [...KDBindable], UnLink: "BanditAnkleCuffs", Type: "Closed", Color: ["#675F50", "#f0b541", "#ff5277"], Group: "ItemFeet", blockfeet: true, power: 8, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": 0.2, "Pick": 0.35}, enemyTags: {}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs"], - events: [ - {trigger: "remove", type: "unlinkItem"}, - {trigger: "struggle", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, - {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"}]}, - {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "BanditArmCuffs", debris: "Chains", accessible: true, Asset: "OrnateCuffs", linkCategory: "Cuffs", linkSize: 0.55, LinkableBy: [...KDDevices, ...KDBindable], Link: "BanditArmCuffs2", Color: ["#f0b541", "#ff5277"], Group: "ItemArms", bindarms: false, power: 7, weight: 0, - escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": 0.25, "Pick": 0.45}, enemyTags: {"banditMagicRestraints":24}, playerTags: {"ItemArmsFull":-2}, minLevel: 2, allFloors: true, shrine: ["Metal", "Cuffs", "ArmCuffsBase"], - maxwill: 0.6, events: [ - {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.5, tags: ["lowwill"]}, - {trigger: "defeat", type: "linkItem", chance: 1.0}, - {trigger: "struggle", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, - {trigger: "playerAttack", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, - ]}, - {name: "BanditArmCuffs2", debris: "Chains", accessible: true, Asset: "OrnateCuffs", Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Link: "BanditArmCuffs3", UnLink: "BanditArmCuffs", Color: ["#f0b541", "#ff5277"], Group: "ItemArms", bindarms: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.15, "Cut": -0.15, "Remove": 0.2, "Pick": 0.35}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs"], - events: [ - {trigger: "remove", type: "unlinkItem"}, - {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.33, tags: ["lowwill"]}, - {trigger: "struggle", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, - {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, - {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true}]}, - {name: "BanditArmCuffs3", debris: "Chains", accessible: true, Asset: "OrnateCuffs", Type: "Both", LinkableBy: [...KDElbowBind, ...KDBindable], UnLink: "BanditArmCuffs4", Color: ["#f0b541", "#ff5277"], Group: "ItemArms", bindarms: true, power: 9, weight: 0, strictness: 0.1, - escapeChance: {"Struggle": -0.2, "Cut": -0.15, "Remove": -0.1, "Pick": 0.35}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs"], - events: [ - {trigger: "remove", type: "unlinkItem"}, - {trigger: "struggle", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, - {trigger: "postRemoval", type: "RequireBaseArmCuffs"}, - {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true}]}, - {name: "BanditArmCuffs4", debris: "Chains", accessible: true, Asset: "OrnateCuffs", Type: "Elbow", LinkableBy: [...KDElbowBind, ...KDBindable], Link: "BanditArmCuffs3", UnLink: "BanditArmCuffs", Color: ["#f0b541", "#ff5277"], Group: "ItemArms", bindarms: true, power: 9, weight: 0, - escapeChance: {"Struggle": -0.15, "Cut": -0.15, "Remove": -0.15, "Pick": 0.35}, helpChance: {"Remove": 0.4}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Metal", "Cuffs"], - events: [ - {trigger: "remove", type: "unlinkItem"}, - {trigger: "hit", type: "linkItem", sfx: "LightJingle", chance: 0.5, tags: ["lowwill"]}, - {trigger: "struggle", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, - {trigger: "beforeStruggleCalc", type: "elbowCuffsBlock", inheritLinked: true}, - {trigger: "postRemoval", type: "RequireBaseArmCuffs"}]}, - //endregion - - {unlimited: true, removePrison: true, name: "IceArms", debris: "Ice", sfx: "Freeze", Asset: "Ribbons", LinkableBy: ["Armbinders", "Wrapping"], Type: "Heavy", Color: "#5DA9E5", Group: "ItemArms", bindarms: true, power: 4, weight: 0, magic: true, escapeChance: {"Struggle": 0.15, "Cut": 0.05, "Remove": 0}, enemyTags: {"iceRestraints":4}, playerTags: {"ItemArmsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Ties", "Ice", "Elements"], - maxwill: 0.8, events: [{trigger: "tick", type: "iceDrain", power: -0.025, inheritLinked: true}]}, - {unlimited: true, removePrison: true, name: "IceLegs", debris: "Ice", sfx: "Freeze", Asset: "Ribbons", LinkableBy: ["Legbinders", "Hobbleskirts", "Wrapping"], Type: "MessyWrap", Color: "#5DA9E5", Group: "ItemLegs", hobble: true, power: 4, weight: 0, magic: true, escapeChance: {"Struggle": 0.15, "Cut": 0.05, "Remove": 0}, enemyTags: {"iceRestraints":4}, playerTags: {"ItemLegsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Ties", "Ice", "Elements"], - events: [{trigger: "tick", type: "iceDrain", power: -0.025, inheritLinked: true}]}, - {unlimited: true, removePrison: true, name: "IceHarness", debris: "Ice", sfx: "Freeze", Asset: "Ribbons", Type: "Harness2", Color: "#5DA9E5", Group: "ItemTorso", power: 1, weight: 0, magic: true, escapeChance: {"Struggle": 0.15, "Cut": 0.05, "Remove": 0}, enemyTags: {"iceRestraints":4}, playerTags: {"ItemTorsoFull":-2}, minLevel: 0, allFloors: true, shrine: ["Ties", "Ice", "Elements"], - events: [{trigger: "tick", type: "iceDrain", power: -0.025, inheritLinked: true}]}, - {unlimited: true, removePrison: true, name: "IceGag", debris: "Ice", gag: 0.35, sfx: "Freeze", Asset: "Ribbons", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Color: "#5DA9E5", Group: "ItemMouth", power: 4, weight: 0, magic: true, escapeChance: {"Struggle": 0.15, "Cut": 0.05, "Remove": 0}, enemyTags: {"iceRestraints":4}, playerTags: {"ItemMouthFull":-2}, minLevel: 0, allFloors: true, shrine: ["Wrapping", "Ice", "Elements"], - maxwill: 0.7, events: [{trigger: "tick", type: "iceDrain", power: -0.025, inheritLinked: true}]}, - - {removePrison: true, name: "CableArms", debris: "Chains", sfx: "FutureLock", Asset: "NylonRope", changeRenderType: {"ArmBind": "WristElbowHarnessTie"}, - LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Color: ["#333333"], Group: "ItemArms", bindarms: true, power: 6, weight: 0, magic: false, - escapeChance: {"Struggle": 0.1, "Cut": 0.00, "Remove": 0.25, "Pick": 0.3}, - maxwill: 0.8, enemyTags: {"hitechCables":4}, playerTags: {"ItemArmsFull":-2}, minLevel: 6, allFloors: true, shrine: ["Metal", "Ties"]}, - {renderWhenLinked: [...KDLegRopesRender], removePrison: true, name: "CableLegs", debris: "Chains", sfx: "FutureLock", Asset: "NylonRope", Type: "KneesThighs", LinkableBy: [...KDLegRopesBind], Color: ["#333333", "#333333"], Group: "ItemLegs", hobble: true, power: 6, weight: 0, magic: false, - escapeChance: {"Struggle": 0.1, "Cut": 0.0, "Remove": 0.25, "Pick": 0.3}, enemyTags: {"hitechCables":4}, playerTags: {"ItemLegsFull":-2}, minLevel: 6, allFloors: true, shrine: ["Metal", "Ties"]}, - {renderWhenLinked: ["HeavyCorsets"], removePrison: true, name: "CableHarness", sfx: "FutureLock", Asset: "NylonRopeHarness", OverridePriority: 27, Color: ["#333333", "#333333"], Type: "Harness", Group: "ItemTorso", power: 2, strictness: 0.05, weight: 0, magic: false, - escapeChance: {"Struggle": 0.1, "Cut": 0.0, "Remove": 0.25, "Pick": 0.3}, enemyTags: {"hitechCables":4}, playerTags: {"ItemTorsoFull":-2}, minLevel: 6, allFloors: true, shrine: ["Metal", "Ties"]}, - - {removePrison: true, name: "NylonCableArms", debris: "Chains", sfx: "FutureLock", Asset: "NylonRope", changeRenderType: {"ArmBind": "WristElbowHarnessTie"}, maxLevel: 6, - LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Color: ["#222222"], Group: "ItemArms", bindarms: true, power: 6, weight: 0, magic: false, - escapeChance: {"Struggle": 0.12, "Cut": 0.2, "Remove": 0.3, "Pick": 0.35}, - maxwill: 0.8, enemyTags: {"hitechCables":4}, playerTags: {"ItemArmsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Ties"]}, - {renderWhenLinked: [...KDLegRopesRender], removePrison: true, name: "NylonCableLegs", debris: "Chains", sfx: "FutureLock", Asset: "NylonRope", Type: "KneesThighs", maxLevel: 6, - LinkableBy: [...KDLegRopesBind],Color: ["#222222", "#222222"], Group: "ItemLegs", hobble: true, power: 6, weight: 0, magic: false, - escapeChance: {"Struggle": 0.12, "Cut": 0.2, "Remove": 0.3, "Pick": 0.35}, enemyTags: {"hitechCables":4}, playerTags: {"ItemLegsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Ties"]}, - {renderWhenLinked: ["HeavyCorsets"], removePrison: true, name: "NylonCableHarness", sfx: "FutureLock", Asset: "NylonRopeHarness", OverridePriority: 27, maxLevel: 6, - Color: ["#222222", "#222222"], Type: "Harness", Group: "ItemTorso", power: 2, strictness: 0.05, weight: 0, magic: false, - escapeChance: {"Struggle": 0.12, "Cut": 0.2, "Remove": 0.3, "Pick": 0.35}, enemyTags: {"hitechCables":4}, playerTags: {"ItemTorsoFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Ties"]}, - - //region Ribbon - {unlimited: true, inventory: true, removePrison: true, name: "RibbonArms", debris: "Fabric", sfx: "MagicSlash", Asset: "Ribbons", Color: "#a583ff", Group: "ItemArms", bindarms: true, power: 6, weight: 0, magic: true, - escapeChance: {"Struggle": 0.15, "Cut": 0.3, "Remove": 0.2,}, struggleMaxSpeed: {"Remove": 0.15}, struggleMinSpeed: {"Struggle": 0.1}, - affinity: {Remove: ["Hook"],}, - maxwill: 0.8, enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, playerTags: {"ItemArmsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure", "Ribbons"]}, - {unlimited: true, inventory: true, removePrison: true, name: "RibbonLegs", debris: "Fabric", sfx: "MagicSlash", Asset: "DuctTape", Color: "#a583ff", Group: "ItemLegs", hobble: true, power: 7, weight: 0, magic: true, - affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, - escapeChance: {"Struggle": 0.07, "Cut": 0.3, "Remove": 0.15}, enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, struggleMaxSpeed: {"Remove": 0.15}, playerTags: {"ItemLegsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure", "Ribbons"]}, - {unlimited: true, inventory: true, removePrison: true, name: "RibbonFeet", debris: "Fabric", sfx: "MagicSlash", Asset: "DuctTape", Color: "#a583ff", Group: "ItemFeet", blockfeet: true, power: 7, weight: 0, magic: true, - affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, - escapeChance: {"Struggle": 0.07, "Cut": 0.3, "Remove": 0.15}, enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, struggleMaxSpeed: {"Remove": 0.15}, playerTags: {"ItemLegsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure", "Ribbons"]}, - {unlimited: true, inventory: true, removePrison: true, name: "RibbonHarness", debris: "Fabric", sfx: "MagicSlash", Asset: "Ribbons", Type: "Harness2", Color: "#a583ff", Group: "ItemTorso", power: 6, strictness: 0.05, weight: 0, magic: true, - affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, - escapeChance: {"Struggle": 0.07, "Cut": 0.3, "Remove": 0.15}, struggleMaxSpeed: {"Remove": 0.15}, enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, playerTags: {"ItemTorsoFull":-2}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure", "Ribbons"]}, - {unlimited: true, inventory: true, removePrison: true, name: "RibbonCrotch", debris: "Fabric", sfx: "MagicSlash", Asset: "Ribbons", Color: "#a583ff", Group: "ItemPelvis", power: 5, crotchrope: true, strictness: 0.15, weight: 0, magic: true, - affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, - escapeChance: {"Struggle": 0.15, "Cut": 0.35, "Remove": 0.25}, struggleMaxSpeed: {"Remove": 0.2}, enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, playerTags: {"ItemTorsoFull":-2}, minLevel: 0, - allFloors: true, shrine: ["Rope", "Ties", "Conjure", "Ribbons"], events: [{trigger: "struggle", type: "crotchrope"}]}, - {unlimited: true, inventory: true, name: "RibbonHands", Asset: "DuctTape", debris: "Fabric", Color: "#a583ff", LinkableBy: ["Mittens"], Group: "ItemHands", bindhands: 0.7, power: 5, weight: 0, magic: true, - affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, - escapeChance: {"Struggle": 0, "Cut": 0.4, "Remove": 0.5}, struggleMaxSpeed: {"Remove": 0.1}, - maxwill: 0.3, enemyTags: {"magicRibbonsHarsh":1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Conjure", "Ribbons"]}, - {unlimited: true, inventory: true, name: "RibbonMouth", Asset: "DuctTape", debris: "Fabric", Color: "#9573ef", Type: "Cover", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Group: "ItemMouth", AssetGroup: "ItemMouth2", gag: 0.5, power: 5, weight: 0, magic: true, escapeChance: {"Struggle": 0.0, "Cut": 0.4, "Remove": 0.4}, struggleMaxSpeed: {"Remove": 0.15}, - affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, - enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, playerTags: {"ItemMouth1Full":8}, minLevel: 0, allFloors: true, shrine: ["Rope", "Wrapping", "Conjure", "Ribbons"]}, - //endregion - - {inventory: true, name: "CableGag", Asset: "DeepthroatGag", debris: "Belts", gag: 1.0, sfx: "FutureLock", Color: "Default", LinkableBy: [...KDPlugGagLink], renderWhenLinked: [...KDPlugGagLink], Group: "ItemMouth", power: 5, weight: 2, escapeChance: {"Struggle": -0.12, "Cut": 0.0, "Remove": 0.5, "Pick": 0.3}, - maxwill: 0.6, enemyTags: {"cableGag":3}, playerTags: {}, minLevel: 6, allFloors: true, shrine: ["Metal", "Gags", "PlugGags"]}, - {inventory: true, name: "NylonCableGag", Asset: "DeepthroatGag", debris: "Belts", gag: 0.8, sfx: "FutureLock", Color: "#222222", LinkableBy: [...KDPlugGagLink], renderWhenLinked: [...KDPlugGagLink], Group: "ItemMouth", power: 5, weight: 2, escapeChance: {"Struggle": -0.07, "Cut": 0.2, "Remove": 0.5, "Pick": 0.35}, - maxwill: 0.6, enemyTags: {"cableGag":3}, playerTags: {}, minLevel: 0, maxLevel: 6, allFloors: true, shrine: ["Metal", "Gags", "PlugGags"]}, - - //region RopeSnake - {unlimited: true, renderWhenLinked: ["Boxbinders"], changeRenderType: {"ArmBind": "WristElbowHarnessTie"}, inventory: true, name: "RopeSnakeArms", debris: "Ropes", accessible: true, factionColor: [[], [0]], - Asset: "HempRope", Color: "Default", LinkableBy: ["Boxbinders", "Wrapping"], Group: "ItemArms", bindarms: true, power: 1.5, weight: 0, escapeChance: {"Struggle": 0.25, "Cut": 0.45, "Remove": 0.1}, - affinity: {Remove: ["Hook"],}, - maxwill: 0.7, enemyTags: {"ropeRestraints":4}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties"]}, - {unlimited: true, inventory: true, name: "RopeSnakeCuffs", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "RopeCuffs", Color: "Default", linkCategory: "Cuffs", linkSize: 0.33, - LinkableBy: ["Boxbinders", "Armbinders", ...KDBindable, "Cuffs"], Group: "ItemArms", bindarms: true, power: 1, weight: 0, escapeChance: {"Struggle": 0.4, "Cut": 0.67, "Remove": 0.3}, - affinity: {Remove: ["Hook"],}, - maxwill: 1.0, enemyTags: {"ropeRestraints":8}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Cuffs"]}, - {unlimited: true, inventory: true, name: "RopeSnakeCuffsAdv", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "RopeCuffs", Color: "Default", linkCategory: "Cuffs", linkSize: 0.51, - LinkableBy: ["Boxbinders", "Armbinders", ...KDBindable, "Cuffs"], Group: "ItemArms", bindarms: true, power: 1, weight: 0, escapeChance: {"Struggle": 0.25, "Cut": 0.67, "Remove": 0.2}, - affinity: {Remove: ["Hook"],}, strictness: 0.05, strictnessZones: ["ItemHands"], - maxwill: 1.0, enemyTags: {"ropeRestraints":8}, playerTags: {"ItemArmsFull":-1}, minLevel: 5, allFloors: true, shrine: ["Rope", "Cuffs"]}, - {unlimited: true, renderWhenLinked: ["Armbinders", "Belts"], inventory: true, name: "RopeSnakeArmsWrist", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "WristElbowHarnessTie", - LinkableBy: ["Armbinders", "Wrapping", "Belts"], Color: "Default", Group: "ItemArms", bindarms: true, power: 1.5, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.45, "Remove": 0.2}, - affinity: {Remove: ["Hook"],}, - maxwill: 0.7, enemyTags: {"ropeRestraintsWrist":4}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties"]}, - {unlimited: true, inventory: false, name: "RopeSnakeHogtie", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "Hogtied", Color: "Default", Group: "ItemArms", bindarms: true, power: 6, weight: 0, - escapeChance: {"Struggle": 0.05, "Cut": 0.15, "Remove": 0.0}, affinity: {Remove: ["Hook"],}, - maxwill: 0.25, enemyTags: {"ropeRestraintsHogtie":12}, playerTags: {}, minLevel: 2, allFloors: true, shrine: ["Rope", "Ties", "Hogties"], - events: [{trigger: "postRemoval", type: "replaceItem", list: ["RopeSnakeArmsWrist"], power: 6}] - }, - {unlimited: true, renderWhenLinked: ["Wrapping", "Belts"], inventory: true, name: "RopeSnakeFeet", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Color: "Default", LinkableBy: ["Wrapping", "Belts"], Group: "ItemFeet", blockfeet: true, power: 1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.5, "Remove": 0.15}, - affinity: {Remove: ["Hook"],}, - maxwill: 1.0, enemyTags: {"ropeRestraints":4}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties"]}, - {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "RopeSnakeLegs", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "FullBinding", LinkableBy: [...KDLegRopesBind], Color: "Default", Group: "ItemLegs", hobble: true, power: 1, weight: 0, escapeChance: {"Struggle": 0.25, "Cut": 0.45, "Remove": 0.15}, - affinity: {Remove: ["Hook"],}, - maxwill: 0.6, enemyTags: {"ropeRestraints":4}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties"]}, - {unlimited: true, renderWhenLinked: ["Harnesses", "HeavyCorsets"], inventory: true, name: "RopeSnakeTorso", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRopeHarness", Type: "Waist", Color: "Default", Group: "ItemTorso", power: 1, weight: 0, harness: true, escapeChance: {"Struggle": 0.1, "Cut": 0.67, "Remove": 0.3}, - affinity: {Remove: ["Hook"],}, - maxwill: 0.9, enemyTags: {"ropeRestraints2":4}, playerTags: {"ItemTorsoFull":-3}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties"]}, - {unlimited: true, renderWhenLinked: ["Harnesses", "HeavyCorsets"], inventory: true, name: "RopeSnakeHarness", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRopeHarness", Type: "Star", strictness: 0.1, OverridePriority: 26, Color: "Default", Group: "ItemTorso", power: 2, weight: 0, harness: true, escapeChance: {"Struggle": 0.1, "Cut": 0.67, "Remove": 0.3}, - affinity: {Remove: ["Hook"],}, - maxwill: 0.75, enemyTags: {"ropeRestraints2":1}, playerTags: {"ItemTorsoFull":5}, minLevel: 3, allFloors: true, shrine: ["Rope", "Ties", "Harnesses"]}, - {unlimited: true, renderWhenLinked: ["ChastityBelts"], inventory: true, name: "RopeSnakeCrotch", debris: "Ropes", accessible: true, factionColor: [[], [0]], crotchrope: true, strictness: 0.15, Asset: "HempRope", Type: "OverPanties", LinkableBy: ["ChastityBelts"], OverridePriority: 26, Color: "Default", Group: "ItemPelvis", power: 1, weight: 0, - affinity: {Remove: ["Hook"],}, - maxwill: 0.75, escapeChance: {"Struggle": 0.1, "Cut": 0.67, "Remove": 0.15}, enemyTags: {"ropeRestraints2":4}, playerTags: {"ItemPelvisFull":-3}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties"], - events: [{trigger: "struggle", type: "crotchrope"}]}, - //endregion - - //region CelestialRope - {unlimited: true, renderWhenLinked: ["Boxbinders"], debris: "Steam", changeRenderType: {"ArmBind": "WristElbowHarnessTie"}, inventory: true, name: "CelestialRopeArms", accessible: true, Asset: "HempRope", Color: ["#aaaa67"], LinkableBy: ["Boxbinders", "Wrapping"], Group: "ItemArms", bindarms: true, power: 2, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": 0.3, "Remove": 0.1}, - affinity: {Remove: ["Hook"],}, - maxwill: 0.7, enemyTags: {"celestialRopes":4}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Holy", "Will"], - failSuffix: {"Remove": "MagicRope"}, events: [{trigger: "struggle", type: "celestialRopePunish"}]}, - {unlimited: true, inventory: true, name: "CelestialRopeCuffs", debris: "Steam", accessible: true, Asset: "HempRope", Type: "RopeCuffs", Color: ["#ffff90"], linkCategory: "Cuffs", linkSize: 0.33, LinkableBy: ["Boxbinders", "Armbinders", ...KDBindable, "Cuffs"], Group: "ItemArms", bindarms: true, power: 1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.4, "Remove": 0.3}, - affinity: {Remove: ["Hook"],}, - maxwill: 1.0, enemyTags: {"celestialRopes":8}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Cuffs", "Holy", "Will"], - failSuffix: {"Remove": "MagicRope"}, events: [{trigger: "struggle", type: "celestialRopePunish"}]}, - {unlimited: true, inventory: true, name: "CelestialRopeCuffsAdv", debris: "Steam", accessible: true, Asset: "HempRope", Type: "RopeCuffs", Color: ["#ffff90"], linkCategory: "Cuffs", linkSize: 0.51, LinkableBy: ["Boxbinders", "Armbinders", ...KDBindable, "Cuffs"], Group: "ItemArms", bindarms: true, power: 1, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": 0.4, "Remove": 0.2}, - affinity: {Remove: ["Hook"],}, strictness: 0.1, strictnessZones: ["ItemHands"], - maxwill: 1.0, enemyTags: {"celestialRopes":10}, playerTags: {"ItemArmsFull":-1}, minLevel: 7, allFloors: true, shrine: ["Rope", "Cuffs", "Holy", "Will"], - failSuffix: {"Remove": "MagicRope"}, events: [{trigger: "struggle", type: "celestialRopePunish"}]}, - {unlimited: true, inventory: true, name: "CelestialRopeFeet", debris: "Steam", accessible: true, Asset: "NylonRope", Color: ["#aaaa67", "#aaaa67"], LinkableBy: ["Wrapping"], Group: "ItemFeet", blockfeet: true, power: 1, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": 0.3, "Remove": 0.15}, - affinity: {Remove: ["Hook"],}, - maxwill: 1.0, enemyTags: {"celestialRopes":4}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Holy", "Will"], - failSuffix: {"Remove": "MagicRope"}, events: [{trigger: "struggle", type: "celestialRopePunish"}]}, - {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "CelestialRopeLegs", debris: "Steam", accessible: true, Asset: "NylonRope", LinkableBy: [...KDLegRopesBind], Color: ["#aaaa67", "#aaaa67"], Group: "ItemLegs", hobble: true, power: 1, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": 0.35, "Remove": 0.15}, - affinity: {Remove: ["Hook"],}, - maxwill: 0.6, enemyTags: {"celestialRopes":4}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Holy", "Will"], - failSuffix: {"Remove": "MagicRope"}, events: [{trigger: "struggle", type: "celestialRopePunish"}]}, - {unlimited: true, inventory: true, name: "CelestialRopeTorso", debris: "Steam", accessible: true, OverridePriority: 27, Asset: "NylonRopeHarness", Type: "Harness", Color: ["#aaaa67", "#aaaa67"], Group: "ItemTorso", power: 1, weight: 0, harness: true, escapeChance: {"Struggle": 0.1, "Cut": 0.3, "Remove": 0.1}, - affinity: {Remove: ["Hook"],}, - maxwill: 0.9, enemyTags: {"celestialRopes":4}, playerTags: {"ItemTorsoFull":-3}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Holy", "Will"], - failSuffix: {"Remove": "MagicRope"}, events: [{trigger: "struggle", type: "celestialRopePunish"}]}, - {unlimited: true, inventory: true, name: "CelestialRopeCrotch", debris: "Steam", accessible: true, crotchrope: true, strictness: 0.15, Asset: "HempRope", Type: "OverPanties", OverridePriority: 26, Color: ["#ffff90", "#aaaa67"], Group: "ItemPelvis", power: 1, weight: 0, - affinity: {Remove: ["Hook"],}, - maxwill: 0.75, escapeChance: {"Struggle": 0.1, "Cut": 0.35, "Remove": 0.15}, enemyTags: {"celestialRopes":4}, playerTags: {"ItemPelvisFull":-3}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Holy", "Will"], - failSuffix: {"Remove": "MagicRope"}, events: [{trigger: "struggle", type: "celestialRopePunish"}, {trigger: "struggle", type: "crotchrope"}]}, - //endregion - - //region VinePlant - {unlimited: true, removePrison: true, name: "VinePlantArms", accessible: true, Asset: "NylonRope", Color: ["#006722", "#006722"], Group: "ItemArms", debris: "Vines", - affinity: {Remove: ["Hook"],}, - bindarms: true, power: 0.1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.8, "Remove": 0.2}, enemyTags: {"vineRestraints":4}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Vines", "Will"]}, - {unlimited: true, removePrison: true, name: "VinePlantFeet", accessible: true, Asset: "NylonRope", Color: ["#006722", "#006722"], Group: "ItemFeet", debris: "Vines", - affinity: {Remove: ["Hook"],}, - blockfeet: true, power: 0.1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.8, "Remove": 0.2}, enemyTags: {"vineRestraints":4}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Vines", "Will"]}, - {unlimited: true, removePrison: true, name: "VinePlantLegs", accessible: true, Asset: "NylonRope", Color: ["#006722", "#006722"], Group: "ItemLegs", debris: "Vines", - affinity: {Remove: ["Hook"],}, - hobble: true, power: 0.1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.8, "Remove": 0.2}, enemyTags: {"vineRestraints":4}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Vines", "Will"]}, - {unlimited: true, removePrison: true, name: "VinePlantTorso", accessible: true, Asset: "NylonRopeHarness", Type: "Diamond", OverridePriority: 26, Color: ["#006722", "#006722"], Group: "ItemTorso", debris: "Vines", - affinity: {Remove: ["Hook"],}, - harness: true, power: 0.1, weight: 0, strictness: 0.05, escapeChance: {"Struggle": 0.3, "Cut": 0.8, "Remove": 0.2}, enemyTags: {"vineRestraints":4}, playerTags: {"ItemTorsoFull":-3}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Vines", "Will"]}, - //endregion - - //region Chain - {inventory: true, name: "ChainArms", debris: "Chains", accessible: true, sfx: "Chain", Asset: "Chains", Type: "WristElbowHarnessTie", LinkableBy: ["Armbinders", "Wrapping"], Color: "Default", Group: "ItemArms", bindarms: true, power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": -0.1, "Remove": 0.3, "Pick": 1.5}, - maxwill: 0.8, enemyTags: {"chainRestraints":2}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal"]}, - {inventory: true, name: "ChainLegs", debris: "Chains", accessible: true, sfx: "Chain", Asset: "Chains", Type: "Strict", Color: "Default", LinkableBy: ["Legbinders", "Hobbleskirts"], Group: "ItemLegs", hobble: true, power: 5, weight: 0, escapeChance: {"Struggle": 0.15, "Cut": -0.1, "Remove": 0.3, "Pick": 1.5}, enemyTags: {"chainRestraints":2}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal"]}, - {inventory: true, name: "ChainFeet", debris: "Chains", accessible: true, sfx: "Chain", Asset: "Chains", Color: "Default", LinkableBy: ["Wrapping", "Belts"], Group: "ItemFeet", blockfeet: true, power: 5, weight: 0, escapeChance: {"Struggle": 0.03, "Cut": -0.1, "Remove": 0.3, "Pick": 1.5}, enemyTags: {"chainRestraints":2}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal"]}, - {inventory: true, name: "ChainCrotch", debris: "Chains", accessible: true, sfx: "Chain", Asset: "CrotchChain", crotchrope: true, strictness: 0.15, strictnessZones: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], OverridePriority: 26, Color: "Default", Group: "ItemTorso", power: 3, weight: 0, harness: true, escapeChance: {"Struggle": 0.03, "Cut": -0.1, "Remove": 0.3, "Pick": 1.5}, enemyTags: {"chainRestraints":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal"]}, - //endregion - - //region MagicChain - {unlimited: true, inventory: true, removePrison: true, sfx: "Chain", name: "MagicChainArms", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Armbinders", "Wrapping"], Type: "WristElbowHarnessTie", Color: "#aa00aa", Group: "ItemArms", bindarms: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": -0.1, "Remove": -0.05}, - failSuffix: {"Remove": "MagicChain"}, maxwill: 0.9, enemyTags: {"chainRestraintsMagic":2}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Conjure"]}, - {unlimited: true, inventory: true, removePrison: true, sfx: "Chain", name: "MagicChainLegs", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Legbinders", "Hobbleskirts"], Type: "Strict", Color: "#aa00aa", Group: "ItemLegs", hobble: true, power: 4, weight: 0, - failSuffix: {"Remove": "MagicChain"}, escapeChance: {"Struggle": 0.3, "Cut": -0.1, "Remove": -0.05}, enemyTags: {"chainRestraintsMagic":2}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Conjure"]}, - {unlimited: true, inventory: true, removePrison: true, sfx: "Chain", name: "MagicChainFeet", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Wrapping"], Color: "#aa00aa", Group: "ItemFeet", blockfeet: true, power: 4, weight: 0, - failSuffix: {"Remove": "MagicChain"}, escapeChance: {"Struggle": 0.2, "Cut": -0.1, "Remove": -0.05}, enemyTags: {"chainRestraintsMagic":2}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Conjure"]}, - {unlimited: true, inventory: true, removePrison: true, sfx: "Chain", name: "MagicChainCrotch", debris: "Chains", accessible: true, crotchrope: true, strictness: 0.15, strictnessZones: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Asset: "CrotchChain", OverridePriority: 26, Color: "#aa00aa", Group: "ItemTorso", power: 2, weight: 0, - failSuffix: {"Remove": "MagicChain"}, escapeChance: {"Struggle": 0.2, "Cut": -0.1, "Remove": -0.05}, enemyTags: {"chainRestraintsMagic":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Conjure"], - events: [{trigger: "struggle", type: "crotchrope"}]}, - //endregion - - //region ShadowChain - {unlimited: true, removePrison: true, sfx: "Chain", name: "ShadowChainArms", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Boxbinders", "Wrapping"], Type: "BoxTie", Color: "#000000", Group: "ItemArms", bindarms: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": -0.1, "Remove": -0.1}, - maxwill: 0.9, enemyTags: {"shadowRestraints":2}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion"]}, - {unlimited: true, removePrison: true, sfx: "Chain", name: "ShadowChainLegs", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Legbinders", "Hobbleskirts"], Type: "Strict", Color: "#000000", Group: "ItemLegs", hobble: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": -0.1, "Remove": -0.1}, enemyTags: {"shadowRestraints":2}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion"]}, - {unlimited: true, removePrison: true, sfx: "Chain", name: "ShadowChainFeet", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Wrapping"], Color: "#000000", Group: "ItemFeet", blockfeet: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": -0.1, "Remove": -0.1}, enemyTags: {"shadowRestraints":2}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion"]}, - {unlimited: true, removePrison: true, sfx: "Chain", name: "ShadowChainCrotch", debris: "Chains", accessible: true, crotchrope: true, strictness: 0.15, strictnessZones: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Asset: "CrotchChain", OverridePriority: 26, Color: "#000000", Group: "ItemTorso", power: 2, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": -0.1, "Remove": -0.1}, enemyTags: {"shadowRestraints":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion"], - events: [{trigger: "struggle", type: "crotchrope"}]}, - //endregion - - //region GhostChain - {unlimited: true, removePrison: true, sfx: "Chain", name: "GhostChainArms", accessible: true, Asset: "Chains", LinkableBy: ["Boxbinders", "Wrapping"], Type: "BoxTie", Color: "#cccccc", Group: "ItemArms", bindarms: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.2, "Remove": 0.1}, - maxwill: 0.9, enemyTags: {"ghostRestraints":2}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion"]}, - {unlimited: true, removePrison: true, sfx: "Chain", name: "GhostChainLegs", accessible: true, Asset: "Chains", LinkableBy: ["Legbinders", "Hobbleskirts"], Type: "Strict", Color: "#cccccc", Group: "ItemLegs", hobble: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.2, "Remove": 0.1}, enemyTags: {"ghostRestraints":2}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion"]}, - {unlimited: true, removePrison: true, sfx: "Chain", name: "GhostChainFeet", accessible: true, Asset: "Chains", LinkableBy: ["Wrapping"], Color: "#cccccc", Group: "ItemFeet", blockfeet: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.2, "Remove": 0.1}, enemyTags: {"ghostRestraints":2}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion"]}, - {unlimited: true, removePrison: true, sfx: "Chain", name: "GhostChainCrotch", accessible: true, crotchrope: true, strictness: 0.15, strictnessZones: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Asset: "CrotchChain", OverridePriority: 26, Color: "#cccccc", Group: "ItemTorso", power: 2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.2, "Remove": 0.1}, enemyTags: {"ghostRestraints":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion"], - events: [{trigger: "struggle", type: "crotchrope"}]}, - //endregion - - {removePrison: true, divine: true, name: "DivineCuffs", accessible: true, Asset: "FuturisticCuffs", LinkableBy: ["Boxbinders", "Armbinders", ...KDBindable], DefaultLock: "Gold", Type: "Wrist", Color: ['#6AB0ED', '#AE915C', '#FFFFFF'], Group: "ItemArms", bindarms: true, power: 50, weight: 0, - specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": -99}, enemyTags: {"divineRestraints":2}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Metal", "Latex", "Leather"]}, - {removePrison: true, divine: true, name: "DivineAnkleCuffs", accessible: true, Asset: "FuturisticAnkleCuffs", LinkableBy: [...KDBindable], DefaultLock: "Gold", Color: ['#AE915C', '#71D2EE', '#AE915C', '#000000'], Group: "ItemFeet", Type: "Closed", blockfeet: true, power: 50, weight: 0, - specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": -99}, enemyTags: {"divineRestraints":2}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Metal", "Latex", "Leather"]}, - {removePrison: true, divine: true, name: "DivineMuzzle", accessible: true, gag: 1.0, Asset: "FuturisticMuzzle", Modules: [0, 1, 1], LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Color: ['#AE915C', '#AE915C', '#CAA562', '#5FBEE8'], DefaultLock: "Gold", Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 30, weight: 0, - specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": -99}, enemyTags: {"divineRestraints":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Metal", "Latex", "Leather"]}, - - {inventory: true, name: "BasicCollar", debris: "Belts", linkCategory: "BasicCollar", accessible: true, Asset: "LeatherCollar", Color: ["#000000", "Default"], Group: "ItemNeck", LinkableBy: [...KDCollarLink], power: 1, weight: 0, escapeChance: {"Struggle": -0.2, "Cut": 0.15, "Remove": 0.5, "Pick": 0.1}, - maxwill: 0.25, - unlimited: true, enemyTags: {"leashing":0.001, "maidCollar":-1, "dragonRestraints":-1, "mithrilRestraints": -1}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, maxLevel: 3, allFloors: true, shrine: ["Collars", "Leather"]}, - {inventory: true, name: "SteelCollar", linkCategory: "BasicCollar", accessible: true, Asset: "SlenderSteelCollar", Color: ["Default"], Group: "ItemNeck", LinkableBy: [...KDCollarLink], power: 3, weight: 0, escapeChance: {"Struggle": -0.5, "Cut": -0.4, "Remove": 0.5, "Pick": 0.05}, - maxwill: 0.25, - unlimited: true, enemyTags: {"leashing":0.001, "maidCollar":-1, "dragonRestraints":-1, "mithrilRestraints": -1}, playerTags: {"ItemNeckFull":-2, "Unchained": -1, "Damsel": 1}, minLevel: 2, allFloors: true, shrine: ["Collars", "Metal"]}, - {inventory: true, name: "MagicCollar", debris: "Belts", linkCategory: "BasicCollar", accessible: true, Asset: "LeatherCollar", Color: ["#000000", "#6E5B38"], Group: "ItemNeck", LinkableBy: [...KDCollarLink], power: 2, weight: 0, magic: true, escapeChance: {"Struggle": -0.5, "Cut": -0.1, "Remove": 0.25, "Pick": 0.05}, - maxwill: 0.25, - unlimited: true, enemyTags: {"leashing":0.001, "maidCollar":-1, "dragonRestraints":-1, "mithrilRestraints": -1}, playerTags: {"ItemNeckFull":-2, "Damsel": -1}, minLevel: 2, allFloors: true, shrine: ["Collars", "Conjure"]}, - {inventory: true, name: "KittyCollar", debris: "Belts", linkCategory: "BasicCollar", accessible: true, Asset: "LeatherCollarBell", Color: ["Default"], Group: "ItemNeck", LinkableBy: [...KDCollarLink], power: 5, weight: 0, magic: true, escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": 0.25, "Pick": 0.05}, - maxwill: 0.25, - unlimited: true, enemyTags: {"kittyRestraints":0.001, "kittyCollar": 10, "maidCollar":-1, "dragonRestraints":-1, "mithrilRestraints": -1}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["Collars", "Will"], - - }, - {inventory: true, removePrison: true, alwaysKeep: true, showInQuickInv: true, good: true, name: "PotionCollar", accessible: true, Asset: "SlenderSteelCollar", Color: ["#6E5B38"], Group: "ItemNeck", power: 1, weight: 0, escapeChance: {"Struggle": -0.2, "Cut": -0.1, "Remove": 0.5, "Pick": 0.15}, potionCollar: true, allowPotions: true, - enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: []}, - {inventory: true, removePrison: true, alwaysKeep: true, showInQuickInv: true, good: true, name: "SlimeWalkers", debris: "Belts", inaccessible: true, Asset: "BalletHeels", Color: "#ff00ff", Group: "ItemBoots", hobble: true, power: 1, weight: 0, slimeWalk: true, - escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.4, "Pick": 0.9}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: []}, - {inventory: true, removePrison: true, name: "BasicLeash", tether: 2.9, Asset: "CollarLeash", Color: "Default", Group: "ItemNeckRestraints", leash: true, power: 1, weight: -99, harness: true, - unlimited: true, - events: [ - {trigger: "postRemoval", type: "RequireCollar"} - ], - escapeChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": 0.5, "Pick": 1.25}, enemyTags: {"leashing":1}, playerTags: {"ItemNeckRestraintsFull":-2, "ItemNeckFull":99}, minLevel: 0, allFloors: true, shrine: []}, - - //region Enchanted - {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, arousalMode: true, enchanted: true, name: "EnchantedBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "#AE915C", Group: "ItemPelvis", chastity: true, power: 25, weight: 0, - Security: { - level_key: 4, - level_magic: 4, - level_tech: 4, - }, - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: [], - //renderWhenLinked: ["Ornate], - LinkableBy: ["Ornate"], - events: [ - {trigger: "calcMiscast", type: "ReduceMiscastFlat", power: 0.3, requireEnergy: true}, - {trigger: "tick", type: "RegenStamina", power: 1, requireEnergy: true, energyCost: 0.0005}, - ]}, - {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, arousalMode: true, enchanted: true, name: "EnchantedBra", Asset: "PolishedChastityBra", OverridePriority: 26, Color: "#AE915C", Group: "ItemBreast", chastitybra: true, power: 25, weight: 0, - Security: { - level_key: 4, - level_magic: 4, - level_tech: 4, - }, - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: [], - //renderWhenLinked: ["Ornate], - LinkableBy: ["Ornate"], - events: [ - {trigger: "beforeDamage", type: "ModifyDamageFlat", power: -1, requireEnergy: true, energyCost: 0.01, inheritLinked: true} - ]}, - {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedHeels", Asset: "BalletWedges", Color: "#AE915C", Group: "ItemBoots", hobble: true, power: 25, weight: 0, - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: [], - events: [ - {trigger: "tick", type: "ApplySlowLevelBuff", power: -2, requireEnergy: true, energyCost: 0.0005, inheritLinked: true}, - {type: "ShadowHeel", trigger: "playerAttack", requireEnergy: true, energyCost: 0.00225, inheritLinked: true}, - //{trigger: "beforePlayerAttack", type: "BoostDamage", power: 1, requireEnergy: true, energyCost: 0.001125} - ]}, - {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedBlindfold", Asset: "PaddedBlindfold", Color: ["#AE915C", "#262626"], Group: "ItemHead", blindfold: 5, power: 25, weight: 0, - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: [], - LinkableBy: [...KDBlindfoldLink], - events: [ - {trigger: "calcEvasion", type: "BlindFighting", requireEnergy: true, inheritLinked: true}, - {trigger: "tick", type: "AccuracyBuff", power: 1.0, requireEnergy: true, inheritLinked: true}, - {trigger: "beforePlayerAttack", type: "BoostDamage", power: 1, requireEnergy: true, energyCost: 0.001125, inheritLinked: true}, - ]}, - {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedAnkleCuffs", Asset: "SteelAnkleCuffs", Type: "Chained", Color: ["#AE915C", "#B0B0B0"], Group: "ItemFeet", power: 25, weight: 0, - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: [], - LinkableBy: [...KDBindable, ...KDDevices], renderWhenLinked: [...KDBindable], - events: [ - {trigger: "tick", type: "EnchantedAnkleCuffs"}, - {trigger: "tick", type: "AllyHealingAura", aoe: 3.9, power: 1.5, inheritLinked: true}, - {trigger: "tick", type: "EvasionBuff", power: 0.25, requireEnergy: true, inheritLinked: true}, - {trigger: "miss", type: "EnergyCost", requireEnergy: true, energyCost: 0.0075, inheritLinked: true} - ]}, - {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, inventoryAs: "EnchantedAnkleCuffs", name: "EnchantedAnkleCuffs2", Asset: "SteelAnkleCuffs", Type: "Closed", blockfeet: true, Color: ["#AE915C", "#B0B0B0"], Group: "ItemFeet", power: 25, weight: 0, - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: [], - LinkableBy: [...KDBindable, ...KDDevices], renderWhenLinked: [...KDBindable], - events: [ - // These wont unlink if they're under something else - {trigger: "tick", type: "EnchantedAnkleCuffs2", requireEnergy: true, inheritLinked: true} - ]}, - {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedMuzzle", gag: 1.0, Asset: "FuturisticMuzzle", Modules: [1, 1, 2], Color: ['#AE915C', '#AE915C', '#CAA562', '#000000'], - Group: "ItemMouth", power: 25, weight: 0, - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["AncientMuzzle", "FlatGags"], - events: [ - {trigger: "tick", type: "SneakBuff", power: 1.15, requireEnergy: true, inheritLinked: true}, - {trigger: "tick", type: "RegenMana", power: 1.0, requireEnergy: true, energyCost: 0.0025, inheritLinked: true}, - {trigger: "beforeDamageEnemy", type: "AddDamageStealth", power: 7.0, requireEnergy: true, energyCost: 0.0015, inheritLinked: true}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.25, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.2, requiredTag: "Blindfolds"}, - ]}, - {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedBallGag", gag: 0.6, Asset: "FuturisticHarnessBallGag", Color: ['#AE915C', '#AE915C', '#424242', "#CAA562", '#000000'], - Group: "ItemMouth", power: 25, weight: 0, - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Flat"], - LinkableBy: [...KDBallGagLink, "AncientMuzzle"], renderWhenLinked: [...KDBallGagLink], - events: [ - {trigger: "calcMiscast", type: "ReduceMiscastFlat", power: 0.3, requireEnergy: true, inheritLinked: true}, - {trigger: "tick", type: "RegenMana", power: 1.0, requireEnergy: true, energyCost: 0.0025, inheritLinked: true}, - {trigger: "beforeDamageEnemy", type: "MultiplyDamageStatus", power: 1.3, requireEnergy: true, energyCost: 0.0025, inheritLinked: true}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", StruggleType: "Remove", power: 0.25, requiredTag: "Blindfolds"}, - {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", StruggleType: "Struggle", power: 0.2, requiredTag: "Blindfolds"}, - ]}, - {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedArmbinder", inaccessible: true, Asset: "FuturisticArmbinder", Type: "Tight", Color: ['#AE915C', '#AE915C', '#424242', "#424242", '#000000'], - Group: "ItemArms", power: 25, weight: 0, - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: [], - LinkableBy: [...KDArmbinderLink], renderWhenLinked: [...KDArmbinderLink], - events: [ - {trigger: "tick", type: "spellRange", power: 0.5, requireEnergy: true}, - {trigger: "beforeDamageEnemy", type: "MultiplyDamageMagic", power: 1.4, requireEnergy: true, energyCost: 0.00002, inheritLinked: true} - ]}, - {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedMittens", Asset: "FuturisticMittens", bindhands: 1.0, - Color: ['#B6A262', '#B6A262', '#424242', '#000000'], Group: "ItemHands", power: 25, weight: 0, - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: [], - LinkableBy: ["Tape", "Mittens"], - events: [ - {trigger: "beforeDamageEnemy", type: "MultiplyDamageMagic", power: 1.4, requireEnergy: true, energyCost: 0.000025, inheritLinked: true} // Energy cost per point o' extra damage - ]}, - //endregion -]; - -(() => { - let afterload = KDModsAfterLoad; - // @ts-ignore - KDModsAfterLoad = () => { - KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ - name: "Breastplate", - Group: "ItemBreast", - Asset: "PolishedChastityBra", - OverridePriority: 27, - showInQuickInv: true, good: true, - alwaysKeep: true, - debris: "Belts", - escapeChance: { - "Struggle": 10, - "Cut": -0.5, - "Remove": 10 - }, - shrine: ["Armor", "ChestArmor", "MetalArmor"], - armor: true, - protection: 1, - events: [ - {trigger: "tick", type: "restraintBlock", power: 1, inheritLinked: true}, - {trigger: "tick", type: "sneakBuff", power: -0.15, inheritLinked: true}, - ], - }, "Breastplate", "Rock-solid and form-fitting.", "Provides minor protection against enemy attacks. Decreases stealth.") - , [...KDCurseVariantList.Basic]); - - KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ - name: "Bustier", - Group: "ItemTorso", - Asset: "LeatherCorsetTop1", - AssetGroup: "Corset", - debris: "Belts", - OverridePriority: 27, - showInQuickInv: true, good: true, - alwaysKeep: true, - escapeChance: { - "Struggle": 0.1, - "Cut": 0.1, - "Remove": 0.4, - }, - shrine: ["Armor", "TorsoArmor"], - armor: true, - protection: 1, - strictness: 0.05, - protectionCursed: true, - events: [ - {trigger: "tick", type: "restraintBlock", power: 1, inheritLinked: true}, - ], - }, "Adventuring Corset", "Protects your organs and your sense of style.", "Provides minor protection against enemy attacks at the cost of flexibility.") - , [...KDCurseVariantList.Basic]); - - KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ - name: "ChainTunic", - Group: "ItemTorso", - Asset: "Bodice1", - AssetGroup: "Cloth", - Color: ["#808080", "#808080", "#808080"], - OverridePriority: 27, - showInQuickInv: true, good: true, - alwaysKeep: true, - debris: "Chains", - escapeChance: { - "Struggle": -0.1, - "Cut": -0.35, - "Remove": 0.35, - }, - protection: 2, - protectionCursed: true, - strictness: 0.08, - shrine: ["Armor", "TorsoArmor", "MetalArmor"], - armor: true, - events: [ - {trigger: "tick", type: "armorBuff", power: 1.0, inheritLinked: true}, - {trigger: "tick", type: "restraintBlock", power: 2.5, inheritLinked: true}, - {trigger: "tick", type: "evasionBuff", power: -0.5, inheritLinked: true}, - {trigger: "tick", type: "sneakBuff", power: -0.5, inheritLinked: true}, - ], - }, "Chainmail Tank Top", "Cumbersome, but effective!", "Provides +10 armor and protection against enemy attacks. Decreases stealth/evasion and makes struggling harder.") - , [...KDCurseVariantList.Basic]); - - KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ - name: "SteelArmor", - Group: "ItemTorso", - Asset: "MistressTop", - AssetGroup: "Cloth", - Color: ["Default"], - showInQuickInv: true, good: true, - alwaysKeep: true, - escapeChance: { - "Struggle": -0.5, - "Cut": -0.5, - "Remove": 0.15, - }, - shrine: ["Armor", "TorsoArmor", "MetalArmor"], - armor: true, - debris: "Belts", - protection: 3, - protectionCursed: true, - strictness: 0.15, - displayPower: 10, - events: [ - {trigger: "tick", type: "armorBuff", power: 0.5, inheritLinked: true}, - {trigger: "tick", type: "restraintBlock", power: 5, inheritLinked: true}, - ], - }, "Light Plate Armor", "Knight in shining rest-err, armor!", "Provides +5 armor and high protection. No impact to stealth or evasion") - , [...KDCurseVariantList.Basic]); - - KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ - name: "MageArmor", - Group: "ItemTorso", - Asset: "GrandMage", - AssetGroup: "Cloth", - Color: ["#5555ff"], - showInQuickInv: true, good: true, - alwaysKeep: true, - escapeChance: { - "Struggle": 0, - "Cut": -0.5, - "Remove": 0.25, - }, - shrine: ["Armor", "Robe"], - armor: true, - debris: "Belts", - protection: 1, - displayPower: 10, - events: [ - {trigger: "perksBonus", type: "spellDamage", power: 0.3, inheritLinked: true}, - {trigger: "tick", type: "spellWardBuff", power: 1, inheritLinked: true}, - ], - }, "Wizard's Robe", "I have the power!", "+30% spell damage and +10 spell ward") - , [...KDCurseVariantList.Basic]); - - KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ - name: "SteelSkirt", - Group: "ItemLegs", - Asset: "LatexSkirt2", - AssetGroup: "ClothLower", - Color: ["#ffffff"], - showInQuickInv: true, good: true, - alwaysKeep: true, - escapeChance: { - "Struggle": -0.5, - "Cut": -0.5, - "Remove": 0.35, - }, - shrine: ["Armor", "PelvisArmor", "MetalArmor"], - armor: true, - protection: 2, - debris: "Belts", - protectionCursed: true, - displayPower: 8, - events: [ - {trigger: "tick", type: "armorBuff", power: 0.5, inheritLinked: true}, - {trigger: "tick", type: "restraintBlock", power: 5, inheritLinked: true}, - ], - }, "Armored Skirt", "Knight in shining rest-err, armor!", "Provides +5 armor and high protection. No impact to stealth or evasion") - , [...KDCurseVariantList.Basic]); - - KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ - name: "Gauntlets", - Group: "ItemHands", - Asset: "FingerlessGloves", - AssetGroup: "Gloves", - showInQuickInv: true, good: true, - alwaysKeep: true, - escapeChance: { - "Struggle": 10, - "Cut": -0.5, - "Remove": 10 - }, - shrine: ["Armor", "GlovesArmor", "MetalArmor"], - armor: true, - debris: "Belts", - protection: 1, - events: [ - {trigger: "tick", type: "armorBuff", power: 0.5, inheritLinked: true}, - {trigger: "tick", type: "restraintBlock", power: 1, inheritLinked: true}, - {trigger: "playerAttack", type: "armorNoise", chance: 1, dist: 8, sfx: "Chain", msg: "KinkyDungeonPunishPlayerArmor", inheritLinked: true}, - {trigger: "playerCast", type: "armorNoise", chance: 1, dist: 11, punishComponent: "Arms", sfx: "Chain", msg: "KinkyDungeonPunishPlayerArmor", inheritLinked: true}, - ], - }, "Gauntlets", "Gloves with an iron grip.", "Provides +5 armor and minor protection against enemy attacks. Makes noise when attacking.") - , [...KDCurseVariantList.Basic]); - - KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ - name: "LeatherGloves", - Group: "ItemHands", - Asset: "BikerGloves", - AssetGroup: "Gloves", - showInQuickInv: true, good: true, - alwaysKeep: true, - escapeChance: { - "Struggle": 10, - "Cut": 0.1, - "Remove": 10 - }, - shrine: ["Armor", "GlovesArmor"], - armor: true, - debris: "Belts", - protection: 1, - }, "Leather Gloves", "Protecting you in style.", "Provides minor protection against enemy attacks.") - , [...KDCurseVariantList.Basic]); - - KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ - name: "Bracers", - Group: "ItemArms", - Asset: "SteelCuffs", - showInQuickInv: true, good: true, - alwaysKeep: true, - escapeChance: { - "Struggle": 10, - "Cut": -0.5, - "Remove": 10 - }, - shrine: ["Armor", "ArmArmor", "MetalArmor"], - armor: true, - debris: "Belts", - protection: 1, - }, "Steel Bracers", "Dependable protection for the average adventurer.", "Provides minor protection against enemy attacks.") - , [...KDCurseVariantList.Basic]); - - KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ - name: "SteelBoots", - Group: "ItemBoots", - Asset: "Boots1", - AssetGroup: "Shoes", - Color: ["#444444", "#222222"], - showInQuickInv: true, good: true, - alwaysKeep: true, - escapeChance: { - "Struggle": 10, - "Cut": -0.5, - "Remove": 10 - }, - shrine: ["Armor", "BootsArmor", "MetalArmor"], - armor: true, - protection: 1, - debris: "Belts", - events: [ - {trigger: "tick", type: "armorBuff", power: 0.5, inheritLinked: true}, - {trigger: "tick", type: "restraintBlock", power: 1, inheritLinked: true}, - {trigger: "tick", type: "sneakBuff", power: -0.35, inheritLinked: true}, - ], - }, "Armored Boots", "Noisy, but fashionable!", "Provides +5 armor and protection against enemy attacks. Decreases stealth.") - , [...KDCurseVariantList.Basic]); - - KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ - name: "LeatherBoots", - Group: "ItemBoots", - Asset: "WoollyBootsTall", - AssetGroup: "Shoes", - Color: ["#808080"], - showInQuickInv: true, good: true, - alwaysKeep: true, - escapeChance: { - "Struggle": 10, - "Cut": 0.1, - "Remove": 10 - }, - shrine: ["Armor", "BootsArmor"], - armor: true, - debris: "Belts", - protection: 1, - }, "Hide Boots", "For stepping into all kinds of trouble!", "Provides minor protection against enemy attacks.") - , [...KDCurseVariantList.Basic]); - - - - afterload(); - }; -})(); - - -/** - * @type {Record} - */ -let KDLocks = { - "Red": { - lockmult: 2.0, - // Picking - pickable: true, // rather than calling the function (which could vary) this is for classifying the lock - pick_time: 1.0, // Multiplies the picking rate - pick_diff: 0.0, // Added to the item's pick difficulty - - canPick: (data) => { - return true; - }, - doPick: (data) => { - return true; - }, - failPick: (data) => { - return "Fail"; - }, - breakChance: (data) => { - return KDRandom() < KinkyDungeonKeyGetPickBreakChance(); - }, - - // Key - unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock - key: "Red", - canUnlock: (data) => { - return KinkyDungeonRedKeys > 0; - }, - doUnlock: (data) => { - KinkyDungeonRedKeys -= 1; - return true; - }, - removeKeys: (data) => { - KinkyDungeonRedKeys -= 1; - }, - failUnlock: (data) => { - return "Fail"; - }, - - // Start of level -- for gold locks - levelStart: (item) => { - }, - shrineImmune: false, - - // Command word - commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock - command_lesser: () => {return 0.0 ;}, - command_greater: () => {return 0.0;}, - command_supreme: () => {return 0.0;}, - - loot_special: false, - loot_locked: true, - }, - "Red_Med": { - lockmult: 2.1, - // Picking - pickable: true, // rather than calling the function (which could vary) this is for classifying the lock - pick_time: 1.0, // Multiplies the picking rate - pick_diff: 0.0, // Added to the item's pick difficulty - pick_lim: 0.15, // Added to the item's pick limitchance - - canPick: (data) => { - return true; - }, - doPick: (data) => { - return true; - }, - failPick: (data) => { - return "Fail"; - }, - breakChance: (data) => { - return KDRandom() < KinkyDungeonKeyGetPickBreakChance(); - }, - - // Key - unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock - key: "Red", - canUnlock: (data) => { - return KinkyDungeonRedKeys > 0; - }, - doUnlock: (data) => { - KinkyDungeonRedKeys -= 1; - return true; - }, - removeKeys: (data) => { - KinkyDungeonRedKeys -= 1; - }, - failUnlock: (data) => { - return "Fail"; - }, - - // Start of level -- for gold locks - levelStart: (item) => { - }, - shrineImmune: false, - - // Command word - commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock - command_lesser: () => {return 0.0 ;}, - command_greater: () => {return 0.0;}, - command_supreme: () => {return 0.0;}, - - loot_special: false, - loot_locked: true, - }, - "Red_Hi": { - lockmult: 2.2, - // Picking - pickable: true, // rather than calling the function (which could vary) this is for classifying the lock - pick_time: 1.0, // Multiplies the picking rate - pick_diff: 0.0, // Added to the item's pick difficulty - pick_lim: 0.3, // Added to the item's pick limitchance - - canPick: (data) => { - return true; - }, - doPick: (data) => { - return true; - }, - failPick: (data) => { - return "Fail"; - }, - breakChance: (data) => { - return KDRandom() < KinkyDungeonKeyGetPickBreakChance(); - }, - - // Key - unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock - key: "Red", - canUnlock: (data) => { - return KinkyDungeonRedKeys > 0; - }, - doUnlock: (data) => { - KinkyDungeonRedKeys -= 1; - return true; - }, - removeKeys: (data) => { - KinkyDungeonRedKeys -= 1; - }, - failUnlock: (data) => { - return "Fail"; - }, - - // Start of level -- for gold locks - levelStart: (item) => { - }, - shrineImmune: false, - - // Command word - commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock - command_lesser: () => {return 0.0 ;}, - command_greater: () => {return 0.0;}, - command_supreme: () => {return 0.0;}, - - loot_special: false, - loot_locked: true, - }, - "Blue": { - lockmult: 3.0, - penalty: { - "Struggle": 0.1, - "Cut": 0.15, - }, - - // Picking - pickable: false, // rather than calling the function (which could vary) this is for classifying the lock - pick_time: 0.0, // Multiplies the picking rate - pick_diff: 0.0, // Added to the item's pick difficulty - - canPick: (data) => { - return false; - }, - doPick: (data) => { - return false; - }, - failPick: (data) => { - return "Break"; - }, - breakChance: (data) => { - return true; - }, - - // Key - unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock - key: "Blue", - canUnlock: (data) => { - return KinkyDungeonBlueKeys > 0; - }, - doUnlock: (data) => { - return true; - }, - removeKeys: (data) => { - KinkyDungeonBlueKeys -= 1; - }, - failUnlock: (data) => { - return "Fail"; - }, - - // Start of level -- for gold locks - levelStart: (item) => { - }, - shrineImmune: false, - - // Command word - commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock - command_lesser: () => {return 0.0 ;}, - command_greater: () => {return 0.0;}, - command_supreme: () => {return 0.0;}, - - loot_special: true, - loot_locked: false, - }, - "Gold": { - lockmult: 3.25, - penalty: { - "Struggle": 0.2, - "Cut": 0.3, - }, - - // Picking - pickable: false, // rather than calling the function (which could vary) this is for classifying the lock - pick_time: 0.0, // Multiplies the picking rate - pick_diff: 0.0, // Added to the item's pick difficulty - - canPick: (data) => { - return false; - }, - doPick: (data) => { - return false; - }, - failPick: (data) => { - return "Break"; - }, - breakChance: (data) => { - return true; - }, - - // Key - unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock - key: "Mistress", - canUnlock: (data) => { - return KinkyDungeonItemCount("MistressKey") > 0; - }, - doUnlock: (data) => { - return true; - }, - removeKeys: (data) => { - KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("MistressKey"), -1); - }, - failUnlock: (data) => { - return "Fail"; - }, - - // Start of level -- for gold locks and others - levelStart: (item) => { - if ((MiniGameKinkyDungeonLevel >= item.lockTimer || !item.lockTimer || item.lockTimer >= KinkyDungeonMaxLevel)) { - KinkyDungeonLock(item, "Blue"); - KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonGoldLockRemove"), "yellow", 2); - } - }, - shrineImmune: false, - - // Command word - commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock - command_lesser: () => {return 0.0 ;}, - command_greater: () => {return 0.0;}, - command_supreme: () => {return 0.0;}, - - loot_special: true, - loot_locked: false, - }, - "Purple": { - lockmult: 2.5, - - // Picking - pickable: false, // rather than calling the function (which could vary) this is for classifying the lock - pick_time: 0.0, // Multiplies the picking rate - pick_diff: 0.0, // Added to the item's pick difficulty - - canPick: (data) => { - return false; - }, - doPick: (data) => { - return false; - }, - failPick: (data) => { - return "Fail"; - }, - breakChance: (data) => { - return false; - }, - - // Key - unlockable: false, // rather than calling the function (which could vary) this is for classifying the lock - key: "Blue", - canUnlock: (data) => { - return false; - }, - doUnlock: (data) => { - return true; - }, - removeKeys: (data) => { - // - }, - failUnlock: (data) => { - return "Fail"; - }, - - // Start of level -- for gold locks - levelStart: (item) => { - }, - shrineImmune: false, - - // Command word - commandlevel: 1, // rather than calling the function (which could vary) this is for classifying the lock - command_lesser: () => {return 1.0 ;}, - command_greater: () => {return 3.0;}, - command_supreme: () => {return 10.0;}, - - loot_special: false, - loot_locked: true, - }, -}; - -let KDControlHarnessCategories = { - "Cuffs": { - activateCount: 3, - activateTags: ["ArmCuffsBase", "LegCuffsBase", "AnkleCuffsBase"], - activateFunction: (e, item, data, invItems) => { - //if (!KinkyDungeonFlags.get("ControlHarnessCuffs")) { - - // If there are any cuffs to upgrade - let upgradedTags = ["ControlHArm", "ControlHAnkle", "ControlHLeg"]; - if (upgradedTags.some((tag) => {return KinkyDungeonPlayerTags.get(tag) != true;})) { - KinkyDungeonSendTextMessage(4, - TextGet("KDControlHarnessCuffsActivate"), - "#ffffff", - 1, - ); - for (let rName of ["CyberArmCuffs2", "CyberArmCuffs3", "CyberAnkleCuffs2", "CyberAnkleCuffs3", "CyberLegCuffs2"]) { - if (KinkyDungeonPlayerTags.get("Item_"+rName)) continue; - let newRestraint = KinkyDungeonGetRestraintByName(rName); - if (!KinkyDungeonPlayerTags.get("LinkTo_"+rName)) continue; - //KinkyDungeonLinkItem(newRestraint, item, item.tightness, ""); - if (KDToggles.Sound) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/RobotEngage.ogg"); - KinkyDungeonAddRestraint(newRestraint, item.tightness, true, "", false, undefined, undefined, undefined, item.faction); - } - - } - //KinkyDungeonSetFlag("ControlHarnessCuffs", 1); - //} - }, - updateFunction: (e, item, data, invItems) => { - let upgradedTags = ["ControlHArm", "ControlHAnkle", "ControlHLeg"]; - if (upgradedTags.some((tag) => {return KinkyDungeonPlayerTags.get(tag) != true;})) { - KinkyDungeonSendTextMessage(4, - TextGet("KDControlHarnessCuffsUpdate") - .replace("RESTRAINTNAME", TextGet("Restraint" + data.item.name)) - .replace("PERCENT", "" + Math.round(100 * invItems.length / 3)), - "#ffffff", - 1, - ); - } - }, - }, - "Chastity": { - activateCount: 2, - activateTags: ["CyberChastityL", "CyberChastityU"], - activateFunction: (e, item, data, invItems) => { - if (!KinkyDungeonStatsChoice.get("arousalMode")) return; - //if (!KinkyDungeonFlags.get("ControlHarnessCuffs")) { - - // If there are any cuffs to upgrade - let fillGroups = ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemNipples"]; - if (fillGroups.some((group) => {return !KinkyDungeonGetRestraintItem(group);})) { - let Mode = CommonRandomItemFromList("", ["Edge", "Deny", "Fullpower"]); - if (KinkyDungeonGetRestraintItem("ItemVulva")) Mode = "Extra"; - KinkyDungeonSendTextMessage(4, - TextGet("KDControlHarnessChastityActivate") - .replace("CHASTITYMODE", TextGet("KDControlHarnessChastityMode_" + Mode)), - "#ffffff", - 1, - ); - let addList = ["RearVibe1", "TrapVibeProto", "NippleClamps"]; - if (Mode == "Edge") addList.push("TrapPlug2"); - else if (Mode == "Deny") addList.push("TrapPlug3"); - else if (Mode == "Fullpower") addList.push("TrapPlug5"); - for (let rName of addList) { - let newRestraint = KinkyDungeonGetRestraintByName(rName); - if (KinkyDungeonGetRestraintItem(KDRestraint(newRestraint).Group)) continue; - if (KDToggles.Sound) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/RobotEngage.ogg"); - KinkyDungeonAddRestraint(newRestraint, item.tightness, true, "", false, undefined, undefined, undefined, item.faction); - } - - } - //KinkyDungeonSetFlag("ControlHarnessCuffs", 1); - //} - }, - updateFunction: (e, item, data, invItems) => { - if (!KinkyDungeonStatsChoice.get("arousalMode")) return; - - let fillGroups = ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemNipples"]; - if (fillGroups.some((group) => {return !KinkyDungeonGetRestraintItem(group);})) { - KinkyDungeonSendTextMessage(4, - TextGet("KDControlHarnessChastityUpdate") - .replace("RESTRAINTNAME", TextGet("Restraint" + data.item.name)) - .replace("PERCENT", "" + Math.round(100 * invItems.length / 3)), - "#ffffff", - 1, - ); - } - }, - }, -}; \ No newline at end of file diff --git a/Game/KinkyDungeonSetpiece.js b/Game/KinkyDungeonSetpiece.js deleted file mode 100644 index 5bd48c79d..000000000 --- a/Game/KinkyDungeonSetpiece.js +++ /dev/null @@ -1,924 +0,0 @@ -"use strict"; - -let KDSetpieceAttempts = 10; - -let KDSetPieces = [ - {Name: "Bedroom", tags: ["decorative", "urban"], Radius: 4}, - {Name: "Graveyard", tags: ["decorative", "temple"], Radius: 5}, - {Name: "Altar", tags: ["shrine", "temple"], Radius: 5}, - {Name: "SmallAltar", tags: ["shrine", "temple", "endpoint"], Radius: 3, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, - {Name: "FuukaAltar", tags: ["boss", "temple"], Radius: 7, Max: 1}, - {Name: "Storage", tags: ["loot", "urban", "endpoint"], Radius: 7}, - {Name: "GuardedChest", tags: ["loot", "endpoint"], Radius: 3, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, - {Name: "BanditPrison", tags: ["rep", "endpoint"], Radius: 3, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, - {Name: "QuadCell", tags: ["decorative", "urban"], Radius: 7}, - {Name: "PearlChest", tags: ["loot", "pearl"], Radius: 3, Prereqs: ["PearlEligible"], Max: 1, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, - {Name: "ShadowChest", tags: ["loot", "endpoint", "temple", "urban", "jungle", "cavern", "shadow"], Radius: 5, Max: 2}, - {Name: "GuaranteedCell", tags: ["jail", "urban", "endpoint", "industrial", "temple", "factory", "cavern", "jungle"], Radius: 5, Max: 1, xPad: 2}, - {Name: "ForbiddenChest", tags: ["loot", "temple", "urban", "endpoint"], Radius: 3, Max: 1, xPad: 1}, - {Name: "ForbiddenHall", tags: ["loot", "temple", "open"], Radius: 7, Max: 1, xPad: 1}, - {Name: "Cache", tags: ["loot", "urban", "endpoint"], Radius: 7, Max: 1, xPad: 2}, - {Name: "ExtraCell", tags: ["jail", "urban", "endpoint"], Radius: 4, xPad: 2, yPad: 1, xPadEnd: 2, yPadEnd: 1}, - {Name: "JungleLight", tags: ["natural", "light"], noPOI: true, Radius: 1, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, - {Name: "Fireflies", tags: ["natural", "light"], noPOI: true, Radius: 1, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, - {Name: "Magicflies", tags: ["temple", "light"], noPOI: true, Radius: 1, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, -]; - -let KDCountSetpiece = new Map(); - -function KinkyDungeonPlaceSetPieces(POI, trapLocations, chestlist, shrinelist, chargerlist, spawnPoints, InJail, width, height) { - KDCountSetpiece = new Map(); - let pieces = new Map(); - - let Params = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]]; - let setpieces = []; - let alt = !KDGameData.RoomType ? KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel) : KinkyDungeonAltFloor(KDGameData.RoomType); - let forcePOI = !alt || !alt.genType;//Params.forcePOI ? true : false; - if (!alt) { - Object.assign(setpieces, Params.setpieces); - setpieces.push({Type: "GuaranteedCell", Weight: 100000}); - - for (let i of KDGameData.ChestsGenerated) { - console.log(i); - } - - if (!KDGameData.ChestsGenerated.includes("cache")) - setpieces.push({Type: "Cache", Weight: 100000}); - //setpieces.push({Type: "PearlChest", Weight: 100}); - let forbiddenChance = Params.forbiddenChance != undefined ? Params.forbiddenChance : 1; - let greaterChance = Params.forbiddenGreaterChance != undefined ? Params.forbiddenGreaterChance : 0.5; - if (KinkyDungeonStatsChoice.get("hardMode")) { - setpieces.push({Type: "ShadowChest", Weight: 10000}); - forbiddenChance = 1; - greaterChance = Math.max(greaterChance, 0.8); - } - if (KDRandom() < forbiddenChance) { - if (KDRandom() < greaterChance) { - if (!KDGameData.ChestsGenerated.includes("gold")) - setpieces.push({Type: "ForbiddenHall", Weight: 100000}); - } else { - if (!KDGameData.ChestsGenerated.includes("lessergold")) - setpieces.push({Type: "ForbiddenChest", Weight: 100000}); - } - } - } else { - for (let s of Object.entries(alt.setpieces)) { - setpieces.push({Type: s[0], Weight: s[1]}); - } - } - - if (KDGameData.MapMod) { - let mapmod = KDMapMods[KDGameData.MapMod]; - if (mapmod && mapmod.bonussetpieces) { - for (let s of mapmod.bonussetpieces) { - setpieces.push(s); - } - } - } - - // Populate the map - for (let p of KDSetPieces) { - let prereqs = true; - if (prereqs && p.Prereqs) { - if (prereqs && p.Prereqs.includes("PearlEligible")) { - let has = KDPearlRequirement(); - if (!has) prereqs = false; - } - } - if (prereqs) - pieces.set(p.Name, p); - } - - let pieceCount = width * height / 25; - let count = 0; - let fails = 0; - while (count < pieceCount && fails < KDSetpieceAttempts) { - let Piece = KinkyDungeonGetSetPiece(POI, setpieces, pieces); - if (Piece && pieces.get(Piece) && KinkyDungeonGenerateSetpiece(POI, pieces.get(Piece), InJail, - trapLocations, chestlist, shrinelist, chargerlist, spawnPoints, - forcePOI && !pieces.get(Piece).noPOI, alt, Params).Pass) { - count += 1; - KDCountSetpiece.set(Piece, KDCountSetpiece.get(Piece) ? (KDCountSetpiece.get(Piece) + 1) : 1); - } else fails += 1; - } - -} - -function KDGetFavoredSetpieces(POI, setpieces) { - let pieces = []; - for (let p of POI) { - if (p.used) continue; - for (let f of p.favor) { - if (!pieces.includes(f)) { - pieces.push(f); - } - } - } - return setpieces.filter((p) => {return pieces.includes(p.Name);}); -} -function KDGetFavoringSetpieces(Name, tags, POI, POIBlacklist) { - let pois = []; - for (let p of POI) { - if (POIBlacklist && POIBlacklist.get(p)) continue; - if (p.used) continue; - if (p.favor.includes(Name)) { - pois.push(p); - } else if (p.requireTags.length == 0 || p.requireTags.some((tag) => {return tags.includes(tag);})) { - pois.push(p); - } - } - - return pois[Math.floor(KDRandom() * pois.length)]; -} - -function KinkyDungeonGetSetPiece(POI, setpieces, pieces) { - let setpieces2 = KDGetFavoredSetpieces(POI, setpieces); - if (setpieces2.length < 1 || KDRandom() < 0.1) setpieces2 = setpieces; - - if (setpieces2) { - - let pieceWeightTotal = 0; - let pieceWeights = []; - - for (let piece of setpieces2) { - if (pieces.has(piece.Type) && (!pieces.get(piece.Type).Max || !(KDCountSetpiece.get(piece.Type) >= pieces.get(piece.Type).Max))) { - pieceWeights.push({piece: piece, weight: pieceWeightTotal}); - pieceWeightTotal += piece.Weight; - } - } - - let selection = KDRandom() * pieceWeightTotal; - - for (let L = pieceWeights.length - 1; L >= 0; L--) { - if (selection > pieceWeights[L].weight) { - return pieceWeights[L].piece.Type; - } - } - } -} - -function KinkyDungeonGenerateSetpiece(POI, Piece, InJail, trapLocations, chestlist, shrinelist, chargerlist, spawnPoints, forcePOI, altType, MapParams) { - let radius = Piece.Radius; - let xPadStart = Piece.xPad || 5; - let yPadStart = Piece.yPad || 2; - let xPadEnd = Piece.xPadEnd || 2; - let yPadEnd = Piece.yPadEnd || 2; - if (InJail) { - xPadStart = Math.max(xPadStart, KinkyDungeonJailLeashX + 2); - } - let cornerX = Math.ceil(xPadStart) + Math.floor(KDRandom() * (KinkyDungeonGridWidth - xPadStart - xPadEnd - radius - 1)); - let cornerY = Math.ceil(yPadStart) + Math.floor(KDRandom() * (KinkyDungeonGridHeight - yPadStart - yPadEnd - radius - 1)); - - let favoringPOI = KDGetFavoringSetpieces(Piece.Name, Piece.tags ? Piece.tags : ["decorative"], POI); - if (favoringPOI) { - cornerX = favoringPOI.x - Math.floor(Piece.Radius / 2); - cornerY = favoringPOI.y - Math.floor(Piece.Radius / 2); - } - - let i = 0; - let POIBlacklist = new Map(); - for (i = 0; i < 1000; i++) { - let specialDist = KinkyDungeonGetClosestSpecialAreaDist(cornerX + Math.floor(radius/2) - 1, cornerY + Math.floor(radius/2)); - if (specialDist <= (forcePOI ? 0 : 1) + Math.ceil(radius/2) || !(cornerX > Math.ceil(xPadStart) && cornerX < KinkyDungeonGridWidth - radius - xPadEnd && cornerY > Math.ceil(yPadStart) && cornerY < KinkyDungeonGridHeight - radius - yPadEnd)) { - cornerY = Math.ceil(yPadStart) + Math.floor(KDRandom() * (KinkyDungeonGridHeight - yPadStart - yPadEnd - radius - 1)); - cornerX = Math.ceil(xPadStart) + Math.floor(KDRandom() * (KinkyDungeonGridWidth - xPadStart - radius - 1)); - - if (i < 100 || i % 3 == 0 || forcePOI) { - favoringPOI = KDGetFavoringSetpieces(Piece.Name, Piece.tags ? Piece.tags : ["decorative"], POI, POIBlacklist); - if (favoringPOI) { - cornerX = favoringPOI.x - Math.floor(Piece.Radius / 2); - cornerY = favoringPOI.y - Math.floor(Piece.Radius / 2); - POIBlacklist.set(favoringPOI, true); - } - } - } else break; - } - if (i > 990) { - console.log("Could not place " + Piece.Name); - return {Pass: false, Traps: trapLocations}; - } - - if (favoringPOI) - favoringPOI.used = true; - let skip = false; - if (forcePOI && !favoringPOI) { - skip = true; - } - - if (!skip) - switch (Piece.Name) { - case "Bedroom": - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, true, false, 1, true); - if (KDRandom() < 0.25) { - KinkyDungeonMapSet(cornerX + 2, cornerY + 3, 'D'); - KinkyDungeonMapSet(cornerX + 2, cornerY + 1, 'c'); - KinkyDungeonTilesSet("" + (cornerX + 2) + "," + (cornerY + 3), {Type: "Door", NoTrap: true, OffLimits: true}); - } else if (KDRandom() < 0.33) { - KinkyDungeonMapSet(cornerX + 2, cornerY, 'D'); - KinkyDungeonMapSet(cornerX + 1, cornerY + 2, 'c'); - KinkyDungeonTilesSet("" + (cornerX + 2) + "," + (cornerY), {Type: "Door", NoTrap: true, OffLimits: true}); - } else if (KDRandom() < 0.5) { - KinkyDungeonMapSet(cornerX + 3, cornerY + 2, 'D'); - KinkyDungeonMapSet(cornerX + 2, cornerY + 1, 'c'); - KinkyDungeonTilesSet("" + (cornerX + 3) + "," + (cornerY + 2), {Type: "Door", NoTrap: true, OffLimits: true}); - } else { - KinkyDungeonMapSet(cornerX, cornerY + 2, 'D'); - KinkyDungeonMapSet(cornerX + 2, cornerY + 1, 'c'); - KinkyDungeonTilesSet("" + (cornerX) + "," + (cornerY + 2), {Type: "Door", NoTrap: true, OffLimits: true}); - } - KinkyDungeonMapSet(cornerX + 1, cornerY + 1, 'B'); - if (KinkyDungeonStatsChoice.has("Nowhere")) { - if (KDRandom() < 0.5) - KinkyDungeonTilesSet((cornerX + 1) + "," + (cornerY + 1), { - Type: "Trap", - Trap: "BedTrap", - }); - } - if (KDRandom() < 0.15) spawnPoints.push({x:cornerX + 1, y:cornerY + 1, required: ["human"], AI: "guard"}); - break; - case "Graveyard": { - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 1, true); - // Place doors around pairs - KDCreateDoors(cornerX - 1, cornerY - 1, radius + 2, radius + 2); - let ghost = false; - for (let X = cornerX; X <= cornerX + radius - 1; X += 2) { - for (let Y = cornerY; Y < cornerY + radius; Y += 2) { - if (KDRandom() < 0.5) KinkyDungeonMapSet(X, Y, 'X'); - else if (KDRandom() < 0.33) KinkyDungeonMapSet(X, Y, 'a'); - else KinkyDungeonMapSet(X, Y, '2'); - if (!ghost && KDRandom() < 0.14) { - spawnPoints.push({x:X, y:Y, required: ["ghost"], tags: ["ghost"], AI: "guard"}); - ghost = true; - } - } - } - } - break; - case "Altar": - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 1, false); - // Place doors around pairs - KDCreateDoors(cornerX - 1, cornerY - 1, radius + 2, radius + 2); - KinkyDungeonMapSet(cornerX, cornerY , 'X'); - KinkyDungeonMapSet(cornerX + radius - 1, cornerY, 'X'); - KinkyDungeonMapSet(cornerX, cornerY + radius - 1, 'X'); - KinkyDungeonMapSet(cornerX + radius - 1, cornerY + radius - 1, 'X'); - shrinelist.push({x: cornerX + 2, y: cornerY + 2, priority: true}); - break; - case "SmallAltar": - if (!favoringPOI || KinkyDungeonBoringGet(cornerX + 1, cornerY + 1) < 3) skip = true; - else { - KinkyDungeonCreateRectangle(cornerX, cornerY, 2, 2, false, false, 0, false); - let xx = 1; - //if (KDRandom() < 0.5) { - // xx = 0; - //} - KinkyDungeonMapSet(cornerX + xx, cornerY + 1, 'a'); - shrinelist.push({x: cornerX + xx, y: cornerY + 1, priority: true}); - if (KinkyDungeonMapGet(cornerX + xx, cornerY) == '1') KinkyDungeonMapSet(cornerX + xx, cornerY, 'm'); - if (KinkyDungeonMapGet(cornerX + xx, cornerY + 2) == '1') KinkyDungeonMapSet(cornerX + xx, cornerY + 2, 'm'); - - if (KinkyDungeonMapGet(cornerX + xx - 1, cornerY) == '1') KinkyDungeonMapSet(cornerX + xx - 1, cornerY, 'X'); - if (KinkyDungeonMapGet(cornerX + xx - 1, cornerY + 1) == '1') KinkyDungeonMapSet(cornerX + xx - 1, cornerY + 1, 'm'); - if (KinkyDungeonMapGet(cornerX + xx - 1, cornerY + 2) == '1') KinkyDungeonMapSet(cornerX + xx - 1, cornerY + 2, 'X'); - - if (KinkyDungeonMapGet(cornerX + xx + 1, cornerY) == '1') KinkyDungeonMapSet(cornerX + xx + 1, cornerY, 'X'); - if (KinkyDungeonMapGet(cornerX + xx + 1, cornerY + 1) == '1') KinkyDungeonMapSet(cornerX + xx + 1, cornerY + 1, 'm'); - if (KinkyDungeonMapGet(cornerX + xx + 1, cornerY + 2) == '1') KinkyDungeonMapSet(cornerX + xx + 1, cornerY + 2, 'X'); - - // Place doors around pairs - KDCreateDoors(cornerX - 2 + xx, cornerY - 1, radius + 2, radius + 2); - } - break; - case "FuukaAltar": { - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 1, false); - KinkyDungeonMapSet(cornerX + 1, cornerY + 1 , 'o'); - KinkyDungeonMapSet(cornerX + radius - 2, cornerY + 1, 'o'); - KinkyDungeonMapSet(cornerX + 1, cornerY + radius - 2, 'o'); - KinkyDungeonMapSet(cornerX + radius - 2, cornerY + radius - 2, 'o'); - - KinkyDungeonMapSet(cornerX, cornerY + 3 , 'o'); - KinkyDungeonMapSet(cornerX + 3, cornerY , 'o'); - KinkyDungeonMapSet(cornerX + 3, cornerY + radius - 1 , 'o'); - KinkyDungeonMapSet(cornerX + radius - 1, cornerY + 3 , 'o'); - - let Enemy = KinkyDungeonGetEnemyByName("Fuuka1"); - let e = {tracking: true, Enemy: Enemy, id: KinkyDungeonGetEnemyID(), x:cornerX + 3, y:cornerY + 3, hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0}; - KDAddEntity(e); - KDStageBossGenerated = true; - break; - } - case "PearlChest": - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, true); - /*if (KDRandom() < 0.6) KinkyDungeonMapSet(cornerX, cornerY , 'a'); - else shrinelist.push({x: cornerX, y: cornerY, priority: true}); - if (KDRandom() < 0.6) KinkyDungeonMapSet(cornerX + radius - 1, cornerY, 'a'); - else shrinelist.push({x: cornerX + radius - 1, y: cornerY, priority: true}); - if (KDRandom() < 0.6) KinkyDungeonMapSet(cornerX, cornerY + radius - 1, 'a'); - else shrinelist.push({x: cornerX, y: cornerY + radius - 1, priority: true}); - if (KDRandom() < 0.6) KinkyDungeonMapSet(cornerX + radius - 1, cornerY + radius - 1, 'a'); - else shrinelist.push({x: cornerX + radius - 1, y: cornerY + radius - 1, priority: true});*/ - KinkyDungeonMapSet(cornerX, cornerY + 1, 'a'); - KinkyDungeonMapSet(cornerX + radius - 1, cornerY + 1, 'a'); - KinkyDungeonMapSet(cornerX + 1, cornerY + 1, 'C'); - KinkyDungeonTilesSet((cornerX + 1) + "," + (cornerY + 1), {Loot: "pearl", Roll: KDRandom()}); - break; - case "ShadowChest": - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, false); - // Place doors around pairs - KDCreateDoors(cornerX - 1, cornerY - 1, radius + 2, radius + 2); - KinkyDungeonMapSet(cornerX, cornerY , 'o'); - KinkyDungeonMapSet(cornerX + radius - 1, cornerY, 'o'); - KinkyDungeonMapSet(cornerX, cornerY + radius - 1, 'o'); - KinkyDungeonMapSet(cornerX + radius - 1, cornerY + radius - 1, 'o'); - - if (!Piece.Chance || KDRandom() < Piece.Chance) { - KinkyDungeonMapSet(cornerX + 2, cornerY + 2, 'C'); - KinkyDungeonTilesSet((cornerX + 2) + "," + (cornerY + 2), { - Loot: "shadow", Roll: KDRandom(), - lootTrap: KDGenChestTrap(true, cornerX + 2, cornerY + 2, "shadow", undefined, false)} - ); - let chance = 0.75; - let chance2 = 0.25; - if (KDRandom() < chance) trapLocations.push({x: cornerX + 3, y: cornerY + 1}); - if (KDRandom() < chance) trapLocations.push({x: cornerX + 3, y: cornerY + 2}); - if (KDRandom() < chance) trapLocations.push({x: cornerX + 3, y: cornerY + 3}); - if (KDRandom() < chance) trapLocations.push({x: cornerX + 1, y: cornerY + 1}); - if (KDRandom() < chance) trapLocations.push({x: cornerX + 1, y: cornerY + 2}); - if (KDRandom() < chance) trapLocations.push({x: cornerX + 1, y: cornerY + 3}); - if (KDRandom() < chance) trapLocations.push({x: cornerX + 2, y: cornerY + 1}); - if (KDRandom() < chance) trapLocations.push({x: cornerX + 2, y: cornerY + 3}); - - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 1, y: cornerY}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 2, y: cornerY}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 3, y: cornerY}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 1, y: cornerY + radius - 1}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 2, y: cornerY + radius - 1}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 3, y: cornerY + radius - 1}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 1}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 2}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 3}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 1}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 2}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 3}); - } else { - shrinelist.push({x: cornerX+2, y: cornerY+2, priority: true}); - - let chance2 = 0.1; - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 1, y: cornerY}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 2, y: cornerY}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 3, y: cornerY}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 1, y: cornerY + radius - 1}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 2, y: cornerY + radius - 1}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + 3, y: cornerY + radius - 1}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 1}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 2}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 3}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 1}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 2}); - if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 3}); - } - - break; - case "GuaranteedCell": { - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, true, false, 1, true, true, true); - KinkyDungeonMapSet(cornerX+4, cornerY+2, 'd'); - KinkyDungeonTilesSet("" + (cornerX+4) + "," + (cornerY+2), {Type: "Door", NoTrap: true, Jail: true, ReLock: true, OffLimits: true}); - KinkyDungeonPatrolPoints.push({x: cornerX + 5, y: cornerY + 2}); - - let sidestyle = Math.floor(KDRandom() * 3); - if (sidestyle == 0) { - // Porthole - //KinkyDungeonMapSet(cornerX+1, cornerY, 'b'); - KinkyDungeonMapSet(cornerX+1 + Math.floor(KDRandom() * 3), cornerY, 'b'); - //KinkyDungeonMapSet(cornerX+3, cornerY, 'b'); - } else if (sidestyle == 1) { - KinkyDungeonMapSet(cornerX, cornerY+1, 'b'); - KinkyDungeonMapSet(cornerX, cornerY+2, 'b'); - KinkyDungeonMapSet(cornerX, cornerY+3, 'b'); - } else { - KinkyDungeonMapSet(cornerX+1, cornerY+4, 'b'); - KinkyDungeonMapSet(cornerX+2, cornerY+4, 'b'); - KinkyDungeonMapSet(cornerX+3, cornerY+4, 'b'); - } - KinkyDungeonMapSet(cornerX+4, cornerY+1, 'b'); - KinkyDungeonMapSet(cornerX+4, cornerY+3, 'b'); - KinkyDungeonMapSet(cornerX+4, cornerY+1, 'b'); - - KinkyDungeonMapSet(cornerX+2, cornerY+2, 'B'); - if (KDRandom() < 0.0 + (KDGameData.RoomType == "Jail" ? 1.0 : 0)) { - SetpieceSpawnPrisoner(cornerX+1, cornerY+1); - } - if (KDRandom() < 0.5 + (KDGameData.RoomType == "Jail" ? 0.25 : 0)) { - SetpieceSpawnPrisoner(cornerX+1, cornerY+2); - } - if (KDRandom() < 0.5 + (KDGameData.RoomType == "Jail" ? 0.25 : 0)) { - SetpieceSpawnPrisoner(cornerX+1, cornerY+3); - } - KDGameData.JailPoints.push({x: cornerX+2, y: cornerY+2, type: "jail", radius: 1}); - KDTorch(cornerX + 2, cornerY, altType, MapParams); - break; - } - case "ExtraCell": { - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, true, false, 1, true, true); - KinkyDungeonMapSet(cornerX+3, cornerY+1, 'D'); - KinkyDungeonTilesSet("" + (cornerX+3) + "," + (cornerY+1), {Type: "Door", NoTrap: true, Jail: true, ReLock: true, OffLimits: true}); - - KinkyDungeonMapSet(cornerX+3, cornerY+2, 'b'); - - // Chance for seethru - if (KDRandom() < 0.5) { - KinkyDungeonMapSet(cornerX, cornerY+1, 'b'); - KinkyDungeonMapSet(cornerX, cornerY+2, 'b'); - } - if (KDRandom() < 0.5) { - KinkyDungeonMapSet(cornerX+1, cornerY, 'b'); - KinkyDungeonMapSet(cornerX+2, cornerY, 'b'); - } - if (KDRandom() < 0.5) { - KinkyDungeonMapSet(cornerX+1, cornerY+3, 'b'); - KinkyDungeonMapSet(cornerX+2, cornerY+3, 'b'); - } - - if (KDRandom() < 0.6 + (KDGameData.RoomType == "Jail" ? 0.35 : 0)) { - SetpieceSpawnPrisoner(cornerX+1, cornerY+2); - } - - KinkyDungeonMapSet(cornerX+1, cornerY+1, 'B'); - KDTorch(cornerX + 1, cornerY, altType, MapParams); - KDGameData.JailPoints.push({x: cornerX+1, y: cornerY+1, type: "jail", radius: 1}); - break; - } - case "JungleLight": { - if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(cornerX, cornerY))) skip = true; - else { - KinkyDungeonMapSet(cornerX, cornerY, '2'); - KinkyDungeonTilesSet((cornerX) + "," + (cornerY), {Light: 6, Skin: "LightRays"}); - } - break; - } - case "Fireflies": { - if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(cornerX, cornerY))) skip = true; - else - KinkyDungeonTilesSet((cornerX) + "," + (cornerY), {Light: 2, Skin: "Fireflies"}); - break; - } - case "Magicflies": { - if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(cornerX, cornerY))) skip = true; - else - KinkyDungeonTilesSet((cornerX) + "," + (cornerY), {Light: 2, Skin: "Magicflies"}); - break; - } - case "Storage": { - let rad = radius - 2; - KinkyDungeonCreateRectangle(cornerX + 1, cornerY + 1, rad, rad, true, false, 1, false); - KinkyDungeonPatrolPoints.push({x: cornerX + 1 + 2, y: cornerY + 1 + 2}); - KinkyDungeonMapSet(cornerX + 1+2, cornerY + 1 , KDRandom() < 0.5 ? 'D' : (KDRandom() < 0.5 ? 'g' : 'd')); - KinkyDungeonTilesSet("" + (cornerX + 1+2) + "," + (cornerY + 1), {Type: "Door"}); - KinkyDungeonMapSet(cornerX + 1+2, cornerY + 1+4 , KDRandom() < 0.5 ? 'D' : (KDRandom() < 0.5 ? 'g' : 'd')); - KinkyDungeonTilesSet("" + (cornerX + 1+2) + "," + (cornerY + 1+4), {Type: "Door"}); - - KinkyDungeonMapSet(cornerX + 1+1, cornerY + 1+1 , KDRandom() < 0.6 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); - if (KinkyDungeonMapGet(cornerX + 1+1, cornerY + 1+1) == 'C') - KinkyDungeonTilesSet((cornerX + 1 + 1) + "," + (cornerY + 1 + 1), {Loot: "storage", Roll: KDRandom()}); - KinkyDungeonMapSet(cornerX + 1+1, cornerY + 1+2 , KDRandom() < 0.5 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); - if (KinkyDungeonMapGet(cornerX + 1+1, cornerY + 1+2) == 'C') - KinkyDungeonTilesSet((cornerX + 1 + 1) + "," + (cornerY + 1 + 2), {Loot: "storage", Roll: KDRandom()}); - KinkyDungeonMapSet(cornerX + 1+1, cornerY + 1+3 , KDRandom() < 0.7 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); - if (KinkyDungeonMapGet(cornerX + 1+1, cornerY + 1+3) == 'C') - KinkyDungeonTilesSet((cornerX + 1 + 1) + "," + (cornerY + 1 + 3), {Loot: "storage", Roll: KDRandom()}); - KinkyDungeonMapSet(cornerX + 1+3, cornerY + 1+1 , KDRandom() < 0.5 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); - if (KinkyDungeonMapGet(cornerX + 1+3, cornerY + 1+1) == 'C') - KinkyDungeonTilesSet((cornerX + 1 + 3) + "," + (cornerY + 1 + 1), {Loot: "storage", Roll: KDRandom()}); - KinkyDungeonMapSet(cornerX + 1+3, cornerY + 1+2 , KDRandom() < 0.75 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); - if (KinkyDungeonMapGet(cornerX + 1+3, cornerY + 1+2) == 'C') - KinkyDungeonTilesSet((cornerX + 1 + 3) + "," + (cornerY + 1 + 2), {Loot: "storage", Roll: KDRandom()}); - KinkyDungeonMapSet(cornerX + 1+3, cornerY + 1+3 , KDRandom() < 0.5 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); - if (KinkyDungeonMapGet(cornerX + 1+3, cornerY + 1+3) == 'C') - KinkyDungeonTilesSet((cornerX + 1 + 3) + "," + (cornerY + 1 + 3), {Loot: "storage", Roll: KDRandom()}); - if (KDRandom() < 0.5) { - if (KDRandom() < 0.75) - spawnPoints.push({x:cornerX + 1+2, y:cornerY + 1+3, required:["beast"], AI: "guard"}); - else if (KDRandom() < 0.5) - spawnPoints.push({x:cornerX + 1+2, y:cornerY + 1+3, required:["human"], AI: "guard"}); - else - spawnPoints.push({x:cornerX + 1+2, y:cornerY + 1+3, required:["mold", "spawner"], tags: ["mold"], AI: "guard"}); - } - break; - } - case "GuardedChest": { - let chests = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]].chestcount ? KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]].chestcount : 6; - if ((!favoringPOI && KDRandom() < 0.7) || KinkyDungeonBoringGet(cornerX + 1, cornerY + 1) < 3 || chestlist.length >= chests) skip = true; - else { - // Hollow out a 3x3 area for the chest - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, false); - // Place doors around pairs - KDCreateDoors(cornerX - 1, cornerY - 1, radius + 2, radius + 2); - KDPlaceChest(cornerX, cornerY, radius, chestlist, spawnPoints); - } - break; - } - case "LargeGuardedChest": { - let chests = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]].chestcount ? KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]].chestcount : 6; - if ((!favoringPOI && KDRandom() < 0.7) || KinkyDungeonBoringGet(cornerX + 1, cornerY + 1) < 3 || chestlist.length >= chests) skip = true; - else { - // Hollow out a big area - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, false); - KinkyDungeonCreateRectangle(cornerX, cornerY - 1, radius, 1, false, false, 0, false); - KinkyDungeonCreateRectangle(cornerX, cornerY + radius, radius, 1, false, false, 0, false); - KinkyDungeonCreateRectangle(cornerX - 1, cornerY, 1, radius, false, false, 0, false); - KinkyDungeonCreateRectangle(cornerX + radius, cornerY, 1, radius, false, false, 0, false); - // Place doors around pairs - KDCreateDoors(cornerX - 2, cornerY - 2, radius + 4, radius + 4); - KDPlaceChest(cornerX, cornerY, radius, chestlist, spawnPoints); - } - break; - } - case "BanditPrison": { - if (KinkyDungeonBoringGet(cornerX + 1, cornerY + 1) < 3) skip = true; - else { - // Hollow out a 2x2 area for the chest - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, false); - // Place the chest - DialogueCreateEnemy(cornerX+1, cornerY+1, "PrisonerBandit"); - //spawnPoints.push({x:cornerX, y:cornerY, required:["prisoner"], tags: ["bandit"], priority: true}); - // Place the guards - spawnPoints.push({x:cornerX, y:cornerY, required:["bountyhunter"], tags: ["human"], AI: "guard"}); - spawnPoints.push({x:cornerX+2, y:cornerY, required:["bountyhunter"], tags: ["human"], AI: "guard"}); - spawnPoints.push({x:cornerX, y:cornerY+2, required:["bountyhunter"], tags: ["human"], AI: "guard"}); - spawnPoints.push({x:cornerX+2, y:cornerY+2, required:["bountyhunter"], tags: ["human"], AI: "guard"}); - } - break; - } - case "QuadCell": { - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 1, true); - KinkyDungeonPatrolPoints.push({x: cornerX + 3, y: cornerY + 3}); - for (let X = cornerX; X < cornerX + radius; X++) { - KinkyDungeonMapSet(X, cornerY , '1'); - KinkyDungeonMapSet(X, cornerY+2 , '1'); - KinkyDungeonMapSet(X, cornerY+4 , '1'); - KinkyDungeonMapSet(X, cornerY+6, '1'); - } - KinkyDungeonMapSet(cornerX, cornerY+1, '1'); - KinkyDungeonMapSet(cornerX+3, cornerY+1, '1'); - KinkyDungeonMapSet(cornerX+6, cornerY+1, '1'); - KinkyDungeonMapSet(cornerX, cornerY+5, '1'); - KinkyDungeonMapSet(cornerX+3, cornerY+5, '1'); - KinkyDungeonMapSet(cornerX+6, cornerY+5, '1'); - KinkyDungeonMapSet(cornerX+2, cornerY+2, 'b'); - KinkyDungeonMapSet(cornerX+4, cornerY+2, 'b'); - KinkyDungeonMapSet(cornerX+2, cornerY+4, 'b'); - KinkyDungeonMapSet(cornerX+4, cornerY+4, 'b'); - - KinkyDungeonMapSet(cornerX + 2, cornerY + 1, 'B'); - KinkyDungeonMapSet(cornerX + 4, cornerY + 1, 'B'); - KinkyDungeonMapSet(cornerX + 2, cornerY + 5, 'B'); - KinkyDungeonMapSet(cornerX + 4, cornerY + 5, 'B'); - if (KinkyDungeonStatsChoice.has("Nowhere")) { - if (KDRandom() < 0.5) - KinkyDungeonTilesSet((cornerX + 2) + "," + (cornerY + 1), { - Type: "Trap", - Trap: "BedTrap", - }); - if (KDRandom() < 0.5) - KinkyDungeonTilesSet((cornerX + 4) + "," + (cornerY + 1), { - Type: "Trap", - Trap: "BedTrap", - }); - if (KDRandom() < 0.5) - KinkyDungeonTilesSet((cornerX + 2) + "," + (cornerY + 5), { - Type: "Trap", - Trap: "BedTrap", - }); - if (KDRandom() < 0.5) - KinkyDungeonTilesSet((cornerX + 4) + "," + (cornerY + 5), { - Type: "Trap", - Trap: "BedTrap", - }); - } - - let l = KinkyDungeonMapGet(cornerX+1, cornerY+2) == 'D' ? "Red" : undefined; - KinkyDungeonMapSet(cornerX+1, cornerY+2, KDRandom() < 0.75 ? 'D' : 'd'); KinkyDungeonTilesSet("" + (cornerX+1) + "," + (cornerY + 2), {Type: "Door", NoTrap: true, OffLimits: true, Lock: l}); - if (l && KDRandom() < 0.5) - spawnPoints.push({x:cornerX + 2, y:cornerY + 1, required: ["human"], AI: "guard"}); - else if (l && KDRandom() < 0.6 + (KDGameData.RoomType == "Jail" ? 0.35 : 0)) { - SetpieceSpawnPrisoner(cornerX+2, cornerY+1); - } - - l = KinkyDungeonMapGet(cornerX+5, cornerY+2) == 'D' ? "Red" : undefined; - KinkyDungeonMapSet(cornerX+5, cornerY+2, KDRandom() < 0.75 ? 'D' : 'd'); KinkyDungeonTilesSet("" + (cornerX+5) + "," + (cornerY + 2), {Type: "Door", NoTrap: true, OffLimits: true, Lock: l}); - if (l && KDRandom() < 0.5) - spawnPoints.push({x:cornerX + 4, y:cornerY + 1, required: ["human"], AI: "guard"}); - else if (l && KDRandom() < 0.6 + (KDGameData.RoomType == "Jail" ? 0.35 : 0)) { - SetpieceSpawnPrisoner(cornerX+4, cornerY+1); - } - - l = KinkyDungeonMapGet(cornerX+1, cornerY+4) == 'D' ? "Red" : undefined; - KinkyDungeonMapSet(cornerX+1, cornerY+4, KDRandom() < 0.75 ? 'D' : 'd'); KinkyDungeonTilesSet("" + (cornerX+1) + "," + (cornerY + 4), {Type: "Door", NoTrap: true, OffLimits: true, Lock: l}); - if (l && KDRandom() < 0.5) - spawnPoints.push({x:cornerX + 2, y:cornerY + 5, required: ["human"], AI: "guard"}); - else if (l && KDRandom() < 0.6 + (KDGameData.RoomType == "Jail" ? 0.35 : 0)) { - SetpieceSpawnPrisoner(cornerX+2, cornerY+5); - } - - l = KinkyDungeonMapGet(cornerX+5, cornerY+4) == 'D' ? "Red" : undefined; - KinkyDungeonMapSet(cornerX+5, cornerY+4, KDRandom() < 0.75 ? 'D' : 'd'); KinkyDungeonTilesSet("" + (cornerX+5) + "," + (cornerY + 4), {Type: "Door", NoTrap: true, OffLimits: true, Lock: l}); - if (l && KDRandom() < 0.5) - spawnPoints.push({x:cornerX + 4, y:cornerY + 5, required: ["human"], AI: "guard"}); - else if (l && KDRandom() < 0.6 + (KDGameData.RoomType == "Jail" ? 0.35 : 0)) { - SetpieceSpawnPrisoner(cornerX+4, cornerY+5); - } - - break; - } - case "Cache": { - let rad = radius - 2; - KinkyDungeonCreateRectangle(cornerX + 1, cornerY + 1, rad, rad, true, false, 1, true); - KinkyDungeonPatrolPoints.push({x: cornerX, y: cornerY + 3}); - KinkyDungeonMapSet(cornerX + 1 + Math.floor(rad/2), cornerY + 1 + Math.floor(rad/2), 'C'); - KinkyDungeonTilesSet((cornerX + 1 + Math.floor(rad/2)) + "," + (cornerY + 1 + Math.floor(rad/2)), {Loot: "cache", Faction: "Bandit", Roll: KDRandom()}); - KDTorch(cornerX + 1 + Math.floor(rad/2), cornerY + 1, altType, MapParams); - KinkyDungeonMapSet(cornerX + 1, cornerY + 1 + Math.floor(rad/2) - 1, 'b'); - KinkyDungeonMapSet(cornerX + 1, cornerY + 1 + Math.floor(rad/2) + 1, 'b'); - KinkyDungeonMapSet(cornerX + 1, cornerY + 1 + Math.floor(rad/2), 'D'); - spawnPoints.push({x:cornerX, y:cornerY + 1 + Math.floor(rad/2)-1, required: ["cacheguard"], tags: ["bandit"], AI: "guard"}); - spawnPoints.push({x:cornerX, y:cornerY + 1 + Math.floor(rad/2)+1, required: ["cacheguard"], tags: ["bandit"], AI: "guard"}); - KinkyDungeonTilesSet((cornerX + 1) + "," + (cornerY + 1 + Math.floor(rad/2)), {Type: "Door", Lock: "Red", OffLimits: true, ReLock: true}); - break; - } - case "ForbiddenHall": { - //KinkyDungeonCreateRectangle(cornerX + 1, cornerY, radius, radius, false, false, 1, false); - KinkyDungeonCreateRectangle(cornerX+1, cornerY, radius-2, radius, true, false, 1, true); - - for (let X = cornerX + Math.floor(radius/2) - 1; X <= cornerX + Math.floor(radius/2) + 1; X++) { - for (let Y = cornerY + 1; Y < cornerY + radius - 1; Y++) { - if (!(X == cornerX + Math.floor(radius/2) && Y == cornerY + 1) && !(X == cornerX + Math.floor(radius/2) && Y == cornerY + radius - 2)) { - if (KDRandom() < 0.65) { - trapLocations.push({x: X, y: Y}); - } else if (X != cornerX + Math.floor(radius/2) && Y >= cornerY + 1) { - KinkyDungeonMapSet(X, Y, '2'); - } - } - } - } - - KinkyDungeonMapSet(cornerX + Math.floor(radius/2), cornerY + 1, 'C'); - KinkyDungeonMapSet(cornerX + Math.floor(radius/2) + 1, cornerY + radius - 1, '1'); - KinkyDungeonMapSet(cornerX + Math.floor(radius/2) - 1, cornerY + radius - 1, '1'); - KinkyDungeonMapSet(cornerX + Math.floor(radius/2), cornerY + radius - 1, '2'); - - KinkyDungeonTilesSet((cornerX + Math.floor(radius/2)) + "," + (cornerY + 1), {Loot: "gold", Faction: "AncientRobot", Roll: KDRandom()}); - - // Trapped Door - KinkyDungeonMapSet(cornerX + Math.floor(radius/2), cornerY + radius - 1, 'd'); - KinkyDungeonTilesSet((cornerX + Math.floor(radius/2)) + "," + (cornerY + radius - 1), { - Type: "Door", - StepOffTrap: "DoorLock", - SpawnMult: 0.5, - Lifetime: 12, - StepOffTiles: [ - (cornerX + Math.floor(radius/2) - 1) + "," + (cornerY + radius - 2), - (cornerX + Math.floor(radius/2)) + "," + (cornerY + radius - 2), - (cornerX + Math.floor(radius/2)) + 1 + "," + (cornerY + radius - 2) - ]}); - console.log("Created forbidden hall"); - break; - } - case "ForbiddenChest": { - KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, true); - KinkyDungeonCreateRectangle(cornerX, cornerY - 1, radius, 1, false, false, 0, false); - KinkyDungeonCreateRectangle(cornerX, cornerY + radius, radius, 1, false, false, 0, false); - KinkyDungeonCreateRectangle(cornerX - 1, cornerY, 1, radius, false, false, 0, false); - KinkyDungeonCreateRectangle(cornerX + radius, cornerY, 1, radius, false, false, 0, false); - // Place doors around pairs - KDCreateDoors(cornerX - 2, cornerY - 2, radius + 4, radius + 4); - KinkyDungeonPatrolPoints.push({x: cornerX + 2, y: cornerY + 2}); - - for (let X = cornerX; X < cornerX + radius; X++) { - for (let Y = cornerY; Y < cornerY + radius; Y++) { - if (!(X == cornerX + 1 && Y == cornerY + 1)) { - trapLocations.push({x: X, y: Y}); - } - } - } - - KinkyDungeonMapSet(cornerX + Math.floor(radius/2), cornerY + Math.floor(radius/2), 'C'); - - KinkyDungeonTilesSet((cornerX + Math.floor(radius/2)) + "," + (cornerY + Math.floor(radius/2)), {Loot: "lessergold", Roll: KDRandom()}); - console.log("Created lesser gold chest"); - break; - } - } - - if (!skip) - KinkyDungeonSpecialAreas.push({x: cornerX + Math.floor(radius/2), y: cornerY + Math.floor(radius/2), radius: Math.ceil(radius/2)}); - else if (favoringPOI) - favoringPOI.used = false; - - if ( TestMode) { - console.log("Created " + Piece.Name); - } - return {Pass: true, Traps: trapLocations}; -} - -/** - * This function unblocks movement to ensure a map is pathable - * @param {number} x - * @param {number} y - * @returns {boolean} - whether it's possible - */ -function KDUnblock(x, y) { - let blocked = false; - let blockTiles = "1X"; - let t = KinkyDungeonMapGet(x, y-1); - let tr = KinkyDungeonMapGet(x+1, y-1); - let tl = KinkyDungeonMapGet(x-1, y-1); - let r = KinkyDungeonMapGet(x+1, y); - let l = KinkyDungeonMapGet(x-1, y); - let b = KinkyDungeonMapGet(x, y-1); - let br = KinkyDungeonMapGet(x+1, y+1); - let bl = KinkyDungeonMapGet(x-1, y+1); - - let m_t = KinkyDungeonMovableTilesSmartEnemy.includes(t); - let m_tr = KinkyDungeonMovableTilesSmartEnemy.includes(tr); - let m_tl = KinkyDungeonMovableTilesSmartEnemy.includes(tl); - let m_r = KinkyDungeonMovableTilesSmartEnemy.includes(r); - let m_l = KinkyDungeonMovableTilesSmartEnemy.includes(l); - let m_b = KinkyDungeonMovableTilesSmartEnemy.includes(b); - let m_br = KinkyDungeonMovableTilesSmartEnemy.includes(br); - let m_bl = KinkyDungeonMovableTilesSmartEnemy.includes(bl); - - if (!blocked && m_t && m_b && !m_r && !m_l) { - if (KDRandom() < 0.5 && blockTiles.includes(r)) { - m_r = true; - KinkyDungeonMapSet(x + 1, y, '2'); // Set to brickwork - } else if (blockTiles.includes(l)) { - m_l = true; - KinkyDungeonMapSet(x - 1, y, '2'); // Set to brickwork - } else blocked = true; // Cancel - } - if (!blocked && m_r && m_l && !m_t && !m_b) { - if (KDRandom() < 0.5 && blockTiles.includes(b)) { - m_b = true; - KinkyDungeonMapSet(x, y + 1, '2'); // Set to brickwork - } else if (blockTiles.includes(t)) { - m_t = true; - KinkyDungeonMapSet(x, y - 1, '2'); // Set to brickwork - } else blocked = true; // Cancel - } - if (!blocked && m_tr && m_br && !m_r) { - if (blockTiles.includes(r)) { - m_r = true; - KinkyDungeonMapSet(x + 1, y, '2'); // Set to brickwork - } else if (!m_t && !m_l && !m_b) { - blocked = true; - } - } - if (!blocked && m_tl && m_bl && !m_l) { - if (blockTiles.includes(l)) { - m_l = true; - KinkyDungeonMapSet(x - 1, y, '2'); // Set to brickwork - } else if (!m_t && !m_r && !m_b) { - blocked = true; - } - } - if (!blocked && m_tl && m_tr && !m_t) { - if (blockTiles.includes(t)) { - m_t = true; - KinkyDungeonMapSet(x, y - 1, '2'); // Set to brickwork - } else if (!m_l && !m_b && !m_r) { - blocked = true; - } - } - if (!blocked && m_bl && m_br && !m_b) { - if (blockTiles.includes(b)) { - m_b = true; - KinkyDungeonMapSet(x, y + 1, '2'); // Set to brickwork - } else if (!m_l && !m_t && !m_r) { - blocked = true; - } - } - return !blocked; -} - -function SetpieceSpawnPrisoner(x, y) { - let Enemy = KinkyDungeonGetEnemy(["imprisonable", - "ropeAnger", "ropeRage", - "metalAnger", "metalRage", - "latexAnger", "latexRage", - "conjureAnger", "conjureRage", - "elementsAnger", "elementsRage", - "illusionAnger", "illusionRage", - "leatherAnger", "leatherRage", - "willAnger", "willRage"], MiniGameKinkyDungeonLevel * 2, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], KinkyDungeonMapGet(x, y), ["imprisonable"]); - if (Enemy) { - let e = DialogueCreateEnemy(x, y, Enemy.name); - e.faction = "Prisoner"; - e.boundLevel = e.hp * 11; - e.specialdialogue = "PrisonerJail"; - e.items = []; - KinkyDungeonSetEnemyFlag(e, "noswap", -1); - KinkyDungeonSetEnemyFlag(e, "imprisoned", -1); - KDProcessCustomPatron(Enemy, e); - } -} - - -function KDTorch(X, Y, altType, MapParams) { - let torchreplace = (altType && altType.torchreplace) ? altType.torchreplace : (MapParams.torchreplace ? MapParams.torchreplace : null); - KDCreateEffectTile(X, Y + 1, { - name: torchreplace ? torchreplace.sprite : "Torch", - duration: 9999, - }, 0); -} - -function KDChest(X, Y, loot = "chest", faction = "") { - KinkyDungeonMapSet(X, Y, 'C'); - KinkyDungeonTilesSet((X) + "," + (Y), {Loot: loot, Faction: faction, Roll: KDRandom()}); -} - -function KDCreateDoors(Left, Top, Width, Height, openChance = 0, convertDoodads = true) { - let doors = {}; - - // Create double doors - let rows = [Top, Top + Height - 1]; - for (let r of rows) { - // Ignore rows that are out of bounds - if (r > 0 && r < KinkyDungeonGridHeight - 1) { - for (let x = Left; x < Left + Width - 3; x++) { - if (x > 0 && x < KinkyDungeonGridWidth - 4 - && (KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(x, r)) || (convertDoodads && KinkyDungeonMapGet(x, r) == 'X')) - && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(x+1, r)) - && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(x+2, r)) - && (KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(x+3, r)) || (convertDoodads && KinkyDungeonMapGet(x+3, r) == 'X'))) { - if ((KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 1, r - 1)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 1, r + 1))) - || (KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 2, r - 1)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 2, r + 1)))) { - doors[(x + 1) + "," + r] = {x: x + 1, y: r}; - doors[(x + 2) + "," + r] = {x: x + 2, y: r}; - } - } - } - } - } - let cols = [Left, Left + Width - 1]; - for (let c of cols) { - // Ignore rows that are out of bounds - if (c > 0 && c < KinkyDungeonGridWidth - 1) { - for (let y = Top; y < Top + Height - 3; y++) { - if (y > 0 && y < KinkyDungeonGridHeight - 4 - && (KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(c, y)) || (convertDoodads && KinkyDungeonMapGet(c, y) == 'X')) - && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(c, y + 1)) - && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(c, y + 2)) - && (KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(c, y + 3)) || (convertDoodads && KinkyDungeonMapGet(c, y + 3) == 'X'))) { - if ((KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(c - 1, y + 1)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(c + 1, y + 1))) - || (KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(c - 1, y + 2)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(c + 1, y + 2)))) { - doors[c + "," + (y + 1)] = {x: c, y: y + 1}; - doors[c + "," + (y + 2)] = {x: c, y: y + 2}; - } - } - } - } - } - - // Create singleton doors - - - // Place the doors - for (let d of Object.values(doors)) { - let tile = KDRandom() < openChance ? 'd' : 'D'; - KinkyDungeonMapSet(d.x, d.y, tile); - KinkyDungeonTilesSet(d.x + "," + d.y, {Type: "Door", NoTrap: true}); - } - -} - -function KDPlaceChest(cornerX, cornerY, radius, chestlist, spawnPoints, NoAddToChestList) { - // Determine faction - let factionList = [ - {faction: "Bandit", tags: ["bandit"], rtags: ["bandit"], ftags: ["miniboss", "boss"]}, - {faction: "Dragon", tags: ["dragon"], rtags: ["dragon"], ftags: ["miniboss", "boss"]}, - {faction: "AncientRobot", tags: ["robot"], rtags: ["robot"], ftags: ["miniboss", "boss"]}, - {faction: "Maidforce", tags: ["maid"], rtags: ["maid"], ftags: ["miniboss", "boss"]}, - {faction: "Bountyhunter", tags: ["bountyhunter"], rtags: ["bountyhunter"], ftags: ["miniboss", "boss"]}, - {faction: "Dressmaker", tags: ["dressmaker"], rtags: ["dressmaker"], ftags: ["miniboss", "boss"]}, - {faction: "Witch", tags: ["witch", "apprentice", "skeleton"], rtags: ["witch", "apprentice", "skeleton"], ftags: ["miniboss", "boss"]}, - {faction: "Apprentice", tags: ["apprentice"], rtags: ["apprentice"], ftags: ["miniboss", "boss"]}, - //{faction: "Mushy", tags: ["mushroom"], rtags: ["mushy"], ftags: ["miniboss", "boss"]}, - {faction: "Nevermere", tags: ["nevermere"], rtags: ["nevermere"], ftags: ["miniboss", "boss"]}, - {faction: "Bast", tags: ["mummy"], rtags: ["mummy"], ftags: ["miniboss", "boss"]}, - {faction: "Elf", tags: ["elf"], rtags: ["elf"], ftags: ["miniboss", "boss"]}, - {faction: "Elemental", tags: ["elemental", "witch"], rtags: ["elemental", "witch"], ftags: ["miniboss", "boss"]}, - {faction: "Alchemist", tags: ["alchemist"], rtags: ["alchemist"], ftags: ["miniboss", "boss"]}, - ]; - let factionSelected = factionList[Math.floor(KDRandom() * factionList.length)]; - // Place the chest - if (!NoAddToChestList) { - chestlist.push({x: cornerX + 1, y: cornerY + 1, priority: true, Faction: factionSelected.faction, NoTrap: true}); - } - // Place the guards - spawnPoints.push({x:cornerX, y:cornerY, required:[factionSelected.rtags[Math.floor(KDRandom()*factionSelected.rtags.length)]], ftags: factionSelected.ftags, tags: factionSelected.tags, AI: "guard"}); - spawnPoints.push({x:cornerX+2, y:cornerY, required:[factionSelected.rtags[Math.floor(KDRandom()*factionSelected.rtags.length)]], ftags: factionSelected.ftags, tags: factionSelected.tags, AI: "guard"}); - spawnPoints.push({x:cornerX, y:cornerY+2, required:[factionSelected.rtags[Math.floor(KDRandom()*factionSelected.rtags.length)]], ftags: factionSelected.ftags, tags: factionSelected.tags, AI: "guard"}); - spawnPoints.push({x:cornerX+2, y:cornerY+2, required:[factionSelected.rtags[Math.floor(KDRandom()*factionSelected.rtags.length)]], ftags: factionSelected.ftags, tags: factionSelected.tags, AI: "guard"}); - - return factionSelected.faction; -} \ No newline at end of file diff --git a/Game/KinkyDungeonShrine.js b/Game/KinkyDungeonShrine.js deleted file mode 100644 index 5c1af7b40..000000000 --- a/Game/KinkyDungeonShrine.js +++ /dev/null @@ -1,752 +0,0 @@ -"use strict"; - -/** - * Base costs for all the shrines. Starts at this value, increases thereafter - * @type {Record} - */ -let KinkyDungeonShrineBaseCosts = { - //"Charms": 25, - "Leather": 40, - "Metal": 60, - "Rope": 20, - "Latex": 40, - "Will": 20, - "Elements": 200, - "Conjure": 200, - "Illusion": 200, -}; - -let KDWillShrineWill = 0.25; -let KinkyDungeonOrbAmount = 0; -let KDShrineRemoveCount = 30; -let KDMaxGoddessBonus = 0.2; -let KDMinGoddessBonus = 0.15; - -/** - * Cost growth, overrides the default amount - * @type {Record} - */ -let KinkyDungeonShrineBaseCostGrowth = { - "Elements": 2, - "Conjure": 2, - "Illusion": 2, -}; - -let KinkyDungeonShopIndex = 0; - -let KinkyDungeonShrinePoolChancePerUse = 0.2; - -/** - * Current costs multipliers for shrines - * @type {Record} - */ -let KinkyDungeonShrineCosts = {}; - -let KinkyDungeonShrineTypeRemove = ["Charms", "Leather", "Metal", "Rope", "Latex", "Gags", "Blindfolds", "Boots"]; // These shrines will always remove restraints associated with their shrine - -function KinkyDungeonShrineInit() { - KinkyDungeonShrineCosts = {}; - KDGameData.PoolUsesGrace = 3; - - KinkyDungeonInitReputation(); - -} - - -/** - * - * @param {string} Name - * @returns {string} - */ -function KDGoddessColor(Name) { - let color = "#ffffff"; - if (Name == "Illusion") color = "#8154FF"; - else if (Name == "Conjure") color = "#D4AAFF"; - else if (Name == "Elements") color = "#FF0000"; - else if (Name == "Latex") color = "#2667FF"; - else if (Name == "Leather") color = "#442E1E"; - else if (Name == "Metal") color = "#222222"; - else if (Name == "Rope") color = "#7C4926"; - else if (Name == "Will") color = "#23FF44"; - return color; -} - -function KinkyDungeonShrineAvailable(type) { - if (type == "Commerce") { - if (KDGameData.ShopItems.length > 0) return true; - else return false; - } - if (KinkyDungeonShrineTypeRemove.includes(type) && KinkyDungeonGetRestraintsWithShrine(type).length > 0) return true; - else if ((type == "Elements" || type == "Illusion" || type == "Conjure")) return true; - else if (type == "Will" && (KinkyDungeonStatMana < KinkyDungeonStatManaMax || KinkyDungeonStatManaPool < KinkyDungeonStatManaPoolMax || KinkyDungeonStatWill < KinkyDungeonStatWillMax)) return true; - - return false; -} - -let KDLevelsPerCheckpoint = 4; - -/** - * - * @param {number} Level - */ -function KinkyDungeonGenerateShop(Level) { - KDGameData.PoolUses = Math.min(KDGameData.PoolUses, KinkyDungeonStatsChoice.get("Blessed") ? 0 : 1); - KinkyDungeonShopIndex = 0; - KDGameData.ShopItems = []; - let items_mid = 0; - let items_high = 0; - let itemCount = 8 + Math.floor(KDRandom() * 3); - if (KinkyDungeonStatsChoice.has("Supermarket")) { - items_mid = -1; - items_high = -1; - itemCount += 2; - } - for (let I = itemCount; I > 0; I--) { - let Rarity = 0; - if (items_high < 3) {Rarity = Math.floor(Level/KDLevelsPerCheckpoint); items_high += 1;} - else if (items_mid < 5) {Rarity += Math.round(KDRandom() * 3); items_mid += 1;} - - let item = KinkyDungeonGetShopItem(Level, Rarity, true); - if (item) - KDGameData.ShopItems.push({name: item.name, shoptype: item.shoptype, consumable: item.consumable, quantity: item.quantity, rarity: item.rarity, cost: item.cost}); - } - KDGameData.ShopItems.sort(function(a, b){return a.rarity-b.rarity;}); -} - -/** - * - * @param {any} item - * @param {boolean} [noScale] - * @param {boolean} [sell] - * @returns {number} - */ -function KinkyDungeonItemCost(item, noScale, sell) { - if (item.cost != null) return item.cost; - if (item.rarity != null) { - let rarity = item.rarity; - if (item.costMod) rarity += item.costMod; - let costt = 5 * Math.round((1 + MiniGameKinkyDungeonLevel/KDLevelsPerCheckpoint/2.5 * (noScale ? 0 : 1))*(50 + 2 * rarity * rarity * 20)/5); - if (costt > 100) costt = 10 * Math.round(costt / 10); - if (KinkyDungeonStatsChoice.has("PriceGouging") && !sell) { - costt *= 5; - } - return costt; - } - let costs = 15; - if (KinkyDungeonStatsChoice.has("PriceGouging") && !sell) { - costs *= 5; - } - return costs; -} - -function KinkyDungeonShrineCost(type) { - let mult = 1.0; - let growth = 1.0; - let noMult = false; - - if (type == "Commerce" && KinkyDungeonShopIndex < KDGameData.ShopItems.length) { - if (!KDGameData.ShopItems) KDGameData.ShopItems = []; - let item = KDGameData.ShopItems[KinkyDungeonShopIndex]; - return Math.round(KinkyDungeonItemCost(item)); - } else if (KinkyDungeonShrineTypeRemove.includes(type)) { - let rest = KinkyDungeonGetRestraintsWithShrine(type); - let maxPower = 1; - for (let r of rest) { - if (KDRestraint(r).power > maxPower) maxPower = KDRestraint(r).power; - } - mult = Math.sqrt(Math.max(1, Math.min(KDShrineRemoveCount, rest.length))); - mult *= Math.pow(Math.max(1, maxPower), 0.75); - noMult = true; - } else if (type == "Will") { - let value = 0; - value += 120 * (1 - KinkyDungeonStatWill/KinkyDungeonStatWillMax); - value += 70 * (1 - KinkyDungeonStatMana/KinkyDungeonStatManaMax); - return Math.round(Math.round(value/10)*10 * (1 + 0.01 * KinkyDungeonDifficulty)); - } - if (KinkyDungeonShrineBaseCostGrowth[type]) growth = KinkyDungeonShrineBaseCostGrowth[type]; - if (KinkyDungeonShrineCosts[type] > 0 && !noMult) mult = Math.pow(growth, KinkyDungeonShrineCosts[type]); - - if (type == "Conjure" || type == "Illusion" || type == "Elements") - return Math.round(150 * (1 + 0.01 * KinkyDungeonDifficulty)); - - return Math.round(Math.round(KinkyDungeonShrineBaseCosts[type] * mult/10)*10 * (1 + 0.01 * KinkyDungeonDifficulty)); -} - -function KDAddBasic(item) { - if (item.name == "RedKey") { - KinkyDungeonRedKeys += 1; - } else if (item.name == "BlueKey") { - KinkyDungeonBlueKeys += 1; - } else if (item.name == "Lockpick") { - KinkyDungeonLockpicks += 1; - } else if (item.name == "2Lockpick") { - KinkyDungeonLockpicks += 2; - } else if (item.name == "4Lockpick") { - KinkyDungeonLockpicks += 4; - } else if (item.name == "MaidUniform") { - KinkyDungeonInventoryAddOutfit("Maid"); - } else if (item.consumable) { - KinkyDungeonChangeConsumable(KinkyDungeonConsumables[item.consumable], item.quantity); - } -} - -function KinkyDungeonPayShrine(type) { - KinkyDungeonGold -= KinkyDungeonShrineCost(type); - let ShrineMsg = ""; - let rep = 0; - - // TODO shrine effects - if (KinkyDungeonShrineTypeRemove.includes(type)) { - rep = KinkyDungeonRemoveRestraintsWithShrine(type, KDShrineRemoveCount, true); - KinkyDungeonChangeRep("Ghost", -rep); - - ShrineMsg = TextGet("KinkyDungeonPayShrineRemoveRestraints"); - KDSendStatus('goddess', type, 'shrineRemove'); - } else if (type == "Elements" || type == "Illusion" || type == "Conjure") { - ShrineMsg = TextGet("KinkyDungeonPayShrineBuff" + type).replace("SCHOOL", TextGet("KinkyDungeonSpellsSchool" + type)); - if (type == "Elements") { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "ShrineElements", type: "event", maxCount: 10, tags: ["offense", "shrineElements"], aura: "#f1641f", power: 1.5, duration: 9999, events: [ - {trigger: "afterDamageEnemy", type: "ShrineElements", spell: "ArcaneStrike"}, - ]}); - } else if (type == "Conjure") { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "ShrineConjure", type: "event", maxCount: 10, tags: ["defense", "shrineConjure"], aura: "#4572e3", power: 1.5, duration: 9999, events: [ - {trigger: "beforeAttack", type: "CounterattackSpell", spell: "ArcaneStrike", requiredTag: "shrineConjure", prereq: "hit-hostile"}, - ]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "ShrineConjure2", type: "SpellResist", maxCount: 10, tags: ["defense", "shrineConjure"], power: 5, duration: 9999}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "ShrineConjure3", type: "Armor", maxCount: 10, tags: ["defense", "shrineConjure"], power: 5, duration: 9999}); - } else if (type == "Illusion") { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "ShrineIllusion", type: "event", maxCount: 10, tags: ["defense", "shrineIllusion"], aura: "#9052bc", power: 1.5, duration: 9999, events: [ - {trigger: "playerAttack", type: "ShadowStep", time: 6, requiredTag: "shrineIllusion"}, - ]}); - } - KDSendStatus('goddess', type, 'shrineDonate'); - rep = 2.5; - } else if (type == "Will") { - rep = Math.ceil(5 - KinkyDungeonStatMana * 1.5 / KinkyDungeonStatManaMax - KinkyDungeonStatWill * 3.5 / KinkyDungeonStatWillMax); - KinkyDungeonChangeMana(KinkyDungeonStatManaMax, false, 0, false, true); - KinkyDungeonChangeWill(KDWillShrineWill * KinkyDungeonStatWillMax); - KinkyDungeonNextDataSendStatsTime = 0; - - ShrineMsg = TextGet("KinkyDungeonPayShrineHeal"); - KDSendStatus('goddess', type, 'shrineHeal'); - } else if (type == "Commerce") { - let item = KDGameData.ShopItems[KinkyDungeonShopIndex]; - if (item) { - if (item.shoptype == "Consumable") - KinkyDungeonChangeConsumable(KinkyDungeonConsumables[item.name], 1); - else if (item.shoptype == "Weapon") - KinkyDungeonInventoryAddWeapon(item.name); - else if (item.shoptype == "Restraint") { - let restraint = KinkyDungeonGetRestraintByName(item.name); - KinkyDungeonInventoryAdd({name: item.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:restraint.events}); - } - else if (item.shoptype == "Basic") { - KDAddBasic(item); - } - ShrineMsg = TextGet("KinkyDungeonPayShrineCommerce").replace("ItemBought", TextGet("KinkyDungeonInventoryItem" + item.name)); - KDGameData.ShopItems.splice(KinkyDungeonShopIndex, 1); - if (KinkyDungeonShopIndex > 0) KinkyDungeonShopIndex -= 1; - - rep = item.rarity + 1; - KDSendStatus('goddess', type, 'shrineBuy'); - } - } - - if (ShrineMsg) KinkyDungeonSendActionMessage(10, ShrineMsg, "lightblue", 1); - - if (KinkyDungeonShrineCosts[type] > 0) KinkyDungeonShrineCosts[type] = KinkyDungeonShrineCosts[type] + 1; - else KinkyDungeonShrineCosts[type] = 1; - - if (rep != 0) { - KinkyDungeonChangeRep(type, rep); - } -} - -function KinkyDungeonHandleShrine() { - let cost = 0; - let type = KinkyDungeonTargetTile.Name; - - if (KinkyDungeonShrineAvailable(type)) cost = KinkyDungeonShrineCost(type); - - if (type == "Commerce") { - if (cost > 0) { - //if (MouseIn(KDModalArea_x + 410, KDModalArea_y + 25, 112-15, 60) && cost <= KinkyDungeonGold) { - //return true; - //} - //else if (MouseIn(KDModalArea_x + 613, KDModalArea_y + 25, 112, 60)) { - //KinkyDungeonShopIndex = (KinkyDungeonShopIndex + 1) % KDGameData.ShopItems.length; - // - - //return true; - //} - - } - } - return false; -} - -function KinkyDungeonDrawShrine() { - let cost = 0; - let type = KinkyDungeonTargetTile.Name; - KDModalArea = true; - - if (KinkyDungeonShrineAvailable(type)) cost = KinkyDungeonShrineCost(type); - - if (type == "Commerce") { - if (cost == 0) { - DrawTextKD(TextGet("KinkyDungeonLockedShrine"), KDModalArea_x, KDModalArea_y, "#ffffff", KDTextGray2); - } else { - let shopHeight = Math.max(8, KDGameData.ShopItems.length) * 50; - - FillRectKD(kdcanvas, kdpixisprites, "shopbg", { - Left: KDModalArea_x - 25, - Top: KDModalArea_y + 80 - shopHeight, - Width: 900, - Height: shopHeight + 20, - Color: KDTextGray0, - LineWidth: 1, - zIndex: 60, - alpha: 0.4, - }); - // Wrap around shop index to prevent errors - if (KinkyDungeonShopIndex > KDGameData.ShopItems.length) { - KinkyDungeonShopIndex = 0; - } else if (KDGameData.ShopItems.length > 0 && KDGameData.ShopItems[KinkyDungeonShopIndex]) { - // Draw the item and cost - } - - DrawButtonKDEx("shrinebuy", (bdata) => { - KDSendInput("shrineBuy", {type: type, shopIndex: KinkyDungeonShopIndex}); - return true; - }, cost <= KinkyDungeonGold, KDModalArea_x + 550, KDModalArea_y + 25, 200, 60, TextGet("KinkyDungeonCommercePurchase").replace("ItemCost", "" + cost), (cost <= KinkyDungeonGold) ? "#ffffff" : "#ff5555", "", ""); - - if (KDShopBuyConfirm) { - DrawTextFitKD(TextGet("KDShopConfirm"), - KDModalArea_x + 650, KDModalArea_y + 25 - 25, 250, "#88ff88", undefined, 20,); - } - // Draw the list of shop items - let ii = 0; - for (let l of KDGameData.ShopItems) { - if (KDGameData.ShopItems[ii]) { - let index = ii; - DrawButtonKDEx("l.name" + ii, (bdata) => { - KinkyDungeonShopIndex = index; - return true; - }, true, - KDModalArea_x - 20, KDModalArea_y + 40 - ii * 50, 400 + 20 + 20, 45, "", "#444444", "", undefined, false, true, "#000000", undefined, undefined, { - alpha: 0.4 - } - ); - } - DrawTextFitKD(TextGet("KinkyDungeonInventoryItem" + l.name), KDModalArea_x + 175/2, KDModalArea_y + 65 - ii * 50, 200, KDGameData.ShopItems[KinkyDungeonShopIndex].name == l.name ? "white" : KDTextGray3, KDTextGray2, 20); - DrawTextFitKD(TextGet("KinkyDungeonCommerceCost").replace("ItemCost", "" + KinkyDungeonItemCost(l)), KDModalArea_x + 300, KDModalArea_y + 65 - ii * 50, 130, KDGameData.ShopItems[KinkyDungeonShopIndex].name == l.name ? "#ffffff" : KDTextGray3, KDTextGray2, 20); - ii++; - } - let textSplit = KinkyDungeonWordWrap(TextGet("KinkyDungeonInventoryItem" + KDGameData.ShopItems[KinkyDungeonShopIndex].name + "Desc"), 15, 40).split('\n'); - let textSplit2 = KinkyDungeonWordWrap(TextGet("KinkyDungeonInventoryItem" + KDGameData.ShopItems[KinkyDungeonShopIndex].name + "Desc2"), 15, 40).split('\n'); - let i = 0; - let descSpacing = 30; - for (let N = 0; N < textSplit.length; N++) { - DrawTextFitKD(textSplit[N], - KDModalArea_x+650, KDModalArea_y + 120 - shopHeight + i * descSpacing, 380 * (textSplit[N].length / 40), "#ffffff", undefined, 20,); - i++; - } - i += 1; - for (let N = 0; N < textSplit2.length; N++) { - DrawTextFitKD(textSplit2[N], - KDModalArea_x+650, KDModalArea_y + 120 - shopHeight * 50 + i * descSpacing, 380 * (textSplit2[N].length / 40), "#ffffff", undefined, 20,); - i++; - } - // Next button - //DrawButtonVis(KDModalArea_x + 613, KDModalArea_y + 25, 112, 60, TextGet("KinkyDungeonCommerceNext"), "White", "", ""); - - KDModalArea_y = 700 - shopHeight; - KDModalArea_height = shopHeight + 100; - } - } else { - DrawButtonKDEx("shrineUse", (bdata) => { - KDSendInput("shrineUse", {type: type, cost: cost, targetTile: KinkyDungeonTargetTileLocation}); - KinkyDungeonTargetTileLocation = ""; - KinkyDungeonTargetTile = null; - return true; - }, cost > 0, KDModalArea_x, KDModalArea_y + 25, 325, 60, TextGet(cost > 0 ? "KinkyDungeonPayShrine" : "KinkyDungeonPayShrineCant").replace("XXX", "" + cost), cost > 0 ? "#ffffff" : KDTextGray2, "", ""); - DrawButtonKDEx("drinkShrine", (bdata) => { - KDSendInput("shrineDrink", {type: type, targetTile: KinkyDungeonTargetTileLocation}); - return true; - }, true,KDModalArea_x + 350, KDModalArea_y + 25, 200, 60, TextGet("KinkyDungeonDrinkShrine"), (KDCanDrinkShrine(false)) ? "#AAFFFF" : KDTextGray2, "", ""); - DrawButtonKDEx("bottleShrine", (bdata) => { - KDSendInput("shrineBottle", {type: type, targetTile: KinkyDungeonTargetTileLocation}); - return true; - }, true, KDModalArea_x + 575, KDModalArea_y + 25, 200, 60, TextGet("KinkyDungeonBottleShrine"), (KDCanDrinkShrine(true)) ? "#AAFFFF" : KDTextGray2, "", ""); - } -} - -/** - * @type {Record} - */ -let KDGoddessRevengeMobTypes = { - Rope: {require: undefined, requireSingle: ["ropeTrap", "rope"], filter: ["human", "immobile"]}, - Latex: {require: undefined, requireSingle: ["slime", "latexTrap", "latex"], filter: ["human", "immobile"]}, - Metal: {require: undefined, requireSingle: ["metalTrap", "metal"], filter: ["human", "immobile"]}, - Leather: {require: undefined, requireSingle: ["leatherTrap", "leather"], filter: ["human", "immobile"]}, - Elements: {require: ["elemental"], requireSingle: ["fire", "water", "earth", "air"], filter: ["human", "immobile"]}, - Will: {requireSingle: ["nature", "beast"], require: undefined, filter: ["human", "immobile"]}, - Conjure: {require: [], requireSingle: ["book", "ribbon", "familiar"], filter: ["human", "immobile"]}, - Illusion: {require: ["ghost"], requireSingle: ["spooky"], filter: ["immobile"]}, -}; - -/** - * - * @param {number} x - * @param {number} y - * @param {string} Goddess - * @param {number} [mult] - * @param {number} [LevelBoost] - * @returns {number} - */ -function KDSummonRevengeMobs(x, y, Goddess, mult = 1.0, LevelBoost = 2) { - let spawned = 0; - let maxspawn = 1 + Math.round(Math.min(2 + KDRandom() * 2, KinkyDungeonDifficulty/25) + Math.min(2 + KDRandom() * 2, 0.5*MiniGameKinkyDungeonLevel/KDLevelsPerCheckpoint)); - if (mult) maxspawn *= mult; - - let types = KDGoddessRevengeMobTypes[Goddess]; - - let requireTags = types ? types.require : undefined; - let requireSingleTag = types ? types.requireSingle : undefined; - let filter = types ? types.filter : undefined; - - let tags = ["revenge"]; - KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); - - for (let i = 0; i < 30 + maxspawn; i++) { - if (spawned < maxspawn) { - let Enemy = KinkyDungeonGetEnemy( - tags, MiniGameKinkyDungeonLevel + LevelBoost, - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - '0', requireTags, false, undefined, filter, requireSingleTag); - if (Enemy) { - let pass = KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, Enemy.name, 1, 10, false, undefined, i < 24, false, "Ambush", true, 1.5, true, undefined, true, true); - - if (pass) { - if (Enemy.tags.minor) spawned += 0.4; - else spawned += 1; - } - } - } - } - return spawned; -} - -/** - * - * @param {boolean} Bottle - Is this bottling or drinking? - * @returns {boolean} - */ -function KDCanDrinkShrine(Bottle) { - if (Bottle && KinkyDungeonIsHandsBound(true, true, 0.9)) return false; - return !KinkyDungeonTargetTile.drunk && (Bottle || KinkyDungeonStatMana < KinkyDungeonStatManaMax || KinkyDungeonStatManaPool < KinkyDungeonStatManaPoolMax || KinkyDungeonPlayerTags.get("slime")); -} - -function KinkyDungeonShrineAngerGods(Type) { - if (Type == "Elements") { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapGag"), 0, true, KinkyDungeonGenerateLock(true)); - - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("ChainArms"), 2, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("ChainLegs"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibe"), 0, true); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("ChainCrotch"), 0, true, KinkyDungeonGenerateLock(true)); - - } else if (Type == "Latex") { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapGag"), 0, true, KinkyDungeonGenerateLock(true)); - - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("LatexStraitjacket"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("LatexLegbinder"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("LatexBoots"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("LatexCorset"), 0, true, KinkyDungeonGenerateLock(true)); - - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibe"), 0, true); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("ChainCrotch"), 0, true, KinkyDungeonGenerateLock(true)); - - } else if (Type == "Conjure" || Type == "Rope") { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapGag"), 0, true, KinkyDungeonGenerateLock(true)); - - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("StrongMagicRopeArms"), 4, true); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("StrongMagicRopeLegs"), 0, true); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("StrongMagicRopeCrotch"), 2, true); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibe"), 0, true); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("StrongMagicRopeFeet"), 0, true); - - - } else if (Type == "Illusion") { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapGag"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBlindfold"), 0, true, KinkyDungeonGenerateLock(true)); - - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapMittens"), 0, true, KinkyDungeonGenerateLock(true)); - - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibe"), 0, true); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), 0, true, KinkyDungeonGenerateLock(true)); - } else if (Type == "Leather") { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapHarness"), 4, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapGag"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBlindfold"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBoots"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("SturdyLeatherBeltsFeet"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("SturdyLeatherBeltsLegs"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapArmbinder"), 4, true, KinkyDungeonGenerateLock(true)); - } else if (Type == "Metal") { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapGag"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WristShackles"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("AnkleShackles"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("LegShackles"), 0, true, KinkyDungeonGenerateLock(true)); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibe"), 0, true); - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), 0, true, KinkyDungeonGenerateLock(true)); - } else if (Type == "Will") { - KinkyDungeonStatMana = 0; - KinkyDungeonStatStamina = 0; - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("GhostCollar"), 0, true); - } - if (KinkyDungeonGoddessRep[Type] < -45) { - KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, "OrbGuardian", 3 + Math.floor(Math.sqrt(1 + MiniGameKinkyDungeonLevel)), 10, false, 30); - } - KinkyDungeonChangeRep(Type, -10); -} - -function KinkyDungeonGetSetPieces(Dict) { - let ret = []; - for (let sh of Dict) { - if (sh.Type) { - ret.push(sh.Type); - } - } - return ret; -} - -function KinkyDungeonGetMapShrines(Dict) { - let ret = []; - for (let sh of Dict) { - if (sh.Type) { - ret.push(sh.Type); - } - } - return ret; -} - -function KinkyDungeonTakeOrb(Amount, X, Y) { - KinkyDungeonSetFlag("NoDialogue", 3); - KinkyDungeonDrawState = "Orb"; - KinkyDungeonOrbAmount = Amount; - KDOrbX = X; - KDOrbY = Y; -} -function KinkyDungeonDrawOrb() { - - MainCanvas.textAlign = "center"; - DrawTextKD(TextGet("KinkyDungeonOrbIntro" + (KinkyDungeonStatsChoice.get("randomMode") ? "Kinky" : "")), 1250, 200, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonOrbIntro2"), 1250, 250, "#ffffff", KDTextGray2); - let i = 0; - let maxY = 560; - let XX = 500; - let spacing = 60; - let yPad = 150; - MainCanvas.textAlign = "center"; - for (let shrine in KinkyDungeonShrineBaseCosts) { - let value = KinkyDungeonGoddessRep[shrine]; - - if (value != undefined) { - if (spacing * i > maxY) { - if (XX == 0) i = 0; - XX = 600; - } - let color = "#ffff00"; - if (value < -10) { - if (value < -30) color = "#ff0000"; - else color = "#ff8800"; - } else if (value > 10) { - if (value > 30) color = "#00ff00"; - else color = "#88ff00"; - } - DrawButtonVis(canvasOffsetX_ui + XX, yPad + canvasOffsetY_ui + spacing * i - 27, 250, 55, TextGet("KinkyDungeonShrine" + shrine), "white"); - DrawProgressBar(canvasOffsetX_ui + 275 + XX, yPad + canvasOffsetY_ui + spacing * i - spacing/4, 200, spacing/2, 50 + value, color, KDTextGray2); - if (KinkyDungeonShrineBaseCosts[shrine]) - KDDrawRestraintBonus(shrine, canvasOffsetX_ui + 275 + XX - 70, yPad + canvasOffsetY_ui + spacing * i, undefined, 24); - - i++; - } - - } - - DrawButtonVis(canvasOffsetX_ui + 525, yPad + canvasOffsetY_ui + spacing * i, 425, 55, TextGet("KinkyDungeonSurpriseMe"), "white"); - i += 2; - DrawButtonKDEx("cancelorb", (bdata) => { - KinkyDungeonDrawState = "Game"; - return true; - }, true, canvasOffsetX_ui + 525, yPad + canvasOffsetY_ui + spacing * i, 425, 55, TextGet("KinkyDungeonCancel"), "white"); - - MainCanvas.textAlign = "center"; -} - -let KDOrbX = 0; -let KDOrbY = 0; - -function KinkyDungeonHandleOrb() { - let Amount = KinkyDungeonOrbAmount; - let i = 0; - let maxY = 560; - let XX = 500; - let spacing = 60; - let yPad = 150; - for (let shrine in KinkyDungeonShrineBaseCosts) { - let value = KinkyDungeonGoddessRep[shrine]; - - if (value != undefined) { - if (spacing * i > maxY) { - if (XX == 0) i = 0; - XX = 600; - } - if (MouseIn(canvasOffsetX_ui + XX, yPad + canvasOffsetY_ui + spacing * i - 27, 250, 55)) { - KDSendInput("orb", {shrine: shrine, Amount: Amount, x: KDOrbX, y: KDOrbY}); - KinkyDungeonDrawState = "Game"; - return true; - } - i++; - } - - } - - if (MouseIn(canvasOffsetX_ui + 525, yPad + canvasOffsetY_ui + spacing * i, 425, 55)) { - let shrine = Object.keys(KinkyDungeonShrineBaseCosts)[Math.floor(KDRandom() * Object.keys(KinkyDungeonShrineBaseCosts).length)]; - if (KinkyDungeonMapGet(KDOrbX, KDOrbY) == 'O') { - if (KinkyDungeonGoddessRep[shrine] < -45) { - KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, "OrbGuardian", 3 + Math.floor(Math.sqrt(1 + MiniGameKinkyDungeonLevel)), 10, false, 30); - } - KinkyDungeonChangeRep(shrine, Amount * -9); - if (KinkyDungeonStatsChoice.get("randomMode")) { - let spell = null; - let spellList = []; - let maxSpellLevel = 4; - - for (let k of Object.keys(KinkyDungeonSpellList)) { - for (let sp of KinkyDungeonSpellList[k]) { - if (KinkyDungeonCheckSpellPrerequisite(sp) && sp.school == k && !sp.secret) { - for (let iii = 0; iii < maxSpellLevel - sp.level; iii++) { - if (sp.level == 1 && KinkyDungeonStatsChoice.get("Novice")) - spellList.push(sp); - spellList.push(sp); - } - - } - } - } - - - for (let sp of KinkyDungeonSpells) { - for (let S = 0; S < spellList.length; S++) { - if (sp.name == spellList[S].name) { - spellList.splice(S, 1); - S--; - } - } - } - - spell = spellList[Math.floor(KDRandom() * spellList.length)]; - - if (spell) { - KinkyDungeonSpells.push(spell); - if (spell.autoLearn) { - for (let sp of spell.autoLearn) { - if (KinkyDungeonSpellIndex(sp) < 0) { - KinkyDungeonSpells.push(KinkyDungeonFindSpell(sp, true)); - } - } - } - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonOrbSpell").replace("SPELL", TextGet("KinkyDungeonSpell" + spell.name)), "lightblue", 2); - } - } else { - KinkyDungeonSpellPoints += Amount; - } - KinkyDungeonMapSet(KDOrbX, KDOrbY, 'o'); - } - - KinkyDungeonDrawState = "Game"; - return true; - } - - - return true; -} - -let KDPerkConfirm = false; -let KDPerkOrbPerks = []; -function KinkyDungeonTakePerk(Amount, X, Y) { - KinkyDungeonSetFlag("NoDialogue", 3); - KDPerkOrbPerks = KinkyDungeonTilesGet(X + "," + Y).Perks; - KinkyDungeonDrawState = "PerkOrb"; - KinkyDungeonOrbAmount = Amount; - KDOrbX = X; - KDOrbY = Y; -} -function KinkyDungeonDrawPerkOrb() { - let bwidth = 350; - let bheight = 64; - let Twidth = 1250; - - MainCanvas.textAlign = "center"; - DrawTextKD(TextGet("KinkyDungeonPerkIntro"), 1250, 200, "#ffffff", KDTextGray2); - DrawTextKD(TextGet("KinkyDungeonPerkIntro2"), 1250, 250, "#ffffff", KDTextGray2); - - let count = 0; - let pspacing = 120; - for (let p of KDPerkOrbPerks) { - DrawTextFitKD(TextGet("KinkyDungeonStat" + KinkyDungeonStatsPresets[p].id), 1250, 350 + count * pspacing, Twidth, "#ffffff", KDTextGray2, 30); - DrawTextFitKD(TextGet("KinkyDungeonStatDesc" + KinkyDungeonStatsPresets[p].id), 1250, 385 + count * pspacing, Twidth, "#ffffff", KDTextGray2, 22); - FillRectKD(kdcanvas, kdpixisprites, "bg_" + KinkyDungeonStatsPresets[p].id, { - Left: 1250-Twidth/2 - 10, - Top: 350 + count * pspacing - 30, - Width: Twidth + 20, - Height: 70 + 20, - Color: KDTextGray0, - LineWidth: 1, - zIndex: 60, - alpha: 0.7, - }); - count += 1; - } - - if (KDPerkConfirm) { - DrawTextFitKD(TextGet("KinkyDungeonPerkConfirm"), 1250, 720, 1300, "#ffffff", KDTextGray2, 30); - } - - DrawButtonKDEx("accept", (bdata) => { - if (KDPerkConfirm) { - KDSendInput("perkorb", {shrine: "perk", perks: KDPerkOrbPerks, Amount: 1, x: KDOrbX, y: KDOrbY}); - KinkyDungeonDrawState = "Game"; - } - KDPerkConfirm = true; - return true; - }, true, 1250 - bwidth/2, 750, bwidth, bheight, TextGet("KinkyDungeonPerkAccept" + (KDPerkConfirm ? "Confirm" : "")), "#ffffff"); - - DrawButtonKDEx("reject", (bdata) => { - KinkyDungeonDrawState = "Game"; - return true; - }, true, 1250 - bwidth/2, 750 + 80, bwidth, bheight, TextGet("KinkyDungeonPerkReject"), "#ffffff"); - - MainCanvas.textAlign = "center"; -} - -function KDGetPosNegColor(value) { - return (value ? (value > 0 ? KDGoodColor : KDCurseColor) : "#dddddd"); -} - -function KDGetGoddessBonus(shrine) { - if (KinkyDungeonGoddessRep[shrine]) { - return KinkyDungeonGoddessRep[shrine] / 50 * (KinkyDungeonGoddessRep[shrine] > 0 ? KDMaxGoddessBonus : KDMinGoddessBonus); - } - return 0; -} - -function KDDrawRestraintBonus(shrine, x, y, width = 100, FontSize, align, zIndex, alpha, forceColor) { - let bonus = KDGetGoddessBonus(shrine); - let color = forceColor ? forceColor : KDGetPosNegColor(bonus); - let str = (bonus >= 0 ? "+" : "") + Math.round(bonus * 100) + "%"; - DrawTextFitKD(str, x, y, width, color, "#000000", FontSize, align, zIndex, alpha); -} \ No newline at end of file diff --git a/Game/KinkyDungeonSpawns.js b/Game/KinkyDungeonSpawns.js deleted file mode 100644 index 9fabc33da..000000000 --- a/Game/KinkyDungeonSpawns.js +++ /dev/null @@ -1,504 +0,0 @@ -"use strict"; - - - -function KinkyDungeonAddTags(tags, Floor) { - let security = (KinkyDungeonGoddessRep.Prisoner + 50); - - - - if (Floor % KDLevelsPerCheckpoint >= 2 || Floor % KDLevelsPerCheckpoint == 0 || KinkyDungeonDifficulty >= 20) tags.push("secondhalf"); - if (Floor % KDLevelsPerCheckpoint >= 3 || Floor % KDLevelsPerCheckpoint == 0 || KinkyDungeonDifficulty >= 40) tags.push("lastthird"); - - let angeredGoddesses = []; - let pleasedGoddessess = []; - - if (KinkyDungeonGoddessRep.Rope < KDANGER) angeredGoddesses.push({tag: "ropeAnger", type: "rope"}); - if (KinkyDungeonGoddessRep.Rope < KDRAGE) angeredGoddesses.push({tag: "ropeRage", type: "rope"}); - if (KinkyDungeonGoddessRep.Leather < KDANGER) angeredGoddesses.push({tag: "leatherAnger", type: "leather"}); - if (KinkyDungeonGoddessRep.Leather < KDRAGE) angeredGoddesses.push({tag: "leatherRage", type: "leather"}); - if (KinkyDungeonGoddessRep.Metal < KDANGER) angeredGoddesses.push({tag: "metalAnger", type: "metal"}); - if (KinkyDungeonGoddessRep.Metal < KDRAGE) angeredGoddesses.push({tag: "metalRage", type: "metal"}); - if (KinkyDungeonGoddessRep.Latex < KDANGER) angeredGoddesses.push({tag: "latexAnger", type: "latex"}); - if (KinkyDungeonGoddessRep.Latex < KDRAGE) angeredGoddesses.push({tag: "latexRage", type: "latex"}); - if (KinkyDungeonGoddessRep.Elements < KDANGER) angeredGoddesses.push({tag: "elementsAnger", type: "elements"}); - if (KinkyDungeonGoddessRep.Elements < KDRAGE) angeredGoddesses.push({tag: "elementsRage", type: "elements"}); - if (KinkyDungeonGoddessRep.Conjure < KDANGER) angeredGoddesses.push({tag: "conjureAnger", type: "conjure"}); - if (KinkyDungeonGoddessRep.Conjure < KDRAGE) angeredGoddesses.push({tag: "conjureRage", type: "conjure"}); - if (KinkyDungeonGoddessRep.Illusion < KDANGER) angeredGoddesses.push({tag: "illusionAnger", type: "illusion"}); - if (KinkyDungeonGoddessRep.Illusion < KDRAGE) angeredGoddesses.push({tag: "illusionRage", type: "illusion"}); - if (KinkyDungeonGoddessRep.Will < KDANGER) angeredGoddesses.push({tag: "willAnger", type: "will"}); - if (KinkyDungeonGoddessRep.Will < KDRAGE) angeredGoddesses.push({tag: "willRage", type: "will"}); - - if (KinkyDungeonGoddessRep.Rope > KDPLEASED) pleasedGoddessess.push({tag: "ropePleased", type: "rope"}); - if (KinkyDungeonGoddessRep.Rope > KDFRIENDLY) pleasedGoddessess.push({tag: "ropeFriendly", type: "rope"}); - if (KinkyDungeonGoddessRep.Leather > KDPLEASED) pleasedGoddessess.push({tag: "leatherPleased", type: "leather"}); - if (KinkyDungeonGoddessRep.Leather > KDFRIENDLY) pleasedGoddessess.push({tag: "leatherFriendly", type: "leather"}); - if (KinkyDungeonGoddessRep.Metal > KDPLEASED) pleasedGoddessess.push({tag: "metalPleased", type: "metal"}); - if (KinkyDungeonGoddessRep.Metal > KDFRIENDLY) pleasedGoddessess.push({tag: "metalFriendly", type: "metal"}); - if (KinkyDungeonGoddessRep.Latex > KDPLEASED) pleasedGoddessess.push({tag: "latexPleased", type: "latex"}); - if (KinkyDungeonGoddessRep.Latex > KDFRIENDLY) pleasedGoddessess.push({tag: "latexFriendly", type: "latex"}); - if (KinkyDungeonGoddessRep.Elements > KDPLEASED) pleasedGoddessess.push({tag: "elementsPleased", type: "elements"}); - if (KinkyDungeonGoddessRep.Elements > KDFRIENDLY) pleasedGoddessess.push({tag: "elementsFriendly", type: "elements"}); - if (KinkyDungeonGoddessRep.Conjure > KDPLEASED) pleasedGoddessess.push({tag: "conjurePleased", type: "conjure"}); - if (KinkyDungeonGoddessRep.Conjure > KDFRIENDLY) pleasedGoddessess.push({tag: "conjureFriendly", type: "conjure"}); - if (KinkyDungeonGoddessRep.Illusion > KDPLEASED) pleasedGoddessess.push({tag: "illusionPleased", type: "illusion"}); - if (KinkyDungeonGoddessRep.Illusion > KDFRIENDLY) pleasedGoddessess.push({tag: "illusionFriendly", type: "illusion"}); - if (KinkyDungeonGoddessRep.Will > KDPLEASED) pleasedGoddessess.push({tag: "willPleased", type: "will"}); - if (KinkyDungeonGoddessRep.Will > KDFRIENDLY) pleasedGoddessess.push({tag: "willFriendly", type: "will"}); - - for (let pair of KDFactionRelations.get("Player").entries()) { - if (pair[1] > 0.5) { - tags.push(pair[0] + "Friendly"); - } else if (pair[1] < -0.5) { - tags.push(pair[0] + "Enemy"); - } - if (pair[1] > 0.75) { - tags.push(pair[0] + "Allied"); - } else if (pair[1] < -0.75) { - tags.push(pair[0] + "Wanted"); - } - if (pair[1] > 0.9) { - tags.push(pair[0] + "Loved"); - } else if (pair[1] < -0.9) { - tags.push(pair[0] + "Hated"); - } - } - - if (angeredGoddesses.length > 0) { - let rage = false; - for (let a of angeredGoddesses) { - if (!rage && a.tag && a.tag.includes("Rage")) { - rage = true; - tags.push("goddessRage"); - break; - } - } - for (let i = 0; i < 2; i++) { - let tag = angeredGoddesses[Math.floor(angeredGoddesses.length * KDRandom())]; - if (tag && !tags.includes(tag.tag)) { - for (let a of angeredGoddesses) { - if (a.type == tag.type) { - tags.push(a.tag); - } - } - } - } - tags.push("goddessAnger"); - } - if (pleasedGoddessess.length > 0) { - let rage = false; - for (let a of pleasedGoddessess) { - if (!rage && a.tag && a.tag.includes("Friend")) { - rage = true; - tags.push("goddessFriendly"); - break; - } - } - for (let i = 0; i < 2; i++) { - let tag = pleasedGoddessess[Math.floor(pleasedGoddessess.length * KDRandom())]; - if (tag && !tags.includes(tag.tag)) { - for (let a of pleasedGoddessess) { - if (a.type == tag.type) { - tags.push(a.tag); - } - } - } - } - tags.push("goddessPleased"); - - } - - - let overrideTags = []; - if (KinkyDungeonGoddessRep.Will < -45) {tags.push("plant"); tags.push("beast");} - if (KinkyDungeonGoddessRep.Metal < -45) tags.push("robot"); - if (KinkyDungeonGoddessRep.Leather < -45) tags.push("bandit"); - if (KinkyDungeonGoddessRep.Illusion < -45) tags.push("ghost"); - if (KinkyDungeonGoddessRep.Conjure < -45) tags.push("witch"); - if (KinkyDungeonGoddessRep.Conjure < -45) tags.push("book"); - if (KinkyDungeonGoddessRep.Elements < -45) tags.push("elemental"); - if (KinkyDungeonGoddessRep.Latex < -45) tags.push("slime"); - if (KinkyDungeonGoddessRep.Rope < -45) tags.push("construct"); - - if (KinkyDungeonGoddessRep.Will >= 0) {tags.push("posWill");} - if (KinkyDungeonGoddessRep.Metal >= 0) tags.push("posMetal"); - if (KinkyDungeonGoddessRep.Leather >= 0) tags.push("posLeather"); - if (KinkyDungeonGoddessRep.Illusion >= 0) tags.push("posIllusion"); - if (KinkyDungeonGoddessRep.Conjure >= 0) tags.push("posConjure"); - if (KinkyDungeonGoddessRep.Elements >= 0) tags.push("posElements"); - if (KinkyDungeonGoddessRep.Latex >= 0) tags.push("posLatex"); - if (KinkyDungeonGoddessRep.Rope >= 0) tags.push("posRope"); - - if (security > 0) tags.push("jailbreak"); - if (security > 40) tags.push("highsecurity"); - - let data = { - tags: tags, - }; - KinkyDungeonSendEvent("calcEnemyTags", data); - - return overrideTags; -} - -let KDPerkToggleTags = [ - "NoNurse", -]; - -/** - * - * @param {string[]} enemytags - * @param {number} Level - * @param {string} Index - * @param {string} Tile - * @param {string[]} [requireTags] - * @param {boolean} [requireHostile] - * @param {Record} [bonusTags] - * @param {string[]} [filterTags] - * @param {string[]} [requireSingleTag] - * @returns {enemy} - */ -function KinkyDungeonGetEnemy(enemytags, Level, Index, Tile, requireTags, requireHostile, bonusTags, filterTags, requireSingleTag) { - let enemyWeightTotal = 0; - let enemyWeights = []; - let tags = Object.assign([], enemytags); - for (let t of KDPerkToggleTags) { - if (KinkyDungeonStatsChoice.get(t)) { - tags.push(t); - } - } - - for (let enemy of KinkyDungeonEnemies) { - let effLevel = Level + 25 * KinkyDungeonNewGame; - let weightMulti = 1.0; - let weightBonus = 0; - - if (!KinkyDungeonStatsChoice.get("arousalMode") && enemy.arousalMode) weightMulti = 0; - - if (enemy.shrines) { - for (let shrine of enemy.shrines) { - if (KinkyDungeonGoddessRep[shrine]) { - let rep = KinkyDungeonGoddessRep[shrine]; - if (rep > 0) weightMulti *= Math.max(0, 1 - rep/100); // ranges from 1 to 0.5 - else if (rep < 0) { - weightMulti = Math.max(weightMulti, Math.max(1, 1 - rep/100)); // ranges from 1 to 2 - weightBonus = Math.max(weightBonus, Math.min(10, -rep/10)); - //effLevel += -rep/2.5; - } - } - } - } - - let noOverride = ["boss", "miniboss", "elite", "minor"]; - let overrideFloor = false; - for (let t of tags) { - if (!enemy.noOverrideFloor && !noOverride.includes(t)) { - // We don't override the floor just for having the seniority tags specified - if (enemy.tags[t]) { - overrideFloor = true; - weightMulti *= 1.25; - } - } else { - // We DO override if the enemy has outOfBoxWeightMult, otherwise we apply a penalty. - if (enemy.outOfBoxWeightMult) { - weightMulti *= 1.25; - } else { - weightMulti *= 0.1; - } - } - } - if (bonusTags) - for (let t of Object.entries(bonusTags)) { - if (enemy.tags[t[0]]) { - weightBonus += t[1].bonus; - weightMulti *= t[1].mult; - } - } - - if (effLevel >= enemy.minLevel && (!enemy.maxLevel || effLevel < enemy.maxLevel) - && (!filterTags || !filterTags.some((tag) => {return enemy.tags[tag];})) - && (!requireHostile || !enemy.faction || KDFactionRelation("Player", enemy.faction) <= -0.5) - && (overrideFloor || enemy.allFloors || !enemy.floors || enemy.floors[Index]) - && (KinkyDungeonGroundTiles.includes(Tile) || !enemy.tags.spawnFloorsOnly)) { - let rt = true; - let rst = false; - if (requireTags) - for (let t of requireTags) { - if (!enemy.tags[t]) {rt = false; break;} - } - if (requireSingleTag) - for (let t of requireSingleTag) { - if (enemy.tags[t]) {rst = true; break;} - } - else rst = true; - if (rt && rst) { - enemyWeights.push({enemy: enemy, weight: enemyWeightTotal}); - let weight = enemy.weight + weightBonus; - if (enemy.terrainTags.increasingWeight) - weight += enemy.terrainTags.increasingWeight * Math.floor(Level/KDLevelsPerCheckpoint); - if (!enemy.terrainTags.grate && tags.includes("grate")) - weight -= 1000; - for (let tag of tags) - if (enemy.terrainTags[tag]) weight += enemy.terrainTags[tag]; - - if (weight > 0) - enemyWeightTotal += Math.max(0, weight*weightMulti); - } - } - } - - let selection = KDRandom() * enemyWeightTotal; - - for (let L = enemyWeights.length - 1; L >= 0; L--) { - if (selection > enemyWeights[L].weight) { - if (enemyWeights[L].enemy.name == "Mimic") console.log("Mimic says boo"); - return enemyWeights[L].enemy; - } - } -} - -/** - * - * @param {string} name - * @returns {enemy} - */ -function KinkyDungeonGetEnemyByName(name) { - return KinkyDungeonEnemies.find(element => element.name == name); -} - -/** - * - * @param {number} x - * @param {number} y - * @param {boolean} noTransgress - * @param {boolean} normalDrops - * @param {string[]} [requireTags] - * @returns {entity} - */ -function KinkyDungeonCallGuard(x, y, noTransgress, normalDrops, requireTags) { - //if (!noTransgress) - // KinkyDungeonAggroAction('call', {}); - let point = KinkyDungeonGetNearbyPoint(x, y, true, undefined, true, true); - if (!point) point = KinkyDungeonGetRandomEnemyPoint(true); - if (point) { - if (!KinkyDungeonJailGuard()) { - // Jail tag - let jt = KDGameData.GuardFaction?.length > 0 ? KinkyDungeonFactionTag[KDGameData.GuardFaction[Math.floor(KDRandom() * KDGameData.GuardFaction.length)]] : "guardCall"; - - let Enemy = KinkyDungeonGetEnemy(["Guard", jt], MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', requireTags ? requireTags : [jt, "jail"], true, undefined, ["gagged"]); - if (!Enemy) { - Enemy = KinkyDungeonGetEnemy(["Guard", jt], MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', [jt, "jail"], false, undefined, ["gagged"]); - if (!Enemy) { - jt = "guardCall"; - Enemy = KinkyDungeonGetEnemy(["Guard", jt], MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], '0', [jt, "jail"], false); - } - } - let guard = {summoned: true, noDrop: !normalDrops, Enemy: Enemy, id: KinkyDungeonGetEnemyID(), - x:KinkyDungeonStartPosition.x, y:KinkyDungeonStartPosition.y, gx: point.x, gy: point.y, - hp: (Enemy && Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0}; - KinkyDungeonSetEnemyFlag(guard, "norep", -1); - KDGameData.KinkyDungeonJailGuard = guard.id; - KDAddEntity(guard); - return guard; - } else { - KinkyDungeonJailGuard().gx = point.x; - KinkyDungeonJailGuard().gy = point.y; - KinkyDungeonJailGuard().gxx = point.x; - KinkyDungeonJailGuard().gyy = point.y; - if (KinkyDungeonFindPath(KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, false, true, KinkyDungeonMovableTilesSmartEnemy) < 15) { - let p = KinkyDungeonGetRandomEnemyPoint(true, true, undefined, 20, 10); - KinkyDungeonJailGuard().x = p.x; - KinkyDungeonJailGuard().y = p.y; - } - return KinkyDungeonJailGuard(); - } - } - return null; -} - -let KinkyDungeonTotalSleepTurns = 0; -let KinkyDungeonSearchTimer = 0; -let KinkyDungeonSearchTimerMin = 60; -let KinkyDungeonFirstSpawn = false; -let KinkyDungeonSearchStartAmount = 30; -let KinkyDungeonSearchHuntersAmount = 90; -let KinkyDungeonSearchEntranceAdjustAmount = 130; -let KinkyDungeonSearchEntranceChaseAmount = 160; - -function KinkyDungeonHandleWanderingSpawns(delta) { - if (KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel) && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel).spawns) return; - if (KDGameData.RoomType && KinkyDungeonAltFloor(KDGameData.RoomType) && !KinkyDungeonAltFloor(KDGameData.RoomType).spawns) return; - let effLevel = MiniGameKinkyDungeonLevel + KinkyDungeonDifficulty; - let HunterAdjust = KinkyDungeonDifficulty; - let EntranceAdjust = KinkyDungeonDifficulty/2; - let BaseAdjust = KinkyDungeonDifficulty/10; - if (KinkyDungeonStatsChoice.get("SearchParty")) { - BaseAdjust *= 1.2; - BaseAdjust += KinkyDungeonSearchStartAmount; - HunterAdjust += KinkyDungeonSearchHuntersAmount - 50; - EntranceAdjust += KinkyDungeonSearchEntranceAdjustAmount - 30; - effLevel += 12; - } - - let sleepTurnsSpeedMult = 100; - let sleepTurnsPerExtraSpawnLevel = 25; - let baseChance = ((KDGameData.SleepTurns > 0 && (KinkyDungeonStatStamina > KinkyDungeonStatStaminaMax - 10 * KinkyDungeonStatStaminaRegenSleep || KDGameData.SleepTurns < 11)) ? 0.05 : 0.0005) * Math.sqrt(Math.max(1, effLevel)) * (1 + KinkyDungeonTotalSleepTurns / sleepTurnsSpeedMult); - - let Queue = []; - if (KDGameData.RespawnQueue && KDGameData.RespawnQueue.length > 0) { - let firstEnemy = KDGameData.RespawnQueue[Math.floor(KDRandom() * KDGameData.RespawnQueue.length)]; - for (let e of KDGameData.RespawnQueue) { - if (KDFactionRelation(e.faction, firstEnemy.faction) >= 0.1) { - Queue.push(e); - } - } - } - if (Queue.length > 0) baseChance = 0.07 * Math.sqrt(Math.max(1, effLevel)); - // Chance of bothering with random spawns this turn - if (delta > 0 && KDRandom() < baseChance && KinkyDungeonSearchTimer > KinkyDungeonSearchTimerMin) { - let hunters = false; - let spawnLocation = KinkyDungeonStartPosition; - let spawnPlayerExclusionRadius = 11; - if ((KinkyDungeonTotalSleepTurns > KinkyDungeonSearchStartAmount - BaseAdjust || Queue.length > 0) && KinkyDungeonEntities.length < Math.min(100, (!KinkyDungeonAggressive()) ? (5 + effLevel/15) : (20 + effLevel/KDLevelsPerCheckpoint))) { - if (KinkyDungeonTotalSleepTurns > KinkyDungeonSearchHuntersAmount - HunterAdjust) hunters = true; - if (((KinkyDungeonTotalSleepTurns > KinkyDungeonSearchEntranceAdjustAmount - EntranceAdjust || Queue.length > 0) && KDistChebyshev(KinkyDungeonPlayerEntity.x - KinkyDungeonEndPosition.x, KinkyDungeonPlayerEntity.y - KinkyDungeonEndPosition.y) > spawnPlayerExclusionRadius && KDRandom() < 0.5) - || KDistChebyshev(KinkyDungeonPlayerEntity.x - KinkyDungeonStartPosition.x, KinkyDungeonPlayerEntity.y - KinkyDungeonStartPosition.y) < spawnPlayerExclusionRadius) spawnLocation = KinkyDungeonEndPosition; - - if (KinkyDungeonVisionGet(spawnLocation.x, spawnLocation.y) < 1 || KinkyDungeonSeeAll) { - KinkyDungeonSearchTimer = 0; - let count = 0; - let maxCount = (2 + Math.min(5, Math.round(MiniGameKinkyDungeonLevel/10))) * Math.sqrt(1 + KinkyDungeonTotalSleepTurns / sleepTurnsSpeedMult); - if (KinkyDungeonStatsChoice.get("SearchParty")) { - maxCount *= 2; - } - // Spawn a killsquad! - let tags = []; - KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); - tags.push("boss"); - - let miniboss = false; - let requireTags = ["search"]; - if (hunters) { - requireTags = ["hunter"]; - tags.push("secondhalf"); - if (KinkyDungeonTotalSleepTurns > KinkyDungeonSearchEntranceChaseAmount) - tags.push("thirdhalf"); - } - - tags.push("bandit"); - - let qq = Queue.length > 0 ? Queue[Math.floor(KDRandom() * Queue.length)] : null; - - let Enemy = qq ? - KinkyDungeonGetEnemyByName(qq.enemy) - : KinkyDungeonGetEnemy( - tags, MiniGameKinkyDungeonLevel + KinkyDungeonDifficulty/5 + Math.round(KinkyDungeonTotalSleepTurns / sleepTurnsPerExtraSpawnLevel), - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - KinkyDungeonMapGet(spawnLocation.x, spawnLocation.y), requireTags, true); - let EnemiesSummoned = []; - // We are going to reroll the ghost decision just to provide some grace for players who are well and truly stuck - KinkyDungeonMakeGhostDecision(); - while (Enemy && count < maxCount) { - let point = KinkyDungeonGetNearbyPoint(spawnLocation.x, spawnLocation.y, true); - if (point) { - let X = point.x; - let Y = point.y; - EnemiesSummoned.push(Enemy.name); - let e = {tracking: true, summoned: true, faction: qq ? qq.faction : undefined, Enemy: Enemy, id: KinkyDungeonGetEnemyID(), x:X, y:Y, hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0}; - KDAddEntity(e); - KinkyDungeonSetEnemyFlag(e, "NoFollow", -1); - let shop = KinkyDungeonGetShopForEnemy(e); - if (shop) { - KinkyDungeonSetEnemyFlag(e, "Shop", -1); - KinkyDungeonSetEnemyFlag(e, shop, -1); - } - - if (Enemy.tags.minor) count += 0.1; else count += 1; // Minor enemies count as 1/10th of an enemy - if (Enemy.tags.boss) { - count += 3 * Math.max(1, 100/(100 + KinkyDungeonDifficulty)); - tags.push("boss"); - } // Boss enemies count as 4 normal enemies - else if (Enemy.tags.elite) count += Math.max(1, 1000/(2000 + 20*KinkyDungeonDifficulty + KinkyDungeonTotalSleepTurns)); // Elite enemies count as 1.5 normal enemies - if (Enemy.tags.miniboss) { - if (!miniboss) tags.push("boss"); - miniboss = true; // Adds miniboss as a tag - } - - - KDGameData.RespawnQueue.splice(KDGameData.RespawnQueue.indexOf(qq), 1); - Queue.splice(Queue.indexOf(qq), 1); - - if (Enemy.summon) { - for (let sum of Enemy.summon) { - if (!sum.chance || KDRandom() < sum.chance) - KinkyDungeonSummonEnemy(X, Y, sum.enemy, sum.count, sum.range, sum.strict); - } - } - } else count += 0.1; - - qq = Queue.length > 0 ? Queue[Math.floor(KDRandom() * Queue.length)] : null; - - Enemy = qq ? - KinkyDungeonGetEnemyByName(qq.enemy) - : KinkyDungeonGetEnemy(tags, MiniGameKinkyDungeonLevel + effLevel/KDLevelsPerCheckpoint, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], KinkyDungeonMapGet(spawnLocation.x, spawnLocation.y), requireTags); - } - if (EnemiesSummoned.length > 0 && KinkyDungeonFirstSpawn) { - KinkyDungeonFirstSpawn = false; - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonFirstSpawn"), "white", KDGameData.SleepTurns + 5); - } - if (KinkyDungeonTotalSleepTurns > KinkyDungeonSearchEntranceChaseAmount && !KinkyDungeonHuntDownPlayer && KDGameData.SleepTurns < 3) { - KinkyDungeonHuntDownPlayer = true; - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonHuntDownPlayer"), "#ff0000", KDGameData.SleepTurns + 10); - } - console.log(EnemiesSummoned); - } - } - // Only increment the timer when not in jail - } else if (!(KDGameData.PrisonerState == 'jail')) KinkyDungeonSearchTimer += delta; - - // Trigger when there is no hunter timer or is 0 - if (!(KDGameData.HunterTimer > 0)) { - // If undefined we set it so that it starts ticking down - if (KDGameData.HunterTimer == undefined) KDGameData.HunterTimer = HunterPulse; - else { - // If defined and 0 then we check if hunters are still alive, spawn if not, - if (!KDGameData.Hunters) KDGameData.Hunters = []; - let hunters = KDGameData.Hunters.map((id) => {return KinkyDungeonFindID(id);}); - - let spawnLocation = {x: KinkyDungeonStartPosition.x, y: KinkyDungeonStartPosition.y}; - - if (hunters.length > 0 || KDistChebyshev(spawnLocation.x - KinkyDungeonPlayerEntity.x, spawnLocation.y - KinkyDungeonPlayerEntity.y) < 10) { - // Hunters still exist, or player is too close, simple pulse - KDGameData.HunterTimer = Math.max(KDGameData.HunterTimer, HunterPulse); - } else { - // Hunters are dead, we spawn more - /** - * @type {entity[]} - */ - let eToSpawn = []; - KDGameData.Hunters = []; - - // Determine enemies to spawn - - // Spawn them - for (let e of eToSpawn) { - let point = KinkyDungeonGetNearbyPoint(spawnLocation.x, spawnLocation.y, true); - if (point) { - e.x = point.x; - e.y = point.y; - KDAddEntity(e); - KDGameData.Hunters.push(e.id); - } - } - } - - } - } - // Decrement the hunter timer - if (KDGameData.HunterTimer > 0) KDGameData.HunterTimer = Math.max(0, KDGameData.HunterTimer - delta); -} - -/** The defauilt interval between hunter checks */ -let HunterPulse = 25; -/** Cooldown for hunter spawns */ -let HunterSpawnTimer = 120; \ No newline at end of file diff --git a/Game/KinkyDungeonStats.js b/Game/KinkyDungeonStats.js deleted file mode 100644 index 78d70e4c3..000000000 --- a/Game/KinkyDungeonStats.js +++ /dev/null @@ -1,1493 +0,0 @@ -"use strict"; -// Player entity -let KinkyDungeonPlayerEntity = null; // The current player entity - -let KDSleepWillFraction = 0.5; -let KDSleepWillFractionJail = 0.5; - -function KDGetSleepWillFraction() { - if (KDGameData.PrisonerState == 'jail') return KDSleepWillFractionJail; - return KDSleepWillFraction; -} - -// Distraction -- It lowers your stamina regen -let KDMaxStat = 40; // Maximum any stat can get boosted to -let KDMaxStatStart = 10; // Start of stats -let KDMaxStatStartPool = 40; // Start of stats - -let KDStamDamageThresh = 0.3; -let KDStamDamageThreshBonus = 0.05; - -let KDSleepRegenWill = KDSleepWillFractionJail * KDMaxStatStart/40; - -let KinkyDungeonStatDistractionMax = KDMaxStatStart; -let KinkyDungeonStatDistractionLower = 0; -let KinkyDungeonStatDistractionLowerCap = 0.9; -let KinkyDungeonStatArousalLowerRegenSleep = 0; // Decrease lower distraction in sleep? -let KinkyDungeonDistractionUnlockSuccessMod = 0.5; // Determines how much harder it is to insert a key while aroused. 1.0 is half success chance, 2.0 is one-third, etc. -let KinkyDungeonStatDistraction = 0; -let KinkyDungeonCrotchRopeDistraction = 0.4; -let KinkyDungeonStatDistractionRegen = -1.0; -let KinkyDungeonStatDistractionRegenPerUpgrade = KinkyDungeonStatDistractionRegen*0.5; -let KDNoUnchasteBraMult = 0.9; -let KDNoUnchasteMult = 0.8; -let KDDistractionDecayMultDistractionMode = 0.25; -let KDDistractedAmount = 0.15; -let KinkyDungeonStatDistractionMiscastChance = 0.7; // Miscast chance at max distraction -let KinkyDungeonMiscastChance = 0; -let KinkyDungeonVibeLevel = 0; -let KinkyDungeonTeaseLevel = 0; -let KinkyDungeonTeaseLevelBypass = 0; -let KinkyDungeonOrgasmVibeLevel = 0; -let KinkyDungeonDistractionPerVibe = 0.05; // How much distraction per turn per vibe energy cost -let KinkyDungeonDistractionPerPlug = 0.1; // How much distraction per move per plug level -let KinkyDungeonVibeCostPerIntensity = 0.15; - -let KinkyDungeonStatWillpowerExhaustion = 0; -let KinkyDungeonSleepTurnsMax = 41; -let KinkyDungeonSlowMoveTurns = 0; -// Note that things which increase max distraction (aphrodiasic) also increase the max stamina drain. This can end up being very dangerous as being edged at extremely high distraction will drain all your energy completely, forcing you to wait until the torment is over or the drugs wear off - -// Stamina -- your MP. Used to cast spells and also struggle -let KinkyDungeonStatStaminaMax = KDMaxStatStart; -let KinkyDungeonStatStamina = KinkyDungeonStatStaminaMax; -let KinkyDungeonStatStaminaRegen = 0.5; -let KinkyDungeonStatStaminaRegenPerUpgrade = 0.0; -let KinkyDungeonStatStaminaRegenPerUpgradeWill = 0.1; -let KDNarcolepticRegen = -0.06; -let KinkyDungeonStatStaminaRegenJail = 0.125; -let KinkyDungeonStatStaminaRegenSleep = KinkyDungeonStatStaminaMax/40; -let KinkyDungeonStatStaminaRegenSleepBedMultiplier = 1.5; -let KinkyDungeonStatStaminaRegenWait = 0; -let KinkyDungeoNStatStaminaLow = 4; -let KDSprintCostBase = 1; // Cost of sprinting -let KDSprintCostSlowLevel = [0.5, 1.0, 1.5, 2.0]; // Extra cost per slow level -let KinkyDungeonStatWillMax = KDMaxStatStart; -let KinkyDungeonStatWill = KinkyDungeonStatWillMax; -let KinkyDungeonStatWillRate = 0; -let KinkyDungeonStatManaMax = KDMaxStatStart; -let KinkyDungeonStatMana = KinkyDungeonStatManaMax; -let KinkyDungeonStatManaPool = KinkyDungeonStatManaMax; -let KinkyDungeonStatManaPoolMax = KDMaxStatStartPool; -let KDManaPoolRatio = 1.0; // 1 point of mana costs 1 points of pool mana -let KinkyDungeonStatManaRate = 0; -let KinkyDungeonStatManaRegen = 0; // How fast stamina that is converted to mana regenerates -let KinkyDungeonStatManaLowRegen = 0; // How fast stamina that is converted to mana regenerates when low -let KDMeditationRegen = 0.1; -let KinkyDungeonStatManaRegenLowThreshold = 5; // Threshold for fast mana regen -let KinkyDungeonStatManaPoolRegen = 0.01; // Threshold for pool mana regen, % of max mana -let KinkyDungeonStatStaminaRegenPerSlowLevel = -0.03; // It costs stamina to move while bound -let KinkyDungeonStatStaminaCostStruggle = -3.0; // It costs stamina to struggle -let KinkyDungeonStatStaminaCostRemove = -0.5; // It costs stamina to struggle -let KinkyDungeonStatStaminaCostTool = -0.2; // It costs stamina to cut, but much less -let KinkyDungeonStatStaminaCostPick = -0.1; // It costs stamina to pick, but much less - - -let KinkyDungeonStatWillCostStruggle = 0; // It costs will to struggle -let KinkyDungeonStatWillCostRemove = 0; // It costs will to struggle -let KinkyDungeonStatWillCostTool = 0; // It costs will to cut, but much less -let KinkyDungeonStatWillCostPick = 0; // It costs stamina to pick, but much less -let KinkyDungeonStatWillCostUnlock = 0; // It costs stamina to pick, but much less - -let KinkyDungeonStatWillCostEscape = -0.2; // It costs will to struggle out of an item -let KinkyDungeonStatWillBonusEscape = 0.2; // Bonus for Second Wind - -let KinkyDungeonStaminaRate = KinkyDungeonStatStaminaRegen; - -// Current Status -let KinkyDungeonStatBeltLevel = 0; // Chastity bra does not add belt level -let KinkyDungeonStatPlugLevel = 0; // Cumulative with front and rear plugs -let KinkyDungeonPlugCount = 0; -let KinkyDungeonStatVibeLevel = 0; // Cumulative with diminishing returns for multiple items -let KinkyDungeonStatEdged = false; // If all vibrating effects are edging, then this will be true - -let KinkyDungeonStatDistractionGainChaste = -0.1; // Cumulative w/ groin and bra - - -// Restraint stats - -let KinkyDungeonSlowLevel = 0; // Adds to the number of move points you need before you move -let KinkyDungeonMovePoints = 0; - -let KinkyDungeonBlindLevelBase = 0; // Base, increased by buffs and such, set to 0 after consumed in UpdateStats -let KinkyDungeonBlindLevel = 0; // Blind level 1: -33% vision, blind level 2: -67% vision, Blind level 3: Vision radius = 1 -let KinkyDungeonStatBlind = 0; // Used for temporary blindness -let KinkyDungeonStatFreeze = 0; // Used for temporary freeze -let KinkyDungeonStatBind = 0; // Used for temporary bind -let KinkyDungeonDeaf = false; // Deafness reduces your vision radius to 0 if you are fully blind (blind level 3) -let KinkyDungeonSleepiness = 0; // Sleepiness -let KinkyDungeonSleepinessMax = 10; - -// Other stats -let KinkyDungeonGold = 0; -let KinkyDungeonLockpicks = 0; -// 3 types of keys, for 4 different types of padlocks. The last type of padlock requires all 3 types of keys to unlock -// The red keys are one-use only as the lock traps the key -// The green keys are multi-use, but jam often -// The blue keys cannot be picked or cut. -// Monsters are not dextrous enough to steal keys from your satchel, although they may spill your satchel on a nearby tile -let KinkyDungeonRedKeys = 0; -let KinkyDungeonBlueKeys = 0; - -let KinkyDungeonHasCrotchRope = false; - -// Combat -let KinkyDungeonTorsoGrabChance = 0.4; -let KinkyDungeonTorsoGrabChanceBonus = 0.2; -let KinkyDungeonWeaponGrabChance = 1.0; - -/** - * Your inventory contains items that are on you - * @type {Map>} - */ -let KinkyDungeonInventory = new Map(); -function KDInitInventory() { - KinkyDungeonInventory = new Map(); - for (const c of [Consumable, Restraint, LooseRestraint, Weapon, Outfit]) { - KinkyDungeonInventory.set(c, new Map()); - } -} - -let KinkyDungeonPlayerTags = new Map(); - -let KinkyDungeonCurrentDress = "Default"; -let KinkyDungeonUndress = 0; // Level of undressedness - -// Current list of spells -/** - * @type {spell[]} - */ -let KinkyDungeonSpells = []; -let KinkyDungeonPlayerBuffs = {}; - -// Temp - for multiplayer in future -let KinkyDungeonPlayers = []; - -// For items like the cursed collar which make more enemies appear -let KinkyDungeonDifficulty = 0; - -let KinkyDungeonSubmissiveMult = 0; - -let KinkyDungeonSpellPoints = 3; - -function KinkyDungeonDefaultStats(Load) { - KinkyDungeonPenanceCosts = {}; - KinkyDungeonLostItems = []; - KinkyDungeonFastMove = true; - KinkyDungeonResetEventVariables(); - KinkyDungeonSetDress("Default", "Default"); - KDGameData.KinkyDungeonSpawnJailers = 0; - KDGameData.KinkyDungeonSpawnJailersMax = 0; - KinkyDungeonGold = 0; - KinkyDungeonLockpicks = 0; - KinkyDungeonRedKeys = 0; - KinkyDungeonBlueKeys = 0; - - - KinkyDungeonHasCrotchRope = false; - - KinkyDungeonSubmissiveMult = 0; - - KDGameData.HeartTaken = false; - - KDSetWeapon(null); - KinkyDungeonSpellPoints = 0; - - KinkyDungeonStatDistractionMax = KDMaxStatStart; - KinkyDungeonStatStaminaMax = KDMaxStatStart; - KinkyDungeonStatManaMax = KDMaxStatStart; - KinkyDungeonStatWillMax = KDMaxStatStart; - KinkyDungeonStaminaRate = KinkyDungeonStatStaminaRegen; - - KinkyDungeonStatBlind = 0; - KinkyDungeonSlowMoveTurns = 0; - KDGameData.SleepTurns = 0; - KinkyDungeonStatBind = 0; - KinkyDungeonStatFreeze = 0; - - - KinkyDungeonPlayerBuffs = {}; - - KinkyDungeonMovePoints = 0; - KDInitInventory(); - KinkyDungeonInventoryAdd({name: "Default", type: Outfit, id: KinkyDungeonGetItemID()}); - KinkyDungeonInventoryAddWeapon("Unarmed"); - KDSetWeapon("Unarmed"); - KinkyDungeonPlayerTags = new Map(); - - KinkyDungeonPlayerDamage = KinkyDungeonPlayerDamageDefault; - - // Initialize all the other systems - KinkyDungeonResetMagic(); - KinkyDungeonInitializeDresses(); - KinkyDungeonShrineInit(); - - if (KDClassStart[KinkyDungeonClassMode]) KDClassStart[KinkyDungeonClassMode](); - - KinkyDungeonSetMaxStats(); - - KinkyDungeonStatDistraction = 0; - KinkyDungeonStatDistractionLower = 0; - KinkyDungeonStatStamina = KinkyDungeonStatStaminaMax; - KinkyDungeonStatMana = KinkyDungeonStatManaMax; - KinkyDungeonStatManaPool = KinkyDungeonStatManaPoolMax; - KinkyDungeonStatWill = KinkyDungeonStatWillMax; - - KDOrigStamina = KinkyDungeonStatStaminaMax * 10; - KDOrigMana = KinkyDungeonStatManaMax * 10; - KDOrigWill = KinkyDungeonStatWillMax * 10; - KDOrigDistraction = 0; - - if (param_test == 'godmode') { - KinkyDungeonSeeAll = true; - KinkyDungeonSpellPoints = 9001; - } - - if (!Load) { - let magicHands = KinkyDungeonStatsChoice.has("MagicHands"); - if (!magicHands) { - // We use magichands for the start scenarios - KinkyDungeonStatsChoice.set("MagicHands", true); - } - for (let perk of [...KinkyDungeonStatsChoice.keys()].filter((e) => {return KDPerkStart[e] != undefined;}) - .sort((a, b) => { - return ((KinkyDungeonStatsPresets[a] && KinkyDungeonStatsPresets[a].startPriority) || -1) - ((KinkyDungeonStatsPresets[b] && KinkyDungeonStatsPresets[b].startPriority) || -1); - })) { - if (KinkyDungeonStatsChoice.get(perk) && KDPerkStart[perk]) { - KDPerkStart[perk](Load); - console.log("started with perk " + perk); - } - } - if (!magicHands) - KinkyDungeonStatsChoice.delete("MagicHands"); - } - - KinkyDungeonDressPlayer(); - CharacterRefresh(KinkyDungeonPlayer); -} - -let KDMaxVisionDist = 8; - -function KinkyDungeonGetVisionRadius() { - let data = { - brightness: KinkyDungeonMapBrightness, - blindlevel: KinkyDungeonBlindLevel, - noperipheral: KinkyDungeonDeaf || KinkyDungeonStatBlind > 0, - blindMult: (KinkyDungeonStatsChoice.get("Blackout") || KinkyDungeonStatsChoice.get("TotalBlackout")) ? 2 : 1, - }; - KinkyDungeonSendEvent("calcVision", data); - return (KDGameData.SleepTurns > 2) ? 1 : (Math.max((data.noperipheral) ? 1 : 2, Math.round(KDMaxVisionDist-data.blindlevel * data.blindMult))); -} - -/** Returns if the player is automatically doing stuff - * @returns {boolean} - */ -function KDIsAutoAction() { - return KinkyDungeonAutoWait || KinkyDungeonAutoWaitStruggle; -} - -/** - * Disables all automatic actions - */ -function KDDisableAutoWait() { - KinkyDungeonAutoWait = false; - KinkyDungeonAutoWaitStruggle = false; -} - -function KinkyDungeonInterruptSleep() { - KDGameData.SleepTurns = 0; - KDGameData.PlaySelfTurns = 0; - if (KinkyDungeonTempWait && !KDGameData.KinkyDungeonLeashedPlayer && !KinkyDungeonGetRestraintItem("ItemDevices")) - KinkyDungeonAutoWait = false; - if (KinkyDungeonInDanger()) KinkyDungeonAutoWaitStruggle = false; -} - -let KDBaseDamageTypes = { - arouseTypes: ["grope", "charm", "happygas"], - bypassTeaseTypes: ["charm", "happygas"], - distractionTypesWeakNeg: ["pain", "acid"], - distractionTypesWeak:["soul"], - distractionTypesStrong:["tickle", "grope", "charm", "souldrain", "happygas"], - teaseTypes: ["grope", "charm"], - staminaTypesWeak:["drain", "stun", "fire", "glue", "chain", "tickle", "electric", "shock"], - staminaTypesStrong:["ice", "frost", "poison", "crush", "souldrain"], - manaTypesWeak:["electric", "drain"], - manaTypesStrong:[], - willTypesVeryWeak:["tickle", "souldrain"], - willTypesWeak:["ice", "frost", "poison", "stun", "electric", "acid", "grope", "pierce", "slash", "crush", "unarmed", "glue", "chain"], - willTypesStrong:["cold", "fire", "charm", "soul", "pain", "shock"], -}; - -function KDGetStamDamageThresh() { - let data = { - thresh: KDStamDamageThresh, - bonus: 0, - }; - - for (let s of KinkyDungeonSpells) { - if (s.name == "APUp1") { - data.bonus += KDStamDamageThreshBonus; - } - } - - KinkyDungeonSendEvent("calcStamDamageThresh", data); - - data.thresh += data.bonus; - return data.thresh; -} - -function KinkyDungeonDealDamage(Damage, bullet, noAlreadyHit, noInterrupt) { - if (bullet && !noAlreadyHit) { - if (!bullet.alreadyHit) bullet.alreadyHit = []; - // A bullet can only damage an enemy once per turn - if (bullet.alreadyHit.includes("player")) return {happened: 0, string: ""}; - bullet.alreadyHit.push("player"); - } - - let data = { - dmg: Damage.damage, - type: Damage.type, - flags: Damage.flags, - time: Damage.time, - armor: KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Armor"), - armorbreak: KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ArmorBreak"), - spellResist: KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellResist"), - buffresist: KDBuffResist(KinkyDungeonPlayerBuffs, Damage.type), - arouseAmount: 0, - arouseMod: 1, - arouseTypes: Object.assign([], KDBaseDamageTypes.arouseTypes), - bypassTeaseTypes: Object.assign([], KDBaseDamageTypes.bypassTeaseTypes), - distractionTypesWeakNeg: Object.assign([], KDBaseDamageTypes.distractionTypesWeakNeg), - teaseTypes: Object.assign([], KDBaseDamageTypes.teaseTypes), - distractionTypesWeak: Object.assign([], KDBaseDamageTypes.distractionTypesWeak), - distractionTypesStrong: Object.assign([], KDBaseDamageTypes.distractionTypesStrong), - staminaTypesWeak: Object.assign([], KDBaseDamageTypes.staminaTypesWeak), - staminaTypesStrong: Object.assign([], KDBaseDamageTypes.staminaTypesStrong), - manaTypesWeak: Object.assign([], KDBaseDamageTypes.manaTypesWeak), - manaTypesStrong: Object.assign([], KDBaseDamageTypes.manaTypesStrong), - willTypesVeryWeak: Object.assign([], KDBaseDamageTypes.willTypesVeryWeak), - willTypesWeak: Object.assign([], KDBaseDamageTypes.willTypesWeak), - willTypesStrong: Object.assign([], KDBaseDamageTypes.willTypesStrong), - stats: [], - newstats: [], - damaged: false, - }; - - if (KinkyDungeonStatsChoice.get("Masochist")) { - let types = ["pain", "electric", "slash", "pierce", "crush", "fire", "ice", "frost", "acid"]; - data.distractionTypesStrong.push(...types); - data.arouseMod = Math.max(data.arouseMod, 2.0); - data.arouseTypes.push(...types); - if (data.distractionTypesWeakNeg.includes("pain")) - data.distractionTypesWeakNeg = data.distractionTypesWeakNeg.splice(data.distractionTypesWeakNeg.indexOf("pain"), 1); - if (data.distractionTypesWeakNeg.includes("acid")) - data.distractionTypesWeakNeg = data.distractionTypesWeakNeg.splice(data.distractionTypesWeakNeg.indexOf("acid"), 1); - } - - if (data.arouseTypes.includes(data.type) && !data.arouseAmount) { - data.arouseAmount = 0.2; - } - if (data.arouseAmount < 0) data.arouseAmount = 0; - - KinkyDungeonSendEvent("beforePlayerDamage", data); - - data.dmg *= data.buffresist; - - if (data.armorbreak > 0) data.armor -= Math.min(Math.max(0, data.armor), data.armorbreak); - - if (data.armor && KinkyDungeonMeleeDamageTypes.includes(data.type)) data.dmg = Math.max(0, data.dmg * KDArmorFormula(data.dmg, data.armor)); - else if (data.spellResist && !KinkyDungeonMeleeDamageTypes.includes(data.type)) data.dmg = Math.max(0, data.dmg * KDArmorFormula(data.dmg, data.armor)); - - if (data.dmg > 0) { - let buffreduction = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "DamageReduction"); - if (buffreduction && data.dmg > 0) { - data.dmg = Math.max(data.dmg - buffreduction, 0); - KinkyDungeonTickBuffTag(KinkyDungeonPlayerBuffs, "damageTaken", 1); - KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/Shield.ogg"); - } - } - - - let str = ""; - - if (data.dmg > 0) - data.stats = [ - KinkyDungeonStatDistraction, - KinkyDungeonStatDistractionLower, - KinkyDungeonStatMana, - KinkyDungeonStatWill, - KinkyDungeonStatStamina, - ]; - - if (data.teaseTypes.includes(data.type)) { - let amt = data.dmg; - if (data.bypassTeaseTypes.includes(data.type)) { - KinkyDungeonTeaseLevelBypass += amt; - } else { - KinkyDungeonTeaseLevel += amt; - } - } - - if (data.distractionTypesWeak.includes(data.type)) { - let amt = data.dmg/2 * data.arouseMod; - if (str) str = str + ", "; - str = str + `${Math.round(amt*10)}dp`; - KinkyDungeonChangeDistraction(amt, true, data.arouseAmount); - } - if (data.distractionTypesWeakNeg.includes(data.type)) { - let amt = -data.dmg/2 * data.arouseMod; - if (str) str = str + ", "; - str = str + `${Math.round(amt*10)}dp`; - KinkyDungeonChangeDistraction(amt, true); - } - if (data.distractionTypesStrong.includes(data.type)) { - let amt = data.dmg * data.arouseMod; - if (str) str = str + ", "; - str = str + `${Math.round(amt*10)}dp`; - KinkyDungeonChangeDistraction(amt, true, data.arouseAmount); - } - if (data.staminaTypesStrong.includes(data.type)) { - let amt = -data.dmg; - if (str) str = str + ", "; - str = str + `${Math.round(amt*10)}sp`; - KinkyDungeonChangeStamina(amt, false, false, false, KDGetStamDamageThresh()); - } else if (data.staminaTypesWeak.includes(data.type)) { - let amt = -data.dmg/2; - if (str) str = str + ", "; - str = str + `${Math.round(amt*10)}sp`; - KinkyDungeonChangeStamina(amt, false, false, false, KDGetStamDamageThresh()); - } - if (data.manaTypesStrong.includes(data.type)) { - let amt = -data.dmg; - if (str) str = str + ", "; - str = str + `${Math.round(amt*10)}mp`; - KinkyDungeonChangeMana(amt); - } else if (data.manaTypesWeak.includes(data.type)) { - let amt = -data.dmg/2; - if (str) str = str + ", "; - str = str + `${Math.round(amt*10)}mp`; - KinkyDungeonChangeMana(amt); - } - if (data.willTypesStrong.includes(data.type)) { - let amt = -data.dmg; - if (str) str = str + ", "; - str = str + `${Math.round(amt*10)}wp`; - KinkyDungeonChangeWill(amt, true); - } else if (data.willTypesWeak.includes(data.type)) { - let amt = -data.dmg/2; - if (str) str = str + ", "; - str = str + `${Math.round(amt*10)}wp`; - KinkyDungeonChangeWill(amt, true); - } else if (data.willTypesVeryWeak.includes(data.type)) { - let amt = -data.dmg/4; - if (str) str = str + ", "; - str = str + `${Math.round(amt*10)}wp`; - KinkyDungeonChangeWill(amt, true); - } - if (!noInterrupt) - KinkyDungeonInterruptSleep(); - - if (data.dmg > 0 && KinkyDungeonStatsChoice.get("Breathless")) { - let sleepAmount = data.dmg > 3 ? 6 : (data.dmg > 1 ? 4 : 2); - if (["chain", "poison", "crush"].includes(data.type)) - KinkyDungeonSleepiness = Math.max(KinkyDungeonSleepiness, KinkyDungeonSleepiness + sleepAmount); - } - - if (KinkyDungeonStatFreeze > 0 && KinkyDungeonMeleeDamageTypes.includes(data.type)) { - KinkyDungeonChangeWill(-data.dmg, true); - KinkyDungeonStatFreeze = 0; - } - KDOrigWill = Math.floor(KinkyDungeonStatWill * 10); - - - - - - if (data.dmg > 0) { - data.newstats = [ - KinkyDungeonStatDistraction, - KinkyDungeonStatDistractionLower, - KinkyDungeonStatMana, - KinkyDungeonStatWill, - KinkyDungeonStatStamina, - ]; - - let changed = false; - for (let i = 0; i < data.stats.length; i++) { - if (data.stats[i] != data.newstats[i]) { - changed = true; - break; - } - } - if (changed && KinkyDungeonDamageTypes[data.type]) { - data.damaged = true; - KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(data.dmg * 10), KinkyDungeonDamageTypes[data.type].color, undefined, undefined, - ` ${TextGet("KinkyDungeonDamageType" + KinkyDungeonDamageTypes[data.type].name)} dmg`); - } - } - - KinkyDungeonSendEvent("afterPlayerDamage", data); - - return {happened: data.dmg, string: str}; -} - -function KinkyDungeonUpdateDialogue(entity, delta) { - if (!KinkyDungeonSlowMoveTurns && !KinkyDungeonStatFreeze && !KDGameData.PlaySelfTurns) - if (entity.dialogue) { - if (entity.dialogueDuration > delta) { - entity.dialogueDuration = Math.max(0, entity.dialogueDuration - delta); - } else { - entity.dialogue = null; - } - } -} - -/** - * - * @param {entity} entity - * @param {string} dialogue - * @param {string} color - * @param {number} duration - * @param {number} priority - * @param {boolean} [force] - * @param {boolean} [nooverride] - */ -function KinkyDungeonSendDialogue(entity, dialogue, color, duration, priority, force, nooverride) { - if (!force && !KDEnemyCanTalk(entity)) { - return; - } - if (!entity.dialogue || !entity.dialoguePriority || entity.dialoguePriority <= priority + (nooverride ? 1 : 0)) { - entity.dialogue = dialogue; - entity.dialogueColor = color; - entity.dialogueDuration = duration; - entity.dialoguePriority = priority; - if (!entity.player) { - KinkyDungeonSendTextMessage(0, `${TextGet("Name" + entity.Enemy.name)}: ${dialogue}`, color, 0, true, false, entity); - KDAllowDialogue = false; - } - } -} - -let KDOrigStamina = KDMaxStatStart*10; -let KDOrigMana = KDMaxStatStart*10; -let KDOrigWill = KDMaxStatStart*10; -let KDOrigCharge = 1000; -let KDOrigDistraction = 0; - -function KinkyDungeonChangeDistraction(Amount, NoFloater, lowerPerc, minimum = 0) { - - if (isNaN(Amount)) { - console.trace(); - Amount = 0; - } - let data = { - Amount: Amount, - NoFloater: NoFloater, - lowerPerc: lowerPerc, - minimum: minimum, - }; - KinkyDungeonSendEvent("changeDistraction", data); - Amount = data.Amount; - lowerPerc = data.lowerPerc; - minimum = data.minimum; - NoFloater = data.NoFloater; - if (isNaN(Amount)) { - console.trace(); - Amount = 0; - } - let minLevel = Math.min(KinkyDungeonStatDistractionMax * minimum, KinkyDungeonStatDistraction); // Cannot go below this or current - if (Amount > 0) { - KDNoRegenFlag = true; - } - KinkyDungeonStatDistraction += Amount; - KinkyDungeonStatDistraction = Math.min(Math.max(minLevel, KinkyDungeonStatDistraction), KinkyDungeonStatDistractionMax); - if (!KDGameData.DistractionCooldown) { - KDGameData.DistractionCooldown = 0; - } - if (Amount > 0) { - let cdBonus = KinkyDungeonStatDistraction >= KinkyDungeonStatDistractionMax ? Math.min(4, Math.max(1, Math.ceil(Amount/1.5))) : 0; - KDGameData.DistractionCooldown = Math.max(KDGameData.DistractionCooldown, 3 + cdBonus, KinkyDungeonSlowMoveTurns + 1 + cdBonus); - - if (KDToggles.ArousalHearts) - for (let i = 0; i < Amount * 10 && i < 100; i++) { - KDCreateArousalParticle(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax, 0); - } - } - - if (lowerPerc) { - KinkyDungeonStatDistractionLower += Amount * lowerPerc; - KinkyDungeonStatDistractionLower = Math.min(Math.max(0, KinkyDungeonStatDistractionLower), KinkyDungeonStatDistractionMax * KinkyDungeonStatDistractionLowerCap); - } - if (!NoFloater && Math.abs(KDOrigDistraction - Math.floor(KinkyDungeonStatDistraction/KinkyDungeonStatDistraction * 100)) >= 0.99) { - //KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * 100) - KDOrigDistraction, "#ff00ff", undefined, undefined, "% distraction"); - let amount = Math.min(1, Math.max(0, (Math.floor(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * 100) - KDOrigDistraction) / 100)); - amount *= amount; - amount = Math.max(amount, amount * 0.5 + 0.5 * KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax); - amount = Math.round(10 * amount); - - KinkyDungeonSendDialogue(KinkyDungeonPlayerEntity, TextGet("KinkyDungeonChangeDistraction" + amount), "#ff00ff", 2, 1); - KDOrigDistraction = Math.max(0, Math.floor(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * 100)); - } - - - if (isNaN(KinkyDungeonStatDistraction)) { - console.trace(); - KinkyDungeonStatDistraction = 0; - } -} -function KinkyDungeonChangeStamina(Amount, NoFloater, Pause, NoSlow, minimum = 0, slowFloor = 5) { - - if (isNaN(Amount)) { - console.trace(); - Amount = 0; - } - - let data = { - NoFloater: NoFloater, - Amount: Amount, - NoSlow: NoSlow, - minimum: minimum, - Pause: Pause, - slowFloor: slowFloor, - }; - KinkyDungeonSendEvent("changeStamina", data); - NoFloater = data.NoFloater; - Amount = data.Amount; - NoSlow = data.NoSlow; - minimum = data.minimum; - slowFloor = data.slowFloor; - Pause = data.Pause; - - if (isNaN(Amount)) { - console.trace(); - Amount = 0; - } - let minLevel = Math.min(KinkyDungeonStatStaminaMax * minimum, KinkyDungeonStatStamina); // Cannot go below this or current - KinkyDungeonStatStamina += Amount; - KinkyDungeonStatStamina = Math.min(Math.max(minLevel, KinkyDungeonStatStamina), KinkyDungeonStatStaminaMax); - if (!NoFloater && Math.abs(KDOrigStamina - Math.floor(KinkyDungeonStatStamina * 10)) >= 0.99) { - KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KinkyDungeonStatStamina * 10) - KDOrigStamina, "#44ff66", undefined, undefined, " sp"); - KDOrigStamina = Math.floor(KinkyDungeonStatStamina * 10); - } - if (Pause) { - if (!(KDGameData.StaminaPause > Pause)) - KDGameData.StaminaPause = Pause; - if (!(KDGameData.StaminaSlow > 5) && !NoSlow) - KDGameData.StaminaSlow = 5; - } - - if (isNaN(KinkyDungeonStatStamina)) { - console.trace(); - KinkyDungeonStatDistraction = 0; - } -} -/** - * - * @param {number} Amount] - * @param {boolean} [NoFloater] - * @param {number} [PoolAmount] - * @param {boolean} [Pause] - * @param {boolean} [spill] - */ -function KinkyDungeonChangeMana(Amount, NoFloater, PoolAmount, Pause, spill, minimum = 0) { - - if (isNaN(Amount)) { - console.trace(); - Amount = 0; - } - - let data = { - NoFloater: NoFloater, - Amount: Amount, - PoolAmount: PoolAmount, - minimum: minimum, - Pause: Pause, - spill: spill, - }; - KinkyDungeonSendEvent("changeMana", data); - NoFloater = data.NoFloater; - Amount = data.Amount; - PoolAmount = data.PoolAmount; - minimum = data.minimum; - Pause = data.pause; - spill = data.spill; - - if (isNaN(Amount)) { - console.trace(); - Amount = 0; - } - - let minLevel = Math.min(KinkyDungeonStatManaMax * minimum, KinkyDungeonStatMana); // Cannot go below this or current - let manaAmt = KinkyDungeonStatMana; - KinkyDungeonStatMana += Amount; - KinkyDungeonStatMana = Math.min(Math.max(minLevel, KinkyDungeonStatMana), KinkyDungeonStatManaMax); - manaAmt = KinkyDungeonStatMana - manaAmt; - if (!PoolAmount) PoolAmount = 0; - if (spill && manaAmt != Amount) PoolAmount += (Amount - manaAmt) * KDManaPoolRatio; - if (PoolAmount) { - KinkyDungeonStatManaPool += PoolAmount; - KinkyDungeonStatManaPool = Math.min(Math.max(0, KinkyDungeonStatManaPool), KinkyDungeonStatManaPoolMax); - } - if (!NoFloater && Math.abs(KDOrigMana - Math.floor(KinkyDungeonStatMana * 10)) >= 0.99) { - KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KinkyDungeonStatMana * 10) - KDOrigMana, "#4499ff", undefined, undefined, " mp"); - KDOrigMana = Math.floor(KinkyDungeonStatMana * 10); - } - if (Pause) { - if (!(KDGameData.ManaSlow > 10)) - KDGameData.ManaSlow = 10; - } - - if (isNaN(KinkyDungeonStatMana)) { - console.trace(); - KinkyDungeonStatDistraction = 0; - } -} -function KinkyDungeonChangeWill(Amount, NoFloater, minimum = 0) { - - if (isNaN(Amount)) { - console.trace(); - Amount = 0; - } - - let data = { - NoFloater: NoFloater, - Amount: Amount, - minimum: minimum, - }; - KinkyDungeonSendEvent("changeWill", data); - NoFloater = data.NoFloater; - Amount = data.Amount; - minimum = data.minimum; - - if (isNaN(Amount)) { - console.trace(); - Amount = 0; - } - let minLevel = Math.min(KinkyDungeonStatWillMax * minimum, KinkyDungeonStatWill); // Cannot go below this or current - KinkyDungeonStatWill += Amount; - KinkyDungeonStatWill = Math.min(Math.max(minLevel, KinkyDungeonStatWill), KinkyDungeonStatWillMax); - if (!NoFloater && Math.abs(KDOrigWill - Math.floor(KinkyDungeonStatWill * 10)) >= 0.99) { - KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KinkyDungeonStatWill * 10) - KDOrigWill, "#ff4444", undefined, undefined, " wp"); - KDOrigWill = Math.floor(KinkyDungeonStatWill * 10); - } - - if (isNaN(KinkyDungeonStatWill)) { - console.trace(); - KinkyDungeonStatDistraction = 0; - } -} - - -function KinkyDungeonChangeCharge(Amount, NoFloater) { - if (isNaN(Amount)) { - console.trace(); - Amount = 0; - } - if (!KDGameData.AncientEnergyLevel) KDGameData.AncientEnergyLevel = 0; - KDGameData.AncientEnergyLevel = Math.min(1, KDGameData.AncientEnergyLevel + Amount); - if (!NoFloater && Math.abs(KDOrigCharge - Math.floor(KDGameData.AncientEnergyLevel * 1000)) >= 0.99) { - KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KDGameData.AncientEnergyLevel * 1000 * 10) - KDOrigCharge, "#ffff44", undefined, undefined, " charge"); - KDOrigCharge = Math.floor(KDGameData.AncientEnergyLevel * 1000); - } - - if (isNaN(KDGameData.AncientEnergyLevel)) { - console.trace(); - KinkyDungeonStatDistraction = 0; - } -} - -function KinkyDungeonHasStamina(Cost, AddRate) { - let s = KinkyDungeonStatStamina; - if (AddRate) s += KinkyDungeonStaminaRate; - - return s >= Cost; -} -function KinkyDungeonHasWill(Cost, AddRate) { - let s = KinkyDungeonStatWill; - if (AddRate) s += KinkyDungeonStatWillRate; - - return s >= Cost; -} -function KinkyDungeonHasMana(Cost, AddRate) { - let s = KinkyDungeonStatMana; - if (AddRate) s += KinkyDungeonStatManaRate; - - return s >= Cost; -} - -function KinkyDungeonSetMaxStats(delta) { - // Upgradeable stats - KinkyDungeonStatStaminaMax = KDMaxStatStart; - KinkyDungeonStatDistractionMax = KDMaxStatStart; - KinkyDungeonStatManaMax = KDMaxStatStart; - KinkyDungeonStatManaPoolMax = KDMaxStatStartPool; - KinkyDungeonStatWillMax = KDMaxStatStart; - KinkyDungeonSpellChoiceCount = 21; - KinkyDungeonSummonCount = 2; - let data = { - distractionRate: 0, - staminaRate: KinkyDungeonStatStaminaRegen, - delta: delta, - }; - - for (let s of KinkyDungeonSpells) { - if (s.name == "SPUp1") { - KinkyDungeonStatStaminaMax += 5; - data.staminaRate += KinkyDungeonStatStaminaRegenPerUpgrade; - } - if (s.name == "APUp1") { - KinkyDungeonStatDistractionMax += 5; - if (KinkyDungeonVibeLevel == 0 && !(KDGameData.DistractionCooldown > 0)) - data.distractionRate += KinkyDungeonStatDistractionRegenPerUpgrade; - } - if (s.name == "WPUp1") { - KinkyDungeonStatWillMax += 5; - data.staminaRate += KinkyDungeonStatStaminaRegenPerUpgradeWill; - } - if (s.name == "MPUp1") KinkyDungeonStatManaMax += 5; - //if (s.name == "SpellChoiceUp1" || s.name == "SpellChoiceUp2" || s.name == "SpellChoiceUp3") KinkyDungeonSpellChoiceCount += 1; - if (s.name == "SummonUp1" || s.name == "SummonUp2") KinkyDungeonSummonCount += 2; - } - - KinkyDungeonSendEvent("calcMaxStats", data); - - return {distractionRate: data.distractionRate, staminaRate: data.staminaRate}; -} - -function KinkyDungeonCanUseWeapon(NoOverride, e) { - let flags = { - HandsFree: false, - }; - if (!NoOverride) - KinkyDungeonSendEvent("getWeapon", {event: e, flags: flags}); - return flags.HandsFree || KinkyDungeonPlayerDamage.noHands || (!KinkyDungeonIsHandsBound(false, true) && (!KinkyDungeonStatsChoice.get("WeakGrip") || !KinkyDungeonIsArmsBound(false, true))); -} - -let KDBlindnessCap = 0; -let KDBoundPowerLevel = 0; -let KDNoRegenFlag = false; - -function KDGetDistractionRate(delta) { - let mult = KDNoRegenFlag ? 0 : 1; - KDNoRegenFlag = false; - let distractionRate = (KinkyDungeonVibeLevel == 0 && KDGameData.OrgasmNextStageTimer < 4 && !(KDGameData.DistractionCooldown > 0)) ? (!KinkyDungeonStatsChoice.get("arousalMode") ? KinkyDungeonStatDistractionRegen * KDDistractionDecayMultDistractionMode * mult : (KDGameData.PlaySelfTurns < 1 ? mult * KinkyDungeonStatDistractionRegen*( - (KinkyDungeonChastityMult() > 0.9 ? KDNoUnchasteMult : (KinkyDungeonChastityMult() > 0 ? KDNoUnchasteBraMult : 1.0))) : 0)) : (KinkyDungeonDistractionPerVibe * KinkyDungeonVibeLevel); - - if (KDGameData.OrgasmStamina > 0 && delta > 0) { - let amount = (KDGameData.OrgasmStamina || 0)/24; - KDGameData.OrgasmStamina = Math.max(0, KDGameData.OrgasmStamina*0.98 - delta/70); - distractionRate += -amount; - } - - let distractionBonus = KinkyDungeonSetMaxStats(delta).distractionRate; - if (KDGameData.PlaySelfTurns < 1) distractionRate += distractionBonus; - if (!KDGameData.DistractionCooldown) KDGameData.DistractionCooldown = 0; - if (KDGameData.DistractionCooldown > 0) KDGameData.DistractionCooldown = Math.max(0, KDGameData.DistractionCooldown - delta); - return distractionRate; -} - -function KinkyDungeonUpdateStats(delta) { - KDBoundPowerLevel = 0; - KDBoundPowerLevel += 0.1 * Math.max(0, Math.min(1, KinkyDungeonBlindLevel / 3)); - if (KinkyDungeonIsArmsBound(false, false)) KDBoundPowerLevel += 0.2; - if (KinkyDungeonIsHandsBound(false, false, 0.65)) KDBoundPowerLevel += 0.1; - if (KinkyDungeonIsHandsBound(false, false, 0.99)) KDBoundPowerLevel += 0.1; - KDBoundPowerLevel += 0.1 * KinkyDungeonChastityMult(); - KDBoundPowerLevel += 0.2 * KinkyDungeonGagTotal(); - KDBoundPowerLevel += 0.2 * Math.max(0, Math.min(1, KinkyDungeonSlowLevel / 2)); - if (KDBoundPowerLevel > 1) KDBoundPowerLevel = 1; - if (KinkyDungeonStatsChoice.get("BoundPower")) { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, { - id:"BoundPower", - type: "Evasion", - duration: 1, - power: KDBoundPowerLevel * KDBoundPowerMult, - }); - } - - KinkyDungeonPlayers = [KinkyDungeonPlayerEntity]; - - KDBlindnessCap = 7; - KinkyDungeonSendEvent("calcStats", {}); - // Initialize - KinkyDungeonCalculateVibeLevel(delta); - if (KinkyDungeonVibeLevel > 0 && KinkyDungeonCanPlayWithSelf() && KDGameData.SleepTurns > 0 && KDGameData.SleepTurns < 5) { - //KinkyDungeonInterruptSleep(); - //KinkyDungeonSendActionMessage(5, TextGet("KinkyDungeonSleepDeprivation"), "pink", 3); - } - KinkyDungeonDifficulty = KinkyDungeonNewGame * 20; - if (KinkyDungeonStatsChoice.get("hardMode")) KinkyDungeonDifficulty += 10; - KinkyDungeonTeaseLevel = Math.max(KinkyDungeonTeaseLevel * (1 - KinkyDungeonChastityMult()) + (delta > 0 ? KinkyDungeonTeaseLevelBypass : 0), 0); - if (KinkyDungeonVibeLevel > 0 || KinkyDungeonTeaseLevel > 0) { - KDGameData.OrgasmNextStageTimer = Math.min(KDOrgasmStageTimerMax, KDGameData.OrgasmNextStageTimer + delta); - let Chance = (KDGameData.OrgasmStage >= KinkyDungeonMaxOrgasmStage) ? 1.0 : (KDOrgasmStageTimerMaxChance + (1 - KinkyDungeonStatWill/KinkyDungeonStatWillMax) * KinkyDungeonStatDistractionLower / KinkyDungeonStatDistractionMax); - if ((KinkyDungeonTeaseLevel > 0 || KDGameData.OrgasmNextStageTimer >= KDOrgasmStageTimerMax) && (KDRandom() < Chance && KinkyDungeonControlsEnabled())) { - if (KDGameData.OrgasmStage < KinkyDungeonMaxOrgasmStage) { - if (KinkyDungeonCanPlayWithSelf() && KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > KinkyDungeonDistractionPlaySelfThreshold && !KinkyDungeonInDanger()) { - KinkyDungeonDoPlayWithSelf(KinkyDungeonTeaseLevel); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonPlaySelfAutomatic" + (KinkyDungeonIsArmsBound() ? "Bound" : "")), "#FF5BE9", 5); - } else { - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonPlaySelfTease"), "#FF5BE9", 2); - } - KDGameData.OrgasmStage += 1; - KDGameData.OrgasmNextStageTimer = 1; - } else { - if (KinkyDungeonCanOrgasm() && KDGameData.OrgasmStamina < 0.5 && KDGameData.PlaySelfTurns < 1) { - KinkyDungeonDoTryOrgasm(KinkyDungeonTeaseLevel); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonOrgasmAutomatic"), "#FF5BE9", KinkyDungeonOrgasmStunTime + 1, true); - KDGameData.OrgasmNextStageTimer = 1; - } - } - } - } else if (KDGameData.OrgasmNextStageTimer > 0) { - KDGameData.OrgasmNextStageTimer = Math.max(0, KDGameData.OrgasmNextStageTimer - delta); - } - - let distractionRate = KDGetDistractionRate(delta); - - if (delta > 0 && KinkyDungeonVibeLevel > 0) { - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonVibing" + Math.max(0, Math.min(5, Math.round(KinkyDungeonVibeLevel)))), "#ff88ff", 2, true, true); - } - let arousalPercent = distractionRate > 0 ? 0.04 : 0; - - if (KDGameData.OrgasmStage > 0 && !KinkyDungeonFlags.get("orgasmStageTimer") && KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax * 0.75) { - KDGameData.OrgasmStage = Math.max(0, KDGameData.OrgasmStage - delta); - KinkyDungeonSetFlag("orgasmStageTimer", 20 + Math.round(KDRandom() * 20)); - } - if (KinkyDungeonStatDistraction >= KinkyDungeonStatDistractionMax * 0.99) KDGameData.OrgasmTurns = Math.min(KDGameData.OrgasmTurns + delta, KinkyDungeonOrgasmTurnsMax); - else KDGameData.OrgasmTurns = Math.max(KDGameData.OrgasmTurns - delta, 0); - - - let sleepRegen = KinkyDungeonStatStaminaRegenSleep * KinkyDungeonStatStaminaMax / KDMaxStatStart; - let sleepRegenDistraction = KinkyDungeonStatArousalLowerRegenSleep * KinkyDungeonStatDistractionMax / KDMaxStatStart; - if (KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) == 'B') sleepRegen *= 2; - let stamMult = KDGameData.StaminaSlow > 0 ? Math.max(0.5, (!KinkyDungeonCanStand() ? 0.5 : 1.0) - 0.1 * KDGameData.StaminaSlow) : 1.0; - let stamRegen = KDGameData.StaminaPause > 0 ? 0 : KinkyDungeonSetMaxStats().staminaRate * stamMult; - if (delta > 0 && KDGameData.StaminaPause > 0) KDGameData.StaminaPause -= delta; - if (delta > 0 && KDGameData.StaminaSlow > 0) KDGameData.StaminaSlow -= delta; - if (delta > 0 && KDGameData.KneelTurns > 0) KDGameData.KneelTurns -= delta; - KinkyDungeonStaminaRate = KDGameData.SleepTurns > 0 && KDGameData.SleepTurns < KinkyDungeonSleepTurnsMax - 1? sleepRegen : stamRegen; - let statData = { - manaPoolRegen: KinkyDungeonStatManaPoolRegen, - player: KinkyDungeonPlayerEntity, - }; - KinkyDungeonSendEvent("calcManaPool", statData); - KinkyDungeonStatManaRate = (KinkyDungeonStatMana < KinkyDungeonStatManaRegenLowThreshold && KinkyDungeonStatsChoice.get("Meditation")) ? - Math.max(KinkyDungeonStatManaPool > 0 ? (statData.manaPoolRegen * KinkyDungeonStatManaMax) : 0, KDMeditationRegen) - : 0; - let ManaPoolDrain = 0; - if (KinkyDungeonStatManaRate == 0 && KinkyDungeonStatManaPool > 0) { - KinkyDungeonStatManaRate = KinkyDungeonStatManaPool - Math.max(0, KinkyDungeonStatManaPool - statData.manaPoolRegen * KinkyDungeonStatManaMax); - if (KDGameData.ManaSlow > 0) { - KinkyDungeonStatManaRate *= Math.max(0.1, 1 - 0.1 * KDGameData.ManaSlow); - } - KinkyDungeonStatManaRate = Math.min(KinkyDungeonStatManaRate, KinkyDungeonStatManaMax - KinkyDungeonStatMana); - ManaPoolDrain = KinkyDungeonStatManaRate * KDManaPoolRatio; - } - - // Update the player tags based on the player's groups - KinkyDungeonPlayerTags = KinkyDungeonUpdateRestraints(delta); - - let blind = Math.max(KinkyDungeonBlindLevelBase, KinkyDungeonGetBlindLevel()); - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Blindness")) blind = Math.max(0, blind + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Blindness")); - KinkyDungeonBlindLevel = Math.min(KDBlindnessCap, blind); - if (KinkyDungeonBlindLevel > 0 && KinkyDungeonStatsChoice.has("Unmasked")) KinkyDungeonBlindLevel += 1; - if (KinkyDungeonStatBlind > 0) KinkyDungeonBlindLevel = Math.max(KinkyDungeonBlindLevel, 6); - //if (KinkyDungeonStatStamina < 2) KinkyDungeonBlindLevel = Math.max(KinkyDungeonBlindLevel, Math.round(6 - 3*KinkyDungeonStatStamina)); - KinkyDungeonDeaf = KinkyDungeonPlayer.IsDeaf(); - - // Unarmed damage calc - KinkyDungeonPlayerDamage = KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); - - KinkyDungeonUpdateStruggleGroups(); - // Slowness calculation - KinkyDungeonCalculateSlowLevel(); - let sleepRate = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sleepiness"); - if ((sleepRate && sleepRate > 0) || KinkyDungeonSleepiness > 0) { - KinkyDungeonSleepiness = Math.min(KinkyDungeonSleepinessMax, KinkyDungeonSleepiness + sleepRate * delta); - if (KinkyDungeonSleepiness > 2.99) { - KinkyDungeonSlowLevel = Math.max(KinkyDungeonSlowLevel, 2); - //KinkyDungeonBlindLevel = Math.max(KinkyDungeonBlindLevel + Math.floor(KinkyDungeonSleepiness/2), 5); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "Sleepy", aura: "#222222", type: "AttackStamina", duration: 3, power: -1, player: true, enemies: false, tags: ["attack", "stamina"]}); - } - if (KinkyDungeonSleepiness > 0) { - KinkyDungeonBlindLevel = Math.max(KinkyDungeonBlindLevel + Math.floor(KinkyDungeonSleepiness*0.5), Math.min(Math.round(KinkyDungeonSleepiness*0.7), 6)); - } - if (KinkyDungeonSleepiness > 0) { - KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonSleepy"), "#ff0000", 1, true); - } - } - if ((!sleepRate || sleepRate <= 0) && KinkyDungeonSleepiness > 0) KinkyDungeonSleepiness = Math.max(0, KinkyDungeonSleepiness - delta); - - // Cap off the values between 0 and maximum - KinkyDungeonChangeDistraction(distractionRate*delta, true, distractionRate > 0 ? arousalPercent: 0); - if (sleepRegenDistraction > 0 && KDGameData.SleepTurns > 0) { - KinkyDungeonStatDistractionLower -= sleepRegenDistraction*delta; - } else { - //KinkyDungeonStatDistractionLower += distractionRate*delta * arousalPercent; - } - KinkyDungeonChangeStamina(KinkyDungeonStaminaRate*delta, true, undefined, true); - KinkyDungeonStatMana += KinkyDungeonStatManaRate; - KinkyDungeonStatManaPool -= ManaPoolDrain; - - if (KDGameData.OrgasmTurns > KinkyDungeonOrgasmTurnsCrave && !(KDGameData.OrgasmStamina > 0)) { - let EdgeDrainAmount = KinkyDungeonStatDistractionLower < KinkyDungeonStatDistractionLowerCap ? KinkyDungeonOrgasmExhaustionAmountWillful : KinkyDungeonOrgasmExhaustionAmount; - KinkyDungeonChangeWill(EdgeDrainAmount); - let vibe = KinkyDungeonVibeLevel > 0 ? "Vibe" : ""; - let suff = KDGameData.OrgasmStage < KinkyDungeonMaxOrgasmStage ? (KDGameData.OrgasmStage < KinkyDungeonMaxOrgasmStage / 2 ? "0" : "1") : "2"; - KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonOrgasmExhaustion" + vibe + suff), "#ff0000", 2, true); - } - - KinkyDungeonStatBlind = Math.max(0, KinkyDungeonStatBlind - delta); - KinkyDungeonStatFreeze = Math.max(0, KinkyDungeonStatFreeze - delta); - KinkyDungeonStatBind = Math.max(0, KinkyDungeonStatBind - delta); - - KinkyDungeonCapStats(); - - KDOrigDistraction = Math.floor(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * 100); - KDOrigStamina = Math.floor(KinkyDungeonStatStamina * 10); - KDOrigMana = Math.floor(KinkyDungeonStatMana * 10); - - KinkyDungeonCalculateMiscastChance(); - - KinkyDungeonHasCrotchRope = false; - let drains = []; - - - for (let item of KinkyDungeonFullInventory()) { - if (item.type == Restraint) { - if (KDRestraint(item).difficultyBonus) { - KinkyDungeonDifficulty += KDRestraint(item).difficultyBonus; - } - if (KDRestraint(item).crotchrope) KinkyDungeonHasCrotchRope = true; - if (KDRestraint(item).enchantedDrain) { - if (KDGameData.AncientEnergyLevel > 0) { - //maxDrain = Math.max(maxDrain, KDRestraint(item).enchantedDrain); - drains.push(KDRestraint(item).enchantedDrain); - } - //KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - KDRestraint(item).enchantedDrain * delta); - } - } - } - if (drains.length > 0 && delta > 0) { - drains = drains.sort().reverse(); - for (let i = 0; i < drains.length; i++) { - KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - ( - drains[i]/(i + 1) - ) * delta); - } - } - - KinkyDungeonSubmissiveMult = KinkyDungeonCalculateSubmissiveMult(); - - if (!KDGameData.TimeSinceLastVibeEnd) KDGameData.TimeSinceLastVibeEnd = {}; - if (!KDGameData.TimeSinceLastVibeStart) KDGameData.TimeSinceLastVibeStart = {}; - - for (let type of Object.entries(KDGameData.TimeSinceLastVibeStart)) { - if (!KDGameData.TimeSinceLastVibeStart[type[0]]) KDGameData.TimeSinceLastVibeStart[type[0]] = 1; - else KDGameData.TimeSinceLastVibeStart[type[0]] += delta; - } - for (let type of Object.entries(KDGameData.TimeSinceLastVibeEnd)) { - if (!KDGameData.TimeSinceLastVibeEnd[type[0]]) KDGameData.TimeSinceLastVibeEnd[type[0]] = 1; - else KDGameData.TimeSinceLastVibeEnd[type[0]] += delta; - } - - KDUpdatePerksBonus(); - - if (delta > 0) { - KinkyDungeonTeaseLevel = 0; - KinkyDungeonTeaseLevelBypass = 0; - } - - if (KinkyDungeonSlowLevel > 9) KDGameData.CagedTime = (KDGameData.CagedTime || 0) + delta; - else KDGameData.CagedTime = 0; -} - -let KDDamageAmpPerks = 0; -let KDDamageAmpPerksMelee = 0; -let KDDamageAmpPerksMagic = 0; -let KDDamageAmpPerksSpell = 0; -let KDDamageAmpEnvironmental = 0; -let KDExtraEnemyTags = {}; - -function KDGetEnvironmentalDmg() { - return KinkyDungeonMultiplicativeStat(-KDDamageAmpEnvironmental); -} - -function KDUpdatePerksBonus() { - KDDamageAmpPerks = 0; - KDDamageAmpPerksMagic = 0; - KDDamageAmpPerksMelee = 0; - KDDamageAmpPerksSpell = 0; - KDDamageAmpEnvironmental = 0; - KDExtraEnemyTags = {}; - for (let perk of KinkyDungeonStatsChoice.keys()) { - if (KDPerkUpdateStats[perk]) KDPerkUpdateStats[perk](); - } - KinkyDungeonSendEvent("perksBonus", {}); -} - -function KinkyDungeonCalculateMiscastChance() { - let flags = { - miscastChance: Math.max(0, KinkyDungeonStatDistractionMiscastChance * Math.min(1, KinkyDungeonStatDistraction / (KinkyDungeonStatDistractionMax||1))), - }; - if (KinkyDungeonStatsChoice.has("AbsoluteFocus")) { - flags.miscastChance = Math.min(flags.miscastChance * 2, 1); - } - if (KinkyDungeonStatsChoice.get("Distracted")) flags.miscastChance += KDDistractedAmount; - KinkyDungeonSendEvent("calcMiscast", flags); - KinkyDungeonMiscastChance = Math.max(0, flags.miscastChance || 0); -} - -function KinkyDungeonGetBlindLevel() { - let blindness = 0; - for (let inv2 of KinkyDungeonAllRestraintDynamic()) { - let inv = inv2.item; - if (KDRestraint(inv).blindfold) blindness = Math.max(Math.min(5, blindness + 1), KDRestraint(inv).blindfold); - } - let data = { - player: KinkyDungeonPlayerEntity, - blindness: blindness ? blindness : 0, - }; - KinkyDungeonSendEvent("calcBlind", data); - return data.blindness; -} - -function KinkyDungeonCapStats() { - KinkyDungeonStatDistractionLower = Math.max(0, Math.min(KinkyDungeonStatDistractionLower, KinkyDungeonStatDistractionMax * KinkyDungeonStatDistractionLowerCap)); - KinkyDungeonStatDistraction = Math.max(KinkyDungeonStatDistractionLower, Math.min(KinkyDungeonStatDistraction, KinkyDungeonStatDistractionMax)); - KinkyDungeonStatStamina = Math.max(0, Math.min(KinkyDungeonStatStamina, KinkyDungeonStatStaminaMax)); - KinkyDungeonStatMana = Math.max(0, Math.min(KinkyDungeonStatMana, KinkyDungeonStatManaMax)); - KinkyDungeonStatManaPool = Math.max(0, Math.min(KinkyDungeonStatManaPool, KinkyDungeonStatManaPoolMax)); - - // Negate floating point err... - if (KinkyDungeonStatMana > KinkyDungeonStatManaMax - 0.001) KinkyDungeonStatMana = KinkyDungeonStatManaMax; - if (KinkyDungeonStatWill > KinkyDungeonStatWillMax - 0.001) KinkyDungeonStatWill = KinkyDungeonStatWillMax; -} - -function KinkyDungeonLegsBlocked() { - if (KinkyDungeonPlayer.Pose.includes("Hogtie")) return true; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv) && KDRestraint(inv).blockfeet) return true; - } - return false; -} - -function KinkyDungeonCanStand() { - return !KinkyDungeonPlayer.Pose.includes("Kneel") && !(KDGameData.KneelTurns > 0); -} -function KinkyDungeonCanKneel() { - return true; -} - -function KinkyDungeonCalculateSlowLevel(delta) { - KinkyDungeonSlowLevel = 0; - if (KinkyDungeonAllRestraint().some((r) => {return KDRestraint(r).immobile;})) {KinkyDungeonSlowLevel += 100; KinkyDungeonMovePoints = -1;} - else { - for (let inv of KinkyDungeonAllRestraint()) { - if ((KDRestraint(inv).blockfeet || KDRestraint(inv).hobble)) KinkyDungeonSlowLevel = Math.min(3, KinkyDungeonSlowLevel + 1); - } - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).blockfeet) { - KinkyDungeonSlowLevel = Math.max(KinkyDungeonSlowLevel, 2); - break; - } - } - if (!KinkyDungeonCanStand()) KinkyDungeonSlowLevel = Math.max(3, KinkyDungeonSlowLevel + 1); - if (KinkyDungeonPlayer.Pose.includes("Hogtied")) KinkyDungeonSlowLevel = Math.max(4, KinkyDungeonSlowLevel + 1); - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).freeze) KinkyDungeonSlowLevel = Math.max(2, KinkyDungeonSlowLevel); - } - if (!KinkyDungeonHasStamina(0.01)) KinkyDungeonSlowLevel = Math.max(1, KinkyDungeonSlowLevel); - } - let origSlowLevel = KinkyDungeonSlowLevel; - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowLevel")) KinkyDungeonSlowLevel += KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowLevel"); - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "MoveSpeed")) KinkyDungeonSlowLevel = Math.max(0, KinkyDungeonSlowLevel - KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "MoveSpeed")); - KinkyDungeonSlowLevel = Math.max(0, KinkyDungeonSlowLevel); - if (delta > 0 && KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowLevelEnergyDrain")) KDGameData.AncientEnergyLevel = - Math.max(0, KDGameData.AncientEnergyLevel - Math.max(0, origSlowLevel - KinkyDungeonSlowLevel) * KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowLevelEnergyDrain")); -} -/** - * Returns the total level of gagging, 1.0 or higher meaning "fully gagged" and 0.0 being able to speak. - * @param {boolean} [AllowFlags] - Whether or not flags such as allowPotions and blockPotions should override the final result - * @return {number} - The gag level, sum of all gag properties of worn restraints - */ -function KinkyDungeonGagTotal(AllowFlags) { - let total = 0; - let allow = false; - let prevent = false; - for (let rest of KinkyDungeonAllRestraintDynamic()) { - let inv = rest.item; - if (KDRestraint(inv).gag) total += KDRestraint(inv).gag; - if (KDRestraint(inv).allowPotions) allow = true; - } - if (AllowFlags) { - if (prevent) return 1.00; - else if (allow) return 0.0; - } - return total; -} - -function KinkyDungeonCanTalk(Loose) { - for (let inv of KinkyDungeonAllRestraint()) { - if ((Loose ? KinkyDungeonGagTotal() >= 0.99 : KDRestraint(inv).gag)) return false; - } - return true; -} - -function KinkyDungeonCalculateSubmissiveMult() { - let base = 0; - for (let item of KinkyDungeonAllRestraint()) { - if (item.type == Restraint) { - let power = Math.sqrt(Math.max(0, KinkyDungeonGetLockMult(item.lock) * KDRestraint(item).power)); - base = Math.max(power, base + power/5); - } - } - - base *= 0.28; - - let mult = Math.max(0, 0.2 + 0.8 * (KinkyDungeonGoddessRep.Ghost + 50)/100); - let amount = Math.max(0, base * mult); - //console.log(amount); - return amount; -} - -function KinkyDungeonCanPlayWithSelf() { - if (!KinkyDungeonStatsChoice.get("arousalMode")) return false; - return KinkyDungeonStatDistraction > KinkyDungeonDistractionSleepDeprivationThreshold * KinkyDungeonStatDistractionMax && KinkyDungeonHasStamina(-KDGetOrgasmCost()); -} - -function KinkyDungeonCanTryOrgasm() { - if (!KinkyDungeonStatsChoice.get("arousalMode")) return false; - let data = { - player: KinkyDungeonPlayerEntity, - threshold: KinkyDungeonStatDistractionMax - 0.01, - }; - KinkyDungeonSendEvent("calcOrgThresh", data); - return KinkyDungeonStatDistraction >= data.threshold && (KinkyDungeonHasStamina(-KDGetOrgasmCost()) || KDGameData.OrgasmStage > 3) && KDGameData.OrgasmStamina < 1; -} - -function KDGetOrgasmCost() { - return Math.max(KinkyDungeonOrgasmCost, -KinkyDungeonOrgasmCostPercent * KinkyDungeonStatStamina); -} - -/** - * @param {number} [tease] - The teasing power - * @returns {{orig: number, final: number}} - */ -function KDGetPlaySelfPower(tease) { - let OrigAmount = Math.max( - tease ? Math.min(KinkyDungeonPlayWithSelfPowerMax, tease) : 0, - KinkyDungeonPlayWithSelfPowerMin + (KinkyDungeonPlayWithSelfPowerMax - KinkyDungeonPlayWithSelfPowerMin)*KDRandom()); - let amount = Math.max(0, OrigAmount - KinkyDungeonChastityMult() * KinkyDungeonPlayWithSelfChastityPenalty); - - return {orig: OrigAmount, final: amount}; -} - -function KinkyDungeonDoPlayWithSelf(tease) { - let affinity = KinkyDungeonGetAffinity(false, "Edge"); - let power = KDGetPlaySelfPower(tease); - let OrigAmount = power.orig; - let amount = power.final; - let bound = KinkyDungeonIsArmsBound(); - if (bound && !affinity) amount = Math.max(0, Math.min(amount, OrigAmount - KinkyDungeonPlayWithSelfBoundPenalty)); - if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.playSelfBonus) amount += KinkyDungeonPlayerDamage.playSelfBonus; - - let data = { - player: KinkyDungeonPlayerEntity, - amount: amount, - cost: KinkyDungeonPlayCost, - bound: bound, - playTime: 3, - playSound: true, - playMsg: true, - affinity: affinity, - OrigAmount: OrigAmount, - power: power, - alertRadius: 3, - distractionCooldown: Math.max(KDGameData.DistractionCooldown, 13), - }; - - KinkyDungeonSendEvent("playSelf", data); - - KinkyDungeonAlert = Math.max(KinkyDungeonAlert || 0, data.alertRadius); // Alerts nearby enemies because of your moaning~ - - KinkyDungeonChangeDistraction(0.5 + Math.sqrt(Math.max(0, data.amount * KinkyDungeonPlayWithSelfMult)) * KinkyDungeonStatDistractionMax/KDMaxStatStart, false, 0.05); - KinkyDungeonChangeStamina(data.cost, true, 3); - if (data.playSound) { - if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.playSelfSound) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "/Audio/" + KinkyDungeonPlayerDamage.playSelfSound + ".ogg"); - } - if (data.playMsg) { - if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.playSelfMsg) { - KinkyDungeonSendActionMessage(10, TextGet(KinkyDungeonPlayerDamage.playSelfMsg), "#FF5BE9", 4); - } else if (KinkyDungeonIsArmsBound()) { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonPlaySelfBound"), "#FF5BE9", 4); - } else if (KinkyDungeonChastityMult() > 0.9) { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChastityDeny"), "#FF5BE9", 4); - } else KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonPlaySelf"), "#FF5BE9", 4); - if (affinity) - KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonPlayCorner"), "#88FF00", 4); - } - KDGameData.PlaySelfTurns = data.playTime; - KDGameData.DistractionCooldown = data.distractionCooldown; - - return amount; -} - -/** Percentage of vibe level that is turned into playSelfPower to try to have an orgasm*/ -let KinkyDungeonOrgasmVibeLevelPlayPowerMult = 1.0; -let KinkyDungeonOrgasmChanceBase = -0.1; -let KinkyDungeonOrgasmChanceScaling = 1.1; -let KinkyDungeonMaxOrgasmStage = 7; -let KinkyDungeonOrgasmStageVariation = 4; // determines the text message variation - -/** Threshold at which the player can play with herself */ -let KinkyDungeonDistractionSleepDeprivationThreshold = 0.001; -/** Threshold at which the player will automatically play with herself if able*/ -let KinkyDungeonDistractionPlaySelfThreshold = 0.3; -let KinkyDungeonPlaySelfOrgasmThreshold = 3; // Note that it is impossible if you have a belt on, but possible if you only have a bra on - -let KinkyDungeonOrgasmTurnsMax = 10; -let KinkyDungeonOrgasmTurnsCrave = 8; -let KinkyDungeonPlayWithSelfPowerMin = 3; -let KinkyDungeonPlayWithSelfPowerMax = 6; -let KinkyDungeonPlayWithSelfPowerVibeWand = 5; -let KinkyDungeonPlayWithSelfChastityPenalty = 4.5; -let KinkyDungeonPlayWithSelfBoundPenalty = 2.0; -let KinkyDungeonOrgasmExhaustionAmount = -0.02; -let KinkyDungeonOrgasmExhaustionAmountWillful = -0.005; - -let KDOrgasmStageTimerMax = 10; // Turns for orgasm stage timer to progress naturally -let KDOrgasmStageTimerMaxChance = 0.1; // Chance for the event to happen - -let KDWillpowerMultiplier = 0.5; - -let KinkyDungeonOrgasmCost = -8; -let KinkyDungeonOrgasmCostPercent = 0.7; -let KinkyDungeonOrgasmWillpowerCost = -2; -let KinkyDungeonEdgeCost = -1; -let KinkyDungeonPlayCost = -0.1; - -let KinkyDungeonOrgasmStunTime = 4; -let KinkyDungeonPlayWithSelfMult = 0.25; - -/** - * Try to let go... - * @param {number} [Bonus] - */ -function KinkyDungeonDoTryOrgasm(Bonus) { - let chance = KinkyDungeonOrgasmChanceBase + KinkyDungeonOrgasmChanceScaling*(KDGameData.OrgasmTurns/KinkyDungeonOrgasmTurnsMax); - let denied = KinkyDungeonVibratorsDeny(chance); - - let amount = denied ? 0 : KinkyDungeonOrgasmVibeLevel * KinkyDungeonOrgasmVibeLevelPlayPowerMult; - let playSelfAmount = Bonus != undefined ? Bonus : KinkyDungeonDoPlayWithSelf(); - //if (playSelfAmount > KinkyDungeonOrgasmVibeLevel) { - //console.log(`${playSelfAmount} + ${amount}`); - amount += playSelfAmount; - //} - let msg = "KinkyDungeonOrgasm"; - let msgTime = KinkyDungeonOrgasmStunTime+3; - - - let data = { - player: KinkyDungeonPlayerEntity, - amount: amount, - chance: chance, - denied: denied, - Bonus: Bonus, - edgespcost: KinkyDungeonEdgeCost, - edgewpcost: 0, - spcost: KDGetOrgasmCost(), - wpcost: KinkyDungeonOrgasmWillpowerCost, - stunTime: KinkyDungeonOrgasmStunTime, - playSound: true, - playMsg: true, - alertRadius: 7, - satisfaction: KinkyDungeonStatDistraction, - distractionCooldown: Math.max(KDGameData.DistractionCooldown, 13), - cancelOrgasm: false, - lowerFloorTo: 0, - }; - - KinkyDungeonSendEvent("tryOrgasm", data); - - if (data.cancelOrgasm) return; - if (data.amount > KinkyDungeonPlaySelfOrgasmThreshold && KDRandom() < data.chance) { - // You finally shudder and tremble as a wave of pleasure washes over you... - KinkyDungeonStatBlind = data.stunTime + 2; - //KinkyDungeonOrgasmStunTime = 4; - KinkyDungeonSetFlag("PlayerOrgasm", data.stunTime); - KinkyDungeonSetFlag("PlayerOrgasmFilter", data.stunTime + 1); - KDGameData.OrgasmStamina = data.satisfaction; - KinkyDungeonChangeStamina(data.spCost); - KinkyDungeonChangeWill(data.wpCost); - KinkyDungeonStatDistractionLower = data.lowerFloorTo; - KinkyDungeonAlert = Math.max(KinkyDungeonAlert || 0, data.alertRadius); // Alerts nearby enemies because of your moaning~ - KDGameData.PlaySelfTurns = data.stunTime; - KinkyDungeonSendEvent("orgasm", data); - } else { - KinkyDungeonChangeStamina(data.edgespCost); - KinkyDungeonChangeWill(data.edgewpCost); - // You close your eyes and breath rapidly in anticipation... - // You feel frustrated as the stimulation isn't quite enough... - // You groan with pleasure as you keep close to the edge... - // You whimper as you rub your legs together furiously... - // You tilt your head back and moan as your heart beats faster... - // Your whole body shakes, but you don't quite go over the edge... - // This is starting to feel like torture... - // You let out a frustrated scream as the torment continues... - // You simmer just under the edge, heart racing, breathing quickly... - // You let out an anguished moan as release dances just out of reach... - // You squirm helplessly as your futile struggles simply arouse you more... - KDGameData.OrgasmTurns = Math.min(KDGameData.OrgasmTurns + amount, KinkyDungeonOrgasmTurnsMax); // Progress the meter if you're not ready yet... - KDGameData.OrgasmStage = Math.min(KinkyDungeonMaxOrgasmStage, KDGameData.OrgasmStage + 1); // Stage of denial - if (KDGameData.CurrentVibration) { - if (KDGameData.CurrentVibration.denialsLeft > 0 || KDGameData.CurrentVibration.denialsLeft == undefined) { - KDGameData.CurrentVibration.denyTimeLeft = KDGameData.CurrentVibration.denyTime; - if (KDGameData.CurrentVibration.denialsLeft > 0) KDGameData.CurrentVibration.denialsLeft -= 1; - } - } - if (denied && KinkyDungeonVibeLevel > 0) { - msg = "KinkyDungeonDeny"; - KinkyDungeonSendEvent("deny", data); - } else { - msg = "KinkyDungeonEdge"; - KinkyDungeonSendEvent("edge", data); - } - } - - if (data.playMsg) { - let msgIndex = Math.min(KinkyDungeonMaxOrgasmStage, KDGameData.OrgasmStage) + Math.floor(Math.random() * KinkyDungeonOrgasmStageVariation); - KinkyDungeonSendActionMessage(10, TextGet(msg + ("" + msgIndex)), "#FF5BE9", msgTime); - } - -} - -function KinkyDungeonIsChaste(Breast) { - for (let inv of KinkyDungeonAllRestraint()) { - if ((!Breast && KDRestraint(inv).chastity) || (Breast && KDRestraint(inv).chastitybra)) return true; - } -} - -function KinkyDungeonChastityMult() { - let chaste = 0.0; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).chastity) chaste += 1; - else if (KDRestraint(inv).chastitybra) chaste += 0.2; - } - return chaste; -} - -/** - * - * @param {any} buffs - * @param {string} type - * @returns {number} - */ -function KDBuffResist(buffs, type) { - if (KDDamageEquivalencies[type]) type = KDDamageEquivalencies[type]; - return KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(buffs, type + "DamageResist")) - * (KinkyDungeonMeleeDamageTypes.includes(type) ? - KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(buffs, "meleeDamageResist")) - : KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(buffs, "magicDamageResist"))); -} \ No newline at end of file diff --git a/Game/KinkyDungeonTests.js b/Game/KinkyDungeonTests.js deleted file mode 100644 index 23181ccd3..000000000 --- a/Game/KinkyDungeonTests.js +++ /dev/null @@ -1,107 +0,0 @@ -"use strict"; - -// This file is for Kinky Dungeon unit tests, run from the console - -function KDRunTests() { - KDDebug = true; - if (KDTestMapGen(100, [0, 6, 12, 18,], [0, 1, 2, 3, 11,]) - && KDTestFullRunthrough(3, true, true)) { - console.log("All tests passed!"); - } - KDDebug = false; -} - -function KDTestMapGen(count, Ranges, Checkpoints) { - for (let Checkpoint of Checkpoints) { - MiniGameKinkyDungeonCheckpoint = Checkpoint; - for (let FloorRange of Ranges) - for (let f = FloorRange; f < FloorRange + KDLevelsPerCheckpoint; f++) { - console.log(`Testing floor ${f}`); - MiniGameKinkyDungeonLevel = f; - for (let i = 0; i < count; i++) { - if (i % (count/KDLevelsPerCheckpoint) == 0) - console.log(`Testing iteration ${i} on floor ${MiniGameKinkyDungeonLevel}`); - KinkyDungeonCreateMap(KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]], f, true); - let accessible = KinkyDungeonIsAccessible(KinkyDungeonStartPosition.x, KinkyDungeonStartPosition.y); - if (!accessible) { - console.log(`Error, stairs are inaccessible on iteration ${i}`); - return false; - } - } - } - } - return true; -} - - -function KDTestFullRunthrough(GameLoops, Init, NGP) { - let EnemySpawnData = {}; - console.log("Testing full runthrough"); - if (Init) { - MiniGameKinkyDungeonLevel = 1; - MiniGameKinkyDungeonCheckpoint = "grv"; - KinkyDungeonInitialize(1); - } - for (let i = 0; i < KinkyDungeonMaxLevel * GameLoops; i++) { - // Run through the stairs - KinkyDungeonHandleStairs('s', true); - console.log(`Arrived at floor ${MiniGameKinkyDungeonLevel}`); - - if (!EnemySpawnData["" + MiniGameKinkyDungeonCheckpoint]) { - EnemySpawnData["" + MiniGameKinkyDungeonCheckpoint] = {}; - } - for (let e of KinkyDungeonEntities) { - if (EnemySpawnData["" + MiniGameKinkyDungeonCheckpoint][e.Enemy.name] == undefined) - EnemySpawnData["" + MiniGameKinkyDungeonCheckpoint][e.Enemy.name] = 1; - else EnemySpawnData["" + MiniGameKinkyDungeonCheckpoint][e.Enemy.name] += 1; - } - - if (KinkyDungeonState == "End") { - if (NGP) - KinkyDungeonNewGamePlus(); - else { - MiniGameKinkyDungeonLevel = 1; - MiniGameKinkyDungeonCheckpoint = "grv"; - KinkyDungeonState = "Game"; - } - } - - // Check various things - if (KinkyDungeonEnemies.length < 1) { - console.log(`Error, no enemies on floor ${MiniGameKinkyDungeonLevel}, iteration ${i}`); - return false; - } else if (MiniGameKinkyDungeonCheckpoint != KDDefaultJourney[Math.min(KDDefaultJourney.length - 1, Math.floor((MiniGameKinkyDungeonLevel) / KDLevelsPerCheckpoint))]) { - console.log(`Error, wrong checkpoint on floor ${MiniGameKinkyDungeonLevel}, iteration ${i}: Found ${MiniGameKinkyDungeonCheckpoint}, Checkpoint should be ${Math.floor(MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint)}`); - return false; - } - } - console.log(EnemySpawnData); - return true; -} - -function KDTestjailer(iter) { - let totals = {}; - for (let i = 0; i < iter; i++) { - KDJailEvents.spawnGuard.trigger(KinkyDungeonJailGuard(), KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - if (KinkyDungeonJailGuard()) { - if (!totals[KinkyDungeonJailGuard().Enemy.name]) totals[KinkyDungeonJailGuard().Enemy.name] = 1; - else totals[KinkyDungeonJailGuard().Enemy.name] = totals[KinkyDungeonJailGuard().Enemy.name] + 1; - } else { - if (!totals.null) totals.null = 1; - else totals.null = totals.null + 1; - } - KDSpliceIndex(KinkyDungeonEntities.indexOf(KinkyDungeonJailGuard()), 1); - KDGameData.KinkyDungeonJailGuard = 0; - } - console.log(totals); -} - -async function KDExportTranslationFile() { - await sleep(1000); - let file = ""; - for (let c of Object.values(TextScreenCache.cache)) { - file = file + '\n' + c; - file = file + '\n'; - } - navigator.clipboard.writeText(file); -} \ No newline at end of file diff --git a/Game/KinkyDungeonTiles.js b/Game/KinkyDungeonTiles.js deleted file mode 100644 index fdc9ff3a2..000000000 --- a/Game/KinkyDungeonTiles.js +++ /dev/null @@ -1,687 +0,0 @@ -"use strict"; - -/** - * - * @param {entity} entity - * @returns {boolean} - */ -function KDWettable(entity) { - return entity.player || (!entity.Enemy.tags.acidimmune && !entity.Enemy.tags.acidresist && !entity.Enemy.tags.fire && !entity.Enemy.tags.nowet); -} - -/** - * - * @param {entity} entity - * @returns {boolean} - */ -function KDConducting(entity) { - return entity.player || (!entity.Enemy.tags.electricimmune && !entity.Enemy.tags.electricresist && !entity.Enemy.tags.electric && !entity.Enemy.tags.noconduct); -} - -function KinkyDungeonHandleTilesEnemy(enemy, delta) { - let tile = KinkyDungeonMapGet(enemy.x, enemy.y); - if (tile == 'w') { - /* - if (KDWettable(enemy)) { - if (!enemy.buffs) enemy.buffs = {}; - let b1 = Object.assign({}, KDDrenched); - b1.duration = 6; - let b2 = Object.assign({}, KDDrenched2); - b2.duration = 6; - let b3 = Object.assign({}, KDDrenched3); - b3.duration = 6; - - KinkyDungeonApplyBuff(enemy.buffs, b1); - KinkyDungeonApplyBuff(enemy.buffs, b2); - KinkyDungeonApplyBuff(enemy.buffs, b3); - } - */ - } -} - -/** - * Applies effects based on nearby tiles. Affects only the player - * @param {number} delta - */ -function KDPeripheralTileEffects(delta) { - let tileUp = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y - 1); - let tileL = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x - 1, KinkyDungeonPlayerEntity.y); - let tileR = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x + 1, KinkyDungeonPlayerEntity.y); - let tileD = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y + 1); - if (tileUp == ",") { - // Low hook - KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonHookLow"), "lightgreen", 1, true); - } else if (tileUp == "4" || tileL == '4' || tileR == '4' || tileD == '4') { - // Crack - KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonCrack"), "lightgreen", 1, true); - } -} - -/** - * Applies effects based on the tile you are standing on. Affects only the player - * @param {number} delta - */ -function KinkyDungeonUpdateTileEffects(delta) { - let tile = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - if (KDTileUpdateFunctions[tile] && KDTileUpdateFunctions[tile](delta)) { - // Boop - } else { - KDPeripheralTileEffects(delta); - } - for (let X = 1; X < KinkyDungeonGridWidth-1; X++) { - for (let Y = 1; Y < KinkyDungeonGridHeight-1; Y++) { - let tt = KinkyDungeonMapGet(X, Y); - if (KDTileUpdateFunctionsLocal[tt]) KDTileUpdateFunctionsLocal[tt](delta, X, Y); - - } - } -} - - -let KinkyDungeonChestConfirm = false; - -function KinkyDungeonHandleMoveToTile(toTile) { - if (toTile == 's' || toTile == 'H') { // Go down the next stairs - if (KinkyDungeonConfirmStairs && KinkyDungeonLastAction == "Wait") { - KinkyDungeonConfirmStairs = false; - KinkyDungeonHandleStairs(toTile); - } else if (!(KDGameData.SleepTurns > 0)) { - if (KinkyDungeonLastAction == "Move" || KinkyDungeonLastAction == "Wait") - KinkyDungeonConfirmStairs = true; - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonConfirmStairs"), "white", 1, true); - } - } -} - -function KDCanEscape() { - return KDGameData.JailKey || KinkyDungeonFlags.has("BossUnlocked"); -} - -/** - * Creates combined record of tags - * @param {number} x - * @param {number} y - * @returns {Record} - */ -function KDEffectTileTags(x, y) { - /** @type {Record} */ - let ret = {}; - let tiles = KDGetEffectTiles(x, y); - if (tiles) { - for (let t of Object.values(tiles)) { - if (t.tags) { - for (let tag of t.tags) { - ret[tag] = true; - } - } - } - } - - return ret; -} - -function KinkyDungeonHandleStairs(toTile, suppressCheckPoint) { - if (!KDCanEscape()) { - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonNeedJailKey"), "#ffffff", 1); - } - else { - if (!KinkyDungeonJailGuard() || !KinkyDungeonTetherLength() || (!(KDistEuclidean(KinkyDungeonJailGuard().x - KinkyDungeonPlayerEntity.x, KinkyDungeonJailGuard().y - KinkyDungeonPlayerEntity.y) <= KinkyDungeonTetherLength() + 2))) { - - let data = { - toTile: toTile, - overrideRoomType: false, - overrideProgression: false, - overrideJourney: false, - mapMod: KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)?.MapMod, - }; - KinkyDungeonSendEvent("beforeHandleStairs", data); - - if (MiniGameKinkyDungeonLevel > Math.max(KinkyDungeonRep, ReputationGet("Gaming")) || Math.max(KinkyDungeonRep, ReputationGet("Gaming")) > KinkyDungeonMaxLevel) { - KinkyDungeonRep = Math.max(KinkyDungeonRep, MiniGameKinkyDungeonLevel); - DialogSetReputation("Gaming", KinkyDungeonRep); - } - MiniGameVictory = false; - let roomType = ""; - let currCheckpoint = MiniGameKinkyDungeonCheckpoint; - let altRoom = KinkyDungeonAltFloor(KDGameData.RoomType); - - // We increment the save, etc, after the tunnel - if (KDGameData.RoomType == "Tunnel" || (altRoom && altRoom.skiptunnel)) { - if (!data.overrideProgression) { - MiniGameKinkyDungeonLevel += 1; - if (KDGameData.PriorJailbreaks > 0) KDGameData.PriorJailbreaksDecay = (KDGameData.PriorJailbreaksDecay + 1) || 1; - - if (MiniGameKinkyDungeonLevel > 1) { - // Reduce security level when entering a new area - if (MiniGameKinkyDungeonCheckpoint != currCheckpoint) - KinkyDungeonChangeRep("Prisoner", -5); - else // Otherwise it's just a little bit - KinkyDungeonChangeRep("Prisoner", -1); - - if (KinkyDungeonStatsChoice.get("Trespasser")) { - KinkyDungeonChangeRep("Rope", -1); - KinkyDungeonChangeRep("Metal", -1); - KinkyDungeonChangeRep("Leather", -1); - KinkyDungeonChangeRep("Latex", -1); - KinkyDungeonChangeRep("Will", -1); - KinkyDungeonChangeRep("Elements", -1); - KinkyDungeonChangeRep("Conjure", -1); - KinkyDungeonChangeRep("Illusion", -1); - } - } - - if (MiniGameKinkyDungeonLevel >= KinkyDungeonMaxLevel) { - MiniGameKinkyDungeonLevel = 1; - KDGameData.MainPath = "grv"; - KinkyDungeonState = "End"; - MiniGameVictory = true; - suppressCheckPoint = true; - } - } - if (!data.overrideRoomType) { - if (KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { - roomType = ""; // We let the boss spawn naturally - } else { - roomType = ""; // TODO add more room types - } - } - } else { - if (!data.overrideRoomType) { - roomType = "PerkRoom"; // We do a perk room, then a tunnel - KDGameData.MapMod = ""; // Reset the map mod - } - } - - - if (!data.overrideRoomType) { - KDGameData.RoomType = roomType; - } - if (KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)) { - let MapMod = data.mapMod; - if (MapMod) { - KDGameData.MapMod = MapMod; - KDGameData.MapFaction = KDMapMods[KDGameData.MapMod].faction; - } else { - KDGameData.MapMod = ""; - KDGameData.MapFaction = ""; - } - - if (!data.overrideJourney) { - let Journey = KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Journey; - if (Journey) { - KDGameData.Journey = Journey; - KDInitializeJourney(KDGameData.Journey); - } - } - - if (!data.overrideRoomType) { - let RoomType = KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).RoomType; - if (RoomType) { - KDGameData.RoomType = RoomType; - } - } - } - - - if (toTile == 's') { - KinkyDungeonSendActionMessage(10, TextGet("ClimbDown"), "#ffffff", 1); - KinkyDungeonSetCheckPoint(KDGameData.MainPath, true, suppressCheckPoint); - } else if (toTile == 'H') { - KinkyDungeonSendActionMessage(10, TextGet("ClimbDownShortcut"), "#ffffff", 1); - KinkyDungeonSetCheckPoint(KDGameData.ShortcutPath, true, suppressCheckPoint); - } - - if (KinkyDungeonState != "End") { - KinkyDungeonSendEvent("afterHandleStairs", { - toTile: toTile, - }); - KDGameData.HeartTaken = false; - KinkyDungeonCreateMap(KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]], MiniGameKinkyDungeonLevel, undefined, undefined); - let saveData = KinkyDungeonSaveGame(true); - if (KDGameData.RoomType == "PerkRoom" && MiniGameKinkyDungeonLevel >= 1) { // && Math.floor(MiniGameKinkyDungeonLevel / 3) == MiniGameKinkyDungeonLevel / 3 - if ((!KinkyDungeonStatsChoice.get("saveMode")) && !suppressCheckPoint) { - KinkyDungeonState = "Save"; - ElementCreateTextArea("saveDataField"); - ElementValue("saveDataField", saveData); - } - } - KinkyDungeonSaveGame(); - KDSendStatus('nextLevel'); - } else { - KDSendStatus('end'); - } - - } else { - KinkyDungeonSendActionMessage(10, TextGet("ClimbDownFail"), "#ffffff", 1); - } - } -} - - -let KinkyDungeonConfirmStairs = false; - -function KinkyDungeonHandleMoveObject(moveX, moveY, moveObject) { - if (KDMoveObjectFunctions[moveObject]) { - return KDMoveObjectFunctions[moveObject](moveX, moveY); - } - return false; -} - -/** - * - * @param {number} x - * @param {number} y - * @returns {boolean} - */ -function KDHasEffectTile(x, y) { - return KinkyDungeonEffectTilesGet(x + "," + y) != undefined; -} - -/** - * - * @param {number} x - * @param {number} y - * @returns {Record} - */ -function KDGetEffectTiles(x, y) { - let str = x + "," + y; - return KinkyDungeonEffectTilesGet(str) ? KinkyDungeonEffectTilesGet(str) : {}; -} - -function KDGetSpecificEffectTile(x, y, tile) { - return KDGetEffectTiles(x, y)[tile]; -} - -/** - * - * @param {number} x - * @param {number} y - * @param {effectTileRef} tile - * @param {number} durationMod - * @returns {effectTile} - */ -function KDCreateEffectTile(x, y, tile, durationMod) { - if (x < 1 || y < 1 || x >= KinkyDungeonGridWidth || y >= KinkyDungeonGridHeight) return null; - let existingTile = KDGetSpecificEffectTile(x, y); - let duration = (tile.duration ? tile.duration : KDEffectTiles[tile.name].duration) + KDRandom() * (durationMod ? durationMod : 0); - let createdTile = existingTile; - if (existingTile && existingTile.duration < tile.duration) { - existingTile.duration = duration; - } else { - let tt = Object.assign({x: x, y: y}, KDEffectTiles[tile.name]); - Object.assign(tt, tile); - tt.duration = duration; - if (!KinkyDungeonEffectTilesGet(x + "," + y)) { - KinkyDungeonEffectTilesSet(x + "," + y, {}); - } - KDGetEffectTiles(x, y)[tt.name] = tt; - createdTile = tt; - } - if (createdTile) { - KDInteractNewTile(createdTile); - return createdTile; - } - return null; -} - -function KDInteractNewTile(newTile) { - let Creator = KDEffectTileCreateFunctionsCreator[newTile.name]; - let Existing = null; - for (let tile of Object.values(KDGetEffectTiles(newTile.x, newTile.y))) { - if (tile != newTile) { - if (Creator) Creator(newTile, tile); - if (tile.duration > 0) { - Existing = KDEffectTileCreateFunctionsExisting[tile.name]; - if (Existing) Existing(newTile, tile); - } - } - } -} - -/** - * - * @param {number} x - * @param {number} y - * @param {effectTileRef} tile - * @param {number} [durationMod] - * @param {number} [rad] - * @param {{x: number, y: number}} [avoidPoint] - * @param {number} [density] - * @param {string} mod - explosion modifier - */ -function KDCreateAoEEffectTiles(x, y, tile, durationMod, rad, avoidPoint, density, mod = "") { - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x + X, Y + y)) && AOECondition(x, y, x+X, y+Y, rad, mod) && (!avoidPoint || avoidPoint.x != X + x || avoidPoint.y != Y + y) && (density == undefined || KDRandom() < density)) { - KDCreateEffectTile(x + X, y + Y, tile, durationMod); - } - } -} - -/** - * - * @param {number} x - * @param {number} y - * @param {string[]} tagsToRemove - * @param {number} [rad] - * @param {{x: number, y: number}} [avoidPoint] - * @param {number} [density] - * @param {string} mod - explosion modifier - */ -function KDRemoveAoEEffectTiles(x, y, tagsToRemove, rad, avoidPoint, density, mod = "") { - for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) - for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { - if (AOECondition(x, y, x+X, y+Y, rad, mod) && (!avoidPoint || avoidPoint.x != X + x || avoidPoint.y != Y + y) && (density == undefined || KDRandom() < density)) { - let tiles = KDGetEffectTiles(x + X, y + Y); - for (let tile of Object.values(tiles)) { - for (let tag of tagsToRemove) { - if (tile.tags && tile.tags.includes(tag)) { - tile.duration = 0; - break; - } - } - } - } - } -} - -/** - * Current alpha vs fade type - * @param {string} id - * @param {number} alpha - * @param {string} fade - * @param {number} delta - */ -function KDApplyAlpha(id, alpha, fade, delta) { - if (!fade) return 1.0; - switch (fade) { - case "random": { - if (alpha >= 1 || alpha <= 0) KDTileModes[id] = !KDTileModes[id]; - return Math.max(0, Math.min(1, alpha + (KDTileModes[id] ? -delta*0.001 : delta*0.001))); - } - } -} - -/** @type {Record} */ -let KDTileModes = { -}; - - -let KDLastEffTileUpdate = 0; -function KDDrawEffectTiles(canvasOffsetX, canvasOffsetY, CamX, CamY) { - let delta = CommonTime() - KDLastEffTileUpdate; - KDLastEffTileUpdate = CommonTime(); - for (let tileLocation of Object.values(KinkyDungeonEffectTiles)) { - for (let tile of Object.values(tileLocation)) { - let sprite = (tile.pauseDuration > 0 && tile.pauseSprite) ? tile.pauseSprite : (tile.skin ? tile.skin : tile.name); - if (tile.x >= CamX && tile.y >= CamY && tile.x < CamX + KinkyDungeonGridWidthDisplay && tile.y < CamY + KinkyDungeonGridHeightDisplay && KinkyDungeonVisionGet(tile.x, tile.y) > 0) { - if (!KDCanSeeEffectTile(tile)) continue; - let tileid = tile.x + "," + tile.y + "_" + sprite; - KDDraw(kdgameboard, kdpixisprites, tileid, KinkyDungeonRootDirectory + "EffectTiles/" + sprite + ".png", - (tile.x + (tile.xoffset ? tile.xoffset : 0) - CamX)*KinkyDungeonGridSizeDisplay, (tile.y - CamY + (tile.yoffset ? tile.yoffset : 0))*KinkyDungeonGridSizeDisplay, - KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, 0, { - zIndex: -0.1 + 0.01 * tile.priority, - alpha: KDApplyAlpha(tileid, kdpixisprites.get(tileid)?.alpha, tile.fade, delta), - }); - } - } - } -} - -/** - * - * @param {effectTile} tile - * @returns {boolean} - */ -function KDCanSeeEffectTile(tile) { - if (KinkyDungeonState != "TileEditor" && tile.tags?.includes("hiddenmagic")) { - let rad = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "MagicalSight"); - if (rad <= 0 || KDistEuclidean(tile.x - KinkyDungeonPlayerEntity.x, tile.y - KinkyDungeonPlayerEntity.y) > rad) return false; - } - return true; -} - - -function KDUpdateEffectTiles(delta) { - // Update enemies and the player - for (let examinedTile of Object.values(KDGetEffectTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y))) { - if (examinedTile) KinkyDungeonUpdateSingleEffectTile(delta, KinkyDungeonPlayerEntity, examinedTile); - } - - for (let enemy of KinkyDungeonEntities) { - for (let examinedTile of Object.values(KDGetEffectTiles(enemy.x, enemy.y))) { - if (examinedTile) if (examinedTile) KinkyDungeonUpdateSingleEffectTile(delta, enemy, examinedTile); - } - } - - // Tick them down - for (let loc of Object.entries(KinkyDungeonEffectTiles)) { - let location = loc[1]; - for (let t of Object.entries(location)) { - if (t[1].pauseDuration > 0) { - t[1].pauseDuration -= delta; - } else { - if (t[1].duration > 0 && t[1].duration < 9000) t[1].duration -= delta; - } - if (t[1].pauseDuration <= 0.001) t[1].pauseSprite = undefined; - if (t[1].duration <= 0.001) delete location[t[0]]; - else { - KinkyDungeonUpdateSingleEffectTileStandalone(delta, t[1]); - } - } - if (Object.values(loc[1]).length < 1) { - delete KinkyDungeonEffectTiles[loc[0]]; - } - } -} - -/** - * - * @param {number} delta - * @param {entity} entity - * @param {effectTile} tile - */ -function KinkyDungeonUpdateSingleEffectTile(delta, entity, tile,) { - if (tile.duration > 0 && KDEffectTileFunctions[tile.name]) { - KDEffectTileFunctions[tile.name](delta, entity, tile); - } -} -/** - * - * @param {number} delta - * @param {effectTile} tile - */ -function KinkyDungeonUpdateSingleEffectTileStandalone(delta, tile,) { - if (tile.duration > 0 && KDEffectTileFunctionsStandalone[tile.name]) { - KDEffectTileFunctionsStandalone[tile.name](delta, tile); - } -} - - - -/** - * - * @param {any} b - * @param {effectTile} tile - * @param {number} d - */ -function KinkyDungeonBulletInteractionSingleEffectTile(b, tile, d) { - if (tile.duration > 0 && KDEffectTileBulletFunctions[tile.name]) { - KDEffectTileBulletFunctions[tile.name](b, tile, d); - } -} - - -function KDEffectTileInteractions(x, y, b, d) { - for (let examinedTile of Object.values(KDGetEffectTiles(x, y))) { - if (examinedTile) KinkyDungeonBulletInteractionSingleEffectTile(b, examinedTile, d); - } -} - -/** - * Moves an entity - * @param {entity} enemy - * @param {number} x - * @param {number} y - * @param {boolean} willing - * @param {boolean} [ignoreBlocked] - Ignore if the target is blocked--important if swapping - */ -function KDMoveEntity(enemy, x, y, willing, dash, forceHitBullets, ignoreBlocked) { - enemy.lastx = enemy.x; - enemy.lasty = enemy.y; - let cancel = {cancelmove: false, returnvalue: false}; - for (let newTile of Object.values(KDGetEffectTiles(x, y))) { - if (newTile.duration > 0 && KDEffectTileMoveOnFunctions[newTile.name]) { - cancel = KDEffectTileMoveOnFunctions[newTile.name](enemy, newTile, willing, {x: x - enemy.x, y: y - enemy.y}, dash); - } - } - if (!ignoreBlocked && KinkyDungeonEntityAt(x, y)) cancel.cancelmove = true; - if (!cancel.cancelmove) { - enemy.x = x; - enemy.y = y; - - KinkyDungeonSendEvent("enemyMove", { - cancelmove: cancel.cancelmove, - returnvalue: cancel.returnvalue, - willing: willing, - sprint: dash, - lastX: enemy.lastx, - lastY: enemy.lasty, - moveX: x, - moveY: y, - enemy: enemy, - }); - KDCheckCollideableBullets(enemy, forceHitBullets); - enemy.fx = undefined; - enemy.fy = undefined; - if (enemy.x != enemy.lastx || enemy.y != enemy.lasty) KDUpdateEnemyCache = true; - } - return cancel.returnvalue; -} - -function KDStaggerEnemy(enemy) { - enemy.fx = undefined; - enemy.fy = undefined; - enemy.movePoints = 0; -} - - -function KDMovePlayer(moveX, moveY, willing, sprint, forceHitBullets) { - KinkyDungeonPlayerEntity.lastx = KinkyDungeonPlayerEntity.x; - KinkyDungeonPlayerEntity.lasty = KinkyDungeonPlayerEntity.y; - let cancel = {cancelmove: false, returnvalue: false}; - for (let newTile of Object.values(KDGetEffectTiles(moveX, moveY))) { - if (newTile.duration > 0 && KDEffectTileMoveOnFunctions[newTile.name]) { - cancel = KDEffectTileMoveOnFunctions[newTile.name](KinkyDungeonPlayerEntity, newTile, willing, {x: moveX - KinkyDungeonPlayerEntity.x, y: moveY - KinkyDungeonPlayerEntity.y}, sprint); - } - } - if (!cancel.cancelmove) { - KinkyDungeonPlayerEntity.x = moveX; - KinkyDungeonPlayerEntity.y = moveY; - } - KinkyDungeonSendEvent("playerMove", { - cancelmove: cancel.cancelmove, // If true, cancels the move - returnvalue: cancel.returnvalue, // Returns this - willing: willing, // True if the player triggers it, false if yoinked by tether - sprint: sprint, // True if faster than usual - lastX: KinkyDungeonPlayerEntity.lastx, - lastY: KinkyDungeonPlayerEntity.lasty, - moveX: moveX, - moveY: moveY, - }); - if (!cancel.cancelmove) { - KDCheckCollideableBullets(KinkyDungeonPlayerEntity, forceHitBullets); - KinkyDungeonHandleTraps(KinkyDungeonPlayerEntity, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonTrapMoved); - } - return cancel.returnvalue; -} - -function KDSlip(dir) { - let maxSlip = 2; - let maxReached = 0; - for (let i = 0; i < maxSlip; i++) { - let newTiles = KDGetEffectTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); - let oldTiles = KDGetEffectTiles(KinkyDungeonPlayerEntity.x + dir.x, KinkyDungeonPlayerEntity.y + dir.y); - if ((Object.values(newTiles).some((tile) => {return tile.tags?.includes("slippery") - || ((tile.statuses?.frozen || tile.name.includes("Frozen")) && tile.tags?.includes("slipperywhenfrozen"));}) - || Object.values(oldTiles).some((tile) => {return tile.tags?.includes("slippery") - || ((tile.statuses?.frozen || tile.name.includes("Frozen")) && tile.tags?.includes("slipperywhenfrozen"));})) - && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x + dir.x, KinkyDungeonPlayerEntity.y + dir.y)) - && !KinkyDungeonEnemyAt(KinkyDungeonPlayerEntity.x + dir.x, KinkyDungeonPlayerEntity.y + dir.y)) { - KDMovePlayer(KinkyDungeonPlayerEntity.x + dir.x, KinkyDungeonPlayerEntity.y + dir.y, false, true); - KinkyDungeonHandleStepOffTraps(KinkyDungeonPlayerEntity, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonPlayerEntity.x + dir.x, KinkyDungeonPlayerEntity.y + dir.y); - KinkyDungeonHandleTraps(KinkyDungeonPlayerEntity, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true); - maxReached = i; - } else { - i = maxSlip; - } - - } - if (maxReached) { - KinkyDungeonSendActionMessage(10, TextGet("KDSlipIce"), "yellow", maxReached + 1); - KinkyDungeonSlowMoveTurns = Math.max(KinkyDungeonSlowMoveTurns, 1); - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "Slipping", type: "none", power: 1.0, duration: 1,}); - return true; - } - return false; -} - -/** - * Helper function for flammable tiles - */ -function KDInferno(existingTile, newTile, duration) { - if (newTile.tags.includes("fire") || newTile.tags.includes("ignite")) { - existingTile.duration = 0; - KDCreateEffectTile(existingTile.x, existingTile.y, { - name: "Inferno", - duration: duration, - }, 2); - } -} - -/** - * Helper function for flammables - * @param {*} b - * @param {effectTile} tile - * @param {*} d - */ -function KDIgnition(b, tile, d) { - if (b.bullet.damage) { - let type = b.bullet.damage.type; - if ((KDIgnitionSources.includes(type)) && b.bullet.damage.damage > 0) { - KDCreateEffectTile(tile.x, tile.y, { - name: "Ember", - duration: 2, - }, 1); - } - } -} - -/** - * Code for a conveyor tile. DY and DX enable this functionality - * @param {number} delta - * @param {number} X - * @param {number} Y - */ -function KDConveyor(delta, X, Y) { - let tile = KinkyDungeonTilesGet(X + "," + Y); - if (!tile || tile.SwitchMode == "Off") return; - let entity = KinkyDungeonEntityAt(X, Y); - let tiletype = KinkyDungeonMapGet(X + (tile.DX || 0), Y + (tile.DY || 0)); - if (entity && KinkyDungeonMovableTilesEnemy.includes(tiletype) && !KinkyDungeonEntityAt(X + (tile.DX || 0), Y + (tile.DY || 0))) { - if (entity.player) { - if (!KinkyDungeonFlags.get("conveyed")) { - KinkyDungeonSetFlag("conveyed", 2); - KDMovePlayer(X + (tile.DX || 0), Y + (tile.DY || 0), false, false, true); - KinkyDungeonSendTextMessage(4, TextGet("KDConveyorPush"), "#ffff44", 2); - } - } else if (!KDIsImmobile(entity) && !entity.Enemy.tags.flying && !entity.Enemy.tags.ignoreconveyor && !entity.Enemy.ethereal - && !(entity.Enemy.tags.unstoppable || (entity.Enemy.tags.unflinching && !KinkyDungeonIsDisabled(entity)))) { - if (entity.Enemy.tags.prisoner) KDStaggerEnemy(entity); - if (!KDEnemyHasFlag(entity, "conveyed")) { - KinkyDungeonSetEnemyFlag(entity, "conveyed", 2); - KDMoveEntity(entity, X + (tile.DX || 0), Y + (tile.DY || 0), false, false, true); - } - } - } -} \ No newline at end of file diff --git a/Game/KinkyDungeonTilesList.js b/Game/KinkyDungeonTilesList.js deleted file mode 100644 index 99080246d..000000000 --- a/Game/KinkyDungeonTilesList.js +++ /dev/null @@ -1,1138 +0,0 @@ -"use strict"; - -/** - * Updates local tiles such as conveyors - * @type {Record void>} - */ -let KDTileUpdateFunctionsLocal = { - 'z': (delta, X, Y) => { - let entity = KinkyDungeonEntityAt(X, Y); - if (entity) return; - let mapTile = KinkyDungeonTilesGet(X + "," + Y); - if (mapTile?.wireType == "AutoDoor_HoldOpen" || mapTile?.wireType == "AutoDoor_HoldClosed") { - let tags = KDEffectTileTags(X, Y); - if ((!tags.signal && mapTile.wireType == "AutoDoor_HoldOpen") - || (tags.signal && mapTile.wireType == "AutoDoor_HoldClosed")) { - KinkyDungeonMapSet(X, Y, 'Z'); - } - } - }, - 'Z': (delta, X, Y) => { - let mapTile = KinkyDungeonTilesGet(X + "," + Y); - if (mapTile?.wireType == "AutoDoor_HoldOpen" || mapTile?.wireType == "AutoDoor_HoldClosed") { - let tags = KDEffectTileTags(X, Y); - if ((tags.signal && mapTile.wireType == "AutoDoor_HoldOpen") - || (!tags.signal && mapTile.wireType == "AutoDoor_HoldClosed")) { - KinkyDungeonMapSet(X, Y, 'z'); - } - } - }, - "w": (delta, X, Y) => { - KDCreateEffectTile(X, Y, { - name: "Water", - duration: 2, - }, 0); - }, - "V": (delta, X, Y) => { - KDConveyor(delta, X, Y); - }, - "N": (delta, X, Y) => { - let tile = KinkyDungeonTilesGet(X + "," + Y); - let tU = KinkyDungeonTilesGet(X + "," + (Y - 1)); - let tD = KinkyDungeonTilesGet(X + "," + (Y + 1)); - let tR = KinkyDungeonTilesGet((X + 1) + "," + Y); - let tL = KinkyDungeonTilesGet((X - 1) + "," + Y); - - if (tU?.DY == 1) tile.DY = 1; - else if (tD?.DY == -1) tile.DY = -1; - else if (tL?.DX == 1) tile.DX = 1; - else if (tR?.DX == -1) tile.DX = -1; - - let entity = KinkyDungeonEntityAt(X, Y); - let BMType = KDBondageMachineFunctions[tile.Binding]; - - if (entity) { - let eligible = false; - if (entity.player) { - if (!KinkyDungeonFlags.get("processed")) { - eligible = BMType.eligible_player(tile, X, Y, entity); - if (eligible) { - if (BMType.function_player(tile, delta, X, Y, entity)) return; - } - } - } else if (entity.Enemy?.bound) { - if (entity.Enemy.tags.prisoner) KDStaggerEnemy(entity); - if (!KDEnemyHasFlag(entity, "processed")) { - eligible = BMType.eligible_enemy(tile, X, Y, entity); - if (eligible) { - if (BMType.function_enemy(tile, delta, X, Y, entity)) return; - } - } - } - } - - KDConveyor(delta, X, Y); - }, - "u": (delta, X, Y) => { - let tile = KinkyDungeonTilesGet(X + "," + Y); - - if (!tile.cd) tile.cd = 0; - if (tile.cd <= 0) { - if (tile.count == undefined || tile.count > 0) { - // Too many dolls!!! - if (KDGameData.DollCount > 30) return; - let nearbyEnemyCount = KDNearbyEnemies(X, Y, 4.5); - if (nearbyEnemyCount.length > 6) return; - let start = true; - let ind = tile.index; - // Loop through and cycle if needed - while (start || ind != tile.index) { - start = false; - let tx = ind == 0 ? -1 : (ind == 2 ? 1 : 0); - let ty = ind == 1 ? -1 : (ind == 3 ? 1 : 0); - - // Create a doll on a conveyor if needed - let entity = KinkyDungeonEntityAt(X + tx, Y + ty); - let tiletype = KinkyDungeonMapGet(X + tx, Y + ty); - let tiledest = KinkyDungeonTilesGet((X + tx) + ',' + (Y + ty)); - if (tiletype == 'V' && tiledest?.SwitchMode != "Off" && !entity) { - tile.cd = tile.rate; - let e = DialogueCreateEnemy(X + tx, Y + ty, tile.dollType || "FactoryDoll"); - KinkyDungeonSetEnemyFlag(e, "conveyed", 1); - if (tile.count != undefined) tile.count -= 1; - break; - } - ind += 1; - ind = ind % 4; - } - tile.index = ind; - } - } else { - tile.cd -= delta; - } - }, - "t": (delta, X, Y) => { - // Consume prisoners on the tile - let entity = KinkyDungeonEntityAt(X, Y); - if (entity && !entity.player) { - if (entity.Enemy?.tags.prisoner || KDHelpless(entity)) { - KDStaggerEnemy(entity); - if (!KDEnemyHasFlag(entity, "conveyed")) { - KDClearItems(entity); - entity.hp = 0; - } - } else { - // kick them out... - KDKickEnemyLocal(entity); - } - - } else if (entity?.player && !KinkyDungeonFlags.get("nodollterm")) { - if (KinkyDungeonFlags.get("conveyed")) { - KDStartDialog("DollTerminal_Forced", "", true, ""); - } else { - KDStartDialog("DollTerminal_Step", "", true, ""); - } - } - }, -}; - -/** - * Return value: whether or not to continue to allow peripheral tile updates - * @type {Record} - */ -let KDBondageMachineFunctions = { - "Latex": { - eligible_player: (tile, x, y, entity) => { - return KDGetRestraintsEligible({tags: ['latexEncase']}, 10, 'grv', false, undefined, undefined, undefined, false).length > 0; - }, - function_player: (tile, delta, x, y, entity) => { - KDBasicRestraintsMachine_Player(['latexEncase'], 2, "KDEncasement"); - return false; - }, - eligible_enemy: (tile, x, y, entity) => { - return true; - }, - function_enemy: (tile, delta, x, y, entity) => { - KDTieUpEnemy(entity, 4.0, "Slime", "glue"); - if (KDBoundEffects(entity) > 2 ) { - KDTieUpEnemy(entity, 4.0, "Slime", "glue"); - KinkyDungeonApplyBuffToEntity(entity, KDEncasedDoll); - } - if (KDBoundEffects(entity) < 1 ) { - KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); - KinkyDungeonSetEnemyFlag(entity, "processed", 1); - return true; - } - return false; - }, - }, - "Metal": { - eligible_player: (tile, x, y, entity) => { - return KDGetRestraintsEligible({tags: ["hitechCables", "cableGag", "controlHarness"]}, 10, 'grv', false, undefined, undefined, undefined, false).length > 0; - }, - function_player: (tile, delta, x, y, entity) => { - KDBasicRestraintsMachine_Player(["hitechCables", "cableGag", "controlHarness"], 2, "KDMetalMachine"); - return false; - }, - eligible_enemy: (tile, x, y, entity) => { - return true; - }, - function_enemy: (tile, delta, x, y, entity) => { - KDTieUpEnemy(entity, 4.0, "Metal", "chain"); - if (KDBoundEffects(entity) < 1 ) { - KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); - KinkyDungeonSetEnemyFlag(entity, "processed", 1); - return true; - } - return false; - }, - }, - "Tape": { - eligible_player: (tile, x, y, entity) => { - return KDGetRestraintsEligible({tags: ["autoTape"]}, 10, 'grv', false, undefined, undefined, undefined, false).length > 0; - }, - function_player: (tile, delta, x, y, entity) => { - KDBasicRestraintsMachine_Player(["autoTape"], 2, "KDTapeMachine"); - return false; - }, - eligible_enemy: (tile, x, y, entity) => { - return true; - }, - function_enemy: (tile, delta, x, y, entity) => { - KDTieUpEnemy(entity, 4.0, "Tape", "glue"); - if (KDBoundEffects(entity) < 1 ) { - KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); - KinkyDungeonSetEnemyFlag(entity, "processed", 1); - return true; - } - return false; - }, - }, - "Plug": { - eligible_player: (tile, x, y, entity) => { - return KDGetRestraintsEligible({tags: ['machinePlug']}, 10, 'grv', false, undefined, undefined, undefined, false).length > 0; - }, - function_player: (tile, delta, x, y, entity) => { - return KDBasicRestraintsMachine_Player(['machinePlug'], 1, "KDPlugMachine") != 0; - }, - eligible_enemy: (tile, x, y, entity) => { - return (entity.boundLevel > 0 || KDEntityGetBuff(entity, "Chastity")) && !(entity.buffs && KinkyDungeonGetBuffedStat(entity.buffs, "Plug") >= 2); - }, - function_enemy: (tile, delta, x, y, entity) => { - KDPlugEnemy(entity); - if (KinkyDungeonGetBuffedStat(entity.buffs, "Plug") > 0) { - KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); - KinkyDungeonSetEnemyFlag(entity, "processed", 1); - return true; - } - return false; - }, - }, - "Chastity": { - eligible_player: (tile, x, y, entity) => { - return KDGetRestraintsEligible({tags: ['machineChastity']}, 10, 'grv', false, undefined, undefined, undefined, false).length > 0; - }, - function_player: (tile, delta, x, y, entity) => { - return KDBasicRestraintsMachine_Player(['machineChastity'], 1, "KDChastityMachine") != 0; - }, - eligible_enemy: (tile, x, y, entity) => { - return entity.boundLevel > 0 && !KDEntityGetBuff(entity, "Chastity"); - }, - function_enemy: (tile, delta, x, y, entity) => { - KDTieUpEnemy(entity, 2.0, "Metal", "chain"); - KinkyDungeonApplyBuffToEntity(entity, KDChastity); - if (KDEntityGetBuff(entity, "Chastity")) { - KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); - KinkyDungeonSetEnemyFlag(entity, "processed", 1); - return true; - } - return false; - }, - }, -}; - -/** - * - * @param {string[]} tags - * @param {number} count - * @param {string} msg - */ -function KDBasicRestraintsMachine_Player(tags, count, msg) { - let succ = 0; - for (let i = 0; i < count; i++) { - let restraint = KinkyDungeonGetRestraint({tags: tags}, 10, 'grv', false, undefined, undefined, undefined, false); - if (restraint) { - succ = KinkyDungeonAddRestraintIfWeaker(restraint, MiniGameKinkyDungeonLevel, false, undefined, undefined, undefined, undefined, "AncientRobot", true) || succ; - } - } - if (succ) { - KinkyDungeonSetFlag("conveyed", 2); - KinkyDungeonSetFlag("processed", 3); - KinkyDungeonSendTextMessage(8, TextGet(msg), "#ffff44", 2); - } - return succ; -} - -/** - * Return value: whether or not to continue to allow peripheral tile updates - * @type {Record boolean>} - */ -let KDTileUpdateFunctions = { - "]": (delta) => { // Happy Gas! - KinkyDungeonChangeDistraction(1 * delta, false, 0.1); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonHappyGas"), "pink", 1); - return true; - }, - "[": (delta) => { // Happy Gas! - KinkyDungeonSleepiness = Math.max(KinkyDungeonSleepiness + 2, 5); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSporeGas"), "pink", 1); - return true; - }, - "L" : (delta) => { // Barrel - if (KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y) - && KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture) { - let furn = KDFurniture[KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture]; - if (furn) { - furn.tickFunction(delta); - } - } else { - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "barrel", type: "SlowDetection", duration: 1, power: 9.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "barrel3", type: "Sneak", duration: 1, power: 1.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "darkness", "move", "cast"]}); - KinkyDungeonApplyBuff(KinkyDungeonPlayerBuffs, {id: "barrel2", type: "SlowLevel", duration: 1, power: 1, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Slow", "move", "cast"]}); - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonBarrel"), "lightgreen", 1, true); - } - return true; - }, - "?": (delta) => { // High hook - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonHookHigh"), "lightgreen", 1, true); - return true; - }, - "/": (delta) => { // Low hook - KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonScrap"), "lightgreen", 1, true); - return true; - }, -}; - -/** - * @type {Record boolean>} - */ -let KDMoveObjectFunctions = { - 'B': (moveX, moveY) => { - if (!KinkyDungeonFlags.get("slept") && !KinkyDungeonFlags.get("nobed") && KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.49) { - KDStartDialog("Bed", "", true); - } - return false; - }, - '@': (moveX, moveY) => { - if (!KinkyDungeonFlags.get("nobutton")) { - KDStartDialog("Button", "", true); - } - return false; - }, - 'l': (moveX, moveY) => { - if (!KinkyDungeonFlags.get("noleyline") && KinkyDungeonStatManaPool < KinkyDungeonStatManaPoolMax && KDTile(moveX, moveY) && KDTile(moveX, moveY).Leyline) { - KDStartDialog("Leyline", "", true); - } - return false; - }, - 'D': (moveX, moveY) => { // Open the door - KinkyDungeonAdvanceTime(1, true); - let open = !KinkyDungeonStatsChoice.get("Doorknobs") || !KinkyDungeonIsHandsBound(true, true, 0.45); - if (!open) { - if (KinkyDungeonCanUseFeet()) { - KinkyDungeonSendActionMessage(10, TextGet("KDDoorknobFeet"), "#88ff88", 2); - open = true; - } else { - let grace = 0; - if (KinkyDungeonFlags.get("failUnfairFirst") && !KinkyDungeonFlags.get("failUnfair")) grace = 0.4; - let armsbound = KinkyDungeonIsArmsBound(true, true); - if (KDRandom() - grace < (armsbound ? KDDoorKnobChance : KDDoorKnobChanceArms)) { - KinkyDungeonSendActionMessage(10, TextGet("KDDoorknobSuccess" + ((armsbound) ? "" : "Arms")), "#88ff88", 2); - open = true; - } else if (KDRandom() - grace < (armsbound ? KDDoorAttractChance : KDDoorAttractChanceArms) && DialogueBringNearbyEnemy(moveX, moveY, 10)) { - KinkyDungeonSendActionMessage(10, TextGet("KDDoorknobAttract" + ((armsbound) ? "" : "Arms")), "#ff5555", 2); - KinkyDungeonMakeNoise(armsbound ? 6 : 3, moveX, moveY); - open = true; - } else { - KinkyDungeonSendActionMessage(10, TextGet("KDDoorknobFail" + (armsbound ? "" : "Arms")), "#ff5555", 2); - KinkyDungeonMakeNoise(armsbound ? 6 : 3, moveX, moveY); - if (!KinkyDungeonFlags.get("failUnfairFirst")) { - KinkyDungeonSetFlag("failUnfair", 5); - KinkyDungeonSetFlag("failUnfairFirst", 10); - } - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Locked.ogg"); - } - } - } - if (open) { - KinkyDungeonMapSet(moveX, moveY, 'd'); - - // For private doors, aggro the faction - let faction = KinkyDungeonTilesGet(moveX + "," +moveY) && KinkyDungeonTilesGet(moveX + "," +moveY).Faction ? KinkyDungeonTilesGet(moveX + "," +moveY).Faction : undefined; - if (faction) { - KinkyDungeonAggroFaction(faction, true); - } - - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/DoorOpen.ogg"); - } - - return true; - }, - 'C': (moveX, moveY) => { // Open the chest - let chestType = KinkyDungeonTilesGet(moveX + "," +moveY) && KinkyDungeonTilesGet(moveX + "," +moveY).Loot ? KinkyDungeonTilesGet(moveX + "," +moveY).Loot : "chest"; - let faction = KinkyDungeonTilesGet(moveX + "," +moveY) && KinkyDungeonTilesGet(moveX + "," +moveY).Faction ? KinkyDungeonTilesGet(moveX + "," +moveY).Faction : undefined; - let noTrap = KinkyDungeonTilesGet(moveX + "," +moveY) && KinkyDungeonTilesGet(moveX + "," +moveY).NoTrap ? KinkyDungeonTilesGet(moveX + "," +moveY).NoTrap : false; - let lootTrap = KinkyDungeonTilesGet(moveX + "," +moveY) && KinkyDungeonTilesGet(moveX + "," +moveY).lootTrap ? KinkyDungeonTilesGet(moveX + "," +moveY).lootTrap : undefined; - let roll = KinkyDungeonTilesGet(moveX + "," +moveY) ? KinkyDungeonTilesGet(moveX + "," +moveY).Roll : KDRandom(); - if (faction && !KinkyDungeonChestConfirm) { - KinkyDungeonChestConfirm = true; - KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChestFaction").replace("FACTION", TextGet("KinkyDungeonFaction" + faction)), "#ff0000", 2, true); - } else { - KinkyDungeonLoot(MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], chestType, roll, KinkyDungeonTilesGet(moveX + "," +moveY), undefined, noTrap); - if (lootTrap) { - KDTrigPanic(); - KDSpawnLootTrap(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, lootTrap.trap, lootTrap.mult, lootTrap.duration); - } - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/ChestOpen.ogg"); - KinkyDungeonMapSet(moveX, moveY, 'c'); - KDGameData.AlreadyOpened.push({x: moveX, y: moveY}); - KinkyDungeonAggroAction('chest', {faction: faction}); - } - return true; - }, - 'Y': (moveX, moveY) => { // Open the chest - let chestType = KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] == "lib" ? "shelf" : "rubble"; - KinkyDungeonLoot(MiniGameKinkyDungeonLevel, KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], chestType); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Coins.ogg"); - KinkyDungeonMapSet(moveX, moveY, 'X'); - KDGameData.AlreadyOpened.push({x: moveX, y: moveY}); - return true; - }, - 'O': (moveX, moveY) => { // Open the chest - if (KinkyDungeonIsPlayer()) - KinkyDungeonTakeOrb(1, moveX, moveY); // 1 spell point - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - KDGameData.AlreadyOpened.push({x: moveX, y: moveY}); - return true; - }, - 'P': (moveX, moveY) => { // Open the chest - if (KinkyDungeonIsPlayer()) { - KDPerkConfirm = false; - KinkyDungeonTakePerk(1, moveX, moveY); // 1 perk choice - } - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Magic.ogg"); - return true; - }, - '-': (moveX, moveY) => { // Open the chest - KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonObjectChargerDestroyed"), "#999999", 1, true); - return true; - }, -}; - - -/** - * Return is whether or not something the player should know about happened - * @type {Record boolean>} - */ -let KDEffectTileFunctionsStandalone = { - "Inferno": (delta, tile) => { - if (tile.duration > 4 && KDRandom() < 0.3 && !(tile.pauseDuration > 0)) { - KDCreateAoEEffectTiles(tile.x, tile.y, { - name: "Ember", - duration: 1, - }, 4, 1.5, undefined, 0.5); - } - return true; - }, - "SlimeBurning": (delta, tile) => { - if (tile.duration > 0 && !(tile.pauseDuration > 0)) { - KDCreateEffectTile(tile.x, tile.y, { - name: "Inferno", - duration: 2, - }, 1); // Create blaze - if (KDRandom() < 0.3) { - KDCreateAoEEffectTiles(tile.x, tile.y, { - name: "Ember", - duration: 1, - }, 4, 1.5, undefined, 0.5); - } - } - return true; - }, - "Torch": (delta, tile) => { - if (tile.duration > 9000) { - tile.duration = 9999; - } - return true; - }, - "TorchUnlit": (delta, tile) => { - if (tile.duration > 9000) { - tile.duration = 9999; - } - return true; - }, - "Lantern": (delta, tile) => { - if (tile.duration > 9000) { - tile.duration = 9999; - } - return true; - }, - "LanternUnlit": (delta, tile) => { - if (tile.duration > 9000) { - tile.duration = 9999; - } - return true; - }, - "TorchOrb": (delta, tile) => { - if (tile.duration > 9000) { - tile.duration = 9999; - } - return true; - }, -}; - -function KDSlimeImmuneEntity(entity) { - if (entity.player) { - if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") >= 0.45) return true; - for (let inv of KinkyDungeonAllRestraint()) { - if (KDRestraint(inv).slimeWalk) { - return true; - } - } - } else return KDSlimeImmune(entity); -} - -function KDSlimeWalker(entity) { - if (KDSlimeImmuneEntity(entity)) return true; - else if (!entity.player && entity.Enemy?.tags.flying) return true; - return false; -} - -function KDSlimeImmune(enemy) { - return enemy.Enemy?.tags.slime || enemy.Enemy?.tags.glueimmune || enemy.Enemy?.tags.glueresist || enemy.Enemy?.tags.slimewalk || KDEntityBuffedStat(enemy, "glueDamageResist") >= 0.45; -} -/** - * These happen when stepped on - * Return is whether or not something the player should know about happened - * @type {Record boolean>} - */ -let KDEffectTileFunctions = { - "PressurePlateHold": (delta, entity, tile) => { - KDCreateEffectTile(tile.x, tile.y, { - name: "WireSparks", - duration: 2, - }, 0); - return false; - }, - "PressurePlate": (delta, entity, tile) => { - let tags = KDEffectTileTags(tile.x, tile.y); - if (!tags.ppactive) { - KDCreateEffectTile(tile.x, tile.y, { - name: "WireSparks", - duration: 2, - }, 0); - } - KDCreateEffectTile(tile.x, tile.y, { - name: "PressurePlateActive", - duration: 2, - }, 0); - return false; - }, - "PressurePlateOneUse": (delta, entity, tile) => { - KDCreateEffectTile(tile.x, tile.y, { - name: "WireSparks", - duration: 2, - }, 0); - tile.duration = 0; - return false; - }, - "SlimeBurning": (delta, entity, tile) => { - if (!KDEntityHasBuff(entity, "Drenched")) { - let slimeWalker = KDSlimeWalker(entity); - if (!slimeWalker) { - KinkyDungeonApplyBuffToEntity(entity, KDSlimed); - return true; - } - } - return false; - }, - "Slime": (delta, entity, tile) => { - if (tile.pauseDuration > 0) { - // Meep - } else if (!KDEntityHasBuff(entity, "Drenched")) { - let slimeWalker = KDSlimeWalker(entity); - if (!slimeWalker) { - KinkyDungeonApplyBuffToEntity(entity, KDSlimed); - return true; - } - } - return false; - }, - "Latex": (delta, entity, tile) => { - if (tile.pauseDuration > 0) { - // Meep - } else { - let result = false; - // Latex slimes entities that are on it - if (!KDEntityHasBuff(entity, "Drenched")) { - let slimeWalker = KDSlimeWalker(entity); - if (!slimeWalker) { - KinkyDungeonApplyBuffToEntity(entity, KDSlimed); - result = true; - } - } - // Latex also constantly applies binding - if (result || KDEntityBuffedStat(entity, "SlimeProgress")) { - if (entity.player) { - let latexData = { - cancelDamage: false, - dmg: KDLatexDmg*KDGetEnvironmentalDmg(), - type: "glue", - }; - KinkyDungeonSendEvent("tickLatexPlayer", latexData); - if (!latexData.cancelDamage) - KinkyDungeonDealDamage({damage: latexData.dmg*KDGetEnvironmentalDmg(), type: latexData.type}); - } else if (KDCanBind(entity)) { - let latexData = { - cancelDamage: entity.boundLevel > entity.Enemy.maxhp + KDLatexBind, - enemy: entity, - dmg: 0, - bind: KDLatexBind*KDGetEnvironmentalDmg(), - type: "glue", - }; - KinkyDungeonSendEvent("tickLatex", latexData); - if (!latexData.cancelDamage) { - KinkyDungeonDamageEnemy(entity, { - type: "glue", - damage: 0, - bind: KDLatexBind*KDGetEnvironmentalDmg(), - flags: ["DoT"] - }, false, true, undefined, undefined, undefined, "Rage"); - if (entity.boundLevel >= entity.Enemy.maxhp) { - KinkyDungeonApplyBuffToEntity(entity, KDEncased); - } - } - } - return true; - } - } - return false; - }, - "Ice": (delta, entity, tile) => { - if ((!entity.player && !entity.Enemy.tags.ice && !entity.Enemy.tags.nofreeze) || (entity.player && !KDChillWalk(entity))) - KinkyDungeonApplyBuffToEntity(entity, KDChilled); - if (entity.player && KinkyDungeonPlayerBuffs.Slipping && !KinkyDungeonFlags.get("slipped")) { - KDSlip({x: KinkyDungeonPlayerEntity.x - KinkyDungeonPlayerEntity.lastx, y: KinkyDungeonPlayerEntity.y - KinkyDungeonPlayerEntity.lasty}); - KinkyDungeonSetFlag("slipped", 1); - } - return true; - }, - "Water": (delta, entity, tile) => { - if (tile.pauseSprite == tile.name + "Frozen") { - if (entity.player && KinkyDungeonPlayerBuffs.Slipping && !KinkyDungeonFlags.get("slipped")) { - KDSlip({x: KinkyDungeonPlayerEntity.x - KinkyDungeonPlayerEntity.lastx, y: KinkyDungeonPlayerEntity.y - KinkyDungeonPlayerEntity.lasty}); - KinkyDungeonSetFlag("slipped", 1); - } - } else if (KDWettable(entity)) { - KinkyDungeonApplyBuffToEntity(entity, KDDrenched); - KinkyDungeonApplyBuffToEntity(entity, KDDrenched2); - KinkyDungeonApplyBuffToEntity(entity, KDDrenched3); - } - return true; - }, - "Inferno": (delta, entity, tile) => { - if (entity.player) { - KinkyDungeonDealDamage({ - type: "fire", - damage: 1*KDGetEnvironmentalDmg(), - time: 0, - bind: 0, - flags: ["BurningDamage"] - }); - KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonInfernoBurn"), "#ff0000", 2); - } else { - KinkyDungeonDamageEnemy(entity, { - type: "fire", - damage: 1*KDGetEnvironmentalDmg(), - time: 0, - bind: 0, - flags: ["BurningDamage"] - }, false, true, undefined, undefined, undefined); - } - if (KDEntityHasBuff(entity, "Drenched")) { - KDEntityGetBuff(entity, "Drenched").duration = Math.max(0, KDEntityGetBuff(entity, "Drenched").duration - 4 * delta); - } - return true; - }, -}; - -/** - * Return is whether or not something the player should know about happened - * @type {Record boolean>} - */ -let KDEffectTileCreateFunctionsCreator = { - "Ropes": (newTile, existingTile) => { - KDInferno(newTile, existingTile, 4); - return true; - }, - "Vines": (newTile, existingTile) => { - KDInferno(newTile, existingTile, 6); - return true; - }, - "Ice": (newTile, existingTile) => { - if (existingTile.tags.includes("freezeover")) { - existingTile.pauseDuration = newTile.duration; - existingTile.pauseSprite = existingTile.name + "Frozen"; - } else if (existingTile.tags.includes("hot")) { - newTile.duration = 0; - } - return true; - }, - "Slime": (newTile, existingTile) => { - if (existingTile.tags.includes("ice")) { - newTile.pauseDuration = newTile.duration; - newTile.pauseSprite = newTile.name + "Frozen"; - } else if (existingTile.tags.includes("ignite")) { - newTile.duration = 0; - KDCreateEffectTile(newTile.x, newTile.y, { - name: "SlimeBurning", - duration: existingTile.duration/2, - }, 0); - } - return true; - }, - "Latex": (newTile, existingTile) => { - if (existingTile.tags.includes("slime")) { - existingTile.duration = 0; - } - return true; - }, - "Water": (newTile, existingTile) => { - if (existingTile.tags.includes("ice")) { - newTile.pauseDuration = newTile.duration; - newTile.pauseSprite = newTile.name + "Frozen"; - } - return true; - }, - "Ember": (newTile, existingTile) => { - if (existingTile.tags.includes("fire")) { - newTile.pauseDuration = existingTile.duration; - newTile.pauseSprite = newTile.name; - } - return true; - }, - "Sparks": (newTile, existingTile) => { - if (existingTile.tags.includes("conductive")) { - let rt = KDEffectTileTags(existingTile.x + 1, existingTile.y); - let lt = KDEffectTileTags(existingTile.x - 1, existingTile.y); - let ut = KDEffectTileTags(existingTile.x, existingTile.y - 1); - let dt = KDEffectTileTags(existingTile.x, existingTile.y + 1); - let dmg = { - type: "electric", - damage: 2.0, - time: 0, - bind: 0, - flags: ["EchoDamage"], - }; - if (!rt.electric && rt.conductive) { - KDCreateEffectTile(existingTile.x + 1, existingTile.y, { - name: "Sparks", - duration: 2, - }, 2); - KDDealEnvironmentalDamage(existingTile.x + 1, existingTile.y, 0.5, dmg, undefined); - } - if (!lt.electric && lt.conductive) { - KDCreateEffectTile(existingTile.x - 1, existingTile.y, { - name: "Sparks", - duration: 2, - }, 2); - KDDealEnvironmentalDamage(existingTile.x - 1, existingTile.y, 0.5, dmg, undefined); - } - if (!dt.electric && dt.conductive) { - KDCreateEffectTile(existingTile.x, existingTile.y + 1, { - name: "Sparks", - duration: 2, - }, 2); - KDDealEnvironmentalDamage(existingTile.x, existingTile.y + 1, 0.5, dmg, undefined); - } - if (!ut.electric && ut.conductive) { - KDCreateEffectTile(existingTile.x, existingTile.y - 1, { - name: "Sparks", - duration: 2, - }, 2); - KDDealEnvironmentalDamage(existingTile.x, existingTile.y - 1, 0.5, dmg, undefined); - } - } - return true; - }, - "WireSparks": (newTile, existingTile) => { - if (existingTile.tags.includes("wire")) { - let mapTile = KinkyDungeonTilesGet(newTile.x + ',' + newTile.y); - if (mapTile?.wireType) { - if (KDActivateMapTile[mapTile.wireType](mapTile, newTile.x, newTile.y)) { - return true; - } - } - - let rt = KDEffectTileTags(existingTile.x + 1, existingTile.y); - let lt = KDEffectTileTags(existingTile.x - 1, existingTile.y); - let ut = KDEffectTileTags(existingTile.x, existingTile.y - 1); - let dt = KDEffectTileTags(existingTile.x, existingTile.y + 1); - if (!rt.signalFrame && rt.wire) { - KDCreateEffectTile(existingTile.x + 1, existingTile.y, { - name: "WireSparksAct", - duration: 1, - }, 0); - KDCreateEffectTile(existingTile.x + 1, existingTile.y, { - name: "WireSparks", - duration: 2, - }, 0); - } - if (!lt.signalFrame && lt.wire) { - KDCreateEffectTile(existingTile.x - 1, existingTile.y, { - name: "WireSparksAct", - duration: 1, - }, 0); - KDCreateEffectTile(existingTile.x - 1, existingTile.y, { - name: "WireSparks", - duration: 2, - }, 0); - } - if (!dt.signalFrame && dt.wire) { - KDCreateEffectTile(existingTile.x, existingTile.y + 1, { - name: "WireSparksAct", - duration: 1, - }, 0); - KDCreateEffectTile(existingTile.x, existingTile.y + 1, { - name: "WireSparks", - duration: 2, - }, 0); - } - if (!ut.signalFrame && ut.wire) { - KDCreateEffectTile(existingTile.x, existingTile.y - 1, { - name: "WireSparksAct", - duration: 1, - }, 0); - KDCreateEffectTile(existingTile.x, existingTile.y - 1, { - name: "WireSparks", - duration: 2, - }, 0); - } - } - return true; - - }, -}; - -/** - * Return is whether or not something the player should know about happened - * Return type is whether or not the signal should stop (true) or pass (false) - * @type {Record boolean>} - */ -let KDActivateMapTile = { - "increment": (tile, x, y) => { - if (!tile.count) tile.count = 0; - tile.count += 1; - return false; - }, - "AutoDoor_Toggle": (tile, x, y) => { - let entity = KinkyDungeonEntityAt(x, y); - if (entity) return true; - - if (KinkyDungeonMapGet(x, y) == 'Z') - KinkyDungeonMapSet(x, y, 'z'); - else - KinkyDungeonMapSet(x, y, 'Z'); - return true; - }, - "Conveyor_Toggle": (tile, x, y) => { - if (tile.SwitchMode == "Off") tile.SwitchMode = "On"; - else tile.SwitchMode = "Off"; - return true; - }, - "Conveyor_Switch": (tile, x, y) => { - if (tile.DX) tile.DX *= -1; - else if (tile.DY) tile.DY *= -1; - return true; - }, - "AutoDoor_HoldOpen": (tile, x, y) => { - KinkyDungeonMapSet(x, y, 'z'); - return true; - }, - "AutoDoor_HoldClosed": (tile, x, y) => { - let entity = KinkyDungeonEntityAt(x, y); - if (entity) return true; - - KinkyDungeonMapSet(x, y, 'Z'); - return true; - }, - "AutoDoor_Open": (tile, x, y) => { - KinkyDungeonMapSet(x, y, 'z'); - return true; - }, - "AutoDoor_Close": (tile, x, y) => { - let entity = KinkyDungeonEntityAt(x, y); - if (entity) return true; - - KinkyDungeonMapSet(x, y, 'Z'); - return true; - }, - -}; - -/** - * Return is whether or not something the player should know about happened - * @type {Record boolean>} - */ -let KDEffectTileCreateFunctionsExisting = { - "Ropes": (newTile, existingTile) => { - KDInferno(existingTile, newTile, 4); - return true; - }, - "Vines": (newTile, existingTile) => { - KDInferno(existingTile, newTile, 6); - return true; - }, - "TorchUnlit": (newTile, existingTile) => { - if (newTile.tags.includes("fire") || newTile.tags.includes("ignite")) { - existingTile.duration = 0; - KDCreateEffectTile(existingTile.x, existingTile.y, { - name: "Torch", - duration: 9999, - }, 0); - } - return true; - }, - "Torch": (newTile, existingTile) => { - if (newTile.tags.includes("freeze")) { - existingTile.duration = 0; - KDCreateEffectTile(existingTile.x, existingTile.y, { - name: "TorchUnlit", - duration: 9999, - }, 0); - } - return true; - }, - "Latex": (newTile, existingTile) => { - if (newTile.tags.includes("slime")) { - newTile.duration = 0; - } - return true; - }, - "LanternUnlit": (newTile, existingTile) => { - if (newTile.tags.includes("fire") || newTile.tags.includes("ignite")) { - existingTile.duration = 0; - KDCreateEffectTile(existingTile.x, existingTile.y, { - name: "Lantern", - duration: 9999, - }, 0); - } - return true; - }, - "SlimeBurning": (newTile, existingTile) => { - if (newTile.tags.includes("ice") || newTile.tags.includes("water")) { - existingTile.duration = 0; - KDCreateEffectTile(existingTile.x, existingTile.y, { - name: "Slime", - duration: existingTile.duration*2, - }, 0); - } - return true; - }, -}; - -/** - * Return is whether or not the move should be interrupted - * @type {Record {cancelmove: boolean, returnvalue: boolean}>} - */ -let KDEffectTileMoveOnFunctions = { - "Cracked": (entity, tile, willing, dir, sprint) => { - if (tile.pauseDuration > 0) { - // Meep - } else if (!entity.Enemy || (!entity.Enemy.tags.earth && !entity.Enemy.tags.unstoppable)) { - KinkyDungeonApplyBuffToEntity(entity, KDUnsteady); - if (entity.player) { - KinkyDungeonApplyBuffToEntity(entity, KDUnsteady2); - KinkyDungeonApplyBuffToEntity(entity, KDUnsteady3); - } else if (!entity.Enemy || !entity.Enemy.tags.unflinching) { - if (!entity.vulnerable) entity.vulnerable = 1; - else entity.vulnerable = Math.max(entity.vulnerable, 1); - } - } - return {cancelmove: false, returnvalue: false}; - }, - "Ice": (entity, tile, willing, dir, sprint) => { - if (sprint && entity.player && willing && (dir.x || dir.y) && !KinkyDungeonFlags.get("slipped")) { - KDSlip(dir); - KinkyDungeonSetFlag("slipped", 1); - return {cancelmove: true, returnvalue: true}; - } - return {cancelmove: false, returnvalue: false}; - }, - "Water": (entity, tile, willing, dir, sprint) => { - if (tile.pauseSprite == tile.name + "Frozen") { - if (sprint && entity.player && willing && (dir.x || dir.y) && !KinkyDungeonFlags.get("slipped")) { - KDSlip(dir); - KinkyDungeonSetFlag("slipped", 1); - return {cancelmove: true, returnvalue: true}; - } - } - return {cancelmove: false, returnvalue: false}; - }, -}; - -let KDTorchExtinguishTypes = ["ice", "frost", "cold", "acid", "water", "stun", "glue"]; -let KDSlimeExtinguishTypes = ["ice", "frost", "cold", "acid", "water"]; -let KDIgnitionSources = ["fire", "electric"]; - -/** - * Return is idk - * @type {Record boolean>} - */ -let KDEffectTileBulletFunctions = { - "Ropes": (b, tile, d) => { - KDIgnition(b, tile, d); - return true; - }, - "Vines": (b, tile, d) => { - KDIgnition(b, tile, d); - return true; - }, - "SlimeBurning": (b, tile, d) => { - if (b.bullet.damage) { - let type = b.bullet.damage.type; - if (KDSlimeExtinguishTypes.includes(type)) { - KDCreateEffectTile(tile.x, tile.y, { - name: "Slime", - duration: tile.duration*2, - }, 0); // Put out fire - tile.duration = 0; - } - } - return true; - }, - "Slime": (b, tile, d) => { - if (b.bullet.damage) { - let type = b.bullet.damage.type; - if ((KDIgnitionSources.includes(type)) && b.bullet.damage.damage > 0) { - KDCreateEffectTile(tile.x, tile.y, { - name: "SlimeBurning", - duration: tile.duration*0.5, - }, 0); // Put out lantern - tile.duration = 0; - } - } - return true; - }, - "Ember": (b, tile, d) => { - if (b.bullet.damage) { - let type = b.bullet.damage.type; - if (type == "stun" && b.bullet.damage.damage > 1) { - let newT = KDCreateEffectTile(tile.x, tile.y, { - name: "Inferno", - duration: 5, - }, 5); // Create blaze - if (newT) - tile.pauseDuration = newT.duration; - } else if ((type == "ice" || type == "frost" || type == "acid")) { - tile.duration = 0; - KDSmokePuff(tile.x, tile.y, 1.5, 0.1, true); - } - } - return true; - }, - "Torch": (b, tile, d) => { - if (b.bullet.damage) { - let type = b.bullet.damage.type; - if (KDTorchExtinguishTypes.includes(type)) { - tile.duration = 0; - KDCreateEffectTile(tile.x, tile.y, { - name: "TorchUnlit", - duration: 9999, - }, 0); // Put out lantern - } - } - return true; - }, - "TorchUnlit": (b, tile, d) => { - if (b.bullet.damage) { - let type = b.bullet.damage.type; - if ((KDIgnitionSources.includes(type))) { - tile.duration = 0; - KDCreateEffectTile(tile.x, tile.y, { - name: "Torch", - duration: 9999, - }, 0); // Put out lantern - } - } - return true; - }, - "Lantern": (b, tile, d) => { - if (b.bullet.damage) { - let type = b.bullet.damage.type; - if (KDTorchExtinguishTypes.includes(type)) { - tile.duration = 0; - KDCreateEffectTile(tile.x, tile.y, { - name: "LanternUnlit", - duration: 9999, - }, 0); // Put out lantern - } - } - return true; - }, - "LanternUnlit": (b, tile, d) => { - if (b.bullet.damage) { - let type = b.bullet.damage.type; - if ((KDIgnitionSources.includes(type))) { - tile.duration = 0; - KDCreateEffectTile(tile.x, tile.y, { - name: "Lantern", - duration: 9999, - }, 0); // Put out lantern - } - } - return true; - }, - "Ice": (b, tile, d) => { - if (b.bullet.damage) { - let type = b.bullet.damage.type; - if ((KDIgnitionSources.includes(type)) && b.bullet.damage.damage > 0) { - tile.duration = 0; - KDCreateEffectTile(tile.x, tile.y, { - name: "Water", - duration: 2, - }, 5); // Create water - } else if ((type == "ice" || type == "frost") && tile.duration < 4 && tile.duration > 0) { - tile.duration = 4; - } - } - return true; - }, - "Water": (b, tile, d) => { - if (b.bullet.damage) { - let type = b.bullet.damage.type; - if ((type == "ice" || type == "frost")) { - KDCreateEffectTile(tile.x, tile.y, { - name: "Ice", - duration: 3, - }, 1); // Create ice - } else { - if (type == "fire" && b.bullet.damage.damage > 0) { - tile.duration = 0; - KDSmokePuff(tile.x, tile.y, 1.5, 0.1, true); - KDCreateEffectTile(tile.x, tile.y, { - name: "Steam", - duration: 6, - }, 2); // Create steam - } - if (type == "electric" && b.bullet.damage.damage > 0) { - KDCreateEffectTile(tile.x, tile.y, { - name: "Sparks", - duration: 3, - }, 1); // Create sparks - } - } - } - return true; - }, -}; diff --git a/Game/KinkyDungeonTraps.js b/Game/KinkyDungeonTraps.js deleted file mode 100644 index 5cf4e9894..000000000 --- a/Game/KinkyDungeonTraps.js +++ /dev/null @@ -1,378 +0,0 @@ -"use strict"; - -let KinkyDungeonTrapMoved = false; - -function KinkyDungeonHandleStepOffTraps(entity, x, y, moveX, moveY) { - let flags = { - AllowTraps: true, - }; - let tile = KinkyDungeonTilesGet(x + "," + y); - if (tile && tile.StepOffTrap && !KinkyDungeonFlags.has("nojailbreak")) { - if (!tile.StepOffTiles || tile.StepOffTiles.includes(moveX + "," + moveY)) { - KinkyDungeonSendEvent("beforeStepOffTrap", {x:x, y:y, tile: tile, flags: flags}); - let msg = ""; - let color = "#ff0000"; - let lifetime = tile.Lifetime ? tile.Lifetime : undefined; - - if (tile.StepOffTrap == "DoorLock" && KinkyDungeonNoEnemy(x, y)) { - KinkyDungeonMapSet(x, y, 'D'); - let spawned = 0; - let maxspawn = 1 + Math.round(Math.min(2 + KDRandom() * 2, KinkyDungeonDifficulty/25) + Math.min(2 + KDRandom() * 2, 0.5*MiniGameKinkyDungeonLevel/KDLevelsPerCheckpoint)); - if (tile.SpawnMult) maxspawn *= tile.SpawnMult; - let requireTags = ["doortrap"]; - - let tags = ["doortrap"]; - KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); - - for (let i = 0; i < 30; i++) { - if (spawned < maxspawn) { - let Enemy = KinkyDungeonGetEnemy( - tags, MiniGameKinkyDungeonLevel, - KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint], - '0', requireTags, true); - if (Enemy) { - KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, Enemy.name, 1, 7, true, Enemy.tags.construct ? 23 : undefined, undefined, true, "Ambush", true, 1.5, true, undefined, true); - if (Enemy.tags.minor) spawned += 0.4; - else spawned += 1; - } - } - } - if (spawned > 0) { - KinkyDungeonMapSet(x, y, 'd'); - let created = KinkyDungeonSummonEnemy(x, y, "DoorLock", 1, 0, false, lifetime); - if (created > 0) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/MagicSlash.ogg"); - msg = "Default"; - KinkyDungeonMakeNoise(12, x, y); - KinkyDungeonTilesDelete(x + "," + y); - KinkyDungeonMapSet(x, y, 'D'); - } - } else - KinkyDungeonMapSet(x, y, 'd'); - } - - if (msg) { - KDTrigPanic(); - - if (msg == "Default") - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonTrap" + tile.StepOffTrap), color, 2); - else - KinkyDungeonSendTextMessage(10, msg, color, 2); - } - } - } - -} - -function KinkyDungeonHandleTraps(entity, x, y, Moved) { - let flags = { - AllowTraps: true, - }; - let tile = KinkyDungeonTilesGet(x + "," + y); - if (tile && tile.Type == "Trap" && !KinkyDungeonFlags.has("nojailbreak")) { - KinkyDungeonSendEvent("beforeTrap", {x:x, y:y, tile: tile, flags: flags}); - if (flags.AllowTraps && Moved) { - let msg = ""; - let triggered = false; - let color = "#ff0000"; - if (KinkyDungeonStatsChoice.has("Rusted") && KDRandom() < 0.25) { - msg = TextGet("KDTrapMisfire"); - } else { - if (tile.Trap === "SpawnEnemies") { - let radius = tile.Power > 4 ? 4 : 2; - let created = KinkyDungeonSummonEnemy(x, y, tile.Enemy, tile.Power, radius, true, undefined, undefined, true, "Ambush", true, 1.5, true); - if (created > 0) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Trap.ogg"); - msg = TextGet("KinkyDungeonTrapSpawn" + tile.Enemy); - KinkyDungeonTilesDelete(x + "," + y); - //if (!tile.noSmoke) { - //KDSmokePuff(x, y, 1.9, 0.5); - //} - triggered = true; - } - } - if (tile.Trap == "SpecificSpell") { - let spell = KinkyDungeonFindSpell(tile.Spell, true); - if (spell) { - let xx = 0; - let yy = 0; - if (!tile.noVary) { - for (let i = 0; i < 10; i++) { - xx = Math.floor(KDRandom() * 3 - 1); - yy = Math.floor(KDRandom() * 3 - 1); - if (xx != 0 || yy != 0) i = 1000; - } - } - KinkyDungeonCastSpell(x + xx, y + yy, spell, undefined, undefined, undefined, "Trap"); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Trap.ogg"); - msg = ""; // The spell will show a message on its own - triggered = true; - KinkyDungeonTilesDelete(x + "," + y); - let etiles = Object.values(KDGetEffectTiles(x, y)).filter((etile) => { - return etile.tags && etile.tags.includes("runetrap"); - }); - if (etiles?.length > 0) { - for (let et of etiles) { - et.duration = 0; - } - } - //if (!tile.noSmoke) { - //KDSmokePuff(x, y, 1.9, 0.5); - //} - } - } - if (tile.Trap == "BarrelTrap") { - if (entity.player) - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BarrelTrap"), 0, true); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Trap.ogg"); - msg = TextGet("KDBarrelTrap"); - triggered = true; - tile.Trap = undefined; - tile.Type = undefined; - } - if (tile.Trap == "CageTrap") { - if (entity.player) - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("CageTrap"), 0, true); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Trap.ogg"); - msg = TextGet("KDCageTrap"); - triggered = true; - tile.Trap = undefined; - tile.Type = undefined; - } - if (tile.Trap == "BedTrap") { - if (entity.player) - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BedTrap"), 0, true); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Trap.ogg"); - msg = TextGet("KDBedTrap"); - triggered = true; - tile.Trap = undefined; - tile.Type = undefined; - KinkyDungeonMakeNoise(10, x, y); - } - if (tile.Trap === "CustomSleepDart") { - let spell = KinkyDungeonFindSpell("TrapSleepDart", true); - if (spell) { - // Search any tile 4 tiles up or down that have Line of Sight to the player - let startX = x; - let startY = y; - let possible_coords = [ - {x: -4, y: 0}, {x: 4, y: 0}, {x: 0, y: -4}, {x: 0, y: 4}, - {x: -3, y: 0}, {x: 3, y: 0}, {x: 0, y: -3}, {x: 0, y: 3}, - {x: -2, y: 0}, {x: 2, y: 0}, {x: 0, y: -2}, {x: 0, y: 2}, - ]; - let success = false; - for (let coord of possible_coords) { - if (KinkyDungeonCheckProjectileClearance(startX + coord.x, startY + coord.y, startX, startY)) { - startX += coord.x; - startY += coord.y; - success = true; - break; - } - } - if (success) { - triggered = true; - // We fire the dart - let player = KinkyDungeonEnemyAt(x, y) ? KinkyDungeonEnemyAt(x, y) : KinkyDungeonPlayerEntity; - KinkyDungeonCastSpell(x, y, spell, { x: startX, y: startY }, player, undefined); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Trap.ogg"); - msg = ""; // We don't want to warn the player about what just happened - KinkyDungeonTilesDelete(x + "," + y); - } else { - triggered = true; - // We do sleep gas instead - spell = KinkyDungeonFindSpell("SleepGas", true); - if (spell) { - KinkyDungeonCastSpell(x, y, spell, undefined, undefined, undefined); - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Trap.ogg"); - msg = "KinkyDungeonSpellCast" + spell.name; - KinkyDungeonTilesDelete(x + "," + y); - } - } - } - } - if (tile.Trap === "CustomVine") { - let restraint = KinkyDungeonGetRestraintByName("VinePlantFeet"); - if (restraint) { - KDSendStatus('bound', tile.Trap, "trap"); - - if (entity.player) - KinkyDungeonAddRestraintIfWeaker(restraint, tile.Power, false); - } - triggered = true; - let created = KinkyDungeonSummonEnemy(x, y, "VinePlant", tile.Power, 1); - if (created > 0) { - if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "/Audio/Trap.ogg"); - msg = "Default"; - KinkyDungeonTilesDelete(x + "," + y); - } - } - } - if (entity.player && (msg || triggered)) { - KDTrigPanic(); - } - if (msg) { - if (msg == "Default") - KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonTrap" + tile.Trap + (tile.extraTag || "")), color, 2 + KinkyDungeonSlowMoveTurns); - else - KinkyDungeonSendTextMessage(10, msg, color, 2 + KinkyDungeonSlowMoveTurns); - } - } - } - - KinkyDungeonTrapMoved = false; -} - -function KDTrigPanic() { - if (KinkyDungeonStatsChoice.has("Panic")) { - KinkyDungeonSendActionMessage(10, TextGet("KDPanic"), "#ff0000", 3); - KinkyDungeonSlowMoveTurns = Math.max(KinkyDungeonSlowMoveTurns, 2); - } -} - -/** - * - * @returns {{ Name: string; Enemy?: string; Spell?: string; Level: number; Power: number; Weight: number; strict?: true;}[]} - */ -function KinkyDungeonGetGoddessTrapTypes() { - /** - * @type {{ Name: string; Enemy?: string; Spell?: string; Level: number; Power: number; Weight: number; strict?: true;}[]} - */ - let trapTypes = []; - if (KinkyDungeonGoddessRep.Rope < KDANGER) { - trapTypes.push({ Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 15 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Ninja", Level: 0, Power: 3, Weight: 10 }); - } - if (KinkyDungeonGoddessRep.Rope < KDRAGE) { - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "RopeKraken", Level: 0, Power: 1, Weight: 10 }); - trapTypes.push({ Name: "SpecificSpell", Spell: "TrapRopeStrong", Level: 0, Power: 3, Weight: 40 }); - } - if (KinkyDungeonGoddessRep.Leather < KDANGER) { - trapTypes.push({ Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 15 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Dragon", Level: 0, Power: 3, Weight: 10 }); - } - if (KinkyDungeonGoddessRep.Leather < KDRAGE) { - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "DragonLeader", Level: 0, Power: 2, Weight: 50 }); - } - if (KinkyDungeonGoddessRep.Metal < KDANGER) { - trapTypes.push({ Name: "SpecificSpell", Spell: "TrapCableWeak", Level: 0, Power: 3, Weight: 15 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Drone", Level: 0, Power: 3, Weight: 10 }); - } - if (KinkyDungeonGoddessRep.Metal < KDRAGE) { - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Wolfgirl", Level: 0, Power: 3, Weight: 50 }); - } - if (KinkyDungeonGoddessRep.Latex < KDANGER) { - trapTypes.push({ Name: "SpecificSpell", Spell: "TrapSlimeWeak", Level: 0, Power: 3, Weight: 10 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Alkahestor", Level: 0, Power: 1, Weight: 5 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "SmallSlime", Level: 0, Power: 6, Weight: 10 }); - } - if (KinkyDungeonGoddessRep.Latex < KDRAGE) { - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "SlimeEnthusiast", Level: 0, Power: 2, Weight: 20 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "BigSlime", Level: 0, Power: 3, Weight: 10 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalLatex", Level: 0, Power: 2, Weight: 20 }); - } - if (KinkyDungeonGoddessRep.Elements < KDANGER) { - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalFire", Level: 0, Power: 2, Weight: 5 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalIce", Level: 0, Power: 2, Weight: 5 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalWater", Level: 0, Power: 2, Weight: 5 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalEarth", Level: 0, Power: 2, Weight: 5 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalAir", Level: 0, Power: 2, Weight: 5 }); - } - if (KinkyDungeonGoddessRep.Elements < KDRAGE) { - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalFire", Level: 0, Power: 4, Weight: 10 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalIce", Level: 0, Power: 4, Weight: 10 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalWater", Level: 0, Power: 4, Weight: 10 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalEarth", Level: 0, Power: 4, Weight: 10 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalAir", Level: 0, Power: 4, Weight: 10 }); - } - if (KinkyDungeonGoddessRep.Conjure < KDANGER) { - trapTypes.push({ Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 15 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "TickleHand", Level: 0, Power: 6, Weight: 10 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Dressmaker", Level: 0, Power: 2, Weight: 5 }); - } - if (KinkyDungeonGoddessRep.Conjure < KDRAGE) { - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Conjurer", Level: 0, Power: 1, Weight: 15 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Dressmaker", Level: 0, Power: 2, Weight: 25 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ConjurerTickler", Level: 0, Power: 1, Weight: 25 }); - } - if (KinkyDungeonGoddessRep.Illusion < KDANGER) { - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Maidforce", Level: 0, Power: 3, Weight: 15 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "MaidforcePara", Level: 0, Power: 2, Weight: 10 }); - trapTypes.push({ Name: "SpecificSpell", Spell: "TrapRopeHoly", Level: 2, Power: 3, Weight: 30 }); - } - if (KinkyDungeonGoddessRep.Illusion < KDRAGE) { - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Maidforce", Level: 0, Power: 4, Weight: 15 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "MaidforcePara", Level: 0, Power: 3, Weight: 15 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "MaidforceMafia", Level: 0, Power: 3, Weight: 10 }); - trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "MaidforceHead", Level: 0, Power: 1, Weight: 10 }); - } - - return trapTypes; -} - -function KinkyDungeonGetTrap(trapTypes, Level, tags) { - - let trapWeightTotal = 0; - let trapWeights = []; - - for (let trap of trapTypes) { - let effLevel = Level; - let weightMulti = 1.0; - let weightBonus = 0; - - if (effLevel >= trap.Level) { - trapWeights.push({trap: trap, weight: trapWeightTotal}); - let weight = trap.Weight + weightBonus; - if (trap.terrainTags) - for (let tag of tags) - if (trap.terrainTags[tag]) weight += trap.terrainTags[tag]; - - trapWeightTotal += Math.max(0, weight*weightMulti); - - } - } - - let selection = KDRandom() * trapWeightTotal; - - for (let L = trapWeights.length - 1; L >= 0; L--) { - if (selection > trapWeights[L].weight) { - return { - Name: trapWeights[L].trap.Name, - Restraint: trapWeights[L].trap.Restraint, - Enemy: trapWeights[L].trap.Enemy, - Spell: trapWeights[L].trap.Spell, - Power: trapWeights[L].trap.Power, - extraTag: trapWeights[L].trap.extraTag, - }; - } - } - -} - - -function KDSmokePuff(x, y, radius, density, nomsg) { - if (!nomsg) - KinkyDungeonSendTextMessage(2, TextGet("KDSmokePuff"), "white", 2); - for (let X = x - Math.floor(radius); X <= x + Math.floor(radius); X++) - for (let Y = y - Math.floor(radius); Y <= y + Math.floor(radius); Y++) { - if ((!density || KDRandom() < density || (X == x && Y == Y)) && KDistEuclidean(X - x, Y - y) <= radius) { - let spell = KinkyDungeonFindSpell("SmokePuff", true); - if (spell) { - KinkyDungeonCastSpell(X, Y, spell, undefined, undefined, undefined); - } - } - } -} - -function KDSteamPuff(x, y, radius, density, nomsg) { - if (!nomsg) - KinkyDungeonSendTextMessage(2, TextGet("KDSteamPuff"), "white", 2); - for (let X = x - Math.floor(radius); X <= x + Math.floor(radius); X++) - for (let Y = y - Math.floor(radius); Y <= y + Math.floor(radius); Y++) { - if ((!density || KDRandom() < density || (X == x && Y == Y)) && KDistEuclidean(X - x, Y - y) <= radius) { - let spell = KinkyDungeonFindSpell("SteamPuff", true); - if (spell) { - KinkyDungeonCastSpell(X, Y, spell, undefined, undefined, undefined); - } - } - } -} \ No newline at end of file diff --git a/Game/KinkyDungeonVibe.js b/Game/KinkyDungeonVibe.js deleted file mode 100644 index 569dd7b3d..000000000 --- a/Game/KinkyDungeonVibe.js +++ /dev/null @@ -1,452 +0,0 @@ -"use strict"; - - -/* -KinkyDungeonPlayerVibratedLocationItemNipplesPiercings,Nipples -KinkyDungeonPlayerVibratedLocationItemNipples,Nipples -KinkyDungeonPlayerVibratedLocationItemBreast,Breasts -KinkyDungeonPlayerVibratedLocationItemPelvis,Panties -KinkyDungeonPlayerVibratedLocationItemVulvaPiercings,Piercing -KinkyDungeonPlayerVibratedLocationItemVulva,Front -KinkyDungeonPlayerVibratedLocationItemButt,Rear -KinkyDungeonPlayerVibratedLocationItemBoots,Feet*/ - -let KDVibeSounds = { - "ItemVulva": {sound: "", Audio: null, update: false}, - "ItemButt": {sound: "", Audio: null, update: false}, - "ItemNipples": {sound: "", Audio: null, update: false, vol: 0.5}, -}; - -let KDVibeSoundRedirect = { - "ItemVulva": "ItemVulva", - "ItemVulvaPiercings": "ItemNipples", // TODO add softer piercings sound - "ItemButt": "ItemButt", - "ItemNipplesPiercings": "ItemNipples", - "ItemNipples": "ItemNipples", - "ItemPelvis": "ItemNipples", - "ItemBreast": "ItemNipples", // TODO add massager sound - "ItemBoots": "ItemNipples", // TODO add foot tickler sound -}; - -let KDVibeSound = { - "ItemVulva": "Vibe1", - //"ItemVulvaPiercings": "ItemNipples", // TODO add softer piercings sound - "ItemButt": "Vibe2", - //"ItemNipplesPiercings": "ItemNipples", - "ItemNipples": "Vibe3", - //"ItemBreast": "ItemNipples", // TODO add massager sound - //"ItemBoots": "ItemNipples", // TODO add foot tickler sound -}; - - -let KDVibeVolume = 1; -let KDVibeVolumeListIndex = 0; -let KDVibeVolumeList = [1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]; - -let KDMusicVolumeMult = 0.25; // Global mult -let KDMusicVolume = 1; -let KDMusicVolumeListIndex = 0; -let KDMusicVolumeList = [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 0, 0.1, 0.2]; - -let KDSfxVolume = 1; -let KDSfxVolumeListIndex = 0; -let KDSfxVolumeList = [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 0, 0.1, 0.2]; - -let KDAnimSpeed = 1; -let KDAnimSpeedListIndex = 0; -let KDAnimSpeedList = [1, 1.25, 1.5, 2.0, 0, 0.25, 0.5, 0.75,]; - -function KDStopAllVibeSounds(Exceptions) { - let EE = []; - if (Exceptions) - for (let e of Exceptions) { - EE.push(KDVibeSoundRedirect[e] ? KDVibeSoundRedirect[e] : e); - } - for (let loc of Object.entries(KDVibeSounds)) { - if (!Exceptions || !EE.includes(loc[0])) { - if (!loc[1].update) { - let audio = loc[1]; - if (audio.sound) audio.sound = ""; - if (audio.Audio) { - audio.Audio.pause(); - audio.Audio.currentTime = 0; - } - loc[1].update = true; - } - } - } -} - -function KDUpdateVibeSound(Location, Sound, Volume) { - let prev = ""; - if (KDVibeSounds[Location]) { - prev = KDVibeSounds[Location].sound; - } - if (KDVibeSounds[Location]) - KDVibeSounds[Location].sound = Sound; - else return; - - if (prev != Sound) { - if (prev && KDVibeSounds[Location].Audio && !KDVibeSounds[Location].update) { - // Stop the previous sound - KDVibeSounds[Location].Audio.pause(); - KDVibeSounds[Location].Audio.currentTime = 0; - //KDVibeSounds[Location].update = true; - } - if (Sound && !KDVibeSounds[Location].update) { - // Start the new sound - let audio = new Audio(); - let vol = Player.AudioSettings.Volume * (Volume != undefined ? Volume : 1.0); - if (KDVibeSounds[Location].vol) vol *= KDVibeSounds[Location].vol; - KDVibeSounds[Location].Audio = audio; - KDVibeSounds[Location].update = true; - if (ServerURL == 'foobar') { - audio.crossOrigin = "Anonymous"; - // @ts-ignore - audio.src = remap(Sound); - } else - audio.src = KDModFiles[Sound] || Sound; - audio.volume = Math.min(vol, 1); - audio.loop = true; - audio.play(); - } - } - if (!Sound && KDVibeSounds[Location].Audio && !KDVibeSounds[Location].update) { - // Stop the previous sound - KDVibeSounds[Location].Audio.pause(); - KDVibeSounds[Location].Audio.currentTime = 0; - KDVibeSounds[Location].update = true; - } - if (Volume != undefined && KDVibeSounds[Location] && KDVibeSounds[Location].Audio) { - KDVibeSounds[Location].Audio.volume = Math.min(Player.AudioSettings.Volume * Volume * (KDVibeSounds[Location].vol ? KDVibeSounds[Location].vol : 1.0), 1); - } -} - -function KDUpdateVibeSounds() { - for (let v of Object.entries(KDVibeSounds)) { - v[1].update = false; - } - let vibe = KDGameData.CurrentVibration; - if (vibe && KinkyDungeonState == "Game" && KDToggles.Sound) { - let globalVolume = KDToggles.VibeSounds ? KDVibeVolume * (KinkyDungeonDrawState == "Game" ? 1 : 0.5) : 0; - let locations = KDSumVibeLocations(); - KDStopAllVibeSounds(locations); - - for (let location of locations) { - let power = "Weak"; - if (vibe.location && vibe.location.includes(location)) { - if (vibe.intensity >= 3) power = "Strong"; - else if (vibe.intensity >= 2) power = "Medium"; - } else if (vibe.VibeModifiers) { - for (let mod of vibe.VibeModifiers) { - if (mod.location == location) { - if (mod.intensityMod >= 3 || mod.intensitySetpoint >= 3) power = "Strong"; - else if (mod.intensityMod >= 2 || mod.intensitySetpoint >= 2) power = "Medium"; - } - } - } - if (KinkyDungeonVibeLevel <= 0) { - power = "Off"; - } - if (power != "Off") { - let sound = (KDVibeSoundRedirect[location] && KDVibeSound[KDVibeSoundRedirect[location]]) ? KDVibeSound[KDVibeSoundRedirect[location]] : "Vibe1"; - KDUpdateVibeSound(KDVibeSoundRedirect[location] ? KDVibeSoundRedirect[location] : "ItemVulva", KinkyDungeonRootDirectory + `Audio/${sound}_${power}.ogg`, globalVolume); - } else - KDUpdateVibeSound(KDVibeSoundRedirect[location] ? KDVibeSoundRedirect[location] : "ItemVulva", "", globalVolume); - } - - } else { - KDStopAllVibeSounds(); - } -} - -function KDSumVibeLocations() { - if (KDGameData.CurrentVibration) { - let groups = []; - for (let g of KDGameData.CurrentVibration.location) { - groups.push(g); - } - for (let mod of KDGameData.CurrentVibration.VibeModifiers) { - if (!groups.includes(mod.location)) - groups.push(mod.location); - } - return groups; - } - return []; -} - -/** Gets a list of the groups that should be vibrating here. It is the item's group, plus any 'linked' vibrators */ -function KDGetVibeLocation(item) { - let restraint = KDRestraint(item); - let groups = [restraint.vibeLocation ? restraint.vibeLocation : restraint.Group]; - if (restraint.linkedVibeTags) { - for (let tag of restraint.linkedVibeTags) { - for (let inv of KinkyDungeonAllRestraint()) { - let res = KDRestraint(inv); - if (res.linkedVibeTags && res.linkedVibeTags.includes(tag) && !groups.includes(res.vibeLocation ? res.vibeLocation : res.Group)) { - groups.push(res.vibeLocation ? res.vibeLocation : res.Group); - } - } - } - } - - return groups; -} - - -/** - * Starts a vibration, overriding - * @param {string} source - * @param {string} name - * @param {number} intensity - * @param {number} duration - * @param {number} [numLoops] - * @param {number} [denyTime ] - * @param {number} [denialsLeft ] - * @param {number} [edgeTime ] - * @param {boolean} [edgeOnly ] - * @param {boolean} [alwaysDeny ] - * @param {number} [denialChance ] - * @param {number} [denialChanceLikely ] - * @param {boolean} [tickEdgeAtMaxArousal ] - * @param {VibeMod[]} [vibeMods ] - */ -function KinkyDungeonStartVibration(source, name, locations, intensity, duration, numLoops, denyTime, denialsLeft, edgeTime, edgeOnly, alwaysDeny, denialChance, denialChanceLikely, tickEdgeAtMaxArousal, vibeMods) { - if (KDGameData.CurrentVibration) { - if (!KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonStartVibeContinue"), "#FFaadd", 2)) KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonStartVibeContinue"), "#FFaadd", 2, true, true); - } - KDGameData.CurrentVibration = { - source: source, - name: name, - location: locations, - intensity: intensity, - duration: duration, - durationLeft: duration, - loopsLeft: numLoops, - denyTime: denyTime, - denyTimeLeft: 0, - edgeTime: edgeTime, - edgeTimeLeft: edgeTime, - edgeOnly: edgeOnly, - alwaysDeny: alwaysDeny, - tickEdgeAtMaxArousal: tickEdgeAtMaxArousal, - denialChance: denialChance, - denialChanceLikely: denialChanceLikely, - denialsLeft: denialsLeft, - VibeModifiers: vibeMods ? vibeMods : [], - }; - - if (!KDGameData.TimeSinceLastVibeStart) KDGameData.TimeSinceLastVibeStart = {}; - KDGameData.TimeSinceLastVibeStart[name] = 0; -} - -/** - * - * @param {Record} cooldown - * @returns {boolean} - */ -function KDIsVibeCD(cooldown) { - if (!KDGameData.TimeSinceLastVibeStart) KDGameData.TimeSinceLastVibeStart = {}; - if (!KDGameData.TimeSinceLastVibeEnd) KDGameData.TimeSinceLastVibeEnd = {}; - let pass = true; - for (let cd of Object.entries(cooldown)) { - if (KDGameData.TimeSinceLastVibeStart[cd[0]] && KDGameData.TimeSinceLastVibeStart[cd[0]] < cd[1] && KDGameData.TimeSinceLastVibeEnd[cd[0]] && KDGameData.TimeSinceLastVibeEnd[cd[0]] < cd[1]) { - pass = false; - break; - } - } - return pass; -} - -function KinkyDungeonAddVibeModifier(source, name, location, intensityMod, duration, intensitySetpoint, edgeOnly, forceDeny, bypassDeny, bypassEdge, extendDuration, denyChanceMod, denyChanceLikelyMod) { - if (KDGameData.CurrentVibration) { - for (let mod of KDGameData.CurrentVibration.VibeModifiers) { - if (mod.name == name && mod.source == source) { - KDGameData.CurrentVibration.VibeModifiers.splice(KDGameData.CurrentVibration.VibeModifiers.indexOf(mod)); - break; - } - } - KDGameData.CurrentVibration.VibeModifiers.push({ - source: source, - name: name, - location: location, - intensityMod: intensityMod, - duration: duration, - durationLeft: duration, - - intensitySetpoint: intensitySetpoint, - edgeOnly: edgeOnly, - forceDeny: forceDeny, - bypassDeny: bypassDeny, - bypassEdge: bypassEdge, - extendDuration: extendDuration, - denyChanceMod: denyChanceMod, - denyChanceLikelyMod: denyChanceLikelyMod, - }); - } -} - -/* - * Gets the average deny chance of restraints - */ -function KinkyDungeonGetDenyChance(chance) { - if (!KDGameData.CurrentVibration) return 0; - let data = { - denyChance: KDGameData.CurrentVibration.denialChance ? KDGameData.CurrentVibration.denialChance : 0.0, - orgasmChance: chance, - }; - if (chance > 0) { - if (KDGameData.CurrentVibration.denialChanceLikely) data.denyChance = KDGameData.CurrentVibration.denialChanceLikely; - } - let forceDeny = false; - if (KDGameData.CurrentVibration.VibeModifiers) { - for (let mod of KDGameData.CurrentVibration.VibeModifiers) { - if (chance > 0 && mod.denyChanceLikelyMod) data.denyChanceLikelyMod += mod.denyChanceMod; - else if (mod.denyChanceMod) data.denyChance += mod.denyChanceMod; - if (mod.forceDeny) forceDeny = true; - } - } - - if (!forceDeny && KDGameData.CurrentVibration.denialsLeft != undefined && KDGameData.CurrentVibration.denialsLeft <= 0) { - data.denyChance = 0; - } - KinkyDungeonSendEvent("getDenyChance", data); - return data.denyChance; -} - -function KinkyDungeonVibratorsDeny(chance) { - let data = {toDeny: false}; - let allowDeny = KDRandom() < KinkyDungeonGetDenyChance(chance); - if (allowDeny) { - data.toDeny = true; - KinkyDungeonSendEvent("getDeny", data); - } - return data.toDeny; -} - -function KinkyDungeonCalculateVibeLevel(delta) { - let oldVibe = KinkyDungeonVibeLevel; - KinkyDungeonVibeLevel = 0; - KinkyDungeonOrgasmVibeLevel = 0; - KinkyDungeonStatPlugLevel = 0; - KinkyDungeonPlugCount = 0; - for (let item of KinkyDungeonAllRestraint()) { - if (item && KDRestraint(item)) { - if (KDRestraint(item).plugSize) { - let size = KDRestraint(item).plugSize; - KinkyDungeonStatPlugLevel = Math.max(KinkyDungeonStatPlugLevel + size/2, size); - KinkyDungeonPlugCount += 1; - } - } - } - - KDGameData.Edged = false; - let cease = true; - - if (KDGameData.CurrentVibration) { - - for (let r of KinkyDungeonAllRestraint()) { - if (KDGameData.CurrentVibration.source == r.name) { - cease = false; - break; - } - } - - if (cease) { - if (!KDGameData.TimeSinceLastVibeEnd) KDGameData.TimeSinceLastVibeEnd = {}; - KDGameData.TimeSinceLastVibeEnd[KDGameData.CurrentVibration.name] = 0; - KDGameData.CurrentVibration = null; - } - } - - if (KDGameData.CurrentVibration) { - let vibration = KDGameData.CurrentVibration; - - if (vibration.durationLeft > 0) { - let edge = false; - let bypassDeny = false; - let bypassEdge = false; - let extendDuration = false; - KinkyDungeonVibeLevel = vibration.intensity; - - if (vibration.VibeModifiers) { - let intensityMod = 0; - let intensityModMax = 0; - let intensityModMin = 0; - for (let mod of vibration.VibeModifiers) { - if (mod.durationLeft > 0) { - mod.durationLeft -= delta; - if (mod.edgeOnly) { - edge = true; - } - if (mod.bypassDeny) { - bypassDeny = true; - } - if (mod.bypassEdge) { - bypassEdge = true; - } - if (mod.extendDuration) { - extendDuration = true; - } - if (mod.intensityMod > intensityModMax) intensityModMax = mod.intensityMod; - if (mod.intensityMod < intensityModMin) intensityModMin = mod.intensityMod; - intensityMod += mod.intensityMod; - } else { - vibration.VibeModifiers.splice(vibration.VibeModifiers.indexOf(mod)); - } - } - if (intensityMod > intensityModMax) intensityMod = intensityModMax; - if (intensityMod > intensityModMin) intensityMod = intensityModMin; - if (intensityMod) { - KinkyDungeonVibeLevel = Math.max(1, KinkyDungeonVibeLevel + intensityMod); - } - } - - if (!extendDuration) - vibration.durationLeft -= delta; - if (vibration.denyTimeLeft > 0) { - vibration.denyTimeLeft -= delta; - if (!bypassDeny) { - KinkyDungeonVibeLevel = 0; - } - } else if (vibration.edgeTimeLeft > 0 && (!vibration.tickEdgeAtMaxArousal || KinkyDungeonStatDistraction >= KinkyDungeonStatDistractionMax * 0.99)) { - vibration.edgeTimeLeft -= delta; - edge = true; - } - - if (edge && !bypassEdge) { - KDGameData.Edged = true; - } else { - KinkyDungeonOrgasmVibeLevel = Math.max(KinkyDungeonOrgasmVibeLevel || 0, vibration.intensity); - } - } else { - KinkyDungeonEndVibration(); - } - } - - if (oldVibe > 0 && KinkyDungeonVibeLevel == 0) { - if (cease) if (!KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonEndVibeCease"), "#FFaadd", 2)) KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonEndVibeCease"), "#FFaadd", 2, true, true); - if (!KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonEndVibe"), "#FFaadd", 2)) KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonEndVibe"), "#FFaadd", 2, true, true); - } else if (oldVibe == 0 && KinkyDungeonVibeLevel > 0) { - if (!KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonStartVibe"), "#FFaadd", 2)) KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonStartVibe"), "#FFaadd", 2, true, true); - } -} - -function KinkyDungeonEndVibration() { - if (KDGameData.CurrentVibration) { - let vibe = KDGameData.CurrentVibration; - - if (vibe.loopsLeft > 0) { - vibe.loopsLeft -= 1; - vibe.durationLeft = vibe.duration; - } else { - if (!KDGameData.TimeSinceLastVibeEnd) KDGameData.TimeSinceLastVibeEnd = {}; - KDGameData.TimeSinceLastVibeEnd[KDGameData.CurrentVibration.name] = 0; - KDGameData.CurrentVibration = null; - } - } -} - -function KinkyDungeonCanOrgasm() { - return !KDGameData.Edged || KinkyDungeonChastityMult() < 0.9; -} \ No newline at end of file diff --git a/Game/KinkyDungeonVision.js b/Game/KinkyDungeonVision.js deleted file mode 100644 index 27e9c554e..000000000 --- a/Game/KinkyDungeonVision.js +++ /dev/null @@ -1,554 +0,0 @@ -"use strict"; -// Lots of good info here: http://www.adammil.net/blog/v125_Roguelike_Vision_Algorithms.html#permissivecode -// For this implementation I decided that ray calculations are too much so I just did a terraria style lighting system -// -Ada - - -let KinkyDungeonSeeAll = false; -let KDVisionBlockers = new Map(); -let KDLightBlockers = new Map(); - -function KinkyDungeonCheckProjectileClearance(xx, yy, x2, y2) { - let tiles = KinkyDungeonTransparentObjects; - let moveDirection = KinkyDungeonGetDirection(x2 - xx, y2 - yy); - let x1 = xx + moveDirection.x; - let y1 = yy + moveDirection.y; - let dist = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); - for (let d = 0; d < dist; d += 0.25) { - let mult = d / dist; - let xxx = x1 + mult * (x2-x1); - let yyy = y1 + mult * (y2-y1); - if (!tiles.includes(KinkyDungeonMapGet(Math.round(xxx), Math.round(yyy)))) return false; - } - return true; -} - -function KinkyDungeonCheckPath(x1, y1, x2, y2, allowBars, blockEnemies, maxFails, blockOnlyLOSBlock) { - if (x1 == x2 && y1 == y2) return true; - let length = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); - // Allowbars = checking for vision only - // Otherwise = checking for physical path - let obj = allowBars ? KinkyDungeonTransparentObjects : KinkyDungeonTransparentMovableObjects; - let maxFailsAllowed = maxFails ? maxFails : 1; - let fails = 0; - - for (let F = 0; F <= length; F++) { - let xx = x1 + (x2-x1)*F/length; - let yy = y1 + (y2-y1)*F/length; - - if ((Math.round(xx) != x1 || Math.round(yy) != y1) && (Math.round(xx) != x2 || Math.round(yy) != y2)) { - let hits = 0; - if (!obj.includes(KinkyDungeonMapGet(Math.floor(xx), Math.floor(yy))) - || ((xx != x1 || yy != y1) && (blockEnemies && ((!blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.floor(xx), Math.floor(yy))) || (blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.floor(xx), Math.floor(yy))?.Enemy.blockVision)))) - || ((xx != x1 || yy != y1) && (allowBars && KDVisionBlockers.get(Math.floor(xx) + "," + Math.floor(yy))))) hits += 1; - if (!obj.includes(KinkyDungeonMapGet(Math.round(xx), Math.round(yy))) - || ((xx != x1 || yy != y1) && (blockEnemies && ((!blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.round(xx), Math.round(yy))) || (blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.round(xx), Math.round(yy))?.Enemy.blockVision)))) - || ((xx != x1 || yy != y1) && (allowBars && KDVisionBlockers.get(Math.round(xx) + "," + Math.round(yy))))) hits += 1; - if (hits < 2 && !obj.includes(KinkyDungeonMapGet(Math.ceil(xx), Math.ceil(yy))) - || ((xx != x1 || yy != y1) && (blockEnemies && ((!blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.ceil(xx), Math.ceil(yy))) || (blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.ceil(xx), Math.ceil(yy))?.Enemy.blockVision)))) - || ((xx != x1 || yy != y1) && (allowBars && KDVisionBlockers.get(Math.ceil(xx) + "," + Math.ceil(yy))))) hits += 1; - - - if (hits >= 2) { - fails += 1; - if (fails >= maxFailsAllowed) - return false; - } - } - } - - return true; -} - -let KDPlayerLight = 0; -let KDMapBrightnessMult = 0.2; - -function KinkyDungeonResetFog() { - KinkyDungeonFogGrid = []; - // Generate the grid - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) - KinkyDungeonFogGrid.push(0); // 0 = pitch dark - } -} - -function KinkyDungeonMakeBrightnessMap(width, height, mapBrightness, Lights, delta) { - let flags = { - SeeThroughWalls: 0, - }; - - KinkyDungeonSendEvent("brightness",{update: delta, flags: flags}); - - let ShadowColor = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]].shadowColor ? KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]].shadowColor : 0x00001f; - let LightColor = KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]].lightColor ? KinkyDungeonMapParams[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint]].lightColor : 0x000000; - - KinkyDungeonBlindLevelBase = 0; // Set to 0 when consumed. We only redraw lightmap once so this is safe. - KinkyDungeonColorGrid = []; - KinkyDungeonShadowGrid = []; - KinkyDungeonBrightnessGrid = []; - // Generate the grid - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - KinkyDungeonBrightnessGrid.push(0); - KinkyDungeonShadowGrid.push(0); - KinkyDungeonColorGrid.push(LightColor); - } - } - let baseBrightness = mapBrightness * KDMapBrightnessMult; - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) - if (KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(X, Y))) { - KinkyDungeonBrightnessSet(X, Y, baseBrightness); - } - } - - let maxPass = 0; - - KDLightBlockers = new Map(); - for (let EE of KinkyDungeonEntities) { - let Enemy = EE.Enemy; - if (Enemy && Enemy.blockVision || (Enemy.blockVisionWhileStationary && !EE.moved && EE.idle)) // Add - KDLightBlockers.set(EE.x + "," + EE.y, true); - } - let LightsTemp = new Map(); - for (let location of Object.values(KinkyDungeonEffectTiles)) { - for (let tile of Object.values(location)) { - if (tile.duration > 0) { - if (tile.lightColor) { - if (tile.brightness > KinkyDungeonBrightnessGet(tile.x, tile.y)) - KinkyDungeonColorSet(tile.x, tile.y, tile.lightColor); - } - if (tile.tags.includes("brightnessblock")) { - KDLightBlockers.set(tile.x + "," + tile.y, true); - } - if (tile.tags.includes("darkarea")) { - KinkyDungeonBrightnessSet(tile.x, tile.y, 0); - } - //if (tile.shadowColor) { - //KinkyDungeonShadowSet(tile.x, tile.y, tile.shadowColor); - //} - if (tile.brightness) { - maxPass = Math.max(maxPass, tile.brightness); - KinkyDungeonBrightnessSet(tile.x, tile.y, tile.brightness, true); - - if (!LightsTemp.get(tile.x + "," + tile.y) || tile.brightness > LightsTemp.get(tile.x + "," + tile.y)) - LightsTemp.set(tile.x + "," + tile.y, tile.brightness); - } - } - } - } - - for (let light of Lights) { - if (light.brightness > 0) { - maxPass = Math.max(maxPass, light.brightness); - if (light.brightness > KinkyDungeonBrightnessGet(light.x, light.y)) { - if (light.color) KinkyDungeonColorSet(light.x, light.y, light.color); - else KinkyDungeonColorSet(light.x, light.y, 0xffffff); - } - KinkyDungeonBrightnessSet(light.x, light.y, light.brightness, true); - - if (!(LightsTemp.get(light.x + "," + light.y) >= light.brightness)) { - LightsTemp.set(light.x + "," + light.y, light.brightness); - } - } - } - - /** - * @type {{x: number, y: number, brightness: number, color: number, shadow: number}[]} - */ - let nextBrightness = []; - - for (let L = maxPass; L > 0; L--) { - // if a grid square is next to a brighter transparent object, it gets that light minus one, or minus two if diagonal - nextBrightness = []; - // Main grid square loop - for (let X = 1; X < KinkyDungeonGridWidth - 1; X++) { - for (let Y = 1; Y < KinkyDungeonGridHeight - 1; Y++) { - let tile = KinkyDungeonMapGet(X, Y); - if ((KinkyDungeonTransparentObjects.includes(tile) && !KDLightBlockers.get(X + "," + Y)) || LightsTemp.get(X + "," + Y)) { - let brightness = KinkyDungeonBrightnessGet(X, Y); - let color = KinkyDungeonColorGet(X, Y); - let shadow = KinkyDungeonShadowGet(X, Y); - if (brightness > 0) { - let decay = 0.7; - let nearbywalls = 0; - for (let XX = X-1; XX <= X+1; XX++) - for (let YY = Y-1; YY <= Y+1; YY++) - if (!KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(XX, YY)) || KDLightBlockers.get(XX + "," + YY)) nearbywalls += 1; - if (nearbywalls > 3 && brightness <= 9) decay += nearbywalls * 0.15; - else if (nearbywalls > 1 && brightness <= 9) decay += nearbywalls * 0.1; - - if (brightness > 0) { - if (Number(KinkyDungeonBrightnessGet(X-1, Y)) < brightness) nextBrightness.push({x:X-1, y:Y, shadow: shadow, color: color, brightness: (brightness - decay)});// KinkyDungeonLightSet(X-1, Y, Math.max(Number(KinkyDungeonLightGet(X-1, Y)), (brightness - decay))); - if (Number(KinkyDungeonBrightnessGet(X+1, Y)) < brightness) nextBrightness.push({x:X+1, y:Y, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y, Math.max(Number(KinkyDungeonLightGet(X+1, Y)), (brightness - decay))); - if (Number(KinkyDungeonBrightnessGet(X, Y-1)) < brightness) nextBrightness.push({x:X, y:Y-1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X, Y-1, Math.max(Number(KinkyDungeonLightGet(X, Y-1)), (brightness - decay))); - if (Number(KinkyDungeonBrightnessGet(X, Y+1)) < brightness) nextBrightness.push({x:X, y:Y+1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X, Y+1, Math.max(Number(KinkyDungeonLightGet(X, Y+1)), (brightness - decay))); - - if (brightness > 0.5) { - if (Number(KinkyDungeonBrightnessGet(X-1, Y-1)) < brightness) nextBrightness.push({x:X-1, y:Y-1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X-1, Y-1, Math.max(Number(KinkyDungeonLightGet(X-1, Y-1)), brightness - decay)); - if (Number(KinkyDungeonBrightnessGet(X-1, Y+1)) < brightness) nextBrightness.push({x:X-1, y:Y+1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X-1, Y+1, Math.max(Number(KinkyDungeonLightGet(X-1, Y+1)), brightness - decay)); - if (Number(KinkyDungeonBrightnessGet(X+1, Y-1)) < brightness) nextBrightness.push({x:X+1, y:Y-1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y-1, Math.max(Number(KinkyDungeonLightGet(X+1, Y-1)), brightness - decay)); - if (Number(KinkyDungeonBrightnessGet(X+1, Y+1)) < brightness) nextBrightness.push({x:X+1, y:Y+1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y+1, Math.max(Number(KinkyDungeonLightGet(X+1, Y+1)), brightness - decay)); - } - } - } - } - } - } - - for (let b of nextBrightness) { - let brightness = KinkyDungeonBrightnessGet(b.x, b.y); - if (b.brightness > brightness) { - KinkyDungeonBrightnessSet(b.x, b.y, Math.max(Number(brightness), b.brightness)); - KinkyDungeonColorSet(b.x, b.y, KDAvgColor(b.color, KinkyDungeonColorGet(b.x, b.y), b.brightness, brightness)); - //KinkyDungeonShadowSet(b.x, b.y, KDAvgColor(b.shadow, KinkyDungeonShadowGet(b.x, b.y), b.brightness, brightness)); - } - } - } - - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - let brightness = KinkyDungeonBrightnessGet(X, Y); - KinkyDungeonShadowSet(X, Y, KDAvgColor(ShadowColor, 0x000000, 1, Math.max(0, brightness - baseBrightness))); - } - } - - KDPlayerLight = KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); -} - -/** Averages two hex colors according to weights w1 and w2 - * @param {number} color1 - * @param {number} color2 - * @param {number} w1 - Weight of color1 - * @param {number} w2 - Weight of color2 - * @returns {number} - */ -function KDAvgColor(color1, color2, w1, w2) { - let r = (color1 & 0xFF0000) >> 16; - let g = (color1 & 0x00FF00) >> 8; - let b = (color1 & 0x0000FF); - - r = Math.floor((r * w1 + w2*((color2 & 0xFF0000) >> 16))/(w1 + w2)); - g = Math.floor((g * w1 + w2*((color2 & 0x00FF00) >> 8))/(w1 + w2)); - b = Math.floor((b * w1 + w2*((color2 & 0x0000FF)))/(w1 + w2)); - return (r << 16) + (g << 8) + b; -} - -function KinkyDungeonMakeVisionMap(width, height, Viewports, Lights, delta, mapBrightness) { - let flags = { - SeeThroughWalls: 0, - }; - - KinkyDungeonSendEvent("vision",{update: delta, flags: flags}); - - KinkyDungeonBlindLevelBase = 0; // Set to 0 when consumed. We only redraw lightmap once so this is safe. - KinkyDungeonVisionGrid = []; - // Generate the grid - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) - KinkyDungeonVisionGrid.push(0); // 0 = pitch dark - } - - let maxPass = 0; - let brightestLight = 0; - - KDVisionBlockers = new Map(); - for (let EE of KinkyDungeonEntities) { - let Enemy = EE.Enemy; - if (Enemy && (Enemy.blockVision || (Enemy.blockVisionWhileStationary && !EE.moved && EE.idle))) // Add - KDVisionBlockers.set(EE.x + "," + EE.y, true); - } - let LightsTemp = new Map(); - for (let location of Object.values(KinkyDungeonEffectTiles)) { - for (let tile of Object.values(location)) { - if (tile.duration > 0 && tile.tags.includes("visionblock")) { - KDVisionBlockers.set(tile.x + "," + tile.y, true); - } - if (tile.brightness) { - LightsTemp.set(tile.x + "," + tile.y, tile.brightness); - } - } - } - - for (let light of Lights) { - if (light.brightness > 0) { - if (!(LightsTemp.get(light.x + "," + light.y) >= light.brightness)) { - LightsTemp.set(light.x + "," + light.y, light.brightness); - } - if (light.y_orig != undefined && !(LightsTemp.get(light.x + "," + light.y_orig) >= light.brightness)) { - LightsTemp.set(light.x + "," + light.y_orig, light.brightness); - } - } - } - - - - // Viewports = basically lights but they only add vision - for (let light of Viewports) { - if (light.brightness > 0) { - maxPass = Math.max(maxPass, light.brightness); - if (light.brightness > brightestLight) brightestLight = light.brightness; - KinkyDungeonVisionSet(light.x, light.y, light.brightness); - } - } - - // Generate the grid - let bb = 0; - let d = 1; - let newL = 0; - for (let X = 1; X < KinkyDungeonGridWidth - 1; X++) { - for (let Y = 1; Y < KinkyDungeonGridHeight - 1; Y++) - if (KinkyDungeonCheckPath(X, Y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, true, flags.SeeThroughWalls ? flags.SeeThroughWalls + 1 : 1, true) - && KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(X, Y))) { - bb = KinkyDungeonBrightnessGet(X, Y); - d = KDistChebyshev(X - KinkyDungeonPlayerEntity.x, Y - KinkyDungeonPlayerEntity.y); - newL = bb + 2 - Math.min(1.5, d * 1.5); - if (newL > KinkyDungeonVisionGet(X, Y)) { - KinkyDungeonVisionSet(X, Y, Math.max(0, newL)); - maxPass = Math.max(maxPass, newL); - } - } - } - - /** - * @type {{x: number, y: number, brightness: number}[]} - */ - let nextBrightness = []; - - for (let L = maxPass; L > 0; L--) { - // if a grid square is next to a brighter transparent object, it gets that light minus one, or minus two if diagonal - nextBrightness = []; - // Main grid square loop - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - let tile = KinkyDungeonMapGet(X, Y); - if ((LightsTemp.get(X + "," + Y) || (KinkyDungeonTransparentObjects.includes(tile) || (X == KinkyDungeonPlayerEntity.x && Y == KinkyDungeonPlayerEntity.y))) && !KDVisionBlockers.get(X + "," + Y)) { - let brightness = KinkyDungeonVisionGet(X, Y); - if (brightness > 0) { - let decay = KinkyDungeonDeaf ? 5 : 2; - if (!KinkyDungeonTransparentObjects.includes(tile)) decay += 3; - - if (brightness > 0) { - if (Number(KinkyDungeonVisionGet(X-1, Y)) < brightness) nextBrightness.push({x:X-1, y:Y, brightness: (brightness - decay)});// KinkyDungeonLightSet(X-1, Y, Math.max(Number(KinkyDungeonLightGet(X-1, Y)), (brightness - decay))); - if (Number(KinkyDungeonVisionGet(X+1, Y)) < brightness) nextBrightness.push({x:X+1, y:Y, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y, Math.max(Number(KinkyDungeonLightGet(X+1, Y)), (brightness - decay))); - if (Number(KinkyDungeonVisionGet(X, Y-1)) < brightness) nextBrightness.push({x:X, y:Y-1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X, Y-1, Math.max(Number(KinkyDungeonLightGet(X, Y-1)), (brightness - decay))); - if (Number(KinkyDungeonVisionGet(X, Y+1)) < brightness) nextBrightness.push({x:X, y:Y+1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X, Y+1, Math.max(Number(KinkyDungeonLightGet(X, Y+1)), (brightness - decay))); - - if (brightness > 0.5) { - if (Number(KinkyDungeonVisionGet(X-1, Y-1)) < brightness) nextBrightness.push({x:X-1, y:Y-1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X-1, Y-1, Math.max(Number(KinkyDungeonLightGet(X-1, Y-1)), brightness - decay)); - if (Number(KinkyDungeonVisionGet(X-1, Y+1)) < brightness) nextBrightness.push({x:X-1, y:Y+1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X-1, Y+1, Math.max(Number(KinkyDungeonLightGet(X-1, Y+1)), brightness - decay)); - if (Number(KinkyDungeonVisionGet(X+1, Y-1)) < brightness) nextBrightness.push({x:X+1, y:Y-1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y-1, Math.max(Number(KinkyDungeonLightGet(X+1, Y-1)), brightness - decay)); - if (Number(KinkyDungeonVisionGet(X+1, Y+1)) < brightness) nextBrightness.push({x:X+1, y:Y+1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y+1, Math.max(Number(KinkyDungeonLightGet(X+1, Y+1)), brightness - decay)); - } - } - } - } - } - } - - for (let b of nextBrightness) { - KinkyDungeonVisionSet(b.x, b.y, Math.max(Number(KinkyDungeonVisionGet(b.x, b.y)), b.brightness)); - } - } - - - let vv = 0; - // Now make lights bright - for (let X = 1; X < KinkyDungeonGridWidth - 1; X++) { - for (let Y = 1; Y < KinkyDungeonGridHeight - 1; Y++) { - vv = KinkyDungeonVisionGet(X, Y); - bb = KinkyDungeonBrightnessGet(X, Y); - if (vv > 0 && KDLightCropValue + bb > vv && LightsTemp.get(X + "," + Y)) { - KinkyDungeonVisionSet(X, Y, KDLightCropValue + bb); - } - } - } - - let rad = KinkyDungeonGetVisionRadius(); - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) { - let dd = KDistChebyshev(X - KinkyDungeonPlayerEntity.x, Y - KinkyDungeonPlayerEntity.y); - if (dd > rad) - KinkyDungeonVisionSet(X, Y, 0); - else if (rad < KDMaxVisionDist && dd > 1.5) { - KinkyDungeonVisionSet(X, Y, KinkyDungeonVisionGet(X, Y) * Math.min(1, Math.max(0, rad - dd)/3)); - } - } - } - - - if (KinkyDungeonSeeAll) { - KinkyDungeonVisionGrid = []; - // Generate the grid - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) - //KinkyDungeonLightGrid = KinkyDungeonLightGrid + '9'; // 0 = pitch dark - KinkyDungeonVisionGrid.push(10); // 0 = pitch dark - //KinkyDungeonLightGrid = KinkyDungeonLightGrid + '\n'; - } - } else { - // Generate the grid - let dist = 0; - let fog = true;//KDAllowFog(); - for (let X = 0; X < KinkyDungeonGridWidth; X++) { - for (let Y = 0; Y < KinkyDungeonGridHeight; Y++) - if (X >= 0 && X <= width-1 && Y >= 0 && Y <= height-1) { - dist = KDistChebyshev(KinkyDungeonPlayerEntity.x - X, KinkyDungeonPlayerEntity.y - Y); - if (dist < 3) { - let distE = KDistEuclidean(KinkyDungeonPlayerEntity.x - X, KinkyDungeonPlayerEntity.y - Y); - if (fog && dist < 3 - && distE < 2.9 - && KinkyDungeonCheckPath(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, X, Y, true, true, flags.SeeThroughWalls ? flags.SeeThroughWalls + 1 : 1, true)) { - KinkyDungeonFogGrid[X + Y*(width)] = Math.max(KinkyDungeonFogGrid[X + Y*(width)], 3); - } - if (distE < (KinkyDungeonDeaf ? 1.5 : 2.3) && KinkyDungeonVisionGrid[X + Y*(width)] == 0 - && KinkyDungeonCheckPath(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, X, Y, true, true, flags.SeeThroughWalls ? flags.SeeThroughWalls + 1 : 1, true)) { - KinkyDungeonVisionGrid[X + Y*(width)] = 1; - } - } - - if (fog) - KinkyDungeonFogGrid[X + Y*(width)] = Math.max(KinkyDungeonFogGrid[X + Y*(width)], KinkyDungeonVisionGrid[X + Y*(width)] ? 2 : 0); - } - } - } -} - -let KDFogTexture = null; -let KDLightCropValue = 6; - -function KDDrawFog(CamX, CamY, CamX_offset, CamY_offset) { - kdgamefog.clear(); - - if (KDFogTexture) { - let v_td = false; - let v_tu = false; - let v_tl = false; - let v_tr = false; - let v_tdl = false; - //let v_tul = false; - let v_tdr = false; - //let v_tur = false; - let RX = 0; - let RY = 0; - let allowFog = false; - let visible = false; - let fog = 0; - let lightDiv = 0; - let light = 0; - let shadowColor = 0; - let l = 0; - let pad = 0; - - for (let R = -1; R <= KinkyDungeonGridHeightDisplay + 2; R++) { - for (let X = -1; X <= KinkyDungeonGridWidthDisplay + 2; X++) { - - RY = R+CamY; - RX = X+CamX; - allowFog = KDAllowFog(); - if (RY >= 0 && RY < KinkyDungeonGridHeight && RX >= 0 && RX < KinkyDungeonGridWidth) { - visible = (KinkyDungeonVisionGet(RX, RY) > 0 || (allowFog && KinkyDungeonFogGet(RX, RY) > 0)); - if (visible) { - fog = KinkyDungeonStatBlind > 0 ? 0 : Math.min(0.5, KinkyDungeonFogGet(RX, RY)/10); - lightDiv = (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(RX, RY))) ? KDLightCropValue : KDLightCropValue * 0.7; - light = Math.max(KinkyDungeonVisionGrid[RX + RY*KinkyDungeonGridWidth]/lightDiv, fog); - //let lightColor = KinkyDungeonColorGrid[RX + RY*KinkyDungeonGridWidth]; - shadowColor = KinkyDungeonShadowGrid[RX + RY*KinkyDungeonGridWidth]; - if (KinkyDungeonVisionGrid[RX + RY*KinkyDungeonGridWidth] > 0 && KDistChebyshev(KinkyDungeonPlayerEntity.x - RX, KinkyDungeonPlayerEntity.y - RY) < 2) { - light = light + (1 - light)*0.5; - } - l = Math.max(0, Math.min(1, (1-light))); - //kdgamefog.beginFill(light > 0 ? (KDAvgColor(lightColor, shadowColor, light, Math.max(0, 1 - light))) : 0, l*l); - kdgamefog.beginFill(light > 0 ? shadowColor : 0x000000, (KinkyDungeonVisionGrid[RX + RY*KinkyDungeonGridWidth] > 0) ? (0.9*l*l) : l); - pad = light > 0 ? 0 : 1; - kdgamefog.drawRect((-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, KinkyDungeonGridSizeDisplay + pad*2, KinkyDungeonGridSizeDisplay + pad*2); - kdgamefog.endFill(); - - - if (KDToggles.FancyWalls && (KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(RX, RY)) || RX == 0 || RY == 0)) { - if (KDWallVert(RX, RY) || KinkyDungeonGridHeight == RY + 1) { - // Tile Up Visible - v_tu = ((KinkyDungeonVisionGet(RX, RY - 1) > 0 || (allowFog && KinkyDungeonFogGet(RX, RY - 1) > 0))); - v_td = ((KinkyDungeonVisionGet(RX, RY + 1) > 0 || (allowFog && KinkyDungeonFogGet(RX, RY + 1) > 0))); - v_tl = ((KinkyDungeonVisionGet(RX - 1, RY) > 0 || (allowFog && KinkyDungeonFogGet(RX - 1, RY) > 0))); - v_tr = ((KinkyDungeonVisionGet(RX + 1, RY) > 0 || (allowFog && KinkyDungeonFogGet(RX + 1, RY) > 0))); - //v_tul = ((KinkyDungeonVisionGet(RX - 1, RY - 1) > 0 || (allowFog && KinkyDungeonFogGet(RX - 1, RY - 1) > 0))); - v_tdl = ((KinkyDungeonVisionGet(RX - 1, RY + 1) > 0 || (allowFog && KinkyDungeonFogGet(RX - 1, RY + 1) > 0))); - //v_tur = ((KinkyDungeonVisionGet(RX + 1, RY - 1) > 0 || (allowFog && KinkyDungeonFogGet(RX + 1, RY - 1) > 0))); - v_tdr = ((KinkyDungeonVisionGet(RX + 1, RY + 1) > 0 || (allowFog && KinkyDungeonFogGet(RX + 1, RY + 1) > 0))); - - pad = 1; - if (!v_tl) { - kdgamefog.beginFill(0x000000, 1.0); - kdgamefog.drawRect( - (-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, - (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, - KinkyDungeonGridSizeDisplay/2 + pad*2, - KinkyDungeonGridSizeDisplay + pad*2); - kdgamefog.endFill(); - } - if (!v_tr) { - kdgamefog.beginFill(0x000000, 1.0); - kdgamefog.drawRect( - (-CamX_offset + X + 0.5)*KinkyDungeonGridSizeDisplay - pad, - (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, - KinkyDungeonGridSizeDisplay/2 + pad*2, - KinkyDungeonGridSizeDisplay + pad*2); - kdgamefog.endFill(); - } - if (!v_tu && !v_tdl && !v_tdr) { - kdgamefog.beginFill(0x000000, 1.0); - kdgamefog.drawRect( - (-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, - (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, - KinkyDungeonGridSizeDisplay + pad*2, - KinkyDungeonGridSizeDisplay/2 + pad*2); - kdgamefog.endFill(); - } - if (!v_td) { - kdgamefog.beginFill(0x000000, 1.0); - kdgamefog.drawRect( - (-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, - (-CamY_offset + R + 0.5)*KinkyDungeonGridSizeDisplay - pad, - KinkyDungeonGridSizeDisplay + pad*2, - KinkyDungeonGridSizeDisplay/2 + pad*2); - kdgamefog.endFill(); - } - if (v_td && v_tl && !v_tdl) { - kdgamefog.beginFill(0x000000, 1.0); - kdgamefog.drawRect( - (-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, - (-CamY_offset + R + 0.5)*KinkyDungeonGridSizeDisplay - pad, - KinkyDungeonGridSizeDisplay/2 + pad*2, - KinkyDungeonGridSizeDisplay/2 + pad*2); - kdgamefog.endFill(); - } - if (v_td && v_tr && !v_tdr) { - kdgamefog.beginFill(0x000000, 1.0); - kdgamefog.drawRect( - (-CamX_offset + X + 0.5)*KinkyDungeonGridSizeDisplay - pad, - (-CamY_offset + R + 0.5)*KinkyDungeonGridSizeDisplay - pad, - KinkyDungeonGridSizeDisplay/2 + pad*2, - KinkyDungeonGridSizeDisplay/2 + pad*2); - kdgamefog.endFill(); - } - } - } - } - } - } - } - } else { - let img = DrawGetImage(KinkyDungeonRootDirectory + "Fog/Fog.png"); - if (img) - // @ts-ignore - KDFogTexture = PIXI.Texture.from(img); - } -} - -/** - * Allows fog of war to be rendered - */ -function KDAllowFog() { - return !(KinkyDungeonStatsChoice.get("Forgetful") || (KinkyDungeonBlindLevel > 0 && KinkyDungeonStatsChoice.get("TotalBlackout"))); -} \ No newline at end of file diff --git a/Game/KinkyDungeonWeaponList.js b/Game/KinkyDungeonWeaponList.js deleted file mode 100644 index 192681a0f..000000000 --- a/Game/KinkyDungeonWeaponList.js +++ /dev/null @@ -1,210 +0,0 @@ -"use strict"; - -let KinkyDungeonStatStaminaCostAttack = -1.0; // Cost to attack - -/** - * @type {Record} - */ -let KinkyDungeonWeapons = { - "Unarmed": {name: "Unarmed", dmg: 2, chance: 0.9, type: "unarmed", unarmed: true, rarity: 0, shop: false, noequip: true, sfx: "Unarmed"}, - - // Knives - "Knife": {name: "Knife", dmg: 2.4, chance: 0.9, staminacost: 1.5, type: "slash", unarmed: false, rarity: 1, cutBonus: 0.05, shop: true, sfx: "Unarmed", light: true}, - "EnchKnife": {name: "EnchKnife", dmg: 2.6, chance: 0.9, staminacost: 1.5, type: "cold", unarmed: false, rarity: 1, cutBonus: 0.05, magic: true, shop: true, sfx: "MagicSlash", light: true}, - "Dirk": {name: "Dirk", dmg: 2.8, chance: 1.0, staminacost: 1.8, type: "slash", unarmed: false, rarity: 2, shop: true, cutBonus: 0.05, light: true, sfx: "LightSwing", - events: [ - {type: "ChangeDamageUnaware", trigger: "beforePlayerAttack", power: 5.5, damage: "pierce"}, - ], - }, - - // Swords - "Sword": {name: "Sword", dmg: 3, chance: 1.5, staminacost: 2.4, type: "slash", unarmed: false, rarity: 2, shop: false, cutBonus: 0.01, sfx: "LightSwing"}, - "Katana": {name: "Katana", dmg: 3, chance: 1.5, staminacost: 3.0, type: "slash", unarmed: false, rarity: 3, shop: true, cutBonus: 0.01, sfx: "LightSwing", - events: [ - {type: "Patience", trigger: "tick", power: 11, buffType: "KatanaCharge", color: "#ffffff"}, - {type: "KatanaBoost", trigger: "beforePlayerAttack", power: 0.25, sfx: "Fwoosh"}, - ] - }, - "DarkKatana": {name: "DarkKatana", dmg: 3, chance: 2.0, staminacost: 2.6, type: "cold", unarmed: false, rarity: 4, shop: false, magic: true, cutBonus: 0.01, sfx: "LightSwing", - events: [ - {type: "DamageMultInShadow", trigger: "beforePlayerAttack", power: 2.0, sfx: "Fwoosh"}, - ] - }, - "MagicSword": {name: "MagicSword", dmg: 3, chance: 2, staminacost: 2.3, type: "slash", unarmed: false, rarity: 4, shop: false, magic: true, cutBonus: 0.1, sfx: "LightSwing"}, - "Flamberge": {name: "Flamberge", dmg: 2.0, chance: 1.0, staminacost: 2.8, type: "slash", unarmed: false, rarity: 3, shop: true, cutBonus: 0.1, sfx: "FireSpell", magic: true, - events: [{type: "ElementalEffect", trigger: "playerAttack", power: 2.0, damage: "fire"}, {type: "WeaponLight", trigger: "getLights", power: 5}], - special: {type: "ignite"},}, - "Foil": {name: "Foil", dmg: 0.8, chance: 1.5, staminacost: 1.5, type: "pierce", unarmed: false, rarity: 3, shop: true, sfx: "Miss", - events: [ - {type: "ChangeDamageVulnerable", trigger: "beforePlayerAttack", power: 3.0, damage: "pierce"}, - ], - }, - "Rapier": {name: "Rapier", dmg: 2.5, chance: 1.3, staminacost: 3.0, type: "slash", unarmed: false, rarity: 3, shop: true, sfx: "LightSwing", - events: [ - {type: "ChangeDamageVulnerable", trigger: "beforePlayerAttack", power: 5.0, damage: "pierce"}, - ], - }, - - // Axes - "Axe": {name: "Axe", dmg: 4, chance: 1.0, staminacost: 4, type: "slash", unarmed: false, rarity: 2, shop: false, sfx: "HeavySwing", - events: [{type: "Cleave", trigger: "playerAttack", power: 2, damage: "slash"}]}, - "MagicAxe": {name: "MagicAxe", dmg: 4, chance: 1.0, staminacost: 4, type: "cold", unarmed: false, rarity: 4, magic: true, shop: false, cutBonus: 0.2, sfx: "HeavySwing", - events: [{type: "Cleave", trigger: "playerAttack", power: 2, damage: "cold", time: 3}, {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "cold", time: 3}]}, - - // Hammers - "Hammer": {name: "Hammer", dmg: 5, chance: 1.0, staminacost: 6, type: "crush", unarmed: false, rarity: 2, shop: true, sfx: "HeavySwing", cutBonus: 0.01, - events: [{type: "Knockback", trigger: "playerAttack", dist: 1}]}, - "MagicHammer": {name: "MagicHammer", dmg: 6, chance: 1.0, staminacost: 5.5, type: "crush", unarmed: false, rarity: 4, magic: true, shop: false, cutBonus: 0.2, sfx: "HeavySwing", - events: [{type: "Knockback", trigger: "playerAttack", dist: 1}]}, - "IceBreaker": {name: "IceBreaker", dmg: 4.3, chance: 1.2, staminacost: 4, type: "crush", unarmed: false, rarity: 4, magic: true, shop: false, sfx: "HeavySwing", - events: [{type: "MultiplyDamageFrozen", trigger: "beforeDamageEnemy", power: 1.5}]}, - "StormBreaker": {name: "StormBreaker", dmg: 4, chance: 1.0, staminacost: 5, type: "crush", unarmed: false, rarity: 4, magic: true, shop: false, sfx: "HeavySwing", - events: [ - {type: "StormBreakerDamage", trigger: "playerAttack", power: 4.0, sfx: "Shock", aoe: 1.5, damage: "electric"}, - {type: "StormBreakerCharge", trigger: "beforePlayerDamage", power: 1.5, damageTrigger: "electric", color: "#3de1ff"}, - ]}, - - // Flails - "Flail": {name: "Flail", dmg: 2.5, chance: 1.25, staminacost: 3.0, type: "crush", unarmed: false, rarity: 2, shop: true, sfx: "LightSwing", - events: [{type: "Cleave", trigger: "playerAttack", power: 1, damage: "crush"}]}, - "MagicFlail": {name: "MagicFlail", dmg: 3, chance: 1.25, staminacost: 3.0, type: "crush", unarmed: false, rarity: 4, magic: true, shop: false, sfx: "LightSwing", - events: [{type: "Cleave", trigger: "playerAttack", power: 3, damage: "crush"}]}, - - // Spears - "Spear": {name: "Spear", dmg: 4.0, chance: 1.0, staminacost: 3.3, type: "pierce", unarmed: false, rarity: 2, shop: false, sfx: "LightSwing", - events: [{type: "Pierce", trigger: "playerAttack", power: 4.0, damage: "pierce"}]}, - "MagicSpear": {name: "MagicSpear", dmg: 4.0, chance: 1.5, staminacost: 3.3, type: "pierce", unarmed: false, rarity: 4, magic: true, shop: true, sfx: "LightSwing", - events: [{type: "Pierce", trigger: "playerAttack", power: 4.0, damage: "pierce", dist: 2}]}, - - // Tier 1 Staves - "StaffFlame": {name: "StaffFlame", dmg: 4, chance: 0.85, staminacost: 5.0, type: "fire", unarmed: false, rarity: 3, shop: true, sfx: "MagicSlash", magic: true, - events: [{type: "Buff", trigger: "tick", power: 0.15, buffType: "fireDamageBuff"}], - special: {type: "ignite"},}, - "StaffChain": {name: "StaffChain", dmg: 3, bindEff: 1.25, bindType: "Metal", chance: 1.1, staminacost: 3.0, type: "chain", unarmed: false, rarity: 3, shop: true, sfx: "Chain", magic: true, - events: [{type: "Buff", trigger: "tick", power: 0.1, buffType: "chainDamageBuff"}, - {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "chain", time: 2}]}, - "StaffGlue": {name: "StaffGlue", dmg: 3, bindEff: 1.5, bindType: "Slime", chance: 1.0, staminacost: 4.0, type: "glue", unarmed: false, rarity: 3, shop: true, sfx: "MagicSlash", magic: true, - events: [{type: "Buff", trigger: "tick", power: 0.1, buffType: "glueDamageBuff"}]}, - "StaffElectric": {name: "StaffElectric", dmg: 3, chance: 1.1, staminacost: 4.0, type: "electric", unarmed: false, rarity: 3, shop: true, sfx: "Shock", magic: true, - events: [{type: "Buff", trigger: "tick", power: 0.1, buffType: "electricDamageBuff"}, {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "electric", time: 3, chance: 0.1}]}, - "StaffPermafrost": {name: "StaffPermafrost", dmg: 4, chance: 1.0, staminacost: 4.0, type: "ice", unarmed: false, rarity: 3, shop: true, sfx: "MagicSlash", magic: true, - events: [{type: "Buff", trigger: "tick", power: 0.1, buffType: "iceDamageBuff"}, - {type: "Buff", trigger: "tick", power: 0.1, buffType: "frostDamageBuff"}, - {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "ice", time: 4, chance: 0.15}, - {type: "MultiplyTime", trigger: "beforeDamageEnemy", power: 1.5, damage: "ice"}]}, - - // Tier 2 Staves - "StaffBind": {name: "StaffBind", dmg: 2.3, bindEff: 1, bindType: "Metal", chance: 1.0, staminacost: 3.0, type: "chain", unarmed: false, rarity: 4, shop: true, sfx: "Chain", magic: true, - events: [ - {type: "Buff", trigger: "tick", power: 0.2, buffType: "chainDamageBuff"}, - {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "chain", time: 4}]}, - "StaffIncineration": {name: "StaffIncineration", dmg: 6, chance: 0.7, staminacost: 5.0, type: "fire", unarmed: false, rarity: 4, shop: true, sfx: "MagicSlash", magic: true, - events: [ - {type: "Buff", trigger: "tick", power: 0.25, buffType: "fireDamageBuff"}, - {type: "AoEDamageBurning", trigger: "tick", aoe: 10, power: 0.5, damage: "fire"}], - special: {type: "ignite"},}, - "StaffStorm": {name: "StaffStorm", dmg: 4.5, chance: 1.0, staminacost: 4.5, type: "electric", unarmed: false, rarity: 4, shop: true, sfx: "Shock", magic: true, - events: [ - {type: "Buff", trigger: "tick", power: 0.2, buffType: "electricDamageBuff"}, - {type: "EchoDamage", trigger: "beforeDamageEnemy", aoe: 2.99, power: 1.5, damage: "electric"}]}, - "StaffDoll": {name: "StaffDoll", dmg: 3.0, chance: 1.0, staminacost: 4.0, type: "soul", unarmed: false, rarity: 4, shop: true, sfx: "MagicSlash", magic: true, - events: [ - {type: "Buff", trigger: "tick", power: 0.15, buffType: "glueDamageBuff"}, - {type: "Dollmaker", trigger: "capture"}]}, - "StaffFrostbite": {name: "StaffFrostbite", dmg: 4, chance: 1.0, staminacost: 4.0, type: "ice", unarmed: false, rarity: 4, shop: true, sfx: "MagicSlash", magic: true, - events: [{type: "Buff", trigger: "tick", power: 0.2, buffType: "iceDamageBuff"}, - {type: "Buff", trigger: "tick", power: 0.2, buffType: "frostDamageBuff"}, - {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "ice", time: 4, chance: 0.25}, - {type: "AoEDamageFrozen", trigger: "tick", aoe: 10, power: 0.5, damage: "ice"}]}, - - // Tier 1 orbs - "ArcaneCrystal": {name: "ArcaneCrystal", dmg: 3.3, chance: 0.8, staminacost: 3.0, type: "cold", noHands: true, unarmed: false, novulnerable: true, magic: true, rarity: 2, shop: true, sfx: "Laser", - events: [{type: "WeaponLight", trigger: "getLights", power: 3.5, color: "#6700ff"}]}, - - // Techy - "Slimethrower": {name: "Slimethrower", dmg: 3.5, chance: 1.0, staminacost: 6.0, type: "crush", unarmed: false, rarity: 10, shop: false, sfx: "HeavySwing", - special: {type: "spell", spell: "Slimethrower", requiresEnergy: true, energyCost: 0.015}}, - "EscortDrone": {name: "EscortDrone", dmg: 1.5, chance: 1.0, staminacost: 0.0, type: "electric", noHands: true, unarmed: false, rarity: 10, shop: false, sfx: "Laser", - events: [{type: "ElementalEffect", trigger: "playerAttack", power: 0, chance: 0.33, damage: "electric", time: 4}, {type: "WeaponLight", trigger: "getLights", power: 4}]}, - - // Special - "BoltCutters": {name: "BoltCutters", dmg: 3.5, staminacost: 3.8, chance: 1.0, type: "crush", unarmed: false, rarity: 3, shop: false, cutBonus: 0.3, sfx: "Unarmed", - events: [{type: "DamageToTag", trigger: "playerAttack", requiredTag: "lock", power: 7, damage: "slash", chance: 1.0}]}, - "Pickaxe": {name: "Pickaxe", dmg: 3, chance: 1.0, staminacost: 3.0, type: "pierce", unarmed: false, rarity: 3, shop: true, sfx: "LightSwing", - events: [{type: "ApplyBuff", trigger: "playerAttack", buff: {id: "ArmorDown", type: "ArmorBreak", duration: 6, power: -1.5, player: true, enemies: true, tags: ["debuff", "armor"]}}]}, - "Torch": {name: "Torch", dmg: 1.5, chance: 0.75, type: "fire", unarmed: false, rarity: 1, shop: true, sfx: "FireSpell", - events: [{type: "WeaponLight", trigger: "getLights", power: 6}], - special: {type: "ignite"},}, - - // BDSM Gear - "Feather": {name: "Feather", dmg: 0.5, chance: 2.0, staminacost: 0.5, distract: 2, type: "tickle", unarmed: false, rarity: 1, shop: true, sfx: "Tickle"}, - "Crop": {name: "Crop", dmg: 2.5, chance: 1.0, staminacost: 2.0, distract: 3, type: "pain", tease: true, unarmed: false, rarity: 2, shop: true, sfx: "Whip"}, - "IceCube": {name: "IceCube", dmg: 1.5, chance: 1.0, staminacost: 1.0, distract: 1, type: "ice", tease: true, unarmed: false, rarity: 1, shop: true, sfx: "Freeze", - events: [{type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "ice", time: 3, chance: 0.1}]}, - "Rope": {name: "Rope", dmg: 1.0, bind: 5, chance: 1.0, staminacost: 1.0, type: "chain", unarmed: false, rarity: 1, shop: true, sfx: "Struggle", bindType: "Rope"}, - "VibeWand": {name: "VibeWand", dmg: 2.0, chance: 1.0, staminacost: 1.5, type: "charm", unarmed: false, rarity: 1, shop: true, sfx: "Vibe", - playSelfBonus: 4, - playSelfMsg: "KinkyDungeonPlaySelfVibeWand", - playSelfSound: "Vibe", - events: [{type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "stun", time: 2, chance: 0.2}]}, - - "Scissors": {name: "Scissors", dmg: 1.2, chance: 1.8, staminacost: 0.7, type: "slash", unarmed: false, rarity: 2, shop: true, light: true, cutBonus: 0.1, sfx: "Cut"}, - - "Blaster": {name: "Blaster", dmg: 1, chance: 1.0, staminacost: 0.5, type: "tickle", unarmed: false, rarity: 5, shop: false, sfx: "Shock", - special: {type: "spell", spell: "BlasterBlast", requiresEnergy: true, energyCost: 0.005, range: 8}}, - - // Divine - "MoiraiScissors": {name: "MoiraiScissors", dmg: 1.5, chance: 1.1, staminacost: 1.5, type: "slash", unarmed: false, rarity: 10, shop: false, magic: true, cutBonus: 0.2, sfx: "Cut", - events: [ - {type: "DoubleStrike", trigger: "afterPlayerAttack", requireEnergy: true, energyCost: 0.005}, - {type: "ConvertBindingToDamage", trigger: "afterPlayerAttack", power: 1.0, bind: 3.0, damage: "soul"}, - ], - }, - "Dreamcatcher": {name: "Dreamcatcher", dmg: 2.5, chance: 1.0, staminacost: 1.5, type: "cold", unarmed: false, rarity: 10, shop: false, magic: true, cutBonus: 0.15, sfx: "Fwoosh", - events: [ - {type: "Dreamcatcher", trigger: "playerAttack", time: 20, requireEnergy: true, energyCost: 0.03}, - {type: "ElementalDreamcatcher", trigger: "playerAttack", power: 3.0, damage: "soul"}, - ], - }, - "MessengerOfLove": {name: "MessengerOfLove", dmg: 2, chance: 0.75, staminacost: 1, type: "crush", unarmed: false, rarity: 10, shop: false, magic: true, sfx: "Unarmed", - special: {type: "spell", spell: "HeartArrow", requiresEnergy: true, energyCost: 0.05, range: 50}, - }, - "Dragonslaver": {name: "Dragonslaver", dmg: 3.5, chance: 1.25, staminacost: 2.5, type: "slash", unarmed: false, rarity: 10, shop: false, cutBonus: 0.1, sfx: "LightSwing", - events: [{type: "CastSpell", spell: "BeltStrike", trigger: "playerAttack", requireEnergy: true, energyCost: 0.008}], - special: {type: "hitorspell", spell: "BeltStrike", requiresEnergy: true, energyCost: 0.0075, range: 2.99}}, - "Arbiter": {name: "Arbiter", dmg: 4, bindEff: 1.1, chance: 2.0, bindType: "Metal", staminacost: 3, type: "chain", unarmed: false, rarity: 10, shop: false, magic: true, sfx: "HeavySwing", - events: [ - {type: "BuffMulti", trigger: "tick", power: 0.25, buffTypes: [ - "glueDamageBuff", - "chainDamageBuff", - ]}, - {type: "DamageToSummons", trigger: "playerAttack", power: 4, damage: "cold", chance: 1.0} - ], - special: {type: "spell", spell: "Disarm", requiresEnergy: true, energyCost: 0.025, range: 3.99}}, - "BondageBuster": {name: "BondageBuster", dmg: 1, chance: 1.0, staminacost: 0.5, type: "tickle", unarmed: false, rarity: 10, shop: false, sfx: "Shock", - events: [ - {type: "ElementalEffect", trigger: "playerAttack", power: 0, time: 4, damage: "tickle"}, - {type: "Charge", trigger: "tick", power: 11, buffType: "BondageBustCharge", color: "#ffff00"}, - {type: "BondageBustBoost", trigger: "spellCast", power: 0.25, sfx: "Shock", energyCost: 0.0025}, - ], - special: {type: "spell", spell: "BondageBust", requiresEnergy: true, energyCost: 0.005, range: 4}}, - "TheEncaser": {name: "TheEncaser", dmg: 4, chance: 1.0, bindType: "Slime", staminacost: 3.0, type: "glue", unarmed: false, rarity: 10, shop: false, magic: true, sfx: "MagicSlash", - events: [{type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "glue", time: 2}], - special: {type: "spell", selfCast: true, spell: "SlimeForm", requiresEnergy: true, energyCost: 0.025}}, - "FourSeasons": {name: "FourSeasons", dmg: 4, chance: 1.0, staminacost: 4.0, type: "cold", unarmed: false, rarity: 10, shop: false, magic: true, sfx: "Fwoosh", - events: [ - {type: "BuffMulti", trigger: "tick", power: 0.25, buffTypes: [ - "fireDamageBuff", - "iceDamageBuff", - "frostDamageBuff", - "acidDamageBuff", - "electricDamageBuff", - "crushDamageBuff", - "gravityDamageBuff", - "stunDamageBuff", - ]} - ], - special: {type: "spell", selfCast: true, spell: "AvatarForm", requiresEnergy: true, energyCost: 0.05}}, - - -}; diff --git a/Game/Light.png b/Game/Light.png new file mode 100644 index 000000000..14f8c4e31 Binary files /dev/null and b/Game/Light.png differ diff --git a/Game/Lighting.png b/Game/Lighting.png new file mode 100644 index 000000000..14f8c4e31 Binary files /dev/null and b/Game/Lighting.png differ diff --git a/Game/Locks/Blind.png b/Game/Locks/Blind.png index 8543ff1e2..ae667a2d2 100644 Binary files a/Game/Locks/Blind.png and b/Game/Locks/Blind.png differ diff --git a/Game/Locks/Blocked.png b/Game/Locks/Blocked.png new file mode 100644 index 000000000..3dd784f10 Binary files /dev/null and b/Game/Locks/Blocked.png differ diff --git a/Game/Locks/Blue.png b/Game/Locks/Blue.png index 4dea20fbb..d2d1a6731 100644 Binary files a/Game/Locks/Blue.png and b/Game/Locks/Blue.png differ diff --git a/Game/Locks/Crystal.png b/Game/Locks/Crystal.png new file mode 100644 index 000000000..bc8aa661e Binary files /dev/null and b/Game/Locks/Crystal.png differ diff --git a/Game/Locks/Curse.png b/Game/Locks/Curse.png new file mode 100644 index 000000000..8d7bc6126 Binary files /dev/null and b/Game/Locks/Curse.png differ diff --git a/Game/Locks/Cyber.png b/Game/Locks/Cyber.png new file mode 100644 index 000000000..dfd14625a Binary files /dev/null and b/Game/Locks/Cyber.png differ diff --git a/Game/Locks/Cyber2.png b/Game/Locks/Cyber2.png new file mode 100644 index 000000000..c58474dd3 Binary files /dev/null and b/Game/Locks/Cyber2.png differ diff --git a/Game/Locks/Cyber3.png b/Game/Locks/Cyber3.png new file mode 100644 index 000000000..347853d9d Binary files /dev/null and b/Game/Locks/Cyber3.png differ diff --git a/Game/Locks/Disc.png b/Game/Locks/Disc.png new file mode 100644 index 000000000..ba89db911 Binary files /dev/null and b/Game/Locks/Disc.png differ diff --git a/Game/Locks/Divine.png b/Game/Locks/Divine.png new file mode 100644 index 000000000..cbcb865a3 Binary files /dev/null and b/Game/Locks/Divine.png differ diff --git a/Game/Locks/Divine2.png b/Game/Locks/Divine2.png new file mode 100644 index 000000000..cbcb865a3 Binary files /dev/null and b/Game/Locks/Divine2.png differ diff --git a/Game/Locks/Dollmaker.png b/Game/Locks/Dollmaker.png new file mode 100644 index 000000000..8bc611b03 Binary files /dev/null and b/Game/Locks/Dollmaker.png differ diff --git a/Game/Locks/ExCrystal.png b/Game/Locks/ExCrystal.png new file mode 100644 index 000000000..5602c2d72 Binary files /dev/null and b/Game/Locks/ExCrystal.png differ diff --git a/Game/Locks/Fuuka.png b/Game/Locks/Fuuka.png new file mode 100644 index 000000000..31e57c29f Binary files /dev/null and b/Game/Locks/Fuuka.png differ diff --git a/Game/Locks/Gold.png b/Game/Locks/Gold.png index 6dedf65c7..5e50b95a5 100644 Binary files a/Game/Locks/Gold.png and b/Game/Locks/Gold.png differ diff --git a/Game/Locks/Grey.png b/Game/Locks/Grey.png new file mode 100644 index 000000000..5e77b098a Binary files /dev/null and b/Game/Locks/Grey.png differ diff --git a/Game/Locks/HiSec.png b/Game/Locks/HiSec.png new file mode 100644 index 000000000..c97e15aba Binary files /dev/null and b/Game/Locks/HiSec.png differ diff --git a/Game/Locks/Purple.png b/Game/Locks/Purple.png index 24f6af255..8fff9a9e5 100644 Binary files a/Game/Locks/Purple.png and b/Game/Locks/Purple.png differ diff --git a/Game/Locks/Red.png b/Game/Locks/Red.png index 87679655d..ff44b69bb 100644 Binary files a/Game/Locks/Red.png and b/Game/Locks/Red.png differ diff --git a/Game/Locks/Red_Hi.png b/Game/Locks/Red_Hi.png index 87679655d..5b819936c 100644 Binary files a/Game/Locks/Red_Hi.png and b/Game/Locks/Red_Hi.png differ diff --git a/Game/Locks/Red_Med.png b/Game/Locks/Red_Med.png index 87679655d..02ee0a6b3 100644 Binary files a/Game/Locks/Red_Med.png and b/Game/Locks/Red_Med.png differ diff --git a/Game/Locks/Rubber.png b/Game/Locks/Rubber.png new file mode 100644 index 000000000..fec17bb92 Binary files /dev/null and b/Game/Locks/Rubber.png differ diff --git a/Game/Locks/StarCurse.png b/Game/Locks/StarCurse.png new file mode 100644 index 000000000..4f20c07ce Binary files /dev/null and b/Game/Locks/StarCurse.png differ diff --git a/Game/Locks/White.png b/Game/Locks/White.png index 4b21f777c..5e77b098a 100644 Binary files a/Game/Locks/White.png and b/Game/Locks/White.png differ diff --git a/Game/Logo.aseprite b/Game/Logo.aseprite new file mode 100644 index 000000000..8c6389be2 Binary files /dev/null and b/Game/Logo.aseprite differ diff --git a/Game/MagicBook.png b/Game/MagicBook.png index 101bd9ae4..b92e95f51 100644 Binary files a/Game/MagicBook.png and b/Game/MagicBook.png differ diff --git a/Game/MagicBookNew.png b/Game/MagicBookNew.png new file mode 100644 index 000000000..f88fb3d8f Binary files /dev/null and b/Game/MagicBookNew.png differ diff --git a/Game/MushroomOverlay.png b/Game/MushroomOverlay.png deleted file mode 100644 index f3f21a4e7..000000000 Binary files a/Game/MushroomOverlay.png and /dev/null differ diff --git a/Game/Outfits/BlueSuit.png b/Game/Outfits/BlueSuit.png index 303c1fcbd..87a47304a 100644 Binary files a/Game/Outfits/BlueSuit.png and b/Game/Outfits/BlueSuit.png differ diff --git a/Game/Outfits/Bountyhunter.png b/Game/Outfits/Bountyhunter.png new file mode 100644 index 000000000..87a47304a Binary files /dev/null and b/Game/Outfits/Bountyhunter.png differ diff --git a/Game/Outfits/Default.png b/Game/Outfits/Default.png index ff6d69e94..b899472f4 100644 Binary files a/Game/Outfits/Default.png and b/Game/Outfits/Default.png differ diff --git a/Game/Outfits/Dragon.png b/Game/Outfits/Dragon.png index e0c95f821..15ee898d2 100644 Binary files a/Game/Outfits/Dragon.png and b/Game/Outfits/Dragon.png differ diff --git a/Game/Outfits/Elven.png b/Game/Outfits/Elven.png index c5242ec0a..66256d622 100644 Binary files a/Game/Outfits/Elven.png and b/Game/Outfits/Elven.png differ diff --git a/Game/Outfits/JailUniform.png b/Game/Outfits/JailUniform.png index d26554091..353d8f910 100644 Binary files a/Game/Outfits/JailUniform.png and b/Game/Outfits/JailUniform.png differ diff --git a/Game/Outfits/Maid.png b/Game/Outfits/Maid.png index f86f3b41f..3bfc31c23 100644 Binary files a/Game/Outfits/Maid.png and b/Game/Outfits/Maid.png differ diff --git a/Game/Outfits/OutfitDefault.png b/Game/Outfits/OutfitDefault.png index ff6d69e94..b899472f4 100644 Binary files a/Game/Outfits/OutfitDefault.png and b/Game/Outfits/OutfitDefault.png differ diff --git a/Game/Outfits/Wolfgirl.png b/Game/Outfits/Wolfgirl.png index ff02dd54c..bd5543de0 100644 Binary files a/Game/Outfits/Wolfgirl.png and b/Game/Outfits/Wolfgirl.png differ diff --git a/Game/Particles/PinkGlow.png b/Game/Particles/PinkGlow.png new file mode 100644 index 000000000..b88fa7ecf Binary files /dev/null and b/Game/Particles/PinkGlow.png differ diff --git a/Game/Particles/SealSigil.png b/Game/Particles/SealSigil.png new file mode 100644 index 000000000..40ed316b9 Binary files /dev/null and b/Game/Particles/SealSigil.png differ diff --git a/Game/Particles/ShockCollarHit.png b/Game/Particles/ShockCollarHit.png new file mode 100644 index 000000000..70f500eed Binary files /dev/null and b/Game/Particles/ShockCollarHit.png differ diff --git a/Game/Particles/Shockwave.png b/Game/Particles/Shockwave.png new file mode 100644 index 000000000..1d410a22e Binary files /dev/null and b/Game/Particles/Shockwave.png differ diff --git a/Game/Particles/ShockwaveDesire.png b/Game/Particles/ShockwaveDesire.png new file mode 100644 index 000000000..cc342f815 Binary files /dev/null and b/Game/Particles/ShockwaveDesire.png differ diff --git a/Game/Particles/ShockwaveEnemy.png b/Game/Particles/ShockwaveEnemy.png new file mode 100644 index 000000000..326c5f792 Binary files /dev/null and b/Game/Particles/ShockwaveEnemy.png differ diff --git a/Game/Particles/ShockwaveShield.png b/Game/Particles/ShockwaveShield.png new file mode 100644 index 000000000..3fb30d8ce Binary files /dev/null and b/Game/Particles/ShockwaveShield.png differ diff --git a/Game/Particles/Slash.png b/Game/Particles/Slash.png new file mode 100644 index 000000000..c8cd0a3dd Binary files /dev/null and b/Game/Particles/Slash.png differ diff --git a/Game/Particles/VibeHeart.png b/Game/Particles/VibeHeart.png index d37538e33..7c72acf99 100644 Binary files a/Game/Particles/VibeHeart.png and b/Game/Particles/VibeHeart.png differ diff --git a/Game/Particles/mmm.png b/Game/Particles/mmm.png new file mode 100644 index 000000000..b469100d9 Binary files /dev/null and b/Game/Particles/mmm.png differ diff --git a/Game/Particles/nnn.png b/Game/Particles/nnn.png new file mode 100644 index 000000000..39bce9f07 Binary files /dev/null and b/Game/Particles/nnn.png differ diff --git a/Game/Poses/BlushExtreme.png b/Game/Poses/BlushExtreme.png new file mode 100644 index 000000000..4b1a6f1e6 Binary files /dev/null and b/Game/Poses/BlushExtreme.png differ diff --git a/Game/Poses/BlushHigh.png b/Game/Poses/BlushHigh.png new file mode 100644 index 000000000..80df21a73 Binary files /dev/null and b/Game/Poses/BlushHigh.png differ diff --git a/Game/Poses/BlushLow.png b/Game/Poses/BlushLow.png new file mode 100644 index 000000000..00f9e503e Binary files /dev/null and b/Game/Poses/BlushLow.png differ diff --git a/Game/Poses/BlushMedium.png b/Game/Poses/BlushMedium.png new file mode 100644 index 000000000..f4be6bc35 Binary files /dev/null and b/Game/Poses/BlushMedium.png differ diff --git a/Game/Poses/BlushNeutral.png b/Game/Poses/BlushNeutral.png new file mode 100644 index 000000000..8aabd7810 Binary files /dev/null and b/Game/Poses/BlushNeutral.png differ diff --git a/Game/Poses/Boxtie.png b/Game/Poses/Boxtie.png new file mode 100644 index 000000000..bd137a8a3 Binary files /dev/null and b/Game/Poses/Boxtie.png differ diff --git a/Game/Poses/Brows2Angry.png b/Game/Poses/Brows2Angry.png new file mode 100644 index 000000000..93450078b Binary files /dev/null and b/Game/Poses/Brows2Angry.png differ diff --git a/Game/Poses/Brows2Annoyed.png b/Game/Poses/Brows2Annoyed.png new file mode 100644 index 000000000..da1ded752 Binary files /dev/null and b/Game/Poses/Brows2Annoyed.png differ diff --git a/Game/Poses/Brows2Neutral.png b/Game/Poses/Brows2Neutral.png new file mode 100644 index 000000000..85c85cb19 Binary files /dev/null and b/Game/Poses/Brows2Neutral.png differ diff --git a/Game/Poses/Brows2Sad.png b/Game/Poses/Brows2Sad.png new file mode 100644 index 000000000..5e86ea715 Binary files /dev/null and b/Game/Poses/Brows2Sad.png differ diff --git a/Game/Poses/Brows2Surprised.png b/Game/Poses/Brows2Surprised.png new file mode 100644 index 000000000..bad98608e Binary files /dev/null and b/Game/Poses/Brows2Surprised.png differ diff --git a/Game/Poses/BrowsAngry.png b/Game/Poses/BrowsAngry.png new file mode 100644 index 000000000..03a2c1700 Binary files /dev/null and b/Game/Poses/BrowsAngry.png differ diff --git a/Game/Poses/BrowsAnnoyed.png b/Game/Poses/BrowsAnnoyed.png new file mode 100644 index 000000000..930e2b7f5 Binary files /dev/null and b/Game/Poses/BrowsAnnoyed.png differ diff --git a/Game/Poses/BrowsNeutral.png b/Game/Poses/BrowsNeutral.png new file mode 100644 index 000000000..819fd1386 Binary files /dev/null and b/Game/Poses/BrowsNeutral.png differ diff --git a/Game/Poses/BrowsSad.png b/Game/Poses/BrowsSad.png new file mode 100644 index 000000000..786fcf3d5 Binary files /dev/null and b/Game/Poses/BrowsSad.png differ diff --git a/Game/Poses/BrowsSurprised.png b/Game/Poses/BrowsSurprised.png new file mode 100644 index 000000000..e0652da13 Binary files /dev/null and b/Game/Poses/BrowsSurprised.png differ diff --git a/Game/Poses/Closed.png b/Game/Poses/Closed.png new file mode 100644 index 000000000..286ce845f Binary files /dev/null and b/Game/Poses/Closed.png differ diff --git a/Game/Poses/Crossed.png b/Game/Poses/Crossed.png new file mode 100644 index 000000000..a3590670b Binary files /dev/null and b/Game/Poses/Crossed.png differ diff --git a/Game/Poses/Eyes2Angry.png b/Game/Poses/Eyes2Angry.png new file mode 100644 index 000000000..6a6f0ef79 Binary files /dev/null and b/Game/Poses/Eyes2Angry.png differ diff --git a/Game/Poses/Eyes2Closed.png b/Game/Poses/Eyes2Closed.png new file mode 100644 index 000000000..ed130b73f Binary files /dev/null and b/Game/Poses/Eyes2Closed.png differ diff --git a/Game/Poses/Eyes2Dazed.png b/Game/Poses/Eyes2Dazed.png new file mode 100644 index 000000000..42f0cc578 Binary files /dev/null and b/Game/Poses/Eyes2Dazed.png differ diff --git a/Game/Poses/Eyes2Heart.png b/Game/Poses/Eyes2Heart.png new file mode 100644 index 000000000..a03647653 Binary files /dev/null and b/Game/Poses/Eyes2Heart.png differ diff --git a/Game/Poses/Eyes2Neutral.png b/Game/Poses/Eyes2Neutral.png new file mode 100644 index 000000000..f4252f55d Binary files /dev/null and b/Game/Poses/Eyes2Neutral.png differ diff --git a/Game/Poses/Eyes2Sly.png b/Game/Poses/Eyes2Sly.png new file mode 100644 index 000000000..078a1a8fb Binary files /dev/null and b/Game/Poses/Eyes2Sly.png differ diff --git a/Game/Poses/Eyes2Surprised.png b/Game/Poses/Eyes2Surprised.png new file mode 100644 index 000000000..647fe964c Binary files /dev/null and b/Game/Poses/Eyes2Surprised.png differ diff --git a/Game/Poses/EyesAngry.png b/Game/Poses/EyesAngry.png new file mode 100644 index 000000000..0cfc1bc96 Binary files /dev/null and b/Game/Poses/EyesAngry.png differ diff --git a/Game/Poses/EyesClosed.png b/Game/Poses/EyesClosed.png new file mode 100644 index 000000000..4edff9cc5 Binary files /dev/null and b/Game/Poses/EyesClosed.png differ diff --git a/Game/Poses/EyesDazed.png b/Game/Poses/EyesDazed.png new file mode 100644 index 000000000..30318cad3 Binary files /dev/null and b/Game/Poses/EyesDazed.png differ diff --git a/Game/Poses/EyesHeart.png b/Game/Poses/EyesHeart.png new file mode 100644 index 000000000..49bb621a3 Binary files /dev/null and b/Game/Poses/EyesHeart.png differ diff --git a/Game/Poses/EyesNeutral.png b/Game/Poses/EyesNeutral.png new file mode 100644 index 000000000..694b887b4 Binary files /dev/null and b/Game/Poses/EyesNeutral.png differ diff --git a/Game/Poses/EyesSly.png b/Game/Poses/EyesSly.png new file mode 100644 index 000000000..d01717df0 Binary files /dev/null and b/Game/Poses/EyesSly.png differ diff --git a/Game/Poses/EyesSurprised.png b/Game/Poses/EyesSurprised.png new file mode 100644 index 000000000..cbad61ef5 Binary files /dev/null and b/Game/Poses/EyesSurprised.png differ diff --git a/Game/Poses/FearPose.png b/Game/Poses/FearPose.png new file mode 100644 index 000000000..92c6adc81 Binary files /dev/null and b/Game/Poses/FearPose.png differ diff --git a/Game/Poses/Free.png b/Game/Poses/Free.png new file mode 100644 index 000000000..1d706af4c Binary files /dev/null and b/Game/Poses/Free.png differ diff --git a/Game/Poses/Front.png b/Game/Poses/Front.png new file mode 100644 index 000000000..e56d3b41f Binary files /dev/null and b/Game/Poses/Front.png differ diff --git a/Game/Poses/Hogtie.png b/Game/Poses/Hogtie.png new file mode 100644 index 000000000..8724c81bb Binary files /dev/null and b/Game/Poses/Hogtie.png differ diff --git a/Game/Poses/Kneel.png b/Game/Poses/Kneel.png new file mode 100644 index 000000000..a8d1d25ec Binary files /dev/null and b/Game/Poses/Kneel.png differ diff --git a/Game/Poses/KneelClosed.png b/Game/Poses/KneelClosed.png new file mode 100644 index 000000000..b41d9441b Binary files /dev/null and b/Game/Poses/KneelClosed.png differ diff --git a/Game/Poses/MouthDazed.png b/Game/Poses/MouthDazed.png new file mode 100644 index 000000000..cd6af7bb5 Binary files /dev/null and b/Game/Poses/MouthDazed.png differ diff --git a/Game/Poses/MouthDistracted.png b/Game/Poses/MouthDistracted.png new file mode 100644 index 000000000..4920e5f41 Binary files /dev/null and b/Game/Poses/MouthDistracted.png differ diff --git a/Game/Poses/MouthEmbarrassed.png b/Game/Poses/MouthEmbarrassed.png new file mode 100644 index 000000000..cde7256e6 Binary files /dev/null and b/Game/Poses/MouthEmbarrassed.png differ diff --git a/Game/Poses/MouthFrown.png b/Game/Poses/MouthFrown.png new file mode 100644 index 000000000..084127a37 Binary files /dev/null and b/Game/Poses/MouthFrown.png differ diff --git a/Game/Poses/MouthNeutral.png b/Game/Poses/MouthNeutral.png new file mode 100644 index 000000000..98462f1d1 Binary files /dev/null and b/Game/Poses/MouthNeutral.png differ diff --git a/Game/Poses/MouthPout.png b/Game/Poses/MouthPout.png new file mode 100644 index 000000000..2ac80bf43 Binary files /dev/null and b/Game/Poses/MouthPout.png differ diff --git a/Game/Poses/MouthSmile.png b/Game/Poses/MouthSmile.png new file mode 100644 index 000000000..a3c928673 Binary files /dev/null and b/Game/Poses/MouthSmile.png differ diff --git a/Game/Poses/MouthSurprised.png b/Game/Poses/MouthSurprised.png new file mode 100644 index 000000000..a3c54ea14 Binary files /dev/null and b/Game/Poses/MouthSurprised.png differ diff --git a/Game/Poses/NoFearPose.png b/Game/Poses/NoFearPose.png new file mode 100644 index 000000000..0443a1c6d Binary files /dev/null and b/Game/Poses/NoFearPose.png differ diff --git a/Game/Poses/SetPose.png b/Game/Poses/SetPose.png new file mode 100644 index 000000000..9a98af757 Binary files /dev/null and b/Game/Poses/SetPose.png differ diff --git a/Game/Poses/Spread.png b/Game/Poses/Spread.png new file mode 100644 index 000000000..75365749b Binary files /dev/null and b/Game/Poses/Spread.png differ diff --git a/Game/Poses/Up.png b/Game/Poses/Up.png new file mode 100644 index 000000000..84b71564c Binary files /dev/null and b/Game/Poses/Up.png differ diff --git a/Game/Poses/Wristtie.png b/Game/Poses/Wristtie.png new file mode 100644 index 000000000..b4e0d2385 Binary files /dev/null and b/Game/Poses/Wristtie.png differ diff --git a/Game/Poses/Yoked.png b/Game/Poses/Yoked.png new file mode 100644 index 000000000..9b948a540 Binary files /dev/null and b/Game/Poses/Yoked.png differ diff --git a/Game/Restraints/RopeHarness.aseprite b/Game/Restraints/RopeHarness.aseprite deleted file mode 100644 index 3d187581f..000000000 Binary files a/Game/Restraints/RopeHarness.aseprite and /dev/null differ diff --git a/Game/Restraints/RopeWristCuff.aseprite b/Game/Restraints/RopeWristCuff.aseprite deleted file mode 100644 index 93aff2ec7..000000000 Binary files a/Game/Restraints/RopeWristCuff.aseprite and /dev/null differ diff --git a/Game/Restraints/RopeWristElbow.aseprite b/Game/Restraints/RopeWristElbow.aseprite deleted file mode 100644 index a9be31b85..000000000 Binary files a/Game/Restraints/RopeWristElbow.aseprite and /dev/null differ diff --git a/Game/Restraints/RopeWristTie.aseprite b/Game/Restraints/RopeWristTie.aseprite deleted file mode 100644 index c5530d67e..000000000 Binary files a/Game/Restraints/RopeWristTie.aseprite and /dev/null differ diff --git a/Game/ShopBasic/2C4.png b/Game/ShopBasic/2C4.png new file mode 100644 index 000000000..648b41a38 Binary files /dev/null and b/Game/ShopBasic/2C4.png differ diff --git a/Game/ShopBasic/2Dynamite.png b/Game/ShopBasic/2Dynamite.png new file mode 100644 index 000000000..71290ccbb Binary files /dev/null and b/Game/ShopBasic/2Dynamite.png differ diff --git a/Game/ShopBasic/3Bola.png b/Game/ShopBasic/3Bola.png new file mode 100644 index 000000000..7113bc6a6 Binary files /dev/null and b/Game/ShopBasic/3Bola.png differ diff --git a/Game/ShopBasic/3Bomb.png b/Game/ShopBasic/3Bomb.png new file mode 100644 index 000000000..093a0d42c Binary files /dev/null and b/Game/ShopBasic/3Bomb.png differ diff --git a/Game/ShopBasic/3Flash.png b/Game/ShopBasic/3Flash.png new file mode 100644 index 000000000..158494fd6 Binary files /dev/null and b/Game/ShopBasic/3Flash.png differ diff --git a/Game/ShopBasic/3Flashbang.png b/Game/ShopBasic/3Flashbang.png new file mode 100644 index 000000000..2f4fd01df Binary files /dev/null and b/Game/ShopBasic/3Flashbang.png differ diff --git a/Game/ShopBasic/3Smoke.png b/Game/ShopBasic/3Smoke.png new file mode 100644 index 000000000..65c71e640 Binary files /dev/null and b/Game/ShopBasic/3Smoke.png differ diff --git a/Game/ShopBasic/BlueKey.png b/Game/ShopBasic/BlueKey.png new file mode 100644 index 000000000..abf2dda58 Binary files /dev/null and b/Game/ShopBasic/BlueKey.png differ diff --git a/Game/ShopBasic/BlueSuit.png b/Game/ShopBasic/BlueSuit.png new file mode 100644 index 000000000..87a47304a Binary files /dev/null and b/Game/ShopBasic/BlueSuit.png differ diff --git a/Game/ShopBasic/Bountyhunter.png b/Game/ShopBasic/Bountyhunter.png new file mode 100644 index 000000000..87a47304a Binary files /dev/null and b/Game/ShopBasic/Bountyhunter.png differ diff --git a/Game/ShopBasic/Default.png b/Game/ShopBasic/Default.png new file mode 100644 index 000000000..b899472f4 Binary files /dev/null and b/Game/ShopBasic/Default.png differ diff --git a/Game/ShopBasic/DivineBelt.png b/Game/ShopBasic/DivineBelt.png new file mode 100644 index 000000000..5f3d8110a Binary files /dev/null and b/Game/ShopBasic/DivineBelt.png differ diff --git a/Game/ShopBasic/DivineBelt2.png b/Game/ShopBasic/DivineBelt2.png new file mode 100644 index 000000000..5f3d8110a Binary files /dev/null and b/Game/ShopBasic/DivineBelt2.png differ diff --git a/Game/ShopBasic/Dragon.png b/Game/ShopBasic/Dragon.png new file mode 100644 index 000000000..15ee898d2 Binary files /dev/null and b/Game/ShopBasic/Dragon.png differ diff --git a/Game/ShopBasic/Elven.png b/Game/ShopBasic/Elven.png new file mode 100644 index 000000000..66256d622 Binary files /dev/null and b/Game/ShopBasic/Elven.png differ diff --git a/Game/ShopBasic/JailUniform.png b/Game/ShopBasic/JailUniform.png new file mode 100644 index 000000000..353d8f910 Binary files /dev/null and b/Game/ShopBasic/JailUniform.png differ diff --git a/Game/ShopBasic/Lockpick.png b/Game/ShopBasic/Lockpick.png new file mode 100644 index 000000000..ba442fbb9 Binary files /dev/null and b/Game/ShopBasic/Lockpick.png differ diff --git a/Game/ShopBasic/Maid.png b/Game/ShopBasic/Maid.png new file mode 100644 index 000000000..3bfc31c23 Binary files /dev/null and b/Game/ShopBasic/Maid.png differ diff --git a/Game/ShopBasic/MaidUniform.png b/Game/ShopBasic/MaidUniform.png new file mode 100644 index 000000000..3bfc31c23 Binary files /dev/null and b/Game/ShopBasic/MaidUniform.png differ diff --git a/Game/ShopBasic/OutfitDefault.png b/Game/ShopBasic/OutfitDefault.png new file mode 100644 index 000000000..b899472f4 Binary files /dev/null and b/Game/ShopBasic/OutfitDefault.png differ diff --git a/Game/ShopBasic/PotionCollar.png b/Game/ShopBasic/PotionCollar.png new file mode 100644 index 000000000..cde8e96cd Binary files /dev/null and b/Game/ShopBasic/PotionCollar.png differ diff --git a/Game/ShopBasic/RedKey.png b/Game/ShopBasic/RedKey.png new file mode 100644 index 000000000..a9f2990d1 Binary files /dev/null and b/Game/ShopBasic/RedKey.png differ diff --git a/Game/ShopBasic/SlimeWalkers.png b/Game/ShopBasic/SlimeWalkers.png new file mode 100644 index 000000000..f03d08cc4 Binary files /dev/null and b/Game/ShopBasic/SlimeWalkers.png differ diff --git a/Game/ShopBasic/Wolfgirl.png b/Game/ShopBasic/Wolfgirl.png new file mode 100644 index 000000000..bd5543de0 Binary files /dev/null and b/Game/ShopBasic/Wolfgirl.png differ diff --git a/Game/ShrineAuraQuest.png b/Game/ShrineAuraQuest.png new file mode 100644 index 000000000..47fc69f0f Binary files /dev/null and b/Game/ShrineAuraQuest.png differ diff --git a/Game/SimpleLogo.aseprite b/Game/SimpleLogo.aseprite new file mode 100644 index 000000000..48d141988 Binary files /dev/null and b/Game/SimpleLogo.aseprite differ diff --git a/Game/SimpleLogo.png b/Game/SimpleLogo.png new file mode 100644 index 000000000..95cd5d675 Binary files /dev/null and b/Game/SimpleLogo.png differ diff --git a/Game/SpellRange.png b/Game/SpellRange.png new file mode 100644 index 000000000..944a4a3ac Binary files /dev/null and b/Game/SpellRange.png differ diff --git a/Game/Spells/AkashicConflux.png b/Game/Spells/AkashicConflux.png new file mode 100644 index 000000000..6eb3e7350 Binary files /dev/null and b/Game/Spells/AkashicConflux.png differ diff --git a/Game/Spells/AllyAggressive.png b/Game/Spells/AllyAggressive.png new file mode 100644 index 000000000..ae8a968ea Binary files /dev/null and b/Game/Spells/AllyAggressive.png differ diff --git a/Game/Spells/AllyAttention.png b/Game/Spells/AllyAttention.png new file mode 100644 index 000000000..c4b804b19 Binary files /dev/null and b/Game/Spells/AllyAttention.png differ diff --git a/Game/Spells/AllyCancelHold.png b/Game/Spells/AllyCancelHold.png new file mode 100644 index 000000000..0ba87932b Binary files /dev/null and b/Game/Spells/AllyCancelHold.png differ diff --git a/Game/Spells/AllyDefensive.png b/Game/Spells/AllyDefensive.png new file mode 100644 index 000000000..3f0bcc4b8 Binary files /dev/null and b/Game/Spells/AllyDefensive.png differ diff --git a/Game/Spells/AllyDeselect.png b/Game/Spells/AllyDeselect.png new file mode 100644 index 000000000..e2f1b543d Binary files /dev/null and b/Game/Spells/AllyDeselect.png differ diff --git a/Game/Spells/AllyDeselectAll.png b/Game/Spells/AllyDeselectAll.png new file mode 100644 index 000000000..648ba0549 Binary files /dev/null and b/Game/Spells/AllyDeselectAll.png differ diff --git a/Game/Spells/AllyDisperse.png b/Game/Spells/AllyDisperse.png new file mode 100644 index 000000000..9cfb4d70a Binary files /dev/null and b/Game/Spells/AllyDisperse.png differ diff --git a/Game/Spells/AllyHold.png b/Game/Spells/AllyHold.png new file mode 100644 index 000000000..ec2c00b00 Binary files /dev/null and b/Game/Spells/AllyHold.png differ diff --git a/Game/Spells/AllyMove.png b/Game/Spells/AllyMove.png new file mode 100644 index 000000000..dc0676d1e Binary files /dev/null and b/Game/Spells/AllyMove.png differ diff --git a/Game/Spells/AllyOnMe.png b/Game/Spells/AllyOnMe.png new file mode 100644 index 000000000..06dbc245c Binary files /dev/null and b/Game/Spells/AllyOnMe.png differ diff --git a/Game/Spells/AllyToggle.png b/Game/Spells/AllyToggle.png new file mode 100644 index 000000000..82ae06bd9 Binary files /dev/null and b/Game/Spells/AllyToggle.png differ diff --git a/Game/Spells/ArcaneBarrier.png b/Game/Spells/ArcaneBarrier.png new file mode 100644 index 000000000..1c7847568 Binary files /dev/null and b/Game/Spells/ArcaneBarrier.png differ diff --git a/Game/Spells/ArcaneBlast.png b/Game/Spells/ArcaneBlast.png new file mode 100644 index 000000000..12b76b426 Binary files /dev/null and b/Game/Spells/ArcaneBlast.png differ diff --git a/Game/Spells/ArrowFireSpell.png b/Game/Spells/ArrowFireSpell.png new file mode 100644 index 000000000..07e18ebbf Binary files /dev/null and b/Game/Spells/ArrowFireSpell.png differ diff --git a/Game/Spells/ArrowVineSpell.png b/Game/Spells/ArrowVineSpell.png new file mode 100644 index 000000000..aa55e1cc9 Binary files /dev/null and b/Game/Spells/ArrowVineSpell.png differ diff --git a/Game/Spells/BanishPortal.png b/Game/Spells/BanishPortal.png new file mode 100644 index 000000000..05e9513d1 Binary files /dev/null and b/Game/Spells/BanishPortal.png differ diff --git a/Game/Spells/BattleRhythm.png b/Game/Spells/BattleRhythm.png new file mode 100644 index 000000000..71b8307bd Binary files /dev/null and b/Game/Spells/BattleRhythm.png differ diff --git a/Game/Spells/BattleTrance.png b/Game/Spells/BattleTrance.png new file mode 100644 index 000000000..fa5b36c74 Binary files /dev/null and b/Game/Spells/BattleTrance.png differ diff --git a/Game/Spells/BladeDance.png b/Game/Spells/BladeDance.png new file mode 100644 index 000000000..32c56e741 Binary files /dev/null and b/Game/Spells/BladeDance.png differ diff --git a/Game/Spells/Blink.png b/Game/Spells/Blink.png index 073420707..ebba73185 100644 Binary files a/Game/Spells/Blink.png and b/Game/Spells/Blink.png differ diff --git a/Game/Spells/Bondage.png b/Game/Spells/Bondage.png new file mode 100644 index 000000000..e4a2f763e Binary files /dev/null and b/Game/Spells/Bondage.png differ diff --git a/Game/Spells/BreakFree.png b/Game/Spells/BreakFree.png new file mode 100644 index 000000000..1ce96b20d Binary files /dev/null and b/Game/Spells/BreakFree.png differ diff --git a/Game/Spells/CanUpcast.png b/Game/Spells/CanUpcast.png index 1f77ce89c..edef7dd34 100644 Binary files a/Game/Spells/CanUpcast.png and b/Game/Spells/CanUpcast.png differ diff --git a/Game/Spells/ChainStrike.png b/Game/Spells/ChainStrike.png new file mode 100644 index 000000000..2fb3242bf Binary files /dev/null and b/Game/Spells/ChainStrike.png differ diff --git a/Game/Spells/ChaoticOverflow.png b/Game/Spells/ChaoticOverflow.png new file mode 100644 index 000000000..578cb529e Binary files /dev/null and b/Game/Spells/ChaoticOverflow.png differ diff --git a/Game/Spells/Charge.png b/Game/Spells/Charge.png new file mode 100644 index 000000000..e3daef381 Binary files /dev/null and b/Game/Spells/Charge.png differ diff --git a/Game/Spells/ColdFeet.png b/Game/Spells/ColdFeet.png new file mode 100644 index 000000000..c69d37743 Binary files /dev/null and b/Game/Spells/ColdFeet.png differ diff --git a/Game/Spells/CommandWordGreater.png b/Game/Spells/CommandWordGreater.png new file mode 100644 index 000000000..250d4317b Binary files /dev/null and b/Game/Spells/CommandWordGreater.png differ diff --git a/Game/Spells/DesperateStruggle.png b/Game/Spells/DesperateStruggle.png new file mode 100644 index 000000000..e304b794b Binary files /dev/null and b/Game/Spells/DesperateStruggle.png differ diff --git a/Game/Spells/DistractionBurst.png b/Game/Spells/DistractionBurst.png new file mode 100644 index 000000000..ab7f5da5c Binary files /dev/null and b/Game/Spells/DistractionBurst.png differ diff --git a/Game/Spells/DistractionCast.png b/Game/Spells/DistractionCast.png new file mode 100644 index 000000000..94329bc5b Binary files /dev/null and b/Game/Spells/DistractionCast.png differ diff --git a/Game/Spells/DistractionShield.png b/Game/Spells/DistractionShield.png new file mode 100644 index 000000000..1e3b4f4ad Binary files /dev/null and b/Game/Spells/DistractionShield.png differ diff --git a/Game/Spells/EarthformArc.png b/Game/Spells/EarthformArc.png new file mode 100644 index 000000000..d5e63dde8 Binary files /dev/null and b/Game/Spells/EarthformArc.png differ diff --git a/Game/Spells/EnchantRope.png b/Game/Spells/EnchantRope.png new file mode 100644 index 000000000..150321f27 Binary files /dev/null and b/Game/Spells/EnchantRope.png differ diff --git a/Game/Spells/Engulf.png b/Game/Spells/Engulf.png index 3c1a38bc2..8b86cc425 100644 Binary files a/Game/Spells/Engulf.png and b/Game/Spells/Engulf.png differ diff --git a/Game/Spells/Enrage.png b/Game/Spells/Enrage.png new file mode 100644 index 000000000..d0005a2b6 Binary files /dev/null and b/Game/Spells/Enrage.png differ diff --git a/Game/Spells/EvasiveManeuvers.png b/Game/Spells/EvasiveManeuvers.png new file mode 100644 index 000000000..a136f0632 Binary files /dev/null and b/Game/Spells/EvasiveManeuvers.png differ diff --git a/Game/Spells/Fireball.png b/Game/Spells/Fireball.png index 2b2c84901..3e711938f 100644 Binary files a/Game/Spells/Fireball.png and b/Game/Spells/Fireball.png differ diff --git a/Game/Spells/Fireblast.png b/Game/Spells/Fireblast.png new file mode 100644 index 000000000..6cd074d85 Binary files /dev/null and b/Game/Spells/Fireblast.png differ diff --git a/Game/Spells/Firebolt.png b/Game/Spells/Firebolt.png index cd514a005..6b15f9c5d 100644 Binary files a/Game/Spells/Firebolt.png and b/Game/Spells/Firebolt.png differ diff --git a/Game/Spells/FirstWind.png b/Game/Spells/FirstWind.png new file mode 100644 index 000000000..f171b10c1 Binary files /dev/null and b/Game/Spells/FirstWind.png differ diff --git a/Game/Spells/FirstWindHigher.png b/Game/Spells/FirstWindHigher.png new file mode 100644 index 000000000..0d7e2a6e8 Binary files /dev/null and b/Game/Spells/FirstWindHigher.png differ diff --git a/Game/Spells/FlameRune.png b/Game/Spells/FlameRune.png index b922c45e9..8c5147e2f 100644 Binary files a/Game/Spells/FlameRune.png and b/Game/Spells/FlameRune.png differ diff --git a/Game/Spells/FlashBomb.png b/Game/Spells/FlashBomb.png new file mode 100644 index 000000000..f0480e434 Binary files /dev/null and b/Game/Spells/FlashBomb.png differ diff --git a/Game/Spells/FlashFreeze.png b/Game/Spells/FlashFreeze.png index c27a56dab..3a54cbc9b 100644 Binary files a/Game/Spells/FlashFreeze.png and b/Game/Spells/FlashFreeze.png differ diff --git a/Game/Spells/FreezeRune.png b/Game/Spells/FreezeRune.png index 29e5ab035..c8fdfaebf 100644 Binary files a/Game/Spells/FreezeRune.png and b/Game/Spells/FreezeRune.png differ diff --git a/Game/Spells/GreaterInvisibility.png b/Game/Spells/GreaterInvisibility.png new file mode 100644 index 000000000..3a3aef4a6 Binary files /dev/null and b/Game/Spells/GreaterInvisibility.png differ diff --git a/Game/Spells/HolyOrb.png b/Game/Spells/HolyOrb.png new file mode 100644 index 000000000..b2be27bb6 Binary files /dev/null and b/Game/Spells/HolyOrb.png differ diff --git a/Game/Spells/Invisibility.png b/Game/Spells/Invisibility.png index 14f0b397c..5bba9cf27 100644 Binary files a/Game/Spells/Invisibility.png and b/Game/Spells/Invisibility.png differ diff --git a/Game/Spells/KineticLance.png b/Game/Spells/KineticLance.png new file mode 100644 index 000000000..72fdc63a8 Binary files /dev/null and b/Game/Spells/KineticLance.png differ diff --git a/Game/Spells/Leap2.png b/Game/Spells/Leap2.png new file mode 100644 index 000000000..b15a845fd Binary files /dev/null and b/Game/Spells/Leap2.png differ diff --git a/Game/Spells/Leap3.png b/Game/Spells/Leap3.png new file mode 100644 index 000000000..f9edb3444 Binary files /dev/null and b/Game/Spells/Leap3.png differ diff --git a/Game/Spells/LeashSkill.png b/Game/Spells/LeashSkill.png new file mode 100644 index 000000000..f50cadd56 Binary files /dev/null and b/Game/Spells/LeashSkill.png differ diff --git a/Game/Spells/LeatherWhip.png b/Game/Spells/LeatherWhip.png new file mode 100644 index 000000000..6a0550a89 Binary files /dev/null and b/Game/Spells/LeatherWhip.png differ diff --git a/Game/Spells/LimitSurge.png b/Game/Spells/LimitSurge.png new file mode 100644 index 000000000..b9b13445a Binary files /dev/null and b/Game/Spells/LimitSurge.png differ diff --git a/Game/Spells/LiquidMetal.png b/Game/Spells/LiquidMetal.png new file mode 100644 index 000000000..82e41c09c Binary files /dev/null and b/Game/Spells/LiquidMetal.png differ diff --git a/Game/Spells/LiquidMetalBurst.png b/Game/Spells/LiquidMetalBurst.png new file mode 100644 index 000000000..a774c40a0 Binary files /dev/null and b/Game/Spells/LiquidMetalBurst.png differ diff --git a/Game/Spells/MakeEssenceMote.png b/Game/Spells/MakeEssenceMote.png new file mode 100644 index 000000000..8c0adc567 Binary files /dev/null and b/Game/Spells/MakeEssenceMote.png differ diff --git a/Game/Spells/ManaRecharge.png b/Game/Spells/ManaRecharge.png new file mode 100644 index 000000000..08c8b02b0 Binary files /dev/null and b/Game/Spells/ManaRecharge.png differ diff --git a/Game/Spells/NatureSpirit.png b/Game/Spells/NatureSpirit.png new file mode 100644 index 000000000..2013080c6 Binary files /dev/null and b/Game/Spells/NatureSpirit.png differ diff --git a/Game/Spells/NegateRune.png b/Game/Spells/NegateRune.png new file mode 100644 index 000000000..5d287c26c Binary files /dev/null and b/Game/Spells/NegateRune.png differ diff --git a/Game/Spells/Offhand.png b/Game/Spells/Offhand.png new file mode 100644 index 000000000..df0898ca5 Binary files /dev/null and b/Game/Spells/Offhand.png differ diff --git a/Game/Spells/OrgasmResist.png b/Game/Spells/OrgasmResist.png new file mode 100644 index 000000000..d735e64b5 Binary files /dev/null and b/Game/Spells/OrgasmResist.png differ diff --git a/Game/Spells/ProblemSolving.png b/Game/Spells/ProblemSolving.png new file mode 100644 index 000000000..2f003bdbf Binary files /dev/null and b/Game/Spells/ProblemSolving.png differ diff --git a/Game/Spells/PsychicLink.png b/Game/Spells/PsychicLink.png new file mode 100644 index 000000000..43af22c57 Binary files /dev/null and b/Game/Spells/PsychicLink.png differ diff --git a/Game/Spells/Quickness.png b/Game/Spells/Quickness.png new file mode 100644 index 000000000..2fa297a88 Binary files /dev/null and b/Game/Spells/Quickness.png differ diff --git a/Game/Spells/Quickness2.png b/Game/Spells/Quickness2.png new file mode 100644 index 000000000..e7d80f67f Binary files /dev/null and b/Game/Spells/Quickness2.png differ diff --git a/Game/Spells/Quickness3.png b/Game/Spells/Quickness3.png new file mode 100644 index 000000000..eee4f7d18 Binary files /dev/null and b/Game/Spells/Quickness3.png differ diff --git a/Game/Spells/Quickness4.png b/Game/Spells/Quickness4.png new file mode 100644 index 000000000..778435694 Binary files /dev/null and b/Game/Spells/Quickness4.png differ diff --git a/Game/Spells/Quickness5.png b/Game/Spells/Quickness5.png new file mode 100644 index 000000000..60886a8df Binary files /dev/null and b/Game/Spells/Quickness5.png differ diff --git a/Game/Spells/RaiseDefenses.png b/Game/Spells/RaiseDefenses.png new file mode 100644 index 000000000..d4c03d9d6 Binary files /dev/null and b/Game/Spells/RaiseDefenses.png differ diff --git a/Game/Spells/RecoverObject.png b/Game/Spells/RecoverObject.png new file mode 100644 index 000000000..c61275c45 Binary files /dev/null and b/Game/Spells/RecoverObject.png differ diff --git a/Game/Spells/RecoverObject2.png b/Game/Spells/RecoverObject2.png new file mode 100644 index 000000000..46a485470 Binary files /dev/null and b/Game/Spells/RecoverObject2.png differ diff --git a/Game/Spells/RopeBoltLaunch.png b/Game/Spells/RopeBoltLaunch.png index f5cbd2476..34ef07b8d 100644 Binary files a/Game/Spells/RopeBoltLaunch.png and b/Game/Spells/RopeBoltLaunch.png differ diff --git a/Game/Spells/RopeBoltLaunchMany.png b/Game/Spells/RopeBoltLaunchMany.png new file mode 100644 index 000000000..76652dae6 Binary files /dev/null and b/Game/Spells/RopeBoltLaunchMany.png differ diff --git a/Game/Spells/Ropework.png b/Game/Spells/Ropework.png new file mode 100644 index 000000000..ed40a0b57 Binary files /dev/null and b/Game/Spells/Ropework.png differ diff --git a/Game/Spells/Sagitta.png b/Game/Spells/Sagitta.png new file mode 100644 index 000000000..9c9a21e02 Binary files /dev/null and b/Game/Spells/Sagitta.png differ diff --git a/Game/Spells/ShadowDance.png b/Game/Spells/ShadowDance.png new file mode 100644 index 000000000..910f90ba6 Binary files /dev/null and b/Game/Spells/ShadowDance.png differ diff --git a/Game/Spells/ShockCollar.png b/Game/Spells/ShockCollar.png new file mode 100644 index 000000000..5204b077b Binary files /dev/null and b/Game/Spells/ShockCollar.png differ diff --git a/Game/Spells/Sleet.png b/Game/Spells/Sleet.png index 22e61f146..d0245c932 100644 Binary files a/Game/Spells/Sleet.png and b/Game/Spells/Sleet.png differ diff --git a/Game/Spells/Snare.png b/Game/Spells/Snare.png index 86381e111..2fa10c393 100644 Binary files a/Game/Spells/Snare.png and b/Game/Spells/Snare.png differ diff --git a/Game/Spells/Sonar.png b/Game/Spells/Sonar.png new file mode 100644 index 000000000..903f44629 Binary files /dev/null and b/Game/Spells/Sonar.png differ diff --git a/Game/Spells/Sowing.png b/Game/Spells/Sowing.png new file mode 100644 index 000000000..84d26d700 Binary files /dev/null and b/Game/Spells/Sowing.png differ diff --git a/Game/Spells/Strength.png b/Game/Spells/Strength.png index 88b190ba8..9489bc683 100644 Binary files a/Game/Spells/Strength.png and b/Game/Spells/Strength.png differ diff --git a/Game/Spells/SummonAMGag.png b/Game/Spells/SummonAMGag.png new file mode 100644 index 000000000..ae42d8159 Binary files /dev/null and b/Game/Spells/SummonAMGag.png differ diff --git a/Game/Spells/SummonLatexArmbinder.png b/Game/Spells/SummonLatexArmbinder.png new file mode 100644 index 000000000..c22ecb9d7 Binary files /dev/null and b/Game/Spells/SummonLatexArmbinder.png differ diff --git a/Game/Spells/SummonLatexGag.png b/Game/Spells/SummonLatexGag.png new file mode 100644 index 000000000..79ffdafd6 Binary files /dev/null and b/Game/Spells/SummonLatexGag.png differ diff --git a/Game/Spells/SummonLatexLegbinder.png b/Game/Spells/SummonLatexLegbinder.png new file mode 100644 index 000000000..f6a387868 Binary files /dev/null and b/Game/Spells/SummonLatexLegbinder.png differ diff --git a/Game/Spells/Swap.png b/Game/Spells/Swap.png new file mode 100644 index 000000000..52f015f96 Binary files /dev/null and b/Game/Spells/Swap.png differ diff --git a/Game/Spells/TelekineticSlash.png b/Game/Spells/TelekineticSlash.png new file mode 100644 index 000000000..8a553bba4 Binary files /dev/null and b/Game/Spells/TelekineticSlash.png differ diff --git a/Game/Spells/ToolsOfTheTrade.png b/Game/Spells/ToolsOfTheTrade.png new file mode 100644 index 000000000..dd5e26e93 Binary files /dev/null and b/Game/Spells/ToolsOfTheTrade.png differ diff --git a/Game/Spells/TransportationPortal.png b/Game/Spells/TransportationPortal.png new file mode 100644 index 000000000..d7adc189b Binary files /dev/null and b/Game/Spells/TransportationPortal.png differ diff --git a/Game/Spells/UnconventionalWarfare.png b/Game/Spells/UnconventionalWarfare.png new file mode 100644 index 000000000..ad32b9ae5 Binary files /dev/null and b/Game/Spells/UnconventionalWarfare.png differ diff --git a/Game/Spells/ZeroResistance.png b/Game/Spells/ZeroResistance.png new file mode 100644 index 000000000..370c6bc7e Binary files /dev/null and b/Game/Spells/ZeroResistance.png differ diff --git a/Game/Spells/ZoneOfFrost.png b/Game/Spells/ZoneOfFrost.png new file mode 100644 index 000000000..e3b9a9057 Binary files /dev/null and b/Game/Spells/ZoneOfFrost.png differ diff --git a/Game/TargetAction.png b/Game/TargetAction.png new file mode 100644 index 000000000..006251460 Binary files /dev/null and b/Game/TargetAction.png differ diff --git a/Game/TargetAttack.png b/Game/TargetAttack.png new file mode 100644 index 000000000..6886b5b57 Binary files /dev/null and b/Game/TargetAttack.png differ diff --git a/Game/TargetMove.png b/Game/TargetMove.png index 43d120190..caf1543ed 100644 Binary files a/Game/TargetMove.png and b/Game/TargetMove.png differ diff --git a/Game/TargetPass.png b/Game/TargetPass.png new file mode 100644 index 000000000..2a6d0d3e3 Binary files /dev/null and b/Game/TargetPass.png differ diff --git a/Game/TargetSpell.png b/Game/TargetSpell.png index ef8378c8f..824f1c6e6 100644 Binary files a/Game/TargetSpell.png and b/Game/TargetSpell.png differ diff --git a/Game/TargetSub.png b/Game/TargetSub.png new file mode 100644 index 000000000..9544184b3 Binary files /dev/null and b/Game/TargetSub.png differ diff --git a/Game/TargetTalk.png b/Game/TargetTalk.png new file mode 100644 index 000000000..6528ed6b7 Binary files /dev/null and b/Game/TargetTalk.png differ diff --git a/Game/UI/Aim.png b/Game/UI/Aim.png new file mode 100644 index 000000000..9f7c1363d Binary files /dev/null and b/Game/UI/Aim.png differ diff --git a/Game/UI/AutoBindCopy.png b/Game/UI/AutoBindCopy.png new file mode 100644 index 000000000..6a94559a8 Binary files /dev/null and b/Game/UI/AutoBindCopy.png differ diff --git a/Game/UI/AutoBindPaste.png b/Game/UI/AutoBindPaste.png new file mode 100644 index 000000000..3739e49fd Binary files /dev/null and b/Game/UI/AutoBindPaste.png differ diff --git a/Game/UI/AutoBindPasteAll.png b/Game/UI/AutoBindPasteAll.png new file mode 100644 index 000000000..9c00969d4 Binary files /dev/null and b/Game/UI/AutoBindPasteAll.png differ diff --git a/Game/UI/AutoBindPasteAllOver.png b/Game/UI/AutoBindPasteAllOver.png new file mode 100644 index 000000000..b821019fb Binary files /dev/null and b/Game/UI/AutoBindPasteAllOver.png differ diff --git a/Game/UI/AutoPass/Allies.png b/Game/UI/AutoPass/Allies.png new file mode 100644 index 000000000..ad9d9cfa8 Binary files /dev/null and b/Game/UI/AutoPass/Allies.png differ diff --git a/Game/UI/AutoPass/HelplessAllies.png b/Game/UI/AutoPass/HelplessAllies.png new file mode 100644 index 000000000..1a5ffb4b1 Binary files /dev/null and b/Game/UI/AutoPass/HelplessAllies.png differ diff --git a/Game/UI/AutoPass/HelplessEnemies.png b/Game/UI/AutoPass/HelplessEnemies.png new file mode 100644 index 000000000..eb9261a1b Binary files /dev/null and b/Game/UI/AutoPass/HelplessEnemies.png differ diff --git a/Game/UI/AutoPass/Neutral.png b/Game/UI/AutoPass/Neutral.png new file mode 100644 index 000000000..1ca66c64d Binary files /dev/null and b/Game/UI/AutoPass/Neutral.png differ diff --git a/Game/UI/AutoPass/Shop.png b/Game/UI/AutoPass/Shop.png new file mode 100644 index 000000000..9100732ca Binary files /dev/null and b/Game/UI/AutoPass/Shop.png differ diff --git a/Game/UI/AutoPass/Special.png b/Game/UI/AutoPass/Special.png new file mode 100644 index 000000000..30bb98d88 Binary files /dev/null and b/Game/UI/AutoPass/Special.png differ diff --git a/Game/UI/AutoPass/Summons.png b/Game/UI/AutoPass/Summons.png new file mode 100644 index 000000000..0d581fe7c Binary files /dev/null and b/Game/UI/AutoPass/Summons.png differ diff --git a/Game/UI/AutoPath/StepDuringCombat.png b/Game/UI/AutoPath/StepDuringCombat.png new file mode 100644 index 000000000..0cf8b96ca Binary files /dev/null and b/Game/UI/AutoPath/StepDuringCombat.png differ diff --git a/Game/UI/AutoPath/SuppressBeforeCombat.png b/Game/UI/AutoPath/SuppressBeforeCombat.png new file mode 100644 index 000000000..3a5cbee81 Binary files /dev/null and b/Game/UI/AutoPath/SuppressBeforeCombat.png differ diff --git a/Game/UI/AutoPath/SuppressDuringCombat.png b/Game/UI/AutoPath/SuppressDuringCombat.png new file mode 100644 index 000000000..c451baa02 Binary files /dev/null and b/Game/UI/AutoPath/SuppressDuringCombat.png differ diff --git a/Game/UI/AutoWait/Fast.png b/Game/UI/AutoWait/Fast.png new file mode 100644 index 000000000..0e2127b98 Binary files /dev/null and b/Game/UI/AutoWait/Fast.png differ diff --git a/Game/UI/AutoWait/Normal.png b/Game/UI/AutoWait/Normal.png new file mode 100644 index 000000000..874c39310 Binary files /dev/null and b/Game/UI/AutoWait/Normal.png differ diff --git a/Game/UI/AutoWait/Slow.png b/Game/UI/AutoWait/Slow.png new file mode 100644 index 000000000..b06ff71b4 Binary files /dev/null and b/Game/UI/AutoWait/Slow.png differ diff --git a/Game/UI/AutoWait/VeryFast.png b/Game/UI/AutoWait/VeryFast.png new file mode 100644 index 000000000..e15fd8707 Binary files /dev/null and b/Game/UI/AutoWait/VeryFast.png differ diff --git a/Game/UI/BulletTransparency.png b/Game/UI/BulletTransparency.png new file mode 100644 index 000000000..263825304 Binary files /dev/null and b/Game/UI/BulletTransparency.png differ diff --git a/Game/UI/Buttons/Mark.png b/Game/UI/Buttons/Mark.png new file mode 100644 index 000000000..8019936e1 Binary files /dev/null and b/Game/UI/Buttons/Mark.png differ diff --git a/Game/UI/Buttons/MarkAll.png b/Game/UI/Buttons/MarkAll.png new file mode 100644 index 000000000..9331255ba Binary files /dev/null and b/Game/UI/Buttons/MarkAll.png differ diff --git a/Game/UI/Buttons/Ransom.png b/Game/UI/Buttons/Ransom.png new file mode 100644 index 000000000..7a193f80b Binary files /dev/null and b/Game/UI/Buttons/Ransom.png differ diff --git a/Game/UI/Buttons/Release.png b/Game/UI/Buttons/Release.png new file mode 100644 index 000000000..d44fcc8ec Binary files /dev/null and b/Game/UI/Buttons/Release.png differ diff --git a/Game/UI/Buttons/RemoveGuest.png b/Game/UI/Buttons/RemoveGuest.png new file mode 100644 index 000000000..754c9b7bd Binary files /dev/null and b/Game/UI/Buttons/RemoveGuest.png differ diff --git a/Game/UI/Buttons/RemoveGuestConfirm.png b/Game/UI/Buttons/RemoveGuestConfirm.png new file mode 100644 index 000000000..ee0b288ed Binary files /dev/null and b/Game/UI/Buttons/RemoveGuestConfirm.png differ diff --git a/Game/UI/Buttons/Summon.png b/Game/UI/Buttons/Summon.png new file mode 100644 index 000000000..e630ea259 Binary files /dev/null and b/Game/UI/Buttons/Summon.png differ diff --git a/Game/UI/Buttons/Unmark.png b/Game/UI/Buttons/Unmark.png new file mode 100644 index 000000000..a5cb8c07f Binary files /dev/null and b/Game/UI/Buttons/Unmark.png differ diff --git a/Game/UI/Buttons/UnmarkAll.png b/Game/UI/Buttons/UnmarkAll.png new file mode 100644 index 000000000..9f77e2885 Binary files /dev/null and b/Game/UI/Buttons/UnmarkAll.png differ diff --git a/Game/UI/CollectionFilter/Available.png b/Game/UI/CollectionFilter/Available.png new file mode 100644 index 000000000..57e78d255 Binary files /dev/null and b/Game/UI/CollectionFilter/Available.png differ diff --git a/Game/UI/CollectionFilter/Bound.png b/Game/UI/CollectionFilter/Bound.png new file mode 100644 index 000000000..7759cf7f9 Binary files /dev/null and b/Game/UI/CollectionFilter/Bound.png differ diff --git a/Game/UI/CollectionFilter/EscapeRisk.png b/Game/UI/CollectionFilter/EscapeRisk.png new file mode 100644 index 000000000..d60204c6b Binary files /dev/null and b/Game/UI/CollectionFilter/EscapeRisk.png differ diff --git a/Game/UI/CollectionFilter/Escaped.png b/Game/UI/CollectionFilter/Escaped.png new file mode 100644 index 000000000..9ada26dc3 Binary files /dev/null and b/Game/UI/CollectionFilter/Escaped.png differ diff --git a/Game/UI/CollectionFilter/Free.png b/Game/UI/CollectionFilter/Free.png new file mode 100644 index 000000000..fa3288637 Binary files /dev/null and b/Game/UI/CollectionFilter/Free.png differ diff --git a/Game/UI/CollectionFilter/Imprisoned.png b/Game/UI/CollectionFilter/Imprisoned.png new file mode 100644 index 000000000..a1eb1b538 Binary files /dev/null and b/Game/UI/CollectionFilter/Imprisoned.png differ diff --git a/Game/UI/CollectionFilter/Negative.png b/Game/UI/CollectionFilter/Negative.png new file mode 100644 index 000000000..4691d5d35 Binary files /dev/null and b/Game/UI/CollectionFilter/Negative.png differ diff --git a/Game/UI/CollectionFilter/Positive.png b/Game/UI/CollectionFilter/Positive.png new file mode 100644 index 000000000..6feda3153 Binary files /dev/null and b/Game/UI/CollectionFilter/Positive.png differ diff --git a/Game/UI/CollectionFilter/Rank0.png b/Game/UI/CollectionFilter/Rank0.png new file mode 100644 index 000000000..a8a623ab7 Binary files /dev/null and b/Game/UI/CollectionFilter/Rank0.png differ diff --git a/Game/UI/CollectionFilter/Rank1.png b/Game/UI/CollectionFilter/Rank1.png new file mode 100644 index 000000000..c2e4cd575 Binary files /dev/null and b/Game/UI/CollectionFilter/Rank1.png differ diff --git a/Game/UI/CollectionFilter/Rank2.png b/Game/UI/CollectionFilter/Rank2.png new file mode 100644 index 000000000..15ed997cf Binary files /dev/null and b/Game/UI/CollectionFilter/Rank2.png differ diff --git a/Game/UI/CollectionFilter/Rank3.png b/Game/UI/CollectionFilter/Rank3.png new file mode 100644 index 000000000..981892561 Binary files /dev/null and b/Game/UI/CollectionFilter/Rank3.png differ diff --git a/Game/UI/CollectionFilter/Rank4.png b/Game/UI/CollectionFilter/Rank4.png new file mode 100644 index 000000000..3a7c1e035 Binary files /dev/null and b/Game/UI/CollectionFilter/Rank4.png differ diff --git a/Game/UI/CollectionFilter/Rank5.png b/Game/UI/CollectionFilter/Rank5.png new file mode 100644 index 000000000..cae921814 Binary files /dev/null and b/Game/UI/CollectionFilter/Rank5.png differ diff --git a/Game/UI/CollectionFilter/Safe.png b/Game/UI/CollectionFilter/Safe.png new file mode 100644 index 000000000..285df11af Binary files /dev/null and b/Game/UI/CollectionFilter/Safe.png differ diff --git a/Game/UI/CollectionFilter/Unavailable.png b/Game/UI/CollectionFilter/Unavailable.png new file mode 100644 index 000000000..5058ae9f0 Binary files /dev/null and b/Game/UI/CollectionFilter/Unavailable.png differ diff --git a/Game/UI/CollectionTab/AutoBind.png b/Game/UI/CollectionTab/AutoBind.png new file mode 100644 index 000000000..ddb213d80 Binary files /dev/null and b/Game/UI/CollectionTab/AutoBind.png differ diff --git a/Game/UI/CollectionTab/FacilityQuick.png b/Game/UI/CollectionTab/FacilityQuick.png new file mode 100644 index 000000000..a0eb17c65 Binary files /dev/null and b/Game/UI/CollectionTab/FacilityQuick.png differ diff --git a/Game/UI/CollectionTab/Release.png b/Game/UI/CollectionTab/Release.png new file mode 100644 index 000000000..8dde896ec Binary files /dev/null and b/Game/UI/CollectionTab/Release.png differ diff --git a/Game/UI/Conjured.png b/Game/UI/Conjured.png new file mode 100644 index 000000000..1b44265e9 Binary files /dev/null and b/Game/UI/Conjured.png differ diff --git a/Game/UI/Crosshair.png b/Game/UI/Crosshair.png new file mode 100644 index 000000000..404dddbb8 Binary files /dev/null and b/Game/UI/Crosshair.png differ diff --git a/Game/UI/Crossout.png b/Game/UI/Crossout.png new file mode 100644 index 000000000..64e90b1a3 Binary files /dev/null and b/Game/UI/Crossout.png differ diff --git a/Game/UI/CrouchOff.png b/Game/UI/CrouchOff.png new file mode 100644 index 000000000..0a95ddcc7 Binary files /dev/null and b/Game/UI/CrouchOff.png differ diff --git a/Game/UI/CrouchOn.png b/Game/UI/CrouchOn.png new file mode 100644 index 000000000..3c3d35b59 Binary files /dev/null and b/Game/UI/CrouchOn.png differ diff --git a/Game/UI/Cycle.png b/Game/UI/Cycle.png new file mode 100644 index 000000000..e303ec827 Binary files /dev/null and b/Game/UI/Cycle.png differ diff --git a/Game/UI/Demote.png b/Game/UI/Demote.png new file mode 100644 index 000000000..42464572a Binary files /dev/null and b/Game/UI/Demote.png differ diff --git a/Game/UI/Disperse.png b/Game/UI/Disperse.png new file mode 100644 index 000000000..7c14aa207 Binary files /dev/null and b/Game/UI/Disperse.png differ diff --git a/Game/UI/Dress.png b/Game/UI/Dress.png new file mode 100644 index 000000000..e6a4c2113 Binary files /dev/null and b/Game/UI/Dress.png differ diff --git a/Game/UI/Expand.png b/Game/UI/Expand.png new file mode 100644 index 000000000..8897d3b2a Binary files /dev/null and b/Game/UI/Expand.png differ diff --git a/Game/UI/Facility/AlchemyLab.png b/Game/UI/Facility/AlchemyLab.png new file mode 100644 index 000000000..19196a6f4 Binary files /dev/null and b/Game/UI/Facility/AlchemyLab.png differ diff --git a/Game/UI/Facility/CuddleLounge.png b/Game/UI/Facility/CuddleLounge.png new file mode 100644 index 000000000..cd6421689 Binary files /dev/null and b/Game/UI/Facility/CuddleLounge.png differ diff --git a/Game/UI/Facility/Gear.png b/Game/UI/Facility/Gear.png new file mode 100644 index 000000000..3f7937382 Binary files /dev/null and b/Game/UI/Facility/Gear.png differ diff --git a/Game/UI/Facility/MaidQuarters.png b/Game/UI/Facility/MaidQuarters.png new file mode 100644 index 000000000..d7fd2d170 Binary files /dev/null and b/Game/UI/Facility/MaidQuarters.png differ diff --git a/Game/UI/Facility/Management.png b/Game/UI/Facility/Management.png new file mode 100644 index 000000000..d7fd2d170 Binary files /dev/null and b/Game/UI/Facility/Management.png differ diff --git a/Game/UI/Facility/Recycler.png b/Game/UI/Facility/Recycler.png new file mode 100644 index 000000000..fae63072e Binary files /dev/null and b/Game/UI/Facility/Recycler.png differ diff --git a/Game/UI/Facility/RescueTeam.png b/Game/UI/Facility/RescueTeam.png new file mode 100644 index 000000000..fe6414480 Binary files /dev/null and b/Game/UI/Facility/RescueTeam.png differ diff --git a/Game/UI/Facility/TrainingDojo.png b/Game/UI/Facility/TrainingDojo.png new file mode 100644 index 000000000..9ff0cf780 Binary files /dev/null and b/Game/UI/Facility/TrainingDojo.png differ diff --git a/Game/UI/Facility/Warden.png b/Game/UI/Facility/Warden.png new file mode 100644 index 000000000..f05aca6f7 Binary files /dev/null and b/Game/UI/Facility/Warden.png differ diff --git a/Game/UI/Facility_Prisoners.png b/Game/UI/Facility_Prisoners.png new file mode 100644 index 000000000..2c241eb70 Binary files /dev/null and b/Game/UI/Facility_Prisoners.png differ diff --git a/Game/UI/Facility_Servants.png b/Game/UI/Facility_Servants.png new file mode 100644 index 000000000..c4ffcff6a Binary files /dev/null and b/Game/UI/Facility_Servants.png differ diff --git a/Game/UI/Facility_X.png b/Game/UI/Facility_X.png new file mode 100644 index 000000000..f51662452 Binary files /dev/null and b/Game/UI/Facility_X.png differ diff --git a/Game/UI/Floppy.png b/Game/UI/Floppy.png new file mode 100644 index 000000000..6fa553034 Binary files /dev/null and b/Game/UI/Floppy.png differ diff --git a/Game/UI/GrabClosed.png b/Game/UI/GrabClosed.png new file mode 100644 index 000000000..0fbfead58 Binary files /dev/null and b/Game/UI/GrabClosed.png differ diff --git a/Game/UI/GrabOpen.png b/Game/UI/GrabOpen.png new file mode 100644 index 000000000..8e803b5dd Binary files /dev/null and b/Game/UI/GrabOpen.png differ diff --git a/Game/UI/HighValueTarget.png b/Game/UI/HighValueTarget.png new file mode 100644 index 000000000..c7b37af69 Binary files /dev/null and b/Game/UI/HighValueTarget.png differ diff --git a/Game/UI/Imprison.png b/Game/UI/Imprison.png new file mode 100644 index 000000000..8b3eda1c9 Binary files /dev/null and b/Game/UI/Imprison.png differ diff --git a/Game/UI/Interact.png b/Game/UI/Interact.png new file mode 100644 index 000000000..ce229902a Binary files /dev/null and b/Game/UI/Interact.png differ diff --git a/Game/UI/ItemAura.png b/Game/UI/ItemAura.png new file mode 100644 index 000000000..60046ec5e Binary files /dev/null and b/Game/UI/ItemAura.png differ diff --git a/Game/UI/ItemAuraBG.png b/Game/UI/ItemAuraBG.png new file mode 100644 index 000000000..3cbaad6b4 Binary files /dev/null and b/Game/UI/ItemAuraBG.png differ diff --git a/Game/UI/Labels.png b/Game/UI/Labels.png new file mode 100644 index 000000000..325aa4510 Binary files /dev/null and b/Game/UI/Labels.png differ diff --git a/Game/UI/LabelsChest.png b/Game/UI/LabelsChest.png new file mode 100644 index 000000000..afedafeeb Binary files /dev/null and b/Game/UI/LabelsChest.png differ diff --git a/Game/UI/LabelsOther.png b/Game/UI/LabelsOther.png new file mode 100644 index 000000000..adb0a0028 Binary files /dev/null and b/Game/UI/LabelsOther.png differ diff --git a/Game/UI/LabelsShrine.png b/Game/UI/LabelsShrine.png new file mode 100644 index 000000000..ad1706926 Binary files /dev/null and b/Game/UI/LabelsShrine.png differ diff --git a/Game/UI/Load.png b/Game/UI/Load.png new file mode 100644 index 000000000..515aa93e1 Binary files /dev/null and b/Game/UI/Load.png differ diff --git a/Game/UI/Log/Action.png b/Game/UI/Log/Action.png new file mode 100644 index 000000000..df934d948 Binary files /dev/null and b/Game/UI/Log/Action.png differ diff --git a/Game/UI/Log/Ambient.png b/Game/UI/Log/Ambient.png new file mode 100644 index 000000000..2bc6c0f37 Binary files /dev/null and b/Game/UI/Log/Ambient.png differ diff --git a/Game/UI/Log/Combat.png b/Game/UI/Log/Combat.png new file mode 100644 index 000000000..f185b0a45 Binary files /dev/null and b/Game/UI/Log/Combat.png differ diff --git a/Game/UI/Log/Dialogue.png b/Game/UI/Log/Dialogue.png new file mode 100644 index 000000000..f3396069e Binary files /dev/null and b/Game/UI/Log/Dialogue.png differ diff --git a/Game/UI/Log/Items.png b/Game/UI/Log/Items.png new file mode 100644 index 000000000..3c67be769 Binary files /dev/null and b/Game/UI/Log/Items.png differ diff --git a/Game/UI/Log/Kills.png b/Game/UI/Log/Kills.png new file mode 100644 index 000000000..c07515ba6 Binary files /dev/null and b/Game/UI/Log/Kills.png differ diff --git a/Game/UI/Log/Self.png b/Game/UI/Log/Self.png new file mode 100644 index 000000000..d4b730e57 Binary files /dev/null and b/Game/UI/Log/Self.png differ diff --git a/Game/UI/Log/Struggle.png b/Game/UI/Log/Struggle.png new file mode 100644 index 000000000..de034450e Binary files /dev/null and b/Game/UI/Log/Struggle.png differ diff --git a/Game/UI/LogDown.png b/Game/UI/LogDown.png new file mode 100644 index 000000000..c0274176d Binary files /dev/null and b/Game/UI/LogDown.png differ diff --git a/Game/UI/LogUp.png b/Game/UI/LogUp.png new file mode 100644 index 000000000..5c8d77367 Binary files /dev/null and b/Game/UI/LogUp.png differ diff --git a/Game/UI/MapMod/Bandit.png b/Game/UI/MapMod/Bandit.png new file mode 100644 index 000000000..8009f778b Binary files /dev/null and b/Game/UI/MapMod/Bandit.png differ diff --git a/Game/UI/MapMod/Dragon.png b/Game/UI/MapMod/Dragon.png new file mode 100644 index 000000000..66bcd2c79 Binary files /dev/null and b/Game/UI/MapMod/Dragon.png differ diff --git a/Game/UI/MapMod/Mold.png b/Game/UI/MapMod/Mold.png new file mode 100644 index 000000000..ef69da95e Binary files /dev/null and b/Game/UI/MapMod/Mold.png differ diff --git a/Game/UI/MapMod/None.png b/Game/UI/MapMod/None.png new file mode 100644 index 000000000..59bcb076f Binary files /dev/null and b/Game/UI/MapMod/None.png differ diff --git a/Game/UI/MapMod/Plant.png b/Game/UI/MapMod/Plant.png new file mode 100644 index 000000000..fe2e777c1 Binary files /dev/null and b/Game/UI/MapMod/Plant.png differ diff --git a/Game/UI/MapMod/Robot.png b/Game/UI/MapMod/Robot.png new file mode 100644 index 000000000..e9a978ea1 Binary files /dev/null and b/Game/UI/MapMod/Robot.png differ diff --git a/Game/UI/MapMod/Slime.png b/Game/UI/MapMod/Slime.png new file mode 100644 index 000000000..52c0108c6 Binary files /dev/null and b/Game/UI/MapMod/Slime.png differ diff --git a/Game/UI/MapMod/Witch.png b/Game/UI/MapMod/Witch.png new file mode 100644 index 000000000..45997d85a Binary files /dev/null and b/Game/UI/MapMod/Witch.png differ diff --git a/Game/UI/MapMod/Wolf.png b/Game/UI/MapMod/Wolf.png new file mode 100644 index 000000000..808411930 Binary files /dev/null and b/Game/UI/MapMod/Wolf.png differ diff --git a/Game/UI/MiniMap/Bars.png b/Game/UI/MiniMap/Bars.png new file mode 100644 index 000000000..cc40f1838 Binary files /dev/null and b/Game/UI/MiniMap/Bars.png differ diff --git a/Game/UI/MiniMap/Bed.png b/Game/UI/MiniMap/Bed.png new file mode 100644 index 000000000..970c0a2ba Binary files /dev/null and b/Game/UI/MiniMap/Bed.png differ diff --git a/Game/UI/MiniMap/ChargerCrystal.png b/Game/UI/MiniMap/ChargerCrystal.png new file mode 100644 index 000000000..78917b8bf Binary files /dev/null and b/Game/UI/MiniMap/ChargerCrystal.png differ diff --git a/Game/UI/MiniMap/ChargerEmpty.png b/Game/UI/MiniMap/ChargerEmpty.png new file mode 100644 index 000000000..2c6481407 Binary files /dev/null and b/Game/UI/MiniMap/ChargerEmpty.png differ diff --git a/Game/UI/MiniMap/Chest.png b/Game/UI/MiniMap/Chest.png new file mode 100644 index 000000000..e8db5e4a2 Binary files /dev/null and b/Game/UI/MiniMap/Chest.png differ diff --git a/Game/UI/MiniMap/DoorClosed.png b/Game/UI/MiniMap/DoorClosed.png new file mode 100644 index 000000000..9baf65dd7 Binary files /dev/null and b/Game/UI/MiniMap/DoorClosed.png differ diff --git a/Game/UI/MiniMap/DoorOpen.png b/Game/UI/MiniMap/DoorOpen.png new file mode 100644 index 000000000..2117fbcc5 Binary files /dev/null and b/Game/UI/MiniMap/DoorOpen.png differ diff --git a/Game/UI/MiniMap/Ghost.png b/Game/UI/MiniMap/Ghost.png new file mode 100644 index 000000000..9723d4b73 Binary files /dev/null and b/Game/UI/MiniMap/Ghost.png differ diff --git a/Game/UI/MiniMap/Grate.png b/Game/UI/MiniMap/Grate.png new file mode 100644 index 000000000..fb051c492 Binary files /dev/null and b/Game/UI/MiniMap/Grate.png differ diff --git a/Game/UI/MiniMap/Key.png b/Game/UI/MiniMap/Key.png new file mode 100644 index 000000000..c70db3976 Binary files /dev/null and b/Game/UI/MiniMap/Key.png differ diff --git a/Game/UI/MiniMap/Orb.png b/Game/UI/MiniMap/Orb.png new file mode 100644 index 000000000..b62504970 Binary files /dev/null and b/Game/UI/MiniMap/Orb.png differ diff --git a/Game/UI/MiniMap/Shrine.png b/Game/UI/MiniMap/Shrine.png new file mode 100644 index 000000000..34b225737 Binary files /dev/null and b/Game/UI/MiniMap/Shrine.png differ diff --git a/Game/UI/MiniMap/ShrineMana.png b/Game/UI/MiniMap/ShrineMana.png new file mode 100644 index 000000000..4059b42c3 Binary files /dev/null and b/Game/UI/MiniMap/ShrineMana.png differ diff --git a/Game/UI/MiniMap/ShrineManaQuest.png b/Game/UI/MiniMap/ShrineManaQuest.png new file mode 100644 index 000000000..08acef781 Binary files /dev/null and b/Game/UI/MiniMap/ShrineManaQuest.png differ diff --git a/Game/UI/MiniMap/ShrineQuest.png b/Game/UI/MiniMap/ShrineQuest.png new file mode 100644 index 000000000..cec08eb0d Binary files /dev/null and b/Game/UI/MiniMap/ShrineQuest.png differ diff --git a/Game/UI/MiniMap/Stairs.png b/Game/UI/MiniMap/Stairs.png new file mode 100644 index 000000000..9520984e2 Binary files /dev/null and b/Game/UI/MiniMap/Stairs.png differ diff --git a/Game/UI/MiniMap/StairsDown.png b/Game/UI/MiniMap/StairsDown.png new file mode 100644 index 000000000..a9868c4b4 Binary files /dev/null and b/Game/UI/MiniMap/StairsDown.png differ diff --git a/Game/UI/MiniMap/Tablet.png b/Game/UI/MiniMap/Tablet.png new file mode 100644 index 000000000..b94de3d73 Binary files /dev/null and b/Game/UI/MiniMap/Tablet.png differ diff --git a/Game/UI/Move.png b/Game/UI/Move.png new file mode 100644 index 000000000..102c6c5e1 Binary files /dev/null and b/Game/UI/Move.png differ diff --git a/Game/UI/NavMap/basic.png b/Game/UI/NavMap/basic.png new file mode 100644 index 000000000..ddf009d1c Binary files /dev/null and b/Game/UI/NavMap/basic.png differ diff --git a/Game/UI/NavMap/boss.png b/Game/UI/NavMap/boss.png new file mode 100644 index 000000000..70ddcac36 Binary files /dev/null and b/Game/UI/NavMap/boss.png differ diff --git a/Game/UI/NavMap/shop.png b/Game/UI/NavMap/shop.png new file mode 100644 index 000000000..977b5b5bb Binary files /dev/null and b/Game/UI/NavMap/shop.png differ diff --git a/Game/UI/PathDisplay.png b/Game/UI/PathDisplay.png new file mode 100644 index 000000000..07854d85c Binary files /dev/null and b/Game/UI/PathDisplay.png differ diff --git a/Game/UI/PlayerFacing.png b/Game/UI/PlayerFacing.png new file mode 100644 index 000000000..8f49a6b4d Binary files /dev/null and b/Game/UI/PlayerFacing.png differ diff --git a/Game/UI/Plus.png b/Game/UI/Plus.png new file mode 100644 index 000000000..59c8d6010 Binary files /dev/null and b/Game/UI/Plus.png differ diff --git a/Game/UI/Promote.png b/Game/UI/Promote.png new file mode 100644 index 000000000..3aecf5d62 Binary files /dev/null and b/Game/UI/Promote.png differ diff --git a/Game/UI/RallyWill.png b/Game/UI/RallyWill.png new file mode 100644 index 000000000..1ea89037a Binary files /dev/null and b/Game/UI/RallyWill.png differ diff --git a/Game/UI/Rank/Rank0.png b/Game/UI/Rank/Rank0.png new file mode 100644 index 000000000..a8a623ab7 Binary files /dev/null and b/Game/UI/Rank/Rank0.png differ diff --git a/Game/UI/Rank/Rank1.png b/Game/UI/Rank/Rank1.png new file mode 100644 index 000000000..c2e4cd575 Binary files /dev/null and b/Game/UI/Rank/Rank1.png differ diff --git a/Game/UI/Rank/Rank2.png b/Game/UI/Rank/Rank2.png new file mode 100644 index 000000000..15ed997cf Binary files /dev/null and b/Game/UI/Rank/Rank2.png differ diff --git a/Game/UI/Rank/Rank3.png b/Game/UI/Rank/Rank3.png new file mode 100644 index 000000000..a57f518c2 Binary files /dev/null and b/Game/UI/Rank/Rank3.png differ diff --git a/Game/UI/Rank/Rank4.png b/Game/UI/Rank/Rank4.png new file mode 100644 index 000000000..1bef058b1 Binary files /dev/null and b/Game/UI/Rank/Rank4.png differ diff --git a/Game/UI/Rank/Rank5.png b/Game/UI/Rank/Rank5.png new file mode 100644 index 000000000..abd914008 Binary files /dev/null and b/Game/UI/Rank/Rank5.png differ diff --git a/Game/UI/Recall.png b/Game/UI/Recall.png new file mode 100644 index 000000000..c360bee00 Binary files /dev/null and b/Game/UI/Recall.png differ diff --git a/Game/UI/Recycler/Armor.png b/Game/UI/Recycler/Armor.png new file mode 100644 index 000000000..c95f1036d Binary files /dev/null and b/Game/UI/Recycler/Armor.png differ diff --git a/Game/UI/Recycler/Chastity.png b/Game/UI/Recycler/Chastity.png new file mode 100644 index 000000000..ae9978e75 Binary files /dev/null and b/Game/UI/Recycler/Chastity.png differ diff --git a/Game/UI/Recycler/Cyber.png b/Game/UI/Recycler/Cyber.png new file mode 100644 index 000000000..6fa3879a1 Binary files /dev/null and b/Game/UI/Recycler/Cyber.png differ diff --git a/Game/UI/Recycler/Dress.png b/Game/UI/Recycler/Dress.png new file mode 100644 index 000000000..95a5903fe Binary files /dev/null and b/Game/UI/Recycler/Dress.png differ diff --git a/Game/UI/Recycler/Latex.png b/Game/UI/Recycler/Latex.png new file mode 100644 index 000000000..4e0b14a6a Binary files /dev/null and b/Game/UI/Recycler/Latex.png differ diff --git a/Game/UI/Recycler/Leather.png b/Game/UI/Recycler/Leather.png new file mode 100644 index 000000000..530af0665 Binary files /dev/null and b/Game/UI/Recycler/Leather.png differ diff --git a/Game/UI/Recycler/Leather2.png b/Game/UI/Recycler/Leather2.png new file mode 100644 index 000000000..530af0665 Binary files /dev/null and b/Game/UI/Recycler/Leather2.png differ diff --git a/Game/UI/Recycler/Metal.png b/Game/UI/Recycler/Metal.png new file mode 100644 index 000000000..cfc99f5cf Binary files /dev/null and b/Game/UI/Recycler/Metal.png differ diff --git a/Game/UI/Recycler/Metal2.png b/Game/UI/Recycler/Metal2.png new file mode 100644 index 000000000..cfc99f5cf Binary files /dev/null and b/Game/UI/Recycler/Metal2.png differ diff --git a/Game/UI/Recycler/Module.png b/Game/UI/Recycler/Module.png new file mode 100644 index 000000000..fa6b47651 Binary files /dev/null and b/Game/UI/Recycler/Module.png differ diff --git a/Game/UI/Recycler/Rope.png b/Game/UI/Recycler/Rope.png new file mode 100644 index 000000000..755d0f7a4 Binary files /dev/null and b/Game/UI/Recycler/Rope.png differ diff --git a/Game/UI/Recycler/Tape.png b/Game/UI/Recycler/Tape.png new file mode 100644 index 000000000..9f6ff1142 Binary files /dev/null and b/Game/UI/Recycler/Tape.png differ diff --git a/Game/UI/Recycler/Toys.png b/Game/UI/Recycler/Toys.png new file mode 100644 index 000000000..e7d99e544 Binary files /dev/null and b/Game/UI/Recycler/Toys.png differ diff --git a/Game/UI/Recycler/Wolf.png b/Game/UI/Recycler/Wolf.png new file mode 100644 index 000000000..1ce2dcde1 Binary files /dev/null and b/Game/UI/Recycler/Wolf.png differ diff --git a/Game/UI/Rename.png b/Game/UI/Rename.png new file mode 100644 index 000000000..8d2677cb2 Binary files /dev/null and b/Game/UI/Rename.png differ diff --git a/Game/UI/Reset.png b/Game/UI/Reset.png new file mode 100644 index 000000000..4daab6c02 Binary files /dev/null and b/Game/UI/Reset.png differ diff --git a/Game/UI/Resource/Latex.png b/Game/UI/Resource/Latex.png new file mode 100644 index 000000000..084c4c666 Binary files /dev/null and b/Game/UI/Resource/Latex.png differ diff --git a/Game/UI/Resource/Leather.png b/Game/UI/Resource/Leather.png new file mode 100644 index 000000000..e6cbb6ad5 Binary files /dev/null and b/Game/UI/Resource/Leather.png differ diff --git a/Game/UI/Resource/Metal.png b/Game/UI/Resource/Metal.png new file mode 100644 index 000000000..3143d847a Binary files /dev/null and b/Game/UI/Resource/Metal.png differ diff --git a/Game/UI/Resource/Rope.png b/Game/UI/Resource/Rope.png new file mode 100644 index 000000000..87f6ad663 Binary files /dev/null and b/Game/UI/Resource/Rope.png differ diff --git a/Game/UI/Resource/Rune.png b/Game/UI/Resource/Rune.png new file mode 100644 index 000000000..1f649b7ed Binary files /dev/null and b/Game/UI/Resource/Rune.png differ diff --git a/Game/UI/Restore.png b/Game/UI/Restore.png new file mode 100644 index 000000000..071b37916 Binary files /dev/null and b/Game/UI/Restore.png differ diff --git a/Game/UI/Restrain.png b/Game/UI/Restrain.png new file mode 100644 index 000000000..e8ba4717b Binary files /dev/null and b/Game/UI/Restrain.png differ diff --git a/Game/UI/RestrainBack.png b/Game/UI/RestrainBack.png new file mode 100644 index 000000000..7a25f5d52 Binary files /dev/null and b/Game/UI/RestrainBack.png differ diff --git a/Game/UI/RestrainFree.png b/Game/UI/RestrainFree.png new file mode 100644 index 000000000..3a1a3ebc7 Binary files /dev/null and b/Game/UI/RestrainFree.png differ diff --git a/Game/UI/Revert.png b/Game/UI/Revert.png new file mode 100644 index 000000000..fe08430ac Binary files /dev/null and b/Game/UI/Revert.png differ diff --git a/Game/UI/Safe.png b/Game/UI/Safe.png new file mode 100644 index 000000000..b331a4f9d Binary files /dev/null and b/Game/UI/Safe.png differ diff --git a/Game/UI/Select.png b/Game/UI/Select.png new file mode 100644 index 000000000..4c0175ed6 Binary files /dev/null and b/Game/UI/Select.png differ diff --git a/Game/UI/SetPalette.png b/Game/UI/SetPalette.png new file mode 100644 index 000000000..5f3ee58e7 Binary files /dev/null and b/Game/UI/SetPalette.png differ diff --git a/Game/UI/Shrink.png b/Game/UI/Shrink.png new file mode 100644 index 000000000..0409efc39 Binary files /dev/null and b/Game/UI/Shrink.png differ diff --git a/Game/UI/SideRoom/BanditFort.png b/Game/UI/SideRoom/BanditFort.png new file mode 100644 index 000000000..5a4cb28ea Binary files /dev/null and b/Game/UI/SideRoom/BanditFort.png differ diff --git a/Game/UI/SideRoom/Caldera.png b/Game/UI/SideRoom/Caldera.png new file mode 100644 index 000000000..04e4ed0fa Binary files /dev/null and b/Game/UI/SideRoom/Caldera.png differ diff --git a/Game/UI/SideRoom/DemonTransition.png b/Game/UI/SideRoom/DemonTransition.png new file mode 100644 index 000000000..55bc6b50c Binary files /dev/null and b/Game/UI/SideRoom/DemonTransition.png differ diff --git a/Game/UI/SideRoom/ElevatorEgyptian.png b/Game/UI/SideRoom/ElevatorEgyptian.png new file mode 100644 index 000000000..73d74a482 Binary files /dev/null and b/Game/UI/SideRoom/ElevatorEgyptian.png differ diff --git a/Game/UI/SideRoom/ElevatorEgyptian2.png b/Game/UI/SideRoom/ElevatorEgyptian2.png new file mode 100644 index 000000000..73d74a482 Binary files /dev/null and b/Game/UI/SideRoom/ElevatorEgyptian2.png differ diff --git a/Game/UI/SideRoom/ElevatorRoom.png b/Game/UI/SideRoom/ElevatorRoom.png new file mode 100644 index 000000000..901856049 Binary files /dev/null and b/Game/UI/SideRoom/ElevatorRoom.png differ diff --git a/Game/UI/SideRoom/GoldVault.png b/Game/UI/SideRoom/GoldVault.png new file mode 100644 index 000000000..bbca5bd02 Binary files /dev/null and b/Game/UI/SideRoom/GoldVault.png differ diff --git a/Game/UI/SideRoom/Unknown.png b/Game/UI/SideRoom/Unknown.png new file mode 100644 index 000000000..c55bb3f5d Binary files /dev/null and b/Game/UI/SideRoom/Unknown.png differ diff --git a/Game/UI/StageTarget.png b/Game/UI/StageTarget.png new file mode 100644 index 000000000..d129ba51d Binary files /dev/null and b/Game/UI/StageTarget.png differ diff --git a/Game/UI/Star.png b/Game/UI/Star.png new file mode 100644 index 000000000..a076e0366 Binary files /dev/null and b/Game/UI/Star.png differ diff --git a/Game/UI/StarOff.png b/Game/UI/StarOff.png new file mode 100644 index 000000000..c5dd1ae6c Binary files /dev/null and b/Game/UI/StarOff.png differ diff --git a/Game/UI/Status.png b/Game/UI/Status.png new file mode 100644 index 000000000..0d3617a95 Binary files /dev/null and b/Game/UI/Status.png differ diff --git a/Game/UI/Tighten.png b/Game/UI/Tighten.png new file mode 100644 index 000000000..7f8202553 Binary files /dev/null and b/Game/UI/Tighten.png differ diff --git a/Game/UI/UsePotionAncient.png b/Game/UI/UsePotionAncient.png index 2241aee21..07bad7f05 100644 Binary files a/Game/UI/UsePotionAncient.png and b/Game/UI/UsePotionAncient.png differ diff --git a/Game/UI/UsePotionAncientInject.png b/Game/UI/UsePotionAncientInject.png deleted file mode 100644 index dd3a5fb22..000000000 Binary files a/Game/UI/UsePotionAncientInject.png and /dev/null differ diff --git a/Game/UI/UsePotionFrigid.png b/Game/UI/UsePotionFrigid.png index e35361bdc..fdfe43dce 100644 Binary files a/Game/UI/UsePotionFrigid.png and b/Game/UI/UsePotionFrigid.png differ diff --git a/Game/UI/UsePotionFrigidInject.png b/Game/UI/UsePotionFrigidInject.png deleted file mode 100644 index 06fdc6785..000000000 Binary files a/Game/UI/UsePotionFrigidInject.png and /dev/null differ diff --git a/Game/UI/UsePotionMana.png b/Game/UI/UsePotionMana.png index 5898c8dfd..e7e692447 100644 Binary files a/Game/UI/UsePotionMana.png and b/Game/UI/UsePotionMana.png differ diff --git a/Game/UI/UsePotionManaInject.png b/Game/UI/UsePotionManaInject.png deleted file mode 100644 index fc2a92708..000000000 Binary files a/Game/UI/UsePotionManaInject.png and /dev/null differ diff --git a/Game/UI/UsePotionStamina.png b/Game/UI/UsePotionStamina.png index 1a462288e..c21466b57 100644 Binary files a/Game/UI/UsePotionStamina.png and b/Game/UI/UsePotionStamina.png differ diff --git a/Game/UI/UsePotionStaminaInject.png b/Game/UI/UsePotionStaminaInject.png deleted file mode 100644 index bc084db33..000000000 Binary files a/Game/UI/UsePotionStaminaInject.png and /dev/null differ diff --git a/Game/UI/UsePotionUnavailable.png b/Game/UI/UsePotionUnavailable.png index af0de728c..9b0c4e9a0 100644 Binary files a/Game/UI/UsePotionUnavailable.png and b/Game/UI/UsePotionUnavailable.png differ diff --git a/Game/UI/UsePotionWill.png b/Game/UI/UsePotionWill.png index 59360d672..c1fda2df9 100644 Binary files a/Game/UI/UsePotionWill.png and b/Game/UI/UsePotionWill.png differ diff --git a/Game/UI/UsePotionWillInject.png b/Game/UI/UsePotionWillInject.png deleted file mode 100644 index eddff0768..000000000 Binary files a/Game/UI/UsePotionWillInject.png and /dev/null differ diff --git a/Game/UI/Wrench.png b/Game/UI/Wrench.png new file mode 100644 index 000000000..72a1cdd35 Binary files /dev/null and b/Game/UI/Wrench.png differ diff --git a/Game/UI/X.png b/Game/UI/X.png new file mode 100644 index 000000000..abb6bc99b Binary files /dev/null and b/Game/UI/X.png differ diff --git a/Game/UI/XRay0.png b/Game/UI/XRay0.png new file mode 100644 index 000000000..27c7306e6 Binary files /dev/null and b/Game/UI/XRay0.png differ diff --git a/Game/UI/XRay1.png b/Game/UI/XRay1.png new file mode 100644 index 000000000..7f5bec08a Binary files /dev/null and b/Game/UI/XRay1.png differ diff --git a/Game/UI/XRay2.png b/Game/UI/XRay2.png new file mode 100644 index 000000000..39172c32d Binary files /dev/null and b/Game/UI/XRay2.png differ diff --git a/Game/UI/Xgold.png b/Game/UI/Xgold.png new file mode 100644 index 000000000..fcff08433 Binary files /dev/null and b/Game/UI/Xgold.png differ diff --git a/Game/UI/ZoomIn.png b/Game/UI/ZoomIn.png new file mode 100644 index 000000000..9330dbe20 Binary files /dev/null and b/Game/UI/ZoomIn.png differ diff --git a/Game/UI/ZoomOut.png b/Game/UI/ZoomOut.png new file mode 100644 index 000000000..7055aeac9 Binary files /dev/null and b/Game/UI/ZoomOut.png differ diff --git a/Game/UI/button_game.png b/Game/UI/button_game.png new file mode 100644 index 000000000..454cadc25 Binary files /dev/null and b/Game/UI/button_game.png differ diff --git a/Game/UI/button_menu.png b/Game/UI/button_menu.png new file mode 100644 index 000000000..c7d419e21 Binary files /dev/null and b/Game/UI/button_menu.png differ diff --git a/Game/UI/button_reputation.png b/Game/UI/button_reputation.png index c6cc45cfd..1d2cb70f4 100644 Binary files a/Game/UI/button_reputation.png and b/Game/UI/button_reputation.png differ diff --git a/Game/UI/circleborder.png b/Game/UI/circleborder.png new file mode 100644 index 000000000..2273e881d Binary files /dev/null and b/Game/UI/circleborder.png differ diff --git a/Game/UI/clouduploadicon.png b/Game/UI/clouduploadicon.png new file mode 100644 index 000000000..03b728763 Binary files /dev/null and b/Game/UI/clouduploadicon.png differ diff --git a/Game/UI/escaped.png b/Game/UI/escaped.png new file mode 100644 index 000000000..96b0696a5 Binary files /dev/null and b/Game/UI/escaped.png differ diff --git a/Game/UI/escapegrace.png b/Game/UI/escapegrace.png new file mode 100644 index 000000000..825db3651 Binary files /dev/null and b/Game/UI/escapegrace.png differ diff --git a/Game/UI/greyColor.png b/Game/UI/greyColor.png new file mode 100644 index 000000000..6b96c0bc5 Binary files /dev/null and b/Game/UI/greyColor.png differ diff --git a/Game/UI/restraint_key_2.png b/Game/UI/restraint_key_2.png new file mode 100644 index 000000000..3d2742e83 Binary files /dev/null and b/Game/UI/restraint_key_2.png differ diff --git a/Game/UI/savedColor_copy.png b/Game/UI/savedColor_copy.png new file mode 100644 index 000000000..9d59fb561 Binary files /dev/null and b/Game/UI/savedColor_copy.png differ diff --git a/Game/UI/savedColor_paste.png b/Game/UI/savedColor_paste.png new file mode 100644 index 000000000..b747e8cc8 Binary files /dev/null and b/Game/UI/savedColor_paste.png differ diff --git a/Game/Vision.png b/Game/Vision.png new file mode 100644 index 000000000..0897818e0 Binary files /dev/null and b/Game/Vision.png differ diff --git a/Game/VisionNeg.png b/Game/VisionNeg.png new file mode 100644 index 000000000..79105782d Binary files /dev/null and b/Game/VisionNeg.png differ diff --git a/Game/WarningBacking.png b/Game/WarningBacking.png index 0f83c8f56..f37e40f50 100644 Binary files a/Game/WarningBacking.png and b/Game/WarningBacking.png differ diff --git a/Game/WarningBackingHighlight.png b/Game/WarningBackingHighlight.png new file mode 100644 index 000000000..717937646 Binary files /dev/null and b/Game/WarningBackingHighlight.png differ diff --git a/Game/WarningColorSpell.png b/Game/WarningColorSpell.png index a152eaa5f..cc5c16b73 100644 Binary files a/Game/WarningColorSpell.png and b/Game/WarningColorSpell.png differ diff --git a/Game/WarningHighlight.png b/Game/WarningHighlight.png index 9adf09c55..735a6edce 100644 Binary files a/Game/WarningHighlight.png and b/Game/WarningHighlight.png differ diff --git a/Game/WarningHighlightBasic.png b/Game/WarningHighlightBasic.png index 053712c9f..dee2a578d 100644 Binary files a/Game/WarningHighlightBasic.png and b/Game/WarningHighlightBasic.png differ diff --git a/Game/WarningHighlightSpecial.png b/Game/WarningHighlightSpecial.png index 9adf09c55..735a6edce 100644 Binary files a/Game/WarningHighlightSpecial.png and b/Game/WarningHighlightSpecial.png differ diff --git a/Game/WarningHighlightSpecialBasic.png b/Game/WarningHighlightSpecialBasic.png index ffcdcee42..4f0a40b43 100644 Binary files a/Game/WarningHighlightSpecialBasic.png and b/Game/WarningHighlightSpecialBasic.png differ diff --git a/Game/Weapons/Arbiter.png b/Game/Weapons/Arbiter.png deleted file mode 100644 index 7a2a64d0c..000000000 Binary files a/Game/Weapons/Arbiter.png and /dev/null differ diff --git a/Game/Weapons/ArcaneCrystal.png b/Game/Weapons/ArcaneCrystal.png deleted file mode 100644 index 942284519..000000000 Binary files a/Game/Weapons/ArcaneCrystal.png and /dev/null differ diff --git a/Game/Weapons/Axe.png b/Game/Weapons/Axe.png deleted file mode 100644 index eefb9008d..000000000 Binary files a/Game/Weapons/Axe.png and /dev/null differ diff --git a/Game/Weapons/BoltCutters.png b/Game/Weapons/BoltCutters.png deleted file mode 100644 index 283478a44..000000000 Binary files a/Game/Weapons/BoltCutters.png and /dev/null differ diff --git a/Game/Weapons/BondageBuster.png b/Game/Weapons/BondageBuster.png deleted file mode 100644 index daa224a21..000000000 Binary files a/Game/Weapons/BondageBuster.png and /dev/null differ diff --git a/Game/Weapons/Dragonslaver.png b/Game/Weapons/Dragonslaver.png deleted file mode 100644 index baa2a8fa1..000000000 Binary files a/Game/Weapons/Dragonslaver.png and /dev/null differ diff --git a/Game/Weapons/Dreamcatcher.png b/Game/Weapons/Dreamcatcher.png deleted file mode 100644 index 23edf34a5..000000000 Binary files a/Game/Weapons/Dreamcatcher.png and /dev/null differ diff --git a/Game/Weapons/EnchKnife.png b/Game/Weapons/EnchKnife.png deleted file mode 100644 index b7402da1e..000000000 Binary files a/Game/Weapons/EnchKnife.png and /dev/null differ diff --git a/Game/Weapons/EscortDrone.png b/Game/Weapons/EscortDrone.png deleted file mode 100644 index 39b3400ab..000000000 Binary files a/Game/Weapons/EscortDrone.png and /dev/null differ diff --git a/Game/Weapons/Feather.png b/Game/Weapons/Feather.png deleted file mode 100644 index 239b37ebb..000000000 Binary files a/Game/Weapons/Feather.png and /dev/null differ diff --git a/Game/Weapons/Flail.png b/Game/Weapons/Flail.png deleted file mode 100644 index c99fd12d1..000000000 Binary files a/Game/Weapons/Flail.png and /dev/null differ diff --git a/Game/Weapons/Flamberge.png b/Game/Weapons/Flamberge.png deleted file mode 100644 index d3f4bf41c..000000000 Binary files a/Game/Weapons/Flamberge.png and /dev/null differ diff --git a/Game/Weapons/FourSeasons.png b/Game/Weapons/FourSeasons.png deleted file mode 100644 index d826e13ed..000000000 Binary files a/Game/Weapons/FourSeasons.png and /dev/null differ diff --git a/Game/Weapons/Hammer.png b/Game/Weapons/Hammer.png deleted file mode 100644 index 795977a54..000000000 Binary files a/Game/Weapons/Hammer.png and /dev/null differ diff --git a/Game/Weapons/IceBreaker.png b/Game/Weapons/IceBreaker.png deleted file mode 100644 index b53079262..000000000 Binary files a/Game/Weapons/IceBreaker.png and /dev/null differ diff --git a/Game/Weapons/IceCube.png b/Game/Weapons/IceCube.png deleted file mode 100644 index 11459a26a..000000000 Binary files a/Game/Weapons/IceCube.png and /dev/null differ diff --git a/Game/Weapons/Knife.png b/Game/Weapons/Knife.png deleted file mode 100644 index df6855361..000000000 Binary files a/Game/Weapons/Knife.png and /dev/null differ diff --git a/Game/Weapons/MagicAxe.png b/Game/Weapons/MagicAxe.png deleted file mode 100644 index 3a184b5c4..000000000 Binary files a/Game/Weapons/MagicAxe.png and /dev/null differ diff --git a/Game/Weapons/MagicFlail.png b/Game/Weapons/MagicFlail.png deleted file mode 100644 index 6975be989..000000000 Binary files a/Game/Weapons/MagicFlail.png and /dev/null differ diff --git a/Game/Weapons/MagicHammer.png b/Game/Weapons/MagicHammer.png deleted file mode 100644 index c805eb229..000000000 Binary files a/Game/Weapons/MagicHammer.png and /dev/null differ diff --git a/Game/Weapons/MagicSpear.png b/Game/Weapons/MagicSpear.png deleted file mode 100644 index 5e9c44030..000000000 Binary files a/Game/Weapons/MagicSpear.png and /dev/null differ diff --git a/Game/Weapons/MagicSword.png b/Game/Weapons/MagicSword.png deleted file mode 100644 index 1337d0a8b..000000000 Binary files a/Game/Weapons/MagicSword.png and /dev/null differ diff --git a/Game/Weapons/MessengerOfLove.png b/Game/Weapons/MessengerOfLove.png deleted file mode 100644 index 5103a2d67..000000000 Binary files a/Game/Weapons/MessengerOfLove.png and /dev/null differ diff --git a/Game/Weapons/MoiraiScissors.png b/Game/Weapons/MoiraiScissors.png deleted file mode 100644 index 55550ce34..000000000 Binary files a/Game/Weapons/MoiraiScissors.png and /dev/null differ diff --git a/Game/Weapons/Pickaxe.png b/Game/Weapons/Pickaxe.png deleted file mode 100644 index cf659bdb8..000000000 Binary files a/Game/Weapons/Pickaxe.png and /dev/null differ diff --git a/Game/Weapons/Rope.png b/Game/Weapons/Rope.png deleted file mode 100644 index 838dbcd54..000000000 Binary files a/Game/Weapons/Rope.png and /dev/null differ diff --git a/Game/Weapons/Scissors.png b/Game/Weapons/Scissors.png deleted file mode 100644 index 55550ce34..000000000 Binary files a/Game/Weapons/Scissors.png and /dev/null differ diff --git a/Game/Weapons/Slimethrower.png b/Game/Weapons/Slimethrower.png deleted file mode 100644 index ce1180ed1..000000000 Binary files a/Game/Weapons/Slimethrower.png and /dev/null differ diff --git a/Game/Weapons/Spear.png b/Game/Weapons/Spear.png deleted file mode 100644 index 0a20041a9..000000000 Binary files a/Game/Weapons/Spear.png and /dev/null differ diff --git a/Game/Weapons/StaffBind.png b/Game/Weapons/StaffBind.png deleted file mode 100644 index cfb8ba4eb..000000000 Binary files a/Game/Weapons/StaffBind.png and /dev/null differ diff --git a/Game/Weapons/StaffDoll.png b/Game/Weapons/StaffDoll.png deleted file mode 100644 index 858363f23..000000000 Binary files a/Game/Weapons/StaffDoll.png and /dev/null differ diff --git a/Game/Weapons/StaffFlame.png b/Game/Weapons/StaffFlame.png deleted file mode 100644 index a0be14662..000000000 Binary files a/Game/Weapons/StaffFlame.png and /dev/null differ diff --git a/Game/Weapons/StaffFrostbite.png b/Game/Weapons/StaffFrostbite.png deleted file mode 100644 index c9d7a22f0..000000000 Binary files a/Game/Weapons/StaffFrostbite.png and /dev/null differ diff --git a/Game/Weapons/StaffPermafrost.png b/Game/Weapons/StaffPermafrost.png deleted file mode 100644 index b41f0241a..000000000 Binary files a/Game/Weapons/StaffPermafrost.png and /dev/null differ diff --git a/Game/Weapons/StaffStorm.png b/Game/Weapons/StaffStorm.png deleted file mode 100644 index e68184d13..000000000 Binary files a/Game/Weapons/StaffStorm.png and /dev/null differ diff --git a/Game/Weapons/Sword.png b/Game/Weapons/Sword.png deleted file mode 100644 index a9b6e471c..000000000 Binary files a/Game/Weapons/Sword.png and /dev/null differ diff --git a/Game/Weapons/TheEncaser.png b/Game/Weapons/TheEncaser.png deleted file mode 100644 index a0468ae96..000000000 Binary files a/Game/Weapons/TheEncaser.png and /dev/null differ diff --git a/Game/Weapons/Torch.png b/Game/Weapons/Torch.png deleted file mode 100644 index 1dc514f35..000000000 Binary files a/Game/Weapons/Torch.png and /dev/null differ diff --git a/Game/Weapons/Unarmed.png b/Game/Weapons/Unarmed.png deleted file mode 100644 index 75593c6be..000000000 Binary files a/Game/Weapons/Unarmed.png and /dev/null differ diff --git a/Game/Weapons/VibeWand.png b/Game/Weapons/VibeWand.png deleted file mode 100644 index 83f3795ee..000000000 Binary files a/Game/Weapons/VibeWand.png and /dev/null differ diff --git a/Game/buttplug.min.js b/Game/buttplug.min.js new file mode 100644 index 000000000..318e191d4 --- /dev/null +++ b/Game/buttplug.min.js @@ -0,0 +1,44 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/buttplug@3.2.1/dist/web/buttplug.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +(function(l,oe){typeof exports=="object"&&typeof module<"u"?oe(exports):typeof define=="function"&&define.amd?define(["exports"],oe):(l=typeof globalThis<"u"?globalThis:l||self,oe(l.buttplug={}))})(this,function(l){"use strict";var oe=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function It(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var rt={exports:{}};(function(r){var e=Object.prototype.hasOwnProperty,t="~";function n(){}Object.create&&(n.prototype=Object.create(null),new n().__proto__||(t=!1));function i(g,w,p){this.fn=g,this.context=w,this.once=p||!1}function u(g,w,p,v,h){if(typeof p!="function")throw new TypeError("The listener must be a function");var T=new i(p,v||g,h),x=t?t+w:w;return g._events[x]?g._events[x].fn?g._events[x]=[g._events[x],T]:g._events[x].push(T):(g._events[x]=T,g._eventsCount++),g}function a(g,w){--g._eventsCount===0?g._events=new n:delete g._events[w]}function f(){this._events=new n,this._eventsCount=0}f.prototype.eventNames=function(){var w=[],p,v;if(this._eventsCount===0)return w;for(v in p=this._events)e.call(p,v)&&w.push(t?v.slice(1):v);return Object.getOwnPropertySymbols?w.concat(Object.getOwnPropertySymbols(p)):w},f.prototype.listeners=function(w){var p=t?t+w:w,v=this._events[p];if(!v)return[];if(v.fn)return[v.fn];for(var h=0,T=v.length,x=new Array(T);h(r[r.Off=0]="Off",r[r.Error=1]="Error",r[r.Warn=2]="Warn",r[r.Info=3]="Info",r[r.Debug=4]="Debug",r[r.Trace=5]="Trace",r))(He||{});class st{constructor(e,t){const n=new Date,i=n.getHours(),u=n.getMinutes(),a=n.getSeconds();this.timestamp=`${i}:${u}:${a}`,this.logMessage=e,this.logLevel=t}get Message(){return this.logMessage}get LogLevel(){return this.logLevel}get Timestamp(){return this.timestamp}get FormattedMessage(){return`${He[this.logLevel]} : ${this.timestamp} : ${this.logMessage}`}}const it=class ze extends _e{constructor(){super(),this.maximumConsoleLogLevel=0,this.maximumEventLogLevel=0}static get Logger(){return ze.sLogger===void 0&&(ze.sLogger=new ze),this.sLogger}get MaximumConsoleLogLevel(){return this.maximumConsoleLogLevel}set MaximumConsoleLogLevel(e){this.maximumConsoleLogLevel=e}get MaximumEventLogLevel(){return this.maximumEventLogLevel}set MaximumEventLogLevel(e){this.maximumEventLogLevel=e}Error(e){this.AddLogMessage(e,1)}Warn(e){this.AddLogMessage(e,2)}Info(e){this.AddLogMessage(e,3)}Debug(e){this.AddLogMessage(e,4)}Trace(e){this.AddLogMessage(e,5)}AddLogMessage(e,t){if(t>this.maximumEventLogLevel&&t>this.maximumConsoleLogLevel)return;const n=new st(e,t);t<=this.maximumConsoleLogLevel&&console.log(n.FormattedMessage),t<=this.maximumEventLogLevel&&this.emit("log",n)}};it.sLogger=void 0;let ot=it;var C;(function(r){r[r.PLAIN_TO_CLASS=0]="PLAIN_TO_CLASS",r[r.CLASS_TO_PLAIN=1]="CLASS_TO_PLAIN",r[r.CLASS_TO_CLASS=2]="CLASS_TO_CLASS"})(C||(C={}));var Tt=function(){function r(){this._typeMetadatas=new Map,this._transformMetadatas=new Map,this._exposeMetadatas=new Map,this._excludeMetadatas=new Map,this._ancestorsMap=new Map}return r.prototype.addTypeMetadata=function(e){this._typeMetadatas.has(e.target)||this._typeMetadatas.set(e.target,new Map),this._typeMetadatas.get(e.target).set(e.propertyName,e)},r.prototype.addTransformMetadata=function(e){this._transformMetadatas.has(e.target)||this._transformMetadatas.set(e.target,new Map),this._transformMetadatas.get(e.target).has(e.propertyName)||this._transformMetadatas.get(e.target).set(e.propertyName,[]),this._transformMetadatas.get(e.target).get(e.propertyName).push(e)},r.prototype.addExposeMetadata=function(e){this._exposeMetadatas.has(e.target)||this._exposeMetadatas.set(e.target,new Map),this._exposeMetadatas.get(e.target).set(e.propertyName,e)},r.prototype.addExcludeMetadata=function(e){this._excludeMetadatas.has(e.target)||this._excludeMetadatas.set(e.target,new Map),this._excludeMetadatas.get(e.target).set(e.propertyName,e)},r.prototype.findTransformMetadatas=function(e,t,n){return this.findMetadatas(this._transformMetadatas,e,t).filter(function(i){return!i.options||i.options.toClassOnly===!0&&i.options.toPlainOnly===!0?!0:i.options.toClassOnly===!0?n===C.CLASS_TO_CLASS||n===C.PLAIN_TO_CLASS:i.options.toPlainOnly===!0?n===C.CLASS_TO_PLAIN:!0})},r.prototype.findExcludeMetadata=function(e,t){return this.findMetadata(this._excludeMetadatas,e,t)},r.prototype.findExposeMetadata=function(e,t){return this.findMetadata(this._exposeMetadatas,e,t)},r.prototype.findExposeMetadataByCustomName=function(e,t){return this.getExposedMetadatas(e).find(function(n){return n.options&&n.options.name===t})},r.prototype.findTypeMetadata=function(e,t){return this.findMetadata(this._typeMetadatas,e,t)},r.prototype.getStrategy=function(e){var t=this._excludeMetadatas.get(e),n=t&&t.get(void 0),i=this._exposeMetadatas.get(e),u=i&&i.get(void 0);return n&&u||!n&&!u?"none":n?"excludeAll":"exposeAll"},r.prototype.getExposedMetadatas=function(e){return this.getMetadata(this._exposeMetadatas,e)},r.prototype.getExcludedMetadatas=function(e){return this.getMetadata(this._excludeMetadatas,e)},r.prototype.getExposedProperties=function(e,t){return this.getExposedMetadatas(e).filter(function(n){return!n.options||n.options.toClassOnly===!0&&n.options.toPlainOnly===!0?!0:n.options.toClassOnly===!0?t===C.CLASS_TO_CLASS||t===C.PLAIN_TO_CLASS:n.options.toPlainOnly===!0?t===C.CLASS_TO_PLAIN:!0}).map(function(n){return n.propertyName})},r.prototype.getExcludedProperties=function(e,t){return this.getExcludedMetadatas(e).filter(function(n){return!n.options||n.options.toClassOnly===!0&&n.options.toPlainOnly===!0?!0:n.options.toClassOnly===!0?t===C.CLASS_TO_CLASS||t===C.PLAIN_TO_CLASS:n.options.toPlainOnly===!0?t===C.CLASS_TO_PLAIN:!0}).map(function(n){return n.propertyName})},r.prototype.clear=function(){this._typeMetadatas.clear(),this._exposeMetadatas.clear(),this._excludeMetadatas.clear(),this._ancestorsMap.clear()},r.prototype.getMetadata=function(e,t){var n=e.get(t),i;n&&(i=Array.from(n.values()).filter(function(v){return v.propertyName!==void 0}));for(var u=[],a=0,f=this.getAncestors(t);a0&&(a=a.filter(function(v){return!w.includes(v)})),this.options.version!==void 0&&(a=a.filter(function(v){var h=U.findExposeMetadata(e,v);return!h||!h.options?!0:i.checkVersion(h.options.since,h.options.until)})),this.options.groups&&this.options.groups.length?a=a.filter(function(v){var h=U.findExposeMetadata(e,v);return!h||!h.options?!0:i.checkGroups(h.options.groups)}):a=a.filter(function(v){var h=U.findExposeMetadata(e,v);return!h||!h.options||!h.options.groups||!h.options.groups.length})}return this.options.excludePrefixes&&this.options.excludePrefixes.length&&(a=a.filter(function(p){return i.options.excludePrefixes.every(function(v){return p.substr(0,v.length)!==v})})),a=a.filter(function(p,v,h){return h.indexOf(p)===v}),a},r.prototype.checkVersion=function(e,t){var n=!0;return n&&e&&(n=this.options.version>=e),n&&t&&(n=this.options.version"u"?t.Reflect=r:n=i(t.Reflect,n),e(n);function i(u,a){return function(f,g){typeof u[f]!="function"&&Object.defineProperty(u,f,{configurable:!0,writable:!0,value:g}),a&&a(f,g)}}})(function(e){var t=Object.prototype.hasOwnProperty,n=typeof Symbol=="function",i=n&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",u=n&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",a=typeof Object.create=="function",f={__proto__:[]}instanceof Array,g=!a&&!f,w={create:a?function(){return nt(Object.create(null))}:f?function(){return nt({__proto__:null})}:function(){return nt({})},has:g?function(s,o){return t.call(s,o)}:function(s,o){return o in s},get:g?function(s,o){return t.call(s,o)?s[o]:void 0}:function(s,o){return s[o]}},p=Object.getPrototypeOf(Function),v=typeof process=="object"&&process.env&&process.env.REFLECT_METADATA_USE_MAP_POLYFILL==="true",h=!v&&typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:rn(),T=!v&&typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:sn(),x=!v&&typeof WeakMap=="function"?WeakMap:on(),G=new x;function m(s,o,c,d){if(k(c)){if(!Et(s))throw new TypeError;if(!At(o))throw new TypeError;return qe(s,o)}else{if(!Et(s))throw new TypeError;if(!j(o))throw new TypeError;if(!j(d)&&!k(d)&&!de(d))throw new TypeError;return de(d)&&(d=void 0),c=V(c),Je(s,o,c,d)}}e("decorate",m);function D(s,o){function c(d,y){if(!j(d))throw new TypeError;if(!k(y)&&!Kt(y))throw new TypeError;X(s,o,d,y)}return c}e("metadata",D);function L(s,o,c,d){if(!j(c))throw new TypeError;return k(d)||(d=V(d)),X(s,o,c,d)}e("defineMetadata",L);function M(s,o,c){if(!j(o))throw new TypeError;return k(c)||(c=V(c)),we(s,o,c)}e("hasMetadata",M);function J(s,o,c){if(!j(o))throw new TypeError;return k(c)||(c=V(c)),fe(s,o,c)}e("hasOwnMetadata",J);function E(s,o,c){if(!j(o))throw new TypeError;return k(c)||(c=V(c)),ie(s,o,c)}e("getMetadata",E);function B(s,o,c){if(!j(o))throw new TypeError;return k(c)||(c=V(c)),R(s,o,c)}e("getOwnMetadata",B);function Q(s,o){if(!j(s))throw new TypeError;return k(o)||(o=V(o)),Mt(s,o)}e("getMetadataKeys",Q);function P(s,o){if(!j(s))throw new TypeError;return k(o)||(o=V(o)),Ct(s,o)}e("getOwnMetadataKeys",P);function et(s,o,c){if(!j(o))throw new TypeError;k(c)||(c=V(c));var d=te(o,c,!1);if(k(d)||!d.delete(s))return!1;if(d.size>0)return!0;var y=G.get(o);return y.delete(c),y.size>0||G.delete(o),!0}e("deleteMetadata",et);function qe(s,o){for(var c=s.length-1;c>=0;--c){var d=s[c],y=d(o);if(!k(y)&&!de(y)){if(!At(y))throw new TypeError;o=y}}return o}function Je(s,o,c,d){for(var y=s.length-1;y>=0;--y){var $=s[y],S=$(o,c,d);if(!k(S)&&!de(S)){if(!j(S))throw new TypeError;d=S}}return d}function te(s,o,c){var d=G.get(s);if(k(d)){if(!c)return;d=new h,G.set(s,d)}var y=d.get(o);if(k(y)){if(!c)return;y=new h,d.set(o,y)}return y}function we(s,o,c){var d=fe(s,o,c);if(d)return!0;var y=tt(o);return de(y)?!1:we(s,y,c)}function fe(s,o,c){var d=te(o,c,!1);return k(d)?!1:Zt(d.has(s))}function ie(s,o,c){var d=fe(s,o,c);if(d)return R(s,o,c);var y=tt(o);if(!de(y))return ie(s,y,c)}function R(s,o,c){var d=te(o,c,!1);if(!k(d))return d.get(s)}function X(s,o,c,d){var y=te(c,d,!0);y.set(s,o)}function Mt(s,o){var c=Ct(s,o),d=tt(s);if(d===null)return c;var y=Mt(d,o);if(y.length<=0)return c;if(c.length<=0)return y;for(var $=new T,S=[],b=0,_=c;b<_.length;b++){var A=_[b],O=$.has(A);O||($.add(A),S.push(A))}for(var ne=0,xt=y;ne=0&&b=this._keys.length?(this._index=-1,this._keys=o,this._values=o):this._index++,{value:_,done:!1}}return{value:void 0,done:!0}},S.prototype.throw=function(b){throw this._index>=0&&(this._index=-1,this._keys=o,this._values=o),b},S.prototype.return=function(b){return this._index>=0&&(this._index=-1,this._keys=o,this._values=o),{value:b,done:!0}},S}();return function(){function S(){this._keys=[],this._values=[],this._cacheKey=s,this._cacheIndex=-2}return Object.defineProperty(S.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),S.prototype.has=function(b){return this._find(b,!1)>=0},S.prototype.get=function(b){var _=this._find(b,!1);return _>=0?this._values[_]:void 0},S.prototype.set=function(b,_){var A=this._find(b,!0);return this._values[A]=_,this},S.prototype.delete=function(b){var _=this._find(b,!1);if(_>=0){for(var A=this._keys.length,O=_+1;O{for(var i=n>1?void 0:n?Gt(e,t):e,u=r.length-1,a;u>=0;u--)(a=r[u])&&(i=(n?a(e,t,i):a(i))||i);return n&&i&&Ft(e,t,i),i};const Y=0,I=1,ft=4294967295,le=3;class Se{constructor(e){Object.assign(this,e)}update(){var e,t,n,i,u;(e=this.ScalarCmd)==null||e.forEach((a,f)=>a.Index=f),(t=this.RotateCmd)==null||t.forEach((a,f)=>a.Index=f),(n=this.LinearCmd)==null||n.forEach((a,f)=>a.Index=f),(i=this.SensorReadCmd)==null||i.forEach((a,f)=>a.Index=f),(u=this.SensorSubscribeCmd)==null||u.forEach((a,f)=>a.Index=f)}}var re=(r=>(r.Unknown="Unknown",r.Vibrate="Vibrate",r.Rotate="Rotate",r.Oscillate="Oscillate",r.Constrict="Constrict",r.Inflate="Inflate",r.Position="Position",r))(re||{}),K=(r=>(r.Unknown="Unknown",r.Battery="Battery",r.RSSI="RSSI",r.Button="Button",r.Pressure="Pressure",r))(K||{});class dt{constructor(e){this.Index=0,Object.assign(this,e)}}class ht{constructor(e){this.Endpoints=e}}class lt{constructor(e){this.Index=0,Object.assign(this,e)}}class H{constructor(e){this.Id=e}get Type(){return this.constructor}toJSON(){return JSON.stringify(this.toProtocolFormat())}toProtocolFormat(){const e={};return e[this.constructor.Name]=jt(this),e}update(){}}class z extends H{constructor(e,t){super(t),this.DeviceIndex=e,this.Id=t}}class se extends H{constructor(e=Y){super(e),this.Id=e}}class pe extends se{constructor(e=I){super(e),this.Id=e}}pe.Name="Ok";class Ze extends H{constructor(e=I){super(e),this.Id=e}}Ze.Name="Ping";var W=(r=>(r[r.ERROR_UNKNOWN=0]="ERROR_UNKNOWN",r[r.ERROR_INIT=1]="ERROR_INIT",r[r.ERROR_PING=2]="ERROR_PING",r[r.ERROR_MSG=3]="ERROR_MSG",r[r.ERROR_DEVICE=4]="ERROR_DEVICE",r))(W||{});let Z=class extends H{constructor(e,t=0,n=I){super(n),this.ErrorMessage=e,this.ErrorCode=t,this.Id=n}get Schemversion(){return 0}};Z.Name="Error";class Me{constructor(e){Object.assign(this,e)}}Xe([Ye(()=>Se)],Me.prototype,"DeviceMessages",2);class Ce extends H{constructor(e,t=I){super(t),this.Devices=e,this.Id=t}update(){for(const e of this.Devices)e.DeviceMessages.update()}}Ce.Name="DeviceList",Xe([Ye(()=>Me)],Ce.prototype,"Devices",2);class ge extends se{constructor(e){super(),Object.assign(this,e)}update(){this.DeviceMessages.update()}}ge.Name="DeviceAdded",Xe([Ye(()=>Se)],ge.prototype,"DeviceMessages",2);class be extends se{constructor(e){super(),this.DeviceIndex=e}}be.Name="DeviceRemoved";class Ee extends H{constructor(e=I){super(e),this.Id=e}}Ee.Name="RequestDeviceList";class Ae extends H{constructor(e=I){super(e),this.Id=e}}Ae.Name="StartScanning";class Oe extends H{constructor(e=I){super(e),this.Id=e}}Oe.Name="StopScanning";class xe extends se{constructor(){super()}}xe.Name="ScanningFinished";class Le extends H{constructor(e,t=0,n=I){super(n),this.ClientName=e,this.MessageVersion=t,this.Id=n}}Le.Name="RequestServerInfo";class Re extends se{constructor(e,t,n,i=I){super(),this.MessageVersion=e,this.MaxPingTime=t,this.ServerName=n,this.Id=i}}Re.Name="ServerInfo";class Ie extends z{constructor(e=-1,t=I){super(e,t),this.DeviceIndex=e,this.Id=t}}Ie.Name="StopDeviceCmd";class De extends H{constructor(e=I){super(e),this.Id=e}}De.Name="StopAllDevices";class me{constructor(e){this.Index=e}}class Te extends me{constructor(e,t,n){super(e),this.Scalar=t,this.ActuatorType=n}}class ve extends z{constructor(e,t=-1,n=I){super(t,n),this.Scalars=e,this.DeviceIndex=t,this.Id=n}}ve.Name="ScalarCmd";class Qe extends me{constructor(e,t,n){super(e),this.Speed=t,this.Clockwise=n}}const pt=class Lt extends z{constructor(e,t=-1,n=I){super(t,n),this.Rotations=e,this.DeviceIndex=t,this.Id=n}static Create(e,t){const n=new Array;let i=0;for(const[u,a]of t)n.push(new Qe(i,u,a)),++i;return new Lt(n,e)}};pt.Name="RotateCmd";let Ne=pt;class Ke extends me{constructor(e,t,n){super(e),this.Position=t,this.Duration=n}}const gt=class Rt extends z{constructor(e,t=-1,n=I){super(t,n),this.Vectors=e,this.DeviceIndex=t,this.Id=n}static Create(e,t){const n=new Array;let i=0;for(const u of t)n.push(new Ke(i,u[0],u[1])),++i;return new Rt(n,e)}};gt.Name="LinearCmd";let Pe=gt;class ke extends z{constructor(e,t,n,i=I){super(e,i),this.DeviceIndex=e,this.SensorIndex=t,this.SensorType=n,this.Id=i}}ke.Name="SensorReadCmd";class Be extends z{constructor(e,t,n,i,u=I){super(e,u),this.DeviceIndex=e,this.SensorIndex=t,this.SensorType=n,this.Data=i,this.Id=u}}Be.Name="SensorReading";class je extends z{constructor(e,t,n,i,u=I){super(e,u),this.DeviceIndex=e,this.Endpoint=t,this.ExpectedLength=n,this.Timeout=i,this.Id=u}}je.Name="RawReadCmd";class $e extends z{constructor(e,t,n,i,u=I){super(e,u),this.DeviceIndex=e,this.Endpoint=t,this.Data=n,this.WriteWithResponse=i,this.Id=u}}$e.Name="RawWriteCmd";class Fe extends z{constructor(e,t,n=I){super(e,n),this.DeviceIndex=e,this.Endpoint=t,this.Id=n}}Fe.Name="RawSubscribeCmd";class Ge extends z{constructor(e,t,n=I){super(e,n),this.DeviceIndex=e,this.Endpoint=t,this.Id=n}}Ge.Name="RawUnsubscribeCmd";class Ue extends z{constructor(e,t,n,i=I){super(e,i),this.DeviceIndex=e,this.Endpoint=t,this.Data=n,this.Id=i}}Ue.Name="RawReading";const Ut=Object.freeze(Object.defineProperty({__proto__:null,ActuatorType:re,ButtplugDeviceMessage:z,ButtplugMessage:H,ButtplugSystemMessage:se,DEFAULT_MESSAGE_ID:I,DeviceAdded:ge,DeviceInfo:Me,DeviceList:Ce,DeviceRemoved:be,Error:Z,ErrorClass:W,GenericDeviceMessageAttributes:dt,GenericMessageSubcommand:me,LinearCmd:Pe,MAX_ID:ft,MESSAGE_SPEC_VERSION:le,MessageAttributes:Se,Ok:pe,Ping:Ze,RawDeviceMessageAttributes:ht,RawReadCmd:je,RawReading:Ue,RawSubscribeCmd:Fe,RawUnsubscribeCmd:Ge,RawWriteCmd:$e,RequestDeviceList:Ee,RequestServerInfo:Le,RotateCmd:Ne,RotateSubcommand:Qe,SYSTEM_MESSAGE_ID:Y,ScalarCmd:ve,ScalarSubcommand:Te,ScanningFinished:xe,SensorDeviceMessageAttributes:lt,SensorReadCmd:ke,SensorReading:Be,SensorType:K,ServerInfo:Re,StartScanning:Ae,StopAllDevices:De,StopDeviceCmd:Ie,StopScanning:Oe,VectorSubcommand:Ke},Symbol.toStringTag,{value:"Module"}));/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */class F extends Error{constructor(e,t,n=Y,i){super(e),this.errorClass=W.ERROR_UNKNOWN,this.errorClass=t,this.innerError=i,this.messageId=n}get ErrorClass(){return this.errorClass}get InnerError(){return this.innerError}get Id(){return this.messageId}get ErrorMessage(){return new Z(this.message,this.ErrorClass,this.Id)}static LogAndError(e,t,n,i=Y){return t.Error(n),new e(n,i)}static FromError(e){switch(e.ErrorCode){case W.ERROR_DEVICE:return new N(e.ErrorMessage,e.Id);case W.ERROR_INIT:return new We(e.ErrorMessage,e.Id);case W.ERROR_UNKNOWN:return new vt(e.ErrorMessage,e.Id);case W.ERROR_PING:return new mt(e.ErrorMessage,e.Id);case W.ERROR_MSG:return new ue(e.ErrorMessage,e.Id);default:throw new Error(`Message type ${e.ErrorCode} not handled`)}}}class We extends F{constructor(e,t=Y){super(e,W.ERROR_INIT,t)}}class N extends F{constructor(e,t=Y){super(e,W.ERROR_DEVICE,t)}}class ue extends F{constructor(e,t=Y){super(e,W.ERROR_MSG,t)}}class mt extends F{constructor(e,t=Y){super(e,W.ERROR_PING,t)}}class vt extends F{constructor(e,t=Y){super(e,W.ERROR_UNKNOWN,t)}}function yt(r){for(const e of Object.values(Ut))if(typeof e=="function"&&"Name"in e&&e.Name===r)return e;return null}function ee(r){return yt(Object.getPrototypeOf(r).constructor.Name)}function Ve(r){const e=JSON.parse(r),t=[];for(const n of Array.from(e)){const i=Object.getOwnPropertyNames(n)[0],u=yt(i);if(u){const a=$t(u,n[i]);a.update(),t.push(a)}}return t}class ye extends _e{constructor(e,t){super(),this._deviceInfo=e,this._sendClosure=t,this.allowedMsgs=new Map,e.DeviceMessages.update()}get name(){return this._deviceInfo.DeviceName}get displayName(){return this._deviceInfo.DeviceDisplayName}get index(){return this._deviceInfo.DeviceIndex}get messageTimingGap(){return this._deviceInfo.DeviceMessageTimingGap}get messageAttributes(){return this._deviceInfo.DeviceMessages}static fromMsg(e,t){return new ye(e,t)}async send(e){return await this._sendClosure(this,e)}async sendExpectOk(e){const t=await this.send(e);switch(ee(t)){case pe:return;case Z:throw F.FromError(t);default:throw new ue(`Message type ${t.constructor} not handled by SendMsgExpectOk`)}}async scalar(e){Array.isArray(e)?await this.sendExpectOk(new ve(e,this.index)):await this.sendExpectOk(new ve([e],this.index))}async scalarCommandBuilder(e,t){var u;const n=(u=this.messageAttributes.ScalarCmd)==null?void 0:u.filter(a=>a.ActuatorType===t);if(!n||n.length===0)throw new N(`Device ${this.name} has no ${t} capabilities`);const i=[];if(typeof e=="number")n.forEach(a=>i.push(new Te(a.Index,e,t)));else if(Array.isArray(e)){if(e.length>n.length)throw new N(`${e.length} commands send to a device with ${n.length} vibrators`);n.forEach((a,f)=>{i.push(new Te(a.Index,e[f],t))})}else throw new N(`${t} can only take numbers or arrays of numbers.`);await this.scalar(i)}get vibrateAttributes(){var e;return((e=this.messageAttributes.ScalarCmd)==null?void 0:e.filter(t=>t.ActuatorType===re.Vibrate))??[]}async vibrate(e){await this.scalarCommandBuilder(e,re.Vibrate)}get oscillateAttributes(){var e;return((e=this.messageAttributes.ScalarCmd)==null?void 0:e.filter(t=>t.ActuatorType===re.Oscillate))??[]}async oscillate(e){await this.scalarCommandBuilder(e,re.Oscillate)}get rotateAttributes(){return this.messageAttributes.RotateCmd??[]}async rotate(e,t){const n=this.messageAttributes.RotateCmd;if(!n||n.length===0)throw new N(`Device ${this.name} has no Rotate capabilities`);let i;if(typeof e=="number")i=Ne.Create(this.index,new Array(n.length).fill([e,t]));else if(Array.isArray(e))i=Ne.Create(this.index,e);else throw new N("SendRotateCmd can only take a number and boolean, or an array of number/boolean tuples");await this.sendExpectOk(i)}get linearAttributes(){return this.messageAttributes.LinearCmd??[]}async linear(e,t){const n=this.messageAttributes.LinearCmd;if(!n||n.length===0)throw new N(`Device ${this.name} has no Linear capabilities`);let i;if(typeof e=="number")i=Pe.Create(this.index,new Array(n.length).fill([e,t]));else if(Array.isArray(e))i=Pe.Create(this.index,e);else throw new N("SendLinearCmd can only take a number and number, or an array of number/number tuples");await this.sendExpectOk(i)}async sensorRead(e,t){const n=await this.send(new ke(this.index,e,t));switch(ee(n)){case Be:return n.Data;case Z:throw F.FromError(n);default:throw new ue(`Message type ${n.constructor} not handled by sensorRead`)}}get hasBattery(){var t;const e=(t=this.messageAttributes.SensorReadCmd)==null?void 0:t.filter(n=>n.SensorType===K.Battery);return e!==void 0&&e.length>0}async battery(){var n;if(!this.hasBattery)throw new N(`Device ${this.name} has no Battery capabilities`);const e=(n=this.messageAttributes.SensorReadCmd)==null?void 0:n.filter(i=>i.SensorType===K.Battery);return(await this.sensorRead(e[0].Index,K.Battery))[0]/100}get hasRssi(){var t;const e=(t=this.messageAttributes.SensorReadCmd)==null?void 0:t.filter(n=>n.SensorType===K.RSSI);return e!==void 0&&e.length===0}async rssi(){var n;if(!this.hasRssi)throw new N(`Device ${this.name} has no RSSI capabilities`);const e=(n=this.messageAttributes.SensorReadCmd)==null?void 0:n.filter(i=>i.SensorType===K.RSSI);return(await this.sensorRead(e[0].Index,K.RSSI))[0]}async rawRead(e,t,n){if(!this.messageAttributes.RawReadCmd)throw new N(`Device ${this.name} has no raw read capabilities`);if(this.messageAttributes.RawReadCmd.Endpoints.indexOf(e)===-1)throw new N(`Device ${this.name} has no raw readable endpoint ${e}`);const i=await this.send(new je(this.index,e,t,n));switch(ee(i)){case Ue:return new Uint8Array(i.Data);case Z:throw F.FromError(i);default:throw new ue(`Message type ${i.constructor} not handled by rawRead`)}}async rawWrite(e,t,n){if(!this.messageAttributes.RawWriteCmd)throw new N(`Device ${this.name} has no raw write capabilities`);if(this.messageAttributes.RawWriteCmd.Endpoints.indexOf(e)===-1)throw new N(`Device ${this.name} has no raw writable endpoint ${e}`);await this.sendExpectOk(new $e(this.index,e,t,n))}async rawSubscribe(e){if(!this.messageAttributes.RawSubscribeCmd)throw new N(`Device ${this.name} has no raw subscribe capabilities`);if(this.messageAttributes.RawSubscribeCmd.Endpoints.indexOf(e)===-1)throw new N(`Device ${this.name} has no raw subscribable endpoint ${e}`);await this.sendExpectOk(new Fe(this.index,e))}async rawUnsubscribe(e){if(!this.messageAttributes.RawSubscribeCmd)throw new N(`Device ${this.name} has no raw unsubscribe capabilities`);if(this.messageAttributes.RawSubscribeCmd.Endpoints.indexOf(e)===-1)throw new N(`Device ${this.name} has no raw unsubscribable endpoint ${e}`);await this.sendExpectOk(new Ge(this.index,e))}async stop(){await this.sendExpectOk(new Ie(this.index))}emitDisconnected(){this.emit("deviceremoved")}}/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */class wt{constructor(e){this._useCounter=e,this._counter=1,this._waitingMsgs=new Map}PrepareOutgoingMessage(e){this._useCounter&&(e.Id=this._counter,this._counter+=1);let t,n;const i=new Promise((u,a)=>{t=u,n=a});return this._waitingMsgs.set(e.Id,[t,n]),i}ParseIncomingMessages(e){const t=[];for(const n of e)if(n.Id!==Y&&this._waitingMsgs.has(n.Id)){const[i,u]=this._waitingMsgs.get(n.Id);if(n.Type===Z){u(F.FromError(n));continue}i(n);continue}else t.push(n);return t}}/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */class _t extends F{constructor(e){super(e,W.ERROR_UNKNOWN)}}class Wt extends _e{constructor(e="Generic Buttplug Client"){super(),this._pingTimer=null,this._connector=null,this._devices=new Map,this._logger=ot.Logger,this._isScanning=!1,this._sorter=new wt(!0),this.connect=async t=>{this._logger.Info(`ButtplugClient: Connecting using ${t.constructor.name}`),await t.connect(),this._connector=t,this._connector.addListener("message",this.parseMessages),this._connector.addListener("disconnect",this.disconnectHandler),await this.initializeConnection()},this.disconnect=async()=>{this._logger.Debug("ButtplugClient: Disconnect called"),this.checkConnector(),await this.shutdownConnection(),await this._connector.disconnect()},this.startScanning=async()=>{this._logger.Debug("ButtplugClient: StartScanning called"),this._isScanning=!0,await this.sendMsgExpectOk(new Ae)},this.stopScanning=async()=>{this._logger.Debug("ButtplugClient: StopScanning called"),this._isScanning=!1,await this.sendMsgExpectOk(new Oe)},this.stopAllDevices=async()=>{this._logger.Debug("ButtplugClient: StopAllDevices"),await this.sendMsgExpectOk(new De)},this.disconnectHandler=()=>{this._logger.Info("ButtplugClient: Disconnect event receieved."),this.emit("disconnect")},this.parseMessages=t=>{const n=this._sorter.ParseIncomingMessages(t);for(const i of n)switch(ee(i)){case ge:{const u=i,a=ye.fromMsg(u,this.sendDeviceMessageClosure);this._devices.set(u.DeviceIndex,a),this.emit("deviceadded",a);break}case be:{const u=i;if(this._devices.has(u.DeviceIndex)){const a=this._devices.get(u.DeviceIndex);a==null||a.emitDisconnected(),this._devices.delete(u.DeviceIndex),this.emit("deviceremoved",a)}break}case xe:this._isScanning=!1,this.emit("scanningfinished",i);break}},this.initializeConnection=async()=>{this.checkConnector();const t=await this.sendMessage(new Le(this._clientName,le));switch(ee(t)){case Re:{const n=t;if(this._logger.Info(`ButtplugClient: Connected to Server ${n.ServerName}`),n.MaxPingTime,n.MessageVersion{this.checkConnector(),this._logger.Debug("ButtplugClient: ReceiveDeviceList called"),(await this.sendMessage(new Ee)).Devices.forEach(n=>{if(this._devices.has(n.DeviceIndex))this._logger.Debug(`ButtplugClient: Device already added: ${n}`);else{const i=ye.fromMsg(n,this.sendDeviceMessageClosure);this._logger.Debug(`ButtplugClient: Adding Device: ${i}`),this._devices.set(n.DeviceIndex,i),this.emit("deviceadded",i)}})},this.shutdownConnection=async()=>{await this.stopAllDevices(),this._pingTimer!==null&&(clearInterval(this._pingTimer),this._pingTimer=null)},this.sendMsgExpectOk=async t=>{const n=await this.sendMessage(t);switch(ee(n)){case pe:return;case Z:throw F.FromError(n);default:throw F.LogAndError(ue,this._logger,`Message type ${ee(n).constructor} not handled by SendMsgExpectOk`)}},this.sendDeviceMessageClosure=async(t,n)=>await this.sendDeviceMessage(t,n),this._clientName=e,this._logger.Debug(`ButtplugClient: Client ${e} created.`)}get connected(){return this._connector!==null&&this._connector.Connected}get devices(){this.checkConnector();const e=[];return this._devices.forEach(t=>{e.push(t)}),e}get isScanning(){return this._isScanning}async sendDeviceMessage(e,t){if(this.checkConnector(),this._devices.get(e.index)===void 0)throw F.LogAndError(N,this._logger,`Device ${e.index} not available.`);return t.DeviceIndex=e.index,await this.sendMessage(t)}async sendMessage(e){this.checkConnector();const t=this._sorter.PrepareOutgoingMessage(e);return await this._connector.send(e),await t}checkConnector(){if(!this.connected)throw new _t("ButtplugClient not connected")}}class qt extends _e{constructor(e){super(),this._url=e,this._websocketConstructor=null,this.connect=async()=>{const t=new(this._websocketConstructor??WebSocket)(this._url);let n,i;const u=new Promise((f,g)=>{n=f,i=g}),a=()=>i();return t.addEventListener("open",async()=>{this._ws=t;try{await this.initialize(),this._ws.addEventListener("message",f=>{this.parseIncomingMessage(f)}),this._ws.removeEventListener("close",a),this._ws.addEventListener("close",this.disconnect),n()}catch(f){console.log(f),i()}}),t.addEventListener("close",a),u},this.disconnect=async()=>{this.Connected&&(this._ws.close(),this._ws=void 0,this.emit("disconnect"))},this.initialize=async()=>Promise.resolve()}get Connected(){return this._ws!==void 0}sendMessage(e){if(!this.Connected)throw new Error("ButtplugBrowserWebsocketConnector not connected");this._ws.send("["+e.toJSON()+"]")}parseIncomingMessage(e){if(typeof e.data=="string"){const t=Ve(e.data);this.emit("message",t)}else e.data instanceof Blob}onReaderLoad(e){const t=Ve(e.target.result);this.emit("message",t)}}class St extends qt{constructor(){super(...arguments),this.send=e=>{if(!this.Connected)throw new Error("ButtplugClient not connected");this.sendMessage(e)}}}var Jt=function(){throw new Error("ws does not work in the browser. Browser clients must use the native WebSocket object")};class zt extends St{constructor(){super(...arguments),this._websocketConstructor=Jt.WebSocket}}l.ActuatorType=re,l.ButtplugBrowserWebsocketClientConnector=St,l.ButtplugClient=Wt,l.ButtplugClientConnectorException=_t,l.ButtplugClientDevice=ye,l.ButtplugDeviceError=N,l.ButtplugDeviceMessage=z,l.ButtplugError=F,l.ButtplugInitError=We,l.ButtplugLogLevel=He,l.ButtplugLogger=ot,l.ButtplugMessage=H,l.ButtplugMessageError=ue,l.ButtplugMessageSorter=wt,l.ButtplugNodeWebsocketClientConnector=zt,l.ButtplugPingError=mt,l.ButtplugSystemMessage=se,l.ButtplugUnknownError=vt,l.DEFAULT_MESSAGE_ID=I,l.DeviceAdded=ge,l.DeviceInfo=Me,l.DeviceList=Ce,l.DeviceRemoved=be,l.Error=Z,l.ErrorClass=W,l.GenericDeviceMessageAttributes=dt,l.GenericMessageSubcommand=me,l.LinearCmd=Pe,l.LogMessage=st,l.MAX_ID=ft,l.MESSAGE_SPEC_VERSION=le,l.MessageAttributes=Se,l.Ok=pe,l.Ping=Ze,l.RawDeviceMessageAttributes=ht,l.RawReadCmd=je,l.RawReading=Ue,l.RawSubscribeCmd=Fe,l.RawUnsubscribeCmd=Ge,l.RawWriteCmd=$e,l.RequestDeviceList=Ee,l.RequestServerInfo=Le,l.RotateCmd=Ne,l.RotateSubcommand=Qe,l.SYSTEM_MESSAGE_ID=Y,l.ScalarCmd=ve,l.ScalarSubcommand=Te,l.ScanningFinished=xe,l.SensorDeviceMessageAttributes=lt,l.SensorReadCmd=ke,l.SensorReading=Be,l.SensorType=K,l.ServerInfo=Re,l.StartScanning=Ae,l.StopAllDevices=De,l.StopDeviceCmd=Ie,l.StopScanning=Oe,l.VectorSubcommand=Ke,l.fromJSON=Ve,l.getMessageClassFromMessage=ee,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})}); diff --git a/Game/pixi.min.js b/Game/pixi.min.js index b5795e104..15bef0a2b 100644 --- a/Game/pixi.min.js +++ b/Game/pixi.min.js @@ -1,13 +1,25367 @@ -/* eslint-disable no-shadow */ -"use strict"; - /*! - * pixi.js-legacy - v6.4.2 - * Compiled Thu, 02 Jun 2022 15:31:20 UTC + * pixi.js - v7.2.1 + * Compiled Fri, 17 Mar 2023 16:54:13 UTC * - * pixi.js-legacy is licensed under the MIT License. + * pixi.js is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license */ -// eslint-disable-next-line strict -var PIXI=function(t){"use strict";var e=setTimeout;function r(t){return Boolean(t&&void 0!==t.length)}function i(){}function n(t){if(!(this instanceof n))throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],l(t,this)}function o(t,e){for(;3===t._state;)t=t._value;0!==t._state?(t._handled=!0,n._immediateFn((function(){var r=1===t._state?e.onFulfilled:e.onRejected;if(null!==r){var i;try{i=r(t._value)}catch(t){return void a(e.promise,t)}s(e.promise,i)}else(1===t._state?s:a)(e.promise,t._value)}))):t._deferreds.push(e)}function s(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var r=e.then;if(e instanceof n)return t._state=3,t._value=e,void h(t);if("function"==typeof r)return void l((i=r,o=e,function(){i.apply(o,arguments)}),t)}t._state=1,t._value=e,h(t)}catch(e){a(t,e)}var i,o}function a(t,e){t._state=2,t._value=e,h(t)}function h(t){2===t._state&&0===t._deferreds.length&&n._immediateFn((function(){t._handled||n._unhandledRejectionFn(t._value)}));for(var e=0,r=t._deferreds.length;e0?1:-1}),Number.isInteger||(Number.isInteger=function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t}),globalThis.ArrayBuffer||(globalThis.ArrayBuffer=Array),globalThis.Float32Array||(globalThis.Float32Array=Array),globalThis.Uint32Array||(globalThis.Uint32Array=Array),globalThis.Uint16Array||(globalThis.Uint16Array=Array),globalThis.Uint8Array||(globalThis.Uint8Array=Array),globalThis.Int32Array||(globalThis.Int32Array=Array);var T=/iPhone/i,b=/iPod/i,x=/iPad/i,R=/\biOS-universal(?:.+)Mac\b/i,A=/\bAndroid(?:.+)Mobile\b/i,S=/Android/i,O=/(?:SD4930UR|\bSilk(?:.+)Mobile\b)/i,I=/Silk/i,M=/Windows Phone/i,N=/\bWindows(?:.+)ARM\b/i,P=/BlackBerry/i,D=/BB10/i,C=/Opera Mini/i,w=/\b(CriOS|Chrome)(?:.+)Mobile/i,L=/Mobile(?:.+)Firefox\b/i,F=function(t){return void 0!==t&&"MacIntel"===t.platform&&"number"==typeof t.maxTouchPoints&&t.maxTouchPoints>1&&"undefined"==typeof MSStream};var U,B,G,X,k,H,Y,j,V,W,z,q,K,Z,Q,J,$,tt,et,rt=function(t){var e={userAgent:"",platform:"",maxTouchPoints:0};t||"undefined"==typeof navigator?"string"==typeof t?e.userAgent=t:t&&t.userAgent&&(e={userAgent:t.userAgent,platform:t.platform,maxTouchPoints:t.maxTouchPoints||0}):e={userAgent:navigator.userAgent,platform:navigator.platform,maxTouchPoints:navigator.maxTouchPoints||0};var r=e.userAgent,i=r.split("[FBAN");void 0!==i[1]&&(r=i[0]),void 0!==(i=r.split("Twitter"))[1]&&(r=i[0]);var n=function(t){return function(e){return e.test(t)}}(r),o={apple:{phone:n(T)&&!n(M),ipod:n(b),tablet:!n(T)&&(n(x)||F(e))&&!n(M),universal:n(R),device:(n(T)||n(b)||n(x)||n(R)||F(e))&&!n(M)},amazon:{phone:n(O),tablet:!n(O)&&n(I),device:n(O)||n(I)},android:{phone:!n(M)&&n(O)||!n(M)&&n(A),tablet:!n(M)&&!n(O)&&!n(A)&&(n(I)||n(S)),device:!n(M)&&(n(O)||n(I)||n(A)||n(S))||n(/\bokhttp\b/i)},windows:{phone:n(M),tablet:n(N),device:n(M)||n(N)},other:{blackberry:n(P),blackberry10:n(D),opera:n(C),firefox:n(L),chrome:n(w),device:n(P)||n(D)||n(C)||n(L)||n(w)},any:!1,phone:!1,tablet:!1};return o.any=o.apple.device||o.android.device||o.windows.device||o.other.device,o.phone=o.apple.phone||o.android.phone||o.windows.phone,o.tablet=o.apple.tablet||o.android.tablet||o.windows.tablet,o}(globalThis.navigator);!function(t){t[t.WEBGL_LEGACY=0]="WEBGL_LEGACY",t[t.WEBGL=1]="WEBGL",t[t.WEBGL2=2]="WEBGL2"}(U||(U={})),function(t){t[t.UNKNOWN=0]="UNKNOWN",t[t.WEBGL=1]="WEBGL",t[t.CANVAS=2]="CANVAS"}(B||(B={})),function(t){t[t.COLOR=16384]="COLOR",t[t.DEPTH=256]="DEPTH",t[t.STENCIL=1024]="STENCIL"}(G||(G={})),function(t){t[t.NORMAL=0]="NORMAL",t[t.ADD=1]="ADD",t[t.MULTIPLY=2]="MULTIPLY",t[t.SCREEN=3]="SCREEN",t[t.OVERLAY=4]="OVERLAY",t[t.DARKEN=5]="DARKEN",t[t.LIGHTEN=6]="LIGHTEN",t[t.COLOR_DODGE=7]="COLOR_DODGE",t[t.COLOR_BURN=8]="COLOR_BURN",t[t.HARD_LIGHT=9]="HARD_LIGHT",t[t.SOFT_LIGHT=10]="SOFT_LIGHT",t[t.DIFFERENCE=11]="DIFFERENCE",t[t.EXCLUSION=12]="EXCLUSION",t[t.HUE=13]="HUE",t[t.SATURATION=14]="SATURATION",t[t.COLOR=15]="COLOR",t[t.LUMINOSITY=16]="LUMINOSITY",t[t.NORMAL_NPM=17]="NORMAL_NPM",t[t.ADD_NPM=18]="ADD_NPM",t[t.SCREEN_NPM=19]="SCREEN_NPM",t[t.NONE=20]="NONE",t[t.SRC_OVER=0]="SRC_OVER",t[t.SRC_IN=21]="SRC_IN",t[t.SRC_OUT=22]="SRC_OUT",t[t.SRC_ATOP=23]="SRC_ATOP",t[t.DST_OVER=24]="DST_OVER",t[t.DST_IN=25]="DST_IN",t[t.DST_OUT=26]="DST_OUT",t[t.DST_ATOP=27]="DST_ATOP",t[t.ERASE=26]="ERASE",t[t.SUBTRACT=28]="SUBTRACT",t[t.XOR=29]="XOR"}(X||(X={})),function(t){t[t.POINTS=0]="POINTS",t[t.LINES=1]="LINES",t[t.LINE_LOOP=2]="LINE_LOOP",t[t.LINE_STRIP=3]="LINE_STRIP",t[t.TRIANGLES=4]="TRIANGLES",t[t.TRIANGLE_STRIP=5]="TRIANGLE_STRIP",t[t.TRIANGLE_FAN=6]="TRIANGLE_FAN"}(k||(k={})),function(t){t[t.RGBA=6408]="RGBA",t[t.RGB=6407]="RGB",t[t.RG=33319]="RG",t[t.RED=6403]="RED",t[t.RGBA_INTEGER=36249]="RGBA_INTEGER",t[t.RGB_INTEGER=36248]="RGB_INTEGER",t[t.RG_INTEGER=33320]="RG_INTEGER",t[t.RED_INTEGER=36244]="RED_INTEGER",t[t.ALPHA=6406]="ALPHA",t[t.LUMINANCE=6409]="LUMINANCE",t[t.LUMINANCE_ALPHA=6410]="LUMINANCE_ALPHA",t[t.DEPTH_COMPONENT=6402]="DEPTH_COMPONENT",t[t.DEPTH_STENCIL=34041]="DEPTH_STENCIL"}(H||(H={})),function(t){t[t.TEXTURE_2D=3553]="TEXTURE_2D",t[t.TEXTURE_CUBE_MAP=34067]="TEXTURE_CUBE_MAP",t[t.TEXTURE_2D_ARRAY=35866]="TEXTURE_2D_ARRAY",t[t.TEXTURE_CUBE_MAP_POSITIVE_X=34069]="TEXTURE_CUBE_MAP_POSITIVE_X",t[t.TEXTURE_CUBE_MAP_NEGATIVE_X=34070]="TEXTURE_CUBE_MAP_NEGATIVE_X",t[t.TEXTURE_CUBE_MAP_POSITIVE_Y=34071]="TEXTURE_CUBE_MAP_POSITIVE_Y",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Y=34072]="TEXTURE_CUBE_MAP_NEGATIVE_Y",t[t.TEXTURE_CUBE_MAP_POSITIVE_Z=34073]="TEXTURE_CUBE_MAP_POSITIVE_Z",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Z=34074]="TEXTURE_CUBE_MAP_NEGATIVE_Z"}(Y||(Y={})),function(t){t[t.UNSIGNED_BYTE=5121]="UNSIGNED_BYTE",t[t.UNSIGNED_SHORT=5123]="UNSIGNED_SHORT",t[t.UNSIGNED_SHORT_5_6_5=33635]="UNSIGNED_SHORT_5_6_5",t[t.UNSIGNED_SHORT_4_4_4_4=32819]="UNSIGNED_SHORT_4_4_4_4",t[t.UNSIGNED_SHORT_5_5_5_1=32820]="UNSIGNED_SHORT_5_5_5_1",t[t.UNSIGNED_INT=5125]="UNSIGNED_INT",t[t.UNSIGNED_INT_10F_11F_11F_REV=35899]="UNSIGNED_INT_10F_11F_11F_REV",t[t.UNSIGNED_INT_2_10_10_10_REV=33640]="UNSIGNED_INT_2_10_10_10_REV",t[t.UNSIGNED_INT_24_8=34042]="UNSIGNED_INT_24_8",t[t.UNSIGNED_INT_5_9_9_9_REV=35902]="UNSIGNED_INT_5_9_9_9_REV",t[t.BYTE=5120]="BYTE",t[t.SHORT=5122]="SHORT",t[t.INT=5124]="INT",t[t.FLOAT=5126]="FLOAT",t[t.FLOAT_32_UNSIGNED_INT_24_8_REV=36269]="FLOAT_32_UNSIGNED_INT_24_8_REV",t[t.HALF_FLOAT=36193]="HALF_FLOAT"}(j||(j={})),function(t){t[t.FLOAT=0]="FLOAT",t[t.INT=1]="INT",t[t.UINT=2]="UINT"}(V||(V={})),function(t){t[t.NEAREST=0]="NEAREST",t[t.LINEAR=1]="LINEAR"}(W||(W={})),function(t){t[t.CLAMP=33071]="CLAMP",t[t.REPEAT=10497]="REPEAT",t[t.MIRRORED_REPEAT=33648]="MIRRORED_REPEAT"}(z||(z={})),function(t){t[t.OFF=0]="OFF",t[t.POW2=1]="POW2",t[t.ON=2]="ON",t[t.ON_MANUAL=3]="ON_MANUAL"}(q||(q={})),function(t){t[t.NPM=0]="NPM",t[t.UNPACK=1]="UNPACK",t[t.PMA=2]="PMA",t[t.NO_PREMULTIPLIED_ALPHA=0]="NO_PREMULTIPLIED_ALPHA",t[t.PREMULTIPLY_ON_UPLOAD=1]="PREMULTIPLY_ON_UPLOAD",t[t.PREMULTIPLY_ALPHA=2]="PREMULTIPLY_ALPHA",t[t.PREMULTIPLIED_ALPHA=2]="PREMULTIPLIED_ALPHA"}(K||(K={})),function(t){t[t.NO=0]="NO",t[t.YES=1]="YES",t[t.AUTO=2]="AUTO",t[t.BLEND=0]="BLEND",t[t.CLEAR=1]="CLEAR",t[t.BLIT=2]="BLIT"}(Z||(Z={})),function(t){t[t.AUTO=0]="AUTO",t[t.MANUAL=1]="MANUAL"}(Q||(Q={})),function(t){t.LOW="lowp",t.MEDIUM="mediump",t.HIGH="highp"}(J||(J={})),function(t){t[t.NONE=0]="NONE",t[t.SCISSOR=1]="SCISSOR",t[t.STENCIL=2]="STENCIL",t[t.SPRITE=3]="SPRITE"}($||($={})),function(t){t[t.NONE=0]="NONE",t[t.LOW=2]="LOW",t[t.MEDIUM=4]="MEDIUM",t[t.HIGH=8]="HIGH"}(tt||(tt={})),function(t){t[t.ELEMENT_ARRAY_BUFFER=34963]="ELEMENT_ARRAY_BUFFER",t[t.ARRAY_BUFFER=34962]="ARRAY_BUFFER",t[t.UNIFORM_BUFFER=35345]="UNIFORM_BUFFER"}(et||(et={}));var it={MIPMAP_TEXTURES:q.POW2,ANISOTROPIC_LEVEL:0,RESOLUTION:1,FILTER_RESOLUTION:1,FILTER_MULTISAMPLE:tt.NONE,SPRITE_MAX_TEXTURES:function(t){var e,r=!0;(rt.tablet||rt.phone)&&(rt.apple.device&&(e=navigator.userAgent.match(/OS (\d+)_(\d+)?/))&&parseInt(e[1],10)<11&&(r=!1),rt.android.device&&(e=navigator.userAgent.match(/Android\s([0-9.]*)/))&&parseInt(e[1],10)<7&&(r=!1));return r?32:4}(),SPRITE_BATCH_SIZE:4096,RENDER_OPTIONS:{view:null,antialias:!1,autoDensity:!1,backgroundColor:0,backgroundAlpha:1,useContextAlpha:!0,clearBeforeRender:!0,preserveDrawingBuffer:!1,width:800,height:600,legacy:!1},GC_MODE:Q.AUTO,GC_MAX_IDLE:3600,GC_MAX_CHECK_COUNT:600,WRAP_MODE:z.CLAMP,SCALE_MODE:W.LINEAR,PRECISION_VERTEX:J.HIGH,PRECISION_FRAGMENT:rt.apple.device?J.HIGH:J.MEDIUM,CAN_UPLOAD_SAME_BUFFER:!rt.apple.device,CREATE_IMAGE_BITMAP:!1,ROUND_PIXELS:!1},nt="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function ot(t,e,r){return t(r={path:e,exports:{},require:function(t,e){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==e&&r.path)}},r.exports),r.exports}var st=ot((function(t){var e=Object.prototype.hasOwnProperty,r="~";function i(){}function n(t,e,r){this.fn=t,this.context=e,this.once=r||!1}function o(t,e,i,o,s){if("function"!=typeof i)throw new TypeError("The listener must be a function");var a=new n(i,o||t,s),h=r?r+e:e;return t._events[h]?t._events[h].fn?t._events[h]=[t._events[h],a]:t._events[h].push(a):(t._events[h]=a,t._eventsCount++),t}function s(t,e){0==--t._eventsCount?t._events=new i:delete t._events[e]}function a(){this._events=new i,this._eventsCount=0}Object.create&&(i.prototype=Object.create(null),(new i).__proto__||(r=!1)),a.prototype.eventNames=function(){var t,i,n=[];if(0===this._eventsCount)return n;for(i in t=this._events)e.call(t,i)&&n.push(r?i.slice(1):i);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(t)):n},a.prototype.listeners=function(t){var e=r?r+t:t,i=this._events[e];if(!i)return[];if(i.fn)return[i.fn];for(var n=0,o=i.length,s=new Array(o);n80*r){i=o=t[0],n=s=t[1];for(var p=r;po&&(o=a),h>s&&(s=h);u=0!==(u=Math.max(o-i,s-n))?1/u:0}return dt(d,f,r,i,n,u),f}function lt(t,e,r,i,n){var o,s;if(n===wt(t,e,r,i)>0)for(o=e;o=e;o-=i)s=Pt(o,t[o],t[o+1],s);return s&&At(s,s.next)&&(Dt(s),s=s.next),s}function ct(t,e){if(!t)return t;e||(e=t);var r,i=t;do{if(r=!1,i.steiner||!At(i,i.next)&&0!==Rt(i.prev,i,i.next))i=i.next;else{if(Dt(i),(i=e=i.prev)===i.next)break;r=!0}}while(r||i!==e);return e}function dt(t,e,r,i,n,o,s){if(t){!s&&o&&function(t,e,r,i){var n=t;do{null===n.z&&(n.z=gt(n.x,n.y,e,r,i)),n.prevZ=n.prev,n.nextZ=n.next,n=n.next}while(n!==t);n.prevZ.nextZ=null,n.prevZ=null,function(t){var e,r,i,n,o,s,a,h,u=1;do{for(r=t,t=null,o=null,s=0;r;){for(s++,i=r,a=0,e=0;e0||h>0&&i;)0!==a&&(0===h||!i||r.z<=i.z)?(n=r,r=r.nextZ,a--):(n=i,i=i.nextZ,h--),o?o.nextZ=n:t=n,n.prevZ=o,o=n;r=i}o.nextZ=null,u*=2}while(s>1)}(n)}(t,i,n,o);for(var a,h,u=t;t.prev!==t.next;)if(a=t.prev,h=t.next,o?pt(t,i,n,o):ft(t))e.push(a.i/r),e.push(t.i/r),e.push(h.i/r),Dt(t),t=h.next,u=h.next;else if((t=h)===u){s?1===s?dt(t=_t(ct(t),e,r),e,r,i,n,o,2):2===s&&mt(t,e,r,i,n,o):dt(ct(t),e,r,i,n,o,1);break}}}function ft(t){var e=t.prev,r=t,i=t.next;if(Rt(e,r,i)>=0)return!1;for(var n=t.next.next;n!==t.prev;){if(bt(e.x,e.y,r.x,r.y,i.x,i.y,n.x,n.y)&&Rt(n.prev,n,n.next)>=0)return!1;n=n.next}return!0}function pt(t,e,r,i){var n=t.prev,o=t,s=t.next;if(Rt(n,o,s)>=0)return!1;for(var a=n.xo.x?n.x>s.x?n.x:s.x:o.x>s.x?o.x:s.x,l=n.y>o.y?n.y>s.y?n.y:s.y:o.y>s.y?o.y:s.y,c=gt(a,h,e,r,i),d=gt(u,l,e,r,i),f=t.prevZ,p=t.nextZ;f&&f.z>=c&&p&&p.z<=d;){if(f!==t.prev&&f!==t.next&&bt(n.x,n.y,o.x,o.y,s.x,s.y,f.x,f.y)&&Rt(f.prev,f,f.next)>=0)return!1;if(f=f.prevZ,p!==t.prev&&p!==t.next&&bt(n.x,n.y,o.x,o.y,s.x,s.y,p.x,p.y)&&Rt(p.prev,p,p.next)>=0)return!1;p=p.nextZ}for(;f&&f.z>=c;){if(f!==t.prev&&f!==t.next&&bt(n.x,n.y,o.x,o.y,s.x,s.y,f.x,f.y)&&Rt(f.prev,f,f.next)>=0)return!1;f=f.prevZ}for(;p&&p.z<=d;){if(p!==t.prev&&p!==t.next&&bt(n.x,n.y,o.x,o.y,s.x,s.y,p.x,p.y)&&Rt(p.prev,p,p.next)>=0)return!1;p=p.nextZ}return!0}function _t(t,e,r){var i=t;do{var n=i.prev,o=i.next.next;!At(n,o)&&St(n,i,i.next,o)&&Mt(n,o)&&Mt(o,n)&&(e.push(n.i/r),e.push(i.i/r),e.push(o.i/r),Dt(i),Dt(i.next),i=t=o),i=i.next}while(i!==t);return ct(i)}function mt(t,e,r,i,n,o){var s=t;do{for(var a=s.next.next;a!==s.prev;){if(s.i!==a.i&&xt(s,a)){var h=Nt(s,a);return s=ct(s,s.next),h=ct(h,h.next),dt(s,e,r,i,n,o),void dt(h,e,r,i,n,o)}a=a.next}s=s.next}while(s!==t)}function vt(t,e){return t.x-e.x}function Et(t,e){if(e=function(t,e){var r,i=e,n=t.x,o=t.y,s=-1/0;do{if(o<=i.y&&o>=i.next.y&&i.next.y!==i.y){var a=i.x+(o-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(a<=n&&a>s){if(s=a,a===n){if(o===i.y)return i;if(o===i.next.y)return i.next}r=i.x=i.x&&i.x>=l&&n!==i.x&&bt(or.x||i.x===r.x&&yt(r,i)))&&(r=i,d=h)),i=i.next}while(i!==u);return r}(t,e),e){var r=Nt(e,t);ct(e,e.next),ct(r,r.next)}}function yt(t,e){return Rt(t.prev,t,e.prev)<0&&Rt(e.next,t,t.next)<0}function gt(t,e,r,i,n){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*n)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-i)*n)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Tt(t){var e=t,r=t;do{(e.x=0&&(t-s)*(i-a)-(r-s)*(e-a)>=0&&(r-s)*(o-a)-(n-s)*(i-a)>=0}function xt(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&St(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}(t,e)&&(Mt(t,e)&&Mt(e,t)&&function(t,e){var r=t,i=!1,n=(t.x+e.x)/2,o=(t.y+e.y)/2;do{r.y>o!=r.next.y>o&&r.next.y!==r.y&&n<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(i=!i),r=r.next}while(r!==t);return i}(t,e)&&(Rt(t.prev,t,e.prev)||Rt(t,e.prev,e))||At(t,e)&&Rt(t.prev,t,t.next)>0&&Rt(e.prev,e,e.next)>0)}function Rt(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function At(t,e){return t.x===e.x&&t.y===e.y}function St(t,e,r,i){var n=It(Rt(t,e,r)),o=It(Rt(t,e,i)),s=It(Rt(r,i,t)),a=It(Rt(r,i,e));return n!==o&&s!==a||(!(0!==n||!Ot(t,r,e))||(!(0!==o||!Ot(t,i,e))||(!(0!==s||!Ot(r,t,i))||!(0!==a||!Ot(r,e,i)))))}function Ot(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function It(t){return t>0?1:t<0?-1:0}function Mt(t,e){return Rt(t.prev,t,t.next)<0?Rt(t,e,t.next)>=0&&Rt(t,t.prev,e)>=0:Rt(t,e,t.prev)<0||Rt(t,t.next,e)<0}function Nt(t,e){var r=new Ct(t.i,t.x,t.y),i=new Ct(e.i,e.x,e.y),n=t.next,o=e.prev;return t.next=e,e.prev=t,r.next=n,n.prev=r,i.next=r,r.prev=i,o.next=i,i.prev=o,i}function Pt(t,e,r,i){var n=new Ct(t,e,r);return i?(n.next=i.next,n.prev=i,i.next.prev=n,i.next=n):(n.prev=n,n.next=n),n}function Dt(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Ct(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function wt(t,e,r,i){for(var n=0,o=e,s=r-i;o0&&(i+=t[n-1].length,r.holes.push(i))}return r},at.default=ht;var Lt=ot((function(t,e){!function(r){var i=e&&!e.nodeType&&e,n=t&&!t.nodeType&&t,o="object"==typeof nt&&nt;o.global!==o&&o.window!==o&&o.self!==o||(r=o);var s,a,h=2147483647,u=36,l=/^xn--/,c=/[^\x20-\x7E]/,d=/[\x2E\u3002\uFF0E\uFF61]/g,f={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},p=Math.floor,_=String.fromCharCode;function m(t){throw RangeError(f[t])}function v(t,e){for(var r=t.length,i=[];r--;)i[r]=e(t[r]);return i}function E(t,e){var r=t.split("@"),i="";return r.length>1&&(i=r[0]+"@",t=r[1]),i+v((t=t.replace(d,".")).split("."),e).join(".")}function y(t){for(var e,r,i=[],n=0,o=t.length;n=55296&&e<=56319&&n65535&&(e+=_((t-=65536)>>>10&1023|55296),t=56320|1023&t),e+=_(t)})).join("")}function T(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function b(t,e,r){var i=0;for(t=r?p(t/700):t>>1,t+=p(t/e);t>455;i+=u)t=p(t/35);return p(i+36*t/(t+38))}function x(t){var e,r,i,n,o,s,a,l,c,d,f,_=[],v=t.length,E=0,y=128,T=72;for((r=t.lastIndexOf("-"))<0&&(r=0),i=0;i=128&&m("not-basic"),_.push(t.charCodeAt(i));for(n=r>0?r+1:0;n=v&&m("invalid-input"),((l=(f=t.charCodeAt(n++))-48<10?f-22:f-65<26?f-65:f-97<26?f-97:u)>=u||l>p((h-E)/s))&&m("overflow"),E+=l*s,!(l<(c=a<=T?1:a>=T+26?26:a-T));a+=u)s>p(h/(d=u-c))&&m("overflow"),s*=d;T=b(E-o,e=_.length+1,0==o),p(E/e)>h-y&&m("overflow"),y+=p(E/e),E%=e,_.splice(E++,0,y)}return g(_)}function R(t){var e,r,i,n,o,s,a,l,c,d,f,v,E,g,x,R=[];for(v=(t=y(t)).length,e=128,r=0,o=72,s=0;s=e&&fp((h-r)/(E=i+1))&&m("overflow"),r+=(a-e)*E,e=a,s=0;sh&&m("overflow"),f==e){for(l=r,c=u;!(l<(d=c<=o?1:c>=o+26?26:c-o));c+=u)x=l-d,g=u-d,R.push(_(T(d+x%g,0))),l=p(x/g);R.push(_(T(l,0))),o=b(r,E,i==n),r=0,++i}++r,++e}return R.join("")}if(s={version:"1.3.2",ucs2:{decode:y,encode:g},decode:x,encode:R,toASCII:function(t){return E(t,(function(t){return c.test(t)?"xn--"+R(t):t}))},toUnicode:function(t){return E(t,(function(t){return l.test(t)?x(t.slice(4).toLowerCase()):t}))}},i&&n)if(t.exports==i)n.exports=s;else for(a in s)s.hasOwnProperty(a)&&(i[a]=s[a]);else r.punycode=s}(nt)})),Ft=function(t){return"string"==typeof t},Ut=function(t){return"object"==typeof t&&null!==t},Bt=function(t){return null===t},Gt=function(t){return null==t};function Xt(t,e){return Object.prototype.hasOwnProperty.call(t,e)}var kt=function(t,e,r,i){e=e||"&",r=r||"=";var n={};if("string"!=typeof t||0===t.length)return n;var o=/\+/g;t=t.split(e);var s=1e3;i&&"number"==typeof i.maxKeys&&(s=i.maxKeys);var a=t.length;s>0&&a>s&&(a=s);for(var h=0;h=0?(u=f.substr(0,p),l=f.substr(p+1)):(u=f,l=""),c=decodeURIComponent(u),d=decodeURIComponent(l),Xt(n,c)?Array.isArray(n[c])?n[c].push(d):n[c]=[n[c],d]:n[c]=d}return n},Ht=function(t){switch(typeof t){case"string":return t;case"boolean":return t?"true":"false";case"number":return isFinite(t)?t:"";default:return""}},Yt=function(t,e,r,i){return e=e||"&",r=r||"=",null===t&&(t=void 0),"object"==typeof t?Object.keys(t).map((function(i){var n=encodeURIComponent(Ht(i))+r;return Array.isArray(t[i])?t[i].map((function(t){return n+encodeURIComponent(Ht(t))})).join(e):n+encodeURIComponent(Ht(t[i]))})).join(e):i?encodeURIComponent(Ht(i))+r+encodeURIComponent(Ht(t)):""},jt=ot((function(t,e){e.decode=e.parse=kt,e.encode=e.stringify=Yt})),Vt=ae,Wt=function(t,e){return ae(t,!1,!0).resolve(e)},zt=function(t){Ft(t)&&(t=ae(t));if(!(t instanceof qt))return qt.prototype.format.call(t);return t.format()};function qt(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}var Kt=/^([a-z0-9.+-]+:)/i,Zt=/:[0-9]*$/,Qt=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,Jt=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),$t=["'"].concat(Jt),te=["%","/","?",";","#"].concat($t),ee=["/","?","#"],re=/^[+a-z0-9A-Z_-]{0,63}$/,ie=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,ne={javascript:!0,"javascript:":!0},oe={javascript:!0,"javascript:":!0},se={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};function ae(t,e,r){if(t&&Ut(t)&&t instanceof qt)return t;var i=new qt;return i.parse(t,e,r),i}qt.prototype.parse=function(t,e,r){if(!Ft(t))throw new TypeError("Parameter 'url' must be a string, not "+typeof t);var i=t.indexOf("?"),n=-1!==i&&i127?g+="x":g+=y[T];if(!g.match(re)){var x=v.slice(0,p),R=v.slice(p+1),A=y.match(ie);A&&(x.push(A[1]),R.unshift(A[2])),R.length&&(s="/"+R.join(".")+s),this.hostname=x.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),m||(this.hostname=Lt.toASCII(this.hostname));var S=this.port?":"+this.port:"",O=this.hostname||"";this.host=O+S,this.href+=this.host,m&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==s[0]&&(s="/"+s))}if(!ne[u])for(p=0,E=$t.length;p0)&&r.host.split("@"))&&(r.auth=A.shift(),r.host=r.hostname=A.shift());return r.search=t.search,r.query=t.query,Bt(r.pathname)&&Bt(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.href=r.format(),r}if(!y.length)return r.pathname=null,r.search?r.path="/"+r.search:r.path=null,r.href=r.format(),r;for(var T=y.slice(-1)[0],b=(r.host||t.host||y.length>1)&&("."===T||".."===T)||""===T,x=0,R=y.length;R>=0;R--)"."===(T=y[R])?y.splice(R,1):".."===T?(y.splice(R,1),x++):x&&(y.splice(R,1),x--);if(!v&&!E)for(;x--;x)y.unshift("..");!v||""===y[0]||y[0]&&"/"===y[0].charAt(0)||y.unshift(""),b&&"/"!==y.join("/").substr(-1)&&y.push("");var A,S=""===y[0]||y[0]&&"/"===y[0].charAt(0);g&&(r.hostname=r.host=S?"":y.length?y.shift():"",(A=!!(r.host&&r.host.indexOf("@")>0)&&r.host.split("@"))&&(r.auth=A.shift(),r.host=r.hostname=A.shift()));return(v=v||r.host&&y.length)&&!S&&y.unshift(""),y.length?r.pathname=y.join("/"):(r.pathname=null,r.path=null),Bt(r.pathname)&&Bt(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.auth=t.auth||r.auth,r.slashes=r.slashes||t.slashes,r.href=r.format(),r},qt.prototype.parseHost=function(){var t=this.host,e=Zt.exec(t);e&&(":"!==(e=e[0])&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)};t.ENV=void 0,t.RENDERER_TYPE=void 0,t.BUFFER_BITS=void 0,t.BLEND_MODES=void 0,t.DRAW_MODES=void 0,t.FORMATS=void 0,t.TARGETS=void 0,t.TYPES=void 0,t.SAMPLER_TYPES=void 0,t.SCALE_MODES=void 0,t.WRAP_MODES=void 0,t.MIPMAP_MODES=void 0,t.ALPHA_MODES=void 0,t.CLEAR_MODES=void 0,t.GC_MODES=void 0,t.PRECISION=void 0,t.MASK_TYPES=void 0,t.MSAA_QUALITY=void 0,t.BUFFER_TYPE=void 0,function(t){t[t.WEBGL_LEGACY=0]="WEBGL_LEGACY",t[t.WEBGL=1]="WEBGL",t[t.WEBGL2=2]="WEBGL2"}(t.ENV||(t.ENV={})),function(t){t[t.UNKNOWN=0]="UNKNOWN",t[t.WEBGL=1]="WEBGL",t[t.CANVAS=2]="CANVAS"}(t.RENDERER_TYPE||(t.RENDERER_TYPE={})),function(t){t[t.COLOR=16384]="COLOR",t[t.DEPTH=256]="DEPTH",t[t.STENCIL=1024]="STENCIL"}(t.BUFFER_BITS||(t.BUFFER_BITS={})),function(t){t[t.NORMAL=0]="NORMAL",t[t.ADD=1]="ADD",t[t.MULTIPLY=2]="MULTIPLY",t[t.SCREEN=3]="SCREEN",t[t.OVERLAY=4]="OVERLAY",t[t.DARKEN=5]="DARKEN",t[t.LIGHTEN=6]="LIGHTEN",t[t.COLOR_DODGE=7]="COLOR_DODGE",t[t.COLOR_BURN=8]="COLOR_BURN",t[t.HARD_LIGHT=9]="HARD_LIGHT",t[t.SOFT_LIGHT=10]="SOFT_LIGHT",t[t.DIFFERENCE=11]="DIFFERENCE",t[t.EXCLUSION=12]="EXCLUSION",t[t.HUE=13]="HUE",t[t.SATURATION=14]="SATURATION",t[t.COLOR=15]="COLOR",t[t.LUMINOSITY=16]="LUMINOSITY",t[t.NORMAL_NPM=17]="NORMAL_NPM",t[t.ADD_NPM=18]="ADD_NPM",t[t.SCREEN_NPM=19]="SCREEN_NPM",t[t.NONE=20]="NONE",t[t.SRC_OVER=0]="SRC_OVER",t[t.SRC_IN=21]="SRC_IN",t[t.SRC_OUT=22]="SRC_OUT",t[t.SRC_ATOP=23]="SRC_ATOP",t[t.DST_OVER=24]="DST_OVER",t[t.DST_IN=25]="DST_IN",t[t.DST_OUT=26]="DST_OUT",t[t.DST_ATOP=27]="DST_ATOP",t[t.ERASE=26]="ERASE",t[t.SUBTRACT=28]="SUBTRACT",t[t.XOR=29]="XOR"}(t.BLEND_MODES||(t.BLEND_MODES={})),function(t){t[t.POINTS=0]="POINTS",t[t.LINES=1]="LINES",t[t.LINE_LOOP=2]="LINE_LOOP",t[t.LINE_STRIP=3]="LINE_STRIP",t[t.TRIANGLES=4]="TRIANGLES",t[t.TRIANGLE_STRIP=5]="TRIANGLE_STRIP",t[t.TRIANGLE_FAN=6]="TRIANGLE_FAN"}(t.DRAW_MODES||(t.DRAW_MODES={})),function(t){t[t.RGBA=6408]="RGBA",t[t.RGB=6407]="RGB",t[t.RG=33319]="RG",t[t.RED=6403]="RED",t[t.RGBA_INTEGER=36249]="RGBA_INTEGER",t[t.RGB_INTEGER=36248]="RGB_INTEGER",t[t.RG_INTEGER=33320]="RG_INTEGER",t[t.RED_INTEGER=36244]="RED_INTEGER",t[t.ALPHA=6406]="ALPHA",t[t.LUMINANCE=6409]="LUMINANCE",t[t.LUMINANCE_ALPHA=6410]="LUMINANCE_ALPHA",t[t.DEPTH_COMPONENT=6402]="DEPTH_COMPONENT",t[t.DEPTH_STENCIL=34041]="DEPTH_STENCIL"}(t.FORMATS||(t.FORMATS={})),function(t){t[t.TEXTURE_2D=3553]="TEXTURE_2D",t[t.TEXTURE_CUBE_MAP=34067]="TEXTURE_CUBE_MAP",t[t.TEXTURE_2D_ARRAY=35866]="TEXTURE_2D_ARRAY",t[t.TEXTURE_CUBE_MAP_POSITIVE_X=34069]="TEXTURE_CUBE_MAP_POSITIVE_X",t[t.TEXTURE_CUBE_MAP_NEGATIVE_X=34070]="TEXTURE_CUBE_MAP_NEGATIVE_X",t[t.TEXTURE_CUBE_MAP_POSITIVE_Y=34071]="TEXTURE_CUBE_MAP_POSITIVE_Y",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Y=34072]="TEXTURE_CUBE_MAP_NEGATIVE_Y",t[t.TEXTURE_CUBE_MAP_POSITIVE_Z=34073]="TEXTURE_CUBE_MAP_POSITIVE_Z",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Z=34074]="TEXTURE_CUBE_MAP_NEGATIVE_Z"}(t.TARGETS||(t.TARGETS={})),function(t){t[t.UNSIGNED_BYTE=5121]="UNSIGNED_BYTE",t[t.UNSIGNED_SHORT=5123]="UNSIGNED_SHORT",t[t.UNSIGNED_SHORT_5_6_5=33635]="UNSIGNED_SHORT_5_6_5",t[t.UNSIGNED_SHORT_4_4_4_4=32819]="UNSIGNED_SHORT_4_4_4_4",t[t.UNSIGNED_SHORT_5_5_5_1=32820]="UNSIGNED_SHORT_5_5_5_1",t[t.UNSIGNED_INT=5125]="UNSIGNED_INT",t[t.UNSIGNED_INT_10F_11F_11F_REV=35899]="UNSIGNED_INT_10F_11F_11F_REV",t[t.UNSIGNED_INT_2_10_10_10_REV=33640]="UNSIGNED_INT_2_10_10_10_REV",t[t.UNSIGNED_INT_24_8=34042]="UNSIGNED_INT_24_8",t[t.UNSIGNED_INT_5_9_9_9_REV=35902]="UNSIGNED_INT_5_9_9_9_REV",t[t.BYTE=5120]="BYTE",t[t.SHORT=5122]="SHORT",t[t.INT=5124]="INT",t[t.FLOAT=5126]="FLOAT",t[t.FLOAT_32_UNSIGNED_INT_24_8_REV=36269]="FLOAT_32_UNSIGNED_INT_24_8_REV",t[t.HALF_FLOAT=36193]="HALF_FLOAT"}(t.TYPES||(t.TYPES={})),function(t){t[t.FLOAT=0]="FLOAT",t[t.INT=1]="INT",t[t.UINT=2]="UINT"}(t.SAMPLER_TYPES||(t.SAMPLER_TYPES={})),function(t){t[t.NEAREST=0]="NEAREST",t[t.LINEAR=1]="LINEAR"}(t.SCALE_MODES||(t.SCALE_MODES={})),function(t){t[t.CLAMP=33071]="CLAMP",t[t.REPEAT=10497]="REPEAT",t[t.MIRRORED_REPEAT=33648]="MIRRORED_REPEAT"}(t.WRAP_MODES||(t.WRAP_MODES={})),function(t){t[t.OFF=0]="OFF",t[t.POW2=1]="POW2",t[t.ON=2]="ON",t[t.ON_MANUAL=3]="ON_MANUAL"}(t.MIPMAP_MODES||(t.MIPMAP_MODES={})),function(t){t[t.NPM=0]="NPM",t[t.UNPACK=1]="UNPACK",t[t.PMA=2]="PMA",t[t.NO_PREMULTIPLIED_ALPHA=0]="NO_PREMULTIPLIED_ALPHA",t[t.PREMULTIPLY_ON_UPLOAD=1]="PREMULTIPLY_ON_UPLOAD",t[t.PREMULTIPLY_ALPHA=2]="PREMULTIPLY_ALPHA",t[t.PREMULTIPLIED_ALPHA=2]="PREMULTIPLIED_ALPHA"}(t.ALPHA_MODES||(t.ALPHA_MODES={})),function(t){t[t.NO=0]="NO",t[t.YES=1]="YES",t[t.AUTO=2]="AUTO",t[t.BLEND=0]="BLEND",t[t.CLEAR=1]="CLEAR",t[t.BLIT=2]="BLIT"}(t.CLEAR_MODES||(t.CLEAR_MODES={})),function(t){t[t.AUTO=0]="AUTO",t[t.MANUAL=1]="MANUAL"}(t.GC_MODES||(t.GC_MODES={})),function(t){t.LOW="lowp",t.MEDIUM="mediump",t.HIGH="highp"}(t.PRECISION||(t.PRECISION={})),function(t){t[t.NONE=0]="NONE",t[t.SCISSOR=1]="SCISSOR",t[t.STENCIL=2]="STENCIL",t[t.SPRITE=3]="SPRITE"}(t.MASK_TYPES||(t.MASK_TYPES={})),function(t){t[t.NONE=0]="NONE",t[t.LOW=2]="LOW",t[t.MEDIUM=4]="MEDIUM",t[t.HIGH=8]="HIGH"}(t.MSAA_QUALITY||(t.MSAA_QUALITY={})),function(t){t[t.ELEMENT_ARRAY_BUFFER=34963]="ELEMENT_ARRAY_BUFFER",t[t.ARRAY_BUFFER=34962]="ARRAY_BUFFER",t[t.UNIFORM_BUFFER=35345]="UNIFORM_BUFFER"}(t.BUFFER_TYPE||(t.BUFFER_TYPE={}));var he={parse:Vt,format:zt,resolve:Wt};it.RETINA_PREFIX=/@([0-9\.]+)x/,it.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT=!1;var ue,le=!1;function ce(t){var e;if(!le){if(navigator.userAgent.toLowerCase().indexOf("chrome")>-1){var r=["\n %c %c %c PixiJS 6.4.2 - ✰ "+t+" ✰ %c %c http://www.pixijs.com/ %c %c ♥%c♥%c♥ \n\n","background: #ff66a5; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff66a5; background: #030307; padding:5px 0;","background: #ff66a5; padding:5px 0;","background: #ffc3dc; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;"];(e=globalThis.console).log.apply(e,r)}else globalThis.console&&globalThis.console.log("PixiJS 6.4.2 - "+t+" - http://www.pixijs.com/");le=!0}}function de(){return void 0===ue&&(ue=function(){var t={stencil:!0,failIfMajorPerformanceCaveat:it.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT};try{if(!globalThis.WebGLRenderingContext)return!1;var e=document.createElement("canvas"),r=e.getContext("webgl",t)||e.getContext("experimental-webgl",t),i=!(!r||!r.getContextAttributes().stencil);if(r){var n=r.getExtension("WEBGL_lose_context");n&&n.loseContext()}return r=null,i}catch(t){return!1}}()),ue}var fe={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};function pe(t,e){return void 0===e&&(e=[]),e[0]=(t>>16&255)/255,e[1]=(t>>8&255)/255,e[2]=(255&t)/255,e}function _e(t){var e=t.toString(16);return"#"+("000000".substring(0,6-e.length)+e)}function me(t){return"string"==typeof t&&"#"===(t=fe[t.toLowerCase()]||t)[0]&&(t=t.slice(1)),parseInt(t,16)}function ve(t){return(255*t[0]<<16)+(255*t[1]<<8)+(255*t[2]|0)}var Ee=function(){for(var e=[],r=[],i=0;i<32;i++)e[i]=i,r[i]=i;e[t.BLEND_MODES.NORMAL_NPM]=t.BLEND_MODES.NORMAL,e[t.BLEND_MODES.ADD_NPM]=t.BLEND_MODES.ADD,e[t.BLEND_MODES.SCREEN_NPM]=t.BLEND_MODES.SCREEN,r[t.BLEND_MODES.NORMAL]=t.BLEND_MODES.NORMAL_NPM,r[t.BLEND_MODES.ADD]=t.BLEND_MODES.ADD_NPM,r[t.BLEND_MODES.SCREEN]=t.BLEND_MODES.SCREEN_NPM;var n=[];return n.push(r),n.push(e),n}();function ye(t,e){return Ee[e?1:0][t]}function ge(t,e,r,i){return r=r||new Float32Array(4),i||void 0===i?(r[0]=t[0]*e,r[1]=t[1]*e,r[2]=t[2]*e):(r[0]=t[0],r[1]=t[1],r[2]=t[2]),r[3]=e,r}function Te(t,e){if(1===e)return(255*e<<24)+t;if(0===e)return 0;var r=t>>16&255,i=t>>8&255,n=255&t;return(255*e<<24)+((r=r*e+.5|0)<<16)+((i=i*e+.5|0)<<8)+(n*e+.5|0)}function be(t,e,r,i){return(r=r||new Float32Array(4))[0]=(t>>16&255)/255,r[1]=(t>>8&255)/255,r[2]=(255&t)/255,(i||void 0===i)&&(r[0]*=e,r[1]*=e,r[2]*=e),r[3]=e,r}function xe(t,e){void 0===e&&(e=null);var r=6*t;if((e=e||new Uint16Array(r)).length!==r)throw new Error("Out buffer length is incorrect, got "+e.length+" and expected "+r);for(var i=0,n=0;i>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,1+(t|=t>>>16)}function Oe(t){return!(t&t-1||!t)}function Ie(t){var e=(t>65535?1:0)<<4,r=((t>>>=e)>255?1:0)<<3;return e|=r,e|=r=((t>>>=r)>15?1:0)<<2,(e|=r=((t>>>=r)>3?1:0)<<1)|(t>>>=r)>>1}function Me(t,e,r){var i,n=t.length;if(!(e>=n||0===r)){var o=n-(r=e+r>n?n-e:r);for(i=e;i=this.x&&t=this.y&&et.right?t.right:this.right)<=r)return!1;var i=this.yt.bottom?t.bottom:this.bottom)>i}var n=this.left,o=this.right,s=this.top,a=this.bottom;if(o<=n||a<=s)return!1;var h=qe[0].set(t.left,t.top),u=qe[1].set(t.left,t.bottom),l=qe[2].set(t.right,t.top),c=qe[3].set(t.right,t.bottom);if(l.x<=h.x||u.y<=h.y)return!1;var d=Math.sign(e.a*e.d-e.b*e.c);if(0===d)return!1;if(e.apply(h,h),e.apply(u,u),e.apply(l,l),e.apply(c,c),Math.max(h.x,u.x,l.x,c.x)<=n||Math.min(h.x,u.x,l.x,c.x)>=o||Math.max(h.y,u.y,l.y,c.y)<=s||Math.min(h.y,u.y,l.y,c.y)>=a)return!1;var f=d*(u.y-h.y),p=d*(h.x-u.x),_=f*n+p*s,m=f*o+p*s,v=f*n+p*a,E=f*o+p*a;if(Math.max(_,m,v,E)<=f*h.x+p*h.y||Math.min(_,m,v,E)>=f*c.x+p*c.y)return!1;var y=d*(h.y-l.y),g=d*(l.x-h.x),T=y*n+g*s,b=y*o+g*s,x=y*n+g*a,R=y*o+g*a;return!(Math.max(T,b,x,R)<=y*h.x+g*h.y||Math.min(T,b,x,R)>=y*c.x+g*c.y)},e.prototype.pad=function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x-=t,this.y-=e,this.width+=2*t,this.height+=2*e,this},e.prototype.fit=function(t){var e=Math.max(this.x,t.x),r=Math.min(this.x+this.width,t.x+t.width),i=Math.max(this.y,t.y),n=Math.min(this.y+this.height,t.y+t.height);return this.x=e,this.width=Math.max(r-e,0),this.y=i,this.height=Math.max(n-i,0),this},e.prototype.ceil=function(t,e){void 0===t&&(t=1),void 0===e&&(e=.001);var r=Math.ceil((this.x+this.width-e)*t)/t,i=Math.ceil((this.y+this.height-e)*t)/t;return this.x=Math.floor((this.x+e)*t)/t,this.y=Math.floor((this.y+e)*t)/t,this.width=r-this.x,this.height=i-this.y,this},e.prototype.enlarge=function(t){var e=Math.min(this.x,t.x),r=Math.max(this.x+this.width,t.x+t.width),i=Math.min(this.y,t.y),n=Math.max(this.y+this.height,t.y+t.height);return this.x=e,this.width=r-e,this.y=i,this.height=n-i,this},e}(),Ze=function(){function e(e,r,i){void 0===e&&(e=0),void 0===r&&(r=0),void 0===i&&(i=0),this.x=e,this.y=r,this.radius=i,this.type=t.SHAPES.CIRC}return e.prototype.clone=function(){return new e(this.x,this.y,this.radius)},e.prototype.contains=function(t,e){if(this.radius<=0)return!1;var r=this.radius*this.radius,i=this.x-t,n=this.y-e;return(i*=i)+(n*=n)<=r},e.prototype.getBounds=function(){return new Ke(this.x-this.radius,this.y-this.radius,2*this.radius,2*this.radius)},e}(),Qe=function(){function e(e,r,i,n){void 0===e&&(e=0),void 0===r&&(r=0),void 0===i&&(i=0),void 0===n&&(n=0),this.x=e,this.y=r,this.width=i,this.height=n,this.type=t.SHAPES.ELIP}return e.prototype.clone=function(){return new e(this.x,this.y,this.width,this.height)},e.prototype.contains=function(t,e){if(this.width<=0||this.height<=0)return!1;var r=(t-this.x)/this.width,i=(e-this.y)/this.height;return(r*=r)+(i*=i)<=1},e.prototype.getBounds=function(){return new Ke(this.x-this.width,this.y-this.height,this.width,this.height)},e}(),Je=function(){function e(){for(var e=arguments,r=[],i=0;ie!=u>e&&t<(e-a)/(u-a)*(h-s)+s&&(r=!r)}return r},e}(),$e=function(){function e(e,r,i,n,o){void 0===e&&(e=0),void 0===r&&(r=0),void 0===i&&(i=0),void 0===n&&(n=0),void 0===o&&(o=20),this.x=e,this.y=r,this.width=i,this.height=n,this.radius=o,this.type=t.SHAPES.RREC}return e.prototype.clone=function(){return new e(this.x,this.y,this.width,this.height,this.radius)},e.prototype.contains=function(t,e){if(this.width<=0||this.height<=0)return!1;if(t>=this.x&&t<=this.x+this.width&&e>=this.y&&e<=this.y+this.height){var r=Math.max(0,Math.min(this.radius,Math.min(this.width,this.height)/2));if(e>=this.y+r&&e<=this.y+this.height-r||t>=this.x+r&&t<=this.x+this.width-r)return!0;var i=t-(this.x+r),n=e-(this.y+r),o=r*r;if(i*i+n*n<=o)return!0;if((i=t-(this.x+this.width-r))*i+n*n<=o)return!0;if(i*i+(n=e-(this.y+this.height-r))*n<=o)return!0;if((i=t-(this.x+r))*i+n*n<=o)return!0}return!1},e}(),tr=function(){function t(t,e,r,i){void 0===r&&(r=0),void 0===i&&(i=0),this._x=r,this._y=i,this.cb=t,this.scope=e}return t.prototype.clone=function(e,r){return void 0===e&&(e=this.cb),void 0===r&&(r=this.scope),new t(e,r,this._x,this._y)},t.prototype.set=function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this._x===t&&this._y===e||(this._x=t,this._y=e,this.cb.call(this.scope)),this},t.prototype.copyFrom=function(t){return this._x===t.x&&this._y===t.y||(this._x=t.x,this._y=t.y,this.cb.call(this.scope)),this},t.prototype.copyTo=function(t){return t.set(this._x,this._y),t},t.prototype.equals=function(t){return t.x===this._x&&t.y===this._y},Object.defineProperty(t.prototype,"x",{get:function(){return this._x},set:function(t){this._x!==t&&(this._x=t,this.cb.call(this.scope))},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"y",{get:function(){return this._y},set:function(t){this._y!==t&&(this._y=t,this.cb.call(this.scope))},enumerable:!1,configurable:!0}),t}(),er=function(){function t(t,e,r,i,n,o){void 0===t&&(t=1),void 0===e&&(e=0),void 0===r&&(r=0),void 0===i&&(i=1),void 0===n&&(n=0),void 0===o&&(o=0),this.array=null,this.a=t,this.b=e,this.c=r,this.d=i,this.tx=n,this.ty=o}return t.prototype.fromArray=function(t){this.a=t[0],this.b=t[1],this.c=t[3],this.d=t[4],this.tx=t[2],this.ty=t[5]},t.prototype.set=function(t,e,r,i,n,o){return this.a=t,this.b=e,this.c=r,this.d=i,this.tx=n,this.ty=o,this},t.prototype.toArray=function(t,e){this.array||(this.array=new Float32Array(9));var r=e||this.array;return t?(r[0]=this.a,r[1]=this.b,r[2]=0,r[3]=this.c,r[4]=this.d,r[5]=0,r[6]=this.tx,r[7]=this.ty,r[8]=1):(r[0]=this.a,r[1]=this.c,r[2]=this.tx,r[3]=this.b,r[4]=this.d,r[5]=this.ty,r[6]=0,r[7]=0,r[8]=1),r},t.prototype.apply=function(t,e){e=e||new ze;var r=t.x,i=t.y;return e.x=this.a*r+this.c*i+this.tx,e.y=this.b*r+this.d*i+this.ty,e},t.prototype.applyInverse=function(t,e){e=e||new ze;var r=1/(this.a*this.d+this.c*-this.b),i=t.x,n=t.y;return e.x=this.d*r*i+-this.c*r*n+(this.ty*this.c-this.tx*this.d)*r,e.y=this.a*r*n+-this.b*r*i+(-this.ty*this.a+this.tx*this.b)*r,e},t.prototype.translate=function(t,e){return this.tx+=t,this.ty+=e,this},t.prototype.scale=function(t,e){return this.a*=t,this.d*=e,this.c*=t,this.b*=e,this.tx*=t,this.ty*=e,this},t.prototype.rotate=function(t){var e=Math.cos(t),r=Math.sin(t),i=this.a,n=this.c,o=this.tx;return this.a=i*e-this.b*r,this.b=i*r+this.b*e,this.c=n*e-this.d*r,this.d=n*r+this.d*e,this.tx=o*e-this.ty*r,this.ty=o*r+this.ty*e,this},t.prototype.append=function(t){var e=this.a,r=this.b,i=this.c,n=this.d;return this.a=t.a*e+t.b*i,this.b=t.a*r+t.b*n,this.c=t.c*e+t.d*i,this.d=t.c*r+t.d*n,this.tx=t.tx*e+t.ty*i+this.tx,this.ty=t.tx*r+t.ty*n+this.ty,this},t.prototype.setTransform=function(t,e,r,i,n,o,s,a,h){return this.a=Math.cos(s+h)*n,this.b=Math.sin(s+h)*n,this.c=-Math.sin(s-a)*o,this.d=Math.cos(s-a)*o,this.tx=t-(r*this.a+i*this.c),this.ty=e-(r*this.b+i*this.d),this},t.prototype.prepend=function(t){var e=this.tx;if(1!==t.a||0!==t.b||0!==t.c||1!==t.d){var r=this.a,i=this.c;this.a=r*t.a+this.b*t.c,this.b=r*t.b+this.b*t.d,this.c=i*t.a+this.d*t.c,this.d=i*t.b+this.d*t.d}return this.tx=e*t.a+this.ty*t.c+t.tx,this.ty=e*t.b+this.ty*t.d+t.ty,this},t.prototype.decompose=function(t){var e=this.a,r=this.b,i=this.c,n=this.d,o=t.pivot,s=-Math.atan2(-i,n),a=Math.atan2(r,e),h=Math.abs(s+a);return h<1e-5||Math.abs(je-h)<1e-5?(t.rotation=a,t.skew.x=t.skew.y=0):(t.rotation=0,t.skew.x=s,t.skew.y=a),t.scale.x=Math.sqrt(e*e+r*r),t.scale.y=Math.sqrt(i*i+n*n),t.position.x=this.tx+(o.x*e+o.y*i),t.position.y=this.ty+(o.x*r+o.y*n),t},t.prototype.invert=function(){var t=this.a,e=this.b,r=this.c,i=this.d,n=this.tx,o=t*i-e*r;return this.a=i/o,this.b=-e/o,this.c=-r/o,this.d=t/o,this.tx=(r*this.ty-i*n)/o,this.ty=-(t*this.ty-e*n)/o,this},t.prototype.identity=function(){return this.a=1,this.b=0,this.c=0,this.d=1,this.tx=0,this.ty=0,this},t.prototype.clone=function(){var e=new t;return e.a=this.a,e.b=this.b,e.c=this.c,e.d=this.d,e.tx=this.tx,e.ty=this.ty,e},t.prototype.copyTo=function(t){return t.a=this.a,t.b=this.b,t.c=this.c,t.d=this.d,t.tx=this.tx,t.ty=this.ty,t},t.prototype.copyFrom=function(t){return this.a=t.a,this.b=t.b,this.c=t.c,this.d=t.d,this.tx=t.tx,this.ty=t.ty,this},Object.defineProperty(t,"IDENTITY",{get:function(){return new t},enumerable:!1,configurable:!0}),Object.defineProperty(t,"TEMP_MATRIX",{get:function(){return new t},enumerable:!1,configurable:!0}),t}(),rr=[1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1,0,1],ir=[0,1,1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1],nr=[0,-1,-1,-1,0,1,1,1,0,1,1,1,0,-1,-1,-1],or=[1,1,0,-1,-1,-1,0,1,-1,-1,0,1,1,1,0,-1],sr=[],ar=[],hr=Math.sign;!function(){for(var t=0;t<16;t++){var e=[];sr.push(e);for(var r=0;r<16;r++)for(var i=hr(rr[t]*rr[r]+nr[t]*ir[r]),n=hr(ir[t]*rr[r]+or[t]*ir[r]),o=hr(rr[t]*nr[r]+nr[t]*or[r]),s=hr(ir[t]*nr[r]+or[t]*or[r]),a=0;a<16;a++)if(rr[a]===i&&ir[a]===n&&nr[a]===o&&or[a]===s){e.push(a);break}}for(t=0;t<16;t++){var h=new er;h.set(rr[t],ir[t],nr[t],or[t],0,0),ar.push(h)}}();var ur={E:0,SE:1,S:2,SW:3,W:4,NW:5,N:6,NE:7,MIRROR_VERTICAL:8,MAIN_DIAGONAL:10,MIRROR_HORIZONTAL:12,REVERSE_DIAGONAL:14,uX:function(t){return rr[t]},uY:function(t){return ir[t]},vX:function(t){return nr[t]},vY:function(t){return or[t]},inv:function(t){return 8&t?15&t:7&-t},add:function(t,e){return sr[t][e]},sub:function(t,e){return sr[t][ur.inv(e)]},rotate180:function(t){return 4^t},isVertical:function(t){return 2==(3&t)},byDirection:function(t,e){return 2*Math.abs(t)<=Math.abs(e)?e>=0?ur.S:ur.N:2*Math.abs(e)<=Math.abs(t)?t>0?ur.E:ur.W:e>0?t>0?ur.SE:ur.SW:t>0?ur.NE:ur.NW},matrixAppendRotationInv:function(t,e,r,i){void 0===r&&(r=0),void 0===i&&(i=0);var n=ar[ur.inv(e)];n.tx=r,n.ty=i,t.append(n)}},lr=function(){function t(){this.worldTransform=new er,this.localTransform=new er,this.position=new tr(this.onChange,this,0,0),this.scale=new tr(this.onChange,this,1,1),this.pivot=new tr(this.onChange,this,0,0),this.skew=new tr(this.updateSkew,this,0,0),this._rotation=0,this._cx=1,this._sx=0,this._cy=0,this._sy=1,this._localID=0,this._currentLocalID=0,this._worldID=0,this._parentID=0}return t.prototype.onChange=function(){this._localID++},t.prototype.updateSkew=function(){this._cx=Math.cos(this._rotation+this.skew.y),this._sx=Math.sin(this._rotation+this.skew.y),this._cy=-Math.sin(this._rotation-this.skew.x),this._sy=Math.cos(this._rotation-this.skew.x),this._localID++},t.prototype.updateLocalTransform=function(){var t=this.localTransform;this._localID!==this._currentLocalID&&(t.a=this._cx*this.scale.x,t.b=this._sx*this.scale.x,t.c=this._cy*this.scale.y,t.d=this._sy*this.scale.y,t.tx=this.position.x-(this.pivot.x*t.a+this.pivot.y*t.c),t.ty=this.position.y-(this.pivot.x*t.b+this.pivot.y*t.d),this._currentLocalID=this._localID,this._parentID=-1)},t.prototype.updateTransform=function(t){var e=this.localTransform;if(this._localID!==this._currentLocalID&&(e.a=this._cx*this.scale.x,e.b=this._sx*this.scale.x,e.c=this._cy*this.scale.y,e.d=this._sy*this.scale.y,e.tx=this.position.x-(this.pivot.x*e.a+this.pivot.y*e.c),e.ty=this.position.y-(this.pivot.x*e.b+this.pivot.y*e.d),this._currentLocalID=this._localID,this._parentID=-1),this._parentID!==t._worldID){var r=t.worldTransform,i=this.worldTransform;i.a=e.a*r.a+e.b*r.c,i.b=e.a*r.b+e.b*r.d,i.c=e.c*r.a+e.d*r.c,i.d=e.c*r.b+e.d*r.d,i.tx=e.tx*r.a+e.ty*r.c+r.tx,i.ty=e.tx*r.b+e.ty*r.d+r.ty,this._parentID=t._worldID,this._worldID++}},t.prototype.setFromMatrix=function(t){t.decompose(this),this._localID++},Object.defineProperty(t.prototype,"rotation",{get:function(){return this._rotation},set:function(t){this._rotation!==t&&(this._rotation=t,this.updateSkew())},enumerable:!1,configurable:!0}),t.IDENTITY=new t,t}();it.SORTABLE_CHILDREN=!1;var cr=function(){function t(){this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,this.rect=null,this.updateID=-1}return t.prototype.isEmpty=function(){return this.minX>this.maxX||this.minY>this.maxY},t.prototype.clear=function(){this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0},t.prototype.getRectangle=function(t){return this.minX>this.maxX||this.minY>this.maxY?Ke.EMPTY:((t=t||new Ke(0,0,1,1)).x=this.minX,t.y=this.minY,t.width=this.maxX-this.minX,t.height=this.maxY-this.minY,t)},t.prototype.addPoint=function(t){this.minX=Math.min(this.minX,t.x),this.maxX=Math.max(this.maxX,t.x),this.minY=Math.min(this.minY,t.y),this.maxY=Math.max(this.maxY,t.y)},t.prototype.addPointMatrix=function(t,e){var r=t.a,i=t.b,n=t.c,o=t.d,s=t.tx,a=t.ty,h=r*e.x+n*e.y+s,u=i*e.x+o*e.y+a;this.minX=Math.min(this.minX,h),this.maxX=Math.max(this.maxX,h),this.minY=Math.min(this.minY,u),this.maxY=Math.max(this.maxY,u)},t.prototype.addQuad=function(t){var e=this.minX,r=this.minY,i=this.maxX,n=this.maxY,o=t[0],s=t[1];e=oi?o:i,n=s>n?s:n,e=(o=t[2])i?o:i,n=s>n?s:n,e=(o=t[4])i?o:i,n=s>n?s:n,e=(o=t[6])i?o:i,n=s>n?s:n,this.minX=e,this.minY=r,this.maxX=i,this.maxY=n},t.prototype.addFrame=function(t,e,r,i,n){this.addFrameMatrix(t.worldTransform,e,r,i,n)},t.prototype.addFrameMatrix=function(t,e,r,i,n){var o=t.a,s=t.b,a=t.c,h=t.d,u=t.tx,l=t.ty,c=this.minX,d=this.minY,f=this.maxX,p=this.maxY,_=o*e+a*r+u,m=s*e+h*r+l;c=_f?_:f,p=m>p?m:p,c=(_=o*i+a*r+u)f?_:f,p=m>p?m:p,c=(_=o*e+a*n+u)f?_:f,p=m>p?m:p,c=(_=o*i+a*n+u)f?_:f,p=m>p?m:p,this.minX=c,this.minY=d,this.maxX=f,this.maxY=p},t.prototype.addVertexData=function(t,e,r){for(var i=this.minX,n=this.minY,o=this.maxX,s=this.maxY,a=e;ao?h:o,s=u>s?u:s}this.minX=i,this.minY=n,this.maxX=o,this.maxY=s},t.prototype.addVertices=function(t,e,r,i){this.addVerticesMatrix(t.worldTransform,e,r,i)},t.prototype.addVerticesMatrix=function(t,e,r,i,n,o){void 0===n&&(n=0),void 0===o&&(o=n);for(var s=t.a,a=t.b,h=t.c,u=t.d,l=t.tx,c=t.ty,d=this.minX,f=this.minY,p=this.maxX,_=this.maxY,m=r;mi?t.maxX:i,this.maxY=t.maxY>n?t.maxY:n},t.prototype.addBoundsMask=function(t,e){var r=t.minX>e.minX?t.minX:e.minX,i=t.minY>e.minY?t.minY:e.minY,n=t.maxXh?n:h,this.maxY=o>u?o:u}},t.prototype.addBoundsMatrix=function(t,e){this.addFrameMatrix(e,t.minX,t.minY,t.maxX,t.maxY)},t.prototype.addBoundsArea=function(t,e){var r=t.minX>e.x?t.minX:e.x,i=t.minY>e.y?t.minY:e.y,n=t.maxXh?n:h,this.maxY=o>u?o:u}},t.prototype.pad=function(t,e){void 0===t&&(t=0),void 0===e&&(e=t),this.isEmpty()||(this.minX-=t,this.maxX+=t,this.minY-=e,this.maxY+=e)},t.prototype.addFramePad=function(t,e,r,i,n,o){t-=n,e-=o,r+=n,i+=o,this.minX=this.minXr?this.maxX:r,this.minY=this.minYi?this.maxY:i},t}(),dr=function(t,e){return dr=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},dr(t,e)};function fr(t,e){function r(){this.constructor=t}dr(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}var pr,_r,mr,vr,Er,yr,gr,Tr,br,xr,Rr,Ar,Sr,Or,Ir,Mr,Nr,Pr,Dr,Cr=function(t){function e(){var e=t.call(this)||this;return e.tempDisplayObjectParent=null,e.transform=new lr,e.alpha=1,e.visible=!0,e.renderable=!0,e.cullable=!1,e.cullArea=null,e.parent=null,e.worldAlpha=1,e._lastSortedIndex=0,e._zIndex=0,e.filterArea=null,e.filters=null,e._enabledFilters=null,e._bounds=new cr,e._localBounds=null,e._boundsID=0,e._boundsRect=null,e._localBoundsRect=null,e._mask=null,e._maskRefCount=0,e._destroyed=!1,e.isSprite=!1,e.isMask=!1,e}return fr(e,t),e.mixin=function(t){for(var r=Object.keys(t),i=0;i1)for(var i=0;ithis.children.length)throw new Error(t+"addChildAt: The index "+e+" supplied is out of bounds "+this.children.length);return t.parent&&t.parent.removeChild(t),t.parent=this,this.sortDirty=!0,t.transform._parentID=-1,this.children.splice(e,0,t),this._boundsID++,this.onChildrenChange(e),t.emit("added",this),this.emit("childAdded",t,this,e),t},e.prototype.swapChildren=function(t,e){if(t!==e){var r=this.getChildIndex(t),i=this.getChildIndex(e);this.children[r]=e,this.children[i]=t,this.onChildrenChange(r=this.children.length)throw new Error("The index "+e+" supplied is out of bounds "+this.children.length);var r=this.getChildIndex(t);Me(this.children,r,1),this.children.splice(e,0,t),this.onChildrenChange(e)},e.prototype.getChildAt=function(t){if(t<0||t>=this.children.length)throw new Error("getChildAt: Index ("+t+") does not exist.");return this.children[t]},e.prototype.removeChild=function(){for(var t=arguments,e=[],r=0;r1)for(var i=0;i0&&n<=e){r=this.children.splice(i,n);for(var o=0;o1&&this.children.sort(Lr),this.sortDirty=!1},e.prototype.updateTransform=function(){this.sortableChildren&&this.sortDirty&&this.sortChildren(),this._boundsID++,this.transform.updateTransform(this.parent.transform),this.worldAlpha=this.alpha*this.parent.worldAlpha;for(var t=0,e=this.children.length;t0&&r.height>0){var i,n;if(this.cullArea?(i=this.cullArea,n=this.worldTransform):this._render!==e.prototype._render&&(i=this.getBounds(!0)),i&&r.intersects(i,n))this._render(t);else if(this.cullArea)return;for(var o=0,s=this.children.length;o title : "+t.title+"
tabIndex: "+t.tabIndex},t.prototype.capHitArea=function(t){t.x<0&&(t.width+=t.x,t.x=0),t.y<0&&(t.height+=t.y,t.y=0);var e=this.renderer,r=e.width,i=e.height;t.x+t.width>r&&(t.width=r-t.x),t.y+t.height>i&&(t.height=i-t.y)},t.prototype.addChild=function(t){var e=this.pool.pop();e||((e=document.createElement("button")).style.width="100px",e.style.height="100px",e.style.backgroundColor=this.debug?"rgba(255,255,255,0.5)":"transparent",e.style.position="absolute",e.style.zIndex=2..toString(),e.style.borderStyle="none",navigator.userAgent.toLowerCase().indexOf("chrome")>-1?e.setAttribute("aria-live","off"):e.setAttribute("aria-live","polite"),navigator.userAgent.match(/rv:.*Gecko\//)?e.setAttribute("aria-relevant","additions"):e.setAttribute("aria-relevant","text"),e.addEventListener("click",this._onClick.bind(this)),e.addEventListener("focus",this._onFocus.bind(this)),e.addEventListener("focusout",this._onFocusOut.bind(this))),e.style.pointerEvents=t.accessiblePointerEvents,e.type=t.accessibleType,t.accessibleTitle&&null!==t.accessibleTitle?e.title=t.accessibleTitle:t.accessibleHint&&null!==t.accessibleHint||(e.title="displayObject "+t.tabIndex),t.accessibleHint&&null!==t.accessibleHint&&e.setAttribute("aria-label",t.accessibleHint),this.debug&&this.updateDebugHTML(e),t._accessibleActive=!0,t._accessibleDiv=e,e.displayObject=t,this.children.push(t),this.div.appendChild(t._accessibleDiv),t._accessibleDiv.tabIndex=t.tabIndex},t.prototype._onClick=function(t){var e=this.renderer.plugins.interaction,r=t.target.displayObject,i=e.eventData;e.dispatchEvent(r,"click",i),e.dispatchEvent(r,"pointertap",i),e.dispatchEvent(r,"tap",i)},t.prototype._onFocus=function(t){t.target.getAttribute("aria-live")||t.target.setAttribute("aria-live","assertive");var e=this.renderer.plugins.interaction,r=t.target.displayObject,i=e.eventData;e.dispatchEvent(r,"mouseover",i)},t.prototype._onFocusOut=function(t){t.target.getAttribute("aria-live")||t.target.setAttribute("aria-live","polite");var e=this.renderer.plugins.interaction,r=t.target.displayObject,i=e.eventData;e.dispatchEvent(r,"mouseout",i)},t.prototype._onKeyDown=function(t){9===t.keyCode&&this.activate()},t.prototype._onMouseMove=function(t){0===t.movementX&&0===t.movementY||this.deactivate()},t.prototype.destroy=function(){this.destroyTouchHook(),this.div=null,globalThis.document.removeEventListener("mousemove",this._onMouseMove,!0),globalThis.removeEventListener("keydown",this._onKeyDown),this.pool=null,this.children=null,this.renderer=null},t}();t.UPDATE_PRIORITY=void 0,it.TARGET_FPMS=.06,function(t){t[t.INTERACTION=50]="INTERACTION",t[t.HIGH=25]="HIGH",t[t.NORMAL=0]="NORMAL",t[t.LOW=-25]="LOW",t[t.UTILITY=-50]="UTILITY"}(t.UPDATE_PRIORITY||(t.UPDATE_PRIORITY={}));var Gr=function(){function t(t,e,r,i){void 0===e&&(e=null),void 0===r&&(r=0),void 0===i&&(i=!1),this.next=null,this.previous=null,this._destroyed=!1,this.fn=t,this.context=e,this.priority=r,this.once=i}return t.prototype.match=function(t,e){return void 0===e&&(e=null),this.fn===t&&this.context===e},t.prototype.emit=function(t){this.fn&&(this.context?this.fn.call(this.context,t):this.fn(t));var e=this.next;return this.once&&this.destroy(!0),this._destroyed&&(this.next=null),e},t.prototype.connect=function(t){this.previous=t,t.next&&(t.next.previous=this),this.next=t.next,t.next=this},t.prototype.destroy=function(t){void 0===t&&(t=!1),this._destroyed=!0,this.fn=null,this.context=null,this.previous&&(this.previous.next=this.next),this.next&&(this.next.previous=this.previous);var e=this.next;return this.next=t?null:e,this.previous=null,e},t}(),Xr=function(){function e(){var t=this;this.autoStart=!1,this.deltaTime=1,this.lastTime=-1,this.speed=1,this.started=!1,this._requestId=null,this._maxElapsedMS=100,this._minElapsedMS=0,this._protected=!1,this._lastFrame=-1,this._head=new Gr(null,null,1/0),this.deltaMS=1/it.TARGET_FPMS,this.elapsedMS=1/it.TARGET_FPMS,this._tick=function(e){t._requestId=null,t.started&&(t.update(e),t.started&&null===t._requestId&&t._head.next&&(t._requestId=requestAnimationFrame(t._tick)))}}return e.prototype._requestIfNeeded=function(){null===this._requestId&&this._head.next&&(this.lastTime=performance.now(),this._lastFrame=this.lastTime,this._requestId=requestAnimationFrame(this._tick))},e.prototype._cancelIfNeeded=function(){null!==this._requestId&&(cancelAnimationFrame(this._requestId),this._requestId=null)},e.prototype._startIfPossible=function(){this.started?this._requestIfNeeded():this.autoStart&&this.start()},e.prototype.add=function(e,r,i){return void 0===i&&(i=t.UPDATE_PRIORITY.NORMAL),this._addListener(new Gr(e,r,i))},e.prototype.addOnce=function(e,r,i){return void 0===i&&(i=t.UPDATE_PRIORITY.NORMAL),this._addListener(new Gr(e,r,i,!0))},e.prototype._addListener=function(t){var e=this._head.next,r=this._head;if(e){for(;e;){if(t.priority>e.priority){t.connect(r);break}r=e,e=e.next}t.previous||t.connect(r)}else t.connect(r);return this._startIfPossible(),this},e.prototype.remove=function(t,e){for(var r=this._head.next;r;)r=r.match(t,e)?r.destroy():r.next;return this._head.next||this._cancelIfNeeded(),this},Object.defineProperty(e.prototype,"count",{get:function(){if(!this._head)return 0;for(var t=0,e=this._head;e=e.next;)t++;return t},enumerable:!1,configurable:!0}),e.prototype.start=function(){this.started||(this.started=!0,this._requestIfNeeded())},e.prototype.stop=function(){this.started&&(this.started=!1,this._cancelIfNeeded())},e.prototype.destroy=function(){if(!this._protected){this.stop();for(var t=this._head.next;t;)t=t.destroy(!0);this._head.destroy(),this._head=null}},e.prototype.update=function(t){var e;if(void 0===t&&(t=performance.now()),t>this.lastTime){if((e=this.elapsedMS=t-this.lastTime)>this._maxElapsedMS&&(e=this._maxElapsedMS),e*=this.speed,this._minElapsedMS){var r=t-this._lastFrame|0;if(r=0;l--){var c=u[l],d=this.recursiveFindHit(t,c,r,i,a);if(d){if(!c.parent)continue;a=!1,d&&(t.target&&(i=!1),s=!0)}}return n&&(i&&!t.target&&!e.hitArea&&e.containsPoint&&e.containsPoint(o)&&(s=!0),e.interactive&&(s&&!t.target&&(t.target=e),r&&r(t,e,!!s))),s},t.prototype.findHit=function(t,e,r,i){this.recursiveFindHit(t,e,r,i,!1)},t}(),zr={interactive:!1,interactiveChildren:!0,hitArea:null,get buttonMode(){return"pointer"===this.cursor},set buttonMode(t){t?this.cursor="pointer":"pointer"===this.cursor&&(this.cursor=null)},cursor:null,get trackedPointers(){return void 0===this._trackedPointers&&(this._trackedPointers={}),this._trackedPointers},_trackedPointers:void 0};Cr.mixin(zr);var qr={target:null,data:{global:null}},Kr=function(e){function r(t,r){var i=e.call(this)||this;return r=r||{},i.renderer=t,i.autoPreventDefault=void 0===r.autoPreventDefault||r.autoPreventDefault,i.interactionFrequency=r.interactionFrequency||10,i.mouse=new Hr,i.mouse.identifier=1,i.mouse.global.set(-999999),i.activeInteractionData={},i.activeInteractionData[1]=i.mouse,i.interactionDataPool=[],i.eventData=new jr,i.interactionDOMElement=null,i.moveWhenInside=!1,i.eventsAdded=!1,i.tickerAdded=!1,i.mouseOverRenderer=!("PointerEvent"in globalThis),i.supportsTouchEvents="ontouchstart"in globalThis,i.supportsPointerEvents=!!globalThis.PointerEvent,i.onPointerUp=i.onPointerUp.bind(i),i.processPointerUp=i.processPointerUp.bind(i),i.onPointerCancel=i.onPointerCancel.bind(i),i.processPointerCancel=i.processPointerCancel.bind(i),i.onPointerDown=i.onPointerDown.bind(i),i.processPointerDown=i.processPointerDown.bind(i),i.onPointerMove=i.onPointerMove.bind(i),i.processPointerMove=i.processPointerMove.bind(i),i.onPointerOut=i.onPointerOut.bind(i),i.processPointerOverOut=i.processPointerOverOut.bind(i),i.onPointerOver=i.onPointerOver.bind(i),i.cursorStyles={default:"inherit",pointer:"pointer"},i.currentCursorMode=null,i.cursor=null,i.resolution=1,i.delayedEvents=[],i.search=new Wr,i._tempDisplayObject=new wr,i._eventListenerOptions={capture:!0,passive:!1},i._useSystemTicker=void 0===r.useSystemTicker||r.useSystemTicker,i.setTargetElement(i.renderer.view,i.renderer.resolution),i}return function(t,e){function r(){this.constructor=t}Yr(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}(r,e),Object.defineProperty(r.prototype,"useSystemTicker",{get:function(){return this._useSystemTicker},set:function(t){this._useSystemTicker=t,t?this.addTickerListener():this.removeTickerListener()},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"lastObjectRendered",{get:function(){return this.renderer._lastObjectRendered||this._tempDisplayObject},enumerable:!1,configurable:!0}),r.prototype.hitTest=function(t,e){return qr.target=null,qr.data.global=t,e||(e=this.lastObjectRendered),this.processInteractive(qr,e,null,!0),qr.target},r.prototype.setTargetElement=function(t,e){void 0===e&&(e=1),this.removeTickerListener(),this.removeEvents(),this.interactionDOMElement=t,this.resolution=e,this.addEvents(),this.addTickerListener()},r.prototype.addTickerListener=function(){!this.tickerAdded&&this.interactionDOMElement&&this._useSystemTicker&&(Xr.system.add(this.tickerUpdate,this,t.UPDATE_PRIORITY.INTERACTION),this.tickerAdded=!0)},r.prototype.removeTickerListener=function(){this.tickerAdded&&(Xr.system.remove(this.tickerUpdate,this),this.tickerAdded=!1)},r.prototype.addEvents=function(){if(!this.eventsAdded&&this.interactionDOMElement){var t=this.interactionDOMElement.style;globalThis.navigator.msPointerEnabled?(t.msContentZooming="none",t.msTouchAction="none"):this.supportsPointerEvents&&(t.touchAction="none"),this.supportsPointerEvents?(globalThis.document.addEventListener("pointermove",this.onPointerMove,this._eventListenerOptions),this.interactionDOMElement.addEventListener("pointerdown",this.onPointerDown,this._eventListenerOptions),this.interactionDOMElement.addEventListener("pointerleave",this.onPointerOut,this._eventListenerOptions),this.interactionDOMElement.addEventListener("pointerover",this.onPointerOver,this._eventListenerOptions),globalThis.addEventListener("pointercancel",this.onPointerCancel,this._eventListenerOptions),globalThis.addEventListener("pointerup",this.onPointerUp,this._eventListenerOptions)):(globalThis.document.addEventListener("mousemove",this.onPointerMove,this._eventListenerOptions),this.interactionDOMElement.addEventListener("mousedown",this.onPointerDown,this._eventListenerOptions),this.interactionDOMElement.addEventListener("mouseout",this.onPointerOut,this._eventListenerOptions),this.interactionDOMElement.addEventListener("mouseover",this.onPointerOver,this._eventListenerOptions),globalThis.addEventListener("mouseup",this.onPointerUp,this._eventListenerOptions)),this.supportsTouchEvents&&(this.interactionDOMElement.addEventListener("touchstart",this.onPointerDown,this._eventListenerOptions),this.interactionDOMElement.addEventListener("touchcancel",this.onPointerCancel,this._eventListenerOptions),this.interactionDOMElement.addEventListener("touchend",this.onPointerUp,this._eventListenerOptions),this.interactionDOMElement.addEventListener("touchmove",this.onPointerMove,this._eventListenerOptions)),this.eventsAdded=!0}},r.prototype.removeEvents=function(){if(this.eventsAdded&&this.interactionDOMElement){var t=this.interactionDOMElement.style;globalThis.navigator.msPointerEnabled?(t.msContentZooming="",t.msTouchAction=""):this.supportsPointerEvents&&(t.touchAction=""),this.supportsPointerEvents?(globalThis.document.removeEventListener("pointermove",this.onPointerMove,this._eventListenerOptions),this.interactionDOMElement.removeEventListener("pointerdown",this.onPointerDown,this._eventListenerOptions),this.interactionDOMElement.removeEventListener("pointerleave",this.onPointerOut,this._eventListenerOptions),this.interactionDOMElement.removeEventListener("pointerover",this.onPointerOver,this._eventListenerOptions),globalThis.removeEventListener("pointercancel",this.onPointerCancel,this._eventListenerOptions),globalThis.removeEventListener("pointerup",this.onPointerUp,this._eventListenerOptions)):(globalThis.document.removeEventListener("mousemove",this.onPointerMove,this._eventListenerOptions),this.interactionDOMElement.removeEventListener("mousedown",this.onPointerDown,this._eventListenerOptions),this.interactionDOMElement.removeEventListener("mouseout",this.onPointerOut,this._eventListenerOptions),this.interactionDOMElement.removeEventListener("mouseover",this.onPointerOver,this._eventListenerOptions),globalThis.removeEventListener("mouseup",this.onPointerUp,this._eventListenerOptions)),this.supportsTouchEvents&&(this.interactionDOMElement.removeEventListener("touchstart",this.onPointerDown,this._eventListenerOptions),this.interactionDOMElement.removeEventListener("touchcancel",this.onPointerCancel,this._eventListenerOptions),this.interactionDOMElement.removeEventListener("touchend",this.onPointerUp,this._eventListenerOptions),this.interactionDOMElement.removeEventListener("touchmove",this.onPointerMove,this._eventListenerOptions)),this.interactionDOMElement=null,this.eventsAdded=!1}},r.prototype.tickerUpdate=function(t){this._deltaTime+=t,this._deltaTime8)throw new Error("max arguments reached");var h=this,u=h.name,l=h.items;this._aliasCount++;for(var c=0,d=l.length;c0&&this.items.length>1&&(this._aliasCount=0,this.items=this.items.slice(0))},t.prototype.add=function(t){return t[this._name]&&(this.ensureNonAliasedItems(),this.remove(t),this.items.push(t)),this},t.prototype.remove=function(t){var e=this.items.indexOf(t);return-1!==e&&(this.ensureNonAliasedItems(),this.items.splice(e,1)),this},t.prototype.contains=function(t){return-1!==this.items.indexOf(t)},t.prototype.removeAll=function(){return this.ensureNonAliasedItems(),this.items.length=0,this},t.prototype.destroy=function(){this.removeAll(),this.items=null,this._name=null},Object.defineProperty(t.prototype,"empty",{get:function(){return 0===this.items.length},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),t}();Object.defineProperties(Zr.prototype,{dispatch:{value:Zr.prototype.emit},run:{value:Zr.prototype.emit}}),it.PREFER_ENV=rt.any?t.ENV.WEBGL:t.ENV.WEBGL2,it.STRICT_TEXTURE_CACHE=!1;var Qr=[];function Jr(t,e){if(!t)return null;var r="";if("string"==typeof t){var i=/\.(\w{3,4})(?:$|\?|#)/i.exec(t);i&&(r=i[1].toLowerCase())}for(var n=Qr.length-1;n>=0;--n){var o=Qr[n];if(o.test&&o.test(t,r))return new o(t,e)}throw new Error("Unrecognized source type to auto-detect Resource")}var $r=function(t,e){return $r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},$r(t,e)};function ti(t,e){function r(){this.constructor=t}$r(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}var ei=function(){return ei=Object.assign||function(t){for(var e,r=arguments,i=1,n=arguments.length;i0&&l>0,n.textureCacheIds=[],n.destroyed=!1,n.resource=null,n._batchEnabled=0,n._batchLocation=0,n.parentTextureArray=null,n.setResource(r),n}return ti(r,e),Object.defineProperty(r.prototype,"realWidth",{get:function(){return Math.round(this.width*this.resolution)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"realHeight",{get:function(){return Math.round(this.height*this.resolution)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"mipmap",{get:function(){return this._mipmap},set:function(t){this._mipmap!==t&&(this._mipmap=t,this.dirtyStyleId++)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scaleMode",{get:function(){return this._scaleMode},set:function(t){this._scaleMode!==t&&(this._scaleMode=t,this.dirtyStyleId++)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"wrapMode",{get:function(){return this._wrapMode},set:function(t){this._wrapMode!==t&&(this._wrapMode=t,this.dirtyStyleId++)},enumerable:!1,configurable:!0}),r.prototype.setStyle=function(t,e){var r;return void 0!==t&&t!==this.scaleMode&&(this.scaleMode=t,r=!0),void 0!==e&&e!==this.mipmap&&(this.mipmap=e,r=!0),r&&this.dirtyStyleId++,this},r.prototype.setSize=function(t,e,r){return r=r||this.resolution,this.setRealSize(t*r,e*r,r)},r.prototype.setRealSize=function(t,e,r){return this.resolution=r||this.resolution,this.width=Math.round(t)/this.resolution,this.height=Math.round(e)/this.resolution,this._refreshPOT(),this.update(),this},r.prototype._refreshPOT=function(){this.isPowerOfTwo=Oe(this.realWidth)&&Oe(this.realHeight)},r.prototype.setResolution=function(t){var e=this.resolution;return e===t||(this.resolution=t,this.valid&&(this.width=Math.round(this.width*e)/t,this.height=Math.round(this.height*e)/t,this.emit("update",this)),this._refreshPOT()),this},r.prototype.setResource=function(t){if(this.resource===t)return this;if(this.resource)throw new Error("Resource can be set only once");return t.bind(this),this.resource=t,this},r.prototype.update=function(){this.valid?(this.dirtyId++,this.dirtyStyleId++,this.emit("update",this)):this.width>0&&this.height>0&&(this.valid=!0,this.emit("loaded",this),this.emit("update",this))},r.prototype.onError=function(t){this.emit("error",this,t)},r.prototype.destroy=function(){this.resource&&(this.resource.unbind(this),this.resource.internal&&this.resource.destroy(),this.resource=null),this.cacheId&&(delete Fe[this.cacheId],delete Le[this.cacheId],this.cacheId=null),this.dispose(),r.removeFromCache(this),this.textureCacheIds=null,this.destroyed=!0},r.prototype.dispose=function(){this.emit("dispose",this)},r.prototype.castToBaseTexture=function(){return this},r.from=function(t,e,i){void 0===i&&(i=it.STRICT_TEXTURE_CACHE);var n="string"==typeof t,o=null;if(n)o=t;else{if(!t._pixiId){var s=e&&e.pixiIdPrefix||"pixiid";t._pixiId=s+"_"+De()}o=t._pixiId}var a=Fe[o];if(n&&i&&!a)throw new Error('The cacheId "'+o+'" does not exist in BaseTextureCache.');return a||((a=new r(t,e)).cacheId=o,r.addToCache(a,o)),a},r.fromBuffer=function(e,i,n,o){e=e||new Float32Array(i*n*4);var s=new ii(e,{width:i,height:n}),a=e instanceof Float32Array?t.TYPES.FLOAT:t.TYPES.UNSIGNED_BYTE;return new r(s,Object.assign(ni,o||{width:i,height:n,type:a}))},r.addToCache=function(t,e){e&&(-1===t.textureCacheIds.indexOf(e)&&t.textureCacheIds.push(e),Fe[e]&&console.warn("BaseTexture added to the cache with an id ["+e+"] that already had an entry"),Fe[e]=t)},r.removeFromCache=function(t){if("string"==typeof t){var e=Fe[t];if(e){var r=e.textureCacheIds.indexOf(t);return r>-1&&e.textureCacheIds.splice(r,1),delete Fe[t],e}}else if(t&&t.textureCacheIds){for(var i=0;i0){if(!e.resource)throw new Error("CubeResource does not support copying of renderTexture.");this.addResourceAt(e.resource,r)}else e.target=t.TARGETS.TEXTURE_CUBE_MAP_POSITIVE_X+r,e.parentTextureArray=this.baseTexture,this.items[r]=e;return e.valid&&!this.valid&&this.resize(e.realWidth,e.realHeight),this.items[r]=e,this},r.prototype.upload=function(t,e,i){for(var n=this.itemDirtyIds,o=0;o)?\s*()]*-->)?\s*\]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*>/i,e}(hi),fi=function(t){function e(r,i){var n=this;if(i=i||{},!(r instanceof HTMLVideoElement)){var o=document.createElement("video");o.setAttribute("preload","auto"),o.setAttribute("webkit-playsinline",""),o.setAttribute("playsinline",""),"string"==typeof r&&(r=[r]);var s=r[0].src||r[0];hi.crossOrigin(o,s,i.crossorigin);for(var a=0;a0&&!1===t.paused&&!1===t.ended&&t.readyState>2},e.prototype._isSourceReady=function(){var t=this.source;return 3===t.readyState||4===t.readyState},e.prototype._onPlayStart=function(){this.valid||this._onCanPlay(),this.autoUpdate&&!this._isConnectedToTicker&&(Xr.shared.add(this.update,this),this._isConnectedToTicker=!0)},e.prototype._onPlayStop=function(){this._isConnectedToTicker&&(Xr.shared.remove(this.update,this),this._isConnectedToTicker=!1)},e.prototype._onCanPlay=function(){var t=this.source;t.removeEventListener("canplay",this._onCanPlay),t.removeEventListener("canplaythrough",this._onCanPlay);var e=this.valid;this.resize(t.videoWidth,t.videoHeight),!e&&this._resolve&&(this._resolve(this),this._resolve=null),this._isSourcePlaying()?this._onPlayStart():this.autoPlay&&t.play()},e.prototype.dispose=function(){this._isConnectedToTicker&&(Xr.shared.remove(this.update,this),this._isConnectedToTicker=!1);var e=this.source;e&&(e.removeEventListener("error",this._onError,!0),e.pause(),e.src="",e.load()),t.prototype.dispose.call(this)},Object.defineProperty(e.prototype,"autoUpdate",{get:function(){return this._autoUpdate},set:function(t){t!==this._autoUpdate&&(this._autoUpdate=t,!this._autoUpdate&&this._isConnectedToTicker?(Xr.shared.remove(this.update,this),this._isConnectedToTicker=!1):this._autoUpdate&&!this._isConnectedToTicker&&this._isSourcePlaying()&&(Xr.shared.add(this.update,this),this._isConnectedToTicker=!0))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"updateFPS",{get:function(){return this._updateFPS},set:function(t){t!==this._updateFPS&&(this._updateFPS=t)},enumerable:!1,configurable:!0}),e.test=function(t,r){return globalThis.HTMLVideoElement&&t instanceof HTMLVideoElement||e.TYPES.indexOf(r)>-1},e.TYPES=["mp4","m4v","webm","ogg","ogv","h264","avi","mov"],e.MIME_TYPES={ogv:"video/ogg",mov:"video/quicktime",m4v:"video/mp4"},e}(hi),pi=function(t){function e(e){return t.call(this,e)||this}return ti(e,t),e.test=function(t){return!!globalThis.createImageBitmap&&t instanceof ImageBitmap},e}(hi);Qr.push(ci,pi,ui,fi,di,ii,li,ai);var _i={__proto__:null,Resource:ri,BaseImageResource:hi,INSTALLED:Qr,autoDetectResource:Jr,AbstractMultiResource:si,ArrayResource:ai,BufferResource:ii,CanvasResource:ui,CubeResource:li,ImageResource:ci,SVGResource:di,VideoResource:fi,ImageBitmapResource:pi},mi=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return ti(r,e),r.prototype.upload=function(e,r,i){var n=e.gl;n.pixelStorei(n.UNPACK_PREMULTIPLY_ALPHA_WEBGL,r.alphaMode===t.ALPHA_MODES.UNPACK);var o=r.realWidth,s=r.realHeight;return i.width===o&&i.height===s?n.texSubImage2D(r.target,0,0,0,o,s,r.format,i.type,this.data):(i.width=o,i.height=s,n.texImage2D(r.target,0,i.internalFormat,o,s,0,r.format,i.type,this.data)),!0},r}(ii),vi=function(){function e(e,r){this.width=Math.round(e||100),this.height=Math.round(r||100),this.stencil=!1,this.depth=!1,this.dirtyId=0,this.dirtyFormat=0,this.dirtySize=0,this.depthTexture=null,this.colorTextures=[],this.glFramebuffers={},this.disposeRunner=new Zr("disposeFramebuffer"),this.multisample=t.MSAA_QUALITY.NONE}return Object.defineProperty(e.prototype,"colorTexture",{get:function(){return this.colorTextures[0]},enumerable:!1,configurable:!0}),e.prototype.addColorTexture=function(e,r){return void 0===e&&(e=0),this.colorTextures[e]=r||new oi(null,{scaleMode:t.SCALE_MODES.NEAREST,resolution:1,mipmap:t.MIPMAP_MODES.OFF,width:this.width,height:this.height}),this.dirtyId++,this.dirtyFormat++,this},e.prototype.addDepthTexture=function(e){return this.depthTexture=e||new oi(new mi(null,{width:this.width,height:this.height}),{scaleMode:t.SCALE_MODES.NEAREST,resolution:1,width:this.width,height:this.height,mipmap:t.MIPMAP_MODES.OFF,format:t.FORMATS.DEPTH_COMPONENT,type:t.TYPES.UNSIGNED_SHORT}),this.dirtyId++,this.dirtyFormat++,this},e.prototype.enableDepth=function(){return this.depth=!0,this.dirtyId++,this.dirtyFormat++,this},e.prototype.enableStencil=function(){return this.stencil=!0,this.dirtyId++,this.dirtyFormat++,this},e.prototype.resize=function(t,e){if(t=Math.round(t),e=Math.round(e),t!==this.width||e!==this.height){this.width=t,this.height=e,this.dirtyId++,this.dirtySize++;for(var r=0;r-1&&e.textureCacheIds.splice(r,1),delete Le[t],e}}else if(t&&t.textureCacheIds){for(var i=0;ithis.baseTexture.width,s=r+n>this.baseTexture.height;if(o||s){var a=o&&s?"and":"or",h="X: "+e+" + "+i+" = "+(e+i)+" > "+this.baseTexture.width,u="Y: "+r+" + "+n+" = "+(r+n)+" > "+this.baseTexture.height;throw new Error("Texture Error: frame does not fit inside the base Texture dimensions: "+h+" "+a+" "+u)}this.valid=i&&n&&this.baseTexture.valid,this.trim||this.rotate||(this.orig=t),this.valid&&this.updateUvs()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"rotate",{get:function(){return this._rotate},set:function(t){this._rotate=t,this.valid&&this.updateUvs()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"width",{get:function(){return this.orig.width},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"height",{get:function(){return this.orig.height},enumerable:!1,configurable:!0}),e.prototype.castToBaseTexture=function(){return this.baseTexture},Object.defineProperty(e,"EMPTY",{get:function(){return e._EMPTY||(e._EMPTY=new e(new oi),Ti(e._EMPTY),Ti(e._EMPTY.baseTexture)),e._EMPTY},enumerable:!1,configurable:!0}),Object.defineProperty(e,"WHITE",{get:function(){if(!e._WHITE){var t=document.createElement("canvas"),r=t.getContext("2d");t.width=16,t.height=16,r.fillStyle="white",r.fillRect(0,0,16,16),e._WHITE=new e(new oi(new ui(t))),Ti(e._WHITE),Ti(e._WHITE.baseTexture)}return e._WHITE},enumerable:!1,configurable:!0}),e}(st),xi=function(t){function e(e,r){var i=t.call(this,e,r)||this;return i.valid=!0,i.filterFrame=null,i.filterPoolKey=null,i.updateUvs(),i}return ti(e,t),Object.defineProperty(e.prototype,"framebuffer",{get:function(){return this.baseTexture.framebuffer},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"multisample",{get:function(){return this.framebuffer.multisample},set:function(t){this.framebuffer.multisample=t},enumerable:!1,configurable:!0}),e.prototype.resize=function(t,e,r){void 0===r&&(r=!0);var i=this.baseTexture.resolution,n=Math.round(t*i)/i,o=Math.round(e*i)/i;this.valid=n>0&&o>0,this._frame.width=this.orig.width=n,this._frame.height=this.orig.height=o,r&&this.baseTexture.resize(n,o),this.updateUvs()},e.prototype.setResolution=function(t){var e=this.baseTexture;e.resolution!==t&&(e.setResolution(t),this.resize(e.width,e.height,!1))},e.create=function(t){for(var r=arguments,i=[],n=1;n1?-n:-1:(o=((65535&(e=Se(e)))<<16|65535&(r=Se(r)))>>>0,n>1&&(o+=4294967296*n)),this.texturePool[o]||(this.texturePool[o]=[]);var s=this.texturePool[o].pop();return s||(s=this.createTexture(e,r,n)),s.filterPoolKey=o,s.setResolution(i),s},e.prototype.getFilterTexture=function(e,r,i){var n=this.getOptimalTexture(e.width,e.height,r||e.resolution,i||t.MSAA_QUALITY.NONE);return n.filterFrame=e.filterFrame,n},e.prototype.returnTexture=function(t){var e=t.filterPoolKey;t.filterFrame=null,this.texturePool[e].push(t)},e.prototype.returnFilterTexture=function(t){this.returnTexture(t)},e.prototype.clear=function(t){if(t=!1!==t)for(var e in this.texturePool){var r=this.texturePool[e];if(r)for(var i=0;i0&&t.height>0,this.texturePool)if(Number(e)<0){var r=this.texturePool[e];if(r)for(var i=0;i1){for(var u=0;u1&&((c=this.getOptimalFilterTexture(l.width,l.height,r.resolution)).filterFrame=l.filterFrame),i[d].apply(this,l,c,t.CLEAR_MODES.CLEAR,r);var f=l;l=c,c=f}i[d].apply(this,l,u.renderTexture,t.CLEAR_MODES.BLEND,r),d>1&&r.multisample>1&&this.returnFilterTexture(r.renderTexture),this.returnFilterTexture(l),this.returnFilterTexture(c)}r.clear(),this.statePool.push(r)},e.prototype.bindAndClear=function(e,r){void 0===r&&(r=t.CLEAR_MODES.CLEAR);var i=this.renderer,n=i.renderTexture,o=i.state;if(e===this.defaultFilterStack[this.defaultFilterStack.length-1].renderTexture?this.renderer.projection.transform=this.activeState.transform:this.renderer.projection.transform=null,e&&e.filterFrame){var s=this.tempRect;s.x=0,s.y=0,s.width=e.filterFrame.width,s.height=e.filterFrame.height,n.bind(e,e.filterFrame,s)}else e!==this.defaultFilterStack[this.defaultFilterStack.length-1].renderTexture?n.bind(e):this.renderer.renderTexture.bind(e,this.activeState.bindingSourceFrame,this.activeState.bindingDestinationFrame);var a=1&o.stateId||this.forceClear;(r===t.CLEAR_MODES.CLEAR||r===t.CLEAR_MODES.BLIT&&a)&&this.renderer.framebuffer.clear(0,0,0,0)},e.prototype.applyFilter=function(e,r,i,n){var o=this.renderer;o.state.set(e.state),this.bindAndClear(i,n),e.uniforms.uSampler=r,e.uniforms.filterGlobals=this.globalUniforms,o.shader.bind(e),e.legacy=!!e.program.attributeData.aTextureCoord,e.legacy?(this.quadUv.map(r._frame,r.filterFrame),o.geometry.bind(this.quadUv),o.geometry.draw(t.DRAW_MODES.TRIANGLES)):(o.geometry.bind(this.quad),o.geometry.draw(t.DRAW_MODES.TRIANGLE_STRIP))},e.prototype.calculateSpriteMatrix=function(t,e){var r=this.activeState,i=r.sourceFrame,n=r.destinationFrame,o=e._texture.orig,s=t.set(n.width,0,0,n.height,i.x,i.y),a=e.worldTransform.copyTo(er.TEMP_MATRIX);return a.invert(),s.prepend(a),s.scale(1/o.width,1/o.height),s.translate(e.anchor.x,e.anchor.y),s},e.prototype.destroy=function(){this.renderer=null,this.texturePool.clear(!1)},e.prototype.getOptimalFilterTexture=function(e,r,i,n){return void 0===i&&(i=1),void 0===n&&(n=t.MSAA_QUALITY.NONE),this.texturePool.getOptimalTexture(e,r,i,n)},e.prototype.getFilterTexture=function(e,r,i){if("number"==typeof e){var n=e;e=r,r=n}e=e||this.activeState.renderTexture;var o=this.texturePool.getOptimalTexture(e.width,e.height,r||e.resolution,i||t.MSAA_QUALITY.NONE);return o.filterFrame=e.filterFrame,o},e.prototype.returnFilterTexture=function(t){this.texturePool.returnTexture(t)},e.prototype.emptyPool=function(){this.texturePool.clear(!0)},e.prototype.resize=function(){this.texturePool.setScreenSize(this.renderer.view)},e.prototype.transformAABB=function(t,e){var r=Bi[0],i=Bi[1],n=Bi[2],o=Bi[3];r.set(e.left,e.top),i.set(e.left,e.bottom),n.set(e.right,e.top),o.set(e.right,e.bottom),t.apply(r,r),t.apply(i,i),t.apply(n,n),t.apply(o,o);var s=Math.min(r.x,i.x,n.x,o.x),a=Math.min(r.y,i.y,n.y,o.y),h=Math.max(r.x,i.x,n.x,o.x),u=Math.max(r.y,i.y,n.y,o.y);e.x=s,e.y=a,e.width=h-s,e.height=u-a},e.prototype.roundFrame=function(t,e,r,i,n){if(!(t.width<=0||t.height<=0||r.width<=0||r.height<=0)){if(n){var o=n.a,s=n.b,a=n.c,h=n.d;if((Math.abs(s)>1e-4||Math.abs(a)>1e-4)&&(Math.abs(o)>1e-4||Math.abs(h)>1e-4))return}(n=n?Gi.copyFrom(n):Gi.identity()).translate(-r.x,-r.y).scale(i.width/r.width,i.height/r.height).translate(i.x,i.y),this.transformAABB(n,t),t.ceil(e),this.transformAABB(n.invert(),t)}},e}(),ki=function(){function t(t){this.renderer=t}return t.prototype.flush=function(){},t.prototype.destroy=function(){this.renderer=null},t.prototype.start=function(){},t.prototype.stop=function(){this.flush()},t.prototype.render=function(t){},t}(),Hi=function(){function t(t){this.renderer=t,this.emptyRenderer=new ki(t),this.currentRenderer=this.emptyRenderer}return t.prototype.setObjectRenderer=function(t){this.currentRenderer!==t&&(this.currentRenderer.stop(),this.currentRenderer=t,this.currentRenderer.start())},t.prototype.flush=function(){this.setObjectRenderer(this.emptyRenderer)},t.prototype.reset=function(){this.setObjectRenderer(this.emptyRenderer)},t.prototype.copyBoundTextures=function(t,e){for(var r=this.renderer.texture.boundTextures,i=e-1;i>=0;--i)t[i]=r[i]||null,t[i]&&(t[i]._batchLocation=i)},t.prototype.boundArray=function(t,e,r,i){for(var n=t.elements,o=t.ids,s=t.count,a=0,h=0;h=0&&l=t.ENV.WEBGL2&&(i=e.getContext("webgl2",r)),i)this.webGLVersion=2;else if(this.webGLVersion=1,!(i=e.getContext("webgl",r)||e.getContext("experimental-webgl",r)))throw new Error("This browser does not support WebGL. Try using the canvas renderer");return this.gl=i,this.getExtensions(),this.gl},e.prototype.getExtensions=function(){var t=this.gl,e={anisotropicFiltering:t.getExtension("EXT_texture_filter_anisotropic"),floatTextureLinear:t.getExtension("OES_texture_float_linear"),s3tc:t.getExtension("WEBGL_compressed_texture_s3tc"),s3tc_sRGB:t.getExtension("WEBGL_compressed_texture_s3tc_srgb"),etc:t.getExtension("WEBGL_compressed_texture_etc"),etc1:t.getExtension("WEBGL_compressed_texture_etc1"),pvrtc:t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"),atc:t.getExtension("WEBGL_compressed_texture_atc"),astc:t.getExtension("WEBGL_compressed_texture_astc")};1===this.webGLVersion?Object.assign(this.extensions,e,{drawBuffers:t.getExtension("WEBGL_draw_buffers"),depthTexture:t.getExtension("WEBGL_depth_texture"),loseContext:t.getExtension("WEBGL_lose_context"),vertexArrayObject:t.getExtension("OES_vertex_array_object")||t.getExtension("MOZ_OES_vertex_array_object")||t.getExtension("WEBKIT_OES_vertex_array_object"),uint32ElementIndex:t.getExtension("OES_element_index_uint"),floatTexture:t.getExtension("OES_texture_float"),floatTextureLinear:t.getExtension("OES_texture_float_linear"),textureHalfFloat:t.getExtension("OES_texture_half_float"),textureHalfFloatLinear:t.getExtension("OES_texture_half_float_linear")}):2===this.webGLVersion&&Object.assign(this.extensions,e,{colorBufferFloat:t.getExtension("EXT_color_buffer_float")})},e.prototype.handleContextLost=function(t){t.preventDefault()},e.prototype.handleContextRestored=function(){this.renderer.runners.contextChange.emit(this.gl)},e.prototype.destroy=function(){var t=this.renderer.view;this.renderer=null,t.removeEventListener("webglcontextlost",this.handleContextLost),t.removeEventListener("webglcontextrestored",this.handleContextRestored),this.gl.useProgram(null),this.extensions.loseContext&&this.extensions.loseContext.loseContext()},e.prototype.postrender=function(){this.renderer.renderingToScreen&&this.gl.flush()},e.prototype.validateContext=function(t){var e=t.getContextAttributes(),r="WebGL2RenderingContext"in globalThis&&t instanceof globalThis.WebGL2RenderingContext;r&&(this.webGLVersion=2),e&&!e.stencil&&console.warn("Provided WebGL context does not have a stencil buffer, masks may not render correctly");var i=r||!!t.getExtension("OES_element_index_uint");this.supports.uint32Indices=i,i||console.warn("Provided WebGL context does not support 32 index buffer, complex graphics may not render correctly")},e}(),Vi=function(e){this.framebuffer=e,this.stencil=null,this.dirtyId=-1,this.dirtyFormat=-1,this.dirtySize=-1,this.multisample=t.MSAA_QUALITY.NONE,this.msaaBuffer=null,this.blitFramebuffer=null,this.mipLevel=0},Wi=new Ke,zi=function(){function e(t){this.renderer=t,this.managedFramebuffers=[],this.unknownFramebuffer=new vi(10,10),this.msaaSamples=null}return e.prototype.contextChange=function(){var e=this.gl=this.renderer.gl;if(this.CONTEXT_UID=this.renderer.CONTEXT_UID,this.current=this.unknownFramebuffer,this.viewport=new Ke,this.hasMRT=!0,this.writeDepthTexture=!0,this.disposeAll(!0),1===this.renderer.context.webGLVersion){var r=this.renderer.context.extensions.drawBuffers,i=this.renderer.context.extensions.depthTexture;it.PREFER_ENV===t.ENV.WEBGL_LEGACY&&(r=null,i=null),r?e.drawBuffers=function(t){return r.drawBuffersWEBGL(t)}:(this.hasMRT=!1,e.drawBuffers=function(){}),i||(this.writeDepthTexture=!1)}else this.msaaSamples=e.getInternalformatParameter(e.RENDERBUFFER,e.RGBA8,e.SAMPLES)},e.prototype.bind=function(t,e,r){void 0===r&&(r=0);var i=this.gl;if(t){var n=t.glFramebuffers[this.CONTEXT_UID]||this.initFramebuffer(t);this.current!==t&&(this.current=t,i.bindFramebuffer(i.FRAMEBUFFER,n.framebuffer)),n.mipLevel!==r&&(t.dirtyId++,t.dirtyFormat++,n.mipLevel=r),n.dirtyId!==t.dirtyId&&(n.dirtyId=t.dirtyId,n.dirtyFormat!==t.dirtyFormat?(n.dirtyFormat=t.dirtyFormat,n.dirtySize=t.dirtySize,this.updateFramebuffer(t,r)):n.dirtySize!==t.dirtySize&&(n.dirtySize=t.dirtySize,this.resizeFramebuffer(t)));for(var o=0;o>r,h=e.height>>r,u=a/e.width;this.setViewport(e.x*u,e.y*u,a,h)}else a=t.width>>r,h=t.height>>r,this.setViewport(0,0,a,h)}else this.current&&(this.current=null,i.bindFramebuffer(i.FRAMEBUFFER,null)),e?this.setViewport(e.x,e.y,e.width,e.height):this.setViewport(0,0,this.renderer.width,this.renderer.height)},e.prototype.setViewport=function(t,e,r,i){var n=this.viewport;t=Math.round(t),e=Math.round(e),r=Math.round(r),i=Math.round(i),n.width===r&&n.height===i&&n.x===t&&n.y===e||(n.x=t,n.y=e,n.width=r,n.height=i,this.gl.viewport(t,e,r,i))},Object.defineProperty(e.prototype,"size",{get:function(){return this.current?{x:0,y:0,width:this.current.width,height:this.current.height}:{x:0,y:0,width:this.renderer.width,height:this.renderer.height}},enumerable:!1,configurable:!0}),e.prototype.clear=function(e,r,i,n,o){void 0===o&&(o=t.BUFFER_BITS.COLOR|t.BUFFER_BITS.DEPTH);var s=this.gl;s.clearColor(e,r,i,n),s.clear(o)},e.prototype.initFramebuffer=function(t){var e=this.gl,r=new Vi(e.createFramebuffer());return r.multisample=this.detectSamples(t.multisample),t.glFramebuffers[this.CONTEXT_UID]=r,this.managedFramebuffers.push(t),t.disposeRunner.add(this),r},e.prototype.resizeFramebuffer=function(t){var e=this.gl,r=t.glFramebuffers[this.CONTEXT_UID];r.msaaBuffer&&(e.bindRenderbuffer(e.RENDERBUFFER,r.msaaBuffer),e.renderbufferStorageMultisample(e.RENDERBUFFER,r.multisample,e.RGBA8,t.width,t.height)),r.stencil&&(e.bindRenderbuffer(e.RENDERBUFFER,r.stencil),r.msaaBuffer?e.renderbufferStorageMultisample(e.RENDERBUFFER,r.multisample,e.DEPTH24_STENCIL8,t.width,t.height):e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,t.width,t.height));var i=t.colorTextures,n=i.length;e.drawBuffers||(n=Math.min(n,1));for(var o=0;o1&&this.canMultisampleFramebuffer(t)?(i.msaaBuffer=i.msaaBuffer||r.createRenderbuffer(),r.bindRenderbuffer(r.RENDERBUFFER,i.msaaBuffer),r.renderbufferStorageMultisample(r.RENDERBUFFER,i.multisample,r.RGBA8,t.width,t.height),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.RENDERBUFFER,i.msaaBuffer)):i.msaaBuffer&&(r.deleteRenderbuffer(i.msaaBuffer),i.msaaBuffer=null,i.blitFramebuffer&&(i.blitFramebuffer.dispose(),i.blitFramebuffer=null));for(var s=[],a=0;a1&&r.drawBuffers(s),t.depthTexture&&this.writeDepthTexture){var l=t.depthTexture;this.renderer.texture.bind(l,0),r.framebufferTexture2D(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.TEXTURE_2D,l._glTextures[this.CONTEXT_UID].texture,e)}!t.stencil&&!t.depth||t.depthTexture&&this.writeDepthTexture?i.stencil&&(r.deleteRenderbuffer(i.stencil),i.stencil=null):(i.stencil=i.stencil||r.createRenderbuffer(),r.bindRenderbuffer(r.RENDERBUFFER,i.stencil),i.msaaBuffer?r.renderbufferStorageMultisample(r.RENDERBUFFER,i.multisample,r.DEPTH24_STENCIL8,t.width,t.height):r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,t.width,t.height),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,i.stencil))},e.prototype.canMultisampleFramebuffer=function(t){return 1!==this.renderer.context.webGLVersion&&t.colorTextures.length<=1&&!t.depthTexture},e.prototype.detectSamples=function(e){var r=this.msaaSamples,i=t.MSAA_QUALITY.NONE;if(e<=1||null===r)return i;for(var n=0;n=0&&this.managedFramebuffers.splice(n,1),t.disposeRunner.remove(this),e||(i.deleteFramebuffer(r.framebuffer),r.msaaBuffer&&i.deleteRenderbuffer(r.msaaBuffer),r.stencil&&i.deleteRenderbuffer(r.stencil)),r.blitFramebuffer&&r.blitFramebuffer.dispose()}},e.prototype.disposeAll=function(t){var e=this.managedFramebuffers;this.managedFramebuffers=[];for(var r=0;r=t.ENV.WEBGL2&&(r=e.getContext("webgl2",{})),r||((r=e.getContext("webgl",{})||e.getContext("experimental-webgl",{}))?r.getExtension("WEBGL_draw_buffers"):r=null),nn=r}return nn}function sn(e,r,i){if("precision"!==e.substring(0,9)){var n=r;return r===t.PRECISION.HIGH&&i!==t.PRECISION.HIGH&&(n=t.PRECISION.MEDIUM),"precision "+n+" float;\n"+e}return i!==t.PRECISION.HIGH&&"precision highp"===e.substring(0,15)?e.replace("precision highp","precision mediump"):e}var an={float:1,vec2:2,vec3:3,vec4:4,int:1,ivec2:2,ivec3:3,ivec4:4,uint:1,uvec2:2,uvec3:3,uvec4:4,bool:1,bvec2:2,bvec3:3,bvec4:4,mat2:4,mat3:9,mat4:16,sampler2D:1};function hn(t){return an[t]}var un=null,ln={FLOAT:"float",FLOAT_VEC2:"vec2",FLOAT_VEC3:"vec3",FLOAT_VEC4:"vec4",INT:"int",INT_VEC2:"ivec2",INT_VEC3:"ivec3",INT_VEC4:"ivec4",UNSIGNED_INT:"uint",UNSIGNED_INT_VEC2:"uvec2",UNSIGNED_INT_VEC3:"uvec3",UNSIGNED_INT_VEC4:"uvec4",BOOL:"bool",BOOL_VEC2:"bvec2",BOOL_VEC3:"bvec3",BOOL_VEC4:"bvec4",FLOAT_MAT2:"mat2",FLOAT_MAT3:"mat3",FLOAT_MAT4:"mat4",SAMPLER_2D:"sampler2D",INT_SAMPLER_2D:"sampler2D",UNSIGNED_INT_SAMPLER_2D:"sampler2D",SAMPLER_CUBE:"samplerCube",INT_SAMPLER_CUBE:"samplerCube",UNSIGNED_INT_SAMPLER_CUBE:"samplerCube",SAMPLER_2D_ARRAY:"sampler2DArray",INT_SAMPLER_2D_ARRAY:"sampler2DArray",UNSIGNED_INT_SAMPLER_2D_ARRAY:"sampler2DArray"};function cn(t,e){if(!un){var r=Object.keys(ln);un={};for(var i=0;i0&&(e+="\nelse "),r1e-4||Math.abs(i)>1e-4)&&(Math.abs(e)>1e-4||Math.abs(n)>1e-4)},e.prototype.testScissor=function(t){var r=t.maskObject;if(!r.isFastRect||!r.isFastRect())return!1;if(e.isMatrixRotated(r.worldTransform))return!1;if(e.isMatrixRotated(this.renderer.projection.transform))return!1;this.calcScissorRect(t);var i=t._scissorRectLocal;return i.width>0&&i.height>0},e.prototype.roundFrameToPixels=function(t,r,i,n,o){e.isMatrixRotated(o)||((o=o?Nn.copyFrom(o):Nn.identity()).translate(-i.x,-i.y).scale(n.width/i.width,n.height/i.height).translate(n.x,n.y),this.renderer.filter.transformAABB(o,t),t.fit(n),t.x=Math.round(t.x*r),t.y=Math.round(t.y*r),t.width=Math.round(t.width*r),t.height=Math.round(t.height*r))},e.prototype.push=function(t){t._scissorRectLocal||this.calcScissorRect(t);var e=this.renderer.gl;t._scissorRect||e.enable(e.SCISSOR_TEST),t._scissorCounter++,t._scissorRect=t._scissorRectLocal,this._useCurrent()},e.prototype.pop=function(){var t=this.renderer.gl;this.getStackLength()>0?this._useCurrent():t.disable(t.SCISSOR_TEST)},e.prototype._useCurrent=function(){var t,e=this.maskStack[this.maskStack.length-1]._scissorRect;t=this.renderer.renderTexture.current?e.y:this.renderer.height-e.height-e.y,this.renderer.gl.scissor(e.x,t,e.width,e.height)},e}(Mn),Dn=function(t){function e(e){var r=t.call(this,e)||this;return r.glConst=WebGLRenderingContext.STENCIL_TEST,r}return ti(e,t),e.prototype.getStackLength=function(){var t=this.maskStack[this.maskStack.length-1];return t?t._stencilCounter:0},e.prototype.push=function(t){var e=t.maskObject,r=this.renderer.gl,i=t._stencilCounter;0===i&&(this.renderer.framebuffer.forceStencil(),r.clearStencil(0),r.clear(r.STENCIL_BUFFER_BIT),r.enable(r.STENCIL_TEST)),t._stencilCounter++,r.colorMask(!1,!1,!1,!1),r.stencilFunc(r.EQUAL,i,4294967295),r.stencilOp(r.KEEP,r.KEEP,r.INCR),e.renderable=!0,e.render(this.renderer),this.renderer.batch.flush(),e.renderable=!1,this._useCurrent()},e.prototype.pop=function(t){var e=this.renderer.gl;0===this.getStackLength()?e.disable(e.STENCIL_TEST):(e.colorMask(!1,!1,!1,!1),e.stencilOp(e.KEEP,e.KEEP,e.DECR),t.renderable=!0,t.render(this.renderer),this.renderer.batch.flush(),t.renderable=!1,this._useCurrent())},e.prototype._useCurrent=function(){var t=this.renderer.gl;t.colorMask(!0,!0,!0,!0),t.stencilFunc(t.EQUAL,this.getStackLength(),4294967295),t.stencilOp(t.KEEP,t.KEEP,t.KEEP)},e}(Mn),Cn=function(){function t(t){this.renderer=t,this.destinationFrame=null,this.sourceFrame=null,this.defaultFrame=null,this.projectionMatrix=new er,this.transform=null}return t.prototype.update=function(t,e,r,i){this.destinationFrame=t||this.destinationFrame||this.defaultFrame,this.sourceFrame=e||this.sourceFrame||t,this.calculateProjection(this.destinationFrame,this.sourceFrame,r,i),this.transform&&this.projectionMatrix.append(this.transform);var n=this.renderer;n.globalUniforms.uniforms.projectionMatrix=this.projectionMatrix,n.globalUniforms.update(),n.shader.shader&&n.shader.syncUniformGroup(n.shader.shader.uniforms.globals)},t.prototype.calculateProjection=function(t,e,r,i){var n=this.projectionMatrix,o=i?-1:1;n.identity(),n.a=1/e.width*2,n.d=o*(1/e.height*2),n.tx=-1-e.x*n.a,n.ty=-o-e.y*n.d},t.prototype.setTransform=function(t){},t.prototype.destroy=function(){this.renderer=null},t}(),wn=new Ke,Ln=new Ke,Fn=function(){function t(t){this.renderer=t,this.clearColor=t._backgroundColorRgba,this.defaultMaskStack=[],this.current=null,this.sourceFrame=new Ke,this.destinationFrame=new Ke,this.viewportFrame=new Ke}return t.prototype.bind=function(t,e,r){void 0===t&&(t=null);var i,n,o,s=this.renderer;this.current=t,t?(o=(i=t.baseTexture).resolution,e||(wn.width=t.frame.width,wn.height=t.frame.height,e=wn),r||(Ln.x=t.frame.x,Ln.y=t.frame.y,Ln.width=e.width,Ln.height=e.height,r=Ln),n=i.framebuffer):(o=s.resolution,e||(wn.width=s.screen.width,wn.height=s.screen.height,e=wn),r||((r=wn).width=e.width,r.height=e.height));var a=this.viewportFrame;a.x=r.x*o,a.y=r.y*o,a.width=r.width*o,a.height=r.height*o,t||(a.y=s.view.height-(a.y+a.height)),a.ceil(),this.renderer.framebuffer.bind(n,a),this.renderer.projection.update(r,e,o,!n),t?this.renderer.mask.setMaskStack(i.maskStack):this.renderer.mask.setMaskStack(this.defaultMaskStack),this.sourceFrame.copyFrom(e),this.destinationFrame.copyFrom(r)},t.prototype.clear=function(t,e){t=this.current?t||this.current.baseTexture.clearColor:t||this.clearColor;var r=this.destinationFrame,i=this.current?this.current.baseTexture:this.renderer.screen,n=r.width!==i.width||r.height!==i.height;if(n){var o=this.viewportFrame,s=o.x,a=o.y,h=o.width,u=o.height;s=Math.round(s),a=Math.round(a),h=Math.round(h),u=Math.round(u),this.renderer.gl.enable(this.renderer.gl.SCISSOR_TEST),this.renderer.gl.scissor(s,a,h,u)}this.renderer.framebuffer.clear(t[0],t[1],t[2],t[3],e),n&&this.renderer.scissor.pop()},t.prototype.resize=function(){this.bind(null)},t.prototype.reset=function(){this.bind(null)},t.prototype.destroy=function(){this.renderer=null},t}();function Un(t,e,r,i,n){r.buffer.update(n)}var Bn={float:"\n data[offset] = v;\n ",vec2:"\n data[offset] = v[0];\n data[offset+1] = v[1];\n ",vec3:"\n data[offset] = v[0];\n data[offset+1] = v[1];\n data[offset+2] = v[2];\n\n ",vec4:"\n data[offset] = v[0];\n data[offset+1] = v[1];\n data[offset+2] = v[2];\n data[offset+3] = v[3];\n ",mat2:"\n data[offset] = v[0];\n data[offset+1] = v[1];\n\n data[offset+4] = v[2];\n data[offset+5] = v[3];\n ",mat3:"\n data[offset] = v[0];\n data[offset+1] = v[1];\n data[offset+2] = v[2];\n\n data[offset + 4] = v[3];\n data[offset + 5] = v[4];\n data[offset + 6] = v[5];\n\n data[offset + 8] = v[6];\n data[offset + 9] = v[7];\n data[offset + 10] = v[8];\n ",mat4:"\n for(var i = 0; i < 16; i++)\n {\n data[offset + i] = v[i];\n }\n "},Gn={float:4,vec2:8,vec3:12,vec4:16,int:4,ivec2:8,ivec3:12,ivec4:16,uint:4,uvec2:8,uvec3:12,uvec4:16,bool:4,bvec2:8,bvec3:12,bvec4:16,mat2:32,mat3:48,mat4:64};function Xn(t){for(var e=t.map((function(t){return{data:t,offset:0,dataLen:0,dirty:0}})),r=0,i=0,n=0,o=0;o1&&(r=Math.max(r,16)*s.data.size),s.dataLen=r,i%r!=0&&i<16){var a=i%r%16;i+=a,n+=a}i+r>16?(n=16*Math.ceil(n/16),s.offset=n,n+=r,i=r):(s.offset=n,i+=r,n+=r)}return{uboElements:e,size:n=16*Math.ceil(n/16)}}function kn(t,e){var r=[];for(var i in t)e[i]&&r.push(e[i]);return r.sort((function(t,e){return t.index-e.index})),r}function Hn(t,e){if(!t.autoManage)return{size:0,syncFunc:Un};for(var r=Xn(kn(t.uniforms,e)),i=r.uboElements,n=r.size,o=["\n var v = null;\n var v2 = null;\n var cv = null;\n var t = 0;\n var gl = renderer.gl\n var index = 0;\n var data = buffer.data;\n "],s=0;s1){var f=hn(a.data.type),p=Math.max(Gn[a.data.type]/16,1),_=f/p,m=(4-_%4)%4;o.push("\n cv = ud."+u+".value;\n v = uv."+u+";\n offset = "+a.offset/4+";\n\n t = 0;\n\n for(var i=0; i < "+a.data.size*p+"; i++)\n {\n for(var j = 0; j < "+_+"; j++)\n {\n data[offset++] = v[t++];\n }\n offset += "+m+";\n }\n\n ")}else{var v=Bn[a.data.type];o.push("\n cv = ud."+u+".value;\n v = uv."+u+";\n offset = "+a.offset/4+";\n "+v+";\n ")}}return o.push("\n renderer.buffer.update(buffer);\n "),{size:n,syncFunc:new Function("ud","uv","renderer","syncData","buffer",o.join("\n"))}}var Yn=function(){function t(t,e){this.program=t,this.uniformData=e,this.uniformGroups={},this.uniformDirtyGroups={},this.uniformBufferBindings={}}return t.prototype.destroy=function(){this.uniformData=null,this.uniformGroups=null,this.uniformDirtyGroups=null,this.uniformBufferBindings=null,this.program=null},t}();function jn(t,e){var r=Qi(t,t.VERTEX_SHADER,e.vertexSrc),i=Qi(t,t.FRAGMENT_SHADER,e.fragmentSrc),n=t.createProgram();if(t.attachShader(n,r),t.attachShader(n,i),t.linkProgram(n),t.getProgramParameter(n,t.LINK_STATUS)||function(t,e,r,i){t.getProgramParameter(e,t.LINK_STATUS)||(t.getShaderParameter(r,t.COMPILE_STATUS)||Ji(t,r),t.getShaderParameter(i,t.COMPILE_STATUS)||Ji(t,i),console.error("PixiJS Error: Could not initialize shader."),""!==t.getProgramInfoLog(e)&&console.warn("PixiJS Warning: gl.getProgramInfoLog()",t.getProgramInfoLog(e)))}(t,n,r,i),e.attributeData=function(t,e){for(var r={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES),n=0;ne?1:-1}));for(var s=0;s>=1,r++;this.stateId=t.data}for(r=0;rthis.checkCountMax&&(this.checkCount=0,this.run())))},e.prototype.run=function(){for(var t=this.renderer.texture,e=t.managedTextures,r=!1,i=0;ithis.maxIdle&&(t.destroyTexture(n,!0),e[i]=null,r=!0)}if(r){var o=0;for(i=0;i=0;i--)this.unload(t.children[i])},e.prototype.destroy=function(){this.renderer=null},e}(),Zn=function(e){this.texture=e,this.width=-1,this.height=-1,this.dirtyId=-1,this.dirtyStyleId=-1,this.mipmap=!1,this.wrapMode=33071,this.type=t.TYPES.UNSIGNED_BYTE,this.internalFormat=t.FORMATS.RGBA,this.samplerType=0},Qn=function(){function e(t){this.renderer=t,this.boundTextures=[],this.currentLocation=-1,this.managedTextures=[],this._unknownBoundTextures=!1,this.unknownTexture=new oi,this.hasIntegerTextures=!1}return e.prototype.contextChange=function(){var e=this.gl=this.renderer.gl;this.CONTEXT_UID=this.renderer.CONTEXT_UID,this.webGLVersion=this.renderer.context.webGLVersion,this.internalFormats=function(e){var r,i,n,o,s,a,h,u,l,c,d,f,p,_,m,v,E,y,g,T,b,x,R;return"WebGL2RenderingContext"in globalThis&&e instanceof globalThis.WebGL2RenderingContext?((r={})[t.TYPES.UNSIGNED_BYTE]=((i={})[t.FORMATS.RGBA]=e.RGBA8,i[t.FORMATS.RGB]=e.RGB8,i[t.FORMATS.RG]=e.RG8,i[t.FORMATS.RED]=e.R8,i[t.FORMATS.RGBA_INTEGER]=e.RGBA8UI,i[t.FORMATS.RGB_INTEGER]=e.RGB8UI,i[t.FORMATS.RG_INTEGER]=e.RG8UI,i[t.FORMATS.RED_INTEGER]=e.R8UI,i[t.FORMATS.ALPHA]=e.ALPHA,i[t.FORMATS.LUMINANCE]=e.LUMINANCE,i[t.FORMATS.LUMINANCE_ALPHA]=e.LUMINANCE_ALPHA,i),r[t.TYPES.BYTE]=((n={})[t.FORMATS.RGBA]=e.RGBA8_SNORM,n[t.FORMATS.RGB]=e.RGB8_SNORM,n[t.FORMATS.RG]=e.RG8_SNORM,n[t.FORMATS.RED]=e.R8_SNORM,n[t.FORMATS.RGBA_INTEGER]=e.RGBA8I,n[t.FORMATS.RGB_INTEGER]=e.RGB8I,n[t.FORMATS.RG_INTEGER]=e.RG8I,n[t.FORMATS.RED_INTEGER]=e.R8I,n),r[t.TYPES.UNSIGNED_SHORT]=((o={})[t.FORMATS.RGBA_INTEGER]=e.RGBA16UI,o[t.FORMATS.RGB_INTEGER]=e.RGB16UI,o[t.FORMATS.RG_INTEGER]=e.RG16UI,o[t.FORMATS.RED_INTEGER]=e.R16UI,o[t.FORMATS.DEPTH_COMPONENT]=e.DEPTH_COMPONENT16,o),r[t.TYPES.SHORT]=((s={})[t.FORMATS.RGBA_INTEGER]=e.RGBA16I,s[t.FORMATS.RGB_INTEGER]=e.RGB16I,s[t.FORMATS.RG_INTEGER]=e.RG16I,s[t.FORMATS.RED_INTEGER]=e.R16I,s),r[t.TYPES.UNSIGNED_INT]=((a={})[t.FORMATS.RGBA_INTEGER]=e.RGBA32UI,a[t.FORMATS.RGB_INTEGER]=e.RGB32UI,a[t.FORMATS.RG_INTEGER]=e.RG32UI,a[t.FORMATS.RED_INTEGER]=e.R32UI,a[t.FORMATS.DEPTH_COMPONENT]=e.DEPTH_COMPONENT24,a),r[t.TYPES.INT]=((h={})[t.FORMATS.RGBA_INTEGER]=e.RGBA32I,h[t.FORMATS.RGB_INTEGER]=e.RGB32I,h[t.FORMATS.RG_INTEGER]=e.RG32I,h[t.FORMATS.RED_INTEGER]=e.R32I,h),r[t.TYPES.FLOAT]=((u={})[t.FORMATS.RGBA]=e.RGBA32F,u[t.FORMATS.RGB]=e.RGB32F,u[t.FORMATS.RG]=e.RG32F,u[t.FORMATS.RED]=e.R32F,u[t.FORMATS.DEPTH_COMPONENT]=e.DEPTH_COMPONENT32F,u),r[t.TYPES.HALF_FLOAT]=((l={})[t.FORMATS.RGBA]=e.RGBA16F,l[t.FORMATS.RGB]=e.RGB16F,l[t.FORMATS.RG]=e.RG16F,l[t.FORMATS.RED]=e.R16F,l),r[t.TYPES.UNSIGNED_SHORT_5_6_5]=((c={})[t.FORMATS.RGB]=e.RGB565,c),r[t.TYPES.UNSIGNED_SHORT_4_4_4_4]=((d={})[t.FORMATS.RGBA]=e.RGBA4,d),r[t.TYPES.UNSIGNED_SHORT_5_5_5_1]=((f={})[t.FORMATS.RGBA]=e.RGB5_A1,f),r[t.TYPES.UNSIGNED_INT_2_10_10_10_REV]=((p={})[t.FORMATS.RGBA]=e.RGB10_A2,p[t.FORMATS.RGBA_INTEGER]=e.RGB10_A2UI,p),r[t.TYPES.UNSIGNED_INT_10F_11F_11F_REV]=((_={})[t.FORMATS.RGB]=e.R11F_G11F_B10F,_),r[t.TYPES.UNSIGNED_INT_5_9_9_9_REV]=((m={})[t.FORMATS.RGB]=e.RGB9_E5,m),r[t.TYPES.UNSIGNED_INT_24_8]=((v={})[t.FORMATS.DEPTH_STENCIL]=e.DEPTH24_STENCIL8,v),r[t.TYPES.FLOAT_32_UNSIGNED_INT_24_8_REV]=((E={})[t.FORMATS.DEPTH_STENCIL]=e.DEPTH32F_STENCIL8,E),R=r):((y={})[t.TYPES.UNSIGNED_BYTE]=((g={})[t.FORMATS.RGBA]=e.RGBA,g[t.FORMATS.RGB]=e.RGB,g[t.FORMATS.ALPHA]=e.ALPHA,g[t.FORMATS.LUMINANCE]=e.LUMINANCE,g[t.FORMATS.LUMINANCE_ALPHA]=e.LUMINANCE_ALPHA,g),y[t.TYPES.UNSIGNED_SHORT_5_6_5]=((T={})[t.FORMATS.RGB]=e.RGB,T),y[t.TYPES.UNSIGNED_SHORT_4_4_4_4]=((b={})[t.FORMATS.RGBA]=e.RGBA,b),y[t.TYPES.UNSIGNED_SHORT_5_5_5_1]=((x={})[t.FORMATS.RGBA]=e.RGBA,x),R=y),R}(e);var r=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS);this.boundTextures.length=r;for(var i=0;i=0;--s){var a=i[s];a&&a._glTextures[o].samplerType!==t.SAMPLER_TYPES.FLOAT&&this.renderer.texture.unbind(a)}},e.prototype.initTexture=function(t){var e=new Zn(this.gl.createTexture());return e.dirtyId=-1,t._glTextures[this.CONTEXT_UID]=e,this.managedTextures.push(t),t.on("dispose",this.destroyTexture,this),e},e.prototype.initTextureType=function(e,r){var i,n;r.internalFormat=null!==(n=null===(i=this.internalFormats[e.type])||void 0===i?void 0:i[e.format])&&void 0!==n?n:e.format,2===this.webGLVersion&&e.type===t.TYPES.HALF_FLOAT?r.type=this.gl.HALF_FLOAT:r.type=e.type},e.prototype.updateTexture=function(e){var r=e._glTextures[this.CONTEXT_UID];if(r){var i=this.renderer;if(this.initTextureType(e,r),e.resource&&e.resource.upload(i,e,r))r.samplerType!==t.SAMPLER_TYPES.FLOAT&&(this.hasIntegerTextures=!0);else{var n=e.realWidth,o=e.realHeight,s=i.gl;(r.width!==n||r.height!==o||r.dirtyId<0)&&(r.width=n,r.height=o,s.texImage2D(e.target,0,r.internalFormat,n,o,0,e.format,r.type,null))}e.dirtyStyleId!==r.dirtyStyleId&&this.updateTextureStyle(e),r.dirtyId=e.dirtyId}},e.prototype.destroyTexture=function(t,e){var r=this.gl;if((t=t.castToBaseTexture())._glTextures[this.CONTEXT_UID]&&(this.unbind(t),r.deleteTexture(t._glTextures[this.CONTEXT_UID].texture),t.off("dispose",this.destroyTexture,this),delete t._glTextures[this.CONTEXT_UID],!e)){var i=this.managedTextures.indexOf(t);-1!==i&&Me(this.managedTextures,i,1)}},e.prototype.updateTextureStyle=function(e){var r=e._glTextures[this.CONTEXT_UID];r&&(e.mipmap!==t.MIPMAP_MODES.POW2&&2===this.webGLVersion||e.isPowerOfTwo?r.mipmap=e.mipmap>=1:r.mipmap=!1,2===this.webGLVersion||e.isPowerOfTwo?r.wrapMode=e.wrapMode:r.wrapMode=t.WRAP_MODES.CLAMP,e.resource&&e.resource.style(this.renderer,e,r)||this.setStyle(e,r),r.dirtyStyleId=e.dirtyStyleId)},e.prototype.setStyle=function(e,r){var i=this.gl;if(r.mipmap&&e.mipmap!==t.MIPMAP_MODES.ON_MANUAL&&i.generateMipmap(e.target),i.texParameteri(e.target,i.TEXTURE_WRAP_S,r.wrapMode),i.texParameteri(e.target,i.TEXTURE_WRAP_T,r.wrapMode),r.mipmap){i.texParameteri(e.target,i.TEXTURE_MIN_FILTER,e.scaleMode===t.SCALE_MODES.LINEAR?i.LINEAR_MIPMAP_LINEAR:i.NEAREST_MIPMAP_NEAREST);var n=this.renderer.context.extensions.anisotropicFiltering;if(n&&e.anisotropicLevel>0&&e.scaleMode===t.SCALE_MODES.LINEAR){var o=Math.min(e.anisotropicLevel,i.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT));i.texParameterf(e.target,n.TEXTURE_MAX_ANISOTROPY_EXT,o)}}else i.texParameteri(e.target,i.TEXTURE_MIN_FILTER,e.scaleMode===t.SCALE_MODES.LINEAR?i.LINEAR:i.NEAREST);i.texParameteri(e.target,i.TEXTURE_MAG_FILTER,e.scaleMode===t.SCALE_MODES.LINEAR?i.LINEAR:i.NEAREST)},e.prototype.destroy=function(){this.renderer=null},e}(),Jn={__proto__:null,FilterSystem:Xi,BatchSystem:Hi,ContextSystem:ji,FramebufferSystem:zi,GeometrySystem:Ki,MaskSystem:In,ScissorSystem:Pn,StencilSystem:Dn,ProjectionSystem:Cn,RenderTextureSystem:Fn,ShaderSystem:zn,StateSystem:qn,TextureGCSystem:Kn,TextureSystem:Qn},$n=new er,to=function(e){function r(r,i){void 0===r&&(r=t.RENDERER_TYPE.UNKNOWN);var n=e.call(this)||this;return i=Object.assign({},it.RENDER_OPTIONS,i),n.options=i,n.type=r,n.screen=new Ke(0,0,i.width,i.height),n.view=i.view||document.createElement("canvas"),n.resolution=i.resolution||it.RESOLUTION,n.useContextAlpha=i.useContextAlpha,n.autoDensity=!!i.autoDensity,n.preserveDrawingBuffer=i.preserveDrawingBuffer,n.clearBeforeRender=i.clearBeforeRender,n._backgroundColor=0,n._backgroundColorRgba=[0,0,0,1],n._backgroundColorString="#000000",n.backgroundColor=i.backgroundColor||n._backgroundColor,n.backgroundAlpha=i.backgroundAlpha,void 0!==i.transparent&&(n.useContextAlpha=i.transparent,n.backgroundAlpha=i.transparent?0:1),n._lastObjectRendered=null,n.plugins={},n}return ti(r,e),r.prototype.initPlugins=function(t){for(var e in t)this.plugins[e]=new t[e](this)},Object.defineProperty(r.prototype,"width",{get:function(){return this.view.width},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"height",{get:function(){return this.view.height},enumerable:!1,configurable:!0}),r.prototype.resize=function(t,e){this.view.width=Math.round(t*this.resolution),this.view.height=Math.round(e*this.resolution);var r=this.view.width/this.resolution,i=this.view.height/this.resolution;this.screen.width=r,this.screen.height=i,this.autoDensity&&(this.view.style.width=r+"px",this.view.style.height=i+"px"),this.emit("resize",r,i)},r.prototype.generateTexture=function(t,e,r,i){void 0===e&&(e={}),"number"==typeof e&&(e={scaleMode:e,resolution:r,region:i});var n=e.region,o=function(t,e){var r={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.indexOf(i)<0&&(r[i]=t[i]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(i=Object.getOwnPropertySymbols(t);n=t.data.byteLength)e.bufferSubData(t.type,0,t.data);else{var n=t.static?e.STATIC_DRAW:e.DYNAMIC_DRAW;i.byteLength=t.data.byteLength,e.bufferData(t.type,t.data,n)}},t.prototype.dispose=function(t,e){if(this.managedBuffers[t.id]){delete this.managedBuffers[t.id];var r=t._glBuffers[this.CONTEXT_UID],i=this.gl;t.disposeRunner.remove(this),r&&(e||i.deleteBuffer(r.buffer),delete t._glBuffers[this.CONTEXT_UID])}},t.prototype.disposeAll=function(t){for(var e=Object.keys(this.managedBuffers),r=0;r=t.MSAA_QUALITY.HIGH?this.multisample=t.MSAA_QUALITY.HIGH:e>=t.MSAA_QUALITY.MEDIUM?this.multisample=t.MSAA_QUALITY.MEDIUM:e>=t.MSAA_QUALITY.LOW?this.multisample=t.MSAA_QUALITY.LOW:this.multisample=t.MSAA_QUALITY.NONE},r.prototype.addSystem=function(t,e){var r=new t(this);if(this[e])throw new Error('Whoops! The name "'+e+'" is already in use');for(var i in this[e]=r,this.runners)this.runners[i].add(r);return this},r.prototype.render=function(t,e){var r,i,n,o;if(e&&(e instanceof xi?(r=e,i=arguments[2],n=arguments[3],o=arguments[4]):(r=e.renderTexture,i=e.clear,n=e.transform,o=e.skipUpdateTransform)),this.renderingToScreen=!r,this.runners.prerender.emit(),this.emit("prerender"),this.projection.transform=n,!this.context.isLost){if(r||(this._lastObjectRendered=t),!o){var s=t.enableTempParent();t.updateTransform(),t.disableTempParent(s)}this.renderTexture.bind(r),this.batch.currentRenderer.start(),(void 0!==i?i:this.clearBeforeRender)&&this.renderTexture.clear(),t.render(this),this.batch.currentRenderer.flush(),r&&r.baseTexture.update(),this.runners.postrender.emit(),this.projection.transform=null,this.emit("postrender")}},r.prototype.generateTexture=function(t,r,i,n){void 0===r&&(r={});var o=e.prototype.generateTexture.call(this,t,r,i,n);return this.framebuffer.blit(),o},r.prototype.resize=function(t,r){e.prototype.resize.call(this,t,r),this.runners.resize.emit(this.screen.height,this.screen.width)},r.prototype.reset=function(){return this.runners.reset.emit(),this},r.prototype.clear=function(){this.renderTexture.bind(),this.renderTexture.clear()},r.prototype.destroy=function(t){for(var r in this.runners.destroy.emit(),this.runners)this.runners[r].destroy();e.prototype.destroy.call(this,t),this.gl=null},Object.defineProperty(r.prototype,"extract",{get:function(){return this.plugins.extract},enumerable:!1,configurable:!0}),r.registerPlugin=function(t,e){r.__plugins=r.__plugins||{},r.__plugins[t]=e},r}(to);function no(t){return io.create(t)}var oo="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",so="attribute vec2 aVertexPosition;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nuniform vec4 inputSize;\nuniform vec4 outputFrame;\n\nvec4 filterVertexPosition( void )\n{\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\n\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord( void )\n{\n return aVertexPosition * (outputFrame.zw * inputSize.zw);\n}\n\nvoid main(void)\n{\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n",ao=function(){function t(t){this.renderer=t}return t.prototype.destroy=function(){this.renderer=null},t}(),ho=function(){this.texArray=null,this.blend=0,this.type=t.DRAW_MODES.TRIANGLES,this.start=0,this.size=0,this.data=null},uo=function(){function t(){this.elements=[],this.ids=[],this.count=0}return t.prototype.clear=function(){for(var t=0;tthis.size&&this.flush(),this._vertexCount+=t.vertexData.length/2,this._indexCount+=t.indices.length,this._bufferedTextures[this._bufferSize]=t._texture.baseTexture,this._bufferedElements[this._bufferSize++]=t)},r.prototype.buildTexturesAndDrawCalls=function(){var t=this._bufferedTextures,e=this.MAX_TEXTURES,i=r._textureArrayPool,n=this.renderer.batch,o=this._tempBoundTextures,s=this.renderer.textureGC.count,a=++oi._globalBatch,h=0,u=i[0],l=0;n.copyBoundTextures(o,e);for(var c=0;c=e&&(n.boundArray(u,o,a,e),this.buildDrawCalls(u,l,c),l=c,u=i[++h],++a),d._batchEnabled=a,d.touched=s,u.elements[u.count++]=d)}for(u.count>0&&(n.boundArray(u,o,a,e),this.buildDrawCalls(u,l,this._bufferSize),++h,++a),c=0;c0&&(e+="\nelse "),r1&&"undefined"==typeof MSStream},as=function(t){var e={userAgent:"",platform:"",maxTouchPoints:0};t||"undefined"==typeof navigator?"string"==typeof t?e.userAgent=t:t&&t.userAgent&&(e={userAgent:t.userAgent,platform:t.platform,maxTouchPoints:t.maxTouchPoints||0}):e={userAgent:navigator.userAgent,platform:navigator.platform,maxTouchPoints:navigator.maxTouchPoints||0};var r=e.userAgent,i=r.split("[FBAN");void 0!==i[1]&&(r=i[0]),void 0!==(i=r.split("Twitter"))[1]&&(r=i[0]);var n=function(t){return function(e){return e.test(t)}}(r),o={apple:{phone:n(Vo)&&!n($o),ipod:n(Wo),tablet:!n(Vo)&&(n(zo)||ss(e))&&!n($o),universal:n(qo),device:(n(Vo)||n(Wo)||n(zo)||n(qo)||ss(e))&&!n($o)},amazon:{phone:n(Qo),tablet:!n(Qo)&&n(Jo),device:n(Qo)||n(Jo)},android:{phone:!n($o)&&n(Qo)||!n($o)&&n(Ko),tablet:!n($o)&&!n(Qo)&&!n(Ko)&&(n(Jo)||n(Zo)),device:!n($o)&&(n(Qo)||n(Jo)||n(Ko)||n(Zo))||n(/\bokhttp\b/i)},windows:{phone:n($o),tablet:n(ts),device:n($o)||n(ts)},other:{blackberry:n(es),blackberry10:n(rs),opera:n(is),firefox:n(os),chrome:n(ns),device:n(es)||n(rs)||n(is)||n(os)||n(ns)},any:!1,phone:!1,tablet:!1};return o.any=o.apple.device||o.android.device||o.windows.device||o.other.device,o.phone=o.apple.phone||o.android.phone||o.windows.phone,o.tablet=o.apple.tablet||o.android.tablet||o.windows.tablet,o}(globalThis.navigator);!function(t){t[t.WEBGL_LEGACY=0]="WEBGL_LEGACY",t[t.WEBGL=1]="WEBGL",t[t.WEBGL2=2]="WEBGL2"}(So||(So={})),function(t){t[t.UNKNOWN=0]="UNKNOWN",t[t.WEBGL=1]="WEBGL",t[t.CANVAS=2]="CANVAS"}(Oo||(Oo={})),function(t){t[t.COLOR=16384]="COLOR",t[t.DEPTH=256]="DEPTH",t[t.STENCIL=1024]="STENCIL"}(Io||(Io={})),function(t){t[t.NORMAL=0]="NORMAL",t[t.ADD=1]="ADD",t[t.MULTIPLY=2]="MULTIPLY",t[t.SCREEN=3]="SCREEN",t[t.OVERLAY=4]="OVERLAY",t[t.DARKEN=5]="DARKEN",t[t.LIGHTEN=6]="LIGHTEN",t[t.COLOR_DODGE=7]="COLOR_DODGE",t[t.COLOR_BURN=8]="COLOR_BURN",t[t.HARD_LIGHT=9]="HARD_LIGHT",t[t.SOFT_LIGHT=10]="SOFT_LIGHT",t[t.DIFFERENCE=11]="DIFFERENCE",t[t.EXCLUSION=12]="EXCLUSION",t[t.HUE=13]="HUE",t[t.SATURATION=14]="SATURATION",t[t.COLOR=15]="COLOR",t[t.LUMINOSITY=16]="LUMINOSITY",t[t.NORMAL_NPM=17]="NORMAL_NPM",t[t.ADD_NPM=18]="ADD_NPM",t[t.SCREEN_NPM=19]="SCREEN_NPM",t[t.NONE=20]="NONE",t[t.SRC_OVER=0]="SRC_OVER",t[t.SRC_IN=21]="SRC_IN",t[t.SRC_OUT=22]="SRC_OUT",t[t.SRC_ATOP=23]="SRC_ATOP",t[t.DST_OVER=24]="DST_OVER",t[t.DST_IN=25]="DST_IN",t[t.DST_OUT=26]="DST_OUT",t[t.DST_ATOP=27]="DST_ATOP",t[t.ERASE=26]="ERASE",t[t.SUBTRACT=28]="SUBTRACT",t[t.XOR=29]="XOR"}(Mo||(Mo={})),function(t){t[t.POINTS=0]="POINTS",t[t.LINES=1]="LINES",t[t.LINE_LOOP=2]="LINE_LOOP",t[t.LINE_STRIP=3]="LINE_STRIP",t[t.TRIANGLES=4]="TRIANGLES",t[t.TRIANGLE_STRIP=5]="TRIANGLE_STRIP",t[t.TRIANGLE_FAN=6]="TRIANGLE_FAN"}(No||(No={})),function(t){t[t.RGBA=6408]="RGBA",t[t.RGB=6407]="RGB",t[t.RG=33319]="RG",t[t.RED=6403]="RED",t[t.RGBA_INTEGER=36249]="RGBA_INTEGER",t[t.RGB_INTEGER=36248]="RGB_INTEGER",t[t.RG_INTEGER=33320]="RG_INTEGER",t[t.RED_INTEGER=36244]="RED_INTEGER",t[t.ALPHA=6406]="ALPHA",t[t.LUMINANCE=6409]="LUMINANCE",t[t.LUMINANCE_ALPHA=6410]="LUMINANCE_ALPHA",t[t.DEPTH_COMPONENT=6402]="DEPTH_COMPONENT",t[t.DEPTH_STENCIL=34041]="DEPTH_STENCIL"}(Po||(Po={})),function(t){t[t.TEXTURE_2D=3553]="TEXTURE_2D",t[t.TEXTURE_CUBE_MAP=34067]="TEXTURE_CUBE_MAP",t[t.TEXTURE_2D_ARRAY=35866]="TEXTURE_2D_ARRAY",t[t.TEXTURE_CUBE_MAP_POSITIVE_X=34069]="TEXTURE_CUBE_MAP_POSITIVE_X",t[t.TEXTURE_CUBE_MAP_NEGATIVE_X=34070]="TEXTURE_CUBE_MAP_NEGATIVE_X",t[t.TEXTURE_CUBE_MAP_POSITIVE_Y=34071]="TEXTURE_CUBE_MAP_POSITIVE_Y",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Y=34072]="TEXTURE_CUBE_MAP_NEGATIVE_Y",t[t.TEXTURE_CUBE_MAP_POSITIVE_Z=34073]="TEXTURE_CUBE_MAP_POSITIVE_Z",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Z=34074]="TEXTURE_CUBE_MAP_NEGATIVE_Z"}(Do||(Do={})),function(t){t[t.UNSIGNED_BYTE=5121]="UNSIGNED_BYTE",t[t.UNSIGNED_SHORT=5123]="UNSIGNED_SHORT",t[t.UNSIGNED_SHORT_5_6_5=33635]="UNSIGNED_SHORT_5_6_5",t[t.UNSIGNED_SHORT_4_4_4_4=32819]="UNSIGNED_SHORT_4_4_4_4",t[t.UNSIGNED_SHORT_5_5_5_1=32820]="UNSIGNED_SHORT_5_5_5_1",t[t.UNSIGNED_INT=5125]="UNSIGNED_INT",t[t.UNSIGNED_INT_10F_11F_11F_REV=35899]="UNSIGNED_INT_10F_11F_11F_REV",t[t.UNSIGNED_INT_2_10_10_10_REV=33640]="UNSIGNED_INT_2_10_10_10_REV",t[t.UNSIGNED_INT_24_8=34042]="UNSIGNED_INT_24_8",t[t.UNSIGNED_INT_5_9_9_9_REV=35902]="UNSIGNED_INT_5_9_9_9_REV",t[t.BYTE=5120]="BYTE",t[t.SHORT=5122]="SHORT",t[t.INT=5124]="INT",t[t.FLOAT=5126]="FLOAT",t[t.FLOAT_32_UNSIGNED_INT_24_8_REV=36269]="FLOAT_32_UNSIGNED_INT_24_8_REV",t[t.HALF_FLOAT=36193]="HALF_FLOAT"}(Co||(Co={})),function(t){t[t.FLOAT=0]="FLOAT",t[t.INT=1]="INT",t[t.UINT=2]="UINT"}(wo||(wo={})),function(t){t[t.NEAREST=0]="NEAREST",t[t.LINEAR=1]="LINEAR"}(Lo||(Lo={})),function(t){t[t.CLAMP=33071]="CLAMP",t[t.REPEAT=10497]="REPEAT",t[t.MIRRORED_REPEAT=33648]="MIRRORED_REPEAT"}(Fo||(Fo={})),function(t){t[t.OFF=0]="OFF",t[t.POW2=1]="POW2",t[t.ON=2]="ON",t[t.ON_MANUAL=3]="ON_MANUAL"}(Uo||(Uo={})),function(t){t[t.NPM=0]="NPM",t[t.UNPACK=1]="UNPACK",t[t.PMA=2]="PMA",t[t.NO_PREMULTIPLIED_ALPHA=0]="NO_PREMULTIPLIED_ALPHA",t[t.PREMULTIPLY_ON_UPLOAD=1]="PREMULTIPLY_ON_UPLOAD",t[t.PREMULTIPLY_ALPHA=2]="PREMULTIPLY_ALPHA",t[t.PREMULTIPLIED_ALPHA=2]="PREMULTIPLIED_ALPHA"}(Bo||(Bo={})),function(t){t[t.NO=0]="NO",t[t.YES=1]="YES",t[t.AUTO=2]="AUTO",t[t.BLEND=0]="BLEND",t[t.CLEAR=1]="CLEAR",t[t.BLIT=2]="BLIT"}(Go||(Go={})),function(t){t[t.AUTO=0]="AUTO",t[t.MANUAL=1]="MANUAL"}(Xo||(Xo={})),function(t){t.LOW="lowp",t.MEDIUM="mediump",t.HIGH="highp"}(ko||(ko={})),function(t){t[t.NONE=0]="NONE",t[t.SCISSOR=1]="SCISSOR",t[t.STENCIL=2]="STENCIL",t[t.SPRITE=3]="SPRITE"}(Ho||(Ho={})),function(t){t[t.NONE=0]="NONE",t[t.LOW=2]="LOW",t[t.MEDIUM=4]="MEDIUM",t[t.HIGH=8]="HIGH"}(Yo||(Yo={})),function(t){t[t.ELEMENT_ARRAY_BUFFER=34963]="ELEMENT_ARRAY_BUFFER",t[t.ARRAY_BUFFER=34962]="ARRAY_BUFFER",t[t.UNIFORM_BUFFER=35345]="UNIFORM_BUFFER"}(jo||(jo={}));Uo.POW2,Yo.NONE,function(t){var e,r=!0;(as.tablet||as.phone)&&(as.apple.device&&(e=navigator.userAgent.match(/OS (\d+)_(\d+)?/))&&parseInt(e[1],10)<11&&(r=!1),as.android.device&&(e=navigator.userAgent.match(/Android\s([0-9.]*)/))&&parseInt(e[1],10)<7&&(r=!1))}(),Xo.AUTO,Fo.CLAMP,Lo.LINEAR,ko.HIGH,as.apple.device?ko.HIGH:ko.MEDIUM,as.apple.device;var hs=!1,us=function(){function t(){this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,this.rect=null,this.updateID=-1}return t.prototype.isEmpty=function(){return this.minX>this.maxX||this.minY>this.maxY},t.prototype.clear=function(){this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0},t.prototype.getRectangle=function(t){return this.minX>this.maxX||this.minY>this.maxY?Ke.EMPTY:((t=t||new Ke(0,0,1,1)).x=this.minX,t.y=this.minY,t.width=this.maxX-this.minX,t.height=this.maxY-this.minY,t)},t.prototype.addPoint=function(t){this.minX=Math.min(this.minX,t.x),this.maxX=Math.max(this.maxX,t.x),this.minY=Math.min(this.minY,t.y),this.maxY=Math.max(this.maxY,t.y)},t.prototype.addPointMatrix=function(t,e){var r=t.a,i=t.b,n=t.c,o=t.d,s=t.tx,a=t.ty,h=r*e.x+n*e.y+s,u=i*e.x+o*e.y+a;this.minX=Math.min(this.minX,h),this.maxX=Math.max(this.maxX,h),this.minY=Math.min(this.minY,u),this.maxY=Math.max(this.maxY,u)},t.prototype.addQuad=function(t){var e=this.minX,r=this.minY,i=this.maxX,n=this.maxY,o=t[0],s=t[1];e=oi?o:i,n=s>n?s:n,e=(o=t[2])i?o:i,n=s>n?s:n,e=(o=t[4])i?o:i,n=s>n?s:n,e=(o=t[6])i?o:i,n=s>n?s:n,this.minX=e,this.minY=r,this.maxX=i,this.maxY=n},t.prototype.addFrame=function(t,e,r,i,n){this.addFrameMatrix(t.worldTransform,e,r,i,n)},t.prototype.addFrameMatrix=function(t,e,r,i,n){var o=t.a,s=t.b,a=t.c,h=t.d,u=t.tx,l=t.ty,c=this.minX,d=this.minY,f=this.maxX,p=this.maxY,_=o*e+a*r+u,m=s*e+h*r+l;c=_f?_:f,p=m>p?m:p,c=(_=o*i+a*r+u)f?_:f,p=m>p?m:p,c=(_=o*e+a*n+u)f?_:f,p=m>p?m:p,c=(_=o*i+a*n+u)f?_:f,p=m>p?m:p,this.minX=c,this.minY=d,this.maxX=f,this.maxY=p},t.prototype.addVertexData=function(t,e,r){for(var i=this.minX,n=this.minY,o=this.maxX,s=this.maxY,a=e;ao?h:o,s=u>s?u:s}this.minX=i,this.minY=n,this.maxX=o,this.maxY=s},t.prototype.addVertices=function(t,e,r,i){this.addVerticesMatrix(t.worldTransform,e,r,i)},t.prototype.addVerticesMatrix=function(t,e,r,i,n,o){void 0===n&&(n=0),void 0===o&&(o=n);for(var s=t.a,a=t.b,h=t.c,u=t.d,l=t.tx,c=t.ty,d=this.minX,f=this.minY,p=this.maxX,_=this.maxY,m=r;mi?t.maxX:i,this.maxY=t.maxY>n?t.maxY:n},t.prototype.addBoundsMask=function(t,e){var r=t.minX>e.minX?t.minX:e.minX,i=t.minY>e.minY?t.minY:e.minY,n=t.maxXh?n:h,this.maxY=o>u?o:u}},t.prototype.addBoundsMatrix=function(t,e){this.addFrameMatrix(e,t.minX,t.minY,t.maxX,t.maxY)},t.prototype.addBoundsArea=function(t,e){var r=t.minX>e.x?t.minX:e.x,i=t.minY>e.y?t.minY:e.y,n=t.maxXh?n:h,this.maxY=o>u?o:u}},t.prototype.pad=function(t,e){void 0===t&&(t=0),void 0===e&&(e=t),this.isEmpty()||(this.minX-=t,this.maxX+=t,this.minY-=e,this.maxY+=e)},t.prototype.addFramePad=function(t,e,r,i,n,o){t-=n,e-=o,r+=n,i+=o,this.minX=this.minXr?this.maxX:r,this.minY=this.minYi?this.maxY:i},t}(),ls=function(t,e){return ls=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},ls(t,e)};function cs(t,e){function r(){this.constructor=t}ls(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}var ds,fs,ps,_s,ms,vs,Es,ys,gs,Ts,bs,xs,Rs,As,Ss,Os,Is,Ms,Ns,Ps=function(t){function e(){var e=t.call(this)||this;return e.tempDisplayObjectParent=null,e.transform=new lr,e.alpha=1,e.visible=!0,e.renderable=!0,e.cullable=!1,e.cullArea=null,e.parent=null,e.worldAlpha=1,e._lastSortedIndex=0,e._zIndex=0,e.filterArea=null,e.filters=null,e._enabledFilters=null,e._bounds=new us,e._localBounds=null,e._boundsID=0,e._boundsRect=null,e._localBoundsRect=null,e._mask=null,e._maskRefCount=0,e._destroyed=!1,e.isSprite=!1,e.isMask=!1,e}return cs(e,t),e.mixin=function(t){for(var r=Object.keys(t),i=0;i1)for(var i=0;ithis.children.length)throw new Error(t+"addChildAt: The index "+e+" supplied is out of bounds "+this.children.length);return t.parent&&t.parent.removeChild(t),t.parent=this,this.sortDirty=!0,t.transform._parentID=-1,this.children.splice(e,0,t),this._boundsID++,this.onChildrenChange(e),t.emit("added",this),this.emit("childAdded",t,this,e),t},e.prototype.swapChildren=function(t,e){if(t!==e){var r=this.getChildIndex(t),i=this.getChildIndex(e);this.children[r]=e,this.children[i]=t,this.onChildrenChange(r=this.children.length)throw new Error("The index "+e+" supplied is out of bounds "+this.children.length);var r=this.getChildIndex(t);Me(this.children,r,1),this.children.splice(e,0,t),this.onChildrenChange(e)},e.prototype.getChildAt=function(t){if(t<0||t>=this.children.length)throw new Error("getChildAt: Index ("+t+") does not exist.");return this.children[t]},e.prototype.removeChild=function(){for(var t=arguments,e=[],r=0;r1)for(var i=0;i0&&n<=e){r=this.children.splice(i,n);for(var o=0;o1&&this.children.sort(Cs),this.sortDirty=!1},e.prototype.updateTransform=function(){this.sortableChildren&&this.sortDirty&&this.sortChildren(),this._boundsID++,this.transform.updateTransform(this.parent.transform),this.worldAlpha=this.alpha*this.parent.worldAlpha;for(var t=0,e=this.children.length;t0&&r.height>0){var i,n;if(this.cullArea?(i=this.cullArea,n=this.worldTransform):this._render!==e.prototype._render&&(i=this.getBounds(!0)),i&&r.intersects(i,n))this._render(t);else if(this.cullArea)return;for(var o=0,s=this.children.length;o0||e.responseType===t.XHR_RESPONSE_TYPE.BUFFER)?i=200:1223===i&&(i=204),2==(i/100|0)){if(this.xhrType===t.XHR_RESPONSE_TYPE.TEXT)this.data=r,this.type=t.TYPE.TEXT;else if(this.xhrType===t.XHR_RESPONSE_TYPE.JSON)try{this.data=JSON.parse(r),this.type=t.TYPE.JSON}catch(t){return void this.abort("Error trying to parse loaded json: "+t)}else if(this.xhrType===t.XHR_RESPONSE_TYPE.DOCUMENT)try{if(globalThis.DOMParser){var n=new DOMParser;this.data=n.parseFromString(r,"text/xml")}else{var o=document.createElement("div");o.innerHTML=r,this.data=o}this.type=t.TYPE.XML}catch(t){return void this.abort("Error trying to parse loaded xml: "+t)}else this.data=e.response||r;this.complete()}else this.abort("["+e.status+"] "+e.statusText+": "+e.responseURL)},t.prototype._determineCrossOrigin=function(t,e){if(0===t.indexOf("data:"))return"";if(globalThis.origin!==globalThis.location.origin)return"anonymous";e=e||globalThis.location,Hs||(Hs=document.createElement("a")),Hs.href=t;var r=ks(Hs.href,{strictMode:!0}),i=!r.port&&""===e.port||r.port===e.port,n=r.protocol?r.protocol+":":"";return r.host===e.hostname&&i&&n===e.protocol?"":"anonymous"},t.prototype._determineXhrType=function(){return t._xhrTypeMap[this.extension]||t.XHR_RESPONSE_TYPE.TEXT},t.prototype._determineLoadType=function(){return t._loadTypeMap[this.extension]||t.LOAD_TYPE.XHR},t.prototype._getExtension=function(t){void 0===t&&(t=this.url);var e="";if(this.isDataUrl){var r=t.indexOf("/");e=t.substring(r+1,t.indexOf(";",r))}else{var i=t.indexOf("?"),n=t.indexOf("#"),o=Math.min(i>-1?i:t.length,n>-1?n:t.length);e=(t=t.substring(0,o)).substring(t.lastIndexOf(".")+1)}return e.toLowerCase()},t.prototype._getMimeFromXhrType=function(e){switch(e){case t.XHR_RESPONSE_TYPE.BUFFER:return"application/octet-binary";case t.XHR_RESPONSE_TYPE.BLOB:return"application/blob";case t.XHR_RESPONSE_TYPE.DOCUMENT:return"application/xml";case t.XHR_RESPONSE_TYPE.JSON:return"application/json";case t.XHR_RESPONSE_TYPE.DEFAULT:case t.XHR_RESPONSE_TYPE.TEXT:default:return"text/plain"}},t}(),function(t){var e,r,i,n;(e=t.STATUS_FLAGS||(t.STATUS_FLAGS={}))[e.NONE=0]="NONE",e[e.DATA_URL=1]="DATA_URL",e[e.COMPLETE=2]="COMPLETE",e[e.LOADING=4]="LOADING",(r=t.TYPE||(t.TYPE={}))[r.UNKNOWN=0]="UNKNOWN",r[r.JSON=1]="JSON",r[r.XML=2]="XML",r[r.IMAGE=3]="IMAGE",r[r.AUDIO=4]="AUDIO",r[r.VIDEO=5]="VIDEO",r[r.TEXT=6]="TEXT",(i=t.LOAD_TYPE||(t.LOAD_TYPE={}))[i.XHR=1]="XHR",i[i.IMAGE=2]="IMAGE",i[i.AUDIO=3]="AUDIO",i[i.VIDEO=4]="VIDEO",(n=t.XHR_RESPONSE_TYPE||(t.XHR_RESPONSE_TYPE={})).DEFAULT="text",n.BUFFER="arraybuffer",n.BLOB="blob",n.DOCUMENT="document",n.JSON="json",n.TEXT="text",t._loadTypeMap={gif:t.LOAD_TYPE.IMAGE,png:t.LOAD_TYPE.IMAGE,bmp:t.LOAD_TYPE.IMAGE,jpg:t.LOAD_TYPE.IMAGE,jpeg:t.LOAD_TYPE.IMAGE,tif:t.LOAD_TYPE.IMAGE,tiff:t.LOAD_TYPE.IMAGE,webp:t.LOAD_TYPE.IMAGE,tga:t.LOAD_TYPE.IMAGE,svg:t.LOAD_TYPE.IMAGE,"svg+xml":t.LOAD_TYPE.IMAGE,mp3:t.LOAD_TYPE.AUDIO,ogg:t.LOAD_TYPE.AUDIO,wav:t.LOAD_TYPE.AUDIO,mp4:t.LOAD_TYPE.VIDEO,webm:t.LOAD_TYPE.VIDEO},t._xhrTypeMap={xhtml:t.XHR_RESPONSE_TYPE.DOCUMENT,html:t.XHR_RESPONSE_TYPE.DOCUMENT,htm:t.XHR_RESPONSE_TYPE.DOCUMENT,xml:t.XHR_RESPONSE_TYPE.DOCUMENT,tmx:t.XHR_RESPONSE_TYPE.DOCUMENT,svg:t.XHR_RESPONSE_TYPE.DOCUMENT,tsx:t.XHR_RESPONSE_TYPE.DOCUMENT,gif:t.XHR_RESPONSE_TYPE.BLOB,png:t.XHR_RESPONSE_TYPE.BLOB,bmp:t.XHR_RESPONSE_TYPE.BLOB,jpg:t.XHR_RESPONSE_TYPE.BLOB,jpeg:t.XHR_RESPONSE_TYPE.BLOB,tif:t.XHR_RESPONSE_TYPE.BLOB,tiff:t.XHR_RESPONSE_TYPE.BLOB,webp:t.XHR_RESPONSE_TYPE.BLOB,tga:t.XHR_RESPONSE_TYPE.BLOB,json:t.XHR_RESPONSE_TYPE.JSON,text:t.XHR_RESPONSE_TYPE.TEXT,txt:t.XHR_RESPONSE_TYPE.TEXT,ttf:t.XHR_RESPONSE_TYPE.BUFFER,otf:t.XHR_RESPONSE_TYPE.BUFFER},t.EMPTY_GIF="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="}(t.LoaderResource||(t.LoaderResource={}));var qs=function(t,e){this.data=t,this.callback=e},Ks=function(){function t(t,e){var r=this;if(void 0===e&&(e=1),this.workers=0,this.saturated=Ws,this.unsaturated=Ws,this.empty=Ws,this.drain=Ws,this.error=Ws,this.started=!1,this.paused=!1,this._tasks=[],this._insert=function(t,e,i){if(i&&"function"!=typeof i)throw new Error("task callback must be a function");if(r.started=!0,null==t&&r.idle())setTimeout((function(){return r.drain()}),1);else{var n=new qs(t,"function"==typeof i?i:Ws);e?r._tasks.unshift(n):r._tasks.push(n),setTimeout(r.process,1)}},this.process=function(){for(;!r.paused&&r.workers>2,n[1]=(3&i[0])<<4|i[1]>>4,n[2]=(15&i[1])<<2|i[2]>>6,n[3]=63&i[2],r-(t.length-1)){case 2:n[3]=64,n[2]=64;break;case 1:n[3]=64}for(o=0;o0&&n[n.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!n||o[1]>n[0]&&o[1]=33776&&t<=33779)return"s3tc";if(t>=37488&&t<=37497)return"etc";if(t>=35840&&t<=35843)return"pvrtc";if(t>=36196)return"etc1";if(t>=35986&&t<=34798)return"atc";throw new Error("Invalid (compressed) texture format given!")},e._createLevelBuffers=function(t,e,r,i,n,o,s){for(var a=new Array(r),h=t.byteOffset,u=o,l=s,c=u+i-1&~(i-1),d=l+n-1&~(n-1),f=c*d*ea[e],p=0;p1?u:c,levelHeight:r>1?l:d,levelBuffer:new Uint8Array(t.buffer,h,f)},h+=f,f=(c=(u=u>>1||1)+i-1&~(i-1))*(d=(l=l>>1||1)+n-1&~(n-1))*ea[e];return a},e}(sa),ha=function(){function e(){}return e.use=function(r,i){var n=r.data;if(r.type===t.LoaderResource.TYPE.JSON&&n&&n.cacheID&&n.textures){for(var o=n.textures,s=void 0,a=void 0,h=0,u=o.length;h>>=1,T>>>=1;var x=148;for(b=0;b<_;b++)v.push(new Uint8Array(t,x,y)),x+=y}return v.map((function(t){return new aa(t,{format:m,width:n,height:i,levels:o})}))}if(64&a)throw new Error("DDSLoader does not support uncompressed texture data.");if(512&a)throw new Error("DDSLoader does not supported YUV uncompressed texture data.");if(131072&a)throw new Error("DDSLoader does not support single-channel (lumninance) texture data!");if(2&a)throw new Error("DDSLoader does not support single-channel (alpha) texture data!");throw new Error("DDSLoader failed to load a texture file due to an unknown reason!")},t}();t.LoaderResource.setExtensionXhrType("ktx",t.LoaderResource.XHR_RESPONSE_TYPE.BUFFER);var Ea=[171,75,84,88,32,49,49,187,13,10,26,10],ya=((da={})[t.TYPES.UNSIGNED_BYTE]=1,da[t.TYPES.UNSIGNED_SHORT]=2,da[t.TYPES.INT]=4,da[t.TYPES.UNSIGNED_INT]=4,da[t.TYPES.FLOAT]=4,da[t.TYPES.HALF_FLOAT]=8,da),ga=((fa={})[t.FORMATS.RGBA]=4,fa[t.FORMATS.RGB]=3,fa[t.FORMATS.RG]=2,fa[t.FORMATS.RED]=1,fa[t.FORMATS.LUMINANCE]=1,fa[t.FORMATS.LUMINANCE_ALPHA]=2,fa[t.FORMATS.ALPHA]=1,fa),Ta=((pa={})[t.TYPES.UNSIGNED_SHORT_4_4_4_4]=2,pa[t.TYPES.UNSIGNED_SHORT_5_5_5_1]=2,pa[t.TYPES.UNSIGNED_SHORT_5_6_5]=2,pa),ba=function(){function e(){}return e.use=function(r,i){if("ktx"===r.extension&&r.data)try{var n=r.name||r.url,o=e.parse(n,r.data),s=o.compressed,a=o.uncompressed,h=o.kvData;if(s){var u=ua(n,s,r.metadata);if(h&&u.textures)for(var l in u.textures)u.textures[l].baseTexture.ktxKeyValueData=h;Object.assign(r,u)}else if(a){var c={};a.forEach((function(e,r){var i=new bi(new oi(e.resource,{mipmap:t.MIPMAP_MODES.OFF,alphaMode:t.ALPHA_MODES.NO_PREMULTIPLIED_ALPHA,type:e.type,format:e.format})),o=n+"-"+(r+1);h&&(i.baseTexture.ktxKeyValueData=h),oi.addToCache(i.baseTexture,o),bi.addToCache(i,o),0===r&&(c[n]=i,oi.addToCache(i.baseTexture,n),bi.addToCache(i,n)),c[o]=i})),Object.assign(r,{textures:c})}}catch(t){return void i(t)}i()},e.parse=function(r,i){var n=new DataView(i);if(!e.validate(r,n))return null;var o=67305985===n.getUint32(12,!0),s=n.getUint32(16,o),a=n.getUint32(24,o),h=n.getUint32(28,o),u=n.getUint32(36,o),l=n.getUint32(40,o)||1,c=n.getUint32(44,o)||1,d=n.getUint32(48,o)||1,f=n.getUint32(52,o),p=n.getUint32(56,o),_=n.getUint32(60,o);if(0===l||1!==c)throw new Error("Only 2D textures are supported");if(1!==f)throw new Error("CubeTextures are not supported by KTXLoader yet!");if(1!==d)throw new Error("WebGL does not support array textures");var m,v=u+3&-4,E=l+3&-4,y=new Array(d),g=u*l;if(0===s&&(g=v*E),void 0===(m=0!==s?ya[s]?ya[s]*ga[a]:Ta[s]:ea[h]))throw new Error("Unable to resolve the pixel format stored in the *.ktx file!");for(var T=e.loadKeyValueData?e.parseKvData(n,_,o):null,b=g*m,x=u,R=l,A=v,S=E,O=64+_,I=0;I1||0!==s?x:A,levelHeight:p>1||0!==s?R:S,levelBuffer:new Uint8Array(i,N,b)},N+=b}O=(O+=M+4)%4!=0?O+4-O%4:O,b=(A=(x=x>>1||1)+4-1&-4)*(S=(R=R>>1||1)+4-1&-4)*m}return 0!==s?{uncompressed:y.map((function(r){var i=r[0].levelBuffer,n=!1;return s===t.TYPES.FLOAT?i=new Float32Array(r[0].levelBuffer.buffer,r[0].levelBuffer.byteOffset,r[0].levelBuffer.byteLength/4):s===t.TYPES.UNSIGNED_INT?(n=!0,i=new Uint32Array(r[0].levelBuffer.buffer,r[0].levelBuffer.byteOffset,r[0].levelBuffer.byteLength/4)):s===t.TYPES.INT&&(n=!0,i=new Int32Array(r[0].levelBuffer.buffer,r[0].levelBuffer.byteOffset,r[0].levelBuffer.byteLength/4)),{resource:new ii(i,{width:r[0].levelWidth,height:r[0].levelHeight}),type:s,format:n?e.convertFormatToInteger(a):a}})),kvData:T}:{compressed:y.map((function(t){return new aa(null,{format:h,width:u,height:l,levels:p,levelBuffers:t})})),kvData:T}},e.validate=function(t,e){for(var r=0;re-n){console.error("KTXLoader: keyAndValueByteSize out of bounds");break}for(var h=0;h16384&&(n=16384),s._properties=[!1,!0,!1,!1,!1],s._maxSize=r,s._batchSize=n,s._buffers=null,s._bufferUpdateIDs=[],s._updateID=0,s.interactiveChildren=!1,s.blendMode=t.BLEND_MODES.NORMAL,s.autoResize=o,s.roundPixels=!0,s.baseTexture=null,s.setProperties(i),s._tint=0,s.tintRgb=new Float32Array(4),s.tint=16777215,s}return Ra(r,e),r.prototype.setProperties=function(t){t&&(this._properties[0]="vertices"in t||"scale"in t?!!t.vertices||!!t.scale:this._properties[0],this._properties[1]="position"in t?!!t.position:this._properties[1],this._properties[2]="rotation"in t?!!t.rotation:this._properties[2],this._properties[3]="uvs"in t?!!t.uvs:this._properties[3],this._properties[4]="tint"in t||"alpha"in t?!!t.tint||!!t.alpha:this._properties[4])},r.prototype.updateTransform=function(){this.displayObjectUpdateTransform()},Object.defineProperty(r.prototype,"tint",{get:function(){return this._tint},set:function(t){this._tint=t,pe(t,this.tintRgb)},enumerable:!1,configurable:!0}),r.prototype.render=function(t){var e=this;this.visible&&!(this.worldAlpha<=0)&&this.children.length&&this.renderable&&(this.baseTexture||(this.baseTexture=this.children[0]._texture.baseTexture,this.baseTexture.valid||this.baseTexture.once("update",(function(){return e.onChildrenChange(0)}))),t.batch.setObjectRenderer(t.plugins.particle),t.plugins.particle.render(this))},r.prototype.onChildrenChange=function(t){for(var e=Math.floor(t/this._batchSize);this._bufferUpdateIDs.lengthr&&!t.autoResize&&(o=r);var s=t._buffers;s||(s=t._buffers=this.generateBuffers(t));var a=e[0]._texture.baseTexture;this.state.blendMode=ye(t.blendMode,a.alphaMode),n.state.set(this.state);var h=n.gl,u=t.worldTransform.copyTo(this.tempMatrix);u.prepend(n.globalUniforms.uniforms.projectionMatrix),this.shader.uniforms.translationMatrix=u.toArray(!0),this.shader.uniforms.uColor=ge(t.tintRgb,t.worldAlpha,this.shader.uniforms.uColor,a.alphaMode),this.shader.uniforms.uSampler=a,this.renderer.shader.bind(this.shader);for(var l=!1,c=0,d=0;ci&&(f=i),d>=s.length&&s.push(this._generateOneMoreBuffer(t));var p=s[d];p.uploadDynamic(e,c,f);var _=t._bufferUpdateIDs[d]||0;(l=l||p._updateID<_)&&(p._updateID=t._updateID,p.uploadStatic(e,c,f)),n.geometry.bind(p.geometry),h.drawElements(h.TRIANGLES,6*f,h.UNSIGNED_SHORT,0)}}},r.prototype.generateBuffers=function(t){for(var e=[],r=t._maxSize,i=t._batchSize,n=t._properties,o=0;o0,u=a.alpha,l=u<1&&h?Te(a._tintRGB,u):a._tintRGB+(255*u<<24);i[o]=l,i[o+n]=l,i[o+2*n]=l,i[o+3*n]=l,o+=4*n}},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.shader&&(this.shader.destroy(),this.shader=null),this.tempMatrix=null},r}(ki);t.LINE_JOIN=void 0,t.LINE_CAP=void 0,function(t){t.MITER="miter",t.BEVEL="bevel",t.ROUND="round"}(t.LINE_JOIN||(t.LINE_JOIN={})),function(t){t.BUTT="butt",t.ROUND="round",t.SQUARE="square"}(t.LINE_CAP||(t.LINE_CAP={}));var Ia={adaptive:!0,maxLength:10,minSegments:8,maxSegments:2048,epsilon:1e-4,_segmentsCount:function(t,e){if(void 0===e&&(e=20),!this.adaptive||!t||isNaN(t))return e;var r=Math.ceil(t/this.maxLength);return rthis.maxSegments&&(r=this.maxSegments),r}},Ma=function(){function t(){this.color=16777215,this.alpha=1,this.texture=bi.WHITE,this.matrix=null,this.visible=!1,this.reset()}return t.prototype.clone=function(){var e=new t;return e.color=this.color,e.alpha=this.alpha,e.texture=this.texture,e.matrix=this.matrix,e.visible=this.visible,e},t.prototype.reset=function(){this.color=16777215,this.alpha=1,this.texture=bi.WHITE,this.matrix=null,this.visible=!1},t.prototype.destroy=function(){this.texture=null,this.matrix=null},t}(),Na=function(t,e){return Na=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},Na(t,e)};function Pa(t,e){function r(){this.constructor=t}Na(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}function Da(t,e){var r,i;void 0===e&&(e=!1);var n=t.length;if(!(n<6)){for(var o=0,s=0,a=t[n-2],h=t[n-1];s0||e&&o<=0){var c=n/2;for(s=c+c%2;s=6){Da(r,!1);for(var s=[],a=0;a=0&&a>=0&&n>=0&&o>=0){var p=Math.ceil(2.3*Math.sqrt(s+a)),_=8*p+(n?4:0)+(o?4:0);if(h.length=_,0!==_){if(0===p)return h.length=8,h[0]=h[6]=r+n,h[1]=h[3]=i+o,h[2]=h[4]=r-n,void(h[5]=h[7]=i-o);var m,v,E=0,y=4*p+(n?2:0)+2,g=y,T=_,b=r+(m=n+s),x=r-m,R=i+(v=o);if(h[E++]=b,h[E++]=R,h[--y]=R,h[--y]=x,o){var A=i-v;h[g++]=x,h[g++]=A,h[--T]=A,h[--T]=b}for(var S=1;Sc&&(c+=2*Math.PI);var d=l,f=c-l,p=Math.abs(f),_=Math.sqrt(h*h+u*u),m=1+(15*p*Math.sqrt(_)/Math.PI>>0),v=f/m;if(d+=v,a){s.push(t,e),s.push(r,i);for(var E=1,y=d;Ey?(X?(f.push(W,z),f.push(b+S*C,x+O*C),f.push(W,z),f.push(b+I*C,x+M*C)):(f.push(b-S*D,x-O*D),f.push(q,K),f.push(b-I*D,x-M*D),f.push(q,K)),_+=2):s.join===t.LINE_JOIN.ROUND?X?(f.push(W,z),f.push(b+S*C,x+O*C),_+=Xa(b,x,b+S*C,x+O*C,b+I*C,x+M*C,f,!0)+4,f.push(W,z),f.push(b+I*C,x+M*C)):(f.push(b-S*D,x-O*D),f.push(q,K),_+=Xa(b,x,b-S*D,x-O*D,b-I*D,x-M*D,f,!1)+4,f.push(b-I*D,x-M*D),f.push(q,K)):(f.push(W,z),f.push(q,K)):(f.push(b-S*D,x-O*D),f.push(b+S*C,x+O*C),s.join===t.LINE_JOIN.ROUND?_+=X?Xa(b,x,b+S*C,x+O*C,b+I*C,x+M*C,f,!0)+2:Xa(b,x,b-S*D,x-O*D,b-I*D,x-M*D,f,!1)+2:s.join===t.LINE_JOIN.MITER&&V/E<=y&&(X?(f.push(q,K),f.push(q,K)):(f.push(W,z),f.push(W,z)),_+=2),f.push(b-I*D,x-M*D),f.push(b+I*C,x+M*C),_+=2)}}g=n[2*(p-2)],T=n[2*(p-2)+1],b=n[2*(p-1)],S=-(T-(x=n[2*(p-1)+1])),O=g-b,S/=N=Math.sqrt(S*S+O*O),O/=N,S*=v,O*=v,f.push(b-S*D,x-O*D),f.push(b+S*C,x+O*C),u||(s.cap===t.LINE_CAP.ROUND?_+=Xa(b-S*(D-C)*.5,x-O*(D-C)*.5,b-S*D,x-O*D,b+S*C,x+O*C,f,!1)+2:s.cap===t.LINE_CAP.SQUARE&&(_+=Ga(b,x,S,O,D,C,!1,f)));var Q=r.indices,J=Ia.epsilon*Ia.epsilon;for(w=m;w<_+m-2;++w)g=f[2*w],T=f[2*w+1],b=f[2*(w+1)],x=f[2*(w+1)+1],R=f[2*(w+2)],A=f[2*(w+2)+1],Math.abs(g*(x-A)+b*(A-T)+R*(T-x))l*a}},t.arc=function(t,e,r,i,n,o,s,a,h){for(var u=s-o,l=Ia._segmentsCount(Math.abs(u)*n,40*Math.ceil(Math.abs(u)/je)),c=u/(2*l),d=2*c,f=Math.cos(c),p=Math.sin(c),_=l-1,m=_%1/_,v=0;v<=_;++v){var E=c+o+d*(v+m*v),y=Math.cos(E),g=-Math.sin(E);h.push((f*y+p*g)*n+r,(f*-g+p*y)*n+i)}},t}(),ja=function(){function t(){}return t.curveLength=function(t,e,r,i,n,o,s,a){for(var h=0,u=0,l=0,c=0,d=0,f=0,p=0,_=0,m=0,v=0,E=0,y=t,g=e,T=1;T<=10;++T)v=y-(_=(p=(f=(d=1-(u=T/10))*d)*d)*t+3*f*u*r+3*d*(l=u*u)*n+(c=l*u)*s),E=g-(m=p*e+3*f*u*i+3*d*l*o+c*a),y=_,g=m,h+=Math.sqrt(v*v+E*E);return h},t.curveTo=function(e,r,i,n,o,s,a){var h=a[a.length-2],u=a[a.length-1];a.length-=2;var l=Ia._segmentsCount(t.curveLength(h,u,e,r,i,n,o,s)),c=0,d=0,f=0,p=0,_=0;a.push(h,u);for(var m=1,v=0;m<=l;++m)f=(d=(c=1-(v=m/l))*c)*c,_=(p=v*v)*v,a.push(f*h+3*d*v*e+3*c*p*i+_*o,f*u+3*d*v*r+3*c*p*n+_*s)},t}(),Va=function(){function t(){}return t.curveLength=function(t,e,r,i,n,o){var s=t-2*r+n,a=e-2*i+o,h=2*r-2*t,u=2*i-2*e,l=4*(s*s+a*a),c=4*(s*h+a*u),d=h*h+u*u,f=2*Math.sqrt(l+c+d),p=Math.sqrt(l),_=2*l*p,m=2*Math.sqrt(d),v=c/p;return(_*f+p*c*(f-m)+(4*d*l-c*c)*Math.log((2*p+v+f)/(v+m)))/(4*_)},t.curveTo=function(e,r,i,n,o){for(var s=o[o.length-2],a=o[o.length-1],h=Ia._segmentsCount(t.curveLength(s,a,e,r,i,n)),u=0,l=0,c=1;c<=h;++c){var d=c/h;u=s+(e-s)*d,l=a+(r-a)*d,o.push(u+(e+(i-e)*d-u)*d,l+(r+(n-r)*d-l)*d)}},t}(),Wa=function(){function t(){this.reset()}return t.prototype.begin=function(t,e,r){this.reset(),this.style=t,this.start=e,this.attribStart=r},t.prototype.end=function(t,e){this.attribSize=e-this.attribStart,this.size=t-this.start},t.prototype.reset=function(){this.style=null,this.size=0,this.start=0,this.attribStart=0,this.attribSize=0},t}(),za=((Ha={})[t.SHAPES.POLY]=Ca,Ha[t.SHAPES.CIRC]=wa,Ha[t.SHAPES.ELIP]=wa,Ha[t.SHAPES.RECT]=La,Ha[t.SHAPES.RREC]=Ba,Ha),qa=[],Ka=[],Za=function(){function t(t,e,r,i){void 0===e&&(e=null),void 0===r&&(r=null),void 0===i&&(i=null),this.points=[],this.holes=[],this.shape=t,this.lineStyle=r,this.fillStyle=e,this.matrix=i,this.type=t.type}return t.prototype.clone=function(){return new t(this.shape,this.fillStyle,this.lineStyle,this.matrix)},t.prototype.destroy=function(){this.shape=null,this.holes.length=0,this.holes=null,this.points.length=0,this.points=null,this.lineStyle=null,this.fillStyle=null},t}(),Qa=new ze,Ja=new cr,$a=function(e){function r(){var t=e.call(this)||this;return t.closePointEps=1e-4,t.boundsPadding=0,t.uvsFloat32=null,t.indicesUint16=null,t.batchable=!1,t.points=[],t.colors=[],t.uvs=[],t.indices=[],t.textureIds=[],t.graphicsData=[],t.drawCalls=[],t.batchDirty=-1,t.batches=[],t.dirty=0,t.cacheDirty=-1,t.clearDirty=0,t.shapeIndex=0,t._bounds=new cr,t.boundsDirty=-1,t}return Pa(r,e),Object.defineProperty(r.prototype,"bounds",{get:function(){return this.boundsDirty!==this.dirty&&(this.boundsDirty=this.dirty,this.calculateBounds()),this._bounds},enumerable:!1,configurable:!0}),r.prototype.invalidate=function(){this.boundsDirty=-1,this.dirty++,this.batchDirty++,this.shapeIndex=0,this.points.length=0,this.colors.length=0,this.uvs.length=0,this.indices.length=0,this.textureIds.length=0;for(var t=0;t0&&(this.invalidate(),this.clearDirty++,this.graphicsData.length=0),this},r.prototype.drawShape=function(t,e,r,i){void 0===e&&(e=null),void 0===r&&(r=null),void 0===i&&(i=null);var n=new Za(t,e,r,i);return this.graphicsData.push(n),this.dirty++,this},r.prototype.drawHole=function(t,e){if(void 0===e&&(e=null),!this.graphicsData.length)return null;var r=new Za(t,null,null,e),i=this.graphicsData[this.graphicsData.length-1];return r.lineStyle=i.lineStyle,i.holes.push(r),this.dirty++,this},r.prototype.destroy=function(){e.prototype.destroy.call(this);for(var t=0;t0&&(o=(n=this.batches[this.batches.length-1]).style);for(var s=this.shapeIndex;s65535&&e;this.indicesUint16=E?new Uint32Array(this.indices):new Uint16Array(this.indices)}this.batchable=this.isBatchable(),this.batchable?this.packBatches():this.buildDrawCalls()}else this.batchable=!0}}else this.batchable=!0},r.prototype._compareStyles=function(t,e){return!(!t||!e)&&t.texture.baseTexture===e.texture.baseTexture&&t.color+t.alpha===e.color+e.alpha&&!!t.native==!!e.native},r.prototype.validateBatching=function(){if(this.dirty===this.cacheDirty||!this.graphicsData.length)return!1;for(var t=0,e=this.graphicsData.length;t131070)return!1;for(var t=this.batches,e=0;e0&&((o=Ka.pop())||((o=new ho).texArray=new uo),this.drawCalls.push(o)),o.start=c,o.size=0,o.texArray.count=0,o.type=l),p.touched=1,p._batchEnabled=e,p._batchLocation=s,p.wrapMode=t.WRAP_MODES.REPEAT,o.texArray.elements[o.texArray.count++]=p,s++)),o.size+=d.size,c+=d.size,h=p._batchLocation,this.addColors(i,f.color,f.alpha,d.attribSize,d.attribStart),this.addTextureIds(n,h,d.attribSize,d.attribStart)}oi._globalBatch=e,this.packAttributes()},r.prototype.packAttributes=function(){for(var t=this.points,e=this.uvs,r=this.colors,i=this.textureIds,n=new ArrayBuffer(3*t.length*4),o=new Float32Array(n),s=new Uint32Array(n),a=0,h=0;h>16)+(65280&e)+((255&e)<<16),r);t.length=Math.max(t.length,n+i);for(var s=0;s0&&e.alpha>0;return r?(e.matrix&&(e.matrix=e.matrix.clone(),e.matrix.invert()),Object.assign(this._lineStyle,{visible:r},e)):this._lineStyle.reset(),this},r.prototype.startPoly=function(){if(this.currentPath){var t=this.currentPath.points,e=this.currentPath.points.length;e>2&&(this.drawShape(this.currentPath),this.currentPath=new Je,this.currentPath.closeStroke=!1,this.currentPath.points.push(t[e-2],t[e-1]))}else this.currentPath=new Je,this.currentPath.closeStroke=!1},r.prototype.finishPoly=function(){this.currentPath&&(this.currentPath.points.length>2?(this.drawShape(this.currentPath),this.currentPath=null):this.currentPath.points.length=0)},r.prototype.moveTo=function(t,e){return this.startPoly(),this.currentPath.points[0]=t,this.currentPath.points[1]=e,this},r.prototype.lineTo=function(t,e){this.currentPath||this.moveTo(0,0);var r=this.currentPath.points,i=r[r.length-2],n=r[r.length-1];return i===t&&n===e||r.push(t,e),this},r.prototype._initCurve=function(t,e){void 0===t&&(t=0),void 0===e&&(e=0),this.currentPath?0===this.currentPath.points.length&&(this.currentPath.points=[t,e]):this.moveTo(t,e)},r.prototype.quadraticCurveTo=function(t,e,r,i){this._initCurve();var n=this.currentPath.points;return 0===n.length&&this.moveTo(0,0),Va.curveTo(t,e,r,i,n),this},r.prototype.bezierCurveTo=function(t,e,r,i,n,o){return this._initCurve(),ja.curveTo(t,e,r,i,n,o,this.currentPath.points),this},r.prototype.arcTo=function(t,e,r,i,n){this._initCurve(t,e);var o=this.currentPath.points,s=Ya.curveTo(t,e,r,i,n,o);if(s){var a=s.cx,h=s.cy,u=s.radius,l=s.startAngle,c=s.endAngle,d=s.anticlockwise;this.arc(a,h,u,l,c,d)}return this},r.prototype.arc=function(t,e,r,i,n,o){if(void 0===o&&(o=!1),i===n)return this;if(!o&&n<=i?n+=je:o&&i<=n&&(i+=je),0==n-i)return this;var s=t+Math.cos(i)*r,a=e+Math.sin(i)*r,h=this._geometry.closePointEps,u=this.currentPath?this.currentPath.points:null;if(u){var l=Math.abs(u[u.length-2]-s),c=Math.abs(u[u.length-1]-a);l0;return e?(t.matrix&&(t.matrix=t.matrix.clone(),t.matrix.invert()),Object.assign(this._fillStyle,{visible:e},t)):this._fillStyle.reset(),this},r.prototype.endFill=function(){return this.finishPoly(),this._fillStyle.reset(),this},r.prototype.drawRect=function(t,e,r,i){return this.drawShape(new Ke(t,e,r,i))},r.prototype.drawRoundedRect=function(t,e,r,i,n){return this.drawShape(new $e(t,e,r,i,n))},r.prototype.drawCircle=function(t,e,r){return this.drawShape(new Ze(t,e,r))},r.prototype.drawEllipse=function(t,e,r,i){return this.drawShape(new Qe(t,e,r,i))},r.prototype.drawPolygon=function(){for(var t,e=arguments,r=[],i=0;i>16&255)/255*n,o.tint[1]=(i>>8&255)/255*n,o.tint[2]=(255&i)/255*n,o.tint[3]=n,t.shader.bind(e),t.geometry.bind(r,e),t.state.set(this.state);for(var a=0,h=s.length;a>16)+(65280&n)+((255&n)<<16)}}},r.prototype.calculateVertices=function(){var t=this.transform._worldID;if(this._transformID!==t){this._transformID=t;for(var e=this.transform.worldTransform,r=e.a,i=e.b,n=e.c,o=e.d,s=e.tx,a=e.ty,h=this._geometry.points,u=this.vertexData,l=0,c=0;c=i&&sh.x=n&&sh.y>16)+(65280&t)+((255&t)<<16)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"texture",{get:function(){return this._texture},set:function(t){this._texture!==t&&(this._texture&&this._texture.off("update",this._onTextureUpdate,this),this._texture=t||bi.EMPTY,this._cachedTint=16777215,this._textureID=-1,this._textureTrimmedID=-1,t&&(t.baseTexture.valid?this._onTextureUpdate():t.once("update",this._onTextureUpdate,this)))},enumerable:!1,configurable:!0}),r}(Fr);t.TEXT_GRADIENT=void 0;var uh=function(t,e){return uh=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},uh(t,e)};!function(t){t[t.LINEAR_VERTICAL=0]="LINEAR_VERTICAL",t[t.LINEAR_HORIZONTAL=1]="LINEAR_HORIZONTAL"}(t.TEXT_GRADIENT||(t.TEXT_GRADIENT={}));var lh={align:"left",breakWords:!1,dropShadow:!1,dropShadowAlpha:1,dropShadowAngle:Math.PI/6,dropShadowBlur:0,dropShadowColor:"black",dropShadowDistance:5,fill:"black",fillGradientType:t.TEXT_GRADIENT.LINEAR_VERTICAL,fillGradientStops:[],fontFamily:"Arial",fontSize:26,fontStyle:"normal",fontVariant:"normal",fontWeight:"normal",letterSpacing:0,lineHeight:0,lineJoin:"miter",miterLimit:10,padding:0,stroke:"black",strokeThickness:0,textBaseline:"alphabetic",trim:!1,whiteSpace:"pre",wordWrap:!1,wordWrapWidth:100,leading:0},ch=["serif","sans-serif","monospace","cursive","fantasy","system-ui"],dh=function(){function t(t){this.styleID=0,this.reset(),_h(this,t,t)}return t.prototype.clone=function(){var e={};return _h(e,this,lh),new t(e)},t.prototype.reset=function(){_h(this,lh,lh)},Object.defineProperty(t.prototype,"align",{get:function(){return this._align},set:function(t){this._align!==t&&(this._align=t,this.styleID++)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"breakWords",{get:function(){return this._breakWords},set:function(t){this._breakWords!==t&&(this._breakWords=t,this.styleID++)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"dropShadow",{get:function(){return this._dropShadow},set:function(t){this._dropShadow!==t&&(this._dropShadow=t,this.styleID++)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"dropShadowAlpha",{get:function(){return this._dropShadowAlpha},set:function(t){this._dropShadowAlpha!==t&&(this._dropShadowAlpha=t,this.styleID++)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"dropShadowAngle",{get:function(){return this._dropShadowAngle},set:function(t){this._dropShadowAngle!==t&&(this._dropShadowAngle=t,this.styleID++)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"dropShadowBlur",{get:function(){return this._dropShadowBlur},set:function(t){this._dropShadowBlur!==t&&(this._dropShadowBlur=t,this.styleID++)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"dropShadowColor",{get:function(){return this._dropShadowColor},set:function(t){var e=ph(t);this._dropShadowColor!==e&&(this._dropShadowColor=e,this.styleID++)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"dropShadowDistance",{get:function(){return this._dropShadowDistance},set:function(t){this._dropShadowDistance!==t&&(this._dropShadowDistance=t,this.styleID++)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"fill",{get:function(){return this._fill},set:function(t){var e=ph(t);this._fill!==e&&(this._fill=e,this.styleID++)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"fillGradientType",{get:function(){return this._fillGradientType},set:function(t){this._fillGradientType!==t&&(this._fillGradientType=t,this.styleID++)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"fillGradientStops",{get:function(){return this._fillGradientStops},set:function(t){(function(t,e){if(!Array.isArray(t)||!Array.isArray(e))return!1;if(t.length!==e.length)return!1;for(var r=0;r=0;r--){var i=e[r].trim();!/([\"\'])[^\'\"]+\1/.test(i)&&ch.indexOf(i)<0&&(i='"'+i+'"'),e[r]=i}return this.fontStyle+" "+this.fontVariant+" "+this.fontWeight+" "+t+" "+e.join(",")},t}();function fh(t){return"number"==typeof t?_e(t):("string"==typeof t&&0===t.indexOf("0x")&&(t=t.replace("0x","#")),t)}function ph(t){if(Array.isArray(t)){for(var e=0;ep)if(""!==s&&(a+=t.addLine(s),s="",o=0),t.canBreakWords(v,r.breakWords))for(var T=t.wordWrapSplit(v),b=0;bp&&(a+=t.addLine(s),f=!1,s="",o=0),s+=x,o+=O}else{s.length>0&&(a+=t.addLine(s),s="",o=0);var I=m===_.length-1;a+=t.addLine(v,!I),f=!1,s="",o=0}else g+o>p&&(f=!1,a+=t.addLine(s),s="",o=0),(s.length>0||!t.isBreakingSpace(v)||f)&&(s+=v,o+=g)}return a+t.addLine(s,!1)},t.addLine=function(e,r){return void 0===r&&(r=!0),e=t.trimRight(e),r?e+"\n":e},t.getFromCache=function(t,e,r,i){var n=r[t];if("number"!=typeof n){var o=t.length*e;n=i.measureText(t).width+o,r[t]=n}return n},t.collapseSpaces=function(t){return"normal"===t||"pre-line"===t},t.collapseNewlines=function(t){return"normal"===t},t.trimRight=function(e){if("string"!=typeof e)return"";for(var r=e.length-1;r>=0;r--){var i=e[r];if(!t.isBreakingSpace(i))break;e=e.slice(0,-1)}return e},t.isNewline=function(e){return"string"==typeof e&&t._newlines.indexOf(e.charCodeAt(0))>=0},t.isBreakingSpace=function(e,r){return"string"==typeof e&&t._breakingSpaces.indexOf(e.charCodeAt(0))>=0},t.tokenize=function(e){var r=[],i="";if("string"!=typeof e)return r;for(var n=0;na;--d){for(_=0;_0&&_>m&&(v=(m+_)/2);var E=m+p,y=i.lineHeight*(f+1),g=E;f+10},t}();function Th(t,e){var r=!1;if(t&&t._textures&&t._textures.length)for(var i=0;i=0;e--)this.add(t.children[e]);return this},e.prototype.destroy=function(){this.ticking&&Xr.system.remove(this.tick,this),this.ticking=!1,this.addHooks=null,this.uploadHooks=null,this.renderer=null,this.completes=null,this.queue=null,this.limiter=null,this.uploadHookHelper=null},e}();function Mh(t,e){return e instanceof oi&&(e._glTextures[t.CONTEXT_UID]||t.texture.bind(e),!0)}function Nh(t,e){if(!(e instanceof ih))return!1;var r=e.geometry;e.finishPoly(),r.updateBatches();for(var i=r.batches,n=0;n=i&&Bh.x=n&&Bh.y1?bn.from("#version 300 es\n#define SHADER_NAME Tiling-Sprite-300\n\nprecision lowp float;\n\nin vec2 aVertexPosition;\nin vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTransform;\n\nout vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;\n}\n","#version 300 es\n#define SHADER_NAME Tiling-Sprite-100\n\nprecision lowp float;\n\nin vec2 vTextureCoord;\n\nout vec4 fragmentColor;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\nuniform mat3 uMapCoord;\nuniform vec4 uClampFrame;\nuniform vec2 uClampOffset;\n\nvoid main(void)\n{\n vec2 coord = vTextureCoord + ceil(uClampOffset - vTextureCoord);\n coord = (uMapCoord * vec3(coord, 1.0)).xy;\n vec2 unclamped = coord;\n coord = clamp(coord, uClampFrame.xy, uClampFrame.zw);\n\n vec4 texSample = texture(uSampler, coord, unclamped == coord ? 0.0f : -32.0f);// lod-bias very negative to force lod 0\n\n fragmentColor = texSample * uColor;\n}\n",e):bn.from(Xh,"#version 100\n#ifdef GL_EXT_shader_texture_lod\n #extension GL_EXT_shader_texture_lod : enable\n#endif\n#define SHADER_NAME Tiling-Sprite-100\n\nprecision lowp float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\nuniform mat3 uMapCoord;\nuniform vec4 uClampFrame;\nuniform vec2 uClampOffset;\n\nvoid main(void)\n{\n vec2 coord = vTextureCoord + ceil(uClampOffset - vTextureCoord);\n coord = (uMapCoord * vec3(coord, 1.0)).xy;\n vec2 unclamped = coord;\n coord = clamp(coord, uClampFrame.xy, uClampFrame.zw);\n\n #ifdef GL_EXT_shader_texture_lod\n vec4 texSample = unclamped == coord\n ? texture2D(uSampler, coord) \n : texture2DLodEXT(uSampler, coord, 0);\n #else\n vec4 texSample = texture2D(uSampler, coord);\n #endif\n\n gl_FragColor = texSample * uColor;\n}\n",e)},r.prototype.render=function(e){var r=this.renderer,i=this.quad,n=i.vertices;n[0]=n[6]=e._width*-e.anchor.x,n[1]=n[3]=e._height*-e.anchor.y,n[2]=n[4]=e._width*(1-e.anchor.x),n[5]=n[7]=e._height*(1-e.anchor.y);var o=e.uvRespectAnchor?e.anchor.x:0,s=e.uvRespectAnchor?e.anchor.y:0;(n=i.uvs)[0]=n[6]=-o,n[1]=n[3]=-s,n[2]=n[4]=1-o,n[5]=n[7]=1-s,i.invalidate();var a=e._texture,h=a.baseTexture,u=e.tileTransform.localTransform,l=e.uvMatrix,c=h.isPowerOfTwo&&a.frame.width===h.width&&a.frame.height===h.height;c&&(h._glTextures[r.CONTEXT_UID]?c=h.wrapMode!==t.WRAP_MODES.CLAMP:h.wrapMode===t.WRAP_MODES.CLAMP&&(h.wrapMode=t.WRAP_MODES.REPEAT));var d=c?this.simpleShader:this.shader,f=a.width,p=a.height,_=e._width,m=e._height;kh.set(u.a*f/_,u.b*f/m,u.c*p/_,u.d*p/m,u.tx/_,u.ty/m),kh.invert(),c?kh.prepend(l.mapCoord):(d.uniforms.uMapCoord=l.mapCoord.toArray(!0),d.uniforms.uClampFrame=l.uClampFrame,d.uniforms.uClampOffset=l.uClampOffset),d.uniforms.uTransform=kh.toArray(!0),d.uniforms.uColor=be(e.tint,e.worldAlpha,d.uniforms.uColor,h.alphaMode),d.uniforms.translationMatrix=e.transform.worldTransform.toArray(!0),d.uniforms.uSampler=a,r.shader.bind(d),r.geometry.bind(i),this.state.blendMode=ye(e.blendMode,h.alphaMode),r.state.set(this.state),r.geometry.draw(this.renderer.gl.TRIANGLES,6,0)},r}(ki),Yh=function(t,e){return Yh=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},Yh(t,e)};function jh(t,e){function r(){this.constructor=t}Yh(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}var Vh=function(){function t(t,e){this.uvBuffer=t,this.uvMatrix=e,this.data=null,this._bufferUpdateId=-1,this._textureUpdateId=-1,this._updateID=0}return t.prototype.update=function(t){if(t||this._bufferUpdateId!==this.uvBuffer._updateID||this._textureUpdateId!==this.uvMatrix._updateID){this._bufferUpdateId=this.uvBuffer._updateID,this._textureUpdateId=this.uvMatrix._updateID;var e=this.uvBuffer.data;this.data&&this.data.length===e.length||(this.data=new Float32Array(e.length)),this.uvMatrix.multiplyUvs(e,this.data),this._updateID++}},t}(),Wh=new ze,zh=new Je,qh=function(e){function r(r,i,n,o){void 0===o&&(o=t.DRAW_MODES.TRIANGLES);var s=e.call(this)||this;return s.geometry=r,s.shader=i,s.state=n||xn.for2d(),s.drawMode=o,s.start=0,s.size=0,s.uvs=null,s.indices=null,s.vertexData=new Float32Array(1),s.vertexDirty=-1,s._transformID=-1,s._roundPixels=it.ROUND_PIXELS,s.batchUvs=null,s}return jh(r,e),Object.defineProperty(r.prototype,"geometry",{get:function(){return this._geometry},set:function(t){this._geometry!==t&&(this._geometry&&(this._geometry.refCount--,0===this._geometry.refCount&&this._geometry.dispose()),this._geometry=t,this._geometry&&this._geometry.refCount++,this.vertexDirty=-1)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"uvBuffer",{get:function(){return this.geometry.buffers[1]},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"verticesBuffer",{get:function(){return this.geometry.buffers[0]},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"material",{get:function(){return this.shader},set:function(t){this.shader=t},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"blendMode",{get:function(){return this.state.blendMode},set:function(t){this.state.blendMode=t},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"roundPixels",{get:function(){return this._roundPixels},set:function(t){this._roundPixels!==t&&(this._transformID=-1),this._roundPixels=t},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"tint",{get:function(){return"tint"in this.shader?this.shader.tint:null},set:function(t){this.shader.tint=t},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"texture",{get:function(){return"texture"in this.shader?this.shader.texture:null},set:function(t){this.shader.texture=t},enumerable:!1,configurable:!0}),r.prototype._render=function(e){var i=this.geometry.buffers[0].data;this.shader.batchable&&this.drawMode===t.DRAW_MODES.TRIANGLES&&i.length<2*r.BATCHABLE_SIZE?this._renderToBatch(e):this._renderDefault(e)},r.prototype._renderDefault=function(t){var e=this.shader;e.alpha=this.worldAlpha,e.update&&e.update(),t.batch.flush(),e.uniforms.translationMatrix=this.transform.worldTransform.toArray(!0),t.shader.bind(e),t.state.set(this.state),t.geometry.bind(this.geometry,e),t.geometry.draw(this.drawMode,this.size,this.start,this.geometry.instanceCount)},r.prototype._renderToBatch=function(t){var e=this.geometry,r=this.shader;r.uvMatrix&&(r.uvMatrix.update(),this.calculateUvs()),this.calculateVertices(),this.indices=e.indexBuffer.data,this._tintRGB=r._tintRGB,this._texture=r.texture;var i=this.material.pluginName;t.batch.setObjectRenderer(t.plugins[i]),t.plugins[i].render(this)},r.prototype.calculateVertices=function(){var t=this.geometry.buffers[0],e=t.data,r=t._updateID;if(r!==this.vertexDirty||this._transformID!==this.transform._worldID){this._transformID=this.transform._worldID,this.vertexData.length!==e.length&&(this.vertexData=new Float32Array(e.length));for(var i=this.transform.worldTransform,n=i.a,o=i.b,s=i.c,a=i.d,h=i.tx,u=i.ty,l=this.vertexData,c=0;c>16)+(65280&t)+((255&t)<<16),this._colorDirty=!0)},enumerable:!1,configurable:!0}),e.prototype.update=function(){if(this._colorDirty){this._colorDirty=!1;var t=this.texture.baseTexture;be(this._tint,this._alpha,this.uniforms.uColor,t.alphaMode)}this.uvMatrix.update()&&(this.uniforms.uTextureMatrix=this.uvMatrix.mapCoord)},e}(bn),Zh=function(e){function r(r,i,n){var o=e.call(this)||this,s=new Oi(r),a=new Oi(i,!0),h=new Oi(n,!0,!0);return o.addAttribute("aVertexPosition",s,2,!1,t.TYPES.FLOAT).addAttribute("aTextureCoord",a,2,!1,t.TYPES.FLOAT).addIndex(h),o._updateId=-1,o}return jh(r,e),Object.defineProperty(r.prototype,"vertexDirtyId",{get:function(){return this.buffers[0]._updateID},enumerable:!1,configurable:!0}),r}(Di),Qh=function(t,e){return Qh=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},Qh(t,e)},Jh=function(){this.info=[],this.common=[],this.page=[],this.char=[],this.kerning=[],this.distanceField=[]},$h=function(){function t(){}return t.test=function(t){return"string"==typeof t&&0===t.indexOf("info face=")},t.parse=function(t){var e=t.match(/^[a-z]+\s+.+$/gm),r={info:[],common:[],page:[],char:[],chars:[],kerning:[],kernings:[],distanceField:[]};for(var i in e){var n=e[i].match(/^[a-z]+/gm)[0],o=e[i].match(/[a-zA-Z]+=([^\s"']+|"([^"]*)")/gm),s={};for(var a in o){var h=o[a].split("="),u=h[0],l=h[1].replace(/"/gm,""),c=parseFloat(l),d=isNaN(c)?l:c;s[u]=d}r[n].push(s)}var f=new Jh;return r.info.forEach((function(t){return f.info.push({face:t.face,size:parseInt(t.size,10)})})),r.common.forEach((function(t){return f.common.push({lineHeight:parseInt(t.lineHeight,10)})})),r.page.forEach((function(t){return f.page.push({id:parseInt(t.id,10),file:t.file})})),r.char.forEach((function(t){return f.char.push({id:parseInt(t.id,10),page:parseInt(t.page,10),x:parseInt(t.x,10),y:parseInt(t.y,10),width:parseInt(t.width,10),height:parseInt(t.height,10),xoffset:parseInt(t.xoffset,10),yoffset:parseInt(t.yoffset,10),xadvance:parseInt(t.xadvance,10)})})),r.kerning.forEach((function(t){return f.kerning.push({first:parseInt(t.first,10),second:parseInt(t.second,10),amount:parseInt(t.amount,10)})})),r.distanceField.forEach((function(t){return f.distanceField.push({distanceRange:parseInt(t.distanceRange,10),fieldType:t.fieldType})})),f},t}(),tu=function(){function t(){}return t.test=function(t){return t instanceof XMLDocument&&t.getElementsByTagName("page").length&&null!==t.getElementsByTagName("info")[0].getAttribute("face")},t.parse=function(t){for(var e=new Jh,r=t.getElementsByTagName("info"),i=t.getElementsByTagName("common"),n=t.getElementsByTagName("page"),o=t.getElementsByTagName("char"),s=t.getElementsByTagName("kerning"),a=t.getElementsByTagName("distanceField"),h=0;h")>-1){var e=(new globalThis.DOMParser).parseFromString(t,"text/xml");return tu.test(e)}return!1},t.parse=function(t){var e=(new globalThis.DOMParser).parseFromString(t,"text/xml");return tu.parse(e)},t}(),ru=[$h,tu,eu];function iu(t){for(var e=0;e=u-R*a){if(0===E)throw new Error("[BitmapFont] textureHeight "+u+"px is too small for "+c.fontSize+"px fonts");--T,p=null,_=null,m=null,E=0,v=0,y=0}else if(y=Math.max(R+b.fontProperties.descent,y),A*a+v>=d)--T,E+=y*a,E=Math.ceil(E),v=0,y=0;else{nu(p,_,b,v,E,a,c);var S=su(b.text);f.char.push({id:S,page:g.length-1,x:v/a,y:E/a,width:A,height:R,xoffset:0,yoffset:0,xadvance:Math.ceil(x-(c.dropShadow?c.dropShadowDistance:0)-(c.stroke?c.strokeThickness:0))}),v+=(A+2*s)*a,v=Math.ceil(v)}}T=0;for(var O=l.length;T0&&n.x>u&&(Me(o,1+_-++v,1+g-_),g=_,_=-1,s.push(m),a.push(o.length>0?o[o.length-1].prevSpaces:0),f=Math.max(f,m),p++,n.x=0,n.y+=r.lineHeight,c=null,y=0)}}else s.push(d),a.push(-1),f=Math.max(f,d),++p,++v,n.x=0,n.y+=r.lineHeight,c=null,y=0}var R=h[h.length-1];"\r"!==R&&"\n"!==R&&(/(?:\s)/.test(R)&&(d=m),s.push(d),f=Math.max(f,d),a.push(-1));var A=[];for(g=0;g<=p;g++){var S=0;"right"===this._align?S=f-s[g]:"center"===this._align?S=(f-s[g])/2:"justify"===this._align&&(S=a[g]<0?0:(f-s[g])/a[g]),A.push(S)}var O=o.length,I={},M=[],N=this._activePagesMeshData;for(g=0;g6*U)||Z.vertices.length<2*qh.BATCHABLE_SIZE)Z.vertices=new Float32Array(8*U),Z.uvs=new Float32Array(8*U),Z.indices=new Uint16Array(6*U);else for(var B=Z.total,G=Z.vertices,X=4*B*2;X=i&&(e=t-s-1),o+=a=a.replace("%value%",r[e].toString()),o+="\n"}return(n=n.replace("%blur%",o)).replace("%size%",t.toString())}(o);return(s=t.call(this,a,h)||this).horizontal=e,s.resolution=n,s._quality=0,s.quality=i,s.blur=r,s}return mu(e,t),e.prototype.apply=function(t,e,r,i){if(r?this.horizontal?this.uniforms.strength=1/r.width*(r.width/e.width):this.uniforms.strength=1/r.height*(r.height/e.height):this.horizontal?this.uniforms.strength=1/t.renderer.width*(t.renderer.width/e.width):this.uniforms.strength=1/t.renderer.height*(t.renderer.height/e.height),this.uniforms.strength*=this.strength,this.uniforms.strength/=this.passes,1===this.passes)t.applyFilter(this,e,r,i);else{var n=t.getFilterTexture(),o=t.renderer,s=e,a=n;this.state.blend=!1,t.applyFilter(this,s,a,Nu.CLEAR);for(var h=1;h 0.0) {\n c.rgb /= c.a;\n }\n\n vec4 result;\n\n result.r = (m[0] * c.r);\n result.r += (m[1] * c.g);\n result.r += (m[2] * c.b);\n result.r += (m[3] * c.a);\n result.r += m[4];\n\n result.g = (m[5] * c.r);\n result.g += (m[6] * c.g);\n result.g += (m[7] * c.b);\n result.g += (m[8] * c.a);\n result.g += m[9];\n\n result.b = (m[10] * c.r);\n result.b += (m[11] * c.g);\n result.b += (m[12] * c.b);\n result.b += (m[13] * c.a);\n result.b += m[14];\n\n result.a = (m[15] * c.r);\n result.a += (m[16] * c.g);\n result.a += (m[17] * c.b);\n result.a += (m[18] * c.a);\n result.a += m[19];\n\n vec3 rgb = mix(c.rgb, result.rgb, uAlpha);\n\n // Premultiply alpha again.\n rgb *= result.a;\n\n gl_FragColor = vec4(rgb, result.a);\n}\n",r)||this).alpha=1,e}return function(t,e){function r(){this.constructor=t}Xu(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}(e,t),e.prototype._loadMatrix=function(t,e){void 0===e&&(e=!1);var r=t;e&&(this._multiply(r,this.uniforms.m,t),r=this._colorMatrix(r)),this.uniforms.m=r},e.prototype._multiply=function(t,e,r){return t[0]=e[0]*r[0]+e[1]*r[5]+e[2]*r[10]+e[3]*r[15],t[1]=e[0]*r[1]+e[1]*r[6]+e[2]*r[11]+e[3]*r[16],t[2]=e[0]*r[2]+e[1]*r[7]+e[2]*r[12]+e[3]*r[17],t[3]=e[0]*r[3]+e[1]*r[8]+e[2]*r[13]+e[3]*r[18],t[4]=e[0]*r[4]+e[1]*r[9]+e[2]*r[14]+e[3]*r[19]+e[4],t[5]=e[5]*r[0]+e[6]*r[5]+e[7]*r[10]+e[8]*r[15],t[6]=e[5]*r[1]+e[6]*r[6]+e[7]*r[11]+e[8]*r[16],t[7]=e[5]*r[2]+e[6]*r[7]+e[7]*r[12]+e[8]*r[17],t[8]=e[5]*r[3]+e[6]*r[8]+e[7]*r[13]+e[8]*r[18],t[9]=e[5]*r[4]+e[6]*r[9]+e[7]*r[14]+e[8]*r[19]+e[9],t[10]=e[10]*r[0]+e[11]*r[5]+e[12]*r[10]+e[13]*r[15],t[11]=e[10]*r[1]+e[11]*r[6]+e[12]*r[11]+e[13]*r[16],t[12]=e[10]*r[2]+e[11]*r[7]+e[12]*r[12]+e[13]*r[17],t[13]=e[10]*r[3]+e[11]*r[8]+e[12]*r[13]+e[13]*r[18],t[14]=e[10]*r[4]+e[11]*r[9]+e[12]*r[14]+e[13]*r[19]+e[14],t[15]=e[15]*r[0]+e[16]*r[5]+e[17]*r[10]+e[18]*r[15],t[16]=e[15]*r[1]+e[16]*r[6]+e[17]*r[11]+e[18]*r[16],t[17]=e[15]*r[2]+e[16]*r[7]+e[17]*r[12]+e[18]*r[17],t[18]=e[15]*r[3]+e[16]*r[8]+e[17]*r[13]+e[18]*r[18],t[19]=e[15]*r[4]+e[16]*r[9]+e[17]*r[14]+e[18]*r[19]+e[19],t},e.prototype._colorMatrix=function(t){var e=new Float32Array(t);return e[4]/=255,e[9]/=255,e[14]/=255,e[19]/=255,e},e.prototype.brightness=function(t,e){var r=[t,0,0,0,0,0,t,0,0,0,0,0,t,0,0,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.tint=function(t,e){var r=[(t>>16&255)/255,0,0,0,0,0,(t>>8&255)/255,0,0,0,0,0,(255&t)/255,0,0,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.greyscale=function(t,e){var r=[t,t,t,0,0,t,t,t,0,0,t,t,t,0,0,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.blackAndWhite=function(t){this._loadMatrix([.3,.6,.1,0,0,.3,.6,.1,0,0,.3,.6,.1,0,0,0,0,0,1,0],t)},e.prototype.hue=function(t,e){t=(t||0)/180*Math.PI;var r=Math.cos(t),i=Math.sin(t),n=1/3,o=(0,Math.sqrt)(n),s=[r+(1-r)*n,n*(1-r)-o*i,n*(1-r)+o*i,0,0,n*(1-r)+o*i,r+n*(1-r),n*(1-r)-o*i,0,0,n*(1-r)-o*i,n*(1-r)+o*i,r+n*(1-r),0,0,0,0,0,1,0];this._loadMatrix(s,e)},e.prototype.contrast=function(t,e){var r=(t||0)+1,i=-.5*(r-1),n=[r,0,0,0,i,0,r,0,0,i,0,0,r,0,i,0,0,0,1,0];this._loadMatrix(n,e)},e.prototype.saturate=function(t,e){void 0===t&&(t=0);var r=2*t/3+1,i=-.5*(r-1),n=[r,i,i,0,0,i,r,i,0,0,i,i,r,0,0,0,0,0,1,0];this._loadMatrix(n,e)},e.prototype.desaturate=function(){this.saturate(-1)},e.prototype.negative=function(t){this._loadMatrix([-1,0,0,1,0,0,-1,0,1,0,0,0,-1,1,0,0,0,0,1,0],t)},e.prototype.sepia=function(t){this._loadMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0],t)},e.prototype.technicolor=function(t){this._loadMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0],t)},e.prototype.polaroid=function(t){this._loadMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0],t)},e.prototype.toBGR=function(t){this._loadMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0],t)},e.prototype.kodachrome=function(t){this._loadMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0],t)},e.prototype.browni=function(t){this._loadMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0],t)},e.prototype.vintage=function(t){this._loadMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0],t)},e.prototype.colorTone=function(t,e,r,i,n){var o=((r=r||16770432)>>16&255)/255,s=(r>>8&255)/255,a=(255&r)/255,h=((i=i||3375104)>>16&255)/255,u=(i>>8&255)/255,l=(255&i)/255,c=[.3,.59,.11,0,0,o,s,a,t=t||.2,0,h,u,l,e=e||.15,0,o-h,s-u,a-l,0,0];this._loadMatrix(c,n)},e.prototype.night=function(t,e){var r=[-2*(t=t||.1),-t,0,0,0,-t,0,t,0,0,0,t,2*t,0,0,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.predator=function(t,e){var r=[11.224130630493164*t,-4.794486999511719*t,-2.8746118545532227*t,0*t,.40342438220977783*t,-3.6330697536468506*t,9.193157196044922*t,-2.951810836791992*t,0*t,-1.316135048866272*t,-3.2184197902679443*t,-4.2375030517578125*t,7.476448059082031*t,0*t,.8044459223747253*t,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.lsd=function(t){this._loadMatrix([2,-.4,.5,0,0,-.5,2,-.4,0,0,-.4,-.5,3,0,0,0,0,0,1,0],t)},e.prototype.reset=function(){this._loadMatrix([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],!1)},Object.defineProperty(e.prototype,"matrix",{get:function(){return this.uniforms.m},set:function(t){this.uniforms.m=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"alpha",{get:function(){return this.uniforms.uAlpha},set:function(t){this.uniforms.uAlpha=t},enumerable:!1,configurable:!0}),e}(Rn);ku.prototype.grayscale=ku.prototype.greyscale;var Hu,Yu,ju,Vu,Wu,zu,qu,Ku,Zu,Qu,Ju,$u,tl,el,rl,il,nl,ol,sl,al=function(t,e){return al=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},al(t,e)},hl=function(t){function e(e,r){var i=this,n=new er;return e.renderable=!1,(i=t.call(this,"attribute vec2 aVertexPosition;\n\nuniform mat3 projectionMatrix;\nuniform mat3 filterMatrix;\n\nvarying vec2 vTextureCoord;\nvarying vec2 vFilterCoord;\n\nuniform vec4 inputSize;\nuniform vec4 outputFrame;\n\nvec4 filterVertexPosition( void )\n{\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\n\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord( void )\n{\n return aVertexPosition * (outputFrame.zw * inputSize.zw);\n}\n\nvoid main(void)\n{\n\tgl_Position = filterVertexPosition();\n\tvTextureCoord = filterTextureCoord();\n\tvFilterCoord = ( filterMatrix * vec3( vTextureCoord, 1.0) ).xy;\n}\n","varying vec2 vFilterCoord;\nvarying vec2 vTextureCoord;\n\nuniform vec2 scale;\nuniform mat2 rotation;\nuniform sampler2D uSampler;\nuniform sampler2D mapSampler;\n\nuniform highp vec4 inputSize;\nuniform vec4 inputClamp;\n\nvoid main(void)\n{\n vec4 map = texture2D(mapSampler, vFilterCoord);\n\n map -= 0.5;\n map.xy = scale * inputSize.zw * (rotation * map.xy);\n\n gl_FragColor = texture2D(uSampler, clamp(vec2(vTextureCoord.x + map.x, vTextureCoord.y + map.y), inputClamp.xy, inputClamp.zw));\n}\n",{mapSampler:e._texture,filterMatrix:n,scale:{x:1,y:1},rotation:new Float32Array([1,0,0,1])})||this).maskSprite=e,i.maskMatrix=n,null==r&&(r=20),i.scale=new ze(r,r),i}return function(t,e){function r(){this.constructor=t}al(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}(e,t),e.prototype.apply=function(t,e,r,i){this.uniforms.filterMatrix=t.calculateSpriteMatrix(this.maskMatrix,this.maskSprite),this.uniforms.scale.x=this.scale.x,this.uniforms.scale.y=this.scale.y;var n=this.maskSprite.worldTransform,o=Math.sqrt(n.a*n.a+n.b*n.b),s=Math.sqrt(n.c*n.c+n.d*n.d);0!==o&&0!==s&&(this.uniforms.rotation[0]=n.a/o,this.uniforms.rotation[1]=n.b/o,this.uniforms.rotation[2]=n.c/s,this.uniforms.rotation[3]=n.d/s),t.applyFilter(this,e,r,i)},Object.defineProperty(e.prototype,"map",{get:function(){return this.uniforms.mapSampler},set:function(t){this.uniforms.mapSampler=t},enumerable:!1,configurable:!0}),e}(Rn),ul=function(t,e){return ul=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},ul(t,e)},ll=function(t){function e(){return t.call(this,"\nattribute vec2 aVertexPosition;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 v_rgbNW;\nvarying vec2 v_rgbNE;\nvarying vec2 v_rgbSW;\nvarying vec2 v_rgbSE;\nvarying vec2 v_rgbM;\n\nvarying vec2 vFragCoord;\n\nuniform vec4 inputSize;\nuniform vec4 outputFrame;\n\nvec4 filterVertexPosition( void )\n{\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\n\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\n}\n\nvoid texcoords(vec2 fragCoord, vec2 inverseVP,\n out vec2 v_rgbNW, out vec2 v_rgbNE,\n out vec2 v_rgbSW, out vec2 v_rgbSE,\n out vec2 v_rgbM) {\n v_rgbNW = (fragCoord + vec2(-1.0, -1.0)) * inverseVP;\n v_rgbNE = (fragCoord + vec2(1.0, -1.0)) * inverseVP;\n v_rgbSW = (fragCoord + vec2(-1.0, 1.0)) * inverseVP;\n v_rgbSE = (fragCoord + vec2(1.0, 1.0)) * inverseVP;\n v_rgbM = vec2(fragCoord * inverseVP);\n}\n\nvoid main(void) {\n\n gl_Position = filterVertexPosition();\n\n vFragCoord = aVertexPosition * outputFrame.zw;\n\n texcoords(vFragCoord, inputSize.zw, v_rgbNW, v_rgbNE, v_rgbSW, v_rgbSE, v_rgbM);\n}\n",'varying vec2 v_rgbNW;\nvarying vec2 v_rgbNE;\nvarying vec2 v_rgbSW;\nvarying vec2 v_rgbSE;\nvarying vec2 v_rgbM;\n\nvarying vec2 vFragCoord;\nuniform sampler2D uSampler;\nuniform highp vec4 inputSize;\n\n\n/**\n Basic FXAA implementation based on the code on geeks3d.com with the\n modification that the texture2DLod stuff was removed since it\'s\n unsupported by WebGL.\n\n --\n\n From:\n https://github.com/mitsuhiko/webgl-meincraft\n\n Copyright (c) 2011 by Armin Ronacher.\n\n Some rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are\n met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the following\n disclaimer in the documentation and/or other materials provided\n with the distribution.\n\n * The names of the contributors may not be used to endorse or\n promote products derived from this software without specific\n prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef FXAA_REDUCE_MIN\n#define FXAA_REDUCE_MIN (1.0/ 128.0)\n#endif\n#ifndef FXAA_REDUCE_MUL\n#define FXAA_REDUCE_MUL (1.0 / 8.0)\n#endif\n#ifndef FXAA_SPAN_MAX\n#define FXAA_SPAN_MAX 8.0\n#endif\n\n//optimized version for mobile, where dependent\n//texture reads can be a bottleneck\nvec4 fxaa(sampler2D tex, vec2 fragCoord, vec2 inverseVP,\n vec2 v_rgbNW, vec2 v_rgbNE,\n vec2 v_rgbSW, vec2 v_rgbSE,\n vec2 v_rgbM) {\n vec4 color;\n vec3 rgbNW = texture2D(tex, v_rgbNW).xyz;\n vec3 rgbNE = texture2D(tex, v_rgbNE).xyz;\n vec3 rgbSW = texture2D(tex, v_rgbSW).xyz;\n vec3 rgbSE = texture2D(tex, v_rgbSE).xyz;\n vec4 texColor = texture2D(tex, v_rgbM);\n vec3 rgbM = texColor.xyz;\n vec3 luma = vec3(0.299, 0.587, 0.114);\n float lumaNW = dot(rgbNW, luma);\n float lumaNE = dot(rgbNE, luma);\n float lumaSW = dot(rgbSW, luma);\n float lumaSE = dot(rgbSE, luma);\n float lumaM = dot(rgbM, luma);\n float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));\n float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));\n\n mediump vec2 dir;\n dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n\n float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) *\n (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\n\n float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\n dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),\n max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\n dir * rcpDirMin)) * inverseVP;\n\n vec3 rgbA = 0.5 * (\n texture2D(tex, fragCoord * inverseVP + dir * (1.0 / 3.0 - 0.5)).xyz +\n texture2D(tex, fragCoord * inverseVP + dir * (2.0 / 3.0 - 0.5)).xyz);\n vec3 rgbB = rgbA * 0.5 + 0.25 * (\n texture2D(tex, fragCoord * inverseVP + dir * -0.5).xyz +\n texture2D(tex, fragCoord * inverseVP + dir * 0.5).xyz);\n\n float lumaB = dot(rgbB, luma);\n if ((lumaB < lumaMin) || (lumaB > lumaMax))\n color = vec4(rgbA, texColor.a);\n else\n color = vec4(rgbB, texColor.a);\n return color;\n}\n\nvoid main() {\n\n vec4 color;\n\n color = fxaa(uSampler, vFragCoord, inputSize.zw, v_rgbNW, v_rgbNE, v_rgbSW, v_rgbSE, v_rgbM);\n\n gl_FragColor = color;\n}\n')||this}return function(t,e){function r(){this.constructor=t}ul(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}(e,t),e}(Rn),cl=function(t,e){return cl=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},cl(t,e)},dl=function(t){function e(e,r){void 0===e&&(e=.5),void 0===r&&(r=Math.random());var i=t.call(this,so,"precision highp float;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform float uNoise;\nuniform float uSeed;\nuniform sampler2D uSampler;\n\nfloat rand(vec2 co)\n{\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main()\n{\n vec4 color = texture2D(uSampler, vTextureCoord);\n float randomValue = rand(gl_FragCoord.xy * uSeed);\n float diff = (randomValue - 0.5) * uNoise;\n\n // Un-premultiply alpha before applying the color matrix. See issue #3539.\n if (color.a > 0.0) {\n color.rgb /= color.a;\n }\n\n color.r += diff;\n color.g += diff;\n color.b += diff;\n\n // Premultiply alpha again.\n color.rgb *= color.a;\n\n gl_FragColor = color;\n}\n",{uNoise:0,uSeed:0})||this;return i.noise=e,i.seed=r,i}return function(t,e){function r(){this.constructor=t}cl(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}(e,t),Object.defineProperty(e.prototype,"noise",{get:function(){return this.uniforms.uNoise},set:function(t){this.uniforms.uNoise=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"seed",{get:function(){return this.uniforms.uSeed},set:function(t){this.uniforms.uSeed=t},enumerable:!1,configurable:!0}),e}(Rn);!function(t){t[t.WEBGL_LEGACY=0]="WEBGL_LEGACY",t[t.WEBGL=1]="WEBGL",t[t.WEBGL2=2]="WEBGL2"}(Hu||(Hu={})),function(t){t[t.UNKNOWN=0]="UNKNOWN",t[t.WEBGL=1]="WEBGL",t[t.CANVAS=2]="CANVAS"}(Yu||(Yu={})),function(t){t[t.COLOR=16384]="COLOR",t[t.DEPTH=256]="DEPTH",t[t.STENCIL=1024]="STENCIL"}(ju||(ju={})),function(t){t[t.NORMAL=0]="NORMAL",t[t.ADD=1]="ADD",t[t.MULTIPLY=2]="MULTIPLY",t[t.SCREEN=3]="SCREEN",t[t.OVERLAY=4]="OVERLAY",t[t.DARKEN=5]="DARKEN",t[t.LIGHTEN=6]="LIGHTEN",t[t.COLOR_DODGE=7]="COLOR_DODGE",t[t.COLOR_BURN=8]="COLOR_BURN",t[t.HARD_LIGHT=9]="HARD_LIGHT",t[t.SOFT_LIGHT=10]="SOFT_LIGHT",t[t.DIFFERENCE=11]="DIFFERENCE",t[t.EXCLUSION=12]="EXCLUSION",t[t.HUE=13]="HUE",t[t.SATURATION=14]="SATURATION",t[t.COLOR=15]="COLOR",t[t.LUMINOSITY=16]="LUMINOSITY",t[t.NORMAL_NPM=17]="NORMAL_NPM",t[t.ADD_NPM=18]="ADD_NPM",t[t.SCREEN_NPM=19]="SCREEN_NPM",t[t.NONE=20]="NONE",t[t.SRC_OVER=0]="SRC_OVER",t[t.SRC_IN=21]="SRC_IN",t[t.SRC_OUT=22]="SRC_OUT",t[t.SRC_ATOP=23]="SRC_ATOP",t[t.DST_OVER=24]="DST_OVER",t[t.DST_IN=25]="DST_IN",t[t.DST_OUT=26]="DST_OUT",t[t.DST_ATOP=27]="DST_ATOP",t[t.ERASE=26]="ERASE",t[t.SUBTRACT=28]="SUBTRACT",t[t.XOR=29]="XOR"}(Vu||(Vu={})),function(t){t[t.POINTS=0]="POINTS",t[t.LINES=1]="LINES",t[t.LINE_LOOP=2]="LINE_LOOP",t[t.LINE_STRIP=3]="LINE_STRIP",t[t.TRIANGLES=4]="TRIANGLES",t[t.TRIANGLE_STRIP=5]="TRIANGLE_STRIP",t[t.TRIANGLE_FAN=6]="TRIANGLE_FAN"}(Wu||(Wu={})),function(t){t[t.RGBA=6408]="RGBA",t[t.RGB=6407]="RGB",t[t.RG=33319]="RG",t[t.RED=6403]="RED",t[t.RGBA_INTEGER=36249]="RGBA_INTEGER",t[t.RGB_INTEGER=36248]="RGB_INTEGER",t[t.RG_INTEGER=33320]="RG_INTEGER",t[t.RED_INTEGER=36244]="RED_INTEGER",t[t.ALPHA=6406]="ALPHA",t[t.LUMINANCE=6409]="LUMINANCE",t[t.LUMINANCE_ALPHA=6410]="LUMINANCE_ALPHA",t[t.DEPTH_COMPONENT=6402]="DEPTH_COMPONENT",t[t.DEPTH_STENCIL=34041]="DEPTH_STENCIL"}(zu||(zu={})),function(t){t[t.TEXTURE_2D=3553]="TEXTURE_2D",t[t.TEXTURE_CUBE_MAP=34067]="TEXTURE_CUBE_MAP",t[t.TEXTURE_2D_ARRAY=35866]="TEXTURE_2D_ARRAY",t[t.TEXTURE_CUBE_MAP_POSITIVE_X=34069]="TEXTURE_CUBE_MAP_POSITIVE_X",t[t.TEXTURE_CUBE_MAP_NEGATIVE_X=34070]="TEXTURE_CUBE_MAP_NEGATIVE_X",t[t.TEXTURE_CUBE_MAP_POSITIVE_Y=34071]="TEXTURE_CUBE_MAP_POSITIVE_Y",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Y=34072]="TEXTURE_CUBE_MAP_NEGATIVE_Y",t[t.TEXTURE_CUBE_MAP_POSITIVE_Z=34073]="TEXTURE_CUBE_MAP_POSITIVE_Z",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Z=34074]="TEXTURE_CUBE_MAP_NEGATIVE_Z"}(qu||(qu={})),function(t){t[t.UNSIGNED_BYTE=5121]="UNSIGNED_BYTE",t[t.UNSIGNED_SHORT=5123]="UNSIGNED_SHORT",t[t.UNSIGNED_SHORT_5_6_5=33635]="UNSIGNED_SHORT_5_6_5",t[t.UNSIGNED_SHORT_4_4_4_4=32819]="UNSIGNED_SHORT_4_4_4_4",t[t.UNSIGNED_SHORT_5_5_5_1=32820]="UNSIGNED_SHORT_5_5_5_1",t[t.UNSIGNED_INT=5125]="UNSIGNED_INT",t[t.UNSIGNED_INT_10F_11F_11F_REV=35899]="UNSIGNED_INT_10F_11F_11F_REV",t[t.UNSIGNED_INT_2_10_10_10_REV=33640]="UNSIGNED_INT_2_10_10_10_REV",t[t.UNSIGNED_INT_24_8=34042]="UNSIGNED_INT_24_8",t[t.UNSIGNED_INT_5_9_9_9_REV=35902]="UNSIGNED_INT_5_9_9_9_REV",t[t.BYTE=5120]="BYTE",t[t.SHORT=5122]="SHORT",t[t.INT=5124]="INT",t[t.FLOAT=5126]="FLOAT",t[t.FLOAT_32_UNSIGNED_INT_24_8_REV=36269]="FLOAT_32_UNSIGNED_INT_24_8_REV",t[t.HALF_FLOAT=36193]="HALF_FLOAT"}(Ku||(Ku={})),function(t){t[t.FLOAT=0]="FLOAT",t[t.INT=1]="INT",t[t.UINT=2]="UINT"}(Zu||(Zu={})),function(t){t[t.NEAREST=0]="NEAREST",t[t.LINEAR=1]="LINEAR"}(Qu||(Qu={})),function(t){t[t.CLAMP=33071]="CLAMP",t[t.REPEAT=10497]="REPEAT",t[t.MIRRORED_REPEAT=33648]="MIRRORED_REPEAT"}(Ju||(Ju={})),function(t){t[t.OFF=0]="OFF",t[t.POW2=1]="POW2",t[t.ON=2]="ON",t[t.ON_MANUAL=3]="ON_MANUAL"}($u||($u={})),function(t){t[t.NPM=0]="NPM",t[t.UNPACK=1]="UNPACK",t[t.PMA=2]="PMA",t[t.NO_PREMULTIPLIED_ALPHA=0]="NO_PREMULTIPLIED_ALPHA",t[t.PREMULTIPLY_ON_UPLOAD=1]="PREMULTIPLY_ON_UPLOAD",t[t.PREMULTIPLY_ALPHA=2]="PREMULTIPLY_ALPHA",t[t.PREMULTIPLIED_ALPHA=2]="PREMULTIPLIED_ALPHA"}(tl||(tl={})),function(t){t[t.NO=0]="NO",t[t.YES=1]="YES",t[t.AUTO=2]="AUTO",t[t.BLEND=0]="BLEND",t[t.CLEAR=1]="CLEAR",t[t.BLIT=2]="BLIT"}(el||(el={})),function(t){t[t.AUTO=0]="AUTO",t[t.MANUAL=1]="MANUAL"}(rl||(rl={})),function(t){t.LOW="lowp",t.MEDIUM="mediump",t.HIGH="highp"}(il||(il={})),function(t){t[t.NONE=0]="NONE",t[t.SCISSOR=1]="SCISSOR",t[t.STENCIL=2]="STENCIL",t[t.SPRITE=3]="SPRITE"}(nl||(nl={})),function(t){t[t.NONE=0]="NONE",t[t.LOW=2]="LOW",t[t.MEDIUM=4]="MEDIUM",t[t.HIGH=8]="HIGH"}(ol||(ol={})),function(t){t[t.ELEMENT_ARRAY_BUFFER=34963]="ELEMENT_ARRAY_BUFFER",t[t.ARRAY_BUFFER=34962]="ARRAY_BUFFER",t[t.UNIFORM_BUFFER=35345]="UNIFORM_BUFFER"}(sl||(sl={}));var fl=new er;Cr.prototype._cacheAsBitmap=!1,Cr.prototype._cacheData=null,Cr.prototype._cacheAsBitmapResolution=null,Cr.prototype._cacheAsBitmapMultisample=ol.NONE;var pl=function(){this.textureCacheId=null,this.originalRender=null,this.originalRenderCanvas=null,this.originalCalculateBounds=null,this.originalGetLocalBounds=null,this.originalUpdateTransform=null,this.originalDestroy=null,this.originalMask=null,this.originalFilterArea=null,this.originalContainsPoint=null,this.sprite=null};Object.defineProperties(Cr.prototype,{cacheAsBitmapResolution:{get:function(){return this._cacheAsBitmapResolution},set:function(t){t!==this._cacheAsBitmapResolution&&(this._cacheAsBitmapResolution=t,this.cacheAsBitmap&&(this.cacheAsBitmap=!1,this.cacheAsBitmap=!0))}},cacheAsBitmapMultisample:{get:function(){return this._cacheAsBitmapMultisample},set:function(t){t!==this._cacheAsBitmapMultisample&&(this._cacheAsBitmapMultisample=t,this.cacheAsBitmap&&(this.cacheAsBitmap=!1,this.cacheAsBitmap=!0))}},cacheAsBitmap:{get:function(){return this._cacheAsBitmap},set:function(t){var e;this._cacheAsBitmap!==t&&(this._cacheAsBitmap=t,t?(this._cacheData||(this._cacheData=new pl),(e=this._cacheData).originalRender=this.render,e.originalRenderCanvas=this.renderCanvas,e.originalUpdateTransform=this.updateTransform,e.originalCalculateBounds=this.calculateBounds,e.originalGetLocalBounds=this.getLocalBounds,e.originalDestroy=this.destroy,e.originalContainsPoint=this.containsPoint,e.originalMask=this._mask,e.originalFilterArea=this.filterArea,this.render=this._renderCached,this.renderCanvas=this._renderCachedCanvas,this.destroy=this._cacheAsBitmapDestroy):((e=this._cacheData).sprite&&this._destroyCachedDisplayObject(),this.render=e.originalRender,this.renderCanvas=e.originalRenderCanvas,this.calculateBounds=e.originalCalculateBounds,this.getLocalBounds=e.originalGetLocalBounds,this.destroy=e.originalDestroy,this.updateTransform=e.originalUpdateTransform,this.containsPoint=e.originalContainsPoint,this._mask=e.originalMask,this.filterArea=e.originalFilterArea))}}}),Cr.prototype._renderCached=function(t){!this.visible||this.worldAlpha<=0||!this.renderable||(this._initCachedDisplayObject(t),this._cacheData.sprite.transform._worldID=this.transform._worldID,this._cacheData.sprite.worldAlpha=this.worldAlpha,this._cacheData.sprite._render(t))},Cr.prototype._initCachedDisplayObject=function(t){var e;if(!this._cacheData||!this._cacheData.sprite){var r=this.alpha;this.alpha=1,t.batch.flush();var i=this.getLocalBounds(null,!0).clone();if(this.filters&&this.filters.length){var n=this.filters[0].padding;i.pad(n)}i.ceil(it.RESOLUTION);var o=t.renderTexture.current,s=t.renderTexture.sourceFrame.clone(),a=t.renderTexture.destinationFrame.clone(),h=t.projection.transform,u=xi.create({width:i.width,height:i.height,resolution:this.cacheAsBitmapResolution||t.resolution,multisample:null!==(e=this.cacheAsBitmapMultisample)&&void 0!==e?e:t.multisample}),l="cacheAsBitmap_"+De();this._cacheData.textureCacheId=l,oi.addToCache(u.baseTexture,l),bi.addToCache(u,l);var c=this.transform.localTransform.copyTo(fl).invert().translate(-i.x,-i.y);this.render=this._cacheData.originalRender,t.render(this,{renderTexture:u,clear:!0,transform:c,skipUpdateTransform:!1}),t.framebuffer.blit(),t.projection.transform=h,t.renderTexture.bind(o,s,a),this.render=this._renderCached,this.updateTransform=this.displayObjectUpdateTransform,this.calculateBounds=this._calculateCachedBounds,this.getLocalBounds=this._getCachedLocalBounds,this._mask=null,this.filterArea=null,this.alpha=r;var d=new hh(u);d.transform.worldTransform=this.transform.worldTransform,d.anchor.x=-i.x/i.width,d.anchor.y=-i.y/i.height,d.alpha=r,d._bounds=this._bounds,this._cacheData.sprite=d,this.transform._parentID=-1,this.parent?this.updateTransform():(this.enableTempParent(),this.updateTransform(),this.disableTempParent(null)),this.containsPoint=d.containsPoint.bind(d)}},Cr.prototype._renderCachedCanvas=function(t){!this.visible||this.worldAlpha<=0||!this.renderable||(this._initCachedDisplayObjectCanvas(t),this._cacheData.sprite.worldAlpha=this.worldAlpha,this._cacheData.sprite._renderCanvas(t))},Cr.prototype._initCachedDisplayObjectCanvas=function(t){if(!this._cacheData||!this._cacheData.sprite){var e=this.getLocalBounds(null,!0),r=this.alpha;this.alpha=1;var i=t.context,n=t._projTransform;e.ceil(it.RESOLUTION);var o=xi.create({width:e.width,height:e.height}),s="cacheAsBitmap_"+De();this._cacheData.textureCacheId=s,oi.addToCache(o.baseTexture,s),bi.addToCache(o,s);var a=fl;this.transform.localTransform.copyTo(a),a.invert(),a.tx-=e.x,a.ty-=e.y,this.renderCanvas=this._cacheData.originalRenderCanvas,t.render(this,{renderTexture:o,clear:!0,transform:a,skipUpdateTransform:!1}),t.context=i,t._projTransform=n,this.renderCanvas=this._renderCachedCanvas,this.updateTransform=this.displayObjectUpdateTransform,this.calculateBounds=this._calculateCachedBounds,this.getLocalBounds=this._getCachedLocalBounds,this._mask=null,this.filterArea=null,this.alpha=r;var h=new hh(o);h.transform.worldTransform=this.transform.worldTransform,h.anchor.x=-e.x/e.width,h.anchor.y=-e.y/e.height,h.alpha=r,h._bounds=this._bounds,this._cacheData.sprite=h,this.transform._parentID=-1,this.parent?this.updateTransform():(this.parent=t._tempDisplayObjectParent,this.updateTransform(),this.parent=null),this.containsPoint=h.containsPoint.bind(h)}},Cr.prototype._calculateCachedBounds=function(){this._bounds.clear(),this._cacheData.sprite.transform._worldID=this.transform._worldID,this._cacheData.sprite._calculateBounds(),this._bounds.updateID=this._boundsID},Cr.prototype._getCachedLocalBounds=function(){return this._cacheData.sprite.getLocalBounds(null)},Cr.prototype._destroyCachedDisplayObject=function(){this._cacheData.sprite._texture.destroy(!0),this._cacheData.sprite=null,oi.removeFromCache(this._cacheData.textureCacheId),bi.removeFromCache(this._cacheData.textureCacheId),this._cacheData.textureCacheId=null},Cr.prototype._cacheAsBitmapDestroy=function(t){this.cacheAsBitmap=!1,this.destroy(t)},Cr.prototype.name=null,Fr.prototype.getChildByName=function(t,e){for(var r=0,i=this.children.length;r0){var d=a.x-t[l].x,f=a.y-t[l].y,p=Math.sqrt(d*d+f*f);a=t[l],s+=p/h}else s=l/(u-1);n[c]=s,n[c+1]=0,n[c+2]=s,n[c+3]=1}var _=0;for(l=0;l0?this.textureScale*this._width/2:this._width/2;i/=l,n/=l,i*=c,n*=c,o[u]=h.x+i,o[u+1]=h.y+n,o[u+2]=h.x-i,o[u+3]=h.y-n,r=h}this.buffers[0].update()}},e.prototype.update=function(){this.textureScale>0?this.build():this.updateVertices()},e}(Zh),yl=function(e){function r(r,i,n){void 0===n&&(n=0);var o=this,s=new El(r.height,i,n),a=new Kh(r);return n>0&&(r.baseTexture.wrapMode=t.WRAP_MODES.REPEAT),(o=e.call(this,s,a)||this).autoUpdate=!0,o}return ml(r,e),r.prototype._render=function(t){var r=this.geometry;(this.autoUpdate||r._width!==this.shader.texture.height)&&(r._width=this.shader.texture.height,r.update()),e.prototype._render.call(this,t)},r}(qh),gl=function(t){function e(e,r,i){var n=this,o=new vl(e.width,e.height,r,i),s=new Kh(bi.WHITE);return(n=t.call(this,o,s)||this).texture=e,n.autoResize=!0,n}return ml(e,t),e.prototype.textureUpdated=function(){this._textureID=this.shader.texture._updateID;var t=this.geometry,e=this.shader.texture,r=e.width,i=e.height;!this.autoResize||t.width===r&&t.height===i||(t.width=this.shader.texture.width,t.height=this.shader.texture.height,t.build())},Object.defineProperty(e.prototype,"texture",{get:function(){return this.shader.texture},set:function(t){this.shader.texture!==t&&(this.shader.texture=t,this._textureID=-1,t.baseTexture.valid?this.textureUpdated():t.once("update",this.textureUpdated,this))},enumerable:!1,configurable:!0}),e.prototype._render=function(e){this._textureID!==this.shader.texture._updateID&&this.textureUpdated(),t.prototype._render.call(this,e)},e.prototype.destroy=function(e){this.shader.texture.off("update",this.textureUpdated,this),t.prototype.destroy.call(this,e)},e}(qh),Tl=function(t){function e(e,r,i,n,o){void 0===e&&(e=bi.EMPTY);var s=this,a=new Zh(r,i,n);a.getBuffer("aVertexPosition").static=!1;var h=new Kh(e);return(s=t.call(this,a,h,null,o)||this).autoUpdate=!0,s}return ml(e,t),Object.defineProperty(e.prototype,"vertices",{get:function(){return this.geometry.getBuffer("aVertexPosition").data},set:function(t){this.geometry.getBuffer("aVertexPosition").data=t},enumerable:!1,configurable:!0}),e.prototype._render=function(e){this.autoUpdate&&this.geometry.getBuffer("aVertexPosition").update(),t.prototype._render.call(this,e)},e}(qh),bl=function(t){function e(e,r,i,n,o){void 0===r&&(r=10),void 0===i&&(i=10),void 0===n&&(n=10),void 0===o&&(o=10);var s=t.call(this,bi.WHITE,4,4)||this;return s._origWidth=e.orig.width,s._origHeight=e.orig.height,s._width=s._origWidth,s._height=s._origHeight,s._leftWidth=r,s._rightWidth=n,s._topHeight=i,s._bottomHeight=o,s.texture=e,s}return ml(e,t),e.prototype.textureUpdated=function(){this._textureID=this.shader.texture._updateID,this._refresh()},Object.defineProperty(e.prototype,"vertices",{get:function(){return this.geometry.getBuffer("aVertexPosition").data},set:function(t){this.geometry.getBuffer("aVertexPosition").data=t},enumerable:!1,configurable:!0}),e.prototype.updateHorizontalVertices=function(){var t=this.vertices,e=this._getMinScale();t[9]=t[11]=t[13]=t[15]=this._topHeight*e,t[17]=t[19]=t[21]=t[23]=this._height-this._bottomHeight*e,t[25]=t[27]=t[29]=t[31]=this._height},e.prototype.updateVerticalVertices=function(){var t=this.vertices,e=this._getMinScale();t[2]=t[10]=t[18]=t[26]=this._leftWidth*e,t[4]=t[12]=t[20]=t[28]=this._width-this._rightWidth*e,t[6]=t[14]=t[22]=t[30]=this._width},e.prototype._getMinScale=function(){var t=this._leftWidth+this._rightWidth,e=this._width>t?1:this._width/t,r=this._topHeight+this._bottomHeight,i=this._height>r?1:this._height/r;return Math.min(e,i)},Object.defineProperty(e.prototype,"width",{get:function(){return this._width},set:function(t){this._width=t,this._refresh()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"height",{get:function(){return this._height},set:function(t){this._height=t,this._refresh()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"leftWidth",{get:function(){return this._leftWidth},set:function(t){this._leftWidth=t,this._refresh()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"rightWidth",{get:function(){return this._rightWidth},set:function(t){this._rightWidth=t,this._refresh()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"topHeight",{get:function(){return this._topHeight},set:function(t){this._topHeight=t,this._refresh()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"bottomHeight",{get:function(){return this._bottomHeight},set:function(t){this._bottomHeight=t,this._refresh()},enumerable:!1,configurable:!0}),e.prototype._refresh=function(){var t=this.texture,e=this.geometry.buffers[1].data;this._origWidth=t.orig.width,this._origHeight=t.orig.height;var r=1/this._origWidth,i=1/this._origHeight;e[0]=e[8]=e[16]=e[24]=0,e[1]=e[3]=e[5]=e[7]=0,e[6]=e[14]=e[22]=e[30]=1,e[25]=e[27]=e[29]=e[31]=1,e[2]=e[10]=e[18]=e[26]=r*this._leftWidth,e[4]=e[12]=e[20]=e[28]=1-r*this._rightWidth,e[9]=e[11]=e[13]=e[15]=i*this._topHeight,e[17]=e[19]=e[21]=e[23]=1-i*this._bottomHeight,this.updateHorizontalVertices(),this.updateVerticalVertices(),this.geometry.buffers[0].update(),this.geometry.buffers[1].update()},e}(gl),xl=function(t,e){return xl=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},xl(t,e)},Rl=function(e){function r(t,r){void 0===r&&(r=!0);var i=e.call(this,t[0]instanceof bi?t[0]:t[0].texture)||this;return i._textures=null,i._durations=null,i._autoUpdate=r,i._isConnectedToTicker=!1,i.animationSpeed=1,i.loop=!0,i.updateAnchor=!1,i.onComplete=null,i.onFrameChange=null,i.onLoop=null,i._currentTime=0,i._playing=!1,i._previousFrame=null,i.textures=t,i}return function(t,e){function r(){this.constructor=t}xl(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}(r,e),r.prototype.stop=function(){this._playing&&(this._playing=!1,this._autoUpdate&&this._isConnectedToTicker&&(Xr.shared.remove(this.update,this),this._isConnectedToTicker=!1))},r.prototype.play=function(){this._playing||(this._playing=!0,this._autoUpdate&&!this._isConnectedToTicker&&(Xr.shared.add(this.update,this,t.UPDATE_PRIORITY.HIGH),this._isConnectedToTicker=!0))},r.prototype.gotoAndStop=function(t){this.stop();var e=this.currentFrame;this._currentTime=t,e!==this.currentFrame&&this.updateTexture()},r.prototype.gotoAndPlay=function(t){var e=this.currentFrame;this._currentTime=t,e!==this.currentFrame&&this.updateTexture(),this.play()},r.prototype.update=function(t){if(this._playing){var e=this.animationSpeed*t,r=this.currentFrame;if(null!==this._durations){var i=this._currentTime%1*this._durations[this.currentFrame];for(i+=e/60*1e3;i<0;)this._currentTime--,i+=this._durations[this.currentFrame];var n=Math.sign(this.animationSpeed*t);for(this._currentTime=Math.floor(this._currentTime);i>=this._durations[this.currentFrame];)i-=this._durations[this.currentFrame]*n,this._currentTime+=n;this._currentTime+=i/this._durations[this.currentFrame]}else this._currentTime+=e;this._currentTime<0&&!this.loop?(this.gotoAndStop(0),this.onComplete&&this.onComplete()):this._currentTime>=this._textures.length&&!this.loop?(this.gotoAndStop(this._textures.length-1),this.onComplete&&this.onComplete()):r!==this.currentFrame&&(this.loop&&this.onLoop&&(this.animationSpeed>0&&this.currentFramer)&&this.onLoop(),this.updateTexture())}},r.prototype.updateTexture=function(){var t=this.currentFrame;this._previousFrame!==t&&(this._previousFrame=t,this._texture=this._textures[t],this._textureID=-1,this._textureTrimmedID=-1,this._cachedTint=16777215,this.uvs=this._texture._uvs.uvsFloat32,this.updateAnchor&&this._anchor.copyFrom(this._texture.defaultAnchor),this.onFrameChange&&this.onFrameChange(this.currentFrame))},r.prototype.destroy=function(t){this.stop(),e.prototype.destroy.call(this,t),this.onComplete=null,this.onFrameChange=null,this.onLoop=null},r.fromFrames=function(t){for(var e=[],i=0;i0){var n=e.context;n.beginPath();for(var o=0;o0){for(l=0,d=h[0],f=h[1],p=2;p+2=0;p-=2)r.lineTo(h[p],h[p+1]);u[_].shape.closeStroke&&r.closePath()}}h[0]===h[h.length-2]&&h[1]===h[h.length-1]&&r.closePath()}else if(a.type===t.SHAPES.RECT)r.rect(a.x,a.y,a.width,a.height),r.closePath();else if(a.type===t.SHAPES.CIRC)r.arc(a.x,a.y,a.radius,0,2*Math.PI),r.closePath();else if(a.type===t.SHAPES.ELIP){var m=2*a.width,v=2*a.height,E=a.x-m/2,y=a.y-v/2,g=.5522848,T=m/2*g,b=v/2*g,x=E+m,R=y+v,A=E+m/2,S=y+v/2;r.moveTo(E,S),r.bezierCurveTo(E,S-b,A-T,y,A,y),r.bezierCurveTo(A+T,y,x,S-b,x,S),r.bezierCurveTo(x,S+b,A+T,R,A,R),r.bezierCurveTo(A-T,R,E,S+b,E,S),r.closePath()}else if(a.type===t.SHAPES.RREC){var O=a.x,I=a.y,M=a.width,N=a.height,P=a.radius,D=Math.min(M,N)/2;P=P>D?D:P,r.moveTo(O,I+P),r.lineTo(O,I+N-P),r.quadraticCurveTo(O,I+N,O+P,I+N),r.lineTo(O+M-P,I+N),r.quadraticCurveTo(O+M,I+N,O+M,I+N-P),r.lineTo(O+M,I+P),r.quadraticCurveTo(O+M,I,O+M-P,I),r.lineTo(O+P,I),r.quadraticCurveTo(O,I,O,I+P),r.closePath()}}},e.prototype.popMask=function(t){t.context.restore(),t.invalidateBlendMode()},e.prototype.destroy=function(){},e}();function Il(t){var e=document.createElement("canvas");e.width=6,e.height=1;var r=e.getContext("2d");return r.fillStyle=t,r.fillRect(0,0,6,1),e}function Ml(){if("undefined"==typeof document)return!1;var t=Il("#ff00ff"),e=Il("#ffff00"),r=document.createElement("canvas");r.width=6,r.height=1;var i=r.getContext("2d");i.globalCompositeOperation="multiply",i.drawImage(t,0,0),i.drawImage(e,2,0);var n=i.getImageData(2,0,1,1);if(!n)return!1;var o=n.data;return 255===o[0]&&0===o[1]&&0===o[2]}var Nl=new er,Pl=function(e){function r(i){var n,o=e.call(this,t.RENDERER_TYPE.CANVAS,i)||this;if(o.refresh=!0,o.maskManager=new Ol(o),o.smoothProperty="imageSmoothingEnabled",o.blendModes=(void 0===n&&(n=[]),Ml()?(n[t.BLEND_MODES.NORMAL]="source-over",n[t.BLEND_MODES.ADD]="lighter",n[t.BLEND_MODES.MULTIPLY]="multiply",n[t.BLEND_MODES.SCREEN]="screen",n[t.BLEND_MODES.OVERLAY]="overlay",n[t.BLEND_MODES.DARKEN]="darken",n[t.BLEND_MODES.LIGHTEN]="lighten",n[t.BLEND_MODES.COLOR_DODGE]="color-dodge",n[t.BLEND_MODES.COLOR_BURN]="color-burn",n[t.BLEND_MODES.HARD_LIGHT]="hard-light",n[t.BLEND_MODES.SOFT_LIGHT]="soft-light",n[t.BLEND_MODES.DIFFERENCE]="difference",n[t.BLEND_MODES.EXCLUSION]="exclusion",n[t.BLEND_MODES.HUE]="hue",n[t.BLEND_MODES.SATURATION]="saturate",n[t.BLEND_MODES.COLOR]="color",n[t.BLEND_MODES.LUMINOSITY]="luminosity"):(n[t.BLEND_MODES.NORMAL]="source-over",n[t.BLEND_MODES.ADD]="lighter",n[t.BLEND_MODES.MULTIPLY]="source-over",n[t.BLEND_MODES.SCREEN]="source-over",n[t.BLEND_MODES.OVERLAY]="source-over",n[t.BLEND_MODES.DARKEN]="source-over",n[t.BLEND_MODES.LIGHTEN]="source-over",n[t.BLEND_MODES.COLOR_DODGE]="source-over",n[t.BLEND_MODES.COLOR_BURN]="source-over",n[t.BLEND_MODES.HARD_LIGHT]="source-over",n[t.BLEND_MODES.SOFT_LIGHT]="source-over",n[t.BLEND_MODES.DIFFERENCE]="source-over",n[t.BLEND_MODES.EXCLUSION]="source-over",n[t.BLEND_MODES.HUE]="source-over",n[t.BLEND_MODES.SATURATION]="source-over",n[t.BLEND_MODES.COLOR]="source-over",n[t.BLEND_MODES.LUMINOSITY]="source-over"),n[t.BLEND_MODES.NORMAL_NPM]=n[t.BLEND_MODES.NORMAL],n[t.BLEND_MODES.ADD_NPM]=n[t.BLEND_MODES.ADD],n[t.BLEND_MODES.SCREEN_NPM]=n[t.BLEND_MODES.SCREEN],n[t.BLEND_MODES.SRC_IN]="source-in",n[t.BLEND_MODES.SRC_OUT]="source-out",n[t.BLEND_MODES.SRC_ATOP]="source-atop",n[t.BLEND_MODES.DST_OVER]="destination-over",n[t.BLEND_MODES.DST_IN]="destination-in",n[t.BLEND_MODES.DST_OUT]="destination-out",n[t.BLEND_MODES.DST_ATOP]="destination-atop",n[t.BLEND_MODES.XOR]="xor",n[t.BLEND_MODES.SUBTRACT]="source-over",n),o.renderingToScreen=!1,o._activeBlendMode=null,o._projTransform=null,o._outerBlend=!1,o.rootContext=o.view.getContext("2d",{alpha:o.useContextAlpha}),o.context=o.rootContext,!o.rootContext.imageSmoothingEnabled){var s=o.rootContext;s.webkitImageSmoothingEnabled?o.smoothProperty="webkitImageSmoothingEnabled":s.mozImageSmoothingEnabled?o.smoothProperty="mozImageSmoothingEnabled":s.oImageSmoothingEnabled?o.smoothProperty="oImageSmoothingEnabled":s.msImageSmoothingEnabled&&(o.smoothProperty="msImageSmoothingEnabled")}return o.initPlugins(r.__plugins),ce("Canvas"),o.resize(o.options.width,o.options.height),o}return function(t,e){function r(){this.constructor=t}Sl(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}(r,e),r.prototype.addSystem=function(){return this},r.prototype.render=function(e,r){if(this.view){var i,n,o,s;r&&(r instanceof xi||r instanceof Ei?(i=r,n=arguments[2],o=arguments[3],s=arguments[4]):(i=r.renderTexture,n=r.clear,o=r.transform,s=r.skipUpdateTransform)),this.renderingToScreen=!i,this.emit("prerender");var a=this.resolution;i?((i=i.castToBaseTexture())._canvasRenderTarget||(i._canvasRenderTarget=new Ue(i.width,i.height,i.resolution),i.resource=new ui(i._canvasRenderTarget.canvas),i.valid=!0),this.context=i._canvasRenderTarget.context,this.resolution=i._canvasRenderTarget.resolution):this.context=this.rootContext;var h=this.context;if(this._projTransform=o||null,i||(this._lastObjectRendered=e),!s){var u=e.enableTempParent();e.updateTransform(),e.disableTempParent(u)}if(h.save(),h.setTransform(1,0,0,1,0,0),h.globalAlpha=1,this._activeBlendMode=t.BLEND_MODES.NORMAL,this._outerBlend=!1,h.globalCompositeOperation=this.blendModes[t.BLEND_MODES.NORMAL],void 0!==n?n:this.clearBeforeRender)if(this.renderingToScreen)h.clearRect(0,0,this.width,this.height),this.backgroundAlpha>0&&(h.globalAlpha=this.useContextAlpha?this.backgroundAlpha:1,h.fillStyle=this._backgroundColorString,h.fillRect(0,0,this.width,this.height),h.globalAlpha=1);else{(i=i)._canvasRenderTarget.clear();var l=i.clearColor;l[3]>0&&(h.globalAlpha=this.useContextAlpha?l[3]:1,h.fillStyle=_e(ve(l)),h.fillRect(0,0,i.realWidth,i.realHeight),h.globalAlpha=1)}var c=this.context;this.context=h,e.renderCanvas(this),this.context=c,h.restore(),this.resolution=a,this._projTransform=null,this.emit("postrender")}},r.prototype.setContextTransform=function(t,e,r){var i=t,n=this._projTransform,o=this.resolution;r=r||o,n&&((i=Nl).copyFrom(t),i.prepend(n)),e?this.context.setTransform(i.a*r,i.b*r,i.c*r,i.d*r,i.tx*o|0,i.ty*o|0):this.context.setTransform(i.a*r,i.b*r,i.c*r,i.d*r,i.tx*o,i.ty*o)},r.prototype.clear=function(t,e){void 0===t&&(t=this._backgroundColorString),void 0===e&&(e=this.backgroundAlpha);var r=this.context;r.clearRect(0,0,this.width,this.height),t&&(r.globalAlpha=this.useContextAlpha?e:1,r.fillStyle=t,r.fillRect(0,0,this.width,this.height),r.globalAlpha=1)},r.prototype.setBlendMode=function(e,r){var i=e===t.BLEND_MODES.SRC_IN||e===t.BLEND_MODES.SRC_OUT||e===t.BLEND_MODES.DST_IN||e===t.BLEND_MODES.DST_ATOP;!r&&i&&(e=t.BLEND_MODES.NORMAL),this._activeBlendMode!==e&&(this._activeBlendMode=e,this._outerBlend=i,this.context.globalCompositeOperation=this.blendModes[e])},r.prototype.destroy=function(t){e.prototype.destroy.call(this,t),this.context=null,this.refresh=!0,this.maskManager.destroy(),this.maskManager=null,this.smoothProperty=null},r.prototype.resize=function(r,i){e.prototype.resize.call(this,r,i),this.smoothProperty&&(this.rootContext[this.smoothProperty]=it.SCALE_MODE===t.SCALE_MODES.LINEAR)},r.prototype.invalidateBlendMode=function(){this._activeBlendMode=this.blendModes.indexOf(this.context.globalCompositeOperation)},r.registerPlugin=function(t,e){r.__plugins=r.__plugins||{},r.__plugins[t]=e},r}(to),Dl={canvas:null,getTintedCanvas:function(t,e){var r=t.texture,i="#"+("00000"+(0|(e=Dl.roundColor(e))).toString(16)).slice(-6);r.tintCache=r.tintCache||{};var n,o=r.tintCache[i];if(o){if(o.tintId===r._updateID)return r.tintCache[i];n=r.tintCache[i]}else n=document.createElement("canvas");if(Dl.tintMethod(r,e,n),n.tintId=r._updateID,Dl.convertTintToImage){var s=new Image;s.src=n.toDataURL(),r.tintCache[i]=s}else r.tintCache[i]=n;return n},getTintedPattern:function(t,e){var r="#"+("00000"+(0|(e=Dl.roundColor(e))).toString(16)).slice(-6);t.patternCache=t.patternCache||{};var i=t.patternCache[r];return i&&i.tintId===t._updateID||(Dl.canvas||(Dl.canvas=document.createElement("canvas")),Dl.tintMethod(t,e,Dl.canvas),(i=Dl.canvas.getContext("2d").createPattern(Dl.canvas,"repeat")).tintId=t._updateID,t.patternCache[r]=i),i},tintWithMultiply:function(t,e,r){var i=r.getContext("2d"),n=t._frame.clone(),o=t.baseTexture.resolution;n.x*=o,n.y*=o,n.width*=o,n.height*=o,r.width=Math.ceil(n.width),r.height=Math.ceil(n.height),i.save(),i.fillStyle="#"+("00000"+(0|e).toString(16)).slice(-6),i.fillRect(0,0,n.width,n.height),i.globalCompositeOperation="multiply";var s=t.baseTexture.getDrawableSource();i.drawImage(s,n.x,n.y,n.width,n.height,0,0,n.width,n.height),i.globalCompositeOperation="destination-atop",i.drawImage(s,n.x,n.y,n.width,n.height,0,0,n.width,n.height),i.restore()},tintWithOverlay:function(t,e,r){var i=r.getContext("2d"),n=t._frame.clone(),o=t.baseTexture.resolution;n.x*=o,n.y*=o,n.width*=o,n.height*=o,r.width=Math.ceil(n.width),r.height=Math.ceil(n.height),i.save(),i.globalCompositeOperation="copy",i.fillStyle="#"+("00000"+(0|e).toString(16)).slice(-6),i.fillRect(0,0,n.width,n.height),i.globalCompositeOperation="destination-atop",i.drawImage(t.baseTexture.getDrawableSource(),n.x,n.y,n.width,n.height,0,0,n.width,n.height),i.restore()},tintWithPerPixel:function(t,e,r){var i=r.getContext("2d"),n=t._frame.clone(),o=t.baseTexture.resolution;n.x*=o,n.y*=o,n.width*=o,n.height*=o,r.width=Math.ceil(n.width),r.height=Math.ceil(n.height),i.save(),i.globalCompositeOperation="copy",i.drawImage(t.baseTexture.getDrawableSource(),n.x,n.y,n.width,n.height,0,0,n.width,n.height),i.restore();for(var s=pe(e),a=s[0],h=s[1],u=s[2],l=i.getImageData(0,0,n.width,n.height),c=l.data,d=0;d= 0x80 (not a basic code point)","invalid-input":"Invalid input"},p=Math.floor,_=String.fromCharCode;function m(t){throw RangeError(f[t])}function v(t,e){for(var r=t.length,i=[];r--;)i[r]=e(t[r]);return i}function E(t,e){var r=t.split("@"),i="";return r.length>1&&(i=r[0]+"@",t=r[1]),i+v((t=t.replace(d,".")).split("."),e).join(".")}function y(t){for(var e,r,i=[],n=0,o=t.length;n=55296&&e<=56319&&n65535&&(e+=_((t-=65536)>>>10&1023|55296),t=56320|1023&t),e+_(t)})).join("")}function T(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function b(t,e,r){var i=0;for(t=r?p(t/700):t>>1,t+=p(t/e);t>455;i+=u)t=p(t/35);return p(i+36*t/(t+38))}function x(t){var e,r,i,n,o,s,a,l,c,d,f,_=[],v=t.length,E=0,y=128,T=72;for((r=t.lastIndexOf("-"))<0&&(r=0),i=0;i=128&&m("not-basic"),_.push(t.charCodeAt(i));for(n=r>0?r+1:0;n=v&&m("invalid-input"),((l=(f=t.charCodeAt(n++))-48<10?f-22:f-65<26?f-65:f-97<26?f-97:u)>=u||l>p((h-E)/s))&&m("overflow"),E+=l*s,!(l<(c=a<=T?1:a>=T+26?26:a-T));a+=u)s>p(h/(d=u-c))&&m("overflow"),s*=d;T=b(E-o,e=_.length+1,0==o),p(E/e)>h-y&&m("overflow"),y+=p(E/e),E%=e,_.splice(E++,0,y)}return g(_)}function R(t){var e,r,i,n,o,s,a,l,c,d,f,v,E,g,x,R=[];for(v=(t=y(t)).length,e=128,r=0,o=72,s=0;s=e&&fp((h-r)/(E=i+1))&&m("overflow"),r+=(a-e)*E,e=a,s=0;sh&&m("overflow"),f==e){for(l=r,c=u;!(l<(d=c<=o?1:c>=o+26?26:c-o));c+=u)x=l-d,g=u-d,R.push(_(T(d+x%g,0))),l=p(x/g);R.push(_(T(l,0))),o=b(r,E,i==n),r=0,++i}++r,++e}return R.join("")}if(s={version:"1.3.2",ucs2:{decode:y,encode:g},decode:x,encode:R,toASCII:function(t){return E(t,(function(t){return c.test(t)?"xn--"+R(t):t}))},toUnicode:function(t){return E(t,(function(t){return l.test(t)?x(t.slice(4).toLowerCase()):t}))}},i&&n)if(t.exports==i)n.exports=s;else for(a in s)s.hasOwnProperty(a)&&(i[a]=s[a]);else r.punycode=s}(wl)})),Bl=function(t){return"string"==typeof t},Gl=function(t){return"object"==typeof t&&null!==t},Xl=function(t){return null===t};function kl(t,e){return Object.prototype.hasOwnProperty.call(t,e)}var Hl=function(t,e,r,i){e=e||"&",r=r||"=";var n={};if("string"!=typeof t||0===t.length)return n;var o=/\+/g;t=t.split(e);var s=1e3;i&&"number"==typeof i.maxKeys&&(s=i.maxKeys);var a=t.length;s>0&&a>s&&(a=s);for(var h=0;h=0?(u=f.substr(0,p),l=f.substr(p+1)):(u=f,l=""),c=decodeURIComponent(u),d=decodeURIComponent(l),kl(n,c)?Array.isArray(n[c])?n[c].push(d):n[c]=[n[c],d]:n[c]=d}return n},Yl=function(t){switch(typeof t){case"string":return t;case"boolean":return t?"true":"false";case"number":return isFinite(t)?t:"";default:return""}},jl=function(t,e,r,i){return e=e||"&",r=r||"=",null===t&&(t=void 0),"object"==typeof t?Object.keys(t).map((function(i){var n=encodeURIComponent(Yl(i))+r;return Array.isArray(t[i])?t[i].map((function(t){return n+encodeURIComponent(Yl(t))})).join(e):n+encodeURIComponent(Yl(t[i]))})).join(e):i?encodeURIComponent(Yl(i))+r+encodeURIComponent(Yl(t)):""},Vl=Ll((function(t,e){e.decode=e.parse=Hl,e.encode=e.stringify=jl})),Wl=sc;function zl(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}var ql=/^([a-z0-9.+-]+:)/i,Kl=/:[0-9]*$/,Zl=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,Ql=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),Jl=["'"].concat(Ql),$l=["%","/","?",";","#"].concat(Jl),tc=["/","?","#"],ec=/^[+a-z0-9A-Z_-]{0,63}$/,rc=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,ic={javascript:!0,"javascript:":!0},nc={javascript:!0,"javascript:":!0},oc={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};function sc(t,e,r){if(t&&Gl(t)&&t instanceof zl)return t;var i=new zl;return i.parse(t,e,r),i}zl.prototype.parse=function(t,e,r){if(!Bl(t))throw new TypeError("Parameter 'url' must be a string, not "+typeof t);var i=t.indexOf("?"),n=-1!==i&&i127?g+="x":g+=y[T];if(!g.match(ec)){var x=v.slice(0,p),R=v.slice(p+1),A=y.match(rc);A&&(x.push(A[1]),R.unshift(A[2])),R.length&&(s="/"+R.join(".")+s),this.hostname=x.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),m||(this.hostname=Ul.toASCII(this.hostname));var S=this.port?":"+this.port:"",O=this.hostname||"";this.host=O+S,this.href+=this.host,m&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==s[0]&&(s="/"+s))}if(!ic[u])for(p=0,E=Jl.length;p0)&&r.host.split("@"))&&(r.auth=A.shift(),r.host=r.hostname=A.shift())),r.search=t.search,r.query=t.query,Xl(r.pathname)&&Xl(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.href=r.format(),r;if(!y.length)return r.pathname=null,r.search?r.path="/"+r.search:r.path=null,r.href=r.format(),r;for(var T=y.slice(-1)[0],b=(r.host||t.host||y.length>1)&&("."===T||".."===T)||""===T,x=0,R=y.length;R>=0;R--)"."===(T=y[R])?y.splice(R,1):".."===T?(y.splice(R,1),x++):x&&(y.splice(R,1),x--);if(!v&&!E)for(;x--;x)y.unshift("..");!v||""===y[0]||y[0]&&"/"===y[0].charAt(0)||y.unshift(""),b&&"/"!==y.join("/").substr(-1)&&y.push("");var A,S=""===y[0]||y[0]&&"/"===y[0].charAt(0);return g&&(r.hostname=r.host=S?"":y.length?y.shift():"",(A=!!(r.host&&r.host.indexOf("@")>0)&&r.host.split("@"))&&(r.auth=A.shift(),r.host=r.hostname=A.shift())),(v=v||r.host&&y.length)&&!S&&y.unshift(""),y.length?r.pathname=y.join("/"):(r.pathname=null,r.path=null),Xl(r.pathname)&&Xl(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.auth=t.auth||r.auth,r.slashes=r.slashes||t.slashes,r.href=r.format(),r},zl.prototype.parseHost=function(){var t=this.host,e=Kl.exec(t);e&&(":"!==(e=e[0])&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)};var ac={parse:Wl,format:function(t){return Bl(t)&&(t=sc(t)),t instanceof zl?t.format():zl.prototype.format.call(t)},resolve:function(t,e){return sc(t,!1,!0).resolve(e)}};it.RETINA_PREFIX=/@([0-9\.]+)x/,it.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT=!1;var hc,uc=!1,lc=function(){for(var e=[],r=[],i=0;i<32;i++)e[i]=i,r[i]=i;e[t.BLEND_MODES.NORMAL_NPM]=t.BLEND_MODES.NORMAL,e[t.BLEND_MODES.ADD_NPM]=t.BLEND_MODES.ADD,e[t.BLEND_MODES.SCREEN_NPM]=t.BLEND_MODES.SCREEN,r[t.BLEND_MODES.NORMAL]=t.BLEND_MODES.NORMAL_NPM,r[t.BLEND_MODES.ADD]=t.BLEND_MODES.ADD_NPM,r[t.BLEND_MODES.SCREEN]=t.BLEND_MODES.SCREEN_NPM;var n=[];return n.push(r),n.push(e),n}();function cc(t){if(4===t.BYTES_PER_ELEMENT)return t instanceof Float32Array?"Float32Array":t instanceof Uint32Array?"Uint32Array":"Int32Array";if(2===t.BYTES_PER_ELEMENT){if(t instanceof Uint16Array)return"Uint16Array"}else if(1===t.BYTES_PER_ELEMENT&&t instanceof Uint8Array)return"Uint8Array";return null}function dc(t){return t+=0===t?1:0,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,1+(t|=t>>>16)}function fc(t){return!(t&t-1||!t)}function pc(t){var e=(t>65535?1:0)<<4,r=((t>>>=e)>255?1:0)<<3;return e|=r,e|=r=((t>>>=r)>15?1:0)<<2,(e|=r=((t>>>=r)>3?1:0)<<1)|(t>>>=r)>>1}var _c=0;function mc(){return++_c}var vc={};function Ec(t,e,r){if(void 0===r&&(r=3),!vc[e]){var i=(new Error).stack;void 0===i?console.warn("PixiJS Deprecation Warning: ",e+"\nDeprecated since v"+t):(i=i.split("\n").splice(r).join("\n"),console.groupCollapsed?(console.groupCollapsed("%cPixiJS Deprecation Warning: %c%s","color:#614108;background:#fffbe6","font-weight:normal;color:#614108;background:#fffbe6",e+"\nDeprecated since v"+t),console.warn(i),console.groupEnd()):(console.warn("PixiJS Deprecation Warning: ",e+"\nDeprecated since v"+t),console.warn(i))),vc[e]=!0}}var yc,gc={},Tc=Object.create(null),bc=Object.create(null);function xc(t,e){var r=it.RETINA_PREFIX.exec(t);return r?parseFloat(r[1]):void 0!==e?e:1}!function(){function t(t,e,r){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),this.resolution=r||it.RESOLUTION,this.resize(t,e)}t.prototype.clear=function(){this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.canvas.width,this.canvas.height)},t.prototype.resize=function(t,e){this.canvas.width=Math.round(t*this.resolution),this.canvas.height=Math.round(e*this.resolution)},t.prototype.destroy=function(){this.context=null,this.canvas=null},Object.defineProperty(t.prototype,"width",{get:function(){return this.canvas.width},set:function(t){this.canvas.width=Math.round(t)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"height",{get:function(){return this.canvas.height},set:function(t){this.canvas.height=Math.round(t)},enumerable:!1,configurable:!0})}();var Rc,Ac=function(){function t(t){this.items=[],this._name=t,this._aliasCount=0}return t.prototype.emit=function(t,e,r,i,n,o,s,a){if(arguments.length>8)throw new Error("max arguments reached");var h=this,u=h.name,l=h.items;this._aliasCount++;for(var c=0,d=l.length;c0&&this.items.length>1&&(this._aliasCount=0,this.items=this.items.slice(0))},t.prototype.add=function(t){return t[this._name]&&(this.ensureNonAliasedItems(),this.remove(t),this.items.push(t)),this},t.prototype.remove=function(t){var e=this.items.indexOf(t);return-1!==e&&(this.ensureNonAliasedItems(),this.items.splice(e,1)),this},t.prototype.contains=function(t){return-1!==this.items.indexOf(t)},t.prototype.removeAll=function(){return this.ensureNonAliasedItems(),this.items.length=0,this},t.prototype.destroy=function(){this.removeAll(),this.items=null,this._name=null},Object.defineProperty(t.prototype,"empty",{get:function(){return 0===this.items.length},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),t}();Object.defineProperties(Ac.prototype,{dispatch:{value:Ac.prototype.emit},run:{value:Ac.prototype.emit}}),it.TARGET_FPMS=.06,function(t){t[t.INTERACTION=50]="INTERACTION",t[t.HIGH=25]="HIGH",t[t.NORMAL=0]="NORMAL",t[t.LOW=-25]="LOW",t[t.UTILITY=-50]="UTILITY"}(Rc||(Rc={}));var Sc,Oc=function(){function t(t,e,r,i){void 0===e&&(e=null),void 0===r&&(r=0),void 0===i&&(i=!1),this.next=null,this.previous=null,this._destroyed=!1,this.fn=t,this.context=e,this.priority=r,this.once=i}return t.prototype.match=function(t,e){return void 0===e&&(e=null),this.fn===t&&this.context===e},t.prototype.emit=function(t){this.fn&&(this.context?this.fn.call(this.context,t):this.fn(t));var e=this.next;return this.once&&this.destroy(!0),this._destroyed&&(this.next=null),e},t.prototype.connect=function(t){this.previous=t,t.next&&(t.next.previous=this),this.next=t.next,t.next=this},t.prototype.destroy=function(t){void 0===t&&(t=!1),this._destroyed=!0,this.fn=null,this.context=null,this.previous&&(this.previous.next=this.next),this.next&&(this.next.previous=this.previous);var e=this.next;return this.next=t?null:e,this.previous=null,e},t}(),Ic=function(){function t(){var t=this;this.autoStart=!1,this.deltaTime=1,this.lastTime=-1,this.speed=1,this.started=!1,this._requestId=null,this._maxElapsedMS=100,this._minElapsedMS=0,this._protected=!1,this._lastFrame=-1,this._head=new Oc(null,null,1/0),this.deltaMS=1/it.TARGET_FPMS,this.elapsedMS=1/it.TARGET_FPMS,this._tick=function(e){t._requestId=null,t.started&&(t.update(e),t.started&&null===t._requestId&&t._head.next&&(t._requestId=requestAnimationFrame(t._tick)))}}return t.prototype._requestIfNeeded=function(){null===this._requestId&&this._head.next&&(this.lastTime=performance.now(),this._lastFrame=this.lastTime,this._requestId=requestAnimationFrame(this._tick))},t.prototype._cancelIfNeeded=function(){null!==this._requestId&&(cancelAnimationFrame(this._requestId),this._requestId=null)},t.prototype._startIfPossible=function(){this.started?this._requestIfNeeded():this.autoStart&&this.start()},t.prototype.add=function(t,e,r){return void 0===r&&(r=Rc.NORMAL),this._addListener(new Oc(t,e,r))},t.prototype.addOnce=function(t,e,r){return void 0===r&&(r=Rc.NORMAL),this._addListener(new Oc(t,e,r,!0))},t.prototype._addListener=function(t){var e=this._head.next,r=this._head;if(e){for(;e;){if(t.priority>e.priority){t.connect(r);break}r=e,e=e.next}t.previous||t.connect(r)}else t.connect(r);return this._startIfPossible(),this},t.prototype.remove=function(t,e){for(var r=this._head.next;r;)r=r.match(t,e)?r.destroy():r.next;return this._head.next||this._cancelIfNeeded(),this},Object.defineProperty(t.prototype,"count",{get:function(){if(!this._head)return 0;for(var t=0,e=this._head;e=e.next;)t++;return t},enumerable:!1,configurable:!0}),t.prototype.start=function(){this.started||(this.started=!0,this._requestIfNeeded())},t.prototype.stop=function(){this.started&&(this.started=!1,this._cancelIfNeeded())},t.prototype.destroy=function(){if(!this._protected){this.stop();for(var t=this._head.next;t;)t=t.destroy(!0);this._head.destroy(),this._head=null}},t.prototype.update=function(t){var e;if(void 0===t&&(t=performance.now()),t>this.lastTime){if((e=this.elapsedMS=t-this.lastTime)>this._maxElapsedMS&&(e=this._maxElapsedMS),e*=this.speed,this._minElapsedMS){var r=t-this._lastFrame|0;if(r=this.x&&t=this.y&&et.right?t.right:this.right)<=r)return!1;var i=this.yt.bottom?t.bottom:this.bottom)>i}var n=this.left,o=this.right,s=this.top,a=this.bottom;if(o<=n||a<=s)return!1;var h=Pc[0].set(t.left,t.top),u=Pc[1].set(t.left,t.bottom),l=Pc[2].set(t.right,t.top),c=Pc[3].set(t.right,t.bottom);if(l.x<=h.x||u.y<=h.y)return!1;var d=Math.sign(e.a*e.d-e.b*e.c);if(0===d)return!1;if(e.apply(h,h),e.apply(u,u),e.apply(l,l),e.apply(c,c),Math.max(h.x,u.x,l.x,c.x)<=n||Math.min(h.x,u.x,l.x,c.x)>=o||Math.max(h.y,u.y,l.y,c.y)<=s||Math.min(h.y,u.y,l.y,c.y)>=a)return!1;var f=d*(u.y-h.y),p=d*(h.x-u.x),_=f*n+p*s,m=f*o+p*s,v=f*n+p*a,E=f*o+p*a;if(Math.max(_,m,v,E)<=f*h.x+p*h.y||Math.min(_,m,v,E)>=f*c.x+p*c.y)return!1;var y=d*(h.y-l.y),g=d*(l.x-h.x),T=y*n+g*s,b=y*o+g*s,x=y*n+g*a,R=y*o+g*a;return!(Math.max(T,b,x,R)<=y*h.x+g*h.y||Math.min(T,b,x,R)>=y*c.x+g*c.y)},t.prototype.pad=function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x-=t,this.y-=e,this.width+=2*t,this.height+=2*e,this},t.prototype.fit=function(t){var e=Math.max(this.x,t.x),r=Math.min(this.x+this.width,t.x+t.width),i=Math.max(this.y,t.y),n=Math.min(this.y+this.height,t.y+t.height);return this.x=e,this.width=Math.max(r-e,0),this.y=i,this.height=Math.max(n-i,0),this},t.prototype.ceil=function(t,e){void 0===t&&(t=1),void 0===e&&(e=.001);var r=Math.ceil((this.x+this.width-e)*t)/t,i=Math.ceil((this.y+this.height-e)*t)/t;return this.x=Math.floor((this.x+e)*t)/t,this.y=Math.floor((this.y+e)*t)/t,this.width=r-this.x,this.height=i-this.y,this},t.prototype.enlarge=function(t){var e=Math.min(this.x,t.x),r=Math.max(this.x+this.width,t.x+t.width),i=Math.min(this.y,t.y),n=Math.max(this.y+this.height,t.y+t.height);return this.x=e,this.width=r-e,this.y=i,this.height=n-i,this},t.prototype.toString=function(){return"[@pixi/math:Rectangle x="+this.x+" y="+this.y+" width="+this.width+" height="+this.height+"]"},t}(),Cc=function(){function t(t,e,r,i){void 0===r&&(r=0),void 0===i&&(i=0),this._x=r,this._y=i,this.cb=t,this.scope=e}return t.prototype.clone=function(e,r){return void 0===e&&(e=this.cb),void 0===r&&(r=this.scope),new t(e,r,this._x,this._y)},t.prototype.set=function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this._x===t&&this._y===e||(this._x=t,this._y=e,this.cb.call(this.scope)),this},t.prototype.copyFrom=function(t){return this._x===t.x&&this._y===t.y||(this._x=t.x,this._y=t.y,this.cb.call(this.scope)),this},t.prototype.copyTo=function(t){return t.set(this._x,this._y),t},t.prototype.equals=function(t){return t.x===this._x&&t.y===this._y},t.prototype.toString=function(){return"[@pixi/math:ObservablePoint x=0 y=0 scope="+this.scope+"]"},Object.defineProperty(t.prototype,"x",{get:function(){return this._x},set:function(t){this._x!==t&&(this._x=t,this.cb.call(this.scope))},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"y",{get:function(){return this._y},set:function(t){this._y!==t&&(this._y=t,this.cb.call(this.scope))},enumerable:!1,configurable:!0}),t}(),wc=function(){function t(t,e,r,i,n,o){void 0===t&&(t=1),void 0===e&&(e=0),void 0===r&&(r=0),void 0===i&&(i=1),void 0===n&&(n=0),void 0===o&&(o=0),this.array=null,this.a=t,this.b=e,this.c=r,this.d=i,this.tx=n,this.ty=o}return t.prototype.fromArray=function(t){this.a=t[0],this.b=t[1],this.c=t[3],this.d=t[4],this.tx=t[2],this.ty=t[5]},t.prototype.set=function(t,e,r,i,n,o){return this.a=t,this.b=e,this.c=r,this.d=i,this.tx=n,this.ty=o,this},t.prototype.toArray=function(t,e){this.array||(this.array=new Float32Array(9));var r=e||this.array;return t?(r[0]=this.a,r[1]=this.b,r[2]=0,r[3]=this.c,r[4]=this.d,r[5]=0,r[6]=this.tx,r[7]=this.ty,r[8]=1):(r[0]=this.a,r[1]=this.c,r[2]=this.tx,r[3]=this.b,r[4]=this.d,r[5]=this.ty,r[6]=0,r[7]=0,r[8]=1),r},t.prototype.apply=function(t,e){e=e||new Nc;var r=t.x,i=t.y;return e.x=this.a*r+this.c*i+this.tx,e.y=this.b*r+this.d*i+this.ty,e},t.prototype.applyInverse=function(t,e){e=e||new Nc;var r=1/(this.a*this.d+this.c*-this.b),i=t.x,n=t.y;return e.x=this.d*r*i+-this.c*r*n+(this.ty*this.c-this.tx*this.d)*r,e.y=this.a*r*n+-this.b*r*i+(-this.ty*this.a+this.tx*this.b)*r,e},t.prototype.translate=function(t,e){return this.tx+=t,this.ty+=e,this},t.prototype.scale=function(t,e){return this.a*=t,this.d*=e,this.c*=t,this.b*=e,this.tx*=t,this.ty*=e,this},t.prototype.rotate=function(t){var e=Math.cos(t),r=Math.sin(t),i=this.a,n=this.c,o=this.tx;return this.a=i*e-this.b*r,this.b=i*r+this.b*e,this.c=n*e-this.d*r,this.d=n*r+this.d*e,this.tx=o*e-this.ty*r,this.ty=o*r+this.ty*e,this},t.prototype.append=function(t){var e=this.a,r=this.b,i=this.c,n=this.d;return this.a=t.a*e+t.b*i,this.b=t.a*r+t.b*n,this.c=t.c*e+t.d*i,this.d=t.c*r+t.d*n,this.tx=t.tx*e+t.ty*i+this.tx,this.ty=t.tx*r+t.ty*n+this.ty,this},t.prototype.setTransform=function(t,e,r,i,n,o,s,a,h){return this.a=Math.cos(s+h)*n,this.b=Math.sin(s+h)*n,this.c=-Math.sin(s-a)*o,this.d=Math.cos(s-a)*o,this.tx=t-(r*this.a+i*this.c),this.ty=e-(r*this.b+i*this.d),this},t.prototype.prepend=function(t){var e=this.tx;if(1!==t.a||0!==t.b||0!==t.c||1!==t.d){var r=this.a,i=this.c;this.a=r*t.a+this.b*t.c,this.b=r*t.b+this.b*t.d,this.c=i*t.a+this.d*t.c,this.d=i*t.b+this.d*t.d}return this.tx=e*t.a+this.ty*t.c+t.tx,this.ty=e*t.b+this.ty*t.d+t.ty,this},t.prototype.decompose=function(t){var e=this.a,r=this.b,i=this.c,n=this.d,o=t.pivot,s=-Math.atan2(-i,n),a=Math.atan2(r,e),h=Math.abs(s+a);return h<1e-5||Math.abs(Mc-h)<1e-5?(t.rotation=a,t.skew.x=t.skew.y=0):(t.rotation=0,t.skew.x=s,t.skew.y=a),t.scale.x=Math.sqrt(e*e+r*r),t.scale.y=Math.sqrt(i*i+n*n),t.position.x=this.tx+(o.x*e+o.y*i),t.position.y=this.ty+(o.x*r+o.y*n),t},t.prototype.invert=function(){var t=this.a,e=this.b,r=this.c,i=this.d,n=this.tx,o=t*i-e*r;return this.a=i/o,this.b=-e/o,this.c=-r/o,this.d=t/o,this.tx=(r*this.ty-i*n)/o,this.ty=-(t*this.ty-e*n)/o,this},t.prototype.identity=function(){return this.a=1,this.b=0,this.c=0,this.d=1,this.tx=0,this.ty=0,this},t.prototype.clone=function(){var e=new t;return e.a=this.a,e.b=this.b,e.c=this.c,e.d=this.d,e.tx=this.tx,e.ty=this.ty,e},t.prototype.copyTo=function(t){return t.a=this.a,t.b=this.b,t.c=this.c,t.d=this.d,t.tx=this.tx,t.ty=this.ty,t},t.prototype.copyFrom=function(t){return this.a=t.a,this.b=t.b,this.c=t.c,this.d=t.d,this.tx=t.tx,this.ty=t.ty,this},t.prototype.toString=function(){return"[@pixi/math:Matrix a="+this.a+" b="+this.b+" c="+this.c+" d="+this.d+" tx="+this.tx+" ty="+this.ty+"]"},Object.defineProperty(t,"IDENTITY",{get:function(){return new t},enumerable:!1,configurable:!0}),Object.defineProperty(t,"TEMP_MATRIX",{get:function(){return new t},enumerable:!1,configurable:!0}),t}(),Lc=[1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1,0,1],Fc=[0,1,1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1],Uc=[0,-1,-1,-1,0,1,1,1,0,1,1,1,0,-1,-1,-1],Bc=[1,1,0,-1,-1,-1,0,1,-1,-1,0,1,1,1,0,-1],Gc=[],Xc=[],kc=Math.sign;!function(){for(var t=0;t<16;t++){var e=[];Gc.push(e);for(var r=0;r<16;r++)for(var i=kc(Lc[t]*Lc[r]+Uc[t]*Fc[r]),n=kc(Fc[t]*Lc[r]+Bc[t]*Fc[r]),o=kc(Lc[t]*Uc[r]+Uc[t]*Bc[r]),s=kc(Fc[t]*Uc[r]+Bc[t]*Bc[r]),a=0;a<16;a++)if(Lc[a]===i&&Fc[a]===n&&Uc[a]===o&&Bc[a]===s){e.push(a);break}}for(t=0;t<16;t++){var h=new wc;h.set(Lc[t],Fc[t],Uc[t],Bc[t],0,0),Xc.push(h)}}();var Hc={E:0,SE:1,S:2,SW:3,W:4,NW:5,N:6,NE:7,MIRROR_VERTICAL:8,MAIN_DIAGONAL:10,MIRROR_HORIZONTAL:12,REVERSE_DIAGONAL:14,uX:function(t){return Lc[t]},uY:function(t){return Fc[t]},vX:function(t){return Uc[t]},vY:function(t){return Bc[t]},inv:function(t){return 8&t?15&t:7&-t},add:function(t,e){return Gc[t][e]},sub:function(t,e){return Gc[t][Hc.inv(e)]},rotate180:function(t){return 4^t},isVertical:function(t){return 2==(3&t)},byDirection:function(t,e){return 2*Math.abs(t)<=Math.abs(e)?e>=0?Hc.S:Hc.N:2*Math.abs(e)<=Math.abs(t)?t>0?Hc.E:Hc.W:e>0?t>0?Hc.SE:Hc.SW:t>0?Hc.NE:Hc.NW},matrixAppendRotationInv:function(t,e,r,i){void 0===r&&(r=0),void 0===i&&(i=0);var n=Xc[Hc.inv(e)];n.tx=r,n.ty=i,t.append(n)}};!function(){function t(){this.worldTransform=new wc,this.localTransform=new wc,this.position=new Cc(this.onChange,this,0,0),this.scale=new Cc(this.onChange,this,1,1),this.pivot=new Cc(this.onChange,this,0,0),this.skew=new Cc(this.updateSkew,this,0,0),this._rotation=0,this._cx=1,this._sx=0,this._cy=0,this._sy=1,this._localID=0,this._currentLocalID=0,this._worldID=0,this._parentID=0}t.prototype.onChange=function(){this._localID++},t.prototype.updateSkew=function(){this._cx=Math.cos(this._rotation+this.skew.y),this._sx=Math.sin(this._rotation+this.skew.y),this._cy=-Math.sin(this._rotation-this.skew.x),this._sy=Math.cos(this._rotation-this.skew.x),this._localID++},t.prototype.toString=function(){return"[@pixi/math:Transform position=("+this.position.x+", "+this.position.y+") rotation="+this.rotation+" scale=("+this.scale.x+", "+this.scale.y+") skew=("+this.skew.x+", "+this.skew.y+") ]"},t.prototype.updateLocalTransform=function(){var t=this.localTransform;this._localID!==this._currentLocalID&&(t.a=this._cx*this.scale.x,t.b=this._sx*this.scale.x,t.c=this._cy*this.scale.y,t.d=this._sy*this.scale.y,t.tx=this.position.x-(this.pivot.x*t.a+this.pivot.y*t.c),t.ty=this.position.y-(this.pivot.x*t.b+this.pivot.y*t.d),this._currentLocalID=this._localID,this._parentID=-1)},t.prototype.updateTransform=function(t){var e=this.localTransform;if(this._localID!==this._currentLocalID&&(e.a=this._cx*this.scale.x,e.b=this._sx*this.scale.x,e.c=this._cy*this.scale.y,e.d=this._sy*this.scale.y,e.tx=this.position.x-(this.pivot.x*e.a+this.pivot.y*e.c),e.ty=this.position.y-(this.pivot.x*e.b+this.pivot.y*e.d),this._currentLocalID=this._localID,this._parentID=-1),this._parentID!==t._worldID){var r=t.worldTransform,i=this.worldTransform;i.a=e.a*r.a+e.b*r.c,i.b=e.a*r.b+e.b*r.d,i.c=e.c*r.a+e.d*r.c,i.d=e.c*r.b+e.d*r.d,i.tx=e.tx*r.a+e.ty*r.c+r.tx,i.ty=e.tx*r.b+e.ty*r.d+r.ty,this._parentID=t._worldID,this._worldID++}},t.prototype.setFromMatrix=function(t){t.decompose(this),this._localID++},Object.defineProperty(t.prototype,"rotation",{get:function(){return this._rotation},set:function(t){this._rotation!==t&&(this._rotation=t,this.updateSkew())},enumerable:!1,configurable:!0}),t.IDENTITY=new t}(),it.PREFER_ENV=rt.any?t.ENV.WEBGL:t.ENV.WEBGL2,it.STRICT_TEXTURE_CACHE=!1;var Yc=[];function jc(t,e){if(!t)return null;var r="";if("string"==typeof t){var i=/\.(\w{3,4})(?:$|\?|#)/i.exec(t);i&&(r=i[1].toLowerCase())}for(var n=Yc.length-1;n>=0;--n){var o=Yc[n];if(o.test&&o.test(t,r))return new o(t,e)}throw new Error("Unrecognized source type to auto-detect Resource")}var Vc=function(t,e){return Vc=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},Vc(t,e)};function Wc(t,e){function r(){this.constructor=t}Vc(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}var zc=function(){return zc=Object.assign||function(t){for(var e,r=arguments,i=1,n=arguments.length;i0&&l>0,n.textureCacheIds=[],n.destroyed=!1,n.resource=null,n._batchEnabled=0,n._batchLocation=0,n.parentTextureArray=null,n.setResource(r),n}return Wc(r,e),Object.defineProperty(r.prototype,"realWidth",{get:function(){return Math.round(this.width*this.resolution)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"realHeight",{get:function(){return Math.round(this.height*this.resolution)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"mipmap",{get:function(){return this._mipmap},set:function(t){this._mipmap!==t&&(this._mipmap=t,this.dirtyStyleId++)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scaleMode",{get:function(){return this._scaleMode},set:function(t){this._scaleMode!==t&&(this._scaleMode=t,this.dirtyStyleId++)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"wrapMode",{get:function(){return this._wrapMode},set:function(t){this._wrapMode!==t&&(this._wrapMode=t,this.dirtyStyleId++)},enumerable:!1,configurable:!0}),r.prototype.setStyle=function(t,e){var r;return void 0!==t&&t!==this.scaleMode&&(this.scaleMode=t,r=!0),void 0!==e&&e!==this.mipmap&&(this.mipmap=e,r=!0),r&&this.dirtyStyleId++,this},r.prototype.setSize=function(t,e,r){return r=r||this.resolution,this.setRealSize(t*r,e*r,r)},r.prototype.setRealSize=function(t,e,r){return this.resolution=r||this.resolution,this.width=Math.round(t)/this.resolution,this.height=Math.round(e)/this.resolution,this._refreshPOT(),this.update(),this},r.prototype._refreshPOT=function(){this.isPowerOfTwo=fc(this.realWidth)&&fc(this.realHeight)},r.prototype.setResolution=function(t){var e=this.resolution;return e===t||(this.resolution=t,this.valid&&(this.width=Math.round(this.width*e)/t,this.height=Math.round(this.height*e)/t,this.emit("update",this)),this._refreshPOT()),this},r.prototype.setResource=function(t){if(this.resource===t)return this;if(this.resource)throw new Error("Resource can be set only once");return t.bind(this),this.resource=t,this},r.prototype.update=function(){this.valid?(this.dirtyId++,this.dirtyStyleId++,this.emit("update",this)):this.width>0&&this.height>0&&(this.valid=!0,this.emit("loaded",this),this.emit("update",this))},r.prototype.onError=function(t){this.emit("error",this,t)},r.prototype.destroy=function(){this.resource&&(this.resource.unbind(this),this.resource.internal&&this.resource.destroy(),this.resource=null),this.cacheId&&(delete bc[this.cacheId],delete Tc[this.cacheId],this.cacheId=null),this.dispose(),r.removeFromCache(this),this.textureCacheIds=null,this.destroyed=!0},r.prototype.dispose=function(){this.emit("dispose",this)},r.prototype.castToBaseTexture=function(){return this},r.from=function(t,e,i){void 0===i&&(i=it.STRICT_TEXTURE_CACHE);var n="string"==typeof t,o=null;if(n)o=t;else{if(!t._pixiId){var s=e&&e.pixiIdPrefix||"pixiid";t._pixiId=s+"_"+mc()}o=t._pixiId}var a=bc[o];if(n&&i&&!a)throw new Error('The cacheId "'+o+'" does not exist in BaseTextureCache.');return a||((a=new r(t,e)).cacheId=o,r.addToCache(a,o)),a},r.fromBuffer=function(e,i,n,o){e=e||new Float32Array(i*n*4);var s=new Kc(e,{width:i,height:n}),a=e instanceof Float32Array?t.TYPES.FLOAT:t.TYPES.UNSIGNED_BYTE;return new r(s,Object.assign(Zc,o||{width:i,height:n,type:a}))},r.addToCache=function(t,e){e&&(-1===t.textureCacheIds.indexOf(e)&&t.textureCacheIds.push(e),bc[e]&&console.warn("BaseTexture added to the cache with an id ["+e+"] that already had an entry"),bc[e]=t)},r.removeFromCache=function(t){if("string"==typeof t){var e=bc[t];if(e){var r=e.textureCacheIds.indexOf(t);return r>-1&&e.textureCacheIds.splice(r,1),delete bc[t],e}}else if(t&&t.textureCacheIds){for(var i=0;i0){if(!e.resource)throw new Error("CubeResource does not support copying of renderTexture.");this.addResourceAt(e.resource,r)}else e.target=t.TARGETS.TEXTURE_CUBE_MAP_POSITIVE_X+r,e.parentTextureArray=this.baseTexture,this.items[r]=e;return e.valid&&!this.valid&&this.resize(e.realWidth,e.realHeight),this.items[r]=e,this},r.prototype.upload=function(t,e,i){for(var n=this.itemDirtyIds,o=0;o)?\s*()]*-->)?\s*\]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*>/i,e}(td),od=function(t){function e(r,i){var n=this;if(i=i||{},!(r instanceof HTMLVideoElement)){var o=document.createElement("video");o.setAttribute("preload","auto"),o.setAttribute("webkit-playsinline",""),o.setAttribute("playsinline",""),"string"==typeof r&&(r=[r]);var s=r[0].src||r[0];td.crossOrigin(o,s,i.crossorigin);for(var a=0;a0&&!1===t.paused&&!1===t.ended&&t.readyState>2},e.prototype._isSourceReady=function(){var t=this.source;return 3===t.readyState||4===t.readyState},e.prototype._onPlayStart=function(){this.valid||this._onCanPlay(),this.autoUpdate&&!this._isConnectedToTicker&&(Ic.shared.add(this.update,this),this._isConnectedToTicker=!0)},e.prototype._onPlayStop=function(){this._isConnectedToTicker&&(Ic.shared.remove(this.update,this),this._isConnectedToTicker=!1)},e.prototype._onCanPlay=function(){var t=this.source;t.removeEventListener("canplay",this._onCanPlay),t.removeEventListener("canplaythrough",this._onCanPlay);var e=this.valid;this.resize(t.videoWidth,t.videoHeight),!e&&this._resolve&&(this._resolve(this),this._resolve=null),this._isSourcePlaying()?this._onPlayStart():this.autoPlay&&t.play()},e.prototype.dispose=function(){this._isConnectedToTicker&&(Ic.shared.remove(this.update,this),this._isConnectedToTicker=!1);var e=this.source;e&&(e.removeEventListener("error",this._onError,!0),e.pause(),e.src="",e.load()),t.prototype.dispose.call(this)},Object.defineProperty(e.prototype,"autoUpdate",{get:function(){return this._autoUpdate},set:function(t){t!==this._autoUpdate&&(this._autoUpdate=t,!this._autoUpdate&&this._isConnectedToTicker?(Ic.shared.remove(this.update,this),this._isConnectedToTicker=!1):this._autoUpdate&&!this._isConnectedToTicker&&this._isSourcePlaying()&&(Ic.shared.add(this.update,this),this._isConnectedToTicker=!0))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"updateFPS",{get:function(){return this._updateFPS},set:function(t){t!==this._updateFPS&&(this._updateFPS=t)},enumerable:!1,configurable:!0}),e.test=function(t,r){return globalThis.HTMLVideoElement&&t instanceof HTMLVideoElement||e.TYPES.indexOf(r)>-1},e.TYPES=["mp4","m4v","webm","ogg","ogv","h264","avi","mov"],e.MIME_TYPES={ogv:"video/ogg",mov:"video/quicktime",m4v:"video/mp4"},e}(td),sd=function(t){function e(e){return t.call(this,e)||this}return Wc(e,t),e.test=function(t){return!!globalThis.createImageBitmap&&t instanceof ImageBitmap},e}(td);Yc.push(id,sd,ed,od,nd,Kc,rd,$c);var ad={__proto__:null,Resource:qc,BaseImageResource:td,INSTALLED:Yc,autoDetectResource:jc,AbstractMultiResource:Jc,ArrayResource:$c,BufferResource:Kc,CanvasResource:ed,CubeResource:rd,ImageResource:id,SVGResource:nd,VideoResource:od,ImageBitmapResource:sd},hd=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return Wc(r,e),r.prototype.upload=function(e,r,i){var n=e.gl;n.pixelStorei(n.UNPACK_PREMULTIPLY_ALPHA_WEBGL,r.alphaMode===t.ALPHA_MODES.UNPACK);var o=r.realWidth,s=r.realHeight;return i.width===o&&i.height===s?n.texSubImage2D(r.target,0,0,0,o,s,r.format,i.type,this.data):(i.width=o,i.height=s,n.texImage2D(r.target,0,i.internalFormat,o,s,0,r.format,i.type,this.data)),!0},r}(Kc),ud=function(){function e(e,r){this.width=Math.round(e||100),this.height=Math.round(r||100),this.stencil=!1,this.depth=!1,this.dirtyId=0,this.dirtyFormat=0,this.dirtySize=0,this.depthTexture=null,this.colorTextures=[],this.glFramebuffers={},this.disposeRunner=new Ac("disposeFramebuffer"),this.multisample=t.MSAA_QUALITY.NONE}return Object.defineProperty(e.prototype,"colorTexture",{get:function(){return this.colorTextures[0]},enumerable:!1,configurable:!0}),e.prototype.addColorTexture=function(e,r){return void 0===e&&(e=0),this.colorTextures[e]=r||new Qc(null,{scaleMode:t.SCALE_MODES.NEAREST,resolution:1,mipmap:t.MIPMAP_MODES.OFF,width:this.width,height:this.height}),this.dirtyId++,this.dirtyFormat++,this},e.prototype.addDepthTexture=function(e){return this.depthTexture=e||new Qc(new hd(null,{width:this.width,height:this.height}),{scaleMode:t.SCALE_MODES.NEAREST,resolution:1,width:this.width,height:this.height,mipmap:t.MIPMAP_MODES.OFF,format:t.FORMATS.DEPTH_COMPONENT,type:t.TYPES.UNSIGNED_SHORT}),this.dirtyId++,this.dirtyFormat++,this},e.prototype.enableDepth=function(){return this.depth=!0,this.dirtyId++,this.dirtyFormat++,this},e.prototype.enableStencil=function(){return this.stencil=!0,this.dirtyId++,this.dirtyFormat++,this},e.prototype.resize=function(t,e){if(t=Math.round(t),e=Math.round(e),t!==this.width||e!==this.height){this.width=t,this.height=e,this.dirtyId++,this.dirtySize++;for(var r=0;r-1&&e.textureCacheIds.splice(r,1),delete Tc[t],e}}else if(t&&t.textureCacheIds){for(var i=0;ithis.baseTexture.width,s=r+n>this.baseTexture.height;if(o||s){var a=o&&s?"and":"or",h="X: "+e+" + "+i+" = "+(e+i)+" > "+this.baseTexture.width,u="Y: "+r+" + "+n+" = "+(r+n)+" > "+this.baseTexture.height;throw new Error("Texture Error: frame does not fit inside the base Texture dimensions: "+h+" "+a+" "+u)}this.valid=i&&n&&this.baseTexture.valid,this.trim||this.rotate||(this.orig=t),this.valid&&this.updateUvs()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"rotate",{get:function(){return this._rotate},set:function(t){this._rotate=t,this.valid&&this.updateUvs()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"width",{get:function(){return this.orig.width},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"height",{get:function(){return this.orig.height},enumerable:!1,configurable:!0}),e.prototype.castToBaseTexture=function(){return this.baseTexture},Object.defineProperty(e,"EMPTY",{get:function(){return e._EMPTY||(e._EMPTY=new e(new Qc),fd(e._EMPTY),fd(e._EMPTY.baseTexture)),e._EMPTY},enumerable:!1,configurable:!0}),Object.defineProperty(e,"WHITE",{get:function(){if(!e._WHITE){var t=document.createElement("canvas"),r=t.getContext("2d");t.width=16,t.height=16,r.fillStyle="white",r.fillRect(0,0,16,16),e._WHITE=new e(new Qc(new ed(t))),fd(e._WHITE),fd(e._WHITE.baseTexture)}return e._WHITE},enumerable:!1,configurable:!0}),e}(Fl),_d=function(t){function e(e,r){var i=t.call(this,e,r)||this;return i.valid=!0,i.filterFrame=null,i.filterPoolKey=null,i.updateUvs(),i}return Wc(e,t),Object.defineProperty(e.prototype,"framebuffer",{get:function(){return this.baseTexture.framebuffer},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"multisample",{get:function(){return this.framebuffer.multisample},set:function(t){this.framebuffer.multisample=t},enumerable:!1,configurable:!0}),e.prototype.resize=function(t,e,r){void 0===r&&(r=!0);var i=this.baseTexture.resolution,n=Math.round(t*i)/i,o=Math.round(e*i)/i;this.valid=n>0&&o>0,this._frame.width=this.orig.width=n,this._frame.height=this.orig.height=o,r&&this.baseTexture.resize(n,o),this.updateUvs()},e.prototype.setResolution=function(t){var e=this.baseTexture;e.resolution!==t&&(e.setResolution(t),this.resize(e.width,e.height,!1))},e.create=function(t){for(var r=arguments,i=[],n=1;n1?-n:-1:(o=((65535&(e=dc(e)))<<16|65535&(r=dc(r)))>>>0,n>1&&(o+=4294967296*n)),this.texturePool[o]||(this.texturePool[o]=[]);var s=this.texturePool[o].pop();return s||(s=this.createTexture(e,r,n)),s.filterPoolKey=o,s.setResolution(i),s},e.prototype.getFilterTexture=function(e,r,i){var n=this.getOptimalTexture(e.width,e.height,r||e.resolution,i||t.MSAA_QUALITY.NONE);return n.filterFrame=e.filterFrame,n},e.prototype.returnTexture=function(t){var e=t.filterPoolKey;t.filterFrame=null,this.texturePool[e].push(t)},e.prototype.returnFilterTexture=function(t){this.returnTexture(t)},e.prototype.clear=function(t){if(t=!1!==t)for(var e in this.texturePool){var r=this.texturePool[e];if(r)for(var i=0;i0&&t.height>0,this.texturePool)if(Number(e)<0){var r=this.texturePool[e];if(r)for(var i=0;i1){for(var u=0;u1&&((c=this.getOptimalFilterTexture(l.width,l.height,r.resolution)).filterFrame=l.filterFrame),i[d].apply(this,l,c,t.CLEAR_MODES.CLEAR,r);var f=l;l=c,c=f}i[d].apply(this,l,u.renderTexture,t.CLEAR_MODES.BLEND,r),d>1&&r.multisample>1&&this.returnFilterTexture(r.renderTexture),this.returnFilterTexture(l),this.returnFilterTexture(c)}r.clear(),this.statePool.push(r)},e.prototype.bindAndClear=function(e,r){void 0===r&&(r=t.CLEAR_MODES.CLEAR);var i=this.renderer,n=i.renderTexture,o=i.state;if(e===this.defaultFilterStack[this.defaultFilterStack.length-1].renderTexture?this.renderer.projection.transform=this.activeState.transform:this.renderer.projection.transform=null,e&&e.filterFrame){var s=this.tempRect;s.x=0,s.y=0,s.width=e.filterFrame.width,s.height=e.filterFrame.height,n.bind(e,e.filterFrame,s)}else e!==this.defaultFilterStack[this.defaultFilterStack.length-1].renderTexture?n.bind(e):this.renderer.renderTexture.bind(e,this.activeState.bindingSourceFrame,this.activeState.bindingDestinationFrame);var a=1&o.stateId||this.forceClear;(r===t.CLEAR_MODES.CLEAR||r===t.CLEAR_MODES.BLIT&&a)&&this.renderer.framebuffer.clear(0,0,0,0)},e.prototype.applyFilter=function(e,r,i,n){var o=this.renderer;o.state.set(e.state),this.bindAndClear(i,n),e.uniforms.uSampler=r,e.uniforms.filterGlobals=this.globalUniforms,o.shader.bind(e),e.legacy=!!e.program.attributeData.aTextureCoord,e.legacy?(this.quadUv.map(r._frame,r.filterFrame),o.geometry.bind(this.quadUv),o.geometry.draw(t.DRAW_MODES.TRIANGLES)):(o.geometry.bind(this.quad),o.geometry.draw(t.DRAW_MODES.TRIANGLE_STRIP))},e.prototype.calculateSpriteMatrix=function(t,e){var r=this.activeState,i=r.sourceFrame,n=r.destinationFrame,o=e._texture.orig,s=t.set(n.width,0,0,n.height,i.x,i.y),a=e.worldTransform.copyTo(wc.TEMP_MATRIX);return a.invert(),s.prepend(a),s.scale(1/o.width,1/o.height),s.translate(e.anchor.x,e.anchor.y),s},e.prototype.destroy=function(){this.renderer=null,this.texturePool.clear(!1)},e.prototype.getOptimalFilterTexture=function(e,r,i,n){return void 0===i&&(i=1),void 0===n&&(n=t.MSAA_QUALITY.NONE),this.texturePool.getOptimalTexture(e,r,i,n)},e.prototype.getFilterTexture=function(e,r,i){if("number"==typeof e){var n=e;e=r,r=n}e=e||this.activeState.renderTexture;var o=this.texturePool.getOptimalTexture(e.width,e.height,r||e.resolution,i||t.MSAA_QUALITY.NONE);return o.filterFrame=e.filterFrame,o},e.prototype.returnFilterTexture=function(t){this.texturePool.returnTexture(t)},e.prototype.emptyPool=function(){this.texturePool.clear(!0)},e.prototype.resize=function(){this.texturePool.setScreenSize(this.renderer.view)},e.prototype.transformAABB=function(t,e){var r=Nd[0],i=Nd[1],n=Nd[2],o=Nd[3];r.set(e.left,e.top),i.set(e.left,e.bottom),n.set(e.right,e.top),o.set(e.right,e.bottom),t.apply(r,r),t.apply(i,i),t.apply(n,n),t.apply(o,o);var s=Math.min(r.x,i.x,n.x,o.x),a=Math.min(r.y,i.y,n.y,o.y),h=Math.max(r.x,i.x,n.x,o.x),u=Math.max(r.y,i.y,n.y,o.y);e.x=s,e.y=a,e.width=h-s,e.height=u-a},e.prototype.roundFrame=function(t,e,r,i,n){if(!(t.width<=0||t.height<=0||r.width<=0||r.height<=0)){if(n){var o=n.a,s=n.b,a=n.c,h=n.d;if((Math.abs(s)>1e-4||Math.abs(a)>1e-4)&&(Math.abs(o)>1e-4||Math.abs(h)>1e-4))return}(n=n?Pd.copyFrom(n):Pd.identity()).translate(-r.x,-r.y).scale(i.width/r.width,i.height/r.height).translate(i.x,i.y),this.transformAABB(n,t),t.ceil(e),this.transformAABB(n.invert(),t)}},e}(),Cd=function(){function t(t){this.renderer=t}return t.prototype.flush=function(){},t.prototype.destroy=function(){this.renderer=null},t.prototype.start=function(){},t.prototype.stop=function(){this.flush()},t.prototype.render=function(t){},t}(),wd=function(){function t(t){this.renderer=t,this.emptyRenderer=new Cd(t),this.currentRenderer=this.emptyRenderer}return t.prototype.setObjectRenderer=function(t){this.currentRenderer!==t&&(this.currentRenderer.stop(),this.currentRenderer=t,this.currentRenderer.start())},t.prototype.flush=function(){this.setObjectRenderer(this.emptyRenderer)},t.prototype.reset=function(){this.setObjectRenderer(this.emptyRenderer)},t.prototype.copyBoundTextures=function(t,e){for(var r=this.renderer.texture.boundTextures,i=e-1;i>=0;--i)t[i]=r[i]||null,t[i]&&(t[i]._batchLocation=i)},t.prototype.boundArray=function(t,e,r,i){for(var n=t.elements,o=t.ids,s=t.count,a=0,h=0;h=0&&l=t.ENV.WEBGL2&&(i=e.getContext("webgl2",r)),i)this.webGLVersion=2;else if(this.webGLVersion=1,!(i=e.getContext("webgl",r)||e.getContext("experimental-webgl",r)))throw new Error("This browser does not support WebGL. Try using the canvas renderer");return this.gl=i,this.getExtensions(),this.gl},e.prototype.getExtensions=function(){var t=this.gl,e={anisotropicFiltering:t.getExtension("EXT_texture_filter_anisotropic"),floatTextureLinear:t.getExtension("OES_texture_float_linear"),s3tc:t.getExtension("WEBGL_compressed_texture_s3tc"),s3tc_sRGB:t.getExtension("WEBGL_compressed_texture_s3tc_srgb"),etc:t.getExtension("WEBGL_compressed_texture_etc"),etc1:t.getExtension("WEBGL_compressed_texture_etc1"),pvrtc:t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"),atc:t.getExtension("WEBGL_compressed_texture_atc"),astc:t.getExtension("WEBGL_compressed_texture_astc")};1===this.webGLVersion?Object.assign(this.extensions,e,{drawBuffers:t.getExtension("WEBGL_draw_buffers"),depthTexture:t.getExtension("WEBGL_depth_texture"),loseContext:t.getExtension("WEBGL_lose_context"),vertexArrayObject:t.getExtension("OES_vertex_array_object")||t.getExtension("MOZ_OES_vertex_array_object")||t.getExtension("WEBKIT_OES_vertex_array_object"),uint32ElementIndex:t.getExtension("OES_element_index_uint"),floatTexture:t.getExtension("OES_texture_float"),floatTextureLinear:t.getExtension("OES_texture_float_linear"),textureHalfFloat:t.getExtension("OES_texture_half_float"),textureHalfFloatLinear:t.getExtension("OES_texture_half_float_linear")}):2===this.webGLVersion&&Object.assign(this.extensions,e,{colorBufferFloat:t.getExtension("EXT_color_buffer_float")})},e.prototype.handleContextLost=function(t){t.preventDefault()},e.prototype.handleContextRestored=function(){this.renderer.runners.contextChange.emit(this.gl)},e.prototype.destroy=function(){var t=this.renderer.view;this.renderer=null,t.removeEventListener("webglcontextlost",this.handleContextLost),t.removeEventListener("webglcontextrestored",this.handleContextRestored),this.gl.useProgram(null),this.extensions.loseContext&&this.extensions.loseContext.loseContext()},e.prototype.postrender=function(){this.renderer.renderingToScreen&&this.gl.flush()},e.prototype.validateContext=function(t){var e=t.getContextAttributes(),r="WebGL2RenderingContext"in globalThis&&t instanceof globalThis.WebGL2RenderingContext;r&&(this.webGLVersion=2),e&&!e.stencil&&console.warn("Provided WebGL context does not have a stencil buffer, masks may not render correctly");var i=r||!!t.getExtension("OES_element_index_uint");this.supports.uint32Indices=i,i||console.warn("Provided WebGL context does not support 32 index buffer, complex graphics may not render correctly")},e}(),Ud=function(e){this.framebuffer=e,this.stencil=null,this.dirtyId=-1,this.dirtyFormat=-1,this.dirtySize=-1,this.multisample=t.MSAA_QUALITY.NONE,this.msaaBuffer=null,this.blitFramebuffer=null,this.mipLevel=0},Bd=new Dc,Gd=function(){function e(t){this.renderer=t,this.managedFramebuffers=[],this.unknownFramebuffer=new ud(10,10),this.msaaSamples=null}return e.prototype.contextChange=function(){var e=this.gl=this.renderer.gl;if(this.CONTEXT_UID=this.renderer.CONTEXT_UID,this.current=this.unknownFramebuffer,this.viewport=new Dc,this.hasMRT=!0,this.writeDepthTexture=!0,this.disposeAll(!0),1===this.renderer.context.webGLVersion){var r=this.renderer.context.extensions.drawBuffers,i=this.renderer.context.extensions.depthTexture;it.PREFER_ENV===t.ENV.WEBGL_LEGACY&&(r=null,i=null),r?e.drawBuffers=function(t){return r.drawBuffersWEBGL(t)}:(this.hasMRT=!1,e.drawBuffers=function(){}),i||(this.writeDepthTexture=!1)}else this.msaaSamples=e.getInternalformatParameter(e.RENDERBUFFER,e.RGBA8,e.SAMPLES)},e.prototype.bind=function(t,e,r){void 0===r&&(r=0);var i=this.gl;if(t){var n=t.glFramebuffers[this.CONTEXT_UID]||this.initFramebuffer(t);this.current!==t&&(this.current=t,i.bindFramebuffer(i.FRAMEBUFFER,n.framebuffer)),n.mipLevel!==r&&(t.dirtyId++,t.dirtyFormat++,n.mipLevel=r),n.dirtyId!==t.dirtyId&&(n.dirtyId=t.dirtyId,n.dirtyFormat!==t.dirtyFormat?(n.dirtyFormat=t.dirtyFormat,n.dirtySize=t.dirtySize,this.updateFramebuffer(t,r)):n.dirtySize!==t.dirtySize&&(n.dirtySize=t.dirtySize,this.resizeFramebuffer(t)));for(var o=0;o>r,h=e.height>>r,u=a/e.width;this.setViewport(e.x*u,e.y*u,a,h)}else a=t.width>>r,h=t.height>>r,this.setViewport(0,0,a,h)}else this.current&&(this.current=null,i.bindFramebuffer(i.FRAMEBUFFER,null)),e?this.setViewport(e.x,e.y,e.width,e.height):this.setViewport(0,0,this.renderer.width,this.renderer.height)},e.prototype.setViewport=function(t,e,r,i){var n=this.viewport;t=Math.round(t),e=Math.round(e),r=Math.round(r),i=Math.round(i),n.width===r&&n.height===i&&n.x===t&&n.y===e||(n.x=t,n.y=e,n.width=r,n.height=i,this.gl.viewport(t,e,r,i))},Object.defineProperty(e.prototype,"size",{get:function(){return this.current?{x:0,y:0,width:this.current.width,height:this.current.height}:{x:0,y:0,width:this.renderer.width,height:this.renderer.height}},enumerable:!1,configurable:!0}),e.prototype.clear=function(e,r,i,n,o){void 0===o&&(o=t.BUFFER_BITS.COLOR|t.BUFFER_BITS.DEPTH);var s=this.gl;s.clearColor(e,r,i,n),s.clear(o)},e.prototype.initFramebuffer=function(t){var e=this.gl,r=new Ud(e.createFramebuffer());return r.multisample=this.detectSamples(t.multisample),t.glFramebuffers[this.CONTEXT_UID]=r,this.managedFramebuffers.push(t),t.disposeRunner.add(this),r},e.prototype.resizeFramebuffer=function(t){var e=this.gl,r=t.glFramebuffers[this.CONTEXT_UID];r.msaaBuffer&&(e.bindRenderbuffer(e.RENDERBUFFER,r.msaaBuffer),e.renderbufferStorageMultisample(e.RENDERBUFFER,r.multisample,e.RGBA8,t.width,t.height)),r.stencil&&(e.bindRenderbuffer(e.RENDERBUFFER,r.stencil),r.msaaBuffer?e.renderbufferStorageMultisample(e.RENDERBUFFER,r.multisample,e.DEPTH24_STENCIL8,t.width,t.height):e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,t.width,t.height));var i=t.colorTextures,n=i.length;e.drawBuffers||(n=Math.min(n,1));for(var o=0;o1&&this.canMultisampleFramebuffer(t)?(i.msaaBuffer=i.msaaBuffer||r.createRenderbuffer(),r.bindRenderbuffer(r.RENDERBUFFER,i.msaaBuffer),r.renderbufferStorageMultisample(r.RENDERBUFFER,i.multisample,r.RGBA8,t.width,t.height),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.RENDERBUFFER,i.msaaBuffer)):i.msaaBuffer&&(r.deleteRenderbuffer(i.msaaBuffer),i.msaaBuffer=null,i.blitFramebuffer&&(i.blitFramebuffer.dispose(),i.blitFramebuffer=null));for(var s=[],a=0;a1&&r.drawBuffers(s),t.depthTexture&&this.writeDepthTexture){var l=t.depthTexture;this.renderer.texture.bind(l,0),r.framebufferTexture2D(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.TEXTURE_2D,l._glTextures[this.CONTEXT_UID].texture,e)}!t.stencil&&!t.depth||t.depthTexture&&this.writeDepthTexture?i.stencil&&(r.deleteRenderbuffer(i.stencil),i.stencil=null):(i.stencil=i.stencil||r.createRenderbuffer(),r.bindRenderbuffer(r.RENDERBUFFER,i.stencil),i.msaaBuffer?r.renderbufferStorageMultisample(r.RENDERBUFFER,i.multisample,r.DEPTH24_STENCIL8,t.width,t.height):r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,t.width,t.height),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,i.stencil))},e.prototype.canMultisampleFramebuffer=function(t){return 1!==this.renderer.context.webGLVersion&&t.colorTextures.length<=1&&!t.depthTexture},e.prototype.detectSamples=function(e){var r=this.msaaSamples,i=t.MSAA_QUALITY.NONE;if(e<=1||null===r)return i;for(var n=0;n=0&&this.managedFramebuffers.splice(n,1),t.disposeRunner.remove(this),e||(i.deleteFramebuffer(r.framebuffer),r.msaaBuffer&&i.deleteRenderbuffer(r.msaaBuffer),r.stencil&&i.deleteRenderbuffer(r.stencil)),r.blitFramebuffer&&r.blitFramebuffer.dispose()}},e.prototype.disposeAll=function(t){var e=this.managedFramebuffers;this.managedFramebuffers=[];for(var r=0;r0&&(e+="\nelse "),r=t.ENV.WEBGL2&&(r=e.getContext("webgl2",{})),r||((r=e.getContext("webgl",{})||e.getContext("experimental-webgl",{}))?r.getExtension("WEBGL_draw_buffers"):r=null),Kd=r}return Kd}();if(e&&e.getShaderPrecisionFormat){var r=e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT);zd=r.precision?t.PRECISION.HIGH:t.PRECISION.MEDIUM}}return zd}())),this.glPrograms={},this.syncUniforms=null}return Object.defineProperty(e,"defaultVertexSrc",{get:function(){return"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}\n"},enumerable:!1,configurable:!0}),Object.defineProperty(e,"defaultFragmentSrc",{get:function(){return"varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\n\nvoid main(void){\n gl_FragColor *= texture2D(uSampler, vTextureCoord);\n}"},enumerable:!1,configurable:!0}),e.from=function(t,r,i){var n=t+r,o=gc[n];return o||(gc[n]=o=new e(t,r,i)),o},e}(),df=function(){function t(t,e){this.uniformBindCount=0,this.program=t,this.uniformGroup=e?e instanceof Id?e:new Id(e):new Id({})}return t.prototype.checkUniformExists=function(t,e){if(e.uniforms[t])return!0;for(var r in e.uniforms){var i=e.uniforms[r];if(i.group&&this.checkUniformExists(t,i))return!0}return!1},t.prototype.destroy=function(){this.uniformGroup=null},Object.defineProperty(t.prototype,"uniforms",{get:function(){return this.uniformGroup.uniforms},enumerable:!1,configurable:!0}),t.from=function(e,r,i){return new t(cf.from(e,r),i)},t}(),ff=function(){function e(){this.data=0,this.blendMode=t.BLEND_MODES.NORMAL,this.polygonOffset=0,this.blend=!0,this.depthMask=!0}return Object.defineProperty(e.prototype,"blend",{get:function(){return!!(1&this.data)},set:function(t){!!(1&this.data)!==t&&(this.data^=1)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"offsets",{get:function(){return!!(2&this.data)},set:function(t){!!(2&this.data)!==t&&(this.data^=2)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"culling",{get:function(){return!!(4&this.data)},set:function(t){!!(4&this.data)!==t&&(this.data^=4)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"depthTest",{get:function(){return!!(8&this.data)},set:function(t){!!(8&this.data)!==t&&(this.data^=8)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"depthMask",{get:function(){return!!(32&this.data)},set:function(t){!!(32&this.data)!==t&&(this.data^=32)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"clockwiseFrontFace",{get:function(){return!!(16&this.data)},set:function(t){!!(16&this.data)!==t&&(this.data^=16)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"blendMode",{get:function(){return this._blendMode},set:function(e){this.blend=e!==t.BLEND_MODES.NONE,this._blendMode=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"polygonOffset",{get:function(){return this._polygonOffset},set:function(t){this.offsets=!!t,this._polygonOffset=t},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return"[@pixi/core:State blendMode="+this.blendMode+" clockwiseFrontFace="+this.clockwiseFrontFace+" culling="+this.culling+" depthMask="+this.depthMask+" polygonOffset="+this.polygonOffset+"]"},e.for2d=function(){var t=new e;return t.depthTest=!1,t.blend=!0,t},e}(),pf=function(t){function e(r,i,n){var o=this,s=cf.from(r||e.defaultVertexSrc,i||e.defaultFragmentSrc);return(o=t.call(this,s,n)||this).padding=0,o.resolution=it.FILTER_RESOLUTION,o.multisample=it.FILTER_MULTISAMPLE,o.enabled=!0,o.autoFit=!0,o.state=new ff,o}return Wc(e,t),e.prototype.apply=function(t,e,r,i,n){t.applyFilter(this,e,r,i)},Object.defineProperty(e.prototype,"blendMode",{get:function(){return this.state.blendMode},set:function(t){this.state.blendMode=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"resolution",{get:function(){return this._resolution},set:function(t){this._resolution=t},enumerable:!1,configurable:!0}),Object.defineProperty(e,"defaultVertexSrc",{get:function(){return"attribute vec2 aVertexPosition;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nuniform vec4 inputSize;\nuniform vec4 outputFrame;\n\nvec4 filterVertexPosition( void )\n{\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\n\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord( void )\n{\n return aVertexPosition * (outputFrame.zw * inputSize.zw);\n}\n\nvoid main(void)\n{\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n"},enumerable:!1,configurable:!0}),Object.defineProperty(e,"defaultFragmentSrc",{get:function(){return"varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\n\nvoid main(void){\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n}\n"},enumerable:!1,configurable:!0}),e}(df),_f=new wc,mf=function(){function t(t,e){this._texture=t,this.mapCoord=new wc,this.uClampFrame=new Float32Array(4),this.uClampOffset=new Float32Array(2),this._textureID=-1,this._updateID=0,this.clampOffset=0,this.clampMargin=void 0===e?.5:e,this.isSimple=!1}return Object.defineProperty(t.prototype,"texture",{get:function(){return this._texture},set:function(t){this._texture=t,this._textureID=-1},enumerable:!1,configurable:!0}),t.prototype.multiplyUvs=function(t,e){void 0===e&&(e=t);for(var r=this.mapCoord,i=0;i1e-4||Math.abs(i)>1e-4)&&(Math.abs(e)>1e-4||Math.abs(n)>1e-4)},e.prototype.testScissor=function(t){var r=t.maskObject;if(!r.isFastRect||!r.isFastRect())return!1;if(e.isMatrixRotated(r.worldTransform))return!1;if(e.isMatrixRotated(this.renderer.projection.transform))return!1;this.calcScissorRect(t);var i=t._scissorRectLocal;return i.width>0&&i.height>0},e.prototype.roundFrameToPixels=function(t,r,i,n,o){e.isMatrixRotated(o)||((o=o?gf.copyFrom(o):gf.identity()).translate(-i.x,-i.y).scale(n.width/i.width,n.height/i.height).translate(n.x,n.y),this.renderer.filter.transformAABB(o,t),t.fit(n),t.x=Math.round(t.x*r),t.y=Math.round(t.y*r),t.width=Math.round(t.width*r),t.height=Math.round(t.height*r))},e.prototype.push=function(t){t._scissorRectLocal||this.calcScissorRect(t);var e=this.renderer.gl;t._scissorRect||e.enable(e.SCISSOR_TEST),t._scissorCounter++,t._scissorRect=t._scissorRectLocal,this._useCurrent()},e.prototype.pop=function(){var t=this.renderer.gl;this.getStackLength()>0?this._useCurrent():t.disable(t.SCISSOR_TEST)},e.prototype._useCurrent=function(){var t,e=this.maskStack[this.maskStack.length-1]._scissorRect;t=this.renderer.renderTexture.current?e.y:this.renderer.height-e.height-e.y,this.renderer.gl.scissor(e.x,t,e.width,e.height)},e}(yf),bf=function(t){function e(e){var r=t.call(this,e)||this;return r.glConst=WebGLRenderingContext.STENCIL_TEST,r}return Wc(e,t),e.prototype.getStackLength=function(){var t=this.maskStack[this.maskStack.length-1];return t?t._stencilCounter:0},e.prototype.push=function(t){var e=t.maskObject,r=this.renderer.gl,i=t._stencilCounter;0===i&&(this.renderer.framebuffer.forceStencil(),r.clearStencil(0),r.clear(r.STENCIL_BUFFER_BIT),r.enable(r.STENCIL_TEST)),t._stencilCounter++,r.colorMask(!1,!1,!1,!1),r.stencilFunc(r.EQUAL,i,4294967295),r.stencilOp(r.KEEP,r.KEEP,r.INCR),e.renderable=!0,e.render(this.renderer),this.renderer.batch.flush(),e.renderable=!1,this._useCurrent()},e.prototype.pop=function(t){var e=this.renderer.gl;0===this.getStackLength()?e.disable(e.STENCIL_TEST):(e.colorMask(!1,!1,!1,!1),e.stencilOp(e.KEEP,e.KEEP,e.DECR),t.renderable=!0,t.render(this.renderer),this.renderer.batch.flush(),t.renderable=!1,this._useCurrent())},e.prototype._useCurrent=function(){var t=this.renderer.gl;t.colorMask(!0,!0,!0,!0),t.stencilFunc(t.EQUAL,this.getStackLength(),4294967295),t.stencilOp(t.KEEP,t.KEEP,t.KEEP)},e}(yf),xf=function(){function t(t){this.renderer=t,this.destinationFrame=null,this.sourceFrame=null,this.defaultFrame=null,this.projectionMatrix=new wc,this.transform=null}return t.prototype.update=function(t,e,r,i){this.destinationFrame=t||this.destinationFrame||this.defaultFrame,this.sourceFrame=e||this.sourceFrame||t,this.calculateProjection(this.destinationFrame,this.sourceFrame,r,i),this.transform&&this.projectionMatrix.append(this.transform);var n=this.renderer;n.globalUniforms.uniforms.projectionMatrix=this.projectionMatrix,n.globalUniforms.update(),n.shader.shader&&n.shader.syncUniformGroup(n.shader.shader.uniforms.globals)},t.prototype.calculateProjection=function(t,e,r,i){var n=this.projectionMatrix,o=i?-1:1;n.identity(),n.a=1/e.width*2,n.d=o*(1/e.height*2),n.tx=-1-e.x*n.a,n.ty=-o-e.y*n.d},t.prototype.setTransform=function(t){},t.prototype.destroy=function(){this.renderer=null},t}(),Rf=new Dc,Af=new Dc,Sf=function(){function t(t){this.renderer=t,this.clearColor=t._backgroundColorRgba,this.defaultMaskStack=[],this.current=null,this.sourceFrame=new Dc,this.destinationFrame=new Dc,this.viewportFrame=new Dc}return t.prototype.bind=function(t,e,r){void 0===t&&(t=null);var i,n,o,s=this.renderer;this.current=t,t?(o=(i=t.baseTexture).resolution,e||(Rf.width=t.frame.width,Rf.height=t.frame.height,e=Rf),r||(Af.x=t.frame.x,Af.y=t.frame.y,Af.width=e.width,Af.height=e.height,r=Af),n=i.framebuffer):(o=s.resolution,e||(Rf.width=s.screen.width,Rf.height=s.screen.height,e=Rf),r||((r=Rf).width=e.width,r.height=e.height));var a=this.viewportFrame;a.x=r.x*o,a.y=r.y*o,a.width=r.width*o,a.height=r.height*o,t||(a.y=s.view.height-(a.y+a.height)),a.ceil(),this.renderer.framebuffer.bind(n,a),this.renderer.projection.update(r,e,o,!n),t?this.renderer.mask.setMaskStack(i.maskStack):this.renderer.mask.setMaskStack(this.defaultMaskStack),this.sourceFrame.copyFrom(e),this.destinationFrame.copyFrom(r)},t.prototype.clear=function(t,e){t=this.current?t||this.current.baseTexture.clearColor:t||this.clearColor;var r=this.destinationFrame,i=this.current?this.current.baseTexture:this.renderer.screen,n=r.width!==i.width||r.height!==i.height;if(n){var o=this.viewportFrame,s=o.x,a=o.y,h=o.width,u=o.height;s=Math.round(s),a=Math.round(a),h=Math.round(h),u=Math.round(u),this.renderer.gl.enable(this.renderer.gl.SCISSOR_TEST),this.renderer.gl.scissor(s,a,h,u)}this.renderer.framebuffer.clear(t[0],t[1],t[2],t[3],e),n&&this.renderer.scissor.pop()},t.prototype.resize=function(){this.bind(null)},t.prototype.reset=function(){this.bind(null)},t.prototype.destroy=function(){this.renderer=null},t}();function Of(t,e,r,i,n){r.buffer.update(n)}var If={float:"\n data[offset] = v;\n ",vec2:"\n data[offset] = v[0];\n data[offset+1] = v[1];\n ",vec3:"\n data[offset] = v[0];\n data[offset+1] = v[1];\n data[offset+2] = v[2];\n\n ",vec4:"\n data[offset] = v[0];\n data[offset+1] = v[1];\n data[offset+2] = v[2];\n data[offset+3] = v[3];\n ",mat2:"\n data[offset] = v[0];\n data[offset+1] = v[1];\n\n data[offset+4] = v[2];\n data[offset+5] = v[3];\n ",mat3:"\n data[offset] = v[0];\n data[offset+1] = v[1];\n data[offset+2] = v[2];\n\n data[offset + 4] = v[3];\n data[offset + 5] = v[4];\n data[offset + 6] = v[5];\n\n data[offset + 8] = v[6];\n data[offset + 9] = v[7];\n data[offset + 10] = v[8];\n ",mat4:"\n for(var i = 0; i < 16; i++)\n {\n data[offset + i] = v[i];\n }\n "},Mf={float:4,vec2:8,vec3:12,vec4:16,int:4,ivec2:8,ivec3:12,ivec4:16,uint:4,uvec2:8,uvec3:12,uvec4:16,bool:4,bvec2:8,bvec3:12,bvec4:16,mat2:32,mat3:48,mat4:64};var Nf=function(){function t(t,e){this.program=t,this.uniformData=e,this.uniformGroups={},this.uniformDirtyGroups={},this.uniformBufferBindings={}}return t.prototype.destroy=function(){this.uniformData=null,this.uniformGroups=null,this.uniformDirtyGroups=null,this.uniformBufferBindings=null,this.program=null},t}();var Pf=0,Df={textureCount:0,uboCount:0},Cf=function(){function t(t){this.destroyed=!1,this.renderer=t,this.systemCheck(),this.gl=null,this.shader=null,this.program=null,this.cache={},this._uboCache={},this.id=Pf++}return t.prototype.systemCheck=function(){if(!function(){if("boolean"==typeof rf)return rf;try{var t=new Function("param1","param2","param3","return param1[param2] === param3;");rf=!0===t({a:"b"},"a","b")}catch(t){rf=!1}return rf}())throw new Error("Current environment does not allow unsafe-eval, please use @pixi/unsafe-eval module to enable support.")},t.prototype.contextChange=function(t){this.gl=t,this.reset()},t.prototype.bind=function(t,e){t.uniforms.globals=this.renderer.globalUniforms;var r=t.program,i=r.glPrograms[this.renderer.CONTEXT_UID]||this.generateProgram(t);return this.shader=t,this.program!==r&&(this.program=r,this.gl.useProgram(i.program)),e||(Df.textureCount=0,Df.uboCount=0,this.syncUniformGroup(t.uniformGroup,Df)),i},t.prototype.setUniforms=function(t){var e=this.shader.program,r=e.glPrograms[this.renderer.CONTEXT_UID];e.syncUniforms(r.uniformData,t,this.renderer)},t.prototype.syncUniformGroup=function(t,e){var r=this.getGlProgram();t.static&&t.dirtyId===r.uniformDirtyGroups[t.id]||(r.uniformDirtyGroups[t.id]=t.dirtyId,this.syncUniforms(t,r,e))},t.prototype.syncUniforms=function(t,e,r){(t.syncUniforms[this.shader.program.id]||this.createSyncGroups(t))(e.uniformData,t.uniforms,this.renderer,r)},t.prototype.createSyncGroups=function(t){var e=this.getSignature(t,this.shader.program.uniformData,"u");return this.cache[e]||(this.cache[e]=function(t,e){var r,i=["\n var v = null;\n var cv = null;\n var cu = null;\n var t = 0;\n var gl = renderer.gl;\n "];for(var n in t.uniforms){var o=e[n];if(o){for(var s=t.uniforms[n],a=!1,h=0;h1&&(r=Math.max(r,16)*s.data.size),s.dataLen=r,i%r!=0&&i<16){var a=i%r%16;i+=a,n+=a}i+r>16?(n=16*Math.ceil(n/16),s.offset=n,n+=r,i=r):(s.offset=n,i+=r,n+=r)}return{uboElements:e,size:n=16*Math.ceil(n/16)}}(r),n=i.uboElements,o=i.size,s=["\n var v = null;\n var v2 = null;\n var cv = null;\n var t = 0;\n var gl = renderer.gl\n var index = 0;\n var data = buffer.data;\n "],a=0;a1){var p=Jd(h.data.type),_=Math.max(Mf[h.data.type]/16,1),m=p/_,v=(4-m%4)%4;s.push("\n cv = ud."+l+".value;\n v = uv."+l+";\n offset = "+h.offset/4+";\n\n t = 0;\n\n for(var i=0; i < "+h.data.size*_+"; i++)\n {\n for(var j = 0; j < "+m+"; j++)\n {\n data[offset++] = v[t++];\n }\n offset += "+v+";\n }\n\n ")}else{var E=If[h.data.type];s.push("\n cv = ud."+l+".value;\n v = uv."+l+";\n offset = "+h.offset/4+";\n "+E+";\n ")}}return s.push("\n renderer.buffer.update(buffer);\n "),{size:o,syncFunc:new Function("ud","uv","renderer","syncData","buffer",s.join("\n"))}}(t,this.shader.program.uniformData)),t.autoManage){var a=new Float32Array(s.size/4);t.buffer.update(a)}return e.uniformGroups[t.id]=s.syncFunc,e.uniformGroups[t.id]},t.prototype.getSignature=function(t,e,r){var i=t.uniforms,n=[r+"-"];for(var o in i)n.push(o),e[o]&&n.push(e[o].type);return n.join("-")},t.prototype.getGlProgram=function(){return this.shader?this.shader.program.glPrograms[this.renderer.CONTEXT_UID]:null},t.prototype.generateProgram=function(t){var e=this.gl,r=t.program,i=function(t,e){var r=Yd(t,t.VERTEX_SHADER,e.vertexSrc),i=Yd(t,t.FRAGMENT_SHADER,e.fragmentSrc),n=t.createProgram();if(t.attachShader(n,r),t.attachShader(n,i),t.linkProgram(n),t.getProgramParameter(n,t.LINK_STATUS)||function(t,e,r,i){t.getProgramParameter(e,t.LINK_STATUS)||(t.getShaderParameter(r,t.COMPILE_STATUS)||jd(t,r),t.getShaderParameter(i,t.COMPILE_STATUS)||jd(t,i),console.error("PixiJS Error: Could not initialize shader."),""!==t.getProgramInfoLog(e)&&console.warn("PixiJS Warning: gl.getProgramInfoLog()",t.getProgramInfoLog(e)))}(t,n,r,i),e.attributeData=function(t,e){for(var r={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES),n=0;ne?1:-1}));for(var s=0;s>=1,r++;this.stateId=t.data}for(r=0;rthis.checkCountMax&&(this.checkCount=0,this.run())))},e.prototype.run=function(){for(var t=this.renderer.texture,e=t.managedTextures,r=!1,i=0;ithis.maxIdle&&(t.destroyTexture(n,!0),e[i]=null,r=!0)}if(r){var o=0;for(i=0;i=0;i--)this.unload(t.children[i])},e.prototype.destroy=function(){this.renderer=null},e}(),Ff=function(e){this.texture=e,this.width=-1,this.height=-1,this.dirtyId=-1,this.dirtyStyleId=-1,this.mipmap=!1,this.wrapMode=33071,this.type=t.TYPES.UNSIGNED_BYTE,this.internalFormat=t.FORMATS.RGBA,this.samplerType=0},Uf=function(){function e(t){this.renderer=t,this.boundTextures=[],this.currentLocation=-1,this.managedTextures=[],this._unknownBoundTextures=!1,this.unknownTexture=new Qc,this.hasIntegerTextures=!1}return e.prototype.contextChange=function(){var e=this.gl=this.renderer.gl;this.CONTEXT_UID=this.renderer.CONTEXT_UID,this.webGLVersion=this.renderer.context.webGLVersion,this.internalFormats=function(e){var r,i,n,o,s,a,h,u,l,c,d,f,p,_,m,v,E,y,g,T,b,x,R;return"WebGL2RenderingContext"in globalThis&&e instanceof globalThis.WebGL2RenderingContext?((r={})[t.TYPES.UNSIGNED_BYTE]=((i={})[t.FORMATS.RGBA]=e.RGBA8,i[t.FORMATS.RGB]=e.RGB8,i[t.FORMATS.RG]=e.RG8,i[t.FORMATS.RED]=e.R8,i[t.FORMATS.RGBA_INTEGER]=e.RGBA8UI,i[t.FORMATS.RGB_INTEGER]=e.RGB8UI,i[t.FORMATS.RG_INTEGER]=e.RG8UI,i[t.FORMATS.RED_INTEGER]=e.R8UI,i[t.FORMATS.ALPHA]=e.ALPHA,i[t.FORMATS.LUMINANCE]=e.LUMINANCE,i[t.FORMATS.LUMINANCE_ALPHA]=e.LUMINANCE_ALPHA,i),r[t.TYPES.BYTE]=((n={})[t.FORMATS.RGBA]=e.RGBA8_SNORM,n[t.FORMATS.RGB]=e.RGB8_SNORM,n[t.FORMATS.RG]=e.RG8_SNORM,n[t.FORMATS.RED]=e.R8_SNORM,n[t.FORMATS.RGBA_INTEGER]=e.RGBA8I,n[t.FORMATS.RGB_INTEGER]=e.RGB8I,n[t.FORMATS.RG_INTEGER]=e.RG8I,n[t.FORMATS.RED_INTEGER]=e.R8I,n),r[t.TYPES.UNSIGNED_SHORT]=((o={})[t.FORMATS.RGBA_INTEGER]=e.RGBA16UI,o[t.FORMATS.RGB_INTEGER]=e.RGB16UI,o[t.FORMATS.RG_INTEGER]=e.RG16UI,o[t.FORMATS.RED_INTEGER]=e.R16UI,o[t.FORMATS.DEPTH_COMPONENT]=e.DEPTH_COMPONENT16,o),r[t.TYPES.SHORT]=((s={})[t.FORMATS.RGBA_INTEGER]=e.RGBA16I,s[t.FORMATS.RGB_INTEGER]=e.RGB16I,s[t.FORMATS.RG_INTEGER]=e.RG16I,s[t.FORMATS.RED_INTEGER]=e.R16I,s),r[t.TYPES.UNSIGNED_INT]=((a={})[t.FORMATS.RGBA_INTEGER]=e.RGBA32UI,a[t.FORMATS.RGB_INTEGER]=e.RGB32UI,a[t.FORMATS.RG_INTEGER]=e.RG32UI,a[t.FORMATS.RED_INTEGER]=e.R32UI,a[t.FORMATS.DEPTH_COMPONENT]=e.DEPTH_COMPONENT24,a),r[t.TYPES.INT]=((h={})[t.FORMATS.RGBA_INTEGER]=e.RGBA32I,h[t.FORMATS.RGB_INTEGER]=e.RGB32I,h[t.FORMATS.RG_INTEGER]=e.RG32I,h[t.FORMATS.RED_INTEGER]=e.R32I,h),r[t.TYPES.FLOAT]=((u={})[t.FORMATS.RGBA]=e.RGBA32F,u[t.FORMATS.RGB]=e.RGB32F,u[t.FORMATS.RG]=e.RG32F,u[t.FORMATS.RED]=e.R32F,u[t.FORMATS.DEPTH_COMPONENT]=e.DEPTH_COMPONENT32F,u),r[t.TYPES.HALF_FLOAT]=((l={})[t.FORMATS.RGBA]=e.RGBA16F,l[t.FORMATS.RGB]=e.RGB16F,l[t.FORMATS.RG]=e.RG16F,l[t.FORMATS.RED]=e.R16F,l),r[t.TYPES.UNSIGNED_SHORT_5_6_5]=((c={})[t.FORMATS.RGB]=e.RGB565,c),r[t.TYPES.UNSIGNED_SHORT_4_4_4_4]=((d={})[t.FORMATS.RGBA]=e.RGBA4,d),r[t.TYPES.UNSIGNED_SHORT_5_5_5_1]=((f={})[t.FORMATS.RGBA]=e.RGB5_A1,f),r[t.TYPES.UNSIGNED_INT_2_10_10_10_REV]=((p={})[t.FORMATS.RGBA]=e.RGB10_A2,p[t.FORMATS.RGBA_INTEGER]=e.RGB10_A2UI,p),r[t.TYPES.UNSIGNED_INT_10F_11F_11F_REV]=((_={})[t.FORMATS.RGB]=e.R11F_G11F_B10F,_),r[t.TYPES.UNSIGNED_INT_5_9_9_9_REV]=((m={})[t.FORMATS.RGB]=e.RGB9_E5,m),r[t.TYPES.UNSIGNED_INT_24_8]=((v={})[t.FORMATS.DEPTH_STENCIL]=e.DEPTH24_STENCIL8,v),r[t.TYPES.FLOAT_32_UNSIGNED_INT_24_8_REV]=((E={})[t.FORMATS.DEPTH_STENCIL]=e.DEPTH32F_STENCIL8,E),R=r):((y={})[t.TYPES.UNSIGNED_BYTE]=((g={})[t.FORMATS.RGBA]=e.RGBA,g[t.FORMATS.RGB]=e.RGB,g[t.FORMATS.ALPHA]=e.ALPHA,g[t.FORMATS.LUMINANCE]=e.LUMINANCE,g[t.FORMATS.LUMINANCE_ALPHA]=e.LUMINANCE_ALPHA,g),y[t.TYPES.UNSIGNED_SHORT_5_6_5]=((T={})[t.FORMATS.RGB]=e.RGB,T),y[t.TYPES.UNSIGNED_SHORT_4_4_4_4]=((b={})[t.FORMATS.RGBA]=e.RGBA,b),y[t.TYPES.UNSIGNED_SHORT_5_5_5_1]=((x={})[t.FORMATS.RGBA]=e.RGBA,x),R=y),R}(e);var r=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS);this.boundTextures.length=r;for(var i=0;i=0;--s){var a=i[s];a&&a._glTextures[o].samplerType!==t.SAMPLER_TYPES.FLOAT&&this.renderer.texture.unbind(a)}},e.prototype.initTexture=function(t){var e=new Ff(this.gl.createTexture());return e.dirtyId=-1,t._glTextures[this.CONTEXT_UID]=e,this.managedTextures.push(t),t.on("dispose",this.destroyTexture,this),e},e.prototype.initTextureType=function(e,r){var i,n;r.internalFormat=null!==(n=null===(i=this.internalFormats[e.type])||void 0===i?void 0:i[e.format])&&void 0!==n?n:e.format,2===this.webGLVersion&&e.type===t.TYPES.HALF_FLOAT?r.type=this.gl.HALF_FLOAT:r.type=e.type},e.prototype.updateTexture=function(e){var r=e._glTextures[this.CONTEXT_UID];if(r){var i=this.renderer;if(this.initTextureType(e,r),e.resource&&e.resource.upload(i,e,r))r.samplerType!==t.SAMPLER_TYPES.FLOAT&&(this.hasIntegerTextures=!0);else{var n=e.realWidth,o=e.realHeight,s=i.gl;(r.width!==n||r.height!==o||r.dirtyId<0)&&(r.width=n,r.height=o,s.texImage2D(e.target,0,r.internalFormat,n,o,0,e.format,r.type,null))}e.dirtyStyleId!==r.dirtyStyleId&&this.updateTextureStyle(e),r.dirtyId=e.dirtyId}},e.prototype.destroyTexture=function(t,e){var r=this.gl;if((t=t.castToBaseTexture())._glTextures[this.CONTEXT_UID]&&(this.unbind(t),r.deleteTexture(t._glTextures[this.CONTEXT_UID].texture),t.off("dispose",this.destroyTexture,this),delete t._glTextures[this.CONTEXT_UID],!e)){var i=this.managedTextures.indexOf(t);-1!==i&&function(t,e,r){var i,n=t.length;if(!(e>=n||0===r)){var o=n-(r=e+r>n?n-e:r);for(i=e;i=1:r.mipmap=!1,2===this.webGLVersion||e.isPowerOfTwo?r.wrapMode=e.wrapMode:r.wrapMode=t.WRAP_MODES.CLAMP,e.resource&&e.resource.style(this.renderer,e,r)||this.setStyle(e,r),r.dirtyStyleId=e.dirtyStyleId)},e.prototype.setStyle=function(e,r){var i=this.gl;if(r.mipmap&&e.mipmap!==t.MIPMAP_MODES.ON_MANUAL&&i.generateMipmap(e.target),i.texParameteri(e.target,i.TEXTURE_WRAP_S,r.wrapMode),i.texParameteri(e.target,i.TEXTURE_WRAP_T,r.wrapMode),r.mipmap){i.texParameteri(e.target,i.TEXTURE_MIN_FILTER,e.scaleMode===t.SCALE_MODES.LINEAR?i.LINEAR_MIPMAP_LINEAR:i.NEAREST_MIPMAP_NEAREST);var n=this.renderer.context.extensions.anisotropicFiltering;if(n&&e.anisotropicLevel>0&&e.scaleMode===t.SCALE_MODES.LINEAR){var o=Math.min(e.anisotropicLevel,i.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT));i.texParameterf(e.target,n.TEXTURE_MAX_ANISOTROPY_EXT,o)}}else i.texParameteri(e.target,i.TEXTURE_MIN_FILTER,e.scaleMode===t.SCALE_MODES.LINEAR?i.LINEAR:i.NEAREST);i.texParameteri(e.target,i.TEXTURE_MAG_FILTER,e.scaleMode===t.SCALE_MODES.LINEAR?i.LINEAR:i.NEAREST)},e.prototype.destroy=function(){this.renderer=null},e}(),Bf={__proto__:null,FilterSystem:Dd,BatchSystem:wd,ContextSystem:Fd,FramebufferSystem:Gd,GeometrySystem:kd,MaskSystem:Ef,ScissorSystem:Tf,StencilSystem:bf,ProjectionSystem:xf,RenderTextureSystem:Sf,ShaderSystem:Cf,StateSystem:wf,TextureGCSystem:Lf,TextureSystem:Uf},Gf=new wc,Xf=function(e){function r(r,i){void 0===r&&(r=t.RENDERER_TYPE.UNKNOWN);var n=e.call(this)||this;return i=Object.assign({},it.RENDER_OPTIONS,i),n.options=i,n.type=r,n.screen=new Dc(0,0,i.width,i.height),n.view=i.view||document.createElement("canvas"),n.resolution=i.resolution||it.RESOLUTION,n.useContextAlpha=i.useContextAlpha,n.autoDensity=!!i.autoDensity,n.preserveDrawingBuffer=i.preserveDrawingBuffer,n.clearBeforeRender=i.clearBeforeRender,n._backgroundColor=0,n._backgroundColorRgba=[0,0,0,1],n._backgroundColorString="#000000",n.backgroundColor=i.backgroundColor||n._backgroundColor,n.backgroundAlpha=i.backgroundAlpha,void 0!==i.transparent&&(Ec("6.0.0","Option transparent is deprecated, please use backgroundAlpha instead."),n.useContextAlpha=i.transparent,n.backgroundAlpha=i.transparent?0:1),n._lastObjectRendered=null,n.plugins={},n}return Wc(r,e),r.prototype.initPlugins=function(t){for(var e in t)this.plugins[e]=new t[e](this)},Object.defineProperty(r.prototype,"width",{get:function(){return this.view.width},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"height",{get:function(){return this.view.height},enumerable:!1,configurable:!0}),r.prototype.resize=function(t,e){this.view.width=Math.round(t*this.resolution),this.view.height=Math.round(e*this.resolution);var r=this.view.width/this.resolution,i=this.view.height/this.resolution;this.screen.width=r,this.screen.height=i,this.autoDensity&&(this.view.style.width=r+"px",this.view.style.height=i+"px"),this.emit("resize",r,i)},r.prototype.generateTexture=function(t,e,r,i){void 0===e&&(e={}),"number"==typeof e&&(Ec("6.1.0","generateTexture options (scaleMode, resolution, region) are now object options."),e={scaleMode:e,resolution:r,region:i});var n=e.region,o=function(t,e){var r={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.indexOf(i)<0&&(r[i]=t[i]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(i=Object.getOwnPropertySymbols(t);n>16&255)/255,e[1]=(t>>8&255)/255,e[2]=(255&t)/255}(t,this._backgroundColorRgba)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"backgroundAlpha",{get:function(){return this._backgroundColorRgba[3]},set:function(t){this._backgroundColorRgba[3]=t},enumerable:!1,configurable:!0}),r}(Fl),kf=function(t){this.buffer=t||null,this.updateID=-1,this.byteLength=-1,this.refCount=0},Hf=function(){function t(t){this.renderer=t,this.managedBuffers={},this.boundBufferBases={}}return t.prototype.destroy=function(){this.renderer=null},t.prototype.contextChange=function(){this.disposeAll(!0),this.gl=this.renderer.gl,this.CONTEXT_UID=this.renderer.CONTEXT_UID},t.prototype.bind=function(t){var e=this.gl,r=this.CONTEXT_UID,i=t._glBuffers[r]||this.createGLBuffer(t);e.bindBuffer(t.type,i.buffer)},t.prototype.bindBufferBase=function(t,e){var r=this.gl,i=this.CONTEXT_UID;if(this.boundBufferBases[e]!==t){var n=t._glBuffers[i]||this.createGLBuffer(t);this.boundBufferBases[e]=t,r.bindBufferBase(r.UNIFORM_BUFFER,e,n.buffer)}},t.prototype.bindBufferRange=function(t,e,r){var i=this.gl,n=this.CONTEXT_UID;r=r||0;var o=t._glBuffers[n]||this.createGLBuffer(t);i.bindBufferRange(i.UNIFORM_BUFFER,e||0,o.buffer,256*r,256)},t.prototype.update=function(t){var e=this.gl,r=this.CONTEXT_UID,i=t._glBuffers[r];if(t._updateID!==i.updateID)if(i.updateID=t._updateID,e.bindBuffer(t.type,i.buffer),i.byteLength>=t.data.byteLength)e.bufferSubData(t.type,0,t.data);else{var n=t.static?e.STATIC_DRAW:e.DYNAMIC_DRAW;i.byteLength=t.data.byteLength,e.bufferData(t.type,t.data,n)}},t.prototype.dispose=function(t,e){if(this.managedBuffers[t.id]){delete this.managedBuffers[t.id];var r=t._glBuffers[this.CONTEXT_UID],i=this.gl;t.disposeRunner.remove(this),r&&(e||i.deleteBuffer(r.buffer),delete t._glBuffers[this.CONTEXT_UID])}},t.prototype.disposeAll=function(t){for(var e=Object.keys(this.managedBuffers),r=0;r-1){var r=["\n %c %c %c PixiJS 6.4.2 - ✰ "+t+" ✰ %c %c http://www.pixijs.com/ %c %c ♥%c♥%c♥ \n\n","background: #ff66a5; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff66a5; background: #030307; padding:5px 0;","background: #ff66a5; padding:5px 0;","background: #ffc3dc; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;"];(e=globalThis.console).log.apply(e,r)}else globalThis.console&&globalThis.console.log("PixiJS 6.4.2 - "+t+" - http://www.pixijs.com/");uc=!0}}(2===n.context.webGLVersion?"WebGL 2":"WebGL 1"),n.resize(n.options.width,n.options.height),n}Wc(r,e),r.create=function(t){if(void 0===hc&&(hc=function(){var t={stencil:!0,failIfMajorPerformanceCaveat:it.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT};try{if(!globalThis.WebGLRenderingContext)return!1;var e=document.createElement("canvas"),r=e.getContext("webgl",t)||e.getContext("experimental-webgl",t),i=!(!r||!r.getContextAttributes().stencil);if(r){var n=r.getExtension("WEBGL_lose_context");n&&n.loseContext()}return r=null,i}catch(t){return!1}}()),hc)return new r(t);throw new Error('WebGL unsupported in this browser, use "pixi.js-legacy" for fallback canvas2d support.')},r.prototype.contextChange=function(){var e,r=this.gl;if(1===this.context.webGLVersion){var i=r.getParameter(r.FRAMEBUFFER_BINDING);r.bindFramebuffer(r.FRAMEBUFFER,null),e=r.getParameter(r.SAMPLES),r.bindFramebuffer(r.FRAMEBUFFER,i)}else i=r.getParameter(r.DRAW_FRAMEBUFFER_BINDING),r.bindFramebuffer(r.DRAW_FRAMEBUFFER,null),e=r.getParameter(r.SAMPLES),r.bindFramebuffer(r.DRAW_FRAMEBUFFER,i);e>=t.MSAA_QUALITY.HIGH?this.multisample=t.MSAA_QUALITY.HIGH:e>=t.MSAA_QUALITY.MEDIUM?this.multisample=t.MSAA_QUALITY.MEDIUM:e>=t.MSAA_QUALITY.LOW?this.multisample=t.MSAA_QUALITY.LOW:this.multisample=t.MSAA_QUALITY.NONE},r.prototype.addSystem=function(t,e){var r=new t(this);if(this[e])throw new Error('Whoops! The name "'+e+'" is already in use');for(var i in this[e]=r,this.runners)this.runners[i].add(r);return this},r.prototype.render=function(t,e){var r,i,n,o;if(e&&(e instanceof _d?(Ec("6.0.0","Renderer#render arguments changed, use options instead."),r=e,i=arguments[2],n=arguments[3],o=arguments[4]):(r=e.renderTexture,i=e.clear,n=e.transform,o=e.skipUpdateTransform)),this.renderingToScreen=!r,this.runners.prerender.emit(),this.emit("prerender"),this.projection.transform=n,!this.context.isLost){if(r||(this._lastObjectRendered=t),!o){var s=t.enableTempParent();t.updateTransform(),t.disableTempParent(s)}this.renderTexture.bind(r),this.batch.currentRenderer.start(),(void 0!==i?i:this.clearBeforeRender)&&this.renderTexture.clear(),t.render(this),this.batch.currentRenderer.flush(),r&&r.baseTexture.update(),this.runners.postrender.emit(),this.projection.transform=null,this.emit("postrender")}},r.prototype.generateTexture=function(t,r,i,n){void 0===r&&(r={});var o=e.prototype.generateTexture.call(this,t,r,i,n);return this.framebuffer.blit(),o},r.prototype.resize=function(t,r){e.prototype.resize.call(this,t,r),this.runners.resize.emit(this.screen.height,this.screen.width)},r.prototype.reset=function(){return this.runners.reset.emit(),this},r.prototype.clear=function(){this.renderTexture.bind(),this.renderTexture.clear()},r.prototype.destroy=function(t){for(var r in this.runners.destroy.emit(),this.runners)this.runners[r].destroy();e.prototype.destroy.call(this,t),this.gl=null},Object.defineProperty(r.prototype,"extract",{get:function(){return Ec("6.0.0","Renderer#extract has been deprecated, please use Renderer#plugins.extract instead."),this.plugins.extract},enumerable:!1,configurable:!0}),r.registerPlugin=function(t,e){r.__plugins=r.__plugins||{},r.__plugins[t]=e}}(Xf);var Yf=function(){this.texArray=null,this.blend=0,this.type=t.DRAW_MODES.TRIANGLES,this.start=0,this.size=0,this.data=null},jf=function(){function t(){this.elements=[],this.ids=[],this.count=0}return t.prototype.clear=function(){for(var t=0;tthis.size&&this.flush(),this._vertexCount+=t.vertexData.length/2,this._indexCount+=t.indices.length,this._bufferedTextures[this._bufferSize]=t._texture.baseTexture,this._bufferedElements[this._bufferSize++]=t)},r.prototype.buildTexturesAndDrawCalls=function(){var t=this._bufferedTextures,e=this.MAX_TEXTURES,i=r._textureArrayPool,n=this.renderer.batch,o=this._tempBoundTextures,s=this.renderer.textureGC.count,a=++Qc._globalBatch,h=0,u=i[0],l=0;n.copyBoundTextures(o,e);for(var c=0;c=e&&(n.boundArray(u,o,a,e),this.buildDrawCalls(u,l,c),l=c,u=i[++h],++a),d._batchEnabled=a,d.touched=s,u.elements[u.count++]=d)}for(u.count>0&&(n.boundArray(u,o,a,e),this.buildDrawCalls(u,l,this._bufferSize),++h,++a),c=0;c>16&255,i=t>>8&255;return(255*e<<24)+((r=r*e+.5|0)<<16)+((i=i*e+.5|0)<<8)+((255&t)*e+.5|0)}(t._tintRGB,d):t._tintRGB+(255*d<<24),p=0;p0&&(e+="\nelse "),r0){var S=t.worldTransform,O=S.a,I=S.b,M=S.c,N=S.d,P=(y+g+T)/3,D=(b+x+R)/3,C=y-P,w=b-D,L=O*C+M*w,F=I*C+N*w,U=Math.sqrt(L*L+F*F),B=1+A/U;y=P+C*B,b=D+w*B,L=O*(C=g-P)+M*(w=x-D),F=I*C+N*w,g=P+C*(B=1+A/(U=Math.sqrt(L*L+F*F))),x=D+w*B,L=O*(C=T-P)+M*(w=R-D),F=I*C+N*w,T=P+C*(B=1+A/(U=Math.sqrt(L*L+F*F))),R=D+w*B}n.save(),n.beginPath(),n.moveTo(y,b),n.lineTo(g,x),n.lineTo(T,R),n.closePath(),n.clip();var G=f*v+m*_+p*E-v*_-m*p-f*E,X=y*v+m*T+g*E-v*T-m*g-y*E,k=f*g+y*_+p*T-g*_-y*p-f*T,H=f*v*T+m*g*_+y*p*E-y*v*_-m*p*T-f*g*E,Y=b*v+m*R+x*E-v*R-m*x-b*E,j=f*x+b*_+p*R-x*_-b*p-f*R,V=f*v*R+m*x*_+b*p*E-b*v*_-m*p*R-f*x*E;n.transform(X/G,Y/G,k/G,j/G,H/G,V/G),n.drawImage(d,0,0,l*u.resolution,c*u.resolution,0,0,l,c),n.restore(),this.renderer.invalidateBlendMode()}},e.prototype.renderMeshFlat=function(t){var e=this.renderer.context,r=t.geometry.getBuffer("aVertexPosition").data,i=r.length/2;e.beginPath();for(var n=1;n0},t}(),ap=function(){function e(t){this._svgMatrix=null,this._tempMatrix=new er,this.renderer=t}return e.prototype._calcCanvasStyle=function(t,e){var r;return t.texture&&t.texture.baseTexture!==bi.WHITE.baseTexture?t.texture.valid?(r=Dl.getTintedPattern(t.texture,e),this.setPatternTransform(r,t.matrix||er.IDENTITY)):r="#808080":r="#"+("00000"+(0|e).toString(16)).slice(-6),r},e.prototype.render=function(e){var r=this.renderer,i=r.context,n=e.worldAlpha,o=e.transform.worldTransform;r.setContextTransform(o),r.setBlendMode(e.blendMode);for(var s,a,h=e.geometry.graphicsData,u=(e.tint>>16&255)/255,l=(e.tint>>8&255)/255,c=(255&e.tint)/255,d=0;d>16&255)/255*u*255<<16)+((v>>8&255)/255*l*255<<8)+(255&v)/255*c*255;s=this._calcCanvasStyle(_,y)}if(m.visible){var g=((E>>16&255)/255*u*255<<16)+((E>>8&255)/255*l*255<<8)+(255&E)/255*c*255;a=this._calcCanvasStyle(m,g)}if(i.lineWidth=m.width,i.lineCap=m.cap,i.lineJoin=m.join,i.miterLimit=m.miterLimit,f.type===t.SHAPES.POLY){i.beginPath();var T=(N=p).points,b=f.holes,x=void 0,R=void 0,A=void 0,S=void 0,O=void 0;i.moveTo(T[0],T[1]);for(var I=2;I0){for(O=[],x=0,A=T[0],S=T[1],I=2;I+2=0;I-=2)i.lineTo(T[I],T[I+1]);b[M].shape.closeStroke&&i.closePath(),O[M]=R*x<0}}_.visible&&(i.globalAlpha=_.alpha*n,i.fillStyle=s,i.fill()),m.visible&&this.paintPolygonStroke(N,m,a,b,O,n,i)}else if(f.type===t.SHAPES.RECT){var N=p;if(_.visible&&(i.globalAlpha=_.alpha*n,i.fillStyle=s,i.fillRect(N.x,N.y,N.width,N.height)),m.visible){var P=m.width*(.5-(1-m.alignment)),D=N.width+2*P,C=N.height+2*P;i.globalAlpha=m.alpha*n,i.strokeStyle=a,i.strokeRect(N.x-P,N.y-P,D,C)}}else if(f.type===t.SHAPES.CIRC)N=p,i.beginPath(),i.arc(N.x,N.y,N.radius,0,2*Math.PI),i.closePath(),_.visible&&(i.globalAlpha=_.alpha*n,i.fillStyle=s,i.fill()),m.visible&&(.5!==m.alignment&&(P=m.width*(.5-(1-m.alignment)),i.beginPath(),i.arc(N.x,N.y,N.radius+P,0,2*Math.PI),i.closePath()),i.globalAlpha=m.alpha*n,i.strokeStyle=a,i.stroke());else if(f.type===t.SHAPES.ELIP){if(N=p,(V=1===m.alignment)||this.paintEllipse(N,_,m,s,n,i),m.visible){if(.5!==m.alignment){var w=.5522848,L=(P=m.width*(.5-(1-m.alignment)),2*(N.width+P)),F=2*(N.height+P),U=N.x-L/2,B=N.y-F/2,G=L/2*w,X=F/2*w,k=U+L,H=B+F,Y=U+L/2,j=B+F/2;i.beginPath(),i.moveTo(U,j),i.bezierCurveTo(U,j-X,Y-G,B,Y,B),i.bezierCurveTo(Y+G,B,k,j-X,k,j),i.bezierCurveTo(k,j+X,Y+G,H,Y,H),i.bezierCurveTo(Y-G,H,U,j+X,U,j),i.closePath()}i.globalAlpha=m.alpha*n,i.strokeStyle=a,i.stroke()}V&&this.paintEllipse(N,_,m,s,n,i)}else if(f.type===t.SHAPES.RREC){var V;if(N=p,(V=1===m.alignment)||this.paintRoundedRectangle(N,_,m,s,n,i),m.visible){if(.5!==m.alignment){D=N.width,C=N.height,P=m.width*(.5-(1-m.alignment));var W=N.x-P,z=N.y-P,q=N.width+2*P,K=N.height+2*P,Z=P*(m.alignment>=1?Math.min(q/D,K/C):Math.min(D/q,C/K)),Q=N.radius+Z,J=Math.min(q,K)/2;Q=Q>J?J:Q,i.beginPath(),i.moveTo(W,z+Q),i.lineTo(W,z+K-Q),i.quadraticCurveTo(W,z+K,W+Q,z+K),i.lineTo(W+q-Q,z+K),i.quadraticCurveTo(W+q,z+K,W+q,z+K-Q),i.lineTo(W+q,z+Q),i.quadraticCurveTo(W+q,z,W+q-Q,z),i.lineTo(W+Q,z),i.quadraticCurveTo(W,z,W,z+Q),i.closePath()}i.globalAlpha=m.alpha*n,i.strokeStyle=a,i.stroke()}V&&this.paintRoundedRectangle(N,_,m,s,n,i)}}},e.prototype.paintPolygonStroke=function(t,e,r,i,n,o,s){if(.5!==e.alignment){var a=e.width*(.5-(1-e.alignment)),h=sp.offsetPolygon(t.points,a),u=void 0;s.beginPath(),s.moveTo(h[0],h[1]);for(var l=2;l=0;l-=2)s.lineTo(h[l],h[l+1]);i[c].shape.closeStroke&&s.closePath()}}s.globalAlpha=e.alpha*o,s.strokeStyle=r,s.stroke()},e.prototype.paintEllipse=function(t,e,r,i,n,o){var s=2*t.width,a=2*t.height,h=t.x-s/2,u=t.y-a/2,l=.5522848,c=s/2*l,d=a/2*l,f=h+s,p=u+a,_=h+s/2,m=u+a/2;0===r.alignment&&o.save(),o.beginPath(),o.moveTo(h,m),o.bezierCurveTo(h,m-d,_-c,u,_,u),o.bezierCurveTo(_+c,u,f,m-d,f,m),o.bezierCurveTo(f,m+d,_+c,p,_,p),o.bezierCurveTo(_-c,p,h,m+d,h,m),o.closePath(),0===r.alignment&&o.clip(),e.visible&&(o.globalAlpha=e.alpha*n,o.fillStyle=i,o.fill()),0===r.alignment&&o.restore()},e.prototype.paintRoundedRectangle=function(t,e,r,i,n,o){var s=t.x,a=t.y,h=t.width,u=t.height,l=t.radius,c=Math.min(h,u)/2;l=l>c?c:l,0===r.alignment&&o.save(),o.beginPath(),o.moveTo(s,a+l),o.lineTo(s,a+u-l),o.quadraticCurveTo(s,a+u,s+l,a+u),o.lineTo(s+h-l,a+u),o.quadraticCurveTo(s+h,a+u,s+h,a+u-l),o.lineTo(s+h,a+l),o.quadraticCurveTo(s+h,a,s+h-l,a),o.lineTo(s+l,a),o.quadraticCurveTo(s,a,s,a+l),o.closePath(),0===r.alignment&&o.clip(),e.visible&&(o.globalAlpha=e.alpha*n,o.fillStyle=i,o.fill()),0===r.alignment&&o.restore()},e.prototype.setPatternTransform=function(t,e){if(!1!==this._svgMatrix){if(!this._svgMatrix){var r=document.createElementNS("http://www.w3.org/2000/svg","svg");if(r&&r.createSVGMatrix&&(this._svgMatrix=r.createSVGMatrix()),!this._svgMatrix||!t.setTransform)return void(this._svgMatrix=!1)}this._svgMatrix.a=e.a,this._svgMatrix.b=e.b,this._svgMatrix.c=e.c,this._svgMatrix.d=e.d,this._svgMatrix.e=e.tx,this._svgMatrix.f=e.ty,t.setTransform(this._svgMatrix.inverse())}},e.prototype.destroy=function(){this.renderer=null,this._svgMatrix=null,this._tempMatrix=null},e}(),hp=new er;ih.prototype.generateCanvasTexture=function(t,e){void 0===e&&(e=1);var r=this.getLocalBounds(),i=xi.create({width:r.width,height:r.height,scaleMode:t,resolution:e});op||(op=new Pl),this.transform.updateLocalTransform(),this.transform.localTransform.copyTo(hp),hp.invert(),hp.tx-=r.x,hp.ty-=r.y,op.render(this,{renderTexture:i,clear:!0,transform:hp});var n=bi.from(i.baseTexture._canvasRenderTarget.canvas,{scaleMode:t});return n.baseTexture.setResolution(e),n},ih.prototype.cachedGraphicsData=[],ih.prototype._renderCanvas=function(t){!0!==this.isMask&&(this.finishPoly(),t.plugins.graphics.render(this))};var up=new er,lp=function(){function e(t){this.renderer=t}return e.prototype.render=function(e){var r=e._texture,i=this.renderer,n=i.context;if(r.valid){var o=r._frame.width,s=r._frame.height,a=e.transform.worldTransform,h=0,u=0,l=r.baseTexture.getDrawableSource();if(!(r.orig.width<=0||r.orig.height<=0)&&r.valid&&l){i.setBlendMode(e.blendMode,!0),i.context.globalAlpha=e.worldAlpha;var c=r.baseTexture.scaleMode===t.SCALE_MODES.LINEAR;i.smoothProperty&&i.context[i.smoothProperty]!==c&&(n[i.smoothProperty]=c),r.trim?(h=r.trim.width/2+r.trim.x-e.anchor.x*r.orig.width,u=r.trim.height/2+r.trim.y-e.anchor.y*r.orig.height):(h=(.5-e.anchor.x)*r.orig.width,u=(.5-e.anchor.y)*r.orig.height),r.rotate&&(a.copyTo(up),a=up,ur.matrixAppendRotationInv(a,r.rotate,h,u),h=0,u=0),h-=o/2,u-=s/2,i.setContextTransform(a,e.roundPixels,1),e.roundPixels&&(h|=0,u|=0);var d=r.baseTexture.resolution,f=i._outerBlend;f&&(n.save(),n.beginPath(),n.rect(h*i.resolution,u*i.resolution,o*i.resolution,s*i.resolution),n.clip()),16777215!==e.tint?(e._cachedTint===e.tint&&e._tintedCanvas.tintId===e._texture._updateID||(e._cachedTint=e.tint,e._tintedCanvas=Dl.getTintedCanvas(e,e.tint)),n.drawImage(e._tintedCanvas,0,0,Math.floor(o*d),Math.floor(s*d),Math.floor(h*i.resolution),Math.floor(u*i.resolution),Math.floor(o*i.resolution),Math.floor(s*i.resolution))):n.drawImage(l,r._frame.x*d,r._frame.y*d,Math.floor(o*d),Math.floor(s*d),Math.floor(h*i.resolution),Math.floor(u*i.resolution),Math.floor(o*i.resolution),Math.floor(s*i.resolution)),f&&n.restore(),i.setBlendMode(t.BLEND_MODES.NORMAL)}}},e.prototype.destroy=function(){this.renderer=null},e}();hh.prototype._tintedCanvas=null,hh.prototype._renderCanvas=function(t){t.plugins.sprite.render(this)};var cp=new Ke,dp=function(){function t(t){this.renderer=t}return t.prototype.image=function(t,e,r){var i=new Image;return i.src=this.base64(t,e,r),i},t.prototype.base64=function(t,e,r){return this.canvas(t).toDataURL(e,r)},t.prototype.canvas=function(t){var e,r,i,n,o=this.renderer;t&&(n=t instanceof xi?t:o.generateTexture(t)),n?(e=n.baseTexture._canvasRenderTarget.context,r=n.baseTexture._canvasRenderTarget.resolution,i=n.frame):(e=o.rootContext,r=o.resolution,(i=cp).width=this.renderer.width,i.height=this.renderer.height);var s=Math.floor(i.width*r+1e-4),a=Math.floor(i.height*r+1e-4),h=new Ue(s,a,1),u=e.getImageData(i.x*r,i.y*r,s,a);return h.context.putImageData(u,0,0),h.canvas},t.prototype.pixels=function(t){var e,r,i,n,o=this.renderer;t&&(n=t instanceof xi?t:o.generateTexture(t)),n?(e=n.baseTexture._canvasRenderTarget.context,r=n.baseTexture._canvasRenderTarget.resolution,i=n.frame):(e=o.rootContext,r=o.resolution,(i=cp).width=o.width,i.height=o.height);var s=i.x*r,a=i.y*r,h=i.width*r,u=i.height*r;return e.getImageData(s,a,h,u).data},t.prototype.destroy=function(){this.renderer=null},t}(),fp=function(t,e){return fp=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},fp(t,e)};function pp(t,e){var r=t;if(e instanceof oi){var i=e.source,n=0===i.width?r.canvas.width:Math.min(r.canvas.width,i.width),o=0===i.height?r.canvas.height:Math.min(r.canvas.height,i.height);return r.ctx.drawImage(i,0,0,n,o,0,0,r.canvas.width,r.canvas.height),!0}return!1}var _p=function(t){function e(e){var r=t.call(this,e)||this;return r.uploadHookHelper=r,r.canvas=document.createElement("canvas"),r.canvas.width=16,r.canvas.height=16,r.ctx=r.canvas.getContext("2d"),r.registerUploadHook(pp),r}return function(t,e){function r(){this.constructor=t}fp(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}(e,t),e.prototype.destroy=function(){t.prototype.destroy.call(this),this.ctx=null,this.canvas=null},e}(Ih),mp=new er,vp=new er,Ep=[new ze,new ze,new ze,new ze];return Gh.prototype._renderCanvas=function(t){var e=this._texture;if(e.baseTexture.valid){var r=t.context,i=this.worldTransform,n=e.baseTexture,o=n.getDrawableSource(),s=n.resolution;if(this._textureID!==this._texture._updateID||this._cachedTint!==this.tint){this._textureID=this._texture._updateID;var a=new Ue(e._frame.width,e._frame.height,s);16777215!==this.tint?(this._tintedCanvas=Dl.getTintedCanvas(this,this.tint),a.context.drawImage(this._tintedCanvas,0,0)):a.context.drawImage(o,-e._frame.x*s,-e._frame.y*s),this._cachedTint=this.tint,this._canvasPattern=a.context.createPattern(a.canvas,"repeat")}r.globalAlpha=this.worldAlpha,t.setBlendMode(this.blendMode),this.tileTransform.updateLocalTransform();var h=this.tileTransform.localTransform,u=this._width,l=this._height;mp.identity(),vp.copyFrom(h),this.uvRespectAnchor||vp.translate(-this.anchor.x*u,-this.anchor.y*l),vp.scale(this.tileScale.x/s,this.tileScale.y/s),mp.prepend(vp),mp.prepend(i),t.setContextTransform(mp),r.fillStyle=this._canvasPattern;var c=this.anchor.x*-u,d=this.anchor.y*-l;Ep[0].set(c,d),Ep[1].set(c+u,d),Ep[2].set(c+u,d+l),Ep[3].set(c,d+l);for(var f=0;f<4;f++)vp.applyInverse(Ep[f],Ep[f]);for(r.beginPath(),r.moveTo(Ep[0].x,Ep[0].y),f=1;f<4;f++)r.lineTo(Ep[f].x,Ep[f].y);r.closePath(),r.fill()}},Aa.prototype.renderCanvas=function(t){if(this.visible&&!(this.worldAlpha<=0)&&this.children.length&&this.renderable){var e=t.context,r=this.worldTransform,i=!0,n=0,o=0,s=0,a=0;t.setBlendMode(this.blendMode),e.globalAlpha=this.worldAlpha,this.displayObjectUpdateTransform();for(var h=0;h { + ENV2[ENV2["WEBGL_LEGACY"] = 0] = "WEBGL_LEGACY"; + ENV2[ENV2["WEBGL"] = 1] = "WEBGL"; + ENV2[ENV2["WEBGL2"] = 2] = "WEBGL2"; + return ENV2; + })(ENV || {}); + var RENDERER_TYPE = /* @__PURE__ */ ((RENDERER_TYPE2) => { + RENDERER_TYPE2[RENDERER_TYPE2["UNKNOWN"] = 0] = "UNKNOWN"; + RENDERER_TYPE2[RENDERER_TYPE2["WEBGL"] = 1] = "WEBGL"; + RENDERER_TYPE2[RENDERER_TYPE2["CANVAS"] = 2] = "CANVAS"; + return RENDERER_TYPE2; + })(RENDERER_TYPE || {}); + var BUFFER_BITS = /* @__PURE__ */ ((BUFFER_BITS2) => { + BUFFER_BITS2[BUFFER_BITS2["COLOR"] = 16384] = "COLOR"; + BUFFER_BITS2[BUFFER_BITS2["DEPTH"] = 256] = "DEPTH"; + BUFFER_BITS2[BUFFER_BITS2["STENCIL"] = 1024] = "STENCIL"; + return BUFFER_BITS2; + })(BUFFER_BITS || {}); + var BLEND_MODES = /* @__PURE__ */ ((BLEND_MODES2) => { + BLEND_MODES2[BLEND_MODES2["NORMAL"] = 0] = "NORMAL"; + BLEND_MODES2[BLEND_MODES2["ADD"] = 1] = "ADD"; + BLEND_MODES2[BLEND_MODES2["MULTIPLY"] = 2] = "MULTIPLY"; + BLEND_MODES2[BLEND_MODES2["SCREEN"] = 3] = "SCREEN"; + BLEND_MODES2[BLEND_MODES2["OVERLAY"] = 4] = "OVERLAY"; + BLEND_MODES2[BLEND_MODES2["DARKEN"] = 5] = "DARKEN"; + BLEND_MODES2[BLEND_MODES2["LIGHTEN"] = 6] = "LIGHTEN"; + BLEND_MODES2[BLEND_MODES2["COLOR_DODGE"] = 7] = "COLOR_DODGE"; + BLEND_MODES2[BLEND_MODES2["COLOR_BURN"] = 8] = "COLOR_BURN"; + BLEND_MODES2[BLEND_MODES2["HARD_LIGHT"] = 9] = "HARD_LIGHT"; + BLEND_MODES2[BLEND_MODES2["SOFT_LIGHT"] = 10] = "SOFT_LIGHT"; + BLEND_MODES2[BLEND_MODES2["DIFFERENCE"] = 11] = "DIFFERENCE"; + BLEND_MODES2[BLEND_MODES2["EXCLUSION"] = 12] = "EXCLUSION"; + BLEND_MODES2[BLEND_MODES2["HUE"] = 13] = "HUE"; + BLEND_MODES2[BLEND_MODES2["SATURATION"] = 14] = "SATURATION"; + BLEND_MODES2[BLEND_MODES2["COLOR"] = 15] = "COLOR"; + BLEND_MODES2[BLEND_MODES2["LUMINOSITY"] = 16] = "LUMINOSITY"; + BLEND_MODES2[BLEND_MODES2["NORMAL_NPM"] = 17] = "NORMAL_NPM"; + BLEND_MODES2[BLEND_MODES2["ADD_NPM"] = 18] = "ADD_NPM"; + BLEND_MODES2[BLEND_MODES2["SCREEN_NPM"] = 19] = "SCREEN_NPM"; + BLEND_MODES2[BLEND_MODES2["NONE"] = 20] = "NONE"; + BLEND_MODES2[BLEND_MODES2["SRC_OVER"] = 0] = "SRC_OVER"; + BLEND_MODES2[BLEND_MODES2["SRC_IN"] = 21] = "SRC_IN"; + BLEND_MODES2[BLEND_MODES2["SRC_OUT"] = 22] = "SRC_OUT"; + BLEND_MODES2[BLEND_MODES2["SRC_ATOP"] = 23] = "SRC_ATOP"; + BLEND_MODES2[BLEND_MODES2["DST_OVER"] = 24] = "DST_OVER"; + BLEND_MODES2[BLEND_MODES2["DST_IN"] = 25] = "DST_IN"; + BLEND_MODES2[BLEND_MODES2["DST_OUT"] = 26] = "DST_OUT"; + BLEND_MODES2[BLEND_MODES2["DST_ATOP"] = 27] = "DST_ATOP"; + BLEND_MODES2[BLEND_MODES2["ERASE"] = 26] = "ERASE"; + BLEND_MODES2[BLEND_MODES2["SUBTRACT"] = 28] = "SUBTRACT"; + BLEND_MODES2[BLEND_MODES2["XOR"] = 29] = "XOR"; + return BLEND_MODES2; + })(BLEND_MODES || {}); + var DRAW_MODES = /* @__PURE__ */ ((DRAW_MODES2) => { + DRAW_MODES2[DRAW_MODES2["POINTS"] = 0] = "POINTS"; + DRAW_MODES2[DRAW_MODES2["LINES"] = 1] = "LINES"; + DRAW_MODES2[DRAW_MODES2["LINE_LOOP"] = 2] = "LINE_LOOP"; + DRAW_MODES2[DRAW_MODES2["LINE_STRIP"] = 3] = "LINE_STRIP"; + DRAW_MODES2[DRAW_MODES2["TRIANGLES"] = 4] = "TRIANGLES"; + DRAW_MODES2[DRAW_MODES2["TRIANGLE_STRIP"] = 5] = "TRIANGLE_STRIP"; + DRAW_MODES2[DRAW_MODES2["TRIANGLE_FAN"] = 6] = "TRIANGLE_FAN"; + return DRAW_MODES2; + })(DRAW_MODES || {}); + var FORMATS = /* @__PURE__ */ ((FORMATS2) => { + FORMATS2[FORMATS2["RGBA"] = 6408] = "RGBA"; + FORMATS2[FORMATS2["RGB"] = 6407] = "RGB"; + FORMATS2[FORMATS2["RG"] = 33319] = "RG"; + FORMATS2[FORMATS2["RED"] = 6403] = "RED"; + FORMATS2[FORMATS2["RGBA_INTEGER"] = 36249] = "RGBA_INTEGER"; + FORMATS2[FORMATS2["RGB_INTEGER"] = 36248] = "RGB_INTEGER"; + FORMATS2[FORMATS2["RG_INTEGER"] = 33320] = "RG_INTEGER"; + FORMATS2[FORMATS2["RED_INTEGER"] = 36244] = "RED_INTEGER"; + FORMATS2[FORMATS2["ALPHA"] = 6406] = "ALPHA"; + FORMATS2[FORMATS2["LUMINANCE"] = 6409] = "LUMINANCE"; + FORMATS2[FORMATS2["LUMINANCE_ALPHA"] = 6410] = "LUMINANCE_ALPHA"; + FORMATS2[FORMATS2["DEPTH_COMPONENT"] = 6402] = "DEPTH_COMPONENT"; + FORMATS2[FORMATS2["DEPTH_STENCIL"] = 34041] = "DEPTH_STENCIL"; + return FORMATS2; + })(FORMATS || {}); + var TARGETS = /* @__PURE__ */ ((TARGETS2) => { + TARGETS2[TARGETS2["TEXTURE_2D"] = 3553] = "TEXTURE_2D"; + TARGETS2[TARGETS2["TEXTURE_CUBE_MAP"] = 34067] = "TEXTURE_CUBE_MAP"; + TARGETS2[TARGETS2["TEXTURE_2D_ARRAY"] = 35866] = "TEXTURE_2D_ARRAY"; + TARGETS2[TARGETS2["TEXTURE_CUBE_MAP_POSITIVE_X"] = 34069] = "TEXTURE_CUBE_MAP_POSITIVE_X"; + TARGETS2[TARGETS2["TEXTURE_CUBE_MAP_NEGATIVE_X"] = 34070] = "TEXTURE_CUBE_MAP_NEGATIVE_X"; + TARGETS2[TARGETS2["TEXTURE_CUBE_MAP_POSITIVE_Y"] = 34071] = "TEXTURE_CUBE_MAP_POSITIVE_Y"; + TARGETS2[TARGETS2["TEXTURE_CUBE_MAP_NEGATIVE_Y"] = 34072] = "TEXTURE_CUBE_MAP_NEGATIVE_Y"; + TARGETS2[TARGETS2["TEXTURE_CUBE_MAP_POSITIVE_Z"] = 34073] = "TEXTURE_CUBE_MAP_POSITIVE_Z"; + TARGETS2[TARGETS2["TEXTURE_CUBE_MAP_NEGATIVE_Z"] = 34074] = "TEXTURE_CUBE_MAP_NEGATIVE_Z"; + return TARGETS2; + })(TARGETS || {}); + var TYPES = /* @__PURE__ */ ((TYPES2) => { + TYPES2[TYPES2["UNSIGNED_BYTE"] = 5121] = "UNSIGNED_BYTE"; + TYPES2[TYPES2["UNSIGNED_SHORT"] = 5123] = "UNSIGNED_SHORT"; + TYPES2[TYPES2["UNSIGNED_SHORT_5_6_5"] = 33635] = "UNSIGNED_SHORT_5_6_5"; + TYPES2[TYPES2["UNSIGNED_SHORT_4_4_4_4"] = 32819] = "UNSIGNED_SHORT_4_4_4_4"; + TYPES2[TYPES2["UNSIGNED_SHORT_5_5_5_1"] = 32820] = "UNSIGNED_SHORT_5_5_5_1"; + TYPES2[TYPES2["UNSIGNED_INT"] = 5125] = "UNSIGNED_INT"; + TYPES2[TYPES2["UNSIGNED_INT_10F_11F_11F_REV"] = 35899] = "UNSIGNED_INT_10F_11F_11F_REV"; + TYPES2[TYPES2["UNSIGNED_INT_2_10_10_10_REV"] = 33640] = "UNSIGNED_INT_2_10_10_10_REV"; + TYPES2[TYPES2["UNSIGNED_INT_24_8"] = 34042] = "UNSIGNED_INT_24_8"; + TYPES2[TYPES2["UNSIGNED_INT_5_9_9_9_REV"] = 35902] = "UNSIGNED_INT_5_9_9_9_REV"; + TYPES2[TYPES2["BYTE"] = 5120] = "BYTE"; + TYPES2[TYPES2["SHORT"] = 5122] = "SHORT"; + TYPES2[TYPES2["INT"] = 5124] = "INT"; + TYPES2[TYPES2["FLOAT"] = 5126] = "FLOAT"; + TYPES2[TYPES2["FLOAT_32_UNSIGNED_INT_24_8_REV"] = 36269] = "FLOAT_32_UNSIGNED_INT_24_8_REV"; + TYPES2[TYPES2["HALF_FLOAT"] = 36193] = "HALF_FLOAT"; + return TYPES2; + })(TYPES || {}); + var SAMPLER_TYPES = /* @__PURE__ */ ((SAMPLER_TYPES2) => { + SAMPLER_TYPES2[SAMPLER_TYPES2["FLOAT"] = 0] = "FLOAT"; + SAMPLER_TYPES2[SAMPLER_TYPES2["INT"] = 1] = "INT"; + SAMPLER_TYPES2[SAMPLER_TYPES2["UINT"] = 2] = "UINT"; + return SAMPLER_TYPES2; + })(SAMPLER_TYPES || {}); + var SCALE_MODES = /* @__PURE__ */ ((SCALE_MODES2) => { + SCALE_MODES2[SCALE_MODES2["NEAREST"] = 0] = "NEAREST"; + SCALE_MODES2[SCALE_MODES2["LINEAR"] = 1] = "LINEAR"; + return SCALE_MODES2; + })(SCALE_MODES || {}); + var WRAP_MODES = /* @__PURE__ */ ((WRAP_MODES2) => { + WRAP_MODES2[WRAP_MODES2["CLAMP"] = 33071] = "CLAMP"; + WRAP_MODES2[WRAP_MODES2["REPEAT"] = 10497] = "REPEAT"; + WRAP_MODES2[WRAP_MODES2["MIRRORED_REPEAT"] = 33648] = "MIRRORED_REPEAT"; + return WRAP_MODES2; + })(WRAP_MODES || {}); + var MIPMAP_MODES = /* @__PURE__ */ ((MIPMAP_MODES2) => { + MIPMAP_MODES2[MIPMAP_MODES2["OFF"] = 0] = "OFF"; + MIPMAP_MODES2[MIPMAP_MODES2["POW2"] = 1] = "POW2"; + MIPMAP_MODES2[MIPMAP_MODES2["ON"] = 2] = "ON"; + MIPMAP_MODES2[MIPMAP_MODES2["ON_MANUAL"] = 3] = "ON_MANUAL"; + return MIPMAP_MODES2; + })(MIPMAP_MODES || {}); + var ALPHA_MODES = /* @__PURE__ */ ((ALPHA_MODES2) => { + ALPHA_MODES2[ALPHA_MODES2["NPM"] = 0] = "NPM"; + ALPHA_MODES2[ALPHA_MODES2["UNPACK"] = 1] = "UNPACK"; + ALPHA_MODES2[ALPHA_MODES2["PMA"] = 2] = "PMA"; + ALPHA_MODES2[ALPHA_MODES2["NO_PREMULTIPLIED_ALPHA"] = 0] = "NO_PREMULTIPLIED_ALPHA"; + ALPHA_MODES2[ALPHA_MODES2["PREMULTIPLY_ON_UPLOAD"] = 1] = "PREMULTIPLY_ON_UPLOAD"; + ALPHA_MODES2[ALPHA_MODES2["PREMULTIPLIED_ALPHA"] = 2] = "PREMULTIPLIED_ALPHA"; + return ALPHA_MODES2; + })(ALPHA_MODES || {}); + var CLEAR_MODES = /* @__PURE__ */ ((CLEAR_MODES2) => { + CLEAR_MODES2[CLEAR_MODES2["NO"] = 0] = "NO"; + CLEAR_MODES2[CLEAR_MODES2["YES"] = 1] = "YES"; + CLEAR_MODES2[CLEAR_MODES2["AUTO"] = 2] = "AUTO"; + CLEAR_MODES2[CLEAR_MODES2["BLEND"] = 0] = "BLEND"; + CLEAR_MODES2[CLEAR_MODES2["CLEAR"] = 1] = "CLEAR"; + CLEAR_MODES2[CLEAR_MODES2["BLIT"] = 2] = "BLIT"; + return CLEAR_MODES2; + })(CLEAR_MODES || {}); + var GC_MODES = /* @__PURE__ */ ((GC_MODES2) => { + GC_MODES2[GC_MODES2["AUTO"] = 0] = "AUTO"; + GC_MODES2[GC_MODES2["MANUAL"] = 1] = "MANUAL"; + return GC_MODES2; + })(GC_MODES || {}); + var PRECISION = /* @__PURE__ */ ((PRECISION2) => { + PRECISION2["LOW"] = "lowp"; + PRECISION2["MEDIUM"] = "mediump"; + PRECISION2["HIGH"] = "highp"; + return PRECISION2; + })(PRECISION || {}); + var MASK_TYPES = /* @__PURE__ */ ((MASK_TYPES2) => { + MASK_TYPES2[MASK_TYPES2["NONE"] = 0] = "NONE"; + MASK_TYPES2[MASK_TYPES2["SCISSOR"] = 1] = "SCISSOR"; + MASK_TYPES2[MASK_TYPES2["STENCIL"] = 2] = "STENCIL"; + MASK_TYPES2[MASK_TYPES2["SPRITE"] = 3] = "SPRITE"; + MASK_TYPES2[MASK_TYPES2["COLOR"] = 4] = "COLOR"; + return MASK_TYPES2; + })(MASK_TYPES || {}); + var COLOR_MASK_BITS = /* @__PURE__ */ ((COLOR_MASK_BITS2) => { + COLOR_MASK_BITS2[COLOR_MASK_BITS2["RED"] = 1] = "RED"; + COLOR_MASK_BITS2[COLOR_MASK_BITS2["GREEN"] = 2] = "GREEN"; + COLOR_MASK_BITS2[COLOR_MASK_BITS2["BLUE"] = 4] = "BLUE"; + COLOR_MASK_BITS2[COLOR_MASK_BITS2["ALPHA"] = 8] = "ALPHA"; + return COLOR_MASK_BITS2; + })(COLOR_MASK_BITS || {}); + var MSAA_QUALITY = /* @__PURE__ */ ((MSAA_QUALITY2) => { + MSAA_QUALITY2[MSAA_QUALITY2["NONE"] = 0] = "NONE"; + MSAA_QUALITY2[MSAA_QUALITY2["LOW"] = 2] = "LOW"; + MSAA_QUALITY2[MSAA_QUALITY2["MEDIUM"] = 4] = "MEDIUM"; + MSAA_QUALITY2[MSAA_QUALITY2["HIGH"] = 8] = "HIGH"; + return MSAA_QUALITY2; + })(MSAA_QUALITY || {}); + var BUFFER_TYPE = /* @__PURE__ */ ((BUFFER_TYPE2) => { + BUFFER_TYPE2[BUFFER_TYPE2["ELEMENT_ARRAY_BUFFER"] = 34963] = "ELEMENT_ARRAY_BUFFER"; + BUFFER_TYPE2[BUFFER_TYPE2["ARRAY_BUFFER"] = 34962] = "ARRAY_BUFFER"; + BUFFER_TYPE2[BUFFER_TYPE2["UNIFORM_BUFFER"] = 35345] = "UNIFORM_BUFFER"; + return BUFFER_TYPE2; + })(BUFFER_TYPE || {}); + + const BrowserAdapter = { + createCanvas: (width, height) => { + const canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + return canvas; + }, + getCanvasRenderingContext2D: () => CanvasRenderingContext2D, + getWebGLRenderingContext: () => WebGLRenderingContext, + getNavigator: () => navigator, + getBaseUrl: () => document.baseURI ?? window.location.href, + getFontFaceSet: () => document.fonts, + fetch: (url, options) => fetch(url, options), + parseXML: (xml) => { + const parser = new DOMParser(); + return parser.parseFromString(xml, "text/xml"); + } + }; + + const settings = { + ADAPTER: BrowserAdapter, + RESOLUTION: 1, + CREATE_IMAGE_BITMAP: false, + ROUND_PIXELS: false + }; + + var appleIphone = /iPhone/i; + var appleIpod = /iPod/i; + var appleTablet = /iPad/i; + var appleUniversal = /\biOS-universal(?:.+)Mac\b/i; + var androidPhone = /\bAndroid(?:.+)Mobile\b/i; + var androidTablet = /Android/i; + var amazonPhone = /(?:SD4930UR|\bSilk(?:.+)Mobile\b)/i; + var amazonTablet = /Silk/i; + var windowsPhone = /Windows Phone/i; + var windowsTablet = /\bWindows(?:.+)ARM\b/i; + var otherBlackBerry = /BlackBerry/i; + var otherBlackBerry10 = /BB10/i; + var otherOpera = /Opera Mini/i; + var otherChrome = /\b(CriOS|Chrome)(?:.+)Mobile/i; + var otherFirefox = /Mobile(?:.+)Firefox\b/i; + var isAppleTabletOnIos13 = function (navigator) { + return (typeof navigator !== 'undefined' && + navigator.platform === 'MacIntel' && + typeof navigator.maxTouchPoints === 'number' && + navigator.maxTouchPoints > 1 && + typeof MSStream === 'undefined'); + }; + function createMatch(userAgent) { + return function (regex) { return regex.test(userAgent); }; + } + function isMobile$1(param) { + var nav = { + userAgent: '', + platform: '', + maxTouchPoints: 0 + }; + if (!param && typeof navigator !== 'undefined') { + nav = { + userAgent: navigator.userAgent, + platform: navigator.platform, + maxTouchPoints: navigator.maxTouchPoints || 0 + }; + } + else if (typeof param === 'string') { + nav.userAgent = param; + } + else if (param && param.userAgent) { + nav = { + userAgent: param.userAgent, + platform: param.platform, + maxTouchPoints: param.maxTouchPoints || 0 + }; + } + var userAgent = nav.userAgent; + var tmp = userAgent.split('[FBAN'); + if (typeof tmp[1] !== 'undefined') { + userAgent = tmp[0]; + } + tmp = userAgent.split('Twitter'); + if (typeof tmp[1] !== 'undefined') { + userAgent = tmp[0]; + } + var match = createMatch(userAgent); + var result = { + apple: { + phone: match(appleIphone) && !match(windowsPhone), + ipod: match(appleIpod), + tablet: !match(appleIphone) && + (match(appleTablet) || isAppleTabletOnIos13(nav)) && + !match(windowsPhone), + universal: match(appleUniversal), + device: (match(appleIphone) || + match(appleIpod) || + match(appleTablet) || + match(appleUniversal) || + isAppleTabletOnIos13(nav)) && + !match(windowsPhone) + }, + amazon: { + phone: match(amazonPhone), + tablet: !match(amazonPhone) && match(amazonTablet), + device: match(amazonPhone) || match(amazonTablet) + }, + android: { + phone: (!match(windowsPhone) && match(amazonPhone)) || + (!match(windowsPhone) && match(androidPhone)), + tablet: !match(windowsPhone) && + !match(amazonPhone) && + !match(androidPhone) && + (match(amazonTablet) || match(androidTablet)), + device: (!match(windowsPhone) && + (match(amazonPhone) || + match(amazonTablet) || + match(androidPhone) || + match(androidTablet))) || + match(/\bokhttp\b/i) + }, + windows: { + phone: match(windowsPhone), + tablet: match(windowsTablet), + device: match(windowsPhone) || match(windowsTablet) + }, + other: { + blackberry: match(otherBlackBerry), + blackberry10: match(otherBlackBerry10), + opera: match(otherOpera), + firefox: match(otherFirefox), + chrome: match(otherChrome), + device: match(otherBlackBerry) || + match(otherBlackBerry10) || + match(otherOpera) || + match(otherFirefox) || + match(otherChrome) + }, + any: false, + phone: false, + tablet: false + }; + result.any = + result.apple.device || + result.android.device || + result.windows.device || + result.other.device; + result.phone = + result.apple.phone || result.android.phone || result.windows.phone; + result.tablet = + result.apple.tablet || result.android.tablet || result.windows.tablet; + return result; + } + + const isMobileCall = isMobile$1.default ?? isMobile$1; + const isMobile = isMobileCall(globalThis.navigator); + + settings.RETINA_PREFIX = /@([0-9\.]+)x/; + settings.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT = false; + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function getDefaultExportFromCjs (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; + } + + function createCommonjsModule(fn, basedir, module) { + return module = { + path: basedir, + exports: {}, + require: function (path, base) { + return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); + } + }, fn(module, module.exports), module.exports; + } + + function getDefaultExportFromNamespaceIfPresent (n) { + return n && Object.prototype.hasOwnProperty.call(n, 'default') ? n['default'] : n; + } + + function getDefaultExportFromNamespaceIfNotNamed (n) { + return n && Object.prototype.hasOwnProperty.call(n, 'default') && Object.keys(n).length === 1 ? n['default'] : n; + } + + function getAugmentedNamespace(n) { + if (n.__esModule) return n; + var a = Object.defineProperty({}, '__esModule', {value: true}); + Object.keys(n).forEach(function (k) { + var d = Object.getOwnPropertyDescriptor(n, k); + Object.defineProperty(a, k, d.get ? d : { + enumerable: true, + get: function () { + return n[k]; + } + }); + }); + return a; + } + + function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); + } + + var eventemitter3 = createCommonjsModule(function (module) { + 'use strict'; + + var has = Object.prototype.hasOwnProperty + , prefix = '~'; + + /** + * Constructor to create a storage for our `EE` objects. + * An `Events` instance is a plain object whose properties are event names. + * + * @constructor + * @private + */ + function Events() {} + + // + // We try to not inherit from `Object.prototype`. In some engines creating an + // instance in this way is faster than calling `Object.create(null)` directly. + // If `Object.create(null)` is not supported we prefix the event names with a + // character to make sure that the built-in object properties are not + // overridden or used as an attack vector. + // + if (Object.create) { + Events.prototype = Object.create(null); + + // + // This hack is needed because the `__proto__` property is still inherited in + // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. + // + if (!new Events().__proto__) prefix = false; + } + + /** + * Representation of a single event listener. + * + * @param {Function} fn The listener function. + * @param {*} context The context to invoke the listener with. + * @param {Boolean} [once=false] Specify if the listener is a one-time listener. + * @constructor + * @private + */ + function EE(fn, context, once) { + this.fn = fn; + this.context = context; + this.once = once || false; + } + + /** + * Add a listener for a given event. + * + * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} context The context to invoke the listener with. + * @param {Boolean} once Specify if the listener is a one-time listener. + * @returns {EventEmitter} + * @private + */ + function addListener(emitter, event, fn, context, once) { + if (typeof fn !== 'function') { + throw new TypeError('The listener must be a function'); + } + + var listener = new EE(fn, context || emitter, once) + , evt = prefix ? prefix + event : event; + + if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++; + else if (!emitter._events[evt].fn) emitter._events[evt].push(listener); + else emitter._events[evt] = [emitter._events[evt], listener]; + + return emitter; + } + + /** + * Clear event by name. + * + * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. + * @param {(String|Symbol)} evt The Event name. + * @private + */ + function clearEvent(emitter, evt) { + if (--emitter._eventsCount === 0) emitter._events = new Events(); + else delete emitter._events[evt]; + } + + /** + * Minimal `EventEmitter` interface that is molded against the Node.js + * `EventEmitter` interface. + * + * @constructor + * @public + */ + function EventEmitter() { + this._events = new Events(); + this._eventsCount = 0; + } + + /** + * Return an array listing the events for which the emitter has registered + * listeners. + * + * @returns {Array} + * @public + */ + EventEmitter.prototype.eventNames = function eventNames() { + var names = [] + , events + , name; + + if (this._eventsCount === 0) return names; + + for (name in (events = this._events)) { + if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); + } + + if (Object.getOwnPropertySymbols) { + return names.concat(Object.getOwnPropertySymbols(events)); + } + + return names; + }; + + /** + * Return the listeners registered for a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Array} The registered listeners. + * @public + */ + EventEmitter.prototype.listeners = function listeners(event) { + var evt = prefix ? prefix + event : event + , handlers = this._events[evt]; + + if (!handlers) return []; + if (handlers.fn) return [handlers.fn]; + + for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) { + ee[i] = handlers[i].fn; + } + + return ee; + }; + + /** + * Return the number of listeners listening to a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Number} The number of listeners. + * @public + */ + EventEmitter.prototype.listenerCount = function listenerCount(event) { + var evt = prefix ? prefix + event : event + , listeners = this._events[evt]; + + if (!listeners) return 0; + if (listeners.fn) return 1; + return listeners.length; + }; + + /** + * Calls each of the listeners registered for a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Boolean} `true` if the event had listeners, else `false`. + * @public + */ + EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return false; + + var listeners = this._events[evt] + , len = arguments.length + , args + , i; + + if (listeners.fn) { + if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); + + switch (len) { + case 1: return listeners.fn.call(listeners.context), true; + case 2: return listeners.fn.call(listeners.context, a1), true; + case 3: return listeners.fn.call(listeners.context, a1, a2), true; + case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; + case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; + case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; + } + + for (i = 1, args = new Array(len -1); i < len; i++) { + args[i - 1] = arguments[i]; + } + + listeners.fn.apply(listeners.context, args); + } else { + var length = listeners.length + , j; + + for (i = 0; i < length; i++) { + if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); + + switch (len) { + case 1: listeners[i].fn.call(listeners[i].context); break; + case 2: listeners[i].fn.call(listeners[i].context, a1); break; + case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; + case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break; + default: + if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { + args[j - 1] = arguments[j]; + } + + listeners[i].fn.apply(listeners[i].context, args); + } + } + } + + return true; + }; + + /** + * Add a listener for a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.on = function on(event, fn, context) { + return addListener(this, event, fn, context, false); + }; + + /** + * Add a one-time listener for a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.once = function once(event, fn, context) { + return addListener(this, event, fn, context, true); + }; + + /** + * Remove the listeners of a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn Only remove the listeners that match this function. + * @param {*} context Only remove the listeners that have this context. + * @param {Boolean} once Only remove one-time listeners. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return this; + if (!fn) { + clearEvent(this, evt); + return this; + } + + var listeners = this._events[evt]; + + if (listeners.fn) { + if ( + listeners.fn === fn && + (!once || listeners.once) && + (!context || listeners.context === context) + ) { + clearEvent(this, evt); + } + } else { + for (var i = 0, events = [], length = listeners.length; i < length; i++) { + if ( + listeners[i].fn !== fn || + (once && !listeners[i].once) || + (context && listeners[i].context !== context) + ) { + events.push(listeners[i]); + } + } + + // + // Reset the array, or remove it completely if we have no more listeners. + // + if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; + else clearEvent(this, evt); + } + + return this; + }; + + /** + * Remove all listeners, or those of the specified event. + * + * @param {(String|Symbol)} [event] The event name. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { + var evt; + + if (event) { + evt = prefix ? prefix + event : event; + if (this._events[evt]) clearEvent(this, evt); + } else { + this._events = new Events(); + this._eventsCount = 0; + } + + return this; + }; + + // + // Alias methods names because people roll like that. + // + EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + // + // Expose the prefix. + // + EventEmitter.prefixed = prefix; + + // + // Allow `EventEmitter` to be imported as module namespace. + // + EventEmitter.EventEmitter = EventEmitter; + + // + // Expose the module. + // + if ('undefined' !== 'object') { + module.exports = EventEmitter; + } + }); + + 'use strict'; + + var earcut_1 = earcut; + var _default = earcut; + + function earcut(data, holeIndices, dim) { + + dim = dim || 2; + + var hasHoles = holeIndices && holeIndices.length, + outerLen = hasHoles ? holeIndices[0] * dim : data.length, + outerNode = linkedList(data, 0, outerLen, dim, true), + triangles = []; + + if (!outerNode || outerNode.next === outerNode.prev) return triangles; + + var minX, minY, maxX, maxY, x, y, invSize; + + if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + if (data.length > 80 * dim) { + minX = maxX = data[0]; + minY = maxY = data[1]; + + for (var i = dim; i < outerLen; i += dim) { + x = data[i]; + y = data[i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + } + + // minX, minY and invSize are later used to transform coords into integers for z-order calculation + invSize = Math.max(maxX - minX, maxY - minY); + invSize = invSize !== 0 ? 32767 / invSize : 0; + } + + earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0); + + return triangles; + } + + // create a circular doubly linked list from polygon points in the specified winding order + function linkedList(data, start, end, dim, clockwise) { + var i, last; + + if (clockwise === (signedArea(data, start, end, dim) > 0)) { + for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last); + } else { + for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last); + } + + if (last && equals(last, last.next)) { + removeNode(last); + last = last.next; + } + + return last; + } + + // eliminate colinear or duplicate points + function filterPoints(start, end) { + if (!start) return start; + if (!end) end = start; + + var p = start, + again; + do { + again = false; + + if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + removeNode(p); + p = end = p.prev; + if (p === p.next) break; + again = true; + + } else { + p = p.next; + } + } while (again || p !== end); + + return end; + } + + // main ear slicing loop which triangulates a polygon (given as a linked list) + function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { + if (!ear) return; + + // interlink polygon nodes in z-order + if (!pass && invSize) indexCurve(ear, minX, minY, invSize); + + var stop = ear, + prev, next; + + // iterate through ears, slicing them one by one + while (ear.prev !== ear.next) { + prev = ear.prev; + next = ear.next; + + if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { + // cut off the triangle + triangles.push(prev.i / dim | 0); + triangles.push(ear.i / dim | 0); + triangles.push(next.i / dim | 0); + + removeNode(ear); + + // skipping the next vertex leads to less sliver triangles + ear = next.next; + stop = next.next; + + continue; + } + + ear = next; + + // if we looped through the whole remaining polygon and can't find any more ears + if (ear === stop) { + // try filtering points and slicing again + if (!pass) { + earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); + + // if this didn't work, try curing all small self-intersections locally + } else if (pass === 1) { + ear = cureLocalIntersections(filterPoints(ear), triangles, dim); + earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); + + // as a last resort, try splitting the remaining polygon into two + } else if (pass === 2) { + splitEarcut(ear, triangles, dim, minX, minY, invSize); + } + + break; + } + } + } + + // check whether a polygon node forms a valid ear with adjacent nodes + function isEar(ear) { + var a = ear.prev, + b = ear, + c = ear.next; + + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + + // triangle bbox; min & max are calculated like this for speed + var x0 = ax < bx ? (ax < cx ? ax : cx) : (bx < cx ? bx : cx), + y0 = ay < by ? (ay < cy ? ay : cy) : (by < cy ? by : cy), + x1 = ax > bx ? (ax > cx ? ax : cx) : (bx > cx ? bx : cx), + y1 = ay > by ? (ay > cy ? ay : cy) : (by > cy ? by : cy); + + var p = c.next; + while (p !== a) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && + pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && + area(p.prev, p, p.next) >= 0) return false; + p = p.next; + } + + return true; + } + + function isEarHashed(ear, minX, minY, invSize) { + var a = ear.prev, + b = ear, + c = ear.next; + + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + + var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + + // triangle bbox; min & max are calculated like this for speed + var x0 = ax < bx ? (ax < cx ? ax : cx) : (bx < cx ? bx : cx), + y0 = ay < by ? (ay < cy ? ay : cy) : (by < cy ? by : cy), + x1 = ax > bx ? (ax > cx ? ax : cx) : (bx > cx ? bx : cx), + y1 = ay > by ? (ay > cy ? ay : cy) : (by > cy ? by : cy); + + // z-order range for the current triangle bbox; + var minZ = zOrder(x0, y0, minX, minY, invSize), + maxZ = zOrder(x1, y1, minX, minY, invSize); + + var p = ear.prevZ, + n = ear.nextZ; + + // look for points inside the triangle in both directions + while (p && p.z >= minZ && n && n.z <= maxZ) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && + pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + + if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && + pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + n = n.nextZ; + } + + // look for remaining points in decreasing z-order + while (p && p.z >= minZ) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && + pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + } + + // look for remaining points in increasing z-order + while (n && n.z <= maxZ) { + if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && + pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + n = n.nextZ; + } + + return true; + } + + // go through all polygon nodes and cure small local self-intersections + function cureLocalIntersections(start, triangles, dim) { + var p = start; + do { + var a = p.prev, + b = p.next.next; + + if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { + + triangles.push(a.i / dim | 0); + triangles.push(p.i / dim | 0); + triangles.push(b.i / dim | 0); + + // remove two nodes involved + removeNode(p); + removeNode(p.next); + + p = start = b; + } + p = p.next; + } while (p !== start); + + return filterPoints(p); + } + + // try splitting polygon into two and triangulate them independently + function splitEarcut(start, triangles, dim, minX, minY, invSize) { + // look for a valid diagonal that divides the polygon into two + var a = start; + do { + var b = a.next.next; + while (b !== a.prev) { + if (a.i !== b.i && isValidDiagonal(a, b)) { + // split the polygon in two by the diagonal + var c = splitPolygon(a, b); + + // filter colinear points around the cuts + a = filterPoints(a, a.next); + c = filterPoints(c, c.next); + + // run earcut on each half + earcutLinked(a, triangles, dim, minX, minY, invSize, 0); + earcutLinked(c, triangles, dim, minX, minY, invSize, 0); + return; + } + b = b.next; + } + a = a.next; + } while (a !== start); + } + + // link every hole into the outer loop, producing a single-ring polygon without holes + function eliminateHoles(data, holeIndices, outerNode, dim) { + var queue = [], + i, len, start, end, list; + + for (i = 0, len = holeIndices.length; i < len; i++) { + start = holeIndices[i] * dim; + end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + list = linkedList(data, start, end, dim, false); + if (list === list.next) list.steiner = true; + queue.push(getLeftmost(list)); + } + + queue.sort(compareX); + + // process holes from left to right + for (i = 0; i < queue.length; i++) { + outerNode = eliminateHole(queue[i], outerNode); + } + + return outerNode; + } + + function compareX(a, b) { + return a.x - b.x; + } + + // find a bridge between vertices that connects hole with an outer ring and and link it + function eliminateHole(hole, outerNode) { + var bridge = findHoleBridge(hole, outerNode); + if (!bridge) { + return outerNode; + } + + var bridgeReverse = splitPolygon(bridge, hole); + + // filter collinear points around the cuts + filterPoints(bridgeReverse, bridgeReverse.next); + return filterPoints(bridge, bridge.next); + } + + // David Eberly's algorithm for finding a bridge between hole and outer polygon + function findHoleBridge(hole, outerNode) { + var p = outerNode, + hx = hole.x, + hy = hole.y, + qx = -Infinity, + m; + + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + do { + if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { + var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); + if (x <= hx && x > qx) { + qx = x; + m = p.x < p.next.x ? p : p.next; + if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint + } + } + p = p.next; + } while (p !== outerNode); + + if (!m) return null; + + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point + + var stop = m, + mx = m.x, + my = m.y, + tanMin = Infinity, + tan; + + p = m; + + do { + if (hx >= p.x && p.x >= mx && hx !== p.x && + pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { + + tan = Math.abs(hy - p.y) / (hx - p.x); // tangential + + if (locallyInside(p, hole) && + (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) { + m = p; + tanMin = tan; + } + } + + p = p.next; + } while (p !== stop); + + return m; + } + + // whether sector in vertex m contains sector in vertex p in the same coordinates + function sectorContainsSector(m, p) { + return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0; + } + + // interlink polygon nodes in z-order + function indexCurve(start, minX, minY, invSize) { + var p = start; + do { + if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + } while (p !== start); + + p.prevZ.nextZ = null; + p.prevZ = null; + + sortLinked(p); + } + + // Simon Tatham's linked list merge sort algorithm + // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html + function sortLinked(list) { + var i, p, q, e, tail, numMerges, pSize, qSize, + inSize = 1; + + do { + p = list; + list = null; + tail = null; + numMerges = 0; + + while (p) { + numMerges++; + q = p; + pSize = 0; + for (i = 0; i < inSize; i++) { + pSize++; + q = q.nextZ; + if (!q) break; + } + qSize = inSize; + + while (pSize > 0 || (qSize > 0 && q)) { + + if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { + e = p; + p = p.nextZ; + pSize--; + } else { + e = q; + q = q.nextZ; + qSize--; + } + + if (tail) tail.nextZ = e; + else list = e; + + e.prevZ = tail; + tail = e; + } + + p = q; + } + + tail.nextZ = null; + inSize *= 2; + + } while (numMerges > 1); + + return list; + } + + // z-order of a point given coords and inverse of the longer side of data bbox + function zOrder(x, y, minX, minY, invSize) { + // coords are transformed into non-negative 15-bit integer range + x = (x - minX) * invSize | 0; + y = (y - minY) * invSize | 0; + + x = (x | (x << 8)) & 0x00FF00FF; + x = (x | (x << 4)) & 0x0F0F0F0F; + x = (x | (x << 2)) & 0x33333333; + x = (x | (x << 1)) & 0x55555555; + + y = (y | (y << 8)) & 0x00FF00FF; + y = (y | (y << 4)) & 0x0F0F0F0F; + y = (y | (y << 2)) & 0x33333333; + y = (y | (y << 1)) & 0x55555555; + + return x | (y << 1); + } + + // find the leftmost node of a polygon ring + function getLeftmost(start) { + var p = start, + leftmost = start; + do { + if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p; + p = p.next; + } while (p !== start); + + return leftmost; + } + + // check if a point lies within a convex triangle + function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { + return (cx - px) * (ay - py) >= (ax - px) * (cy - py) && + (ax - px) * (by - py) >= (bx - px) * (ay - py) && + (bx - px) * (cy - py) >= (cx - px) * (by - py); + } + + // check if a diagonal between two polygon nodes is valid (lies in polygon interior) + function isValidDiagonal(a, b) { + return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges + (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible + (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors + equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case + } + + // signed area of a triangle + function area(p, q, r) { + return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); + } + + // check if two points are equal + function equals(p1, p2) { + return p1.x === p2.x && p1.y === p2.y; + } + + // check if two segments intersect + function intersects(p1, q1, p2, q2) { + var o1 = sign$1(area(p1, q1, p2)); + var o2 = sign$1(area(p1, q1, q2)); + var o3 = sign$1(area(p2, q2, p1)); + var o4 = sign$1(area(p2, q2, q1)); + + if (o1 !== o2 && o3 !== o4) return true; // general case + + if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1 + if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1 + if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2 + if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2 + + return false; + } + + // for collinear points p, q, r, check if point q lies on segment pr + function onSegment(p, q, r) { + return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y); + } + + function sign$1(num) { + return num > 0 ? 1 : num < 0 ? -1 : 0; + } + + // check if a polygon diagonal intersects any polygon segments + function intersectsPolygon(a, b) { + var p = a; + do { + if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && + intersects(p, p.next, a, b)) return true; + p = p.next; + } while (p !== a); + + return false; + } + + // check if a polygon diagonal is locally inside the polygon + function locallyInside(a, b) { + return area(a.prev, a, a.next) < 0 ? + area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : + area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; + } + + // check if the middle point of a polygon diagonal is inside the polygon + function middleInside(a, b) { + var p = a, + inside = false, + px = (a.x + b.x) / 2, + py = (a.y + b.y) / 2; + do { + if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y && + (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) + inside = !inside; + p = p.next; + } while (p !== a); + + return inside; + } + + // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; + // if one belongs to the outer ring and another to a hole, it merges it into a single ring + function splitPolygon(a, b) { + var a2 = new Node(a.i, a.x, a.y), + b2 = new Node(b.i, b.x, b.y), + an = a.next, + bp = b.prev; + + a.next = b; + b.prev = a; + + a2.next = an; + an.prev = a2; + + b2.next = a2; + a2.prev = b2; + + bp.next = b2; + b2.prev = bp; + + return b2; + } + + // create a node and optionally link it with previous one (in a circular doubly linked list) + function insertNode(i, x, y, last) { + var p = new Node(i, x, y); + + if (!last) { + p.prev = p; + p.next = p; + + } else { + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + } + return p; + } + + function removeNode(p) { + p.next.prev = p.prev; + p.prev.next = p.next; + + if (p.prevZ) p.prevZ.nextZ = p.nextZ; + if (p.nextZ) p.nextZ.prevZ = p.prevZ; + } + + function Node(i, x, y) { + // vertex index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertex nodes in a polygon ring + this.prev = null; + this.next = null; + + // z-order curve value + this.z = 0; + + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; + + // indicates whether this is a steiner point + this.steiner = false; + } + + // return a percentage difference between the polygon area and its triangulation area; + // used to verify correctness of triangulation + earcut.deviation = function (data, holeIndices, dim, triangles) { + var hasHoles = holeIndices && holeIndices.length; + var outerLen = hasHoles ? holeIndices[0] * dim : data.length; + + var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); + if (hasHoles) { + for (var i = 0, len = holeIndices.length; i < len; i++) { + var start = holeIndices[i] * dim; + var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + polygonArea -= Math.abs(signedArea(data, start, end, dim)); + } + } + + var trianglesArea = 0; + for (i = 0; i < triangles.length; i += 3) { + var a = triangles[i] * dim; + var b = triangles[i + 1] * dim; + var c = triangles[i + 2] * dim; + trianglesArea += Math.abs( + (data[a] - data[c]) * (data[b + 1] - data[a + 1]) - + (data[a] - data[b]) * (data[c + 1] - data[a + 1])); + } + + return polygonArea === 0 && trianglesArea === 0 ? 0 : + Math.abs((trianglesArea - polygonArea) / polygonArea); + }; + + function signedArea(data, start, end, dim) { + var sum = 0; + for (var i = start, j = end - dim; i < end; i += dim) { + sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); + j = i; + } + return sum; + } + + // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts + earcut.flatten = function (data) { + var dim = data[0][0].length, + result = {vertices: [], holes: [], dimensions: dim}, + holeIndex = 0; + + for (var i = 0; i < data.length; i++) { + for (var j = 0; j < data[i].length; j++) { + for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]); + } + if (i > 0) { + holeIndex += data[i - 1].length; + result.holes.push(holeIndex); + } + } + return result; + }; + earcut_1.default = _default; + + var punycode = createCommonjsModule(function (module, exports) { + /*! https://mths.be/punycode v1.3.2 by @mathias */ + ;(function(root) { + + /** Detect free variables */ + var freeExports = 'object' == 'object' && exports && + !exports.nodeType && exports; + var freeModule = 'object' == 'object' && module && + !module.nodeType && module; + var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal; + if ( + freeGlobal.global === freeGlobal || + freeGlobal.window === freeGlobal || + freeGlobal.self === freeGlobal + ) { + root = freeGlobal; + } + + /** + * The `punycode` object. + * @name punycode + * @type Object + */ + var punycode, + + /** Highest positive signed 32-bit float value */ + maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 + + /** Bootstring parameters */ + base = 36, + tMin = 1, + tMax = 26, + skew = 38, + damp = 700, + initialBias = 72, + initialN = 128, // 0x80 + delimiter = '-', // '\x2D' + + /** Regular expressions */ + regexPunycode = /^xn--/, + regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars + regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators + + /** Error messages */ + errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }, + + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + return output; + }).join(''); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * http://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for (oldi = i, w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base; /* no condition */; k += base) { + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '1.3.2', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode + }; + + /** Expose `punycode` */ + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof undefined == 'function' && + typeof undefined.amd == 'object' && + undefined.amd + ) { + undefined('punycode', function() { + return punycode; + }); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = punycode; + } else { // in Narwhal or RingoJS v0.7.0- + for (key in punycode) { + punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); + } + } + } else { // in Rhino or a web browser + root.punycode = punycode; + } + + }(commonjsGlobal)); + }); + + 'use strict'; + + var util = { + isString: function(arg) { + return typeof(arg) === 'string'; + }, + isObject: function(arg) { + return typeof(arg) === 'object' && arg !== null; + }, + isNull: function(arg) { + return arg === null; + }, + isNullOrUndefined: function(arg) { + return arg == null; + } + }; + + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + 'use strict'; + + // If obj.hasOwnProperty has been overridden, then calling + // obj.hasOwnProperty(prop) will break. + // See: https://github.com/joyent/node/issues/1707 + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + + var decode = function(qs, sep, eq, options) { + sep = sep || '&'; + eq = eq || '='; + var obj = {}; + + if (typeof qs !== 'string' || qs.length === 0) { + return obj; + } + + var regexp = /\+/g; + qs = qs.split(sep); + + var maxKeys = 1000; + if (options && typeof options.maxKeys === 'number') { + maxKeys = options.maxKeys; + } + + var len = qs.length; + // maxKeys <= 0 means that we should not limit keys count + if (maxKeys > 0 && len > maxKeys) { + len = maxKeys; + } + + for (var i = 0; i < len; ++i) { + var x = qs[i].replace(regexp, '%20'), + idx = x.indexOf(eq), + kstr, vstr, k, v; + + if (idx >= 0) { + kstr = x.substr(0, idx); + vstr = x.substr(idx + 1); + } else { + kstr = x; + vstr = ''; + } + + k = decodeURIComponent(kstr); + v = decodeURIComponent(vstr); + + if (!hasOwnProperty(obj, k)) { + obj[k] = v; + } else if (Array.isArray(obj[k])) { + obj[k].push(v); + } else { + obj[k] = [obj[k], v]; + } + } + + return obj; + }; + + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + 'use strict'; + + var stringifyPrimitive = function(v) { + switch (typeof v) { + case 'string': + return v; + + case 'boolean': + return v ? 'true' : 'false'; + + case 'number': + return isFinite(v) ? v : ''; + + default: + return ''; + } + }; + + var encode = function(obj, sep, eq, name) { + sep = sep || '&'; + eq = eq || '='; + if (obj === null) { + obj = undefined; + } + + if (typeof obj === 'object') { + return Object.keys(obj).map(function(k) { + var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; + if (Array.isArray(obj[k])) { + return obj[k].map(function(v) { + return ks + encodeURIComponent(stringifyPrimitive(v)); + }).join(sep); + } else { + return ks + encodeURIComponent(stringifyPrimitive(obj[k])); + } + }).join(sep); + + } + + if (!name) return ''; + return encodeURIComponent(stringifyPrimitive(name)) + eq + + encodeURIComponent(stringifyPrimitive(obj)); + }; + + var querystring = createCommonjsModule(function (module, exports) { + 'use strict'; + + exports.decode = exports.parse = decode; + exports.encode = exports.stringify = encode; + }); + + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + 'use strict'; + + + + + var parse = urlParse; + var resolve = urlResolve; + var resolveObject = urlResolveObject; + var format = urlFormat; + + var Url_1 = Url; + + function Url() { + this.protocol = null; + this.slashes = null; + this.auth = null; + this.host = null; + this.port = null; + this.hostname = null; + this.hash = null; + this.search = null; + this.query = null; + this.pathname = null; + this.path = null; + this.href = null; + } + + // Reference: RFC 3986, RFC 1808, RFC 2396 + + // define these here so at least they only have to be + // compiled once on the first module load. + var protocolPattern = /^([a-z0-9.+-]+:)/i, + portPattern = /:[0-9]*$/, + + // Special case for a simple path URL + simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/, + + // RFC 2396: characters reserved for delimiting URLs. + // We actually just auto-escape these. + delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], + + // RFC 2396: characters not allowed for various reasons. + unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims), + + // Allowed by RFCs, but cause of XSS attacks. Always escape these. + autoEscape = ['\''].concat(unwise), + // Characters that are never ever allowed in a hostname. + // Note that any invalid chars are also handled, but these + // are the ones that are *expected* to be seen, so we fast-path + // them. + nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape), + hostEndingChars = ['/', '?', '#'], + hostnameMaxLen = 255, + hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/, + hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/, + // protocols that can allow "unsafe" and "unwise" chars. + unsafeProtocol = { + 'javascript': true, + 'javascript:': true + }, + // protocols that never have a hostname. + hostlessProtocol = { + 'javascript': true, + 'javascript:': true + }, + // protocols that always contain a // bit. + slashedProtocol = { + 'http': true, + 'https': true, + 'ftp': true, + 'gopher': true, + 'file': true, + 'http:': true, + 'https:': true, + 'ftp:': true, + 'gopher:': true, + 'file:': true + }; + + function urlParse(url, parseQueryString, slashesDenoteHost) { + if (url && util.isObject(url) && url instanceof Url) return url; + + var u = new Url; + u.parse(url, parseQueryString, slashesDenoteHost); + return u; + } + + Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { + if (!util.isString(url)) { + throw new TypeError("Parameter 'url' must be a string, not " + typeof url); + } + + // Copy chrome, IE, opera backslash-handling behavior. + // Back slashes before the query string get converted to forward slashes + // See: https://code.google.com/p/chromium/issues/detail?id=25916 + var queryIndex = url.indexOf('?'), + splitter = + (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#', + uSplit = url.split(splitter), + slashRegex = /\\/g; + uSplit[0] = uSplit[0].replace(slashRegex, '/'); + url = uSplit.join(splitter); + + var rest = url; + + // trim before proceeding. + // This is to support parse stuff like " http://foo.com \n" + rest = rest.trim(); + + if (!slashesDenoteHost && url.split('#').length === 1) { + // Try fast path regexp + var simplePath = simplePathPattern.exec(rest); + if (simplePath) { + this.path = rest; + this.href = rest; + this.pathname = simplePath[1]; + if (simplePath[2]) { + this.search = simplePath[2]; + if (parseQueryString) { + this.query = querystring.parse(this.search.substr(1)); + } else { + this.query = this.search.substr(1); + } + } else if (parseQueryString) { + this.search = ''; + this.query = {}; + } + return this; + } + } + + var proto = protocolPattern.exec(rest); + if (proto) { + proto = proto[0]; + var lowerProto = proto.toLowerCase(); + this.protocol = lowerProto; + rest = rest.substr(proto.length); + } + + // figure out if it's got a host + // user@server is *always* interpreted as a hostname, and url + // resolution will treat //foo/bar as host=foo,path=bar because that's + // how the browser resolves relative URLs. + if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { + var slashes = rest.substr(0, 2) === '//'; + if (slashes && !(proto && hostlessProtocol[proto])) { + rest = rest.substr(2); + this.slashes = true; + } + } + + if (!hostlessProtocol[proto] && + (slashes || (proto && !slashedProtocol[proto]))) { + + // there's a hostname. + // the first instance of /, ?, ;, or # ends the host. + // + // If there is an @ in the hostname, then non-host chars *are* allowed + // to the left of the last @ sign, unless some host-ending character + // comes *before* the @-sign. + // URLs are obnoxious. + // + // ex: + // http://a@b@c/ => user:a@b host:c + // http://a@b?@c => user:a host:c path:/?@c + + // v0.12 TODO(isaacs): This is not quite how Chrome does things. + // Review our test case against browsers more comprehensively. + + // find the first instance of any hostEndingChars + var hostEnd = -1; + for (var i = 0; i < hostEndingChars.length; i++) { + var hec = rest.indexOf(hostEndingChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) + hostEnd = hec; + } + + // at this point, either we have an explicit point where the + // auth portion cannot go past, or the last @ char is the decider. + var auth, atSign; + if (hostEnd === -1) { + // atSign can be anywhere. + atSign = rest.lastIndexOf('@'); + } else { + // atSign must be in auth portion. + // http://a@b/c@d => host:b auth:a path:/c@d + atSign = rest.lastIndexOf('@', hostEnd); + } + + // Now we have a portion which is definitely the auth. + // Pull that off. + if (atSign !== -1) { + auth = rest.slice(0, atSign); + rest = rest.slice(atSign + 1); + this.auth = decodeURIComponent(auth); + } + + // the host is the remaining to the left of the first non-host char + hostEnd = -1; + for (var i = 0; i < nonHostChars.length; i++) { + var hec = rest.indexOf(nonHostChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) + hostEnd = hec; + } + // if we still have not hit it, then the entire thing is a host. + if (hostEnd === -1) + hostEnd = rest.length; + + this.host = rest.slice(0, hostEnd); + rest = rest.slice(hostEnd); + + // pull out port. + this.parseHost(); + + // we've indicated that there is a hostname, + // so even if it's empty, it has to be present. + this.hostname = this.hostname || ''; + + // if hostname begins with [ and ends with ] + // assume that it's an IPv6 address. + var ipv6Hostname = this.hostname[0] === '[' && + this.hostname[this.hostname.length - 1] === ']'; + + // validate a little. + if (!ipv6Hostname) { + var hostparts = this.hostname.split(/\./); + for (var i = 0, l = hostparts.length; i < l; i++) { + var part = hostparts[i]; + if (!part) continue; + if (!part.match(hostnamePartPattern)) { + var newpart = ''; + for (var j = 0, k = part.length; j < k; j++) { + if (part.charCodeAt(j) > 127) { + // we replace non-ASCII char with a temporary placeholder + // we need this to make sure size of hostname is not + // broken by replacing non-ASCII by nothing + newpart += 'x'; + } else { + newpart += part[j]; + } + } + // we test again with ASCII char only + if (!newpart.match(hostnamePartPattern)) { + var validParts = hostparts.slice(0, i); + var notHost = hostparts.slice(i + 1); + var bit = part.match(hostnamePartStart); + if (bit) { + validParts.push(bit[1]); + notHost.unshift(bit[2]); + } + if (notHost.length) { + rest = '/' + notHost.join('.') + rest; + } + this.hostname = validParts.join('.'); + break; + } + } + } + } + + if (this.hostname.length > hostnameMaxLen) { + this.hostname = ''; + } else { + // hostnames are always lower case. + this.hostname = this.hostname.toLowerCase(); + } + + if (!ipv6Hostname) { + // IDNA Support: Returns a punycoded representation of "domain". + // It only converts parts of the domain name that + // have non-ASCII characters, i.e. it doesn't matter if + // you call it with a domain that already is ASCII-only. + this.hostname = punycode.toASCII(this.hostname); + } + + var p = this.port ? ':' + this.port : ''; + var h = this.hostname || ''; + this.host = h + p; + this.href += this.host; + + // strip [ and ] from the hostname + // the host field still retains them, though + if (ipv6Hostname) { + this.hostname = this.hostname.substr(1, this.hostname.length - 2); + if (rest[0] !== '/') { + rest = '/' + rest; + } + } + } + + // now rest is set to the post-host stuff. + // chop off any delim chars. + if (!unsafeProtocol[lowerProto]) { + + // First, make 100% sure that any "autoEscape" chars get + // escaped, even if encodeURIComponent doesn't think they + // need to be. + for (var i = 0, l = autoEscape.length; i < l; i++) { + var ae = autoEscape[i]; + if (rest.indexOf(ae) === -1) + continue; + var esc = encodeURIComponent(ae); + if (esc === ae) { + esc = escape(ae); + } + rest = rest.split(ae).join(esc); + } + } + + + // chop off from the tail first. + var hash = rest.indexOf('#'); + if (hash !== -1) { + // got a fragment string. + this.hash = rest.substr(hash); + rest = rest.slice(0, hash); + } + var qm = rest.indexOf('?'); + if (qm !== -1) { + this.search = rest.substr(qm); + this.query = rest.substr(qm + 1); + if (parseQueryString) { + this.query = querystring.parse(this.query); + } + rest = rest.slice(0, qm); + } else if (parseQueryString) { + // no query string, but parseQueryString still requested + this.search = ''; + this.query = {}; + } + if (rest) this.pathname = rest; + if (slashedProtocol[lowerProto] && + this.hostname && !this.pathname) { + this.pathname = '/'; + } + + //to support http.request + if (this.pathname || this.search) { + var p = this.pathname || ''; + var s = this.search || ''; + this.path = p + s; + } + + // finally, reconstruct the href based on what has been validated. + this.href = this.format(); + return this; + }; + + // format a parsed object into a url string + function urlFormat(obj) { + // ensure it's an object, and not a string url. + // If it's an obj, this is a no-op. + // this way, you can call url_format() on strings + // to clean up potentially wonky urls. + if (util.isString(obj)) obj = urlParse(obj); + if (!(obj instanceof Url)) return Url.prototype.format.call(obj); + return obj.format(); + } + + Url.prototype.format = function() { + var auth = this.auth || ''; + if (auth) { + auth = encodeURIComponent(auth); + auth = auth.replace(/%3A/i, ':'); + auth += '@'; + } + + var protocol = this.protocol || '', + pathname = this.pathname || '', + hash = this.hash || '', + host = false, + query = ''; + + if (this.host) { + host = auth + this.host; + } else if (this.hostname) { + host = auth + (this.hostname.indexOf(':') === -1 ? + this.hostname : + '[' + this.hostname + ']'); + if (this.port) { + host += ':' + this.port; + } + } + + if (this.query && + util.isObject(this.query) && + Object.keys(this.query).length) { + query = querystring.stringify(this.query); + } + + var search = this.search || (query && ('?' + query)) || ''; + + if (protocol && protocol.substr(-1) !== ':') protocol += ':'; + + // only the slashedProtocols get the //. Not mailto:, xmpp:, etc. + // unless they had them to begin with. + if (this.slashes || + (!protocol || slashedProtocol[protocol]) && host !== false) { + host = '//' + (host || ''); + if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname; + } else if (!host) { + host = ''; + } + + if (hash && hash.charAt(0) !== '#') hash = '#' + hash; + if (search && search.charAt(0) !== '?') search = '?' + search; + + pathname = pathname.replace(/[?#]/g, function(match) { + return encodeURIComponent(match); + }); + search = search.replace('#', '%23'); + + return protocol + host + pathname + search + hash; + }; + + function urlResolve(source, relative) { + return urlParse(source, false, true).resolve(relative); + } + + Url.prototype.resolve = function(relative) { + return this.resolveObject(urlParse(relative, false, true)).format(); + }; + + function urlResolveObject(source, relative) { + if (!source) return relative; + return urlParse(source, false, true).resolveObject(relative); + } + + Url.prototype.resolveObject = function(relative) { + if (util.isString(relative)) { + var rel = new Url(); + rel.parse(relative, false, true); + relative = rel; + } + + var result = new Url(); + var tkeys = Object.keys(this); + for (var tk = 0; tk < tkeys.length; tk++) { + var tkey = tkeys[tk]; + result[tkey] = this[tkey]; + } + + // hash is always overridden, no matter what. + // even href="" will remove it. + result.hash = relative.hash; + + // if the relative url is empty, then there's nothing left to do here. + if (relative.href === '') { + result.href = result.format(); + return result; + } + + // hrefs like //foo/bar always cut to the protocol. + if (relative.slashes && !relative.protocol) { + // take everything except the protocol from relative + var rkeys = Object.keys(relative); + for (var rk = 0; rk < rkeys.length; rk++) { + var rkey = rkeys[rk]; + if (rkey !== 'protocol') + result[rkey] = relative[rkey]; + } + + //urlParse appends trailing / to urls like http://www.example.com + if (slashedProtocol[result.protocol] && + result.hostname && !result.pathname) { + result.path = result.pathname = '/'; + } + + result.href = result.format(); + return result; + } + + if (relative.protocol && relative.protocol !== result.protocol) { + // if it's a known url protocol, then changing + // the protocol does weird things + // first, if it's not file:, then we MUST have a host, + // and if there was a path + // to begin with, then we MUST have a path. + // if it is file:, then the host is dropped, + // because that's known to be hostless. + // anything else is assumed to be absolute. + if (!slashedProtocol[relative.protocol]) { + var keys = Object.keys(relative); + for (var v = 0; v < keys.length; v++) { + var k = keys[v]; + result[k] = relative[k]; + } + result.href = result.format(); + return result; + } + + result.protocol = relative.protocol; + if (!relative.host && !hostlessProtocol[relative.protocol]) { + var relPath = (relative.pathname || '').split('/'); + while (relPath.length && !(relative.host = relPath.shift())); + if (!relative.host) relative.host = ''; + if (!relative.hostname) relative.hostname = ''; + if (relPath[0] !== '') relPath.unshift(''); + if (relPath.length < 2) relPath.unshift(''); + result.pathname = relPath.join('/'); + } else { + result.pathname = relative.pathname; + } + result.search = relative.search; + result.query = relative.query; + result.host = relative.host || ''; + result.auth = relative.auth; + result.hostname = relative.hostname || relative.host; + result.port = relative.port; + // to support http.request + if (result.pathname || result.search) { + var p = result.pathname || ''; + var s = result.search || ''; + result.path = p + s; + } + result.slashes = result.slashes || relative.slashes; + result.href = result.format(); + return result; + } + + var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'), + isRelAbs = ( + relative.host || + relative.pathname && relative.pathname.charAt(0) === '/' + ), + mustEndAbs = (isRelAbs || isSourceAbs || + (result.host && relative.pathname)), + removeAllDots = mustEndAbs, + srcPath = result.pathname && result.pathname.split('/') || [], + relPath = relative.pathname && relative.pathname.split('/') || [], + psychotic = result.protocol && !slashedProtocol[result.protocol]; + + // if the url is a non-slashed url, then relative + // links like ../.. should be able + // to crawl up to the hostname, as well. This is strange. + // result.protocol has already been set by now. + // Later on, put the first path part into the host field. + if (psychotic) { + result.hostname = ''; + result.port = null; + if (result.host) { + if (srcPath[0] === '') srcPath[0] = result.host; + else srcPath.unshift(result.host); + } + result.host = ''; + if (relative.protocol) { + relative.hostname = null; + relative.port = null; + if (relative.host) { + if (relPath[0] === '') relPath[0] = relative.host; + else relPath.unshift(relative.host); + } + relative.host = null; + } + mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === ''); + } + + if (isRelAbs) { + // it's absolute. + result.host = (relative.host || relative.host === '') ? + relative.host : result.host; + result.hostname = (relative.hostname || relative.hostname === '') ? + relative.hostname : result.hostname; + result.search = relative.search; + result.query = relative.query; + srcPath = relPath; + // fall through to the dot-handling below. + } else if (relPath.length) { + // it's relative + // throw away the existing file, and take the new path instead. + if (!srcPath) srcPath = []; + srcPath.pop(); + srcPath = srcPath.concat(relPath); + result.search = relative.search; + result.query = relative.query; + } else if (!util.isNullOrUndefined(relative.search)) { + // just pull out the search. + // like href='?foo'. + // Put this after the other two cases because it simplifies the booleans + if (psychotic) { + result.hostname = result.host = srcPath.shift(); + //occationaly the auth can get stuck only in host + //this especially happens in cases like + //url.resolveObject('mailto:local1@domain1', 'local2@domain2') + var authInHost = result.host && result.host.indexOf('@') > 0 ? + result.host.split('@') : false; + if (authInHost) { + result.auth = authInHost.shift(); + result.host = result.hostname = authInHost.shift(); + } + } + result.search = relative.search; + result.query = relative.query; + //to support http.request + if (!util.isNull(result.pathname) || !util.isNull(result.search)) { + result.path = (result.pathname ? result.pathname : '') + + (result.search ? result.search : ''); + } + result.href = result.format(); + return result; + } + + if (!srcPath.length) { + // no path at all. easy. + // we've already handled the other stuff above. + result.pathname = null; + //to support http.request + if (result.search) { + result.path = '/' + result.search; + } else { + result.path = null; + } + result.href = result.format(); + return result; + } + + // if a url ENDs in . or .., then it must get a trailing slash. + // however, if it ends in anything else non-slashy, + // then it must NOT get a trailing slash. + var last = srcPath.slice(-1)[0]; + var hasTrailingSlash = ( + (result.host || relative.host || srcPath.length > 1) && + (last === '.' || last === '..') || last === ''); + + // strip single dots, resolve double dots to parent dir + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = srcPath.length; i >= 0; i--) { + last = srcPath[i]; + if (last === '.') { + srcPath.splice(i, 1); + } else if (last === '..') { + srcPath.splice(i, 1); + up++; + } else if (up) { + srcPath.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (!mustEndAbs && !removeAllDots) { + for (; up--; up) { + srcPath.unshift('..'); + } + } + + if (mustEndAbs && srcPath[0] !== '' && + (!srcPath[0] || srcPath[0].charAt(0) !== '/')) { + srcPath.unshift(''); + } + + if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) { + srcPath.push(''); + } + + var isAbsolute = srcPath[0] === '' || + (srcPath[0] && srcPath[0].charAt(0) === '/'); + + // put the host back + if (psychotic) { + result.hostname = result.host = isAbsolute ? '' : + srcPath.length ? srcPath.shift() : ''; + //occationaly the auth can get stuck only in host + //this especially happens in cases like + //url.resolveObject('mailto:local1@domain1', 'local2@domain2') + var authInHost = result.host && result.host.indexOf('@') > 0 ? + result.host.split('@') : false; + if (authInHost) { + result.auth = authInHost.shift(); + result.host = result.hostname = authInHost.shift(); + } + } + + mustEndAbs = mustEndAbs || (result.host && srcPath.length); + + if (mustEndAbs && !isAbsolute) { + srcPath.unshift(''); + } + + if (!srcPath.length) { + result.pathname = null; + result.path = null; + } else { + result.pathname = srcPath.join('/'); + } + + //to support request.http + if (!util.isNull(result.pathname) || !util.isNull(result.search)) { + result.path = (result.pathname ? result.pathname : '') + + (result.search ? result.search : ''); + } + result.auth = relative.auth || result.auth; + result.slashes = result.slashes || relative.slashes; + result.href = result.format(); + return result; + }; + + Url.prototype.parseHost = function() { + var host = this.host; + var port = portPattern.exec(host); + if (port) { + port = port[0]; + if (port !== ':') { + this.port = port.substr(1); + } + host = host.substr(0, host.length - port.length); + } + if (host) this.hostname = host; + }; + + var url$1 = { + parse: parse, + resolve: resolve, + resolveObject: resolveObject, + format: format, + Url: Url_1 + }; + + const url = { + parse: parse, + format: format, + resolve: resolve + }; + + function assertPath(path2) { + if (typeof path2 !== "string") { + throw new TypeError(`Path must be a string. Received ${JSON.stringify(path2)}`); + } + } + function removeUrlParams(url) { + const re = url.split("?")[0]; + return re.split("#")[0]; + } + function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function replaceAll(str, find, replace) { + return str.replace(new RegExp(escapeRegExp(find), "g"), replace); + } + function normalizeStringPosix(path2, allowAboveRoot) { + let res = ""; + let lastSegmentLength = 0; + let lastSlash = -1; + let dots = 0; + let code = -1; + for (let i = 0; i <= path2.length; ++i) { + if (i < path2.length) { + code = path2.charCodeAt(i); + } else if (code === 47) { + break; + } else { + code = 47; + } + if (code === 47) { + if (lastSlash === i - 1 || dots === 1) { + } else if (lastSlash !== i - 1 && dots === 2) { + if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 || res.charCodeAt(res.length - 2) !== 46) { + if (res.length > 2) { + const lastSlashIndex = res.lastIndexOf("/"); + if (lastSlashIndex !== res.length - 1) { + if (lastSlashIndex === -1) { + res = ""; + lastSegmentLength = 0; + } else { + res = res.slice(0, lastSlashIndex); + lastSegmentLength = res.length - 1 - res.lastIndexOf("/"); + } + lastSlash = i; + dots = 0; + continue; + } + } else if (res.length === 2 || res.length === 1) { + res = ""; + lastSegmentLength = 0; + lastSlash = i; + dots = 0; + continue; + } + } + if (allowAboveRoot) { + if (res.length > 0) { + res += "/.."; + } else { + res = ".."; + } + lastSegmentLength = 2; + } + } else { + if (res.length > 0) { + res += `/${path2.slice(lastSlash + 1, i)}`; + } else { + res = path2.slice(lastSlash + 1, i); + } + lastSegmentLength = i - lastSlash - 1; + } + lastSlash = i; + dots = 0; + } else if (code === 46 && dots !== -1) { + ++dots; + } else { + dots = -1; + } + } + return res; + } + const path = { + toPosix(path2) { + return replaceAll(path2, "\\", "/"); + }, + isUrl(path2) { + return /^https?:/.test(this.toPosix(path2)); + }, + isDataUrl(path2) { + return /^data:([a-z]+\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s<>]*?)$/i.test(path2); + }, + hasProtocol(path2) { + return /^[^/:]+:\//.test(this.toPosix(path2)); + }, + getProtocol(path2) { + assertPath(path2); + path2 = this.toPosix(path2); + let protocol = ""; + const isFile = /^file:\/\/\//.exec(path2); + const isHttp = /^[^/:]+:\/\//.exec(path2); + const isWindows = /^[^/:]+:\//.exec(path2); + if (isFile || isHttp || isWindows) { + const arr = isFile?.[0] || isHttp?.[0] || isWindows?.[0]; + protocol = arr; + path2 = path2.slice(arr.length); + } + return protocol; + }, + toAbsolute(url, customBaseUrl, customRootUrl) { + if (this.isDataUrl(url)) + return url; + const baseUrl = removeUrlParams(this.toPosix(customBaseUrl ?? settings.ADAPTER.getBaseUrl())); + const rootUrl = removeUrlParams(this.toPosix(customRootUrl ?? this.rootname(baseUrl))); + assertPath(url); + url = this.toPosix(url); + if (url.startsWith("/")) { + return path.join(rootUrl, url.slice(1)); + } + const absolutePath = this.isAbsolute(url) ? url : this.join(baseUrl, url); + return absolutePath; + }, + normalize(path2) { + path2 = this.toPosix(path2); + assertPath(path2); + if (path2.length === 0) + return "."; + let protocol = ""; + const isAbsolute = path2.startsWith("/"); + if (this.hasProtocol(path2)) { + protocol = this.rootname(path2); + path2 = path2.slice(protocol.length); + } + const trailingSeparator = path2.endsWith("/"); + path2 = normalizeStringPosix(path2, false); + if (path2.length > 0 && trailingSeparator) + path2 += "/"; + if (isAbsolute) + return `/${path2}`; + return protocol + path2; + }, + isAbsolute(path2) { + assertPath(path2); + path2 = this.toPosix(path2); + if (this.hasProtocol(path2)) + return true; + return path2.startsWith("/"); + }, + join(...segments) { + if (segments.length === 0) { + return "."; + } + let joined; + for (let i = 0; i < segments.length; ++i) { + const arg = segments[i]; + assertPath(arg); + if (arg.length > 0) { + if (joined === void 0) + joined = arg; + else { + const prevArg = segments[i - 1] ?? ""; + if (this.extname(prevArg)) { + joined += `/../${arg}`; + } else { + joined += `/${arg}`; + } + } + } + } + if (joined === void 0) { + return "."; + } + return this.normalize(joined); + }, + dirname(path2) { + assertPath(path2); + if (path2.length === 0) + return "."; + path2 = this.toPosix(path2); + let code = path2.charCodeAt(0); + const hasRoot = code === 47; + let end = -1; + let matchedSlash = true; + const proto = this.getProtocol(path2); + const origpath = path2; + path2 = path2.slice(proto.length); + for (let i = path2.length - 1; i >= 1; --i) { + code = path2.charCodeAt(i); + if (code === 47) { + if (!matchedSlash) { + end = i; + break; + } + } else { + matchedSlash = false; + } + } + if (end === -1) + return hasRoot ? "/" : this.isUrl(origpath) ? proto + path2 : proto; + if (hasRoot && end === 1) + return "//"; + return proto + path2.slice(0, end); + }, + rootname(path2) { + assertPath(path2); + path2 = this.toPosix(path2); + let root = ""; + if (path2.startsWith("/")) + root = "/"; + else { + root = this.getProtocol(path2); + } + if (this.isUrl(path2)) { + const index = path2.indexOf("/", root.length); + if (index !== -1) { + root = path2.slice(0, index); + } else + root = path2; + if (!root.endsWith("/")) + root += "/"; + } + return root; + }, + basename(path2, ext) { + assertPath(path2); + if (ext) + assertPath(ext); + path2 = removeUrlParams(this.toPosix(path2)); + let start = 0; + let end = -1; + let matchedSlash = true; + let i; + if (ext !== void 0 && ext.length > 0 && ext.length <= path2.length) { + if (ext.length === path2.length && ext === path2) + return ""; + let extIdx = ext.length - 1; + let firstNonSlashEnd = -1; + for (i = path2.length - 1; i >= 0; --i) { + const code = path2.charCodeAt(i); + if (code === 47) { + if (!matchedSlash) { + start = i + 1; + break; + } + } else { + if (firstNonSlashEnd === -1) { + matchedSlash = false; + firstNonSlashEnd = i + 1; + } + if (extIdx >= 0) { + if (code === ext.charCodeAt(extIdx)) { + if (--extIdx === -1) { + end = i; + } + } else { + extIdx = -1; + end = firstNonSlashEnd; + } + } + } + } + if (start === end) + end = firstNonSlashEnd; + else if (end === -1) + end = path2.length; + return path2.slice(start, end); + } + for (i = path2.length - 1; i >= 0; --i) { + if (path2.charCodeAt(i) === 47) { + if (!matchedSlash) { + start = i + 1; + break; + } + } else if (end === -1) { + matchedSlash = false; + end = i + 1; + } + } + if (end === -1) + return ""; + return path2.slice(start, end); + }, + extname(path2) { + assertPath(path2); + path2 = removeUrlParams(this.toPosix(path2)); + let startDot = -1; + let startPart = 0; + let end = -1; + let matchedSlash = true; + let preDotState = 0; + for (let i = path2.length - 1; i >= 0; --i) { + const code = path2.charCodeAt(i); + if (code === 47) { + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + matchedSlash = false; + end = i + 1; + } + if (code === 46) { + if (startDot === -1) + startDot = i; + else if (preDotState !== 1) + preDotState = 1; + } else if (startDot !== -1) { + preDotState = -1; + } + } + if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { + return ""; + } + return path2.slice(startDot, end); + }, + parse(path2) { + assertPath(path2); + const ret = { root: "", dir: "", base: "", ext: "", name: "" }; + if (path2.length === 0) + return ret; + path2 = removeUrlParams(this.toPosix(path2)); + let code = path2.charCodeAt(0); + const isAbsolute = this.isAbsolute(path2); + let start; + const protocol = ""; + ret.root = this.rootname(path2); + if (isAbsolute || this.hasProtocol(path2)) { + start = 1; + } else { + start = 0; + } + let startDot = -1; + let startPart = 0; + let end = -1; + let matchedSlash = true; + let i = path2.length - 1; + let preDotState = 0; + for (; i >= start; --i) { + code = path2.charCodeAt(i); + if (code === 47) { + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + matchedSlash = false; + end = i + 1; + } + if (code === 46) { + if (startDot === -1) + startDot = i; + else if (preDotState !== 1) + preDotState = 1; + } else if (startDot !== -1) { + preDotState = -1; + } + } + if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { + if (end !== -1) { + if (startPart === 0 && isAbsolute) + ret.base = ret.name = path2.slice(1, end); + else + ret.base = ret.name = path2.slice(startPart, end); + } + } else { + if (startPart === 0 && isAbsolute) { + ret.name = path2.slice(1, startDot); + ret.base = path2.slice(1, end); + } else { + ret.name = path2.slice(startPart, startDot); + ret.base = path2.slice(startPart, end); + } + ret.ext = path2.slice(startDot, end); + } + ret.dir = this.dirname(path2); + if (protocol) + ret.dir = protocol + ret.dir; + return ret; + }, + sep: "/", + delimiter: ":" + }; + + const warnings = {}; + function deprecation(version, message, ignoreDepth = 3) { + if (warnings[message]) { + return; + } + let stack = new Error().stack; + if (typeof stack === "undefined") { + console.warn("PixiJS Deprecation Warning: ", `${message} +Deprecated since v${version}`); + } else { + stack = stack.split("\n").splice(ignoreDepth).join("\n"); + if (console.groupCollapsed) { + console.groupCollapsed("%cPixiJS Deprecation Warning: %c%s", "color:#614108;background:#fffbe6", "font-weight:normal;color:#614108;background:#fffbe6", `${message} +Deprecated since v${version}`); + console.warn(stack); + console.groupEnd(); + } else { + console.warn("PixiJS Deprecation Warning: ", `${message} +Deprecated since v${version}`); + console.warn(stack); + } + } + warnings[message] = true; + } + + function skipHello() { + deprecation("7.0.0", "skipHello is deprecated, please use settings.RENDER_OPTIONS.hello"); + } + function sayHello() { + deprecation("7.0.0", `sayHello is deprecated, please use Renderer's "hello" option`); + } + + let supported; + function isWebGLSupported() { + if (typeof supported === "undefined") { + supported = function supported2() { + const contextOptions = { + stencil: true, + failIfMajorPerformanceCaveat: settings.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT + }; + try { + if (!settings.ADAPTER.getWebGLRenderingContext()) { + return false; + } + const canvas = settings.ADAPTER.createCanvas(); + let gl = canvas.getContext("webgl", contextOptions) || canvas.getContext("experimental-webgl", contextOptions); + const success = !!gl?.getContextAttributes()?.stencil; + if (gl) { + const loseContext = gl.getExtension("WEBGL_lose_context"); + if (loseContext) { + loseContext.loseContext(); + } + } + gl = null; + return success; + } catch (e) { + return false; + } + }(); + } + return supported; + } + + var r={grad:.9,turn:360,rad:360/(2*Math.PI)},t=function(r){return "string"==typeof r?r.length>0:"number"==typeof r},n=function(r,t,n){return void 0===t&&(t=0),void 0===n&&(n=Math.pow(10,t)),Math.round(n*r)/n+0},e=function(r,t,n){return void 0===t&&(t=0),void 0===n&&(n=1),r>n?n:r>t?r:t},u=function(r){return (r=isFinite(r)?r%360:0)>0?r:r+360},a=function(r){return {r:e(r.r,0,255),g:e(r.g,0,255),b:e(r.b,0,255),a:e(r.a)}},o=function(r){return {r:n(r.r),g:n(r.g),b:n(r.b),a:n(r.a,3)}},i=/^#([0-9a-f]{3,8})$/i,s=function(r){var t=r.toString(16);return t.length<2?"0"+t:t},h=function(r){var t=r.r,n=r.g,e=r.b,u=r.a,a=Math.max(t,n,e),o=a-Math.min(t,n,e),i=o?a===t?(n-e)/o:a===n?2+(e-t)/o:4+(t-n)/o:0;return {h:60*(i<0?i+6:i),s:a?o/a*100:0,v:a/255*100,a:u}},b=function(r){var t=r.h,n=r.s,e=r.v,u=r.a;t=t/360*6,n/=100,e/=100;var a=Math.floor(t),o=e*(1-n),i=e*(1-(t-a)*n),s=e*(1-(1-t+a)*n),h=a%6;return {r:255*[e,i,o,o,s,e][h],g:255*[s,e,e,i,o,o][h],b:255*[o,o,s,e,e,i][h],a:u}},g=function(r){return {h:u(r.h),s:e(r.s,0,100),l:e(r.l,0,100),a:e(r.a)}},d=function(r){return {h:n(r.h),s:n(r.s),l:n(r.l),a:n(r.a,3)}},f=function(r){return b((n=(t=r).s,{h:t.h,s:(n*=((e=t.l)<50?e:100-e)/100)>0?2*n/(e+n)*100:0,v:e+n,a:t.a}));var t,n,e;},c=function(r){return {h:(t=h(r)).h,s:(u=(200-(n=t.s))*(e=t.v)/100)>0&&u<200?n*e/100/(u<=100?u:200-u)*100:0,l:u/2,a:t.a};var t,n,e,u;},l=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,p=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,v=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,m=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,y={string:[[function(r){var t=i.exec(r);return t?(r=t[1]).length<=4?{r:parseInt(r[0]+r[0],16),g:parseInt(r[1]+r[1],16),b:parseInt(r[2]+r[2],16),a:4===r.length?n(parseInt(r[3]+r[3],16)/255,2):1}:6===r.length||8===r.length?{r:parseInt(r.substr(0,2),16),g:parseInt(r.substr(2,2),16),b:parseInt(r.substr(4,2),16),a:8===r.length?n(parseInt(r.substr(6,2),16)/255,2):1}:null:null},"hex"],[function(r){var t=v.exec(r)||m.exec(r);return t?t[2]!==t[4]||t[4]!==t[6]?null:a({r:Number(t[1])/(t[2]?100/255:1),g:Number(t[3])/(t[4]?100/255:1),b:Number(t[5])/(t[6]?100/255:1),a:void 0===t[7]?1:Number(t[7])/(t[8]?100:1)}):null},"rgb"],[function(t){var n=l.exec(t)||p.exec(t);if(!n)return null;var e,u,a=g({h:(e=n[1],u=n[2],void 0===u&&(u="deg"),Number(e)*(r[u]||1)),s:Number(n[3]),l:Number(n[4]),a:void 0===n[5]?1:Number(n[5])/(n[6]?100:1)});return f(a)},"hsl"]],object:[[function(r){var n=r.r,e=r.g,u=r.b,o=r.a,i=void 0===o?1:o;return t(n)&&t(e)&&t(u)?a({r:Number(n),g:Number(e),b:Number(u),a:Number(i)}):null},"rgb"],[function(r){var n=r.h,e=r.s,u=r.l,a=r.a,o=void 0===a?1:a;if(!t(n)||!t(e)||!t(u))return null;var i=g({h:Number(n),s:Number(e),l:Number(u),a:Number(o)});return f(i)},"hsl"],[function(r){var n=r.h,a=r.s,o=r.v,i=r.a,s=void 0===i?1:i;if(!t(n)||!t(a)||!t(o))return null;var h=function(r){return {h:u(r.h),s:e(r.s,0,100),v:e(r.v,0,100),a:e(r.a)}}({h:Number(n),s:Number(a),v:Number(o),a:Number(s)});return b(h)},"hsv"]]},N=function(r,t){for(var n=0;n=.5},r.prototype.toHex=function(){return r=o(this.rgba),t=r.r,e=r.g,u=r.b,i=(a=r.a)<1?s(n(255*a)):"","#"+s(t)+s(e)+s(u)+i;var r,t,e,u,a,i;},r.prototype.toRgb=function(){return o(this.rgba)},r.prototype.toRgbString=function(){return r=o(this.rgba),t=r.r,n=r.g,e=r.b,(u=r.a)<1?"rgba("+t+", "+n+", "+e+", "+u+")":"rgb("+t+", "+n+", "+e+")";var r,t,n,e,u;},r.prototype.toHsl=function(){return d(c(this.rgba))},r.prototype.toHslString=function(){return r=d(c(this.rgba)),t=r.h,n=r.s,e=r.l,(u=r.a)<1?"hsla("+t+", "+n+"%, "+e+"%, "+u+")":"hsl("+t+", "+n+"%, "+e+"%)";var r,t,n,e,u;},r.prototype.toHsv=function(){return r=h(this.rgba),{h:n(r.h),s:n(r.s),v:n(r.v),a:n(r.a,3)};var r;},r.prototype.invert=function(){return w({r:255-(r=this.rgba).r,g:255-r.g,b:255-r.b,a:r.a});var r;},r.prototype.saturate=function(r){return void 0===r&&(r=.1),w(M(this.rgba,r))},r.prototype.desaturate=function(r){return void 0===r&&(r=.1),w(M(this.rgba,-r))},r.prototype.grayscale=function(){return w(M(this.rgba,-1))},r.prototype.lighten=function(r){return void 0===r&&(r=.1),w($(this.rgba,r))},r.prototype.darken=function(r){return void 0===r&&(r=.1),w($(this.rgba,-r))},r.prototype.rotate=function(r){return void 0===r&&(r=15),this.hue(this.hue()+r)},r.prototype.alpha=function(r){return "number"==typeof r?w({r:(t=this.rgba).r,g:t.g,b:t.b,a:r}):n(this.rgba.a,3);var t;},r.prototype.hue=function(r){var t=c(this.rgba);return "number"==typeof r?w({h:r,s:t.s,l:t.l,a:t.a}):n(t.h)},r.prototype.isEqual=function(r){return this.toHex()===w(r).toHex()},r}(),w=function(r){return r instanceof j?r:new j(r)},S=[],k=function(r){r.forEach(function(r){S.indexOf(r)<0&&(r(j,y),S.push(r));});},E=function(){return new j({r:255*Math.random(),g:255*Math.random(),b:255*Math.random()})}; + + function namesPlugin(e,f){var a={white:"#ffffff",bisque:"#ffe4c4",blue:"#0000ff",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",antiquewhite:"#faebd7",aqua:"#00ffff",azure:"#f0ffff",whitesmoke:"#f5f5f5",papayawhip:"#ffefd5",plum:"#dda0dd",blanchedalmond:"#ffebcd",black:"#000000",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",cornsilk:"#fff8dc",cornflowerblue:"#6495ed",burlywood:"#deb887",aquamarine:"#7fffd4",beige:"#f5f5dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkkhaki:"#bdb76b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",peachpuff:"#ffdab9",darkmagenta:"#8b008b",darkred:"#8b0000",darkorchid:"#9932cc",darkorange:"#ff8c00",darkslateblue:"#483d8b",gray:"#808080",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",deeppink:"#ff1493",deepskyblue:"#00bfff",wheat:"#f5deb3",firebrick:"#b22222",floralwhite:"#fffaf0",ghostwhite:"#f8f8ff",darkviolet:"#9400d3",magenta:"#ff00ff",green:"#008000",dodgerblue:"#1e90ff",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",blueviolet:"#8a2be2",forestgreen:"#228b22",lawngreen:"#7cfc00",indianred:"#cd5c5c",indigo:"#4b0082",fuchsia:"#ff00ff",brown:"#a52a2a",maroon:"#800000",mediumblue:"#0000cd",lightcoral:"#f08080",darkturquoise:"#00ced1",lightcyan:"#e0ffff",ivory:"#fffff0",lightyellow:"#ffffe0",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",linen:"#faf0e6",mediumaquamarine:"#66cdaa",lemonchiffon:"#fffacd",lime:"#00ff00",khaki:"#f0e68c",mediumseagreen:"#3cb371",limegreen:"#32cd32",mediumspringgreen:"#00fa9a",lightskyblue:"#87cefa",lightblue:"#add8e6",midnightblue:"#191970",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",mintcream:"#f5fffa",lightslategray:"#778899",lightslategrey:"#778899",navajowhite:"#ffdead",navy:"#000080",mediumvioletred:"#c71585",powderblue:"#b0e0e6",palegoldenrod:"#eee8aa",oldlace:"#fdf5e6",paleturquoise:"#afeeee",mediumturquoise:"#48d1cc",mediumorchid:"#ba55d3",rebeccapurple:"#663399",lightsteelblue:"#b0c4de",mediumslateblue:"#7b68ee",thistle:"#d8bfd8",tan:"#d2b48c",orchid:"#da70d6",mediumpurple:"#9370db",purple:"#800080",pink:"#ffc0cb",skyblue:"#87ceeb",springgreen:"#00ff7f",palegreen:"#98fb98",red:"#ff0000",yellow:"#ffff00",slateblue:"#6a5acd",lavenderblush:"#fff0f5",peru:"#cd853f",palevioletred:"#db7093",violet:"#ee82ee",teal:"#008080",slategray:"#708090",slategrey:"#708090",aliceblue:"#f0f8ff",darkseagreen:"#8fbc8f",darkolivegreen:"#556b2f",greenyellow:"#adff2f",seagreen:"#2e8b57",seashell:"#fff5ee",tomato:"#ff6347",silver:"#c0c0c0",sienna:"#a0522d",lavender:"#e6e6fa",lightgreen:"#90ee90",orange:"#ffa500",orangered:"#ff4500",steelblue:"#4682b4",royalblue:"#4169e1",turquoise:"#40e0d0",yellowgreen:"#9acd32",salmon:"#fa8072",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",darksalmon:"#e9967a",lightgoldenrodyellow:"#fafad2",snow:"#fffafa",lightgrey:"#d3d3d3",lightgray:"#d3d3d3",dimgray:"#696969",dimgrey:"#696969",olivedrab:"#6b8e23",olive:"#808000"},r={};for(var d in a)r[a[d]]=d;var l={};e.prototype.toName=function(f){if(!(this.rgba.a||this.rgba.r||this.rgba.g||this.rgba.b))return "transparent";var d,i,n=r[this.toHex()];if(n)return n;if(null==f?void 0:f.closest){var o=this.toRgb(),t=1/0,b="black";if(!l.length)for(var c in a)l[c]=new e(a[c]).toRgb();for(var g in a){var u=(d=o,i=l[g],Math.pow(d.r-i.r,2)+Math.pow(d.g-i.g,2)+Math.pow(d.b-i.b,2));u> 16) + (value & 65280) + ((value & 255) << 16); + } + multiply(value) { + const [r, g, b, a] = _Color.temp.setValue(value)._components; + this._components[0] *= r; + this._components[1] *= g; + this._components[2] *= b; + this._components[3] *= a; + this.refreshInt(); + this._value = null; + return this; + } + premultiply(alpha, applyToRGB = true) { + if (applyToRGB) { + this._components[0] *= alpha; + this._components[1] *= alpha; + this._components[2] *= alpha; + } + this._components[3] = alpha; + this.refreshInt(); + this._value = null; + return this; + } + toPremultiplied(alpha) { + if (alpha === 1) { + return (alpha * 255 << 24) + this._int; + } + if (alpha === 0) { + return 0; + } + let r = this._int >> 16 & 255; + let g = this._int >> 8 & 255; + let b = this._int & 255; + r = r * alpha + 0.5 | 0; + g = g * alpha + 0.5 | 0; + b = b * alpha + 0.5 | 0; + return (alpha * 255 << 24) + (r << 16) + (g << 8) + b; + } + toHex() { + const hexString = this._int.toString(16); + return `#${"000000".substring(0, 6 - hexString.length) + hexString}`; + } + toHexa() { + const alphaValue = Math.round(this._components[3] * 255); + const alphaString = alphaValue.toString(16); + return this.toHex() + "00".substring(0, 2 - alphaString.length) + alphaString; + } + setAlpha(alpha) { + this._components[3] = alpha; + return this; + } + round(step) { + const [r, g, b] = this._components; + this._components.set([ + Math.min(255, r / step * step), + Math.min(255, g / step * step), + Math.min(255, b / step * step) + ]); + this.refreshInt(); + this._value = null; + return this; + } + toArray(out) { + out = out ?? []; + const [r, g, b, a] = this._components; + out[0] = r; + out[1] = g; + out[2] = b; + out[3] = a; + return out; + } + normalize(value) { + let components; + if ((typeof value === "number" || value instanceof Number) && value >= 0 && value <= 16777215) { + const int = value; + components = [ + (int >> 16 & 255) / 255, + (int >> 8 & 255) / 255, + (int & 255) / 255, + 1 + ]; + } else if ((Array.isArray(value) || value instanceof Float32Array) && value.length >= 3 && value.length <= 4 && value.every((v) => v <= 1 && v >= 0)) { + const [r, g, b, a = 1] = value; + components = [r, g, b, a]; + } else if ((value instanceof Uint8Array || value instanceof Uint8ClampedArray) && value.length >= 3 && value.length <= 4) { + const [r, g, b, a = 255] = value; + components = [r / 255, g / 255, b / 255, a / 255]; + } else if (typeof value === "string" || typeof value === "object") { + if (typeof value === "string") { + const match = _Color.HEX_PATTERN.exec(value); + if (match) { + value = `#${match[2]}`; + } + } + const color = w(value); + if (color.isValid()) { + const { r, g, b, a } = color.rgba; + components = [r / 255, g / 255, b / 255, a]; + } + } + if (components) { + this._components.set(components); + this.refreshInt(); + } else { + throw new Error(`Unable to convert color ${value}`); + } + } + refreshInt() { + const [r, g, b] = this._components; + this._int = (r * 255 << 16) + (g * 255 << 8) + (b * 255 | 0); + } + }; + let Color = _Color; + Color.shared = new _Color(); + Color.temp = new _Color(); + Color.HEX_PATTERN = /^(#|0x)?(([a-f0-9]{3}){1,2}([a-f0-9]{2})?)$/i; + + function hex2rgb(hex, out = []) { + deprecation("7.2.0", "utils.hex2rgb is deprecated, use Color#toRgbArray instead"); + return Color.shared.setValue(hex).toRgbArray(out); + } + function hex2string(hex) { + deprecation("7.2.0", "utils.hex2string is deprecated, use Color#toHex instead"); + return Color.shared.setValue(hex).toHex(); + } + function string2hex(string) { + deprecation("7.2.0", "utils.string2hex is deprecated, use Color#toNumber instead"); + return Color.shared.setValue(string).toNumber(); + } + function rgb2hex(rgb) { + deprecation("7.2.0", "utils.rgb2hex is deprecated, use Color#toNumber instead"); + return Color.shared.setValue(rgb).toNumber(); + } + + function mapPremultipliedBlendModes() { + const pm = []; + const npm = []; + for (let i = 0; i < 32; i++) { + pm[i] = i; + npm[i] = i; + } + pm[BLEND_MODES.NORMAL_NPM] = BLEND_MODES.NORMAL; + pm[BLEND_MODES.ADD_NPM] = BLEND_MODES.ADD; + pm[BLEND_MODES.SCREEN_NPM] = BLEND_MODES.SCREEN; + npm[BLEND_MODES.NORMAL] = BLEND_MODES.NORMAL_NPM; + npm[BLEND_MODES.ADD] = BLEND_MODES.ADD_NPM; + npm[BLEND_MODES.SCREEN] = BLEND_MODES.SCREEN_NPM; + const array = []; + array.push(npm); + array.push(pm); + return array; + } + const premultiplyBlendMode = mapPremultipliedBlendModes(); + function correctBlendMode(blendMode, premultiplied) { + return premultiplyBlendMode[premultiplied ? 1 : 0][blendMode]; + } + function premultiplyRgba(rgb, alpha, out, premultiply = true) { + deprecation("7.2.0", `utils.premultiplyRgba has moved to Color.premultiply`); + return Color.shared.setValue(rgb).premultiply(alpha, premultiply).toArray(out ?? new Float32Array(4)); + } + function premultiplyTint(tint, alpha) { + deprecation("7.2.0", `utils.premultiplyTint has moved to Color.toPremultiplied`); + return Color.shared.setValue(tint).toPremultiplied(alpha); + } + function premultiplyTintToRgba(tint, alpha, out, premultiply = true) { + deprecation("7.2.0", `utils.premultiplyTintToRgba has moved to Color.premultiply`); + return Color.shared.setValue(tint).premultiply(alpha, premultiply).toArray(out ?? new Float32Array(4)); + } + + const DATA_URI = /^\s*data:(?:([\w-]+)\/([\w+.-]+))?(?:;charset=([\w-]+))?(?:;(base64))?,(.*)/i; + + function createIndicesForQuads(size, outBuffer = null) { + const totalIndices = size * 6; + outBuffer = outBuffer || new Uint16Array(totalIndices); + if (outBuffer.length !== totalIndices) { + throw new Error(`Out buffer length is incorrect, got ${outBuffer.length} and expected ${totalIndices}`); + } + for (let i = 0, j = 0; i < totalIndices; i += 6, j += 4) { + outBuffer[i + 0] = j + 0; + outBuffer[i + 1] = j + 1; + outBuffer[i + 2] = j + 2; + outBuffer[i + 3] = j + 0; + outBuffer[i + 4] = j + 2; + outBuffer[i + 5] = j + 3; + } + return outBuffer; + } + + function getBufferType(array) { + if (array.BYTES_PER_ELEMENT === 4) { + if (array instanceof Float32Array) { + return "Float32Array"; + } else if (array instanceof Uint32Array) { + return "Uint32Array"; + } + return "Int32Array"; + } else if (array.BYTES_PER_ELEMENT === 2) { + if (array instanceof Uint16Array) { + return "Uint16Array"; + } + } else if (array.BYTES_PER_ELEMENT === 1) { + if (array instanceof Uint8Array) { + return "Uint8Array"; + } + } + return null; + } + + const map$2 = { Float32Array, Uint32Array, Int32Array, Uint8Array }; + function interleaveTypedArrays$1(arrays, sizes) { + let outSize = 0; + let stride = 0; + const views = {}; + for (let i = 0; i < arrays.length; i++) { + stride += sizes[i]; + outSize += arrays[i].length; + } + const buffer = new ArrayBuffer(outSize * 4); + let out = null; + let littleOffset = 0; + for (let i = 0; i < arrays.length; i++) { + const size = sizes[i]; + const array = arrays[i]; + const type = getBufferType(array); + if (!views[type]) { + views[type] = new map$2[type](buffer); + } + out = views[type]; + for (let j = 0; j < array.length; j++) { + const indexStart = (j / size | 0) * stride + littleOffset; + const index = j % size; + out[indexStart + index] = array[j]; + } + littleOffset += size; + } + return new Float32Array(buffer); + } + + function nextPow2(v) { + v += v === 0 ? 1 : 0; + --v; + v |= v >>> 1; + v |= v >>> 2; + v |= v >>> 4; + v |= v >>> 8; + v |= v >>> 16; + return v + 1; + } + function isPow2(v) { + return !(v & v - 1) && !!v; + } + function log2(v) { + let r = (v > 65535 ? 1 : 0) << 4; + v >>>= r; + let shift = (v > 255 ? 1 : 0) << 3; + v >>>= shift; + r |= shift; + shift = (v > 15 ? 1 : 0) << 2; + v >>>= shift; + r |= shift; + shift = (v > 3 ? 1 : 0) << 1; + v >>>= shift; + r |= shift; + return r | v >> 1; + } + + function removeItems(arr, startIdx, removeCount) { + const length = arr.length; + let i; + if (startIdx >= length || removeCount === 0) { + return; + } + removeCount = startIdx + removeCount > length ? length - startIdx : removeCount; + const len = length - removeCount; + for (i = startIdx; i < len; ++i) { + arr[i] = arr[i + removeCount]; + } + arr.length = len; + } + + function sign(n) { + if (n === 0) + return 0; + return n < 0 ? -1 : 1; + } + + let nextUid = 0; + function uid() { + return ++nextUid; + } + + const _BoundingBox = class { + constructor(left, top, right, bottom) { + this.left = left; + this.top = top; + this.right = right; + this.bottom = bottom; + } + get width() { + return this.right - this.left; + } + get height() { + return this.bottom - this.top; + } + isEmpty() { + return this.left === this.right || this.top === this.bottom; + } + }; + let BoundingBox = _BoundingBox; + BoundingBox.EMPTY = new _BoundingBox(0, 0, 0, 0); + + const ProgramCache = {}; + const TextureCache = /* @__PURE__ */ Object.create(null); + const BaseTextureCache = /* @__PURE__ */ Object.create(null); + function destroyTextureCache() { + let key; + for (key in TextureCache) { + TextureCache[key].destroy(); + } + for (key in BaseTextureCache) { + BaseTextureCache[key].destroy(); + } + } + function clearTextureCache() { + let key; + for (key in TextureCache) { + delete TextureCache[key]; + } + for (key in BaseTextureCache) { + delete BaseTextureCache[key]; + } + } + + class CanvasRenderTarget { + constructor(width, height, resolution) { + this._canvas = settings.ADAPTER.createCanvas(); + this._context = this._canvas.getContext("2d"); + this.resolution = resolution || settings.RESOLUTION; + this.resize(width, height); + } + clear() { + this._checkDestroyed(); + this._context.setTransform(1, 0, 0, 1, 0, 0); + this._context.clearRect(0, 0, this._canvas.width, this._canvas.height); + } + resize(desiredWidth, desiredHeight) { + this._checkDestroyed(); + this._canvas.width = Math.round(desiredWidth * this.resolution); + this._canvas.height = Math.round(desiredHeight * this.resolution); + } + destroy() { + this._context = null; + this._canvas = null; + } + get width() { + this._checkDestroyed(); + return this._canvas.width; + } + set width(val) { + this._checkDestroyed(); + this._canvas.width = Math.round(val); + } + get height() { + this._checkDestroyed(); + return this._canvas.height; + } + set height(val) { + this._checkDestroyed(); + this._canvas.height = Math.round(val); + } + get canvas() { + this._checkDestroyed(); + return this._canvas; + } + get context() { + this._checkDestroyed(); + return this._context; + } + _checkDestroyed() { + if (this._canvas === null) { + throw new TypeError("The CanvasRenderTarget has already been destroyed"); + } + } + } + + function checkRow(data, width, y) { + for (let x = 0, index = 4 * y * width; x < width; ++x, index += 4) { + if (data[index + 3] !== 0) + return false; + } + return true; + } + function checkColumn(data, width, x, top, bottom) { + const stride = 4 * width; + for (let y = top, index = top * stride + 4 * x; y <= bottom; ++y, index += stride) { + if (data[index + 3] !== 0) + return false; + } + return true; + } + function getCanvasBoundingBox(canvas) { + const { width, height } = canvas; + const context = canvas.getContext("2d", { + willReadFrequently: true + }); + if (context === null) { + throw new TypeError("Failed to get canvas 2D context"); + } + const imageData = context.getImageData(0, 0, width, height); + const data = imageData.data; + let left = 0; + let top = 0; + let right = width - 1; + let bottom = height - 1; + while (top < height && checkRow(data, width, top)) + ++top; + if (top === height) + return BoundingBox.EMPTY; + while (checkRow(data, width, bottom)) + --bottom; + while (checkColumn(data, width, left, top, bottom)) + ++left; + while (checkColumn(data, width, right, top, bottom)) + --right; + ++right; + ++bottom; + return new BoundingBox(left, top, right, bottom); + } + + function trimCanvas(canvas) { + const boundingBox = getCanvasBoundingBox(canvas); + const { width, height } = boundingBox; + let data = null; + if (!boundingBox.isEmpty()) { + const context = canvas.getContext("2d"); + if (context === null) { + throw new TypeError("Failed to get canvas 2D context"); + } + data = context.getImageData(boundingBox.left, boundingBox.top, width, height); + } + return { width, height, data }; + } + + function decomposeDataUri(dataUri) { + const dataUriMatch = DATA_URI.exec(dataUri); + if (dataUriMatch) { + return { + mediaType: dataUriMatch[1] ? dataUriMatch[1].toLowerCase() : void 0, + subType: dataUriMatch[2] ? dataUriMatch[2].toLowerCase() : void 0, + charset: dataUriMatch[3] ? dataUriMatch[3].toLowerCase() : void 0, + encoding: dataUriMatch[4] ? dataUriMatch[4].toLowerCase() : void 0, + data: dataUriMatch[5] + }; + } + return void 0; + } + + let tempAnchor; + function determineCrossOrigin(url$1, loc = globalThis.location) { + if (url$1.startsWith("data:")) { + return ""; + } + loc = loc || globalThis.location; + if (!tempAnchor) { + tempAnchor = document.createElement("a"); + } + tempAnchor.href = url$1; + const parsedUrl = url.parse(tempAnchor.href); + const samePort = !parsedUrl.port && loc.port === "" || parsedUrl.port === loc.port; + if (parsedUrl.hostname !== loc.hostname || !samePort || parsedUrl.protocol !== loc.protocol) { + return "anonymous"; + } + return ""; + } + + function getResolutionOfUrl(url, defaultValue = 1) { + const resolution = settings.RETINA_PREFIX?.exec(url); + if (resolution) { + return parseFloat(resolution[1]); + } + return defaultValue; + } + + var index = { + __proto__: null, + isMobile: isMobile, + EventEmitter: eventemitter3, + earcut: earcut_1, + url: url, + path: path, + sayHello: sayHello, + skipHello: skipHello, + isWebGLSupported: isWebGLSupported, + hex2rgb: hex2rgb, + hex2string: hex2string, + rgb2hex: rgb2hex, + string2hex: string2hex, + correctBlendMode: correctBlendMode, + premultiplyBlendMode: premultiplyBlendMode, + premultiplyRgba: premultiplyRgba, + premultiplyTint: premultiplyTint, + premultiplyTintToRgba: premultiplyTintToRgba, + DATA_URI: DATA_URI, + createIndicesForQuads: createIndicesForQuads, + getBufferType: getBufferType, + interleaveTypedArrays: interleaveTypedArrays$1, + isPow2: isPow2, + log2: log2, + nextPow2: nextPow2, + removeItems: removeItems, + sign: sign, + uid: uid, + deprecation: deprecation, + BoundingBox: BoundingBox, + BaseTextureCache: BaseTextureCache, + ProgramCache: ProgramCache, + TextureCache: TextureCache, + clearTextureCache: clearTextureCache, + destroyTextureCache: destroyTextureCache, + CanvasRenderTarget: CanvasRenderTarget, + getCanvasBoundingBox: getCanvasBoundingBox, + trimCanvas: trimCanvas, + decomposeDataUri: decomposeDataUri, + determineCrossOrigin: determineCrossOrigin, + getResolutionOfUrl: getResolutionOfUrl + }; + + var ExtensionType = /* @__PURE__ */ ((ExtensionType2) => { + ExtensionType2["Renderer"] = "renderer"; + ExtensionType2["Application"] = "application"; + ExtensionType2["RendererSystem"] = "renderer-webgl-system"; + ExtensionType2["RendererPlugin"] = "renderer-webgl-plugin"; + ExtensionType2["CanvasRendererSystem"] = "renderer-canvas-system"; + ExtensionType2["CanvasRendererPlugin"] = "renderer-canvas-plugin"; + ExtensionType2["Asset"] = "asset"; + ExtensionType2["LoadParser"] = "load-parser"; + ExtensionType2["ResolveParser"] = "resolve-parser"; + ExtensionType2["CacheParser"] = "cache-parser"; + ExtensionType2["DetectionParser"] = "detection-parser"; + return ExtensionType2; + })(ExtensionType || {}); + const normalizeExtension = (ext) => { + if (typeof ext === "function" || typeof ext === "object" && ext.extension) { + if (!ext.extension) { + throw new Error("Extension class must have an extension object"); + } + const metadata = typeof ext.extension !== "object" ? { type: ext.extension } : ext.extension; + ext = { ...metadata, ref: ext }; + } + if (typeof ext === "object") { + ext = { ...ext }; + } else { + throw new Error("Invalid extension type"); + } + if (typeof ext.type === "string") { + ext.type = [ext.type]; + } + return ext; + }; + const normalizePriority = (ext, defaultPriority) => normalizeExtension(ext).priority ?? defaultPriority; + const extensions$1 = { + _addHandlers: {}, + _removeHandlers: {}, + _queue: {}, + remove(...extensions2) { + extensions2.map(normalizeExtension).forEach((ext) => { + ext.type.forEach((type) => this._removeHandlers[type]?.(ext)); + }); + return this; + }, + add(...extensions2) { + extensions2.map(normalizeExtension).forEach((ext) => { + ext.type.forEach((type) => { + const handlers = this._addHandlers; + const queue = this._queue; + if (!handlers[type]) { + queue[type] = queue[type] || []; + queue[type].push(ext); + } else { + handlers[type](ext); + } + }); + }); + return this; + }, + handle(type, onAdd, onRemove) { + const addHandlers = this._addHandlers; + const removeHandlers = this._removeHandlers; + if (addHandlers[type] || removeHandlers[type]) { + throw new Error(`Extension type ${type} already has a handler`); + } + addHandlers[type] = onAdd; + removeHandlers[type] = onRemove; + const queue = this._queue; + if (queue[type]) { + queue[type].forEach((ext) => onAdd(ext)); + delete queue[type]; + } + return this; + }, + handleByMap(type, map) { + return this.handle(type, (extension) => { + map[extension.name] = extension.ref; + }, (extension) => { + delete map[extension.name]; + }); + }, + handleByList(type, list, defaultPriority = -1) { + return this.handle(type, (extension) => { + if (list.includes(extension.ref)) { + return; + } + list.push(extension.ref); + list.sort((a, b) => normalizePriority(b, defaultPriority) - normalizePriority(a, defaultPriority)); + }, (extension) => { + const index = list.indexOf(extension.ref); + if (index !== -1) { + list.splice(index, 1); + } + }); + } + }; + + class ViewableBuffer { + constructor(sizeOrBuffer) { + if (typeof sizeOrBuffer === "number") { + this.rawBinaryData = new ArrayBuffer(sizeOrBuffer); + } else if (sizeOrBuffer instanceof Uint8Array) { + this.rawBinaryData = sizeOrBuffer.buffer; + } else { + this.rawBinaryData = sizeOrBuffer; + } + this.uint32View = new Uint32Array(this.rawBinaryData); + this.float32View = new Float32Array(this.rawBinaryData); + } + get int8View() { + if (!this._int8View) { + this._int8View = new Int8Array(this.rawBinaryData); + } + return this._int8View; + } + get uint8View() { + if (!this._uint8View) { + this._uint8View = new Uint8Array(this.rawBinaryData); + } + return this._uint8View; + } + get int16View() { + if (!this._int16View) { + this._int16View = new Int16Array(this.rawBinaryData); + } + return this._int16View; + } + get uint16View() { + if (!this._uint16View) { + this._uint16View = new Uint16Array(this.rawBinaryData); + } + return this._uint16View; + } + get int32View() { + if (!this._int32View) { + this._int32View = new Int32Array(this.rawBinaryData); + } + return this._int32View; + } + view(type) { + return this[`${type}View`]; + } + destroy() { + this.rawBinaryData = null; + this._int8View = null; + this._uint8View = null; + this._int16View = null; + this._uint16View = null; + this._int32View = null; + this.uint32View = null; + this.float32View = null; + } + static sizeOf(type) { + switch (type) { + case "int8": + case "uint8": + return 1; + case "int16": + case "uint16": + return 2; + case "int32": + case "uint32": + case "float32": + return 4; + default: + throw new Error(`${type} isn't a valid view type`); + } + } + } + + const fragTemplate$1 = [ + "precision mediump float;", + "void main(void){", + "float test = 0.1;", + "%forloop%", + "gl_FragColor = vec4(0.0);", + "}" + ].join("\n"); + function generateIfTestSrc(maxIfs) { + let src = ""; + for (let i = 0; i < maxIfs; ++i) { + if (i > 0) { + src += "\nelse "; + } + if (i < maxIfs - 1) { + src += `if(test == ${i}.0){}`; + } + } + return src; + } + function checkMaxIfStatementsInShader(maxIfs, gl) { + if (maxIfs === 0) { + throw new Error("Invalid value of `0` passed to `checkMaxIfStatementsInShader`"); + } + const shader = gl.createShader(gl.FRAGMENT_SHADER); + while (true) { + const fragmentSrc = fragTemplate$1.replace(/%forloop%/gi, generateIfTestSrc(maxIfs)); + gl.shaderSource(shader, fragmentSrc); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + maxIfs = maxIfs / 2 | 0; + } else { + break; + } + } + return maxIfs; + } + + const BLEND$1 = 0; + const OFFSET$1 = 1; + const CULLING$1 = 2; + const DEPTH_TEST$1 = 3; + const WINDING$1 = 4; + const DEPTH_MASK$1 = 5; + class State { + constructor() { + this.data = 0; + this.blendMode = BLEND_MODES.NORMAL; + this.polygonOffset = 0; + this.blend = true; + this.depthMask = true; + } + get blend() { + return !!(this.data & 1 << BLEND$1); + } + set blend(value) { + if (!!(this.data & 1 << BLEND$1) !== value) { + this.data ^= 1 << BLEND$1; + } + } + get offsets() { + return !!(this.data & 1 << OFFSET$1); + } + set offsets(value) { + if (!!(this.data & 1 << OFFSET$1) !== value) { + this.data ^= 1 << OFFSET$1; + } + } + get culling() { + return !!(this.data & 1 << CULLING$1); + } + set culling(value) { + if (!!(this.data & 1 << CULLING$1) !== value) { + this.data ^= 1 << CULLING$1; + } + } + get depthTest() { + return !!(this.data & 1 << DEPTH_TEST$1); + } + set depthTest(value) { + if (!!(this.data & 1 << DEPTH_TEST$1) !== value) { + this.data ^= 1 << DEPTH_TEST$1; + } + } + get depthMask() { + return !!(this.data & 1 << DEPTH_MASK$1); + } + set depthMask(value) { + if (!!(this.data & 1 << DEPTH_MASK$1) !== value) { + this.data ^= 1 << DEPTH_MASK$1; + } + } + get clockwiseFrontFace() { + return !!(this.data & 1 << WINDING$1); + } + set clockwiseFrontFace(value) { + if (!!(this.data & 1 << WINDING$1) !== value) { + this.data ^= 1 << WINDING$1; + } + } + get blendMode() { + return this._blendMode; + } + set blendMode(value) { + this.blend = value !== BLEND_MODES.NONE; + this._blendMode = value; + } + get polygonOffset() { + return this._polygonOffset; + } + set polygonOffset(value) { + this.offsets = !!value; + this._polygonOffset = value; + } + toString() { + return `[@pixi/core:State blendMode=${this.blendMode} clockwiseFrontFace=${this.clockwiseFrontFace} culling=${this.culling} depthMask=${this.depthMask} polygonOffset=${this.polygonOffset}]`; + } + static for2d() { + const state = new State(); + state.depthTest = false; + state.blend = true; + return state; + } + } + + const INSTALLED = []; + function autoDetectResource(source, options) { + if (!source) { + return null; + } + let extension = ""; + if (typeof source === "string") { + const result = /\.(\w{3,4})(?:$|\?|#)/i.exec(source); + if (result) { + extension = result[1].toLowerCase(); + } + } + for (let i = INSTALLED.length - 1; i >= 0; --i) { + const ResourcePlugin = INSTALLED[i]; + if (ResourcePlugin.test && ResourcePlugin.test(source, extension)) { + return new ResourcePlugin(source, options); + } + } + throw new Error("Unrecognized source type to auto-detect Resource"); + } + + class Runner { + constructor(name) { + this.items = []; + this._name = name; + this._aliasCount = 0; + } + emit(a0, a1, a2, a3, a4, a5, a6, a7) { + if (arguments.length > 8) { + throw new Error("max arguments reached"); + } + const { name, items } = this; + this._aliasCount++; + for (let i = 0, len = items.length; i < len; i++) { + items[i][name](a0, a1, a2, a3, a4, a5, a6, a7); + } + if (items === this.items) { + this._aliasCount--; + } + return this; + } + ensureNonAliasedItems() { + if (this._aliasCount > 0 && this.items.length > 1) { + this._aliasCount = 0; + this.items = this.items.slice(0); + } + } + add(item) { + if (item[this._name]) { + this.ensureNonAliasedItems(); + this.remove(item); + this.items.push(item); + } + return this; + } + remove(item) { + const index = this.items.indexOf(item); + if (index !== -1) { + this.ensureNonAliasedItems(); + this.items.splice(index, 1); + } + return this; + } + contains(item) { + return this.items.includes(item); + } + removeAll() { + this.ensureNonAliasedItems(); + this.items.length = 0; + return this; + } + destroy() { + this.removeAll(); + this.items = null; + this._name = null; + } + get empty() { + return this.items.length === 0; + } + get name() { + return this._name; + } + } + Object.defineProperties(Runner.prototype, { + dispatch: { value: Runner.prototype.emit }, + run: { value: Runner.prototype.emit } + }); + + class Resource { + constructor(width = 0, height = 0) { + this._width = width; + this._height = height; + this.destroyed = false; + this.internal = false; + this.onResize = new Runner("setRealSize"); + this.onUpdate = new Runner("update"); + this.onError = new Runner("onError"); + } + bind(baseTexture) { + this.onResize.add(baseTexture); + this.onUpdate.add(baseTexture); + this.onError.add(baseTexture); + if (this._width || this._height) { + this.onResize.emit(this._width, this._height); + } + } + unbind(baseTexture) { + this.onResize.remove(baseTexture); + this.onUpdate.remove(baseTexture); + this.onError.remove(baseTexture); + } + resize(width, height) { + if (width !== this._width || height !== this._height) { + this._width = width; + this._height = height; + this.onResize.emit(width, height); + } + } + get valid() { + return !!this._width && !!this._height; + } + update() { + if (!this.destroyed) { + this.onUpdate.emit(); + } + } + load() { + return Promise.resolve(this); + } + get width() { + return this._width; + } + get height() { + return this._height; + } + style(_renderer, _baseTexture, _glTexture) { + return false; + } + dispose() { + } + destroy() { + if (!this.destroyed) { + this.destroyed = true; + this.dispose(); + this.onError.removeAll(); + this.onError = null; + this.onResize.removeAll(); + this.onResize = null; + this.onUpdate.removeAll(); + this.onUpdate = null; + } + } + static test(_source, _extension) { + return false; + } + } + + class BufferResource extends Resource { + constructor(source, options) { + const { width, height } = options || {}; + if (!width || !height) { + throw new Error("BufferResource width or height invalid"); + } + super(width, height); + this.data = source; + } + upload(renderer, baseTexture, glTexture) { + const gl = renderer.gl; + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, baseTexture.alphaMode === ALPHA_MODES.UNPACK); + const width = baseTexture.realWidth; + const height = baseTexture.realHeight; + if (glTexture.width === width && glTexture.height === height) { + gl.texSubImage2D(baseTexture.target, 0, 0, 0, width, height, baseTexture.format, glTexture.type, this.data); + } else { + glTexture.width = width; + glTexture.height = height; + gl.texImage2D(baseTexture.target, 0, glTexture.internalFormat, width, height, 0, baseTexture.format, glTexture.type, this.data); + } + return true; + } + dispose() { + this.data = null; + } + static test(source) { + return source instanceof Float32Array || source instanceof Uint8Array || source instanceof Uint32Array; + } + } + + const defaultBufferOptions = { + scaleMode: SCALE_MODES.NEAREST, + format: FORMATS.RGBA, + alphaMode: ALPHA_MODES.NPM + }; + const _BaseTexture = class extends eventemitter3 { + constructor(resource = null, options = null) { + super(); + options = Object.assign({}, _BaseTexture.defaultOptions, options); + const { + alphaMode, + mipmap, + anisotropicLevel, + scaleMode, + width, + height, + wrapMode, + format, + type, + target, + resolution, + resourceOptions + } = options; + if (resource && !(resource instanceof Resource)) { + resource = autoDetectResource(resource, resourceOptions); + resource.internal = true; + } + this.resolution = resolution || settings.RESOLUTION; + this.width = Math.round((width || 0) * this.resolution) / this.resolution; + this.height = Math.round((height || 0) * this.resolution) / this.resolution; + this._mipmap = mipmap; + this.anisotropicLevel = anisotropicLevel; + this._wrapMode = wrapMode; + this._scaleMode = scaleMode; + this.format = format; + this.type = type; + this.target = target; + this.alphaMode = alphaMode; + this.uid = uid(); + this.touched = 0; + this.isPowerOfTwo = false; + this._refreshPOT(); + this._glTextures = {}; + this.dirtyId = 0; + this.dirtyStyleId = 0; + this.cacheId = null; + this.valid = width > 0 && height > 0; + this.textureCacheIds = []; + this.destroyed = false; + this.resource = null; + this._batchEnabled = 0; + this._batchLocation = 0; + this.parentTextureArray = null; + this.setResource(resource); + } + get realWidth() { + return Math.round(this.width * this.resolution); + } + get realHeight() { + return Math.round(this.height * this.resolution); + } + get mipmap() { + return this._mipmap; + } + set mipmap(value) { + if (this._mipmap !== value) { + this._mipmap = value; + this.dirtyStyleId++; + } + } + get scaleMode() { + return this._scaleMode; + } + set scaleMode(value) { + if (this._scaleMode !== value) { + this._scaleMode = value; + this.dirtyStyleId++; + } + } + get wrapMode() { + return this._wrapMode; + } + set wrapMode(value) { + if (this._wrapMode !== value) { + this._wrapMode = value; + this.dirtyStyleId++; + } + } + setStyle(scaleMode, mipmap) { + let dirty; + if (scaleMode !== void 0 && scaleMode !== this.scaleMode) { + this.scaleMode = scaleMode; + dirty = true; + } + if (mipmap !== void 0 && mipmap !== this.mipmap) { + this.mipmap = mipmap; + dirty = true; + } + if (dirty) { + this.dirtyStyleId++; + } + return this; + } + setSize(desiredWidth, desiredHeight, resolution) { + resolution = resolution || this.resolution; + return this.setRealSize(desiredWidth * resolution, desiredHeight * resolution, resolution); + } + setRealSize(realWidth, realHeight, resolution) { + this.resolution = resolution || this.resolution; + this.width = Math.round(realWidth) / this.resolution; + this.height = Math.round(realHeight) / this.resolution; + this._refreshPOT(); + this.update(); + return this; + } + _refreshPOT() { + this.isPowerOfTwo = isPow2(this.realWidth) && isPow2(this.realHeight); + } + setResolution(resolution) { + const oldResolution = this.resolution; + if (oldResolution === resolution) { + return this; + } + this.resolution = resolution; + if (this.valid) { + this.width = Math.round(this.width * oldResolution) / resolution; + this.height = Math.round(this.height * oldResolution) / resolution; + this.emit("update", this); + } + this._refreshPOT(); + return this; + } + setResource(resource) { + if (this.resource === resource) { + return this; + } + if (this.resource) { + throw new Error("Resource can be set only once"); + } + resource.bind(this); + this.resource = resource; + return this; + } + update() { + if (!this.valid) { + if (this.width > 0 && this.height > 0) { + this.valid = true; + this.emit("loaded", this); + this.emit("update", this); + } + } else { + this.dirtyId++; + this.dirtyStyleId++; + this.emit("update", this); + } + } + onError(event) { + this.emit("error", this, event); + } + destroy() { + if (this.resource) { + this.resource.unbind(this); + if (this.resource.internal) { + this.resource.destroy(); + } + this.resource = null; + } + if (this.cacheId) { + delete BaseTextureCache[this.cacheId]; + delete TextureCache[this.cacheId]; + this.cacheId = null; + } + this.dispose(); + _BaseTexture.removeFromCache(this); + this.textureCacheIds = null; + this.destroyed = true; + } + dispose() { + this.emit("dispose", this); + } + castToBaseTexture() { + return this; + } + static from(source, options, strict = settings.STRICT_TEXTURE_CACHE) { + const isFrame = typeof source === "string"; + let cacheId = null; + if (isFrame) { + cacheId = source; + } else { + if (!source._pixiId) { + const prefix = options?.pixiIdPrefix || "pixiid"; + source._pixiId = `${prefix}_${uid()}`; + } + cacheId = source._pixiId; + } + let baseTexture = BaseTextureCache[cacheId]; + if (isFrame && strict && !baseTexture) { + throw new Error(`The cacheId "${cacheId}" does not exist in BaseTextureCache.`); + } + if (!baseTexture) { + baseTexture = new _BaseTexture(source, options); + baseTexture.cacheId = cacheId; + _BaseTexture.addToCache(baseTexture, cacheId); + } + return baseTexture; + } + static fromBuffer(buffer, width, height, options) { + buffer = buffer || new Float32Array(width * height * 4); + const resource = new BufferResource(buffer, { width, height }); + const type = buffer instanceof Float32Array ? TYPES.FLOAT : TYPES.UNSIGNED_BYTE; + return new _BaseTexture(resource, Object.assign({}, defaultBufferOptions, options || { width, height, type })); + } + static addToCache(baseTexture, id) { + if (id) { + if (!baseTexture.textureCacheIds.includes(id)) { + baseTexture.textureCacheIds.push(id); + } + if (BaseTextureCache[id] && BaseTextureCache[id] !== baseTexture) { + console.warn(`BaseTexture added to the cache with an id [${id}] that already had an entry`); + } + BaseTextureCache[id] = baseTexture; + } + } + static removeFromCache(baseTexture) { + if (typeof baseTexture === "string") { + const baseTextureFromCache = BaseTextureCache[baseTexture]; + if (baseTextureFromCache) { + const index = baseTextureFromCache.textureCacheIds.indexOf(baseTexture); + if (index > -1) { + baseTextureFromCache.textureCacheIds.splice(index, 1); + } + delete BaseTextureCache[baseTexture]; + return baseTextureFromCache; + } + } else if (baseTexture?.textureCacheIds) { + for (let i = 0; i < baseTexture.textureCacheIds.length; ++i) { + delete BaseTextureCache[baseTexture.textureCacheIds[i]]; + } + baseTexture.textureCacheIds.length = 0; + return baseTexture; + } + return null; + } + }; + let BaseTexture = _BaseTexture; + BaseTexture.defaultOptions = { + mipmap: MIPMAP_MODES.POW2, + anisotropicLevel: 0, + scaleMode: SCALE_MODES.LINEAR, + wrapMode: WRAP_MODES.CLAMP, + alphaMode: ALPHA_MODES.UNPACK, + target: TARGETS.TEXTURE_2D, + format: FORMATS.RGBA, + type: TYPES.UNSIGNED_BYTE + }; + BaseTexture._globalBatch = 0; + + class BatchDrawCall { + constructor() { + this.texArray = null; + this.blend = 0; + this.type = DRAW_MODES.TRIANGLES; + this.start = 0; + this.size = 0; + this.data = null; + } + } + + let UID$4 = 0; + class Buffer { + constructor(data, _static = true, index = false) { + this.data = data || new Float32Array(1); + this._glBuffers = {}; + this._updateID = 0; + this.index = index; + this.static = _static; + this.id = UID$4++; + this.disposeRunner = new Runner("disposeBuffer"); + } + update(data) { + if (data instanceof Array) { + data = new Float32Array(data); + } + this.data = data || this.data; + this._updateID++; + } + dispose() { + this.disposeRunner.emit(this, false); + } + destroy() { + this.dispose(); + this.data = null; + } + set index(value) { + this.type = value ? BUFFER_TYPE.ELEMENT_ARRAY_BUFFER : BUFFER_TYPE.ARRAY_BUFFER; + } + get index() { + return this.type === BUFFER_TYPE.ELEMENT_ARRAY_BUFFER; + } + static from(data) { + if (data instanceof Array) { + data = new Float32Array(data); + } + return new Buffer(data); + } + } + + class Attribute { + constructor(buffer, size = 0, normalized = false, type = TYPES.FLOAT, stride, start, instance, divisor = 1) { + this.buffer = buffer; + this.size = size; + this.normalized = normalized; + this.type = type; + this.stride = stride; + this.start = start; + this.instance = instance; + this.divisor = divisor; + } + destroy() { + this.buffer = null; + } + static from(buffer, size, normalized, type, stride) { + return new Attribute(buffer, size, normalized, type, stride); + } + } + + const map$1 = { + Float32Array, + Uint32Array, + Int32Array, + Uint8Array + }; + function interleaveTypedArrays(arrays, sizes) { + let outSize = 0; + let stride = 0; + const views = {}; + for (let i = 0; i < arrays.length; i++) { + stride += sizes[i]; + outSize += arrays[i].length; + } + const buffer = new ArrayBuffer(outSize * 4); + let out = null; + let littleOffset = 0; + for (let i = 0; i < arrays.length; i++) { + const size = sizes[i]; + const array = arrays[i]; + const type = getBufferType(array); + if (!views[type]) { + views[type] = new map$1[type](buffer); + } + out = views[type]; + for (let j = 0; j < array.length; j++) { + const indexStart = (j / size | 0) * stride + littleOffset; + const index = j % size; + out[indexStart + index] = array[j]; + } + littleOffset += size; + } + return new Float32Array(buffer); + } + + const byteSizeMap$1 = { 5126: 4, 5123: 2, 5121: 1 }; + let UID$3 = 0; + const map = { + Float32Array, + Uint32Array, + Int32Array, + Uint8Array, + Uint16Array + }; + class Geometry { + constructor(buffers = [], attributes = {}) { + this.buffers = buffers; + this.indexBuffer = null; + this.attributes = attributes; + this.glVertexArrayObjects = {}; + this.id = UID$3++; + this.instanced = false; + this.instanceCount = 1; + this.disposeRunner = new Runner("disposeGeometry"); + this.refCount = 0; + } + addAttribute(id, buffer, size = 0, normalized = false, type, stride, start, instance = false) { + if (!buffer) { + throw new Error("You must pass a buffer when creating an attribute"); + } + if (!(buffer instanceof Buffer)) { + if (buffer instanceof Array) { + buffer = new Float32Array(buffer); + } + buffer = new Buffer(buffer); + } + const ids = id.split("|"); + if (ids.length > 1) { + for (let i = 0; i < ids.length; i++) { + this.addAttribute(ids[i], buffer, size, normalized, type); + } + return this; + } + let bufferIndex = this.buffers.indexOf(buffer); + if (bufferIndex === -1) { + this.buffers.push(buffer); + bufferIndex = this.buffers.length - 1; + } + this.attributes[id] = new Attribute(bufferIndex, size, normalized, type, stride, start, instance); + this.instanced = this.instanced || instance; + return this; + } + getAttribute(id) { + return this.attributes[id]; + } + getBuffer(id) { + return this.buffers[this.getAttribute(id).buffer]; + } + addIndex(buffer) { + if (!(buffer instanceof Buffer)) { + if (buffer instanceof Array) { + buffer = new Uint16Array(buffer); + } + buffer = new Buffer(buffer); + } + buffer.type = BUFFER_TYPE.ELEMENT_ARRAY_BUFFER; + this.indexBuffer = buffer; + if (!this.buffers.includes(buffer)) { + this.buffers.push(buffer); + } + return this; + } + getIndex() { + return this.indexBuffer; + } + interleave() { + if (this.buffers.length === 1 || this.buffers.length === 2 && this.indexBuffer) + return this; + const arrays = []; + const sizes = []; + const interleavedBuffer = new Buffer(); + let i; + for (i in this.attributes) { + const attribute = this.attributes[i]; + const buffer = this.buffers[attribute.buffer]; + arrays.push(buffer.data); + sizes.push(attribute.size * byteSizeMap$1[attribute.type] / 4); + attribute.buffer = 0; + } + interleavedBuffer.data = interleaveTypedArrays(arrays, sizes); + for (i = 0; i < this.buffers.length; i++) { + if (this.buffers[i] !== this.indexBuffer) { + this.buffers[i].destroy(); + } + } + this.buffers = [interleavedBuffer]; + if (this.indexBuffer) { + this.buffers.push(this.indexBuffer); + } + return this; + } + getSize() { + for (const i in this.attributes) { + const attribute = this.attributes[i]; + const buffer = this.buffers[attribute.buffer]; + return buffer.data.length / (attribute.stride / 4 || attribute.size); + } + return 0; + } + dispose() { + this.disposeRunner.emit(this, false); + } + destroy() { + this.dispose(); + this.buffers = null; + this.indexBuffer = null; + this.attributes = null; + } + clone() { + const geometry = new Geometry(); + for (let i = 0; i < this.buffers.length; i++) { + geometry.buffers[i] = new Buffer(this.buffers[i].data.slice(0)); + } + for (const i in this.attributes) { + const attrib = this.attributes[i]; + geometry.attributes[i] = new Attribute(attrib.buffer, attrib.size, attrib.normalized, attrib.type, attrib.stride, attrib.start, attrib.instance); + } + if (this.indexBuffer) { + geometry.indexBuffer = geometry.buffers[this.buffers.indexOf(this.indexBuffer)]; + geometry.indexBuffer.type = BUFFER_TYPE.ELEMENT_ARRAY_BUFFER; + } + return geometry; + } + static merge(geometries) { + const geometryOut = new Geometry(); + const arrays = []; + const sizes = []; + const offsets = []; + let geometry; + for (let i = 0; i < geometries.length; i++) { + geometry = geometries[i]; + for (let j = 0; j < geometry.buffers.length; j++) { + sizes[j] = sizes[j] || 0; + sizes[j] += geometry.buffers[j].data.length; + offsets[j] = 0; + } + } + for (let i = 0; i < geometry.buffers.length; i++) { + arrays[i] = new map[getBufferType(geometry.buffers[i].data)](sizes[i]); + geometryOut.buffers[i] = new Buffer(arrays[i]); + } + for (let i = 0; i < geometries.length; i++) { + geometry = geometries[i]; + for (let j = 0; j < geometry.buffers.length; j++) { + arrays[j].set(geometry.buffers[j].data, offsets[j]); + offsets[j] += geometry.buffers[j].data.length; + } + } + geometryOut.attributes = geometry.attributes; + if (geometry.indexBuffer) { + geometryOut.indexBuffer = geometryOut.buffers[geometry.buffers.indexOf(geometry.indexBuffer)]; + geometryOut.indexBuffer.type = BUFFER_TYPE.ELEMENT_ARRAY_BUFFER; + let offset = 0; + let stride = 0; + let offset2 = 0; + let bufferIndexToCount = 0; + for (let i = 0; i < geometry.buffers.length; i++) { + if (geometry.buffers[i] !== geometry.indexBuffer) { + bufferIndexToCount = i; + break; + } + } + for (const i in geometry.attributes) { + const attribute = geometry.attributes[i]; + if ((attribute.buffer | 0) === bufferIndexToCount) { + stride += attribute.size * byteSizeMap$1[attribute.type] / 4; + } + } + for (let i = 0; i < geometries.length; i++) { + const indexBufferData = geometries[i].indexBuffer.data; + for (let j = 0; j < indexBufferData.length; j++) { + geometryOut.indexBuffer.data[j + offset2] += offset; + } + offset += geometries[i].buffers[bufferIndexToCount].data.length / stride; + offset2 += indexBufferData.length; + } + } + return geometryOut; + } + } + + class BatchGeometry extends Geometry { + constructor(_static = false) { + super(); + this._buffer = new Buffer(null, _static, false); + this._indexBuffer = new Buffer(null, _static, true); + this.addAttribute("aVertexPosition", this._buffer, 2, false, TYPES.FLOAT).addAttribute("aTextureCoord", this._buffer, 2, false, TYPES.FLOAT).addAttribute("aColor", this._buffer, 4, true, TYPES.UNSIGNED_BYTE).addAttribute("aTextureId", this._buffer, 1, true, TYPES.FLOAT).addIndex(this._indexBuffer); + } + } + + const PI_2 = Math.PI * 2; + const RAD_TO_DEG = 180 / Math.PI; + const DEG_TO_RAD = Math.PI / 180; + var SHAPES = /* @__PURE__ */ ((SHAPES2) => { + SHAPES2[SHAPES2["POLY"] = 0] = "POLY"; + SHAPES2[SHAPES2["RECT"] = 1] = "RECT"; + SHAPES2[SHAPES2["CIRC"] = 2] = "CIRC"; + SHAPES2[SHAPES2["ELIP"] = 3] = "ELIP"; + SHAPES2[SHAPES2["RREC"] = 4] = "RREC"; + return SHAPES2; + })(SHAPES || {}); + + class Point { + constructor(x = 0, y = 0) { + this.x = 0; + this.y = 0; + this.x = x; + this.y = y; + } + clone() { + return new Point(this.x, this.y); + } + copyFrom(p) { + this.set(p.x, p.y); + return this; + } + copyTo(p) { + p.set(this.x, this.y); + return p; + } + equals(p) { + return p.x === this.x && p.y === this.y; + } + set(x = 0, y = x) { + this.x = x; + this.y = y; + return this; + } + toString() { + return `[@pixi/math:Point x=${this.x} y=${this.y}]`; + } + } + + const tempPoints$1 = [new Point(), new Point(), new Point(), new Point()]; + class Rectangle { + constructor(x = 0, y = 0, width = 0, height = 0) { + this.x = Number(x); + this.y = Number(y); + this.width = Number(width); + this.height = Number(height); + this.type = SHAPES.RECT; + } + get left() { + return this.x; + } + get right() { + return this.x + this.width; + } + get top() { + return this.y; + } + get bottom() { + return this.y + this.height; + } + static get EMPTY() { + return new Rectangle(0, 0, 0, 0); + } + clone() { + return new Rectangle(this.x, this.y, this.width, this.height); + } + copyFrom(rectangle) { + this.x = rectangle.x; + this.y = rectangle.y; + this.width = rectangle.width; + this.height = rectangle.height; + return this; + } + copyTo(rectangle) { + rectangle.x = this.x; + rectangle.y = this.y; + rectangle.width = this.width; + rectangle.height = this.height; + return rectangle; + } + contains(x, y) { + if (this.width <= 0 || this.height <= 0) { + return false; + } + if (x >= this.x && x < this.x + this.width) { + if (y >= this.y && y < this.y + this.height) { + return true; + } + } + return false; + } + intersects(other, transform) { + if (!transform) { + const x02 = this.x < other.x ? other.x : this.x; + const x12 = this.right > other.right ? other.right : this.right; + if (x12 <= x02) { + return false; + } + const y02 = this.y < other.y ? other.y : this.y; + const y12 = this.bottom > other.bottom ? other.bottom : this.bottom; + return y12 > y02; + } + const x0 = this.left; + const x1 = this.right; + const y0 = this.top; + const y1 = this.bottom; + if (x1 <= x0 || y1 <= y0) { + return false; + } + const lt = tempPoints$1[0].set(other.left, other.top); + const lb = tempPoints$1[1].set(other.left, other.bottom); + const rt = tempPoints$1[2].set(other.right, other.top); + const rb = tempPoints$1[3].set(other.right, other.bottom); + if (rt.x <= lt.x || lb.y <= lt.y) { + return false; + } + const s = Math.sign(transform.a * transform.d - transform.b * transform.c); + if (s === 0) { + return false; + } + transform.apply(lt, lt); + transform.apply(lb, lb); + transform.apply(rt, rt); + transform.apply(rb, rb); + if (Math.max(lt.x, lb.x, rt.x, rb.x) <= x0 || Math.min(lt.x, lb.x, rt.x, rb.x) >= x1 || Math.max(lt.y, lb.y, rt.y, rb.y) <= y0 || Math.min(lt.y, lb.y, rt.y, rb.y) >= y1) { + return false; + } + const nx = s * (lb.y - lt.y); + const ny = s * (lt.x - lb.x); + const n00 = nx * x0 + ny * y0; + const n10 = nx * x1 + ny * y0; + const n01 = nx * x0 + ny * y1; + const n11 = nx * x1 + ny * y1; + if (Math.max(n00, n10, n01, n11) <= nx * lt.x + ny * lt.y || Math.min(n00, n10, n01, n11) >= nx * rb.x + ny * rb.y) { + return false; + } + const mx = s * (lt.y - rt.y); + const my = s * (rt.x - lt.x); + const m00 = mx * x0 + my * y0; + const m10 = mx * x1 + my * y0; + const m01 = mx * x0 + my * y1; + const m11 = mx * x1 + my * y1; + if (Math.max(m00, m10, m01, m11) <= mx * lt.x + my * lt.y || Math.min(m00, m10, m01, m11) >= mx * rb.x + my * rb.y) { + return false; + } + return true; + } + pad(paddingX = 0, paddingY = paddingX) { + this.x -= paddingX; + this.y -= paddingY; + this.width += paddingX * 2; + this.height += paddingY * 2; + return this; + } + fit(rectangle) { + const x1 = Math.max(this.x, rectangle.x); + const x2 = Math.min(this.x + this.width, rectangle.x + rectangle.width); + const y1 = Math.max(this.y, rectangle.y); + const y2 = Math.min(this.y + this.height, rectangle.y + rectangle.height); + this.x = x1; + this.width = Math.max(x2 - x1, 0); + this.y = y1; + this.height = Math.max(y2 - y1, 0); + return this; + } + ceil(resolution = 1, eps = 1e-3) { + const x2 = Math.ceil((this.x + this.width - eps) * resolution) / resolution; + const y2 = Math.ceil((this.y + this.height - eps) * resolution) / resolution; + this.x = Math.floor((this.x + eps) * resolution) / resolution; + this.y = Math.floor((this.y + eps) * resolution) / resolution; + this.width = x2 - this.x; + this.height = y2 - this.y; + return this; + } + enlarge(rectangle) { + const x1 = Math.min(this.x, rectangle.x); + const x2 = Math.max(this.x + this.width, rectangle.x + rectangle.width); + const y1 = Math.min(this.y, rectangle.y); + const y2 = Math.max(this.y + this.height, rectangle.y + rectangle.height); + this.x = x1; + this.width = x2 - x1; + this.y = y1; + this.height = y2 - y1; + return this; + } + toString() { + return `[@pixi/math:Rectangle x=${this.x} y=${this.y} width=${this.width} height=${this.height}]`; + } + } + + class Circle { + constructor(x = 0, y = 0, radius = 0) { + this.x = x; + this.y = y; + this.radius = radius; + this.type = SHAPES.CIRC; + } + clone() { + return new Circle(this.x, this.y, this.radius); + } + contains(x, y) { + if (this.radius <= 0) { + return false; + } + const r2 = this.radius * this.radius; + let dx = this.x - x; + let dy = this.y - y; + dx *= dx; + dy *= dy; + return dx + dy <= r2; + } + getBounds() { + return new Rectangle(this.x - this.radius, this.y - this.radius, this.radius * 2, this.radius * 2); + } + toString() { + return `[@pixi/math:Circle x=${this.x} y=${this.y} radius=${this.radius}]`; + } + } + + class Ellipse { + constructor(x = 0, y = 0, halfWidth = 0, halfHeight = 0) { + this.x = x; + this.y = y; + this.width = halfWidth; + this.height = halfHeight; + this.type = SHAPES.ELIP; + } + clone() { + return new Ellipse(this.x, this.y, this.width, this.height); + } + contains(x, y) { + if (this.width <= 0 || this.height <= 0) { + return false; + } + let normx = (x - this.x) / this.width; + let normy = (y - this.y) / this.height; + normx *= normx; + normy *= normy; + return normx + normy <= 1; + } + getBounds() { + return new Rectangle(this.x - this.width, this.y - this.height, this.width, this.height); + } + toString() { + return `[@pixi/math:Ellipse x=${this.x} y=${this.y} width=${this.width} height=${this.height}]`; + } + } + + class Polygon { + constructor(...points) { + let flat = Array.isArray(points[0]) ? points[0] : points; + if (typeof flat[0] !== "number") { + const p = []; + for (let i = 0, il = flat.length; i < il; i++) { + p.push(flat[i].x, flat[i].y); + } + flat = p; + } + this.points = flat; + this.type = SHAPES.POLY; + this.closeStroke = true; + } + clone() { + const points = this.points.slice(); + const polygon = new Polygon(points); + polygon.closeStroke = this.closeStroke; + return polygon; + } + contains(x, y) { + let inside = false; + const length = this.points.length / 2; + for (let i = 0, j = length - 1; i < length; j = i++) { + const xi = this.points[i * 2]; + const yi = this.points[i * 2 + 1]; + const xj = this.points[j * 2]; + const yj = this.points[j * 2 + 1]; + const intersect = yi > y !== yj > y && x < (xj - xi) * ((y - yi) / (yj - yi)) + xi; + if (intersect) { + inside = !inside; + } + } + return inside; + } + toString() { + return `[@pixi/math:PolygoncloseStroke=${this.closeStroke}points=${this.points.reduce((pointsDesc, currentPoint) => `${pointsDesc}, ${currentPoint}`, "")}]`; + } + } + + class RoundedRectangle { + constructor(x = 0, y = 0, width = 0, height = 0, radius = 20) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.radius = radius; + this.type = SHAPES.RREC; + } + clone() { + return new RoundedRectangle(this.x, this.y, this.width, this.height, this.radius); + } + contains(x, y) { + if (this.width <= 0 || this.height <= 0) { + return false; + } + if (x >= this.x && x <= this.x + this.width) { + if (y >= this.y && y <= this.y + this.height) { + const radius = Math.max(0, Math.min(this.radius, Math.min(this.width, this.height) / 2)); + if (y >= this.y + radius && y <= this.y + this.height - radius || x >= this.x + radius && x <= this.x + this.width - radius) { + return true; + } + let dx = x - (this.x + radius); + let dy = y - (this.y + radius); + const radius2 = radius * radius; + if (dx * dx + dy * dy <= radius2) { + return true; + } + dx = x - (this.x + this.width - radius); + if (dx * dx + dy * dy <= radius2) { + return true; + } + dy = y - (this.y + this.height - radius); + if (dx * dx + dy * dy <= radius2) { + return true; + } + dx = x - (this.x + radius); + if (dx * dx + dy * dy <= radius2) { + return true; + } + } + } + return false; + } + toString() { + return `[@pixi/math:RoundedRectangle x=${this.x} y=${this.y}width=${this.width} height=${this.height} radius=${this.radius}]`; + } + } + + class Matrix { + constructor(a = 1, b = 0, c = 0, d = 1, tx = 0, ty = 0) { + this.array = null; + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + } + fromArray(array) { + this.a = array[0]; + this.b = array[1]; + this.c = array[3]; + this.d = array[4]; + this.tx = array[2]; + this.ty = array[5]; + } + set(a, b, c, d, tx, ty) { + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + return this; + } + toArray(transpose, out) { + if (!this.array) { + this.array = new Float32Array(9); + } + const array = out || this.array; + if (transpose) { + array[0] = this.a; + array[1] = this.b; + array[2] = 0; + array[3] = this.c; + array[4] = this.d; + array[5] = 0; + array[6] = this.tx; + array[7] = this.ty; + array[8] = 1; + } else { + array[0] = this.a; + array[1] = this.c; + array[2] = this.tx; + array[3] = this.b; + array[4] = this.d; + array[5] = this.ty; + array[6] = 0; + array[7] = 0; + array[8] = 1; + } + return array; + } + apply(pos, newPos) { + newPos = newPos || new Point(); + const x = pos.x; + const y = pos.y; + newPos.x = this.a * x + this.c * y + this.tx; + newPos.y = this.b * x + this.d * y + this.ty; + return newPos; + } + applyInverse(pos, newPos) { + newPos = newPos || new Point(); + const id = 1 / (this.a * this.d + this.c * -this.b); + const x = pos.x; + const y = pos.y; + newPos.x = this.d * id * x + -this.c * id * y + (this.ty * this.c - this.tx * this.d) * id; + newPos.y = this.a * id * y + -this.b * id * x + (-this.ty * this.a + this.tx * this.b) * id; + return newPos; + } + translate(x, y) { + this.tx += x; + this.ty += y; + return this; + } + scale(x, y) { + this.a *= x; + this.d *= y; + this.c *= x; + this.b *= y; + this.tx *= x; + this.ty *= y; + return this; + } + rotate(angle) { + const cos = Math.cos(angle); + const sin = Math.sin(angle); + const a1 = this.a; + const c1 = this.c; + const tx1 = this.tx; + this.a = a1 * cos - this.b * sin; + this.b = a1 * sin + this.b * cos; + this.c = c1 * cos - this.d * sin; + this.d = c1 * sin + this.d * cos; + this.tx = tx1 * cos - this.ty * sin; + this.ty = tx1 * sin + this.ty * cos; + return this; + } + append(matrix) { + const a1 = this.a; + const b1 = this.b; + const c1 = this.c; + const d1 = this.d; + this.a = matrix.a * a1 + matrix.b * c1; + this.b = matrix.a * b1 + matrix.b * d1; + this.c = matrix.c * a1 + matrix.d * c1; + this.d = matrix.c * b1 + matrix.d * d1; + this.tx = matrix.tx * a1 + matrix.ty * c1 + this.tx; + this.ty = matrix.tx * b1 + matrix.ty * d1 + this.ty; + return this; + } + setTransform(x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { + this.a = Math.cos(rotation + skewY) * scaleX; + this.b = Math.sin(rotation + skewY) * scaleX; + this.c = -Math.sin(rotation - skewX) * scaleY; + this.d = Math.cos(rotation - skewX) * scaleY; + this.tx = x - (pivotX * this.a + pivotY * this.c); + this.ty = y - (pivotX * this.b + pivotY * this.d); + return this; + } + prepend(matrix) { + const tx1 = this.tx; + if (matrix.a !== 1 || matrix.b !== 0 || matrix.c !== 0 || matrix.d !== 1) { + const a1 = this.a; + const c1 = this.c; + this.a = a1 * matrix.a + this.b * matrix.c; + this.b = a1 * matrix.b + this.b * matrix.d; + this.c = c1 * matrix.a + this.d * matrix.c; + this.d = c1 * matrix.b + this.d * matrix.d; + } + this.tx = tx1 * matrix.a + this.ty * matrix.c + matrix.tx; + this.ty = tx1 * matrix.b + this.ty * matrix.d + matrix.ty; + return this; + } + decompose(transform) { + const a = this.a; + const b = this.b; + const c = this.c; + const d = this.d; + const pivot = transform.pivot; + const skewX = -Math.atan2(-c, d); + const skewY = Math.atan2(b, a); + const delta = Math.abs(skewX + skewY); + if (delta < 1e-5 || Math.abs(PI_2 - delta) < 1e-5) { + transform.rotation = skewY; + transform.skew.x = transform.skew.y = 0; + } else { + transform.rotation = 0; + transform.skew.x = skewX; + transform.skew.y = skewY; + } + transform.scale.x = Math.sqrt(a * a + b * b); + transform.scale.y = Math.sqrt(c * c + d * d); + transform.position.x = this.tx + (pivot.x * a + pivot.y * c); + transform.position.y = this.ty + (pivot.x * b + pivot.y * d); + return transform; + } + invert() { + const a1 = this.a; + const b1 = this.b; + const c1 = this.c; + const d1 = this.d; + const tx1 = this.tx; + const n = a1 * d1 - b1 * c1; + this.a = d1 / n; + this.b = -b1 / n; + this.c = -c1 / n; + this.d = a1 / n; + this.tx = (c1 * this.ty - d1 * tx1) / n; + this.ty = -(a1 * this.ty - b1 * tx1) / n; + return this; + } + identity() { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.tx = 0; + this.ty = 0; + return this; + } + clone() { + const matrix = new Matrix(); + matrix.a = this.a; + matrix.b = this.b; + matrix.c = this.c; + matrix.d = this.d; + matrix.tx = this.tx; + matrix.ty = this.ty; + return matrix; + } + copyTo(matrix) { + matrix.a = this.a; + matrix.b = this.b; + matrix.c = this.c; + matrix.d = this.d; + matrix.tx = this.tx; + matrix.ty = this.ty; + return matrix; + } + copyFrom(matrix) { + this.a = matrix.a; + this.b = matrix.b; + this.c = matrix.c; + this.d = matrix.d; + this.tx = matrix.tx; + this.ty = matrix.ty; + return this; + } + toString() { + return `[@pixi/math:Matrix a=${this.a} b=${this.b} c=${this.c} d=${this.d} tx=${this.tx} ty=${this.ty}]`; + } + static get IDENTITY() { + return new Matrix(); + } + static get TEMP_MATRIX() { + return new Matrix(); + } + } + + const ux = [1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1]; + const uy = [0, 1, 1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1]; + const vx = [0, -1, -1, -1, 0, 1, 1, 1, 0, 1, 1, 1, 0, -1, -1, -1]; + const vy = [1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, 1, 1, 1, 0, -1]; + const rotationCayley = []; + const rotationMatrices = []; + const signum = Math.sign; + function init() { + for (let i = 0; i < 16; i++) { + const row = []; + rotationCayley.push(row); + for (let j = 0; j < 16; j++) { + const _ux = signum(ux[i] * ux[j] + vx[i] * uy[j]); + const _uy = signum(uy[i] * ux[j] + vy[i] * uy[j]); + const _vx = signum(ux[i] * vx[j] + vx[i] * vy[j]); + const _vy = signum(uy[i] * vx[j] + vy[i] * vy[j]); + for (let k = 0; k < 16; k++) { + if (ux[k] === _ux && uy[k] === _uy && vx[k] === _vx && vy[k] === _vy) { + row.push(k); + break; + } + } + } + } + for (let i = 0; i < 16; i++) { + const mat = new Matrix(); + mat.set(ux[i], uy[i], vx[i], vy[i], 0, 0); + rotationMatrices.push(mat); + } + } + init(); + const groupD8 = { + E: 0, + SE: 1, + S: 2, + SW: 3, + W: 4, + NW: 5, + N: 6, + NE: 7, + MIRROR_VERTICAL: 8, + MAIN_DIAGONAL: 10, + MIRROR_HORIZONTAL: 12, + REVERSE_DIAGONAL: 14, + uX: (ind) => ux[ind], + uY: (ind) => uy[ind], + vX: (ind) => vx[ind], + vY: (ind) => vy[ind], + inv: (rotation) => { + if (rotation & 8) { + return rotation & 15; + } + return -rotation & 7; + }, + add: (rotationSecond, rotationFirst) => rotationCayley[rotationSecond][rotationFirst], + sub: (rotationSecond, rotationFirst) => rotationCayley[rotationSecond][groupD8.inv(rotationFirst)], + rotate180: (rotation) => rotation ^ 4, + isVertical: (rotation) => (rotation & 3) === 2, + byDirection: (dx, dy) => { + if (Math.abs(dx) * 2 <= Math.abs(dy)) { + if (dy >= 0) { + return groupD8.S; + } + return groupD8.N; + } else if (Math.abs(dy) * 2 <= Math.abs(dx)) { + if (dx > 0) { + return groupD8.E; + } + return groupD8.W; + } else if (dy > 0) { + if (dx > 0) { + return groupD8.SE; + } + return groupD8.SW; + } else if (dx > 0) { + return groupD8.NE; + } + return groupD8.NW; + }, + matrixAppendRotationInv: (matrix, rotation, tx = 0, ty = 0) => { + const mat = rotationMatrices[groupD8.inv(rotation)]; + mat.tx = tx; + mat.ty = ty; + matrix.append(mat); + } + }; + + class ObservablePoint { + constructor(cb, scope, x = 0, y = 0) { + this._x = x; + this._y = y; + this.cb = cb; + this.scope = scope; + } + clone(cb = this.cb, scope = this.scope) { + return new ObservablePoint(cb, scope, this._x, this._y); + } + set(x = 0, y = x) { + if (this._x !== x || this._y !== y) { + this._x = x; + this._y = y; + this.cb.call(this.scope); + } + return this; + } + copyFrom(p) { + if (this._x !== p.x || this._y !== p.y) { + this._x = p.x; + this._y = p.y; + this.cb.call(this.scope); + } + return this; + } + copyTo(p) { + p.set(this._x, this._y); + return p; + } + equals(p) { + return p.x === this._x && p.y === this._y; + } + toString() { + return `[@pixi/math:ObservablePoint x=${0} y=${0} scope=${this.scope}]`; + } + get x() { + return this._x; + } + set x(value) { + if (this._x !== value) { + this._x = value; + this.cb.call(this.scope); + } + } + get y() { + return this._y; + } + set y(value) { + if (this._y !== value) { + this._y = value; + this.cb.call(this.scope); + } + } + } + + const _Transform = class { + constructor() { + this.worldTransform = new Matrix(); + this.localTransform = new Matrix(); + this.position = new ObservablePoint(this.onChange, this, 0, 0); + this.scale = new ObservablePoint(this.onChange, this, 1, 1); + this.pivot = new ObservablePoint(this.onChange, this, 0, 0); + this.skew = new ObservablePoint(this.updateSkew, this, 0, 0); + this._rotation = 0; + this._cx = 1; + this._sx = 0; + this._cy = 0; + this._sy = 1; + this._localID = 0; + this._currentLocalID = 0; + this._worldID = 0; + this._parentID = 0; + } + onChange() { + this._localID++; + } + updateSkew() { + this._cx = Math.cos(this._rotation + this.skew.y); + this._sx = Math.sin(this._rotation + this.skew.y); + this._cy = -Math.sin(this._rotation - this.skew.x); + this._sy = Math.cos(this._rotation - this.skew.x); + this._localID++; + } + toString() { + return `[@pixi/math:Transform position=(${this.position.x}, ${this.position.y}) rotation=${this.rotation} scale=(${this.scale.x}, ${this.scale.y}) skew=(${this.skew.x}, ${this.skew.y}) ]`; + } + updateLocalTransform() { + const lt = this.localTransform; + if (this._localID !== this._currentLocalID) { + lt.a = this._cx * this.scale.x; + lt.b = this._sx * this.scale.x; + lt.c = this._cy * this.scale.y; + lt.d = this._sy * this.scale.y; + lt.tx = this.position.x - (this.pivot.x * lt.a + this.pivot.y * lt.c); + lt.ty = this.position.y - (this.pivot.x * lt.b + this.pivot.y * lt.d); + this._currentLocalID = this._localID; + this._parentID = -1; + } + } + updateTransform(parentTransform) { + const lt = this.localTransform; + if (this._localID !== this._currentLocalID) { + lt.a = this._cx * this.scale.x; + lt.b = this._sx * this.scale.x; + lt.c = this._cy * this.scale.y; + lt.d = this._sy * this.scale.y; + lt.tx = this.position.x - (this.pivot.x * lt.a + this.pivot.y * lt.c); + lt.ty = this.position.y - (this.pivot.x * lt.b + this.pivot.y * lt.d); + this._currentLocalID = this._localID; + this._parentID = -1; + } + if (this._parentID !== parentTransform._worldID) { + const pt = parentTransform.worldTransform; + const wt = this.worldTransform; + wt.a = lt.a * pt.a + lt.b * pt.c; + wt.b = lt.a * pt.b + lt.b * pt.d; + wt.c = lt.c * pt.a + lt.d * pt.c; + wt.d = lt.c * pt.b + lt.d * pt.d; + wt.tx = lt.tx * pt.a + lt.ty * pt.c + pt.tx; + wt.ty = lt.tx * pt.b + lt.ty * pt.d + pt.ty; + this._parentID = parentTransform._worldID; + this._worldID++; + } + } + setFromMatrix(matrix) { + matrix.decompose(this); + this._localID++; + } + get rotation() { + return this._rotation; + } + set rotation(value) { + if (this._rotation !== value) { + this._rotation = value; + this.updateSkew(); + } + } + }; + let Transform = _Transform; + Transform.IDENTITY = new _Transform(); + + var defaultFragment$2 = "varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\n\nvoid main(void){\n gl_FragColor *= texture2D(uSampler, vTextureCoord);\n}"; + + var defaultVertex$3 = "attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}\n"; + + function compileShader(gl, type, src) { + const shader = gl.createShader(type); + gl.shaderSource(shader, src); + gl.compileShader(shader); + return shader; + } + + function booleanArray(size) { + const array = new Array(size); + for (let i = 0; i < array.length; i++) { + array[i] = false; + } + return array; + } + function defaultValue(type, size) { + switch (type) { + case "float": + return 0; + case "vec2": + return new Float32Array(2 * size); + case "vec3": + return new Float32Array(3 * size); + case "vec4": + return new Float32Array(4 * size); + case "int": + case "uint": + case "sampler2D": + case "sampler2DArray": + return 0; + case "ivec2": + return new Int32Array(2 * size); + case "ivec3": + return new Int32Array(3 * size); + case "ivec4": + return new Int32Array(4 * size); + case "uvec2": + return new Uint32Array(2 * size); + case "uvec3": + return new Uint32Array(3 * size); + case "uvec4": + return new Uint32Array(4 * size); + case "bool": + return false; + case "bvec2": + return booleanArray(2 * size); + case "bvec3": + return booleanArray(3 * size); + case "bvec4": + return booleanArray(4 * size); + case "mat2": + return new Float32Array([ + 1, + 0, + 0, + 1 + ]); + case "mat3": + return new Float32Array([ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1 + ]); + case "mat4": + return new Float32Array([ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ]); + } + return null; + } + + const uniformParsers = [ + { + test: (data) => data.type === "float" && data.size === 1 && !data.isArray, + code: (name) => ` + if(uv["${name}"] !== ud["${name}"].value) + { + ud["${name}"].value = uv["${name}"] + gl.uniform1f(ud["${name}"].location, uv["${name}"]) + } + ` + }, + { + test: (data, uniform) => (data.type === "sampler2D" || data.type === "samplerCube" || data.type === "sampler2DArray") && data.size === 1 && !data.isArray && (uniform == null || uniform.castToBaseTexture !== void 0), + code: (name) => `t = syncData.textureCount++; + + renderer.texture.bind(uv["${name}"], t); + + if(ud["${name}"].value !== t) + { + ud["${name}"].value = t; + gl.uniform1i(ud["${name}"].location, t); +; // eslint-disable-line max-len + }` + }, + { + test: (data, uniform) => data.type === "mat3" && data.size === 1 && !data.isArray && uniform.a !== void 0, + code: (name) => ` + gl.uniformMatrix3fv(ud["${name}"].location, false, uv["${name}"].toArray(true)); + `, + codeUbo: (name) => ` + var ${name}_matrix = uv.${name}.toArray(true); + + data[offset] = ${name}_matrix[0]; + data[offset+1] = ${name}_matrix[1]; + data[offset+2] = ${name}_matrix[2]; + + data[offset + 4] = ${name}_matrix[3]; + data[offset + 5] = ${name}_matrix[4]; + data[offset + 6] = ${name}_matrix[5]; + + data[offset + 8] = ${name}_matrix[6]; + data[offset + 9] = ${name}_matrix[7]; + data[offset + 10] = ${name}_matrix[8]; + ` + }, + { + test: (data, uniform) => data.type === "vec2" && data.size === 1 && !data.isArray && uniform.x !== void 0, + code: (name) => ` + cv = ud["${name}"].value; + v = uv["${name}"]; + + if(cv[0] !== v.x || cv[1] !== v.y) + { + cv[0] = v.x; + cv[1] = v.y; + gl.uniform2f(ud["${name}"].location, v.x, v.y); + }`, + codeUbo: (name) => ` + v = uv.${name}; + + data[offset] = v.x; + data[offset+1] = v.y; + ` + }, + { + test: (data) => data.type === "vec2" && data.size === 1 && !data.isArray, + code: (name) => ` + cv = ud["${name}"].value; + v = uv["${name}"]; + + if(cv[0] !== v[0] || cv[1] !== v[1]) + { + cv[0] = v[0]; + cv[1] = v[1]; + gl.uniform2f(ud["${name}"].location, v[0], v[1]); + } + ` + }, + { + test: (data, uniform) => data.type === "vec4" && data.size === 1 && !data.isArray && uniform.width !== void 0, + code: (name) => ` + cv = ud["${name}"].value; + v = uv["${name}"]; + + if(cv[0] !== v.x || cv[1] !== v.y || cv[2] !== v.width || cv[3] !== v.height) + { + cv[0] = v.x; + cv[1] = v.y; + cv[2] = v.width; + cv[3] = v.height; + gl.uniform4f(ud["${name}"].location, v.x, v.y, v.width, v.height) + }`, + codeUbo: (name) => ` + v = uv.${name}; + + data[offset] = v.x; + data[offset+1] = v.y; + data[offset+2] = v.width; + data[offset+3] = v.height; + ` + }, + { + test: (data, uniform) => data.type === "vec4" && data.size === 1 && !data.isArray && uniform.red !== void 0, + code: (name) => ` + cv = ud["${name}"].value; + v = uv["${name}"]; + + if(cv[0] !== v.red || cv[1] !== v.green || cv[2] !== v.blue || cv[3] !== v.alpha) + { + cv[0] = v.red; + cv[1] = v.green; + cv[2] = v.blue; + cv[3] = v.alpha; + gl.uniform4f(ud["${name}"].location, v.red, v.green, v.blue, v.alpha) + }`, + codeUbo: (name) => ` + v = uv.${name}; + + data[offset] = v.red; + data[offset+1] = v.green; + data[offset+2] = v.blue; + data[offset+3] = v.alpha; + ` + }, + { + test: (data, uniform) => data.type === "vec3" && data.size === 1 && !data.isArray && uniform.red !== void 0, + code: (name) => ` + cv = ud["${name}"].value; + v = uv["${name}"]; + + if(cv[0] !== v.red || cv[1] !== v.green || cv[2] !== v.blue || cv[3] !== v.a) + { + cv[0] = v.red; + cv[1] = v.green; + cv[2] = v.blue; + + gl.uniform3f(ud["${name}"].location, v.red, v.green, v.blue) + }`, + codeUbo: (name) => ` + v = uv.${name}; + + data[offset] = v.red; + data[offset+1] = v.green; + data[offset+2] = v.blue; + ` + }, + { + test: (data) => data.type === "vec4" && data.size === 1 && !data.isArray, + code: (name) => ` + cv = ud["${name}"].value; + v = uv["${name}"]; + + if(cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3]) + { + cv[0] = v[0]; + cv[1] = v[1]; + cv[2] = v[2]; + cv[3] = v[3]; + + gl.uniform4f(ud["${name}"].location, v[0], v[1], v[2], v[3]) + }` + } + ]; + + const GLSL_TO_SINGLE_SETTERS_CACHED = { + float: ` + if (cv !== v) + { + cu.value = v; + gl.uniform1f(location, v); + }`, + vec2: ` + if (cv[0] !== v[0] || cv[1] !== v[1]) + { + cv[0] = v[0]; + cv[1] = v[1]; + + gl.uniform2f(location, v[0], v[1]) + }`, + vec3: ` + if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2]) + { + cv[0] = v[0]; + cv[1] = v[1]; + cv[2] = v[2]; + + gl.uniform3f(location, v[0], v[1], v[2]) + }`, + vec4: ` + if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3]) + { + cv[0] = v[0]; + cv[1] = v[1]; + cv[2] = v[2]; + cv[3] = v[3]; + + gl.uniform4f(location, v[0], v[1], v[2], v[3]); + }`, + int: ` + if (cv !== v) + { + cu.value = v; + + gl.uniform1i(location, v); + }`, + ivec2: ` + if (cv[0] !== v[0] || cv[1] !== v[1]) + { + cv[0] = v[0]; + cv[1] = v[1]; + + gl.uniform2i(location, v[0], v[1]); + }`, + ivec3: ` + if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2]) + { + cv[0] = v[0]; + cv[1] = v[1]; + cv[2] = v[2]; + + gl.uniform3i(location, v[0], v[1], v[2]); + }`, + ivec4: ` + if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3]) + { + cv[0] = v[0]; + cv[1] = v[1]; + cv[2] = v[2]; + cv[3] = v[3]; + + gl.uniform4i(location, v[0], v[1], v[2], v[3]); + }`, + uint: ` + if (cv !== v) + { + cu.value = v; + + gl.uniform1ui(location, v); + }`, + uvec2: ` + if (cv[0] !== v[0] || cv[1] !== v[1]) + { + cv[0] = v[0]; + cv[1] = v[1]; + + gl.uniform2ui(location, v[0], v[1]); + }`, + uvec3: ` + if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2]) + { + cv[0] = v[0]; + cv[1] = v[1]; + cv[2] = v[2]; + + gl.uniform3ui(location, v[0], v[1], v[2]); + }`, + uvec4: ` + if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3]) + { + cv[0] = v[0]; + cv[1] = v[1]; + cv[2] = v[2]; + cv[3] = v[3]; + + gl.uniform4ui(location, v[0], v[1], v[2], v[3]); + }`, + bool: ` + if (cv !== v) + { + cu.value = v; + gl.uniform1i(location, v); + }`, + bvec2: ` + if (cv[0] != v[0] || cv[1] != v[1]) + { + cv[0] = v[0]; + cv[1] = v[1]; + + gl.uniform2i(location, v[0], v[1]); + }`, + bvec3: ` + if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2]) + { + cv[0] = v[0]; + cv[1] = v[1]; + cv[2] = v[2]; + + gl.uniform3i(location, v[0], v[1], v[2]); + }`, + bvec4: ` + if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3]) + { + cv[0] = v[0]; + cv[1] = v[1]; + cv[2] = v[2]; + cv[3] = v[3]; + + gl.uniform4i(location, v[0], v[1], v[2], v[3]); + }`, + mat2: "gl.uniformMatrix2fv(location, false, v)", + mat3: "gl.uniformMatrix3fv(location, false, v)", + mat4: "gl.uniformMatrix4fv(location, false, v)", + sampler2D: ` + if (cv !== v) + { + cu.value = v; + + gl.uniform1i(location, v); + }`, + samplerCube: ` + if (cv !== v) + { + cu.value = v; + + gl.uniform1i(location, v); + }`, + sampler2DArray: ` + if (cv !== v) + { + cu.value = v; + + gl.uniform1i(location, v); + }` + }; + const GLSL_TO_ARRAY_SETTERS = { + float: `gl.uniform1fv(location, v)`, + vec2: `gl.uniform2fv(location, v)`, + vec3: `gl.uniform3fv(location, v)`, + vec4: "gl.uniform4fv(location, v)", + mat4: "gl.uniformMatrix4fv(location, false, v)", + mat3: "gl.uniformMatrix3fv(location, false, v)", + mat2: "gl.uniformMatrix2fv(location, false, v)", + int: "gl.uniform1iv(location, v)", + ivec2: "gl.uniform2iv(location, v)", + ivec3: "gl.uniform3iv(location, v)", + ivec4: "gl.uniform4iv(location, v)", + uint: "gl.uniform1uiv(location, v)", + uvec2: "gl.uniform2uiv(location, v)", + uvec3: "gl.uniform3uiv(location, v)", + uvec4: "gl.uniform4uiv(location, v)", + bool: "gl.uniform1iv(location, v)", + bvec2: "gl.uniform2iv(location, v)", + bvec3: "gl.uniform3iv(location, v)", + bvec4: "gl.uniform4iv(location, v)", + sampler2D: "gl.uniform1iv(location, v)", + samplerCube: "gl.uniform1iv(location, v)", + sampler2DArray: "gl.uniform1iv(location, v)" + }; + function generateUniformsSync(group, uniformData) { + const funcFragments = [` + var v = null; + var cv = null; + var cu = null; + var t = 0; + var gl = renderer.gl; + `]; + for (const i in group.uniforms) { + const data = uniformData[i]; + if (!data) { + if (group.uniforms[i]?.group) { + if (group.uniforms[i].ubo) { + funcFragments.push(` + renderer.shader.syncUniformBufferGroup(uv.${i}, '${i}'); + `); + } else { + funcFragments.push(` + renderer.shader.syncUniformGroup(uv.${i}, syncData); + `); + } + } + continue; + } + const uniform = group.uniforms[i]; + let parsed = false; + for (let j = 0; j < uniformParsers.length; j++) { + if (uniformParsers[j].test(data, uniform)) { + funcFragments.push(uniformParsers[j].code(i, uniform)); + parsed = true; + break; + } + } + if (!parsed) { + const templateType = data.size === 1 && !data.isArray ? GLSL_TO_SINGLE_SETTERS_CACHED : GLSL_TO_ARRAY_SETTERS; + const template = templateType[data.type].replace("location", `ud["${i}"].location`); + funcFragments.push(` + cu = ud["${i}"]; + cv = cu.value; + v = uv["${i}"]; + ${template};`); + } + } + return new Function("ud", "uv", "renderer", "syncData", funcFragments.join("\n")); + } + + const unknownContext = {}; + let context = unknownContext; + function getTestContext() { + if (context === unknownContext || context?.isContextLost()) { + const canvas = settings.ADAPTER.createCanvas(); + let gl; + if (settings.PREFER_ENV >= ENV.WEBGL2) { + gl = canvas.getContext("webgl2", {}); + } + if (!gl) { + gl = canvas.getContext("webgl", {}) || canvas.getContext("experimental-webgl", {}); + if (!gl) { + gl = null; + } else { + gl.getExtension("WEBGL_draw_buffers"); + } + } + context = gl; + } + return context; + } + + let maxFragmentPrecision; + function getMaxFragmentPrecision() { + if (!maxFragmentPrecision) { + maxFragmentPrecision = PRECISION.MEDIUM; + const gl = getTestContext(); + if (gl) { + if (gl.getShaderPrecisionFormat) { + const shaderFragment = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT); + maxFragmentPrecision = shaderFragment.precision ? PRECISION.HIGH : PRECISION.MEDIUM; + } + } + } + return maxFragmentPrecision; + } + + function logPrettyShaderError(gl, shader) { + const shaderSrc = gl.getShaderSource(shader).split("\n").map((line, index) => `${index}: ${line}`); + const shaderLog = gl.getShaderInfoLog(shader); + const splitShader = shaderLog.split("\n"); + const dedupe = {}; + const lineNumbers = splitShader.map((line) => parseFloat(line.replace(/^ERROR\: 0\:([\d]+)\:.*$/, "$1"))).filter((n) => { + if (n && !dedupe[n]) { + dedupe[n] = true; + return true; + } + return false; + }); + const logArgs = [""]; + lineNumbers.forEach((number) => { + shaderSrc[number - 1] = `%c${shaderSrc[number - 1]}%c`; + logArgs.push("background: #FF0000; color:#FFFFFF; font-size: 10px", "font-size: 10px"); + }); + const fragmentSourceToLog = shaderSrc.join("\n"); + logArgs[0] = fragmentSourceToLog; + console.error(shaderLog); + console.groupCollapsed("click to view full shader code"); + console.warn(...logArgs); + console.groupEnd(); + } + function logProgramError(gl, program, vertexShader, fragmentShader) { + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) { + logPrettyShaderError(gl, vertexShader); + } + if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { + logPrettyShaderError(gl, fragmentShader); + } + console.error("PixiJS Error: Could not initialize shader."); + if (gl.getProgramInfoLog(program) !== "") { + console.warn("PixiJS Warning: gl.getProgramInfoLog()", gl.getProgramInfoLog(program)); + } + } + } + + const GLSL_TO_SIZE = { + float: 1, + vec2: 2, + vec3: 3, + vec4: 4, + int: 1, + ivec2: 2, + ivec3: 3, + ivec4: 4, + uint: 1, + uvec2: 2, + uvec3: 3, + uvec4: 4, + bool: 1, + bvec2: 2, + bvec3: 3, + bvec4: 4, + mat2: 4, + mat3: 9, + mat4: 16, + sampler2D: 1 + }; + function mapSize(type) { + return GLSL_TO_SIZE[type]; + } + + let GL_TABLE = null; + const GL_TO_GLSL_TYPES = { + FLOAT: "float", + FLOAT_VEC2: "vec2", + FLOAT_VEC3: "vec3", + FLOAT_VEC4: "vec4", + INT: "int", + INT_VEC2: "ivec2", + INT_VEC3: "ivec3", + INT_VEC4: "ivec4", + UNSIGNED_INT: "uint", + UNSIGNED_INT_VEC2: "uvec2", + UNSIGNED_INT_VEC3: "uvec3", + UNSIGNED_INT_VEC4: "uvec4", + BOOL: "bool", + BOOL_VEC2: "bvec2", + BOOL_VEC3: "bvec3", + BOOL_VEC4: "bvec4", + FLOAT_MAT2: "mat2", + FLOAT_MAT3: "mat3", + FLOAT_MAT4: "mat4", + SAMPLER_2D: "sampler2D", + INT_SAMPLER_2D: "sampler2D", + UNSIGNED_INT_SAMPLER_2D: "sampler2D", + SAMPLER_CUBE: "samplerCube", + INT_SAMPLER_CUBE: "samplerCube", + UNSIGNED_INT_SAMPLER_CUBE: "samplerCube", + SAMPLER_2D_ARRAY: "sampler2DArray", + INT_SAMPLER_2D_ARRAY: "sampler2DArray", + UNSIGNED_INT_SAMPLER_2D_ARRAY: "sampler2DArray" + }; + function mapType(gl, type) { + if (!GL_TABLE) { + const typeNames = Object.keys(GL_TO_GLSL_TYPES); + GL_TABLE = {}; + for (let i = 0; i < typeNames.length; ++i) { + const tn = typeNames[i]; + GL_TABLE[gl[tn]] = GL_TO_GLSL_TYPES[tn]; + } + } + return GL_TABLE[type]; + } + + function setPrecision(src, requestedPrecision, maxSupportedPrecision) { + if (src.substring(0, 9) !== "precision") { + let precision = requestedPrecision; + if (requestedPrecision === PRECISION.HIGH && maxSupportedPrecision !== PRECISION.HIGH) { + precision = PRECISION.MEDIUM; + } + return `precision ${precision} float; +${src}`; + } else if (maxSupportedPrecision !== PRECISION.HIGH && src.substring(0, 15) === "precision highp") { + return src.replace("precision highp", "precision mediump"); + } + return src; + } + + let unsafeEval; + function unsafeEvalSupported() { + if (typeof unsafeEval === "boolean") { + return unsafeEval; + } + try { + const func = new Function("param1", "param2", "param3", "return param1[param2] === param3;"); + unsafeEval = func({ a: "b" }, "a", "b") === true; + } catch (e) { + unsafeEval = false; + } + return unsafeEval; + } + + let UID$2 = 0; + const nameCache = {}; + const _Program = class { + constructor(vertexSrc, fragmentSrc, name = "pixi-shader", extra = {}) { + this.extra = {}; + this.id = UID$2++; + this.vertexSrc = vertexSrc || _Program.defaultVertexSrc; + this.fragmentSrc = fragmentSrc || _Program.defaultFragmentSrc; + this.vertexSrc = this.vertexSrc.trim(); + this.fragmentSrc = this.fragmentSrc.trim(); + this.extra = extra; + if (this.vertexSrc.substring(0, 8) !== "#version") { + name = name.replace(/\s+/g, "-"); + if (nameCache[name]) { + nameCache[name]++; + name += `-${nameCache[name]}`; + } else { + nameCache[name] = 1; + } + this.vertexSrc = `#define SHADER_NAME ${name} +${this.vertexSrc}`; + this.fragmentSrc = `#define SHADER_NAME ${name} +${this.fragmentSrc}`; + this.vertexSrc = setPrecision(this.vertexSrc, _Program.defaultVertexPrecision, PRECISION.HIGH); + this.fragmentSrc = setPrecision(this.fragmentSrc, _Program.defaultFragmentPrecision, getMaxFragmentPrecision()); + } + this.glPrograms = {}; + this.syncUniforms = null; + } + static get defaultVertexSrc() { + return defaultVertex$3; + } + static get defaultFragmentSrc() { + return defaultFragment$2; + } + static from(vertexSrc, fragmentSrc, name) { + const key = vertexSrc + fragmentSrc; + let program = ProgramCache[key]; + if (!program) { + ProgramCache[key] = program = new _Program(vertexSrc, fragmentSrc, name); + } + return program; + } + }; + let Program = _Program; + Program.defaultVertexPrecision = PRECISION.HIGH; + Program.defaultFragmentPrecision = isMobile.apple.device ? PRECISION.HIGH : PRECISION.MEDIUM; + + let UID$1 = 0; + class UniformGroup { + constructor(uniforms, isStatic, isUbo) { + this.group = true; + this.syncUniforms = {}; + this.dirtyId = 0; + this.id = UID$1++; + this.static = !!isStatic; + this.ubo = !!isUbo; + if (uniforms instanceof Buffer) { + this.buffer = uniforms; + this.buffer.type = BUFFER_TYPE.UNIFORM_BUFFER; + this.autoManage = false; + this.ubo = true; + } else { + this.uniforms = uniforms; + if (this.ubo) { + this.buffer = new Buffer(new Float32Array(1)); + this.buffer.type = BUFFER_TYPE.UNIFORM_BUFFER; + this.autoManage = true; + } + } + } + update() { + this.dirtyId++; + if (!this.autoManage && this.buffer) { + this.buffer.update(); + } + } + add(name, uniforms, _static) { + if (!this.ubo) { + this.uniforms[name] = new UniformGroup(uniforms, _static); + } else { + throw new Error("[UniformGroup] uniform groups in ubo mode cannot be modified, or have uniform groups nested in them"); + } + } + static from(uniforms, _static, _ubo) { + return new UniformGroup(uniforms, _static, _ubo); + } + static uboFrom(uniforms, _static) { + return new UniformGroup(uniforms, _static ?? true, true); + } + } + + class Shader { + constructor(program, uniforms) { + this.uniformBindCount = 0; + this.program = program; + if (uniforms) { + if (uniforms instanceof UniformGroup) { + this.uniformGroup = uniforms; + } else { + this.uniformGroup = new UniformGroup(uniforms); + } + } else { + this.uniformGroup = new UniformGroup({}); + } + this.disposeRunner = new Runner("disposeShader"); + } + checkUniformExists(name, group) { + if (group.uniforms[name]) { + return true; + } + for (const i in group.uniforms) { + const uniform = group.uniforms[i]; + if (uniform.group) { + if (this.checkUniformExists(name, uniform)) { + return true; + } + } + } + return false; + } + destroy() { + this.uniformGroup = null; + this.disposeRunner.emit(this); + this.disposeRunner.destroy(); + } + get uniforms() { + return this.uniformGroup.uniforms; + } + static from(vertexSrc, fragmentSrc, uniforms) { + const program = Program.from(vertexSrc, fragmentSrc); + return new Shader(program, uniforms); + } + } + + class BatchShaderGenerator { + constructor(vertexSrc, fragTemplate) { + this.vertexSrc = vertexSrc; + this.fragTemplate = fragTemplate; + this.programCache = {}; + this.defaultGroupCache = {}; + if (!fragTemplate.includes("%count%")) { + throw new Error('Fragment template must contain "%count%".'); + } + if (!fragTemplate.includes("%forloop%")) { + throw new Error('Fragment template must contain "%forloop%".'); + } + } + generateShader(maxTextures) { + if (!this.programCache[maxTextures]) { + const sampleValues = new Int32Array(maxTextures); + for (let i = 0; i < maxTextures; i++) { + sampleValues[i] = i; + } + this.defaultGroupCache[maxTextures] = UniformGroup.from({ uSamplers: sampleValues }, true); + let fragmentSrc = this.fragTemplate; + fragmentSrc = fragmentSrc.replace(/%count%/gi, `${maxTextures}`); + fragmentSrc = fragmentSrc.replace(/%forloop%/gi, this.generateSampleSrc(maxTextures)); + this.programCache[maxTextures] = new Program(this.vertexSrc, fragmentSrc); + } + const uniforms = { + tint: new Float32Array([1, 1, 1, 1]), + translationMatrix: new Matrix(), + default: this.defaultGroupCache[maxTextures] + }; + return new Shader(this.programCache[maxTextures], uniforms); + } + generateSampleSrc(maxTextures) { + let src = ""; + src += "\n"; + src += "\n"; + for (let i = 0; i < maxTextures; i++) { + if (i > 0) { + src += "\nelse "; + } + if (i < maxTextures - 1) { + src += `if(vTextureId < ${i}.5)`; + } + src += "\n{"; + src += ` + color = texture2D(uSamplers[${i}], vTextureCoord);`; + src += "\n}"; + } + src += "\n"; + src += "\n"; + return src; + } + } + + class BatchTextureArray { + constructor() { + this.elements = []; + this.ids = []; + this.count = 0; + } + clear() { + for (let i = 0; i < this.count; i++) { + this.elements[i] = null; + } + this.count = 0; + } + } + + function canUploadSameBuffer() { + return !isMobile.apple.device; + } + + function maxRecommendedTextures(max) { + let allowMax = true; + const navigator = settings.ADAPTER.getNavigator(); + if (isMobile.tablet || isMobile.phone) { + if (isMobile.apple.device) { + const match = navigator.userAgent.match(/OS (\d+)_(\d+)?/); + if (match) { + const majorVersion = parseInt(match[1], 10); + if (majorVersion < 11) { + allowMax = false; + } + } + } + if (isMobile.android.device) { + const match = navigator.userAgent.match(/Android\s([0-9.]*)/); + if (match) { + const majorVersion = parseInt(match[1], 10); + if (majorVersion < 7) { + allowMax = false; + } + } + } + } + return allowMax ? max : 4; + } + + class ObjectRenderer { + constructor(renderer) { + this.renderer = renderer; + } + flush() { + } + destroy() { + this.renderer = null; + } + start() { + } + stop() { + this.flush(); + } + render(_object) { + } + } + + var defaultFragment$1 = "varying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\nuniform sampler2D uSamplers[%count%];\n\nvoid main(void){\n vec4 color;\n %forloop%\n gl_FragColor = color * vColor;\n}\n"; + + var defaultVertex$2 = "precision highp float;\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\nattribute float aTextureId;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform vec4 tint;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = aTextureCoord;\n vTextureId = aTextureId;\n vColor = aColor * tint;\n}\n"; + + const _BatchRenderer = class extends ObjectRenderer { + constructor(renderer) { + super(renderer); + this.setShaderGenerator(); + this.geometryClass = BatchGeometry; + this.vertexSize = 6; + this.state = State.for2d(); + this.size = _BatchRenderer.defaultBatchSize * 4; + this._vertexCount = 0; + this._indexCount = 0; + this._bufferedElements = []; + this._bufferedTextures = []; + this._bufferSize = 0; + this._shader = null; + this._packedGeometries = []; + this._packedGeometryPoolSize = 2; + this._flushId = 0; + this._aBuffers = {}; + this._iBuffers = {}; + this.maxTextures = 1; + this.renderer.on("prerender", this.onPrerender, this); + renderer.runners.contextChange.add(this); + this._dcIndex = 0; + this._aIndex = 0; + this._iIndex = 0; + this._attributeBuffer = null; + this._indexBuffer = null; + this._tempBoundTextures = []; + } + static get defaultMaxTextures() { + this._defaultMaxTextures = this._defaultMaxTextures ?? maxRecommendedTextures(32); + return this._defaultMaxTextures; + } + static set defaultMaxTextures(value) { + this._defaultMaxTextures = value; + } + static get canUploadSameBuffer() { + this._canUploadSameBuffer = this._canUploadSameBuffer ?? canUploadSameBuffer(); + return this._canUploadSameBuffer; + } + static set canUploadSameBuffer(value) { + this._canUploadSameBuffer = value; + } + get MAX_TEXTURES() { + deprecation("7.1.0", "BatchRenderer#MAX_TEXTURES renamed to BatchRenderer#maxTextures"); + return this.maxTextures; + } + static get defaultVertexSrc() { + return defaultVertex$2; + } + static get defaultFragmentTemplate() { + return defaultFragment$1; + } + setShaderGenerator({ + vertex = _BatchRenderer.defaultVertexSrc, + fragment = _BatchRenderer.defaultFragmentTemplate + } = {}) { + this.shaderGenerator = new BatchShaderGenerator(vertex, fragment); + } + contextChange() { + const gl = this.renderer.gl; + if (settings.PREFER_ENV === ENV.WEBGL_LEGACY) { + this.maxTextures = 1; + } else { + this.maxTextures = Math.min(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS), _BatchRenderer.defaultMaxTextures); + this.maxTextures = checkMaxIfStatementsInShader(this.maxTextures, gl); + } + this._shader = this.shaderGenerator.generateShader(this.maxTextures); + for (let i = 0; i < this._packedGeometryPoolSize; i++) { + this._packedGeometries[i] = new this.geometryClass(); + } + this.initFlushBuffers(); + } + initFlushBuffers() { + const { + _drawCallPool, + _textureArrayPool + } = _BatchRenderer; + const MAX_SPRITES = this.size / 4; + const MAX_TA = Math.floor(MAX_SPRITES / this.maxTextures) + 1; + while (_drawCallPool.length < MAX_SPRITES) { + _drawCallPool.push(new BatchDrawCall()); + } + while (_textureArrayPool.length < MAX_TA) { + _textureArrayPool.push(new BatchTextureArray()); + } + for (let i = 0; i < this.maxTextures; i++) { + this._tempBoundTextures[i] = null; + } + } + onPrerender() { + this._flushId = 0; + } + render(element) { + if (!element._texture.valid) { + return; + } + if (this._vertexCount + element.vertexData.length / 2 > this.size) { + this.flush(); + } + this._vertexCount += element.vertexData.length / 2; + this._indexCount += element.indices.length; + this._bufferedTextures[this._bufferSize] = element._texture.baseTexture; + this._bufferedElements[this._bufferSize++] = element; + } + buildTexturesAndDrawCalls() { + const { + _bufferedTextures: textures, + maxTextures + } = this; + const textureArrays = _BatchRenderer._textureArrayPool; + const batch = this.renderer.batch; + const boundTextures = this._tempBoundTextures; + const touch = this.renderer.textureGC.count; + let TICK = ++BaseTexture._globalBatch; + let countTexArrays = 0; + let texArray = textureArrays[0]; + let start = 0; + batch.copyBoundTextures(boundTextures, maxTextures); + for (let i = 0; i < this._bufferSize; ++i) { + const tex = textures[i]; + textures[i] = null; + if (tex._batchEnabled === TICK) { + continue; + } + if (texArray.count >= maxTextures) { + batch.boundArray(texArray, boundTextures, TICK, maxTextures); + this.buildDrawCalls(texArray, start, i); + start = i; + texArray = textureArrays[++countTexArrays]; + ++TICK; + } + tex._batchEnabled = TICK; + tex.touched = touch; + texArray.elements[texArray.count++] = tex; + } + if (texArray.count > 0) { + batch.boundArray(texArray, boundTextures, TICK, maxTextures); + this.buildDrawCalls(texArray, start, this._bufferSize); + ++countTexArrays; + ++TICK; + } + for (let i = 0; i < boundTextures.length; i++) { + boundTextures[i] = null; + } + BaseTexture._globalBatch = TICK; + } + buildDrawCalls(texArray, start, finish) { + const { + _bufferedElements: elements, + _attributeBuffer, + _indexBuffer, + vertexSize + } = this; + const drawCalls = _BatchRenderer._drawCallPool; + let dcIndex = this._dcIndex; + let aIndex = this._aIndex; + let iIndex = this._iIndex; + let drawCall = drawCalls[dcIndex]; + drawCall.start = this._iIndex; + drawCall.texArray = texArray; + for (let i = start; i < finish; ++i) { + const sprite = elements[i]; + const tex = sprite._texture.baseTexture; + const spriteBlendMode = premultiplyBlendMode[tex.alphaMode ? 1 : 0][sprite.blendMode]; + elements[i] = null; + if (start < i && drawCall.blend !== spriteBlendMode) { + drawCall.size = iIndex - drawCall.start; + start = i; + drawCall = drawCalls[++dcIndex]; + drawCall.texArray = texArray; + drawCall.start = iIndex; + } + this.packInterleavedGeometry(sprite, _attributeBuffer, _indexBuffer, aIndex, iIndex); + aIndex += sprite.vertexData.length / 2 * vertexSize; + iIndex += sprite.indices.length; + drawCall.blend = spriteBlendMode; + } + if (start < finish) { + drawCall.size = iIndex - drawCall.start; + ++dcIndex; + } + this._dcIndex = dcIndex; + this._aIndex = aIndex; + this._iIndex = iIndex; + } + bindAndClearTexArray(texArray) { + const textureSystem = this.renderer.texture; + for (let j = 0; j < texArray.count; j++) { + textureSystem.bind(texArray.elements[j], texArray.ids[j]); + texArray.elements[j] = null; + } + texArray.count = 0; + } + updateGeometry() { + const { + _packedGeometries: packedGeometries, + _attributeBuffer: attributeBuffer, + _indexBuffer: indexBuffer + } = this; + if (!_BatchRenderer.canUploadSameBuffer) { + if (this._packedGeometryPoolSize <= this._flushId) { + this._packedGeometryPoolSize++; + packedGeometries[this._flushId] = new this.geometryClass(); + } + packedGeometries[this._flushId]._buffer.update(attributeBuffer.rawBinaryData); + packedGeometries[this._flushId]._indexBuffer.update(indexBuffer); + this.renderer.geometry.bind(packedGeometries[this._flushId]); + this.renderer.geometry.updateBuffers(); + this._flushId++; + } else { + packedGeometries[this._flushId]._buffer.update(attributeBuffer.rawBinaryData); + packedGeometries[this._flushId]._indexBuffer.update(indexBuffer); + this.renderer.geometry.updateBuffers(); + } + } + drawBatches() { + const dcCount = this._dcIndex; + const { gl, state: stateSystem } = this.renderer; + const drawCalls = _BatchRenderer._drawCallPool; + let curTexArray = null; + for (let i = 0; i < dcCount; i++) { + const { texArray, type, size, start, blend } = drawCalls[i]; + if (curTexArray !== texArray) { + curTexArray = texArray; + this.bindAndClearTexArray(texArray); + } + this.state.blendMode = blend; + stateSystem.set(this.state); + gl.drawElements(type, size, gl.UNSIGNED_SHORT, start * 2); + } + } + flush() { + if (this._vertexCount === 0) { + return; + } + this._attributeBuffer = this.getAttributeBuffer(this._vertexCount); + this._indexBuffer = this.getIndexBuffer(this._indexCount); + this._aIndex = 0; + this._iIndex = 0; + this._dcIndex = 0; + this.buildTexturesAndDrawCalls(); + this.updateGeometry(); + this.drawBatches(); + this._bufferSize = 0; + this._vertexCount = 0; + this._indexCount = 0; + } + start() { + this.renderer.state.set(this.state); + this.renderer.texture.ensureSamplerType(this.maxTextures); + this.renderer.shader.bind(this._shader); + if (_BatchRenderer.canUploadSameBuffer) { + this.renderer.geometry.bind(this._packedGeometries[this._flushId]); + } + } + stop() { + this.flush(); + } + destroy() { + for (let i = 0; i < this._packedGeometryPoolSize; i++) { + if (this._packedGeometries[i]) { + this._packedGeometries[i].destroy(); + } + } + this.renderer.off("prerender", this.onPrerender, this); + this._aBuffers = null; + this._iBuffers = null; + this._packedGeometries = null; + this._attributeBuffer = null; + this._indexBuffer = null; + if (this._shader) { + this._shader.destroy(); + this._shader = null; + } + super.destroy(); + } + getAttributeBuffer(size) { + const roundedP2 = nextPow2(Math.ceil(size / 8)); + const roundedSizeIndex = log2(roundedP2); + const roundedSize = roundedP2 * 8; + if (this._aBuffers.length <= roundedSizeIndex) { + this._iBuffers.length = roundedSizeIndex + 1; + } + let buffer = this._aBuffers[roundedSize]; + if (!buffer) { + this._aBuffers[roundedSize] = buffer = new ViewableBuffer(roundedSize * this.vertexSize * 4); + } + return buffer; + } + getIndexBuffer(size) { + const roundedP2 = nextPow2(Math.ceil(size / 12)); + const roundedSizeIndex = log2(roundedP2); + const roundedSize = roundedP2 * 12; + if (this._iBuffers.length <= roundedSizeIndex) { + this._iBuffers.length = roundedSizeIndex + 1; + } + let buffer = this._iBuffers[roundedSizeIndex]; + if (!buffer) { + this._iBuffers[roundedSizeIndex] = buffer = new Uint16Array(roundedSize); + } + return buffer; + } + packInterleavedGeometry(element, attributeBuffer, indexBuffer, aIndex, iIndex) { + const { + uint32View, + float32View + } = attributeBuffer; + const packedVertices = aIndex / this.vertexSize; + const uvs = element.uvs; + const indicies = element.indices; + const vertexData = element.vertexData; + const textureId = element._texture.baseTexture._batchLocation; + const alpha = Math.min(element.worldAlpha, 1); + const argb = Color.shared.setValue(element._tintRGB).toPremultiplied(alpha); + for (let i = 0; i < vertexData.length; i += 2) { + float32View[aIndex++] = vertexData[i]; + float32View[aIndex++] = vertexData[i + 1]; + float32View[aIndex++] = uvs[i]; + float32View[aIndex++] = uvs[i + 1]; + uint32View[aIndex++] = argb; + float32View[aIndex++] = textureId; + } + for (let i = 0; i < indicies.length; i++) { + indexBuffer[iIndex++] = packedVertices + indicies[i]; + } + } + }; + let BatchRenderer = _BatchRenderer; + BatchRenderer.defaultBatchSize = 4096; + BatchRenderer.extension = { + name: "batch", + type: ExtensionType.RendererPlugin + }; + BatchRenderer._drawCallPool = []; + BatchRenderer._textureArrayPool = []; + extensions$1.add(BatchRenderer); + + var defaultFragment = "varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\n\nvoid main(void){\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n}\n"; + + var defaultVertex$1 = "attribute vec2 aVertexPosition;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nuniform vec4 inputSize;\nuniform vec4 outputFrame;\n\nvec4 filterVertexPosition( void )\n{\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\n\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord( void )\n{\n return aVertexPosition * (outputFrame.zw * inputSize.zw);\n}\n\nvoid main(void)\n{\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n"; + + const _Filter = class extends Shader { + constructor(vertexSrc, fragmentSrc, uniforms) { + const program = Program.from(vertexSrc || _Filter.defaultVertexSrc, fragmentSrc || _Filter.defaultFragmentSrc); + super(program, uniforms); + this.padding = 0; + this.resolution = _Filter.defaultResolution; + this.multisample = _Filter.defaultMultisample; + this.enabled = true; + this.autoFit = true; + this.state = new State(); + } + apply(filterManager, input, output, clearMode, _currentState) { + filterManager.applyFilter(this, input, output, clearMode); + } + get blendMode() { + return this.state.blendMode; + } + set blendMode(value) { + this.state.blendMode = value; + } + get resolution() { + return this._resolution; + } + set resolution(value) { + this._resolution = value; + } + static get defaultVertexSrc() { + return defaultVertex$1; + } + static get defaultFragmentSrc() { + return defaultFragment; + } + }; + let Filter = _Filter; + Filter.defaultResolution = 1; + Filter.defaultMultisample = MSAA_QUALITY.NONE; + + class BackgroundSystem { + constructor() { + this.clearBeforeRender = true; + this._backgroundColor = new Color(0); + this.alpha = 1; + } + init(options) { + this.clearBeforeRender = options.clearBeforeRender; + const { backgroundColor, background, backgroundAlpha } = options; + const color = background ?? backgroundColor; + if (color !== void 0) { + this.color = color; + } + this.alpha = backgroundAlpha; + } + get color() { + return this._backgroundColor.value; + } + set color(value) { + this._backgroundColor.setValue(value); + } + get alpha() { + return this._backgroundColor.alpha; + } + set alpha(value) { + this._backgroundColor.setAlpha(value); + } + get backgroundColor() { + return this._backgroundColor; + } + destroy() { + } + } + BackgroundSystem.defaultOptions = { + backgroundAlpha: 1, + backgroundColor: 0, + clearBeforeRender: true + }; + BackgroundSystem.extension = { + type: [ + ExtensionType.RendererSystem, + ExtensionType.CanvasRendererSystem + ], + name: "background" + }; + extensions$1.add(BackgroundSystem); + + class BatchSystem { + constructor(renderer) { + this.renderer = renderer; + this.emptyRenderer = new ObjectRenderer(renderer); + this.currentRenderer = this.emptyRenderer; + } + setObjectRenderer(objectRenderer) { + if (this.currentRenderer === objectRenderer) { + return; + } + this.currentRenderer.stop(); + this.currentRenderer = objectRenderer; + this.currentRenderer.start(); + } + flush() { + this.setObjectRenderer(this.emptyRenderer); + } + reset() { + this.setObjectRenderer(this.emptyRenderer); + } + copyBoundTextures(arr, maxTextures) { + const { boundTextures } = this.renderer.texture; + for (let i = maxTextures - 1; i >= 0; --i) { + arr[i] = boundTextures[i] || null; + if (arr[i]) { + arr[i]._batchLocation = i; + } + } + } + boundArray(texArray, boundTextures, batchId, maxTextures) { + const { elements, ids, count } = texArray; + let j = 0; + for (let i = 0; i < count; i++) { + const tex = elements[i]; + const loc = tex._batchLocation; + if (loc >= 0 && loc < maxTextures && boundTextures[loc] === tex) { + ids[i] = loc; + continue; + } + while (j < maxTextures) { + const bound = boundTextures[j]; + if (bound && bound._batchEnabled === batchId && bound._batchLocation === j) { + j++; + continue; + } + ids[i] = j; + tex._batchLocation = j; + boundTextures[j] = tex; + break; + } + } + } + destroy() { + this.renderer = null; + } + } + BatchSystem.extension = { + type: ExtensionType.RendererSystem, + name: "batch" + }; + extensions$1.add(BatchSystem); + + let CONTEXT_UID_COUNTER = 0; + class ContextSystem { + constructor(renderer) { + this.renderer = renderer; + this.webGLVersion = 1; + this.extensions = {}; + this.supports = { + uint32Indices: false + }; + this.handleContextLost = this.handleContextLost.bind(this); + this.handleContextRestored = this.handleContextRestored.bind(this); + } + get isLost() { + return !this.gl || this.gl.isContextLost(); + } + contextChange(gl) { + this.gl = gl; + this.renderer.gl = gl; + this.renderer.CONTEXT_UID = CONTEXT_UID_COUNTER++; + } + init(options) { + if (options.context) { + this.initFromContext(options.context); + } else { + const alpha = this.renderer.background.alpha < 1; + const premultipliedAlpha = options.premultipliedAlpha; + this.preserveDrawingBuffer = options.preserveDrawingBuffer; + this.useContextAlpha = options.useContextAlpha; + this.powerPreference = options.powerPreference; + this.initFromOptions({ + alpha, + premultipliedAlpha, + antialias: options.antialias, + stencil: true, + preserveDrawingBuffer: options.preserveDrawingBuffer, + powerPreference: options.powerPreference + }); + } + } + initFromContext(gl) { + this.gl = gl; + this.validateContext(gl); + this.renderer.gl = gl; + this.renderer.CONTEXT_UID = CONTEXT_UID_COUNTER++; + this.renderer.runners.contextChange.emit(gl); + const view = this.renderer.view; + if (view.addEventListener !== void 0) { + view.addEventListener("webglcontextlost", this.handleContextLost, false); + view.addEventListener("webglcontextrestored", this.handleContextRestored, false); + } + } + initFromOptions(options) { + const gl = this.createContext(this.renderer.view, options); + this.initFromContext(gl); + } + createContext(canvas, options) { + let gl; + if (settings.PREFER_ENV >= ENV.WEBGL2) { + gl = canvas.getContext("webgl2", options); + } + if (gl) { + this.webGLVersion = 2; + } else { + this.webGLVersion = 1; + gl = canvas.getContext("webgl", options) || canvas.getContext("experimental-webgl", options); + if (!gl) { + throw new Error("This browser does not support WebGL. Try using the canvas renderer"); + } + } + this.gl = gl; + this.getExtensions(); + return this.gl; + } + getExtensions() { + const { gl } = this; + const common = { + loseContext: gl.getExtension("WEBGL_lose_context"), + anisotropicFiltering: gl.getExtension("EXT_texture_filter_anisotropic"), + floatTextureLinear: gl.getExtension("OES_texture_float_linear"), + s3tc: gl.getExtension("WEBGL_compressed_texture_s3tc"), + s3tc_sRGB: gl.getExtension("WEBGL_compressed_texture_s3tc_srgb"), + etc: gl.getExtension("WEBGL_compressed_texture_etc"), + etc1: gl.getExtension("WEBGL_compressed_texture_etc1"), + pvrtc: gl.getExtension("WEBGL_compressed_texture_pvrtc") || gl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"), + atc: gl.getExtension("WEBGL_compressed_texture_atc"), + astc: gl.getExtension("WEBGL_compressed_texture_astc") + }; + if (this.webGLVersion === 1) { + Object.assign(this.extensions, common, { + drawBuffers: gl.getExtension("WEBGL_draw_buffers"), + depthTexture: gl.getExtension("WEBGL_depth_texture"), + vertexArrayObject: gl.getExtension("OES_vertex_array_object") || gl.getExtension("MOZ_OES_vertex_array_object") || gl.getExtension("WEBKIT_OES_vertex_array_object"), + uint32ElementIndex: gl.getExtension("OES_element_index_uint"), + floatTexture: gl.getExtension("OES_texture_float"), + floatTextureLinear: gl.getExtension("OES_texture_float_linear"), + textureHalfFloat: gl.getExtension("OES_texture_half_float"), + textureHalfFloatLinear: gl.getExtension("OES_texture_half_float_linear") + }); + } else if (this.webGLVersion === 2) { + Object.assign(this.extensions, common, { + colorBufferFloat: gl.getExtension("EXT_color_buffer_float") + }); + } + } + handleContextLost(event) { + event.preventDefault(); + setTimeout(() => { + if (this.gl.isContextLost() && this.extensions.loseContext) { + this.extensions.loseContext.restoreContext(); + } + }, 0); + } + handleContextRestored() { + this.renderer.runners.contextChange.emit(this.gl); + } + destroy() { + const view = this.renderer.view; + this.renderer = null; + if (view.removeEventListener !== void 0) { + view.removeEventListener("webglcontextlost", this.handleContextLost); + view.removeEventListener("webglcontextrestored", this.handleContextRestored); + } + this.gl.useProgram(null); + if (this.extensions.loseContext) { + this.extensions.loseContext.loseContext(); + } + } + postrender() { + if (this.renderer.objectRenderer.renderingToScreen) { + this.gl.flush(); + } + } + validateContext(gl) { + const attributes = gl.getContextAttributes(); + const isWebGl2 = "WebGL2RenderingContext" in globalThis && gl instanceof globalThis.WebGL2RenderingContext; + if (isWebGl2) { + this.webGLVersion = 2; + } + if (attributes && !attributes.stencil) { + console.warn("Provided WebGL context does not have a stencil buffer, masks may not render correctly"); + } + const hasuint32 = isWebGl2 || !!gl.getExtension("OES_element_index_uint"); + this.supports.uint32Indices = hasuint32; + if (!hasuint32) { + console.warn("Provided WebGL context does not support 32 index buffer, complex graphics may not render correctly"); + } + } + } + ContextSystem.defaultOptions = { + context: null, + antialias: false, + premultipliedAlpha: true, + preserveDrawingBuffer: false, + powerPreference: "default" + }; + ContextSystem.extension = { + type: ExtensionType.RendererSystem, + name: "context" + }; + extensions$1.add(ContextSystem); + + class DepthResource extends BufferResource { + upload(renderer, baseTexture, glTexture) { + const gl = renderer.gl; + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, baseTexture.alphaMode === ALPHA_MODES.UNPACK); + const width = baseTexture.realWidth; + const height = baseTexture.realHeight; + if (glTexture.width === width && glTexture.height === height) { + gl.texSubImage2D(baseTexture.target, 0, 0, 0, width, height, baseTexture.format, glTexture.type, this.data); + } else { + glTexture.width = width; + glTexture.height = height; + gl.texImage2D(baseTexture.target, 0, glTexture.internalFormat, width, height, 0, baseTexture.format, glTexture.type, this.data); + } + return true; + } + } + + class Framebuffer { + constructor(width, height) { + this.width = Math.round(width || 100); + this.height = Math.round(height || 100); + this.stencil = false; + this.depth = false; + this.dirtyId = 0; + this.dirtyFormat = 0; + this.dirtySize = 0; + this.depthTexture = null; + this.colorTextures = []; + this.glFramebuffers = {}; + this.disposeRunner = new Runner("disposeFramebuffer"); + this.multisample = MSAA_QUALITY.NONE; + } + get colorTexture() { + return this.colorTextures[0]; + } + addColorTexture(index = 0, texture) { + this.colorTextures[index] = texture || new BaseTexture(null, { + scaleMode: SCALE_MODES.NEAREST, + resolution: 1, + mipmap: MIPMAP_MODES.OFF, + width: this.width, + height: this.height + }); + this.dirtyId++; + this.dirtyFormat++; + return this; + } + addDepthTexture(texture) { + this.depthTexture = texture || new BaseTexture(new DepthResource(null, { width: this.width, height: this.height }), { + scaleMode: SCALE_MODES.NEAREST, + resolution: 1, + width: this.width, + height: this.height, + mipmap: MIPMAP_MODES.OFF, + format: FORMATS.DEPTH_COMPONENT, + type: TYPES.UNSIGNED_SHORT + }); + this.dirtyId++; + this.dirtyFormat++; + return this; + } + enableDepth() { + this.depth = true; + this.dirtyId++; + this.dirtyFormat++; + return this; + } + enableStencil() { + this.stencil = true; + this.dirtyId++; + this.dirtyFormat++; + return this; + } + resize(width, height) { + width = Math.round(width); + height = Math.round(height); + if (width === this.width && height === this.height) + return; + this.width = width; + this.height = height; + this.dirtyId++; + this.dirtySize++; + for (let i = 0; i < this.colorTextures.length; i++) { + const texture = this.colorTextures[i]; + const resolution = texture.resolution; + texture.setSize(width / resolution, height / resolution); + } + if (this.depthTexture) { + const resolution = this.depthTexture.resolution; + this.depthTexture.setSize(width / resolution, height / resolution); + } + } + dispose() { + this.disposeRunner.emit(this, false); + } + destroyDepthTexture() { + if (this.depthTexture) { + this.depthTexture.destroy(); + this.depthTexture = null; + ++this.dirtyId; + ++this.dirtyFormat; + } + } + } + + class BaseRenderTexture extends BaseTexture { + constructor(options = {}) { + if (typeof options === "number") { + const width = arguments[0]; + const height = arguments[1]; + const scaleMode = arguments[2]; + const resolution = arguments[3]; + options = { width, height, scaleMode, resolution }; + } + options.width = options.width || 100; + options.height = options.height || 100; + options.multisample ?? (options.multisample = MSAA_QUALITY.NONE); + super(null, options); + this.mipmap = MIPMAP_MODES.OFF; + this.valid = true; + this._clear = new Color([0, 0, 0, 0]); + this.framebuffer = new Framebuffer(this.realWidth, this.realHeight).addColorTexture(0, this); + this.framebuffer.multisample = options.multisample; + this.maskStack = []; + this.filterStack = [{}]; + } + set clearColor(value) { + this._clear.setValue(value); + } + get clearColor() { + return this._clear.value; + } + get clear() { + return this._clear; + } + resize(desiredWidth, desiredHeight) { + this.framebuffer.resize(desiredWidth * this.resolution, desiredHeight * this.resolution); + this.setRealSize(this.framebuffer.width, this.framebuffer.height); + } + dispose() { + this.framebuffer.dispose(); + super.dispose(); + } + destroy() { + super.destroy(); + this.framebuffer.destroyDepthTexture(); + this.framebuffer = null; + } + } + + class BaseImageResource extends Resource { + constructor(source) { + const sourceAny = source; + const width = sourceAny.naturalWidth || sourceAny.videoWidth || sourceAny.width; + const height = sourceAny.naturalHeight || sourceAny.videoHeight || sourceAny.height; + super(width, height); + this.source = source; + this.noSubImage = false; + } + static crossOrigin(element, url, crossorigin) { + if (crossorigin === void 0 && !url.startsWith("data:")) { + element.crossOrigin = determineCrossOrigin(url); + } else if (crossorigin !== false) { + element.crossOrigin = typeof crossorigin === "string" ? crossorigin : "anonymous"; + } + } + upload(renderer, baseTexture, glTexture, source) { + const gl = renderer.gl; + const width = baseTexture.realWidth; + const height = baseTexture.realHeight; + source = source || this.source; + if (typeof HTMLImageElement !== "undefined" && source instanceof HTMLImageElement) { + if (!source.complete || source.naturalWidth === 0) { + return false; + } + } else if (typeof HTMLVideoElement !== "undefined" && source instanceof HTMLVideoElement) { + if (source.readyState <= 1 && source.buffered.length === 0) { + return false; + } + } + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, baseTexture.alphaMode === ALPHA_MODES.UNPACK); + if (!this.noSubImage && baseTexture.target === gl.TEXTURE_2D && glTexture.width === width && glTexture.height === height) { + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, baseTexture.format, glTexture.type, source); + } else { + glTexture.width = width; + glTexture.height = height; + gl.texImage2D(baseTexture.target, 0, glTexture.internalFormat, baseTexture.format, glTexture.type, source); + } + return true; + } + update() { + if (this.destroyed) { + return; + } + const source = this.source; + const width = source.naturalWidth || source.videoWidth || source.width; + const height = source.naturalHeight || source.videoHeight || source.height; + this.resize(width, height); + super.update(); + } + dispose() { + this.source = null; + } + } + + class ImageResource extends BaseImageResource { + constructor(source, options) { + options = options || {}; + if (typeof source === "string") { + const imageElement = new Image(); + BaseImageResource.crossOrigin(imageElement, source, options.crossorigin); + imageElement.src = source; + source = imageElement; + } + super(source); + if (!source.complete && !!this._width && !!this._height) { + this._width = 0; + this._height = 0; + } + this.url = source.src; + this._process = null; + this.preserveBitmap = false; + this.createBitmap = (options.createBitmap ?? settings.CREATE_IMAGE_BITMAP) && !!globalThis.createImageBitmap; + this.alphaMode = typeof options.alphaMode === "number" ? options.alphaMode : null; + this.bitmap = null; + this._load = null; + if (options.autoLoad !== false) { + this.load(); + } + } + load(createBitmap) { + if (this._load) { + return this._load; + } + if (createBitmap !== void 0) { + this.createBitmap = createBitmap; + } + this._load = new Promise((resolve, reject) => { + const source = this.source; + this.url = source.src; + const completed = () => { + if (this.destroyed) { + return; + } + source.onload = null; + source.onerror = null; + this.resize(source.width, source.height); + this._load = null; + if (this.createBitmap) { + resolve(this.process()); + } else { + resolve(this); + } + }; + if (source.complete && source.src) { + completed(); + } else { + source.onload = completed; + source.onerror = (event) => { + reject(event); + this.onError.emit(event); + }; + } + }); + return this._load; + } + process() { + const source = this.source; + if (this._process !== null) { + return this._process; + } + if (this.bitmap !== null || !globalThis.createImageBitmap) { + return Promise.resolve(this); + } + const createImageBitmap = globalThis.createImageBitmap; + const cors = !source.crossOrigin || source.crossOrigin === "anonymous"; + this._process = fetch(source.src, { + mode: cors ? "cors" : "no-cors" + }).then((r) => r.blob()).then((blob) => createImageBitmap(blob, 0, 0, source.width, source.height, { + premultiplyAlpha: this.alphaMode === null || this.alphaMode === ALPHA_MODES.UNPACK ? "premultiply" : "none" + })).then((bitmap) => { + if (this.destroyed) { + return Promise.reject(); + } + this.bitmap = bitmap; + this.update(); + this._process = null; + return Promise.resolve(this); + }); + return this._process; + } + upload(renderer, baseTexture, glTexture) { + if (typeof this.alphaMode === "number") { + baseTexture.alphaMode = this.alphaMode; + } + if (!this.createBitmap) { + return super.upload(renderer, baseTexture, glTexture); + } + if (!this.bitmap) { + this.process(); + if (!this.bitmap) { + return false; + } + } + super.upload(renderer, baseTexture, glTexture, this.bitmap); + if (!this.preserveBitmap) { + let flag = true; + const glTextures = baseTexture._glTextures; + for (const key in glTextures) { + const otherTex = glTextures[key]; + if (otherTex !== glTexture && otherTex.dirtyId !== baseTexture.dirtyId) { + flag = false; + break; + } + } + if (flag) { + if (this.bitmap.close) { + this.bitmap.close(); + } + this.bitmap = null; + } + } + return true; + } + dispose() { + this.source.onload = null; + this.source.onerror = null; + super.dispose(); + if (this.bitmap) { + this.bitmap.close(); + this.bitmap = null; + } + this._process = null; + this._load = null; + } + static test(source) { + return typeof HTMLImageElement !== "undefined" && (typeof source === "string" || source instanceof HTMLImageElement); + } + } + + class TextureUvs { + constructor() { + this.x0 = 0; + this.y0 = 0; + this.x1 = 1; + this.y1 = 0; + this.x2 = 1; + this.y2 = 1; + this.x3 = 0; + this.y3 = 1; + this.uvsFloat32 = new Float32Array(8); + } + set(frame, baseFrame, rotate) { + const tw = baseFrame.width; + const th = baseFrame.height; + if (rotate) { + const w2 = frame.width / 2 / tw; + const h2 = frame.height / 2 / th; + const cX = frame.x / tw + w2; + const cY = frame.y / th + h2; + rotate = groupD8.add(rotate, groupD8.NW); + this.x0 = cX + w2 * groupD8.uX(rotate); + this.y0 = cY + h2 * groupD8.uY(rotate); + rotate = groupD8.add(rotate, 2); + this.x1 = cX + w2 * groupD8.uX(rotate); + this.y1 = cY + h2 * groupD8.uY(rotate); + rotate = groupD8.add(rotate, 2); + this.x2 = cX + w2 * groupD8.uX(rotate); + this.y2 = cY + h2 * groupD8.uY(rotate); + rotate = groupD8.add(rotate, 2); + this.x3 = cX + w2 * groupD8.uX(rotate); + this.y3 = cY + h2 * groupD8.uY(rotate); + } else { + this.x0 = frame.x / tw; + this.y0 = frame.y / th; + this.x1 = (frame.x + frame.width) / tw; + this.y1 = frame.y / th; + this.x2 = (frame.x + frame.width) / tw; + this.y2 = (frame.y + frame.height) / th; + this.x3 = frame.x / tw; + this.y3 = (frame.y + frame.height) / th; + } + this.uvsFloat32[0] = this.x0; + this.uvsFloat32[1] = this.y0; + this.uvsFloat32[2] = this.x1; + this.uvsFloat32[3] = this.y1; + this.uvsFloat32[4] = this.x2; + this.uvsFloat32[5] = this.y2; + this.uvsFloat32[6] = this.x3; + this.uvsFloat32[7] = this.y3; + } + toString() { + return `[@pixi/core:TextureUvs x0=${this.x0} y0=${this.y0} x1=${this.x1} y1=${this.y1} x2=${this.x2} y2=${this.y2} x3=${this.x3} y3=${this.y3}]`; + } + } + + const DEFAULT_UVS = new TextureUvs(); + function removeAllHandlers(tex) { + tex.destroy = function _emptyDestroy() { + }; + tex.on = function _emptyOn() { + }; + tex.once = function _emptyOnce() { + }; + tex.emit = function _emptyEmit() { + }; + } + class Texture extends eventemitter3 { + constructor(baseTexture, frame, orig, trim, rotate, anchor, borders) { + super(); + this.noFrame = false; + if (!frame) { + this.noFrame = true; + frame = new Rectangle(0, 0, 1, 1); + } + if (baseTexture instanceof Texture) { + baseTexture = baseTexture.baseTexture; + } + this.baseTexture = baseTexture; + this._frame = frame; + this.trim = trim; + this.valid = false; + this._uvs = DEFAULT_UVS; + this.uvMatrix = null; + this.orig = orig || frame; + this._rotate = Number(rotate || 0); + if (rotate === true) { + this._rotate = 2; + } else if (this._rotate % 2 !== 0) { + throw new Error("attempt to use diamond-shaped UVs. If you are sure, set rotation manually"); + } + this.defaultAnchor = anchor ? new Point(anchor.x, anchor.y) : new Point(0, 0); + this.defaultBorders = borders; + this._updateID = 0; + this.textureCacheIds = []; + if (!baseTexture.valid) { + baseTexture.once("loaded", this.onBaseTextureUpdated, this); + } else if (this.noFrame) { + if (baseTexture.valid) { + this.onBaseTextureUpdated(baseTexture); + } + } else { + this.frame = frame; + } + if (this.noFrame) { + baseTexture.on("update", this.onBaseTextureUpdated, this); + } + } + update() { + if (this.baseTexture.resource) { + this.baseTexture.resource.update(); + } + } + onBaseTextureUpdated(baseTexture) { + if (this.noFrame) { + if (!this.baseTexture.valid) { + return; + } + this._frame.width = baseTexture.width; + this._frame.height = baseTexture.height; + this.valid = true; + this.updateUvs(); + } else { + this.frame = this._frame; + } + this.emit("update", this); + } + destroy(destroyBase) { + if (this.baseTexture) { + if (destroyBase) { + const { resource } = this.baseTexture; + if (resource?.url && TextureCache[resource.url]) { + Texture.removeFromCache(resource.url); + } + this.baseTexture.destroy(); + } + this.baseTexture.off("loaded", this.onBaseTextureUpdated, this); + this.baseTexture.off("update", this.onBaseTextureUpdated, this); + this.baseTexture = null; + } + this._frame = null; + this._uvs = null; + this.trim = null; + this.orig = null; + this.valid = false; + Texture.removeFromCache(this); + this.textureCacheIds = null; + } + clone() { + const clonedFrame = this._frame.clone(); + const clonedOrig = this._frame === this.orig ? clonedFrame : this.orig.clone(); + const clonedTexture = new Texture(this.baseTexture, !this.noFrame && clonedFrame, clonedOrig, this.trim?.clone(), this.rotate, this.defaultAnchor, this.defaultBorders); + if (this.noFrame) { + clonedTexture._frame = clonedFrame; + } + return clonedTexture; + } + updateUvs() { + if (this._uvs === DEFAULT_UVS) { + this._uvs = new TextureUvs(); + } + this._uvs.set(this._frame, this.baseTexture, this.rotate); + this._updateID++; + } + static from(source, options = {}, strict = settings.STRICT_TEXTURE_CACHE) { + const isFrame = typeof source === "string"; + let cacheId = null; + if (isFrame) { + cacheId = source; + } else if (source instanceof BaseTexture) { + if (!source.cacheId) { + const prefix = options?.pixiIdPrefix || "pixiid"; + source.cacheId = `${prefix}-${uid()}`; + BaseTexture.addToCache(source, source.cacheId); + } + cacheId = source.cacheId; + } else { + if (!source._pixiId) { + const prefix = options?.pixiIdPrefix || "pixiid"; + source._pixiId = `${prefix}_${uid()}`; + } + cacheId = source._pixiId; + } + let texture = TextureCache[cacheId]; + if (isFrame && strict && !texture) { + throw new Error(`The cacheId "${cacheId}" does not exist in TextureCache.`); + } + if (!texture && !(source instanceof BaseTexture)) { + if (!options.resolution) { + options.resolution = getResolutionOfUrl(source); + } + texture = new Texture(new BaseTexture(source, options)); + texture.baseTexture.cacheId = cacheId; + BaseTexture.addToCache(texture.baseTexture, cacheId); + Texture.addToCache(texture, cacheId); + } else if (!texture && source instanceof BaseTexture) { + texture = new Texture(source); + Texture.addToCache(texture, cacheId); + } + return texture; + } + static fromURL(url, options) { + const resourceOptions = Object.assign({ autoLoad: false }, options?.resourceOptions); + const texture = Texture.from(url, Object.assign({ resourceOptions }, options), false); + const resource = texture.baseTexture.resource; + if (texture.baseTexture.valid) { + return Promise.resolve(texture); + } + return resource.load().then(() => Promise.resolve(texture)); + } + static fromBuffer(buffer, width, height, options) { + return new Texture(BaseTexture.fromBuffer(buffer, width, height, options)); + } + static fromLoader(source, imageUrl, name, options) { + const baseTexture = new BaseTexture(source, Object.assign({ + scaleMode: BaseTexture.defaultOptions.scaleMode, + resolution: getResolutionOfUrl(imageUrl) + }, options)); + const { resource } = baseTexture; + if (resource instanceof ImageResource) { + resource.url = imageUrl; + } + const texture = new Texture(baseTexture); + if (!name) { + name = imageUrl; + } + BaseTexture.addToCache(texture.baseTexture, name); + Texture.addToCache(texture, name); + if (name !== imageUrl) { + BaseTexture.addToCache(texture.baseTexture, imageUrl); + Texture.addToCache(texture, imageUrl); + } + if (texture.baseTexture.valid) { + return Promise.resolve(texture); + } + return new Promise((resolve) => { + texture.baseTexture.once("loaded", () => resolve(texture)); + }); + } + static addToCache(texture, id) { + if (id) { + if (!texture.textureCacheIds.includes(id)) { + texture.textureCacheIds.push(id); + } + if (TextureCache[id] && TextureCache[id] !== texture) { + console.warn(`Texture added to the cache with an id [${id}] that already had an entry`); + } + TextureCache[id] = texture; + } + } + static removeFromCache(texture) { + if (typeof texture === "string") { + const textureFromCache = TextureCache[texture]; + if (textureFromCache) { + const index = textureFromCache.textureCacheIds.indexOf(texture); + if (index > -1) { + textureFromCache.textureCacheIds.splice(index, 1); + } + delete TextureCache[texture]; + return textureFromCache; + } + } else if (texture?.textureCacheIds) { + for (let i = 0; i < texture.textureCacheIds.length; ++i) { + if (TextureCache[texture.textureCacheIds[i]] === texture) { + delete TextureCache[texture.textureCacheIds[i]]; + } + } + texture.textureCacheIds.length = 0; + return texture; + } + return null; + } + get resolution() { + return this.baseTexture.resolution; + } + get frame() { + return this._frame; + } + set frame(frame) { + this._frame = frame; + this.noFrame = false; + const { x, y, width, height } = frame; + const xNotFit = x + width > this.baseTexture.width; + const yNotFit = y + height > this.baseTexture.height; + if (xNotFit || yNotFit) { + const relationship = xNotFit && yNotFit ? "and" : "or"; + const errorX = `X: ${x} + ${width} = ${x + width} > ${this.baseTexture.width}`; + const errorY = `Y: ${y} + ${height} = ${y + height} > ${this.baseTexture.height}`; + throw new Error(`Texture Error: frame does not fit inside the base Texture dimensions: ${errorX} ${relationship} ${errorY}`); + } + this.valid = width && height && this.baseTexture.valid; + if (!this.trim && !this.rotate) { + this.orig = frame; + } + if (this.valid) { + this.updateUvs(); + } + } + get rotate() { + return this._rotate; + } + set rotate(rotate) { + this._rotate = rotate; + if (this.valid) { + this.updateUvs(); + } + } + get width() { + return this.orig.width; + } + get height() { + return this.orig.height; + } + castToBaseTexture() { + return this.baseTexture; + } + static get EMPTY() { + if (!Texture._EMPTY) { + Texture._EMPTY = new Texture(new BaseTexture()); + removeAllHandlers(Texture._EMPTY); + removeAllHandlers(Texture._EMPTY.baseTexture); + } + return Texture._EMPTY; + } + static get WHITE() { + if (!Texture._WHITE) { + const canvas = settings.ADAPTER.createCanvas(16, 16); + const context = canvas.getContext("2d"); + canvas.width = 16; + canvas.height = 16; + context.fillStyle = "white"; + context.fillRect(0, 0, 16, 16); + Texture._WHITE = new Texture(BaseTexture.from(canvas)); + removeAllHandlers(Texture._WHITE); + removeAllHandlers(Texture._WHITE.baseTexture); + } + return Texture._WHITE; + } + } + + class RenderTexture extends Texture { + constructor(baseRenderTexture, frame) { + super(baseRenderTexture, frame); + this.valid = true; + this.filterFrame = null; + this.filterPoolKey = null; + this.updateUvs(); + } + get framebuffer() { + return this.baseTexture.framebuffer; + } + get multisample() { + return this.framebuffer.multisample; + } + set multisample(value) { + this.framebuffer.multisample = value; + } + resize(desiredWidth, desiredHeight, resizeBaseTexture = true) { + const resolution = this.baseTexture.resolution; + const width = Math.round(desiredWidth * resolution) / resolution; + const height = Math.round(desiredHeight * resolution) / resolution; + this.valid = width > 0 && height > 0; + this._frame.width = this.orig.width = width; + this._frame.height = this.orig.height = height; + if (resizeBaseTexture) { + this.baseTexture.resize(width, height); + } + this.updateUvs(); + } + setResolution(resolution) { + const { baseTexture } = this; + if (baseTexture.resolution === resolution) { + return; + } + baseTexture.setResolution(resolution); + this.resize(baseTexture.width, baseTexture.height, false); + } + static create(options) { + return new RenderTexture(new BaseRenderTexture(options)); + } + } + + class RenderTexturePool { + constructor(textureOptions) { + this.texturePool = {}; + this.textureOptions = textureOptions || {}; + this.enableFullScreen = false; + this._pixelsWidth = 0; + this._pixelsHeight = 0; + } + createTexture(realWidth, realHeight, multisample = MSAA_QUALITY.NONE) { + const baseRenderTexture = new BaseRenderTexture(Object.assign({ + width: realWidth, + height: realHeight, + resolution: 1, + multisample + }, this.textureOptions)); + return new RenderTexture(baseRenderTexture); + } + getOptimalTexture(minWidth, minHeight, resolution = 1, multisample = MSAA_QUALITY.NONE) { + let key; + minWidth = Math.ceil(minWidth * resolution - 1e-6); + minHeight = Math.ceil(minHeight * resolution - 1e-6); + if (!this.enableFullScreen || minWidth !== this._pixelsWidth || minHeight !== this._pixelsHeight) { + minWidth = nextPow2(minWidth); + minHeight = nextPow2(minHeight); + key = ((minWidth & 65535) << 16 | minHeight & 65535) >>> 0; + if (multisample > 1) { + key += multisample * 4294967296; + } + } else { + key = multisample > 1 ? -multisample : -1; + } + if (!this.texturePool[key]) { + this.texturePool[key] = []; + } + let renderTexture = this.texturePool[key].pop(); + if (!renderTexture) { + renderTexture = this.createTexture(minWidth, minHeight, multisample); + } + renderTexture.filterPoolKey = key; + renderTexture.setResolution(resolution); + return renderTexture; + } + getFilterTexture(input, resolution, multisample) { + const filterTexture = this.getOptimalTexture(input.width, input.height, resolution || input.resolution, multisample || MSAA_QUALITY.NONE); + filterTexture.filterFrame = input.filterFrame; + return filterTexture; + } + returnTexture(renderTexture) { + const key = renderTexture.filterPoolKey; + renderTexture.filterFrame = null; + this.texturePool[key].push(renderTexture); + } + returnFilterTexture(renderTexture) { + this.returnTexture(renderTexture); + } + clear(destroyTextures) { + destroyTextures = destroyTextures !== false; + if (destroyTextures) { + for (const i in this.texturePool) { + const textures = this.texturePool[i]; + if (textures) { + for (let j = 0; j < textures.length; j++) { + textures[j].destroy(true); + } + } + } + } + this.texturePool = {}; + } + setScreenSize(size) { + if (size.width === this._pixelsWidth && size.height === this._pixelsHeight) { + return; + } + this.enableFullScreen = size.width > 0 && size.height > 0; + for (const i in this.texturePool) { + if (!(Number(i) < 0)) { + continue; + } + const textures = this.texturePool[i]; + if (textures) { + for (let j = 0; j < textures.length; j++) { + textures[j].destroy(true); + } + } + this.texturePool[i] = []; + } + this._pixelsWidth = size.width; + this._pixelsHeight = size.height; + } + } + RenderTexturePool.SCREEN_KEY = -1; + + class Quad extends Geometry { + constructor() { + super(); + this.addAttribute("aVertexPosition", new Float32Array([ + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ])).addIndex([0, 1, 3, 2]); + } + } + + class QuadUv extends Geometry { + constructor() { + super(); + this.vertices = new Float32Array([ + -1, + -1, + 1, + -1, + 1, + 1, + -1, + 1 + ]); + this.uvs = new Float32Array([ + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ]); + this.vertexBuffer = new Buffer(this.vertices); + this.uvBuffer = new Buffer(this.uvs); + this.addAttribute("aVertexPosition", this.vertexBuffer).addAttribute("aTextureCoord", this.uvBuffer).addIndex([0, 1, 2, 0, 2, 3]); + } + map(targetTextureFrame, destinationFrame) { + let x = 0; + let y = 0; + this.uvs[0] = x; + this.uvs[1] = y; + this.uvs[2] = x + destinationFrame.width / targetTextureFrame.width; + this.uvs[3] = y; + this.uvs[4] = x + destinationFrame.width / targetTextureFrame.width; + this.uvs[5] = y + destinationFrame.height / targetTextureFrame.height; + this.uvs[6] = x; + this.uvs[7] = y + destinationFrame.height / targetTextureFrame.height; + x = destinationFrame.x; + y = destinationFrame.y; + this.vertices[0] = x; + this.vertices[1] = y; + this.vertices[2] = x + destinationFrame.width; + this.vertices[3] = y; + this.vertices[4] = x + destinationFrame.width; + this.vertices[5] = y + destinationFrame.height; + this.vertices[6] = x; + this.vertices[7] = y + destinationFrame.height; + this.invalidate(); + return this; + } + invalidate() { + this.vertexBuffer._updateID++; + this.uvBuffer._updateID++; + return this; + } + } + + class FilterState { + constructor() { + this.renderTexture = null; + this.target = null; + this.legacy = false; + this.resolution = 1; + this.multisample = MSAA_QUALITY.NONE; + this.sourceFrame = new Rectangle(); + this.destinationFrame = new Rectangle(); + this.bindingSourceFrame = new Rectangle(); + this.bindingDestinationFrame = new Rectangle(); + this.filters = []; + this.transform = null; + } + clear() { + this.target = null; + this.filters = null; + this.renderTexture = null; + } + } + + const tempPoints = [new Point(), new Point(), new Point(), new Point()]; + const tempMatrix$2 = new Matrix(); + class FilterSystem { + constructor(renderer) { + this.renderer = renderer; + this.defaultFilterStack = [{}]; + this.texturePool = new RenderTexturePool(); + this.statePool = []; + this.quad = new Quad(); + this.quadUv = new QuadUv(); + this.tempRect = new Rectangle(); + this.activeState = {}; + this.globalUniforms = new UniformGroup({ + outputFrame: new Rectangle(), + inputSize: new Float32Array(4), + inputPixel: new Float32Array(4), + inputClamp: new Float32Array(4), + resolution: 1, + filterArea: new Float32Array(4), + filterClamp: new Float32Array(4) + }, true); + this.forceClear = false; + this.useMaxPadding = false; + } + init() { + this.texturePool.setScreenSize(this.renderer.view); + } + push(target, filters) { + const renderer = this.renderer; + const filterStack = this.defaultFilterStack; + const state = this.statePool.pop() || new FilterState(); + const renderTextureSystem = this.renderer.renderTexture; + let resolution = filters[0].resolution; + let multisample = filters[0].multisample; + let padding = filters[0].padding; + let autoFit = filters[0].autoFit; + let legacy = filters[0].legacy ?? true; + for (let i = 1; i < filters.length; i++) { + const filter = filters[i]; + resolution = Math.min(resolution, filter.resolution); + multisample = Math.min(multisample, filter.multisample); + padding = this.useMaxPadding ? Math.max(padding, filter.padding) : padding + filter.padding; + autoFit = autoFit && filter.autoFit; + legacy = legacy || (filter.legacy ?? true); + } + if (filterStack.length === 1) { + this.defaultFilterStack[0].renderTexture = renderTextureSystem.current; + } + filterStack.push(state); + state.resolution = resolution; + state.multisample = multisample; + state.legacy = legacy; + state.target = target; + state.sourceFrame.copyFrom(target.filterArea || target.getBounds(true)); + state.sourceFrame.pad(padding); + const sourceFrameProjected = this.tempRect.copyFrom(renderTextureSystem.sourceFrame); + if (renderer.projection.transform) { + this.transformAABB(tempMatrix$2.copyFrom(renderer.projection.transform).invert(), sourceFrameProjected); + } + if (autoFit) { + state.sourceFrame.fit(sourceFrameProjected); + if (state.sourceFrame.width <= 0 || state.sourceFrame.height <= 0) { + state.sourceFrame.width = 0; + state.sourceFrame.height = 0; + } + } else if (!state.sourceFrame.intersects(sourceFrameProjected)) { + state.sourceFrame.width = 0; + state.sourceFrame.height = 0; + } + this.roundFrame(state.sourceFrame, renderTextureSystem.current ? renderTextureSystem.current.resolution : renderer.resolution, renderTextureSystem.sourceFrame, renderTextureSystem.destinationFrame, renderer.projection.transform); + state.renderTexture = this.getOptimalFilterTexture(state.sourceFrame.width, state.sourceFrame.height, resolution, multisample); + state.filters = filters; + state.destinationFrame.width = state.renderTexture.width; + state.destinationFrame.height = state.renderTexture.height; + const destinationFrame = this.tempRect; + destinationFrame.x = 0; + destinationFrame.y = 0; + destinationFrame.width = state.sourceFrame.width; + destinationFrame.height = state.sourceFrame.height; + state.renderTexture.filterFrame = state.sourceFrame; + state.bindingSourceFrame.copyFrom(renderTextureSystem.sourceFrame); + state.bindingDestinationFrame.copyFrom(renderTextureSystem.destinationFrame); + state.transform = renderer.projection.transform; + renderer.projection.transform = null; + renderTextureSystem.bind(state.renderTexture, state.sourceFrame, destinationFrame); + renderer.framebuffer.clear(0, 0, 0, 0); + } + pop() { + const filterStack = this.defaultFilterStack; + const state = filterStack.pop(); + const filters = state.filters; + this.activeState = state; + const globalUniforms = this.globalUniforms.uniforms; + globalUniforms.outputFrame = state.sourceFrame; + globalUniforms.resolution = state.resolution; + const inputSize = globalUniforms.inputSize; + const inputPixel = globalUniforms.inputPixel; + const inputClamp = globalUniforms.inputClamp; + inputSize[0] = state.destinationFrame.width; + inputSize[1] = state.destinationFrame.height; + inputSize[2] = 1 / inputSize[0]; + inputSize[3] = 1 / inputSize[1]; + inputPixel[0] = Math.round(inputSize[0] * state.resolution); + inputPixel[1] = Math.round(inputSize[1] * state.resolution); + inputPixel[2] = 1 / inputPixel[0]; + inputPixel[3] = 1 / inputPixel[1]; + inputClamp[0] = 0.5 * inputPixel[2]; + inputClamp[1] = 0.5 * inputPixel[3]; + inputClamp[2] = state.sourceFrame.width * inputSize[2] - 0.5 * inputPixel[2]; + inputClamp[3] = state.sourceFrame.height * inputSize[3] - 0.5 * inputPixel[3]; + if (state.legacy) { + const filterArea = globalUniforms.filterArea; + filterArea[0] = state.destinationFrame.width; + filterArea[1] = state.destinationFrame.height; + filterArea[2] = state.sourceFrame.x; + filterArea[3] = state.sourceFrame.y; + globalUniforms.filterClamp = globalUniforms.inputClamp; + } + this.globalUniforms.update(); + const lastState = filterStack[filterStack.length - 1]; + this.renderer.framebuffer.blit(); + if (filters.length === 1) { + filters[0].apply(this, state.renderTexture, lastState.renderTexture, CLEAR_MODES.BLEND, state); + this.returnFilterTexture(state.renderTexture); + } else { + let flip = state.renderTexture; + let flop = this.getOptimalFilterTexture(flip.width, flip.height, state.resolution); + flop.filterFrame = flip.filterFrame; + let i = 0; + for (i = 0; i < filters.length - 1; ++i) { + if (i === 1 && state.multisample > 1) { + flop = this.getOptimalFilterTexture(flip.width, flip.height, state.resolution); + flop.filterFrame = flip.filterFrame; + } + filters[i].apply(this, flip, flop, CLEAR_MODES.CLEAR, state); + const t = flip; + flip = flop; + flop = t; + } + filters[i].apply(this, flip, lastState.renderTexture, CLEAR_MODES.BLEND, state); + if (i > 1 && state.multisample > 1) { + this.returnFilterTexture(state.renderTexture); + } + this.returnFilterTexture(flip); + this.returnFilterTexture(flop); + } + state.clear(); + this.statePool.push(state); + } + bindAndClear(filterTexture, clearMode = CLEAR_MODES.CLEAR) { + const { + renderTexture: renderTextureSystem, + state: stateSystem + } = this.renderer; + if (filterTexture === this.defaultFilterStack[this.defaultFilterStack.length - 1].renderTexture) { + this.renderer.projection.transform = this.activeState.transform; + } else { + this.renderer.projection.transform = null; + } + if (filterTexture?.filterFrame) { + const destinationFrame = this.tempRect; + destinationFrame.x = 0; + destinationFrame.y = 0; + destinationFrame.width = filterTexture.filterFrame.width; + destinationFrame.height = filterTexture.filterFrame.height; + renderTextureSystem.bind(filterTexture, filterTexture.filterFrame, destinationFrame); + } else if (filterTexture !== this.defaultFilterStack[this.defaultFilterStack.length - 1].renderTexture) { + renderTextureSystem.bind(filterTexture); + } else { + this.renderer.renderTexture.bind(filterTexture, this.activeState.bindingSourceFrame, this.activeState.bindingDestinationFrame); + } + const autoClear = stateSystem.stateId & 1 || this.forceClear; + if (clearMode === CLEAR_MODES.CLEAR || clearMode === CLEAR_MODES.BLIT && autoClear) { + this.renderer.framebuffer.clear(0, 0, 0, 0); + } + } + applyFilter(filter, input, output, clearMode) { + const renderer = this.renderer; + renderer.state.set(filter.state); + this.bindAndClear(output, clearMode); + filter.uniforms.uSampler = input; + filter.uniforms.filterGlobals = this.globalUniforms; + renderer.shader.bind(filter); + filter.legacy = !!filter.program.attributeData.aTextureCoord; + if (filter.legacy) { + this.quadUv.map(input._frame, input.filterFrame); + renderer.geometry.bind(this.quadUv); + renderer.geometry.draw(DRAW_MODES.TRIANGLES); + } else { + renderer.geometry.bind(this.quad); + renderer.geometry.draw(DRAW_MODES.TRIANGLE_STRIP); + } + } + calculateSpriteMatrix(outputMatrix, sprite) { + const { sourceFrame, destinationFrame } = this.activeState; + const { orig } = sprite._texture; + const mappedMatrix = outputMatrix.set(destinationFrame.width, 0, 0, destinationFrame.height, sourceFrame.x, sourceFrame.y); + const worldTransform = sprite.worldTransform.copyTo(Matrix.TEMP_MATRIX); + worldTransform.invert(); + mappedMatrix.prepend(worldTransform); + mappedMatrix.scale(1 / orig.width, 1 / orig.height); + mappedMatrix.translate(sprite.anchor.x, sprite.anchor.y); + return mappedMatrix; + } + destroy() { + this.renderer = null; + this.texturePool.clear(false); + } + getOptimalFilterTexture(minWidth, minHeight, resolution = 1, multisample = MSAA_QUALITY.NONE) { + return this.texturePool.getOptimalTexture(minWidth, minHeight, resolution, multisample); + } + getFilterTexture(input, resolution, multisample) { + if (typeof input === "number") { + const swap = input; + input = resolution; + resolution = swap; + } + input = input || this.activeState.renderTexture; + const filterTexture = this.texturePool.getOptimalTexture(input.width, input.height, resolution || input.resolution, multisample || MSAA_QUALITY.NONE); + filterTexture.filterFrame = input.filterFrame; + return filterTexture; + } + returnFilterTexture(renderTexture) { + this.texturePool.returnTexture(renderTexture); + } + emptyPool() { + this.texturePool.clear(true); + } + resize() { + this.texturePool.setScreenSize(this.renderer.view); + } + transformAABB(matrix, rect) { + const lt = tempPoints[0]; + const lb = tempPoints[1]; + const rt = tempPoints[2]; + const rb = tempPoints[3]; + lt.set(rect.left, rect.top); + lb.set(rect.left, rect.bottom); + rt.set(rect.right, rect.top); + rb.set(rect.right, rect.bottom); + matrix.apply(lt, lt); + matrix.apply(lb, lb); + matrix.apply(rt, rt); + matrix.apply(rb, rb); + const x0 = Math.min(lt.x, lb.x, rt.x, rb.x); + const y0 = Math.min(lt.y, lb.y, rt.y, rb.y); + const x1 = Math.max(lt.x, lb.x, rt.x, rb.x); + const y1 = Math.max(lt.y, lb.y, rt.y, rb.y); + rect.x = x0; + rect.y = y0; + rect.width = x1 - x0; + rect.height = y1 - y0; + } + roundFrame(frame, resolution, bindingSourceFrame, bindingDestinationFrame, transform) { + if (frame.width <= 0 || frame.height <= 0 || bindingSourceFrame.width <= 0 || bindingSourceFrame.height <= 0) { + return; + } + if (transform) { + const { a, b, c, d } = transform; + if ((Math.abs(b) > 1e-4 || Math.abs(c) > 1e-4) && (Math.abs(a) > 1e-4 || Math.abs(d) > 1e-4)) { + return; + } + } + transform = transform ? tempMatrix$2.copyFrom(transform) : tempMatrix$2.identity(); + transform.translate(-bindingSourceFrame.x, -bindingSourceFrame.y).scale(bindingDestinationFrame.width / bindingSourceFrame.width, bindingDestinationFrame.height / bindingSourceFrame.height).translate(bindingDestinationFrame.x, bindingDestinationFrame.y); + this.transformAABB(transform, frame); + frame.ceil(resolution); + this.transformAABB(transform.invert(), frame); + } + } + FilterSystem.extension = { + type: ExtensionType.RendererSystem, + name: "filter" + }; + extensions$1.add(FilterSystem); + + class GLFramebuffer { + constructor(framebuffer) { + this.framebuffer = framebuffer; + this.stencil = null; + this.dirtyId = -1; + this.dirtyFormat = -1; + this.dirtySize = -1; + this.multisample = MSAA_QUALITY.NONE; + this.msaaBuffer = null; + this.blitFramebuffer = null; + this.mipLevel = 0; + } + } + + const tempRectangle = new Rectangle(); + class FramebufferSystem { + constructor(renderer) { + this.renderer = renderer; + this.managedFramebuffers = []; + this.unknownFramebuffer = new Framebuffer(10, 10); + this.msaaSamples = null; + } + contextChange() { + this.disposeAll(true); + const gl = this.gl = this.renderer.gl; + this.CONTEXT_UID = this.renderer.CONTEXT_UID; + this.current = this.unknownFramebuffer; + this.viewport = new Rectangle(); + this.hasMRT = true; + this.writeDepthTexture = true; + if (this.renderer.context.webGLVersion === 1) { + let nativeDrawBuffersExtension = this.renderer.context.extensions.drawBuffers; + let nativeDepthTextureExtension = this.renderer.context.extensions.depthTexture; + if (settings.PREFER_ENV === ENV.WEBGL_LEGACY) { + nativeDrawBuffersExtension = null; + nativeDepthTextureExtension = null; + } + if (nativeDrawBuffersExtension) { + gl.drawBuffers = (activeTextures) => nativeDrawBuffersExtension.drawBuffersWEBGL(activeTextures); + } else { + this.hasMRT = false; + gl.drawBuffers = () => { + }; + } + if (!nativeDepthTextureExtension) { + this.writeDepthTexture = false; + } + } else { + this.msaaSamples = gl.getInternalformatParameter(gl.RENDERBUFFER, gl.RGBA8, gl.SAMPLES); + } + } + bind(framebuffer, frame, mipLevel = 0) { + const { gl } = this; + if (framebuffer) { + const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID] || this.initFramebuffer(framebuffer); + if (this.current !== framebuffer) { + this.current = framebuffer; + gl.bindFramebuffer(gl.FRAMEBUFFER, fbo.framebuffer); + } + if (fbo.mipLevel !== mipLevel) { + framebuffer.dirtyId++; + framebuffer.dirtyFormat++; + fbo.mipLevel = mipLevel; + } + if (fbo.dirtyId !== framebuffer.dirtyId) { + fbo.dirtyId = framebuffer.dirtyId; + if (fbo.dirtyFormat !== framebuffer.dirtyFormat) { + fbo.dirtyFormat = framebuffer.dirtyFormat; + fbo.dirtySize = framebuffer.dirtySize; + this.updateFramebuffer(framebuffer, mipLevel); + } else if (fbo.dirtySize !== framebuffer.dirtySize) { + fbo.dirtySize = framebuffer.dirtySize; + this.resizeFramebuffer(framebuffer); + } + } + for (let i = 0; i < framebuffer.colorTextures.length; i++) { + const tex = framebuffer.colorTextures[i]; + this.renderer.texture.unbind(tex.parentTextureArray || tex); + } + if (framebuffer.depthTexture) { + this.renderer.texture.unbind(framebuffer.depthTexture); + } + if (frame) { + const mipWidth = frame.width >> mipLevel; + const mipHeight = frame.height >> mipLevel; + const scale = mipWidth / frame.width; + this.setViewport(frame.x * scale, frame.y * scale, mipWidth, mipHeight); + } else { + const mipWidth = framebuffer.width >> mipLevel; + const mipHeight = framebuffer.height >> mipLevel; + this.setViewport(0, 0, mipWidth, mipHeight); + } + } else { + if (this.current) { + this.current = null; + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + } + if (frame) { + this.setViewport(frame.x, frame.y, frame.width, frame.height); + } else { + this.setViewport(0, 0, this.renderer.width, this.renderer.height); + } + } + } + setViewport(x, y, width, height) { + const v = this.viewport; + x = Math.round(x); + y = Math.round(y); + width = Math.round(width); + height = Math.round(height); + if (v.width !== width || v.height !== height || v.x !== x || v.y !== y) { + v.x = x; + v.y = y; + v.width = width; + v.height = height; + this.gl.viewport(x, y, width, height); + } + } + get size() { + if (this.current) { + return { x: 0, y: 0, width: this.current.width, height: this.current.height }; + } + return { x: 0, y: 0, width: this.renderer.width, height: this.renderer.height }; + } + clear(r, g, b, a, mask = BUFFER_BITS.COLOR | BUFFER_BITS.DEPTH) { + const { gl } = this; + gl.clearColor(r, g, b, a); + gl.clear(mask); + } + initFramebuffer(framebuffer) { + const { gl } = this; + const fbo = new GLFramebuffer(gl.createFramebuffer()); + fbo.multisample = this.detectSamples(framebuffer.multisample); + framebuffer.glFramebuffers[this.CONTEXT_UID] = fbo; + this.managedFramebuffers.push(framebuffer); + framebuffer.disposeRunner.add(this); + return fbo; + } + resizeFramebuffer(framebuffer) { + const { gl } = this; + const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID]; + if (fbo.stencil) { + gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.stencil); + if (fbo.msaaBuffer) { + gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample, gl.DEPTH24_STENCIL8, framebuffer.width, framebuffer.height); + } else { + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, framebuffer.width, framebuffer.height); + } + } + const colorTextures = framebuffer.colorTextures; + let count = colorTextures.length; + if (!gl.drawBuffers) { + count = Math.min(count, 1); + } + for (let i = 0; i < count; i++) { + const texture = colorTextures[i]; + const parentTexture = texture.parentTextureArray || texture; + this.renderer.texture.bind(parentTexture, 0); + if (i === 0 && fbo.msaaBuffer) { + gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.msaaBuffer); + gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample, parentTexture._glTextures[this.CONTEXT_UID].internalFormat, framebuffer.width, framebuffer.height); + } + } + if (framebuffer.depthTexture && this.writeDepthTexture) { + this.renderer.texture.bind(framebuffer.depthTexture, 0); + } + } + updateFramebuffer(framebuffer, mipLevel) { + const { gl } = this; + const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID]; + const colorTextures = framebuffer.colorTextures; + let count = colorTextures.length; + if (!gl.drawBuffers) { + count = Math.min(count, 1); + } + if (fbo.multisample > 1 && this.canMultisampleFramebuffer(framebuffer)) { + fbo.msaaBuffer = fbo.msaaBuffer || gl.createRenderbuffer(); + } else if (fbo.msaaBuffer) { + gl.deleteRenderbuffer(fbo.msaaBuffer); + fbo.msaaBuffer = null; + if (fbo.blitFramebuffer) { + fbo.blitFramebuffer.dispose(); + fbo.blitFramebuffer = null; + } + } + const activeTextures = []; + for (let i = 0; i < count; i++) { + const texture = colorTextures[i]; + const parentTexture = texture.parentTextureArray || texture; + this.renderer.texture.bind(parentTexture, 0); + if (i === 0 && fbo.msaaBuffer) { + gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.msaaBuffer); + gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample, parentTexture._glTextures[this.CONTEXT_UID].internalFormat, framebuffer.width, framebuffer.height); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, fbo.msaaBuffer); + } else { + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, texture.target, parentTexture._glTextures[this.CONTEXT_UID].texture, mipLevel); + activeTextures.push(gl.COLOR_ATTACHMENT0 + i); + } + } + if (activeTextures.length > 1) { + gl.drawBuffers(activeTextures); + } + if (framebuffer.depthTexture) { + const writeDepthTexture = this.writeDepthTexture; + if (writeDepthTexture) { + const depthTexture = framebuffer.depthTexture; + this.renderer.texture.bind(depthTexture, 0); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTexture._glTextures[this.CONTEXT_UID].texture, mipLevel); + } + } + if ((framebuffer.stencil || framebuffer.depth) && !(framebuffer.depthTexture && this.writeDepthTexture)) { + fbo.stencil = fbo.stencil || gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.stencil); + if (fbo.msaaBuffer) { + gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample, gl.DEPTH24_STENCIL8, framebuffer.width, framebuffer.height); + } else { + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, framebuffer.width, framebuffer.height); + } + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, fbo.stencil); + } else if (fbo.stencil) { + gl.deleteRenderbuffer(fbo.stencil); + fbo.stencil = null; + } + } + canMultisampleFramebuffer(framebuffer) { + return this.renderer.context.webGLVersion !== 1 && framebuffer.colorTextures.length <= 1 && !framebuffer.depthTexture; + } + detectSamples(samples) { + const { msaaSamples } = this; + let res = MSAA_QUALITY.NONE; + if (samples <= 1 || msaaSamples === null) { + return res; + } + for (let i = 0; i < msaaSamples.length; i++) { + if (msaaSamples[i] <= samples) { + res = msaaSamples[i]; + break; + } + } + if (res === 1) { + res = MSAA_QUALITY.NONE; + } + return res; + } + blit(framebuffer, sourcePixels, destPixels) { + const { current, renderer, gl, CONTEXT_UID } = this; + if (renderer.context.webGLVersion !== 2) { + return; + } + if (!current) { + return; + } + const fbo = current.glFramebuffers[CONTEXT_UID]; + if (!fbo) { + return; + } + if (!framebuffer) { + if (!fbo.msaaBuffer) { + return; + } + const colorTexture = current.colorTextures[0]; + if (!colorTexture) { + return; + } + if (!fbo.blitFramebuffer) { + fbo.blitFramebuffer = new Framebuffer(current.width, current.height); + fbo.blitFramebuffer.addColorTexture(0, colorTexture); + } + framebuffer = fbo.blitFramebuffer; + if (framebuffer.colorTextures[0] !== colorTexture) { + framebuffer.colorTextures[0] = colorTexture; + framebuffer.dirtyId++; + framebuffer.dirtyFormat++; + } + if (framebuffer.width !== current.width || framebuffer.height !== current.height) { + framebuffer.width = current.width; + framebuffer.height = current.height; + framebuffer.dirtyId++; + framebuffer.dirtySize++; + } + } + if (!sourcePixels) { + sourcePixels = tempRectangle; + sourcePixels.width = current.width; + sourcePixels.height = current.height; + } + if (!destPixels) { + destPixels = sourcePixels; + } + const sameSize = sourcePixels.width === destPixels.width && sourcePixels.height === destPixels.height; + this.bind(framebuffer); + gl.bindFramebuffer(gl.READ_FRAMEBUFFER, fbo.framebuffer); + gl.blitFramebuffer(sourcePixels.left, sourcePixels.top, sourcePixels.right, sourcePixels.bottom, destPixels.left, destPixels.top, destPixels.right, destPixels.bottom, gl.COLOR_BUFFER_BIT, sameSize ? gl.NEAREST : gl.LINEAR); + } + disposeFramebuffer(framebuffer, contextLost) { + const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID]; + const gl = this.gl; + if (!fbo) { + return; + } + delete framebuffer.glFramebuffers[this.CONTEXT_UID]; + const index = this.managedFramebuffers.indexOf(framebuffer); + if (index >= 0) { + this.managedFramebuffers.splice(index, 1); + } + framebuffer.disposeRunner.remove(this); + if (!contextLost) { + gl.deleteFramebuffer(fbo.framebuffer); + if (fbo.msaaBuffer) { + gl.deleteRenderbuffer(fbo.msaaBuffer); + } + if (fbo.stencil) { + gl.deleteRenderbuffer(fbo.stencil); + } + } + if (fbo.blitFramebuffer) { + this.disposeFramebuffer(fbo.blitFramebuffer, contextLost); + } + } + disposeAll(contextLost) { + const list = this.managedFramebuffers; + this.managedFramebuffers = []; + for (let i = 0; i < list.length; i++) { + this.disposeFramebuffer(list[i], contextLost); + } + } + forceStencil() { + const framebuffer = this.current; + if (!framebuffer) { + return; + } + const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID]; + if (!fbo || fbo.stencil) { + return; + } + framebuffer.stencil = true; + const w = framebuffer.width; + const h = framebuffer.height; + const gl = this.gl; + const stencil = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, stencil); + if (fbo.msaaBuffer) { + gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample, gl.DEPTH24_STENCIL8, w, h); + } else { + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, w, h); + } + fbo.stencil = stencil; + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, stencil); + } + reset() { + this.current = this.unknownFramebuffer; + this.viewport = new Rectangle(); + } + destroy() { + this.renderer = null; + } + } + FramebufferSystem.extension = { + type: ExtensionType.RendererSystem, + name: "framebuffer" + }; + extensions$1.add(FramebufferSystem); + + const byteSizeMap = { 5126: 4, 5123: 2, 5121: 1 }; + class GeometrySystem { + constructor(renderer) { + this.renderer = renderer; + this._activeGeometry = null; + this._activeVao = null; + this.hasVao = true; + this.hasInstance = true; + this.canUseUInt32ElementIndex = false; + this.managedGeometries = {}; + } + contextChange() { + this.disposeAll(true); + const gl = this.gl = this.renderer.gl; + const context = this.renderer.context; + this.CONTEXT_UID = this.renderer.CONTEXT_UID; + if (context.webGLVersion !== 2) { + let nativeVaoExtension = this.renderer.context.extensions.vertexArrayObject; + if (settings.PREFER_ENV === ENV.WEBGL_LEGACY) { + nativeVaoExtension = null; + } + if (nativeVaoExtension) { + gl.createVertexArray = () => nativeVaoExtension.createVertexArrayOES(); + gl.bindVertexArray = (vao) => nativeVaoExtension.bindVertexArrayOES(vao); + gl.deleteVertexArray = (vao) => nativeVaoExtension.deleteVertexArrayOES(vao); + } else { + this.hasVao = false; + gl.createVertexArray = () => null; + gl.bindVertexArray = () => null; + gl.deleteVertexArray = () => null; + } + } + if (context.webGLVersion !== 2) { + const instanceExt = gl.getExtension("ANGLE_instanced_arrays"); + if (instanceExt) { + gl.vertexAttribDivisor = (a, b) => instanceExt.vertexAttribDivisorANGLE(a, b); + gl.drawElementsInstanced = (a, b, c, d, e) => instanceExt.drawElementsInstancedANGLE(a, b, c, d, e); + gl.drawArraysInstanced = (a, b, c, d) => instanceExt.drawArraysInstancedANGLE(a, b, c, d); + } else { + this.hasInstance = false; + } + } + this.canUseUInt32ElementIndex = context.webGLVersion === 2 || !!context.extensions.uint32ElementIndex; + } + bind(geometry, shader) { + shader = shader || this.renderer.shader.shader; + const { gl } = this; + let vaos = geometry.glVertexArrayObjects[this.CONTEXT_UID]; + let incRefCount = false; + if (!vaos) { + this.managedGeometries[geometry.id] = geometry; + geometry.disposeRunner.add(this); + geometry.glVertexArrayObjects[this.CONTEXT_UID] = vaos = {}; + incRefCount = true; + } + const vao = vaos[shader.program.id] || this.initGeometryVao(geometry, shader, incRefCount); + this._activeGeometry = geometry; + if (this._activeVao !== vao) { + this._activeVao = vao; + if (this.hasVao) { + gl.bindVertexArray(vao); + } else { + this.activateVao(geometry, shader.program); + } + } + this.updateBuffers(); + } + reset() { + this.unbind(); + } + updateBuffers() { + const geometry = this._activeGeometry; + const bufferSystem = this.renderer.buffer; + for (let i = 0; i < geometry.buffers.length; i++) { + const buffer = geometry.buffers[i]; + bufferSystem.update(buffer); + } + } + checkCompatibility(geometry, program) { + const geometryAttributes = geometry.attributes; + const shaderAttributes = program.attributeData; + for (const j in shaderAttributes) { + if (!geometryAttributes[j]) { + throw new Error(`shader and geometry incompatible, geometry missing the "${j}" attribute`); + } + } + } + getSignature(geometry, program) { + const attribs = geometry.attributes; + const shaderAttributes = program.attributeData; + const strings = ["g", geometry.id]; + for (const i in attribs) { + if (shaderAttributes[i]) { + strings.push(i, shaderAttributes[i].location); + } + } + return strings.join("-"); + } + initGeometryVao(geometry, shader, incRefCount = true) { + const gl = this.gl; + const CONTEXT_UID = this.CONTEXT_UID; + const bufferSystem = this.renderer.buffer; + const program = shader.program; + if (!program.glPrograms[CONTEXT_UID]) { + this.renderer.shader.generateProgram(shader); + } + this.checkCompatibility(geometry, program); + const signature = this.getSignature(geometry, program); + const vaoObjectHash = geometry.glVertexArrayObjects[this.CONTEXT_UID]; + let vao = vaoObjectHash[signature]; + if (vao) { + vaoObjectHash[program.id] = vao; + return vao; + } + const buffers = geometry.buffers; + const attributes = geometry.attributes; + const tempStride = {}; + const tempStart = {}; + for (const j in buffers) { + tempStride[j] = 0; + tempStart[j] = 0; + } + for (const j in attributes) { + if (!attributes[j].size && program.attributeData[j]) { + attributes[j].size = program.attributeData[j].size; + } else if (!attributes[j].size) { + console.warn(`PIXI Geometry attribute '${j}' size cannot be determined (likely the bound shader does not have the attribute)`); + } + tempStride[attributes[j].buffer] += attributes[j].size * byteSizeMap[attributes[j].type]; + } + for (const j in attributes) { + const attribute = attributes[j]; + const attribSize = attribute.size; + if (attribute.stride === void 0) { + if (tempStride[attribute.buffer] === attribSize * byteSizeMap[attribute.type]) { + attribute.stride = 0; + } else { + attribute.stride = tempStride[attribute.buffer]; + } + } + if (attribute.start === void 0) { + attribute.start = tempStart[attribute.buffer]; + tempStart[attribute.buffer] += attribSize * byteSizeMap[attribute.type]; + } + } + vao = gl.createVertexArray(); + gl.bindVertexArray(vao); + for (let i = 0; i < buffers.length; i++) { + const buffer = buffers[i]; + bufferSystem.bind(buffer); + if (incRefCount) { + buffer._glBuffers[CONTEXT_UID].refCount++; + } + } + this.activateVao(geometry, program); + vaoObjectHash[program.id] = vao; + vaoObjectHash[signature] = vao; + gl.bindVertexArray(null); + bufferSystem.unbind(BUFFER_TYPE.ARRAY_BUFFER); + return vao; + } + disposeGeometry(geometry, contextLost) { + if (!this.managedGeometries[geometry.id]) { + return; + } + delete this.managedGeometries[geometry.id]; + const vaos = geometry.glVertexArrayObjects[this.CONTEXT_UID]; + const gl = this.gl; + const buffers = geometry.buffers; + const bufferSystem = this.renderer?.buffer; + geometry.disposeRunner.remove(this); + if (!vaos) { + return; + } + if (bufferSystem) { + for (let i = 0; i < buffers.length; i++) { + const buf = buffers[i]._glBuffers[this.CONTEXT_UID]; + if (buf) { + buf.refCount--; + if (buf.refCount === 0 && !contextLost) { + bufferSystem.dispose(buffers[i], contextLost); + } + } + } + } + if (!contextLost) { + for (const vaoId in vaos) { + if (vaoId[0] === "g") { + const vao = vaos[vaoId]; + if (this._activeVao === vao) { + this.unbind(); + } + gl.deleteVertexArray(vao); + } + } + } + delete geometry.glVertexArrayObjects[this.CONTEXT_UID]; + } + disposeAll(contextLost) { + const all = Object.keys(this.managedGeometries); + for (let i = 0; i < all.length; i++) { + this.disposeGeometry(this.managedGeometries[all[i]], contextLost); + } + } + activateVao(geometry, program) { + const gl = this.gl; + const CONTEXT_UID = this.CONTEXT_UID; + const bufferSystem = this.renderer.buffer; + const buffers = geometry.buffers; + const attributes = geometry.attributes; + if (geometry.indexBuffer) { + bufferSystem.bind(geometry.indexBuffer); + } + let lastBuffer = null; + for (const j in attributes) { + const attribute = attributes[j]; + const buffer = buffers[attribute.buffer]; + const glBuffer = buffer._glBuffers[CONTEXT_UID]; + if (program.attributeData[j]) { + if (lastBuffer !== glBuffer) { + bufferSystem.bind(buffer); + lastBuffer = glBuffer; + } + const location = program.attributeData[j].location; + gl.enableVertexAttribArray(location); + gl.vertexAttribPointer(location, attribute.size, attribute.type || gl.FLOAT, attribute.normalized, attribute.stride, attribute.start); + if (attribute.instance) { + if (this.hasInstance) { + gl.vertexAttribDivisor(location, attribute.divisor); + } else { + throw new Error("geometry error, GPU Instancing is not supported on this device"); + } + } + } + } + } + draw(type, size, start, instanceCount) { + const { gl } = this; + const geometry = this._activeGeometry; + if (geometry.indexBuffer) { + const byteSize = geometry.indexBuffer.data.BYTES_PER_ELEMENT; + const glType = byteSize === 2 ? gl.UNSIGNED_SHORT : gl.UNSIGNED_INT; + if (byteSize === 2 || byteSize === 4 && this.canUseUInt32ElementIndex) { + if (geometry.instanced) { + gl.drawElementsInstanced(type, size || geometry.indexBuffer.data.length, glType, (start || 0) * byteSize, instanceCount || 1); + } else { + gl.drawElements(type, size || geometry.indexBuffer.data.length, glType, (start || 0) * byteSize); + } + } else { + console.warn("unsupported index buffer type: uint32"); + } + } else if (geometry.instanced) { + gl.drawArraysInstanced(type, start, size || geometry.getSize(), instanceCount || 1); + } else { + gl.drawArrays(type, start, size || geometry.getSize()); + } + return this; + } + unbind() { + this.gl.bindVertexArray(null); + this._activeVao = null; + this._activeGeometry = null; + } + destroy() { + this.renderer = null; + } + } + GeometrySystem.extension = { + type: ExtensionType.RendererSystem, + name: "geometry" + }; + extensions$1.add(GeometrySystem); + + const tempMat$1 = new Matrix(); + class TextureMatrix { + constructor(texture, clampMargin) { + this._texture = texture; + this.mapCoord = new Matrix(); + this.uClampFrame = new Float32Array(4); + this.uClampOffset = new Float32Array(2); + this._textureID = -1; + this._updateID = 0; + this.clampOffset = 0; + this.clampMargin = typeof clampMargin === "undefined" ? 0.5 : clampMargin; + this.isSimple = false; + } + get texture() { + return this._texture; + } + set texture(value) { + this._texture = value; + this._textureID = -1; + } + multiplyUvs(uvs, out) { + if (out === void 0) { + out = uvs; + } + const mat = this.mapCoord; + for (let i = 0; i < uvs.length; i += 2) { + const x = uvs[i]; + const y = uvs[i + 1]; + out[i] = x * mat.a + y * mat.c + mat.tx; + out[i + 1] = x * mat.b + y * mat.d + mat.ty; + } + return out; + } + update(forceUpdate) { + const tex = this._texture; + if (!tex || !tex.valid) { + return false; + } + if (!forceUpdate && this._textureID === tex._updateID) { + return false; + } + this._textureID = tex._updateID; + this._updateID++; + const uvs = tex._uvs; + this.mapCoord.set(uvs.x1 - uvs.x0, uvs.y1 - uvs.y0, uvs.x3 - uvs.x0, uvs.y3 - uvs.y0, uvs.x0, uvs.y0); + const orig = tex.orig; + const trim = tex.trim; + if (trim) { + tempMat$1.set(orig.width / trim.width, 0, 0, orig.height / trim.height, -trim.x / trim.width, -trim.y / trim.height); + this.mapCoord.append(tempMat$1); + } + const texBase = tex.baseTexture; + const frame = this.uClampFrame; + const margin = this.clampMargin / texBase.resolution; + const offset = this.clampOffset; + frame[0] = (tex._frame.x + margin + offset) / texBase.width; + frame[1] = (tex._frame.y + margin + offset) / texBase.height; + frame[2] = (tex._frame.x + tex._frame.width - margin + offset) / texBase.width; + frame[3] = (tex._frame.y + tex._frame.height - margin + offset) / texBase.height; + this.uClampOffset[0] = offset / texBase.realWidth; + this.uClampOffset[1] = offset / texBase.realHeight; + this.isSimple = tex._frame.width === texBase.width && tex._frame.height === texBase.height && tex.rotate === 0; + return true; + } + } + + var fragment$7 = "varying vec2 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform sampler2D mask;\nuniform float alpha;\nuniform float npmAlpha;\nuniform vec4 maskClamp;\n\nvoid main(void)\n{\n float clip = step(3.5,\n step(maskClamp.x, vMaskCoord.x) +\n step(maskClamp.y, vMaskCoord.y) +\n step(vMaskCoord.x, maskClamp.z) +\n step(vMaskCoord.y, maskClamp.w));\n\n vec4 original = texture2D(uSampler, vTextureCoord);\n vec4 masky = texture2D(mask, vMaskCoord);\n float alphaMul = 1.0 - npmAlpha * (1.0 - masky.a);\n\n original *= (alphaMul * masky.r * alpha * clip);\n\n gl_FragColor = original;\n}\n"; + + var vertex$4 = "attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 otherMatrix;\n\nvarying vec2 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = aTextureCoord;\n vMaskCoord = ( otherMatrix * vec3( aTextureCoord, 1.0) ).xy;\n}\n"; + + class SpriteMaskFilter extends Filter { + constructor(vertexSrc, fragmentSrc, uniforms) { + let sprite = null; + if (typeof vertexSrc !== "string" && fragmentSrc === void 0 && uniforms === void 0) { + sprite = vertexSrc; + vertexSrc = void 0; + fragmentSrc = void 0; + uniforms = void 0; + } + super(vertexSrc || vertex$4, fragmentSrc || fragment$7, uniforms); + this.maskSprite = sprite; + this.maskMatrix = new Matrix(); + } + get maskSprite() { + return this._maskSprite; + } + set maskSprite(value) { + this._maskSprite = value; + if (this._maskSprite) { + this._maskSprite.renderable = false; + } + } + apply(filterManager, input, output, clearMode) { + const maskSprite = this._maskSprite; + const tex = maskSprite._texture; + if (!tex.valid) { + return; + } + if (!tex.uvMatrix) { + tex.uvMatrix = new TextureMatrix(tex, 0); + } + tex.uvMatrix.update(); + this.uniforms.npmAlpha = tex.baseTexture.alphaMode ? 0 : 1; + this.uniforms.mask = tex; + this.uniforms.otherMatrix = filterManager.calculateSpriteMatrix(this.maskMatrix, maskSprite).prepend(tex.uvMatrix.mapCoord); + this.uniforms.alpha = maskSprite.worldAlpha; + this.uniforms.maskClamp = tex.uvMatrix.uClampFrame; + filterManager.applyFilter(this, input, output, clearMode); + } + } + + class MaskData { + constructor(maskObject = null) { + this.type = MASK_TYPES.NONE; + this.autoDetect = true; + this.maskObject = maskObject || null; + this.pooled = false; + this.isMaskData = true; + this.resolution = null; + this.multisample = Filter.defaultMultisample; + this.enabled = true; + this.colorMask = 15; + this._filters = null; + this._stencilCounter = 0; + this._scissorCounter = 0; + this._scissorRect = null; + this._scissorRectLocal = null; + this._colorMask = 15; + this._target = null; + } + get filter() { + return this._filters ? this._filters[0] : null; + } + set filter(value) { + if (value) { + if (this._filters) { + this._filters[0] = value; + } else { + this._filters = [value]; + } + } else { + this._filters = null; + } + } + reset() { + if (this.pooled) { + this.maskObject = null; + this.type = MASK_TYPES.NONE; + this.autoDetect = true; + } + this._target = null; + this._scissorRectLocal = null; + } + copyCountersOrReset(maskAbove) { + if (maskAbove) { + this._stencilCounter = maskAbove._stencilCounter; + this._scissorCounter = maskAbove._scissorCounter; + this._scissorRect = maskAbove._scissorRect; + } else { + this._stencilCounter = 0; + this._scissorCounter = 0; + this._scissorRect = null; + } + } + } + + class MaskSystem { + constructor(renderer) { + this.renderer = renderer; + this.enableScissor = true; + this.alphaMaskPool = []; + this.maskDataPool = []; + this.maskStack = []; + this.alphaMaskIndex = 0; + } + setMaskStack(maskStack) { + this.maskStack = maskStack; + this.renderer.scissor.setMaskStack(maskStack); + this.renderer.stencil.setMaskStack(maskStack); + } + push(target, maskDataOrTarget) { + let maskData = maskDataOrTarget; + if (!maskData.isMaskData) { + const d = this.maskDataPool.pop() || new MaskData(); + d.pooled = true; + d.maskObject = maskDataOrTarget; + maskData = d; + } + const maskAbove = this.maskStack.length !== 0 ? this.maskStack[this.maskStack.length - 1] : null; + maskData.copyCountersOrReset(maskAbove); + maskData._colorMask = maskAbove ? maskAbove._colorMask : 15; + if (maskData.autoDetect) { + this.detect(maskData); + } + maskData._target = target; + if (maskData.type !== MASK_TYPES.SPRITE) { + this.maskStack.push(maskData); + } + if (maskData.enabled) { + switch (maskData.type) { + case MASK_TYPES.SCISSOR: + this.renderer.scissor.push(maskData); + break; + case MASK_TYPES.STENCIL: + this.renderer.stencil.push(maskData); + break; + case MASK_TYPES.SPRITE: + maskData.copyCountersOrReset(null); + this.pushSpriteMask(maskData); + break; + case MASK_TYPES.COLOR: + this.pushColorMask(maskData); + break; + default: + break; + } + } + if (maskData.type === MASK_TYPES.SPRITE) { + this.maskStack.push(maskData); + } + } + pop(target) { + const maskData = this.maskStack.pop(); + if (!maskData || maskData._target !== target) { + return; + } + if (maskData.enabled) { + switch (maskData.type) { + case MASK_TYPES.SCISSOR: + this.renderer.scissor.pop(maskData); + break; + case MASK_TYPES.STENCIL: + this.renderer.stencil.pop(maskData.maskObject); + break; + case MASK_TYPES.SPRITE: + this.popSpriteMask(maskData); + break; + case MASK_TYPES.COLOR: + this.popColorMask(maskData); + break; + default: + break; + } + } + maskData.reset(); + if (maskData.pooled) { + this.maskDataPool.push(maskData); + } + if (this.maskStack.length !== 0) { + const maskCurrent = this.maskStack[this.maskStack.length - 1]; + if (maskCurrent.type === MASK_TYPES.SPRITE && maskCurrent._filters) { + maskCurrent._filters[0].maskSprite = maskCurrent.maskObject; + } + } + } + detect(maskData) { + const maskObject = maskData.maskObject; + if (!maskObject) { + maskData.type = MASK_TYPES.COLOR; + } else if (maskObject.isSprite) { + maskData.type = MASK_TYPES.SPRITE; + } else if (this.enableScissor && this.renderer.scissor.testScissor(maskData)) { + maskData.type = MASK_TYPES.SCISSOR; + } else { + maskData.type = MASK_TYPES.STENCIL; + } + } + pushSpriteMask(maskData) { + const { maskObject } = maskData; + const target = maskData._target; + let alphaMaskFilter = maskData._filters; + if (!alphaMaskFilter) { + alphaMaskFilter = this.alphaMaskPool[this.alphaMaskIndex]; + if (!alphaMaskFilter) { + alphaMaskFilter = this.alphaMaskPool[this.alphaMaskIndex] = [new SpriteMaskFilter()]; + } + } + const renderer = this.renderer; + const renderTextureSystem = renderer.renderTexture; + let resolution; + let multisample; + if (renderTextureSystem.current) { + const renderTexture = renderTextureSystem.current; + resolution = maskData.resolution || renderTexture.resolution; + multisample = maskData.multisample ?? renderTexture.multisample; + } else { + resolution = maskData.resolution || renderer.resolution; + multisample = maskData.multisample ?? renderer.multisample; + } + alphaMaskFilter[0].resolution = resolution; + alphaMaskFilter[0].multisample = multisample; + alphaMaskFilter[0].maskSprite = maskObject; + const stashFilterArea = target.filterArea; + target.filterArea = maskObject.getBounds(true); + renderer.filter.push(target, alphaMaskFilter); + target.filterArea = stashFilterArea; + if (!maskData._filters) { + this.alphaMaskIndex++; + } + } + popSpriteMask(maskData) { + this.renderer.filter.pop(); + if (maskData._filters) { + maskData._filters[0].maskSprite = null; + } else { + this.alphaMaskIndex--; + this.alphaMaskPool[this.alphaMaskIndex][0].maskSprite = null; + } + } + pushColorMask(maskData) { + const currColorMask = maskData._colorMask; + const nextColorMask = maskData._colorMask = currColorMask & maskData.colorMask; + if (nextColorMask !== currColorMask) { + this.renderer.gl.colorMask((nextColorMask & 1) !== 0, (nextColorMask & 2) !== 0, (nextColorMask & 4) !== 0, (nextColorMask & 8) !== 0); + } + } + popColorMask(maskData) { + const currColorMask = maskData._colorMask; + const nextColorMask = this.maskStack.length > 0 ? this.maskStack[this.maskStack.length - 1]._colorMask : 15; + if (nextColorMask !== currColorMask) { + this.renderer.gl.colorMask((nextColorMask & 1) !== 0, (nextColorMask & 2) !== 0, (nextColorMask & 4) !== 0, (nextColorMask & 8) !== 0); + } + } + destroy() { + this.renderer = null; + } + } + MaskSystem.extension = { + type: ExtensionType.RendererSystem, + name: "mask" + }; + extensions$1.add(MaskSystem); + + class AbstractMaskSystem { + constructor(renderer) { + this.renderer = renderer; + this.maskStack = []; + this.glConst = 0; + } + getStackLength() { + return this.maskStack.length; + } + setMaskStack(maskStack) { + const { gl } = this.renderer; + const curStackLen = this.getStackLength(); + this.maskStack = maskStack; + const newStackLen = this.getStackLength(); + if (newStackLen !== curStackLen) { + if (newStackLen === 0) { + gl.disable(this.glConst); + } else { + gl.enable(this.glConst); + this._useCurrent(); + } + } + } + _useCurrent() { + } + destroy() { + this.renderer = null; + this.maskStack = null; + } + } + + const tempMatrix$1 = new Matrix(); + const rectPool = []; + const _ScissorSystem = class extends AbstractMaskSystem { + constructor(renderer) { + super(renderer); + this.glConst = settings.ADAPTER.getWebGLRenderingContext().SCISSOR_TEST; + } + getStackLength() { + const maskData = this.maskStack[this.maskStack.length - 1]; + if (maskData) { + return maskData._scissorCounter; + } + return 0; + } + calcScissorRect(maskData) { + if (maskData._scissorRectLocal) { + return; + } + const prevData = maskData._scissorRect; + const { maskObject } = maskData; + const { renderer } = this; + const renderTextureSystem = renderer.renderTexture; + const rect = maskObject.getBounds(true, rectPool.pop() ?? new Rectangle()); + this.roundFrameToPixels(rect, renderTextureSystem.current ? renderTextureSystem.current.resolution : renderer.resolution, renderTextureSystem.sourceFrame, renderTextureSystem.destinationFrame, renderer.projection.transform); + if (prevData) { + rect.fit(prevData); + } + maskData._scissorRectLocal = rect; + } + static isMatrixRotated(matrix) { + if (!matrix) { + return false; + } + const { a, b, c, d } = matrix; + return (Math.abs(b) > 1e-4 || Math.abs(c) > 1e-4) && (Math.abs(a) > 1e-4 || Math.abs(d) > 1e-4); + } + testScissor(maskData) { + const { maskObject } = maskData; + if (!maskObject.isFastRect || !maskObject.isFastRect()) { + return false; + } + if (_ScissorSystem.isMatrixRotated(maskObject.worldTransform)) { + return false; + } + if (_ScissorSystem.isMatrixRotated(this.renderer.projection.transform)) { + return false; + } + this.calcScissorRect(maskData); + const rect = maskData._scissorRectLocal; + return rect.width > 0 && rect.height > 0; + } + roundFrameToPixels(frame, resolution, bindingSourceFrame, bindingDestinationFrame, transform) { + if (_ScissorSystem.isMatrixRotated(transform)) { + return; + } + transform = transform ? tempMatrix$1.copyFrom(transform) : tempMatrix$1.identity(); + transform.translate(-bindingSourceFrame.x, -bindingSourceFrame.y).scale(bindingDestinationFrame.width / bindingSourceFrame.width, bindingDestinationFrame.height / bindingSourceFrame.height).translate(bindingDestinationFrame.x, bindingDestinationFrame.y); + this.renderer.filter.transformAABB(transform, frame); + frame.fit(bindingDestinationFrame); + frame.x = Math.round(frame.x * resolution); + frame.y = Math.round(frame.y * resolution); + frame.width = Math.round(frame.width * resolution); + frame.height = Math.round(frame.height * resolution); + } + push(maskData) { + if (!maskData._scissorRectLocal) { + this.calcScissorRect(maskData); + } + const { gl } = this.renderer; + if (!maskData._scissorRect) { + gl.enable(gl.SCISSOR_TEST); + } + maskData._scissorCounter++; + maskData._scissorRect = maskData._scissorRectLocal; + this._useCurrent(); + } + pop(maskData) { + const { gl } = this.renderer; + if (maskData) { + rectPool.push(maskData._scissorRectLocal); + } + if (this.getStackLength() > 0) { + this._useCurrent(); + } else { + gl.disable(gl.SCISSOR_TEST); + } + } + _useCurrent() { + const rect = this.maskStack[this.maskStack.length - 1]._scissorRect; + let y; + if (this.renderer.renderTexture.current) { + y = rect.y; + } else { + y = this.renderer.height - rect.height - rect.y; + } + this.renderer.gl.scissor(rect.x, y, rect.width, rect.height); + } + }; + let ScissorSystem = _ScissorSystem; + ScissorSystem.extension = { + type: ExtensionType.RendererSystem, + name: "scissor" + }; + extensions$1.add(ScissorSystem); + + class StencilSystem extends AbstractMaskSystem { + constructor(renderer) { + super(renderer); + this.glConst = settings.ADAPTER.getWebGLRenderingContext().STENCIL_TEST; + } + getStackLength() { + const maskData = this.maskStack[this.maskStack.length - 1]; + if (maskData) { + return maskData._stencilCounter; + } + return 0; + } + push(maskData) { + const maskObject = maskData.maskObject; + const { gl } = this.renderer; + const prevMaskCount = maskData._stencilCounter; + if (prevMaskCount === 0) { + this.renderer.framebuffer.forceStencil(); + gl.clearStencil(0); + gl.clear(gl.STENCIL_BUFFER_BIT); + gl.enable(gl.STENCIL_TEST); + } + maskData._stencilCounter++; + const colorMask = maskData._colorMask; + if (colorMask !== 0) { + maskData._colorMask = 0; + gl.colorMask(false, false, false, false); + } + gl.stencilFunc(gl.EQUAL, prevMaskCount, 4294967295); + gl.stencilOp(gl.KEEP, gl.KEEP, gl.INCR); + maskObject.renderable = true; + maskObject.render(this.renderer); + this.renderer.batch.flush(); + maskObject.renderable = false; + if (colorMask !== 0) { + maskData._colorMask = colorMask; + gl.colorMask((colorMask & 1) !== 0, (colorMask & 2) !== 0, (colorMask & 4) !== 0, (colorMask & 8) !== 0); + } + this._useCurrent(); + } + pop(maskObject) { + const gl = this.renderer.gl; + if (this.getStackLength() === 0) { + gl.disable(gl.STENCIL_TEST); + } else { + const maskData = this.maskStack.length !== 0 ? this.maskStack[this.maskStack.length - 1] : null; + const colorMask = maskData ? maskData._colorMask : 15; + if (colorMask !== 0) { + maskData._colorMask = 0; + gl.colorMask(false, false, false, false); + } + gl.stencilOp(gl.KEEP, gl.KEEP, gl.DECR); + maskObject.renderable = true; + maskObject.render(this.renderer); + this.renderer.batch.flush(); + maskObject.renderable = false; + if (colorMask !== 0) { + maskData._colorMask = colorMask; + gl.colorMask((colorMask & 1) !== 0, (colorMask & 2) !== 0, (colorMask & 4) !== 0, (colorMask & 8) !== 0); + } + this._useCurrent(); + } + } + _useCurrent() { + const gl = this.renderer.gl; + gl.stencilFunc(gl.EQUAL, this.getStackLength(), 4294967295); + gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); + } + } + StencilSystem.extension = { + type: ExtensionType.RendererSystem, + name: "stencil" + }; + extensions$1.add(StencilSystem); + + class PluginSystem { + constructor(renderer) { + this.renderer = renderer; + this.plugins = {}; + Object.defineProperties(this.plugins, { + extract: { + enumerable: false, + get() { + deprecation("7.0.0", "renderer.plugins.extract has moved to renderer.extract"); + return renderer.extract; + } + }, + prepare: { + enumerable: false, + get() { + deprecation("7.0.0", "renderer.plugins.prepare has moved to renderer.prepare"); + return renderer.prepare; + } + }, + interaction: { + enumerable: false, + get() { + deprecation("7.0.0", "renderer.plugins.interaction has been deprecated, use renderer.events"); + return renderer.events; + } + } + }); + } + init() { + const staticMap = this.rendererPlugins; + for (const o in staticMap) { + this.plugins[o] = new staticMap[o](this.renderer); + } + } + destroy() { + for (const o in this.plugins) { + this.plugins[o].destroy(); + this.plugins[o] = null; + } + } + } + PluginSystem.extension = { + type: [ + ExtensionType.RendererSystem, + ExtensionType.CanvasRendererSystem + ], + name: "_plugin" + }; + extensions$1.add(PluginSystem); + + class ProjectionSystem { + constructor(renderer) { + this.renderer = renderer; + this.destinationFrame = null; + this.sourceFrame = null; + this.defaultFrame = null; + this.projectionMatrix = new Matrix(); + this.transform = null; + } + update(destinationFrame, sourceFrame, resolution, root) { + this.destinationFrame = destinationFrame || this.destinationFrame || this.defaultFrame; + this.sourceFrame = sourceFrame || this.sourceFrame || destinationFrame; + this.calculateProjection(this.destinationFrame, this.sourceFrame, resolution, root); + if (this.transform) { + this.projectionMatrix.append(this.transform); + } + const renderer = this.renderer; + renderer.globalUniforms.uniforms.projectionMatrix = this.projectionMatrix; + renderer.globalUniforms.update(); + if (renderer.shader.shader) { + renderer.shader.syncUniformGroup(renderer.shader.shader.uniforms.globals); + } + } + calculateProjection(_destinationFrame, sourceFrame, _resolution, root) { + const pm = this.projectionMatrix; + const sign = !root ? 1 : -1; + pm.identity(); + pm.a = 1 / sourceFrame.width * 2; + pm.d = sign * (1 / sourceFrame.height * 2); + pm.tx = -1 - sourceFrame.x * pm.a; + pm.ty = -sign - sourceFrame.y * pm.d; + } + setTransform(_matrix) { + } + destroy() { + this.renderer = null; + } + } + ProjectionSystem.extension = { + type: ExtensionType.RendererSystem, + name: "projection" + }; + extensions$1.add(ProjectionSystem); + + const tempTransform = new Transform(); + class GenerateTextureSystem { + constructor(renderer) { + this.renderer = renderer; + this._tempMatrix = new Matrix(); + } + generateTexture(displayObject, options) { + const { region: manualRegion, ...textureOptions } = options || {}; + const region = manualRegion || displayObject.getLocalBounds(null, true); + if (region.width === 0) + region.width = 1; + if (region.height === 0) + region.height = 1; + const renderTexture = RenderTexture.create({ + width: region.width, + height: region.height, + ...textureOptions + }); + this._tempMatrix.tx = -region.x; + this._tempMatrix.ty = -region.y; + const transform = displayObject.transform; + displayObject.transform = tempTransform; + this.renderer.render(displayObject, { + renderTexture, + transform: this._tempMatrix, + skipUpdateTransform: !!displayObject.parent, + blit: true + }); + displayObject.transform = transform; + return renderTexture; + } + destroy() { + } + } + GenerateTextureSystem.extension = { + type: [ + ExtensionType.RendererSystem, + ExtensionType.CanvasRendererSystem + ], + name: "textureGenerator" + }; + extensions$1.add(GenerateTextureSystem); + + const tempRect = new Rectangle(); + const tempRect2 = new Rectangle(); + class RenderTextureSystem { + constructor(renderer) { + this.renderer = renderer; + this.defaultMaskStack = []; + this.current = null; + this.sourceFrame = new Rectangle(); + this.destinationFrame = new Rectangle(); + this.viewportFrame = new Rectangle(); + } + bind(renderTexture = null, sourceFrame, destinationFrame) { + const renderer = this.renderer; + this.current = renderTexture; + let baseTexture; + let framebuffer; + let resolution; + if (renderTexture) { + baseTexture = renderTexture.baseTexture; + resolution = baseTexture.resolution; + if (!sourceFrame) { + tempRect.width = renderTexture.frame.width; + tempRect.height = renderTexture.frame.height; + sourceFrame = tempRect; + } + if (!destinationFrame) { + tempRect2.x = renderTexture.frame.x; + tempRect2.y = renderTexture.frame.y; + tempRect2.width = sourceFrame.width; + tempRect2.height = sourceFrame.height; + destinationFrame = tempRect2; + } + framebuffer = baseTexture.framebuffer; + } else { + resolution = renderer.resolution; + if (!sourceFrame) { + tempRect.width = renderer._view.screen.width; + tempRect.height = renderer._view.screen.height; + sourceFrame = tempRect; + } + if (!destinationFrame) { + destinationFrame = tempRect; + destinationFrame.width = sourceFrame.width; + destinationFrame.height = sourceFrame.height; + } + } + const viewportFrame = this.viewportFrame; + viewportFrame.x = destinationFrame.x * resolution; + viewportFrame.y = destinationFrame.y * resolution; + viewportFrame.width = destinationFrame.width * resolution; + viewportFrame.height = destinationFrame.height * resolution; + if (!renderTexture) { + viewportFrame.y = renderer.view.height - (viewportFrame.y + viewportFrame.height); + } + viewportFrame.ceil(); + this.renderer.framebuffer.bind(framebuffer, viewportFrame); + this.renderer.projection.update(destinationFrame, sourceFrame, resolution, !framebuffer); + if (renderTexture) { + this.renderer.mask.setMaskStack(baseTexture.maskStack); + } else { + this.renderer.mask.setMaskStack(this.defaultMaskStack); + } + this.sourceFrame.copyFrom(sourceFrame); + this.destinationFrame.copyFrom(destinationFrame); + } + clear(clearColor, mask) { + const fallbackColor = this.current ? this.current.baseTexture.clear : this.renderer.background.backgroundColor; + const color = clearColor ? Color.shared.setValue(clearColor) : fallbackColor; + const destinationFrame = this.destinationFrame; + const baseFrame = this.current ? this.current.baseTexture : this.renderer._view.screen; + const clearMask = destinationFrame.width !== baseFrame.width || destinationFrame.height !== baseFrame.height; + if (clearMask) { + let { x, y, width, height } = this.viewportFrame; + x = Math.round(x); + y = Math.round(y); + width = Math.round(width); + height = Math.round(height); + this.renderer.gl.enable(this.renderer.gl.SCISSOR_TEST); + this.renderer.gl.scissor(x, y, width, height); + } + this.renderer.framebuffer.clear(color.red, color.green, color.blue, color.alpha, mask); + if (clearMask) { + this.renderer.scissor.pop(); + } + } + resize() { + this.bind(null); + } + reset() { + this.bind(null); + } + destroy() { + this.renderer = null; + } + } + RenderTextureSystem.extension = { + type: ExtensionType.RendererSystem, + name: "renderTexture" + }; + extensions$1.add(RenderTextureSystem); + + class IGLUniformData { + } + class GLProgram { + constructor(program, uniformData) { + this.program = program; + this.uniformData = uniformData; + this.uniformGroups = {}; + this.uniformDirtyGroups = {}; + this.uniformBufferBindings = {}; + } + destroy() { + this.uniformData = null; + this.uniformGroups = null; + this.uniformDirtyGroups = null; + this.uniformBufferBindings = null; + this.program = null; + } + } + + function getAttributeData(program, gl) { + const attributes = {}; + const totalAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); + for (let i = 0; i < totalAttributes; i++) { + const attribData = gl.getActiveAttrib(program, i); + if (attribData.name.startsWith("gl_")) { + continue; + } + const type = mapType(gl, attribData.type); + const data = { + type, + name: attribData.name, + size: mapSize(type), + location: gl.getAttribLocation(program, attribData.name) + }; + attributes[attribData.name] = data; + } + return attributes; + } + + function getUniformData(program, gl) { + const uniforms = {}; + const totalUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); + for (let i = 0; i < totalUniforms; i++) { + const uniformData = gl.getActiveUniform(program, i); + const name = uniformData.name.replace(/\[.*?\]$/, ""); + const isArray = !!uniformData.name.match(/\[.*?\]$/); + const type = mapType(gl, uniformData.type); + uniforms[name] = { + name, + index: i, + type, + size: uniformData.size, + isArray, + value: defaultValue(type, uniformData.size) + }; + } + return uniforms; + } + + function generateProgram(gl, program) { + const glVertShader = compileShader(gl, gl.VERTEX_SHADER, program.vertexSrc); + const glFragShader = compileShader(gl, gl.FRAGMENT_SHADER, program.fragmentSrc); + const webGLProgram = gl.createProgram(); + gl.attachShader(webGLProgram, glVertShader); + gl.attachShader(webGLProgram, glFragShader); + const transformFeedbackVaryings = program.extra?.transformFeedbackVaryings; + if (transformFeedbackVaryings) { + if (typeof gl.transformFeedbackVaryings !== "function") { + console.warn(`TransformFeedback is not supported but TransformFeedbackVaryings are given.`); + } else { + gl.transformFeedbackVaryings(webGLProgram, transformFeedbackVaryings.names, transformFeedbackVaryings.bufferMode === "separate" ? gl.SEPARATE_ATTRIBS : gl.INTERLEAVED_ATTRIBS); + } + } + gl.linkProgram(webGLProgram); + if (!gl.getProgramParameter(webGLProgram, gl.LINK_STATUS)) { + logProgramError(gl, webGLProgram, glVertShader, glFragShader); + } + program.attributeData = getAttributeData(webGLProgram, gl); + program.uniformData = getUniformData(webGLProgram, gl); + if (!/^[ \t]*#[ \t]*version[ \t]+300[ \t]+es[ \t]*$/m.test(program.vertexSrc)) { + const keys = Object.keys(program.attributeData); + keys.sort((a, b) => a > b ? 1 : -1); + for (let i = 0; i < keys.length; i++) { + program.attributeData[keys[i]].location = i; + gl.bindAttribLocation(webGLProgram, i, keys[i]); + } + gl.linkProgram(webGLProgram); + } + gl.deleteShader(glVertShader); + gl.deleteShader(glFragShader); + const uniformData = {}; + for (const i in program.uniformData) { + const data = program.uniformData[i]; + uniformData[i] = { + location: gl.getUniformLocation(webGLProgram, i), + value: defaultValue(data.type, data.size) + }; + } + const glProgram = new GLProgram(webGLProgram, uniformData); + return glProgram; + } + + function uboUpdate(_ud, _uv, _renderer, _syncData, buffer) { + _renderer.buffer.update(buffer); + } + const UBO_TO_SINGLE_SETTERS = { + float: ` + data[offset] = v; + `, + vec2: ` + data[offset] = v[0]; + data[offset+1] = v[1]; + `, + vec3: ` + data[offset] = v[0]; + data[offset+1] = v[1]; + data[offset+2] = v[2]; + + `, + vec4: ` + data[offset] = v[0]; + data[offset+1] = v[1]; + data[offset+2] = v[2]; + data[offset+3] = v[3]; + `, + mat2: ` + data[offset] = v[0]; + data[offset+1] = v[1]; + + data[offset+4] = v[2]; + data[offset+5] = v[3]; + `, + mat3: ` + data[offset] = v[0]; + data[offset+1] = v[1]; + data[offset+2] = v[2]; + + data[offset + 4] = v[3]; + data[offset + 5] = v[4]; + data[offset + 6] = v[5]; + + data[offset + 8] = v[6]; + data[offset + 9] = v[7]; + data[offset + 10] = v[8]; + `, + mat4: ` + for(var i = 0; i < 16; i++) + { + data[offset + i] = v[i]; + } + ` + }; + const GLSL_TO_STD40_SIZE = { + float: 4, + vec2: 8, + vec3: 12, + vec4: 16, + int: 4, + ivec2: 8, + ivec3: 12, + ivec4: 16, + uint: 4, + uvec2: 8, + uvec3: 12, + uvec4: 16, + bool: 4, + bvec2: 8, + bvec3: 12, + bvec4: 16, + mat2: 16 * 2, + mat3: 16 * 3, + mat4: 16 * 4 + }; + function createUBOElements(uniformData) { + const uboElements = uniformData.map((data) => ({ + data, + offset: 0, + dataLen: 0, + dirty: 0 + })); + let size = 0; + let chunkSize = 0; + let offset = 0; + for (let i = 0; i < uboElements.length; i++) { + const uboElement = uboElements[i]; + size = GLSL_TO_STD40_SIZE[uboElement.data.type]; + if (uboElement.data.size > 1) { + size = Math.max(size, 16) * uboElement.data.size; + } + uboElement.dataLen = size; + if (chunkSize % size !== 0 && chunkSize < 16) { + const lineUpValue = chunkSize % size % 16; + chunkSize += lineUpValue; + offset += lineUpValue; + } + if (chunkSize + size > 16) { + offset = Math.ceil(offset / 16) * 16; + uboElement.offset = offset; + offset += size; + chunkSize = size; + } else { + uboElement.offset = offset; + chunkSize += size; + offset += size; + } + } + offset = Math.ceil(offset / 16) * 16; + return { uboElements, size: offset }; + } + function getUBOData(uniforms, uniformData) { + const usedUniformDatas = []; + for (const i in uniforms) { + if (uniformData[i]) { + usedUniformDatas.push(uniformData[i]); + } + } + usedUniformDatas.sort((a, b) => a.index - b.index); + return usedUniformDatas; + } + function generateUniformBufferSync(group, uniformData) { + if (!group.autoManage) { + return { size: 0, syncFunc: uboUpdate }; + } + const usedUniformDatas = getUBOData(group.uniforms, uniformData); + const { uboElements, size } = createUBOElements(usedUniformDatas); + const funcFragments = [` + var v = null; + var v2 = null; + var cv = null; + var t = 0; + var gl = renderer.gl + var index = 0; + var data = buffer.data; + `]; + for (let i = 0; i < uboElements.length; i++) { + const uboElement = uboElements[i]; + const uniform = group.uniforms[uboElement.data.name]; + const name = uboElement.data.name; + let parsed = false; + for (let j = 0; j < uniformParsers.length; j++) { + const uniformParser = uniformParsers[j]; + if (uniformParser.codeUbo && uniformParser.test(uboElement.data, uniform)) { + funcFragments.push(`offset = ${uboElement.offset / 4};`, uniformParsers[j].codeUbo(uboElement.data.name, uniform)); + parsed = true; + break; + } + } + if (!parsed) { + if (uboElement.data.size > 1) { + const size2 = mapSize(uboElement.data.type); + const rowSize = Math.max(GLSL_TO_STD40_SIZE[uboElement.data.type] / 16, 1); + const elementSize = size2 / rowSize; + const remainder = (4 - elementSize % 4) % 4; + funcFragments.push(` + cv = ud.${name}.value; + v = uv.${name}; + offset = ${uboElement.offset / 4}; + + t = 0; + + for(var i=0; i < ${uboElement.data.size * rowSize}; i++) + { + for(var j = 0; j < ${elementSize}; j++) + { + data[offset++] = v[t++]; + } + offset += ${remainder}; + } + + `); + } else { + const template = UBO_TO_SINGLE_SETTERS[uboElement.data.type]; + funcFragments.push(` + cv = ud.${name}.value; + v = uv.${name}; + offset = ${uboElement.offset / 4}; + ${template}; + `); + } + } + } + funcFragments.push(` + renderer.buffer.update(buffer); + `); + return { + size, + syncFunc: new Function("ud", "uv", "renderer", "syncData", "buffer", funcFragments.join("\n")) + }; + } + + let UID = 0; + const defaultSyncData = { textureCount: 0, uboCount: 0 }; + class ShaderSystem { + constructor(renderer) { + this.destroyed = false; + this.renderer = renderer; + this.systemCheck(); + this.gl = null; + this.shader = null; + this.program = null; + this.cache = {}; + this._uboCache = {}; + this.id = UID++; + } + systemCheck() { + if (!unsafeEvalSupported()) { + throw new Error("Current environment does not allow unsafe-eval, please use @pixi/unsafe-eval module to enable support."); + } + } + contextChange(gl) { + this.gl = gl; + this.reset(); + } + bind(shader, dontSync) { + shader.disposeRunner.add(this); + shader.uniforms.globals = this.renderer.globalUniforms; + const program = shader.program; + const glProgram = program.glPrograms[this.renderer.CONTEXT_UID] || this.generateProgram(shader); + this.shader = shader; + if (this.program !== program) { + this.program = program; + this.gl.useProgram(glProgram.program); + } + if (!dontSync) { + defaultSyncData.textureCount = 0; + defaultSyncData.uboCount = 0; + this.syncUniformGroup(shader.uniformGroup, defaultSyncData); + } + return glProgram; + } + setUniforms(uniforms) { + const shader = this.shader.program; + const glProgram = shader.glPrograms[this.renderer.CONTEXT_UID]; + shader.syncUniforms(glProgram.uniformData, uniforms, this.renderer); + } + syncUniformGroup(group, syncData) { + const glProgram = this.getGlProgram(); + if (!group.static || group.dirtyId !== glProgram.uniformDirtyGroups[group.id]) { + glProgram.uniformDirtyGroups[group.id] = group.dirtyId; + this.syncUniforms(group, glProgram, syncData); + } + } + syncUniforms(group, glProgram, syncData) { + const syncFunc = group.syncUniforms[this.shader.program.id] || this.createSyncGroups(group); + syncFunc(glProgram.uniformData, group.uniforms, this.renderer, syncData); + } + createSyncGroups(group) { + const id = this.getSignature(group, this.shader.program.uniformData, "u"); + if (!this.cache[id]) { + this.cache[id] = generateUniformsSync(group, this.shader.program.uniformData); + } + group.syncUniforms[this.shader.program.id] = this.cache[id]; + return group.syncUniforms[this.shader.program.id]; + } + syncUniformBufferGroup(group, name) { + const glProgram = this.getGlProgram(); + if (!group.static || group.dirtyId !== 0 || !glProgram.uniformGroups[group.id]) { + group.dirtyId = 0; + const syncFunc = glProgram.uniformGroups[group.id] || this.createSyncBufferGroup(group, glProgram, name); + group.buffer.update(); + syncFunc(glProgram.uniformData, group.uniforms, this.renderer, defaultSyncData, group.buffer); + } + this.renderer.buffer.bindBufferBase(group.buffer, glProgram.uniformBufferBindings[name]); + } + createSyncBufferGroup(group, glProgram, name) { + const { gl } = this.renderer; + this.renderer.buffer.bind(group.buffer); + const uniformBlockIndex = this.gl.getUniformBlockIndex(glProgram.program, name); + glProgram.uniformBufferBindings[name] = this.shader.uniformBindCount; + gl.uniformBlockBinding(glProgram.program, uniformBlockIndex, this.shader.uniformBindCount); + this.shader.uniformBindCount++; + const id = this.getSignature(group, this.shader.program.uniformData, "ubo"); + let uboData = this._uboCache[id]; + if (!uboData) { + uboData = this._uboCache[id] = generateUniformBufferSync(group, this.shader.program.uniformData); + } + if (group.autoManage) { + const data = new Float32Array(uboData.size / 4); + group.buffer.update(data); + } + glProgram.uniformGroups[group.id] = uboData.syncFunc; + return glProgram.uniformGroups[group.id]; + } + getSignature(group, uniformData, preFix) { + const uniforms = group.uniforms; + const strings = [`${preFix}-`]; + for (const i in uniforms) { + strings.push(i); + if (uniformData[i]) { + strings.push(uniformData[i].type); + } + } + return strings.join("-"); + } + getGlProgram() { + if (this.shader) { + return this.shader.program.glPrograms[this.renderer.CONTEXT_UID]; + } + return null; + } + generateProgram(shader) { + const gl = this.gl; + const program = shader.program; + const glProgram = generateProgram(gl, program); + program.glPrograms[this.renderer.CONTEXT_UID] = glProgram; + return glProgram; + } + reset() { + this.program = null; + this.shader = null; + } + disposeShader(shader) { + if (this.shader === shader) { + this.shader = null; + } + } + destroy() { + this.renderer = null; + this.destroyed = true; + } + } + ShaderSystem.extension = { + type: ExtensionType.RendererSystem, + name: "shader" + }; + extensions$1.add(ShaderSystem); + + class StartupSystem { + constructor(renderer) { + this.renderer = renderer; + } + run(options) { + const { renderer } = this; + renderer.runners.init.emit(renderer.options); + if (options.hello) { + console.log(`PixiJS ${"7.2.1"} - ${renderer.rendererLogId} - https://pixijs.com`); + } + renderer.resize(renderer.screen.width, renderer.screen.height); + } + destroy() { + } + } + StartupSystem.defaultOptions = { + hello: false + }; + StartupSystem.extension = { + type: [ + ExtensionType.RendererSystem, + ExtensionType.CanvasRendererSystem + ], + name: "startup" + }; + extensions$1.add(StartupSystem); + + function mapWebGLBlendModesToPixi(gl, array = []) { + array[BLEND_MODES.NORMAL] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.ADD] = [gl.ONE, gl.ONE]; + array[BLEND_MODES.MULTIPLY] = [gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.SCREEN] = [gl.ONE, gl.ONE_MINUS_SRC_COLOR, gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.OVERLAY] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.DARKEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.LIGHTEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.COLOR_DODGE] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.COLOR_BURN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.HARD_LIGHT] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.SOFT_LIGHT] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.DIFFERENCE] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.EXCLUSION] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.HUE] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.SATURATION] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.COLOR] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.LUMINOSITY] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.NONE] = [0, 0]; + array[BLEND_MODES.NORMAL_NPM] = [gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.ADD_NPM] = [gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE]; + array[BLEND_MODES.SCREEN_NPM] = [gl.SRC_ALPHA, gl.ONE_MINUS_SRC_COLOR, gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.SRC_IN] = [gl.DST_ALPHA, gl.ZERO]; + array[BLEND_MODES.SRC_OUT] = [gl.ONE_MINUS_DST_ALPHA, gl.ZERO]; + array[BLEND_MODES.SRC_ATOP] = [gl.DST_ALPHA, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.DST_OVER] = [gl.ONE_MINUS_DST_ALPHA, gl.ONE]; + array[BLEND_MODES.DST_IN] = [gl.ZERO, gl.SRC_ALPHA]; + array[BLEND_MODES.DST_OUT] = [gl.ZERO, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.DST_ATOP] = [gl.ONE_MINUS_DST_ALPHA, gl.SRC_ALPHA]; + array[BLEND_MODES.XOR] = [gl.ONE_MINUS_DST_ALPHA, gl.ONE_MINUS_SRC_ALPHA]; + array[BLEND_MODES.SUBTRACT] = [gl.ONE, gl.ONE, gl.ONE, gl.ONE, gl.FUNC_REVERSE_SUBTRACT, gl.FUNC_ADD]; + return array; + } + + const BLEND = 0; + const OFFSET = 1; + const CULLING = 2; + const DEPTH_TEST = 3; + const WINDING = 4; + const DEPTH_MASK = 5; + const _StateSystem = class { + constructor() { + this.gl = null; + this.stateId = 0; + this.polygonOffset = 0; + this.blendMode = BLEND_MODES.NONE; + this._blendEq = false; + this.map = []; + this.map[BLEND] = this.setBlend; + this.map[OFFSET] = this.setOffset; + this.map[CULLING] = this.setCullFace; + this.map[DEPTH_TEST] = this.setDepthTest; + this.map[WINDING] = this.setFrontFace; + this.map[DEPTH_MASK] = this.setDepthMask; + this.checks = []; + this.defaultState = new State(); + this.defaultState.blend = true; + } + contextChange(gl) { + this.gl = gl; + this.blendModes = mapWebGLBlendModesToPixi(gl); + this.set(this.defaultState); + this.reset(); + } + set(state) { + state = state || this.defaultState; + if (this.stateId !== state.data) { + let diff = this.stateId ^ state.data; + let i = 0; + while (diff) { + if (diff & 1) { + this.map[i].call(this, !!(state.data & 1 << i)); + } + diff = diff >> 1; + i++; + } + this.stateId = state.data; + } + for (let i = 0; i < this.checks.length; i++) { + this.checks[i](this, state); + } + } + forceState(state) { + state = state || this.defaultState; + for (let i = 0; i < this.map.length; i++) { + this.map[i].call(this, !!(state.data & 1 << i)); + } + for (let i = 0; i < this.checks.length; i++) { + this.checks[i](this, state); + } + this.stateId = state.data; + } + setBlend(value) { + this.updateCheck(_StateSystem.checkBlendMode, value); + this.gl[value ? "enable" : "disable"](this.gl.BLEND); + } + setOffset(value) { + this.updateCheck(_StateSystem.checkPolygonOffset, value); + this.gl[value ? "enable" : "disable"](this.gl.POLYGON_OFFSET_FILL); + } + setDepthTest(value) { + this.gl[value ? "enable" : "disable"](this.gl.DEPTH_TEST); + } + setDepthMask(value) { + this.gl.depthMask(value); + } + setCullFace(value) { + this.gl[value ? "enable" : "disable"](this.gl.CULL_FACE); + } + setFrontFace(value) { + this.gl.frontFace(this.gl[value ? "CW" : "CCW"]); + } + setBlendMode(value) { + if (value === this.blendMode) { + return; + } + this.blendMode = value; + const mode = this.blendModes[value]; + const gl = this.gl; + if (mode.length === 2) { + gl.blendFunc(mode[0], mode[1]); + } else { + gl.blendFuncSeparate(mode[0], mode[1], mode[2], mode[3]); + } + if (mode.length === 6) { + this._blendEq = true; + gl.blendEquationSeparate(mode[4], mode[5]); + } else if (this._blendEq) { + this._blendEq = false; + gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD); + } + } + setPolygonOffset(value, scale) { + this.gl.polygonOffset(value, scale); + } + reset() { + this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, false); + this.forceState(this.defaultState); + this._blendEq = true; + this.blendMode = -1; + this.setBlendMode(0); + } + updateCheck(func, value) { + const index = this.checks.indexOf(func); + if (value && index === -1) { + this.checks.push(func); + } else if (!value && index !== -1) { + this.checks.splice(index, 1); + } + } + static checkBlendMode(system, state) { + system.setBlendMode(state.blendMode); + } + static checkPolygonOffset(system, state) { + system.setPolygonOffset(1, state.polygonOffset); + } + destroy() { + this.gl = null; + } + }; + let StateSystem = _StateSystem; + StateSystem.extension = { + type: ExtensionType.RendererSystem, + name: "state" + }; + extensions$1.add(StateSystem); + + class SystemManager extends eventemitter3 { + constructor() { + super(...arguments); + this.runners = {}; + this._systemsHash = {}; + } + setup(config) { + this.addRunners(...config.runners); + const priority = (config.priority ?? []).filter((key) => config.systems[key]); + const orderByPriority = [ + ...priority, + ...Object.keys(config.systems).filter((key) => !priority.includes(key)) + ]; + for (const i of orderByPriority) { + this.addSystem(config.systems[i], i); + } + } + addRunners(...runnerIds) { + runnerIds.forEach((runnerId) => { + this.runners[runnerId] = new Runner(runnerId); + }); + } + addSystem(ClassRef, name) { + const system = new ClassRef(this); + if (this[name]) { + throw new Error(`Whoops! The name "${name}" is already in use`); + } + this[name] = system; + this._systemsHash[name] = system; + for (const i in this.runners) { + this.runners[i].add(system); + } + return this; + } + emitWithCustomOptions(runner, options) { + const systemHashKeys = Object.keys(this._systemsHash); + runner.items.forEach((system) => { + const systemName = systemHashKeys.find((systemId) => this._systemsHash[systemId] === system); + system[runner.name](options[systemName]); + }); + } + destroy() { + Object.values(this.runners).forEach((runner) => { + runner.destroy(); + }); + this._systemsHash = {}; + } + } + + const _TextureGCSystem = class { + constructor(renderer) { + this.renderer = renderer; + this.count = 0; + this.checkCount = 0; + this.maxIdle = _TextureGCSystem.defaultMaxIdle; + this.checkCountMax = _TextureGCSystem.defaultCheckCountMax; + this.mode = _TextureGCSystem.defaultMode; + } + postrender() { + if (!this.renderer.objectRenderer.renderingToScreen) { + return; + } + this.count++; + if (this.mode === GC_MODES.MANUAL) { + return; + } + this.checkCount++; + if (this.checkCount > this.checkCountMax) { + this.checkCount = 0; + this.run(); + } + } + run() { + const tm = this.renderer.texture; + const managedTextures = tm.managedTextures; + let wasRemoved = false; + for (let i = 0; i < managedTextures.length; i++) { + const texture = managedTextures[i]; + if (!texture.framebuffer && this.count - texture.touched > this.maxIdle) { + tm.destroyTexture(texture, true); + managedTextures[i] = null; + wasRemoved = true; + } + } + if (wasRemoved) { + let j = 0; + for (let i = 0; i < managedTextures.length; i++) { + if (managedTextures[i] !== null) { + managedTextures[j++] = managedTextures[i]; + } + } + managedTextures.length = j; + } + } + unload(displayObject) { + const tm = this.renderer.texture; + const texture = displayObject._texture; + if (texture && !texture.framebuffer) { + tm.destroyTexture(texture); + } + for (let i = displayObject.children.length - 1; i >= 0; i--) { + this.unload(displayObject.children[i]); + } + } + destroy() { + this.renderer = null; + } + }; + let TextureGCSystem = _TextureGCSystem; + TextureGCSystem.defaultMode = GC_MODES.AUTO; + TextureGCSystem.defaultMaxIdle = 60 * 60; + TextureGCSystem.defaultCheckCountMax = 60 * 10; + TextureGCSystem.extension = { + type: ExtensionType.RendererSystem, + name: "textureGC" + }; + extensions$1.add(TextureGCSystem); + + class GLTexture { + constructor(texture) { + this.texture = texture; + this.width = -1; + this.height = -1; + this.dirtyId = -1; + this.dirtyStyleId = -1; + this.mipmap = false; + this.wrapMode = 33071; + this.type = TYPES.UNSIGNED_BYTE; + this.internalFormat = FORMATS.RGBA; + this.samplerType = 0; + } + } + + function mapTypeAndFormatToInternalFormat(gl) { + let table; + if ("WebGL2RenderingContext" in globalThis && gl instanceof globalThis.WebGL2RenderingContext) { + table = { + [TYPES.UNSIGNED_BYTE]: { + [FORMATS.RGBA]: gl.RGBA8, + [FORMATS.RGB]: gl.RGB8, + [FORMATS.RG]: gl.RG8, + [FORMATS.RED]: gl.R8, + [FORMATS.RGBA_INTEGER]: gl.RGBA8UI, + [FORMATS.RGB_INTEGER]: gl.RGB8UI, + [FORMATS.RG_INTEGER]: gl.RG8UI, + [FORMATS.RED_INTEGER]: gl.R8UI, + [FORMATS.ALPHA]: gl.ALPHA, + [FORMATS.LUMINANCE]: gl.LUMINANCE, + [FORMATS.LUMINANCE_ALPHA]: gl.LUMINANCE_ALPHA + }, + [TYPES.BYTE]: { + [FORMATS.RGBA]: gl.RGBA8_SNORM, + [FORMATS.RGB]: gl.RGB8_SNORM, + [FORMATS.RG]: gl.RG8_SNORM, + [FORMATS.RED]: gl.R8_SNORM, + [FORMATS.RGBA_INTEGER]: gl.RGBA8I, + [FORMATS.RGB_INTEGER]: gl.RGB8I, + [FORMATS.RG_INTEGER]: gl.RG8I, + [FORMATS.RED_INTEGER]: gl.R8I + }, + [TYPES.UNSIGNED_SHORT]: { + [FORMATS.RGBA_INTEGER]: gl.RGBA16UI, + [FORMATS.RGB_INTEGER]: gl.RGB16UI, + [FORMATS.RG_INTEGER]: gl.RG16UI, + [FORMATS.RED_INTEGER]: gl.R16UI, + [FORMATS.DEPTH_COMPONENT]: gl.DEPTH_COMPONENT16 + }, + [TYPES.SHORT]: { + [FORMATS.RGBA_INTEGER]: gl.RGBA16I, + [FORMATS.RGB_INTEGER]: gl.RGB16I, + [FORMATS.RG_INTEGER]: gl.RG16I, + [FORMATS.RED_INTEGER]: gl.R16I + }, + [TYPES.UNSIGNED_INT]: { + [FORMATS.RGBA_INTEGER]: gl.RGBA32UI, + [FORMATS.RGB_INTEGER]: gl.RGB32UI, + [FORMATS.RG_INTEGER]: gl.RG32UI, + [FORMATS.RED_INTEGER]: gl.R32UI, + [FORMATS.DEPTH_COMPONENT]: gl.DEPTH_COMPONENT24 + }, + [TYPES.INT]: { + [FORMATS.RGBA_INTEGER]: gl.RGBA32I, + [FORMATS.RGB_INTEGER]: gl.RGB32I, + [FORMATS.RG_INTEGER]: gl.RG32I, + [FORMATS.RED_INTEGER]: gl.R32I + }, + [TYPES.FLOAT]: { + [FORMATS.RGBA]: gl.RGBA32F, + [FORMATS.RGB]: gl.RGB32F, + [FORMATS.RG]: gl.RG32F, + [FORMATS.RED]: gl.R32F, + [FORMATS.DEPTH_COMPONENT]: gl.DEPTH_COMPONENT32F + }, + [TYPES.HALF_FLOAT]: { + [FORMATS.RGBA]: gl.RGBA16F, + [FORMATS.RGB]: gl.RGB16F, + [FORMATS.RG]: gl.RG16F, + [FORMATS.RED]: gl.R16F + }, + [TYPES.UNSIGNED_SHORT_5_6_5]: { + [FORMATS.RGB]: gl.RGB565 + }, + [TYPES.UNSIGNED_SHORT_4_4_4_4]: { + [FORMATS.RGBA]: gl.RGBA4 + }, + [TYPES.UNSIGNED_SHORT_5_5_5_1]: { + [FORMATS.RGBA]: gl.RGB5_A1 + }, + [TYPES.UNSIGNED_INT_2_10_10_10_REV]: { + [FORMATS.RGBA]: gl.RGB10_A2, + [FORMATS.RGBA_INTEGER]: gl.RGB10_A2UI + }, + [TYPES.UNSIGNED_INT_10F_11F_11F_REV]: { + [FORMATS.RGB]: gl.R11F_G11F_B10F + }, + [TYPES.UNSIGNED_INT_5_9_9_9_REV]: { + [FORMATS.RGB]: gl.RGB9_E5 + }, + [TYPES.UNSIGNED_INT_24_8]: { + [FORMATS.DEPTH_STENCIL]: gl.DEPTH24_STENCIL8 + }, + [TYPES.FLOAT_32_UNSIGNED_INT_24_8_REV]: { + [FORMATS.DEPTH_STENCIL]: gl.DEPTH32F_STENCIL8 + } + }; + } else { + table = { + [TYPES.UNSIGNED_BYTE]: { + [FORMATS.RGBA]: gl.RGBA, + [FORMATS.RGB]: gl.RGB, + [FORMATS.ALPHA]: gl.ALPHA, + [FORMATS.LUMINANCE]: gl.LUMINANCE, + [FORMATS.LUMINANCE_ALPHA]: gl.LUMINANCE_ALPHA + }, + [TYPES.UNSIGNED_SHORT_5_6_5]: { + [FORMATS.RGB]: gl.RGB + }, + [TYPES.UNSIGNED_SHORT_4_4_4_4]: { + [FORMATS.RGBA]: gl.RGBA + }, + [TYPES.UNSIGNED_SHORT_5_5_5_1]: { + [FORMATS.RGBA]: gl.RGBA + } + }; + } + return table; + } + + class TextureSystem { + constructor(renderer) { + this.renderer = renderer; + this.boundTextures = []; + this.currentLocation = -1; + this.managedTextures = []; + this._unknownBoundTextures = false; + this.unknownTexture = new BaseTexture(); + this.hasIntegerTextures = false; + } + contextChange() { + const gl = this.gl = this.renderer.gl; + this.CONTEXT_UID = this.renderer.CONTEXT_UID; + this.webGLVersion = this.renderer.context.webGLVersion; + this.internalFormats = mapTypeAndFormatToInternalFormat(gl); + const maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); + this.boundTextures.length = maxTextures; + for (let i = 0; i < maxTextures; i++) { + this.boundTextures[i] = null; + } + this.emptyTextures = {}; + const emptyTexture2D = new GLTexture(gl.createTexture()); + gl.bindTexture(gl.TEXTURE_2D, emptyTexture2D.texture); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(4)); + this.emptyTextures[gl.TEXTURE_2D] = emptyTexture2D; + this.emptyTextures[gl.TEXTURE_CUBE_MAP] = new GLTexture(gl.createTexture()); + gl.bindTexture(gl.TEXTURE_CUBE_MAP, this.emptyTextures[gl.TEXTURE_CUBE_MAP].texture); + for (let i = 0; i < 6; i++) { + gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + } + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + for (let i = 0; i < this.boundTextures.length; i++) { + this.bind(null, i); + } + } + bind(texture, location = 0) { + const { gl } = this; + texture = texture?.castToBaseTexture(); + if (texture?.valid && !texture.parentTextureArray) { + texture.touched = this.renderer.textureGC.count; + const glTexture = texture._glTextures[this.CONTEXT_UID] || this.initTexture(texture); + if (this.boundTextures[location] !== texture) { + if (this.currentLocation !== location) { + this.currentLocation = location; + gl.activeTexture(gl.TEXTURE0 + location); + } + gl.bindTexture(texture.target, glTexture.texture); + } + if (glTexture.dirtyId !== texture.dirtyId) { + if (this.currentLocation !== location) { + this.currentLocation = location; + gl.activeTexture(gl.TEXTURE0 + location); + } + this.updateTexture(texture); + } else if (glTexture.dirtyStyleId !== texture.dirtyStyleId) { + this.updateTextureStyle(texture); + } + this.boundTextures[location] = texture; + } else { + if (this.currentLocation !== location) { + this.currentLocation = location; + gl.activeTexture(gl.TEXTURE0 + location); + } + gl.bindTexture(gl.TEXTURE_2D, this.emptyTextures[gl.TEXTURE_2D].texture); + this.boundTextures[location] = null; + } + } + reset() { + this._unknownBoundTextures = true; + this.hasIntegerTextures = false; + this.currentLocation = -1; + for (let i = 0; i < this.boundTextures.length; i++) { + this.boundTextures[i] = this.unknownTexture; + } + } + unbind(texture) { + const { gl, boundTextures } = this; + if (this._unknownBoundTextures) { + this._unknownBoundTextures = false; + for (let i = 0; i < boundTextures.length; i++) { + if (boundTextures[i] === this.unknownTexture) { + this.bind(null, i); + } + } + } + for (let i = 0; i < boundTextures.length; i++) { + if (boundTextures[i] === texture) { + if (this.currentLocation !== i) { + gl.activeTexture(gl.TEXTURE0 + i); + this.currentLocation = i; + } + gl.bindTexture(texture.target, this.emptyTextures[texture.target].texture); + boundTextures[i] = null; + } + } + } + ensureSamplerType(maxTextures) { + const { boundTextures, hasIntegerTextures, CONTEXT_UID } = this; + if (!hasIntegerTextures) { + return; + } + for (let i = maxTextures - 1; i >= 0; --i) { + const tex = boundTextures[i]; + if (tex) { + const glTexture = tex._glTextures[CONTEXT_UID]; + if (glTexture.samplerType !== SAMPLER_TYPES.FLOAT) { + this.renderer.texture.unbind(tex); + } + } + } + } + initTexture(texture) { + const glTexture = new GLTexture(this.gl.createTexture()); + glTexture.dirtyId = -1; + texture._glTextures[this.CONTEXT_UID] = glTexture; + this.managedTextures.push(texture); + texture.on("dispose", this.destroyTexture, this); + return glTexture; + } + initTextureType(texture, glTexture) { + glTexture.internalFormat = this.internalFormats[texture.type]?.[texture.format] ?? texture.format; + if (this.webGLVersion === 2 && texture.type === TYPES.HALF_FLOAT) { + glTexture.type = this.gl.HALF_FLOAT; + } else { + glTexture.type = texture.type; + } + } + updateTexture(texture) { + const glTexture = texture._glTextures[this.CONTEXT_UID]; + if (!glTexture) { + return; + } + const renderer = this.renderer; + this.initTextureType(texture, glTexture); + if (texture.resource?.upload(renderer, texture, glTexture)) { + if (glTexture.samplerType !== SAMPLER_TYPES.FLOAT) { + this.hasIntegerTextures = true; + } + } else { + const width = texture.realWidth; + const height = texture.realHeight; + const gl = renderer.gl; + if (glTexture.width !== width || glTexture.height !== height || glTexture.dirtyId < 0) { + glTexture.width = width; + glTexture.height = height; + gl.texImage2D(texture.target, 0, glTexture.internalFormat, width, height, 0, texture.format, glTexture.type, null); + } + } + if (texture.dirtyStyleId !== glTexture.dirtyStyleId) { + this.updateTextureStyle(texture); + } + glTexture.dirtyId = texture.dirtyId; + } + destroyTexture(texture, skipRemove) { + const { gl } = this; + texture = texture.castToBaseTexture(); + if (texture._glTextures[this.CONTEXT_UID]) { + this.unbind(texture); + gl.deleteTexture(texture._glTextures[this.CONTEXT_UID].texture); + texture.off("dispose", this.destroyTexture, this); + delete texture._glTextures[this.CONTEXT_UID]; + if (!skipRemove) { + const i = this.managedTextures.indexOf(texture); + if (i !== -1) { + removeItems(this.managedTextures, i, 1); + } + } + } + } + updateTextureStyle(texture) { + const glTexture = texture._glTextures[this.CONTEXT_UID]; + if (!glTexture) { + return; + } + if ((texture.mipmap === MIPMAP_MODES.POW2 || this.webGLVersion !== 2) && !texture.isPowerOfTwo) { + glTexture.mipmap = false; + } else { + glTexture.mipmap = texture.mipmap >= 1; + } + if (this.webGLVersion !== 2 && !texture.isPowerOfTwo) { + glTexture.wrapMode = WRAP_MODES.CLAMP; + } else { + glTexture.wrapMode = texture.wrapMode; + } + if (texture.resource?.style(this.renderer, texture, glTexture)) { + } else { + this.setStyle(texture, glTexture); + } + glTexture.dirtyStyleId = texture.dirtyStyleId; + } + setStyle(texture, glTexture) { + const gl = this.gl; + if (glTexture.mipmap && texture.mipmap !== MIPMAP_MODES.ON_MANUAL) { + gl.generateMipmap(texture.target); + } + gl.texParameteri(texture.target, gl.TEXTURE_WRAP_S, glTexture.wrapMode); + gl.texParameteri(texture.target, gl.TEXTURE_WRAP_T, glTexture.wrapMode); + if (glTexture.mipmap) { + gl.texParameteri(texture.target, gl.TEXTURE_MIN_FILTER, texture.scaleMode === SCALE_MODES.LINEAR ? gl.LINEAR_MIPMAP_LINEAR : gl.NEAREST_MIPMAP_NEAREST); + const anisotropicExt = this.renderer.context.extensions.anisotropicFiltering; + if (anisotropicExt && texture.anisotropicLevel > 0 && texture.scaleMode === SCALE_MODES.LINEAR) { + const level = Math.min(texture.anisotropicLevel, gl.getParameter(anisotropicExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT)); + gl.texParameterf(texture.target, anisotropicExt.TEXTURE_MAX_ANISOTROPY_EXT, level); + } + } else { + gl.texParameteri(texture.target, gl.TEXTURE_MIN_FILTER, texture.scaleMode === SCALE_MODES.LINEAR ? gl.LINEAR : gl.NEAREST); + } + gl.texParameteri(texture.target, gl.TEXTURE_MAG_FILTER, texture.scaleMode === SCALE_MODES.LINEAR ? gl.LINEAR : gl.NEAREST); + } + destroy() { + this.renderer = null; + } + } + TextureSystem.extension = { + type: ExtensionType.RendererSystem, + name: "texture" + }; + extensions$1.add(TextureSystem); + + class TransformFeedbackSystem { + constructor(renderer) { + this.renderer = renderer; + } + contextChange() { + this.gl = this.renderer.gl; + this.CONTEXT_UID = this.renderer.CONTEXT_UID; + } + bind(transformFeedback) { + const { gl, CONTEXT_UID } = this; + const glTransformFeedback = transformFeedback._glTransformFeedbacks[CONTEXT_UID] || this.createGLTransformFeedback(transformFeedback); + gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, glTransformFeedback); + } + unbind() { + const { gl } = this; + gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null); + } + beginTransformFeedback(drawMode, shader) { + const { gl, renderer } = this; + if (shader) { + renderer.shader.bind(shader); + } + gl.beginTransformFeedback(drawMode); + } + endTransformFeedback() { + const { gl } = this; + gl.endTransformFeedback(); + } + createGLTransformFeedback(tf) { + const { gl, renderer, CONTEXT_UID } = this; + const glTransformFeedback = gl.createTransformFeedback(); + tf._glTransformFeedbacks[CONTEXT_UID] = glTransformFeedback; + gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, glTransformFeedback); + for (let i = 0; i < tf.buffers.length; i++) { + const buffer = tf.buffers[i]; + if (!buffer) + continue; + renderer.buffer.update(buffer); + buffer._glBuffers[CONTEXT_UID].refCount++; + gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, i, buffer._glBuffers[CONTEXT_UID].buffer || null); + } + gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null); + tf.disposeRunner.add(this); + return glTransformFeedback; + } + disposeTransformFeedback(tf, contextLost) { + const glTF = tf._glTransformFeedbacks[this.CONTEXT_UID]; + const gl = this.gl; + tf.disposeRunner.remove(this); + const bufferSystem = this.renderer.buffer; + if (bufferSystem) { + for (let i = 0; i < tf.buffers.length; i++) { + const buffer = tf.buffers[i]; + if (!buffer) + continue; + const buf = buffer._glBuffers[this.CONTEXT_UID]; + if (buf) { + buf.refCount--; + if (buf.refCount === 0 && !contextLost) { + bufferSystem.dispose(buffer, contextLost); + } + } + } + } + if (!glTF) { + return; + } + if (!contextLost) { + gl.deleteTransformFeedback(glTF); + } + delete tf._glTransformFeedbacks[this.CONTEXT_UID]; + } + destroy() { + this.renderer = null; + } + } + TransformFeedbackSystem.extension = { + type: ExtensionType.RendererSystem, + name: "transformFeedback" + }; + extensions$1.add(TransformFeedbackSystem); + + class ViewSystem { + constructor(renderer) { + this.renderer = renderer; + } + init(options) { + this.screen = new Rectangle(0, 0, options.width, options.height); + this.element = options.view || settings.ADAPTER.createCanvas(); + this.resolution = options.resolution || settings.RESOLUTION; + this.autoDensity = !!options.autoDensity; + } + resizeView(desiredScreenWidth, desiredScreenHeight) { + this.element.width = Math.round(desiredScreenWidth * this.resolution); + this.element.height = Math.round(desiredScreenHeight * this.resolution); + const screenWidth = this.element.width / this.resolution; + const screenHeight = this.element.height / this.resolution; + this.screen.width = screenWidth; + this.screen.height = screenHeight; + if (this.autoDensity) { + this.element.style.width = `${screenWidth}px`; + this.element.style.height = `${screenHeight}px`; + } + this.renderer.emit("resize", screenWidth, screenHeight); + this.renderer.runners.resize.emit(this.screen.width, this.screen.height); + } + destroy(removeView) { + if (removeView) { + this.element.parentNode?.removeChild(this.element); + } + this.renderer = null; + this.element = null; + this.screen = null; + } + } + ViewSystem.defaultOptions = { + width: 800, + height: 600, + resolution: settings.RESOLUTION, + autoDensity: false + }; + ViewSystem.extension = { + type: [ + ExtensionType.RendererSystem, + ExtensionType.CanvasRendererSystem + ], + name: "_view" + }; + extensions$1.add(ViewSystem); + + settings.PREFER_ENV = ENV.WEBGL2; + settings.STRICT_TEXTURE_CACHE = false; + settings.RENDER_OPTIONS = { + ...ContextSystem.defaultOptions, + ...BackgroundSystem.defaultOptions, + ...ViewSystem.defaultOptions, + ...StartupSystem.defaultOptions + }; + Object.defineProperties(settings, { + WRAP_MODE: { + get() { + return BaseTexture.defaultOptions.wrapMode; + }, + set(value) { + deprecation("7.1.0", "settings.WRAP_MODE is deprecated, use BaseTexture.defaultOptions.wrapMode"); + BaseTexture.defaultOptions.wrapMode = value; + } + }, + SCALE_MODE: { + get() { + return BaseTexture.defaultOptions.scaleMode; + }, + set(value) { + deprecation("7.1.0", "settings.SCALE_MODE is deprecated, use BaseTexture.defaultOptions.scaleMode"); + BaseTexture.defaultOptions.scaleMode = value; + } + }, + MIPMAP_TEXTURES: { + get() { + return BaseTexture.defaultOptions.mipmap; + }, + set(value) { + deprecation("7.1.0", "settings.MIPMAP_TEXTURES is deprecated, use BaseTexture.defaultOptions.mipmap"); + BaseTexture.defaultOptions.mipmap = value; + } + }, + ANISOTROPIC_LEVEL: { + get() { + return BaseTexture.defaultOptions.anisotropicLevel; + }, + set(value) { + deprecation("7.1.0", "settings.ANISOTROPIC_LEVEL is deprecated, use BaseTexture.defaultOptions.anisotropicLevel"); + BaseTexture.defaultOptions.anisotropicLevel = value; + } + }, + FILTER_RESOLUTION: { + get() { + deprecation("7.1.0", "settings.FILTER_RESOLUTION is deprecated, use Filter.defaultResolution"); + return Filter.defaultResolution; + }, + set(value) { + Filter.defaultResolution = value; + } + }, + FILTER_MULTISAMPLE: { + get() { + deprecation("7.1.0", "settings.FILTER_MULTISAMPLE is deprecated, use Filter.defaultMultisample"); + return Filter.defaultMultisample; + }, + set(value) { + Filter.defaultMultisample = value; + } + }, + SPRITE_MAX_TEXTURES: { + get() { + return BatchRenderer.defaultMaxTextures; + }, + set(value) { + deprecation("7.1.0", "settings.SPRITE_MAX_TEXTURES is deprecated, use BatchRenderer.defaultMaxTextures"); + BatchRenderer.defaultMaxTextures = value; + } + }, + SPRITE_BATCH_SIZE: { + get() { + return BatchRenderer.defaultBatchSize; + }, + set(value) { + deprecation("7.1.0", "settings.SPRITE_BATCH_SIZE is deprecated, use BatchRenderer.defaultBatchSize"); + BatchRenderer.defaultBatchSize = value; + } + }, + CAN_UPLOAD_SAME_BUFFER: { + get() { + return BatchRenderer.canUploadSameBuffer; + }, + set(value) { + deprecation("7.1.0", "settings.CAN_UPLOAD_SAME_BUFFER is deprecated, use BatchRenderer.canUploadSameBuffer"); + BatchRenderer.canUploadSameBuffer = value; + } + }, + GC_MODE: { + get() { + return TextureGCSystem.defaultMode; + }, + set(value) { + deprecation("7.1.0", "settings.GC_MODE is deprecated, use TextureGCSystem.defaultMode"); + TextureGCSystem.defaultMode = value; + } + }, + GC_MAX_IDLE: { + get() { + return TextureGCSystem.defaultMaxIdle; + }, + set(value) { + deprecation("7.1.0", "settings.GC_MAX_IDLE is deprecated, use TextureGCSystem.defaultMaxIdle"); + TextureGCSystem.defaultMaxIdle = value; + } + }, + GC_MAX_CHECK_COUNT: { + get() { + return TextureGCSystem.defaultCheckCountMax; + }, + set(value) { + deprecation("7.1.0", "settings.GC_MAX_CHECK_COUNT is deprecated, use TextureGCSystem.defaultCheckCountMax"); + TextureGCSystem.defaultCheckCountMax = value; + } + }, + PRECISION_VERTEX: { + get() { + return Program.defaultVertexPrecision; + }, + set(value) { + deprecation("7.1.0", "settings.PRECISION_VERTEX is deprecated, use Program.defaultVertexPrecision"); + Program.defaultVertexPrecision = value; + } + }, + PRECISION_FRAGMENT: { + get() { + return Program.defaultFragmentPrecision; + }, + set(value) { + deprecation("7.1.0", "settings.PRECISION_FRAGMENT is deprecated, use Program.defaultFragmentPrecision"); + Program.defaultFragmentPrecision = value; + } + } + }); + + var UPDATE_PRIORITY = /* @__PURE__ */ ((UPDATE_PRIORITY2) => { + UPDATE_PRIORITY2[UPDATE_PRIORITY2["INTERACTION"] = 50] = "INTERACTION"; + UPDATE_PRIORITY2[UPDATE_PRIORITY2["HIGH"] = 25] = "HIGH"; + UPDATE_PRIORITY2[UPDATE_PRIORITY2["NORMAL"] = 0] = "NORMAL"; + UPDATE_PRIORITY2[UPDATE_PRIORITY2["LOW"] = -25] = "LOW"; + UPDATE_PRIORITY2[UPDATE_PRIORITY2["UTILITY"] = -50] = "UTILITY"; + return UPDATE_PRIORITY2; + })(UPDATE_PRIORITY || {}); + + class TickerListener { + constructor(fn, context = null, priority = 0, once = false) { + this.next = null; + this.previous = null; + this._destroyed = false; + this.fn = fn; + this.context = context; + this.priority = priority; + this.once = once; + } + match(fn, context = null) { + return this.fn === fn && this.context === context; + } + emit(deltaTime) { + if (this.fn) { + if (this.context) { + this.fn.call(this.context, deltaTime); + } else { + this.fn(deltaTime); + } + } + const redirect = this.next; + if (this.once) { + this.destroy(true); + } + if (this._destroyed) { + this.next = null; + } + return redirect; + } + connect(previous) { + this.previous = previous; + if (previous.next) { + previous.next.previous = this; + } + this.next = previous.next; + previous.next = this; + } + destroy(hard = false) { + this._destroyed = true; + this.fn = null; + this.context = null; + if (this.previous) { + this.previous.next = this.next; + } + if (this.next) { + this.next.previous = this.previous; + } + const redirect = this.next; + this.next = hard ? null : redirect; + this.previous = null; + return redirect; + } + } + + const _Ticker = class { + constructor() { + this.autoStart = false; + this.deltaTime = 1; + this.lastTime = -1; + this.speed = 1; + this.started = false; + this._requestId = null; + this._maxElapsedMS = 100; + this._minElapsedMS = 0; + this._protected = false; + this._lastFrame = -1; + this._head = new TickerListener(null, null, Infinity); + this.deltaMS = 1 / _Ticker.targetFPMS; + this.elapsedMS = 1 / _Ticker.targetFPMS; + this._tick = (time) => { + this._requestId = null; + if (this.started) { + this.update(time); + if (this.started && this._requestId === null && this._head.next) { + this._requestId = requestAnimationFrame(this._tick); + } + } + }; + } + _requestIfNeeded() { + if (this._requestId === null && this._head.next) { + this.lastTime = performance.now(); + this._lastFrame = this.lastTime; + this._requestId = requestAnimationFrame(this._tick); + } + } + _cancelIfNeeded() { + if (this._requestId !== null) { + cancelAnimationFrame(this._requestId); + this._requestId = null; + } + } + _startIfPossible() { + if (this.started) { + this._requestIfNeeded(); + } else if (this.autoStart) { + this.start(); + } + } + add(fn, context, priority = UPDATE_PRIORITY.NORMAL) { + return this._addListener(new TickerListener(fn, context, priority)); + } + addOnce(fn, context, priority = UPDATE_PRIORITY.NORMAL) { + return this._addListener(new TickerListener(fn, context, priority, true)); + } + _addListener(listener) { + let current = this._head.next; + let previous = this._head; + if (!current) { + listener.connect(previous); + } else { + while (current) { + if (listener.priority > current.priority) { + listener.connect(previous); + break; + } + previous = current; + current = current.next; + } + if (!listener.previous) { + listener.connect(previous); + } + } + this._startIfPossible(); + return this; + } + remove(fn, context) { + let listener = this._head.next; + while (listener) { + if (listener.match(fn, context)) { + listener = listener.destroy(); + } else { + listener = listener.next; + } + } + if (!this._head.next) { + this._cancelIfNeeded(); + } + return this; + } + get count() { + if (!this._head) { + return 0; + } + let count = 0; + let current = this._head; + while (current = current.next) { + count++; + } + return count; + } + start() { + if (!this.started) { + this.started = true; + this._requestIfNeeded(); + } + } + stop() { + if (this.started) { + this.started = false; + this._cancelIfNeeded(); + } + } + destroy() { + if (!this._protected) { + this.stop(); + let listener = this._head.next; + while (listener) { + listener = listener.destroy(true); + } + this._head.destroy(); + this._head = null; + } + } + update(currentTime = performance.now()) { + let elapsedMS; + if (currentTime > this.lastTime) { + elapsedMS = this.elapsedMS = currentTime - this.lastTime; + if (elapsedMS > this._maxElapsedMS) { + elapsedMS = this._maxElapsedMS; + } + elapsedMS *= this.speed; + if (this._minElapsedMS) { + const delta = currentTime - this._lastFrame | 0; + if (delta < this._minElapsedMS) { + return; + } + this._lastFrame = currentTime - delta % this._minElapsedMS; + } + this.deltaMS = elapsedMS; + this.deltaTime = this.deltaMS * _Ticker.targetFPMS; + const head = this._head; + let listener = head.next; + while (listener) { + listener = listener.emit(this.deltaTime); + } + if (!head.next) { + this._cancelIfNeeded(); + } + } else { + this.deltaTime = this.deltaMS = this.elapsedMS = 0; + } + this.lastTime = currentTime; + } + get FPS() { + return 1e3 / this.elapsedMS; + } + get minFPS() { + return 1e3 / this._maxElapsedMS; + } + set minFPS(fps) { + const minFPS = Math.min(this.maxFPS, fps); + const minFPMS = Math.min(Math.max(0, minFPS) / 1e3, _Ticker.targetFPMS); + this._maxElapsedMS = 1 / minFPMS; + } + get maxFPS() { + if (this._minElapsedMS) { + return Math.round(1e3 / this._minElapsedMS); + } + return 0; + } + set maxFPS(fps) { + if (fps === 0) { + this._minElapsedMS = 0; + } else { + const maxFPS = Math.max(this.minFPS, fps); + this._minElapsedMS = 1 / (maxFPS / 1e3); + } + } + static get shared() { + if (!_Ticker._shared) { + const shared = _Ticker._shared = new _Ticker(); + shared.autoStart = true; + shared._protected = true; + } + return _Ticker._shared; + } + static get system() { + if (!_Ticker._system) { + const system = _Ticker._system = new _Ticker(); + system.autoStart = true; + system._protected = true; + } + return _Ticker._system; + } + }; + let Ticker = _Ticker; + Ticker.targetFPMS = 0.06; + + Object.defineProperties(settings, { + TARGET_FPMS: { + get() { + return Ticker.targetFPMS; + }, + set(value) { + deprecation("7.1.0", "settings.TARGET_FPMS is deprecated, use Ticker.targetFPMS"); + Ticker.targetFPMS = value; + } + } + }); + + class TickerPlugin { + static init(options) { + options = Object.assign({ + autoStart: true, + sharedTicker: false + }, options); + Object.defineProperty(this, "ticker", { + set(ticker) { + if (this._ticker) { + this._ticker.remove(this.render, this); + } + this._ticker = ticker; + if (ticker) { + ticker.add(this.render, this, UPDATE_PRIORITY.LOW); + } + }, + get() { + return this._ticker; + } + }); + this.stop = () => { + this._ticker.stop(); + }; + this.start = () => { + this._ticker.start(); + }; + this._ticker = null; + this.ticker = options.sharedTicker ? Ticker.shared : new Ticker(); + if (options.autoStart) { + this.start(); + } + } + static destroy() { + if (this._ticker) { + const oldTicker = this._ticker; + this.ticker = null; + oldTicker.destroy(); + } + } + } + TickerPlugin.extension = ExtensionType.Application; + extensions$1.add(TickerPlugin); + + const renderers = []; + extensions$1.handleByList(ExtensionType.Renderer, renderers); + function autoDetectRenderer(options) { + for (const RendererType of renderers) { + if (RendererType.test(options)) { + return new RendererType(options); + } + } + throw new Error("Unable to auto-detect a suitable renderer."); + } + + var $defaultVertex = "attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}"; + + var $defaultFilterVertex = "attribute vec2 aVertexPosition;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nuniform vec4 inputSize;\nuniform vec4 outputFrame;\n\nvec4 filterVertexPosition( void )\n{\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\n\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord( void )\n{\n return aVertexPosition * (outputFrame.zw * inputSize.zw);\n}\n\nvoid main(void)\n{\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n"; + + const defaultVertex = $defaultVertex; + const defaultFilterVertex = $defaultFilterVertex; + + class MultisampleSystem { + constructor(renderer) { + this.renderer = renderer; + } + contextChange(gl) { + let samples; + if (this.renderer.context.webGLVersion === 1) { + const framebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + samples = gl.getParameter(gl.SAMPLES); + gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); + } else { + const framebuffer = gl.getParameter(gl.DRAW_FRAMEBUFFER_BINDING); + gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null); + samples = gl.getParameter(gl.SAMPLES); + gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, framebuffer); + } + if (samples >= MSAA_QUALITY.HIGH) { + this.multisample = MSAA_QUALITY.HIGH; + } else if (samples >= MSAA_QUALITY.MEDIUM) { + this.multisample = MSAA_QUALITY.MEDIUM; + } else if (samples >= MSAA_QUALITY.LOW) { + this.multisample = MSAA_QUALITY.LOW; + } else { + this.multisample = MSAA_QUALITY.NONE; + } + } + destroy() { + } + } + MultisampleSystem.extension = { + type: ExtensionType.RendererSystem, + name: "_multisample" + }; + extensions$1.add(MultisampleSystem); + + class GLBuffer { + constructor(buffer) { + this.buffer = buffer || null; + this.updateID = -1; + this.byteLength = -1; + this.refCount = 0; + } + } + + class BufferSystem { + constructor(renderer) { + this.renderer = renderer; + this.managedBuffers = {}; + this.boundBufferBases = {}; + } + destroy() { + this.renderer = null; + } + contextChange() { + this.disposeAll(true); + this.gl = this.renderer.gl; + this.CONTEXT_UID = this.renderer.CONTEXT_UID; + } + bind(buffer) { + const { gl, CONTEXT_UID } = this; + const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer); + gl.bindBuffer(buffer.type, glBuffer.buffer); + } + unbind(type) { + const { gl } = this; + gl.bindBuffer(type, null); + } + bindBufferBase(buffer, index) { + const { gl, CONTEXT_UID } = this; + if (this.boundBufferBases[index] !== buffer) { + const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer); + this.boundBufferBases[index] = buffer; + gl.bindBufferBase(gl.UNIFORM_BUFFER, index, glBuffer.buffer); + } + } + bindBufferRange(buffer, index, offset) { + const { gl, CONTEXT_UID } = this; + offset = offset || 0; + const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer); + gl.bindBufferRange(gl.UNIFORM_BUFFER, index || 0, glBuffer.buffer, offset * 256, 256); + } + update(buffer) { + const { gl, CONTEXT_UID } = this; + const glBuffer = buffer._glBuffers[CONTEXT_UID] || this.createGLBuffer(buffer); + if (buffer._updateID === glBuffer.updateID) { + return; + } + glBuffer.updateID = buffer._updateID; + gl.bindBuffer(buffer.type, glBuffer.buffer); + if (glBuffer.byteLength >= buffer.data.byteLength) { + gl.bufferSubData(buffer.type, 0, buffer.data); + } else { + const drawType = buffer.static ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW; + glBuffer.byteLength = buffer.data.byteLength; + gl.bufferData(buffer.type, buffer.data, drawType); + } + } + dispose(buffer, contextLost) { + if (!this.managedBuffers[buffer.id]) { + return; + } + delete this.managedBuffers[buffer.id]; + const glBuffer = buffer._glBuffers[this.CONTEXT_UID]; + const gl = this.gl; + buffer.disposeRunner.remove(this); + if (!glBuffer) { + return; + } + if (!contextLost) { + gl.deleteBuffer(glBuffer.buffer); + } + delete buffer._glBuffers[this.CONTEXT_UID]; + } + disposeAll(contextLost) { + const all = Object.keys(this.managedBuffers); + for (let i = 0; i < all.length; i++) { + this.dispose(this.managedBuffers[all[i]], contextLost); + } + } + createGLBuffer(buffer) { + const { CONTEXT_UID, gl } = this; + buffer._glBuffers[CONTEXT_UID] = new GLBuffer(gl.createBuffer()); + this.managedBuffers[buffer.id] = buffer; + buffer.disposeRunner.add(this); + return buffer._glBuffers[CONTEXT_UID]; + } + } + BufferSystem.extension = { + type: ExtensionType.RendererSystem, + name: "buffer" + }; + extensions$1.add(BufferSystem); + + class ObjectRendererSystem { + constructor(renderer) { + this.renderer = renderer; + } + render(displayObject, options) { + const renderer = this.renderer; + let renderTexture; + let clear; + let transform; + let skipUpdateTransform; + if (options) { + renderTexture = options.renderTexture; + clear = options.clear; + transform = options.transform; + skipUpdateTransform = options.skipUpdateTransform; + } + this.renderingToScreen = !renderTexture; + renderer.runners.prerender.emit(); + renderer.emit("prerender"); + renderer.projection.transform = transform; + if (renderer.context.isLost) { + return; + } + if (!renderTexture) { + this.lastObjectRendered = displayObject; + } + if (!skipUpdateTransform) { + const cacheParent = displayObject.enableTempParent(); + displayObject.updateTransform(); + displayObject.disableTempParent(cacheParent); + } + renderer.renderTexture.bind(renderTexture); + renderer.batch.currentRenderer.start(); + if (clear ?? renderer.background.clearBeforeRender) { + renderer.renderTexture.clear(); + } + displayObject.render(renderer); + renderer.batch.currentRenderer.flush(); + if (renderTexture) { + if (options.blit) { + renderer.framebuffer.blit(); + } + renderTexture.baseTexture.update(); + } + renderer.runners.postrender.emit(); + renderer.projection.transform = null; + renderer.emit("postrender"); + } + destroy() { + this.renderer = null; + this.lastObjectRendered = null; + } + } + ObjectRendererSystem.extension = { + type: ExtensionType.RendererSystem, + name: "objectRenderer" + }; + extensions$1.add(ObjectRendererSystem); + + const _Renderer = class extends SystemManager { + constructor(options) { + super(); + this.type = RENDERER_TYPE.WEBGL; + options = Object.assign({}, settings.RENDER_OPTIONS, options); + this.gl = null; + this.CONTEXT_UID = 0; + this.globalUniforms = new UniformGroup({ + projectionMatrix: new Matrix() + }, true); + const systemConfig = { + runners: [ + "init", + "destroy", + "contextChange", + "resolutionChange", + "reset", + "update", + "postrender", + "prerender", + "resize" + ], + systems: _Renderer.__systems, + priority: [ + "_view", + "textureGenerator", + "background", + "_plugin", + "startup", + "context", + "state", + "texture", + "buffer", + "geometry", + "framebuffer", + "transformFeedback", + "mask", + "scissor", + "stencil", + "projection", + "textureGC", + "filter", + "renderTexture", + "batch", + "objectRenderer", + "_multisample" + ] + }; + this.setup(systemConfig); + if ("useContextAlpha" in options) { + deprecation("7.0.0", "options.useContextAlpha is deprecated, use options.premultipliedAlpha and options.backgroundAlpha instead"); + options.premultipliedAlpha = options.useContextAlpha && options.useContextAlpha !== "notMultiplied"; + options.backgroundAlpha = options.useContextAlpha === false ? 1 : options.backgroundAlpha; + } + this._plugin.rendererPlugins = _Renderer.__plugins; + this.options = options; + this.startup.run(this.options); + } + static test(options) { + if (options?.forceCanvas) { + return false; + } + return isWebGLSupported(); + } + render(displayObject, options) { + this.objectRenderer.render(displayObject, options); + } + resize(desiredScreenWidth, desiredScreenHeight) { + this._view.resizeView(desiredScreenWidth, desiredScreenHeight); + } + reset() { + this.runners.reset.emit(); + return this; + } + clear() { + this.renderTexture.bind(); + this.renderTexture.clear(); + } + destroy(removeView = false) { + this.runners.destroy.items.reverse(); + this.emitWithCustomOptions(this.runners.destroy, { + _view: removeView + }); + super.destroy(); + } + get plugins() { + return this._plugin.plugins; + } + get multisample() { + return this._multisample.multisample; + } + get width() { + return this._view.element.width; + } + get height() { + return this._view.element.height; + } + get resolution() { + return this._view.resolution; + } + set resolution(value) { + this._view.resolution = value; + this.runners.resolutionChange.emit(value); + } + get autoDensity() { + return this._view.autoDensity; + } + get view() { + return this._view.element; + } + get screen() { + return this._view.screen; + } + get lastObjectRendered() { + return this.objectRenderer.lastObjectRendered; + } + get renderingToScreen() { + return this.objectRenderer.renderingToScreen; + } + get rendererLogId() { + return `WebGL ${this.context.webGLVersion}`; + } + get clearBeforeRender() { + deprecation("7.0.0", "renderer.clearBeforeRender has been deprecated, please use renderer.background.clearBeforeRender instead."); + return this.background.clearBeforeRender; + } + get useContextAlpha() { + deprecation("7.0.0", "renderer.useContextAlpha has been deprecated, please use renderer.context.premultipliedAlpha instead."); + return this.context.useContextAlpha; + } + get preserveDrawingBuffer() { + deprecation("7.0.0", "renderer.preserveDrawingBuffer has been deprecated, we cannot truly know this unless pixi created the context"); + return this.context.preserveDrawingBuffer; + } + get backgroundColor() { + deprecation("7.0.0", "renderer.backgroundColor has been deprecated, use renderer.background.color instead."); + return this.background.color; + } + set backgroundColor(value) { + deprecation("7.0.0", "renderer.backgroundColor has been deprecated, use renderer.background.color instead."); + this.background.color = value; + } + get backgroundAlpha() { + deprecation("7.0.0", "renderer.backgroundAlpha has been deprecated, use renderer.background.alpha instead."); + return this.background.alpha; + } + set backgroundAlpha(value) { + deprecation("7.0.0", "renderer.backgroundAlpha has been deprecated, use renderer.background.alpha instead."); + this.background.alpha = value; + } + get powerPreference() { + deprecation("7.0.0", "renderer.powerPreference has been deprecated, we can only know this if pixi creates the context"); + return this.context.powerPreference; + } + generateTexture(displayObject, options) { + return this.textureGenerator.generateTexture(displayObject, options); + } + }; + let Renderer = _Renderer; + Renderer.extension = { + type: ExtensionType.Renderer, + priority: 1 + }; + Renderer.__plugins = {}; + Renderer.__systems = {}; + extensions$1.handleByMap(ExtensionType.RendererPlugin, Renderer.__plugins); + extensions$1.handleByMap(ExtensionType.RendererSystem, Renderer.__systems); + extensions$1.add(Renderer); + + class AbstractMultiResource extends Resource { + constructor(length, options) { + const { width, height } = options || {}; + super(width, height); + this.items = []; + this.itemDirtyIds = []; + for (let i = 0; i < length; i++) { + const partTexture = new BaseTexture(); + this.items.push(partTexture); + this.itemDirtyIds.push(-2); + } + this.length = length; + this._load = null; + this.baseTexture = null; + } + initFromArray(resources, options) { + for (let i = 0; i < this.length; i++) { + if (!resources[i]) { + continue; + } + if (resources[i].castToBaseTexture) { + this.addBaseTextureAt(resources[i].castToBaseTexture(), i); + } else if (resources[i] instanceof Resource) { + this.addResourceAt(resources[i], i); + } else { + this.addResourceAt(autoDetectResource(resources[i], options), i); + } + } + } + dispose() { + for (let i = 0, len = this.length; i < len; i++) { + this.items[i].destroy(); + } + this.items = null; + this.itemDirtyIds = null; + this._load = null; + } + addResourceAt(resource, index) { + if (!this.items[index]) { + throw new Error(`Index ${index} is out of bounds`); + } + if (resource.valid && !this.valid) { + this.resize(resource.width, resource.height); + } + this.items[index].setResource(resource); + return this; + } + bind(baseTexture) { + if (this.baseTexture !== null) { + throw new Error("Only one base texture per TextureArray is allowed"); + } + super.bind(baseTexture); + for (let i = 0; i < this.length; i++) { + this.items[i].parentTextureArray = baseTexture; + this.items[i].on("update", baseTexture.update, baseTexture); + } + } + unbind(baseTexture) { + super.unbind(baseTexture); + for (let i = 0; i < this.length; i++) { + this.items[i].parentTextureArray = null; + this.items[i].off("update", baseTexture.update, baseTexture); + } + } + load() { + if (this._load) { + return this._load; + } + const resources = this.items.map((item) => item.resource).filter((item) => item); + const promises = resources.map((item) => item.load()); + this._load = Promise.all(promises).then(() => { + const { realWidth, realHeight } = this.items[0]; + this.resize(realWidth, realHeight); + return Promise.resolve(this); + }); + return this._load; + } + } + + class ArrayResource extends AbstractMultiResource { + constructor(source, options) { + const { width, height } = options || {}; + let urls; + let length; + if (Array.isArray(source)) { + urls = source; + length = source.length; + } else { + length = source; + } + super(length, { width, height }); + if (urls) { + this.initFromArray(urls, options); + } + } + addBaseTextureAt(baseTexture, index) { + if (baseTexture.resource) { + this.addResourceAt(baseTexture.resource, index); + } else { + throw new Error("ArrayResource does not support RenderTexture"); + } + return this; + } + bind(baseTexture) { + super.bind(baseTexture); + baseTexture.target = TARGETS.TEXTURE_2D_ARRAY; + } + upload(renderer, texture, glTexture) { + const { length, itemDirtyIds, items } = this; + const { gl } = renderer; + if (glTexture.dirtyId < 0) { + gl.texImage3D(gl.TEXTURE_2D_ARRAY, 0, glTexture.internalFormat, this._width, this._height, length, 0, texture.format, glTexture.type, null); + } + for (let i = 0; i < length; i++) { + const item = items[i]; + if (itemDirtyIds[i] < item.dirtyId) { + itemDirtyIds[i] = item.dirtyId; + if (item.valid) { + gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, 0, 0, 0, i, item.resource.width, item.resource.height, 1, texture.format, glTexture.type, item.resource.source); + } + } + } + return true; + } + } + + class CanvasResource extends BaseImageResource { + constructor(source) { + super(source); + } + static test(source) { + const { OffscreenCanvas } = globalThis; + if (OffscreenCanvas && source instanceof OffscreenCanvas) { + return true; + } + return globalThis.HTMLCanvasElement && source instanceof HTMLCanvasElement; + } + } + + const _CubeResource = class extends AbstractMultiResource { + constructor(source, options) { + const { width, height, autoLoad, linkBaseTexture } = options || {}; + if (source && source.length !== _CubeResource.SIDES) { + throw new Error(`Invalid length. Got ${source.length}, expected 6`); + } + super(6, { width, height }); + for (let i = 0; i < _CubeResource.SIDES; i++) { + this.items[i].target = TARGETS.TEXTURE_CUBE_MAP_POSITIVE_X + i; + } + this.linkBaseTexture = linkBaseTexture !== false; + if (source) { + this.initFromArray(source, options); + } + if (autoLoad !== false) { + this.load(); + } + } + bind(baseTexture) { + super.bind(baseTexture); + baseTexture.target = TARGETS.TEXTURE_CUBE_MAP; + } + addBaseTextureAt(baseTexture, index, linkBaseTexture) { + if (linkBaseTexture === void 0) { + linkBaseTexture = this.linkBaseTexture; + } + if (!this.items[index]) { + throw new Error(`Index ${index} is out of bounds`); + } + if (!this.linkBaseTexture || baseTexture.parentTextureArray || Object.keys(baseTexture._glTextures).length > 0) { + if (baseTexture.resource) { + this.addResourceAt(baseTexture.resource, index); + } else { + throw new Error(`CubeResource does not support copying of renderTexture.`); + } + } else { + baseTexture.target = TARGETS.TEXTURE_CUBE_MAP_POSITIVE_X + index; + baseTexture.parentTextureArray = this.baseTexture; + this.items[index] = baseTexture; + } + if (baseTexture.valid && !this.valid) { + this.resize(baseTexture.realWidth, baseTexture.realHeight); + } + this.items[index] = baseTexture; + return this; + } + upload(renderer, _baseTexture, glTexture) { + const dirty = this.itemDirtyIds; + for (let i = 0; i < _CubeResource.SIDES; i++) { + const side = this.items[i]; + if (dirty[i] < side.dirtyId || glTexture.dirtyId < _baseTexture.dirtyId) { + if (side.valid && side.resource) { + side.resource.upload(renderer, side, glTexture); + dirty[i] = side.dirtyId; + } else if (dirty[i] < -1) { + renderer.gl.texImage2D(side.target, 0, glTexture.internalFormat, _baseTexture.realWidth, _baseTexture.realHeight, 0, _baseTexture.format, glTexture.type, null); + dirty[i] = -1; + } + } + } + return true; + } + static test(source) { + return Array.isArray(source) && source.length === _CubeResource.SIDES; + } + }; + let CubeResource = _CubeResource; + CubeResource.SIDES = 6; + + class ImageBitmapResource extends BaseImageResource { + constructor(source, options) { + options = options || {}; + let baseSource; + let url; + if (typeof source === "string") { + baseSource = ImageBitmapResource.EMPTY; + url = source; + } else { + baseSource = source; + url = null; + } + super(baseSource); + this.url = url; + this.crossOrigin = options.crossOrigin ?? true; + this.alphaMode = typeof options.alphaMode === "number" ? options.alphaMode : null; + this._load = null; + if (options.autoLoad !== false) { + this.load(); + } + } + load() { + if (this._load) { + return this._load; + } + this._load = new Promise(async (resolve, reject) => { + if (this.url === null) { + resolve(this); + return; + } + try { + const response = await settings.ADAPTER.fetch(this.url, { + mode: this.crossOrigin ? "cors" : "no-cors" + }); + if (this.destroyed) + return; + const imageBlob = await response.blob(); + if (this.destroyed) + return; + const imageBitmap = await createImageBitmap(imageBlob, { + premultiplyAlpha: this.alphaMode === null || this.alphaMode === ALPHA_MODES.UNPACK ? "premultiply" : "none" + }); + if (this.destroyed) + return; + this.source = imageBitmap; + this.update(); + resolve(this); + } catch (e) { + if (this.destroyed) + return; + reject(e); + this.onError.emit(e); + } + }); + return this._load; + } + upload(renderer, baseTexture, glTexture) { + if (!(this.source instanceof ImageBitmap)) { + this.load(); + return false; + } + if (typeof this.alphaMode === "number") { + baseTexture.alphaMode = this.alphaMode; + } + return super.upload(renderer, baseTexture, glTexture); + } + dispose() { + if (this.source instanceof ImageBitmap) { + this.source.close(); + } + super.dispose(); + this._load = null; + } + static test(source) { + return !!globalThis.createImageBitmap && typeof ImageBitmap !== "undefined" && (typeof source === "string" || source instanceof ImageBitmap); + } + static get EMPTY() { + ImageBitmapResource._EMPTY = ImageBitmapResource._EMPTY ?? settings.ADAPTER.createCanvas(0, 0); + return ImageBitmapResource._EMPTY; + } + } + + const _SVGResource = class extends BaseImageResource { + constructor(sourceBase64, options) { + options = options || {}; + super(settings.ADAPTER.createCanvas()); + this._width = 0; + this._height = 0; + this.svg = sourceBase64; + this.scale = options.scale || 1; + this._overrideWidth = options.width; + this._overrideHeight = options.height; + this._resolve = null; + this._crossorigin = options.crossorigin; + this._load = null; + if (options.autoLoad !== false) { + this.load(); + } + } + load() { + if (this._load) { + return this._load; + } + this._load = new Promise((resolve) => { + this._resolve = () => { + this.resize(this.source.width, this.source.height); + resolve(this); + }; + if (_SVGResource.SVG_XML.test(this.svg.trim())) { + if (!btoa) { + throw new Error("Your browser doesn't support base64 conversions."); + } + this.svg = `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(this.svg)))}`; + } + this._loadSvg(); + }); + return this._load; + } + _loadSvg() { + const tempImage = new Image(); + BaseImageResource.crossOrigin(tempImage, this.svg, this._crossorigin); + tempImage.src = this.svg; + tempImage.onerror = (event) => { + if (!this._resolve) { + return; + } + tempImage.onerror = null; + this.onError.emit(event); + }; + tempImage.onload = () => { + if (!this._resolve) { + return; + } + const svgWidth = tempImage.width; + const svgHeight = tempImage.height; + if (!svgWidth || !svgHeight) { + throw new Error("The SVG image must have width and height defined (in pixels), canvas API needs them."); + } + let width = svgWidth * this.scale; + let height = svgHeight * this.scale; + if (this._overrideWidth || this._overrideHeight) { + width = this._overrideWidth || this._overrideHeight / svgHeight * svgWidth; + height = this._overrideHeight || this._overrideWidth / svgWidth * svgHeight; + } + width = Math.round(width); + height = Math.round(height); + const canvas = this.source; + canvas.width = width; + canvas.height = height; + canvas._pixiId = `canvas_${uid()}`; + canvas.getContext("2d").drawImage(tempImage, 0, 0, svgWidth, svgHeight, 0, 0, width, height); + this._resolve(); + this._resolve = null; + }; + } + static getSize(svgString) { + const sizeMatch = _SVGResource.SVG_SIZE.exec(svgString); + const size = {}; + if (sizeMatch) { + size[sizeMatch[1]] = Math.round(parseFloat(sizeMatch[3])); + size[sizeMatch[5]] = Math.round(parseFloat(sizeMatch[7])); + } + return size; + } + dispose() { + super.dispose(); + this._resolve = null; + this._crossorigin = null; + } + static test(source, extension) { + return extension === "svg" || typeof source === "string" && source.startsWith("data:image/svg+xml") || typeof source === "string" && _SVGResource.SVG_XML.test(source); + } + }; + let SVGResource = _SVGResource; + SVGResource.SVG_XML = /^(<\?xml[^?]+\?>)?\s*()]*-->)?\s*\]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*>/i; + + const _VideoResource = class extends BaseImageResource { + constructor(source, options) { + options = options || {}; + if (!(source instanceof HTMLVideoElement)) { + const videoElement = document.createElement("video"); + videoElement.setAttribute("preload", "auto"); + videoElement.setAttribute("webkit-playsinline", ""); + videoElement.setAttribute("playsinline", ""); + if (typeof source === "string") { + source = [source]; + } + const firstSrc = source[0].src || source[0]; + BaseImageResource.crossOrigin(videoElement, firstSrc, options.crossorigin); + for (let i = 0; i < source.length; ++i) { + const sourceElement = document.createElement("source"); + let { src, mime } = source[i]; + src = src || source[i]; + const baseSrc = src.split("?").shift().toLowerCase(); + const ext = baseSrc.slice(baseSrc.lastIndexOf(".") + 1); + mime = mime || _VideoResource.MIME_TYPES[ext] || `video/${ext}`; + sourceElement.src = src; + sourceElement.type = mime; + videoElement.appendChild(sourceElement); + } + source = videoElement; + } + super(source); + this.noSubImage = true; + this._autoUpdate = true; + this._isConnectedToTicker = false; + this._updateFPS = options.updateFPS || 0; + this._msToNextUpdate = 0; + this.autoPlay = options.autoPlay !== false; + this._load = null; + this._resolve = null; + this._onCanPlay = this._onCanPlay.bind(this); + this._onError = this._onError.bind(this); + if (options.autoLoad !== false) { + this.load(); + } + } + update(_deltaTime = 0) { + if (!this.destroyed) { + const elapsedMS = Ticker.shared.elapsedMS * this.source.playbackRate; + this._msToNextUpdate = Math.floor(this._msToNextUpdate - elapsedMS); + if (!this._updateFPS || this._msToNextUpdate <= 0) { + super.update(); + this._msToNextUpdate = this._updateFPS ? Math.floor(1e3 / this._updateFPS) : 0; + } + } + } + load() { + if (this._load) { + return this._load; + } + const source = this.source; + if ((source.readyState === source.HAVE_ENOUGH_DATA || source.readyState === source.HAVE_FUTURE_DATA) && source.width && source.height) { + source.complete = true; + } + source.addEventListener("play", this._onPlayStart.bind(this)); + source.addEventListener("pause", this._onPlayStop.bind(this)); + if (!this._isSourceReady()) { + source.addEventListener("canplay", this._onCanPlay); + source.addEventListener("canplaythrough", this._onCanPlay); + source.addEventListener("error", this._onError, true); + } else { + this._onCanPlay(); + } + this._load = new Promise((resolve) => { + if (this.valid) { + resolve(this); + } else { + this._resolve = resolve; + source.load(); + } + }); + return this._load; + } + _onError(event) { + this.source.removeEventListener("error", this._onError, true); + this.onError.emit(event); + } + _isSourcePlaying() { + const source = this.source; + return !source.paused && !source.ended && this._isSourceReady(); + } + _isSourceReady() { + const source = this.source; + return source.readyState > 2; + } + _onPlayStart() { + if (!this.valid) { + this._onCanPlay(); + } + if (this.autoUpdate && !this._isConnectedToTicker) { + Ticker.shared.add(this.update, this); + this._isConnectedToTicker = true; + } + } + _onPlayStop() { + if (this._isConnectedToTicker) { + Ticker.shared.remove(this.update, this); + this._isConnectedToTicker = false; + } + } + _onCanPlay() { + const source = this.source; + source.removeEventListener("canplay", this._onCanPlay); + source.removeEventListener("canplaythrough", this._onCanPlay); + const valid = this.valid; + this.resize(source.videoWidth, source.videoHeight); + if (!valid && this._resolve) { + this._resolve(this); + this._resolve = null; + } + if (this._isSourcePlaying()) { + this._onPlayStart(); + } else if (this.autoPlay) { + source.play(); + } + } + dispose() { + if (this._isConnectedToTicker) { + Ticker.shared.remove(this.update, this); + this._isConnectedToTicker = false; + } + const source = this.source; + if (source) { + source.removeEventListener("error", this._onError, true); + source.pause(); + source.src = ""; + source.load(); + } + super.dispose(); + } + get autoUpdate() { + return this._autoUpdate; + } + set autoUpdate(value) { + if (value !== this._autoUpdate) { + this._autoUpdate = value; + if (!this._autoUpdate && this._isConnectedToTicker) { + Ticker.shared.remove(this.update, this); + this._isConnectedToTicker = false; + } else if (this._autoUpdate && !this._isConnectedToTicker && this._isSourcePlaying()) { + Ticker.shared.add(this.update, this); + this._isConnectedToTicker = true; + } + } + } + get updateFPS() { + return this._updateFPS; + } + set updateFPS(value) { + if (value !== this._updateFPS) { + this._updateFPS = value; + } + } + static test(source, extension) { + return globalThis.HTMLVideoElement && source instanceof HTMLVideoElement || _VideoResource.TYPES.includes(extension); + } + }; + let VideoResource = _VideoResource; + VideoResource.TYPES = ["mp4", "m4v", "webm", "ogg", "ogv", "h264", "avi", "mov"]; + VideoResource.MIME_TYPES = { + ogv: "video/ogg", + mov: "video/quicktime", + m4v: "video/mp4" + }; + + INSTALLED.push(ImageBitmapResource, ImageResource, CanvasResource, VideoResource, SVGResource, BufferResource, CubeResource, ArrayResource); + + class TransformFeedback { + constructor() { + this._glTransformFeedbacks = {}; + this.buffers = []; + this.disposeRunner = new Runner("disposeTransformFeedback"); + } + bindBuffer(index, buffer) { + this.buffers[index] = buffer; + } + destroy() { + this.disposeRunner.emit(this, false); + } + } + + const VERSION = "7.2.1"; + + class Bounds { + constructor() { + this.minX = Infinity; + this.minY = Infinity; + this.maxX = -Infinity; + this.maxY = -Infinity; + this.rect = null; + this.updateID = -1; + } + isEmpty() { + return this.minX > this.maxX || this.minY > this.maxY; + } + clear() { + this.minX = Infinity; + this.minY = Infinity; + this.maxX = -Infinity; + this.maxY = -Infinity; + } + getRectangle(rect) { + if (this.minX > this.maxX || this.minY > this.maxY) { + return Rectangle.EMPTY; + } + rect = rect || new Rectangle(0, 0, 1, 1); + rect.x = this.minX; + rect.y = this.minY; + rect.width = this.maxX - this.minX; + rect.height = this.maxY - this.minY; + return rect; + } + addPoint(point) { + this.minX = Math.min(this.minX, point.x); + this.maxX = Math.max(this.maxX, point.x); + this.minY = Math.min(this.minY, point.y); + this.maxY = Math.max(this.maxY, point.y); + } + addPointMatrix(matrix, point) { + const { a, b, c, d, tx, ty } = matrix; + const x = a * point.x + c * point.y + tx; + const y = b * point.x + d * point.y + ty; + this.minX = Math.min(this.minX, x); + this.maxX = Math.max(this.maxX, x); + this.minY = Math.min(this.minY, y); + this.maxY = Math.max(this.maxY, y); + } + addQuad(vertices) { + let minX = this.minX; + let minY = this.minY; + let maxX = this.maxX; + let maxY = this.maxY; + let x = vertices[0]; + let y = vertices[1]; + minX = x < minX ? x : minX; + minY = y < minY ? y : minY; + maxX = x > maxX ? x : maxX; + maxY = y > maxY ? y : maxY; + x = vertices[2]; + y = vertices[3]; + minX = x < minX ? x : minX; + minY = y < minY ? y : minY; + maxX = x > maxX ? x : maxX; + maxY = y > maxY ? y : maxY; + x = vertices[4]; + y = vertices[5]; + minX = x < minX ? x : minX; + minY = y < minY ? y : minY; + maxX = x > maxX ? x : maxX; + maxY = y > maxY ? y : maxY; + x = vertices[6]; + y = vertices[7]; + minX = x < minX ? x : minX; + minY = y < minY ? y : minY; + maxX = x > maxX ? x : maxX; + maxY = y > maxY ? y : maxY; + this.minX = minX; + this.minY = minY; + this.maxX = maxX; + this.maxY = maxY; + } + addFrame(transform, x0, y0, x1, y1) { + this.addFrameMatrix(transform.worldTransform, x0, y0, x1, y1); + } + addFrameMatrix(matrix, x0, y0, x1, y1) { + const a = matrix.a; + const b = matrix.b; + const c = matrix.c; + const d = matrix.d; + const tx = matrix.tx; + const ty = matrix.ty; + let minX = this.minX; + let minY = this.minY; + let maxX = this.maxX; + let maxY = this.maxY; + let x = a * x0 + c * y0 + tx; + let y = b * x0 + d * y0 + ty; + minX = x < minX ? x : minX; + minY = y < minY ? y : minY; + maxX = x > maxX ? x : maxX; + maxY = y > maxY ? y : maxY; + x = a * x1 + c * y0 + tx; + y = b * x1 + d * y0 + ty; + minX = x < minX ? x : minX; + minY = y < minY ? y : minY; + maxX = x > maxX ? x : maxX; + maxY = y > maxY ? y : maxY; + x = a * x0 + c * y1 + tx; + y = b * x0 + d * y1 + ty; + minX = x < minX ? x : minX; + minY = y < minY ? y : minY; + maxX = x > maxX ? x : maxX; + maxY = y > maxY ? y : maxY; + x = a * x1 + c * y1 + tx; + y = b * x1 + d * y1 + ty; + minX = x < minX ? x : minX; + minY = y < minY ? y : minY; + maxX = x > maxX ? x : maxX; + maxY = y > maxY ? y : maxY; + this.minX = minX; + this.minY = minY; + this.maxX = maxX; + this.maxY = maxY; + } + addVertexData(vertexData, beginOffset, endOffset) { + let minX = this.minX; + let minY = this.minY; + let maxX = this.maxX; + let maxY = this.maxY; + for (let i = beginOffset; i < endOffset; i += 2) { + const x = vertexData[i]; + const y = vertexData[i + 1]; + minX = x < minX ? x : minX; + minY = y < minY ? y : minY; + maxX = x > maxX ? x : maxX; + maxY = y > maxY ? y : maxY; + } + this.minX = minX; + this.minY = minY; + this.maxX = maxX; + this.maxY = maxY; + } + addVertices(transform, vertices, beginOffset, endOffset) { + this.addVerticesMatrix(transform.worldTransform, vertices, beginOffset, endOffset); + } + addVerticesMatrix(matrix, vertices, beginOffset, endOffset, padX = 0, padY = padX) { + const a = matrix.a; + const b = matrix.b; + const c = matrix.c; + const d = matrix.d; + const tx = matrix.tx; + const ty = matrix.ty; + let minX = this.minX; + let minY = this.minY; + let maxX = this.maxX; + let maxY = this.maxY; + for (let i = beginOffset; i < endOffset; i += 2) { + const rawX = vertices[i]; + const rawY = vertices[i + 1]; + const x = a * rawX + c * rawY + tx; + const y = d * rawY + b * rawX + ty; + minX = Math.min(minX, x - padX); + maxX = Math.max(maxX, x + padX); + minY = Math.min(minY, y - padY); + maxY = Math.max(maxY, y + padY); + } + this.minX = minX; + this.minY = minY; + this.maxX = maxX; + this.maxY = maxY; + } + addBounds(bounds) { + const minX = this.minX; + const minY = this.minY; + const maxX = this.maxX; + const maxY = this.maxY; + this.minX = bounds.minX < minX ? bounds.minX : minX; + this.minY = bounds.minY < minY ? bounds.minY : minY; + this.maxX = bounds.maxX > maxX ? bounds.maxX : maxX; + this.maxY = bounds.maxY > maxY ? bounds.maxY : maxY; + } + addBoundsMask(bounds, mask) { + const _minX = bounds.minX > mask.minX ? bounds.minX : mask.minX; + const _minY = bounds.minY > mask.minY ? bounds.minY : mask.minY; + const _maxX = bounds.maxX < mask.maxX ? bounds.maxX : mask.maxX; + const _maxY = bounds.maxY < mask.maxY ? bounds.maxY : mask.maxY; + if (_minX <= _maxX && _minY <= _maxY) { + const minX = this.minX; + const minY = this.minY; + const maxX = this.maxX; + const maxY = this.maxY; + this.minX = _minX < minX ? _minX : minX; + this.minY = _minY < minY ? _minY : minY; + this.maxX = _maxX > maxX ? _maxX : maxX; + this.maxY = _maxY > maxY ? _maxY : maxY; + } + } + addBoundsMatrix(bounds, matrix) { + this.addFrameMatrix(matrix, bounds.minX, bounds.minY, bounds.maxX, bounds.maxY); + } + addBoundsArea(bounds, area) { + const _minX = bounds.minX > area.x ? bounds.minX : area.x; + const _minY = bounds.minY > area.y ? bounds.minY : area.y; + const _maxX = bounds.maxX < area.x + area.width ? bounds.maxX : area.x + area.width; + const _maxY = bounds.maxY < area.y + area.height ? bounds.maxY : area.y + area.height; + if (_minX <= _maxX && _minY <= _maxY) { + const minX = this.minX; + const minY = this.minY; + const maxX = this.maxX; + const maxY = this.maxY; + this.minX = _minX < minX ? _minX : minX; + this.minY = _minY < minY ? _minY : minY; + this.maxX = _maxX > maxX ? _maxX : maxX; + this.maxY = _maxY > maxY ? _maxY : maxY; + } + } + pad(paddingX = 0, paddingY = paddingX) { + if (!this.isEmpty()) { + this.minX -= paddingX; + this.maxX += paddingX; + this.minY -= paddingY; + this.maxY += paddingY; + } + } + addFramePad(x0, y0, x1, y1, padX, padY) { + x0 -= padX; + y0 -= padY; + x1 += padX; + y1 += padY; + this.minX = this.minX < x0 ? this.minX : x0; + this.maxX = this.maxX > x1 ? this.maxX : x1; + this.minY = this.minY < y0 ? this.minY : y0; + this.maxY = this.maxY > y1 ? this.maxY : y1; + } + } + + class DisplayObject extends eventemitter3 { + constructor() { + super(); + this.tempDisplayObjectParent = null; + this.transform = new Transform(); + this.alpha = 1; + this.visible = true; + this.renderable = true; + this.cullable = false; + this.cullArea = null; + this.parent = null; + this.worldAlpha = 1; + this._lastSortedIndex = 0; + this._zIndex = 0; + this.filterArea = null; + this.filters = null; + this._enabledFilters = null; + this._bounds = new Bounds(); + this._localBounds = null; + this._boundsID = 0; + this._boundsRect = null; + this._localBoundsRect = null; + this._mask = null; + this._maskRefCount = 0; + this._destroyed = false; + this.isSprite = false; + this.isMask = false; + } + static mixin(source) { + const keys = Object.keys(source); + for (let i = 0; i < keys.length; ++i) { + const propertyName = keys[i]; + Object.defineProperty(DisplayObject.prototype, propertyName, Object.getOwnPropertyDescriptor(source, propertyName)); + } + } + get destroyed() { + return this._destroyed; + } + _recursivePostUpdateTransform() { + if (this.parent) { + this.parent._recursivePostUpdateTransform(); + this.transform.updateTransform(this.parent.transform); + } else { + this.transform.updateTransform(this._tempDisplayObjectParent.transform); + } + } + updateTransform() { + this._boundsID++; + this.transform.updateTransform(this.parent.transform); + this.worldAlpha = this.alpha * this.parent.worldAlpha; + } + getBounds(skipUpdate, rect) { + if (!skipUpdate) { + if (!this.parent) { + this.parent = this._tempDisplayObjectParent; + this.updateTransform(); + this.parent = null; + } else { + this._recursivePostUpdateTransform(); + this.updateTransform(); + } + } + if (this._bounds.updateID !== this._boundsID) { + this.calculateBounds(); + this._bounds.updateID = this._boundsID; + } + if (!rect) { + if (!this._boundsRect) { + this._boundsRect = new Rectangle(); + } + rect = this._boundsRect; + } + return this._bounds.getRectangle(rect); + } + getLocalBounds(rect) { + if (!rect) { + if (!this._localBoundsRect) { + this._localBoundsRect = new Rectangle(); + } + rect = this._localBoundsRect; + } + if (!this._localBounds) { + this._localBounds = new Bounds(); + } + const transformRef = this.transform; + const parentRef = this.parent; + this.parent = null; + this.transform = this._tempDisplayObjectParent.transform; + const worldBounds = this._bounds; + const worldBoundsID = this._boundsID; + this._bounds = this._localBounds; + const bounds = this.getBounds(false, rect); + this.parent = parentRef; + this.transform = transformRef; + this._bounds = worldBounds; + this._bounds.updateID += this._boundsID - worldBoundsID; + return bounds; + } + toGlobal(position, point, skipUpdate = false) { + if (!skipUpdate) { + this._recursivePostUpdateTransform(); + if (!this.parent) { + this.parent = this._tempDisplayObjectParent; + this.displayObjectUpdateTransform(); + this.parent = null; + } else { + this.displayObjectUpdateTransform(); + } + } + return this.worldTransform.apply(position, point); + } + toLocal(position, from, point, skipUpdate) { + if (from) { + position = from.toGlobal(position, point, skipUpdate); + } + if (!skipUpdate) { + this._recursivePostUpdateTransform(); + if (!this.parent) { + this.parent = this._tempDisplayObjectParent; + this.displayObjectUpdateTransform(); + this.parent = null; + } else { + this.displayObjectUpdateTransform(); + } + } + return this.worldTransform.applyInverse(position, point); + } + setParent(container) { + if (!container || !container.addChild) { + throw new Error("setParent: Argument must be a Container"); + } + container.addChild(this); + return container; + } + removeFromParent() { + this.parent?.removeChild(this); + } + setTransform(x = 0, y = 0, scaleX = 1, scaleY = 1, rotation = 0, skewX = 0, skewY = 0, pivotX = 0, pivotY = 0) { + this.position.x = x; + this.position.y = y; + this.scale.x = !scaleX ? 1 : scaleX; + this.scale.y = !scaleY ? 1 : scaleY; + this.rotation = rotation; + this.skew.x = skewX; + this.skew.y = skewY; + this.pivot.x = pivotX; + this.pivot.y = pivotY; + return this; + } + destroy(_options) { + this.removeFromParent(); + this._destroyed = true; + this.transform = null; + this.parent = null; + this._bounds = null; + this.mask = null; + this.cullArea = null; + this.filters = null; + this.filterArea = null; + this.hitArea = null; + this.eventMode = "auto"; + this.interactiveChildren = false; + this.emit("destroyed"); + this.removeAllListeners(); + } + get _tempDisplayObjectParent() { + if (this.tempDisplayObjectParent === null) { + this.tempDisplayObjectParent = new TemporaryDisplayObject(); + } + return this.tempDisplayObjectParent; + } + enableTempParent() { + const myParent = this.parent; + this.parent = this._tempDisplayObjectParent; + return myParent; + } + disableTempParent(cacheParent) { + this.parent = cacheParent; + } + get x() { + return this.position.x; + } + set x(value) { + this.transform.position.x = value; + } + get y() { + return this.position.y; + } + set y(value) { + this.transform.position.y = value; + } + get worldTransform() { + return this.transform.worldTransform; + } + get localTransform() { + return this.transform.localTransform; + } + get position() { + return this.transform.position; + } + set position(value) { + this.transform.position.copyFrom(value); + } + get scale() { + return this.transform.scale; + } + set scale(value) { + this.transform.scale.copyFrom(value); + } + get pivot() { + return this.transform.pivot; + } + set pivot(value) { + this.transform.pivot.copyFrom(value); + } + get skew() { + return this.transform.skew; + } + set skew(value) { + this.transform.skew.copyFrom(value); + } + get rotation() { + return this.transform.rotation; + } + set rotation(value) { + this.transform.rotation = value; + } + get angle() { + return this.transform.rotation * RAD_TO_DEG; + } + set angle(value) { + this.transform.rotation = value * DEG_TO_RAD; + } + get zIndex() { + return this._zIndex; + } + set zIndex(value) { + this._zIndex = value; + if (this.parent) { + this.parent.sortDirty = true; + } + } + get worldVisible() { + let item = this; + do { + if (!item.visible) { + return false; + } + item = item.parent; + } while (item); + return true; + } + get mask() { + return this._mask; + } + set mask(value) { + if (this._mask === value) { + return; + } + if (this._mask) { + const maskObject = this._mask.isMaskData ? this._mask.maskObject : this._mask; + if (maskObject) { + maskObject._maskRefCount--; + if (maskObject._maskRefCount === 0) { + maskObject.renderable = true; + maskObject.isMask = false; + } + } + } + this._mask = value; + if (this._mask) { + const maskObject = this._mask.isMaskData ? this._mask.maskObject : this._mask; + if (maskObject) { + if (maskObject._maskRefCount === 0) { + maskObject.renderable = false; + maskObject.isMask = true; + } + maskObject._maskRefCount++; + } + } + } + } + class TemporaryDisplayObject extends DisplayObject { + constructor() { + super(...arguments); + this.sortDirty = null; + } + } + DisplayObject.prototype.displayObjectUpdateTransform = DisplayObject.prototype.updateTransform; + + const tempMatrix = new Matrix(); + function sortChildren(a, b) { + if (a.zIndex === b.zIndex) { + return a._lastSortedIndex - b._lastSortedIndex; + } + return a.zIndex - b.zIndex; + } + const _Container = class extends DisplayObject { + constructor() { + super(); + this.children = []; + this.sortableChildren = _Container.defaultSortableChildren; + this.sortDirty = false; + } + onChildrenChange(_length) { + } + addChild(...children) { + if (children.length > 1) { + for (let i = 0; i < children.length; i++) { + this.addChild(children[i]); + } + } else { + const child = children[0]; + if (child.parent) { + child.parent.removeChild(child); + } + child.parent = this; + this.sortDirty = true; + child.transform._parentID = -1; + this.children.push(child); + this._boundsID++; + this.onChildrenChange(this.children.length - 1); + this.emit("childAdded", child, this, this.children.length - 1); + child.emit("added", this); + } + return children[0]; + } + addChildAt(child, index) { + if (index < 0 || index > this.children.length) { + throw new Error(`${child}addChildAt: The index ${index} supplied is out of bounds ${this.children.length}`); + } + if (child.parent) { + child.parent.removeChild(child); + } + child.parent = this; + this.sortDirty = true; + child.transform._parentID = -1; + this.children.splice(index, 0, child); + this._boundsID++; + this.onChildrenChange(index); + child.emit("added", this); + this.emit("childAdded", child, this, index); + return child; + } + swapChildren(child, child2) { + if (child === child2) { + return; + } + const index1 = this.getChildIndex(child); + const index2 = this.getChildIndex(child2); + this.children[index1] = child2; + this.children[index2] = child; + this.onChildrenChange(index1 < index2 ? index1 : index2); + } + getChildIndex(child) { + const index = this.children.indexOf(child); + if (index === -1) { + throw new Error("The supplied DisplayObject must be a child of the caller"); + } + return index; + } + setChildIndex(child, index$1) { + if (index$1 < 0 || index$1 >= this.children.length) { + throw new Error(`The index ${index$1} supplied is out of bounds ${this.children.length}`); + } + const currentIndex = this.getChildIndex(child); + removeItems(this.children, currentIndex, 1); + this.children.splice(index$1, 0, child); + this.onChildrenChange(index$1); + } + getChildAt(index) { + if (index < 0 || index >= this.children.length) { + throw new Error(`getChildAt: Index (${index}) does not exist.`); + } + return this.children[index]; + } + removeChild(...children) { + if (children.length > 1) { + for (let i = 0; i < children.length; i++) { + this.removeChild(children[i]); + } + } else { + const child = children[0]; + const index$1 = this.children.indexOf(child); + if (index$1 === -1) + return null; + child.parent = null; + child.transform._parentID = -1; + removeItems(this.children, index$1, 1); + this._boundsID++; + this.onChildrenChange(index$1); + child.emit("removed", this); + this.emit("childRemoved", child, this, index$1); + } + return children[0]; + } + removeChildAt(index$1) { + const child = this.getChildAt(index$1); + child.parent = null; + child.transform._parentID = -1; + removeItems(this.children, index$1, 1); + this._boundsID++; + this.onChildrenChange(index$1); + child.emit("removed", this); + this.emit("childRemoved", child, this, index$1); + return child; + } + removeChildren(beginIndex = 0, endIndex = this.children.length) { + const begin = beginIndex; + const end = endIndex; + const range = end - begin; + let removed; + if (range > 0 && range <= end) { + removed = this.children.splice(begin, range); + for (let i = 0; i < removed.length; ++i) { + removed[i].parent = null; + if (removed[i].transform) { + removed[i].transform._parentID = -1; + } + } + this._boundsID++; + this.onChildrenChange(beginIndex); + for (let i = 0; i < removed.length; ++i) { + removed[i].emit("removed", this); + this.emit("childRemoved", removed[i], this, i); + } + return removed; + } else if (range === 0 && this.children.length === 0) { + return []; + } + throw new RangeError("removeChildren: numeric values are outside the acceptable range."); + } + sortChildren() { + let sortRequired = false; + for (let i = 0, j = this.children.length; i < j; ++i) { + const child = this.children[i]; + child._lastSortedIndex = i; + if (!sortRequired && child.zIndex !== 0) { + sortRequired = true; + } + } + if (sortRequired && this.children.length > 1) { + this.children.sort(sortChildren); + } + this.sortDirty = false; + } + updateTransform() { + if (this.sortableChildren && this.sortDirty) { + this.sortChildren(); + } + this._boundsID++; + this.transform.updateTransform(this.parent.transform); + this.worldAlpha = this.alpha * this.parent.worldAlpha; + for (let i = 0, j = this.children.length; i < j; ++i) { + const child = this.children[i]; + if (child.visible) { + child.updateTransform(); + } + } + } + calculateBounds() { + this._bounds.clear(); + this._calculateBounds(); + for (let i = 0; i < this.children.length; i++) { + const child = this.children[i]; + if (!child.visible || !child.renderable) { + continue; + } + child.calculateBounds(); + if (child._mask) { + const maskObject = child._mask.isMaskData ? child._mask.maskObject : child._mask; + if (maskObject) { + maskObject.calculateBounds(); + this._bounds.addBoundsMask(child._bounds, maskObject._bounds); + } else { + this._bounds.addBounds(child._bounds); + } + } else if (child.filterArea) { + this._bounds.addBoundsArea(child._bounds, child.filterArea); + } else { + this._bounds.addBounds(child._bounds); + } + } + this._bounds.updateID = this._boundsID; + } + getLocalBounds(rect, skipChildrenUpdate = false) { + const result = super.getLocalBounds(rect); + if (!skipChildrenUpdate) { + for (let i = 0, j = this.children.length; i < j; ++i) { + const child = this.children[i]; + if (child.visible) { + child.updateTransform(); + } + } + } + return result; + } + _calculateBounds() { + } + _renderWithCulling(renderer) { + const sourceFrame = renderer.renderTexture.sourceFrame; + if (!(sourceFrame.width > 0 && sourceFrame.height > 0)) { + return; + } + let bounds; + let transform; + if (this.cullArea) { + bounds = this.cullArea; + transform = this.worldTransform; + } else if (this._render !== _Container.prototype._render) { + bounds = this.getBounds(true); + } + const projectionTransform = renderer.projection.transform; + if (projectionTransform) { + if (transform) { + transform = tempMatrix.copyFrom(transform); + transform.prepend(projectionTransform); + } else { + transform = projectionTransform; + } + } + if (bounds && sourceFrame.intersects(bounds, transform)) { + this._render(renderer); + } else if (this.cullArea) { + return; + } + for (let i = 0, j = this.children.length; i < j; ++i) { + const child = this.children[i]; + const childCullable = child.cullable; + child.cullable = childCullable || !this.cullArea; + child.render(renderer); + child.cullable = childCullable; + } + } + render(renderer) { + if (!this.visible || this.worldAlpha <= 0 || !this.renderable) { + return; + } + if (this._mask || this.filters?.length) { + this.renderAdvanced(renderer); + } else if (this.cullable) { + this._renderWithCulling(renderer); + } else { + this._render(renderer); + for (let i = 0, j = this.children.length; i < j; ++i) { + this.children[i].render(renderer); + } + } + } + renderAdvanced(renderer) { + const filters = this.filters; + const mask = this._mask; + if (filters) { + if (!this._enabledFilters) { + this._enabledFilters = []; + } + this._enabledFilters.length = 0; + for (let i = 0; i < filters.length; i++) { + if (filters[i].enabled) { + this._enabledFilters.push(filters[i]); + } + } + } + const flush = filters && this._enabledFilters?.length || mask && (!mask.isMaskData || mask.enabled && (mask.autoDetect || mask.type !== MASK_TYPES.NONE)); + if (flush) { + renderer.batch.flush(); + } + if (filters && this._enabledFilters?.length) { + renderer.filter.push(this, this._enabledFilters); + } + if (mask) { + renderer.mask.push(this, this._mask); + } + if (this.cullable) { + this._renderWithCulling(renderer); + } else { + this._render(renderer); + for (let i = 0, j = this.children.length; i < j; ++i) { + this.children[i].render(renderer); + } + } + if (flush) { + renderer.batch.flush(); + } + if (mask) { + renderer.mask.pop(this); + } + if (filters && this._enabledFilters?.length) { + renderer.filter.pop(); + } + } + _render(_renderer) { + } + destroy(options) { + super.destroy(); + this.sortDirty = false; + const destroyChildren = typeof options === "boolean" ? options : options?.children; + const oldChildren = this.removeChildren(0, this.children.length); + if (destroyChildren) { + for (let i = 0; i < oldChildren.length; ++i) { + oldChildren[i].destroy(options); + } + } + } + get width() { + return this.scale.x * this.getLocalBounds().width; + } + set width(value) { + const width = this.getLocalBounds().width; + if (width !== 0) { + this.scale.x = value / width; + } else { + this.scale.x = 1; + } + this._width = value; + } + get height() { + return this.scale.y * this.getLocalBounds().height; + } + set height(value) { + const height = this.getLocalBounds().height; + if (height !== 0) { + this.scale.y = value / height; + } else { + this.scale.y = 1; + } + this._height = value; + } + }; + let Container = _Container; + Container.defaultSortableChildren = false; + Container.prototype.containerUpdateTransform = Container.prototype.updateTransform; + + Object.defineProperties(settings, { + SORTABLE_CHILDREN: { + get() { + return Container.defaultSortableChildren; + }, + set(value) { + deprecation("7.1.0", "settings.SORTABLE_CHILDREN is deprecated, use Container.defaultSortableChildren"); + Container.defaultSortableChildren = value; + } + } + }); + + const tempPoint$2 = new Point(); + const indices = new Uint16Array([0, 1, 2, 0, 2, 3]); + class Sprite extends Container { + constructor(texture) { + super(); + this._anchor = new ObservablePoint(this._onAnchorUpdate, this, texture ? texture.defaultAnchor.x : 0, texture ? texture.defaultAnchor.y : 0); + this._texture = null; + this._width = 0; + this._height = 0; + this._tintColor = new Color(16777215); + this._tintRGB = null; + this.tint = 16777215; + this.blendMode = BLEND_MODES.NORMAL; + this._cachedTint = 16777215; + this.uvs = null; + this.texture = texture || Texture.EMPTY; + this.vertexData = new Float32Array(8); + this.vertexTrimmedData = null; + this._transformID = -1; + this._textureID = -1; + this._transformTrimmedID = -1; + this._textureTrimmedID = -1; + this.indices = indices; + this.pluginName = "batch"; + this.isSprite = true; + this._roundPixels = settings.ROUND_PIXELS; + } + _onTextureUpdate() { + this._textureID = -1; + this._textureTrimmedID = -1; + this._cachedTint = 16777215; + if (this._width) { + this.scale.x = sign(this.scale.x) * this._width / this._texture.orig.width; + } + if (this._height) { + this.scale.y = sign(this.scale.y) * this._height / this._texture.orig.height; + } + } + _onAnchorUpdate() { + this._transformID = -1; + this._transformTrimmedID = -1; + } + calculateVertices() { + const texture = this._texture; + if (this._transformID === this.transform._worldID && this._textureID === texture._updateID) { + return; + } + if (this._textureID !== texture._updateID) { + this.uvs = this._texture._uvs.uvsFloat32; + } + this._transformID = this.transform._worldID; + this._textureID = texture._updateID; + const wt = this.transform.worldTransform; + const a = wt.a; + const b = wt.b; + const c = wt.c; + const d = wt.d; + const tx = wt.tx; + const ty = wt.ty; + const vertexData = this.vertexData; + const trim = texture.trim; + const orig = texture.orig; + const anchor = this._anchor; + let w0 = 0; + let w1 = 0; + let h0 = 0; + let h1 = 0; + if (trim) { + w1 = trim.x - anchor._x * orig.width; + w0 = w1 + trim.width; + h1 = trim.y - anchor._y * orig.height; + h0 = h1 + trim.height; + } else { + w1 = -anchor._x * orig.width; + w0 = w1 + orig.width; + h1 = -anchor._y * orig.height; + h0 = h1 + orig.height; + } + vertexData[0] = a * w1 + c * h1 + tx; + vertexData[1] = d * h1 + b * w1 + ty; + vertexData[2] = a * w0 + c * h1 + tx; + vertexData[3] = d * h1 + b * w0 + ty; + vertexData[4] = a * w0 + c * h0 + tx; + vertexData[5] = d * h0 + b * w0 + ty; + vertexData[6] = a * w1 + c * h0 + tx; + vertexData[7] = d * h0 + b * w1 + ty; + if (this._roundPixels) { + const resolution = settings.RESOLUTION; + for (let i = 0; i < vertexData.length; ++i) { + vertexData[i] = Math.round(vertexData[i] * resolution) / resolution; + } + } + } + calculateTrimmedVertices() { + if (!this.vertexTrimmedData) { + this.vertexTrimmedData = new Float32Array(8); + } else if (this._transformTrimmedID === this.transform._worldID && this._textureTrimmedID === this._texture._updateID) { + return; + } + this._transformTrimmedID = this.transform._worldID; + this._textureTrimmedID = this._texture._updateID; + const texture = this._texture; + const vertexData = this.vertexTrimmedData; + const orig = texture.orig; + const anchor = this._anchor; + const wt = this.transform.worldTransform; + const a = wt.a; + const b = wt.b; + const c = wt.c; + const d = wt.d; + const tx = wt.tx; + const ty = wt.ty; + const w1 = -anchor._x * orig.width; + const w0 = w1 + orig.width; + const h1 = -anchor._y * orig.height; + const h0 = h1 + orig.height; + vertexData[0] = a * w1 + c * h1 + tx; + vertexData[1] = d * h1 + b * w1 + ty; + vertexData[2] = a * w0 + c * h1 + tx; + vertexData[3] = d * h1 + b * w0 + ty; + vertexData[4] = a * w0 + c * h0 + tx; + vertexData[5] = d * h0 + b * w0 + ty; + vertexData[6] = a * w1 + c * h0 + tx; + vertexData[7] = d * h0 + b * w1 + ty; + } + _render(renderer) { + this.calculateVertices(); + renderer.batch.setObjectRenderer(renderer.plugins[this.pluginName]); + renderer.plugins[this.pluginName].render(this); + } + _calculateBounds() { + const trim = this._texture.trim; + const orig = this._texture.orig; + if (!trim || trim.width === orig.width && trim.height === orig.height) { + this.calculateVertices(); + this._bounds.addQuad(this.vertexData); + } else { + this.calculateTrimmedVertices(); + this._bounds.addQuad(this.vertexTrimmedData); + } + } + getLocalBounds(rect) { + if (this.children.length === 0) { + if (!this._localBounds) { + this._localBounds = new Bounds(); + } + this._localBounds.minX = this._texture.orig.width * -this._anchor._x; + this._localBounds.minY = this._texture.orig.height * -this._anchor._y; + this._localBounds.maxX = this._texture.orig.width * (1 - this._anchor._x); + this._localBounds.maxY = this._texture.orig.height * (1 - this._anchor._y); + if (!rect) { + if (!this._localBoundsRect) { + this._localBoundsRect = new Rectangle(); + } + rect = this._localBoundsRect; + } + return this._localBounds.getRectangle(rect); + } + return super.getLocalBounds.call(this, rect); + } + containsPoint(point) { + this.worldTransform.applyInverse(point, tempPoint$2); + const width = this._texture.orig.width; + const height = this._texture.orig.height; + const x1 = -width * this.anchor.x; + let y1 = 0; + if (tempPoint$2.x >= x1 && tempPoint$2.x < x1 + width) { + y1 = -height * this.anchor.y; + if (tempPoint$2.y >= y1 && tempPoint$2.y < y1 + height) { + return true; + } + } + return false; + } + destroy(options) { + super.destroy(options); + this._texture.off("update", this._onTextureUpdate, this); + this._anchor = null; + const destroyTexture = typeof options === "boolean" ? options : options?.texture; + if (destroyTexture) { + const destroyBaseTexture = typeof options === "boolean" ? options : options?.baseTexture; + this._texture.destroy(!!destroyBaseTexture); + } + this._texture = null; + } + static from(source, options) { + const texture = source instanceof Texture ? source : Texture.from(source, options); + return new Sprite(texture); + } + set roundPixels(value) { + if (this._roundPixels !== value) { + this._transformID = -1; + } + this._roundPixels = value; + } + get roundPixels() { + return this._roundPixels; + } + get width() { + return Math.abs(this.scale.x) * this._texture.orig.width; + } + set width(value) { + const s = sign(this.scale.x) || 1; + this.scale.x = s * value / this._texture.orig.width; + this._width = value; + } + get height() { + return Math.abs(this.scale.y) * this._texture.orig.height; + } + set height(value) { + const s = sign(this.scale.y) || 1; + this.scale.y = s * value / this._texture.orig.height; + this._height = value; + } + get anchor() { + return this._anchor; + } + set anchor(value) { + this._anchor.copyFrom(value); + } + get tint() { + return this._tintColor.value; + } + set tint(value) { + this._tintColor.setValue(value); + this._tintRGB = this._tintColor.toLittleEndianNumber(); + } + get tintValue() { + return this._tintColor.toNumber(); + } + get texture() { + return this._texture; + } + set texture(value) { + if (this._texture === value) { + return; + } + if (this._texture) { + this._texture.off("update", this._onTextureUpdate, this); + } + this._texture = value || Texture.EMPTY; + this._cachedTint = 16777215; + this._textureID = -1; + this._textureTrimmedID = -1; + if (value) { + if (value.baseTexture.valid) { + this._onTextureUpdate(); + } else { + value.once("update", this._onTextureUpdate, this); + } + } + } + } + + const _tempMatrix = new Matrix(); + DisplayObject.prototype._cacheAsBitmap = false; + DisplayObject.prototype._cacheData = null; + DisplayObject.prototype._cacheAsBitmapResolution = null; + DisplayObject.prototype._cacheAsBitmapMultisample = null; + class CacheData { + constructor() { + this.textureCacheId = null; + this.originalRender = null; + this.originalRenderCanvas = null; + this.originalCalculateBounds = null; + this.originalGetLocalBounds = null; + this.originalUpdateTransform = null; + this.originalDestroy = null; + this.originalMask = null; + this.originalFilterArea = null; + this.originalContainsPoint = null; + this.sprite = null; + } + } + Object.defineProperties(DisplayObject.prototype, { + cacheAsBitmapResolution: { + get() { + return this._cacheAsBitmapResolution; + }, + set(resolution) { + if (resolution === this._cacheAsBitmapResolution) { + return; + } + this._cacheAsBitmapResolution = resolution; + if (this.cacheAsBitmap) { + this.cacheAsBitmap = false; + this.cacheAsBitmap = true; + } + } + }, + cacheAsBitmapMultisample: { + get() { + return this._cacheAsBitmapMultisample; + }, + set(multisample) { + if (multisample === this._cacheAsBitmapMultisample) { + return; + } + this._cacheAsBitmapMultisample = multisample; + if (this.cacheAsBitmap) { + this.cacheAsBitmap = false; + this.cacheAsBitmap = true; + } + } + }, + cacheAsBitmap: { + get() { + return this._cacheAsBitmap; + }, + set(value) { + if (this._cacheAsBitmap === value) { + return; + } + this._cacheAsBitmap = value; + let data; + if (value) { + if (!this._cacheData) { + this._cacheData = new CacheData(); + } + data = this._cacheData; + data.originalRender = this.render; + data.originalRenderCanvas = this.renderCanvas; + data.originalUpdateTransform = this.updateTransform; + data.originalCalculateBounds = this.calculateBounds; + data.originalGetLocalBounds = this.getLocalBounds; + data.originalDestroy = this.destroy; + data.originalContainsPoint = this.containsPoint; + data.originalMask = this._mask; + data.originalFilterArea = this.filterArea; + this.render = this._renderCached; + this.renderCanvas = this._renderCachedCanvas; + this.destroy = this._cacheAsBitmapDestroy; + } else { + data = this._cacheData; + if (data.sprite) { + this._destroyCachedDisplayObject(); + } + this.render = data.originalRender; + this.renderCanvas = data.originalRenderCanvas; + this.calculateBounds = data.originalCalculateBounds; + this.getLocalBounds = data.originalGetLocalBounds; + this.destroy = data.originalDestroy; + this.updateTransform = data.originalUpdateTransform; + this.containsPoint = data.originalContainsPoint; + this._mask = data.originalMask; + this.filterArea = data.originalFilterArea; + } + } + } + }); + DisplayObject.prototype._renderCached = function _renderCached(renderer) { + if (!this.visible || this.worldAlpha <= 0 || !this.renderable) { + return; + } + this._initCachedDisplayObject(renderer); + this._cacheData.sprite.transform._worldID = this.transform._worldID; + this._cacheData.sprite.worldAlpha = this.worldAlpha; + this._cacheData.sprite._render(renderer); + }; + DisplayObject.prototype._initCachedDisplayObject = function _initCachedDisplayObject(renderer) { + if (this._cacheData?.sprite) { + return; + } + const cacheAlpha = this.alpha; + this.alpha = 1; + renderer.batch.flush(); + const bounds = this.getLocalBounds(null, true).clone(); + if (this.filters?.length) { + const padding = this.filters[0].padding; + bounds.pad(padding); + } + bounds.ceil(settings.RESOLUTION); + const cachedRenderTexture = renderer.renderTexture.current; + const cachedSourceFrame = renderer.renderTexture.sourceFrame.clone(); + const cachedDestinationFrame = renderer.renderTexture.destinationFrame.clone(); + const cachedProjectionTransform = renderer.projection.transform; + const renderTexture = RenderTexture.create({ + width: bounds.width, + height: bounds.height, + resolution: this.cacheAsBitmapResolution || renderer.resolution, + multisample: this.cacheAsBitmapMultisample ?? renderer.multisample + }); + const textureCacheId = `cacheAsBitmap_${uid()}`; + this._cacheData.textureCacheId = textureCacheId; + BaseTexture.addToCache(renderTexture.baseTexture, textureCacheId); + Texture.addToCache(renderTexture, textureCacheId); + const m = this.transform.localTransform.copyTo(_tempMatrix).invert().translate(-bounds.x, -bounds.y); + this.render = this._cacheData.originalRender; + renderer.render(this, { renderTexture, clear: true, transform: m, skipUpdateTransform: false }); + renderer.framebuffer.blit(); + renderer.projection.transform = cachedProjectionTransform; + renderer.renderTexture.bind(cachedRenderTexture, cachedSourceFrame, cachedDestinationFrame); + this.render = this._renderCached; + this.updateTransform = this.displayObjectUpdateTransform; + this.calculateBounds = this._calculateCachedBounds; + this.getLocalBounds = this._getCachedLocalBounds; + this._mask = null; + this.filterArea = null; + this.alpha = cacheAlpha; + const cachedSprite = new Sprite(renderTexture); + cachedSprite.transform.worldTransform = this.transform.worldTransform; + cachedSprite.anchor.x = -(bounds.x / bounds.width); + cachedSprite.anchor.y = -(bounds.y / bounds.height); + cachedSprite.alpha = cacheAlpha; + cachedSprite._bounds = this._bounds; + this._cacheData.sprite = cachedSprite; + this.transform._parentID = -1; + if (!this.parent) { + this.enableTempParent(); + this.updateTransform(); + this.disableTempParent(null); + } else { + this.updateTransform(); + } + this.containsPoint = cachedSprite.containsPoint.bind(cachedSprite); + }; + DisplayObject.prototype._renderCachedCanvas = function _renderCachedCanvas(renderer) { + if (!this.visible || this.worldAlpha <= 0 || !this.renderable) { + return; + } + this._initCachedDisplayObjectCanvas(renderer); + this._cacheData.sprite.worldAlpha = this.worldAlpha; + this._cacheData.sprite._renderCanvas(renderer); + }; + DisplayObject.prototype._initCachedDisplayObjectCanvas = function _initCachedDisplayObjectCanvas(renderer) { + if (this._cacheData?.sprite) { + return; + } + const bounds = this.getLocalBounds(null, true); + const cacheAlpha = this.alpha; + this.alpha = 1; + const cachedRenderTarget = renderer.canvasContext.activeContext; + const cachedProjectionTransform = renderer._projTransform; + bounds.ceil(settings.RESOLUTION); + const renderTexture = RenderTexture.create({ width: bounds.width, height: bounds.height }); + const textureCacheId = `cacheAsBitmap_${uid()}`; + this._cacheData.textureCacheId = textureCacheId; + BaseTexture.addToCache(renderTexture.baseTexture, textureCacheId); + Texture.addToCache(renderTexture, textureCacheId); + const m = _tempMatrix; + this.transform.localTransform.copyTo(m); + m.invert(); + m.tx -= bounds.x; + m.ty -= bounds.y; + this.renderCanvas = this._cacheData.originalRenderCanvas; + renderer.render(this, { renderTexture, clear: true, transform: m, skipUpdateTransform: false }); + renderer.canvasContext.activeContext = cachedRenderTarget; + renderer._projTransform = cachedProjectionTransform; + this.renderCanvas = this._renderCachedCanvas; + this.updateTransform = this.displayObjectUpdateTransform; + this.calculateBounds = this._calculateCachedBounds; + this.getLocalBounds = this._getCachedLocalBounds; + this._mask = null; + this.filterArea = null; + this.alpha = cacheAlpha; + const cachedSprite = new Sprite(renderTexture); + cachedSprite.transform.worldTransform = this.transform.worldTransform; + cachedSprite.anchor.x = -(bounds.x / bounds.width); + cachedSprite.anchor.y = -(bounds.y / bounds.height); + cachedSprite.alpha = cacheAlpha; + cachedSprite._bounds = this._bounds; + this._cacheData.sprite = cachedSprite; + this.transform._parentID = -1; + if (!this.parent) { + this.parent = renderer._tempDisplayObjectParent; + this.updateTransform(); + this.parent = null; + } else { + this.updateTransform(); + } + this.containsPoint = cachedSprite.containsPoint.bind(cachedSprite); + }; + DisplayObject.prototype._calculateCachedBounds = function _calculateCachedBounds() { + this._bounds.clear(); + this._cacheData.sprite.transform._worldID = this.transform._worldID; + this._cacheData.sprite._calculateBounds(); + this._bounds.updateID = this._boundsID; + }; + DisplayObject.prototype._getCachedLocalBounds = function _getCachedLocalBounds() { + return this._cacheData.sprite.getLocalBounds(null); + }; + DisplayObject.prototype._destroyCachedDisplayObject = function _destroyCachedDisplayObject() { + this._cacheData.sprite._texture.destroy(true); + this._cacheData.sprite = null; + BaseTexture.removeFromCache(this._cacheData.textureCacheId); + Texture.removeFromCache(this._cacheData.textureCacheId); + this._cacheData.textureCacheId = null; + }; + DisplayObject.prototype._cacheAsBitmapDestroy = function _cacheAsBitmapDestroy(options) { + this.cacheAsBitmap = false; + this.destroy(options); + }; + + DisplayObject.prototype.name = null; + Container.prototype.getChildByName = function getChildByName(name, deep) { + for (let i = 0, j = this.children.length; i < j; i++) { + if (this.children[i].name === name) { + return this.children[i]; + } + } + if (deep) { + for (let i = 0, j = this.children.length; i < j; i++) { + const child = this.children[i]; + if (!child.getChildByName) { + continue; + } + const target = child.getChildByName(name, true); + if (target) { + return target; + } + } + } + return null; + }; + + DisplayObject.prototype.getGlobalPosition = function getGlobalPosition(point = new Point(), skipUpdate = false) { + if (this.parent) { + this.parent.toGlobal(this.position, point, skipUpdate); + } else { + point.x = this.position.x; + point.y = this.position.y; + } + return point; + }; + + var fragment$6 = "varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float uAlpha;\n\nvoid main(void)\n{\n gl_FragColor = texture2D(uSampler, vTextureCoord) * uAlpha;\n}\n"; + + class AlphaFilter extends Filter { + constructor(alpha = 1) { + super(defaultVertex, fragment$6, { uAlpha: 1 }); + this.alpha = alpha; + } + get alpha() { + return this.uniforms.uAlpha; + } + set alpha(value) { + this.uniforms.uAlpha = value; + } + } + + const GAUSSIAN_VALUES = { + 5: [0.153388, 0.221461, 0.250301], + 7: [0.071303, 0.131514, 0.189879, 0.214607], + 9: [0.028532, 0.067234, 0.124009, 0.179044, 0.20236], + 11: [93e-4, 0.028002, 0.065984, 0.121703, 0.175713, 0.198596], + 13: [2406e-6, 9255e-6, 0.027867, 0.065666, 0.121117, 0.174868, 0.197641], + 15: [489e-6, 2403e-6, 9246e-6, 0.02784, 0.065602, 0.120999, 0.174697, 0.197448] + }; + const fragTemplate = [ + "varying vec2 vBlurTexCoords[%size%];", + "uniform sampler2D uSampler;", + "void main(void)", + "{", + " gl_FragColor = vec4(0.0);", + " %blur%", + "}" + ].join("\n"); + function generateBlurFragSource(kernelSize) { + const kernel = GAUSSIAN_VALUES[kernelSize]; + const halfLength = kernel.length; + let fragSource = fragTemplate; + let blurLoop = ""; + const template = "gl_FragColor += texture2D(uSampler, vBlurTexCoords[%index%]) * %value%;"; + let value; + for (let i = 0; i < kernelSize; i++) { + let blur = template.replace("%index%", i.toString()); + value = i; + if (i >= halfLength) { + value = kernelSize - i - 1; + } + blur = blur.replace("%value%", kernel[value].toString()); + blurLoop += blur; + blurLoop += "\n"; + } + fragSource = fragSource.replace("%blur%", blurLoop); + fragSource = fragSource.replace("%size%", kernelSize.toString()); + return fragSource; + } + + const vertTemplate = ` + attribute vec2 aVertexPosition; + + uniform mat3 projectionMatrix; + + uniform float strength; + + varying vec2 vBlurTexCoords[%size%]; + + uniform vec4 inputSize; + uniform vec4 outputFrame; + + vec4 filterVertexPosition( void ) + { + vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy; + + return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0); + } + + vec2 filterTextureCoord( void ) + { + return aVertexPosition * (outputFrame.zw * inputSize.zw); + } + + void main(void) + { + gl_Position = filterVertexPosition(); + + vec2 textureCoord = filterTextureCoord(); + %blur% + }`; + function generateBlurVertSource(kernelSize, x) { + const halfLength = Math.ceil(kernelSize / 2); + let vertSource = vertTemplate; + let blurLoop = ""; + let template; + if (x) { + template = "vBlurTexCoords[%index%] = textureCoord + vec2(%sampleIndex% * strength, 0.0);"; + } else { + template = "vBlurTexCoords[%index%] = textureCoord + vec2(0.0, %sampleIndex% * strength);"; + } + for (let i = 0; i < kernelSize; i++) { + let blur = template.replace("%index%", i.toString()); + blur = blur.replace("%sampleIndex%", `${i - (halfLength - 1)}.0`); + blurLoop += blur; + blurLoop += "\n"; + } + vertSource = vertSource.replace("%blur%", blurLoop); + vertSource = vertSource.replace("%size%", kernelSize.toString()); + return vertSource; + } + + class BlurFilterPass extends Filter { + constructor(horizontal, strength = 8, quality = 4, resolution = Filter.defaultResolution, kernelSize = 5) { + const vertSrc = generateBlurVertSource(kernelSize, horizontal); + const fragSrc = generateBlurFragSource(kernelSize); + super(vertSrc, fragSrc); + this.horizontal = horizontal; + this.resolution = resolution; + this._quality = 0; + this.quality = quality; + this.blur = strength; + } + apply(filterManager, input, output, clearMode) { + if (output) { + if (this.horizontal) { + this.uniforms.strength = 1 / output.width * (output.width / input.width); + } else { + this.uniforms.strength = 1 / output.height * (output.height / input.height); + } + } else { + if (this.horizontal) { + this.uniforms.strength = 1 / filterManager.renderer.width * (filterManager.renderer.width / input.width); + } else { + this.uniforms.strength = 1 / filterManager.renderer.height * (filterManager.renderer.height / input.height); + } + } + this.uniforms.strength *= this.strength; + this.uniforms.strength /= this.passes; + if (this.passes === 1) { + filterManager.applyFilter(this, input, output, clearMode); + } else { + const renderTarget = filterManager.getFilterTexture(); + const renderer = filterManager.renderer; + let flip = input; + let flop = renderTarget; + this.state.blend = false; + filterManager.applyFilter(this, flip, flop, CLEAR_MODES.CLEAR); + for (let i = 1; i < this.passes - 1; i++) { + filterManager.bindAndClear(flip, CLEAR_MODES.BLIT); + this.uniforms.uSampler = flop; + const temp = flop; + flop = flip; + flip = temp; + renderer.shader.bind(this); + renderer.geometry.draw(5); + } + this.state.blend = true; + filterManager.applyFilter(this, flop, output, clearMode); + filterManager.returnFilterTexture(renderTarget); + } + } + get blur() { + return this.strength; + } + set blur(value) { + this.padding = 1 + Math.abs(value) * 2; + this.strength = value; + } + get quality() { + return this._quality; + } + set quality(value) { + this._quality = value; + this.passes = value; + } + } + + class BlurFilter extends Filter { + constructor(strength = 8, quality = 4, resolution = Filter.defaultResolution, kernelSize = 5) { + super(); + this._repeatEdgePixels = false; + this.blurXFilter = new BlurFilterPass(true, strength, quality, resolution, kernelSize); + this.blurYFilter = new BlurFilterPass(false, strength, quality, resolution, kernelSize); + this.resolution = resolution; + this.quality = quality; + this.blur = strength; + this.repeatEdgePixels = false; + } + apply(filterManager, input, output, clearMode) { + const xStrength = Math.abs(this.blurXFilter.strength); + const yStrength = Math.abs(this.blurYFilter.strength); + if (xStrength && yStrength) { + const renderTarget = filterManager.getFilterTexture(); + this.blurXFilter.apply(filterManager, input, renderTarget, CLEAR_MODES.CLEAR); + this.blurYFilter.apply(filterManager, renderTarget, output, clearMode); + filterManager.returnFilterTexture(renderTarget); + } else if (yStrength) { + this.blurYFilter.apply(filterManager, input, output, clearMode); + } else { + this.blurXFilter.apply(filterManager, input, output, clearMode); + } + } + updatePadding() { + if (this._repeatEdgePixels) { + this.padding = 0; + } else { + this.padding = Math.max(Math.abs(this.blurXFilter.strength), Math.abs(this.blurYFilter.strength)) * 2; + } + } + get blur() { + return this.blurXFilter.blur; + } + set blur(value) { + this.blurXFilter.blur = this.blurYFilter.blur = value; + this.updatePadding(); + } + get quality() { + return this.blurXFilter.quality; + } + set quality(value) { + this.blurXFilter.quality = this.blurYFilter.quality = value; + } + get blurX() { + return this.blurXFilter.blur; + } + set blurX(value) { + this.blurXFilter.blur = value; + this.updatePadding(); + } + get blurY() { + return this.blurYFilter.blur; + } + set blurY(value) { + this.blurYFilter.blur = value; + this.updatePadding(); + } + get blendMode() { + return this.blurYFilter.blendMode; + } + set blendMode(value) { + this.blurYFilter.blendMode = value; + } + get repeatEdgePixels() { + return this._repeatEdgePixels; + } + set repeatEdgePixels(value) { + this._repeatEdgePixels = value; + this.updatePadding(); + } + } + + var fragment$5 = "varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform float m[20];\nuniform float uAlpha;\n\nvoid main(void)\n{\n vec4 c = texture2D(uSampler, vTextureCoord);\n\n if (uAlpha == 0.0) {\n gl_FragColor = c;\n return;\n }\n\n // Un-premultiply alpha before applying the color matrix. See issue #3539.\n if (c.a > 0.0) {\n c.rgb /= c.a;\n }\n\n vec4 result;\n\n result.r = (m[0] * c.r);\n result.r += (m[1] * c.g);\n result.r += (m[2] * c.b);\n result.r += (m[3] * c.a);\n result.r += m[4];\n\n result.g = (m[5] * c.r);\n result.g += (m[6] * c.g);\n result.g += (m[7] * c.b);\n result.g += (m[8] * c.a);\n result.g += m[9];\n\n result.b = (m[10] * c.r);\n result.b += (m[11] * c.g);\n result.b += (m[12] * c.b);\n result.b += (m[13] * c.a);\n result.b += m[14];\n\n result.a = (m[15] * c.r);\n result.a += (m[16] * c.g);\n result.a += (m[17] * c.b);\n result.a += (m[18] * c.a);\n result.a += m[19];\n\n vec3 rgb = mix(c.rgb, result.rgb, uAlpha);\n\n // Premultiply alpha again.\n rgb *= result.a;\n\n gl_FragColor = vec4(rgb, result.a);\n}\n"; + + class ColorMatrixFilter extends Filter { + constructor() { + const uniforms = { + m: new Float32Array([ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]), + uAlpha: 1 + }; + super(defaultFilterVertex, fragment$5, uniforms); + this.alpha = 1; + } + _loadMatrix(matrix, multiply = false) { + let newMatrix = matrix; + if (multiply) { + this._multiply(newMatrix, this.uniforms.m, matrix); + newMatrix = this._colorMatrix(newMatrix); + } + this.uniforms.m = newMatrix; + } + _multiply(out, a, b) { + out[0] = a[0] * b[0] + a[1] * b[5] + a[2] * b[10] + a[3] * b[15]; + out[1] = a[0] * b[1] + a[1] * b[6] + a[2] * b[11] + a[3] * b[16]; + out[2] = a[0] * b[2] + a[1] * b[7] + a[2] * b[12] + a[3] * b[17]; + out[3] = a[0] * b[3] + a[1] * b[8] + a[2] * b[13] + a[3] * b[18]; + out[4] = a[0] * b[4] + a[1] * b[9] + a[2] * b[14] + a[3] * b[19] + a[4]; + out[5] = a[5] * b[0] + a[6] * b[5] + a[7] * b[10] + a[8] * b[15]; + out[6] = a[5] * b[1] + a[6] * b[6] + a[7] * b[11] + a[8] * b[16]; + out[7] = a[5] * b[2] + a[6] * b[7] + a[7] * b[12] + a[8] * b[17]; + out[8] = a[5] * b[3] + a[6] * b[8] + a[7] * b[13] + a[8] * b[18]; + out[9] = a[5] * b[4] + a[6] * b[9] + a[7] * b[14] + a[8] * b[19] + a[9]; + out[10] = a[10] * b[0] + a[11] * b[5] + a[12] * b[10] + a[13] * b[15]; + out[11] = a[10] * b[1] + a[11] * b[6] + a[12] * b[11] + a[13] * b[16]; + out[12] = a[10] * b[2] + a[11] * b[7] + a[12] * b[12] + a[13] * b[17]; + out[13] = a[10] * b[3] + a[11] * b[8] + a[12] * b[13] + a[13] * b[18]; + out[14] = a[10] * b[4] + a[11] * b[9] + a[12] * b[14] + a[13] * b[19] + a[14]; + out[15] = a[15] * b[0] + a[16] * b[5] + a[17] * b[10] + a[18] * b[15]; + out[16] = a[15] * b[1] + a[16] * b[6] + a[17] * b[11] + a[18] * b[16]; + out[17] = a[15] * b[2] + a[16] * b[7] + a[17] * b[12] + a[18] * b[17]; + out[18] = a[15] * b[3] + a[16] * b[8] + a[17] * b[13] + a[18] * b[18]; + out[19] = a[15] * b[4] + a[16] * b[9] + a[17] * b[14] + a[18] * b[19] + a[19]; + return out; + } + _colorMatrix(matrix) { + const m = new Float32Array(matrix); + m[4] /= 255; + m[9] /= 255; + m[14] /= 255; + m[19] /= 255; + return m; + } + brightness(b, multiply) { + const matrix = [ + b, + 0, + 0, + 0, + 0, + 0, + b, + 0, + 0, + 0, + 0, + 0, + b, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + tint(color, multiply) { + const [r, g, b] = Color.shared.setValue(color).toArray(); + const matrix = [ + r, + 0, + 0, + 0, + 0, + 0, + g, + 0, + 0, + 0, + 0, + 0, + b, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + greyscale(scale, multiply) { + const matrix = [ + scale, + scale, + scale, + 0, + 0, + scale, + scale, + scale, + 0, + 0, + scale, + scale, + scale, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + blackAndWhite(multiply) { + const matrix = [ + 0.3, + 0.6, + 0.1, + 0, + 0, + 0.3, + 0.6, + 0.1, + 0, + 0, + 0.3, + 0.6, + 0.1, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + hue(rotation, multiply) { + rotation = (rotation || 0) / 180 * Math.PI; + const cosR = Math.cos(rotation); + const sinR = Math.sin(rotation); + const sqrt = Math.sqrt; + const w = 1 / 3; + const sqrW = sqrt(w); + const a00 = cosR + (1 - cosR) * w; + const a01 = w * (1 - cosR) - sqrW * sinR; + const a02 = w * (1 - cosR) + sqrW * sinR; + const a10 = w * (1 - cosR) + sqrW * sinR; + const a11 = cosR + w * (1 - cosR); + const a12 = w * (1 - cosR) - sqrW * sinR; + const a20 = w * (1 - cosR) - sqrW * sinR; + const a21 = w * (1 - cosR) + sqrW * sinR; + const a22 = cosR + w * (1 - cosR); + const matrix = [ + a00, + a01, + a02, + 0, + 0, + a10, + a11, + a12, + 0, + 0, + a20, + a21, + a22, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + contrast(amount, multiply) { + const v = (amount || 0) + 1; + const o = -0.5 * (v - 1); + const matrix = [ + v, + 0, + 0, + 0, + o, + 0, + v, + 0, + 0, + o, + 0, + 0, + v, + 0, + o, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + saturate(amount = 0, multiply) { + const x = amount * 2 / 3 + 1; + const y = (x - 1) * -0.5; + const matrix = [ + x, + y, + y, + 0, + 0, + y, + x, + y, + 0, + 0, + y, + y, + x, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + desaturate() { + this.saturate(-1); + } + negative(multiply) { + const matrix = [ + -1, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 1, + 0, + 0, + 0, + -1, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + sepia(multiply) { + const matrix = [ + 0.393, + 0.7689999, + 0.18899999, + 0, + 0, + 0.349, + 0.6859999, + 0.16799999, + 0, + 0, + 0.272, + 0.5339999, + 0.13099999, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + technicolor(multiply) { + const matrix = [ + 1.9125277891456083, + -0.8545344976951645, + -0.09155508482755585, + 0, + 11.793603434377337, + -0.3087833385928097, + 1.7658908555458428, + -0.10601743074722245, + 0, + -70.35205161461398, + -0.231103377548616, + -0.7501899197440212, + 1.847597816108189, + 0, + 30.950940869491138, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + polaroid(multiply) { + const matrix = [ + 1.438, + -0.062, + -0.062, + 0, + 0, + -0.122, + 1.378, + -0.122, + 0, + 0, + -0.016, + -0.016, + 1.483, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + toBGR(multiply) { + const matrix = [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + kodachrome(multiply) { + const matrix = [ + 1.1285582396593525, + -0.3967382283601348, + -0.03992559172921793, + 0, + 63.72958762196502, + -0.16404339962244616, + 1.0835251566291304, + -0.05498805115633132, + 0, + 24.732407896706203, + -0.16786010706155763, + -0.5603416277695248, + 1.6014850761964943, + 0, + 35.62982807460946, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + browni(multiply) { + const matrix = [ + 0.5997023498159715, + 0.34553243048391263, + -0.2708298674538042, + 0, + 47.43192855600873, + -0.037703249837783157, + 0.8609577587992641, + 0.15059552388459913, + 0, + -36.96841498319127, + 0.24113635128153335, + -0.07441037908422492, + 0.44972182064877153, + 0, + -7.562075277591283, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + vintage(multiply) { + const matrix = [ + 0.6279345635605994, + 0.3202183420819367, + -0.03965408211312453, + 0, + 9.651285835294123, + 0.02578397704808868, + 0.6441188644374771, + 0.03259127616149294, + 0, + 7.462829176470591, + 0.0466055556782719, + -0.0851232987247891, + 0.5241648018700465, + 0, + 5.159190588235296, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + colorTone(desaturation, toned, lightColor, darkColor, multiply) { + desaturation = desaturation || 0.2; + toned = toned || 0.15; + lightColor = lightColor || 16770432; + darkColor = darkColor || 3375104; + const temp = Color.shared; + const [lR, lG, lB] = temp.setValue(lightColor).toArray(); + const [dR, dG, dB] = temp.setValue(darkColor).toArray(); + const matrix = [ + 0.3, + 0.59, + 0.11, + 0, + 0, + lR, + lG, + lB, + desaturation, + 0, + dR, + dG, + dB, + toned, + 0, + lR - dR, + lG - dG, + lB - dB, + 0, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + night(intensity, multiply) { + intensity = intensity || 0.1; + const matrix = [ + intensity * -2, + -intensity, + 0, + 0, + 0, + -intensity, + 0, + intensity, + 0, + 0, + 0, + intensity, + intensity * 2, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + predator(amount, multiply) { + const matrix = [ + 11.224130630493164 * amount, + -4.794486999511719 * amount, + -2.8746118545532227 * amount, + 0 * amount, + 0.40342438220977783 * amount, + -3.6330697536468506 * amount, + 9.193157196044922 * amount, + -2.951810836791992 * amount, + 0 * amount, + -1.316135048866272 * amount, + -3.2184197902679443 * amount, + -4.2375030517578125 * amount, + 7.476448059082031 * amount, + 0 * amount, + 0.8044459223747253 * amount, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + lsd(multiply) { + const matrix = [ + 2, + -0.4, + 0.5, + 0, + 0, + -0.5, + 2, + -0.4, + 0, + 0, + -0.4, + -0.5, + 3, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, multiply); + } + reset() { + const matrix = [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]; + this._loadMatrix(matrix, false); + } + get matrix() { + return this.uniforms.m; + } + set matrix(value) { + this.uniforms.m = value; + } + get alpha() { + return this.uniforms.uAlpha; + } + set alpha(value) { + this.uniforms.uAlpha = value; + } + } + ColorMatrixFilter.prototype.grayscale = ColorMatrixFilter.prototype.greyscale; + + var fragment$4 = "varying vec2 vFilterCoord;\nvarying vec2 vTextureCoord;\n\nuniform vec2 scale;\nuniform mat2 rotation;\nuniform sampler2D uSampler;\nuniform sampler2D mapSampler;\n\nuniform highp vec4 inputSize;\nuniform vec4 inputClamp;\n\nvoid main(void)\n{\n vec4 map = texture2D(mapSampler, vFilterCoord);\n\n map -= 0.5;\n map.xy = scale * inputSize.zw * (rotation * map.xy);\n\n gl_FragColor = texture2D(uSampler, clamp(vec2(vTextureCoord.x + map.x, vTextureCoord.y + map.y), inputClamp.xy, inputClamp.zw));\n}\n"; + + var vertex$3 = "attribute vec2 aVertexPosition;\n\nuniform mat3 projectionMatrix;\nuniform mat3 filterMatrix;\n\nvarying vec2 vTextureCoord;\nvarying vec2 vFilterCoord;\n\nuniform vec4 inputSize;\nuniform vec4 outputFrame;\n\nvec4 filterVertexPosition( void )\n{\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\n\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord( void )\n{\n return aVertexPosition * (outputFrame.zw * inputSize.zw);\n}\n\nvoid main(void)\n{\n\tgl_Position = filterVertexPosition();\n\tvTextureCoord = filterTextureCoord();\n\tvFilterCoord = ( filterMatrix * vec3( vTextureCoord, 1.0) ).xy;\n}\n"; + + class DisplacementFilter extends Filter { + constructor(sprite, scale) { + const maskMatrix = new Matrix(); + sprite.renderable = false; + super(vertex$3, fragment$4, { + mapSampler: sprite._texture, + filterMatrix: maskMatrix, + scale: { x: 1, y: 1 }, + rotation: new Float32Array([1, 0, 0, 1]) + }); + this.maskSprite = sprite; + this.maskMatrix = maskMatrix; + if (scale === null || scale === void 0) { + scale = 20; + } + this.scale = new Point(scale, scale); + } + apply(filterManager, input, output, clearMode) { + this.uniforms.filterMatrix = filterManager.calculateSpriteMatrix(this.maskMatrix, this.maskSprite); + this.uniforms.scale.x = this.scale.x; + this.uniforms.scale.y = this.scale.y; + const wt = this.maskSprite.worldTransform; + const lenX = Math.sqrt(wt.a * wt.a + wt.b * wt.b); + const lenY = Math.sqrt(wt.c * wt.c + wt.d * wt.d); + if (lenX !== 0 && lenY !== 0) { + this.uniforms.rotation[0] = wt.a / lenX; + this.uniforms.rotation[1] = wt.b / lenX; + this.uniforms.rotation[2] = wt.c / lenY; + this.uniforms.rotation[3] = wt.d / lenY; + } + filterManager.applyFilter(this, input, output, clearMode); + } + get map() { + return this.uniforms.mapSampler; + } + set map(value) { + this.uniforms.mapSampler = value; + } + } + + var fragment$3 = "varying vec2 v_rgbNW;\nvarying vec2 v_rgbNE;\nvarying vec2 v_rgbSW;\nvarying vec2 v_rgbSE;\nvarying vec2 v_rgbM;\n\nvarying vec2 vFragCoord;\nuniform sampler2D uSampler;\nuniform highp vec4 inputSize;\n\n\n/**\n Basic FXAA implementation based on the code on geeks3d.com with the\n modification that the texture2DLod stuff was removed since it's\n unsupported by WebGL.\n\n --\n\n From:\n https://github.com/mitsuhiko/webgl-meincraft\n\n Copyright (c) 2011 by Armin Ronacher.\n\n Some rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are\n met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the following\n disclaimer in the documentation and/or other materials provided\n with the distribution.\n\n * The names of the contributors may not be used to endorse or\n promote products derived from this software without specific\n prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef FXAA_REDUCE_MIN\n#define FXAA_REDUCE_MIN (1.0/ 128.0)\n#endif\n#ifndef FXAA_REDUCE_MUL\n#define FXAA_REDUCE_MUL (1.0 / 8.0)\n#endif\n#ifndef FXAA_SPAN_MAX\n#define FXAA_SPAN_MAX 8.0\n#endif\n\n//optimized version for mobile, where dependent\n//texture reads can be a bottleneck\nvec4 fxaa(sampler2D tex, vec2 fragCoord, vec2 inverseVP,\n vec2 v_rgbNW, vec2 v_rgbNE,\n vec2 v_rgbSW, vec2 v_rgbSE,\n vec2 v_rgbM) {\n vec4 color;\n vec3 rgbNW = texture2D(tex, v_rgbNW).xyz;\n vec3 rgbNE = texture2D(tex, v_rgbNE).xyz;\n vec3 rgbSW = texture2D(tex, v_rgbSW).xyz;\n vec3 rgbSE = texture2D(tex, v_rgbSE).xyz;\n vec4 texColor = texture2D(tex, v_rgbM);\n vec3 rgbM = texColor.xyz;\n vec3 luma = vec3(0.299, 0.587, 0.114);\n float lumaNW = dot(rgbNW, luma);\n float lumaNE = dot(rgbNE, luma);\n float lumaSW = dot(rgbSW, luma);\n float lumaSE = dot(rgbSE, luma);\n float lumaM = dot(rgbM, luma);\n float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));\n float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));\n\n mediump vec2 dir;\n dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n\n float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) *\n (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\n\n float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\n dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),\n max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\n dir * rcpDirMin)) * inverseVP;\n\n vec3 rgbA = 0.5 * (\n texture2D(tex, fragCoord * inverseVP + dir * (1.0 / 3.0 - 0.5)).xyz +\n texture2D(tex, fragCoord * inverseVP + dir * (2.0 / 3.0 - 0.5)).xyz);\n vec3 rgbB = rgbA * 0.5 + 0.25 * (\n texture2D(tex, fragCoord * inverseVP + dir * -0.5).xyz +\n texture2D(tex, fragCoord * inverseVP + dir * 0.5).xyz);\n\n float lumaB = dot(rgbB, luma);\n if ((lumaB < lumaMin) || (lumaB > lumaMax))\n color = vec4(rgbA, texColor.a);\n else\n color = vec4(rgbB, texColor.a);\n return color;\n}\n\nvoid main() {\n\n vec4 color;\n\n color = fxaa(uSampler, vFragCoord, inputSize.zw, v_rgbNW, v_rgbNE, v_rgbSW, v_rgbSE, v_rgbM);\n\n gl_FragColor = color;\n}\n"; + + var vertex$2 = "\nattribute vec2 aVertexPosition;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 v_rgbNW;\nvarying vec2 v_rgbNE;\nvarying vec2 v_rgbSW;\nvarying vec2 v_rgbSE;\nvarying vec2 v_rgbM;\n\nvarying vec2 vFragCoord;\n\nuniform vec4 inputSize;\nuniform vec4 outputFrame;\n\nvec4 filterVertexPosition( void )\n{\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\n\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\n}\n\nvoid texcoords(vec2 fragCoord, vec2 inverseVP,\n out vec2 v_rgbNW, out vec2 v_rgbNE,\n out vec2 v_rgbSW, out vec2 v_rgbSE,\n out vec2 v_rgbM) {\n v_rgbNW = (fragCoord + vec2(-1.0, -1.0)) * inverseVP;\n v_rgbNE = (fragCoord + vec2(1.0, -1.0)) * inverseVP;\n v_rgbSW = (fragCoord + vec2(-1.0, 1.0)) * inverseVP;\n v_rgbSE = (fragCoord + vec2(1.0, 1.0)) * inverseVP;\n v_rgbM = vec2(fragCoord * inverseVP);\n}\n\nvoid main(void) {\n\n gl_Position = filterVertexPosition();\n\n vFragCoord = aVertexPosition * outputFrame.zw;\n\n texcoords(vFragCoord, inputSize.zw, v_rgbNW, v_rgbNE, v_rgbSW, v_rgbSE, v_rgbM);\n}\n"; + + class FXAAFilter extends Filter { + constructor() { + super(vertex$2, fragment$3); + } + } + + var fragment$2 = "precision highp float;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform float uNoise;\nuniform float uSeed;\nuniform sampler2D uSampler;\n\nfloat rand(vec2 co)\n{\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main()\n{\n vec4 color = texture2D(uSampler, vTextureCoord);\n float randomValue = rand(gl_FragCoord.xy * uSeed);\n float diff = (randomValue - 0.5) * uNoise;\n\n // Un-premultiply alpha before applying the color matrix. See issue #3539.\n if (color.a > 0.0) {\n color.rgb /= color.a;\n }\n\n color.r += diff;\n color.g += diff;\n color.b += diff;\n\n // Premultiply alpha again.\n color.rgb *= color.a;\n\n gl_FragColor = color;\n}\n"; + + class NoiseFilter extends Filter { + constructor(noise = 0.5, seed = Math.random()) { + super(defaultFilterVertex, fragment$2, { + uNoise: 0, + uSeed: 0 + }); + this.noise = noise; + this.seed = seed; + } + get noise() { + return this.uniforms.uNoise; + } + set noise(value) { + this.uniforms.uNoise = value; + } + get seed() { + return this.uniforms.uSeed; + } + set seed(value) { + this.uniforms.uSeed = value; + } + } + + const filters = { + AlphaFilter, + BlurFilter, + BlurFilterPass, + ColorMatrixFilter, + DisplacementFilter, + FXAAFilter, + NoiseFilter + }; + Object.entries(filters).forEach(([key, FilterClass]) => { + Object.defineProperty(filters, key, { + get() { + deprecation("7.1.0", `filters.${key} has moved to ${key}`); + return FilterClass; + } + }); + }); + + class EventsTickerClass { + constructor() { + this.interactionFrequency = 10; + this._deltaTime = 0; + this._didMove = false; + this.tickerAdded = false; + this._pauseUpdate = true; + } + init(events) { + this.removeTickerListener(); + this.events = events; + this.interactionFrequency = 10; + this._deltaTime = 0; + this._didMove = false; + this.tickerAdded = false; + this._pauseUpdate = true; + } + get pauseUpdate() { + return this._pauseUpdate; + } + set pauseUpdate(paused) { + this._pauseUpdate = paused; + } + addTickerListener() { + if (this.tickerAdded || !this.domElement) { + return; + } + Ticker.system.add(this.tickerUpdate, this, UPDATE_PRIORITY.INTERACTION); + this.tickerAdded = true; + } + removeTickerListener() { + if (!this.tickerAdded) { + return; + } + Ticker.system.remove(this.tickerUpdate, this); + this.tickerAdded = false; + } + pointerMoved() { + this._didMove = true; + } + update() { + if (!this.domElement || this._pauseUpdate) { + return; + } + if (this._didMove) { + this._didMove = false; + return; + } + const rootPointerEvent = this.events["rootPointerEvent"]; + if (this.events.supportsTouchEvents && rootPointerEvent.pointerType === "touch") { + return; + } + globalThis.document.dispatchEvent(new PointerEvent("pointermove", { + clientX: rootPointerEvent.clientX, + clientY: rootPointerEvent.clientY + })); + } + tickerUpdate(deltaTime) { + this._deltaTime += deltaTime; + if (this._deltaTime < this.interactionFrequency) { + return; + } + this._deltaTime = 0; + this.update(); + } + } + const EventsTicker = new EventsTickerClass(); + + class FederatedEvent { + constructor(manager) { + this.bubbles = true; + this.cancelBubble = true; + this.cancelable = false; + this.composed = false; + this.defaultPrevented = false; + this.eventPhase = FederatedEvent.prototype.NONE; + this.propagationStopped = false; + this.propagationImmediatelyStopped = false; + this.layer = new Point(); + this.page = new Point(); + this.NONE = 0; + this.CAPTURING_PHASE = 1; + this.AT_TARGET = 2; + this.BUBBLING_PHASE = 3; + this.manager = manager; + } + get layerX() { + return this.layer.x; + } + get layerY() { + return this.layer.y; + } + get pageX() { + return this.page.x; + } + get pageY() { + return this.page.y; + } + get data() { + return this; + } + composedPath() { + if (this.manager && (!this.path || this.path[this.path.length - 1] !== this.target)) { + this.path = this.target ? this.manager.propagationPath(this.target) : []; + } + return this.path; + } + initEvent(_type, _bubbles, _cancelable) { + throw new Error("initEvent() is a legacy DOM API. It is not implemented in the Federated Events API."); + } + initUIEvent(_typeArg, _bubblesArg, _cancelableArg, _viewArg, _detailArg) { + throw new Error("initUIEvent() is a legacy DOM API. It is not implemented in the Federated Events API."); + } + preventDefault() { + if (this.nativeEvent instanceof Event && this.nativeEvent.cancelable) { + this.nativeEvent.preventDefault(); + } + this.defaultPrevented = true; + } + stopImmediatePropagation() { + this.propagationImmediatelyStopped = true; + } + stopPropagation() { + this.propagationStopped = true; + } + } + + class FederatedMouseEvent extends FederatedEvent { + constructor() { + super(...arguments); + this.client = new Point(); + this.movement = new Point(); + this.offset = new Point(); + this.global = new Point(); + this.screen = new Point(); + } + get clientX() { + return this.client.x; + } + get clientY() { + return this.client.y; + } + get x() { + return this.clientX; + } + get y() { + return this.clientY; + } + get movementX() { + return this.movement.x; + } + get movementY() { + return this.movement.y; + } + get offsetX() { + return this.offset.x; + } + get offsetY() { + return this.offset.y; + } + get globalX() { + return this.global.x; + } + get globalY() { + return this.global.y; + } + get screenX() { + return this.screen.x; + } + get screenY() { + return this.screen.y; + } + getLocalPosition(displayObject, point, globalPos) { + return displayObject.worldTransform.applyInverse(globalPos || this.global, point); + } + getModifierState(key) { + return "getModifierState" in this.nativeEvent && this.nativeEvent.getModifierState(key); + } + initMouseEvent(_typeArg, _canBubbleArg, _cancelableArg, _viewArg, _detailArg, _screenXArg, _screenYArg, _clientXArg, _clientYArg, _ctrlKeyArg, _altKeyArg, _shiftKeyArg, _metaKeyArg, _buttonArg, _relatedTargetArg) { + throw new Error("Method not implemented."); + } + } + + class FederatedPointerEvent extends FederatedMouseEvent { + constructor() { + super(...arguments); + this.width = 0; + this.height = 0; + this.isPrimary = false; + } + getCoalescedEvents() { + if (this.type === "pointermove" || this.type === "mousemove" || this.type === "touchmove") { + return [this]; + } + return []; + } + getPredictedEvents() { + throw new Error("getPredictedEvents is not supported!"); + } + } + + class FederatedWheelEvent extends FederatedMouseEvent { + constructor() { + super(...arguments); + this.DOM_DELTA_PIXEL = 0; + this.DOM_DELTA_LINE = 1; + this.DOM_DELTA_PAGE = 2; + } + } + FederatedWheelEvent.DOM_DELTA_PIXEL = 0; + FederatedWheelEvent.DOM_DELTA_LINE = 1; + FederatedWheelEvent.DOM_DELTA_PAGE = 2; + + const PROPAGATION_LIMIT = 2048; + const tempHitLocation = new Point(); + const tempLocalMapping = new Point(); + class EventBoundary { + constructor(rootTarget) { + this.dispatch = new eventemitter3(); + this.moveOnAll = false; + this.enableGlobalMoveEvents = true; + this.mappingState = { + trackingData: {} + }; + this.eventPool = /* @__PURE__ */ new Map(); + this._allInteractiveElements = []; + this._hitElements = []; + this._collectInteractiveElements = false; + this.rootTarget = rootTarget; + this.hitPruneFn = this.hitPruneFn.bind(this); + this.hitTestFn = this.hitTestFn.bind(this); + this.mapPointerDown = this.mapPointerDown.bind(this); + this.mapPointerMove = this.mapPointerMove.bind(this); + this.mapPointerOut = this.mapPointerOut.bind(this); + this.mapPointerOver = this.mapPointerOver.bind(this); + this.mapPointerUp = this.mapPointerUp.bind(this); + this.mapPointerUpOutside = this.mapPointerUpOutside.bind(this); + this.mapWheel = this.mapWheel.bind(this); + this.mappingTable = {}; + this.addEventMapping("pointerdown", this.mapPointerDown); + this.addEventMapping("pointermove", this.mapPointerMove); + this.addEventMapping("pointerout", this.mapPointerOut); + this.addEventMapping("pointerleave", this.mapPointerOut); + this.addEventMapping("pointerover", this.mapPointerOver); + this.addEventMapping("pointerup", this.mapPointerUp); + this.addEventMapping("pointerupoutside", this.mapPointerUpOutside); + this.addEventMapping("wheel", this.mapWheel); + } + addEventMapping(type, fn) { + if (!this.mappingTable[type]) { + this.mappingTable[type] = []; + } + this.mappingTable[type].push({ + fn, + priority: 0 + }); + this.mappingTable[type].sort((a, b) => a.priority - b.priority); + } + dispatchEvent(e, type) { + e.propagationStopped = false; + e.propagationImmediatelyStopped = false; + this.propagate(e, type); + this.dispatch.emit(type || e.type, e); + } + mapEvent(e) { + if (!this.rootTarget) { + return; + } + const mappers = this.mappingTable[e.type]; + if (mappers) { + for (let i = 0, j = mappers.length; i < j; i++) { + mappers[i].fn(e); + } + } else { + console.warn(`[EventBoundary]: Event mapping not defined for ${e.type}`); + } + } + hitTest(x, y) { + EventsTicker.pauseUpdate = true; + const invertedPath = this.hitTestRecursive(this.rootTarget, this.rootTarget.eventMode, tempHitLocation.set(x, y), this.hitTestFn, this.hitPruneFn); + return invertedPath && invertedPath[0]; + } + propagate(e, type) { + if (!e.target) { + return; + } + const composedPath = e.composedPath(); + e.eventPhase = e.CAPTURING_PHASE; + for (let i = 0, j = composedPath.length - 1; i < j; i++) { + e.currentTarget = composedPath[i]; + this.notifyTarget(e, type); + if (e.propagationStopped || e.propagationImmediatelyStopped) + return; + } + e.eventPhase = e.AT_TARGET; + e.currentTarget = e.target; + this.notifyTarget(e, type); + if (e.propagationStopped || e.propagationImmediatelyStopped) + return; + e.eventPhase = e.BUBBLING_PHASE; + for (let i = composedPath.length - 2; i >= 0; i--) { + e.currentTarget = composedPath[i]; + this.notifyTarget(e, type); + if (e.propagationStopped || e.propagationImmediatelyStopped) + return; + } + } + all(e, type, targets = this._allInteractiveElements) { + if (targets.length === 0) + return; + e.eventPhase = e.BUBBLING_PHASE; + const events = Array.isArray(type) ? type : [type]; + for (let i = targets.length - 1; i >= 0; i--) { + events.forEach((event) => { + e.currentTarget = targets[i]; + this.notifyTarget(e, event); + }); + } + } + propagationPath(target) { + const propagationPath = [target]; + for (let i = 0; i < PROPAGATION_LIMIT && target !== this.rootTarget; i++) { + if (!target.parent) { + throw new Error("Cannot find propagation path to disconnected target"); + } + propagationPath.push(target.parent); + target = target.parent; + } + propagationPath.reverse(); + return propagationPath; + } + hitTestRecursive(currentTarget, eventMode, location, testFn, pruneFn) { + if (pruneFn(currentTarget, location)) { + return null; + } + if (currentTarget.eventMode === "dynamic" || eventMode === "dynamic") { + EventsTicker.pauseUpdate = false; + } + if (currentTarget.interactiveChildren && currentTarget.children) { + const children = currentTarget.children; + for (let i = children.length - 1; i >= 0; i--) { + const child = children[i]; + const nestedHit = this.hitTestRecursive(child, this._isInteractive(eventMode) ? eventMode : child.eventMode, location, testFn, pruneFn); + if (nestedHit) { + if (nestedHit.length > 0 && !nestedHit[nestedHit.length - 1].parent) { + continue; + } + const isInteractive = currentTarget.isInteractive(); + if (nestedHit.length > 0 || isInteractive) { + if (this._collectInteractiveElements && isInteractive) { + this._allInteractiveElements.push(currentTarget); + } + nestedHit.push(currentTarget); + } + if (this._collectInteractiveElements && this._hitElements.length === 0) { + this._hitElements = nestedHit; + } + if (!this._collectInteractiveElements) + return nestedHit; + } + } + } + const isInteractiveMode = this._isInteractive(eventMode); + const isInteractiveTarget = currentTarget.isInteractive(); + if (this._collectInteractiveElements) { + if (isInteractiveMode && isInteractiveTarget) + this._allInteractiveElements.push(currentTarget); + if (this._hitElements.length > 0) + return null; + } + if (isInteractiveMode && testFn(currentTarget, location)) { + return isInteractiveTarget ? [currentTarget] : []; + } + return null; + } + _isInteractive(int) { + return int === "static" || int === "dynamic"; + } + hitPruneFn(displayObject, location) { + if (!displayObject || displayObject.isMask || !displayObject.visible || !displayObject.renderable) { + return true; + } + if (displayObject.eventMode === "none") { + return true; + } + if (displayObject.eventMode === "passive" && !displayObject.interactiveChildren) { + return true; + } + if (displayObject.isMask) { + return true; + } + if (this._collectInteractiveElements) + return false; + if (displayObject.hitArea) { + displayObject.worldTransform.applyInverse(location, tempLocalMapping); + if (!displayObject.hitArea.contains(tempLocalMapping.x, tempLocalMapping.y)) { + return true; + } + } + if (displayObject._mask) { + const maskObject = displayObject._mask.isMaskData ? displayObject._mask.maskObject : displayObject._mask; + if (maskObject && !maskObject.containsPoint?.(location)) { + return true; + } + } + return false; + } + hitTestFn(displayObject, location) { + if (displayObject.eventMode === "passive") { + return false; + } + if (displayObject.hitArea) { + return true; + } + if (displayObject.containsPoint) { + return displayObject.containsPoint(location); + } + return false; + } + notifyTarget(e, type) { + type = type ?? e.type; + const handlerKey = `on${type}`; + e.currentTarget[handlerKey]?.(e); + const key = e.eventPhase === e.CAPTURING_PHASE || e.eventPhase === e.AT_TARGET ? `${type}capture` : type; + this.notifyListeners(e, key); + if (e.eventPhase === e.AT_TARGET) { + this.notifyListeners(e, type); + } + } + mapPointerDown(from) { + if (!(from instanceof FederatedPointerEvent)) { + console.warn("EventBoundary cannot map a non-pointer event as a pointer event"); + return; + } + const e = this.createPointerEvent(from); + this.dispatchEvent(e, "pointerdown"); + if (e.pointerType === "touch") { + this.dispatchEvent(e, "touchstart"); + } else if (e.pointerType === "mouse" || e.pointerType === "pen") { + const isRightButton = e.button === 2; + this.dispatchEvent(e, isRightButton ? "rightdown" : "mousedown"); + } + const trackingData = this.trackingData(from.pointerId); + trackingData.pressTargetsByButton[from.button] = e.composedPath(); + this.freeEvent(e); + } + mapPointerMove(from) { + if (!(from instanceof FederatedPointerEvent)) { + console.warn("EventBoundary cannot map a non-pointer event as a pointer event"); + return; + } + this._allInteractiveElements.length = 0; + this._hitElements.length = 0; + this._collectInteractiveElements = true; + const e = this.createPointerEvent(from); + this._collectInteractiveElements = false; + const isMouse = e.pointerType === "mouse" || e.pointerType === "pen"; + const trackingData = this.trackingData(from.pointerId); + const outTarget = this.findMountedTarget(trackingData.overTargets); + if (trackingData.overTargets?.length > 0 && outTarget !== e.target) { + const outType = from.type === "mousemove" ? "mouseout" : "pointerout"; + const outEvent = this.createPointerEvent(from, outType, outTarget); + this.dispatchEvent(outEvent, "pointerout"); + if (isMouse) + this.dispatchEvent(outEvent, "mouseout"); + if (!e.composedPath().includes(outTarget)) { + const leaveEvent = this.createPointerEvent(from, "pointerleave", outTarget); + leaveEvent.eventPhase = leaveEvent.AT_TARGET; + while (leaveEvent.target && !e.composedPath().includes(leaveEvent.target)) { + leaveEvent.currentTarget = leaveEvent.target; + this.notifyTarget(leaveEvent); + if (isMouse) + this.notifyTarget(leaveEvent, "mouseleave"); + leaveEvent.target = leaveEvent.target.parent; + } + this.freeEvent(leaveEvent); + } + this.freeEvent(outEvent); + } + if (outTarget !== e.target) { + const overType = from.type === "mousemove" ? "mouseover" : "pointerover"; + const overEvent = this.clonePointerEvent(e, overType); + this.dispatchEvent(overEvent, "pointerover"); + if (isMouse) + this.dispatchEvent(overEvent, "mouseover"); + let overTargetAncestor = outTarget?.parent; + while (overTargetAncestor && overTargetAncestor !== this.rootTarget.parent) { + if (overTargetAncestor === e.target) + break; + overTargetAncestor = overTargetAncestor.parent; + } + const didPointerEnter = !overTargetAncestor || overTargetAncestor === this.rootTarget.parent; + if (didPointerEnter) { + const enterEvent = this.clonePointerEvent(e, "pointerenter"); + enterEvent.eventPhase = enterEvent.AT_TARGET; + while (enterEvent.target && enterEvent.target !== outTarget && enterEvent.target !== this.rootTarget.parent) { + enterEvent.currentTarget = enterEvent.target; + this.notifyTarget(enterEvent); + if (isMouse) + this.notifyTarget(enterEvent, "mouseenter"); + enterEvent.target = enterEvent.target.parent; + } + this.freeEvent(enterEvent); + } + this.freeEvent(overEvent); + } + const allMethods = []; + const allowGlobalPointerEvents = this.enableGlobalMoveEvents ?? true; + this.moveOnAll ? allMethods.push("pointermove") : this.dispatchEvent(e, "pointermove"); + allowGlobalPointerEvents && allMethods.push("globalpointermove"); + if (e.pointerType === "touch") { + this.moveOnAll ? allMethods.splice(1, 0, "touchmove") : this.dispatchEvent(e, "touchmove"); + allowGlobalPointerEvents && allMethods.push("globaltouchmove"); + } + if (isMouse) { + this.moveOnAll ? allMethods.splice(1, 0, "mousemove") : this.dispatchEvent(e, "mousemove"); + allowGlobalPointerEvents && allMethods.push("globalmousemove"); + this.cursor = e.target?.cursor; + } + if (allMethods.length > 0) { + this.all(e, allMethods); + } + this._allInteractiveElements.length = 0; + this._hitElements.length = 0; + trackingData.overTargets = e.composedPath(); + this.freeEvent(e); + } + mapPointerOver(from) { + if (!(from instanceof FederatedPointerEvent)) { + console.warn("EventBoundary cannot map a non-pointer event as a pointer event"); + return; + } + const trackingData = this.trackingData(from.pointerId); + const e = this.createPointerEvent(from); + const isMouse = e.pointerType === "mouse" || e.pointerType === "pen"; + this.dispatchEvent(e, "pointerover"); + if (isMouse) + this.dispatchEvent(e, "mouseover"); + if (e.pointerType === "mouse") + this.cursor = e.target?.cursor; + const enterEvent = this.clonePointerEvent(e, "pointerenter"); + enterEvent.eventPhase = enterEvent.AT_TARGET; + while (enterEvent.target && enterEvent.target !== this.rootTarget.parent) { + enterEvent.currentTarget = enterEvent.target; + this.notifyTarget(enterEvent); + if (isMouse) + this.notifyTarget(enterEvent, "mouseenter"); + enterEvent.target = enterEvent.target.parent; + } + trackingData.overTargets = e.composedPath(); + this.freeEvent(e); + this.freeEvent(enterEvent); + } + mapPointerOut(from) { + if (!(from instanceof FederatedPointerEvent)) { + console.warn("EventBoundary cannot map a non-pointer event as a pointer event"); + return; + } + const trackingData = this.trackingData(from.pointerId); + if (trackingData.overTargets) { + const isMouse = from.pointerType === "mouse" || from.pointerType === "pen"; + const outTarget = this.findMountedTarget(trackingData.overTargets); + const outEvent = this.createPointerEvent(from, "pointerout", outTarget); + this.dispatchEvent(outEvent); + if (isMouse) + this.dispatchEvent(outEvent, "mouseout"); + const leaveEvent = this.createPointerEvent(from, "pointerleave", outTarget); + leaveEvent.eventPhase = leaveEvent.AT_TARGET; + while (leaveEvent.target && leaveEvent.target !== this.rootTarget.parent) { + leaveEvent.currentTarget = leaveEvent.target; + this.notifyTarget(leaveEvent); + if (isMouse) + this.notifyTarget(leaveEvent, "mouseleave"); + leaveEvent.target = leaveEvent.target.parent; + } + trackingData.overTargets = null; + this.freeEvent(outEvent); + this.freeEvent(leaveEvent); + } + this.cursor = null; + } + mapPointerUp(from) { + if (!(from instanceof FederatedPointerEvent)) { + console.warn("EventBoundary cannot map a non-pointer event as a pointer event"); + return; + } + const now = performance.now(); + const e = this.createPointerEvent(from); + this.dispatchEvent(e, "pointerup"); + if (e.pointerType === "touch") { + this.dispatchEvent(e, "touchend"); + } else if (e.pointerType === "mouse" || e.pointerType === "pen") { + const isRightButton = e.button === 2; + this.dispatchEvent(e, isRightButton ? "rightup" : "mouseup"); + } + const trackingData = this.trackingData(from.pointerId); + const pressTarget = this.findMountedTarget(trackingData.pressTargetsByButton[from.button]); + let clickTarget = pressTarget; + if (pressTarget && !e.composedPath().includes(pressTarget)) { + let currentTarget = pressTarget; + while (currentTarget && !e.composedPath().includes(currentTarget)) { + e.currentTarget = currentTarget; + this.notifyTarget(e, "pointerupoutside"); + if (e.pointerType === "touch") { + this.notifyTarget(e, "touchendoutside"); + } else if (e.pointerType === "mouse" || e.pointerType === "pen") { + const isRightButton = e.button === 2; + this.notifyTarget(e, isRightButton ? "rightupoutside" : "mouseupoutside"); + } + currentTarget = currentTarget.parent; + } + delete trackingData.pressTargetsByButton[from.button]; + clickTarget = currentTarget; + } + if (clickTarget) { + const clickEvent = this.clonePointerEvent(e, "click"); + clickEvent.target = clickTarget; + clickEvent.path = null; + if (!trackingData.clicksByButton[from.button]) { + trackingData.clicksByButton[from.button] = { + clickCount: 0, + target: clickEvent.target, + timeStamp: now + }; + } + const clickHistory = trackingData.clicksByButton[from.button]; + if (clickHistory.target === clickEvent.target && now - clickHistory.timeStamp < 200) { + ++clickHistory.clickCount; + } else { + clickHistory.clickCount = 1; + } + clickHistory.target = clickEvent.target; + clickHistory.timeStamp = now; + clickEvent.detail = clickHistory.clickCount; + if (clickEvent.pointerType === "mouse") { + const isRightButton = clickEvent.button === 2; + this.dispatchEvent(clickEvent, isRightButton ? "rightclick" : "click"); + } else if (clickEvent.pointerType === "touch") { + this.dispatchEvent(clickEvent, "tap"); + } + this.dispatchEvent(clickEvent, "pointertap"); + this.freeEvent(clickEvent); + } + this.freeEvent(e); + } + mapPointerUpOutside(from) { + if (!(from instanceof FederatedPointerEvent)) { + console.warn("EventBoundary cannot map a non-pointer event as a pointer event"); + return; + } + const trackingData = this.trackingData(from.pointerId); + const pressTarget = this.findMountedTarget(trackingData.pressTargetsByButton[from.button]); + const e = this.createPointerEvent(from); + if (pressTarget) { + let currentTarget = pressTarget; + while (currentTarget) { + e.currentTarget = currentTarget; + this.notifyTarget(e, "pointerupoutside"); + if (e.pointerType === "touch") { + this.notifyTarget(e, "touchendoutside"); + } else if (e.pointerType === "mouse" || e.pointerType === "pen") { + this.notifyTarget(e, e.button === 2 ? "rightupoutside" : "mouseupoutside"); + } + currentTarget = currentTarget.parent; + } + delete trackingData.pressTargetsByButton[from.button]; + } + this.freeEvent(e); + } + mapWheel(from) { + if (!(from instanceof FederatedWheelEvent)) { + console.warn("EventBoundary cannot map a non-wheel event as a wheel event"); + return; + } + const wheelEvent = this.createWheelEvent(from); + this.dispatchEvent(wheelEvent); + this.freeEvent(wheelEvent); + } + findMountedTarget(propagationPath) { + if (!propagationPath) { + return null; + } + let currentTarget = propagationPath[0]; + for (let i = 1; i < propagationPath.length; i++) { + if (propagationPath[i].parent === currentTarget) { + currentTarget = propagationPath[i]; + } else { + break; + } + } + return currentTarget; + } + createPointerEvent(from, type, target) { + const event = this.allocateEvent(FederatedPointerEvent); + this.copyPointerData(from, event); + this.copyMouseData(from, event); + this.copyData(from, event); + event.nativeEvent = from.nativeEvent; + event.originalEvent = from; + event.target = target ?? this.hitTest(event.global.x, event.global.y) ?? this._hitElements[0]; + if (typeof type === "string") { + event.type = type; + } + return event; + } + createWheelEvent(from) { + const event = this.allocateEvent(FederatedWheelEvent); + this.copyWheelData(from, event); + this.copyMouseData(from, event); + this.copyData(from, event); + event.nativeEvent = from.nativeEvent; + event.originalEvent = from; + event.target = this.hitTest(event.global.x, event.global.y); + return event; + } + clonePointerEvent(from, type) { + const event = this.allocateEvent(FederatedPointerEvent); + event.nativeEvent = from.nativeEvent; + event.originalEvent = from.originalEvent; + this.copyPointerData(from, event); + this.copyMouseData(from, event); + this.copyData(from, event); + event.target = from.target; + event.path = from.composedPath().slice(); + event.type = type ?? event.type; + return event; + } + copyWheelData(from, to) { + to.deltaMode = from.deltaMode; + to.deltaX = from.deltaX; + to.deltaY = from.deltaY; + to.deltaZ = from.deltaZ; + } + copyPointerData(from, to) { + if (!(from instanceof FederatedPointerEvent && to instanceof FederatedPointerEvent)) + return; + to.pointerId = from.pointerId; + to.width = from.width; + to.height = from.height; + to.isPrimary = from.isPrimary; + to.pointerType = from.pointerType; + to.pressure = from.pressure; + to.tangentialPressure = from.tangentialPressure; + to.tiltX = from.tiltX; + to.tiltY = from.tiltY; + to.twist = from.twist; + } + copyMouseData(from, to) { + if (!(from instanceof FederatedMouseEvent && to instanceof FederatedMouseEvent)) + return; + to.altKey = from.altKey; + to.button = from.button; + to.buttons = from.buttons; + to.client.copyFrom(from.client); + to.ctrlKey = from.ctrlKey; + to.metaKey = from.metaKey; + to.movement.copyFrom(from.movement); + to.screen.copyFrom(from.screen); + to.shiftKey = from.shiftKey; + to.global.copyFrom(from.global); + } + copyData(from, to) { + to.isTrusted = from.isTrusted; + to.srcElement = from.srcElement; + to.timeStamp = performance.now(); + to.type = from.type; + to.detail = from.detail; + to.view = from.view; + to.which = from.which; + to.layer.copyFrom(from.layer); + to.page.copyFrom(from.page); + } + trackingData(id) { + if (!this.mappingState.trackingData[id]) { + this.mappingState.trackingData[id] = { + pressTargetsByButton: {}, + clicksByButton: {}, + overTarget: null + }; + } + return this.mappingState.trackingData[id]; + } + allocateEvent(constructor) { + if (!this.eventPool.has(constructor)) { + this.eventPool.set(constructor, []); + } + const event = this.eventPool.get(constructor).pop() || new constructor(this); + event.eventPhase = event.NONE; + event.currentTarget = null; + event.path = null; + event.target = null; + return event; + } + freeEvent(event) { + if (event.manager !== this) + throw new Error("It is illegal to free an event not managed by this EventBoundary!"); + const constructor = event.constructor; + if (!this.eventPool.has(constructor)) { + this.eventPool.set(constructor, []); + } + this.eventPool.get(constructor).push(event); + } + notifyListeners(e, type) { + const listeners = e.currentTarget._events[type]; + if (!listeners) + return; + if (!e.currentTarget.isInteractive()) + return; + if ("fn" in listeners) { + if (listeners.once) + e.currentTarget.removeListener(type, listeners.fn, void 0, true); + listeners.fn.call(listeners.context, e); + } else { + for (let i = 0, j = listeners.length; i < j && !e.propagationImmediatelyStopped; i++) { + if (listeners[i].once) + e.currentTarget.removeListener(type, listeners[i].fn, void 0, true); + listeners[i].fn.call(listeners[i].context, e); + } + } + } + } + + const MOUSE_POINTER_ID = 1; + const TOUCH_TO_POINTER = { + touchstart: "pointerdown", + touchend: "pointerup", + touchendoutside: "pointerupoutside", + touchmove: "pointermove", + touchcancel: "pointercancel" + }; + const _EventSystem = class { + constructor(renderer) { + this.supportsTouchEvents = "ontouchstart" in globalThis; + this.supportsPointerEvents = !!globalThis.PointerEvent; + this.domElement = null; + this.resolution = 1; + this.renderer = renderer; + this.rootBoundary = new EventBoundary(null); + EventsTicker.init(this); + this.autoPreventDefault = true; + this.eventsAdded = false; + this.rootPointerEvent = new FederatedPointerEvent(null); + this.rootWheelEvent = new FederatedWheelEvent(null); + this.cursorStyles = { + default: "inherit", + pointer: "pointer" + }; + this.features = new Proxy({ ..._EventSystem.defaultEventFeatures }, { + set: (target, key, value) => { + if (key === "globalMove") { + this.rootBoundary.enableGlobalMoveEvents = value; + } + target[key] = value; + return true; + } + }); + this.onPointerDown = this.onPointerDown.bind(this); + this.onPointerMove = this.onPointerMove.bind(this); + this.onPointerUp = this.onPointerUp.bind(this); + this.onPointerOverOut = this.onPointerOverOut.bind(this); + this.onWheel = this.onWheel.bind(this); + } + static get defaultEventMode() { + return this._defaultEventMode; + } + init(options) { + const { view, resolution } = this.renderer; + this.setTargetElement(view); + this.resolution = resolution; + _EventSystem._defaultEventMode = options.eventMode ?? "auto"; + Object.assign(this.features, options.eventFeatures ?? {}); + this.rootBoundary.enableGlobalMoveEvents = this.features.globalMove; + } + resolutionChange(resolution) { + this.resolution = resolution; + } + destroy() { + this.setTargetElement(null); + this.renderer = null; + } + setCursor(mode) { + mode = mode || "default"; + let applyStyles = true; + if (globalThis.OffscreenCanvas && this.domElement instanceof OffscreenCanvas) { + applyStyles = false; + } + if (this.currentCursor === mode) { + return; + } + this.currentCursor = mode; + const style = this.cursorStyles[mode]; + if (style) { + switch (typeof style) { + case "string": + if (applyStyles) { + this.domElement.style.cursor = style; + } + break; + case "function": + style(mode); + break; + case "object": + if (applyStyles) { + Object.assign(this.domElement.style, style); + } + break; + } + } else if (applyStyles && typeof mode === "string" && !Object.prototype.hasOwnProperty.call(this.cursorStyles, mode)) { + this.domElement.style.cursor = mode; + } + } + get pointer() { + return this.rootPointerEvent; + } + onPointerDown(nativeEvent) { + if (!this.features.click) + return; + this.rootBoundary.rootTarget = this.renderer.lastObjectRendered; + if (this.supportsTouchEvents && nativeEvent.pointerType === "touch") + return; + const events = this.normalizeToPointerData(nativeEvent); + if (this.autoPreventDefault && events[0].isNormalized) { + const cancelable = nativeEvent.cancelable || !("cancelable" in nativeEvent); + if (cancelable) { + nativeEvent.preventDefault(); + } + } + for (let i = 0, j = events.length; i < j; i++) { + const nativeEvent2 = events[i]; + const federatedEvent = this.bootstrapEvent(this.rootPointerEvent, nativeEvent2); + this.rootBoundary.mapEvent(federatedEvent); + } + this.setCursor(this.rootBoundary.cursor); + } + onPointerMove(nativeEvent) { + if (!this.features.move) + return; + this.rootBoundary.rootTarget = this.renderer.lastObjectRendered; + if (this.supportsTouchEvents && nativeEvent.pointerType === "touch") + return; + EventsTicker.pointerMoved(); + const normalizedEvents = this.normalizeToPointerData(nativeEvent); + for (let i = 0, j = normalizedEvents.length; i < j; i++) { + const event = this.bootstrapEvent(this.rootPointerEvent, normalizedEvents[i]); + this.rootBoundary.mapEvent(event); + } + this.setCursor(this.rootBoundary.cursor); + } + onPointerUp(nativeEvent) { + if (!this.features.click) + return; + this.rootBoundary.rootTarget = this.renderer.lastObjectRendered; + if (this.supportsTouchEvents && nativeEvent.pointerType === "touch") + return; + let target = nativeEvent.target; + if (nativeEvent.composedPath && nativeEvent.composedPath().length > 0) { + target = nativeEvent.composedPath()[0]; + } + const outside = target !== this.domElement ? "outside" : ""; + const normalizedEvents = this.normalizeToPointerData(nativeEvent); + for (let i = 0, j = normalizedEvents.length; i < j; i++) { + const event = this.bootstrapEvent(this.rootPointerEvent, normalizedEvents[i]); + event.type += outside; + this.rootBoundary.mapEvent(event); + } + this.setCursor(this.rootBoundary.cursor); + } + onPointerOverOut(nativeEvent) { + if (!this.features.click) + return; + this.rootBoundary.rootTarget = this.renderer.lastObjectRendered; + if (this.supportsTouchEvents && nativeEvent.pointerType === "touch") + return; + const normalizedEvents = this.normalizeToPointerData(nativeEvent); + for (let i = 0, j = normalizedEvents.length; i < j; i++) { + const event = this.bootstrapEvent(this.rootPointerEvent, normalizedEvents[i]); + this.rootBoundary.mapEvent(event); + } + this.setCursor(this.rootBoundary.cursor); + } + onWheel(nativeEvent) { + if (!this.features.wheel) + return; + const wheelEvent = this.normalizeWheelEvent(nativeEvent); + this.rootBoundary.rootTarget = this.renderer.lastObjectRendered; + this.rootBoundary.mapEvent(wheelEvent); + } + setTargetElement(element) { + this.removeEvents(); + this.domElement = element; + EventsTicker.domElement = element; + this.addEvents(); + } + addEvents() { + if (this.eventsAdded || !this.domElement) { + return; + } + EventsTicker.addTickerListener(); + const style = this.domElement.style; + if (style) { + if (globalThis.navigator.msPointerEnabled) { + style.msContentZooming = "none"; + style.msTouchAction = "none"; + } else if (this.supportsPointerEvents) { + style.touchAction = "none"; + } + } + if (this.supportsPointerEvents) { + globalThis.document.addEventListener("pointermove", this.onPointerMove, true); + this.domElement.addEventListener("pointerdown", this.onPointerDown, true); + this.domElement.addEventListener("pointerleave", this.onPointerOverOut, true); + this.domElement.addEventListener("pointerover", this.onPointerOverOut, true); + globalThis.addEventListener("pointerup", this.onPointerUp, true); + } else { + globalThis.document.addEventListener("mousemove", this.onPointerMove, true); + this.domElement.addEventListener("mousedown", this.onPointerDown, true); + this.domElement.addEventListener("mouseout", this.onPointerOverOut, true); + this.domElement.addEventListener("mouseover", this.onPointerOverOut, true); + globalThis.addEventListener("mouseup", this.onPointerUp, true); + } + if (this.supportsTouchEvents) { + this.domElement.addEventListener("touchstart", this.onPointerDown, true); + this.domElement.addEventListener("touchend", this.onPointerUp, true); + this.domElement.addEventListener("touchmove", this.onPointerMove, true); + } + this.domElement.addEventListener("wheel", this.onWheel, { + passive: true, + capture: true + }); + this.eventsAdded = true; + } + removeEvents() { + if (!this.eventsAdded || !this.domElement) { + return; + } + EventsTicker.removeTickerListener(); + const style = this.domElement.style; + if (globalThis.navigator.msPointerEnabled) { + style.msContentZooming = ""; + style.msTouchAction = ""; + } else if (this.supportsPointerEvents) { + style.touchAction = ""; + } + if (this.supportsPointerEvents) { + globalThis.document.removeEventListener("pointermove", this.onPointerMove, true); + this.domElement.removeEventListener("pointerdown", this.onPointerDown, true); + this.domElement.removeEventListener("pointerleave", this.onPointerOverOut, true); + this.domElement.removeEventListener("pointerover", this.onPointerOverOut, true); + globalThis.removeEventListener("pointerup", this.onPointerUp, true); + } else { + globalThis.document.removeEventListener("mousemove", this.onPointerMove, true); + this.domElement.removeEventListener("mousedown", this.onPointerDown, true); + this.domElement.removeEventListener("mouseout", this.onPointerOverOut, true); + this.domElement.removeEventListener("mouseover", this.onPointerOverOut, true); + globalThis.removeEventListener("mouseup", this.onPointerUp, true); + } + if (this.supportsTouchEvents) { + this.domElement.removeEventListener("touchstart", this.onPointerDown, true); + this.domElement.removeEventListener("touchend", this.onPointerUp, true); + this.domElement.removeEventListener("touchmove", this.onPointerMove, true); + } + this.domElement.removeEventListener("wheel", this.onWheel, true); + this.domElement = null; + this.eventsAdded = false; + } + mapPositionToPoint(point, x, y) { + let rect; + if (!this.domElement.parentElement) { + rect = { + x: 0, + y: 0, + width: this.domElement.width, + height: this.domElement.height, + left: 0, + top: 0 + }; + } else { + rect = this.domElement.getBoundingClientRect(); + } + const resolutionMultiplier = 1 / this.resolution; + point.x = (x - rect.left) * (this.domElement.width / rect.width) * resolutionMultiplier; + point.y = (y - rect.top) * (this.domElement.height / rect.height) * resolutionMultiplier; + } + normalizeToPointerData(event) { + const normalizedEvents = []; + if (this.supportsTouchEvents && event instanceof TouchEvent) { + for (let i = 0, li = event.changedTouches.length; i < li; i++) { + const touch = event.changedTouches[i]; + if (typeof touch.button === "undefined") + touch.button = 0; + if (typeof touch.buttons === "undefined") + touch.buttons = 1; + if (typeof touch.isPrimary === "undefined") { + touch.isPrimary = event.touches.length === 1 && event.type === "touchstart"; + } + if (typeof touch.width === "undefined") + touch.width = touch.radiusX || 1; + if (typeof touch.height === "undefined") + touch.height = touch.radiusY || 1; + if (typeof touch.tiltX === "undefined") + touch.tiltX = 0; + if (typeof touch.tiltY === "undefined") + touch.tiltY = 0; + if (typeof touch.pointerType === "undefined") + touch.pointerType = "touch"; + if (typeof touch.pointerId === "undefined") + touch.pointerId = touch.identifier || 0; + if (typeof touch.pressure === "undefined") + touch.pressure = touch.force || 0.5; + if (typeof touch.twist === "undefined") + touch.twist = 0; + if (typeof touch.tangentialPressure === "undefined") + touch.tangentialPressure = 0; + if (typeof touch.layerX === "undefined") + touch.layerX = touch.offsetX = touch.clientX; + if (typeof touch.layerY === "undefined") + touch.layerY = touch.offsetY = touch.clientY; + touch.isNormalized = true; + touch.type = event.type; + normalizedEvents.push(touch); + } + } else if (!globalThis.MouseEvent || event instanceof MouseEvent && (!this.supportsPointerEvents || !(event instanceof globalThis.PointerEvent))) { + const tempEvent = event; + if (typeof tempEvent.isPrimary === "undefined") + tempEvent.isPrimary = true; + if (typeof tempEvent.width === "undefined") + tempEvent.width = 1; + if (typeof tempEvent.height === "undefined") + tempEvent.height = 1; + if (typeof tempEvent.tiltX === "undefined") + tempEvent.tiltX = 0; + if (typeof tempEvent.tiltY === "undefined") + tempEvent.tiltY = 0; + if (typeof tempEvent.pointerType === "undefined") + tempEvent.pointerType = "mouse"; + if (typeof tempEvent.pointerId === "undefined") + tempEvent.pointerId = MOUSE_POINTER_ID; + if (typeof tempEvent.pressure === "undefined") + tempEvent.pressure = 0.5; + if (typeof tempEvent.twist === "undefined") + tempEvent.twist = 0; + if (typeof tempEvent.tangentialPressure === "undefined") + tempEvent.tangentialPressure = 0; + tempEvent.isNormalized = true; + normalizedEvents.push(tempEvent); + } else { + normalizedEvents.push(event); + } + return normalizedEvents; + } + normalizeWheelEvent(nativeEvent) { + const event = this.rootWheelEvent; + this.transferMouseData(event, nativeEvent); + event.deltaX = nativeEvent.deltaX; + event.deltaY = nativeEvent.deltaY; + event.deltaZ = nativeEvent.deltaZ; + event.deltaMode = nativeEvent.deltaMode; + this.mapPositionToPoint(event.screen, nativeEvent.clientX, nativeEvent.clientY); + event.global.copyFrom(event.screen); + event.offset.copyFrom(event.screen); + event.nativeEvent = nativeEvent; + event.type = nativeEvent.type; + return event; + } + bootstrapEvent(event, nativeEvent) { + event.originalEvent = null; + event.nativeEvent = nativeEvent; + event.pointerId = nativeEvent.pointerId; + event.width = nativeEvent.width; + event.height = nativeEvent.height; + event.isPrimary = nativeEvent.isPrimary; + event.pointerType = nativeEvent.pointerType; + event.pressure = nativeEvent.pressure; + event.tangentialPressure = nativeEvent.tangentialPressure; + event.tiltX = nativeEvent.tiltX; + event.tiltY = nativeEvent.tiltY; + event.twist = nativeEvent.twist; + this.transferMouseData(event, nativeEvent); + this.mapPositionToPoint(event.screen, nativeEvent.clientX, nativeEvent.clientY); + event.global.copyFrom(event.screen); + event.offset.copyFrom(event.screen); + event.isTrusted = nativeEvent.isTrusted; + if (event.type === "pointerleave") { + event.type = "pointerout"; + } + if (event.type.startsWith("mouse")) { + event.type = event.type.replace("mouse", "pointer"); + } + if (event.type.startsWith("touch")) { + event.type = TOUCH_TO_POINTER[event.type] || event.type; + } + return event; + } + transferMouseData(event, nativeEvent) { + event.isTrusted = nativeEvent.isTrusted; + event.srcElement = nativeEvent.srcElement; + event.timeStamp = performance.now(); + event.type = nativeEvent.type; + event.altKey = nativeEvent.altKey; + event.button = nativeEvent.button; + event.buttons = nativeEvent.buttons; + event.client.x = nativeEvent.clientX; + event.client.y = nativeEvent.clientY; + event.ctrlKey = nativeEvent.ctrlKey; + event.metaKey = nativeEvent.metaKey; + event.movement.x = nativeEvent.movementX; + event.movement.y = nativeEvent.movementY; + event.page.x = nativeEvent.pageX; + event.page.y = nativeEvent.pageY; + event.relatedTarget = null; + event.shiftKey = nativeEvent.shiftKey; + } + }; + let EventSystem = _EventSystem; + EventSystem.extension = { + name: "events", + type: [ + ExtensionType.RendererSystem, + ExtensionType.CanvasRendererSystem + ] + }; + EventSystem.defaultEventFeatures = { + move: true, + globalMove: true, + click: true, + wheel: true + }; + extensions$1.add(EventSystem); + + function convertEventModeToInteractiveMode(mode) { + return mode === "dynamic" || mode === "static"; + } + const FederatedDisplayObject = { + onclick: null, + onmousedown: null, + onmouseenter: null, + onmouseleave: null, + onmousemove: null, + onglobalmousemove: null, + onmouseout: null, + onmouseover: null, + onmouseup: null, + onmouseupoutside: null, + onpointercancel: null, + onpointerdown: null, + onpointerenter: null, + onpointerleave: null, + onpointermove: null, + onglobalpointermove: null, + onpointerout: null, + onpointerover: null, + onpointertap: null, + onpointerup: null, + onpointerupoutside: null, + onrightclick: null, + onrightdown: null, + onrightup: null, + onrightupoutside: null, + ontap: null, + ontouchcancel: null, + ontouchend: null, + ontouchendoutside: null, + ontouchmove: null, + onglobaltouchmove: null, + ontouchstart: null, + onwheel: null, + _internalInteractive: void 0, + get interactive() { + return this._internalInteractive ?? convertEventModeToInteractiveMode(EventSystem.defaultEventMode); + }, + set interactive(value) { + deprecation("7.2.0", `Setting interactive is deprecated, use eventMode = 'none'/'passive'/'auto'/'static'/'dynamic' instead.`); + this._internalInteractive = value; + this.eventMode = value ? "static" : "auto"; + }, + _internalEventMode: void 0, + get eventMode() { + return this._internalEventMode ?? EventSystem.defaultEventMode; + }, + set eventMode(value) { + this._internalInteractive = convertEventModeToInteractiveMode(value); + this._internalEventMode = value; + }, + isInteractive() { + return this.eventMode === "static" || this.eventMode === "dynamic"; + }, + interactiveChildren: true, + hitArea: null, + addEventListener(type, listener, options) { + const capture = typeof options === "boolean" && options || typeof options === "object" && options.capture; + const context = typeof listener === "function" ? void 0 : listener; + type = capture ? `${type}capture` : type; + listener = typeof listener === "function" ? listener : listener.handleEvent; + this.on(type, listener, context); + }, + removeEventListener(type, listener, options) { + const capture = typeof options === "boolean" && options || typeof options === "object" && options.capture; + const context = typeof listener === "function" ? void 0 : listener; + type = capture ? `${type}capture` : type; + listener = typeof listener === "function" ? listener : listener.handleEvent; + this.off(type, listener, context); + }, + dispatchEvent(e) { + if (!(e instanceof FederatedEvent)) { + throw new Error("DisplayObject cannot propagate events outside of the Federated Events API"); + } + e.defaultPrevented = false; + e.path = null; + e.target = this; + e.manager.dispatchEvent(e); + return !e.defaultPrevented; + } + }; + DisplayObject.mixin(FederatedDisplayObject); + + const accessibleTarget = { + accessible: false, + accessibleTitle: null, + accessibleHint: null, + tabIndex: 0, + _accessibleActive: false, + _accessibleDiv: null, + accessibleType: "button", + accessiblePointerEvents: "auto", + accessibleChildren: true, + renderId: -1 + }; + + DisplayObject.mixin(accessibleTarget); + const KEY_CODE_TAB = 9; + const DIV_TOUCH_SIZE = 100; + const DIV_TOUCH_POS_X = 0; + const DIV_TOUCH_POS_Y = 0; + const DIV_TOUCH_ZINDEX = 2; + const DIV_HOOK_SIZE = 1; + const DIV_HOOK_POS_X = -1e3; + const DIV_HOOK_POS_Y = -1e3; + const DIV_HOOK_ZINDEX = 2; + class AccessibilityManager { + constructor(renderer) { + this.debug = false; + this._isActive = false; + this._isMobileAccessibility = false; + this.pool = []; + this.renderId = 0; + this.children = []; + this.androidUpdateCount = 0; + this.androidUpdateFrequency = 500; + this._hookDiv = null; + if (isMobile.tablet || isMobile.phone) { + this.createTouchHook(); + } + const div = document.createElement("div"); + div.style.width = `${DIV_TOUCH_SIZE}px`; + div.style.height = `${DIV_TOUCH_SIZE}px`; + div.style.position = "absolute"; + div.style.top = `${DIV_TOUCH_POS_X}px`; + div.style.left = `${DIV_TOUCH_POS_Y}px`; + div.style.zIndex = DIV_TOUCH_ZINDEX.toString(); + this.div = div; + this.renderer = renderer; + this._onKeyDown = this._onKeyDown.bind(this); + this._onMouseMove = this._onMouseMove.bind(this); + globalThis.addEventListener("keydown", this._onKeyDown, false); + } + get isActive() { + return this._isActive; + } + get isMobileAccessibility() { + return this._isMobileAccessibility; + } + createTouchHook() { + const hookDiv = document.createElement("button"); + hookDiv.style.width = `${DIV_HOOK_SIZE}px`; + hookDiv.style.height = `${DIV_HOOK_SIZE}px`; + hookDiv.style.position = "absolute"; + hookDiv.style.top = `${DIV_HOOK_POS_X}px`; + hookDiv.style.left = `${DIV_HOOK_POS_Y}px`; + hookDiv.style.zIndex = DIV_HOOK_ZINDEX.toString(); + hookDiv.style.backgroundColor = "#FF0000"; + hookDiv.title = "select to enable accessibility for this content"; + hookDiv.addEventListener("focus", () => { + this._isMobileAccessibility = true; + this.activate(); + this.destroyTouchHook(); + }); + document.body.appendChild(hookDiv); + this._hookDiv = hookDiv; + } + destroyTouchHook() { + if (!this._hookDiv) { + return; + } + document.body.removeChild(this._hookDiv); + this._hookDiv = null; + } + activate() { + if (this._isActive) { + return; + } + this._isActive = true; + globalThis.document.addEventListener("mousemove", this._onMouseMove, true); + globalThis.removeEventListener("keydown", this._onKeyDown, false); + this.renderer.on("postrender", this.update, this); + this.renderer.view.parentNode?.appendChild(this.div); + } + deactivate() { + if (!this._isActive || this._isMobileAccessibility) { + return; + } + this._isActive = false; + globalThis.document.removeEventListener("mousemove", this._onMouseMove, true); + globalThis.addEventListener("keydown", this._onKeyDown, false); + this.renderer.off("postrender", this.update); + this.div.parentNode?.removeChild(this.div); + } + updateAccessibleObjects(displayObject) { + if (!displayObject.visible || !displayObject.accessibleChildren) { + return; + } + if (displayObject.accessible && displayObject.isInteractive()) { + if (!displayObject._accessibleActive) { + this.addChild(displayObject); + } + displayObject.renderId = this.renderId; + } + const children = displayObject.children; + if (children) { + for (let i = 0; i < children.length; i++) { + this.updateAccessibleObjects(children[i]); + } + } + } + update() { + const now = performance.now(); + if (isMobile.android.device && now < this.androidUpdateCount) { + return; + } + this.androidUpdateCount = now + this.androidUpdateFrequency; + if (!this.renderer.renderingToScreen) { + return; + } + if (this.renderer.lastObjectRendered) { + this.updateAccessibleObjects(this.renderer.lastObjectRendered); + } + const { x, y, width, height } = this.renderer.view.getBoundingClientRect(); + const { width: viewWidth, height: viewHeight, resolution } = this.renderer; + const sx = width / viewWidth * resolution; + const sy = height / viewHeight * resolution; + let div = this.div; + div.style.left = `${x}px`; + div.style.top = `${y}px`; + div.style.width = `${viewWidth}px`; + div.style.height = `${viewHeight}px`; + for (let i = 0; i < this.children.length; i++) { + const child = this.children[i]; + if (child.renderId !== this.renderId) { + child._accessibleActive = false; + removeItems(this.children, i, 1); + this.div.removeChild(child._accessibleDiv); + this.pool.push(child._accessibleDiv); + child._accessibleDiv = null; + i--; + } else { + div = child._accessibleDiv; + let hitArea = child.hitArea; + const wt = child.worldTransform; + if (child.hitArea) { + div.style.left = `${(wt.tx + hitArea.x * wt.a) * sx}px`; + div.style.top = `${(wt.ty + hitArea.y * wt.d) * sy}px`; + div.style.width = `${hitArea.width * wt.a * sx}px`; + div.style.height = `${hitArea.height * wt.d * sy}px`; + } else { + hitArea = child.getBounds(); + this.capHitArea(hitArea); + div.style.left = `${hitArea.x * sx}px`; + div.style.top = `${hitArea.y * sy}px`; + div.style.width = `${hitArea.width * sx}px`; + div.style.height = `${hitArea.height * sy}px`; + if (div.title !== child.accessibleTitle && child.accessibleTitle !== null) { + div.title = child.accessibleTitle; + } + if (div.getAttribute("aria-label") !== child.accessibleHint && child.accessibleHint !== null) { + div.setAttribute("aria-label", child.accessibleHint); + } + } + if (child.accessibleTitle !== div.title || child.tabIndex !== div.tabIndex) { + div.title = child.accessibleTitle; + div.tabIndex = child.tabIndex; + if (this.debug) + this.updateDebugHTML(div); + } + } + } + this.renderId++; + } + updateDebugHTML(div) { + div.innerHTML = `type: ${div.type}
title : ${div.title}
tabIndex: ${div.tabIndex}`; + } + capHitArea(hitArea) { + if (hitArea.x < 0) { + hitArea.width += hitArea.x; + hitArea.x = 0; + } + if (hitArea.y < 0) { + hitArea.height += hitArea.y; + hitArea.y = 0; + } + const { width: viewWidth, height: viewHeight } = this.renderer; + if (hitArea.x + hitArea.width > viewWidth) { + hitArea.width = viewWidth - hitArea.x; + } + if (hitArea.y + hitArea.height > viewHeight) { + hitArea.height = viewHeight - hitArea.y; + } + } + addChild(displayObject) { + let div = this.pool.pop(); + if (!div) { + div = document.createElement("button"); + div.style.width = `${DIV_TOUCH_SIZE}px`; + div.style.height = `${DIV_TOUCH_SIZE}px`; + div.style.backgroundColor = this.debug ? "rgba(255,255,255,0.5)" : "transparent"; + div.style.position = "absolute"; + div.style.zIndex = DIV_TOUCH_ZINDEX.toString(); + div.style.borderStyle = "none"; + if (navigator.userAgent.toLowerCase().includes("chrome")) { + div.setAttribute("aria-live", "off"); + } else { + div.setAttribute("aria-live", "polite"); + } + if (navigator.userAgent.match(/rv:.*Gecko\//)) { + div.setAttribute("aria-relevant", "additions"); + } else { + div.setAttribute("aria-relevant", "text"); + } + div.addEventListener("click", this._onClick.bind(this)); + div.addEventListener("focus", this._onFocus.bind(this)); + div.addEventListener("focusout", this._onFocusOut.bind(this)); + } + div.style.pointerEvents = displayObject.accessiblePointerEvents; + div.type = displayObject.accessibleType; + if (displayObject.accessibleTitle && displayObject.accessibleTitle !== null) { + div.title = displayObject.accessibleTitle; + } else if (!displayObject.accessibleHint || displayObject.accessibleHint === null) { + div.title = `displayObject ${displayObject.tabIndex}`; + } + if (displayObject.accessibleHint && displayObject.accessibleHint !== null) { + div.setAttribute("aria-label", displayObject.accessibleHint); + } + if (this.debug) + this.updateDebugHTML(div); + displayObject._accessibleActive = true; + displayObject._accessibleDiv = div; + div.displayObject = displayObject; + this.children.push(displayObject); + this.div.appendChild(displayObject._accessibleDiv); + displayObject._accessibleDiv.tabIndex = displayObject.tabIndex; + } + _dispatchEvent(e, type) { + const { displayObject: target } = e.target; + const boundry = this.renderer.events.rootBoundary; + const event = Object.assign(new FederatedEvent(boundry), { target }); + boundry.rootTarget = this.renderer.lastObjectRendered; + type.forEach((type2) => boundry.dispatchEvent(event, type2)); + } + _onClick(e) { + this._dispatchEvent(e, ["click", "pointertap", "tap"]); + } + _onFocus(e) { + if (!e.target.getAttribute("aria-live")) { + e.target.setAttribute("aria-live", "assertive"); + } + this._dispatchEvent(e, ["mouseover"]); + } + _onFocusOut(e) { + if (!e.target.getAttribute("aria-live")) { + e.target.setAttribute("aria-live", "polite"); + } + this._dispatchEvent(e, ["mouseout"]); + } + _onKeyDown(e) { + if (e.keyCode !== KEY_CODE_TAB) { + return; + } + this.activate(); + } + _onMouseMove(e) { + if (e.movementX === 0 && e.movementY === 0) { + return; + } + this.deactivate(); + } + destroy() { + this.destroyTouchHook(); + this.div = null; + globalThis.document.removeEventListener("mousemove", this._onMouseMove, true); + globalThis.removeEventListener("keydown", this._onKeyDown); + this.pool = null; + this.children = null; + this.renderer = null; + } + } + AccessibilityManager.extension = { + name: "accessibility", + type: [ + ExtensionType.RendererPlugin, + ExtensionType.CanvasRendererPlugin + ] + }; + extensions$1.add(AccessibilityManager); + + const _Application = class { + constructor(options) { + this.stage = new Container(); + options = Object.assign({ + forceCanvas: false + }, options); + this.renderer = autoDetectRenderer(options); + _Application._plugins.forEach((plugin) => { + plugin.init.call(this, options); + }); + } + render() { + this.renderer.render(this.stage); + } + get view() { + return this.renderer.view; + } + get screen() { + return this.renderer.screen; + } + destroy(removeView, stageOptions) { + const plugins = _Application._plugins.slice(0); + plugins.reverse(); + plugins.forEach((plugin) => { + plugin.destroy.call(this); + }); + this.stage.destroy(stageOptions); + this.stage = null; + this.renderer.destroy(removeView); + this.renderer = null; + } + }; + let Application = _Application; + Application._plugins = []; + extensions$1.handleByList(ExtensionType.Application, Application._plugins); + + class ResizePlugin { + static init(options) { + Object.defineProperty(this, "resizeTo", { + set(dom) { + globalThis.removeEventListener("resize", this.queueResize); + this._resizeTo = dom; + if (dom) { + globalThis.addEventListener("resize", this.queueResize); + this.resize(); + } + }, + get() { + return this._resizeTo; + } + }); + this.queueResize = () => { + if (!this._resizeTo) { + return; + } + this.cancelResize(); + this._resizeId = requestAnimationFrame(() => this.resize()); + }; + this.cancelResize = () => { + if (this._resizeId) { + cancelAnimationFrame(this._resizeId); + this._resizeId = null; + } + }; + this.resize = () => { + if (!this._resizeTo) { + return; + } + this.cancelResize(); + let width; + let height; + if (this._resizeTo === globalThis.window) { + width = globalThis.innerWidth; + height = globalThis.innerHeight; + } else { + const { clientWidth, clientHeight } = this._resizeTo; + width = clientWidth; + height = clientHeight; + } + this.renderer.resize(width, height); + this.render(); + }; + this._resizeId = null; + this._resizeTo = null; + this.resizeTo = options.resizeTo || null; + } + static destroy() { + globalThis.removeEventListener("resize", this.queueResize); + this.cancelResize(); + this.cancelResize = null; + this.queueResize = null; + this.resizeTo = null; + this.resize = null; + } + } + ResizePlugin.extension = ExtensionType.Application; + extensions$1.add(ResizePlugin); + + const assetKeyMap = { + loader: ExtensionType.LoadParser, + resolver: ExtensionType.ResolveParser, + cache: ExtensionType.CacheParser, + detection: ExtensionType.DetectionParser + }; + extensions$1.handle(ExtensionType.Asset, (extension) => { + const ref = extension.ref; + Object.entries(assetKeyMap).filter(([key]) => !!ref[key]).forEach(([key, type]) => extensions$1.add(Object.assign(ref[key], { extension: ref[key].extension ?? type }))); + }, (extension) => { + const ref = extension.ref; + Object.keys(assetKeyMap).filter((key) => !!ref[key]).forEach((key) => extensions$1.remove(ref[key])); + }); + + class BackgroundLoader { + constructor(loader, verbose = false) { + this._loader = loader; + this._assetList = []; + this._isLoading = false; + this._maxConcurrent = 1; + this.verbose = verbose; + } + add(assetUrls) { + assetUrls.forEach((a) => { + this._assetList.push(a); + }); + if (this.verbose) + console.log("[BackgroundLoader] assets: ", this._assetList); + if (this._isActive && !this._isLoading) { + this._next(); + } + } + async _next() { + if (this._assetList.length && this._isActive) { + this._isLoading = true; + const toLoad = []; + const toLoadAmount = Math.min(this._assetList.length, this._maxConcurrent); + for (let i = 0; i < toLoadAmount; i++) { + toLoad.push(this._assetList.pop()); + } + await this._loader.load(toLoad); + this._isLoading = false; + this._next(); + } + } + get active() { + return this._isActive; + } + set active(value) { + if (this._isActive === value) + return; + this._isActive = value; + if (value && !this._isLoading) { + this._next(); + } + } + } + + function checkDataUrl(url, mimes) { + if (Array.isArray(mimes)) { + for (const mime of mimes) { + if (url.startsWith(`data:${mime}`)) + return true; + } + return false; + } + return url.startsWith(`data:${mimes}`); + } + + function checkExtension(url, extension) { + const tempURL = url.split("?")[0]; + const ext = path.extname(tempURL).toLowerCase(); + if (Array.isArray(extension)) { + return extension.includes(ext); + } + return ext === extension; + } + + const convertToList = (input, transform) => { + if (!Array.isArray(input)) { + input = [input]; + } + if (!transform) { + return input; + } + return input.map((item) => { + if (typeof item === "string") { + return transform(item); + } + return item; + }); + }; + + const copySearchParams = (targetUrl, sourceUrl) => { + const searchParams = sourceUrl.split("?")[1]; + if (searchParams) { + targetUrl += `?${searchParams}`; + } + return targetUrl; + }; + + function processX(base, ids, depth, result, tags) { + const id = ids[depth]; + for (let i = 0; i < id.length; i++) { + const value = id[i]; + if (depth < ids.length - 1) { + processX(base.replace(result[depth], value), ids, depth + 1, result, tags); + } else { + tags.push(base.replace(result[depth], value)); + } + } + } + function createStringVariations(string) { + const regex = /\{(.*?)\}/g; + const result = string.match(regex); + const tags = []; + if (result) { + const ids = []; + result.forEach((vars) => { + const split = vars.substring(1, vars.length - 1).split(","); + ids.push(split); + }); + processX(string, ids, 0, result, tags); + } else { + tags.push(string); + } + return tags; + } + + const isSingleItem = (item) => !Array.isArray(item); + + class CacheClass { + constructor() { + this._parsers = []; + this._cache = /* @__PURE__ */ new Map(); + this._cacheMap = /* @__PURE__ */ new Map(); + } + reset() { + this._cacheMap.clear(); + this._cache.clear(); + } + has(key) { + return this._cache.has(key); + } + get(key) { + const result = this._cache.get(key); + if (!result) { + console.warn(`[Assets] Asset id ${key} was not found in the Cache`); + } + return result; + } + set(key, value) { + const keys = convertToList(key); + let cacheableAssets; + for (let i = 0; i < this.parsers.length; i++) { + const parser = this.parsers[i]; + if (parser.test(value)) { + cacheableAssets = parser.getCacheableAssets(keys, value); + break; + } + } + if (!cacheableAssets) { + cacheableAssets = {}; + keys.forEach((key2) => { + cacheableAssets[key2] = value; + }); + } + const cacheKeys = Object.keys(cacheableAssets); + const cachedAssets = { + cacheKeys, + keys + }; + keys.forEach((key2) => { + this._cacheMap.set(key2, cachedAssets); + }); + cacheKeys.forEach((key2) => { + if (this._cache.has(key2) && this._cache.get(key2) !== value) { + console.warn("[Cache] already has key:", key2); + } + this._cache.set(key2, cacheableAssets[key2]); + }); + if (value instanceof Texture) { + const texture = value; + keys.forEach((key2) => { + if (texture.baseTexture !== Texture.EMPTY.baseTexture) { + BaseTexture.addToCache(texture.baseTexture, key2); + } + Texture.addToCache(texture, key2); + }); + } + } + remove(key) { + this._cacheMap.get(key); + if (!this._cacheMap.has(key)) { + console.warn(`[Assets] Asset id ${key} was not found in the Cache`); + return; + } + const cacheMap = this._cacheMap.get(key); + const cacheKeys = cacheMap.cacheKeys; + cacheKeys.forEach((key2) => { + this._cache.delete(key2); + }); + cacheMap.keys.forEach((key2) => { + this._cacheMap.delete(key2); + }); + } + get parsers() { + return this._parsers; + } + } + const Cache = new CacheClass(); + + class Loader { + constructor() { + this._parsers = []; + this._parsersValidated = false; + this.parsers = new Proxy(this._parsers, { + set: (target, key, value) => { + this._parsersValidated = false; + target[key] = value; + return true; + } + }); + this.promiseCache = {}; + } + reset() { + this._parsersValidated = false; + this.promiseCache = {}; + } + _getLoadPromiseAndParser(url, data) { + const result = { + promise: null, + parser: null + }; + result.promise = (async () => { + let asset = null; + let parser = null; + if (data.loadParser) { + parser = this._parserHash[data.loadParser]; + if (!parser) { + console.warn(`[Assets] specified load parser "${data.loadParser}" not found while loading ${url}`); + } + } + if (!parser) { + for (let i = 0; i < this.parsers.length; i++) { + const parserX = this.parsers[i]; + if (parserX.load && parserX.test?.(url, data, this)) { + parser = parserX; + break; + } + } + if (!parser) { + console.warn(`[Assets] ${url} could not be loaded as we don't know how to parse it, ensure the correct parser has been added`); + return null; + } + } + asset = await parser.load(url, data, this); + result.parser = parser; + for (let i = 0; i < this.parsers.length; i++) { + const parser2 = this.parsers[i]; + if (parser2.parse) { + if (parser2.parse && await parser2.testParse?.(asset, data, this)) { + asset = await parser2.parse(asset, data, this) || asset; + result.parser = parser2; + } + } + } + return asset; + })(); + return result; + } + async load(assetsToLoadIn, onProgress) { + if (!this._parsersValidated) { + this._validateParsers(); + } + let count = 0; + const assets = {}; + const singleAsset = isSingleItem(assetsToLoadIn); + const assetsToLoad = convertToList(assetsToLoadIn, (item) => ({ + src: item + })); + const total = assetsToLoad.length; + const promises = assetsToLoad.map(async (asset) => { + const url = path.toAbsolute(asset.src); + if (!assets[asset.src]) { + try { + if (!this.promiseCache[url]) { + this.promiseCache[url] = this._getLoadPromiseAndParser(url, asset); + } + assets[asset.src] = await this.promiseCache[url].promise; + if (onProgress) + onProgress(++count / total); + } catch (e) { + delete this.promiseCache[url]; + delete assets[asset.src]; + throw new Error(`[Loader.load] Failed to load ${url}. +${e}`); + } + } + }); + await Promise.all(promises); + return singleAsset ? assets[assetsToLoad[0].src] : assets; + } + async unload(assetsToUnloadIn) { + const assetsToUnload = convertToList(assetsToUnloadIn, (item) => ({ + src: item + })); + const promises = assetsToUnload.map(async (asset) => { + const url = path.toAbsolute(asset.src); + const loadPromise = this.promiseCache[url]; + if (loadPromise) { + const loadedAsset = await loadPromise.promise; + loadPromise.parser?.unload?.(loadedAsset, asset, this); + delete this.promiseCache[url]; + } + }); + await Promise.all(promises); + } + _validateParsers() { + this._parsersValidated = true; + this._parserHash = this._parsers.filter((parser) => parser.name).reduce((hash, parser) => { + if (hash[parser.name]) { + console.warn(`[Assets] loadParser name conflict "${parser.name}"`); + } + return { ...hash, [parser.name]: parser }; + }, {}); + } + } + + var LoaderParserPriority = /* @__PURE__ */ ((LoaderParserPriority2) => { + LoaderParserPriority2[LoaderParserPriority2["Low"] = 0] = "Low"; + LoaderParserPriority2[LoaderParserPriority2["Normal"] = 1] = "Normal"; + LoaderParserPriority2[LoaderParserPriority2["High"] = 2] = "High"; + return LoaderParserPriority2; + })(LoaderParserPriority || {}); + + const validJSONExtension = ".json"; + const validJSONMIME = "application/json"; + const loadJson = { + extension: { + type: ExtensionType.LoadParser, + priority: LoaderParserPriority.Low + }, + name: "loadJson", + test(url) { + return checkDataUrl(url, validJSONMIME) || checkExtension(url, validJSONExtension); + }, + async load(url) { + const response = await settings.ADAPTER.fetch(url); + const json = await response.json(); + return json; + } + }; + extensions$1.add(loadJson); + + const validTXTExtension = ".txt"; + const validTXTMIME = "text/plain"; + const loadTxt = { + name: "loadTxt", + extension: { + type: ExtensionType.LoadParser, + priority: LoaderParserPriority.Low + }, + test(url) { + return checkDataUrl(url, validTXTMIME) || checkExtension(url, validTXTExtension); + }, + async load(url) { + const response = await settings.ADAPTER.fetch(url); + const txt = await response.text(); + return txt; + } + }; + extensions$1.add(loadTxt); + + const validWeights = [ + "normal", + "bold", + "100", + "200", + "300", + "400", + "500", + "600", + "700", + "800", + "900" + ]; + const validFontExtensions = [".ttf", ".otf", ".woff", ".woff2"]; + const validFontMIMEs = [ + "font/ttf", + "font/otf", + "font/woff", + "font/woff2" + ]; + function getFontFamilyName(url) { + const ext = path.extname(url); + const name = path.basename(url, ext); + const nameWithSpaces = name.replace(/(-|_)/g, " "); + const nameTitleCase = nameWithSpaces.toLowerCase().split(" ").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" "); + return nameTitleCase; + } + const loadWebFont = { + extension: { + type: ExtensionType.LoadParser, + priority: LoaderParserPriority.Low + }, + name: "loadWebFont", + test(url) { + return checkDataUrl(url, validFontMIMEs) || checkExtension(url, validFontExtensions); + }, + async load(url, options) { + const fonts = settings.ADAPTER.getFontFaceSet(); + if (fonts) { + const fontFaces = []; + const name = options.data?.family ?? getFontFamilyName(url); + const weights = options.data?.weights?.filter((weight) => validWeights.includes(weight)) ?? ["normal"]; + const data = options.data ?? {}; + for (let i = 0; i < weights.length; i++) { + const weight = weights[i]; + const font = new FontFace(name, `url(${encodeURI(url)})`, { + ...data, + weight + }); + await font.load(); + fonts.add(font); + fontFaces.push(font); + } + return fontFaces.length === 1 ? fontFaces[0] : fontFaces; + } + console.warn("[loadWebFont] FontFace API is not supported. Skipping loading font"); + return null; + }, + unload(font) { + (Array.isArray(font) ? font : [font]).forEach((t) => settings.ADAPTER.getFontFaceSet().delete(t)); + } + }; + extensions$1.add(loadWebFont); + + let UUID = 0; + let MAX_WORKERS; + const WHITE_PNG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII="; + const checkImageBitmapCode = { + id: "checkImageBitmap", + code: ` + async function checkImageBitmap() + { + try + { + if (typeof createImageBitmap !== 'function') return false; + + const response = await fetch('${WHITE_PNG}'); + const imageBlob = await response.blob(); + const imageBitmap = await createImageBitmap(imageBlob); + + return imageBitmap.width === 1 && imageBitmap.height === 1; + } + catch (e) + { + return false; + } + } + checkImageBitmap().then((result) => { self.postMessage(result); }); + ` + }; + const workerCode = { + id: "loadImageBitmap", + code: ` + async function loadImageBitmap(url) + { + const response = await fetch(url); + + if (!response.ok) + { + throw new Error(\`[WorkerManager.loadImageBitmap] Failed to fetch \${url}: \` + + \`\${response.status} \${response.statusText}\`); + } + + const imageBlob = await response.blob(); + const imageBitmap = await createImageBitmap(imageBlob); + + return imageBitmap; + } + self.onmessage = async (event) => + { + try + { + const imageBitmap = await loadImageBitmap(event.data.data[0]); + + self.postMessage({ + data: imageBitmap, + uuid: event.data.uuid, + id: event.data.id, + }, [imageBitmap]); + } + catch(e) + { + self.postMessage({ + error: e, + uuid: event.data.uuid, + id: event.data.id, + }); + } + };` + }; + let workerURL; + class WorkerManagerClass { + constructor() { + this._initialized = false; + this._createdWorkers = 0; + this.workerPool = []; + this.queue = []; + this.resolveHash = {}; + } + isImageBitmapSupported() { + if (this._isImageBitmapSupported !== void 0) + return this._isImageBitmapSupported; + this._isImageBitmapSupported = new Promise((resolve) => { + const workerURL2 = URL.createObjectURL(new Blob([checkImageBitmapCode.code], { type: "application/javascript" })); + const worker = new Worker(workerURL2); + worker.addEventListener("message", (event) => { + worker.terminate(); + URL.revokeObjectURL(workerURL2); + resolve(event.data); + }); + }); + return this._isImageBitmapSupported; + } + loadImageBitmap(src) { + return this._run("loadImageBitmap", [src]); + } + async _initWorkers() { + if (this._initialized) + return; + this._initialized = true; + } + getWorker() { + if (MAX_WORKERS === void 0) { + MAX_WORKERS = navigator.hardwareConcurrency || 4; + } + let worker = this.workerPool.pop(); + if (!worker && this._createdWorkers < MAX_WORKERS) { + if (!workerURL) { + workerURL = URL.createObjectURL(new Blob([workerCode.code], { type: "application/javascript" })); + } + this._createdWorkers++; + worker = new Worker(workerURL); + worker.addEventListener("message", (event) => { + this.complete(event.data); + this.returnWorker(event.target); + this.next(); + }); + } + return worker; + } + returnWorker(worker) { + this.workerPool.push(worker); + } + complete(data) { + if (data.error !== void 0) { + this.resolveHash[data.uuid].reject(data.error); + } else { + this.resolveHash[data.uuid].resolve(data.data); + } + this.resolveHash[data.uuid] = null; + } + async _run(id, args) { + await this._initWorkers(); + const promise = new Promise((resolve, reject) => { + this.queue.push({ id, arguments: args, resolve, reject }); + }); + this.next(); + return promise; + } + next() { + if (!this.queue.length) + return; + const worker = this.getWorker(); + if (!worker) { + return; + } + const toDo = this.queue.pop(); + const id = toDo.id; + this.resolveHash[UUID] = { resolve: toDo.resolve, reject: toDo.reject }; + worker.postMessage({ + data: toDo.arguments, + uuid: UUID++, + id + }); + } + } + const WorkerManager = new WorkerManagerClass(); + + function createTexture(base, loader, url) { + const texture = new Texture(base); + texture.baseTexture.on("dispose", () => { + delete loader.promiseCache[url]; + }); + return texture; + } + + const validImageExtensions = [".jpeg", ".jpg", ".png", ".webp", ".avif"]; + const validImageMIMEs = [ + "image/jpeg", + "image/png", + "image/webp", + "image/avif" + ]; + async function loadImageBitmap(url) { + const response = await settings.ADAPTER.fetch(url); + if (!response.ok) { + throw new Error(`[loadImageBitmap] Failed to fetch ${url}: ${response.status} ${response.statusText}`); + } + const imageBlob = await response.blob(); + const imageBitmap = await createImageBitmap(imageBlob); + return imageBitmap; + } + const loadTextures = { + name: "loadTextures", + extension: { + type: ExtensionType.LoadParser, + priority: LoaderParserPriority.High + }, + config: { + preferWorkers: true, + preferCreateImageBitmap: true, + crossOrigin: "anonymous" + }, + test(url) { + return checkDataUrl(url, validImageMIMEs) || checkExtension(url, validImageExtensions); + }, + async load(url, asset, loader) { + let src = null; + if (globalThis.createImageBitmap && this.config.preferCreateImageBitmap) { + if (this.config.preferWorkers && await WorkerManager.isImageBitmapSupported()) { + src = await WorkerManager.loadImageBitmap(url); + } else { + src = await loadImageBitmap(url); + } + } else { + src = await new Promise((resolve) => { + src = new Image(); + src.crossOrigin = this.config.crossOrigin; + src.src = url; + if (src.complete) { + resolve(src); + } else { + src.onload = () => { + resolve(src); + }; + } + }); + } + const base = new BaseTexture(src, { + resolution: getResolutionOfUrl(url), + ...asset.data + }); + base.resource.src = url; + return createTexture(base, loader, url); + }, + unload(texture) { + texture.destroy(true); + } + }; + extensions$1.add(loadTextures); + + const validSVGExtension = ".svg"; + const validSVGMIME = "image/svg+xml"; + const loadSVG = { + extension: { + type: ExtensionType.LoadParser, + priority: LoaderParserPriority.High + }, + name: "loadSVG", + test(url) { + return checkDataUrl(url, validSVGMIME) || checkExtension(url, validSVGExtension); + }, + async testParse(data) { + return SVGResource.test(data); + }, + async parse(asset, data, loader) { + const src = new SVGResource(asset, data?.data?.resourceOptions); + const base = new BaseTexture(src, { + resolution: getResolutionOfUrl(asset), + ...data?.data + }); + base.resource.src = asset; + const texture = createTexture(base, loader, asset); + if (!data?.data?.resourceOptions?.autoLoad) { + await src.load(); + } + return texture; + }, + async load(url, _options) { + const response = await settings.ADAPTER.fetch(url); + return response.text(); + }, + unload: loadTextures.unload + }; + extensions$1.add(loadSVG); + + class Resolver { + constructor() { + this._defaultBundleIdentifierOptions = { + connector: "-", + createBundleAssetId: (bundleId, assetId) => `${bundleId}${this._bundleIdConnector}${assetId}`, + extractAssetIdFromBundle: (bundleId, assetBundleId) => assetBundleId.replace(`${bundleId}${this._bundleIdConnector}`, "") + }; + this._bundleIdConnector = this._defaultBundleIdentifierOptions.connector; + this._createBundleAssetId = this._defaultBundleIdentifierOptions.createBundleAssetId; + this._extractAssetIdFromBundle = this._defaultBundleIdentifierOptions.extractAssetIdFromBundle; + this._assetMap = {}; + this._preferredOrder = []; + this._parsers = []; + this._resolverHash = {}; + this._bundles = {}; + } + setBundleIdentifier(bundleIdentifier) { + this._bundleIdConnector = bundleIdentifier.connector ?? this._bundleIdConnector; + this._createBundleAssetId = bundleIdentifier.createBundleAssetId ?? this._createBundleAssetId; + this._extractAssetIdFromBundle = bundleIdentifier.extractAssetIdFromBundle ?? this._extractAssetIdFromBundle; + if (this._extractAssetIdFromBundle("foo", this._createBundleAssetId("foo", "bar")) !== "bar") { + throw new Error("[Resolver] GenerateBundleAssetId are not working correctly"); + } + } + prefer(...preferOrders) { + preferOrders.forEach((prefer) => { + this._preferredOrder.push(prefer); + if (!prefer.priority) { + prefer.priority = Object.keys(prefer.params); + } + }); + this._resolverHash = {}; + } + set basePath(basePath) { + this._basePath = basePath; + } + get basePath() { + return this._basePath; + } + set rootPath(rootPath) { + this._rootPath = rootPath; + } + get rootPath() { + return this._rootPath; + } + get parsers() { + return this._parsers; + } + reset() { + this.setBundleIdentifier(this._defaultBundleIdentifierOptions); + this._assetMap = {}; + this._preferredOrder = []; + this._resolverHash = {}; + this._rootPath = null; + this._basePath = null; + this._manifest = null; + this._bundles = {}; + this._defaultSearchParams = null; + } + setDefaultSearchParams(searchParams) { + if (typeof searchParams === "string") { + this._defaultSearchParams = searchParams; + } else { + const queryValues = searchParams; + this._defaultSearchParams = Object.keys(queryValues).map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(queryValues[key])}`).join("&"); + } + } + addManifest(manifest) { + if (this._manifest) { + console.warn("[Resolver] Manifest already exists, this will be overwritten"); + } + this._manifest = manifest; + manifest.bundles.forEach((bundle) => { + this.addBundle(bundle.name, bundle.assets); + }); + } + addBundle(bundleId, assets) { + const assetNames = []; + if (Array.isArray(assets)) { + assets.forEach((asset) => { + if (typeof asset.name === "string") { + const bundleAssetId = this._createBundleAssetId(bundleId, asset.name); + assetNames.push(bundleAssetId); + this.add([asset.name, bundleAssetId], asset.srcs, asset.data); + } else { + const bundleIds = asset.name.map((name) => this._createBundleAssetId(bundleId, name)); + bundleIds.forEach((bundleId2) => { + assetNames.push(bundleId2); + }); + this.add([...asset.name, ...bundleIds], asset.srcs); + } + }); + } else { + Object.keys(assets).forEach((key) => { + assetNames.push(this._createBundleAssetId(bundleId, key)); + this.add([key, this._createBundleAssetId(bundleId, key)], assets[key]); + }); + } + this._bundles[bundleId] = assetNames; + } + add(keysIn, assetsIn, data) { + const keys = convertToList(keysIn); + keys.forEach((key) => { + if (this.hasKey(key)) { + console.warn(`[Resolver] already has key: ${key} overwriting`); + } + }); + if (!Array.isArray(assetsIn)) { + if (typeof assetsIn === "string") { + assetsIn = createStringVariations(assetsIn); + } else { + assetsIn = [assetsIn]; + } + } + const assetMap = assetsIn.map((asset) => { + let formattedAsset = asset; + if (typeof asset === "string") { + let parsed = false; + for (let i = 0; i < this._parsers.length; i++) { + const parser = this._parsers[i]; + if (parser.test(asset)) { + formattedAsset = parser.parse(asset); + parsed = true; + break; + } + } + if (!parsed) { + formattedAsset = { + src: asset + }; + } + } + if (!formattedAsset.format) { + formattedAsset.format = formattedAsset.src.split(".").pop(); + } + if (!formattedAsset.alias) { + formattedAsset.alias = keys; + } + if (this._basePath || this._rootPath) { + formattedAsset.src = path.toAbsolute(formattedAsset.src, this._basePath, this._rootPath); + } + formattedAsset.src = this._appendDefaultSearchParams(formattedAsset.src); + formattedAsset.data = formattedAsset.data ?? data; + return formattedAsset; + }); + keys.forEach((key) => { + this._assetMap[key] = assetMap; + }); + } + resolveBundle(bundleIds) { + const singleAsset = isSingleItem(bundleIds); + bundleIds = convertToList(bundleIds); + const out = {}; + bundleIds.forEach((bundleId) => { + const assetNames = this._bundles[bundleId]; + if (assetNames) { + const results = this.resolve(assetNames); + const assets = {}; + for (const key in results) { + const asset = results[key]; + assets[this._extractAssetIdFromBundle(bundleId, key)] = asset; + } + out[bundleId] = assets; + } + }); + return singleAsset ? out[bundleIds[0]] : out; + } + resolveUrl(key) { + const result = this.resolve(key); + if (typeof key !== "string") { + const out = {}; + for (const i in result) { + out[i] = result[i].src; + } + return out; + } + return result.src; + } + resolve(keys) { + const singleAsset = isSingleItem(keys); + keys = convertToList(keys); + const result = {}; + keys.forEach((key) => { + if (!this._resolverHash[key]) { + if (this._assetMap[key]) { + let assets = this._assetMap[key]; + const preferredOrder = this._getPreferredOrder(assets); + const bestAsset = assets[0]; + preferredOrder?.priority.forEach((priorityKey) => { + preferredOrder.params[priorityKey].forEach((value) => { + const filteredAssets = assets.filter((asset) => { + if (asset[priorityKey]) { + return asset[priorityKey] === value; + } + return false; + }); + if (filteredAssets.length) { + assets = filteredAssets; + } + }); + }); + this._resolverHash[key] = assets[0] ?? bestAsset; + } else { + let src = key; + if (this._basePath || this._rootPath) { + src = path.toAbsolute(src, this._basePath, this._rootPath); + } + src = this._appendDefaultSearchParams(src); + this._resolverHash[key] = { + src + }; + } + } + result[key] = this._resolverHash[key]; + }); + return singleAsset ? result[keys[0]] : result; + } + hasKey(key) { + return !!this._assetMap[key]; + } + hasBundle(key) { + return !!this._bundles[key]; + } + _getPreferredOrder(assets) { + for (let i = 0; i < assets.length; i++) { + const asset = assets[0]; + const preferred = this._preferredOrder.find((preference) => preference.params.format.includes(asset.format)); + if (preferred) { + return preferred; + } + } + return this._preferredOrder[0]; + } + _appendDefaultSearchParams(url) { + if (!this._defaultSearchParams) + return url; + const paramConnector = /\?/.test(url) ? "&" : "?"; + return `${url}${paramConnector}${this._defaultSearchParams}`; + } + } + + class AssetsClass { + constructor() { + this._detections = []; + this._initialized = false; + this.resolver = new Resolver(); + this.loader = new Loader(); + this.cache = Cache; + this._backgroundLoader = new BackgroundLoader(this.loader); + this._backgroundLoader.active = true; + this.reset(); + } + async init(options = {}) { + if (this._initialized) { + console.warn("[Assets]AssetManager already initialized, did you load before calling this Asset.init()?"); + return; + } + this._initialized = true; + if (options.defaultSearchParams) { + this.resolver.setDefaultSearchParams(options.defaultSearchParams); + } + if (options.basePath) { + this.resolver.basePath = options.basePath; + } + if (options.bundleIdentifier) { + this.resolver.setBundleIdentifier(options.bundleIdentifier); + } + if (options.manifest) { + let manifest = options.manifest; + if (typeof manifest === "string") { + manifest = await this.load(manifest); + } + this.resolver.addManifest(manifest); + } + const resolutionPref = options.texturePreference?.resolution ?? 1; + const resolution = typeof resolutionPref === "number" ? [resolutionPref] : resolutionPref; + let formats = []; + if (options.texturePreference?.format) { + const formatPref = options.texturePreference?.format; + formats = typeof formatPref === "string" ? [formatPref] : formatPref; + for (const detection of this._detections) { + if (!await detection.test()) { + formats = await detection.remove(formats); + } + } + } else { + for (const detection of this._detections) { + if (await detection.test()) { + formats = await detection.add(formats); + } + } + } + this.resolver.prefer({ + params: { + format: formats, + resolution + } + }); + if (options.preferences) { + this.setPreferences(options.preferences); + } + } + add(keysIn, assetsIn, data) { + this.resolver.add(keysIn, assetsIn, data); + } + async load(urls, onProgress) { + if (!this._initialized) { + await this.init(); + } + const singleAsset = isSingleItem(urls); + const urlArray = convertToList(urls).map((url) => { + if (typeof url !== "string") { + this.resolver.add(url.src, url); + return url.src; + } + if (!this.resolver.hasKey(url)) { + this.resolver.add(url, url); + } + return url; + }); + const resolveResults = this.resolver.resolve(urlArray); + const out = await this._mapLoadToResolve(resolveResults, onProgress); + return singleAsset ? out[urlArray[0]] : out; + } + addBundle(bundleId, assets) { + this.resolver.addBundle(bundleId, assets); + } + async loadBundle(bundleIds, onProgress) { + if (!this._initialized) { + await this.init(); + } + let singleAsset = false; + if (typeof bundleIds === "string") { + singleAsset = true; + bundleIds = [bundleIds]; + } + const resolveResults = this.resolver.resolveBundle(bundleIds); + const out = {}; + const keys = Object.keys(resolveResults); + let count = 0; + let total = 0; + const _onProgress = () => { + onProgress?.(++count / total); + }; + const promises = keys.map((bundleId) => { + const resolveResult = resolveResults[bundleId]; + total += Object.keys(resolveResult).length; + return this._mapLoadToResolve(resolveResult, _onProgress).then((resolveResult2) => { + out[bundleId] = resolveResult2; + }); + }); + await Promise.all(promises); + return singleAsset ? out[bundleIds[0]] : out; + } + async backgroundLoad(urls) { + if (!this._initialized) { + await this.init(); + } + if (typeof urls === "string") { + urls = [urls]; + } + const resolveResults = this.resolver.resolve(urls); + this._backgroundLoader.add(Object.values(resolveResults)); + } + async backgroundLoadBundle(bundleIds) { + if (!this._initialized) { + await this.init(); + } + if (typeof bundleIds === "string") { + bundleIds = [bundleIds]; + } + const resolveResults = this.resolver.resolveBundle(bundleIds); + Object.values(resolveResults).forEach((resolveResult) => { + this._backgroundLoader.add(Object.values(resolveResult)); + }); + } + reset() { + this.resolver.reset(); + this.loader.reset(); + this.cache.reset(); + this._initialized = false; + } + get(keys) { + if (typeof keys === "string") { + return Cache.get(keys); + } + const assets = {}; + for (let i = 0; i < keys.length; i++) { + assets[i] = Cache.get(keys[i]); + } + return assets; + } + async _mapLoadToResolve(resolveResults, onProgress) { + const resolveArray = Object.values(resolveResults); + const resolveKeys = Object.keys(resolveResults); + this._backgroundLoader.active = false; + const loadedAssets = await this.loader.load(resolveArray, onProgress); + this._backgroundLoader.active = true; + const out = {}; + resolveArray.forEach((resolveResult, i) => { + const asset = loadedAssets[resolveResult.src]; + const keys = [resolveResult.src]; + if (resolveResult.alias) { + keys.push(...resolveResult.alias); + } + out[resolveKeys[i]] = asset; + Cache.set(keys, asset); + }); + return out; + } + async unload(urls) { + if (!this._initialized) { + await this.init(); + } + const urlArray = convertToList(urls).map((url) => typeof url !== "string" ? url.src : url); + const resolveResults = this.resolver.resolve(urlArray); + await this._unloadFromResolved(resolveResults); + } + async unloadBundle(bundleIds) { + if (!this._initialized) { + await this.init(); + } + bundleIds = convertToList(bundleIds); + const resolveResults = this.resolver.resolveBundle(bundleIds); + const promises = Object.keys(resolveResults).map((bundleId) => this._unloadFromResolved(resolveResults[bundleId])); + await Promise.all(promises); + } + async _unloadFromResolved(resolveResult) { + const resolveArray = Object.values(resolveResult); + resolveArray.forEach((resolveResult2) => { + Cache.remove(resolveResult2.src); + }); + await this.loader.unload(resolveArray); + } + get detections() { + return this._detections; + } + get preferWorkers() { + return loadTextures.config.preferWorkers; + } + set preferWorkers(value) { + deprecation("7.2.0", "Assets.prefersWorkers is deprecated, use Assets.setPreferences({ preferWorkers: true }) instead."); + this.setPreferences({ preferWorkers: value }); + } + setPreferences(preferences) { + this.loader.parsers.forEach((parser) => { + if (!parser.config) + return; + Object.keys(parser.config).filter((key) => key in preferences).forEach((key) => { + parser.config[key] = preferences[key]; + }); + }); + } + } + const Assets = new AssetsClass(); + extensions$1.handleByList(ExtensionType.LoadParser, Assets.loader.parsers).handleByList(ExtensionType.ResolveParser, Assets.resolver.parsers).handleByList(ExtensionType.CacheParser, Assets.cache.parsers).handleByList(ExtensionType.DetectionParser, Assets.detections); + + const cacheTextureArray = { + extension: ExtensionType.CacheParser, + test: (asset) => Array.isArray(asset) && asset.every((t) => t instanceof Texture), + getCacheableAssets: (keys, asset) => { + const out = {}; + keys.forEach((key) => { + asset.forEach((item, i) => { + out[key + (i === 0 ? "" : i + 1)] = item; + }); + }); + return out; + } + }; + extensions$1.add(cacheTextureArray); + + const detectAvif = { + extension: { + type: ExtensionType.DetectionParser, + priority: 1 + }, + test: async () => { + if (!globalThis.createImageBitmap) + return false; + const avifData = "data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A="; + const blob = await settings.ADAPTER.fetch(avifData).then((r) => r.blob()); + return createImageBitmap(blob).then(() => true, () => false); + }, + add: async (formats) => [...formats, "avif"], + remove: async (formats) => formats.filter((f) => f !== "avif") + }; + extensions$1.add(detectAvif); + + const detectWebp = { + extension: { + type: ExtensionType.DetectionParser, + priority: 0 + }, + test: async () => { + if (!globalThis.createImageBitmap) + return false; + const webpData = "data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA="; + const blob = await settings.ADAPTER.fetch(webpData).then((r) => r.blob()); + return createImageBitmap(blob).then(() => true, () => false); + }, + add: async (formats) => [...formats, "webp"], + remove: async (formats) => formats.filter((f) => f !== "webp") + }; + extensions$1.add(detectWebp); + + const imageFormats = ["png", "jpg", "jpeg"]; + const detectDefaults = { + extension: { + type: ExtensionType.DetectionParser, + priority: -1 + }, + test: () => Promise.resolve(true), + add: async (formats) => [...formats, ...imageFormats], + remove: async (formats) => formats.filter((f) => !imageFormats.includes(f)) + }; + extensions$1.add(detectDefaults); + + const resolveTextureUrl = { + extension: ExtensionType.ResolveParser, + test: loadTextures.test, + parse: (value) => ({ + resolution: parseFloat(settings.RETINA_PREFIX.exec(value)?.[1] ?? "1"), + format: value.split(".").pop(), + src: value + }) + }; + extensions$1.add(resolveTextureUrl); + + var INTERNAL_FORMATS = /* @__PURE__ */ ((INTERNAL_FORMATS2) => { + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGB_S3TC_DXT1_EXT"] = 33776] = "COMPRESSED_RGB_S3TC_DXT1_EXT"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGBA_S3TC_DXT1_EXT"] = 33777] = "COMPRESSED_RGBA_S3TC_DXT1_EXT"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGBA_S3TC_DXT3_EXT"] = 33778] = "COMPRESSED_RGBA_S3TC_DXT3_EXT"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGBA_S3TC_DXT5_EXT"] = 33779] = "COMPRESSED_RGBA_S3TC_DXT5_EXT"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT"] = 35917] = "COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT"] = 35918] = "COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT"] = 35919] = "COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_SRGB_S3TC_DXT1_EXT"] = 35916] = "COMPRESSED_SRGB_S3TC_DXT1_EXT"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_R11_EAC"] = 37488] = "COMPRESSED_R11_EAC"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_SIGNED_R11_EAC"] = 37489] = "COMPRESSED_SIGNED_R11_EAC"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RG11_EAC"] = 37490] = "COMPRESSED_RG11_EAC"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_SIGNED_RG11_EAC"] = 37491] = "COMPRESSED_SIGNED_RG11_EAC"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGB8_ETC2"] = 37492] = "COMPRESSED_RGB8_ETC2"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGBA8_ETC2_EAC"] = 37496] = "COMPRESSED_RGBA8_ETC2_EAC"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_SRGB8_ETC2"] = 37493] = "COMPRESSED_SRGB8_ETC2"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"] = 37497] = "COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"] = 37494] = "COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"] = 37495] = "COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGB_PVRTC_4BPPV1_IMG"] = 35840] = "COMPRESSED_RGB_PVRTC_4BPPV1_IMG"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"] = 35842] = "COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGB_PVRTC_2BPPV1_IMG"] = 35841] = "COMPRESSED_RGB_PVRTC_2BPPV1_IMG"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"] = 35843] = "COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGB_ETC1_WEBGL"] = 36196] = "COMPRESSED_RGB_ETC1_WEBGL"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGB_ATC_WEBGL"] = 35986] = "COMPRESSED_RGB_ATC_WEBGL"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL"] = 35986] = "COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL"] = 34798] = "COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL"; + INTERNAL_FORMATS2[INTERNAL_FORMATS2["COMPRESSED_RGBA_ASTC_4x4_KHR"] = 37808] = "COMPRESSED_RGBA_ASTC_4x4_KHR"; + return INTERNAL_FORMATS2; + })(INTERNAL_FORMATS || {}); + const INTERNAL_FORMAT_TO_BYTES_PER_PIXEL = { + [33776 /* COMPRESSED_RGB_S3TC_DXT1_EXT */]: 0.5, + [33777 /* COMPRESSED_RGBA_S3TC_DXT1_EXT */]: 0.5, + [33778 /* COMPRESSED_RGBA_S3TC_DXT3_EXT */]: 1, + [33779 /* COMPRESSED_RGBA_S3TC_DXT5_EXT */]: 1, + [35916 /* COMPRESSED_SRGB_S3TC_DXT1_EXT */]: 0.5, + [35917 /* COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT */]: 0.5, + [35918 /* COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT */]: 1, + [35919 /* COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT */]: 1, + [37488 /* COMPRESSED_R11_EAC */]: 0.5, + [37489 /* COMPRESSED_SIGNED_R11_EAC */]: 0.5, + [37490 /* COMPRESSED_RG11_EAC */]: 1, + [37491 /* COMPRESSED_SIGNED_RG11_EAC */]: 1, + [37492 /* COMPRESSED_RGB8_ETC2 */]: 0.5, + [37496 /* COMPRESSED_RGBA8_ETC2_EAC */]: 1, + [37493 /* COMPRESSED_SRGB8_ETC2 */]: 0.5, + [37497 /* COMPRESSED_SRGB8_ALPHA8_ETC2_EAC */]: 1, + [37494 /* COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 */]: 0.5, + [37495 /* COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 */]: 0.5, + [35840 /* COMPRESSED_RGB_PVRTC_4BPPV1_IMG */]: 0.5, + [35842 /* COMPRESSED_RGBA_PVRTC_4BPPV1_IMG */]: 0.5, + [35841 /* COMPRESSED_RGB_PVRTC_2BPPV1_IMG */]: 0.25, + [35843 /* COMPRESSED_RGBA_PVRTC_2BPPV1_IMG */]: 0.25, + [36196 /* COMPRESSED_RGB_ETC1_WEBGL */]: 0.5, + [35986 /* COMPRESSED_RGB_ATC_WEBGL */]: 0.5, + [35986 /* COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL */]: 1, + [34798 /* COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL */]: 1, + [37808 /* COMPRESSED_RGBA_ASTC_4x4_KHR */]: 1 + }; + + let storedGl; + let extensions; + function getCompressedTextureExtensions() { + extensions = { + s3tc: storedGl.getExtension("WEBGL_compressed_texture_s3tc"), + s3tc_sRGB: storedGl.getExtension("WEBGL_compressed_texture_s3tc_srgb"), + etc: storedGl.getExtension("WEBGL_compressed_texture_etc"), + etc1: storedGl.getExtension("WEBGL_compressed_texture_etc1"), + pvrtc: storedGl.getExtension("WEBGL_compressed_texture_pvrtc") || storedGl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"), + atc: storedGl.getExtension("WEBGL_compressed_texture_atc"), + astc: storedGl.getExtension("WEBGL_compressed_texture_astc") + }; + } + const detectCompressedTextures = { + extension: { + type: ExtensionType.DetectionParser, + priority: 2 + }, + test: async () => { + const canvas = settings.ADAPTER.createCanvas(); + const gl = canvas.getContext("webgl"); + if (!gl) { + console.warn("WebGL not available for compressed textures."); + return false; + } + storedGl = gl; + return true; + }, + add: async (formats) => { + if (!extensions) + getCompressedTextureExtensions(); + const textureFormats = []; + for (const extensionName in extensions) { + const extension = extensions[extensionName]; + if (!extension) { + continue; + } + textureFormats.push(extensionName); + } + return [...textureFormats, ...formats]; + }, + remove: async (formats) => { + if (!extensions) + getCompressedTextureExtensions(); + return formats.filter((f) => !(f in extensions)); + } + }; + extensions$1.add(detectCompressedTextures); + + class BlobResource extends BufferResource { + constructor(source, options = { width: 1, height: 1, autoLoad: true }) { + let origin; + let data; + if (typeof source === "string") { + origin = source; + data = new Uint8Array(); + } else { + origin = null; + data = source; + } + super(data, options); + this.origin = origin; + this.buffer = data ? new ViewableBuffer(data) : null; + if (this.origin && options.autoLoad !== false) { + this.load(); + } + if (data?.length) { + this.loaded = true; + this.onBlobLoaded(this.buffer.rawBinaryData); + } + } + onBlobLoaded(_data) { + } + async load() { + const response = await fetch(this.origin); + const blob = await response.blob(); + const arrayBuffer = await blob.arrayBuffer(); + this.data = new Uint32Array(arrayBuffer); + this.buffer = new ViewableBuffer(arrayBuffer); + this.loaded = true; + this.onBlobLoaded(arrayBuffer); + this.update(); + return this; + } + } + + class CompressedTextureResource extends BlobResource { + constructor(source, options) { + super(source, options); + this.format = options.format; + this.levels = options.levels || 1; + this._width = options.width; + this._height = options.height; + this._extension = CompressedTextureResource._formatToExtension(this.format); + if (options.levelBuffers || this.buffer) { + this._levelBuffers = options.levelBuffers || CompressedTextureResource._createLevelBuffers(source instanceof Uint8Array ? source : this.buffer.uint8View, this.format, this.levels, 4, 4, this.width, this.height); + } + } + upload(renderer, _texture, _glTexture) { + const gl = renderer.gl; + const extension = renderer.context.extensions[this._extension]; + if (!extension) { + throw new Error(`${this._extension} textures are not supported on the current machine`); + } + if (!this._levelBuffers) { + return false; + } + for (let i = 0, j = this.levels; i < j; i++) { + const { levelID, levelWidth, levelHeight, levelBuffer } = this._levelBuffers[i]; + gl.compressedTexImage2D(gl.TEXTURE_2D, levelID, this.format, levelWidth, levelHeight, 0, levelBuffer); + } + return true; + } + onBlobLoaded() { + this._levelBuffers = CompressedTextureResource._createLevelBuffers(this.buffer.uint8View, this.format, this.levels, 4, 4, this.width, this.height); + } + static _formatToExtension(format) { + if (format >= 33776 && format <= 33779) { + return "s3tc"; + } else if (format >= 37488 && format <= 37497) { + return "etc"; + } else if (format >= 35840 && format <= 35843) { + return "pvrtc"; + } else if (format >= 36196) { + return "etc1"; + } else if (format >= 35986 && format <= 34798) { + return "atc"; + } + throw new Error("Invalid (compressed) texture format given!"); + } + static _createLevelBuffers(buffer, format, levels, blockWidth, blockHeight, imageWidth, imageHeight) { + const buffers = new Array(levels); + let offset = buffer.byteOffset; + let levelWidth = imageWidth; + let levelHeight = imageHeight; + let alignedLevelWidth = levelWidth + blockWidth - 1 & ~(blockWidth - 1); + let alignedLevelHeight = levelHeight + blockHeight - 1 & ~(blockHeight - 1); + let levelSize = alignedLevelWidth * alignedLevelHeight * INTERNAL_FORMAT_TO_BYTES_PER_PIXEL[format]; + for (let i = 0; i < levels; i++) { + buffers[i] = { + levelID: i, + levelWidth: levels > 1 ? levelWidth : alignedLevelWidth, + levelHeight: levels > 1 ? levelHeight : alignedLevelHeight, + levelBuffer: new Uint8Array(buffer.buffer, offset, levelSize) + }; + offset += levelSize; + levelWidth = levelWidth >> 1 || 1; + levelHeight = levelHeight >> 1 || 1; + alignedLevelWidth = levelWidth + blockWidth - 1 & ~(blockWidth - 1); + alignedLevelHeight = levelHeight + blockHeight - 1 & ~(blockHeight - 1); + levelSize = alignedLevelWidth * alignedLevelHeight * INTERNAL_FORMAT_TO_BYTES_PER_PIXEL[format]; + } + return buffers; + } + } + + const DDS_MAGIC_SIZE = 4; + const DDS_HEADER_SIZE = 124; + const DDS_HEADER_PF_SIZE = 32; + const DDS_HEADER_DX10_SIZE = 20; + const DDS_MAGIC = 542327876; + const DDS_FIELDS = { + SIZE: 1, + FLAGS: 2, + HEIGHT: 3, + WIDTH: 4, + MIPMAP_COUNT: 7, + PIXEL_FORMAT: 19 + }; + const DDS_PF_FIELDS = { + SIZE: 0, + FLAGS: 1, + FOURCC: 2, + RGB_BITCOUNT: 3, + R_BIT_MASK: 4, + G_BIT_MASK: 5, + B_BIT_MASK: 6, + A_BIT_MASK: 7 + }; + const DDS_DX10_FIELDS = { + DXGI_FORMAT: 0, + RESOURCE_DIMENSION: 1, + MISC_FLAG: 2, + ARRAY_SIZE: 3, + MISC_FLAGS2: 4 + }; + var DXGI_FORMAT = /* @__PURE__ */ ((DXGI_FORMAT2) => { + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_UNKNOWN"] = 0] = "DXGI_FORMAT_UNKNOWN"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32B32A32_TYPELESS"] = 1] = "DXGI_FORMAT_R32G32B32A32_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32B32A32_FLOAT"] = 2] = "DXGI_FORMAT_R32G32B32A32_FLOAT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32B32A32_UINT"] = 3] = "DXGI_FORMAT_R32G32B32A32_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32B32A32_SINT"] = 4] = "DXGI_FORMAT_R32G32B32A32_SINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32B32_TYPELESS"] = 5] = "DXGI_FORMAT_R32G32B32_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32B32_FLOAT"] = 6] = "DXGI_FORMAT_R32G32B32_FLOAT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32B32_UINT"] = 7] = "DXGI_FORMAT_R32G32B32_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32B32_SINT"] = 8] = "DXGI_FORMAT_R32G32B32_SINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16B16A16_TYPELESS"] = 9] = "DXGI_FORMAT_R16G16B16A16_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16B16A16_FLOAT"] = 10] = "DXGI_FORMAT_R16G16B16A16_FLOAT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16B16A16_UNORM"] = 11] = "DXGI_FORMAT_R16G16B16A16_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16B16A16_UINT"] = 12] = "DXGI_FORMAT_R16G16B16A16_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16B16A16_SNORM"] = 13] = "DXGI_FORMAT_R16G16B16A16_SNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16B16A16_SINT"] = 14] = "DXGI_FORMAT_R16G16B16A16_SINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32_TYPELESS"] = 15] = "DXGI_FORMAT_R32G32_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32_FLOAT"] = 16] = "DXGI_FORMAT_R32G32_FLOAT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32_UINT"] = 17] = "DXGI_FORMAT_R32G32_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G32_SINT"] = 18] = "DXGI_FORMAT_R32G32_SINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32G8X24_TYPELESS"] = 19] = "DXGI_FORMAT_R32G8X24_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_D32_FLOAT_S8X24_UINT"] = 20] = "DXGI_FORMAT_D32_FLOAT_S8X24_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS"] = 21] = "DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_X32_TYPELESS_G8X24_UINT"] = 22] = "DXGI_FORMAT_X32_TYPELESS_G8X24_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R10G10B10A2_TYPELESS"] = 23] = "DXGI_FORMAT_R10G10B10A2_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R10G10B10A2_UNORM"] = 24] = "DXGI_FORMAT_R10G10B10A2_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R10G10B10A2_UINT"] = 25] = "DXGI_FORMAT_R10G10B10A2_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R11G11B10_FLOAT"] = 26] = "DXGI_FORMAT_R11G11B10_FLOAT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8B8A8_TYPELESS"] = 27] = "DXGI_FORMAT_R8G8B8A8_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8B8A8_UNORM"] = 28] = "DXGI_FORMAT_R8G8B8A8_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8B8A8_UNORM_SRGB"] = 29] = "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8B8A8_UINT"] = 30] = "DXGI_FORMAT_R8G8B8A8_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8B8A8_SNORM"] = 31] = "DXGI_FORMAT_R8G8B8A8_SNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8B8A8_SINT"] = 32] = "DXGI_FORMAT_R8G8B8A8_SINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16_TYPELESS"] = 33] = "DXGI_FORMAT_R16G16_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16_FLOAT"] = 34] = "DXGI_FORMAT_R16G16_FLOAT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16_UNORM"] = 35] = "DXGI_FORMAT_R16G16_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16_UINT"] = 36] = "DXGI_FORMAT_R16G16_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16_SNORM"] = 37] = "DXGI_FORMAT_R16G16_SNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16G16_SINT"] = 38] = "DXGI_FORMAT_R16G16_SINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32_TYPELESS"] = 39] = "DXGI_FORMAT_R32_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_D32_FLOAT"] = 40] = "DXGI_FORMAT_D32_FLOAT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32_FLOAT"] = 41] = "DXGI_FORMAT_R32_FLOAT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32_UINT"] = 42] = "DXGI_FORMAT_R32_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R32_SINT"] = 43] = "DXGI_FORMAT_R32_SINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R24G8_TYPELESS"] = 44] = "DXGI_FORMAT_R24G8_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_D24_UNORM_S8_UINT"] = 45] = "DXGI_FORMAT_D24_UNORM_S8_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R24_UNORM_X8_TYPELESS"] = 46] = "DXGI_FORMAT_R24_UNORM_X8_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_X24_TYPELESS_G8_UINT"] = 47] = "DXGI_FORMAT_X24_TYPELESS_G8_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8_TYPELESS"] = 48] = "DXGI_FORMAT_R8G8_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8_UNORM"] = 49] = "DXGI_FORMAT_R8G8_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8_UINT"] = 50] = "DXGI_FORMAT_R8G8_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8_SNORM"] = 51] = "DXGI_FORMAT_R8G8_SNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8_SINT"] = 52] = "DXGI_FORMAT_R8G8_SINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16_TYPELESS"] = 53] = "DXGI_FORMAT_R16_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16_FLOAT"] = 54] = "DXGI_FORMAT_R16_FLOAT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_D16_UNORM"] = 55] = "DXGI_FORMAT_D16_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16_UNORM"] = 56] = "DXGI_FORMAT_R16_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16_UINT"] = 57] = "DXGI_FORMAT_R16_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16_SNORM"] = 58] = "DXGI_FORMAT_R16_SNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R16_SINT"] = 59] = "DXGI_FORMAT_R16_SINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8_TYPELESS"] = 60] = "DXGI_FORMAT_R8_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8_UNORM"] = 61] = "DXGI_FORMAT_R8_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8_UINT"] = 62] = "DXGI_FORMAT_R8_UINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8_SNORM"] = 63] = "DXGI_FORMAT_R8_SNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8_SINT"] = 64] = "DXGI_FORMAT_R8_SINT"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_A8_UNORM"] = 65] = "DXGI_FORMAT_A8_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R1_UNORM"] = 66] = "DXGI_FORMAT_R1_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R9G9B9E5_SHAREDEXP"] = 67] = "DXGI_FORMAT_R9G9B9E5_SHAREDEXP"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R8G8_B8G8_UNORM"] = 68] = "DXGI_FORMAT_R8G8_B8G8_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_G8R8_G8B8_UNORM"] = 69] = "DXGI_FORMAT_G8R8_G8B8_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC1_TYPELESS"] = 70] = "DXGI_FORMAT_BC1_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC1_UNORM"] = 71] = "DXGI_FORMAT_BC1_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC1_UNORM_SRGB"] = 72] = "DXGI_FORMAT_BC1_UNORM_SRGB"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC2_TYPELESS"] = 73] = "DXGI_FORMAT_BC2_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC2_UNORM"] = 74] = "DXGI_FORMAT_BC2_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC2_UNORM_SRGB"] = 75] = "DXGI_FORMAT_BC2_UNORM_SRGB"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC3_TYPELESS"] = 76] = "DXGI_FORMAT_BC3_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC3_UNORM"] = 77] = "DXGI_FORMAT_BC3_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC3_UNORM_SRGB"] = 78] = "DXGI_FORMAT_BC3_UNORM_SRGB"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC4_TYPELESS"] = 79] = "DXGI_FORMAT_BC4_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC4_UNORM"] = 80] = "DXGI_FORMAT_BC4_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC4_SNORM"] = 81] = "DXGI_FORMAT_BC4_SNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC5_TYPELESS"] = 82] = "DXGI_FORMAT_BC5_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC5_UNORM"] = 83] = "DXGI_FORMAT_BC5_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC5_SNORM"] = 84] = "DXGI_FORMAT_BC5_SNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_B5G6R5_UNORM"] = 85] = "DXGI_FORMAT_B5G6R5_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_B5G5R5A1_UNORM"] = 86] = "DXGI_FORMAT_B5G5R5A1_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_B8G8R8A8_UNORM"] = 87] = "DXGI_FORMAT_B8G8R8A8_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_B8G8R8X8_UNORM"] = 88] = "DXGI_FORMAT_B8G8R8X8_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM"] = 89] = "DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_B8G8R8A8_TYPELESS"] = 90] = "DXGI_FORMAT_B8G8R8A8_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_B8G8R8A8_UNORM_SRGB"] = 91] = "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_B8G8R8X8_TYPELESS"] = 92] = "DXGI_FORMAT_B8G8R8X8_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_B8G8R8X8_UNORM_SRGB"] = 93] = "DXGI_FORMAT_B8G8R8X8_UNORM_SRGB"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC6H_TYPELESS"] = 94] = "DXGI_FORMAT_BC6H_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC6H_UF16"] = 95] = "DXGI_FORMAT_BC6H_UF16"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC6H_SF16"] = 96] = "DXGI_FORMAT_BC6H_SF16"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC7_TYPELESS"] = 97] = "DXGI_FORMAT_BC7_TYPELESS"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC7_UNORM"] = 98] = "DXGI_FORMAT_BC7_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_BC7_UNORM_SRGB"] = 99] = "DXGI_FORMAT_BC7_UNORM_SRGB"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_AYUV"] = 100] = "DXGI_FORMAT_AYUV"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_Y410"] = 101] = "DXGI_FORMAT_Y410"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_Y416"] = 102] = "DXGI_FORMAT_Y416"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_NV12"] = 103] = "DXGI_FORMAT_NV12"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_P010"] = 104] = "DXGI_FORMAT_P010"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_P016"] = 105] = "DXGI_FORMAT_P016"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_420_OPAQUE"] = 106] = "DXGI_FORMAT_420_OPAQUE"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_YUY2"] = 107] = "DXGI_FORMAT_YUY2"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_Y210"] = 108] = "DXGI_FORMAT_Y210"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_Y216"] = 109] = "DXGI_FORMAT_Y216"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_NV11"] = 110] = "DXGI_FORMAT_NV11"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_AI44"] = 111] = "DXGI_FORMAT_AI44"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_IA44"] = 112] = "DXGI_FORMAT_IA44"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_P8"] = 113] = "DXGI_FORMAT_P8"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_A8P8"] = 114] = "DXGI_FORMAT_A8P8"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_B4G4R4A4_UNORM"] = 115] = "DXGI_FORMAT_B4G4R4A4_UNORM"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_P208"] = 116] = "DXGI_FORMAT_P208"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_V208"] = 117] = "DXGI_FORMAT_V208"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_V408"] = 118] = "DXGI_FORMAT_V408"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE"] = 119] = "DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE"] = 120] = "DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE"; + DXGI_FORMAT2[DXGI_FORMAT2["DXGI_FORMAT_FORCE_UINT"] = 121] = "DXGI_FORMAT_FORCE_UINT"; + return DXGI_FORMAT2; + })(DXGI_FORMAT || {}); + var D3D10_RESOURCE_DIMENSION = /* @__PURE__ */ ((D3D10_RESOURCE_DIMENSION2) => { + D3D10_RESOURCE_DIMENSION2[D3D10_RESOURCE_DIMENSION2["DDS_DIMENSION_TEXTURE1D"] = 2] = "DDS_DIMENSION_TEXTURE1D"; + D3D10_RESOURCE_DIMENSION2[D3D10_RESOURCE_DIMENSION2["DDS_DIMENSION_TEXTURE2D"] = 3] = "DDS_DIMENSION_TEXTURE2D"; + D3D10_RESOURCE_DIMENSION2[D3D10_RESOURCE_DIMENSION2["DDS_DIMENSION_TEXTURE3D"] = 6] = "DDS_DIMENSION_TEXTURE3D"; + return D3D10_RESOURCE_DIMENSION2; + })(D3D10_RESOURCE_DIMENSION || {}); + const PF_FLAGS = 1; + const DDPF_ALPHA = 2; + const DDPF_FOURCC = 4; + const DDPF_RGB = 64; + const DDPF_YUV = 512; + const DDPF_LUMINANCE = 131072; + const FOURCC_DXT1 = 827611204; + const FOURCC_DXT3 = 861165636; + const FOURCC_DXT5 = 894720068; + const FOURCC_DX10 = 808540228; + const DDS_RESOURCE_MISC_TEXTURECUBE = 4; + const FOURCC_TO_FORMAT = { + [FOURCC_DXT1]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT1_EXT, + [FOURCC_DXT3]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT3_EXT, + [FOURCC_DXT5]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT5_EXT + }; + const DXGI_TO_FORMAT = { + [70 /* DXGI_FORMAT_BC1_TYPELESS */]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT1_EXT, + [71 /* DXGI_FORMAT_BC1_UNORM */]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT1_EXT, + [73 /* DXGI_FORMAT_BC2_TYPELESS */]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT3_EXT, + [74 /* DXGI_FORMAT_BC2_UNORM */]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT3_EXT, + [76 /* DXGI_FORMAT_BC3_TYPELESS */]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT5_EXT, + [77 /* DXGI_FORMAT_BC3_UNORM */]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT5_EXT, + [72 /* DXGI_FORMAT_BC1_UNORM_SRGB */]: INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, + [75 /* DXGI_FORMAT_BC2_UNORM_SRGB */]: INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, + [78 /* DXGI_FORMAT_BC3_UNORM_SRGB */]: INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT + }; + function parseDDS(arrayBuffer) { + const data = new Uint32Array(arrayBuffer); + const magicWord = data[0]; + if (magicWord !== DDS_MAGIC) { + throw new Error("Invalid DDS file magic word"); + } + const header = new Uint32Array(arrayBuffer, 0, DDS_HEADER_SIZE / Uint32Array.BYTES_PER_ELEMENT); + const height = header[DDS_FIELDS.HEIGHT]; + const width = header[DDS_FIELDS.WIDTH]; + const mipmapCount = header[DDS_FIELDS.MIPMAP_COUNT]; + const pixelFormat = new Uint32Array(arrayBuffer, DDS_FIELDS.PIXEL_FORMAT * Uint32Array.BYTES_PER_ELEMENT, DDS_HEADER_PF_SIZE / Uint32Array.BYTES_PER_ELEMENT); + const formatFlags = pixelFormat[PF_FLAGS]; + if (formatFlags & DDPF_FOURCC) { + const fourCC = pixelFormat[DDS_PF_FIELDS.FOURCC]; + if (fourCC !== FOURCC_DX10) { + const internalFormat2 = FOURCC_TO_FORMAT[fourCC]; + const dataOffset2 = DDS_MAGIC_SIZE + DDS_HEADER_SIZE; + const texData = new Uint8Array(arrayBuffer, dataOffset2); + const resource = new CompressedTextureResource(texData, { + format: internalFormat2, + width, + height, + levels: mipmapCount + }); + return [resource]; + } + const dx10Offset = DDS_MAGIC_SIZE + DDS_HEADER_SIZE; + const dx10Header = new Uint32Array(data.buffer, dx10Offset, DDS_HEADER_DX10_SIZE / Uint32Array.BYTES_PER_ELEMENT); + const dxgiFormat = dx10Header[DDS_DX10_FIELDS.DXGI_FORMAT]; + const resourceDimension = dx10Header[DDS_DX10_FIELDS.RESOURCE_DIMENSION]; + const miscFlag = dx10Header[DDS_DX10_FIELDS.MISC_FLAG]; + const arraySize = dx10Header[DDS_DX10_FIELDS.ARRAY_SIZE]; + const internalFormat = DXGI_TO_FORMAT[dxgiFormat]; + if (internalFormat === void 0) { + throw new Error(`DDSParser cannot parse texture data with DXGI format ${dxgiFormat}`); + } + if (miscFlag === DDS_RESOURCE_MISC_TEXTURECUBE) { + throw new Error("DDSParser does not support cubemap textures"); + } + if (resourceDimension === 6 /* DDS_DIMENSION_TEXTURE3D */) { + throw new Error("DDSParser does not supported 3D texture data"); + } + const imageBuffers = new Array(); + const dataOffset = DDS_MAGIC_SIZE + DDS_HEADER_SIZE + DDS_HEADER_DX10_SIZE; + if (arraySize === 1) { + imageBuffers.push(new Uint8Array(arrayBuffer, dataOffset)); + } else { + const pixelSize = INTERNAL_FORMAT_TO_BYTES_PER_PIXEL[internalFormat]; + let imageSize = 0; + let levelWidth = width; + let levelHeight = height; + for (let i = 0; i < mipmapCount; i++) { + const alignedLevelWidth = Math.max(1, levelWidth + 3 & ~3); + const alignedLevelHeight = Math.max(1, levelHeight + 3 & ~3); + const levelSize = alignedLevelWidth * alignedLevelHeight * pixelSize; + imageSize += levelSize; + levelWidth = levelWidth >>> 1; + levelHeight = levelHeight >>> 1; + } + let imageOffset = dataOffset; + for (let i = 0; i < arraySize; i++) { + imageBuffers.push(new Uint8Array(arrayBuffer, imageOffset, imageSize)); + imageOffset += imageSize; + } + } + return imageBuffers.map((buffer) => new CompressedTextureResource(buffer, { + format: internalFormat, + width, + height, + levels: mipmapCount + })); + } + if (formatFlags & DDPF_RGB) { + throw new Error("DDSParser does not support uncompressed texture data."); + } + if (formatFlags & DDPF_YUV) { + throw new Error("DDSParser does not supported YUV uncompressed texture data."); + } + if (formatFlags & DDPF_LUMINANCE) { + throw new Error("DDSParser does not support single-channel (lumninance) texture data!"); + } + if (formatFlags & DDPF_ALPHA) { + throw new Error("DDSParser does not support single-channel (alpha) texture data!"); + } + throw new Error("DDSParser failed to load a texture file due to an unknown reason!"); + } + + const FILE_IDENTIFIER = [171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10]; + const ENDIANNESS = 67305985; + const KTX_FIELDS = { + FILE_IDENTIFIER: 0, + ENDIANNESS: 12, + GL_TYPE: 16, + GL_TYPE_SIZE: 20, + GL_FORMAT: 24, + GL_INTERNAL_FORMAT: 28, + GL_BASE_INTERNAL_FORMAT: 32, + PIXEL_WIDTH: 36, + PIXEL_HEIGHT: 40, + PIXEL_DEPTH: 44, + NUMBER_OF_ARRAY_ELEMENTS: 48, + NUMBER_OF_FACES: 52, + NUMBER_OF_MIPMAP_LEVELS: 56, + BYTES_OF_KEY_VALUE_DATA: 60 + }; + const FILE_HEADER_SIZE = 64; + const TYPES_TO_BYTES_PER_COMPONENT = { + [TYPES.UNSIGNED_BYTE]: 1, + [TYPES.UNSIGNED_SHORT]: 2, + [TYPES.INT]: 4, + [TYPES.UNSIGNED_INT]: 4, + [TYPES.FLOAT]: 4, + [TYPES.HALF_FLOAT]: 8 + }; + const FORMATS_TO_COMPONENTS = { + [FORMATS.RGBA]: 4, + [FORMATS.RGB]: 3, + [FORMATS.RG]: 2, + [FORMATS.RED]: 1, + [FORMATS.LUMINANCE]: 1, + [FORMATS.LUMINANCE_ALPHA]: 2, + [FORMATS.ALPHA]: 1 + }; + const TYPES_TO_BYTES_PER_PIXEL = { + [TYPES.UNSIGNED_SHORT_4_4_4_4]: 2, + [TYPES.UNSIGNED_SHORT_5_5_5_1]: 2, + [TYPES.UNSIGNED_SHORT_5_6_5]: 2 + }; + function parseKTX(url, arrayBuffer, loadKeyValueData = false) { + const dataView = new DataView(arrayBuffer); + if (!validate(url, dataView)) { + return null; + } + const littleEndian = dataView.getUint32(KTX_FIELDS.ENDIANNESS, true) === ENDIANNESS; + const glType = dataView.getUint32(KTX_FIELDS.GL_TYPE, littleEndian); + const glFormat = dataView.getUint32(KTX_FIELDS.GL_FORMAT, littleEndian); + const glInternalFormat = dataView.getUint32(KTX_FIELDS.GL_INTERNAL_FORMAT, littleEndian); + const pixelWidth = dataView.getUint32(KTX_FIELDS.PIXEL_WIDTH, littleEndian); + const pixelHeight = dataView.getUint32(KTX_FIELDS.PIXEL_HEIGHT, littleEndian) || 1; + const pixelDepth = dataView.getUint32(KTX_FIELDS.PIXEL_DEPTH, littleEndian) || 1; + const numberOfArrayElements = dataView.getUint32(KTX_FIELDS.NUMBER_OF_ARRAY_ELEMENTS, littleEndian) || 1; + const numberOfFaces = dataView.getUint32(KTX_FIELDS.NUMBER_OF_FACES, littleEndian); + const numberOfMipmapLevels = dataView.getUint32(KTX_FIELDS.NUMBER_OF_MIPMAP_LEVELS, littleEndian); + const bytesOfKeyValueData = dataView.getUint32(KTX_FIELDS.BYTES_OF_KEY_VALUE_DATA, littleEndian); + if (pixelHeight === 0 || pixelDepth !== 1) { + throw new Error("Only 2D textures are supported"); + } + if (numberOfFaces !== 1) { + throw new Error("CubeTextures are not supported by KTXLoader yet!"); + } + if (numberOfArrayElements !== 1) { + throw new Error("WebGL does not support array textures"); + } + const blockWidth = 4; + const blockHeight = 4; + const alignedWidth = pixelWidth + 3 & ~3; + const alignedHeight = pixelHeight + 3 & ~3; + const imageBuffers = new Array(numberOfArrayElements); + let imagePixels = pixelWidth * pixelHeight; + if (glType === 0) { + imagePixels = alignedWidth * alignedHeight; + } + let imagePixelByteSize; + if (glType !== 0) { + if (TYPES_TO_BYTES_PER_COMPONENT[glType]) { + imagePixelByteSize = TYPES_TO_BYTES_PER_COMPONENT[glType] * FORMATS_TO_COMPONENTS[glFormat]; + } else { + imagePixelByteSize = TYPES_TO_BYTES_PER_PIXEL[glType]; + } + } else { + imagePixelByteSize = INTERNAL_FORMAT_TO_BYTES_PER_PIXEL[glInternalFormat]; + } + if (imagePixelByteSize === void 0) { + throw new Error("Unable to resolve the pixel format stored in the *.ktx file!"); + } + const kvData = loadKeyValueData ? parseKvData(dataView, bytesOfKeyValueData, littleEndian) : null; + const imageByteSize = imagePixels * imagePixelByteSize; + let mipByteSize = imageByteSize; + let mipWidth = pixelWidth; + let mipHeight = pixelHeight; + let alignedMipWidth = alignedWidth; + let alignedMipHeight = alignedHeight; + let imageOffset = FILE_HEADER_SIZE + bytesOfKeyValueData; + for (let mipmapLevel = 0; mipmapLevel < numberOfMipmapLevels; mipmapLevel++) { + const imageSize = dataView.getUint32(imageOffset, littleEndian); + let elementOffset = imageOffset + 4; + for (let arrayElement = 0; arrayElement < numberOfArrayElements; arrayElement++) { + let mips = imageBuffers[arrayElement]; + if (!mips) { + mips = imageBuffers[arrayElement] = new Array(numberOfMipmapLevels); + } + mips[mipmapLevel] = { + levelID: mipmapLevel, + levelWidth: numberOfMipmapLevels > 1 || glType !== 0 ? mipWidth : alignedMipWidth, + levelHeight: numberOfMipmapLevels > 1 || glType !== 0 ? mipHeight : alignedMipHeight, + levelBuffer: new Uint8Array(arrayBuffer, elementOffset, mipByteSize) + }; + elementOffset += mipByteSize; + } + imageOffset += imageSize + 4; + imageOffset = imageOffset % 4 !== 0 ? imageOffset + 4 - imageOffset % 4 : imageOffset; + mipWidth = mipWidth >> 1 || 1; + mipHeight = mipHeight >> 1 || 1; + alignedMipWidth = mipWidth + blockWidth - 1 & ~(blockWidth - 1); + alignedMipHeight = mipHeight + blockHeight - 1 & ~(blockHeight - 1); + mipByteSize = alignedMipWidth * alignedMipHeight * imagePixelByteSize; + } + if (glType !== 0) { + return { + uncompressed: imageBuffers.map((levelBuffers) => { + let buffer = levelBuffers[0].levelBuffer; + let convertToInt = false; + if (glType === TYPES.FLOAT) { + buffer = new Float32Array(levelBuffers[0].levelBuffer.buffer, levelBuffers[0].levelBuffer.byteOffset, levelBuffers[0].levelBuffer.byteLength / 4); + } else if (glType === TYPES.UNSIGNED_INT) { + convertToInt = true; + buffer = new Uint32Array(levelBuffers[0].levelBuffer.buffer, levelBuffers[0].levelBuffer.byteOffset, levelBuffers[0].levelBuffer.byteLength / 4); + } else if (glType === TYPES.INT) { + convertToInt = true; + buffer = new Int32Array(levelBuffers[0].levelBuffer.buffer, levelBuffers[0].levelBuffer.byteOffset, levelBuffers[0].levelBuffer.byteLength / 4); + } + return { + resource: new BufferResource(buffer, { + width: levelBuffers[0].levelWidth, + height: levelBuffers[0].levelHeight + }), + type: glType, + format: convertToInt ? convertFormatToInteger(glFormat) : glFormat + }; + }), + kvData + }; + } + return { + compressed: imageBuffers.map((levelBuffers) => new CompressedTextureResource(null, { + format: glInternalFormat, + width: pixelWidth, + height: pixelHeight, + levels: numberOfMipmapLevels, + levelBuffers + })), + kvData + }; + } + function validate(url, dataView) { + for (let i = 0; i < FILE_IDENTIFIER.length; i++) { + if (dataView.getUint8(i) !== FILE_IDENTIFIER[i]) { + console.error(`${url} is not a valid *.ktx file!`); + return false; + } + } + return true; + } + function convertFormatToInteger(format) { + switch (format) { + case FORMATS.RGBA: + return FORMATS.RGBA_INTEGER; + case FORMATS.RGB: + return FORMATS.RGB_INTEGER; + case FORMATS.RG: + return FORMATS.RG_INTEGER; + case FORMATS.RED: + return FORMATS.RED_INTEGER; + default: + return format; + } + } + function parseKvData(dataView, bytesOfKeyValueData, littleEndian) { + const kvData = /* @__PURE__ */ new Map(); + let bytesIntoKeyValueData = 0; + while (bytesIntoKeyValueData < bytesOfKeyValueData) { + const keyAndValueByteSize = dataView.getUint32(FILE_HEADER_SIZE + bytesIntoKeyValueData, littleEndian); + const keyAndValueByteOffset = FILE_HEADER_SIZE + bytesIntoKeyValueData + 4; + const valuePadding = 3 - (keyAndValueByteSize + 3) % 4; + if (keyAndValueByteSize === 0 || keyAndValueByteSize > bytesOfKeyValueData - bytesIntoKeyValueData) { + console.error("KTXLoader: keyAndValueByteSize out of bounds"); + break; + } + let keyNulByte = 0; + for (; keyNulByte < keyAndValueByteSize; keyNulByte++) { + if (dataView.getUint8(keyAndValueByteOffset + keyNulByte) === 0) { + break; + } + } + if (keyNulByte === -1) { + console.error("KTXLoader: Failed to find null byte terminating kvData key"); + break; + } + const key = new TextDecoder().decode(new Uint8Array(dataView.buffer, keyAndValueByteOffset, keyNulByte)); + const value = new DataView(dataView.buffer, keyAndValueByteOffset + keyNulByte + 1, keyAndValueByteSize - keyNulByte - 1); + kvData.set(key, value); + bytesIntoKeyValueData += 4 + keyAndValueByteSize + valuePadding; + } + return kvData; + } + + const loadDDS = { + extension: { + type: ExtensionType.LoadParser, + priority: LoaderParserPriority.High + }, + name: "loadDDS", + test(url) { + return checkExtension(url, ".dds"); + }, + async load(url, asset, loader) { + const response = await settings.ADAPTER.fetch(url); + const arrayBuffer = await response.arrayBuffer(); + const resources = parseDDS(arrayBuffer); + const textures = resources.map((resource) => { + const base = new BaseTexture(resource, { + mipmap: MIPMAP_MODES.OFF, + alphaMode: ALPHA_MODES.NO_PREMULTIPLIED_ALPHA, + resolution: getResolutionOfUrl(url), + ...asset.data + }); + return createTexture(base, loader, url); + }); + return textures.length === 1 ? textures[0] : textures; + }, + unload(texture) { + if (Array.isArray(texture)) { + texture.forEach((t) => t.destroy(true)); + } else { + texture.destroy(true); + } + } + }; + extensions$1.add(loadDDS); + + const loadKTX = { + extension: { + type: ExtensionType.LoadParser, + priority: LoaderParserPriority.High + }, + name: "loadKTX", + test(url) { + return checkExtension(url, ".ktx"); + }, + async load(url, asset, loader) { + const response = await settings.ADAPTER.fetch(url); + const arrayBuffer = await response.arrayBuffer(); + const { compressed, uncompressed, kvData } = parseKTX(url, arrayBuffer); + const resources = compressed ?? uncompressed; + const options = { + mipmap: MIPMAP_MODES.OFF, + alphaMode: ALPHA_MODES.NO_PREMULTIPLIED_ALPHA, + resolution: getResolutionOfUrl(url), + ...asset.data + }; + const textures = resources.map((resource) => { + if (resources === uncompressed) { + Object.assign(options, { + type: resource.type, + format: resource.format + }); + } + const base = new BaseTexture(resource, options); + base.ktxKeyValueData = kvData; + return createTexture(base, loader, url); + }); + return textures.length === 1 ? textures[0] : textures; + }, + unload(texture) { + if (Array.isArray(texture)) { + texture.forEach((t) => t.destroy(true)); + } else { + texture.destroy(true); + } + } + }; + extensions$1.add(loadKTX); + + const resolveCompressedTextureUrl = { + extension: ExtensionType.ResolveParser, + test: (value) => { + const temp = value.split("?")[0]; + const extension = temp.split(".").pop(); + return ["basis", "ktx", "dds"].includes(extension); + }, + parse: (value) => { + const temp = value.split("?")[0]; + const extension = temp.split(".").pop(); + if (extension === "ktx") { + const extensions2 = [ + ".s3tc.ktx", + ".s3tc_sRGB.ktx", + ".etc.ktx", + ".etc1.ktx", + ".pvrt.ktx", + ".atc.ktx", + ".astc.ktx" + ]; + if (extensions2.some((ext) => value.endsWith(ext))) { + return { + resolution: parseFloat(settings.RETINA_PREFIX.exec(value)?.[1] ?? "1"), + format: extensions2.find((ext) => value.endsWith(ext)), + src: value + }; + } + } + return { + resolution: parseFloat(settings.RETINA_PREFIX.exec(value)?.[1] ?? "1"), + format: value.split(".").pop(), + src: value + }; + } + }; + extensions$1.add(resolveCompressedTextureUrl); + + const TEMP_RECT = new Rectangle(); + const BYTES_PER_PIXEL = 4; + const _Extract = class { + constructor(renderer) { + this.renderer = renderer; + } + async image(target, format, quality) { + const image = new Image(); + image.src = await this.base64(target, format, quality); + return image; + } + async base64(target, format, quality) { + const canvas = this.canvas(target); + if (canvas.toDataURL !== void 0) { + return canvas.toDataURL(format, quality); + } + if (canvas.convertToBlob !== void 0) { + const blob = await canvas.convertToBlob({ type: format, quality }); + return await new Promise((resolve) => { + const reader = new FileReader(); + reader.onload = () => resolve(reader.result); + reader.readAsDataURL(blob); + }); + } + throw new Error("Extract.base64() requires ICanvas.toDataURL or ICanvas.convertToBlob to be implemented"); + } + canvas(target, frame) { + const { pixels, width, height, flipY } = this._rawPixels(target, frame); + let canvasBuffer = new CanvasRenderTarget(width, height, 1); + const canvasData = canvasBuffer.context.getImageData(0, 0, width, height); + _Extract.arrayPostDivide(pixels, canvasData.data); + canvasBuffer.context.putImageData(canvasData, 0, 0); + if (flipY) { + const target2 = new CanvasRenderTarget(canvasBuffer.width, canvasBuffer.height, 1); + target2.context.scale(1, -1); + target2.context.drawImage(canvasBuffer.canvas, 0, -height); + canvasBuffer.destroy(); + canvasBuffer = target2; + } + return canvasBuffer.canvas; + } + pixels(target, frame) { + const { pixels } = this._rawPixels(target, frame); + _Extract.arrayPostDivide(pixels, pixels); + return pixels; + } + _rawPixels(target, frame) { + const renderer = this.renderer; + if (!renderer) { + throw new Error("The Extract has already been destroyed"); + } + let resolution; + let flipY = false; + let renderTexture; + let generated = false; + if (target) { + if (target instanceof RenderTexture) { + renderTexture = target; + } else { + const multisample = renderer.context.webGLVersion >= 2 ? renderer.multisample : MSAA_QUALITY.NONE; + renderTexture = renderer.generateTexture(target, { multisample }); + if (multisample !== MSAA_QUALITY.NONE) { + const resolvedTexture = RenderTexture.create({ + width: renderTexture.width, + height: renderTexture.height + }); + renderer.framebuffer.bind(renderTexture.framebuffer); + renderer.framebuffer.blit(resolvedTexture.framebuffer); + renderer.framebuffer.bind(); + renderTexture.destroy(true); + renderTexture = resolvedTexture; + } + generated = true; + } + } + if (renderTexture) { + resolution = renderTexture.baseTexture.resolution; + frame = frame ?? renderTexture.frame; + flipY = false; + renderer.renderTexture.bind(renderTexture); + } else { + resolution = renderer.resolution; + if (!frame) { + frame = TEMP_RECT; + frame.width = renderer.width; + frame.height = renderer.height; + } + flipY = true; + renderer.renderTexture.bind(); + } + const width = Math.round(frame.width * resolution); + const height = Math.round(frame.height * resolution); + const pixels = new Uint8Array(BYTES_PER_PIXEL * width * height); + const gl = renderer.gl; + gl.readPixels(Math.round(frame.x * resolution), Math.round(frame.y * resolution), width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); + if (generated) { + renderTexture?.destroy(true); + } + return { pixels, width, height, flipY }; + } + destroy() { + this.renderer = null; + } + static arrayPostDivide(pixels, out) { + for (let i = 0; i < pixels.length; i += 4) { + const alpha = out[i + 3] = pixels[i + 3]; + if (alpha !== 0) { + out[i] = Math.round(Math.min(pixels[i] * 255 / alpha, 255)); + out[i + 1] = Math.round(Math.min(pixels[i + 1] * 255 / alpha, 255)); + out[i + 2] = Math.round(Math.min(pixels[i + 2] * 255 / alpha, 255)); + } else { + out[i] = pixels[i]; + out[i + 1] = pixels[i + 1]; + out[i + 2] = pixels[i + 2]; + } + } + } + }; + let Extract = _Extract; + Extract.extension = { + name: "extract", + type: ExtensionType.RendererSystem + }; + extensions$1.add(Extract); + + const buildCircle = { + build(graphicsData) { + const points = graphicsData.points; + let x; + let y; + let dx; + let dy; + let rx; + let ry; + if (graphicsData.type === SHAPES.CIRC) { + const circle = graphicsData.shape; + x = circle.x; + y = circle.y; + rx = ry = circle.radius; + dx = dy = 0; + } else if (graphicsData.type === SHAPES.ELIP) { + const ellipse = graphicsData.shape; + x = ellipse.x; + y = ellipse.y; + rx = ellipse.width; + ry = ellipse.height; + dx = dy = 0; + } else { + const roundedRect = graphicsData.shape; + const halfWidth = roundedRect.width / 2; + const halfHeight = roundedRect.height / 2; + x = roundedRect.x + halfWidth; + y = roundedRect.y + halfHeight; + rx = ry = Math.max(0, Math.min(roundedRect.radius, Math.min(halfWidth, halfHeight))); + dx = halfWidth - rx; + dy = halfHeight - ry; + } + if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0)) { + points.length = 0; + return; + } + const n = Math.ceil(2.3 * Math.sqrt(rx + ry)); + const m = n * 8 + (dx ? 4 : 0) + (dy ? 4 : 0); + points.length = m; + if (m === 0) { + return; + } + if (n === 0) { + points.length = 8; + points[0] = points[6] = x + dx; + points[1] = points[3] = y + dy; + points[2] = points[4] = x - dx; + points[5] = points[7] = y - dy; + return; + } + let j1 = 0; + let j2 = n * 4 + (dx ? 2 : 0) + 2; + let j3 = j2; + let j4 = m; + { + const x0 = dx + rx; + const y0 = dy; + const x1 = x + x0; + const x2 = x - x0; + const y1 = y + y0; + points[j1++] = x1; + points[j1++] = y1; + points[--j2] = y1; + points[--j2] = x2; + if (dy) { + const y2 = y - y0; + points[j3++] = x2; + points[j3++] = y2; + points[--j4] = y2; + points[--j4] = x1; + } + } + for (let i = 1; i < n; i++) { + const a = Math.PI / 2 * (i / n); + const x0 = dx + Math.cos(a) * rx; + const y0 = dy + Math.sin(a) * ry; + const x1 = x + x0; + const x2 = x - x0; + const y1 = y + y0; + const y2 = y - y0; + points[j1++] = x1; + points[j1++] = y1; + points[--j2] = y1; + points[--j2] = x2; + points[j3++] = x2; + points[j3++] = y2; + points[--j4] = y2; + points[--j4] = x1; + } + { + const x0 = dx; + const y0 = dy + ry; + const x1 = x + x0; + const x2 = x - x0; + const y1 = y + y0; + const y2 = y - y0; + points[j1++] = x1; + points[j1++] = y1; + points[--j4] = y2; + points[--j4] = x1; + if (dx) { + points[j1++] = x2; + points[j1++] = y1; + points[--j4] = y2; + points[--j4] = x2; + } + } + }, + triangulate(graphicsData, graphicsGeometry) { + const points = graphicsData.points; + const verts = graphicsGeometry.points; + const indices = graphicsGeometry.indices; + if (points.length === 0) { + return; + } + let vertPos = verts.length / 2; + const center = vertPos; + let x; + let y; + if (graphicsData.type !== SHAPES.RREC) { + const circle = graphicsData.shape; + x = circle.x; + y = circle.y; + } else { + const roundedRect = graphicsData.shape; + x = roundedRect.x + roundedRect.width / 2; + y = roundedRect.y + roundedRect.height / 2; + } + const matrix = graphicsData.matrix; + verts.push(graphicsData.matrix ? matrix.a * x + matrix.c * y + matrix.tx : x, graphicsData.matrix ? matrix.b * x + matrix.d * y + matrix.ty : y); + vertPos++; + verts.push(points[0], points[1]); + for (let i = 2; i < points.length; i += 2) { + verts.push(points[i], points[i + 1]); + indices.push(vertPos++, center, vertPos); + } + indices.push(center + 1, center, vertPos); + } + }; + + function fixOrientation(points, hole = false) { + const m = points.length; + if (m < 6) { + return; + } + let area = 0; + for (let i = 0, x1 = points[m - 2], y1 = points[m - 1]; i < m; i += 2) { + const x2 = points[i]; + const y2 = points[i + 1]; + area += (x2 - x1) * (y2 + y1); + x1 = x2; + y1 = y2; + } + if (!hole && area > 0 || hole && area <= 0) { + const n = m / 2; + for (let i = n + n % 2; i < m; i += 2) { + const i1 = m - i - 2; + const i2 = m - i - 1; + const i3 = i; + const i4 = i + 1; + [points[i1], points[i3]] = [points[i3], points[i1]]; + [points[i2], points[i4]] = [points[i4], points[i2]]; + } + } + } + const buildPoly = { + build(graphicsData) { + graphicsData.points = graphicsData.shape.points.slice(); + }, + triangulate(graphicsData, graphicsGeometry) { + let points = graphicsData.points; + const holes = graphicsData.holes; + const verts = graphicsGeometry.points; + const indices = graphicsGeometry.indices; + if (points.length >= 6) { + fixOrientation(points, false); + const holeArray = []; + for (let i = 0; i < holes.length; i++) { + const hole = holes[i]; + fixOrientation(hole.points, true); + holeArray.push(points.length / 2); + points = points.concat(hole.points); + } + const triangles = earcut_1(points, holeArray, 2); + if (!triangles) { + return; + } + const vertPos = verts.length / 2; + for (let i = 0; i < triangles.length; i += 3) { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i + 1] + vertPos); + indices.push(triangles[i + 2] + vertPos); + } + for (let i = 0; i < points.length; i++) { + verts.push(points[i]); + } + } + } + }; + + const buildRectangle = { + build(graphicsData) { + const rectData = graphicsData.shape; + const x = rectData.x; + const y = rectData.y; + const width = rectData.width; + const height = rectData.height; + const points = graphicsData.points; + points.length = 0; + if (!(width >= 0 && height >= 0)) { + return; + } + points.push(x, y, x + width, y, x + width, y + height, x, y + height); + }, + triangulate(graphicsData, graphicsGeometry) { + const points = graphicsData.points; + const verts = graphicsGeometry.points; + if (points.length === 0) { + return; + } + const vertPos = verts.length / 2; + verts.push(points[0], points[1], points[2], points[3], points[6], points[7], points[4], points[5]); + graphicsGeometry.indices.push(vertPos, vertPos + 1, vertPos + 2, vertPos + 1, vertPos + 2, vertPos + 3); + } + }; + + const buildRoundedRectangle = { + build(graphicsData) { + buildCircle.build(graphicsData); + }, + triangulate(graphicsData, graphicsGeometry) { + buildCircle.triangulate(graphicsData, graphicsGeometry); + } + }; + + var LINE_JOIN = /* @__PURE__ */ ((LINE_JOIN2) => { + LINE_JOIN2["MITER"] = "miter"; + LINE_JOIN2["BEVEL"] = "bevel"; + LINE_JOIN2["ROUND"] = "round"; + return LINE_JOIN2; + })(LINE_JOIN || {}); + var LINE_CAP = /* @__PURE__ */ ((LINE_CAP2) => { + LINE_CAP2["BUTT"] = "butt"; + LINE_CAP2["ROUND"] = "round"; + LINE_CAP2["SQUARE"] = "square"; + return LINE_CAP2; + })(LINE_CAP || {}); + const curves = { + adaptive: true, + maxLength: 10, + minSegments: 8, + maxSegments: 2048, + epsilon: 1e-4, + _segmentsCount(length, defaultSegments = 20) { + if (!this.adaptive || !length || isNaN(length)) { + return defaultSegments; + } + let result = Math.ceil(length / this.maxLength); + if (result < this.minSegments) { + result = this.minSegments; + } else if (result > this.maxSegments) { + result = this.maxSegments; + } + return result; + } + }; + const GRAPHICS_CURVES = curves; + + class ArcUtils { + static curveTo(x1, y1, x2, y2, radius, points) { + const fromX = points[points.length - 2]; + const fromY = points[points.length - 1]; + const a1 = fromY - y1; + const b1 = fromX - x1; + const a2 = y2 - y1; + const b2 = x2 - x1; + const mm = Math.abs(a1 * b2 - b1 * a2); + if (mm < 1e-8 || radius === 0) { + if (points[points.length - 2] !== x1 || points[points.length - 1] !== y1) { + points.push(x1, y1); + } + return null; + } + const dd = a1 * a1 + b1 * b1; + const cc = a2 * a2 + b2 * b2; + const tt = a1 * a2 + b1 * b2; + const k1 = radius * Math.sqrt(dd) / mm; + const k2 = radius * Math.sqrt(cc) / mm; + const j1 = k1 * tt / dd; + const j2 = k2 * tt / cc; + const cx = k1 * b2 + k2 * b1; + const cy = k1 * a2 + k2 * a1; + const px = b1 * (k2 + j1); + const py = a1 * (k2 + j1); + const qx = b2 * (k1 + j2); + const qy = a2 * (k1 + j2); + const startAngle = Math.atan2(py - cy, px - cx); + const endAngle = Math.atan2(qy - cy, qx - cx); + return { + cx: cx + x1, + cy: cy + y1, + radius, + startAngle, + endAngle, + anticlockwise: b1 * a2 > b2 * a1 + }; + } + static arc(_startX, _startY, cx, cy, radius, startAngle, endAngle, _anticlockwise, points) { + const sweep = endAngle - startAngle; + const n = curves._segmentsCount(Math.abs(sweep) * radius, Math.ceil(Math.abs(sweep) / PI_2) * 40); + const theta = sweep / (n * 2); + const theta2 = theta * 2; + const cTheta = Math.cos(theta); + const sTheta = Math.sin(theta); + const segMinus = n - 1; + const remainder = segMinus % 1 / segMinus; + for (let i = 0; i <= segMinus; ++i) { + const real = i + remainder * i; + const angle = theta + startAngle + theta2 * real; + const c = Math.cos(angle); + const s = -Math.sin(angle); + points.push((cTheta * c + sTheta * s) * radius + cx, (cTheta * -s + sTheta * c) * radius + cy); + } + } + } + + class BatchPart { + constructor() { + this.reset(); + } + begin(style, startIndex, attribStart) { + this.reset(); + this.style = style; + this.start = startIndex; + this.attribStart = attribStart; + } + end(endIndex, endAttrib) { + this.attribSize = endAttrib - this.attribStart; + this.size = endIndex - this.start; + } + reset() { + this.style = null; + this.size = 0; + this.start = 0; + this.attribStart = 0; + this.attribSize = 0; + } + } + + class BezierUtils { + static curveLength(fromX, fromY, cpX, cpY, cpX2, cpY2, toX, toY) { + const n = 10; + let result = 0; + let t = 0; + let t2 = 0; + let t3 = 0; + let nt = 0; + let nt2 = 0; + let nt3 = 0; + let x = 0; + let y = 0; + let dx = 0; + let dy = 0; + let prevX = fromX; + let prevY = fromY; + for (let i = 1; i <= n; ++i) { + t = i / n; + t2 = t * t; + t3 = t2 * t; + nt = 1 - t; + nt2 = nt * nt; + nt3 = nt2 * nt; + x = nt3 * fromX + 3 * nt2 * t * cpX + 3 * nt * t2 * cpX2 + t3 * toX; + y = nt3 * fromY + 3 * nt2 * t * cpY + 3 * nt * t2 * cpY2 + t3 * toY; + dx = prevX - x; + dy = prevY - y; + prevX = x; + prevY = y; + result += Math.sqrt(dx * dx + dy * dy); + } + return result; + } + static curveTo(cpX, cpY, cpX2, cpY2, toX, toY, points) { + const fromX = points[points.length - 2]; + const fromY = points[points.length - 1]; + points.length -= 2; + const n = curves._segmentsCount(BezierUtils.curveLength(fromX, fromY, cpX, cpY, cpX2, cpY2, toX, toY)); + let dt = 0; + let dt2 = 0; + let dt3 = 0; + let t2 = 0; + let t3 = 0; + points.push(fromX, fromY); + for (let i = 1, j = 0; i <= n; ++i) { + j = i / n; + dt = 1 - j; + dt2 = dt * dt; + dt3 = dt2 * dt; + t2 = j * j; + t3 = t2 * j; + points.push(dt3 * fromX + 3 * dt2 * j * cpX + 3 * dt * t2 * cpX2 + t3 * toX, dt3 * fromY + 3 * dt2 * j * cpY + 3 * dt * t2 * cpY2 + t3 * toY); + } + } + } + + function square(x, y, nx, ny, innerWeight, outerWeight, clockwise, verts) { + const ix = x - nx * innerWeight; + const iy = y - ny * innerWeight; + const ox = x + nx * outerWeight; + const oy = y + ny * outerWeight; + let exx; + let eyy; + if (clockwise) { + exx = ny; + eyy = -nx; + } else { + exx = -ny; + eyy = nx; + } + const eix = ix + exx; + const eiy = iy + eyy; + const eox = ox + exx; + const eoy = oy + eyy; + verts.push(eix, eiy, eox, eoy); + return 2; + } + function round(cx, cy, sx, sy, ex, ey, verts, clockwise) { + const cx2p0x = sx - cx; + const cy2p0y = sy - cy; + let angle0 = Math.atan2(cx2p0x, cy2p0y); + let angle1 = Math.atan2(ex - cx, ey - cy); + if (clockwise && angle0 < angle1) { + angle0 += Math.PI * 2; + } else if (!clockwise && angle0 > angle1) { + angle1 += Math.PI * 2; + } + let startAngle = angle0; + const angleDiff = angle1 - angle0; + const absAngleDiff = Math.abs(angleDiff); + const radius = Math.sqrt(cx2p0x * cx2p0x + cy2p0y * cy2p0y); + const segCount = (15 * absAngleDiff * Math.sqrt(radius) / Math.PI >> 0) + 1; + const angleInc = angleDiff / segCount; + startAngle += angleInc; + if (clockwise) { + verts.push(cx, cy, sx, sy); + for (let i = 1, angle = startAngle; i < segCount; i++, angle += angleInc) { + verts.push(cx, cy, cx + Math.sin(angle) * radius, cy + Math.cos(angle) * radius); + } + verts.push(cx, cy, ex, ey); + } else { + verts.push(sx, sy, cx, cy); + for (let i = 1, angle = startAngle; i < segCount; i++, angle += angleInc) { + verts.push(cx + Math.sin(angle) * radius, cy + Math.cos(angle) * radius, cx, cy); + } + verts.push(ex, ey, cx, cy); + } + return segCount * 2; + } + function buildNonNativeLine(graphicsData, graphicsGeometry) { + const shape = graphicsData.shape; + let points = graphicsData.points || shape.points.slice(); + const eps = graphicsGeometry.closePointEps; + if (points.length === 0) { + return; + } + const style = graphicsData.lineStyle; + const firstPoint = new Point(points[0], points[1]); + const lastPoint = new Point(points[points.length - 2], points[points.length - 1]); + const closedShape = shape.type !== SHAPES.POLY || shape.closeStroke; + const closedPath = Math.abs(firstPoint.x - lastPoint.x) < eps && Math.abs(firstPoint.y - lastPoint.y) < eps; + if (closedShape) { + points = points.slice(); + if (closedPath) { + points.pop(); + points.pop(); + lastPoint.set(points[points.length - 2], points[points.length - 1]); + } + const midPointX = (firstPoint.x + lastPoint.x) * 0.5; + const midPointY = (lastPoint.y + firstPoint.y) * 0.5; + points.unshift(midPointX, midPointY); + points.push(midPointX, midPointY); + } + const verts = graphicsGeometry.points; + const length = points.length / 2; + let indexCount = points.length; + const indexStart = verts.length / 2; + const width = style.width / 2; + const widthSquared = width * width; + const miterLimitSquared = style.miterLimit * style.miterLimit; + let x0 = points[0]; + let y0 = points[1]; + let x1 = points[2]; + let y1 = points[3]; + let x2 = 0; + let y2 = 0; + let perpx = -(y0 - y1); + let perpy = x0 - x1; + let perp1x = 0; + let perp1y = 0; + let dist = Math.sqrt(perpx * perpx + perpy * perpy); + perpx /= dist; + perpy /= dist; + perpx *= width; + perpy *= width; + const ratio = style.alignment; + const innerWeight = (1 - ratio) * 2; + const outerWeight = ratio * 2; + if (!closedShape) { + if (style.cap === LINE_CAP.ROUND) { + indexCount += round(x0 - perpx * (innerWeight - outerWeight) * 0.5, y0 - perpy * (innerWeight - outerWeight) * 0.5, x0 - perpx * innerWeight, y0 - perpy * innerWeight, x0 + perpx * outerWeight, y0 + perpy * outerWeight, verts, true) + 2; + } else if (style.cap === LINE_CAP.SQUARE) { + indexCount += square(x0, y0, perpx, perpy, innerWeight, outerWeight, true, verts); + } + } + verts.push(x0 - perpx * innerWeight, y0 - perpy * innerWeight, x0 + perpx * outerWeight, y0 + perpy * outerWeight); + for (let i = 1; i < length - 1; ++i) { + x0 = points[(i - 1) * 2]; + y0 = points[(i - 1) * 2 + 1]; + x1 = points[i * 2]; + y1 = points[i * 2 + 1]; + x2 = points[(i + 1) * 2]; + y2 = points[(i + 1) * 2 + 1]; + perpx = -(y0 - y1); + perpy = x0 - x1; + dist = Math.sqrt(perpx * perpx + perpy * perpy); + perpx /= dist; + perpy /= dist; + perpx *= width; + perpy *= width; + perp1x = -(y1 - y2); + perp1y = x1 - x2; + dist = Math.sqrt(perp1x * perp1x + perp1y * perp1y); + perp1x /= dist; + perp1y /= dist; + perp1x *= width; + perp1y *= width; + const dx0 = x1 - x0; + const dy0 = y0 - y1; + const dx1 = x1 - x2; + const dy1 = y2 - y1; + const dot = dx0 * dx1 + dy0 * dy1; + const cross = dy0 * dx1 - dy1 * dx0; + const clockwise = cross < 0; + if (Math.abs(cross) < 1e-3 * Math.abs(dot)) { + verts.push(x1 - perpx * innerWeight, y1 - perpy * innerWeight, x1 + perpx * outerWeight, y1 + perpy * outerWeight); + if (dot >= 0) { + if (style.join === LINE_JOIN.ROUND) { + indexCount += round(x1, y1, x1 - perpx * innerWeight, y1 - perpy * innerWeight, x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, verts, false) + 4; + } else { + indexCount += 2; + } + verts.push(x1 - perp1x * outerWeight, y1 - perp1y * outerWeight, x1 + perp1x * innerWeight, y1 + perp1y * innerWeight); + } + continue; + } + const c1 = (-perpx + x0) * (-perpy + y1) - (-perpx + x1) * (-perpy + y0); + const c2 = (-perp1x + x2) * (-perp1y + y1) - (-perp1x + x1) * (-perp1y + y2); + const px = (dx0 * c2 - dx1 * c1) / cross; + const py = (dy1 * c1 - dy0 * c2) / cross; + const pdist = (px - x1) * (px - x1) + (py - y1) * (py - y1); + const imx = x1 + (px - x1) * innerWeight; + const imy = y1 + (py - y1) * innerWeight; + const omx = x1 - (px - x1) * outerWeight; + const omy = y1 - (py - y1) * outerWeight; + const smallerInsideSegmentSq = Math.min(dx0 * dx0 + dy0 * dy0, dx1 * dx1 + dy1 * dy1); + const insideWeight = clockwise ? innerWeight : outerWeight; + const smallerInsideDiagonalSq = smallerInsideSegmentSq + insideWeight * insideWeight * widthSquared; + const insideMiterOk = pdist <= smallerInsideDiagonalSq; + let join = style.join; + if (join === LINE_JOIN.MITER && pdist / widthSquared > miterLimitSquared) { + join = LINE_JOIN.BEVEL; + } + if (insideMiterOk) { + switch (join) { + case LINE_JOIN.MITER: { + verts.push(imx, imy, omx, omy); + break; + } + case LINE_JOIN.BEVEL: { + if (clockwise) { + verts.push(imx, imy, x1 + perpx * outerWeight, y1 + perpy * outerWeight, imx, imy, x1 + perp1x * outerWeight, y1 + perp1y * outerWeight); + } else { + verts.push(x1 - perpx * innerWeight, y1 - perpy * innerWeight, omx, omy, x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, omx, omy); + } + indexCount += 2; + break; + } + case LINE_JOIN.ROUND: { + if (clockwise) { + verts.push(imx, imy, x1 + perpx * outerWeight, y1 + perpy * outerWeight); + indexCount += round(x1, y1, x1 + perpx * outerWeight, y1 + perpy * outerWeight, x1 + perp1x * outerWeight, y1 + perp1y * outerWeight, verts, true) + 4; + verts.push(imx, imy, x1 + perp1x * outerWeight, y1 + perp1y * outerWeight); + } else { + verts.push(x1 - perpx * innerWeight, y1 - perpy * innerWeight, omx, omy); + indexCount += round(x1, y1, x1 - perpx * innerWeight, y1 - perpy * innerWeight, x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, verts, false) + 4; + verts.push(x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, omx, omy); + } + break; + } + } + } else { + verts.push(x1 - perpx * innerWeight, y1 - perpy * innerWeight, x1 + perpx * outerWeight, y1 + perpy * outerWeight); + switch (join) { + case LINE_JOIN.MITER: { + if (clockwise) { + verts.push(omx, omy, omx, omy); + } else { + verts.push(imx, imy, imx, imy); + } + indexCount += 2; + break; + } + case LINE_JOIN.ROUND: { + if (clockwise) { + indexCount += round(x1, y1, x1 + perpx * outerWeight, y1 + perpy * outerWeight, x1 + perp1x * outerWeight, y1 + perp1y * outerWeight, verts, true) + 2; + } else { + indexCount += round(x1, y1, x1 - perpx * innerWeight, y1 - perpy * innerWeight, x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, verts, false) + 2; + } + break; + } + } + verts.push(x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, x1 + perp1x * outerWeight, y1 + perp1y * outerWeight); + indexCount += 2; + } + } + x0 = points[(length - 2) * 2]; + y0 = points[(length - 2) * 2 + 1]; + x1 = points[(length - 1) * 2]; + y1 = points[(length - 1) * 2 + 1]; + perpx = -(y0 - y1); + perpy = x0 - x1; + dist = Math.sqrt(perpx * perpx + perpy * perpy); + perpx /= dist; + perpy /= dist; + perpx *= width; + perpy *= width; + verts.push(x1 - perpx * innerWeight, y1 - perpy * innerWeight, x1 + perpx * outerWeight, y1 + perpy * outerWeight); + if (!closedShape) { + if (style.cap === LINE_CAP.ROUND) { + indexCount += round(x1 - perpx * (innerWeight - outerWeight) * 0.5, y1 - perpy * (innerWeight - outerWeight) * 0.5, x1 - perpx * innerWeight, y1 - perpy * innerWeight, x1 + perpx * outerWeight, y1 + perpy * outerWeight, verts, false) + 2; + } else if (style.cap === LINE_CAP.SQUARE) { + indexCount += square(x1, y1, perpx, perpy, innerWeight, outerWeight, false, verts); + } + } + const indices = graphicsGeometry.indices; + const eps2 = curves.epsilon * curves.epsilon; + for (let i = indexStart; i < indexCount + indexStart - 2; ++i) { + x0 = verts[i * 2]; + y0 = verts[i * 2 + 1]; + x1 = verts[(i + 1) * 2]; + y1 = verts[(i + 1) * 2 + 1]; + x2 = verts[(i + 2) * 2]; + y2 = verts[(i + 2) * 2 + 1]; + if (Math.abs(x0 * (y1 - y2) + x1 * (y2 - y0) + x2 * (y0 - y1)) < eps2) { + continue; + } + indices.push(i, i + 1, i + 2); + } + } + function buildNativeLine(graphicsData, graphicsGeometry) { + let i = 0; + const shape = graphicsData.shape; + const points = graphicsData.points || shape.points; + const closedShape = shape.type !== SHAPES.POLY || shape.closeStroke; + if (points.length === 0) + return; + const verts = graphicsGeometry.points; + const indices = graphicsGeometry.indices; + const length = points.length / 2; + const startIndex = verts.length / 2; + let currentIndex = startIndex; + verts.push(points[0], points[1]); + for (i = 1; i < length; i++) { + verts.push(points[i * 2], points[i * 2 + 1]); + indices.push(currentIndex, currentIndex + 1); + currentIndex++; + } + if (closedShape) { + indices.push(currentIndex, startIndex); + } + } + function buildLine(graphicsData, graphicsGeometry) { + if (graphicsData.lineStyle.native) { + buildNativeLine(graphicsData, graphicsGeometry); + } else { + buildNonNativeLine(graphicsData, graphicsGeometry); + } + } + + class QuadraticUtils { + static curveLength(fromX, fromY, cpX, cpY, toX, toY) { + const ax = fromX - 2 * cpX + toX; + const ay = fromY - 2 * cpY + toY; + const bx = 2 * cpX - 2 * fromX; + const by = 2 * cpY - 2 * fromY; + const a = 4 * (ax * ax + ay * ay); + const b = 4 * (ax * bx + ay * by); + const c = bx * bx + by * by; + const s = 2 * Math.sqrt(a + b + c); + const a2 = Math.sqrt(a); + const a32 = 2 * a * a2; + const c2 = 2 * Math.sqrt(c); + const ba = b / a2; + return (a32 * s + a2 * b * (s - c2) + (4 * c * a - b * b) * Math.log((2 * a2 + ba + s) / (ba + c2))) / (4 * a32); + } + static curveTo(cpX, cpY, toX, toY, points) { + const fromX = points[points.length - 2]; + const fromY = points[points.length - 1]; + const n = curves._segmentsCount(QuadraticUtils.curveLength(fromX, fromY, cpX, cpY, toX, toY)); + let xa = 0; + let ya = 0; + for (let i = 1; i <= n; ++i) { + const j = i / n; + xa = fromX + (cpX - fromX) * j; + ya = fromY + (cpY - fromY) * j; + points.push(xa + (cpX + (toX - cpX) * j - xa) * j, ya + (cpY + (toY - cpY) * j - ya) * j); + } + } + } + + const FILL_COMMANDS = { + [SHAPES.POLY]: buildPoly, + [SHAPES.CIRC]: buildCircle, + [SHAPES.ELIP]: buildCircle, + [SHAPES.RECT]: buildRectangle, + [SHAPES.RREC]: buildRoundedRectangle + }; + const BATCH_POOL = []; + const DRAW_CALL_POOL = []; + + class GraphicsData { + constructor(shape, fillStyle = null, lineStyle = null, matrix = null) { + this.points = []; + this.holes = []; + this.shape = shape; + this.lineStyle = lineStyle; + this.fillStyle = fillStyle; + this.matrix = matrix; + this.type = shape.type; + } + clone() { + return new GraphicsData(this.shape, this.fillStyle, this.lineStyle, this.matrix); + } + destroy() { + this.shape = null; + this.holes.length = 0; + this.holes = null; + this.points.length = 0; + this.points = null; + this.lineStyle = null; + this.fillStyle = null; + } + } + + const tmpPoint = new Point(); + const _GraphicsGeometry = class extends BatchGeometry { + constructor() { + super(); + this.closePointEps = 1e-4; + this.boundsPadding = 0; + this.uvsFloat32 = null; + this.indicesUint16 = null; + this.batchable = false; + this.points = []; + this.colors = []; + this.uvs = []; + this.indices = []; + this.textureIds = []; + this.graphicsData = []; + this.drawCalls = []; + this.batchDirty = -1; + this.batches = []; + this.dirty = 0; + this.cacheDirty = -1; + this.clearDirty = 0; + this.shapeIndex = 0; + this._bounds = new Bounds(); + this.boundsDirty = -1; + } + get bounds() { + this.updateBatches(); + if (this.boundsDirty !== this.dirty) { + this.boundsDirty = this.dirty; + this.calculateBounds(); + } + return this._bounds; + } + invalidate() { + this.boundsDirty = -1; + this.dirty++; + this.batchDirty++; + this.shapeIndex = 0; + this.points.length = 0; + this.colors.length = 0; + this.uvs.length = 0; + this.indices.length = 0; + this.textureIds.length = 0; + for (let i = 0; i < this.drawCalls.length; i++) { + this.drawCalls[i].texArray.clear(); + DRAW_CALL_POOL.push(this.drawCalls[i]); + } + this.drawCalls.length = 0; + for (let i = 0; i < this.batches.length; i++) { + const batchPart = this.batches[i]; + batchPart.reset(); + BATCH_POOL.push(batchPart); + } + this.batches.length = 0; + } + clear() { + if (this.graphicsData.length > 0) { + this.invalidate(); + this.clearDirty++; + this.graphicsData.length = 0; + } + return this; + } + drawShape(shape, fillStyle = null, lineStyle = null, matrix = null) { + const data = new GraphicsData(shape, fillStyle, lineStyle, matrix); + this.graphicsData.push(data); + this.dirty++; + return this; + } + drawHole(shape, matrix = null) { + if (!this.graphicsData.length) { + return null; + } + const data = new GraphicsData(shape, null, null, matrix); + const lastShape = this.graphicsData[this.graphicsData.length - 1]; + data.lineStyle = lastShape.lineStyle; + lastShape.holes.push(data); + this.dirty++; + return this; + } + destroy() { + super.destroy(); + for (let i = 0; i < this.graphicsData.length; ++i) { + this.graphicsData[i].destroy(); + } + this.points.length = 0; + this.points = null; + this.colors.length = 0; + this.colors = null; + this.uvs.length = 0; + this.uvs = null; + this.indices.length = 0; + this.indices = null; + this.indexBuffer.destroy(); + this.indexBuffer = null; + this.graphicsData.length = 0; + this.graphicsData = null; + this.drawCalls.length = 0; + this.drawCalls = null; + this.batches.length = 0; + this.batches = null; + this._bounds = null; + } + containsPoint(point) { + const graphicsData = this.graphicsData; + for (let i = 0; i < graphicsData.length; ++i) { + const data = graphicsData[i]; + if (!data.fillStyle.visible) { + continue; + } + if (data.shape) { + if (data.matrix) { + data.matrix.applyInverse(point, tmpPoint); + } else { + tmpPoint.copyFrom(point); + } + if (data.shape.contains(tmpPoint.x, tmpPoint.y)) { + let hitHole = false; + if (data.holes) { + for (let i2 = 0; i2 < data.holes.length; i2++) { + const hole = data.holes[i2]; + if (hole.shape.contains(tmpPoint.x, tmpPoint.y)) { + hitHole = true; + break; + } + } + } + if (!hitHole) { + return true; + } + } + } + } + return false; + } + updateBatches() { + if (!this.graphicsData.length) { + this.batchable = true; + return; + } + if (!this.validateBatching()) { + return; + } + this.cacheDirty = this.dirty; + const uvs = this.uvs; + const graphicsData = this.graphicsData; + let batchPart = null; + let currentStyle = null; + if (this.batches.length > 0) { + batchPart = this.batches[this.batches.length - 1]; + currentStyle = batchPart.style; + } + for (let i = this.shapeIndex; i < graphicsData.length; i++) { + this.shapeIndex++; + const data = graphicsData[i]; + const fillStyle = data.fillStyle; + const lineStyle = data.lineStyle; + const command = FILL_COMMANDS[data.type]; + command.build(data); + if (data.matrix) { + this.transformPoints(data.points, data.matrix); + } + if (fillStyle.visible || lineStyle.visible) { + this.processHoles(data.holes); + } + for (let j = 0; j < 2; j++) { + const style = j === 0 ? fillStyle : lineStyle; + if (!style.visible) + continue; + const nextTexture = style.texture.baseTexture; + const index2 = this.indices.length; + const attribIndex = this.points.length / 2; + nextTexture.wrapMode = WRAP_MODES.REPEAT; + if (j === 0) { + this.processFill(data); + } else { + this.processLine(data); + } + const size = this.points.length / 2 - attribIndex; + if (size === 0) + continue; + if (batchPart && !this._compareStyles(currentStyle, style)) { + batchPart.end(index2, attribIndex); + batchPart = null; + } + if (!batchPart) { + batchPart = BATCH_POOL.pop() || new BatchPart(); + batchPart.begin(style, index2, attribIndex); + this.batches.push(batchPart); + currentStyle = style; + } + this.addUvs(this.points, uvs, style.texture, attribIndex, size, style.matrix); + } + } + const index = this.indices.length; + const attrib = this.points.length / 2; + if (batchPart) { + batchPart.end(index, attrib); + } + if (this.batches.length === 0) { + this.batchable = true; + return; + } + const need32 = attrib > 65535; + if (this.indicesUint16 && this.indices.length === this.indicesUint16.length && need32 === this.indicesUint16.BYTES_PER_ELEMENT > 2) { + this.indicesUint16.set(this.indices); + } else { + this.indicesUint16 = need32 ? new Uint32Array(this.indices) : new Uint16Array(this.indices); + } + this.batchable = this.isBatchable(); + if (this.batchable) { + this.packBatches(); + } else { + this.buildDrawCalls(); + } + } + _compareStyles(styleA, styleB) { + if (!styleA || !styleB) { + return false; + } + if (styleA.texture.baseTexture !== styleB.texture.baseTexture) { + return false; + } + if (styleA.color + styleA.alpha !== styleB.color + styleB.alpha) { + return false; + } + if (!!styleA.native !== !!styleB.native) { + return false; + } + return true; + } + validateBatching() { + if (this.dirty === this.cacheDirty || !this.graphicsData.length) { + return false; + } + for (let i = 0, l = this.graphicsData.length; i < l; i++) { + const data = this.graphicsData[i]; + const fill = data.fillStyle; + const line = data.lineStyle; + if (fill && !fill.texture.baseTexture.valid) + return false; + if (line && !line.texture.baseTexture.valid) + return false; + } + return true; + } + packBatches() { + this.batchDirty++; + this.uvsFloat32 = new Float32Array(this.uvs); + const batches = this.batches; + for (let i = 0, l = batches.length; i < l; i++) { + const batch = batches[i]; + for (let j = 0; j < batch.size; j++) { + const index = batch.start + j; + this.indicesUint16[index] = this.indicesUint16[index] - batch.attribStart; + } + } + } + isBatchable() { + if (this.points.length > 65535 * 2) { + return false; + } + const batches = this.batches; + for (let i = 0; i < batches.length; i++) { + if (batches[i].style.native) { + return false; + } + } + return this.points.length < _GraphicsGeometry.BATCHABLE_SIZE * 2; + } + buildDrawCalls() { + let TICK = ++BaseTexture._globalBatch; + for (let i = 0; i < this.drawCalls.length; i++) { + this.drawCalls[i].texArray.clear(); + DRAW_CALL_POOL.push(this.drawCalls[i]); + } + this.drawCalls.length = 0; + const colors = this.colors; + const textureIds = this.textureIds; + let currentGroup = DRAW_CALL_POOL.pop(); + if (!currentGroup) { + currentGroup = new BatchDrawCall(); + currentGroup.texArray = new BatchTextureArray(); + } + currentGroup.texArray.count = 0; + currentGroup.start = 0; + currentGroup.size = 0; + currentGroup.type = DRAW_MODES.TRIANGLES; + let textureCount = 0; + let currentTexture = null; + let textureId = 0; + let native = false; + let drawMode = DRAW_MODES.TRIANGLES; + let index = 0; + this.drawCalls.push(currentGroup); + for (let i = 0; i < this.batches.length; i++) { + const data = this.batches[i]; + const maxTextures = 8; + const style = data.style; + const nextTexture = style.texture.baseTexture; + if (native !== !!style.native) { + native = !!style.native; + drawMode = native ? DRAW_MODES.LINES : DRAW_MODES.TRIANGLES; + currentTexture = null; + textureCount = maxTextures; + TICK++; + } + if (currentTexture !== nextTexture) { + currentTexture = nextTexture; + if (nextTexture._batchEnabled !== TICK) { + if (textureCount === maxTextures) { + TICK++; + textureCount = 0; + if (currentGroup.size > 0) { + currentGroup = DRAW_CALL_POOL.pop(); + if (!currentGroup) { + currentGroup = new BatchDrawCall(); + currentGroup.texArray = new BatchTextureArray(); + } + this.drawCalls.push(currentGroup); + } + currentGroup.start = index; + currentGroup.size = 0; + currentGroup.texArray.count = 0; + currentGroup.type = drawMode; + } + nextTexture.touched = 1; + nextTexture._batchEnabled = TICK; + nextTexture._batchLocation = textureCount; + nextTexture.wrapMode = WRAP_MODES.REPEAT; + currentGroup.texArray.elements[currentGroup.texArray.count++] = nextTexture; + textureCount++; + } + } + currentGroup.size += data.size; + index += data.size; + textureId = nextTexture._batchLocation; + this.addColors(colors, style.color, style.alpha, data.attribSize, data.attribStart); + this.addTextureIds(textureIds, textureId, data.attribSize, data.attribStart); + } + BaseTexture._globalBatch = TICK; + this.packAttributes(); + } + packAttributes() { + const verts = this.points; + const uvs = this.uvs; + const colors = this.colors; + const textureIds = this.textureIds; + const glPoints = new ArrayBuffer(verts.length * 3 * 4); + const f32 = new Float32Array(glPoints); + const u32 = new Uint32Array(glPoints); + let p = 0; + for (let i = 0; i < verts.length / 2; i++) { + f32[p++] = verts[i * 2]; + f32[p++] = verts[i * 2 + 1]; + f32[p++] = uvs[i * 2]; + f32[p++] = uvs[i * 2 + 1]; + u32[p++] = colors[i]; + f32[p++] = textureIds[i]; + } + this._buffer.update(glPoints); + this._indexBuffer.update(this.indicesUint16); + } + processFill(data) { + if (data.holes.length) { + buildPoly.triangulate(data, this); + } else { + const command = FILL_COMMANDS[data.type]; + command.triangulate(data, this); + } + } + processLine(data) { + buildLine(data, this); + for (let i = 0; i < data.holes.length; i++) { + buildLine(data.holes[i], this); + } + } + processHoles(holes) { + for (let i = 0; i < holes.length; i++) { + const hole = holes[i]; + const command = FILL_COMMANDS[hole.type]; + command.build(hole); + if (hole.matrix) { + this.transformPoints(hole.points, hole.matrix); + } + } + } + calculateBounds() { + const bounds = this._bounds; + bounds.clear(); + bounds.addVertexData(this.points, 0, this.points.length); + bounds.pad(this.boundsPadding, this.boundsPadding); + } + transformPoints(points, matrix) { + for (let i = 0; i < points.length / 2; i++) { + const x = points[i * 2]; + const y = points[i * 2 + 1]; + points[i * 2] = matrix.a * x + matrix.c * y + matrix.tx; + points[i * 2 + 1] = matrix.b * x + matrix.d * y + matrix.ty; + } + } + addColors(colors, color, alpha, size, offset = 0) { + const bgr = Color.shared.setValue(color).toLittleEndianNumber(); + const result = Color.shared.setValue(bgr).toPremultiplied(alpha); + colors.length = Math.max(colors.length, offset + size); + for (let i = 0; i < size; i++) { + colors[offset + i] = result; + } + } + addTextureIds(textureIds, id, size, offset = 0) { + textureIds.length = Math.max(textureIds.length, offset + size); + for (let i = 0; i < size; i++) { + textureIds[offset + i] = id; + } + } + addUvs(verts, uvs, texture, start, size, matrix = null) { + let index = 0; + const uvsStart = uvs.length; + const frame = texture.frame; + while (index < size) { + let x = verts[(start + index) * 2]; + let y = verts[(start + index) * 2 + 1]; + if (matrix) { + const nx = matrix.a * x + matrix.c * y + matrix.tx; + y = matrix.b * x + matrix.d * y + matrix.ty; + x = nx; + } + index++; + uvs.push(x / frame.width, y / frame.height); + } + const baseTexture = texture.baseTexture; + if (frame.width < baseTexture.width || frame.height < baseTexture.height) { + this.adjustUvs(uvs, texture, uvsStart, size); + } + } + adjustUvs(uvs, texture, start, size) { + const baseTexture = texture.baseTexture; + const eps = 1e-6; + const finish = start + size * 2; + const frame = texture.frame; + const scaleX = frame.width / baseTexture.width; + const scaleY = frame.height / baseTexture.height; + let offsetX = frame.x / frame.width; + let offsetY = frame.y / frame.height; + let minX = Math.floor(uvs[start] + eps); + let minY = Math.floor(uvs[start + 1] + eps); + for (let i = start + 2; i < finish; i += 2) { + minX = Math.min(minX, Math.floor(uvs[i] + eps)); + minY = Math.min(minY, Math.floor(uvs[i + 1] + eps)); + } + offsetX -= minX; + offsetY -= minY; + for (let i = start; i < finish; i += 2) { + uvs[i] = (uvs[i] + offsetX) * scaleX; + uvs[i + 1] = (uvs[i + 1] + offsetY) * scaleY; + } + } + }; + let GraphicsGeometry = _GraphicsGeometry; + GraphicsGeometry.BATCHABLE_SIZE = 100; + + class FillStyle { + constructor() { + this.color = 16777215; + this.alpha = 1; + this.texture = Texture.WHITE; + this.matrix = null; + this.visible = false; + this.reset(); + } + clone() { + const obj = new FillStyle(); + obj.color = this.color; + obj.alpha = this.alpha; + obj.texture = this.texture; + obj.matrix = this.matrix; + obj.visible = this.visible; + return obj; + } + reset() { + this.color = 16777215; + this.alpha = 1; + this.texture = Texture.WHITE; + this.matrix = null; + this.visible = false; + } + destroy() { + this.texture = null; + this.matrix = null; + } + } + + class LineStyle extends FillStyle { + constructor() { + super(...arguments); + this.width = 0; + this.alignment = 0.5; + this.native = false; + this.cap = LINE_CAP.BUTT; + this.join = LINE_JOIN.MITER; + this.miterLimit = 10; + } + clone() { + const obj = new LineStyle(); + obj.color = this.color; + obj.alpha = this.alpha; + obj.texture = this.texture; + obj.matrix = this.matrix; + obj.visible = this.visible; + obj.width = this.width; + obj.alignment = this.alignment; + obj.native = this.native; + obj.cap = this.cap; + obj.join = this.join; + obj.miterLimit = this.miterLimit; + return obj; + } + reset() { + super.reset(); + this.color = 0; + this.alignment = 0.5; + this.width = 0; + this.native = false; + } + } + + const DEFAULT_SHADERS = {}; + const _Graphics = class extends Container { + constructor(geometry = null) { + super(); + this.shader = null; + this.pluginName = "batch"; + this.currentPath = null; + this.batches = []; + this.batchTint = -1; + this.batchDirty = -1; + this.vertexData = null; + this._fillStyle = new FillStyle(); + this._lineStyle = new LineStyle(); + this._matrix = null; + this._holeMode = false; + this.state = State.for2d(); + this._geometry = geometry || new GraphicsGeometry(); + this._geometry.refCount++; + this._transformID = -1; + this._tintColor = new Color(16777215); + this.blendMode = BLEND_MODES.NORMAL; + } + get geometry() { + return this._geometry; + } + clone() { + this.finishPoly(); + return new _Graphics(this._geometry); + } + set blendMode(value) { + this.state.blendMode = value; + } + get blendMode() { + return this.state.blendMode; + } + get tint() { + return this._tintColor.value; + } + set tint(value) { + this._tintColor.setValue(value); + } + get fill() { + return this._fillStyle; + } + get line() { + return this._lineStyle; + } + lineStyle(options = null, color = 0, alpha, alignment = 0.5, native = false) { + if (typeof options === "number") { + options = { width: options, color, alpha, alignment, native }; + } + return this.lineTextureStyle(options); + } + lineTextureStyle(options) { + const defaultLineStyleOptions = { + width: 0, + texture: Texture.WHITE, + color: options?.texture ? 16777215 : 0, + matrix: null, + alignment: 0.5, + native: false, + cap: LINE_CAP.BUTT, + join: LINE_JOIN.MITER, + miterLimit: 10 + }; + options = Object.assign(defaultLineStyleOptions, options); + this.normalizeColor(options); + if (this.currentPath) { + this.startPoly(); + } + const visible = options.width > 0 && options.alpha > 0; + if (!visible) { + this._lineStyle.reset(); + } else { + if (options.matrix) { + options.matrix = options.matrix.clone(); + options.matrix.invert(); + } + Object.assign(this._lineStyle, { visible }, options); + } + return this; + } + startPoly() { + if (this.currentPath) { + const points = this.currentPath.points; + const len = this.currentPath.points.length; + if (len > 2) { + this.drawShape(this.currentPath); + this.currentPath = new Polygon(); + this.currentPath.closeStroke = false; + this.currentPath.points.push(points[len - 2], points[len - 1]); + } + } else { + this.currentPath = new Polygon(); + this.currentPath.closeStroke = false; + } + } + finishPoly() { + if (this.currentPath) { + if (this.currentPath.points.length > 2) { + this.drawShape(this.currentPath); + this.currentPath = null; + } else { + this.currentPath.points.length = 0; + } + } + } + moveTo(x, y) { + this.startPoly(); + this.currentPath.points[0] = x; + this.currentPath.points[1] = y; + return this; + } + lineTo(x, y) { + if (!this.currentPath) { + this.moveTo(0, 0); + } + const points = this.currentPath.points; + const fromX = points[points.length - 2]; + const fromY = points[points.length - 1]; + if (fromX !== x || fromY !== y) { + points.push(x, y); + } + return this; + } + _initCurve(x = 0, y = 0) { + if (this.currentPath) { + if (this.currentPath.points.length === 0) { + this.currentPath.points = [x, y]; + } + } else { + this.moveTo(x, y); + } + } + quadraticCurveTo(cpX, cpY, toX, toY) { + this._initCurve(); + const points = this.currentPath.points; + if (points.length === 0) { + this.moveTo(0, 0); + } + QuadraticUtils.curveTo(cpX, cpY, toX, toY, points); + return this; + } + bezierCurveTo(cpX, cpY, cpX2, cpY2, toX, toY) { + this._initCurve(); + BezierUtils.curveTo(cpX, cpY, cpX2, cpY2, toX, toY, this.currentPath.points); + return this; + } + arcTo(x1, y1, x2, y2, radius) { + this._initCurve(x1, y1); + const points = this.currentPath.points; + const result = ArcUtils.curveTo(x1, y1, x2, y2, radius, points); + if (result) { + const { cx, cy, radius: radius2, startAngle, endAngle, anticlockwise } = result; + this.arc(cx, cy, radius2, startAngle, endAngle, anticlockwise); + } + return this; + } + arc(cx, cy, radius, startAngle, endAngle, anticlockwise = false) { + if (startAngle === endAngle) { + return this; + } + if (!anticlockwise && endAngle <= startAngle) { + endAngle += PI_2; + } else if (anticlockwise && startAngle <= endAngle) { + startAngle += PI_2; + } + const sweep = endAngle - startAngle; + if (sweep === 0) { + return this; + } + const startX = cx + Math.cos(startAngle) * radius; + const startY = cy + Math.sin(startAngle) * radius; + const eps = this._geometry.closePointEps; + let points = this.currentPath ? this.currentPath.points : null; + if (points) { + const xDiff = Math.abs(points[points.length - 2] - startX); + const yDiff = Math.abs(points[points.length - 1] - startY); + if (xDiff < eps && yDiff < eps) { + } else { + points.push(startX, startY); + } + } else { + this.moveTo(startX, startY); + points = this.currentPath.points; + } + ArcUtils.arc(startX, startY, cx, cy, radius, startAngle, endAngle, anticlockwise, points); + return this; + } + beginFill(color = 0, alpha) { + return this.beginTextureFill({ texture: Texture.WHITE, color, alpha }); + } + normalizeColor(options) { + const temp = Color.shared.setValue(options.color ?? 0); + options.color = temp.toNumber(); + options.alpha ?? (options.alpha = temp.alpha); + } + beginTextureFill(options) { + const defaultOptions = { + texture: Texture.WHITE, + color: 16777215, + matrix: null + }; + options = Object.assign(defaultOptions, options); + this.normalizeColor(options); + if (this.currentPath) { + this.startPoly(); + } + const visible = options.alpha > 0; + if (!visible) { + this._fillStyle.reset(); + } else { + if (options.matrix) { + options.matrix = options.matrix.clone(); + options.matrix.invert(); + } + Object.assign(this._fillStyle, { visible }, options); + } + return this; + } + endFill() { + this.finishPoly(); + this._fillStyle.reset(); + return this; + } + drawRect(x, y, width, height) { + return this.drawShape(new Rectangle(x, y, width, height)); + } + drawRoundedRect(x, y, width, height, radius) { + return this.drawShape(new RoundedRectangle(x, y, width, height, radius)); + } + drawCircle(x, y, radius) { + return this.drawShape(new Circle(x, y, radius)); + } + drawEllipse(x, y, width, height) { + return this.drawShape(new Ellipse(x, y, width, height)); + } + drawPolygon(...path) { + let points; + let closeStroke = true; + const poly = path[0]; + if (poly.points) { + closeStroke = poly.closeStroke; + points = poly.points; + } else if (Array.isArray(path[0])) { + points = path[0]; + } else { + points = path; + } + const shape = new Polygon(points); + shape.closeStroke = closeStroke; + this.drawShape(shape); + return this; + } + drawShape(shape) { + if (!this._holeMode) { + this._geometry.drawShape(shape, this._fillStyle.clone(), this._lineStyle.clone(), this._matrix); + } else { + this._geometry.drawHole(shape, this._matrix); + } + return this; + } + clear() { + this._geometry.clear(); + this._lineStyle.reset(); + this._fillStyle.reset(); + this._boundsID++; + this._matrix = null; + this._holeMode = false; + this.currentPath = null; + return this; + } + isFastRect() { + const data = this._geometry.graphicsData; + return data.length === 1 && data[0].shape.type === SHAPES.RECT && !data[0].matrix && !data[0].holes.length && !(data[0].lineStyle.visible && data[0].lineStyle.width); + } + _render(renderer) { + this.finishPoly(); + const geometry = this._geometry; + geometry.updateBatches(); + if (geometry.batchable) { + if (this.batchDirty !== geometry.batchDirty) { + this._populateBatches(); + } + this._renderBatched(renderer); + } else { + renderer.batch.flush(); + this._renderDirect(renderer); + } + } + _populateBatches() { + const geometry = this._geometry; + const blendMode = this.blendMode; + const len = geometry.batches.length; + this.batchTint = -1; + this._transformID = -1; + this.batchDirty = geometry.batchDirty; + this.batches.length = len; + this.vertexData = new Float32Array(geometry.points); + for (let i = 0; i < len; i++) { + const gI = geometry.batches[i]; + const color = gI.style.color; + const vertexData = new Float32Array(this.vertexData.buffer, gI.attribStart * 4 * 2, gI.attribSize * 2); + const uvs = new Float32Array(geometry.uvsFloat32.buffer, gI.attribStart * 4 * 2, gI.attribSize * 2); + const indices = new Uint16Array(geometry.indicesUint16.buffer, gI.start * 2, gI.size); + const batch = { + vertexData, + blendMode, + indices, + uvs, + _batchRGB: Color.shared.setValue(color).toRgbArray(), + _tintRGB: color, + _texture: gI.style.texture, + alpha: gI.style.alpha, + worldAlpha: 1 + }; + this.batches[i] = batch; + } + } + _renderBatched(renderer) { + if (!this.batches.length) { + return; + } + renderer.batch.setObjectRenderer(renderer.plugins[this.pluginName]); + this.calculateVertices(); + this.calculateTints(); + for (let i = 0, l = this.batches.length; i < l; i++) { + const batch = this.batches[i]; + batch.worldAlpha = this.worldAlpha * batch.alpha; + renderer.plugins[this.pluginName].render(batch); + } + } + _renderDirect(renderer) { + const shader = this._resolveDirectShader(renderer); + const geometry = this._geometry; + const worldAlpha = this.worldAlpha; + const uniforms = shader.uniforms; + const drawCalls = geometry.drawCalls; + uniforms.translationMatrix = this.transform.worldTransform; + Color.shared.setValue(this._tintColor).multiply([worldAlpha, worldAlpha, worldAlpha]).setAlpha(worldAlpha).toArray(uniforms.tint); + renderer.shader.bind(shader); + renderer.geometry.bind(geometry, shader); + renderer.state.set(this.state); + for (let i = 0, l = drawCalls.length; i < l; i++) { + this._renderDrawCallDirect(renderer, geometry.drawCalls[i]); + } + } + _renderDrawCallDirect(renderer, drawCall) { + const { texArray, type, size, start } = drawCall; + const groupTextureCount = texArray.count; + for (let j = 0; j < groupTextureCount; j++) { + renderer.texture.bind(texArray.elements[j], j); + } + renderer.geometry.draw(type, size, start); + } + _resolveDirectShader(renderer) { + let shader = this.shader; + const pluginName = this.pluginName; + if (!shader) { + if (!DEFAULT_SHADERS[pluginName]) { + const { maxTextures } = renderer.plugins[pluginName]; + const sampleValues = new Int32Array(maxTextures); + for (let i = 0; i < maxTextures; i++) { + sampleValues[i] = i; + } + const uniforms = { + tint: new Float32Array([1, 1, 1, 1]), + translationMatrix: new Matrix(), + default: UniformGroup.from({ uSamplers: sampleValues }, true) + }; + const program = renderer.plugins[pluginName]._shader.program; + DEFAULT_SHADERS[pluginName] = new Shader(program, uniforms); + } + shader = DEFAULT_SHADERS[pluginName]; + } + return shader; + } + _calculateBounds() { + this.finishPoly(); + const geometry = this._geometry; + if (!geometry.graphicsData.length) { + return; + } + const { minX, minY, maxX, maxY } = geometry.bounds; + this._bounds.addFrame(this.transform, minX, minY, maxX, maxY); + } + containsPoint(point) { + this.worldTransform.applyInverse(point, _Graphics._TEMP_POINT); + return this._geometry.containsPoint(_Graphics._TEMP_POINT); + } + calculateTints() { + if (this.batchTint !== this.tint) { + this.batchTint = this._tintColor.toNumber(); + for (let i = 0; i < this.batches.length; i++) { + const batch = this.batches[i]; + batch._tintRGB = Color.shared.setValue(this._tintColor).multiply(batch._batchRGB).toLittleEndianNumber(); + } + } + } + calculateVertices() { + const wtID = this.transform._worldID; + if (this._transformID === wtID) { + return; + } + this._transformID = wtID; + const wt = this.transform.worldTransform; + const a = wt.a; + const b = wt.b; + const c = wt.c; + const d = wt.d; + const tx = wt.tx; + const ty = wt.ty; + const data = this._geometry.points; + const vertexData = this.vertexData; + let count = 0; + for (let i = 0; i < data.length; i += 2) { + const x = data[i]; + const y = data[i + 1]; + vertexData[count++] = a * x + c * y + tx; + vertexData[count++] = d * y + b * x + ty; + } + } + closePath() { + const currentPath = this.currentPath; + if (currentPath) { + currentPath.closeStroke = true; + this.finishPoly(); + } + return this; + } + setMatrix(matrix) { + this._matrix = matrix; + return this; + } + beginHole() { + this.finishPoly(); + this._holeMode = true; + return this; + } + endHole() { + this.finishPoly(); + this._holeMode = false; + return this; + } + destroy(options) { + this._geometry.refCount--; + if (this._geometry.refCount === 0) { + this._geometry.dispose(); + } + this._matrix = null; + this.currentPath = null; + this._lineStyle.destroy(); + this._lineStyle = null; + this._fillStyle.destroy(); + this._fillStyle = null; + this._geometry = null; + this.shader = null; + this.vertexData = null; + this.batches.length = 0; + this.batches = null; + super.destroy(options); + } + }; + let Graphics = _Graphics; + Graphics.curves = curves; + Graphics._TEMP_POINT = new Point(); + + const graphicsUtils = { + buildPoly, + buildCircle, + buildRectangle, + buildRoundedRectangle, + buildLine, + ArcUtils, + BezierUtils, + QuadraticUtils, + BatchPart, + FILL_COMMANDS, + BATCH_POOL, + DRAW_CALL_POOL + }; + + class MeshBatchUvs { + constructor(uvBuffer, uvMatrix) { + this.uvBuffer = uvBuffer; + this.uvMatrix = uvMatrix; + this.data = null; + this._bufferUpdateId = -1; + this._textureUpdateId = -1; + this._updateID = 0; + } + update(forceUpdate) { + if (!forceUpdate && this._bufferUpdateId === this.uvBuffer._updateID && this._textureUpdateId === this.uvMatrix._updateID) { + return; + } + this._bufferUpdateId = this.uvBuffer._updateID; + this._textureUpdateId = this.uvMatrix._updateID; + const data = this.uvBuffer.data; + if (!this.data || this.data.length !== data.length) { + this.data = new Float32Array(data.length); + } + this.uvMatrix.multiplyUvs(data, this.data); + this._updateID++; + } + } + + const tempPoint$1 = new Point(); + const tempPolygon = new Polygon(); + const _Mesh = class extends Container { + constructor(geometry, shader, state, drawMode = DRAW_MODES.TRIANGLES) { + super(); + this.geometry = geometry; + this.shader = shader; + this.state = state || State.for2d(); + this.drawMode = drawMode; + this.start = 0; + this.size = 0; + this.uvs = null; + this.indices = null; + this.vertexData = new Float32Array(1); + this.vertexDirty = -1; + this._transformID = -1; + this._roundPixels = settings.ROUND_PIXELS; + this.batchUvs = null; + } + get geometry() { + return this._geometry; + } + set geometry(value) { + if (this._geometry === value) { + return; + } + if (this._geometry) { + this._geometry.refCount--; + if (this._geometry.refCount === 0) { + this._geometry.dispose(); + } + } + this._geometry = value; + if (this._geometry) { + this._geometry.refCount++; + } + this.vertexDirty = -1; + } + get uvBuffer() { + return this.geometry.buffers[1]; + } + get verticesBuffer() { + return this.geometry.buffers[0]; + } + set material(value) { + this.shader = value; + } + get material() { + return this.shader; + } + set blendMode(value) { + this.state.blendMode = value; + } + get blendMode() { + return this.state.blendMode; + } + set roundPixels(value) { + if (this._roundPixels !== value) { + this._transformID = -1; + } + this._roundPixels = value; + } + get roundPixels() { + return this._roundPixels; + } + get tint() { + return "tint" in this.shader ? this.shader.tint : null; + } + set tint(value) { + this.shader.tint = value; + } + get tintValue() { + return this.shader.tintValue; + } + get texture() { + return "texture" in this.shader ? this.shader.texture : null; + } + set texture(value) { + this.shader.texture = value; + } + _render(renderer) { + const vertices = this.geometry.buffers[0].data; + const shader = this.shader; + if (shader.batchable && this.drawMode === DRAW_MODES.TRIANGLES && vertices.length < _Mesh.BATCHABLE_SIZE * 2) { + this._renderToBatch(renderer); + } else { + this._renderDefault(renderer); + } + } + _renderDefault(renderer) { + const shader = this.shader; + shader.alpha = this.worldAlpha; + if (shader.update) { + shader.update(); + } + renderer.batch.flush(); + shader.uniforms.translationMatrix = this.transform.worldTransform.toArray(true); + renderer.shader.bind(shader); + renderer.state.set(this.state); + renderer.geometry.bind(this.geometry, shader); + renderer.geometry.draw(this.drawMode, this.size, this.start, this.geometry.instanceCount); + } + _renderToBatch(renderer) { + const geometry = this.geometry; + const shader = this.shader; + if (shader.uvMatrix) { + shader.uvMatrix.update(); + this.calculateUvs(); + } + this.calculateVertices(); + this.indices = geometry.indexBuffer.data; + this._tintRGB = shader._tintRGB; + this._texture = shader.texture; + const pluginName = this.material.pluginName; + renderer.batch.setObjectRenderer(renderer.plugins[pluginName]); + renderer.plugins[pluginName].render(this); + } + calculateVertices() { + const geometry = this.geometry; + const verticesBuffer = geometry.buffers[0]; + const vertices = verticesBuffer.data; + const vertexDirtyId = verticesBuffer._updateID; + if (vertexDirtyId === this.vertexDirty && this._transformID === this.transform._worldID) { + return; + } + this._transformID = this.transform._worldID; + if (this.vertexData.length !== vertices.length) { + this.vertexData = new Float32Array(vertices.length); + } + const wt = this.transform.worldTransform; + const a = wt.a; + const b = wt.b; + const c = wt.c; + const d = wt.d; + const tx = wt.tx; + const ty = wt.ty; + const vertexData = this.vertexData; + for (let i = 0; i < vertexData.length / 2; i++) { + const x = vertices[i * 2]; + const y = vertices[i * 2 + 1]; + vertexData[i * 2] = a * x + c * y + tx; + vertexData[i * 2 + 1] = b * x + d * y + ty; + } + if (this._roundPixels) { + const resolution = settings.RESOLUTION; + for (let i = 0; i < vertexData.length; ++i) { + vertexData[i] = Math.round(vertexData[i] * resolution) / resolution; + } + } + this.vertexDirty = vertexDirtyId; + } + calculateUvs() { + const geomUvs = this.geometry.buffers[1]; + const shader = this.shader; + if (!shader.uvMatrix.isSimple) { + if (!this.batchUvs) { + this.batchUvs = new MeshBatchUvs(geomUvs, shader.uvMatrix); + } + this.batchUvs.update(); + this.uvs = this.batchUvs.data; + } else { + this.uvs = geomUvs.data; + } + } + _calculateBounds() { + this.calculateVertices(); + this._bounds.addVertexData(this.vertexData, 0, this.vertexData.length); + } + containsPoint(point) { + if (!this.getBounds().contains(point.x, point.y)) { + return false; + } + this.worldTransform.applyInverse(point, tempPoint$1); + const vertices = this.geometry.getBuffer("aVertexPosition").data; + const points = tempPolygon.points; + const indices = this.geometry.getIndex().data; + const len = indices.length; + const step = this.drawMode === 4 ? 3 : 1; + for (let i = 0; i + 2 < len; i += step) { + const ind0 = indices[i] * 2; + const ind1 = indices[i + 1] * 2; + const ind2 = indices[i + 2] * 2; + points[0] = vertices[ind0]; + points[1] = vertices[ind0 + 1]; + points[2] = vertices[ind1]; + points[3] = vertices[ind1 + 1]; + points[4] = vertices[ind2]; + points[5] = vertices[ind2 + 1]; + if (tempPolygon.contains(tempPoint$1.x, tempPoint$1.y)) { + return true; + } + } + return false; + } + destroy(options) { + super.destroy(options); + if (this._cachedTexture) { + this._cachedTexture.destroy(); + this._cachedTexture = null; + } + this.geometry = null; + this.shader = null; + this.state = null; + this.uvs = null; + this.indices = null; + this.vertexData = null; + } + }; + let Mesh = _Mesh; + Mesh.BATCHABLE_SIZE = 100; + + class MeshGeometry extends Geometry { + constructor(vertices, uvs, index) { + super(); + const verticesBuffer = new Buffer(vertices); + const uvsBuffer = new Buffer(uvs, true); + const indexBuffer = new Buffer(index, true, true); + this.addAttribute("aVertexPosition", verticesBuffer, 2, false, TYPES.FLOAT).addAttribute("aTextureCoord", uvsBuffer, 2, false, TYPES.FLOAT).addIndex(indexBuffer); + this._updateId = -1; + } + get vertexDirtyId() { + return this.buffers[0]._updateID; + } + } + + var fragment$1 = "varying vec2 vTextureCoord;\nuniform vec4 uColor;\n\nuniform sampler2D uSampler;\n\nvoid main(void)\n{\n gl_FragColor = texture2D(uSampler, vTextureCoord) * uColor;\n}\n"; + + var vertex$1 = "attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTextureMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = (uTextureMatrix * vec3(aTextureCoord, 1.0)).xy;\n}\n"; + + class MeshMaterial extends Shader { + constructor(uSampler, options) { + const uniforms = { + uSampler, + alpha: 1, + uTextureMatrix: Matrix.IDENTITY, + uColor: new Float32Array([1, 1, 1, 1]) + }; + options = Object.assign({ + tint: 16777215, + alpha: 1, + pluginName: "batch" + }, options); + if (options.uniforms) { + Object.assign(uniforms, options.uniforms); + } + super(options.program || Program.from(vertex$1, fragment$1), uniforms); + this._colorDirty = false; + this.uvMatrix = new TextureMatrix(uSampler); + this.batchable = options.program === void 0; + this.pluginName = options.pluginName; + this._tintColor = new Color(options.tint); + this._tintRGB = this._tintColor.toLittleEndianNumber(); + this._colorDirty = true; + this.alpha = options.alpha; + } + get texture() { + return this.uniforms.uSampler; + } + set texture(value) { + if (this.uniforms.uSampler !== value) { + if (!this.uniforms.uSampler.baseTexture.alphaMode !== !value.baseTexture.alphaMode) { + this._colorDirty = true; + } + this.uniforms.uSampler = value; + this.uvMatrix.texture = value; + } + } + set alpha(value) { + if (value === this._alpha) + return; + this._alpha = value; + this._colorDirty = true; + } + get alpha() { + return this._alpha; + } + set tint(value) { + if (value === this.tint) + return; + this._tintColor.setValue(value); + this._tintRGB = this._tintColor.toLittleEndianNumber(); + this._colorDirty = true; + } + get tint() { + return this._tintColor.value; + } + get tintValue() { + return this._tintColor.toNumber(); + } + update() { + if (this._colorDirty) { + this._colorDirty = false; + const baseTexture = this.texture.baseTexture; + const applyToChannels = baseTexture.alphaMode; + Color.shared.setValue(this._tintColor).premultiply(this._alpha, applyToChannels).toArray(this.uniforms.uColor); + } + if (this.uvMatrix.update()) { + this.uniforms.uTextureMatrix = this.uvMatrix.mapCoord; + } + } + } + + class PlaneGeometry extends MeshGeometry { + constructor(width = 100, height = 100, segWidth = 10, segHeight = 10) { + super(); + this.segWidth = segWidth; + this.segHeight = segHeight; + this.width = width; + this.height = height; + this.build(); + } + build() { + const total = this.segWidth * this.segHeight; + const verts = []; + const uvs = []; + const indices = []; + const segmentsX = this.segWidth - 1; + const segmentsY = this.segHeight - 1; + const sizeX = this.width / segmentsX; + const sizeY = this.height / segmentsY; + for (let i = 0; i < total; i++) { + const x = i % this.segWidth; + const y = i / this.segWidth | 0; + verts.push(x * sizeX, y * sizeY); + uvs.push(x / segmentsX, y / segmentsY); + } + const totalSub = segmentsX * segmentsY; + for (let i = 0; i < totalSub; i++) { + const xpos = i % segmentsX; + const ypos = i / segmentsX | 0; + const value = ypos * this.segWidth + xpos; + const value2 = ypos * this.segWidth + xpos + 1; + const value3 = (ypos + 1) * this.segWidth + xpos; + const value4 = (ypos + 1) * this.segWidth + xpos + 1; + indices.push(value, value2, value3, value2, value4, value3); + } + this.buffers[0].data = new Float32Array(verts); + this.buffers[1].data = new Float32Array(uvs); + this.indexBuffer.data = new Uint16Array(indices); + this.buffers[0].update(); + this.buffers[1].update(); + this.indexBuffer.update(); + } + } + + class RopeGeometry extends MeshGeometry { + constructor(width = 200, points, textureScale = 0) { + super(new Float32Array(points.length * 4), new Float32Array(points.length * 4), new Uint16Array((points.length - 1) * 6)); + this.points = points; + this._width = width; + this.textureScale = textureScale; + this.build(); + } + get width() { + return this._width; + } + build() { + const points = this.points; + if (!points) + return; + const vertexBuffer = this.getBuffer("aVertexPosition"); + const uvBuffer = this.getBuffer("aTextureCoord"); + const indexBuffer = this.getIndex(); + if (points.length < 1) { + return; + } + if (vertexBuffer.data.length / 4 !== points.length) { + vertexBuffer.data = new Float32Array(points.length * 4); + uvBuffer.data = new Float32Array(points.length * 4); + indexBuffer.data = new Uint16Array((points.length - 1) * 6); + } + const uvs = uvBuffer.data; + const indices = indexBuffer.data; + uvs[0] = 0; + uvs[1] = 0; + uvs[2] = 0; + uvs[3] = 1; + let amount = 0; + let prev = points[0]; + const textureWidth = this._width * this.textureScale; + const total = points.length; + for (let i = 0; i < total; i++) { + const index = i * 4; + if (this.textureScale > 0) { + const dx = prev.x - points[i].x; + const dy = prev.y - points[i].y; + const distance = Math.sqrt(dx * dx + dy * dy); + prev = points[i]; + amount += distance / textureWidth; + } else { + amount = i / (total - 1); + } + uvs[index] = amount; + uvs[index + 1] = 0; + uvs[index + 2] = amount; + uvs[index + 3] = 1; + } + let indexCount = 0; + for (let i = 0; i < total - 1; i++) { + const index = i * 2; + indices[indexCount++] = index; + indices[indexCount++] = index + 1; + indices[indexCount++] = index + 2; + indices[indexCount++] = index + 2; + indices[indexCount++] = index + 1; + indices[indexCount++] = index + 3; + } + uvBuffer.update(); + indexBuffer.update(); + this.updateVertices(); + } + updateVertices() { + const points = this.points; + if (points.length < 1) { + return; + } + let lastPoint = points[0]; + let nextPoint; + let perpX = 0; + let perpY = 0; + const vertices = this.buffers[0].data; + const total = points.length; + const halfWidth = this.textureScale > 0 ? this.textureScale * this._width / 2 : this._width / 2; + for (let i = 0; i < total; i++) { + const point = points[i]; + const index = i * 4; + if (i < points.length - 1) { + nextPoint = points[i + 1]; + } else { + nextPoint = point; + } + perpY = -(nextPoint.x - lastPoint.x); + perpX = nextPoint.y - lastPoint.y; + let ratio = (1 - i / (total - 1)) * 10; + if (ratio > 1) { + ratio = 1; + } + const perpLength = Math.sqrt(perpX * perpX + perpY * perpY); + if (perpLength < 1e-6) { + perpX = 0; + perpY = 0; + } else { + perpX /= perpLength; + perpY /= perpLength; + perpX *= halfWidth; + perpY *= halfWidth; + } + vertices[index] = point.x + perpX; + vertices[index + 1] = point.y + perpY; + vertices[index + 2] = point.x - perpX; + vertices[index + 3] = point.y - perpY; + lastPoint = point; + } + this.buffers[0].update(); + } + update() { + if (this.textureScale > 0) { + this.build(); + } else { + this.updateVertices(); + } + } + } + + class SimplePlane extends Mesh { + constructor(texture, verticesX, verticesY) { + const planeGeometry = new PlaneGeometry(texture.width, texture.height, verticesX, verticesY); + const meshMaterial = new MeshMaterial(Texture.WHITE); + super(planeGeometry, meshMaterial); + this.texture = texture; + this.autoResize = true; + } + textureUpdated() { + this._textureID = this.shader.texture._updateID; + const geometry = this.geometry; + const { width, height } = this.shader.texture; + if (this.autoResize && (geometry.width !== width || geometry.height !== height)) { + geometry.width = this.shader.texture.width; + geometry.height = this.shader.texture.height; + geometry.build(); + } + } + set texture(value) { + if (this.shader.texture === value) { + return; + } + this.shader.texture = value; + this._textureID = -1; + if (value.baseTexture.valid) { + this.textureUpdated(); + } else { + value.once("update", this.textureUpdated, this); + } + } + get texture() { + return this.shader.texture; + } + _render(renderer) { + if (this._textureID !== this.shader.texture._updateID) { + this.textureUpdated(); + } + super._render(renderer); + } + destroy(options) { + this.shader.texture.off("update", this.textureUpdated, this); + super.destroy(options); + } + } + + const DEFAULT_BORDER_SIZE = 10; + class NineSlicePlane extends SimplePlane { + constructor(texture, leftWidth, topHeight, rightWidth, bottomHeight) { + super(Texture.WHITE, 4, 4); + this._origWidth = texture.orig.width; + this._origHeight = texture.orig.height; + this._width = this._origWidth; + this._height = this._origHeight; + this._leftWidth = leftWidth ?? texture.defaultBorders?.left ?? DEFAULT_BORDER_SIZE; + this._rightWidth = rightWidth ?? texture.defaultBorders?.right ?? DEFAULT_BORDER_SIZE; + this._topHeight = topHeight ?? texture.defaultBorders?.top ?? DEFAULT_BORDER_SIZE; + this._bottomHeight = bottomHeight ?? texture.defaultBorders?.bottom ?? DEFAULT_BORDER_SIZE; + this.texture = texture; + } + textureUpdated() { + this._textureID = this.shader.texture._updateID; + this._refresh(); + } + get vertices() { + return this.geometry.getBuffer("aVertexPosition").data; + } + set vertices(value) { + this.geometry.getBuffer("aVertexPosition").data = value; + } + updateHorizontalVertices() { + const vertices = this.vertices; + const scale = this._getMinScale(); + vertices[9] = vertices[11] = vertices[13] = vertices[15] = this._topHeight * scale; + vertices[17] = vertices[19] = vertices[21] = vertices[23] = this._height - this._bottomHeight * scale; + vertices[25] = vertices[27] = vertices[29] = vertices[31] = this._height; + } + updateVerticalVertices() { + const vertices = this.vertices; + const scale = this._getMinScale(); + vertices[2] = vertices[10] = vertices[18] = vertices[26] = this._leftWidth * scale; + vertices[4] = vertices[12] = vertices[20] = vertices[28] = this._width - this._rightWidth * scale; + vertices[6] = vertices[14] = vertices[22] = vertices[30] = this._width; + } + _getMinScale() { + const w = this._leftWidth + this._rightWidth; + const scaleW = this._width > w ? 1 : this._width / w; + const h = this._topHeight + this._bottomHeight; + const scaleH = this._height > h ? 1 : this._height / h; + const scale = Math.min(scaleW, scaleH); + return scale; + } + get width() { + return this._width; + } + set width(value) { + this._width = value; + this._refresh(); + } + get height() { + return this._height; + } + set height(value) { + this._height = value; + this._refresh(); + } + get leftWidth() { + return this._leftWidth; + } + set leftWidth(value) { + this._leftWidth = value; + this._refresh(); + } + get rightWidth() { + return this._rightWidth; + } + set rightWidth(value) { + this._rightWidth = value; + this._refresh(); + } + get topHeight() { + return this._topHeight; + } + set topHeight(value) { + this._topHeight = value; + this._refresh(); + } + get bottomHeight() { + return this._bottomHeight; + } + set bottomHeight(value) { + this._bottomHeight = value; + this._refresh(); + } + _refresh() { + const texture = this.texture; + const uvs = this.geometry.buffers[1].data; + this._origWidth = texture.orig.width; + this._origHeight = texture.orig.height; + const _uvw = 1 / this._origWidth; + const _uvh = 1 / this._origHeight; + uvs[0] = uvs[8] = uvs[16] = uvs[24] = 0; + uvs[1] = uvs[3] = uvs[5] = uvs[7] = 0; + uvs[6] = uvs[14] = uvs[22] = uvs[30] = 1; + uvs[25] = uvs[27] = uvs[29] = uvs[31] = 1; + uvs[2] = uvs[10] = uvs[18] = uvs[26] = _uvw * this._leftWidth; + uvs[4] = uvs[12] = uvs[20] = uvs[28] = 1 - _uvw * this._rightWidth; + uvs[9] = uvs[11] = uvs[13] = uvs[15] = _uvh * this._topHeight; + uvs[17] = uvs[19] = uvs[21] = uvs[23] = 1 - _uvh * this._bottomHeight; + this.updateHorizontalVertices(); + this.updateVerticalVertices(); + this.geometry.buffers[0].update(); + this.geometry.buffers[1].update(); + } + } + + class SimpleMesh extends Mesh { + constructor(texture = Texture.EMPTY, vertices, uvs, indices, drawMode) { + const geometry = new MeshGeometry(vertices, uvs, indices); + geometry.getBuffer("aVertexPosition").static = false; + const meshMaterial = new MeshMaterial(texture); + super(geometry, meshMaterial, null, drawMode); + this.autoUpdate = true; + } + get vertices() { + return this.geometry.getBuffer("aVertexPosition").data; + } + set vertices(value) { + this.geometry.getBuffer("aVertexPosition").data = value; + } + _render(renderer) { + if (this.autoUpdate) { + this.geometry.getBuffer("aVertexPosition").update(); + } + super._render(renderer); + } + } + + class SimpleRope extends Mesh { + constructor(texture, points, textureScale = 0) { + const ropeGeometry = new RopeGeometry(texture.height, points, textureScale); + const meshMaterial = new MeshMaterial(texture); + if (textureScale > 0) { + texture.baseTexture.wrapMode = WRAP_MODES.REPEAT; + } + super(ropeGeometry, meshMaterial); + this.autoUpdate = true; + } + _render(renderer) { + const geometry = this.geometry; + if (this.autoUpdate || geometry._width !== this.shader.texture.height) { + geometry._width = this.shader.texture.height; + geometry.update(); + } + super._render(renderer); + } + } + + class ParticleContainer extends Container { + constructor(maxSize = 1500, properties, batchSize = 16384, autoResize = false) { + super(); + const maxBatchSize = 16384; + if (batchSize > maxBatchSize) { + batchSize = maxBatchSize; + } + this._properties = [false, true, false, false, false]; + this._maxSize = maxSize; + this._batchSize = batchSize; + this._buffers = null; + this._bufferUpdateIDs = []; + this._updateID = 0; + this.interactiveChildren = false; + this.blendMode = BLEND_MODES.NORMAL; + this.autoResize = autoResize; + this.roundPixels = true; + this.baseTexture = null; + this.setProperties(properties); + this._tintColor = new Color(0); + this.tintRgb = new Float32Array(3); + this.tint = 16777215; + } + setProperties(properties) { + if (properties) { + this._properties[0] = "vertices" in properties || "scale" in properties ? !!properties.vertices || !!properties.scale : this._properties[0]; + this._properties[1] = "position" in properties ? !!properties.position : this._properties[1]; + this._properties[2] = "rotation" in properties ? !!properties.rotation : this._properties[2]; + this._properties[3] = "uvs" in properties ? !!properties.uvs : this._properties[3]; + this._properties[4] = "tint" in properties || "alpha" in properties ? !!properties.tint || !!properties.alpha : this._properties[4]; + } + } + updateTransform() { + this.displayObjectUpdateTransform(); + } + get tint() { + return this._tintColor.value; + } + set tint(value) { + this._tintColor.setValue(value); + this._tintColor.toRgbArray(this.tintRgb); + } + render(renderer) { + if (!this.visible || this.worldAlpha <= 0 || !this.children.length || !this.renderable) { + return; + } + if (!this.baseTexture) { + this.baseTexture = this.children[0]._texture.baseTexture; + if (!this.baseTexture.valid) { + this.baseTexture.once("update", () => this.onChildrenChange(0)); + } + } + renderer.batch.setObjectRenderer(renderer.plugins.particle); + renderer.plugins.particle.render(this); + } + onChildrenChange(smallestChildIndex) { + const bufferIndex = Math.floor(smallestChildIndex / this._batchSize); + while (this._bufferUpdateIDs.length < bufferIndex) { + this._bufferUpdateIDs.push(0); + } + this._bufferUpdateIDs[bufferIndex] = ++this._updateID; + } + dispose() { + if (this._buffers) { + for (let i = 0; i < this._buffers.length; ++i) { + this._buffers[i].destroy(); + } + this._buffers = null; + } + } + destroy(options) { + super.destroy(options); + this.dispose(); + this._properties = null; + this._buffers = null; + this._bufferUpdateIDs = null; + } + } + + class ParticleBuffer { + constructor(properties, dynamicPropertyFlags, size) { + this.geometry = new Geometry(); + this.indexBuffer = null; + this.size = size; + this.dynamicProperties = []; + this.staticProperties = []; + for (let i = 0; i < properties.length; ++i) { + let property = properties[i]; + property = { + attributeName: property.attributeName, + size: property.size, + uploadFunction: property.uploadFunction, + type: property.type || TYPES.FLOAT, + offset: property.offset + }; + if (dynamicPropertyFlags[i]) { + this.dynamicProperties.push(property); + } else { + this.staticProperties.push(property); + } + } + this.staticStride = 0; + this.staticBuffer = null; + this.staticData = null; + this.staticDataUint32 = null; + this.dynamicStride = 0; + this.dynamicBuffer = null; + this.dynamicData = null; + this.dynamicDataUint32 = null; + this._updateID = 0; + this.initBuffers(); + } + initBuffers() { + const geometry = this.geometry; + let dynamicOffset = 0; + this.indexBuffer = new Buffer(createIndicesForQuads(this.size), true, true); + geometry.addIndex(this.indexBuffer); + this.dynamicStride = 0; + for (let i = 0; i < this.dynamicProperties.length; ++i) { + const property = this.dynamicProperties[i]; + property.offset = dynamicOffset; + dynamicOffset += property.size; + this.dynamicStride += property.size; + } + const dynBuffer = new ArrayBuffer(this.size * this.dynamicStride * 4 * 4); + this.dynamicData = new Float32Array(dynBuffer); + this.dynamicDataUint32 = new Uint32Array(dynBuffer); + this.dynamicBuffer = new Buffer(this.dynamicData, false, false); + let staticOffset = 0; + this.staticStride = 0; + for (let i = 0; i < this.staticProperties.length; ++i) { + const property = this.staticProperties[i]; + property.offset = staticOffset; + staticOffset += property.size; + this.staticStride += property.size; + } + const statBuffer = new ArrayBuffer(this.size * this.staticStride * 4 * 4); + this.staticData = new Float32Array(statBuffer); + this.staticDataUint32 = new Uint32Array(statBuffer); + this.staticBuffer = new Buffer(this.staticData, true, false); + for (let i = 0; i < this.dynamicProperties.length; ++i) { + const property = this.dynamicProperties[i]; + geometry.addAttribute(property.attributeName, this.dynamicBuffer, 0, property.type === TYPES.UNSIGNED_BYTE, property.type, this.dynamicStride * 4, property.offset * 4); + } + for (let i = 0; i < this.staticProperties.length; ++i) { + const property = this.staticProperties[i]; + geometry.addAttribute(property.attributeName, this.staticBuffer, 0, property.type === TYPES.UNSIGNED_BYTE, property.type, this.staticStride * 4, property.offset * 4); + } + } + uploadDynamic(children, startIndex, amount) { + for (let i = 0; i < this.dynamicProperties.length; i++) { + const property = this.dynamicProperties[i]; + property.uploadFunction(children, startIndex, amount, property.type === TYPES.UNSIGNED_BYTE ? this.dynamicDataUint32 : this.dynamicData, this.dynamicStride, property.offset); + } + this.dynamicBuffer._updateID++; + } + uploadStatic(children, startIndex, amount) { + for (let i = 0; i < this.staticProperties.length; i++) { + const property = this.staticProperties[i]; + property.uploadFunction(children, startIndex, amount, property.type === TYPES.UNSIGNED_BYTE ? this.staticDataUint32 : this.staticData, this.staticStride, property.offset); + } + this.staticBuffer._updateID++; + } + destroy() { + this.indexBuffer = null; + this.dynamicProperties = null; + this.dynamicBuffer = null; + this.dynamicData = null; + this.dynamicDataUint32 = null; + this.staticProperties = null; + this.staticBuffer = null; + this.staticData = null; + this.staticDataUint32 = null; + this.geometry.destroy(); + } + } + + var fragment = "varying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform sampler2D uSampler;\n\nvoid main(void){\n vec4 color = texture2D(uSampler, vTextureCoord) * vColor;\n gl_FragColor = color;\n}"; + + var vertex = "attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\n\nattribute vec2 aPositionCoord;\nattribute float aRotation;\n\nuniform mat3 translationMatrix;\nuniform vec4 uColor;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nvoid main(void){\n float x = (aVertexPosition.x) * cos(aRotation) - (aVertexPosition.y) * sin(aRotation);\n float y = (aVertexPosition.x) * sin(aRotation) + (aVertexPosition.y) * cos(aRotation);\n\n vec2 v = vec2(x, y);\n v = v + aPositionCoord;\n\n gl_Position = vec4((translationMatrix * vec3(v, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = aTextureCoord;\n vColor = aColor * uColor;\n}\n"; + + class ParticleRenderer extends ObjectRenderer { + constructor(renderer) { + super(renderer); + this.shader = null; + this.properties = null; + this.tempMatrix = new Matrix(); + this.properties = [ + { + attributeName: "aVertexPosition", + size: 2, + uploadFunction: this.uploadVertices, + offset: 0 + }, + { + attributeName: "aPositionCoord", + size: 2, + uploadFunction: this.uploadPosition, + offset: 0 + }, + { + attributeName: "aRotation", + size: 1, + uploadFunction: this.uploadRotation, + offset: 0 + }, + { + attributeName: "aTextureCoord", + size: 2, + uploadFunction: this.uploadUvs, + offset: 0 + }, + { + attributeName: "aColor", + size: 1, + type: TYPES.UNSIGNED_BYTE, + uploadFunction: this.uploadTint, + offset: 0 + } + ]; + this.shader = Shader.from(vertex, fragment, {}); + this.state = State.for2d(); + } + render(container) { + const children = container.children; + const maxSize = container._maxSize; + const batchSize = container._batchSize; + const renderer = this.renderer; + let totalChildren = children.length; + if (totalChildren === 0) { + return; + } else if (totalChildren > maxSize && !container.autoResize) { + totalChildren = maxSize; + } + let buffers = container._buffers; + if (!buffers) { + buffers = container._buffers = this.generateBuffers(container); + } + const baseTexture = children[0]._texture.baseTexture; + const premultiplied = baseTexture.alphaMode > 0; + this.state.blendMode = correctBlendMode(container.blendMode, premultiplied); + renderer.state.set(this.state); + const gl = renderer.gl; + const m = container.worldTransform.copyTo(this.tempMatrix); + m.prepend(renderer.globalUniforms.uniforms.projectionMatrix); + this.shader.uniforms.translationMatrix = m.toArray(true); + this.shader.uniforms.uColor = Color.shared.setValue(container.tintRgb).premultiply(container.worldAlpha, premultiplied).toArray(this.shader.uniforms.uColor); + this.shader.uniforms.uSampler = baseTexture; + this.renderer.shader.bind(this.shader); + let updateStatic = false; + for (let i = 0, j = 0; i < totalChildren; i += batchSize, j += 1) { + let amount = totalChildren - i; + if (amount > batchSize) { + amount = batchSize; + } + if (j >= buffers.length) { + buffers.push(this._generateOneMoreBuffer(container)); + } + const buffer = buffers[j]; + buffer.uploadDynamic(children, i, amount); + const bid = container._bufferUpdateIDs[j] || 0; + updateStatic = updateStatic || buffer._updateID < bid; + if (updateStatic) { + buffer._updateID = container._updateID; + buffer.uploadStatic(children, i, amount); + } + renderer.geometry.bind(buffer.geometry); + gl.drawElements(gl.TRIANGLES, amount * 6, gl.UNSIGNED_SHORT, 0); + } + } + generateBuffers(container) { + const buffers = []; + const size = container._maxSize; + const batchSize = container._batchSize; + const dynamicPropertyFlags = container._properties; + for (let i = 0; i < size; i += batchSize) { + buffers.push(new ParticleBuffer(this.properties, dynamicPropertyFlags, batchSize)); + } + return buffers; + } + _generateOneMoreBuffer(container) { + const batchSize = container._batchSize; + const dynamicPropertyFlags = container._properties; + return new ParticleBuffer(this.properties, dynamicPropertyFlags, batchSize); + } + uploadVertices(children, startIndex, amount, array, stride, offset) { + let w0 = 0; + let w1 = 0; + let h0 = 0; + let h1 = 0; + for (let i = 0; i < amount; ++i) { + const sprite = children[startIndex + i]; + const texture = sprite._texture; + const sx = sprite.scale.x; + const sy = sprite.scale.y; + const trim = texture.trim; + const orig = texture.orig; + if (trim) { + w1 = trim.x - sprite.anchor.x * orig.width; + w0 = w1 + trim.width; + h1 = trim.y - sprite.anchor.y * orig.height; + h0 = h1 + trim.height; + } else { + w0 = orig.width * (1 - sprite.anchor.x); + w1 = orig.width * -sprite.anchor.x; + h0 = orig.height * (1 - sprite.anchor.y); + h1 = orig.height * -sprite.anchor.y; + } + array[offset] = w1 * sx; + array[offset + 1] = h1 * sy; + array[offset + stride] = w0 * sx; + array[offset + stride + 1] = h1 * sy; + array[offset + stride * 2] = w0 * sx; + array[offset + stride * 2 + 1] = h0 * sy; + array[offset + stride * 3] = w1 * sx; + array[offset + stride * 3 + 1] = h0 * sy; + offset += stride * 4; + } + } + uploadPosition(children, startIndex, amount, array, stride, offset) { + for (let i = 0; i < amount; i++) { + const spritePosition = children[startIndex + i].position; + array[offset] = spritePosition.x; + array[offset + 1] = spritePosition.y; + array[offset + stride] = spritePosition.x; + array[offset + stride + 1] = spritePosition.y; + array[offset + stride * 2] = spritePosition.x; + array[offset + stride * 2 + 1] = spritePosition.y; + array[offset + stride * 3] = spritePosition.x; + array[offset + stride * 3 + 1] = spritePosition.y; + offset += stride * 4; + } + } + uploadRotation(children, startIndex, amount, array, stride, offset) { + for (let i = 0; i < amount; i++) { + const spriteRotation = children[startIndex + i].rotation; + array[offset] = spriteRotation; + array[offset + stride] = spriteRotation; + array[offset + stride * 2] = spriteRotation; + array[offset + stride * 3] = spriteRotation; + offset += stride * 4; + } + } + uploadUvs(children, startIndex, amount, array, stride, offset) { + for (let i = 0; i < amount; ++i) { + const textureUvs = children[startIndex + i]._texture._uvs; + if (textureUvs) { + array[offset] = textureUvs.x0; + array[offset + 1] = textureUvs.y0; + array[offset + stride] = textureUvs.x1; + array[offset + stride + 1] = textureUvs.y1; + array[offset + stride * 2] = textureUvs.x2; + array[offset + stride * 2 + 1] = textureUvs.y2; + array[offset + stride * 3] = textureUvs.x3; + array[offset + stride * 3 + 1] = textureUvs.y3; + offset += stride * 4; + } else { + array[offset] = 0; + array[offset + 1] = 0; + array[offset + stride] = 0; + array[offset + stride + 1] = 0; + array[offset + stride * 2] = 0; + array[offset + stride * 2 + 1] = 0; + array[offset + stride * 3] = 0; + array[offset + stride * 3 + 1] = 0; + offset += stride * 4; + } + } + } + uploadTint(children, startIndex, amount, array, stride, offset) { + for (let i = 0; i < amount; ++i) { + const sprite = children[startIndex + i]; + const result = Color.shared.setValue(sprite._tintRGB).toPremultiplied(sprite.alpha); + array[offset] = result; + array[offset + stride] = result; + array[offset + stride * 2] = result; + array[offset + stride * 3] = result; + offset += stride * 4; + } + } + destroy() { + super.destroy(); + if (this.shader) { + this.shader.destroy(); + this.shader = null; + } + this.tempMatrix = null; + } + } + ParticleRenderer.extension = { + name: "particle", + type: ExtensionType.RendererPlugin + }; + extensions$1.add(ParticleRenderer); + + var TEXT_GRADIENT = /* @__PURE__ */ ((TEXT_GRADIENT2) => { + TEXT_GRADIENT2[TEXT_GRADIENT2["LINEAR_VERTICAL"] = 0] = "LINEAR_VERTICAL"; + TEXT_GRADIENT2[TEXT_GRADIENT2["LINEAR_HORIZONTAL"] = 1] = "LINEAR_HORIZONTAL"; + return TEXT_GRADIENT2; + })(TEXT_GRADIENT || {}); + + const contextSettings = { + willReadFrequently: true + }; + const _TextMetrics = class { + static get experimentalLetterSpacingSupported() { + let result = _TextMetrics._experimentalLetterSpacingSupported; + if (result !== void 0) { + const proto = settings.ADAPTER.getCanvasRenderingContext2D().prototype; + result = _TextMetrics._experimentalLetterSpacingSupported = "letterSpacing" in proto || "textLetterSpacing" in proto; + } + return result; + } + constructor(text, style, width, height, lines, lineWidths, lineHeight, maxLineWidth, fontProperties) { + this.text = text; + this.style = style; + this.width = width; + this.height = height; + this.lines = lines; + this.lineWidths = lineWidths; + this.lineHeight = lineHeight; + this.maxLineWidth = maxLineWidth; + this.fontProperties = fontProperties; + } + static measureText(text, style, wordWrap, canvas = _TextMetrics._canvas) { + wordWrap = wordWrap === void 0 || wordWrap === null ? style.wordWrap : wordWrap; + const font = style.toFontString(); + const fontProperties = _TextMetrics.measureFont(font); + if (fontProperties.fontSize === 0) { + fontProperties.fontSize = style.fontSize; + fontProperties.ascent = style.fontSize; + } + const context = canvas.getContext("2d", contextSettings); + context.font = font; + const outputText = wordWrap ? _TextMetrics.wordWrap(text, style, canvas) : text; + const lines = outputText.split(/(?:\r\n|\r|\n)/); + const lineWidths = new Array(lines.length); + let maxLineWidth = 0; + for (let i = 0; i < lines.length; i++) { + const lineWidth = _TextMetrics._measureText(lines[i], style.letterSpacing, context); + lineWidths[i] = lineWidth; + maxLineWidth = Math.max(maxLineWidth, lineWidth); + } + let width = maxLineWidth + style.strokeThickness; + if (style.dropShadow) { + width += style.dropShadowDistance; + } + const lineHeight = style.lineHeight || fontProperties.fontSize + style.strokeThickness; + let height = Math.max(lineHeight, fontProperties.fontSize + style.strokeThickness * 2) + (lines.length - 1) * (lineHeight + style.leading); + if (style.dropShadow) { + height += style.dropShadowDistance; + } + return new _TextMetrics(text, style, width, height, lines, lineWidths, lineHeight + style.leading, maxLineWidth, fontProperties); + } + static _measureText(text, letterSpacing, context) { + let useExperimentalLetterSpacing = false; + if (_TextMetrics.experimentalLetterSpacingSupported) { + if (_TextMetrics.experimentalLetterSpacing) { + context.letterSpacing = `${letterSpacing}px`; + context.textLetterSpacing = `${letterSpacing}px`; + useExperimentalLetterSpacing = true; + } else { + context.letterSpacing = "0px"; + context.textLetterSpacing = "0px"; + } + } + let width = context.measureText(text).width; + if (width > 0) { + if (useExperimentalLetterSpacing) { + width -= letterSpacing; + } else { + width += (_TextMetrics.graphemeSegmenter(text).length - 1) * letterSpacing; + } + } + return width; + } + static wordWrap(text, style, canvas = _TextMetrics._canvas) { + const context = canvas.getContext("2d", contextSettings); + let width = 0; + let line = ""; + let lines = ""; + const cache = /* @__PURE__ */ Object.create(null); + const { letterSpacing, whiteSpace } = style; + const collapseSpaces = _TextMetrics.collapseSpaces(whiteSpace); + const collapseNewlines = _TextMetrics.collapseNewlines(whiteSpace); + let canPrependSpaces = !collapseSpaces; + const wordWrapWidth = style.wordWrapWidth + letterSpacing; + const tokens = _TextMetrics.tokenize(text); + for (let i = 0; i < tokens.length; i++) { + let token = tokens[i]; + if (_TextMetrics.isNewline(token)) { + if (!collapseNewlines) { + lines += _TextMetrics.addLine(line); + canPrependSpaces = !collapseSpaces; + line = ""; + width = 0; + continue; + } + token = " "; + } + if (collapseSpaces) { + const currIsBreakingSpace = _TextMetrics.isBreakingSpace(token); + const lastIsBreakingSpace = _TextMetrics.isBreakingSpace(line[line.length - 1]); + if (currIsBreakingSpace && lastIsBreakingSpace) { + continue; + } + } + const tokenWidth = _TextMetrics.getFromCache(token, letterSpacing, cache, context); + if (tokenWidth > wordWrapWidth) { + if (line !== "") { + lines += _TextMetrics.addLine(line); + line = ""; + width = 0; + } + if (_TextMetrics.canBreakWords(token, style.breakWords)) { + const characters = _TextMetrics.wordWrapSplit(token); + for (let j = 0; j < characters.length; j++) { + let char = characters[j]; + let lastChar = char; + let k = 1; + while (characters[j + k]) { + const nextChar = characters[j + k]; + if (!_TextMetrics.canBreakChars(lastChar, nextChar, token, j, style.breakWords)) { + char += nextChar; + } else { + break; + } + lastChar = nextChar; + k++; + } + j += k - 1; + const characterWidth = _TextMetrics.getFromCache(char, letterSpacing, cache, context); + if (characterWidth + width > wordWrapWidth) { + lines += _TextMetrics.addLine(line); + canPrependSpaces = false; + line = ""; + width = 0; + } + line += char; + width += characterWidth; + } + } else { + if (line.length > 0) { + lines += _TextMetrics.addLine(line); + line = ""; + width = 0; + } + const isLastToken = i === tokens.length - 1; + lines += _TextMetrics.addLine(token, !isLastToken); + canPrependSpaces = false; + line = ""; + width = 0; + } + } else { + if (tokenWidth + width > wordWrapWidth) { + canPrependSpaces = false; + lines += _TextMetrics.addLine(line); + line = ""; + width = 0; + } + if (line.length > 0 || !_TextMetrics.isBreakingSpace(token) || canPrependSpaces) { + line += token; + width += tokenWidth; + } + } + } + lines += _TextMetrics.addLine(line, false); + return lines; + } + static addLine(line, newLine = true) { + line = _TextMetrics.trimRight(line); + line = newLine ? `${line} +` : line; + return line; + } + static getFromCache(key, letterSpacing, cache, context) { + let width = cache[key]; + if (typeof width !== "number") { + width = _TextMetrics._measureText(key, letterSpacing, context) + letterSpacing; + cache[key] = width; + } + return width; + } + static collapseSpaces(whiteSpace) { + return whiteSpace === "normal" || whiteSpace === "pre-line"; + } + static collapseNewlines(whiteSpace) { + return whiteSpace === "normal"; + } + static trimRight(text) { + if (typeof text !== "string") { + return ""; + } + for (let i = text.length - 1; i >= 0; i--) { + const char = text[i]; + if (!_TextMetrics.isBreakingSpace(char)) { + break; + } + text = text.slice(0, -1); + } + return text; + } + static isNewline(char) { + if (typeof char !== "string") { + return false; + } + return _TextMetrics._newlines.includes(char.charCodeAt(0)); + } + static isBreakingSpace(char, _nextChar) { + if (typeof char !== "string") { + return false; + } + return _TextMetrics._breakingSpaces.includes(char.charCodeAt(0)); + } + static tokenize(text) { + const tokens = []; + let token = ""; + if (typeof text !== "string") { + return tokens; + } + for (let i = 0; i < text.length; i++) { + const char = text[i]; + const nextChar = text[i + 1]; + if (_TextMetrics.isBreakingSpace(char, nextChar) || _TextMetrics.isNewline(char)) { + if (token !== "") { + tokens.push(token); + token = ""; + } + tokens.push(char); + continue; + } + token += char; + } + if (token !== "") { + tokens.push(token); + } + return tokens; + } + static canBreakWords(_token, breakWords) { + return breakWords; + } + static canBreakChars(_char, _nextChar, _token, _index, _breakWords) { + return true; + } + static wordWrapSplit(token) { + return _TextMetrics.graphemeSegmenter(token); + } + static measureFont(font) { + if (_TextMetrics._fonts[font]) { + return _TextMetrics._fonts[font]; + } + const properties = { + ascent: 0, + descent: 0, + fontSize: 0 + }; + const canvas = _TextMetrics._canvas; + const context = _TextMetrics._context; + context.font = font; + const metricsString = _TextMetrics.METRICS_STRING + _TextMetrics.BASELINE_SYMBOL; + const width = Math.ceil(context.measureText(metricsString).width); + let baseline = Math.ceil(context.measureText(_TextMetrics.BASELINE_SYMBOL).width); + const height = Math.ceil(_TextMetrics.HEIGHT_MULTIPLIER * baseline); + baseline = baseline * _TextMetrics.BASELINE_MULTIPLIER | 0; + if (width === 0 || height === 0) { + _TextMetrics._fonts[font] = properties; + return properties; + } + canvas.width = width; + canvas.height = height; + context.fillStyle = "#f00"; + context.fillRect(0, 0, width, height); + context.font = font; + context.textBaseline = "alphabetic"; + context.fillStyle = "#000"; + context.fillText(metricsString, 0, baseline); + const imagedata = context.getImageData(0, 0, width, height).data; + const pixels = imagedata.length; + const line = width * 4; + let i = 0; + let idx = 0; + let stop = false; + for (i = 0; i < baseline; ++i) { + for (let j = 0; j < line; j += 4) { + if (imagedata[idx + j] !== 255) { + stop = true; + break; + } + } + if (!stop) { + idx += line; + } else { + break; + } + } + properties.ascent = baseline - i; + idx = pixels - line; + stop = false; + for (i = height; i > baseline; --i) { + for (let j = 0; j < line; j += 4) { + if (imagedata[idx + j] !== 255) { + stop = true; + break; + } + } + if (!stop) { + idx -= line; + } else { + break; + } + } + properties.descent = i - baseline; + properties.fontSize = properties.ascent + properties.descent; + _TextMetrics._fonts[font] = properties; + return properties; + } + static clearMetrics(font = "") { + if (font) { + delete _TextMetrics._fonts[font]; + } else { + _TextMetrics._fonts = {}; + } + } + static get _canvas() { + if (!_TextMetrics.__canvas) { + let canvas; + try { + const c = new OffscreenCanvas(0, 0); + const context = c.getContext("2d", contextSettings); + if (context?.measureText) { + _TextMetrics.__canvas = c; + return c; + } + canvas = settings.ADAPTER.createCanvas(); + } catch (ex) { + canvas = settings.ADAPTER.createCanvas(); + } + canvas.width = canvas.height = 10; + _TextMetrics.__canvas = canvas; + } + return _TextMetrics.__canvas; + } + static get _context() { + if (!_TextMetrics.__context) { + _TextMetrics.__context = _TextMetrics._canvas.getContext("2d", contextSettings); + } + return _TextMetrics.__context; + } + }; + let TextMetrics = _TextMetrics; + TextMetrics.METRICS_STRING = "|\xC9q\xC5"; + TextMetrics.BASELINE_SYMBOL = "M"; + TextMetrics.BASELINE_MULTIPLIER = 1.4; + TextMetrics.HEIGHT_MULTIPLIER = 2; + TextMetrics.graphemeSegmenter = (() => { + if (typeof Intl?.Segmenter === "function") { + const segmenter = new Intl.Segmenter(); + return (s) => [...segmenter.segment(s)].map((x) => x.segment); + } + return (s) => [...s]; + })(); + TextMetrics.experimentalLetterSpacing = false; + TextMetrics._fonts = {}; + TextMetrics._newlines = [ + 10, + 13 + ]; + TextMetrics._breakingSpaces = [ + 9, + 32, + 8192, + 8193, + 8194, + 8195, + 8196, + 8197, + 8198, + 8200, + 8201, + 8202, + 8287, + 12288 + ]; + + const genericFontFamilies = [ + "serif", + "sans-serif", + "monospace", + "cursive", + "fantasy", + "system-ui" + ]; + const _TextStyle = class { + constructor(style) { + this.styleID = 0; + this.reset(); + deepCopyProperties(this, style, style); + } + clone() { + const clonedProperties = {}; + deepCopyProperties(clonedProperties, this, _TextStyle.defaultStyle); + return new _TextStyle(clonedProperties); + } + reset() { + deepCopyProperties(this, _TextStyle.defaultStyle, _TextStyle.defaultStyle); + } + get align() { + return this._align; + } + set align(align) { + if (this._align !== align) { + this._align = align; + this.styleID++; + } + } + get breakWords() { + return this._breakWords; + } + set breakWords(breakWords) { + if (this._breakWords !== breakWords) { + this._breakWords = breakWords; + this.styleID++; + } + } + get dropShadow() { + return this._dropShadow; + } + set dropShadow(dropShadow) { + if (this._dropShadow !== dropShadow) { + this._dropShadow = dropShadow; + this.styleID++; + } + } + get dropShadowAlpha() { + return this._dropShadowAlpha; + } + set dropShadowAlpha(dropShadowAlpha) { + if (this._dropShadowAlpha !== dropShadowAlpha) { + this._dropShadowAlpha = dropShadowAlpha; + this.styleID++; + } + } + get dropShadowAngle() { + return this._dropShadowAngle; + } + set dropShadowAngle(dropShadowAngle) { + if (this._dropShadowAngle !== dropShadowAngle) { + this._dropShadowAngle = dropShadowAngle; + this.styleID++; + } + } + get dropShadowBlur() { + return this._dropShadowBlur; + } + set dropShadowBlur(dropShadowBlur) { + if (this._dropShadowBlur !== dropShadowBlur) { + this._dropShadowBlur = dropShadowBlur; + this.styleID++; + } + } + get dropShadowColor() { + return this._dropShadowColor; + } + set dropShadowColor(dropShadowColor) { + const outputColor = getColor(dropShadowColor); + if (this._dropShadowColor !== outputColor) { + this._dropShadowColor = outputColor; + this.styleID++; + } + } + get dropShadowDistance() { + return this._dropShadowDistance; + } + set dropShadowDistance(dropShadowDistance) { + if (this._dropShadowDistance !== dropShadowDistance) { + this._dropShadowDistance = dropShadowDistance; + this.styleID++; + } + } + get fill() { + return this._fill; + } + set fill(fill) { + const outputColor = getColor(fill); + if (this._fill !== outputColor) { + this._fill = outputColor; + this.styleID++; + } + } + get fillGradientType() { + return this._fillGradientType; + } + set fillGradientType(fillGradientType) { + if (this._fillGradientType !== fillGradientType) { + this._fillGradientType = fillGradientType; + this.styleID++; + } + } + get fillGradientStops() { + return this._fillGradientStops; + } + set fillGradientStops(fillGradientStops) { + if (!areArraysEqual(this._fillGradientStops, fillGradientStops)) { + this._fillGradientStops = fillGradientStops; + this.styleID++; + } + } + get fontFamily() { + return this._fontFamily; + } + set fontFamily(fontFamily) { + if (this.fontFamily !== fontFamily) { + this._fontFamily = fontFamily; + this.styleID++; + } + } + get fontSize() { + return this._fontSize; + } + set fontSize(fontSize) { + if (this._fontSize !== fontSize) { + this._fontSize = fontSize; + this.styleID++; + } + } + get fontStyle() { + return this._fontStyle; + } + set fontStyle(fontStyle) { + if (this._fontStyle !== fontStyle) { + this._fontStyle = fontStyle; + this.styleID++; + } + } + get fontVariant() { + return this._fontVariant; + } + set fontVariant(fontVariant) { + if (this._fontVariant !== fontVariant) { + this._fontVariant = fontVariant; + this.styleID++; + } + } + get fontWeight() { + return this._fontWeight; + } + set fontWeight(fontWeight) { + if (this._fontWeight !== fontWeight) { + this._fontWeight = fontWeight; + this.styleID++; + } + } + get letterSpacing() { + return this._letterSpacing; + } + set letterSpacing(letterSpacing) { + if (this._letterSpacing !== letterSpacing) { + this._letterSpacing = letterSpacing; + this.styleID++; + } + } + get lineHeight() { + return this._lineHeight; + } + set lineHeight(lineHeight) { + if (this._lineHeight !== lineHeight) { + this._lineHeight = lineHeight; + this.styleID++; + } + } + get leading() { + return this._leading; + } + set leading(leading) { + if (this._leading !== leading) { + this._leading = leading; + this.styleID++; + } + } + get lineJoin() { + return this._lineJoin; + } + set lineJoin(lineJoin) { + if (this._lineJoin !== lineJoin) { + this._lineJoin = lineJoin; + this.styleID++; + } + } + get miterLimit() { + return this._miterLimit; + } + set miterLimit(miterLimit) { + if (this._miterLimit !== miterLimit) { + this._miterLimit = miterLimit; + this.styleID++; + } + } + get padding() { + return this._padding; + } + set padding(padding) { + if (this._padding !== padding) { + this._padding = padding; + this.styleID++; + } + } + get stroke() { + return this._stroke; + } + set stroke(stroke) { + const outputColor = getColor(stroke); + if (this._stroke !== outputColor) { + this._stroke = outputColor; + this.styleID++; + } + } + get strokeThickness() { + return this._strokeThickness; + } + set strokeThickness(strokeThickness) { + if (this._strokeThickness !== strokeThickness) { + this._strokeThickness = strokeThickness; + this.styleID++; + } + } + get textBaseline() { + return this._textBaseline; + } + set textBaseline(textBaseline) { + if (this._textBaseline !== textBaseline) { + this._textBaseline = textBaseline; + this.styleID++; + } + } + get trim() { + return this._trim; + } + set trim(trim) { + if (this._trim !== trim) { + this._trim = trim; + this.styleID++; + } + } + get whiteSpace() { + return this._whiteSpace; + } + set whiteSpace(whiteSpace) { + if (this._whiteSpace !== whiteSpace) { + this._whiteSpace = whiteSpace; + this.styleID++; + } + } + get wordWrap() { + return this._wordWrap; + } + set wordWrap(wordWrap) { + if (this._wordWrap !== wordWrap) { + this._wordWrap = wordWrap; + this.styleID++; + } + } + get wordWrapWidth() { + return this._wordWrapWidth; + } + set wordWrapWidth(wordWrapWidth) { + if (this._wordWrapWidth !== wordWrapWidth) { + this._wordWrapWidth = wordWrapWidth; + this.styleID++; + } + } + toFontString() { + const fontSizeString = typeof this.fontSize === "number" ? `${this.fontSize}px` : this.fontSize; + let fontFamilies = this.fontFamily; + if (!Array.isArray(this.fontFamily)) { + fontFamilies = this.fontFamily.split(","); + } + for (let i = fontFamilies.length - 1; i >= 0; i--) { + let fontFamily = fontFamilies[i].trim(); + if (!/([\"\'])[^\'\"]+\1/.test(fontFamily) && !genericFontFamilies.includes(fontFamily)) { + fontFamily = `"${fontFamily}"`; + } + fontFamilies[i] = fontFamily; + } + return `${this.fontStyle} ${this.fontVariant} ${this.fontWeight} ${fontSizeString} ${fontFamilies.join(",")}`; + } + }; + let TextStyle = _TextStyle; + TextStyle.defaultStyle = { + align: "left", + breakWords: false, + dropShadow: false, + dropShadowAlpha: 1, + dropShadowAngle: Math.PI / 6, + dropShadowBlur: 0, + dropShadowColor: "black", + dropShadowDistance: 5, + fill: "black", + fillGradientType: TEXT_GRADIENT.LINEAR_VERTICAL, + fillGradientStops: [], + fontFamily: "Arial", + fontSize: 26, + fontStyle: "normal", + fontVariant: "normal", + fontWeight: "normal", + leading: 0, + letterSpacing: 0, + lineHeight: 0, + lineJoin: "miter", + miterLimit: 10, + padding: 0, + stroke: "black", + strokeThickness: 0, + textBaseline: "alphabetic", + trim: false, + whiteSpace: "pre", + wordWrap: false, + wordWrapWidth: 100 + }; + function getColor(color) { + const temp = Color.shared; + if (!Array.isArray(color)) { + return temp.setValue(color).toHex(); + } else { + return color.map((c) => temp.setValue(c).toHex()); + } + } + function areArraysEqual(array1, array2) { + if (!Array.isArray(array1) || !Array.isArray(array2)) { + return false; + } + if (array1.length !== array2.length) { + return false; + } + for (let i = 0; i < array1.length; ++i) { + if (array1[i] !== array2[i]) { + return false; + } + } + return true; + } + function deepCopyProperties(target, source, propertyObj) { + for (const prop in propertyObj) { + if (Array.isArray(source[prop])) { + target[prop] = source[prop].slice(); + } else { + target[prop] = source[prop]; + } + } + } + + const defaultDestroyOptions = { + texture: true, + children: false, + baseTexture: true + }; + const _Text = class extends Sprite { + constructor(text, style, canvas) { + let ownCanvas = false; + if (!canvas) { + canvas = settings.ADAPTER.createCanvas(); + ownCanvas = true; + } + canvas.width = 3; + canvas.height = 3; + const texture = Texture.from(canvas); + texture.orig = new Rectangle(); + texture.trim = new Rectangle(); + super(texture); + this._ownCanvas = ownCanvas; + this.canvas = canvas; + this.context = canvas.getContext("2d", { + willReadFrequently: true + }); + this._resolution = _Text.defaultResolution ?? settings.RESOLUTION; + this._autoResolution = _Text.defaultAutoResolution; + this._text = null; + this._style = null; + this._styleListener = null; + this._font = ""; + this.text = text; + this.style = style; + this.localStyleID = -1; + } + static get experimentalLetterSpacing() { + return TextMetrics.experimentalLetterSpacing; + } + static set experimentalLetterSpacing(value) { + deprecation("7.1.0", "Text.experimentalLetterSpacing is deprecated, use TextMetrics.experimentalLetterSpacing"); + TextMetrics.experimentalLetterSpacing = value; + } + updateText(respectDirty) { + const style = this._style; + if (this.localStyleID !== style.styleID) { + this.dirty = true; + this.localStyleID = style.styleID; + } + if (!this.dirty && respectDirty) { + return; + } + this._font = this._style.toFontString(); + const context = this.context; + const measured = TextMetrics.measureText(this._text || " ", this._style, this._style.wordWrap, this.canvas); + const width = measured.width; + const height = measured.height; + const lines = measured.lines; + const lineHeight = measured.lineHeight; + const lineWidths = measured.lineWidths; + const maxLineWidth = measured.maxLineWidth; + const fontProperties = measured.fontProperties; + this.canvas.width = Math.ceil(Math.ceil(Math.max(1, width) + style.padding * 2) * this._resolution); + this.canvas.height = Math.ceil(Math.ceil(Math.max(1, height) + style.padding * 2) * this._resolution); + context.scale(this._resolution, this._resolution); + context.clearRect(0, 0, this.canvas.width, this.canvas.height); + context.font = this._font; + context.lineWidth = style.strokeThickness; + context.textBaseline = style.textBaseline; + context.lineJoin = style.lineJoin; + context.miterLimit = style.miterLimit; + let linePositionX; + let linePositionY; + const passesCount = style.dropShadow ? 2 : 1; + for (let i = 0; i < passesCount; ++i) { + const isShadowPass = style.dropShadow && i === 0; + const dsOffsetText = isShadowPass ? Math.ceil(Math.max(1, height) + style.padding * 2) : 0; + const dsOffsetShadow = dsOffsetText * this._resolution; + if (isShadowPass) { + context.fillStyle = "black"; + context.strokeStyle = "black"; + const dropShadowColor = style.dropShadowColor; + const dropShadowBlur = style.dropShadowBlur * this._resolution; + const dropShadowDistance = style.dropShadowDistance * this._resolution; + context.shadowColor = Color.shared.setValue(dropShadowColor).setAlpha(style.dropShadowAlpha).toRgbaString(); + context.shadowBlur = dropShadowBlur; + context.shadowOffsetX = Math.cos(style.dropShadowAngle) * dropShadowDistance; + context.shadowOffsetY = Math.sin(style.dropShadowAngle) * dropShadowDistance + dsOffsetShadow; + } else { + context.fillStyle = this._generateFillStyle(style, lines, measured); + context.strokeStyle = style.stroke; + context.shadowColor = "black"; + context.shadowBlur = 0; + context.shadowOffsetX = 0; + context.shadowOffsetY = 0; + } + let linePositionYShift = (lineHeight - fontProperties.fontSize) / 2; + if (lineHeight - fontProperties.fontSize < 0) { + linePositionYShift = 0; + } + for (let i2 = 0; i2 < lines.length; i2++) { + linePositionX = style.strokeThickness / 2; + linePositionY = style.strokeThickness / 2 + i2 * lineHeight + fontProperties.ascent + linePositionYShift; + if (style.align === "right") { + linePositionX += maxLineWidth - lineWidths[i2]; + } else if (style.align === "center") { + linePositionX += (maxLineWidth - lineWidths[i2]) / 2; + } + if (style.stroke && style.strokeThickness) { + this.drawLetterSpacing(lines[i2], linePositionX + style.padding, linePositionY + style.padding - dsOffsetText, true); + } + if (style.fill) { + this.drawLetterSpacing(lines[i2], linePositionX + style.padding, linePositionY + style.padding - dsOffsetText); + } + } + } + this.updateTexture(); + } + drawLetterSpacing(text, x, y, isStroke = false) { + const style = this._style; + const letterSpacing = style.letterSpacing; + let useExperimentalLetterSpacing = false; + if (TextMetrics.experimentalLetterSpacingSupported) { + if (TextMetrics.experimentalLetterSpacing) { + this.context.letterSpacing = `${letterSpacing}px`; + this.context.textLetterSpacing = `${letterSpacing}px`; + useExperimentalLetterSpacing = true; + } else { + this.context.letterSpacing = "0px"; + this.context.textLetterSpacing = "0px"; + } + } + if (letterSpacing === 0 || useExperimentalLetterSpacing) { + if (isStroke) { + this.context.strokeText(text, x, y); + } else { + this.context.fillText(text, x, y); + } + return; + } + let currentPosition = x; + const stringArray = TextMetrics.graphemeSegmenter(text); + let previousWidth = this.context.measureText(text).width; + let currentWidth = 0; + for (let i = 0; i < stringArray.length; ++i) { + const currentChar = stringArray[i]; + if (isStroke) { + this.context.strokeText(currentChar, currentPosition, y); + } else { + this.context.fillText(currentChar, currentPosition, y); + } + let textStr = ""; + for (let j = i + 1; j < stringArray.length; ++j) { + textStr += stringArray[j]; + } + currentWidth = this.context.measureText(textStr).width; + currentPosition += previousWidth - currentWidth + letterSpacing; + previousWidth = currentWidth; + } + } + updateTexture() { + const canvas = this.canvas; + if (this._style.trim) { + const trimmed = trimCanvas(canvas); + if (trimmed.data) { + canvas.width = trimmed.width; + canvas.height = trimmed.height; + this.context.putImageData(trimmed.data, 0, 0); + } + } + const texture = this._texture; + const style = this._style; + const padding = style.trim ? 0 : style.padding; + const baseTexture = texture.baseTexture; + texture.trim.width = texture._frame.width = canvas.width / this._resolution; + texture.trim.height = texture._frame.height = canvas.height / this._resolution; + texture.trim.x = -padding; + texture.trim.y = -padding; + texture.orig.width = texture._frame.width - padding * 2; + texture.orig.height = texture._frame.height - padding * 2; + this._onTextureUpdate(); + baseTexture.setRealSize(canvas.width, canvas.height, this._resolution); + texture.updateUvs(); + this.dirty = false; + } + _render(renderer) { + if (this._autoResolution && this._resolution !== renderer.resolution) { + this._resolution = renderer.resolution; + this.dirty = true; + } + this.updateText(true); + super._render(renderer); + } + updateTransform() { + this.updateText(true); + super.updateTransform(); + } + getBounds(skipUpdate, rect) { + this.updateText(true); + if (this._textureID === -1) { + skipUpdate = false; + } + return super.getBounds(skipUpdate, rect); + } + getLocalBounds(rect) { + this.updateText(true); + return super.getLocalBounds.call(this, rect); + } + _calculateBounds() { + this.calculateVertices(); + this._bounds.addQuad(this.vertexData); + } + _generateFillStyle(style, lines, metrics) { + const fillStyle = style.fill; + if (!Array.isArray(fillStyle)) { + return fillStyle; + } else if (fillStyle.length === 1) { + return fillStyle[0]; + } + let gradient; + const dropShadowCorrection = style.dropShadow ? style.dropShadowDistance : 0; + const padding = style.padding || 0; + const width = this.canvas.width / this._resolution - dropShadowCorrection - padding * 2; + const height = this.canvas.height / this._resolution - dropShadowCorrection - padding * 2; + const fill = fillStyle.slice(); + const fillGradientStops = style.fillGradientStops.slice(); + if (!fillGradientStops.length) { + const lengthPlus1 = fill.length + 1; + for (let i = 1; i < lengthPlus1; ++i) { + fillGradientStops.push(i / lengthPlus1); + } + } + fill.unshift(fillStyle[0]); + fillGradientStops.unshift(0); + fill.push(fillStyle[fillStyle.length - 1]); + fillGradientStops.push(1); + if (style.fillGradientType === TEXT_GRADIENT.LINEAR_VERTICAL) { + gradient = this.context.createLinearGradient(width / 2, padding, width / 2, height + padding); + const textHeight = metrics.fontProperties.fontSize + style.strokeThickness; + for (let i = 0; i < lines.length; i++) { + const lastLineBottom = metrics.lineHeight * (i - 1) + textHeight; + const thisLineTop = metrics.lineHeight * i; + let thisLineGradientStart = thisLineTop; + if (i > 0 && lastLineBottom > thisLineTop) { + thisLineGradientStart = (thisLineTop + lastLineBottom) / 2; + } + const thisLineBottom = thisLineTop + textHeight; + const nextLineTop = metrics.lineHeight * (i + 1); + let thisLineGradientEnd = thisLineBottom; + if (i + 1 < lines.length && nextLineTop < thisLineBottom) { + thisLineGradientEnd = (thisLineBottom + nextLineTop) / 2; + } + const gradStopLineHeight = (thisLineGradientEnd - thisLineGradientStart) / height; + for (let j = 0; j < fill.length; j++) { + let lineStop = 0; + if (typeof fillGradientStops[j] === "number") { + lineStop = fillGradientStops[j]; + } else { + lineStop = j / fill.length; + } + let globalStop = Math.min(1, Math.max(0, thisLineGradientStart / height + lineStop * gradStopLineHeight)); + globalStop = Number(globalStop.toFixed(5)); + gradient.addColorStop(globalStop, fill[j]); + } + } + } else { + gradient = this.context.createLinearGradient(padding, height / 2, width + padding, height / 2); + const totalIterations = fill.length + 1; + let currentIteration = 1; + for (let i = 0; i < fill.length; i++) { + let stop; + if (typeof fillGradientStops[i] === "number") { + stop = fillGradientStops[i]; + } else { + stop = currentIteration / totalIterations; + } + gradient.addColorStop(stop, fill[i]); + currentIteration++; + } + } + return gradient; + } + destroy(options) { + if (typeof options === "boolean") { + options = { children: options }; + } + options = Object.assign({}, defaultDestroyOptions, options); + super.destroy(options); + if (this._ownCanvas) { + this.canvas.height = this.canvas.width = 0; + } + this.context = null; + this.canvas = null; + this._style = null; + } + get width() { + this.updateText(true); + return Math.abs(this.scale.x) * this._texture.orig.width; + } + set width(value) { + this.updateText(true); + const s = sign(this.scale.x) || 1; + this.scale.x = s * value / this._texture.orig.width; + this._width = value; + } + get height() { + this.updateText(true); + return Math.abs(this.scale.y) * this._texture.orig.height; + } + set height(value) { + this.updateText(true); + const s = sign(this.scale.y) || 1; + this.scale.y = s * value / this._texture.orig.height; + this._height = value; + } + get style() { + return this._style; + } + set style(style) { + style = style || {}; + if (style instanceof TextStyle) { + this._style = style; + } else { + this._style = new TextStyle(style); + } + this.localStyleID = -1; + this.dirty = true; + } + get text() { + return this._text; + } + set text(text) { + text = String(text === null || text === void 0 ? "" : text); + if (this._text === text) { + return; + } + this._text = text; + this.dirty = true; + } + get resolution() { + return this._resolution; + } + set resolution(value) { + this._autoResolution = false; + if (this._resolution === value) { + return; + } + this._resolution = value; + this.dirty = true; + } + }; + let Text = _Text; + Text.defaultAutoResolution = true; + + class CountLimiter { + constructor(maxItemsPerFrame) { + this.maxItemsPerFrame = maxItemsPerFrame; + this.itemsLeft = 0; + } + beginFrame() { + this.itemsLeft = this.maxItemsPerFrame; + } + allowedToUpload() { + return this.itemsLeft-- > 0; + } + } + + function findMultipleBaseTextures(item, queue) { + let result = false; + if (item?._textures?.length) { + for (let i = 0; i < item._textures.length; i++) { + if (item._textures[i] instanceof Texture) { + const baseTexture = item._textures[i].baseTexture; + if (!queue.includes(baseTexture)) { + queue.push(baseTexture); + result = true; + } + } + } + } + return result; + } + function findBaseTexture(item, queue) { + if (item.baseTexture instanceof BaseTexture) { + const texture = item.baseTexture; + if (!queue.includes(texture)) { + queue.push(texture); + } + return true; + } + return false; + } + function findTexture(item, queue) { + if (item._texture && item._texture instanceof Texture) { + const texture = item._texture.baseTexture; + if (!queue.includes(texture)) { + queue.push(texture); + } + return true; + } + return false; + } + function drawText(_helper, item) { + if (item instanceof Text) { + item.updateText(true); + return true; + } + return false; + } + function calculateTextStyle(_helper, item) { + if (item instanceof TextStyle) { + const font = item.toFontString(); + TextMetrics.measureFont(font); + return true; + } + return false; + } + function findText(item, queue) { + if (item instanceof Text) { + if (!queue.includes(item.style)) { + queue.push(item.style); + } + if (!queue.includes(item)) { + queue.push(item); + } + const texture = item._texture.baseTexture; + if (!queue.includes(texture)) { + queue.push(texture); + } + return true; + } + return false; + } + function findTextStyle(item, queue) { + if (item instanceof TextStyle) { + if (!queue.includes(item)) { + queue.push(item); + } + return true; + } + return false; + } + const _BasePrepare = class { + constructor(renderer) { + this.limiter = new CountLimiter(_BasePrepare.uploadsPerFrame); + this.renderer = renderer; + this.uploadHookHelper = null; + this.queue = []; + this.addHooks = []; + this.uploadHooks = []; + this.completes = []; + this.ticking = false; + this.delayedTick = () => { + if (!this.queue) { + return; + } + this.prepareItems(); + }; + this.registerFindHook(findText); + this.registerFindHook(findTextStyle); + this.registerFindHook(findMultipleBaseTextures); + this.registerFindHook(findBaseTexture); + this.registerFindHook(findTexture); + this.registerUploadHook(drawText); + this.registerUploadHook(calculateTextStyle); + } + upload(item) { + return new Promise((resolve) => { + if (item) { + this.add(item); + } + if (this.queue.length) { + this.completes.push(resolve); + if (!this.ticking) { + this.ticking = true; + Ticker.system.addOnce(this.tick, this, UPDATE_PRIORITY.UTILITY); + } + } else { + resolve(); + } + }); + } + tick() { + setTimeout(this.delayedTick, 0); + } + prepareItems() { + this.limiter.beginFrame(); + while (this.queue.length && this.limiter.allowedToUpload()) { + const item = this.queue[0]; + let uploaded = false; + if (item && !item._destroyed) { + for (let i = 0, len = this.uploadHooks.length; i < len; i++) { + if (this.uploadHooks[i](this.uploadHookHelper, item)) { + this.queue.shift(); + uploaded = true; + break; + } + } + } + if (!uploaded) { + this.queue.shift(); + } + } + if (!this.queue.length) { + this.ticking = false; + const completes = this.completes.slice(0); + this.completes.length = 0; + for (let i = 0, len = completes.length; i < len; i++) { + completes[i](); + } + } else { + Ticker.system.addOnce(this.tick, this, UPDATE_PRIORITY.UTILITY); + } + } + registerFindHook(addHook) { + if (addHook) { + this.addHooks.push(addHook); + } + return this; + } + registerUploadHook(uploadHook) { + if (uploadHook) { + this.uploadHooks.push(uploadHook); + } + return this; + } + add(item) { + for (let i = 0, len = this.addHooks.length; i < len; i++) { + if (this.addHooks[i](item, this.queue)) { + break; + } + } + if (item instanceof Container) { + for (let i = item.children.length - 1; i >= 0; i--) { + this.add(item.children[i]); + } + } + return this; + } + destroy() { + if (this.ticking) { + Ticker.system.remove(this.tick, this); + } + this.ticking = false; + this.addHooks = null; + this.uploadHooks = null; + this.renderer = null; + this.completes = null; + this.queue = null; + this.limiter = null; + this.uploadHookHelper = null; + } + }; + let BasePrepare = _BasePrepare; + BasePrepare.uploadsPerFrame = 4; + + Object.defineProperties(settings, { + UPLOADS_PER_FRAME: { + get() { + return BasePrepare.uploadsPerFrame; + }, + set(value) { + deprecation("7.1.0", "settings.UPLOADS_PER_FRAME is deprecated, use prepare.BasePrepare.uploadsPerFrame"); + BasePrepare.uploadsPerFrame = value; + } + } + }); + + function uploadBaseTextures(renderer, item) { + if (item instanceof BaseTexture) { + if (!item._glTextures[renderer.CONTEXT_UID]) { + renderer.texture.bind(item); + } + return true; + } + return false; + } + function uploadGraphics(renderer, item) { + if (!(item instanceof Graphics)) { + return false; + } + const { geometry } = item; + item.finishPoly(); + geometry.updateBatches(); + const { batches } = geometry; + for (let i = 0; i < batches.length; i++) { + const { texture } = batches[i].style; + if (texture) { + uploadBaseTextures(renderer, texture.baseTexture); + } + } + if (!geometry.batchable) { + renderer.geometry.bind(geometry, item._resolveDirectShader(renderer)); + } + return true; + } + function findGraphics(item, queue) { + if (item instanceof Graphics) { + queue.push(item); + return true; + } + return false; + } + class Prepare extends BasePrepare { + constructor(renderer) { + super(renderer); + this.uploadHookHelper = this.renderer; + this.registerFindHook(findGraphics); + this.registerUploadHook(uploadBaseTextures); + this.registerUploadHook(uploadGraphics); + } + } + Prepare.extension = { + name: "prepare", + type: ExtensionType.RendererSystem + }; + extensions$1.add(Prepare); + + class TimeLimiter { + constructor(maxMilliseconds) { + this.maxMilliseconds = maxMilliseconds; + this.frameStart = 0; + } + beginFrame() { + this.frameStart = Date.now(); + } + allowedToUpload() { + return Date.now() - this.frameStart < this.maxMilliseconds; + } + } + + class AnimatedSprite extends Sprite { + constructor(textures, autoUpdate = true) { + super(textures[0] instanceof Texture ? textures[0] : textures[0].texture); + this._textures = null; + this._durations = null; + this._autoUpdate = autoUpdate; + this._isConnectedToTicker = false; + this.animationSpeed = 1; + this.loop = true; + this.updateAnchor = false; + this.onComplete = null; + this.onFrameChange = null; + this.onLoop = null; + this._currentTime = 0; + this._playing = false; + this._previousFrame = null; + this.textures = textures; + } + stop() { + if (!this._playing) { + return; + } + this._playing = false; + if (this._autoUpdate && this._isConnectedToTicker) { + Ticker.shared.remove(this.update, this); + this._isConnectedToTicker = false; + } + } + play() { + if (this._playing) { + return; + } + this._playing = true; + if (this._autoUpdate && !this._isConnectedToTicker) { + Ticker.shared.add(this.update, this, UPDATE_PRIORITY.HIGH); + this._isConnectedToTicker = true; + } + } + gotoAndStop(frameNumber) { + this.stop(); + this.currentFrame = frameNumber; + } + gotoAndPlay(frameNumber) { + this.currentFrame = frameNumber; + this.play(); + } + update(deltaTime) { + if (!this._playing) { + return; + } + const elapsed = this.animationSpeed * deltaTime; + const previousFrame = this.currentFrame; + if (this._durations !== null) { + let lag = this._currentTime % 1 * this._durations[this.currentFrame]; + lag += elapsed / 60 * 1e3; + while (lag < 0) { + this._currentTime--; + lag += this._durations[this.currentFrame]; + } + const sign = Math.sign(this.animationSpeed * deltaTime); + this._currentTime = Math.floor(this._currentTime); + while (lag >= this._durations[this.currentFrame]) { + lag -= this._durations[this.currentFrame] * sign; + this._currentTime += sign; + } + this._currentTime += lag / this._durations[this.currentFrame]; + } else { + this._currentTime += elapsed; + } + if (this._currentTime < 0 && !this.loop) { + this.gotoAndStop(0); + if (this.onComplete) { + this.onComplete(); + } + } else if (this._currentTime >= this._textures.length && !this.loop) { + this.gotoAndStop(this._textures.length - 1); + if (this.onComplete) { + this.onComplete(); + } + } else if (previousFrame !== this.currentFrame) { + if (this.loop && this.onLoop) { + if (this.animationSpeed > 0 && this.currentFrame < previousFrame || this.animationSpeed < 0 && this.currentFrame > previousFrame) { + this.onLoop(); + } + } + this.updateTexture(); + } + } + updateTexture() { + const currentFrame = this.currentFrame; + if (this._previousFrame === currentFrame) { + return; + } + this._previousFrame = currentFrame; + this._texture = this._textures[currentFrame]; + this._textureID = -1; + this._textureTrimmedID = -1; + this._cachedTint = 16777215; + this.uvs = this._texture._uvs.uvsFloat32; + if (this.updateAnchor) { + this._anchor.copyFrom(this._texture.defaultAnchor); + } + if (this.onFrameChange) { + this.onFrameChange(this.currentFrame); + } + } + destroy(options) { + this.stop(); + super.destroy(options); + this.onComplete = null; + this.onFrameChange = null; + this.onLoop = null; + } + static fromFrames(frames) { + const textures = []; + for (let i = 0; i < frames.length; ++i) { + textures.push(Texture.from(frames[i])); + } + return new AnimatedSprite(textures); + } + static fromImages(images) { + const textures = []; + for (let i = 0; i < images.length; ++i) { + textures.push(Texture.from(images[i])); + } + return new AnimatedSprite(textures); + } + get totalFrames() { + return this._textures.length; + } + get textures() { + return this._textures; + } + set textures(value) { + if (value[0] instanceof Texture) { + this._textures = value; + this._durations = null; + } else { + this._textures = []; + this._durations = []; + for (let i = 0; i < value.length; i++) { + this._textures.push(value[i].texture); + this._durations.push(value[i].time); + } + } + this._previousFrame = null; + this.gotoAndStop(0); + this.updateTexture(); + } + get currentFrame() { + let currentFrame = Math.floor(this._currentTime) % this._textures.length; + if (currentFrame < 0) { + currentFrame += this._textures.length; + } + return currentFrame; + } + set currentFrame(value) { + if (value < 0 || value > this.totalFrames - 1) { + throw new Error(`[AnimatedSprite]: Invalid frame index value ${value}, expected to be between 0 and totalFrames ${this.totalFrames}.`); + } + const previousFrame = this.currentFrame; + this._currentTime = value; + if (previousFrame !== this.currentFrame) { + this.updateTexture(); + } + } + get playing() { + return this._playing; + } + get autoUpdate() { + return this._autoUpdate; + } + set autoUpdate(value) { + if (value !== this._autoUpdate) { + this._autoUpdate = value; + if (!this._autoUpdate && this._isConnectedToTicker) { + Ticker.shared.remove(this.update, this); + this._isConnectedToTicker = false; + } else if (this._autoUpdate && !this._isConnectedToTicker && this._playing) { + Ticker.shared.add(this.update, this); + this._isConnectedToTicker = true; + } + } + } + } + + const tempPoint = new Point(); + class TilingSprite extends Sprite { + constructor(texture, width = 100, height = 100) { + super(texture); + this.tileTransform = new Transform(); + this._width = width; + this._height = height; + this.uvMatrix = this.texture.uvMatrix || new TextureMatrix(texture); + this.pluginName = "tilingSprite"; + this.uvRespectAnchor = false; + } + get clampMargin() { + return this.uvMatrix.clampMargin; + } + set clampMargin(value) { + this.uvMatrix.clampMargin = value; + this.uvMatrix.update(true); + } + get tileScale() { + return this.tileTransform.scale; + } + set tileScale(value) { + this.tileTransform.scale.copyFrom(value); + } + get tilePosition() { + return this.tileTransform.position; + } + set tilePosition(value) { + this.tileTransform.position.copyFrom(value); + } + _onTextureUpdate() { + if (this.uvMatrix) { + this.uvMatrix.texture = this._texture; + } + this._cachedTint = 16777215; + } + _render(renderer) { + const texture = this._texture; + if (!texture || !texture.valid) { + return; + } + this.tileTransform.updateLocalTransform(); + this.uvMatrix.update(); + renderer.batch.setObjectRenderer(renderer.plugins[this.pluginName]); + renderer.plugins[this.pluginName].render(this); + } + _calculateBounds() { + const minX = this._width * -this._anchor._x; + const minY = this._height * -this._anchor._y; + const maxX = this._width * (1 - this._anchor._x); + const maxY = this._height * (1 - this._anchor._y); + this._bounds.addFrame(this.transform, minX, minY, maxX, maxY); + } + getLocalBounds(rect) { + if (this.children.length === 0) { + this._bounds.minX = this._width * -this._anchor._x; + this._bounds.minY = this._height * -this._anchor._y; + this._bounds.maxX = this._width * (1 - this._anchor._x); + this._bounds.maxY = this._height * (1 - this._anchor._y); + if (!rect) { + if (!this._localBoundsRect) { + this._localBoundsRect = new Rectangle(); + } + rect = this._localBoundsRect; + } + return this._bounds.getRectangle(rect); + } + return super.getLocalBounds.call(this, rect); + } + containsPoint(point) { + this.worldTransform.applyInverse(point, tempPoint); + const width = this._width; + const height = this._height; + const x1 = -width * this.anchor._x; + if (tempPoint.x >= x1 && tempPoint.x < x1 + width) { + const y1 = -height * this.anchor._y; + if (tempPoint.y >= y1 && tempPoint.y < y1 + height) { + return true; + } + } + return false; + } + destroy(options) { + super.destroy(options); + this.tileTransform = null; + this.uvMatrix = null; + } + static from(source, options) { + const texture = source instanceof Texture ? source : Texture.from(source, options); + return new TilingSprite(texture, options.width, options.height); + } + get width() { + return this._width; + } + set width(value) { + this._width = value; + } + get height() { + return this._height; + } + set height(value) { + this._height = value; + } + } + + var gl2FragmentSrc = "#version 300 es\n#define SHADER_NAME Tiling-Sprite-100\n\nprecision lowp float;\n\nin vec2 vTextureCoord;\n\nout vec4 fragmentColor;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\nuniform mat3 uMapCoord;\nuniform vec4 uClampFrame;\nuniform vec2 uClampOffset;\n\nvoid main(void)\n{\n vec2 coord = vTextureCoord + ceil(uClampOffset - vTextureCoord);\n coord = (uMapCoord * vec3(coord, 1.0)).xy;\n vec2 unclamped = coord;\n coord = clamp(coord, uClampFrame.xy, uClampFrame.zw);\n\n vec4 texSample = texture(uSampler, coord, unclamped == coord ? 0.0f : -32.0f);// lod-bias very negative to force lod 0\n\n fragmentColor = texSample * uColor;\n}\n"; + + var gl2VertexSrc = "#version 300 es\n#define SHADER_NAME Tiling-Sprite-300\n\nprecision lowp float;\n\nin vec2 aVertexPosition;\nin vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTransform;\n\nout vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;\n}\n"; + + var gl1FragmentSrc = "#version 100\n#ifdef GL_EXT_shader_texture_lod\n #extension GL_EXT_shader_texture_lod : enable\n#endif\n#define SHADER_NAME Tiling-Sprite-100\n\nprecision lowp float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\nuniform mat3 uMapCoord;\nuniform vec4 uClampFrame;\nuniform vec2 uClampOffset;\n\nvoid main(void)\n{\n vec2 coord = vTextureCoord + ceil(uClampOffset - vTextureCoord);\n coord = (uMapCoord * vec3(coord, 1.0)).xy;\n vec2 unclamped = coord;\n coord = clamp(coord, uClampFrame.xy, uClampFrame.zw);\n\n #ifdef GL_EXT_shader_texture_lod\n vec4 texSample = unclamped == coord\n ? texture2D(uSampler, coord) \n : texture2DLodEXT(uSampler, coord, 0);\n #else\n vec4 texSample = texture2D(uSampler, coord);\n #endif\n\n gl_FragColor = texSample * uColor;\n}\n"; + + var gl1VertexSrc = "#version 100\n#define SHADER_NAME Tiling-Sprite-100\n\nprecision lowp float;\n\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTransform;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;\n}\n"; + + var fragmentSimpleSrc = "#version 100\n#define SHADER_NAME Tiling-Sprite-Simple-100\n\nprecision lowp float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\n\nvoid main(void)\n{\n vec4 texSample = texture2D(uSampler, vTextureCoord);\n gl_FragColor = texSample * uColor;\n}\n"; + + const tempMat = new Matrix(); + class TilingSpriteRenderer extends ObjectRenderer { + constructor(renderer) { + super(renderer); + renderer.runners.contextChange.add(this); + this.quad = new QuadUv(); + this.state = State.for2d(); + } + contextChange() { + const renderer = this.renderer; + const uniforms = { globals: renderer.globalUniforms }; + this.simpleShader = Shader.from(gl1VertexSrc, fragmentSimpleSrc, uniforms); + this.shader = renderer.context.webGLVersion > 1 ? Shader.from(gl2VertexSrc, gl2FragmentSrc, uniforms) : Shader.from(gl1VertexSrc, gl1FragmentSrc, uniforms); + } + render(ts) { + const renderer = this.renderer; + const quad = this.quad; + let vertices = quad.vertices; + vertices[0] = vertices[6] = ts._width * -ts.anchor.x; + vertices[1] = vertices[3] = ts._height * -ts.anchor.y; + vertices[2] = vertices[4] = ts._width * (1 - ts.anchor.x); + vertices[5] = vertices[7] = ts._height * (1 - ts.anchor.y); + const anchorX = ts.uvRespectAnchor ? ts.anchor.x : 0; + const anchorY = ts.uvRespectAnchor ? ts.anchor.y : 0; + vertices = quad.uvs; + vertices[0] = vertices[6] = -anchorX; + vertices[1] = vertices[3] = -anchorY; + vertices[2] = vertices[4] = 1 - anchorX; + vertices[5] = vertices[7] = 1 - anchorY; + quad.invalidate(); + const tex = ts._texture; + const baseTex = tex.baseTexture; + const premultiplied = baseTex.alphaMode > 0; + const lt = ts.tileTransform.localTransform; + const uv = ts.uvMatrix; + let isSimple = baseTex.isPowerOfTwo && tex.frame.width === baseTex.width && tex.frame.height === baseTex.height; + if (isSimple) { + if (!baseTex._glTextures[renderer.CONTEXT_UID]) { + if (baseTex.wrapMode === WRAP_MODES.CLAMP) { + baseTex.wrapMode = WRAP_MODES.REPEAT; + } + } else { + isSimple = baseTex.wrapMode !== WRAP_MODES.CLAMP; + } + } + const shader = isSimple ? this.simpleShader : this.shader; + const w = tex.width; + const h = tex.height; + const W = ts._width; + const H = ts._height; + tempMat.set(lt.a * w / W, lt.b * w / H, lt.c * h / W, lt.d * h / H, lt.tx / W, lt.ty / H); + tempMat.invert(); + if (isSimple) { + tempMat.prepend(uv.mapCoord); + } else { + shader.uniforms.uMapCoord = uv.mapCoord.toArray(true); + shader.uniforms.uClampFrame = uv.uClampFrame; + shader.uniforms.uClampOffset = uv.uClampOffset; + } + shader.uniforms.uTransform = tempMat.toArray(true); + shader.uniforms.uColor = Color.shared.setValue(ts.tint).premultiply(ts.worldAlpha, premultiplied).toArray(shader.uniforms.uColor); + shader.uniforms.translationMatrix = ts.transform.worldTransform.toArray(true); + shader.uniforms.uSampler = tex; + renderer.shader.bind(shader); + renderer.geometry.bind(quad); + this.state.blendMode = correctBlendMode(ts.blendMode, premultiplied); + renderer.state.set(this.state); + renderer.geometry.draw(this.renderer.gl.TRIANGLES, 6, 0); + } + } + TilingSpriteRenderer.extension = { + name: "tilingSprite", + type: ExtensionType.RendererPlugin + }; + extensions$1.add(TilingSpriteRenderer); + + const _Spritesheet = class { + constructor(texture, data, resolutionFilename = null) { + this.linkedSheets = []; + this._texture = texture instanceof Texture ? texture : null; + this.baseTexture = texture instanceof BaseTexture ? texture : this._texture.baseTexture; + this.textures = {}; + this.animations = {}; + this.data = data; + const resource = this.baseTexture.resource; + this.resolution = this._updateResolution(resolutionFilename || (resource ? resource.url : null)); + this._frames = this.data.frames; + this._frameKeys = Object.keys(this._frames); + this._batchIndex = 0; + this._callback = null; + } + _updateResolution(resolutionFilename = null) { + const { scale } = this.data.meta; + let resolution = getResolutionOfUrl(resolutionFilename, null); + if (resolution === null) { + resolution = parseFloat(scale ?? "1"); + } + if (resolution !== 1) { + this.baseTexture.setResolution(resolution); + } + return resolution; + } + parse() { + return new Promise((resolve) => { + this._callback = resolve; + this._batchIndex = 0; + if (this._frameKeys.length <= _Spritesheet.BATCH_SIZE) { + this._processFrames(0); + this._processAnimations(); + this._parseComplete(); + } else { + this._nextBatch(); + } + }); + } + _processFrames(initialFrameIndex) { + let frameIndex = initialFrameIndex; + const maxFrames = _Spritesheet.BATCH_SIZE; + while (frameIndex - initialFrameIndex < maxFrames && frameIndex < this._frameKeys.length) { + const i = this._frameKeys[frameIndex]; + const data = this._frames[i]; + const rect = data.frame; + if (rect) { + let frame = null; + let trim = null; + const sourceSize = data.trimmed !== false && data.sourceSize ? data.sourceSize : data.frame; + const orig = new Rectangle(0, 0, Math.floor(sourceSize.w) / this.resolution, Math.floor(sourceSize.h) / this.resolution); + if (data.rotated) { + frame = new Rectangle(Math.floor(rect.x) / this.resolution, Math.floor(rect.y) / this.resolution, Math.floor(rect.h) / this.resolution, Math.floor(rect.w) / this.resolution); + } else { + frame = new Rectangle(Math.floor(rect.x) / this.resolution, Math.floor(rect.y) / this.resolution, Math.floor(rect.w) / this.resolution, Math.floor(rect.h) / this.resolution); + } + if (data.trimmed !== false && data.spriteSourceSize) { + trim = new Rectangle(Math.floor(data.spriteSourceSize.x) / this.resolution, Math.floor(data.spriteSourceSize.y) / this.resolution, Math.floor(rect.w) / this.resolution, Math.floor(rect.h) / this.resolution); + } + this.textures[i] = new Texture(this.baseTexture, frame, orig, trim, data.rotated ? 2 : 0, data.anchor, data.borders); + Texture.addToCache(this.textures[i], i); + } + frameIndex++; + } + } + _processAnimations() { + const animations = this.data.animations || {}; + for (const animName in animations) { + this.animations[animName] = []; + for (let i = 0; i < animations[animName].length; i++) { + const frameName = animations[animName][i]; + this.animations[animName].push(this.textures[frameName]); + } + } + } + _parseComplete() { + const callback = this._callback; + this._callback = null; + this._batchIndex = 0; + callback.call(this, this.textures); + } + _nextBatch() { + this._processFrames(this._batchIndex * _Spritesheet.BATCH_SIZE); + this._batchIndex++; + setTimeout(() => { + if (this._batchIndex * _Spritesheet.BATCH_SIZE < this._frameKeys.length) { + this._nextBatch(); + } else { + this._processAnimations(); + this._parseComplete(); + } + }, 0); + } + destroy(destroyBase = false) { + for (const i in this.textures) { + this.textures[i].destroy(); + } + this._frames = null; + this._frameKeys = null; + this.data = null; + this.textures = null; + if (destroyBase) { + this._texture?.destroy(); + this.baseTexture.destroy(); + } + this._texture = null; + this.baseTexture = null; + this.linkedSheets = []; + } + }; + let Spritesheet = _Spritesheet; + Spritesheet.BATCH_SIZE = 1e3; + + const validImages = ["jpg", "png", "jpeg", "avif", "webp"]; + function getCacheableAssets(keys, asset, ignoreMultiPack) { + const out = {}; + keys.forEach((key) => { + out[key] = asset; + }); + Object.keys(asset.textures).forEach((key) => { + out[key] = asset.textures[key]; + }); + if (!ignoreMultiPack) { + const basePath = path.dirname(keys[0]); + asset.linkedSheets.forEach((item, i) => { + const out2 = getCacheableAssets([`${basePath}/${asset.data.meta.related_multi_packs[i]}`], item, true); + Object.assign(out, out2); + }); + } + return out; + } + const spritesheetAsset = { + extension: ExtensionType.Asset, + cache: { + test: (asset) => asset instanceof Spritesheet, + getCacheableAssets: (keys, asset) => getCacheableAssets(keys, asset, false) + }, + resolver: { + test: (value) => { + const tempURL = value.split("?")[0]; + const split = tempURL.split("."); + const extension = split.pop(); + const format = split.pop(); + return extension === "json" && validImages.includes(format); + }, + parse: (value) => { + const split = value.split("."); + return { + resolution: parseFloat(settings.RETINA_PREFIX.exec(value)?.[1] ?? "1"), + format: split[split.length - 2], + src: value + }; + } + }, + loader: { + name: "spritesheetLoader", + extension: { + type: ExtensionType.LoadParser, + priority: LoaderParserPriority.Normal + }, + async testParse(asset, options) { + return path.extname(options.src).toLowerCase() === ".json" && !!asset.frames; + }, + async parse(asset, options, loader) { + let basePath = path.dirname(options.src); + if (basePath && basePath.lastIndexOf("/") !== basePath.length - 1) { + basePath += "/"; + } + let imagePath = basePath + asset.meta.image; + imagePath = copySearchParams(imagePath, options.src); + const assets = await loader.load([imagePath]); + const texture = assets[imagePath]; + const spritesheet = new Spritesheet(texture.baseTexture, asset, options.src); + await spritesheet.parse(); + const multiPacks = asset?.meta?.related_multi_packs; + if (Array.isArray(multiPacks)) { + const promises = []; + for (const item of multiPacks) { + if (typeof item !== "string") { + continue; + } + let itemUrl = basePath + item; + if (options.data?.ignoreMultiPack) { + continue; + } + itemUrl = copySearchParams(itemUrl, options.src); + promises.push(loader.load({ + src: itemUrl, + data: { + ignoreMultiPack: true + } + })); + } + const res = await Promise.all(promises); + spritesheet.linkedSheets = res; + res.forEach((item) => { + item.linkedSheets = [spritesheet].concat(spritesheet.linkedSheets.filter((sp) => sp !== item)); + }); + } + return spritesheet; + }, + unload(spritesheet) { + spritesheet.destroy(true); + } + } + }; + extensions$1.add(spritesheetAsset); + + class BitmapFontData { + constructor() { + this.info = []; + this.common = []; + this.page = []; + this.char = []; + this.kerning = []; + this.distanceField = []; + } + } + + class TextFormat { + static test(data) { + return typeof data === "string" && data.startsWith("info face="); + } + static parse(txt) { + const items = txt.match(/^[a-z]+\s+.+$/gm); + const rawData = { + info: [], + common: [], + page: [], + char: [], + chars: [], + kerning: [], + kernings: [], + distanceField: [] + }; + for (const i in items) { + const name = items[i].match(/^[a-z]+/gm)[0]; + const attributeList = items[i].match(/[a-zA-Z]+=([^\s"']+|"([^"]*)")/gm); + const itemData = {}; + for (const i2 in attributeList) { + const split = attributeList[i2].split("="); + const key = split[0]; + const strValue = split[1].replace(/"/gm, ""); + const floatValue = parseFloat(strValue); + const value = isNaN(floatValue) ? strValue : floatValue; + itemData[key] = value; + } + rawData[name].push(itemData); + } + const font = new BitmapFontData(); + rawData.info.forEach((info) => font.info.push({ + face: info.face, + size: parseInt(info.size, 10) + })); + rawData.common.forEach((common) => font.common.push({ + lineHeight: parseInt(common.lineHeight, 10) + })); + rawData.page.forEach((page) => font.page.push({ + id: parseInt(page.id, 10), + file: page.file + })); + rawData.char.forEach((char) => font.char.push({ + id: parseInt(char.id, 10), + page: parseInt(char.page, 10), + x: parseInt(char.x, 10), + y: parseInt(char.y, 10), + width: parseInt(char.width, 10), + height: parseInt(char.height, 10), + xoffset: parseInt(char.xoffset, 10), + yoffset: parseInt(char.yoffset, 10), + xadvance: parseInt(char.xadvance, 10) + })); + rawData.kerning.forEach((kerning) => font.kerning.push({ + first: parseInt(kerning.first, 10), + second: parseInt(kerning.second, 10), + amount: parseInt(kerning.amount, 10) + })); + rawData.distanceField.forEach((df) => font.distanceField.push({ + distanceRange: parseInt(df.distanceRange, 10), + fieldType: df.fieldType + })); + return font; + } + } + + class XMLFormat { + static test(data) { + const xml = data; + return "getElementsByTagName" in xml && xml.getElementsByTagName("page").length && xml.getElementsByTagName("info")[0].getAttribute("face") !== null; + } + static parse(xml) { + const data = new BitmapFontData(); + const info = xml.getElementsByTagName("info"); + const common = xml.getElementsByTagName("common"); + const page = xml.getElementsByTagName("page"); + const char = xml.getElementsByTagName("char"); + const kerning = xml.getElementsByTagName("kerning"); + const distanceField = xml.getElementsByTagName("distanceField"); + for (let i = 0; i < info.length; i++) { + data.info.push({ + face: info[i].getAttribute("face"), + size: parseInt(info[i].getAttribute("size"), 10) + }); + } + for (let i = 0; i < common.length; i++) { + data.common.push({ + lineHeight: parseInt(common[i].getAttribute("lineHeight"), 10) + }); + } + for (let i = 0; i < page.length; i++) { + data.page.push({ + id: parseInt(page[i].getAttribute("id"), 10) || 0, + file: page[i].getAttribute("file") + }); + } + for (let i = 0; i < char.length; i++) { + const letter = char[i]; + data.char.push({ + id: parseInt(letter.getAttribute("id"), 10), + page: parseInt(letter.getAttribute("page"), 10) || 0, + x: parseInt(letter.getAttribute("x"), 10), + y: parseInt(letter.getAttribute("y"), 10), + width: parseInt(letter.getAttribute("width"), 10), + height: parseInt(letter.getAttribute("height"), 10), + xoffset: parseInt(letter.getAttribute("xoffset"), 10), + yoffset: parseInt(letter.getAttribute("yoffset"), 10), + xadvance: parseInt(letter.getAttribute("xadvance"), 10) + }); + } + for (let i = 0; i < kerning.length; i++) { + data.kerning.push({ + first: parseInt(kerning[i].getAttribute("first"), 10), + second: parseInt(kerning[i].getAttribute("second"), 10), + amount: parseInt(kerning[i].getAttribute("amount"), 10) + }); + } + for (let i = 0; i < distanceField.length; i++) { + data.distanceField.push({ + fieldType: distanceField[i].getAttribute("fieldType"), + distanceRange: parseInt(distanceField[i].getAttribute("distanceRange"), 10) + }); + } + return data; + } + } + + class XMLStringFormat { + static test(data) { + if (typeof data === "string" && data.includes("")) { + return XMLFormat.test(settings.ADAPTER.parseXML(data)); + } + return false; + } + static parse(xmlTxt) { + return XMLFormat.parse(settings.ADAPTER.parseXML(xmlTxt)); + } + } + + const formats = [ + TextFormat, + XMLFormat, + XMLStringFormat + ]; + function autoDetectFormat(data) { + for (let i = 0; i < formats.length; i++) { + if (formats[i].test(data)) { + return formats[i]; + } + } + return null; + } + + function generateFillStyle(canvas, context, style, resolution, lines, metrics) { + const fillStyle = style.fill; + if (!Array.isArray(fillStyle)) { + return fillStyle; + } else if (fillStyle.length === 1) { + return fillStyle[0]; + } + let gradient; + const dropShadowCorrection = style.dropShadow ? style.dropShadowDistance : 0; + const padding = style.padding || 0; + const width = canvas.width / resolution - dropShadowCorrection - padding * 2; + const height = canvas.height / resolution - dropShadowCorrection - padding * 2; + const fill = fillStyle.slice(); + const fillGradientStops = style.fillGradientStops.slice(); + if (!fillGradientStops.length) { + const lengthPlus1 = fill.length + 1; + for (let i = 1; i < lengthPlus1; ++i) { + fillGradientStops.push(i / lengthPlus1); + } + } + fill.unshift(fillStyle[0]); + fillGradientStops.unshift(0); + fill.push(fillStyle[fillStyle.length - 1]); + fillGradientStops.push(1); + if (style.fillGradientType === TEXT_GRADIENT.LINEAR_VERTICAL) { + gradient = context.createLinearGradient(width / 2, padding, width / 2, height + padding); + let lastIterationStop = 0; + const textHeight = metrics.fontProperties.fontSize + style.strokeThickness; + const gradStopLineHeight = textHeight / height; + for (let i = 0; i < lines.length; i++) { + const thisLineTop = metrics.lineHeight * i; + for (let j = 0; j < fill.length; j++) { + let lineStop = 0; + if (typeof fillGradientStops[j] === "number") { + lineStop = fillGradientStops[j]; + } else { + lineStop = j / fill.length; + } + const globalStop = thisLineTop / height + lineStop * gradStopLineHeight; + let clampedStop = Math.max(lastIterationStop, globalStop); + clampedStop = Math.min(clampedStop, 1); + gradient.addColorStop(clampedStop, fill[j]); + lastIterationStop = clampedStop; + } + } + } else { + gradient = context.createLinearGradient(padding, height / 2, width + padding, height / 2); + const totalIterations = fill.length + 1; + let currentIteration = 1; + for (let i = 0; i < fill.length; i++) { + let stop; + if (typeof fillGradientStops[i] === "number") { + stop = fillGradientStops[i]; + } else { + stop = currentIteration / totalIterations; + } + gradient.addColorStop(stop, fill[i]); + currentIteration++; + } + } + return gradient; + } + + function drawGlyph(canvas, context, metrics, x, y, resolution, style) { + const char = metrics.text; + const fontProperties = metrics.fontProperties; + context.translate(x, y); + context.scale(resolution, resolution); + const tx = style.strokeThickness / 2; + const ty = -(style.strokeThickness / 2); + context.font = style.toFontString(); + context.lineWidth = style.strokeThickness; + context.textBaseline = style.textBaseline; + context.lineJoin = style.lineJoin; + context.miterLimit = style.miterLimit; + context.fillStyle = generateFillStyle(canvas, context, style, resolution, [char], metrics); + context.strokeStyle = style.stroke; + if (style.dropShadow) { + const dropShadowColor = style.dropShadowColor; + const dropShadowBlur = style.dropShadowBlur * resolution; + const dropShadowDistance = style.dropShadowDistance * resolution; + context.shadowColor = Color.shared.setValue(dropShadowColor).setAlpha(style.dropShadowAlpha).toRgbaString(); + context.shadowBlur = dropShadowBlur; + context.shadowOffsetX = Math.cos(style.dropShadowAngle) * dropShadowDistance; + context.shadowOffsetY = Math.sin(style.dropShadowAngle) * dropShadowDistance; + } else { + context.shadowColor = "black"; + context.shadowBlur = 0; + context.shadowOffsetX = 0; + context.shadowOffsetY = 0; + } + if (style.stroke && style.strokeThickness) { + context.strokeText(char, tx, ty + metrics.lineHeight - fontProperties.descent); + } + if (style.fill) { + context.fillText(char, tx, ty + metrics.lineHeight - fontProperties.descent); + } + context.setTransform(1, 0, 0, 1, 0, 0); + context.fillStyle = "rgba(0, 0, 0, 0)"; + } + + function extractCharCode(str) { + return str.codePointAt ? str.codePointAt(0) : str.charCodeAt(0); + } + + function splitTextToCharacters(text) { + return Array.from ? Array.from(text) : text.split(""); + } + + function resolveCharacters(chars) { + if (typeof chars === "string") { + chars = [chars]; + } + const result = []; + for (let i = 0, j = chars.length; i < j; i++) { + const item = chars[i]; + if (Array.isArray(item)) { + if (item.length !== 2) { + throw new Error(`[BitmapFont]: Invalid character range length, expecting 2 got ${item.length}.`); + } + const startCode = item[0].charCodeAt(0); + const endCode = item[1].charCodeAt(0); + if (endCode < startCode) { + throw new Error("[BitmapFont]: Invalid character range."); + } + for (let i2 = startCode, j2 = endCode; i2 <= j2; i2++) { + result.push(String.fromCharCode(i2)); + } + } else { + result.push(...splitTextToCharacters(item)); + } + } + if (result.length === 0) { + throw new Error("[BitmapFont]: Empty set when resolving characters."); + } + return result; + } + + const _BitmapFont = class { + constructor(data, textures, ownsTextures) { + const [info] = data.info; + const [common] = data.common; + const [page] = data.page; + const [distanceField] = data.distanceField; + const res = getResolutionOfUrl(page.file); + const pageTextures = {}; + this._ownsTextures = ownsTextures; + this.font = info.face; + this.size = info.size; + this.lineHeight = common.lineHeight / res; + this.chars = {}; + this.pageTextures = pageTextures; + for (let i = 0; i < data.page.length; i++) { + const { id, file } = data.page[i]; + pageTextures[id] = textures instanceof Array ? textures[i] : textures[file]; + if (distanceField?.fieldType && distanceField.fieldType !== "none") { + pageTextures[id].baseTexture.alphaMode = ALPHA_MODES.NO_PREMULTIPLIED_ALPHA; + pageTextures[id].baseTexture.mipmap = MIPMAP_MODES.OFF; + } + } + for (let i = 0; i < data.char.length; i++) { + const { id, page: page2 } = data.char[i]; + let { x, y, width, height, xoffset, yoffset, xadvance } = data.char[i]; + x /= res; + y /= res; + width /= res; + height /= res; + xoffset /= res; + yoffset /= res; + xadvance /= res; + const rect = new Rectangle(x + pageTextures[page2].frame.x / res, y + pageTextures[page2].frame.y / res, width, height); + this.chars[id] = { + xOffset: xoffset, + yOffset: yoffset, + xAdvance: xadvance, + kerning: {}, + texture: new Texture(pageTextures[page2].baseTexture, rect), + page: page2 + }; + } + for (let i = 0; i < data.kerning.length; i++) { + let { first, second, amount } = data.kerning[i]; + first /= res; + second /= res; + amount /= res; + if (this.chars[second]) { + this.chars[second].kerning[first] = amount; + } + } + this.distanceFieldRange = distanceField?.distanceRange; + this.distanceFieldType = distanceField?.fieldType?.toLowerCase() ?? "none"; + } + destroy() { + for (const id in this.chars) { + this.chars[id].texture.destroy(); + this.chars[id].texture = null; + } + for (const id in this.pageTextures) { + if (this._ownsTextures) { + this.pageTextures[id].destroy(true); + } + this.pageTextures[id] = null; + } + this.chars = null; + this.pageTextures = null; + } + static install(data, textures, ownsTextures) { + let fontData; + if (data instanceof BitmapFontData) { + fontData = data; + } else { + const format = autoDetectFormat(data); + if (!format) { + throw new Error("Unrecognized data format for font."); + } + fontData = format.parse(data); + } + if (textures instanceof Texture) { + textures = [textures]; + } + const font = new _BitmapFont(fontData, textures, ownsTextures); + _BitmapFont.available[font.font] = font; + return font; + } + static uninstall(name) { + const font = _BitmapFont.available[name]; + if (!font) { + throw new Error(`No font found named '${name}'`); + } + font.destroy(); + delete _BitmapFont.available[name]; + } + static from(name, textStyle, options) { + if (!name) { + throw new Error("[BitmapFont] Property `name` is required."); + } + const { + chars, + padding, + resolution, + textureWidth, + textureHeight, + ...baseOptions + } = Object.assign({}, _BitmapFont.defaultOptions, options); + const charsList = resolveCharacters(chars); + const style = textStyle instanceof TextStyle ? textStyle : new TextStyle(textStyle); + const lineWidth = textureWidth; + const fontData = new BitmapFontData(); + fontData.info[0] = { + face: style.fontFamily, + size: style.fontSize + }; + fontData.common[0] = { + lineHeight: style.fontSize + }; + let positionX = 0; + let positionY = 0; + let canvas; + let context; + let baseTexture; + let maxCharHeight = 0; + const baseTextures = []; + const textures = []; + for (let i = 0; i < charsList.length; i++) { + if (!canvas) { + canvas = settings.ADAPTER.createCanvas(); + canvas.width = textureWidth; + canvas.height = textureHeight; + context = canvas.getContext("2d"); + baseTexture = new BaseTexture(canvas, { resolution, ...baseOptions }); + baseTextures.push(baseTexture); + textures.push(new Texture(baseTexture)); + fontData.page.push({ + id: textures.length - 1, + file: "" + }); + } + const character = charsList[i]; + const metrics = TextMetrics.measureText(character, style, false, canvas); + const width = metrics.width; + const height = Math.ceil(metrics.height); + const textureGlyphWidth = Math.ceil((style.fontStyle === "italic" ? 2 : 1) * width); + if (positionY >= textureHeight - height * resolution) { + if (positionY === 0) { + throw new Error(`[BitmapFont] textureHeight ${textureHeight}px is too small (fontFamily: '${style.fontFamily}', fontSize: ${style.fontSize}px, char: '${character}')`); + } + --i; + canvas = null; + context = null; + baseTexture = null; + positionY = 0; + positionX = 0; + maxCharHeight = 0; + continue; + } + maxCharHeight = Math.max(height + metrics.fontProperties.descent, maxCharHeight); + if (textureGlyphWidth * resolution + positionX >= lineWidth) { + if (positionX === 0) { + throw new Error(`[BitmapFont] textureWidth ${textureWidth}px is too small (fontFamily: '${style.fontFamily}', fontSize: ${style.fontSize}px, char: '${character}')`); + } + --i; + positionY += maxCharHeight * resolution; + positionY = Math.ceil(positionY); + positionX = 0; + maxCharHeight = 0; + continue; + } + drawGlyph(canvas, context, metrics, positionX, positionY, resolution, style); + const id = extractCharCode(metrics.text); + fontData.char.push({ + id, + page: textures.length - 1, + x: positionX / resolution, + y: positionY / resolution, + width: textureGlyphWidth, + height, + xoffset: 0, + yoffset: 0, + xadvance: width - (style.dropShadow ? style.dropShadowDistance : 0) - (style.stroke ? style.strokeThickness : 0) + }); + positionX += (textureGlyphWidth + 2 * padding) * resolution; + positionX = Math.ceil(positionX); + } + for (let i = 0, len = charsList.length; i < len; i++) { + const first = charsList[i]; + for (let j = 0; j < len; j++) { + const second = charsList[j]; + const c1 = context.measureText(first).width; + const c2 = context.measureText(second).width; + const total = context.measureText(first + second).width; + const amount = total - (c1 + c2); + if (amount) { + fontData.kerning.push({ + first: extractCharCode(first), + second: extractCharCode(second), + amount + }); + } + } + } + const font = new _BitmapFont(fontData, textures, true); + if (_BitmapFont.available[name] !== void 0) { + _BitmapFont.uninstall(name); + } + _BitmapFont.available[name] = font; + return font; + } + }; + let BitmapFont = _BitmapFont; + BitmapFont.ALPHA = [["a", "z"], ["A", "Z"], " "]; + BitmapFont.NUMERIC = [["0", "9"]]; + BitmapFont.ALPHANUMERIC = [["a", "z"], ["A", "Z"], ["0", "9"], " "]; + BitmapFont.ASCII = [[" ", "~"]]; + BitmapFont.defaultOptions = { + resolution: 1, + textureWidth: 512, + textureHeight: 512, + padding: 4, + chars: _BitmapFont.ALPHANUMERIC + }; + BitmapFont.available = {}; + + var msdfFrag = "// Pixi texture info\r\nvarying vec2 vTextureCoord;\r\nuniform sampler2D uSampler;\r\n\r\n// Tint\r\nuniform vec4 uColor;\r\n\r\n// on 2D applications fwidth is screenScale / glyphAtlasScale * distanceFieldRange\r\nuniform float uFWidth;\r\n\r\nvoid main(void) {\r\n\r\n // To stack MSDF and SDF we need a non-pre-multiplied-alpha texture.\r\n vec4 texColor = texture2D(uSampler, vTextureCoord);\r\n\r\n // MSDF\r\n float median = texColor.r + texColor.g + texColor.b -\r\n min(texColor.r, min(texColor.g, texColor.b)) -\r\n max(texColor.r, max(texColor.g, texColor.b));\r\n // SDF\r\n median = min(median, texColor.a);\r\n\r\n float screenPxDistance = uFWidth * (median - 0.5);\r\n float alpha = clamp(screenPxDistance + 0.5, 0.0, 1.0);\r\n if (median < 0.01) {\r\n alpha = 0.0;\r\n } else if (median > 0.99) {\r\n alpha = 1.0;\r\n }\r\n\r\n // Gamma correction for coverage-like alpha\r\n float luma = dot(uColor.rgb, vec3(0.299, 0.587, 0.114));\r\n float gamma = mix(1.0, 1.0 / 2.2, luma);\r\n float coverage = pow(uColor.a * alpha, gamma); \r\n\r\n // NPM Textures, NPM outputs\r\n gl_FragColor = vec4(uColor.rgb, coverage);\r\n}\r\n"; + + var msdfVert = "// Mesh material default fragment\r\nattribute vec2 aVertexPosition;\r\nattribute vec2 aTextureCoord;\r\n\r\nuniform mat3 projectionMatrix;\r\nuniform mat3 translationMatrix;\r\nuniform mat3 uTextureMatrix;\r\n\r\nvarying vec2 vTextureCoord;\r\n\r\nvoid main(void)\r\n{\r\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\r\n\r\n vTextureCoord = (uTextureMatrix * vec3(aTextureCoord, 1.0)).xy;\r\n}\r\n"; + + const pageMeshDataDefaultPageMeshData = []; + const pageMeshDataMSDFPageMeshData = []; + const charRenderDataPool = []; + const _BitmapText = class extends Container { + constructor(text, style = {}) { + super(); + const { align, tint, maxWidth, letterSpacing, fontName, fontSize } = Object.assign({}, _BitmapText.styleDefaults, style); + if (!BitmapFont.available[fontName]) { + throw new Error(`Missing BitmapFont "${fontName}"`); + } + this._activePagesMeshData = []; + this._textWidth = 0; + this._textHeight = 0; + this._align = align; + this._tintColor = new Color(tint); + this._font = void 0; + this._fontName = fontName; + this._fontSize = fontSize; + this.text = text; + this._maxWidth = maxWidth; + this._maxLineHeight = 0; + this._letterSpacing = letterSpacing; + this._anchor = new ObservablePoint(() => { + this.dirty = true; + }, this, 0, 0); + this._roundPixels = settings.ROUND_PIXELS; + this.dirty = true; + this._resolution = settings.RESOLUTION; + this._autoResolution = true; + this._textureCache = {}; + } + updateText() { + const data = BitmapFont.available[this._fontName]; + const fontSize = this.fontSize; + const scale = fontSize / data.size; + const pos = new Point(); + const chars = []; + const lineWidths = []; + const lineSpaces = []; + const text = this._text.replace(/(?:\r\n|\r)/g, "\n") || " "; + const charsInput = splitTextToCharacters(text); + const maxWidth = this._maxWidth * data.size / fontSize; + const pageMeshDataPool = data.distanceFieldType === "none" ? pageMeshDataDefaultPageMeshData : pageMeshDataMSDFPageMeshData; + let prevCharCode = null; + let lastLineWidth = 0; + let maxLineWidth = 0; + let line = 0; + let lastBreakPos = -1; + let lastBreakWidth = 0; + let spacesRemoved = 0; + let maxLineHeight = 0; + let spaceCount = 0; + for (let i = 0; i < charsInput.length; i++) { + const char = charsInput[i]; + const charCode = extractCharCode(char); + if (/(?:\s)/.test(char)) { + lastBreakPos = i; + lastBreakWidth = lastLineWidth; + spaceCount++; + } + if (char === "\r" || char === "\n") { + lineWidths.push(lastLineWidth); + lineSpaces.push(-1); + maxLineWidth = Math.max(maxLineWidth, lastLineWidth); + ++line; + ++spacesRemoved; + pos.x = 0; + pos.y += data.lineHeight; + prevCharCode = null; + spaceCount = 0; + continue; + } + const charData = data.chars[charCode]; + if (!charData) { + continue; + } + if (prevCharCode && charData.kerning[prevCharCode]) { + pos.x += charData.kerning[prevCharCode]; + } + const charRenderData = charRenderDataPool.pop() || { + texture: Texture.EMPTY, + line: 0, + charCode: 0, + prevSpaces: 0, + position: new Point() + }; + charRenderData.texture = charData.texture; + charRenderData.line = line; + charRenderData.charCode = charCode; + charRenderData.position.x = Math.round(pos.x + charData.xOffset + this._letterSpacing / 2); + charRenderData.position.y = Math.round(pos.y + charData.yOffset); + charRenderData.prevSpaces = spaceCount; + chars.push(charRenderData); + lastLineWidth = charRenderData.position.x + Math.max(charData.xAdvance - charData.xOffset, charData.texture.orig.width); + pos.x += charData.xAdvance + this._letterSpacing; + maxLineHeight = Math.max(maxLineHeight, charData.yOffset + charData.texture.height); + prevCharCode = charCode; + if (lastBreakPos !== -1 && maxWidth > 0 && pos.x > maxWidth) { + ++spacesRemoved; + removeItems(chars, 1 + lastBreakPos - spacesRemoved, 1 + i - lastBreakPos); + i = lastBreakPos; + lastBreakPos = -1; + lineWidths.push(lastBreakWidth); + lineSpaces.push(chars.length > 0 ? chars[chars.length - 1].prevSpaces : 0); + maxLineWidth = Math.max(maxLineWidth, lastBreakWidth); + line++; + pos.x = 0; + pos.y += data.lineHeight; + prevCharCode = null; + spaceCount = 0; + } + } + const lastChar = charsInput[charsInput.length - 1]; + if (lastChar !== "\r" && lastChar !== "\n") { + if (/(?:\s)/.test(lastChar)) { + lastLineWidth = lastBreakWidth; + } + lineWidths.push(lastLineWidth); + maxLineWidth = Math.max(maxLineWidth, lastLineWidth); + lineSpaces.push(-1); + } + const lineAlignOffsets = []; + for (let i = 0; i <= line; i++) { + let alignOffset = 0; + if (this._align === "right") { + alignOffset = maxLineWidth - lineWidths[i]; + } else if (this._align === "center") { + alignOffset = (maxLineWidth - lineWidths[i]) / 2; + } else if (this._align === "justify") { + alignOffset = lineSpaces[i] < 0 ? 0 : (maxLineWidth - lineWidths[i]) / lineSpaces[i]; + } + lineAlignOffsets.push(alignOffset); + } + const lenChars = chars.length; + const pagesMeshData = {}; + const newPagesMeshData = []; + const activePagesMeshData = this._activePagesMeshData; + pageMeshDataPool.push(...activePagesMeshData); + for (let i = 0; i < lenChars; i++) { + const texture = chars[i].texture; + const baseTextureUid = texture.baseTexture.uid; + if (!pagesMeshData[baseTextureUid]) { + let pageMeshData = pageMeshDataPool.pop(); + if (!pageMeshData) { + const geometry = new MeshGeometry(); + let material; + let meshBlendMode; + if (data.distanceFieldType === "none") { + material = new MeshMaterial(Texture.EMPTY); + meshBlendMode = BLEND_MODES.NORMAL; + } else { + material = new MeshMaterial(Texture.EMPTY, { program: Program.from(msdfVert, msdfFrag), uniforms: { uFWidth: 0 } }); + meshBlendMode = BLEND_MODES.NORMAL_NPM; + } + const mesh = new Mesh(geometry, material); + mesh.blendMode = meshBlendMode; + pageMeshData = { + index: 0, + indexCount: 0, + vertexCount: 0, + uvsCount: 0, + total: 0, + mesh, + vertices: null, + uvs: null, + indices: null + }; + } + pageMeshData.index = 0; + pageMeshData.indexCount = 0; + pageMeshData.vertexCount = 0; + pageMeshData.uvsCount = 0; + pageMeshData.total = 0; + const { _textureCache } = this; + _textureCache[baseTextureUid] = _textureCache[baseTextureUid] || new Texture(texture.baseTexture); + pageMeshData.mesh.texture = _textureCache[baseTextureUid]; + pageMeshData.mesh.tint = this._tintColor.value; + newPagesMeshData.push(pageMeshData); + pagesMeshData[baseTextureUid] = pageMeshData; + } + pagesMeshData[baseTextureUid].total++; + } + for (let i = 0; i < activePagesMeshData.length; i++) { + if (!newPagesMeshData.includes(activePagesMeshData[i])) { + this.removeChild(activePagesMeshData[i].mesh); + } + } + for (let i = 0; i < newPagesMeshData.length; i++) { + if (newPagesMeshData[i].mesh.parent !== this) { + this.addChild(newPagesMeshData[i].mesh); + } + } + this._activePagesMeshData = newPagesMeshData; + for (const i in pagesMeshData) { + const pageMeshData = pagesMeshData[i]; + const total = pageMeshData.total; + if (!(pageMeshData.indices?.length > 6 * total) || pageMeshData.vertices.length < Mesh.BATCHABLE_SIZE * 2) { + pageMeshData.vertices = new Float32Array(4 * 2 * total); + pageMeshData.uvs = new Float32Array(4 * 2 * total); + pageMeshData.indices = new Uint16Array(6 * total); + } else { + const total2 = pageMeshData.total; + const vertices = pageMeshData.vertices; + for (let i2 = total2 * 4 * 2; i2 < vertices.length; i2++) { + vertices[i2] = 0; + } + } + pageMeshData.mesh.size = 6 * total; + } + for (let i = 0; i < lenChars; i++) { + const char = chars[i]; + let offset = char.position.x + lineAlignOffsets[char.line] * (this._align === "justify" ? char.prevSpaces : 1); + if (this._roundPixels) { + offset = Math.round(offset); + } + const xPos = offset * scale; + const yPos = char.position.y * scale; + const texture = char.texture; + const pageMesh = pagesMeshData[texture.baseTexture.uid]; + const textureFrame = texture.frame; + const textureUvs = texture._uvs; + const index = pageMesh.index++; + pageMesh.indices[index * 6 + 0] = 0 + index * 4; + pageMesh.indices[index * 6 + 1] = 1 + index * 4; + pageMesh.indices[index * 6 + 2] = 2 + index * 4; + pageMesh.indices[index * 6 + 3] = 0 + index * 4; + pageMesh.indices[index * 6 + 4] = 2 + index * 4; + pageMesh.indices[index * 6 + 5] = 3 + index * 4; + pageMesh.vertices[index * 8 + 0] = xPos; + pageMesh.vertices[index * 8 + 1] = yPos; + pageMesh.vertices[index * 8 + 2] = xPos + textureFrame.width * scale; + pageMesh.vertices[index * 8 + 3] = yPos; + pageMesh.vertices[index * 8 + 4] = xPos + textureFrame.width * scale; + pageMesh.vertices[index * 8 + 5] = yPos + textureFrame.height * scale; + pageMesh.vertices[index * 8 + 6] = xPos; + pageMesh.vertices[index * 8 + 7] = yPos + textureFrame.height * scale; + pageMesh.uvs[index * 8 + 0] = textureUvs.x0; + pageMesh.uvs[index * 8 + 1] = textureUvs.y0; + pageMesh.uvs[index * 8 + 2] = textureUvs.x1; + pageMesh.uvs[index * 8 + 3] = textureUvs.y1; + pageMesh.uvs[index * 8 + 4] = textureUvs.x2; + pageMesh.uvs[index * 8 + 5] = textureUvs.y2; + pageMesh.uvs[index * 8 + 6] = textureUvs.x3; + pageMesh.uvs[index * 8 + 7] = textureUvs.y3; + } + this._textWidth = maxLineWidth * scale; + this._textHeight = (pos.y + data.lineHeight) * scale; + for (const i in pagesMeshData) { + const pageMeshData = pagesMeshData[i]; + if (this.anchor.x !== 0 || this.anchor.y !== 0) { + let vertexCount = 0; + const anchorOffsetX = this._textWidth * this.anchor.x; + const anchorOffsetY = this._textHeight * this.anchor.y; + for (let i2 = 0; i2 < pageMeshData.total; i2++) { + pageMeshData.vertices[vertexCount++] -= anchorOffsetX; + pageMeshData.vertices[vertexCount++] -= anchorOffsetY; + pageMeshData.vertices[vertexCount++] -= anchorOffsetX; + pageMeshData.vertices[vertexCount++] -= anchorOffsetY; + pageMeshData.vertices[vertexCount++] -= anchorOffsetX; + pageMeshData.vertices[vertexCount++] -= anchorOffsetY; + pageMeshData.vertices[vertexCount++] -= anchorOffsetX; + pageMeshData.vertices[vertexCount++] -= anchorOffsetY; + } + } + this._maxLineHeight = maxLineHeight * scale; + const vertexBuffer = pageMeshData.mesh.geometry.getBuffer("aVertexPosition"); + const textureBuffer = pageMeshData.mesh.geometry.getBuffer("aTextureCoord"); + const indexBuffer = pageMeshData.mesh.geometry.getIndex(); + vertexBuffer.data = pageMeshData.vertices; + textureBuffer.data = pageMeshData.uvs; + indexBuffer.data = pageMeshData.indices; + vertexBuffer.update(); + textureBuffer.update(); + indexBuffer.update(); + } + for (let i = 0; i < chars.length; i++) { + charRenderDataPool.push(chars[i]); + } + this._font = data; + this.dirty = false; + } + updateTransform() { + this.validate(); + this.containerUpdateTransform(); + } + _render(renderer) { + if (this._autoResolution && this._resolution !== renderer.resolution) { + this._resolution = renderer.resolution; + this.dirty = true; + } + const { distanceFieldRange, distanceFieldType, size } = BitmapFont.available[this._fontName]; + if (distanceFieldType !== "none") { + const { a, b, c, d } = this.worldTransform; + const dx = Math.sqrt(a * a + b * b); + const dy = Math.sqrt(c * c + d * d); + const worldScale = (Math.abs(dx) + Math.abs(dy)) / 2; + const fontScale = this.fontSize / size; + const resolution = renderer._view.resolution; + for (const mesh of this._activePagesMeshData) { + mesh.mesh.shader.uniforms.uFWidth = worldScale * distanceFieldRange * fontScale * resolution; + } + } + super._render(renderer); + } + getLocalBounds() { + this.validate(); + return super.getLocalBounds(); + } + validate() { + const font = BitmapFont.available[this._fontName]; + if (!font) { + throw new Error(`Missing BitmapFont "${this._fontName}"`); + } + if (this._font !== font) { + this.dirty = true; + } + if (this.dirty) { + this.updateText(); + } + } + get tint() { + return this._tintColor.value; + } + set tint(value) { + if (this.tint === value) + return; + this._tintColor.setValue(value); + for (let i = 0; i < this._activePagesMeshData.length; i++) { + this._activePagesMeshData[i].mesh.tint = value; + } + } + get align() { + return this._align; + } + set align(value) { + if (this._align !== value) { + this._align = value; + this.dirty = true; + } + } + get fontName() { + return this._fontName; + } + set fontName(value) { + if (!BitmapFont.available[value]) { + throw new Error(`Missing BitmapFont "${value}"`); + } + if (this._fontName !== value) { + this._fontName = value; + this.dirty = true; + } + } + get fontSize() { + return this._fontSize ?? BitmapFont.available[this._fontName].size; + } + set fontSize(value) { + if (this._fontSize !== value) { + this._fontSize = value; + this.dirty = true; + } + } + get anchor() { + return this._anchor; + } + set anchor(value) { + if (typeof value === "number") { + this._anchor.set(value); + } else { + this._anchor.copyFrom(value); + } + } + get text() { + return this._text; + } + set text(text) { + text = String(text === null || text === void 0 ? "" : text); + if (this._text === text) { + return; + } + this._text = text; + this.dirty = true; + } + get maxWidth() { + return this._maxWidth; + } + set maxWidth(value) { + if (this._maxWidth === value) { + return; + } + this._maxWidth = value; + this.dirty = true; + } + get maxLineHeight() { + this.validate(); + return this._maxLineHeight; + } + get textWidth() { + this.validate(); + return this._textWidth; + } + get letterSpacing() { + return this._letterSpacing; + } + set letterSpacing(value) { + if (this._letterSpacing !== value) { + this._letterSpacing = value; + this.dirty = true; + } + } + get roundPixels() { + return this._roundPixels; + } + set roundPixels(value) { + if (value !== this._roundPixels) { + this._roundPixels = value; + this.dirty = true; + } + } + get textHeight() { + this.validate(); + return this._textHeight; + } + get resolution() { + return this._resolution; + } + set resolution(value) { + this._autoResolution = false; + if (this._resolution === value) { + return; + } + this._resolution = value; + this.dirty = true; + } + destroy(options) { + const { _textureCache } = this; + const data = BitmapFont.available[this._fontName]; + const pageMeshDataPool = data.distanceFieldType === "none" ? pageMeshDataDefaultPageMeshData : pageMeshDataMSDFPageMeshData; + pageMeshDataPool.push(...this._activePagesMeshData); + for (const pageMeshData of this._activePagesMeshData) { + this.removeChild(pageMeshData.mesh); + } + this._activePagesMeshData = []; + pageMeshDataPool.filter((page) => _textureCache[page.mesh.texture.baseTexture.uid]).forEach((page) => { + page.mesh.texture = Texture.EMPTY; + }); + for (const id in _textureCache) { + const texture = _textureCache[id]; + texture.destroy(); + delete _textureCache[id]; + } + this._font = null; + this._tintColor = null; + this._textureCache = null; + super.destroy(options); + } + }; + let BitmapText = _BitmapText; + BitmapText.styleDefaults = { + align: "left", + tint: 16777215, + maxWidth: 0, + letterSpacing: 0 + }; + + const validExtensions = [".xml", ".fnt"]; + const loadBitmapFont = { + extension: { + type: ExtensionType.LoadParser, + priority: LoaderParserPriority.Normal + }, + name: "loadBitmapFont", + test(url) { + return validExtensions.includes(path.extname(url).toLowerCase()); + }, + async testParse(data) { + return TextFormat.test(data) || XMLStringFormat.test(data); + }, + async parse(asset, data, loader) { + const fontData = TextFormat.test(asset) ? TextFormat.parse(asset) : XMLStringFormat.parse(asset); + const { src } = data; + const { page: pages } = fontData; + const textureUrls = []; + for (let i = 0; i < pages.length; ++i) { + const pageFile = pages[i].file; + let imagePath = path.join(path.dirname(src), pageFile); + imagePath = copySearchParams(imagePath, src); + textureUrls.push(imagePath); + } + const loadedTextures = await loader.load(textureUrls); + const textures = textureUrls.map((url) => loadedTextures[url]); + return BitmapFont.install(fontData, textures, true); + }, + async load(url, _options) { + const response = await settings.ADAPTER.fetch(url); + return response.text(); + }, + unload(bitmapFont) { + bitmapFont.destroy(); + } + }; + extensions$1.add(loadBitmapFont); + + const _HTMLTextStyle = class extends TextStyle { + constructor() { + super(...arguments); + this._fonts = []; + this._overrides = []; + this._stylesheet = ""; + this.fontsDirty = false; + } + static from(originalStyle) { + return new _HTMLTextStyle(Object.keys(_HTMLTextStyle.defaultOptions).reduce((obj, prop) => ({ ...obj, [prop]: originalStyle[prop] }), {})); + } + cleanFonts() { + if (this._fonts.length > 0) { + this._fonts.forEach((font) => { + URL.revokeObjectURL(font.src); + font.refs--; + if (font.refs === 0) { + if (font.fontFace) { + document.fonts.delete(font.fontFace); + } + delete _HTMLTextStyle.availableFonts[font.originalUrl]; + } + }); + this.fontFamily = "Arial"; + this._fonts.length = 0; + this.styleID++; + this.fontsDirty = true; + } + } + loadFont(url, options = {}) { + const { availableFonts } = _HTMLTextStyle; + if (availableFonts[url]) { + const font = availableFonts[url]; + this._fonts.push(font); + font.refs++; + this.styleID++; + this.fontsDirty = true; + return Promise.resolve(); + } + return settings.ADAPTER.fetch(url).then((response) => response.blob()).then(async (blob) => new Promise((resolve, reject) => { + const src = URL.createObjectURL(blob); + const reader = new FileReader(); + reader.onload = () => resolve([src, reader.result]); + reader.onerror = reject; + reader.readAsDataURL(blob); + })).then(async ([src, dataSrc]) => { + const font = Object.assign({ + family: path.basename(url, path.extname(url)), + weight: "normal", + style: "normal", + src, + dataSrc, + refs: 1, + originalUrl: url, + fontFace: null + }, options); + availableFonts[url] = font; + this._fonts.push(font); + this.styleID++; + const fontFace = new FontFace(font.family, `url(${font.src})`, { + weight: font.weight, + style: font.style + }); + font.fontFace = fontFace; + await fontFace.load(); + document.fonts.add(fontFace); + await document.fonts.ready; + this.styleID++; + this.fontsDirty = true; + }); + } + addOverride(...value) { + const toAdd = value.filter((v) => !this._overrides.includes(v)); + if (toAdd.length > 0) { + this._overrides.push(...toAdd); + this.styleID++; + } + } + removeOverride(...value) { + const toRemove = value.filter((v) => this._overrides.includes(v)); + if (toRemove.length > 0) { + this._overrides = this._overrides.filter((v) => !toRemove.includes(v)); + this.styleID++; + } + } + toCSS(scale) { + return [ + `transform: scale(${scale})`, + `transform-origin: top left`, + "display: inline-block", + `color: ${this.normalizeColor(this.fill)}`, + `font-size: ${this.fontSize}px`, + `font-family: ${this.fontFamily}`, + `font-weight: ${this.fontWeight}`, + `font-style: ${this.fontStyle}`, + `font-variant: ${this.fontVariant}`, + `letter-spacing: ${this.letterSpacing}px`, + `text-align: ${this.align}`, + `padding: ${this.padding}px`, + `white-space: ${this.whiteSpace}`, + ...this.lineHeight ? [`line-height: ${this.lineHeight}px`] : [], + ...this.wordWrap ? [ + `word-wrap: ${this.breakWords ? "break-all" : "break-word"}`, + `max-width: ${this.wordWrapWidth}px` + ] : [], + ...this.strokeThickness ? [ + `-webkit-text-stroke-width: ${this.strokeThickness}px`, + `-webkit-text-stroke-color: ${this.normalizeColor(this.stroke)}`, + `text-stroke-width: ${this.strokeThickness}px`, + `text-stroke-color: ${this.normalizeColor(this.stroke)}`, + "paint-order: stroke" + ] : [], + ...this.dropShadow ? [this.dropShadowToCSS()] : [], + ...this._overrides + ].join(";"); + } + toGlobalCSS() { + return this._fonts.reduce((result, font) => `${result} + @font-face { + font-family: "${font.family}"; + src: url('${font.dataSrc}'); + font-weight: ${font.weight}; + font-style: ${font.style}; + }`, this._stylesheet); + } + get stylesheet() { + return this._stylesheet; + } + set stylesheet(value) { + if (this._stylesheet !== value) { + this._stylesheet = value; + this.styleID++; + } + } + normalizeColor(color) { + if (Array.isArray(color)) { + color = rgb2hex(color); + } + if (typeof color === "number") { + return hex2string(color); + } + return color; + } + dropShadowToCSS() { + let color = this.normalizeColor(this.dropShadowColor); + const alpha = this.dropShadowAlpha; + const x = Math.round(Math.cos(this.dropShadowAngle) * this.dropShadowDistance); + const y = Math.round(Math.sin(this.dropShadowAngle) * this.dropShadowDistance); + if (color.startsWith("#") && alpha < 1) { + color += (alpha * 255 | 0).toString(16).padStart(2, "0"); + } + const position = `${x}px ${y}px`; + if (this.dropShadowBlur > 0) { + return `text-shadow: ${position} ${this.dropShadowBlur}px ${color}`; + } + return `text-shadow: ${position} ${color}`; + } + reset() { + Object.assign(this, _HTMLTextStyle.defaultOptions); + } + onBeforeDraw() { + const { fontsDirty: prevFontsDirty } = this; + this.fontsDirty = false; + if (this.isSafari && this._fonts.length > 0 && prevFontsDirty) { + return new Promise((resolve) => setTimeout(resolve, 100)); + } + return Promise.resolve(); + } + get isSafari() { + const { userAgent } = settings.ADAPTER.getNavigator(); + return /^((?!chrome|android).)*safari/i.test(userAgent); + } + set fillGradientStops(_value) { + console.warn("[HTMLTextStyle] fillGradientStops is not supported by HTMLText"); + } + get fillGradientStops() { + return super.fillGradientStops; + } + set fillGradientType(_value) { + console.warn("[HTMLTextStyle] fillGradientType is not supported by HTMLText"); + } + get fillGradientType() { + return super.fillGradientType; + } + set miterLimit(_value) { + console.warn("[HTMLTextStyle] miterLimit is not supported by HTMLText"); + } + get miterLimit() { + return super.miterLimit; + } + set trim(_value) { + console.warn("[HTMLTextStyle] trim is not supported by HTMLText"); + } + get trim() { + return super.trim; + } + set textBaseline(_value) { + console.warn("[HTMLTextStyle] textBaseline is not supported by HTMLText"); + } + get textBaseline() { + return super.textBaseline; + } + set leading(_value) { + console.warn("[HTMLTextStyle] leading is not supported by HTMLText"); + } + get leading() { + return super.leading; + } + set lineJoin(_value) { + console.warn("[HTMLTextStyle] lineJoin is not supported by HTMLText"); + } + get lineJoin() { + return super.lineJoin; + } + }; + let HTMLTextStyle = _HTMLTextStyle; + HTMLTextStyle.availableFonts = {}; + HTMLTextStyle.defaultOptions = { + align: "left", + breakWords: false, + dropShadow: false, + dropShadowAlpha: 1, + dropShadowAngle: Math.PI / 6, + dropShadowBlur: 0, + dropShadowColor: "black", + dropShadowDistance: 5, + fill: "black", + fontFamily: "Arial", + fontSize: 26, + fontStyle: "normal", + fontVariant: "normal", + fontWeight: "normal", + letterSpacing: 0, + lineHeight: 0, + padding: 0, + stroke: "black", + strokeThickness: 0, + whiteSpace: "normal", + wordWrap: false, + wordWrapWidth: 100 + }; + + const _HTMLText = class extends Sprite { + constructor(text = "", style = {}) { + super(Texture.EMPTY); + this._text = null; + this._style = null; + this._autoResolution = true; + this._loading = false; + this.localStyleID = -1; + this.dirty = false; + this.ownsStyle = false; + const image = new Image(); + const texture = Texture.from(image, { + scaleMode: settings.SCALE_MODE, + resourceOptions: { + autoLoad: false + } + }); + texture.orig = new Rectangle(); + texture.trim = new Rectangle(); + this.texture = texture; + const nssvg = "http://www.w3.org/2000/svg"; + const nsxhtml = "http://www.w3.org/1999/xhtml"; + const svgRoot = document.createElementNS(nssvg, "svg"); + const foreignObject = document.createElementNS(nssvg, "foreignObject"); + const domElement = document.createElementNS(nsxhtml, "div"); + const styleElement = document.createElementNS(nsxhtml, "style"); + foreignObject.setAttribute("width", "10000"); + foreignObject.setAttribute("height", "10000"); + foreignObject.style.overflow = "hidden"; + svgRoot.appendChild(foreignObject); + this.maxWidth = _HTMLText.defaultMaxWidth; + this.maxHeight = _HTMLText.defaultMaxHeight; + this._domElement = domElement; + this._styleElement = styleElement; + this._svgRoot = svgRoot; + this._foreignObject = foreignObject; + this._foreignObject.appendChild(styleElement); + this._foreignObject.appendChild(domElement); + this._image = image; + this._loadImage = new Image(); + this._autoResolution = _HTMLText.defaultAutoResolution; + this._resolution = _HTMLText.defaultResolution ?? settings.RESOLUTION; + this.text = text; + this.style = style; + } + measureText(overrides) { + const { text, style, resolution } = Object.assign({ + text: this._text, + style: this._style, + resolution: this._resolution + }, overrides); + Object.assign(this._domElement, { + innerHTML: text, + style: style.toCSS(resolution) + }); + this._styleElement.textContent = style.toGlobalCSS(); + document.body.appendChild(this._svgRoot); + const contentBounds = this._domElement.getBoundingClientRect(); + this._svgRoot.remove(); + const contentWidth = Math.min(this.maxWidth, Math.ceil(contentBounds.width)); + const contentHeight = Math.min(this.maxHeight, Math.ceil(contentBounds.height)); + this._svgRoot.setAttribute("width", contentWidth.toString()); + this._svgRoot.setAttribute("height", contentHeight.toString()); + if (text !== this._text) { + this._domElement.innerHTML = this._text; + } + if (style !== this._style) { + Object.assign(this._domElement, { style: this._style?.toCSS(resolution) }); + this._styleElement.textContent = this._style?.toGlobalCSS(); + } + return { + width: contentWidth + style.padding * 2, + height: contentHeight + style.padding * 2 + }; + } + async updateText(respectDirty = true) { + const { style, _image: image, _loadImage: loadImage } = this; + if (this.localStyleID !== style.styleID) { + this.dirty = true; + this.localStyleID = style.styleID; + } + if (!this.dirty && respectDirty) { + return; + } + const { width, height } = this.measureText(); + image.width = loadImage.width = Math.ceil(Math.max(1, width)); + image.height = loadImage.height = Math.ceil(Math.max(1, height)); + if (!this._loading) { + this._loading = true; + await new Promise((resolve) => { + loadImage.onload = async () => { + await style.onBeforeDraw(); + this._loading = false; + image.src = loadImage.src; + loadImage.onload = null; + loadImage.src = ""; + this.updateTexture(); + resolve(); + }; + const svgURL = new XMLSerializer().serializeToString(this._svgRoot); + loadImage.src = `data:image/svg+xml;charset=utf8,${encodeURIComponent(svgURL)}`; + }); + } + } + get source() { + return this._image; + } + updateTexture() { + const { style, texture, _image: image, resolution } = this; + const { padding } = style; + const { baseTexture } = texture; + texture.trim.width = texture._frame.width = image.width / resolution; + texture.trim.height = texture._frame.height = image.height / resolution; + texture.trim.x = -padding; + texture.trim.y = -padding; + texture.orig.width = texture._frame.width - padding * 2; + texture.orig.height = texture._frame.height - padding * 2; + this._onTextureUpdate(); + baseTexture.setRealSize(image.width, image.height, resolution); + this.dirty = false; + } + _render(renderer) { + if (this._autoResolution && this._resolution !== renderer.resolution) { + this._resolution = renderer.resolution; + this.dirty = true; + } + this.updateText(true); + super._render(renderer); + } + _renderCanvas(renderer) { + if (this._autoResolution && this._resolution !== renderer.resolution) { + this._resolution = renderer.resolution; + this.dirty = true; + } + this.updateText(true); + super._renderCanvas(renderer); + } + getLocalBounds(rect) { + this.updateText(true); + return super.getLocalBounds(rect); + } + _calculateBounds() { + this.updateText(true); + this.calculateVertices(); + this._bounds.addQuad(this.vertexData); + } + _onStyleChange() { + this.dirty = true; + } + destroy(options) { + if (typeof options === "boolean") { + options = { children: options }; + } + options = Object.assign({}, _HTMLText.defaultDestroyOptions, options); + super.destroy(options); + const forceClear = null; + if (this.ownsStyle) { + this._style?.cleanFonts(); + } + this._style = forceClear; + this._svgRoot?.remove(); + this._svgRoot = forceClear; + this._domElement?.remove(); + this._domElement = forceClear; + this._foreignObject?.remove(); + this._foreignObject = forceClear; + this._styleElement?.remove(); + this._styleElement = forceClear; + this._loadImage.src = ""; + this._loadImage.onload = null; + this._loadImage = forceClear; + this._image.src = ""; + this._image = forceClear; + } + get width() { + this.updateText(true); + return Math.abs(this.scale.x) * this._image.width / this.resolution; + } + set width(value) { + this.updateText(true); + const s = sign(this.scale.x) || 1; + this.scale.x = s * value / this._image.width / this.resolution; + this._width = value; + } + get height() { + this.updateText(true); + return Math.abs(this.scale.y) * this._image.height / this.resolution; + } + set height(value) { + this.updateText(true); + const s = sign(this.scale.y) || 1; + this.scale.y = s * value / this._image.height / this.resolution; + this._height = value; + } + get style() { + return this._style; + } + set style(style) { + if (this._style === style) { + return; + } + style = style || {}; + if (style instanceof HTMLTextStyle) { + this.ownsStyle = false; + this._style = style; + } else if (style instanceof TextStyle) { + console.warn("[HTMLText] Cloning TextStyle, if this is not what you want, use HTMLTextStyle"); + this.ownsStyle = true; + this._style = HTMLTextStyle.from(style); + } else { + this.ownsStyle = true; + this._style = new HTMLTextStyle(style); + } + this.localStyleID = -1; + this.dirty = true; + } + get text() { + return this._text; + } + set text(text) { + text = String(text === "" || text === null || text === void 0 ? " " : text); + text = this.sanitiseText(text); + if (this._text === text) { + return; + } + this._text = text; + this.dirty = true; + } + get resolution() { + return this._resolution; + } + set resolution(value) { + this._autoResolution = false; + if (this._resolution === value) { + return; + } + this._resolution = value; + this.dirty = true; + } + sanitiseText(text) { + return text.replace(/

/gi, "
").replace(/
/gi, "
").replace(/ /gi, " "); + } + }; + let HTMLText = _HTMLText; + HTMLText.defaultDestroyOptions = { + texture: true, + children: false, + baseTexture: true + }; + HTMLText.defaultMaxWidth = 2024; + HTMLText.defaultMaxHeight = 2024; + HTMLText.defaultAutoResolution = true; + + exports.ALPHA_MODES = ALPHA_MODES; + exports.AbstractMultiResource = AbstractMultiResource; + exports.AccessibilityManager = AccessibilityManager; + exports.AlphaFilter = AlphaFilter; + exports.AnimatedSprite = AnimatedSprite; + exports.Application = Application; + exports.ArrayResource = ArrayResource; + exports.Assets = Assets; + exports.AssetsClass = AssetsClass; + exports.Attribute = Attribute; + exports.BLEND_MODES = BLEND_MODES; + exports.BUFFER_BITS = BUFFER_BITS; + exports.BUFFER_TYPE = BUFFER_TYPE; + exports.BackgroundSystem = BackgroundSystem; + exports.BaseImageResource = BaseImageResource; + exports.BasePrepare = BasePrepare; + exports.BaseRenderTexture = BaseRenderTexture; + exports.BaseTexture = BaseTexture; + exports.BatchDrawCall = BatchDrawCall; + exports.BatchGeometry = BatchGeometry; + exports.BatchRenderer = BatchRenderer; + exports.BatchShaderGenerator = BatchShaderGenerator; + exports.BatchSystem = BatchSystem; + exports.BatchTextureArray = BatchTextureArray; + exports.BitmapFont = BitmapFont; + exports.BitmapFontData = BitmapFontData; + exports.BitmapText = BitmapText; + exports.BlobResource = BlobResource; + exports.BlurFilter = BlurFilter; + exports.BlurFilterPass = BlurFilterPass; + exports.Bounds = Bounds; + exports.BrowserAdapter = BrowserAdapter; + exports.Buffer = Buffer; + exports.BufferResource = BufferResource; + exports.BufferSystem = BufferSystem; + exports.CLEAR_MODES = CLEAR_MODES; + exports.COLOR_MASK_BITS = COLOR_MASK_BITS; + exports.Cache = Cache; + exports.CanvasResource = CanvasResource; + exports.Circle = Circle; + exports.Color = Color; + exports.ColorMatrixFilter = ColorMatrixFilter; + exports.CompressedTextureResource = CompressedTextureResource; + exports.Container = Container; + exports.ContextSystem = ContextSystem; + exports.CountLimiter = CountLimiter; + exports.CubeResource = CubeResource; + exports.DEG_TO_RAD = DEG_TO_RAD; + exports.DRAW_MODES = DRAW_MODES; + exports.DisplacementFilter = DisplacementFilter; + exports.DisplayObject = DisplayObject; + exports.ENV = ENV; + exports.Ellipse = Ellipse; + exports.EventBoundary = EventBoundary; + exports.EventSystem = EventSystem; + exports.ExtensionType = ExtensionType; + exports.Extract = Extract; + exports.FORMATS = FORMATS; + exports.FORMATS_TO_COMPONENTS = FORMATS_TO_COMPONENTS; + exports.FXAAFilter = FXAAFilter; + exports.FederatedDisplayObject = FederatedDisplayObject; + exports.FederatedEvent = FederatedEvent; + exports.FederatedMouseEvent = FederatedMouseEvent; + exports.FederatedPointerEvent = FederatedPointerEvent; + exports.FederatedWheelEvent = FederatedWheelEvent; + exports.FillStyle = FillStyle; + exports.Filter = Filter; + exports.FilterState = FilterState; + exports.FilterSystem = FilterSystem; + exports.Framebuffer = Framebuffer; + exports.FramebufferSystem = FramebufferSystem; + exports.GC_MODES = GC_MODES; + exports.GLFramebuffer = GLFramebuffer; + exports.GLProgram = GLProgram; + exports.GLTexture = GLTexture; + exports.GRAPHICS_CURVES = GRAPHICS_CURVES; + exports.GenerateTextureSystem = GenerateTextureSystem; + exports.Geometry = Geometry; + exports.GeometrySystem = GeometrySystem; + exports.Graphics = Graphics; + exports.GraphicsData = GraphicsData; + exports.GraphicsGeometry = GraphicsGeometry; + exports.HTMLText = HTMLText; + exports.HTMLTextStyle = HTMLTextStyle; + exports.IGLUniformData = IGLUniformData; + exports.INSTALLED = INSTALLED; + exports.INTERNAL_FORMATS = INTERNAL_FORMATS; + exports.INTERNAL_FORMAT_TO_BYTES_PER_PIXEL = INTERNAL_FORMAT_TO_BYTES_PER_PIXEL; + exports.ImageBitmapResource = ImageBitmapResource; + exports.ImageResource = ImageResource; + exports.LINE_CAP = LINE_CAP; + exports.LINE_JOIN = LINE_JOIN; + exports.LineStyle = LineStyle; + exports.LoaderParserPriority = LoaderParserPriority; + exports.MASK_TYPES = MASK_TYPES; + exports.MIPMAP_MODES = MIPMAP_MODES; + exports.MSAA_QUALITY = MSAA_QUALITY; + exports.MaskData = MaskData; + exports.MaskSystem = MaskSystem; + exports.Matrix = Matrix; + exports.Mesh = Mesh; + exports.MeshBatchUvs = MeshBatchUvs; + exports.MeshGeometry = MeshGeometry; + exports.MeshMaterial = MeshMaterial; + exports.MultisampleSystem = MultisampleSystem; + exports.NineSlicePlane = NineSlicePlane; + exports.NoiseFilter = NoiseFilter; + exports.ObjectRenderer = ObjectRenderer; + exports.ObjectRendererSystem = ObjectRendererSystem; + exports.ObservablePoint = ObservablePoint; + exports.PI_2 = PI_2; + exports.PRECISION = PRECISION; + exports.ParticleContainer = ParticleContainer; + exports.ParticleRenderer = ParticleRenderer; + exports.PlaneGeometry = PlaneGeometry; + exports.PluginSystem = PluginSystem; + exports.Point = Point; + exports.Polygon = Polygon; + exports.Prepare = Prepare; + exports.Program = Program; + exports.ProjectionSystem = ProjectionSystem; + exports.Quad = Quad; + exports.QuadUv = QuadUv; + exports.RAD_TO_DEG = RAD_TO_DEG; + exports.RENDERER_TYPE = RENDERER_TYPE; + exports.Rectangle = Rectangle; + exports.RenderTexture = RenderTexture; + exports.RenderTexturePool = RenderTexturePool; + exports.RenderTextureSystem = RenderTextureSystem; + exports.Renderer = Renderer; + exports.ResizePlugin = ResizePlugin; + exports.Resource = Resource; + exports.RopeGeometry = RopeGeometry; + exports.RoundedRectangle = RoundedRectangle; + exports.Runner = Runner; + exports.SAMPLER_TYPES = SAMPLER_TYPES; + exports.SCALE_MODES = SCALE_MODES; + exports.SHAPES = SHAPES; + exports.SVGResource = SVGResource; + exports.ScissorSystem = ScissorSystem; + exports.Shader = Shader; + exports.ShaderSystem = ShaderSystem; + exports.SimpleMesh = SimpleMesh; + exports.SimplePlane = SimplePlane; + exports.SimpleRope = SimpleRope; + exports.Sprite = Sprite; + exports.SpriteMaskFilter = SpriteMaskFilter; + exports.Spritesheet = Spritesheet; + exports.StartupSystem = StartupSystem; + exports.State = State; + exports.StateSystem = StateSystem; + exports.StencilSystem = StencilSystem; + exports.SystemManager = SystemManager; + exports.TARGETS = TARGETS; + exports.TEXT_GRADIENT = TEXT_GRADIENT; + exports.TYPES = TYPES; + exports.TYPES_TO_BYTES_PER_COMPONENT = TYPES_TO_BYTES_PER_COMPONENT; + exports.TYPES_TO_BYTES_PER_PIXEL = TYPES_TO_BYTES_PER_PIXEL; + exports.TemporaryDisplayObject = TemporaryDisplayObject; + exports.Text = Text; + exports.TextFormat = TextFormat; + exports.TextMetrics = TextMetrics; + exports.TextStyle = TextStyle; + exports.Texture = Texture; + exports.TextureGCSystem = TextureGCSystem; + exports.TextureMatrix = TextureMatrix; + exports.TextureSystem = TextureSystem; + exports.TextureUvs = TextureUvs; + exports.Ticker = Ticker; + exports.TickerPlugin = TickerPlugin; + exports.TilingSprite = TilingSprite; + exports.TilingSpriteRenderer = TilingSpriteRenderer; + exports.TimeLimiter = TimeLimiter; + exports.Transform = Transform; + exports.TransformFeedback = TransformFeedback; + exports.TransformFeedbackSystem = TransformFeedbackSystem; + exports.UPDATE_PRIORITY = UPDATE_PRIORITY; + exports.UniformGroup = UniformGroup; + exports.VERSION = VERSION; + exports.VideoResource = VideoResource; + exports.ViewSystem = ViewSystem; + exports.ViewableBuffer = ViewableBuffer; + exports.WRAP_MODES = WRAP_MODES; + exports.XMLFormat = XMLFormat; + exports.XMLStringFormat = XMLStringFormat; + exports.accessibleTarget = accessibleTarget; + exports.autoDetectFormat = autoDetectFormat; + exports.autoDetectRenderer = autoDetectRenderer; + exports.autoDetectResource = autoDetectResource; + exports.cacheTextureArray = cacheTextureArray; + exports.checkDataUrl = checkDataUrl; + exports.checkExtension = checkExtension; + exports.checkMaxIfStatementsInShader = checkMaxIfStatementsInShader; + exports.convertToList = convertToList; + exports.copySearchParams = copySearchParams; + exports.createStringVariations = createStringVariations; + exports.createTexture = createTexture; + exports.createUBOElements = createUBOElements; + exports.curves = curves; + exports.defaultFilterVertex = defaultFilterVertex; + exports.defaultVertex = defaultVertex; + exports.detectAvif = detectAvif; + exports.detectCompressedTextures = detectCompressedTextures; + exports.detectDefaults = detectDefaults; + exports.detectWebp = detectWebp; + exports.extensions = extensions$1; + exports.filters = filters; + exports.generateProgram = generateProgram; + exports.generateUniformBufferSync = generateUniformBufferSync; + exports.getFontFamilyName = getFontFamilyName; + exports.getTestContext = getTestContext; + exports.getUBOData = getUBOData; + exports.graphicsUtils = graphicsUtils; + exports.groupD8 = groupD8; + exports.isMobile = isMobile; + exports.isSingleItem = isSingleItem; + exports.loadBitmapFont = loadBitmapFont; + exports.loadDDS = loadDDS; + exports.loadImageBitmap = loadImageBitmap; + exports.loadJson = loadJson; + exports.loadKTX = loadKTX; + exports.loadSVG = loadSVG; + exports.loadTextures = loadTextures; + exports.loadTxt = loadTxt; + exports.loadWebFont = loadWebFont; + exports.parseDDS = parseDDS; + exports.parseKTX = parseKTX; + exports.resolveCompressedTextureUrl = resolveCompressedTextureUrl; + exports.resolveTextureUrl = resolveTextureUrl; + exports.settings = settings; + exports.spritesheetAsset = spritesheetAsset; + exports.uniformParsers = uniformParsers; + exports.unsafeEvalSupported = unsafeEvalSupported; + exports.utils = index; + + Object.defineProperty(exports, '__esModule', { value: true }); + + return exports; + +})({}); +//# sourceMappingURL=pixi.js.map diff --git a/Game/src/KinkyDungeonTests.ts b/Game/src/KinkyDungeonTests.ts new file mode 100644 index 000000000..f669def24 --- /dev/null +++ b/Game/src/KinkyDungeonTests.ts @@ -0,0 +1,210 @@ +"use strict"; + +// This file is for Kinky Dungeon unit tests, run from the console + +function KDRunTests() { + KDDebug = true; + if (KDTestMapGen(100, [0, 6, 12, 18,], ['grv', 'cat', 'jng']) + && KDTestFullRunthrough(3, true, true)) { + console.log("All tests passed!"); + } + KDDebug = false; +} + +function KDTestMapGen(count: number, Ranges: number[], Checkpoints: string[]): boolean { + for (let Checkpoint of Checkpoints) { + MiniGameKinkyDungeonCheckpoint = Checkpoint; + for (let FloorRange of Ranges) + for (let f = FloorRange; f < FloorRange + KDLevelsPerCheckpoint; f++) { + console.log(`Testing floor ${f}`); + KDSetWorldSlot(0, f); + for (let i = 0; i < count; i++) { + if (i % (count/KDLevelsPerCheckpoint) == 0) + console.log(`Testing iteration ${i} on floor ${MiniGameKinkyDungeonLevel}`); + KinkyDungeonCreateMap(KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)], "", "", f, true); + let accessible = KinkyDungeonIsAccessible(KDMapData.StartPosition.x, KDMapData.StartPosition.y); + if (!accessible) { + console.log(`Error, stairs are inaccessible on iteration ${i}`); + return false; + } + } + } + } + return true; +} + + +function KDTestFullRunthrough(GameLoops: number, Init: boolean, NGP: boolean): boolean { + let EnemySpawnData = {}; + console.log("Testing full runthrough"); + if (Init) { + KDSetWorldSlot(0, 1); + MiniGameKinkyDungeonCheckpoint = "grv"; + KinkyDungeonInitialize(1); + KDInitPerks(); + } + for (let i = 0; i < KinkyDungeonMaxLevel * GameLoops; i++) { + // Run through the stairs + KinkyDungeonHandleStairs('s', true); + console.log(`Arrived at floor ${MiniGameKinkyDungeonLevel}`); + + if (!EnemySpawnData["" + MiniGameKinkyDungeonCheckpoint]) { + EnemySpawnData["" + MiniGameKinkyDungeonCheckpoint] = {}; + } + for (let e of KDMapData.Entities) { + if (EnemySpawnData["" + MiniGameKinkyDungeonCheckpoint][e.Enemy.name] == undefined) + EnemySpawnData["" + MiniGameKinkyDungeonCheckpoint][e.Enemy.name] = 1; + else EnemySpawnData["" + MiniGameKinkyDungeonCheckpoint][e.Enemy.name] += 1; + } + + if (KinkyDungeonState == "End") { + if (NGP) + KinkyDungeonNewGamePlus(); + else { + KDSetWorldSlot(0, 1); + MiniGameKinkyDungeonCheckpoint = "grv"; + KinkyDungeonState = "Game"; + } + } + + // Check various things + if (KinkyDungeonEnemies.length < 1) { + console.log(`Error, no enemies on floor ${MiniGameKinkyDungeonLevel}, iteration ${i}`); + return false; + } else if (MiniGameKinkyDungeonCheckpoint != KDDefaultJourney[Math.min(KDDefaultJourney.length - 1, Math.floor((MiniGameKinkyDungeonLevel) / KDLevelsPerCheckpoint))]) { + console.log(`Error, wrong checkpoint on floor ${MiniGameKinkyDungeonLevel}, iteration ${i}: Found ${MiniGameKinkyDungeonCheckpoint}, Checkpoint should be ${Math.floor(MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint)}`); + return false; + } + } + console.log(EnemySpawnData); + return true; +} + +function KDTestjailer(iter: number) { + let totals: any = {}; + for (let i = 0; i < iter; i++) { + KDJailEvents.spawnGuard.trigger(KinkyDungeonJailGuard(), KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (KinkyDungeonJailGuard()) { + if (!totals[KinkyDungeonJailGuard().Enemy.name]) totals[KinkyDungeonJailGuard().Enemy.name] = 1; + else totals[KinkyDungeonJailGuard().Enemy.name] = totals[KinkyDungeonJailGuard().Enemy.name] + 1; + } else { + if (!totals.null) totals.null = 1; + else totals.null = totals.null + 1; + } + KDRemoveEntity(KinkyDungeonJailGuard()); + //KDSpliceIndex(KDMapData.Entities.indexOf(KinkyDungeonJailGuard()), 1); + KDGameData.JailGuard = 0; + } + console.log(totals); +} + +async function KDExportTranslationFile(cull: boolean) { + await sleep(1000); + let file = ""; + let cache = cull ? {} : undefined; + if (cache) { + for (let i = 0; i + 1 < Object.values(TranslationCache)[0].length; i++) { + cache[Object.values(TranslationCache)[0][i + 1]] = Object.values(TranslationCache)[0][i]; + } + } + for (let c of Object.values(TextScreenCache.cache)) { + if (!cache || !cache[c]) { + file = file + '\n' + c; + file = file + '\n '; + } + + } + navigator.clipboard.writeText(file); +} + +/** + * Tests the variant item system + * @param name + */ +function KDAddTestVariant(name: string): void { + let variant = {template: name, + events:[ + {type: "ItemLight", trigger: "getLights", power: 3.5, color: "#ffff55", inheritLinked: true}, + {trigger: "tick", type: "sneakBuff", power: -1.0, inheritLinked: true}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "Illumination", color: "#ff5277", inheritLinked: true}, + {trigger: "inventoryTooltip", type: "varModifier", msg: "Evasion", power: 50, color: "#88ff88", bgcolor: "#004400"} + ]}; + KDEquipInventoryVariant(variant); +} + +function KDListMissingModels() { + let s = "The following restraints don't have models:\n"; + for (let r of KinkyDungeonRestraints) { + if (!r.Model && !r.name.includes("Template")) s = s + r.name + '\n'; + } + console.log(s); +} + +function KDCheckForMissingModelLayers() { + for (let m of Object.values(ModelDefs)) { + if (m.Layers) { + for (let l of Object.values(m.Layers)) { + if (l.Layer && !LAYERS_BASE.includes(l.Layer)) { + console.log(`Missing layer: ${l.Layer} of ${l.Name},${m.Name}`); + } + if (l.SwapLayerPose) { + for (let s of Object.values(l.SwapLayerPose)) { + if (s && !LAYERS_BASE.includes(s)) { + console.log(`Missing layer: ${s} of ${l.Name},${m.Name}`); + } + } + } + } + } + } +} + +function KDCheckForBadModels() { + for (let r of KinkyDungeonRestraints) { + if (r.Model && !ModelDefs[r.Model]) + console.log(`Missing model: ${r.Model} of ${r.name}`); + } + + for (let m of Object.values(ModelDefs)) { + let layers = m.Layers; + if (m.HideLayerGroups?.some((layergroup) => {return !LayerGroups[layergroup];})) { + console.log(`Missing HideLayerGroups: ${m.HideLayerGroups} of ${m.Name}`); + } + if (layers) { + for (let l of Object.values(layers)) { + if (l.HideOverrideLayerMulti?.some((layergroup) => {return !LayerGroups[layergroup];})) { + console.log(`Missing HideOverrideLayerMulti: ${l.HideOverrideLayerMulti} of ${l.Name},${m.Name}`); + } + if (l.ApplyFilterToLayerGroup && Object.keys(l.ApplyFilterToLayerGroup).some((layergroup) => {return !LayerGroups[layergroup];})) { + console.log(`Missing ApplyFilterToLayerGroup: ${Object.keys(l.ApplyFilterToLayerGroup)} of ${l.Name},${m.Name}`); + } + if (l.DisplaceLayers && Object.keys(l.DisplaceLayers).some((layergroup) => {return !LayerGroups[layergroup];})) { + console.log(`Missing DisplaceLayers: ${Object.keys(l.DisplaceLayers)} of ${l.Name},${m.Name}`); + } + if (l.EraseLayers && Object.keys(l.EraseLayers).some((layergroup) => {return !LayerGroups[layergroup];})) { + console.log(`Missing EraseLayers: ${Object.keys(l.EraseLayers)} of ${l.Name},${m.Name}`); + } + } + } + } +} + + +function KDGetMissingSpellNames() { + let ret = ""; + + let found = {}; + + for (let e of KinkyDungeonEnemies) { + if (e.spells) { + for (let sp of e.spells) { + if (!found[sp] && TextGet("KinkyDungeonSpell" + sp) == "KinkyDungeonSpell" + sp) { + ret = ret + "\nKinkyDungeonSpell" + sp + ',' + sp; + } + found[sp] = true; + } + } + } + + return ret; +} \ No newline at end of file diff --git a/Game/src/base/KDCustomCancel.ts b/Game/src/base/KDCustomCancel.ts new file mode 100644 index 000000000..7f80b2647 --- /dev/null +++ b/Game/src/base/KDCustomCancel.ts @@ -0,0 +1,42 @@ +interface CustomCancel { + cancel: () => void, + condition: () => boolean, +} + +let KDCustomCancels = [ + { + // Recycle + condition: () => { + return KDGameData.InventoryAction == "Recycle" && KinkyDungeonDrawState == "Inventory"; + }, + cancel: () => { + KinkyDungeonDrawState = "Facilities"; + KinkyDungeonGameKey.keyPressed[9] = false; + KinkyDungeonKeybindingCurrentKey = ''; + }, + }, + { + // Container + condition: () => { + return KinkyDungeonDrawState == "Container"; + }, + cancel: () => { + KinkyDungeonDrawState = KDUI_ContainerBackScreen || "Game"; + KinkyDungeonGameKey.keyPressed[9] = false; + KinkyDungeonKeybindingCurrentKey = ''; + }, + }, + + { + // Recycle + condition: () => { + return KinkyDungeonTargetingSpell && KinkyDungeonDrawState == "Game"; + }, + cancel: () => { + KinkyDungeonGameKey.keyPressed[9] = false; + KinkyDungeonTargetingSpell = null; + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + }, + } +]; \ No newline at end of file diff --git a/Game/src/base/KDModUtils.ts b/Game/src/base/KDModUtils.ts new file mode 100644 index 000000000..bec524c98 --- /dev/null +++ b/Game/src/base/KDModUtils.ts @@ -0,0 +1,555 @@ +'use strict'; + +/* Ensure this aligns with ModifierEnum. */ +enum KDModifierEnum { + restraint = 0, + looserestraint = 0, + weapon, + consumable, +}; + +let PostTranslationRecord: [string, string][] = []; +let MissingCSVTranslation: Record = {}; + +function addTextKey(Name: string, Text: string) { + let ct = 0; + + for (let screen of TextAllScreenCache.entries()) { + if (screen[0].includes("KinkyDungeon")) { + if (!screen[1].cache[Name]) MissingCSVTranslation[Name] = Text; + screen[1].cache[Name] = screen[1].translationcache[Text] || Text; + PostTranslationRecord.push([Name, Text]); + } else console.log("ERROR LOADING TEXT!!!"); + } + if (ct == 0) KDLoadingTextKeys[Name] = Text; +} +function deleteTextKey(Name: string) { + let ct = 0; + for (let screen of TextAllScreenCache.entries()) { + if (screen[0].includes("KinkyDungeon")) { + delete screen[1].cache[Name]; + } else console.log("ERROR LOADING TEXT!!!"); + } + if (ct == 0) delete KDLoadingTextKeys[Name]; +} + +const cloneDeep = (obj: any) => + JSON.parse(JSON.stringify(obj)); + +const defaultRestraint: restraint = { + name: undefined, + Group: undefined, + inventory: true, + power: 0, + weight: 0, + minLevel: 0, + allFloors: true, + + escapeChance: { + "Struggle": 10, + "Cut": 10, + "Remove": 10 + }, + + events: [], + enemyTags: {}, + playerTags: {}, + shrine: [], +}; + +/** + * Creates a restraint using a set of reasonable defaults and adds it to the list of restraints. + * + * @param props + * A list of restraint props to be applied. At minimum, the "name", "Group" and "Asset" props should be provided. + * + * @param [displayName] + * The name displayed to the user for the restraint. + * + * @param [flavorText] + * Text that describes the "look and feel" of the restraint. + * + * @param [functionText] + * Text that describes how the restraint operates. + * @returns The created restraint. + */ +function KinkyDungeonCreateRestraint(props: KDRestraintProps, displayName?: string, flavorText?: string, functionText?: string): restraint { + if (!props.name || !props.Group) { + throw new Error('name, Group props must be provided.'); + } + + const restraint = ({ + ...cloneDeep(defaultRestraint), + ...props + }); + + KinkyDungeonRestraints.push(restraint); + if (displayName) { + KinkyDungeonAddRestraintText(props.name, displayName, flavorText, functionText); + } + return restraint; +} + +let KDCursedVariantsCreated: Record> = {}; + +/** + * This function adds cursed variants to the restraint list + * @param Restraint - The restraint to have extra variants added onto + * @param Variants - Names of the cursed variants to apply. Must be from KDCursedVars + */ +function KinkyDungeonAddCursedVariants(Restraint: restraint, Variants: string[]): void { + for (let v of Variants) { + if (KDCursedVars[v]) { + KinkyDungeonCloneRestraint(Restraint.name, Restraint.name+v, + KDCursedVars[v].variant(Restraint, Restraint.name+v)); + if (!KDCursedVariantsCreated[Restraint.name]) KDCursedVariantsCreated[Restraint.name] = {}; + KDCursedVariantsCreated[Restraint.name][v] = KDCursedVars[v].level; + } + } +} + +/** + * Gets a list of curses applied to the item + * @param Restraint + * @param [includeOrig] - includes thje original item + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity + */ +function KinkyDungeonGetCurses(Restraint: string, includeOrig?: boolean, minLevel?: number, maxLevel?: number): string[] { + if (KDCursedVariantsCreated[Restraint]) { + let keys = Object.keys(KDCursedVariantsCreated[Restraint]).filter((key) => { + return (!minLevel || KDCursedVariantsCreated[Restraint][key] >= minLevel) + && (!maxLevel || KDCursedVariantsCreated[Restraint][key] < maxLevel); + }).map((element) => {return Restraint + element;}); + if (includeOrig) keys.push(Restraint); + return keys; + } + return []; +} + +/** + * Gets a list of curses applied to the item + * @param List + * @param Type + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity + */ +function KinkyDungeonGetVariantEffectByList(List: string | string[], Type: ModifierEnum, minLevel?: number, maxLevel?: number): string[] { + let temp = []; + if (typeof List === "string") { + List = [List]; + } + for (let l of List) { + if (KDModifierEffectVariantList[l]) { + let keys = KDModifierEffectVariantList[l].filter((key: string) => { + return (!minLevel || KDModifierEffects[key].types[Type]?.level >= minLevel) + && (!maxLevel || KDModifierEffects[key].types[Type]?.level < maxLevel); + }).map((element: any) => {return element;}); + temp.push(...keys); + } + } + return temp; +} + +/** + * Gets a list of curses applied to the item + * @param List + * @param Type + * @param item + * @param data - data + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity + * @param [positive] - for gating severity + */ +function KinkyDungeonGetVariantEffectByListWeighted ( + List: string | string[], + Type: ModifierEnum, + item: string, + data: KDModifierConditionData, + minLevel?: number, + maxLevel?: number, + positive?: PosNeutNeg +): Record +{ + let list = KinkyDungeonGetVariantEffectByList(List, Type, minLevel, maxLevel); + let ret: Record = {}; + for (let obj of list) { + if (KDModifierEffects[obj].types[Type]?.filter(item, positive, data)) + ret[obj] = KDModifierEffects[obj].types[Type].weight(item, positive, data); + } + return ret; +} + + + +/** + * Gets a list of curses applied to the item + * @param List + * @param Type + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity + */ +function KinkyDungeonGetVariantConditionByList(List: string | string[], Type: ModifierEnum, minLevel?: number, maxLevel?: number): string[] { + let temp = []; + if (typeof List === "string") { + List = [List]; + } + for (let l of List) { + if (KDModifierConditionVariantList[l]) { + let keys = KDModifierConditionVariantList[l].filter((key: string) => { + return (!minLevel || KDModifierConditions[key].types[Type]?.level >= minLevel) + && (!maxLevel || KDModifierConditions[key].types[Type]?.level < maxLevel); + }).map((element: any) => {return element;}); + temp.push(...keys); + } + } + return temp; +} + +/** + * Gets a list of curses applied to the item + * @param List + * @param Type + * @param item + * @param data - data + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity + * @param [effect_positive] - for gating severity + * @param [effect_neutral] - for gating severity + * @param [effect_negative] - for gating severity + * @returns {Record} + */ +function KinkyDungeonGetVariantConditionByListWeighted ( + List: string | string[], + Type: ModifierEnum, + item: string, + data: KDModifierConditionData, + minLevel?: number, + maxLevel?: number, + effect_positive?: KDModifierEffect[], + effect_neutral?: KDModifierEffect[], + effect_negative?: KDModifierEffect[] +): Record +{ + let list = KinkyDungeonGetVariantConditionByList(List, Type, minLevel, maxLevel); + let ret: Record = {}; + for (let obj of list) { + if (KDModifierConditions[obj].types[Type]?.filter(item, effect_positive, effect_neutral, effect_negative, data)) + ret[obj] = KDModifierConditions[obj].types[Type].weight(item, effect_positive, effect_neutral, effect_negative, data); + } + return ret; +} + +/** + * @param ListEffect + * @param ListCondition + * @param Type + * @param item + * @param minLevel + * @param maxLevel + * @param pos + * @param data - data + */ +function KDGenerateEffectConditionPair ( + ListEffect: string | string[], + ListCondition: string | string[], + Type: ModifierEnum, + item: string, + minLevel: number, + maxLevel: number, + pos: PosNeutNeg, + data: KDModifierConditionData +): KinkyDungeonEvent[] +{ + let effect = KDGetByWeight(KinkyDungeonGetVariantEffectByListWeighted(ListEffect, Type, item, data, minLevel, maxLevel, pos)); + let epo = []; + let enu = []; + let eng = []; + if (KDModifierEffects[effect]) { + if (pos == PosNeutNeg.positive) epo.push(KDModifierEffects[effect]); + if (pos == PosNeutNeg.neutral) enu.push(KDModifierEffects[effect]); + if (pos == PosNeutNeg.negative) eng.push(KDModifierEffects[effect]); + } else return null; + if (KDModifierEffects[effect].types[Type]?.onSelect) KDModifierEffects[effect].types[Type].onSelect(item, data); + let condition = KDGetByWeight(KinkyDungeonGetVariantConditionByListWeighted(ListCondition, Type, item, data, minLevel, maxLevel, epo, enu, eng)); + if (condition) + return KDModifierConditions[condition].types[Type].events(item, epo, enu, eng, data); + return null; +} + + + + +/** + * Gets a list of curses applied to the item + * @param List + * @param [includeOrig] - includes thje original item + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity + */ +function KinkyDungeonGetHexByList(List: string | string[], includeOrig?: boolean, minLevel?: number, maxLevel?: number): string[] { + let temp = []; + if (typeof List === "string") { + List = [List]; + } + for (let l of List) { + if (KDHexVariantList[l]) { + let keys = KDHexVariantList[l].filter((key: string) => { + return (!minLevel || KDEventHexModular[key].level >= minLevel) + && (!maxLevel || KDEventHexModular[key].level < maxLevel); + }).map((element: any) => {return element;}); + temp.push(...keys); + } + } + if (includeOrig) temp.push(""); + return temp; +} + +/** + * Gets a list of curses applied to the item + * @param List + * @param item + * @param [includeOrig] - includes thje original item + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity + * @param [allHex] - for gating curse severity + */ +function KinkyDungeonGetHexByListWeighted(List: string | string[], item: string, includeOrig?: boolean, minLevel?: number, maxLevel?: number, allHex?: string[]): Record { + let list = KinkyDungeonGetHexByList(List, includeOrig, minLevel, maxLevel); + let ret: Record = {}; + for (let obj of list) { + ret[obj] = KDEventHexModular[obj].weight(item, allHex, {item: item}); + } + return ret; +} + +/** + * Gets a list of curses applied to the item + * @param List + * @param Type + * @param [includeOrig] - includes thje original item + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity + */ +function KinkyDungeonGetEnchantmentsByList(List: string | string[], Type: ModifierEnum, includeOrig?: boolean, minLevel?: number, maxLevel?: number): string[] { + let temp = []; + if (typeof List === "string") { + List = [List]; + } + for (let l of List) { + if (KDEnchantVariantList[l]) { + let keys = KDEnchantVariantList[l].filter((key: string) => { + return (!minLevel || KDEventEnchantmentModular[key].types[Type].level >= minLevel) + && (!maxLevel || KDEventEnchantmentModular[key].types[Type].level < maxLevel); + }).map((element: any) => {return element;}); + temp.push(...keys); + } + } + if (includeOrig) temp.push(""); + return temp; +} + +/** + * Gets a list of curses applied to the item + * @param List + * @param Type + * @param item + * @param [includeOrig] - includes thje original item + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity + * @param [allEnchant] - for gating curse severity + */ +function KinkyDungeonGetEnchantmentsByListWeighted(List: string | string[], Type: ModifierEnum, item: string, includeOrig?: boolean, minLevel?: number, maxLevel?: number, allEnchant?: string[]): Record { + let list = KinkyDungeonGetEnchantmentsByList(List, Type, includeOrig, minLevel, maxLevel); + let ret: Record = {}; + for (let obj of list) { + if (KDEventEnchantmentModular[obj].types[Type]?.filter(item, allEnchant, {item: item})) + ret[obj] = KDEventEnchantmentModular[obj].types[Type].weight(item, allEnchant, {item: item}); + } + return ret; +} + + +/** + * Gets a list of curses applied to the item + * @param List + * @param [includeOrig] - includes thje original item + * @param [minRarity] - for gating curse severity + * @param [maxRarity] - for gating curse severity + * @returns {string[]} + */ +function KinkyDungeonGetWeaponsByList(List: string | string[], includeOrig?: boolean, minRarity?: number, maxRarity?: number): string[] { + let temp = []; + if (typeof List === "string") { + List = [List]; + } + for (let l of List) { + if (KDWeaponLootList[l]) { + let keys = Object.keys(KDWeaponLootList[l]).filter((key) => { + return (!minRarity || KinkyDungeonWeapons[key]?.rarity >= minRarity) + && (!maxRarity || KinkyDungeonWeapons[key]?.rarity < maxRarity); + }).map((element) => {return element;}); + temp.push(...keys); + } + } + if (includeOrig) temp.push(""); + return temp; +} + +/** + * Gets a list of curses applied to the item + * @param WeaponList + * @param [includeOrig] - includes thje original item + * @param [minRarity] - for gating curse severity + * @param [maxRarity] - for gating curse severity + * @returns {Record} + */ +function KinkyDungeonGetWeaponsByListWeighted(WeaponList: string, includeOrig?: boolean, minRarity?: number, maxRarity?: number): Record { + let list = KinkyDungeonGetWeaponsByList(WeaponList, includeOrig, minRarity, maxRarity); + let ret: Record = {}; + for (let obj of list) { + if (obj) + ret[obj] = KDWeaponLootList[WeaponList][obj]; + else ret[obj] = 1; + } + return ret; +} + + +/** + * Gets a list of curses applied to the item + * @param List + * @param [includeOrig] - includes thje original item + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity + */ +function KinkyDungeonGetCurseByList(List: string | string[], includeOrig?: boolean, minLevel?: number, maxLevel?: number): string[] { + let temp = []; + if (typeof List === "string") { + List = [List]; + } + for (let l of List) { + if (KDCurseUnlockList[l]) { + let keys = KDCurseUnlockList[l].filter((key: string) => { + return (!minLevel || KDCurses[key].level >= minLevel) + && (!maxLevel || KDCurses[key].level < maxLevel); + }).map((element: any) => {return element;}); + temp.push(...keys); + } + } + if (includeOrig) temp.push(""); + return temp; +} + +/** + * Gets a list of curses applied to the item + * @param {string | string[]} List + * @param {string} item + * @param {boolean} [includeOrig] - includes thje original item + * @param {number} [minLevel] - for gating curse severity + * @param {number} [maxLevel] - for gating curse severity + * @returns {Record} + */ +function KinkyDungeonGetCurseByListWeighted(List: string | string[], item: string, includeOrig?: boolean, minLevel?: number, maxLevel?: number): Record { + let list = KinkyDungeonGetCurseByList(List, includeOrig, minLevel, maxLevel); + let ret: Record = {}; + for (let obj of list) { + ret[obj] = KDCurses[obj].weight(item); + } + return ret; +} + + +/** + * Creates a restraint using an existing restraint as a base and adds it to the list of restraints. + * + * @param clonedName + * The name of the restraint to be cloned. + * + * @param newName + * The name of the newly created restraint. + * + * @param props + * A list of restraint props to be applied. Anything that isn't supplied with be identical to the base object. + * + * @returns The created restraint. + */ +function KinkyDungeonCloneRestraint(clonedName: string, newName: string, props: object): restraint { + const existingRestraint = KinkyDungeonRestraints.find(restraint => restraint.name === clonedName); + + if (!existingRestraint) { + throw new Error(`No restraint named ${clonedName}.`); + } + + const newRestraint = ({ + ...cloneDeep(existingRestraint), + name: newName + }); + + Object.assign(newRestraint, props); + + KinkyDungeonRestraints.push(newRestraint); + + return newRestraint; +} + +/** + * Registers text for a named restraint. + * + * @param name + * The name of the restraint used by the system. + * + * @param displayName + * The name displayed to the user for the restraint. + * + * @param flavorText + * Text that describes the "look and feel" of the restraint. + * + * @param functionText + * Text that describes how the restraint operates. + */ +function KinkyDungeonAddRestraintText(name: string, displayName: string, flavorText: string, functionText: string): void { + const baseKey = `Restraint${name}`; + + addTextKey(baseKey, displayName); + addTextKey(`${baseKey}Desc`, flavorText); + addTextKey(`${baseKey}Desc2`, functionText); +} + +/** + * Registers text for a named restraint. + * + * @param restraint - The name of the restraint used by the system. + * @param newRestraint - The name of the new restraint used by the system. + */ +function KinkyDungeonDupeRestraintText(restraint: string, newRestraint: string): void { + const oldKey = `Restraint${restraint}`; + const baseKey = `Restraint${newRestraint}`; + + addTextKey(baseKey, TextGetKD(oldKey)); + addTextKey(`${baseKey}Desc`, TextGetKD(`${oldKey}Desc`)); + addTextKey(`${baseKey}Desc2`, TextGetKD(`${oldKey}Desc2`)); +} + + +/** + * Returns true if the player has a perk + */ +function HasPerk(perk: string): boolean { + return KinkyDungeonStatsChoice.has(perk); +} + +/** + * Gets the player entity (i.e. the NPC/special object hybrid that represents the player on the map) + */ +function KDPlayer(): entity { + return KinkyDungeonPlayerEntity; +} + +function ExportMissingCSVLines() { + let str = ""; + for (let [k,v] of Object.entries(MissingCSVTranslation)) { + str = str + k + ',"' + v + '"\n'; + } + return str; +} \ No newline at end of file diff --git a/Game/src/base/KDParticles.ts b/Game/src/base/KDParticles.ts new file mode 100644 index 000000000..31b75fbe8 --- /dev/null +++ b/Game/src/base/KDParticles.ts @@ -0,0 +1,477 @@ +'use strict'; + +let KDParticles: Map = new Map(); +let KDParticleid = 0; + +let KDParticleEmitters: Map = new Map(); +let KDParticleEmitterid = 0; + +/** + * @param x + * @param y + * @param img + * @param _type + * @param data + */ +function KDAddParticle(x: number, y: number, img: string, _type: string, data: KDParticleData): void { + if (KDParticles.size > 1000) return; + let tex = KDTex(img); + + if (tex && data) { + // Setup info... + let info = Object.assign({}, data); + Object.assign(info, { + time: 0, + lifetime: (data.lifetime || 0) + (data.lifetime_spread ? (Math.random()*data.lifetime_spread - data.lifetime_spread*0.5) : 0), + zIndex: data.zIndex || 100, + vy: data.vy + (data.vy_spread ? (Math.random()*data.vy_spread - data.vy_spread*0.5) : 0), + vx: data.vx + (data.vx_spread ? (Math.random()*data.vx_spread - data.vx_spread*0.5) : 0), + scale: data.scale || 1, + scale_delta: data.scale_delta || 0, + sin_y: data.sin_y + (data.sin_y_spread ? (Math.random()*data.sin_y_spread - data.sin_y_spread*0.5) : 0), + sin_x: data.sin_x + (data.sin_x_spread ? (Math.random()*data.sin_x_spread - data.sin_x_spread*0.5) : 0), + sin_period: data.sin_period + (data.sin_period_spread ? (Math.random()*data.sin_period_spread - data.sin_period_spread*0.5) : 0), + phase: data.phase || 0, + }); + // Create the sprite + let sprite = PIXI.Sprite.from(tex); + sprite.position.x = x; + sprite.position.y = y; + sprite.zIndex = info.zIndex; + + if (info.scale != 1 || info.scale_delta) { + sprite.scale.x = info.scale; + sprite.scale.y = info.scale; + } + + if (info.fadeEase) { + switch (info.fadeEase) { + case "invcos": {sprite.alpha = Math.min(1, Math.max(0, 1 - Math.cos(2 * Math.PI * info.time / info.lifetime)));} + } + } + + KDParticles.set(KDParticleid, {info: info, sprite: sprite}); + kdparticles.addChild(sprite); + + KDParticleid += 1; + if (KDParticleid > 4000000000) KDParticleid = 0; + } +} + + +/** + * @param x + * @param y + * @param img + * @param imgemitted + * @param type + * @param emitter + * @param emitted + */ +function KDAddParticleEmitter(x: number, y: number, img: string, imgemitted: string, type: string, emitter: KDParticleEmitterData, emitted: KDParticleData): void { + if (KDParticleEmitters.size > 1000) return; + let tex = KDTex(img); + + if (tex && emitted && emitter) { + let emitterinfo = Object.assign({}, emitter); + Object.assign(emitterinfo, { + time: 0, + lifetime: (emitter.lifetime || 0) + (emitter.lifetime_spread ? (Math.random()*emitter.lifetime_spread - emitter.lifetime_spread*0.5) : 0), + zIndex: emitter.zIndex || 100, + vy: emitter.vy + (emitter.vy_spread ? (Math.random()*emitter.vy_spread - emitter.vy_spread*0.5) : 0), + vx: emitter.vx + (emitter.vx_spread ? (Math.random()*emitter.vx_spread - emitter.vx_spread*0.5) : 0), + scale: emitter.scale || 1, + scale_delta: emitter.scale_delta || 0, + sin_y: emitter.sin_y + (emitter.sin_y_spread ? (Math.random()*emitter.sin_y_spread - emitter.sin_y_spread*0.5) : 0), + sin_x: emitter.sin_x + (emitter.sin_x_spread ? (Math.random()*emitter.sin_x_spread - emitter.sin_x_spread*0.5) : 0), + sin_period: emitter.sin_period + (emitter.sin_period_spread ? (Math.random()*emitter.sin_period_spread - emitter.sin_period_spread*0.5) : 0), + phase: emitter.phase || 0, + cd: emitter.cd || 0, + rate: emitter.rate, + }); + + // Create the sprite + let sprite = PIXI.Sprite.from(tex); + sprite.position.x = x; + sprite.position.y = y; + sprite.zIndex = emitterinfo.zIndex; + + if (emitterinfo.scale != 1 || emitterinfo.scale_delta) { + sprite.scale.x = emitterinfo.scale; + sprite.scale.y = emitterinfo.scale; + } + + if (emitterinfo.fadeEase) { + switch (emitterinfo.fadeEase) { + case "invcos": {sprite.alpha = Math.min(1, Math.max(0, 1 - Math.cos(2 * Math.PI * emitterinfo.time / emitterinfo.lifetime)));} + } + } + + KDParticleEmitters.set(KDParticleEmitterid, {emitter: emitterinfo, emitted: emitted, sprite: sprite, type: type, img: imgemitted}); + + KDParticleEmitterid += 1; + if (KDParticleEmitterid > 4000000000) KDParticleEmitterid = 0; + } +} + + +function KDUpdateParticles(delta: number) { + let id = 0; + let info: KDParticleData = null; + let sprite = null; + for (let particle of KDParticles.entries()) { + id = particle[0].valueOf(); + info = particle[1].info; + sprite = particle[1].sprite; + + if (info.camX != undefined && KinkyDungeonCamXVis != info.camX) { + sprite.position.x -= (KinkyDungeonCamXVis - info.camX) * KinkyDungeonGridSizeDisplay; + info.camX = KinkyDungeonCamXVis; + } + if (info.camY != undefined && KinkyDungeonCamYVis != info.camY) { + sprite.position.y -= (KinkyDungeonCamYVis - info.camY) * KinkyDungeonGridSizeDisplay; + info.camY = KinkyDungeonCamYVis; + } + + sprite.anchor.set(0.5); + + if ((info.rotation || info.rotation_spread) && !sprite.rotation) sprite.rotation = (info.rotation || 0) + (info.rotation_spread || 0) * (2 * KDRandom() - 1); + + if (info.vy) {sprite.position.y += info.vy * delta;} + if (info.vx) {sprite.position.x += info.vx * delta;} + + if (info.sin_x && info.sin_period) {sprite.position.x += info.sin_x * Math.sin(info.phase + info.sin_period * info.time / info.lifetime) * delta;} + if (info.sin_y && info.sin_period) {sprite.position.y += info.sin_y * Math.sin(info.phase + info.sin_period * info.time / info.lifetime) * delta;} + + if (info.fadeEase) { + switch (info.fadeEase) { + case "invcos": {sprite.alpha = Math.min(1, Math.max(0, 1 - Math.cos(2 * Math.PI * info.time / info.lifetime)));} + } + } + + if (info.scale != 1 || info.scale_delta) { + sprite.scale.x = info.scale; + sprite.scale.y = info.scale; + info.scale += delta * info.scale_delta; + } + + info.time += delta; + if (!info.lifetime || info.time > info.lifetime) { + KDRemoveParticle(id); + } + } + + + let emitter: KDParticleEmitterData = null; + for (let particle of KDParticleEmitters.entries()) { + id = particle[0].valueOf(); + emitter = particle[1].emitter; + sprite = particle[1].sprite; + + if (emitter.camX != undefined && KinkyDungeonCamXVis != emitter.camX) { + sprite.position.x -= (KinkyDungeonCamXVis - emitter.camX) * KinkyDungeonGridSizeDisplay; + emitter.camX = KinkyDungeonCamXVis; + } + if (emitter.camY != undefined && KinkyDungeonCamYVis != emitter.camY) { + sprite.position.y -= (KinkyDungeonCamYVis - emitter.camY) * KinkyDungeonGridSizeDisplay; + emitter.camY = KinkyDungeonCamYVis; + } + + + if (emitter.rotation && !sprite.rotation) sprite.rotation = emitter.rotation + (emitter.rotation_spread || 0) * (2 * KDRandom() - 1); + + if (emitter.vy) {sprite.position.y += emitter.vy * delta;} + if (emitter.vx) {sprite.position.x += emitter.vx * delta;} + + if (emitter.sin_x && emitter.sin_period) {sprite.position.x += emitter.sin_x * Math.sin(emitter.phase + emitter.sin_period * emitter.time / emitter.lifetime) * delta;} + if (emitter.sin_y && emitter.sin_period) {sprite.position.y += emitter.sin_y * Math.sin(emitter.phase + emitter.sin_period * emitter.time / emitter.lifetime) * delta;} + + if (emitter.fadeEase) { + switch (emitter.fadeEase) { + case "invcos": {sprite.alpha = Math.min(1, Math.max(0, 1 - Math.cos(2 * Math.PI * emitter.time / emitter.lifetime)));} + } + } + + if (emitter.scale != 1 || emitter.scale_delta) { + sprite.scale.x = emitter.scale; + sprite.scale.y = emitter.scale; + emitter.scale += delta * emitter.scale_delta; + } + + emitter.time += delta; + emitter.cd -= delta; + + if (emitter.cd < 0) { + KDAddParticle(sprite.position.x, sprite.position.y, particle[1].img, particle[1].type, particle[1].emitted); + emitter.cd = emitter.rate; + } + + if (!emitter.lifetime || emitter.time > emitter.lifetime) { + KDRemoveParticleEmitter(id); + } + } +} + +function KDRemoveParticle(id: number) { + if (KDParticles.has(id)) { + kdparticles.removeChild(KDParticles.get(id).sprite); + KDParticles.get(id).sprite.destroy(); + KDParticles.delete(id); + } +} + +function KDRemoveParticleEmitter(id: number) { + if (KDParticleEmitters.has(id)) { + kdparticles.removeChild(KDParticleEmitters.get(id).sprite); + KDParticleEmitters.get(id).sprite.destroy(); + KDParticleEmitters.delete(id); + } +} + +let lastArousalParticle = 0; +let lastVibeParticle = 0; + +/** + * Draws arousal heart particles + * @param pinkChance - 0 to 1 + * @param density - 0 to 1 + * @param purpleChance - 0 to 1 + */ +function KDDrawArousalParticles(pinkChance: number, density: number, purpleChance: number) { + if (density == 0) return; + let arousalRate = 100 / density; + + if (CommonTime() > lastArousalParticle + arousalRate) { + KDCreateArousalParticle(pinkChance, purpleChance); + + lastArousalParticle = CommonTime(); + } + +} + +function KDDrawVibeParticles(density: number) { + + let arousalRate = 100 / density; + if (StandalonePatched) arousalRate *= 2; + if (KinkyDungeonVibeLevel > 0 && CommonTime() > lastVibeParticle + 0.03 * arousalRate * (3/(3 + KinkyDungeonVibeLevel))) { + KDCreateVibeParticle(); + + lastVibeParticle = CommonTime(); + } +} + +function KDAddShockwave(x: number, y: number, size: number, spr: string = `Particles/Shockwave.png`, attachToCamera: boolean = true) { + let lifetime = 700 + size; + let data = { + time: 0, + lifetime: lifetime, + vx: 0, + vy: 0, + zIndex: 10, + phase: 0, + scale: 0.001, + scale_delta: size / 512 / lifetime, + fadeEase: "invcos", + rotation: 0, + }; + if (attachToCamera) { + data['camX'] = KinkyDungeonCamX; + data['camY'] = KinkyDungeonCamY; + } + KDAddParticle( + x, + y, + KinkyDungeonRootDirectory + spr, + undefined, data); +} + +function KDSendGagParticles(entity: entity): void { + if (!KDToggles.GagParticles) return; + if (entity?.player) { + // Player + + let lifetime = 2000; + let pos = GetHardpointLoc(KinkyDungeonPlayer, 0, 0, 1, "Mouth", KDToggles.FlipPlayer); + let x = pos.x; + let y = pos.y; + + let vxx = ((KDToggles.FlipPlayer) ? -1 : 1) * (0.15 + Math.random()*0.05); + let vyy = -.07 + Math.random() * .23; + + // Apply rotation + let vx = vxx * Math.cos(pos.angle) - vyy * Math.sin(pos.angle); + let vy = vxx * Math.sin(pos.angle) + vyy * Math.cos(pos.angle); + + KDAddParticleEmitter( + x, + y, + KinkyDungeonRootDirectory + `Aura/Null.png`, + KinkyDungeonRootDirectory + `Particles/nnn.png`, + undefined, { + time: 0, + lifetime: 1000, + vx: 0, + vy: 0, + zIndex: 60, + rotation: 0, + cd: 0, + rate: 235, + }, + { + time: 0, + lifetime: lifetime, + vx: vx, + vy: vy, + zIndex: 60, + sin_y: .1, + sin_y_spread: .02, + sin_period: 1.4, + phase: 6 * Math.random(), + fadeEase: "invcos", + rotation: 0, + rotation_spread: 0.25, + }); + + + + } else + if (entity) { + // Enemy + let x = (entity.x - KinkyDungeonCamX + 0.5) * KinkyDungeonGridSizeDisplay; + let y = (entity.y - KinkyDungeonCamY + 0.5) * KinkyDungeonGridSizeDisplay; + + let lifetime = 900; + + let vx = ((entity.flip) ? 1 : -1) * ((Math.random() < 0.7) ? 1 : -1) * (0.08 + Math.random()*0.03); + let vy = -.0215 + Math.random() * .03; + + KDAddParticleEmitter( + x, + y, + KinkyDungeonRootDirectory + `Aura/Null.png`, + KinkyDungeonRootDirectory + `Particles/nnn.png`, + undefined, { + time: 0, + lifetime: 780, + vx: 0, + vy: 0, + zIndex: 60, + rotation: 0, + cd: 0, + rate: 175, + }, + { + time: 0, + lifetime: lifetime, + vx: vx, + vy: vy, + camX: KinkyDungeonCamX, + camY: KinkyDungeonCamY, + zIndex: 60, + scale: 0.5, + sin_y: .1, + sin_y_spread: .02, + sin_period: 1.4, + phase: 6 * Math.random(), + fadeEase: "invcos", + rotation: 0, + rotation_spread: 0.25, + }); + } +} + +/** + * + */ +function KDCreateVibeParticle() { + let lifetime = 500 + Math.random() * 250; + let x = 250 - (StandalonePatched ? 5 : 0); + let Hogtied = KDIsHogtied(KinkyDungeonPlayer); + let Kneeling = KDIsKneeling(KinkyDungeonPlayer); + let y = 520 + (Hogtied ? 165 : (Kneeling ? 78 : 0)); + if (StandalonePatched) { + // Throw out in favor of new system + let pos = GetHardpointLoc(KinkyDungeonPlayer, 0, 0, 1, "Front", KDToggles.FlipPlayer); + x = pos.x; + y = pos.y; + } + + let locations = KDSumVibeLocations(); + let vx = ((Math.random() > 0.5) ? -1 : 1) * (0.1 + Math.random()*0.15); + let vy = -.15 + Math.random() * .3; + let breast = locations.includes("ItemBreast") || locations.includes("ItemNipples"); + let cli = (locations.includes("ItemVulvaPiercings") || locations.includes("ItemPelvis")); + let forceSide = 0; + if (breast || cli) { + if (cli && (locations.length == 1 || Math.random() < 0.25)) { + vy = 0.25 + Math.random()*0.1; + vx = -.05 + Math.random() * .1; + } + else if (breast && !Hogtied && (locations.length == 1 || Math.random() < 0.5)) { + if (StandalonePatched) { + if (Math.random() > 0.5) forceSide = 1; + else forceSide = -1; + let pos = forceSide > 0 ? GetHardpointLoc(KinkyDungeonPlayer, 0, 0, 1, "BreastRight", KDToggles.FlipPlayer) : GetHardpointLoc(KinkyDungeonPlayer, 0, 0, 1, "BreastLeft", KDToggles.FlipPlayer); + x = pos.x; + y = pos.y; + vx = ((Math.random() > 0.5) ? -1 : 1) * (0.05 + Math.random()*0.12); + vy = -.1 + Math.random() * .3; + if ((forceSide > 0 && vx < 0) || (forceSide < 0 && vx > 0)) vx *= -1; + } else { + y -= 155; + } + } + + } + + if (KinkyDungeonPlayer.HeightRatio) y += (100) * (1 - KinkyDungeonPlayer.HeightRatio); + if (KinkyDungeonPlayer.HeightModifier) y -= KinkyDungeonPlayer.HeightModifier; + + KDAddParticle( + x, + y, + KinkyDungeonRootDirectory + `Particles/VibeHeart.png`, + undefined, { + time: 0, + lifetime: lifetime, + vx: vx, + vy: vy, + zIndex: 60, + sin_x: .04, + sin_x_spread: .01, + sin_period: 1.4, + phase: 6 * Math.random(), + fadeEase: "invcos", + rotation: Math.atan2(vy, vx), + }); +} + +/** + * @param pinkChance - 0 to 1 + * @param purpleChance - 0 to 1 + */ +function KDCreateArousalParticle(pinkChance: number, purpleChance: number) { + let lifetime = 2000 + Math.random() * 1000; + let y = 200 + Math.random() * 700; + let xval = Math.random() < 0.5 ? 0.3 * Math.random() : (1 - 0.3 * Math.random()); + let x = xval * 500; + let vy = -0.3 * Math.min(500, y) / lifetime; + KDAddParticle( + x, + y, + KinkyDungeonRootDirectory + `Particles/${ + Math.random() < purpleChance ? "HeartPurple" : + (Math.random() < pinkChance ? "HeartPink" : "Heart") + }.png`, + undefined, { + time: 0, + lifetime: lifetime, + vy: vy, + zIndex: -1, + sin_x: .04, + sin_x_spread: .01, + sin_period: 1.4, + phase: 6 * Math.random(), + fadeEase: "invcos", + }); +} diff --git a/Game/src/base/KDRender.ts b/Game/src/base/KDRender.ts new file mode 100644 index 000000000..3b2a35af8 --- /dev/null +++ b/Game/src/base/KDRender.ts @@ -0,0 +1,27 @@ +let KDRender = { + JourneyMap: () => { + // Render the journey map + if (KDGameData.JourneyMap) { + + let X = KDGameData.JourneyX; + let Y = KDGameData.JourneyY; + KDRenderJourneyMap(X, Math.floor(Y / KDLevelsPerCheckpoint) * KDLevelsPerCheckpoint, + undefined, KDLevelsPerCheckpoint); + } + }, +}; + +let KDCustomDrawState = { + JourneyMap: (xOffset) => { + // Non choice version + if (KDGameData.JourneyMap) { + + //let X = KDGameData.JourneyX; + let Y = KDGameData.JourneyY; + KDRenderJourneyMap(0, Math.floor(Y / KDLevelsPerCheckpoint) * KDLevelsPerCheckpoint, + undefined, KDLevelsPerCheckpoint, undefined, undefined, undefined, undefined, undefined, undefined, + true, false); + KDDrawLoreRepTabs(xOffset); + } + }, +} \ No newline at end of file diff --git a/Game/src/base/KDShaders.ts b/Game/src/base/KDShaders.ts new file mode 100644 index 000000000..765defa8a --- /dev/null +++ b/Game/src/base/KDShaders.ts @@ -0,0 +1,203 @@ +'use strict'; + +let KDShaders = { + Adjust: { + code: ` + #version 300 es + in vec2 vTextureCoord; + out vec4 finalColor; + + uniform sampler2D uTexture; + uniform float uGamma; + uniform float uContrast; + uniform float uSaturation; + uniform float uBrightness; + uniform vec4 uColor; + + void main() + { + vec4 c = texture(uTexture, vTextureCoord); + + if (c.a > 0.0) { + c.rgb /= c.a; + + vec3 rgb = pow(c.rgb, vec3(1. / uGamma)); + rgb = mix(vec3(.5), mix(vec3(dot(vec3(.2125, .7154, .0721), rgb)), rgb, uSaturation), uContrast); + rgb.r *= uColor.r; + rgb.g *= uColor.g; + rgb.b *= uColor.b; + c.rgb = rgb * uBrightness; + + c.rgb *= c.a; + } + + finalColor = c * uColor.a; + } + ` + }, + Kawase: { + code: ` + + varying vec2 vTextureCoord; + uniform sampler2D uSampler; + + uniform vec2 uOffset; + uniform vec4 filterClamp; + + void main(void) + { + vec4 color = vec4(0.0); + + // Sample top left pixel + color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw)); + + // Sample top right pixel + color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw)); + + // Sample bottom right pixel + color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw)); + + // Sample bottom left pixel + color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw)); + + // Average + color *= 0.25; + + gl_FragColor = color; + } + ` + }, + Darkness: { + code: ` + varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform float radius; + uniform float mult; + uniform float weight; + uniform float lum_cutoff; + uniform float lum_cutoff_rate; + uniform float brightness; + uniform float brightness_rate; + uniform float contrast; + uniform float contrast_rate; + + + const float FILTERSIZE = 1.; + + void main(void) + { + vec4 c = texture2D(uSampler, vTextureCoord); + + if (c.a > 0.0) { + vec3 rgb = c.rgb; + // Get max luminance around area + float lum = 0.; + float lumsum = 0.; + + for (float x = -FILTERSIZE; x <= FILTERSIZE; x++) + for (float y = -FILTERSIZE; y <= FILTERSIZE; y++) { + vec4 sample = texture2D(uSampler, vec2(vTextureCoord[0]+x*radius, vTextureCoord[1]+y*radius)); + float value = dot(vec3(1.,1.,1.), sample.rgb); + lum = max(lum,value); + lumsum += weight * value; + } + lum = max(lum * mult, lumsum); + + if (lum < lum_cutoff) lum = lum_cutoff + lum_cutoff_rate * (lum - lum_cutoff); + float saturation = min(1., lum); + rgb = mix(vec3(.5), mix(vec3(dot(vec3(.2125, .7154, .0721), rgb)), rgb, min(1., saturation)), contrast + (1. - saturation) * contrast_rate); + c.rgb = rgb * ((brightness) + (1. - saturation) * brightness_rate); + c.rgb *= c.a; + } + + gl_FragColor = c; + } + ` + }, + FogFilter: { + code: ` + varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform sampler2D lightmap; + uniform float saturation; + uniform float brightness; + uniform float brightness_rate; + uniform float contrast; + uniform float contrast_rate; + + void main(void) + { + vec4 c = texture2D(uSampler, vTextureCoord); + vec4 l = texture2D(lightmap, vTextureCoord); + + if (c.a > 0.0 && l.a > 0.0) { + vec3 rgb = c.rgb; + rgb = mix(vec3(.5), mix(vec3(dot(vec3(.2125, .7154, .0721), rgb)), rgb, min(1., saturation)), contrast + (1. - saturation) * contrast_rate); + c.rgb = rgb * ((brightness) + (1. - saturation) * brightness_rate); + c.rgb *= c.a; + } + + gl_FragColor = c; + } + ` + }, + MultiplyFilter: { + code: ` + varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform sampler2D lightmap; + + void main(void) + { + vec4 c = texture2D(uSampler, vTextureCoord); + vec4 l = texture2D(lightmap, vTextureCoord); + + if (c.a > 0.0 && l.a > 0.0) { + vec3 rgb = c.rgb * l.rgb; + c.rgb = rgb; + } + + gl_FragColor = c; + } + ` + }, + GammaFilter: { + code: ` + varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform float gamma[1]; + + void main(void) + { + vec4 c = texture2D(uSampler, vTextureCoord); + + if (c.a > 0.0) { + vec3 rgb = pow(c.rgb, vec3(1. / (gamma[0])));; + c.rgb = rgb; + } + + gl_FragColor = c; + } + ` + }, + Solid: { + code: ` + varying vec2 vTextureCoord; + uniform sampler2D uSampler; + + void main(void) + { + vec4 c = texture2D(uSampler, vTextureCoord); + + if (c.a > 0.0) { + c.r = 1.; + c.g = 1.; + c.b = 1.; + } + + gl_FragColor = c; + } + ` + }, +}; + diff --git a/Game/src/base/KDTypeDefs.ts b/Game/src/base/KDTypeDefs.ts new file mode 100644 index 000000000..620e012ed --- /dev/null +++ b/Game/src/base/KDTypeDefs.ts @@ -0,0 +1,3975 @@ +type Named = { + name: string, + inventoryVariant?: string, +} + +interface NamedAndTyped extends Named { + /** Type of the item*/ + type?: string, +} + +interface KDOutfitMetadata { + name: string, + palette: string, +} + +/** Kinky Dungeon Typedefs*/ +interface item extends NamedAndTyped { + /** Which NPC its on */ + onEntity?: number, + /** Is magically conjured. Cannot be added back to inventory */ + conjured?: boolean, + /* ID of the item */ + id: number, + /** Used in order to boost performance */ + linkCache?: string[], + /** If the item has a different curse from the base curse */ + curse?: string, + /** Name of the item*/ + name: string, + /** Type of the item*/ + type?: string, + /** Faction of the applied item */ + faction?: string, + /** Faction of the applied item, impossible to override */ + forceFaction?: string, + /** When added to the inventory, is added as a different item instead. Good for cursed items! */ + inventoryVariant?: string, + /** Events associated with the item*/ + //weapon?: KinkyDungeonWeapon, /** Item weapon data, if applicable*/ + //consumable?: any, /** Item consumable data, if applicable*/ + events?: KinkyDungeonEvent[], + /** Number of consumables in the inventory*/ + quantity?: number, + //looserestraint?: any, /** Loose restraint data, if applicable*/ + //restraint?: any, /** Which restraint the item is associated with*/ + /** Type of lock, Red, Blue, or Gold (potentially more in future)*/ + lock?: string, + /** Bool to describe if the item is tethered to the leashing enemy*/ + tetherToLeasher?: boolean, + /** Bool to describe if the item is tethered to KinkyDungeonJailGuard()*/ + tetherToGuard?: boolean, + /** ID of leashing enemy*/ + tetherEntity?: number, + /** Leashing location*/ + tetherLocation?: {x: number, y: number}, + /** Location of the tether*/ + tx?: number, + /** Location of the tether*/ + ty?: number, + /** Length of the tether*/ + tetherLength?: number, + /** Stores the previously linked item*/ + dynamicLink?: item, + /** Generic item data, able to be manipulated thru events*/ + data?: Record, + /** Escape progress tracking*/ + pickProgress?: number, + /** Escape progress tracking*/ + struggleProgress?: number, + /** Escape progress tracking*/ + cutProgress?: number, + /** Escape progress tracking*/ + unlockProgress?: number, + /** Number of escape attempts, integer*/ + attempts?: number, + /** Can be used to make an item tighter and harder to escape, reduces with each escape attempt*/ + tightness?: number, + /** Determines the current trap attached to the restraint*/ + trap?: string, + /** Can make the item itself show in quick inv*/ + showInQuickInv?: boolean, +} + +interface consumable extends NamedAndTyped { + name: string, + /** 1 - (Rarity * sub value) = sub threshold */ + sub?: number, + rarity: number, + /** Wont be confiscated in prison */ + isSubby?: boolean, + /** Base chance to sneak thru strip search */ + sneakChance?: number, + type: string, + /** used solely for shop */ + uniqueTags?: string[], + shop?: boolean, + spell?: string, + potion?: boolean, + latexsolvent?: number, + noHands?: boolean, + arousalMode?: boolean, + /** Data var */ + data?: Record, + /** Requirement that overrides all other requirements */ + prereq?: string, + /** Requirement in addition to all other requirements such as not being gagged for potions, bound, etc */ + postreq?: string, + /** Minimum effectiveness when gagged */ + gagFloor?: number, + /** Max gag amount to use */ + gagMax?: number, + /** delay before use */ + delay?: number, + needMouth?: boolean, + /** Max strictness allowed before the item cant be used */ + maxStrictness?: number, + mp_instant?: number, + mpool_instant?: number, + wp_instant?: number, + sp_instant?: number, + ap_instant?: number, + mp_gradual?: number, + wp_gradual?: number, + sp_gradual?: number, + ap_gradual?: number, + arousalRatio?: number, + scaleWithMaxMP?: boolean, + scaleWithMaxSP?: boolean, + scaleWithMaxAP?: boolean, + scaleWithMaxWP?: boolean, + duration?: number, + power?: number, + amount?: number, + rechargeCost?: number, + aura?: string, + buff?: string, + costMod?: number, + shrine?: string, + sfx?: string, + noConsumeOnUse?: boolean, + useQuantity?: number, + /** Support for multiple effects */ + sideEffects?: string[], +} + +type KDHasTags = { + tags: any +} + +interface KDRestraintProps extends KDRestraintPropsBase { + name: string, + Group: string, +} + +interface KDRestraintPropsBase { + /** Type of gag this turns into when used to gag the player */ + necklaceGagType?: string, + /** Used in standalone to replace Color */ + Filters?: Record, + /** Used in standalone to replace Properties */ + Properties?: Record, + /** Forces this restraint to always be conjured when applied to NPCs*/ + forceConjure?: boolean, + /** TODO Used in standalone to indicate which faction colors map to which filter + * color is the faction color type + * override is whether the faction color overrides the filter. If true it will replace the filter in the model. If false it will apply it over the model's filter. Currently unused + */ + factionFilters?: Record, + /** This item is unaffected by shrines */ + noShrine?:boolean, + /** This item is beneficial and player wont try to struggle from it */ + good?: boolean, + + inventory?: boolean, + power?: number, + weight?: number, + minLevel?: number, + allFloors?: boolean, + cloneTag?: string, + + escapeChance?: any, + + events?: KinkyDungeonEvent[], + enemyTags?: Record, + enemyTagsMult?: Record, + playerTags?: Record, + playerTagsMult?: Record, + /** Like playerTags, but applies if there is NOT the playertag */ + playerTagsMissing?: Record, + /** Like playerTags, but applies if there is NOT the playertag*/ + playerTagsMissingMult?: Record, + shrine?: string[], + + debris?: string, + debrisChance?: number, + + /** This item is not kept in the lost items chest unless it is magical */ + noRecover?: boolean, + + /** These items can only be applied if an enemy has the items in her inventory or the unlimited enemy tag */ + limited?: boolean, + /** Forced to allow these, mainly leashes and collars */ + unlimited?: boolean, + /** Struggling out of this item breaks it permanently. You can avoid this by using Remove to get the last bit if possible */ + struggleBreak?: boolean, + + /** Security levels for chastity. Non-tech belts should have a Tech security of undefined. Magic belts should have undefined for key and tech. + * KEY can be circumvented by having a key. Normally you cant remove a plug but you can spend a key to unlock a plug slot for 30 turns or until you are hit or a restraint is removed in that slot. + * Key difficulty of 1 can simply be lockpicked, taking a bit of time. + * Key difficulty of 3 becomes a blue key. + * MAGIC can be circumvented thru CMD: Unlock + * Tech cannot be circumvented by the player. TODO add keycard to allow this. + * Undefined means the specified method can not be used + * Chastity without Security ignores the security system + * NPC ability to unlock is OR. Having the ability to unlock just one of the security levels means the NPC can unlock. + */ + Security?: { + /** Key security level, for low-tech non-mage factions */ + level_key?: number, + /** Tech security level, for robots and wolfgirls */ + level_tech?: number, + /** Magic security level, for mage factions */ + level_magic?: number, + }, + + npcBondageMult?: number, + npcBondageType?: string, + /** + * Subjective modifier for how pissed off an enemy has to be in order to use this item on you. Good for items that "tighten" for example. + * The effects are not straightforward, but some of the things a higher aggro level will do in the future (TODO) are: + * - reduce likelihood of duplicates + * - reduce likelihood of the item if another item in the same slot already shares some enemyTags with the item + * - reduce likelihood of stacking or linking under another item in the same slot + * + * General range is 0-10 with 0 being the default and 10 being a last resort high security measure + */ + aggroLevel?: number, + + /** Affinity type: Hook, Edge, or Sharp, Sticky, defaults are Hook (struggle), Sharp (Cut), Edge (Pick), Sticky (Unlock), and none (Pick)*/ + affinity?: { + Struggle?: string[], + Cut?: string[], + Remove?: string[], + Pick?: string[], + Unlock?: string[], + }, + /** + * Makes it so its never impossible to struggle with these methods, usually best combined with struggleMinSpeed + */ + alwaysEscapable?: string[]; + /** + * Makes it so enemies, if they would remove this item to place another restraint on, will simply remove this item instead + * Higher number means resistance to multibind + */ + protection?: number; + /** + * This item is cursed but still provides protection + */ + protectionCursed?: boolean; + /** + * This item provides protection even if its group is NOT being targeted + */ + protectionTotal?: boolean; + /** Determines if the item appears in aroused mode only */ + arousalMode?: boolean, + /** This item lets you access linked items under it */ + accessible?: boolean, + /** This item lets you CANT access linked items under it */ + inaccessible?: boolean, + /** This item lets you ignore its inaccessibility for the sake of trussing up the player */ + deepAccessible?: boolean, + /** WIP, does nothing yet. Should allow you to access the item under even inaccessible stuff */ + alwaysAccessible?: boolean, + /** Always inaccessible if something is on top of it */ + alwaysInaccessible?: boolean, + /** Recycler resources yielded when recycled (not crafted, though craft bp will mimic this by default) */ + recycleresource?: Record, + /** This item can be rendered when linked */ + renderWhenLinked?: string[]; + // Player must have one of these PlayerTags to equip + requireSingleTagToEquip?: string[]; + noRecycle?: boolean, + /** Disassembles into a raw item */ + disassembleAs?: string, + /** Disassembles into a raw item */ + disassembleCount?: number, + // Player must have all of these PlayerTags to equip + requireAllTagsToEquip?: string[]; + /** This item always renders when linked */ + alwaysRender?: boolean, + /** When the mentioned items are rendered, changes the type */ + changeRenderType?: Record; + /** AFTER a link, the items will get sorted based on if the order makes sense and there are no inaccessible things blocking. */ + linkPriority?: number; + /** Stacking category, used to determine if you can have multiple of these items in a stack */ + linkCategory?: string; + /** Stacking size, can't exceed 1 */ + linkSize?: number; + /** Stacking category, used to determine if you can have multiple of these items in a stack */ + linkCategories?: string[]; + /** Stacking size, can't exceed 1 */ + linkSizes?: number[]; + /** Even with the link size, this one can't be duplicated */ + noDupe?: boolean; + /** Enemies ignore you while you are wearing it */ + ignoreNear?: boolean, + /** Enemies wont cast spells or ranged attacks while you are wearing it */ + ignoreSpells?: boolean, + /** Can always struggle even if it's blocked */ + alwaysStruggleable?: boolean, + /** Model to use in standalone. Defaults to Asset */ + Model?: string, + Asset?: string, + /** Sell price of the item */ + value?: number, + /** Used for when the visual asset in BC is different from the actual group of the item*/ + AssetGroup?: string, + /** Dont render item if has the tags */ + hideTags?: string[], + Color?: string[] | string, + /** Maximum level, wont be used at this or higher. Inclusive. */ + maxLevel?: number, + /** Determines the floors the restraint can appear on */ + floors?: Record, + /** Overrides escapeChance when you have a ghost helping*/ + helpChance?: { + Struggle?: number, + Cut?: number, + Remove?: number, + Pick?: number, + Unlock?: number, + }, + /** Determines the penalty to the escape chance at the limit--full struggle progress when struggling, and 0 for cut/remove/unlock/pick*/ + limitChance?: { + Struggle?: number, + Cut?: number, + Remove?: number, + Pick?: number, + Unlock?: number, + }, + speedMult?: { + Struggle?: number, + Cut?: number, + Remove?: number, + Pick?: number, + Unlock?: number, + }, + struggleMinSpeed?: { + Struggle?: number, + Cut?: number, + Remove?: number, + Pick?: number, + Unlock?: number, + }, + struggleMaxSpeed?: { + Struggle?: number, + Cut?: number, + Remove?: number, + Pick?: number, + Unlock?: number, + }, + /** Multiplier to struggle power */ + struggleMult?: { + Struggle?: number, + Cut?: number, + Remove?: number, + Pick?: number, + Unlock?: number, + }, + /** Multiplier to limit chance */ + limitMult?: { + Struggle?: number, + Cut?: number, + Remove?: number, + Pick?: number, + Unlock?: number, + }, + + /** Sound when using an escape method*/ + sfxEscape?: { + Struggle?: string, + Cut?: string, + Remove?: string, + Pick?: string, + Unlock?: string, + NoStamina?: string, + NoWill?: string, + NoMagic?: string, + MagicCut?: string, + PickBreak?: string, + KnifeBreak?: string, + KnifeDrop?: string, + KeyDrop?: string, + PickDrop?: string, + Blocked?: string, + }, + sfxFinishEscape?: { + Struggle?: string, + Cut?: string, + Remove?: string, + Pick?: string, + Unlock?: string, + Destroy?: string, + } + /** Remove sound */ + sfxRemove?: string, + /** Equip sound */ + sfx?: string, + /* useful for easily extending sounds */ + sfxGroup?: string, + /** The vibrator will start vibing whenever another linked vibe starts */ + linkedVibeTags?: string[], + vibeLocation?: string, + showInQuickInv?: boolean, + /** The item is a chastity belt */ + chastity?: boolean, + /** The item is a chastity bra */ + chastitybra?: boolean, + /** The item is a piercing */ + piercing?: boolean, + /** The item rubs against the crotch when you move or struggle*/ + crotchrope?: boolean, + /** The item provides distraction when you walk around*/ + plugSize?: number, + /** Binding arms hurts a lot of things but isn't as punishing as hands */ + bindarms?: boolean, + /** Hands count as bound for struggling purposes */ + restricthands?: number, + /** Binding hands prevents use of weapons and picks */ + bindhands?: number, + /** harnesses allow enemies to grab you and slow you */ + harness?: boolean, + /** hobble is the simplest kind of slowing restraint, increasing slow by this amount*/ + hobble?: number, + /** Multiplier to the max heel level */ + heelpower?: number, + /** Blocking feet is for restraints that tie the legs together, forcing the player into SLow Level 2 or higher */ + blockfeet?: boolean, + /** restricvtion bonus */ + restriction?: number, + /** Your total gag level is the sum of the gag values of all your variables. Ball gags have 0.3-0.75 based on size and harness, muzzles are 1.0 */ + gag?: number, + /** Higher value = higher vision loss */ + blindfold?: number + /** Maximum stamina percentage the player can have in order for the restraint to be applied. 0.25-0.35 for really strict stuff, 0.9 for stuff like ball gags, none for quick restraints like cuffs */ + maxwill?: number, + /** for enemies only */ + maxwillEnemy?: number, + Type?: string, + /** Item is removed when the wearer goes to prison */ + removePrison?: boolean, + /** stronger version */ + forceRemovePrison?: boolean, + /** Changes the dialogue text when you fail to remove the item */ + failSuffix?: Record, + /** Custom equip message */ + customEquip?: string, + /** Custom success message */ + customEscapeSucc?: string, + /** Changes the dialogue text when you try to struggle completely */ + specStruggleTypes?: string[], + /** List of Groups removed */ + remove?: string[], + /** List of tags removed */ + removeShrine?: string[], + slimeLevel?: number, + addTag?: string[], + addPose?: string[], + /** Bigger version of the item, for bigger gags perk */ + biggerVersion?: string, + /** Adds a pose (standalonepatched only) if this is the top level restraint */ + addPoseIfTopLevel?: string[], + forbidPose?: string[], + removePose?: string[], + OverridePriority?: number, + Modules?: number[], + /** When added to the inventory, is added as a different item instead. Good for multiple stages of the same item, like cuffs */ + inventoryAs?: string, + /** When added to the inventory by self, is added as a different item instead. Good for multiple stages of the same item, like cuffs */ + inventoryAsSelf?: string, + /** The item is always kept in your inventory no matter how it gets removed, so long as you don't cut it */ + alwaysKeep?: boolean, + /** The jailer won't remove these */ + noJailRemove?: boolean, + /** Increases the difficulty of other items */ + strictness?: number, + /** Overrides the existing strictness zones for the item's group */ + strictnessZones?: string[], + /** Can be linked by items with this shrine category */ + LinkableBy?: string[], + DefaultLock?: string, + HideDefaultLock?: boolean, + Link?: string, + UnLink?: string, + /** Removes when the player is leashed */ + removeOnLeash?: boolean, + /** player is enclosed */ + enclose?: boolean, + /** ignore the player if player is 0 stamina and the enemy is non leashing */ + ignoreIfNotLeash?: boolean, + /** Default tether length */ + tether?: number, + leash?: boolean, + /** The vibe can be remote controlled by enemies */ + allowRemote?: boolean, + /** Multiplies the escape chance */ + escapeMult?: number, + /** Outfit to force */ + forceOutfit?: string, + /** Outfit to force (priority default = base power) */ + forceOutfitPriority?: number, + /** Clothes for dressing */ + alwaysDress?: overrideDisplayItem[], + /** Clothes for dressing */ + alwaysDressModel?: alwaysDressModel[], + /** The item always bypasses covering items, such as dresses and chastity belts */ + bypass?: boolean, + /** The item can only be cut with magical implements */ + magic?: boolean, + /** The item is regarded as a non-binding item, so the game knows how to handle it. Used for stuff like cuffs which are not binding by default */ + nonbinding?: boolean, + /** The item is regarded as a binding item, so the game knows how to handle it. Used for stuff that should be considered binding but aren't due to KDIsBinding() not recognizing it */ + binding?: boolean, + /** Instantly forces a high slow level, for stuff like slime */ + freeze?: boolean, + /** Immobilizes the player */ + immobile?: boolean, + /** The item CAN be trapped, which triggers when you struggle out */ + trappable?: boolean, + /** The item can only be removed through a special condition known as a curse */ + curse?: string, + /** The extra difficulty the item adds to the global difficulty var */ + difficultyBonus?: number, + /** Whether or not the angels will take it off when you call them */ + divine?: boolean, + /** If this is enabled, then you can spend ancient energy to use a potion at no reduction to potion effectiveness while gagged */ + potionCollar?: boolean, + /** Always allows potions while this restraint is on */ + allowPotions?: boolean, + /** Allows the user to walk across slime */ + slimeWalk?: boolean, + /** Allows the user to walk across soap */ + soapWalk?: boolean, + /** Allows the user to walk across ice (unused) */ + iceWalk?: boolean, + /** Amount of ancient energy it draws per turn */ + enchantedDrain?: number, + /** Whether or not this is an Ancient item, prison respects it */ + enchanted?: boolean, + /** Whether or not this is special in some way*/ + special?: boolean, + /** Faction color index */ + factionColor?: number[][], + + /** Determines if it gets hidden by the 'Hide Armor' option */ + armor?: boolean, + /** The item can be linked by anything on top*/ + LinkAll?: boolean, + /** The item can be linked over anything below*/ + AlwaysLinkable?: boolean, + /** The item always renders items below*/ + UnderlinkedAlwaysRender?: boolean, + /** The item cannot be linked over anything */ + NoLinkOver?: boolean, + /** Power to display, not actual power */ + displayPower?: number, +}; + +interface restraint extends KDRestraintProps { + power: number, + preview?: string, + /** Special condition for quick binding! */ + quickBindCondition?: string, + /** Multiplier to bondage strength if target isn't disabled */ + quickBindMult?: number, + /** Base weight of the restraint, required */ + weight: number, + minLevel: number, + + deaf?: number, + + Color?: string[] | string, + + /** Descriptor for tightness, e.g. Secure, Thick */ + tightType?: string, + + escapeChance: any, + + enemyTags: Record, + /** Multiplies the weight AFTER, useful for minimizing things */ + enemyTagsMult?: Record, + playerTags: Record, + shrine: string[], + /** These tags cause the restraint to appear on all floors regardless of map*/ + ignoreFloorTags?: string[], + /** These tags cause the restraint to appear on all floors regardless of minlevel*/ + ignoreMinLevelTags?: string[], + /** These tags cause the restraint to appear on all floors regardless of maxlevel*/ + ignoreMaxLevelTags?: string[], + /** + * A map of: + * key - Name of the ApplyVariant + * value - weight modifiers + */ + ApplyVariants?: Record, playerTagsMult?: Record, playerTagsMissing?: Record, playerTagsMissingMult?: Record, enemyTags: Record, enemyTagsMult?: Record}>, +} + +interface KDEscapeChanceList { + Struggle?: number, + Cut?: number, + Remove?: number, + Pick?: number, + Unlock?: number, +} + +type outfitKey = string + +type mapKey = string + +interface floorParams { + /** Weighted list of successor tileset, positive X */ + successorPositive: Record; + /** Weighted list of successor tileset, negative X */ + successorNegative: Record; + /** Weighted list of successor tileset, same X */ + successorSame: Record; + + color: string, + /** List of factions allowed to be primary or secondary here */ + factionList?: string[]; + /** This code is run after a worldgen */ + worldGenCode?: (coord: WorldCoord) => void; + /** This code is run before gencriteria*/ + beforeWorldGenCode?: (coord: WorldCoord) => void; + tagModifiers?: Record; + globalTags?: Record; + /** Tags for cursed mimic restraints */ + curseTags: string[], + shadowColor?: number, + lightColor?: number, + background : string, + openness : number, // Openness of rooms + density : number, // Density of tunnels (inverse of room spawn chance) + torchchance?: number, + torchlitchance?: number, + music: Record, + specialChests?: Record, + /** Will add more/less torches on the main path */ + torchchanceboring?: number, + torchreplace?: { + sprite: string, + unlitsprite?: string, + brightness: number, + }, + /** These tiles wont alter wall tiles in this tileset */ + noReplace?: string, + /** Chance of shrine having mana */ + manaChance?: number, + crackchance : number, + foodChance? : number, + barchance : number, + brightness : number, + chestcount : number, + shrinecount : number, + shrinechance : number, + ghostchance : number, + /** Chance to have a closed door */ + doorchance: number, + + /** Chance to have an open door */ + nodoorchance : number, + doorlockchance : number, + /** Chance to replace a trap on a door tile with a doortrap instead of deleting the door. Default to trapchance */ + doorlocktrapchance? : number, + /** Chance to replace a door with a lock */ + doortrapchance? : number, + minortrapChance? : number, + chargerchance?: number, + litchargerchance?: number, + chargercount?: number, + trapchance : number, + barrelChance? : number, + grateChance : number, + rubblechance : number, + brickchance : number, + cacheInterval : number, + cageChance? : number, + + wallhookchance? : number, + ceilinghookchance? : number, + + hallopenness? : number, + + /** FOrces all setpieces to use POIs, useful for tunnel type maps with thick walls to prevent entombe pieces*/ + forcePOI?: boolean, + + gaschance?: number, + gasdensity?: number, + gastype?: string, + + wallRubblechance?: number, + + lockmult?: number, + + floodchance? : number, + forbiddenChance : number, // If a forbidden gold chance is generated. Otherwise a silver chest will appear + forbiddenGreaterChance : number, // Chance after a forbidden area is generated with a restraint, otherwise its a lesser gold chest + + setpieces?: {Type: string, Weight: number}[], + + //shortcuts: {Level: number, checkpoint: string, chance:number}[ ], + //mainpath: {Level: number, checkpoint: string, chance?: number}[], + + traps: {Name: string, Faction?: string, Enemy?: string, Spell?: string, extraTag?: string, Level: number, Power: number, Weight: number, strict?: true, teleportTime?: number, filterTag?: string, filterBackup?: string, arousalMode?: boolean}[], + + min_width : number, + max_width : number, + min_height : number, + max_height : number, + deadend? : number, + + ShopExclusives? : string[], + ShopExclusivesArousal? : string[], + + enemyTags: string[], + "defeat_outfit": outfitKey, + /** + * key required for jailers INSTEAD of "jailer" + */ + jailType?: string, + guardType?: string, + "shrines": {Type: string, Weight: number}[] +} + +interface overrideDisplayItem { + /** Bondage club asset */ + Item: string, + /** Group */ + Group: string, + /** Standalone model */ + Model?: string, + /** Color */ + Color: string[]|string, + /** Filters */ + Filters?: Record, + /** Faction color index */ + factionColor?: number[][], + /** Faction filter index */ + factionFilters?: Record, + /** Property for BC compat */ + Property?: any, + /** Whether or not it overrides items already on */ + override?: boolean, + /** Uses the player's hair color as the item color */ + useHairColor?: boolean, + /** Used for overriding BC priority */ + OverridePriority?: number[]|number, +} +interface alwaysDressModel { + /** Force faction if restraint doesnt have it */ + faction?: string, + /** Standalone 5.0+ asset */ + Model: string, + /** Group */ + Group?: string, + /** Filters */ + Properties?: Record, + /** Filters */ + Filters?: Record, + /** Faction filter index */ + factionFilters?: Record, + /** Inherits the filters of the main */ + inheritFilters?: boolean, + /** Whether or not it overrides items already on */ + override?: boolean, + /** Uses the player's hair color as the item color */ + useHairColor?: boolean, +} + +interface KDLoadout {name: string, tags?: string[], singletag: string[], singletag2?: string[], forbidtags: string[], chance: number, items?: string[], restraintMult?: number, multiplier?: number}; + +interface enemy extends KDHasTags { + /** Makes them special persistent */ + special?: boolean, + overrideFactionDefeat?: boolean, + customDefeat?: string, + /** Run when created in some circumstances. NOT when summoned*/ + creationScript?: string, + /** This enemy will always kite the player even if player is harmless*/ + alwaysKite?: boolean, + /** This enemy will give an intro when it first sees you*/ + intro?: string, + + nameList?: string, + + /** Multiplier to tease damage */ + teaseMod?: number, + + /** These enemies always carry these items at the start */ + startingItems?: string[] + + /** Sound effects */ + SFX?: { + /** Sound effect for dying */ + death?: string, + }, + + /** Restraint filters */ + RestraintFilter?: { + /** Increases effective level */ + levelBonus?: number, + /** Starts with more restraints!! */ + bonusRestraints?: number, + /** This enemy can apply restraints without needing them in her pockets */ + unlimitedRestraints?: boolean, + /** Forces stock, even if restraints are unlimited */ + forceStock?: boolean, + /** Restraints applied must all be from inventory */ + invRestraintsOnly?: boolean, + /** Restraints applied must all be limited */ + limitedRestraintsOnly?: boolean, + /** Restraints with more power than this must be in inventory. Default is 3*/ + powerThresh?: number, + /** These wont be added to the initial inventory 3*/ + ignoreInitial?: string[], + /** These wont be added to the initial inventory 3*/ + ignoreInitialTag?: string[], + /** This enemy won't restock restraints out of sight */ + noRestock?: boolean, + /** Enemy will restock to this percentage */ + restockPercent?: number, + /** These enemies always restock these restraint items if they dont have them */ + requiredItems?: string[] + }, + + + + /** Magical properties */ + Magic?: { + /** Specific cooldown for each spell. For example, Fuuka's FuukaOrb can only be done every 10 turns */ + castCooldownUnique?: Record, + /** Priority for a spell choice */ + priority?: Record, + }, + + /** Security levels for accessing chastity */ + Security?: { + /** Key security level, for low-tech non-mage factions */ + level_key?: number, + /** Tech security level, for robots and wolfgirls */ + level_tech?: number, + /** Magic security level, for mage factions */ + level_magic?: number, + }, + + /** Graphical peculiarities */ + GFX?: { + /** Custom sprite while lying in wait */ + AmbushSprite?: string, + /** custom sprite width*/ + spriteWidth?: number, + /** custom sprite height*/ + spriteHeight?: number, + /** This enemy is affected by lighting */ + lighting?: boolean, + + }, + /** Sound properties */ + Sound?: { + /** Sound multiplier while moving, default 6 */ + moveAmount?: number, + /** Constant sound amount */ + baseAmount?: number, + /** Cast sound amount */ + castAmount?: number, + /** Attack sound amount */ + attackAmount?: number, + /** alert sound amount */ + alertAmount?: number, + /** Decay per turn */ + decay?: number, + /* name of idle sound */ + idleSoundName?: string, + /* name of moving sound */ + moveSoundName?: string, + /* name of moving sound */ + alertSoundName?: string, + }, + + /** Which subroutine to select for persistent script */ + specialScript?: string, + /** Which subroutine to select spawnAI */ + spawnAISetting?: string, + /** Which subroutine to select wanderAI */ + wanderAISetting?: string, + + /** Behavior tags */ + Behavior?: { + /** Condition for this enemy to try to apply leash */ + leashCondition?: string, + /** This enemy will hold still when near the player */ + holdStillWhenNear?: boolean, + /** If this is true, the intent is that it behaves more as an allied enemy rather than a summon */ + behaveAsEnemy?: boolean, + /** This enemy will always want to add more restraints~ */ + thorough?: number, + /** Can't play */ + noPlay?: boolean, + /** Wont stop tying you until these groups are bound */ + ensureGroupTied?: string[], + /** Wont stop tying you until these playertags are fulfilled */ + ensurePlayerTag?: string[], + /** Wont stop tying you until these groups are bound (arousal mode only)*/ + ensureGroupTiedArousal?: string[], + /** Wont stop tying you until these playertags are fulfilled (arousal mode only)*/ + ensurePlayerTagArousal?: string[], + } + + /** This enemy wont appear outside of its designated floors even if it shares the tag */ + noOverrideFloor?: boolean, + /** This tag will be added to the selection tags if the enemy has it, for loot and ambush spawning purposes */ + summonTags?: string[], + /** This tag will be added to the selection tags if the enemy has it, for loot and ambush spawning purposes. Multiple copies will be pushed*/ + summonTagsMulti?: string[], + /** If true, this enemy will always be bound to the enemy that summons it */ + alwaysBound?: boolean, + /** These enemies wont appear in distracted mode */ + arousalMode?: boolean, + name: string, + /** Special dialogue played when clicked on instead of standard ally dialogue */ + specialdialogue?: string, + /** Overrides the default weight reduction for being outside of a miniboss/boss/minor/elite box */ + outOfBoxWeightMult?: number, + /** Tags, used for determining weaknesses, spawning, restraints applied, and rank*/ + tags: Record, + /** Spell resist, formula is spell damage taken = 1 / (1 + spell resist) */ + spellResist?: number, + /** Whether or not the enemy is friendly to the player and attacks enemies */ + allied?: boolean, + /** Enemies will prioritize this enemy less than other enemies. Used by allies only. */ + lowpriority? : boolean, + /** lookup condition in KDPathConditions, + * basically allows enemies to path through an immobile enemy under certain circumstances */ + pathcondition?: string, + /** Generates token chance = 1 - 1 / (1 + evasion) */ + evasion?: number, + /** Generates token chance = 1 - 1 / (1 + block) */ + block?: number, + /** Amount enemy blocks */ + blockAmount?: number, + maxdodge?: number, + maxblock?: number, + preferDodge?: boolean, + preferBlock?: boolean, + /** */ + armor?: number, + /** Starting data */ + data?: Record, + /** HIde timer */ + hidetimerbar?: boolean, + Attack?: { + mustBindorFail?: boolean, + }, + /** Contains data pertaining to the creature's awareness */ + Awareness?: { + /** Optional tag to override chase radius */ + chaseradius?: number, + /** Creature hearing multiplier */ + hearingMult?: number, + /** Creature hearing base */ + hearingRadius?: number, + /** Creature vision base, affects awareness gain */ + vision?: number, + /** multiplies sneak threshold */ + senseSpeed?: number, + } + /** Contains data pertaining to the creature's effect on reputation and its behaviors from it */ + Reputation?: { + /** Optional tag to make an enemy not give up rep when killed */ + noRepLoss?: boolean, + }, + /** */ + followRange?: number, + /** wander = wanders randomly + * hunt = wanders, then follows the player + * guard = follows a specific point + * ambush = waits for the player to come near before becoming active + * patrol = walks between predefined global points on the map + */ + AI?: string, + /** HP regen per turn*/ + regen?: number, + /** */ + visionRadius?: number, + /** Enemy will not get a vision bonus in one direction*/ + nonDirectional?: boolean, + /** Enemy will not flip based on the enemy direction*/ + noFlip?: boolean, + /** Max enemy hp*/ + maxhp?: number, + /** Max enemy mana */ + maxmana?: number, + /** enemy mana regen per turn */ + manaregen?: number, + /** Shield enemy starts with */ + shield?: number, + /** Shield enemy starts with */ + shieldregen?: number, + /** Number of turns an enemy can sprint for */ + stamina?: number, + /** Sprint speed multiplier. Default 1.5*/ + sprintspeed?: number, + /** HP the enemy starts at */ + startinghp?: number, + /** */ + minLevel?: number, + /** */ + maxLevel?: number, + /** */ + weight?: number, + /** */ + movePoints?: number, + /** */ + attackPoints?: number, + /** String declaring what types of attacks this unit has */ + attack?: string, + /** */ + attackRange?: number, + /** */ + terrainTags?: Record, + /** Multiplies the weight AFTER modifiers */ + weightMult?: number, + /** */ + floors?: Record, + /** Enemy events */ + events?: KinkyDungeonEvent[]; + /** */ + allFloors?: boolean, + /** */ + noblockplayer?: boolean, + /** */ + triggersTraps?: boolean, + /** The enemy follows the player at the end of the level */ + keepLevel?: boolean, + /** Boost to accuracy, 1 + (1 + accuracy)*/ + accuracy?: number, + /** Blindsight toward the player but not other enemies. Mainly used by allies so they know where the player is. */ + playerBlindSight?: number, + /** */ + attackWidth?: number, + /** */ + power?: number, + /** */ + dmgType?: string, + /** Tease attacks list to use */ + teaseAttacks?: string, + /** */ + bound?: string, + /** Outfit for paperdoll */ + outfit?: string, + /** Outfit for paperdoll */ + style?: string, + /** Enemy is not a humanoid, used for skeletons */ + nonHumanoid?: boolean, + /** */ + color?: string, + /** counts toward the player's permanent summmon limit */ + CountLimit?: boolean, + /** Does not target silenced enemies */ + noTargetSilenced?: boolean, + /** */ + silenceTime?: number, + /** List of spells*/ + spells?: string[], + /** starting buffs */ + startBuffs?: any[], + /** This enemy will not miscast spells when distracted*/ + noMiscast?: boolean, + /** Sound effect when miscasting */ + miscastsfx?: string, + /** Message when miscasting */ + miscastmsg?: string, + /** This enemy knows the unlock command up to this level*/ + unlockCommandLevel?: number, + /** This enemy must wait this long between unlock command attempts. Default is 90*/ + unlockCommandCD?: number, + /** Enemy will self cast these */ + selfCast?: Record, + /** */ + spellCooldownMult?: number, + /** */ + spellCooldownMod?: number, + /** */ + kite?: number, + /** */ + playerFollowRange?: number, + /** */ + minSpellRange?: number, + /** */ + stopToCast?: boolean, + /** Shows a marker when the creature has a spell ready */ + spellRdy?: boolean, + /** Casts while moving */ + castWhileMoving?: boolean, + /** Enemy does not attack */ + noAttack?: boolean, + /** Disarm counter increased by this fraction when attacked. When it reaches 1, the player's next attack will miss, otherweise it will reduce by this amount per turn */ + disarm?: number, + /** Boost to power when target is not the player or when the enemy cant tie up the player */ + fullBoundBonus?: number, + /** Loot*/ + dropTable?: any[], + /** */ + attackWhileMoving?: boolean, + /** Doesnt cast spells when the player is out of stamina */ + noSpellsLowSP?: boolean, + /** Rep changes on death */ + rep?: Record, + /** Rep changes on death */ + factionrep?: Record; + /** Chance to generate as a guard instead */ + guardChance?: number; + /** When generating clusters of enemies, the clustering units must have this tag*/ + clusterWith?: string, + /** Chance to ignore the player if the enemy has an ignore tag like ignorenoSP */ + ignorechance?: number, + /** The enemy count is incremented by this amount when the enemy is spawned during map gen*/ + difficulty?: number, + /** The enemy will not attack if the path to the player is blocked, and will move closer*/ + projectileAttack?: boolean, + /** The enemy will use 'buff' tagged spells on allies*/ + buffallies?: boolean, + /** Special attack property*/ + stunTime?: number, + /** Stamina damage per hit */ + staminaDamage?: number, + /** Special attack property. Cooldown of the special attack.*/ + specialCD?: number, + /** Special attack property. Added to the special attack in addition to the enemy's default attack*/ + specialAttack?: string, + /** Special attacks ignore stamina requirements */ + specialIgnoreStam?: boolean, + /** Special attack property. Removed these types from the main attack when special attacking.*/ + specialRemove?: string, + /** Adds additional restraint tags when special attacking*/ + specialExtraTags?: string[], + /** removes the specified restraint tags when special attacking*/ + specialRemoveTags?: string[], + /** Uses a special message for Special attacks */ + specialMsg?: boolean, + /** specifies a condition for using a special attack*/ + specialCondition?: string, + /** Special attack property*/ + specialPower?: number, + /** Special attack property*/ + specialDamage?: string, + /** Special attack property. Special attack will go on CD when the enemy uses it, not when it hits*/ + specialCDonAttack?: boolean, + /** Special attack property*/ + specialWidth?: number, + /** Special attack property*/ + specialRange?: number, + /** Which shrines the enemy is associated with*/ + shrines?: string[], + /** */ + followLeashedOnly?: boolean, + /** */ + blindSight?: number, + /** */ + specialCharges?: number, + /** */ + strictAttackLOS?: boolean, + /** */ + specialAttackPoints?: number, + /** */ + stealth?: number, + /** After being seen the enemy can go back into stealth if the player moves away*/ + noReveal?: boolean, + /** */ + ambushRadius?: number, + /** For AI = 'ambush', this enemy will wander until it sees the player and triggers the ambush. Mostly used for invisible enemies. */ + wanderTillSees?: boolean, + /** For kiting enemies, this enemy moves in to attack Only When the player is Disabled. Used on enemies like the Maidforce stalker who stay away from the enemy but have powerful disabling effects like flash bombs*/ + dontKiteWhenDisabled?: boolean, + /** The special attack only binds on kneeling players*/ + bindOnDisableSpecial?: boolean, + /** The regular attack only binds on kneeling players*/ + bindOnDisable?: boolean, + /** Enemy will still try to bind even if (bindOnDisable) is true, if the player isn't actively fighting*/ + smartBind?: boolean, + /** Sfx when an attack lands*/ + hitsfx?: string, + /** All lockable restraints will use this lock*/ + useLock?: string, + /** Uses this lock when using the lock attack */ + attackLock?: string, + /** Faction that is always applied by this unit's restraints */ + applyFaction?: string, + /** Faction that is default applied by this unit's restraints */ + defaultFaction?: string, + /** Minimum range for attack warning tiles, used to prevent high range enemies from attacking all around them*/ + tilesMinRange?: number, + /** Minimum range to try attacking */ + attackMinRange?: number, + /** Minimum range to try attacking */ + specialMinRange?: number, + /** */ + noKiteWhenHarmless?: boolean, + /** */ + noSpellsWhenHarmless?: boolean, + /** */ + ignoreStaminaForBinds?: boolean, + /** */ + sneakThreshold?: number, + RemoteControl?: { + /** */ + remote?: number, + /** */ + remoteAmount?: number, + /** If the enemy has a remote that can control punishing items (e.g. shock collars), the range that they can control items from */ + punishRemote?: number, + /** The chance per tick that the enemy will use their remote remote to punish the player when they are within range */ + punishRemoteChance?: number, + } + /** Crit strike modifier of the enemy's attacks */ + crit?: number, + /** */ + bypass?: boolean, + /** */ + multiBind?: number, + /** */ + noLeashUnlessExhausted?: boolean, + /** */ + ethereal?: boolean, + /** This enemy always dodges regular attacks */ + alwaysEvade?: boolean, + /** This enemy always blocks regular attacks */ + alwaysBlock?: boolean, + /** Info for enemy resistance */ + Resistance?: { + /** Applies a resistance profile to the enemy, which is a preset set of tags */ + profile?: string[], + /** This enemy cannot dodge if the attacking weapon is magical */ + alwaysHitByMagic?: boolean, + /** This enemy cannot BLOCK if the attacking weapon is magical */ + alwaysBypassedByMagic?: boolean, + /** Physical block: applied only when not disabled or vulnerable */ + block_phys?: number, + /** Magic block: applied only when not disabled or vulnerable */ + block_magic?: number, + /** Crits are half as effective when enemy is aware */ + toughArmor?: boolean, + /** Same as tough armor, but also applies while unaware */ + toughArmorAlways?: boolean, + }, + /** */ + summonRage?: boolean, + /** */ + noAlert?: boolean, + /** The enemy will follow enemies defined by this block*/ + master?: masterInfo, + /** */ + pullTowardSelf?: boolean, + /** */ + pullDist?: number, + /** */ + summon?: any[], + /** */ + sneakthreshold?: number, + /** */ + blockVisionWhileStationary?: boolean, + /** */ + squeeze?: boolean, + earthmove?: boolean, + /** Enemy will not chase player for being unrestrained. Use on enemies like drones who have lines but dont bind readily */ + noChaseUnrestrained?: boolean, + /** */ + suicideOnSpell?: boolean, + /** */ + suicideOnAdd?: boolean, + /** */ + suicideOnEffect?: boolean, + /** */ + suicideOnLock?: boolean, + /** Hostile even on parole */ + alwaysHostile?: boolean, + /** */ + specialsfx?: string, + /** Stuns the enemy when the special attack goes on CD without a hit */ + stunOnSpecialCD?: number, + /** Dash info */ + Dash?: { + /** Does not dash to the player if the dash is stepped out of the way of*/ + noDashOnSidestep?: boolean, + /** Does not dash to the player if the dash is dodged*/ + noDashOnMiss?: boolean, + /** Does not dash to the player if the dash is blocked*/ + noDashOnBlock?: boolean, + /** Forces the event to play when a dash misses, even if there are no eventable attack types*/ + EventOnDashMiss?: boolean, + /** Forces the event to play when a dash is blocked, even if there are no eventable attack types*/ + EventOnDashBlock?: boolean, + }, + /** Used for jailing + * No effect atm unless a custom defeat uses it + */ + Defeat?: { + furnitureTags?: {tags: string[], count: number}[], + specificRestraints?: { + name: string, + minlevel: number, + maxlevel?: number, + applyVariant?: string}[], + }, + attackBonus?: number, + /** */ + cohesion?: number, + /** */ + noSpellLeashing?: boolean, + /** */ + projectileTargeting?: boolean, + /** */ + ondeath?: any[], + /** */ + blindTime?: number, + /** */ + tilesMinRangeSpecial?: number, + /** */ + convertTiles?: any[], + /** the enemy sends a special message when pulling the player */ + pullMsg?: boolean, + /** */ + dashThruWalls?: boolean, + /** */ + dashThrough?: boolean, + /** */ + cohesionRange?: number, + /** */ + kiteChance?: number, + /** this enemy ignores the player when these flags are set*/ + ignoreflag?: string[], + /** flags set when the player is hit but no binding occurs*/ + failAttackflag?: string[], + failAttackflagChance?: number, + /** How long to set the flag for */ + failAttackflagDuration?: number, + /** */ + visionSummoned?: number, + /** */ + dependent?: boolean, + /** */ + nopickpocket?: boolean, + /** */ + attackThruBars?: boolean, + /** */ + noCancelAttack?: boolean, + /** */ + keys?: boolean, + /** If this enemy is always enraged */ + rage?: boolean, + /** Starting lifetime of enemy*/ + lifespan?: number, + /** This enemy cant be swapped */ + noDisplace?: boolean, + /** The enemy will cast spells even if you are in parole */ + spellWhileParole?: boolean, + /** This line is a suffic to the line they say when they want to play with you */ + playLine?: string, + /** Blocks vision */ + blockVision?: boolean, + /** Hit SFX for enemy special attack */ + hitsfxSpecial?: string, + /** Effect when the enemy misses */ + misssfx?: string, + /** Effect when the enemy blocks */ + blocksfx?: string, + /** SFX on certain cues */ + cueSfx?: { + /** When the enemy takes no damage from a melee attack */ + Block?: string, + /** When the enemy takes no damage from a magic attack */ + Resist?: string, + /** When the enemy takes damage in general */ + Damage?: string, + /** When the player misses it */ + Miss?: string, + }, + /** The enemyeffect when player is hit */ + effect?: any, + /** Cant cast spells while winding up an attack */ + noSpellDuringAttack?: boolean, + /** Base faction of this enemy, overridden by the entity faction */ + faction?: string, + /** Can rescue with the following */ + rescueTo?: { + Unlock?: string, + Remove?: string, + Slime?: string, + }, + /** This enemy does not channel its spells */ + noChannel?: boolean, + /** Focuses player over summmons, ignores decoys */ + focusPlayer?: boolean; + /** Cant be swapped by another enemy pathing, even if the enemy is a jailer or leasher. + * For barricades and other dynamically placed barriers, use "immobile" so it doesnt block important enemies + */ + immobile?: boolean; + /** Stops casting spells after there are this many enemies */ + enemyCountSpellLimit?: number; + /** List of animations to be applied */ + Animations?: string[]; + +} + +interface shopItem { + cost: any; + rarity: any; + costMod?: any; + shoptype: string; + consumable?: string; + countItem?: number; + quantity?: number; + name: any; +} + +interface weapon extends damageInfo, NamedAndTyped { + /** Can autocast this into diggable tiles */ + digSpell?: string, + stamPenType?: string, + ignoreshield?: boolean, + shield_crit?: boolean, // Crit thru shield + shield_stun?: boolean, // stun thru shield + shield_freeze?: boolean, // freeze thru shield + shield_bind?: boolean, // bind thru shield + shield_snare?: boolean, // snare thru shield + shield_slow?: boolean, // slow thru shield + shield_distract?: boolean, // Distract thru shield + shield_vuln?: boolean, + arousalMode?: boolean, + /** Modifies the cost by changing the rarity for cost purposes only */ + costMod?: number, + name: string; + damage: number; + chance: number; + type: string; + + + /** Multiplies the damage when over 50% stamina */ + stam50mult?: number, + + evadeable?: boolean, + nokill?: boolean, + bind?: number; + nodisarm?: boolean, + /** Will add conjured bindings */ + addBind?: boolean; + /** For rendering on player portrait */ + angle?: number, + crit?: number; + bindcrit?: number; + bindType?: string; + distract?: number; + bindEff?: number; + distractEff?: number; + desireMult?: number; + light?: boolean; + heavy?: boolean; + massive?: boolean; + boundBonus?: number; + tease?: boolean; + rarity: number; + staminacost?: number; + time?: number, + magic?: boolean; + /** Determines if the weapon is a gun/staff type (does damage regardless of binding) + * or a whack type that needs force to be effective*/ + noDamagePenalty?: boolean, + cutBonus?: number; + playSelfBonus?: number; + playSelfMsg?: string; + playSelfSound?: string; + unarmed: boolean; + shop: boolean; + noequip?: boolean; + sfx: string; + events?: KinkyDungeonEvent[]; + noHands?: boolean; + silent?: boolean; + /** Weapon cant be used with arm bondage */ + clumsy?: boolean; + /** Skip turns after attacking */ + channel?: number; + /** Slows player after attacking */ + channelslow?: boolean; + novulnerable?: boolean; + nocrit?: boolean; + noblock?: boolean, + tags?: string[]; + special?: { + noSkip?: boolean, + type: string, + spell?: string, + prereq?: string, + selfCast?: boolean, + requiresEnergy?: boolean, + energyCost?: number, + range?: number,}; + /** Can be used with Floating weapon even with no hands */ + telekinetic?: boolean, +} + + +interface KinkyDungeonEvent { + sprite?: string, + + + + cloneTags?: string[], + frequencyMax?: number, + frequencyMin?: number, + frequencyStep?: number, + frequencyTag?: string, + + /** This is an integer. if an event has this the game skips it and comes back after executing everything else. + * Best to keep it low for performance reasons, if in a draw loop. + */ + delayedOrder?: number; + /** A dynamic event is specified as 'dynamic' and is specified under ItemMap.dynamic + * (replace ItemMap with the event map you need) + * This lets you use the same code for multiple events, which is risky but convenient + */ + dynamic?: boolean, + trim?: boolean, + cost?: number, + offhand?: boolean, + offhandonly?: boolean, + cursetype?: string, + /** This is from a temporary event curse */ + curse?: boolean, + /** + * For Dynamic events there is no easy way of getting the 'target' of a targeted event, + * for example bulletHitEnemy or playerAttack + * targetType specifies the key in the event data that leads to an entity target + * + * Certain constants apply: + * KDPLAYER - the current player entity + * KDGUARD - the current jail guard + * KDLEASHER - the current leasher + * KDNEAREST - the nearest entity to the player + * KDNEARESTHOSTILE - the nearest hostile enemy + */ + targetType?: string, + /** + * For Dynamic events there is no easy way of getting the 'attacker' of a targeted event, + * for example bulletHitEnemy or playerAttack + * attackerType specifies the key in the event data that leads to an entity which is responsible for the event + * + * Certain constants apply: + * KDPLAYER - the current player entity + * KDGUARD - the current jail guard + * KDLEASHER - the current leasher + * KDNEAREST - the nearest entity to the player + * KDNEARESTHOSTILE - the nearest hostile enemy + */ + attackerType?: string, + tags?: string[], + duration?: number, + always?: boolean, + bindEff?: number, + type: string; + requireFlag?: string; + trigger: string; + threshold?: number, + removeOnUncurse?: boolean, + restraint?: string; + sfx?: string; + vol?: number; + power?: number; + keepLock?: boolean, + distractEff?: number; + desireMult?: number; + count?: number; + player?: boolean; + bind?: number; + crit?: number; + bindcrit?: number; + distract?: number; + mult?: number; + kind?: string; + original?: string; + variance?: number; + damage?: string; + buffTypes?: string[]; + damageTrigger?: string; + dist?: number; + aoe?: number; + buffType?: string; + bullet?: boolean, + melee?: boolean, + time?: number; + bindType?: string; + addBind?: boolean, + chance?: number; + buff?: any; + lock?: string; + desc?: string; + buffSprite?: string; + msg?: string; + source?: number, + /** Like a prereq, but always active even if the event doesnt specify*/ + condition?: string; + /** Specifies a prereq that the event itself can use */ + prereq?: string; + color?: string; + filter?: LayerFilter; + bgcolor?: string; + /** Vibe */ + edgeOnly?: boolean; + /** Vibe */ + cooldown?: Record; + /** A required enemy tag */ + requiredTag?: string; + /** Generic required tags */ + requireTags?: string[]; + /** Generic filtered tags */ + filterTags?: string[]; + /** Type of struggle that this event triggers on */ + StruggleType?: string; + requireEnergy?: boolean; + /** Limit of whatever thius event modifies */ + limit?: number + energyCost?: number; + /** The event gets copied to any restraint if the item is linked */ + inheritLinked?: boolean; + /** Spell to cast at the target */ + spell?: string; + /** Chance to trigger is 1+(submissive % * subMult)*/ + subMult?: number; + /** Won't trigger while being leashed */ + noLeash?: boolean; + /** Stun duration */ + stun?: number; + /** Chance the player will get warned instead of punshed */ + warningchance?: number; + /** triggers from this component */ + punishComponent?: string; + /** List of restraints or other string params */ + list?: string[]; + /** Whether or not the event only triggers on human targets */ + humanOnly?: boolean; + /** Distance having to do with stealth */ + distStealth?: number; + /** Dialogue key an enemy should send */ + enemyDialogue?: string; + + escapeMethod?: string; + enemy?: string; + + // MUTABLE QUANTITIES + prevSlowLevel?: number; +} + + +type masterInfo = { + type: string, + range: number, + loose?: boolean, + aggressive?: boolean, + dependent?: boolean, + maxDist?: number, + masterTag?: string, +} + +interface String { + KDReplaceOrAddDmg(dmg: string, replaceString?: string): string; +} + +interface entity { + /** Tick of last move */ + lastmove?: number, + /** If true, immediately run the spawn AI for this once loading the map */ + runSpawnAI?: boolean, + + /** Targeted entity x */ + tx?: number, + /** Targeted entity y */ + ty?: number, + /** Targeted entity id */ + target?: number, + + refreshSprite?: boolean, + FacilityAction?: string, + + strugglePoints?: number, + + partyLeader?: number, + + /** BindStun is a mechanic that reduces the struggle rate based on how much bondage is added + * Each turn it is reduced by 10% of enemy current hp, 10% of bindStun, or 2.5% of max hp, whichever is more + * The amount is always set to the maximum of current bindStun or the amount of binding taken, or half damage taken + * + * BIG hits increase bindstun by a lot + */ + bindStun?: number, + + /** Optional leash data, used for both NPC and player */ + leash?: KDLeashData, + blockedordodged?: number, + blocks?: number, + dodges?: number, + shield?: number, + + visual_hp?: number, + visual_boundlevel?: number, + visual_distraction?: number, + visual_lifetime?: number, + + /** The enemy will follow enemies defined by this block*/ + master?: masterInfo, + + // Direction + flip?: boolean, + + sprinted?: boolean, + exertion?: number, + + // Custom play line + playLine?: string, + // Custom outfit + outfit?: string, + // Custom outfit when captured + outfitBound?: string, + // Custom style + style?: string, + // Custom intro + intro?: string, + + // Animations + offX?: number, + offY?: number, + scaleX?: number, + scaleY?: number, + animTime?: number, + + homeCoord?: WorldCoord, + /** Spawn location */ + spawnX?: number, + /** Spawn location */ + spawnY?: number, + /** Opinion of you. Positive is good. */ + opinion?: number, + /** Determines if an enemy can be dommed or not */ + domVariance?: number, + hideTimer?: boolean, + Enemy?: enemy, + /** Creation script has run */ + created?: boolean, + + /** Amount of sound the entity is currently producing */ + sound?: number, + /** List an enemy ID. Enemy will be bound to this one and dies if not found. BoundTo of -1 indicates bound to the player, and will expire if the player is jailed or passes out*/ + boundTo?: number, + /** This enemy is weakly bound and simply stunning the caster will delete it */ + weakBinding?: boolean, + player?: boolean, + /** This enemy has keys to red locked doors */ + keys?: boolean, + /** Additional Ondeath, e.g quest markers or rep */ + ondeath?: any[], + /** Used for misc data */ + data?: Record, + /** Rep changes on death */ + rep?: Record, + /** Rep changes on death */ + factionrep?: Record; + dialogue?: string, + dialogueDuration?: number, + dialogueColor?: string, + dialoguePriority?: number, + CustomName?: string, + CustomSprite?: string, + CustomNameColor?: string, + rescue?: boolean, + personality?: string, + patrolIndex?: number, + flags?: Record, + gold?: number, + noDrop?: boolean, + droppedItems?: boolean, + specialdialogue?: string, + prisondialogue?: string, + aggro?: number, + id?: number, + hp?: number, + mana?: number, + AI?: string, + moved?: boolean, + playerdmg?: number, + idle?: boolean, + summoned?: boolean, + boundLevel?: number, + specialBoundLevel?: Record, + distraction?: number, + desire?: number, + lifetime?: number, + temporary?: boolean, + maxlifetime?: number, + attackPoints?: number, + attackBonus?: number, + movePoints?: number, + aware?: boolean, + vp?: number, + tracking?: boolean, + revealed?: boolean, + ambushtrigger?: boolean, + castCooldown?: number, + castCooldownSpecial?: number, + castCooldownUnique?: Record, + specialCharges?: number, + usingSpecial?: boolean, + ignore?: boolean, + specialCD?: number, + disarmflag?: number, + channel?: number, + items?: string[], + tempitems?: string[], + x: number, + y: number, + targetingX?: number, + targetingY?: number, + lastx?: number, + lasty?: number, + fx?: number, + fy?: number, + action?: string, + path?: {x: number, y: number}[], + gx?: number, + gy?: number, + despawnX?: number, + despawnY?: number, + goToDespawn?: boolean, + gxx?: number, + gyy?: number, + rage?: number, + hostile?: number, + /** Indicates that an enemy has been modified and does not eliminate enemy data */ + modified?: boolean, + faction?: string, + allied?: number, + ceasefire?: number, + bind?: number, + /** Makes the enemy temporarily immobavle */ + immobile?: number, + blind?: number, + disarm?: number, + slow?: number, + freeze?: number, + teleporting?: number, + teleportingmax?: number, + stun?: number, + silence?: number, + vulnerable?: number, + buffs?: Record, + warningTiles?: any, + visual_x?: number, + visual_y?: number, + Analyze?: boolean, + /** Number of turns the enemy is temporarily hostile for */ + playWithPlayer?: number, + playWithPlayerCD?: number, + + IntentAction?: string, + IntentLeashPoint?: {x: number, y: number, type: string, radius: number}, + + CurrentAction?: string, + RemainingJailLeashTourWaypoints?: number, + NextJailLeashTourWaypointX?: number, + NextJailLeashTourWaypointY?: number, + KinkyDungeonJailTourInfractions?: number, + /** Used by guards. */ + CurrentRestraintSwapGroup?: string, +} + +type KinkyDungeonDress = { + Item: string; + Group?: string; + Color: string | string[]; + Filters?: Record; + Properties?: Record; + + Lost: boolean; + NoLose?: boolean; + Property?: any, + OverridePriority?: number; + Skirt?: boolean; +}[] + +interface KinkyDialogueTrigger { + dialogue: string; + allowedPrisonStates?: string[]; + /** Only allows the following personalities to do it */ + allowedPersonalities?: string[]; + blockDuringPlaytime?: boolean; + /** Whether or not the enemy must be able to talk */ + talk?: boolean, + noAlly?: boolean, + /** Exclude if enemy has one of these tags */ + excludeTags?: string[]; + /** Require all of these tags */ + requireTags?: string[]; + /** Require one of these tags */ + requireTagsSingle?: string[]; + /** Require one of these tags */ + requireTagsSingle2?: string[]; + /** Require play to be POSSIBLE */ + playRequired?: boolean; + /** Require play to be ONGOING */ + onlyDuringPlay?: boolean; + /** Allow this to happen even out of playtime if the player is submissive enough */ + allowPlayExceptionSub?: boolean; + /** If any NPC is in combat in last 3 turns this wont happen */ + noCombat?: boolean; + /** Prevents this from happening if the target is hostile */ + nonHostile?: boolean; + prerequisite: (enemy: entity, dist: number, AIData: any) => boolean; + weight: (enemy: entity, dist: number) => number; +} + +interface effectTile { + x?: number, + y?: number, + infinite?: boolean, + lightColor?: number, + //shadowColor?: number, + yoffset?: number, + xoffset?: number, + name: string, + /** Has all the functions of this one */ + functionName?: string, + duration: number, + priority: number, + data?: any, + /** For tiles which can be used to help escape */ + affinities?: string[], + /** For tiles which can be used to help escape, but only while standing */ + affinitiesStanding?: string[], + drawOver?: boolean, + tags: string[], + pauseDuration?: number, + pauseSprite?: string, + brightness?: number, + /** Deletes the effect tile if it's not on a movable tile */ + noWalls?: boolean, + /** Radius within which the tile does NOT block vision */ + visionBlockRadius?: number, + skin?: string, + /** random = basic effect where it fades in and has a chance to fade out again */ + fade?: string, + yfade?: string, + yfadeamount?: number, + statuses?: Record, + /** Spin to the effect tile sprite */ + spin?: number, + spinAngle?: number, + +}; + +/** For spells */ +interface effectTileRef { + name: string, + infinite?: boolean, + duration?: number, + data?: any, + pauseDuration?: number, + pauseSprite?: string, + skin?: string, + statuses?: Record, +}; + +type KDPerk = { + /** Determines if this one goes in the debuffs tree */ + debuff?: boolean, + /** Determines if this one goes in the buffs tree */ + buff?: boolean, + category: string, + id: string | number, + cost: number, + block?: string[], + tags?: string[], + blocktags?: string[], + blockclass?: string[], + locked?: boolean, + outfit?: string, + require?: string, + costGroup?: string, + startPriority?: number, + requireArousal?: boolean, +} + +interface spell { + nocrit?: boolean, + + /** bind tags for the spell/bullet */ + bindTags?: string[], + + ignoreshield?: boolean, + shield_crit?: boolean, // Crit thru shield + shield_stun?: boolean, // stun thru shield + shield_freeze?: boolean, // freeze thru shield + shield_bind?: boolean, // bind thru shield + shield_snare?: boolean, // snare thru shield + shield_slow?: boolean, // slow thru shield + shield_distract?: boolean, // Distract thru shield + shield_vuln?: boolean, + + /** Crit damage multiplier of the spell */ + crit?: number; + /** Sound efgfect that plays when you miscast */ + miscastSfx?: string, + /** This spell doesnt hurt the target upon directly hitting, only the AoE */ + noDirectDamage?: true, + /** This spell doesnt apply the hit effect on collision*/ + noDirectHit?: true, + /** This spell does not leave a warning to the player */ + hideWarnings?: boolean, + /** This spell does leave a warning to the player */ + alwaysWarn?:boolean, + /** Marks the spell as a command word spell to enemies */ + commandword?: boolean, + /** The spell is used to buff allies */ + buffallies?: boolean, + /** Dont buff self with it */ + noSelfBuff?: boolean, + /** caster will also target themselves */ + selfbuff?: boolean, + /** Type of binding applied to the power */ + bindType?: string, + /** Stops the spell from moving more than 1 tile */ + slowStart?: boolean, + /** Spinrate of the bullet */ + bulletSpin?: number, + /** Spinrate of the bullet hit */ + hitSpin?: number, + /** Forces spell to move more than 1 tile at beginning */ + fastStart?: boolean, + /** Affects aoe type + * acceptable values are: + * vert - creates a vertical line + * horiz - creates a horizontal line + * box - uses chebyshev distance + * cross - creates a vertical and horizontal line + */ + aoetype?: string, + aoetypetrail?: string, + secondaryhit?: string, + upcastFrom?: string, + upcastLevel?: number, + hitColor?: number; + bulletColor?: number; + trailColor?: number; + hitLight?: number; + bulletLight?: number; + trailLight?: number; + goToPage?: number; + tags?: string[]; + effectTile?: effectTileRef, + effectTileAoE?: number, + effectTileDurationMod?: number, + effectTilePre?: effectTileRef, + effectTileDurationModPre?: number, + effectTileLinger?: effectTileRef, + effectTileDurationModLinger?: number, + effectTileDensityLinger?: number, + effectTileTrail?: effectTileRef, + effectTileDurationModTrail?: number, + effectTileDensityTrail?: number, + effectTileTrailAoE?: number, + effectTileDoT?: effectTileRef, + effectTileDoT2?: effectTileRef, + effectTileDistDoT?: number, + effectTileDurationModDoT?: number, + effectTileDensityDoT?: number, + effectTileDensity?: number, + + /** Hides this spell in the spell screen */ + hide?: boolean, + + shotgunCount?: number, + shotgunFan?: boolean, + shotgunSpread?: number, + shotgunDistance?: number, + shotgunSpeedBonus?: number, + + distractEff?: number, + desireMult?: number, + bindEff?: number, + + nonmagical?: boolean, + + damageFlags?: string[], + /** Wont spawn a trail on the player, ever */ + noTrailOnPlayer?: boolean, + /** Wont spawn a trail on any entity, ever */ + noTrailOnEntity?: boolean, + /** Wont spawn a trail on any allied entity, ever */ + noTrailOnAlly?: boolean, + /** Color of the spell and bullet warningsd */ + color?: string, + /** Buffs applied by the hit will effect everyone */ + buffAll?: boolean, + name: string; + customCost?: string, + /** Spell does not advance time */ + quick?: boolean; + addBind?: boolean, + /** spell required to unlock this one */ + prerequisite?: string | string[]; + /** blocked if you have this spell */ + blockedBy?: string[]; + /** Spell is hidden if you didnt learn it */ + hideUnlearnable?: boolean, + /** Spell is hidden if you didnt learn this spell */ + hideWithout?: string, + /** Spell is hidden if you learned a specific spell */ + hideWith?: string, + /** Spell is hidden if you DID learn it */ + hideLearned?: boolean, + /** Automatically learns the spells when you learn it (thru magic screen) */ + autoLearn?: string[], + /** Automatically learns the spell pages when you learn it (thru magic screen) */ + learnPage?: string[], + /** This spell wont trigger an aggro action */ + noAggro?: boolean; + /** Whether the spell defaults to the Player faction */ + allySpell?: boolean; + /** This spell wont friendly fire the player */ + noFF?: boolean; + /** This spell wont affect the player if belonging to an allied entity */ + noHitAlliedPlayer?: boolean, + /** Spell overrides the faction */ + faction?: string; + /** Whether the spell defaults to the Enemy faction */ + enemySpell?: boolean; + /** Whether the spell has a direction offset when fired */ + noDirectionOffset?: boolean, + /** Hide the spell if arousal mode is off */ + arousalMode?: boolean; + /** Conjure, Illusion, Elements */ + school?: string; + /** if the type is special, this is the special type */ + special?: string; + /** Damage of the spell */ + power?: number; + /** Amount of aoe power */ + aoedamage?: number; + /** Damage type */ + damage?: string; + /** Is the damage teasing */ + tease?: boolean; + /** size of sprite */ + size?: number; + /** Prevents multiple instances of the spell from doing damage on the same turn from the same bullet to the same enemy */ + noUniqueHits?: boolean; + /** AoE */ + aoe?: number; + /** AoE of bullet itself (only for bolts) */ + bulletAoE?: number; + /** bind */ + bind?: number; + /** bind crit mult*/ + bindcrit?: number; + /** distract */ + distract?: number; + /** Bonus daMAGE TO BOUND TATRGETS */ + boundBonus?: number; + /** outfit applied (special parameter) */ + outfit?: string; + /** speed */ + speed?: number; + knifecost?: number; + staminacost?: number; + manacost: number; + chargecost?: number; + minRange?: number; + noSprite?: boolean; + /** Learn these flags permanently */ + learnFlags?: string[], + /** Increases the more you do */ + increasingCost?: boolean, + decreaseCost?: boolean, + /** Specific to a class */ + classSpecific?: string; + /** Verbal, arms, or legs */ + components?: string[]; + /** The bullet's position is always fixed toward the caster */ + followCaster?: boolean, + /** Spell level */ + level: number; + /** Whether the spell is passive (like the summon count up) or active like the bolt or toggle spells*/ + passive?: boolean; + /** An active spell but it has passive effects */ + mixedPassive?: boolean; + /** Active spell for mana cost purposes, only used to override behavior of passive and toggle spells */ + active?: boolean; + /** costOnToggle */ + costOnToggle?: boolean; + /** Type of the spell */ + type: string; + /** Type of effect on hit */ + onhit?: string; + /** Duration of the status effect applied */ + time?: number; + /** For Inert spells, this is the lifetime of the main bullet */ + delay?: number; + /** Random added onto delay */ + delayRandom?: number; + /** castRange */ + castRange?: number; + /** Spell range */ + range?: number; + /** lifetime of the Hit bullet created by the spell, not the bullet itself in the case of an "inert" bullet*/ + lifetime?: number; + /** Prevents the bullet from having a source, i.e. the bullet is not associated from the caster*/ + noSource?: boolean, + /** Specifically for the bullet lifetime, currently unused */ + bulletLifetime?: number; + /** channel turns */ + channel?: number; + /** Noise spell makes on cast */ + noise?: number; + /** block */ + block?: number; + /** played on cast */ + sfx?: string; + /** Played on damage dealt */ + hitsfx?: string; + /** Played on bullet impact */ + landsfx?: string; + /** trailEvadeable */ + trailEvadeable?: boolean; + /** trailNoblock */ + trailNoblock?: boolean; + /** trailPower */ + trailPower?: number; + /** trailHit */ + trailHit?: string; + /** trailLifetime */ + trailLifetime?: number; + /** trailTime */ + trailTime?: number; + /** Random number to increase lifetime by */ + lifetimeHitBonus?: number; + /** Random number to increase trail lifetime by */ + trailLifetimeBonus?: number; + /** Playereffect of the trail */ + trailPlayerEffect?: any; + /** trailChance */ + trailChance?: number; + /** Creates trails on the projectiles itself too */ + trailOnSelf?: boolean; + /** trailDamage */ + trailDamage?: string; + /** trailspawnaoe */ + trailspawnaoe?: number; + /** Casts a spell as a trail */ + trailcast?: any; + /** trail */ + trail?: string; + /** Spell points cost to buy */ + spellPointCost?: number; + /** Whether the spell heals or not */ + heal?: boolean; + /** Whether AI treats as a buff */ + buff?: boolean; + /** The spell needs this condition for an enemy to cast it*/ + castCondition?: string; + /** Player can only cast spell on a creature or player */ + mustTarget?: boolean; + /** Player cant target player */ + noTargetPlayer?: boolean; + /** Only target walls */ + WallsOnly?: boolean; + /** Spell can be dodged, default cantt be dodged */ + evadeable?: boolean; + /** Spell can NOT be blocked. default can be blocked */ + noblock?: boolean; + /** Targeting location */ + meleeOrigin?: boolean; + /** Cant hit the same enemy twice per turrn, impoprtant for piercing spells */ + noDoubleHit?: boolean; + /** Doesnt do spellcast on the hit */ + noCastOnHit?: boolean; + /** Casts a spellcast during the delay */ + castDuringDelay?: boolean; + /** Casts spell */ + spellcast?: any; + /** Casts spell on cast */ + extraCast?: any; + /** spell cast on hit */ + spellcasthit?: any; + /** List of buffs applied by the spell */ + buffs?: any[]; + /** Whether the spell is off by default */ + defaultOff?: boolean; + /** List of events applied by the spell */ + events?: KinkyDungeonEvent[]; + /** List of events applied by the spell to its hit */ + hitevents?: KinkyDungeonEvent[]; + /** spell pierces */ + piercing?: boolean; + /** spell pierces enemies */ + pierceEnemies?: boolean; + /** spell pierces */ + passthrough?: boolean; + /** Deals DoT */ + dot?: boolean; + /** spell pierces */ + noTerrainHit?: boolean; + /** spell pierces */ + noEnemyCollision?: boolean; + /** If an enemy has one of these tags it will get hit no matter what*/ + alwaysCollideTags?: string[], + /** trail pierces */ + piercingTrail?: boolean; + /** nonVolatile */ + nonVolatile?: boolean; + /** likely to cause chain reactions */ + volatile?: boolean; + /** likely to cause chain reactions */ + volatilehit?: boolean; + /** Can only block these types of spells */ + blockType?: string[], + /** Cancels automove when cast */ + cancelAutoMove?: boolean; + /** requireLOS */ + requireLOS?: boolean; + /** selfTargetOnly */ + selfTargetOnly?: boolean; + /** AI will only target creatures with this tag */ + filterTags?: string[]; + /** Whether or not sends a message on cast */ + msg?: boolean; + /** Suppress summon message */ + noSumMsg?: boolean; + /** Targeted like a bolt, showing the aim line */ + projectileTargeting?: boolean; + /** Adds additional distance on the cast when targeted by an enemy */ + extraDist?: number + /** CastInWalls */ + CastInWalls?: boolean; + /** Allows casting into fog of war */ + CastInDark?: boolean; + /** noTargetEnemies */ + noTargetEnemies?: boolean; + /** Exception list for NoTargetEnemies */ + exceptionFactions?: string[]; + /** */ + noTargetAllies?: boolean; + /** Can only target the player */ + targetPlayerOnly?: boolean; + /** Sets the enemy's specialCD shared between others */ + specialCD?: number; + /** AI wont choose this as first choice */ + noFirstChoice?: boolean; + /** Player effect */ + playerEffect?: any; + /** Doesnt send cast message */ + noCastMsg?: boolean; + /** Casts on self always */ + selfcast?: boolean; + /** Cant miscast */ + noMiscast?: boolean; + /** summon */ + summon?: any[]; + /** Spell does not show up in the spells scrreen until learned */ + secret?: boolean; + /** Enemies summoned by this spell will have their default faction and not the caster's faction */ + defaultFaction?: boolean; + +} + +interface KDQuest { + name: string; + npc: string; + visible: boolean; + nocancel?: boolean, + tick?: (delta: number) => void; + worldgenstart?: () => void; + accept?: () => void; + weight: (RoomType: any, MapMod: any, data: any, currentQuestList?: any) => number; + prerequisite: (RoomType: any, MapMod: any, data: any, currentQuestList: any) => boolean; + tags?: string[], +}; + +interface KDPoint {x: number, y: number} +interface KDJailPoint extends KDPoint {type: string, radius: number, requireLeash?: boolean, requireFurniture?: boolean, direction?:{x: number, y: number}, restraint?:string, restrainttags?:string[]} + +interface KinkyDialogue { + /** REPLACETEXT -> Replacement */ + data?: Record; + /** Tags for filtering */ + tags?: string[]; + singletag?: string[]; + excludeTags?: string[]; + /** Shows the quick inventory */ + inventory?: boolean; + /** Function to play when clicked. If not specified, nothing happens. Bool is whether or not to abort current click*/ + clickFunction?: (gagged: boolean, player: entity) => boolean | undefined; + /** Function to play when entered from a diff stage*/ + enterFunction?: (gagged: boolean, player: entity, fromstage: string) => void; + + /** Draw function. Fires each frame. Good for highlighting things, drawing extra buttons, etc. Boolean = true will prevent the rest of dialogue from being drawn, use with caution*/ + drawFunction?: (gagged: boolean, player: entity, delta: number) => boolean; + /** Function to play when clicked, if considered gagged. If not specified, will use the default function. */ + gagFunction?: (player: entity) => boolean | undefined; + /** Will not appear unless function returns true */ + prerequisiteFunction?: (gagged: boolean, player: entity) => boolean; + /** Will appear greyed out unless true */ + greyoutFunction?: (gagged: boolean, player: entity) => boolean; + greyoutCustomTooltip?: (gagged: boolean, player: entity) => string; + greyoutTooltip?: string; + /** List of personalities supported by this dialogue */ + personalities?: string[]; + /** Jumps to the specified dialogue when clicked, after setting the response string*/ + leadsTo?: string; + leadsToStage?: string; + /** Pressing the skip key will click this option */ + skip?: boolean; + /** After leading to another dialogue, the response will NOT be updated */ + dontTouchText?: boolean; + exitDialogue?: boolean; + /** The response the NPC will give when this dialogue is clicked. If response is "null", then it keeps the original, "" uses pregenerated + * The string name will be "r" + response with a couple of enemy-specific variations + */ + response?: string; + /** Whether or not the response is different if you are gagged */ + responseGag?: boolean; + /** The option for you to select for this dialogue. "" means pregenerated, OK to put "" for top-level KinkyDialogues + * The string name will be "d" + response + */ + playertext?: string; + /** Whether or not this line has a gag-specific dialogue line */ + gag?: boolean; + /** Threshold at which the player is considered gagged for this dialogue. Default is 0.01*/ + gagThreshold?: number; + /** Whether or not this option appears while gagged */ + gagDisabled?: boolean; + /** Whether or not this option appears while ungagged */ + gagRequired?: boolean; + /** Options to display */ + options?: Record; + /** Name of a dialogue to get extra options from. Merges them, preferring this dialogue's options if the name is the same */ + extraOptions?: string; + + outfit?: string; + chance?: number; +} + +interface KinkyVibration { + sound: string, + // Basic Factors + /** Item applying this vibration */ + source: string, + /** Identification */ + name: string, + intensity: number, + /** Location(s) of the vibration */ + location: string[], + + // Total duration + duration: number, + durationLeft: number, + + // Denial + /** Will turn off for this long when being denied */ + denyTime?: number, + denyTimeLeft?: number, + + /** Will deny this many times. */ + denialsLeft?: number, + /** Always denies instead of orgasm. Overrides edgeOnly in the vibration itself but gets overridden by vibe modifiers */ + alwaysDeny?: boolean, + /** Chance to deny. 0 or undefined means 100%*/ + denialChance?: number, + /** Chance to deny if the player is likely to orgasm. 0 or undefined means 100%*/ + denialChanceLikely?: number, + + // Edging + /** After this much time the orgasms will be unlocked*/ + edgeTime?: number, + edgeTimeLeft?: number, + /** The vibration will sense when the player is at max arousal and only decrement the timer then */ + tickEdgeAtMaxArousal?: boolean, + + + /** Will repeat this many times */ + loopsLeft?: number, + + /** Orgasm will always be impossible */ + edgeOnly?: boolean, + + /** Table of modifiers */ + VibeModifiers: VibeMod[], +} + +interface VibeMod { + sound: string, + /** Source of the modifier */ + source: string, + /** Identifier of the modifier */ + name: string, + /** Location of the modifier */ + location: string, + /** Duration of the vibe modifier */ + duration: number, + durationLeft: number, + /** Change to intensity, cannot go below 1, capped at the value of the highest/lowest mod*/ + intensityMod: number, + /** Forces intensity*/ + intensitySetpoint?: number, + edgeOnly?: boolean, + forceDeny?: boolean, + bypassDeny?: boolean, + bypassEdge?: boolean, + /** Duration does not tick down while this vibe mod is on */ + extendDuration?: boolean, + /** Increments the deny chance */ + denyChanceMod?: number, + /** Increments the deny chance */ + denyChanceLikelyMod?: number, +} + +interface KDStruggleData { + minSpeed: number; + handBondage: number; + armsBound: boolean; + handsBound: boolean; + failSuffix: string; + restraint: item, + struggleType: string, + struggleGroup: string, + escapeChance: number, + cutBonus: number, + origEscapeChance: number, + origLimitChance: number, + helpChance: number, + limitChance: number, + strict: number, + cutSpeed: number, + affinity: string, + hasAffinity: boolean, + restraintEscapeChance: number, + cost: number, + noise: number, + wcost: number, + escapePenalty: number, + willEscapePenalty: number, + canCut: boolean, + canCutMagic: boolean, + toolBonus: number, + toolMult: number, + buffBonus: number, + buffMult: number, + restriction: number, + struggleTime: number, + speedMult: number, + escapeSpeed: number, + query: boolean, + maxLimit: number, + result: string, + lockType: KDLockType, + + extraLim: number, + extraLimPenalty: number, + extraLimThreshold: number, + + upfrontWill?: boolean, +} + +interface KDFilteredInventoryItem { + name: any; + item: item; + preview: string; + preview2?: string; + previewcolor?: string; + previewcolorbg?: string; + key?: string; +} + +interface KDInventoryActionDef { + text?: (player: entity, item: item) => string; + label?: (player: entity, item: item) => string; + itemlabel?: (player: entity, item: item) => string; + labelcolor?: (player: entity, item: item) => string; + itemlabelcolor?: (player: entity, item: item) => string; + show?: (player: entity, item: item) => boolean; + valid: (player: entity, item: item) => boolean; + click: (player: entity, item: item,) => void; + cancel: (player: entity, delta: number) => boolean; + icon: (player: entity, item: item) => string; + hotkey?: () => string, + hotkeyPress?: () => string, + alsoShow?: string[], +} + +interface KinkyDungeonSave { + stats: any; + KinkyDungeonEffectTiles: any; + KinkyDungeonTiles: any; + KinkyDungeonTilesSkin: any; + KinkyDungeonTilesMemory: any; + KinkyDungeonRandomPathablePoints: any; + KinkyDungeonEntities: any; + KinkyDungeonBullets: any; + KinkyDungeonStartPosition: any; + KinkyDungeonEndPosition: any; + KinkyDungeonGrid: any; + KinkyDungeonGridWidth: number; + KinkyDungeonGridHeight: number; + KinkyDungeonFogGrid: any; + /** Metadata */ + saveStat: { + version: string, + appearance: any[], + default: KinkyDungeonDress, + poses: Record, + Palette: string, + + + outfit: string, + name: string, + level: number, + sp: string, + mp: string, + wp: string, + dp: string, + } + + KinkyDungeonCurrentTick: number, + + errorloading: boolean, + modsmissing: boolean, + + + version: string, + KinkyDungeonPlayerEntity: any; + level: number; + checkpoint: string; + rep: Record; + costs: Record; + pcosts: Record; + orbs: number[]; + chests: number[]; + dress: string; + gold: number; + points: number; + progression: string; + inventoryVariants: Record; + consumableVariants: Record; + weaponVariants: Record; + grounditems: any; + perks: string[]; + levels: { + Elements: number; + Conjure: number; + Illusion: number; + }; + rescued: Record; + aid: Record; + seed: string; + statchoice: [string, boolean][]; + mapIndex: Record; + id: number; + idspell: number; + choices: number[]; + choices_wep: string[]; + choices_arm: string[]; + choices_con: string[]; + choices2: boolean[]; + buffs: Record; + lostitems: any[]; + caches: number[]; + hearts: number[]; + spells: string[]; + inventory: item[]; + KDGameData: KDGameDataBase; + KDMapData: KDMapDataType; + KDWorldMap: Record; + KDEventData: Object; + KDCurrentWorldSlot: { + x: number, y: number + }; + KDPersistentNPCs: string, + KDDeletedIDs: string, + KDPersonalAlt: string, + flags: [string, number][]; + uniqueHits: [string, boolean][]; + KDCommanderRoles: [number, string][]; + picks: number; + rkeys: number; + bkeys: number; + mana: number; + manapool: number; + stamina: number; + willpower: number; + distraction: number; + distractionlower: number; + wep: any; + npp: number; + diff: number; + + + // These are used only for preview purposes? + // TODO make this cleaner + inventoryarray?: { + consumable: item[], + restraint: item[], + looserestraint: item[], + weapon: item[], + outfit: item[] + }; + potions?: { + stamina: number, + mana: number, + will: number, + dist: number, + }, + journey?: string, + mistresskey?: number, + outfitForPreview?: string[], + arousalMode?: boolean, + itemMode?: number, + plug?: boolean, + plugFront?: boolean, + piercing?: boolean, + random?: boolean, + savemode?: boolean, + hardmode?: boolean, + extrememode?: boolean, + //KinkyDungeonPerksMode = KinkyDungeonStatsChoice.get("perksMode"); + perksmode?: number, + easymode?: number, + progressionmode?: string, + + faction: Record>; +} + +interface KDWorldSlot { + data: Record; + x: number; + y: number; + jx: number; + jy: number; + color: string; + name: string; + main: string; + /** Maps owned by a faction */ + outposts: Record, + /** Maps owned by an NPC */ + lairs: Record, + /** Lairs generated in a map that doesnt exist yet */ + lairsToPlace: Record, +} + +/** + * A helper class for storing 'points of interest' that can be interacted with thru scripts, or just for notation + */ +interface KDLabel { + name: string, + type: string, + faction?: string, + x: number, + y: number, + /** Whether guard type enemies will switch to guarding this if nearby */ + guard?: boolean, + /** Whether enemies will preferentially pick the point if its free */ + interesting?: boolean, + + /** NPC currently assigned to this point (-1 if none) */ + assigned: number, +} + +interface RepopQueueData { + x: number, + y: number, + time: number, + entity: entity, + /** Allow placing the object at a slightly different location */ + loose?: boolean, +} + +interface KDMapDataType { + RespawnQueue: {faction: string, enemy: string}[], + SpecialAreas: {x: number, y: number, radius: number}[], + mapX: number, + mapY: number, + RepopulateQueue: RepopQueueData[], + Checkpoint: string, + Title: string, + PrisonState: string, + /** 1 for explored, undefined not */ + ExpStair: Record, + PrisonStateStack: string[], + PrisonType: string, + + LairsToPlace: string[], + PotentialEntrances: LairEntrance[], + /** Lair to entrance data */ + UsedEntrances: Record, + + Labels: Record, + + flags?: string[], + data: Record, + + Regiments: Record, + + + GroundItems: {x: number, y: number, name: string, amount?: number} []; + + Grid: string; + Traffic: number[][]; + GridWidth: number; + GridHeight: number; + FogGrid: any[]; + FogMemory: any[]; + + + //MainPath: string, + //ShortcutPath: string, + + Tiles: Record; + TilesSkin: Record; + TilesMemory: Record; + EffectTiles: Record>; + RandomPathablePoints: Record; + Entities: entity[]; + Bullets: any[]; + StartPosition: {x: number, y: number}; + EndPosition: {x: number, y: number}; + ShortcutPositions: Record; + + PatrolPoints: {x: number, y: number}[]; + + MapBrightness: number; + + ConstantX: boolean; + + RoomType: string, + MapMod: string, + + EscapeMethod: string, + KillTarget: string, + KillQuota: number, + TrapQuota: number, + TrapsTriggered: number, + ChestQuota: number, + ChestsOpened: number, + QuestQuota: number, + QuestsAccepted: number, + KeyQuota: number, + KeysHeld: number, + + JailPoints: KDJailPoint[], + + ShopItems: shopItem[], + PoolUses: number, + PoolUsesGrace: number, + + CategoryIndex: Record, + + JailFaction: string[], + GuardFaction: string[], + MapFaction: string, +} + + + +type KDSideRoom = { + name: string, + faction?: string, + weight: number, + tags?: string[], + hidden?: boolean, + /** Rolled once each time it gets a map mod */ + chance: number, + /** + * + * @param slot Journey slot of the tile to be generated for + * @param side true = top side, false = bot side + * @returns {number} - Multiplier to chance + */ + filter: (slot: KDJourneySlot, side: boolean) => number, + mapMod: string, + altRoom: string, + escapeMethod?: string, + /** Returns whether it succeeded */ + stairCreation: (tile: any, x: number, y: number) => boolean, + /** Wander tags. + * Higher means the tag weight on the wanderAI is multiplied + */ + wandertags: Record, + /** Runs AFTER the main's worldGenScript */ + worldGenScript?: (coord: WorldCoord) => void, + /** Runs BEFORE the main's gencriteria */ + beforeWorldGenScript?: (coord: WorldCoord) => void, + +} + + +type MapMod = { + name: string, + roomType: string, + jailType?: string, + guardType?: string, + weight: number, + /** + * + * @param slot Journey slot of the tile to be generated for + * @returns {number} - multiplier to WEIGHT + */ + filter: (slot: KDJourneySlot) => number, + tags: string[], + faction?: string, + tagsOverride?: string[], + bonusTags: Record, + spawnBoxes?: any[], + bonussetpieces?: {Type: string, Weight: number}[], + altRoom: string, + /** Runs AFTER the worldgenscript */ + worldGenScript?: (coord: WorldCoord) => void, + + /** This code is run before gencriteria*/ + beforeWorldGenScript?: (coord: WorldCoord) => void; + escapeMethod?: string, + noPersistentPrisoners?: boolean, + noPersistentSpawn?: boolean, +} + +type AIType = { + /** Indicates that this enemy AI cannot be overridden */ + noOverride?: boolean, + /** allows you to set an alternative AI type when requested */ + override?: Record, + /** The AI will only wander to visible points */ + strictwander?: boolean, + /** Indicates that this is a protective AI */ + guard?: boolean, + /** This enemy is stealthy until the ambush is triggered */ + ambush?: boolean, + /** This is the tile for the AI which registers as tooltip */ + ambushtile?: string, + /** Happens at the start immediately after AI is assigned*/ + init: (enemy: entity, player: entity, aidata: KDAIData) => void, + /** Happens before movement. Return true to skip movement loop*/ + beforemove: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Whether the enemy chases the target if it sees them */ + chase: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Similar to chase but not quite. + * Will the enemy choose to go to the last seen target location? + * If it sees the target + * Can be false if you want an enemy to be more reserved about where it goes*/ + trackvisibletarget: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Whether enemy will chase the player across a long distance */ + persist: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Whether the enemy moves toward gx */ + move: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** whether the enemy obeys commands like Follow Me and such */ + follower: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Whether the enemy follows sound sources or not */ + followsound: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Whether enemy will randomly wander to nearby points*/ + wander_near: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Whether enemy will randomly choose points on the map to wander to */ + wander_far: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Function to replace wandernear. Return true to cancel stock func, false otherwise*/ + wandernear_func?: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Function to replace wanderfar. Return true to cancel stock func, false otherwise*/ + wanderfar_func?: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Whether it sets gx to gxx when idle, and gy to gyy */ + resetguardposition: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Whether enemy attacks */ + attack: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** whether enemy casts spells */ + spell: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** This function executes before wander location changes. Return True to override wander behavior */ + aftermove: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** This executes after enemy is determined to be idle or not. If true, prevents spells.*/ + afteridle?: (enemy: entity, player: entity, aidata: KDAIData) => boolean, + /** Returns the current wander long delay.*/ + wanderDelay_long?: (enemy: entity, aidata?: KDAIData) => number, + /** Returns the current wander short delay.*/ + wanderDelay_short?: (enemy: entity, aidata?: KDAIData) => number, + +} + +interface KDRuneCountData { + maxRunes: number, + runes: number, + explodeChance: number, + /** Type = bullet */ + runeList: any[], +} + +interface KDAITriggerData { + /** Determines that the AI can play with the player and initiate a play event */ + playAllowed?: boolean, + /** A SUBSET of hostile. In some cases an enemy will be hostile but not aggressive. + * neutrals and allies cannot be aggressive */ + aggressive?: boolean, + playerDist?: number, + + allowPlayExceptionSub?: boolean, + ignoreNoAlly?: boolean, + ignoreCombat?: boolean, + canTalk?: boolean, +}; + +/** Container for KD AI data + * Persistently stored as AIData variable for use in some + */ +interface KDAIData extends KDAITriggerData { + playerItems?: item[], + /** The target of the AI, NOT the KinkyDungeonPlayerEntity but rather a target entity which CAN be the player */ + player?: entity, + /** Whether or not the enemy can talk */ + canTalk?: boolean, + + /** Whether to do a defeat or not */ + defeat?: boolean, + /** Whether this enemy is idle or not. Gets set to true by default and false if the enemy does ANYTHING */ + idle?: boolean, + /** Indicates that the enemy has moved, therefore cant attack or cast unless it has the necessary properties */ + moved?: boolean, + /** Refresh the warning tiles due to whatever reason */ + refreshWarningTiles?: boolean, + + /** Enemy will ignore the player, i.e. will not attack the player or chase the player or do anything to the player */ + ignore?: boolean, + /** Player is rather tied up and not considered a big threat generally */ + harmless?: boolean, + /** Enemy belongs to a hostile faction */ + hostile?: boolean, + + /** Enemy belongs to an allied faction */ + allied?: boolean, + /** This enemy is feeling dominated by the player and will generally act submissive */ + domMe?: boolean, + + /** Hit SFX */ + hitsfx?: string, + + /** Enemy is pretty distracted */ + highdistraction?: boolean, + /** Enemy is totally distracted */ + distracted?: boolean, + /** Level of bondage on this enemy, 0-4 */ + bindLevel?: number, + + /** Enemy can ignore locks when opening doors */ + ignoreLocks?: boolean, + /** Movable tiles for the enemy */ + MovableTiles?: string, + /** Tiles that the enemy will try to avoid if possible but can still move into if needed */ + AvoidTiles?: string, + + // Enemy attack stats + /** Enemy attack type, changes based on special, etc */ + attack?: string, + range?: number, + width?: number, + accuracy?: number, + damage?: string, + power?: number, + /** Enemy has a vibe remote and will vibe the player if it hits the player */ + vibe?: boolean, + + /** Enemy is CAPABLE of leashing, it is a leashing enemy */ + leashing?: boolean, + /** Enemy would add a leash if it would be aggressive to the player */ + addLeash?: boolean, + /** Desired restraining level of the player. + * If the player is this restrained, + * then the enemy will not add any new bindings and will focus on leashing */ + targetRestraintLevel?: number, + /** What happens if the player is below the target restraint level */ + addMoreRestraints?: boolean, + + /** The enemy is ABLE to aggro the target, either due to aggression or dominant play */ + canAggro?: boolean, + /** The enemy actually aggros the target and will make attacks */ + wantsToAttack?: boolean, + wantsToTease?: boolean, + canTease?: boolean, + canAttack?: boolean, + /** The enemy actually aggros the target and will cast spells */ + wantsToCast?: boolean, + /** The enemy wants to pull the player instead of just attacking */ + wantsToLeash?: boolean, + /** The enemy wants to leash the player, but prefers to pull instead of attack */ + focusOnLeash?: boolean, + /** Enemy will move toward its target rather than its gx/gy position */ + moveTowardPlayer?: boolean, + /** Enemy will wait a bit before forcing leash again */ + SlowLeash?: boolean, + + /** The enemy plans to leash the player, + * important to declare b/c otherwise enemy can close cages, etc during play*/ + intentToLeash?: boolean, + /** The player is wearing a leash restraint and can be leash pulled */ + leashed?: boolean, + /** Enemy stops moving when in range of the player */ + holdStillWhenNear?: boolean, + + /** Position to leash/pull the player to */ + leashPos?: {x: number, y: number}, + /** nearest jail to take the player to */ + nearestJail?: {x: number, y: number, type: string, radius: number}, + + /** Enemy to follow */ + master?: entity, + /** Chance that the enemy will kite */ + kiteChance?: number, + /** Enemy has decided to kite */ + kite?: boolean, + /** This variable is supposed to make the enemy not take potshots at you while in furniture*/ + ignoreRanged?: boolean, + + /** It's time to change patrol points */ + patrolChange?: boolean, + /** This enemy is an ALLY and will follow the player */ + allyFollowPlayer?: boolean, + /** an override situation to not follow the player + * Usually done by neutral enemies or allies that the player has told to hold still + */ + dontFollow?: boolean, + + // Vision and awareness stuff + visionMod?: number, + followRange?: number, + visionRadius?: number, + chaseRadius?: number, + blindSight?: number, + sneakMult?: number, + directionOffset?: number, + + playerDistDirectional?: number, + canSensePlayer?: boolean, + canSeePlayer?: boolean, + canSeePlayerChase?: boolean, + canSeePlayerMedium?: boolean, + canSeePlayerClose?: boolean, + canSeePlayerVeryClose?: boolean, + canShootPlayer?: boolean, + + /** Chance of starting a play event */ + playChance?: number, + /** Indicates that a play event has started */ + startedDialogue?: boolean, + /** Play event that has started */ + playEvent?: boolean, +} + +interface KDJailRestraint {Name: string, Level: number, Variant?: string, Condition?: string, Priority?: string, Lock?: string}; + +type EnemyEvent = { + /** Extremely important for leash events */ + overrideIgnore?: boolean, + forceattack?: boolean, + aggressive?: boolean, + nonaggressive?: boolean, + play?: boolean, + noplay?: boolean, + /** This event wont get cleared by mass resets, like when you are deposited into a cage */ + noMassReset?: boolean, + /** Determines if the enemy will attack you */ + decideAttack?: (enemy: entity, target: entity, AIData: any, allied: boolean, hostile: boolean, aggressive: boolean) => boolean, + /** Determines if the enemy will cast spells */ + decideSpell?: (enemy: entity, target: entity, AIData: any, allied: boolean, hostile: boolean, aggressive: boolean) => boolean, + /** Determines weight */ + weight: (enemy: entity, AIData: any, allied: boolean, hostile: boolean, aggressive: boolean) => number, + /** Run when triggered */ + trigger: (enemy: entity, AIData: any) => void, + /** Run when leashes to the leash point */ + arrive?: (enemy: entity, AIData: any) => boolean, + /** Run each turn at the end */ + maintain?: (enemy: entity, delta: number, AIData?: KDAIData) => boolean, + /** Run before the move loop */ + beforeMove?: (enemy: entity, AIData: any, delta: number) => boolean, + /** Run before the attack loop */ + beforeAttack?: (enemy: entity, AIData: any, delta: number) => boolean, + /** Run before the spell loop */ + beforeSpell?: (enemy: entity, AIData: any, delta: number) => boolean, +} + +type KDLockType = { + specialActions?: (tile: any, entity: entity) => void; + canNPCPass: (xx: number, yy: number, MapTile: object, Enemy: entity) => boolean; + + filter: (Guaranteed: boolean, Floor: number, AllowGold: boolean, Type: string, data: any) => boolean; + weight: (Guaranteed: boolean, Floor: number, AllowGold: boolean, Type: string, data: any) => number; + + consume_key: boolean; + lockmult: number; + + penalty?: Record; + + /* For chests, etc*/ + pickable: boolean; + /** Replace the pick icon with hacking */ + hackPick?: boolean; + pick_speed: number; + pick_diff: number; + pick_lim?: number; + /** For restraints */ + canPick: (data: any) => boolean; + doPick: (data: any) => boolean; + failPick: (data: any) => string; + breakChance: (data: any) => boolean; + unlockable: boolean; + unlock_diff?: number; + key: string; + canUnlock: (data: any) => boolean; + doUnlock: (data: any) => boolean; + doLock?: (data: any) => void; + failUnlock: (data: any) => string; + removeKeys: (data: any) => void; + + levelStart: (item) => void; + shrineImmune: boolean; + + commandlevel: number; + commandable: boolean; + command_lesser: () => number; + command_greater: () => number; + command_supreme: () => number; + + loot_special: boolean; + loot_locked: boolean; +} + +type KDBondageStatus = { + silence: number, + bind: number, + slow: number, + blind: number, + disarm: number, + reduceaccuracy: number, + toy: number, + plug: number, + belt: number, + immobile: number, +} + +type KDMapTile = { + Labels?: Record, + name: string; + w: number; + h: number; + primInd: string, + index: Record; + flexEdge?: Record; + flexEdgeSuper?: Record; + scale: number; + category: string; + weight: number; + grid: string; + POI: any[]; + Keyring?: any[]; + Jail: any[]; + Tiles: Record; + effectTiles: Record>; + Skin: Record; + /** List of inaccessible entrance pairs */ + inaccessible: {indX1: number, indY1: number, dir1: string, indX2: number, indY2: number, dir2: string}[]; + /** tags */ + tags: string[], + /** tags that make weight 0 if they exist */ + forbidTags?: string[], + /** tags required or else bad things happen */ + requireTags?: string[], + /** tags for following 3 */ + indexTags: string[], + /** tags and max counts before this tile is no longer considered */ + maxTags: number[], + /** tags and weight bonus */ + bonusTags: number[], + /** tags and weight mult */ + multTags: number[], + /** NEGATION operator, triggers the mult if there is NOT a tag */ + notTags?: any[], +} + +interface KDBondage { + /** You cant help people out of this type */ + helpImmune?: boolean, + color: string, + /** Multiplier for enemy bondage */ + enemyBondageMult: number, + /** Order in which enemies will struggle */ + priority: number, + /** Multiplier for struggle rate */ + struggleRate: number, + /** Multiplier for the max health component of struggle */ + healthStruggleBoost: number, + /** Multiplier for the power component of struggle */ + powerStruggleBoost: number, + /** Multiplier for command level */ + mageStruggleBoost?: number, + + /** Affected by latex solvents */ + latex?: boolean, +} + +interface KDCursedVar { + variant: (restraint: restraint, newRestraintName: string) => any, + level: number, +} + +interface KDDelayedAction { + data: any, + time: number, + /** Tick of the action */ + tick: number, + maxtime: number, + commit: string, + update?: string, + /** Cancel this in certain cases */ + tags: string[], +} + +interface KDBondageMachineFunc { + eligible_player: (tile, x, y, entity) => boolean; + eligible_enemy: (tile, x, y, entity) => boolean; + + function_player: (tile, delta, x, y, entity) => boolean; + function_enemy: (tile, delta, x, y, entity) => boolean; +} + +interface KDDroppedItemProp { + /** When blindfolded, this item will be invisible if your blind level is equal to this or higher */ + tinyness?: number, + /** This item will be kept when moving between floors*/ + persistent?: boolean, +} + +type KDParticleData = { + camX?: number, + camY?: number, + + zIndex: number, + fadeEase?: string, + time: number, + phase?: number, + + scale?: number, + scale_delta?: number, + + rotation?: number, + rotation_spread?: number, + + vy?: number, + vy_spread?: number, + vx?: number, + vx_spread?: number, + sin_period?: number, + sin_period_spread?: number, + sin_x?: number, + sin_x_spread?: number, + sin_y?: number, + sin_y_spread?: number, + /** Lifetime in ms */ + lifetime: number, + lifetime_spread?: number, +} + +type KDParticleEmitterData = { + rate: number, + cd: number, + + camX?: number, + camY?: number, + + zIndex: number, + fadeEase?: string, + time: number, + phase?: number, + + scale?: number, + scale_delta?: number, + + rotation?: number, + rotation_spread?: number, + + noFace?: boolean, + + vy?: number, + vy_spread?: number, + vx?: number, + vx_spread?: number, + sin_period?: number, + sin_period_spread?: number, + sin_x?: number, + sin_x_spread?: number, + sin_y?: number, + sin_y_spread?: number, + /** Lifetime in ms */ + lifetime: number, + lifetime_spread?: number, +} + +interface KDCursedDef { + /** Always removes even if under a chastity belt */ + alwaysRemoveOnUnlock?: boolean, + /** Restraints with this curse are unremovable via shrine */ + noShrine?: boolean, + /** This curse is treated as a type of lock, for display purposes */ + lock?: boolean, + /** Power multiplier of the curse, similar to a lock's lockmult */ + powerMult?: number, + /** Fixed power increase */ + powerBoost?: number, + /** This curse keeps events with the curse property from vanishing */ + activatecurse?: boolean, + /** custom icon for removing (failure) */ + customIcon_RemoveFailure?: string, + /** custom icon for removing (success) */ + customIcon_RemoveSuccess?: string, + /** custom icon for the struggle groups display */ + customIcon_hud?: string, + /** TODO NOT IMPLEMENTED for a future RemoveCursesWithShrine function */ + shrineRemove?: string[], + level: number, + weight: (item, allHex?) => number, + customStruggle?: (item: item, Curse?: string) => void, + customInfo?: (item: item, Curse?: string) => void, + onApply?: (item: item, host?: item) => void, + condition: (item: item) => boolean, + /** Can return a boolean. True means the item is removed, if unlocked */ + remove: (item: item, host: item, specialMethod: boolean) => boolean | void, events?: KinkyDungeonEvent[] +} + +type KDRestraintVariant = { + /** Name prefix */ + prefix?: string, + /** Name suffix */ + suffix?: string, + /** The curse to apply with this inventory variant */ + curse?: string, + /** The lock to apply with this inventory variant */ + lock?: string, + /** extra events added on */ + events: KinkyDungeonEvent[], + /** The original restraint this is based on */ + template: string, + /** If true, this item will not be forcibly kept whenever being added or removed */ + noKeep?: boolean, + /** Power of the variant */ + power?: number, +} +type KDWeaponVariant = { + /** Name prefix */ + prefix?: string, + /** Name suffix */ + suffix?: string, + /** extra events added on */ + events: KinkyDungeonEvent[], + /** The original weapon this is based on */ + template: string, +} +type KDConsumableVariant = { + /** Name prefix */ + prefix?: string, + /** Name suffix */ + suffix?: string, + /** extra events added on */ + events: KinkyDungeonEvent[], + /** The original consumable this is based on */ + template: string, +} + +interface KDSpellComponent { + /** Returns true if the component is ignored in this case even for partial applications */ + ignore: (spell: spell, x: number, y: number) => boolean, + /** Returns true if the spell can be cast, or false otherwise */ + check: (spell: spell, x: number, y: number) => boolean, + /** Run when the spell is cast */ + cast?: (spell: spell, data: any) => void, + /** Get the name of the component when hovering over spell icon */ + stringShort: (ret: string) => string, + /** Get the name of the component in the spell description */ + stringLong: (spell: spell) => string, + + /** Returns the component's partial miscast chance, such as from being gagged or wearing heels */ + partialMiscastChance: (spell: spell, x: number, y: number) => number, + /** Returns the message suffix for failing due to a partial miscast chance */ + partialMiscastType: (spell: spell, x: number, y: number) => string, + +} + +type SpecialCondition = { + resetCD: boolean, + criteria: (enemy: entity, AIData: any) => boolean, +} + +type KDEventData_affinity = { + entity: entity; + forceTrue: number; + forceFalse: number; + affinity: string; + group: string; + Message: boolean; + canStand: boolean; + msgedstand: boolean; + groupIsHigh: boolean; +}; +type KDEventData_PostApply = {player: entity, item: item|null, host: item, keep: boolean, Link: boolean, UnLink: boolean} +type KDEventData_CurseCount = {restraints: {item: item, host: item}[], count: number, activatedOnly: boolean} + +interface KDExpressionType { + EyesPose: string, + Eyes2Pose: string, + BrowsPose: string, + Brows2Pose: string, + BlushPose: string, + MouthPose: string, + FearPose?: string, +} +interface KDExpressionPoseType { + Arms: string, + Legs: string, + Eyes: string, + Eyes2: string, + Brows: string, + Brows2: string, + Blush: string, + Mouth: string, + Fear?: string, +} + +type KDExpression = { + priority: number; + stackable?: boolean, + criteria: (C: any, flags: Map) => boolean; + expression: (C: any, flags: Map) => KDExpressionType +} + +interface KDPrisonState { + name: string, + /** Doesnt do anything, but marks this as a substate which goes to the last state */ + /** Unused */ + substate?: boolean, + /** If CurrentTick > TimeSinceLastStateChange + substateTimeout it goes to a refresh state */ + /** Unused */ + substateTimeout?: number, + /** Unused */ + refreshState?: string, + /** Returns a state. Runs as soon as the map is created */ + init: (MapParams: floorParams) => string, + /** Each turn this function runs and returns a state */ + update: (delta: number) => string, + /** Each turn this function runs, but only if its in the stack*/ + updateStack?: (delta: number) => void, + /** Runs when the state is left*/ + finally?: (delta: number, currentState: string, stackPop: boolean) => void, + + + +} +interface KDPrisonType { + name: string, + states: Record, + starting_state: string, + default_state: string, + + /** Each turn this function runs. If a state is returned it sets the state*/ + update: (delta: number) => string | void; +} + +interface KDPresetLoadout { + weapon_current: string, + weapon_other: string, + armor: string[], +} + +interface KDTrainingRecord { + /** Turns in this floor's session that have been trained */ + turns_trained: number, + /** Sessions where an opportunity to train was presented but player circumvented it */ + turns_skipped: number, + /** Sessions where an opportunity to train was presented */ + turns_total: number, + /** Current training amount */ + training_points: number, + /** Current training level, basically floor(training_points) */ + training_stage: number, +} + +interface KDRopeType { + tags: string[], +} + +interface KDSealGroup { + /** Whether the seal group is disabled based on the arousal mode */ + arousalMode?: boolean, + /** Level of difficulty of the seal group */ + level: number, + /** Prevents this seal group from being a greater seal */ + disallowGreater?: boolean, + /** Prevents this seal group from being a lesser seal */ + disallowLesser?: boolean, + /** The seals in this seal group */ + seals: KDSeal[], +} + +interface KDSFXGroup { + /** Sound when using an escape method*/ + sfxEscape?: { + Struggle?: string, + Cut?: string, + Remove?: string, + Pick?: string, + Unlock?: string, + NoStamina?: string, + NoWill?: string, + NoMagic?: string, + MagicCut?: string, + PickBreak?: string, + KnifeBreak?: string, + KnifeDrop?: string, + KeyDrop?: string, + PickDrop?: string, + Blocked?: string, + }, + sfxFinishEscape?: { + Struggle?: string, + Cut?: string, + Remove?: string, + Pick?: string, + Unlock?: string, + Destroy?: string, + } + /** Remove sound */ + sfxRemove?: string, + /** Equip sound */ + sfx?: string, +} + +interface KDEnemyActionType { + /** Enemy will not willingly let go of leashes during this action */ + holdleash?: boolean; + /** Enemy will sprint during this action */ + sprint?: boolean; + end?: (enemy) => void; + filter?: (enemy) => boolean; + maintain: (enemy, delta) => boolean; +} + +interface KDSeal { + /** Name of the seal buff */ + name: string, + /** Color of the seal buff */ + aura: string, + /** Sprite of the seal buff */ + aurasprite: string, + /** Events of the seal buff */ + events: KinkyDungeonEvent[], +} + +interface KDBoobyTrap { + minlevel: number, + filter: (enemy: entity, x: number, y: number, checkpoint: boolean, type: string[]) => boolean; + weight: (enemy: entity, x: number, y: number, checkpoint: boolean, type: string[]) => number; + lifetime?: number; +} + +interface ApplyVariant { + nonstackable?: boolean, + hexes: string[], + enchants: string[], + level: number, + powerBonus: number, + curse?: string, + noKeep?: boolean, + prefix?: string, + suffix?: string, + minfloor: number, + maxfloor?: number, +} + +interface SpecialStat { + PerFloor: (player: entity, amount: number) => number, // Amount lost per floor + BuffEvents?: (player: entity) => KinkyDungeonEvent[], +} + +enum PosNeutNeg { + positive=1, + neutral=0, + negative=-1, +} + +enum ModifierEnum { + restraint, + weapon, + consumable, +} + +interface KDEnchantmentType { + level: number, + filter: (item: string, allEnchant: string[], data: KDHexEnchantWeightData) => boolean, + weight: (item: string, allEnchant: string[], data: KDHexEnchantWeightData) => number, + events: (item: string, Loot: any, curse: string, primaryEnchantment: string, enchantments: string[], data?: KDHexEnchantEventsData) => KinkyDungeonEvent[] +} + +interface KDHexEnchantEventsData { + variant: {events: KinkyDungeonEvent[], template: string}, +} +interface KDHexEnchantWeightData { + item: string, +} + +interface KDEnchantment { + tags: string[], + prefix?: string, + suffix?: string, + types: Record, +} + +interface KDModifierConditionData { + element?: string, + Loot: string, + curse: string, + primaryEnchantment: string, + enchantments: string[], +} + +interface KDModifierEffectType { + level: number, + onSelect?: (item: string, data: KDModifierConditionData) => void; + filter: (item: string, positive: PosNeutNeg, data: KDModifierConditionData) => boolean; + weight: (item: string, positive: PosNeutNeg, data: KDModifierConditionData) => number; + events: (item: string, positive: PosNeutNeg, data: KDModifierConditionData) => KinkyDungeonEvent[]; +} + +interface KDModifierEffect { + tags: string[], + types: Record +} + +interface KDModifierConditionType { + level: number, + filter: (item: string, effect_positive: KDModifierEffect[], effect_neutral: KDModifierEffect[], effect_negative: KDModifierEffect[], data: KDModifierConditionData) => boolean; + weight: (item: string, effect_positive: KDModifierEffect[], effect_neutral: KDModifierEffect[], effect_negative: KDModifierEffect[], data: KDModifierConditionData) => number; + events: (item: string, effect_positive: KDModifierEffect[], effect_neutral: KDModifierEffect[], effect_negative: KDModifierEffect[], data: KDModifierConditionData) => KinkyDungeonEvent[]; +} + +interface KDModifierCondition { + tags: string[], + types: Record +} + + +interface KDSpecialEnemyBuff { + filter: (enemy: entity, type: string[]) => boolean; + weight: (enemy: entity, type: string[]) => number; + apply: (enemy: entity, type: string[]) => void; +} + +type KDCommanderOrderData = { + delta: number, + VavgWeight: number, + + globalIgnore: boolean, + + fleeThresh: number, + combat: boolean, + // Temp vars + aggressive: boolean, + invalidChoke: Record, +} + +interface KDCommanderOrder { + struggleAssist?: boolean, + capturer?: boolean, + filter: (enemy: entity, data: KDCommanderOrderData) => boolean; + weight: (enemy: entity, data: KDCommanderOrderData) => number; + apply: (enemy: entity, data: KDCommanderOrderData) => void; + maintain: (enemy: entity, data: KDCommanderOrderData) => boolean; + + /** Return true to cancel */ + update: (enemy: entity, data: KDCommanderOrderData) => boolean | void; + remove: (enemy: entity, data: KDCommanderOrderData) => void; + + global_before: (data: KDCommanderOrderData) => void; + global_after: (data: KDCommanderOrderData) => void; +} + +type KDCollectionTabDrawDef = (value: KDCollectionEntry, buttonSpacing: number, III: number, x: number, y: number) => number + +interface KDCollectionEntry { + name: string, + origname?: string, + color: string, + type: string, + sprite: string, + Facility: string, + customSprite: boolean, + escaped?: boolean, + escapegrace?: boolean, + personality: string, + + /** Optional NPC palette */ + Palette?: string, + + spawned?: boolean, + + id: number, + Enemy?: enemy, // for unique ones + /** Todo remove this and replace with persistent NPC flag */ + flags?: Record, + customOutfit?: string, + outfit?: string, + hairstyle?: string, + bodystyle?: string, + facestyle?: string, + cosplaystyle?: string, + + /** Status: Guest, Prisoner, Servant, or Manager */ + status: string, + oldstatus: string, + class: string, + + Faction: string, + Opinion: number, + Training: number, + Willpower: number, +} + +interface KDFactionProps { + /** Faction for hisec */ + jailFaction?: string, + /** Name of the room type this faction jails you in. Default is Jail */ + jailRoom?: string, + /** Name of the lair type this faction jails you in. */ + lairType?: string, + nameList?: string[], + /** Negative - will join their allies on sight against you + * Neutral - will only join if they see you attacking their ally or their ally is otherwise neutral with you + * Positive - will only join if their ally would otherwise be neutral with you + */ + honor: number, + /** Honor toward specific factions */ + honor_specific: Record, + /** Weight to have them show up in a given floor type and floor count (and in future floor X and floor Y) */ + weight: (Floor: number, Checkpoint: string, tags: string[], bonustags: Record, X: number, Y: number) => number, + /** Executes once when starting high sec dialogue */ + customHiSecDialogue?: (guard: entity) => string, + /** Custom defeat to use */ + customDefeat?: string, + /** Custom jail allied faction to use */ + jailAlliedFaction?: string, + /** Backup incase cant find strictly using jailAlliedFaction */ + jailBackupFaction?: string, + /** Custom jail outfit to use */ + jailOutfit: string, +} + +type KDJailGetGroupsReturn = { + groupsToStrip: string[], + itemsToApply: {item: string, variant: string}[], + itemsToKeep: Record, + itemsToStrip: Record, +}; + +interface KDLeashData { + priority: number, + length: number, + x: number, + y: number, + entity?: number, + reason?: string, + restraintID?: number, + color?: string, +}; + +type Lore = { + //text: string, + condition?: () => boolean, + image?: string, + /** Don't show in the list, just make available */ + noShow?: boolean, +} + +type KDJourneySlot = { + visited: boolean, + + x: number; + y: number; + color: string; + type: string; + RoomType: string; + MapMod: string; + EscapeMethod: string; + Faction: string; + SideRooms: string[]; + HiddenRooms: Record; + Checkpoint: string; + Connections: {x: number, y: number}[]; + /** Prevents from getting culled */ + protected?: boolean; +}; +type KDJourneyMap = {[_: string]: KDJourneySlot}; + +type outfit = {name: string, dress: string, shop: boolean, rarity: number, events?: KinkyDungeonEvent[], costMod?: number, palette?: string}; + +type KDTile = any; + +type KDTrapType = (tile: KDTile, entity: entity, x: number, y: number) => {msg: string, triggered: boolean} + +type KDSprites = {[_: string]: (x: number, y: number, fog: boolean, noReplace: string) => string} +type KDTeaseAttackListsType = {[_: string]: string[]} +type KDTeaseAttacksType = {[_: string]: KDTeaseAttack} +type KDTeaseAttack = { + name: string, + priority: number, + blockable: boolean, + dodgeable: boolean, + /** Allows this to be added to the list */ + filter: (enemy: entity, player: entity, AIData: KDAIData) => boolean, + /** Returns true if it connects, false otherwise if blocked/ignored somehow */ + apply: (enemy: entity, player: entity, AIData: any, blocked: boolean, evaded: boolean, damageMod: number) => boolean, +}; + +declare const zip: any; +declare const guessLanguage: { + detect(text: string): string; + info(text: string): [string, string, string]; + code(text: string): [number]; + name(text: string): string; +}; + +declare const PIXI: typeof import('pixi.js') & typeof import('pixi.js-legacy') & { + // Filters says it's deprecated and should be referenced `PIXI.` rather than `PIXI.filters.` + // But that doesn't work, and this does. + filters: typeof import('pixi-filters'), +}; + +// We can't refer to a type as `PIXI.Container`, nor `typeof PIXI.Container`, but `import(pixi.js).Container` does work +type PIXIContainer = import('pixi.js').Container; +type PIXIMesh = import('pixi.js').Mesh; +type PIXIRenderTexture = import('pixi.js').RenderTexture; +type PIXITexture = import('pixi.js').Texture; +type PIXISprite = import('pixi.js').Sprite; + + +type PIXIPlane = import('pixi.js').SimplePlane; +type PIXIBuffer = import('pixi.js').Buffer; +type IArrayBuffer = import('pixi.js').IArrayBuffer; +type PIXIArray = import('pixi.js').ITypedArray; +type PIXIAdjustmentFilter = import('pixi-filters').AdjustmentFilter; +type PIXIFilter = import('pixi.js').Filter; + +//type PIXIExtensionType = import('pixi.js').ExtensionType; +//type PIXIUnresolvedAsset = import('pixi.js').Assets; + +type PIXIMatrix = import('pixi.js').Matrix; +type PIXIPoint = import('pixi.js').Point; +type PIXIRenderer = import('pixi.js').Renderer; + +type ISpriteMaskTarget = import('pixi.js').ISpriteMaskTarget; + +type PIXICLEAR_MODES = import('pixi.js').CLEAR_MODES; +type PIXIFilterSystem = import('pixi.js').FilterSystem; + +type PIXIUnresolvedAsset = any; // The dreaded diff --git a/Game/src/base/KinkyDungeon.ts b/Game/src/base/KinkyDungeon.ts new file mode 100644 index 000000000..768430294 --- /dev/null +++ b/Game/src/base/KinkyDungeon.ts @@ -0,0 +1,6963 @@ +"use strict"; + + +let KDENABLEDISCORDSYNC = false; + +let KDGenMapCallback: () => string = null; + + +// Modders look here! +/** + * Dummy function. You can modify this function as part of your mod like so: + * let _KDModsAfterGameStart = KDModsAfterGameStart; + * KDModsAfterGameStart = () => { + * [Your stuff here] + * _KDModsAfterGameStart(); + * } + * It is declared with `let` intentionally to allow the above, without suggesting a type error + */ +let KDModsAfterGameStart = () => {}; +/** + * Dummy function. You can modify this function as part of your mod like so: + * let _KDModsAfterLoad = KDModsAfterLoad; + * KDModsAfterLoad = () => { + * [Your stuff here] + * _KDModsAfterLoad(); + * } + * It is declared with `let` intentionally to allow the above, without suggesting a type error + */ +let KDModsAfterLoad = () => {}; + +let KDFastWaitTime = 100; +let KDVeryFastWaitTime = 10; +let KDNormalWaitTime = 500; +let KDSlowWaitTime = 1500; + +let maxSaveSlots = 4; + +let KDFullscreen = false; +let KDExitButton = false; + +let KDPaletteWidth = 6; + +let KDDefaultPalette = ""; +let KDCULLTIME = 10000; // Garbage collection +let KDLoadingFinishedSet = false; + +// Disable interpolation when scaling, will make texture be pixelated +PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.LINEAR; + +let KDStandardRenderException = { + Consent: [], + Intro: [], + Logo: [], + Game: ["Game"], + Stats: [], + TileEditor: [], + Wardrobe: [], + GenMap: [], + + +}; + +let KDStateBG = { + GenMap: "Logo", +} + +let KDClipboardDisabled = window.location.host.includes('itch.zone'); +(async function() { + let queryOpts = { name: 'clipboard-read', allowWithoutGesture: false }; + try { + let permissionStatus = await navigator.permissions.query(queryOpts as PermissionDescriptor); + permissionStatus.onchange = () => { + //console.log(permissionStatus.state); + if (permissionStatus.state == 'denied') KDClipboardDisabled = true; + }; + } catch (e) { + // Handle + KDClipboardDisabled = true; + } +})(); + + + +let CanvasWidth = 2000; +let CanvasHeight = 1000; +let KDStartTime = 0; +let KDEasterEgg = Math.random() < 0.01; + +/** These languages have characters which are rendered bigger than English. */ +let KDBigLanguages = ["CN", "KR", "JP"]; +let KDBigLanguages2 = ["Chinese", "Korean", "Japanese"]; +/** Language List */ +let KDLanguages = ["", "CN", "KR", "JP", "RU", "ES"]; + +let KinkyDungeonPlayerNeedsRefresh = false; +let KinkyDungeonNextRefreshCheck = 0; + +// Check URL to see if indev branch +const pp = new URLSearchParams(window.location.search); +let param_branch = pp.has('branch') ? pp.get('branch') : ""; +let param_test = pp.has('test') ? pp.get('test') : ""; +let param_localhost = pp.has('localhost') ? pp.get('localhost') : ""; +let TestMode = param_test || param_branch || param_localhost || ServerURL == 'https://bc-server-test.herokuapp.com/'; + +let KDDebugMode = TestMode != false; +let KDDebug = false; +let KDDebugPerks = false; +let KDDebugGold = false; +let KDDebugLink = false; + +let KDAllModFiles = []; +let KDModFiles = {}; + +let VersionMajor = -1; +let VersionMinor = -1; +let VersionPatch = -1; + +let KinkyDungeonPerksConfig = "1"; +let KinkyDungeonSpellsConfig = "1"; + +let KDUnlockedPerks = []; + +let KinkyDungeonBackground = "BrickWall"; + +let KinkyDungeonPlayer: Character = null; +let KDSpeakerNPC = null; +let KinkyDungeonState = "Logo"; + +let KDIntroProgress = [0, 0, 0, 0]; +let KDIntroStage = -1; + +let KinkyDungeonRep = 0; // Variable to store max level to avoid losing it if the server doesnt take the rep update + +function KDSetDefaultKeybindings() { + KinkyDungeonKeybindingsTemp = Object.assign({}, KDDefaultKB); +} + +let KinkyDungeonKeybindings = null; +let KinkyDungeonKeybindingsTemp = null; +let KinkyDungeonKeybindingCurrentKey = ""; +let KinkyDungeonKeybindingCurrentKeyRelease = ""; + +let KinkyDungeonNewGame = 0; + +let KinkyDungeonGameRunning = false; + +let KDLose = false; + + +let KDLoadingFinished = false; +let KDLoadingDone = 1; +let KDLoadingMax = 1; + +//let KinkyDungeonKeyLower = [87+32, 65+32, 83+32, 68+32, 81+32, 45+32, 90+32, 43+32]; // WASD +let KinkyDungeonKey = ['W', 'A', 'S', 'D', 'Q', 'E', 'Z', 'C']; +//let KinkyDungeonKeyNumpad = [56, 52, 50, 54, 55, 57, 49, 51]; // Numpad +let KinkyDungeonKeySpell = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']; // 1 2 3 4 5 6 7 +let KinkyDungeonKeySpellConfig = ['<', '@', '#']; +let KinkyDungeonKeyWait = ['X']; +let KinkyDungeonKeySkip = ['Space']; +let KinkyDungeonKeyEnter = ['Enter']; +let KinkyDungeonKeySprint = ['ShiftLeft']; +let KinkyDungeonKeyWeapon = ['R',]; +let KinkyDungeonKeyUpcast = ['ControlLeft', 'AltLeft']; +let KinkyDungeonKeyMenu = ['V', 'I', 'U', 'M', 'L', '*', '-', '_', "Home", "PageUp"]; // QuikInv, Inventory, Reputation, Magic, Log, Quest, Collection, Pause, Journey +let KinkyDungeonKeyToggle = ['O', 'P', 'B', 'Backspace', '=', "ShiftRight", 'T', '?', '/', "'"]; // Log, Passing, Door, Auto Struggle, Auto Pathfind, Inspect, Wait till interrupted, Make Noise, Crouch +let KinkyDungeonKeySpellPage = ['`']; +let KinkyDungeonKeySwitchWeapon = ['F', 'G', 'H', 'J']; // Swap, Offhand, OffhandPrevious +let KinkyDungeonKeySwitchLoadout = ['[', ']', '\\']; +let KinkyDungeonKeyLogFilter = ['{', '}', ':', '"']; +let KinkyDungeonKeyMap = ['+', '<', '>']; + +let KDLoadingTextKeys: Record = {}; + +let kdSpecialModePerks = [ + "arousalMode", + "easyMode", + "norescueMode", + "arousalModePlug", + "arousalModePiercing", + "arousalModePlugNoFront", +]; + + +let KinkyDungeonGraphicsQuality = true; + +let KDToggleGroups = ["Main", "GFX", "UI", "Clothes", "Keybindings"]; + +// region Toggles +let KDToggles = { + SoundOffWhenMin: true, + SpellBook: false, + ShowRestraintOnHover: false, + HiResModel: false, + Fullscreen: false, + SkipIntro: false, + SkipTutorial: false, + VibeSounds: true, + Music: true, + Sound: true, + //HighResDisplacement: false, + OptRender: false,//!CommonIsMobile, // experimental, for now + Bloom: true, + StunFlash: true, + ParticlesFX: true, + ArousalHearts: true, + VibeHearts: true, + GagParticles: true, + FancyWalls: true, + FancyShadows: true, + LightmapFilter: true, + EnemyAnimations: true, + RetroAnim: false, + DrawArmor: true, + DynamicArmor: false, + HideFloatingWeapon: false, + CrotchRopeOption: false, + ChastityOption: false, + ChastityOption2: false, + ChastityBraOption: false, + SimpleColorPicker: true, + TransparentUI: false, + Center: false, + TurnCounter: false, + ShowNPCStatuses: true, + ShowSpellRange: true, + ForceWarnings: false, + //Drool: true, + EnableMinimap: true, + BuffSide: true, + ShowPath: true, + ShowFacing: false, + ShowSameCatSpells: true, + PlayerAura: false, + EnemyAura: true, + OutlineAura: true, + GreyscaleBlindness: true, + NearestNeighbor: true, + LazyWalk: false, + ShiftLatch: true, + Nipples: false, + NippleToysOption: false, + NippleToysHide: false, + NipplePiercingsHide: false, + //AutoCrouchOnTrip: true, + FlipStatusBars: false, + ForcePalette: false, + AutoLoadMods: false, + FlipPlayer: true, + FlipPlayerAuto: false, + Helper: true, + FastFloaters: false, + NoDmgFloaters: false, + NoForceGreet: false, + StruggleBars: true, + ShowJailedNPCSprites: true, + ShowZoom: true, + Backgrounds: true, + RawDP: false, + OnlySelfQuickInv: false, + OverrideOutfit: false, + SaveOutfit: true, + ModCompat: false, + + ApplyPaletteRestraint: true, + //ApplyPaletteOutfit: true, + ApplyPaletteTransform: true, + NoOutfitPalette: false, + + IgnoreApplyCharPalette: true, + AlwaysApplyCharPalette: true, + DefaultApplyCharPalette: false, + Autoloot: true, + + OScreenFilter: true, + DistractScreenFilter: true, + MMLabels: true, + + HideArmorWardrobe: false, + + BindPercent: true, + + AutoWaitDelayed: true, +}; + +let KDToggleCategories = { + MMLabels: "UI", + RawDP: "UI", + Backgrounds: "GFX", + ShowZoom: "UI", + ShowJailedNPCSprites: "GFX", + StruggleBars: "UI", + SpellBook: "UI", + FastFloaters: "UI", + NoDmgFloaters: "UI", + RetroAnim: "GFX", + HiResModel: "GFX", + HighResDisplacement: "GFX", + OptRender: "GFX", + Bloom: "GFX", + StunFlash: "UI", + ParticlesFX: "GFX", + ArousalHearts: "Clothes", + VibeHearts: "Clothes", + GagParticles: "Clothes", + FancyWalls: "GFX", + FancyShadows: "GFX", + LightmapFilter: "GFX", + EnemyAnimations: "GFX", + DrawArmor: "Clothes", + CrotchRopeOption: "Clothes", + ChastityOption: "Clothes", + ChastityOption2: "Clothes", + ChastityBraOption: "Clothes", + SimpleColorPicker: "Clothes", + Nipples: "Clothes", + NippleToysOption: "Clothes", + NippleToysHide: "Clothes", + NipplePiercingsHide: "Clothes", + TransparentUI: "UI", + Center: "UI", + TurnCounter: "UI", + ShowNPCStatuses: "UI", + ShowSpellRange: "UI", + ForceWarnings: "UI", + //Drool: true, + EnableMinimap: "UI", + NoForceGreet: "UI", + BuffSide: "UI", + ShowPath: "UI", + ShowFacing: "UI", + ShowSameCatSpells: "UI", + PlayerAura: "UI", + EnemyAura: "UI", + OutlineAura: "UI", + NearestNeighbor: "GFX", + Helper: "UI", + FlipStatusBars: "UI", + ShowRestraintOnHover: "UI", + ForcePalette: "Clothes", + //LazyWalk: "Controls", + //ShiftLatch: "Controls", + FlipPlayer: "Clothes", + FlipPlayerAuto: "Clothes", + GreyscaleBlindness: "GFX", + DynamicArmor: "Clothes", + OnlySelfQuickInv: "UI", + HideFloatingWeapon: "Clothes", + + ApplyPaletteRestraint: "none", + //ApplyPaletteOutfit: "none", + ApplyPaletteTransform: "none", + NoOutfitPalette: "none", + + IgnoreApplyCharPalette: "none", + AlwaysApplyCharPalette: "none", + DefaultApplyCharPalette: "none", + Autoloot: "UI", + HideArmorWardrobe: "none", + BindPercent: "UI", + AutoWaitDelayed: "UI", +}; + +// endregion + +// region Keyboard + +let KDDefaultKB = { + Down: KinkyDungeonKey[2], + DownLeft: KinkyDungeonKey[6], + DownRight: KinkyDungeonKey[7], + Left: KinkyDungeonKey[1], + Right: KinkyDungeonKey[3], + Up: KinkyDungeonKey[0], + UpLeft: KinkyDungeonKey[4], + UpRight: KinkyDungeonKey[5], + + SpellWeapon: KinkyDungeonKeyWeapon[0], + + Spell1: KinkyDungeonKeySpell[0], + Spell2: KinkyDungeonKeySpell[1], + Spell3: KinkyDungeonKeySpell[2], + Spell4: KinkyDungeonKeySpell[3], + Spell5: KinkyDungeonKeySpell[4], + Spell6: KinkyDungeonKeySpell[5], + Spell7: KinkyDungeonKeySpell[6], + Spell8: KinkyDungeonKeySpell[7], + Spell9: KinkyDungeonKeySpell[8], + Spell0: KinkyDungeonKeySpell[9], + + + + Wait: KinkyDungeonKeyWait[0], + WaitInterrupt: KinkyDungeonKeyToggle[6], + Skip: KinkyDungeonKeySkip[0], + Enter: KinkyDungeonKeyEnter[0], + + Pass: KinkyDungeonKeyToggle[1], + Door: KinkyDungeonKeyToggle[2], + Sprint: KinkyDungeonKeySprint[0], + MakeNoise: KinkyDungeonKeyToggle[7], + PlaySelf: KinkyDungeonKeyToggle[8], + Crouch: KinkyDungeonKeyToggle[9], + + Upcast: KinkyDungeonKeyUpcast[0], + UpcastCancel: KinkyDungeonKeyUpcast[1], + SpellPage: KinkyDungeonKeySpellPage[0], + + + QInventory: KinkyDungeonKeyMenu[0], + Inventory: KinkyDungeonKeyMenu[1], + Reputation: KinkyDungeonKeyMenu[2], + Magic: KinkyDungeonKeyMenu[3], + Log: KinkyDungeonKeyMenu[4], + Quest: KinkyDungeonKeyMenu[5], + Collection: KinkyDungeonKeyMenu[6], + Facilities: KinkyDungeonKeyMenu[7], + Restart: KinkyDungeonKeyMenu[8], + JourneyMap: KinkyDungeonKeyMenu[9], + + + SwitchWeapon: KinkyDungeonKeySwitchWeapon[0], + SwitchWeaponOffhand: KinkyDungeonKeySwitchWeapon[1], + SwitchWeaponOffhandPrevious: KinkyDungeonKeySwitchWeapon[2], + SwitchWeaponOffhandPrevious2: KinkyDungeonKeySwitchWeapon[3], + SwitchLoadout1: KinkyDungeonKeySwitchLoadout[0], + SwitchLoadout2: KinkyDungeonKeySwitchLoadout[1], + SwitchLoadout3: KinkyDungeonKeySwitchLoadout[2], + SpellConfig1: KinkyDungeonKeySpellConfig[0], + SpellConfig2: KinkyDungeonKeySpellConfig[1], + SpellConfig3: KinkyDungeonKeySpellConfig[2], + + AStruggle: KinkyDungeonKeyToggle[3], + APathfind: KinkyDungeonKeyToggle[4], + AInspect: KinkyDungeonKeyToggle[5], + + BulletTransparency: KinkyDungeonKeyToggle[10], + Map: KinkyDungeonKeyMap[0], + MsgLog: KinkyDungeonKeyToggle[0], + ZoomOut: KinkyDungeonKeyMap[1], + ZoomIn: KinkyDungeonKeyMap[2], +}; + +//endregion + +let KDZoomIndex = 4; +let KDZoomLevels = [6, 4, 2, 0, -1, -2, -3]; + +let KinkyDungeonRootDirectory = "Game/"; + +//"Screens/MiniGame/KinkyDungeon/"; +let KinkyDungeonGameData = null; // Data sent by other player +let KinkyDungeonGameDataNullTimer = 4000; // If data is null, we query this often +let KinkyDungeonGameDataNullTimerTime = 0; +let KinkyDungeonStreamingPlayers = []; // List of players to stream to + +let KinkyDungeonInitTime = 0; + +let KinkyDungeonSleepTime = 0; +let KinkyDungeonFreezeTime = 1000; +let KinkyDungeonPlaySelfTime = 300; +let KinkyDungeonOrgasmTime = 1000; +let KinkyDungeonAutoWait = false; +let KinkyDungeonAutoWaitStruggle = false; + +let KinkyDungeonConfigAppearance = false; + +const Consumable = "consumable"; +const Restraint = "restraint"; +const LooseRestraint = "looserestraint"; +const Outfit = "outfit"; +const Accessory = "accessory"; +const Weapon = "weapon"; +const Misc = "misc"; +const Armor = "armor"; + +let KinkyDungeonStatsChoice = new Map(); + +let KDJourney = ""; + +let KDOptOut = false; + +let KDDefaultMaxParty = 3; + + +let KDDefaultJourney = ["grv", "cat", "jng", "tmp", "bel"]; +let KDDefaultAlt = ["tmb", "lib", "cry", "ore", "bel"]; + + + +// region KDGameData + +interface KDGameDataBase { + SawFlags: Record>, + PersistentItems: Record>, + JourneyProgression: string[], + AttachedWep: string, + InventoryAction: string, + InventoryActionManaCost: number, + SellMarkup: number, + CurseLevel: number, + UsingConsumable: string, + BondageTarget: number, + FoodTarget: number, + KeysNeeded: boolean, + JailRemoveRestraintsTimer: number; + KinkyDungeonSpawnJailers: number; + KinkyDungeonSpawnJailersMax: number; + KinkyDungeonLeashedPlayer: number; + KinkyDungeonLeashingEnemy: number; + JailGuard: number; + GuardTimer: number; + GuardTimerMax: number; + GuardSpawnTimer: number; + GuardSpawnTimerMax: number; + GuardSpawnTimerMin: number; + KinkyDungeonMaxPrisonReduction: number; + KinkyDungeonPrisonReduction: number; + KinkyDungeonPrisonExtraGhostRep: number; + PrisonGoodBehaviorFromLeash: number; + KinkyDungeonJailTourTimer: number; + KinkyDungeonJailTourTimerMin: number; + KinkyDungeonJailTourTimerMax: number; + KinkyDungeonPenanceCostCurrent: number; + KinkyDungeonAngel: number; + KDPenanceStage: number; + SpawnedPartyPrisoners: Record; + KDPenanceStageEnd: number; + AngelCurrentRep: string; + KDPenanceMode: string; + OrgasmStage: number; + OrgasmTurns: number; + OrgasmStamina: number; + SleepTurns: number; + SlowMoveTurns: number; + PlaySelfTurns: number; + RescueFlag: boolean; + KinkyDungeonPenance: boolean; + GuardApplyTime: number; + WarningLevel: number; + AncientEnergyLevel: number; + OrigEnergyLevel: number; + LastMP: number; + LastAP: number; + LastSP: number; + LastWP: number; + Outfit: string, + Champion: string, + ChampionCurrent: number, + LastMapSeed: string, + AlreadyOpened: {x: number, y:number}[], + Journey: string, + CheckpointIndices: number[], + PrisonerState: string, + TimesJailed: number, + JailTurns: number, + JailKey: boolean, + CurrentDialog: string, + CurrentDialogStage: string, + OrgasmNextStageTimer: number, + DistractionCooldown: number, + ConfirmAttack: boolean, + CurrentDialogMsg: string, + CurrentDialogMsgSpeaker: string, + CurrentDialogMsgPersonality: string, + CurrentDialogMsgID: number, + CurrentDialogMsgData: Record, + CurrentDialogMsgValue: Record, + AlertTimer: number, + HeartTaken: boolean, + CurrentVibration: KinkyVibration, + Edged: boolean, + TimeSinceLastVibeStart: Record, + TimeSinceLastVibeEnd: Record, + OfferFatigue: number, + Favors: Record, + RoomType: string, + MapMod: string, + HunterTimer: number, + Hunters: number[], + Quests: string[], + QuestData: Record, + RevealedTiles: Record, + RevealedFog: Record, + PriorJailbreaks: number, + PriorJailbreaksDecay: number, + PreviousWeapon: string[], + PreviousWeaponLock: boolean[], + StaminaPause: number, + StaminaSlow: number, + ManaSlow: number, + TempFlagFloorTicks: Record, + KneelTurns: number, + AllowedSpellPages : Record, + KeyringLocations : {x: number, y: number}[], + HiddenItems : Record, + ItemPriority : Record, + CagedTime : number, + DelayedActions: KDDelayedAction[], + OfferCount: number, + ItemID: number, + Offhand: string, + OffhandOld: string, + OffhandReturn: string, + ShopkeeperFee: number, + DollCount: number, + ChestsGenerated: string[], + DollRoomCount: number, + CollectedHearts: number, + CollectedOrbs: number, + otherPlaying: number, + Training: Record, + QuickLoadout: KDPresetLoadout[], + CurrentLoadout: number, + HighestLevelCurrent: number, + HighestLevel: number, + KDChasingEnemies: entity[], + ShopRewardProgram: number, + ShopRewardProgramThreshold: number, + ShopkeepersMurdered: number, + tickAlertTimer: boolean, + HostileFactions: string[], + MovePoints: number, + Wait: number, + Class: string, + Party: entity[], + CapturedParty: entity[], + PlayerName: string, + QuickLoadout_Weapon: boolean, + QuickLoadout_Merge: boolean, + ItemsSold: Record, + MaxParty: number, + Crouch: boolean, + FocusControlToggle: Record, + FloorRobotType: Record, + EpicenterLevel: number, + BlockTokens: number, + DodgeTokens: number, + ShieldTokens: number, + BlockTokensMax: number, + DodgeTokensMax: number, + ShieldTokensMax: number, + Shield: number, + ShieldDamage: number, + Balance: number, + BalancePause: boolean, + NPCRestraints: Record> + Collection: Record, + CollectionSorted: KDCollectionEntry[], + HeelPower: number, + visionAdjust: number, + visionAdjustBlind: number, + visionBlind: number, + CollectionGuests: number, + SelectedEscapeMethod: string, + Restriction: number, + JourneyX: number, + JourneyY: number, + ShortcutIndex: string, + JourneyMap: KDJourneyMap, + JourneyTarget: {x: number, y: number}, + LastDragon: string, + ElevatorsUnlocked: Record, + TeleportLocations: Record, + MaxVisionDist: number, + MinVisionDist: number, + NightVision: number, + LockoutChance: number, + StatMaxBonus: Record, + LogFilters: Record, + NoForceGreet: boolean, + InteractTargetX: number, + InteractTargetY: number, + RegimentID: number, + Containers: Record, + FacilitiesData: FacilitiesData, + Regiments: Record, + QuickLoadouts: Record, + PersistentNPCCache: Record, + NamesGenerated: Record, + Guilt: number, + LastSave: number, + SigilsErased: number, + SealErasedQuota: number, + DragonCaptured?: boolean, + DragonTarget?: number, + /** 1 = seen it, 2 = worn it */ + IdentifiedObj?: Record, + + MaidKnightFloor: number, + UseJourneyTarget?: boolean, + AutoRelease: { + NonNotable: boolean, + Escaped: boolean, + }, + +}; + +let KDGameDataBase: KDGameDataBase = { + AutoRelease: { + NonNotable: false, + Escaped: false, + }, + MaidKnightFloor: 0, + SealErasedQuota: 0, + SawFlags: {}, + NamesGenerated: {}, + PersistentNPCCache: {}, + Containers: {}, + PersistentItems: {}, + Regiments: {}, + FacilitiesData: null, + InteractTargetX: 0, + InteractTargetY: 0, + NoForceGreet: false, + LogFilters: { + Combat: true, + Self: true, + Action: true, + Struggle: true, + Ambient: true, + Dialogue: false, + Items: true, + Kills: true, + }, + LockoutChance: 0, + ShortcutIndex: '-1', + JourneyProgression: [...KDDefaultJourney], + JourneyTarget: null, + JourneyX: 0, + JourneyY: 0, + JourneyMap: {}, + AttachedWep: "", + Collection: {}, + NPCRestraints: {}, + CollectionSorted: [], + RevealedTiles: {}, + RevealedFog: {}, + Balance: 1, + BalancePause: false, + HeelPower: 1, + SlowMoveTurns: 0, + Shield: 0, + ShieldDamage: 0, + PlayerName: "Ada", + Party: [], + CapturedParty: [], + BlockTokens: 0, + DodgeTokens: 0, + ShieldTokens: 0, + BlockTokensMax: 0, + DodgeTokensMax: 0, + ShieldTokensMax: 0, + MaxParty: KDDefaultMaxParty, + QuickLoadout_Weapon: true, + QuickLoadout_Merge: true, + FocusControlToggle: {}, + TeleportLocations: {}, + + ItemsSold: {}, + CurseLevel: 0, + UsingConsumable: "", + MovePoints: 0, + InventoryAction: "", + InventoryActionManaCost: 0, + SellMarkup: 1, + BondageTarget: -1, + FoodTarget: -1, + ShopRewardProgram: 0, + ShopRewardProgramThreshold: 500, + + ShopkeepersMurdered: 0, + + QuickLoadouts: {}, + CurrentLoadout: 0, + Training: {}, + SpawnedPartyPrisoners: {}, + CollectedOrbs: 0, + CollectedHearts: 0, + DollRoomCount: 0, + ChestsGenerated: [], + DollCount: 0, + + ElevatorsUnlocked: {}, + + CagedTime: 0, + HiddenItems: {}, + ItemPriority: {}, + KeyringLocations: [], + AllowedSpellPages: {}, + PriorJailbreaks: 0, + PriorJailbreaksDecay: 0, + KeysNeeded: false, + RoomType: "", + MapMod: "", + + Quests: [], + QuestData: {}, + + HunterTimer: 0, + Hunters: [], + + AlertTimer: 0, + OrgasmNextStageTimer: 0, + DistractionCooldown: 0, + + JailRemoveRestraintsTimer: 0, + KinkyDungeonSpawnJailers: 0, + KinkyDungeonSpawnJailersMax: 5, + KinkyDungeonLeashedPlayer: 0, + KinkyDungeonLeashingEnemy: 0, + + Guilt: 0, + + JailGuard: 0, + GuardTimer: 0, + GuardTimerMax: 55, + GuardSpawnTimer: 0, + GuardSpawnTimerMax: 125, + GuardSpawnTimerMin: 75, + KinkyDungeonMaxPrisonReduction: 10, + KinkyDungeonPrisonReduction: 0, + KinkyDungeonPrisonExtraGhostRep: 0, + PrisonGoodBehaviorFromLeash: 0, + + KinkyDungeonJailTourTimer: 0, + KinkyDungeonJailTourTimerMin: 40, + KinkyDungeonJailTourTimerMax: 60, + + KinkyDungeonPenanceCostCurrent: 100, + + KinkyDungeonAngel: 0, + KDPenanceStage: 0, + KDPenanceStageEnd: 0, + AngelCurrentRep: "", + KDPenanceMode: "", + + OrgasmStage: 0, + OrgasmTurns: 0, + OrgasmStamina: 0, + + KinkyDungeonPenance: false, + + RescueFlag: false, + + SleepTurns: 0, + PlaySelfTurns: 0, + GuardApplyTime: 0, + + AncientEnergyLevel: 0, + OrigEnergyLevel: 0, + LastAP: 0, + LastSP: KDMaxStatStart, + LastMP: KDMaxStatStart, + LastWP: KDMaxStatStart, + + Outfit: "Default", + + Champion: "", + ChampionCurrent: 0, + + WarningLevel: 0, + LastMapSeed: "", + + AlreadyOpened: [], + Journey: "", + CheckpointIndices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], + + TempFlagFloorTicks: {}, + + // "" = not a prisoner + // "jail" = must remain in cell + // "parole" = can roam but not allowed to take most actions + PrisonerState: "", + TimesJailed: 0, + JailTurns: 0, + JailKey: false, + + CurrentDialog: "", + CurrentDialogStage: "", + CurrentDialogMsg: "", + CurrentDialogMsgSpeaker: "", + CurrentDialogMsgPersonality: "", + CurrentDialogMsgData: {}, + CurrentDialogMsgValue: {}, + CurrentDialogMsgID: -1, + + ConfirmAttack: false, + HeartTaken: false, + + CurrentVibration: null, + Edged: false, + TimeSinceLastVibeStart: {}, + TimeSinceLastVibeEnd: {}, + + OfferFatigue: 0, + Offhand: "", + OffhandOld: "", + OffhandReturn: "", + + Favors: {}, + PreviousWeapon: ["Unarmed", "Unarmed", "Unarmed", "Unarmed"], + PreviousWeaponLock: [false, false, false, false], + QuickLoadout: [], + + StaminaPause: 0, + StaminaSlow: 0, + ManaSlow: 0, + KneelTurns: 0, + DelayedActions: [], + + OfferCount: 0, + + KDChasingEnemies: [], + + RegimentID: 0, + ItemID: 0, + ShopkeeperFee: 0, + otherPlaying: 0, + HighestLevel: 0, + HighestLevelCurrent: 0, + tickAlertTimer: false, + HostileFactions: [], + Wait: 0, + Class: "", + EpicenterLevel: 0, + CollectionGuests: 0, + + FloorRobotType: {}, + SelectedEscapeMethod: "Key", + + Crouch: false, + visionAdjust: 1, // Eyes start out fully light adjusted + visionAdjustBlind: 1, // Slowly follows actual visionadjust, used to determine if blindness occurs + visionBlind: 0, // Penalty to vision radius based on overbright + Restriction: 0, + LastDragon: "", + + MaxVisionDist: 8, + MinVisionDist: 2.9, + NightVision: 2.9, + + StatMaxBonus: { + AP: 0, + SP: 0, + MP: 0, + WP: 0, + }, + + LastSave: 50, + SigilsErased: 0, + IdentifiedObj: {}, + UseJourneyTarget: false, +}; + +// endregion + +let KDGameData: KDGameDataBase = Object.assign({}, KDGameDataBase); + + +function KinkyDungeonLeashingEnemy(): entity { + if (!KDPlayer().leash && !KDGameData.KinkyDungeonLeashedPlayer) return null; + if (KDGameData.KinkyDungeonLeashingEnemy || KDUpdateEnemyCache) { + return KinkyDungeonFindID(KDGameData.KinkyDungeonLeashingEnemy); + } + if (!KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + return null; + } else if (KinkyDungeonPlayerEntity.leash?.entity) { + return KinkyDungeonFindID(KinkyDungeonPlayerEntity.leash?.entity); + } + return null; +} +let KDJailGuard = null; + +function KinkyDungeonJailGuard(): entity { + if (!KDGameData.JailGuard) return null; + return KDLookupID(KDGameData.JailGuard); +} + +let KDAngel = null; +function KinkyDungeonAngel() { + if (KDGameData.KinkyDungeonAngel) { + if (!KDAngel || KDUpdateEnemyCache) { + KDAngel = KinkyDungeonFindID(KDGameData.KinkyDungeonAngel); + } + } else { + KDAngel = null; + } + return KDAngel; +} + +function KDUnlockPerk (Perk: string = "") { + if (Perk && !KDUnlockedPerks.includes(Perk)) { + KDSendMusicToast(TextGet("KDPerkUnlockedToast") + TextGet("KinkyDungeonStat" + (KinkyDungeonStatsPresets[Perk]?.id || Perk))); + KDUnlockedPerks.push(Perk); + } + KDLoadPerks(); + localStorage.setItem("KDUnlockedPerks", JSON.stringify(KDUnlockedPerks)); +} + +function KDLoadPerks() { + + KDCategories = Object.assign([], KDCategoriesStart); + for (let c of KDCategories) { + c.buffs = []; + c.debuffs = []; + } + + for (let stat of Object.entries(KinkyDungeonStatsPresets)) { + for (let c of KDCategories) { + if (stat[1].category == c.name) { + if (!stat[1].buff && (stat[1].debuff || KDGetPerkCost(stat[1]) < 0)) + c.debuffs.push(stat); + else + c.buffs.push(stat); + } + } + } + + + if (localStorage.getItem("KDUnlockedPerks")) { + let perks = JSON.parse(localStorage.getItem("KDUnlockedPerks")); + if (perks) { + for (let p of perks) { + if (!KDUnlockedPerks.includes(p)) { + KDUnlockedPerks.push(p); + } + } + } + } +} + +let KDBGColor = ""; + +function KDMapInit(list: any): Record { + let map = {}; + for (let l of list) { + map[l] = true; + } + return map; +} + +function KDistEuclidean(x: number, y: number): number { + return Math.sqrt(x*x + y*y); +} + +function KDistChebyshev(x: number, y: number): number { + return Math.max(Math.abs(x), Math.abs(y)); +} + + +function KDistTaxicab(x: number, y: number): number { + return Math.abs(x) + Math.abs(y); +} + +function KDLoadToggles() { + KDDefaultPalette = localStorage.getItem("KDDefaultPalette") || ""; + + let loaded = localStorage.getItem("KDToggles") ? JSON.parse(localStorage.getItem("KDToggles")) : {}; + for (let t of Object.keys(KDToggles)) { + if (loaded[t] != undefined) + KDToggles[t] = loaded[t]; + } +} +function KDSaveToggles() { + localStorage.setItem("KDToggles", JSON.stringify(KDToggles)); +} + +async function KDMigrateSaveToNewSystem() { + // Refresh saves + for (var i = 1; i < 5; i++) { + let num = (i); + await KinkyDungeonDBLoad(num).then((code) => { + loadedsaveslots[num - 1] = code; + }); + } + // Check for save 1 + if (!loadedsaveslots[0]) { + KinkyDungeonDBSave(1, localStorage.getItem('KinkyDungeonSave')); + } +} + +/** + * Loads the kinky dungeon game + */ +function KinkyDungeonLoad(): void { + + try { + //@ts-ignore + let API = window.kdAPI; + if (API) { + KDExitButton = true; + } + } catch (err) { + console.log(err); + if (!window.location.host?.includes("127.0.0.1")) + KDClipboardDisabled = true; + } + // Preload + KDDraw(kdcanvas, kdpixisprites, "bg", "Backgrounds/BrickWall.png", 0, 0, CanvasWidth, CanvasHeight, undefined, { + zIndex: -115, + }); + + KinkyDungeonSetupCrashHandler(); + + KDStartTime = CommonTime(); + + // Override right click and make it trigger the Skip key + // Normally we don't override right click on websites but this is a game + if (!CommonIsMobile) + document.addEventListener('contextmenu', event => { + // @ts-ignore + if (CommonIsMobile || document.activeElement?.type == "text" || document.activeElement?.type == "textarea") { + // Trigger mouse clicked + //MouseClicked = true; + } else { + event.preventDefault(); + let code = KinkyDungeonKeySkip[0]; + if (!KinkyDungeonKeybindingCurrentKey) { + KinkyDungeonKeybindingCurrentKey = code; + KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime() + 100; + // We also press it for 100 msec + (async function() { + KinkyDungeonGameKey.keyPressed[9] = true; + KDConfirmDeleteSave = false; + await sleep(100); + KinkyDungeonGameKey.keyPressed[9] = false; + })(); + } + } + }); + + for (let entry of Object.entries(KDLoadingTextKeys)) { + addTextKey(entry[0], entry[1]); + } + + KDLoadPerks(); + + CurrentDarkFactor = 0; + + KinkyDungeonPlayerNeedsRefresh = false; + + KinkyDungeonInitTime = CommonTime(); + KinkyDungeonGameKey.load(); + + if (!KinkyDungeonIsPlayer()) KinkyDungeonGameRunning = false; + //if (!KDPatched && KinkyDungeonState == 'Consent') KinkyDungeonState = "Menu"; + //if (!Player.KinkyDungeonSave) Player.KinkyDungeonSave = {}; + + if (!KinkyDungeonGameRunning) { + if (!KinkyDungeonPlayer) { // new game + KDrandomizeSeed(false); + if (KDPatched) { + // Default player character for legacy reasons + KinkyDungeonPlayer = CharacterLoadNPC(0, localStorage.getItem("PlayerName") || "Ada"); + } + + KDLoadToggles(); + + + KinkyDungeonBones = localStorage.getItem("KinkyDungeonBones") != undefined ? localStorage.getItem("KinkyDungeonBones") : KinkyDungeonBones; + KDBGColor = localStorage.getItem("KDBGColor") != undefined ? localStorage.getItem("KDBGColor") : "#000000"; + + if (localStorage.getItem("KDResolution")) { + let parsed = parseInt(localStorage.getItem("KDResolution")); + if (parsed != undefined) { + KDResolutionListIndex = parsed; + KDResolution = KDResolutionList[KDResolutionListIndex]; + } + } + if (localStorage.getItem("KDVibeVolume")) { + let parsed = parseInt(localStorage.getItem("KDVibeVolume")); + if (parsed != undefined) { + KDVibeVolumeListIndex = parsed; + KDVibeVolume = KDVibeVolumeList[KDVibeVolumeListIndex]; + } + } + if (localStorage.getItem("KDMusicVolume")) { + let parsed = parseInt(localStorage.getItem("KDMusicVolume")); + if (parsed != undefined) { + KDMusicVolumeListIndex = parsed; + KDMusicVolume = KDMusicVolumeList[KDMusicVolumeListIndex]; + } + } + if (localStorage.getItem("KDSfxVolume")) { + let parsed = parseInt(localStorage.getItem("KDSfxVolume")); + if (parsed != undefined) { + KDSfxVolumeListIndex = parsed; + KDSfxVolume = KDSfxVolumeList[KDSfxVolumeListIndex]; + } + } + if (localStorage.getItem("KDAnimSpeed")) { + let parsed = parseInt(localStorage.getItem("KDAnimSpeed")); + if (parsed != undefined) { + KDAnimSpeedListIndex = parsed; + KDAnimSpeed = KDAnimSpeedList[KDAnimSpeedListIndex] || 0; + } + } + if (localStorage.getItem("KDSelectedFont")) { + let parsed = parseInt(localStorage.getItem("KDSelectedFont")); + if (parsed != undefined) { + KDSelectedFontListIndex = parsed; + KDSelectedFont = KDFonts.get(KDSelectedFontList[KDSelectedFontListIndex])?.alias || KDFontName; + } + } + if (localStorage.getItem("KDButtonFont")) { + let parsed = parseInt(localStorage.getItem("KDButtonFont")); + if (parsed != undefined) { + KDButtonFontListIndex = parsed; + KDButtonFont = KDFonts.get(KDButtonFontList[KDButtonFontListIndex])?.alias || KDFontName; + } + } + if (localStorage.getItem("KDGamma")) { + let parsed = parseInt(localStorage.getItem("KDGamma")); + if (parsed != undefined) { + KDGammaListIndex = parsed; + KDGamma = KDGammaList[KDGammaListIndex] || 0; + kdgammafilterstore[0] = KDGamma; + } + } + if (localStorage.getItem("zoomLvl") != undefined) { + let parsed = parseInt(localStorage.getItem("zoomLvl")); + if (parsed != undefined) { + KDZoomIndex = parsed; + } + } + if (localStorage.getItem("WToolsScrollMode") != undefined) { + let parsed = parseInt(localStorage.getItem("WToolsScrollMode")); + if (parsed != undefined) { + KDWToolsToggleScrollModeIndex = parsed; + KDWToolsToggleScrollMode = KDWToolsToggleScrollModes[KDWToolsToggleScrollModeIndex] || "Layer Bonus"; + } + } + + if (localStorage.getItem("WToolsLayerAbbr") != undefined) { + let parsed = parseInt(localStorage.getItem("WToolsLayerAbbr")); + if (parsed != undefined) { + KDWToolsLayerAbbrModeIndex = parsed; + KDWToolsLayerAbbrMode = KDWToolsLayerAbbrModes[KDWToolsLayerAbbrModeIndex] || "Short"; + } + } + + + // Initialize Cloud syncing login variables + KDCloudLogintype = localStorage.getItem('KDCloudLogintype') ? localStorage.getItem('KDCloudLogintype') : null + KDCloudLogintoken = localStorage.getItem('KDCloudLogintoken') ? localStorage.getItem('KDCloudLogintoken') : null + KDCloudLoginiv = localStorage.getItem('KDCloudLoginiv') ? localStorage.getItem('KDCloudLoginiv') : null + KDDiscordLoginname = localStorage.getItem('KDDiscordLoginname') ? localStorage.getItem('KDDiscordLoginname') : null + KDDiscordLoginpfp = localStorage.getItem('KDDiscordLoginpfp') ? localStorage.getItem('KDDiscordLoginpfp') : null + + + if (localStorage.getItem('KDLastSaveSlot') == undefined + && localStorage.getItem('KinkyDungeonSave')) { + localStorage.setItem('KDLastSaveSlot', "1"); + KDMigrateSaveToNewSystem(); + } else { + for (var i = 1; i < 5; i++) { + let num = (i); + KinkyDungeonDBLoad(num).then((code) => { + loadedsaveslots[num - 1] = code; + }); + } + // Cursed inverted saveslots to account for cloud ones + // This seemed easier than creating a new indexedDB function separately for clouds + for (var i = -1; i > -3; i--) { + let num = (i); + KinkyDungeonDBLoad(num).then((code) => { + loadedcloudsaveslots[(num * -1) - 1] = code; + }) + } + } + + + KDReloadChallenge(); + + KinkyDungeonNewDress = true; + KDCurrentOutfit = parseInt(localStorage.getItem("kdcurrentoutfit") || 0); + let appearance = DecompressB64(localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit)); + if (!appearance + // No appearance, or legacy + || (StandalonePatched && JSON.parse(appearance).length && JSON.parse(appearance)[0]?.Asset)) { + KinkyDungeonNewDress = false; + if (StandalonePatched) + appearance = DecompressB64("NobwRAsg9gJgpgGzALjAIVgTzAGjAEQEsAzYwgYwFcEAXbZABjwGEoEoAnFAuYgQ2o0wAXxzho8JKgDSUQgFFMcAM64CJMlVr0mYVuy6p8vAbTUAxQrTgdVycIpUpwAcz4Bbd3xQBGAHQMAGzBIaGhAOx4ynw0lBwxhFAAdii65Mk08cpCyP4AzACseABGHIQuABY0SSp2/gAcRWAccDCpfnn1ed09vb14Li1wKYx+BWETIZFgxQiUcCh5fgCcTXwIAA4V3rmiYI7KAEzOYG6eO/5BkxPT0bHxNIkjaRlZOflNpeVVNcp1fo08C02qNOn1wT0BkNnmNrjcSnMFsglqs8OsthdhFixJBYIhuLJCGgOFAAO6qPBEUgUQQ6FhsTjcYz8QQiHESfEyOTQSg0CpqKmaWmpekGJkmVmicR4qRgQloObKfmUjQ07QivQMww8FlmKW4yTcACCFSgLgWKupWjoGv0jKMErMeEs1lsJxNZqRrg8XnahQYAcDQaDeSiMTiCWSvjw6SSmT42WjMzKlWqtSTwN8fjhEyagzgw3ahx8OYiCPmRZLpeC03R218WP1HNlaD45AA1gBlePfISWoXqxii+060x9sAumg2OzgVsd7vxXsnM6+0EFYMbwOhsB3COPKO5GOvBPvEopn7pw/NVpZ6shPPQyt3wLTWYV0bF5+1zb13bY6WGqgC58L2rZJC4FLqFawpDpqYoOrq46TtOJzAaBfDgTOpw+jsDAdOum4btuu4PE8SaxvGiZXl8qa/HUQI3rk2bPg+BYwp+d6voiT6cWiP6Yv+BqcugGEwIQNAYFANCQYKao2rBdragAxKQqnEBYVhTm69hgJ2ppwAAMrwOTeucWYACyERuPhhvckYwgwEJOduFFvFmBRdM5/TJr2dG3p5XndAxII2acj7UdxV51pieB6VAcAAEpLjpK4XH4llWUGoUkfZ7SOYF3muSe7kBYFZ6+Ze/iBKVXnBUm+aFhF76hdFDaCc23AAOrieQFQKlAlDKBaUEDvJuiKdwKlqepTYyl1PUVKwthwOOsnWnScEjlNakaa6WFLUNJnYWZTHmU0OX7jC5lfkecZudR55pn8GaMaFDUjKFb5Ii1/FtbNgGQCBMCdu2hAcKtqrrbaWqTdN6nOppKE6SDYNHalSYXWRH4FT05m3ZRp4+bRlV1Ve71Jl97lrL9TEMFW1aNuyc2oBAQOdlAHYyZDMHjTDqDbapu1aVh7MdklqbLjhGPhqRB4vHdxUPRVz1XpmZPhZ9kU/RiDaxRz7ZGcQaNS1emNy/j92fY9fmq69UJsRTWt8Trf7/cJwEbBsmBoIQoNJIQArc4OvPwaOkpMwDBkxHAAAexLeP2ckbRNCFjiIAC6QA"); + } + + CharacterAppearanceRestore(KinkyDungeonPlayer, appearance, false, true); + + CharacterReleaseTotal(KinkyDungeonPlayer); + + + CharacterRefresh(KinkyDungeonPlayer); + + + KinkyDungeonInitializeDresses(); + KinkyDungeonDressSet(); + + CharacterNaked(KinkyDungeonPlayer); + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + + KDInitProtectedGroups(KinkyDungeonPlayer); + + } + + if (localStorage.getItem("KinkyDungeonKeybindings") && JSON.parse(localStorage.getItem("KinkyDungeonKeybindings"))) { + KinkyDungeonKeybindings = JSON.parse(localStorage.getItem("KinkyDungeonKeybindings")); + KinkyDungeonKeybindingsTemp = {}; + Object.assign(KinkyDungeonKeybindingsTemp, KinkyDungeonKeybindings); + console.log(KinkyDungeonKeybindings); + } + else { + console.log("Failed to load keybindings"); + KDSetDefaultKeybindings(); + } + + if (KinkyDungeonIsPlayer()) { + //if (!KDPatched && KinkyDungeonState == "Consent") + //KinkyDungeonState = "Menu"; + KinkyDungeonGameData = null; + + //CharacterAppearancePreviousEmoticon = WardrobeGetExpression(Player).Emoticon; + //ServerSend("ChatRoomCharacterExpressionUpdate", { Name: "Gaming", Group: "Emoticon", Appearance: ServerAppearanceBundle(Player.Appearance) }); + } else { + KinkyDungeonState = "Game"; + if (!KinkyDungeonGameData) { + KDSetWorldSlot(0, 1); + KinkyDungeonInitialize(1); + } + } + + } +} + +/** + * Restricts Devious Dungeon Challenge to only occur when inside the arcade + * @returns - If the player is in the arcade + */ +function KinkyDungeonDeviousDungeonAvailable(): boolean { + return KinkyDungeonIsPlayer() && (DialogGamingPreviousRoom == "Arcade" || MiniGameReturnFunction == "ArcadeKinkyDungeonEnd") && !KDPatched; +} + +/** + * Returns whether or not the player is the one playing, which determines whether or not to draw the UI and struggle groups + * @returns - If the player is the game player + */ +function KinkyDungeonIsPlayer(): boolean { + return true;//(!KinkyDungeonPlayerCharacter || KinkyDungeonPlayerCharacter == Player) ; +} + +/** + * Runs the kinky dungeon game and draws its components on screen + * @returns {void} - Nothing + */ + +let KinkyDungeonCreditsPos = 0; +let KDMaxPatronPerPage = 4; +let KDMaxPatron = 5; +let KinkyDungeonPatronPos = 0; +let KinkyDungeonFastWait = true; +let KinkyDungeonTempWait = false; +let KinkyDungeonSexyMode = false; +let KinkyDungeonClassMode = "Mage"; +let KinkyDungeonRandomMode = false; +let KinkyDungeonProgressionMode = "Key"; +let KinkyDungeonItemMode = 0; +let KinkyDungeonEasyMode = 0; +let KinkyDungeonSaveMode = false; +let KinkyDungeonHardMode = false; +let KinkyDungeonExtremeMode = false; +let KinkyDungeonPerksMode = 0; +let KinkyDungeonPerkProgressionMode = 1; +let KinkyDungeonPerkBondageMode = 1; +let KinkyDungeonPerkBondageVisMode = 2; +let KinkyDungeonSexyPiercing = false; +let KinkyDungeonSexyPlug = false; +let KinkyDungeonSexyPlugFront = false; +let KDOldValue = ""; +let KDOldSaveCodeValue = ""; +let KDOriginalValue = ""; + +let KDResetOutfitToggleFlag = false; + +let KDRestart = false; + +let fpscounter = 0; +let lastfps = 0; +let dispfps = 60; + +async function sleep(msec: number) { + return new Promise(resolve => setTimeout(resolve, msec)); +} + +let KDMarkAsCache = []; + +let lastGlobalRefresh = 0; +let GlobalRefreshInterval = 2500; +let KDGlobalRefresh = false; +let KDGlobalFilterCacheRefresh = true; + +let KDLogoStartTime = 0; +let KDLogoEndTime = 2500; +let KDLogoEndTime2 = 800; + +function KDOpenFullscreen() { + try { + // @ts-ignore + let API = window.kdAPI; + if (API?.setFullscreen) API.setFullscreen(); + } catch (err) { + console.log(err); + } +} + +function KDCloseFullscreen() { + try { + // @ts-ignore + let API = window.kdAPI; + if (API?.setWindowed) API.setWindowed(); + } catch (err) { + console.log(err); + } +} + +let saveError = false; + +function KinkyDungeonRun() { + if (KDSaveQueue.length > 0 && !KDSaveBusy) { + KDSaveBusy = true; + let ss = KDSaveSlot; + KDSendMusicToast(TextGet("KDSaving")); + let sd = JSON.stringify(KDSaveQueue.splice(0, 1)[0]); + KinkyDungeonCompressSave(sd).then( + (data) => { + try { + localStorage.setItem('KinkyDungeonSave', data); + } catch (e) { + KDSendMusicToast(e.message, 0); + localStorage.setItem('KinkyDungeonSave', ""); + saveError = true; + } + + if (ss != undefined) { + KinkyDungeonDBSave(ss, data); + } + } + ).finally(() => { + KDSaveBusy = false; + if (!saveError) + KDSendMusicToast(TextGet("KDSaved"), -4000); + saveError = false; + }); + } + + if (VersionMajor < 0) { + let parseString = TextGet("KDVersionStr"); + if (parseString && parseString != "KDVersionStr") { + let arr = parseString.split('.'); + + + try { + VersionMajor = parseInt(arr[0]); + } catch { + VersionMajor = 0; + } + try { + VersionMinor = parseInt(arr[1]); + } catch { + VersionMinor = 0; + } + try { + if (arr[2].includes('.')) { + arr[2] = arr[2].substring(0, arr[2].indexOf('.')); + } + if (arr[2].includes('-')) { + arr[2] = arr[2].substring(0, arr[2].indexOf('-')); + } + VersionPatch = parseInt(arr[2]); + } catch { + VersionPatch = 0; + } + + + if (KDToggles.AutoLoadMods) { + if (!KDGetMods) { + KDGetMods = true; + KDGetModsLoad(true); + } + } + } + } + + + KDJourneyGraphics.clear(); + KDJourneyGraphicsLower.clear(); + KDJourneyGraphicsUpper.clear(); + + if (StandalonePatched) { + if (KDFullscreen && !KDToggles.Fullscreen) { + KDCloseFullscreen(); + KDFullscreen = false; + } else if (!KDFullscreen && KDToggles.Fullscreen) { + KDOpenFullscreen(); + KDFullscreen = true; + } + } + + if (!KDLogoStartTime) KDLogoStartTime = CommonTime(); + + if (KinkyDungeonPlayer?.Appearance) { + for (let A = 0; A < KinkyDungeonPlayer.Appearance.length; A++) { + if (KinkyDungeonPlayer.Appearance[A]?.Asset?.Name?.includes("Penis")) { + KinkyDungeonPlayer.Appearance.splice(A, 1); + A--; + } + } + } + if (StandalonePatched && KDCurrentModels) { + let refresh = false; + if (CommonTime() > lastGlobalRefresh + GlobalRefreshInterval) { + lastGlobalRefresh = CommonTime(); + //console.log("refresh"); + refresh = true; + KDGlobalFilterCacheRefresh = true; + } + + for (let ent of KDCurrentModels.entries()) { + let MC = ent[1]; + + // Cull containers that werent drawn this turn + for (let Container of MC.Containers.entries()) { + + if (!MC.ContainersDrawn.has(Container[0]) && Container[1]) { + Container[1].Mesh.parent.removeChild(Container[1].Container); + MC.Containers.delete(Container[0]); + KDContainerClear(Container[1]); + } else if (refresh && ( + ent[0] == KinkyDungeonPlayer + || ent[0] == KDSpeakerNPC + || ent[0] == KDPreviewModel + || Math.random() < 0.01 + )) + // We only always refresh NPCs that are front and center, for optimization reasons + MC.Update.delete(Container[0]); + } + + MC.ContainersDrawn.clear(); + } + } + + + + + // Reset the sprites drawn cache + kdSpritesDrawn = new Map(); + + KDLastButtonsCache = KDButtonsCache; + KDButtonsCache = {}; + KDUpdateVibeSounds(); + KDUpdateMusic(); + + if (!KDPatched) + DrawButtonVis(1885, 25, 90, 90, "", "#ffffff", KinkyDungeonRootDirectory + "UI/Exit.png"); + + // eslint-disable-next-line no-constant-condition + if (true || KDToggles.Fullscreen) { + KinkyDungeonGridWidthDisplay = 2000/KinkyDungeonGridSizeDisplay;//17; + KinkyDungeonGridHeightDisplay = 1000/KinkyDungeonGridSizeDisplay;//9; + canvasOffsetX = 0; + canvasOffsetY = 0; + KinkyDungeonCanvas.width = 2000; + KinkyDungeonCanvas.height = 1000; + } else { + + // @ts-ignore + KinkyDungeonGridWidthDisplay = 16; + KinkyDungeonGridHeightDisplay = 9; + canvasOffsetX = canvasOffsetX_ui; + canvasOffsetY = canvasOffsetY_ui; + KinkyDungeonCanvas.width = KinkyDungeonGridSizeDisplay * KinkyDungeonGridWidthDisplay; + KinkyDungeonCanvas.height = KinkyDungeonGridSizeDisplay * KinkyDungeonGridHeightDisplay; + } + // Check to see whether the player (outside of KD) needs a refresh + KinkyDungeonCheckPlayerRefresh(); + + + if ((KinkyDungeonState != "Game" || KinkyDungeonDrawState != "Game") && KinkyDungeonState != "TileEditor") { + let BG = KDStateBG[KinkyDungeonState] || + (KinkyDungeonState == "Consent" || KinkyDungeonState == "Intro" || KinkyDungeonState == "Logo" || KinkyDungeonState == "Game") ? "Logo" : "BrickWall"; + if (StandalonePatched) { + KDDraw(kdcanvas, kdpixisprites, "bg", "Backgrounds/" + BG + (StandalonePatched ? ".png" : ".jpg"), 0, 0, CanvasWidth, CanvasHeight, undefined, { + zIndex: -115, + }); + } else { + DrawImage("Backgrounds/" + BG + ".jpg", 0, 0); + } + kdgameboard.visible = false; + kdgamefog.visible = false; + kdminimap.visible = false; + } else { + kdgameboard.visible = true; + kdminimap.visible = KinkyDungeonState != "TileEditor"; + kdgamefog.visible = KinkyDungeonState != "TileEditor"; + } + // Draw the characters + if (!KDStandardRenderException[KinkyDungeonState] + || (KDStandardRenderException[KinkyDungeonState].length > 0 + && !KDStandardRenderException[KinkyDungeonState][KinkyDungeonDrawState])) { + if (KDBGColor) { + FillRectKD(kdcanvas, kdpixisprites, "playerbg", { + Left: 0, + Top: 0, + Width: KinkyDungeonDrawState == "Game" ? 500 : 2000, + Height: 1000, + Color: KDBGColor, + zIndex: KinkyDungeonDrawState == "Game" ? -1 : -1000, + alpha: StandalonePatched ? KDUIAlpha : 0.01, + }); + } + let Char = (KinkyDungeonState == "LoadOutfit" ? KDSpeakerNPC : null) || KinkyDungeonPlayer; + DrawCharacter(Char, 0, 0, 1, undefined, undefined, undefined, undefined, undefined, KinkyDungeonPlayer == Char ? KDToggles.FlipPlayer : false); + } + + if (CommonIsMobile && mouseDown && !KDMouseInPlayableArea()) { + KDDraw(kdcanvas, kdpixisprites, "cursor", KinkyDungeonRootDirectory + "Cursor.png", MouseX, MouseY, 72, 72, undefined, { + zIndex: 300, + }); + } + + if (KDRender[KinkyDungeonState]) { + KDRender[KinkyDungeonState](); + } else + if (KinkyDungeonState == "Logo") { + if (CommonTime() > KDLogoStartTime + KDLogoEndTime) { + KinkyDungeonState = "Consent"; + KDLogoStartTime = CommonTime() + 400; + } else { + // Draw the strait-laced logo + KDDraw(kdcanvas, kdpixisprites, "logo", "Logo.png", 500, 0, 1000, 1000, undefined, { + zIndex: 0, + alpha: 0.5 - 0.5*Math.cos(Math.PI * 2 * (CommonTime() - KDLogoStartTime) / KDLogoEndTime), + }); + } + } else + if (KinkyDungeonState == "Mods") { + + DrawButtonKDEx("mods_back", (_bdata) => { + KinkyDungeonState = "Menu"; + KDExecuteMods(); + return true; + }, true, 975, 850, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", "", + undefined, undefined, undefined, undefined, + undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySkip[0]), + hotkeyPress: KinkyDungeonKeySkip[0], + }); + + (!KDExecuted) + DrawButtonKDEx("mods_load", (_bdata) => { + getFileInput(); + return true; + }, true, 975, 250, 350, 64, TextGet("KinkyDungeonLoadMod"), "#ffffff", ""); + DrawTextKD(TextGet("KinkyDungeonLoadModWarning1"), 1175, 100, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonLoadModWarning2"), 1175, 150, "#ffffff", KDTextGray2); + + KDDrawMods(); + + } else if (KinkyDungeonState == "Credits") { + let credits = TextGet("KinkyDungeonCreditsList" + KinkyDungeonCreditsPos).split('|'); + let i = 0; + for (let c of credits) { + DrawTextKD(c, 550, 25 + 40 * i, "#ffffff", KDTextGray2, undefined, "left"); + i++; + } + + DrawButtonVis(1870, 930, 110, 64, TextGet("KinkyDungeonBack"), "#ffffff", ""); + DrawButtonVis(1730, 930, 110, 64, TextGet("KinkyDungeonNext"), "#ffffff", ""); + } else if (KinkyDungeonState == "Patrons") { + let credits = KDPatrons;//TextGet("KinkyDungeonPatronsList" + x).split('|'); + DrawTextKD(TextGet("KinkyDungeonPatronsList"), 550, 25, "#ffffff", KDTextGray2, undefined, "left"); + let col = 0; + let iter = 1; + let height = 30; + let maxPatron = Math.floor(975/height); + let maxcolumn = 6; + let colwidth = 250; + for (let i = KinkyDungeonPatronPos * maxPatron; i < credits.length; i++) { + let c = credits[i]; + let yy = 25 + height * iter; + DrawTextFitKD(c, 550 + colwidth * (col), yy, colwidth - 10, "#ffffff", KDTextGray2, 24, "left", 40); + iter++; + if (iter > maxPatron) { + iter = 1; + col += 1; + } + if (col > maxcolumn) break; + } + + + DrawButtonVis(1870, 930, 110, 64, TextGet("KinkyDungeonBack"), "#ffffff", ""); + DrawButtonKDEx("patronnext", (_bdata) => { + if (KinkyDungeonPatronPos * maxPatron < credits.length - maxPatron * maxPatron) KinkyDungeonPatronPos += 1; + else KinkyDungeonPatronPos = 0; + return true; + }, true, 1730, 930, 110, 64, TextGet("KinkyDungeonNext"), "#ffffff", ""); + //DrawButtonVis(1730, 930, 110, 64, TextGet("KinkyDungeonNext"), "#ffffff", ""); + } else if (KinkyDungeonState == "Menu") { + + if (CommonTime() < KDLogoStartTime + KDLogoEndTime2) { + CommonTime(); // ... + FillRectKD(kdcanvas, kdpixisprites, "greyfade", { + Left: 0, Top: 0, Width: 2000, + Height: 1000, + Color: "#383F4F", alpha: Math.max(0, 1 - (CommonTime() - KDLogoStartTime) / KDLogoEndTime2), zIndex: 200 + }); + } + KinkyDungeonGameFlag = false; + + if (KDSaveBusy) { + DrawTextKD(TextGet("KDSaveBusyMenu"), 1000, 500, "#ffffff", KDTextGray2); + } else { + DrawCheckboxVis(1700, 25, 64, 64, TextGet("KDToggleSound"), KDSoundEnabled(), false, "#ffffff"); + // Draw temp start screen + if (KDLose) { + DrawTextKD(TextGet("End"), 1000, 250, "#ffffff", KDTextGray2); + //DrawTextKD(TextGet("End2"), 1000, 310, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("End3"), 1000, 290, "#ffffff", KDTextGray2); + } else if (!KDPatched) { + //DrawTextKD(TextGet("Intro"), 1250, 250, "#ffffff", KDTextGray2); + //DrawTextKD(TextGet("Intro2"), 1250, 300, "#ffffff", KDTextGray2); + //DrawTextKD(TextGet("Intro3"), 1250, 350, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("Intro4BC"), 1000, 960, "#ffffff", KDTextGray2); + } + + //let str = TextGet("KinkyDungeon") + " v" + TextGet("KDVersionStr"); + //DrawTextKD(str.substring(0, Math.min(str.length, Math.round((CommonTime()-KDStartTime)/100))), 1000, 80, "#ffffff", KDTextGray2, 84); + + KDDraw(kdcanvas, kdpixisprites, "logomm", KinkyDungeonRootDirectory + "SimpleLogo.png", 1000 - 350, 0, 350 * 2, 150 * 2); + DrawTextKD(KDPatched ? (TextGet("KDVersion") + " " + TextGet("KDVersionStr")) : TextGet("KDLogo2"), 1000, 300, "#fff6bc", KDTextGray2, 24); + //DrawTextKD(TextGet("KinkyDungeon") + " v" + TextGet("KDVersionStr"), 1000, 200, "#ffffff", KDTextGray2); + + if (ArcadeDeviousChallenge && KinkyDungeonDeviousDungeonAvailable() && !KDPatched) + DrawTextKD(TextGet("DeviousChallenge"), 1000, 925, "#fff6bc", KDTextGray2); + + + DrawButtonKDEx("GameContinue", () => { + let origSaveSlot = KDSaveSlot; + if (!localStorage.getItem('KinkyDungeonSave')) { + // Set the save slot - if the player last loaded a save from slot 2, this will continue saving to slot 2. + KDSaveSlot = (localStorage.getItem('KDLastSaveSlot') !== null) ? parseInt(localStorage.getItem('KDLastSaveSlot')) : 0; + + } + + KDExecuteModsAndStart(); + // Set the save slot - if the player last loaded a save from slot 2, this will continue saving to slot 2. + KDSaveSlot = (localStorage.getItem('KDLastSaveSlot') !== null) ? parseInt(localStorage.getItem('KDLastSaveSlot')) : 0; + + return true; + }, localStorage.getItem('KinkyDungeonSave') != '' + || !!(localStorage.getItem('KDLastSaveSlot') !== null && loadedsaveslots[parseInt(localStorage.getItem('KDLastSaveSlot'))-1]), + 1000-350/2, 360, 350, 64, TextGet("GameContinue"), + (localStorage.getItem('KinkyDungeonSave') + || (localStorage.getItem('KDLastSaveSlot') !== null && loadedsaveslots[parseInt(localStorage.getItem('KDLastSaveSlot')) - 1])) ? "#ffffff" : "pink", ""); + DrawButtonKDEx("GameStart", () => { + KinkyDungeonState = "Name"; + KDSaveSlot = (localStorage.getItem('KDLastSaveSlot') !== null) ? parseInt(localStorage.getItem('KDLastSaveSlot')) : 4; + let emptySlot = undefined; + for (var i = 1; i < 5; i++) { + let num = (i); + KinkyDungeonDBLoad(num).then((code) => { + loadedsaveslots[num - 1] = code; + let decoded = LZString.decompressFromBase64(code); + if (decoded && JSON.parse(decoded)?.KDGameData?.PlayerName) + loadedsaveNames[num - 1] = + JSON.parse(decoded)?.KDGameData?.PlayerName; + if (!emptySlot && !code) { + emptySlot = num; + KDSaveSlot = emptySlot; + } + }); + } + return true; + }, true, 1000-350/2, 440, 350, 64, TextGet("GameStart"), "#ffffff", ""); + DrawButtonKDEx("LoadGame", () => { + /*KinkyDungeonState = "Load";*/ + KinkyDungeonState = "LoadSlots"; + + KDConfirmDeleteSave = false; + KDPreviewModel = Object.assign({}, KinkyDungeonPlayer); + KDPreviewModel.ID = KinkyDungeonPlayer.ID + 1; // Ensure a unique id. + KinkyDungeonDBLoad(0).then((code) => { + KDSlot0 = code; + }); + for (var i = 1; i < 5; i++) { + let num = (i); + KinkyDungeonDBLoad(num).then((code) => { + loadedsaveslots[num - 1] = code; + + let decoded = LZString.decompressFromBase64(code); + if (decoded && JSON.parse(decoded)?.KDGameData?.PlayerName) + loadedsaveNames[num - 1] = + JSON.parse(decoded)?.KDGameData?.PlayerName; + }); + } + + loadedSaveforPreview = null; + KDExecuteMods(); + ElementCreateTextArea("saveInputField"); + return true; + }, true, 1000-350/2, 520, 350, 64, TextGet("LoadGame"), "#ffffff", ""); + /*DrawButtonKDEx("GameConfigKeys", () => { + KinkyDungeonState = "Keybindings"; + + if (!KinkyDungeonKeybindings) + KDSetDefaultKeybindings(); + else { + KinkyDungeonKeybindingsTemp = {}; + Object.assign(KinkyDungeonKeybindingsTemp, KinkyDungeonKeybindings); + } + return true; + }, true, 1000-350/2, 600, 350, 64, TextGet("GameConfigKeys"), "#ffffff", "");*/ + + if (KinkyDungeonKeybindingsTemp?.Spell1 && KinkyDungeonKeybindingsTemp.Spell1.length > 1 && (KinkyDungeonKeybindingsTemp.Spell1.includes("Digit") || KinkyDungeonKeybindingsTemp.Spell1.includes("Key"))) + DrawTextFitKD(TextGet("KDKeysUpdate" + (KDEasterEgg ? "EasterEgg" : "")), 1000-350/2, 600 + 32, 500, "#ffffff", undefined, 18, "right"); + else if (Object.keys(KDDefaultKB).some((key) => {return KinkyDungeonKeybindingsTemp && !KinkyDungeonKeybindingsTemp[key];})) { + DrawTextFitKD(TextGet("KDKeysNoBound" + (KDEasterEgg ? "EasterEgg" : "")), 1000-350/2, 600 + 32, 500, "#ffffff", undefined, 18, "right"); + } + DrawButtonKDEx("GameToggles", () => { + KinkyDungeonState = "Toggles"; + return true; + }, true, 1000-350/2, 600, 350, 64, TextGet("GameToggles"), "#ffffff", ""); + + let ii = 680; + if (KDExitButton) { + DrawButtonKDEx("KDExitButton", () => { + //@ts-ignore + let API = window.kdAPI; + if (API?.close) API.close(); + return true; + }, true, 1000-350/2, ii, 350, 64, TextGet("KDExit"), "#ffffff", ""); + ii += 80; + } + if (TestMode) { + DrawButtonKDEx("TileEditor", () => { + KDInitTileEditor(); + KinkyDungeonState = "TileEditor"; + return true; + }, true, 1000-350/2, ii, 350, 64, "Tile Editor", "#ffffff", ""); + } + + + DrawButtonKDEx("GoToWardrobe", (_bdata) => { + + if (StandalonePatched) { + KDSpeakerNPC = null; + KinkyDungeonState = "Wardrobe"; + KDCanRevertFlag = false; + KDWardrobeCallback = null; + KDWardrobeRevertCallback = null; + KDPlayerSetPose = false; + KDInitInventory(); + KinkyDungeonPlayerTags = new Map(); + CharacterReleaseTotal(KinkyDungeonPlayer); + KDUpdateChar(KinkyDungeonPlayer); + KDInitCurrentPose(); + KinkyDungeonInitializeDresses(); + KDUpdateModelList(); + KDRefreshOutfitInfo(); + let itt = localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit); + let orig = itt ? + JSON.parse(LZString.decompressFromBase64(itt)).appearance + || itt : ""; + let current = LZString.compressToBase64(AppearanceItemStringify(KinkyDungeonPlayer.Appearance)); + if (orig != current) KDOriginalValue = orig; + } + let appearance = DecompressB64(localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit)); + if (appearance) { + CharacterAppearanceRestore(KinkyDungeonPlayer, appearance, false, true); + let parsed = JSON.parse(appearance); + if (parsed.metadata) { + KinkyDungeonPlayer.Palette = parsed.metadata.palette; + } + + CharacterRefresh(KinkyDungeonPlayer); + } + KinkyDungeonNewDress = true; + + CharacterReleaseTotal(KinkyDungeonPlayer); + KinkyDungeonDressPlayer(); + KinkyDungeonConfigAppearance = true; + if (appearance) { + CharacterAppearanceRestore(KinkyDungeonPlayer, appearance, false, true); + let parsed = JSON.parse(appearance); + if (parsed.metadata) { + KinkyDungeonPlayer.Palette = parsed.metadata.palette; + } + CharacterRefresh(KinkyDungeonPlayer); + } + return true; + }, true, 30, 942, 440, 50, TextGet("KinkyDungeonDressPlayer"), "#ffffff", ""); + + + DrawButtonVis(1850, 942, 135, 50, TextGet("KinkyDungeonCredits"), "#ffffff", ""); + DrawButtonVis(1700, 942, 135, 50, TextGet("KinkyDungeonPatrons"), "#ffffff", ""); + + + + DrawTextKD(TextGet("Language") + " ->", 1675, 898, "#ffffff", KDTextGray2, undefined, "right"); + DrawButtonVis(1700, 874, 280, 50, localStorage.getItem("BondageClubLanguage") || "EN", "#ffffff", ""); + + + if (KDPatched) { + + DrawButtonKDEx("mods_button", (_bdata) => { + KinkyDungeonState = "Mods"; + return true; + }, true, 1700, 814, 280, 50, + !KDExecuted ? + TextGet("KDMods") : + ((KDModFileCount === 1) ? + `${KDModFileCount} ${TextGet("KDModsLoaded").replace("s","")}` : + `${KDModFileCount} ${TextGet("KDModsLoaded")}`), + `#ffffff`, ""); + + if (Object.keys(KDModConfigs).length > 0) { + DrawButtonKDEx("modconfigs_button", (_bdata) => { + KinkyDungeonState = "ModConfig"; + return true; + }, true, 1700, 755, 280, 50, TextGet("KDModConfigsButton"), "#ffffff", ""); + } + } + } + + + + if (KDRestart) + DrawTextKD(TextGet("RestartNeeded" + (localStorage.getItem("BondageClubLanguage") || "EN")), 1840, 600, "#ffffff", KDTextGray2); + } else if (KinkyDungeonState == "Consent") { + /*if (CommonTime() < KDLogoStartTime + KDLogoEndTime2) { + CommonTime(); // ... + FillRectKD(kdcanvas, kdpixisprites, "greyfade", { + Left: 0, Top: 0, Width: 2000, + Height: 1000, + Color: "#383F4F", alpha: Math.max(0, 1 - (CommonTime() - KDLogoStartTime) / KDLogoEndTime2), zIndex: 200 + }); + }*/ + //let str = TextGet("KinkyDungeon") + " v" + TextGet("KDVersionStr"); + //DrawTextKD(str.substring(0, Math.min(str.length, Math.round((CommonTime()-KDStartTime)/100))), 1000, 80, "#ffffff", KDTextGray2, 84); + //DrawTextKD(TextGet("KDLogo2"), 1000, 180, "#ffffff", KDTextGray2); + + if (!KDLoadingFinished) { + DrawTextKD(CurrentLoading, 1000, 900, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KDLoading") + Math.round(100 * KDLoadingDone / KDLoadingMax) + "%", 1000, 950, "#ffffff", KDTextGray2); + } else { + KDOptOut = true; + let cb = () => { + //let Char = KinkyDungeonPlayer; + //DrawCharacter(Char, 0, 0, 0.01, undefined, undefined, undefined, undefined, undefined, KinkyDungeonPlayer == Char ? KDToggles.FlipPlayer : false); + + if (KDToggles.SkipIntro) KinkyDungeonState = "Menu"; else KinkyDungeonState = "Intro"; + }; + setTimeout(cb, 100); + + CharacterReleaseTotal(KinkyDungeonPlayer); + KinkyDungeonDressSet(); + CharacterNaked(KinkyDungeonPlayer); + KinkyDungeonInitializeDresses(); + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + KDInitProtectedGroups(KinkyDungeonPlayer); + CharacterRefresh(KinkyDungeonPlayer); + // Draw the PC for one + KDLogoStartTime = CommonTime() + 400; + /* + + DrawButtonVis(1000-450/2, 720, 450, 64, TextGet("KDOptIn"), KDLoadingFinished ? "#ffffff" : "#888888", ""); + DrawButtonVis(1000-450/2, 820, 450, 64, TextGet("KDOptOut"), KDLoadingFinished ? "#ffffff" : "#888888", ""); + + DrawTextKD(TextGet("KinkyDungeonConsent"), 1000, 450, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonConsent2"), 1000, 500, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonConsent3"), 1000, 550, "#ffffff", KDTextGray2); + */ + + } + if (KDLoadingDone >= KDLoadingMax) { + + /*for (let c of PIXI.Cache._cache.keys()) { + KDTex(c); + }*/ + if (!KDLoadingFinishedSet) { + KDLoadingFinishedSet = true; + setTimeout(() => { + if (KDLoadingDone >= KDLoadingMax) + KDLoadingFinished = true; + else KDLoadingFinishedSet = false; + }, 1000); + } + } + + } else if (KinkyDungeonState == "Intro") { + if (KDIntroStage < 0) KDIntroStage = 0;// Placeholder + let currentProgress = KDIntroStage < KDIntroProgress.length ? KDIntroProgress[KDIntroStage] : 1.5; + if (currentProgress < 3) { + if (KDIntroStage < KDIntroProgress.length) + KDIntroProgress[KDIntroStage] += KDDrawDelta*0.001; + } + else KDIntroStage += 1; + + for (let i = 0; i < KDIntroProgress.length; i++) { + let progress = KDIntroProgress[i]; + if (progress > 0) { + let textSplit = TextGet("KDIntroScene" + (i + 1)).split('|'); + let ii = 0; + for (let s of textSplit) { + DrawTextKD(s, 1000, 150 + 200 * i + 33*ii, "#ffffff", KDTextGray2, 24, undefined, undefined, Math.max(0.01, Math.min(progress - ii * 0.33, 0.999))); + ii += 1; + } + } + } + + + + } else if (KinkyDungeonState == "TileEditor") { + KDDrawTileEditor(); + } else if (KinkyDungeonState == "Load") { + DrawButtonVis(875, 750, 350, 64, TextGet("KinkyDungeonLoadConfirm"), "#ffffff", ""); + + DrawButtonKDEx( + "KinkyDungeonLoadBack", () => { + KinkyDungeonState = "Menu"; + KDRestoreOutfit(); + ElementRemove("saveInputField"); + return true; + }, true, 1275, 750, 350, 64, + TextGet("KinkyDungeonLoadBack"), + "#ffffff", "", undefined, undefined, undefined, undefined, + undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySkip[0]), + hotkeyPress: KinkyDungeonKeySkip[0], + } + ); + + let newValue = ElementValue("saveInputField"); + if (newValue != KDOldSaveCodeValue) { + + KDOldSaveCodeValue = newValue; + let itt = localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit); + let orig = itt ? + JSON.parse(LZString.decompressFromBase64(itt)).appearance + || itt : ""; + if (orig != ElementValue("saveInputField")) KDOriginalValue = orig; + let decompressed = DecompressB64(ElementValue("saveInputField")); + if (decompressed) { + let origAppearance = KinkyDungeonPlayer.Appearance; + try { + let decodeSave = JSON.parse(decompressed); + if (decodeSave?.saveStat?.appearance) { + if (decodeSave.saveStat.poses) { + KDCurrentModels.get(KinkyDungeonPlayer).Poses = decodeSave.saveStat.poses; + } + let appearanceFromSave = JSON.stringify(decodeSave.saveStat.appearance); + CharacterAppearanceRestore(KinkyDungeonPlayer, appearanceFromSave, false, false); + KinkyDungeonPlayer.Palette = decodeSave.saveStat.Palette; + CharacterRefresh(KinkyDungeonPlayer); + UpdateModels(KinkyDungeonPlayer); + //KDInitProtectedGroups(KinkyDungeonPlayer); + //KinkyDungeonDressPlayer(KinkyDungeonPlayer, false); + + if (KinkyDungeonPlayer.Appearance.length == 0) + throw new DOMException(); + } + + } catch (e) { + console.log("Invalid outfit loaded from save"); + KinkyDungeonPlayer.Appearance = origAppearance; + } + } + } + + DrawButtonKDEx( + "loadFromFile", () => { + getFileInput(KDLoadSave); + return true; + }, true, 875, 650, 750, 64, TextGet("KinkyDungeonLoadFromFile") + ": " + KDSaveName, "#ffffff", "" + ); + + ElementPosition("saveInputField", 1250, 450, 1000, 230); + } else if (KinkyDungeonState == "LoadOutfit") { + DrawButtonVis(1275, 750, 350, 64, TextGet("KDWardrobeBackTo" + (StandalonePatched ? "Wardrobe" : "Menu")), "#ffffff", ""); + + let Char = KDSpeakerNPC || KinkyDungeonPlayer; + if (Char == KinkyDungeonPlayer) + DrawButtonVis(875, 750, 350, 64, TextGet("LoadOutfit"), "#ffffff", ""); + if (StandalonePatched) { + + DrawButtonKDEx( + "loadFromFile", () => { + getFileInput(KDLoadOutfit); + return true; + }, true, 875, 650, 750, 64, TextGet("KinkyDungeonLoadFromFile") + ": " + KDSaveName, "#ffffff", "" + ); + + DrawButtonKDEx("loadclothes", (_b) => { + KDSaveCodeOutfit(Char, true); + KinkyDungeonState = "Wardrobe"; + KDCanRevertFlag = false; + //KDWardrobeCallback = null; + //KDWardrobeRevertCallback = null; + + ElementRemove("saveInputField"); + return true;}, true, 875, 820, 350, 64, TextGet("LoadOutfitClothes"), "#ffffff", ""); + + + + } + + let newValue = ElementValue("saveInputField"); + if (newValue != KDOldValue) { + + let itt = localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit); + let orig = itt ? + JSON.parse(LZString.decompressFromBase64(itt)).appearance + || itt : ""; + if (orig != ElementValue("saveInputField")) KDOriginalValue = orig; + let decompressed = DecompressB64(ElementValue("saveInputField")); + if (decompressed) { + let origAppearance = Char.Appearance; + try { + console.log("Trying BC code..."); + CharacterAppearanceRestore(Char, decompressed, true, false); + CharacterRefresh(Char); + KDOldValue = newValue; + KDInitProtectedGroups(Char); + KinkyDungeonDressPlayer(Char, true); + + if (Char.Appearance.length == 0) + throw new DOMException(); + } catch (e) { + console.log("Trying BCX code..."); + // If we fail, it might be a BCX code. try it! + Char.Appearance = origAppearance; + try { + let parsed = JSON.parse(decompressed); + if (parsed.length > 0) { + if (!StandalonePatched) { + for (let g of parsed) { + InventoryWear(Char, g.Name, g.Group, g.Color); + } + CharacterRefresh(Char); + ElementValue("saveInputField", LZString.compressToBase64( + AppearanceItemStringify(Char.Appearance))); + } + KDOldValue = newValue; + KDInitProtectedGroups(Char); + } else { + console.log("Invalid code. Maybe its corrupt?"); + } + } catch (error) { + console.log("Invalid code."); + } + } + } + } + + ElementPosition("saveInputField", 1250, 350, 1000, 230); + + + KDTextField("savename", 1275, 550, 350, 64, undefined, KDOutfitInfo[KDCurrentOutfit] || "", "100"); + + if (ElementValue("saveInputField")) + DrawButtonKDEx( + "saveToFile", () => { + downloadFile( + (ElementValue("savename") || KDOutfitInfo[KDCurrentOutfit] || "Outfit") + KDOUTFITEXTENSION, + ElementValue("saveInputField")); + return true; + }, true, 875, 550, 350, 64, TextGet("KinkyDungeonSaveToFile"), "#ffffff", "" + ); + + } else if (KinkyDungeonState == "Challenge") { + //DrawTextKD(TextGet("KinkyDungeonChallenge"), 1250, 80, "#ffffff", KDTextGray1, 48); + KDDrawGameSetupTabs(); + + let II = 0; + let spacing = 75; + + DrawTextFitKD(TextGet("KDHardMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + DrawButtonKDEx("KinkyDungeonHardMode0", (_bdata) => { + KinkyDungeonExtremeMode = false; + KinkyDungeonHardMode = false; + localStorage.setItem("KinkyDungeonHardMode", KinkyDungeonHardMode ? "True" : "False"); + localStorage.setItem("KinkyDungeonExtremeMode", KinkyDungeonExtremeMode ? "True" : "False"); + return true; + }, true, 875, 190 + II*spacing, 360, 50, TextGet("KinkyDungeonHardMode0"), !KinkyDungeonHardMode ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonHardMode")) { + DrawTextFitKD(TextGet("KinkyDungeonHardModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonHardMode1", (_bdata) => { + if (KinkyDungeonHardMode) { + KinkyDungeonExtremeMode = true; + } + KinkyDungeonHardMode = true; + localStorage.setItem("KinkyDungeonHardMode", KinkyDungeonHardMode ? "True" : "False"); + localStorage.setItem("KinkyDungeonExtremeMode", KinkyDungeonExtremeMode ? "True" : "False"); + return true; + }, true, 1265, 190 + II*spacing, 360, 50, TextGet(KinkyDungeonExtremeMode ? "KinkyDungeonExtremeMode" : "KinkyDungeonHardMode1"), KinkyDungeonHardMode ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonHardMode1")) { + DrawTextFitKD(TextGet(KinkyDungeonExtremeMode ? "KinkyDungeonExtremeModeDesc" : "KinkyDungeonHardModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + II++; + + + DrawTextFitKD(TextGet("KDEasyMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + + DrawButtonKDEx("KinkyDungeonEasyMode0", (_bdata) => { + KinkyDungeonEasyMode = 0; + localStorage.setItem("KinkyDungeonEasyMode", KinkyDungeonEasyMode + ""); + return true; + }, true, 875, 190 + II*spacing, 225, 50, TextGet("KinkyDungeonEasyMode0"), KinkyDungeonEasyMode == 0 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonEasyMode0")) { + DrawTextFitKD(TextGet("KinkyDungeonEasyModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonEasyMode1", (_bdata) => { + KinkyDungeonEasyMode = 1; + localStorage.setItem("KinkyDungeonEasyMode", KinkyDungeonEasyMode + ""); + return true; + }, true, 1137, 190 + II*spacing, 226, 50, TextGet("KinkyDungeonEasyMode1"), KinkyDungeonEasyMode == 1 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonEasyMode1")) { + DrawTextFitKD(TextGet("KinkyDungeonEasyModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonEasyMode2", (_bdata) => { + KinkyDungeonEasyMode = 2; + localStorage.setItem("KinkyDungeonEasyMode", KinkyDungeonEasyMode + ""); + return true; + }, true, 1400, 190 + II*spacing, 225, 50, TextGet("KinkyDungeonEasyMode2"), KinkyDungeonEasyMode == 2 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonEasyMode2")) { + DrawTextFitKD(TextGet("KinkyDungeonEasyModeDesc2"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + II++; + + + + DrawTextFitKD(TextGet("KDSaveMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + + DrawButtonKDEx("KinkyDungeonSaveMode0", (_bdata) => { + KinkyDungeonSaveMode = false; + localStorage.setItem("KinkyDungeonSaveMode", KinkyDungeonSaveMode ? "True" : "False"); + return true; + }, true, 875, 190 + II*spacing, 360, 50, TextGet("KinkyDungeonSaveMode0"), !KinkyDungeonSaveMode ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonSaveMode0")) { + DrawTextFitKD(TextGet("KinkyDungeonSaveModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonSaveMode1", (_bdata) => { + KinkyDungeonSaveMode = true; + localStorage.setItem("KinkyDungeonSaveMode", KinkyDungeonSaveMode ? "True" : "False"); + return true; + }, true, 1265, 190 + II*spacing, 360, 50, TextGet("KinkyDungeonSaveMode1"), KinkyDungeonSaveMode ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonSaveMode1")) { + DrawTextFitKD(TextGet("KinkyDungeonSaveModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + II++; + + DrawTextFitKD(TextGet("KDPerksMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + DrawButtonKDEx("KinkyDungeonPerksMode0", (_bdata) => { + KinkyDungeonPerksMode = 0; + localStorage.setItem("KinkyDungeonPerksMode", KinkyDungeonPerksMode + ""); + return true; + }, true, 875, 190 + II*spacing, 175, 50, TextGet("KinkyDungeonPerksMode0"), KinkyDungeonPerksMode == 0 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerksMode0")) { + DrawTextFitKD(TextGet("KinkyDungeonPerksModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonPerksMode1", (_bdata) => { + KinkyDungeonPerksMode = 1; + localStorage.setItem("KinkyDungeonPerksMode", KinkyDungeonPerksMode + ""); + return true; + }, true, 1070, 190 + II*spacing, 170, 50, TextGet("KinkyDungeonPerksMode1"), KinkyDungeonPerksMode == 1 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerksMode1")) { + DrawTextFitKD(TextGet("KinkyDungeonPerksModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonPerksMode2", (_bdata) => { + KinkyDungeonPerksMode = 2; + localStorage.setItem("KinkyDungeonPerksMode", KinkyDungeonPerksMode + ""); + return true; + }, true, 1265, 190 + II*spacing, 170, 50, TextGet("KinkyDungeonPerksMode2"), KinkyDungeonPerksMode == 2 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerksMode2")) { + DrawTextFitKD(TextGet("KinkyDungeonPerksModeDesc2"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + DrawButtonKDEx("KinkyDungeonPerksMode3", (_bdata) => { + KinkyDungeonPerksMode = 3; + localStorage.setItem("KinkyDungeonPerksMode", KinkyDungeonPerksMode + ""); + return true; + }, true, 1455, 190 + II*spacing, 170, 50, TextGet("KinkyDungeonPerksMode3"), KinkyDungeonPerksMode == 3 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerksMode3")) { + DrawTextFitKD(TextGet("KinkyDungeonPerksModeDesc3"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + + + II++; + + DrawTextFitKD(TextGet("KDPerkProgressionMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + DrawButtonKDEx("KinkyDungeonPerkProgressionMode0", (_bdata) => { + KinkyDungeonPerkProgressionMode = 0; + localStorage.setItem("KinkyDungeonPerkProgressionMode", KinkyDungeonPerkProgressionMode + ""); + return true; + }, true, 875, 190 + II*spacing, 175, 50, TextGet("KinkyDungeonPerkProgressionMode0"), KinkyDungeonPerkProgressionMode == 0 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerkProgressionMode0")) { + DrawTextFitKD(TextGet("KinkyDungeonPerkProgressionModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonPerkProgressionMode1", (_bdata) => { + KinkyDungeonPerkProgressionMode = 1; + localStorage.setItem("KinkyDungeonPerkProgressionMode", KinkyDungeonPerkProgressionMode + ""); + return true; + }, true, 1070, 190 + II*spacing, 170, 50, TextGet("KinkyDungeonPerkProgressionMode1"), KinkyDungeonPerkProgressionMode == 1 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerkProgressionMode1")) { + DrawTextFitKD(TextGet("KinkyDungeonPerkProgressionModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonPerkProgressionMode2", (_bdata) => { + KinkyDungeonPerkProgressionMode = 2; + localStorage.setItem("KinkyDungeonPerkProgressionMode", KinkyDungeonPerkProgressionMode + ""); + return true; + }, true, 1265, 190 + II*spacing, 170, 50, TextGet("KinkyDungeonPerkProgressionMode2"), KinkyDungeonPerkProgressionMode == 2 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerkProgressionMode2")) { + DrawTextFitKD(TextGet("KinkyDungeonPerkProgressionModeDesc2"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + DrawButtonKDEx("KinkyDungeonPerkProgressionMode3", (_bdata) => { + KinkyDungeonPerkProgressionMode = 3; + localStorage.setItem("KinkyDungeonPerkProgressionMode", KinkyDungeonPerkProgressionMode + ""); + return true; + }, true, 1455, 190 + II*spacing, 170, 50, TextGet("KinkyDungeonPerkProgressionMode3"), KinkyDungeonPerkProgressionMode == 3 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerkProgressionMode3")) { + DrawTextFitKD(TextGet("KinkyDungeonPerkProgressionModeDesc3"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + + II++; + + if (KinkyDungeonPerkProgressionMode > 0) { + DrawTextFitKD(TextGet("KDPerkBondageMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + DrawButtonKDEx("KinkyDungeonPerkBondageMode0", (_bdata) => { + KinkyDungeonPerkBondageMode = 0; + localStorage.setItem("KinkyDungeonPerkBondageMode", KinkyDungeonPerkBondageMode + ""); + return true; + }, true, 875, 190 + II*spacing, 226, 50, TextGet("KinkyDungeonPerkBondageMode0"), KinkyDungeonPerkBondageMode == 0 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerkBondageMode0")) { + DrawTextFitKD(TextGet("KinkyDungeonPerkBondageModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonPerkBondageMode1", (_bdata) => { + KinkyDungeonPerkBondageMode = 1; + localStorage.setItem("KinkyDungeonPerkBondageMode", KinkyDungeonPerkBondageMode + ""); + return true; + }, true, 1137, 190 + II*spacing, 226, 50, TextGet("KinkyDungeonPerkBondageMode1"), KinkyDungeonPerkBondageMode == 1 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerkBondageMode1")) { + DrawTextFitKD(TextGet("KinkyDungeonPerkBondageModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonPerkBondageMode2", (_bdata) => { + KinkyDungeonPerkBondageMode = 2; + localStorage.setItem("KinkyDungeonPerkBondageMode", KinkyDungeonPerkBondageMode + ""); + return true; + }, true, 1400, 190 + II*spacing, 226, 50, TextGet("KinkyDungeonPerkBondageMode2"), KinkyDungeonPerkBondageMode == 2 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerkBondageMode2")) { + DrawTextFitKD(TextGet("KinkyDungeonPerkBondageModeDesc2"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + } + + + II++; + + if (KinkyDungeonPerkBondageMode > 0 && KinkyDungeonPerkProgressionMode > 0) { + DrawTextFitKD(TextGet("KDPerkBondageVisMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + DrawButtonKDEx("KinkyDungeonPerkBondageVisMode0", (_bdata) => { + KinkyDungeonPerkBondageVisMode = 0; + localStorage.setItem("KinkyDungeonPerkBondageVisMode", KinkyDungeonPerkBondageVisMode + ""); + return true; + }, true, 1400, 190 + II*spacing, 226, 50, TextGet("KinkyDungeonPerkBondageVisMode0"), KinkyDungeonPerkBondageVisMode == 0 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerkBondageVisMode0")) { + DrawTextFitKD(TextGet("KinkyDungeonPerkBondageVisModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonPerkBondageVisMode1", (_bdata) => { + KinkyDungeonPerkBondageVisMode = 1; + localStorage.setItem("KinkyDungeonPerkBondageVisMode", KinkyDungeonPerkBondageVisMode + ""); + return true; + }, true, 1137, 190 + II*spacing, 226, 50, TextGet("KinkyDungeonPerkBondageVisMode1"), KinkyDungeonPerkBondageVisMode == 1 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerkBondageVisMode1")) { + DrawTextFitKD(TextGet("KinkyDungeonPerkBondageVisModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonPerkBondageVisMode2", (_bdata) => { + KinkyDungeonPerkBondageVisMode = 2; + localStorage.setItem("KinkyDungeonPerkBondageVisMode", KinkyDungeonPerkBondageVisMode + ""); + return true; + }, true, 875, 190 + II*spacing, 226, 50, TextGet("KinkyDungeonPerkBondageVisMode2"), KinkyDungeonPerkBondageVisMode == 2 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonPerkBondageVisMode2")) { + DrawTextFitKD(TextGet("KinkyDungeonPerkBondageVisModeDesc2"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + } + + II++; + + + DrawTextFitKD(TextGet("KDItemMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + DrawButtonKDEx("KinkyDungeonItemMode0", (_bdata) => { + KinkyDungeonItemMode = 0; + localStorage.setItem("KinkyDungeonItemMode", KinkyDungeonItemMode + ""); + return true; + }, true, 875, 190 + II*spacing, 226, 50, TextGet("KinkyDungeonItemMode0"), KinkyDungeonItemMode == 0 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonItemMode0")) { + DrawTextFitKD(TextGet("KinkyDungeonItemModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonItemMode1", (_bdata) => { + KinkyDungeonItemMode = 1; + localStorage.setItem("KinkyDungeonItemMode", KinkyDungeonItemMode + ""); + return true; + }, true, 1400, 190 + II*spacing, 226, 50, TextGet("KinkyDungeonItemMode1"), KinkyDungeonItemMode == 1 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonItemMode1")) { + DrawTextFitKD(TextGet("KinkyDungeonItemModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonItemMode2", (_bdata) => { + KinkyDungeonItemMode = 2; + localStorage.setItem("KinkyDungeonItemMode", KinkyDungeonItemMode + ""); + return true; + }, true, 1137, 190 + II*spacing, 226, 50, TextGet("KinkyDungeonItemMode2"), KinkyDungeonItemMode == 2 ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonItemMode2")) { + DrawTextFitKD(TextGet("KinkyDungeonItemModeDesc2"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + + + + + } else if (KinkyDungeonState == "Diff") { + KDDrawGameSetupTabs(); + //DrawTextKD(TextGet("KinkyDungeonDifficulty"), 1250, 80, "#ffffff", KDTextGray1, 48); + //DrawButtonVis(875, 350, 750, 64, TextGet("KinkyDungeonDifficulty0"), "#ffffff", ""); + //DrawButtonVis(875, 450, 750, 64, TextGet("KinkyDungeonDifficulty3"), "#ffffff", ""); + //DrawButtonVis(875, 550, 750, 64, TextGet("KinkyDungeonDifficulty1"), "#ffffff", ""); + DrawButtonKDEx("startQuick", () => { + KinkyDungeonStatsChoice = new Map(); + KDUpdatePlugSettings(true); + KDLose = false; + KinkyDungeonStartNewGame(); + if (!KDToggles.SkipTutorial) { + KDStartDialog("Tutorial"); + } + return true; + }, true, 875, 650, 750, 64, TextGet("KinkyDungeonStartGameQuick"), "#ffffff", ""); + DrawButtonKDEx("startGameKinky", () => { + KinkyDungeonStatsChoice = new Map(); + for (let kink of KDKinkyPerks) { + KinkyDungeonStatsChoice.set(kink, true); + } + KDUpdatePlugSettings(true); + KDLose = false; + KinkyDungeonStartNewGame(); + if (!KDToggles.SkipTutorial) { + KDStartDialog("Tutorial"); + } + return true; + }, true, 875, 720, 750, 64, TextGet("KinkyDungeonStartGameKinky"), "#ffffff", ""); + DrawButtonKDEx("startGame", () => { + KinkyDungeonState = "Stats"; + KinkyDungeonLoadStats(); + KDUpdatePlugSettings(true); + return true; + }, true, 875, 790, 750, 64, TextGet("KinkyDungeonStartGameAdv"), "#ffffff", ""); + + + + if (MouseIn(875, 650, 750, 64)) { + DrawTextFitKD(TextGet("KinkyDungeonStartGameDesc"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } else if (MouseIn(875, 720, 750, 64)) { + DrawTextFitKD(TextGet("KinkyDungeonStartGameDescKinky"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } else if (MouseIn(875, 790, 750, 64)) { + DrawTextFitKD(TextGet("KinkyDungeonStartGameDescAdc"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + + let buttonswidth = 168; + let buttonsheight = 50; + let buttonspad = 25; + let buttonsypad = 10; + let buttonsstart = 875; + let X = 0; + let Y = 0; + + DrawTextFitKD(TextGet("KDClasses"), 875 - 50, 190 + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + let classCount = Object.keys(KDClassStart).length; + for (let i = 0; i < classCount; i++) { + X = i % 4; + Y = Math.floor(i / 4); + + DrawButtonKDEx("Class" + i, (_bdata) => { + KinkyDungeonClassMode = Object.keys(KDClassStart)[i]; + localStorage.setItem("KinkyDungeonClassMode", "" + KinkyDungeonClassMode); + return true; + }, (!KDClassReqs[Object.keys(KDClassStart)[i]]) || KDClassReqs[Object.keys(KDClassStart)[i]](), + buttonsstart + (buttonspad + buttonswidth) * X, 190 + Y*(buttonsheight + buttonsypad), buttonswidth, buttonsheight, TextGet("KinkyDungeonClassMode" + Object.keys(KDClassStart)[i]), + ((!KDClassReqs[Object.keys(KDClassStart)[i]]) || KDClassReqs[Object.keys(KDClassStart)[i]]()) ? + (KinkyDungeonClassMode == Object.keys(KDClassStart)[i] ? "#ffffff" : "#888888") + : "#ff5277", "", undefined, undefined, true, KDButtonColor); + if (MouseIn(buttonsstart + (buttonspad + buttonswidth) * X, 190 + Y*(buttonsheight + buttonsypad), buttonswidth, buttonsheight)) { + DrawTextFitKD(TextGet("KinkyDungeonClassModeDesc" + Object.keys(KDClassStart)[i]), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + } + + + + DrawTextFitKD(TextGet("KDSexyMode"), 875 - 50, 420 + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + + DrawButtonKDEx("KinkyDungeonSexyMode0", (_bdata) => { + KinkyDungeonSexyMode = false; + KDUpdatePlugSettings(true); + localStorage.setItem("KinkyDungeonSexyMode", KinkyDungeonSexyMode ? "True" : "False"); + return true; + }, true, 875, 420, 275, 50, TextGet("KinkyDungeonSexyMode0"), !KinkyDungeonSexyMode ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonSexyMode0")) { + DrawTextFitKD(TextGet("KinkyDungeonSexyModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonSexyMode1", (_bdata) => { + KinkyDungeonSexyMode = true; + KDUpdatePlugSettings(true); + localStorage.setItem("KinkyDungeonSexyMode", KinkyDungeonSexyMode ? "True" : "False"); + return true; + }, true, 1175, 420, 275, 50, TextGet("KinkyDungeonSexyMode1"), KinkyDungeonSexyMode ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonSexyMode1")) { + DrawTextFitKD(TextGet("KinkyDungeonSexyModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawTextFitKD(TextGet("KDRandomMode"), 875 - 50, 500 + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + + DrawButtonKDEx("KinkyDungeonRandomMode0", (_bdata) => { + KinkyDungeonRandomMode = false; + localStorage.setItem("KinkyDungeonRandomMode", KinkyDungeonRandomMode ? "True" : "False"); + return true; + }, true, 875, 500, 275, 50, TextGet("KinkyDungeonRandomMode0"), !KinkyDungeonRandomMode ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonRandomMode0")) { + DrawTextFitKD(TextGet("KinkyDungeonRandomModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonRandomMode1", (_bdata) => { + KinkyDungeonRandomMode = true; + localStorage.setItem("KinkyDungeonRandomMode", KinkyDungeonRandomMode ? "True" : "False"); + return true; + }, true, 1175, 500, 275, 50, TextGet("KinkyDungeonRandomMode1"), KinkyDungeonRandomMode ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonRandomMode1")) { + DrawTextFitKD(TextGet("KinkyDungeonRandomModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + + if (KinkyDungeonSexyMode) { + + DrawCheckboxKDEx("KinkyDungeonSexyPlugsFront", (_bdata) => { + KinkyDungeonSexyPlugFront = !KinkyDungeonSexyPlugFront; + localStorage.setItem("KinkyDungeonSexyPlugFront", KinkyDungeonSexyPlugFront ? "True" : "False"); + return true; + }, true, 1500, 420, 64, 64, TextGet("KinkyDungeonSexyPlugsFront"), !KinkyDungeonSexyPlugFront, false, "#ffffff"); + DrawCheckboxKDEx("KinkyDungeonSexyPlugs", (_bdata) => { + KinkyDungeonSexyPlug = !KinkyDungeonSexyPlug; + localStorage.setItem("KinkyDungeonSexyPlug", KinkyDungeonSexyPlug ? "True" : "False"); + return true; + }, true, 1500, 490, 64, 64, TextGet("KinkyDungeonSexyPlugs"), KinkyDungeonSexyPlug, false, "#ffffff"); + + /*DrawCheckboxKDEx("KinkyDungeonSexyPiercings", (bdata) => { + KinkyDungeonSexyPiercing = !KinkyDungeonSexyPiercing; + localStorage.setItem("KinkyDungeonSexyPiercing", KinkyDungeonSexyPiercing ? "True" : "False"); + return true; + }, true, 1500, 430, 64, 64, TextGet("KinkyDungeonSexyPiercings"), KinkyDungeonSexyPiercing, false, "#ffffff");*/ + } + // Sorry Aelie-- removed this b/c now its all handled in the logic for the roguelike map selector + /* + DrawTextFitKD(TextGet("KDProgressionMode"), 875 - 50, 580 + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); + + + DrawButtonKDEx("KinkyDungeonProgressionMode0", (bdata) => { + KinkyDungeonProgressionMode = "Key"; + localStorage.setItem("KinkyDungeonProgressionMode", "Key"); + return true; + }, true, 875, 580, 175, 50, TextGet("KinkyDungeonProgressionMode0"), KinkyDungeonProgressionMode == "Key" ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonProgressionMode0")) { + DrawTextFitKD(TextGet("KinkyDungeonProgressionModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonProgressionMode1", (bdata) => { + KinkyDungeonProgressionMode = "Random"; + localStorage.setItem("KinkyDungeonProgressionMode", "Random"); + return true; + }, true, 1075, 580, 175, 50, TextGet("KinkyDungeonProgressionMode1"), KinkyDungeonProgressionMode == "Random" ? "#ffffff" : "#888888", "", undefined, undefined, true, KDButtonColor); + if (MouseInKD("KinkyDungeonProgressionMode1")) { + DrawTextFitKD(TextGet("KinkyDungeonProgressionModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + DrawButtonKDEx("KinkyDungeonProgressionMode2", (bdata) => { + KinkyDungeonProgressionMode = "Select"; + localStorage.setItem("KinkyDungeonProgressionMode", "Select"); + return true; + }, KinkyDungeonPerkProgressionMode != 0, 1275, 580, 175, 50, TextGet("KinkyDungeonProgressionMode2"), KinkyDungeonPerkProgressionMode == 0 ? "#ff5277" : (KinkyDungeonProgressionMode == "Select" ? "#ffffff" : "#888888"), "", undefined, undefined, true, KDButtonColor); + if (MouseIn(1275, 580, 175, 50)) { + DrawTextFitKD(TextGet("KinkyDungeonProgressionModeDesc2"), 1250, 120, 1000, "#ffffff", KDTextGray0); + } + + */ + + + } if (KinkyDungeonState == "Name") { + + DrawTextFitKD(TextGet("KDName"), 975 + 550/2, 150, 550, "#ffffff", KDTextGray1, 32, "center"); + + let NF = KDTextField("PlayerNameField", + 975, 250, 550, 64 + ); + if (NF.Created) { + ElementValue("PlayerNameField", + localStorage.getItem("PlayerName") || "Ada" + ); + } + + + DrawButtonKDEx("randomName", () => { + + + let name = "Ada"; + + let nameList = KDDefaultNames[Math.floor(Math.random() * KDDefaultNames.length)]; + if (nameList && KDNameList[nameList]) { + name = KDNameList[nameList][Math.floor(Math.random() * KDDefaultNames.length)]; + } + ElementValue("PlayerNameField", name); + return true; + }, true, 1550, 250, 200, 64, TextGet("KDRandom"), "#ffffff", ""); + + // Left to decrement + DrawButtonKDEx(`SaveButtonL`, (_bdata) => { + if (KDSaveSlot > 1) { + KDSaveSlot--; + } + KDConfirmDeleteSave = false; + return true; + }, true, 1350, 350, 64, 64, '<', "#ffffff"); + // Label for the button + DrawTextFitKD(TextGet("KDChooseSlot"), 1150, 385, 360, "#ffffff", undefined, 30); + DrawTextFitKD(`${KDSaveSlot}`, 1430, 385, 360, "#ffffff", undefined, 30); + // Right to increment + DrawButtonKDEx(`SaveButton4`, (_bdata) => { + if (KDSaveSlot < maxSaveSlots) { + KDSaveSlot++; + } + KDConfirmDeleteSave = false; + return true; + }, true, 1450, 350, 64, 64, '>', "#ffffff"); + + // If the save slot is occupied, warn the player! + let danger = false; + if (loadedsaveslots[KDSaveSlot-1]) { + danger = true; + DrawTextFitKD(TextGet("KDWillOverride").replace("NME", + loadedsaveNames[KDSaveSlot-1] ? loadedsaveNames[KDSaveSlot-1] : "" + ), 1550, 385, 440, "#ff5277", undefined, 36, "left"); + } else { + KDConfirmDeleteSave = false; + } + + let offsets = [ + {slot: 1, x: 1250 - 225 - 200, y: 650}, + {slot: 2, x: 1250 - 225 - 200, y: 720}, + {slot: 3, x: 1250 + 225 - 200, y: 650}, + {slot: 4, x: 1250 + 225 - 200, y: 720}, + ] + for (let slt of offsets) { + let slot = slt.slot; + DrawButtonKDEx("slot_" + slot + "prev", () => { + KDSaveSlot = slot; + return true; + }, true, + ((danger && (slot == KDSaveSlot)) ? (Math.random() > 0.5 ? -1 : 1) : 0) + slt.x, + ((danger && (slot == KDSaveSlot)) ? (Math.random() > 0.5 ? -1 : 1) : 0) + slt.y, + 400, 50, (loadedsaveNames[slot-1] ? loadedsaveNames[slot - 1] : "") + || (TextGet("KDEmpty")), + (danger && (slot == KDSaveSlot)) ? "#ff5277" : "#ffffff", "", undefined, undefined, + true, KDButtonColor); + } + + DrawButtonKDEx("selectName", () => { + + if (danger && !KDConfirmDeleteSave) { + KDConfirmDeleteSave = true; + } else { + KDConfirmDeleteSave = false; + localStorage.setItem("PlayerName", ElementValue("PlayerNameField") || "Ada"); + localStorage.setItem("KDLastSaveSlot", KDSaveSlot.toString()); + KDGameData.PlayerName = ElementValue("PlayerNameField") || "Ada"; + KinkyDungeonPlayer.Name = KDGameData.PlayerName; + KinkyDungeonState = "Diff"; + + KDExecuteMods(); + KinkyDungeonLoadStats(); + } + + return true; + }, true, (KDConfirmDeleteSave ? (Math.random() > 0.5 ? -1 : 1) : 0) + 875, KDConfirmDeleteSave ? + (Math.random() > 0.5 ? -1 : 1) + 550 : 450, 750, 64, TextGet(KDConfirmDeleteSave ? + "KDConfirmREALLY" : "KDConfirm"), KDConfirmDeleteSave ? "#ff5277" : "#ffffff", ""); + + DrawButtonKDEx("backButton", (_b) => { + KinkyDungeonState = "Menu"; + return true; + }, true, 1075, 900, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", "", + undefined, undefined, undefined, undefined, + undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySkip[0]), + hotkeyPress: KinkyDungeonKeySkip[0], + }); + + + } else if (KinkyDungeonState == "Wardrobe") { + KDDrawWardrobe("menu", KDSpeakerNPC); + } else if (KinkyDungeonState == "GenMap") { + DrawTextFitKD(TextGet("KDGenMap"), + + PIXIWidth/2, PIXIHeight/2, 1000, "#ffffff", undefined, 36); + FillRectKD(kdcanvas, kdpixisprites, "GenMapBG", { + Left: 0, + Top: 0, + Width: PIXIWidth, + Height: PIXIHeight, + Color: "#000000", + LineWidth: 1, + zIndex: -19, + alpha: 0.3 + }); + if (KDGenMapCallback) { + setTimeout(RunGenMapCallback, 100); + } + } else if (KinkyDungeonState == "Stats") { + + let tooltip = KinkyDungeonDrawPerks(false); + DrawTextKD(TextGet("KinkyDungeonStats"), 1000, 30, "#ffffff", KDTextGray2); + //DrawTextKD(TextGet("KinkyDungeonStats2"), 1000, 80, "#ffffff", KDTextGray2); + if (!tooltip) { + let points = KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice); + //let hardmode = points >= KDHardModeThresh ? TextGet("KDHardMode") : ""; + DrawTextKD(TextGet("KinkyDungeonStatPoints").replace("AMOUNT", + "" + Math.round(KDPERKCOSTMULT*points)), 1000, 150, "#ffffff", KDTextGray2); + } + + let minPoints = 0; + + DrawButtonKDEx("KDPerksStart", (_bdata) => { + if (KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice) >= minPoints) { + KDLose = false; + KinkyDungeonStartNewGame(); + + if (!KDToggles.SkipTutorial) { + KDStartDialog("Tutorial"); + } + } + return true; + }, true, 875, 920, 350, 64, TextGet("KinkyDungeonStartGame"), KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice) >= minPoints ? "#ffffff" : "pink", ""); + + DrawButtonKDEx("KDPerksBack", (_bdata) => { + KinkyDungeonState = "Menu"; + return true; + }, true, 1275, 920, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", "", undefined, undefined, undefined, undefined, + undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySkip[0]), + hotkeyPress: KinkyDungeonKeySkip[0], + }); + + DrawButtonKDEx("KDPerksClear", (_bdata) => { + KinkyDungeonStatsChoice = new Map(); + KDUpdatePlugSettings(true); + return true; + }, true, 40, 920, 190, 64, TextGet("KinkyDungeonClearAll"), "#ffffff", ""); + + DrawButtonKDEx("KDPerkConfig1", (_bdata) => { + KinkyDungeonPerksConfig = "1"; + KinkyDungeonLoadStats(); + return true; + }, true, 270, 930, 100, 54, TextGet("KinkyDungeonConfig") + "1", KinkyDungeonPerksConfig == "1" ? "#ffffff" : "#888888", ""); + + DrawButtonKDEx("KDPerkConfig2", (_bdata) => { + KinkyDungeonPerksConfig = "2"; + KinkyDungeonLoadStats(); + return true; + }, true, 380, 930, 100, 54, TextGet("KinkyDungeonConfig") + "2", KinkyDungeonPerksConfig == "2" ? "#ffffff" : "#888888", ""); + + DrawButtonKDEx("KDPerkConfig3", (_bdata) => { + KinkyDungeonPerksConfig = "3"; + KinkyDungeonLoadStats(); + return true; + }, true, 490, 930, 100, 54, TextGet("KinkyDungeonConfig") + "3", KinkyDungeonPerksConfig == "3" ? "#ffffff" : "#888888", ""); + + + let TF = KDTextField("PerksFilter", 600, 930, 210, 54, "text", "", "45"); + if (TF.Created) { + TF.Element.oninput = (_event: InputEvent) => { + KDPerksFilter = ElementValue("PerksFilter"); + KDPerksIndex = 0; + }; + } + DrawTextFitKD(TextGet("KinkyDungeonFilter"), 600 + 210/2, 930 + 54/2, 210, "#aaaaaa"); + + if (!KDClipboardDisabled) + DrawButtonKDEx("copyperks", (_bdata) => { + let txt = ""; + for (let k of KinkyDungeonStatsChoice.keys()) { + if (!k.startsWith("arousal") && !k.endsWith("Mode")) txt += (txt ? "\n" : "") + k; + } + navigator.clipboard.writeText(txt); + return true; + }, true, 1850, 930, 140, 54, TextGet("KinkyDungeonCopyPerks"), "#ffffff", ""); + else { + let CF = KDTextField("KDCopyPerks", 1700, 930, 280, 54, undefined, undefined, "10000"); + if (CF.Created) { + CF.Element.oninput = (_event: InputEvent) => { + let text = ElementValue("KDCopyPerks"); + try { + let list = text.split('|'); + let changed = 1; + let iter = 0; + while (changed > 0 && iter < 1000) { + changed = 0; + for (let l of list) { + let lp = l.replace('\r','');// List processed + // Find the perk that matches the name + for (let perk of Object.entries(KinkyDungeonStatsPresets)) { + if (perk[0] == lp && KDValidatePerk(perk[1])) { + KinkyDungeonStatsChoice.set(perk[0], true); + changed += 1; + } + } + } + iter += 1; + } + } catch (err) { + console.log("Invalid perks"); + } + + }; + } + } + + if (!KDClipboardDisabled) + DrawButtonKDEx("pasteperks", (_bdata) => { + navigator.clipboard.readText() + .then(text => { + let list = text.split('\n'); + let changed = 1; + let iter = 0; + while (changed > 0 && iter < 1000) { + changed = 0; + for (let l of list) { + let lp = l.replace('\r','');// List processed + // Find the perk that matches the name + for (let perk of Object.entries(KinkyDungeonStatsPresets)) { + if (perk[0] == lp && KDValidatePerk(perk[1])) { + KinkyDungeonStatsChoice.set(perk[0], true); + changed += 1; + } + } + } + iter += 1; + } + }) + .catch(err => { + console.error('Failed to read clipboard contents: ', err); + }); + return true; + }, true, 1700, 930, 140, 54, TextGet("KinkyDungeonPastePerks"), "#ffffff", ""); + + + if (KinkyDungeonKeybindingCurrentKey && KinkyDungeonGameKeyDown()) { + if (KinkyDungeonKeybindingCurrentKey) + KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime(); + KinkyDungeonKeybindingCurrentKey = ''; + } + } else if (KinkyDungeonState == "Save") { + // Draw temp start screen + DrawTextKD(TextGet("KinkyDungeonSaveIntro0"), 1250, 350, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonSaveIntro1"), 1250, 475, "#ffffff", KDTextGray2); + /*DrawTextKD(TextGet("KinkyDungeonSaveIntro"), 1250, 475, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonSaveIntro2"), 1250, 550, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonSaveIntro3"), 1250, 625, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonSaveIntro4"), 1250, 700, "#ffffff", KDTextGray2);*/ + + KDTextArea("saveDataField", 750, 100, 1000, 230); + + KDTextField("savename", 1275, 650, 350, 64, undefined, KDGameData.PlayerName, "100"); + + if (ElementValue("saveDataField")) + DrawButtonKDEx( + "saveToFile", () => { + downloadFile((ElementValue("savename") || KDGameData.PlayerName || "Save") + KDSAVEEXTENSION, ElementValue("saveDataField")); + return true; + }, true, 875, 650, 350, 64, TextGet("KinkyDungeonSaveToFile"), "#ffffff", "" + ); + + + //DrawButtonVis(875, 750, 350, 64, TextGet("KinkyDungeonGameSave"), "#ffffff", ""); + DrawButtonVis(875, 750, 750, 64, TextGet("KinkyDungeonGameContinue"), "#ffffff", ""); + } else if (KinkyDungeonState == "Game") { + KinkyDungeonGameRunning = true; + KinkyDungeonGameFlag = true; + KinkyDungeonDrawGame(); + if (KinkyDungeonInputQueue.length < 1) { + let _CharacterRefresh = CharacterRefresh; + let _CharacterAppearanceBuildCanvas = CharacterAppearanceBuildCanvas; + CharacterRefresh = () => {KDRefresh = true;}; + CharacterAppearanceBuildCanvas = () => {}; + + + if (KDGameData.SleepTurns > 0) { + if (CommonTime() > KinkyDungeonSleepTime) { + KDGameData.SleepTurns -= 1; + if (KinkyDungeonAggressive()) + KinkyDungeonTotalSleepTurns += 1; + if (KinkyDungeonStatStamina >= KinkyDungeonStatStaminaMax && KinkyDungeonStatWill >= KinkyDungeonStatWillMax) { + KDGameData.SleepTurns = 0; + } + // Decrease offer fatigue + KDIncreaseOfferFatigue(-1); + KDSendInput("tick", {delta: 1, sleep: true}, false, true); + KinkyDungeonSleepTime = CommonTime() + 10; + } + if (KDGameData.SleepTurns == 0) { + KDChangeStamina("", "", "", 0); + KDChangeWill("", "", "", 0); + KDGameData.KneelTurns = 1; + } + } else if (KDGameData.PlaySelfTurns > 0) { + if (CommonTime() > KinkyDungeonSleepTime) { + KDSendInput("tick", {delta: 1}, false, true); + KDGameData.PlaySelfTurns -= 1; + KDGameData.BalancePause = true; + KinkyDungeonSleepTime = CommonTime() + (KinkyDungeonFlags.get("PlayerOrgasm") ? KinkyDungeonOrgasmTime : KinkyDungeonPlaySelfTime) * (0.25 + KDAnimSpeed * 0.75); + } + if (KDGameData.SleepTurns == 0) { + KDChangeStamina("", "", "", 0); + } + } else if (KinkyDungeonStatFreeze > 0) { + if (CommonTime() > KinkyDungeonSleepTime) { + KinkyDungeonStatFreeze -= 1; + KDGameData.BalancePause = true; + KDSendInput("tick", {delta: 1, NoUpdate: false, NoMsgTick: true}, false, true); + KinkyDungeonSleepTime = CommonTime() + KinkyDungeonFreezeTime * (0.25 + KDAnimSpeed * 0.75); + } + } else if (KDGameData.SlowMoveTurns > 0) { + if (CommonTime() > KinkyDungeonSleepTime) { + KDGameData.SlowMoveTurns -= 1; + KDGameData.BalancePause = true; + KDSendInput("tick", {delta: 1, NoUpdate: false, NoMsgTick: true}, false, true); + KinkyDungeonSleepTime = CommonTime() + 150 * (0.35 + KDAnimSpeed * 0.65); + } + } else if (KinkyDungeonFastMove && KinkyDungeonFastMovePath && KinkyDungeonFastMovePath.length > 0) { + if (CommonTime() > KinkyDungeonSleepTime) { + if (KinkyDungeonFastMovePath.length > 0) { + let next = KinkyDungeonFastMovePath[0]; + //KinkyDungeonFastMovePath.splice(0, 1); + if (Math.max(Math.abs(next.x-KinkyDungeonPlayerEntity.x), Math.abs(next.y-KinkyDungeonPlayerEntity.y)) < 1.5) { + let MP = KDGameData.MovePoints; + if (KDSendInput("move", {dir: {x:next.x-KinkyDungeonPlayerEntity.x, y:next.y-KinkyDungeonPlayerEntity.y}, delta: 1, AllowInteract: true, AutoDoor: false, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, false) + == "move" || MP == KDGameData.MovePoints) { + KinkyDungeonFastMovePath.splice(0, 1); + } + } + else KinkyDungeonFastMovePath = []; + } + KinkyDungeonSleepTime = CommonTime() + 100 * (0.25 + KDAnimSpeed * 0.75); + } + } else if (KinkyDungeonFastStruggle && KinkyDungeonFastStruggleType && KinkyDungeonFastStruggleGroup) { + if (CommonTime() > KinkyDungeonSleepTime) { + let result = KDSendInput("struggle", {group: KinkyDungeonFastStruggleGroup, type: KinkyDungeonFastStruggleType}, false, true); + if (result != "Fail" || !KinkyDungeonHasStamina(2.5)) { + KinkyDungeonFastStruggleType = ""; + KinkyDungeonFastStruggleGroup = ""; + } + KinkyDungeonSleepTime = CommonTime() + (KinkyDungeonInDanger() ? 250 : 0) + 250 * (0.25 + KDAnimSpeed * 0.75); + } + } else if (KinkyDungeonAutoWait || (KDAutoWaitDelayed && KDGameData.DelayedActions?.length > 0)) { + if (CommonTime() > KinkyDungeonSleepTime) { + let lastStamina = KinkyDungeonStatStamina; + let wt = KDNormalWaitTime; + KDSendInput("move", {dir: {x:0, y: 0, delta: 0}, delta: 1, AllowInteract: true, AutoDoor: false, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, true); + + if (KinkyDungeonAutoWait) { + if (KinkyDungeonFastStruggle && KinkyDungeonStatStamina == KinkyDungeonStatStaminaMax && lastStamina < KinkyDungeonStatStamina) { + if (KinkyDungeonTempWait && !KDGameData.KinkyDungeonLeashedPlayer && !KinkyDungeonInDanger()) + KDDisableAutoWait(); + } + if (KDGameData.FocusControlToggle.AutoWaitSlow) wt = KDSlowWaitTime; + else if (KDGameData.FocusControlToggle.AutoWaitNormal) wt = KDNormalWaitTime; + else if (KDGameData.FocusControlToggle.AutoWaitFast) wt = KDFastWaitTime; + else if (KDGameData.FocusControlToggle.AutoWaitVeryFast) wt = KDVeryFastWaitTime; + } + KinkyDungeonSleepTime = CommonTime() + (wt); + } + } else if (KinkyDungeonAutoWaitStruggle) { + if (CommonTime() > KinkyDungeonSleepTime) { + //KDSendInput("move", {dir: {x:0, y: 0, delta: 0}, delta: 1, AllowInteract: true, AutoDoor: KinkyDungeonToggleAutoDoor, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, true); + + if (!(KDGameData.DelayedActions?.length > 0)) { + KDHandleAutoStruggle(KinkyDungeonPlayerEntity); + } + if (KinkyDungeonInDanger()) + KDDisableAutoWait(); + KinkyDungeonSleepTime = CommonTime() + (300 + Math.min(1200, KDAutoStruggleData.lastDelay * 270)) * (0.5 + KDAnimSpeed * 0.5); + } + } else KinkyDungeonSleepTime = CommonTime() + 100; + CharacterRefresh = _CharacterRefresh; + CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; + } else KinkyDungeonSleepTime = CommonTime() + 100; + + } else if (KinkyDungeonState == "End") { + KinkyDungeonGameRunning = false; + // Draw temp start screen + DrawTextKD(TextGet("EndWin"), 1250, 400, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("EndWin2"), 1250, 500, "#ffffff", KDTextGray2); + + DrawButtonVis(1075, 650, 350, 64, TextGet("KinkyDungeonNewGamePlus"), "#ffffff", ""); + DrawButtonVis(1075, 750, 350, 64, TextGet("KinkyDungeonMenu"), "#ffffff", ""); + } else if (KinkyDungeonState == "Toggles") { + KDDrawToggleTabs(500); + + if (KDToggleTab == "Keybindings") { + // Draw temp start screen + DrawButtonKDEx("KBBack", () => { + KinkyDungeonKeybindings = Object.assign({}, KinkyDungeonKeybindingsTemp); + if (KinkyDungeonGameFlag) { + KinkyDungeonState = "Game"; + if (KinkyDungeonKeybindings) { + KDCommitKeybindings(); + } + } else KinkyDungeonState = "Menu"; + localStorage.setItem("KinkyDungeonKeybindings", JSON.stringify(KinkyDungeonKeybindings)); + //ServerAccountUpdate.QueueData({ KinkyDungeonKeybindings: KinkyDungeonKeybindings }); + return true; + }, true, 1450, 780, 350, 64, TextGet("GameReturnToMenu"), "#ffffff", ""); + + // Draw temp start screen + DrawButtonKDEx("KBBack2", () => { + KinkyDungeonKeybindingsTemp = Object.assign({}, KinkyDungeonKeybindings); + if (KinkyDungeonGameFlag) { + KinkyDungeonState = "Game"; + } else KinkyDungeonState = "Menu"; + //ServerAccountUpdate.QueueData({ KinkyDungeonKeybindings: KinkyDungeonKeybindings }); + return true; + }, true, 1450, 700, 350, 64, TextGet("GameReturnToMenu2"), "#ffffff", ""); + + // Draw temp start screen + DrawButtonKDEx("KDReset", () => { + KinkyDungeonKeybindingsTemp = Object.assign({}, KDDefaultKB); + return true; + }, true, 1450, 500, 350, 64, TextGet("KDResetKeys"), "#ffffff", ""); + + + // Draw key buttons + + let maxY = 850; + + let sY = 80; + + let X = 500; + let Y = sY; + let dX = 300; + let dY = 40; + let pad = 1; + let xpad = 15; + + for (let key of Object.keys(KDDefaultKB)) { + DrawButtonKDEx("KB" + key, () => {KinkyDungeonKeybindingsTemp[key] = KinkyDungeonKeybindingCurrentKey; return true;}, KinkyDungeonKeybindingCurrentKey != '', + X, Y, dX, dY, TextGet("KinkyDungeonKey" + key) + ": '" + (KinkyDungeonKeybindingsTemp[key]) + "'", + KinkyDungeonKeybindingsTemp[key] == KinkyDungeonKeybindingCurrentKey ? "#ffffff" : "#aaaaaa", "", undefined, undefined, true, KDButtonColor); + + Y += dY + pad; + if (Y > maxY) { + Y = sY; + X += dX + xpad; + } + } + + if (KinkyDungeonKeybindingCurrentKey) + DrawTextKD(TextGet("KinkyDungeonCurrentPress") + ": '" + (KinkyDungeonKeybindingCurrentKey) + "'", 1250, 900, "#ffffff", KDTextGray2); + + DrawTextKD(TextGet("KinkyDungeonCurrentPressInfo"), 1250, 950, "#ffffff", KDTextGray2); + } else { + let XX = KDToggleTab == "Main" ? 940 : 540; + let YYstart = 60; + let YYmax = 800; + let YY = YYstart; + let YYd = 74; + let XXd = 450; + let toggles = Object.keys(KDToggles); + //MainCanvas.textAlign = "left"; + for (let toggle of toggles.filter((tog) => {return KDToggleCategories[tog] == KDToggleTab || (!KDToggleCategories[tog] && KDToggleTab == "Main");})) { + // Draw temp start screen + DrawCheckboxKDEx("toggle" + toggle, () => { + KDToggles[toggle] = !KDToggles[toggle]; + KDSaveToggles(); + return true; + }, true, XX, YY, 64, 64, TextGet("KDToggle" + toggle), KDToggles[toggle], false, "#ffffff", undefined, { + maxWidth: 350, + fontSize: 24, + scaleImage: true, + }); + + YY += YYd; + if (YY > YYmax) { + YY = YYstart; + XX += XXd; + } + } + //MainCanvas.textAlign = "center"; + + YY = YYstart + 50; + YYd = 80; + let CombarXX = 550; + + if (KDToggleTab == "Main") { + if (StandalonePatched) { + DrawBackNextButtonVis(CombarXX, YY, 350, 64, TextGet("KDResolution" + (KDResolutionConfirm ? "Confirm" : "")) + " " + Math.round(KDResolution * 100) + "%", "#ffffff", "", + () => KDResolutionList[(KDResolutionListIndex + KDResolutionList.length - 1) % KDResolutionList.length] * 100 + "%", + () => KDResolutionList[(KDResolutionListIndex + 1) % KDResolutionList.length] * 100 + "%"); + YY += YYd; + DrawBackNextButtonVis(CombarXX, YY, 350, 64, TextGet("KDGamma") + " " + (Math.round(KDGamma * 100) + "%"), "#ffffff", "", + () => KDGammaList[(KDGammaListIndex + KDGammaList.length - 1) % KDGammaList.length] * 100 + "%", + () => KDGammaList[(KDGammaListIndex + 1) % KDGammaList.length] * 100 + "%"); + YY += YYd * 2; + } + + DrawBackNextButtonVis(CombarXX, YY, 350, 64, TextGet("KDVibeVolume") + " " + (KDVibeVolume * 100 + "%"), "#ffffff", "", + () => KDVibeVolumeList[(KDVibeVolumeListIndex + KDVibeVolumeList.length - 1) % KDVibeVolumeList.length] * 100 + "%", + () => KDVibeVolumeList[(KDVibeVolumeListIndex + 1) % KDVibeVolumeList.length] * 100 + "%"); + YY += YYd; + DrawBackNextButtonVis(CombarXX, YY, 350, 64, TextGet("KDMusicVolume") + " " + (KDMusicVolume * 100 + "%"), "#ffffff", "", + () => KDMusicVolumeList[(KDMusicVolumeListIndex + KDMusicVolumeList.length - 1) % KDMusicVolumeList.length] * 100 + "%", + () => KDMusicVolumeList[(KDMusicVolumeListIndex + 1) % KDMusicVolumeList.length] * 100 + "%"); + YY += YYd; + DrawBackNextButtonVis(CombarXX, YY, 350, 64, TextGet("KDSfxVolume") + " " + (KDSfxVolume * 100 + "%"), "#ffffff", "", + () => KDSfxVolumeList[(KDSfxVolumeListIndex + KDSfxVolumeList.length - 1) % KDSfxVolumeList.length] * 100 + "%", + () => KDSfxVolumeList[(KDSfxVolumeListIndex + 1) % KDSfxVolumeList.length] * 100 + "%"); + YY += YYd; + DrawBackNextButtonVis(CombarXX, YY, 350, 64, TextGet("KDAnimSpeed") + " " + (KDAnimSpeed * 100 + "%"), "#ffffff", "", + () => KDAnimSpeedList[(KDAnimSpeedListIndex + KDAnimSpeedList.length - 1) % KDAnimSpeedList.length] * 100 + "%", + () => KDAnimSpeedList[(KDAnimSpeedListIndex + 1) % KDAnimSpeedList.length] * 100 + "%"); + YY += YYd; + DrawBackNextButtonVis(CombarXX, YY, 350, 64, TextGet("KDSelectedFont") + " " + (KDSelectedFont), "#ffffff", "", + () => KDSelectedFontList[(KDSelectedFontListIndex + KDSelectedFontList.length - 1) % KDSelectedFontList.length], + () => KDSelectedFontList[(KDSelectedFontListIndex + 1) % KDSelectedFontList.length]); + YY += YYd; + DrawBackNextButtonVis(CombarXX, YY, 350, 64, TextGet("KDButtonFont") + " " + (KDButtonFont), "#ffffff", "", + () => KDButtonFontList[(KDButtonFontListIndex + KDButtonFontList.length - 1) % KDButtonFontList.length], + () => KDButtonFontList[(KDButtonFontListIndex + 1) % KDButtonFontList.length], undefined, undefined, undefined, { + font: KDButtonFont + }); + YY += YYd; + + + + + + + } else if (KDToggleTab == "Clothes") { + let scale = 72; + let x = 1500; + let y = 100; + let w = KDPaletteWidth; + DrawTextFitKD(TextGet("KDBackgroundColor"), x + scale*(0.5 + w)/2, y, scale*w, "#ffffff", KDTextGray0, 20); + + + let CF = KDTextField("KDBGColor", x + scale*(0.5 + w)/2 - 100, y + 24, 200, 30, undefined, KDBGColor + "", "7"); + if (CF.Created) { + CF.Element.oninput = (_event: InputEvent) => { + let value = ElementValue("KDBGColor"); + try { + if (/^#[0-9A-F]{6}$/i.test(value)) { + KDBGColor = value; + localStorage.setItem("KDBGColor", KDBGColor); + } else { + KDBGColor = ""; + } + } catch (err) { + console.log("Invalid color"); + } + + }; + } + + + KDDrawPalettes(x, 250, w, scale, undefined, undefined); + + let options = [ + {name: "ApplyPaletteRestraint"}, + {name: "ApplyPaletteTransform"}, + {name: "NoOutfitPalette"}, + ]; + + let ii = 0; + let spacing = 70; + for (let o of options) { + if (o.name) { + DrawCheckboxKDEx("toggle" + o.name, () => { + // @ts-ignore + if (o.cb) o.cb(); + else { + KDToggles[o.name] = !KDToggles[o.name]; + KDSaveToggles(); + } + return true; + }, true, x, 600 + ii * spacing, 64, 64, + TextGet("KDToggle" + o.name), + KDToggles[o.name], false, "#ffffff", undefined, { + maxWidth: 350, + fontSize: 24, + scaleImage: true, + }); + } + ii++; + } + } + DrawButtonKDEx("KBBackOptions", () => { + KinkyDungeonKeybindingsTemp = Object.assign({}, KinkyDungeonKeybindingsTemp); + if (KinkyDungeonGameFlag) { + KinkyDungeonState = "Game"; + } else KinkyDungeonState = "Menu"; + //ServerAccountUpdate.QueueData({ KinkyDungeonKeybindings: KinkyDungeonKeybindings }); + return true; + }, true, 975, 880, 550, 64, TextGet("GameReturnToMenuFromOptions"), "#ffffff", "", undefined, undefined, undefined, undefined, + undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySkip[0]), + hotkeyPress: KinkyDungeonKeySkip[0], + } + ); + + } + } else if (KinkyDungeonState == "ModConfig") { + KDDrawModConfigs(); + } else if (KinkyDungeonState == "LoadSlots") { + KDUpdateDiscordName() + KDDrawLoadMenu(); + } + + + KDTickAdaptiveTexCache(KDDrawDelta/KDCULLTIME); + // Cull temp elements + KDCullTempElements(); + + //if (KDDebugMode) { + //DrawTextKD(dispfps, 20, 20, "#ffffff", undefined, undefined, "left"); + //} + // Cull the sprites that werent rendered or updated this frame + KDCullSprites(); + KDCullRTList(kdRTcache); + KDCullTexList(kdTexcache); + + + + + KDDrawDelta = performance.now() - lastfps; + fpscounter++; + if (fpscounter > 10) { + fpscounter = 0; + dispfps = Math.round(1000 / Math.max(KDDrawDelta, 1)); + } + + lastfps = performance.now(); + KDUpdateParticles(KDDrawDelta); + + KDDrawMusic(KDDrawDelta); + + if (StandalonePatched) { + /*if (KinkyDungeonState == "Game") { + if (!kdTrackGameParticles) { + kdcanvas.addChild(kdparticles); + kdTrackGameParticles = true; + } + } else { + if (kdTrackGameParticles) { + kdcanvas.removeChild(kdparticles); + kdTrackGameParticles = false; + } + }*/ + } else { + // Draw the context layer even if we haven't updated it + if (pixirenderer) { + pixirenderer.render(kdcanvas, { + clear: false, + antialias: !CommonIsMobile, + useContextAlpha: false, + }); + pixirenderer.render(kdui, { + clear: false, + antialias: !CommonIsMobile, + useContextAlpha: false, + }); + } + } + + + if (!(KinkyDungeonState == "Toggles" && KDToggleTab == "Keybindings")) { + if (KinkyDungeonKeybindingCurrentKey && KinkyDungeonGameKeyDown()) { + + if ((document.activeElement && KDFocusableTextFields.includes(document.activeElement.id))) { + if (KinkyDungeonKeybindingCurrentKey) + KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime(); + KinkyDungeonKeybindingCurrentKey = ''; + return true; + } + for (let [k, v] of Object.entries(KDButtonsCache)) { + if (v.hotkeyPress == KinkyDungeonKeybindingCurrentKey) { + KDClickButton(k); + return true; + } + } + + for (let keybinding of Object.values(KDKeyCheckers)) { + if (keybinding()) return true; + } + + + if (KinkyDungeonKeybindingCurrentKey) + KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime(); + KinkyDungeonKeybindingCurrentKey = ''; + } + } + + //MainCanvas.textBaseline = "middle"; + + KDLastButtonsCache = {}; + //MouseClicked = false; + + if ((!KDDebugMode && KinkyDungeonDrawState == "Restart") || (KDDebugMode && (KinkyDungeonDrawState != "Restart" || KinkyDungeonState != "Game"))) { + ElementRemove("DebugEnemy"); + ElementRemove("DebugItem"); + } + + KDDoGraphicsSanitize(); +} + +let KDDrawDelta = 0; + +let kdTrackGameBoard = false; +let kdTrackGameFog = false; +let kdTrackGameParticles = false; + +let KDlastCull = new Map(); + +function KDGetCullTime() { + // Adaptive culling + return Math.max(1000, KDCULLTIME); +} + +function KDPurgeSpriteRelatedFilters(sprite: PIXISprite | PIXITexture) { + if (kdFilterSprites.get(sprite)) { + for (let f of kdFilterSprites.get(sprite)) { + KDFilterCacheToDestroy.push(f.filter); + KDAdjustmentFilterCache.delete(f.hash); + } + kdFilterSprites.delete(sprite); + } +} + +function KDCullSprites(): void { + if (!KDlastCull.get(kdpixisprites)) KDlastCull.set(kdpixisprites, 0); + let cull = CommonTime() > ((KDlastCull.get(kdpixisprites) || 0) + KDGetCullTime()); + for (let sprite of kdpixisprites.entries()) { + if (!kdSpritesDrawn.has(sprite[0])) { + if (cull) { + if (sprite[1].parent) { + sprite[1].parent.removeChild(sprite[1]); + } + if (kdprimitiveparams.has(sprite[0])) kdprimitiveparams.delete(sprite[0]); + kdpixisprites.delete(sprite[0]); + delete sprite[1].filters; + KDPurgeSpriteRelatedFilters(sprite[1]); + if (sprite[1].destroy && !sprite[1].destroyed) + sprite[1].destroy(); + } else sprite[1].visible = false; + }// else sprite[1].visible = true; + } + if (cull) KDlastCull.set(kdpixisprites, CommonTime()); + + +} +function KDCullSpritesList(list: Map): void { + if (!KDlastCull.get(list)) KDlastCull.set(list, 0); + let cull = CommonTime() > ((KDlastCull.get(list) || 0) + KDGetCullTime()); + for (let sprite of list.entries()) { + if (!kdSpritesDrawn.has(sprite[0])) { + if (cull) { + sprite[1].parent.removeChild(sprite[1]); + if (kdprimitiveparams.has(sprite[0])) kdprimitiveparams.delete(sprite[0]); + list.delete(sprite[0]); + delete sprite[1].filters; + KDPurgeSpriteRelatedFilters(sprite[1]); + if (sprite[1].destroy && !sprite[1].destroyed) + sprite[1].destroy(); + } else sprite[1].visible = false; + }// else sprite[1].visible = true; + } + if (cull) KDlastCull.set(list, CommonTime()); +} + + +function KDCullRTList(list: Map): void { + let ct = CommonTime() - KDGetCullTime(); + for (let sprite of list.entries()) { + if (!kdRTlastLookup.has(sprite[0]) + || + ct > kdRTlastLookup.get(sprite[0]) + ) { + list.delete(sprite[0]); + + if (kdRTSpritecache.get(sprite[1])) { + if (kdRTSpritecache.get(sprite[1]).destroy && !kdRTSpritecache.get(sprite[1]).destroyed) + kdRTSpritecache.get(sprite[1]).destroy(); + kdRTSpritecache.delete(sprite[1]); + } + + KDPurgeSpriteRelatedFilters(sprite[1]); + kdRTlastLookup.delete(sprite[0]); + sprite[1].destroy(true); + } + } +} + +function KDCullTexList(list: Map): void { + let ct = CommonTime() - KDGetCullTime(); + for (let sprite of list.entries()) { + if (!kdTexlastLookup.has(sprite[0]) + || + ct > kdTexlastLookup.get(sprite[0]) + ) { + list.delete(sprite[0]); + kdTexlastLookup.delete(sprite[0]); + KDPurgeSpriteRelatedFilters(sprite[1]); + sprite[1].destroy(false); + } + } +} + +let KDButtonsCache: Record boolean, priority: number, scrollfunc?: (amount: number) => void, hotkeyPress?: string}> = { +}; + +let KDLastButtonsCache: Record boolean, priority: number}> = { +}; + +/** + * Draws a button component + * @param name - Name of the button element + * @param enabled - Whether or not you can click on it + * @param Left - Position of the component from the left of the canvas + * @param Top - Position of the component from the top of the canvas + * @param Width - Width of the component + * @param Height - Height of the component + * @param Label - Text to display in the button + * @param Color - Color of the component + * @param [Image] - URL of the image to draw inside the button, if applicable + * @param [HoveringText] - Text of the tooltip, if applicable + * @param [Disabled] - Disables the hovering options if set to true + * @param [NoBorder] - Disables the border and stuff + * @returns - Nothing + */ +function DrawButtonKD ( + name: string, + enabled: boolean, + Left: number, + Top: number, + Width: number, + Height: number, + Label: string, + Color: string, + Image?: string, + HoveringText?: string, + Disabled?: boolean, + NoBorder?: boolean +): void +{ + DrawButtonVis(Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder); + KDButtonsCache[name] = { + Left, + Top, + Width, + Height, + enabled, + priority: 0, + }; +} + + +/** + * Draws a button component + * @param name - Name of the button element + * @param func - Whether or not you can click on it + * @param enabled - Whether or not you can click on it + * @param Left - Position of the component from the left of the canvas + * @param Top - Position of the component from the top of the canvas + * @param Width - Width of the component + * @param Height - Height of the component + * @param Label - Text to display in the button + * @param Color - Color of the component + * @param [Image] - URL of the image to draw inside the button, if applicable + * @param [HoveringText] - Text of the tooltip, if applicable + * @param [Disabled] - Disables the hovering options if set to true + * @param [NoBorder] - Disables border + * @param [FillColor] - BG color + * @param [FontSize] - Font size + * @param [ShiftText] - Shift text to make room for the button + * @param [options] - Additional options + * @param [options.noTextBG] - Dont show text backgrounds + * @param [options.alpha] - Dont show text backgrounds + * @param [options.zIndex] - zIndex + * @param [options.scaleImage] - zIndex + * @param [options.centered] - centered + * @param [options.centerText] - centered + * @param [options.tint] - tint + * @param [options.hotkey] - hotkey + * @param [options.hotkeyPress] - hotkey + * @param [options.filters] - filters + * @returns - Whether or not the mouse is in the button + */ +function DrawButtonKDEx ( + name: string, + func: (bdata: any) => any, + enabled: boolean, + Left: number, + Top: number, + Width: number, + Height: number, + Label: string, + Color: string, + Image?: string, + HoveringText?: string, + Disabled?: boolean, + NoBorder?: boolean, + FillColor?: string, + FontSize?: number, + ShiftText?: boolean, + options?: any, +): boolean +{ + DrawButtonVis(Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, undefined, options?.zIndex, options); + KDButtonsCache[name] = { + Left, + Top, + Width, + Height, + enabled, + func, + priority: (options?.zIndex || 0), + hotkeyPress: options?.hotkeyPress, + }; + return MouseIn(Left,Top,Width,Height); +} + + + +/** + * Draws a button component + * @param name - Name of the button element + * @param func - Whether or not you can click on it + * @param enabled - Whether or not you can click on it + * @param Left - Position of the component from the left of the canvas + * @param Top - Position of the component from the top of the canvas + * @param Width - Width of the component + * @param Height - Height of the component + * @param Label - Text to display in the button + * @param Color - Color of the component + * @param [Image] - URL of the image to draw inside the button, if applicable + * @param [HoveringText] - Text of the tooltip, if applicable + * @param [Disabled] - Disables the hovering options if set to true + * @param [NoBorder] - Disables border + * @param [FillColor] - BG color + * @param [FontSize] - Font size + * @param [ShiftText] - Shift text to make room for the button + * @param [options] - Additional options + * @param [options.noTextBG] - Dont show text backgrounds + * @param [options.alpha] - Dont show text backgrounds + * @param [options.zIndex] - zIndex + * @param [options.scaleImage] - zIndex + * @param [options.centered] - centered + * @param [options.centerText] - centered + * @param [options.tint] - tint + * @param [options.hotkey] - hotkey + * @param [options.hotkeyPress] - hotkey + * @returns - Whether or not the mouse is in the button + */ +function DrawButtonKDExScroll ( + name: string, + scrollfunc: (amount: number) => boolean | void, + func: (bdata: any) => boolean, + enabled: boolean, + Left: number, + Top: number, + Width: number, + Height: number, + Label: string, + Color: string, + Image?: string, + HoveringText?: string, + Disabled?: boolean, + NoBorder?: boolean, + FillColor?: string, + FontSize?: number, + ShiftText?: boolean, + options?: any, +): boolean +{ + DrawButtonVis(Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, undefined, options?.zIndex, options); + KDButtonsCache[name] = { + Left, + Top, + Width, + Height, + enabled, + func, + priority: (options?.zIndex || 0), + scrollfunc: scrollfunc, + hotkeyPress: options?.hotkeyPress, + }; + return MouseIn(Left,Top,Width,Height); +} + +/** + * Draws a button component + * @param Container - Container to draw to + * @param name - Name of the button element + * @param func - Whether or not you can click on it + * @param enabled - Whether or not you can click on it + * @param Left - Position of the component from the left of the canvas + * @param Top - Position of the component from the top of the canvas + * @param Width - Width of the component + * @param Height - Height of the component + * @param Label - Text to display in the button + * @param Color - Color of the component + * @param [Image] - URL of the image to draw inside the button, if applicable + * @param [HoveringText] - Text of the tooltip, if applicable + * @param [Disabled] - Disables the hovering options if set to true + * @param [NoBorder] - Disables border + * @param [FillColor] - BG color + * @param [FontSize] - Font size + * @param [ShiftText] - Shift text to make room for the button + * @param [options] - Additional options + * @param [options.noTextBG] - Dont show text backgrounds + * @param [options.alpha] - Dont show text backgrounds + * @param [options.zIndex] - zIndex + * @param [options.hotkey] - hotkey + * @param [options.hotkeyPress] - hotkey + * @param [options.unique] - This button is unique, so X and Y are not differentiators + * @returns - Whether or not the mouse is in the button + */ +function DrawButtonKDExTo ( + Container: any, + name: string, + func: (bdata: any) => boolean, + enabled: boolean, + Left: number, + Top: number, + Width: number, + Height: number, + Label: string, + Color: string, + Image?: string, + HoveringText?: string, + Disabled?: boolean, + NoBorder?: boolean, + FillColor?: string, + FontSize?: number, + ShiftText?: boolean, + options?: any, +): boolean +{ + DrawButtonVisTo(Container, Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, undefined, options?.zIndex, options); + KDButtonsCache[name] = { + Left, + Top, + Width, + Height, + enabled, + func, + priority: (options?.zIndex || 0), + hotkeyPress: options?.hotkeyPress, + }; + return MouseIn(Left,Top,Width,Height); +} + +function KDMouseWheel (event: WheelEvent): void { + if (!KDProcessButtonScroll(event.deltaY)) { + // If we fail we dilate the buttons vertically + if (KDProcessButtonScroll(event.deltaY, 15)) return; + } else return; + if (KDFunctionOptionsScroll(event.deltaY)) return; + if (KDFunctionCollectionScroll(event.deltaY)) return; + if (KDFunctionFacilitiesScroll(event.deltaY)) return; + if (KDFunctionContainerScroll(event.deltaY)) return; + if (KDFunctionDialogueScroll(event.deltaY)) return; + if (KDFunctionPerksScroll(event.deltaY || event.deltaX)) return; + if (KDFunctionQuestScroll(event.deltaY || event.deltaX)) return; + if (KDFunctionMagicPageScroll(event.deltaY || event.deltaX)) return; + if (KDFunctionMagicSpellPageScroll(event.deltaY || event.deltaX)) return; + if (KDFunctionInventoryScroll(event.deltaY || event.deltaX)) return; + if (KDFunctionMsgScroll(event.deltaY)) return; + if (KDFunctionRestraintIndexScroll(event.deltaY)) return; + if (KDFunctionShopScroll(event.deltaY)) return; + if (KDFunctionSpellPageScroll(event.deltaY || event.deltaX)) return; + if (KDFunctionJourneyMapScroll(event.deltaY || event.deltaX)) return; +} + +function KDFunctionOptionsScroll(amount: number): boolean { + if (KinkyDungeonState == "Toggles") { + let index = KDToggleGroups.indexOf(KDToggleTab); + if (amount > 0) { + if (index >= 0) index += 1; + if (index >= KDToggleGroups.length) index = 0; + } else { + if (index >= 0) index -= 1; + if (index < 0) index = KDToggleGroups.length-1; + } + if (index >= 0) + KDToggleTab = KDToggleGroups[index]; + return true; + } + return false; +} +function KDFunctionPerksScroll(amount: number): boolean { + if (KinkyDungeonState == "Stats" || KinkyDungeonDrawState == "Perks2" ) { + if (amount > 0) { + KDClickButton("perks>"); + } else { + KDClickButton("perks<"); + } + return true; + } + return false; +} +function KDFunctionQuestScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Quest") { + if (amount > 0) { + KDClickButton("questDown"); + } else { + KDClickButton("questUp"); + } + return true; + } + return false; +} +function KDFunctionCollectionScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && (KinkyDungeonDrawState == "Collection" || KinkyDungeonDrawState == "Bondage")) { + if (amount > 0) { + KDClickButton("collDOWN"); + } else { + KDClickButton("collUP"); + } + return true; + } + return false; +} +function KDFunctionFacilitiesScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Facilities") { + if (amount > 0) { + KDClickButton("facDown"); + } else { + KDClickButton("facUp"); + } + return true; + } + return false; +} +function KDFunctionContainerScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Container") { + if (amount > 0) { + KDClickButton("conDown"); + } else { + KDClickButton("conUp"); + } + return true; + } + return false; +} +function KDFunctionJourneyMapScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "JourneyMap") { + if (amount > 0) { + KDClickButton("journeyDown"); + } else { + KDClickButton("journeyUp"); + } + return true; + } + return false; +} +function KDFunctionSpellPageScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" ) { + if (amount > 0) { + KDCycleSpellPage(false, true); + } else { + KDCycleSpellPage(true, true); + } + return true; + } + return false; +} +function KDFunctionMagicPageScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Magic" ) { + if (amount > 0) { + KDClickButton("magicnextpage"); + } else { + KDClickButton("magiclastpage"); + } + return true; + } + return false; +} +function KDFunctionMagicSpellPageScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "MagicSpells") { + if (MouseY < 225) { + if (amount > 0) { + KinkyDungeonCurrentSpellsPage += 1; + if (KinkyDungeonCurrentSpellsPage >= KinkyDungeonLearnableSpells.length - 1) KinkyDungeonCurrentSpellsPage = KinkyDungeonLearnableSpells.length - 1; + } else { + KinkyDungeonCurrentSpellsPage -= 1; + if (KinkyDungeonCurrentSpellsPage < 0) KinkyDungeonCurrentSpellsPage = 0; + } + } + + return true; + } + return false; +} +function KDFunctionInventoryScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Inventory" ) { + if (amount > 0) { + KDClickButton("invnextpage"); + } else { + KDClickButton("invlastpage"); + } + return true; + } + return false; +} +function KDFunctionMsgScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonMessageToggle) { + if (amount > 0) { + KDClickButton("logscrolldown"); + } else { + KDClickButton("logscrollup"); + } + return true; + } + return false; +} +function KDFunctionRestraintIndexScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonDrawStruggleHover && currentDrawnSG && currentDrawnSGLength) { + if (amount > 0) { + if ((KDStruggleGroupLinkIndex[currentDrawnSG.group] < currentDrawnSGLength - 1)) KDStruggleGroupLinkIndex[currentDrawnSG.group] += 1; + } else { + if ((KDStruggleGroupLinkIndex[currentDrawnSG.group] > 0)) KDStruggleGroupLinkIndex[currentDrawnSG.group] -= 1; + } + return true; + } + return false; +} +function KDFunctionDialogueScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KDGameData.CurrentDialog) { + if (amount > 0) { + KDClickButton("dialogueDOWN"); + } else { + KDClickButton("dialogueUP"); + } + return true; + } + return false; +} +function KDFunctionShopScroll(amount: number): boolean { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonTargetTile?.Type == "Shrine" && KinkyDungeonTargetTile.Name == "Commerce") { + if (amount < 0) { + KinkyDungeonShopIndex = (KinkyDungeonShopIndex + 1) % KDMapData.ShopItems.length; + KDShopBuyConfirm = false; + return true; + } else { + KinkyDungeonShopIndex = KinkyDungeonShopIndex - 1; + if (KinkyDungeonShopIndex < 0) KinkyDungeonShopIndex = KDMapData.ShopItems.length - 1; + KDShopBuyConfirm = false; + return true; + } + } + return false; +} + + +function KDProcessButtonScroll(amount: number, padV: number = 0): boolean { + let buttons = []; + for (let button of Object.entries(KDButtonsCache)) { + if (button[1].enabled && button[1].scrollfunc) { + if (MouseInKD(button[0], 0, padV)) { + buttons.push(button[1]); + } + } + } + if (buttons.length > 0) { + buttons = buttons.sort((a, b) => {return b.priority - a.priority;}); + buttons[0].scrollfunc(amount); + return true; + } + + + return false; +} + +function KDProcessButtons() { + //KDFocusControls = ""; + let buttons = []; + for (let button of Object.entries(KDButtonsCache)) { + if (button[1].enabled && button[1].func) { + if (MouseInKD(button[0])) { + buttons.push(button[1]); + } + } + } + if (buttons.length > 0) { + buttons = buttons.sort((a, b) => {return b.priority - a.priority;}); + return buttons[0].func(); + } + + return false; +} + +/** + * Buttons are clickable one frame later, please factor this in to UI design (especially when enforcing validation) + */ +function KDClickButton(name: string): boolean { + let button = KDButtonsCache[name] || KDLastButtonsCache[name]; + if (button && button.enabled) { + return button.func(); + } + return false; +} + +function MouseInKD(name: string, padX: number = 0, padV: number = 0) { + let button = KDButtonsCache[name]; + if (button && button.enabled) { + return MouseIn(button.Left - padX, button.Top - padV, button.Width + 2*padX, button.Height + 2*padV); + } + return false; +} + +function KinkyDungeonGetTraitsCount() { + return Array.from(KinkyDungeonStatsChoice.keys()).filter((element) => {return !element.includes('arousalMode');}).length; +} + +function KDSendTrait(_trait) { + // Banish Google +} + +function KDSendSpell(_spell) { + // Banish Google +} + +function KDSendSpellCast(_spell) { + // Banish Google +} +function KDSendWeapon(_weapon) { + // Banish Google +} + +// @ts-ignore +function KDSendStatus(_type, _data?, _data2?) { + // Banish Google from existence +} +// @ts-ignore +function KDSendEvent(_type) { + // Banish Google from existence +} + +function KinkyDungeonLoadStats() { + KinkyDungeonStatsChoice = new Map(); + KDReloadChallenge(); + KDUpdatePlugSettings(false); + let statsChoice = localStorage.getItem('KinkyDungeonStatsChoice' + KinkyDungeonPerksConfig); + if (statsChoice) { + let statsArray = JSON.parse(statsChoice); + if (statsArray) { + for (let s of statsArray) { + if (!kdSpecialModePerks.includes(s) && KinkyDungeonStatsPresets[s] && KDValidatePerk(KinkyDungeonStatsPresets[s])) + KinkyDungeonStatsChoice.set(s, true); + } + } + } + KDUpdatePlugSettings(true); +} + +let KinkyDungeonGameFlag = false; + + + + +function KDInitializeJourney(Journey: string, Level: number = 0) { + KDCurrentWorldSlot = {x: 0, y: Level || 0}; + KDWorldMap = {}; + + InitPersistentGen(); + + let newIndex: string[] = []; + + if (Journey != undefined) + KDGameData.Journey = Journey; + + if (KDGameData.Journey == "Random") { + + // https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array + let randList = [...KDDefaultJourney, ...KDDefaultAlt]; + for (let i = randList.length - 1; i >= 0; i--) { + let j = Math.floor(KDRandom() * (i + 1)); + let temp = randList[i]; + randList[i] = randList[j]; + randList[j] = temp; + } + for (let i = 0; i < KDDefaultJourney.length; i++) { + newIndex.push(randList[i]); + } + } else if (KDGameData.Journey == "Harder") { + for (let i = 0; i < KDDefaultJourney.length; i++) { + //newIndex[KDDefaultAlt[i]] = KDDefaultJourney[i]; + newIndex = [...KDDefaultAlt]; + } + } else if (KDGameData.Journey == "Explorer") { + newIndex = [...KDDefaultJourney]; + newIndex[0] = 'jng'; + newIndex[1] = 'grv'; + newIndex[2] = 'tmp'; + newIndex[3] = 'ore'; + newIndex[4] = 'bel'; + } else if (KDGameData.Journey == "Doll") { + newIndex = [...KDDefaultJourney]; + newIndex[0] = 'bel'; + newIndex[1] = 'bel'; + newIndex[2] = 'bel'; + newIndex[3] = 'cry'; + newIndex[4] = 'cat'; + } else if (KDGameData.Journey == "Temple") { + newIndex = [...KDDefaultJourney]; + newIndex[0] = 'tmp'; + newIndex[1] = 'lib'; + newIndex[2] = 'tmb'; + newIndex[3] = 'cat'; + newIndex[4] = 'jng'; + } else if (KDGameData.Journey == "Test") { + newIndex = [...KDDefaultJourney]; + newIndex[0] = 'bel'; + } else { + newIndex = [...KDDefaultJourney]; + } + + KDGameData.JourneyProgression = newIndex; + + KinkyDungeonMapIndex = {}; + + for (let map of KDDefaultJourney) { + KinkyDungeonMapIndex[map] = map; + } + for (let map of KDDefaultAlt) { + KinkyDungeonMapIndex[map] = map; + } + + + // Option to shuffle the dungeon types besides the initial one (graveyard) + /* + + let newIndex = {}; + + for (let map of KDDefaultJourney) { + newIndex[map] = map; + } + for (let map of KDDefaultAlt) { + newIndex[map] = map; + } + + if (Journey) + KDGameData.Journey = Journey; + + if (KDGameData.Journey == "Random") { + + // https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array + let randList = Array.from(Object.keys(newIndex)); + for (let i = randList.length - 1; i >= 0; i--) { + let j = Math.floor(KDRandom() * (i + 1)); + let temp = randList[i]; + randList[i] = randList[j]; + randList[j] = temp; + } + let ii = 0; + for (let index of Object.keys(newIndex)) { + newIndex[index] = randList[ii]; + ii++; + } + + } else if (KDGameData.Journey == "Harder") { + for (let i = 0; i < KDDefaultJourney.length; i++) { + newIndex[KDDefaultAlt[i]] = KDDefaultJourney[i]; + newIndex[KDDefaultJourney[i]] = KDDefaultAlt[i]; + } + } else if (KDGameData.Journey == "Explorer") { + newIndex.grv = 'jng'; + newIndex.tmb = 'cry'; + newIndex.cat = 'grv'; + newIndex.lib = 'cat'; + newIndex.jng = 'tmp'; + newIndex.cry = 'lib'; + newIndex.tmp = 'ore'; + newIndex.ore = 'tmb'; + newIndex.bel = 'bel'; + } else if (KDGameData.Journey == "Doll") { + newIndex.grv = 'bel'; + newIndex.tmb = 'tmp'; + newIndex.cat = 'bel'; + newIndex.lib = 'ore'; + newIndex.jng = 'bel'; + newIndex.cry = 'lib'; + newIndex.tmp = 'cry'; + newIndex.ore = 'tmb'; + newIndex.bel = 'cat'; + } else if (KDGameData.Journey == "Temple") { + newIndex.grv = 'tmp'; + newIndex.tmb = 'ore'; + newIndex.cat = 'lib'; + newIndex.lib = 'ore'; + newIndex.jng = 'tmb'; + newIndex.cry = 'bel'; + newIndex.tmp = 'cat'; + newIndex.ore = 'cry'; + newIndex.bel = 'jng'; + } else if (KDGameData.Journey == "Test") { + newIndex.grv = 'bel'; + newIndex.tmb = 'bel'; + } + + KinkyDungeonMapIndex = newIndex; + */ + + + + KDInitJourneyMap(Level); +} + + + +function KDCommitKeybindings() { + KinkyDungeonKey = [KinkyDungeonKeybindings.Up, KinkyDungeonKeybindings.Left, KinkyDungeonKeybindings.Down, KinkyDungeonKeybindings.Right, KinkyDungeonKeybindings.UpLeft, KinkyDungeonKeybindings.UpRight, KinkyDungeonKeybindings.DownLeft, KinkyDungeonKeybindings.DownRight]; // WASD + KinkyDungeonGameKey.KEY_UP = (KinkyDungeonKeybindings.Up); + KinkyDungeonGameKey.KEY_DOWN = (KinkyDungeonKeybindings.Down); + KinkyDungeonGameKey.KEY_LEFT = (KinkyDungeonKeybindings.Left); + KinkyDungeonGameKey.KEY_RIGHT = (KinkyDungeonKeybindings.Right); + KinkyDungeonGameKey.KEY_UPLEFT = (KinkyDungeonKeybindings.UpLeft); + KinkyDungeonGameKey.KEY_DOWNLEFT = (KinkyDungeonKeybindings.DownLeft); + KinkyDungeonGameKey.KEY_UPRIGHT = (KinkyDungeonKeybindings.UpRight); + KinkyDungeonGameKey.KEY_DOWNRIGHT = (KinkyDungeonKeybindings.DownRight); + + //let KinkyDungeonKeyNumpad = [56, 52, 50, 54, 55, 57, 49, 51]; // Numpad + KinkyDungeonKeySpell = [ + KinkyDungeonKeybindings.Spell1, + KinkyDungeonKeybindings.Spell2, + KinkyDungeonKeybindings.Spell3, + KinkyDungeonKeybindings.Spell4, + KinkyDungeonKeybindings.Spell5, + KinkyDungeonKeybindings.Spell6, + KinkyDungeonKeybindings.Spell7, + KinkyDungeonKeybindings.Spell8, + KinkyDungeonKeybindings.Spell9, + KinkyDungeonKeybindings.Spell0, + ]; // ! @ # + KinkyDungeonKeyUpcast = [KinkyDungeonKeybindings.Upcast, KinkyDungeonKeybindings.UpcastCancel]; + KinkyDungeonKeySpellConfig = [ + KinkyDungeonKeybindings.SpellConfig1, + KinkyDungeonKeybindings.SpellConfig2, + KinkyDungeonKeybindings.SpellConfig3, + ]; + KinkyDungeonKeyWait = [KinkyDungeonKeybindings.Wait]; + KinkyDungeonKeySkip = [KinkyDungeonKeybindings.Skip]; + KinkyDungeonKeyWeapon = [KinkyDungeonKeybindings.SpellWeapon]; // 8 (57) + KinkyDungeonKeyMenu = [ + KinkyDungeonKeybindings.QInventory, + KinkyDungeonKeybindings.Inventory, + KinkyDungeonKeybindings.Reputation, + KinkyDungeonKeybindings.Magic, + KinkyDungeonKeybindings.Log, + KinkyDungeonKeybindings.Quest, + KinkyDungeonKeybindings.Collection, + KinkyDungeonKeybindings.Facilities, + KinkyDungeonKeybindings.Restart, + KinkyDungeonKeybindings.JourneyMap, + ]; + KinkyDungeonKeyToggle = [ + KinkyDungeonKeybindings.MsgLog, + KinkyDungeonKeybindings.Pass, + KinkyDungeonKeybindings.Door, + KinkyDungeonKeybindings.AStruggle, + KinkyDungeonKeybindings.APathfind, + KinkyDungeonKeybindings.AInspect, + KinkyDungeonKeybindings.WaitInterrupt, + KinkyDungeonKeybindings.MakeNoise, + KinkyDungeonKeybindings.PlaySelf, + KinkyDungeonKeybindings.Crouch, + KinkyDungeonKeybindings.BulletTransparency, + ]; + + KinkyDungeonKeyMap = [KinkyDungeonKeybindings.Map, KinkyDungeonKeybindings.ZoomOut, KinkyDungeonKeybindings.ZoomIn]; + KinkyDungeonKeyEnter = [KinkyDungeonKeybindings.Enter]; + KinkyDungeonKeySpellPage = [KinkyDungeonKeybindings.SpellPage]; + KinkyDungeonKeySwitchWeapon = [KinkyDungeonKeybindings.SwitchWeapon, KinkyDungeonKeybindings.SwitchWeaponOffhand, KinkyDungeonKeybindings.SwitchWeaponOffhandPrevious, KinkyDungeonKeybindings.SwitchWeaponOffhandPrevious2]; + KinkyDungeonKeySprint = [KinkyDungeonKeybindings.Sprint]; + KinkyDungeonKeySwitchLoadout = [KinkyDungeonKeybindings.SwitchLoadout1, KinkyDungeonKeybindings.SwitchLoadout2, KinkyDungeonKeybindings.SwitchLoadout3]; + + KinkyDungeonGameKey.KEY_WAIT = (KinkyDungeonKeybindings.Wait); + KinkyDungeonGameKey.KEY_SKIP = (KinkyDungeonKeybindings.Skip); +} + +let afterLoaded = false; + +let KDGameSaveDBStoreName = "KinkyDungeonSave"; + +/** + * Open a new database if it doesn't exist and give a db object that automatically increments when modifying stuff. + * Returns a thenable with the database once it's open. + */ +function KinkyDungeonDBOpen(): Promise { + // Return a promise so we can guarantee the db is open! + return new Promise((res, _rej) => { + // Open the KinkyDungeonSave DB, creating one if it doesn't already exist. + const request = indexedDB.open(KDGameSaveDBStoreName); // Open without a version parameter to get the most current version. + let db: IDBDatabase; + + // Whenever an update is made, increment the version number. + request.onupgradeneeded = (event: IDBVersionChangeEvent) => { + // @ts-ignore + db = event.target.result; + if (!db.objectStoreNames.contains(KDGameSaveDBStoreName)) { + db.createObjectStore(KDGameSaveDBStoreName, { autoIncrement: true }); + } + }; + + // Return the event results when it's successful + request.onsuccess = (event: Event) => { + db = (event.target as IDBOpenDBRequest).result; + + // Give back a db object so we can manipulate it. + res(db); + }; + + // Throw an error if it breaks + request.onerror = (event: Event) => { + console.error("IndexedDB error"); + console.log(event); + res(db); + }; + }); +} + +/** + * Save a game to the database. + */ +function KinkyDungeonDBSave(saveslot: number, gamecode?: string) { + let save: string = undefined; + if (saveslot == undefined) { + console.error("Save slot is not defined"); + return; // This is an invalid call or the save slot has not been set. + } + if (gamecode == undefined) { + // We are going to use the current game state as a save code. + save = LZString.compressToBase64(JSON.stringify(KinkyDungeonGenerateSaveData())); + } + else { + save = gamecode; + } + + // Get the savegame database + KinkyDungeonDBOpen().then((db) => { + // Create a transaction + const transaction = db.transaction(KDGameSaveDBStoreName, "readwrite"); + const store = transaction.objectStore(KDGameSaveDBStoreName); + const data = { content: save }; + const request = store.put(data, `save_${saveslot}`); + + request.onsuccess = () => { + console.log(`Game saved to save_${saveslot}`, request.result); + }; + request.onerror = () => { + console.error("Could not add data to the store"); + }; + transaction.oncomplete = () => { + db.close(); + return true; + }; + }); +} + +/** + * Load a game from the database - Returns a thenable with the gamedata string, false if nothing loaded. + */ +function KinkyDungeonDBLoad(saveslot: number): Promise { + return new Promise((res, _rej) => { + if (saveslot == undefined) { + console.error("Save slot is not defined"); + return; // This is an invalid call or the save slot has not been set. + } + + // Get the savegame database + KinkyDungeonDBOpen().then((db) => { + // Create a transaction + const transaction = db.transaction(KDGameSaveDBStoreName, "readonly"); + const store = transaction.objectStore(KDGameSaveDBStoreName); + const request = store.get(`save_${saveslot}`); + + request.onsuccess = () => { + if (request.result) { + console.log(`Successfully loaded save game in slot ${saveslot}`); + let outstring = Object.assign({}, request.result).content; + res(outstring); + } + else { + console.log(`Successfully loaded, but no save data present in slot ${saveslot}`); + res(null); + } + }; + request.onerror = () => { + console.error(`Could not fetch data in slot save_${saveslot}`); + res(null); + }; + }); + }); +} + +/** + * Delete a saved game in a slot. + */ +function KinkyDungeonDBDelete(saveslot: number) { + return new Promise((res, _rej) => { + if (saveslot == undefined) { + console.error("Save slot is not defined"); + return; // This is an invalid call or the save slot has not been set. + } + + // Get the savegame database + KinkyDungeonDBOpen().then((db) => { + // Create a transaction + const transaction = db.transaction(KDGameSaveDBStoreName, "readwrite"); + const store = transaction.objectStore(KDGameSaveDBStoreName); + const request = store.delete(`save_${saveslot}`); + + request.onsuccess = () => { + console.log(`Slot ${saveslot} deleted successfully`); + res(true); + }; + request.onerror = () => { + console.error(`Error deleting slot ${saveslot}`); + res(false); + }; + }); + }); +} + +let LoadMenuCurrentSave: string; +let LoadMenuCurrentSlot: number; +let loadedsaveslots: string[] = []; +let loadedcloudsaveslots: string[] = []; +let loadedsaveNames: string[] = []; +for (let i = 0; i < maxSaveSlots; i++) { + loadedsaveslots.push(null); + loadedsaveNames.push(""); +} + +let loadedSaveforPreview: KinkyDungeonSave = null; +let KDPreviewModel = null; +let KDSaveSlot = 1; + +// Moved these to text doc -Ada + +let ModelPreviewLoaded = false; +let KDDeleteSaveIndex = -1; +let KDUploadSaveIndex = null; +let KDLoadCloudGames = false; + +let KDSlot0 = ""; + +let KDCloudLogintype = undefined; +let KDCloudLogintoken = undefined; +let KDCloudLoginiv = undefined; +let KDDiscordLoginname = undefined; +let KDDiscordLoginpfp = undefined; + +// Load Menu function +function KDDrawLoadMenu() { + let YYstart = 140; + let YY = YYstart; + let YYd = 74; + YY = YYstart + 50; + YYd = 80; + let CombarXX = 520; + // Save slots buttons + DrawTextFitKD(TextGet("PlayGameWithCurrentCode"), 1250, YYstart - 70, 1000, "#ffffff", undefined, 40); + if (KDENABLEDISCORDSYNC) { + DrawButtonKDEx(TextGet("KDLocalSaves"), () => { + KDLoadCloudGames = false; + LoadMenuCurrentSlot = 0; + loadedSaveforPreview = null; + KDSaveSlot = null; + }, true, CombarXX + 50, YYstart - 5, 150, 45, TextGet("KDLocalSaves"), "#ffffff", undefined, "") + DrawButtonKDEx(TextGet("KDCloudSaves"), () => { + KDLoadCloudGames = true; + LoadMenuCurrentSlot = 0; + loadedSaveforPreview = null; + KDSaveSlot = null; + }, true, CombarXX + 210, YYstart - 5, 150, 45, TextGet("KDCloudSaves"), "#ffffff", undefined, "") + } + + if (!KDLoadCloudGames) { + for (let i = 1; i < 5; i++) { + let num = (i); + // Slot button + DrawButtonKDEx(TextGet("KDSaveSlotButton") + num, () => { + console.log("Pressed button for save slot " + num); + loadedSaveforPreview = null; + LoadMenuCurrentSlot = num; + LoadMenuCurrentSave = loadedsaveslots[num - 1]; + loadedSaveforPreview = KinkyDungeonLoadPreview(LoadMenuCurrentSave); + + let origSaveSlot = KDSaveSlot; + KDSaveSlot = num; + // @ts-ignore + if (!loadedSaveforPreview.invalid) { + // Dress the KDPreviewModel + ModelPreviewLoaded = false; + KinkyDungeonDressModelPreview(); + } + + KDConfirmDeleteSave = false; + + + return true; + }, true, CombarXX + 100, YY, 300, 64, TextGet("KDSaveSlotButton") + i, "#ffffff", ""); + // Selected arrow if the currently selected slot matches + if (num == LoadMenuCurrentSlot) { + DrawTextFitKD(`<--`, CombarXX + 430, YY + 35, 50, "#ffffff", undefined, 40); + } + // Delete button only if the slot has data + if (loadedsaveslots[num - 1]) { + DrawButtonKDEx("KDDeleteSlotButton" + i, (_b) => { + if (!KDConfirmDeleteSave || KDDeleteSaveIndex != num) { + KDConfirmDeleteSave = true; + KDDeleteSaveIndex = num; + } else { + KDConfirmDeleteSave = false; + KinkyDungeonDBDelete(num); + loadedsaveslots[num - 1] = null; + } + return true; + }, true, + CombarXX + 15 - ((KDDeleteSaveIndex == num && KDConfirmDeleteSave) ? 100 + (Math.random() < 0.5 ? -1 : 1) : 0), + YY - ((KDDeleteSaveIndex == num && KDConfirmDeleteSave) ? (Math.random() < 0.5 ? -1 : 1) : 0), + 64, 64, (KDDeleteSaveIndex == num && KDConfirmDeleteSave) ? "!" : "", "#ffffff", KinkyDungeonRootDirectory + "UI/X.png", + undefined, undefined, undefined, undefined, 36, true, { + centered: true, + }); + if ((KDDeleteSaveIndex == num && KDConfirmDeleteSave)) { + DrawTextFitKD( + TextGet("KDDelete"), + CombarXX + 42, + YY + 32, + 120, + "#ff5277", + ); + } + // @ts-ignore + } else if (LoadMenuCurrentSlot == -1 && loadedSaveforPreview && !loadedSaveforPreview?.invalid) { + // Import button + if ( + DrawButtonKDEx("KDImportSlotButton" + i, (_b) => { + if (!loadedsaveslots[num - 1]) { + loadedsaveslots[num - 1] = ElementValue("saveInputField"); + KinkyDungeonDBSave(num, newValue = loadedsaveslots[num - 1]); + LoadMenuCurrentSlot = num; + } + return true; + }, true, + CombarXX + 15, + YY, + 64, 64, "", "#ffffff", KinkyDungeonRootDirectory + "UI/Plus.png", + undefined, undefined, undefined, undefined, 36, undefined, { + centered: true, + }) + ) { + DrawTextFitKD( + TextGet("KDImport"), + CombarXX + 5, + YY + 32, + 300, + "#ffffff", + KDTextGray05, + 24, "right" + ); + } + } + YY += YYd; + } + } + else { + for (let i = 1; i < 3; i++) { + let num = (i); + DrawButtonKDEx(TextGet("KDSaveSlotButton") + num, () => { + // Slot button + console.log("Pressed button for save slot " + num); + loadedSaveforPreview = null; + LoadMenuCurrentSlot = num; + LoadMenuCurrentSave = loadedcloudsaveslots[num - 1]; + loadedSaveforPreview = KinkyDungeonLoadPreview(LoadMenuCurrentSave); + let origSaveSlot = KDSaveSlot; + KDSaveSlot = num; + // @ts-ignore + if (!loadedSaveforPreview.invalid) { + // Dress the KDPreviewModel + ModelPreviewLoaded = false; + KinkyDungeonDressModelPreview(); + } + KDConfirmDeleteSave = false; + KDConfirmUpload = false; + return true; + }, true, CombarXX + 160, YY, 240, 64, TextGet("KDSaveSlotButton") + i, "#ffffff", ""); + // Selected arrow if the currently selected slot matches + if (num == LoadMenuCurrentSlot) { + DrawTextFitKD(`<--`, CombarXX + 430, YY + 35, 50, "#ffffff", undefined, 40); + } + // Delete button only if the slot has data + if (loadedcloudsaveslots[num - 1]) { + DrawButtonKDEx("KDDeleteSlotButton" + i, (_b) => { + if (!KDConfirmDeleteSave || KDDeleteSaveIndex != num) { + KDConfirmDeleteSave = true; + KDDeleteSaveIndex = num; + } + else { + KDConfirmDeleteSave = false; + KinkyDungeonDBDelete(num * -1); + // @ts-ignore + localStorage.setItem(`KDCloudLastSync${i - 1}`, 10) + loadedcloudsaveslots[num - 1] = null; + } + return true; + }, true, CombarXX + 15 - ((KDDeleteSaveIndex == num && KDConfirmDeleteSave) ? 100 + (Math.random() < 0.5 ? -1 : 1) : 0), YY - ((KDDeleteSaveIndex == num && KDConfirmDeleteSave) ? (Math.random() < 0.5 ? -1 : 1) : 0), 64, 64, (KDDeleteSaveIndex == num && KDConfirmDeleteSave) ? "!" : "", "#ffffff", KinkyDungeonRootDirectory + "UI/X.png", undefined, undefined, undefined, undefined, 36, true, { + centered: true, + }); + if ((KDDeleteSaveIndex == num && KDConfirmDeleteSave)) { + DrawTextFitKD(TextGet("KDDelete"), CombarXX + 42, YY + 32, 120, "#ff5277"); + } + DrawButtonKDEx("KDUploadSlotButton" + i, (_b) => { + if (!KDConfirmUpload || KDUploadSaveIndex != num) { + KDConfirmUpload = true; + KDUploadSaveIndex = num; + } + else { + KDConfirmUpload = false; + KDSaveGameToCloud(num - 1); + } + return true; + }, true, CombarXX + 88 - ((KDUploadSaveIndex == num && KDConfirmUpload) ? + (Math.random() < 0.5 ? -1 : 1) : 0), YY - ((KDUploadSaveIndex == num && KDConfirmUpload) ? (Math.random() < 0.5 ? -1 : 1) : 0), 64, 64, (KDUploadSaveIndex == num && KDConfirmUpload) ? "!" : "", "#ffffff", KinkyDungeonRootDirectory + "UI/clouduploadicon.png", undefined, undefined, undefined, undefined, 36, true, { + centered: true, + }); + } + // @ts-ignore + else if (LoadMenuCurrentSlot == -1 && loadedSaveforPreview && !loadedSaveforPreview?.invalid) { + if (DrawButtonKDEx("KDImportSlotButtonCloud" + i, (_b) => { + if (!loadedcloudsaveslots[num - 1]) { + loadedcloudsaveslots[num - 1] = ElementValue("saveInputField"); + KinkyDungeonDBSave(num * -1, newValue = loadedcloudsaveslots[num - 1]); + LoadMenuCurrentSlot = num; + } + return true; + }, true, CombarXX + 15, YY, 64, 64, "", "#ffffff", KinkyDungeonRootDirectory + "UI/Plus.png", undefined, undefined, undefined, undefined, 36, undefined, { + centered: true, + })) { + DrawTextFitKD(TextGet("KDImport"), CombarXX + 5, YY + 32, 300, "#ffffff", KDTextGray05, 24, "right"); + } + } + YY += YYd; + } + // @ts-ignore + if ((KDCloudLogintoken != null) && (KDCloudLogintoken != undefined) && (KDCloudLogintoken != "null")) { + DrawTextFitKD(TextGet("KDDiscordSigninText"), CombarXX + 250, YY + 120, 240, "#ffffff", undefined, 40); + KDDraw(kdcanvas, kdpixisprites, "KDLoginPicture", KDDiscordLoginpfp, CombarXX + 45, YY + 85, 64, 64, undefined, { zIndex: 20 }) + KDDraw(kdcanvas, kdpixisprites, "KDLoginBorder", "Game/UI/circleborder.png", CombarXX + 45, YY + 85, 64, 64, undefined, { zIndex: 21 }) + + DrawButtonKDEx(TextGet("KDSyncFromCloudButton"), () => { + KDSyncCloudSaveGame(); + }, true, CombarXX + 15, YY, 385, 64, TextGet("KDSyncFromCloudButton"), "#ffffff", undefined, "") + } + else { // Draw a login button so they can login! + DrawButtonKDEx(TextGet("KDLoginButton"), () => { + KDLoginDiscord(); + }, true, CombarXX + 70, YY + 85, 280, 75, TextGet("KDLoginButton"), "#ffffff", undefined, "") + } + YY += YYd; + YY += YYd; + } + // Pastebox for code + ElementPosition("saveInputField", CombarXX + 215, YY + 165, 400, 300); + let newValue = ElementValue("saveInputField"); + // Load from Code button + DrawButtonKDEx("LoadFromCodeButton", () => { + KinkyDungeonKeybindingsTemp = Object.assign({}, KinkyDungeonKeybindingsTemp); + LoadMenuCurrentSlot = undefined; + if (newValue) { + loadedSaveforPreview = KinkyDungeonLoadPreview(newValue); + if (loadedSaveforPreview) LoadMenuCurrentSlot = -1; + } else if (KDSlot0) { + loadedSaveforPreview = KinkyDungeonLoadPreview(KDSlot0); + if (loadedSaveforPreview) LoadMenuCurrentSlot = 0; + LoadMenuCurrentSave = KDSlot0; + } + else { + loadedSaveforPreview = null; + LoadMenuCurrentSlot = -1; + } + if (loadedSaveforPreview) { + LoadMenuCurrentSave = newValue ? newValue : KDSlot0; + + let origSaveSlot = KDSaveSlot; + KDSaveSlot = 0; + // @ts-ignore + if (!loadedSaveforPreview.invalid) { + // Dress the KDPreviewModel + ModelPreviewLoaded = false; + KinkyDungeonDressModelPreview(); + } + + } + return true; + }, true, CombarXX + 220, 880, 180, 64, + TextGet((!newValue && KDSlot0) ? + "LoadFromCodeButton0" : + "LoadFromCodeButton"), "#ffffff", ""); + // Load from File button + DrawButtonKDEx("LoadFromFileButton", () => { + getFileInput(KDLoadSave); + return true; + }, true, CombarXX + 20, 880, 180, 64, TextGet("LoadFromFileButton"), "#ffffff", ""); + // Draw Save Slot details display + FillRectKD(kdcanvas, kdpixisprites, "maintogglebg", { + Left: CombarXX + 500, + Top: YYstart - 10, + Width: 900, + Height: 700, + Color: "#000000", + LineWidth: 1, + zIndex: -19, + alpha: 0.3 + }); + DrawRectKD(kdcanvas, kdpixisprites, "maintogglebg2", { + Left: CombarXX + 500, + Top: YYstart - 10, + Width: 900, + Height: 700, + Color: "#000000", + LineWidth: 1, + zIndex: -19, + alpha: 0.9 + }); + // Save Slot Text + if (LoadMenuCurrentSlot == -1) { + DrawTextFitKD(TextGet("KDSaveFromCode"), CombarXX + 680, YYstart + 40, 400, "#ffffff", undefined, 40); + DrawTextFitKD(`<--`, CombarXX + 430, YY + 180, 50, "#ffffff", undefined, 40); + } + else if (LoadMenuCurrentSlot != undefined) { + DrawTextFitKD(`${TextGet("KDSaveSlotButton")}${LoadMenuCurrentSlot}`, CombarXX + 680, YYstart + 40, 400, "#ffffff", undefined, 40); + } + if (loadedSaveforPreview?.KDGameData) { + // Player Name and Class + DrawTextFitKD(loadedSaveforPreview.KDGameData.PlayerName, CombarXX + 680, YYstart + 630, 400, "#ffffff", undefined, 40); + if (loadedSaveforPreview.KDGameData.Class) + DrawTextFitKD( + TextGet("KinkyDungeonStatMC_" + loadedSaveforPreview.KDGameData.Class), + CombarXX + 680, YYstart + 665, 400, "#ffffff", undefined, 28); + + // Player Paper Doll + if (ModelPreviewLoaded) { + if (KDCurrentModels.get(KDPreviewModel)) + DrawCharacter(KDPreviewModel, CombarXX + 530, YYstart + 35, 0.6, undefined, undefined, undefined, undefined, 100, true); + + } + // New Game Text + DrawTextFitKD(TextGet("KDSlotLocFormat") + .replace("FLR", "" + loadedSaveforPreview.level) + .replace("DGN", (loadedSaveforPreview.KDPersonalAlt + && loadedSaveforPreview.KDPersonalAlt[loadedSaveforPreview.KDGameData.RoomType]) ? + KDGetLairName(loadedSaveforPreview.KDGameData.RoomType) + : TextGet("DungeonName" + loadedSaveforPreview.checkpoint)) + + ((loadedSaveforPreview.npp > 0) ? TextGet("KDSlotLocNG") + .replace("AMNT", "" + loadedSaveforPreview.npp) : ""), CombarXX + 1100, YYstart + 40, 450, "#ffffff", undefined, 40); + + // Difficulty + let difficultytext = "KDHardMode0"; + if (loadedSaveforPreview.hardmode == true) { + difficultytext = "KDHardMode1"; + } + if (loadedSaveforPreview.extrememode == true) { + difficultytext = "KDHardMode2"; + } + DrawTextFitKD(`${TextGet("KDJourney" + (loadedSaveforPreview.journey || "None"))}${TextGet(difficultytext)}`, + CombarXX + 1100, YYstart + 90, 450, "#ffffff", undefined, 40); + + // Save Code Seed + DrawTextFitKD(TextGet("KDMapSeed") + `${loadedSaveforPreview.seed}`, CombarXX + 1100, YYstart + 140, 400, "#ffffff", undefined, 40); + + if (loadedSaveforPreview.saveStat?.version && TestMode) + DrawTextFitKD(loadedSaveforPreview.saveStat?.version, + CombarXX + 1100, YYstart + 170, 400, "#ffffff", undefined, 24); + + + + // Draw misc challenge settings + let challengeInfo = [""]; + let challengeheight = 0; + let challengeIndex = 0; + let challengeMaxPerRow = 2; + + challengeInfo[challengeheight] = challengeInfo[challengeIndex] + TextGet("KinkyDungeonSexyMode" + (loadedSaveforPreview.arousalMode ? "1" : "0")); + challengeIndex++; + + if (loadedSaveforPreview.random) { + if (challengeIndex >= challengeMaxPerRow) { + challengeheight++; + challengeInfo.push(""); + } + if (challengeInfo[challengeheight]) challengeInfo[challengeheight] = challengeInfo[challengeheight] + ", "; + challengeInfo[challengeheight] = challengeInfo[challengeheight] + TextGet("KinkyDungeonRandomMode1"); + challengeIndex++; + } + if (loadedSaveforPreview.savemode) { + if (challengeIndex >= challengeMaxPerRow) { + challengeheight++; + challengeInfo.push(""); + } + if (challengeInfo[challengeheight]) challengeInfo[challengeheight] = challengeInfo[challengeheight] + ", "; + challengeInfo[challengeheight] = challengeInfo[challengeheight] + TextGet("KinkyDungeonSaveMode" + (loadedSaveforPreview.savemode ? "1" : "0")); + challengeIndex++; + } + + for (let i = 0; i <= challengeheight; i++) { + DrawTextFitKD(challengeInfo[i], CombarXX + 1100, + YYstart + 260 - (challengeheight + 1) * 20 + i * 40, + 400, "#ffffff", undefined, 32); + } + + + + let itemOffset = 575; + // Gold Held by the Player + KDDraw(kdcanvas, kdpixisprites, "gold", KinkyDungeonRootDirectory + "Items/Gold.png", + CombarXX + 880, YYstart + itemOffset, 100, 100, undefined, { + zIndex: 90 + }); + DrawTextFitKD(`${loadedSaveforPreview.gold}`, CombarXX + 930, YYstart + itemOffset + 80, 200, "#ffffff", "#333333", + 24, undefined, 90); + + // Lockpicks held by the Player + KDDraw(kdcanvas, kdpixisprites, "picks", KinkyDungeonRootDirectory + "Items/Pick.png", + CombarXX + 970, YYstart + itemOffset, 100, 100, undefined, { + zIndex: 90 + }); + DrawTextFitKD(`${loadedSaveforPreview.picks}`, CombarXX + 1020, YYstart + itemOffset + 80, 200, "#ffffff", "#333333", + 24, undefined, 90); + + // Red Keys held by the Player + KDDraw(kdcanvas, kdpixisprites, "rkeys", KinkyDungeonRootDirectory + "Items/RedKey.png", + CombarXX + 1060, YYstart + itemOffset, 100, 100, undefined, { + zIndex: 90 + }); + DrawTextFitKD(`${loadedSaveforPreview.rkeys}`, CombarXX + 1110, YYstart + itemOffset + 80, 200, "#ffffff", "#333333", + 24, undefined, 90); + + // Blue Keys held by the Player + KDDraw(kdcanvas, kdpixisprites, "bkeys", KinkyDungeonRootDirectory + "Items/BlueKey.png", + CombarXX + 1150, YYstart + itemOffset, 100, 100, undefined, { + zIndex: 90 + }); + DrawTextFitKD(`${loadedSaveforPreview.bkeys}`, CombarXX + 1200, YYstart + itemOffset + 80, 200, "#ffffff", "#333333", + 24, undefined, 90); + + // Blue Keys held by the Player + KDDraw(kdcanvas, kdpixisprites, "MistressKeys", KinkyDungeonRootDirectory + "Items/MistressKey.png", + CombarXX + 1240, YYstart + itemOffset, 100, 100, undefined, { + zIndex: 90 + }); + DrawTextFitKD(`${loadedSaveforPreview.mistresskey}`, CombarXX + 1290, YYstart + itemOffset + 80, 200, "#ffffff", "#333333", + 24, undefined, 90); + + + let barOffset = itemOffset - 47; + + // Draw bars below the stat text. + let heightPerBar = 45; + let barwidth = 400; + let barborder = 2; + let offsetmult = 50; + let offsetcount = 0; + + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarSPBack`, { + Left: CombarXX + 900 + (offsetcount * offsetmult), + Top: barOffset + (offsetcount * offsetmult) - heightPerBar/2, + Width: barwidth, + Height: heightPerBar, + Color: "#0d0d0d", + LineWidth: 1, + zIndex: 57, + }); + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarSPBack2`, { + Left: CombarXX + 900 + (offsetcount * offsetmult) + barborder, + Top: barOffset + (offsetcount * offsetmult) + barborder - heightPerBar/2, + Width: barwidth - (barborder * 2), + Height: heightPerBar - (barborder * 2), + Color: "#283540", + LineWidth: 1, + zIndex: 58, + }); + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarSPBack3`, { + Left: CombarXX + 900 + (offsetcount * offsetmult) + barborder, + Top: barOffset + (offsetcount * offsetmult) + barborder - heightPerBar/2, + Width: Math.floor((barwidth - (barborder * 2)) * (Math.floor(loadedSaveforPreview.stamina * 10)) + / ((loadedSaveforPreview.KDGameData.StatMaxBonus?.SP + 10) * 10)), + Height: heightPerBar - (barborder * 2), + Color: "#4fd658", + LineWidth: 1, + zIndex: 59, + }); + + DrawTextFitKD(`Stamina: ${Math.floor(loadedSaveforPreview.stamina * 10)}/${(loadedSaveforPreview.KDGameData.StatMaxBonus?.SP + 10) * 10}`, + CombarXX + 1100, barOffset + (offsetcount * offsetmult), 400, "#ffffff", undefined, 32); + + // Stamina Potions Held by the Player + KDDraw(kdcanvas, kdpixisprites, "PotionStamina", KinkyDungeonRootDirectory + "UI/UsePotionStamina.png", + CombarXX + 1310, barOffset + (offsetcount * offsetmult) - 13, 44, 26, undefined, { + zIndex: 90 + }); + DrawTextFitKD(`${loadedSaveforPreview.potions.stamina}`, CombarXX + 1360, barOffset + (offsetcount * offsetmult), 200, "#ffffff", "#333333", + 24, undefined, 90); + + + offsetcount++; + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarMPBack`, { + Left: CombarXX + 900, + Top: barOffset + (offsetcount * offsetmult) - heightPerBar/2, + Width: barwidth, + Height: heightPerBar, + Color: "#0d0d0d", + LineWidth: 1, + zIndex: 57 + (offsetcount * 5), + }); + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarMPBack2`, { + Left: CombarXX + 900 + barborder, + Top: barOffset + (offsetcount * offsetmult) + barborder - heightPerBar/2, + Width: barwidth - (barborder * 2), + Height: heightPerBar - (barborder * 2), + Color: "#4fa4b8", + LineWidth: 1, + zIndex: 58 + (offsetcount * 5), + }); + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarMPBack3`, { + Left: CombarXX + 900 + barborder, + Top: barOffset + (offsetcount * offsetmult) + barborder - heightPerBar/2, + Width: Math.floor((barwidth - (barborder * 2)) * (Math.floor(loadedSaveforPreview.mana * 10)) + / ((loadedSaveforPreview.KDGameData.StatMaxBonus?.MP + 10) * 10)), + Height: heightPerBar - (barborder * 2), + Color: "#4c6885", + LineWidth: 1, + zIndex: 59 + (offsetcount * 5), + }); + + DrawTextFitKD(`Mana: ${Math.floor(loadedSaveforPreview.mana * 10)}/${(loadedSaveforPreview.KDGameData.StatMaxBonus?.MP + 10) * 10}`, + CombarXX + 1100, barOffset + (offsetcount * offsetmult), 400, "#ffffff", undefined, 32); + + // Mana Potions Held by the Player + KDDraw(kdcanvas, kdpixisprites, "PotionMana", KinkyDungeonRootDirectory + "UI/UsePotionMana.png", + CombarXX + 1310, barOffset + (offsetcount * offsetmult) - 13, 44, 26, undefined, { + zIndex: 90 + }); + DrawTextFitKD(`${loadedSaveforPreview.potions.mana}`, CombarXX + 1360, barOffset + (offsetcount * offsetmult), 200, "#ffffff", "#333333", + 24, undefined, 90); + + + offsetcount++; + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarWPBack`, { + Left: CombarXX + 900, + Top: barOffset + (offsetcount * offsetmult) - heightPerBar/2, + Width: barwidth, + Height: heightPerBar, + Color: "#0d0d0d", + LineWidth: 1, + zIndex: 57 + (offsetcount * 5), + }); + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarWPBack2`, { + Left: CombarXX + 900 + barborder, + Top: barOffset + (offsetcount * offsetmult) + barborder - heightPerBar/2, + Width: barwidth - (barborder * 2), + Height: heightPerBar - (barborder * 2), + Color: "#222222", + LineWidth: 1, + zIndex: 58 + (offsetcount * 5), + }); + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarWPBack3`, { + Left: CombarXX + 900 + barborder, + Top: barOffset + (offsetcount * offsetmult) + barborder - heightPerBar/2, + Width: Math.floor((barwidth - (barborder * 2)) * (Math.floor(loadedSaveforPreview.willpower * 10)) + / ((loadedSaveforPreview.KDGameData.StatMaxBonus?.WP + 10) * 10)), + Height: heightPerBar - (barborder * 2), + Color: "#ff4444", + LineWidth: 1, + zIndex: 59 + (offsetcount * 5), + }); + + DrawTextFitKD(`Willpower: ${Math.floor(loadedSaveforPreview.willpower * 10)}/${(loadedSaveforPreview.KDGameData.StatMaxBonus?.WP + 10) * 10}`, + CombarXX + 1100, barOffset + (offsetcount * offsetmult), 400, "#ffffff", undefined, 32); + + // Will Potions Held by the Player + KDDraw(kdcanvas, kdpixisprites, "PotionWill", KinkyDungeonRootDirectory + "UI/UsePotionWill.png", + CombarXX + 1310, barOffset + (offsetcount * offsetmult) - 13, 44, 26, undefined, { + zIndex: 90 + }); + DrawTextFitKD(`${loadedSaveforPreview.potions.will}`, CombarXX + 1360, barOffset + (offsetcount * offsetmult), 200, "#ffffff", "#333333", + 24, undefined, 90); + + + offsetcount++; + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarDPBack`, { + Left: CombarXX + 900, + Top: barOffset + (offsetcount * offsetmult) - heightPerBar/2, + Width: barwidth, + Height: heightPerBar, + Color: "#0d0d0d", + LineWidth: 1, + zIndex: 57 + (offsetcount * 5), + }); + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarDPBack2`, { + Left: CombarXX + 900 + barborder, + Top: barOffset + (offsetcount * offsetmult) + barborder - heightPerBar/2, + Width: barwidth - (barborder * 2), + Height: heightPerBar - (barborder * 2), + Color: "#692464", + LineWidth: 1, + zIndex: 58 + (offsetcount * 5), + }); + FillRectKD(kdcanvas, kdpixisprites, `KDPreviewBarDPBack3`, { + Left: CombarXX + 900 + barborder, + Top: barOffset + (offsetcount * offsetmult) + barborder - heightPerBar/2, + Width: Math.floor((barwidth - (barborder * 2)) * (Math.floor(loadedSaveforPreview.distraction * 10)) + / ((loadedSaveforPreview.KDGameData.StatMaxBonus?.AP + 10) * 10)), + Height: heightPerBar - (barborder * 2), + Color: "#ff5277", + LineWidth: 1, + zIndex: 59 + (offsetcount * 5), + }); + + DrawTextFitKD(`Distraction: ${Math.floor(loadedSaveforPreview.distraction * 10)}/${(loadedSaveforPreview.KDGameData.StatMaxBonus?.AP + 10) * 10}`, + CombarXX + 1100, barOffset + (offsetcount * offsetmult), 400, "#ffffff", undefined, 32); + + // Frigid Potions Held by the Player + KDDraw(kdcanvas, kdpixisprites, "PotionDistraction", KinkyDungeonRootDirectory + "UI/UsePotionFrigid.png", + CombarXX + 1310, barOffset + (offsetcount * offsetmult) - 13, 44, 26, undefined, { + zIndex: 90 + }); + DrawTextFitKD(`${loadedSaveforPreview.potions.dist}`, CombarXX + 1360, barOffset + (offsetcount * offsetmult), 200, "#ffffff", "#333333", + 24, undefined, 90); + + } + // @ts-ignore + else if (loadedSaveforPreview?.nodata) { + DrawTextFitKD(TextGet("KDNoData"), CombarXX + 1100, YYstart + 40, 450, "#ffffff", undefined, 40); + DrawTextFitKD(`?`, CombarXX + 680, YYstart + 350, 450, "#ffffff", undefined, 128); + // @ts-ignore + } else if (loadedSaveforPreview?.invalid) { + DrawTextFitKD(TextGet("KDInvalid"), CombarXX + 1100, YYstart + 40, 450, "#ffffff", undefined, 40); + DrawTextFitKD(`?`, CombarXX + 680, YYstart + 350, 450, "#ffffff", undefined, 128); + } + // Return to main menu + DrawButtonKDEx("KDBackOptions", () => { + KinkyDungeonKeybindingsTemp = Object.assign({}, KinkyDungeonKeybindingsTemp); + KinkyDungeonState = "Menu"; + ElementRemove("saveInputField"); + return true; + }, true, 975, 880, 550, 64, TextGet("GameReturnToMenuFromOptions"), "#ffffff", "", + undefined, undefined, undefined, undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySkip[0]), + hotkeyPress: KinkyDungeonKeySkip[0], + }); + // Play Game with current save data! + DrawButtonKDEx("KDLoadGame", () => { + if (LoadMenuCurrentSave != "") { + KinkyDungeonKeybindingsTemp = Object.assign({}, KinkyDungeonKeybindingsTemp); + KinkyDungeonNewGame = 0; + KDMapData.Grid = ""; + KinkyDungeonInitialize(1, true); + MiniGameKinkyDungeonCheckpoint = "grv"; + if (KinkyDungeonLoadGame(LoadMenuCurrentSave)) { + KDGenMapCallback = () => { + if (KDMapData.Grid == "") + KinkyDungeonCreateMap(KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)], + KDMapData.RoomType || "", KDMapData.MapMod || "", MiniGameKinkyDungeonLevel, false, true); + KinkyDungeonState = "Game"; + if (KinkyDungeonKeybindings) { + KDCommitKeybindings(); + } + KDModsAfterGameStart(); + return "Game"; + }; + KinkyDungeonState = "GenMap"; + + } + LoadMenuCurrentSave = undefined; + LoadMenuCurrentSlot = undefined; + ElementRemove("saveInputField"); + } + return true; + }, (((LoadMenuCurrentSave != undefined) && (LoadMenuCurrentSave != "")) ? true : false), 1570, 880, 350, 64, + + LoadMenuCurrentSlot > 0 ? TextGet("KDPlayWithSlot") + LoadMenuCurrentSlot + : TextGet("KDPlayWithoutSlot"), + (((LoadMenuCurrentSave != undefined) && (LoadMenuCurrentSave != "")) ? "#ffffff" : "#888888"), ""); +} + +function KDUpdateDiscordName() { + // Set login name + if ((KDDiscordLoginname != "null") && (KDDiscordLoginname != null)) { + addTextKey('KDDiscordSigninText', TextGet(`KDDiscordSigninText_loggedin`).replace("NAME", KDDiscordLoginname)) + } + else { + addTextKey('KDDiscordSigninText', TextGet(`KDDiscordSigninText_none`)) + } +} + +function KDLoginDiscord() { + let stateoutput = (localStorage.getItem('cloudsyncstate') != "null") ? localStorage.getItem('cloudsyncstate') : "no-id" + + if (stateoutput == "no-id") { + // @ts-ignore + localStorage.setItem('cloudsyncstate', Math.floor(Math.random() * Math.random() * (1000000000000 * Math.random()))) + stateoutput = localStorage.getItem('cloudsyncstate'); + // Clear the state value after 15 minutes, same as what the remote server respects. + setTimeout(() => { + localStorage.setItem('cloudsyncstate', null) + }, 900000) + } + + let req = new XMLHttpRequest() + console.log(`opening https://gettoken-830808080683.us-central1.run.app?state=${stateoutput}`) + req.open('GET', `https://gettoken-830808080683.us-central1.run.app?state=${stateoutput}`) + let resp = req.send() + + // Set up event listener for the request + req.onload = (data) => { + let respdata = undefined; + try { + // @ts-ignore + respdata = JSON.parse(data.target.response); + if (respdata.oauthlink) { + let childWindow = open(respdata.oauthlink); + let newinterval = setInterval(() => { + if (childWindow.closed) { + clearInterval(newinterval) + console.log(`Window was closed!`) + let reqnew = new XMLHttpRequest() + reqnew.open('GET', `https://gettoken-830808080683.us-central1.run.app?state=${stateoutput}`) + let respnew = reqnew.send() + + reqnew.onload = (data) => { + //if (data.statusCode == 201) { + console.log(data); + // @ts-ignore + let respdata = JSON.parse(data.target.response) + if (respdata.content) { + console.log(respdata.content) + } + else if (respdata.id != undefined) { + localStorage.setItem('KDDiscordLoginname', respdata.name); + localStorage.setItem('KDDiscordLoginpfp', respdata.pfp); + localStorage.setItem('KDCloudLogintoken', respdata.id); + localStorage.setItem('KDCloudLoginiv', respdata.iv); + localStorage.setItem('KDCloudLogintype', "Discord") + // @ts-ignore + localStorage.setItem('KDCloudLastLogin', Date.now()) // if this is older than 30 days, we'll invalidate on opening + KDDiscordLoginname = respdata.name + KDDiscordLoginpfp = respdata.pfp + KDCloudLogintoken = respdata.id + KDCloudLoginiv = respdata.iv + KDCloudLogintype = "Discord" + KDUpdateDiscordName() + } + //} + } + } + }, 100) + } + else { + // This shouldn't happen. + console.log("It happened.") + localStorage.setItem('KDDiscordLoginname', respdata.name); + localStorage.setItem('KDDiscordLoginpfp', respdata.pfp); + localStorage.setItem('KDCloudLogintoken', respdata.id); + localStorage.setItem('KDCloudLoginiv', respdata.iv); + localStorage.setItem('KDCloudLogintype', "Discord") + // @ts-ignore + localStorage.setItem('KDCloudLastLogin', Date.now()) // if this is older than 30 days, we'll invalidate on opening + KDDiscordLoginname = respdata.name + KDDiscordLoginpfp = respdata.pfp + KDCloudLogintoken = respdata.id + KDCloudLoginiv = respdata.iv + KDCloudLogintype = "Discord" + KDUpdateDiscordName() + } + } + catch (err) { + console.log(err); + } + } +} + +function KDLogoutDiscord() { + localStorage.setItem('KDDiscordLoginname', null); + localStorage.setItem('KDDiscordLoginpfp', null); + localStorage.setItem('KDCloudLogintoken', null); + localStorage.setItem('KDCloudLoginiv', null); + localStorage.setItem('KDCloudLogintype', null) + // @ts-ignore + localStorage.setItem('KDCloudLastLogin', Date.now()) // if this is older than 30 days, we'll invalidate on opening + KDCloudLogintype = localStorage.getItem('KDCloudLogintype') ? localStorage.getItem('KDCloudLogintype') : null + KDCloudLogintoken = localStorage.getItem('KDCloudLogintoken') ? localStorage.getItem('KDCloudLogintoken') : null + KDCloudLoginiv = localStorage.getItem('KDCloudLoginiv') ? localStorage.getItem('KDCloudLoginiv') : null + KDDiscordLoginname = localStorage.getItem('KDDiscordLoginname') ? localStorage.getItem('KDDiscordLoginname') : null + KDDiscordLoginpfp = localStorage.getItem('KDDiscordLoginpfp') ? localStorage.getItem('KDDiscordLoginpfp') : null + KDUpdateDiscordName() +} + +// Save data should be committed to the indexedDB by this point. We want to grab that. +function KDSaveGameToCloud(saveslot) { + let updateslot = ((saveslot * -1) - 1) // Should output -1 or -2, if we supply 0 or 1. + KinkyDungeonDBLoad(updateslot).then((res) => { + // res should be a save data string. Lets make sure it's not null. + try { + if (res) { + const url = `https://savegame-830808080683.us-central1.run.app?id=${KDCloudLogintoken}&iv=${KDCloudLoginiv}`; + + let jsonbody = JSON.stringify({ + saveslot: saveslot, + data: res + }) + + console.log(jsonbody) + + fetch(url, { + method: 'POST', + body: jsonbody, + headers: {} + }) + .then(response => response.json()) + .then(data => { + if (data.content) { // There was an error while saving + if (data.content == 'Data received and stored') { + console.log("Successfully saved") + KDSendMusicToast(TextGet("KDCloudSavedGameSuccess").replace("SLOTNUM", saveslot + 1)); + } + else { + console.log("Problem while saving") + console.log(data); + } + } + else { + console.log(data); + } + }) + .catch((err) => { + console.log(err) + }) + } + } + catch(err) { + console.log(err); + } + }) +} + +function KDSyncCloudSaveGame() { + for (let i = 0; i < 2; i++) { + try { + let updateslot = ((i * -1) - 1) // Should output -1 or -2, if we supply 0 or 1. + let KDCloudLastSync = localStorage.getItem(`KDCloudLastSync${i}`) ? localStorage.getItem(`KDCloudLastSync${i}`) : 0 + let lastsaveddate = (new Date(KDCloudLastSync)).valueOf() + + const url = `https://retrievegame-830808080683.us-central1.run.app?id=${KDCloudLogintoken}&iv=${KDCloudLoginiv}×tamp=${lastsaveddate}&saveslot=${i}`; + + fetch(url, { + method: 'GET', + //body: jsonbody, + headers: {} + }) + .then(response => response.json()) + .then(data => { + if (data.content) { + console.log(data); + } + else { // This should always be a save game with data and timestamp properties. + console.log(data); + KinkyDungeonDBSave(updateslot, data.data); + loadedcloudsaveslots[i] = data.data + localStorage.setItem(`KDCloudLastSync${i}`, data.timestamp) + } + }) + .catch((err) => { + console.log(err) + }) + } + catch(err) { + console.log(err); + } + } +} + +function KinkyDungeonDressModelPreview() { + return new Promise((res, _rej) => { + KDPreviewModel = Object.assign({}, JSON.parse(JSON.stringify(KinkyDungeonPlayer))); + KDPreviewModel.ID++; + CharacterNaked(KDPreviewModel); + KDNaked = true; + if (loadedSaveforPreview.saveStat?.appearance) { + KDPreviewModel.Appearance = JSON.parse(JSON.stringify(loadedSaveforPreview.saveStat.appearance)); + if (KDCurrentModels.get(KDPreviewModel)) + KDCurrentModels.get(KDPreviewModel).Poses = loadedSaveforPreview.saveStat.poses; + + UpdateModels(KDPreviewModel); + } + //CharacterAppearanceRestore(KDPreviewModel, DecompressB64(localStorage.getItem(`kinkydungeonappearance${KDCurrentOutfit}`))) + //setTimeout(() => { + DrawCharacter(KDPreviewModel, PIXIWidth, PIXIHeight, 0.1); + KDRefreshCharacter.set(KDPreviewModel, true); + KinkyDungeonDressPlayer(KDPreviewModel, false, true, undefined, + loadedSaveforPreview.inventoryarray.restraint, + KinkyDungeonUpdateRestraints(KDPreviewModel, 0, 0, + loadedSaveforPreview.inventoryarray.restraint), + KDToggles.ForcePalette ? KDDefaultPalette : undefined, true); + DrawCharacter(KDPreviewModel, PIXIWidth, PIXIHeight, 0.1); + ModelPreviewLoaded = true; + res(true); + //}, 50); + }); +} + +/** + * Generate Preview data function + */ +function KinkyDungeonLoadPreview(String: string): KinkyDungeonSave { + if (!String) { + return { + // @ts-ignore + nodata: true, + invalid: true, + }; + } + try { + let str: string = DecompressB64(String.trim()); + let returndata: KinkyDungeonSave = null; + + // We do a little JS witchery here + returndata = {} as KinkyDungeonSave; + + if (str) { + let saveData = JSON.parse(str); + if ( saveData + && saveData.spells != undefined + && saveData.level != undefined + && saveData.checkpoint != undefined + && saveData.inventory != undefined + && saveData.costs != undefined + && saveData.rep != undefined + && saveData.dress != undefined) + { + returndata.errorloading = false; + returndata.modsmissing = false; + + if (saveData.KinkyDungeonCurrentTick) returndata.KinkyDungeonCurrentTick = saveData.KinkyDungeonCurrentTick; + + // No need for this? + //if (saveData.flags && saveData.flags.length) returndata.flags = new Map(saveData.flags); + returndata.level = saveData.level; + if (Array.from(Object.keys(KinkyDungeonMapParams)).includes(saveData.checkpoint)) + returndata.checkpoint = saveData.checkpoint; + else returndata.checkpoint = "grv"; + //KinkyDungeonShrineCosts = saveData.costs; + //KinkyDungeonGoddessRep = saveData.rep; + returndata.dress = saveData.dress; + if (saveData.seed) returndata.seed = saveData.seed; + if (saveData.pcosts) returndata.pcosts = saveData.pcosts; + //if (saveData.choices) KinkyDungeonSpellChoices = saveData.choices; + //if (saveData.choices_wep) KinkyDungeonWeaponChoices = saveData.choices_wep; + //if (saveData.choices_arm) KinkyDungeonArmorChoices = saveData.choices_arm; + //if (saveData.choices_con) KinkyDungeonConsumableChoices = saveData.choices_con; + //if (saveData.choices2) KinkyDungeonSpellChoicesToggle = saveData.choices2; + //if (saveData.buffs) KinkyDungeonPlayerBuffs = saveData.buffs; + if (saveData.gold != undefined) returndata.gold = saveData.gold; + //if (saveData.id != undefined) KinkyDungeonEnemyID = saveData.id; + //if (saveData.idspell != undefined) KinkyDungeonSpellID = saveData.idspell; + if (saveData.points != undefined) returndata.points = saveData.points; + //if (saveData.lostitems != undefined) KinkyDungeonLostItems = saveData.lostitems; + if (saveData.rescued != undefined) returndata.rescued = saveData.rescued; + if (saveData.aid != undefined) returndata.aid = saveData.aid; + //if (saveData.KDCurrentWorldSlot) KDCurrentWorldSlot = saveData.KDCurrentWorldSlot; + + + // These are ignored for compatibility reasons + if (saveData.stats) { + if (saveData.stats.picks != undefined) returndata.picks = saveData.stats.picks; + if (saveData.stats.keys != undefined) returndata.rkeys = saveData.stats.keys; + if (saveData.stats.bkeys != undefined) returndata.bkeys = saveData.stats.bkeys; + if (saveData.stats.mana != undefined) returndata.mana = saveData.stats.mana; + if (saveData.stats.manapool != undefined) returndata.manapool = saveData.stats.manapool; + if (saveData.stats.stamina != undefined) returndata.stamina = saveData.stats.stamina; + if (saveData.stats.willpower != undefined) returndata.willpower = saveData.stats.willpower; + if (saveData.stats.distraction != undefined) returndata.distraction = saveData.stats.distraction; + if (saveData.stats.distractionlower != undefined) returndata.distractionlower = saveData.stats.distractionlower; + //if (saveData.stats.wep != undefined) KDSetWeapon(saveData.stats.wep); + if (saveData.stats.npp != undefined) returndata.npp = saveData.stats.npp; + + + //KDOrigStamina = KinkyDungeonStatStamina*10; + //KDOrigWill = KinkyDungeonStatWill*10; + //KDOrigMana = KinkyDungeonStatMana*10; + //KDOrigDistraction = KinkyDungeonStatDistraction*10; + } else { + if (saveData.picks != undefined) returndata.picks = saveData.picks; + if (saveData.rkeys != undefined) returndata.rkeys = saveData.rkeys; + if (saveData.bkeys != undefined) returndata.bkeys = saveData.bkeys; + if (saveData.mana != undefined) returndata.mana = saveData.mana; + if (saveData.manapool != undefined) returndata.manapool = saveData.manapool; + if (saveData.stamina != undefined) returndata.stamina = saveData.stamina; + if (saveData.willpower != undefined) returndata.willpower = saveData.willpower; + if (saveData.distraction != undefined) returndata.distraction = saveData.distraction; + if (saveData.distractionlower != undefined) returndata.distractionlower = saveData.distractionlower; + if (saveData.npp != undefined) returndata.npp = saveData.npp; + } + returndata.KDGameData = JSON.parse(JSON.stringify(KDGameDataBase)); + if (saveData.KDGameData != undefined) returndata.KDGameData = Object.assign({}, saveData.KDGameData); + + + //InitFacilities(); + + //KDEventData = JSON.parse(JSON.stringify(KDEventDataBase)); + //if (saveData.KDEventData != undefined) KDEventData = Object.assign({}, saveData.KDEventData); + if (saveData.inventoryVariants) returndata.inventoryVariants = saveData.inventoryVariants; + if (saveData.weaponVariants) returndata.weaponVariants = saveData.weaponVariants; + if (saveData.consumableVariants) returndata.consumableVariants = saveData.consumableVariants; + + if (saveData.statchoice != undefined) { + returndata.statchoice = saveData.statchoice; + let statsMap = new Map(returndata.statchoice); + + returndata.arousalMode = statsMap.get("arousalMode"); + returndata.itemMode = statsMap.get("itemMode") ? 1 : 0; + returndata.plug = statsMap.get("arousalModePlug"); + returndata.plugFront = statsMap.get("arousalModePlugNoFront"); + returndata.piercing = statsMap.get("arousalModePiercing"); + returndata.random = statsMap.get("randomMode"); + returndata.savemode = statsMap.get("saveMode"); + returndata.hardmode = statsMap.get("hardMode"); + returndata.extrememode = statsMap.get("extremeMode"); + //KinkyDungeonPerksMode = KinkyDungeonStatsChoice.get("perksMode"); + returndata.perksmode = statsMap.get("hardperksMode") ? 2 : (statsMap.get("perksMode") ? 1 : 0); + returndata.easymode = statsMap.get("norescueMode") ? 2 : (statsMap.get("easyMode") ? 1 : 0); + returndata.progressionmode = statsMap.get("escapekey") ? "Key" : statsMap.get("escaperandom") ? "Random" : statsMap.get("escapeselect") ? "Select" : "Key"; + + } + //if (saveData.uniqueHits != undefined) KDUniqueBulletHits = new Map(saveData.uniqueHits); + + + + + //if (saveData.faction != undefined) KinkyDungeonFactionRelations = saveData.faction; + //KDInitFactions(); + //if (typeof KDGameData.TimeSinceLastVibeStart === "number") KDGameData.TimeSinceLastVibeStart = {}; + //if (typeof KDGameData.TimeSinceLastVibeEnd === "number") KDGameData.TimeSinceLastVibeEnd = {}; + + //if (!KDGameData.AlreadyOpened) KDGameData.AlreadyOpened = []; + + //if (saveData.perks) { + //KDUnlockedPerks = saveData.perks; + //KDLoadPerks(); + //} + //KDUnlockPerk(); + let inventoryarray = { + consumable: [], + restraint: [], + looserestraint: [], + weapon: [], + outfit: [] + }; + + for (let item of saveData.inventory) { + try { + inventoryarray[item.type].push({ + name: item.name, + quantity: item.quantity, + id: item.id + }); + } + catch (err) { + console.log("Error adding item"); + console.log(item); + returndata.errorloading = true; + } + } + returndata.inventoryarray = inventoryarray; + returndata.outfitForPreview = []; + + // Now we have all the restraints in inventory, lets try to parse any variants for the paper doll preview. + inventoryarray.restraint.forEach((item) => { + let outputname = item.name; + // Check if the item name is on the inventory variants + if (returndata.inventoryVariants[item.name]) { + // Modify the item name in place + outputname = returndata.inventoryVariants[item.name].template; + } + // This should give us an array of base item names we can reference later. + returndata.outfitForPreview.push(outputname); + }); + + // Find out how many Mistress Keys the save has. + returndata.mistresskey = 0; + let mistresskeysobj = returndata.inventoryarray.consumable.find((item) => item.name === "MistressKey"); + if (mistresskeysobj != undefined) { + returndata.mistresskey = mistresskeysobj.quantity; + } + // Find out how many potions the save has. + returndata.potions = { + stamina: 0, + mana: 0, + will: 0, + dist: 0 + }; + let potionsstamina = returndata.inventoryarray.consumable.find((item) => item.name === "PotionStamina"); + if (potionsstamina != undefined) { + returndata.potions.stamina = potionsstamina.quantity; + } + let potionsmana = returndata.inventoryarray.consumable.find((item) => item.name === "PotionMana"); + if (potionsmana != undefined) { + returndata.potions.mana = potionsmana.quantity; + } + let potionswill = returndata.inventoryarray.consumable.find((item) => item.name === "PotionWill"); + if (potionswill != undefined) { + returndata.potions.will = potionswill.quantity; + } + let potionsdist = returndata.inventoryarray.consumable.find((item) => item.name === "PotionFrigid"); + if (potionsdist != undefined) { + returndata.potions.dist = potionsdist.quantity; + } + + returndata.journey = saveData.KDGameData.Journey; + + returndata.saveStat = saveData.saveStat; + + return returndata; + } + } + else { + return { + // @ts-ignore + invalid: true + }; + } + } + catch (err) { + console.log(err); + return { + // @ts-ignore + invalid: true + }; + } +} + +function KinkyDungeonStartNewGame(Load: boolean = false) { + KinkyDungeonSendEvent("beforeNewGame", {Load: Load}); + KinkyDungeonNewGame = 0; + let cp = KinkyDungeonMapIndex.grv; + KDUpdateHardMode(); + KinkyDungeonInitialize(1, Load); + MiniGameKinkyDungeonCheckpoint = "grv"; + KDMapData.Grid = ""; + if (Load) { + KinkyDungeonLoadGame(); + KDSendEvent('loadGame'); + } else { + KDSendEvent('newGame'); + KDGameData.RoomType = "JourneyFloor";//KinkyDungeonStatsChoice.get("easyMode") ? "ShopStart" : "JourneyFloor"; + KDSetWorldSlot(0, 0); + KDInitializeJourney(""); + + + + if (KDTileToTest) { + KinkyDungeonMapIndex.grv = cp; + } + + KDGameData.PlayerName = localStorage.getItem("PlayerName") || "Ada"; + KinkyDungeonPlayer.Name = KDGameData.PlayerName; + } + if (!KDMapData.Grid) { + KinkyDungeonCreateMap(KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)], "JourneyFloor", "", MiniGameKinkyDungeonLevel, false, Load); + KDInitPerks(); + } + KinkyDungeonState = "Game"; + + if (KinkyDungeonKeybindings) { + KDCommitKeybindings(); + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/StoneDoor_Close.ogg"); + + + + KDModsAfterGameStart(); + KinkyDungeonSendEvent("afterNewGame", {Load: Load}); +} + +function KDUpdatePlugSettings(evalHardMode: boolean) { + KinkyDungeonStatsChoice.set("arousalMode", KinkyDungeonSexyMode ? true : undefined); + KinkyDungeonStatsChoice.set("arousalModePlug", KinkyDungeonSexyPlug ? true : undefined); + KinkyDungeonStatsChoice.set("arousalModePlugNoFront", KinkyDungeonSexyPlugFront ? true : undefined); + KinkyDungeonStatsChoice.set("arousalModePiercing", KinkyDungeonSexyPiercing ? true : undefined); + + KinkyDungeonStatsChoice.set("randomMode", KinkyDungeonRandomMode ? true : undefined); + KinkyDungeonStatsChoice.set("itemMode", KinkyDungeonItemMode == 1 ? true : undefined); + KinkyDungeonStatsChoice.set("itemPartialMode", KinkyDungeonItemMode == 2 ? true : undefined); + KinkyDungeonStatsChoice.set("saveMode", KinkyDungeonSaveMode ? true : undefined); + KinkyDungeonStatsChoice.set("hardMode", KinkyDungeonHardMode ? true : undefined); + KinkyDungeonStatsChoice.set("extremeMode", KinkyDungeonExtremeMode ? true : undefined); + KinkyDungeonStatsChoice.set("hardperksMode", KinkyDungeonPerksMode == 2 ? true : undefined); + KinkyDungeonStatsChoice.set("vhardperksMode", KinkyDungeonPerksMode == 3 ? true : undefined); + KinkyDungeonStatsChoice.set("perksMode", KinkyDungeonPerksMode == 1 ? true : undefined); + KinkyDungeonStatsChoice.set("easyMode", KinkyDungeonEasyMode == 1 ? true : undefined); + KinkyDungeonStatsChoice.set("norescueMode", KinkyDungeonEasyMode == 2 ? true : undefined); + + KinkyDungeonStatsChoice.set("noperks", KinkyDungeonPerkProgressionMode == 0 ? true : undefined); + KinkyDungeonStatsChoice.set("perksmandatory", KinkyDungeonPerkProgressionMode >= 2 ? true : undefined); + KinkyDungeonStatsChoice.set("perksdebuff", KinkyDungeonPerkProgressionMode == 3 ? true : undefined); + KinkyDungeonStatsChoice.set("perkBondage", KinkyDungeonPerkBondageMode == 2 ? true : undefined); + KinkyDungeonStatsChoice.set("perkNoBondage", KinkyDungeonPerkBondageMode == 0 ? true : undefined); + + KinkyDungeonStatsChoice.set("hideperkbondage", KinkyDungeonPerkBondageVisMode == 0 ? true : undefined); + KinkyDungeonStatsChoice.set("partialhideperkbondage", KinkyDungeonPerkBondageVisMode == 1 ? true : undefined); + + KinkyDungeonStatsChoice.set("escapekey", KinkyDungeonProgressionMode == "Key" ? true : undefined); + KinkyDungeonStatsChoice.set("escaperandom", KinkyDungeonProgressionMode == "Random" ? true : undefined); + //KinkyDungeonStatsChoice.set("escapeselect", KinkyDungeonProgressionMode == "Select" ? true : undefined); + + + + if (KDClassReqs[KinkyDungeonClassMode] && !KDClassReqs[KinkyDungeonClassMode]()) { + // disable the class if we don't meet its requirements + KinkyDungeonClassMode = "Peasant"; + } + let classCount = Object.keys(KDClassStart).length; + for (let i = 0; i < classCount; i++) { + KinkyDungeonStatsChoice.set("classMode", KinkyDungeonClassMode == Object.keys(KDClassStart)[i] ? true : undefined); + } + + if (evalHardMode) { + KDUpdateHardMode(); + } +} + +/** Deprecated */ +function KDUpdateHardMode() { + //let points = KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice); + //KinkyDungeonStatsChoice.set("hardMode", points >= KDHardModeThresh ? true : undefined); +} + +let KDHardModeThresh = 10; +let KDAwaitingModLoad = false; + +function KinkyDungeonHandleClick() { + allowMusic = true; + KDLastForceRefresh = CommonTime() - KDLastForceRefreshInterval - 10; + if (KDAwaitingModLoad) return true; + if (KDProcessButtons()) return true; + + if (MouseIn(1885, 25, 90, 90) && (!KDPatched)) { + ElementRemove("saveDataField"); + ElementRemove("saveInputField"); + KinkyDungeonExit(); + return true; + } + if (KinkyDungeonState == "Credits") { + if (MouseIn(1870, 930, 110, 64)) { + KinkyDungeonState = "Menu"; + return true; + } + if (MouseIn(1730, 930, 110, 64)) { + if (KinkyDungeonCreditsPos < 1) KinkyDungeonCreditsPos += 1; + else KinkyDungeonCreditsPos = 0; + } + } if (KinkyDungeonState == "Patrons") { + if (MouseIn(1870, 930, 110, 64)) { + KinkyDungeonState = "Menu"; + return true; + } + } else if (KinkyDungeonState == "Journey") { + if (MouseIn(875, 350, 750, 64)) { + KDJourney = ""; + KinkyDungeonState = "Stats"; + return true; + } else if (MouseIn(875, 450, 750, 64)) { + KDJourney = "Random"; + KinkyDungeonState = "Stats"; + return true; + } else if (MouseIn(875, 550, 750, 64)) { + KDJourney = "Harder"; + KinkyDungeonState = "Stats"; + return true; + } else if (MouseIn(1075, 850, 350, 64)) { + KinkyDungeonState = "Menu"; + return true; + } + } else if (KinkyDungeonState == "Diff") { + + KDUpdatePlugSettings(true); + } else if (KinkyDungeonState == "Stats") { + + // Removed and moved to DrawButtonKDEx + } else if (KinkyDungeonState == "TileEditor") { + KDHandleTileEditor(); + } else if (KinkyDungeonState == "Load"){ + if (MouseIn(875, 750, 350, 64)) { + KinkyDungeonNewGame = 0; + KDMapData.Grid = ""; + if (!KDToggles.OverrideOutfit) + KinkyDungeonConfigAppearance = false; + KinkyDungeonInitialize(1, true); + MiniGameKinkyDungeonCheckpoint = "grv"; + if (KinkyDungeonLoadGame(ElementValue("saveInputField"))) { + KDSendEvent('loadGame'); + //KDInitializeJourney(KDJourney); + if (KDMapData.Grid == "") KinkyDungeonCreateMap(KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)], KDMapData.RoomType || "", KDMapData.MapMod || "", MiniGameKinkyDungeonLevel, false, true); + ElementRemove("saveInputField"); + KinkyDungeonState = "Game"; + + if (KinkyDungeonKeybindings) { + KDCommitKeybindings(); + } + KDModsAfterGameStart(); + } + return true; + } + } else if (KinkyDungeonState == "LoadOutfit"){ + let Char = KDSpeakerNPC || KinkyDungeonPlayer; + if (MouseIn(875, 750, 350, 64) && Char == KinkyDungeonPlayer) { + KDSaveCodeOutfit(Char); + CharacterReleaseTotal(Char); + if (Char == KinkyDungeonPlayer) + KinkyDungeonDressSet(); + KDRefreshCharacter.set(Char, true); + KinkyDungeonDressPlayer(Char, true); + KinkyDungeonState = "Wardrobe"; + KDCanRevertFlag = false; + //KDWardrobeCallback = null; + //KDWardrobeRevertCallback = null; + + // Return to menu + ElementRemove("saveInputField"); + return true; + } else if (MouseIn(1275, 750, 350, 64)) { + if (StandalonePatched) { + KDRestoreOutfit(); + KinkyDungeonState = "Wardrobe"; + KDCanRevertFlag = false; + KDWardrobeCallback = null; + KDWardrobeRevertCallback = null; + } else { + KinkyDungeonState = "Menu"; + } + ElementRemove("saveInputField"); + return true; + } + } else if (KinkyDungeonState == "Consent") { + return true; + } else if (KinkyDungeonState == "Menu" || KinkyDungeonState == "Lose") { + + if (KDSaveBusy) { + // Nothing! + } else { + + if (MouseIn(1700, 25, 64, 64)) { + KDToggles.Sound = !KDToggles.Sound; + KDSaveToggles(); + } + + if (MouseIn(1100, 150, 100, 100)) { + TestMode = !TestMode; + } + + if (MouseIn(1700, 874, 280, 50)) { + let langIndex = KDLanguages.indexOf(localStorage.getItem("BondageClubLanguage")) || 0; + let newIndex = (langIndex + 1) % KDLanguages.length; + localStorage.setItem("BondageClubLanguage", KDLanguages[newIndex]); + localStorage.setItem("LanguageChange","1") + KDRestart = true; + return true; + } + + if (MouseIn(1850, 930, 135, 64)) { + KinkyDungeonState = "Credits"; + return true; + } + if (MouseIn(1700, 930, 135, 64)) { + KinkyDungeonState = "Patrons"; + return true; + } + } + + } else if (KinkyDungeonState == "Save") { + if (!KinkyDungeonIsPlayer()) KinkyDungeonState = "Game"; + if (MouseIn(1075, 750, 350, 64)) { + KinkyDungeonState = "Game"; + ElementRemove("saveDataField"); + return true; + } + } else if (KinkyDungeonState == "Game") { + if (KinkyDungeonIsPlayer()) KinkyDungeonClickGame(); + } else if (KinkyDungeonState == "Keybindings") { + // Replaced by DrawButtonKDEx + } else if (KinkyDungeonState == "Toggles") { + let YYstart = 60; + let YY = YYstart; + let YYd = 54; + + YY = YYstart + 50; + YYd = 80; + + let CombarXX = 550; + + if (KDToggleTab == "Main") { + if (StandalonePatched) { + if (MouseIn(CombarXX, YY, 350, 64)) { + if (MouseX <= CombarXX + 350/2) KDResolutionListIndex = (KDResolutionList.length + KDResolutionListIndex - 1) % KDResolutionList.length; + else KDResolutionListIndex = (KDResolutionListIndex + 1) % KDResolutionList.length; + KDResolution = KDResolutionList[KDResolutionListIndex]; + KDResolutionConfirm = true; + localStorage.setItem("KDResolution", "" + KDResolutionListIndex); + } + YY += YYd; + if (MouseIn(CombarXX, YY, 350, 64)) { + if (MouseX <= CombarXX + 350/2) KDGammaListIndex = (KDGammaList.length + KDGammaListIndex - 1) % KDGammaList.length; + else KDGammaListIndex = (KDGammaListIndex + 1) % KDGammaList.length; + KDGamma = KDGammaList[KDGammaListIndex] || 0; + localStorage.setItem("KDGamma", "" + KDGammaListIndex); + kdgammafilterstore[0] = KDGamma; + } + YY += YYd*2; + } + + if (MouseIn(CombarXX, YY, 350, 64)) { + if (MouseX <= CombarXX + 350/2) KDVibeVolumeListIndex = (KDVibeVolumeList.length + KDVibeVolumeListIndex - 1) % KDVibeVolumeList.length; + else KDVibeVolumeListIndex = (KDVibeVolumeListIndex + 1) % KDVibeVolumeList.length; + KDVibeVolume = KDVibeVolumeList[KDVibeVolumeListIndex]; + localStorage.setItem("KDVibeVolume", "" + KDVibeVolumeListIndex); + } + YY += YYd; + if (MouseIn(CombarXX, YY, 350, 64)) { + if (MouseX <= CombarXX + 350/2) KDMusicVolumeListIndex = (KDMusicVolumeList.length + KDMusicVolumeListIndex - 1) % KDMusicVolumeList.length; + else KDMusicVolumeListIndex = (KDMusicVolumeListIndex + 1) % KDMusicVolumeList.length; + KDMusicVolume = KDMusicVolumeList[KDMusicVolumeListIndex]; + localStorage.setItem("KDMusicVolume", "" + KDMusicVolumeListIndex); + } + YY += YYd; + if (MouseIn(CombarXX, YY, 350, 64)) { + if (MouseX <= CombarXX + 350/2) KDSfxVolumeListIndex = (KDSfxVolumeList.length + KDSfxVolumeListIndex - 1) % KDSfxVolumeList.length; + else KDSfxVolumeListIndex = (KDSfxVolumeListIndex + 1) % KDSfxVolumeList.length; + KDSfxVolume = KDSfxVolumeList[KDSfxVolumeListIndex]; + localStorage.setItem("KDSfxVolume", "" + KDSfxVolumeListIndex); + } + YY += YYd; + if (MouseIn(CombarXX, YY, 350, 64)) { + if (MouseX <= CombarXX + 350/2) KDAnimSpeedListIndex = (KDAnimSpeedList.length + KDAnimSpeedListIndex - 1) % KDAnimSpeedList.length; + else KDAnimSpeedListIndex = (KDAnimSpeedListIndex + 1) % KDAnimSpeedList.length; + KDAnimSpeed = KDAnimSpeedList[KDAnimSpeedListIndex] || 0; + localStorage.setItem("KDAnimSpeed", "" + KDAnimSpeedListIndex); + } + YY += YYd; + if (MouseIn(CombarXX, YY, 350, 64)) { + if (MouseX <= CombarXX + 350/2) KDSelectedFontListIndex = (KDSelectedFontList.length + KDSelectedFontListIndex - 1) % KDSelectedFontList.length; + else KDSelectedFontListIndex = (KDSelectedFontListIndex + 1) % KDSelectedFontList.length; + KDSelectedFont = KDFonts.get(KDSelectedFontList[KDSelectedFontListIndex])?.alias || KDFontName; + localStorage.setItem("KDSelectedFont", "" + KDSelectedFontListIndex); + } + YY += YYd; + if (MouseIn(CombarXX, YY, 350, 64)) { + if (MouseX <= CombarXX + 350/2) KDButtonFontListIndex = (KDButtonFontList.length + KDButtonFontListIndex - 1) % KDButtonFontList.length; + else KDButtonFontListIndex = (KDButtonFontListIndex + 1) % KDButtonFontList.length; + KDButtonFont = KDFonts.get(KDButtonFontList[KDButtonFontListIndex])?.alias || KDFontName; + localStorage.setItem("KDButtonFont", "" + KDButtonFontListIndex); + } + YY += YYd; + } + + + } else if (KinkyDungeonState == "End") { + if (MouseIn(1075, 650, 350, 64)) { + KinkyDungeonState = "Game"; + KinkyDungeonNewGamePlus(); + return true; + } if (MouseIn(1075, 750, 350, 64)) { + KinkyDungeonState = "Menu"; + return true; + } + } + + + return false; +} + +/** + * Handles clicks during the kinky dungeon game + */ +function KinkyDungeonClick(): void { + // +} + +function KDClick() { + //let origState = KinkyDungeonState; + //let origDrawState = KinkyDungeonDrawState; + if (KinkyDungeonState == "Logo") { + //KinkyDungeonState = "Consent"; + //KDLogoStartTime = CommonTime(); + return true; + } + else + if (KinkyDungeonState == "Intro") { + if (CommonTime() < KDLogoStartTime + KDLogoEndTime2) { + CommonTime(); // ... + FillRectKD(kdcanvas, kdpixisprites, "greyfade", { + Left: 0, Top: 0, Width: 2000, + Height: 1000, + Color: "#383F4F", alpha: Math.max(0, 1 - (CommonTime() - KDLogoStartTime) / KDLogoEndTime2), zIndex: 200 + }); + } + let currentProgress = KDIntroStage < KDIntroProgress.length ? KDIntroProgress[KDIntroStage] : 1; + if (currentProgress < 3) { + for (let i = 0; i <= KDIntroStage && i < KDIntroProgress.length; i++) { + KDIntroProgress[i] = 3; + } + + } + KDIntroStage += 1; + if (KDIntroStage > KDIntroProgress.length) { + KinkyDungeonState = "Menu"; + // Draw the PC for one + let Char = (KinkyDungeonState == "LoadOutfit" ? KDSpeakerNPC : null) || KinkyDungeonPlayer; + DrawCharacter(Char, 0, 0, .01, undefined, undefined, undefined, undefined, undefined, KinkyDungeonPlayer == Char ? KDToggles.FlipPlayer : false); + KDLogoStartTime = CommonTime(); + } + else if (KDIntroStage < KDIntroProgress.length) { + KDIntroProgress[KDIntroStage] = -0.33; // UI delay + } + else + KDIntroProgress[KDIntroStage - 1] = 4; // UI delay + } else + if (KinkyDungeonHandleClick()) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + } + if (KinkyDungeonReplaceConfirm > 0) KinkyDungeonReplaceConfirm -= 1; + + //if (origState != KinkyDungeonState || origDrawState != origDrawState) { + lastGlobalRefresh = CommonTime() - GlobalRefreshInterval + 100; + //} +} + +/** + * Handles exit during the kinky dungeon game + */ +function KinkyDungeonExit(): void { + KinkyDungeonGameKey.removeKeyListener(); + CommonDynamicFunction(MiniGameReturnFunction + "()"); + + // Refresh the player character if needed + if (ArcadeDeviousChallenge && KinkyDungeonPlayerNeedsRefresh) { + if (ServerPlayerIsInChatRoom()) { + ChatRoomCharacterUpdate(DefaultPlayer); + } else { + CharacterRefresh(DefaultPlayer); + } + } + + if (CharacterAppearancePreviousEmoticon) { + CharacterSetFacialExpression(DefaultPlayer, "Emoticon", CharacterAppearancePreviousEmoticon); + CharacterAppearancePreviousEmoticon = ""; + } + + if (MiniGameKinkyDungeonLevel > Math.max(KinkyDungeonRep, ReputationGet("Gaming")) || Math.max(KinkyDungeonRep, ReputationGet("Gaming")) > KinkyDungeonMaxLevel) { + KinkyDungeonRep = Math.max(KinkyDungeonRep, MiniGameKinkyDungeonLevel); + DialogSetReputation("Gaming", KinkyDungeonRep); + } + + if (CurrentScreen == "ChatRoom" && KinkyDungeonState != "Menu" && KDLose) { + let Dictionary = [ + { Tag: "SourceCharacter", Text: CharacterNickname(DefaultPlayer), MemberNumber: DefaultPlayer.MemberNumber }, + { Tag: "KinkyDungeonLevel", Text: String(MiniGameKinkyDungeonLevel)}, + ]; + ChatRoomPublishCustomAction("KinkyDungeonLose", false, Dictionary); + } + CharacterRefresh(DefaultPlayer, true); + + KinkyDungeonTeardownCrashHandler(); +} + + + + +/** + * Handles key presses during the mini game. (Both keyboard and mobile) + */ +function KinkyDungeonKeyDown(): void { + // n/a +} + + + +let mouseDown = false; +let MouseClicked = false; + +window.addEventListener('click', function(event) { + MouseMove(event); + if (!CommonIsMobile || !MouseClicked) { + //let touch = event.touches[0]; + KDClick(); + } + MouseClicked = true; + mouseDown = false; + //CommonClick(event); +}); +window.addEventListener('mousedown', function() { + mouseDown = true; + if (!CommonIsMobile) + MouseClicked = true; +}); +window.addEventListener('touchstart', function(event) { + MouseClicked = true; + if (CommonIsMobile) { + let touch = event.touches[0]; + if (PIXICanvas) { + MouseX = Math.round((touch.pageX - PIXICanvas.offsetLeft) * 2000 / PIXICanvas.clientWidth); + MouseY = Math.round((touch.pageY - PIXICanvas.offsetTop) * 1000 / PIXICanvas.clientHeight); + } else if (MainCanvas) { + MouseX = Math.round((touch.pageX - MainCanvas.canvas.offsetLeft) * 2000 / MainCanvas.canvas.clientWidth); + MouseY = Math.round((touch.pageY - MainCanvas.canvas.offsetTop) * 1000 / MainCanvas.canvas.clientHeight); + } + //CommonClick(event); + CommonTouchList = event.touches; + mouseDown = true; + MouseClicked = false; + } +}); + +window.addEventListener('touchmove', function(event) { + let touch = event.touches[0]; + let startedInPlayableArea = KDMouseInPlayableArea(); + if (PIXICanvas) { + MouseX = Math.round((touch.pageX - PIXICanvas.offsetLeft) * 2000 / PIXICanvas.clientWidth); + MouseY = Math.round((touch.pageY - PIXICanvas.offsetTop) * 1000 / PIXICanvas.clientHeight); + } else if (MainCanvas) { + MouseX = Math.round((touch.pageX - MainCanvas.canvas.offsetLeft) * 2000 / MainCanvas.canvas.clientWidth); + MouseY = Math.round((touch.pageY - MainCanvas.canvas.offsetTop) * 1000 / MainCanvas.canvas.clientHeight); + } + if ((startedInPlayableArea && !KDMouseInPlayableArea() && !KinkyDungeonTargetingSpell) || (!startedInPlayableArea && KDMouseInPlayableArea())) { + MouseClicked = true; // To prevent KDClick on end + } +}); +window.addEventListener('touchend', function(_event: TouchEvent) { + if (CommonIsMobile && mouseDown && !MouseClicked) { + KDClick(); + MouseClicked = true; + } else MouseClicked = false; +}); +window.addEventListener('mouseup', function() { + mouseDown = false; + if (!CommonIsMobile) + MouseClicked = false; +}); +window.addEventListener('wheel', function(event) { + KDMouseWheel(event); +}); + + +/** + * Game keyboard input handler object. Contains the functions and properties required to handle key press events. + * @constant + */ +let KinkyDungeonGameKey: any = { + keyPressed : [false, false, false, false, false, false, false, false, false], + + KEY_UP: 'KeyB', + KEY_DOWN: 'KeyV', + KEY_LEFT: 'KeyC', + KEY_RIGHT: 'KeyX', + KEY_UPLEFT: 'KeyC', + KEY_UPRIGHT: 'KeyB', + KEY_DOWNLEFT: 'KeyX', + KEY_DOWNRIGHT: 'KeyV', + KEY_WAIT: 'KeyV', + KEY_SKIP: 'KeyEnter', + + load : function(){ + KinkyDungeonGameKey.keyPressed = [false, false, false, false, false, false, false, false, false]; + KinkyDungeonGameKey.addKeyListener(); + }, + + addKeyListener : function () { + window.addEventListener('keydown', KinkyDungeonGameKey.keyDownEvent); + window.addEventListener('keyup', KinkyDungeonGameKey.keyUpEvent); + }, + removeKeyListener : function () { + window.removeEventListener('keydown', KinkyDungeonGameKey.keyDownEvent); + window.removeEventListener('keyup', KinkyDungeonGameKey.keyUpEvent); + }, + keyDownEvent : { + handleEvent : function (event: KeyboardEvent) { + let code = !(event.code.includes("Digit") || (event.key.length == 1 && event.code != "Space")) ? event.code : event.key.toUpperCase(); + if (!KDLastKeyTime[code] || (!code.includes("Shift") && event.shiftKey)) { + KinkyDungeonKeybindingCurrentKey = code; + KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime(); + } + switch(code){ + case KinkyDungeonGameKey.KEY_UP: + if(!KinkyDungeonGameKey.keyPressed[0]){ + KinkyDungeonGameKey.keyPressed[0] = true; + } + break; + case KinkyDungeonGameKey.KEY_DOWN: + if(!KinkyDungeonGameKey.keyPressed[1]){ + KinkyDungeonGameKey.keyPressed[1] = true; + } + break; + case KinkyDungeonGameKey.KEY_LEFT: + if(!KinkyDungeonGameKey.keyPressed[2]){ + KinkyDungeonGameKey.keyPressed[2] = true; + } + break; + case KinkyDungeonGameKey.KEY_RIGHT: + if(!KinkyDungeonGameKey.keyPressed[3]){ + KinkyDungeonGameKey.keyPressed[3] = true; + } + break; + case KinkyDungeonGameKey.KEY_UPLEFT: + if(!KinkyDungeonGameKey.keyPressed[4]){ + KinkyDungeonGameKey.keyPressed[4] = true; + } + break; + case KinkyDungeonGameKey.KEY_UPRIGHT: + if(!KinkyDungeonGameKey.keyPressed[5]){ + KinkyDungeonGameKey.keyPressed[5] = true; + } + break; + case KinkyDungeonGameKey.KEY_DOWNLEFT: + if(!KinkyDungeonGameKey.keyPressed[6]){ + KinkyDungeonGameKey.keyPressed[6] = true; + } + break; + case KinkyDungeonGameKey.KEY_DOWNRIGHT: + if(!KinkyDungeonGameKey.keyPressed[7]){ + KinkyDungeonGameKey.keyPressed[7] = true; + } + break; + case KinkyDungeonGameKey.KEY_WAIT: + if(!KinkyDungeonGameKey.keyPressed[8]){ + KinkyDungeonGameKey.keyPressed[8] = true; + } + break; + case KinkyDungeonGameKey.KEY_SKIP: + if(!KinkyDungeonGameKey.keyPressed[9]){ + KinkyDungeonGameKey.keyPressed[9] = true; + KDConfirmDeleteSave = false; + } + break; + } + } + }, + keyUpEvent : { + handleEvent : function (event: KeyboardEvent) { + let code = !(event.code.includes("Digit") || (event.key.length == 1 && event.code != "Space")) ? event.code : event.key.toUpperCase(); + + KinkyDungeonKeybindingCurrentKeyRelease = code; + if (KinkyDungeonKeybindingCurrentKeyRelease) KinkyDungeonGameKeyUp(KDLastKeyTime[KinkyDungeonKeybindingCurrentKeyRelease]); + if (KDLastKeyTime[code]) delete KDLastKeyTime[code]; + KinkyDungeonKeybindingCurrentKeyRelease = ''; + switch(code){ + case KinkyDungeonGameKey.KEY_UP: + if (KinkyDungeonGameKey.keyPressed[0]) KinkyDungeonLastMoveTimerStart = 0; + KinkyDungeonGameKey.keyPressed[0] = false; + break; + case KinkyDungeonGameKey.KEY_DOWN: + if (KinkyDungeonGameKey.keyPressed[1]) KinkyDungeonLastMoveTimerStart = 0; + KinkyDungeonGameKey.keyPressed[1] = false; + break; + case KinkyDungeonGameKey.KEY_LEFT: + if (KinkyDungeonGameKey.keyPressed[2]) KinkyDungeonLastMoveTimerStart = 0; + KinkyDungeonGameKey.keyPressed[2] = false; + break; + case KinkyDungeonGameKey.KEY_RIGHT: + if (KinkyDungeonGameKey.keyPressed[3]) KinkyDungeonLastMoveTimerStart = 0; + KinkyDungeonGameKey.keyPressed[3] = false; + break; + case KinkyDungeonGameKey.KEY_UPLEFT: + if (KinkyDungeonGameKey.keyPressed[4]) KinkyDungeonLastMoveTimerStart = 0; + KinkyDungeonGameKey.keyPressed[4] = false; + break; + case KinkyDungeonGameKey.KEY_UPRIGHT: + if (KinkyDungeonGameKey.keyPressed[5]) KinkyDungeonLastMoveTimerStart = 0; + KinkyDungeonGameKey.keyPressed[5] = false; + break; + case KinkyDungeonGameKey.KEY_DOWNLEFT: + if (KinkyDungeonGameKey.keyPressed[6]) KinkyDungeonLastMoveTimerStart = 0; + KinkyDungeonGameKey.keyPressed[6] = false; + break; + case KinkyDungeonGameKey.KEY_DOWNRIGHT: + if (KinkyDungeonGameKey.keyPressed[7]) KinkyDungeonLastMoveTimerStart = 0; + KinkyDungeonGameKey.keyPressed[7] = false; + break; + case KinkyDungeonGameKey.KEY_WAIT: + if (KinkyDungeonGameKey.keyPressed[8]) KinkyDungeonLastMoveTimerStart = 0; + KinkyDungeonGameKey.keyPressed[8] = false; + break; + case KinkyDungeonGameKey.KEY_SKIP: + if (KinkyDungeonGameKey.keyPressed[9]) KinkyDungeonLastMoveTimerStart = 0; + KinkyDungeonGameKey.keyPressed[9] = false; + break; + } + + } + }, +}; + + + +/** + * Outputs a savegame + */ +function KinkyDungeonGenerateSaveData(): KinkyDungeonSave { + let save = {} as KinkyDungeonSave; + save.version = TextGet("KDVersionStr"); + save.level = MiniGameKinkyDungeonLevel; + save.checkpoint = MiniGameKinkyDungeonCheckpoint; + save.rep = KinkyDungeonGoddessRep; + save.costs = KinkyDungeonShrineCosts; + save.pcosts = KinkyDungeonPenanceCosts; + save.dress = KinkyDungeonCurrentDress; + save.gold = KinkyDungeonGold; + save.points = KinkyDungeonSpellPoints; + save.id = KinkyDungeonEnemyID; + save.idspell = KinkyDungeonSpellID; + save.choices = KinkyDungeonSpellChoices; + save.choices_wep = KinkyDungeonWeaponChoices; + save.choices_arm = KinkyDungeonArmorChoices; + save.choices_con = KinkyDungeonConsumableChoices; + save.choices2 = KinkyDungeonSpellChoicesToggle; + save.buffs = KinkyDungeonPlayerBuffs; + save.lostitems = KinkyDungeonLostItems; + save.rescued = KinkyDungeonRescued; + save.aid = KinkyDungeonAid; + save.seed = KinkyDungeonSeed; + save.statchoice = Array.from(KinkyDungeonStatsChoice); + //save.mapIndex = KinkyDungeonMapIndex; + + save.flags = Array.from(KinkyDungeonFlags); + save.KDCommanderRoles = Array.from(KDCommanderRoles); + save.faction = KinkyDungeonFactionRelations; + save.perks = KDUnlockedPerks; + save.inventoryVariants = KinkyDungeonRestraintVariants; + save.weaponVariants = KinkyDungeonWeaponVariants; + save.consumableVariants = KinkyDungeonConsumableVariants; + save.uniqueHits = Array.from(KDUniqueBulletHits); + + save.KinkyDungeonCurrentTick = KinkyDungeonCurrentTick; + + save.saveStat = { + version: TextGet("KDVersionStr"), + appearance: JSON.parse(JSON.stringify(KinkyDungeonPlayer.Appearance)), + default: JSON.parse(JSON.stringify(KDGetDressList().Default)), + poses: JSON.parse(JSON.stringify(KDCurrentModels.get(KinkyDungeonPlayer).Poses)), + Palette: KinkyDungeonPlayer.Palette, + + outfit: KDGameData.Outfit, + name: KDGameData.PlayerName, + level: MiniGameKinkyDungeonLevel, + sp: Math.round(KinkyDungeonStatStamina * 10) + '/' + KinkyDungeonStatStaminaMax * 10, + mp: Math.round(KinkyDungeonStatMana * 10) + '/' + KinkyDungeonStatManaMax * 10, + wp: Math.round(KinkyDungeonStatWill * 10) + '/' + KinkyDungeonStatWillMax * 10, + dp: Math.round(KinkyDungeonStatDistraction * 10) + '/' + KinkyDungeonStatDistractionMax * 10, + }; + + let spells = []; + let newInv: item[] = []; + + for (let inv of KinkyDungeonFullInventory()) { + let item = Object.assign({}, inv); + newInv.push(item); + } + + for (let spell of KinkyDungeonSpells) { + spells.push(spell.name); + } + + save.spells = spells; + save.inventory = newInv; + save.KDGameData = KDGameData; + KDMapData.RandomPathablePoints = {}; + save.KDMapData = KDMapData; + KinkyDungeonGenNavMap(); + save.KDEventData = KDEventData; + save.KDWorldMap = KDWorldMap; + save.KDCurrentWorldSlot = KDCurrentWorldSlot; + save.KinkyDungeonPlayerEntity = KinkyDungeonPlayerEntity; + + save.KDPersonalAlt = JSON.stringify(KDPersonalAlt); + save.KDPersistentNPCs = JSON.stringify(KDPersistentNPCs); + save.KDDeletedIDs = JSON.stringify(KDDeletedIDs); + + + save.picks = KinkyDungeonItemCount("Pick"); + save.rkeys = KinkyDungeonItemCount("RedKey"); + save.bkeys = KinkyDungeonItemCount("BlueKey"); + save.mana = KinkyDungeonStatMana; + save.manapool = KinkyDungeonStatManaPool; + save.stamina = KinkyDungeonStatStamina; + save.willpower = KinkyDungeonStatWill; + save.distraction = KinkyDungeonStatDistraction; + save.distractionlower = KinkyDungeonStatDistractionLower; + save.wep = KinkyDungeonPlayerWeapon; + save.npp = KinkyDungeonNewGame; + save.diff = KinkyDungeonStatsChoice.get("randomMode"); + + return save; +} + +let KDSaveQueue: KinkyDungeonSave[] = []; +let KDSaveBusy = false; + +function KinkyDungeonSaveGame(ToString: boolean = false): KinkyDungeonSave { + // Make a deep copy + let save = JSON.parse(JSON.stringify(KinkyDungeonGenerateSaveData())); + + if (!ToString) { + KDSaveQueue.push(save); + } + + return save; +} + + +let KDSaveTimeout = 600000; // 10 minutes +async function KinkyDungeonCompressSave(save: string): Promise { + if (window.Worker) { + let pp = new Promise(function (resolve, reject) { + const myWorker = new Worker("out/saveworker.js"); + myWorker.onmessage = function(e) { + console.log('Compressed data received from worker'); + resolve(e.data); + } + myWorker.postMessage(save); + console.log('Save message posted to worker'); + setTimeout(reject, KDSaveTimeout); // 10 min timeout + }); + return Promise.resolve(pp) + .then((v) => { + console.log('Yay'); + return v;}) + .catch((v) => { + console.log('Nay'); + return LZString.compressToBase64(save);}); + } else { + console.log('Your browser doesn\'t support web workers.'); + return LZString.compressToBase64(save); + } +} + +// N4IgNgpgbhYgXARgDQgMYAsJoNYAcB7ASwDsAXBABlQCcI8FQBxDAgZwvgFoBWakAAo0ibAiQg0EvfgBkIAQzJZJ8fgFkIZeXFWoASgTwQqqAOpEwO/gFFIAWwjk2JkAGExAKwCudFwElLLzYiMSoAX1Q0djJneGAIkAIaACNYgG0AXUisDnSskAATOjZYkAARCAAzeS8wClQAcwIwApdCUhiEAGZUSBgwWNBbCAcnBBQ3Tx9jJFQAsCCQknGEtiNLPNRSGHIkgE8ENNAokjYvO3lkyEYQEnkHBEECMiW1eTuQBIBHL3eXsgOSAixzEZwuVxmoDuD3gTxeYgAylo7KR5J9UD8/kQAStkCDTudLtc4rd7jM4UsAGLCBpEVrfX7kbGAxDAkAAdwUhGWJOh5IA0iQiJVjGE2cUyDR5B0bnzHmUvGgyAAVeRGOQNZwJF4NDBkcQlca9Ai4R7o0ASqUy3lk+WKlVqiCUiCaNTnOwHbVEXX6iCG2bgE04M1hDJhIA= +function KinkyDungeonLoadGame(String: string = "") { + localStorage.setItem('KDLastSaveSlot', "" + KDSaveSlot); + KinkyDungeonSendEvent("beforeLoadGame", {}); + let str = String ? DecompressB64(String.trim()) : + (localStorage.getItem('KinkyDungeonSave') ? DecompressB64(localStorage.getItem('KinkyDungeonSave')) + : (loadedsaveslots[KDSaveSlot-1] ? DecompressB64(loadedsaveslots[KDSaveSlot-1]) : "")); + if (str) { + let saveData: KinkyDungeonSave = JSON.parse(str); + if ( saveData + && saveData.spells != undefined + && saveData.level != undefined + && saveData.checkpoint != undefined + && saveData.inventory != undefined + && saveData.costs != undefined + && saveData.rep != undefined + && saveData.dress != undefined) + { + if (!KDToggles.OverrideOutfit && saveData.saveStat) { + if (saveData.saveStat.default) { + KDGetDressList().Default = saveData.saveStat.default; + } + KinkyDungeonPlayer.Palette = saveData.saveStat.Palette; + } + + KDPathfindingCacheFails = 0; + KDPathfindingCacheHits = 0; + KDPathCache = new Map(); + KDThoughtBubbles = new Map(); + + KDMapData.Entities = []; + KDCommanderRoles = new Map(); + KDUpdateEnemyCache = true; + if (saveData.flags && saveData.flags.length) KinkyDungeonFlags = new Map(saveData.flags); + MiniGameKinkyDungeonLevel = saveData.level; + if (Array.from(Object.keys(KinkyDungeonMapParams)).includes(saveData.checkpoint)) + MiniGameKinkyDungeonCheckpoint = saveData.checkpoint; + else MiniGameKinkyDungeonCheckpoint = "grv"; + KinkyDungeonShrineCosts = saveData.costs; + KinkyDungeonGoddessRep = saveData.rep; + KinkyDungeonCurrentDress = saveData.dress; + KDGameData.KinkyDungeonSpawnJailers = 0; + KDGameData.KinkyDungeonSpawnJailersMax = 0; + if (saveData.KinkyDungeonCurrentTick) KinkyDungeonCurrentTick = saveData.KinkyDungeonCurrentTick; + if (saveData.seed) KDsetSeed(saveData.seed); + if (saveData.pcosts) KinkyDungeonPenanceCosts = saveData.pcosts; + if (saveData.choices) KinkyDungeonSpellChoices = saveData.choices; + if (saveData.choices_wep) KinkyDungeonWeaponChoices = saveData.choices_wep; + if (saveData.choices_arm) KinkyDungeonArmorChoices = saveData.choices_arm; + if (saveData.choices_con) KinkyDungeonConsumableChoices = saveData.choices_con; + if (saveData.choices2) KinkyDungeonSpellChoicesToggle = saveData.choices2; + if (saveData.buffs) KinkyDungeonPlayerBuffs = saveData.buffs; + if (saveData.gold != undefined) KinkyDungeonGold = saveData.gold; + if (saveData.id != undefined) KinkyDungeonEnemyID = saveData.id; + if (saveData.idspell != undefined) KinkyDungeonSpellID = saveData.idspell; + if (saveData.points != undefined) KinkyDungeonSpellPoints = saveData.points; + if (saveData.lostitems != undefined) KinkyDungeonLostItems = saveData.lostitems; + if (saveData.rescued != undefined) KinkyDungeonRescued = saveData.rescued; + if (saveData.aid != undefined) KinkyDungeonAid = saveData.aid; + if (saveData.KDCurrentWorldSlot) KDCurrentWorldSlot = saveData.KDCurrentWorldSlot; + + + KDOrigStamina = KinkyDungeonStatStamina*10; + KDOrigWill = KinkyDungeonStatWill*10; + KDOrigMana = KinkyDungeonStatMana*10; + KDOrigDistraction = KinkyDungeonStatDistraction*10; + KDGameData = JSON.parse(JSON.stringify(KDGameDataBase)); + if (saveData.KDGameData != undefined) KDGameData = Object.assign({}, saveData.KDGameData); + + if (!KDGameData.NamesGenerated) KDGameData.NamesGenerated = {}; + if (!KDGameData.Containers) KDGameData.Containers = {}; + if (!KDGameData.NPCRestraints) KDGameData.NPCRestraints = {}; + + InitFacilities(); + + KDEventData = JSON.parse(JSON.stringify(KDEventDataBase)); + //@ts-ignore + if (saveData.KDEventData != undefined) KDEventData = Object.assign({}, saveData.KDEventData); + if (saveData.inventoryVariants) KinkyDungeonRestraintVariants = saveData.inventoryVariants; + if (saveData.weaponVariants) KinkyDungeonWeaponVariants = saveData.weaponVariants; + if (saveData.consumableVariants) KinkyDungeonConsumableVariants = saveData.consumableVariants; + + if (saveData.statchoice != undefined) KinkyDungeonStatsChoice = new Map(saveData.statchoice); + if (saveData.uniqueHits != undefined) KDUniqueBulletHits = new Map(saveData.uniqueHits); + + + KinkyDungeonSexyMode = KinkyDungeonStatsChoice.get("arousalMode"); + KinkyDungeonItemMode = KinkyDungeonStatsChoice.get("itemMode") ? 1 : 0; + KinkyDungeonSexyPlug = KinkyDungeonStatsChoice.get("arousalModePlug"); + KinkyDungeonSexyPlugFront = KinkyDungeonStatsChoice.get("arousalModePlugNoFront"); + KinkyDungeonSexyPiercing = KinkyDungeonStatsChoice.get("arousalModePiercing"); + KinkyDungeonRandomMode = KinkyDungeonStatsChoice.get("randomMode"); + KinkyDungeonSaveMode = KinkyDungeonStatsChoice.get("saveMode"); + KinkyDungeonHardMode = KinkyDungeonStatsChoice.get("hardMode"); + KinkyDungeonExtremeMode = KinkyDungeonStatsChoice.get("extremeMode"); + //KinkyDungeonPerksMode = KinkyDungeonStatsChoice.get("perksMode"); + KinkyDungeonPerksMode = KinkyDungeonStatsChoice.get("hardperksMode") ? 2 : (KinkyDungeonStatsChoice.get("perksMode") ? 1 : 0); + KinkyDungeonEasyMode = KinkyDungeonStatsChoice.get("norescueMode") ? 2 : (KinkyDungeonStatsChoice.get("easyMode") ? 1 : 0); + KinkyDungeonProgressionMode = KinkyDungeonStatsChoice.get("escapekey") ? "Key" : KinkyDungeonStatsChoice.get("escaperandom") ? "Random" : KinkyDungeonStatsChoice.get("escapeselect") ? "Select" : "Key"; + + + if (!KDToggles.OverrideOutfit && saveData.saveStat) { + if (saveData.saveStat.poses || saveData.saveStat.appearance || saveData.saveStat.default) { + KinkyDungeonPlayer.Appearance = JSON.parse(JSON.stringify(saveData.saveStat.appearance)); + KDGetDressList().Default = saveData.saveStat.default; + KDCurrentModels.get(KinkyDungeonPlayer).Poses = saveData.saveStat.poses; + KinkyDungeonPlayer.Palette = saveData.saveStat.Palette; + UpdateModels(KinkyDungeonPlayer); + } + } + if (saveData.stats) { + if (saveData.stats.mana != undefined) KinkyDungeonStatMana = saveData.stats.mana; + if (saveData.stats.manapool != undefined) KinkyDungeonStatManaPool = saveData.stats.manapool; + if (saveData.stats.stamina != undefined) KinkyDungeonStatStamina = saveData.stats.stamina; + if (saveData.stats.willpower != undefined) KinkyDungeonStatWill = saveData.stats.willpower; + if (saveData.stats.distraction != undefined) KinkyDungeonStatDistraction = saveData.stats.distraction; + if (saveData.stats.distractionlower != undefined) KinkyDungeonStatDistractionLower = saveData.stats.distractionlower; + if (saveData.stats.wep != undefined) KDSetWeapon(saveData.stats.wep); + if (saveData.stats.npp != undefined) KinkyDungeonNewGame = saveData.stats.npp; + } else { + + if (saveData.mana != undefined) KinkyDungeonStatMana = saveData.mana; + if (saveData.manapool != undefined) KinkyDungeonStatManaPool = saveData.manapool; + if (saveData.stamina != undefined) KinkyDungeonStatStamina = saveData.stamina; + if (saveData.willpower != undefined) KinkyDungeonStatWill = saveData.willpower; + if (saveData.distraction != undefined) KinkyDungeonStatDistraction = saveData.distraction; + if (saveData.distractionlower != undefined) KinkyDungeonStatDistractionLower = saveData.distractionlower; + if (saveData.wep != undefined) KDSetWeapon(saveData.wep); + if (saveData.npp != undefined) KinkyDungeonNewGame = saveData.npp; + } + + //@ts-ignore + if (saveData.faction != undefined) KinkyDungeonFactionRelations = saveData.faction; + KDInitFactions(); + if (typeof KDGameData.TimeSinceLastVibeStart === "number") KDGameData.TimeSinceLastVibeStart = {}; + if (typeof KDGameData.TimeSinceLastVibeEnd === "number") KDGameData.TimeSinceLastVibeEnd = {}; + + if (!KDGameData.AlreadyOpened) KDGameData.AlreadyOpened = []; + + if (saveData.perks) { + KDUnlockedPerks = saveData.perks; + KDLoadPerks(); + } + KDUnlockPerk(); + + KDInitInventory(); + + for (let item of saveData.inventory) { + if (item.type == Restraint) { + let restraint = KinkyDungeonGetRestraintByName(item.name); + if (restraint) { + KinkyDungeonAddRestraint(restraint, 0, true, item.lock, undefined, undefined, undefined, undefined, item.faction, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true); // Add the item + let createdrestraint = KinkyDungeonGetRestraintItem(restraint.Group); + if (createdrestraint) createdrestraint.lock = item.lock; // Lock if applicable + if (createdrestraint) createdrestraint.events = item.events; // events if applicable + if (item.dynamicLink) { + let host = item; + let link = item.dynamicLink; + while (link) { + if (!KinkyDungeonGetRestraintByName(link.name)) { + //host = link; do not chjange the host + link = link.dynamicLink; + host.dynamicLink = link; + } else { + host = link; + link = link.dynamicLink; + } + + } + } + KinkyDungeonInventoryAdd(item); + } + } else { + if (KDConsumable(item) != undefined || KDWeapon(item) != undefined || KDRestraint(item) != undefined || KDOutfit(item) != undefined) + KinkyDungeonInventoryAdd(item); + } + KDUpdateItemEventCache = true; + } + + if (saveData.stats) { + if (saveData.stats.picks != undefined && !KinkyDungeonItemCount("Pick")) + KDAddConsumable("Pick", saveData.stats.picks); + if (saveData.stats.keys != undefined && !KinkyDungeonItemCount("RedKey")) + KDAddConsumable("RedKey", saveData.stats.keys); + if (saveData.stats.bkeys != undefined && !KinkyDungeonItemCount("BlueKey")) + KDAddConsumable("BlueKey", saveData.stats.bkeys); + } else { + + if (saveData.picks != undefined && !KinkyDungeonItemCount("Pick")) + KDAddConsumable("Pick", saveData.picks); + if (saveData.rkeys != undefined && !KinkyDungeonItemCount("RedKey")) + KDAddConsumable("RedKey", saveData.rkeys); + if (saveData.bkeys != undefined && !KinkyDungeonItemCount("BlueKey")) + KDAddConsumable("BlueKey", saveData.bkeys); + } + + KinkyDungeonSpells = []; + KDRefreshSpellCache = true; + for (let spell of saveData.spells) { + let sp = KinkyDungeonFindSpell(spell); + if (sp) KDPushSpell(sp); + } + + if (KDHasSpell("BattleRhythm") && !KDHasSpell("FighterOffhand")) { + let sp = KinkyDungeonFindSpell("FighterOffhand"); + if (sp) KDPushSpell(sp); + } + KDMapData = undefined; + if (saveData.KDWorldMap) { + KDWorldMap = JSON.parse(JSON.stringify(saveData.KDWorldMap)); + if (saveData.KDCurrentWorldSlot) { + let slot = KDGetWorldMapLocation({ + x: saveData.KDCurrentWorldSlot.x, + y: saveData.KDCurrentWorldSlot.y, + }); + if (slot) { + let data = slot.data[KDGameData.RoomType]; + if (data) KDMapData = data; + } + } + } + if (saveData.KDPersistentNPCs) KDPersistentNPCs = JSON.parse(saveData.KDPersistentNPCs); + if (saveData.KDDeletedIDs) KDDeletedIDs = JSON.parse(saveData.KDDeletedIDs); + if (saveData.KDPersonalAlt) KDPersonalAlt = JSON.parse(saveData.KDPersonalAlt); + + if (saveData.KinkyDungeonPlayerEntity) KinkyDungeonPlayerEntity = saveData.KinkyDungeonPlayerEntity; + if (saveData.KDMapData) { + KDMapData = Object.assign(KDMapData || KDDefaultMapData(0, MiniGameKinkyDungeonLevel), + JSON.parse(JSON.stringify(saveData.KDMapData))); + if (!KDMapData.Traffic || KDMapData.Traffic.length == 0) KDGenerateBaseTraffic(); + KinkyDungeonGenNavMap(); + } else { + if (saveData.KinkyDungeonEffectTiles) KDMapData.EffectTiles = saveData.KinkyDungeonEffectTiles; + if (saveData.KinkyDungeonTiles) KDMapData.Tiles = saveData.KinkyDungeonTiles; + if (saveData.KinkyDungeonTilesSkin) KDMapData.TilesSkin = saveData.KinkyDungeonTilesSkin; + if (saveData.KinkyDungeonTilesMemory) KDMapData.TilesMemory = saveData.KinkyDungeonTilesMemory; + if (saveData.KinkyDungeonRandomPathablePoints) KDMapData.RandomPathablePoints = saveData.KinkyDungeonRandomPathablePoints; + if (saveData.KinkyDungeonRandomPathablePoints) RandomPathList = Object.values(saveData.KinkyDungeonRandomPathablePoints); + if (saveData.KinkyDungeonEntities) KDMapData.Entities = saveData.KinkyDungeonEntities; + if (saveData.KinkyDungeonBullets) KDMapData.Bullets = saveData.KinkyDungeonBullets; + if (saveData.KinkyDungeonStartPosition) KDMapData.StartPosition = saveData.KinkyDungeonStartPosition; + if (saveData.KinkyDungeonEndPosition) KDMapData.EndPosition = saveData.KinkyDungeonEndPosition; + if (saveData.KinkyDungeonGrid) { + KDMapData.Grid = saveData.KinkyDungeonGrid; + KDMapData.GridWidth = saveData.KinkyDungeonGridWidth; + KDMapData.GridHeight = saveData.KinkyDungeonGridHeight; + } + KinkyDungeonResetFog(); + if (saveData.KinkyDungeonFogGrid) KDMapData.FogGrid = saveData.KinkyDungeonFogGrid; + } + + KDUnPackEnemies(KDMapData); + for (let en of KDMapData.Entities) { + if (en.id == -1 || en.player) { + KinkyDungeonPlayerEntity = en; + } + } + KinkyDungeonLeashingEnemy(); + KinkyDungeonJailGuard(); + if (saveData.KDCommanderRoles) KDCommanderRoles = new Map(saveData.KDCommanderRoles); + + KDUpdateEnemyCache = true; + + // bandaids + if (KDWorldMap["0,0"]) + KDWorldMap["0,0"].main = "ShopStart"; + for (let enemy of KDMapData.Entities) { + if (enemy.buffs) { + for (let b of Object.keys(enemy.buffs)) { + if (!enemy.buffs[b]) { + delete enemy.buffs[b]; + } + } + } + } + + if (typeof KDGameData.PreviousWeapon == 'string') KDGameData.PreviousWeapon = ["Unarmed", "Unarmed", "Unarmed", "Unarmed"]; + + KinkyDungeonSetMaxStats(); + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KDNaked = false; + KinkyDungeonDressPlayer(); + KDRefresh = true; + KDUpdateEnemyCache = true; + if (KDGameData.Journey) + KDJourney = KDGameData.Journey; + //if (saveData.mapIndex && !saveData.mapIndex.length) KinkyDungeonMapIndex = saveData.mapIndex; + + if (!KDGameData.SlowMoveTurns) KDGameData.SlowMoveTurns = 0; + if (String) { + try { + localStorage.setItem('KinkyDungeonSave', String); + } catch (e) { + KDSendMusicToast(e.message, 0); + localStorage.setItem('KinkyDungeonSave', ""); + saveError = true; + } + } + + if (saveData.KDGameData && saveData.KDGameData.LastMapSeed) KDsetSeed(saveData.KDGameData.LastMapSeed); + + if (!KinkyDungeonMapIndex.grv || !KDGameData.JourneyProgression) + KDInitializeJourney(KDGameData.Journey, MiniGameKinkyDungeonLevel); + + if (!KDGameData.JourneyMap) { + KDInitJourneyMap(MiniGameKinkyDungeonLevel); + } + + if (saveData.KDMapData || saveData.KinkyDungeonGrid) { + KDUpdateVision(); + } + KinkyDungeonFloaters = []; + KDFixNeeds(); + KDSortCollection(); + KinkyDungeonAdvanceTime(0, true, true); + KinkyDungeonSendEvent("afterLoadGame", {}); + return true; + } + } + return false; +} + +let KinkyDungeonSeed = (Math.random() * 4294967296).toString(); +let KDRandom = sfc32(xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)()); + +/** + * @param {boolean} Native Decides whether or not to use native KDRandom to randomize + */ +function KDrandomizeSeed(Native: boolean) { + let rand = Native ? KDRandom : () => {return Math.random();}; + KinkyDungeonSeed = (rand() * 4294967296).toString(); + for (let i = 0; i < 20; i++) { + let index = rand() * KinkyDungeonSeed.length; + KinkyDungeonSeed = KinkyDungeonSeed.replaceAt(index, String.fromCharCode(65 + Math.floor(rand()*50)) + String.fromCharCode(65 + Math.floor(rand()*50))); + } + KDRandom = sfc32(xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)()); + for (let i = 0; i < 1000; i++) { + KDRandom(); + } +} + +function KDsetSeed(str: string) { + KinkyDungeonSeed = str; + KDRandom = sfc32(xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)()); + for (let i = 0; i < 1000; i++) { + KDRandom(); + } +} + +/** + * It takes a string and returns a function that returns a random number + * @param str - The string to hash. + * @returns A function that returns a random number. + */ +function xmur3(str: string) { + let h = 1779033703 ^ str.length; + for(let i = 0; i < str.length; i++) { + h = Math.imul(h ^ str.charCodeAt(i), 3432918353); + h = h << 13 | h >>> 19; + } return function() { + h = Math.imul(h ^ (h >>> 16), 2246822507); + h = Math.imul(h ^ (h >>> 13), 3266489909); + return (h ^= h >>> 16) >>> 0; + }; +} + +/** + * It takes four 32-bit integers and returns a function that returns a random number between 0 and 1 + * @param a - The first parameter. + * @param b - 0x9e3779b9 + * @param c - 0x9e3779b9 + * @param d - The seed. + * @returns A function that returns a random number between 0 and 1. + */ +function sfc32(a: number, b: number, c: number, d: number) { + return function() { + a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0; + let t = (a + b) | 0; + a = b ^ b >>> 9; + b = c + (c << 3) | 0; + c = (c << 21 | c >>> 11); + d = d + 1 | 0; + t = t + d | 0; + c = c + t | 0; + return (t >>> 0) / 4294967296; + }; +} + +let kdSoundCache: Map = new Map(); + +function AudioPlayInstantSoundKD(Path: string, volume?: number) { + if (!KDSoundEnabled()) return false; + const vol = KDSfxVolume * (typeof volume != 'undefined' ? volume : 1); + if (vol > 0) { + let src = KDModFiles[Path] || Path; + let audio = kdSoundCache.has(src) ? kdSoundCache.get(src) : new Audio(); + if (!kdSoundCache.has(src)) { + audio.src = src; + kdSoundCache.set(src, audio); + } else { + audio.pause(); + audio.currentTime = 0; + } + audio.volume = Math.min(vol, 1); + audio.play(); + } +} + +/** + * From https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0 + */ +function hashCode(s: string) { + let h = 0; + for(let i = 0; i < s.length; i++) + h = Math.imul(31, h) + s.charCodeAt(i) | 0; + return h; +} + +function TextGetKD(Text: string) { + if (TextGet(Text)) + return TextGet(Text); + else return KDLoadingTextKeys[Text] || "Missing text"; +} + + +function KinkyDungeonCheckPlayerRefresh() { + if (!ArcadeDeviousChallenge || CommonTime() < KinkyDungeonNextRefreshCheck) { + return; + } + + // We've exceeded the refresh check time - check again in 1 second + KinkyDungeonNextRefreshCheck = CommonTime() + 1000; + + if (!KinkyDungeonPlayerNeedsRefresh) { + return; + } + + KinkyDungeonPlayerNeedsRefresh = false; + + if (ServerPlayerIsInChatRoom()) { + ChatRoomCharacterUpdate(DefaultPlayer); + } else { + CharacterRefresh(DefaultPlayer); + } +} + +function CJKcheck(text: string, p: number = 0, o: string = "search"): RegExpMatchArray | boolean +{ + if (o == "search") + { + //Find all English characters and space + if (p == 1){ return text.match(/[a-zA-Z0-9\s\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+/g);} + //Find all characters except English characters + if (p == 2){ return text.match(/^[a-zA-Z\s\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+(<3)?$/g);} + //Find all CJK Symbols and Punctuation + if (p == 3){ return text.match(/[\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\uff1f\uff01\uffe5\u3000-\u303f]+/g);} + //Find all CJK characters + else { return text.match(/[\u3000-\u9fff\ue000-\uf8ff\uff01-\uffdc\uac00-\ud7af]+/g);} + } else if (o == "test") + { + //Check CJK Symbols and Punctuation + if (p == 3){ return (/[\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\uff1f\uff01\uffe5\u3000-\u303f]+/g).test(text);} + } +} + +function KinkyDungeonGetCanvas(id: string): HTMLCanvasElement { + const canvas = document.getElementById(id); + if (!(canvas instanceof HTMLCanvasElement)) throw new Error(`Not a canvas element: ${canvas.id}`); + return canvas; +} + + + +function KDDrawGameSetupTabs(_xOffset: number = 0) { + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + DrawButtonKDEx("TabDiff", (_b) => { + KinkyDungeonState = "Diff"; + return true; + }, true, 500, 10, 740, 40, TextGet("KDDiffTab_Diff"), "#ffffff", undefined, undefined, undefined, + KinkyDungeonState != "Diff", KDButtonColor); + DrawButtonKDEx("TabChallenge", (_b) => { + KinkyDungeonState = "Challenge"; + return true; + }, true, 1250, 10, 740, 40, TextGet("KDDiffTab_Challenge"), "#ffffff", undefined, undefined, undefined, + KinkyDungeonState != "Challenge", KDButtonColor); + + + DrawButtonKDEx("backButton", (_b) => { + KinkyDungeonState = "Menu"; + return true; + }, true, 1075, 900, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", "", undefined, undefined, undefined, undefined, + undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySkip[0]), + hotkeyPress: KinkyDungeonKeySkip[0], + }); +} + + + +function DecompressB64(str: string): string { + if (!str || !str.trim) return str; + return LZString.decompressFromBase64("".concat(...str.trim().split('\n'))); +} + +let KDToggleTab = "Main"; + +function KDDrawToggleTabs(xOffset: number) { + let w = 1990 - xOffset; + FillRectKD(kdcanvas, kdpixisprites, "maintogglebg", { + Left: xOffset, + Top: canvasOffsetY_ui - 150, + Width: w, + Height: 970, + Color: "#000000", + LineWidth: 1, + zIndex: -19, + alpha: 0.3 + }); + DrawRectKD(kdcanvas, kdpixisprites, "maintogglebg2", { + Left: xOffset, + Top: canvasOffsetY_ui - 150, + Width: w, + Height: 970, + Color: "#000000", + LineWidth: 1, + zIndex: -19, + alpha: 0.9 + }); + let list = KDToggleGroups; + let II = 0; + for (let tab of list) { + DrawButtonKDEx("TabTog" + tab, (_b) => { + KDToggleTab = tab; + return true; + }, true, xOffset + II * w / list.length, 10, w / list.length - 4, 40, + TextGet("KDToggleTab" + tab), "#ffffff", undefined, undefined, undefined, + KDToggleTab != tab, KDButtonColor); + II++; + } +} + +function KinkyDungeonMultiplayerUpdate(_delay) { + // Do nothing. Placeholder for when/if there is ever any MP functionality +} + +let saveFile = null; +let KDSAVEEXTENSION = '.kdsave'; +let KDOUTFITEXTENSION = '.kdoutfit'; +let KDOUTFITBACKUP = '.kdcharbackup'; +let KDSaveName = ""; + +function KDLoadSave(files) { + for (let f of files) { + if (f && f.name) { + if (f.name.endsWith(KDSAVEEXTENSION) || f.name.endsWith('.txt')) { + let str = ""; + KDSaveName = f.name; + try { + const reader = new FileReader(); + reader.addEventListener('load', (event) => { + str = event.target.result.toString(); + ElementValue("saveInputField", + str + ); + }); + reader.readAsText(f); + } catch (err) { + console.log (err); + } + return; + } + } + } +} + + +function downloadFile(filename: string, text: string) { + const blob = new Blob([text], { type: 'text/plain' }); + const url = URL.createObjectURL(blob); + + const link = document.createElement('a'); + link.href = url; + link.download = filename; + link.textContent = 'Download Save'; + + // Trigger a click event on the link to prompt the user to download + const clickEvent = new MouseEvent('click', { + view: window, + bubbles: true, + cancelable: true, + }); + link.dispatchEvent(clickEvent); + + // Clean up the object URL after download + URL.revokeObjectURL(url); +} + +function KDChangeZoom(change: number) { + KDZoomIndex += change; + if (KDZoomIndex < 0) KDZoomIndex = 0; + else if (KDZoomIndex > KDZoomLevels.length - 1) KDZoomIndex = KDZoomLevels.length - 1; + + KinkyDungeonUpdateLightGrid = true; + KDRedrawFog = 2; + setTimeout(() => {KinkyDungeonAdvanceTime(0);}, 100); + + localStorage.setItem('zoomLvl', KDZoomIndex + ""); + + + KinkyDungeonSendActionMessage(10, TextGet("ZoomSet").replace("PCNT", + "" + Math.round(100*(72 + KDZoomLevels[KDZoomIndex] * 12)/72) + ), "#ffffff", 1); +} + +let KDMinimized = false; +let KDFocusSounds = setInterval(() => { + if (document.hasFocus()) { + KDMinimized = false; + } + else { + KDMinimized = true; + } +}, 100); + +function KDSoundEnabled() { + return KDToggles.Sound && (!KDToggles.SoundOffWhenMin || !KDMinimized); +} + +async function RunGenMapCallback() { + let ff = KDGenMapCallback; + KDGenMapCallback = null; + if (ff) + (() => { + KinkyDungeonState = ff(); + })(); +} + +function KDReloadChallenge() { + KinkyDungeonSexyMode = localStorage.getItem("KinkyDungeonSexyMode") != undefined ? localStorage.getItem("KinkyDungeonSexyMode") == "True" : true; + KinkyDungeonClassMode = localStorage.getItem("KinkyDungeonClassMode") != undefined ? localStorage.getItem("KinkyDungeonClassMode") : "Mage"; + KinkyDungeonSexyPiercing = localStorage.getItem("KinkyDungeonSexyPiercing") != undefined ? localStorage.getItem("KinkyDungeonSexyPiercing") == "True" : false; + KinkyDungeonSexyPlug = localStorage.getItem("KinkyDungeonSexyPlug") != undefined ? localStorage.getItem("KinkyDungeonSexyPlug") == "True" : false; + KinkyDungeonSexyPlugFront = localStorage.getItem("KinkyDungeonSexyPlugFront") != undefined ? localStorage.getItem("KinkyDungeonSexyPlugFront") == "True" : false; + KinkyDungeonProgressionMode = localStorage.getItem("KinkyDungeonProgressionMode") != undefined ? localStorage.getItem("KinkyDungeonProgressionMode") : "Key"; + KinkyDungeonSaveMode = localStorage.getItem("KinkyDungeonSaveMode") != undefined ? localStorage.getItem("KinkyDungeonSaveMode") == "True" : false; + KinkyDungeonHardMode = localStorage.getItem("KinkyDungeonHardMode") != undefined ? localStorage.getItem("KinkyDungeonHardMode") == "True" : false; + KinkyDungeonExtremeMode = localStorage.getItem("KinkyDungeonExtremeMode") != undefined ? localStorage.getItem("KinkyDungeonExtremeMode") == "True" : false; + KinkyDungeonPerksMode = localStorage.getItem("KinkyDungeonPerksMode") != undefined ? parseInt(localStorage.getItem("KinkyDungeonPerksMode")) || 0 : 0; + KinkyDungeonPerkProgressionMode = localStorage.getItem("KinkyDungeonPerkProgressionMode") != undefined ? parseInt(localStorage.getItem("KinkyDungeonPerkProgressionMode")) || 0 : 1; + KinkyDungeonPerkBondageMode = localStorage.getItem("KinkyDungeonPerkBondageMode") != undefined ? parseInt(localStorage.getItem("KinkyDungeonPerkBondageMode")) || 0 : 1; + KinkyDungeonPerkBondageVisMode = localStorage.getItem("KinkyDungeonPerkBondageVisMode") != undefined ? parseInt(localStorage.getItem("KinkyDungeonPerkBondageVisMode")) || 0 : 2; + KinkyDungeonRandomMode = localStorage.getItem("KinkyDungeonRandomMode") != undefined ? localStorage.getItem("KinkyDungeonRandomMode") == "True" : false; + KinkyDungeonEasyMode = localStorage.getItem("KinkyDungeonEasyMode") != undefined ? parseInt(localStorage.getItem("KinkyDungeonEasyMode")) || 0 : 0; + KinkyDungeonItemMode = localStorage.getItem("KinkyDungeonItemMode") != undefined ? parseInt(localStorage.getItem("KinkyDungeonItemMode")) || 0 : 0; + +} \ No newline at end of file diff --git a/Game/src/base/KinkyDungeonBones.ts b/Game/src/base/KinkyDungeonBones.ts new file mode 100644 index 000000000..b5fb99bde --- /dev/null +++ b/Game/src/base/KinkyDungeonBones.ts @@ -0,0 +1,1316 @@ +"use strict"; + +let KinkyDungeonBones = { + +}; + +let KDPatronAdventurers = [ +]; + +let KDPatronCustomEnemies = new Map([ + ["Wolfgirl", [ + {name: "Yanen Mian", color: "#63ab3f", prisoner: false, free: true, customPlayLine: "", customIntro: "ei hey!", customSprite: ""}, + {name: "Naho Kuroneko", color: "#ffac33", + prisoner: true, free: true, customPlayLine: "", + customIntro: "Oh hello! Do you want to help me try my new collection?", customSprite: ""}, + {name: "Seika", color: "#00ffff", prisoner: true, free: true, + customPlayLine: "", customIntro: "Finally...! Something interesting!", customSprite: ""}, + {name: "Yen", color: "#2b962d", prisoner: true, free: true, customPlayLine: "Yen", customIntro: "Howdy.", customSprite: ""}, + {name: "Miny", color: "#9c2a70", prisoner: false, free: true, customPlayLine: "", customIntro: "You should join my pack!", customSprite: ""}, + {name: "Sivasa", color: "#8888ff", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Alexandra", color: "#6241e1", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Nekora", color: "#42a459", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Emeia", color: "#00A7FF", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Goldie", color: "#f8c53a", prisoner: true, free: true, customPlayLine: "", customIntro: "Hey cutie, I'm Goldie. Why don't we play a little?", customSprite: ""}, + {name: "Dana", color: "#4444ff", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Loral", color: "#ab1d1d", prisoner: true, free: true, customPlayLine: "", customIntro: "Are you a good girl?", customSprite: ""}, + {name: "Yami", color: "#88ff88", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Animi", color: "#ff9999", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Ladica", color: "#44ff44", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "FlameTail", color: "#ff5277", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Nobu", color: "#00FFFF", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "NobIngridu", color: "#4EB85D", prisoner: false, free: true, customPlayLine: "", customIntro: "Hey hey people, it's ya girl, Ingrid!", customSprite: ""}, + {name: "Moranql", color: "#ff5277", prisoner: true, free: false, customPlayLine: "", customIntro: "0x0", customSprite: ""}, + {name: "Harumi", color: "#F223D4", prisoner: true, free: true, customPlayLine: "", customIntro: "This is an uncivilized place, I have some things to give you...", customSprite: ""}, + {name: "Joelle", color: "#4f60b8", prisoner: true, free: false, customPlayLine: "", customIntro: "Bork!", customSprite: ""}, + {name: "Gery", color: "#63ab3f", prisoner: true, free: true, customPlayLine: "", customIntro: "Heo :3", customSprite: ""}, + {name: "Gery", color: "#00ff00", prisoner: true, free: true, customPlayLine: "", customIntro: "I'll make you mine!", customSprite: ""}, + ], + ], + ["WolfInstructor", [ + {name: "Ladica, the Stoneclaw", color: "#4CBB17", prisoner: false, free: true, customPlayLine: "", customIntro: "Ready for yer spanking?", customSprite: ""}, + {name: "Acapelle", color: "#ad2f45", prisoner: false, free: true, customPlayLine: "", customIntro: "Hi! I'm Acapelle. To what do I owe the pleasure?", customSprite: ""}, + ], + ], + ["Necromancer", [ + {name: "Yuri The Shy Necromancer", color: "#8138FF", prisoner: false, free: true, customPlayLine: "", + customOutfit: "Yuri", customStyle: "Yuri", + customIntro: "Ple-please rise m-my skeletons", customSprite: ""}, + ], + ], + ["ElementalLeather", [ + {name: "Jaina", color: "#FF00DC", prisoner: true, free: true, customPlayLine: "", + customOutfit: "Hilda", customStyle: "Hilda", + customIntro: "Let’s have some fun~", customSprite: "Hilda"}, + {name: "Timyang", color: "#2257e9", prisoner: true, free: true, customPlayLine: "", customIntro: "I'm Timyang, do you have anything to do with me?", customSprite: ""}, + ], + ], + ["WolfgirlPet", [ + {name: "Demetria", color: "#c9d4fd", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Sayaron", color: "#841ee1", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Arii", color: "#ff88ff", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Aleiza", color: "#32d8ff", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Dana", color: "#000B77", prisoner: true, free: true, customPlayLine: "", customIntro: "*stands there... MENACINGLY*", customSprite: ""}, + ], + ], + ["Nurse", [ + {name: "Rena", color: "#a452ff", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Str Nurse", color: "#ffffff", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Fableite", color: "#999999", prisoner: false, free: true, customPlayLine: "", customIntro: "Care for an Examination?", customSprite: ""}, + ], + ], + ["RopeKraken", [ + {name: "Yandere Harem", color: "#ffffff", prisoner: true, free: true, customPlayLine: "", customIntro: "It's krakening time", customSprite: ""}, + ], + ], + ["ShadowGhast", [ + {name: "Erma", color: "#23ddee", prisoner: false, free: true, customPlayLine: "", customIntro: "You haven't come across my pet Raven, have you?", customSprite: ""}, + ], + ], + ["ElementalLatex", [ + {name: "Samsy", color: "#2f847f", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Athena", color: "#7e52cc", prisoner: false, free: true, customPlayLine: "Athena", customIntro: "Hey there cutie", customSprite: ""}, + {name: "Brunhilda", color: "#44ff44", prisoner: true, free: true, + customPlayLine: "Athena", customIntro: "Aren't you lovely, let's make you latex shiny! <3", customSprite: ""}, + ], + ], + ["ElementalRubber", [ + {name: "Amelisia", color: "#ff5500", prisoner: true, free: true, + customPlayLine: "", customIntro: "I'd love to hear your moans through your gags.", customSprite: ""}, + {name: "Athena", color: "#7e52cc", prisoner: false, free: true, customPlayLine: "Athena", customIntro: "Hey there cutie!", customSprite: ""}, + ], + ], + ["Dragon", [ + {name: "Garss", color: "#ff8888", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["Conjurer", [ + {name: "Stela", color: "#9c2767", prisoner: false, free: true, customPlayLine: "Selly", customIntro: "I am Stela. But to you, sweetie? Call me Mistress.", customSprite: "Selly", + pets: { + "Frog": [ + {name: "Parov", color: "#781d4f", prisoner: false, free: true, customPlayLine: "", customIntro: "Glorp glorpy glorp.", customSprite: "Parov"}, + ] + }, + }, + {name: "Viola", color: "#8c46e8", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: "Viola", + customStyle: "Viola", customOutfit: "Viola", + pets: { + "Frog": [ + {name: "Leff", color: "#88ff88", prisoner: false, free: true, customPlayLine: "", customIntro: "Glorp glorpy glorp.", customSprite: ""}, + ] + }, + }, + {name: "Lucy", color: "#79009d", prisoner: false, free: true, customPlayLine: "", customIntro: "Come here so I can tie you up and cuddle you~", customSprite: "", + pets: { + "Frog": [ + {name: "Fred", color: "#88ff88", prisoner: false, free: true, customPlayLine: "", customIntro: "Glorp glorpy glorp.", customSprite: ""}, + ] + }, + }, + {name: "Warren Rabbit", color: "#8888ff", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: "", + pets: { + "Frog": [ + {name: "Fred", color: "#8888ff", prisoner: false, free: true, customPlayLine: "", customIntro: "Glorp glorpy glorp.", customSprite: ""}, + ] + }, + }, + {name: "Kathy", color: "#aaff88", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: "", + pets: { + "Frog": [ + {name: "Fred", color: "#88ff88", prisoner: false, free: true, customPlayLine: "", customIntro: "Glorp glorpy glorp.", customSprite: ""}, + ] + }, + }, + ], + ], + ["DragonShadow", [ + {name: "Gwen", color: "#7b43ef", prisoner: false, free: true, customPlayLine: "DragonShadowGwen", customIntro: "", customSprite: ""}, + {name: "Melody", color: "#d99bff", prisoner: true, free: true, + customPlayLine: "", customIntro: "Let's summon that beautiful voice, shall we?", customSprite: ""}, + ], + ], + ["WolfApprentice", [ + {name: "The_Goo", color: "#53f124", prisoner: true, free: true, + customPlayLine: "", customIntro: "I was a coyote in my past life.", customSprite: ""}, + {name: "Ayami", color: "#967bb6", prisoner: true, free: true, + customPlayLine: "", customIntro: "Hey cutie!", customSprite: ""}, + ], + ], + ["WolfExecutive", [ + {name: "Treve", color: "#999999", prisoner: true, free: true, + customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["Adventurer_Brat_Fighter", [ + {name: "Rook", color: "#ff5277", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: "Rook"}, + ], + ], + ["DragonLeaderDuelist", [ + {name: "Kaitlyn", color: "#ff5277", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["Rat", [ + {name: "Derek", color: "#ffffff", + prisoner: true, free: true, customPlayLine: "", + customIntro: "*squeak*", customSprite: ""}, + ], + ], + ["NinjaStalker", [ + {name: "Alisa", color: "#575699", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: "Alisa"}, + {name: "Rai", color: "#5D6396", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: "Rai"}, + ], + ], + ["Ninja", [ + {name: "Rai", color: "#5D6396", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: "Rai2"}, + {name: "Alisa", color: "#575699", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: "Alisa"}, + {name: "Rizo", color: "#ff5277", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: "Alisa"}, + {name: "Rizo", color: "#ff5277", prisoner: true, free: true, customPlayLine: "", customIntro: "Another day, another hunt.", customSprite: "Alisa"}, + ], + ], + ["SlimeAdv", [ + {name: "Garry", color: "#a52a2a", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Rena", color: "#C8C8FF", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Rappy The Toy", color: "#C759FF", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Yolana", color: "#92e8c0", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Druppy", color: "#e76bf2", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Robyn", color: "#ba7cfc", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["DollsmithDoll", [ + {name: "Crystal", color: "#e76bf2", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "zjc", color: "#ffffff", prisoner: false, free: true, + customPlayLine: "", customIntro: "See you next floor... Mmmmm!", customSprite: ""}, + ], + ], + ["SmallSlime", [ + {name: "Chuangpi", color: "#F0FFFF", prisoner: false, free: true, + customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Miaowu~Miaowu~", color: "#f7a1e5", prisoner: false, free: true, customPlayLine: "", customIntro: "miao~", customSprite: ""}, + {name: "Sand", color: "#ffd270", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Sasheen", color: "#ad2f45", prisoner: false, free: true, customPlayLine: "", customIntro: "Hai!", customSprite: ""}, + {name: "Ty", color: "#ff5277", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Freya", color: "#c93fab", prisoner: false, free: true, customPlayLine: "", customIntro: "*giggle*", customSprite: ""}, + {name: "Akanit", color: "#e9225d", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Perfiano", color: "#ffff00", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["WitchRope", [ + {name: "Kamikaze roper", color: "#ffae70", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Lami", color: "#7d1dff", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Mameli", color: "#63ab3f", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["Miner", [ + {name: "Dwarf (but not short)", color: "#e92222", prisoner: true, free: true, customPlayLine: "", + customIntro: "ROCK AND STONE!", + }, + {name: "Nova", color: "#3b7d4f", prisoner: false, free: true, customPlayLine: "", + customIntro: "We're gonna have a blast~!", + }, + ], + ], + ["MaidforceStalker", [ + {name: "Chandra", color: "#340000", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Tromva", color: "#3dccab", prisoner: true, free: true, customPlayLine: "", customIntro: "Wow!", customSprite: ""}, + {name: "Sanhua", color: "#444444", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["ApprenticeSlime", [ + {name: "Gabrielle", color: "#e7cf1a", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["Alchemist", [ + {name: "Morgan", color: "#6241e1", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Daiseng", color: "#ff9900", prisoner: false, free: true, customPlayLine: "", customIntro: "Do I look like a taxi driver to you?", customSprite: ""}, + {name: "Matt", color: "#ff0000", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Luplus Falmele", color: "#22ffff", + prisoner: true, free: true, + customPlayLine: "", customIntro: "Latex can last for hundreds of years, so why can't we?", customSprite: ""}, + ], + ], + ["AlchemistPet", [ + {name: "Vixen", color: "#a632ec", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["Dressmaker", [ + {name: "Maelith", color: "#3E6B3A", prisoner: true, free: true, + customPlayLine: "", customIntro: "You look bored, love... Let me fix that.", customSprite: ""}, + {name: "Rayne", color: "#ff9900", prisoner: true, free: true, + customPlayLine: "", customIntro: "Look at all these cute ribbons and frills!", customSprite: ""}, + {name: "A Lazy Dressmaker", color: "#fad6ff", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Melissa", color: "#853cff", prisoner: true, free: true, customPlayLine: "Melissa", + customStyle: "Melissa", customOutfit: "Melissa", customOutfitBound: "MelissaBound", + customIntro: "My name's Melissa! I know I'm pretty, but try not to stare too much~", customSprite: "Melissa"}, + {name: "Alice", color: "#ee99ee", prisoner: true, free: true, customPlayLine: "", customIntro: "Hello, I am a dressmaker and the name's Alice! Need a new dress?", customSprite: ""}, + {name: "Monika", color: "#49dc20", prisoner: true, free: true, customPlayLine: "", customIntro: "Whatcha doing?", customSprite: ""}, + ], + ], + ["Demon", [ + {name: "PumpkinMB", color: "#3ea2c9", prisoner: true, free: true, + customPlayLine: "", customIntro: "Just because my name is pumpkin doesn't mean my name shouldn't be blue!", customSprite: ""}, + ], + ], + ["Maidforce", [ + {name: "Handcuffed Girl", color: "#ce6cf4", prisoner: true, free: false, customPlayLine: "", + customIntro: "It felt as if I was chained for eternity!", customSprite: ""}, + {name: "Handcuffed Girl", color: "#ffa1fd", prisoner: true, free: false, customPlayLine: "", + customIntro: "Would you like to play with me, hun?", customSprite: ""}, + {name: "Arianna", color: "#3fc968", prisoner: true, free: true, customPlayLine: "", + customIntro: "Lets negotiate, you surrender and I let you live!", customSprite: ""}, + {name: "Terra", color: "#00ff00", prisoner: true, free: true, customPlayLine: "", + customIntro: "", customSprite: ""}, + {name: "Cuffed Girl", color: "#e347f1", prisoner: true, free: true, customPlayLine: "", customIntro: "Would you like to play with me?", customSprite: ""}, + {name: "Meer", color: "#ff8888", prisoner: true, free: true, customPlayLine: "", customIntro: "Maids!", customSprite: ""}, + {name: "Taesjha", color: "#ff9ffd", prisoner: true, free: false, + customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Robin", color: "#e846c5", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Lillian", color: "#ff77aa", prisoner: false, free: true, customPlayLine: "", customIntro: "Well met, traveler!", customSprite: ""}, + {name: "Kishi Masami", color: "#9a43b5", prisoner: true, free: true, customPlayLine: "", customIntro: "Lakad Matatag, Normalin Normalin!", customSprite: ""}, + {name: "Ping", color: "#ff9900", prisoner: true, free: true, + customPlayLine: "", customIntro: "I will catch you.", customSprite: ""}, + {name: "Ester", color: "#97edca", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Rest", color: "#999999", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Zelenes", color: "#2244ff", prisoner: true, free: false, customPlayLine: "", customIntro: "Please help me.", customSprite: ""}, + {name: "Rika Mercury", color: "#92e8e5", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Maidlinmo", color: "#ff5277", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "April", color: "#4444ff", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Aika", color: "#be52e6", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Kiera", color: "#310051", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Lam", color: "#ffff22", prisoner: true, free: true, customPlayLine: "", customIntro: "Lam, at your service!", customSprite: ""}, + {name: "Taesjha", color: "#ff8888", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Weixz", color: "#ff4422", prisoner: false, free: true, customPlayLine: "", customIntro: "Hello.", customSprite: ""}, + {name: "ping", color: "#dd9922", prisoner: true, free: true, customPlayLine: "", customIntro: "I'm gonna catch you!", customSprite: ""}, + {name: "Lilly", color: "#b39dfc", prisoner: true, free: true, customPlayLine: "", customIntro: "D-don't mess up the ~ah~ f-floors please. I'm b-being punished ~ugh~ enough by the h-head maid a-already", customSprite: ""}, + {name: "Akura", color: "#e64539", prisoner: true, free: false, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Shiroka", color: "#ffffff", prisoner: false, free: true, + customPlayLine: "", customIntro: "I didn't wish to become what I am now at first, but the restraints were so captivating...", customSprite: ""}, + {name: "KCl", color: "#00ffff", prisoner: false, free: true, customPlayLine: "", customIntro: "I don't taste salty~", customSprite: ""}, + ], + ], + ["MaidforceHead", [ + {name: "FrostLunar", color: "#0055ff", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Marine", color: "#4477ff", prisoner: true, free: true, customPlayLine: "", customIntro: "Hi! I'm Marine Kelley. 'Miss Marine', to you.", customSprite: ""}, + ], + ], + ["WitchFlame", [ + {name: "Myrtrice", color: "#d30000", prisoner: false, free: true, customPlayLine: "Myrtrice", + customStyle: "Myrtrice", customOutfit: "Myrtrice", + customIntro: "All creatures are made to bow to me.", customSprite: "Myrtrice"}, + {name: "Myrtrice", color: "#d30000", prisoner: false, free: true, customPlayLine: "Myrtrice", + customStyle: "Myrtrice", customOutfit: "Myrtrice", + customIntro: "All creatures are made to bow to me.", customSprite: "Myrtrice2"}, + ], + ], + ["DragonGirlShadow", [ + {name: "Nara", color: "#5F54FF", prisoner: true, free: true, customPlayLine: "", + customStyle: "Nara", customOutfit: "Nara", customSprite: "Nara" + }, + {name: "Krifath", color: "#6633cc", prisoner: true, free: true, + customPlayLine: "", customIntro: "I used to be an adventurer like you, then I took an arrow in the knee.", + }, + {name: "Krifath", color: "#6633cc", prisoner: true, free: true, + customPlayLine: "", customIntro: "I used to be an adventurer like you, then I took an arrow in the knee.", + }, + ], + ], + ["DragonIce", [ + {name: "Wynn", color: "#31d4ac", prisoner: false, free: true, customPlayLine: "", + customIntro: "Wynn of the Dragonheart Order, Pleased to meet you!", + } + ], + ], + ["WitchIce", [ + {name: "Verina", color: "#44ff66", prisoner: true, free: false, customPlayLine: "", customIntro: "Have you seen my girlfriend around here?", customSprite: ""}, + ], + ], + ["WitchShock", [ + {name: "Persephone", color: "#ff8888", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["WitchShibari", [ + {name: "Jenasine", color: "#Jenasine", prisoner: true, free: false, customPlayLine: "", customIntro: "I'm usually a lot better at this...", customSprite: ""}, + ], + ], + ["WitchEarth", [ + {name: "Persephone", color: "#ff8888", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["WitchSlime", [ + {name: "Kathy Narlato", color: "#4e3da9", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Claire", color: "#55ff55", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Luna", color: "#872eff", prisoner: true, free: true, customPlayLine: "", customIntro: "Hi I'm Luna.", customSprite: ""}, + ], + ], + ["WitchWater", [ + {name: "Marine", color: "#4fa4b8", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Ari", color: "#00ffff", prisoner: true, free: true, customPlayLine: "", customIntro: "Have you ever thought about learning Water magic? It's quite fascinating!", customSprite: ""}, + ], + ], + ["ElementalEarth", [ + {name: "Entombment", color: "#ffae70", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["BanditPet", [ + {name: "Lazuli", color: "#a423d6", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Liz", color: "#d480bb", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Jinxy", color: "#7d27a5", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Genna", color: "#42bfe8", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["Bandit", [ + {name: "Lysannah", color: "#2fefe5", prisoner: true, free: true, + customPlayLine: "", customIntro: "Well hey there, pretty~", customSprite: ""}, + ], + ], + ["BanditChief", [ + {name: "Betruger", color: "#ba26e7", prisoner: true, free: true, + customPlayLine: "", customIntro: "Hi! Are you ok?", customSprite: ""}, + ], + ], + ["Wizard", [ + {name: "Draziw", color: "#3adcd4", prisoner: true, free: true, + customPlayLine: "", customIntro: "The price of truth is reading between the lies, and lockpicks. Could you spare any?", customSprite: ""}, + {name: "Draziw", color: "#ff9ffd", prisoner: true, free: true, + customPlayLine: "", customIntro: "Hay.... Oh its you again.... What do you want?", customSprite: ""}, + ], + ], + ["BanditHunter", [ + {name: "Luka", color: "#e13b6c", prisoner: true, free: true, customPlayLine: "", customIntro: "Something seems missing... A gag!", customSprite: ""}, + ], + ], + ["ElfRanger", [ + {name: "Valeria", color: "#ebaaf4", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Aello", color: "#ffae70", prisoner: true, free: true, + customPlayLine: "ElfSmug", customIntro: "... Can I help you traveler?", customSprite: ""}, + ], + ], + ["Elf", [ + {name: "Ferahla", color: "#44ff44", prisoner: true, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + {name: "Clockheart", color: "#80fc7c", prisoner: true, free: true, customPlayLine: "", customIntro: "I hope no one locks me into a straitjacket~", customSprite: ""}, + ], + ], + ["Dollsmith", [ + {name: "Kiera", color: "#310051", prisoner: false, free: true, customPlayLine: "", customIntro: "", customSprite: ""}, + ], + ], + ["Dollmaker", [ + {name: "Latex Doll Maker", color: "#ffa8f8", prisoner: true, free: false, customPlayLine: "", + customIntro: "Thank you. It's been quite a long time, can I follow you?", customSprite: ""}, + ], + ], + ["MeleeCleric", [ + {name: "Odilaria", color: "#ff9900", prisoner: true, free: false, + customPlayLine: "", customIntro: "Oh, a pet!", customSprite: ""}, + ], + ], + ["Mummy", [ + {name: "Skarne", color: "#ff0549", prisoner: false, free: true, + customPlayLine: "", customIntro: "I've been watching you~", customSprite: ""}, + ], + ], + ["MummyPet", [ + {name: "Béatrice", color: "#db72c4", prisoner: true, free: false, + customPlayLine: "", customIntro: "I.. I thought I was being a good girl...", customSprite: ""}, + ], + ], + +]); + + +let KDPatronsSpecial = { + "Anonymous ": 2, + "cyberjoel": 2, + "finn ": 2, + "Samantha Lear": 2, + "Private ": 2, + "Chet Vargas": 2, + "Siegfried Kübler": 2, + "Song": 2, + "The-Fisher-King": 2, + "Churro": 2, + "Laioken ": 2, + "Wyatt Wintersoul": 1, + "Dex♪ ": 1, + "Anthony Royle": 1, + "Shogo ": 1, + "Gamefan ": 1, + "Blox ": 1, + "Jerome Peterson": 1, + "selly-grim ": 1, + "Alexis Octavia": 1, + "Noxgarm ": 1, + "Slacker": 1, + "Hellgete ": 1, + "Flame ": 1, + "WATA ": 1, + "FrenzyFlame": 1, + "Kieraakari ": 1, + "Loudest_Quiet_Person": 1, + "Rest": 1, + "atetete ": 1, + "Mechio ": 1, + "Dazman1234 ": 1, + "Thefabulousglaceon": 1, + "Rika": 1, + "0xA4C1B842": 1, + "LukeB ": 1, + "devan ": 1, + "Physicsphail": 1, + "Miro": 1, + "Loony ": 1, + "WhiteSniper": 1, + "Thatguu": 1, + "Somprad ": 1, + "Geng114514 ": 1, + "John Toenniessen": 1, + "Cat Hawke": 1, + "Míša": 1, + "RappyTheToy ": 1, + "Diablo200": 1, + "Cerb ": 1, + "isaiah lewis": 1, + "Mellenia": 1, + "LordFabricator": 1, + "Zero K": 1, + "Dakra ": 1, + "Victor ": 1, + "damit damit": 1, + "nnm711 ": 1, + "Dragokahn": 1, + "Meekohi": 1, + "Phoenix ": 1, + "zipidyzap ": 1, + "Cera": 1, + "CuvyanTaylor ": 1, + "anton allison": 1, + "Shrimpy ": 1, + "Tatsuya Shiba": 1, + "Snekus ": 1, + "nuzzels": 1, + "Minescence ": 1, + "HanQing Zhao": 1, + "James Kirkman": 1, + "OTKTamashii ": 1, + "darklink11 ": 1, + "Hannes": 1, + "Arentios ": 1, + "Nymjii": 1, + "Linex": 1, + "Mister Mythe": 1, + "CMDR Salen": 1, + "bl ah": 1, + "Salmon": 1, + "Trinan": 1, + "sqrt10pi": 1, + "hopefast ": 1, + "jeepk36": 1, + "Shakymunch": 1, + "Samsy": 1, + "Pyros51 ": 1, + "Aussie895": 1, + "Hungvipbcsok": 1, + "hideki hirose": 1, + "Girador ": 1, + "Traynfreek ": 1, + "GRASS": 1, + "Heavy Blues": 1, + "Pyron ": 1, + "Kritsanapong Jarutatpimol": 1, + "Hanqing Zhao": 1, + "Yagami Yami": 1, + "Wossa ": 1, + "FlameTail": 1, + "火披薩 水": 1, + "Sewdah nim": 1, + "Crimson": 1, + "X27": 1, + "Nyarlato": 1, + "Nightkin": 1, + "Sylicix": 1, + "Null Fame": 1, + "AdventCirno ": 1, + "Sera The Crocsune": 1, + "Masaki Hara": 1, + "Eric Rothman": 1, + "영승 박": 1, + "Claire Stephens": 1, + "koch ": 1, + "Joecoolzx": 1, + "森 韩": 1, + "ComradeArmtyom ": 1, + "Hjake2 ": 1, + "Chen yu": 1, + "Sinohisaki": 1, + "linlizheng ": 1, + "john1304": 1, + "Zora": 1, + "suddys ": 1, + "Robert Gomez": 1, + "亦斌 陳": 1, + "Feltenix": 1, + "Aika ": 1, + "sCaREaGle": 1, + "Mike Salot": 1, + "Roger Gamer": 1, +}; + +let KDPatrons = [ + "Anonymous", + "finn", + "Samantha L.", + "Private", + "Chet V.", + "Siegfried K.", + "Song", + "Churro", + "Laioken", + "selly-grim", + "Kieraakari", + "Dex♪", + "Slacker", + "Rika", + "Mechio", + "Dragokahn", + "sqrt10pi", + "Anthony R.", + "Cera", + "Shogo", + "Jerome P.", + "WhiteSniper", + "WATA", + "Cat H.", + "Minescence", + "Heavy B.", + "Gamefan", + "Loreley", + "Loudest_Quiet_Person", + "Blox", + "atetete", + "Est D.", + "RappyTheToy(Patreon)", + "Diablo200", + "devan", + "Snekus", + "Miro", + "LordFabricator", + "Flame", + "Loony", + "Physicsphail", + "Approver", + "Linex", + "Meekohi", + "zipidyzap", + "0xA4C1B842", + "Thatguu", + "Geng114514", + "Dazman1234", + "Thefabulousglaceon", + "Victor", + "damit d.", + "John .", + "LukeB", + "Noxgarm", + "Míša", + "Shrimpy", + "hopefast", + "Mellenia", + "Mister M.", + "Somprad", + "HanQing Z.", + "Nymjii", + "Samsy", + "darklink11", + "Fun H.", + "Zero K.", + "Dakra", + "Tatsuya S.", + "GRASS", + "CuvyanTaylor", + "Joecoolzx", + "Girador", + "SilentNobushi", + "Safyra K.", + "Feltenix", + "Sera T.", + "hideki h.", + "anton a.", + "Pyros51", + "Zora", + "Yukke112262", + "IHAVEDNA", + "GoldLinaric", + "Pixie", + "海星", + "aliveyuu", + "Louriel B.", + "Nyarlato", + "Nightkin", + "Knocksinna", + "Aika", + "Uriahjs 0.", + "Traynfreek", + "Pyron", + "Yagami Y.", + "Wossa", + "Tyson B.", + "Paul ..", + "Bastien P.", + "luke h.", + "Lord L.", + "The_rogue1", + "mebsu", + "Robert G.", + "AdventCirno", + "Masaki H.", + "Eric R.", + "영승 박.", + "Hungvipbcsok", + "Sinohisaki", + "SaiZaro", + "Mike S.", + "MoNone", + "Lizzy T.", + "OTL_OTL", + "Samuel P.", + "crimmsonblade", + "ComradeArmtyom", + "Lazulilly", + "nubbs99", + "Yuichiro S.", + "Robert B.", + "john1304", + "Mikhail P.", + "Told K.", + "CorruptNightmare", + "James M.", + "bl a.", + "FrostLunar", + "Rizomind", + "Eric", + "Takuan", + "Sean m.", + "Hotohari", + "NDW", + "Benedito W.", + "Jioshi", + "Metablaze", + "ganster g.", + "Learko", + "Matt L.", + "Remi", + "mzklopyu ..", + "CMDR S.", + "Derp", + "Ahni J.", + "wangjunkai", + "Korith", + "Bob B.", + "Hard L.", + "HiddenLayers", + "fdnbgonds", + "Raven W.", + "speedometerenthusiast", + "Sydney S.", + "Ardmagar", + "andwa", + "BlitzAceRush", + "Diana", + "wanjianta", + "reghtrehgtr", + "Shenshi", + "Zhenyu G.", + "Sabine B.", + "Feyro", + "weakwind", + "Jarick", + "RedaReinhart", + "SoymilkCandle", + "Yupos", + "Blooddawn", + "Kevin S.", + "DefinitelyNotSnek", + "Pizzasgood", + "OTO", + "Zach", + "Alan A.", + "B.C.", + "Fieldofbunnys", + "amzta17212", + "世龙 何.", + "Glurak B.", + "Jonathan W.", + "tiamatdragon00", + "Jacob C.", + "beatsomeone", + "coefficient", + "Nunmina", + "brandon w.", + "Tiger9099", + "Amon", + "Ingwer", + "PlayingFlunky5", + "Naomi", + "Ainrave", + "Chiaro", + "snake9831", + "拘束", + "MikaDai", + "黑色白蔷薇", + "绯月妖殇", + "ororo", + "Hirosin", + "zztophatzztophat", + "Mashiro", + "TOKIMAKI", + "ma. B.", + "vindicator1229", + "Kevin C.", + "chickenking", + "Climhazzard", + "Jaso239", + "orchidpyy", + "Raven N.", + "Suneo H.", + "Smog47", + "nicholas k.", + "dorahira", + "Mina", + "altheerr4086", + "HIBIKI", + "森 韩.", + "K4cyk", + "Waljos", + "DG", + "LBridge666", + "LenSal", + "Jordan D.", + "John D.", + "SkyRoseKNA5500", + "Joshua S.", + "Argent", + "Wyrmaiden", + "1339378915", + "Samuel A.", + "toast", + "Valadeya", + "Imperial金曜", + "Kevin W.", + "Trolo", + "Namrair", + "Elifer", + "Dominique M.", + "Juan C.", + "Robert", + "Midnigh R.", + "Valslov", + "Daniel", + "Skuta K.", + "Sabertooth e.", + "Sadlat50", + "DrWeeDStaar420", + "Lami", + "Michal R.", + "朱文清", + "Balababa", + "Victoria D.", + "Spatchadoo", + "jiazhou l.", + "john h.", + "Radek K.", + "Sage_Anima", + "孟璟 李.", + "Jennie M.", + "Strania", + "Jeremy", + "mantra", + "凉茶没有毒", + "R W.", + "Ilya G.", + "Cory E.", + "875601227", + "pyrite", + "FROST1997", + "Error 4.", + "Wepon", + "JamesWang", + "Mick", + "Anritheknight", + "Doll", + "kim l.", + "Nia", + "Kurami-", + "Chief_K", + "photometrik", + "DazedDitz", + "曾 啊.", + "雄星 赤.", + "Phillip T.", + "Hohrenda", + "Tyrrandae", + "Chris", + "nobody", + "Cormag81", + "Ninja", + "yumengling", + "Mosawer", + "陆风 钱.", + "许可凡", + "Estwing", + "リューズ I.", + "永恒虚妄", + "Johnathan M.", + "Foxtail35", + "aabac", + "Moss M.", + "从玄 贺.", + "Frostyflak3", + "Becky D.", + "Joseph S.", + "V G.", + "MorganoCaster", + "Emmanuel", + "hayiya", + "alice", + "ewhac", + "彥均 林.", + "Mirin", + "saitama", + "brain", + "IHadPotential", + "xing j.", + "Misssu", + "radeonfw", + "Celia", + "Nirual86 ..", + "SKYWALKER6666", + "breadman", + "雪樱 赤.", + "Arshia Y.", + "Taoheo", + "Doidoxyz", + "Benjamin O.", + "n00dles", + "Samuel M.", + "Pihiatua", + "flightaceturbo", + "MechaMarshmallow", + "Valaurelius", + "Taco J.", + "danthe67man32", + "YeSpoon", + "Naltraz", + "Pengzeus", + "ShiokazeNeko", + "Celescia", + "Roro", + "MB1811", + "Marres", + "Kimaros", + "Yohan", + "John3174", + "Lysandia", + "ass h.", + "Ploxis", + "Cysticoscuro", + "Ryujin", + "nick", + "Corentin P.", + "Oleksandr K.", + "Draco R.", + "BrepperSpray", + "凌云 普.", + "nick y.", + "嘉锐 蔡.", + "wang", + "bobapple", + "strangeapple", + "AWSL N.", + "Robyn", + "PyriteStar", + "Fryt12", + "Tyler T.", + "Sambath", + "DB", + "u2mk", + "Dominic A.", + "Aerin", + "DaveGeneric", + "Never M.", + "jdsoc76", + "ragnum", + "上将 零.", + "Flint L.", + "Ross", + "Drew F.", + "John", + "Maclupus", + "1542262", + "CLUBT", + "RaTheBird", + "Amalaxi999", + "now t.", + "Mark O.", + "ANARCHY", + "Colton M.", + "Salwadorx", + "승원 장.", + "Hevensdragon ..", + "D.G.", + "Clarity", + "SuicideByTaco", + "Lonnie H.", + "bluelion319", + "PatreonPat", + "Quinn", + "cherry", + "Fun P.", + "Cyril g.", + "Ryan P.", + "TSCSwald", + "SD", + "Mxtian", + "Japan M.", + "crank", + "Flora", + "jlol1945", + "Micheal M.", + "琉璃 瀬.", + "PR_Lowell", + "Shadow56", + "Justin R.", + "EEkumbookum", + "YamiHikariOblivion Y.", + "Splattershot J.", + "Coconut-Chan", + "jearldster", + "Legionnaires", + "Two G.", + "Synaptic S.", + "Chuggle", + "ekilliox", + "龙烨 高.", + "Dimonnn1212", + "John M.", + "opensesame", + "Vile M.", + "Crociraffe", + "CyLian", + "Anton M.", + "axelY", + "Ruffian", + "Dylan", + "SiHolaEstas", + "DIdNothing", + "ssm-1", + "ChickenRider", + "Julz", + "Jaime A.", + "Bearzalot", + "R M.", + "spellbook", + "[NoyE]", + "chrisander b.", + "wolfenstein1010", + "Eric", + "Puffy ..", + "Gery", + "EGGS", + "SD", + "Ancsa-Molnár D.", + "Antinomy", + "AA", + "Seifonor", + "Dracooo", + "till s.", + "Dgony", + "RomaSaber", + "Rubikon", + "Yeppie5", + "Kenryu", + "Se D.", + "Raphfish", + "Blackbeard1806", + "Menapfeast", + "Floboo", + "Neykio M.", + "thepyrodj", + "忆上官 真.", + "Titan", + "divcis23 s.", + "xAvitaLT", + "Yar", + "Anonymouse257", + "Nathalie", + "Adali G.", + "Ace", + "ViniJones", + "Skele L.", + "Shadow1317", + "Starman", + "Ikani", + "Balloons250", + "Ted S.", + "Madison H.", + "OptimusRaven", + "芳 王.", + "Christopher K.", + "BattlebrotherAlex", + "canosawa", + "Wilhelm F.", + "Fafnir G.", + "Raxacoricofallapatorius", + "Aura M.", + "SVD63Ninja", + "SirHalNova", + "清宇 鍾.", + "咸鱼", + "Arleen H.", + "Epilogue_krr", + "nocturnal", + "West", + "党 泽.", + "Object 1.", + "Eevee", + "OneFox", + "wPzJQfpF", + "Mandiow", + "xiaofeisha", + "JellyBULLET", + "Mellow D.", + "EvilSebas", + "bob b.", + "KOTA", + "Crimsonknight", + "ToastyKarasu", + "Rylee", + "NeroTiiK", + "MasterOfBeings", + "林朔 樊.", + "Christian J.", + "Tom", + "TekokiMaster", + "Yamatokc", + "XLT0007", + "sharbee", + "Bladeetro", + "FlyIN_ 1.", + "eternaleclipse", + "Panpakapan!", + "Diode I.", + "momo", + "Asu P.", + "Arkitect10", + "Odilaria", + "mian w.", + "Harbinger d.", + "hime", + "Wiboeo", + "长萌", + "ragingptero", + "OREO", + "inori", + "Elena N.", + "Your H.", + "mike j.", + "underwaterhelp", + "Rouges T.", + "CJ B.", + "Joshua", + "Imerlith", + "Jonathan", + "René M.", + "Dinin", + "AloyTheDeer", + "Alex", + "QQQdev", + "Sigma", + "ぱっち 嘘.", + "Jordan B.", + "Abrissgurke", + "ArQu", + "musasi64", + "Paul C.", + "LINREAR_ALGEBRAX", + "Stareyespup", + "Jack H.", + "Dragonlord2000", + "twlight908", + "myhiddenuser67", + "whitegive", + "BeyondObscurity", + "Marc L.", + "ch0561", + "Thomas C.", + "darrian p.", + "Proskillz12356", + "Inters B.", + "Katra", + "Escaperobe", + "Annika", + "Phipas", + "Apflu L.", + "Ghostsalad", + "Richard", + "Sumeroda", + "Antoine R.", + "Toby", + "Derh", + "DarbSup", + "aruba1", + "Orari C.", + "Derpinstion", + "ko y.", + "Travis B.", + "aaaaaaa", + "Shadow f.", + "J", + "Danny", + "blazingdonkey", + "Eclipse_Corp.", + "Jason E.", + "EmPTyID", + "Lunix V.", + "SilversoulFan", + "sleepy", + "boobufestu", + "OddEssay", + "corering", + "Jh00", + "greatwulf", + "My W.", + "Albraiky H.", + "Chaudawg", + "Michael K.", + "Doc", + "Dylan", + "Brady M.", + "Collin", + "罗素的茶壶", + "AbbiRP", + "Rene", + "Trenchy t.", + "其亮 刘.", + "ObedientCat", + "SanguineEnigma", + "MyssleDissle", + "Haar", + "Eason", + "Melody", + "asdfghjkl", + "Bill M.", + "mick l.", + "Asteria T.", + "Red__bayberry", + "RS", + "博皓 张.", + "Chufeng Z.", + "S c.", + "Corbin C.", + "qqeqqqeq", + "Daniel H.", + "Sahale42", + "a_lurker", + "RupertRamHorn", + "云昊阳 刘.", + "Roil", + "OuuGuu", + "Johnson", + "Jason B.", + "JohnnySasaki22", + "sjsjsjs s.", + "Fisher", + "TrollGaming9996", + "Mount83", + "Sarlen A.", + "Opossum B.", + "Neptune", + "carnassire", + "omdik", +]; + +/** + * @param Enemy + * @param e + * @param chanceBoost + */ +function KDProcessCustomPatron(Enemy: enemy, e: entity, chanceBoost: number, makePersistent: boolean): any { + let chance = 0.05 + (chanceBoost || 0); // Lower chance if 'subordinate' + if (!e.CustomName && KDPatronCustomEnemies.get(Enemy.name) && KDRandom() < chance) { + let customs: any[] = KDPatronCustomEnemies.get(Enemy.name).filter((element) => { + return !KDGameData.NamesGenerated[element.name] + && (element.prisoner && KDEnemyHasFlag(e, "imprisoned")) + || (element.free && !KDEnemyHasFlag(e, "imprisoned")); + }); + if (customs.length > 0) { + let custom = customs[Math.floor(customs.length * KDRandom())]; + e.CustomName = custom.name; + e.CustomNameColor = custom.color; + e.CustomSprite = custom.customSprite; + if (custom.customPlayLine) { + e.playLine = custom.customPlayLine; + } + if (custom.customStyle) { + e.style = custom.customStyle; + } + if (custom.customOutfit) { + e.outfit = custom.customOutfit; + } + if (custom.customOutfitBound) { + e.outfitBound = custom.customOutfitBound; + } + if (custom.customIntro) { + e.intro = custom.customIntro; + } + if (makePersistent) { + KDMakePersistent(e, custom); + } + return custom; + } + } + return undefined; +} + + +/** + * @param pets + * @param e + * @param index + */ +function KDProcessCustomPatronPet(pets: any[], e: entity, index: number): any { + if (pets) { + let customs = pets[e.Enemy.name]; + if (customs?.length > 0 && index < customs.length) { + let custom = customs[index]; + e.CustomName = custom.name; + e.CustomNameColor = custom.color; + e.CustomSprite = custom.customSprite; + if (custom.customPlayLine) { + e.playLine = custom.customPlayLine; + } + if (custom.customStyle) { + e.style = custom.customStyle; + } + if (custom.customOutfit) { + e.outfit = custom.customOutfit; + } + if (custom.customOutfitBound) { + e.outfitBound = custom.customOutfitBound; + } + if (custom.customIntro) { + e.intro = custom.customIntro; + } + return custom; + } + } + return undefined; +} diff --git a/Game/src/base/KinkyDungeonDraw.ts b/Game/src/base/KinkyDungeonDraw.ts new file mode 100644 index 000000000..89d4a8361 --- /dev/null +++ b/Game/src/base/KinkyDungeonDraw.ts @@ -0,0 +1,5402 @@ +"use strict"; + +interface KDLight { + x: number, + y: number, + y_orig?: number, + x_orig?: number, + visualxoffset?: number, + visualyoffset?: number, + brightness: number, + color: number, + nobloom?: boolean, +} + +let KDDebugOverlay = false; +let CHIBIMODEND: PoseMod[] = [ + { + Layer: "HairBack", + scale_x: 1.0, + scale_y: 0.7, + rotation_x_anchor: 1220, + rotation_y_anchor: 420, + offset_x: 1220, + offset_y: 420, + }, + { + Layer: "HairPonytail", + scale_x: 1.0, + scale_y: 0.7, + rotation_x_anchor: 1220, + rotation_y_anchor: 420, + offset_x: 1220, + offset_y: 420, + }, +];let CHIBIMOD: PoseMod[] = [ + { + Layer: "Head", + scale_x: 2.25, + scale_y: 2.25, + rotation_x_anchor: 1190, + rotation_y_anchor: 690, + offset_x: 1100, + offset_y: 620, + }, +]; + +let KDInspectCamera = {x: 0, y: 0}; + +let KDRecentRepIndex = 0; + + +let KDWallReplacers = "14f6,dDzZbgS"; + +let KinkyDungeonSuppressSprint = true; + +let KDReturnButtonXX = 1450; + +let KDIntenseFilter = null; + +let KDButtonHovering = false; + +let KDDistractionFlashTime = 700; +let KDDistractionFlashStrengthTime = 200; +let KDDistractionFlashStrength = 0; +let KDDistractionFlashLastTime = 0; + + +let KDAnimTick = 0; +let KDAnimTickInterval = 2000; +let KDAnimTime = 1600; + +let KDFloatAnimTime = 4000; +let KDSquishyAnimTime = 2000; +let KDBreathAnimTime = 1400; + +let KDFlipPlayer = false; + +// PIXI experimental +let pixiview: HTMLCanvasElement = null; +let pixirenderer = null; +let pixirendererKD = null; +let kdgamefog = new PIXI.Graphics(); + +let kdBGMask = new PIXI.Graphics(); +kdBGMask.zIndex = -99; +//let kdgamefogmask = new PIXI.Graphics(); +let kdgamefogsmoothDark = new PIXI.Container(); +kdgamefogsmoothDark.zIndex = -1.05; +let kdgamefogsmooth = new PIXI.Container(); +kdgamefogsmooth.zIndex = -1.1; +//kdgamefogsmooth.mask = kdgamefogmask; +kdgamefog.zIndex = -1; +let kdgamesound = new PIXI.Container(); +kdgamesound.zIndex = 1; +let kdsolidcolorfilter = new PIXI.Filter(null, KDShaders.Solid.code, {}); +let kdoutlinefilter = new PIXI.filters.OutlineFilter(2, 0xffffff, 0.1, 0.5, true); +//let kdVisionBlurfilter = StandalonePatched ? new PIXI.filters.KawaseBlurFilter(10, 1) : undefined; + +kdgamesound.filters = [kdoutlinefilter]; + + +let KDOutlineFilterCache = new Map(); + +let kdminimap = new PIXI.Graphics(); +kdminimap.x = 500; +kdminimap.y = 10; +kdminimap.zIndex = 80; +kdminimap.sortableChildren = true; + +let kdmapboard = new PIXI.Container(); +kdmapboard.zIndex = -2; +kdmapboard.filterArea = new PIXI.Rectangle(0, 0, 2000, 1000); + +let kdlightmap = null; +let kdlightmapGFX = null; + +let kdbrightnessmap = null; +let kdbrightnessmapGFX = null; + +if (StandalonePatched) { + let res = KDResolutionList[parseFloat(localStorage.getItem("KDResolution")) || 0]; + kdbrightnessmapGFX = new PIXI.Container(); + kdbrightnessmap = PIXI.RenderTexture.create({ width: res > 1 ? 2047 : 2000, height: res > 1 ? 1023 : 1000,}); + + kdlightmapGFX = new PIXI.Graphics(); + kdlightmap = PIXI.RenderTexture.create({ width: res > 1 ? 2047 : 2000, height: res > 1 ? 1023 : 1000,}); + //kdlightmapGFX.filterArea = new PIXI.Rectangle(0, 0, 2000, 1000); +} + + + +let kddarkdesaturatefilter = new PIXI.Filter(null, KDShaders.Darkness.code, { + radius: .02*72/2000, + weight: 0.24, + mult: 1.1, + lum_cutoff: 0.65, + lum_cutoff_rate: 3.5, + brightness: 1, + brightness_rate: 0.7, + contrast: 1, + contrast_rate: 0.03, +}); +let kdfogfilter = new PIXI.Filter(null, KDShaders.FogFilter.code, { + lightmap: kdlightmap, + brightness: 1, + brightness_rate: 0., + contrast: 1, + contrast_rate: 0.03, + saturation: 0, +}); +//kdfogfilter.resolution = KDResolutionList[parseFloat(localStorage.getItem("KDResolution")) || 0]; +let kdgammafilterstore = [1.0]; +let kdgammafilter = new PIXI.Filter(null, KDShaders.GammaFilter.code, { + gamma: kdgammafilterstore, +}); +let kdmultiplyfilter = new PIXI.Filter(null, KDShaders.MultiplyFilter.code, { + lightmap: kdbrightnessmap, +}); + +let KDBoardFilters = [kdmultiplyfilter, kdfogfilter]; + +kdmapboard.filters = [ + ...KDBoardFilters, + kdgammafilter, +]; + + +let kdenemyboard = new PIXI.Container(); +kdenemyboard.zIndex = 0; +kdenemyboard.sortableChildren = true; +let kdenemystatusboard = new PIXI.Container(); +kdenemystatusboard.zIndex = 4; +kdenemystatusboard.sortableChildren = true; +let kdbulletboard = new PIXI.Container(); +kdbulletboard.zIndex = 2.3; +kdbulletboard.sortableChildren = true; +let kdeffecttileboard = new PIXI.Container(); +kdeffecttileboard.zIndex = -0.1; +kdeffecttileboard.sortableChildren = true; +let kdUItext = new PIXI.Container(); +kdUItext.zIndex = 60; +kdUItext.sortableChildren = true; +let kdstatusboard = new PIXI.Container(); +kdstatusboard.zIndex = 5; +kdstatusboard.sortableChildren = true; +let kdfloatercanvas = new PIXI.Container(); +kdfloatercanvas.zIndex = 200; +kdfloatercanvas.sortableChildren = false; +kdstatusboard.addChild(kdfloatercanvas); + +let kddialoguecanvas = new PIXI.Container(); +kddialoguecanvas.zIndex = 60; +kddialoguecanvas.sortableChildren = false; +kdstatusboard.addChild(kddialoguecanvas); +let kdenemydialoguecanvas = new PIXI.Container(); +kdenemydialoguecanvas.zIndex = 60; +kdenemydialoguecanvas.sortableChildren = false; +kdstatusboard.addChild(kdenemydialoguecanvas); + + +let kditemsboard = new PIXI.Container(); +kditemsboard.zIndex = -2; +kditemsboard.sortableChildren = false; +let kdwarningboard = new PIXI.Container(); +kdwarningboard.zIndex = -0.3; +kdwarningboard.sortableChildren = true; +let kdwarningboardOver = new PIXI.Container(); +kdwarningboardOver.zIndex = 2.22; +kdwarningboardOver.sortableChildren = false; +// @ts-ignore +let kdgameboard = new PIXI.Container(); +kdgameboard.sortableChildren = true; +kdgameboard.zIndex = -50; +kdgameboard.addChild(kdmapboard); +kdgameboard.addChild(kdwarningboard); +kdgameboard.addChild(kdbulletboard); +kdgameboard.addChild(kdenemyboard); +kdgameboard.addChild(kdeffecttileboard); +kdgameboard.addChild(kdgamesound); +kdgameboard.addChild(kdwarningboardOver); +kdgameboard.addChild(kditemsboard); +// @ts-ignore +let kdui = new PIXI.Graphics(); +let kdcanvas = new PIXI.Container(); +kdcanvas.sortableChildren = true; +kdcanvas.addChild(kdstatusboard); +kdcanvas.addChild(kdenemystatusboard); +kdcanvas.addChild(kdUItext); +kdcanvas.addChild(kdminimap); + +kdcanvas.addChild(kdBGMask); + +//kdcanvas.addChild(new PIXI.Sprite(kdlightmap)); + +let statusOffset = 0; + +kdgameboard.addChild(kdgamefogsmooth); +kdgameboard.addChild(kdgamefogsmoothDark); + +if (StandalonePatched) { + + statusOffset -= 20; + kdgameboard.addChild(kdgamefog); + //kdgameboard.addChild(kdgamefogmask); + kdcanvas.addChild(kdgameboard); + +} + + +let kdparticles = new PIXI.Container(); +kdparticles.zIndex = 10; +kdparticles.sortableChildren = false; +kdcanvas.addChild(kdparticles); +//kdgameboard.addChild(kdparticles); + +let KDTextWhite = "#ffffff"; +let KDTextGray3 = "#aaaaaa"; +let KDBookTextNew = "#efefef"; +let KDTextTanNew = "#222222"; +let KDBookTextSB = "#000000"; +let KDTextTanSB = "#d6cbc5"; +let KDBookText = KDBookTextNew; +let KDTextTan = KDTextTanNew; +let KDTextGray2 = "#333333"; +let KDTextGray1 = "#111111"; +let KDTextGray05 = "#030303"; +let KDTextGray0 = "#000000"; +let KDTextGreen1 = "#001100"; +let KDTextBlue1 = "#000011"; +let KDTextRed1 = "#110000"; +let KDCurseColor = "#ff55aa"; +let KDGoodColor = "#77ff99"; + +let KDTutorialColor = "#00ffff"; + +let kdSpritesDrawn: Map = new Map(); +let kdRTlastLookup: Map = new Map(); +let kdTexlastLookup: Map = new Map(); + + +let kdlightsprites: Map = new Map(); +let kdpixisprites: Map = new Map(); +let kdRTcache: Map = new Map(); +let kdRTSpritecache: Map = new Map(); +let kdTexcache: Map = new Map(); +let kdminimapsprites: Map = new Map(); +let kdpixifogsprites: Map = new Map(); +let kdpixibrisprites: Map = new Map(); + +/** Filters associated with a sprite, to be deleted*/ +let kdFilterSprites: Map = new Map(); + + + + +let kdprimitiveparams: Map = new Map(); + +let kdpixitex: Map = new Map(); + +/** + * @param x + * @param y + * @param [noReplace] + */ +function KDWallVert(x: number, y: number, noReplace?: string): boolean { + //let tileUp = KinkyDungeonMapGet(x, y); + let tileBelow = KinkyDungeonMapGet(x, y + 1); + if ( + // These are the tiles that trigger a replacement + (KDWallReplacers.includes(tileBelow) + && (!noReplace || !noReplace.includes(tileBelow))) + ) + return true; + + if (!KinkyDungeonVisionGet(x, y + 1) && !(KinkyDungeonFogGet(x, y + 1) > 0)) return true; + + return false; +} +/** + * @param x + * @param y + * @param [noReplace] + */ +function KDWallVertAbove(x: number, y: number, noReplace?: string): boolean { + //let tileUp = KinkyDungeonMapGet(x, y); + let tileAbove = KinkyDungeonMapGet(x, y - 1); + if ( + // These are the tiles that trigger a replacement + KDWallReplacers.includes(tileAbove) + && (!noReplace || !noReplace.includes(tileAbove)) + ) + return true; + + return false; +} +/** + * @param x + * @param y + * @param [noReplace] + */ +function KDWallVertBoth(x: number, y: number, noReplace?: string): boolean { + //let tileUp = KinkyDungeonMapGet(x, y); + let tileBelow = KinkyDungeonMapGet(x, y + 1); + let tileAbove = KinkyDungeonMapGet(x, y - 1); + if ( + // These are the tiles that trigger a replacement + KDWallReplacers.includes(tileBelow) + && (!noReplace || !noReplace.includes(tileBelow)) + && KDWallReplacers.includes(tileAbove) + && (!noReplace || !noReplace.includes(tileAbove)) + ) + return true; + + return false; +} +/** + * @param x + * @param y + */ +function KDWallHorizTunnel(x: number, y: number): boolean { + //let tileUp = KinkyDungeonMapGet(x, y); + let tileUp = KinkyDungeonMapGet(x, y - 1); + let tileBelow = KinkyDungeonMapGet(x, y + 1); + if ( + // These are the tiles that trigger a replacement + KinkyDungeonWallTiles.includes(tileUp) + && KinkyDungeonWallTiles.includes(tileBelow) + ) + return true; + + return false; +} +/** + * @param x + * @param y + * @returns {boolean} + */ +function KDWallVertTunnel(x: number, y: number): boolean { + //let tileUp = KinkyDungeonMapGet(x, y); + let tileRight = KinkyDungeonMapGet(x + 1, y); + let tileLeft = KinkyDungeonMapGet(x - 1, y); + if ( + // These are the tiles that trigger a replacement + KinkyDungeonWallTiles.includes(tileRight) + && KinkyDungeonWallTiles.includes(tileLeft) + ) + return true; + + return false; +} + +let KDChainablePillar = 'bdD'; + + +const KDSprites: KDSprites = { + "5": (x, y, _Fog, _noReplace) => { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile?.Sprite) return tile.Sprite; + return "Floor"; + }, + "6": (x, y, _Fog, _noReplace) => { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile?.Sprite) return tile.Sprite; + return "Wall"; + }, + "1": (x, y, _Fog, noReplace) => { + if (KDWallVert(x, y, noReplace)) + return "WallVert"; + return "Wall"; + }, + "f": (x, y, _Fog, noReplace) => { // Reinforced wall + if (KDWallVert(x, y, noReplace)) + return "WallRVert"; + return "WallR"; + }, + "2": (_x, _y, _Fog, _noReplace) => { + return "Brickwork"; + }, + "3": (_x, _y, Fog, _noReplace) => { + return Fog ? "Doodad" : "MimicBlock"; + }, + "b": (x, y, _Fog, noReplace) => { + if (KDWallVertAbove(x, y, noReplace)) + return KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "BarsVertCont" : "BarsVert"; + return "Bars"; + }, + "X": (_x, _y, _Fog, _noReplace) => { + return "Doodad"; + }, + "4": (x, y, _Fog, noReplace) => { + if (KDWallVert(x, y, noReplace)) + return "WallVert"; + return "Wall"; + }, + "L": (x, y, _Fog, _noReplace) => { + if (KinkyDungeonTilesGet(x + "," + y)) { + let furn = KinkyDungeonTilesGet(x + "," + y).Furniture ? KDFurniture[KinkyDungeonTilesGet(x + "," + y).Furniture] : ""; + if (furn) { + return furn.floor; + } + } + return "Barrel"; + }, + "F": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "?": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "/": (_x, _y, _Fog, _noReplace) => { + return "RubbleLooted"; + }, + ",": (x, y, _Fog, noReplace) => { + if (KDWallVert(x, y, noReplace)) + return "WallVert"; + return "Wall"; + }, + "D": (x, y, Fog, noReplace) => { + if (KinkyDungeonTilesGet(x + "," + y)?.DoorSkin) { + if (KDWallVertBoth(x, y, noReplace)) return "Floor"; + return "Wall"; + } + if (Fog) { + if (KDMapData.TilesMemory[x + "," + y]) return KDMapData.TilesMemory[x + "," + y]; + } + if (KDWallVertBoth(x, y, noReplace)) + KDMapData.TilesMemory[x + "," + y] = KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "DoorVertCont" : "DoorVert"; + else KDMapData.TilesMemory[x + "," + y] = "Door"; + return KDMapData.TilesMemory[x + "," + y]; + }, + "d": (x, y, Fog, noReplace) => { + if (KinkyDungeonTilesGet(x + "," + y)?.DoorSkin) { + if (KDWallVertBoth(x, y, noReplace)) return "Floor"; + return "Wall"; + } + if (Fog) { + if (KDMapData.TilesMemory[x + "," + y]) return KDMapData.TilesMemory[x + "," + y]; + } + if (KDWallVertBoth(x, y, noReplace)) + KDMapData.TilesMemory[x + "," + y] = KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "DoorVertOpenCont" : "DoorVertOpen"; + else KDMapData.TilesMemory[x + "," + y] = "DoorOpen"; + return KDMapData.TilesMemory[x + "," + y]; + }, + "Z": (x, y, Fog, noReplace) => { + if (Fog) { + if (KDMapData.TilesMemory[x + "," + y]) return KDMapData.TilesMemory[x + "," + y]; + } + if (KDWallVertBoth(x, y, noReplace)) + KDMapData.TilesMemory[x + "," + y] = KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "DoorVertCont" : "DoorVert"; + else KDMapData.TilesMemory[x + "," + y] = "Door"; + return KDMapData.TilesMemory[x + "," + y]; + }, + "z": (x, y, Fog, noReplace) => { + if (Fog) { + if (KDMapData.TilesMemory[x + "," + y]) return KDMapData.TilesMemory[x + "," + y]; + } + if (KDWallVertBoth(x, y, noReplace)) + KDMapData.TilesMemory[x + "," + y] = KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "DoorVertOpenCont" : "DoorVertOpen"; + else KDMapData.TilesMemory[x + "," + y] = "DoorOpen"; + return KDMapData.TilesMemory[x + "," + y]; + }, + "a": (_x, _y, _Fog, _noReplace) => { + return "ShrineBroken"; + }, + "A": (x, y, _Fog, _noReplace) => { + return (KinkyDungeonTilesGet(x + "," + y) && KinkyDungeonTilesGet(x + "," + y).Type == "Shrine" && KinkyDungeonTilesGet(x + "," + y).Name == "Commerce") ? "ShrineC" : ( + (KinkyDungeonTilesGet(x + "," + y) && KinkyDungeonTilesGet(x + "," + y).drunk) ? "ShrineEmpty" : "Shrine" + ); + }, + "H": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "s": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "S": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "g": (x, y, _Fog, _noReplace) => { + if (KDWallHorizTunnel(x, y)) + return "GrateHoriz"; + else if (!KDWallVert(x, y)) { + return "Grate"; + } else if (KDWallVertTunnel(x, y)) { + return "GrateVert"; + } + return "Grate"; + }, + "r": (_x, _y, _Fog, _noReplace) => { + return "RubbleLooted"; + }, + "T": (_x, _y, _Fog, _noReplace) => { + return (KinkyDungeonBlindLevel > 0) ?"Floor" : "Trap"; + }, + "Y": (_x, _y, _Fog, _noReplace) => { + return "Doodad"; + }, + "R": (_x, _y, _Fog, _noReplace) => { + return "RubbleLooted"; + }, + "m": (_x, _y, _Fog, _noReplace) => { + return "Brickwork"; + }, + "M": (_x, _y, _Fog, _noReplace) => { + return "Brickwork"; + }, + "O": (_x, _y, _Fog, _noReplace) => { + return "OrbEmpty"; + }, + "P": (_x, _y, _Fog, _noReplace) => { + return "OrbEmpty"; + }, + "p": (_x, _y, _Fog, _noReplace) => { + return "OrbEmpty"; + }, + "o": (_x, _y, _Fog, _noReplace) => { + return "OrbEmpty"; + }, + "w": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "W": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "]": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "[": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "=": (_x, _y, _Fog, _noReplace) => { + return "Brickwork"; + }, + "+": (_x, _y, _Fog, _noReplace) => { + return "Brickwork"; + }, + "-": (_x, _y, _Fog, _noReplace) => { + return "Brickwork"; + }, + "l": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + ";": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "V": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "v": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "t": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "u": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, + "N": (_x, _y, _Fog, _noReplace) => { + return "Floor"; + }, +}; + +const KDOverlays: KDSprites = { + "5": (x, y, _Fog, _noReplace) => { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile?.Overlay) return tile.Overlay; + return ""; + }, + "6": (x, y, _Fog, _noReplace) => { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile?.Overlay) return tile.Overlay; + return ""; + }, + "7": (x, y, _Fog, _noReplace) => { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile?.Overlay) return tile.Overlay; + return ""; + }, + "Z": (_x, _y, _Fog, _noReplace) => { + return "Signal/AutoLock"; + }, + "H": (_x, _y, _Fog, _noReplace) => { + let l = KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(_x - 1, _y)); + let r = KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(_x + 1, _y)); + let u = KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(_x, _y - 1)); + let d = KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(_x, _y + 1)); + return (u && !d && l && r) ? "StairsDown" : "SpiralStairsDown"; + }, + "s": (_x, _y, _Fog, _noReplace) => { + let l = KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(_x - 1, _y)); + let r = KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(_x + 1, _y)); + let u = KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(_x, _y - 1)); + let d = KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(_x, _y + 1)); + return (!d && u) ? "StairsDown" : "SpiralStairsDown"; + }, + "S": (_x, _y, _Fog, _noReplace) => { + let u = KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(_x, _y - 1)); + let d = KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(_x, _y + 1)); + return (u) ? "StairsUp" : "SpiralStairsUp"; + }, + "-": (_x, _y, _Fog, _noReplace) => { + return "ChargerSpent"; + }, + "l": (_x, _y, _Fog, _noReplace) => { + return "Leyline"; + }, + ";": (x, y, _Fog, _noReplace) => { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile?.Portal) return tile.Portal; + return ""; + }, + "+": (_x, _y, _Fog, _noReplace) => { + return "Charger"; + }, + "=": (_x, _y, _Fog, _noReplace) => { + return "ChargerCrystal"; + }, + "Y": (_x, _y, _Fog, _noReplace) => { + return "Rubble"; + }, + "/": (_x, _y, _Fog, _noReplace) => { + return "Scrap"; + }, + "R": (_x, _y, _Fog, _noReplace) => { + return "Rubble"; + }, + "$": (_x, _y, _Fog, _noReplace) => { + return "Angel"; + }, + "m": (_x, _y, _Fog, _noReplace) => { + return "TabletSpent"; + }, + "M": (x, y, _Fog, _noReplace) => { + if (KinkyDungeonTilesGet(x + "," + y) && !Object.keys(KinkyDungeonGoddessRep).includes(KinkyDungeonTilesGet(x + "," + y).Name)) return "Tablet" + KinkyDungeonTilesGet(x + "," + y).Name; + return "Tablet"; + }, + "[": (_x, _y, _Fog, _noReplace) => { + return "Spores"; + }, + "]": (_x, _y, _Fog, _noReplace) => { + return "HappyGas"; + }, + "w": (_x, _y, _Fog, _noReplace) => { + return "Water"; + }, + "W": (_x, _y, _Fog, _noReplace) => { + return "Water"; + }, + "O": (_x, _y, _Fog, _noReplace) => { + return "Orb"; + }, + "P": (_x, _y, _Fog, _noReplace) => { + return "Perk"; + }, + ",": (_x, _y, _Fog, _noReplace) => { + return "HookLow"; + }, + "?": (_x, _y, _Fog, _noReplace) => { + return "HookHigh"; + }, + "B": (_x, _y, _Fog, _noReplace) => { + return "Bed"; + }, + "G": (x, y, _Fog, _noReplace) => { + let sprite = "Ghost"; + if (KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Msg || KinkyDungeonTilesGet(x + "," + y).Dialogue)) { + sprite = "GhostImportant"; + } + return sprite; + }, + "L": (x, y, _Fog, _noReplace) => { + if (KinkyDungeonTilesGet(x + "," + y)) { + let furn = KinkyDungeonTilesGet(x + "," + y).Furniture ? KDFurniture[KinkyDungeonTilesGet(x + "," + y).Furniture] : ""; + if (furn) { + return furn.sprite; + } + } + }, + "F": (x, y, _Fog, _noReplace) => { + let sprite = "Table"; + if (KinkyDungeonTilesGet(x + "," + y)) { + let table = "Table"; + if (KinkyDungeonTilesGet(x + "," + y).Food) { + sprite = table + KinkyDungeonTilesGet(x + "," + y).Food; + } + } + return sprite; + }, + "4": (x, y, _Fog, _noReplace) => { + let left = KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x - 1, y)); + let right = KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 1, y)); + let up = KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x, y - 1)); + let down = KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x, y + 1)); + if (down) { + return "Crack"; + } else if (up) { + return "CrackHoriz"; + } else if (left && right) { + return "CrackVert"; + } else if (left) { + return "CrackLeft"; + } else if (right) { + return "CrackRight"; + } + return "CrackNone"; + }, + + + + "c": (x, y, _Fog, _noReplace) => { + return (KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "gold" || KinkyDungeonTilesGet(x + "," + y).Loot == "lessergold")) ? "ChestGoldOpen" : + ((KinkyDungeonTilesGet(x + "," + y) && (KDSpecialChests[KinkyDungeonTilesGet(x + "," + y).Loot])) ? KDSpecialChests[KinkyDungeonTilesGet(x + "," + y).Loot] + "Open" : + ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "blue")) ? "ChestBlueOpen" : + ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "dark")) ? "ChestDarkOpen" : + ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "pearl" || KinkyDungeonTilesGet(x + "," + y).Loot == "lesserpearl")) ? "ChestPearlOpen" : "ChestOpen")))); + }, + + "C": (x, y, _Fog, _noReplace) => { + return (KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "gold" || KinkyDungeonTilesGet(x + "," + y).Loot == "lessergold")) ? "ChestGold" : + ((KinkyDungeonTilesGet(x + "," + y) && (KDSpecialChests[KinkyDungeonTilesGet(x + "," + y).Loot])) ? KDSpecialChests[KinkyDungeonTilesGet(x + "," + y).Loot] : + ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "blue")) ? "ChestBlue" : + ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "dark")) ? "ChestDark" : + ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "pearl" || KinkyDungeonTilesGet(x + "," + y).Loot == "lesserpearl")) ? "ChestPearl" : "Chest")))); + }, + + + "@": (_x, _y, _Fog, _noReplace) => { + return "Signal/Button"; + }, + "V": (x, y, _Fog, _noReplace) => { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile) { + let tU = KinkyDungeonTilesGet(x + "," + (y - 1)); + let tD = KinkyDungeonTilesGet(x + "," + (y + 1)); + let tR = KinkyDungeonTilesGet((x + 1) + "," + y); + let tL = KinkyDungeonTilesGet((x - 1) + "," + y); + + let sprite = ""; + + if (tile.DY == -1) { + if (tD?.DY == -1) return "Conveyor/Up"; + if (tL?.DX == 1 && tR?.DX == -1) sprite = sprite + "LeftRight"; + else if (tL?.DX == 1) sprite = sprite + "Right"; + else if (tR?.DX == -1) sprite = sprite + "Left"; + sprite = sprite + "Up"; + } else if (tile.DY == 1) { + if (tU?.DY == 1) return "Conveyor/Down"; + if (tL?.DX == 1 && tR?.DX == -1) sprite = sprite + "LeftRight"; + else if (tL?.DX == 1 && !(tR?.DX == -1)) sprite = sprite + "Right"; + else if (tR?.DX == -1 && !(tL?.DX == 1)) sprite = sprite + "Left"; + sprite = sprite + "Down"; + } else if (tile.DX == 1) { + if (tU?.DY == 1 && tD?.DY == -1) sprite = sprite + "UpDown"; + else if (tU?.DY == 1) sprite = sprite + "Down"; + else if (tD?.DY == -1) sprite = sprite + "Up"; + sprite = sprite + "Right"; + } else if (tile.DX == -1) { + if (tU?.DY == 1 && tD?.DY == -1) sprite = sprite + "UpDown"; + else if (tU?.DY == 1) sprite = sprite + "Down"; + else if (tD?.DY == -1) sprite = sprite + "Up"; + sprite = sprite + "Left"; + } + + + return "Conveyor/" + sprite; + } + return "Conveyor/Conveyor"; + }, + "v": (x, y, _Fog, _noReplace) => { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile) { + let tU = KinkyDungeonTilesGet(x + "," + (y - 1)); + let tD = KinkyDungeonTilesGet(x + "," + (y + 1)); + let tR = KinkyDungeonTilesGet((x + 1) + "," + y); + let tL = KinkyDungeonTilesGet((x - 1) + "," + y); + + let sprite = ""; + + if (tile.DY == -1) { + if (tD?.DY == -1) return "Conveyor/SafetyUp"; + if (tL?.DX == 1 && tR?.DX == -1) sprite = sprite + "LeftRight"; + else if (tL?.DX == 1) sprite = sprite + "Right"; + else if (tR?.DX == -1) sprite = sprite + "Left"; + sprite = sprite + "Up"; + } else if (tile.DY == 1) { + if (tU?.DY == 1) return "Conveyor/SafetyDown"; + if (tL?.DX == 1 && tR?.DX == -1) sprite = sprite + "LeftRight"; + else if (tL?.DX == 1 && !(tR?.DX == -1)) sprite = sprite + "Right"; + else if (tR?.DX == -1 && !(tL?.DX == 1)) sprite = sprite + "Left"; + sprite = sprite + "Down"; + } else if (tile.DX == 1) { + if (tU?.DY == 1 && tD?.DY == -1) sprite = sprite + "UpDown"; + else if (tU?.DY == 1) sprite = sprite + "Down"; + else if (tD?.DY == -1) sprite = sprite + "Up"; + sprite = sprite + "Right"; + } else if (tile.DX == -1) { + if (tU?.DY == 1 && tD?.DY == -1) sprite = sprite + "UpDown"; + else if (tU?.DY == 1) sprite = sprite + "Down"; + else if (tD?.DY == -1) sprite = sprite + "Up"; + sprite = sprite + "Left"; + } + + + return "Conveyor/Safety" + sprite; + } + return "Conveyor/Conveyor"; + }, + "t": (_x, _y, _Fog, _noReplace) => { + return "DollTerminal"; + }, + "u": (_x, _y, _Fog, _noReplace) => { + return "DollSupply"; + }, + "N": (x, y, _Fog, _noReplace) => { + let tile = KinkyDungeonTilesGet(x + ',' + y); + let tileAbove = KinkyDungeonMapGet(x, y - 1); + let tileBelow = KinkyDungeonMapGet(x, y + 1); + if ((tileAbove == 'V' || tileAbove == 'v') && KinkyDungeonTilesGet(x + "," + (y-1))?.DY == 1) { + return `BondageMachine/${tile.Binding || "Latex"}Vert`; + } else if ((tileBelow == 'V' || tileBelow == 'v') && KinkyDungeonTilesGet(x + "," + (y+1))?.DY == -1) { + return `BondageMachine/${tile.Binding || "Latex"}Vert`; + } + + + return `BondageMachine/${tile.Binding || "Latex"}Horiz`; + }, + + "D": (x, y, Fog, noReplace) => { + let ds = KinkyDungeonTilesGet(x + "," + y)?.DoorSkin; + if (ds) { + if (Fog) { + if (KDMapData.TilesMemory[x + "," + y]) return KDMapData.TilesMemory[x + "," + y]; + } + if (KDWallVertBoth(x, y, noReplace)) + KDMapData.TilesMemory[x + "," + y] = ds + (KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "DoorVertCont" : "DoorVert"); + else KDMapData.TilesMemory[x + "," + y] = ds + "Door"; + return KDMapData.TilesMemory[x + "," + y]; + } + return ""; + }, + "d": (x, y, Fog, noReplace) => { + let ds = KinkyDungeonTilesGet(x + "," + y)?.DoorSkin; + if (ds) { + if (Fog) { + if (KDMapData.TilesMemory[x + "," + y]) return KDMapData.TilesMemory[x + "," + y]; + } + if (KDWallVertBoth(x, y, noReplace)) + KDMapData.TilesMemory[x + "," + y] = ds + (KDChainablePillar.includes(KinkyDungeonMapGet(x, y-1)) ? "DoorVertOpenCont" : "DoorVertOpen"); + else KDMapData.TilesMemory[x + "," + y] = ds + "DoorOpen"; + return KDMapData.TilesMemory[x + "," + y]; + } + return ""; + }, +}; + +const KDOverlays2: KDSprites = { + "V": (x, y, _Fog, _noReplace) => { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile && tile.SwitchMode != undefined) { + let sprite = ""; + + if (tile.DY == -1) { + sprite = sprite + "Up"; + } else if (tile.DY == 1) { + sprite = sprite + "Down"; + } else if (tile.DX == 1) { + sprite = sprite + "Right"; + } else if (tile.DX == -1) { + sprite = sprite + "Left"; + } + if (tile.SwitchMode) sprite = sprite + tile.SwitchMode; + return "Conveyor/" + sprite; + } + return ""; + }, + "v": (x, y, _Fog, _noReplace) => { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile && tile.SwitchMode != undefined) { + let sprite = ""; + + if (tile.DY == -1) { + sprite = sprite + "Up"; + } else if (tile.DY == 1) { + sprite = sprite + "Down"; + } else if (tile.DX == 1) { + sprite = sprite + "Right"; + } else if (tile.DX == -1) { + sprite = sprite + "Left"; + } + if (tile.SwitchMode) sprite = sprite + tile.SwitchMode; + return "Conveyor/Safety" + sprite; + } + return ""; + }, + "W": (_x, _y, _Fog, _noReplace) => { + return "WaterFoam"; + }, +}; + +function KinkyDungeonGetSprite(code: string, x: number, y: number, Fog: boolean, noReplace: string) { + let sprite = "Floor"; + if (KDSprites[code]) sprite = KDSprites[code](x, y, Fog, noReplace); + return sprite; +} + +/** For multilayer sprites */ +function KinkyDungeonGetSpriteOverlay2(code: string, x: number, y: number, Fog: boolean, noReplace: string) { + let sprite = ""; + if (KDOverlays2[code]) sprite = KDOverlays2[code](x, y, Fog, noReplace); + if (KinkyDungeonTilesGet(x + "," + y) && KinkyDungeonTilesGet(x + "," + y).Skin2) { + sprite = KinkyDungeonTilesGet(x + "," + y).Skin2; + } + return sprite; +} + +function KinkyDungeonGetSpriteOverlay(code: string, x: number, y: number, Fog: boolean, noReplace: string) { + let sprite = ""; + if (KDOverlays[code]) sprite = KDOverlays[code](x, y, Fog, noReplace); + if (KinkyDungeonTilesGet(x + "," + y) && KinkyDungeonTilesGet(x + "," + y).Skin) { + sprite = KinkyDungeonTilesGet(x + "," + y).Skin; + } + return sprite; +} + +let KDSpecialChests = { + "silver" : "ChestSilver", + "shadow" : "ChestShadow", + "lessershadow" : "ChestShadow", + "kitty" : "Chests/Kitty", + "robot" : "Chests/Robot", +}; + +let KDLastKeyTime: Record = {}; + +function KDDoModalX(_bdata) { + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + KDPlayerSetPose = false; +} + +function KDGetSpellRange(spell: spell): number { + let data = { + spell: spell, + range: spell.range || 0, + }; + KinkyDungeonSendEvent("calcSpellRange", data); + return data.range; +} + +// Draw function for the game portion +function KinkyDungeonDrawGame() { + KDCurrentEnemyTooltip = null; + + KinkyDungeonGridSizeDisplay = 72 + KDZoomLevels[KDZoomIndex] * 12; + + if (KDModalArea && KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game") { + let w = 34; + let h = 33; + DrawButtonKDEx("modalX", (bdata) => { + KDDoModalX(bdata); + return true; + }, true, + KDModalArea_x + KDModalArea_width - w - 1, + KDModalArea_y, + w, h, "", "#ffffff", KinkyDungeonRootDirectory + "UI/Xgold.png", undefined, undefined, true + ); + } + + // Breath the sound outlines + if (StandalonePatched) + kdoutlinefilter.alpha = 0.5 + 0.1 * Math.sin(2 * Math.PI * (CommonTime() % 2000 / 2000) ); + KDButtonHovering = false; + + let tooltips = []; + + if (KDPatched && KinkyDungeonDrawState == "Restart") { + DrawTextFitKD(TextGet("KinkyDungeon") + " v" + TextGet("KDVersionStr"), 1990, 50, 200, "#ffffff", KDTextGray2, undefined, "right"); + } + KDDrawMinimap(1990-KDMinimapWCurrent, 25); + KDDrawPartyMembers(500 + ((KDToggles.BuffSide && !KDToggleShowAllBuffs) ? 60 : 0), 500 + ((KDToggles.BuffSide && KDToggleShowAllBuffs) ? 175 : 0), tooltips); + + if (StandalonePatched) + PIXI.BaseTexture.defaultOptions.scaleMode = PIXI.SCALE_MODES.LINEAR; + + + let wt = 50; + if (KDGameData.FocusControlToggle.AutoWaitSlow) wt = 25; + else if (KDGameData.FocusControlToggle.AutoWaitNormal) wt = 50; + else if (KDGameData.FocusControlToggle.AutoWaitFast) wt = 75; + else if (KDGameData.FocusControlToggle.AutoWaitVeryFast) wt = 500; + + if (!KDGameData.LastSave) KDGameData.LastSave = KinkyDungeonCurrentTick; + if (KinkyDungeonCurrentTick > KDGameData.LastSave + wt && KinkyDungeonStatsChoice.get("saveMode") + && !KDSaveBusy) { + KDGameData.LastSave = KinkyDungeonCurrentTick + KinkyDungeonSaveGame(); + } + + if (KDRefresh) { + CharacterRefresh(KinkyDungeonPlayer); + } + KDNaked = false; + KDRefresh = false; + + + // @ts-ignore + if ((KinkyDungeonGameKey.keyPressed[9]) && !KinkyDungeonDrawStatesModal.includes(KinkyDungeonDrawState)) { + + // @ts-ignore + if (document.activeElement && (document.activeElement?.type == "text" || document.activeElement?.type == "textarea" || KDFocusableTextFields.includes(document.activeElement.id))) { + KinkyDungeonGameKey.keyPressed[9] = false; + } else { + let cancelType = null; + for (let cancelT of KDCustomCancels) { + if (cancelT.condition()) { + cancelType = cancelT.cancel; + break; + } + } + if (cancelType) { + cancelType(); + } else if (KinkyDungeonDrawState == "Magic") { + KinkyDungeonDrawState = "MagicSpells"; + KinkyDungeonGameKey.keyPressed[9] = false; + KinkyDungeonKeybindingCurrentKey = ''; + KinkyDungeonInspect = false; + KDInteracting = false; + } else if ((KinkyDungeonDrawState == "Collection" || KinkyDungeonDrawState == "Bondage") + && (KDCollectionTab || KDCurrentRestrainingTarget || KDCurrentFacilityTarget)) { + KDCollectionTab = ""; + if (KDCurrentFacilityTarget) { + KDCurrentFacilityTarget = ""; + KDFacilityCollectionCallback = null; + KinkyDungeonDrawState = "Facilities"; + } + KDCurrentRestrainingTarget = 0; + KinkyDungeonGameKey.keyPressed[9] = false; + KinkyDungeonKeybindingCurrentKey = ''; + KinkyDungeonInspect = false; + KDInteracting = false; + } else if (KDAlternateInventoryRender()) { + KDResetAlternateInventoryRender(); + KinkyDungeonGameKey.keyPressed[9] = false; + KinkyDungeonKeybindingCurrentKey = ''; + KinkyDungeonInspect = false; + KDInteracting = false; + } else { + KDLastForceRefresh = CommonTime() - KDLastForceRefreshInterval - 10; + KDPlayerSetPose = false; + KinkyDungeonInspect = false; + KDInteracting = false; + KinkyDungeonUpdateLightGrid = true; + KinkyDungeonDrawState = "Game"; + KinkyDungeonMessageToggle = false; + KinkyDungeonTargetingSpell = null; + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KinkyDungeonSpellPress = ""; + KDModalArea = false; + KDSetFocusControl(""); + KDCloseQuickInv(); + KDRepSelectionMode = ""; + KinkyDungeonGameKey.keyPressed[9] = false; + KinkyDungeonKeybindingCurrentKey = ''; + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + } + } + } + + KinkyDungeonCapStats(); + + if (ChatRoomChatLog.length > 0) { + let LastChatObject = ChatRoomChatLog[ChatRoomChatLog.length - 1]; + let LastChat = LastChatObject.Garbled; + let LastChatTime = LastChatObject.Time; + let LastChatSender = (LastChatObject.SenderName) ? LastChatObject.SenderName + ": " : ">"; + let LastChatMaxLength = 60; + + if (LastChat) { + LastChat = (LastChatSender + LastChat).substr(0, LastChatMaxLength); + if (LastChat.length == LastChatMaxLength) LastChat = LastChat + "..."; + if (LastChatTime && CommonTime() < LastChatTime + KinkyDungeonLastChatTimeout) + if (!KinkyDungeonSendTextMessage(0, LastChat, "#ffffff", 1) && LastChat != KinkyDungeonActionMessage) + if (!KinkyDungeonSendActionMessage(0, LastChat, "#ffffff", 1) && LastChat != KinkyDungeonTextMessage) + KinkyDungeonSendTextMessage(1, LastChat, "#ffffff", 1); + } + } + + + KinkyDungeonDrawDelta = Math.min(CommonTime() - KinkyDungeonLastDraw, KinkyDungeonLastDraw - KinkyDungeonLastDraw2); + KinkyDungeonLastDraw2 = KinkyDungeonLastDraw; + KinkyDungeonLastDraw = CommonTime(); + + if (!(KinkyDungeonDrawState == "MagicSpells")) { + KDSwapSpell = -1; + } + + if (KinkyDungeonDrawState == "Game") { + let tooltip = ""; + if ((KinkyDungeonIsPlayer() || (KinkyDungeonGameData && CommonTime() < KinkyDungeonNextDataLastTimeReceived + KinkyDungeonNextDataLastTimeReceivedTimeout))) { + + + KinkyDungeonUpdateVisualPosition(KinkyDungeonPlayerEntity, KinkyDungeonDrawDelta); + + if (!KinkyDungeonInspect) { + KDInspectCamera.x = KinkyDungeonPlayerEntity.x; + KDInspectCamera.y = KinkyDungeonPlayerEntity.y; + } + let OX = KDInspectCamera.x - (KinkyDungeonPlayerEntity.x||0); + let OY = KDInspectCamera.y - (KinkyDungeonPlayerEntity.y||0); + + let CamX = KinkyDungeonPlayerEntity.x - (KDToggles.Center ? 0 : Math.ceil(KinkyDungeonGridWidthDisplay/36)) - Math.floor(KinkyDungeonGridWidthDisplay/2) + OX;//Math.max(0, Math.min(KDMapData.GridWidth - KinkyDungeonGridWidthDisplay, KinkyDungeonPlayerEntity.x - Math.floor(KinkyDungeonGridWidthDisplay/2))); + let CamY = KinkyDungeonPlayerEntity.y - Math.floor(KinkyDungeonGridHeightDisplay/2) + OY;// Math.max(0, Math.min(KDMapData.GridHeight - KinkyDungeonGridHeightDisplay, KinkyDungeonPlayerEntity.y - Math.floor(KinkyDungeonGridHeightDisplay/2))); + + + let CamX_offsetVis = (KinkyDungeonInspect ? KDInspectCamera.x : KinkyDungeonPlayerEntity.visual_x) + - (KDToggles.Center ? 0 : Math.ceil(KinkyDungeonGridWidthDisplay/36)) - Math.floor(KinkyDungeonGridWidthDisplay/2) - CamX;//Math.max(0, Math.min(KDMapData.GridWidth - KinkyDungeonGridWidthDisplay, KinkyDungeonPlayerEntity.visual_x - Math.floor(KinkyDungeonGridWidthDisplay/2))) - CamX; + let CamY_offsetVis = (KinkyDungeonInspect ? KDInspectCamera.y : KinkyDungeonPlayerEntity.visual_y) - Math.floor(KinkyDungeonGridHeightDisplay/2) - CamY;//Math.max(0, Math.min(KDMapData.GridHeight - KinkyDungeonGridHeightDisplay, KinkyDungeonPlayerEntity.visual_y - Math.floor(KinkyDungeonGridHeightDisplay/2))) - CamY; + + + + + KinkyDungeonCamXVis = CamX + CamX_offsetVis; + KinkyDungeonCamYVis = CamY + CamY_offsetVis; + + if (CamX_offsetVis || CamY_offsetVis) { + KDRedrawFog = 2; + } + + if (StandalonePatched) { + kdgameboard.x = (-CamX_offsetVis) * KinkyDungeonGridSizeDisplay; + kdgameboard.y = (-CamY_offsetVis) * KinkyDungeonGridSizeDisplay; + kdbrightnessmapGFX.x = (-CamX_offsetVis) * KinkyDungeonGridSizeDisplay; + kdbrightnessmapGFX.y = (-CamY_offsetVis) * KinkyDungeonGridSizeDisplay; + kdlightmapGFX.x = (-CamX_offsetVis) * KinkyDungeonGridSizeDisplay; + kdlightmapGFX.y = (-CamY_offsetVis) * KinkyDungeonGridSizeDisplay; + kdenemystatusboard.x = kdgameboard.x; + kdenemystatusboard.y = kdgameboard.y; + kdenemydialoguecanvas.x = kdgameboard.x; + kdenemydialoguecanvas.y = kdgameboard.y; + + } + + let CamX_offset = (StandalonePatched ? 0 : CamX_offsetVis); + let CamY_offset = (StandalonePatched ? 0 : CamY_offsetVis); + + + + KinkyDungeonCamXLast = KinkyDungeonCamX; + KinkyDungeonCamYLast = KinkyDungeonCamY; + KinkyDungeonCamX = CamX; + KinkyDungeonCamY = CamY; + let KinkyDungeonForceRender = ""; + + let data = { + CamX: CamX, + CamY: CamY, + CamX_offsetVis: CamX_offsetVis, + CamY_offsetVis: CamY_offsetVis, + delta: KDDrawDelta, + tooltips: tooltips, + }; + + KinkyDungeonSetMoveDirection(); + + if (KinkyDungeonCanvas) { + KinkyDungeonContext.fillStyle = "rgba(0,0,0.0,1.0)"; + KinkyDungeonContext.fillRect(0, 0, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height); + KinkyDungeonContext.fill(); + let spriteRes = KDDrawMap(CamX, CamY, CamX_offset, CamY_offset, CamX_offsetVis, CamY_offsetVis, KDDebugOverlay); + + // Get lighting grid + if (KinkyDungeonUpdateLightGrid) { + KDUpdateFog = true; + KDUpdateVision(CamX, CamY, CamX_offset, CamY_offset); + } + // Draw fog of war + let CamPos = {x: CamX, y: CamY}; + if (CamPos.x != KDLastCamPos.x || CamPos.y != KDLastCamPos.y) KDUpdateFog = true; + KDLastCamPos = CamPos; + + // Draw fog of war + + KDDrawFog(CamX, CamY, CamX_offset, CamY_offset, CamX_offsetVis, CamY_offsetVis); + + tooltip = spriteRes.tooltip; + KinkyDungeonForceRender = spriteRes.KinkyDungeonForceRender; + + + KDDrawEffectTiles(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); + + if (KDToggles.PlayerAura && (KDToggles.ForceWarnings || KDMouseInPlayableArea())) { + let aura_scale = 0; + let aura_scale_max = 0; + for (let b of Object.values(KinkyDungeonPlayerBuffs)) { + if (b && b.aura && b.duration > 0) { + aura_scale_max += 1; + } + } + if (aura_scale_max > 0) { + let buffs = Object.values(KinkyDungeonPlayerBuffs); + buffs = buffs.sort((a, b) => {return b.duration - a.duration;}); + for (let b of buffs) { + if (b && b.aura && b.duration > 0 && !(b.aurasprite == "Null")) { + aura_scale += 1/aura_scale_max; + let s = aura_scale; + if (b.noAuraColor) { + KDDraw(kdstatusboard, kdpixisprites, b.id, KinkyDungeonRootDirectory + "Aura/" + (b.aurasprite ? b.aurasprite : "Aura") + ".png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s, + KinkyDungeonGridSizeDisplay * (1 + s), KinkyDungeonGridSizeDisplay * (1 + s), undefined, { + zIndex: 2.1, + }); + } else { + KDDraw(kdstatusboard, kdpixisprites, b.id, KinkyDungeonRootDirectory + "Aura/" + (b.aurasprite ? b.aurasprite : "Aura") + ".png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s, + KinkyDungeonGridSizeDisplay * (1 + s), KinkyDungeonGridSizeDisplay * (1 + s), undefined, { + tint: string2hex(b.aura), + zIndex: 2.1, + }); + } + + } + } + } + } + + + KinkyDungeonDrawItems(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); + + if (!kdpixitex.get("playertex")) { + kdpixitex.set("playertex", PIXI.Texture.from(KinkyDungeonCanvasPlayer)); + } + let playertex = kdpixitex.get("playertex"); + if (playertex) { + KDDraw(kdstatusboard, kdpixisprites, "player", "playertex", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 0.01, + }); + } + + if ((KDGameData.MovePoints < 0 || KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowLevel") > 0) && KinkyDungeonSlowLevel < 10) { + KDDraw(kdstatusboard, kdpixisprites, "c_slow", KinkyDungeonRootDirectory + "Conditions/Slow.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + if (KinkyDungeonStatBlind > 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_stun", KinkyDungeonRootDirectory + "Conditions/Stun.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + if (KinkyDungeonStatFreeze > 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_freeze", KinkyDungeonRootDirectory + "Conditions/Freeze.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + if (KinkyDungeonStatBind > 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_bind", KinkyDungeonRootDirectory + "Conditions/Bind.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak") > 0 || KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowDetection") > 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_sneak", KinkyDungeonRootDirectory + "Conditions/Sneak.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay - 30 + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + if (KDToggles.PlayerAura && (KDToggles.ForceWarnings || KDMouseInPlayableArea())) { + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackDmg") > 0 || KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackAcc") > 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_buff", KinkyDungeonRootDirectory + "Conditions/Buff.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackDmg") < 0 || KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackAcc") < 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_dbuff", KinkyDungeonRootDirectory + "Conditions/Debuff.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Evasion") > 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_eva", KinkyDungeonRootDirectory + "Conditions/EvasionBuff.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Block") > 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_blk", KinkyDungeonRootDirectory + "Conditions/BlockBuff.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellResist") > 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_shield", KinkyDungeonRootDirectory + "Conditions/ShieldBuff.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 0.01, + }); + } + else if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellResist") < 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_shield", KinkyDungeonRootDirectory + "Conditions/ShieldDeuff.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 0.01, + }); + } + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Armor") > 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_arm", KinkyDungeonRootDirectory + "Conditions/ArmorBuff.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } else if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Armor") < 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_armd", KinkyDungeonRootDirectory + "Conditions/ArmorDebuff.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "DamageAmp") > 0) { + KDDraw(kdstatusboard, kdpixisprites, "c_amp", KinkyDungeonRootDirectory + "Conditions/DamageAmp.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + } + if (!KDCanAttack()) { + KDDraw(kdstatusboard, kdpixisprites, "c_cantAttack", KinkyDungeonRootDirectory + "Conditions/Tired.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay * 0.5 + statusOffset, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + + KinkyDungeonDrawFight(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); + KinkyDungeonDrawEnemiesWarning(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); + KinkyDungeonDrawEnemies(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); + KinkyDungeonDrawEnemiesStatus(canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset); + + + KinkyDungeonSendEvent("draw",{update: KDDrawUpdate, CamX:CamX, CamY:CamY, CamX_offset: StandalonePatched ? CamX_offsetVis : CamX_offset, CamY_offset: StandalonePatched ? CamY_offsetVis : CamY_offset}); + KDDrawUpdate = 0; + KinkyDungeonSuppressSprint = false; + + + // Draw targeting reticule + if (!KinkyDungeonMessageToggle && !KDIsAutoAction() && !(KinkyDungeonShowInventory && !KinkyDungeonTargetingSpell) && KinkyDungeonIsPlayer() + && KDMouseInPlayableArea()) { + if (KinkyDungeonInspect) { + KinkyDungeonSetTargetLocation(!KinkyDungeonTargetingSpell && KDToggles.Helper); + + KDDraw(kdstatusboard, kdpixisprites, "ui_spellreticule", KinkyDungeonRootDirectory + "TargetSpell.png", + (KinkyDungeonTargetX - CamX)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 100, + }); + } else if (KDInteracting) { + KinkyDungeonSetTargetLocation(!KinkyDungeonTargetingSpell && KDToggles.Helper); + + KDDraw(kdstatusboard, kdpixisprites, "ui_spellreticule", KinkyDungeonRootDirectory + "UI/Interact.png", + (KinkyDungeonTargetX - CamX)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 100, + }); + } else if (KinkyDungeonTargetingSpell) { + KinkyDungeonSetTargetLocation(!KinkyDungeonTargetingSpell && KDToggles.Helper); + + KDDraw(kdstatusboard, kdpixisprites, "ui_spellreticule", KinkyDungeonRootDirectory + "TargetSpell.png", + (KinkyDungeonTargetX - CamX)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 100, + }); + + DrawTextKD(TextGet("KDCasting").replace("SPNME", TextGet("KinkyDungeonSpell" + KinkyDungeonTargetingSpell.name)), + (KinkyDungeonTargetX - CamX + 0.5)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - CamY - 0.5)*KinkyDungeonGridSizeDisplay, + "#8888ff" + ); + + let spellRange = KDGetSpellRange(KinkyDungeonTargetingSpell) * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "spellRange")); + + let spellValid = (x: number, y: number, projAimOverride?: boolean) => { + let free = KinkyDungeonOpenObjects.includes(KinkyDungeonMapGet(x, y)) || KinkyDungeonVisionGet(x, y) < 0.1; + if (!KinkyDungeonTargetingSpell.projectileTargeting && !KinkyDungeonTargetingSpell.CastInDark && !KinkyDungeonVisionGet(x, y)) return false; + let Valid = (!KinkyDungeonTargetingSpell.castCondition + || (!KDPlayerCastConditions[KinkyDungeonTargetingSpell.castCondition] || KDPlayerCastConditions[KinkyDungeonTargetingSpell.castCondition](KinkyDungeonPlayerEntity, x, y))) + && ( + ((!projAimOverride && KinkyDungeonTargetingSpell.projectileTargeting) + || spellRange >= Math.sqrt((x - KinkyDungeonPlayerEntity.x) *(x - KinkyDungeonPlayerEntity.x) + (y - KinkyDungeonPlayerEntity.y) * (y - KinkyDungeonPlayerEntity.y))) + && (KinkyDungeonTargetingSpell.projectileTargeting || KinkyDungeonTargetingSpell.CastInWalls || free) + && (!KinkyDungeonTargetingSpell.WallsOnly || !KinkyDungeonOpenObjects.includes(KinkyDungeonMapGet(x, y)))); + if (KinkyDungeonTargetingSpell.noTargetEnemies) { + let enemy = KinkyDungeonEnemyAt(x, y); + let faction = KDGetFaction(enemy); + if (enemy && (!KinkyDungeonTargetingSpell.exceptionFactions || !KinkyDungeonTargetingSpell.exceptionFactions.includes(faction))) + Valid = false; + } + if (KinkyDungeonTargetingSpell.noTargetAllies) { + let enemy = KinkyDungeonEnemyAt(x, y); + if (enemy && KDAllied(enemy)) + Valid = false; + } + if (KinkyDungeonTargetingSpell.selfTargetOnly && (KinkyDungeonPlayerEntity.x != x || KinkyDungeonPlayerEntity.y != y)) Valid = false; + if ((KinkyDungeonTargetingSpell.requireLOS || (projAimOverride && KinkyDungeonTargetingSpell.projectileTargeting + && (!KinkyDungeonTargetingSpell.piercing + && !KinkyDungeonTargetingSpell.noTerrainHit) + )) && + !KinkyDungeonCheckPath(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, x, y, + true, true, 1, true)) Valid = false; + if (KinkyDungeonTargetingSpell.noTargetPlayer && KinkyDungeonPlayerEntity.x == x && KinkyDungeonPlayerEntity.y == y) Valid = false; + if (KinkyDungeonTargetingSpell.mustTarget && KinkyDungeonNoEnemy(x, y, true)) Valid = false; + if (KinkyDungeonTargetingSpell.minRange && KDistEuclidean(x - KinkyDungeonPlayerEntity.x, y - KinkyDungeonPlayerEntity.y) < KinkyDungeonTargetingSpell.minRange) Valid = false; + + return Valid; + }; + + KinkyDungeonSpellValid = spellValid(KinkyDungeonTargetX, KinkyDungeonTargetY); + + if (KDToggles.ShowSpellRange ) { + for (let X = 0; X < KinkyDungeonGridWidthDisplay; X++) { + for (let Y = 0; Y < KinkyDungeonGridHeightDisplay; Y++) { + let XX = X + CamX; + let YY = Y + CamY; + if (KDIsInBounds(XX, YY, 1)) { + if (spellValid(XX, YY, true)) { + KDDraw(kdstatusboard, kdpixisprites, XX + "," + YY + "_range", KinkyDungeonRootDirectory + "SpellRange.png", + (X)*KinkyDungeonGridSizeDisplay, (Y)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 98, + }); + } + } + + } + } + } + + if (KinkyDungeonSpellValid) + if (KinkyDungeonTargetingSpell.projectileTargeting) { + let range = KinkyDungeonTargetingSpell.castRange; + if (!range || spellRange > range) range = spellRange; + let dist = Math.sqrt((KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x)*(KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x) + + (KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y)*(KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y)); + for (let R = 0; R <= Math.max(1, range - 1); R+= 0.1) { + let xx = KinkyDungeonMoveDirection.x + Math.round((KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x) * R / dist); + let yy = KinkyDungeonMoveDirection.y + Math.round((KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y) * R / dist); + if (KinkyDungeonVisionGet(xx + KinkyDungeonPlayerEntity.x, yy + KinkyDungeonPlayerEntity.y) > 0 && !KinkyDungeonForceRender) + KDDraw(kdstatusboard, kdpixisprites, xx + "," + yy + "_target", KinkyDungeonRootDirectory + "Target.png", + (xx + KinkyDungeonPlayerEntity.x - CamX)*KinkyDungeonGridSizeDisplay, (yy + KinkyDungeonPlayerEntity.y - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 99, + }); + } + } + else if (!KinkyDungeonForceRender) { + let rad = KinkyDungeonTargetingSpell.aoe ? KinkyDungeonTargetingSpell.aoe : 0.5; + for (let xxx = KinkyDungeonTargetX - Math.ceil(rad); xxx <= KinkyDungeonTargetX + Math.ceil(rad); xxx++) + for (let yyy = KinkyDungeonTargetY - Math.ceil(rad); yyy <= KinkyDungeonTargetY + Math.ceil(rad); yyy++) + if ( + AOECondition(KinkyDungeonTargetX, KinkyDungeonTargetY, xxx, yyy, rad, KinkyDungeonTargetingSpell.aoetype || "", KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) + ) + KDDraw(kdstatusboard, kdpixisprites, xxx + "," + yyy + "_target", KinkyDungeonRootDirectory + "Target.png", + (xxx - CamX)*KinkyDungeonGridSizeDisplay, (yyy - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 99, + }); + } + + } else if ((KinkyDungeonFastMove + && !(!KinkyDungeonSuppressSprint && KinkyDungeonToggleAutoSprint && KDCanSprint()) + && (KinkyDungeonMoveDirection.x != 0 || KinkyDungeonMoveDirection.y != 0))) { + KinkyDungeonSetTargetLocation(!KinkyDungeonTargetingSpell && KDToggles.Helper); + + + let allowFog = KDAllowFog(); + if (KinkyDungeonVisionGet(KinkyDungeonTargetX, KinkyDungeonTargetY) > 0 || (allowFog && KinkyDungeonFogGet(KinkyDungeonTargetX, KinkyDungeonTargetY) > 0) + || KDistChebyshev(KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x, KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y) < 1.5) { + KDDraw(kdstatusboard, kdpixisprites, "ui_movereticule", KinkyDungeonRootDirectory + "Target" + KDGetTargetRetType(KinkyDungeonTargetX, KinkyDungeonTargetY) + ".png", + (KinkyDungeonTargetX - CamX)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 100, + }); + if (KinkyDungeonSlowLevel < 10) { + //if (!KinkyDungeonEnemyAt(KinkyDungeonTargetX, KinkyDungeonTargetY) + //|| KDCanPassEnemy(KinkyDungeonPlayerEntity, KinkyDungeonEnemyAt(KinkyDungeonTargetX, KinkyDungeonTargetY))) { + let diststart = Math.max(1, Math.round(KinkyDungeonSlowLevel)); + let dist = diststart; + //let path = KinkyDungeonFindPath(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonTargetX, KinkyDungeonTargetY, false, false, true, KinkyDungeonMovableTilesSmartEnemy, false, false, false); + let requireLight = KinkyDungeonVisionGet(KinkyDungeonTargetX, KinkyDungeonTargetY) > 0; + let path = KinkyDungeonFindPath(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonTargetX, KinkyDungeonTargetY, + true, false, false, KinkyDungeonMovableTilesEnemy, requireLight, false, true, + undefined, false, undefined, false, true); + if (path?.length > 1) { + dist *= path.length; + } + if (KDGameData.MovePoints < 0) { + if (path?.length > 1) { + dist -= Math.min(0, KDGameData.MovePoints + 1); + } else dist = 1 - KDGameData.MovePoints; + } else if (!KDToggles.LazyWalk || KinkyDungeonInDanger()) { + if (path?.length > 1) { + dist -= Math.max(0, diststart - 1); + } else dist = 1; + } + dist = Math.ceil(Math.max(0, dist)); + DrawTextKD("x" + dist, (KinkyDungeonTargetX - CamX + 0.5)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - CamY + 0.5)*KinkyDungeonGridSizeDisplay, "#ffaa44"); + if (path && KDToggles.ShowPath) + for (let p of path) { + if (p.x != KinkyDungeonTargetX || p.y != KinkyDungeonTargetY) + KDDraw(kdstatusboard, kdpixisprites, `ui_movereticule_${p.x},${p.y}`, KinkyDungeonRootDirectory + "UI/PathDisplay.png", + (p.x - CamX)*KinkyDungeonGridSizeDisplay, (p.y - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 100, + }); + } + //} + } + } + } else if ((mouseDown && KDMouseInPlayableArea()) || (KinkyDungeonMoveDirection.x != 0 || KinkyDungeonMoveDirection.y != 0)) { + let xx = KinkyDungeonMoveDirection.x + KinkyDungeonPlayerEntity.x; + let yy = KinkyDungeonMoveDirection.y + KinkyDungeonPlayerEntity.y; + if (KinkyDungeonSlowLevel < 2 && MouseIn(canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay)) { + KinkyDungeonSuppressSprint = true; + } + if (!KinkyDungeonSuppressSprint && KinkyDungeonToggleAutoSprint && (KDCanSprint())) { + if (KinkyDungeonMoveDirection.x || KinkyDungeonMoveDirection.y) { + let newX = KinkyDungeonMoveDirection.x * (KinkyDungeonSlowLevel < 2 ? 2 : 1) + KinkyDungeonPlayerEntity.x; + let newY = KinkyDungeonMoveDirection.y * (KinkyDungeonSlowLevel < 2 ? 2 : 1) + KinkyDungeonPlayerEntity.y; + let tile = KinkyDungeonMapGet(newX, newY); + if (KinkyDungeonMovableTilesEnemy.includes(tile) && KinkyDungeonNoEnemy(newX, newY)) { + KDDraw(kdstatusboard, kdpixisprites, "ui_movesprint", KinkyDungeonRootDirectory + "Sprint.png", + (newX - CamX)*KinkyDungeonGridSizeDisplay, (newY - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 99, + }); + DrawTextKD(Math.round(-KDSprintCost()*10) + "sp", + (xx - CamX + 0.5)*KinkyDungeonGridSizeDisplay, + (yy - CamY - 0.25)*KinkyDungeonGridSizeDisplay, "#88ff88"); + + xx = newX; + yy = newY; + } + } + } else if ((KinkyDungeonSlowLevel > 1 || KDGameData.MovePoints < 0) && KinkyDungeonSlowLevel < 10) { + if (!KinkyDungeonEnemyAt(xx, yy) || KDCanPassEnemy(KinkyDungeonPlayerEntity, KinkyDungeonEnemyAt(xx, yy))) { + let dist = Math.max(1, Math.round(KinkyDungeonSlowLevel)); + + if (KDGameData.MovePoints < 0) { + dist = 1 - KDGameData.MovePoints; + } else if (!KDToggles.LazyWalk || KinkyDungeonInDanger()) dist = 1; + dist = Math.ceil(Math.max(0, dist)); + DrawTextKD("x" + dist, (xx - CamX + 0.5)*KinkyDungeonGridSizeDisplay, (yy - CamY + 0.5)*KinkyDungeonGridSizeDisplay, "#ffaa44"); + } + } + KDDraw(kdstatusboard, kdpixisprites, "ui_movereticule", KinkyDungeonRootDirectory + "Target" + KDGetTargetRetType(xx, yy) + ".png", + (xx - CamX)*KinkyDungeonGridSizeDisplay, (yy - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 100, + }); + + } + } + + + let cursorX = Math.round((MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamX; + let cursorY = Math.round((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamY; + if (KDMouseInPlayableArea() && (KinkyDungeonVisionGet(cursorX, cursorY) > 0 || tooltips.length > 0)) { + + let ambushTile = ""; + let enemy = KinkyDungeonEnemyAt(cursorX, cursorY); + if (enemy && KDCanSeeEnemy(KinkyDungeonEnemyAt(cursorX, cursorY))) { + if (!enemy.ambushtrigger && KDAIType[KDGetAI(KinkyDungeonEnemyAt(cursorX, cursorY))]?.ambushtile) { + ambushTile = KDAIType[KDGetAI(enemy)].ambushtile; + } else { + tooltips.push((offset: number) => KDDrawEnemyTooltip(enemy, offset)); + } + } + + if (!enemy && KDGameData.CurrentDialog) { + enemy = KDGetSpeaker(true); + if (enemy) + tooltips.push((offset: number) => KDDrawEnemyDialogue(enemy, offset)); + } + + let items = KDMapData.GroundItems.filter((item) => {return item.x == cursorX && item.y == cursorY;}); + if (items.length > 0) { + tooltips.push((offset: number) => KDDrawItemsTooltip(items, offset)); + } + + let eTiles = KDGetEffectTiles(cursorX, cursorY); + for (let etile of Object.values(eTiles)) { + if (KDEffectTileTooltips[etile.name] && KDCanSeeEffectTile(etile)) { + tooltips.push((offset: number) => KDDrawEffectTileTooltip(etile, cursorX, cursorY, offset)); + } + } + let tile = ambushTile || KinkyDungeonMapGet(cursorX, cursorY); + if (KDTileTooltips[tile] && (KinkyDungeonInspect || KDInteracting || KDTileTooltips[tile](cursorX, cursorY).noInspect)) { + tooltips.push((offset: number) => KDDrawTileTooltip(tile, cursorX, cursorY, offset)); + } + } else if (KDGameData.CurrentDialog) { + let enemy = KDGetSpeaker(); + if (enemy) + tooltips.push((offset: number) => KDDrawEnemyDialogue(enemy, offset)); + } + + let tooltipOffset = KDFocusControls ? 70 : 0; + for (let t of tooltips) { + tooltipOffset = t(tooltipOffset); + } + + if (KinkyDungeonFastMoveSuppress) { + DrawRectKD(kdcanvas, kdpixisprites, "redborder", { + Left: canvasOffsetX, + Top: canvasOffsetY, + Width: KinkyDungeonCanvas.width, + Height: KinkyDungeonCanvas.height, + Color: "#ff4444", + LineWidth: 2, + zIndex: 10, + }); + /*KinkyDungeonContext.beginPath(); + KinkyDungeonContext.rect(0, 0, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height); + KinkyDungeonContext.lineWidth = 4; + KinkyDungeonContext.strokeStyle = "#ff4444"; + KinkyDungeonContext.stroke();*/ + } + + if (KinkyDungeonLastTurnAction == "Struggle" && KinkyDungeonCurrentEscapingItem && KinkyDungeonCurrentEscapingItem.lock) { + KDDraw(kdstatusboard, kdpixisprites, "ui_lock", KinkyDungeonRootDirectory + "Lock.png", + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay - 60, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay); + } + + // Cull the sprites that werent rendered or updated this frame + for (let sprite of kdpixisprites.entries()) { + if (!kdSpritesDrawn.has(sprite[0]) && sprite[1] && sprite[1].parent == kdgameboard) { + sprite[1].parent.removeChild(sprite[1]); + if (kdprimitiveparams.has(sprite[0])) kdprimitiveparams.delete(sprite[0]); + kdpixisprites.delete(sprite[0]); + delete sprite[1].filters; + sprite[1].destroy(); + } + } + + + + } + + if (StandalonePatched) { + if (KDBGColor) { + FillRectKD(kdcanvas, kdpixisprites, "playerbg", { + Left: 0, + Top: 0, + Width: KinkyDungeonDrawState == "Game" ? 500 : 2000, + Height: 1000, + Color: KDBGColor, + zIndex: KinkyDungeonDrawState == "Game" ? -1 : -1000, + alpha: StandalonePatched ? KDUIAlpha : 0.01, + }); + } + DrawCharacter(KinkyDungeonPlayer, 0, 0, 1, undefined, undefined, undefined, undefined, KinkyDungeonDrawState == "Game" ? 0 : - 20, KDToggles.FlipPlayer); + + } + if (KinkyDungeonSleepiness) { + CharacterSetFacialExpression(KinkyDungeonPlayer, "Emoticon", "Sleep"); + } else CharacterSetFacialExpression(KinkyDungeonPlayer, "Emoticon", null); + + // Draw the player no matter what + + let PlayerModel = StandalonePatched ? KDCurrentModels.get(KinkyDungeonPlayer) : null; + let zoom = KDPlayerZoom(PlayerModel); + + if (KDDrawPlayer) + KDDrawChibi(PlayerModel.Character, + canvasOffsetX + + (KinkyDungeonPlayerEntity.visual_x - CamX - CamX_offsetVis)*KinkyDungeonGridSizeDisplay + + (KinkyDungeonGridSizeDisplay/4), + canvasOffsetY + + (KinkyDungeonPlayerEntity.visual_y - CamY - CamY_offsetVis)*KinkyDungeonGridSizeDisplay + + (KinkyDungeonGridSizeDisplay/6), + zoom); + + if (KDToggles.ShowFacing && (KinkyDungeonPlayerEntity.facing_y || KinkyDungeonPlayerEntity.facing_x)) { + KDDraw(kdstatusboard, kdpixisprites, "ui_playerfacing", KinkyDungeonRootDirectory + "UI/PlayerFacing.png", + (KinkyDungeonPlayerEntity.x + KinkyDungeonPlayerEntity.facing_x - CamX + 0.5)*KinkyDungeonGridSizeDisplay, + (KinkyDungeonPlayerEntity.y + KinkyDungeonPlayerEntity.facing_y - CamY + 0.5)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, Math.atan2(KinkyDungeonPlayerEntity.facing_y, KinkyDungeonPlayerEntity.facing_x), { + zIndex: 100, + anchorx: 0.5, + anchory: 0.5, + }); + } + + + KinkyDungeonDrawEnemiesHP(KDDrawDelta || 0, canvasOffsetX, canvasOffsetY, CamX+CamX_offset, CamY+CamY_offset, + StandalonePatched ? CamX_offsetVis : 0, StandalonePatched ? CamY_offsetVis : 0); + KinkyDungeonDrawFloaters(CamX+CamX_offsetVis, CamY+CamY_offsetVis); + + if (KinkyDungeonCanvas) { + if (KDToggles.ForceWarnings || KDMouseInPlayableArea()) { + let barInt = 0; + if (KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax*0.99) { + if (KinkyDungeonStatStamina != undefined && !(KinkyDungeonPlayerEntity.visual_stamina == KinkyDungeonStatStamina)) { + KinkyDungeonPlayerEntity.visual_stamina = KDEaseValue(KDDrawDelta || 0, (KinkyDungeonPlayerEntity.visual_stamina != undefined ? KinkyDungeonPlayerEntity.visual_stamina : KinkyDungeonStatStaminaMax), KinkyDungeonStatStamina, KDBarAdvanceRate, KDBarAdvanceRateMin * KinkyDungeonStatStaminaMax); + } + KinkyDungeonBar(canvasOffsetX + (KinkyDungeonPlayerEntity.visual_x - CamX-CamX_offsetVis)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (KinkyDungeonPlayerEntity.visual_y - CamY-CamY_offsetVis)*KinkyDungeonGridSizeDisplay - 12 - 13 * barInt, + KinkyDungeonGridSizeDisplay, 8, 100 * KinkyDungeonPlayerEntity.visual_stamina / KinkyDungeonStatStaminaMax, !KDCanAttack() ? "#ff5277" : "#44ff44", KDTextGray0); + barInt += 1; + } + if (KinkyDungeonStatMana < KinkyDungeonStatManaMax*0.99 || KinkyDungeonTargetingSpell || KDFlashMana > 0) { + KDFlashMana = Math.max(0, KDFlashMana - KDDrawDelta); + if (KinkyDungeonStatMana != undefined && !(KinkyDungeonPlayerEntity.visual_mana == KinkyDungeonStatMana)) { + KinkyDungeonPlayerEntity.visual_mana = KDEaseValue(KDDrawDelta || 0, (KinkyDungeonPlayerEntity.visual_mana != undefined ? KinkyDungeonPlayerEntity.visual_mana : KinkyDungeonStatManaMax), KinkyDungeonStatMana, KDBarAdvanceRate, KDBarAdvanceRateMin * KinkyDungeonStatManaMax); + } + KinkyDungeonBar(canvasOffsetX + (KinkyDungeonPlayerEntity.visual_x - CamX-CamX_offsetVis)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (KinkyDungeonPlayerEntity.visual_y - CamY-CamY_offsetVis)*KinkyDungeonGridSizeDisplay - 12 - 13 * barInt, + KinkyDungeonGridSizeDisplay, 8, 100 * KinkyDungeonPlayerEntity.visual_mana / KinkyDungeonStatManaMax, (KDFlashMana > 0 || (KinkyDungeonTargetingSpell && KinkyDungeonStatMana < + KinkyDungeonGetManaCost( + KinkyDungeonTargetingSpell, + !KinkyDungeonTargetingSpell.active && KinkyDungeonTargetingSpell.passive, + !KinkyDungeonTargetingSpell.active && KinkyDungeonTargetingSpell.type == "passive"))) ? + (KDFlashMana % 500 > 250 ? "#ffffff" : "#888888") : "#8888ff", (KDFlashMana % 500 > 250 ? "#444444" : KDTextGray0)); + barInt += 1; + } + } + /*for (let b of Object.values(KinkyDungeonPlayerBuffs)) { + if (b && b.aura && b.duration > 0 && b.duration < 999) { + if (!b.maxduration) b.maxduration = b.duration; + KinkyDungeonBar(canvasOffsetX + (KinkyDungeonPlayerEntity.visual_x - CamX-CamX_offsetVis)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (KinkyDungeonPlayerEntity.visual_y - CamY-CamY_offsetVis)*KinkyDungeonGridSizeDisplay - 12 - 13 * barInt, + KinkyDungeonGridSizeDisplay, 12, 100 * b.duration / b.maxduration, b.aura, KDTextGray0); + barInt += 1; + } + }*/ + + + + + + if (KinkyDungeonCurrentEscapingItem && KinkyDungeonFlags.get("escaping")) { + let item = KinkyDungeonCurrentEscapingItem; + let value = 0; + let value2 = 0; + let color = "#ecebe7"; + let color2 = "#ff5277"; + if (KinkyDungeonCurrentEscapingMethod == "Struggle") { + if (item.struggleProgress) + value = item.struggleProgress; + if (item.cutProgress) + value2 = item.cutProgress; + } else if (KinkyDungeonCurrentEscapingMethod == "Pick" && item.pickProgress) { + value = item.pickProgress; + color = "#ceaaed"; + } else if (KinkyDungeonCurrentEscapingMethod == "Remove") { + if (item.struggleProgress) + value = item.struggleProgress; + if (item.cutProgress) + value2 = item.cutProgress; + } else if (KinkyDungeonCurrentEscapingMethod == "Cut") { + if (item.struggleProgress) + value = item.struggleProgress; + if (item.cutProgress) + value2 = item.cutProgress; + } else if (KinkyDungeonCurrentEscapingMethod == "Unlock" && item.unlockProgress) { + value = item.unlockProgress; + color = "#d0ffea"; + } + let xAdd = 0; + let yAdd = 0; + if (KinkyDungeonStruggleTime > CommonTime()) { + xAdd = Math.round(-1 + 2*Math.random()); + yAdd = Math.round(-1 + 2*Math.random()); + } + if (value <= 1) + KinkyDungeonBar(canvasOffsetX + xAdd + (KinkyDungeonPlayerEntity.visual_x - CamX-CamX_offsetVis)*KinkyDungeonGridSizeDisplay, canvasOffsetY + yAdd + (KinkyDungeonPlayerEntity.visual_y - CamY-CamY_offset)*KinkyDungeonGridSizeDisplay - 24, + KinkyDungeonGridSizeDisplay, 12, Math.max(7, Math.min(100, 100 * (value + value2))), color, KDTextGray0); + if (value2 && value <= 1) { + KinkyDungeonBar(canvasOffsetX + xAdd + (KinkyDungeonPlayerEntity.visual_x - CamX-CamX_offsetVis)*KinkyDungeonGridSizeDisplay, canvasOffsetY + yAdd + (KinkyDungeonPlayerEntity.visual_y - CamY-CamY_offset)*KinkyDungeonGridSizeDisplay - 24, + KinkyDungeonGridSizeDisplay, 12, Math.max(7, 100 * value2), color2, "none"); + } + } + + KinkyDungeonDrawTethers(CamX+CamX_offset, CamY+CamY_offset); + + if (tooltip && KDMouseInPlayableArea()) { + DrawTextFitKD(tooltip, MouseX, MouseY - KinkyDungeonGridSizeDisplay/2, 200, "#ffffff", KDTextGray2); + } + } + + if (KinkyDungeonPlayerEntity.dialogue) { + let yboost = 0;//-1*KinkyDungeonGridSizeDisplay/7; + DrawTextFitKDTo(kddialoguecanvas, KinkyDungeonPlayerEntity.dialogue, + canvasOffsetX + (KinkyDungeonPlayerEntity.visual_x - CamX-CamX_offsetVis)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, + yboost + canvasOffsetY + (KinkyDungeonPlayerEntity.visual_y - CamY-CamY_offsetVis)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2, + 700, KinkyDungeonPlayerEntity.dialogueColor, KDTextGray0, 24); + } + + + + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (altType?.drawscript) { + altType.drawscript(KDDrawDelta, CamX, CamY, CamX_offsetVis, CamY_offsetVis); + } + + if (!KDModalArea) { + KDModalArea_x = 600; + KDModalArea_y = 700; + KDModalArea_width = 800; + KDModalArea_height = 100; + } + + KinkyDungeonDrawInterface(KinkyDungeonIsPlayer()); + + if (KDGameData.CurrentDialog) { + KDDrawDialogue(KinkyDungeonDrawDelta); + } + + KinkyDungeonDrawMessages(); + + // Draw the quick inventory + if (KDShowQuickInv()) { + KinkyDungeonDrawQuickInv(); + } + + KinkyDungeonSendEvent("afterDrawFrame", data); + } + /*else { + DrawTextKD(TextGet("KinkyDungeonLoading"), 1100, 500, "#ffffff", KDTextGray2); + if (CommonTime() > KinkyDungeonGameDataNullTimerTime + KinkyDungeonGameDataNullTimer) { + ServerSend("ChatRoomChat", { Content: "RequestFullKinkyDungeonData", Type: "Hidden", Target: KinkyDungeonPlayerCharacter.MemberNumber }); + KinkyDungeonGameDataNullTimerTime = CommonTime(); + } + }*/ + } else { + + + if (KDCustomDraw[KinkyDungeonDrawState]) { + KDCustomDraw[KinkyDungeonDrawState](); + } + else if (KinkyDungeonDrawState == "Orb") { + KinkyDungeonDrawOrb(); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + } else if (KinkyDungeonDrawState == "PerkOrb") { + KinkyDungeonDrawPerkOrb(); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + } else if (KinkyDungeonDrawState == "Heart") { + KinkyDungeonDrawHeart(); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + } else if (KinkyDungeonDrawState == "Magic") { + KDDrawNavBar(-2); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + //DrawButtonKDEx("return", (bdata) => {KinkyDungeonDrawState = "Game"; return true;}, true, KDReturnButtonXX, 925, 165, 60, TextGet("KinkyDungeonGame"), "#ffffff", "", ""); + KinkyDungeonDrawMagic(); + } else if (KinkyDungeonDrawState == "MagicSpells") { + //DrawButtonKDEx("return", (bdata) => {KinkyDungeonDrawState = "Game"; return true;}, true, KDReturnButtonXX, 925, 165, 60, TextGet("KinkyDungeonGame"), "#ffffff", "", ""); + KDDrawNavBar(2); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + KinkyDungeonDrawMagicSpells(); + } else if (KinkyDungeonDrawState == "Inventory") { + //DrawButtonKDEx("return", (bdata) => {KinkyDungeonDrawState = "Game"; return true;}, true, KDReturnButtonXX, 925, 165, 60, TextGet("KinkyDungeonGame"), "#ffffff", "", ""); + KDDrawNavBar(1); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + KinkyDungeonDrawInventory(); + } else if (KinkyDungeonDrawState == "Logbook") { + KDDrawNavBar(3); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + //DrawButtonKDEx("return", (bdata) => {KinkyDungeonDrawState = "Game"; return true;}, true, KDReturnButtonXX, 925, 165, 60, TextGet("KinkyDungeonGame"), "#ffffff", "", ""); + KinkyDungeonDrawLore(); + } else if (KinkyDungeonDrawState == "Quest") { + KDDrawNavBar(3); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + KinkyDungeonDrawQuest(); + } else if (KinkyDungeonDrawState == "Collection") { + KDDrawNavBar(1); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + KinkyDungeonDrawCollection(); + } else if (KinkyDungeonDrawState == "Facilities") { + KDDrawNavBar(1); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + KinkyDungeonDrawFacilities(); + } else if (KinkyDungeonDrawState == "Container" && KDUI_CurrentContainer) { + KDDrawNavBar(1); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + KDDrawContainer(KDUI_CurrentContainer, undefined, KDGameData.Containers[KDUI_CurrentContainer]?.filters, KDValidateContainer(KDGameData.Containers[KDUI_CurrentContainer])); + } + + + else if (KinkyDungeonDrawState == "Reputation") { + //DrawButtonKDEx("return", (bdata) => {KinkyDungeonDrawState = "Game"; return true;}, true, KDReturnButtonXX, 925, 165, 60, TextGet("KinkyDungeonGame"), "#ffffff", "", ""); + KDDrawNavBar(3); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + KinkyDungeonDrawReputation(); + } else if (KinkyDungeonDrawState == "Restart") { + KDDrawNavBar(0); + if (TestMode) { + DrawCheckboxVis(600, 20, 64, 64, "Debug Mode", KDDebugMode, false, "#ffffff"); + if (KDDebugMode) { + let dd = 30; + let i = 0; + for (let r of KinkyDungeonRestraints) { + if (i * dd < 1200 && r.name.includes(ElementValue("DebugItem"))) { + DrawTextFitKD(r.name, 0, 15 + i * dd, 200, "#ffffff", KDTextGray0, undefined, "left"); + i++; + } + } + i = 0; + for (let r of Object.values(KinkyDungeonConsumables)) { + if (i * dd < 1200 && r.name.includes(ElementValue("DebugItem"))) { + DrawTextFitKD(r.name, 200, 15 + i * dd, 200, "lightblue", KDTextGray0, undefined, "left"); + i++; + } + } + i = 0; + for (let r of KinkyDungeonEnemies) { + if (i * dd < 1200 && r.name.includes(ElementValue("DebugEnemy"))) { + DrawTextFitKD(r.name, 400, 15 + i * dd, 200, "#ff5277", KDTextGray0); + i++; + } + } + i = 0; + for (let r of Object.values(KinkyDungeonWeapons)) { + if (i * dd < 1200 && r.name.includes(ElementValue("DebugItem"))) { + DrawTextFitKD(r.name, 1800, 15 + i * dd, 200, "orange", KDTextGray0); + i++; + } + } + i = 0; + for (let r of KinkyDungeonOutfitsBase) { + if (i * dd < 1200 && r.name.includes(ElementValue("DebugItem"))) { + DrawTextFitKD(r.name, 900, 15 + i * dd, 200, "lightgreen", KDTextGray0); + i++; + } + } + + DrawCheckboxVis(1100, 20, 64, 64, "Verbose Console", KDDebug, false, "#ffffff"); + DrawCheckboxVis(1100, 90, 64, 64, "Changeable Perks", KDDebugPerks, false, "#ffffff"); + DrawCheckboxVis(1100, 160, 64, 64, "Unlimited Gold", KDDebugGold, false, "#ffffff"); + DrawCheckboxVis(1100, 230, 64, 64, "Link Under", KDDebugLink, false, "#ffffff"); + + DrawButtonVis(1500, 100, 100, 64, "Enemy", "#ffffff", ""); + DrawButtonVis(1600, 100, 100, 64, "Ally", "#ffffff", ""); + DrawButtonVis(1700, 100, 100, 64, "Shop", "#ffffff", ""); + ElementPosition("DebugItem", 1650, 212, 300, 64); + ElementPosition("DebugEnemy", 1650, 52, 300, 64); + DrawButtonVis(1500, 260, 300, 64, "Add to inventory", "#ffffff", ""); + DrawButtonVis(1100, 300, 300, 64, "Teleport to stairs", "#ffffff", ""); + DrawButtonVis(1500, 320, 300, 64, "Get save code", "#ffffff", ""); + DrawButtonVis(1100, 370, 300, 64, "Enter parole mode", "#ffffff", ""); + DrawButtonKDEx("debugDefeat", (_bdata) => { + console.log("Defeat Enemy..."); + KinkyDungeonTargetingSpell = KinkyDungeonHandleSpellCast({ name: "debugDefeat", + tags: ["metal", "binding", "utility"], + sfx: "MagicSlash", + school: "Conjure", + manacost: 0, + components: [], + mustTarget: true, + level: 1, + type: "special", special: "debugDefeat", + onhit: "", time: 1, power: 3.5, range: 15, size: 1, damage: "" } + ) + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + KinkyDungeonDrawState = "Game" + return true; + }, true, 600, 96, 145, 48, "Defeat", "#ffffff", ""); + DrawButtonKDEx("debugBind", (_bdata) => { + console.log("Bind Enemy..."); + KinkyDungeonTargetingSpell = KinkyDungeonHandleSpellCast({ name: "debugBind", + tags: ["metal", "binding", "utility"], + sfx: "MagicSlash", + school: "Conjure", + manacost: 0, + components: [], + mustTarget: true, + level: 1, + type: "special", special: "debugBind", + onhit: "", time: 1, power: 3.5, range: 15, size: 1, damage: "" } + ) + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + KinkyDungeonDrawState = "Game" + return true; + }, true, 755, 96, 145, 48, "Bind", "#ffffff", ""); + DrawButtonKDEx("debugAddKey", (_bdata) => { + KDAddConsumable("Pick", 10); + KDAddConsumable("RedKey", 10); + KDAddConsumable("BlueKey", 10); + return true; + }, true, 600, 160, 300, 64, "Add keys and lockpicks", "#ffffff", ""); + DrawButtonKDEx("debugAddVision", (_bdata) => { + KinkyDungeonSeeAll = !KinkyDungeonSeeAll; + return true; + }, true, 600, 240, 300, 64, "Toggle OmniVision™", "#ffffff", ""); + DrawButtonKDEx("debugAddSP", (_bdata) => { + KinkyDungeonSpellPoints += 10; + return true; + }, true, 600, 320, 300, 64, "Add 10 spell points", "#ffffff", ""); + DrawButtonKDEx("debugClearQuickInv", (_bdata) => { + KinkyDungeonInventory.get('looserestraint').clear(); + KinkyDungeonAdvanceTime(0, true); + return true; + }, true, 600, 400, 300, 64, "Clear loose restraints", "#ffffff", ""); + DrawButtonKDEx("debugClearPlayerInv", (_bdata) => { + KinkyDungeonInventory.get('restraint').clear(); + KinkyDungeonAdvanceTime(0, true); + return true; + }, true, 600, 480, 300, 64, "Clear worn restraints", "#ffffff", ""); + DrawButtonKDEx("debugaddallrest", (_bdata) => { + // eslint-disable-next-line no-unused-vars + for (let r of KinkyDungeonRestraints) { + if (!KinkyDungeonInventoryGetLoose(r.name)) + KinkyDungeonInventoryAddLoose(r.name); + } + return true; + }, true, 600, 560, 300, 64, "Add all restraints", "#ffffff", ""); + DrawButtonKDEx("debugIncFloor", (_bdata) => { + MiniGameKinkyDungeonLevel += 1; + KDCurrentWorldSlot.y += 1; + KDGameData.JourneyY += 1; + KinkyDungeonSendEvent("tickFlags", {delta: 1}); + KDTickSpecialStats(); + return true; + }, true, 600, 640, 300, 64, "Increment Floor", "#ffffff", ""); + DrawButtonKDEx("RestSP", (_bdata) => { + KDChangeStamina("","","",100) + return true; + }, true, 600, 720, 145, 48, "Rest SP", "#ffffff", "") + DrawButtonKDEx("+maxSP", (_bdata) => { + KDGameData.StatMaxBonus.SP += 10; + return true; + }, true, 755, 720, 145, 48, "+Max SP", "#44ff00", "") + DrawButtonKDEx("RestMP", (_bdata) => { + KDChangeMana("","","",100) + return true; + }, true, 600, 780, 145, 48, "Rest MP", "#ffffff", "") + DrawButtonKDEx("+maxMP", (_bdata) => { + KDGameData.StatMaxBonus.MP += 10; + return true; + }, true, 755, 780, 145, 48, "+Max MP", "#0088ff", "") + DrawButtonKDEx("RestWP", (_bdata) => { + KDChangeWill("","","",100) + return true; + }, true, 600, 840, 145, 48, "Rest WP", "#ffffff", "") + DrawButtonKDEx("+maxWP", (_bdata) => { + KDGameData.StatMaxBonus.WP += 10; + return true; + }, true, 755, 840, 145, 48, "+Max WP", "#ff5277", "") + DrawButtonKDEx("RestDP", (_bdata) => { + KDChangeDistraction("","","",-100) + KDChangeDesire("","","",-100,true) + return true; + }, true, 600, 900, 145, 48, "Rest DP", "#ffffff", "") + DrawButtonKDEx("+maxDP", (_bdata) => { + KDGameData.StatMaxBonus.DP += 10; + return true; + }, true, 755, 900, 145, 48, "+Max DP", "#ffaaaa", "") + + + + } + } + + + DrawTextFitKD(TextGet("KinkyDungeonRestartConfirm"), 1250, 400, 1000, "#ffffff", "#333333"); + DrawButtonVis(975, 550, 550, 64, TextGet("KinkyDungeonRestartNo"), "#ffffff", ""); + DrawButtonVis(975, 650, 550, 64, TextGet(KDSaveBusy ? "KDSaveBusy" + : "KinkyDungeonRestartQuitNoErase" + ), "#ffffff", ""); + DrawButtonVis(975, 800, 550, 64, TextGet("KinkyDungeonRestartCapture" + (KDConfirmDeleteSave ? "Confirm" : "")), (KDGameData.PrisonerState == 'jail' || !KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)) ? "Pink" : "#ffffff", ""); + //DrawButtonVis(975, 900, 550, 64, TextGet("KinkyDungeonRestartYes" + (KDConfirmDeleteSave ? "Confirm" : "")), "#ffffff", ""); + DrawButtonVis(1650, 900, 300, 64, TextGet("KinkyDungeonCheckPerks"), "#ffffff", ""); + + /*DrawButtonKDEx("GameConfigKeys", () => { + KinkyDungeonState = "Keybindings"; + if (!KinkyDungeonKeybindings) + KDSetDefaultKeybindings(); + else { + KinkyDungeonKeybindingsTemp = {}; + Object.assign(KinkyDungeonKeybindingsTemp, KinkyDungeonKeybindings); + } + return true; + }, true, 975, 450, 260, 64, TextGet("GameConfigKeys"), "#ffffff", "");*/ + DrawButtonKDEx("GameToggles", () => { + KinkyDungeonState = "Toggles"; + return true; + }, true, 1265, 450, 260, 64, TextGet("GameToggles"), "#ffffff", ""); + + } else if (KinkyDungeonDrawState == "Perks2") { + KinkyDungeonDrawPerks(!KDDebugPerks); + DrawButtonVis(1650, 920, 300, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", ""); + + if (!KDClipboardDisabled) + DrawButtonKDEx("copyperks", (_bdata) => { + let txt = ""; + for (let k of KinkyDungeonStatsChoice.keys()) { + if (!k.startsWith("arousal") && !k.endsWith("Mode")) txt += (txt ? "\n" : "") + k; + } + navigator.clipboard.writeText(txt); + return true; + }, true, 1400, 930, 200, 54, TextGet("KinkyDungeonCopyPerks"), "#ffffff", ""); + else { + let CF = KDTextField("KDCopyPerks", 1400, 930, 200, 54, undefined, undefined, "10000"); + if (CF.Created) { + let txt = ""; + for (let k of KinkyDungeonStatsChoice.keys()) { + if (!k.startsWith("arousal") && !k.endsWith("Mode")) txt += (txt ? "|" : "") + k; + } + ElementValue("KDCopyPerks", txt); + } + } + } else if (KDCustomDrawState[KinkyDungeonDrawState]) { + KDCustomDrawState[KinkyDungeonDrawState](); + } + if (KDShouldDrawFloaters()) + KinkyDungeonDrawFloaters(0, 0, true); + } + + if (KinkyDungeonDrawState == "Game") { + if (KinkyDungeonFlags.get("PlayerOrgasmFilter")) { + /*if (KDToggles.IntenseOrgasm) { + if (!KDIntenseFilter) { + KDIntenseFilter = PIXI.Sprite.from(KinkyDungeonRootDirectory + 'displacement_map_repeat.jpg'); + // Make sure the sprite is wrapping. + KDIntenseFilter.texture.baseTexture.wrapMode = PIXI.WRAP_MODES.REPEAT; + const displacementFilter = new PIXI.filters.DisplacementFilter(KDIntenseFilter); + displacementFilter.padding = 10; + + kdgameboard.addChild(KDIntenseFilter); + + kdgameboard.filters = [displacementFilter]; + + displacementFilter.scale.x = 30; + displacementFilter.scale.y = 60; + } + } else {*/ + FillRectKD(kdcanvas, kdpixisprites, "screenoverlayor", { + Left: 0, + Top: 0, + Width: 2000, + Height: 1000, + Color: "#B200FF", + LineWidth: 1, + zIndex: 1, + alpha: 0.1, + }); + //} + } else if (KinkyDungeonStatFreeze > 0) { + FillRectKD(kdcanvas, kdpixisprites, "screenoverlayfr", { + Left: 0, + Top: 0, + Width: 2000, + Height: 1000, + Color: "#92e8c0", + LineWidth: 1, + zIndex: 1, + alpha: 0.1, + }); + } else if (KDToggles.StunFlash && (KinkyDungeonFlags.get("playerStun"))) { + FillRectKD(kdcanvas, kdpixisprites, "screenoverlayst", { + Left: 0, + Top: 0, + Width: 2000, + Height: 1000, + Color: "#aaaaaa", + LineWidth: 1, + zIndex: 1, + alpha: 0.07, + }); + } else if (KDToggles.ArousalHearts) { + KDDrawArousalParticles(KDGameData.OrgasmTurns/KinkyDungeonOrgasmTurnsMax, KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax, + (KDGameData.OrgasmStage / KinkyDungeonMaxOrgasmStage) + ); + } + KDDrawArousalScreenFilter(0, 1000, 2000, KinkyDungeonStatDistraction * 100 / KinkyDungeonStatDistractionMax); + + + if (KDToggles.VibeHearts) { + KDDrawVibeParticles(KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax); + } + + /*if (!KinkyDungeonFlags.get("PlayerOrgasmFilter") && KDIntenseFilter) { + kdgameboard.removeChild(KDIntenseFilter); + kdgameboard.filters = kdgameboard.filters.filter((filter) => {return filter != KDIntenseFilter;}); + KDIntenseFilter = null; + }*/ + } + + + if (!KDPatched) + DrawButtonVis(1885, 25, 90, 90, "", "#ffffff", KinkyDungeonRootDirectory + "UI/Exit.png"); + + + if (KinkyDungeonKeybindingCurrentKey && KinkyDungeonGameKeyDown()) { + if (KinkyDungeonKeybindingCurrentKey) + KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime(); + KinkyDungeonKeybindingCurrentKey = ''; + } + + if (KinkyDungeonDrawState == "Game") + KinkyDungeonListenKeyMove(); + + KDProcessInputs(); + + if (KDDrewEnemyTooltipThisFrame) { + KDDrewEnemyTooltip = KDDrewEnemyTooltipThisFrame; + } else { + KDDrewEnemyTooltip = ""; + } + KDDrewEnemyTooltipThisFrame = ""; + +} + +function KDShouldDrawFloaters() { + return true; +} + + +/** + * Draws arousal screen filter + * @param y1 - Y to draw filter at. + * @param h - Height of filter + * @param Width - Width of filter + * @param ArousalOverride - Override to the existing arousal value + */ +function KDDrawArousalScreenFilter(_y1: number, _h: number, _Width: number, _ArousalOverride: number, _Color: string = '255, 100, 176', _AlphaBonus: number = 0): void { + + + if ((KDToggles.OScreenFilter && ( + KinkyDungeonFlags.get("OrgAfterglow") + || KinkyDungeonFlags.get("OrgDenied") + || KinkyDungeonFlags.get("OrgEdged") + + )) || ( + KDToggles.DistractScreenFilter + && KDDistractionFlashStrength + && (CommonTime() - KDDistractionFlashLastTime) < (KDDistractionFlashTime + KDDistractionFlashStrength * KDDistractionFlashStrengthTime) + )) { + let mag = Math.max(0.0, + Math.min(1.0, + 1 - (CommonTime() - KDDistractionFlashLastTime) + / (KDDistractionFlashTime + KDDistractionFlashStrength * KDDistractionFlashStrengthTime)), + Math.min(1.0, + ( + KinkyDungeonFlags.get("OrgAfterglow") + || KinkyDungeonFlags.get("OrgDenied") + || KinkyDungeonFlags.get("OrgEdged") + )/KDOrgAfterglowTime || 0)); + FillRectKD(kdcanvas, kdpixisprites, "OrgAfterglowFilter", { + Left: 0, + Top: 0, + Width: 2000, + Height: 1000, + Color: "#FF00DC", + LineWidth: 1, + zIndex: 1, + alpha: mag * 0.1, + }); + } else { + KDDistractionFlashStrength = 0; + } + +} + +function KDCanAttack() { + let attackCost = KinkyDungeonStatStaminaCostAttack; + if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.staminacost) attackCost = -KinkyDungeonPlayerDamage.staminacost; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackStamina")) { + attackCost = Math.min(0, attackCost * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackStamina"))); + } + return KinkyDungeonHasStamina(Math.abs(attackCost), true); +} + +let KinkyDungeonFloaters = []; +let KinkyDungeonLastFloaterTime = 0; + +let KDTimescale = 0.004; +let KDBulletSpeed = 40; + +// We use this to offset floaters +let KDEntitiesFloaterRegisty = new Map(); +/// @ts-ignore Weird tsserver error about `KinkyDungeonGridSizeDisplay` being used before being defined. `tsc` doesn't seem to care. +let KDFloaterSpacing = 18 / KinkyDungeonGridSizeDisplay; + +function KinkyDungeonSendFloater(Entity: entity, Amount: number | string, Color: string, Time?: number, LocationOverride?: boolean, suff: string = "", size?: number, prefix?: string) { + if (Entity.x && Entity.y) { + let II = KDEntitiesFloaterRegisty.get(Entity) || 1; + II += 1; + KDEntitiesFloaterRegisty.set(Entity, II); + let floaterMult = KDToggles.FastFloaters ? 0.33 : 1; + let stringFloaterMult = KDToggles.FastFloaters ? 0.7 : 1; + let floater = { + x: Entity.x + 0.5,// + Math.random(), + y: Entity.y - (II - 1) * KDFloaterSpacing,// + Math.random(), + override: LocationOverride, + speed: 30,// + (Time ? Time : 0) + Math.random()*10, + t: 0, + color: Color, + size: size, + text: "" + ((typeof Amount === "string") ? Amount : (prefix || "") + Math.round(Amount * 10)/10) + suff, + lifetime: Time ? stringFloaterMult*Time : ((typeof Amount === "string") ? stringFloaterMult*4 : floaterMult*((Amount < 3) ? 2 : (Amount > 5 ? 3 : 2))), + }; + KinkyDungeonFloaters.push(floater); + } +} + + +function KinkyDungeonDrawFloaters(CamX: number, CamY: number, onlyAbs: boolean = false) { + let delta = CommonTime() - KinkyDungeonLastFloaterTime; + + let KDFloaterYCache = {}; + let max = 40; + let i = 0; + let floatermult = 1.5; // Global tweak value + if (delta > 0) { + for (let floater of KinkyDungeonFloaters) { + floater.t += floatermult * delta/1000; + if (i > max) break; + i += 1; + } + } + let newFloaters = []; + i = 0; + for (let floater of KinkyDungeonFloaters.reverse()) { + if (i <= max && (floater.override || !onlyAbs)) { + let x = floater.override ? floater.x : canvasOffsetX + (floater.x - CamX)*KinkyDungeonGridSizeDisplay; + let y = (floater.override ? floater.y : canvasOffsetY + (floater.y - CamY)*KinkyDungeonGridSizeDisplay); + let overlap = false; + let overlapAmount = 9; + for (let iii = -overlapAmount; iii < overlapAmount; iii += 2) { + if (KDFloaterYCache[Math.round(y + iii)]) { + overlap = true; + } + } + let ii = 0; + let direction = -1; + while ( overlap && ii < 60) { + floater.y -= (floater.override ? 4 : 4/KinkyDungeonGridSizeDisplay) * direction; + //floater.x += -20 + Math.random() * 40; + x = floater.override ? floater.x : canvasOffsetX + (floater.x - CamX)*KinkyDungeonGridSizeDisplay; + y = (floater.override ? floater.y : canvasOffsetY + (floater.y - CamY)*KinkyDungeonGridSizeDisplay); + overlap = false; + for (let iii = -overlapAmount; iii < overlapAmount; iii += 2) { + if (KDFloaterYCache[Math.round(y + iii)]) { + overlap = true; + } + } + ii += 1; + } + for (let iii = -overlapAmount; iii < overlapAmount; iii++) { + KDFloaterYCache[Math.round(y + iii)] = true; + } + + DrawTextFitKDTo(kdfloatercanvas, floater.text, + x, y - floater.speed*floater.t/floatermult, + 1000, floater.color, KDTextGray1, floater.size || 20, undefined, undefined, KDEase(floater.t / floater.lifetime)); + } + if (floater.t < floater.lifetime) newFloaters.push(floater); + i += 1; + } + KinkyDungeonFloaters = newFloaters; + + KinkyDungeonLastFloaterTime = CommonTime(); +} + +/** + * Easing function makes things smooth + * @param value + */ +function KDEase(value: number): number { + if (value < 0.25) + return Math.sin(value * Math.PI * 2); + else if (value > 0.75) + return Math.sin(-value * Math.PI * 2); + else return 1; +} + +let KinkyDungeonMessageToggle = false; +let KinkyDungeonMessageLog = []; +let KDLogDist = 24; +let KDMSGFontSize = 20; +let KDLogHeight = 700; +let KDMaxLog = Math.floor(700/KDLogDist); +let KDLogTopPad = 25; + +let KDLogIndex = 0; +let KDLogIndexInc = 3; + +let KDMsgWidth = 800; +let KDMsgWidthMin = 800; +let KDMsgX = 720; +let KDMsgFadeTime = 10; + +let KDMaxConsoleMsg = 6; + +let KDLogFilters = [ + "Action", + "Combat", + "Self", + "Struggle", + "Ambient", + "Dialogue", + "Items", + "Kills", +]; + +function KinkyDungeonDrawMessages(NoLog?: boolean, shiftx: number = 0, noBG: boolean = false, width: number = KDMsgWidthMin) { + if (!NoLog) { + DrawButtonKDEx("logtog", (_bdata) => { + KinkyDungeonMessageToggle = !KinkyDungeonMessageToggle; + KDLogIndex = 0; + return true; + }, true, KDMsgWidthMin + KDMsgX + shiftx + 70, 4, 52, 52, "", "#ffffff", + KinkyDungeonRootDirectory + (KinkyDungeonMessageToggle ? "UI/LogUp.png" : "UI/LogDown.png"), undefined, undefined, !KinkyDungeonMessageToggle, undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[0]), + hotkeyPress: KinkyDungeonKeyToggle[0], + scaleImage: true, + }); + if (!KDGameData.LogFilters) { + KDGameData.LogFilters = {}; + for (let filter of KDLogFilters) { + KDGameData.LogFilters[filter] = true; + } + } + let spacing = 51; + let size = 48; + let filterCols = 2; + let yyy = KDLogFilters.length * spacing/filterCols + 30; + if (MouseIn(KDMsgWidthMin + KDMsgX + shiftx + 70, 0, 300, yyy)) { + let filterX = KDMsgWidthMin + KDMsgX + shiftx + 70 + 60; + let filterY = 4; + let ii = 0; + for (let filter of KDLogFilters) { + if ( + DrawButtonKDEx("logtog" + filter, (_bdata) => { + KDGameData.LogFilters[filter] = !KDGameData.LogFilters[filter]; + return true; + }, true, filterX + spacing * (ii%filterCols), filterY + spacing*Math.floor(ii/filterCols), size, size, "", "#ffffff", + KinkyDungeonRootDirectory + "UI/Log/" + filter + ".png", undefined, undefined, + !KDGameData.LogFilters[filter], undefined, undefined, undefined, { + //hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[0]), + //hotkeyPress: KinkyDungeonKeyToggle[0], + scaleImage: true, + })) { + DrawTextFitKD(TextGet("KDLogFilter" + filter), filterX + spacing * (ii%filterCols), yyy, 300, "#ffffff", KDTextGray1, 14, "right"); + } + ii++; + } + } + + } + if (!KinkyDungeonMessageToggle || NoLog) { + let zLevel = KDModalArea ? 50 : undefined; + let i = 0; + if (!MouseIn(KDMsgX + shiftx + (KDMsgWidth - KDMsgWidthMin)/2, 0, KDMsgWidthMin, 62 + KDLogDist*(2 + KDMaxConsoleMsg)) || KinkyDungeonDrawState != "Game") { + let msg2nd = []; + let ignoreMSG = []; + let spacing = KDLogDist; + if (KinkyDungeonActionMessageTime > 0 && KinkyDungeonActionMessageNoPush) { + DrawTextFitKD(KinkyDungeonActionMessage, KDMsgX + shiftx + KDMsgWidth/2, 15 + spacing * i, width, KinkyDungeonActionMessageColor, KDTextGray1, KDMSGFontSize, undefined, zLevel); + ignoreMSG.push(KinkyDungeonActionMessage); + i++; + } + if (KinkyDungeonTextMessageTime > 0 && KinkyDungeonTextMessageNoPush) { + DrawTextFitKD(KinkyDungeonTextMessage, KDMsgX + shiftx + KDMsgWidth/2, 15 + spacing * i, width, KinkyDungeonTextMessageColor, KDTextGray1, KDMSGFontSize, undefined, zLevel); + ignoreMSG.push(KinkyDungeonTextMessage); + i++; + } + for (let ii = 0; ii < KinkyDungeonMessageLog.length && ii < 100; ii++) { + let index = KinkyDungeonMessageLog.length - 1 - ii; + let msg = KinkyDungeonMessageLog[index]; + if (!msg) break; + if (ignoreMSG.includes(msg.text)) { + ignoreMSG.splice(ignoreMSG.indexOf(msg.text), 1); + continue; + } + if (KinkyDungeonCurrentTick - msg.time < KDMsgFadeTime) { + let count = 1; + for (let iii = 1; iii < 100; iii++) { + if (KinkyDungeonMessageLog[index - iii] && KinkyDungeonMessageLog[index-iii].text == msg.text) { + count += 1; + //KinkyDungeonMessageLog.splice(ii+iii, 1); + //ii -= 1; + } else break; + } + if (count > 1) { + ii += count - 1; + } + msg2nd.push(count == 1 ? msg : Object.assign({}, {text: msg.text + ` (x${count})`, color: msg.color, time: msg.time})); + } + } + if (msg2nd.length > 0) { + let alpha = 1; + let alphamin = 0.4; + for (let msg of msg2nd) { + if (i > KDMaxConsoleMsg || (KinkyDungeonDrawState != "Game" && i > 3)) break; + if (alpha > 0) { + if (msg.filter && KDGameData.LogFilters && KDGameData.LogFilters[msg.filter] == false) { + continue; + } + if (msg.antifilter && KDGameData.LogFilters && KDGameData.LogFilters[msg.antifilter] == true) { + continue; + } + alpha = Math.max(0, Math.min(1, 2.0 - i / KDMaxConsoleMsg)) * (1 - Math.max(0, Math.min(1, Math.max(0, KinkyDungeonCurrentTick - msg.time - 1)/KDMsgFadeTime))); + DrawTextFitKD(msg.text, KDMsgX + shiftx + KDMsgWidth/2, 15 + spacing * i, width, msg.color, KDTextGray1, KDMSGFontSize, undefined, zLevel, alphamin + (1 - alphamin) * alpha); + i++; + } + } + } + + } + if (!noBG) + if (i > 0) + FillRectKD(kdcanvas, kdpixisprites, "msglogbg", { + Left: KDMsgX + shiftx + (KDMsgWidth - KDMsgWidthMin)/2, + Top: 0, + Width: KDMsgWidthMin, + Height: 22 + KDLogDist*(i), + Color: "#000000", + LineWidth: 1, + zIndex: (zLevel || 101) - 1, + alpha: 0.45, + }); + + + } else { + if (!noBG) + FillRectKD(kdcanvas, kdpixisprites, "msglogbg", { + Left: KDMsgX + shiftx, + Top: 0, + Width: KDMsgWidth, + Height: KDLogTopPad + KDLogHeight, + Color: KDTextGray0, + LineWidth: 1, + zIndex: 100, + alpha: 0.6, + }); + let ii = 0; + for (let i = 0; i < KinkyDungeonMessageLog.length && i < KDMaxLog; i++) { + let log = KinkyDungeonMessageLog[Math.max(0, KinkyDungeonMessageLog.length - 1 - (i + KDLogIndex))]; + if (log.filter && KDGameData.LogFilters && KDGameData.LogFilters[log.filter] == false) { + continue; + } + if (log.antifilter && KDGameData.LogFilters && KDGameData.LogFilters[log.antifilter] == true) { + continue; + } + + let col = log.color; + DrawTextFitKD(log.text, KDMsgX + shiftx + KDMsgWidth/2, KDLogTopPad + ii * KDLogDist + KDLogDist/2, KDMsgWidth, col, KDTextGray1, KDMSGFontSize, undefined, 101); + ii++; + } + if (KinkyDungeonMessageLog.length > KDMaxLog) { + DrawButtonKDEx("logscrollup", (_bdata) => { + if (KDLogIndex > 0) + KDLogIndex = Math.max(0, KDLogIndex - KDLogIndexInc); + return true; + }, true, 1500, 20, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Up.png"); + //KDMsgX + shiftx + KDMsgWidth/2 - 45, KDLogTopPad + KDLogHeight + 10 + DrawButtonKDEx("logscrolldown", (_bdata) => { + if (KDLogIndex < KinkyDungeonMessageLog.length - KDMaxLog) + KDLogIndex = Math.min(Math.max(0, KinkyDungeonMessageLog.length - KDMaxLog), KDLogIndex + KDLogIndexInc); + return true; + }, true,1500, 60, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Down.png"); + + if (KinkyDungeonMessageLog.length > KDMaxLog * 100) { + KinkyDungeonMessageLog.splice(0, KDMaxLog * 100 - KinkyDungeonMessageLog.length); + } + } + + } +} + +function KDhexToRGB(h: string) { + let r = "", g = "", b = ""; + + // TODO: Sanity check that h[0] == '#' + // 3 digits + if (h.length == 4) { + r = h[1] + h[1]; + g = h[2] + h[2]; + b = h[3] + h[3]; + + // 6 digits + } else if (h.length == 7) { + r = h[1] + h[2]; + g = h[3] + h[4]; + b = h[5] + h[6]; + } + + return {r:r, g:g, b:b}; +} + +function KinkyDungeonUpdateVisualPosition(Entity: any /*entity | KDBulletVisual*/, amount: number) { + // TODO refactor this to somehow allow the handling of both entity and KDBulletVisual + if (amount < 0 || Entity.visual_x == undefined || Entity.visual_y == undefined) { + Entity.visual_x = (Entity.xx != undefined) ? Entity.xx : Entity.x; + Entity.visual_y = (Entity.yy != undefined) ? Entity.yy : Entity.y; + return -1; + } else { + let speed = 50 + KDAnimSpeed * 50; + if (Entity.player && KinkyDungeonSlowLevel > 0 && KDGameData.KinkyDungeonLeashedPlayer < 2 && (KinkyDungeonFastMovePath.length < 1 || KinkyDungeonSlowLevel > 1)) speed += KDAnimSpeed * 50 * KinkyDungeonSlowLevel; + if (KDGameData.SleepTurns > 0) speed = 100; + if (speed > 300) speed = 250; + if (Entity.scale) speed = KDBulletSpeed; + let value = amount/speed;// How many ms to complete a move + // xx is the true position of a bullet + let tx = (Entity.xx != undefined) ? Entity.xx : Entity.x; + let ty = (Entity.yy != undefined) ? Entity.yy : Entity.y; + + let offX = 0; + let offY = 0; + if (Entity.Enemy && KinkyDungeonVisionGet(Entity.x, Entity.y) > 0) { + let ret = KDAnimEnemy(Entity); + offX = ret.offX; + offY = ret.offY; + } + + tx += offX; + ty += offY; + + let dist = Math.sqrt((Entity.visual_x - tx) * (Entity.visual_x - tx) + (Entity.visual_y - ty) * (Entity.visual_y - ty)); + if (dist > 5) { + value = 1; + } + if (Entity.scale != undefined) { + let scalemult = 0.9; + if (dist > 0 || !Entity.end || !(Entity.vx || Entity.vy)) { + if (Entity.vx || Entity.vy) { + scalemult = KDistEuclidean(Entity.vx, Entity.vy); + } + Entity.scale = Math.min(1.0, Entity.scale + KDTimescale*amount*scalemult); + } else { + Entity.scale = Math.max(0.0, Entity.scale - KDTimescale*amount*scalemult); + } + } + if (Entity.alpha != undefined) { + let alphamult = 0.28; + if (dist > 0 || !Entity.end) { + Entity.alpha = Math.min(1.0, Entity.alpha + KDTimescale*amount*3.0); + } else { + if ((Entity.vx || Entity.vy) || Entity.time > 1) { + alphamult = 0; + } + Entity.alpha = Math.min(1, Math.max(0.0, Entity.alpha - KDTimescale*amount*alphamult)); + } + } + + if (Entity.spin != undefined && Entity.spinAngle != undefined) { + Entity.spinAngle += Entity.spin * KDTimescale*amount; + if (Entity.spinAngle > Math.PI * 2) Entity.spinAngle -= Math.PI*2; + else if (Entity.spinAngle < 0) Entity.spinAngle += Math.PI*2; + //Math.min(1.0, Entity.alpha + KDTimescale*amount*3.0); + } + + if (dist == 0) return dist; + // Increment + let weightx = Math.abs(Entity.visual_x - tx)/(dist); + let weighty = Math.abs(Entity.visual_y - ty)/(dist); + //if (weightx != 0 && weightx != 1 && Math.abs(weightx - weighty) > 0.01) + //console.log(weightx + ", " + weighty + ", " + (Entity.visual_x - tx) + ", " + (Entity.visual_y - ty) + ", dist = " + dist, "x = " + Entity.visual_x + ", y = " + Entity.visual_y) + + if (Entity.visual_x > tx) Entity.visual_x = Math.max(Entity.visual_x - value*weightx, tx); + else Entity.visual_x = Math.min(Entity.visual_x + value*weightx, tx); + + if (Entity.visual_y > ty) Entity.visual_y = Math.max(Entity.visual_y - value*weighty, ty); + else Entity.visual_y = Math.min(Entity.visual_y + value*weighty, ty); + return dist; + //console.log("x = " + Entity.visual_x + ", y = " + Entity.visual_y + ", tx = " + tx + ", ty = " + ty) + } +} + +/** + * Sets the target location based on MOUSE location + */ +function KinkyDungeonSetTargetLocation(helper: boolean = true) { + //let OX = KDInspectCamera.x - (KinkyDungeonPlayerEntity.x||0); + //let OY = KDInspectCamera.y - (KinkyDungeonPlayerEntity.y||0); + KinkyDungeonTargetX = Math.round((MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay) + (KinkyDungeonCamX); + KinkyDungeonTargetY = Math.round((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay) + (KinkyDungeonCamY); + + if (helper) { + // The helper helps snap away from walls to make moving around less frustrating + if (KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(KinkyDungeonTargetX, KinkyDungeonTargetY)) + && !(KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)?.Type) + ) { + let remainderX = (MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay - Math.round((MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay); + let remainderY = ((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay) - Math.round((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay); + let aimThresh = 0.1; + let aimed = false; + if (remainderX > aimThresh) { + if (!KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(KinkyDungeonTargetX + 1, KinkyDungeonTargetY))) {KinkyDungeonTargetX += 1; aimed = true;} + } + if (!aimed && remainderX < -aimThresh) { + if (!KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(KinkyDungeonTargetX - 1, KinkyDungeonTargetY))) {KinkyDungeonTargetX -= 1; aimed = true;} + } + if (!aimed && remainderY > aimThresh) { + if (!KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(KinkyDungeonTargetX, KinkyDungeonTargetY + 1))) {KinkyDungeonTargetY += 1; aimed = true;} + } + if (!aimed && remainderY < -aimThresh) { + if (!KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(KinkyDungeonTargetX , KinkyDungeonTargetY - 1))) {KinkyDungeonTargetY -= 1;} + } + } + } +} + +function KDGetMoveDirection() { + let tx = //(MouseX - ((KinkyDungeonPlayerEntity.x - KinkyDungeonCamX)*KinkyDungeonGridSizeDisplay + canvasOffsetX + KinkyDungeonGridSizeDisplay / 2))/KinkyDungeonGridSizeDisplay + Math.round((MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamX; + let ty = //(MouseY - ((KinkyDungeonPlayerEntity.y - KinkyDungeonCamY)*KinkyDungeonGridSizeDisplay + canvasOffsetY + KinkyDungeonGridSizeDisplay / 2))/KinkyDungeonGridSizeDisplay) + Math.round((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamY; + + return {x: tx, y: ty}; +} + +/** + * Sets the move direction based on MOUSE location + */ +function KinkyDungeonSetMoveDirection() { + + let point = KDGetMoveDirection(); + + KDSendInput("setMoveDirection", {dir: KinkyDungeonGetDirection( + point.x - KinkyDungeonPlayerEntity.x, + point.y - KinkyDungeonPlayerEntity.y)}, true, true); + +} + +type RectParams = { + Left: number, + Top: number, + Width: number, + Height: number, + Color: string, + zIndex: number, + LineWidth?: number, + alpha?: number +} + +type CircleParams = { + Left: number, + Top: number, + Radius: number, + Color: string, + zIndex: number, + LineWidth?: number, + alpha?: number +} + +let KDBoxThreshold = 60; +let KDButtonColor = "rgba(5, 5, 5, 0.5)"; +let KDButtonColorIntense = "rgba(5, 5, 5, 0.8)"; +let KDBorderColor = '#f0b541'; + + + + +/** + * Draws a box component + * @param Left - Position of the component from the left of the canvas + * @param Top - Position of the component from the top of the canvas + * @param Width - Width of the component + * @param Height - Height of the component + * @param Color - Color of the component + * @param [NoBorder] - Color of the component + * @param [Alpha] - Transparency of the box + * @param [zIndex] - z Index + * @returns - Nothing + */ +function DrawBoxKD(Left: number, Top: number, Width: number, Height: number, Color: string, NoBorder?: boolean, Alpha?: number, zIndex: number = 90): void { + DrawBoxKDTo(kdcanvas, Left, Top, Width, Height, Color, NoBorder, Alpha, zIndex); +} + +/** + * Draws a box component + * @param Container - Container to draw to + * @param Left - Position of the component from the left of the canvas + * @param Top - Position of the component from the top of the canvas + * @param Width - Width of the component + * @param Height - Height of the component + * @param Color - Color of the component + * @param [NoBorder] - Color of the component + * @param [Alpha] - Transparency of the box + * @param [zIndex] - z Index + * @returns - Nothing + */ +function DrawBoxKDTo(Container: PIXIContainer, Left: number, Top: number, Width: number, Height: number, Color: string, NoBorder?: boolean, Alpha?: number, zIndex: number = 90): void { + FillRectKD(Container || kdcanvas, kdpixisprites, "box" + Left + "," + Top + "," + Width + "," + Height + Color + zIndex, { + Left: Left, + Top: Top, + Width: Width, + Height: Height, + Color: Color, + LineWidth: 1, + zIndex: zIndex, + alpha: Alpha != undefined ? Alpha : 1, + }); + + if (!NoBorder) { + DrawRectKD(Container || kdcanvas, kdpixisprites, "boxBorder" + Left + "," + Top + "," + Width + "," + Height + zIndex, { + Left: Left, + Top: Top, + Width: Width, + Height: Height, + Color: KDBorderColor, + LineWidth: 2, + zIndex: zIndex + 0.003, + }); + } +} + +let KDFont = 'Arial'; + +/** + * @param Text + * @param X + * @param Y + * @param Width + * @param Color + * @param [BackColor] + * @param [FontSize] + * @param [Align] + * @param [zIndex] + * @param [alpha] + * @param [border] + * @param [unique] - This button is not differentiated by position + * @param [font] - This button is not differentiated by position + */ +function DrawTextFitKD ( + Text: string, + X: number, + Y: number, + Width: number, + Color: string, + BackColor?: string, + FontSize?: number, + Align?: string, + zIndex: number = 110, + alpha: number = 1.0, + border: number = undefined, + unique: boolean = undefined, + font?: string +) { + DrawTextFitKDTo(kdcanvas, Text, X, Y, Width, Color, BackColor, FontSize, Align, zIndex, alpha, border, unique, font); +} + +type TextParamsType = { + Text: string, + X: number, + Y: number, + Width?: number, + Color: string, + BackColor: string, + FontSize?: number, + align?: string, + zIndex?: number, + alpha?: number, + border?: number, + unique?: boolean, + font?: string, +} + +/** + * @param Container + * @param Text + * @param X + * @param Y + * @param Width + * @param Color + * @param [BackColor] + * @param [FontSize] + * @param [Align] + * @param [zIndex] + * @param [alpha] + * @param [border] + * @param [unique] - This button is not differentiated by position + * @param [font] - This button is not differentiated by position + */ +function DrawTextFitKDTo ( + Container: PIXIContainer, + Text: string, + X: number, + Y: number, + Width: number, + Color: string, + BackColor?: string, + FontSize?: number, + Align?: string, + zIndex: number = 110, + alpha: number = 1.0, + border: number = undefined, + unique: boolean = undefined, + font?: string +) { + if (!Text) return; + let alignment = Align ? Align : "center"; + + DrawTextVisKD(Container || kdcanvas, kdpixisprites, "text->" + Text + (!unique ? "," + X + "," + Y : "_unique"), { + Text: Text, + X: X, + Y: Y, + Width: Width, + Color: Color, + BackColor: BackColor ? BackColor : (Color == KDTextGray2 ? KDTextGray0 : (Color == KDTextGray0 ? KDTextGray3 : KDTextGray2)), + FontSize: FontSize ? FontSize : 30, + align: alignment, + zIndex: zIndex, + alpha: alpha, + border: border, + unique: unique, + font: font, + }); +} + + +/** + * @param Container + * @param Text + * @param X + * @param Y + * @param Width + * @param Color + * @param [BackColor] + * @param [FontSize] + * @param [Align] + * @param [zIndex] + * @param [alpha] + * @param [border] + * @param [unique] - This button is not differentiated by position + * @param [font] - This button is not differentiated by position + */ +function DrawTextFitKDTo2 ( + Container: PIXIContainer, + Map: Map, + Text: string, + X: number, + Y: number, + Width: number, + Color: string, + BackColor?: string, + FontSize?: number, + Align?: string, + zIndex: number = 110, + alpha: number = 1.0, + border: number = undefined, + unique: boolean = undefined, + font?: string +) { + if (!Text) return; + let alignment = Align ? Align : "center"; + + DrawTextVisKD(Container || kdcanvas, Map, "text->" + Text + (!unique ? "," + X + "," + Y : "_unique"), { + Text: Text, + X: X, + Y: Y, + Width: Width, + Color: Color, + BackColor: BackColor ? BackColor : (Color == KDTextGray2 ? KDTextGray0 : (Color == KDTextGray0 ? KDTextGray3 : KDTextGray2)), + FontSize: FontSize ? FontSize : 30, + align: alignment, + zIndex: zIndex, + alpha: alpha, + border: border, + unique: unique, + font: font, + }); +} + +/** + * @param Text + * @param X + * @param Y + * @param Color + * @param [BackColor] + * @param [FontSize] + * @param [Align] + * @param [zIndex] + * @param [alpha] + */ +function DrawTextKD ( + Text: string, + X: number, + Y: number, + Color: string, + BackColor?: string, + FontSize?: number, + Align?: string, + zIndex: number = 110, + alpha: number = 1.0, + border: number = undefined +) { + if (!Text) return; + let alignment = Align ? Align : "center"; + + DrawTextVisKD(kdcanvas, kdpixisprites, "text->" + Text + "," + X + "," + Y, { + Text: Text, + X: X, + Y: Y, + Width: undefined, + Color: Color, + BackColor: BackColor, + FontSize: FontSize ? FontSize : 30, + align: alignment, + zIndex: zIndex, + alpha: alpha, + border: border, + }); +} + + + +let KDAllowText = true; + +/** + * @returns True if it worked + */ +function DrawTextVisKD (Container: PIXIContainer, Map: Map, id: string, Params: TextParamsType): boolean { + if (!KDAllowText) return; + let sprite = Map.get(id); + let same = true; + let par = kdprimitiveparams.get(id); + if (sprite && par) { + for (let p of Object.entries(kdprimitiveparams.get(id))) { + if (Params[p[0]] != p[1] && ((p[0] != 'X' && p[0] != 'Y') || !Params.unique)) { + same = false; + //if (!Params.unique) + //console.log(p) + break; + } + } + for (let p of Object.entries(Params)) { + if (par[p[0]] != p[1] && ((p[0] != 'X' && p[0] != 'Y') || !Params.unique)) { + same = false; + //if (!Params.unique) + //console.log(p) + break; + } + } + } + if (!sprite || !same) { + if (sprite) sprite.destroy(); + // Make the prim + sprite = new PIXI.Text(Params.Text, + { + fontFamily : Params.font || KDSelectedFont || KDFontName, + fontSize: Params.FontSize ? Params.FontSize : 30, + fill : string2hex(Params.Color), + stroke : Params.BackColor != "none" ? (Params.BackColor ? string2hex(Params.BackColor) : "#333333") : 0x000000, + strokeThickness: Params.border != undefined ? Params.border + : (Params.BackColor != "none" ? + (Params.FontSize ? Math.ceil(Params.FontSize / 8) : 2) + : 1), + miterLimit: 2, + padding: 5, + } + ); + + //console.log(Params) + if (Params.Width) { + sprite.scale.x = Math.min(1, Params.Width / Math.max(1, sprite.width)); + sprite.scale.y = sprite.scale.x; + } + + sprite.roundPixels = true; + // Add it to the container + Map.set(id, sprite); + Container.addChild(sprite); + if (!kdprimitiveparams.has(id) || !same) + kdprimitiveparams.set(id, Params); + } + if (sprite) { + sprite.visible = true; + // Modify the sprite according to the params + sprite.name = id; + //sprite.cacheAsBitmap = true; + sprite.position.x = Params.X + (Params.align == 'center' ? -sprite.width/2 : (Params.align == 'right' ? -sprite.width : 0)); + sprite.position.y = Params.Y - Math.ceil(sprite.height/2); + sprite.zIndex = Params.zIndex ? Params.zIndex : 0; + sprite.alpha = Params.alpha ? Params.alpha : 1; + kdSpritesDrawn.set(id, true); + return true; + } + return false; +} + +/** + * Draws a basic rectangle filled with a given color + * @param Container + * @param Map + * @param Params - rect parameters + * @param Params - rect parameters + * @returns - If it worked + */ +function DrawRectKD (Container: PIXIContainer, Map: Map, id: string, Params: RectParams): boolean { + let sprite = Map.get(id); + let same = true; + if (sprite && kdprimitiveparams.has(id)) { + for (let p of Object.entries(kdprimitiveparams.get(id))) { + if (Params[p[0]] != p[1]) { + same = false; + break; + } + } + } + if (!sprite || !same) { + if (sprite) sprite.destroy(); + // Make the prim + sprite = new PIXI.Graphics(); + sprite.lineStyle(Params.LineWidth ? Params.LineWidth : 1, string2hex(Params.Color), 1); + sprite.drawRect(0, 0, Params.Width, Params.Height); + // Add it to the container + Map.set(id, sprite); + Container.addChild(sprite); + if (!kdprimitiveparams.has(id) || !same) + kdprimitiveparams.set(id, Params); + } + if (sprite) { + sprite.visible = true; + // Modify the sprite according to the params + sprite.name = id; + sprite.position.x = Params.Left; + sprite.position.y = Params.Top; + sprite.width = Params.Width; + sprite.height = Params.Height; + sprite.zIndex = Params.zIndex ? Params.zIndex : 0; + sprite.alpha = Params.alpha ? Params.alpha : 1; + kdSpritesDrawn.set(id, true); + return true; + } + return false; +} +/** + * Draws a hollow circle + * @param Container + * @param Map + * @param Params - Circle drawing parameters (a circle is very blunt rectangle) + * @returns - If it worked + */ +function DrawCircleKD(Container: PIXIContainer, Map: Map, id: string, Params: RectParams): boolean { + let sprite = Map.get(id); + let same = true; + if (sprite && kdprimitiveparams.has(id)) { + for (let p of Object.entries(kdprimitiveparams.get(id))) { + if (Params[p[0]] != p[1]) { + same = false; + break; + } + } + } + if (!sprite || !same) { + if (sprite) sprite.destroy(); + // Make the prim + sprite = new PIXI.Graphics(); + sprite.lineStyle(Params.LineWidth ? Params.LineWidth : 1, string2hex(Params.Color), 1); + sprite.drawCircle(Params.Width/2, Params.Width/2, Params.Width/2); + // Add it to the container + Map.set(id, sprite); + Container.addChild(sprite); + if (!kdprimitiveparams.has(id) || !same) + kdprimitiveparams.set(id, Params); + } + if (sprite) { + sprite.visible = true; + // Modify the sprite according to the params + sprite.name = id; + sprite.position.x = Params.Left; + sprite.position.y = Params.Top; + sprite.width = Params.Width; + sprite.height = Params.Height; + sprite.zIndex = Params.zIndex ? Params.zIndex : 0; + sprite.alpha = Params.alpha ? Params.alpha : 1; + kdSpritesDrawn.set(id, true); + return true; + } + return false; +} + + +/** + * Draws a + + * @param Container + * @param Map + * @param Params - rendering parameters + * @returns - If it worked + */ +function DrawCrossKD(Container: PIXIContainer, Map: Map, id: string, Params: RectParams): boolean { + let sprite = Map.get(id); + let same = true; + if (sprite && kdprimitiveparams.has(id)) { + for (let p of Object.entries(kdprimitiveparams.get(id))) { + if (Params[p[0]] != p[1]) { + same = false; + break; + } + } + } + if (!sprite || !same) { + if (sprite) sprite.destroy(); + // Make the prim + let linewidth = Params.LineWidth || 2; + sprite = new PIXI.Graphics(); + sprite.beginFill(string2hex(Params.Color)); + sprite.drawRect(Params.Width/2 -linewidth/2, 0, linewidth, Params.Height); + sprite.drawRect(0, Params.Height/2 -linewidth/2, Params.Width, linewidth); + // Add it to the container + Map.set(id, sprite); + Container.addChild(sprite); + if (!kdprimitiveparams.has(id) || !same) + kdprimitiveparams.set(id, Params); + } + if (sprite) { + sprite.visible = true; + // Modify the sprite according to the params + sprite.name = id; + sprite.position.x = Params.Left; + sprite.position.y = Params.Top; + sprite.width = Params.Width; + sprite.height = Params.Height; + sprite.zIndex = Params.zIndex ? Params.zIndex : 0; + sprite.alpha = Params.alpha ? Params.alpha : 1; + kdSpritesDrawn.set(id, true); + return true; + } + return false; +} + + +//Just a copy of FillRectKD, but for circle +function FillCircleKD(Container: PIXIContainer, Map: Map, id: string, Params: CircleParams) { + let sprite = Map.get(id); + let same = true; + if (sprite && kdprimitiveparams.has(id)) { + for (let p of Object.entries(kdprimitiveparams.get(id))) { + if (Params[p[0]] != p[1]) { + same = false; + break; + } + } + } + if (!sprite || !same) { + if (sprite) sprite.destroy(); + // Make the prim + sprite = new PIXI.Graphics(); + sprite.beginFill(string2hex(Params.Color)); + sprite.drawCircle(Params.Radius, Params.Radius, Params.Radius); + // Add it to the container + Map.set(id, sprite); + Container.addChild(sprite); + if (!kdprimitiveparams.has(id)) + kdprimitiveparams.set(id, Params); + } + if (sprite) { + // Modify the sprite according to the params + sprite.name = id; + sprite.position.x = Params.Left - Params.Radius; + sprite.position.y = Params.Top - Params.Radius; + sprite.zIndex = Params.zIndex ? Params.zIndex : 0; + sprite.alpha = Params.alpha ? Params.alpha : 1; + kdSpritesDrawn.set(id, true); + return true; + } + return false; +} + + +/** + * Draws a basic rectangle filled with a given color + * @param Container + * @param Map + * @param Params - rect parameters + * @returns - If it worked + */ +function FillRectKD(Container: PIXIContainer, Map: Map, id: string, Params: RectParams): boolean { + let sprite = Map.get(id); + let same = true; + if (sprite && kdprimitiveparams.has(id)) { + for (let p of Object.entries(kdprimitiveparams.get(id))) { + if (Params[p[0]] != p[1]) { + same = false; + break; + } + } + } + if (!sprite || !same) { + if (sprite) sprite.destroy(); + // Make the prim + sprite = new PIXI.Graphics(); + sprite.beginFill(string2hex(Params.Color)); + sprite.drawRect(0, 0, Params.Width, Params.Height); + // Add it to the container + Map.set(id, sprite); + Container.addChild(sprite); + if (!kdprimitiveparams.has(id)) + kdprimitiveparams.set(id, Params); + } + if (sprite) { + sprite.visible = true; + // Modify the sprite according to the params + sprite.name = id; + sprite.position.x = Params.Left; + sprite.position.y = Params.Top; + sprite.width = Params.Width; + sprite.height = Params.Height; + sprite.zIndex = Params.zIndex ? Params.zIndex : 0; + sprite.alpha = Params.alpha ? Params.alpha : 1; + kdSpritesDrawn.set(id, true); + return true; + } + return false; +} + +type ButtonOptions = { + /// Dont show text backgrounds + noTextBG?: boolean; + alpha?: number; + /// zIndex + zIndex?: number; + /// This button is not differentiated by position + unique?: boolean; + /// Scale image to fit + scaleImage?: boolean; + /// centered + centered?: boolean + /// centered + centerText?: boolean; + /// tint + tint?: string; + /// hotkey + hotkey?: string; + /// hotkey + hotkeyPress?: string; + /// filters + filters?: any[]; + font?: string; + fontSize?: number; + maxWidth?: number; +} + +/** + * Draws a button component + * @param Left - Position of the component from the left of the canvas + * @param Top - Position of the component from the top of the canvas + * @param Width - Width of the component + * @param Height - Height of the component + * @param Label - Text to display in the button + * @param Color - Color of the component + * @param [Image] - URL of the image to draw inside the button, if applicable + * @param [HoveringText] - Text of the tooltip, if applicable + * @param [Disabled] - Disables the hovering options if set to true + * @param [NoBorder] - Disables the button border and only draws the image and selection halo + * @param [FillColor] - Color of the background + * @param [FontSize] - Color of the background + * @param [ShiftText] - Shift text to make room for the button + * @param [Stretch] - Stretch the image to fit + * @param [zIndex] - Stretch the image to fit + * @param [options] - Additional options + * @param [options.noTextBG] - Dont show text backgrounds + * @param [options.alpha] + * @param [options.zIndex] - zIndex + * @param [options.scaleImage] - zIndex + * @param [options.centered] - centered + * @param [options.centerText] - centered + * @param [options.tint] - tint + * @param [options.hotkey] - hotkey + * @param [options.hotkeyPress] - hotkey + * @param [options.filters] - filters + */ +function DrawButtonVis ( + Left: number, + Top: number, + Width: number, + Height: number, + Label: string, + Color: string, + Image?: string, + HoveringText?: string, + Disabled?: boolean, + NoBorder?: boolean, + FillColor?: string, + FontSize?: number, + ShiftText?: boolean, + Stretch?: boolean, + zIndex: number = 100, + options?: ButtonOptions +): void +{ + DrawButtonVisTo(kdcanvas, Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, Stretch, zIndex, options); +} + + +/** + * Draws a button component + * @param Container - Container to draw to + * @param Left - Position of the component from the left of the canvas + * @param Top - Position of the component from the top of the canvas + * @param Width - Width of the component + * @param Height - Height of the component + * @param Label - Text to display in the button + * @param Color - Color of the component + * @param [Image] - URL of the image to draw inside the button, if applicable + * @param [HoveringText] - Text of the tooltip, if applicable + * @param [Disabled] - Disables the hovering options if set to true + * @param [NoBorder] - Disables the button border and only draws the image and selection halo + * @param [FillColor] - Color of the background + * @param [FontSize] - Color of the background + * @param [ShiftText] - Shift text to make room for the button + * @param [Stretch] - Stretch the image to fit + * @param [zIndex] - Stretch the image to fit + * @param [options] - Additional options + * @param [options.noTextBG] - Dont show text backgrounds + * @param [options.alpha] + * @param [options.zIndex] - zIndex + * @param [options.unique] - This button is not differentiated by position + * @param [options.scaleImage] - zIndex + * @param [options.centered] - centered + * @param [options.centerText] - centered + * @param [options.tint] - tint + * @param [options.hotkey] - hotkey + * @param [options.hotkeyPress] - hotkey + * @param [options.filters] - filters + */ +function DrawButtonVisTo ( + Container: PIXIContainer, + Left: number, + Top: number, + Width: number, + Height: number, + Label: string, + Color: string, + Image?: string, + HoveringText?: string, + Disabled?: boolean, + NoBorder?: boolean, + FillColor?: string, + FontSize?: number, + ShiftText?: boolean, + Stretch?: boolean, + zIndex: number = 100, + options?: ButtonOptions +): void +{ + let hover = ((MouseX >= Left) && (MouseX <= Left + Width) && (MouseY >= Top) && (MouseY <= Top + Height) && !CommonIsMobile && !Disabled); + if (!NoBorder || FillColor) + DrawBoxKDTo(Container, Left, Top, Width, Height, + FillColor ? FillColor : (hover ? (KDTextGray2) : KDButtonColor), + NoBorder, options?.alpha || 0.5, zIndex, + ); + if (hover) { + let pad = 4; + // Draw the button rectangle (makes the background color cyan if the mouse is over it) + DrawRectKD(Container || kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height + "out", { + Left: Left + pad, + Top: Top + pad, + Width: Width - 2 * pad + 1, + Height: Height - 2 * pad + 1, + Color: "#ffffff", + LineWidth: 2, + zIndex: zIndex + 0.005, + }); + KDButtonHovering = true; + } + + // Draw the text or image + let textPush = 0; + if ((Image != null) && (Image != "")) { + let img = KDTex(Image); + if (Stretch || options?.scaleImage) { + let o = { + zIndex: zIndex + 0.01, + filters: options?.filters, + }; + if (options?.tint) o['tint'] = options.tint; + KDDraw(Container || kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height, + Image, Left, Top, + Width, Height, undefined, o); + /*DrawImageEx(Image, Left, Top, { + Width: Width, + Height: Height, + });*/ + } else { + let o = { + zIndex: zIndex + 0.01, + filters: options?.filters, + }; + if (options?.tint) o['tint'] = options.tint; + let centered = options?.centered + || (img.orig.width > Width + && img.orig.height > Height) + KDDraw(Container || kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height, + Image, (centered ? Width/2 - img.orig.width/2 : 2) + Left, + Top + Height/2 - img.orig.height/2, img.orig.width, img.orig.height, undefined, o); + } + textPush = img.orig.width; + } + + // Draw the tooltip + if ((HoveringText) && (MouseX >= Left) && (MouseX <= Left + Width) && (MouseY >= Top) && (MouseY <= Top + Height)) { + DrawTextFitKDTo(Container || kdcanvas, HoveringText, Left + Width / 2 + (ShiftText ? textPush*0.5 : 0), + Top + Math.floor(Height / 2), Width - 4 - Width*0.04 - (textPush ? (textPush + (ShiftText ? 0 : Width*0.04)) : Width*0.04), + "#ffffff", undefined, undefined, undefined, zIndex + 1, undefined, undefined, undefined, KDButtonFont); + //DrawHoverElements.push(() => DrawButtonHover(Left, Top, Width, Height, HoveringText)); + } else if (Label) + DrawTextFitKDTo(Container || kdcanvas, Label, Left + Width / 2 + (ShiftText ? textPush*0.5 : 0), + Top + Math.floor(Height / 2), (options?.centerText) ? Width : (Width - 4 - Width*0.04 - (textPush ? (textPush + (ShiftText ? 0 : Width*0.04)) : Width*0.04)), + Color, + (options && options.noTextBG) ? "none" : undefined, + FontSize, undefined, zIndex + 0.009, undefined, undefined, + options?.unique, KDButtonFont); + + if (options?.hotkey) { + let size = (FontSize*0.6) || 14; + DrawTextFitKDTo(Container || kdcanvas, options?.hotkey, Left + Width - 4, + Top + (size / 2) + 2, Width*0.7, + '#ffffff', + (options && options.noTextBG) ? "none" : undefined, + size, "right", zIndex + 0.02, undefined, undefined, undefined, KDButtonFont); + } +} + + + +/** + * Draws a checkbox component + * @param Left - Position of the component from the left of the canvas + * @param Top - Position of the component from the top of the canvas + * @param Width - Width of the component + * @param Height - Height of the component + * @param Text - Label associated with the checkbox + * @param IsChecked - Whether or not the checkbox is checked + * @param [Disabled] - Disables the hovering options if set to true + * @param [TextColor] - Color of the text + * @param [options] - Additional options + * @param [options.noTextBG] - Dont show text backgrounds + * @param [options.alpha] + * @param [options.zIndex] - zIndex + */ +function DrawCheckboxVis ( + Left: number, + Top: number, + Width: number, + Height: number, + Text: string, + IsChecked: boolean, + Disabled: boolean = false, + TextColor: string = KDTextGray0, + _CheckImage: string = "Icons/Checked.png", + options?: ButtonOptions +): void +{ + DrawTextFitKD(Text, Left + 100, Top + 33, 1000, TextColor, "#333333", undefined, "left"); + DrawButtonVis(Left, Top, Width, Height, "", Disabled ? "#ebebe4" : "#ffffff", IsChecked ? (KinkyDungeonRootDirectory + "UI/Checked.png") : "", null, Disabled, + undefined, undefined, undefined, undefined, undefined, options?.zIndex, options); +} + + + +/** + * Draws a checkbox component + * @param name - Name of the button element + * @param func - Whether or not you can click on it + * @param enabled - Whether or not you can click on it + * @param Left - Position of the component from the left of the canvas + * @param Top - Position of the component from the top of the canvas + * @param Width - Width of the component + * @param Height - Height of the component + * @param Text - Label associated with the checkbox + * @param IsChecked - Whether or not the checkbox is checked + * @param [Disabled] - Disables the hovering options if set to true + * @param [TextColor] - Color of the text + * @param [options] - Additional options + * @param [options.noTextBG] - Dont show text backgrounds + * @param [options.alpha] + * @param [options.zIndex] - zIndex + * @param [options.maxWidth] - Max width + * @param [options.fontSize] - fontSize + * @param [options.scaleImage] - zIndex + */ +function DrawCheckboxKDEx ( + name: string, + func: (bdata: any) => boolean, + enabled: boolean, + Left: number, + Top: number, + Width: number, + Height: number, + Text: string, + IsChecked: boolean, + Disabled: boolean = false, + TextColor: string = KDTextGray0, + _CheckImage: string = "Icons/Checked.png", + options?: ButtonOptions +): void +{ + DrawTextFitKD(Text, Left + 10 + Width, Top + Height/2+1, options?.maxWidth || 1000, TextColor, "#333333", options?.fontSize, "left"); + DrawButtonKDEx(name, func, enabled, Left, Top, Width, Height, "", Disabled ? "#ebebe4" : "#ffffff", IsChecked ? (KinkyDungeonRootDirectory + "UI/Checked.png") : "", null, Disabled, + undefined, undefined, undefined, undefined, options); +} + + +/** + * Draw a back & next button component + * @param Left - Position of the component from the left of the canvas + * @param Top - Position of the component from the top of the canvas + * @param Width - Width of the component + * @param Height - Height of the component + * @param Label - Text inside the component + * @param Color - Color of the component + * @param [Image] - Image URL to draw in the component + * @param [BackText] - Text for the back button tooltip + * @param [NextText] - Text for the next button tooltip + * @param [Disabled] - Disables the hovering options if set to true + * @param [ArrowWidth] - How much of the button the previous/next sections cover. By default, half each. + * @param [NoBorder] - Disables the hovering options if set to true + * @param [options] - Additional options + * @param [options.noTextBG] - Dont show text backgrounds + * @param [options.alpha] + * @param [options.font] + */ +function DrawBackNextButtonVis ( + Left: number, + Top: number, + Width: number, + Height: number, + Label: string, + _Color: string, + Image?: string, + _BackText?: () => string, + _NextText?: () => string, + Disabled?: boolean, + ArrowWidth?: number, + _NoBorder?: boolean, + options?: ButtonOptions +): void +{ + //let id = "BackNext" + Left + "," + Top + "," + Width + Color; + // Set the widths of the previous/next sections to be colored cyan when hovering over them + // By default each covers half the width, together covering the whole button + if (ArrowWidth == null || ArrowWidth > Width / 2) ArrowWidth = Width / 2; + const LeftSplit = Left + ArrowWidth; + const RightSplit = Left + Width - ArrowWidth; + + DrawBoxKD(Left, Top, Width, Height, + KDButtonColor, undefined, options?.alpha || 0.5 + ); + + // Draw the button rectangle + + + if (MouseIn(Left, Top, Width, Height) && !CommonIsMobile && !Disabled) { + if (MouseX > RightSplit) { + DrawRectKD(kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height + "a", { + Left: RightSplit + 4, + Top: Top + 4, + Width: ArrowWidth - 8, + Height: Height - 8, + Color: "#ffffff", + LineWidth: 1, + zIndex: 101, + }); + //MainCanvas.rect(RightSplit + 4, Top + 4, ArrowWidth - 8, Height - 8); + } + else if (MouseX <= LeftSplit) { + DrawRectKD(kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height + "a", { + Left: Left + 4, + Top: Top + 4, + Width: ArrowWidth - 8, + Height: Height - 8, + Color: "#ffffff", + LineWidth: 1, + zIndex: 101, + }); + //MainCanvas.rect(Left + 4, Top + 4, ArrowWidth - 8, Height - 8); + } else { + DrawRectKD(kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height + "a", { + Left: Left + ArrowWidth + 4, + Top: Top + 4, + Width: Width - ArrowWidth * 2 - 8, + Height: Height - 8, + Color: "#ffffff", + LineWidth: 1, + zIndex: 101, + }); + //MainCanvas.rect(Left + 4 + ArrowWidth, Top + 4, Width - ArrowWidth * 2 - 8, Height - 8); + } + } + else if (CommonIsMobile && ArrowWidth < Width / 2 && !Disabled) { + // Fill in the arrow regions on mobile + + DrawRectKD(kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height + "a1", { + Left: Left + 4, + Top: Top + 4, + Width: ArrowWidth - 8, + Height: Height - 8, + Color: "#ffffff", + LineWidth: 1, + zIndex: 101, + }); + DrawRectKD(kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height + "a2", { + Left: RightSplit + 4, + Top: Top + 4, + Width: ArrowWidth - 8, + Height: Height - 8, + Color: "#ffffff", + LineWidth: 1, + zIndex: 101, + }); + } + /*MainCanvas.beginPath(); + MainCanvas.lineWidth = 1; + MainCanvas.strokeStyle = '#ffffff'; + MainCanvas.stroke(); + + MainCanvas.stroke(); + MainCanvas.closePath();*/ + + // Draw the text or image + DrawTextFitKD(Label, Left + Width / 2, Top + (Height / 2) + 1, (CommonIsMobile) ? Width - 6 : Width - 36, "#ffffff", undefined, undefined, undefined, undefined, undefined, undefined, undefined, options?.font); + + // Draw the back arrow + /*MainCanvas.beginPath(); + MainCanvas.fillStyle = KDTextGray0; + MainCanvas.moveTo(Left + 15, Top + Height / 5); + MainCanvas.lineTo(Left + 5, Top + Height / 2); + MainCanvas.lineTo(Left + 15, Top + Height - Height / 5); + MainCanvas.stroke(); + MainCanvas.closePath(); + + // Draw the next arrow + MainCanvas.beginPath(); + MainCanvas.fillStyle = KDTextGray0; + MainCanvas.moveTo(Left + Width - 15, Top + Height / 5); + MainCanvas.lineTo(Left + Width - 5, Top + Height / 2); + MainCanvas.lineTo(Left + Width - 15, Top + Height - Height / 5); + MainCanvas.stroke(); + MainCanvas.closePath();*/ +} + + +/** + * @param CamX + * @param CamY + * @param CamX_offset + * @param CamY_offset + * @param [Debug] + */ +function KDDrawMap(CamX: number, CamY: number, CamX_offset: number, CamY_offset: number, _CamX_offsetVis: number, _CamY_offsetVis: number, Debug?: boolean): any { + let tooltip = ""; + let KinkyDungeonForceRender = ""; + let KinkyDungeonForceRenderFloor = ""; + + for (let b of Object.values(KinkyDungeonPlayerBuffs)) { + if (b && b.mushroom) { + KinkyDungeonForceRender = '2'; + KinkyDungeonForceRenderFloor = "cry"; + } + } + + + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + let drawFloor = altType?.skin ? altType.skin : (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint); + + let noReplace = ""; + let noReplace_skin = {}; + for (let tile of Object.values(KDMapData.TilesSkin)) { + if (tile.skin && noReplace_skin[tile.skin] != undefined) { + let paramskin = KinkyDungeonMapParams[drawFloor]; + if (paramskin.noReplace) + noReplace_skin[tile.skin] = paramskin.noReplace; + else noReplace_skin[tile.skin] = ""; + } + } + + let params = KinkyDungeonMapParams[drawFloor]; + if (params?.noReplace) + noReplace = params.noReplace; + // Draw the grid and tiles + let rows = KDMapData.Grid.split('\n'); + for (let R = -1; R <= KinkyDungeonGridHeightDisplay + 1; R++) { + for (let X = -1; X <= KinkyDungeonGridWidthDisplay + 1; X++) { + let RY = R+CamY; + let RX = X+CamX; + if (!rows[RY]) continue; + let allowFog = KDAllowFog(); + if (RY >= 0 && RY < KDMapData.GridHeight && RX >= 0 && RX < KDMapData.GridWidth && (KinkyDungeonVisionGet(RX, RY) > 0 || (allowFog && KinkyDungeonFogGet(RX, RY) > 0))) { + if (Debug) { + if (KDCommanderChokes && KDCommanderChokes[RX + "," + RY]) { + DrawTextFitKD("Choke", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, KinkyDungeonGridSizeDisplay, "#aaaaaA"); + + } + + if ( KinkyDungeonTilesGet(RX + "," + RY)) { + if (KinkyDungeonTilesGet(RX + "," + RY).Lock) + DrawTextFitKD(KinkyDungeonTilesGet(RX + "," + RY).Lock, (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, "#aaaaaA"); + if (KinkyDungeonTilesGet(RX + "," + RY).MazeBlock) + DrawTextFitKD("MazeBlock", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + 10, KinkyDungeonGridSizeDisplay, "#aaaaaA"); + if (KinkyDungeonTilesGet(RX + "," + RY).MazeSeed) + DrawTextFitKD("MazeSeed", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + 10, KinkyDungeonGridSizeDisplay, "#aaaaaA"); + + if (KinkyDungeonTilesGet(RX + "," + RY).AI) + DrawTextFitKD(KinkyDungeonTilesGet(RX + "," + RY).AI, (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, "#aaaaaA"); + + if (KinkyDungeonTilesGet(RX + "," + RY).Type == "Prisoner") + DrawTextFitKD("Prisoner", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, "#aaaaaA"); + + if (KinkyDungeonTilesGet(RX + "," + RY).required && KinkyDungeonTilesGet(RX + "," + RY).required) + DrawTextFitKD(KinkyDungeonTilesGet(RX + "," + RY).required[0], (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#aaaaaA"); + + if (KinkyDungeonTilesGet(RX + "," + RY).Label && KinkyDungeonTilesGet(RX + "," + RY).required) + DrawTextFitKD(KinkyDungeonTilesGet(RX + "," + RY).required[0], (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/1.5, KinkyDungeonGridSizeDisplay, "#aaaaaA"); + if (KDMapData.Traffic[RY][RX] && KinkyDungeonState == "Game") + DrawTextFitKD("traffic_" + KDMapData.Traffic[RY][RX], (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#55ff55"); + + if (KinkyDungeonTilesGet(RX + "," + RY).OL) + DrawTextFitKD("Offlimits", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#ff5277"); + if (KinkyDungeonTilesGet(RX + "," + RY).NW) + DrawTextFitKD("NoWander", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/4, KinkyDungeonGridSizeDisplay, "#ff5277"); + if (KinkyDungeonTilesGet(RX + "," + RY).Jail) + DrawTextFitKD("Jail", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/5, KinkyDungeonGridSizeDisplay, "#ff5277"); + if (KinkyDungeonTilesGet(RX + "," + RY).Priority) + DrawTextFitKD("Priority", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay*0.67, KinkyDungeonGridSizeDisplay, "#55ff55"); + } + + for (let p of KinkyDungeonPOI) { + if (p.x == RX && p.y == RY) { + DrawTextFitKD("POI" + (p.requireTags && p.requireTags.includes("endpoint") ? "Endpoint" : ""), (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#999999"); + DrawTextFitKD((p.favor && p.favor.length > 0 ? p.favor[0] : ""), (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, "#999999"); + DrawTextFitKD((p.chance || 1.0) * 100 + "%", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#999999"); + } + } + if (KDMapData.Labels) + for (let k of Object.values(KDMapData.Labels)) { + for ( let p of k) { + if (p.x == RX && p.y == RY) { + DrawTextFitKD(p.name, (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#999999"); + DrawTextFitKD(p.type, (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, "#999999"); + } + } + } + for (let p of KDGameData.KeyringLocations) { + if (p.x == RX && p.y == RY) { + DrawTextFitKD("Keyring", (-CamX_offset + X)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/3, KinkyDungeonGridSizeDisplay, "#999999"); + } + } + } + let floor = KDMapData.TilesSkin[RX + "," + RY] ? + (KDMapData.TilesSkin[RX + "," + RY].force ? KDMapData.TilesSkin[RX + "," + RY].skin : KinkyDungeonMapIndex[KDMapData.TilesSkin[RX + "," + RY].skin] || KDMapData.TilesSkin[RX + "," + RY].skin) + : drawFloor; + let vision = KinkyDungeonVisionGet(RX, RY); + let nR = KDMapData.TilesSkin[RX + "," + RY] ? noReplace : noReplace_skin[floor]; + let code = KinkyDungeonTilesGet(RX + "," + RY)?.SkinCode || rows[RY][RX]; + let sprite = KinkyDungeonGetSprite(code, RX, RY, vision == 0, nR); + let sprite2 = KinkyDungeonGetSpriteOverlay(code, RX, RY, vision == 0, nR); + let sprite3 = KinkyDungeonGetSpriteOverlay2(code, RX, RY, vision == 0, nR); + if (KinkyDungeonForceRender) { + sprite = KinkyDungeonGetSprite(KinkyDungeonForceRender, RX, RY, vision == 0, nR); + sprite2 = null; + sprite3 = null; + } + if (KinkyDungeonForceRenderFloor != "") floor = KinkyDungeonForceRenderFloor; + let lightColor = (StandalonePatched && KDToggles.LightmapFilter) ? 0xffffff : KDGetLightColor(RX, RY); + + KDDraw(kdmapboard, kdpixisprites, RX + "," + RY, KinkyDungeonRootDirectory + "Floors/Floor_" + floor + "/" + sprite + ".png", + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: -2, + tint: (StandalonePatched && KDToggles.LightmapFilter) ? undefined : lightColor, + }); + if (sprite2) + KDDraw(kdmapboard, kdpixisprites, RX + "," + RY + "_o", KinkyDungeonRootDirectory + "FloorGeneric/" + sprite2 + ".png", + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: -1.1, + tint: (StandalonePatched && KDToggles.LightmapFilter) ? undefined : lightColor, + }); + + if (sprite3) + KDDraw(kdmapboard, kdpixisprites, RX + "," + RY + "_o2", KinkyDungeonRootDirectory + "FloorGeneric/" + sprite3 + ".png", + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: -1, + tint: (StandalonePatched && KDToggles.LightmapFilter) ? undefined : lightColor, + }); + + if (rows[RY][RX] == "A") { + let color = ""; + if (KinkyDungeonTilesGet(RX + "," + RY)) { + color = KDGoddessColor(KinkyDungeonTilesGet(RX + "," + RY).Name); + } + if (color) + KDDraw(kdmapboard, kdpixisprites, RX + "," + RY + "_a", KinkyDungeonRootDirectory + "ShrineAura.png", + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + tint: string2hex(color), + }); + if (KinkyDungeonTilesGet(RX + "," + RY)?.Quest) + KDDraw(kdmapboard, kdpixisprites, RX + "," + RY + "_a2", KinkyDungeonRootDirectory + "ShrineAuraQuest.png", + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay, (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + tint: color ? string2hex(color) : 0xffffff, + }); + } + if (KinkyDungeonVisionGet(RX, RY) > 0 + && (KinkyDungeonTilesGet(RX + "," + RY) && rows[RY][RX] == "A" || KinkyDungeonTilesGet(RX + "," + RY) && rows[RY][RX] == "M") + && MouseIn(canvasOffsetX + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (-CamY_offset+R)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay)) { + tooltip = TextGet("KinkyDungeon" + KinkyDungeonTilesGet(RX + "," + RY).Type + "Tooltip").replace("SHRINETYPE", TextGet("KinkyDungeonShrine" + KinkyDungeonTilesGet(RX + "," + RY).Name)); + } + } + } + } + + + return { + tooltip: tooltip, + KinkyDungeonForceRender: KinkyDungeonForceRender, + }; +} + +/** + * @param Container + * @param Map + * @param id + * @param Image + * @param Left + * @param Top + * @param Width + * @param Height + * @param [Rotation] + * @param [options] + * @param [Centered] + * @param [SpritesDrawn] + * @param [Scale] + * @param [Nearest] + * @returns {any} + */ +function KDDraw ( + Container: PIXIContainer, + Map: Map, + id: string, + Image: string, + Left: number, + Top: number, + Width: number, + Height: number, + Rotation?: number, + options?: any, + Centered?: boolean, + SpritesDrawn?: Map, + Scale?: number, + Nearest?: boolean +): any +{ + let sprite: PIXISprite = Map.get(id); + if (!sprite?.parent) { + sprite = null; + Map.delete(id); + }; + if (!sprite) { + // Load the texture + if (Nearest && StandalonePatched) { + PIXI.BaseTexture.defaultOptions.scaleMode = PIXI.SCALE_MODES.NEAREST; + } + let tex = KDTex(Image, Nearest); + + if (tex) { + // Create the sprite + if (Nearest) + sprite = PIXI.Sprite.from(KDTex(Image, Nearest), { + scaleMode: PIXI.SCALE_MODES.NEAREST, + }); + else + sprite = PIXI.Sprite.from(KDTex(Image)); + Map.set(id, sprite); + // Add it to the container + Container.addChild(sprite); + } + if (Nearest && StandalonePatched) { + PIXI.BaseTexture.defaultOptions.scaleMode = PIXI.SCALE_MODES.LINEAR; + } + } + if (sprite) { + sprite.visible = true; + //sprite.roundPixels = true; + sprite.interactive = false; + // Modify the sprite according to the params + let tex = KDTex(Image); + if (tex) sprite.texture = tex; + sprite.name = id; + sprite.position.x = Left; + sprite.position.y = Top; + if (Width) + sprite.width = Width; + if (Height) + sprite.height = Height; + if (Scale) { + sprite.scale.x = Scale; + sprite.scale.y = Scale; + } + if (Centered) { + sprite.anchor.set(0.5); + } + if (Rotation != undefined) + sprite.rotation = Rotation; + if (options) { + if (options.filters && sprite.cacheAsBitmap) { + sprite.filters = null; + } else { + for (let [k, v] of Object.entries(options)) { + if (v != undefined || k != "tint") + sprite[k] = v; + } + } + + if (options.zIndex != undefined) { + sprite.zIndex = options.zIndex; + } + if (options.scalex != undefined) { + sprite.scale.x = sprite.scale.x * options.scalex; + } + if (options.scaley != undefined) { + sprite.scale.y = sprite.scale.y * options.scaley; + } + if (options.anchorx != undefined) { + if (options.normalizeAnchorX) { + sprite.anchor.x = options.anchorx * (options.normalizeAnchorX/sprite.texture.width); + } else { + sprite.anchor.x = options.anchorx; + } + + } + if (options.anchory != undefined) { + if (options.normalizeAnchorY) { + sprite.anchor.y = options.anchory * (options.normalizeAnchorY/sprite.texture.height); + } else { + sprite.anchor.y = options.anchory; + } + } + } + if (SpritesDrawn) + SpritesDrawn.set(id, true); + else + kdSpritesDrawn.set(id, true); + return sprite; + } + return null; +} + + +let KDAdaptiveTexCache: Map = new Map(); +let KDAdaptiveTexCacheThreshold = 2; // 2 consecutive lookups +let KDAdaptiveTexCacheMax = 10; // 10 consecutive lookups + +function KDTickAdaptiveTexCache(delta: number) { + if (delta > 0) + for (let entry of KDAdaptiveTexCache.entries()) { + KDAdaptiveTexCache.set(entry[0], entry[1] - delta); + if (!KDAdaptiveTexCache.get(entry[0]) || KDAdaptiveTexCache.get(entry[0]) < 0) + KDAdaptiveTexCache.delete(entry[0]); + } +} +function KDDoAdaptiveTexCache(id: string, delta: number): boolean { + let curr = KDAdaptiveTexCache.get(id) || 0; + KDAdaptiveTexCache.set(id, Math.min(curr + delta, KDAdaptiveTexCacheMax)); + return curr + delta > KDAdaptiveTexCacheThreshold; +} + +/** The purpose of this is to prerender a rendertexture with a specific set of filters + * This is important because we dont want to rerender those filters constantly + * if there are no filters then its unnecessary + */ +function KDGetOrMakeRenderTexture(Image: string, Nearest: boolean, id: string = "", filters: PIXIFilter[], + force: boolean = false, useAtlas: boolean = true, resolution: number = 1): PIXITexture { + let baseTex = KDTex(Image, Nearest); + + if (!force && (!filters || filters.length == 0)) return baseTex; + + kdTexlastLookup.set(Image + id, CommonTime()); + + if (!baseTex) return null; + + let res = useAtlas ? baseTex.baseTexture.resource.src : Image; + + // TODO add adaptive decision making based on how often this sprite is referenced + + if (!res || (!force && !KDDoAdaptiveTexCache(res + id, 1) && !kdRTcache.get(res + id))) return null; + + kdRTlastLookup.set(res + id, CommonTime()); + let rt: PIXIRenderTexture = kdRTcache.get(res + id) || PIXI.RenderTexture.create({ + width: useAtlas ? baseTex.baseTexture.width : baseTex.width, + height: useAtlas ? baseTex.baseTexture.height : baseTex.height, + resolution: resolution * (useAtlas ? baseTex.baseTexture.resolution : baseTex.resolution) + }); + if (!kdRTcache.get(res + id) && res) { + // do the rendering fr + let sprite: PIXISprite = (kdpixisprites.get(res + id) && !kdpixisprites.get(res + id).destroyed) ? + kdpixisprites.get(res + id) : PIXI.Sprite.from( + useAtlas ? baseTex.baseTexture : baseTex); + + sprite.setTransform(); + sprite.filters = filters; + + PIXIapp.renderer.render(sprite, { + renderTexture: rt, + }); + kdpixisprites.set(res + id, sprite); + + kdRTSpritecache.set(rt, sprite); + + if (!kdRTcache.get(res + id)) kdRTcache.set(res + id, rt); + } + + let tex = kdTexcache.get(Image + id) + || new PIXI.Texture( + rt.baseTexture, + useAtlas ? baseTex.frame : undefined, + useAtlas ? baseTex.orig : undefined, + useAtlas ? baseTex.trim : undefined, + useAtlas ? baseTex.rotate : undefined, + useAtlas ? baseTex.defaultAnchor : undefined, + useAtlas ? baseTex.defaultBorders : undefined); + if (!kdTexcache.get(Image + id)) kdTexcache.set(Image + id, tex); + + // We rendered the atlas, now we generate a new texture from the atlas based on the basetexture + return tex; +} + + +/** + * @param Container + * @param Map + * @param id + * @param Image + * @param Left + * @param Top + * @param Width + * @param Height + * @param [Rotation] + * @param [options] + * @param [Centered] + * @param [SpritesDrawn] + * @param [Scale] + * @param [Nearest] + * @returns {any} + */ +function KDDrawRT ( + Container: PIXIContainer, + Map: Map, + id: string, + filterid: string, + Image: string, + Left: number, + Top: number, + Width: number, + Height: number, + Rotation?: number, + options?: any, + Centered?: boolean, + SpritesDrawn?: Map, + Scale?: number, + Nearest?: boolean, + /** The filters to be used in render texture */ + baseFilters?: PIXIFilter[], + /** force to use RT regardless of filters */ + force: boolean = false, + /** force to use RT regardless of filters */ + useAtlas: boolean = true, + resolution: number = 1, +): any +{ + let sprite: PIXISprite = Map.get(id); + if (!sprite?.parent) { + sprite = null; + Map.delete(id); + }; + let mergeFilters = false; + if (!sprite) { + // Load the texture + if (Nearest && StandalonePatched) { + PIXI.BaseTexture.defaultOptions.scaleMode = PIXI.SCALE_MODES.NEAREST; + } + let tex = KDGetOrMakeRenderTexture(Image, Nearest, filterid, baseFilters, + force, useAtlas, resolution); + + if (tex) { + // Create the sprite by making a rendertexture + sprite = new PIXI.Sprite(tex); + Map.set(id, sprite); + // Add it to the container + Container.addChild(sprite); + } else { + mergeFilters = true; + if (Nearest) + sprite = PIXI.Sprite.from(KDTex(Image, Nearest), { + scaleMode: PIXI.SCALE_MODES.NEAREST, + }); + else + sprite = PIXI.Sprite.from(KDTex(Image)); + Map.set(id, sprite); + // Add it to the container + Container.addChild(sprite); + } + if (Nearest && StandalonePatched) { + PIXI.BaseTexture.defaultOptions.scaleMode = PIXI.SCALE_MODES.LINEAR; + } + } + if (sprite && sprite.texture && sprite.texture.orig) { + sprite.visible = true; + //sprite.roundPixels = true; + sprite.interactive = false; + // Modify the sprite according to the params + //let tex = KDTex(Image); + //let tex = KDGetOrMakeRenderTexture(Image, Nearest, filterid, baseFilters); + //if (tex) sprite.texture = tex; + sprite.name = id; + sprite.position.x = Left; + sprite.position.y = Top; + if (Width) + sprite.width = Width; + if (Height) + sprite.height = Height; + if (Scale) { + sprite.scale.x = Scale; + sprite.scale.y = Scale; + } + if (Centered) { + sprite.anchor.set(0.5); + } + if (Rotation != undefined) + sprite.rotation = Rotation; + if (options) { + if (options.filters && sprite.cacheAsBitmap) { + sprite.filters = null; + } else { + for (let [k, v] of Object.entries(options)) { + if (v != undefined || k != "tint") + sprite[k] = v; + } + } + if (mergeFilters && baseFilters?.length > 0 && options?.filters) { + sprite.filters = [...options.filters, ...baseFilters]; + } + + if (options.zIndex != undefined) { + sprite.zIndex = options.zIndex; + } + if (options.scalex != undefined) { + sprite.scale.x = sprite.scale.x * options.scalex; + } + if (options.scaley != undefined) { + sprite.scale.y = sprite.scale.y * options.scaley; + } + if (options.anchorx != undefined) { + if (options.normalizeAnchorX) { + sprite.anchor.x = options.anchorx * (options.normalizeAnchorX/sprite.texture.width); + } else { + sprite.anchor.x = options.anchorx; + } + + } + if (options.anchory != undefined) { + if (options.normalizeAnchorY) { + sprite.anchor.y = options.anchory * (options.normalizeAnchorY/sprite.texture.height); + } else { + sprite.anchor.y = options.anchory; + } + } + } + if (SpritesDrawn) + SpritesDrawn.set(id, true); + else + kdSpritesDrawn.set(id, true); + return sprite; + } + return null; +} + +let OPTIONS_NEAREST = {scaleMode: PIXI.SCALE_MODES.NEAREST}; + +let errorImg = {}; + +/** + * Returns a PIXI.Texture, or null if there isnt one + * @param Image + * @param [Nearest] - Use "nearest" scale mode + * @returns - Requested texture + */ +function KDTex(Image: string, Nearest?: boolean): PIXITexture { + if (kdpixitex.has(Image)) return kdpixitex.get(Image); + if (errorImg[KDModFiles[Image] || Image]) return null; + try { + let tex = Nearest ? PIXI.Texture.from(KDModFiles[Image] || Image, OPTIONS_NEAREST) : PIXI.Texture.from(KDModFiles[Image] || Image); + if (!tex) { + errorImg[KDModFiles[Image] || Image] = true; + } else { + kdpixitex.set(Image, tex); + } + return tex; + } catch (e) { + console.log("Failed to find texture " + Image); + return null; + } +} + +function string2hex(str: string) { + return PIXI.utils.string2hex(str); +} + +function GetAdjacentList(list: string[], index: number, width: number) { + return { + left: list.slice(0, index), + right: list.slice(index+width), + }; +} + + +function KDEnumLights(data: { + lights: KDLight[], + maplights: KDLight[], + effecttilelights: KDLight[], +}) { + let l = null; + for (let t of Object.keys(KDMapData.Tiles)) { + let tile = KinkyDungeonTilesGet(t); + let x = parseInt(t.split(',')[0]); + let y = parseInt(t.split(',')[1]); + if (tile && tile.Light && x && y) { + l = {x: x, y:y + (tile.Offset ? 1 : 0), y_orig: y, brightness: tile.Light, color: tile.lightColor}; + data.lights.push(l); + data.maplights.push(l); + } + } + for (let b of KDMapData.Bullets) { + if (b.bullet?.bulletColor && b.bullet.bulletLight > 0) { + l = {x: b.x, y:b.y, y_orig: b.y, brightness: b.bullet.bulletLight, color: b.bullet.bulletColor}; + data.lights.push(l); + } + } + for (let location of Object.values(KDMapData.EffectTiles)) { + for (let tile of Object.values(location)) { + if (tile.duration > 0) { + if (tile.lightColor) { + l = {x: tile.x + Math.round((tile.xoffset - 0.49) || 0), y:tile.y + Math.round((tile.yoffset - 0.49) || 0), y_orig: tile.y, brightness: tile.brightness, color: tile.lightColor}; + //data.lights.push(l); + data.effecttilelights.push(l); + } + } + } + } +} + +function KDUpdateVision(CamX?: number, CamY?: number, _CamX_offset?: number, _CamY_offset?: number) { + KinkyDungeonUpdateLightGrid = false; + KDRedrawFog = 2; + + let viewpoints = [ {x: KinkyDungeonPlayerEntity.x, y:KinkyDungeonPlayerEntity.y, brightness: KinkyDungeonDeaf ? 2 : 4 }]; + + let data: { + lights: KDLight[], + maplights: KDLight[], + effecttilelights: KDLight[], + } = { + lights: [], + maplights: [], + effecttilelights: [], + }; + KDEnumLights(data); + KinkyDungeonSendEvent("getLights", data); + + KinkyDungeonMakeBrightnessMap(KDMapData.GridWidth, KDMapData.GridHeight, KDMapData.MapBrightness, data.lights, KDVisionUpdate); + KinkyDungeonMakeVisionMap(KDMapData.GridWidth, KDMapData.GridHeight, viewpoints, data.lights, KDVisionUpdate, KDMapData.MapBrightness); + if (KinkyDungeonUpdateLightGrid) { + // Do it again! + KinkyDungeonMakeVisionMap(KDMapData.GridWidth, KDMapData.GridHeight, viewpoints, data.lights, 0, KDMapData.MapBrightness); + } + + if (CamX != undefined) { + if (KDToggles.Bloom && !(KinkyDungeonBlindLevel >= 2)) { + let pad = (324-KinkyDungeonGridSizeDisplay)/2; + for (let light of [...data.lights, ...data.maplights, ...data.effecttilelights]) { + if (!light.nobloom && KinkyDungeonVisionGet(light.x_orig || light.x, light.y_orig || light.y)) { + KDDraw(kdgameboard, kdlightsprites, `${light.x},${light.y}_${light.brightness}_${light.color || 0xffffff}`, + KinkyDungeonRootDirectory + "Light.png", + (light.x - CamX + (light.visualxoffset || 0))*KinkyDungeonGridSizeDisplay - pad, + (-CamY + light.y + (light.visualyoffset || 0))*KinkyDungeonGridSizeDisplay - pad, + KinkyDungeonGridSizeDisplay + pad*2, KinkyDungeonGridSizeDisplay + pad*2, + undefined, { + tint: light.color || 0xffffff, + alpha: Math.min(1, (1 - 0.5 * (KDGameData.visionAdjust || 0)) * Math.max(0.001, light.brightness/20)), + blendMode: PIXI.BLEND_MODES.ADD, + zIndex: -0.1, + }, + ); + } + } + } + + KDCullSpritesList(kdlightsprites); + } + + KDVisionUpdate = 0; +} + +let KDTileTooltips: Record {color: string, text: string, desc?: string, noInspect?: boolean}> = { + '1': () => {return {color: "#aaaaaa", text: "1"};}, + '5': () => {return {color: "#aaaaaa", text: "5"};}, + '6': () => {return {color: "#aaaaaa", text: "6"};}, + '0': () => {return {color: "#444444", text: "0"};}, + '2': () => {return {color: "#444444", text: "2"};}, + 'R': () => {return {color: "#ffffff", noInspect: true, text: "R"};}, + 'Y': () => {return {color: "#ffffff", noInspect: true, text: "Y"};}, + 'L': () => {return {color: "#812913", noInspect: true, text: "L"};}, + 'F': () => {return {color: "#812913", noInspect: true, text: "F"};}, + 'A': () => {return {color: "#6d89d7", noInspect: true, text: "A"};}, + 'M': () => {return {color: "#cb6161", noInspect: true, text: "M"};}, + 'a': () => {return {color: "#ffffff", text: "a"};}, + 'O': () => {return {color: "#92e8c0", text: "O"};}, + 'o': () => {return {color: "#ffffff", text: "o"};}, + 'C': (x, y) => { + let tile = KinkyDungeonTilesGet(x + ',' + y); + return {color: "#ffee83", noInspect: true, text: tile?.Faction ? "C2" : "C", desc: + tile?.Faction ? TextGet("KDChestTooltip") + TextGet("KinkyDungeonFaction" + (tile.Faction)) + : undefined};}, + 'c': () => {return {color: "#ffffff", text: "c"};}, + 'T': () => {return {color: "#444444", text: "T"};}, + '4': () => {return {color: "#898989", noInspect: true, text: "4"};}, + 'X': () => {return {color: "#aaaaaa", text: "X"};}, + '?': () => {return {color: "#ffffff", noInspect: true, text: "Hook"};}, + ',': () => {return {color: "#ffffff", noInspect: true, text: "Hook"};}, + 'S': () => {return {color: "#6a8eb3", noInspect: true, text: "S"};}, + 's': () => {return {color: "#96caff", noInspect: true, text: "s"};}, + 'H': (x, y) => { + let tile = KinkyDungeonTilesGet(x + ',' + y); + return {color: "#96caff", noInspect: true, text: "H", desc: + TextGet("KDLeadsTo").replace("PLCE", KDGetDungeonName({ + mapX: KDGetCurrentLocation().mapX, + mapY: KDGetCurrentLocation().mapY, + room: tile?.RoomType + }))}; + }, + 'G': () => {return {color: "#69bf3e", noInspect: true, text: "G"};}, + 'B': () => {return {color: "#4444ff", noInspect: true, text: "B"};}, + '@': () => {return {color: "#ffffff", noInspect: true, text: "@"};}, + 'b': () => {return {color: "#aaaaaa", noInspect: true, text: "b"};}, + 'D': () => {return {color: "#9c4f3e", noInspect: true, text: "D"};}, + 'd': () => {return {color: "#7e4336", noInspect: true, text: "d"};}, + 'Z': () => {return {color: "#ffffff", noInspect: true, text: "Z"};}, + 'z': () => {return {color: "#ffffff", noInspect: true, text: "z"};}, + 't': () => {return {color: "#aa55ff", noInspect: true, text: "t"};}, + 'u': () => {return {color: "#ffffff", noInspect: true, text: "u"};}, + 'V': () => {return {color: "#ffffff", noInspect: true, text: "V"};}, + 'v': () => {return {color: "#ffffff", noInspect: true, text: "v"};}, + 'N': () => {return {color: "#4c6885", noInspect: true, text: "N"};}, + '=': () => {return {color: "#aaaaaa", noInspect: true, text: "="};}, + '+': () => {return {color: "#ffffff", noInspect: true, text: "+"};}, +}; + +function KDGetTileColor(x: number, y: number): string { + let color = ""; + + if (!KDIsInBounds(x, y, 0)) return "#000000"; + let eTile = KDGetEffectTiles(x, y); + let maxPri = -1000; + let maxTile = null; + for (let tile of Object.entries(eTile)) { + if (tile[1].priority > maxPri && KDEffectTileTooltips[tile[0]] && KDCanSeeEffectTile(tile[1])) { + maxTile = tile[0]; + maxPri = tile[1].priority; + } + } + + if (maxTile) { + color = KDEffectTileTooltips[maxTile].color; + } else { + let tile = KinkyDungeonMapGet(x, y); + if (KDTileTooltips[tile]) { + color = KDTileTooltips[tile](x, y).color; + } + } + + return color || "#444444"; +} + + +function KDDrawTileTooltip(maptile: string, x: number, y: number, offset: number) { + let TooltipList = []; + TooltipList.push({ + str: TextGet("KDTileTooltip" + KDTileTooltips[maptile](x, y).text), + fg: KDTileTooltips[maptile](x, y).color, + bg: "#000000", + size: 24, + center: true, + }); + if (KDTileTooltips[maptile](x, y).desc) + TooltipList.push({ + str: KDTileTooltips[maptile](x, y).desc, + fg: "#ffffff", + bg: "#000000", + size: 18, + center: true, + }); + + + return KDDrawTooltip(TooltipList, offset); +} + + +/** + */ +let KDEffectTileTooltips: Record void}> = { + 'Portals/DarkPortal': { + color: "#8b53e9", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#8b53e9", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: "#ffffff", + bg: "#000000", + size: 16, + center: true, + }); + }, + }, + 'DistractionMote': { + color: "#8b53e9", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#ff8ed1", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: "#ffffff", + bg: "#000000", + size: 16, + center: true, + }); + }, + }, + 'DistractionMoteContact': { + color: "#8b53e9", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#ff8ed1", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: "#ffffff", + bg: "#000000", + size: 16, + center: true, + }); + }, + }, + 'SealSigil': { + color: "#534fc1", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#b38eff", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: "#ffffff", + bg: "#000000", + size: 16, + center: true, + }); + }, + }, + 'Runes': { + color: "#ff5277", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#ff5277", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: "#ffffff", + bg: "#000000", + size: 16, + center: true, + }); + } + }, + 'RunesTrap': { + color: "#92e8c0", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#92e8c0", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: "#ffffff", + bg: "#000000", + size: 16, + center: true, + }); + } + }, + 'BoobyTrapMagic': { + color: "#92e8c0", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#92e8c0", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: "#ffffff", + bg: "#000000", + size: 16, + center: true, + }); + } + }, + 'BoobyTrap': { + color: "#ffffff", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#ffffff", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: "#ffffff", + bg: "#000000", + size: 16, + center: true, + }); + } + }, + 'NoTeleportPlate': { + color: "#ffffff", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#ffffff", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: "#ffffff", + bg: "#000000", + size: 16, + center: true, + }); + } + }, + 'TeleportPlateMana': { + color: "#ffffff", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#ffffff", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: "#ffffff", + bg: "#000000", + size: 16, + center: true, + }); + } + }, + 'TeleportPlate': { + color: "#ffffff", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#ffffff", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: "#ffffff", + bg: "#000000", + size: 16, + center: true, + }); + } + }, + 'Inferno': { + color: "#ff8855", + code: (tile, _x, _y, TooltipList) => { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: "#ff8855", + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc").replace("DAMAGEDEALT", "" + Math.round(10 * KDGetEnvironmentalDmg())), + fg: "#ffaa55", + bg: "#000000", + size: 16, + center: true, + }); + } + }, + 'Ember': { + color: "#ffaa88", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffaa88");}}, + 'Ice': { + color: "#88ffff", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#88ffff");}}, + 'Water': { + color: "#8888ff", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#8888ff");}}, + 'Vines': { + color: "#44ff44", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#44ff44", "KDEffectTileTooltipCMDBindings");}}, + 'Ropes': { + color: "#ffae70", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffae70", "KDEffectTileTooltipCMDBindings");}}, + 'Chains': { + color: "#aaaaaa", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#aaaaaa", "KDEffectTileTooltipCMDBindings");}}, + 'Belts': { + color: "#8f4d57", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#8f4d57", "KDEffectTileTooltipCMDBindings");}}, + 'Fabric': { + color: "#ff5277", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff5277", "KDEffectTileTooltipCMDBindings");}}, + 'FabricGreen': { + color: "#4fd658", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#4fd658", "KDEffectTileTooltipCMDBindings");}}, + 'Slime': { + color: "#d952ff", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#d952ff", "KDEffectTileTooltipCMDSlime");}}, + 'Glue': { + color: "#e7cf1a", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#e7cf1a", "KDEffectTileTooltipCMDGlue");}}, + 'Radiance': { + color: "#ffff00", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffff00", "Radiance");}}, + 'Latex': { + color: "#d952ff", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#d952ff");}}, + 'LatexThin': { + color: "#d952ff", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#d952ff");}}, + 'Steam': { + color: "#ffffff", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'Smoke': { + color: "#000000", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#888888");}}, + 'Torch': { + color: "#ff8933", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'TorchUnlit': { + color: "#888888", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'Lantern': { + color: "#ff8933", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'LanternUnlit': { + color: "#888888", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'IllusOrb': { + color: "#ff8933", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'IllusOrbDead': { + color: "#555555", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'EdgeOrb': { + color: "#ff8933", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'MotionLamp': { + color: "#ff8933", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'SpikeTrap': { + color: "#ffffff", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'SpikeTrapSeen': { + color: "#ffffff", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'ManaEmpty': { + color: "#ff8933", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'ManaPartial': { + color: "#ffffff", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'ManaFull': { + color: "#ffffff", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'EdgeOrbDead': { + color: "#555555", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'TorchOrb': { + color: "#ff8933", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'OrbLantern': { + color: "#ff8933", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + 'Cracked': { + color: "#ff8844", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff8844");}}, + 'Rubble': { + color: "#ff8844", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff8844");}}, + 'RubbleNoMend': { + color: "#ff8844", + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff8844");}}, +}; +/** + * @param tile + * @param TooltipList + * @param color + * @param [extra] + * @param [descColor] + * @param [extraColor] + */ +function KDETileTooltipSimple(tile: effectTile, TooltipList: any[], color: string, extra?: string, descColor: string = "#ffffff", extraColor: string = "#ffffff") { + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name), + fg: color, + bg: "#000000", + size: 24, + center: true, + }); + TooltipList.push({ + str: TextGet("KDEffectTileTooltip" + tile.name + "Desc"), + fg: descColor, + bg: "#000000", + size: 16, + center: true, + }); + if (extra) { + TooltipList.push({ + str: TextGet(extra), + fg: extraColor, + bg: "#000000", + size: 16, + center: true, + }); + } +} + +/** + * @param tile + * @param x + * @param y + * @param offset + */ +function KDDrawEffectTileTooltip(tile: effectTile, x: number, y: number, offset: number): number { + let TooltipList = []; + KDEffectTileTooltips[tile.name].code(tile, x, y, TooltipList); + + return KDDrawTooltip(TooltipList, offset); +} + +function KDDrawTooltip(TooltipList: any[], offset: number, hidebg?: boolean): number { + let TooltipWidth = 300; + let TooltipHeight = 0; + let extra = 5; + for (let listItem of TooltipList) { + TooltipHeight += listItem.size + extra; + } + TooltipHeight = Math.max(20, TooltipHeight); + let tooltipX = 2000 - 250 - TooltipWidth; + let tooltipY = 790 - TooltipHeight - offset; + let YY = 0; + + if (!hidebg) + FillRectKD(kdcanvas, kdpixisprites, "inspectTooltip" + offset, { + Left: tooltipX, + Top: tooltipY - 25, + Width: TooltipWidth, + Height: TooltipHeight + 20, + Color: "#000000", + LineWidth: 1, + zIndex: 112, + alpha: 0.7, + }); + + let pad = 10; + + for (let listItem of TooltipList) { + if (listItem.str) + DrawTextFitKD(listItem.str, + tooltipX + (listItem.center ? TooltipWidth/2 : pad), + tooltipY + YY, TooltipWidth - 2 * pad, listItem.fg, listItem.bg, + listItem.size, listItem.center ? "center" : "left", 113); + if (listItem.npcSprite) { + + // We refresh + if (KDDrewEnemyTooltipThisFrame) { + if (!KDDrewEnemyTooltip) { + KDRefreshCharacter.set(listItem.npcSprite, true); + } + } + if (KDRefreshCharacter.get(listItem.npcSprite)) { + if (!NPCTags.get(listItem.npcSprite)) { + NPCTags.set(listItem.npcSprite, new Map()); + } + NPCTags.set(listItem.npcSprite, KinkyDungeonUpdateRestraints(listItem.npcSprite, listItem.id, 0)); + } + KinkyDungeonDressPlayer(listItem.npcSprite, false, false, KDGameData.NPCRestraints ? KDGameData.NPCRestraints[listItem.id + ''] : undefined); + + DrawCharacter(listItem.npcSprite, + tooltipX + (listItem.center ? TooltipWidth/2 : pad) - (listItem.size)/4, + tooltipY + YY - 9, + (listItem.size)/1000, false, undefined, undefined, undefined, 120, false); + + } + YY += extra + listItem.size; + } + return offset + TooltipHeight + 30; +} + +/** + * Elements which are temporary and drawn using a declarative style + * If not redrawn at the end of a frame, they will be removed + */ +let KDTempElements = new Map(); +/** + * Elements which are temporary and drawn using a declarative style + * If not redrawn at the end of a frame, they will be removed + */ +let KDDrawnElements = new Map(); + +/** + * Creates a text field with the specified params + * @param Name + * @param Left + * @param Top + * @param Width + * @param Height + */ +function KDTextArea(Name: string, Left: number, Top: number, Width: number, Height: number) { + let Element = KDTempElements.get(Name); + let created = false; + if (!Element) { + ElementCreateTextArea(Name); + Element = document.getElementById(Name); + KDTempElements.set(Name, Element); + if (Element) created = true; + } + KDElementPosition(Name, Left, Top, Width, Height); + KDDrawnElements.set(Name, Element); + return {Element: Element, Created: created}; +} + +/** + * Creates a text field with the specified params + * @param Name + * @param Left + * @param Top + * @param Width + * @param Height + * @param [Type] + * @param [Value] + * @param [MaxLength] + * @param [TextSize] + */ +function KDTextField(Name: string, Left: number, Top: number, Width: number, Height: number, Type: string = "text", Value: string = "", MaxLength: string = "30", TextSize?: number) { + let Element = KDTempElements.get(Name); + let created = false; + if (!Element) { + ElementCreateInput(Name, Type, Value, MaxLength); + Element = document.getElementById(Name); + KDTempElements.set(Name, Element); + if (Element) created = true; + if (TextSize) { + Element.setAttribute("fontSize", TextSize); + } + } + KDElementPosition(Name, Left, Top, Width, Height, TextSize); + KDDrawnElements.set(Name, Element); + return {Element: Element, Created: created}; +} + + +/** + * Culls the text fields and other DOM elements created + */ +function KDCullTempElements(): void { + for (let Name of KDTempElements.keys()) { + if (!KDDrawnElements.get(Name)) { + ElementRemove(Name); + KDTempElements.delete(Name); + } + } + + KDDrawnElements = new Map(); +} + + +/** + * Draws an existing HTML element at a specific position within the document. The element is "centered" on the given coordinates by dividing its height and width by two. + * @param ElementID - The id of the input tag to (re-)position. + * @param X - Center point of the element on the X axis. + * @param Y - Center point of the element on the Y axis. + * @param W - Width of the element. + * @param [H] - Height of the element. + */ +function KDElementPosition(ElementID: string, X: number, Y: number, W: number, H?: number, FS?: number): void { + let E = document.getElementById(ElementID); + + if (!E) { + console.warn("A call to ElementPosition was made on non-existent element with ID '" + ElementID + "'"); + return; + } + + // For a vertical slider, swap the width and the height (the transformation is handled by CSS) + if (E.tagName.toLowerCase() === "input" && E.getAttribute("type") === "range" && E.classList.contains("Vertical")) { + let tmp = W; + W = H; + H = tmp; + } + + // Different positions based on the width/height ratio + + if (!PIXICanvas) PIXICanvas = MainCanvas.canvas; + const HRatio = (PIXICanvas.clientHeight || PIXICanvas.height || 1000) / 1000; + const WRatio = (PIXICanvas.clientWidth || PIXICanvas.width || 2000) / 2000; + const Font = (PIXICanvas.clientWidth || PIXICanvas.width || 1000) <= (PIXICanvas.clientHeight || PIXICanvas.height || 2000) * 2 ? + (PIXICanvas.clientWidth || PIXICanvas.width || 1000) / 50 : (PIXICanvas.clientHeight || PIXICanvas.height || 2000) / 25; + const Height = H ? H * HRatio : Font * 1.1; + const Width = W * WRatio; + const Top = (PIXICanvas.offsetTop || 0) + Y * HRatio - 4; + const Left = (PIXICanvas.offsetLeft || 0) + (X) * WRatio + 4; + + // Sets the element style + Object.assign(E.style, { + fontSize: (FS ? FS : Font) + "px", + fontFamily: "Verdana", + position: "fixed", + left: Left + "px", + top: Top + "px", + width: Width + "px", + height: Height + "px", + display: "inline" + }); +} + +/** + * Whether or not to show the quick inv + */ +function KDShowQuickInv(): boolean { + return KinkyDungeonShowInventory || (KDGameData.CurrentDialog && KDDialogue[KDGameData.CurrentDialog] && KDDialogue[KDGameData.CurrentDialog].inventory); +} + +let KDUpdateFog = false; +let KDLastCamPos = {x: 0, y: 0}; + +let KDDrawPlayer = true; + + +function KDPlayerDrawPoseButtons(C: Character) { + if (!KDModalArea) { + KDModalArea_x = 650; + KDModalArea_y = 430; + KDModalArea_width = 1000; + KDModalArea_height = 370; + } + KDDrawPoseButtons(C, 700, 580, true, true, true); + +} + +/** + * @returns the color in hex + */ +function KDGetLightColor(x: number, y: number): number { + let light = KinkyDungeonBrightnessGet(x, y); + let color = KDAvgColor(KinkyDungeonColorGet(x, y), KinkyDungeonShadowGet(x, y), light, 1); + color = KDAvgColor(color, 0xffffff, 1, 0.5); // Brighten + return color; +} + +/** + * @returns the color in hex + */ +function KDGetLightColorGreyscale(x: number, y: number): number { + let light = KinkyDungeonBrightnessGet(x, y); + let color = KDAvgColor(0xaaaaff, 0x030303, light, 1); + color = KDAvgColor(color, 0xffffff, 1, 0.5); // Brighten + return color; +} + +function KDMouseInModalArea(): boolean { + return (KDModalArea && MouseIn(KDModalArea_x, KDModalArea_y, KDModalArea_width, KDModalArea_height)); +} + + + +function KDMouseInPlayableArea(): boolean { + return MouseIn(canvasOffsetX, canvasOffsetY, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height) + && !MouseIn(0, 0, 500, 1000) + && !MouseIn(1940, 0, 70, 1000) + && !MouseIn(0, 920, 2000, 100) + && !MouseIn(1730, 255, 255, 150) + && !KDButtonHovering + && (!KDModalArea || !MouseIn(KDModalArea_x, KDModalArea_y, KDModalArea_width, KDModalArea_height)); +} + +function KDHotkeyToText(hotkey: string): string { + if (!hotkey) return "---"; + return hotkey.replace("Digit", "").replace("Key", "").replace("Control", "Ctrl"); +} + + + +function KDGetTargetRetType(x: number, y: number): string { + let enemy = KinkyDungeonEnemyAt(x, y); + + if (enemy) { + let agg = KinkyDungeonAggressive(enemy); + if (KDCanPassEnemy(KinkyDungeonPlayerEntity, enemy) && + (!agg || KDHelpless(enemy))) return "Pass"; + if (KDHostile(enemy) && agg) return "Attack"; + if (!KDHostile(enemy) && agg && KDCanDom(enemy)) return "Sub"; + return "Talk"; + } + + let tile = KinkyDungeonMapGet(x, y); + if (KinkyDungeonMovableTiles.includes(tile) && !(KinkyDungeonMovableTilesEnemy.includes(tile))) return "Action"; + return "Move"; +} + +let KDPIXIPaletteFilters = new Map(); + +/** + * @param x + * @param y + * @param w + * @param [scale] + * @param [selected] + * @param [callback] + * @parap [text] + * @param [deffault] + */ +function KDDrawPalettes(x: number, y: number, w: number, scale: number = 72, selected: string, callback?: (s: string) => void, text: string = "KDSelectPalette", deffault?: string) { + if (selected == undefined) selected = (deffault != undefined ? deffault : KDDefaultPalette); + let XX = x; + let YY = y; + //let row = 0; + let column = 0; + let spacing = 80; + let zero: [string, Record] = ["", {Highlight: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}]; + DrawTextFitKD(TextGet(text), x + scale*(0.5 + w)/2, y - 36, scale*w, "#ffffff", KDTextGray0, 20); + + for (let value of [zero, ...Object.entries(KinkyDungeonFactionFilters)]) { + if (!KDPIXIPaletteFilters.get(value[0])) + KDPIXIPaletteFilters.set(value[0], + new PIXI.filters.AdjustmentFilter(value[1].Highlight)); + KDDraw(kdcanvas, kdpixisprites, "palette" + value[0], KinkyDungeonRootDirectory + "UI/greyColor.png", + XX, YY, scale, scale, undefined, { + filters: [ + KDPIXIPaletteFilters.get(value[0]), + ] + }); + DrawButtonKDEx("choosepalette" + value[0], (_b) => { + if (callback) callback(value[0]); + else { + KDDefaultPalette = value[0]; + localStorage.setItem("KDDefaultPalette", value[0]); + } + return true; + }, true, XX - 3, YY - 3, scale + 7, scale + 7, "", "#ffffff", "", undefined, false, + value[0] != selected, KDButtonColor, undefined, undefined, { + zIndex: -10, + } + ); + DrawTextFitKD(TextGet("KDPalette" + value[0]), XX + scale/2, YY + scale - 12, scale, "#ffffff", KDTextGray0, 18); + column++; + if (column >= w) { + column = 0; + //row++; + YY += spacing; + XX = x; + } else { + XX += spacing; + } + } +} + +function KDGetOutlineFilter(color: number, alpha: number, quality: number, thickness: number): PIXIFilter { + if (StandalonePatched) { + if (!KDOutlineFilterCache.get(`${color}_${alpha}_${quality}`)) { + KDOutlineFilterCache.set(`${color}_${alpha}_${quality}`, new PIXI.filters.OutlineFilter(thickness, color, quality, alpha, true)); + } + return KDOutlineFilterCache.get(`${color}_${alpha}_${quality}`); + } + return null; +} + +function KDClearOutlineFilterCache(): void { + for (let f of KDOutlineFilterCache.values()) { + f.destroy(); + } + KDOutlineFilterCache = new Map(); +} + +let KDLastFilterSpritesSanitize = 0; + +function KDDoGraphicsSanitize(): void { + for (let t of KDRenderTexToDestroy) { + t.destroy(true); + } + KDRenderTexToDestroy = []; + for (let t of KDMeshToDestroy) { + delete t.filters; + t.destroy({ + children: true, + texture: true, + baseTexture: true, + }); + } + KDMeshToDestroy = []; + let map = new Map(); + for (let f of KDFilterCacheToDestroy) { + if (f.uniformGroup?.uniforms) { + f.destroy(); + map.set(f, true); + } + } + if (KDFilterCacheToDestroy.length > 0 && CommonTime() > KDLastFilterSpritesSanitize + KDCULLTIME) { + KDLastFilterSpritesSanitize = CommonTime(); + for (let f of kdFilterSprites.entries()) { + f[1] = f[1].filter((ff) => { + return !map.get(ff.filter); + }); + if (f[1].length > 0) { + kdFilterSprites.set(f[0], f[1]); + } else { + kdFilterSprites.delete(f[0]); + } + } + } + + KDFilterCacheToDestroy = []; + for (let s of KDSpritesToCull) { + delete s.filters; + if (!s.destroyed) + s.destroy(); + } + KDSpritesToCull = []; +} + +function KDGetFontMult(font?: string) { + if (!font) font = KDSelectedFont; + if (KDFontsAlias.get(font)) { + return KDFontsAlias.get(font).width; + } + return 1.0; +} + + +let KDCustomDraw = { + "Bondage": () => { + KDDrawNavBar(1); + if (KDGameData.PlayerName) { + DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); + } + KinkyDungeonDrawBondage(); + } +}; + +type InvColorFilterData = { + restraints: Record; + id: number; + entity: entity; + player: entity; + force: boolean; +} + +let KDCustomDrawInvColorFilter = { + "Bondage": (data: InvColorFilterData) => { + return (inv: any) => { + if (KDRowItemIsValid(KDRestraint(inv.item), KDNPCBindingSelectedSlot, KDNPCBindingSelectedRow, data.restraints)) + return data.force ? KDTextGray1 : KDCanApplyBondage(data.entity, data.player, + inv ? ( + KDRestraint(inv)?.quickBindCondition ? + (t: entity, p: entity) => (KDQuickBindConditions[KDRestraint(inv)?.quickBindCondition]( + t, p, + KDRestraint(inv), + inv)) : + undefined + ) : undefined) ? "#63ab3f" : "#f0b541"; + return "#e64539"; + }; + }, +}; + + +function KDPlayerZoom(PlayerModel: ModelContainer): number { + return PlayerModel ? KinkyDungeonGridSizeDisplay/1100 + : KinkyDungeonGridSizeDisplay/250; +} + +function KDDrawChibi(Character: Character, x: number, y: number, zoom: number) { + DrawCharacter(Character, + x, y, + zoom, false, undefined, + PIXI.SCALE_MODES.NEAREST, CHIBIMOD, undefined, KDFlipPlayer, ["Sprite"], + undefined, CHIBIMODEND); + + +} + +function MouseOverChar() { + return MouseIn(0, 0, 500, 1000); +} \ No newline at end of file diff --git a/Game/src/base/KinkyDungeonErrors.ts b/Game/src/base/KinkyDungeonErrors.ts new file mode 100644 index 000000000..a7a8bf873 --- /dev/null +++ b/Game/src/base/KinkyDungeonErrors.ts @@ -0,0 +1,322 @@ +'use strict'; + +/** + * Sets up the KD crash handler + */ +function KinkyDungeonSetupCrashHandler(): void { + window.addEventListener("error", KinkyDungeonOnUncaughtError); +} + +/** + * Tears down the KD crash handler + */ +function KinkyDungeonTeardownCrashHandler(): void { + window.removeEventListener("error", KinkyDungeonOnUncaughtError); +} + +/** + * Error event handler for uncaught errors + * @param event - The error event + */ +function KinkyDungeonOnUncaughtError(event: ErrorEvent): void { + const report = KinkyDungeonGenerateErrorReport(event); + KinkyDungeonShowCrashReportModal(report); +} + +/** + * Generates an error report string containing crash debug data + * @param event - The error event + * @returns The report + */ +function KinkyDungeonGenerateErrorReport(event: ErrorEvent): string { + return [ + KinkyDungeonCrashReportErrorDetails(event), + KinkyDungeonCrashReportStateData(), + KinkyDungeonCrashReportDiagnostics(), + KinkyDungeonCrashReportDeviceDetails(), + KinkyDungeonCrashReportSaveData(), + ].join("\n\n"); +} + +/** + * Generates a report string containing debug data about the current state of the game + * @returns The report + */ +function KinkyDungeonCrashReportStateData(): string { + let version: string; + try { + version = (TextGet("KinkyDungeon") + " v" + TextGet("KDVersionStr")) || "Version unknown"; + } catch { + version = "Version unknown"; + } + let modFiles: string; + try { + modFiles = KDAllModFiles.map(({filename}) => filename).join(","); + } catch { + modFiles = "Failed to parse mod files"; + } + return [ + "========== Game State Data ==========", + "", + `Version: ${version}`, + `Test mode: ${TestMode}`, + `Debug mode: ${KDDebugMode}`, + `Kinky Dungeon state: ${KinkyDungeonState}`, + `Kinky Dungeon draw state: ${KinkyDungeonDrawState}`, + `Kinky Dungeon running: ${KinkyDungeonGameRunning}`, + `Loaded mod files: [${modFiles}]`, + `Targeting Spell: [${KinkyDungeonTargetingSpell}]`, + `Targeting Spell (Item): [${KinkyDungeonTargetingSpellItem}]`, + `Targeting Spell (Weapon): [${KinkyDungeonTargetingSpellWeapon}]`, + `Dialogue: [${KDGameData.CurrentDialog}]`, + `Dialogue Data: [${KDGameData.CurrentDialogMsgValue}]`, + `Dialogue Values: [${KDGameData.CurrentDialogMsgData}]`, + `Dialogue Speaker: [${KDGameData.CurrentDialogMsgSpeaker}]`, + `Room Type: [${KDGameData.RoomType}]`, + `Map Mod: [${KDGameData.MapMod}]`, + `Last action: [${KinkyDungeonLastAction}]`, + `Last turns action: [${KinkyDungeonLastTurnAction}]`, + `RestraintDebugLog: [${KDRestraintDebugLog}]`, + ].join("\n"); +} + +/** + * Generates an error report string containing debug data about the thrown error + * @param event - The error event + * @returns The report + */ +function KinkyDungeonCrashReportErrorDetails(event: ErrorEvent): string { + return [ + "========== Kinky Dungeon Crash Report ==========", + "", + `Message: ${event.message}`, + `Location: ${KinkyDungeonStackSanitize(event.filename)}:${event.lineno}:${event.colno}`, + "", + KinkyDungeonStackSanitize(event.error.stack), + ].join("\n"); +} + +/** + * Generates a report string containing the current save state of the game + * @returns The report + */ +function KinkyDungeonCrashReportSaveData(): string { + let saveData = localStorage.getItem("KinkyDungeonSave"); + if (!saveData) { + try { + saveData = LZString.compressToBase64(JSON.stringify(KinkyDungeonGenerateSaveData())); + } catch (error) { + saveData = "Could not locate or generate save data"; + } + } + return [ + "========== Save Data ==========", + "", + saveData, + ].join("\n"); +} + +/** + * Generates a report string containing debug data with general diagnostics information + * @returns The report + */ +function KinkyDungeonCrashReportDiagnostics(): string { + return [ + "========== Diagnostics ==========", + "", + `Location: ${KinkyDungeonStackSanitize(window.location.href)}`, + `User agent: ${window.navigator.userAgent}`, + `Locale: ${window.navigator.language}`, + `Local time: ${Date.now()}`, + `Mouse: [${MouseX}, ${MouseY}]`, + `WebGL supported: ${PIXI.utils.isWebGLSupported()}`, + ].join("\n"); +} + +/** + * Generates a report string containing debug data with device detection information + * @returns The report + */ +function KinkyDungeonCrashReportDeviceDetails(): string { + return [ + "========== Device Detection ==========", + "", + JSON.stringify(PIXI.utils.isMobile, null, 2), + ].join("\n"); +} + +/** + * Sanitizes a string to remove beta codes from it + * @returns The sanitized string + */ +function KinkyDungeonStackSanitize(stack: string): string { + // @ts-ignore + return stack.replaceAll(/\/\d{10,}/g, ""); +} + +/** + * Opens the KD crash report modal, displaying the provided report + * @param report - The report to display + */ +function KinkyDungeonShowCrashReportModal(report: string) { + const id = "kinky-dungeon-crash-report"; + + if (document.querySelector(`#${id}`)) { + return; + } + + const backdrop = document.createElement("div"); + backdrop.id = id; + Object.assign(backdrop.style, { + position: "fixed", + inset: 0, + backgroundColor: "#000000a0", + fontFamily: "'Arial', sans-serif", + fontSize: "1.8vmin", + lineHeight: 1.6, + }); + + const modal = document.createElement("div"); + Object.assign(modal.style, { + position: "absolute", + display: "flex", + flexFlow: "column nowrap", + width: "90vw", + maxWidth: "1440px", + maxHeight: "90vh", + overflow: "hidden", + backgroundColor: "#282828", + color: "#fafafa", + left: "50%", + top: "50%", + transform: "translate(-50%, -50%)", + padding: "1rem", + borderRadius: "2px", + boxShadow: "1px 1px 40px -8px #ffffff80", + }); + backdrop.appendChild(modal); + + const heading = document.createElement("h1"); + Object.assign(heading.style, { + display: "flex", + flexFlow: "row nowrap", + alignItems: "center", + justifyContent: "space-around", + textAlign: "center", + }); + heading.appendChild(KinkyDungeonErrorImage("WolfgirlPet")); + heading.appendChild(KinkyDungeonErrorImage("Wolfgirl")); + heading.appendChild(KinkyDungeonErrorImage("WolfgirlPet")); + heading.appendChild(document.createTextNode("Kinky Dungeon Crash Handler")); + heading.appendChild(KinkyDungeonErrorImage("WolfgirlPet")); + heading.appendChild(KinkyDungeonErrorImage("Wolfgirl")); + heading.appendChild(KinkyDungeonErrorImage("WolfgirlPet")); + modal.appendChild(heading); + + const hr = document.createElement("hr"); + Object.assign(hr.style, { + border: `1px solid ${KDBorderColor}`, + margin: "0 0 1.5em", + }); + modal.appendChild(hr); + + modal.appendChild(KinkyDungeonErrorPreamble([ + "An error has occurred whilst Kinky Dungeon was running. ", + "You may be able to continue playing, but Kinky Dungeon might not function correctly.", + ])); + modal.appendChild(KinkyDungeonErrorPreamble([ + "Please report this error in the Kinky Dungeon Discord so that we can dispatch our team of highly-trained wolfgirls to fix it.", + "When you make your report, please include the following debug information - the wolfgirls will appreciate it!", + ])); + + const pre = document.createElement("pre"); + Object.assign(pre.style, { + flex: 1, + backgroundColor: "#1a1a1a", + border: "1px solid #ffffff40", + fontSize: "1.1em", + padding: "1em", + userSelect: "all", + overflowWrap: "anywhere", + overflowX: "hidden", + overflowY: "auto", + color: KDBorderColor, + }); + pre.textContent = `\`\`\`\n${report}\n\`\`\``; + modal.appendChild(pre); + + const buttons = document.createElement("div"); + Object.assign(buttons.style, { + display: "flex", + flexFlow: "row wrap", + justifyContent: "flex-end", + gap: "1em", + }); + modal.appendChild(buttons); + + const copyButton = KinkyDungeonErrorModalButton("Copy to clipboard"); + copyButton.addEventListener("click", () => { + KinkyDungeonErrorCopy(report, pre) + .then(copied => { + copyButton.textContent = copied ? "Awoo!" : "Failed"; + }) + .catch(() => void 0); + }); + buttons.appendChild(copyButton); + + const closeButton = KinkyDungeonErrorModalButton("Close"); + closeButton.addEventListener("click", () => { + backdrop.remove(); + }); + buttons.appendChild(closeButton); + + document.body.appendChild(backdrop); +} + +function KinkyDungeonErrorImage(src: string): HTMLImageElement { + const img = document.createElement("img"); + img.src = `${KinkyDungeonRootDirectory}Enemies/${src}.png`; + Object.assign(img.style, { + maxWidth: "10vw", + }); + return img; +} + +function KinkyDungeonErrorPreamble(content: string[]): HTMLParagraphElement { + const preamble = document.createElement("p"); + Object.assign(preamble.style, { + margin: "0 0 0.5em", + fontSize: "1.25em", + }); + preamble.innerHTML = content.join(" "); + return preamble; +} + +function KinkyDungeonErrorModalButton(text: string): HTMLButtonElement { + const button = document.createElement("button"); + button.textContent = text; + Object.assign(button.style, { + fontSize: "1.25em", + padding: "0.5em 1em", + backgroundColor: KDButtonColor, + border: `2px solid ${KDBorderColor}`, + color: "#ffffff", + cursor: "pointer", + }); + return button; +} + +function KinkyDungeonErrorCopy(report: string, reportElement: HTMLElement): Promise { + return navigator.clipboard.writeText(report) + .then(() => true) + .catch(() => { + if (reportElement) { + const range = document.createRange(); + range.selectNode(reportElement); + window.getSelection()?.removeAllRanges(); + window.getSelection()?.addRange(range); + return document.execCommand("copy"); + } + return false; + }); +} diff --git a/Game/src/base/KinkyDungeonGame.ts b/Game/src/base/KinkyDungeonGame.ts new file mode 100644 index 000000000..e819f2637 --- /dev/null +++ b/Game/src/base/KinkyDungeonGame.ts @@ -0,0 +1,6696 @@ +"use strict"; + + +let KDFocusableTextFields = [ + "PerksFilter", + "InvFilter", + "CollFilter", + "QInvFilter", + "MagicFilter", + "RenameNPC", + "PlayerNameField", +]; + +let KDMAXGODDESSQUESTS = 3; + +let KDBalanceSprintMult = 3; +let KDBalanceInertiaMult = 1.5; +let KDBalanceAttackMult = 0.4; +let KDBalanceCastArmsMult = 1; +let KDBalanceCastLegsMult = 3; + +let KinkyDungeonGagMumbleChanceRestraint = 0.4; +let KinkyDungeonGagMumbleChance = 0.02; +let KinkyDungeonGagMumbleChancePerRestraint = 0.0025; + +let MiniGameKinkyDungeonCheckpoint = "grv"; +let MiniGameKinkyDungeonLevel = -1; +let KinkyDungeonMapIndex: Record = {}; + +let KDWorldMap: Record = {}; +let KDCurrentWorldSlot = {x: 0, y: 0}; +let KDMapData: KDMapDataType = {} as KDMapDataType; +/** This data can be regenerated as needed */ +let KDMapExtraData = { + Boringness: [] as number[], + VisionGrid: [] as number[], + ColorGrid: [] as number[], + ShadowGrid: [] as number[], + BrightnessGrid: [] as number[], +}; + +let KinkyDungeonUpdateLightGrid = true; +let KinkyDungeonGrid_Last = ""; + +let KinkyDungeonGridSizeDisplay = 72; +let KinkyDungeonGridWidthDisplay = 2000/KinkyDungeonGridSizeDisplay;//17; +let KinkyDungeonGridHeightDisplay = 1000/KinkyDungeonGridSizeDisplay;//9; + +let KinkyDungeonMoveDirection = KinkyDungeonGetDirection(0, 0); + +let KinkyDungeonTextMessagePriority = 0; +let KinkyDungeonTextMessage = ""; +let KinkyDungeonTextMessageNoPush = false; +let KinkyDungeonTextMessageTime = 0; +let KinkyDungeonTextMessageColor = "white"; + +let KinkyDungeonActionMessagePriority = 0; +let KinkyDungeonActionMessage = ""; +let KinkyDungeonActionMessageNoPush = false; +let KinkyDungeonActionMessageTime = 0; +let KinkyDungeonActionMessageColor = "white"; + +let KinkyDungeonSpriteSize = 72; + +let KinkyDungeonCanvas = document.createElement("canvas"); +let KinkyDungeonContext = null; +let KinkyDungeonCanvasFow = document.createElement("canvas"); +let KinkyDungeonContextFow = null; +let KinkyDungeonCanvasPlayer = document.createElement("canvas"); +let KinkyDungeonContextPlayer = null; + +let KinkyDungeonPOI = []; + +let KinkyDungeonStairTiles = 'sSH'; +let KDDefaultAvoidTiles = "gtVN@"; +let KinkyDungeonGroundTiles = "023wW][?/"; +let KinkyDungeonWallTiles = "14,6f"; +let KDCrackableTiles = '4Xaom-'; +let KDMendableTiles = '4'; +let KinkyDungeonBlockTiles = "14,6bgX7f"; +let KinkyDungeonMovableTilesEnemy = KinkyDungeonGroundTiles + "HB@l;SsRrdzTgLcNVvt5"; // Objects which can be moved into: floors, debris, open doors, staircases +// 5 is skinned floor, you can give it whatever sprite you want +// 6 is skinned wall, you can give it whatever sprite you want +let KinkyDungeonMovableTilesSmartEnemy = "D" + KinkyDungeonMovableTilesEnemy; //Smart enemies can open doors as well +let KinkyDungeonMovableTiles = "OPCAMG$Y+=-F67" + KinkyDungeonMovableTilesSmartEnemy; // Player can open chests, orbs, shrines, chargers +// 5 = floor object, passable +// 6 = wall object, block passage +// 7 = transparent wall object + +let KDRandomDisallowedNeighbors = ",?/RAasSHcCHDdOoPp+-=FZMmzgtuVvN567"; // tiles that can't be neighboring a randomly selected point +let KDTrappableNeighbors = "DA+-F@"; // tiles that might have traps bordering them with a small chance +let KDTrappableNeighborsLikely = "COP="; // tiles that might have traps bordering them with a big chance + +let KinkyDungeonTransparentObjects = KinkyDungeonMovableTiles + .replace("D", "") + .replace("g", "") // grate + .replace("Y", "") // wall rubble + + "OoAaMmCcB@lb+=-FXu7"; +let KinkyDungeonTransparentMovableObjects = KinkyDungeonMovableTiles + .replace("Z", "") // AutoDoor + .replace("D", "") // Door + .replace("g", ""); // Light does not pass thru doors or grates + +let KDOpenDoorTiles = ["DoorOpen", "DoorVertOpenCont", "DoorVertOpen"]; + + + +let KinkyDungeonTargetTile = null; +let KinkyDungeonTargetTileLocation = ""; + +const KinkyDungeonBaseLockChance = 0.12; +const KinkyDungeonScalingLockChance = 0.16; // Lock chance per 6 floors. Does not affect the guaranteed locked chest each level +const KinkyDungeonBlueLockChance = -0.1; +const KinkyDungeonBlueLockChanceScaling = 0.015; // per floor +const KinkyDungeonBlueLockChanceScalingMax = 0.4; +const KinkyDungeonGoldLockChance = -0.25; // Chance that a blue lock is replaced with a gold lock +const KinkyDungeonGoldLockChanceScaling = 0.015; // per floor +const KinkyDungeonGoldLockChanceScalingMax = 0.25; +const KinkyDungeonPurpleLockChance = 0; // Chance that a red lock is replaced with a purple lock +const KinkyDungeonPurpleLockChanceScaling = 0.02; // per floor +const KinkyDungeonPurpleLockChanceScalingMax = 0.6; + +let KinkyDungeonCurrentMaxEnemies = 1; + +let KinkyDungeonNextDataSendTime = 0; +const KinkyDungeonNextDataSendTimeDelay = 500; // Send on moves every 0.5 second +let KinkyDungeonNextDataSendTimeDelayPing = 5000; // temporary ping +let KinkyDungeonNextDataSendStatsTimeDelay = 3000; // Send stats every 3s to save bandwidth +let KinkyDungeonNextDataSendStatsTime = 0; + +let KinkyDungeonNextDataLastTimeReceived = 0; +let KinkyDungeonNextDataLastTimeReceivedTimeout = 15000; // Clear data if more than 15 seconds of no data received + +let KinkyDungeonLastMoveDirection = null; +let KinkyDungeonTargetingSpell: spell = null; + +let KDAutoWaitDelayed: boolean = false; + +/** + * Item to decrement by 1 when spell is cast + */ +let KinkyDungeonTargetingSpellItem = null; +let KinkyDungeonTargetingSpellWeapon = null; + +/** + * Game stops when you reach this level + */ +let KinkyDungeonMaxLevel = 21; + +let KinkyDungeonLastMoveTimer = 0; +let KinkyDungeonLastMoveTimerStart = 0; +let KinkyDungeonLastMoveTimerCooldown = 175; +let KinkyDungeonLastMoveTimerCooldownStart = 50; + + + +let KinkyDungeonJailLeash = 3; +let KinkyDungeonJailLeashY = 3; +let KinkyDungeonJailLeashX = 3; + +let KinkyDungeonSaveInterval = 10; + +let KinkyDungeonSFX = []; + + +function KDIsStairExplored(x, y) { + return KDMapData.ExpStair ? !!KDMapData.ExpStair[x + ',' + y] : false; +} +function KDExploreStairs(x, y) { + if (!KDMapData.ExpStair) KDMapData.ExpStair = {}; + KDMapData.ExpStair[x + ',' + y] = 1; +} + +/** + * @param [RoomType] + * @param [MapMod] + */ +function KDDefaultMapData(mapX: number, mapY: number, RoomType: string = "", MapMod: string = ""): KDMapDataType { + return { + Checkpoint: MiniGameKinkyDungeonCheckpoint, + Title: "", + + RespawnQueue: [], + + mapX: mapX, + mapY: mapY, + + RepopulateQueue: [], + + ExpStair: {}, + + SpecialAreas: [], + Labels: {}, + PrisonState: "", + PrisonStateStack: [], + PrisonType: "", + data: {}, + + LairsToPlace: [], + PotentialEntrances: [], + UsedEntrances: {}, + + Regiments: {}, + + RoomType: RoomType, + MapMod: MapMod, + RandomPathablePoints: {}, + Tiles: {}, + EffectTiles : {}, + TilesMemory: {}, + TilesSkin: {}, + + Bullets: [], + + ConstantX: false, + + GroundItems: [], + + Entities : [], + FogGrid : [], + FogMemory : [], + Grid : "", + Traffic : [], + GridWidth : 31, + GridHeight : 19, + MapBrightness : 5, + PatrolPoints : [], + StartPosition : {x: 1, y: 1}, + EndPosition : {x: 1, y: 1}, + ShortcutPositions : {}, + JailPoints : [], + + ShopItems : [], + PoolUses : 0, + PoolUsesGrace : 3, + CategoryIndex: {}, + + JailFaction: [], + GuardFaction: [], + MapFaction: "", + EscapeMethod: "Key", + KillTarget: "", + KillQuota: -1, + TrapQuota: -1, + TrapsTriggered: 0, + ChestQuota: -1, + ChestsOpened: 0, + QuestQuota: -1, + QuestsAccepted: 0, + KeyQuota: -1, + KeysHeld: 0, + }; +} + +KDMapData = KDDefaultMapData(0, 0); + + +/** + * @param location + * @param value + */ +function KinkyDungeonEffectTilesSet(location: string, value: Record): void { + KDMapData.EffectTiles[location] = value; +} +/** + * @param location + */ +function KinkyDungeonEffectTilesGet(location: string, mapData?: KDMapDataType): Record { + if (!mapData) mapData = KDMapData; + return mapData.EffectTiles[location]; +} + + + +/** + * @param value + */ +function KDSetPlayerTile(value: any): any { + KDMapData.Tiles[KinkyDungeonPlayerEntity.x + ',' + KinkyDungeonPlayerEntity.y] = value; + return value; +} + +function KDGetPlayerTile(): any { + return KDMapData.Tiles[KinkyDungeonPlayerEntity.x + ',' + KinkyDungeonPlayerEntity.y]; +} + + +/** + * @param location + * @param value + */ +function KinkyDungeonTilesSet(location: string, value: any): any { + KDMapData.Tiles[location] = value; + return value; +} +/** + * @param location + */ +function KinkyDungeonTilesGet(location: string): any { + return KDMapData.Tiles[location]; +} + +/** + * @param location + */ +function KinkyDungeonTilesDelete(location: string): void { + delete KDMapData.Tiles[location]; +} + + +/** + * @param location + * @param value + */ +function KinkyDungeonSkinSet(location: string, value: any) { + KDMapData.TilesSkin[location] = value; +} +/** + * @param location + */ +function KinkyDungeonSkinGet(location: string): any { + return KDMapData.TilesSkin[location]; +} + +/** + * @param location + */ +function KinkyDungeonSkinDelete(location: string) { + delete KDMapData.TilesSkin[location]; +} + +function KDAlreadyOpened(x: number, y: number): boolean { + if (KDGameData.AlreadyOpened) { + for (let ao of KDGameData.AlreadyOpened) { + if (ao.x == x && ao.y == y) { + return true; + } + } + } + return false; +} + +function KinkyDungeonPlaySound(src: string, entity?: entity, vol?: number) { + if (KDSoundEnabled() && !KinkyDungeonSFX.includes(src)) { + if (!entity || KinkyDungeonVisionGet(entity.x, entity.y) > 0) { + /* TODO: Ensure a missing `vol` parameter passes through as undefined. */ + AudioPlayInstantSoundKD(src, vol); + KinkyDungeonSFX.push(src); + } + } +} + +function KinkyDungeonSetCheckPoint(Checkpoint?: string, _AutoSave?: any, _suppressCheckPoint?: any) { + if (Checkpoint != undefined) MiniGameKinkyDungeonCheckpoint = Checkpoint; + else if (Math.floor(MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint) == MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint) + MiniGameKinkyDungeonCheckpoint = KDDefaultJourney[Math.min(KDDefaultJourney.length - 1, Math.floor((MiniGameKinkyDungeonLevel) / KDLevelsPerCheckpoint))]; +} + +function KinkyDungeonNewGamePlus(): void { + KDSetWorldSlot(0, 0); + + //KDInitializeJourney(KDGameData.Journey, MiniGameKinkyDungeonLevel); + // Remove all chests and add to lost items + let lostItems: item[] = []; + for (let entry of Object.entries(KDGameData.Containers)) { + if (entry[1].location?.mapY > 0) { + lostItems.push(...Object.values(entry[1].items)); + delete KDGameData.Containers[entry[0]]; + } + } + for (let item of lostItems) { + KDAddLostItemSingle(item.name, 1); + } + let newPersistent: { + [_: string]: KDPersistentNPC + } = {}; + // Remove all persistent NPCs not permanent or part of collection + for (let V of Object.values(KDPersistentNPCs)) { + if (V.permanent || KDGameData.Collection[V.id + ""]) { + newPersistent[V.id] = V; + if (KDGameData.Collection[V.id + ""]) { + if (V.mapX != 0 || V.mapY != 0 || V.room != "Summit") { + V.spawned = false; + V.mapX = 0; + V.mapY = 0; + V.room = "Summit"; + } + } else V.room = ""; + + } + } + + KDGameData.PersistentNPCCache = {}; + KDPersistentNPCs = newPersistent; + + KinkyDungeonSetCheckPoint("grv", true); + KDGameData.HighestLevelCurrent = 0; + KinkyDungeonCreateMap(KinkyDungeonMapParams.grv, "JourneyFloor", "", 0); + KinkyDungeonNewGame += 1; + + + KDGameData.ElevatorsUnlocked = {}; + + KDDeletedIDs = {}; + + for (let t of KDResertNGTags) { + if (KinkyDungeonFlags.has(t)) + KinkyDungeonFlags.delete(t); + } +} + +function KDResetData(Data?: KDGameDataBase): void { + if (!Data) Data = KDGameDataBase; + KDGameData = JSON.parse(JSON.stringify( Data)); + KDPersistentNPCs = {}; + KDDeletedIDs = {}; + KDPersonalAlt = {}; + + + for (let control of Object.keys(KDFocusControlButtons)) { + KDInitFocusControl(control); + } + InitFacilities(); +} + +function InitPersistentGen() { + KDGameData.MaidKnightFloor = Math.floor(1 + KDRandom() * 3); +} +function KDResetEventData(Data?: any) { + if (!Data) Data = KDEventDataBase; + KDEventData = JSON.parse(JSON.stringify( Data)); +} + + + +function KinkyDungeonInitialize(Level: number, Load?: any) { + KDWorldMap = {}; + KDMapData = KDDefaultMapData(0, 0); + KDCurrentWorldSlot = {x: 0, y: 0}; + KDUpdateChokes = true; + KDUpdateItemEventCache = true; + KinkyDungeonCurrentTick = 0; + + if (StandalonePatched) + KDInitCurrentPose(true); + + if (!afterLoaded) { + KDModsAfterLoad(); + + KinkyDungeonRefreshRestraintsCache(); + KinkyDungeonRefreshEnemiesCache(); + afterLoaded = true; + } + + KinkyDungeonMessageLog = []; + + KDInitFactions(true); + CharacterReleaseTotal(KinkyDungeonPlayer); + KDResetData(); + KDResetEventData(); + //Object.assign(KDGameData, KDGameDataBase); + + KinkyDungeonRefreshRestraintsCache(); + KinkyDungeonRefreshEnemiesCache(); + KinkyDungeonRefreshOutfitCache(); + //KinkyDungeonRefreshEnemyCache(); + KinkyDungeonFlags = new Map(); + + KinkyDungeonDressSet(); + // Refresh the character + CharacterAppearanceRestore(KinkyDungeonPlayer, CharacterAppearanceStringify(KinkyDungeonPlayer, + KDGetCharMetadata(KinkyDungeonPlayer) + ), false, true); + KinkyDungeonDrawState = "Game"; + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + + KinkyDungeonMapIndex = {}; + for (let map of KDDefaultJourney) { + KinkyDungeonMapIndex[map] = map; + } + for (let map of KDDefaultAlt) { + KinkyDungeonMapIndex[map] = map; + } + + for (let e of KDMapData.Entities) { + KDClearItems(e); + } + KDMapData.Entities = []; + KDCommanderRoles = new Map(); + KDUpdateEnemyCache = true; + KDMapData.Bullets = []; + KDMapData.GroundItems = []; + + KDGameData.Balance = 1; + + + KDGameData.Quests = []; + + KinkyDungeonTextMessage = ""; + KinkyDungeonActionMessage = ""; + KDSetWorldSlot(0, Level); + KinkyDungeonSetCheckPoint(); + + KDInitCanvas(); + + KinkyDungeonDefaultStats(Load); + InitFacilities(); + + // Set up the first level + //KinkyDungeonCreateMap(KinkyDungeonMapParams[KinkyDungeonMapIndex[0]], 0); +} + +function KDInitCanvas() { + KinkyDungeonContextPlayer = KinkyDungeonCanvasPlayer.getContext("2d"); + KinkyDungeonCanvasPlayer.width = KinkyDungeonGridSizeDisplay; + KinkyDungeonCanvasPlayer.height = KinkyDungeonGridSizeDisplay; + + KinkyDungeonContext = KinkyDungeonCanvas.getContext("2d"); + KinkyDungeonCanvas.height = KinkyDungeonCanvasPlayer.height*KinkyDungeonGridHeightDisplay; + + KinkyDungeonContextFow = KinkyDungeonCanvasFow.getContext("2d"); + KinkyDungeonCanvasFow.width = KinkyDungeonCanvas.width; + KinkyDungeonCanvasFow.height = KinkyDungeonCanvas.height; +} + +function KDCreateBoringness(noBoring: boolean) { + let start = performance.now(); + // Initialize boringness array + KDMapExtraData.Boringness = []; + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) + KDMapExtraData.Boringness.push(0); // 0 = no boringness + } + + if (noBoring) return; + // First we find shortest path to exit + let path = KinkyDungeonFindPath(KDMapData.StartPosition.x, KDMapData.StartPosition.y, + KDMapData.EndPosition?.x || KDMapData.StartPosition.x, KDMapData.EndPosition?.y || KDMapData.StartPosition.y, + false, false, true, KinkyDungeonMovableTilesSmartEnemy, false, false, false, + undefined, false, undefined, false, true); + + let pathLength = path ? path.length : 200; + + // Now we find the path to the start/end of every INDIVIDUAL tile + // Boringness = delta between (startLength + endLength) and (pathLength) + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y))) { + let startLength = KinkyDungeonFindPath(X, Y, + KDMapData.StartPosition.x, KDMapData.StartPosition.y, + false, false, false, KinkyDungeonMovableTilesSmartEnemy, false, false, false, + undefined, false, undefined, false, true); + if (startLength) { + let endLength = KinkyDungeonFindPath(X, Y, KDMapData.EndPosition?.x || KDMapData.StartPosition.x, KDMapData.EndPosition?.y || KDMapData.StartPosition.y, + false, false, true, KinkyDungeonMovableTilesSmartEnemy, false, false, false, + undefined, false, undefined, false, true); + if (endLength) { + let delta = Math.abs((startLength.length + endLength.length) - pathLength); + KinkyDungeonBoringSet(X, Y, delta); + } else KinkyDungeonBoringSet(X, Y, 2*pathLength); + } else KinkyDungeonBoringSet(X, Y, 5*pathLength); + } + } + } + + console.log("Time to create Boring" + (performance.now() - start)); +} + +function KDGetMapSize(): number { + if (KinkyDungeonStatsChoice.get("MapLarge")) return 3; + if (KinkyDungeonStatsChoice.get("MapHuge")) return 6; + if (KinkyDungeonStatsChoice.get("MapGigantic")) return 9; + if (KinkyDungeonStatsChoice.get("MapAbsurd")) return 24; + return 0; +} + +function KDGetMazeParams(params: floorParams): { oldest: number, newest: number, chance_STOP: number, opennessMult: number } +{ + if (KinkyDungeonStatsChoice.get("MapLarge")) return { + oldest: 0.5, + newest: 0.4, + chance_STOP: .25 + 0.75*(params.deadend || 0), + opennessMult: .8, + }; + if (KinkyDungeonStatsChoice.get("MapHuge")) return { + oldest: 0.45, + newest: 0.35, + chance_STOP: .45 + 0.55*(params.deadend || 0), + opennessMult: .65, + }; + if (KinkyDungeonStatsChoice.get("MapGigantic")) return { + oldest: 0.4, + newest: 0.25, + chance_STOP: .55 + 0.45*(params.deadend || 0), + opennessMult: .45, + }; + if (KinkyDungeonStatsChoice.get("MapAbsurd")) return { + oldest: 0.35, + newest: 0.04, + chance_STOP: .85 + 0.15*(params.deadend || 0), + opennessMult: .1, + }; + return { + oldest: 0.1, + newest: 0.8, + chance_STOP: 0 + (params.deadend || 0), + opennessMult: 1, + }; +} + +/** + * @param point + */ +function KDGetWorldMapLocation(point: { x: number, y: number }): KDWorldSlot { + return KDWorldMap[point.x + ',' + point.y]; +} + + +/** + * Creates a new world location at the specific area + * @param x + * @param y + * @param [main] - The main maptype which you return to + */ +function KDCreateWorldLocation(x: number, y: number, jx: number, jy: number, _main: string = "") { + KDWorldMap[x + ',' + y] = { + data: {}, + x: x, + y: y, + jx: jx, + jy: jy, + main: "", + name: "Tile" + x + ',' + y, + color: "#ffffff", + outposts: {}, + lairs: {}, + lairsToPlace: {}, + }; +} + +/** + * @param slot + * @param saveconstantX + */ +function KDSaveRoom(slot: { x: number, y: number }, saveconstantX: boolean) { + slot = slot || KDCurrentWorldSlot; + let CurrentLocation = KDWorldMap[(saveconstantX ? 0 : slot.x) + "," + slot.y]; + if (!CurrentLocation) KDCreateWorldLocation(0, slot.y, KDGameData.JourneyX, KDGameData.JourneyY); + + // Pack enemies + KDPackEnemies(KDMapData); + // Remove navmap cause it will be regenned + + KDMapData.RandomPathablePoints = {}; + RandomPathList = []; + + let CurrentMapData = JSON.parse(JSON.stringify(KDMapData)); + + if (CurrentLocation) { + CurrentLocation.data[CurrentMapData.RoomType] = CurrentMapData; + } +} + +/** + * Decompress enemies + * @param data + */ +function KDUnPackEnemies(data: KDMapDataType) { + for (let enemy of data.Entities) { + if (!enemy.modified) { + enemy.Enemy = KinkyDungeonGetEnemyByName(enemy.Enemy.name || enemy.Enemy); + } + } +} + +/** + * Decompress persistent entities + * goes thru all entities on a map, and compares their current location according to persistent NPC record + * @param Level + * @param data + * @param [removeMissing] - Remove enemies that are missing, i.e. their persistent NPC record says they are in another room + */ +function KDSyncPersistentEntities(Level: number, data: KDMapDataType, removeMissing: boolean = true) { + let newEntities = []; + for (let enemy of data.Entities) { + if (KDIsNPCPersistent(enemy.id)) { + let pers = KDGetPersistentNPC(enemy.id); + if (removeMissing && (pers.room != data.RoomType || pers.mapY != Level)) { + enemy = null; + } else { + enemy = pers.entity; + } + } + if (enemy) + newEntities.push(enemy); + } + let oldEntities = data.Entities; + data.Entities = newEntities; + oldEntities.splice(0, oldEntities.length); +} + +/** + * Decompress enemies + * @param enemy + */ +function KDUnPackEnemy(enemy: entity) { + let packed = !enemy.Enemy?.maxhp; + if (!enemy.modified) { + enemy.Enemy = KinkyDungeonGetEnemyByName(enemy.Enemy.name || enemy.Enemy); + } + return packed; +} +/** + * Decompress enemies + * @param enemy + */ +function KDPackEnemy(enemy: entity) { + if (!enemy.modified) { + // @ts-ignore + enemy.Enemy = {name: enemy.Enemy.name}; + } +} +/** + * Compress enemies to reduce file size + * @param data + */ +function KDPackEnemies(data: KDMapDataType) { + for (let enemy of data.Entities) { + if (!enemy.modified) { + // @ts-ignore + enemy.Enemy = {name: enemy.Enemy.name}; + } + } +} + + +/** + * Loads a map from a world location + * @param x + * @param y + * @param room + * @param [direction] - 0 is default (start position), 1 is end, 2 is south shortcut, 3 is north shortcut + * @param [constantX] + * @param [ignoreAware] - Enemies will lock the door if this is true and they see you enter + */ +function KDLoadMapFromWorld(x: number, y: number, room: string, direction: number = 0, constantX?: boolean, ignoreAware: boolean = true) { + let origx = x; + if (constantX) x = 0; + + if (!KDWorldMap[x + ',' + y]) return false; + if (!KDWorldMap[x + ',' + y].data[room]) return false; + + // Create enemies first so we can spawn them in the set pieces if needed + let allies = KinkyDungeonGetAllies(); + KDMapData.Entities = KDMapData.Entities.filter((enemy) => { + return !allies.includes(enemy); + }); + KDCommanderRoles = new Map(); + KDUpdateEnemyCache = true; + + KDKickEnemies(undefined, ignoreAware, y); // Shuffle enemy locations + + KDSaveRoom(KDCurrentWorldSlot, KDMapData.ConstantX); + + // Load the room + let NewMapData = JSON.parse(JSON.stringify(KDWorldMap[x + ',' + y].data[room])); + + // UnPack enemies + KDSyncPersistentEntities(y, NewMapData, true); + KDUnPackEnemies(NewMapData); + + + KDMapData = NewMapData; + KDWorldMap[x + ',' + y].data[room] = KDMapData; + KDGameData.RoomType = KDMapData.RoomType; + KDGameData.MapMod = KDMapData.MapMod; + MiniGameKinkyDungeonCheckpoint = KDMapData.Checkpoint || MiniGameKinkyDungeonCheckpoint; + + // Filter non-present enemies + KDMapData.Entities = KDMapData.Entities.filter((enemy) => { + return (!KDGetNPCLocation(enemy.id) || KDCompareLocation(KDGetNPCLocation(enemy.id), KDGetCurrentLocation())); + }); + + KDInitTempValues(); + if (!KDMapData.Traffic || KDMapData.Traffic.length == 0) KDGenerateBaseTraffic(); + KinkyDungeonGenNavMap(); + + + KDCurrentWorldSlot = { + x: origx, + y: y, + }; + + KDBuildLairs(); + KDPlacePlayerBasedOnDirection(direction, KDGameData.ShortcutIndex); + + + + let aware = KDKickEnemies(undefined, ignoreAware, y); // Shuffle enemy locations + if (ignoreAware && aware) { + //KinkyDungeonLoseJailKeys(); + KinkyDungeonSetFlag("stairslocked", 10); + KinkyDungeonSendActionMessage(10, TextGet("KDClimbUpTrapped"), "#ff5277", 3); + } + + for (let e of allies) { + KDAddEntity(e, true); + } + + for (let e of KinkyDungeonGetAllies()) { + let point = KinkyDungeonGetNearbyPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, undefined, true, true); + if (!point) point = KinkyDungeonGetNearbyPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, undefined, undefined, true); + if (!point) point = {x: KinkyDungeonPlayerEntity.x, y: KinkyDungeonPlayerEntity.y}; + KDMoveEntity(e, point.x, point.y, false,undefined, undefined, true); + e.visual_x = point.x; + e.visual_y = point.y; + } + return true; +} + +/** + * @param [direction] + * @param [sideRoomIndex] + */ +function KDPlacePlayerBasedOnDirection(direction: number = 0, sideRoomIndex: string = '-1', nomove: boolean = false) { + let journeySlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; + let sp = KDMapData.ShortcutPositions[sideRoomIndex] + || ((journeySlot?.SideRooms && journeySlot.SideRooms[sideRoomIndex] + && KDSideRooms[journeySlot.SideRooms[sideRoomIndex]] + ) ? KDMapData.ShortcutPositions[sideRoomIndex] : undefined); + if (!sp) { + if ((journeySlot?.SideRooms && journeySlot.SideRooms.some((sr) => { + return KDSideRooms[sr]?.altRoom == sideRoomIndex; + }))) sp = KDMapData.ShortcutPositions[ + journeySlot.SideRooms.findIndex((sr) => { + return KDSideRooms[sr]?.altRoom == sideRoomIndex; + }) + ]; + } + if (sideRoomIndex != '-1' && KDMapData.ShortcutPositions && ( + sp + )) { + + KinkyDungeonPlayerEntity = {MemberNumber:DefaultPlayer.MemberNumber, id: -1, x: + sp.x, y:sp.y, player:true}; + } else if ((direction == 1) && KDMapData.EndPosition) { + KinkyDungeonPlayerEntity = {MemberNumber:DefaultPlayer.MemberNumber, id: -1, x: KDMapData.EndPosition.x, y:KDMapData.EndPosition.y, player:true}; + } else { + KinkyDungeonPlayerEntity = {MemberNumber:DefaultPlayer.MemberNumber, id: -1, x: KDMapData.StartPosition.x, y:KDMapData.StartPosition.y, player:true}; + } + + if (!nomove) { + // Kick any enemy under the player away + KDUpdateEnemyCache = true; + if (KinkyDungeonEnemyAt(KDPlayer().x, KDPlayer().y)) { + let en = KinkyDungeonEnemyAt(KDPlayer().x, KDPlayer().y); + let pp = KinkyDungeonGetNearbyPoint(en.x, en.y, true, undefined, + undefined, true + ); + if (pp) { + en.aware = true; + KDMoveEntity(en, pp.x, pp.y, false); + } + } + } +} + +function KDInitTempValues(seed?: boolean): void { + KDGameData.ChestsGenerated = []; + KDPathfindingCacheFails = 0; + KDPathfindingCacheHits = 0; + KDPathCache = new Map(); + KDThoughtBubbles = new Map(); + KinkyDungeonRescued = {}; + KDGameData.ChampionCurrent = 0; + KinkyDungeonAid = {}; + KDGameData.KinkyDungeonPenance = false; + KDRestraintsCache = new Map(); + KDEnemiesCache = new Map(); + KDEnemyCache = new Map(); + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + + KDGameData.OfferFatigue = 0; + KDGameData.KeyringLocations = []; + + if (KDMapData.KeysHeld == undefined) { + KDMapData.KeysHeld = 0; + } + + KDGameData.RescueFlag = false; + KinkyDungeonTotalSleepTurns = 0; + KinkyDungeonFastMovePath = []; + + KinkyDungeonShopIndex = 0; + + if (!seed) { + KDGameData.AlreadyOpened = []; + KDrandomizeSeed(true); + KDGameData.LastMapSeed = KinkyDungeonSeed; + // Reset the chase if this is a new floor + if (KDGameData.PrisonerState == "chase") { + KDGameData.PrisonerState = ""; + } + } + console.log("Map Seed: " + KinkyDungeonSeed); + KDsetSeed(KinkyDungeonSeed); + + + KDStageBossGenerated = true; + KDUpdateEnemyCache = true; + KinkyDungeonUpdateLightGrid = true; + + KDPathCache = new Map(); + KDPathCacheIgnoreLocks = new Map(); +} + +/** Game related options */ +function KDUpdateOptionGame(): void { + if (KinkyDungeonStatsChoice.get("NoForceGreet") && !KDGameData.NoForceGreet) { + KDGameData.NoForceGreet = true; + } else if (!KinkyDungeonStatsChoice.get("NoForceGreet") && KDGameData.NoForceGreet) { + KDGameData.NoForceGreet = false; + } +} + +/** + * Starts the the game at a specified level + * Example usage: + * KinkyDungeonCreateMap(KinkyDungeonMapParams.grv, 1, false, undefined, "", undefined, true); + * @param MapParams + * @param RoomType + * @param MapMod + * @param Floor + * @param [testPlacement] + * @param [seed] + * @param [forceFaction] + * @param [worldLocation] + * @param [useExisting] + * @param [origMapType] + * @param [direction] + * @param [forceEscape] + */ +function KinkyDungeonCreateMap ( + MapParams: floorParams, + RoomType: string, + MapMod: string, + Floor: number, + testPlacement?: boolean, + seed?: boolean, + forceFaction?: string, + worldLocation?: { x: number, y: number }, + useExisting?: boolean, + origMapType: string = "", + direction: number = 0, + forceEscape?: string +): void +{ + // every time a map is created the preference flags are updated + KDUpdatePreferenceFlags(); + + KDTileModes = {}; + KDUpdateOptionGame(); + KDBreakTether(KDPlayer()); + + KinkyDungeonRemoveBuffsWithTag(KinkyDungeonPlayerEntity, ["removeNewMap"]); + // Create enemies first so we can spawn them in the set pieces if needed + let allies = KinkyDungeonGetAllies(); + let mapMod = KDMapData.MapMod ? KDMapMods[KDMapData.MapMod] : null; + let altRoom = KDMapData.RoomType; + let altType: AltType = altRoom ? KinkyDungeonAltFloor((mapMod && mapMod.altRoom) ? mapMod.altRoom : altRoom) : KinkyDungeonBossFloor(Floor); + + + // Strip non-persistent items + if (!KDMapData.GroundItems) KDMapData.GroundItems = []; + let allPersistent = altType?.keepItems; + let persistentItems = KDMapData.GroundItems.filter((item) => { + return allPersistent || (KDDroppedItemProperties[item.name] && KDDroppedItemProperties[item.name].persistent); + }); + let lostItems = KDMapData.GroundItems.filter((item) => { + return !(allPersistent || (KDDroppedItemProperties[item.name] && KDDroppedItemProperties[item.name].persistent)); + }); + + KDMapData.GroundItems = persistentItems; + + if (!KDGameData.PersistentItems) KDGameData.PersistentItems = {}; + KDGameData.PersistentItems[RoomType + "," + KDCurrentWorldSlot.x + "," + KDCurrentWorldSlot.y] = {}; + for (let item of KDMapData.GroundItems) { + KDGameData.PersistentItems[RoomType + "," + KDCurrentWorldSlot.x + "," + KDCurrentWorldSlot.y][item.name] = + (KDGameData.PersistentItems[RoomType + "," + KDCurrentWorldSlot.x + "," + KDCurrentWorldSlot.y][item.name] || 0) + (item.amount || 1); + } + for (let item of lostItems) { + KDAddLostItemSingle(item.name, item.amount || 1); + } + + + // Setup + // Remove enemies if the room isnt main and wont regen + + // ... + + KDGameData.RoomType = RoomType; + KDGameData.MapMod = MapMod; + mapMod = null; + if (KDGameData.MapMod) { + mapMod = KDMapMods[KDGameData.MapMod]; + } + + altRoom = KDGameData.RoomType; + altType = altRoom ? KinkyDungeonAltFloor((mapMod && mapMod.altRoom) ? mapMod.altRoom : altRoom) : KinkyDungeonBossFloor(Floor); + + let constantX = altType?.constantX; + + if (!worldLocation) worldLocation = {x: KDCurrentWorldSlot.x, y: KDCurrentWorldSlot.y}; + if (!KDWorldMap[(constantX ? 0 : worldLocation.x) + "," + worldLocation.y]) { + let journeySlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; + KDCreateWorldLocation(constantX ? 0 : worldLocation.x, worldLocation.y, + KDGameData.JourneyX, KDGameData.JourneyY, altType?.makeMain ? altRoom : (journeySlot?.RoomType || "")); + if (altType?.makeMain || !altType) { + KDPruneWorld(); + } + } + let location = KDWorldMap[(constantX ? 0 : worldLocation.x) + "," + worldLocation.y]; + + if (useExisting && location.data[KDGameData.RoomType]) { + KDLoadMapFromWorld(worldLocation.x, worldLocation.y, KDGameData.RoomType, direction, constantX); + + if (location.jx == undefined) location.jx = KDGameData.JourneyX; + if (location.jy == undefined) location.jy = KDGameData.JourneyY; + // Repopulate + altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (!altType?.loadscript || altType.loadscript(false)) { + if (!altType?.noPersistentPrisoners && !mapMod?.noPersistentPrisoners) + KDRepopulatePersistentNPCs(); + if (!altType?.noPersistentSpawn && !mapMod?.noPersistentSpawn) + // Spawn wandering persistent NPCs depending on spawn AI + KDSpawnPersistentNPCs({ + mapX: worldLocation.x, + mapY: worldLocation.y, + room: KDGameData.RoomType, + }, true); + } + UpdateRegiments({ + mapX: worldLocation.x, + mapY: worldLocation.y, + room: KDGameData.RoomType, + }); + + KDGameData.ShortcutIndex = KDGameData.RoomType; + return; + } + + // Filter out the allies + KDMapData.Entities = KDMapData.Entities.filter((enemy) => { + return !allies.includes(enemy); + }); + KDCommanderRoles = new Map(); + KDUpdateEnemyCache = true; + // Else make a new one + KDSaveRoom(KDCurrentWorldSlot, KDMapData.ConstantX); + + let maxIter = 100; + for (let iterations = 0; iterations <= maxIter; iterations++) { + if (iterations > 0) { + // Clear so party prisoners are reused + for (let en of [...KDMapData.Entities]) { + KDRemoveEntity(en, false, true, true); + } + } + /** @type {KDMapData} */ + KDMapData = KDDefaultMapData(worldLocation?.x || 0, worldLocation?.y || MiniGameKinkyDungeonLevel, KDGameData.RoomType, KDGameData.MapMod); + KDCurrentWorldSlot = worldLocation; + + KDInitTempValues(seed); + KDMapData.Grid = ""; + KDMapData.Traffic = []; + KDMapData.Tiles = {}; + KDMapData.TilesSkin = {}; + KDMapData.EffectTiles = {}; + KDMapData.Bullets = []; // Clear all bullets + KDMapData.Entities = []; // Clear all entities + KDCommanderRoles = new Map(); + KDMapData.EndPosition = null; + KDMapData.ShortcutPositions = {}; + KDMapData.PatrolPoints = []; + KDMapData.JailPoints = []; + KDMapData.GroundItems = []; // Clear items on the ground + + + // These are generated before the seed as they depend on the player's restraints and rep + KDMapData.PoolUses = Math.min(KDMapData.PoolUses, KinkyDungeonStatsChoice.get("Blessed") ? 0 : 1); + KDMapData.ShopItems = []; + KDMapData.ShopItems = KinkyDungeonGenerateShop(MiniGameKinkyDungeonLevel); + let shrinefilter = KinkyDungeonGetMapShrines(MapParams.shrines); + let traptypes = MapParams.traps.concat(KinkyDungeonGetGoddessTrapTypes()); + + mapMod = null; + if (KDGameData.MapMod) { + mapMod = KDMapMods[KDGameData.MapMod]; + } + + let slot = KDGetWorldMapLocation(KDCoordToPoint(KDGetCurrentLocation())); + altRoom = KDGameData.RoomType; + altType = altRoom ? KinkyDungeonAltFloor((mapMod && mapMod.altRoom) ? mapMod.altRoom : altRoom) : KinkyDungeonBossFloor(Floor); + + if (altType && altType.nokeys) { + KDGameData.KeysNeeded = false; + } else KDGameData.KeysNeeded = true; + + if (altType?.constantX) KDMapData.ConstantX = true; + + // make it more consistent + let random = KDRandom(); + let mapSizeBonus = (!altType || altType.sizeBonus) ? KDGetMapSize() : 0; + let height = (MapParams.min_height) * 2 + Math.ceil(mapSizeBonus*0.5) + + 2*Math.floor(0.5*random * (MapParams.max_height * 2 - MapParams.min_height * 2 + Math.floor(mapSizeBonus*0.5))); + let width = (MapParams.min_width) * 2 + Math.ceil(mapSizeBonus*0.5) + + 2*Math.floor(0.5*(1 - random) * (MapParams.max_width * 2 - MapParams.min_width * 2 + Math.floor(mapSizeBonus*0.5))); + + + height = Math.max(2, height); + width = Math.max(2, width); + + if (KDTileToTest) { + altType = alts.TestTile; + width = Math.ceil(KDTileToTest.w /2) + 7; + height = Math.ceil(KDTileToTest.h /2) + 7; + + } + + + // They have to be odd for the maze generator to work + height += 1 - height % 2; + width += 1 - width % 2; + + KDStageBossGenerated = true; + let bossRules = false; + if (altType) { + bossRules = altType.bossroom; + if (bossRules) { + KinkyDungeonSetFlag("BossDialogue" + altType.name, 0); + KDStageBossGenerated = false; + } + height = altType.height; + width = altType.width; + KDMapData.KeysHeld = 0; + } + KinkyDungeonSetFlag("BossUnlocked", 0); + if (altType && !bossRules && altType.nokeys) { + KinkyDungeonSetFlag("BossUnlocked", -1); + } + + KinkyDungeonCanvas.width = KinkyDungeonCanvasPlayer.width*KinkyDungeonGridWidthDisplay; + KDMapData.GridHeight = height; + KDMapData.GridWidth = width; + + + // Generate the grid + for (let X = 0; X < height; X++) { + for (let Y = 0; Y < width; Y++) + KDMapData.Grid = KDMapData.Grid + '1'; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(width, height); + + // We only rerender the map when the grid changes + KinkyDungeonGrid_Last = ""; + KinkyDungeonUpdateLightGrid = true; + + // Setup variables + let startpos = 1 + 2*Math.floor(KDRandom()*0.5 * (height - 2)); + if (startpos < 3) startpos = 3; // ... + if (startpos % 2 != 1) startpos += 1; // startpos MUST be odd + + + //console.log(KDRandom()); + // Use primm algorithm with modification to spawn random rooms in the maze + let openness = MapParams.openness; + let density = MapParams.density; + let hallopenness = MapParams.hallopenness ? MapParams.hallopenness : MapParams.openness; + let chargerchance = MapParams.chargerchance ? MapParams.chargerchance : 0.75; + let litchargerchance = MapParams.litchargerchance ? MapParams.litchargerchance : 0.1; + let chargercount = MapParams.chargercount ? MapParams.chargercount : 4; + let crackchance = MapParams.crackchance; + let barchance = MapParams.barchance; + let treasurechance = 1.0; // Chance for an extra locked chest + let treasurecount = MapParams.chestcount; // Max treasure chest count + //if (KDGameData.KinkyDungeonSpawnJailers > 0) treasurecount = 0; + let shrinechance = MapParams.shrinechance; // Chance for an extra shrine + let ghostchance = MapParams.ghostchance; // Chance for a ghost + let manaChance = MapParams.manaChance ? MapParams.manaChance : 0.3; + let shrinecount = MapParams.shrinecount; // Max treasure chest count + let rubblechance = MapParams.rubblechance; // Chance of lootable rubble + if (KinkyDungeonStatsChoice.get("Pristine")) rubblechance *= 0.3; + //if (KinkyDungeonGoddessRep.Prisoner && KDGameData.KinkyDungeonSpawnJailers > 0) doorlockchance = doorlockchance + (KDGameData.KinkyDungeonSpawnJailers / KDGameData.KinkyDungeonSpawnJailersMax) * (1.0 - doorlockchance) * (KinkyDungeonGoddessRep.Prisoner + 50)/100; + let trapChance = MapParams.trapchance; // Chance of a pathway being split between a trap and a door + let doorlocktrapchance = MapParams.doorlocktrapchance != undefined ? MapParams.doorlocktrapchance : MapParams.trapchance; + let doortrapchance = MapParams.doortrapchance || 0.4; + let minortrapChance = MapParams.minortrapChance ? MapParams.minortrapChance : trapChance/10; + // Door algorithm is defunct + let grateChance = MapParams.grateChance; + let doorchance = MapParams.doorchance; + let nodoorchance = MapParams.nodoorchance; + let doorlockchance = MapParams.doorlockchance; + let gasChance = ((!altType || !altType.noClutter) && MapParams.gaschance && KDRandom() < MapParams.gaschance) ? (MapParams.gasdensity ? MapParams.gasdensity : 0) : 0; + let gasType = MapParams.gastype ? MapParams.gastype : "0"; + let brickchance = MapParams.brickchance; // Chance for brickwork to start being placed + let wallRubblechance = MapParams.wallRubblechance ? MapParams.wallRubblechance : 0; + let barrelChance = MapParams.barrelChance ? MapParams.barrelChance : 0.08; + let foodChance = MapParams.foodChance ? MapParams.foodChance : 0.2; + let cageChance = MapParams.cageChance ? MapParams.cageChance : 0.25; + let wallhookchance = MapParams.wallhookchance ? MapParams.wallhookchance : 0.025; + let ceilinghookchance = MapParams.ceilinghookchance ? MapParams.ceilinghookchance : 0.03; + let torchchance = MapParams.torchchance ? MapParams.torchchance : 0.35; + let torchlitchance = MapParams.torchlitchance ? MapParams.torchlitchance : 0.75; + let torchchanceboring = MapParams.torchchanceboring ? MapParams.torchchanceboring : 0.85; + let torchreplace = (altType && altType.torchreplace) ? altType.torchreplace : (MapParams.torchreplace ? MapParams.torchreplace : null); + let factionList = MapParams.factionList; + + if (forceFaction) factionList = [forceFaction]; + + // Determine faction tags + let tags = Object.assign([], MapParams.enemyTags); + if (mapMod && mapMod.tags) { + // Add in any mapmod tags + for (let t of mapMod.tags) { + if (!tags.includes(t)) + tags.push(t); + } + } + + KDMapData.JailFaction = []; + if (mapMod?.jailType) KDMapData.JailFaction.push(mapMod.jailType); + else if (altType?.jailType) KDMapData.JailFaction.push(altType.jailType); + + KDMapData.GuardFaction = []; + if (mapMod?.guardType) KDMapData.GuardFaction.push(mapMod.guardType); + else if (altType?.guardType) KDMapData.GuardFaction.push(altType.guardType); + let bonus = (mapMod && mapMod.bonusTags) ? mapMod.bonusTags : undefined; + if (altType && altType.bonusTags) { + if (!bonus) bonus = altType.bonusTags; + else bonus = Object.assign(Object.assign(Object.assign({}, bonus)), altType.bonusTags); + } + + let randomFactions = KDChooseFactions(factionList, Floor, tags, bonus, true); + let factionEnemy = randomFactions[2] || forceFaction || "Bandit"; + if (forceFaction) { + KDMapData.MapFaction = forceFaction; + KDMapData.JailFaction = [forceFaction]; + KDMapData.GuardFaction = [forceFaction]; + } + + //console.log(KDRandom()); + let shrineTypes = []; + let shrinelist = []; + let chargerlist = []; + let chestlist = []; + let startTime = performance.now(); + let genType = !altType ? "TileMaze" : altType.genType; + + // MAP GENERATION + + let VisitedRooms = []; + + KDMapData.StartPosition = {x: 1, y: startpos * 2}; + + KinkyDungeonMapSet(1, startpos, '0', VisitedRooms); + + KinkyDungeonPOI = []; + let POI = KinkyDungeonPOI; + KDMapData.Labels = {}; + KDMapData.data = {}; + KDMapData.PrisonState = ""; + KDMapData.PrisonStateStack = []; + + + // Place the player! + KinkyDungeonPlayerEntity = {MemberNumber:DefaultPlayer.MemberNumber, id: -1, x: KDMapData.StartPosition.x, y:KDMapData.StartPosition.y, player:true}; + + + let traps = []; + + let spawnPoints = []; + + let data = { + params: MapParams, + Floor: Floor, + chestlist: chestlist, + traps: traps, + shrinelist: shrinelist, + chargerlist: chargerlist, + spawnpoints: spawnPoints, + notraps: altType?.notraps, + MapData: KDMapData, + }; + + KDMapData.CategoryIndex = {}; + + KinkyDungeonCreateMapGenType[genType](POI, VisitedRooms, width, height, openness, density, hallopenness, data); + + //console.log(KDRandom()); + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for maze creation`); + startTime = performance.now(); + } + width = KDMapData.GridWidth; + height = KDMapData.GridHeight; + + KinkyDungeonResetFog(); + + KinkyDungeonPlayerEntity.x = KDMapData.StartPosition.x; + KinkyDungeonPlayerEntity.y = KDMapData.StartPosition.y; + + + if (!altType || !altType.noWear) { + KinkyDungeonGenNavMap(KDMapData.StartPosition); + KinkyDungeonReplaceDoodads(crackchance, barchance, wallRubblechance, wallhookchance, ceilinghookchance, width, height, altType); // Replace random internal walls with doodads + } + + if (!altType || altType.allowJailEntrances || altType.placeJailEntrances || slot?.main == KDGameData.RoomType) + KinkyDungeonPlaceJailEntrances(width, height, altType); + //console.log(KDRandom()); + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for doodad creation`); + startTime = performance.now(); + } + KinkyDungeonPlaceStairs(KDMapData.StartPosition.y, width, height, + altType && altType.nostairs, altType && altType.nostartstairs, + KDPersonalAlt[KDGameData.RoomType] ? KDPersonalAlt[KDGameData.RoomType].UpStairsFrom : origMapType); // Place the start and end locations + + KDPlacePlayerBasedOnDirection(direction); + + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for stair creation`); + startTime = performance.now(); + } + + let noBoring = altType?.noboring; + + // Now we create the boringness matrix + KDCreateBoringness(noBoring); + + if (!altType?.noSetpiece) + KinkyDungeonPlaceSetPieces(POI, traps, chestlist, shrinelist, chargerlist, spawnPoints, false, width, height); + + if (!((KinkyDungeonNearestJailPoint(1, 1) || (altType && altType.nojail)) && (!altType || KDStageBossGenerated || !bossRules))) { + console.log("This map failed to generate! Please screenshot and send your save code to Ada on deviantart or discord!"); + continue; + } + + KinkyDungeonGenNavMap(); + + + if (altType && !altType.noFurniture) + KinkyDungeonPlaceFurniture(barrelChance, cageChance, width, height, altType); // Replace random internal walls with doodads + + if (altType && !altType.noFood) + KinkyDungeonPlaceFood(foodChance, width, height, altType); // Replace random internal walls with doodads + + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for setpiece generation`); + startTime = performance.now(); + } + // Recreate boringness + KDCreateBoringness(noBoring); + + + if (!testPlacement) { + //if (!altType || altType.shortcut) + //KinkyDungeonPlaceShortcut(KinkyDungeonGetShortcut(Floor, altType), width, height); + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for shortcut creation`); + startTime = performance.now(); + } + if (!altType || altType.chests) + KinkyDungeonPlaceChests(MapParams, chestlist, spawnPoints, shrinelist, treasurechance, treasurecount, rubblechance, Floor, width, height); // Place treasure chests inside dead ends + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for chest creation`); + startTime = performance.now(); + } + let traps2 = []; + if (!altType || altType.placeDoors) + traps2 = KinkyDungeonPlaceDoors(doorchance, doortrapchance, nodoorchance, doorlockchance, trapChance, grateChance, Floor, width, height, + !altType ? KDPlaceMode.MODE_MODIFYPOTENTIALANDEXISTING : (altType.doorPlaceMode || KDPlaceMode.MODE_PLACENEW)); + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for door creation`); + startTime = performance.now(); + } + for (let t of traps2) { + traps.push(t); + } + + if (altType && !altType.notorches) + KinkyDungeonPlaceTorches(torchchance, torchlitchance, torchchanceboring, width, height, altType, torchreplace); + + // Recreate boringness + KDCreateBoringness(noBoring); + let orbcount = Math.min(2, Math.max(2 * (MiniGameKinkyDungeonLevel + KinkyDungeonNewGame*KinkyDungeonMaxLevel) - KDGameData.CollectedOrbs, 0)); + if (altType && altType.orbs != undefined) orbcount = altType.orbs; + if (!altType || altType.shrines) { + let modify = 0; + let allowHearts = (!altType || altType.heart) && KDGameData.CollectedHearts*0.5 < (MiniGameKinkyDungeonLevel + KinkyDungeonMaxLevel*KinkyDungeonNewGame); + if (allowHearts) modify = 2; + let quests = KinkyDungeonPlaceShrines(chestlist, shrinelist, shrinechance, shrineTypes, shrinecount, + shrinefilter, ghostchance, manaChance, orbcount, (altType && altType.noShrineTypes) ? altType.noShrineTypes : [], + Floor, width, height, !altType || (altType.makeMain && !altType.noQuests), allowHearts); + if ( + //( + //(KDGameData.SelectedEscapeMethod && KinkyDungeonEscapeTypes[KDGameData.SelectedEscapeMethod]?.requireMaxQuests) + //|| (forceEscape && KinkyDungeonEscapeTypes[forceEscape]?.requireMaxQuests) + //) + + // Force max goddess quests + (!altType || (altType.makeMain && !altType.noQuests)) + && quests < KDMAXGODDESSQUESTS + modify) { + console.log("This map failed to generate due to shrine count! Please screenshot and send your save code to Ada on deviantart or discord!"); + continue; + } + } + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for shrine creation`); + startTime = performance.now(); + } + if (!altType || altType.chargers) + KinkyDungeonPlaceChargers(chargerlist, chargerchance, litchargerchance, chargercount, Floor, width, height); + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for charger creation`); + startTime = performance.now(); + } + if (!altType || !altType.nobrick) + KinkyDungeonPlaceBrickwork(brickchance, Floor, width, height); + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for brickwork creation`); + startTime = performance.now(); + } + if (!altType || !altType.notraps) + KinkyDungeonPlaceTraps(traps, traptypes, minortrapChance, doorlocktrapchance, Floor, width, height); + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for trap creation`); + startTime = performance.now(); + } + if (!altType || !altType.nopatrols) + KinkyDungeonPlacePatrols(4, width, height); + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for patrol point creation`); + startTime = performance.now(); + } + + if ((!altType || !altType.nolore)) + KinkyDungeonPlaceLore(width, height); + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for lore creation`); + startTime = performance.now(); + } + if (!altType || altType.specialtiles) + KinkyDungeonPlaceSpecialTiles(gasChance, gasType, Floor, width, height); + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for special tile creation`); + startTime = performance.now(); + } + + + + KinkyDungeonGenNavMap(); + KDLowPriorityNavMesh(); + KDPruneEntrances(width, height); + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for navmap creation`); + startTime = performance.now(); + } + + KinkyDungeonUpdateStats(0); + + + + + KinkyDungeonReplaceVert(width, height); + } + + + + + if (MapParams.beforeWorldGenCode) MapParams.beforeWorldGenCode(KDGetCurrentLocation()); + if (altType?.beforeWorldGenScript) altType?.beforeWorldGenScript(KDGetCurrentLocation()); + if (mapMod?.beforeWorldGenScript) mapMod?.beforeWorldGenScript(KDGetCurrentLocation()); + if (KDGetWorldMapLocation(KDCoordToPoint(KDGetCurrentLocation()))?.main == KDGameData.RoomType) { + // Run the sideroom WorldGenScripts + let journeySlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; + let sideRooms = journeySlot?.SideRooms || []; + for (let sr of sideRooms) { + if (KDSideRooms[sr]?.beforeWorldGenScript) KDSideRooms[sr].beforeWorldGenScript(KDGetCurrentLocation()); + } + } + + + if (KDTileToTest || ((KinkyDungeonNearestJailPoint(1, 1) || (altType && altType.nojail)) && (!altType || KDStageBossGenerated || !bossRules) + && ((!altType?.genCriteria && KDCheckMainPath()) || altType.genCriteria(iterations)))) iterations = maxIter; + else console.log("This map failed to generate! Please screenshot and send your save code to Ada on deviantart or discord!"); + + if (iterations == maxIter) { + // Place enemies after player + if (!altType || altType.enemies) { + + KinkyDungeonPlaceEnemies(spawnPoints, false, tags, bonus, Floor, width, height, altType, + randomFactions, factionEnemy); + } + + + + if (KDDebug) { + console.log(`${performance.now() - startTime} ms for enemy creation`); + startTime = performance.now(); + } + + if (MapParams.worldGenCode) MapParams.worldGenCode(KDGetCurrentLocation()); + if (altType?.worldGenScript) altType?.worldGenScript(KDGetCurrentLocation()); + if (mapMod?.worldGenScript) mapMod?.worldGenScript(KDGetCurrentLocation()); + if (KDGetWorldMapLocation(KDCoordToPoint(KDGetCurrentLocation()))?.main == KDGameData.RoomType) { + // Run the sideroom WorldGenScripts + let journeySlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; + let sideRooms = journeySlot?.SideRooms || []; + for (let sr of sideRooms) { + if (KDSideRooms[sr]?.worldGenScript) KDSideRooms[sr].worldGenScript(KDGetCurrentLocation()); + } + } + + + KDBuildLairs(); + KDPlacePlayerBasedOnDirection(direction, KDGameData.ShortcutIndex); + + + + if (KDGameData.KinkyDungeonSpawnJailers > 0) KDGameData.KinkyDungeonSpawnJailers -= 1; + if (KDGameData.KinkyDungeonSpawnJailers > 3 && KDGameData.KinkyDungeonSpawnJailers < KDGameData.KinkyDungeonSpawnJailersMax - 1) KDGameData.KinkyDungeonSpawnJailers -= 1; // Reduce twice as fast when you are in deep... + + // Set map brightness + let lightingParams = null; + if (altType?.lightParams) lightingParams = KinkyDungeonMapParams[altType.lightParams]; + else if (altType?.skin) lightingParams = KinkyDungeonMapParams[altType.skin]; + KDMapData.MapBrightness = altType?.brightness || lightingParams?.brightness || MapParams.brightness; + KinkyDungeonMakeGhostDecision(); + + // Place the jail keys AFTER making the map! + KinkyDungeonLoseJailKeys(false, bossRules); + + + KDUnPackEnemies(KDMapData); + if (!KinkyDungeonMapIndex.grv) + KDInitializeJourney(KDGameData.Journey, MiniGameKinkyDungeonLevel); + + KinkyDungeonSendEvent("postMapgen", {}); + + if (altType && altType.tickFlags) { + KinkyDungeonSendEvent("tickFlags", {delta: 1}); + KDTickSpecialStats(); + } + + KDQuestWorldgenStart(KDGameData.Quests); + + if (KDGameData.RoomType == "" || forceEscape) { + if (!KDGameData.SelectedEscapeMethod) KDGameData.SelectedEscapeMethod = "Key"; + KDMapData.EscapeMethod = KDGameData.SelectedEscapeMethod; + if (forceEscape) { + KDMapData.EscapeMethod = forceEscape; + } else { + if (KinkyDungeonStatsChoice.get("escaperandom")) { + KDMapData.EscapeMethod = KDGetRandomEscapeMethod(KDGameData.RoomType, KDGameData.MapMod, + MiniGameKinkyDungeonLevel, KDMapData.MapFaction + ); + } + } + + KDGameData.SelectedEscapeMethod = "Key"; + + let mm = KDGetEscapeMethod(Floor); + if (mm && mm != "None") + KinkyDungeonSendActionMessage(10, TextGet("KDEscapeMethodDesc_" + mm), + "#ffffff", 10); + KDEscapeWorldgenStart(mm); + } + KinkyDungeonSendEvent("postQuest", {altType: altType}); + + if (altType?.prisonType) { + let prisonType = KDPrisonTypes[altType.prisonType]; + KDMapData.PrisonStateStack = []; + KDMapData.PrisonState = prisonType.starting_state; + KDMapData.PrisonType = prisonType.name; + for (let state of Object.values(prisonType.states)) { + if (state.init) { + state.init(MapParams); + } + } + KinkyDungeonSendEvent("postPrisonIntro", {altType: altType}); + } + + + for (let e of allies) { + e = KDAddEntity(e, true); + let point = KinkyDungeonGetNearbyPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, undefined, true, true); + if (!point) point = KinkyDungeonGetNearbyPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, undefined, undefined, true); + if (!point) point = {x: KinkyDungeonPlayerEntity.x, y: KinkyDungeonPlayerEntity.y}; + KDMoveEntity(e, point.x, point.y, false,undefined, undefined, true); + e.visual_x = point.x; + e.visual_y = point.y; + } + + KDUnPackEnemies(KDMapData); + /*for (let e of KinkyDungeonGetAllies()) { + + }*/ + KDUpdateEnemyCache = true; + + KinkyDungeonAdvanceTime(0); + } + } + + location.data[KDGameData.RoomType] = KDMapData; + + KDTileToTest = null; + KDPathCache = new Map(); + KDPathCacheIgnoreLocks = new Map(); + KDRedrawFog = 2; + KDUpdateEnemyCache = true; + KDUnPackEnemies(KDMapData); + // Filter non-present enemies + KDMapData.Entities = KDMapData.Entities.filter((enemy) => { + return (!KDGetNPCLocation(enemy.id) || KDCompareLocation(KDGetNPCLocation(enemy.id), KDGetCurrentLocation())); + }); + KinkyDungeonAdvanceTime(0); + + if (!altType?.loadscript || altType.loadscript(true)) { + if (!altType?.noPersistentPrisoners && !mapMod?.noPersistentPrisoners) + KDRepopulatePersistentNPCs(); + + if (!altType?.noPersistentSpawn && !mapMod?.noPersistentSpawn) + // Spawn wandering persistent NPCs depending on spawn AI + KDSpawnPersistentNPCs({ + mapX: worldLocation.x, + mapY: worldLocation.y, + room: KDGameData.RoomType, + }, true); + } + + KinkyDungeonGenNavMap(); + + UpdateRegiments({ + mapX: worldLocation.x, + mapY: worldLocation.y, + room: KDGameData.RoomType, + }); + + KDGameData.ShortcutIndex = KDGameData.RoomType; +} + +let KDStageBossGenerated = false; + +/** + * Creates a list of all tiles accessible and not hidden by doors or dangerous + */ +function KinkyDungeonGenNavMap(fromPoint?: { x: number, y: number }) { + if (!fromPoint) fromPoint = KDMapData.EndPosition || KDMapData.StartPosition; + KDMapData.RandomPathablePoints = {}; + RandomPathList = []; + let accessible = KinkyDungeonGetAccessible(fromPoint.x, fromPoint.y); + for (let a of Object.entries(accessible)) { + let X = a[1].x; + let Y = a[1].y; + let tags = []; + if (!KinkyDungeonTilesGet(a[0]) || !KinkyDungeonTilesGet(a[0]).OL) + if (!KDDefaultAvoidTiles.includes(KinkyDungeonMapGet(X, Y))) { + if (!KDMapData.RandomPathablePoints[a[0]]) RandomPathList.push({x: X, y:Y, tags:tags}); + KDMapData.RandomPathablePoints[a[0]] = {x: X, y:Y, tags:tags}; + } + + } + KDUpdateChokes = true; +} + + +/** + * Create a web of low priority accessways + */ +function KDLowPriorityNavMesh() { + let NavMap = []; + for (let x = 4; x < KDMapData.GridWidth; x += KDTE_Scale) { + for (let y = 4; y < KDMapData.GridWidth; y += KDTE_Scale) { + if (KDMapData.RandomPathablePoints[(x) + ',' + (y)]) { + NavMap.push({x:x, y:y}); + } else if (KDMapData.RandomPathablePoints[(x + 1) + ',' + (y)]) { + NavMap.push({x:x+1, y:y}); + } else if (KDMapData.RandomPathablePoints[(x - 1) + ',' + (y)]) { + NavMap.push({x:x-1, y:y}); + } else if (KDMapData.RandomPathablePoints[(x) + ',' + (y + 1)]) { + NavMap.push({x:x, y:y+1}); + } else if (KDMapData.RandomPathablePoints[(x) + ',' + (y - 1)]) { + NavMap.push({x:x, y:y-1}); + } + } + } + for (let a of NavMap) { + for (let b of NavMap) { + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(a.x, a.y)) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(b.x, b.y))) { + let path = KinkyDungeonFindPath(a.x, a.y, b.x, b.y, false, false, false, KinkyDungeonMovableTilesSmartEnemy, + false, false, false, undefined, false, + (x, y, xx, yy) => { + return KDistTaxicab(x - xx, y - yy); + }, true,true); + if (path) + for (let p of path) { + //let tile = KinkyDungeonTilesGet(p.x + "," + p.y) || {}; + //tile.HT = true; // High traffic + KDMapData.Traffic[p.y][p.x] = 0; + //KinkyDungeonTilesSet(p.x + "," + p.y, tile); + } + } + } + } + +} + +type GridEntry = { + [ _: string ]: { x: number, y: number } +}; + +// Checks everything that is accessible to the player +function KinkyDungeonGetAccessible(startX: number, startY: number, testX?: number, testY?: number): GridEntry { + let tempGrid = {}; + let checkGrid: GridEntry = {}; + checkGrid[(startX + "," + startY)] = {x: startX, y: startY}; + while (Object.entries(checkGrid).length > 0) { + for (let g of Object.entries(checkGrid)) { + let X = g[1].x; + let Y = g[1].y; + for (let XX = -1; XX <= 1; XX++) + for (let YY = -1; YY <= 1; YY++) { + let testLoc = ((X+XX) + "," + (Y+YY)); + let locked = (testX != undefined && testY != undefined && X+XX == testX && Y+YY == testY) + || (KinkyDungeonTilesGet("" + (X+XX) + "," + (Y+YY)) && KinkyDungeonTilesGet("" + (X+XX) + "," + (Y+YY)).Lock); + if (!checkGrid[testLoc] && !tempGrid[testLoc] && X+XX > 0 && X+XX < KDMapData.GridWidth-1 && Y+YY > 0 && Y+YY < KDMapData.GridHeight-1 + && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(X+XX, Y+YY)) && !locked) { + checkGrid[testLoc] = {x:X+XX,y:Y+YY}; + tempGrid[testLoc] = {x:X+XX,y:Y+YY}; + } + } + + delete checkGrid[g[0]]; + } + } + + return tempGrid; +} + +// Checks everything that is accessible to the player, treating all doors as walls +function KinkyDungeonGetAccessibleRoom(startX: number, startY: number): string[] { + let tempGrid = {}; + let checkGrid: GridEntry = {}; + checkGrid[startX + "," + startY] = {x: startX, y: startY}; + while (Object.entries(checkGrid).length > 0) { + for (let g of Object.entries(checkGrid)) { + for (let XX = -1; XX <= 1; XX++) + for (let YY = -1; YY <= 1; YY++) { + let test = ((g[1].x+XX) + "," + (g[1].y+YY)); + let Tiles = KinkyDungeonMovableTiles.replace("D", "").replace("d", ""); + if (!checkGrid[test] && !tempGrid[test] && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(g[1].x+XX, g[1].y+YY))) { + if (Tiles.includes(KinkyDungeonMapGet(g[1].x+XX, g[1].y+YY))) + checkGrid[test] = {x: g[1].x+XX, y:g[1].y+YY}; + tempGrid[test] = true; + } + } + + delete checkGrid[g[0]]; + } + } + + return Object.keys(tempGrid); +} + +// Tests if the player can reach the end stair even if the test spot is blocked +function KinkyDungeonIsAccessible(testX: number, testY: number): boolean { + let accessible = KinkyDungeonGetAccessible(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, testX, testY); + for (let a of Object.entries(accessible)) { + let X = a[1].x; + let Y = a[1].y; + if (KinkyDungeonMapGet(X, Y) == 's') return true; + } + return false; +} + +// Tests if the player can reach the spot from the start point +function KinkyDungeonIsReachable(testX: number, testY: number, testLockX: number, testLockY: number): boolean { + let accessible = KinkyDungeonGetAccessible(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, testLockX, testLockY); + for (let a of Object.entries(accessible)) { + let X = a[1].x; + let Y = a[1].y; + if (X == testX && Y == testY) return true; + } + return false; +} + +function KinkyDungeonGetAllies(): entity[] { + let temp = []; + for (let e of KDMapData.Entities) { + if (KDCanBringAlly(e)) { + temp.push(e); + } + } + + return temp; +} + +/** + * @param enemy + */ +function KDIsImprisoned(enemy: entity): boolean { + return enemy && KDEntityHasFlag(enemy, "imprisoned"); +} + + +/** + * @param e + */ +function KDCanBringAlly(e: entity): boolean { + return e.Enemy && + (((e.Enemy.keepLevel || KDIsInParty(e)) && KDAllied(e) && !KDHelpless(e)) + || (e.leash && e.leash.entity == KDPlayer().id)) + && !KDIsImprisoned(e); +} + +function KDChooseFactions(factionList: string[], Floor: number, Tags: string[], BonusTags: Record, Set: boolean): string[] { + // Determine factions to spawn + let factions = factionList || Object.keys(KinkyDungeonFactionTag); + let primaryFaction = KDGetByWeight(KDGetFactionProps(factions, Floor, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), Tags, BonusTags)); + let randomFactions = [ + primaryFaction + ]; + + // Add up to one friend of the faction and one enemy + let allyCandidates = []; + for (let f of factions) { + if (KDFactionRelation(primaryFaction, f) > 0.2) allyCandidates.push(f); + } + let enemyCandidates = []; + for (let f of factions) { + if (KDFactionRelation(primaryFaction, f) < -0.2) enemyCandidates.push(f); + } + + let factionAllied = allyCandidates.length > 0 ? KDGetByWeight(KDGetFactionProps(allyCandidates, Floor, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), Tags, BonusTags)) : ""; + let factionEnemy = enemyCandidates.length > 0 ? KDGetByWeight(KDGetFactionProps(enemyCandidates, Floor, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), Tags, BonusTags)) : ""; + + if (factionAllied && KDRandom() < 0.33) randomFactions.push(factionAllied); + if (factionEnemy && KDRandom() < 0.6) randomFactions.push(factionEnemy); + + if (Set) { + KDMapData.MapFaction = primaryFaction; + KDMapData.JailFaction.push(primaryFaction); + KDMapData.GuardFaction.push(primaryFaction); + if (factionAllied) { + KDMapData.GuardFaction.push(factionAllied); + } + } + // Fill + if (randomFactions.length == 1) randomFactions.push("Bandit", "Bandit"); + else if (randomFactions.length == 2) randomFactions.push("Bandit"); + + console.log(randomFactions[0] + "," + randomFactions[1] + "," + randomFactions[2]); + return randomFactions; +} + +type SpawnBox = { + requiredTags: string[], + tags: string[], + currentCount: number, + maxCount: number, + filterTags?: string[], + ignoreAllyCount?: boolean, + bias?: number, +} + +function KinkyDungeonPlaceEnemies(spawnPoints: any[], InJail: boolean, Tags: string[], BonusTags: any, Floor: number, width: number, height: number, altRoom?: any, randomFactions?: any[], factionEnemy?: any) { + KinkyDungeonHuntDownPlayer = false; + KinkyDungeonFirstSpawn = true; + KinkyDungeonSearchTimer = 0; + + let enemyCount = 4 + Math.floor(Math.sqrt(Floor) + width/10 + height/10 + Math.sqrt(KinkyDungeonDifficulty)); + if (KinkyDungeonStatsChoice.get("Stealthy")) enemyCount = Math.round(enemyCount * KDStealthyEnemyCountMult); + let neutralCount = 0.4 * enemyCount; // Cant have more than 40% of the level NOT be hostile + if (KDTileToTest) { + enemyCount = 1; + } + let count = 0; + let ncount = 0; + let tries = 0; + let miniboss = false; + let boss = false; + let jailerCount = 0; + let EnemyNames = []; + + if (altRoom) { + if (altRoom.enemyMult) { + enemyCount *= altRoom.enemyMult; + neutralCount *= altRoom.enemyMult; + } + } + + // These tags are disallowed unless working in the specific box + let filterTagsBase = ["boss", "miniboss", "elite", "minor"]; + let filterTagsSpawn = ["boss", "miniboss"]; + let filterTagsCluster = ["boss", "miniboss"]; + + let spawnBoxes: SpawnBox[] = [ + {requiredTags: ["boss"], tags: [], currentCount: 0, maxCount: 0.025}, + {requiredTags: ["miniboss"], tags: [], currentCount: 0, maxCount: 0.075}, + {requiredTags: ["elite"], tags: [], currentCount: 0, maxCount: 0.15}, + {requiredTags: ["minor"], tags: [], currentCount: 0, maxCount: 0.1}, + ]; + if (KDGameData.MapMod) { + let mapMod = KDMapMods[KDGameData.MapMod]; + if (mapMod && mapMod.spawnBoxes) { + for (let m of mapMod.spawnBoxes) { + spawnBoxes.unshift(Object.assign({}, m)); + } + } + } else { + for (let rf of randomFactions) { + if (rf != undefined) { + spawnBoxes.push({ignoreAllyCount: true, requiredTags: [KinkyDungeonFactionTag[rf]], filterTags: ["boss", "miniboss"], tags: [KinkyDungeonFactionTag[rf]], currentCount: 0, maxCount: 0.15, bias: rf == factionEnemy ? 2 : 1}); + spawnBoxes.push({ignoreAllyCount: true, requiredTags: ["miniboss", KinkyDungeonFactionTag[rf]], tags: [KinkyDungeonFactionTag[rf]], currentCount: 0, maxCount: 0.1, bias: rf == factionEnemy ? 2 : 1}); + spawnBoxes.push({ignoreAllyCount: true, requiredTags: ["boss", KinkyDungeonFactionTag[rf]], tags: [KinkyDungeonFactionTag[rf]], currentCount: 0, maxCount: 0.01, bias: rf == factionEnemy ? 2 : 1}); + } + } + } + + let currentCluster = null; + + let spawns: SpawnEntry[] = []; + for (let sp of spawnPoints) { + spawns.push(sp); + } + + let enemyPoints = []; + + // Create a quasirandom distribution + // This is to get the enemies more spread out + // Higher dd = more spread out + let dd = 3.5; + for (let X = 1; X < width - 1.01 - dd; X += dd) + for (let Y = 1; Y < width - 1.01 - dd; Y += dd) { + enemyPoints.push({x: Math.round(X + KDRandom() * dd), y: Math.round(Y + KDRandom() * dd)}); + } + + let eep = []; + // Shuffle + while (enemyPoints.length > 0) { + let index = Math.floor(KDRandom() * enemyPoints.length); + eep.push(enemyPoints[index]); + enemyPoints.splice(index, 1); + } + + // Sort so that smaller rooms are prioritized + enemyPoints.sort((a, b) => { + let sizea = KinkyDungeonGetAccessibleRoom(a.x, a.y).length; + let sizeb = KinkyDungeonGetAccessibleRoom(b.x, b.y).length; + return sizeb - sizea; + + }); + + let culledSpawns = false; + // Create this number of enemies + while (((count < enemyCount) || (spawns.length > 0)) && tries < 10000) { + if (count >= enemyCount && !culledSpawns) { + spawns = spawns.filter((spawn) => { + return spawn.force; + }); + culledSpawns = true; + currentCluster = null; + if (spawns.length == 0) break; + } + + let pointIndex = Math.floor(KDRandom() * 0.5 * enemyPoints.length); + let point = enemyPoints[pointIndex]; + let X = point ? point.x : (1 + Math.floor(KDRandom()*(width - 1))); + let Y = point ? point.y : (1 + Math.floor(KDRandom()*(height - 1))); + + + + if (point && KinkyDungeonBoringGet(X, Y) > 0 && KDRandom() < 0.5) { + continue; + // Half of all enemies will be placed along the main path + } + + if (point) { + enemyPoints.splice(pointIndex); + } + + let required = []; + let spawnPoint = false; + let AI = undefined; + let faction = undefined; + let tags = []; + let levelBoost = 0; + let forceIndex: string = undefined; + let keys = false; + let noPlay = false; + + let LabelType = ""; + + let filterTags = JSON.parse(JSON.stringify(filterTagsBase)); + + if (altRoom && altRoom.factionSpawnsRequired) { + let jt = KDMapData.JailFaction?.length > 0 ? KinkyDungeonFactionTag[KDMapData.JailFaction[Math.floor(KDRandom() * KDMapData.JailFaction.length)]] : "jailer"; + if (jt) tags.push(jt); + } + + if (currentCluster && !(3 * KDRandom() < currentCluster.count) && !culledSpawns) { + filterTags = JSON.parse(JSON.stringify(filterTagsCluster)); + required.push(currentCluster.required); + X = currentCluster.x - 2 + Math.floor(KDRandom() * 5); + Y = currentCluster.y - 2 + Math.floor(KDRandom() * 5); + + if (!KinkyDungeonCheckPath(currentCluster.x, currentCluster.y, X, Y, false, true)) { + if (5 * KDRandom() < currentCluster.count) currentCluster = null; + continue; + } + } else { + currentCluster = null; + if (spawns.length > 0 && KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(spawns[0].x, spawns[0].y))) { + + filterTags = JSON.parse(JSON.stringify(filterTagsSpawn)); + spawnPoint = true; + let specific = false; + if (spawns[0].required) { + required = Object.assign([], spawns[0].required); + for (let t of required) { + if (filterTags.includes(t)) filterTags.splice(filterTags.indexOf(t), 1); + } + } + + if (spawns[0].tags) { + specific = true; + tags = JSON.parse(JSON.stringify(spawns[0].tags)); + for (let t of tags) { + if (filterTags.includes(t)) filterTags.splice(filterTags.indexOf(t), 1); + } + } + + if (spawns[0].ftags) { + for (let t of spawns[0].ftags) { + filterTags.push(t); + } + } + + if (!specific) { + tags.push(randomFactions[Math.floor(randomFactions.length * KDRandom())]); + } + X = spawns[0].x; + Y = spawns[0].y; + if (spawns[0].noPlay) noPlay = true; + if (spawns[0].keys) keys = true; + AI = spawns[0].AI; + levelBoost = spawns[0].levelBoost || 0; + forceIndex = spawns[0].forceIndex; + faction = spawns[0].faction; + spawns.splice(0, 1); + if (AI && KDAIType[AI]?.guard + && KDMapData.RandomPathablePoints["" + X + "," + Y] + ) { + LabelType = "Deploy"; + } else if (KDMapData.RandomPathablePoints["" + X + "," + Y]) { + LabelType = "Patrol"; + } + } + } + + let playerDist = 9; + let PlayerEntity = KDMapData.StartPosition; + + let spawnBox_filter = spawnBoxes.filter((bb) => { + return bb.currentCount < bb.maxCount * enemyCount && (!bb.bias + // This part places allied faction toward the center of the map and enemy faction around the edges + || (bb.bias == 1 && X > width * 0.25 && X < width * 0.75 && Y > height * 0.25 && Y < height * 0.75) + || (bb.bias == 2 && !(X > width * 0.25 && X < width * 0.75 && Y > height * 0.25 && Y < height * 0.75)) + ); + }); + let box = null; + if (spawnBox_filter.length > 0) { + box = spawnBox_filter[Math.floor(KDRandom() * spawnBox_filter.length)]; + } + + if (box && (!spawnPoint || box.addToSpawn) && !currentCluster) { + if (!spawnPoint) { + for (let rtag of box.requiredTags) { + if (filterTags.includes(rtag)) filterTags.splice(filterTags.indexOf(rtag), 1); + required.push(rtag); + } + if (box.filterTags) + for (let ftag of box.filterTags) { + if (!filterTags.includes(ftag)) filterTags.push(ftag); + } + } + for (let tag of box.tags) { + if (filterTags.includes(tag)) filterTags.splice(filterTags.indexOf(tag), 1); + tags.push(tag); + } + } else { + box = null; + } + + if ((spawnPoint && KinkyDungeonNoEnemy(X, Y, true)) || ( + KDMapData.RandomPathablePoints["" + X + "," + Y] && !culledSpawns + //(!KinkyDungeonTilesGet("" + X + "," + Y) || !KinkyDungeonTilesGet("" + X + "," + Y).OL) + && Math.sqrt((X - PlayerEntity.x) * (X - PlayerEntity.x) + (Y - PlayerEntity.y) * (Y - PlayerEntity.y)) > playerDist && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y)) + && KinkyDungeonNoEnemy(X, Y, true) && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OL))) { + + if (KDGameData.KinkyDungeonSpawnJailers > 0 && jailerCount < KDGameData.KinkyDungeonSpawnJailersMax) tags.push("jailer"); + if (KinkyDungeonMapGet(X, Y) == 'R' || KinkyDungeonMapGet(X, Y) == 'r') tags.push("rubble"); + if (KinkyDungeonMapGet(X, Y) == 'D' || KinkyDungeonMapGet(X, Y) == 'd') tags.push("door"); + if (KinkyDungeonMapGet(X, Y) == 'g') tags.push("grate"); + if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y+1)) && !KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y-1))) tags.push("passage"); + else if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X+1, Y)) && !KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X-1, Y))) tags.push("passage"); + else if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X+1, Y+1)) + && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X+1, Y-1)) + && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X-1, Y+1)) + && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X-1, Y-1))) tags.push("open"); + + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) + if (!(XX == X && YY == Y)) { + if (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X') tags.push("adjWall"); + if (KinkyDungeonMapGet(XX, YY) == 'D' || KinkyDungeonMapGet(XX, YY) == 'd') tags.push("adjDoor"); + if (KinkyDungeonMapGet(XX, YY) == 'D') tags.push("adjClosedDoor"); + if (KinkyDungeonMapGet(XX, YY) == 'c' || KinkyDungeonMapGet(XX, YY) == 'C') tags.push("adjChest"); + if (KinkyDungeonMapGet(XX, YY) == 'r' || KinkyDungeonMapGet(XX, YY) == 'R') tags.push("adjRubble"); + + } + + if (miniboss) tags.push("miniboss"); + if (boss) tags.push("boss"); + + + KinkyDungeonAddTags(tags, Floor); + for (let t of Tags) { + tags.push(t); + } + if (randomFactions.length > 0 && !box && !currentCluster && !spawnPoint) + tags.push(randomFactions[Math.floor(randomFactions.length * KDRandom())]); + if (required.length == 0) required = undefined; + let Enemy = KinkyDungeonGetEnemy( + tags, + KDGetEffLevel() + levelBoost, + forceIndex || (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + KinkyDungeonMapGet(X, Y), + required, + { + requireHostile: ((!altRoom || altRoom.reduceNeutrals) && ncount > neutralCount && (!box || !box.ignoreAllyCount)) ? "Player" : "", + requireAllied: altRoom?.factionSpawnsRequired ? (KDGetMainFaction() || KDFactionProperties[KDGetMainFaction()]?.jailAlliedFaction) : "", + requireNonHostile: altRoom?.neutralSpawnsRequired ? KDGetMainFaction() : "", + }, + BonusTags, + currentCluster ? filterTagsCluster : filterTags, ); + if (!Enemy) { + Enemy = KinkyDungeonGetEnemy( + tags, + KDGetEffLevel() + levelBoost, + forceIndex || (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + KinkyDungeonMapGet(X, Y), + required, + { + requireHostile: ((!altRoom || altRoom.reduceNeutrals) && ncount > neutralCount && (!box || !box.ignoreAllyCount)) ? "Player" : "", + requireAllied: altRoom?.factionSpawnsRequired ? (KDFactionProperties[KDGetMainFaction()]?.jailBackupFaction || KDFactionProperties[KDGetMainFaction()]?.jailAlliedFaction || KDGetMainFaction()) : "", + requireNonHostile: altRoom?.neutralSpawnsRequired ? KDGetMainFaction() : "", + }, + BonusTags, + currentCluster ? filterTagsCluster : filterTags); + } + if (!Enemy) { + tries += 50; // to prevent long load times + } + if (box && !Enemy) { + box.currentCount += 0.05; + } + if (Enemy && (!InJail || (Enemy.tags.jailer || Enemy.tags.jail || Enemy.tags.leashing))) { + let e: entity = {Enemy: Enemy, id: KinkyDungeonGetEnemyID(), x:X, y:Y, hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, shield: Enemy.shield, + movePoints: 0, attackPoints: 0, AI: KDGetAITypeOverride(Enemy, AI) || AI || Enemy.AI, faction: faction}; + if (spawnPoint) { + e.spawnX = X; + e.spawnY = Y; + + e.homeCoord = KDGetCurrentLocation(); + if (keys) { + e['keys'] = true; + } + } + + + if (LabelType) { + KDAddLabel({ + assigned: e.id, + name: LabelType, + type: LabelType, + x: X, + y: Y, + guard: (KDGetAI(e) && KDAIType[KDGetAI(e)]?.guard) ? true : undefined, + }); + } + + e = KDAddEntity(e); + if (noPlay) { + KinkyDungeonSetEnemyFlag(e, "noPlay", -1); + } + let clusterChance = 0.5; //1.1 + 0.9 * MiniGameKinkyDungeonLevel/KinkyDungeonMaxLevel; + let clusterLeader = !spawnPoint && !currentCluster && Enemy.clusterWith && KDRandom() < clusterChance; + // Give it a custom name, higher chance if cluster + let custom = KDProcessCustomPatron(Enemy, e, (clusterLeader) ? 1.0 : (!currentCluster ? 0.1 : 0.0), true); + let incrementCount = 1; + KinkyDungeonSetEnemyFlag(e, "NoFollow", -1); + let shop = KinkyDungeonGetShopForEnemy(e, false); + if (shop) { + KinkyDungeonSetEnemyFlag(e, "Shop", -1); + KinkyDungeonSetEnemyFlag(e, shop, -1); + KDSetShopMoney(e); + } + let loadout = KinkyDungeonGetLoadoutForEnemy(e, false); + KDSetLoadout(e, loadout); + KDRunCreationScript(e, KDGetCurrentLocation()); + + if (!spawnPoint && !currentCluster && Enemy.clusterWith) { + if (Enemy.tags.boss) clusterChance = 0; + else if (Enemy.tags.miniboss) clusterChance = 0; + else if (Enemy.tags.elite) clusterChance = 0.15; + //else if (Enemy.tags.elite || Enemy.tags.miniboss) clusterChance *= 0.6; + if (clusterLeader) + currentCluster = { + x : X, + y : Y, + required: Enemy.clusterWith, + count: 1, + AI: Enemy.guardChance && KDRandom() < Enemy.guardChance ? "looseguard" : undefined, + }; + } else if (currentCluster) currentCluster.count += 1; + if (!currentCluster && Enemy.guardChance && KDRandom() < Enemy.guardChance) { + if (KDCanOverrideAI(e)) + e.AI = "looseguard"; + else e.AI = KDGetAIOverride(e, 'looseguard'); + } else if (currentCluster && currentCluster.AI) e.AI = KDGetAIOverride(e, currentCluster.AI); + if (Enemy.tags.mimicBlock && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y))) KinkyDungeonMapSet(X, Y, '3'); + if (Enemy.tags.minor) incrementCount = 0.2; else incrementCount = currentCluster ? 0.5 : 1.0; // Minor enemies count as 1/5th of an enemy + if (Enemy.difficulty) incrementCount += Enemy.difficulty; + if (Enemy.tags.boss) { + //boss = true; + } + else if (Enemy.tags.miniboss) miniboss = true; // Adds miniboss as a tag + if (Enemy.tags.removeDoorSpawn && KinkyDungeonMapGet(X, Y) == "d") { + KinkyDungeonMapSet(X, Y, '0'); + KinkyDungeonTilesDelete(X + "," + Y); + } + if (Enemy.tags.jailer) jailerCount += 1; + + if (Enemy.summon) { + for (let sum of Enemy.summon) { + if (!sum.chance || KDRandom() < sum.chance) { + let enemies = KinkyDungeonSummonEnemy(X, Y, sum.enemy, sum.count, sum.range, sum.strict); + if (custom?.pets) { + for (let i = 0; i < enemies.length; i++) { + let en = enemies[i]; + KDProcessCustomPatronPet(custom.pets, en, i); + } + } + + } + } + } + if (incrementCount) count += spawnPoint ? 0.025 : incrementCount; + if (!spawnPoint && box) + box.currentCount += incrementCount; + if (KDFactionRelation("Player", KDGetFaction(e)) > -0.5) { + ncount += incrementCount; + } + EnemyNames.push(Enemy.name + `_${box?`box-${box.requiredTags}, ${box.tags}`:""},${currentCluster?"cluster":""},${spawnPoint}`); + } + } + tries += 1; + } + console.log(EnemyNames); + + KinkyDungeonCurrentMaxEnemies = KDMapData.Entities.length; +} + + +function KinkyDungeonGetClosestSpecialAreaDist(x: number, y: number): number { + let minDist = 10000; + if (!KDMapData.SpecialAreas) KDMapData.SpecialAreas = []; + for (let area of KDMapData.SpecialAreas) { + let dist = KDistChebyshev(x - area.x, y - area.y) - area.radius; + if (dist < minDist) minDist = dist; + } + + return minDist; +} + +// Type 0: empty border, hollow +// Type 1: hollow, no empty border +// Type 2: only empty space +// Type 3: completely filled +function KinkyDungeonCreateRectangle ( + Left: number, + Top: number, + Width: number, + Height: number, + Border?: boolean, + Fill?: boolean, + Padding?: number | boolean, + OL?: boolean, + NW?: boolean, + flexCorner?: boolean, + Jail?: boolean +): void +{ + let pad = (typeof Padding === 'number') ? Padding : +Padding; + let borderType = (Border) ? '1' : '0'; + let fillType = (Fill) ? '1' : '0'; + for (let X = -pad; X < Width + pad; X++) + for (let Y = - pad; Y < Height + pad; Y++) { + if (X + Left < KDMapData.GridWidth-1 && Y + Top < KDMapData.GridHeight-1 && X + Left > 0 && Y + Top > 0) { + let setTo = ""; + let offlimit = true; + if (X < 0 || Y < 0 || X >= Width || Y >= Height) { + setTo = '0'; + offlimit = false; + } else { + if (X == 0 || X == Width - 1 || Y == 0 || Y == Height-1) { + setTo = borderType; + } else setTo = fillType; + } + if (setTo != "" && KinkyDungeonMapGet(Left + X, Top + Y) != "s" && KinkyDungeonMapGet(Left + X, Top + Y) != "H") { + KinkyDungeonMapSet(Left + X, Top + Y, setTo); + delete KDMapData.EffectTiles[(Left + X) + "," + (Top + Y)]; + if (offlimit && (OL || Jail || NW)) { + KinkyDungeonTilesSet((Left + X) + "," + (Top + Y), {OL: OL, Jail: Jail, NW: NW}); + } + } + } + + + /* + if ((X == cellWidth || X == 0) && (Y > KDMapData.StartPosition.y - cellHeight && Y < KDMapData.StartPosition.y + cellHeight)) { + wall = true; + if (KDRandom() < barchance) bar = true; + } + if (Y == KDMapData.StartPosition.y - cellHeight && X <= cellWidth || Y == KDMapData.StartPosition.y + cellHeight && X <= cellWidth) { + wall = true; + if (KDRandom() < grateChance/(grateCount*3) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(X, Y+1)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(X, Y-1))) grate = true; + } + if (X == cellWidth && Y == KDMapData.StartPosition.y) { + wall = false; + door = true; + } + if (door) { + KinkyDungeonMapSet(X, Y, 'D'); + KinkyDungeonTilesGet(X + "," + Y] = {Type: "Door"}; + if (lock) KinkyDungeonTilesGet(X + "," + Y].Lock = lock; + } else if (wall) { + if (bar) + KinkyDungeonMapSet(X, Y, 'b'); + else if (grate) { + KinkyDungeonMapSet(X, Y, 'g'); + grateCount += 1; + } else + KinkyDungeonMapSet(X, Y, '1'); + } else KinkyDungeonMapSet(X, Y, '0');*/ + } + + if (flexCorner) { + // flexCorner is a feature to place doodads to avoid unnecessary passageways into other tiles + if (!KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad - 1, Top -pad)) + && !KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad, Top -pad - 1)) + && KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad - 1, Top -pad - 1))) { + KinkyDungeonMapSet(Left -pad, Top -pad, 'X'); + } + if (!KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad - 1, Top -1 + Height + pad)) + && !KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad, Top -1 + Height + pad + 1)) + && KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-pad - 1, Top -1 + Height + pad + 1))) { + KinkyDungeonMapSet(Left-pad, Top -1 + Height + pad, 'X'); + } + if (!KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad + 1, Top -pad)) + && !KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad, Top -pad - 1)) + && KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad + 1, Top -pad - 1))) { + KinkyDungeonMapSet(Left-1 + Height + pad, Top -pad, 'X'); + } + if (!KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad + 1, Top -1 + Height + pad)) + && !KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad, Top -1 + Height + pad + 1)) + && KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(Left-1 + Height + pad + 1, Top -1 + Height + pad + 1))) { + KinkyDungeonMapSet(Left-1 + Height + pad, Top -1 + Height + pad, 'X'); + } + } +} + +function KinkyDungeonPlaceStairs(_startpos: number, width: number, height: number, noStairs: boolean, nostartstairs: boolean, origMapType: string): void { + // Starting stairs are predetermined and guaranteed to be open + + if (!KDMapData.SpecialAreas) KDMapData.SpecialAreas = []; + if (!nostartstairs) { + KinkyDungeonMapSet(KDMapData.StartPosition.x, KDMapData.StartPosition.y, 'S'); + KinkyDungeonTilesSet(KDMapData.StartPosition.x + ',' + KDMapData.StartPosition.y, { + RoomType: origMapType == "JourneyFloor" ? "ShopStart" : origMapType, + }); + KDMapData.SpecialAreas.push({x: KDMapData.StartPosition.x, y: KDMapData.StartPosition.y, radius: 2}); + } + /*if (startpos > 1) KinkyDungeonMapSet(2, startpos - 1, '0'); + KinkyDungeonMapSet(2, startpos, '0'); + if (startpos < KDMapData.GridHeight-1) KinkyDungeonMapSet(2, startpos + 1, '0'); + if (startpos > 1) KinkyDungeonMapSet(3, startpos - 1, '0'); + KinkyDungeonMapSet(3, startpos, '0'); + if (startpos < KDMapData.GridHeight-1) KinkyDungeonMapSet(3, startpos + 1, '0');*/ + + if (!noStairs) { + // Ending stairs are not. + let placed = false; + + if (KDMapData.EndPosition) { + placed = true; + KinkyDungeonMapSet(KDMapData.EndPosition.x, KDMapData.EndPosition.y, 's'); + } + + // shop around for space if that didn't work for some reason + if (!placed) + for (let X = width - 2; X > 0.75 * width - 2 && !placed; X--) + for (let L = 100; L > 0; L -= 1) { // Try up to 100 times + //let X = width - 2; + let Y = 1 + 2*Math.floor(KDRandom()*0.5 * (height - 2)); + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y))) { + // Check the 3x3 area + let wallcount = 0; + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) + if (!(XX == X && YY == Y) && (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X')) + wallcount += 1; + if (wallcount == 7 + || (wallcount >= 5 + && (KinkyDungeonMapGet(X+1, Y) == '1' || KinkyDungeonMapGet(X-1, Y) == '1') + && (KinkyDungeonMapGet(X, Y+1) == '1' || KinkyDungeonMapGet(X, Y-1) == '1'))) { + placed = true; + KinkyDungeonMapSet(X, Y, 's'); + KDMapData.EndPosition = {x: X, y: Y}; + L = 0; + break; + } + } + } + + if (!placed) // Loosen the constraints + for (let L = 100; L > 0; L -= 1) { // Try up to 100 times + let X = width - 2 - Math.floor(KDRandom() * width/(4)); + let Y = 1 + Math.floor(KDRandom() * (height - 2)); + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y))) { + KinkyDungeonMapSet(X, Y, 's'); + KDMapData.EndPosition = {x: X, y: Y}; + L = 0; + } + } + + + if (KDMapData.ShortcutPositions && Object.values(KDMapData.ShortcutPositions).length > 0) { + let journeySlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; + if (journeySlot?.SideRooms) { + for (let i = 0; i < journeySlot?.SideRooms.length || i < Object.values(KDMapData.ShortcutPositions).length; i++) { + let pos = KDMapData.ShortcutPositions[i]; + if (pos) { + let sideRoom = KDSideRooms[journeySlot?.SideRooms[i]]; + if (sideRoom) { + let tile = KinkyDungeonTilesGet(pos.x + ',' + pos.y) || {}; + tile.SideRoom = sideRoom.name; + tile.ShortcutIndex = i; + tile.MapMod = sideRoom.mapMod; + tile.Faction = sideRoom.faction; + tile.EscapeMethod = sideRoom.escapeMethod; + tile.RoomType = sideRoom.altRoom; + KinkyDungeonTilesSet(pos.x + ',' + pos.y, tile); + KinkyDungeonMapSet(pos.x, pos.y, 'H'); + if (sideRoom.stairCreation(tile, pos.x, pos.y)) { + if (!KDMapData.SpecialAreas) KDMapData.SpecialAreas = []; + KDMapData.SpecialAreas.push({x: pos.x, y: pos.y, radius: 2}); + } + } else { + let tile = KinkyDungeonTilesGet(pos.x + ',' + pos.y) || {}; + tile.Skin = "CollapsedStairs"; + KinkyDungeonTilesSet(pos.x + ',' + pos.y, tile); + KinkyDungeonMapSet(pos.x, pos.y, 'r'); + + } + } + } + } + } + KDMapData.SpecialAreas.push({x: KDMapData.EndPosition.x, y: KDMapData.EndPosition.y, radius: 2}); + } + + if (!KDMapData.EndPosition) KDMapData.EndPosition = JSON.parse(JSON.stringify(KDMapData.StartPosition)); + //KDMapData.MainPath = checkpoint; + //if (KDMapData.MainPath != MiniGameKinkyDungeonCheckpoint && !nostartstairs) KinkyDungeonSkinArea({skin: KDMapData.MainPath}, KDMapData.EndPosition.x, KDMapData.EndPosition.y, 4.99); +} + +function KinkyDungeonSkinArea(skin: any, X: number, Y: number, Radius: number, NoStairs?: boolean) { + for (let xx = Math.floor(X - Radius); xx <= Math.ceil(X + Radius); xx++) { + for (let yy = Math.floor(Y - Radius); yy <= Math.ceil(Y + Radius); yy++) { + if (xx >= 0 && xx <= KDMapData.GridWidth - 1 && yy >= 0 && yy <= KDMapData.GridHeight - 1) { + if (KDistEuclidean(xx - X, yy - Y) <= Radius + 0.01 && (!NoStairs || KinkyDungeonMapGet(xx, yy) != 's')) { + if (!KDMapData.TilesSkin[xx + "," + yy]) { + KDMapData.TilesSkin[xx + "," + yy] = JSON.parse(JSON.stringify(skin)); + } else { + KDMapData.TilesSkin[xx + "," + yy].skin = skin.skin; + } + } + } + } + } +} + + + +let KDMinBoringness = 0; // Minimum boringness for treasure spawn + +function KinkyDungeonPlaceChests(params: floorParams, chestlist: any[], spawnPoints: any[], shrinelist: any[], treasurechance: number, treasurecount: number, rubblechance: number, Floor: number, width: number, height: number) { + + let shrinePoints = new Map(); + + for (let s of shrinelist) { + shrinePoints.set(s.x + "," + s.y, true); + } + let chestPoints = new Map(); + + for (let s of chestlist) { + if (KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(s.x, s.y))) + chestPoints.set(s.x + "," + s.y, true); + } + + let specialdata = { + altType: KDGetAltType(MiniGameKinkyDungeonLevel), + specialChests: (params.specialChests ? JSON.parse(JSON.stringify(params.specialChests)) : {}) as Record, + }; + + KinkyDungeonSendEvent("specialChests", specialdata); + + console.log(specialdata.specialChests); + + let extra = KDRandom() < treasurechance; + treasurecount += (extra ? 1 : 0); + for (let c of Object.values(specialdata.specialChests)) { + treasurecount += c; + } + + if (KinkyDungeonStatsChoice.get("Stealthy")) treasurecount *= 2; + + if (chestlist.length < treasurecount) { + // Populate the chests + for (let X = 1; X < width; X += 1) + for (let Y = 1; Y < height; Y += 1) { + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && KDistChebyshev(X - KDMapData.StartPosition.x, Y - KDMapData.StartPosition.y) > 10 && + (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OL)) { + // Check the 3x3 area + let wallcount = 0; + let adjcount = 0; + let diagadj = 0; + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) { + if (!(XX == X && YY == Y) && (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X')) { + wallcount += 1; + // Adjacent wall + if (XX == X || YY == Y) adjcount += 1; + } else if (!(XX == X && YY == Y) && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) { + if (!(XX == X || YY == Y)) {// Diagonal floor. We check the adjacent floors around the diagonals to determine if this is an alcove or a passage + if (XX == X + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X + 1, Y))) diagadj += 1; + else if (XX == X - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X - 1, Y))) diagadj += 1; + else if (YY == Y + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y + 1))) diagadj += 1; + else if (YY == Y - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y - 1))) diagadj += 1; + } + } + } + + if (wallcount == 7 + || (wallcount >= 4 && (wallcount - adjcount - diagadj == 0 || (wallcount == 5 && adjcount == 2 && diagadj == 1) || (wallcount > 4 && adjcount == 3 && diagadj == 7 - wallcount)) + && (KinkyDungeonMapGet(X+1, Y) == '1' || KinkyDungeonMapGet(X-1, Y) == '1') + && (KinkyDungeonMapGet(X, Y+1) == '1' || KinkyDungeonMapGet(X, Y-1) == '1') + && (!(!KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X+1, Y)) && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X-1, Y))) + || (wallcount > 4 && adjcount == 3 && diagadj == 7 - wallcount)) + && (!(!KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y+1)) && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y-1))) + || (wallcount > 4 && adjcount == 3 && diagadj == 7 - wallcount)))) { + if (!chestPoints.get((X+1) + "," + (Y)) + && !chestPoints.get((X-1) + "," + (Y)) + && !chestPoints.get((X+1) + "," + (Y+1)) + && !chestPoints.get((X+1) + "," + (Y-1)) + && !chestPoints.get((X-1) + "," + (Y+1)) + && !chestPoints.get((X-1) + "," + (Y-1)) + && !chestPoints.get((X) + "," + (Y+1)) + && !chestPoints.get((X) + "," + (Y-1)) + && !shrinePoints.get((X) + "," + (Y)) + && !shrinePoints.get((X+1) + "," + (Y)) + && !shrinePoints.get((X-1) + "," + (Y)) + && !shrinePoints.get((X+1) + "," + (Y+1)) + && !shrinePoints.get((X+1) + "," + (Y-1)) + && !shrinePoints.get((X-1) + "," + (Y+1)) + && !shrinePoints.get((X-1) + "," + (Y-1)) + && !shrinePoints.get((X) + "," + (Y+1)) + && !shrinePoints.get((X) + "," + (Y-1)) + && wallcount != 8 + && !KinkyDungeonEnemyAt(X, Y) + && !(Object.keys(KDGetEffectTiles(X, Y)).length > 0) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y+1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y+1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y+1))) { + chestlist.push({x:X, y:Y, boringness: KinkyDungeonBoringGet(X, Y)}); + chestPoints.set(X + "," + Y, true); + } + } + } + } + } + + // Truncate down to max chest count in a location-neutral way + let count = 0; + // Removed due to the way the jail system was reworked + let alreadyOpened = 0;//(KinkyDungeonChestsOpened.length > Floor) ? KinkyDungeonChestsOpened[Floor] : 0; + if (KinkyDungeonNewGame < 1) treasurecount -= alreadyOpened; + let list = []; + let maxBoringness = Math.max(...KDMapExtraData.Boringness); + while (chestlist.length > 0) { + let N = Math.floor(KDRandom()*chestlist.length); + let chest = chestlist[N]; + if (!chest.boringness) chest.boringness = KinkyDungeonBoringGet(chest.x, chest.y); + if (chest.boringness > maxBoringness * 0.2) + chest.boringness = chest.boringness + (0.05 + 0.1 * KDRandom()) * maxBoringness; + else + chest.boringness = chest.boringness + 0.02 * KDRandom() * maxBoringness; + if (chest.priority) { + list.unshift(chest); + } else list.push(chest); + + chestlist.splice(N, 1); + } + list.sort((a, b) => { + let boringa = a.boringness ? a.boringness : 0; + let boringb = b.boringness ? b.boringness : 0; + if (a.priority) boringa += 1000; + if (b.priority) boringb += 1000; + return boringb - boringa; + + }); + let silverchest = 0; + while (list.length > 0) { + let N = 0; + if (count < treasurecount) { + let chest = list[N]; + KinkyDungeonMapSet(chest.x, chest.y, 'C'); + + // Add a lock on the chest! For testing purposes ATM + let lock = KinkyDungeonGenerateLock((extra && count == 0) ? true : false, Floor, false, "Chest", {x: chest.x, y: chest.y, tile: KinkyDungeonTilesGet("" + chest.x + "," + chest.y)}); + if (chest.Loot) lock = chest.Lock; + if (silverchest == 0 && !chest.Loot) { + silverchest += 1; + KDGameData.ChestsGenerated.push("silver"); + KinkyDungeonTilesSet("" + chest.x + "," +chest.y, { + Loot: "silver", Roll: KDRandom(), NoTrap: chest.noTrap, Faction: chest.Faction, + lootTrap: KDGenChestTrap(false, chest.x, chest.y, "silver", lock, chest.noTrap),}); + } else if (Object.values(specialdata.specialChests).some((num) => {return num > 0;})) { + let filtered = Object.keys(specialdata.specialChests).filter((stype) => {return specialdata.specialChests[stype] > 0;}); + let type = filtered[Math.floor(KDRandom() * filtered.length)]; + specialdata.specialChests[type] -= 1; + let data = { + lock: lock, + noTrap: chest.noTrap, + type: type, + loot: type, + faction: chest.Faction, + specialChests: specialdata.specialChests, + guaranteedTrap: false, + }; + KinkyDungeonSendEvent("genSpecialChest", data); + KDGameData.ChestsGenerated.push(type); + KinkyDungeonTilesSet("" + chest.x + "," +chest.y, { + Loot: data.loot, Roll: KDRandom(), NoTrap: data.noTrap, Faction: data.faction, Type: data.lock ? "Lock" : undefined, Lock: data.lock, + Special: data.lock == "Blue", + RedSpecial: data.lock == "Red", + lootTrap: KDGenChestTrap(data.guaranteedTrap || false, chest.x, chest.y, data.type, data.lock, data.noTrap),}); + } else if (lock) { + KDGameData.ChestsGenerated.push(lock == "Blue" ? "blue" : (chest.Loot ? chest.Loot : "chest")); + KinkyDungeonTilesSet("" + chest.x + "," +chest.y, { + NoTrap: chest.NoTrap, Type: "Lock", Lock: lock, + Loot: lock == "Blue" ? "blue" : (chest.Loot ? chest.Loot : "chest"), + Faction: chest.Faction, + Roll: KDRandom(), + Special: lock == "Blue", + RedSpecial: lock == "Red", + lootTrap: KDGenChestTrap(false, chest.x, chest.y, (chest.Loot ? chest.Loot : "chest"), lock, chest.noTrap),}); + } else { + KDGameData.ChestsGenerated.push(chest.Loot ? chest.Loot : "chest"); + KinkyDungeonTilesSet("" + chest.x + "," +chest.y, {Loot: chest.Loot ? chest.Loot : "chest", Faction: chest.Faction, Roll: KDRandom(), + NoTrap: chest.NoTrap, + lootTrap: KDGenChestTrap(false, chest.x, chest.y, (chest.Loot ? chest.Loot : "chest"), lock, chest.noTrap),}); + } + + if (!KinkyDungeonTilesGet(chest.x + ',' + chest.y)?.lootTrap) { + // Chests in the open receive an extra guard + let point = KinkyDungeonGetNearbyPoint(chest.x, chest.y, true, undefined, true, false); + // Try again but a short dist away + if (!point) point = KinkyDungeonGetNearbyPoint(chest.x, chest.y, true, undefined, false, false); + if (point) { + let t = ["jailer"]; + if (KinkyDungeonFactionTag[KDGetMainFaction()]) { + t.push(KinkyDungeonFactionTag[KDGetMainFaction()]); + } + spawnPoints.push({x:point.x, y:point.y, required: t, AI: "guard", priority: true, force: true, keys: true, faction: KinkyDungeonTilesGet(chest.x + ',' + chest.y)?.Faction || KDGetMainFaction() || "Enemy"}); + if (!KinkyDungeonTilesGet(chest.x + ',' + chest.y).Faction) { + KinkyDungeonTilesGet(chest.x + ',' + chest.y).Faction = KDGetMainFaction(); + } + } + } + + if (KDAlreadyOpened(chest.x, chest.y)) { + //KinkyDungeonMapSet(chest.x, chest.y, 'c'); + //KinkyDungeonTilesDelete("" + chest.x + "," +chest.y); + } + count += 1; + } else { + + let chest = list[N]; + if (KinkyDungeonTilesGet(chest.x + ',' + chest.y)) { + delete KinkyDungeonTilesGet(chest.x + ',' + chest.y).Faction; + delete KinkyDungeonTilesGet(chest.x + ',' + chest.y).Type; + delete KinkyDungeonTilesGet(chest.x + ',' + chest.y).Lock; + delete KinkyDungeonTilesGet(chest.x + ',' + chest.y).lootTrap; + + } + if (KDRandom() < rubblechance) { + KinkyDungeonMapSet(chest.x, chest.y, 'R'); + } else if (KDRandom() * KDRandom() < rubblechance - 0.01) KinkyDungeonMapSet(chest.x, chest.y, '/'); + else if (KDRandom() < rubblechance - 0.05) KinkyDungeonMapSet(chest.x, chest.y, 'r'); + + } + list.splice(N, 1); + } + + + for (let tile of Object.entries(KDMapData.Tiles)) { + if (tile[1].lootTrap) { + let x = parseInt(tile[0].split(',')[0]); + let y = parseInt(tile[0].split(',')[1]); + let spawned = 0; + let mult = tile[1].lootTrap.mult; + let trap = tile[1].lootTrap.trap; + let time = tile[1].lootTrap.time || 3; + //let duration = tile[1].lootTrap.duration; + let maxspawn = 1 + Math.round(Math.min(2 + KDRandom() * 2, KinkyDungeonDifficulty/25) + Math.min(2 + KDRandom() * 2, 0.5*MiniGameKinkyDungeonLevel/KDLevelsPerCheckpoint)); + if (mult) maxspawn *= mult; + let requireTags = trap ? [trap] : undefined; + + let tags = ["trap", trap]; + KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); + + for (let i = 0; i < 30; i++) { + if (spawned < maxspawn) { + let Enemy = KinkyDungeonGetEnemy( + tags, KDGetEffLevel(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + '0', requireTags, {requireHostile: "Player"}); + if (Enemy) { + let point = KinkyDungeonGetNearbyPoint(x, y, true, undefined, undefined, true, (xx, yy) => { + return !KDEffectTileTags(xx, yy).rune; + }); + + //KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, Enemy.name, 1, 7, true, (duration || Enemy.tags.construct) ? (duration || 40) : undefined, undefined, false, "Ambush", true, 1.5, true, undefined, true, true); + if (point) { + if (!KinkyDungeonTilesGet(point.x + ',' + point.y)) KinkyDungeonTilesSet(point.x + ',' + point.y, {}); + KinkyDungeonTilesGet(point.x + ',' + point.y).lootTrapEnemy = Enemy.name; + KinkyDungeonTilesGet(point.x + ',' + point.y).lootTrapTime = time; + KDCreateEffectTile(point.x, point.y, { + name: "Runes", + duration: 9999, infinite: true, + }, 0); + if (Enemy.tags.minor) spawned += 0.5; + else if (Enemy.tags.elite) spawned += 1.5; + else if (Enemy.tags.miniboss) spawned += 2; + else if (Enemy.tags.boss) spawned += 4; + else spawned += 1; + if (Enemy.summonTags) { + for (let t of Enemy.summonTags) { + if (!tags.includes(t)) tags.push(t); + } + } + if (Enemy.summonTagsMulti) { + for (let t of Enemy.summonTagsMulti) { + tags.push(t); + } + } + } + } + } + } + } + } +} + + +function KinkyDungeonPlaceLore(width: number, height: number): number { + let loreList = []; + + // Populate the lore + for (let X = 1; X < width; X += 1) + for (let Y = 1; Y < height; Y += 1) + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OL) && KDRandom() < 0.6) loreList.push({x:X, y:Y}); + + let count = 0; + let maxcount = 2; + while (loreList.length > 0) { + let N = Math.floor(KDRandom()*loreList.length); + KDMapData.GroundItems.push({x:loreList[N].x, y:loreList[N].y, name: "Lore"}); + count += 1; + if (count >= maxcount) + return count; + } + return count; +} + +function KinkyDungeonPlaceHeart(width: number, height: number, _Floor: number): boolean { + let heartList = []; + + // Populate the lore + for (let X = 1; X < width; X += 1) + for (let Y = 1; Y < height; Y += 1) + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) + && KDMapData.RandomPathablePoints[(X) + ',' + (Y)] + && !KinkyDungeonEnemyAt(X, Y) + && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OL) + && KDistChebyshev(X - KDMapData.StartPosition.x, Y - KDMapData.StartPosition.y) > 8 + ) heartList.push({x:X, y:Y}); + + while (heartList.length > 0) { + let N = Math.floor(KDRandom()*heartList.length); + if (!KDGameData.HeartTaken) { + KDMapData.GroundItems.push({x:heartList[N].x, y:heartList[N].y, name: "Heart"}); + } + return true; + } + +} + + + +function KinkyDungeonPlaceShrines ( + chestlist: any[], + shrinelist: any[], + shrinechance: number, + shrineTypes: any[], + shrinecount: number, + shrinefilter: string[], + _ghostchance: number, + manaChance: number, + orbcount: number, + filterTypes: string[], + Floor: number, + width: number, + height: number, + allowQuests: boolean, + allowHearts: boolean +): number +{ + KinkyDungeonCommercePlaced = 0; + + + let chestPoints = new Map(); + + for (let s of chestlist) { + chestPoints.set(s.x + "," + s.y, true); + } + + let shrinePoints = new Map(); + let shrinePointsBackup = new Map(); + + for (let s of shrinelist) { + if (KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(s.x, s.y))) + shrinePoints.set(s.x + "," + s.y, true); + } + + let maxcount = shrinecount + orbcount; + + let shrinelistBackup = []; + + + let tablets = { + //"Cursed": 0, + "Determination": 0, + }; + let tabletsAmount = { + //"Cursed": 1, + "Determination": 3, + }; + + if (allowHearts) { + tablets['Heart'] = 0; + tabletsAmount['Heart'] = 2; + } + for (let goddess of Object.keys(KinkyDungeonShrineBaseCosts)) { + tablets[goddess] = 0; + let amt = 0; + if (KinkyDungeonGoddessRep[goddess] >= 5) { + amt += 1; + } + if (KinkyDungeonGoddessRep[goddess] >= 15) { + amt += 1; + } + if (KinkyDungeonGoddessRep[goddess] >= 35) { + amt += 1; + } + tabletsAmount[goddess] = amt; + maxcount += amt; + } + + let isDoodad = (X: number, Y: number) => { + return "aXmo".includes(KinkyDungeonMapGet(X, Y)); + }; + if (shrinelist.length <= maxcount) + // Populate the chests + for (let X = 1; X < width; X += 1) + for (let Y = 1; Y < height; Y += 1) + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && Math.max(Math.abs(X - KDMapData.StartPosition.x), Math.abs(Y - KDMapData.StartPosition.y)) > KinkyDungeonJailLeash + && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OL)) { + // Check the 3x3 area + let wallcount = 0; + let adjcount = 0; + let diagadj = 0; + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) { + if (!(XX == X && YY == Y) && (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X')) { + wallcount += 1; + // Adjacent wall + if (XX == X || YY == Y) adjcount += 1; + } else if (!(XX == X && YY == Y) && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) { + if (!(XX == X || YY == Y)) {// Diagonal floor. We check the adjacent floors around the diagonals to determine if this is an alcove or a passage + if (XX == X + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X + 1, Y))) diagadj += 1; + else if (XX == X - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X - 1, Y))) diagadj += 1; + else if (YY == Y + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y + 1))) diagadj += 1; + else if (YY == Y - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y - 1))) diagadj += 1; + } + } + } + + if (wallcount == 7 + || (wallcount >= 4 && (wallcount - adjcount - diagadj == 0 || (wallcount == 5 && adjcount == 2 && diagadj == 1) || (wallcount == 6 && adjcount == 3 && diagadj == 1)) + && (KinkyDungeonMapGet(X+1, Y) == '1' || KinkyDungeonMapGet(X-1, Y) == '1') + && (KinkyDungeonMapGet(X, Y+1) == '1' || KinkyDungeonMapGet(X, Y-1) == '1') + && (!(KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X-1, Y) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)) + && (!(KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X, Y-1) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)))) { + if (!shrinePoints.get((X+1) + "," + (Y)) + && !shrinePoints.get((X-1) + "," + (Y)) + && !shrinePoints.get((X+1) + "," + (Y+1)) + && !shrinePoints.get((X+1) + "," + (Y-1)) + && !shrinePoints.get((X-1) + "," + (Y+1)) + && !shrinePoints.get((X-1) + "," + (Y-1)) + && !shrinePoints.get((X) + "," + (Y+1)) + && !shrinePoints.get((X) + "," + (Y-1)) + && !chestPoints.get((X+1) + "," + (Y)) + && !chestPoints.get((X-1) + "," + (Y)) + && !chestPoints.get((X+1) + "," + (Y+1)) + && !chestPoints.get((X+1) + "," + (Y-1)) + && !chestPoints.get((X-1) + "," + (Y+1)) + && !chestPoints.get((X-1) + "," + (Y-1)) + && !chestPoints.get((X) + "," + (Y+1)) + && !chestPoints.get((X) + "," + (Y-1)) + && !chestPoints.get((X) + "," + (Y)) + && wallcount != 8 + && !KinkyDungeonEnemyAt(X, Y) + && !(Object.keys(KDGetEffectTiles(X, Y)).length > 0) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y+1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y+1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y+1))) { + if (isDoodad(X, Y)) { + shrinelistBackup.push({x:X, y:Y, boringness: KinkyDungeonBoringGet(X, Y)}); + shrinePointsBackup.set(X + "," + Y, true); + } else { + shrinelist.push({x:X, y:Y, boringness: KinkyDungeonBoringGet(X, Y)}); + shrinePoints.set(X + "," + Y, true); + } + + } + } + + + } else if (isDoodad(X, Y)) { + let yes = false; + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) { + if (!yes && !(XX == X && YY == Y) && KDPointWanderable(XX, YY)) { + yes = true; + } + } + if (yes) { + shrinelistBackup.push({x:X, y:Y, boringness: KinkyDungeonBoringGet(X, Y)}); + shrinePointsBackup.set(X + "," + Y, true); + } + } + + + // If we STILL dont have enough, we expand the criteria + if (shrinelist.length <= maxcount) + for (let X = 1; X < width; X += 1) + for (let Y = 1; Y < height; Y += 1) + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && Math.max(Math.abs(X - KDMapData.StartPosition.x), Math.abs(Y - KDMapData.StartPosition.y)) > KinkyDungeonJailLeash + && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OL)) { + // Check the 3x3 area + let wallcount = 0; + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) { + if (!(XX == X && YY == Y) && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(XX, YY))) { + wallcount += 1; + } + } + + if (wallcount == 0 // Open spaces and 1 off spaces + || wallcount == 1) { + if (!shrinePoints.get((X+1) + "," + (Y)) + && !shrinePoints.get((X-1) + "," + (Y)) + && !shrinePoints.get((X+1) + "," + (Y+1)) + && !shrinePoints.get((X+1) + "," + (Y-1)) + && !shrinePoints.get((X-1) + "," + (Y+1)) + && !shrinePoints.get((X-1) + "," + (Y-1)) + && !shrinePoints.get((X) + "," + (Y+1)) + && !shrinePoints.get((X) + "," + (Y-1)) + && !chestPoints.get((X+1) + "," + (Y)) + && !chestPoints.get((X-1) + "," + (Y)) + && !chestPoints.get((X+1) + "," + (Y+1)) + && !chestPoints.get((X+1) + "," + (Y-1)) + && !chestPoints.get((X-1) + "," + (Y+1)) + && !chestPoints.get((X-1) + "," + (Y-1)) + && !chestPoints.get((X) + "," + (Y+1)) + && !chestPoints.get((X) + "," + (Y-1)) + && !chestPoints.get((X) + "," + (Y)) + && !KinkyDungeonEnemyAt(X, Y) + && !(Object.keys(KDGetEffectTiles(X, Y)).length > 0) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y+1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y+1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y+1))) { + shrinelist.push({x:X, y:Y, boringness: KinkyDungeonBoringGet(X, Y)}); + shrinePoints.set(X + "," + Y, true); + } + } + + + } + + + + + + // Truncate down to max chest count in a location-neutral way + let count = 0; + + let orbs = 0; + let list = []; + let maxBoringness = Math.max(...KDMapExtraData.Boringness); + while (shrinelist.length > 0) { + let N = Math.floor(KDRandom()*shrinelist.length); + let chest = shrinelist[N]; + if (!chest.boringness) chest.boringness = KinkyDungeonBoringGet(chest.x, chest.y); + if (chest.boringness > maxBoringness * 0.2) + chest.boringness = chest.boringness + (0.05 + 0.1 * KDRandom()) * maxBoringness; + else + chest.boringness = chest.boringness + 0.02 * KDRandom() * maxBoringness; + if (chest.priority) { + list.unshift(chest); + } else list.push(chest); + + shrinelist.splice(N, 1); + } + list.sort((a, b) => { + let boringa = a.boringness ? a.boringness : 0; + let boringb = b.boringness ? b.boringness : 0; + if (a.priority) boringa += 1000; + if (b.priority) boringb += 1000; + return boringb - boringa; + + }); + + let quests = 0; + let backfillBackup = false; + + while (list.length > 0 || !backfillBackup) { + if (list.length < 10 && !backfillBackup) { + if (shrinelistBackup.length > 0) { + while (shrinelistBackup.length > 0) { + let N = Math.floor(KDRandom()*shrinelistBackup.length); + let chest = shrinelistBackup[N]; + if (!chest.boringness) chest.boringness = KinkyDungeonBoringGet(chest.x, chest.y); + if (chest.boringness > maxBoringness * 0.2) + chest.boringness = chest.boringness + (0.05 + 0.1 * KDRandom()) * maxBoringness; + else + chest.boringness = chest.boringness + 0.02 * KDRandom() * maxBoringness; + list.push(chest); + + shrinelistBackup.splice(N, 1); + } + list.sort((a, b) => { + let boringa = a.boringness ? a.boringness : 0; + let boringb = b.boringness ? b.boringness : 0; + if (a.priority) boringa += 1000; + if (b.priority) boringb += 1000; + return boringb - boringa; + + }); + } + backfillBackup = true; + } + + let NN = 0; + if (count <= shrinecount) { + + let shrine = list[NN]; + if (!shrine) break; + if (count == shrinecount && KDRandom() > shrinechance) + KinkyDungeonMapSet(shrine.x, shrine.y, 'a'); + else { + let placedChampion = !allowQuests || !KDGameData.Champion; + let playerTypes = KinkyDungeonRestraintTypes(shrinefilter); + let stype: {type: string, drunk?: boolean} = + shrineTypes.length < orbcount + ? {type: "Orb"} + : ( + (KDGameData.Champion && !placedChampion && shrineTypes.length == orbcount) + ? {type: KDGameData.Champion} + : ((shrineTypes.length == + ((KDGameData.Champion && allowQuests) + ? orbcount + 1 + : orbcount) + && playerTypes.length > 0) + ? {type: playerTypes[Math.floor(KDRandom() * playerTypes.length)]} + : KinkyDungeonGenerateShrine(Floor, filterTypes, manaChance))); + let type = stype.type; + let tile = 'A'; + if (type != "Orb" && shrineTypes.includes(type) && (KDRandom() < 0.5 || type == "Commerce")) type = ""; + if (type == "Orb") { + if (orbs < orbcount) { + tile = 'O'; + + if (KinkyDungeonStatsChoice.get("randomMode") && KDGetRandomSpell()) { + let spell = KDGetRandomSpell(); + KinkyDungeonTilesSet("" + shrine.x + "," +shrine.y, {Type: "Orb", Spell: spell.name, Light: 5, lightColor: 0x28B4FF}); + } else + KinkyDungeonTilesSet("" + shrine.x + "," +shrine.y, {Type: "Orb", Light: 5, lightColor: 0x28B4FF}); + + + + orbs += 1; + } else tile = 'o'; + if (KDAlreadyOpened(shrine.x, shrine.y)) { + //tile = 'o'; + } + shrineTypes.push("Orb"); + } else if (type) { + KinkyDungeonTilesSet("" + shrine.x + "," +shrine.y, {Type: "Shrine", Name: type, drunk: stype.drunk}); + if (allowQuests && quests < KDMAXGODDESSQUESTS) { + let quest = KDGetShrineQuest(KDMapData, KinkyDungeonTilesGet("" + shrine.x + "," +shrine.y)); + if (quest) { + KDSetShrineQuest(KDMapData, KinkyDungeonTilesGet("" + shrine.x + "," +shrine.y), + quest); + quests += 1; + } + } + shrineTypes.push(type); + placedChampion = true; + } else if (placedChampion && !shrineTypes.includes("Ghost") || KDRandom() < 0.5) { + shrineTypes.push("Ghost"); + tile = 'G'; + KinkyDungeonTilesSet("" + shrine.x + "," +shrine.y, {Type: "Ghost"}); + } else tile = 'a'; + + KinkyDungeonMapSet(shrine.x, shrine.y, tile); + //console.log(`Placed ${type} in boringness ${KinkyDungeonBoringGet(shrine.x, shrine.y)}, prioritized? ${shrine.priority}`); + } + + count += 1; + } else for (let goddess of Object.keys(tablets)) { + if (tablets[goddess] < tabletsAmount[goddess]) { + let shrine = list[NN]; + if (goddess == 'Heart') quests += 1; + KinkyDungeonTilesSet("" + shrine.x + "," +shrine.y, {Type: "Tablet", Name: goddess, Light: 3, lightColor: 0x8888ff}); + KinkyDungeonMapSet(shrine.x, shrine.y, 'M'); + + tablets[goddess] += 1; + break; + } + } + + list.splice(NN, 1); + } + return quests; +} + + +function KinkyDungeonPlaceChargers(chargerlist: any[], chargerchance: number, litchargerchance: number, chargercount: number, _Floor: number, width: number, height: number): void { + let chargerPoints = new Map(); + + for (let s of chargerlist) { + if (KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(s.x, s.y))) + chargerPoints.set(s.x + "," + s.y, true); + } + + + if (chargerlist.length < chargercount) + // Populate the chests + for (let X = 1; X < width; X += 1) + for (let Y = 1; Y < height; Y += 1) + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && Math.max(Math.abs(X - KDMapData.StartPosition.x), Math.abs(Y - KDMapData.StartPosition.y)) > KinkyDungeonJailLeash + && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OL)) { + // Check the 3x3 area + let wallcount = 0; + let adjcount = 0; + let diagadj = 0; + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) { + if (!(XX == X && YY == Y) && (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X')) { + wallcount += 1; + // Adjacent wall + if (XX == X || YY == Y) adjcount += 1; + } else if (!(XX == X && YY == Y) && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) { + if (!(XX == X || YY == Y)) {// Diagonal floor. We check the adjacent floors around the diagonals to determine if this is an alcove or a passage + if (XX == X + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X + 1, Y))) diagadj += 1; + else if (XX == X - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X - 1, Y))) diagadj += 1; + else if (YY == Y + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y + 1))) diagadj += 1; + else if (YY == Y - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y - 1))) diagadj += 1; + } + } + } + + if (wallcount == 7 || wallcount == 0 + || (wallcount >= 4 && (wallcount - adjcount - diagadj == 0 || (wallcount == 5 && adjcount == 2 && diagadj == 1) || (wallcount == 6 && adjcount == 3 && diagadj == 1)) + && (KinkyDungeonMapGet(X+1, Y) == '1' || KinkyDungeonMapGet(X-1, Y) == '1') + && (KinkyDungeonMapGet(X, Y+1) == '1' || KinkyDungeonMapGet(X, Y-1) == '1') + && (!(KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X-1, Y) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)) + && (!(KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X, Y-1) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)))) { + if (!chargerPoints.get((X+1) + "," + (Y)) + && !chargerPoints.get((X-1) + "," + (Y)) + && !chargerPoints.get((X+1) + "," + (Y+1)) + && !chargerPoints.get((X+1) + "," + (Y-1)) + && !chargerPoints.get((X-1) + "," + (Y+1)) + && !chargerPoints.get((X-1) + "," + (Y-1)) + && !chargerPoints.get((X) + "," + (Y+1)) + && !chargerPoints.get((X) + "," + (Y-1)) + && !(Object.keys(KDGetEffectTiles(X, Y)).length > 0) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y+1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y+1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y+1))) { + chargerlist.push({x:X, y:Y}); + chargerPoints.set(X + "," + Y, true); + } + } + + + } + + // Truncate down to max chest count in a location-neutral way + let count = 0; + let list = []; + while (chargerlist.length > 0) { + let N = Math.floor(KDRandom()*chargerlist.length); + let chest = chargerlist[N]; + if (chest.priority) { + list.unshift(chest); + } else list.push(chest); + chargerlist.splice(N, 1); + } + while (list.length > 0) { + let N = 0; + if (count <= chargercount) { + + let charger = list[N]; + let tile = KDRandom() > chargerchance ? '-' : (KDRandom() < litchargerchance ? '=' : '+'); + + if (tile != '-') { + KinkyDungeonTilesSet("" + charger.x + "," +charger.y, {Type: "Charger", NoRemove: tile == '=', lightColor: KDChargerColor, Light: (tile == '=' ? KDChargerLight : undefined)}); + } + + KinkyDungeonMapSet(charger.x, charger.y, tile); + + count += (tile == '-' ? 0.4 : 1.0); + } + + list.splice(N, 1); + } +} + +let KinkyDungeonCommercePlaced = 0; + +function KDGetMapParams(): floorParams { + return KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; +} + +/** + * @param Floor + * @param manaChance + * @param filterTypes + */ +function KinkyDungeonGenerateShrine(_Floor: number, filterTypes: string[], manaChance: number) { + let Params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; + let drunk = !(KDRandom() < manaChance); + + if (Params.shrines) { + + let shrineWeightTotal = 0; + let shrineWeights = []; + + for (let shrine of Params.shrines) { + shrineWeights.push({shrine: shrine, weight: shrineWeightTotal}); + if (!filterTypes || !filterTypes.includes(shrine.Type)) { + shrineWeightTotal += shrine.Weight; + if (shrine.Type == "Commerce" && KinkyDungeonStatsChoice.has("Supermarket")) { + shrineWeightTotal += 15; // Increase weight of shop shrines + } + } + + } + + let selection = KDRandom() * shrineWeightTotal; + + for (let L = shrineWeights.length - 1; L >= 0; L--) { + if (selection > shrineWeights[L].weight) { + return {type: shrineWeights[L].shrine.Type, drunk: drunk}; + } + } + } + + return {type: ""}; +} + + +function KinkyDungeonPlaceSpecialTiles(gaschance: number, gasType: string, _Floor: number, width: number, height: number): void { + if (gaschance > 0) { + for (let X = 1; X < width; X += 1) + for (let Y = 1; Y < height; Y += 1) + // Happy Gas + if (KinkyDungeonMapGet(X, Y) == '0') { + let chance = 0; + // Check the 3x3 area + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) { + if (!(XX == X && YY == Y) && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(XX, YY))) + chance += gaschance; + } + + if (KDRandom() < chance) + KinkyDungeonMapSet(X, Y, gasType); + } + } + +} + +function KinkyDungeonPlaceBrickwork( brickchance: number, _Floor: number, width: number, height: number) { + // Populate the chests + for (let X = 1; X < width; X += 1) + for (let Y = 1; Y < height; Y += 1) + if (KinkyDungeonMapGet(X, Y) == '0') { + let chance = brickchance; + // Check the 3x3 area + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) { + if (!(XX == X && YY == Y) && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(XX, YY))) + chance += 0.01; + if (KinkyDungeonMapGet(XX, YY) == 'A') + chance += 0.5; + else if (KinkyDungeonMapGet(XX, YY) == 'a') + chance += 0.25; + } + + if (KDRandom() < chance) + KinkyDungeonMapSet(X, Y, '2'); + } +} + +function KinkyDungeonPlaceTraps(traps: any[], traptypes: any[], trapchance: number, doorlocktrapchance: number, Floor: number, width: number, height: number): void { + for (let X = 1; X < width-1; X += 1) + for (let Y = 1; Y < height-1; Y += 1) { + let hosttile = KinkyDungeonMapGet(X, Y); + let chance = KDTrappableNeighbors.includes(hosttile) ? trapchance * trapchance : (KDTrappableNeighborsLikely.includes(hosttile) ? trapchance : 0); + // Check the 3x3 area + if (chance > 0) { + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) { + let tile = KinkyDungeonMapGet(XX, YY); + if (KinkyDungeonGroundTiles.includes(tile)) { + if (KDRandom() < chance) { + traps.push({x: XX, y: YY}); + } + } + } + } + if (hosttile == 'L' && KinkyDungeonStatsChoice.has("Nowhere") && KDRandom() < 0.25) { + let tile = KinkyDungeonTilesGet(X + "," + Y) ? KinkyDungeonTilesGet(X + "," + Y) : {}; + KinkyDungeonTilesSet(X + "," + Y, Object.assign(tile, { + Type: "Trap", + Trap: tile.Furniture ? tile.Furniture + "Trap" : "BarrelTrap", + })); + } + } + for (let trap of traps) { + if (KinkyDungeonMapGet(trap.x, trap.y) != 'T') { + if ((KinkyDungeonMapGet(trap.x, trap.y) == 'D' || KinkyDungeonMapGet(trap.x, trap.y) == 'd') && KDRandom() < doorlocktrapchance) { + if (KinkyDungeonTilesGet(trap.x + "," + trap.y)) { + KinkyDungeonTilesGet(trap.x + "," + trap.y).StepOffTrap = "DoorLock"; + KinkyDungeonTilesGet(trap.x + "," + trap.y).Lock = undefined; + for (let item of KDMapData.GroundItems) { + if (item.x == trap.x && item.y == trap.y && item.name == "Gold") { + KDMapData.GroundItems.splice(KDMapData.GroundItems.indexOf(item), 1); + } + } + } + } else { + KinkyDungeonMapSet(trap.x, trap.y, 'T'); + let t = KinkyDungeonGetTrap(traptypes, Floor, []); + if (!t) continue; + let tile = KinkyDungeonTilesGet(trap.x + "," + trap.y); + if (t.StepOffTrap) { + KinkyDungeonTilesSet(trap.x + "," + trap.y, { + StepOffTrap: t.Name, + Restraint: t.Restraint, + Enemy: t.Enemy, + FilterTag: t.FilterTag, + FilterBackup: t.FilterBackup, + Spell: t.Spell, + Hostile: t.Hostile, + Faction: t.Faction, + extraTag: t.extraTag, + Power: t.Power, + OL: tile?.OL, + }); + } else { + KinkyDungeonTilesSet(trap.x + "," + trap.y, { + Type: "Trap", + Trap: t.Name, + Restraint: t.Restraint, + Enemy: t.Enemy, + Hostile: t.Hostile, + Faction: t.Faction, + FilterTag: t.FilterTag, + FilterBackup: t.FilterBackup, + Spell: t.Spell, + extraTag: t.extraTag, + Power: t.Power, + OL: tile?.OL, + }); + } + + if (KDRandom() < 0.05) { + let dropped = {x:trap.x, y:trap.y, name: "Gold", amount: 1}; + KDMapData.GroundItems.push(dropped); + } + let spell = t.Spell ? KinkyDungeonFindSpell(t.Spell, true) : null; + if (spell && !spell.nonmagical) { + KDCreateEffectTile(trap.x, trap.y, { + name: "RunesTrap", + duration: 9999, infinite: true, + }, 0); + } + } + } + } + + +} + +function KinkyDungeonPlacePatrols(Count: number, width: number, height: number): void { + for (let i = 1; i <= Count; i++) { + if (KDMapData.PatrolPoints.length < Count) + for (let L = 1000; L > 0; L -= 1) { // Try up to 1000 times + let X = Math.floor(i * width / (Count + 1)) + Math.floor(KDRandom() * width/(Count + 1)); + let Y = Math.floor(KDRandom()*height); + if (!KinkyDungeonPointInCell(X, Y, 6) + && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) + && (!KinkyDungeonTilesGet(X + "," + Y) || (!KinkyDungeonTilesGet(X + "," + Y).OL && !KinkyDungeonTilesGet(X + "," + Y).NW))) { + KDMapData.PatrolPoints.push({x: X, y: Y}); + KDAddLabel({ + assigned: -1, + name: "Patrol", + type: "Patrol", + x: X, + y: Y, + }); + break; + } + } + } +} + +function KDGetEffLevel(): number { + let effLevel = MiniGameKinkyDungeonLevel + Math.round(KinkyDungeonDifficulty/5); + if (KinkyDungeonNewGame) effLevel += KinkyDungeonMaxLevel; + + return effLevel; +} + +function KDRandomizeRedLock(): string { + let level = KDGetEffLevel(); + if (KDRandom() < -0.1 + Math.min(0.5, level * 0.03)) return "Red_Hi"; + if (KDRandom() < 0.25 + Math.min(0.55, level * 0.03)) return "Red_Med"; + return "Red"; +} + + +/** + * @param [Guaranteed] + * @param [Floor] + * @param [AllowGold] + * @param [Type] - Used to customize the type + * @param [Data] - Used to customize the type + */ +function KDGetLockList(Guaranteed?: boolean, Floor?: number, AllowGold?: boolean, Type?: string, Data?: any): Record { + let ret: Record = {}; + for (let obj of Object.keys(KDLocks)) { + if (KDLocks[obj].filter(Guaranteed, Floor, AllowGold, Type, Data)) + ret[obj] = KDLocks[obj].weight(Guaranteed, Floor, AllowGold, Type, Data); + } + return ret; +} + +/** + * Generates a lock + * @param [Guaranteed] + * @param [Floor] + * @param [AllowGold] + * @param [Type] - Used to customize the type + * @param [Data] - Used to customize the type + */ +function KinkyDungeonGenerateLock(Guaranteed?: boolean, Floor?: number, AllowGold?: boolean, Type?: string, Data?: any): string { + let level = (Floor) ? Floor : KDGetEffLevel(); + //let Params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; + + let chance = (level == 0) ? 0 : KinkyDungeonBaseLockChance; + chance += KinkyDungeonScalingLockChance * level / KDLevelsPerCheckpoint; + + if (Guaranteed) chance = 1.0; + + let lock = undefined; + + if (KDRandom() < chance) { + // Get list + lock = KDGetByWeight(KDGetLockList(Guaranteed, level, AllowGold, Type, Data)); + + // Now we get the amount failed by + // Default: red lock + /*let locktype = KDRandom(); + let locktype2 = KDRandom(); + + let modifiers = ""; + let bmax = KinkyDungeonBlueLockChanceScalingMax + Math.min(0.25, KinkyDungeonDifficulty * 0.002); + let pmax = KinkyDungeonPurpleLockChanceScalingMax + Math.min(0.8, KinkyDungeonDifficulty * 0.004); + let BlueChance = Math.min(KinkyDungeonBlueLockChance + (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.5 : 1.0) * level * KinkyDungeonBlueLockChanceScaling, (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.6 : 1.0) * bmax); + let PurpleChance = Math.min(KinkyDungeonPurpleLockChance + (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.5 : 1.0) * level * KinkyDungeonPurpleLockChanceScaling, (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.6 : 1.0) * pmax); + + if (KinkyDungeonStatsChoice.get("HighSecurity")) { + BlueChance *= 1.5; + BlueChance += 0.05; + PurpleChance *= 1.5; + PurpleChance += 0.05; + } + if (locktype2 < PurpleChance && locktype2*PurpleChance > locktype*BlueChance) { + lock = "Purple" + modifiers; + } else if (locktype < BlueChance) { + let max = KinkyDungeonGoldLockChanceScalingMax + Math.min(0.4, KinkyDungeonDifficulty * 0.001); + let GoldChance = Math.min(KinkyDungeonGoldLockChance + (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.6 : 1.0) * level * KinkyDungeonGoldLockChanceScaling, (KinkyDungeonStatsChoice.get("HighSecurity") ? 1.9 : 1.0) * max); + + if (AllowGold && KDRandom() < GoldChance) lock = "Gold" + modifiers; + else lock = "Blue" + modifiers; + } else { + lock = KDRandomizeRedLock() + modifiers; + }*/ + } + /*if (Type == "Door") { + if (lock.includes("Blue") || lock.includes("Gold")) lock = KDRandomizeRedLock(); + }*/ + + return lock; +} + +let KDPlaceMode = { + MODE_PLACENEW: 0x0, + MODE_MODIFYPOTENTIALANDEXISTING: 0x1, + MODE_MODIFYEXISTINGONLY: 0x2, +}; +function KinkyDungeonPlaceDoors ( + doorchance: number, + doortrapchance: number, + nodoorchance: number, + doorlockchance: number, + trapChance: number, + grateChance: number, + Floor: number, + width: number, + height: number, + placeMode: number = KDPlaceMode.MODE_PLACENEW +) +{ + let doorlist = []; + let doorlist_2ndpass = []; + let trapLocations = []; + + // Populate the doors + for (let X = 1; X < width; X += 1) + for (let Y = 1; Y < height; Y += 1) + if ( ( (placeMode == KDPlaceMode.MODE_PLACENEW && KinkyDungeonMapGet(X, Y) != 'D' && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y))) + || ((placeMode == KDPlaceMode.MODE_MODIFYEXISTINGONLY || placeMode == KDPlaceMode.MODE_MODIFYPOTENTIALANDEXISTING) && (KinkyDungeonMapGet(X, Y) == 'd' || KinkyDungeonMapGet(X, Y) == 'D')) + || (placeMode == KDPlaceMode.MODE_MODIFYPOTENTIALANDEXISTING && (KinkyDungeonTilesGet(X + "," + Y)?.PotentialDoor)) + ) + && ( !KinkyDungeonTilesGet(X + "," + Y) + || (!KinkyDungeonTilesGet(X + "," + Y).OL && !KinkyDungeonTilesGet(X + "," + Y).Lock && !KinkyDungeonTilesGet(X + "," + Y).RequiredDoor))) + { + // Check the 3x3 area + let wallcount = 0; + let up = false; + let down = false; + let left = false; + let right = false; + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) { + let get = KinkyDungeonMapGet(XX, YY); + if (!(XX == X && YY == Y) && (!KinkyDungeonMovableTilesEnemy.includes(get))) { + wallcount += 1; // Get number of adjacent walls + if ("14,b".includes(get)) { + if (XX == X+1 && YY == Y && !KinkyDungeonMovableTilesEnemy.includes(get)) right = true; + else if (XX == X-1 && YY == Y && !KinkyDungeonMovableTilesEnemy.includes(get)) left = true; + else if (XX == X && YY == Y+1 && !KinkyDungeonMovableTilesEnemy.includes(get)) down = true; + else if (XX == X && YY == Y-1 && !KinkyDungeonMovableTilesEnemy.includes(get)) up = true; + } + } else if (get == 'D') // No adjacent doors + wallcount = 100; + } + if ((placeMode == KDPlaceMode.MODE_PLACENEW ? (wallcount < 5) : (wallcount > 1 && wallcount < 7)) && ((up && down) != (left && right)) && KDRandom() > nodoorchance) { // Requirements: 4 doors and either a set in up/down or left/right but not both + doorlist.push({x:X, y:Y}); + doorlist_2ndpass.push({x:X, y:Y}); + } + } + + while (doorlist.length > 0) { + let N = Math.floor(KDRandom()*doorlist.length); + + let door = doorlist[N]; + let X = door.x; + let Y = door.y; + + let closed = KDRandom() < doorchance; + KinkyDungeonMapSet(X, Y, (closed ? 'D' : 'd')); + KinkyDungeonTilesSet("" + X + "," + Y, {Type: "Door"}); + if (closed && KDRandom() < doorlockchance && KinkyDungeonIsAccessible(X, Y)) { + KinkyDungeonTilesGet("" + X + "," + Y).Lock = KinkyDungeonGenerateLock(true, Floor, undefined, "Door", {x: X, y: Y, tile: KinkyDungeonTilesGet("" + X + "," + Y)}); + } + + if (KDRandom() < doortrapchance) { + trapLocations.push({x: X, y: Y}); + } + + doorlist.splice(N, 1); + } + + while (doorlist_2ndpass.length > 0) { + let N = Math.floor(KDRandom()*doorlist_2ndpass.length); + let minLockedRoomSize = 8; + let maxPlayerDist = 4; + + let door = doorlist_2ndpass[N]; + let X = door.x; + let Y = door.y; + + let roomDoors = []; + + let trap = KDRandom() < trapChance; + let grate = KDRandom() < grateChance; + + if ((trap || grate) && KinkyDungeonTilesGet(X + "," + Y) && !KinkyDungeonTilesGet(X + "," + Y).NoTrap && !KinkyDungeonTilesGet(X + "," + Y).OL) { + let accessible = KinkyDungeonGetAccessibleRoom(X, Y); + + if (accessible.length > minLockedRoomSize) { + for (let a of accessible) { + let split = a.split(','); + let XX = parseInt(split[0]); + let YY = parseInt(split[1]); + let tileType = KinkyDungeonMapGet(XX, YY); + if ((tileType == "D" || tileType == 'd') && !KinkyDungeonTilesGet(a).Lock && XX != X && YY != Y) { + roomDoors.push({x: XX, y: YY}); + } + } + let rooms = []; + let room2 = KinkyDungeonGetAccessibleRoom(X, Y); + for (let ddoor of roomDoors) { + rooms.push({door: ddoor, room: room2}); + } + for (let room of rooms) { + let success = room.room.length == accessible.length; + for (let tile of accessible) { + if (!room.room.includes(tile)) { + success = false; + break; + } + } + if (success) { + if (!KinkyDungeonTilesGet(room.door.x + "," + room.door.y).Lock && !KinkyDungeonTilesGet(X + "," + Y).Lock && !KinkyDungeonTilesGet(room.door.x + "," + room.door.y).NoTrap + && ((KinkyDungeonGetAccessibleRoom(X+1, Y).length != KinkyDungeonGetAccessibleRoom(X-1, Y).length + && KinkyDungeonIsReachable(X+1, Y, X, Y) && KinkyDungeonIsReachable(X-1, Y, X, Y)) + || (KinkyDungeonGetAccessibleRoom(X, Y+1).length != KinkyDungeonGetAccessibleRoom(X, Y-1).length) + && KinkyDungeonIsReachable(X, Y+1, X, Y) && KinkyDungeonIsReachable(X, Y-1, X, Y)) + && KinkyDungeonIsAccessible(X, Y)) { + let lock = false; + //console.log(X + "," + Y + " locked") + if (trap && Math.max(Math.abs(room.door.x - KinkyDungeonPlayerEntity.x), Math.abs(room.door.y - KinkyDungeonPlayerEntity.y)) > maxPlayerDist) { + // Place a trap or something at the other door if it's far enough from the player + if (KDDebug) + console.log("Trap at " + X + "," + Y); + trapLocations.push({x: room.door.x, y: room.door.y}); + if (KDRandom() < 0.1) { + let dropped = {x:room.door.x, y:room.door.y, name: "Gold", amount: 1}; + KDMapData.GroundItems.push(dropped); + } + lock = true; + } else if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(room.door.x, room.door.y+1)) && ((grate && (!room.room || room.room.length > minLockedRoomSize)) + || (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y+1)) && Math.max(Math.abs(room.door.x - KinkyDungeonPlayerEntity.x), Math.abs(room.door.y - KinkyDungeonPlayerEntity.y)) <= maxPlayerDist)) + && room.door.y != KDMapData.StartPosition.y) { + // Place a grate instead + KinkyDungeonMapSet(room.door.x, room.door.y, 'g'); + lock = true; + } + if (lock) { + KinkyDungeonTilesGet("" + X + "," + Y).Lock = KinkyDungeonGenerateLock(true, Floor, false, "Door", {x: X, y: Y, tile: KinkyDungeonTilesGet("" + X + "," + Y)}); + KinkyDungeonMapSet(X, Y, 'D'); + } + } + break; + } + } + } + } + doorlist_2ndpass.splice(N, 1); + } + return trapLocations; +} + +function KinkyDungeonReplaceDoodads(Chance: number, barchance: number, wallRubblechance: number, wallhookchance: number, ceilinghookchance: number, width: number, height: number, altType?: any) { + + if (altType && !altType.noClutter) { + // Make it so you dont ever move through square corners + for (let X = 1; X < width - 1; X += 1) + for (let Y = 1; Y < height - 1; Y += 1) { + let tl = KinkyDungeonMapGet(X, Y); + let tr = KinkyDungeonMapGet(X+1, Y); + let bl = KinkyDungeonMapGet(X, Y+1); + let br = KinkyDungeonMapGet(X+1, Y+1); + if (tl == '1' && br == '1' && KinkyDungeonMovableTilesEnemy.includes(tr) && KinkyDungeonMovableTilesEnemy.includes(bl)) + KinkyDungeonMapSet(X, Y, 'X'); + else if (tr == '1' && bl == '1' && KinkyDungeonMovableTilesEnemy.includes(tl) && KinkyDungeonMovableTilesEnemy.includes(br)) + KinkyDungeonMapSet(X, Y+1, 'X'); + } + + for (let X = 1; X < width-1; X += 1) + for (let Y = 1; Y < height-1; Y += 1) { + if (KinkyDungeonMapGet(X, Y) == '1' && KDRandom() < barchance + && ((KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X-1, Y) == '0' && KinkyDungeonMapGet(X+1, Y) == '0') + || (KinkyDungeonMapGet(X-1, Y) == '1' && KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X, Y-1) == '0' && KinkyDungeonMapGet(X, Y+1) == '0'))) { + KinkyDungeonMapSet(X, Y, 'b'); + } else if ((KinkyDungeonMapGet(X, Y) == '2' || KinkyDungeonMapGet(X, Y) == '0') && ( + (KDRandom() < wallhookchance && KinkyDungeonMapGet(X-1, Y) == '1' && KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X+1, Y) == '0' && KinkyDungeonMapGet(X+1, Y-1) == '0' && KinkyDungeonMapGet(X+1, Y+1) == '0') + || (KDRandom() < wallhookchance && KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X-1, Y) == '0' && KinkyDungeonMapGet(X-1, Y-1) == '0' && KinkyDungeonMapGet(X-1, Y+1) == '0') + || (KDRandom() < wallhookchance && KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X, Y+1) == '0' && KinkyDungeonMapGet(X+1, Y+1) == '0' && KinkyDungeonMapGet(X-1, Y+1) == '0') + || (KDRandom() < wallhookchance && KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X, Y-1) == '0' && KinkyDungeonMapGet(X+1, Y-1) == '0' && KinkyDungeonMapGet(X-1, Y-1) == '0'))) { + KinkyDungeonMapSet(X, Y-1, ','); // Wall hook + } else if (KDRandom() < ceilinghookchance && (KinkyDungeonMapGet(X, Y) == '2' || KinkyDungeonMapGet(X, Y) == '0' && + (KinkyDungeonMapGet(X-1, Y) != '1' + && KinkyDungeonMapGet(X+1, Y) != '1' + && KinkyDungeonMapGet(X, Y-1) != '1' + && KinkyDungeonMapGet(X, Y+1) != '1' + && KinkyDungeonMapGet(X+1, Y+1) != '1' + && KinkyDungeonMapGet(X+1, Y-1) != '1' + && KinkyDungeonMapGet(X-1, Y+1) != '1' + && KinkyDungeonMapGet(X-1, Y-1) != '1' + ))) { + KinkyDungeonMapSet(X, Y, '?'); // Ceiling hook + } + } + } + + let addedCave = false; + + for (let X = 1; X < width-1; X += 1) + for (let Y = 1; Y < height-1; Y += 1) { + let category = (KDMapData.CategoryIndex ? KDGetCategoryIndex(X, Y)?.category : {}) as {category: string, tags: string[]}; + if (category?.tags?.includes("noWear")) continue; + if (KinkyDungeonMapGet(X, Y) == '1' && KDRandom() < Chance) { + KinkyDungeonMapSet(X, Y, '4'); + // Cracks then expand in a random direction twice, + // and place an exit if the initial tile is connected to nav tile + let accessible = false; + for (let x = X - 1; x <= X + 1; x++) { + for (let y = Y - 1; y <= Y + 1; y++) { + if (!!KDMapData.RandomPathablePoints[x + ',' + y]) { + accessible = true; + x = X + 2; + y = Y + 2; + // To break + } + } + } + let toExcavate: KDPoint[] = [{x: X, y: Y}]; + + let curXOld = X; + let curYOld = Y; + let lastPoint: KDPoint = null; + for (let a = 0; a < 2; a++) { + let curX = curXOld; + let curY = curYOld; + for (let i = 0; i < 7; i++) { + let xd = KDRandom() < 0.33 ? 0 : + (KDRandom() < 0.5 ? -1 : 1); + let yd = xd ? 0 : (KDRandom() < 0.5 ? -1 : 1); + curX += xd; + curY += yd; + if ((KinkyDungeonMapGet(curX, curY) == '1' + && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(curX + 1, curY)) + && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(curX - 1, curY)) + && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(curX, curY + 1)) + && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(curX, curY - 1))) + // Crakcs propagate + || KinkyDungeonMapGet(curX, curY) == '4') { + KinkyDungeonMapSet(curX, curY, '4'); + lastPoint = {x:curX, y:curY}; + toExcavate.push(lastPoint); + } else { + curX -= xd; + curY -= yd; + } + } + } + if (accessible + && lastPoint?.x > 0 + && lastPoint.y > 0 + && lastPoint.x < KDMapData.GridWidth - 2 + && lastPoint.y < KDMapData.GridHeight - 2) { + KDMapData.PotentialEntrances.push({ + Excavate: toExcavate, + PlaceScript: "Cave", + Type: "Cave", + x: lastPoint.x, + y: lastPoint.y, + }) + } + + } else + if (KinkyDungeonMapGet(X, Y) == '1' && KDRandom() < wallRubblechance && !KDMapData.TilesSkin[X + "," + Y] + && KDNearbyMapTiles(X, Y, 1.5).some((mt) => { + return KinkyDungeonGroundTiles.includes(mt.tile) + && KDMapData.RandomPathablePoints["" + mt.x + "," + mt.y]; + })) { + KinkyDungeonMapSet(X, Y, 'Y'); + KDMapData.PotentialEntrances.push({ + Excavate: [{x: X, y: Y}], + PlaceScript: "Cave", + Type: "Cave", + x: X, + y: Y, + }) + } + + } +} + + +function KinkyDungeonPlaceJailEntrances(width: number, height: number, altType?: any) { + for (let X = 1; X < width-1; X += 1) + for (let Y = 1; Y < height-1; Y += 1) { + + if (KinkyDungeonMapGet(X, Y) == '1' && !KDMapData.TilesSkin[X + "," + Y] + && !KinkyDungeonTilesGet(X + "," + Y)?.OL + && !KinkyDungeonTilesGet(X + "," + Y)?.Type) { + let allow = "14"; + let u = allow.includes(KinkyDungeonMapGet(X, Y - 1)); + let d = allow.includes(KinkyDungeonMapGet(X, Y + 1)); + let r = allow.includes(KinkyDungeonMapGet(X + 1, Y)); + let l = allow.includes(KinkyDungeonMapGet(X - 1, Y)); + let ul = allow.includes(KinkyDungeonMapGet(X - 1, Y - 1)); + let dl = allow.includes(KinkyDungeonMapGet(X - 1, Y + 1)); + let ur = allow.includes(KinkyDungeonMapGet(X + 1, Y - 1)); + let dr = allow.includes(KinkyDungeonMapGet(X + 1, Y + 1)); + + let sum = 0; + let corn = 0; + if (u) sum += 1; + if (d) sum += 1; + if (l) sum += 1; + if (r) sum += 1; + if (ul) corn += 1; + if (dl) corn += 1; + if (ur) corn += 1; + if (dr) corn += 1; + + if (sum == 3 && corn == 2) { + if ( + (!u && !ul && !ur) + || (!d && !dl && !dr) + || (!l && !ul && !dl) + || (!r && !ur && !dr) + ) { + let accessible = false; + for (let x = X - 1; x <= X + 1; x++) { + for (let y = Y - 1; y <= Y + 1; y++) { + if (!!KDMapData.RandomPathablePoints[x + ',' + y]) { + accessible = true; + x = X + 2; + y = Y + 2; + // To break + } + } + } + + if (accessible + && X > 0 + && Y > 0 + && X < KDMapData.GridWidth - 2 + && Y < KDMapData.GridHeight - 2) { + KDMapData.PotentialEntrances.push({ + Excavate: [], + PlaceScript: "Jail", + Type: "Jail", + x: X, + y: Y, + }) + } + } + } + + } + } +} + +function KinkyDungeonPlaceFurniture(barrelChance: number, cageChance: number, width: number, height: number, altType: any) { + // Add special stuff + if (!altType || !altType.noClutter) + for (let X = 1; X < width-1; X += 1) + for (let Y = 1; Y < height-1; Y += 1) { + let category = (KDMapData.CategoryIndex ? KDGetCategoryIndex(X, Y)?.category : {}) as {category: string, tags: string[]}; + if (category?.tags?.includes("noClutter")) continue; + if (KinkyDungeonMapGet(X, Y) == '0' && !(KinkyDungeonTilesGet(X + "," + Y) && (KinkyDungeonTilesGet(X + "," + Y).OL || KinkyDungeonTilesGet(X + "," + Y).Skin)) + && !(Object.values(KinkyDungeonEffectTilesGet(X + ',' + Y) || {})?.length > 0) + && (KinkyDungeonMapGet(X+1, Y) != 'd' && KinkyDungeonMapGet(X+1, Y) != 'D' + && KinkyDungeonMapGet(X-1, Y) != 'd' && KinkyDungeonMapGet(X-1, Y) != 'D' + && KinkyDungeonMapGet(X, Y+1) != 'd' && KinkyDungeonMapGet(X, Y+1) != 'D' + && KinkyDungeonMapGet(X, Y-1) != 'd' && KinkyDungeonMapGet(X, Y-1) != 'D') + && ((KDRandom() < barrelChance*4 && KinkyDungeonMapGet(X-2, Y) == '1' && KinkyDungeonMapGet(X+2, Y) == '1' && KinkyDungeonMapGet(X, Y-2) == '1' && KinkyDungeonMapGet(X, Y+2) == '1') + || (KDRandom() < barrelChance*2 && KinkyDungeonMapGet(X-1, Y-1) == '1' && KinkyDungeonMapGet(X+1, Y-1) == '1' && KinkyDungeonMapGet(X-1, Y+1) == '1' && KinkyDungeonMapGet(X-1, Y+1) == '1') + || (KDRandom() < barrelChance && KinkyDungeonMapGet(X-1, Y) == '1' && KinkyDungeonMapGet(X+1, Y) == '0' && KinkyDungeonMapGet(X+1, Y-1) == '0' && KinkyDungeonMapGet(X+1, Y+1) == '0') + || (KDRandom() < barrelChance && KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X-1, Y) == '0' && KinkyDungeonMapGet(X-1, Y-1) == '0' && KinkyDungeonMapGet(X-1, Y+1) == '0') + || (KDRandom() < barrelChance && KinkyDungeonMapGet(X, Y-1) == '1' && KinkyDungeonMapGet(X, Y+1) == '0' && KinkyDungeonMapGet(X+1, Y+1) == '0' && KinkyDungeonMapGet(X-1, Y+1) == '0') + || (KDRandom() < barrelChance && KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X, Y-1) == '0' && KinkyDungeonMapGet(X+1, Y-1) == '0' && KinkyDungeonMapGet(X-1, Y-1) == '0'))) { + KinkyDungeonMapSet(X, Y, 'L'); // Barrel + if (KDRandom() < cageChance) { + let furn = KDRandom() < (KinkyDungeonStatsChoice.get("MoreKinkyFurniture") ? 0.6 : 0.9) ? "Cage" : + (KDRandom() < 0.25 ? "LatexDisplayStand" : "DisplayStand"); + KinkyDungeonTilesSet(X + "," + Y, {Type: "Furniture", Furniture: furn}); + KDMapData.JailPoints.push({x: X, y: Y, type: "furniture", radius: 1}); // , requireFurniture: true Standing in the cage alone will prevent jailbreak--good for stealth! + } + } + } +} + +let KDFood = { + "": { + Food: "", + Weight: 10, + }, + Plate: { + Food: "Plate", + inedible: true, + Weight: 1, + }, + Cookies: { + Food: "Cookies", + Theft: "Cookie", + Weight: 8, + }, + Pizza: { + Food: "Pizza", + Weight: 4, + }, +}; + +function KinkyDungeonPlaceFood(foodChance: number, width: number, height: number, altType: any) { + + if (altType && altType.noClutter) return; + + let foodPoints = new Map(); + let foodList = []; + + + // Populate the chests + for (let X = 1; X < width; X += 1) + for (let Y = 1; Y < height; Y += 1) + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && Math.max(Math.abs(X - KDMapData.StartPosition.x), Math.abs(Y - KDMapData.StartPosition.y)) > KinkyDungeonJailLeash + && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OL)) { + // Check the 3x3 area + let wallcount = 0; + let adjcount = 0; + let diagadj = 0; + for (let XX = X-1; XX <= X+1; XX += 1) + for (let YY = Y-1; YY <= Y+1; YY += 1) { + if (!(XX == X && YY == Y) && (KinkyDungeonMapGet(XX, YY) == '1' || KinkyDungeonMapGet(XX, YY) == 'X')) { + wallcount += 1; + // Adjacent wall + if (XX == X || YY == Y) adjcount += 1; + } else if (!(XX == X && YY == Y) && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) { + if (!(XX == X || YY == Y)) {// Diagonal floor. We check the adjacent floors around the diagonals to determine if this is an alcove or a passage + if (XX == X + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X + 1, Y))) diagadj += 1; + else if (XX == X - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X - 1, Y))) diagadj += 1; + else if (YY == Y + 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y + 1))) diagadj += 1; + else if (YY == Y - 1 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y - 1))) diagadj += 1; + } + } + } + + if (wallcount == 7 + || (wallcount >= 4 && (wallcount - adjcount - diagadj == 0 || (wallcount == 5 && adjcount == 2 && diagadj == 1) || (wallcount == 6 && adjcount == 3 && diagadj == 1)) + && (KinkyDungeonMapGet(X+1, Y) == '1' || KinkyDungeonMapGet(X-1, Y) == '1') + && (KinkyDungeonMapGet(X, Y+1) == '1' || KinkyDungeonMapGet(X, Y-1) == '1') + && (!(KinkyDungeonMapGet(X+1, Y) == '1' && KinkyDungeonMapGet(X-1, Y) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)) + && (!(KinkyDungeonMapGet(X, Y+1) == '1' && KinkyDungeonMapGet(X, Y-1) == '1') || (wallcount == 6 && adjcount == 3 && diagadj == 1)))) { + if (!foodPoints.get((X+1) + "," + (Y)) + && !foodPoints.get((X-1) + "," + (Y)) + && !foodPoints.get((X+1) + "," + (Y+1)) + && !foodPoints.get((X+1) + "," + (Y-1)) + && !foodPoints.get((X-1) + "," + (Y+1)) + && !foodPoints.get((X-1) + "," + (Y-1)) + && !foodPoints.get((X) + "," + (Y+1)) + && !foodPoints.get((X) + "," + (Y-1)) + && !(Object.keys(KDGetEffectTiles(X, Y)).length > 0) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y-1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X-1, Y+1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X, Y+1)) + && !KDRandomDisallowedNeighbors.includes(KinkyDungeonMapGet(X+1, Y+1))) { + foodList.push({x:X, y:Y, boringness: KinkyDungeonBoringGet(X, Y), priority: 0}); + foodPoints.set(X + "," + Y, true); + } + } + + + }// else if (KinkyDungeonMapGet(X, Y) == "R" || KinkyDungeonMapGet(X, Y) == "r") + //foodList.push({x:X, y:Y}); + + // Truncate down to max chest count in a location-neutral way + let count = 0; + let list = []; + let maxBoringness = Math.max(...KDMapExtraData.Boringness); + while (foodList.length > 0) { + let N = Math.floor(KDRandom()*foodList.length); + let chest = foodList[N]; + if (!chest.boringness) chest.boringness = KinkyDungeonBoringGet(chest.x, chest.y); + if (chest.boringness > 0) + chest.boringness = chest.boringness + (0.05 + 0.1 * KDRandom()) * maxBoringness; + else + chest.boringness = chest.boringness + 0.05 * KDRandom() * maxBoringness; + if (chest.priority) { + list.unshift(chest); + } else list.push(chest); + + foodList.splice(N, 1); + } + list.sort((a, b) => { + let boringa = a.boringness ? a.boringness : 0; + let boringb = b.boringness ? b.boringness : 0; + if (a.priority) boringa += 1000; + if (b.priority) boringb += 1000; + return boringb - boringa; + + }); + let foodcount = list.length * foodChance; + while (list.length > 0) { + let N = 0; + if (count <= foodcount) { + + let shrine = list[N]; + let tile = 'F'; + let type = undefined; + + let WeightTotal = 0; + let Weights = []; + + for (let obj of Object.values(KDFood)) { + Weights.push({event: obj, weight: WeightTotal}); + WeightTotal += obj.Weight; + } + + let selection = KDRandom() * WeightTotal; + + for (let L = Weights.length - 1; L >= 0; L--) { + if (selection > Weights[L].weight) { + type = Weights[L].event.Food; + break; + } + } + + KinkyDungeonTilesSet("" + shrine.x + "," +shrine.y, {Food: type, Type: "Food"}); + + KinkyDungeonMapSet(shrine.x, shrine.y, tile); + + count += 1; + } + list.splice(N, 1); + } +} + +function KinkyDungeonPlaceTorches(torchchance: number, torchlitchance: number, torchchanceboring: number, width: number, height: number, _altType: any, torchreplace: any) { + for (let X = 1; X < width-1; X += 1) + for (let Y = 1; Y < height-1; Y += 1) { + if (KinkyDungeonMapGet(X, Y) == '1' + && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(X, Y + 1)) + && !KinkyDungeonEffectTilesGet((X - 1) + "," + (Y+1)) + && !KinkyDungeonEffectTilesGet((X) + "," + (Y+1)) + && !KinkyDungeonEffectTilesGet((X + 1) + "," + (Y+1)) + && !KinkyDungeonTilesGet((X - 1) + "," + (Y+1)) + && !KinkyDungeonTilesGet((X) + "," + (Y+1)) + && !KinkyDungeonTilesGet((X + 1) + "," + (Y+1)) + && !KinkyDungeonTilesGet((X) + "," + (Y)) + && KDRandom() < torchchance + KinkyDungeonBoringGet(X, Y) * torchchanceboring) { + let spr = torchreplace ? torchreplace.sprite : "Torch"; + if ((!torchreplace || torchreplace.unlitsprite) && KDRandom() > torchlitchance) { + spr = torchreplace ? torchreplace.unlitsprite : "TorchUnlit"; + } + let torchref = { + name: spr, + duration: 9999, infinite: true, + }; + KDCreateEffectTile(X, Y + 1, torchref, 0); + } + } +} + +/** + * Replace vertical wall '1' with '|' + * @param width + * @param height + */ +function KinkyDungeonReplaceVert(width: number, height: number) { + for (let X = 0; X <= width-1; X += 1) + for (let Y = 0; Y <= height-1; Y += 1) { + let tileUp = KinkyDungeonMapGet(X, Y); + let tileBelow = KinkyDungeonMapGet(X, Y + 1); + if ( + ( // These are the tiles that get replaced + tileUp == '1' + || tileUp == '4' + ) && ( // These are the tiles that trigger a replacement + tileBelow == '1' + || tileBelow == '4' + || tileBelow == 'd' + || tileBelow == 'D' + || tileBelow == ',' + )) { + // meep + } + //if (tileUp == '4') + //KinkyDungeonMapSetForce(X, Y, '\\'); + //else + //KinkyDungeonMapSetForce(X, Y, '|'); + } +} + + +/* TODO: Work out/create the proper types for these. */ +function KinkyDungeonMazeWalls(Cell: any, Walls: GridEntry, WallsList: GridEntry) { + if (Walls[(Cell.x+1) + "," + Cell.y]) WallsList[(Cell.x+1) + "," + Cell.y] = {x:Cell.x+1, y:Cell.y}; + if (Walls[(Cell.x-1) + "," + Cell.y]) WallsList[(Cell.x-1) + "," + Cell.y] = {x:Cell.x-1, y:Cell.y}; + if (Walls[Cell.x + "," + (Cell.y+1)]) WallsList[Cell.x + "," + (Cell.y+1)] = {x:Cell.x, y:Cell.y+1}; + if (Walls[Cell.x + "," + (Cell.y-1)]) WallsList[Cell.x + "," + (Cell.y-1)] = {x:Cell.x, y:Cell.y-1}; +} + +/** + * @param X + * @param Y + * @param SetTo + * @param [VisitedRooms] + */ +function KinkyDungeonMapSet(X: number, Y: number, SetTo: string, VisitedRooms?: any[]): boolean { + let height = KDMapData.GridHeight; + let width = KDMapData.GridWidth; + + if (X > 0 && X < width-1 && Y > 0 && Y < height-1) { + KDMapData.Grid = KDMapData.Grid.replaceAt(X + Y*(width+1), SetTo); + if (VisitedRooms) + VisitedRooms.push({x: X, y: Y}); + return true; + } + return false; +} +function KinkyDungeonMapSetForce(X: number, Y: number, SetTo: string, VisitedRooms?: any[]): boolean { + let width = KDMapData.GridWidth; + + KDMapData.Grid = KDMapData.Grid.replaceAt(X + Y*(width+1), SetTo); + if (VisitedRooms) + VisitedRooms.push({x: X, y: Y}); + return true; + +} + + +/** + * @param data + * @param X + * @param Y + * @param SetTo + */ +function KinkyDungeonMapDataSet(data: KDMapDataType, X: number, Y: number, SetTo: string): boolean { + let height = data.GridHeight; + let width = data.GridWidth; + + if (X > 0 && X < width-1 && Y > 0 && Y < height-1) { + data.Grid = data.Grid.replaceAt(X + Y*(width+1), SetTo); + return true; + } + return false; +} + +function KinkyDungeonBoringGet(X: number, Y: number): number { + return KDMapExtraData.Boringness[X + Y*(KDMapData.GridWidth)]; +} + +function KinkyDungeonBoringSet(X: number, Y: number, SetTo: number) { + if (X >= 0 && X <= KDMapData.GridWidth-1 && Y >= 0 && Y <= KDMapData.GridHeight-1) { + KDMapExtraData.Boringness[X + Y*(KDMapData.GridWidth)] = SetTo; + return true; + } + return false; +} + +/** + * @param X + * @param Y + */ +function KinkyDungeonMapGet(X: number, Y: number): string { + //let height = KDMapData.Grid.split('\n').length; + //let width = //KDMapData.Grid.split('\n')[0].length; + + return KDMapData.Grid[X + Y*(KDMapData.GridWidth+1)]; +} + +/** + * @param data + * @param X + * @param Y + */ +function KinkyDungeonMapDataGet(data: KDMapDataType, X: number, Y: number): string { + return data.Grid[X + Y*(data.GridWidth+1)]; +} + +function KinkyDungeonVisionSet(X: number, Y: number, SetTo: number): boolean { + if (X >= 0 && X <= KDMapData.GridWidth-1 && Y >= 0 && Y <= KDMapData.GridHeight-1) { + KDMapExtraData.VisionGrid[X + Y*(KDMapData.GridWidth)] = SetTo; + return true; + } + return false; +} + +function KinkyDungeonBrightnessSet(X: number, Y: number, SetTo: number, monotonic?: boolean): boolean { + if (X >= 0 && X <= KDMapData.GridWidth-1 && Y >= 0 && Y <= KDMapData.GridHeight-1) { + if (!monotonic || SetTo > KDMapExtraData.BrightnessGrid[X + Y*(KDMapData.GridWidth)]) + KDMapExtraData.BrightnessGrid[X + Y*(KDMapData.GridWidth)] = SetTo; + return true; + } + return false; +} + +function KinkyDungeonColorSet(X: number, Y: number, SetTo: number, monotonic?: boolean): boolean { + if (X >= 0 && X <= KDMapData.GridWidth-1 && Y >= 0 && Y <= KDMapData.GridHeight-1) { + if (!monotonic || SetTo > KDMapExtraData.ColorGrid[X + Y*(KDMapData.GridWidth)]) + KDMapExtraData.ColorGrid[X + Y*(KDMapData.GridWidth)] = SetTo; + return true; + } + return false; +} +function KinkyDungeonShadowSet(X: number, Y: number, SetTo: number, monotonic?: boolean): boolean { + if (X >= 0 && X <= KDMapData.GridWidth-1 && Y >= 0 && Y <= KDMapData.GridHeight-1) { + if (!monotonic || SetTo > KDMapExtraData.ShadowGrid[X + Y*(KDMapData.GridWidth)]) + KDMapExtraData.ShadowGrid[X + Y*(KDMapData.GridWidth)] = SetTo; + return true; + } + return false; +} + +function KinkyDungeonVisionGet(X: number, Y: number): number { + return KDMapExtraData.VisionGrid[X + Y*(KDMapData.GridWidth)]; +} + +function KinkyDungeonBrightnessGet(X: number, Y: number): number { + return KDMapExtraData.BrightnessGrid[X + Y*(KDMapData.GridWidth)]; +} +function KinkyDungeonColorGet(X: number, Y: number): number { + return KDMapExtraData.ColorGrid[X + Y*(KDMapData.GridWidth)]; +} +function KinkyDungeonShadowGet(X: number, Y: number): number { + return KDMapExtraData.ShadowGrid[X + Y*(KDMapData.GridWidth)]; +} + +function KinkyDungeonFogGet(X: number, Y: number): any { + return KDMapData.FogGrid[X + Y*(KDMapData.GridWidth)]; +} +function KinkyDungeonFogSet(X: number, Y: number, val: number): any { + KDMapData.FogGrid[X + Y*(KDMapData.GridWidth)] = val; +} +function KinkyDungeonFogMemoryGet(X: number, Y: number): any { + return KDMapData.FogMemory[X + Y*(KDMapData.GridWidth)]; +} +function KinkyDungeonFogMemorySet(X: number, Y: number, val: number): any { + KDMapData.FogMemory[X + Y*(KDMapData.GridWidth)] = val; +} + +let canvasOffsetX = 0; +let canvasOffsetY = 0; +const canvasOffsetX_ui = 500; +const canvasOffsetY_ui = 164; + +interface MoveDirection { + x: number, + y: number, + delta: number, +} + +// returns an object containing coordinates of which direction the player will move after a click, plus a time multiplier +function KinkyDungeonGetDirection(dx: number, dy: number): MoveDirection { + + let X = 0; + let Y = 0; + + if (Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5) + return {x:0, y:0, delta:1}; + + // Cardinal directions first - up down left right + if (dy > 0 && Math.abs(dx) < Math.abs(dy)/2.61312593) Y = 1; + else if (dy < 0 && Math.abs(dx) < Math.abs(dy)/2.61312593) Y = -1; + else if (dx > 0 && Math.abs(dy) < Math.abs(dx)/2.61312593) X = 1; + else if (dx < 0 && Math.abs(dy) < Math.abs(dx)/2.61312593) X = -1; + + // Diagonals + else if (dy > 0 && dx > dy/2.61312593) {Y = 1; X = 1;} + else if (dy > 0 && -dx > dy/2.61312593) {Y = 1; X = -1;} + else if (dy < 0 && dx > -dy/2.61312593) {Y = -1; X = 1;} + else if (dy < 0 && -dx > -dy/2.61312593) {Y = -1; X = -1;} + + return {x:X, y:Y, delta:Math.round(Math.sqrt(X*X+Y*Y)*2)/2}; // Delta is always in increments of 0.5 +} + +// GetDirection, but it also pivots randomly 45 degrees to either side +function KinkyDungeonGetDirectionRandom(dx: number, dy: number) { + let dir = KinkyDungeonGetDirection(dx, dy); + let pivot = Math.floor(KDRandom()*3)-1; + + if (dir.x == 0 && dir.y == 1) dir.x = pivot; + else if (dir.x == 0 && dir.y == -1) dir.x = -pivot; + else if (dir.x == 1 && dir.y == 0) dir.y = pivot; + else if (dir.x == -1 && dir.y == 0) dir.y = -pivot; + else if (dir.x == 1 && dir.y == 1) {if (pivot == 1) {dir.y = 0;} else if (pivot == -1) {dir.x = 0;}} + else if (dir.x == 1 && dir.y == -1) {if (pivot == 1) {dir.x = 0;} else if (pivot == -1) {dir.y = 0;}} + else if (dir.x == -1 && dir.y == 1) {if (pivot == 1) {dir.x = 0;} else if (pivot == -1) {dir.y = 0;}} + else if (dir.x == -1 && dir.y == -1) {if (pivot == 1) {dir.y = 0;} else if (pivot == -1) {dir.x = 0;}} + + dir.delta = Math.round(Math.sqrt(dir.x*dir.x+dir.y*dir.y)*2)/2; + return dir; // Delta is always in increments of 0.5 +} + + +let KinkyDungeonAutoWaitSuppress = false; + +function KinkyDungeonControlsEnabled() { + return !KinkyDungeonInspect && KDGameData.SlowMoveTurns < 1 && KinkyDungeonStatFreeze < 1 && KDGameData.SleepTurns < 1 && !KDGameData.CurrentDialog && !KinkyDungeonMessageToggle; +} + +function KDStartSpellcast(tx: number, ty: number, SpellToCast: spell, enemy: any, player: any, bullet: any, data: any) { + let spell = KinkyDungeonFindSpell(SpellToCast.name, true); + let spellname = undefined; + if (spell) { + spellname = spell.name; + spell = undefined; + } else spell = SpellToCast; + return KDSendInput("tryCastSpell", {tx: tx, ty: ty, spell: spell, spellname: spellname, enemy: enemy, player: player, bullet: bullet, ...data}); +} + +// Click function for the game portion +function KinkyDungeonClickGame(_Level?: number) { + let _CharacterRefresh = CharacterRefresh; + let _CharacterAppearanceBuildCanvas = CharacterAppearanceBuildCanvas; + CharacterRefresh = () => {KDRefresh = true;}; + CharacterAppearanceBuildCanvas = () => {}; + + // First we handle buttons + let prevSpell = KinkyDungeonTargetingSpell; + let prevInv = (KinkyDungeonShowInventory && !KinkyDungeonTargetingSpell); + if (KDGameData.CurrentDialog) { + let result = false; + try { + result = KDHandleDialogue(); + } finally { + CharacterRefresh = _CharacterRefresh; + CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; + // Done, converted to input + } + return result; + } + if (KinkyDungeonControlsEnabled() && KinkyDungeonHandleHUD()) { + try { + if (prevSpell) { + if (prevInv) KDCloseQuickInv(); + else { + KinkyDungeonTargetingSpell = null; + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + } + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + KinkyDungeonGameKey.keyPressed = [ + false, + false, + false, + false, + false, + false, + false, + false, + ]; + if (KinkyDungeonAutoWaitSuppress) KinkyDungeonAutoWaitSuppress = false; + else if (KDIsAutoAction()) { + KDDisableAutoWait(); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Damage.ogg"); + } + } finally { + CharacterRefresh = _CharacterRefresh; + CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; + } + + return; + } + // beep + else if (KDIsAutoAction() && MouseIn(canvasOffsetX, canvasOffsetY, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height)) { + KDDisableAutoWait(); + + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Damage.ogg"); + } + else if (KDFocusControls) { + KDSetFocusControl(""); + } + // If no buttons are clicked then we handle move + else if ((KinkyDungeonControlsEnabled() || KinkyDungeonInspect) && KinkyDungeonDrawState == "Game") { + //KDSetFocusControl(""); + try { + if (KinkyDungeonInspect) { + KDInspectCamera.x = KinkyDungeonTargetX; + KDInspectCamera.y = KinkyDungeonTargetY; + KDInspectCamera.x = Math.max(-KinkyDungeonGridWidthDisplay, Math.min(KDInspectCamera.x, KDMapData.GridWidth)); + KDInspectCamera.y = Math.max(-KinkyDungeonGridHeightDisplay, Math.min(KDInspectCamera.y, KDMapData.GridHeight)); + KinkyDungeonLastMoveTimer = performance.now() + KinkyDungeonLastMoveTimerCooldown/2; + KDLastForceRefresh = CommonTime() - KDLastForceRefreshInterval - 10; + KinkyDungeonUpdateLightGrid = true; // Rerender since cam moved + } else if (KDInteracting) { + KDSendInput("interact", {x: KinkyDungeonTargetX, y: KinkyDungeonTargetY}); + } else if (KDModalArea || KinkyDungeonTargetTile) { + KDModalArea = false; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + } else { + KinkyDungeonSetMoveDirection(); + + if (KinkyDungeonTargetingSpell) { + if (KDMouseInPlayableArea()) { + //if (KinkyDungeoCheckComponents(KinkyDungeonTargetingSpell).length == 0) { + if (KinkyDungeonSpellValid) { + KDStartSpellcast(KinkyDungeonTargetX, KinkyDungeonTargetY, KinkyDungeonTargetingSpell, undefined, KinkyDungeonPlayerEntity, undefined, {targetingSpellItem: KinkyDungeonTargetingSpellItem, targetingSpellWeapon: KinkyDungeonTargetingSpellWeapon}); + + KinkyDungeonTargetingSpell = null; + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + } + /*} else { + KinkyDungeonTargetingSpell = null; + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + }*/ + } else { + KinkyDungeonTargetingSpell = null; + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + } + } else if (KinkyDungeonIsPlayer() && KDMouseInPlayableArea()) { + let fastMove = KinkyDungeonFastMove && !KinkyDungeonToggleAutoSprint; + if (fastMove && KDistChebyshev(KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x, KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y) > 0.5 + && (KinkyDungeonVisionGet(KinkyDungeonTargetX, KinkyDungeonTargetY) > 0 + || KinkyDungeonFogGet(KinkyDungeonTargetX, KinkyDungeonTargetY) > 0 + || KDistChebyshev(KinkyDungeonPlayerEntity.x - KinkyDungeonTargetX, KinkyDungeonPlayerEntity.y - KinkyDungeonTargetY) < 1.5)) { + let requireLight = KinkyDungeonVisionGet(KinkyDungeonTargetX, KinkyDungeonTargetY) > 0; + let path = KinkyDungeonFindPath(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonTargetX, KinkyDungeonTargetY, + true, false, false, KinkyDungeonMovableTilesEnemy, requireLight, false, true, + undefined, false, undefined, false, true); + if (path) { + KDSetFocusControl(""); + KinkyDungeonFastMovePath = path; + KinkyDungeonSleepTime = 100; + KinkyDungeonSetFlag("startPath", 1); + } else if (KDistChebyshev(KinkyDungeonPlayerEntity.x - KinkyDungeonTargetX, KinkyDungeonPlayerEntity.y - KinkyDungeonTargetY) < 1.5) { + KDSetFocusControl(""); + KDSendInput("move", {dir: KinkyDungeonMoveDirection, delta: 1, AllowInteract: true, AutoDoor: false, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}); + } + } else if (!fastMove || Math.max(Math.abs(KinkyDungeonTargetX - KinkyDungeonPlayerEntity.x), Math.abs(KinkyDungeonTargetY - KinkyDungeonPlayerEntity.y)) <= 1) { + KDSetFocusControl(""); + KDSendInput("move", {dir: KinkyDungeonMoveDirection, delta: 1, AllowInteract: true, AutoDoor: false, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}); + } + } + } + } finally { + CharacterRefresh = _CharacterRefresh; + CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; + } + } + + CharacterRefresh = _CharacterRefresh; + CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; + return; +} + +function KinkyDungeonGetMovable() { + let MovableTiles = KinkyDungeonMovableTiles; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Squeeze") > 0) MovableTiles = MovableTiles + "b"; + return MovableTiles; +} + +function KinkyDungeonListenKeyMove() { + if ((document.activeElement && KDFocusableTextFields.includes(document.activeElement.id))) return true; + + if (KinkyDungeonLastMoveTimer < performance.now() && (KinkyDungeonControlsEnabled() || KinkyDungeonInspect) + && KinkyDungeonDrawState == "Game" && !KDModalArea) { + let moveDirection = null; + let moveDirectionDiag = null; + + let MovableTiles = KinkyDungeonGetMovable(); + let itemsAtTile = (x: number, y: number) => { + return KDMapData.GroundItems.some((item) => {return item.x == KinkyDungeonPlayerEntity.x + x && item.y == KinkyDungeonPlayerEntity.y + y;}); + }; + + if ((KinkyDungeonGameKey.keyPressed[0]) && (KinkyDungeonInspect || itemsAtTile(0, -1) || MovableTiles.includes(KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y - 1)))) moveDirection = KinkyDungeonGetDirection(0, -1); + else if ((KinkyDungeonGameKey.keyPressed[1]) && (KinkyDungeonInspect || itemsAtTile(0, +1) || MovableTiles.includes(KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y + 1)))) moveDirection = KinkyDungeonGetDirection(0, 1); + else if ((KinkyDungeonGameKey.keyPressed[2]) && (KinkyDungeonInspect || itemsAtTile(-1, 0) || MovableTiles.includes(KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x - 1, KinkyDungeonPlayerEntity.y)))) moveDirection = KinkyDungeonGetDirection(-1, 0); + else if ((KinkyDungeonGameKey.keyPressed[3]) && (KinkyDungeonInspect || itemsAtTile(+1, 0) || MovableTiles.includes(KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x + 1, KinkyDungeonPlayerEntity.y)))) moveDirection = KinkyDungeonGetDirection(1, 0); + // Diagonal moves + if ((KinkyDungeonGameKey.keyPressed[4]) || (KinkyDungeonGameKey.keyPressed[2] && KinkyDungeonGameKey.keyPressed[0])) moveDirectionDiag = KinkyDungeonGetDirection(-1, -1); + else if ((KinkyDungeonGameKey.keyPressed[5]) || (KinkyDungeonGameKey.keyPressed[3] && KinkyDungeonGameKey.keyPressed[0])) moveDirectionDiag = KinkyDungeonGetDirection(1, -1); + else if ((KinkyDungeonGameKey.keyPressed[6]) || (KinkyDungeonGameKey.keyPressed[2] && KinkyDungeonGameKey.keyPressed[1])) moveDirectionDiag = KinkyDungeonGetDirection(-1, 1); + else if ((KinkyDungeonGameKey.keyPressed[7]) || (KinkyDungeonGameKey.keyPressed[3] && KinkyDungeonGameKey.keyPressed[1])) moveDirectionDiag = KinkyDungeonGetDirection(1, 1); + + if ((KinkyDungeonGameKey.keyPressed[8])) {moveDirection = KinkyDungeonGetDirection(0, 0); moveDirectionDiag = null;} + + if (moveDirectionDiag && (KinkyDungeonInspect || itemsAtTile(moveDirectionDiag.x, moveDirectionDiag.y) || MovableTiles.includes(KinkyDungeonMapGet(moveDirectionDiag.x + KinkyDungeonPlayerEntity.x, moveDirectionDiag.y + KinkyDungeonPlayerEntity.y)))) { + moveDirection = moveDirectionDiag; + } + + if (moveDirection) { + if (KinkyDungeonLastMoveTimerStart < performance.now() && KinkyDungeonLastMoveTimerStart > 0) { + + if (KinkyDungeonInspect) { + KDInspectCamera.x += moveDirection.x; + KDInspectCamera.y += moveDirection.y; + KDInspectCamera.x = Math.max(-KinkyDungeonGridWidthDisplay, Math.min(KDInspectCamera.x, KDMapData.GridWidth)); + KDInspectCamera.y = Math.max(-KinkyDungeonGridHeightDisplay, Math.min(KDInspectCamera.y, KDMapData.GridHeight)); + KinkyDungeonLastMoveTimer = performance.now() + KinkyDungeonLastMoveTimerCooldown/2; + KDLastForceRefresh = CommonTime() - KDLastForceRefreshInterval - 10; + KinkyDungeonUpdateLightGrid = true; // Rerender since cam moved + } else if (KDInteracting) { + KDSendInput("interact", {x: KDPlayer().x + moveDirection.x, y: KDPlayer().y + moveDirection.y}); + } else { + let _CharacterRefresh = CharacterRefresh; + let _CharacterAppearanceBuildCanvas = CharacterAppearanceBuildCanvas; + CharacterRefresh = () => {KDRefresh = true;}; + CharacterAppearanceBuildCanvas = () => {}; + + try { + KDSetFocusControl(""); + KDSendInput("move", {dir: moveDirection, delta: 1, AllowInteract: KinkyDungeonLastMoveTimer == 0, AutoDoor: false, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: false}); + KinkyDungeonLastMoveTimer = performance.now() + KinkyDungeonLastMoveTimerCooldown; + } finally { + CharacterRefresh = _CharacterRefresh; + CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; + } + } + + } else if (KinkyDungeonLastMoveTimerStart == 0) { + KinkyDungeonLastMoveTimerStart = performance.now()+ KinkyDungeonLastMoveTimerCooldownStart; + } + + + } + } + if (KinkyDungeonLastMoveTimerStart < performance.now() && KinkyDungeonLastMoveTimer == 0) KinkyDungeonLastMoveTimerStart = 0; + if (!KinkyDungeonGameKey.keyPressed.some((element: any)=>{return element;})) { KinkyDungeonLastMoveTimer = 0;} + //KDSetFocusControl(""); +} + +let KDShopBuyConfirm = false; + +function KDEnter() { + if (KDRenameNPC) { + KDRenameNPC = false; + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "LockLight" + ".ogg"); + + } +} +function KinkyDungeonGameKeyDown() { + let moveDirection = null; + + if (KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey + && document.activeElement && KDFocusableTextFields.includes(document.activeElement.id)) { + // @ts-ignore + document.activeElement.blur(); + KDEnter(); + } + if ((document.activeElement && KDFocusableTextFields.includes(document.activeElement.id))) return true; + + for (let b of Object.entries(KDButtonsCache)) { + if (b[1].hotkeyPress == KinkyDungeonKeybindingCurrentKey) { + KDClickButton(b[0]); + return true; + } + } + + for (let keybinding of Object.values(KDKeyCheckers)) { + if (keybinding()) return true; + } + KDShopBuyConfirm = false; + + if (KinkyDungeonState == "TileEditor") { + if (KinkyDungeonKey[0] == KinkyDungeonKeybindingCurrentKey) { + KDClickButton("maptileU"); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } else if (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey) { + KDClickButton("maptileL"); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } else if (KinkyDungeonKey[2] == KinkyDungeonKeybindingCurrentKey) { + KDClickButton("maptileD"); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } else if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey) { + KDClickButton("maptileR"); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } + } + + if (KDGameData.CurrentDialog) return; + if (!KinkyDungeonControlsEnabled()) return; + + + if (moveDirection && KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game") { + KDSendInput("move", {dir: moveDirection, delta: 1, AutoDoor: false, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: false}); + return true; + } else if (KinkyDungeonKeySpell.includes(KinkyDungeonKeybindingCurrentKey)) { + if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Magic") { + if (KinkyDungeonSpellChoices.includes(KinkyDungeonCurrentPage)) { + KDSendInput("spellRemove", {I:KinkyDungeonSpellChoices.indexOf(KinkyDungeonCurrentPage)}); + } + KinkyDungeonClickSpellChoice(KinkyDungeonKeySpell.indexOf(KinkyDungeonKeybindingCurrentKey), KinkyDungeonCurrentPage); + } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game") { + KinkyDungeonSpellPress = KinkyDungeonKeybindingCurrentKey; + KinkyDungeonHandleSpell(); + } + return true; + } else if (KinkyDungeonKeySpellConfig.includes(KinkyDungeonKeybindingCurrentKey)) { + if (KinkyDungeonState == "Game") { + let index = 1 + KinkyDungeonKeySpellConfig.indexOf(KinkyDungeonKeybindingCurrentKey); + if (localStorage.getItem('KinkyDungeonSpellsChoice' + String (index))) { + KinkyDungeonSpellsConfig = String (index); + KinkyDungeonLoadSpellsConfig(); + } + } + } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonKeyWeapon.includes(KinkyDungeonKeybindingCurrentKey)) { + KinkyDungeonSpellPress = KinkyDungeonKeybindingCurrentKey; + KinkyDungeonRangedAttack(); + return true; + } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonKeyUpcast.includes(KinkyDungeonKeybindingCurrentKey)) { + if (KinkyDungeonKeybindingCurrentKey == KinkyDungeonKeyUpcast[0]) { + KDSendInput("upcast", {}); + } else { + KDSendInput("upcastcancel", {}); + } + return true; + } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonKeySprint.includes(KinkyDungeonKeybindingCurrentKey)) { + KinkyDungeonToggleAutoSprint = !KinkyDungeonToggleAutoSprint; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonKeySwitchWeapon.includes(KinkyDungeonKeybindingCurrentKey)) { + KDSwitchWeapon(); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } else if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonKeySwitchLoadout.includes(KinkyDungeonKeybindingCurrentKey)) { + let i = 1 + KinkyDungeonKeySwitchLoadout.indexOf(KinkyDungeonKeybindingCurrentKey); + // Load the loadout + KDGameData.CurrentLoadout = i; + KDLoadQuickLoadout(i, true); + + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } else if (KinkyDungeonState == "Stats") { + if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey) { + KDClickButton("perks>"); + } else if (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey) { + KDClickButton("perks<"); + } + } else if (KinkyDungeonDrawState != "Restart" && KinkyDungeonDrawState != "Keybindings" && KinkyDungeonDrawState != "Perks2") { + if (KinkyDungeonDrawState == "Inventory" && (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKeySkip[0] == KinkyDungeonKeybindingCurrentKey)) { + if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey) { + KinkyDungeonCurrentPageInventory += 1; + } else if (KinkyDungeonCurrentPageInventory > 0) { + KinkyDungeonCurrentPageInventory -= 1; + } else if (KinkyDungeonKeySkip[0] == KinkyDungeonKeybindingCurrentKey) { + KinkyDungeonDrawState = "Game"; + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + } + } else if (KinkyDungeonDrawState == "Magic" && (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey)) { + if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey) { + KinkyDungeonCurrentPage += 1; + if (KinkyDungeonCurrentPage >= KinkyDungeonSpells.length) { + KinkyDungeonCurrentPage = 0; + } + } else if (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey && KinkyDungeonCurrentPage >= 0) { + KinkyDungeonCurrentPage -= 1; + if (KinkyDungeonCurrentPage < 0) { + KinkyDungeonCurrentPage = KinkyDungeonSpells.length - 1; + } + } else if (KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey) { + if (KinkyDungeonPreviewSpell) { + if (KinkyDungeonPreviewSpell.hideLearned) KinkyDungeonDrawState = "MagicSpells"; + KDSendInput("spellLearn", {SpellName: KinkyDungeonPreviewSpell.name}); + } + else KinkyDungeonDrawState = "MagicSpells"; + } + } else if ((KinkyDungeonDrawState == "Collection" || KinkyDungeonDrawState == "Bondage") + && (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey)) { + if (!KDGameData.CollectionSorted) {KDSortCollection();} + let index = KDGameData.CollectionSorted.findIndex((entry) => {return entry.id == (KDCollectionSelected || -1);}); + if (index > -1) { + if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey) { + index += 1; + if (index >= KDGameData.CollectionSorted.length) { + index = 0; + } + } else if (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey && KinkyDungeonCurrentPage >= 0) { + index -= 1; + if (index < 0 ) { + index = KDGameData.CollectionSorted.length - 1; + } + } + if (index > -1 && KDGameData.CollectionSorted[index]) { + KDCollectionSelected = KDGameData.CollectionSorted[index].id; + KDResetCollectionUI(); + index = KDGameData.CollectionSorted.findIndex((entry) => {return entry.id == (KDCollectionSelected || -1);}); + while (index >= KDCollectionIndex + KDCollectionColumns*KDCollectionRows) { + KDCollectionIndex += KDCollectionColumns; + } + while (index < KDCollectionIndex) { + KDCollectionIndex -= KDCollectionColumns; + } + + } + } + + } else if (KinkyDungeonDrawState == "MagicSpells" + && (KinkyDungeonKey[0] == KinkyDungeonKeybindingCurrentKey + || KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey + || KinkyDungeonKey[2] == KinkyDungeonKeybindingCurrentKey + || KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey + || KinkyDungeonKeySkip[0] == KinkyDungeonKeybindingCurrentKey)) { + if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey) { + KinkyDungeonCurrentSpellsPage += 1; + if (KinkyDungeonCurrentSpellsPage >= KinkyDungeonLearnableSpells.length) KinkyDungeonCurrentSpellsPage = 0; + } else if (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey && KinkyDungeonCurrentSpellsPage >= 0) { + KinkyDungeonCurrentSpellsPage -= 1; + if (KinkyDungeonCurrentSpellsPage < 0) KinkyDungeonCurrentSpellsPage = KinkyDungeonLearnableSpells.length - 1; + } else if (KinkyDungeonKey[0] == KinkyDungeonKeybindingCurrentKey) { + KDClickButton("spellsUp"); + } else if (KinkyDungeonKey[2] == KinkyDungeonKeybindingCurrentKey) { + KDClickButton("spellsDown"); + } + else if (KinkyDungeonKeySkip[0] == KinkyDungeonKeybindingCurrentKey) { + KinkyDungeonDrawState = "Game"; + + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + } + } else + if (KinkyDungeonKeyMenu.includes(KinkyDungeonKeybindingCurrentKey)) { + switch (KinkyDungeonKeybindingCurrentKey) { + // QuikInv, Inventory, Reputation, Magic, Log + case KinkyDungeonKeyMenu[0]: KinkyDungeonShowInventory = !KinkyDungeonShowInventory; break; + case KinkyDungeonKeyMenu[1]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Inventory" ? "Game" : "Inventory"; break; + case KinkyDungeonKeyMenu[2]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Reputation" ? "Game" : "Reputation"; break; + case KinkyDungeonKeyMenu[3]: KinkyDungeonDrawState = KinkyDungeonDrawState == "MagicSpells" ? "Game" : "MagicSpells"; break; + case KinkyDungeonKeyMenu[4]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Logbook" ? "Game" : "Logbook"; break; + case KinkyDungeonKeyMenu[5]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Quest" ? "Game" : "Quest"; break; + case KinkyDungeonKeyMenu[6]: KinkyDungeonDrawState = (KinkyDungeonDrawState == "Collection" || KinkyDungeonDrawState == "Bondage") ? "Game" : "Collection"; break; + case KinkyDungeonKeyMenu[7]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Facilities" ? "Game" : "Facilities"; break; + case KinkyDungeonKeyMenu[9]: KinkyDungeonDrawState = KinkyDungeonDrawState == "JourneyMap" ? "Game" : "JourneyMap"; break; + case KinkyDungeonKeyMenu[8]: KinkyDungeonDrawState = "Restart"; break; + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } + } else if (KinkyDungeonDrawState == "Restart" + + && !( + // @ts-ignore + (CommonIsMobile || document.activeElement?.type == "text" || document.activeElement?.type == "textarea") + ) + ) { + if (KinkyDungeonKeyMenu.includes(KinkyDungeonKeybindingCurrentKey)) { + switch (KinkyDungeonKeybindingCurrentKey) { + // QuikInv, Inventory, Reputation, Magic, Log + case KinkyDungeonKeyMenu[0]: KinkyDungeonShowInventory = !KinkyDungeonShowInventory; break; + case KinkyDungeonKeyMenu[1]: KinkyDungeonDrawState = "Inventory"; break; + case KinkyDungeonKeyMenu[2]: KinkyDungeonDrawState = "Reputation"; break; + case KinkyDungeonKeyMenu[3]: KinkyDungeonDrawState = "MagicSpells"; break; + case KinkyDungeonKeyMenu[4]: KinkyDungeonDrawState = "Logbook"; break; + case KinkyDungeonKeyMenu[5]: KinkyDungeonDrawState = "Quest"; break; + case KinkyDungeonKeyMenu[6]: KinkyDungeonDrawState = "Collection"; break; + case KinkyDungeonKeyMenu[7]: KinkyDungeonDrawState = "Facilities"; break; + case KinkyDungeonKeyMenu[9]: KinkyDungeonDrawState = "JourneyMap"; break; + case KinkyDungeonKeySkip[0]: + case KinkyDungeonKeyMenu[8]: + KinkyDungeonDrawState = "Game"; break; + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } + } + KinkyDungeonKeybindingCurrentKey = ''; + return false; +} + + +function KinkyDungeonGameKeyUp(lastPress: number): boolean { + //if (KDGameData.CurrentDialog) return; + //if (!KinkyDungeonControlsEnabled()) return; + let delta = CommonTime() - lastPress; + + if ((document.activeElement && KDFocusableTextFields.includes(document.activeElement.id))) return true; + + + // Holding for a minute = fail + if (delta > 60000) return; + // tap = fail + if (delta < 250 && !(KDToggles.ShiftLatch && !KinkyDungeonKeybindingCurrentKey.includes("Shift") && KinkyDungeonKeybindingCurrentKeyRelease.includes("Shift"))) return; + + if (KinkyDungeonState == "Game") { + if (document.activeElement) { + if (KinkyDungeonKeySpell.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { + if (KinkyDungeonDrawState == "Game") { + KinkyDungeonTargetingSpell = null; + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + } + return true; + } else if (KinkyDungeonDrawState == "Game" && KinkyDungeonKeyWeapon.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { + KinkyDungeonTargetingSpell = null; + return true; + } else if (KinkyDungeonDrawState == "Game" && KinkyDungeonKeySprint.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { + KinkyDungeonToggleAutoSprint = !KinkyDungeonToggleAutoSprint; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } else if (KinkyDungeonDrawState == "Game" && KinkyDungeonKeySwitchWeapon.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { + KDSwitchWeapon(); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } + } + if (KinkyDungeonKeyMenu.includes(KinkyDungeonKeybindingCurrentKeyRelease)) { + switch (KinkyDungeonKeybindingCurrentKeyRelease) { + // QuikInv, Inventory, Reputation, Magic, Log + case KinkyDungeonKeyMenu[0]: if (KinkyDungeonDrawState == 'Game') KinkyDungeonShowInventory = !KinkyDungeonShowInventory; break; + case KinkyDungeonKeyMenu[1]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Inventory" ? "Game" : "Inventory"; break; + case KinkyDungeonKeyMenu[2]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Reputation" ? "Game" : "Reputation"; break; + case KinkyDungeonKeyMenu[3]: KinkyDungeonDrawState = KinkyDungeonDrawState == "MagicSpells" ? "Game" : "MagicSpells"; break; + case KinkyDungeonKeyMenu[4]: KinkyDungeonDrawState = KinkyDungeonDrawState == "Logbook" ? "Game" : "Logbook"; break; + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } else if (KinkyDungeonKeyToggle.includes(KinkyDungeonKeybindingCurrentKeyRelease) && KinkyDungeonDrawState == 'Game') { + switch (KinkyDungeonKeybindingCurrentKeyRelease) { + // Log, Passing, Door, Auto Struggle, Auto Pathfind + //case KinkyDungeonKeyToggle[0]: KinkyDungeonMessageToggle = !KinkyDungeonMessageToggle; break; + case KinkyDungeonKeyToggle[1]: KinkyDungeonToggleAutoPass = !KinkyDungeonToggleAutoPass; break; + case KinkyDungeonKeyToggle[2]: KDInteracting = !KDInteracting; break; + case KinkyDungeonKeyToggle[3]: KDAutoStruggleClick(); break; + case KinkyDungeonKeyToggle[4]: KinkyDungeonFastMove = !KinkyDungeonFastMove; break; + case KinkyDungeonKeyToggle[5]: KinkyDungeonInspect = !KinkyDungeonInspect; KinkyDungeonUpdateLightGrid = true; break; + case KinkyDungeonKeyToggle[10]: KDBulletTransparency = !KDBulletTransparency; break; + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } + } + + KinkyDungeonKeybindingCurrentKey = ''; + return false; +} + +function KinkyDungeonSendTextMessage(priority: number, text: string, color: string, time?: number, noPush?: boolean, noDupe?: boolean, entity?: entity, filter: string = "Self"): boolean { + if (entity && KinkyDungeonVisionGet(entity.x, entity.y) < 1) return false; + if (text) { + if (!noPush) + if (!noDupe || KinkyDungeonMessageLog.length == 0 || !KinkyDungeonMessageLog[KinkyDungeonMessageLog.length-1] || text != KinkyDungeonMessageLog[KinkyDungeonMessageLog.length-1].text) { + if (KDLogIndex > 0) KDLogIndex += 1; + KinkyDungeonMessageLog.push({text: text, color: color, time: KinkyDungeonCurrentTick, filter: filter}); + } + + if ( priority >= KinkyDungeonTextMessagePriority || KinkyDungeonActionMessageTime < 0.5) { + KinkyDungeonTextMessageTime = time; + KinkyDungeonTextMessage = text; + KinkyDungeonTextMessageColor = color; + KinkyDungeonTextMessagePriority = priority; + KinkyDungeonTextMessageNoPush = noPush; + return true; + } + } + return false; +} + + +function KinkyDungeonSendActionMessage(priority: number, text: string, color: string, time: number, noPush?: boolean, noDupe?: boolean, entity?: entity, filter: string = "Action", antifilter?: any): boolean { + if (entity && KinkyDungeonVisionGet(entity.x, entity.y) < 1) return false; + if (text) { + if (!noPush) + if (!noDupe || KinkyDungeonMessageLog.length == 0 || !KinkyDungeonMessageLog[KinkyDungeonMessageLog.length-1] || text != KinkyDungeonMessageLog[KinkyDungeonMessageLog.length-1].text){ + if (KDLogIndex > 0) KDLogIndex += 1; + KinkyDungeonMessageLog.push({text: text, color: color, time: KinkyDungeonCurrentTick, filter: filter, antifilter: antifilter}); + } + if ( priority >= KinkyDungeonActionMessagePriority || KinkyDungeonActionMessageTime < 0.5) { + KinkyDungeonActionMessageTime = time; + KinkyDungeonActionMessage = text; + KinkyDungeonActionMessageColor = color; + KinkyDungeonActionMessagePriority = priority; + KinkyDungeonActionMessageNoPush = noPush; + return true; + } + } + return false; +} + +let KinkyDungeonNoMoveFlag = false; + +function KDAttackCost(weapon?: weapon, noEvent?: boolean) { + let data = { + attackCost: KinkyDungeonStatStaminaCostAttack, + stamPenType: KDWeaponStamPenType(KinkyDungeonPlayerDamage), + orig: KinkyDungeonStatStaminaCostAttack, + bonus: KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackStaminaBonus"), + mult: KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackStamina")), + }; + if (!weapon) weapon = KinkyDungeonPlayerDamage; + if (weapon && weapon.staminacost) data.attackCost = -weapon.staminacost; + + if (!noEvent) { + if (KDSTAMPENTYPE[data.stamPenType]?.onAttack) { + KDSTAMPENTYPE[data.stamPenType].onAttack(data); + } + + KinkyDungeonSendEvent("attackCost", data); + } + + data.attackCost = Math.min(0, (data.attackCost + data.bonus) * data.mult); + return data; +} + +/** + * @param Enemy + * @param [skip] + */ +function KinkyDungeonLaunchAttack(Enemy: entity, skip?: number): string { + let ac = KDAttackCost(); + let attackCost = ac.attackCost; + let capture = false; + let result = "fail"; + if (!Enemy.Enemy) return result; + if (Enemy) { + KDTurnToFace(Enemy.x - KinkyDungeonPlayerEntity.x, Enemy.y - KinkyDungeonPlayerEntity.y); + } + + let teasesub = !KDHostile(Enemy) && KinkyDungeonAggressive(Enemy) && KDCanDom(Enemy) && Enemy.hp > 0.51 + && !KDEntityHasFlag(Enemy, "stopplay"); + if (!teasesub && Enemy && KDHelpless(Enemy) && Enemy.hp < 0.52) { + attackCost = 0; + capture = true; + } + let noadvance = false; + if (KinkyDungeonHasStamina(Math.abs(attackCost), true)) { + if (!KDGameData.ConfirmAttack && (KDIsImprisoned(Enemy) + || ((!KinkyDungeonAggressive(Enemy) || KDAllied(Enemy)) + && !(Enemy.playWithPlayer && KDCanDom(Enemy))))) { + let d = Enemy.Enemy.specialdialogue ? Enemy.Enemy.specialdialogue : "GenericAlly"; + if ((!Enemy.specialdialogue && !Enemy.prisondialogue) && KDIsImprisoned(Enemy)) d = "PrisonerJailBug"; + else if (Enemy.prisondialogue && KDIsImprisoned(Enemy)) d = Enemy.prisondialogue; // Special dialogue override + else if (Enemy.specialdialogue) d = Enemy.specialdialogue; // Special dialogue override + if (d || ((!Enemy.lifetime || Enemy.lifetime > 9000) && !Enemy.Enemy.tags.notalk)) { // KDAllied(Enemy) + + KDStartDialog(d, Enemy.Enemy.name, true, Enemy.personality, Enemy); + noadvance = true; + result = "dialogue"; + } + /*} else if (KDEnemyHasFlag(Enemy, "Shop")) { + for (let shop of KDShops) { + if (KDEnemyHasFlag(Enemy, shop.name)) { + KDStartDialog(shop.name, Enemy.Enemy.name, true, Enemy.personality, Enemy); + noadvance = true; + break; + } + } + if (!KDGameData.CurrentDialog) { + KinkyDungeonSendActionMessage(10, TextGet("KDGameData.ConfirmAttack"), "#ff5277", 1); + KDGameData.ConfirmAttack = true; + noadvance = true; + } + }*/ + else { + KinkyDungeonSendActionMessage(10, TextGet("KDGameData.ConfirmAttack"), "#ff5277", 1); + KDGameData.ConfirmAttack = true; + noadvance = true; + result = "confirm"; + } + + } else { + if (!capture) { + let damageInfo: damageInfo = { + name: KinkyDungeonPlayerDamage.name, + damage: KinkyDungeonPlayerDamage.damage, + type: KinkyDungeonPlayerDamage.type, + distract: KinkyDungeonPlayerDamage.distract, + distractEff: KinkyDungeonPlayerDamage.distractEff, + desireMult: KinkyDungeonPlayerDamage.desireMult, + bind: KinkyDungeonPlayerDamage.bind, + bindType: KinkyDungeonPlayerDamage.bindType, + bindEff: KinkyDungeonPlayerDamage.bindEff, + + nodisarm: KinkyDungeonPlayerDamage.nodisarm, + nocrit: KinkyDungeonPlayerDamage.nocrit, + noblock: KinkyDungeonPlayerDamage.noblock, + nokill: KinkyDungeonPlayerDamage.nokill, + evadeable: false, + + addBind: KinkyDungeonPlayerDamage.addBind, + bindcrit: KinkyDungeonPlayerDamage.bindcrit, + crit: KinkyDungeonPlayerDamage.crit, + sfx: KinkyDungeonPlayerDamage.sfx, + time: KinkyDungeonPlayerDamage.time, + + ignoreshield: KinkyDungeonPlayerDamage.ignoreshield, + shield_crit: KinkyDungeonPlayerDamage.shield_crit, // Crit thru shield + shield_stun: KinkyDungeonPlayerDamage.shield_stun, // stun thru shield + shield_freeze: KinkyDungeonPlayerDamage.shield_freeze, // freeze thru shield + shield_bind: KinkyDungeonPlayerDamage.shield_bind, // bind thru shield + shield_snare: KinkyDungeonPlayerDamage.shield_snare, // snare thru shield + shield_slow: KinkyDungeonPlayerDamage.shield_slow, // slow thru shield + shield_distract: KinkyDungeonPlayerDamage.shield_distract, // Distract thru shield + shield_vuln: KinkyDungeonPlayerDamage.shield_vuln, // Vuln thru shield + boundBonus: KinkyDungeonPlayerDamage.boundBonus, + novulnerable: KinkyDungeonPlayerDamage.novulnerable, + tease: KinkyDungeonPlayerDamage.tease}; + + if (KinkyDungeonPlayerDamage.stam50mult && KinkyDungeonStatStamina/KinkyDungeonStatStaminaMax >= 0.50) { + damageInfo.damage *= KinkyDungeonPlayerDamage.stam50mult; + } + let data = { + orighp: Enemy.hp, + origbinding: Enemy.boundLevel, + target: Enemy, + attackCost: attackCost, + attackCostOrig: KinkyDungeonPlayerDamage.staminacost ? -KinkyDungeonPlayerDamage.staminacost : 0, + skipTurn: false, + attackData: damageInfo + }; + KinkyDungeonSendEvent("beforePlayerLaunchAttack", data); + if (attackCost < 0 && KinkyDungeonStatsChoice.has("BerserkerRage")) { + KDChangeDistraction("BerserkerRage", "perk", "attack", 0.7 - 0.5 * data.attackCost, false, 0.33); + } + if (KDGameData.HeelPower > 0) + KDChangeBalanceSrc("heels", "debuff", "attack", data.attackCost * KDGetBalanceCost() * (0.75 + 0.5 * KDRandom()) * KDBalanceAttackMult*10*KDFitnessMult(), true); + + let origHP = Enemy.hp; + if (KinkyDungeonAttackEnemy(data.target, data.attackData)) { + result = "hit"; + } else { + result = "miss"; + } + + if (teasesub && origHP > 0.5) { + Enemy.hp = Math.max(0.51, Enemy.hp); + KinkyDungeonSetEnemyFlag(Enemy, "stopplay", 4); + + KDAddThought(Enemy.id, "PlayDone", 10, 8); + Enemy.playWithPlayer = Math.min(Enemy.playWithPlayer || 0, 1); + KDSetPlayCD(Enemy, 1.5, 3); + } + + let dmgTotal = -(Enemy.hp - data.orighp); + let bondageTotal = (Enemy.boundLevel - data.origbinding); + if (dmgTotal > 0) { + let atk = bondageTotal > 0 ? "KDAttackBind" : "KDAttack"; + KinkyDungeonSendActionMessage(3.5, + TextGet(atk) + .replace("TargetEnemy", TextGet("Name" + Enemy.Enemy.name)) + .replace("DamageDealt", "" + Math.round(dmgTotal * 10)) + .replace("BondageDealt", "" + Math.round(bondageTotal * 10)), + "#ffffff", 2, undefined, undefined, undefined, "Action"); + } else { + KinkyDungeonSendActionMessage(3.5, + TextGet("KDAttackMiss").replace("TargetEnemy", TextGet("Name" + Enemy.Enemy.name)).replace("DamageDealt", "" + Math.round(dmgTotal * 10)), + "#ffffff", 2, undefined, undefined, undefined, "Action", "Combat"); + } + + if (data.skipTurn) skip = 1; + KDChangeStamina("attack", "weapon", "attack", data.attackCost, false, 1); + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "attack", 1); + if (!KinkyDungeonPlayerDamage.noHands) { + KinkyDungeonSetFlag("armattack", 1); + let nearby = KDNearbyEnemies(KDPlayer().x, KDPlayer().y, 10, undefined, true) + .filter((en) => {return !!en.aware;}); + let f = ""; + for (let en of nearby) { + f = "saw_Arms"; + if (!en.flags || !en.flags[f]) + KDSetIDFlag(en.id, f, -1); + } + } + KinkyDungeonSetEnemyFlag(data.target, "targetedForAttack", 4); + + + } else { + if ((Enemy.lifetime > 9000 || !Enemy.maxlifetime)) + KinkyDungeonAggro(Enemy, undefined, KinkyDungeonPlayerEntity); + Enemy.hp = 0; + KinkyDungeonKilledEnemy = Enemy; + + KDGameData.Guilt = Math.max(0, (KDGameData.Guilt || 0) + KDEnemyRank(Enemy)) + + KinkyDungeonSendEvent("capture", {enemy: Enemy, attacker: KinkyDungeonPlayerEntity, skip: skip}); + if (!KDIDHasFlag(Enemy.id, "capOpPen")) { + KDSetIDFlag(Enemy.id, "capOpPen", -1); + KDAddOpinionPersistent(Enemy.id, -50); + } + KDChangeStamina("capture", "capture", "attack", attackCost, false, 1); + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "capture", 1); + if (KDGameData.Collection[Enemy.id + ""]) { + KDGameData.Collection[Enemy.id + ""].status = ""; + KDSortCollection(); + } + KDFreeNPC(Enemy); + Enemy.hp = 0; + KDSetToExpectedBondage(Enemy, 0); + KinkyDungeonSetEnemyFlag(Enemy, "cap", noadvance ? 1 : 2); + if (KDDoCollect(Enemy)) { + KDAddCollection(Enemy); + } + else { + KDFreeNPCRestraints(Enemy.id, KDPlayer().id); + KDReleasePenaltyEntity(Enemy, KDPlayer().id); + + KinkyDungeonSendTextMessage(10, TextGet("KDAutoReleased_NonNotable") + .replace("NME", KDGetEnemyTypeName(Enemy)), + "#ffffff", 4); + } + if (KDIsNPCPersistent(Enemy.id)) { + KDGetPersistentNPC(Enemy.id).collect = true; + KDTPToSummit(Enemy.id); + KDGetPersistentNPC(Enemy.id).captured = false; + KDUpdatePersistentNPC(Enemy.id); + } + //KDAddOpinionPersistent(Enemy.id, -50); + result = "capture"; + } + + KinkyDungeonLastAction = "Attack"; + KDGameData.ConfirmAttack = false; + } + } else { + KinkyDungeonWaitMessage(false, 1); + } + + if (!noadvance) { + KinkyDungeonInterruptSleep(); + if (!skip) + KinkyDungeonAdvanceTime(1); + } + return result; +} + + +function KDPlayerCanMove(player, x, y) { + return KinkyDungeonGetMovable().includes(KinkyDungeonMapGet(x, y)); +} + +function KinkyDungeonMove(moveDirection: {x: number, y: number }, delta: number, AllowInteract: boolean, SuppressSprint?: boolean): boolean { + let moveX = moveDirection.x + KinkyDungeonPlayerEntity.x; + let moveY = moveDirection.y + KinkyDungeonPlayerEntity.y; + let moved = false; + let Enemy = KinkyDungeonEnemyAt(moveX, moveY); + let passThroughSprint = false; + let nextPosX = moveX*2-KinkyDungeonPlayerEntity.x; + let nextPosY = moveY*2-KinkyDungeonPlayerEntity.y; + let nextTile = KinkyDungeonMapGet(nextPosX, nextPosY); + if (KinkyDungeonMovableTilesEnemy.includes(nextTile) && KinkyDungeonNoEnemy(nextPosX, nextPosY) && KinkyDungeonToggleAutoSprint) { + let data = { + canSprint: KDCanSprint(), + passThru: false, + nextPosx: moveX, + nextPosy: moveY, + }; + KinkyDungeonSendEvent("canSprint", data); + if (data.canSprint && data.passThru && !SuppressSprint) { + passThroughSprint = true; + } + } + + let allowPass: boolean = Enemy + && KDCanPassEnemy(KinkyDungeonPlayerEntity, Enemy); + if (Enemy && !allowPass && !passThroughSprint) { + if (AllowInteract) { + KDDelayedActionPrune(["Action", "Attack"]); + KinkyDungeonLaunchAttack(Enemy); + } + } else { + let MovableTiles = KinkyDungeonGetMovable(); + let moveObject = KinkyDungeonMapGet(moveX, moveY); + if (MovableTiles.includes(moveObject) && (passThroughSprint || KinkyDungeonNoEnemy(moveX, moveY) || (Enemy && KDAllied(Enemy)) || allowPass)) { // If the player can move to an empy space or a door + KDGameData.ConfirmAttack = false; + let quick = false; + + if (KinkyDungeonTilesGet("" + moveX + "," + moveY) + && KinkyDungeonTilesGet("" + moveX + "," + moveY).Type + && ( + ( + ( + KDObjectDraw[KinkyDungeonTilesGet("" + moveX + "," + moveY).Type] + || KDObjectClick[KinkyDungeonTilesGet("" + moveX + "," + moveY).Type] + ) + && (KinkyDungeonTilesGet("" + moveX + "," + moveY).Type != "Door" + || ( + KinkyDungeonMapGet(moveX, moveY) == 'D' + && KinkyDungeonTilesGet("" + moveX + "," + moveY).Lock + && KinkyDungeonTilesGet("" + moveX + "," + moveY).Type == "Door"))))) { + if (AllowInteract) { + if (KDObjectClick[KinkyDungeonTilesGet("" + moveX + "," + moveY).Type]) { + KDObjectClick[KinkyDungeonTilesGet("" + moveX + "," + moveY).Type](moveX, moveY); + if (KDMapData.GroundItems.some((item) => {return item.x == moveX && item.y == moveY;})) { + // We can pick up items inside walls, in case an enemy drops it into bars + KinkyDungeonItemCheck(moveX, moveY, MiniGameKinkyDungeonLevel); + } + } else { + KDDelayedActionPrune(["Action", "World"]); + KinkyDungeonTargetTileLocation = "" + moveX + "," + moveY; + KinkyDungeonTargetTile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); + + + KinkyDungeonTargetTileMsg(); + if (KDMapData.GroundItems.some((item) => {return item.x == moveX && item.y == moveY;})) { + // We can pick up items inside walls, in case an enemy drops it into bars + KinkyDungeonItemCheck(moveX, moveY, MiniGameKinkyDungeonLevel); + KinkyDungeonInterruptSleep(); + KinkyDungeonAdvanceTime(1); + } + } + } + } else if (moveX != KinkyDungeonPlayerEntity.x || moveY != KinkyDungeonPlayerEntity.y) { + KDDelayedActionPrune(["Action", "Move"]); + let newDelta = 1; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + // We can pick up items inside walls, in case an enemy drops it into bars + KinkyDungeonItemCheck(moveX, moveY, MiniGameKinkyDungeonLevel); + if (!KinkyDungeonHandleMoveObject(moveX, moveY, moveObject)) {// Move + KinkyDungeonNoMoveFlag = false; + KinkyDungeonConfirmStairs = false; + KinkyDungeonSendEvent("beforeMove", {x:moveX, y:moveY}); + if (!KinkyDungeonNoMoveFlag) { + //if (KinkyDungeonHasStamina(0)) { // You can only move if your stamina is > 0 + if (isNaN(KDGameData.MovePoints)) KDGameData.MovePoints = 0; + KDGameData.MovePoints = Math.min(Math.ceil(KinkyDungeonSlowLevel + 1), KDGameData.MovePoints + delta); // Can't store extra move points + + let lastFacingX = KinkyDungeonPlayerEntity.facing_x || 0; + let lastFacingY = KinkyDungeonPlayerEntity.facing_y || 0; + + + KinkyDungeonPlayerEntity.facing_x = Math.min(1, Math.abs(moveX - KinkyDungeonPlayerEntity.x)) * Math.sign(moveX - KinkyDungeonPlayerEntity.x); + KinkyDungeonPlayerEntity.facing_y = Math.min(1, Math.abs(moveY - KinkyDungeonPlayerEntity.y)) * Math.sign(moveY - KinkyDungeonPlayerEntity.y); + if (KinkyDungeonPlayerEntity.facing_x || KinkyDungeonPlayerEntity.facing_y) { + KinkyDungeonPlayerEntity.facing_x_last = KinkyDungeonPlayerEntity.facing_x; + KinkyDungeonPlayerEntity.facing_y_last = KinkyDungeonPlayerEntity.facing_y; + } + let inertia = KinkyDungeonPlayerEntity.facing_y*lastFacingY + KinkyDungeonPlayerEntity.facing_x*lastFacingX; + if ((KinkyDungeonPlayerEntity.facing_y || KinkyDungeonPlayerEntity.facing_x) + && (KinkyDungeonStatsChoice.get("DirectionSlow") || KinkyDungeonStatsChoice.get("DirectionSlow2"))) { + let D = Math.abs(KinkyDungeonPlayerEntity.facing_y - lastFacingY)**2 + + Math.abs(KinkyDungeonPlayerEntity.facing_x - lastFacingX)**2; + let dotProd = KinkyDungeonPlayerEntity.facing_y*lastFacingY + KinkyDungeonPlayerEntity.facing_x*lastFacingX; + + if (dotProd < 0 || ((D > 1 && (lastFacingY || lastFacingX)) && KinkyDungeonStatsChoice.get("DirectionSlow2"))) { + KDGameData.MovePoints = Math.min(KDGameData.MovePoints, 0); + if (D > 2) KinkyDungeonSendTextMessage(10, TextGet("KDTurn2"), "#ffffff", 1); + else KinkyDungeonSendTextMessage(9, TextGet("KDTurn1"), "#ffffff", 1); + } + } + + if (KinkyDungeonFlags.has("Quickness") && KinkyDungeonSlowLevel < 9) { + KDGameData.MovePoints = KinkyDungeonSlowLevel + 1; + quick = true; + } + + if (KinkyDungeonStatBind) KDGameData.MovePoints = Math.min(0, KDGameData.MovePoints); + //let MovePoints = KDGameData.MovePoints; + + let willSprint = KinkyDungeonToggleAutoSprint && !SuppressSprint; + + if (KDGameData.MovePoints >= 1) {// Math.max(1, KinkyDungeonSlowLevel) // You need more move points than your slow level, unless your slow level is 1 + let xx = KinkyDungeonPlayerEntity.x; + let yy = KinkyDungeonPlayerEntity.y; + + newDelta = Math.max(newDelta, KinkyDungeonMoveTo(moveX, moveY, willSprint, allowPass)); + if (newDelta > 0) { + if (Enemy && allowPass) { + KDMoveEntity(Enemy, xx, yy, true,undefined, undefined, true); + if (KinkyDungeonFlags.has("Passthrough")) + KinkyDungeonSetFlag("Passthrough", 2); + } + KinkyDungeonLastAction = "Move"; + moved = true; + if (KDSoundEnabled()) { + if (quick) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Miss.ogg"); + } else { + if (moveObject == 'w' || moveObject == 'W') + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/FootstepWater.ogg"); + else KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Footstep.ogg"); + } + + } + + if (moveObject == 'g') { + KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonGrateEnter"), "white", 3); + //KDGameData.SlowMoveTurns = Math.max(KDGameData.SlowMoveTurns, 1); + KDStunTurns(1, true); + //KDGameData.KneelTurns = CommonTime() + 250; + } + } + } + + // Messages to inform player they are slowed + let plugLevel = Math.round(Math.min(3, KinkyDungeonStatPlugLevel)); + let dict = KinkyDungeonPlugCount > 1 ? "plugs" : "plug"; + let dicts = KinkyDungeonPlugCount > 1 ? "" : "s"; + if (KinkyDungeonSlowLevel == 0 && KinkyDungeonPlugCount > 0) KinkyDungeonSendTextMessage(0, TextGet("KinkyDungeonPlugWalk" + plugLevel).replace("plugs", dict).replace("(s)", dicts), "yellow", 2, true); + if (KinkyDungeonSlowLevel == 1 && !KinkyDungeonStatsChoice.has("HeelWalker")) KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonSlowed" + plugLevel).replace("plugs", dict).replace("(s)", dicts), "yellow", 2, true); + else if (KinkyDungeonSlowLevel == 2) KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonHopping" + (KDGameData.Crouch ? "Crouch" : "") + plugLevel).replace("plugs", dict).replace("(s)", dicts), "orange", 2, true); + else if (KinkyDungeonSlowLevel == 3) KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonInching" + plugLevel).replace("plugs", dict).replace("(s)", dicts), "#ff5277", 2, true); + else if (KinkyDungeonSlowLevel > 3 && KinkyDungeonSlowLevel < 10) KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonCrawling" + plugLevel).replace("plugs", dict).replace("(s)", dicts), "#ff5277", 2, true); + else if (KinkyDungeonSlowLevel >= 10) KinkyDungeonSendActionMessage(1, TextGet("KinkyDungeonCantMove" + plugLevel).replace("plugs", dict).replace("(s)", dicts), "#ff5277", 2, true); + + let moveMult = Math.max(1, KinkyDungeonSlowLevel); + + if (KinkyDungeonStatsChoice.has("Quickness")) { + KinkyDungeonSetFlag("BlockQuicknessPerk", 3 + moveMult); + } + if (quick) moveMult = 1; + if (KinkyDungeonSlowLevel > 9) moveMult = 1; + if ((moveDirection.x != 0 || moveDirection.y != 0)) { + if (moved) { + if (KinkyDungeonSlowLevel > 1 || (!KinkyDungeonStatsChoice.has("HeelWalker") && KinkyDungeonSlowLevel > 0)) { + if (KinkyDungeonSlowLevel < 10) { + KDChangeStamina("slow", "debuff", "move", moveMult * (KinkyDungeonStatStaminaRegenPerSlowLevel * KinkyDungeonSlowLevel) * delta, false, moveMult, true); + } + } + if (KDGameData.HeelPower > 0 && !KDGameData.Crouch ) { + + KDChangeBalanceSrc("heels", "debuff", "move", -KDGetBalanceCost() * (0.75 + 0.5 * KDRandom()) * (1 + Math.max(-inertia, 0) * KDBalanceInertiaMult)*moveMult, true); + } else { + //KDChangeBalance((KDGameData.KneelTurns > 0 ? 0.5 : 0.25) * KDGetBalanceRate()*delta, true); + } + let plugIncreaseAmount = (KinkyDungeonStatPlugLevel * KinkyDungeonDistractionPerPlug); + KinkyDungeonStatDistraction += plugIncreaseAmount; + if (plugIncreaseAmount > 0) KinkyDungeonStatDistractionLower += plugIncreaseAmount * 0.2; + if (KinkyDungeonHasCrotchRope) { + if (KinkyDungeonStatPlugLevel == 0) KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonCrotchRope"), "pink", 2); + KinkyDungeonStatDistraction += (KinkyDungeonCrotchRopeDistraction); + + if (moveMult > 0) KinkyDungeonStatDistractionLower += (KinkyDungeonCrotchRopeDistraction) * 0.2; + } + } + } else { + if (KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax) { + KinkyDungeonWaitMessage(false, quick ? 0 : 1); + } + KDGameData.MovePoints = Math.min(KDGameData.MovePoints + 1, 0); + } + /*if (moved) { + if (MovePoints > 0) { + newDelta = Math.max(1, newDelta - MovePoints); + } + }*/ + + //} + } + + if (KDGameData.Balance <= 0 && !KDGameData.Crouch && newDelta < 10 && !quick) { + KDTrip(delta + Math.max(1, newDelta)); + } + KinkyDungeonAdvanceTime(quick ? 0 : 1); + } + KinkyDungeonInterruptSleep(); + //for (let d = 0; d < newDelta; d++) + // KinkyDungeonAdvanceTime(1, false, d != 0); // was moveDirection.delta, but became too confusing + + if (newDelta > 1 && newDelta < 10 && !quick) { + if (KDToggles.LazyWalk && !KinkyDungeonInDanger()) { + KDGameData.SlowMoveTurns = newDelta - 1; + KinkyDungeonSleepTime = CommonTime() + 200; + } else { + KDGameData.MovePoints = Math.min(KDGameData.MovePoints, 1-newDelta); + } + } + if (!(KDGameData.KneelTurns > 0)) + KDGameData.BalancePause = true; + } else { + //KDChangeBalance((KDGameData.KneelTurns > 0 ? 1.5 : 1.0) * KDGetBalanceRate()*delta, true); + KDGameData.MovePoints = Math.min(KDGameData.MovePoints + 1, 0); + KinkyDungeonPlayerEntity.facing_x = 0; + KinkyDungeonPlayerEntity.facing_y = 0; + KinkyDungeonWaitMessage(false, 1); + KinkyDungeonAdvanceTime(1); // was moveDirection.delta, but became too confusing + } + } else if (KDCrackableTiles.includes(moveObject)) { + // If the player is trying to move into a cracked wall while they have a pickaxe in their inventory, let's let them mine from it + if (KDEntityHasBuff(KinkyDungeonPlayerEntity,"TryingToMine") && KinkyDungeonPlayerDamage.digSpell) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "TryingToMine", + type: "confirm", + power: 1, + duration: 5 + }); + KDDelayedActionPrune(["Action", "Cast"]); + let sp = KinkyDungeonFindSpell(KinkyDungeonPlayerDamage.digSpell || "Pickaxe", true); + if (sp) { + let res: { result: string, data: any } = KinkyDungeonCastSpell( + moveX, + moveY, sp, + undefined, + KDPlayer(), + undefined, undefined, + { + targetingSpellWeapon: KinkyDungeonTargetingSpellWeapon, + }); + if (res.result == "Cast" && sp.sfx) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + sp.sfx + ".ogg"); + } + if (res.result != "Fail" && !sp.quick) { + KinkyDungeonAdvanceTime(res.data.delta); + } + KinkyDungeonInterruptSleep(); + } + } else if (KDEntityHasBuff(KinkyDungeonPlayerEntity,"TryingToMine")) { + let wpn = Array.from(KinkyDungeonInventory.get(Weapon).values()).find((item) => { + return KDWeapon(item)?.digSpell && KinkyDungeonCanUseWeapon(false, undefined, + KDWeapon(item)); + }); + if (KDWeapon(wpn)?.digSpell) { + KDSwitchWeapon(wpn.inventoryVariant || wpn.name); + } + } else if (KinkyDungeonPlayerDamage.digSpell) { + KinkyDungeonSendActionMessage(2, TextGet("KDWallAttemptToMine"), "white", 2); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "TryingToMine", + type: "confirm", + power: 1, + duration: 5 + }); + } else if (Array.from(KinkyDungeonInventory.get(Weapon).values()).some((item) => { + return KDWeapon(item)?.digSpell && KinkyDungeonCanUseWeapon(false, undefined, + KDWeapon(item)); + })) { + KinkyDungeonSendActionMessage(2, TextGet("KDWallAttemptToMine"), "white", 2); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "TryingToMine", + type: "confirm", + power: 1, + duration: 5 + }); + + } + } else if (KDMapData.GroundItems.some((item) => {return item.x == moveX && item.y == moveY;})) { + // We can pick up items inside walls, in case an enemy drops it into bars + KinkyDungeonItemCheck(moveX, moveY, MiniGameKinkyDungeonLevel); + KinkyDungeonInterruptSleep(); + KinkyDungeonAdvanceTime(1); + } else { // If we are blind we can bump into walls! + if (KinkyDungeonVisionGet(moveX, moveY) <= 1) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Footstep.ogg"); + KinkyDungeonSendActionMessage(2, TextGet("KDWallBump"), "white", 2); + KinkyDungeonInterruptSleep(); + // Due to rendering system + if (moveDirection.y <= 0) + KDRevealTile(moveX, moveY + 1, 2); + if (moveDirection.y >= 0) + KDRevealTile(moveX, moveY - 1, 2); + KDRevealTile(moveX, moveY, 2); + KinkyDungeonAdvanceTime(1); + } + + } + } + + KinkyDungeonLastMoveDirection = moveDirection; + + if (moved) { + KinkyDungeonSetFlag("moved", 2); + } + + return moved; +} + +function KinkyDungeonWaitMessage(NoTime: boolean, delta: number): void { + if (!KDIsAutoAction()) { + if (KinkyDungeonStatWillpowerExhaustion > 1) KinkyDungeonSendActionMessage(3, TextGet("WaitSpellExhaustion"), "orange", 2); + else if (!KinkyDungeonHasStamina(2.5, false)) KinkyDungeonSendActionMessage(1, TextGet("WaitExhaustion" + + (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.33 ? + ((KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.67 ? + "ArousedHeavy" + : "Aroused")) + : "")), "yellow", 2); + else KinkyDungeonSendActionMessage(1, TextGet("Wait" + (KinkyDungeonStatDistraction > 12 ? "Aroused" : "")), "silver", 2, + undefined, undefined, undefined, "Action"); + } + + if (!NoTime && delta > 0) { + if (!KDGameData.Wait) KDGameData.Wait = 0; + KDGameData.Wait += delta; + } + + KinkyDungeonLastAction = "Wait"; + KinkyDungeonTrapMoved = false; +} + + +/** + * Returns th number of turns that must elapse + * Sets MovePoints to 0 + */ +function KinkyDungeonMoveTo(moveX: number, moveY: number, willSprint: boolean, _allowPass: boolean) { + //if (KinkyDungeonNoEnemy(moveX, moveY, true)) { + let stepOff = false; + let xx = KinkyDungeonPlayerEntity.x; + let yy = KinkyDungeonPlayerEntity.y; + if (KinkyDungeonPlayerEntity.x != moveX || KinkyDungeonPlayerEntity.y != moveY) { + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "move", 1); + if (KDNearbyMapTiles(moveX, moveY, 1.5).some((tile) => {return (tile.x == moveX || tile.y == moveY) && !KinkyDungeonMovableTilesEnemy.includes(tile.tile);})) { + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "moveWall", 1); + } else KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "moveOpen", 1); + stepOff = true; + } + if (xx != moveX || yy != moveY) { + KinkyDungeonTrapMoved = true; + } + let cencelled = !KinkyDungeonUpdateTether(true, KinkyDungeonPlayerEntity, moveX, moveY) ? KDMovePlayer(moveX, moveY, true, willSprint) : true; + + + if (stepOff) KinkyDungeonHandleStepOffTraps(KinkyDungeonPlayerEntity, xx, yy, moveX, moveY); + + KinkyDungeonSetFlag("Quickness", 0); + if (KinkyDungeonStatsChoice.has("Quickness")) { + KinkyDungeonSetFlag("BlockQuicknessPerk", 4); + } + if (!cencelled && willSprint) { + if (KDCanSprint()) { + let unblocked = KinkyDungeonSlowLevel > 1; + if (!unblocked) { + let nextPosX = moveX*2 - xx; + let nextPosY = moveY*2 - yy; + let nextTile = KinkyDungeonMapGet(nextPosX, nextPosY); + if (KinkyDungeonMovableTilesEnemy.includes(nextTile) && KinkyDungeonNoEnemy(nextPosX, nextPosY)) { + unblocked = true; + } + } + if (unblocked) { + let data = { + player: KinkyDungeonPlayerEntity, + xTo: moveX*2 - xx, + yTo: moveY*2 - yy, + cancelSprint: false, + sprintCost: 0, + }; + + data.sprintCost = KDSprintCost(data); + + KinkyDungeonSendEvent("sprint", data); + + + if (!data.cancelSprint) { + KinkyDungeonSetFlag("sprinted", 2); + KDChangeStamina("sprint", "move", "sprint", data.sprintCost, false, 1); + KinkyDungeonSendActionMessage(5, TextGet("KDSprinting" + (KinkyDungeonSlowLevel > 1 ? "Hop" : "")), "lightgreen", 2); + KDChangeBalanceSrc("sprint", "move", "sprint", -KDGetBalanceCost() * (0.5 + 1 * KDRandom()) * KDBalanceSprintMult*10*KDFitnessMult(), true); + KinkyDungeonSetFlag("sprint", 2); + if (KinkyDungeonSlowLevel < 2) { + // Move faster + KinkyDungeonTrapMoved = true; + KDMovePlayer(moveX*2 - xx, moveY*2 - yy, true); + } + } + } + KDGameData.MovePoints = 0; + return 1; + } + } + if (cencelled || (xx == KinkyDungeonPlayerEntity.x && yy == KinkyDungeonPlayerEntity.y)) { + KDGameData.MovePoints = 0; + return 0; + } + KDGameData.MovePoints = 0; + return Math.max(1, KinkyDungeonSlowLevel); + //} + //return 0; +} + +function KDBalanceSprint() { + let threshold = 0.5 * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BalanceSprintThreshold")); + return KDGameData.Balance >= threshold; +} + +function KDCanSprint() { + let data = { + canSprint: KDBalanceSprint(), + mustStand: true, + mustNotBeSlow: true, + }; + KinkyDungeonSendEvent("canSprint", data); + return data.canSprint && (!data.mustNotBeSlow || KinkyDungeonSlowLevel < 4) + && KinkyDungeonHasStamina(KDSprintCostBase + KDSprintCostSlowLevel[Math.min(Math.round(KinkyDungeonSlowLevel), KDSprintCostSlowLevel.length)]) + && (!data.mustStand || (KinkyDungeonCanStand() && !KDForcedToGround())); +} + +let KinkyDungeonLastAction = ""; +let KinkyDungeonLastTurnAction = ""; +let KDDrawUpdate = 0; +let KDVisionUpdate = 0; + +let KDLastTick = 0; + +function KinkyDungeonAdvanceTime(delta: number, NoUpdate?: boolean, NoMsgTick?: boolean) { + if (delta > 0) { + KDEventData.sounddesc = []; + } + if (!KinkyDungeonPlayerEntity.id) KinkyDungeonPlayerEntity.id = -1; + + if (delta > 0) { + // Player sound decay + let loudest = 0; + + for (let source of Object.values(KDPlayerNoiseSources)) { + loudest = Math.max(loudest, source.calc(KDPlayer())); + } + // Player gets quieter faster + KDPlayer().sound = Math.max(Math.max(0, (KDPlayer().sound || 0)*0.75 - 2*delta), loudest); + } + + KDUpdateFog = true; + KDLastTick = performance.now(); + + if (delta > 0 && CommonTime() > lastFloaterRefresh + 1000) { + KDEntitiesFloaterRegisty = new Map(); + lastFloaterRefresh = CommonTime(); + } + + + + let pauseTime = false; + if (delta > 0) { + let timeslow = KDEntityBuffedStat(KinkyDungeonPlayerEntity, "TimeSlow"); + if (timeslow) { + if (!KinkyDungeonFlags.get("TimeSlow")) { + KinkyDungeonSetFlag("TimeSlow", timeslow); + } else { + pauseTime = true; + } + } + } + + + + let _CharacterRefresh = CharacterRefresh; + let _CharacterAppearanceBuildCanvas = CharacterAppearanceBuildCanvas; + CharacterRefresh = () => {KDRefresh = true;}; + CharacterAppearanceBuildCanvas = () => {}; + let start = performance.now(); + + if (KDGameData.MovePoints < -1 && KDGameData.KinkyDungeonLeashedPlayer < 1) KDGameData.MovePoints += delta; + if (delta > 0) { + KDDrawUpdate = delta; + KDVisionUpdate = delta; + } + KDRecentRepIndex = 0; + KinkyDungeonRestraintAdded = false; + KinkyDungeonSFX = []; + KDPlayerHitBy = []; + + KinkyDungeonUpdateAngel(delta); + + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (altType?.updatescript) { + altType.updatescript(delta); + } + + if (KDPlayer().leash) + KinkyDungeonUpdateTether(true, KinkyDungeonPlayerEntity); + + for (let enemy of KDMapData.Entities) { + if (enemy.leash) + KinkyDungeonUpdateTether(false, enemy); + } + + KinkyDungeonResetEventVariablesTick(delta); + KinkyDungeonSendEvent("tick", {delta: delta}); + + // Here we move enemies and such + KinkyDungeonUpdateLightGrid = true; + if (!NoMsgTick) { + if (KinkyDungeonTextMessageTime > 0) KinkyDungeonTextMessageTime -= 1; + if (KinkyDungeonTextMessageTime <= 0) KinkyDungeonTextMessagePriority = 0; + if (KinkyDungeonActionMessageTime > 0) KinkyDungeonActionMessageTime -= 1; + if (KinkyDungeonActionMessageTime <= 0) KinkyDungeonActionMessagePriority = 0; + } + + // Updates the character's stats + KinkyDungeonItemCheck(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, MiniGameKinkyDungeonLevel); //console.log("Item Check " + (performance.now() - now)); + if (pauseTime && delta > 0) { + delta = 0; + KinkyDungeonFlags.set("TimeSlowTick", 1); + } else pauseTime = false; + KDGameData.ShieldDamage = 0; + KDUpdateCollectionFlags(delta); + KDUpdatePersistentNPCFlags(delta); + for (let value of Object.values(KDGameData.Collection)) + KDTickCollectionWanderCollectionEntry(value); + KinkyDungeonUpdateBuffs(delta, pauseTime); + KinkyDungeonUpdateEnemies(delta, true); //console.log("Enemy Check " + (performance.now() - now)); + KinkyDungeonSendEvent("afterEnemyTick", {delta: delta, allied: true}); + KinkyDungeonUpdateBullets(delta, true); //console.log("Bullets Check " + (performance.now() - now)); + KinkyDungeonUpdateBulletsCollisions(delta); //console.log("Bullet Check " + (performance.now() - now)); + KinkyDungeonUpdateEnemies(delta, false); //console.log("Enemy Check " + (performance.now() - now)); + KinkyDungeonSendEvent("afterEnemyTick", {delta: delta, allied: false}); + + + KinkyDungeonUpdateBullets(delta); //console.log("Bullets Check " + (performance.now() - now)); + KinkyDungeonUpdateBulletsCollisions(delta, true); //"catchup" phase for explosions! + + KinkyDungeonParseExtraWarningTiles(delta); // Add custom warning indicators! + + KDUpdateEffectTiles(delta); + KinkyDungeonUpdateTileEffects(delta); + for (let E = 0; E < KDMapData.Entities.length; E++) { + let enemy = KDMapData.Entities[E]; + if (KinkyDungeonEnemyCheckHP(enemy, E, KDMapData)) { E -= 1; continue;} + if (KDCheckDespawn(enemy, E, KDMapData)) { E -= 1; continue;} + } + + KinkyDungeonUpdateTether(true, KinkyDungeonPlayerEntity); + + for (let enemy of KDMapData.Entities) { + if (enemy.leash) + KinkyDungeonUpdateTether(false, enemy); + } + KinkyDungeonUpdateJailKeys(); + + KDCommanderUpdate(delta); + + + if (KDCustomDefeat) { + KDRunDefeatForEnemy(); + } + + if (pauseTime) { + delta = 1; + KinkyDungeonFlags.set("TimeSlowTick", 0); + } + + KinkyDungeonUpdateStats(delta); + + let toTile = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + KinkyDungeonHandleMoveToTile(toTile); + // else if (KinkyDungeonStatWillpower == 0) { + // KinkyDungeonState = "Lose"; + //} + + // Handle delayed actions + if (!KDGameData.DelayedActions) KDGameData.DelayedActions = []; + let runActions: KDDelayedAction[] = Object.assign([], KDGameData.DelayedActions); + // Trim actions that have happened + KDGameData.DelayedActions = KDGameData.DelayedActions.filter((action) => { + return action.time - delta > 0; + }); + for (let action of runActions) { + action.time -= delta; + if (action.time <= 0) { + if (KDDelayedActionCommit[action.commit]) { + KDDelayedActionCommit[action.commit](action); + } + } else if (action.update && KDDelayedActionUpdate[action.update]) { + KDDelayedActionUpdate[action.update](action); + } + } + if (KDGameData.DelayedActions?.length == 0) KDAutoWaitDelayed = false; + + if (!NoUpdate) + KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); + + if (KinkyDungeonStatStamina < 5) { + let msg = "KinkyDungeonStaminaWarningMed"; + if (KinkyDungeonStatStamina < 2.5) msg = "KinkyDungeonStaminaWarningLow"; + if (KinkyDungeonStatStamina < 1) msg = "KinkyDungeonStaminaWarningNone"; + if (!KinkyDungeonSendActionMessage(1, TextGet(msg), "#448844", 1, true)) + KinkyDungeonSendTextMessage(1, TextGet(msg), "#448844", 1, true); + } + let gagchance = KinkyDungeonGagMumbleChance; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv)) + gagchance += KinkyDungeonGagMumbleChancePerRestraint; + } + if (!KinkyDungeonCanTalk() && KDRandom() < gagchance) { + let msg = "KinkyDungeonGagMumble"; + let gagMsg = Math.floor(KDRandom() * 5); + const GagEffect = KinkyDungeonGagTotal() * 5; + gagMsg += GagEffect; + gagMsg = Math.max(0, Math.min(7, Math.floor(gagMsg))); + + if (KDRandom() < KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax) msg = "KinkyDungeonGagMumbleAroused"; + + msg = msg + gagMsg; + + KinkyDungeonSendDialogue(KinkyDungeonPlayerEntity, TextGet(msg), "#ffffff", 2, 0); + + if (KDToggles.GagParticles) { + KDSendGagParticles(KDPlayer()); + } + } + let end = performance.now(); + if (KDDebug) console.log(`Tick ${KinkyDungeonCurrentTick} took ${(end - start)} milliseconds.`); + + KinkyDungeonLastTurnAction = KinkyDungeonLastAction; + KinkyDungeonLastAction = ""; + + if (KDGameData.AncientEnergyLevel > 1) KDGameData.AncientEnergyLevel = 1; + + KinkyDungeonUpdateBulletVisuals(delta); + + CharacterRefresh = _CharacterRefresh; + CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; + + if (KinkyDungeonInDanger()) KinkyDungeonSetFlag("DangerFlag", 3); + if ((KinkyDungeonStatsChoice.has("Quickness") && !KinkyDungeonFlags.has("BlockQuicknessPerk"))) { + KinkyDungeonSetFlag("Quickness", -1); + } else if (KDEntityBuffedStat(KinkyDungeonPlayerEntity, "Quickness")) { + KinkyDungeonSetFlag("Quickness", 1); + } + if (KDGameData.MovePoints < 0 || KinkyDungeonStatBlind) { + KinkyDungeonSetFlag("Quickness", 0); + } + + for (let en of KDMapData.Entities) { + if (KDEnemyHasFlag(en, "removeVuln")) { + en.vulnerable = 0; + } + } + + if (delta > 0) { + KDTickMaps(delta, + MiniGameKinkyDungeonLevel - KDMapTickRange, + MiniGameKinkyDungeonLevel + KDMapTickRange, + false, + true, + true + ); + } + KinkyDungeonCurrentTick += delta; + if (KinkyDungeonCurrentTick > 100000) KinkyDungeonCurrentTick = 0; + + KinkyDungeonSendEvent("tickAfter", {delta: delta}); + + if (KinkyDungeonStatsChoice.get("Forgetful")) { + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + if (X >= 0 && X <= KDMapData.GridWidth-1 && Y >= 0 && Y <= KDMapData.GridHeight-1 && !(KinkyDungeonVisionGet(X, Y) > 0.1)) { + if (KinkyDungeonFogMemoryGet(X, Y) > 0) { + KinkyDungeonFogMemorySet(X, Y, Math.max(0, KinkyDungeonFogMemoryGet(X, Y) - delta)); + } else if (KinkyDungeonFogMemoryGet(X, Y) == 0) { + KinkyDungeonFogSet(X, Y, 0); + } + } + } + } + } + + KinkyDungeonUpdateStats(0); + + KDTickNeeds(delta); + + + let Dstart = performance.now(); + + KDUpdateForceOutfit(KinkyDungeonPlayer); + KinkyDungeonDressPlayer(); + + if (KDDebug) console.log(`Dressing ${KinkyDungeonCurrentTick} took ${(performance.now() - Dstart)} milliseconds.`); + KDGetEnemyCache(); + + KDAllowDialogue = true; + + if (KDGameData.InventoryAction && KDInventoryAction[KDGameData.InventoryAction].cancel(KinkyDungeonPlayerEntity, delta)) { + KDGameData.InventoryAction = ""; + } + + + if (KDRestraintDebugLog.length > 100) { + KDRestraintDebugLog = KDRestraintDebugLog.splice(0, 10); + } + KDQuestTick(KDGameData.Quests, delta); + KinkyDungeonUpdateFlags(delta); + + + if (delta > 0) { + if (KDGameData.RevealedTiles) { + for (let entry of Object.entries(KDGameData.RevealedTiles)) { + KDGameData.RevealedTiles[entry[0]] = entry[1] - delta; + if (KDGameData.RevealedTiles[entry[0]] < 0) { + delete KDGameData.RevealedTiles[entry[0]]; + } + } + } + if (KDGameData.RevealedFog) { + for (let entry of Object.entries(KDGameData.RevealedFog)) { + KDGameData.RevealedFog[entry[0]] = entry[1] - delta; + if (KDGameData.RevealedFog[entry[0]] < 0) { + delete KDGameData.RevealedFog[entry[0]]; + } + } + } + } + +} +let KDEntityFlagCache = new Map(); +let KDUpdateEntityFlagCache = false; + + +function KDGetEntityFlagCache() { + if (!KDEntityFlagCache || KDUpdateEntityFlagCache) { + KDEntityFlagCache = new Map(); + + for (let npc of Object.values(KDPersistentNPCs)) { + if (npc.entity?.flags) { + if (Object.entries(npc.entity.flags).some((f) => { + return f[1] >= 0; + })) { + KDEntityFlagCache.set(npc, true); + } + } + } + + KDUpdateEntityFlagCache = false; + } +} + + +let KDItemEventCache = new Map(); +let KDUpdateItemEventCache = false; + +function KDGetItemEventCache() { + if (!KDItemEventCache || KDUpdateItemEventCache) { + KDItemEventCache = new Map(); + let set = false; + for (let inv of KinkyDungeonAllRestraintDynamic()) { + //set = false; + if (!KDRestraint(inv.item)) continue; + if (!set && KDRestraint(inv.item)?.events) { + for (let e of KDRestraint(inv.item)?.events) { + if (!KDItemEventCache.get(e.trigger)) KDItemEventCache.set(e.trigger, new Map()); + KDItemEventCache.get(e.trigger).set(KDRestraint(inv.item).Group, true); + //set = true; + } + } + if (!set && inv.item.events) { + for (let e of inv.item.events) { + if (!KDItemEventCache.get(e.trigger)) KDItemEventCache.set(e.trigger, new Map()); + KDItemEventCache.get(e.trigger).set(KDRestraint(inv.item).Group, true); + //set = true; + } + } + if (!set && KDCurses[KDGetCurse(inv.item)]?.events) { + for (let e of KDCurses[KDGetCurse(inv.item)]?.events) { + if (!KDItemEventCache.get(e.trigger)) KDItemEventCache.set(e.trigger, new Map()); + KDItemEventCache.get(e.trigger).set(KDRestraint(inv.item).Group, true); + //set = true; + } + } + } + KDUpdateItemEventCache = false; + } +} + +let KDAllowDialogue = true; + +let lastFloaterRefresh = 0; + +function KinkyDungeonTargetTileMsg() { + if (KDObjectMessages[KinkyDungeonTargetTile.Type]) { + KDObjectMessages[KinkyDungeonTargetTile.Type](); + } else if (KinkyDungeonTargetTile.Lock) { + + KinkyDungeonTargetTile.LockSeen = + KinkyDungeonTargetTile.Lock; + if (KinkyDungeonTargetTile.Faction) + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonObjectFaction") + .replace("FACTION", TextGet("KinkyDungeonFaction" + KinkyDungeonTargetTile.Faction)), "#ff5277", 2, true); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Locked.ogg"); + KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonObjectLock") + .replace("TYPE", TextGet("KinkyDungeonShrine" + KinkyDungeonTargetTile.Name)) + .replace("LKTP", TextGet(`Kinky${KinkyDungeonTargetTile.Lock}Lock`)) + , "#ffffff", 1, true); + } else { + + KinkyDungeonTargetTile.LockSeen = undefined; + let suff = ""; + if (KinkyDungeonTargetTile.Faction) + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonObjectFaction") + .replace("FACTION", TextGet("KinkyDungeonFaction" + KinkyDungeonTargetTile.Faction)), "#ff5277", 2, true); + if (KinkyDungeonTargetTile.Name == "Commerce") suff = "Commerce"; + KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonObject" + KinkyDungeonTargetTile.Type + suff).replace("TYPE", TextGet("KinkyDungeonShrine" + KinkyDungeonTargetTile.Name)), "#ffffff", 1, true); + } +} + +/** + * Sets an item in the character appearance + * @param C - The character whose appearance should be changed + * @param Group - The name of the corresponding groupr for the item + * @param ItemAsset - The asset collection of the item to be changed + * @param NewColor - The new color (as "#xxyyzz" hex value) for that item + * @param [DifficultyFactor] - The difficulty, on top of the base asset difficulty, that should be assigned + * to the item + * @param [ItemMemberNumber] - The member number of the player adding the item - defaults to -1 + * @param [Refresh] - Determines, wether the character should be redrawn after the item change + * @param [item] - The item, to pass to the event + * @returns - the item itself + */ +function KDAddAppearance ( + C: Character, + _Group: string, + ItemAsset: any, + NewColor: string | string[], + DifficultyFactor: number = 0, + ItemMemberNumber: number = -1, + _Refresh: boolean = true, + item?: Item +): Item +{ + DifficultyFactor = 0; + + // Unlike the stock function, we do NOT remove the previous one + let data = { + color: NewColor, + item: item, + }; + + KinkyDungeonSendEvent("onWear", data); + + // Add the new item to the character appearance + if (ItemAsset != null) { + const NA: Item = { + Asset: ItemAsset, + Difficulty: parseInt((ItemAsset.Difficulty == null) ? 0 : ItemAsset.Difficulty) + parseInt(DifficultyFactor), + Color: data.color, + Property: ItemAsset.CharacterRestricted ? {ItemMemberNumber: ItemMemberNumber == null ? -1 : ItemMemberNumber} : undefined + }; + C.Appearance.push(NA); + return NA; + } + return null; +} + + +/** + * Sets an item in the character appearance + * @param C - The character whose appearance should be changed + * @param Group - The name of the corresponding groupr for the item + * @param ItemModel - The asset collection of the item to be changed + * @param NewColor - The new color (as "#xxyyzz" hex value) for that item + * @param filters - The item, to pass to the event + * @param [item] - The item, to pass to the event + * @param [Properties] - The item, to pass to the event + * @returns - the item itself + */ +function KDAddModel ( + C: Character, + _Group: string, + ItemModel: Model, + NewColor: string | string[], + filters: Record, + item?: item, + Properties?: Record +): Item +{ + + // Unlike the stock function, we do NOT remove the previous one + let data = { + color: NewColor, + item: item, + }; + + KinkyDungeonSendEvent("onWear", data); + + // Add the new item to the character appearance + if (ItemModel != null) { + const NA: Item = { + Model: JSON.parse(JSON.stringify(ItemModel)), + Difficulty: 0,//parseInt((ItemModel.Difficulty == null) ? 0 : ItemModel.Difficulty) + parseInt(DifficultyFactor), + Color: data.color, + Property: undefined, + Filters: filters, + Properties: Properties, + }; + NA.Model.Filters = NA.Filters || NA.Model.Filters; + NA.Model.Properties = NA.Properties || NA.Model.Properties; + for (let i = 0; i < C.Appearance.length; i++) { + if (C.Appearance[i]?.Model?.Name == NA.Model.Name) { + C.Appearance[i] = NA; + return NA; + } + } + C.Appearance.push(NA); + return NA; + } + return null; +} + +function KinkyDungeonCloseDoor(x: number, y: number) { + if (KinkyDungeonStatsChoice.get("Doorknobs") && KinkyDungeonIsArmsBound(true) && KinkyDungeonIsHandsBound(true, true, 0.5)) + KinkyDungeonSendTextMessage(8, TextGet("KDCantCloseDoor"), "#ff8933", 2); + else { + KinkyDungeonTargetTileLocation = x + ',' + y; + KinkyDungeonTargetTile = null; + KinkyDungeonMapSet(x, y, "D"); + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/DoorClose.ogg"); + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonCloseDoorDone"), "white", 2); + KinkyDungeonAdvanceTime(1, true); + } +} + +let KDEnemyCache: Map = null; +let KDEnemyEventCache: Map> = null; +let KDUpdateEnemyCache = true; +let KDIDCache = new Map(); + +function KDGetEnemyCache() { + if (KDUpdateEnemyCache || !KDEnemyCache) { + KDUpdateEnemyCache = false; + KDEnemyCache = new Map(); + KDEnemyEventCache = new Map(); + KDIDCache = new Map(); + for (let e of KDMapData.Entities) { + KDEnemyCache.set(e.x + "," + e.y, e); + if (e.Enemy.events) { + for (let event of e.Enemy.events) { + if (!KDEnemyEventCache.get(event.trigger)) { + KDEnemyEventCache.set(event.trigger, new Map()); + } + KDEnemyEventCache.get(event.trigger).set(e.id, true); + } + } + KDEnemyCache.set(e.x + "," + e.y, e); + KDIDCache.set(e.id, e); + } + } + return KDEnemyCache; +} + +let KDTileQuery = ""; +let KDTileLast = null; + +/** + * @param [x] + * @param [y] + */ +function KDTile(x?: number, y?: number): any { + if (x == undefined) x = KinkyDungeonPlayerEntity.x; + if (y == undefined) y = KinkyDungeonPlayerEntity.y; + let q = x + "," + y; + if (q == KDTileQuery) return KDTileLast; + else { + let t = KinkyDungeonTilesGet(q); + KDTileLast = t; + KDTileQuery = q; + return t; + } +} + +/** + * @param [x] + * @param [y] + */ +function KDTileDelete(x?: number, y?: number): void { + if (x == undefined) x = KinkyDungeonPlayerEntity.x; + if (y == undefined) y = KinkyDungeonPlayerEntity.y; + KinkyDungeonTilesDelete(x + "," + y); +} + +/** + * Stuns the player for [turns] turns + * @param turns + * @param [noFlag] - Doesn't add the 'stun' flag which makes the game think you are in trouble + */ +function KDStunTurns(turns: number, noFlag?: boolean) { + if (!noFlag) + KinkyDungeonSetFlag("playerStun", turns + 1); + KDGameData.SlowMoveTurns = Math.max(KDGameData.SlowMoveTurns, turns); + KinkyDungeonSleepTime = CommonTime() + 200; +} + +/** + * Kneels the player for [turns] turns + * @param turns + */ +function KDKneelTurns(turns: number) { + KinkyDungeonSetFlag("playerStun", turns + 1); + KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns || 0, turns); +} + +/** + * Picks a string based on weights + * @param list - a list of weights with string keys + * @returns - the key that was selected + */ +function KDGetByWeight(list: Record): string { + let WeightTotal = 0; + let Weights = []; + let type = ""; + + for (let obj of Object.entries(list)) { + Weights.push({obj: obj[0], weight: WeightTotal}); + WeightTotal += obj[1]; + } + + let selection = KDRandom() * WeightTotal; + + for (let L = Weights.length - 1; L >= 0; L--) { + if (selection > Weights[L].weight) { + type = Weights[L].obj; + break; + } + } + return type; +} + +let KDKeyCheckers = { + "Toggles": () => { + if (KinkyDungeonState == 'Game' && KinkyDungeonDrawState == 'Game' && KinkyDungeonKeyToggle.includes(KinkyDungeonKeybindingCurrentKey)) { + switch (KinkyDungeonKeybindingCurrentKey) { + // Log, Passing, Door, Auto Struggle, Auto Pathfind + //case KinkyDungeonKeyToggle[0]: KinkyDungeonMessageToggle = !KinkyDungeonMessageToggle; break; + case KinkyDungeonKeyToggle[1]: KinkyDungeonToggleAutoPass = !KinkyDungeonToggleAutoPass; break; + case KinkyDungeonKeyToggle[2]: KDInteracting = !KDInteracting; break; + case KinkyDungeonKeyToggle[3]: KDAutoStruggleClick(); break; + case KinkyDungeonKeyToggle[4]: KinkyDungeonFastMove = !KinkyDungeonFastMove; break; + case KinkyDungeonKeyToggle[5]: KinkyDungeonInspect = !KinkyDungeonInspect; KinkyDungeonUpdateLightGrid = true; break; + case KinkyDungeonKeyToggle[10]: KDBulletTransparency = !KDBulletTransparency; break; + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + return true; + } + }, + "Zoom": () => { + if (KinkyDungeonState == 'Game' && KinkyDungeonDrawState == 'Game') { + switch (KinkyDungeonKeybindingCurrentKey) { + // Log, Passing, Door, Auto Struggle, Auto Pathfind + //case KinkyDungeonKeyToggle[0]: KinkyDungeonMessageToggle = !KinkyDungeonMessageToggle; break; + case KinkyDungeonKeyMap[1]: KDChangeZoom(-1); + + return true; + case KinkyDungeonKeyMap[2]: KDChangeZoom(+1); + return true; + } + return false; + } + }, + + "Shop": () => { + if (KinkyDungeonState == 'Game' && KinkyDungeonDrawState == 'Game' && KinkyDungeonTargetTile?.Type == "Shrine" && KinkyDungeonTargetTile.Name == "Commerce") { + if (KinkyDungeonKey[0] == KinkyDungeonKeybindingCurrentKey) { + KinkyDungeonShopIndex = (KinkyDungeonShopIndex + 1) % KDMapData.ShopItems.length; + KDShopBuyConfirm = false; + return true; + } else if (KinkyDungeonKey[2] == KinkyDungeonKeybindingCurrentKey) { + KinkyDungeonShopIndex = KinkyDungeonShopIndex - 1; + if (KinkyDungeonShopIndex < 0) KinkyDungeonShopIndex = KDMapData.ShopItems.length - 1; + KDShopBuyConfirm = false; + return true; + } else if (KinkyDungeonKey[3] == KinkyDungeonKeybindingCurrentKey || KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey) { + let cost = KinkyDungeonShrineCost("Commerce"); + if (cost <= KinkyDungeonGold) { + if (!KDShopBuyConfirm) KDShopBuyConfirm = true; + else { + KDSendInput("shrineBuy", {type: "Commerce", shopIndex: KinkyDungeonShopIndex}); + KDShopBuyConfirm = false; + } + } + return true; + } else if (KinkyDungeonKey[1] == KinkyDungeonKeybindingCurrentKey) { + KDShopBuyConfirm = false; + return true; + } + } + }, + + "Dialogue": () => { + if (KDGameData.CurrentDialog && !(KDGameData.SlowMoveTurns > 0)) { + + if (KinkyDungeonState == 'Game' && KinkyDungeonDrawState == 'Game' && KDGameData.CurrentDialog) { + if (KinkyDungeonKey[2] == KinkyDungeonKeybindingCurrentKey) { + if (KDDialogueData.CurrentDialogueIndex < KDMaxDialogue - 1) + KDDialogueData.CurrentDialogueIndex += 1; + else + KDClickButton("dialogueDOWN"); + return true; + } else if (KinkyDungeonKey[0] == KinkyDungeonKeybindingCurrentKey) { + if (KDDialogueData.CurrentDialogueIndex > 0) + KDDialogueData.CurrentDialogueIndex = Math.max(0, KDDialogueData.CurrentDialogueIndex - 1); + else + KDClickButton("dialogueUP"); + return true; + } else if (KinkyDungeonKeyEnter[0] == KinkyDungeonKeybindingCurrentKey) { + KDClickButton(KDOptionOffset + "dialogue" + (KDDialogueData.CurrentDialogueIndex)); + return true; + } else if (KinkyDungeonKeySkip[0] == KinkyDungeonKeybindingCurrentKey) { + // Get the current dialogue and traverse down the tree + let dialogue = KDGetDialogue(); + if (dialogue.options) { + let entries = Object.entries(dialogue.options); + + let II = -KDOptionOffset; + let gagged = KDDialogueGagged(); + for (let i = 0; i < entries.length && II < KDMaxDialogue; i++) { + if ((!entries[i][1].prerequisiteFunction || entries[i][1].prerequisiteFunction(gagged, KinkyDungeonPlayerEntity)) + && (!entries[i][1].gagRequired || gagged) + && (!entries[i][1].gagDisabled || !gagged)) { + if (II >= 0) { + if (entries[i][0] == "Leave" || entries[i][0] == "Continue" || entries[i][1].skip) { + KDClickButton(KDOptionOffset + "dialogue" + (II)); + return true; + } + } + II += 1; + } + } + } + return true; + } + } + } + }, +}; + +/** + * + * @param Floor + * @param [MapMod] + * @param [RoomType] + */ +function KDGetAltType(Floor: number, MapMod?: string, RoomType?: string): AltType { + let mapMod = null; + if (MapMod != undefined ? MapMod : KDGameData.MapMod) { + mapMod = KDMapMods[MapMod ? MapMod : KDGameData.MapMod]; + } + let altRoom = RoomType != undefined ? RoomType : KDGameData.RoomType; + let altType = altRoom ? KinkyDungeonAltFloor((mapMod && mapMod.altRoom) ? mapMod.altRoom : altRoom) : KinkyDungeonBossFloor(Floor); + return altType; +} + + +/** + * + * @param player + * @param Enemy + */ +function KDCanPassEnemy(_player: entity, Enemy: entity, force?: boolean): boolean { + return !KDIsImmobile(Enemy) + && ((!KinkyDungeonAggressive(Enemy) && !Enemy.playWithPlayer) || (KDHelpless(Enemy))) + && ((force || (KinkyDungeonToggleAutoPass + && ( + !KDGameData.FocusControlToggle || ( + (KDGameData.FocusControlToggle.AutoPassHelplessEnemies || !(KDHostile(Enemy) && KDHelpless(Enemy))) && + (KDGameData.FocusControlToggle.AutoPassHelplessAllies || !(!KDHostile(Enemy) && KDHelpless(Enemy))) && + (KDGameData.FocusControlToggle.AutoPassAllies || !(KDAllied(Enemy))) && + (KDGameData.FocusControlToggle.AutoPassNeutral || !(!KDAllied(Enemy) && !KDAllied(Enemy))) && + (KDGameData.FocusControlToggle.AutoPassShop || !(KDEnemyHasFlag(Enemy, "Shop"))) && + (KDGameData.FocusControlToggle.AutoPassSpecial || !(Enemy.specialdialogue || + (Enemy.prisondialogue && KDIsImprisoned(Enemy)) || Enemy.Enemy.specialdialogue)) && + (KDGameData.FocusControlToggle.AutoPassSummons || !(Enemy.Enemy.allied)) + ) + ))) + || KDEnemyHasFlag(Enemy, "passthrough") + || (KinkyDungeonFlags.has("Passthrough")) + || Enemy.Enemy.noblockplayer); +} + + +/** + * @param x + * @param y + * @param [pad] + */ +function KDIsInBounds(x: number, y: number, pad: number = 1): boolean { + return x >= pad && x <= KDMapData.GridWidth-pad-1 && y >= pad && y <= KDMapData.GridHeight-pad-1; +} + +/** + * @param sprintdata + */ +function KDSprintCost(sprintdata?: any): number { + let data = { + sprintdata: sprintdata, + sprintCostMult: KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SprintEfficiency")), + cost: (-KDSprintCostBase - KDSprintCostSlowLevel[Math.min(KDSprintCostSlowLevel.length, Math.round(KinkyDungeonSlowLevel))]), + boost: 0, + }; + + KinkyDungeonSendEvent("calcSprint", data); + + return (data.cost + data.boost) * data.sprintCostMult; +} + + +/** + * @param map + * @param flag + */ +function KDSetMapFlag(map: KDMapDataType, flag: string) { + if (!map) return; + if (!map.flags) { + map.flags = []; + } + if (!map.flags.includes(flag)) { + map.flags.push(flag); + } +} + +/** + * @param C + */ +function KDUpdateForceOutfit(C: Character) { + let forceOutfit = ""; + let forceOutfitPri = 0; + let r = null; + for (let inv of KinkyDungeonAllRestraintDynamic()) { + r = KDRestraint(inv.item); + if (r?.forceOutfit && (r.forceOutfitPriority || r.power) >= forceOutfitPri) { + forceOutfitPri = r.forceOutfitPriority || r.power; + forceOutfit = r.forceOutfit; + } + } + if (forceOutfit && KinkyDungeonCurrentDress != forceOutfit) { + KinkyDungeonSetDress(forceOutfit, forceOutfit, C); + } +} + +function KDGenerateBaseTraffic(width?: number, height?: number) { + KDMapData.Traffic = []; + if (typeof width === 'undefined' || typeof height === 'undefined') + return; + + // Generate the grid + for (let X = 0; X < height; X++) { + let row = []; + for (let Y = 0; Y < width; Y++) + row.push(5); + KDMapData.Traffic.push(row); + } +} + +/** + * Prunes all rooms with prune: true + */ +function KDPruneWorld() { + for (let slot of Object.values(KDWorldMap)) { + for (let entry of Object.entries(slot.data)) { + let alt = KDGetAltType(slot.y, entry[1].MapMod, entry[1].RoomType); + if (alt?.prune || alt?.alwaysRegen) { + // Remove all chests and add to lost items + let lostItems: item[] = []; + for (let entry of Object.entries(KDGameData.Containers)) { + if (entry[1].location?.mapY == slot.y + && entry[1].location?.mapX == slot.x + && entry[1].location?.room == entry[0] + ) { + lostItems.push(...Object.values(entry[1].items)); + delete KDGameData.Containers[entry[0]]; + } + } + for (let item of lostItems) { + KDAddLostItemSingle(item.name, 1); + } + + delete slot.data[entry[0]]; + } + } + } +} + + +function KDEnemyTurnToFace(enemy: entity, x: number, y: number) { + enemy.fx = x; + enemy.fy = y; + if (enemy.fx > enemy.x) + enemy.flip = true; + else if (enemy.fx < enemy.x) + enemy.flip = false; +} + +function KDTurnToFace(dx: number, dy: number): boolean { + let origx = KinkyDungeonPlayerEntity.facing_x; + let origy = KinkyDungeonPlayerEntity.facing_y; + + KinkyDungeonPlayerEntity.facing_x = Math.min(1, Math.abs(dx)) * Math.sign(dx); + KinkyDungeonPlayerEntity.facing_y = Math.min(1, Math.abs(dy)) * Math.sign(dy); + + if (KinkyDungeonPlayerEntity.facing_x || KinkyDungeonPlayerEntity.facing_y) { + KinkyDungeonPlayerEntity.facing_x_last = KinkyDungeonPlayerEntity.facing_x; + KinkyDungeonPlayerEntity.facing_y_last = KinkyDungeonPlayerEntity.facing_y; + } + return origx != KinkyDungeonPlayerEntity.facing_x || KinkyDungeonPlayerEntity.facing_y != origy; +} + + +function KDAddRepopQueue(repopdata: RepopQueueData, data: KDMapDataType) { + if (!data.RepopulateQueue) + data.RepopulateQueue = []; + + data.RepopulateQueue.push(repopdata); +} + +function KDRepopQueueGet(data: KDMapDataType, x: number, y: number): RepopQueueData[] { + if (data.RepopulateQueue?.length > 0) { + return data.RepopulateQueue.filter((q) => {return q.x == x && q.y == y;}) + } + return []; +} + +function KDUpdateRepopQueue(data: KDMapDataType, delta: number) { + // Obv only if there is any thing to repop + if (data.RepopulateQueue?.length > 0) { + // subtract delta from time + for (let e of data.RepopulateQueue) { + e.time -= delta; + } + let currentTodo = data.RepopulateQueue.filter((entry) => { + return entry.time < 0; + }); + // Sort the todo list to repop in order + currentTodo = currentTodo.sort((a, b) => { + return a.time - b.time; + }); + // Repop + for (let current of currentTodo) { + let point: KDPoint = null; + if (!KinkyDungeonEntityAt( + current.x, current.y, false, undefined, undefined, true + )) { + point = { + x: current.x, + y: current.y, + }; + } else if (current.loose) { + point = KinkyDungeonGetNearbyPoint(current.x, current.y, true, undefined, false, true); + } + if (point) { + current.entity.x = point.x; + current.entity.y = point.y; + current.entity.visual_x = point.x; + current.entity.visual_y = point.y; + KDAddEntity(current.entity, false, false, true, + data); + // Remove these from queue + let ind = data.RepopulateQueue.indexOf(current); + if (ind >= 0) + data.RepopulateQueue.splice( + ind, 1 + ); + } + } + } +} + + +function KDTPToSummit(id: number) { + let npc = KDGetPersistentNPC(id); + if (npc) { + KDMovePersistentNPC(id, { + mapX: 0, + mapY: 0, + room: "Summit", + }) + } +} + +function KDCheckMainPath() { + return KinkyDungeonFindPath(KDMapData.StartPosition.x, KDMapData.StartPosition.y, KDMapData.EndPosition.x, KDMapData.EndPosition.y, + false, false, false, KinkyDungeonMovableTilesSmartEnemy, + false, false, false, undefined, false, + undefined, false, true)?.length > 0; +} + +function KDPruneEntrances + // Prunes existing entrances on the map, making sure they are accessible + (width: number, height: number) { + let successfulEntrances: LairEntrance[] = []; + for (let entrance of KDMapData.PotentialEntrances) { + let X = entrance.x; + let Y = entrance.y; + let checkTiles: KDPoint[] = [ + {x: X, y: Y}, + ]; + if (entrance.Excavate?.length > 0) { + checkTiles.push(...entrance.Excavate); + } + let pass = false; + for (let tile of checkTiles) { + let u = (KinkyDungeonIsAccessible(tile.x, tile.y - 1) + && !KDEffectTileTags(tile.x, tile.y - 1).nomapgen); + let d = (KinkyDungeonIsAccessible(tile.x, tile.y + 1) + && !KDEffectTileTags(tile.x, tile.y + 1).nomapgen); + let r = (KinkyDungeonIsAccessible(tile.x + 1, tile.y) + && !KDEffectTileTags(tile.x + 1, tile.y).nomapgen); + let l = (KinkyDungeonIsAccessible(tile.x - 1, tile.y) + && !KDEffectTileTags(tile.x - 1, tile.y).nomapgen); + if (u || d || r || l) { + pass = true; + break; + } + } + if (pass) { + successfulEntrances.push(entrance); + } + } + KDMapData.PotentialEntrances = successfulEntrances; + +} + +function KDDelayedActionStart() { + if (KDToggles.AutoWaitDelayed) + KDAutoWaitDelayed = true; + //KinkyDungeonAdvanceTime(1); + if (KDAutoWaitDelayed) + KinkyDungeonSleepTime = KDNormalWaitTime; +} \ No newline at end of file diff --git a/Game/src/base/KinkyDungeonHUD.ts b/Game/src/base/KinkyDungeonHUD.ts new file mode 100644 index 000000000..9928dacba --- /dev/null +++ b/Game/src/base/KinkyDungeonHUD.ts @@ -0,0 +1,3462 @@ + +let KDUISmoothness = 6; + +let KDInteracting = false; + +let KinkyDungeonStruggleGroups = []; +let KinkyDungeonStruggleGroupsBase = [ + "ItemDevices", + "ItemEars", + "ItemHead", + "ItemMouth", + "ItemNeck", + "ItemNeckRestraints", + "ItemArms", + "ItemHands", + "ItemBreast", + "ItemNipples", + "ItemTorso", + "ItemPelvis", + "ItemVulvaPiercings", + "ItemVulva", + "ItemButt", + "ItemLegs", + "ItemFeet", + "ItemBoots", +]; +let KDDrawStruggleEnum = { + MOST: 1, + FULL: 0, + STRUGGLE: 2, + NONE: 3, +}; +let KinkyDungeonDrawStruggle = KDDrawStruggleEnum.MOST; +let KDPlayerSetPose = false; +let KDToggleXRay = 0; +let KDBulletTransparency = false; +let KD_XRayHidden = ["Wrapping", "Tape"]; +let KinkyDungeonDrawStruggleHover = false; +let KinkyDungeonDrawState = "Game"; +let KinkyDungeonDrawStatesModal = ["Heart", "Orb"]; +let KinkyDungeonSpellValid = false; +let KinkyDungeonCamX = 0; +let KinkyDungeonCamY = 0; +let KinkyDungeonCamXLast = 0; +let KinkyDungeonCamYLast = 0; +let KinkyDungeonCamXVis = 0; +let KinkyDungeonCamYVis = 0; +let KinkyDungeonTargetX = 0; +let KinkyDungeonTargetY = 0; +let KinkyDungeonLastDraw = 0; +let KinkyDungeonLastDraw2 = 0; +let KinkyDungeonDrawDelta = 0; + +let KD_HUD_RESTRAINTINFOFONTSIZE = 24; +let KD_HUD_RESTRAINTINFOLINESIZE = 34; + +const KinkyDungeonLastChatTimeout = 10000; + +let KinkyDungeonStatBarHeight = 50; +let KinkyDungeonToggleAutoPass = true; +let KinkyDungeonToggleAutoSprint = false; +let KinkyDungeonInspect = false; + +let KinkyDungeonFastMove = true; +let KinkyDungeonFastMovePath = []; +let KinkyDungeonFastStruggle = false; +let KinkyDungeonFastStruggleType = ""; +let KinkyDungeonFastStruggleGroup = ""; + + +let KDMinBuffX = 0; +let KDMinBuffXTarget = 1000; +let KDToggleShowAllBuffs = false; + +let KDFocusControls = ""; +let KDFocusControlButtons = { + "AutoPass": { + HelplessEnemies: false, + HelplessAllies: true, + Summons: true, + Allies: true, + Neutral: true, + Shop: false, + Special: false, + }, + "AutoPath": { + SuppressBeforeCombat: true, + SuppressDuringCombat: true, + StepDuringCombat: false, + }, + "AutoWait": { + Slow: false, + Normal: true, + Fast: false, + VeryFast: false, + }, +}; +let KDFocusControlButtonsExclude = { + AutoPathStepDuringCombat: ["AutoPathSuppressDuringCombat"], + AutoPathSuppressDuringCombat: ["AutoPathStepDuringCombat"], + AutoWaitSlow: ["AutoWaitNormal", "AutoWaitFast", "AutoWaitVeryFast"], + AutoWaitFast: ["AutoWaitNormal", "AutoWaitSlow", "AutoWaitVeryFast"], + AutoWaitVeryFast: ["AutoWaitNormal", "AutoWaitFast", "AutoWaitSlow"], + AutoWaitNormal: ["AutoWaitSlow", "AutoWaitFast", "AutoWaitVeryFast"], +}; + +let KDFocusHoverEnter = 0; +let KDFocusHoverDelay = 500; +let KDFocusHoverLast = ""; + +let KDBuffSprites = { + "Camo": true, + "Drenched": true, + "StoneSkin": true, + "Conduction": true, + "Ignite": true, + "Burning": true, + "Unsteady": true, + "Unsteady2": true, + "Chilled": true, + "ChillWalk": true, + "Slimed": true, + "LightningRod": true, + "PoisonDagger": true, + "Cutting": true, + "Slippery": true, + "ScrollVerbal": true, + "ScrollArms": true, + "ScrollLegs": true, + "Empower": true, + "SlimeMimic": true, + "d_SlimeMimic": true, + "DisenchantSelf": true, + "LeatherBurst": true, + + "TabletElements": true, + "TabletConjure": true, + "TabletIllusion": true, + "TabletRope": true, + "TabletWill": true, + "TabletMetal": true, + "TabletLatex": true, + "TabletLeather": true, + + "AvatarFire": true, + "AvatarWater": true, + "AvatarEarth": true, + "AvatarAir": true, + + "DistractionCast": true, + "ManaBurst": true, + + "BoundByFate": true, + "Taunted": true, + "GreaterInvisibility": true, + "Invisibility": true, + + "Haunted": true, + "Cursed": true, + "DildoBatBuff": true, + + "Corrupted": true, + "CursedDistract": true, + "ForcedSubmission": true, + "CursingCircle": true, + + //KinkyDungeonBuffShrineElements,"Arcane Power: Deals bonus damage when you hit an enemy." + //KinkyDungeonBuffShrineConjure,"Arcane Protection: Reduces damage taken, and deals retaliation damage." + //KinkyDungeonBuffShrineIllusion,"Arcane Cunning: You turn invisible briefly after attacking." + + //KinkyDungeonBuffSlimeForm,"Slime Form: You gain bonuses and can slip through bars!" + //KinkyDungeonBuffShroud2,"Shroud: Visibility decreased, evasion increased." + //KinkyDungeonBuffShadowBlade,"Darkblade: Increased damage." + //KinkyDungeonBuffShield,"Runic Ward: Increased Spell Ward." + //KinkyDungeonBuffInvisibility,"Invisibility: It is very difficult for enemies to see you." + //KinkyDungeonBuffLesserInvisibility,"Lesser Invisibility: It is harder for enemies to see you." + //KinkyDungeonBuffCutting,"FULL POWER: Cutting power increased!!!" + //KinkyDungeonBuffSlippery,"Graceful: Struggling power increased." + //KinkyDungeonBuffIronBlood,"Iron Blood: Reduced melee cost, increased mana costs." + //KinkyDungeonBuffSleepy,"Sleepy: You are sluggish and have a hard time keeping your eyes open." + //KinkyDungeonBuffEvasion,"Afterimage: Evasion greatly increased." + + //KinkyDungeonBuffStraitjacketBolt,"Locked Down: Struggling power is greatly reduced." + //KinkyDungeonBuffLockdown,"Locked Down: Struggling power is greatly reduced." + + //KinkyDungeonBuffScrollVerbal,"Verbose: You can cast verbal spells while gagged." + //KinkyDungeonBuffScrollArms,"Dextrous: You can cast arm spells while tied up." + //KinkyDungeonBuffScrollLegs,"Spell Dance: You can cast leg spells while tied up." + + //KinkyDungeonBuffBondageBusterCharge,"Bondage Buster: Lazor is charging..." + //KinkyDungeonBuffKatanaCharge,"Katana: Patience is key..." + //KinkyDungeonBuffStormCharge,"Stormbreaker: You have the Power." +}; + +let KDStatsSkipLine = { + "info": 1, + "training": 1, + "status": 1, + "dmg": 1, + "resist": 1, +}; +let KDStatsSkipLineBefore = { + "kinky": 1, + "curse": 1, + "perk": 1, +}; + +let KDStatsOrder = { + "info": 10000, + "status": 7000, + "training": 4000, + "resist": 2500, + "dmg": 2000, + "help": 1500, // Always good, so since they are buffs they should be high priority + "buffs": 1000, + "perk": -500, + "kinky": -1000, + "curse": -2000, +}; + +let KDUIColor = "#111111"; +let KDUIAlpha = 0.5; +let KDUIColorHighlight = "#ffee83"; +let KDUIAlphaHighlight = 0.7; + + + +let KDModalArea_x = 600; +let KDModalArea_y = 700; +let KDModalArea_width = 800; +let KDModalArea_height = 100; +let KDModalArea = false; +let KDConfirmDeleteSave = false; +let KDConfirmUpload = false; + + +function KDHandleGame() { + if (KinkyDungeonShowInventory && (!KinkyDungeonTargetingSpell || MouseIn(0, 0, 500, PIXIHeight))) { + // Done, converted to input + KinkyDungeonhandleQuickInv(); + return true; + } + if (KinkyDungeonMessageToggle && KinkyDungeonDrawState == "Game") { + if (MouseIn(500, KDLogTopPad, 1250, KDLogHeight + 175)) { + return true; + } + } + + if (KinkyDungeonIsPlayer() && MouseIn(canvasOffsetX, canvasOffsetY, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height)) + KinkyDungeonSetTargetLocation(!KinkyDungeonTargetingSpell && KDToggles.Helper); + + + + + // Done, converted to input + if (!KinkyDungeonTargetingSpell) { + KinkyDungeonSpellPress = ""; + if (KinkyDungeonHandleSpell()) return true; + } else { + KinkyDungeonSpellPress = ""; + } + + if (KinkyDungeonIsPlayer() && KinkyDungeonTargetTile) { + if (KDHandleModalArea()) return true; + } +} + + + +function KDGetDungeonName(coord: WorldCoord) { + if (coord.room == undefined) { + return TextGet("KDUnknown"); + } + let mapData = KDGetMapData(coord); + if (mapData) { + + let altType = KDGetAltType(coord.mapY, mapData.MapMod, mapData.RoomType); + let dungeonName = altType?.Title ? altType.Title : + (KinkyDungeonMapIndex[mapData.Checkpoint] || mapData.Checkpoint); + return KDPersonalAlt[coord.room] ? + KDGetLairName(coord.room) + : TextGet("DungeonName" + dungeonName) + } + + return TextGet("KDUnknown"); +} + +function KinkyDungeonDrawInterface(_showControls: boolean) { + if (KDToggles.TurnCounter) + DrawTextKD(TextGet("TurnCounter") + KinkyDungeonCurrentTick, 1995, 995, "#ffffff", "#333333", 12, "right"); + + let dungeonName = KDGetDungeonName(KDGetCurrentLocation()); + DrawTextFitKD( + TextGet("CurrentLevel").replace("FLOORNUMBER", "" + MiniGameKinkyDungeonLevel).replace("DUNGEONNAME", + dungeonName) + + (KinkyDungeonNewGame ? TextGet("KDNGPlus").replace("XXX", "" + KinkyDungeonNewGame) : ""), + 1870, 15, 250, "#ffffff", "#333333", 18, "center"); + + + + if (!KDPatched) DrawButtonKDEx("quitbutton", (_b) => { + KinkyDungeonDrawState = "Restart"; + KDConfirmDeleteSave = false; + if (KDDebugMode) { + ElementCreateTextArea("DebugEnemy"); + ElementValue("DebugEnemy", "Maidforce"); + ElementCreateTextArea("DebugItem"); + ElementValue("DebugItem", "TrapArmbinder"); + } else { + if (document.getElementById("DebugEnemy")) { + ElementRemove("DebugEnemy"); + } + if (document.getElementById("DebugItem")) { + ElementRemove("DebugItem"); + } + } + return true; + }, true, 1750, 20, 100, 50, TextGet("KinkyDungeonRestart"), "#ffffff"); + + + + + if (!KDToggles.TransparentUI) { + /* + let Rwidth = 270; + let Bheight = 80; + DrawRectKD(kdcanvas, kdpixisprites, "rightBarb", { + Left: 2000 - Rwidth, Top: -2, Width: Rwidth + 4, + Height: 1000 - Bheight, + Color: KDUIColorHighlight, alpha: KDUIAlphaHighlight, zIndex: -1, + LineWidth: 2 + }); + FillRectKD(kdcanvas, kdpixisprites, "rightBar", { + Left: 2000 - Rwidth, Top: 0, Width: Rwidth, + Height: 1000 - Bheight, + Color: KDUIColor, alpha: KDUIAlpha, zIndex: -2 + });*/ + DrawRectKD(kdcanvas, kdpixisprites, "leftBarb", { + Left: -2, Top: -2, Width: 502, + Height: 1006, + Color: KDUIColorHighlight, alpha: KDUIAlphaHighlight, zIndex: -1, + LineWidth: 2 + }); + if (!KDBGColor) { + FillRectKD(kdcanvas, kdpixisprites, "leftBar", { + Left: 0, Top: 0, Width: 500, + Height: 1006, + Color: KDUIColor, alpha: StandalonePatched ? KDUIAlpha : 0.01, zIndex: -2 + }); + } + /*DrawRectKD(kdcanvas, kdpixisprites, "botBarb", { + Left: 504, Top: 1000-Bheight, + Width: 2000 - 500, + Height: Bheight + 2, + Color: KDUIColorHighlight, alpha: KDUIAlphaHighlight, zIndex: -1, + LineWidth: 2 + }); + FillRectKD(kdcanvas, kdpixisprites, "botBar", { + Left: 504, Top: 1000-Bheight, + Width: 2000 - 500, + Height: Bheight, + Color: KDUIColor, alpha: KDUIAlpha, zIndex: -2 + });*/ + } + + KDDrawStruggleGroups(); + KDDrawStatusBars(1790, 340, 200); + KinkyDungeonDrawActionBar(1780, 166); + if (KDToggles.BuffSide) + KDProcessBuffIcons(510, 82, true); + else + KDProcessBuffIcons(830, 995 - 72 - 36 - 24); + + + if (KinkyDungeonTargetTile) { + if (KDObjectDraw[KinkyDungeonTargetTile.Type]) { + KDObjectDraw[KinkyDungeonTargetTile.Type](); + } + } + KDDrawSpellChoices(); + KDDrawNavBar(-1); + + if (KDToggles.ShowZoom) { + DrawButtonKDEx("mainZoomIn", () => { + KDChangeZoom(-1); + return true; + }, true, PIXIWidth - 210, PIXIHeight * 0.5 - 50, 42, 42, undefined, "#ffffff", + KinkyDungeonRootDirectory + "UI/ZoomIn.png"); + DrawButtonKDEx("mainZoomOut", () => { + KDChangeZoom(1); + return true; + }, true, PIXIWidth - 210, PIXIHeight * 0.5 - 50 + 48, 42, 42, undefined, "#ffffff", + KinkyDungeonRootDirectory + "UI/ZoomOut.png"); + } + +} + +function KDDrawSpellChoices() { + let i = 0; + let HotbarStart = 995 - 70; + let hotBarIndex = 0; + let hotBarSpacing = 72; + let hotBarX = 790 + hotBarSpacing; + + const max_choices = Math.max (KinkyDungeonSpellChoices.length, KinkyDungeonConsumableChoices.length, KinkyDungeonWeaponChoices.length, KinkyDungeonArmorChoices.length) + if (max_choices > KinkyDungeonSpellChoiceCountPerPage) { + DrawButtonKDEx("CycleSpellButton", () => { + KDCycleSpellPage(false, false); + return true; + }, true, hotBarX + 713, HotbarStart, 72, 72, `${KDSpellPage + 1}`, "#ffffff", + KinkyDungeonRootDirectory + "UI/Cycle.png", undefined, undefined, true, undefined, 28, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpellPage[0]), + hotkeyPress: KinkyDungeonKeySpellPage[0], + scaleImage: true, + centered: true, + centerText: true, + }); + } + KDCullSpellChoices(); + + let KDUpcastLevel = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellEmpower"); + + + if (KinkyDungeonSpellChoices.length > 0) { + let hasUpcast = KDCanUpcast(); + if (!KDToggles.TransparentUI) { + DrawRectKD( + kdcanvas, kdpixisprites, "hotbarborder", { + Left: hotBarX - 5 - hotBarSpacing, Top: HotbarStart - 5, Width: 72 * 12, + Height: 82, + Color: KDUIColorHighlight, alpha: KDUIAlphaHighlight, zIndex: -2, + LineWidth: 2, + } + ); + FillRectKD( + kdcanvas, kdpixisprites, "hotbarbg", { + Left: hotBarX - 5 - hotBarSpacing, Top: HotbarStart - 5, Width: 72 * 12, + Height: 82, + Color: KDUIColor, alpha: KDUIAlpha, zIndex: -1 + } + ); + } + + hotBarIndex = -1; + + if (KinkyDungeonSpellChoices.some((num) => {return KinkyDungeonSpells[num] != undefined;})) { + DrawButtonKDEx("empowerSpell", + (_bdata) => { + KDSendInput("upcast", {}); + return true; + }, true, + hotBarX + (hotBarIndex)*hotBarSpacing, HotbarStart, 72, 72, "", "", + KinkyDungeonRootDirectory + "Spells/" + KDEmpowerSprite + (hasUpcast ? "" : "Fail") + ".png", undefined, false, true, + undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeyUpcast[0]), + scaleImage: true, + } + ); + if (KDUpcastLevel > 0) + DrawButtonKDEx("empowerSpellCancel", + (_bdata) => { + KDSendInput("upcastcancel", {}); + return true; + }, true, + hotBarX + (hotBarIndex)*hotBarSpacing - 82, HotbarStart - 82, 72, 72, "", "", + KinkyDungeonRootDirectory + "Spells/" + KDEmpowerSprite + "Cancel" + ".png", undefined, false, true, + undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeyUpcast[1]), + scaleImage: true, + } + ); + if (MouseIn(hotBarX + (hotBarIndex)*hotBarSpacing , HotbarStart, 72, 72)) { + DrawTextFitKD(TextGet("KDSpellEmpower" + (hasUpcast ? "" : "Fail")), hotBarX + (hotBarIndex)*hotBarSpacing, HotbarStart - 140, + 1000, "#ffffff", undefined, undefined, "center"); + } + if (KDUpcastLevel > 0 && MouseIn(hotBarX + (hotBarIndex)*hotBarSpacing, HotbarStart - 82, 72, 72)) { + DrawTextFitKD(TextGet("KDSpellEmpowerCancel"), hotBarX + (hotBarIndex)*hotBarSpacing, HotbarStart - 140, + 1000, "#ffffff", undefined, undefined, "center"); + } + } + } + + hotBarIndex = 0; + + let maxSmallIcons = KDToggles.BuffSide ? 7 : 3; + for (i = 0; i < KinkyDungeonSpellChoiceCountPerPage; i++) { + let index = i + KDSpellPage * KinkyDungeonSpellChoiceCountPerPage; + /*let buttonWidth = 40; + let buttonPad = 80; + if (KinkyDungeonSpellChoices[i] >= 0) + DrawButtonKDEx("changespell" + i, (bdata) => { + KinkyDungeonDrawState = "MagicSpells"; + KDSwapSpell = index; + return true; + }, true, 1650 + (90 - buttonWidth), 40 + i*KinkyDungeonSpellChoiceOffset, buttonWidth, buttonWidth, "", "#ffffff", KinkyDungeonRootDirectory + "ChangeSpell.png", undefined, undefined, true);*/ + //let tooltip = false; + let buttonDim = { + x: hotBarX + hotBarSpacing*i, + y: HotbarStart, + w: 72, + h: 72, + wsmall: 36, + hsmall: 36, + }; + + + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[index]] && !KinkyDungeonSpells[KinkyDungeonSpellChoices[index]].passive) { + let spell = KDGetUpcast(KinkyDungeonSpells[KinkyDungeonSpellChoices[index]].name, KDUpcastLevel) || KinkyDungeonSpells[KinkyDungeonSpellChoices[index]];//KinkyDungeonSpells[KinkyDungeonSpellChoices[index]]; + //let components = KinkyDungeonGetCompList(spell); + //let comp = ""; + + + //if (spell.components && spell.components.length > 0) comp = components; + // Render MP cost + let data = { + spell: spell, + cost: Math.round(KinkyDungeonGetManaCost( + spell, + !spell.active && spell.passive, + !spell.active && spell.type == "passive") * 10) + "mp", + color: "#ccddFF", + }; + if (data.cost == "0mp") { + let c2 = Math.round(KinkyDungeonGetStaminaCost(spell) * 10) + "sp"; + if (c2 != "0sp") { + data.cost = c2; + } + } + if (data.cost == "0mp") { + let c2 = Math.round(KinkyDungeonGetChargeCost(spell) * 10) + "c"; + if (c2 != "0c") { + data.cost = c2; + } + } + if (spell.customCost && KDCustomCost[spell.customCost]) { + KDCustomCost[spell.customCost](data); + } + + DrawTextFitKD(data.cost == "0mp" ? TextGet("KDFree") : data.cost, buttonDim.x + buttonDim.w/2, buttonDim.y+buttonDim.h-7, buttonDim.w, + data.color, "#333333", 12, "center", 110); + + // Draw the main spell icon + if (spell.type == "passive" && KinkyDungeonSpellChoicesToggle[index]) { + FillRectKD(kdcanvas, kdpixisprites, "rectspella" + i, { + Left: buttonDim.x-2, + Top: buttonDim.y-2, + Width: buttonDim.w+4, + Height: buttonDim.h+4, + Color: "#dbdbdb", + zIndex: 70, + }); + FillRectKD(kdcanvas, kdpixisprites, "rectspellb" + i, { + Left: buttonDim.x, + Top: buttonDim.y, + Width: buttonDim.w, + Height: buttonDim.h, + Color: "#101010", + zIndex: 70.1, + }); + } + + + DrawButtonKDEx("SpellCast" + index, + () => { + KinkyDungeonHandleSpell(index); + return true; + }, + true, + buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, "", "rgba(0, 0, 0, 0)", + KinkyDungeonRootDirectory + "Spells/" + spell.name + ".png", "", false, true, + undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpell[i]), + scaleImage: true, + }); + if (KinkyDungeoCheckComponentsPartial(spell, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true).length > 0) { + let sp = KinkyDungeoCheckComponents(spell).failed.length > 0 ? "SpellFail" : "SpellFailPartial"; + KDDraw(kdcanvas, kdpixisprites, "spellFail" + "SpellCast" + i, KinkyDungeonRootDirectory + "Spells/" + sp + ".png", + buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, undefined, { + zIndex: 72, + }); + //DrawImage(KinkyDungeonRootDirectory + "Spells/" + sp + ".png", buttonDim.x + 2, buttonDim.y + 2,); + } + if (KDHasUpcast(spell.name)) { + KDDraw(kdcanvas, kdpixisprites, "spellCanUpcast" + i, KinkyDungeonRootDirectory + "Spells/" + "CanUpcast" + ".png", + buttonDim.x, buttonDim.y, 72, 72, undefined, { + zIndex: 71, + }); + } + + if (MouseIn(buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h)) { + DrawTextFitKD(TextGet("KinkyDungeonSpell"+ spell.name), + buttonDim.x, buttonDim.y - 140, 300, "#ffffff", "#333333", undefined, "center"); + //DrawTextFitKD(comp, 1700 - 2 - buttonPad / 2, 1000 + i*KinkyDungeonSpellChoiceOffset, Math.min(10 + comp.length * 8, buttonPad), "#ffffff", KDTextGray0); + } + // Render number + //DrawTextFitKD((i+1) + "", buttonDim.x + 10, buttonDim.y + 13, 25, "#ffffff", KDTextGray0, 18, undefined, 101); + + + //let cost = KinkyDungeonGetManaCost(spell) + TextGet("KinkyDungeonManaCost") + comp; + } else if (KinkyDungeonConsumableChoices[index] || KinkyDungeonWeaponChoices[index] || KinkyDungeonArmorChoices[index]) { + let item = KinkyDungeonConsumableChoices[index] || KinkyDungeonWeaponChoices[index] || KinkyDungeonArmorChoices[index]; + let arm = KinkyDungeonArmorChoices[index]; + let consumable = KinkyDungeonConsumableChoices[index]; + let wep = KinkyDungeonWeaponChoices[index]; + // Draw the main icon + let name = item; + if (arm && KinkyDungeonRestraintVariants[arm]) name = KinkyDungeonRestraintVariants[arm].template; + if (consumable && KinkyDungeonConsumableVariants[consumable]) name = KinkyDungeonConsumableVariants[consumable].template; + if (wep && KinkyDungeonWeaponVariants[wep]) name = KinkyDungeonWeaponVariants[wep].template; + //DrawButtonKD("UseItem" + index, true, buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, "", "rgba(0, 0, 0, 0)", + //KDGetItemPreview({name: item, type: consumable ? Consumable : (arm ? LooseRestraint : Weapon)}).preview, "", false, true); + if (KDGetItemPreview({name: item, type: consumable ? Consumable : (arm ? LooseRestraint : Weapon)})) { + DrawButtonKDEx("UseItem" + index, + () => { + KinkyDungeonHandleSpell(index); + return true; + }, + true, + buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, "", "rgba(0, 0, 0, 0)", + KDGetItemPreview({name: item, type: consumable ? Consumable : (arm ? LooseRestraint : Weapon)}).preview, "", false, true, + undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpell[i]), + scaleImage: true, + }); + + if (MouseIn(buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h)) { + DrawTextFitKD(TextGet((arm ? "Restraint" : ("KinkyDungeonInventoryItem")) + name), + buttonDim.x, buttonDim.y - 140, 300, + "#ffffff", "#333333", undefined, "center"); + } + // Render number + //DrawTextFitKD((i+1) + "", buttonDim.x + 10, buttonDim.y + 13, 25, "#ffffff", KDTextGray0, 18, undefined, 101); + if (consumable || arm) { + let con = KinkyDungeonInventoryGetConsumable(consumable) + || KinkyDungeonInventoryGetLoose(arm); + if (con) { + DrawTextFitKD((con.quantity || 0) + 'x', + buttonDim.x + buttonDim.w-1, + buttonDim.y + buttonDim.h - 9, + buttonDim.hsmall, "#ffffff", KDTextGray0, 18, "right"); + } + } + } + if (!KinkyDungeonInventoryGet(item)) { + let sp = "SpellFail"; + KDDraw(kdcanvas, kdpixisprites, "spellFail" + "SpellCast" + i, KinkyDungeonRootDirectory + "Spells/" + sp + ".png", + buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, undefined, { + zIndex: 72, + }); + //DrawImage(KinkyDungeonRootDirectory + "Spells/" + sp + ".png", buttonDim.x + 2, buttonDim.y + 2,); + } + + } + let icon = 0; + // Draw icons for the other pages, if applicable + for (let page = 1; page < maxSmallIcons && page <= Math.floor((max_choices - 1) / KinkyDungeonSpellChoiceCountPerPage); page += 1) { + let pg = KDSpellPage + page; + if (pg > Math.floor(max_choices / KinkyDungeonSpellChoiceCountPerPage)) pg -= 1 + Math.floor((max_choices - 1) / KinkyDungeonSpellChoiceCountPerPage); + + // Now we have our page... + let indexPaged = (i + pg * KinkyDungeonSpellChoiceCountPerPage) % (KinkyDungeonSpellChoiceCount); + let spellPaged = KinkyDungeonSpells[KinkyDungeonSpellChoices[indexPaged]]; + let item = KinkyDungeonConsumableChoices[indexPaged] || KinkyDungeonWeaponChoices[indexPaged] || KinkyDungeonArmorChoices[indexPaged]; + let arm = KinkyDungeonArmorChoices[indexPaged]; + let consumable = KinkyDungeonConsumableChoices[indexPaged]; + //let weapon = KinkyDungeonWeaponChoices[index]; + let buttonDimSmall = { + x: buttonDim.x-1 + (buttonDim.wsmall) * ((page - 1) % 2), + y: buttonDim.y-1 - (buttonDim.hsmall) * (1 + Math.floor((page - 1)/2)), + }; + if (spellPaged) { + if (spellPaged.type == "passive" && KinkyDungeonSpellChoicesToggle[indexPaged]) { + FillRectKD(kdcanvas, kdpixisprites, page + "pgspell" + i, { + Left: buttonDimSmall.x - 1, + Top: buttonDimSmall.y - 1, + Width: buttonDim.wsmall+2, + Height: buttonDim.hsmall+2, + Color: "#dbdbdb", + zIndex: 70, + }); + FillRectKD(kdcanvas, kdpixisprites, page + "pgspell2" + i, { + Left: buttonDimSmall.x, + Top: buttonDimSmall.y, + Width: buttonDim.wsmall, + Height: buttonDim.hsmall, + Color: "#101010", + zIndex: 70.1, + }); + } + icon += 1; + DrawButtonKD("SpellCast" + indexPaged, true, buttonDimSmall.x, buttonDimSmall.y, buttonDim.wsmall, buttonDim.hsmall, "", + "rgba(0, 0, 0, 0)", "", "", false, true); + KDDraw(kdcanvas, kdpixisprites, "spellIcon" + icon + "," + indexPaged, KinkyDungeonRootDirectory + "Spells/" + spellPaged.name + ".png" + ,buttonDimSmall.x, buttonDimSmall.y, buttonDim.wsmall, buttonDim.hsmall, undefined, { + zIndex: 71, + }); + //DrawImageEx(KinkyDungeonRootDirectory + "Spells/" + spellPaged.name + ".png", buttonDim.x - buttonDim.wsmall * page, buttonDim.y, { + //Width: buttonDim.wsmall, + //Height: buttonDim.hsmall, + //}); + if ((KinkyDungeoCheckComponents(spellPaged).failed.length > 0 || (spellPaged.components.includes("Verbal") && !KinkyDungeonStatsChoice.get("Incantation") && KinkyDungeonGagTotal() > 0 && !spellPaged.noMiscast))) { + let sp = "SpellFail"; + if (spellPaged.components.includes("Verbal") && !KinkyDungeonStatsChoice.get("Incantation") && KinkyDungeonGagTotal() < 1) { + sp = "SpellFailPartial"; + } + KDDraw(kdcanvas, kdpixisprites, "spellFail" + icon + "," + page + "," + indexPaged, KinkyDungeonRootDirectory + "Spells/" + sp + ".png", + buttonDimSmall.x, buttonDimSmall.y, buttonDim.wsmall, buttonDim.hsmall, undefined, { + zIndex: 72, + }); + + //DrawImageEx(KinkyDungeonRootDirectory + "Spells/" + sp + ".png", buttonDim.x + 2 - buttonDim.wsmall * page, buttonDim.y + 2, { + //Width: buttonDim.wsmall, + //Height: buttonDim.hsmall, + //}); + } + } else if (item) { + + icon += 1; + let prev = KDGetItemPreview({name: item, type: consumable ? Consumable : (arm ? LooseRestraint : Weapon)}); + if (prev) { + KDDraw(kdcanvas, kdpixisprites, "spellIcon" + icon + "," + indexPaged, prev.preview + ,buttonDimSmall.x, buttonDimSmall.y, buttonDim.wsmall, buttonDim.hsmall, undefined, { + zIndex: 71, + }); + if (prev.preview2) + KDDraw(kdcanvas, kdpixisprites, "spellIcon2" + icon + "," + indexPaged, prev.preview2 + ,buttonDimSmall.x, buttonDimSmall.y, buttonDim.wsmall, buttonDim.hsmall, undefined, { + zIndex: 71, + }); + DrawButtonKD("UseItem" + indexPaged, true, buttonDimSmall.x, buttonDimSmall.y, buttonDim.wsmall, buttonDim.hsmall, "", + "rgba(0, 0, 0, 0)", "", "", false, true); + + } + + + if (consumable) { + let con = KinkyDungeonInventoryGetConsumable(consumable); + //if (con) { + DrawTextFitKD((con?.quantity || 0) + "x", buttonDimSmall.x + buttonDim.hsmall - 1, buttonDimSmall.y + buttonDim.hsmall - 6, 50, + "#ffffff", KDTextGray0, 12, "right"); + //} + } + + if (!KinkyDungeonInventoryGet(item)) { + let sp = "SpellFail"; + KDDraw(kdcanvas, kdpixisprites, "spellFail" + icon + "," + page + "," + indexPaged, KinkyDungeonRootDirectory + "Spells/" + sp + ".png", + buttonDimSmall.x, buttonDimSmall.y, buttonDim.wsmall, buttonDim.hsmall, undefined, { + zIndex: 72, + }); + } + } + } + } +} + +function KDCycleSpellPage(reverse: boolean = false, noWrap: boolean = false, force: boolean = false) { + const max_choices = Math.max (KinkyDungeonSpellChoices.length, KinkyDungeonConsumableChoices.length, KinkyDungeonWeaponChoices.length, KinkyDungeonArmorChoices.length) + + if (reverse) { + KDSpellPage -= 1; + } else KDSpellPage += 1; + + if (KDSpellPage < 0) { + if (!noWrap) + KDSpellPage = Math.floor((Math.max(0, (force ? KinkyDungeonSpellChoiceCount : max_choices) - 1))/KinkyDungeonSpellChoiceCountPerPage); + else KDSpellPage = 0; + } + if (KDSpellPage * KinkyDungeonSpellChoiceCountPerPage >= (force ? KinkyDungeonSpellChoiceCount : max_choices)) { + if (!noWrap) + KDSpellPage = 0; + else { + KDSpellPage = Math.floor((Math.max(0, (force ? KinkyDungeonSpellChoiceCount : max_choices) - 1))/KinkyDungeonSpellChoiceCountPerPage); + } + } +} +function KinkyDungeonCanSleep() { + if (KDGameData.CurrentVibration) return false; + else return true; +} + +function KDLinspace(min: number, max: number, steps: number): number[] { + if (steps == 0 || Number.isNaN(steps)) return []; + let spaces: number[] = []; + for (let i = 0; i < steps; i+= 1) { + spaces.push(min + i * (max - min) / steps); + } + return spaces; +} + +function KDSteps(max: number, step: number, maxStep: number = 20): number[] { + if (step == 0 || Number.isNaN(step)) return []; + let spaces: number[] = []; + for (let i = 0; i < Math.ceil(Math.abs(max / step)) && i < maxStep; i+= 1) { + spaces.push(step > 0 ? step * i : max + step * i); + } + return spaces; +} + +/** + * @param x + * @param y + * @param width + */ +function KDDrawStatusBars(x: number, y: number, width: number = 125) { + // Draw labels + let buttonWidth = 48; + let heightPerBar = 24; + let offBarHeight = 7; + let suff = (!KinkyDungeonCanDrink()) ? "Unavailable" : ""; + if (suff == "Unavailable") { + let allowPotions = KinkyDungeonPotionCollar(); + if (allowPotions) + suff = ""; + } + let distRate = KDGetDistractionRate(0); + let attackCost = Math.min(-0.5, KDAttackCost().attackCost); + + + let barWidthOffset2ndSet = 0; + let barHeightOffset2ndSet = 2.5; + let barAmountScale = 0; + let barBaseScale = 1.0; + let flip = KDToggles.FlipStatusBars ? -1 : 1; + + // Draw Stamina + KinkyDungeonBar(x - 5, y + 5 - 2.5*heightPerBar, flip * width * (barBaseScale + barAmountScale*KinkyDungeonStatStaminaMax/KDMaxStatStart), heightPerBar, 100*KinkyDungeonStatStamina/KinkyDungeonStatStaminaMax, + "#4fd658", "#222222", KDGameData.LastSP/KinkyDungeonStatStaminaMax * 100, + KDGameData.LastSP > KinkyDungeonStatStamina ? "#e64539" : "#ffee83", + KDSteps(KinkyDungeonStatStamina/KinkyDungeonStatStaminaMax, attackCost/KinkyDungeonStatStaminaMax), "#283540", "#4fd658"); + DrawTextFitKD( + TextGet("StatStamina").replace("MAX", KinkyDungeonStatStaminaMax*10 + "") + .replace("CURRENT", Math.floor(KinkyDungeonStatStamina*10) + ""), + x, y - 5 - 1.5*heightPerBar, 200, "#ffffff", "#000000", 16, "left", undefined, undefined, 4); + + DrawButtonKDEx("usePotionStamina", (_b) => { + //if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) + // Done, converted to input + KDSendInput("consumable", {item: "PotionStamina", quantity: 1}); + //else KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonPotionGagged"), "orange", 1); + return true; + }, KinkyDungeonItemCount("PotionStamina") && KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax, + x - buttonWidth/1.85 , y - 5 - 2.5*heightPerBar + 10, buttonWidth, 26, "", (KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax && KinkyDungeonItemCount("PotionStamina")) ? "#AAFFAA" : "#333333", + KinkyDungeonRootDirectory + "UI/UsePotion" + ((suff == "Unavailable") ? "" : "Stamina") + suff + ".png", "", false, true); + DrawTextFitKD(KinkyDungeonItemCount("PotionStamina") + 'x', + x - buttonWidth, y - 5 - 2*heightPerBar + heightPerBar/2, buttonWidth, "#ffffff", "#333333", 14, "left"); + + + // Draw mana + KinkyDungeonBar(x - 5, y - 1*heightPerBar, flip * width * (barBaseScale + barAmountScale*KinkyDungeonStatManaMax/KDMaxStatStart), heightPerBar, 100*KinkyDungeonStatMana/KinkyDungeonStatManaMax, + "#4fa4b8", "#222222", KDGameData.LastMP/KinkyDungeonStatManaMax * 100, + KDGameData.LastMP > KinkyDungeonStatMana ? "#2d5782" : "#92e8c0", + KDLinspace(0, 1, Math.ceil(KinkyDungeonStatManaMax/5)), "#4c6885", "#4fa4b8"); + KinkyDungeonBar(x - 5, y - offBarHeight, flip * width * (barBaseScale + barAmountScale*KinkyDungeonStatManaMax/KDMaxStatStart), offBarHeight, 100*KinkyDungeonStatManaPool/KinkyDungeonStatManaPoolMax, + "#efefff", "none", undefined, undefined, undefined, undefined, undefined, 56); + DrawTextFitKD( + TextGet("StatMana").replace("MAX", KinkyDungeonStatManaMax*10 + "") + .replace("CURRENT", Math.floor(KinkyDungeonStatMana*10) + ""), + x, y - 0.5*heightPerBar, 200, "#ffffff", "#000000", 16, "left", undefined, undefined, 4); + DrawButtonKDEx("usePotionMana", (_b) => { + //if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) + // Done, converted to input + KDSendInput("consumable", {item: "PotionMana", quantity: 1}); + //else KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonPotionGagged"), "orange", 1); + return true; + }, KinkyDungeonItemCount("PotionMana") && (KinkyDungeonStatMana < KinkyDungeonStatManaMax || KinkyDungeonStatManaPool < KinkyDungeonStatManaPoolMax), + x - buttonWidth/1.85, y - 1.5*heightPerBar + 10, buttonWidth, 26, "", (KinkyDungeonStatMana < KinkyDungeonStatManaMax && KinkyDungeonItemCount("PotionMana")) ? "#AAAAFF" : "#333333", + KinkyDungeonRootDirectory + "UI/UsePotion" + ((suff == "Unavailable") ? "" : "Mana") + suff + ".png", "", false, true); + + DrawTextFitKD(KinkyDungeonItemCount("PotionMana") + 'x', + x - buttonWidth, y - 1*heightPerBar + heightPerBar/2, buttonWidth, "#ffffff", "#333333", 14, "left"); + + + + // Draw distraction + KinkyDungeonBar(x - 5 + width * barWidthOffset2ndSet, y - 0.75*heightPerBar + heightPerBar * barHeightOffset2ndSet, flip * width * (barBaseScale + barAmountScale*KinkyDungeonStatDistractionMax/KDMaxStatStart), heightPerBar/2, + 100*KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax, "#ff5277", + "#692464", KDGameData.LastAP/KinkyDungeonStatDistractionMax * 100, + KDGameData.LastAP > KinkyDungeonStatDistraction ? "#aaaaaa" : "#ffa1b4", + distRate < 0 ? KDSteps(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax, KDGetDistractionRate(0)/KinkyDungeonStatDistractionMax, 3) : undefined, distRate < 0 ? "#692464" : undefined, distRate < 0 ? "#692464" : undefined); + if (KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax >= 0.05) { + KDDraw(kdcanvas, kdpixisprites, "dist_lower", KinkyDungeonRootDirectory + "UI/Heart.png", + x - heightPerBar*0.32 + (flip < 0 ? width * (1 - KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax) : width * KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax), + y + heightPerBar * barHeightOffset2ndSet - heightPerBar*0.28, + undefined, undefined, undefined, { + zIndex: 57, + }); + KinkyDungeonBar(x - 5 + width * barWidthOffset2ndSet, y - 0.18*heightPerBar + heightPerBar * barHeightOffset2ndSet, flip * width * (barBaseScale + barAmountScale*KinkyDungeonStatDistractionMax/KDMaxStatStart), + offBarHeight, 100*KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax, + "#ff5277", "none", undefined, undefined, undefined, undefined, undefined, 56); + + } + let showRaw = MouseIn( + x - 5 + width * barWidthOffset2ndSet, + y - 5 - 1*heightPerBar + heightPerBar * barHeightOffset2ndSet, + flip * width * (barBaseScale + barAmountScale*KinkyDungeonStatDistractionMax/KDMaxStatStart), + heightPerBar + ); + if (KDToggles.RawDP) { + showRaw = !showRaw; + } + DrawTextFitKD( + !showRaw ? TextGet("StatDistraction") + .replace("PERCENT", "" + Math.round(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * 100)) + : TextGet("StatDistractionHover") + .replace("MAX", KinkyDungeonStatDistractionMax*10 + "") + .replace("CURRENT", Math.floor(KinkyDungeonStatDistraction*10) + "") + .replace("PERCENT", "" + Math.round(KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax * 100)) + + , + x + width * barWidthOffset2ndSet, y + heightPerBar * barHeightOffset2ndSet - 1 - 0.5*heightPerBar, 200, "#ffffff", "#000000", 16, "left", undefined, undefined, 4); + + DrawButtonKDEx("usePotionFrigid", (_b) => { + //if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) + // Done, converted to input + KDSendInput("consumable", {item: "PotionFrigid", quantity: 1}); + //else KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonPotionGagged"), "orange", 1); + return true; + }, KinkyDungeonItemCount("PotionFrigid") && KinkyDungeonStatDistraction > 0, + x - buttonWidth/1.85 + width * barWidthOffset2ndSet, y + heightPerBar * barHeightOffset2ndSet - 1.5*heightPerBar + 10, buttonWidth, 26, "", (KinkyDungeonStatDistraction > 0 && KinkyDungeonItemCount("PotionFrigid")) ? "#333333" : "Pink", + KinkyDungeonRootDirectory + "UI/UsePotion" + ((suff == "Unavailable") ? "" : "Frigid") + suff + ".png", "", false, true); + + DrawTextFitKD(KinkyDungeonItemCount("PotionFrigid") + 'x', + x - buttonWidth + width * barWidthOffset2ndSet, y + heightPerBar * barHeightOffset2ndSet - 1*heightPerBar + heightPerBar/2, buttonWidth, "#ffffff", "#333333", 14, "left"); + + + + // Draw will + KinkyDungeonBar(x - 5 + width * barWidthOffset2ndSet, y - 5 - 2*heightPerBar + heightPerBar * barHeightOffset2ndSet, flip * width * (barBaseScale + barAmountScale*KinkyDungeonStatDistractionMax/KDMaxStatStart), heightPerBar, + 100*KinkyDungeonStatWill/KinkyDungeonStatWillMax, "#ff4444", "#222222", + KDGameData.LastWP/KinkyDungeonStatWillMax * 100, + KDGameData.LastAP > KinkyDungeonStatWill ? "#aa0000" : "#ffee83", + KDLinspace(0, 1, 4), "#222222", "#ff4444"); + DrawTextFitKD( + TextGet("StatWill") + .replace("MAX", KinkyDungeonStatWillMax*10 + "").replace("CURRENT", Math.floor(KinkyDungeonStatWill*10) + ""), + x + width * barWidthOffset2ndSet, y - 5 + heightPerBar * barHeightOffset2ndSet - 1.5*heightPerBar, 200, "#ffffff", "#000000", 16, "left", undefined, undefined, 4); + if (KDEntityBuffedStat(KDPlayer(), "RallyWill", true)) { + KDDraw(kdcanvas, kdpixisprites, "rallywill+", KinkyDungeonRootDirectory + "UI/RallyWill.png", + x - heightPerBar*0.52 + (flip < 0 + ? width * (1 - (KinkyDungeonStatWill + KDEntityBuffedStat(KDPlayer(), "RallyWill", true))/KinkyDungeonStatWillMax) + : width * (KinkyDungeonStatWill + KDEntityBuffedStat(KDPlayer(), "RallyWill", true))/KinkyDungeonStatWillMax), + y + heightPerBar * barHeightOffset2ndSet - heightPerBar*2, + undefined, undefined, undefined, { + zIndex: 57, + }); + } + + DrawButtonKDEx("usePotionWill", (_b) => { + //if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) + // Done, converted to input + KDSendInput("consumable", {item: "PotionWill", quantity: 1}); + //else KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonPotionGagged"), "orange", 1); + return true; + }, KinkyDungeonItemCount("PotionWill") && KinkyDungeonStatWill < KinkyDungeonStatWillMax, + x - buttonWidth/1.85 + width * barWidthOffset2ndSet, y + heightPerBar * barHeightOffset2ndSet - 5 - 2.5*heightPerBar + 10, buttonWidth, 26, "", (KinkyDungeonStatWill < KinkyDungeonStatWillMax && KinkyDungeonItemCount("PotionWill")) ? "#ff4444" : "#333333", + KinkyDungeonRootDirectory + "UI/UsePotion" + ((suff == "Unavailable") ? "" : "Will") + suff + ".png", "", false, true); + + DrawTextFitKD(KinkyDungeonItemCount("PotionWill") + 'x', + x - buttonWidth + width * barWidthOffset2ndSet, y + heightPerBar * barHeightOffset2ndSet - 5 - 2*heightPerBar + heightPerBar/2, buttonWidth, "#ffffff", "#333333", 14, "left"); + + + + +} + +function KDDrawWeaponSwap(x: number, y: number): boolean { + let heightPerBar = 24; + let buttonWidth = 48; + let chargeX = 1775; + + //let stats = KDGetStatsWeaponCast(); + + // Draw ancient + if (KDGameData.AncientEnergyLevel > 0 || KinkyDungeonInventoryGet("AncientPowerSource")) { + KinkyDungeonBar(chargeX + 5, 830 + 0.25*heightPerBar - 72, 200, heightPerBar*0.5, 100*KDGameData.AncientEnergyLevel, "#ffee83", "#3b2027", 100*KDGameData.OrigEnergyLevel, "#ffffff"); + + DrawTextFitKD(TextGet("StatAncient").replace("PERCENT", Math.round(KDGameData.AncientEnergyLevel*1000) + ""), + chargeX + 100, 830 - 72, 200 , (KDGameData.AncientEnergyLevel > 0.01) ? "#ffffff" : "pink", "#333333", 16, "center"); + DrawButtonKDEx("potionAncient", + (_bdata) => { + KDSendInput("consumable", {item: "AncientPowerSource", quantity: 1}); + return true; + }, KDGameData.AncientEnergyLevel < 1.0 && KinkyDungeonItemCount("AncientPowerSource") != 0, + chargeX-buttonWidth, 830 - 0.5*heightPerBar + 10 - 72, buttonWidth, 26, "", + (KDGameData.AncientEnergyLevel < 1.0 && KinkyDungeonItemCount("AncientPowerSource")) ? "#ffee83" : "#333333", + KinkyDungeonRootDirectory + "UI/UsePotionAncient.png", "", false, true); + + DrawTextFitKD("x" + KinkyDungeonItemCount("AncientPowerSource"), chargeX, 830 + heightPerBar/2 - 72, buttonWidth, "#ffffff", "#333333", 18, "right"); + } + + + let width = 144; + /*let XX = x - 48; + let YY = y; + let spriteSize = 48; + let tooltip = false; + + for (let s of Object.entries(stats)) { + let stat = s[1]; + if (stat.count) + DrawTextFitKD(stat.count, XX + spriteSize/2, YY + spriteSize/2 - 10, spriteSize, stat.countcolor || "#ffffff", "#000000", + 16, undefined, 114, 0.8, 5); + + if (!tooltip && MouseIn(XX, YY - Math.ceil(spriteSize/2), spriteSize, spriteSize)) { + DrawTextFitKD(stat.text, x - 400, y - 48, 600, stat.color, "#000000", 22, "left", 160, 1.0, 8); + tooltip = true; + if (stat.click) { + DrawButtonKDEx("statHighlight" + stat[0], (bdata) => { + KDSendInput("buffclick", { + click: stat.click, + buff: stat.buffid, + }); + return true; + }, true, + XX, YY - Math.ceil(spriteSize/2), spriteSize, spriteSize, undefined, "#ffffff", + undefined, undefined, false, true, undefined, undefined, undefined, + { + zIndex: 10, + }); + } + } + + KDDraw(kdstatusboard, kdpixisprites, "wstat" + YY + stat[0], KinkyDungeonRootDirectory + "Buffs/" + (stat.icon || "buff/buff") + ".png", + XX, YY - Math.ceil(spriteSize/2) , spriteSize, spriteSize, undefined, { + zIndex: 151, + }); + + YY += spriteSize; + }*/ + + let hover = false; + + if (KDGameData.PreviousWeapon?.length > 0) { + let ii = 0; + for (let wep of KDGameData.PreviousWeapon) { + if (ii >= KDMaxPreviousWeapon) break; + let Index = ii; + if (wep && KDWeapon({name: wep}) && DrawButtonKDEx("previousweapon" + wep + "," + ii,(_bdata) => { + if (!KinkyDungeonControlsEnabled()) return false; + if (KinkyDungeonInventoryGet(wep)) + KDSwitchWeapon(wep, Index); + else + KDSwitchWeapon("Unarmed", Index); + return true; + }, KDGameData.PreviousWeapon != undefined, x + 10 + 0.45*width + (ii*0.35*width), y-0.35*width, 0.35*width, 0.35*width, "", "#ffffff", + KinkyDungeonRootDirectory + "Items/" + KDWeapon({name: wep})?.name + ".png", + undefined, undefined, KDWeaponSwitchPref != ii, !KinkyDungeonInventoryGet(wep) ? "#ff5277" : undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySwitchWeapon[ii]), + scaleImage: true, + })) { + if (KDWeapon(KinkyDungeonInventoryGetWeapon(wep))) { + let inv = KinkyDungeonInventoryGetWeapon(wep); + if (inv) KinkyDungeonDrawInventorySelected(KDGetItemPreview(inv), false, true, 0); + } + hover = true; + } + ii += 1; + } + } + if (KinkyDungeonPlayerWeapon && KinkyDungeonInventoryGetWeapon(KinkyDungeonPlayerWeapon)) { + DrawTextFitKD(TextGet("StatWeapon") + KDGetItemName({name: KinkyDungeonPlayerWeapon, type: Weapon, id: -1}), + x + 0.45/2*width, y - 16, width, "#ffffff", "#333333", 16); + } + if (DrawButtonKDEx("switchWeapon", (_bdata) => { + if (!KinkyDungeonControlsEnabled()) return false; + KDSwitchWeapon(); + return true; + }, KDGameData.PreviousWeapon != undefined, x, y - 0.45*width, 0.45*width, 0.45*width, "", "#ffffff", + KinkyDungeonPlayerWeapon && KinkyDungeonInventoryGetWeapon(KinkyDungeonPlayerWeapon) ? + KinkyDungeonRootDirectory + "Items/" + KDWeapon({name: KinkyDungeonPlayerWeapon})?.name + ".png" + : KinkyDungeonRootDirectory + "Items/Unarmed.png", + undefined, undefined, true, undefined, undefined, undefined, { + //hotkey: KDHotkeyToText(KinkyDungeonKeySwitchWeapon[0]), + scaleImage: true, + })) { + if (KDWeapon(KinkyDungeonInventoryGetWeapon(KinkyDungeonPlayerWeapon))) { + let inv = KinkyDungeonInventoryGetWeapon(KinkyDungeonPlayerWeapon); + if (inv) KinkyDungeonDrawInventorySelected(KDGetItemPreview(inv), false, true, 0); + } + } + return hover; +} + +function KinkyDungeonDrawActionBar(_x: number, _y: number) { + let str = ""; + let BalanceOffset = KDToggles.BuffSide ? 850 : 800; + let BalanceSpacing = 75; + let II = 0; + if (KDGameData.Balance < 1 && !KinkyDungeonStatsChoice.get("TrustFall")) { + DrawTextFitKDTo(kdstatusboard, + TextGet(KDBalanceSprint() ? "KDBalance" : "KDBalanceNoSprint") + .replace("AMNT", "" + Math.round(KDGameData.Balance * 100)), + 1000, BalanceOffset - BalanceSpacing*(II), 300, "#ffffff", KDTextGray2, + 24, "left", 110, 0.9); + KinkyDungeonBarTo(kdstatusboard, 1000, BalanceOffset + 8 - BalanceSpacing*(II), 500, 12, 100*KDGameData.Balance, + "#4fd658", "#283540", KDGameData.Balance * 100, "#ffee83", + KDSteps(KDGameData.Balance, -KDGetBalanceCost()*1.5), "#283540", "#4fd658"); + + if (!KDGameData.Training) KDGameData.Training = {}; + DrawTextFitKDTo(kdstatusboard, TextGet("KDBalanceTraining") + .replace("AMNT", "" + (KDGameData.Training.Heels?.training_stage || 0)), + 1500, BalanceOffset - BalanceSpacing*(II), 200, "#ffffff", KDTextGray2, + 10, "right", 111, 0.9); + II++; + } + if (KDGameData.DelayedActions?.length > 0) { + let action = KDGameData.DelayedActions[0]; + if (action.maxtime > 0 && action.tick != undefined) { + DrawTextFitKDTo(kdstatusboard, + TextGet("KDDelayedAction_" + (action.commit || action.update)) + .replace("AMNT", "" + Math.round(action.tick)), + 1000, BalanceOffset - BalanceSpacing*(II), 300, "#ffffff", KDTextGray2, + 24, "left", 110, 0.9); + KinkyDungeonBarTo(kdstatusboard, 1000, BalanceOffset + 8 - BalanceSpacing*(II), + 500, 12, 100*(action.tick / action.maxtime), + "#aaaaaa", "#222222", undefined, undefined, + KDSteps(action.tick, -1), + "#283540", "#4fd658"); + II++; + } + + } + + if (DrawButtonKDEx("RestHide", (_bdata) => { + KinkyDungeonDrawStruggle += 1; + if (KinkyDungeonDrawStruggle > 3) KinkyDungeonDrawStruggle = 0; + return true; + }, true, 510, 925, 60, 60, "", KinkyDungeonStruggleGroups.length > 0 ? "#ffffff" : "#333333", KinkyDungeonRootDirectory + "Hide" + ( + KinkyDungeonDrawStruggle == KDDrawStruggleEnum.FULL ? "Full" : + (KinkyDungeonDrawStruggle == KDDrawStruggleEnum.MOST ? "Most" : + (KinkyDungeonDrawStruggle == KDDrawStruggleEnum.STRUGGLE ? "Struggle" : + (KinkyDungeonDrawStruggle == KDDrawStruggleEnum.NONE ? "True" : + "False")))) + ".png", "")) str = "KDHideRest"; + if (MouseIn(0, 0, 500, 1000) || MouseIn(500, 900, 320, 200) || KDPlayerSetPose || KDToggleXRay) { + if (StandalonePatched) { + if (DrawButtonKDEx("SetPose", (_bdata) => { + KDPlayerSetPose = !KDPlayerSetPose; + return true; + }, true, 650, 925, 60, 60, "", "#ffffff", KinkyDungeonRootDirectory + "Poses/SetPose.png", "", false, false, + KDPlayerSetPose ? KDTextGray3 : KDButtonColor)) str = "KDSetPose"; + } + if (DrawButtonKDEx("ToggleXray", (_bdata) => { + KDToggleXRay += 1; + if (KDToggleXRay > (StandalonePatched ? 2 : 1)) KDToggleXRay = 0; + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(KinkyDungeonPlayer, false, true); + return true; + }, true, 580, 925, 60, 60, "", "#ffffff", KinkyDungeonRootDirectory + "UI/XRay" + KDToggleXRay + ".png", "", false, false, + KDToggleXRay ? KDTextGray3 : KDButtonColor)) str = "KDXRay"; + } + if (MouseIn(0, 0, 500, 1000) || MouseIn(500, 900, 320, 200) || KDBulletTransparency || KDMapData.Bullets?.length > 0) { + if (DrawButtonKDEx("SetTransparentBullets", (_bdata) => { + KDBulletTransparency = !KDBulletTransparency; + return true; + }, true, 720, 925, 60, 60, "", "#ffffff", KinkyDungeonRootDirectory + "UI/BulletTransparency.png", "", false, false, + KDBulletTransparency ? KDTextGray3 : KDButtonColor, undefined, undefined)) str = "KDBulletTransparency"; + } + if (KDPlayerSetPose) { + KDPlayerDrawPoseButtons(KinkyDungeonPlayer); + } + + + let actionBarWidth = 64; + let actionbarHeight = 60; + let actionBarSpacing = actionBarWidth + 5; + //let actionBarSpacingV = actionbarHeight + 5; + //let actionBarVertStart = 560; + let actionBarII = 0; + let actionBarXX = 2000 - 5 * actionBarSpacing; + let actionBarYY = 925; + + + let resourcesX = 505; + let resourceSpacing = 50; + let resourcesIndex = 0; + let resourcesY = 825 - 10 - 1 * resourceSpacing; + + + KDDraw(kdcanvas, kdpixisprites, "gold", KinkyDungeonRootDirectory + "Items/Gold.png", resourcesX - 8, resourcesY - 10 + resourcesIndex*resourceSpacing, 80, 80, undefined, { + zIndex: 90 + }); + DrawTextFitKD("" + KinkyDungeonGold, resourcesX + 32, resourcesY + 40 + resourcesIndex*resourceSpacing, 80, "#ffffff", "#333333", 18, undefined, 90); + if (MouseIn(resourcesX - 10, resourcesY + resourcesIndex*resourceSpacing, 80, 80)) + DrawTextKD(TextGet("KinkyDungeonInventoryItemGold"), + resourcesX + 60, MouseY, "#ffffff", "#333333", 24, "left"); + resourcesIndex--; + + if (KDShowQuickInv() || (KinkyDungeonDrawStruggle == KDDrawStruggleEnum.FULL || KinkyDungeonDrawStruggle == KDDrawStruggleEnum.STRUGGLE || MouseIn(0, 0, 500, 1000))) { + KDDraw(kdcanvas, kdpixisprites, "pick", KinkyDungeonRootDirectory + "Items/Pick.png", resourcesX, resourcesY + resourcesIndex*resourceSpacing, 50, 50, undefined, { + zIndex: 90 + }); + DrawTextFitKD("" + KinkyDungeonItemCount("Pick"), resourcesX + 25, resourcesY + 40 + resourcesIndex*resourceSpacing, 50, "#ffffff", "#333333", 18, undefined, 90); + if (MouseIn(resourcesX, resourcesY + resourcesIndex*resourceSpacing, 50, 50)) + DrawTextKD(TextGet("KinkyDungeonInventoryItemLockpick"), + resourcesX + 60, MouseY, "#ffffff", "#333333", 24, "left"); + + + resourcesIndex--; + KDDraw(kdcanvas, kdpixisprites, "redkey", KinkyDungeonRootDirectory + "Items/RedKey.png", resourcesX, resourcesY + resourcesIndex*resourceSpacing, 50, 50, undefined, { + zIndex: 90 + }); + DrawTextFitKD("" + KinkyDungeonItemCount("RedKey"), resourcesX + 25, resourcesY + 40 + resourcesIndex*resourceSpacing, 50, "#ffffff", "#333333", 18, undefined, 90); + if (MouseIn(resourcesX, resourcesY + resourcesIndex*resourceSpacing, 50, 50)) + DrawTextKD(TextGet("KinkyDungeonInventoryItemRedKey"), + resourcesX + 60, MouseY, "#ffffff", "#333333", 24, "left"); + + resourcesIndex--; + + + if (KinkyDungeonItemCount("BlueKey") > 0) { + KDDraw(kdcanvas, kdpixisprites, "bluekey", KinkyDungeonRootDirectory + "Items/BlueKey.png", resourcesX, resourcesY + resourcesIndex*resourceSpacing, 50, 50, undefined, { + zIndex: 90 + }); + DrawTextFitKD("" + KinkyDungeonItemCount("BlueKey"), resourcesX + 25, resourcesY + 40 + resourcesIndex*resourceSpacing, 50, "#ffffff", "#333333", 18, undefined, 90); + if (MouseIn(resourcesX, resourcesY + resourcesIndex*resourceSpacing, 50, 50)) + DrawTextKD(TextGet("KinkyDungeonInventoryItemMagicKey"), + resourcesX + 60, MouseY, "#ffffff", "#333333", 24, "left"); + } + } + + + if (DrawButtonKDEx("openQuickInv", (_b) => { + KinkyDungeonShowInventory = !KinkyDungeonShowInventory; + return true; + }, true, 510, 825, 60, 90, "", "#ffffff", KinkyDungeonRootDirectory + (KinkyDungeonShowInventory ? "BackpackOpen.png" : "Backpack.png"), "", + undefined, undefined, undefined, undefined, undefined, + { + hotkey: KDHotkeyToText(KinkyDungeonKeyMenu[0]), + })) str = "KDQuickInv"; + + + // Weapon Switch + if (KDDrawWeaponSwap(actionBarXX-5 + 72, actionBarYY - 5 - 80)) { + // Draw the tooltip and show the weapon info + str = "KDSwitchWeapon"; + + } + if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.special) { + if (MouseIn(580, 825, 50, 90)) DrawTextFitKD(TextGet("KinkyDungeonSpecial" + KinkyDungeonPlayerDamage.name), MouseX, MouseY - 150, 750, "#ffffff", "#333333"); + DrawButtonKDEx("rangedattackButton", (_b) => { + return KinkyDungeonRangedAttack(); + }, true, 580, 825, 50, 90, "", "#ffffff", KinkyDungeonRootDirectory + "Ranged.png", "", + undefined, undefined, undefined, undefined, undefined, + { + hotkey: KDHotkeyToText(KinkyDungeonKeyWeapon[0]), + }); + } + + + + // Vertical + /* + actionBarII = 0; + if (!KDToggles.TransparentUI) { + DrawRectKD( + kdcanvas, kdpixisprites, "actionvborder", { + Left: 1990 - actionBarWidth - 5, Top: actionBarVertStart - 5, Width: actionBarWidth + 10, + Height: (5+actionbarHeight)*4 + 10, + Color: KDUIColorHighlight, alpha: KDUIAlphaHighlight, zIndex: -2, + LineWidth: 2, + } + ); + FillRectKD( + kdcanvas, kdpixisprites, "actionvbg", { + Left: 1990 - actionBarWidth - 5, Top: actionBarVertStart - 5, Width: actionBarWidth + 10, + Height: (5+actionbarHeight)*4 + 10, + Color: KDUIColor, alpha: KDUIAlpha, zIndex: -1 + } + ); + } + if (DrawButtonKDEx("toggleInspect", (bdata) => { + KinkyDungeonInspect = !KinkyDungeonInspect; + return true; + }, true, 1990 - actionBarWidth, actionBarVertStart + actionBarSpacingV*actionBarII++, actionBarWidth, actionbarHeight, + "", "", KinkyDungeonRootDirectory + (KinkyDungeonInspect ? "UI/Inspect" : "UI/Inspect") + ".png", + undefined, undefined, !KinkyDungeonInspect, KDTextGray05, undefined, false, {alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[5]), + })) str = "KDInspect"; + + // Auto Struggle Button + if (DrawButtonKDEx("AutoStruggle", (bdata) => { + if (!KinkyDungeonControlsEnabled()) return false; + KDAutoStruggleClick(); + return true; + }, true, 1990 - actionBarWidth, actionBarVertStart + actionBarSpacingV*actionBarII++, actionBarWidth, actionbarHeight, "", "", + KinkyDungeonRootDirectory + ("UI/AutoStruggle.png"), undefined, undefined, !KinkyDungeonAutoWaitStruggle, KDTextGray05, undefined, false, + { + alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[3]), + })) str = "KDAutoStruggle"; + + // Pass button + if (DrawButtonKDEx("togglePass", (bdata) => { + KinkyDungeonToggleAutoPass = !KinkyDungeonToggleAutoPass; + if (KinkyDungeonToggleAutoPass) { + KDSetFocusControl("AutoPass"); + } else { + KDSetFocusControl(""); + } + return true; + }, true, 1990 - actionBarWidth, actionBarVertStart + actionBarSpacingV*actionBarII++, actionBarWidth, actionbarHeight, "", "", + KinkyDungeonRootDirectory + (KinkyDungeonToggleAutoPass ? "UI/Pass.png" : "UI/NoPass.png"), + undefined, undefined, !KinkyDungeonToggleAutoPass, KDTextGray05, undefined, false, {alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[1]), + })) str = "KDPass"; + + if (DrawButtonKDEx("toggleFastMove", (bdata) => { + if (!KinkyDungeonFastMoveSuppress) + KinkyDungeonFastMove = !KinkyDungeonFastMove; + KinkyDungeonFastMoveSuppress = false; + KinkyDungeonFastMovePath = []; + KDSetFocusControl("AutoPath"); + return true; + }, true, 1990 - actionBarWidth, actionBarVertStart + actionBarSpacingV*actionBarII++, actionBarWidth, actionbarHeight, + "", "", KinkyDungeonRootDirectory + (KinkyDungeonFastMove ? "FastMove" : "FastMoveOff") + ".png", + undefined, undefined, !KinkyDungeonFastMove, KDTextGray05, undefined, false, {alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[4]), + })) str = "KDAutoPath";*/ + + // Horizontal second layer + actionBarII = 0; + /*if (!KDToggles.TransparentUI) { + DrawRectKD( + kdcanvas, kdpixisprites, "actionvborder", { + Left: actionBarXX + actionBarSpacing*actionBarII - 5, Top: actionBarYY - 80 - 5, Width: actionBarSpacing*4 + 5, + Height: 80, + Color: KDUIColorHighlight, alpha: KDUIAlphaHighlight, zIndex: -2, + LineWidth: 2, + } + ); + FillRectKD( + kdcanvas, kdpixisprites, "actionvbg", { + Left: actionBarXX + actionBarSpacing*actionBarII - 5, Top: actionBarYY - 80 - 5, Width: actionBarSpacing*4 + 10, + Height: 80, + Color: KDUIColor, alpha: KDUIAlpha, zIndex: -1 + } + ); + }*/ + + + // Crouch button + if (DrawButtonKDEx("toggleCrouch", (_bdata) => { + KDSendInput("crouch", {}); + + return true; + }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY - 80, actionBarWidth, actionbarHeight, "", "", + KinkyDungeonRootDirectory + (KDGameData.Crouch ? "UI/CrouchOn.png" : "UI/CrouchOff.png"), + undefined, undefined, !KDGameData.Crouch, KDTextGray05, undefined, false, {alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[9]), + hotkeyPress: KinkyDungeonKeyToggle[9], + })) str = "KDCrouch"; + + // Pass button + if (DrawButtonKDEx("togglePass", (_bdata) => { + KinkyDungeonToggleAutoPass = !KinkyDungeonToggleAutoPass; + if (KinkyDungeonToggleAutoPass) { + KDSetFocusControl("AutoPass"); + } else { + KDSetFocusControl(""); + } + return true; + }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY - 80, actionBarWidth, actionbarHeight, "", "", + KinkyDungeonRootDirectory + (KinkyDungeonToggleAutoPass ? "UI/Pass.png" : "UI/NoPass.png"), + undefined, undefined, !KinkyDungeonToggleAutoPass, KDTextGray05, undefined, false, {alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[1]), + })) { + KDTrySetFocusControl("AutoPass"); + str = "KDPass"; + } + + if (DrawButtonKDEx("toggleFastMove", (_bdata) => { + if (!KinkyDungeonFastMoveSuppress) + KinkyDungeonFastMove = !KinkyDungeonFastMove; + KinkyDungeonFastMoveSuppress = false; + KinkyDungeonFastMovePath = []; + KDSetFocusControl("AutoPath"); + return true; + }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY - 80, actionBarWidth, actionbarHeight, + "", "", KinkyDungeonRootDirectory + (KinkyDungeonFastMove ? "FastMove" : "FastMoveOff") + ".png", + undefined, undefined, !KinkyDungeonFastMove, KDTextGray05, undefined, false, {alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[4]), + })) { + KDTrySetFocusControl("AutoPath") + str = "KDAutoPath"; + } + + // Auto Struggle Button + if (DrawButtonKDEx("AutoStruggle", (_bdata) => { + if (!KinkyDungeonControlsEnabled()) return false; + KDAutoStruggleClick(); + return true; + }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY - 80, actionBarWidth, actionbarHeight, "", "", + KinkyDungeonRootDirectory + ("UI/AutoStruggle.png"), undefined, undefined, !KinkyDungeonAutoWaitStruggle, KDTextGray05, undefined, false, + { + alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[3]), + })) str = "KDAutoStruggle"; + + if (DrawButtonKDEx("toggleInspect", (_bdata) => { + KDInteracting = false; + KinkyDungeonInspect = !KinkyDungeonInspect; + KinkyDungeonUpdateLightGrid = true; // Rerender since cam moved + KDLastForceRefresh = CommonTime() - KDLastForceRefreshInterval - 10; + return true; + }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY - 80, actionBarWidth, actionbarHeight, + "", "", KinkyDungeonRootDirectory + (KinkyDungeonInspect ? "UI/Inspect" : "UI/Inspect") + ".png", + undefined, undefined, !KinkyDungeonInspect, KDTextGray05, undefined, false, {alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[5]), + })) str = "KDInspect"; + + // Horizontal + actionBarII = 0; + + if (!KDToggles.TransparentUI) { + DrawRectKD( + kdcanvas, kdpixisprites, "actionborder", { + Left: actionBarXX-5, Top: actionBarYY - 5 - 80, Width: actionBarSpacing*5 + 5, + Height: actionbarHeight + 25 +80, + Color: KDUIColorHighlight, alpha: KDUIAlphaHighlight, zIndex: -2, + LineWidth: 2, + } + ); + FillRectKD( + kdcanvas, kdpixisprites, "actionbg", { + Left: actionBarXX-5, Top: actionBarYY - 5 -80, Width: actionBarSpacing*5 + 5, + Height: actionbarHeight + 25 +80, + Color: KDUIColor, alpha: KDUIAlpha, zIndex: -1 + } + ); + } + + // Sprint button + if (DrawButtonKDEx("toggleSprint", () => { + KinkyDungeonToggleAutoSprint = !KinkyDungeonToggleAutoSprint; return true; + },true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, actionbarHeight, + "", "", KinkyDungeonRootDirectory + (KinkyDungeonToggleAutoSprint ? "UI/Sprint.png" : "UI/NoSprint.png"), + undefined, undefined, !KinkyDungeonToggleAutoSprint, KDTextGray05, undefined, false, {alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeySprint[0]), + })) str = "KDSprint"; + + // Door button + if (DrawButtonKDEx("interact", (_bdata) => { + KDInteracting = !KDInteracting; + KinkyDungeonInspect = false; + return true; + }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, actionbarHeight, + "", "", KinkyDungeonRootDirectory + ("UI/Interact.png"), + undefined, undefined, !KDInteracting, KDTextGray05, undefined, false, {alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[2]), + })) str = "KDDoor"; + + // Play Button + let playColor = "#283540"; + if (KinkyDungeonCanTryOrgasm()) { + playColor = "#ff5277"; + } else if (KinkyDungeonCanPlayWithSelf()) { + if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax * KinkyDungeonDistractionSleepDeprivationThreshold) playColor = "#4b1d52"; + else if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax * 0.5) playColor = "#692464"; + else if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax * 0.75) playColor = "#9c2a70"; + else playColor = "#cc2f7b"; + } else playColor = "#283540"; + if (DrawButtonKDEx("PlayButton", (_bdata) => { + if (!KinkyDungeonControlsEnabled()) return false; + if (KinkyDungeonCanTryOrgasm()) { + // Done, converted to input + KDSendInput("tryOrgasm", {}); + } else if (KinkyDungeonCanPlayWithSelf()) { + // Done, converted to input + KDSendInput("tryPlay", {}); + } else { + KinkyDungeonSendActionMessage(10, TextGet("KDNotFeeling"), "#ff5277", 1, false, true); + } + return true; + }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, actionbarHeight, "", playColor, + KinkyDungeonRootDirectory + (KinkyDungeonCanTryOrgasm() ? "UI/LetGo.png" : (KDGameData.OrgasmTurns > KinkyDungeonOrgasmTurnsCrave ? "UI/Edged.png" : "UI/Play.png")), + undefined, undefined, !KinkyDungeonCanTryOrgasm(), KDTextGray05, undefined, false, { + alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[8]), + hotkeyPress: KinkyDungeonKeyToggle[8], + })) str = KinkyDungeonCanTryOrgasm() ? "KDLetGo" : "KDPlay"; + + // Wait Button + if (DrawButtonKDEx("WaitButton", (_bdata) => { + if (!KinkyDungeonControlsEnabled()) return false; + if (KinkyDungeonAutoWait || KDAutoWaitDelayed) { + KinkyDungeonAutoWait = false; + KinkyDungeonTempWait = false; + KinkyDungeonAutoWaitSuppress = false; + KDSetFocusControl(""); + } else { + KinkyDungeonAutoWait = true; + KinkyDungeonTempWait = true; + KinkyDungeonAutoWaitSuppress = true; + KinkyDungeonSleepTime = CommonTime() + 100; + KDSetFocusControl("AutoWait"); + } + return true; + }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, actionbarHeight, "", "", + KinkyDungeonRootDirectory + (KDGameData.KinkyDungeonLeashedPlayer ? "UI/WaitJail.png" : "UI/Wait.png"), undefined, undefined, !KinkyDungeonAutoWait, KDTextGray05, + undefined, false, { + alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[6]), + hotkeyPress: KinkyDungeonKeyToggle[6], + })) { + KDTrySetFocusControl("AutoWait"); + + str = "KDWait"; + } + + // Make Noise button + if (DrawButtonKDEx("HelpButton", (_bdata) => { + if (!KinkyDungeonControlsEnabled()) return false; + KDSendInput("noise", {}); + return true; + }, true, actionBarXX + actionBarSpacing*actionBarII++, actionBarYY, actionBarWidth, actionbarHeight, "", "#aaaaaa", + KinkyDungeonRootDirectory + ("UI/Help.png"), undefined, undefined, true, KDTextGray05, undefined, false, { + alpha: 1.0, + hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[7]), + hotkeyPress: KinkyDungeonKeyToggle[7], + })) str = "KDHelp"; + + + + let focusTooltip = ""; + + if (KDFocusControls && KDFocusControlButtons[KDFocusControls] && !KDModalArea) { + let list = Object.entries(KDFocusControlButtons[KDFocusControls]); + let bWidth = 60; + let bHeight = 60; + let spacing = bWidth + 10; + let xx = 1710 - spacing * list.length; + let yy = 600; + + let setTo = KDFocusControls; + + for (let button of list) { + DrawButtonKDEx("focus" + KDFocusControls + button[0], (_bdata) => { + KDSetFocusControlToggle(setTo + button[0], !(KDGameData.FocusControlToggle && KDGameData.FocusControlToggle[setTo + button[0]])); + KDFocusControls = setTo; // This is to refresh after KDProcessButtons + return true; + }, true, xx, yy - bHeight + 15, bWidth, bHeight, + "", "", KinkyDungeonRootDirectory + `UI/${KDFocusControls}/${ button[0]}.png`, + undefined, undefined, !KDGameData.FocusControlToggle || !KDGameData.FocusControlToggle[KDFocusControls + button[0]], KDTextGray1, undefined, false, { + alpha: 0.7, + zIndex: 110, + //hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[2]), + }); + if (MouseIn(xx, yy - bHeight + 15, bWidth, bHeight)) focusTooltip = "KDFocusControls" + setTo + button[0]; + xx += spacing; + } + if (focusTooltip) { + DrawTextFitKD(TextGet(focusTooltip), Math.min(1700, MouseX), yy - 80, 250, "#ffffff", undefined, 18); + } + } + + actionBarII = 0; + if (str) { + DrawTextFitKD(TextGet(str), Math.min(1700, Math.max(700, MouseX)), 750, 250, "#ffffff", undefined, 18); + } + + //} +} + +function KDAutoStruggleClick() { + if (KinkyDungeonAutoWaitStruggle) { + KDDisableAutoWait(); + KinkyDungeonTempWait = false; + KinkyDungeonAutoWaitSuppress = false; + } else { + KinkyDungeonAutoWaitStruggle = true; + KinkyDungeonSleepTime = CommonTime() + 100; + } +} + +function KinkyDungeonActivateWeaponSpell(instant = false) { + if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.special) { + + let energyCost = KinkyDungeonPlayerDamage.special.energyCost; + if (KDGameData.AncientEnergyLevel < energyCost) { + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonInsufficientEnergy"), "#ff5277", 1); + return true; + } + if (KinkyDungeonPlayerDamage.special.prereq && KDPrereqs[KinkyDungeonPlayerDamage.special.prereq] && !KDPrereqs[KinkyDungeonPlayerDamage.special.prereq](KinkyDungeonPlayerEntity, undefined, {})) { + KinkyDungeonSendActionMessage(8, TextGet("KDPrereqFail" + KinkyDungeonPlayerDamage.special.prereq), "#ff5277", 1); + return true; + } + if (KinkyDungeonPlayerDamage.special.selfCast) { + KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; + KDStartSpellcast(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonFindSpell(KinkyDungeonPlayerDamage.special.spell, true), undefined, KinkyDungeonPlayerEntity, undefined, { + targetingSpellWeapon: KinkyDungeonTargetingSpellWeapon, + }); + KinkyDungeonTargetingSpellWeapon = null; + //KinkyDungeonCastSpell(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, , undefined, undefined, undefined); + } else if (!instant) { + KinkyDungeonTargetingSpell = KinkyDungeonFindSpell(KinkyDungeonPlayerDamage.special.spell, true); + KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; + KinkyDungeonTargetingSpellItem = null; + KDModalArea = false; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = null; + } else { + KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; + KDStartSpellcast(KinkyDungeonTargetX, KinkyDungeonTargetY, KinkyDungeonFindSpell(KinkyDungeonPlayerDamage.special.spell, true), undefined, KinkyDungeonPlayerEntity, undefined, { + targetingSpellWeapon: KinkyDungeonTargetingSpellWeapon, + }); + //KinkyDungeonCastSpell(KinkyDungeonTargetX, KinkyDungeonTargetY, KinkyDungeonFindSpell(KinkyDungeonPlayerDamage.special.spell, true), undefined, KinkyDungeonPlayerEntity, undefined); + KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; + } + return true; + } + return false; +} + +function KinkyDungeonRangedAttack() { + if (!KinkyDungeonPlayerDamage.special) return; + if (KinkyDungeonPlayerDamage.special.type) { + if (KinkyDungeonPlayerDamage.special.type == "hitorspell") { + KinkyDungeonTargetingSpell = {name: "WeaponAttack", components: [], level:1, type:"special", special: "weaponAttackOrSpell", noMiscast: true, manacost: 0, + onhit:"", time:25, power: 0, range: KinkyDungeonPlayerDamage.special.range ? KinkyDungeonPlayerDamage.special.range : 1.5, size: 1, damage: ""}; + KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; + KinkyDungeonTargetingSpellItem = null; + KDModalArea = false; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = null; + return true; + } else if (KinkyDungeonPlayerDamage.special.type == "attack") { + KinkyDungeonTargetingSpell = {name: "WeaponAttack", components: [], level:1, type:"special", special: "weaponAttack", noMiscast: true, manacost: 0, + onhit:"", time:25, power: 0, range: KinkyDungeonPlayerDamage.special.range ? KinkyDungeonPlayerDamage.special.range : 1.5, size: 1, damage: ""}; + + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; + KDModalArea = false; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = null; + return true; + } else if (KinkyDungeonPlayerDamage.special.type == "ignite") { + KDCreateEffectTile(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, { + name: "Ignition", + duration: 1, + }, 0); + return true; + } /*else if (KinkyDungeonPlayerDamage.special.type == "attack") { + KinkyDungeonTargetingSpell = {name: "WeaponAttack", components: [], level:1, type:"special", special: "weaponAttack", noMiscast: true, + onhit:"", time:25, power: 0, range: KinkyDungeonPlayerDamage.special.range ? KinkyDungeonPlayerDamage.special.range : 1.5, size: 1, damage: ""}; + KinkyDungeonTargetingSpellWeapon = KinkyDungeonPlayerDamage; + return true; + }*/ else { + return KinkyDungeonActivateWeaponSpell(); + } + + } + return false; +} + +function KinkyDungeonHandleHUD() { + if (KinkyDungeonDrawState == "Game") { + KDSetFocusControl(""); + if (KDHandleGame()) return true; + } else if (KinkyDungeonDrawState == "Orb") { + // Done, converted to input + return KinkyDungeonHandleOrb(); + } else if (KinkyDungeonDrawState == "Heart") { + // Done, converted to input + return KinkyDungeonHandleHeart(); + } else if (KinkyDungeonDrawState == "Magic") { + // Done, converted to input + return KinkyDungeonHandleMagic(); + } else if (KinkyDungeonDrawState == "MagicSpells") { + // Nothing to convert + return KinkyDungeonHandleMagicSpells(); + } else if (KinkyDungeonDrawState == "Inventory") { + // Done, converted to input + return KinkyDungeonHandleInventory(); + } else if (KinkyDungeonDrawState == "Logbook") { + // Done, converted to input + return KinkyDungeonHandleLore(); + } else if (KinkyDungeonDrawState == "Reputation") { + // Done, converted to input + return KinkyDungeonHandleReputation(); + } else if (KinkyDungeonDrawState == "Lore") { + // Done, converted to input + return KinkyDungeonHandleLore(); + } else if (KinkyDungeonDrawState == "Perks2") { + if (MouseIn(1650, 920, 300, 64)) { + KinkyDungeonDrawState = "Restart"; + KDConfirmDeleteSave = false; + if (KDDebugMode) { + ElementCreateTextArea("DebugEnemy"); + ElementValue("DebugEnemy", "Maidforce"); + ElementCreateTextArea("DebugItem"); + ElementValue("DebugItem", "TrapArmbinder"); + } else { + if (document.getElementById("DebugEnemy")) { + ElementRemove("DebugEnemy"); + } + if (document.getElementById("DebugItem")) { + ElementRemove("DebugItem"); + } + } + return true; + } + } else if (KinkyDungeonDrawState == "Restart") { + if (MouseIn(600, 20, 64, 64)) { + if (TestMode) { + KDDebugMode = !KDDebugMode; + ElementCreateTextArea("DebugEnemy"); + ElementValue("DebugEnemy", "Maidforce"); + ElementCreateTextArea("DebugItem"); + ElementValue("DebugItem", "TrapArmbinder"); + return true; + } else { + if (document.getElementById("DebugEnemy")) { + ElementRemove("DebugEnemy"); + } + if (document.getElementById("DebugItem")) { + ElementRemove("DebugItem"); + } + } + } + if (KDDebugMode) { + if (MouseIn(1100, 20, 64, 64)) { + KDDebug = !KDDebug; + return true; + } else + if (MouseIn(1100, 90, 64, 64)) { + KDDebugPerks = !KDDebugPerks; + return true; + } else + if (MouseIn(1100, 160, 64, 64)) { + if (KDDebugGold) { + KDDebugGold = false; + KinkyDungeonGold = 0; + } else { + KDDebugGold = true; + KinkyDungeonGold = 100000; + } + return true; + } else + if (MouseIn(1100, 230, 64, 64)) { + KDDebugLink = !KDDebugLink; + return true; + } else + if (MouseIn(1500, 100, 100, 64)) { + let enemy = KinkyDungeonEnemies.find((element) => {return element.name.toLowerCase() == ElementValue("DebugEnemy").toLowerCase();}); + if (enemy) { + let en = KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, enemy.name, 1, 1.5); + if (en[0]) { + KDProcessCustomPatron(en[0].Enemy, en[0], 0.2, true); + + } + for (let e of en) { + KDRunCreationScript(e, KDGetCurrentLocation()); + } + } + return true; + }else + if (MouseIn(1600, 100, 100, 64)) { + let enemy = KinkyDungeonEnemies.find((element) => {return element.name.toLowerCase() == ElementValue("DebugEnemy").toLowerCase();}); + if (enemy) { + let e = DialogueCreateEnemy(KinkyDungeonPlayerEntity.x -1, KinkyDungeonPlayerEntity.y, enemy.name); + e.allied = 9999; + KDRunCreationScript(e, KDGetCurrentLocation()); + } + return true; + }else + if (MouseIn(1700, 100, 100, 64)) { + let enemy = KinkyDungeonEnemies.find((element) => {return element.name.toLowerCase() == ElementValue("DebugEnemy").toLowerCase();}); + if (enemy) { + let e = DialogueCreateEnemy(KinkyDungeonPlayerEntity.x -1, KinkyDungeonPlayerEntity.y, enemy.name); + e.ceasefire = 1000; + + let shop = KinkyDungeonGetShopForEnemy(e, true); + if (shop) { + KinkyDungeonSetEnemyFlag(e, "Shop", -1); + KinkyDungeonSetEnemyFlag(e, shop, -1); + KDSetShopMoney(e); + } + KDRunCreationScript(e, KDGetCurrentLocation()); + } + return true; + } else + if (MouseIn(1500, 260, 300, 64)) { + let item = null; + if (KinkyDungeonConsumables[ElementValue("DebugItem")]) KinkyDungeonChangeConsumable(KinkyDungeonConsumables[ElementValue("DebugItem")], 10); + else if (KinkyDungeonWeapons[ElementValue("DebugItem")]) KinkyDungeonInventoryAddWeapon(ElementValue("DebugItem")); + else if (KinkyDungeonGetRestraintByName(ElementValue("DebugItem"))) { + let restraint = KinkyDungeonGetRestraintByName(ElementValue("DebugItem")); + KinkyDungeonInventoryAdd({name: ElementValue("DebugItem"), type: LooseRestraint, events: restraint.events, quantity: 10, id: KinkyDungeonGetItemID()}); + } else if (KinkyDungeonOutfitsBase.filter((outfit) => {return outfit.name == ElementValue("DebugItem");}).length > 0) { + KinkyDungeonInventoryAdd({name: KinkyDungeonOutfitsBase.filter((outfit) => {return outfit.name == ElementValue("DebugItem");})[0].name, type: Outfit, id: KinkyDungeonGetItemID()}); + } + + if (item) + KinkyDungeonInventoryAdd(item); + return true; + } + if (MouseIn(1500, 320, 300, 64)) { + let saveData = LZString.compressToBase64(JSON.stringify(KinkyDungeonSaveGame(true))); + KinkyDungeonState = "Save"; + ElementCreateTextArea("saveDataField"); + ElementValue("saveDataField", saveData); + + + return true; + } + if (MouseIn(1100, 300, 300, 64)) { + + KDMovePlayer(KDMapData.EndPosition.x, KDMapData.EndPosition.y, false); + KDMapData.KeyQuota=0; + KDMapData.ChestQuota=0; + for (let enemy of KDMapData.Entities) { + if (KDEnemyHasFlag(enemy, "killtarget")) { + KinkyDungeonSetEnemyFlag(enemy, "killtarget", 0); + } + } + KDMapData.TrapQuota=0; + KDMapData.QuestQuota=0; + KDGameData.DragonCaptured = true; + KinkyDungeonSetFlag("BossUnlocked", -1); + KinkyDungeonUpdateLightGrid = true; + return true; + } else + if (MouseIn(1100, 370, 300, 64)) { + KDGameData.PrisonerState = 'parole'; + return true; + } + } + + if (MouseIn(1650, 900, 300, 64)) { + KinkyDungeonDrawState = "Perks2"; + return true; + } + + //if (MouseIn(600, 650, 64, 64)) { + //KinkyDungeonFastWait = !KinkyDungeonFastWait; + //return true; + //} + // Done, converted to input + if (KinkyDungeonIsPlayer() && MouseIn(975, 800, 550, 64) && KDGameData.PrisonerState != 'jail' && KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)) { + + if (KDConfirmDeleteSave) { + KDSendInput("defeat", {}); + KinkyDungeonDrawState = "Game"; + + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + } else { + KDConfirmDeleteSave = true; + } + return true; + } + if (MouseIn(975, 550, 550, 64)) { + KinkyDungeonDrawState = "Game"; + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + return true; + } else if (KinkyDungeonIsPlayer() && MouseIn(975, 650, 550, 64)) { + if (KDSaveBusy) { + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "LockLight" + ".ogg"); + } else { + KinkyDungeonSaveGame(); + KinkyDungeonState = "Menu"; + } + //KinkyDungeonAutoWait = true; + //KinkyDungeonTempWait = false; + //KinkyDungeonAutoWaitSuppress = true; + //KinkyDungeonSleepTime = CommonTime() + 500; + return true; + } + KDConfirmDeleteSave = false; + return true; + } + + if (KDModalArea && MouseIn(KDModalArea_x, KDModalArea_y, KDModalArea_width, KDModalArea_height)) return true; + if (MouseIn(0, 0, 500, 1000)) return true; + if (MouseIn(1950, 0, 60, 1000)) return true; + if (MouseIn(0, 950, 2000, 60)) return true; + KDModalArea = false; + return false; +} + +let KDStruggleGroupLinkIndex = {}; + +function KDGetAdjacentGroups(group: string, max: number = 3): string[] { + for (let i = 0; i < KinkyDungeonStruggleGroupsBase.length; i++) { + if (KinkyDungeonStruggleGroupsBase[i] == group) { + let ret: string[] = []; + if (i > 0) ret.push(KinkyDungeonStruggleGroupsBase[i-1]); + if (max > 1 && i > 1) ret.push(KinkyDungeonStruggleGroupsBase[i-2]); + if (max > 2 && i > 3) ret.push(KinkyDungeonStruggleGroupsBase[i-3]); + if (i < KinkyDungeonStruggleGroupsBase.length - 1) ret.push(KinkyDungeonStruggleGroupsBase[i+1]); + if (max > 1 && i < KinkyDungeonStruggleGroupsBase.length - 2) ret.push(KinkyDungeonStruggleGroupsBase[i+2]); + if (max > 2 && i < KinkyDungeonStruggleGroupsBase.length - 3) ret.push(KinkyDungeonStruggleGroupsBase[i+3]); + return ret.length > 0 ? ret : null; + } + } + return null; +} + +function KinkyDungeonUpdateStruggleGroups() { + let struggleGroups = KinkyDungeonStruggleGroupsBase; + KinkyDungeonStruggleGroups = []; + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + + for (let S = 0; S < struggleGroups.length; S++) { + let sg = struggleGroups[S]; + let Group = sg; + + let restraint = KinkyDungeonGetRestraintItem(Group); + + if (restraint) { + KinkyDungeonStruggleGroups.push( + { + group:Group, + left: true, // S % 2 == 0, // Old behavior + y: S, + icon:sg, + name:(KDRestraint(restraint)) ? KDRestraint(restraint).name : "", + lock:restraint.lock, + magic: KDRestraint(restraint) ? KDRestraint(restraint).magic : undefined, + noCut:KDRestraint(restraint) && KDRestraint(restraint).escapeChance && KDRestraint(restraint).escapeChance.Cut == undefined, + curse:KDRestraint(restraint)? (restraint.curse || KDRestraint(restraint).curse) : undefined, + blocked: !KDRestraint(restraint).alwaysStruggleable && KDGroupBlocked(Group)}); + } + } +} + +/** + * @param item + */ +function KDCanStruggle(item: item): boolean { + if (KDGetCurse(item)) return false; + //let r = KDRestraint(item); + //let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + //if (sg.blocked) return false; + return true; +} +/** + * @param item + */ +function KDCanRemove(item: item): boolean { + if (KDGetCurse(item)) return false; + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + if (sg.blocked) return false; + return true; +} + +/** + * @param inv + * @param [allowInaccessible] + */ +function KDGetItemLinkIndex(inv: item, _allowInaccessible?: boolean): number { + let item = KinkyDungeonGetRestraintItem(KDRestraint(inv).Group); + let surfaceItems = KDDynamicLinkListSurface(item); + return surfaceItems.indexOf(inv); +} + +/** + * @param skip - Skips the button being drawn in this instance + */ +function KDDrawNavBar(skip: number, _quit: boolean = false) { + let by = 440; + let bwidth = 140; + let bx = 2000 - 10 - bwidth; + let bspacing = 5; + let bindex = 0; + let bheight = 60; + + let bInc = () => { + by += bheight + bspacing; + }; + + + + + DrawButtonKDEx((skip == bindex) ? "goGame" : "goQuit", (_bdata) => { + if (skip == 0) { + KinkyDungeonDrawState = "Game"; + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + + } else {KinkyDungeonDrawState = "Restart"; + KDConfirmDeleteSave = false; + if (KDDebugMode) { + ElementCreateTextArea("DebugEnemy"); + ElementValue("DebugEnemy", "Maidforce"); + ElementCreateTextArea("DebugItem"); + ElementValue("DebugItem", "TrapArmbinder");} else { + if (document.getElementById("DebugEnemy")) { + ElementRemove("DebugEnemy"); + } + if (document.getElementById("DebugItem")) { + ElementRemove("DebugItem"); + } + } + } + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + return true; + }, true, bx, by, bwidth, bheight, TextGet((skip == bindex) ? "KDNavGame" : "KDNavQuit"), "#ffffff", + KinkyDungeonRootDirectory + ((skip == bindex) ? "UI/button_game.png" : "UI/button_menu.png"), undefined, undefined, false, "", 24, true, + { + hotkey: KDHotkeyToText(KinkyDungeonKeyMenu[8]), + }); bindex++; bInc(); + DrawButtonKDEx((skip == bindex) ? "goGame" : "goInv", (_bdata) => { + if (skip == 1) + KinkyDungeonDrawState = "Game"; + else + KinkyDungeonDrawState = "Inventory"; + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + return true; + }, true, bx, by, bwidth, bheight, TextGet((skip == bindex) ? "KDNavGame" : "KinkyDungeonInventory"), "#ffffff", + KinkyDungeonRootDirectory + ((skip == bindex) ? "UI/button_game.png" : "UI/button_inventory.png"), undefined, undefined, false, "", 24, true, + { + hotkey: KDHotkeyToText(KinkyDungeonKeyMenu[1]), + }); bindex++; bInc(); + /*DrawButtonKDEx("goRep", (bdata) => { + if (skip == bindex) + KinkyDungeonDrawState = "Game"; + else + KinkyDungeonDrawState = "Reputation"; + return true; + }, true, bx, by, bwidth, bheight, TextGet((skip == bindex) ? "KDNavGame" : "KinkyDungeonReputation"), "#ffffff", + KinkyDungeonRootDirectory + (skip == bindex) ? "UI/button_game.png" : "UI/button_reputation.png", undefined, undefined, false, "", 24, true, + { + hotkey: KDHotkeyToText(KinkyDungeonKeyMenu[2]), + }); bindex++; bInc();*/ + DrawButtonKDEx((skip == bindex) ? "goGame" : "goSpells", (_bdata) => { + if (skip == 2) + KinkyDungeonDrawState = "Game"; + else + KinkyDungeonDrawState = "MagicSpells"; + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + return true; + }, true, bx, by, bwidth, bheight, TextGet((skip == bindex) ? "KDNavGame" : "KinkyDungeonMagic"), "#ffffff", + KinkyDungeonRootDirectory + ((skip == bindex) ? "UI/button_game.png" : "UI/button_spells.png"), undefined, undefined, false, "", 24, true, + { + hotkey: KDHotkeyToText(KinkyDungeonKeyMenu[3]), + }); bindex++; bInc(); + + let logtxt = KinkyDungeonNewLoreList.length > 0 ? TextGet("KinkyDungeonLogbookN").replace("N", "" + KinkyDungeonNewLoreList.length): TextGet("KinkyDungeonLogbook"); + if (skip == bindex) logtxt = TextGet("KDNavGame"); + DrawButtonKDEx((skip == bindex) ? "goGame" : "goLog", (_bdata) => { + if (skip == 3) + KinkyDungeonDrawState = "Game"; + else { + KinkyDungeonDrawState = "Quest"; + KinkyDungeonUpdateLore(localStorage.getItem("kdexpLore") ? JSON.parse(localStorage.getItem("kdexpLore")) : {Cover: 1}); + } + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + return true; + }, true, bx, by, bwidth, bheight, logtxt, "#ffffff", + KinkyDungeonRootDirectory + ((skip == bindex) ? "UI/button_game.png" : "UI/button_logbook.png"), undefined, undefined, false, "", 24, true, { + hotkey: KDHotkeyToText(KinkyDungeonKeyMenu[4]), + }); bindex++; bInc(); +} + +function KDCullSpellChoices() { + for (let ii = KinkyDungeonSpellChoiceCount - 1; ii > 0; ii--) { + if (!(KinkyDungeonSpellChoices[ii] >= 0 + || KinkyDungeonWeaponChoices[ii] + || KinkyDungeonArmorChoices[ii] + || KinkyDungeonConsumableChoices[ii] + )) { + KinkyDungeonSpellChoices = KinkyDungeonSpellChoices.slice(0, ii); + KinkyDungeonWeaponChoices = KinkyDungeonWeaponChoices.slice(0, ii); + KinkyDungeonArmorChoices = KinkyDungeonArmorChoices.slice(0, ii); + KinkyDungeonConsumableChoices = KinkyDungeonConsumableChoices.slice(0, ii); + } + else break; + } +} + +let currentDrawnSG = null; +let currentDrawnSGLength = 0; + +/** + * Sets the focus control and also initializes default settings + * @param control + */ +function KDSetFocusControl(control: string) { + KDFocusControls = control; + if (!control) KDFocusHoverEnter = 0; + + if (control) + KDInitFocusControl(control); +} +/** + * Sets the focus control and also initializes default settings + * @param control + */ +function KDInitFocusControl(control: string) { + + if (localStorage.getItem("focusControl")) { + KDGameData.FocusControlToggle = JSON.parse(localStorage.getItem("focusControl")); + } + + KDSetFocusControlToggle("", ""); + if (KDFocusControlButtons[control]) { + for (let button of Object.entries(KDFocusControlButtons[control])) { + if (KDGameData.FocusControlToggle[control + button[0]] == undefined) { + //KDGameData.FocusControlToggle[control + button[0]] = button[1]; + KDSetFocusControlToggle(control + button[0], button[1]); + } + } + } +} + +function KDSetFocusControlToggle(key: any, value: any) { + KDSendInput("focusControlToggle", {key: key, value: value}); +} + +function KDInputFocusControlToggle(key: string, value: boolean) { + if (!KDGameData.FocusControlToggle) KDGameData.FocusControlToggle = {}; + if (key) + KDGameData.FocusControlToggle[key] = value; + + if (value && KDFocusControlButtonsExclude[key]) { + if (KDFocusControlButtonsExclude[key]) { + for (let b of KDFocusControlButtonsExclude[key]) { + KDGameData.FocusControlToggle[b] = false; + } + } + } + + localStorage.setItem("focusControl", JSON.stringify(KDGameData.FocusControlToggle)); +} + + +function KDDrawMMButtons(MinimapX: number, MinimapY: number, zIndex: number) { + let spacing = 40; + let starty = MinimapY; + let ii = 0; + DrawButtonKDEx("minimapzoomin", (_bdata) => { + KDMinimapExpandedSize = Math.max(KDMinimapW, KDMinimapExpandedSize - KDMinimapExpandedSizeTick); + KDRedrawMM = 2; + KDUpdateMinimapTarget(true); + return true; + }, true, MinimapX, starty + ii*spacing, 46, 46, "", KDButtonColor, KinkyDungeonRootDirectory + "UI/ZoomIn.png", undefined, false, true, + "#000000", undefined, undefined, {zIndex: zIndex, alpha: 0}); ii++; + DrawButtonKDEx("minimapzoomout", (_bdata) => { + KDMinimapExpandedSize = Math.min(KDMinimapWBig, KDMinimapExpandedSize + KDMinimapExpandedSizeTick); + KDRedrawMM = 2; + KDUpdateMinimapTarget(true); + return true; + }, true, MinimapX, starty + ii*spacing, 46, 46, "", KDButtonColor, KinkyDungeonRootDirectory + "UI/ZoomOut.png", undefined, false, true, + "#000000", undefined, undefined, {zIndex: zIndex, alpha: 0}); ii++; + DrawButtonKDEx("minimapexpand", (_bdata) => { + KDMinimapExpandedZoom = Math.min(KDMinimapScaleBig, KDMinimapExpandedZoom + KDMinimapExpandedZoomTick); + KDRedrawMM = 2; + KDUpdateMinimapTarget(true); + return true; + }, true, MinimapX, starty + ii*spacing, 46, 46, "", KDButtonColor, KinkyDungeonRootDirectory + "UI/Expand.png", undefined, false, true, + "#000000", undefined, undefined, {zIndex: zIndex, alpha: 0}); ii++; + DrawButtonKDEx("minimapshrink", (_bdata) => { + KDMinimapExpandedZoom = Math.max(KDMinimapExpandedZoomTick, KDMinimapExpandedZoom - KDMinimapExpandedZoomTick); + KDRedrawMM = 2; + KDUpdateMinimapTarget(true); + return true; + }, true, MinimapX, starty + ii*spacing, 46, 46, "", KDButtonColor, KinkyDungeonRootDirectory + "UI/Shrink.png", undefined, false, true, + "#000000", undefined, undefined, {zIndex: zIndex, alpha: 0}); ii++; + + + + +} + +function KDDrawRightMMButtons(MinimapX: number, MinimapY: number, zIndex: number, MinimapWidth: number) { + let spacing = 40; + let starty = MinimapY; + let ii = 0; + MinimapX += MinimapWidth - 65; + + + DrawButtonKDEx("minimapLabels", (_bdata) => { + KDToggles.MMLabels = !KDToggles.MMLabels; + KDRedrawMM = 2; + KDUpdateMinimapTarget(true); + return true; + }, true, MinimapX, starty + ii*spacing, 46, 46, + "", KDButtonColor, KinkyDungeonRootDirectory + "UI/Labels.png", + undefined, false, !KDToggles.MMLabels, + "#000000", undefined, undefined, {zIndex: zIndex, alpha: 0}); ii++; + DrawButtonKDEx("minimapLabelsChest", (_bdata) => { + KDMMLabels_Chest = !KDMMLabels_Chest; + KDRedrawMM = 2; + KDUpdateMinimapTarget(true); + return true; + }, true, MinimapX, starty + ii*spacing, 46, 46, + "", KDButtonColor, KinkyDungeonRootDirectory + "UI/LabelsChest.png", + undefined, false, !(KDMMLabels_Chest && KDToggles.MMLabels), + "#000000", undefined, undefined, {zIndex: zIndex, alpha: 0}); ii++; + DrawButtonKDEx("minimapLabelsShrine", (_bdata) => { + KDMMLabels_Shrine = !KDMMLabels_Shrine; + KDRedrawMM = 2; + KDUpdateMinimapTarget(true); + return true; + }, true, MinimapX, starty + ii*spacing, 46, 46, + "", KDButtonColor, KinkyDungeonRootDirectory + "UI/LabelsShrine.png", + undefined, false, !(KDMMLabels_Shrine && KDToggles.MMLabels), + "#000000", undefined, undefined, {zIndex: zIndex, alpha: 0}); ii++; + DrawButtonKDEx("minimapLabelsOther", (_bdata) => { + KDMMLabels_Other = !KDMMLabels_Other; + KDRedrawMM = 2; + KDUpdateMinimapTarget(true); + return true; + }, true, MinimapX, starty + ii*spacing, 46, 46, + "", KDButtonColor, KinkyDungeonRootDirectory + "UI/LabelsOther.png", + undefined, false, !(KDMMLabels_Other && KDToggles.MMLabels), + "#000000", undefined, undefined, {zIndex: zIndex, alpha: 0}); ii++; +} + +let KDMMLabels_Chest = true; +let KDMMLabels_Shrine = true; +let KDMMLabels_Other = true; + +function KDDrawMinimap(MinimapX: number, MinimapY: number) { + if (kdminimap.visible) { + let zIndex = (KDExpandMinimap || MouseIn(MinimapX, MinimapY, KDMinimapWidth()+21, KDMinimapHeight()+21)) ? 150 : 90; + if (KDExpandMinimap) { + KDDrawMMButtons(MinimapX, MinimapY, zIndex); + KDDrawRightMMButtons(MinimapX, MinimapY, zIndex, KDMinimapWidth()+21); + } + kdminimap.zIndex = zIndex - 1; + + // Dummy button to prevent clicks from moving the player inadvertently + DrawButtonKDEx("minimapdummy", (_bdata) => { + KDExpandMinimap = !KDExpandMinimap; + return true; + }, true, MinimapX-10, MinimapY-10, KDMinimapWidth()+21, KDMinimapHeight()+21, "", KDButtonColor, undefined, undefined, false, true, + "#000000", undefined, undefined, {zIndex: zIndex-2, alpha: 0., hotkey: KDHotkeyToText(KinkyDungeonKeyMap[0]), hotkeyPress: KinkyDungeonKeyMap[0]}); + + if (KDMinimapWCurrent != KDMinimapWTarget || KDMinimapHCurrent != KDMinimapHTarget) { + KDRedrawMM = 2; + } + KDMinimapWCurrent = (KDMinimapWTarget + KDUISmoothness * KDMinimapWCurrent)/(1 + KDUISmoothness); + KDMinimapHCurrent = (KDMinimapHTarget + KDUISmoothness * KDMinimapHCurrent)/(1 + KDUISmoothness); + + // Snap when close or skipping smooth transition + if (Math.abs(KDMinimapWCurrent - KDMinimapWTarget) < 5) KDMinimapWCurrent = KDMinimapWTarget; + if (Math.abs(KDMinimapHCurrent - KDMinimapHTarget) < 5) KDMinimapHCurrent = KDMinimapHTarget; + + + + let escapeMethod = KDGetEscapeMethod(MiniGameKinkyDungeonLevel); + let escape = KDCanEscape(escapeMethod); + let escapeText = KDGetEscapeMinimapText(escapeMethod)?.split('|'); + if (escapeText) { + let spacing = 17; + let II = -(escapeText.length - 1); + for (let s of escapeText) { + DrawTextFitKD(s, kdminimap.x + KDMinimapWCurrent/2, kdminimap.y + KDMinimapHCurrent - 12 + II++ * spacing, 0.75 * KDMinimapWCurrent, + escape ? "#88ff88" : "#ff5277", KDTextGray0, 16, "center", zIndex + 1); + } + } + + } + kdminimap.x = MinimapX; + kdminimap.y = MinimapY; +} +/** + * Draws the party member display + * @param {number} PartyX + * @param {number} PartyY + * @param {object[]} tooltips + */ +function KDDrawPartyMembers(PartyX: number, PartyY: number, tooltips: object[]) { + if (KDGameData.Party && KinkyDungeonDrawState == "Game") { + let PartyDy = 72; + let PartyPad = 8; + let zIndex = KDToggleShowAllBuffs ? 149 : 152; + + for (let i = 0; i < KDGameData.Party.length; i++) { + let PM = KinkyDungeonFindID(KDGameData.Party[i].id); + if (PM) { + KDDrawEnemySprite(kdstatusboard, PM, PartyX/KinkyDungeonGridSizeDisplay, PartyY/KinkyDungeonGridSizeDisplay, 0, 0, true, zIndex, "PM"); + KinkyDungeonBarTo(kdstatusboard, PartyX, PartyY, + PartyDy, 10, PM.visual_hp / PM.Enemy.maxhp * 100, "#88ff88", "#ff5277", undefined, undefined, undefined, undefined, undefined, zIndex + 0.05); + + let selected = (PM.buffs?.AllySelect?.duration > 0); + + DrawButtonKDExTo(kdstatusboard, "PM" + i + "click", (_bdata) => { + KDSendInput("select", {enemy: PM}); + return true; + }, true, PartyX, PartyY, PartyDy, PartyDy, "", KDButtonColor, undefined, undefined, false, !selected, + "#000000", undefined, undefined, {zIndex: zIndex - 0.1,}); + + if (selected) { + DrawButtonKDExTo(kdstatusboard, "PM" + i + "remove", (_bdata) => { + KDSendInput("cancelParty", {enemy: PM}); + return true; + }, true, PartyX + 170, PartyY, 38, 38, "", KDButtonColor, KinkyDungeonRootDirectory + "UI/X.png", undefined, false, false, + "#000000", undefined, undefined, {zIndex: zIndex,}); + DrawButtonKDExTo(kdstatusboard, "PM" + i + "come", (_bdata) => { + KDSendInput("onMe", {enemy: PM, player: KinkyDungeonPlayerEntity}); + return true; + }, true, PartyX + 90, PartyY, 38, 38, "", KDButtonColor, KinkyDungeonRootDirectory + ((!KDEnemyHasFlag(PM, "NoFollow")) ? "UI/Recall.png" : "UI/Disperse.png"), undefined, false, false, + "#000000", undefined, undefined, {zIndex: zIndex,}); + + DrawButtonKDExTo(kdstatusboard, "PM" + i + "choose", (_bdata) => { + KDSendInput("selectOnly", {enemy: PM}); + return true; + }, true, PartyX + 130, PartyY, 38, 38, "", KDButtonColor, KinkyDungeonRootDirectory + "UI/Select.png", undefined, false, false, + "#000000", undefined, undefined, {zIndex: zIndex,}); + } + + if (MouseIn(PartyX, PartyY, PartyDy, PartyDy)) { + tooltips.push((offset: number) => KDDrawEnemyTooltip(PM, offset)); + } + + } else { + PM = KDGameData.Party[i]; + if (PM) { + KDDrawEnemySprite(kdstatusboard, PM, PartyX/KinkyDungeonGridSizeDisplay, PartyY/KinkyDungeonGridSizeDisplay, 0, 0, true, zIndex, "PM"); + KDDraw(kdstatusboard, kdpixisprites, "pmFailFind" + PM.id, KinkyDungeonRootDirectory + "Spells/SpellFail.png", + PartyX, PartyY, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: zIndex + 0.1, + alpha: 0.5, + }, + ); + KinkyDungeonBarTo(kdstatusboard, PartyX, PartyY, + PartyDy, 10, PM.visual_hp / PM.Enemy.maxhp * 100, "#88ff88", "#ff5277", undefined, undefined, undefined, undefined, undefined, zIndex + 0.05); + + let selected = (PM.buffs?.AllySelect?.duration > 0); + + DrawButtonKDExTo(kdstatusboard, "PM" + i + "click", (_bdata) => { + KDSendInput("select", {enemy: PM}); + return true; + }, true, PartyX, PartyY, PartyDy, PartyDy, "", KDButtonColor, undefined, undefined, false, !selected, + "#000000", undefined, undefined, {zIndex: zIndex - 0.1,}); + + if (selected) { + DrawButtonKDExTo(kdstatusboard, "PM" + i + "remove", (_bdata) => { + KDSendInput("cancelParty", {enemy: PM}); + return true; + }, true, PartyX + 170, PartyY, 38, 38, "", KDButtonColor, KinkyDungeonRootDirectory + "UI/X.png", undefined, false, false, + "#000000", undefined, undefined, {zIndex: zIndex,}); + + } + + if (MouseIn(PartyX, PartyY, PartyDy, PartyDy)) { + tooltips.push((offset: number) => KDDrawEnemyTooltip(PM, offset)); + } + } + + } + if (PM) { + FillRectKD( + kdstatusboard, + kdpixisprites, + "bgPM" + PM.id, + { + Left: PartyX, + Top: PartyY, + Width: KinkyDungeonGridSizeDisplay, + Height: KinkyDungeonGridSizeDisplay, + Color: "#000000", + alpha: 0.9, + zIndex: zIndex - 0.1, + } + ); + } + PartyY += PartyDy + PartyPad; + } + } +} + +interface statInfo {text: string, icon?: string, count?: string, category: string, priority?: number, color: string, bgcolor: string, countcolor?: string, click?: string, buffid?: string}; + +function KDGetStatsWeaponCast() { + let statsDraw: Record = {}; + + + if (KinkyDungeonPlayerDamage) { + let accuracy = KinkyDungeonGetEvasion(); + let crit = KinkyDungeonGetCrit(accuracy, KinkyDungeonPlayerDamage); + let bindcrit = KinkyDungeonGetBindCrit(accuracy, KinkyDungeonPlayerDamage); + //if (accuracy != 1.0) { + let weapon = KinkyDungeonWeapons[KinkyDungeonPlayerWeapon] || KinkyDungeonPlayerDamage; + statsDraw.accuracy = { + text: TextGet("KinkyDungeonAccuracy") + Math.round(accuracy * 100) + "%, " + TextGet("KinkyDungeonCrit") + Math.round(crit * 100) + "%, " + TextGet("KinkyDungeonBindCrit") + Math.round(bindcrit * 100) + "%", + count: Math.round(accuracy * 100) + "%", + icon: "infoAccuracy",//accuracy > weapon.chance * 1.01 ? "infoAccuracyBuff" : (accuracy < weapon.chance * 0.99 ? "infoAccuracyDebuff" : "infoAccuracy"), + countcolor: accuracy > weapon.chance * 1.01 ? "#c4efaa" : (accuracy < weapon.chance * 0.99 ? "#ff5277" : "#ffffff"), + category: "info", color: "#ffffff", bgcolor: "#000000", priority: 10 + }; + //} + } + //if (KinkyDungeonMiscastChance > 0) { + statsDraw.miscast = { + text: TextGet("StatMiscastChance") + Math.round(KinkyDungeonMiscastChance * 100) + "%", + count: Math.round(KinkyDungeonMiscastChance * 100) + "%", + icon: "infoMiscast", + countcolor: KinkyDungeonMiscastChance > 0 ? "#ff5277" : "#ffffff", + category: "info", color: "#ffffff", bgcolor: "#000000", priority: 9 + }; + return statsDraw; +} + +function KDProcessBuffIcons(minXX: number, minYY: number, side: boolean = false) { + let statsDraw: Record = {}; + + let accuracy = KinkyDungeonGetEvasion(); + if (KDToggleShowAllBuffs || accuracy < 0.89) { + if (KinkyDungeonPlayerDamage) { + let crit = KinkyDungeonGetCrit(accuracy, KinkyDungeonPlayerDamage); + let bindcrit = KinkyDungeonGetBindCrit(accuracy, KinkyDungeonPlayerDamage); + //if (accuracy != 1.0) { + let weapon = KinkyDungeonWeapons[KinkyDungeonPlayerWeapon] || KinkyDungeonPlayerDamage; + statsDraw.accuracy = { + text: TextGet("KinkyDungeonAccuracy") + Math.round(accuracy * 100) + "%, " + TextGet("KinkyDungeonCrit") + Math.round(crit * 100) + "%, " + TextGet("KinkyDungeonBindCrit") + Math.round(bindcrit * 100) + "%", + count: Math.round(accuracy * 100) + "%", + icon: "infoAccuracy",//accuracy > weapon.chance * 1.01 ? "infoAccuracyBuff" : (accuracy < weapon.chance * 0.99 ? "infoAccuracyDebuff" : "infoAccuracy"), + countcolor: accuracy > weapon.chance * 1.01 ? "#c4efaa" : (accuracy < weapon.chance * 0.99 ? "#ff5277" : "#ffffff"), + category: "info", color: "#ffffff", bgcolor: "#000000", priority: 10 + }; + //} + } + } + //if (KinkyDungeonMiscastChance > 0) { + if (KDToggleShowAllBuffs || KinkyDungeonMiscastChance > 0) { + statsDraw.miscast = { + text: TextGet("StatMiscastChance") + Math.round(KinkyDungeonMiscastChance * 100) + "%", + count: Math.round(KinkyDungeonMiscastChance * 100) + "%", + icon: "infoMiscast", + countcolor: KinkyDungeonMiscastChance > 0 ? "#ff5277" : "#ffffff", + category: "info", color: "#ffffff", bgcolor: "#000000", priority: 9 + }; + } + + if (KDToggleShowAllBuffs) { + + + + //} + let evasion = KinkyDungeonPlayerEvasion(); + let block = KinkyDungeonPlayerBlock(); + //if (evasion != 1.0) { + statsDraw.evasion = { + text: TextGet("StatEvasion") + .replace("Percent", ("") + Math.round((1 - evasion) * 100)) + .replace("EVASIONSUM", ("") + Math.round((KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Evasion")) * 100)) + .replace("EVASIONPENALTY", ("") + Math.round(KDPlayerEvasionPenalty() * -100)), + count: ("") + Math.round((1 - evasion) * 100) + "%", + icon: "infoEvasion", + countcolor: evasion < 1 ? "#65d45d" : (evasion == 1 ? "#ffffff" : "#ff5277"), + category: "info", color: "#ffffff", bgcolor: "#000000", priority: 8 + }; + statsDraw.block = { + text: TextGet("StatBlock") + .replace("Percent", ("") + Math.round((1 - block) * 100)) + .replace("BLOCKSUM", ("") + Math.round((KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Block")) * 100)) + .replace("BLOCKPENALTY", ("") + Math.round(KDPlayerBlockPenalty() * -100)), + count: ("") + Math.round((1 - block) * 100) + "%", + icon: "infoBlock", + countcolor: block < 1 ? "#65d45d" : (block == 1 ? "#ffffff" : "#ff5277"), + category: "info", color: "#ffffff", bgcolor: "#000000", priority: 8 + }; + //} + } + + + + + + let jailstatus = "KinkyDungeonPlayerNotJailed"; + if (KDGameData.PrisonerState == 'jail') { + jailstatus = "KinkyDungeonPlayerJail"; + } else if (KDGameData.PrisonerState == 'parole') { + jailstatus = "KinkyDungeonPlayerParole"; + } else if (KDGameData.PrisonerState == 'chase') { + jailstatus = "KinkyDungeonPlayerChase"; + } + if (jailstatus == "KinkyDungeonPlayerJail") { + statsDraw.jail = { + text: TextGet(jailstatus), + icon: "infoJailPrisoner", + category: "help", color: "#ffffff", bgcolor: "#000000", priority: 12 + }; + } else if (jailstatus == "KinkyDungeonPlayerParole") { + statsDraw.jail = { + text: TextGet(jailstatus), + icon: "infoJailSubmissive", + category: "help", color: "#ffffff", bgcolor: "#000000", priority: 12 + }; + } else if (jailstatus == "KinkyDungeonPlayerChase") { + statsDraw.jail = { + text: TextGet(jailstatus), + icon: "infoJailPrisoner", + category: "help", color: "#ffffff", bgcolor: "#000000", priority: 12 + }; + } + + /*if (KDToggleShowAllBuffs) { + let escape = KDCanEscape(KDGetEscapeMethod(MiniGameKinkyDungeonLevel)); + statsDraw.key = { + text: TextGet(escape ? "StatKeyEscapeKey" : "StatKeyEscapeNoKey"), + icon: escape ? "infoKey" : "infoNoKey", + category: "help", color: "#ffffff", bgcolor: "#000000", priority: 5 + }; + }*/ + + + + + if (KinkyDungeonIsHandsBound(false, true)) { + statsDraw.b_hands = {text: TextGet("KDStatHands"), category: "status", icon: "boundHands", color: "#ff5277", bgcolor: "#333333", priority: 10}; + } else { + if (KDHandBondageTotal() > 0) + statsDraw.b_hands = {text: TextGet("KDStatHandsPartial"), category: "status", icon: "boundHandsPartial", color: "#ff5277", bgcolor: "#333333", priority: 10}; + else if (KDToggleShowAllBuffs) + statsDraw.b_hands = {text: TextGet("KDStatFreeHands"), category: "status", icon: "status/freeHands", color: "#55ff55", bgcolor: "#333333", priority: 10}; + } + if (KinkyDungeonIsArmsBound(false, false)) { + statsDraw.b_arms = {text: TextGet("KDStatArms"), category: "status", icon: "boundArms", color: "#ff5277", bgcolor: "#333333", priority: 11}; + } else if (KDToggleShowAllBuffs) { + statsDraw.b_arms = {text: TextGet("KDStatFreeArms"), category: "status", icon: "status/freeArms", color: "#55ff55", bgcolor: "#333333", priority: 11}; + } + let gag = KinkyDungeonGagTotal(false); + if (gag >= 0.99) { + statsDraw.b_gag = {text: TextGet("KDStatGagFull"), category: "status", icon: "boundGagFull", color: "#ff5277", bgcolor: "#333333", priority: 7}; + } else if (gag > 0) { + statsDraw.b_gag = {text: TextGet("KDStatGag"), category: "status", icon: "boundGag", color: "#ff5277", bgcolor: "#333333", priority: 7}; + } else if (KDToggleShowAllBuffs) { + statsDraw.b_gag = {text: TextGet("KDStatFreeMouth"), category: "status", icon: "status/freeMouth", color: "#55ff55", bgcolor: "#333333", priority: 7}; + } + if (KinkyDungeonBlindLevel > 0 || KinkyDungeonStatBlind > 0) { + statsDraw.b_blind = {text: TextGet("KDStatBlind"), category: "status", icon: "boundBlind", color: "#ff5277", bgcolor: "#333333", priority: 8}; + } else if (KDToggleShowAllBuffs) { + statsDraw.b_blind = {text: TextGet("KDStatFreeEyes"), category: "status", icon: "status/freeEyes", color: "#55ff55", bgcolor: "#333333", priority: 8}; + } + if (KDGameData.MovePoints < 0) { + statsDraw.b_speed = {text: TextGet("KDStatStun"), category: "status", icon: "boundStun", color: "#ff5277", bgcolor: "#333333", priority: 9}; + } else if (KinkyDungeonSlowLevel > 9) { + statsDraw.b_speed = {text: TextGet("KDStatSpeedImmobile"), category: "status", icon: "boundImmobile", color: "#ff5277", bgcolor: "#333333", priority: 9}; + } else if (KinkyDungeonSlowLevel > 3) { + statsDraw.b_speed = {text: TextGet("KDStatSpeedNoSprint"), category: "status", icon: "boundSlow4", color: "#ff5277", bgcolor: "#333333", priority: 9}; + } else if (KinkyDungeonSlowLevel > 2) { + statsDraw.b_speed = {text: TextGet("KDStatSpeedVerySlow"), category: "status", icon: "boundSlow3", color: "#ff5277", bgcolor: "#333333", priority: 9}; + } else if (KinkyDungeonSlowLevel == 2) { + statsDraw.b_speed = {text: TextGet("KDStatSpeedSlow"), category: "status", icon: "boundSlow2", color: "#ff5277", bgcolor: "#333333", priority: 9}; + } else if (KinkyDungeonSlowLevel > 0) { + statsDraw.b_speed = {text: TextGet("KDStatSpeedSlightlySlow"), category: "status", icon: "boundSlow1", color: "#e7cf1a", bgcolor: "#333333", priority: 9}; + } else if (KDToggleShowAllBuffs) { + statsDraw.b_speed = {text: TextGet("KDStatFreeLegs"), category: "status", icon: "status/freeLegs", color: "#55ff55", bgcolor: "#333333", priority: 9}; + } + + if (KDGameData.Restriction) { + statsDraw.b_restriction = {text: TextGet("KDStatRestriction"), category: "status", icon: "restriction", color: "#ff5277", bgcolor: "#333333", priority: 9, + count: Math.round(KDGameData.Restriction) + "", + countcolor: "#ff5277", + }; + } + + if (KDToggleShowAllBuffs) { + for (let training of KDTrainingTypes) { + let XPNext = 0; + if (KDGameData.Training) { + if (KDGameData.Training[training]?.turns_total == 0) { + XPNext = 0; + } else { + let trainingPercentage = Math.min(1, + KDGameData.Training[training]?.turns_total/KDTrainingSoftScale) + * (Math.max(0, KDGameData.Training[training]?.turns_trained * 1.11 + - KDGameData.Training[training]?.turns_skipped)/KDGameData.Training[training]?.turns_total); + if (KinkyDungeonStatsChoice.get("Mastery" + training)) trainingPercentage *= 0.4; + XPNext = trainingPercentage; + } + } + + statsDraw["training" + training] = {text: TextGet("KDTrainingLevel" + training) + .replace("AMNT", + "" + Math.floor((KDGameData.Training ? (KDGameData.Training[training]?.training_points || 0) : 0)*100)) + .replace("NXT", + "" + Math.floor((XPNext*100))) + .replace("LMT", + "" + Math.floor(( + KDGameData.Training ? (KDGameData.Training[training]?.training_stage || 0) + 1 : 1)*100)) + , + category: "training", icon: "training/" + training, color: "#2fc6ce", bgcolor: "#333333", priority: 14, + count: Math.floor(KDGameData.Training ? (KDGameData.Training[training]?.training_stage || 0) : 0) + "", + countcolor: "#2fc6ce", + }; + } + + } + + + + + if (KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) < KDShadowThreshold) { + statsDraw.shadow = {text: TextGet("KinkyDungeonPlayerShadow"), icon: "shadow", category: "status", color: "#a3a7c2", bgcolor: "#5e52ff", priority: 1}; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerShadow"), X1, 900 - i * 35, 200, KDTextGray0, "#5e52ff", ); i++; + } + let sneak = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak", true); + if (sneak > 2.5) { + statsDraw.sneak = {text: TextGet("KinkyDungeonPlayerSneak"), category: "status", icon: "invisible", color: "#ceaaed", bgcolor: "#333333", priority: 2}; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerSneak"), X1, 900 - i * 35, 200, KDTextGray0,"#ceaaed"); i++; + } else { + let visibility = KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowDetection")); + if (visibility != 1.0) { + statsDraw.visibility = { + text: TextGet("KinkyDungeonPlayerVisibility") + Math.round(visibility * 100) + "%", + count: Math.round(visibility * 100) + "%", + icon: "visibility", + countcolor: visibility < 1 ? "#c4efaa" : "#ff5277", + category: "info", color: "#ceaaed", bgcolor: KDTextGray0, priority: 2 + }; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerVisibility") + Math.round(visibility * 100) + "%", X1, 900 - i * 35, 200, KDTextGray0, "#ceaaed"); i++; + } + } + + if (KDGameData.Shield > 0) { + statsDraw.shield = {text: TextGet("KDStatShield"), category: "info", icon: "shield", color: "#88aaff", bgcolor: "#333333", priority: -100, + + count: "" + Math.round(KDGameData.Shield * 10), + countcolor: "#ffffff", + }; + } + let help = KinkyDungeonHasAllyHelp() || KinkyDungeonHasGhostHelp(); + if (help) { + statsDraw.hashelp = {text: TextGet("KinkyDungeonPlayerHelp"), icon: "Help", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerHelp"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; + } else { + if (KinkyDungeonGetAffinity(false, "Hook")) { + statsDraw.helphook = {text: TextGet("KinkyDungeonPlayerHook"), icon: "HelpHook", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerHook"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; + } + if (KinkyDungeonGetAffinity(false, "Sharp") && !KinkyDungeonWeaponCanCut(false)) { + statsDraw.helpsharp = {text: TextGet("KinkyDungeonPlayerSharp"), icon: "HelpSharp", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerSharp"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; + } + if (KinkyDungeonGetAffinity(false, "Edge")) { + statsDraw.helpedge = {text: TextGet("KinkyDungeonPlayerEdge"), icon: "HelpCorner", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerEdge"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; + } + if (KinkyDungeonGetAffinity(false, "Sticky")) { + statsDraw.helpsticky = {text: TextGet("KinkyDungeonPlayerSticky"), icon: "HelpSticky", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerSticky"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; + } + if (KinkyDungeonWallCrackAndKnife(false)) { + statsDraw.helpcrack = {text: TextGet("KinkyDungeonPlayerCrack"), icon: "HelpCrack", category: "help", color: "#ffffff", bgcolor: "#333333", priority: 5}; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerSticky"), X1, 900 - i * 35, 200, "#ffffff", "#333333"); i++; + } + } + + if (KinkyDungeonFlags.has("Quickness") || KDEntityBuffedStat(KDPlayer(), "Quickness")) { + statsDraw.quickness = {text: TextGet("KinkyDungeonPlayerQuickness"), icon: "quickness", category: "buffs", color: "#e7cf1a", bgcolor: "#333333", priority: 100}; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerQuickness"), X1, 900 - i * 35, 200, "#e7cf1a", "#333333"); i++; + } + + let aflags = { + KDDamageHands: true.valueOf, + KDDamageArms: true.valueOf, + }; + let adata = { + flags: aflags, + buffdmg: 0, + Damage: KinkyDungeonPlayerDamage, + }; + KinkyDungeonSendEvent("calcDisplayDamage", adata); + let stamDiff = (KDAttackCost(undefined, true).orig != KDAttackCost().attackCost); + if ((KDToggleShowAllBuffs + || stamDiff + || (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackDmg") + adata.buffdmg) + ) && KinkyDungeonPlayerDamage) { + let meleeDamage = (KinkyDungeonPlayerDamage.damage) + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackDmg") + adata.buffdmg; + statsDraw.meleeDamage = { + text: TextGet("KinkyDungeonPlayerDamage") + .replace("DAMAGEDEALT", "" + Math.round(meleeDamage*10)) + .replace("STMNA", Math.round(-10 * KDAttackCost().attackCost) + "") + .replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + KinkyDungeonPlayerDamage.type)), + count: Math.round(meleeDamage*10) + (stamDiff ? "/" + Math.round(-10 * KDAttackCost().attackCost) : ""), + category: "info", color: "#ffffff", bgcolor: "#333333", icon: "infoDamageMelee", priority: 10.1 + }; + } + if (KDToggleShowAllBuffs) { + let armor = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Armor"); + if (armor != 0) { + statsDraw.armor = {text: TextGet("KinkyDungeonPlayerArmor") + Math.round(armor*10), count: (armor > 0 ? "+" : "") + Math.round(armor*10), category: "buffs", icon: "armor", color: "#fca570", bgcolor: "#333333", priority: armor}; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerArmor") + Math.round(armor*10), X2, 900 - i * 25, 200, "#fca570", "#333333"); i++; i++; + } + let spellarmor = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellResist"); + if (spellarmor != 0) { + statsDraw.spellarmor = {text: TextGet("KinkyDungeonPlayerSpellResist") + Math.round(spellarmor*10), count: (spellarmor > 0 ? "+" : "") + Math.round(spellarmor*10), category: "buffs", icon: "spellarmor", color: "#73efe8", bgcolor: "#333333", priority: spellarmor + 1}; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerSpellResist") + Math.round(spellarmor*10), X2, 900 - i * 25, 200, "#73efe8", "#333333"); i++; i++; + } + let restraintblock = KDRestraintBlockPower(KDCalcRestraintBlock(), 10); + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "RestraintBlock")) + statsDraw.restraintblock = { + text: TextGet("StatRestraintBlock") + .replace("AMNT1", ("") + Math.round((1 - restraintblock) * 100)) + .replace("AMNT2", ("") + Math.round(10 * KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "RestraintBlock"))) + .replace("RESBLKPENALTY", Math.round((1 - KinkyDungeonMultiplicativeStat(KDRestraintBlockPenalty())) * -100) + ("%")), + count: ("") + Math.round((1 - restraintblock) * 100) + "%", + icon: "restraintblock", + countcolor: "#65d45d", + category: "info", color: "#ffffff", bgcolor: "#000000", priority: 8 + }; + let damageReduction = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "DamageReduction"); + if (damageReduction > 0) { + statsDraw.damageReduction = { + text: TextGet("KinkyDungeonPlayerReduction") + Math.round(damageReduction*10), + count: "-" + Math.round(damageReduction*10), + category: "buffs", color: "#73efe8", bgcolor: "#333333", icon: "damageresist", priority: damageReduction * 3 + }; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerReduction") + Math.round(damageReduction*10), X2, 900 - i * 25, 150, "#73efe8", "#333333"); i++; i++; + } + + let bindAmp = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BindAmp"); + if (bindAmp > 0) { + statsDraw.bindAmp = { + text: TextGet("KinkyDungeonPlayerBindBuff").replace("PERCENT", Math.round(bindAmp * 100) + "%"), + count: "+" + Math.round(bindAmp * 100) + "%", + countcolor: "#ffffff", + icon: "dmgPlus/dmgbind", + category: "dmg", color: "#ffae70", bgcolor: "#333333", priority: 5 + bindAmp * 20 + }; + } + let magicResist = KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "magicDamageResist")); + let meleeResist = KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "meleeDamageResist")); + for (let dt of Object.values(KinkyDungeonDamageTypes)) { + let color = dt.color; + let type = dt.name; + let DR = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, type + "DamageResist"); + let resist = KinkyDungeonMultiplicativeStat(DR); + let boost = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, type + "DamageBuff"); + let melee = KinkyDungeonMeleeDamageTypes.includes(type); + switch (type) { + case "melee": boost = KDDamageAmpPerks + KDDamageAmpPerksMelee; break; + case "magic": boost = KDDamageAmpPerks + KDDamageAmpPerksMagic; break; + case "spell": boost = KDDamageAmpPerksSpell; break; + } + if (resist != 1.0) { + statsDraw[type + "_resist"] = { + text: TextGet("KinkyDungeonPlayerDamageResist") + .replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + type).toLocaleLowerCase()) + .replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + type).toLocaleLowerCase()) + .replace("DAMAGECATEGORY", TextGet(melee ? "KinkyDungeonDamageTypemelee" : "KinkyDungeonDamageTypemagic").toLocaleLowerCase()) + .replace("PERCENT1", Math.round(resist * (melee ? meleeResist : magicResist) * 100) + "%") + .replace("PERCENT2", Math.round(DR * 100) + "") + .replace("PERCENT3", Math.round((melee ? meleeResist : magicResist) * 100) + "%") + .replace("COUNTPERCENT", (resist > 1 ? '+' : "") + Math.round(resist * 100 - 100) + "%"), + count: (resist > 1 ? '+' : "") + Math.round(resist * 100 - 100) + "%", + countcolor: resist < 1 ? "#c4efaa" : "#ff5277", + icon: "dmg" + type, + category: "resist", color: color, bgcolor: "#333333", priority: resist * 10 + }; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerDamageResist").replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + type)) + Math.round(resist * 100) + "%", X2, 900 - i * 25, 150, color, "#333333"); i++; + } + + if (boost != 0) { + statsDraw[type + "_buff"] = { + text: TextGet("KinkyDungeonPlayerDamageBuff").replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + type)).replace("PERCENT", Math.round(boost * 100) + "%"), + count: "+" + Math.round(boost * 100) + "%", + countcolor: "#ffffff", + icon: "dmgPlus/dmg" + type, + category: "dmg", color: color, bgcolor: "#333333", priority: 5 + boost * 10 + }; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerDamageResist").replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + type)) + Math.round(resist * 100) + "%", X2, 900 - i * 25, 150, color, "#333333"); i++; + } + } + } + + + if (KinkyDungeonPlugCount > 0) { + statsDraw.plugs = { + text: TextGet("KinkyDungeonPlayerPlugged"), + icon: "Plugged", + category: "kinky", color: "#ff8888", bgcolor: "#333333", priority: 1, + }; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerPlugged"), X3, 900 - i * 35, 260, "#ff8888", "#333333"); i++; + if (KinkyDungeonPlugCount > 1) { + statsDraw.plugs = { + text: TextGet("KinkyDungeonPlayerPluggedExtreme"), + icon: "PluggedFull", + category: "kinky", color: "#ff8888", bgcolor: "#333333", priority: 2, + }; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerPluggedExtreme"), X3, 900 - i * 35, 260, "#ff8888", "#333333"); i++; + } + } + if (KinkyDungeonVibeLevel > 0) { + let locations = KDSumVibeLocations(); + let suff = ""; + if (locations.length == 1 && locations[0] == "ItemVulva") { + suff = ""; + } else { + let sum = ""; + if (locations.length > 3) + sum = TextGet("KinkyDungeonPlayerVibratedLocationMultiple"); + else for (let l of locations) { + if (sum) sum = sum + ", "; + sum = sum + TextGet("KinkyDungeonPlayerVibratedLocation" + l); + } + suff = ` (${sum})`; + } + statsDraw.vibe = { + text: TextGet("KinkyDungeonPlayerVibrated" + Math.max(0, Math.min(Math.floor(KinkyDungeonVibeLevel), 5))) + suff, + category: "kinky", color: "#ff8888", bgcolor: "#333333", priority: 11, + icon: "Vibe" + Math.max(0, Math.min(Math.floor(KinkyDungeonVibeLevel), 5)), + }; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerVibrated" + Math.max(0, Math.min(Math.floor(KinkyDungeonVibeLevel), 5))) + suff, X3, 900 - i * 35, 260, "#ff8888", "#333333"); i++; + } + if (KDGameData.OrgasmStamina > 0) { + statsDraw.sex = { + text: TextGet("KinkyDungeonPlayerStatisfied"), + icon: "Satisfied", + category: "kinky", color: "#ff88aa", bgcolor: "#333333", priority: 7, + }; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerStatisfied"), X3, 900 - i * 35, 260, "#ff8888", "#333333"); i++; + } else if (KDGameData.OrgasmTurns > KinkyDungeonOrgasmTurnsCrave) { + statsDraw.sex = { + text: TextGet("KinkyDungeonPlayerEdged"), + icon: "Edged", + category: "kinky", color: "#ff5277", bgcolor: "#333333", priority: 7, + }; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerEdged"), X3, 900 - i * 35, 260, "#ff5277", "#333333"); i++; + } + if (KDGameData.CurrentVibration && KDGameData.CurrentVibration.denyTimeLeft > 0) { + statsDraw.deny = { + text: TextGet("KinkyDungeonPlayerDenied"), + icon: "Denied", + category: "kinky", color: "#ff5277", bgcolor: "#333333", priority: 12, + }; + //DrawTextFitKD(TextGet("KinkyDungeonPlayerDenied"), X3, 900 - i * 35, 260, "#ff8888", "#333333"); i++; + } + + for (let b of Object.values(KinkyDungeonPlayerBuffs)) { + if ((b.aura || b.labelcolor) && b.duration > 0 && !b.hide) { + let count = b.maxCount > 1 ? b.maxCount - (b.currentCount ? b.currentCount : 0) : 0; + let pri = 0; + if (b.duration) pri += Math.min(90, b.duration); + if (count) pri += Math.min(10, count); + let t = TextGet("KinkyDungeonBuff" + (b.desc || b.id)) + (count ? ` ${count}/${b.maxCount}` : "") + ((b.duration > 1 && b.duration < 1000) ? ` (${b.duration})` : ""); + if (b.buffTextReplace) { + for (let replace of Object.entries(b.buffTextReplace)) { + t = t.replace(replace[0], (replace as [string , string])[1]); + } + } + statsDraw[b.id] = { + text: t, + count: b.text ? b.text : + b.type == "Shield" ? (`${Math.round(b.power*10)} (${b.duration})`) : + (((count ? `${count}/${b.maxCount}` : "") + ((b.duration > 1 && b.duration < 1000) ? ((count ? " " : "") + `${b.duration}`) : ""))), + icon: (KDBuffSprites[b.id] || b.buffSprite) ? "buff/buff" + (b.buffSpriteSpecific || b.id) : undefined, + //countcolor: b.aura ? b.aura : b.labelcolor, + category: "buffs", color: b.aura ? b.aura : b.labelcolor, bgcolor: "#333333", priority: pri, + buffid: b.id, + click: b.click, + }; + //DrawTextFitKD(TextGet("KinkyDungeonBuff" + b.id) + (count ? ` ${count}/${b.maxCount}` : "") + ((b.duration > 1 && b.duration < 1000) ? ` (${b.duration})` : ""), 790, 900 - i * 35, 275, b.aura ? b.aura : b.labelcolor, "#333333"); i++; + } + + } + + if (KDToggleShowAllBuffs) + for (let perk of KinkyDungeonStatsChoice.keys()) { + if (KDPerkIcons[perk] && KDPerkIcons[perk]()) { + statsDraw["p" + perk] = { + text: TextGet("KinkyDungeonStatDesc" + KinkyDungeonStatsPresets[perk].id), + count: KDPerkCount[perk] ? KDPerkCount[perk]() : undefined, + icon: "perk/perk" + perk, + //countcolor: b.aura ? b.aura : b.labelcolor, + category: "perk", color: "#ffffff", bgcolor: "#333333", priority: 0, + }; + } + } + + KinkyDungeonSendEvent("drawBuffIcons", {stats: statsDraw}); + + KDDrawBuffIcons(minXX, minYY, statsDraw, side); +} + +function KDDrawBuffIcons(minXX: number, minYY: number, statsDraw: Record, side: boolean) { + // Draw the buff icons + let II = 0; + let spriteSize = 46; + let sorted = Object.values(statsDraw).sort((a, b) => { + return (b.priority + KDStatsOrder[b.category]) - (a.priority + KDStatsOrder[a.category]); + }); + let maxXX = minXX + 800; + let maxYY = minYY + 500; + let YY = minYY; + let textWidth = 44; + let XX = minXX; + let XXspacing = spriteSize + 3; + let YYspacing = spriteSize + 3; + let currCategory = ""; + let tooltip = false; + let tooltipY = 700; + + //if (Object.values(statsDraw).length > 0 || KDToggleShowAllBuffs) + if (DrawButtonKDEx("toggleShowAllBuffs", (_bdata) => { + KDToggleShowAllBuffs = !KDToggleShowAllBuffs; + return true; + }, true, + side ? (minXX - 5) : (minXX - 5 - spriteSize), side ? (minYY - 80) : (minYY - 26), side ? (spriteSize + 15) : (spriteSize + 5), side ? (spriteSize + 15) : (spriteSize + 10), undefined, "#ffffff", // + 0.8*spriteSize + KinkyDungeonRootDirectory + (side ? "Buffs/BuffDotsSide.png" : "Buffs/BuffDots.png"), undefined, false, true, undefined, undefined, true, + { + zIndex: 10, + })) { + DrawTextFitKD(TextGet("KDExpandBuffs"), minXX, tooltipY, 1000, "#ffffff", "#000000", 22, "left", 160, 1.0, 8); + tooltip = true; + } + + let resetX = () => { + XX = minXX; + }; + let resetY = () => { + YY = minYY; + }; + resetX(); + resetY(); + + for (let stat of sorted) { + if (side) { + if ((YY > minYY) && (KDStatsSkipLine[currCategory] || KDStatsSkipLineBefore[stat.category]) && currCategory != stat.category) { + + if (KDToggleShowAllBuffs) { + resetY(); + XX += XXspacing; + } + } + } else { + if (((!KDMinBuffX && XX > minXX) || (KDMinBuffX && XX > KDMinBuffX)) && (KDStatsSkipLine[currCategory] || KDStatsSkipLineBefore[stat.category]) && currCategory != stat.category) { + + if (KDToggleShowAllBuffs) { + resetX(); + YY -= YYspacing; + } + } + } + + + currCategory = stat.category; + + if (stat.count) + DrawTextFitKDTo(kdstatusboard, stat.count, XX + spriteSize/2, YY + spriteSize/2 - 10, textWidth, stat.countcolor || "#ffffff", "#000000", + 16, undefined, 151.1, undefined, 5); + + if (!tooltip && MouseIn(XX, YY - Math.ceil(spriteSize/2), spriteSize, spriteSize)) { + FillRectKD(kdcanvas, kdpixisprites, "buffttDesc", { + Left: (side ? XX + 100 : minXX) - 10, + Top: (side ? YY : tooltipY) - 17, + Width: 1020, + Height: 32, + Color: "#222222", + zIndex: 159, + alpha: 0.5, + }); + DrawTextFitKD(stat.text, side ? XX + 100 : minXX, side ? YY : tooltipY, 1000, stat.color, + "#000000", 22, "left", 160, 1.0, 8); + tooltip = true; + if (stat.click) { + DrawButtonKDEx("statHighlight" + II, (_bdata) => { + KDSendInput("buffclick", { + click: stat.click, + buff: stat.buffid, + }); + return true; + }, true, + XX, YY - Math.ceil(spriteSize/2), spriteSize, spriteSize, undefined, "#ffffff", + undefined, undefined, false, true, undefined, undefined, undefined, + { + zIndex: 10, + }); + } + } + + KDDraw(kdstatusboard, kdpixisprites, "stat" + II, KinkyDungeonRootDirectory + "Buffs/" + (stat.icon || "buff/buff") + ".png", + XX, YY - Math.ceil(spriteSize/2), spriteSize, spriteSize, undefined, { + zIndex: 151, + }); + + if (side) { + YY += XXspacing; + if (YY > maxYY) { + if (KDToggleShowAllBuffs) { + resetY(); + XX += XXspacing; + } else { + break; + } + } + } else { + XX += XXspacing; + if (XX > maxXX) { + if (KDToggleShowAllBuffs) { + resetX(); + YY -= YYspacing; + } else { + break; + } + } + } + + II++; + } +} + +function KDDrawStruggleGroups() { + let i = 0; + // Draw the struggle buttons if applicable + KinkyDungeonDrawStruggleHover = false; + if (!KDShowQuickInv() && ((KinkyDungeonDrawStruggle > 0 || MouseIn(0, 0, 500, 1000)) && KinkyDungeonStruggleGroups)) + for (let sg of KinkyDungeonStruggleGroups) { + let ButtonWidth = 48; + let x = 5 + ((!sg.left) ? (490 - ButtonWidth) : 0); + let y = 10 + sg.y * (ButtonWidth + 4); // Originally 46 + + let item = KinkyDungeonGetRestraintItem(sg.group); + let drawLayers = 0; + + let MY = 200; + let surfaceItems = []; + let dynamicList = []; + let noRefreshlists = false; + + + i = 0; + + let StruggleType = ""; + + let renderedButtons = false; + let renderButtons = () => { + if (item && (MouseIn(((!sg.left) ? (260) : 0), y, 500, (ButtonWidth)) + || KinkyDungeonDrawStruggle == KDDrawStruggleEnum.NONE + || KinkyDungeonDrawStruggle == KDDrawStruggleEnum.STRUGGLE)) { + + renderedButtons = true; + //let r = KDRestraint(item); + + if (!KinkyDungeonDrawStruggleHover) { + KinkyDungeonDrawStruggleHover = true; + } + + + let buttons = ["Struggle", "CurseInfo", "CurseUnlock", "Cut", "Remove", "Pick"]; + + if (KinkyDungeonControlsEnabled()) + for (let button_index = 0; button_index < buttons.length; button_index++) { + let btn = buttons[sg.left ? button_index : (buttons.length - 1 - button_index)]; + + if (btn == "Struggle") { + if (DrawButtonKDEx("sgStruggle" + button_index + sg.group, (_b) => { + if ((KDGetCurse(item))) KDSendInput("struggleCurse", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], curse: (KDGetCurse(item))}); + else { + if (KinkyDungeonFastStruggle) { + KinkyDungeonFastStruggleGroup = sg.group; + KinkyDungeonFastStruggleType = "Struggle"; + } else + KDSendInput("struggle", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], type: "Struggle"}); + //KinkyDungeonStruggle(sg, "Struggle"); + } + return true; + }, true, x + 495 - ButtonWidth + ((sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, + "", "#ffffff", KinkyDungeonRootDirectory + "Struggle.png", "", undefined, true, KDButtonColorIntense, undefined, undefined, {scaleImage: true})) + StruggleType = btn; + i++; + } else if ((KDGetCurse(item)) && btn == "CurseInfo") { + DrawButtonKDEx("sgCurseInfo" + button_index + sg.group, (_b) => { + KinkyDungeonCurseInfo(item, (KDGetCurse(item))); + return true; + }, true, x + 495 - ButtonWidth + ((sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, "", "#ffffff", KinkyDungeonRootDirectory + ((KDGetCurse(item) && KDCurses[KDGetCurse(item)].customIcon_RemoveFailure) ? KDCurses[KDGetCurse(item)].customIcon_RemoveFailure : "CurseInfo") + ".png", "", undefined, true, KDButtonColorIntense, undefined, undefined, {scaleImage: true}); i++; + } else if ((KDGetCurse(item)) && btn == "CurseUnlock" && KinkyDungeonCurseAvailable(item, (KDGetCurse(item)))) { + DrawButtonKDEx("sgCurseUnlock" + button_index + sg.group, (_b) => { + KDSendInput("curseUnlock", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], curse: (KDGetCurse(item))}); + return true; + }, true, x + 495 - ButtonWidth + ((sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, "", "#ffffff", KinkyDungeonRootDirectory + ((KDGetCurse(item) && KDCurses[KDGetCurse(item)].customIcon_RemoveSuccess) ? KDCurses[KDGetCurse(item)].customIcon_RemoveSuccess : "CurseUnlock") + ".png", "", undefined, true, KDButtonColorIntense, undefined, undefined, {scaleImage: true}); i++; + } else if (!(KDGetCurse(item)) && !sg.blocked && btn == "Remove") { + + let toolSprite = (item.lock) ? KDGetLockVisual(item) : "Buckle.png"; + if (DrawButtonKDEx("sgRemove" + button_index + sg.group, (_b) => { + if (KinkyDungeonFastStruggle) { + KinkyDungeonFastStruggleGroup = sg.group; + KinkyDungeonFastStruggleType = (item.lock) ? "Unlock" : "Remove"; + } else + KDSendInput("struggle", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], type: (item.lock) ? "Unlock" : "Remove"}); + return true; + }, true, x + 495 - ButtonWidth + ((sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, "", "#ffffff", KinkyDungeonRootDirectory + toolSprite, "", undefined, true, KDButtonColorIntense, undefined, undefined, {scaleImage: true})) + StruggleType = (item.lock) ? "Unlock" : "Remove"; + i++; + } else if (!(KDGetCurse(item)) && !sg.blocked && btn == "Cut" + && (KinkyDungeonAllWeapon().some((inv) => {return KDWeapon(inv).light && KDWeapon(inv).cutBonus != undefined;}) || KinkyDungeonGetAffinity(false, "Sharp")) + && !sg.noCut) { + let name = ((KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.name && !KinkyDungeonPlayerDamage.unarmed) ? "Items/" + KinkyDungeonPlayerDamage.name + ".png" : "Cut.png"); + if ( + DrawButtonKDEx("sgCut" + button_index + sg.group, (_b) => { + if (KinkyDungeonFastStruggle) { + KinkyDungeonFastStruggleGroup = sg.group; + KinkyDungeonFastStruggleType = "Cut"; + } else + KDSendInput("struggle", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], type: "Cut"}); + //KinkyDungeonStruggle(sg, "Cut"); + return true; + }, true, x + 495 - ButtonWidth + ((sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, "", + (sg.magic) ? "#8394ff" : "#ffffff", KinkyDungeonRootDirectory + name, "", undefined, true, (sg.magic) ? "#8394ff" : KDButtonColorIntense, undefined, undefined, {scaleImage: true})) + StruggleType = btn; + i++; + } else if (!(KDGetCurse(item)) && !sg.blocked && btn == "Pick" && KinkyDungeonItemCount("Pick") > 0 && item.lock) { + if ( + DrawButtonKDEx("sgPick" + button_index + sg.group, (_b) => { + if (KinkyDungeonFastStruggle) { + KinkyDungeonFastStruggleGroup = sg.group; + KinkyDungeonFastStruggleType = "Pick"; + } else + KDSendInput("struggle", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], type: "Pick"}); + //KinkyDungeonStruggle(sg, "Pick"); + return true; + }, true, x + 495 - ButtonWidth + ((sg.left) ? -(ButtonWidth)*i : (ButtonWidth)*i), y, ButtonWidth, ButtonWidth, "", "#ffffff", KinkyDungeonRootDirectory + "UseTool.png", "", undefined, true, KDButtonColorIntense, undefined, undefined, {scaleImage: true})) + StruggleType = btn; + i++; + } + } + } + }; + + if (KDStruggleGroupLinkIndex[sg.group] && item && item.dynamicLink) { + surfaceItems = KDDynamicLinkListSurface(item); + dynamicList = KDDynamicLinkList(item, true); + noRefreshlists = true; + if (!KDStruggleGroupLinkIndex[sg.group] || KDStruggleGroupLinkIndex[sg.group] >= surfaceItems.length) { + KDStruggleGroupLinkIndex[sg.group] = 0; + } + item = surfaceItems[KDStruggleGroupLinkIndex[sg.group]]; + } else if (KDStruggleGroupLinkIndex[sg.group] > 0) delete KDStruggleGroupLinkIndex[sg.group]; + if (MouseIn(((!sg.left) ? (260) : 0), y, 500, (ButtonWidth+3)) && sg) { + + + + //if (MouseY < y) { + if (KDToggles.ShowRestraintOnHover || MouseIn(0, 0, 250, 1000)) + KinkyDungeonDrawInventorySelected(KDGetItemPreview(item), false, true, 700); + //} + + let data = { + struggleGroup: sg, + struggleIndex: KDStruggleGroupLinkIndex ? KDStruggleGroupLinkIndex[sg.group] : 0, + surfaceItems: surfaceItems, + dynamicList: dynamicList, + item: item, + group: sg.group, + extraLines: [], + extraLineColor: [], + }; + KinkyDungeonSendEvent("drawSGTooltip", data); + let lastO = 0; + + let fontSize = KD_HUD_RESTRAINTINFOFONTSIZE; + let lineSize = KD_HUD_RESTRAINTINFOLINESIZE; + + let OInit = lastO; + + // 0 = no draw + // 1 = grey + // 2 = white + if (dynamicList.length > 0 || (item && item.dynamicLink)) { + if (!noRefreshlists) { + surfaceItems = KDDynamicLinkListSurface(item); + dynamicList = KDDynamicLinkList(item, true); + } + if (surfaceItems.length <= 1) { + // Delete if there are no additional surface items + delete KDStruggleGroupLinkIndex[sg.group]; + drawLayers = 1; + } else { + if (!KDStruggleGroupLinkIndex[sg.group] || KDStruggleGroupLinkIndex[sg.group] >= surfaceItems.length) { + KDStruggleGroupLinkIndex[sg.group] = 0; + } + item = surfaceItems[KDStruggleGroupLinkIndex[sg.group]]; + + drawLayers = 2; + } + + let O = OInit + 1; + let drawn = false; + for (let d of dynamicList) { + //if (d != item)//KDRestraint(item) && (!KDRestraint(item).UnLink || d.name != KDRestraint(item).UnLink)) + //{ + drawn = true; + let msg = KDGetItemName(d);//TextGet("Restraint" + d.name); + let ic = d.lock; + if (KDGetCurse(d)) ic = KDCurses[KDGetCurse(d)]?.customIcon_hud || "Curse"; + + if (ic) { + KDDraw(kdcanvas, kdpixisprites, "dynlist" + d.name + ic + O, KinkyDungeonRootDirectory + `Locks/${ic}.png`, + 530 + 1, MY - lineSize/2 + O * lineSize + 1, lineSize - 2, lineSize - 2, undefined, {zIndex: 150}); + } + DrawTextKD(msg, 530 + lineSize, MY + O * lineSize, d == item ? "#ffffff" : (surfaceItems.includes(d) ? "#999999" : "#aa5555"), "#333333", fontSize, "left", 150); + + if ((d.struggleProgress > 0 || d.cutProgress > 0)) { + if (d.struggleProgress > 0) + FillRectKD(kdcanvas, kdpixisprites, "Hovprogress"+d.id, { + Left: 530 + lineSize + (d.cutProgress ? 5 : 1) + 250*(d.cutProgress || 0), + Top: MY - lineSize/2 + O * lineSize + 1 + lineSize - 5, + Width: Math.max(1, 250 * (d.struggleProgress) - (d.cutProgress ? 4 : 0)), + Height: 4, + Color: "#aaaaaa", + zIndex: 161, + alpha: 0.7, + }); + if (d.cutProgress > 0) + FillRectKD(kdcanvas, kdpixisprites, "Hovprogresscut"+d.id, { + Left: 530 + lineSize + 1, + Top: MY - lineSize/2 + O * lineSize + 1 + lineSize - 5, + Width: 250 * d.cutProgress, + Height: 4, + Color: "#ff5277", + zIndex: 162, + alpha: 0.7, + }); + } + O++; + //} + } + lastO = O; + O = OInit; + if (drawn) { + DrawTextKD(TextGet("KinkyDungeonItemsUnderneathTotal"), 530, MY + O * lineSize, "#ffffff", "#333333", fontSize, "left", 150); + } + O = lastO + 1; + } + + if (!currentDrawnSG) { + currentDrawnSG = sg; + currentDrawnSGLength = surfaceItems.length; + } + + if (data.extraLines.length > 0) { + for (let lineIndex = 0; lineIndex < data.extraLines.length; lineIndex++) { + DrawTextFitKD(data.extraLines[lineIndex], 530, MY + lastO * lineSize, 700,data.extraLineColor[lineIndex] || "#ffffff", "#000000", fontSize, "left", 150); + lastO += 1; + } + } + + if (lastO) lastO += 1; + if (item && KDRestraint(item) && KinkyDungeonStrictness(false, KDRestraint(item).Group, item)) { + let strictItems = KinkyDungeonGetStrictnessItems(KDRestraint(item).Group, item); + let O = lastO + 1; + let drawn = false; + for (let s of strictItems) { + drawn = true; + let msg = KDGetItemNameString(s);//TextGet("Restraint" + s); + DrawTextKD(msg, 530, MY + O * lineSize, "#ffffff", "#333333", fontSize, "left"); + O++; + } + let lastlastO = O; + O = lastO; + if (drawn) { + DrawTextKD(TextGet("KinkyDungeonItemsStrictness"), 530, MY + O * lineSize, "#ffffff", "#333333", fontSize, "left", 150); O++; + } + + O = lastlastO + 1; + lastO = O; + + } + if (item.tightness > 0 && !KDGetCurse(item) && (KDRestraint(item).escapeChance?.Struggle < 1 || KDRestraint(item).escapeChance?.Remove < 1)) { + if (!sg.blocked) { + let O = lastO; + DrawTextKD(TextGet("KDItemsTightness").replace("TTT", + TextGet("KDTightness" + (KDRestraint(item)?.tightType || "") + KDTightnessRank(item.tightness)) + ), 530, MY + O * lineSize, "#ffffff", "#333333", fontSize, "left", 150); O++; + } + + } + + if (!renderedButtons) { + renderButtons(); + } + + if (StruggleType && !sg.blocked) { + // @ts-ignore + let struggleData: KDStruggleData = {}; + KinkyDungeonStruggle(KDRestraint(item).Group, StruggleType, data.struggleIndex, true, struggleData); + + if (struggleData.lockType && (StruggleType == "Unlock" && !struggleData.lockType.canUnlock(struggleData)) + || (StruggleType == "Pick" && struggleData.lockType && !struggleData.lockType.canPick(struggleData))) { + // Nope + } else { + let O = lastO + 1; + DrawTextKD(TextGet("KDItemDifficulty").replace("AMNT", + Math.max(0, + Math.round(100 * + (0.01 * (item.tightness || 0) + + 1 + - struggleData.origEscapeChance + struggleData.escapePenalty + + Math.max(0, struggleData.extraLim, struggleData.limitChance)))) + + "" + + ((struggleData.escapePenalty) ? ` (${struggleData.escapePenalty > 0 ? + Math.round(-100 * struggleData.escapePenalty) + : "+" + Math.round(-100 * struggleData.escapePenalty) + }${struggleData.escapePenalty > 0 ? TextGet("KDPenalty") : TextGet("KDBonus")})` : "") + ).replace("ESCP", TextGet("KDEscape" + StruggleType)), + 530, MY + O * lineSize, "#ffffff", "#333333", fontSize, "left", 150); O++; + let a = Math.min(10, Math.max(-10, struggleData.escapeChance + - Math.max(0, struggleData.extraLim, struggleData.limitChance))); + let b = Math.min(10, Math.max(-10, struggleData.escapeChance)); + + if (StruggleType == "Cut") { + let maxPossible: number; + let threshold = 0.75; + if (struggleData.limitChance > struggleData.escapeChance && struggleData.limitChance > 0) { + threshold = Math.min(threshold, 0.9*(struggleData.escapeChance / struggleData.limitChance)); + } else if (struggleData.limitChance == struggleData.escapeChance || struggleData.limitChance == 0) { + threshold = 0; + } + + if (struggleData.limitChance > 0) { + threshold = KDMaxCutDepth(threshold, struggleData.cutBonus, struggleData.origEscapeChance, struggleData.origLimitChance); + // Find the intercept + maxPossible = Math.max(0, threshold); + } else maxPossible = struggleData.escapeChance > 0 ? 1 : 0; + a = maxPossible; + b = maxPossible; + } + + let amnt = (StruggleType != "Struggle") ? + Math.round(100 * a) + + " -> " + + Math.round(100 * b) + : + Math.round(100 * b) + + " -> " + + Math.round(100 * a); + if (a < 0 && b < 0) + amnt = Math.round(100 * Math.max(a, b)) + ""; + else if (a == b) + amnt = Math.round(100 * a) + ""; + else if (a < 0 && b > 0) { + a = Math.max(0, a); + if (a == b) { + amnt = Math.round(100 * a) + ""; + } else { + amnt = Math.round(100 * b) + + " -> " + + Math.round(100 * a); + } + + } else if (a < 0 && b == 0) { + amnt = Math.round(100 * a) + ""; + } + DrawTextKD(TextGet("KDItemStruggle" + (StruggleType)).replace("AMNT", + amnt + ).replace("ESCP", TextGet("KDEscape" + StruggleType)), + 530, MY + O * lineSize, "#ffffff", "#333333", fontSize, "left", 150); O++; + + + lastO = O - 1; + } + } + + + + FillRectKD(kdcanvas, kdpixisprites, "selectedBG", { + Left: 510, Top: MY - 20, Width: 740, + Height: lastO * lineSize + 40, + Color: "#000000", alpha: 0.7, zIndex: 110 + }); + } + + let mini = (KinkyDungeonDrawStruggle == KDDrawStruggleEnum.MOST && !MouseIn(0, 0, 500, 1000)) + || (KinkyDungeonDrawStruggle == KDDrawStruggleEnum.STRUGGLE && !(MouseIn(((!sg.left) ? (260) : 0), y, 500, (ButtonWidth)) || KinkyDungeonDrawStruggle > 2)); + + let color = "#ffffff"; + //if (item && (item.lock || KDGetCurse(item)) {color = "#ffaadd";} + let icon = item.lock; + if (KDGetCurse(item)) icon = KDCurses[KDGetCurse(item)]?.customIcon_hud || "Curse"; + if (!icon && sg.blocked) icon = "Blocked"; + + if (icon) { + KDDraw(kdcanvas, kdpixisprites, "icon" + sg.name + icon, KinkyDungeonRootDirectory + `Locks/${icon}.png`, + x + 3, y + 5 + (mini ? ButtonWidth/2 : 0), (mini ? ButtonWidth/2 : ButtonWidth) - 10, (mini ? ButtonWidth/2 : ButtonWidth) - 10, undefined, {zIndex: 70}); + } + + let GroupText = (sg.name && item) ? (KDGetItemName(item)) : ( TextGet("KinkyDungeonGroup"+ sg.group)); // The name of the group to draw. + + if (!mini) + DrawTextFitKD(GroupText, x + (icon? ButtonWidth : 0) + ((!sg.left) ? ButtonWidth - (drawLayers ? ButtonWidth : 0) : 0), y + ButtonWidth/2, 250 - (icon ? ButtonWidth : 0), color, "#333333", 24, sg.left ? "left" : "right"); + else { + KDDraw(kdcanvas, kdpixisprites, "iconrest" + sg.name + GroupText, KDGetItemPreview(item).preview, + x + 3, y + 5, ButtonWidth, ButtonWidth, undefined, {zIndex: 69}); + //KDDraw(kdcanvas, kdpixisprites, "iconrest2" + sg.name + GroupText, KDGetItemPreview(item).preview2, + //x + 3, y + 5, ButtonWidth, ButtonWidth, undefined, {zIndex: 69.1}); + } + + if (drawLayers) { + KDDraw(kdcanvas, kdpixisprites, "layers" + sg.name, KinkyDungeonRootDirectory + "Layers.png", + x + (sg.left ? 250 : 12), y, 48, 48, undefined, {zIndex: 70}); + + } + DrawButtonKDEx("surfaceItems"+sg.group, (_bdata) => { + if (drawLayers && surfaceItems.length > 1 && MouseInKD("surfaceItems"+sg.group)) { + if (!KDStruggleGroupLinkIndex[sg.group]) KDStruggleGroupLinkIndex[sg.group] = 1; + else KDStruggleGroupLinkIndex[sg.group] = KDStruggleGroupLinkIndex[sg.group] + 1; + } + return true; + }, drawLayers == 2, x + (sg.left ? 0 : 12), y, mini ? 48 : 250, 48, "", drawLayers == 2 ? "#ffffff" : "#888888", "", "", undefined, !(drawLayers == 2), KDTextGray05, 24, undefined, { + zIndex: 40, + alpha: 0.1, + }); + if (KDToggles.StruggleBars && !mini && (item.struggleProgress > 0 || item.cutProgress > 0)) { + if (item.struggleProgress > 0) + FillRectKD(kdcanvas, kdpixisprites, "progress"+sg.group, { + Left: x + (sg.left ? (item.cutProgress ? 5 : 1) : 12) + 250*(item.cutProgress || 0), + Top: y + 37, + Width: Math.max(1, 250 * (item.struggleProgress) - (item.cutProgress ? 4 : 0)), + Height: 9, + Color: "#aaaaaa", + zIndex: 41, + alpha: 0.7, + }); + if (item.cutProgress > 0) + FillRectKD(kdcanvas, kdpixisprites, "progresscut"+sg.group, { + Left: x + (sg.left ? 1 : 12), + Top: y + 37, + Width: 250 * item.cutProgress, + Height: 9, + Color: "#ff5277", + zIndex: 42, + alpha: 0.7, + }); + } + + + + + + if (!renderedButtons) { + renderButtons(); + } + } + +} + +/** + * @param tightness + */ +function KDTightnessRank(tightness: number): string { + let factor = Math.min(10, Math.max(0, Math.floor(tightness/2) * 2)); + return factor + ""; +} + +function KDTrySetFocusControl(control: string) { + if (!KDFocusControls) { + if (!KDFocusHoverEnter || KDFocusHoverLast != control) { + KDFocusHoverEnter = CommonTime(); + } else if (CommonTime() > KDFocusHoverEnter + KDFocusHoverDelay) + KDSetFocusControl(control); + } + KDFocusHoverLast = KDFocusControls || control; +} \ No newline at end of file diff --git a/Game/src/base/KinkyDungeonInput.ts b/Game/src/base/KinkyDungeonInput.ts new file mode 100644 index 000000000..b7ab0edbd --- /dev/null +++ b/Game/src/base/KinkyDungeonInput.ts @@ -0,0 +1,1424 @@ + + +let KinkyDungeonInputQueue: {type: string, data: any}[] = []; + +/** + * Delegate to KDProcessInputs + */ +function KDProcessInput(type: string, data: any): string { + let Result = null; + let loose = null; + let msg = ""; + let success = 0; + let tile = null; + + KDUpdateEnemyCache = true; + switch (type) { + case "move": + KDInteracting = false; + KinkyDungeonToggleAutoPass = data.AutoPass; + KinkyDungeonToggleAutoSprint = data.sprint; + KinkyDungeonSuppressSprint = data.SuppressSprint; + return KinkyDungeonMove(data.dir, data.delta, data.AllowInteract, data.SuppressSprint) ? "move" : "nomove"; + //break; + case "setMoveDirection": + KinkyDungeonMoveDirection = data.dir; + break; + case "tick": + if (data.sleep == 10 && (KDGameData.PrisonerState == 'jail' || KDGameData.PrisonerState == 'parole') && KinkyDungeonPlayerInCell()) { + KDKickEnemies(KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y), false, MiniGameKinkyDungeonLevel, true); + } + if (data.sleep && KinkyDungeonStatWill < KinkyDungeonStatWillMax * KDGetSleepWillFraction()) KDChangeWill("player","wait", "tick", KinkyDungeonStatWillMax/KDMaxStatStart * KDSleepRegenWill, false); + KinkyDungeonAdvanceTime(data.delta, data.NoUpdate, data.NoMsgTick); + break; + case "tryCastSpell": { + KDDelayedActionPrune(["Action", "Cast"]); + let sp = data.spell ? data.spell : KinkyDungeonFindSpell(data.spellname, true); + if (!data.spell) data.spell = sp; + if (sp) { + let res: { result: string, data: any } = KinkyDungeonCastSpell(data.tx, data.ty, sp, data.enemy, data.player, data.bullet, undefined, data); + if (res.result == "Cast" && sp.sfx) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + sp.sfx + ".ogg"); + } + if (res.result != "Fail" && !sp.quick) { + KinkyDungeonAdvanceTime(res.data.delta); + } + KinkyDungeonInterruptSleep(); + Result = res.result; + return Result; + } + return "Fail"; + } + case "lock": { + KDDelayedActionPrune(["Action", "Struggle"]); + let item = KinkyDungeonGetRestraintItem(data.group); + if (data.index) { + let surfaceItems = KDDynamicLinkListSurface(item); + if (surfaceItems[data.index]) + item = surfaceItems[data.index]; + else console.log("Error! Please report the item combination and screenshot to Ada!"); + } + KinkyDungeonLock(item, data.type); + break; + } + case "struggle": + KDDelayedActionPrune(["Action", "Struggle"]); + return KinkyDungeonStruggle(data.group, data.type, data.index); + case "struggleCurse": { + KDDelayedActionPrune(["Action", "Struggle"]); + let item = KinkyDungeonGetRestraintItem(data.group); + if (data.index) { + let surfaceItems = KDDynamicLinkListSurface(item); + if (surfaceItems[data.index]) + item = surfaceItems[data.index]; + else console.log("Error! Please report the item combination and screenshot to Ada!"); + } + KinkyDungeonCurseStruggle(item, data.curse); + break; + } + case "curseUnlock": + KDDelayedActionPrune(["Action", "Struggle"]); + KinkyDungeonCurseUnlock(data.group, data.index, data.curse); + break; + case "toggleSpell": { + KinkyDungeonSpellChoicesToggle[data.i] = !KinkyDungeonSpellChoicesToggle[data.i]; + let spell = KDGetUpcast(KinkyDungeonSpells[KinkyDungeonSpellChoices[data.i]].name, + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellEmpower")) || KinkyDungeonSpells[KinkyDungeonSpellChoices[data.i]]; + KinkyDungeonSendEvent("toggleSpell", {index: data.i, spell: spell}, + spell); + + if (KinkyDungeonSpellChoicesToggle[data.i] && spell.costOnToggle) { + if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell))) { + KDChangeMana(spell.name,"spell", "cast", -KinkyDungeonGetManaCost(spell)); + } else KinkyDungeonSpellChoicesToggle[data.i] = false; + } + + if (spell.name != KinkyDungeonSpells[KinkyDungeonSpellChoices[data.i]].name) { + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "upcast", 1); + } + break; + } + case "consumable": + //KDModalArea = false; + KinkyDungeonAttemptConsumable(data.item, data.quantity); + //KinkyDungeonTargetTile = null; + //KinkyDungeonTargetTileLocation = null; + break; + + case "quickRestraint": + KinkyDungeonAttemptQuickRestraint(data.item); + break; + + case "switchWeapon": { + if (data?.pref != undefined) KDWeaponSwitchPref = data.pref; + KDDelayedActionPrune(["Action", "SwitchWeapon"]); + if (!data.noOld) { + let oldweapon = KinkyDungeonPlayerWeapon; + if (!KDGameData.PreviousWeapon || typeof KDGameData.PreviousWeapon === 'string') KDGameData.PreviousWeapon = []; + while (KDGameData.PreviousWeapon.length < KDMaxPreviousWeapon) { + KDGameData.PreviousWeapon.push("Unarmed"); + } + if (!KDGameData.PreviousWeaponLock || !KDGameData.PreviousWeaponLock[KDWeaponSwitchPref]) + KDGameData.PreviousWeapon[KDWeaponSwitchPref] = oldweapon; + } + /*while (KDGameData.PreviousWeapon?.length > KDMaxPreviousWeapon) { + KDGameData.PreviousWeapon.splice(0, 1); + }*/ + KDSetWeapon(data.weapon); + //while (KDGameData.PreviousWeapon?.includes(data.weapon)) KDGameData.PreviousWeapon.splice(KDGameData.PreviousWeapon.indexOf(data.weapon), 1); + KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon(undefined, undefined, KinkyDungeonWeapons[data.weapon])); + let time = (data.weapon && KinkyDungeonWeapons[data.weapon] && KinkyDungeonWeapons[data.weapon].heavy) ? 2 : 1; + if (KinkyDungeonStatsChoice.has("Disorganized")) { + time += 2; + } else if (KinkyDungeonStatsChoice.has("QuickDraw")) + time -= 1; + + if (time > 0) { + KinkyDungeonAdvanceTime(1); + if (time > 1) + KDGameData.SlowMoveTurns = time - 1; + } + KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonEquipWeapon").replace("WEAPONNAME", KDGetItemNameString(data.weapon)), "white", 5); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Equip.ogg"); + + // Reequip offhand if able + if (KDGameData.OffhandOld && !KDGameData.Offhand + && KinkyDungeonInventoryGetWeapon(KDGameData.OffhandOld) + && KinkyDungeonCanUseWeapon(false, undefined, KDWeapon(KinkyDungeonInventoryGetWeapon(KDGameData.OffhandOld))) + && KDCanOffhand(KinkyDungeonInventoryGetWeapon(KDGameData.OffhandOld))) { + KDGameData.Offhand = KDGameData.OffhandOld; + } + break; + } + case "unequipWeapon": + KDDelayedActionPrune(["Action", "SwitchWeapon"]); + if (!KDGameData.PreviousWeapon || typeof KDGameData.PreviousWeapon === 'string') KDGameData.PreviousWeapon = []; + if (data.weapon) + KDGameData.PreviousWeapon.push(data.weapon); + KDSetWeapon(null); + while (KDGameData.PreviousWeapon?.length > KDMaxPreviousWeapon) { + KDGameData.PreviousWeapon.splice(0, 1); + } + KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); + KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonUnEquipWeapon").replace("WEAPONNAME", KDGetItemNameString(data.weapon)), "white", 5); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Equip.ogg"); + break; + case "dress": + KDDelayedActionPrune(["Action", "Dress"]); + KinkyDungeonSetDress(data.dress, data.outfit); + KDGameData.SlowMoveTurns = 5; + KinkyDungeonSleepTime = CommonTime() + 200; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Equip.ogg"); + break; + case "drop": { + KDDropItemInv(data.item); + break; + } + case "buffclick": { + if (KDBuffClick[data.click]) { + KDBuffClick[data.click](data.buff, data.id || KinkyDungeonPlayerEntity); + } + break; + } + case "inventoryAction": { + if (KDInventoryAction[data.action || KDGameData.InventoryAction] && KDInventoryAction[data.action || KDGameData.InventoryAction].valid(data.player, data.item)) { + KDInventoryAction[data.action || KDGameData.InventoryAction].click(data.player, data.item); + } + break; + } + case "equip": { + + let equipped = false; + let newItem: restraint = null; + let currentItem: item = null; + let linkable = null; + let name: string = data.name; + + if (name) { + newItem = KDRestraint({name: name}); + if (newItem) { + currentItem = KinkyDungeonGetRestraintItem(newItem.Group); + if (!currentItem) equipped = false; + else { + if (KDDebugLink) { + linkable = KDCanAddRestraint(KDRestraint(newItem), + true, "", false, currentItem, true, true); + } else { + linkable = KDCanAddRestraint(KDRestraint(newItem), + false, "", false, currentItem, true, + true); + //KDCurrentItemLinkable(currentItem, newItem); + } + if (linkable) { + equipped = false; + } else equipped = true; + } + } + } + + if (equipped) return ""; + + + //KDDelayedActionPrune(["Action", "Equip"]); + KinkyDungeonSetFlag("SelfBondage", 1); + + data.player = KDPlayer().id; + + let maxtime = KDGetEquipDuration(newItem.name, KDPlayer()); + for (let i = 1; i <= maxtime; i++) + KDAddDelayedAction({ + data: data, + commit: i == maxtime ? "EquipRestraint" : undefined, + update: i < maxtime ? "EquipRestraint" : undefined, + time: i, + tick: i - 1, + maxtime: maxtime, + tags: ["Action", "Remove", "Restrain", "Hit"], + }); + KDDelayedActionStart(); + break; + } + case "tryOrgasm": + KDDelayedActionPrune(["Action", "Sexy"]); + KinkyDungeonDoTryOrgasm(data.bonus, 0); + break; + case "tryPlay": + KDDelayedActionPrune(["Action", "Sexy"]); + KinkyDungeonDoPlayWithSelf(); + break; + case "sleep": { + let data = { + cancelSleep: false, + } + KinkyDungeonSendEvent("sleep", data); + if (!data.cancelSleep) + KDGameData.SleepTurns = KinkyDungeonSleepTurnsMax; + break; + } + + case "noise": { + KDDelayedActionPrune(["Action", "Dialogue"]); + let gagTotal = KinkyDungeonGagTotal(true); + KinkyDungeonMakeNoise(Math.ceil(10 - 8 * Math.min(1, gagTotal * gagTotal)), KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, false, true); + KinkyDungeonSendTextMessage(10, TextGet("KDShoutHelp" + Math.min(3, Math.floor(gagTotal *3.3))), "yellow", 1); + KinkyDungeonSetFlag("CallForHelp", 12); + KinkyDungeonSetFlag("GuardCalled", 0); + break; + } + + case "crouch": { + KDGameData.Crouch = !KDGameData.Crouch; + KinkyDungeonAdvanceTime(0); + break; + } + case "pick": + KDDelayedActionPrune(["Action", "Struggle"]); + tile = KinkyDungeonTilesGet(data.targetTile); + KinkyDungeonTargetTile = tile; + KinkyDungeonTargetTileLocation = data.targetTile; + if (KinkyDungeonTargetTile?.Lock) { + if (KinkyDungeonPickAttempt()) { + KinkyDungeonTargetTile.OGLock = KinkyDungeonTargetTile.Lock; + KinkyDungeonTargetTile.Lock = undefined; + KinkyDungeonTargetTile.LockSeen = undefined; + if (KinkyDungeonTargetTile.Type == "Lock") delete KinkyDungeonTargetTile.Type; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + } + KinkyDungeonAdvanceTime(1, true); + KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); + } + break; + case "swipe": + KDDelayedActionPrune(["Action", "Struggle"]); + tile = KinkyDungeonTilesGet(data.targetTile); + KinkyDungeonTargetTile = tile; + KinkyDungeonTargetTileLocation = data.targetTile; + if (KinkyDungeonInventoryGet("KeyCard") != undefined) { + if (KinkyDungeonTargetTile?.Lock) { + KinkyDungeonTargetTile.OGLock = KinkyDungeonTargetTile.Lock; + KinkyDungeonTargetTile.Lock = undefined; + KinkyDungeonTargetTile.LockSeen = undefined; + if (KinkyDungeonTargetTile.Type == "Lock") delete KinkyDungeonTargetTile.Type; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSwipeDoorUse"), "lightgreen", 2); + KinkyDungeonAdvanceTime(1, true); + KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); + // The cards are one-use if you are being chased + if (KDCyberHostile(KinkyDungeonPlayerEntity)) { + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("KeyCard"), -1); + KinkyDungeonSendActionMessage(10, TextGet("KDCyberHostileKeyCard"), "#ff5277", 2); + } + } + } else { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSwipeDoorNone"), "lightgreen", 1); + } + + break; + + case "scan": + KDDelayedActionPrune(["Action", "Struggle"]); + tile = KinkyDungeonTilesGet(data.targetTile); + KinkyDungeonTargetTile = tile; + KinkyDungeonTargetTileLocation = data.targetTile; + if (!KDIsBlindfolded(KinkyDungeonPlayerEntity)) { + if (KDCyberAccess(KinkyDungeonPlayerEntity)) { + if (KinkyDungeonTargetTile?.Lock) { + KinkyDungeonTargetTile.OGLock = KinkyDungeonTargetTile.Lock; + KinkyDungeonTargetTile.Lock = undefined; + KinkyDungeonTargetTile.LockSeen = undefined; + if (KinkyDungeonTargetTile.Type == "Lock") delete KinkyDungeonTargetTile.Type; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonScanDoorUse"), "lightgreen", 2); + KinkyDungeonAdvanceTime(1, true); + KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); + } + } else { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonScanDoorFail"), "lightgreen", 1); + } + } else { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonScanDoorNone"), "lightgreen", 1); + } + + break; + + + case "hack": + KDDelayedActionPrune(["Action", "Struggle"]); + tile = KinkyDungeonTilesGet(data.targetTile); + KinkyDungeonTargetTile = tile; + KinkyDungeonTargetTileLocation = data.targetTile; + if (KDCyberLink(KinkyDungeonPlayerEntity)) { + if (KDTryHack(KinkyDungeonPlayerEntity)) { + if (KinkyDungeonTargetTile?.Lock) { + KinkyDungeonTargetTile.OGLock = KinkyDungeonTargetTile.Lock; + KinkyDungeonTargetTile.Lock = undefined; + KinkyDungeonTargetTile.LockSeen = undefined; + if (KinkyDungeonTargetTile.Type == "Lock") delete KinkyDungeonTargetTile.Type; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonHackDoorUse"), "lightgreen", 2); + KinkyDungeonAdvanceTime(1, true); + KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); + } + } else { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonHackDoorFail"), "lightgreen", 1); + } + } else { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonHackDoorNone"), "lightgreen", 1); + } + + break; + + case "unlock": + KDDelayedActionPrune(["Action", "Struggle"]); + tile = KinkyDungeonTilesGet(data.targetTile); + KinkyDungeonTargetTile = tile; + KinkyDungeonTargetTileLocation = data.targetTile; + + if (KinkyDungeonTargetTile?.Lock) { + KDUpdateDoorNavMap(); + if (KinkyDungeonUnlockAttempt(KinkyDungeonTargetTile.Lock)) { + KinkyDungeonTargetTile.OGLock = KinkyDungeonTargetTile.Lock; + KinkyDungeonTargetTile.Lock = undefined; + KinkyDungeonTargetTile.LockSeen = undefined; + if (KinkyDungeonTargetTile.Type == "Lock") delete KinkyDungeonTargetTile.Type; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + } + KinkyDungeonAdvanceTime(1, true); + KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); + } + break; + case "commandunlock": { + KDDelayedActionPrune(["Action", "Cast"]); + tile = KinkyDungeonTilesGet(data.targetTile); + KinkyDungeonTargetTile = tile; + KinkyDungeonTargetTileLocation = data.targetTile; + + + if (KinkyDungeonTargetTile?.Lock) { + let spell = KinkyDungeonFindSpell("CommandWord", true); + let miscast = KinkyDungeonMiscastChance; + let gagTotal = KinkyDungeonGagTotal(); + if (KinkyDungeoCheckComponents(KinkyDungeonFindSpell("CommandWord"), KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y).failed.length > 0) { + miscast = miscast + Math.max(0, 1 - miscast) * Math.min(1, !KDSpellIgnoreComp(spell) ? gagTotal : 0); + } + if (KDRandom() > miscast) { + KinkyDungeonTargetTile.OGLock = KinkyDungeonTargetTile.Lock; + KinkyDungeonTargetTile.Lock = undefined; + KinkyDungeonTargetTile.LockSeen = undefined; + if (KinkyDungeonTargetTile.Type == "Lock") delete KinkyDungeonTargetTile.Type; + KDUpdateDoorNavMap(); + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + if (gagTotal) { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonUnlockDoorPurpleUseGagged"), "#aa44ff", 1); + } else { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonUnlockDoorPurpleUse"), "#aa44ff", 1); + } + KDChangeMana(spell.name,"spell", "cast", -KinkyDungeonGetManaCost(spell)); + } else { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonUnlockDoorPurpleUseGaggedFail"), "#ff5277", 1); + } + KinkyDungeonAdvanceTime(1, true); + KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); + } + + break; + } + case "closeDoor": { + let x = data.targetTile.split(',')[0]; + let y = data.targetTile.split(',')[1]; + KDDelayedActionPrune(["Action", "World"]); + KinkyDungeonCloseDoor(x, y); + break; + } + case "interact": { + KDDelayedActionPrune(["Action", "World"]); + let tick = KinkyDungeonCurrentTick; + let fail = !KDInteract(data.x, data.y); + if (KinkyDungeonCurrentTick > tick || fail) { + if (KDTurnToFace(data.x, data.y) + && (KinkyDungeonStatsChoice.get("DirectionSlow") || KinkyDungeonStatsChoice.get("DirectionSlow2"))) { + KinkyDungeonAdvanceTime(1); + } + } + break; + } + case "shrineBuy": + KDDelayedActionPrune(["Action", "World"]); + KinkyDungeonShopIndex = data.shopIndex; + KinkyDungeonPayShrine(data.type); + KinkyDungeonAggroAction('shrine', {}); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + break; + case "shrineUse": { + KDDelayedActionPrune(["Action", "World"]); + if (KinkyDungeonGoddessRep[data.type] <= -45) { + //Cursed + KinkyDungeonSendActionMessage(10, TextGet("KDCursedGoddess"), "#ff5277", 2); + return "Fail"; + } + tile = KinkyDungeonTilesGet(data.targetTile); + //KinkyDungeonTargetTile = tile; + //KinkyDungeonTargetTileLocation = data.targetTile; + //KinkyDungeonTargetTile = null; + let mult = 1; + if (tile.mult != undefined) mult = tile.mult; + if (tile.Quest) { + KinkyDungeonSendActionMessage(9, TextGet("KDNeedQuestFirst"), "#ff5277", 1); + + } else { + if (KinkyDungeonGold >= data.cost * mult) { + KinkyDungeonPayShrine(data.type, mult); + KinkyDungeonTilesDelete(KinkyDungeonTargetTileLocation); + KDModalArea = false; + let x = data.targetTile.split(',')[0]; + let y = data.targetTile.split(',')[1]; + KinkyDungeonMapSet(parseInt(x), parseInt(y), "a"); + //KinkyDungeonTargetTileLocation = ""; + KinkyDungeonAggroAction('shrine', {x: parseInt(x), y:parseInt(y)}); + KDGameData.AlreadyOpened.push({x: parseInt(x), y: parseInt(y)}); + KinkyDungeonUpdateStats(0); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + } else { + if (KinkyDungeonShrineTypeRemove.includes(type)) + KinkyDungeonSendActionMessage(9, TextGet("KDNoRestraints"), "#ff5277", 1, true); + else + KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonPayShrineFail"), "#ff5277", 1, true); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Damage.ogg"); + } + KinkyDungeonAdvanceTime(1, true); + KinkyDungeonMultiplayerUpdate(KinkyDungeonNextDataSendTimeDelay); + } + break; + } + case "shrineQuest": { + KDDelayedActionPrune(["Action", "World"]); + tile = KinkyDungeonTilesGet(data.targetTile); + if (tile && !KDHasQuest(tile.Quest)) { + KDAddQuest(tile.Quest); + delete tile.Quest; + tile.mult = 0; + KinkyDungeonSendActionMessage(9, TextGet("KDShrineQuestAccepted"), "#ffffff", 1, false, false, undefined, "Self"); + return "Accept"; + } + + KinkyDungeonSendActionMessage(9, TextGet("KDShrineQuestAcceptedFail"), "#ffffff", 1, false, false, undefined, "Self"); + return "Fail"; + } + case "shrineDevote": { + KDDelayedActionPrune(["Action", "World"]); + if (KinkyDungeonGoddessRep[data.type] <= -45 && KDGameData.Champion != data.type) { + //Cursed + KinkyDungeonSendActionMessage(10, TextGet("KDCursedGoddess"), "#ff5277", 2, false, false, undefined, "Self"); + return "Fail"; + } + + KDGameData.Champion = data.type; + return "Pass"; + } + case "shrinePray": { + KDDelayedActionPrune(["Action", "World"]); + if (KinkyDungeonGoddessRep[data.type] <= -45) { + //Cursed + KinkyDungeonSendActionMessage(10, TextGet("KDCursedGoddess"), "#ff5277", 2, false, false, undefined, "Self"); + return "Fail"; + } + + tile = KinkyDungeonTilesGet(data.targetTile); + if (tile) { + tile.Rescue = true; + } + //KinkyDungeonTargetTile = tile; + //KinkyDungeonTargetTileLocation = data.targetTile; + //KinkyDungeonTargetTile = null; + KDDelayedActionPrune(["Action", "World"]); + let tiles = KinkyDungeonRescueTiles(); + if (tiles.length > 0) { + KDSendStatus('goddess', data.type, 'helpRescue'); + KinkyDungeonChangeRep(data.type, -10); + tile = tiles[Math.floor(tiles.length * KDRandom())]; + if (tile) { + KinkyDungeonMapSet(tile.x, tile.y, "$"); + KinkyDungeonTilesSet(tile.x + "," + tile.y, {Type: "Angel", Light: 5, lightColor: 0xffffff}); + KDStartDialog("AngelHelp","Angel", true, ""); + } + KDGameData.RescueFlag = true; + } + //KinkyDungeonAdvanceTime(1, true); + return "Rescue"; + } + case "shrineDrink": { + if (!KDCanDrinkShrine(false)) { + KinkyDungeonSendActionMessage(9, TextGet("KDNoMana"), "#ff5277", 2, true); + break; + } + KDDelayedActionPrune(["Action", "World"]); + tile = KinkyDungeonTilesGet(data.targetTile); + if (tile) tile.drunk = true; + + // KinkyDungeonStatsChoice.get("Blessed") + let slimed = 0; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).slimeLevel) { + slimed += 1; + KinkyDungeonRemoveRestraint(KDRestraint(inv).Group, false); + } + } + if (slimed) { + KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonPoolDrinkSlime"), "#FF00FF", 2); + KinkyDungeonChangeRep(data.type, -slimed * 2); + } + else KinkyDungeonSendActionMessage(9, TextGet(KinkyDungeonGagTotal() > 0 ? "KinkyDungeonPoolDrinkFace" : "KinkyDungeonPoolDrink"), "#AAFFFF", 2); + + let x = data.targetTile.split(',')[0]; + let y = data.targetTile.split(',')[1]; + + KDChangeMana(x + ',' + y,"map", "interact", KinkyDungeonStatManaMax * 0.5, false, 0, false, true); + KDSendStatus('goddess', data.type, 'shrineDrink'); + KinkyDungeonAggroAction('shrine', {}); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + + KinkyDungeonAdvanceTime(1, true); + + + if (KinkyDungeonGoddessRep[data.type] <= -45) { + //Cursed + KDSummonRevengeMobs(parseInt(x), parseInt(y), tile.type, 5); + } else + KDSummonRevengeMobs(parseInt(x), parseInt(y), tile.type, slimed ? 1.5 : 1); + + KDMapData.PoolUses += 1; + + KinkyDungeonSendEvent("afterShrineDrink", {x: data.x, y: data.y, tile: data.tile}); + break; + } + case "shrineBottle": { + if (!KDCanDrinkShrine(true)) { + KinkyDungeonSendTextMessage(9, TextGet("KDNoMana"), "#ff5277", 2, true); + break; + } + KDDelayedActionPrune(["Action", "World"]); + tile = KinkyDungeonTilesGet(data.targetTile); + if (tile) tile.drunk = true; + + KinkyDungeonAdvanceTime(1, true); + + let x = data.targetTile.split(',')[0]; + let y = data.targetTile.split(',')[1]; + KDSummonRevengeMobs(parseInt(x), parseInt(y), tile.type, 1.0); + + // KinkyDungeonStatsChoice.get("Blessed") + KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonPoolBottle"), "#AAFFFF", 2); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("PotionMana"), 1); + KDSendStatus('goddess', data.type, 'shrineBottle'); + KinkyDungeonAggroAction('shrine', {}); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/PotionDrink.ogg"); + + KDMapData.PoolUses += 1; + KinkyDungeonSendEvent("afterShrineBottle", {x: data.x, y: data.y, tile: data.tile}); + break; + } + case "renamenpc": + { + let origname = KDGameData.Collection[data.id]?.origname; + if (KDGameData.Collection[data.id] + && KDGameData.Collection[data.id].name != data.newName) { + if (!origname) origname = KDGameData.Collection[data.id].name; + KDGameData.Collection[data.id].name = data.newName; + } + if (KDPersistentNPCs[data.id] + && KDPersistentNPCs[data.id].Name != data.newName) { + if (!origname) origname = KDPersistentNPCs[data.id].Name; + KDPersistentNPCs[data.id].Name = data.newName; + } + if (KDPersistentNPCs[data.id]?.entity + && KDPersistentNPCs[data.id].entity.CustomName != data.newName) { + if (!origname) origname = KDPersistentNPCs[data.id].entity.CustomName; + KDPersistentNPCs[data.id].entity.CustomName = data.newName; + } + if (KDPersistentNPCs[data.id]?.trueEntity + && KDPersistentNPCs[data.id].trueEntity.CustomName != data.newName) { + if (!origname) origname = KDPersistentNPCs[data.id].trueEntity.CustomName; + KDPersistentNPCs[data.id].trueEntity.CustomName = data.newName; + } + + if (origname) { + if (KDGameData.Collection[data.id]) { + KDGameData.Collection[data.id].origname = origname; + } + //if (!KDGameData.NamesGenerated) KDGameData.NamesGenerated = {}; + //delete KDGameData.NamesGenerated[origname]; + //KDGameData.NamesGenerated[data.newName] = data.id; + } + } + break; + case "defeat": + KDDelayedActionPrune(["Action", "World"]); + KinkyDungeonDefeat(!(KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison) + && KinkyDungeonFlags.has("LeashToPrison"), KinkyDungeonLeashingEnemy()); + KinkyDungeonChangeRep("Ghost", 4); + break; + case "lose": + KinkyDungeonState = "Menu"; + KDLose = true; + MiniGameKinkyDungeonLevel = -1; + break; + case "orb": + if (KinkyDungeonMapGet(data.x, data.y) == 'O') { + KDDelayedActionPrune(["Action", "World"]); + let edata = { + x: data.x, + y: data.y, + shrine: data.shrine, + punish: KinkyDungeonGoddessRep[data.shrine] < -45, + inputdata: data, + rep: (data.Rep || data.Amount) * -10, + }; + + KinkyDungeonSendEvent("spellOrb", edata); + if (edata.punish) { + KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, "OrbGuardian", 3 + Math.floor(Math.sqrt(1 + MiniGameKinkyDungeonLevel)), 10, false, 30); + let tag = ""; + switch (data.shrine) { + case "Latex": + tag = "HardSlimeCollar"; + break; + case "Leather": + tag = "LeatherLivingCollar"; + break; + case "Metal": + tag = "MithrilLivingCollar"; + break; + case "Rope": + tag = "WeakMagicRopeCollar"; + break; + case "Will": + tag = "MysticDuctTapeCollar"; + break; + case "Elements": + tag = "CrystalLivingCollar"; + break; + case "Conjure": + tag = "RibbonCollar"; + break; + case "Illusion": + tag = "ObsidianLivingCollar"; + break; + } + let restraintAdd = KinkyDungeonGetRestraintByName(tag); + if (restraintAdd) { + KinkyDungeonAddRestraintIfWeaker(restraintAdd, 10, true, "Gold", false, false, undefined, undefined, true); + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonGoddessCollar").replace("TYPE", TextGet("KinkyDungeonShrine" + data.shrine)).replace("RESTRAINT", TextGet("Restraint" + tag)), "lightblue", 2); + } + } + + KinkyDungeonChangeRep(data.shrine, edata.rep); + + KDSendStatus('goddess', data.shrine, 'takeOrb'); + if (KinkyDungeonStatsChoice.get("randomMode")) { + let tt = KinkyDungeonTilesGet(data.x + "," + data.y); + let spell = ((tt && !KDHasSpell(tt.Spell)) ? KinkyDungeonFindSpell(tt.Spell) : null) || KDGetRandomSpell(); + + if (spell) { + KDPushSpell(spell); + if (spell.autoLearn) { + for (let sp of spell.autoLearn) { + if (KinkyDungeonSpellIndex(sp) < 0) { + KDPushSpell(KinkyDungeonFindSpell(sp, true)); + KDSendStatus('learnspell', sp); + } + } + } + if (spell.learnFlags) { + for (let sp of spell.learnFlags) { + KinkyDungeonFlags.set(sp, -1); + } + } + + if (spell.learnPage) { + for (let sp of spell.learnPage) { + KDAddSpellPage(sp, KDSpellColumns[sp] || []); + } + } + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonOrbSpell").replace("SPELL", TextGet("KinkyDungeonSpell" + spell.name)), "lightblue", 2); + } else { + KinkyDungeonSpellPoints += data.Amount; + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonObjectOrbBreak"), "lightblue", 2); + + + } + } else { + KinkyDungeonSpellPoints += data.Amount; + } + if (KinkyDungeonTilesGet(data.x + ',' + data.y)) { + KinkyDungeonTilesGet(data.x + ',' + data.y).Light = undefined; + } + KinkyDungeonMapSet(data.x, data.y, 'o'); + KinkyDungeonAggroAction('orb', {}); + + KinkyDungeonSendEvent("afterSpellOrb", edata); + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + } + break; + case "perkorb": + if (KinkyDungeonMapGet(data.x, data.y) == 'P') { + KDDelayedActionPrune(["Action", "World"]); + KDSendStatus('goddess', data.perks, 'takePerkOrb'); + + if (data.perks) { + for (let p of data.perks) { + KinkyDungeonStatsChoice.set(p, true); + } + } + if (data.bondage) { + for (let b of data.bondage) { + KinkyDungeonAddRestraintIfWeaker( + KinkyDungeonGetRestraintByName(b), 20, true, "Gold", true + ); + } + } + if(data.method) { + KDGameData.SelectedEscapeMethod = data.method; + } + + KinkyDungeonMapSet(data.x, data.y, 'p'); + + KinkyDungeonSetFlag("choseperk", 3); + for (let x = 0; x < KDMapData.GridWidth; x++) { + if (KinkyDungeonMapGet(x, data.y) == 'P') { + KinkyDungeonMapSet(x, data.y, 'p'); + } + } + KinkyDungeonSendEvent("perkOrb", {x: data.x, y: data.y, perks: data.perks}); + } + break; + case "heart": { + KDDelayedActionPrune(["Action", "World"]); + tile = KinkyDungeonTilesGet(data.targetTile); + if (tile) { + let amnt = (data.amount || 3); + if (data.type == "AP") { + if (KinkyDungeonStatDistractionMax < KDMaxStat) //for (let i = 0; i < amnt; i++) KDPushSpell(KinkyDungeonFindSpell("APUp1")); + KDGameData.StatMaxBonus[data.type] += amnt; + KinkyDungeonUpdateStats(0); + }else if (data.type == "SP") { + if (KinkyDungeonStatStaminaMax < KDMaxStat)// for (let i = 0; i < amnt; i++) KDPushSpell(KinkyDungeonFindSpell("SPUp1")); + KDGameData.StatMaxBonus[data.type] += amnt; + KinkyDungeonUpdateStats(0); + } else if (data.type == "MP") { + if (KinkyDungeonStatManaMax < KDMaxStat)// for (let i = 0; i < amnt; i++) KDPushSpell(KinkyDungeonFindSpell("MPUp1")); + KDGameData.StatMaxBonus[data.type] += amnt; + KinkyDungeonUpdateStats(0); + } else if (data.type == "WP") { + if (KinkyDungeonStatWillMax < KDMaxStat) //for (let i = 0; i < amnt; i++) KDPushSpell(KinkyDungeonFindSpell("WPUp1")); + KDGameData.StatMaxBonus[data.type] += amnt; + KinkyDungeonUpdateStats(0); + } + KDGameData.CollectedHearts = (KDGameData.CollectedHearts || 0) + 1; + + // Send the message and advance time + KinkyDungeonAdvanceTime(1); + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonTabletReadSuccess"), "lightgreen", 1); + + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + + // Remove the tile + let x = parseInt(data.targetTile.split(',')[0]); + let y = parseInt(data.targetTile.split(',')[1]); + if (x && y) { + KinkyDungeonMapSet(x, y, 'm'); + KinkyDungeonTilesDelete(data.targetTile); + } + } + break; + } + case "champion": + KDGameData.Champion = data.rep; + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonBecomeChampion").replace("GODDESS", TextGet("KinkyDungeonShrine" + data.rep)), "yellow", 1); + KDSendStatus('goddess', data.rep, 'helpChampion'); + break; + case "aid": + KDDelayedActionPrune(["Action", "World"]); + KinkyDungeonChangeRep(data.rep, -KinkyDungeonAidManaCost(data.rep, data.value)); + KDChangeMana("player", "aid", "pray", KinkyDungeonAidManaAmount(data.rep, data.value)); + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonAidManaMe"), "purple", 2); + KDSendStatus('goddess', data.rep, 'helpMana'); + break; + case "rescue": + KinkyDungeonRescued[data.rep] = true; + + if (KDRandom() < 0.5 + data.value/100) { + KDDelayedActionPrune(["Action", "World"]); + let tiles = KinkyDungeonRescueTiles(); + if (tiles.length > 0) { + KDSendStatus('goddess', data.rep, 'helpRescue'); + KinkyDungeonChangeRep(data.rep, -10); + tile = tiles[Math.floor(tiles.length * KDRandom())]; + if (tile) { + KinkyDungeonMapSet(tile.x, tile.y, "$"); + KinkyDungeonTilesSet(tile.x + "," + tile.y, {Type: "Angel", Light: 5, lightColor: 0xffffff}); + KDStartDialog("AngelHelp","Angel", true, ""); + } + KDGameData.RescueFlag = true; + } + return "Rescue"; + } else { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonNoRescue"), "purple", 10); + KDSendStatus('goddess', data.rep, 'helpNoRescue'); + return "FailRescue"; + } + case "penance": + KDGameData.KinkyDungeonPenance = true; + KDGameData.KDPenanceMode = ""; + KDGameData.KDPenanceStage = 0; + KDGameData.KDPenanceStageEnd = 0; + KDGameData.AngelCurrentRep = data.rep; + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonPenanceHappen"), "purple", 4); + KDGameData.KinkyDungeonPenanceCostCurrent = KinkyDungeonPenanceCosts[data.rep] ? KinkyDungeonPenanceCosts[data.rep] : KinkyDungeonPenanceCostDefault; + if (KinkyDungeonGold >= KDGameData.KinkyDungeonPenanceCostCurrent) { + if (KinkyDungeonPenanceCosts[data.rep]) KinkyDungeonPenanceCosts[data.rep] += KinkyDungeonPenanceCostGrowth; + else KinkyDungeonPenanceCosts[data.rep] = KinkyDungeonPenanceCostDefault + KinkyDungeonPenanceCostGrowth; + } + KDSendStatus('goddess', data.rep, 'helpPenance'); + break; + case "spellChoice": + KDDelayedActionPrune(["Action", "SwitchSpell"]); + KinkyDungeonEvasionPityModifier = 0.0; + KinkyDungeonSpellChoices[data.I] = data.CurrentSpell; + KinkyDungeonWeaponChoices[data.I] = ""; + KinkyDungeonConsumableChoices[data.I] = ""; + KinkyDungeonArmorChoices[data.I] = ""; + KinkyDungeonSpellChoicesToggle[data.I] = !KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]].defaultOff; + if (KinkyDungeonSpellChoicesToggle[data.I] && KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]].costOnToggle) { + if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]]))) { + KDChangeMana(KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]].name, "spell", "cast", -KinkyDungeonGetManaCost(KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]])); + } else KinkyDungeonSpellChoicesToggle[data.I] = false; + } + if (KinkyDungeonStatsChoice.has("Disorganized")) { + KinkyDungeonAdvanceTime(1); + KDGameData.SlowMoveTurns = 2; + } else if (!KinkyDungeonStatsChoice.has("QuickDraw")) + KinkyDungeonAdvanceTime(1); + break; + case "itemChoice": + KDDelayedActionPrune(["Action", "SwitchSpell"]); + KinkyDungeonEvasionPityModifier = 0.0; + KinkyDungeonSpellChoices[data.I] = -1; + KinkyDungeonWeaponChoices[data.I] = ""; + KinkyDungeonConsumableChoices[data.I] = ""; + KinkyDungeonArmorChoices[data.I] = ""; + KinkyDungeonSpellChoicesToggle[data.I] = true; + + if (KDConsumable({name: data.name})) { + KinkyDungeonConsumableChoices[data.I] = data.name; + } else if (KDWeapon({name: data.name})) { + KinkyDungeonWeaponChoices[data.I] = data.name; + } else if (KDRestraint({name: data.name})) { + KinkyDungeonArmorChoices[data.I] = data.name; + } + /* + if (KinkyDungeonSpellChoicesToggle[data.I] && KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]].costOnToggle) { + if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]]))) { + KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(KinkyDungeonSpells[KinkyDungeonSpellChoices[data.I]])); + } else KinkyDungeonSpellChoicesToggle[data.I] = false; + } + if (KinkyDungeonStatsChoice.has("Disorganized")) { + KinkyDungeonAdvanceTime(1); + KDGameData.SlowMoveTurns = 2; + } else if (!KinkyDungeonStatsChoice.has("QuickDraw")) + KinkyDungeonAdvanceTime(1);*/ + break; + case "spellRemove": + KinkyDungeonEvasionPityModifier = 0.0; + KinkyDungeonSpellChoices[data.I] = -1; + KinkyDungeonWeaponChoices[data.I] = ""; + KinkyDungeonConsumableChoices[data.I] = ""; + KinkyDungeonArmorChoices[data.I] = ""; + KinkyDungeonSpellChoicesToggle[data.I] = true; + break; + case "spellCastFromBook": { + KDDelayedActionPrune(["Action", "Cast"]); + let spell = KinkyDungeonHandleSpellCast(KinkyDungeonSpells[data.CurrentSpell]); + if (spell && !(KinkyDungeonSpells[data.CurrentSpell].type == "passive") && !KinkyDungeonSpells[data.CurrentSpell].passive && !KinkyDungeonSpells[data.CurrentSpell].upcastFrom) { + if (!spell.quick) { + if (KinkyDungeonStatsChoice.has("Disorganized")) { + KinkyDungeonAdvanceTime(1); + KDGameData.SlowMoveTurns = 2; + } else if (!KinkyDungeonStatsChoice.has("QuickDraw")) + KinkyDungeonAdvanceTime(1); + } + KinkyDungeonSendActionMessage(5, TextGet("KinkyDungeonSpellTarget" + spell.name).replace("SpellArea", "" + Math.floor(spell.aoe)), "white", 0.1, true); + } + break; + } + case "focusControlToggle": { + KDInputFocusControlToggle(data.key, data.value); + break; + } + case "upcast": { + KDDelayedActionPrune(["Action", "Cast"]); + KDEmpower(data, KinkyDungeonPlayerEntity); + break; + } + case "upcastcancel": { + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "upcast", 1); + break; + } + case "select": { + if (data.enemy && KDAllied(data.enemy)) { + if (data.enemy.buffs?.AllySelect?.duration > 0) KinkyDungeonExpireBuff(data.enemy, "AllySelect") + else KinkyDungeonApplyBuffToEntity(data.enemy, { + id: "AllySelect", + aura: "#ffffff", + aurasprite: "Select", + duration: 9999, infinite: true, + type: "Sel", + power: 1, + }); + } + break; + } + case "selectOnly": { + for (let e of KDMapData.Entities) { + if (e.id != data.enemy?.id && e.buffs?.AllySelect) KinkyDungeonExpireBuff(e, "AllySelect") + else if (e.id == data.enemy?.id) KinkyDungeonApplyBuffToEntity(e, { + id: "AllySelect", + aura: "#ffffff", + aurasprite: "Select", + duration: 9999, infinite: true, + type: "Sel", + power: 1, + }); + } + KinkyDungeonSendTextMessage(10, TextGet("KDOrderSelect").replace("ENMY", TextGet("Name" + data.enemy.Enemy.name)), "#ffffff", 1); + + break; + } + case "cancelParty": { + if (data.enemy) { + let enemy = KinkyDungeonFindID(data.enemy.id); + if (!enemy && KDGameData.Party) enemy = KDGameData.Party.find((entity) => {return entity.id == data.enemy.id;}); + if (enemy) { + if (enemy.buffs?.AllySelect) KinkyDungeonExpireBuff(enemy, "AllySelect") + KinkyDungeonSetEnemyFlag(enemy, "NoFollow", -1); + KDRemoveFromParty(enemy, false); + KinkyDungeonSendTextMessage(10, TextGet("KDOrderRemove").replace("ENMY", TextGet("Name" + enemy.Enemy.name)), "#ffffff", 1); + + } + } + break; + } + case "onMe": { + if (data.enemy && data.player) { + let enemy = KinkyDungeonFindID(data.enemy.id); + enemy.gx = data.player.x; + enemy.gy = data.player.y; + if (KDEnemyHasFlag(data.enemy, "NoFollow")) { + KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 0); + KinkyDungeonSetEnemyFlag(enemy, "Defensive", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDOrderOnMe").replace("ENMY", TextGet("Name" + enemy.Enemy.name)), "#ffffff", 1); + } else { + KinkyDungeonSetEnemyFlag(enemy, "NoFollow", -1); + KinkyDungeonSetEnemyFlag(enemy, "Defensive", 0); + KinkyDungeonSendTextMessage(10, TextGet("KDOrderDisperse").replace("ENMY", TextGet("Name" + enemy.Enemy.name)), "#ffffff", 1); + } + + } + break; + } + case "spellLearn": { + KDDelayedActionPrune(["Action", "SwitchSpell"]); + KinkyDungeonEvasionPityModifier = 0.0; + let spell = KinkyDungeonFindSpell(data.SpellName, true); + let cost = KinkyDungeonGetCost(spell); + if (KinkyDungeonCheckSpellPrerequisite(spell)) { + if (KinkyDungeonSpellPoints >= cost) { + if (spell.manacost <= KinkyDungeonStatManaMax) { + KinkyDungeonSpellPoints -= cost; + KDPushSpell(spell); + KDSendStatus('learnspell', spell.name); + if (spell.goToPage) { + KinkyDungeonCurrentSpellsPage = spell.goToPage; + } + if (spell.autoLearn) { + for (let sp of spell.autoLearn) { + if (KinkyDungeonSpellIndex(sp) < 0) { + KDPushSpell(KinkyDungeonFindSpell(sp, true)); + KDSendStatus('learnspell', sp); + } + } + } + if (spell.learnFlags) { + for (let sp of spell.learnFlags) { + KinkyDungeonFlags.set(sp, -1); + } + } + + if (spell.learnPage) { + for (let sp of spell.learnPage) { + KDAddSpellPage(sp, KDSpellColumns[sp] || []); + } + } + KinkyDungeonSetMaxStats(); + if (KDSoundEnabled() && KinkyDungeonIsPlayer()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + KinkyDungeonCurrentPage = KinkyDungeonSpellIndex(spell.name); + if (KinkyDungeonStatsChoice.has("Disorganized")) { + KinkyDungeonAdvanceTime(1); + KDGameData.SlowMoveTurns = 2; + } else if (!KinkyDungeonStatsChoice.has("QuickDraw")) + KinkyDungeonAdvanceTime(1); + if (KinkyDungeonIsPlayer()) { + KinkyDungeonPreviewSpell = undefined; + //if (KinkyDungeonTextMessageTime > 0) + //KinkyDungeonDrawState = "Game"; + } + } else if (KinkyDungeonIsPlayer()) KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSpellsNotEnoughMana"), "#b4dbfc", 1); + } else if (KinkyDungeonIsPlayer()) KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSpellsNotEnoughPoints"), "#e7cf1a", 1); + } else if (KinkyDungeonIsPlayer()) KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSpellsNotPrerequisite").replace("REQUIREDSPELL", TextGet("KinkyDungeonSpell" + spell.prerequisite)), "#ff4444", 1); + break; + } + case "tabletInteract": { + KDDelayedActionPrune(["Action", "World"]); + if (data.action == "read") { + tile = KinkyDungeonTilesGet(data.targetTile); + if (tile && tile.Type == "Tablet") { + let full = false; + // Perform the tablet buff action + if (tile.Name == "Will") { + // Restoration shrine gets a regeneration buff + let multi = 1.0; + multi = Math.max(KinkyDungeonStatStaminaMax / KDMaxStatStart); + let Manamulti = 1.0; + Manamulti = Math.max(KinkyDungeonStatManaMax / KDMaxStatStart); + let Willmulti = 1.0; + Willmulti = Math.max(KinkyDungeonStatWillMax / KDMaxStatStart); + + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "TabletWill", type: "restore_mp", power: Manamulti*0.5, duration: 20}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "TabletWill2", type: "restore_sp", power: multi*0.5, duration: 20}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "TabletWill3", type: "restore_wp", power: Willmulti*0.15, duration: 10}); + } else if (tile.Name == "Determination") { + if (KinkyDungeonStatWill >= KinkyDungeonStatWillMax) { + full = true; + } else { + let Willmulti = 1.0; + Willmulti = Math.max(KinkyDungeonStatWillMax / KDMaxStatStart); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "TabletDetermination", type: "restore_wp", power: Willmulti*0.30, duration: 10}); + } + } else { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, + {id: "Tablet" + tile.Name, aura: KDGoddessColor(tile.Name), type: "event", duration: 9999, infinite: true, power: 2, player: true, enemies: false, maxCount: 3, tags: ["cast_" + tile.Name.toLowerCase(), "trigger_" + tile.Name.toLowerCase()], events: [ + {trigger: "calcMana", type: "Tablet", requiredTag: tile.Name.toLowerCase(), power: 0.5}, + ]} + ); + } + + if (full) { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonTabletReadFull"), "lightgreen", 1); + } else { + // Send the message and advance time + KinkyDungeonAdvanceTime(1); + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonTabletReadSuccess"), "lightgreen", 1); + + // Remove the tile + let x = parseInt(data.targetTile.split(',')[0]); + let y = parseInt(data.targetTile.split(',')[1]); + if (x && y) { + KinkyDungeonMapSet(x, y, 'm'); + KinkyDungeonTilesDelete(data.targetTile); + } + } + + } + } + break; + } + case "foodInteract": { + KDDelayedActionPrune(["Action", "World"]); + if (data.action == "eat") { + tile = KinkyDungeonTilesGet(data.targetTile); + if (tile && tile.Type == "Food") { + let gagged = KinkyDungeonGagTotal(); + if (gagged > 0) { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonFoodEatenGag"), "#ff8933", 1); + } else { + // Perform the deed + let Willmulti = Math.max(KinkyDungeonStatWillMax / KDMaxStatStart); + let amount = tile.Amount ? tile.Amount : 1.0; + KDChangeWill(tile.Food, "food", "consumable", amount * Willmulti); + + + // Send the message and advance time + KinkyDungeonAdvanceTime(1); + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonFoodEaten"), "lightgreen", 1); + + // Remove the food + tile.Food = "Plate"; + } + } + } + break; + } + case "chargerInteract": + KDDelayedActionPrune(["Action", "World"]); + if (data.action == "charge") { + if (KinkyDungeonInventoryGet("AncientPowerSourceSpent") && KinkyDungeonGold >= KDRechargeCost) { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSourceSpent, -1); + KinkyDungeonAddGold(-KDRechargeCost); + KinkyDungeonAdvanceTime(1); + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChargerChargeSuccess").replace("VALUE", "" + KDRechargeCost), "yellow", 1); + let x = parseInt(data.targetTile.split(',')[0]); + let y = parseInt(data.targetTile.split(',')[1]); + if (x && y) { + KinkyDungeonTilesDelete(data.targetTile); + KinkyDungeonMapSet(x, y, '-'); + } + return "Pass"; + } else { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChargerChargeFailure"), "orange", 1); + return "Fail"; + } + } else if (data.action == "place") { + tile = KinkyDungeonTilesGet(data.targetTile); + if (tile && tile.Type == "Charger" && KinkyDungeonInventoryGet("AncientPowerSource")) { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, -1); + tile.Light = KDChargerLight; + KinkyDungeonAdvanceTime(1); + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChargerPlace"), "yellow", 1); + let x = parseInt(data.targetTile.split(',')[0]); + let y = parseInt(data.targetTile.split(',')[1]); + if (x && y) { + KinkyDungeonMapSet(x, y, '='); + } + } + } else if (data.action == "remove") { + tile = KinkyDungeonTilesGet(data.targetTile); + if (tile && tile.Type == "Charger" && tile.Light > 0 && !tile.NoRemove) { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); + tile.Light = undefined; + KinkyDungeonAdvanceTime(1); + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChargerRemove"), "yellow", 1); + let x = parseInt(data.targetTile.split(',')[0]); + let y = parseInt(data.targetTile.split(',')[1]); + if (x && y) { + KinkyDungeonMapSet(x, y, '+'); + } + } else if (tile && tile.NoRemove) { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChargerNoRemove"), "yellow", 1); + } + } + break; + case "dialogue": { + KDDoDialogue(data); + break; + + } + case "recycleBuild": + if (KDHasRecyclerResources(KDMapToRecycleOutputs(data.selectedItem.recyclecost))) { + KDChangeRecyclerResources(KDMapToRecycleOutputs(data.selectedItem.recyclecost), -1); + KinkyDungeonItemEvent({ + name: data.selectedItem.item, + amount: data.selectedItem.count || 1, + }); + } + break; + case "recycle": + break; + case "tightenNPCRestraint": + KDNPCRefreshBondage(data.npc, data.player, false, false); + break; + case "changeAutorelease": + if (!KDGameData.AutoRelease) { + KDGameData.AutoRelease = { + Escaped: false, + NonNotable: false, + }; + } + KDGameData.AutoRelease[data.type] = !KDGameData.AutoRelease[data.type]; + break; + case "releaseNPC": + if (data?.selection) { + for (let v of Object.keys(data.selection)) { + KDReleaseNPC(parseInt(v), data.player); + } + } + KDSortCollection(); + break; + case "removeGuest": + if (data?.selection) { + for (let v of Object.keys(data.selection)) { + if (KDCanRemoveGuest(parseInt(v))) { + delete KDGameData.Collection[parseInt(v) + ""]; + } + } + } + KDSortCollection(); + break; + case "ransomNPC": + if (data?.selection) { + for (let v of Object.keys(data.selection)) { + if (KDCanRansom(parseInt(v))) { + KDFreeNPCRestraints(parseInt(v), data.player); + + + let type = KinkyDungeonGetEnemyByName(KDGameData.Collection[v + ""].type); + let rep = -2*KDGetEnemyTypeRep(type, KDGameData.Collection[v + ""].Faction); + KinkyDungeonChangeFactionRep(KDGameData.Collection[v + ""].Faction, rep); + KinkyDungeonAddGold(KDRansomValue(parseInt(v))); + DisposeEntity(parseInt(v), false); + let e = KinkyDungeonFindID(parseInt(v)); + if (e) + KDRemoveEntity(e, false, false, true); + delete KDCollectionReleaseSelection[v]; + // TODO make it affect friends/enemies of the faction + // TODO add everything into one + } + } + } + KDSortCollection(); + break; + case "freeNPCRestraint": { + KDFreeNPCRestraints(data.npc, data.player); + if (KDNPCChar.get(data.npc)) + KDRefreshCharacter.set(KDNPCChar.get(data.npc), true); + break; + } + case "autoprune": { + KDDelayedActionPrune(["Auto"]); + break; + } + case "addNPCRestraint": + /** + slot: slot.id, + id: inv.item.id, + restraint: inv.item.name, + lock: "White", + npc: number + */ + + + let res = KDInputSetNPCRestraint(data); + + let enemy = KDGetGlobalEntity(data.npc); + + let packed = enemy ? KDUnPackEnemy(enemy) : false; + if (enemy && (!data.restraint || enemy.boundLevel > 0)) + KinkyDungeonSendTextMessage(10, + TextGet("KDTieUpEnemy" + (!data.restraint ? "Negative" : "")) + .replace("RSTR", KDGetItemNameString(data.restraint))//TextGet("Restraint" + KDRestraint(item)?.name)) + .replace("ENNME", TextGet("Name" + enemy?.Enemy.name)) + .replace("AMNT", "" + Math.round(100 * enemy?.boundLevel / enemy?.Enemy.maxhp)), + "#ffffff", 1); + + if (data.time && res) { + KinkyDungeonAdvanceTime(1, true); + } + if (data.npc > 0) { + KDSetCollFlag(data.npc, "restrained", 1); + KDSetCollFlag(data.npc, "restrained_recently", 24); + } + if (KDNPCChar.get(data.npc)) + KDRefreshCharacter.set(KDNPCChar.get(data.npc), true); + + if (packed) KDPackEnemy(enemy); + break; + } + if (data.GameData) { + Object.assign(KDGameData, data.GameData); + } + return ""; +} + +function KDSendInput(type: string, data: any, _frame?: boolean, noUpdate?: boolean, process = true): string { + + if (!noUpdate) { + KDGameData.OrigEnergyLevel = KDGameData.AncientEnergyLevel; + KDGameData.LastSP = KinkyDungeonStatStamina; + KDGameData.LastMP = KinkyDungeonStatMana; + KDGameData.LastAP = KinkyDungeonStatDistraction; + KDGameData.LastWP = KinkyDungeonStatWill; + } + + KinkyDungeonInputQueue.push({type: type, data: data}); + if (process) + return KDProcessInputs(true); + else return ""; +} + +/** + * Handles inputs once per frame + */ +function KDProcessInputs(ReturnResult?: boolean): string { + for (let i = 0; i < 3; i++) { + if (KinkyDungeonInputQueue.length > 0) { + let input = KinkyDungeonInputQueue.splice(0, 1)[0]; + if (input) { + let res = KDProcessInput(input.type, input.data); + if (ReturnResult) return res; + } + } + } + + return ""; +} + +function KDInteract(x: number, y: number, dist?: number): boolean { + if (dist == undefined) dist = KDistChebyshev(x - KDPlayer().x, y - KDPlayer().y); + KinkyDungeonSendEvent("beforeInteract", {x:x, y: y}); + if (dist < 1.5 && !KinkyDungeonEntityAt(x, y, false, undefined, undefined, false)) + KinkyDungeonItemCheck(x, y, MiniGameKinkyDungeonLevel, true); + KDInteracting = false; + let tile = KinkyDungeonTilesGet(x + ',' + y); + if (tile?.Type) { + if (KDObjectInteract[tile.Type]) { + let ret = KDObjectInteract[tile.Type](x, y, dist); + KinkyDungeonSendEvent("afterInteract", {x:x, y: y, type: "object", objtype: tile.Type}); + return ret; + } else if (KDObjectClick[tile.Type] && dist < 1.5) { + let ret = KDObjectClick[tile.Type](x, y); + KinkyDungeonSendEvent("afterInteract", {x:x, y: y, type: "objectclick", objtype: tile.Type}); + return ret; + } + } + let tiletype = KinkyDungeonMapGet(x, y); + if (KDTileInteract[tiletype]) { + let ret = KDTileInteract[tiletype](x, y, dist); + KinkyDungeonSendEvent("afterInteract", {x:x, y: y, type: "tile", objtype: tiletype}); + return ret; + + } + let Enemy = KinkyDungeonEntityAt(x, y, false, undefined, undefined, false); + if (Enemy) { + if ((KDIsImprisoned(Enemy) + || ((!KinkyDungeonAggressive(Enemy) || KDAllied(Enemy)) + && !(Enemy.playWithPlayer && KDCanDom(Enemy))))) { + let d = Enemy.Enemy.specialdialogue ? Enemy.Enemy.specialdialogue : "GenericAlly"; + if ((!Enemy.specialdialogue && !Enemy.prisondialogue) && KDIsImprisoned(Enemy)) d = "PrisonerJailBug"; + else if (Enemy.prisondialogue && KDIsImprisoned(Enemy)) d = Enemy.prisondialogue; // Special dialogue override + else if (Enemy.specialdialogue) d = Enemy.specialdialogue; // Special dialogue override + if (d || ((!Enemy.lifetime || Enemy.lifetime > 9000) && !Enemy.Enemy.tags.notalk)) { // KDAllied(Enemy) + + KDStartDialog(d, Enemy.Enemy.name, true, Enemy.personality, Enemy); + KinkyDungeonSendEvent("afterInteract", {x:x, y: y, type: "talk", entity: Enemy}); + return true; + } + } + } + KinkyDungeonSendEvent("afterInteractFail", {x:x, y: y}); + return false; +} diff --git a/Game/src/base/KinkyDungeonMusic.ts b/Game/src/base/KinkyDungeonMusic.ts new file mode 100644 index 000000000..522f537c8 --- /dev/null +++ b/Game/src/base/KinkyDungeonMusic.ts @@ -0,0 +1,246 @@ +"use strict"; + +/** These tracks will loop with a certain chance of forcibly continuing the loop. 0 = no loop*/ +let KDMusicLoopTracksChance = { + "AREA1-GRAVEYARD.ogg": 0.5, + "AREA2-ANCIENTTOMBS.ogg": 0.5, + "GENERIC-DOLLRACK.ogg": 0.5, + "AREA4-MAGICLIBRARY.ogg": 0.5, + "AREA5-UNDERGROUNDJUNGLE.ogg": 0.5, + "AREA6-CRYSTALCAVE.ogg": 0.5, + "AREA7-LOSTTEMPLE.ogg": 0.5, + "AREA8-ORRERY.ogg": 0.7, + "AREA9-BELLOWS.ogg": 0.5, + "Shopping.ogg": 0.15, + "slimy_science_1.ogg": 0.15, +}; + +let KDMusicUpdateTime = 0; +let KDMusicUpdateDuration = 5000; +let KDMusicY = 0; +let KDMusicYMax = 50; +let KDMusicYSpeed = 0.15; +let KDMusicToast = ""; + +let WriteMusicToast = false; + +function KDSendMusicToast(song: string, extraLen = 0): void { + if (!WriteMusicToast) { + // This is to avoid race conditions since this is often used to notify of async e.g. save notifications + WriteMusicToast = true; + KDMusicToast = song; + KDMusicUpdateTime = CommonTime() + extraLen; + WriteMusicToast = false; + } +} + +function KDDrawMusic(delta: number): void { + if (CommonTime() - KDMusicUpdateTime < KDMusicUpdateDuration) { + if (KDMusicY < KDMusicYMax) { + KDMusicY = Math.max(0, Math.min(KDMusicY + delta*KDMusicYSpeed, KDMusicYMax)); + } + } else { + if (KDMusicY > 0) { + KDMusicY = Math.max(0, Math.min(KDMusicY - delta*KDMusicYSpeed, KDMusicYMax)); + } + } + if (KDMusicY > 0) { + FillRectKD( + kdcanvas, kdpixisprites, "musictoast", { + Left: 500, + Top: KDMusicY - KDMusicYMax, + Width: 1000, + Height: KDMusicYMax, + Color: "#000000", + alpha: 0.8, + zIndex: 209.9, + } + ); + DrawTextFitKD(KDMusicToast, 1000, KDMusicY - KDMusicYMax/2, 1000, "#ffffff", "#000000", 32, "center", 210); + } +} + +if ("mediaSession" in navigator) { + + navigator.mediaSession.setActionHandler("play", () => { + /* Code excerpted. */ + }); + navigator.mediaSession.setActionHandler("pause", () => { + /* Code excerpted. */ + }); + navigator.mediaSession.setActionHandler("stop", () => { + /* Code excerpted. */ + }); + navigator.mediaSession.setActionHandler("seekbackward", () => { + /* Code excerpted. */ + }); + navigator.mediaSession.setActionHandler("seekforward", () => { + /* Code excerpted. */ + }); + navigator.mediaSession.setActionHandler("seekto", () => { + /* Code excerpted. */ + }); + navigator.mediaSession.setActionHandler("previoustrack", () => { + /* Code excerpted. */ + }); + navigator.mediaSession.setActionHandler("nexttrack", () => { + /* Code excerpted. */ + }); + navigator.mediaSession.setActionHandler("skipad", () => { + /* Code excerpted. */ + }); + } + + +let KDCurrentSong = ""; +let KDNewSong = "GENERIC-DOLLRACK.ogg"; +let KDLastSong = ""; +let KDCurrentLoops = 0; +let KDCurrentFade = 1; +let KDMusicFadeTime = 2500; // 2 seconds +let KDMusicFadeInTime = 2500; // 2 seconds +let KDMusicTickRate = 100; +let KDCurrentMusicSound: HTMLAudioElement = null; +let KDCurrentMusicSoundUpdate = null; +let allowMusic = navigator.userAgent.includes('Electron'); + +function KDGetCurrentCheckpoint() { + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + return altType?.skin ? altType.skin : (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint); +} +function KDGetMusicCheckpoint() { + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (altType?.musicParams) return altType.musicParams; + if (altType?.skin && !altType.useDefaultMusic) return altType.skin; + return (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint) || 'menu'; +} + +let lastKDMusicTick = 0; + +function KDUpdateMusic() { + + if (allowMusic) { + KDCurrentMusicSoundUpdate = false; + let KDMusic = KinkyDungeonMapParams[KDGetMusicCheckpoint()].music; + + if (!KDNewSong) { + let iter = 0; + let maxiter = 2; // 1 reroll + KDNewSong = KDLastSong; + while (iter < maxiter && KDNewSong == KDLastSong) { + KDNewSong = KDGetByWeight(KDMusic); + iter++; + } + } + if (performance.now() - lastKDMusicTick < KDMusicTickRate) return; + if (KDCurrentMusicSound) { + if (!KDCurrentSong && KDNewSong != KDLastSong) { + if (KDCurrentFade > 0) { + let dd = (performance.now() - lastKDMusicTick) / KDMusicFadeTime; + KDCurrentFade = Math.max(0, KDCurrentFade - dd); + } + } else { + if (KDCurrentFade < 1) { + let dd = (performance.now() - lastKDMusicTick) / KDMusicFadeInTime; + KDCurrentFade = Math.min(1, KDCurrentFade + dd); + } + } + } + + + + let globalVolume = KDSoundEnabled() && KDToggles.Music ? KDMusicVolume * KDMusicVolumeMult : 0; + if (globalVolume > 0 && (!KDCurrentMusicSound || KDCurrentMusicSound.ended || KDCurrentMusicSound.paused || (!KDCurrentSong && KDCurrentFade == 0))) { + KDPlayMusic(KDNewSong, globalVolume); + } + else if (!KDMusicForce && KDCurrentMusicSound && KDCurrentSong && !Object.keys(KDMusic).includes(KDCurrentSong)) { + if (!KDCurrentMusicSoundUpdate) + KDEndMusic(); + } + + if (KDCurrentMusicSound) { + KDCurrentMusicSound.volume = Math.min(globalVolume, 1) * KDCurrentFade; + } + + lastKDMusicTick = performance.now(); + } + + +} + +let KDMusicBusy = false; +let KDMusicForce = false; + +function KDPlayMusic(Sound: string, Volume?: number, force?: boolean) { + if (KDMusicBusy) return; + if (Volume == undefined) { + Volume = KDSoundEnabled() && KDToggles.Music ? KDMusicVolume * KDMusicVolumeMult : 0; + } + KDMusicBusy = true; + + // Start the new sound + let addNewListener = !KDCurrentMusicSound; + let audio = KDCurrentMusicSound || new Audio(); + let vol = (typeof Volume != 'undefined' ? Volume : 1.0); + KDCurrentMusicSound = audio; + KDCurrentMusicSoundUpdate = true; + if (KDPatched) { + audio.crossOrigin = "Anonymous"; + audio.src = "Music/" + (KDModFiles[Sound] || Sound); + } else + audio.src = "Music/" + (KDModFiles[Sound] || Sound); + audio.volume = Math.min(vol, 1); + audio.loop = false; + + if (force) { + let KDMusic = KinkyDungeonMapParams[KDGetMusicCheckpoint()].music; + if (!KDMusic || !KDMusic[Sound]) KDMusicForce = true; + } + + + if (addNewListener) + audio.addEventListener('ended', function () { + this.currentTime = 0; + this.play(); + lastKDMusicTick = performance.now() - 100; + // Current audio is now stale--chance of not being stale though + if (KDRandom() < KDMusicLoopTracksChance[KDCurrentSong]) { + KDCurrentLoops += 1; + } else { + KDMusicForce = false; + KDCurrentSong = ""; + KDNewSong = ""; + } + }, false); + audio.play().then(() => { + KDCurrentLoops = 0; + //KDCurrentFade = 1; + + KDLastSong = Sound; + KDCurrentSong = Sound; + KDSendMusicToast(TextGet(Sound)); + KDNewSong = ""; + KDMusicBusy = false; + }).catch((error) => { + if (error.name === 'NotAllowedError') { + // Music will try to play again after a user gesture (onclick event) + console.log('Autoplay is blocked by browser policy.'); + allowMusic = false; + KDMusicBusy = false; + } else { + console.log('An error occurred while trying to play ' + Sound + " -- ", error.message); + KDSendMusicToast("Error playing " + Sound + ": " + error.message); // This shouldn't happen, but now you'll get a bug report. + KDMusicBusy = false; + } + }); +} + +function KDEndMusic() { + KDCurrentSong = ""; + KDNewSong = ""; + if (KDCurrentMusicSound) { + KDCurrentMusicSound.pause(); + KDCurrentMusicSound.currentTime = 0; + KDCurrentMusicSoundUpdate = true; + } +} diff --git a/Game/src/base/KinkyDungeonVision.ts b/Game/src/base/KinkyDungeonVision.ts new file mode 100644 index 000000000..32f6e079a --- /dev/null +++ b/Game/src/base/KinkyDungeonVision.ts @@ -0,0 +1,1117 @@ +"use strict"; +// Lots of good info here: http://www.adammil.net/blog/v125_Roguelike_Vision_Algorithms.html#permissivecode +// -Ada + +let KDBaseFogMemory = 30; + +let KDRedrawFog = 0; +let KDRedrawMM = 0; + +let KinkyDungeonSeeAll = false; +let KDVisionBlockers = new Map(); +let KDLightBlockers = new Map(); + +function KinkyDungeonCheckProjectileClearance(xx: number, yy: number, x2: number, y2: number, playerblock?: boolean): boolean { + let tiles = KinkyDungeonTransparentObjects; + let moveDirection = KinkyDungeonGetDirection(x2 - xx, y2 - yy); + let x1 = xx + moveDirection.x; + let y1 = yy + moveDirection.y; + let dist = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); + for (let d = 0; d < dist; d += 0.25) { + let mult = d / dist; + let xxx = x1 + mult * (x2-x1); + let yyy = y1 + mult * (y2-y1); + if (!playerblock || KDPlayer().x != Math.round(xxx) || KDPlayer().y != Math.round(yyy)) + if (!tiles.includes(KinkyDungeonMapGet(Math.round(xxx), Math.round(yyy)))) return false; + } + return true; +} + +function KinkyDungeonCheckPathCount(x1: number, y1: number, x2: number, y2: number, allowBars: boolean, blockEnemies: boolean, maxFails: number, blockOnlyLOSBlock: boolean): number { + if (x1 == x2 && y1 == y2) return 0; + let length = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); + // Allowbars = checking for vision only + // Otherwise = checking for physical path + let obj = allowBars ? KinkyDungeonTransparentObjects : KinkyDungeonTransparentMovableObjects; + let maxFailsAllowed = maxFails ? maxFails : 1; + let fails = 0; + + for (let F = 0; F <= length; F++) { + let xx = x1 + (x2-x1)*F/length; + let yy = y1 + (y2-y1)*F/length; + + if ((Math.round(xx) != x1 || Math.round(yy) != y1) && (Math.round(xx) != x2 || Math.round(yy) != y2)) { + let hits = 0; + if (!obj.includes(KinkyDungeonMapGet(Math.floor(xx), Math.floor(yy))) + || ((xx != x1 || yy != y1) && (blockEnemies && ((!blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.floor(xx), Math.floor(yy))) || (blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.floor(xx), Math.floor(yy))?.Enemy.blockVision)))) + || ((xx != x1 || yy != y1) && (allowBars && KDVisionBlockers.get(Math.floor(xx) + "," + Math.floor(yy))))) hits += 1; + if (!obj.includes(KinkyDungeonMapGet(Math.round(xx), Math.round(yy))) + || ((xx != x1 || yy != y1) && (blockEnemies && ((!blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.round(xx), Math.round(yy))) || (blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.round(xx), Math.round(yy))?.Enemy.blockVision)))) + || ((xx != x1 || yy != y1) && (allowBars && KDVisionBlockers.get(Math.round(xx) + "," + Math.round(yy))))) hits += 1; + if (hits < 2 && !obj.includes(KinkyDungeonMapGet(Math.ceil(xx), Math.ceil(yy))) + || ((xx != x1 || yy != y1) && (blockEnemies && ((!blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.ceil(xx), Math.ceil(yy))) || (blockOnlyLOSBlock && KinkyDungeonEnemyAt(Math.ceil(xx), Math.ceil(yy))?.Enemy.blockVision)))) + || ((xx != x1 || yy != y1) && (allowBars && KDVisionBlockers.get(Math.ceil(xx) + "," + Math.ceil(yy))))) hits += 1; + + + if (hits >= 2) { + fails += 1; + if (fails >= maxFailsAllowed) + return fails; + } + } + } + + return fails; +} + +function KinkyDungeonCheckPath(x1: number, y1: number, x2: number, y2: number, allowBars: boolean = false, blockEnemies: boolean = false, maxFails: number = 1, blockOnlyLOSBlock?: boolean): boolean { + return KinkyDungeonCheckPathCount(x1, y1, x2, y2, allowBars, blockEnemies, maxFails, blockOnlyLOSBlock) < maxFails; +} + +let KDPlayerLight = 0; +let KDMapBrightnessMult = 0.2; + +/** 25 tile optimization distance */ +let GiantMapOptimizations = 25; + +let KDSparseLightCache: Record = {}; + +function KinkyDungeonResetFog() { + KDMapData.FogGrid = []; + // Generate the grid + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) + KDMapData.FogGrid.push(0); // 0 = pitch dark + } + + KDMapData.FogMemory = []; + if (KinkyDungeonStatsChoice.get("Forgetful")) { + // Generate the grid + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) + KDMapData.FogMemory.push(0); // 0 = pitch dark + } + } +} + +function KDGetLightsCache(lights: KDLight[], lightmap: Map): Record { + let cache: Record = {}; + for (let l of lights) { + cache[l.x + ',' + l.y] = (cache[l.x + ',' + l.y] || "") + l.brightness + "_" + l.color; + } + for (let l of lightmap.entries()) { + cache[l[0]] = (cache[l[0]] || "") + "_" + l[1]; + } + + return cache; +} + +function KinkyDungeonMakeBrightnessMap(_width: number, _height: number, mapBrightness: number, Lights: any[], delta: number): void { + + let flags = { + SeeThroughWalls: 0, + }; + let data = {update: delta, flags: flags, + }; + + + KinkyDungeonSendEvent("brightness",data); + + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + let params = altType?.lightParams ? KinkyDungeonMapParams[altType.lightParams] : KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; + + let ShadowColor = params.shadowColor != undefined ? params.shadowColor : 0x00001f; + let LightColor = params.lightColor != undefined ? params.lightColor : 0x000000; + + KinkyDungeonBlindLevelBase = 0; // Set to 0 when consumed. We only redraw lightmap once so this is safe. + let oldLevels = { + ColorGrid: KDMapExtraData.ColorGrid, + ShadowGrid: KDMapExtraData.ShadowGrid, + BrightnessGrid: KDMapExtraData.BrightnessGrid, + } + + KDMapExtraData.ColorGrid = []; + KDMapExtraData.ShadowGrid = []; + KDMapExtraData.BrightnessGrid = []; + // Generate the grid + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + KDMapExtraData.BrightnessGrid.push(0); + KDMapExtraData.ShadowGrid.push(0); + KDMapExtraData.ColorGrid.push(LightColor); + } + } + let baseBrightness = mapBrightness * KDMapBrightnessMult; + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) + if (!GiantMapOptimizations || KDistChebyshev(KDPlayer().x-X, KDPlayer().y-Y) < GiantMapOptimizations) + if (KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(X, Y))) { + KinkyDungeonBrightnessSet(X, Y, baseBrightness); + } + } + + let maxPass = 0; + + KDLightBlockers = new Map(); + for (let EE of KDMapData.Entities) { + let Enemy = EE.Enemy; + if (Enemy && Enemy.blockVision || (Enemy.blockVisionWhileStationary && !EE.moved && EE.idle)) // Add + KDLightBlockers.set(EE.x + "," + EE.y, true); + } + let LightsTemp: Map = new Map(); + for (let location of Object.values(KDMapData.EffectTiles)) { + for (let tile of Object.values(location)) { + if (tile.duration > 0) { + if (tile.lightColor) { + if (tile.brightness > KinkyDungeonBrightnessGet(tile.x, tile.y)) + KinkyDungeonColorSet(tile.x, tile.y, tile.lightColor); + } + if (tile.tags.includes("brightnessblock")) { + KDLightBlockers.set(tile.x + "," + tile.y, true); + } + if (tile.tags.includes("darkarea")) { + KinkyDungeonBrightnessSet(tile.x, tile.y, 0); + } + //if (tile.shadowColor) { + //KinkyDungeonShadowSet(tile.x, tile.y, tile.shadowColor); + //} + if (tile.brightness) { + maxPass = Math.max(maxPass, tile.brightness); + KinkyDungeonBrightnessSet(tile.x, tile.y, tile.brightness, true); + + if (!LightsTemp.get(tile.x + "," + tile.y) || tile.brightness > LightsTemp.get(tile.x + "," + tile.y)) + LightsTemp.set(tile.x + "," + tile.y, tile.brightness); + } + } + } + } + + for (let light of Lights) { + if (light.brightness > 0) { + maxPass = Math.max(maxPass, light.brightness); + if (light.brightness > KinkyDungeonBrightnessGet(light.x, light.y)) { + if (light.color) KinkyDungeonColorSet(light.x, light.y, light.color); + else KinkyDungeonColorSet(light.x, light.y, 0xffffff); + } + KinkyDungeonBrightnessSet(light.x, light.y, light.brightness, true); + + if (!(LightsTemp.get(light.x + "," + light.y) >= light.brightness)) { + LightsTemp.set(light.x + "," + light.y, light.brightness); + } + } + } + + // Optimization -- only update lightmap if changed + let ldata: {oldCache: Record, newCache: Record, lights: KDLight[], + lightsmap: Map, + update: boolean, + } = { + oldCache: KDSparseLightCache, + newCache: {}, + lights: Lights, + lightsmap: LightsTemp, + update: false, + } + ldata.newCache = KDGetLightsCache(Lights, ldata.lightsmap); + KDSparseLightCache = ldata.newCache; + + if (Object.keys(ldata.oldCache)?.length == 0) ldata.update = true; + else { + for (let entry of Object.entries(ldata.newCache)) { + if (ldata.oldCache[entry[0]] != entry[1]) { + ldata.update = true; + break; + } + } + for (let entry of Object.entries(ldata.oldCache)) { + if (ldata.newCache[entry[0]] != entry[1]) { + ldata.update = true; + break; + } + } + } + + if (!ldata.update) { + KDMapExtraData.BrightnessGrid = oldLevels.BrightnessGrid; + KDMapExtraData.ColorGrid = oldLevels.ColorGrid; + KDMapExtraData.ShadowGrid = oldLevels.ShadowGrid; + + KDPlayerLight = KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + return; + } + + + let nextBrightness: {x: number, y: number, brightness: number, color: number, shadow: number}[] = []; + + for (let L = maxPass; L > 0; L--) { + // if a grid square is next to a brighter transparent object, it gets that light minus one, or minus two if diagonal + nextBrightness = []; + // Main grid square loop + for (let X = 1; X < KDMapData.GridWidth - 1; X++) { + for (let Y = 1; Y < KDMapData.GridHeight - 1; Y++) { + // Brightness doesnt propagate too far past the player... + if (!GiantMapOptimizations || L == maxPass || KDistChebyshev(KDPlayer().x-X, KDPlayer().y-Y) < GiantMapOptimizations) { + let tile = KinkyDungeonMapGet(X, Y); + if ((KinkyDungeonTransparentObjects.includes(tile) && !KDLightBlockers.get(X + "," + Y)) || LightsTemp.get(X + "," + Y)) { + let brightness = KinkyDungeonBrightnessGet(X, Y); + let color = KinkyDungeonColorGet(X, Y); + let shadow = KinkyDungeonShadowGet(X, Y); + if (brightness > 0) { + let decay = 0.7; + let nearbywalls = 0; + for (let XX = X-1; XX <= X+1; XX++) + for (let YY = Y-1; YY <= Y+1; YY++) + if (!KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(XX, YY)) || KDLightBlockers.get(XX + "," + YY)) nearbywalls += 1; + if (nearbywalls > 3 && brightness <= 9) decay += nearbywalls * 0.15; + else if (nearbywalls > 1 && brightness <= 9) decay += nearbywalls * 0.1; + + if (brightness > 0) { + if (Number(KinkyDungeonBrightnessGet(X-1, Y)) < brightness) nextBrightness.push({x:X-1, y:Y, shadow: shadow, color: color, brightness: (brightness - decay)});// KinkyDungeonLightSet(X-1, Y, Math.max(Number(KinkyDungeonLightGet(X-1, Y)), (brightness - decay))); + if (Number(KinkyDungeonBrightnessGet(X+1, Y)) < brightness) nextBrightness.push({x:X+1, y:Y, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y, Math.max(Number(KinkyDungeonLightGet(X+1, Y)), (brightness - decay))); + if (Number(KinkyDungeonBrightnessGet(X, Y-1)) < brightness) nextBrightness.push({x:X, y:Y-1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X, Y-1, Math.max(Number(KinkyDungeonLightGet(X, Y-1)), (brightness - decay))); + if (Number(KinkyDungeonBrightnessGet(X, Y+1)) < brightness) nextBrightness.push({x:X, y:Y+1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X, Y+1, Math.max(Number(KinkyDungeonLightGet(X, Y+1)), (brightness - decay))); + + if (brightness > 0.5) { + if (Number(KinkyDungeonBrightnessGet(X-1, Y-1)) < brightness) nextBrightness.push({x:X-1, y:Y-1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X-1, Y-1, Math.max(Number(KinkyDungeonLightGet(X-1, Y-1)), brightness - decay)); + if (Number(KinkyDungeonBrightnessGet(X-1, Y+1)) < brightness) nextBrightness.push({x:X-1, y:Y+1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X-1, Y+1, Math.max(Number(KinkyDungeonLightGet(X-1, Y+1)), brightness - decay)); + if (Number(KinkyDungeonBrightnessGet(X+1, Y-1)) < brightness) nextBrightness.push({x:X+1, y:Y-1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y-1, Math.max(Number(KinkyDungeonLightGet(X+1, Y-1)), brightness - decay)); + if (Number(KinkyDungeonBrightnessGet(X+1, Y+1)) < brightness) nextBrightness.push({x:X+1, y:Y+1, shadow: shadow, color: color, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y+1, Math.max(Number(KinkyDungeonLightGet(X+1, Y+1)), brightness - decay)); + } + } + } + } + } + } + } + + for (let b of nextBrightness) { + let brightness = KinkyDungeonBrightnessGet(b.x, b.y); + if (b.brightness > brightness) { + KinkyDungeonBrightnessSet(b.x, b.y, Math.max(Number(brightness), b.brightness)); + KinkyDungeonColorSet(b.x, b.y, KDAvgColor(b.color, KinkyDungeonColorGet(b.x, b.y), b.brightness, brightness)); + //KinkyDungeonShadowSet(b.x, b.y, KDAvgColor(b.shadow, KinkyDungeonShadowGet(b.x, b.y), b.brightness, brightness)); + } + } + } + + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + let brightness = KinkyDungeonBrightnessGet(X, Y); + KinkyDungeonShadowSet(X, Y, KDAvgColor(ShadowColor, 0x000000, 1, Math.max(0, brightness - baseBrightness))); + } + } + + KDPlayerLight = KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); +} + +/** + * Averages two hex colors according to weights w1 and w2 + * @param {number} w1 - Weight of color1 + * @param {number} w2 - Weight of color2 + */ +function KDAvgColor(color1: number, color2: number, w1: number, w2: number): number { + let r = (color1 & 0xFF0000) >> 16; + let g = (color1 & 0x00FF00) >> 8; + let b = (color1 & 0x0000FF); + + r = Math.floor((r * w1 + w2*((color2 & 0xFF0000) >> 16))/(w1 + w2)); + g = Math.floor((g * w1 + w2*((color2 & 0x00FF00) >> 8))/(w1 + w2)); + b = Math.floor((b * w1 + w2*((color2 & 0x0000FF)))/(w1 + w2)); + return (r << 16) + (g << 8) + b; +} + +function KinkyDungeonMakeVisionMap(width: number, height: number, Viewports: any, Lights: any, delta: number, _mapBrightness: number): void { + let flags = { + SeeThroughWalls: 0, + nightVision: KDGameData.NightVision, + visionAdjust: KDGameData.visionAdjust || 0, + visionAdjustMult: 0.1 + (0.3 * KDGameData.visionBlind || 0), + }; + + if (!KDMapData.FogMemory) KDMapData.FogMemory = []; + + if (!KDGameData.visionAdjust) KDGameData.visionAdjust = 0; + + KinkyDungeonSendEvent("vision",{update: delta, flags: flags}); + + flags.nightVision = Math.max(flags.nightVision * (KinkyDungeonStatsChoice.get("NightBlindness") ? 0.4 : 0.9), flags.nightVision * (1 - flags.visionAdjust)); + + KinkyDungeonBlindLevelBase = 0; // Set to 0 when consumed. We only redraw lightmap once so this is safe. + KDMapExtraData.VisionGrid = []; + // Generate the grid + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) + KDMapExtraData.VisionGrid.push(0); // 0 = pitch dark + } + + let maxPass = 0; + let brightestLight = 0; + + KDVisionBlockers = new Map(); + for (let EE of KDMapData.Entities) { + let Enemy = EE.Enemy; + if (Enemy && (Enemy.blockVision || (Enemy.blockVisionWhileStationary && !EE.moved && EE.idle))) // Add + KDVisionBlockers.set(EE.x + "," + EE.y, true); + } + let LightsTemp = new Map(); + for (let location of Object.values(KDMapData.EffectTiles)) { + for (let tile of Object.values(location)) { + // Smoke doesnt block vision if its right next to the player + if (tile.duration > 0 + && (KDistChebyshev(tile.x - KinkyDungeonPlayerEntity.x, tile.y - KinkyDungeonPlayerEntity.y) > (tile.visionBlockRadius || 1.5) && tile.tags.includes("visionblock"))) { + KDVisionBlockers.set(tile.x + "," + tile.y, true); + } + if (tile.brightness) { + LightsTemp.set(tile.x + "," + tile.y, tile.brightness); + } + } + } + + for (let light of Lights) { + if (light.brightness > 0) { + if (!(LightsTemp.get(light.x + "," + light.y) >= light.brightness)) { + LightsTemp.set(light.x + "," + light.y, light.brightness); + } + if (light.y_orig != undefined && !(LightsTemp.get(light.x + "," + light.y_orig) >= light.brightness)) { + LightsTemp.set(light.x + "," + light.y_orig, light.brightness); + } + } + } + + + + // Viewports = basically lights but they only add vision + for (let light of Viewports) { + if (light.brightness > 0) { + maxPass = Math.max(maxPass, light.brightness); + if (light.brightness > brightestLight) brightestLight = light.brightness; + KinkyDungeonVisionSet(light.x, light.y, light.brightness); + } + } + + let visionAdjustPoints = 0; + let visionAdjustTotal = 1; + + + let rad = KinkyDungeonGetVisionRadius(); + let rad2 = rad + 8; // Limited interaction radius + // Generate the grid + let bb = 0; + let d = 1; + let newL = 0; + for (let X = 1; X < KDMapData.GridWidth - 1; X++) { + for (let Y = 1; Y < KDMapData.GridHeight - 1; Y++) + if (KDistChebyshev(X - KDPlayer().x, Y - KDPlayer().y) < rad2 + && KinkyDungeonCheckPath(X, Y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, + true, true, flags.SeeThroughWalls ? flags.SeeThroughWalls + 1 : 1, true) + && KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(X, Y))) { + bb = KinkyDungeonBrightnessGet(X, Y);//Math.max( Math.min(10, 1.6 * (flags.nightVision - 1)), Math.min(flags.nightVision, 1) * KinkyDungeonBrightnessGet(X, Y)); + d = KDistEuclidean(X - KinkyDungeonPlayerEntity.x, Y - KinkyDungeonPlayerEntity.y); + let darkmult = 1 - 1/Math.max(0.1, flags.nightVision) / (1/Math.max(0.1, flags.nightVision) + bb); + //darkmult *= Math.max(0.1, bb) / (Math.max(0.1, bb) + Math.max(1, d)**2); + bb *= darkmult; + newL = bb - Math.min(2, d * .25);// + 1 - Math.min(2, d * 1.5); + + if (KinkyDungeonStatsChoice.get("DirectionVision") && (KinkyDungeonPlayerEntity.facing_x || KinkyDungeonPlayerEntity.facing_y) + && ( + (KinkyDungeonPlayerEntity.facing_x || 0) * (X - KinkyDungeonPlayerEntity.x) + + (KinkyDungeonPlayerEntity.facing_y || 0) * (Y - KinkyDungeonPlayerEntity.y) <= 0 + ) + && (X != KinkyDungeonPlayerEntity.x || Y != KinkyDungeonPlayerEntity.y) + //&& ((KinkyDungeonPlayerEntity.facing_x && (X - KinkyDungeonPlayerEntity.x) && Math.sign(KinkyDungeonPlayerEntity.facing_x) != Math.sign(X - KinkyDungeonPlayerEntity.x)) + //|| (KinkyDungeonPlayerEntity.facing_y && (Y - KinkyDungeonPlayerEntity.y) && Math.sign(KinkyDungeonPlayerEntity.facing_y) != Math.sign(Y - KinkyDungeonPlayerEntity.y))) + ) { + newL = 0; + } + if (newL > 0) { + let dinv = rad + 1 - d; + if (dinv > 0) { + visionAdjustPoints += dinv * Math.min(10, KinkyDungeonBrightnessGet(X, Y)**2 - 6); + visionAdjustTotal += dinv * 6; + } + } + + if (newL > KinkyDungeonVisionGet(X, Y)) { + KinkyDungeonVisionSet(X, Y, Math.max(0, newL)); + maxPass = Math.max(maxPass, newL); + } + } + } + + if (visionAdjustTotal > 0 && delta > 0) { + let avg = visionAdjustPoints / visionAdjustTotal; + KDGameData.visionBlind = 0; + if (KDGameData.visionAdjust - delta * flags.visionAdjustMult > Math.max(-1, avg)) + KDGameData.visionAdjust -= delta * flags.visionAdjustMult; + else if (KDGameData.visionAdjust + delta * flags.visionAdjustMult < Math.min(1, avg)) { + KDGameData.visionAdjust += delta * flags.visionAdjustMult; + if (avg > 0.1) { + if (KDGameData.visionBlind == 0) { + KinkyDungeonUpdateLightGrid = true; + } + let amnt = 0.2*Math.max(0, (avg - KDGameData.visionAdjust) * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "blindResist"))); + if (avg - KDGameData.visionAdjustBlind > 0.3 && + !(KDGameData.visionBlind > amnt) + ) { + KDGameData.visionBlind = amnt; + if (KDGameData.visionBlind > 0.04) + KinkyDungeonSendTextMessage(4, TextGet("KDVisionBlind"), "#ffffff", 1, false, true, undefined, "Ambient"); + } + + + } + } + + if (delta == 1) { + KDGameData.visionAdjustBlind = ((KDGameData.visionAdjustBlind || 0) + KDGameData.visionAdjust * 9)/10; + } + if (Math.abs(KDGameData.visionAdjust - avg) < delta * flags.visionAdjustMult * 1.1) KDGameData.visionAdjust = avg; + if (KDGameData.visionAdjust > 1) KDGameData.visionAdjust = 1; + else if (KDGameData.visionAdjust < -1) KDGameData.visionAdjust = -1; + + + } + + + let nextBrightness: {x: number, y: number, brightness: number}[] = []; + + for (let L = maxPass; L > 0; L--) { + // if a grid square is next to a brighter transparent object, it gets that light minus one, or minus two if diagonal + nextBrightness = []; + // Main grid square loop + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + if (KDistChebyshev(X - KDPlayer().x, Y - KDPlayer().y) > rad2) continue; + let tile = KinkyDungeonMapGet(X, Y); + if ((LightsTemp.get(X + "," + Y) || (KinkyDungeonTransparentObjects.includes(tile) || (X == KinkyDungeonPlayerEntity.x && Y == KinkyDungeonPlayerEntity.y))) && !KDVisionBlockers.get(X + "," + Y)) { + let brightness = KinkyDungeonVisionGet(X, Y); + if (brightness > 0.5 / Math.max(1, flags.nightVision)) { + let decay = 2 / Math.min(2, Math.max(0.1, flags.nightVision)); + + if (KinkyDungeonStatsChoice.get("DirectionVision") && (KinkyDungeonPlayerEntity.facing_x || KinkyDungeonPlayerEntity.facing_y) + && ( + (KinkyDungeonPlayerEntity.facing_x || 0) * (X - KinkyDungeonPlayerEntity.x) + + (KinkyDungeonPlayerEntity.facing_y || 0) * (Y - KinkyDungeonPlayerEntity.y) <= 0 + ) + && (X != KinkyDungeonPlayerEntity.x || Y != KinkyDungeonPlayerEntity.y) + //&& ((KinkyDungeonPlayerEntity.facing_x && (X - KinkyDungeonPlayerEntity.x) && Math.sign(KinkyDungeonPlayerEntity.facing_x) != Math.sign(X - KinkyDungeonPlayerEntity.x)) + //|| (KinkyDungeonPlayerEntity.facing_y && (Y - KinkyDungeonPlayerEntity.y) && Math.sign(KinkyDungeonPlayerEntity.facing_y) != Math.sign(Y - KinkyDungeonPlayerEntity.y))) + ) { + decay += 5; + } + if (!KinkyDungeonTransparentObjects.includes(tile)) decay += 3; + + if (brightness > 0) { + if (Number(KinkyDungeonVisionGet(X-1, Y)) < brightness) nextBrightness.push({x:X-1, y:Y, brightness: (brightness - decay)});// KinkyDungeonLightSet(X-1, Y, Math.max(Number(KinkyDungeonLightGet(X-1, Y)), (brightness - decay))); + if (Number(KinkyDungeonVisionGet(X+1, Y)) < brightness) nextBrightness.push({x:X+1, y:Y, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y, Math.max(Number(KinkyDungeonLightGet(X+1, Y)), (brightness - decay))); + if (Number(KinkyDungeonVisionGet(X, Y-1)) < brightness) nextBrightness.push({x:X, y:Y-1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X, Y-1, Math.max(Number(KinkyDungeonLightGet(X, Y-1)), (brightness - decay))); + if (Number(KinkyDungeonVisionGet(X, Y+1)) < brightness) nextBrightness.push({x:X, y:Y+1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X, Y+1, Math.max(Number(KinkyDungeonLightGet(X, Y+1)), (brightness - decay))); + + if (brightness > 0.5) { + if (Number(KinkyDungeonVisionGet(X-1, Y-1)) < brightness) nextBrightness.push({x:X-1, y:Y-1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X-1, Y-1, Math.max(Number(KinkyDungeonLightGet(X-1, Y-1)), brightness - decay)); + if (Number(KinkyDungeonVisionGet(X-1, Y+1)) < brightness) nextBrightness.push({x:X-1, y:Y+1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X-1, Y+1, Math.max(Number(KinkyDungeonLightGet(X-1, Y+1)), brightness - decay)); + if (Number(KinkyDungeonVisionGet(X+1, Y-1)) < brightness) nextBrightness.push({x:X+1, y:Y-1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y-1, Math.max(Number(KinkyDungeonLightGet(X+1, Y-1)), brightness - decay)); + if (Number(KinkyDungeonVisionGet(X+1, Y+1)) < brightness) nextBrightness.push({x:X+1, y:Y+1, brightness: (brightness - decay)});//KinkyDungeonLightSet(X+1, Y+1, Math.max(Number(KinkyDungeonLightGet(X+1, Y+1)), brightness - decay)); + } + } + } + } + } + } + + for (let b of nextBrightness) { + KinkyDungeonVisionSet(b.x, b.y, Math.max(Number(KinkyDungeonVisionGet(b.x, b.y)), b.brightness)); + } + } + + + let vv = 0; + // Now make lights bright + for (let X = 1; X < KDMapData.GridWidth - 1; X++) { + for (let Y = 1; Y < KDMapData.GridHeight - 1; Y++) { + if (KDistChebyshev(X - KDPlayer().x, Y - KDPlayer().y) > rad2) continue; + vv = KinkyDungeonVisionGet(X, Y); + bb = KinkyDungeonBrightnessGet(X, Y); + if (vv > 0 && KDLightCropValue + bb > vv && LightsTemp.get(X + "," + Y)) { + KinkyDungeonVisionSet(X, Y, KDLightCropValue + bb); + } + } + } + + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + if (KDistChebyshev(X - KDPlayer().x, Y - KDPlayer().y) > rad2) continue; + let dd = KDistChebyshev(X - KinkyDungeonPlayerEntity.x, Y - KinkyDungeonPlayerEntity.y); + if (dd > rad) + KinkyDungeonVisionSet(X, Y, 0); + else if (rad < KDGameData.MaxVisionDist && dd > 1.5) { + KinkyDungeonVisionSet(X, Y, KinkyDungeonVisionGet(X, Y) * Math.min(1, Math.max(0, rad - dd)/3)); + } + } + } + + + if (KinkyDungeonSeeAll) { + KDMapExtraData.VisionGrid = []; + // Generate the grid + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) + //KinkyDungeonLightGrid = KinkyDungeonLightGrid + '9'; // 0 = pitch dark + KDMapExtraData.VisionGrid.push(10); // 0 = pitch dark + //KinkyDungeonLightGrid = KinkyDungeonLightGrid + '\n'; + } + } else { + + + + // Generate the grid + let minDist = KDGameData.MinVisionDist; + let dist = 0; + let fog = true;//KDAllowFog(); + let forgetful = !!KinkyDungeonStatsChoice.get("Forgetful"); + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) + if (X >= 0 && X <= width-1 && Y >= 0 && Y <= height-1 && KDistChebyshev(X - KDPlayer().x, Y - KDPlayer().y) < rad2) { + dist = KDistChebyshev(KinkyDungeonPlayerEntity.x - X, KinkyDungeonPlayerEntity.y - Y); + if (dist < Math.ceil(minDist)) { + let distE = KDistEuclidean(KinkyDungeonPlayerEntity.x - X, KinkyDungeonPlayerEntity.y - Y); + if (fog && dist < Math.ceil(minDist) + && distE < minDist + && KinkyDungeonCheckPath(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, X, Y, true, true, flags.SeeThroughWalls ? flags.SeeThroughWalls + 1 : 1, true)) { + KDMapData.FogGrid[X + Y*(width)] = Math.max(KDMapData.FogGrid[X + Y*(width)], 3); + if (forgetful) + KDMapData.FogMemory[X + Y*(width)] = Math.max(KDMapData.FogMemory[X + Y*(width)], KDBaseFogMemory); + } + if (distE < (KinkyDungeonDeaf ? 1.5 : 2.3) && KDMapExtraData.VisionGrid[X + Y*(width)] == 0 + && KinkyDungeonCheckPath(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, X, Y, true, true, flags.SeeThroughWalls ? flags.SeeThroughWalls + 1 : 1, true)) { + KDMapExtraData.VisionGrid[X + Y*(width)] = 1; + } + } + + if (fog) { + KDMapData.FogGrid[X + Y*(width)] = Math.max(KDMapData.FogGrid[X + Y*(width)], KDMapExtraData.VisionGrid[X + Y*(width)] ? 2 : 0); + if (forgetful) + KDMapData.FogMemory[X + Y*(width)] = Math.max(KDMapData.FogMemory[X + Y*(width)], KDMapExtraData.VisionGrid[X + Y*(width)] ? KDBaseFogMemory : 0); + } + } + } + for (let X = 0; X < KDMapData.GridWidth; X++) { + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + if (X >= 0 && X <= width-1 && Y >= 0 && Y <= height-1) { + if (KDGameData.RevealedTiles && KDGameData.RevealedTiles[X + ',' + Y] >= 0) { + KDMapExtraData.VisionGrid[X + Y*(width)] = Math.max(KDMapExtraData.VisionGrid[X + Y*(width)] || 0, 1); + } else if (KDGameData.RevealedFog && KDGameData.RevealedFog[X + ',' + Y] >= 0) { + KDMapData.FogGrid[X + Y*(width)] = Math.max(KDMapData.FogGrid[X + Y*(width)] || 0, 1); + if (forgetful) { + KDMapData.FogMemory[X + Y*(width)] = Math.max(KDMapData.FogMemory[X + Y*(width)] || 0, KDBaseFogMemory * 0.5); + } + } + } + } + } + } +} + +let KDLightCropValue = 6; + +function KDDrawFog(CamX: number, CamY: number, CamX_offset: number, CamY_offset: number, _CamX_offsetVis: number, _CamY_offsetVis: number): void { + if (KDRedrawFog > 0) { + KDRedrawMM = 1; + kdgamefog.clear(); + //kdgamefogmask.clear(); + + let v_td = false; + let v_tu = false; + let v_tl = false; + let v_tr = false; + let v_tdl = false; + let v_tdr = false; + let RX = 0; + let RY = 0; + let allowFog = false; + let visible = false; + let fog = 0; + let lightDiv = 0; + let light = 0; + let shadowColor = 0; + let l = 0; + let pad = 0; + + let allFog = KinkyDungeonFlags.get("TimeSlow") || (KDToggles.GreyscaleBlindness && KinkyDungeonBlindLevel >= 2) || ( + KinkyDungeonStatsChoice.get("NightBlindness") && KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) < KDShadowThreshold && KDGameData.visionAdjust < -0.5 + );//KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "TimeSlow"); + + for (let R = -1; R <= KinkyDungeonGridHeightDisplay + 2; R++) { + for (let X = -1; X <= KinkyDungeonGridWidthDisplay + 2; X++) { + + RY = R+CamY; + RX = X+CamX; + allowFog = KDAllowFog(); + if (RY >= -1 && RY < KDMapData.GridHeight && RX >= -1 && RX < KDMapData.GridWidth) { + visible = (KinkyDungeonVisionGet(RX, RY) > 0 || (allowFog && KinkyDungeonFogGet(RX, RY) > 0)); + + if (visible) { + + fog = Math.min(0.5, KinkyDungeonFogGet(RX, RY)/10); + lightDiv = (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(RX, RY))) ? KDLightCropValue : KDLightCropValue * 0.7; + light = Math.max(KDMapExtraData.VisionGrid[RX + RY*KDMapData.GridWidth]/lightDiv, fog); + //let lightColor = KDMapExtraData.ColorGrid[RX + RY*KDMapData.GridWidth]; + shadowColor = KDMapExtraData.ShadowGrid[RX + RY*KDMapData.GridWidth]; + if (KDMapExtraData.VisionGrid[RX + RY*KDMapData.GridWidth] > 0 && KDistChebyshev(KinkyDungeonPlayerEntity.x - RX, KinkyDungeonPlayerEntity.y - RY) < 2) { + light = light + (1 - light)*0.5; + } + l = Math.max(0, Math.min(1, (1-light))); + + if (KDToggles.FancyShadows) { + pad = KinkyDungeonGridSizeDisplay * 0.5; + KDDraw(kdgamefogsmooth, kdpixifogsprites, `${RX},${RY},_@@`, + KinkyDungeonRootDirectory + "Vision.png", + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, + KinkyDungeonGridSizeDisplay + pad*2, KinkyDungeonGridSizeDisplay + pad*2, + undefined, { + tint: (!allFog && light > 0) ? shadowColor : 0x000000, + alpha: (KDMapExtraData.VisionGrid[RX + RY*KDMapData.GridWidth] > 0) ? (0.5*l*l) : l, + //blendMode: PIXI.BLEND_MODES.DARKEN, + }, + ); + } else { + kdgamefog.beginFill(light > 0 ? shadowColor : 0x000000, (KDMapExtraData.VisionGrid[RX + RY*KDMapData.GridWidth] > 0) ? (0.5*l*l) : l); + pad = light > 0 ? 0 : 1; + kdgamefog.drawRect((-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, KinkyDungeonGridSizeDisplay + pad*2, KinkyDungeonGridSizeDisplay + pad*2); + kdgamefog.endFill(); + } + } else if (KDToggles.FancyShadows && + ((KinkyDungeonVisionGet(RX-1, RY) > 0 || (allowFog && KinkyDungeonFogGet(RX-1, RY) > 0)) + || (KinkyDungeonVisionGet(RX+1, RY) > 0 || (allowFog && KinkyDungeonFogGet(RX+1, RY) > 0)) + || (KinkyDungeonVisionGet(RX, RY-1) > 0 || (allowFog && KinkyDungeonFogGet(RX, RY-1) > 0)) + || (KinkyDungeonVisionGet(RX, RY+1) > 0 || (allowFog && KinkyDungeonFogGet(RX, RY+1) > 0)))) { + pad = KinkyDungeonGridSizeDisplay; + KDDraw(kdgamefogsmoothDark, kdpixifogsprites, `${RX},${RY},_@@0`, + KinkyDungeonRootDirectory + "VisionNeg.png", + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, + KinkyDungeonGridSizeDisplay + pad*2, KinkyDungeonGridSizeDisplay + pad*2, + undefined,{ + blendMode: PIXI.BLEND_MODES.MULTIPLY, + } + ); + } + if (visible) { + /*kdgamefogmask.beginFill(0xffffff); + pad = 1; + kdgamefogmask.drawRect((-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, KinkyDungeonGridSizeDisplay + pad*2, KinkyDungeonGridSizeDisplay + pad*2); + kdgamefogmask.endFill();*/ + + if (KDToggles.FancyWalls && (KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(RX, RY)) || RX == 0 || RY == 0)) { + if (KDWallVert(RX, RY) || KDMapData.GridHeight == RY + 1) { + // Tile Up Visible + v_tu = ((KinkyDungeonVisionGet(RX, RY - 1) > 0 || (allowFog && KinkyDungeonFogGet(RX, RY - 1) > 0))); + v_td = ((KinkyDungeonVisionGet(RX, RY + 1) > 0 || (allowFog && KinkyDungeonFogGet(RX, RY + 1) > 0))); + v_tl = ((KinkyDungeonVisionGet(RX - 1, RY) > 0 || (allowFog && KinkyDungeonFogGet(RX - 1, RY) > 0))); + v_tr = ((KinkyDungeonVisionGet(RX + 1, RY) > 0 || (allowFog && KinkyDungeonFogGet(RX + 1, RY) > 0))); + //v_tul = ((KinkyDungeonVisionGet(RX - 1, RY - 1) > 0 || (allowFog && KinkyDungeonFogGet(RX - 1, RY - 1) > 0))); + v_tdl = ((KinkyDungeonVisionGet(RX - 1, RY + 1) > 0 || (allowFog && KinkyDungeonFogGet(RX - 1, RY + 1) > 0))); + //v_tur = ((KinkyDungeonVisionGet(RX + 1, RY - 1) > 0 || (allowFog && KinkyDungeonFogGet(RX + 1, RY - 1) > 0))); + v_tdr = ((KinkyDungeonVisionGet(RX + 1, RY + 1) > 0 || (allowFog && KinkyDungeonFogGet(RX + 1, RY + 1) > 0))); + + pad = 1; + if (!v_tl) { + kdgamefog.beginFill(0x000000, 1.0); + kdgamefog.drawRect( + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, + (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, + KinkyDungeonGridSizeDisplay/2 + pad*2, + KinkyDungeonGridSizeDisplay + pad); + kdgamefog.endFill(); + } + if (!v_tr) { + kdgamefog.beginFill(0x000000, 1.0); + kdgamefog.drawRect( + (-CamX_offset + X + 0.5)*KinkyDungeonGridSizeDisplay - pad, + (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, + KinkyDungeonGridSizeDisplay/2 + pad*2, + KinkyDungeonGridSizeDisplay + pad); + kdgamefog.endFill(); + } + if (!v_tu && !v_tdl && !v_tdr) { + kdgamefog.beginFill(0x000000, 1.0); + kdgamefog.drawRect( + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, + (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, + KinkyDungeonGridSizeDisplay + pad*2, + KinkyDungeonGridSizeDisplay/2 + pad*2); + kdgamefog.endFill(); + } + if (!v_td) { + kdgamefog.beginFill(0x000000, 1.0); + kdgamefog.drawRect( + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, + (-CamY_offset + R + 0.5)*KinkyDungeonGridSizeDisplay - pad, + KinkyDungeonGridSizeDisplay + pad*2, + KinkyDungeonGridSizeDisplay/2 + pad*2); + kdgamefog.endFill(); + } + if (v_td && v_tl && !v_tdl) { + kdgamefog.beginFill(0x000000, 1.0); + kdgamefog.drawRect( + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, + (-CamY_offset + R + 0.5)*KinkyDungeonGridSizeDisplay - pad, + KinkyDungeonGridSizeDisplay/2 + pad*2, + KinkyDungeonGridSizeDisplay/2 + pad*2); + kdgamefog.endFill(); + } + if (v_td && v_tr && !v_tdr) { + kdgamefog.beginFill(0x000000, 1.0); + kdgamefog.drawRect( + (-CamX_offset + X + 0.5)*KinkyDungeonGridSizeDisplay - pad, + (-CamY_offset + R + 0.5)*KinkyDungeonGridSizeDisplay - pad, + KinkyDungeonGridSizeDisplay/2 + pad*2, + KinkyDungeonGridSizeDisplay/2 + pad*2); + kdgamefog.endFill(); + } + } + } + } + } + } + } + + if (!KDToggles.LightmapFilter && kdmapboard.filters.length > 1) { + kdmapboard.filters = [ + kdgammafilter, + ]; + } else if (KDToggles.LightmapFilter && kdmapboard.filters.length < 2) { + kdmapboard.filters = [ + ...KDBoardFilters, + kdgammafilter, + ]; + } + + // Slight correction... + let xMult = 1;//(Math.floor(KinkyDungeonGridWidthDisplay)/KinkyDungeonGridWidthDisplay); + let yMult = 1;//(Math.floor(KinkyDungeonGridHeightDisplay)/KinkyDungeonGridHeightDisplay); + + if (StandalonePatched && KDToggles.LightmapFilter) { + pad = 0; + kdlightmapGFX.clear(); + // fog map + //allFog = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "TimeSlow"); + if (allFog) { + kdlightmapGFX.beginFill(0xffffff, 1.); + kdlightmapGFX.drawRect( + 0,0, + KinkyDungeonGridWidthDisplay*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridHeightDisplay*KinkyDungeonGridSizeDisplay,); + kdlightmapGFX.endFill(); + } else + for (let R = 0; R <= KinkyDungeonGridHeightDisplay; R++) { + for (let X = 0; X <= KinkyDungeonGridWidthDisplay; X++) { + RY = R+CamY; + RX = X+CamX; + + if (KDMapExtraData.VisionGrid[RX + RY*KDMapData.GridWidth] == 0) { + kdlightmapGFX.beginFill(0xffffff, 1.); + kdlightmapGFX.drawRect( + xMult*(X - CamX_offset)*KinkyDungeonGridSizeDisplay - pad, + yMult*(R - CamY_offset)*KinkyDungeonGridSizeDisplay - pad, + xMult*KinkyDungeonGridSizeDisplay + pad*2, + yMult*KinkyDungeonGridSizeDisplay + pad*2); + kdlightmapGFX.endFill(); + } + + /*kdlightmapGFX.beginFill(0xffffff, 0.5); + kdlightmapGFX.drawRect( + xMult*(X - CamX_offsetVis)*KinkyDungeonGridSizeDisplay, + yMult*(R - CamY_offsetVis)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay/2, + KinkyDungeonGridSizeDisplay/2); + kdlightmapGFX.endFill();*/ + + } + } + + PIXIapp.renderer.render(kdlightmapGFX, { + renderTexture: kdlightmap, + blit: true, + }); + + + for (let R = 0; R <= KinkyDungeonGridHeightDisplay; R++) { + for (let X = 0; X <= KinkyDungeonGridWidthDisplay; X++) { + RY = R+CamY; + RX = X+CamX; + + let lightColor = allFog ? KDGetLightColorGreyscale(RX, RY) : KDGetLightColor(RX, RY); + + if (KDMapExtraData.VisionGrid[RX + RY*KDMapData.GridWidth] || KDMapData.FogGrid[RX + RY*KDMapData.GridWidth]) { + /*kdbrightnessmapGFX.beginFill(lightColor, 1.); + kdbrightnessmapGFX.drawRect( + xMult*(X - CamX_offsetVis)*KinkyDungeonGridSizeDisplay - pad, + yMult*(R - CamY_offsetVis)*KinkyDungeonGridSizeDisplay - pad, + xMult*KinkyDungeonGridSizeDisplay + pad*2, + yMult*KinkyDungeonGridSizeDisplay + pad*2); + kdbrightnessmapGFX.endFill();*/ + pad = 126/72 * KinkyDungeonGridSizeDisplay; + KDDraw(kdbrightnessmapGFX, kdpixibrisprites, `${RX},${RY},_LI`, + KinkyDungeonRootDirectory + "Lighting.png", + (-CamX_offset + X)*KinkyDungeonGridSizeDisplay - pad, (-CamY_offset + R)*KinkyDungeonGridSizeDisplay - pad, + KinkyDungeonGridSizeDisplay + pad*2, KinkyDungeonGridSizeDisplay + pad*2, + undefined, { + tint: lightColor, + }, + ); + } + } + } + + PIXIapp.renderer.render(kdbrightnessmapGFX, { + renderTexture: kdbrightnessmap, + blit: true, + }); + + } + KDCullSpritesList(kdpixifogsprites); + KDCullSpritesList(kdpixibrisprites); + } + + + + let scale = KDMinimapScale; + let w = KDMinimapW; + let h = KDMinimapH; + let alpha = KDMinimapAlpha; + let borders = false; + let zoom = 1; + let blackMap = false; + if (!(KinkyDungeonShowInventory) && (KDExpandMinimap)) { + scale = KDMinimapExpandedZoom; + w = KDMinimapExpandedSize; + h = Math.floor(KDMinimapHBig/KDMinimapWBig*KDMinimapExpandedSize); + alpha = 1.; + zoom = (KDMinimapBaseSize/KDMinimapExpandedSize); + borders = true; + } else if (!KDExpandMinimap) { + //zoom = (KDMinimapBaseSize/KDMinimapExpandedSize); + blackMap = true; + } + KDMinimapWTarget = w*scale*zoom; + KDMinimapHTarget = h*scale*zoom; + + if (KDMinimapWCurrent != KDMinimapWTarget || KDMinimapHCurrent != KDMinimapHTarget) { + KDRedrawMM = 2; + } + + if (KDRedrawMM > 0) { + let xxx = KinkyDungeonPlayerEntity.x - w/2 + let yyy = KinkyDungeonPlayerEntity.y-h/2; + if (KinkyDungeonInspect) { + xxx = KDInspectCamera.x - w/2; + yyy = KDInspectCamera.y - h/2; + } + KDRenderMinimap(xxx, yyy, w, h, scale, alpha, borders, blackMap); + if (KDRedrawMM > 0) KDRedrawMM -= 1; + } + + kdminimap.scale.x = KDMinimapWCurrent/KDMinimapWTarget*zoom; + kdminimap.scale.y = KDMinimapHCurrent/KDMinimapHTarget*zoom; + + if (KDRedrawFog > 0) KDRedrawFog -= 1; +} + +function KDMinimapWidth() { + return KDMinimapWCurrent; +} +function KDMinimapHeight() { + return KDMinimapHCurrent; +} + +function KDUpdateMinimapTarget(force = false) { + KDMinimapWTarget = KDMinimapExpandedZoom*KDMinimapExpandedSize * (KDMinimapBaseSize/KDMinimapExpandedSize); + KDMinimapHTarget = KDMinimapExpandedZoom*Math.floor(KDMinimapHBig/KDMinimapWBig*KDMinimapExpandedSize) * (KDMinimapBaseSize/KDMinimapExpandedSize); + if (force) { + KDMinimapWCurrent = KDMinimapWTarget; + KDMinimapHCurrent = KDMinimapHTarget; + } +} + +let KDExpandMinimap = false; +let KDMinimapScale = 8; +let KDMinimapScaleBig = 12; +let KDMinimapW = 30; +let KDMinimapH = 30; +let KDMinimapBaseSize= 60; +let KDMinimapExpandedSize = KDMinimapBaseSize; +let KDMinimapExpandedSizeTick = 20; +let KDMinimapWBig = 110; +let KDMinimapHBig = 110; +let KDMinimapAlpha = 0.7; + +let KDMinimapExpandedZoom = KDMinimapScaleBig; +let KDMinimapExpandedZoomTick = 3; + +let KDMinimapWCurrent = KDMinimapW*KDMinimapScale; +let KDMinimapHCurrent = KDMinimapH*KDMinimapScale; +let KDMinimapWTarget = KDMinimapWCurrent; +let KDMinimapHTarget = KDMinimapHCurrent; + +let KDMinimapSoftTextBoostWidth = 3; +let KDMinimapSoftTextBoostWidthCMult = 1.2; +let KDMMReadabilityBoost = 0.8; +let KDMMBoostExp = 2; + +/** + * @param x + * @param y + * @param w + * @param h + * @param scale + * @param alpha + * @param gridborders + * @param blackMap + */ +function KDRenderMinimap(x: number, y: number, w: number, h: number, scale: number, alpha: number, gridborders: boolean, blackMap: boolean): void { + kdminimap.clear(); + kdminimap.lineStyle(1, 0xaaaaaa); + kdminimap.beginFill(0x000000, alpha); + kdminimap.drawRect( + 0, + 0, + (w)*scale, + (h)*scale); + kdminimap.endFill(); + let yBoost: Record = {}; + if (KDToggles.EnableMinimap || !blackMap) { + let allowFog = KDAllowFog(); + let drawLabels: {xx: number, yy: number, label: string, curr: number}[] = []; + for (let xx = 0; xx < w; xx++) { + for (let yy = 0; yy < h; yy++) { + + if (KDIsInBounds(x+xx, y+yy, 0) && (KDMapExtraData.VisionGrid[(x+xx) + (y+yy)*KDMapData.GridWidth] > 0 || (allowFog && KDMapData.FogGrid[(x+xx) + (y+yy)*KDMapData.GridWidth] > 0))) { + let mouseOver = false;/*MouseIn( + kdminimap.x + (w/2*scale-scale/2 + (x+xx)*scale)*kdminimap.scale.x, + kdminimap.y + (h/2*scale-scale/2 + (y+yy)*scale)*kdminimap.scale.y, + scale*kdminimap.scale.x, scale*kdminimap.scale.y);*/ + if (mouseOver || KDToggles.MMLabels) { + if (KDMinimapLabels[KinkyDungeonMapGet(x+xx, y+yy)]) { + let label = KDMinimapLabels[KinkyDungeonMapGet(x+xx, y+yy)](x+xx, y+yy, + mouseOver + ); + if (label) { + if (KinkyDungeonTilesGet((x+xx) + "," + (y+yy))?.Lock) { + if (KinkyDungeonTilesGet((x+xx) + "," + (y+yy)).LockSeen) { + label = label + TextGet("KDMMLocked"); + } + } + if (KinkyDungeonTilesGet((x+xx) + "," + (y+yy))?.Name) { + label = label.replace("GDSNM", + TextGet("KinkyDungeonShrine" + + KinkyDungeonTilesGet((x+xx) + "," + (y+yy)).Name)) + } + + let curr = Math.round(y+yy+( + yBoost[(x+xx) + "," + (y+yy)] || 0 + )) + let mm = Math.ceil(KDMinimapSoftTextBoostWidth + + label.length * KDMinimapSoftTextBoostWidthCMult); + for (let i = 0; i <= mm; i++) { + if (i == 0) continue; + yBoost[(i + x+xx) + "," + (y+yy+curr)] = + (yBoost[(i + x+xx) + "," + (y+yy+curr)] || 0) + + (1 - Math.abs((i / (mm))**KDMMBoostExp)); + } + + drawLabels.push({xx: xx, yy: yy, label: label, curr: y+yy+curr}); + + } + } + + } + + if (KDMinimapIcons[KinkyDungeonMapGet(x+xx, y+yy)]) { + KDDraw(kdminimap, kdminimapsprites, `minimapIcon${KinkyDungeonMapGet(x+xx, y+yy)},${x+xx},${y+yy}`, + KinkyDungeonRootDirectory + KDMinimapIcons[KinkyDungeonMapGet(x+xx, y+yy)](x+xx, y+yy), + xx*scale, yy*scale, scale, scale, undefined, { + zIndex: 10, + }, + ); + } else { + if (gridborders) + kdminimap.lineStyle(1, KDMapExtraData.VisionGrid[(x+xx) + (y+yy)*KDMapData.GridWidth] > 0 ? 0xaaaaaa : 0, 0.5); + else + kdminimap.lineStyle(0, 0); + kdminimap.beginFill(string2hex(KDGetTileColor(x + xx, y + yy)), KDMapExtraData.VisionGrid[(x+xx) + (y+yy)*KDMapData.GridWidth] > 0 ? 1. : 0.5); + kdminimap.drawRect( + xx*scale, + yy*scale, + scale, + scale); + kdminimap.endFill(); + } + + + + + } + } + } + + + let fs = Math.max(10, 6+Math.ceil(h * 0.2)); + for (let d of drawLabels) { + DrawTextFitKDTo2(kdminimap, kdminimapsprites, d.label, + (d.xx + 0.5)*scale, + (d.yy-0.5)*scale + fs * (0 - KDMMReadabilityBoost * ((yBoost[(x+d.xx) + "," + (d.curr)] || 0))), + scale * 32, KDGetTileColor(x + d.xx, y + d.yy) || "#ffffff", "#111111", + fs, "center", + 20, 1.0, Math.max(2, 1 + Math.ceil(h * 0.05)) + ); + } + + KinkyDungeonSendEvent("drawminimap", {update: KDDrawUpdate, x:x, y:y, w:w, h:h, scale:scale}); + // Player circle + kdminimap.lineStyle(4, 0); + kdminimap.beginFill(0xffffff, 1.); + kdminimap.drawCircle( + w/2*scale+scale/2 + (KinkyDungeonPlayerEntity.x - KDInspectCamera.x)*scale, + h/2*scale+scale/2 + (KinkyDungeonPlayerEntity.y - KDInspectCamera.y)*scale, + scale); + kdminimap.endFill(); + if (KinkyDungeonInspect) { + // Camera square + let xpre = w/2*scale - scale*KinkyDungeonGridWidthDisplay + scale*(KDInspectCamera.x - KinkyDungeonPlayerEntity.x); + let ypre = h/2*scale - scale*KinkyDungeonGridHeightDisplay + scale*(KDInspectCamera.y - KinkyDungeonPlayerEntity.y); + let xx = Math.max(0, xpre); + let yy = Math.max(0, ypre); + kdminimap.lineStyle(2, 0xffffff); + kdminimap.drawRect( + xx, + yy, + Math.min(scale*w-xx, 2*scale * KinkyDungeonGridWidthDisplay + Math.min(0, xpre)), + Math.min(scale*h-yy, 2*scale * KinkyDungeonGridHeightDisplay + Math.min(0, ypre))); + kdminimap.endFill(); + } + } + KDCullSpritesList(kdminimapsprites); + +} + + + + +/** + * Allows fog of war to be rendered + */ +function KDAllowFog() { + return !(KinkyDungeonStatBlind > 0);//!((KinkyDungeonBlindLevel > 0 && KinkyDungeonStatsChoice.get("TotalBlackout"))); +} + +/** + * @param x + * @param y + * @param amount + */ +function KDRevealTile(x: number, y: number, amount: number) { + KinkyDungeonUpdateLightGrid = true; + if (!KDGameData.RevealedTiles) KDGameData.RevealedTiles = {}; + if (!KDGameData.RevealedFog) KDGameData.RevealedFog = {}; + KDGameData.RevealedTiles[x + ',' + y] = Math.max(amount, KDGameData.RevealedTiles[x + ',' + y] || 0); +} diff --git a/Game/src/collection/KDCollectionWander.ts b/Game/src/collection/KDCollectionWander.ts new file mode 100644 index 000000000..17e4ce76d --- /dev/null +++ b/Game/src/collection/KDCollectionWander.ts @@ -0,0 +1,93 @@ +interface CollectionWanderType { + spawnRoom: string, + /** returns the NPC if it spawned an NPC + * Note that it should respect value.spawned + * If spawned is true that means the NPC was spawned while the player was outside of summit + * This means that the spawnCondition should spawn the NPC in a position that makes sense + */ + spawnCondition?: (value: KDCollectionEntry, entity: entity) => entity; + /** runs only while the NPC in the spawnroom but */ + spawnConditionRemote?: (value: KDCollectionEntry) => entity; + /** Run each tick*/ + maintain: (value: KDCollectionEntry, entity: entity, delta: number) => void; + /** Changes the facility of the NPC, returns the facility being moved to (default Return) */ + onChangeFacility: (value: KDCollectionEntry, entity: entity, fromFacility: string, toFacility: string) => string; +} + +function KDTickCollectionWanderCollectionEntry(value: KDCollectionEntry) { + if (value?.Facility && KDCollectionWanderTypes[value.Facility]) { + if (KDGetGlobalEntity(value.id) && KDGetGlobalEntity(value.id).FacilityAction != value.Facility) { + KDChangeEntityFacilityAction(KDGetGlobalEntity(value.id), value.Facility); + } + + if (KDGameData.RoomType == KDCollectionWanderTypes[value.Facility].spawnRoom + && KDGameData.RoomType == KDCollectionWanderTypes[value.Facility].spawnRoom + ) { + let spawnFunction = KDCollectionWanderTypes[value.Facility].spawnCondition; + if (spawnFunction) { + let entity = KinkyDungeonFindID(value.id); + if (!entity) { + if (spawnFunction(value, entity)) + value.spawned = true; + else value.spawned = false; + } else if (entity.FacilityAction) value.spawned = true; + else value.spawned = false; + } + } else if (KDIsNPCPersistent(value.id) + && (KDGetPersistentNPC(value.id)?.room == KDCollectionWanderTypes[value.Facility].spawnRoom) + && KDGameData.RoomType != KDCollectionWanderTypes[value.Facility].spawnRoom) { + // Run the remote spawn function if the NPC is not in the spawnroom + let spawnFunction = KDCollectionWanderTypes[value.Facility].spawnConditionRemote; + if (spawnFunction) { + if (spawnFunction(value)) + value.spawned = true; + else value.spawned = false; + } + } + + } else if (value.spawned) { + if (KDGetGlobalEntity(value.id) && KDGetGlobalEntity(value.id).FacilityAction != value.Facility) { + KDChangeEntityFacilityAction(KDGetGlobalEntity(value.id), value.Facility); + } + } +} + +function KDTickCollectionWanderEntity(entity: entity, delta: number) { + let value = KDGameData.Collection[entity.id + ""]; + if (!value) return; + if (entity.FacilityAction && KDCollectionWanderTypes[entity.FacilityAction]?.maintain) { + KDCollectionWanderTypes[entity.FacilityAction] + .maintain(value, entity, delta); + } +} + +function KDChangeEntityFacilityAction(entity: entity, action: string) { + let value = KDGameData.Collection[entity.id + ""]; + if (!value) return; + if (entity.FacilityAction && KDCollectionWanderTypes[entity.FacilityAction]?.onChangeFacility) { + entity.FacilityAction = KDCollectionWanderTypes[entity.FacilityAction] + .onChangeFacility(value, entity, entity.FacilityAction, action); + } else if (entity.FacilityAction == undefined) entity.FacilityAction = "Return"; +} + + +function KDSetServantSpawnTemplate(e: entity) { + if (e) { + e.allied = 9999; + e.hostile = 0; + e.boundLevel = 0; + e.faction = "Player"; + KDNPCRefreshBondage(e.id, 0, true); + KinkyDungeonSetEnemyFlag(e, "NoFollow", -1); + e.hp = e.Enemy.maxhp; + e.hostile = undefined; + e.rage = undefined; + } +} +function KDSetPrisonerSpawnTemplate(e: entity) { + if (e) { + e.boundLevel = 0; + KDNPCRefreshBondage(e.id, 0, true); + e.hp = e.Enemy.maxhp; + } +} \ No newline at end of file diff --git a/Game/src/collection/KDCollectionWanderList.ts b/Game/src/collection/KDCollectionWanderList.ts new file mode 100644 index 000000000..8b91d0ad7 --- /dev/null +++ b/Game/src/collection/KDCollectionWanderList.ts @@ -0,0 +1,354 @@ + + +let KDCollectionWanderTypes: Record = { + Return: { + spawnRoom: "Summit", + // Dummy spawn condition, should NEVER spawn NPCs because the faciltiy does not exist + spawnCondition: (value) => { + // if they are already spawned they instantly despawn + if (value.spawned) { + let entity = KinkyDungeonFindID(value.id); + if (entity) { + KDRemoveEntity(entity, false, false, true); + value.spawned = false; + delete entity.FacilityAction; + } + } + return null; + }, + // Dummy spawn condition, should NEVER spawn NPCs because the faciltiy does not exist + // Instead we just set them to spawned so they are instantly removed + spawnConditionRemote: (value) => { + value.spawned = true; + return null; + }, + + // Maintenance condition + maintain: (value, entity, delta) => { + if (entity) { + // Go to the dorm and despawn + let point = KDMapData.Labels?.ServantEntrance ? KDMapData.Labels.ServantEntrance[0] : null; + if (!point) { + delete entity.FacilityAction; + return; + } + if (KDistChebyshev(entity.x - point.x, entity.y - point.y) < 0.5) { + KDRemoveEntity(entity, false, false, true); + value.spawned = false; + delete entity.FacilityAction; + } else { + entity.gx = point.x; + entity.gy = point.y; + KinkyDungeonSetEnemyFlag(entity, "overrideMove", 12); + if (entity.IntentAction) + KDResetIntent(entity, undefined); + } + } + }, + + // Returning NPCs finish returning so they can respawn + onChangeFacility: (value, entity, fromFacility, toFacility) => {return "Return";}, + }, + LoungeReturn: { + spawnRoom: "Summit", + // Dummy spawn condition, should NEVER spawn NPCs because the faciltiy does not exist + spawnCondition: (value) => { + // if they are already spawned they instantly despawn + if (value.spawned) { + let entity = KinkyDungeonFindID(value.id); + if (entity) { + KDRemoveEntity(entity, false, false, true); + value.spawned = false; + delete entity.FacilityAction; + } + } + return null; + }, + // Dummy spawn condition, should NEVER spawn NPCs because the faciltiy does not exist + // Instead we just set them to spawned so they are instantly removed + spawnConditionRemote: (value) => { + value.spawned = true; + return null; + }, + + // Maintenance condition + maintain: (value, entity, delta) => { + if (entity) { + // Go to the dorm and despawn + let point = KDMapData.Labels?.LoungeEntrance ? KDMapData.Labels.LoungeEntrance[0] : null; + + if (!point) { + delete entity.FacilityAction; + return; + } + if (KDistChebyshev(entity.x - point.x, entity.y - point.y) < 0.5) { + KDRemoveEntity(entity, false, false, true); + value.spawned = false; + delete entity.FacilityAction; + } else { + entity.gx = point.x; + entity.gy = point.y; + KinkyDungeonSetEnemyFlag(entity, "overrideMove", 12); + if (entity.IntentAction) + KDResetIntent(entity, undefined); + } + } + }, + + // Returning NPCs finish returning so they can respawn + onChangeFacility: (value, entity, fromFacility, toFacility) => {return "LoungeReturn";}, + }, + Management: { + spawnRoom: "Summit", + spawnCondition: (value) => { + // if they are already spawned they appear in a random place + let entity = KinkyDungeonFindID(value.id); + if (value.spawned && !entity) { + let point = KinkyDungeonGetRandomEnemyPoint(true, false, undefined); + if (point) { + let e = DialogueCreateEnemy(point.x, point.y, value.type, value.id, true); + if (e) { + KDSetServantSpawnTemplate(e); + e.FacilityAction = "Management"; + } + } + } else { + let point = KDMapData.Labels?.ServantEntrance ? KDMapData.Labels.ServantEntrance[0] : {x: 1, y: 3}; + let e = DialogueCreateEnemy(point.x, point.y, value.type, value.id, true); + if (e) { + KDSetServantSpawnTemplate(e); + e.FacilityAction = "Management"; + } + } + return null; + }, + // Set to spawned, dont need to do anything special + spawnConditionRemote: (value) => { + value.spawned = true; + return null; + }, + + // Maintenance condition + maintain: (value, entity, delta) => { + // They just kinda chill man + }, + + // If its not the same it is changed + onChangeFacility: (value, entity, fromFacility, toFacility) => {return toFacility == "Management" ? toFacility : "Return";}, + }, + Warden: { + spawnRoom: "Summit", + spawnCondition: (value) => { + // if they are already spawned they appear in a random place + let entity = KinkyDungeonFindID(value.id); + if (value.spawned && !entity) { + let point = KinkyDungeonGetRandomEnemyPoint(true, false, undefined); + if (point) { + let e = DialogueCreateEnemy(point.x, point.y, value.type, value.id, true); + if (e) { + KDSetServantSpawnTemplate(e); + e.FacilityAction = "Warden"; + } + } + } else { + let point = KDMapData.Labels?.ServantEntrance ? KDMapData.Labels.ServantEntrance[0] : {x: 1, y: 3}; + let e = DialogueCreateEnemy(point.x, point.y, value.type, value.id, true); + if (e) { + KDSetServantSpawnTemplate(e); + e.FacilityAction = "Warden"; + } + } + return null; + }, + // Set to spawned, dont need to do anything special + spawnConditionRemote: (value) => { + value.spawned = true; + return null; + }, + + // Maintenance condition + maintain: (value, entity, delta) => { + // They just kinda chill man + }, + + // If its not the same it is changed + onChangeFacility: (value, entity, fromFacility, toFacility) => {return toFacility == "Warden" ? toFacility : "Return";}, + }, + + + CuddleLounge: { + spawnRoom: "Summit", + spawnCondition: (value) => { + + if (value.status) { + // if they are already spawned they appear in a random place + let entity = KinkyDungeonFindID(value.id); + if (value.spawned && !entity) { + let point = KinkyDungeonGetRandomEnemyPoint(true, false, undefined,); + if (point) { + let e = DialogueCreateEnemy(point.x, point.y, value.type, value.id, true); + if (e) { + KDSetServantSpawnTemplate(e); + e.FacilityAction = "CuddleLounge"; + } + } + } else { + let point = KDMapData.Labels?.LoungeEntrance ? KDMapData.Labels.LoungeEntrance[0] : {x: 1, y: 3}; + let e = DialogueCreateEnemy(point.x, point.y, value.type, value.id, true); + if (e) { + KDSetServantSpawnTemplate(e); + e.FacilityAction = "CuddleLounge"; + } + + } + } + + return null; + }, + // Set to spawned, dont need to do anything special + spawnConditionRemote: (value) => { + if (value.status) + value.spawned = true; + return null; + }, + + // Maintenance condition + maintain: (value, entity, delta) => { + let point = KDMapData.Labels?.Lounge ? KDMapData.Labels.Lounge[0] : null; + if (point) { + entity.AI = "looseguard"; + entity.gxx = point.x; + entity.gyy = point.y; + } + if (point && !KDIDHasFlag(entity.id, "loungeInteract")) { + KDSetIDFlag(entity.id, "loungeInteract", 14); + let eligibleIDs = []; + let presentIDs = []; + let removeIDs = []; + if (KDGameData.FacilitiesData["Prisoners_CuddleLounge"]) { + eligibleIDs = KDGameData.FacilitiesData["Prisoners_CuddleLounge"].filter((id) => { + return !KinkyDungeonFindID(id) + && (!KDIsNPCPersistent(id) + || (KDGetPersistentNPC(id)?.room == "Summit" || !KDGetPersistentNPC(id)?.room)) + }); + presentIDs = KDGameData.FacilitiesData["Prisoners_CuddleLounge"].filter((id) => { + return KinkyDungeonFindID(id); + }); + for (let e of KDMapData.Entities) { + if (KDIsImprisoned(e) + && !eligibleIDs.includes(e.id) + && !presentIDs.includes(e.id)) { + if (!KDIDHasFlag(e.id, "cuddleTime") + && KDistChebyshev(point.x - e.x, point.y - e.y) > 4.5) { + presentIDs.push(e.id); + removeIDs.push(e.id); + } + } + else if (KDIsImprisoned(e) + && presentIDs.includes(e.id)) { + if (!KDIDHasFlag(e.id, "cuddleTime") + && KDistChebyshev(point.x - e.x, point.y - e.y) > 4.5) { + removeIDs.push(e.id); + } + } + } + } + + if ((presentIDs.length > 0 || removeIDs.length > 0) && (KDRandom() < 0.33 || eligibleIDs.length == 0)) { + // Play with prisoner + let prisonerID = removeIDs.length > 0 ? + removeIDs[0] + : presentIDs[Math.floor(KDRandom() * presentIDs.length)]; + let prisoner = KinkyDungeonFindID(prisonerID); + if (prisoner) { + KDSetIDFlag(entity.id, "overrideMove", 18); + if (KDistChebyshev(entity.x - prisoner.x, entity.y - prisoner.y) < 1.5) { + // Despawn if not prisoner + if (!KDGameData.FacilitiesData["Prisoners_CuddleLounge"].includes(prisoner.id) + || prisonerID == removeIDs[0]) { + if (!KDIDHasFlag(prisoner.id, "cuddleTime")) { + // Despawn + KDFreeNPC(prisoner); + KDRemoveEntity(prisoner, false, false, true); + if (KDGameData.Collection[prisoner.id + ""]) { + KDGameData.Collection[prisoner.id + ""].spawned = false; + } + } + } else { + KDSetIDFlag(entity.id, "loungeInteract", 50); + KDSetIDFlag(entity.id, "wander", 17); + } + entity.gx = entity.x; + entity.gy = entity.y; + } else { + let pp = KinkyDungeonGetNearbyPoint(prisoner.x, prisoner.y, true, undefined, true); + if (!pp) pp = KinkyDungeonGetNearbyPoint(prisoner.x, prisoner.y, true, undefined, undefined); + if (!pp) pp = KinkyDungeonGetNearbyPoint(entity.x, entity.y, true, undefined, undefined); + + if (pp) { + entity.gx = pp.x; + entity.gy = pp.y; + } + } + } + } else if (eligibleIDs.length > 0 && KDRandom() < 0.5) { + let furn = KinkyDungeonNearestJailPoint( + entity.x - 3 + Math.floor(KDRandom()*3), + entity.y - 3 + Math.floor(KDRandom()*3), + ["furniture"], + undefined, undefined, true, + (x, y, pp) => { + return KDistChebyshev(x - point.x, y - point.y) <= 4.5; + } + ); + + if (furn) { + KDSetIDFlag(entity.id, "overrideMove", 18); + if (KDistChebyshev(entity.x - furn.x, entity.y - furn.y) < 1.5) { + // Spawn a prisoner + let vid = eligibleIDs[Math.floor(KDRandom() * eligibleIDs.length)]; + let vv = KDGameData.Collection[vid + ""]; + if (vv) { + let en = DialogueCreateEnemy(furn.x, furn.y, vv.type, vv.id, true); + KDSetPrisonerSpawnTemplate(en); + + let tile = KinkyDungeonTilesGet(furn.x + ',' + furn.y); + let ff = tile ? KDFurniture[tile.Furniture] : undefined; + let rest = ff ? KinkyDungeonGetRestraint( + {tags: [ff.restraintTag]}, MiniGameKinkyDungeonLevel, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, + "", + true, + false, + false, undefined, true) : undefined; + KDImprisonEnemy(en, true, "PrisonerJailOwn", rest ? { + name: rest.name, + lock: "White", + id: KinkyDungeonGetItemID(), + faction: KDDefaultNPCBindPalette, + } : undefined); + + KDSetIDFlag(en.id, "cuddleTime", 80); + } + + entity.gx = entity.x; + entity.gy = entity.y; + } else { + let pp = KinkyDungeonGetNearbyPoint(furn.x, furn.y, true, undefined, true); + if (pp) { + entity.gx = pp.x; + entity.gy = pp.y; + } + } + } + + } + + } + }, + + // If its not the same it is changed + onChangeFacility: (value, entity, fromFacility, toFacility) => {return toFacility == "CuddleLounge" ? toFacility : "LoungeReturn";}, + }, +}; diff --git a/Game/src/collection/KDCuddleLounge.ts b/Game/src/collection/KDCuddleLounge.ts new file mode 100644 index 000000000..4e0d4d24b --- /dev/null +++ b/Game/src/collection/KDCuddleLounge.ts @@ -0,0 +1,96 @@ +function KDDrawCuddleLounge(x: number, y: number, width: number): number { + let dd = 370; + if (y + dd < 940) { + let yy = y; + + yy += KDDrawServantPrisonerList("CuddleLounge", x + 50, yy + 70, width, 80); + + let rate = KDCuddleLoungeGain(); + let ii = 0; + DrawTextFitKD(TextGet("KDCuddleLounge1") + .replace("AMNT", Math.round(rate.servantPoints*10) + "") + .replace("OPN", Math.round(rate.servants*10)/10 + "") + , + x + 50, yy + 70 + 30*ii++, width-100, "#ffffff", KDTextGray0, 18, "left"); + DrawTextFitKD(TextGet("KDCuddleLounge2") + .replace("AMNT", Math.round(rate.prisonerPoints*10) + "") + .replace("OPN", Math.round(rate.prisoners*10)/10 + "") + , + x + 50, yy + 70 + 30*ii++, width-100, "#ffffff", KDTextGray0, 18, "left"); + DrawTextFitKD(TextGet("KDCuddleLoungeInfo"), + x + 50, yy + 70 + 30*ii++, width-100, "#ffffff", KDTextGray0, 18, "left"); + + } + return dd; +} + + +let KDCuddleLoungePersonalityMult = { + Servant: { + Brat: 0.75, + Sub: 0.5, + Dom: 2.0, + }, + Prisoner: { + Brat: 1.5, + Sub: 2.0, + Dom: 0.25, + }, +}; + +function KDCuddleLoungeGain(): {servants: number, prisoners: number, servantPoints: number, prisonerPoints: number} { + let data = { + servants: 0, + prisoners: 0, + servantPoints: 0, + prisonerPoints: 0, + efficiency: KDGetManagementEfficiency(), + }; + + let facility = "CuddleLounge"; + + if (KDGameData.FacilitiesData["Servants_" + facility]) + for (let servant of KDGameData.FacilitiesData["Servants_" + facility]) { + let value = KDGameData.Collection[servant + ""]; + if (value) { + let mult = data.efficiency; + let countMult = (3 / (2 + KDGameData.FacilitiesData["Servants_" + facility].length)); + let personality = ""; + if (KDIsNPCPersistent(value.id) && KDGetPersistentNPC(value.id).entity?.personality) { + personality = KDGetPersistentNPC(value.id).entity?.personality; + } + if (personality && KDCuddleLoungePersonalityMult.Servant[personality]) { + mult *= KDCuddleLoungePersonalityMult.Servant[personality]; + } + let x = (1+KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type))); + data.servants += countMult*mult * 0.1 * (0.65+0.25*x+0.125*x*x); + data.prisoners += countMult*mult *1.0 * (0.65+0.25*x+0.125*x*x); + data.servantPoints += mult * 0.1 * (0.65+0.25*x+0.125*x*x); + data.prisonerPoints += mult *1.0 * (0.65+0.25*x+0.125*x*x); + } + } + for (let servant of KDGameData.FacilitiesData["Prisoners_" + facility]) { + let value = KDGameData.Collection[servant + ""]; + if (value) { + let mult = data.efficiency; + let countMult = (6 / (5 + KDGameData.FacilitiesData["Prisoners_" + facility].length)); + let personality = ""; + if (KDIsNPCPersistent(value.id) && KDGetPersistentNPC(value.id).entity?.personality) { + personality = KDGetPersistentNPC(value.id).entity?.personality; + } + if (personality && KDCuddleLoungePersonalityMult.Prisoner[personality]) { + mult *= KDCuddleLoungePersonalityMult.Prisoner[personality]; + } + let x = (1+KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type))); + data.servants += countMult*mult * 1.0 * (0.65+0.25*x+0.125*x*x); + data.prisoners += countMult*mult *0.1 * (0.65+0.25*x+0.125*x*x); + data.servantPoints += mult * 1.0 * (0.65+0.25*x+0.125*x*x); + data.prisonerPoints += mult *0.1 * (0.65+0.25*x+0.125*x*x); + } + } + + KinkyDungeonSendEvent("calcCuddleLounge", data); + + + return data; +} \ No newline at end of file diff --git a/Game/src/collection/KDFacilities.ts b/Game/src/collection/KDFacilities.ts new file mode 100644 index 000000000..7d1a173f3 --- /dev/null +++ b/Game/src/collection/KDFacilities.ts @@ -0,0 +1,336 @@ +let FacilitiesIndex = 0; + + +interface FacilitiesData { + Recycler_Rope: number, + Recycler_Latex: number, + Recycler_Metal: number, + Recycler_Leather: number, + Recycler_Rune: number, + RecyclerInput_Rope: number, + RecyclerInput_Latex: number, + RecyclerInput_Metal: number, + RecyclerInput_Leather: number, + RecyclerInput_Rune: number, + Servants_Recycler: number[], + Prisoners_Recycler: number[], + Servants_CuddleLounge: number[], + Prisoners_CuddleLounge: number[], + Servants_Management: number[], + Servants_Warden: number[], + Warden_TightenedCount: number, +}; + +let FacilitiesDataBase : FacilitiesData = { + Recycler_Rope: 0, + Recycler_Latex: 0, + Recycler_Metal: 0, + Recycler_Leather: 0, + Recycler_Rune: 0, + RecyclerInput_Rope: 0, + RecyclerInput_Latex: 0, + RecyclerInput_Metal: 0, + RecyclerInput_Leather: 0, + RecyclerInput_Rune: 0, + + Warden_TightenedCount: 0, + + Servants_Recycler: [], + Prisoners_Recycler: [], + Servants_CuddleLounge: [], + Prisoners_CuddleLounge: [], + Servants_Management: [], + Servants_Warden: [], +}; + +function InitFacilities() { + if (!KDGameData.FacilitiesData) { + KDGameData.FacilitiesData = JSON.parse(JSON.stringify(FacilitiesDataBase)); + } else { + let data = KDGameData.FacilitiesData; + for (let entry of Object.entries(FacilitiesDataBase)) { + if (data[entry[0]] == undefined) data[entry[0]] = JSON.parse(JSON.stringify(entry[1])); + } + } +} + +let FacilityValidationTags = ["Servants", "Prisoners", "Guests"]; + +function KDValidateAllFacilities() { + for (let facility of Object.keys(KDFacilityTypes)) { + for (let tag of FacilityValidationTags) { + let servants = KDGameData.FacilitiesData[tag + "_" + facility]; + if (servants) + for (let servant of servants) { + if (!KDValidateServant(KDGameData.Collection[servant + ""], + facility, + tag)) { + servants.splice(servants.indexOf(servant), 1); + delete KDGameData.Collection[servant + ""].Facility; + } + } + } + } + + // Create the warden chest if it's not there + KDGetContainer("WardenChest", undefined, undefined, true, KDWardenChestFilters); + +} + +function KDUpdateFacilities(delta: number) { + KDValidateAllFacilities(); + let listUpdate = Object.entries(KDFacilityTypes).filter((entry) => { + return entry[1].prereq(); + }); + for (let fac of listUpdate) { + fac[1].update(delta); + } + KDSortCollection(); +} + +function KinkyDungeonDrawFacilities(xOffset = -125) { + let x = 1225 + xOffset; + + if (!KinkyDungeonFlags.get("1stSummit")) { + DrawTextFitKD(TextGet("KDFacilitiesLocked"), x, 300, 1050, "#ffffff", KDTextGray0, 24); + } else { + KDDrawFacilitiesList(xOffset); + } + + + KDDrawInventoryTabs(xOffset); +} + + +function KDValidateServant(value: KDCollectionEntry, facility: string, type: string): boolean { + type = KDFacilityCollectionDataTypeMap[type] || ""; + + if (!value) return false; + + if (value.status != type) return false; + if (value.escaped) return false; + if (KDIsInPartyID(value.id)) return false; + if (KDNPCUnavailable(value.id, value.status)) return false; + + return true; + +} + +function KDDrawFacilitiesList(xOffset) { + + let padding = 100; + let YY = 170; + let XX = 550 + 125 + xOffset; + let width = 1050; + + let listRender = Object.entries(KDFacilityTypes).filter((entry) => { + return entry[1].prereq(); + }); + + if (FacilitiesIndex >= listRender.length - 1) { + FacilitiesIndex = listRender.length - 1; + } + + let YYQuik = 50; + let XXQuik = 415; + let quikSize = 72; + let quikSpacing = 80; + let quikCols = 1; + let quikCurrentCol = 0; + if (listRender.length * quikSpacing > 900) { + quikSpacing = 40; + quikCols = 2; + quikSize = 36; + } + for (let facility of listRender) { + DrawButtonKDEx("quikFal" + facility[0], + () => { + FacilitiesIndex = listRender.findIndex((entry) => { + return entry[0] == facility[0]; + }) + return true; + }, + true, XXQuik + quikCurrentCol * quikSpacing, YYQuik, quikSize, quikSize, "", "#ffffff", + KinkyDungeonRootDirectory + "UI/Facility/" + facility[0] + ".png", undefined, false, false, + undefined, undefined, undefined, { + centered: true, + zIndex: 110, + } + + + ) + + if (facility[1].locked && facility[1].locked()) + KDDraw(kdcanvas, kdpixisprites, "facicon" + facility[0], + KinkyDungeonRootDirectory + "Locks/White.png", + XXQuik - (quikSize - 56)/2 + quikCurrentCol * quikSpacing, YYQuik - (quikSize - 56)/2, 56, 56 + ); + if (facility[1].ping) + facility[1].ping(XXQuik, YYQuik, quikCurrentCol, quikSpacing, quikSize); + + if (quikCurrentCol + 1 < quikCols) { + quikCurrentCol += 1; + } else { + quikCurrentCol = 0; + YYQuik += quikSpacing; + } + } + + + let II = 0; + let broken = false; + let rendered = 0; + for (let facility of listRender) { + if (II++ < FacilitiesIndex) { + continue; + } + let dist = facility[1].draw(XX, YY, width); + if (YY + dist > 980) { + broken = true; + break; + } + + FillRectKD(kdcanvas, kdpixisprites, "facrec" + facility[0], { + Left: XX, + Top: YY, + Width: width, + Height: dist, + Color: "#000000", + LineWidth: 1, + zIndex: -18, + alpha: 0.3 + }); + DrawRectKD(kdcanvas, kdpixisprites, "facrec2" + facility[0], { + Left: XX, + Top: YY, + Width: width, + Height: dist, + Color: "#000000", + LineWidth: 1, + zIndex: -18, + alpha: 0.9 + }); + + KDDraw(kdcanvas, kdpixisprites, "facicon" + facility[0], + KinkyDungeonRootDirectory + "UI/Facility/" + facility[0] + ".png", + XX + 1, YY - 76, 72, 72 + ); + DrawTextFitKD(TextGet("KDFacility_" + facility[0]), XX + 80, YY - 40, width - 160, "#ffffff", KDTextGray0, 32, "left"); + let yyy = 0; + for (let str of TextGet("KDFacilityDesc_" + facility[0]).split('|')) + DrawTextFitKD(str, XX + 25, YY + 16 + 22*(yyy++), width - 50, "#ffffff", KDTextGray0, 18, "left"); + + + YY += dist + padding; + rendered ++; + } + + if (FacilitiesIndex > 0 || broken) { + DrawButtonKDEx("facUp", (b) => { + FacilitiesIndex -= 1; + return true; + }, FacilitiesIndex > 0, 1650, 110, 150, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Up.png", + undefined, undefined, !(FacilitiesIndex > 0), KDButtonColor, undefined, undefined, { + centered: true, + hotkey: KDHotkeyToText(KinkyDungeonKey[0]), + hotkeyPress: KinkyDungeonKey[0], + }); + DrawButtonKDEx("facDown", (b) => { + FacilitiesIndex += 1; + return true; + }, broken, 1650, 850, 150, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Down.png", + undefined, undefined, !broken, KDButtonColor, undefined, undefined, { + centered: true, + hotkey: KDHotkeyToText(KinkyDungeonKey[2]), + hotkeyPress: KinkyDungeonKey[2], + }); + } + + if (FacilitiesIndex > 0 || broken) { + KDDraw(kdcanvas, kdpixisprites, "facScrollBar", + KinkyDungeonRootDirectory + "UI/Checked.png", + 1695, 175 + 590*(FacilitiesIndex/Math.max(1, listRender.length - rendered)), 60, 60 + ); + } +} + +function KDGetServantEnemy(servant: KDCollectionEntry): enemy { + if (servant && servant.status == "Servant") { + return servant.Enemy || KinkyDungeonGetEnemyByName(servant.type); + } + return null; +} + +let KDFacilityCollectionCallback: (id: number) => boolean = null; + +function KDDrawServantPrisonerList(facility: string, x: number, y: number, width: number, spacing: number = 110, + setCallback?: (id: number) => boolean) : number { + let yy = 0; + + let fac = KDFacilityTypes[facility]; + if (fac) { + let ms = fac.maxServants(); + let mp = fac.maxPrisoners(); + let w = 72; + if (ms > 0) { + DrawTextFitKD(TextGet("KDServants") + ": ", x + width/2 - (spacing * (ms - 1) + w)/2 - 5, y + yy + 36, + 500, "#ffffff", KDTextGray0, 24, "right"); + let servants = KDGameData.FacilitiesData["Servants_" + facility]; + for (let i = 0; i < ms; i++) { + let servant = servants[i]; + DrawButtonKDEx(facility + "serv" + i, (b) => { + KDCurrentFacilityTarget = facility; + KDCurrentFacilityCollectionType = ["Servants", "Prisoners"]; + KinkyDungeonDrawState = "Collection"; + if (KDNPCChar.get(servant)) + KDRefreshCharacter.set(KDNPCChar.get(servant), true); + KDCollectionTab = ""; + KDCollectionSelected = servant; + KDResetCollectionUI(); + KDFacilityCollectionCallback = setCallback; + return true; + }, true, x + width/2 - (spacing * (ms - 1) + w)/2 + i * spacing, y + yy, w, w, "", "#ffffff", KDCollectionImage(servant), + undefined, undefined, !servant, KDButtonColor, undefined, undefined, { + centered: true, + }); + } + + yy += 100; + } + if (mp > 0) { + DrawTextFitKD(TextGet("KDPrisoners") + ": ", x + width/2 - (spacing * (mp - 1) + w)/2 - 5, y + yy + 36, + 500, "#ffffff", KDTextGray0, 24, "right"); + let prisoners = KDGameData.FacilitiesData["Prisoners_" + facility]; + for (let i = 0; i < mp; i++) { + let prisoner = prisoners[i]; + DrawButtonKDEx(facility + "pris" + i, (b) => { + KDCurrentFacilityTarget = facility; + KDCurrentFacilityCollectionType = ["Servants", "Prisoners"]; + KinkyDungeonDrawState = "Collection"; + if (KDNPCChar.get(prisoner)) + KDRefreshCharacter.set(KDNPCChar.get(prisoner), true); + KDCollectionTab = ""; + KDCollectionSelected = prisoner; + KDResetCollectionUI(); + KDFacilityCollectionCallback = setCallback; + return true; + }, true, x + width/2 - (spacing * (mp - 1) + w)/2 + i * spacing, y + yy, w, w, "", "#ffffff", KDCollectionImage(prisoner), + undefined, undefined, !prisoner, KDButtonColor, undefined, undefined, { + centered: true, + }); + if (KDGameData.Collection["" + prisoner]?.escapegrace) { + KDDraw(kdcanvas, kdpixisprites, facility + "pris" + i + "escgrc", + KinkyDungeonRootDirectory + "UI/escapegrace.png", + x + width/2 - (spacing * (mp - 1) + w)/2 + i * spacing + w/2, y + yy + w/2, w/2, w/2, undefined, { + zIndex: 110, + } + ); + } + } + + yy += 110; + } + } + + return yy; +} \ No newline at end of file diff --git a/Game/src/collection/KDFacilitiesList.ts b/Game/src/collection/KDFacilitiesList.ts new file mode 100644 index 000000000..97dccb3c5 --- /dev/null +++ b/Game/src/collection/KDFacilitiesList.ts @@ -0,0 +1,210 @@ + +interface Facility { + /** Returns the height of the box to render */ + draw: (x: number, y: number, wdith: number) => number, + update: (delta: number) => boolean, + priority: number, + prereq: () => boolean, + locked?: () => boolean, + /** Can draw a ping or anything really, on the quick bar. Good for notifications */ + ping?: (XXQuik: number, YYQuik: number, quikCurrentCol: number, quikSpacing: number, quikSize: number) => void, + goldCost: () => number, + maxPrisoners: () => number, + maxServants: () => number, + events?: KinkyDungeonEvent[], + defaultData: Record, + servantPrisonerCallback?: (number) => boolean, +}; + +let KDFacilityTypes: Record = { + Management: { + priority: -100, + update: (delta) => { + return false; + }, + draw: (x, y, width) => { + return KDDrawManagement(x, y, width); + }, + prereq: () => {return true;}, + goldCost: () => {return 0;}, + maxPrisoners: () => {return 0;}, + maxServants: () => {return 3;}, + defaultData: {}, + ping: (XXQuik: number, YYQuik: number, quikCurrentCol: number, quikSpacing: number, quikSize: number) => { + let facility = "Management"; + DrawTextFitKD((KDGameData.FacilitiesData["Servants_" + facility]?.length || 0) + "", + XXQuik + quikCurrentCol * quikSpacing, YYQuik + 9, quikSize * 0.8, "#ffffff", KDTextGray0, + 18, "left", 111 + ); + }, + servantPrisonerCallback: (id) => { + KinkyDungeonSetFlag("manageEfficiencyLoss", -1, 1); + return true; + } + }, + + CuddleLounge: { + priority: -50, + update: (delta) => { + let rate = KDCuddleLoungeGain(); + let facility = "CuddleLounge"; + for (let servant of KDGameData.FacilitiesData["Servants_" + facility]) { + let value = KDGameData.Collection[servant + ""]; + if (value) { + KDAddOpinionPersistent(value.id, rate.servants); + } + } + for (let prisoner of KDGameData.FacilitiesData["Prisoners_" + facility]) { + let value = KDGameData.Collection[prisoner + ""]; + if (value) { + KDAddOpinionPersistent(value.id, rate.prisoners); + } + } + + return false; + }, + + ping: (XXQuik: number, YYQuik: number, quikCurrentCol: number, quikSpacing: number, quikSize: number) => { + let facility = "CuddleLounge"; + DrawTextFitKD( + (KDGameData.FacilitiesData["Servants_" + facility]?.length || 0) + + " + " + + (KDGameData.FacilitiesData["Prisoners_" + facility]?.length || 0), + XXQuik + quikCurrentCol * quikSpacing, YYQuik + 9, quikSize * 0.8, "#ffffff", KDTextGray0, + 18, "left", 111 + ); + }, + draw: (x, y, width) => { + + return KDDrawCuddleLounge(x, y, width); + }, + prereq: () => {return true;}, + goldCost: () => {return 0;}, + maxPrisoners: () => {return 8;}, + maxServants: () => {return 8;}, + defaultData: {}, + }, + Warden: { + priority: 0, + update: (delta) => { + KDUpdateWarden(delta); + return false; + }, + draw: (x, y, width) => { + return KDDrawWarden(x, y, width); + }, + prereq: () => {return true;}, + goldCost: () => {return 0;}, + maxPrisoners: () => {return 0;}, + maxServants: () => {return 1;}, + defaultData: {}, + ping: (XXQuik: number, YYQuik: number, quikCurrentCol: number, quikSpacing: number, quikSize: number) => { + let facility = "Warden"; + DrawTextFitKD((KDGameData.FacilitiesData["Servants_" + facility]?.length || 0) + "", + XXQuik + quikCurrentCol * quikSpacing, YYQuik + 9, quikSize * 0.8, "#ffffff", KDTextGray0, + 18, "left", 111 + ); + }, + }, + Recycler: { + priority: 30, + update: (delta) => { + if (delta > 0) { + let resources = KDGetRecyclerRate(KDGameData.FacilitiesData.Servants_Recycler); + for (let entry of Object.entries(resources)) { + KDGameData.FacilitiesData["Recycler_" + entry[0]] = Math.round(KDGameData.FacilitiesData["Recycler_" + entry[0]] + entry[1]); + KDGameData.FacilitiesData["RecyclerInput_" + entry[0]] = Math.round(KDGameData.FacilitiesData["RecyclerInput_" + entry[0]] - entry[1]); + } + } + + return false; + }, + + ping: (XXQuik: number, YYQuik: number, quikCurrentCol: number, quikSpacing: number, quikSize: number) => { + let rates = KDGetRecyclerRate(KDGameData.FacilitiesData.Servants_Recycler); + let notIdle = false; + for (let resource of Object.values(rates)) { + if (resource > 0) { + notIdle = true; + break; + } + } + if (!notIdle) { + DrawTextFitKD( + TextGet("Idle"), + XXQuik + quikCurrentCol * quikSpacing, YYQuik + 6, quikSize, "#ffffff", KDTextGray0, + 12, "left", 111 + ); + } + + }, + + draw: (x, y, width) => { + + return KDDrawRecycler(x, y, width); + }, + prereq: () => {return true;}, + goldCost: () => {return 0;}, + maxPrisoners: () => {return 0;}, + maxServants: () => {return 3;}, + defaultData: {}, + }, + /*AlchemyLab: { + priority: 50, + update: (delta) => { + return false; + }, + + draw: (x, y, width) => { + let dd = 100; + if (y + dd < 940) { + + } + return dd; + }, + prereq: () => {return true;}, + goldCost: () => {return 0;}, + maxPrisoners: () => {return 0;}, + maxServants: () => {return 3;}, + defaultData: {}, + }, + + TrainingDojo: { + priority: 10, + update: (delta) => { + return false; + }, + + draw: (x, y, width) => { + let dd = 100; + if (y + dd < 940) { + + } + return dd; + }, + prereq: () => {return true;}, + goldCost: () => {return 0;}, + maxPrisoners: () => {return 0;}, + maxServants: () => {return 3;}, + defaultData: {}, + }, + RescueTeam: { + priority: 10, + update: (delta) => { + return false; + }, + + draw: (x, y, width) => { + let dd = 100; + if (y + dd < 940) { + + } + return dd; + }, + prereq: () => {return true;}, + goldCost: () => {return 0;}, + maxPrisoners: () => {return 0;}, + maxServants: () => {return 3;}, + defaultData: {}, + },*/ +}; \ No newline at end of file diff --git a/Game/src/collection/KDFacilityQuick.ts b/Game/src/collection/KDFacilityQuick.ts new file mode 100644 index 000000000..2908d6b20 --- /dev/null +++ b/Game/src/collection/KDFacilityQuick.ts @@ -0,0 +1,118 @@ + +let KDCollQuickFacSpacing = 90; +let KDCollQuickFacSize = KDCollQuickFacSpacing - 10; + +KDCollectionTabDraw.FacilityQuick = (value, buttonSpacing, III, x, y) => { + + let listRender = Object.entries(KDFacilityTypes).filter((entry) => { + return entry[1].prereq(); + }); + + let quikSize = KDCollQuickFacSize; + let quikSpacing = KDCollQuickFacSpacing; + let quikCols = 450 / quikSpacing; + let quickStartingCol = -Math.ceil(listRender.length / quikCols); + + let XX = 0; + let YY = 0; + + let ii = 0; + + + + for (let fac of listRender) { + let assigned = value.Facility == fac[0]; + let valid = KDCurrentFacilityCollectionType.some((type) => { + return KDFacilityCollectionDataTypeMap[type] == value.status; + }) && KDCurrentFacilityCollectionType.some((type) => { + return KDValidateServant(value, fac[0], type); + }); + + + let collType = valid ? KDCurrentFacilityCollectionType.find((type) => { + return KDFacilityCollectionDataTypeMap[type] == value.status; + }) : ""; + + + let allowed = false; + if (KDGameData.Collection[value.id + ""] && fac[0]) { + let dd = KDGameData.FacilitiesData[collType + "_" + fac[0]]; + let faci = KDFacilityTypes[fac[0]]; + if (dd && faci + && faci["max" + collType] + && (assigned + || dd.length < faci["max" + collType]() + )) { + allowed = true + } + } + + + if (assigned) { + KDDraw(kdcanvas, kdpixisprites, "facXQuikAssign" + fac[0], + KinkyDungeonRootDirectory + `UI/Facility_${"X"}.png`, + x + 10 + quikSpacing*XX, y + 730 - 10 + quikSpacing * (quickStartingCol + YY), quikSize, quikSize, + undefined, { + zIndex: 160, + } + ); + } + if (DrawButtonKDEx("facQuickAssign" + fac[0], (b) => { + if (!valid) return false; + if (!allowed) return false; + let oldFacility = value.Facility; + + if (oldFacility) { + let listRender = Object.entries(KDFacilityTypes).filter((entry) => { + return entry[1].prereq(); + }); + for (let f of listRender) { + for (let dt of KDFacilityCollectionDataTypes) { + let data: number[] = KDGameData.FacilitiesData[dt + "_" + f[0]]; + if (data?.includes(value.id)) { + //delete value.Facility; + data.splice(data.indexOf(value.id), 1); + break; + } + } + } + // Failsafe + delete value.Facility; + } + if (!assigned) { + let data = KDGameData.FacilitiesData[collType + "_" + fac[0]]; + if (data && (!KDFacilityTypes[fac[0]].servantPrisonerCallback || KDFacilityTypes[fac[0]].servantPrisonerCallback(value.id))) { + data.push(value.id); + value.Facility = fac[0]; + } + } + + KDValidateAllFacilities(); + + + return true; + }, true, x + 10 + quikSpacing*XX++, y + 730 - 10 + quikSpacing * (quickStartingCol + YY), quikSize, quikSize, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/Facility/" + fac[0] + ".png", + undefined, undefined, !allowed, + KDButtonColor, undefined, undefined, { + hotkey: ii < KinkyDungeonKeySpell.length ? KDHotkeyToText(KinkyDungeonKeySpell[ii]) : undefined, + hotkeyPress: ii < KinkyDungeonKeySpell.length ? KinkyDungeonKeySpell[ii] : undefined, + scaleImage: true, + centered: true, + })) { + DrawTextFitKD(TextGet(`KDCollection${(!allowed) ? (KDIsInPartyID(value.id) ? "CantParty" : "Cant") : (assigned ? "Remove" : "Assign")}`) + TextGet("KDFacility_" + (assigned ? value.Facility : fac[0])), + x + 220, y + 750, 500, "#ffffff", KDTextGray0); + } + ii++; + + if (XX >= quikCols) { + YY++; + XX = 0; + } + } + + + KDCurrentFacilityCollectionType = ["Servants", "Prisoners"]; + + return III; +}; \ No newline at end of file diff --git a/Game/src/collection/KDManagement.ts b/Game/src/collection/KDManagement.ts new file mode 100644 index 000000000..621529eb2 --- /dev/null +++ b/Game/src/collection/KDManagement.ts @@ -0,0 +1,43 @@ +function KDDrawManagement(x: number, y: number, width: number): number { + let dd = 215; + if (y + dd < 940) { + let yy = y; + + yy += KDDrawServantPrisonerList("Management", x + 50, yy + 70, width, 80, + KDFacilityTypes.Management.servantPrisonerCallback); + + let rate = KDGetManagementEfficiency(); + let ii = 0; + //DrawTextFitKD(TextGet("KDManagement1"), + // x + 50, yy + 80 + 30*ii++, width-100, "#ffffff", KDTextGray0, 18, "left"); + DrawTextFitKD(TextGet("KDManagement2") + .replace("AMNT", (rate > 0 ? "+" : "") + Math.round((rate - 1)*100) + ""), + x + 50, yy + 80 + 30*ii++, width-100, "#ffffff", KDTextGray0, 18, "left"); + + + } + return dd; +} + +/** Gets the efficiency bonus */ +function KDGetManagementEfficiency(): number { + let data = { + efficiency: 1, + gainMult: KinkyDungeonFlags.get("manageEfficiencyLoss") ? 0 : 1 + }; + + let facility = "Management"; + + if (KDGameData.FacilitiesData["Servants_" + facility]) + for (let servant of KDGameData.FacilitiesData["Servants_" + facility]) { + let value = KDGameData.Collection[servant + ""]; + if (value) { + let mult = data.efficiency; + let x = (1+KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type))); + data.efficiency += mult * 0.1 * (0.65+0.25*x+0.125*x*x); + } + } + KinkyDungeonSendEvent("calcManagement", data); + + return data.efficiency; +} \ No newline at end of file diff --git a/Game/src/collection/KDRecycler.ts b/Game/src/collection/KDRecycler.ts new file mode 100644 index 000000000..ebae6253e --- /dev/null +++ b/Game/src/collection/KDRecycler.ts @@ -0,0 +1,507 @@ +let KDSelectedRecyclerCategory = "Null"; +let KDSelectedRecyclerItem = ""; +let KDRecyclerCatsPerRow = 4; +let KDRecyclerItemsPerRow = 4; +let KDRecyclerCatSpacing = 80; + +interface RecyclerResource { + /** Number is base yield, minimum 1 */ + Yield: number, + /** Processed per floor, per servant */ + Rate: number, +} + +let RecyclerResources: Record = { + Rope: { + Yield: 20, + Rate: 400, + }, + Leather: { + Yield: 12, + Rate: 150, + }, + Metal: { + Yield: 5, + Rate: 100, + }, + Latex: { + Yield: 12, + Rate: 200, + }, + Rune: { + Yield: 0.0001, + Rate: 10, + }, +} + +interface RecyclerOutputs { + Rope: number, + Leather: number, + Metal: number, + Latex: number, + Rune: number, +} + +function KDBaseRecycleOutputs(): RecyclerOutputs { + return { + Latex: 0, + Metal: 0, + Rune: 0, + Leather: 0, + Rope: 0, + }; +} + + + +function KDGetRecyclerRate(Servants: number[]): Record { + let output = {}; + let mult = 0.4 * KDGetManagementEfficiency()**2; + for (let id of Servants) { + let servant = KDGetServantEnemy(KDGameData.Collection["" + id]); + if (servant) { + mult += 0.8 + KDEnemyTypeRank(servant); + } + } + for (let resource of Object.keys(RecyclerResources)) { + let resourceInput = KDGameData.FacilitiesData["RecyclerInput_" + resource]; + let resourceRate = Math.min(resourceInput, mult * RecyclerResources[resource].Rate); + output[resource] = Math.ceil(resourceRate); + } + return output; +} + +function KDRecycleItem(item: item, count: number = 0) : RecyclerOutputs { + let outputs: RecyclerOutputs = KDBaseRecycleOutputs(); + + let type = KDRestraint(item); + let variant = KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]; + let res = KDRecyclerResources(type, 1, variant ? (item.inventoryVariant || item.name) : undefined) + + for (let entry of Object.entries(res)) { + outputs[entry[0]] = (count || 1) * entry[1]; + } + + if (count > 0) { + for (let i = 0; i < count; i++) { + if (KinkyDungeonInventoryGetSafe(item.inventoryVariant || item.name)) { + let inv = KinkyDungeonInventoryGetSafe(item.inventoryVariant || item.name); + if (inv.quantity > 1) { + inv.quantity -= 1; + } else { + KinkyDungeonInventoryRemoveSafe(inv); + } + } + } + } + + return outputs; +} + +function KDChangeRecyclerInput(amount: RecyclerOutputs, mult: number = 1) { + for (let entry of Object.entries(amount)) { + KDGameData.FacilitiesData["RecyclerInput_" + entry[0]] = Math.max(0, + KDGameData.FacilitiesData["RecyclerInput_" + entry[0]] + entry[1] * mult + ); + } +} +function KDChangeRecyclerResources(amount: RecyclerOutputs, mult: number = 1) { + for (let entry of Object.entries(amount)) { + KDGameData.FacilitiesData["Recycler_" + entry[0]] = Math.max(0, + KDGameData.FacilitiesData["Recycler_" + entry[0]] + entry[1] * mult + ); + } +} +function KDHasRecyclerResources(amount: RecyclerOutputs, mult: number = 1) { + for (let entry of Object.entries(amount)) { + if (entry[1] > 0 && KDGameData.FacilitiesData["Recycler_" + entry[0]] < entry[1] * mult) return false; + } + return true; +} +function KDHasRecyclerInput(amount: RecyclerOutputs) { + for (let entry of Object.entries(amount)) { + if (entry[1] > 0 && KDGameData.FacilitiesData["RecyclerInput_" + entry[0]] < entry[1]) return false; + } + return true; +} + +function KDRecycleString(item: item, quantity: number) : string { + let temp = ""; + let outputs = KDRecycleItem(item, 0); + + for (let output of Object.entries(outputs)) { + if (output[1] > 0) { + let str = Math.round(quantity * output[1]) + TextGet("KDRecycleOutput_" + output[0]); + if (temp.length > 0) temp = temp + ""; + temp = temp + str; + } + } + + return temp; +} + + +function KDDrawRecycler(x: number, y: number, width: number): number { + let dd = KDMapData.RoomType == "Summit" ? 400 : 300; + let cats = KDListRecyclerCats(); + if (KDMapData.RoomType == "Summit") { + dd += 125 + 3 * KDRecyclerCatSpacing; + } + if (y + dd < 940) { + let rID = 0; + let res = Object.keys(RecyclerResources); + let spacing = 180 * 5 / res.length; + let rates = KDGetRecyclerRate(KDGameData.FacilitiesData.Servants_Recycler); + let yy = y; + + yy += KDDrawServantPrisonerList("Recycler", x - 200, yy + 70, width); + + DrawRectKD(kdcanvas, kdpixisprites, "rec_res_rect", { + Left: x + 25, + Top: yy + 54, + Height: 72 + 20, + Width: width - 50, + Color: KDUIColorHighlight, + LineWidth: 1, + zIndex: -10, + }); + for (let resource of res) { + KDDraw(kdcanvas, kdpixisprites, "fac_rec_res_" + resource, + KinkyDungeonRootDirectory + "UI/Resource/" + resource + ".png", + x + 560 - spacing*0.5*res.length + (spacing * rID), yy + 60, 72, 72 + ); + DrawTextFitKD(Math.floor(KDGameData.FacilitiesData["Recycler_" + resource] || 0) + "", + x + 560 + 70 - spacing*0.5*res.length + (spacing * rID), yy + 86, spacing - 80, "#ffffff", KDTextGray0, 32, "left"); + DrawTextFitKD("+" + rates[resource] + ` (${Math.floor(KDGameData.FacilitiesData["RecyclerInput_" + resource] || 0)})`, + x + 560 + 70 - spacing*0.5*res.length + (spacing * rID), yy + 86 + 32, spacing - 80, rates[resource] > 0 ? "#ffffff" : "#aaaaaa", KDTextGray0, 18, "left"); + rID++; + } + + if (KDMapData.RoomType == "Summit" || KDMapData.RoomType == "PerkRoom") { + DrawButtonKDEx( + "recycleButton", + () => { + KinkyDungeonSendTextMessage(10, KDRecycleResourceString(true, "RecyclerInput_"), "#ffffff", 2); + KinkyDungeonSendTextMessage(10, KDRecycleResourceString(true, "Recycler_"), "#ffffff", 2); + KDGameData.InventoryAction = "Recycle"; + KinkyDungeonDrawState = "Inventory"; + KinkyDungeonCurrentFilter = LooseRestraint; + return true; + }, KDMapData.RoomType == "Summit", + x + width/2 + 150, y + 62, 300, 80, TextGet("KDRecycleButton"), + "#ffffff", KinkyDungeonRootDirectory + 'InventoryAction/Recycle.png', + undefined, false, true, KDButtonColor, undefined, true + ); + //yy += 150; + yy += 180; + KDDrawRecyclerBlueprints(cats, x, yy, width); + } else { + yy += 240; + DrawTextFitKD(TextGet("KDFacilityLocal2"), x + 560, y + 280, 1050 - 160, "#ffffff", KDTextGray0, 32, "center"); + } + + } + return dd; +} + +function KDDrawRecyclerBlueprints(cats: KDBlueprintCategory[], x: number, y: number, width: number) { + let XX = 0; + let YY = 0; + let colCounter = 0; + let index = 0; + let selectedcat: KDBlueprintCategory = null; + if (KDSelectedRecyclerCategory == "Null" && cats[0]) + KDSelectedRecyclerCategory = cats[0].name; + let iin = index; + for (let cat of cats) { + let selected = cat.name == KDSelectedRecyclerCategory; + if (selected) selectedcat = cat; + let hotkey: string = ""; + if (cats[index+1]?.name == KDSelectedRecyclerCategory) { + hotkey = KinkyDungeonKey[1]; + } else + if (cats[index-1]?.name == KDSelectedRecyclerCategory) { + hotkey = KinkyDungeonKey[3]; + } + if (KDSelectedRecyclerCategory == cat.name) iin = index; + DrawButtonKDExScroll( + "rec_cat_list" + cat.name, + (amount: number) => { + if (amount < 0) { + if (cats[iin-1]) { + KDSelectedRecyclerCategory = cats[iin-1].name; + } + } else { + if (cats[iin+1]) { + KDSelectedRecyclerCategory = cats[iin+1].name; + } + } + }, + () => { + if (KDSelectedRecyclerCategory != cat.name && cat.items[0]) { + KDSelectedRecyclerCategory = cat.name; + KDSelectedRecyclerItem = cat.items[0].name; + } else if (KDSelectedRecyclerCategory == cat.name) KDSelectedRecyclerCategory = ""; + return true; + }, KDMapData.RoomType == "Summit", + + x + XX + 32, y + YY, 72, 72, "", + "#ffffff", KinkyDungeonRootDirectory + "UI/Recycler/" + cat.name + ".png", + undefined, false, !selected, KDButtonColor, undefined, true, + { + scaleImage: true, + centered: true, + hotkey: hotkey ? KDHotkeyToText(hotkey) : undefined, + hotkeyPress: hotkey, + } + ); + colCounter++; + if (colCounter >= KDRecyclerCatsPerRow) { + colCounter = 0; + XX = 0; + YY += KDRecyclerCatSpacing; + } else { + XX += KDRecyclerCatSpacing; + } + index++; + } + + YY = 0; + colCounter = 0; + let secondXX = KDRecyclerCatSpacing * (KDRecyclerCatsPerRow + 0.5); + let thirdXX = secondXX + KDRecyclerCatSpacing * (KDRecyclerItemsPerRow + 0.5); + XX = secondXX; + let selectedItem: KDBlueprint = null; + + if (selectedcat) { + index = 0; + let items = selectedcat.items; + let ii = index; + for (let item of items) { + if (item.prereq && !item.prereq()) continue; + let img = (item.type == Restraint || item.type == LooseRestraint) ? + KDGetRestraintPreviewImage(KDRestraint({name: item.item})) + : KinkyDungeonRootDirectory + "Items/" + item.item + ".png"; + + let grp = (item.type == Restraint || item.type == LooseRestraint) ? + KDGetGroupPreviewImage(KDRestraint({name: item.item}).Group) + : ""; + + let selected = item.name == KDSelectedRecyclerItem; + if (selected) selectedItem = item; + let hotkey: string = ""; + if (items[index+1]?.name == KDSelectedRecyclerItem) { + hotkey = KinkyDungeonKey[6]; + } else + if (items[index-1]?.name == KDSelectedRecyclerItem) { + hotkey = KinkyDungeonKey[7]; + } + let inventoryItem = KinkyDungeonInventoryGetSafe(item.name); + if (inventoryItem) + DrawTextFitKD("" + (inventoryItem.quantity || 1), + x + XX + 32, y + YY + 60, 72, "#ffffff", KDTextGray0, 18, "left", 160); + if (KDSelectedRecyclerItem == item.name) ii = index; + DrawButtonKDExScroll( + "rec_item_list" + item.name, + (amount: number) => { + if (amount < 0) { + if (items[ii-1]) { + KDSelectedRecyclerItem = items[ii-1].name; + } + } else { + if (items[ii+1]) { + KDSelectedRecyclerItem = items[ii+1].name; + } + } + }, + () => { + if (KDSelectedRecyclerItem != item.name) + KDSelectedRecyclerItem = item.name; + else KDSelectedRecyclerItem = ""; + return true; + }, KDMapData.RoomType == "Summit", + + x + XX + 32, y + YY, 72, 72, "", + "#ffffff", img, + undefined, false, !selected, KDButtonColor, undefined, true, + { + scaleImage: true, + centered: true, + hotkey: hotkey ? KDHotkeyToText(hotkey) : undefined, + hotkeyPress: hotkey, + } + ); + + if (grp) { + KDDraw(kdcanvas, kdpixisprites, "rec_item_list_grp" + item.name, + grp, + x + XX + 32, y + YY, 72, 72 + ); + } + colCounter++; + if (colCounter >= KDRecyclerItemsPerRow) { + colCounter = 0; + XX = secondXX; + YY += KDRecyclerCatSpacing; + } else { + XX += KDRecyclerCatSpacing; + } + index++; + } + + } + YY = 0; + XX = thirdXX; + if (selectedItem) { + let img = (selectedItem.type == Restraint || selectedItem.type == LooseRestraint) ? + KDGetRestraintPreviewImage(KDRestraint({name: selectedItem.item})) + : KinkyDungeonRootDirectory + "Items/" + selectedItem.item + ".png"; + let grp = (selectedItem.type == Restraint || selectedItem.type == LooseRestraint) ? + KDGetGroupPreviewImage(KDRestraint({name: selectedItem.item}).Group) + : ""; + + let hotkey = KinkyDungeonKeyEnter[0]; + let canAfford = KDHasRecyclerResources(KDMapToRecycleOutputs(selectedItem.recyclecost)); + let inventoryItem = KinkyDungeonInventoryGetSafe(selectedItem.name); + DrawTextFitKD(TextGet("KDOwned").replace("AMNT", "" + (inventoryItem ? (inventoryItem.quantity || 1) : 0)), + x + XX + 32 + 100, y + YY + 180, 200, "#ffffff", KDTextGray0, 18, "center", 160); + DrawButtonKDEx( + "rec_item_build" + selectedItem.name, + () => { + KDSendInput("recycleBuild", { + selectedItem: selectedItem, + }); + return true; + }, KDMapData.RoomType == "Summit", + + x + XX + 32, y + YY, 200, 200, "", + "#ffffff", img, + undefined, false, !canAfford, KDButtonColor, undefined, true, + { + scaleImage: true, + centered: true, + hotkey: hotkey ? KDHotkeyToText(hotkey) : undefined, + hotkeyPress: hotkey, + } + ); + + let resCenter = x + XX + 32 + 100; + let res = Object.entries(selectedItem.recyclecost); + for (let i = 0; i < res.length; i++) { + let xxx = resCenter - res.length / 2 * 52 + 52 * i; + let resource = res[i][0]; + KDDraw(kdcanvas, kdpixisprites, "fac_item_res_" + resource, + KinkyDungeonRootDirectory + "UI/Resource/" + resource + ".png", + xxx, y + YY + 212, 36, 36 + ); + DrawTextFitKD(Math.ceil(res[i][1]) + "", + xxx + 3, y + YY + 212 + 18, 80, "#ffffff", KDTextGray0, 18, "right"); + } + DrawTextFitKD(KDGetItemNameString(selectedItem.item) + (selectedItem.count ? " x" + selectedItem.count : ""), + x + XX + 32 + 100, y + YY + 272, 200, "#ffffff", KDTextGray0, 24, "center"); + let item = KDItemNoRestraint({name: selectedItem.name}); + let restraint = KDRestraint({name: selectedItem.name}); + if (restraint) { + let pp = (restraint.displayPower != undefined ? restraint.displayPower : restraint.power); + pp /= 5; // inflection point between 8 (mythic) and 9 (angelic) should be around 47 power + DrawTextFitKD( + TextGet("KinkyDungeonRestraintLevel") + .replace("RestraintLevel", "" + Math.max(1, restraint.displayPower != undefined ? restraint.displayPower : restraint.power)) + .replace("Rarity", TextGet("KinkyDungeonRarity" + Math.max(0, Math.min(Math.floor(pp),10)))), + x + XX + 32 + 100, y + YY + 300, 200, "#ffffff", KDTextGray0, 18, "center"); + } else if (item) + DrawTextFitKD( + TextGet("KinkyDungeonRestraintLevel") + .replace("RestraintLevel", "" + Math.max(1, item.rarity)) + .replace("Rarity", TextGet("KinkyDungeonRarity" + Math.max(0, Math.min(Math.floor(item.rarity),10)))), + x + XX + 32 + 100, y + YY + 300, 200, "#ffffff", KDTextGray0, 18, "center"); + } +} + +function KDListRecyclerCats(): KDBlueprintCategory[] { + let list = []; + for (let cat of Object.values(KDRecyclerCategories)) { + if (cat.prereq()) { + list.push(cat); + } + } + return list; +} + +function KDMapToRecycleOutputs(amount: Record): RecyclerOutputs { + let outputs : RecyclerOutputs = KDBaseRecycleOutputs(); + + for (let entry of Object.entries(amount)) { + outputs[entry[0]] = entry[1]; + } + + return outputs; +} + +function KDRecyclerResources(restraint: restraint, mult: number = 1.4, variant?: string): Record { + mult *= 1 + Math.max(0, restraint.power * 0.1); + let res: Record = {}; + if (variant) { + // TODO add an actual event + res.Rune = (res.Rune || 0) + Math.ceil(RecyclerResources.Rune.Yield * mult); + } + + if (restraint.recycleresource) { + for (let resource of Object.entries(restraint.recycleresource)) { + res[resource[0]] = (res[resource[0]] || 0) + Math.ceil(resource[1]); + } + } else { + for (let shrine of restraint.shrine) { + if (RecyclerResources[shrine]) { + res[shrine] = (res[shrine] || 0) + Math.ceil(RecyclerResources[shrine].Yield * mult); + } + } + } + return res; +} + +function KDAutoGenRestraintBlueprint(name: string, category: string, applyvariant: string, mult: number = 1.25, forceResourceCost?: Record, bonusResource?: Record, count: number = 1): KDBlueprint { + let res = forceResourceCost || {}; + let restraint = KDRestraint({name: name}); + + if (!forceResourceCost) { + res = KDRecyclerResources(restraint, mult, applyvariant); + } + + if (mult != 1) { + for (let r of Object.entries(res)) { + res[r[0]] = Math.round(mult * r[1]); + } + } + + if (bonusResource) { + for (let r of Object.entries(bonusResource)) { + res[r[0]] = Math.round((res[r[0]] || 0) + r[1]); + } + } + + return { + name: restraint.name, + item: restraint.name, + type: Restraint, + applyvariant: applyvariant, + recyclecategory: category, + recyclecost: res, + count: count, + prereq: () => {return true;}, + }; +} + +function KDRecycleResourceString(allowZero: boolean = false, prefix: string = "Recycler_", noLabel = false): string { + let str = ""; + for (let restype of Object.keys(RecyclerResources)) { + let amount = KDGameData.FacilitiesData[prefix + restype]; + if (amount != undefined && (allowZero || amount)) { + if (str) str = str + ' '; + str = str + `(${TextGet("KDRecycleResource_" + restype)}: ${Math.round(amount)})`; + } + } + if (!noLabel) + str = TextGet("RecycleResStrIntro" + prefix) + str; + return str; +} \ No newline at end of file diff --git a/Game/src/collection/KDRecyclerList.ts b/Game/src/collection/KDRecyclerList.ts new file mode 100644 index 000000000..e1a93809e --- /dev/null +++ b/Game/src/collection/KDRecyclerList.ts @@ -0,0 +1,656 @@ +interface KDBlueprint { + name: string, + item: string, + type: string, + applyvariant?: string, + recyclecost?: Record, + count?: number, + recyclecategory?: string, + prereq: () => boolean, +} +interface KDBlueprintCategory { + name: string, + prereq: () => boolean, + items: KDBlueprint[], +} + +KinkyDungeonRefreshRestraintsCache(); + +let KDRecyclerCategories: Record = { + Armor: { + name: "Armor", + prereq: () => {return true;}, + items: [ + KDAutoGenRestraintBlueprint("MageArmor", "Armor", "", 1, {Rope: 50, Rune: 5}), + KDAutoGenRestraintBlueprint("MagicArmbands", "Armor", "", 1, {Metal: 30, Rune: 2}), + KDAutoGenRestraintBlueprint("SteelSkirt", "Armor", "", 1, {Metal: 150}), + KDAutoGenRestraintBlueprint("SteelSkirt2", "Armor", "", 1, {Metal: 100}), + KDAutoGenRestraintBlueprint("ChainTunic", "Armor", "", 1, {Metal: 200}), + KDAutoGenRestraintBlueprint("ChainBikini", "Armor", "", 1, {Metal: 150}), + KDAutoGenRestraintBlueprint("SteelArmor", "Armor", "", 1, {Metal: 300}), + KDAutoGenRestraintBlueprint("Swimsuit", "Armor", "", 1, {Latex: 250}), + + KDAutoGenRestraintBlueprint("GagNecklace", "Armor", "", 1, {Latex: 15}), + ] + }, + Leather: { + name: "Leather", + prereq: () => {return true;}, + items: [ + KDAutoGenRestraintBlueprint("TrapArmbinder", "Leather", "", undefined, undefined, {Metal: 1}), + KDAutoGenRestraintBlueprint("TrapArmbinderHarness", "Leather", "", undefined, undefined, {Metal: 1}), + KDAutoGenRestraintBlueprint("TrapBoxbinder", "Leather", "", undefined, undefined, {Metal: 1}), + KDAutoGenRestraintBlueprint("TrapLegbinder", "Leather", "", undefined, undefined, {Metal: 1}), + KDAutoGenRestraintBlueprint("TrapHarness", "Leather", "", undefined, undefined, {Leather: -2, Metal: 2}), + KDAutoGenRestraintBlueprint("TrapMittens", "Leather", ""), + KDAutoGenRestraintBlueprint("TrapBoots", "Leather", ""), + KDAutoGenRestraintBlueprint("TrapGag", "Leather", ""), + KDAutoGenRestraintBlueprint("TrapBlindfold", "Leather", ""), + KDAutoGenRestraintBlueprint("PanelGag", "Leather", ""), + KDAutoGenRestraintBlueprint("PanelPlugGag", "Leather", ""), + KDAutoGenRestraintBlueprint("PanelPlugGagHarness", "Leather", ""), + KDAutoGenRestraintBlueprint("HarnessGag", "Leather", ""), + KDAutoGenRestraintBlueprint("MagicPetsuit", "Leather", ""), + + KDAutoGenRestraintBlueprint("KittyGag", "Rope", ""), + KDAutoGenRestraintBlueprint("KittyMuzzle", "Rope", ""), + KDAutoGenRestraintBlueprint("KittyBlindfold", "Rope", ""), + KDAutoGenRestraintBlueprint("KittyPaws", "Rope", ""), + KDAutoGenRestraintBlueprint("KittyPetSuit", "Leather", ""), + KDAutoGenRestraintBlueprint("KittySuit", "Leather", ""), + + KDAutoGenRestraintBlueprint("LeatherHood", "Leather", ""), + KDAutoGenRestraintBlueprint("LeatherMask", "Leather", ""), + ] + }, + Leather2: { + name: "Leather2", + prereq: () => {return true;}, + items: [ + + + KDAutoGenRestraintBlueprint("HighsecArmbinder", "Leather", "", 1.5), + KDAutoGenRestraintBlueprint("HighsecBoxbinder", "Leather", "", 1.5), + KDAutoGenRestraintBlueprint("HighsecStraitjacket", "Leather", "", 1.5), + KDAutoGenRestraintBlueprint("HighsecTransportJacket", "Leather", "", 1.5), + KDAutoGenRestraintBlueprint("HighsecBallGag", "Leather", "", 1.5), + KDAutoGenRestraintBlueprint("HighsecMuzzle", "Leather", "", 1.5), + KDAutoGenRestraintBlueprint("HighsecLegbinder", "Leather", "", 1.5), + + KDAutoGenRestraintBlueprint("AsylumJacket", "Dress", "", 1.5, + undefined, {Rope: 3}), + KDAutoGenRestraintBlueprint("TransportJacket", "Dress", "", 1.5, + undefined, {Rope: 3}), + KDAutoGenRestraintBlueprint("AsylumLegbinder", "Dress", "", 1.5, + undefined, {Rope: 3}), + + KDAutoGenRestraintBlueprint("LeatherArmCuffs", "Leather", ""), + KDAutoGenRestraintBlueprint("LeatherLegCuffs", "Leather", ""), + KDAutoGenRestraintBlueprint("LeatherAnkleCuffs", "Leather", ""), + + KDAutoGenRestraintBlueprint("AsylumArmCuffs", "Leather", ""), + KDAutoGenRestraintBlueprint("AsylumLegCuffs", "Leather", ""), + KDAutoGenRestraintBlueprint("AsylumAnkleCuffs", "Leather", ""), + + KDAutoGenRestraintBlueprint("ScaleArmCuffs", "Leather", ""), + KDAutoGenRestraintBlueprint("ScaleLegCuffs", "Leather", ""), + KDAutoGenRestraintBlueprint("ScaleAnkleCuffs", "Leather", ""), + ] + }, + Rope: { + name: "Rope", + prereq: () => {return true;}, + items: [ + { + name: "RopeSnakeRaw", + item: "RopeSnakeRaw", + type: Restraint, + recyclecategory: "Rope", + recyclecost: { + Rope: 100, + }, + count: 25, + prereq: () => {return true;}, + }, + { + name: "WeakMagicRopeRaw", + item: "WeakMagicRopeRaw", + type: Restraint, + recyclecategory: "Rope", + recyclecost: { + Rope: 100, + Rune: 1, + }, + count: 25, + prereq: () => {return true;}, + }, + { + name: "StrongMagicRopeRaw", + item: "StrongMagicRopeRaw", + type: Restraint, + recyclecategory: "Rope", + recyclecost: { + Rope: 100, + Rune: 2, + }, + count: 25, + prereq: () => {return true;}, + }, + { + name: "CelestialRopeRaw", + item: "CelestialRopeRaw", + type: Restraint, + recyclecategory: "Rope", + recyclecost: { + Rope: 80, + Rune: 3, + }, + count: 25, + prereq: () => {return true;}, + }, + { + name: "MithrilRopeRaw", + item: "MithrilRopeRaw", + type: Restraint, + count: 25, + recyclecategory: "Metal", + recyclecost: { + Rope: 30, + Metal: 30, + }, + prereq: () => {return true;}, + }, + { + name: "Stuffing", + item: "Stuffing", + type: Restraint, + recyclecategory: "Rope", + recyclecost: { + Rope: 1, + }, + count: 5, + prereq: () => {return true;}, + }, + + KDAutoGenRestraintBlueprint("ClothGag", "Rope", ""), + KDAutoGenRestraintBlueprint("ClothGag2", "Rope", ""), + KDAutoGenRestraintBlueprint("ClothGag3", "Rope", ""), + KDAutoGenRestraintBlueprint("ClothGagOver", "Rope", ""), + KDAutoGenRestraintBlueprint("ClothBlindfold", "Rope", ""), + ] + }, + Metal: { + name: "Metal", + prereq: () => {return true;}, + items: [ + + + KDAutoGenRestraintBlueprint("TrapCuffs", "Metal", "", 1.2), + KDAutoGenRestraintBlueprint("ThumbCuffsNew", "Metal", "", 0.8), + KDAutoGenRestraintBlueprint("HighsecShackles", "Metal", "", 1.5), + KDAutoGenRestraintBlueprint("Irish8Cuffs", "Metal", ""), + KDAutoGenRestraintBlueprint("TrapLegirons", "Metal", ""), + KDAutoGenRestraintBlueprint("LegShackles", "Metal", ""), + KDAutoGenRestraintBlueprint("FeetShackles", "Metal", ""), + KDAutoGenRestraintBlueprint("AnkleIrish8Cuffs", "Metal", ""), + KDAutoGenRestraintBlueprint("ExpBoots", "Metal", ""), + KDAutoGenRestraintBlueprint("SteelArmCuffs", "Metal", ""), + + KDAutoGenRestraintBlueprint("MithrilCollar", "Metal", "", 1, { + Metal: 10, + }), + KDAutoGenRestraintBlueprint("MithrilArmCuffs", "Metal", ""), + KDAutoGenRestraintBlueprint("MithrilLegCuffs", "Metal", ""), + KDAutoGenRestraintBlueprint("MithrilAnkleCuffs", "Metal", ""), + + ] + }, + Metal2: { + name: "Metal2", + prereq: () => {return true;}, + items: [ + + KDAutoGenRestraintBlueprint("BlacksteelArmCuffs", "Metal", ""), + KDAutoGenRestraintBlueprint("BlacksteelLegCuffs", "Metal", ""), + KDAutoGenRestraintBlueprint("BlacksteelAnkleCuffs", "Metal", ""), + KDAutoGenRestraintBlueprint("BlacksteelMuzzleGag", "Metal", ""), + + + KDAutoGenRestraintBlueprint("ObsidianCollar", "Metal", "", 1, undefined, + {Rune: 1}, 10 + ), + KDAutoGenRestraintBlueprint("ObsidianArmCuffs", "Metal", "", 1, undefined, + {Rune: 1}, 10), + KDAutoGenRestraintBlueprint("ObsidianLegCuffs", "Metal", "", 1, undefined, + {Rune: 1}, 10), + KDAutoGenRestraintBlueprint("ObsidianAnkleCuffs", "Metal", "", 1, undefined, + {Rune: 1}, 10), + + + KDAutoGenRestraintBlueprint("SteelMuzzleGag", "Metal", ""), + ] + }, + Chastity: { + name: "Chastity", + prereq: () => {return KinkyDungeonStatsChoice.get("arousalMode");}, + items: [ + + KDAutoGenRestraintBlueprint("TrapBelt", "Leather", ""), + KDAutoGenRestraintBlueprint("TrapBeltProto", "Leather", "", 3), + KDAutoGenRestraintBlueprint("TrapBelt2", "Leather", ""), + KDAutoGenRestraintBlueprint("TrapBra", "Leather", ""), + KDAutoGenRestraintBlueprint("TrapBra2", "Leather", ""), + KDAutoGenRestraintBlueprint("PrisonBelt", "Leather", ""), + KDAutoGenRestraintBlueprint("PrisonBelt2", "Leather", ""), + + KDAutoGenRestraintBlueprint("MagicBelt", "Leather", "", undefined, { + Metal: 30, + Rune: 1, + }), + + KDAutoGenRestraintBlueprint("BlacksteelBelt", "Leather", ""), + KDAutoGenRestraintBlueprint("BlacksteelBra", "Leather", ""), + + KDAutoGenRestraintBlueprint("CyberBelt", "Cyber", "", 2, + undefined, {Latex: 5}), + KDAutoGenRestraintBlueprint("CyberBra", "Cyber", "", 2, + undefined, {Latex: 5}), + ] + }, + + Cyber: { + name: "Cyber", + prereq: () => {return true;}, + items: [ + KDAutoGenRestraintBlueprint("CyberMuzzle", "Cyber", "", 1.4, + undefined, {Latex: 1}), + KDAutoGenRestraintBlueprint("CyberPlugGag", "Cyber", "", 1.4, + undefined, {Latex: 2}), + KDAutoGenRestraintBlueprint("CyberBallGag", "Cyber", "", 1.4, + undefined, {Latex: 2}), + KDAutoGenRestraintBlueprint("CyberDollJacket", "Cyber", "", 1.4, + undefined, {Latex: 4}), + KDAutoGenRestraintBlueprint("CyberHeels", "Cyber", "", 2, + undefined, undefined), + KDAutoGenRestraintBlueprint("CyberAnkleCuffs", "Cyber", "", 2, + undefined, undefined), + KDAutoGenRestraintBlueprint("CyberArmCuffs", "Cyber", "", 2, + undefined, undefined), + KDAutoGenRestraintBlueprint("CyberLongMittens", "Cyber", "", 1.4, + undefined, {Latex: 4}), + KDAutoGenRestraintBlueprint("CyberMittens", "Cyber", "", 1.4, + undefined, {Latex: 2}), + KDAutoGenRestraintBlueprint("ControlHarness", "Cyber", "", 2, + undefined, {Rune: 1}), + KDAutoGenRestraintBlueprint("TrackingCollar", "Cyber", "", 1.5, + undefined, {Rune: 1}), + //KDAutoGenRestraintBlueprint("CyberLinkCollar", "Cyber", "", 1, + // undefined, {Rune: 10}), + ] + }, + Wolf: { + name: "Wolf", + prereq: () => {return true;}, + items: [ + KDAutoGenRestraintBlueprint("WolfCuffs", "Leather", ""), + KDAutoGenRestraintBlueprint("WolfArmbinder", "Wolf", "", 1.4, + undefined, {Latex: 1}), + KDAutoGenRestraintBlueprint("WolfStrongArmbinder", "Wolf", "", 1.7, + undefined, {Latex: 1}), + KDAutoGenRestraintBlueprint("WolfAnkleCuffs", "Wolf", "", undefined, + undefined, undefined), + KDAutoGenRestraintBlueprint("WolfHarness", "Wolf", "", undefined, + undefined, {Rope: 4}), + KDAutoGenRestraintBlueprint("WolfMittens", "Wolf", "", undefined, + undefined, undefined), + KDAutoGenRestraintBlueprint("WolfBallGag", "Wolf", "", undefined, + undefined, {Latex: 2}), + KDAutoGenRestraintBlueprint("WolfCollar", "Wolf", "", 2, + undefined, undefined), + KDAutoGenRestraintBlueprint("WolfLeash", "Wolf", "", 0.5, + undefined, {Rope: 4}), + KDAutoGenRestraintBlueprint("WolfPanties", "Wolf", "", 1, + {Latex: 10}), + KDAutoGenRestraintBlueprint("WolfPetsuit", "Leather", ""), + ] + }, + Dress: { + name: "Dress", + prereq: () => {return true;}, + items: [ + KDAutoGenRestraintBlueprint("ObsidianLeash", "Dress", "", 1, + {Rope: 20, Rune: 1}, undefined, 20), + KDAutoGenRestraintBlueprint("BindingDress", "Dress", "", 1, + {Rope: 50, Latex: 10}), + KDAutoGenRestraintBlueprint("DressGag", "Dress", "", 1, + undefined, {Rope: 3}), + KDAutoGenRestraintBlueprint("DressMuzzle", "Dress", "", 1, + undefined, {Rope: 4}), + KDAutoGenRestraintBlueprint("DressCorset", "Dress", "", 1, + undefined, {Metal: 1, Rope: 6}), + KDAutoGenRestraintBlueprint("DressBra", "Dress", "", 1, + undefined, {Rope: 3}), + { + name: "RibbonRaw", + item: "RibbonRaw", + type: Restraint, + recyclecategory: "Rope", + recyclecost: { + Rope: 25, + Rune: 1, + }, + count: 30, + prereq: () => {return true;}, + }, + ] + }, + Module: { + name: "Module", + prereq: () => {return true;}, + items: [ + KDAutoGenRestraintBlueprint("ShockModule", "Wolf", "", undefined, + {Rune: 1, Metal: 1}, undefined), + KDAutoGenRestraintBlueprint("TrackingModule", "Wolf", "", undefined, + {Rune: 1, Metal: 1}, undefined), + ] + }, + + Latex: { + name: "Latex", + prereq: () => {return true;}, + items: [ + { + name: "HardSlimeRaw", + item: "HardSlimeRaw", + type: Restraint, + count: 25, + recyclecategory: "Latex", + recyclecost: { + Latex: 50, + }, + prereq: () => {return true;}, + }, + { + name: "HardProtoSlimeRaw", + item: "HardProtoSlimeRaw", + type: Restraint, + count: 25, + recyclecategory: "Latex", + recyclecost: { + Latex: 30, + }, + prereq: () => {return true;}, + }, + { + name: "CaptureFoamRaw", + item: "CaptureFoamRaw", + type: Restraint, + count: 20, + recyclecategory: "Latex", + recyclecost: { + Latex: 50, + Leather: 5, + }, + prereq: () => {return true;}, + }, + { + name: "HardCaptureFoamRaw", + item: "HardCaptureFoamRaw", + type: Restraint, + count: 20, + recyclecategory: "Latex", + recyclecost: { + Latex: 50, + Leather: 5, + }, + prereq: () => {return true;}, + }, + KDAutoGenRestraintBlueprint("KiguMask", "Latex", ""), + KDAutoGenRestraintBlueprint("KiguMaskSmile", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexStraitjacket", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexTransportJacket", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexArmbinder", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexBoxbinder", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexLegbinder", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexCatsuit", "Latex", ""), + KDAutoGenRestraintBlueprint("HeavyLatexCatsuit", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexCorset", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexPetsuit", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexBallGag", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexBallGagLarge", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexOTNGag", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexOTNGagHeavy", "Latex", ""), + KDAutoGenRestraintBlueprint("LatexMittens", "Latex", ""), + KDAutoGenRestraintBlueprint("ExpArmbinder", "Latex", ""), + KDAutoGenRestraintBlueprint("ExpArmbinderHarness", "Latex", ""), + KDAutoGenRestraintBlueprint("ExpCollar", "Latex", ""), + + + { + name: "MagicGag", + item: "MagicGag", + type: Restraint, + count: 10, + recyclecategory: "Latex", + recyclecost: { + Latex: 40, + Rune: 1 + }, + prereq: () => {return true;}, + }, + { + name: "MagicGagLarge", + item: "MagicGagLarge", + type: Restraint, + count: 10, + recyclecategory: "Latex", + recyclecost: { + Latex: 100, + Rune: 1 + }, + prereq: () => {return true;}, + }, + ] + }, + Tape: { + name: "Tape", + prereq: () => {return true;}, + items: [ + + { + name: "VinylTapeRaw", + item: "VinylTapeRaw", + type: Restraint, + count: 25, + recyclecategory: "Latex", + recyclecost: { + Latex: 50, + }, + prereq: () => {return true;}, + }, + { + name: "DuctTapeRaw", + item: "DuctTapeRaw", + type: Restraint, + count: 25, + recyclecategory: "Latex", + recyclecost: { + Latex: 20, + }, + prereq: () => {return true;}, + }, + { + name: "AutoTapeRaw", + item: "AutoTapeRaw", + type: Restraint, + count: 25, + recyclecategory: "Metal", + recyclecost: { + Metal: 10, + Latex: 40, + }, + prereq: () => {return true;}, + }, + { + name: "MysticDuctTapeRaw", + item: "MysticDuctTapeRaw", + type: Restraint, + count: 30, + recyclecategory: "Rope", + recyclecost: { + Rope: 50, + Rune: 1, + }, + prereq: () => {return true;}, + }, + { + name: "CharmRaw", + item: "CharmRaw", + type: Restraint, + count: 25, + recyclecategory: "Rope", + recyclecost: { + Rope: 30, + }, + prereq: () => {return true;}, + }, + ] + }, + Toys: { + name: "Toys", + prereq: () => {return KinkyDungeonStatsChoice.get("arousalMode");}, + items: [ + { + name: "TrapVibe", + item: "TrapVibe", + type: Restraint, + count: 15, + recyclecategory: "Toys", + recyclecost: { + Latex: 10, + Rune: 1, + }, + prereq: () => {return KinkyDungeonStatsChoice.get("arousalMode");}, + }, + { + name: "TrapVibeProto", + item: "TrapVibeProto", + type: Restraint, + count: 8, + recyclecategory: "Toys", + recyclecost: { + Latex: 10, + Rune: 1, + }, + prereq: () => {return KinkyDungeonStatsChoice.get("arousalMode");}, + }, + { + name: "MaidVibe", + item: "MaidVibe", + type: Restraint, + count: 12, + recyclecategory: "Toys", + recyclecost: { + Latex: 12, + Rune: 1, + }, + prereq: () => {return KinkyDungeonStatsChoice.get("arousalMode");}, + }, + { + name: "TrapPlug", + item: "TrapPlug", + type: Restraint, + count: 15, + recyclecategory: "Toys", + recyclecost: { + Latex: 10, + Rune: 1, + }, + prereq: () => {return KinkyDungeonStatsChoice.get("arousalMode") && !KinkyDungeonStatsChoice.get("arousalModePlugNoFront");}, + }, + { + name: "TrapPlug2", + item: "TrapPlug2", + type: Restraint, + count: 12, + recyclecategory: "Toys", + recyclecost: { + Latex: 10, + Rune: 1, + }, + prereq: () => {return KinkyDungeonStatsChoice.get("arousalMode") && !KinkyDungeonStatsChoice.get("arousalModePlugNoFront");}, + }, + { + name: "TrapPlug3", + item: "TrapPlug3", + type: Restraint, + count: 10, + recyclecategory: "Toys", + recyclecost: { + Latex: 10, + Rune: 1, + }, + prereq: () => {return KinkyDungeonStatsChoice.get("arousalMode") && !KinkyDungeonStatsChoice.get("arousalModePlugNoFront");}, + }, + { + name: "TrapPlug4", + item: "TrapPlug4", + type: Restraint, + count: 5, + recyclecategory: "Toys", + recyclecost: { + Latex: 10, + Rune: 1, + }, + prereq: () => {return KinkyDungeonStatsChoice.get("arousalMode") && !KinkyDungeonStatsChoice.get("arousalModePlugNoFront");}, + }, + { + name: "TrapPlug5", + item: "TrapPlug5", + type: Restraint, + count: 5, + recyclecategory: "Toys", + recyclecost: { + Latex: 10, + Rune: 1, + }, + prereq: () => {return KinkyDungeonStatsChoice.get("arousalMode") && !KinkyDungeonStatsChoice.get("arousalModePlugNoFront");}, + }, + { + name: "RearVibe1", + item: "RearVibe1", + type: Restraint, + count: 15, + recyclecategory: "Toys", + recyclecost: { + Latex: 10, + Rune: 1, + }, + prereq: () => {return KinkyDungeonStatsChoice.get("arousalModePlug");}, + }, + { + name: "SteelPlugF", + item: "SteelPlugF", + type: Restraint, + count: 5, + recyclecategory: "Toys", + recyclecost: { + Metal: 15, + }, + prereq: () => {return KinkyDungeonStatsChoice.get("arousalMode") && !KinkyDungeonStatsChoice.get("arousalModePlugNoFront");}, + }, + { + name: "SteelPlugR", + item: "SteelPlugR", + type: Restraint, + count: 5, + recyclecategory: "Toys", + recyclecost: { + Metal: 15, + }, + prereq: () => {return KinkyDungeonStatsChoice.get("arousalModePlug");}, + }, + + ] + }, +} \ No newline at end of file diff --git a/Game/src/collection/KDWarden.ts b/Game/src/collection/KDWarden.ts new file mode 100644 index 000000000..6c2f931af --- /dev/null +++ b/Game/src/collection/KDWarden.ts @@ -0,0 +1,196 @@ +function KDDrawWarden(x: number, y: number, width: number): number { + let dd = 285; + if (y + dd < 940) { + let yy = y; + + yy += KDDrawServantPrisonerList("Warden", x + 50, yy + 70, width, 80); + + + let ii = 0; + DrawTextFitKD(TextGet("KDWardenTightened") + .replace("AMNT", "" + KDGameData.FacilitiesData.Warden_TightenedCount), + x + 50, yy + 80 + 30*ii++, width-100, "#ffffff", KDTextGray0, 18, "left"); + if (!KDGetContainer("WardenChest") || Object.values(KDGetContainer("WardenChest").items).length == 0) + DrawTextFitKD(TextGet("KDWardenNoRestraints"), + x + 50, yy + 80 + 30*ii++, width-100, "#ffffff", KDTextGray0, 18, "left"); + + DrawButtonKDEx( + "chestbutton", () => { + KDUI_ContainerBackScreen = KinkyDungeonDrawState; + KinkyDungeonDrawState = "Container", + KinkyDungeonCurrentFilter = "All"; + KDUI_CurrentContainer = "WardenChest"; + }, true, x + 900, yy + 60, 80, 80, "", "#ffffff", + KinkyDungeonRootDirectory + "UI/Safe.png", undefined, undefined, undefined, undefined, undefined, undefined, { + centered: true, + } + ) + } + return dd; +} + +/** Updates the warden facility */ +function KDUpdateWarden(delta: number) { + if (!delta) return; + let facility = "Warden"; + let wardenPower = 0; + let WardenItems = KDGetContainer("WardenChest")?.items || {}; + KDGameData.FacilitiesData.Warden_TightenedCount = 0; + if (KDGameData.FacilitiesData["Servants_" + facility]) + for (let servant of KDGameData.FacilitiesData["Servants_" + facility]) { + let value = KDGameData.Collection[servant + ""]; + if (value) { + wardenPower += 1 + KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type)); + } + } + if (wardenPower) { + // If we have a warden we continue + // Create a list of prisoners at risk of escaping + + + + // Another thing the warden does--collects restraints and items + for (let value of Object.values(KDGameData.Collection)) { + if (!value.status && !KDNPCUnavailable(value.id, value.status)) { + let entity = KDGetGlobalEntity(value.id); + if (entity?.items) { + let restraints = entity.items.filter((str) => { + return KDRestraint({name: str}); + }); + for (let item of restraints) { + if (WardenItems[item]) WardenItems[item].quantity = (WardenItems[item].quantity || 1) + 1; + else { + if (KinkyDungeonRestraintVariants[item]) { + WardenItems[item] = KDGetInventoryVariant( + KinkyDungeonRestraintVariants[item], undefined, + KinkyDungeonRestraintVariants[item].curse, + "", item); + + } else { + WardenItems[item] = { + name: item, + //curse: curse, + id: KinkyDungeonGetItemID(), + type: LooseRestraint, + //events:events, + quantity: 1, + showInQuickInv: KinkyDungeonRestraintVariants[item] != undefined,}; + } + } + // Delete from inv + entity.items.splice(entity.items.indexOf(item), 1); + } + } + + } + } + + let entries: KDCollectionEntry[] = []; + for (let value of Object.values(KDGameData.Collection)) { + if (!value.status && KDValidateEscapeGrace(value) && !KDNPCUnavailable(value.id, value.status)) { + entries.push(value); + } + } + + if (entries.length > 0) { + // If we do, then we iterate over all of them + for (let value of entries) { + // Get current bondage, exclusing conjured + let currentBondage = KDGetExpectedBondageAmountTotal(value.id, undefined, false); + // Figure out how much is needed to fully bind + let enemy = KinkyDungeonGetEnemyByName(value.type); + let neededBondage = enemy.maxhp * KDNPCStruggleThreshMultType(enemy); + if (currentBondage < neededBondage) { + // In this part we add more restraints until current bondage is acceptable + let availableRestraints = Object.values(WardenItems); + let iterations = 0; + let maxIterations = availableRestraints.length; + while (availableRestraints.length > 0 + && iterations++ < maxIterations + && currentBondage < neededBondage) { + // Get a random item to test, and remove it from available list + let testItem = availableRestraints.splice( + Math.floor(KDRandom() * availableRestraints.length), 1)[0]; + let rest = KDRestraint(testItem); + if (!rest) + continue; + + if (KDGenericRestraintRawOriginalCache[rest.name]) { + // Generic + let q = testItem.quantity || 1; + for (let rr of KDGenericRestraintRawOriginalCache[rest.name]) { + if (!KDRestraint(rr)) continue; + if (rr.count > q) continue; + let slot = KDGetNPCBindingSlotForItem(KDRestraint(rr), value.id, false); + + // Check if its valid + if (slot) { + // Add the item + if (KDInputSetNPCRestraint({ + slot: slot.sgroup.id, + id: undefined, + faction: testItem.faction, + restraint: rr.name, + restraintid: KinkyDungeonGetItemID(), + lock: "", + variant: undefined, + events: undefined, + powerbonus: undefined, + inventoryVariant: undefined, + npc: value.id, + player: -1, + noInventory: true, + }, WardenItems)) + // If added, refresh + q -= rr.count; + testItem.quantity = q; + if (q <= 0) { + delete WardenItems[testItem.name]; + break; + } + KDGameData.FacilitiesData.Warden_TightenedCount += 1; + currentBondage = KDGetExpectedBondageAmountTotal(value.id, undefined, false); + } + } + } else { + let slot = KDGetNPCBindingSlotForItem(rest, value.id, false); + + // Check if its valid + if (slot) { + // Add the item + if (KDInputSetNPCRestraint({ + slot: slot.sgroup.id, + id: undefined, + faction: testItem.faction, + restraint: testItem.name, + restraintid: testItem.id, + lock: "", + variant: undefined, + events: testItem.events, + powerbonus: undefined, + inventoryVariant: testItem.inventoryVariant, + npc: value.id, + player: -1, + }, WardenItems)) + // If added, refresh + KDGameData.FacilitiesData.Warden_TightenedCount += 1; + currentBondage = KDGetExpectedBondageAmountTotal(value.id, undefined, false); + } + } + + if (testItem?.quantity <= 0) { + availableRestraints = Object.values(WardenItems); + } + } + + } + // In this next part, we apply restraint tightening + KDNPCRefreshBondage(value.id, -1, false, false, + KDGetContainer("WardenChest", undefined, undefined, true, KDWardenChestFilters).items); + KDValidateEscapeGrace(value); + } + } + + } +} +let KDWardenChestFilters = [Restraint, Outfit, Consumable, Weapon]; \ No newline at end of file diff --git a/Game/src/collection/KinkyDungeonCollection.ts b/Game/src/collection/KinkyDungeonCollection.ts new file mode 100644 index 000000000..e8fb75934 --- /dev/null +++ b/Game/src/collection/KinkyDungeonCollection.ts @@ -0,0 +1,1759 @@ +"use strict"; + +let KDCollectionTab = ""; + +let KDCurrentFacilityTarget = ""; +let KDCurrentFacilityCollectionType: string[] = []; +let KDCurrentRestrainingTarget = 0; + +let KDCollectionTabStatus = ""; +let KDCollectionTabStatusOptions = ["", "Guest"]; +let KDPromotableStatus = ["", "Guest"]; +let KDSummonableStatus = ["Servant", "Guest"]; + +let KDFacilityCollectionDataTypes = [ + "Prisoners", + "Servants", +]; +let KDFacilityCollectionDataTypeMap = { + "Prisoners": "", + "Servants": "Servant" +}; + +let KDCollectionTabButtons = [ + "AutoBind", + "Release", + "FacilityQuick", +]; + +let KDCollectionTabButtonFilter = { + FacilityQuick: () => { + return KinkyDungeonFlags.get("1stSummit"); + }, +} + +let KDCollFilter = ""; + +type CollectionFilterItem = { + Current: number; + Options: string[]; + FilterCode: Record boolean>; +} + +let KDCollectionFilters: Record = { + Opinion: { + Current: 0, + Options: ["", "Positive", "Negative"], + FilterCode: { + "": (_value) => {return true;}, + Negative: (value) => {return !value.Opinion || value.Opinion < 0;}, + Positive: (value) => {return value.Opinion > 0;}, + }, + }, + Escape: { + Current: 0, + Options: ["", "EscapeRisk", "Escaped", "Imprisoned"], + FilterCode: { + "": (_value) => {return true;}, + Safe: (value) => {return !KDNPCUnavailable(value.id, value.status);}, + EscapeRisk: (value) => {return !value.escaped && value.escapegrace;}, + Escaped: (value) => {return value.escaped;}, + Imprisoned: (value) => {return KDGetGlobalEntity(value.id) && KDIsImprisoned(KDGetGlobalEntity(value.id));}, + }, + }, + Binding: { + Current: 0, + Options: ["", "Bound", "Free"], + FilterCode: { + "": (_value) => {return true;}, + Bound: (value) => {return KDGetNPCRestraints(value.id) && Object.values(KDGetNPCRestraints(value.id)).length > 0;}, + Free: (value) => {return !KDGetNPCRestraints(value.id) || Object.values(KDGetNPCRestraints(value.id)).length == 0;}, + }, + }, + Availability: { + Current: 0, + Options: ["", "Available", "Unavailable"], + FilterCode: { + "": (_value) => {return true;}, + Available: (value) => {return !KDNPCUnavailable(value.id, value.status);}, + Unavailable: (value) => {return KDNPCUnavailable(value.id, value.status);}, + }, + }, + Rank: { + Current: 0, + Options: ["", "Rank0", "Rank1", "Rank2", "Rank3", "Rank4", "Rank5"], + FilterCode: { + "": (_value) => {return true;}, + Rank0: (value) => {return 0 == KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type));}, + Rank1: (value) => {return 1 == KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type));}, + Rank2: (value) => {return 2 == KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type));}, + Rank3: (value) => {return 3 == KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type));}, + Rank4: (value) => {return 4 == KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type));}, + Rank5: (value) => {return 5 == KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type));}, + }, + }, + /*Favorites: { + Current: 0, + Options: ["", "Favorite", "NonFavorite"], + FilterCode: { + "": (value) => {return true;}, + Favorite: (value) => {return !KDNPCUnavailable(value.id, value.status);}, + NonFavorite: (value) => {return KDNPCUnavailable(value.id, value.status);}, + }, + },*/ +}; + +function KDDrawCollectionFilters(x: number, y: number) { + let spacing = 80; + let II = 0; + for (let filter of Object.entries(KDCollectionFilters)) { + if (DrawButtonKDEx("KDCollFilter" + filter[0], (_b) => { + filter[1].Current += 1; + if (filter[1].Current >= filter[1].Options.length) { + filter[1].Current = 0; + } + return true; + }, true, x - spacing * II++, y, 72, 72, "", "#ffffff", + KinkyDungeonRootDirectory + + "UI/CollectionFilter/" + (filter[1].Options[filter[1].Current] || filter[1].Options[1]) + ".png", undefined, undefined, + !filter[1].Current, KDButtonColor)) { + DrawTextFitKD(TextGet("KDCollectionFilter" + filter[0]) + + TextGet("KDCollectionFilter" + filter[1].Options[filter[1].Current]), + x - spacing * II + spacing + 36, y - 20, 500, "#ffffff", KDTextGray0,); + } + } +} + +function KDDrawCollectionTabOptions(x: number, y: number) { + let spacing = 80; + let II = 0; + for (let tab of KDCollectionTabButtons) { + if (!KDCollectionTabButtonFilter[tab] || KDCollectionTabButtonFilter[tab]()) + if (DrawButtonKDEx("KDCollTabSet" + tab, (_b) => { + if (KDCollectionTab) KDCollectionTab = ""; + else KDCollectionTab = tab; + return true; + }, true, x + spacing * II++, y, 72, 72, "", "#ffffff", + KinkyDungeonRootDirectory + + "UI/CollectionTab/" + tab + ".png", undefined, undefined, + KDCollectionTab != tab, KDButtonColor, undefined, undefined, { + centered: true, + })) { + DrawTextFitKD(TextGet("KDCollectionTab_" + tab), + x + spacing * II + spacing + 36, y - 20, 500, "#ffffff", KDTextGray0,); + } + } +} + +function KinkyDungeonDrawCollection(xOffset: number = -125) { + + let x = 1225 + xOffset; + if (!KDGameData.Collection) KDGameData.Collection = {}; + + if (KDCurrentRestrainingTarget && KDGameData.Collection["" + KDCurrentRestrainingTarget]) { + KDDrawCollectionRestrain(KDCurrentRestrainingTarget, x + xOffset, 150); + } else { + if (Object.entries(KDGameData.Collection).length == 0) { + DrawTextFitKD(TextGet("KDCollectionEmpty"), x, 300, 1050, "#ffffff", KDTextGray0, 24); + } else { + if (KDCollectionTabScreen[KDCollectionTab]) { + KDCollectionTabScreen[KDCollectionTab](x, xOffset); + } else { + KDDrawCollectionInventory(x + xOffset, 150); + KDDrawCollectionFilters(1750, 920); + KDDrawCollectionTabOptions(1000, 920); + } + } + } + + KinkyDungeonDrawMessages(true, 550, true, 600); + KDDrawInventoryTabs(xOffset); +} +function KinkyDungeonDrawBondage(xOffset = -125) { + let x = 1225 + xOffset; + if (!KDGameData.Collection) KDGameData.Collection = {}; + let en = KDCurrentRestrainingTarget ? KDGetGlobalEntity(KDCurrentRestrainingTarget) : null; + if (en && KDCanBind(en)) { + KDDrawCollectionRestrain(KDCurrentRestrainingTarget, x + xOffset, 150); + } else { + KinkyDungeonDrawState = "Game"; + } + + KinkyDungeonDrawMessages(true, 550, true, 600); + //KDDrawInventoryTabs(xOffset); +} + +/** + * @param id + */ +function KDCollectionImage(id: number): string { + let value = KDGameData.Collection["" + id]; + if (value) { + let sp = (value.sprite || value.type); + let dir = "Enemies/"; + let enemyType = value.Enemy || KinkyDungeonGetEnemyByName(value.type); + if (!value.status && !value.escaped) { + // Prisoner + dir = value.customSprite ? "Enemies/CustomSpriteBound/" : "EnemiesBound/"; + if (!value.customSprite) sp = enemyType.bound; + } else { + dir = value.customSprite ? "Enemies/CustomSprite/" : "Enemies/"; + } + return KinkyDungeonRootDirectory + dir + sp + '.png'; + } + return ""; +} + +/** + * @param id + * @param amount + */ +function KDAddOpinionPersistent(id: number, amount: number): void { + let opinion = undefined; + if (KDIsNPCPersistent(id)) { + KDUpdatePersistentNPC(id); + opinion = KDAddOpinion(KDGetPersistentNPC(id).entity, amount); + KDRefreshPersistentNPC(id); + } else if (KinkyDungeonFindID(id)) { + opinion = KDAddOpinion(KinkyDungeonFindID(id), amount); + } else if (KDGameData.Collection[id + ""]) { + if (opinion != undefined) { + KDGameData.Collection[id + ""].Opinion = opinion; + } else { + KDAddOpinionCollection(KDGameData.Collection[id + ""], amount); + } + } +} + + + +/** + * Gets the opinion, unmodified by various factors + * @param id + * @param [allowFaction] Optionally apply faction rep modifier + * @param [allowSub] Optionally apply sub modifier + * @param [allowPerk] Optionally apply perk modifiers + * @param [allowOnlyPosNegFaction] positive: allows only positive faction rep, negative: allows only negative faction rep + */ +function KDGetModifiedOpinionID(id: number, allowFaction: boolean = true, allowSub: boolean = true, allowPerk: boolean = false, allowOnlyPosNegFaction: number = 0): number { + if (KDIsNPCPersistent(id)) { + let enemy = KDGetPersistentNPC(id).entity; + let op = enemy.opinion || KDGameData.Collection[enemy.id]?.Opinion || 0; + + if (allowFaction) { + let faction = KDGetFaction(enemy); + let rel = KDFactionRelation("Player", faction); + op += (rel > 0 ? 10 : 20) * (!allowOnlyPosNegFaction ? rel : + (allowOnlyPosNegFaction > 0 ? Math.max(rel, 0) + : Math.min(rel, 0) + ) + ); + } + if (allowSub && KinkyDungeonStatsChoice.get("Dominant") && enemy.personality && KDLoosePersonalities.includes(enemy.personality)) op += 12; + if (allowPerk && KinkyDungeonStatsChoice.get("Oppression")) op -= 15; + + return op; + } else if (KinkyDungeonFindID(id)) { + return KDGetModifiedOpinion(KinkyDungeonFindID(id), allowFaction, allowSub, allowPerk); + } else if (KDGameData.Collection[id + ""]) { + let faction = KDIsServant(KDGameData.Collection[id + ""]) ? "Player" : KDGameData.Collection[id + ""].Faction; + let op = KDGameData.Collection[id + ""].Opinion || 0; + if (allowFaction) { + let rel = KDFactionRelation("Player", faction); + op += (rel > 0 ? 10 : 20) * (!allowOnlyPosNegFaction ? rel : + (allowOnlyPosNegFaction > 0 ? Math.max(rel, 0) + : Math.min(rel, 0) + ) + ); + } + if (!KDGameData.Collection[id + ""].personality) { + KDGameData.Collection[id + ""].personality = + KDGetPersonalityType(KinkyDungeonGetEnemyByName(KDGameData.Collection[id + ""].type)); + } + if (allowSub && KinkyDungeonStatsChoice.get("Dominant") + && KDGameData.Collection[id + ""].personality + && KDLoosePersonalities.includes(KDGameData.Collection[id + ""].personality)) op += 12; + if (allowPerk && KinkyDungeonStatsChoice.get("Oppression")) op -= 15; + + return op; + } +} + +/** + * + * @param enemy + */ +function KDCapturable(enemy: entity): boolean { + return enemy?.Enemy.bound && !enemy.Enemy.allied && !(KDNoCaptureTypes.some((tag) => {return enemy.Enemy.tags[tag];})); +} + +/** + * @param enemy + */ +function KDCapturableType(enemy: enemy): boolean { + return !(KDNoCaptureTypes.some((tag) => {return enemy.tags[tag];})); +} + +/** + * @param enemy + * @param [type] + * @param [status] + * @param [servantclass] + * @param [type] + */ +function KDAddCollection(enemy: entity, type?: string, status?: string, servantclass?: string) { + if (!KDGameData.Collection) KDGameData.Collection = {}; + if (!KDGameData.CollectionSorted) KDSortCollection(); + + if (!KDCapturable(enemy)) return; + + if (!KDGameData.Collection["" + enemy.id]) { + // Add her + let entry: KDCollectionEntry = { + id: enemy.id, + name: KDGetPersistentNPC(enemy.id).Name, + sprite: (enemy.CustomSprite) || enemy.Enemy.name, + // @ts-ignore + customSprite: (enemy.CustomSprite), + color: enemy.CustomNameColor || "#ffffff", + Faction: KDGetFaction(enemy) || KDGetFactionOriginal(enemy), + class: servantclass || "prisoner", + Training: -(10 + 10 * KDRandom()) * KDEnemyRank(enemy) - 25, + status: status || "", + oldstatus: status || "", + type: enemy.Enemy.name, + Enemy: enemy.modified ? enemy.Enemy : undefined, + Willpower: 100, + Facility: undefined, + escaped: undefined, + flags: undefined, + personality: enemy.personality != undefined ? enemy.personality : KDGetPersonalityType(enemy.Enemy) + }; + enemy.CustomName = entry.name; + enemy.CustomNameColor = entry.color; + + // Custom outfit + if (!status && enemy.outfitBound) entry.outfit = enemy.outfitBound; + else if (enemy.outfit) entry.outfit = enemy.outfit; + + // Custom style + if (enemy.style) { + let style = KDModelStyles[enemy.style]; + if (style) { + if (!entry.bodystyle && style.Bodystyle) { + entry.bodystyle = style.Bodystyle[Math.floor(Math.random() * style.Bodystyle.length)]; + } + if (!entry.hairstyle && style.Hairstyle) { + entry.hairstyle = style.Hairstyle[Math.floor(Math.random() * style.Hairstyle.length)]; + } + if (!entry.facestyle && style.Facestyle) { + entry.facestyle = style.Facestyle[Math.floor(Math.random() * style.Facestyle.length)]; + } + if (!entry.cosplaystyle && style.Cosplay) { + entry.cosplaystyle = style.Cosplay[Math.floor(Math.random() * style.Cosplay.length)]; + } + } + } + + KDUpdatePersistentNPC(enemy.id); + KDGameData.Collection["" + enemy.id] = entry; + KDGameData.CollectionSorted.unshift(entry); + KDSortCollection(); + } else { + // Update her + let entry = KDGameData.Collection["" + enemy.id]; + entry.escaped = undefined; + entry.escapegrace = undefined; + if (status != undefined) { + entry.status = status; + } + if (servantclass != undefined) { + entry.class = servantclass; + } + if (type != undefined) { + entry.type = type; + } + KDUpdatePersistentNPC(enemy.id); + } +} + + + +function KDUpdatePersistentNPCFlags(delta: number) { + KDGetEntityFlagCache(); + let curpos = KDGetCurrentLocation(); + for (let npc of KDEntityFlagCache.keys()) { + if (KDPersistentNPCs[npc]) { + if (!KDCompareLocation(KDGetNPCLocation(npc.id), curpos)) { + if (KinkyDungeonTickFlagsEnemy(npc.entity, delta)) + KDUpdateEntityFlagCache = true; + } + } else { + KDEntityFlagCache.delete(npc); + } + } +} + +function KDUpdateCollectionFlags(delta: number) { + for (let npc of Object.values(KDGameData.Collection)) { + if (npc.flags) { + let newF: Record = {}; + for (let entry of Object.entries(npc.flags)) { + if (entry[1] > delta) newF[entry[0]] = entry[1] - delta; + else if (entry[1] == -1) newF[entry[0]] = -1; + } + + if (Object.entries(newF).length == 0) delete npc.flags; + else npc.flags = newF; + } + } +} + +/** + * @param entity + */ +function KDGetCharacter(entity: entity): Character { + if (entity?.id == KDPlayer().id) { + return KinkyDungeonPlayer; + } + return KDNPCChar.get(entity.id); +} +/** + * @param C + */ +function KDGetCharacterID(C: Character): number { + if (C == KinkyDungeonPlayer) { + return KDPlayer().id; + } + return KDNPCChar_ID.get(C); +} +/** + * @param C + */ +function KDGetCharacterEntity(C: Character): entity { + if (C == KinkyDungeonPlayer) { + return KDPlayer(); + } + if (KDNPCChar_ID.get(C)) + return KinkyDungeonFindID( KDNPCChar_ID.get(C)); + return undefined; +} + +let KDRenameNPC = false; + +let KDToggleBigView = false; + +/** + * @param value + * @param x + * @param y + * @param index + * @param [tab] + */ +function KDDrawSelectedCollectionMember(value: KDCollectionEntry, x: number, y: number, index: number, tab: string = "") { + + FillRectKD(kdcanvas, kdpixisprites, "collectionselectionbg", { + Left: x, + Top: y, + Width: 440, + Height: KDToggleBigView ? 830 : 730, + Color: "#000000", + LineWidth: 1, + zIndex: -20, + alpha: 0.5 + }); + DrawRectKD(kdcanvas, kdpixisprites, "collectionselectionbg2", { + Left: x, + Top: y, + Width: 440, + Height: KDToggleBigView ? 830 : 730, + Color: "#888888", + LineWidth: 1, + zIndex: -19, + alpha: 0.9 + }); + + if (DrawButtonKDEx("toggleBig", () => { + KDToggleBigView = !KDToggleBigView; + return true; + }, true, x - 90, y, 80, 80, "", "#ffffff", + KinkyDungeonRootDirectory + "UI/vision.png", undefined, undefined, + !KDToggleBigView, KDButtonColorIntense, undefined, undefined, { + centered: true + })) { + + DrawTextFitKD(TextGet("KDZoomNPC"), x + 220, y + 750, 500, "#ffffff", KDTextGray0); + } + if (KDGameData.Collection[value.id + ""] && DrawButtonKDEx("dressNPC", () => { + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "LightJingle" + ".ogg"); + //KDSpeakerNPC = null; + KinkyDungeonState = "Wardrobe"; + KDCanRevertFlag = value.customOutfit != undefined; + ForceRefreshModels(KDSpeakerNPC); + KDOriginalValue = ""; + CharacterReleaseTotal(KDSpeakerNPC); + KDWardrobeCallback = () => { + let value2 = value; + //if (KDOriginalValue) { + value2.customOutfit = LZString.compressToBase64(AppearanceItemStringify(KDSpeakerNPC.Appearance)); + value2.Palette = KDSpeakerNPC.Palette; + + KDRefreshCharacter.set(KDSpeakerNPC, true); + //} + }; + if (value.customOutfit) { + let outfit = value.customOutfit; + KDWardrobeRevertCallback = () => { + if (outfit) + CharacterAppearanceRestore(KDSpeakerNPC, DecompressB64(outfit),false, true); + CharacterRefresh(KDSpeakerNPC); + KDInitProtectedGroups(KDSpeakerNPC); + KDRefreshCharacter.set(KDSpeakerNPC, true); + KinkyDungeonDressPlayer(KDSpeakerNPC, true); + }; + KDWardrobeResetCallback = () => { + delete value.customOutfit; + }; + } else { + KDWardrobeRevertCallback = () => { + delete value.customOutfit; + KDRefreshCharacter.set(KDSpeakerNPC, true); + KinkyDungeonDressPlayer(KDSpeakerNPC, true); + }; + KDWardrobeResetCallback = null; + } + + KDPlayerSetPose = false; + KDInitCurrentPose(true,KDSpeakerNPC); + KinkyDungeonInitializeDresses(); + KDUpdateModelList(); + KDRefreshOutfitInfo(); + let itt = localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit); + let orig = itt ? + JSON.parse(LZString.decompressFromBase64(itt)).appearance + || itt : ""; + let current = LZString.compressToBase64(AppearanceItemStringify(KinkyDungeonPlayer.Appearance)); + if (orig != current) KDOriginalValue = orig; + ForceRefreshModelsAsync(KDSpeakerNPC); + return true; + }, true, x - 90, y + 90, 80, 80, "", "#ffffff", + KinkyDungeonRootDirectory + "UI/Dress.png", undefined, undefined, + true, KDButtonColorIntense, undefined, undefined, { + centered: true + })) { + DrawTextFitKD(TextGet("KDDressNPC"), x + 220, y + 750, 500, "#ffffff", KDTextGray0); + } + + if (KDGameData.Collection[value.id + ""] && DrawButtonKDEx("renameNPC", () => { + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Unlock" + ".ogg"); + KDRenameNPC = !KDRenameNPC; + return true; + }, true, x - 90, y + 180, 80, 80, "", "#ffffff", + KinkyDungeonRootDirectory + "UI/Rename.png", undefined, undefined, + !KDRenameNPC, KDButtonColorIntense, undefined, undefined, { + centered: true + })) { + DrawTextFitKD(TextGet("KDRenameNPC"), x + 220, y + 750, 500, "#ffffff", KDTextGray0); + } + + + let sp = (value.sprite || value.type); + let dir = "Enemies/"; + let enemyType = value.Enemy || KinkyDungeonGetEnemyByName(value.type); + + KDDraw(kdcanvas, kdpixisprites, value.name + "_rank," + value.id, + KinkyDungeonRootDirectory + "UI/Rank/Rank" + KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type)) + ".png", + x + 10, + y + 10, + 72, 72, undefined, { + zIndex: 110 + }); + + + if (!value.status) { + // Prisoner + dir = value.customSprite ? "Enemies/CustomSpriteBound/" : "EnemiesBound/"; + if (!value.customSprite) sp = enemyType.bound; + } else { + dir = value.customSprite ? "Enemies/CustomSprite/" : "Enemies/"; + } + + if (tab) { + DrawTextFitKD(TextGet("KDDrawSelectedTab_" + tab).replace("NUMR", "" + index).replace("TTL", "" + Object.values(KDGameData.Collection).length), x + 220, y + 15, 500, "#ffffff", KDTextGray05, 18); + } else + if (index) + DrawTextFitKD(TextGet("KDPrisonerNum_" + KDCollectionTabStatus).replace("NUMR", "" + index).replace("TTL", "" + Object.values(KDGameData.Collection).length), x + 220, y + 15, 500, "#ffffff", KDTextGray05, 18); + + + if (KDRenameNPC) { + let TF = KDTextField("RenameNPC", x + 220 - 150, y + 50 - 36, 300, + 36, "text", "", "45"); + if (TF.Created) { + TF.Element.oninput = (_event: any) => { + KDSendInput("renamenpc", { + id: value.id, + newName: ElementValue("RenameNPC"), + }); + }; + } + if (value.origname) + DrawButtonKDEx("resetname", () => { + KDRenameNPC = false; + KDSendInput("renamenpc", { + id: value.id, + newName: value.origname, + }); + return true; + }, true, x + 220 - 130, y + 50 + 18, 260, 24, TextGet("KDRenameOrigNPC") + .replace("NME", value.origname), "#ffffff"); + } + else DrawTextFitKD(value.name, x + 220, y + 50 + ((tab || index) ? 0 : -12), 500, + "#ffffff", + (value.color && value.color != "#ffffff") ? value.color : KDTextGray05, + 36); + + + if (!KDToggleBigView) { + let II = 0; + DrawTextFitKD(TextGet("Name" + enemyType.name), x + 220, y + 500 - 25 + 20*II++, 500, "#ffffff", KDTextGray05, 24); + + if (value.Faction && !KDFactionNoCollection.includes(value.Faction) && (KinkyDungeonTooltipFactions.includes(value.Faction) || !KinkyDungeonHiddenFactions.has(value.Faction))) + DrawTextFitKD(TextGet("KDFormerFaction") + TextGet("KinkyDungeonFaction" + value.Faction), x + 20, y + 500 + 20*II++, 500, "#ffffff", KDTextGray05, 18, "left"); + else II++; + + let opinion = Math.max(-3, Math.min(3, Math.round(KDGetModifiedOpinionID(value.id)/KDOpinionThreshold))); + let str = TextGet("KDNPCOpinion") + TextGet("KDTooltipOpinion"+opinion) + ` (${Math.round(KDGetModifiedOpinionID(value.id))})`; + DrawTextFitKD(str, x + 20, y + 500 + 20*II++, 500, "#ffffff", KDTextGray05, 18, "left"); + + if (KDIsNPCPersistent(value.id)) { + if (KDGetPersistentNPC(value.id)?.captured) { + str = TextGet((KDGetPersistentNPC(value.id)?.captureFaction) ? "KDLastNPCLocationCaptured" : "KDLastNPCLocationCapturedNone") + .replace("FCTN", TextGet("KinkyDungeonFaction" + KDGetPersistentNPC(value.id)?.captureFaction)); + DrawTextFitKD(str, x + 20, y + 500 + 20*II++, 500, "#ffffff", KDTextGray05, 18, "left"); + } + } + + + + let npcLoc = KDGetNPCLocation(value.id); + if (npcLoc) { + let currLoc = KDGetCurrentLocation(); + let dungeon = npcLoc.room || KDGameData.JourneyMap[npcLoc.mapX + ',' + npcLoc.mapY]?.Checkpoint || 'grv'; + str = TextGet((KinkyDungeonFindID(value.id) && KDCompareLocation(currLoc, npcLoc)) ? "KDLastNPCLocationSame" : "KDLastNPCLocation") + .replace("FLR", npcLoc.mapY + "") + .replace("LOC", KDPersonalAlt[npcLoc.room] + ? KDGetLairName(npcLoc.room) + : TextGet("DungeonName" + dungeon)); + DrawTextFitKD(str, x + 20, y + 500 + 20*II++, 500, "#ffffff", KDTextGray05, 18, "left"); + } + if (KDDrawNPCBars(value, x + 0, y + 730, 440) > 0) + if (KDGameData.Collection[value.id + ""] && value.escapegrace) { + let icon = "escapegrace"; + KDDraw(kdcanvas, kdpixisprites, value.name + "_escp," + value.id, + KinkyDungeonRootDirectory + "UI/" + icon + ".png", + x - 72, + y + 730, + 72, 72, undefined, { + zIndex: 110 + }); + } + } + + + + + + if (!KDNPCChar.get(value.id)) { + KDSpeakerNPC = CharacterLoadNPC(value.id, value.name, value.Palette); + KDNPCChar.set(value.id, KDSpeakerNPC); + KDNPCChar_ID.set(KDSpeakerNPC, value.id); + let oldstyle = KDNPCStyle.get(KDSpeakerNPC); + KDNPCStyle.set(KDSpeakerNPC, value); + if (!value.bodystyle && !value.facestyle && !value.hairstyle) { + if (enemyType?.style || KinkyDungeonGetEnemyByName(value.type)?.style) { + if (KDModelStyles[enemyType?.style || KinkyDungeonGetEnemyByName(value.type)?.style]) { + let style = KDModelStyles[enemyType?.style || KinkyDungeonGetEnemyByName(value.type)?.style]; + if (!value.bodystyle && oldstyle?.bodystyle) { + value.bodystyle = oldstyle.bodystyle; + } else + if (!value.bodystyle && style.Bodystyle) { + value.bodystyle = style.Bodystyle[Math.floor(Math.random() * style.Bodystyle.length)]; + } + if (!value.hairstyle && oldstyle?.hairstyle) { + value.hairstyle = oldstyle.hairstyle; + } else + if (!value.hairstyle && style.Hairstyle) { + value.hairstyle = style.Hairstyle[Math.floor(Math.random() * style.Hairstyle.length)]; + } + if (!value.facestyle && oldstyle?.facestyle) { + value.facestyle = oldstyle.facestyle; + } else + if (!value.facestyle && style.Facestyle) { + value.facestyle = style.Facestyle[Math.floor(Math.random() * style.Facestyle.length)]; + } + if (!value.cosplaystyle && oldstyle?.cosplaystyle) { + value.cosplaystyle = oldstyle.cosplaystyle; + } else + if (!value.cosplaystyle && style.Cosplay) { + value.cosplaystyle = style.Cosplay[Math.floor(Math.random() * style.Cosplay.length)]; + } + + } + } + } + if (enemyType?.outfit || KinkyDungeonGetEnemyByName(value.type)?.outfit) { + KinkyDungeonSetDress( + value.outfit || enemyType?.outfit || KinkyDungeonGetEnemyByName(value.type)?.outfit, + value.outfit || enemyType?.outfit || KinkyDungeonGetEnemyByName(value.type)?.outfit, + KDSpeakerNPC, true); + } + KDRefreshCharacter.set(KDSpeakerNPC, true); + } else { + KDSpeakerNPC = KDNPCChar.get(value.id); + KDNPCChar_ID.set(KDSpeakerNPC, value.id); + KDNPCStyle.set(KDSpeakerNPC, value); + } + + if (KDSpeakerNPC) { + if (KinkyDungeonCheckClothesLoss || KDRefreshCharacter.get(KDSpeakerNPC)) { + if (!NPCTags.get(KDSpeakerNPC)) { + NPCTags.set(KDSpeakerNPC, new Map()); + } + NPCTags.set(KDSpeakerNPC, KinkyDungeonUpdateRestraints(KDSpeakerNPC, value.id, 0)); + } + KinkyDungeonDressPlayer(KDSpeakerNPC, false, false, KDGameData.NPCRestraints ? KDGameData.NPCRestraints[value.id + ''] : undefined); + DrawCharacter(KDSpeakerNPC, + x + 20 + (KDToggleBigView ? 0 : 100), + y + 60, + KDToggleBigView ? (800/1000) : (400/1000), true, undefined, PIXI.SCALE_MODES.NEAREST, [], undefined, false); + + if (!KDToggleBigView) { + let III = 0; + let buttonSpacing = 85; + + III = KDCollectionTabDraw[tab || "Default"](value, buttonSpacing, III, x, y); + + let assigned = !(!value.Facility); + let valid = KDCurrentFacilityCollectionType.some((type) => { + return KDFacilityCollectionDataTypeMap[type] == value.status; + }) && KDCurrentFacilityCollectionType.some((type) => { + return KDValidateServant(value, KDCurrentFacilityTarget, type); + }); + + + let collType = valid ? KDCurrentFacilityCollectionType.find((type) => { + return KDFacilityCollectionDataTypeMap[type] == value.status; + }) : ""; + + if (KDGameData.Collection[value.id + ""] && KDCurrentFacilityTarget) { + let dd = KDGameData.FacilitiesData[collType + "_" + KDCurrentFacilityTarget]; + let fac = KDFacilityTypes[KDCurrentFacilityTarget]; + if (dd && fac + && fac["max" + collType] + && (assigned + || dd.length < fac["max" + collType]() + )) { + + KDDraw(kdcanvas, kdpixisprites, "facilityAssignIcon", + KinkyDungeonRootDirectory + `UI/Facility_${(assigned || !valid) ?"X" : + collType + }.png`, + x + 10 + buttonSpacing*III, y + 730 - 10 - 80, 80, 80, undefined, { + zIndex: 160, + } + ); + if (DrawButtonKDEx("facilityAssign", (_b) => { + if (!valid) return false; + if (!assigned) { + let data = KDGameData.FacilitiesData[collType + "_" + KDCurrentFacilityTarget]; + if (data && (!KDFacilityCollectionCallback || KDFacilityCollectionCallback(value.id))) { + data.push(value.id); + value.Facility = KDCurrentFacilityTarget; + } + } else { + let listRender = Object.entries(KDFacilityTypes).filter((entry) => { + return entry[1].prereq(); + }); + for (let f of listRender) { + for (let dt of KDFacilityCollectionDataTypes) { + let data: number[] = KDGameData.FacilitiesData[dt + "_" + f[0]]; + if (data?.includes(value.id)) { + delete value.Facility; + data.splice(data.indexOf(value.id), 1); + break; + } + } + } + // Failsafe + delete value.Facility; + } + + KDValidateAllFacilities(); + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, "", "#ffffff", + KinkyDungeonRootDirectory + `UI/Facility/${value.Facility || KDCurrentFacilityTarget}.png`, + undefined, undefined, !valid, (!valid) ? "#ff5277" : undefined)) { + DrawTextFitKD(TextGet(`KDCollection${assigned ? "Remove" : "Assign"}`) + TextGet("KDFacility_" + (assigned ? value.Facility : KDCurrentFacilityTarget)), + x + 220, y + 750, 500, "#ffffff", KDTextGray0); + } + } + + } + } + + + } else { + KDDraw(kdcanvas, kdpixisprites, value.name + "_coll," + value.id, KinkyDungeonRootDirectory + dir + sp + ".png", + x + 20, + y + 80, + 400, 400, undefined); + } + + +} + +/** + * @param id + * @param x + * @param y + */ +function KDDrawCollectionRestrain(id: number, x: number, y: number) { + if (!KDGameData.CollectionSorted) KDSortCollection(); + + KDDrawCollectionRestrainMain(id, x, y); + if (KDGetGlobalEntity(id) || KDGameData.Collection[id + ""]) + KDDrawSelectedCollectionMember((KDGameData.Collection[id + ""] && !KDNPCUnavailable(id, KDGameData.Collection[id + ""].status)) ? + KDGameData.Collection[id + ""] : KDGetVirtualCollectionEntry(id), x - 460, 150, 0, "Restrain"); +} + +/** + * Gets the collection entry, or a virtual one if one doesnt exist + * @param id + */ +function KDGetVirtualCollectionEntry(id: number): KDCollectionEntry { + if (KDGameData.Collection["" + id]) return KDGameData.Collection["" + id]; + + let enemy = KDGetGlobalEntity(id); + if (!enemy) return null; + let entry: KDCollectionEntry = { + id: enemy.id, + name: KDIsNPCPersistent(id) ? + KDGetPersistentNPC(enemy.id).Name + : enemy.CustomName || TextGet("Name" + enemy.Enemy.name), + sprite: (enemy.CustomSprite) || enemy.Enemy.name, + // @ts-ignore + customSprite: (enemy.CustomSprite), + color: enemy.CustomNameColor || "#ffffff", + Faction: KDGetFaction(enemy) || KDGetFactionOriginal(enemy), + class: "stranger", + Training: -100, + status: "stranger", + oldstatus: "stranger", + type: enemy.Enemy.name, + Enemy: enemy.modified ? enemy.Enemy : undefined, + Willpower: 100 * (enemy.hp / enemy.Enemy.maxhp), + Facility: undefined, + flags: undefined, + }; + + // Custom outfit + if (enemy.outfit) entry.outfit = enemy.outfit; + + // Custom style + if (enemy.style) { + let style = KDModelStyles[enemy.style]; + if (style) { + if (!entry.bodystyle && style.Bodystyle) { + entry.bodystyle = style.Bodystyle[Math.floor(Math.random() * style.Bodystyle.length)]; + } + if (!entry.hairstyle && style.Hairstyle) { + entry.hairstyle = style.Hairstyle[Math.floor(Math.random() * style.Hairstyle.length)]; + } + if (!entry.facestyle && style.Facestyle) { + entry.facestyle = style.Facestyle[Math.floor(Math.random() * style.Facestyle.length)]; + } + if (!entry.cosplaystyle && style.Cosplay) { + entry.cosplaystyle = style.Cosplay[Math.floor(Math.random() * style.Cosplay.length)]; + } + } + } + + return entry; +} + +/** + * @param id + * @param x + * @param y + */ +function KDDrawCollectionRestrainMain(id: number, x: number, y: number) { + let restraints = KDGetNPCRestraints(id); + KDDrawNPCRestrain(id, restraints, x, y); +} + +function KDIsImprisonedByEnemy(id: number) { + return KDIsImprisoned(KDGetGlobalEntity(id)) + && !KDIsInPlayerBase(id); +} + +/** + * @param id + * @param status + */ +function KDNPCUnavailable(id: number, status: string): boolean { + return KDGameData.Collection[id + ""]?.escaped || (KDIsNPCPersistent(id) && + ( + //KDGameData.NPCRestraints[id + ""]?.Device != undefined + KDGetPersistentNPC(id).captured + || !(KDGetPersistentNPC(id).collect || (status && !KDIsInPartyID(id))) + )) + || (status && KDIsInCapturedPartyID(id)) + || (KDGetGlobalEntity(id) && + (KDIsImprisonedByEnemy(id)) + || (KinkyDungeonFindID(id) + && !KDIsImprisoned(KinkyDungeonFindID(id)) && KDHostile(KinkyDungeonFindID(id)))); + +} + +let KDNPCChar: Map = new Map(); +let KDNPCChar_ID: Map = new Map(); +let KDNPCStyle = new Map(); +let KDCollectionSelected = 0; +let KDCollectionIndex = 0; +let KDCollectionGuestRows = 2; +let KDCollectionRows = 6; +let KDCollectionColumns = 10; +let KDCollectionSpacing = 80; + +let KDDrawnCollectionInventory: KDCollectionEntry[] = []; + +function KDResetCollectionUI() { + KDRenameNPC = false; +} + +function KDDrawCollectionInventory(x: number, y: number, drawCallback?: (value: KDCollectionEntry, X: number, Y: number) => void) { + if (!KDGameData.CollectionSorted) KDSortCollection(); + + let XX = x; + let YY = y + KDCollectionSpacing * (KDCollectionGuestRows + 1); + let column = 0; + let row = 0; + + let II = 0; + let selectedIndex = 0; + + + if (KDCollectionIndex + KDCollectionRows * KDCollectionColumns < KDGameData.CollectionSorted.length) { + DrawButtonKDEx("collDOWN", (_b) => { + KDCollectionIndex = Math.max( + 0, + Math.min( + KDCollectionIndex + KDCollectionColumns, + Math.floor(KDGameData.CollectionSorted.length / KDCollectionColumns) * KDCollectionColumns)); + return true; + },true, + 1700, 870, 125, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Down.png", + "", false, false, KDButtonColor, undefined, undefined, {centered: true} + ); + } + if (KDCollectionIndex > 0) { + DrawButtonKDEx("collUP", (_b) => { + KDCollectionIndex = Math.max( + 0, + Math.min( + KDCollectionIndex - KDCollectionColumns, + Math.floor(KDGameData.CollectionSorted.length / KDCollectionColumns) * KDCollectionColumns)); + return true; + },true, + 1700, 100, 125, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Up.png", + "", false, false, KDButtonColor, undefined, + undefined, {centered: true} + ); + + } + + KDDraw(kdcanvas, kdpixisprites, "collScrollBar", + KinkyDungeonRootDirectory + "UI/Checked.png", + 1775, 125 + 590*(KDCollectionIndex/Math.max(1, KDGameData.CollectionSorted.length)), 60, 60 + ); + if (!KDGameData.NPCRestraints) KDGameData.NPCRestraints = {}; + + let ww = 800; + let xpad = 24; + for (let i = 0; i < KDCollectionTabStatusOptions.length; i++) { + let option = KDCollectionTabStatusOptions[i]; + DrawButtonKDEx("collectionTab" + option, (_b) => { + KDCollectionTabStatus = option; + return true; + },true, + x + xpad/2 + KDCollectionColumns * KDCollectionSpacing/2 - 400 + i * ww/KDCollectionTabStatusOptions.length, + y - KDCollectionSpacing + 12 + (1+ KDCollectionGuestRows)*KDCollectionSpacing, + ww/KDCollectionTabStatusOptions.length - xpad, 50, TextGet("KDCollectionTabStatusOption_" + option), "#ffffff", "", + "", false, KDCollectionTabStatus != option, KDButtonColor, undefined, undefined, {centered: true} + ); + } + + + let TF = KDTextField("CollFilter", + x + xpad/2 + KDCollectionColumns * KDCollectionSpacing/2 + , + y - KDCollectionSpacing + 20, 400, 45, "text", "", "45"); + if (TF.Created) { + //KDCollFilter = ""; + ElementValue("CollFilter", KDCollFilter || ""); + TF.Element.oninput = (_event) => { + KDCollFilter = ElementValue("CollFilter"); + KDCollectionIndex = 0; + }; + } + + if (!KDGameData.AutoRelease) { + KDGameData.AutoRelease = { + Escaped: false, + NonNotable: false, + }; + } + + DrawCheckboxKDEx("KDAutoRelease_NonNotable", (_bdata) => { + KDSendInput("changeAutorelease", { + type: "NonNotable" + }) + return true; + }, true, + x + xpad/2 + KDCollectionColumns * KDCollectionSpacing/2 - 840, + y - KDCollectionSpacing + 14, 64, 64, + TextGet("KDAutoRelease_NonNotable"), KDGameData.AutoRelease.NonNotable, + false, "#ffffff", undefined, { + fontSize: 24 + }); + DrawCheckboxKDEx("KDAutoRelease_Escaped", (_bdata) => { + KDSendInput("changeAutorelease", { + type: "Escaped" + }) + return true; + }, true, + x + xpad/2 + KDCollectionColumns * KDCollectionSpacing/2 - 400, + y - KDCollectionSpacing + 14, 64, 64, + TextGet("KDAutoRelease_Escaped"), KDGameData.AutoRelease.Escaped, + false, "#ffffff", undefined, { + fontSize: 24 + }); + + + + // Collection + let guests = []; + let filters = []; + for (let f of Object.values(KDCollectionFilters)) { + if (f.Current && f.Options[f.Current]) { + filters.push(f.FilterCode[f.Options[f.Current]]); + } + } + let rendered = []; + let cf = KDCollFilter ? KDCollFilter.toLocaleUpperCase() : null; + // Iterate thru the collection, parting out the notable ones to the top + for (let value of KDGameData.CollectionSorted) { + if (value.status) KDGetPersistentNPC(value.id); // All guests and servants are persistent + if (cf && !(( + value.name.toLocaleUpperCase() + .includes(cf) + ) || ( + value.type?.toLocaleUpperCase() + .includes(cf) + ) || ( + TextGet("Name" + value.type).toLocaleUpperCase() + .includes(cf) + ) || ( + value.Faction && TextGet("KinkyDungeonFaction" + value.Faction).toLocaleUpperCase() + .includes(cf) + ))) { + continue; + } + if (value.status == "Servant") { + guests.push(value); + continue; + } + if (value.status != KDCollectionTabStatus) continue; + + + if (KDCollectionSelected == value.id) selectedIndex = II + 1; + + if (filters.length > 0 && filters.some((filter) => {return !filter(value);})) continue; + + if (II++ < KDCollectionIndex || row >= KDCollectionRows) continue; + + rendered.push(value); + + let sp = (value.sprite || value.type); + let dir = "Enemies/"; + let enemyType = value.Enemy || KinkyDungeonGetEnemyByName(value.type); + + if (!value.status) { + // Prisoner + dir = value.customSprite ? "Enemies/CustomSpriteBound/" : "EnemiesBound/"; + if (!value.customSprite) sp = enemyType.bound; + } else { + dir = value.customSprite ? "Enemies/CustomSprite/" : "Enemies/"; + } + + + if (DrawButtonKDEx(value.name + "_coll," + value.id, (_data) => { + KDCollectionSelected = value.id; + KDResetCollectionUI(); + return true; + }, true, + XX, + YY, + 79, 79, "", "#ffffff", KinkyDungeonRootDirectory + dir + sp + ".png", + "", false, KDCollectionSelected != value.id, KDButtonColor, undefined, undefined, {centered: true} + )) { + DrawTextFitKD(value.name, MouseX, MouseY - 50, 800, "#ffffff", (value.color && value.color != "#ffffff") ? value.color : KDTextGray05, 24); + } + + if (drawCallback) drawCallback(value, XX, YY); + + if (KDNPCUnavailable(value.id, value.status) || value.escapegrace) { + let icon = KDGetPersistentNPC(value.id)?.captured + ? "Inspect" + : ((value.escaped ? "escaped" + : (value.escapegrace ? "escapegrace" : "jail"))); + KDDraw(kdcanvas, kdpixisprites, value.name + "_jail," + value.id, + KinkyDungeonRootDirectory + "UI/" + icon + ".png", + XX + 36, + YY + 36, + 36, 36, undefined, { + zIndex: 110 + }); + } else if (value.status && KDIsInPartyID(value.id)) { + KDDraw(kdcanvas, kdpixisprites, value.name + "_party," + value.id, + KinkyDungeonRootDirectory + "UI/Star.png", + XX + 48, + YY + 48, + 28, 28, undefined, { + zIndex: 110 + }); + } + if (value.Facility) { + KDDraw(kdcanvas, kdpixisprites, value.name + "_fac," + value.id, + KinkyDungeonRootDirectory + "UI/Facility/" + value.Facility + ".png", + XX, + YY + 36, + 36, 36, undefined, { + zIndex: 110 + }); + } + /*KDDraw(kdcanvas, kdpixisprites, value.name + "_coll," + value.id, KinkyDungeonRootDirectory + dir + sp + ".png", + XX, + YY, + 72, 72, undefined);*/ + + column++; + if (column >= KDCollectionColumns) { + column = 0; + row++; + XX = x; + YY += KDCollectionSpacing; + } else XX += KDCollectionSpacing; + } + // Iterate thru guests array + YY = y; + XX = x; + column = 0; + row = 0; + + + for (let i = 0; i < KDCollectionColumns * KDCollectionGuestRows; i++) { + if (i < guests.length) { + // We have a member + let value = guests[i]; + let sp = (value.sprite || value.type); + let dir = "Enemies/"; + let enemyType = value.Enemy || KinkyDungeonGetEnemyByName(value.type); + + if (!value.status) { + // Prisoner + dir = value.customSprite ? "Enemies/CustomSpriteBound/" : "EnemiesBound/"; + if (!value.customSprite) sp = enemyType.bound; + } else { + dir = value.customSprite ? "Enemies/CustomSprite/" : "Enemies/"; + } + + + if (DrawButtonKDEx(value.name + "_guest," + value.id, (_data) => { + KDCollectionSelected = value.id; + KDResetCollectionUI(); + return true; + }, true, + XX, + YY, + 79, 79, "", "#ffffff", KinkyDungeonRootDirectory + dir + sp + ".png", + "", false, KDCollectionSelected != value.id, KDButtonColor, undefined, undefined, {centered: true} + )) { + DrawTextFitKD(value.name, MouseX, MouseY - 50, 800, "#ffffff", (value.color && value.color != "#ffffff") ? value.color : KDTextGray05, 24); + } + + if (drawCallback) drawCallback(value, XX, YY); + + + if (KDNPCUnavailable(value.id, value.status) || value.escapegrace) { + let icon = KDGetPersistentNPC(value.id)?.captured + ? "Inspect" + : ((value.escaped ? "escaped" + : (value.escapegrace ? "escapegrace" : "jail"))); + KDDraw(kdcanvas, kdpixisprites, value.name + "_jail," + value.id, + KinkyDungeonRootDirectory + "UI/" + icon + ".png", + XX + 42, + YY + 42, + 36, 36, undefined, { + zIndex: 110 + }); + } else if (value.status && KDIsInPartyID(value.id)) { + KDDraw(kdcanvas, kdpixisprites, value.name + "_party," + value.id, + KinkyDungeonRootDirectory + "UI/Star.png", + XX + 48, + YY + 48, + 28, 28, undefined, { + zIndex: 110 + }); + } + if (value.Facility) { + KDDraw(kdcanvas, kdpixisprites, value.name + "_fac," + value.id, + KinkyDungeonRootDirectory + "UI/Facility/" + value.Facility + ".png", + XX, + YY + 36, + 36, 36, undefined, { + zIndex: 110 + }); + } + } else { + // Render empty square + FillRectKD(kdcanvas, kdpixisprites, "guestslot_" + i, { + Left: XX, + Top: YY, + Width: 79, + Height: 79, + Color: "#000000", + LineWidth: 1, + zIndex: -20, + alpha: 0.5 + }); + } + + column++; + if (column >= KDCollectionColumns) { + column = 0; + row++; + XX = x; + YY += KDCollectionSpacing; + } else XX += KDCollectionSpacing; + } + + if (KDCollectionSelected && KDGameData.Collection[KDCollectionSelected]) { + KDDrawSelectedCollectionMember(KDGameData.Collection[KDCollectionSelected], x - 460, 150, selectedIndex, KDCollectionTab); + } else DrawTextFitKD(TextGet("KDCollectionSelect"), x - 240, 500, 500, "#ffffff", KDTextGray0, 24); + + + KDDrawnCollectionInventory = rendered; +} + +/** + * @param value + */ +function KDValidateEscapeGrace(value: KDCollectionEntry): boolean { + if (KDWantsToEscape(value)) { + let entity = KDGetGlobalEntity(value.id); + let bondageAmount = Math.min(entity?.boundLevel || 0, + KDGetExpectedBondageAmountTotal(value.id, entity)); + let enemy = KinkyDungeonGetEnemyByName(value.type); + if (enemy && bondageAmount < enemy.maxhp * KDNPCStruggleThreshMultType(enemy)) { + value.escapegrace = true; + } else value.escapegrace = undefined; + } else value.escapegrace = undefined; + return value.escapegrace; +} + +function KDSortCollection() { + KDValidateAllFacilities(); + if (!KDGameData.Collection) { + KDGameData.Collection = {}; + } + + for (let value of Object.values(KDGameData.Collection)) { + KDValidateEscapeGrace(value); + } + + + + + KDGameData.CollectionGuests = 0; + KDGameData.CollectionSorted = Object.values(KDGameData.Collection).sort( + (a, b) => { + let apri = KDEnemyTypeRank(KinkyDungeonGetEnemyByName(a.type)); + let bpri = KDEnemyTypeRank(KinkyDungeonGetEnemyByName(b.type)); + if (KDNPCUnavailable(a.id, a.status)) apri -= 100; + if (KDNPCUnavailable(b.id, b.status)) bpri -= 100; + if (a.escaped) apri -= 20; + else if (a.escapegrace) apri -= 10; + if (b.escaped) bpri -= 20; + else if (b.escapegrace) bpri -= 10; + if (a.status) apri += 1000; + if (b.status) bpri += 1000; + return bpri-apri; + } + ); + for (let a of KDGameData.CollectionSorted) { + if (a.status == "Servant") KDGameData.CollectionGuests++; + } + +} + +/** + * @param enemy + */ +function KDGenEnemyName(enemy: entity): string { + if (enemy?.Enemy?.nonHumanoid) return TextGet("Name" + enemy.Enemy.name); + let faction = KDGetFaction(enemy) || KDGetFactionOriginal(enemy); + let nameList = KDFactionProperties[faction]?.nameList ? KDFactionProperties[faction].nameList[Math.floor(Math.random() * KDFactionProperties[faction].nameList.length)] : faction; + if (enemy.Enemy?.nameList) nameList = enemy.Enemy?.nameList; + if (KDNameList[nameList]) return KDNameList[nameList][Math.floor(KDNameList[nameList].length * KDRandom())]; + else return KDNameList.default[Math.floor(KDNameList.default.length * KDRandom())]; +} + +/** + * @deprecated + * @param enemy + */ +function KDGetEnemyName(enemy: entity): string { + return KDGenEnemyName(enemy); +} + + +let KDCollectionTabScreen = { + +}; + +let KDCollectionTabDraw: Record = { + Imprison: (value, buttonSpacing, III, x, y) => { + let entity = KinkyDungeonFindID(value.id) || KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + if (DrawButtonKDEx("ImprisonNPC", (_b) => { + + if (entity || KDNPCUnavailable(value.id, value.status)) { + return false; + } + + let tile = KinkyDungeonTilesGet(KDGameData.InteractTargetX + ',' + KDGameData.InteractTargetY); + let furn = KDFurniture[tile.Furniture]; + let rest = KinkyDungeonGetRestraint( + {tags: [furn.restraintTag]}, MiniGameKinkyDungeonLevel, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, + "", + true, + false, + false, undefined, true); + if (rest) { + let en = DialogueCreateEnemy(KDGameData.InteractTargetX, KDGameData.InteractTargetY, + (value.Enemy || KinkyDungeonGetEnemyByName(value.type)).name, value.id, true); + if (en) { + KDImprisonEnemy(en, true, "PrisonerJailOwn", { + name: rest.name, + lock: "White", + id: KinkyDungeonGetItemID(), + faction: KDDefaultNPCBindPalette, + }); + //en.ceasefire = 9999; + en.playWithPlayer = 0; + if (KDNPCChar.get(en.id)) + KDRefreshCharacter.set(KDNPCChar.get(en.id), true); + KDUpdatePersistentNPC(en.id, true); + //KinkyDungeonDrawState = "Game"; + KinkyDungeonAdvanceTime(1); + } + } + + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "LockHeavy" + ".ogg"); + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/Imprison.png", + undefined, undefined, entity != undefined, + KDNPCUnavailable(value.id, value.status) ? "#ff5277" : KDButtonColor, undefined, undefined, { + centered: true, + })) { + DrawTextFitKD(TextGet("KDImprison"), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + return III; + }, + Dropoff: (value, buttonSpacing, III, x, y) => { + let entity = KinkyDungeonFindID(value.id) || KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + if (DrawButtonKDEx("DropoffNPC", (_b) => { + + if (entity || KDNPCUnavailable(value.id, value.status)) { + return false; + } + + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (nearestJail && nearestJail.x == KDGameData.InteractTargetX && nearestJail.y == KDGameData.InteractTargetY) { + let rest = KinkyDungeonGetRestraint({tags: nearestJail.restrainttags}, + KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, + "", + true, + false, + false, undefined, true); + if (rest) { + let en = DialogueCreateEnemy(KDGameData.InteractTargetX, KDGameData.InteractTargetY, + (value.Enemy || KinkyDungeonGetEnemyByName(value.type)).name, value.id, true); + if (en) { + KDBreakTether(en); + KDMoveEntity(en, + KDGameData.InteractTargetX + (nearestJail.direction?.x || 0), + KDGameData.InteractTargetY + (nearestJail.direction?.y || 0), false); + KDSetNPCRestraint(en.id, "Device", { + name: rest.name, + lock: "White", + id: KinkyDungeonGetItemID(), + faction: KDDefaultNPCBindPalette, + }); + KDNPCRestraintTieUp(en.id, { + name: rest.name, + lock: "White", + id: KinkyDungeonGetItemID(), + faction: KDDefaultNPCBindPalette, + }, 1); + //en.ceasefire = 9999; + en.playWithPlayer = 0; + if (KDNPCChar.get(en.id)) + KDRefreshCharacter.set(KDNPCChar.get(en.id), true); + KDUpdatePersistentNPC(en.id, true); + //KinkyDungeonDrawState = "Game"; + KinkyDungeonAdvanceTime(1); + } + } + + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "LockHeavy" + ".ogg"); + } + + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/Imprison.png", + undefined, undefined, entity != undefined, + KDNPCUnavailable(value.id, value.status) ? "#ff5277" : KDButtonColor, undefined, undefined, { + centered: true, + })) { + DrawTextFitKD(TextGet("KDImprison"), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + return III; + }, + Restrain: (value, buttonSpacing, III, x, y) => { + if (KDGameData.Collection[value.id + ""] && DrawButtonKDEx("RestrainFree", (_b) => { + if (!KDIsNPCPersistent(value.id) || KDGetPersistentNPC(value.id).collect) + KDSendInput("freeNPCRestraint", { + npc: value.id, + player: KDPlayer().id, + }); + else { + KinkyDungeonSendTextMessage(10, TextGet("KDCantFree"), "#ffffff", 2, true, true); + } + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Struggle" + ".ogg"); + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/RestrainFree.png", + undefined, undefined, false, (!KDIsNPCPersistent(value.id) || KDGetPersistentNPC(value.id).collect) ? + KDButtonColor : "#ff5277")) { + DrawTextFitKD(TextGet("KDFreePrisoner"), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + if (DrawButtonKDEx("returnToCollectionRestrain", (_b) => { + KDCurrentRestrainingTarget = 0; + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "LockLight" + ".ogg"); + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/RestrainBack.png", + undefined, undefined, false)) { + DrawTextFitKD(TextGet("KDRestrainNPCBack"), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + return III; + }, + Default: (value, buttonSpacing, III, x, y) => { + if (KDPromotableStatus.includes(value.status) && DrawButtonKDEx("promoteNPC", (_b) => { + if (!(KDGameData.CollectionGuests >= KDCollectionGuestRows*KDCollectionColumns)) { + if (KDCanPromote(value)) { + KDPromote(value); + + KDSortCollection(); + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Magic" + ".ogg"); + } else if (KDIsInPartyID(value.id)) { + KDRemoveFromPartyID(value.id, false); + KDSortCollection(); + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Magic" + ".ogg"); + } + } + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, "", "#ffffff", KinkyDungeonRootDirectory + "UI/Promote.png", + undefined, undefined, false, (!KDCanPromote(value) || KDGameData.CollectionGuests >= KDCollectionGuestRows*KDCollectionColumns) ? "#ff5277" : "")) { + DrawTextFitKD(TextGet(KDCanPromote(value) ? "KDPromoteNPC" : + (KDIsInPartyID(value.id) ? "KDPromoteRemoveFromParty" : "KDPromoteNotEnough") + ), x + 220, y + 750, 500, "#ffffff", KDTextGray0); + } else if (value.status == "Servant" && DrawButtonKDEx("demoteNPC", (_b) => { + value.status = value.oldstatus || ""; + delete value.Facility; + KDSortCollection(); + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Damage" + ".ogg"); + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, "", "#ffffff", KinkyDungeonRootDirectory + "UI/Demote.png", + undefined, undefined, false)) { + DrawTextFitKD(TextGet("KDDemoteNPC"), x + 220, y + 750, 500, "#ffffff", KDTextGray0); + } + + if ((!value.status + || Object.values(KDGetNPCRestraints(value.id)).length > 0 + || KDIsOKWithRestraining(value)) + && !KDNPCUnavailable(value.id, value.status)) + if (DrawButtonKDEx("CollectionRestrain", (_b) => { + KDCurrentRestrainingTarget = value.id; + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Chain" + ".ogg"); + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/Restrain.png", + undefined, undefined, false)) { + DrawTextFitKD(TextGet("KDRestrainNPC"), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + + + if (value.status == "Guest" && DrawButtonKDEx("removeGuest", (_b) => { + if (!KDConfirmOverInventoryAction) { + KDConfirmOverInventoryAction = true; + } else { + KDSendInput("removeGuest", { + selection: {[value.id]: true}, + player: KDPlayer().id, + }); + KDConfirmOverInventoryAction = false; + } + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Damage" + ".ogg"); + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, "", "#ffffff", + KinkyDungeonRootDirectory + "UI/Buttons/RemoveGuest" + (KDConfirmOverInventoryAction ? "Confirm" : "") + ".png", + undefined, undefined, false)) { + DrawTextFitKD(TextGet("KDKickOutGuest" + (KDConfirmOverInventoryAction ? "Confirm" : "")), x + 220, y + 750, 500, "#ffffff", KDTextGray0); + } + + if (KDSummonableStatus.includes(value.status) + && DrawButtonKDEx("summonServant", (_b) => { + if (!KDNPCUnavailable(value.id, value.status) + && KDIsInSummit() + && !KinkyDungeonFindID(value.id)) { + let point = KinkyDungeonGetNearbyPoint(KDPlayer().x, KDPlayer().y, true); + if (point) { + let en = DialogueCreateEnemy(KDGameData.InteractTargetX, KDGameData.InteractTargetY, + (value.Enemy + || KinkyDungeonGetEnemyByName(value.type)).name, + value.id, true); + if (en) { + KDFreeNPC(en); + //en.ceasefire = 9999; + en.playWithPlayer = 0; + if (KDNPCChar.get(en.id)) + KDRefreshCharacter.set(KDNPCChar.get(en.id), true); + KDUpdatePersistentNPC(en.id, true); + KDMovePersistentNPC(en.id, KDGetCurrentLocation()); + KinkyDungeonAdvanceTime(1); + } + } + } + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, + 80, 80, "", "#ffffff", KinkyDungeonRootDirectory + "UI/Buttons/Summon.png", + undefined, undefined, false, + ( + KDNPCUnavailable(value.id, value.status) + || !KDIsInSummit() + || KinkyDungeonFindID(value.id) + ) + ? "#ff5277" : "")) { + let tt = "KDSummonServant"; + if (KDNPCUnavailable(value.id, value.status)) tt = "KDSummonServantUnavailable"; + else if (!KDIsInSummit()) tt = "KDSummonServantSummit"; + else if (KinkyDungeonFindID(value.id)) tt = "KDSummonServantAlreadyPresent"; + + DrawTextFitKD(TextGet(tt), + x + 220, y + 750, 500, "#ffffff", KDTextGray0); + } + + return III; + } +}; + +/** + * @param value + * @param x + * @param y + * @param width + * @returns II + */ +function KDDrawNPCBars(value: KDCollectionEntry, x: number, y: number, width: number): number { + let enemy = KDGetGlobalEntity(value.id); + if (!enemy) return 0; + + KDEaseBars(enemy, KDDrawDelta || 0); + + let oldEnemy = enemy.Enemy; + KDUnPackEnemy(enemy); + + let defaultSpeed = KDIsImprisoned(enemy) || !KinkyDungeonFindID(enemy.id); + + let tooltip = ""; + let tooltipcolor = "#ffffff"; + let tooltipAmt = 0; + let II = 0; + let height = 12; + let spacing = height + 2; + let yy = 0; + let maxBars = KDNPCStruggleThreshMult(enemy); + // Draw binding bars + //let helpless = KDHelpless(enemy); + let bindAmpMod = 1;//KDGetBindAmp(enemy, bindAmpMfodBase); + if (enemy.boundLevel != undefined && enemy.boundLevel > 0) { + let visualbond = bindAmpMod * enemy.visual_boundlevel; + let bindingBars = maxBars;//Math.ceil( visualbond / enemy.Enemy.maxhp); + let SM = KDGetEnemyStruggleMod(enemy, true, defaultSpeed, false); + let futureBound: Record = KDPredictStruggle(enemy, SM, 1); + yy += Math.min(maxBars, bindingBars) * spacing - 10; + for (let i = 0; i < bindingBars && i < maxBars; i++) { + if (i > 0) II++; + let mod = visualbond - bindAmpMod * futureBound.boundLevel; + // Part that will be struggled out of + KinkyDungeonBarTo(kdcanvas, x, y + yy - spacing*II, + width, height, Math.min(1, (visualbond - i * enemy.Enemy.maxhp) / enemy.Enemy.maxhp) * 100, "#ffffff", "#222222"); + // Separator between part that will be struggled and not + KinkyDungeonBarTo(kdcanvas, 1 + x, y + yy - spacing*II, + width, height, Math.min(1, (visualbond - mod - i * enemy.Enemy.maxhp) / enemy.Enemy.maxhp) * 100, "#444444", "none"); + + } + II -= Math.max(0, Math.min(bindingBars-1, maxBars-1)); + // Temp value of bondage level, decremented based on special bound level and priority + let bb = 0; + let bcolor = "#ffae70"; + let bondage = []; + if (futureBound.specialBoundLevel) { + for (let b of Object.entries(futureBound.specialBoundLevel)) { + bondage.push({name: b[0], amount: b[1] * bindAmpMod, level: 0, pri: KDSpecialBondage[b[0]].priority}); + } + bondage = bondage.sort((a, b) => { + return b.pri - a.pri; + }); + } else { + bondage.push({name: "Normal", amount: 0, level: futureBound.boundLevel, pri: 0}); + } + + for (let b of bondage) { + if (!b.level) { + b.level = bb + b.amount; + bb = b.level; + } + } + for (let i = 0; i < bindingBars && i < maxBars; i++) { + if (i > 0) II++; + // Determine current bondage type + let bars = false; + for (let bi = bondage.length - 1; bi >= 0; bi--) { + let b = bondage[bi]; + // Filter out anything that doesnt fit currently + if (b.level > i * enemy.Enemy.maxhp) { + bcolor = KDSpecialBondage[b.name] ? KDSpecialBondage[b.name].color : "#ffae70"; + // Struggle bars themselves + if (MouseIn(x, y + yy - spacing*II,width, height)) { + tooltip = "KDBindType_" + b.name; + tooltipcolor = bcolor; + tooltipAmt = b.level; + } + KinkyDungeonBarTo(kdcanvas, x, y + yy - spacing*II, + width, height, Math.min(1, (Math.max(0, b.level - i * enemy.Enemy.maxhp)) / enemy.Enemy.maxhp) * 100, bcolor, "none", + undefined, undefined, bars ? [0.25, 0.5, 0.75] : undefined, bars ? "#85522c" : undefined, bars ? "#85522c" : undefined, 57.5 + b.pri*0.01); + bars = true; + } + + } + + } + enemy.Enemy = oldEnemy; + if (tooltip) { + DrawTextFitKD(TextGet(tooltip) + ` (${Math.round(10 * tooltipAmt)})`, MouseX, MouseY - 25, 250, tooltipcolor, "#000000"); + } + return bindingBars; + } + enemy.Enemy = oldEnemy; + return 0; +} + +/** + * Whether or not you can promote to servant + * @param value + */ +function KDCanPromote(value: KDCollectionEntry): boolean { + return KDGetModifiedOpinionID(value.id) > 0 || value.Opinion > 0; +} + +function KDPromote(value: KDCollectionEntry) { + value.status = "Servant"; + if (KDIsNPCPersistent(value.id)) { + KDGetPersistentNPC(value.id).collect = true; + if (KDGetPersistentNPC(value.id).entity) + delete KDGetPersistentNPC(value.id).entity.hostile; + KDUpdatePersistentNPC(value.id); + } + delete value.Facility; +} + + +function KDIsInSummit() { + return KDGameData.RoomType == "Summit"; +} + +function KDTickAutorelease() { + for (let value of Object.values(KDGameData.Collection)) { + if (value.escaped) { + KDReleaseNPC(value.id, KDPlayer().id); + KinkyDungeonSendTextMessage(10, TextGet("KDAutoReleased_Escaped") + .replace("NME", value.name), + "#ffffff", 4); + } + } +} + +function KDDoCollect(entity: entity): boolean { + if (KDGameData.AutoRelease?.NonNotable) { + let notable = KDIsNPCPersistent(entity.id); + if (!notable) { + if (KDEnemyRank(entity) >= 4) return true; + } + return notable; + } + return true; +} + +function KDDefectIfPossible(entity: entity, defectTo: string = "Player"): boolean { + // TODO make this more complicated + let op = KDGetModifiedOpinionID(entity.id); + + if (op > 0 && !entity.hostile && entity.faction != "Player" && entity.faction != defectTo) { + entity.faction = defectTo; + return true; + } + return false; +} \ No newline at end of file diff --git a/Game/src/collection/NPCAutoBind.ts b/Game/src/collection/NPCAutoBind.ts new file mode 100644 index 000000000..f60156a91 --- /dev/null +++ b/Game/src/collection/NPCAutoBind.ts @@ -0,0 +1,216 @@ +let KDAutoBindRestraints: Record = null; +let KDAutoBindRestraintsName = ""; + +KDCollectionTabDraw.AutoBind = (value, buttonSpacing, III, x, y) => { + let entity = KinkyDungeonFindID(value.id) || KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + if (DrawButtonKDEx("NPCCopyBondage", (b) => { + + if (!KDGetNPCRestraints(value.id) || Object.values(KDGetNPCRestraints(value.id)).length == 0) { + return false; + } + + KDAutoBindRestraints = JSON.parse(JSON.stringify(KDGetNPCRestraints(value.id))); + KDAutoBindRestraintsName = (KDGameData.Collection[value.id + ""] || KDGetVirtualCollectionEntry(value.id)).name; + + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "LockLight" + ".ogg"); + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/AutoBindCopy.png", + undefined, undefined, entity != undefined, + (!KDGetNPCRestraints(value.id) || Object.values(KDGetNPCRestraints(value.id)).length == 0) ? "#ff5277" : KDButtonColor, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeyUpcast[0]), + hotkeyPress: KinkyDungeonKeyUpcast[0], + })) { + DrawTextFitKD(TextGet("KDAutoBindCopy"), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + if (DrawButtonKDEx("NPCPasteBondage", (b) => { + + if (KDAutoBindRestraints && !KDNPCUnavailable(value.id, value.status)) { + let restraints = KDAutoBindRestraints; + if (restraints) { + // Readd + for (let i = 0; i < 2; i++) // To bruteforce conditions + for (let inv of Object.entries(restraints)) { + let hasInv = (KinkyDungeonInventoryGetSafe(inv[1].name) + && KinkyDungeonInventoryGetSafe(inv[1].name).quantity != 0); + if ( + hasInv + || (KDGenericRestraintRawCache[inv[1].name] + && KinkyDungeonInventoryGetSafe(KDGenericRestraintRawCache[inv[1].name].raw)?.quantity + > KDGenericRestraintRawCache[inv[1].name].count + ) + ) { + if (KDInputSetNPCRestraint({ + slot: inv[0], + id: undefined, + faction: inv[1].faction, + restraint: inv[1].name, + restraintid: inv[1].id, + lock: inv[1].lock, + events: inv[1].events, + powerbonus: inv[1].powerbonus, + inventoryVariant: inv[1].inventoryVariant, + + npc: value.id, + player: KDPlayer().id, + })) { + if (!hasInv) { + KinkyDungeonInventoryGetSafe(KDGenericRestraintRawCache[inv[1].name].raw).quantity + -= KDGenericRestraintRawCache[inv[1].name].count; + if (KinkyDungeonInventoryGetSafe(KDGenericRestraintRawCache[inv[1].name].raw).quantity + <= 0) { + KinkyDungeonInventoryRemoveSafe( + KinkyDungeonInventoryGetSafe(KDGenericRestraintRawCache[inv[1].name].raw) + ); + } + } + } + + } + } + KDValidateEscapeGrace(value); + } + if (KDNPCChar.get(value.id)) + KDRefreshCharacter.set(KDNPCChar.get(value.id), true); + } + + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "LockLight" + ".ogg"); + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/AutoBindPaste.png", + undefined, undefined, entity != undefined, + (!KDAutoBindRestraints || KDNPCUnavailable(value.id, value.status)) ? "#ff5277" : KDButtonColor, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeyEnter[0]), + hotkeyPress: KinkyDungeonKeyEnter[0], + })) { + let missingAll = KDAutoBindRestraints ? Object.values(KDAutoBindRestraints).length > 0 : false; + if (KDAutoBindRestraints) + for (let inv of Object.entries(KDAutoBindRestraints)) { + if ( + (KinkyDungeonInventoryGetSafe(inv[1].name) + && KinkyDungeonInventoryGetSafe(inv[1].name).quantity != 0) + || (KDGenericRestraintRawCache[inv[1].name] + && KinkyDungeonInventoryGetSafe(KDGenericRestraintRawCache[inv[1].name].raw)?.quantity + > KDGenericRestraintRawCache[inv[1].name].count + ) + ) { + missingAll = false; + break; + } + } + + DrawTextFitKD(TextGet(missingAll ? "KDAutoBindPasteNone" : "KDAutoBindPaste").replace("NME", KDAutoBindRestraintsName), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + if (KDGameData.Collection[value.id + ""] && DrawButtonKDEx("RestrainFree", (b) => { + if (!KDIsNPCPersistent(value.id) || KDGetPersistentNPC(value.id).collect) + KDSendInput("freeNPCRestraint", { + npc: value.id, + player: KDPlayer().id, + }); + else { + KinkyDungeonSendTextMessage(10, TextGet("KDCantFree"), "#ffffff", 2, true, true); + } + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Struggle" + ".ogg"); + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/RestrainFree.png", + undefined, undefined, false, (!KDIsNPCPersistent(value.id) || KDGetPersistentNPC(value.id).collect) ? + KDButtonColor : "#ff5277", undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeyUpcast[1]), + hotkeyPress: KinkyDungeonKeyUpcast[1], + })) { + DrawTextFitKD(TextGet("KDFreePrisoner"), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + + if (DrawButtonKDEx("NPCPasteBondageAll", (b) => { + + if (KDAutoBindRestraints) { + let eligible: KDCollectionEntry[] = []; + + for (let vv of KDDrawnCollectionInventory) { + if (!KDNPCUnavailable(vv.id, vv.status)) eligible.push(vv); + } + + for (let v of eligible) { + let restraints: Record = JSON.parse(JSON.stringify(KDAutoBindRestraints)); + if (restraints && !KDNPCUnavailable(v.id, v.status)) { + for (let i = 0; i < 2; i++) // To bruteforce conditions + for (let inv of Object.entries(restraints)) { + let hasInv = (KinkyDungeonInventoryGetSafe(inv[1].name) + && KinkyDungeonInventoryGetSafe(inv[1].name).quantity != 0); + if ( + hasInv + || (KDGenericRestraintRawCache[inv[1].name] + && KinkyDungeonInventoryGetSafe(KDGenericRestraintRawCache[inv[1].name].raw)?.quantity + > KDGenericRestraintRawCache[inv[1].name].count + ) + ) { + if (KDInputSetNPCRestraint({ + slot: inv[0], + id: undefined, + faction: inv[1].faction, + restraint: inv[1].name, + restraintid: inv[1].id, + lock: inv[1].lock, + events: inv[1].events, + powerbonus: inv[1].powerbonus, + inventoryVariant: inv[1].inventoryVariant, + + npc: value.id, + player: KDPlayer().id, + })) { + if (!hasInv) { + KinkyDungeonInventoryGetSafe(KDGenericRestraintRawCache[inv[1].name].raw).quantity + -= KDGenericRestraintRawCache[inv[1].name].count; + if (KinkyDungeonInventoryGetSafe(KDGenericRestraintRawCache[inv[1].name].raw).quantity + <= 0) { + KinkyDungeonInventoryRemoveSafe( + KinkyDungeonInventoryGetSafe(KDGenericRestraintRawCache[inv[1].name].raw) + ); + } + } + } + } + } + KDValidateEscapeGrace(v); + } + } + if (KDNPCChar.get(value.id)) + KDRefreshCharacter.set(KDNPCChar.get(value.id), true); + + } + + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "LockLight" + ".ogg"); + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/AutoBindPasteAllOver.png", + undefined, undefined, entity != undefined, + (!KDAutoBindRestraints || KDNPCUnavailable(value.id, value.status)) ? "#ff5277" : KDButtonColor)) { + let missingAll = KDAutoBindRestraints ? Object.values(KDAutoBindRestraints).length > 0 : false; + if (KDAutoBindRestraints) + for (let inv of Object.entries(KDAutoBindRestraints)) { + if ( + (KinkyDungeonInventoryGetSafe(inv[1].name) + && KinkyDungeonInventoryGetSafe(inv[1].name).quantity != 0) + || (KDGenericRestraintRawCache[inv[1].name] + && KinkyDungeonInventoryGetSafe(KDGenericRestraintRawCache[inv[1].name].raw)?.quantity + > KDGenericRestraintRawCache[inv[1].name].count + ) + ) { + missingAll = false; + break; + } + } + DrawTextFitKD(TextGet(missingAll ? "KDAutoBindPasteNone" : "KDAutoBindPasteAll").replace("NME", KDAutoBindRestraintsName), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + + return III; +}; \ No newline at end of file diff --git a/Game/src/collection/NPCRelease.ts b/Game/src/collection/NPCRelease.ts new file mode 100644 index 000000000..fc537e2ac --- /dev/null +++ b/Game/src/collection/NPCRelease.ts @@ -0,0 +1,218 @@ +let KDCollectionReleaseSelection: Record = {}; + +// @ts-ignore: squelch error: block-scoped variable used before declaration. +KDCollectionTabDraw.Release = (value, buttonSpacing, III, x, y) => { + let tooltip = false; + if (DrawButtonKDEx("KDReleaseRelease", (b) => { + + KDSendInput("releaseNPC", { + selection: KDCollectionReleaseSelection, + player: KDPlayer().id, + }); + + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Dollify" + ".ogg"); + + // DamageWeak + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/Buttons/Release.png", + undefined, undefined, Object.keys(KDCollectionReleaseSelection).length == 0, + (Object.keys(KDCollectionReleaseSelection).length == 0) ? "#ff5277" : KDButtonColor, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeyUpcast[0]), + hotkeyPress: KinkyDungeonKeyUpcast[0], + })) { + tooltip = true; + DrawTextFitKD(TextGet("KDReleaseRelease"), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + + let ransomValue = 0; + for (let v of Object.keys(KDCollectionReleaseSelection)) { + if (KDCanRansom(parseInt(v))) { + ransomValue += KDRansomValue(parseInt(v)); + } + } + + DrawTextFitKD("" + Math.round(ransomValue), x + 10 + buttonSpacing*III + 40, y + 68 + 730 - 10 - 80, 500, "#ffffff", + KDTextGray0, 18); + + if (DrawButtonKDEx("KDReleaseRansom", (b) => { + + if (ransomValue > 0) + KDSendInput("ransomNPC", { + selection: KDCollectionReleaseSelection, + player: KDPlayer().id, + }); + + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Coin" + ".ogg"); + + // DamageWeak + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/Buttons/Ransom.png", + undefined, undefined, Object.keys(KDCollectionReleaseSelection).length == 0, + (ransomValue == 0 || Object.keys(KDCollectionReleaseSelection).length == 0) ? "#ff5277" : KDButtonColor, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeyUpcast[1]), + hotkeyPress: KinkyDungeonKeyUpcast[1], + })) { + tooltip = true; + DrawTextFitKD(TextGet("KDReleaseRansom").replace("GP", "" + Math.round(ransomValue)), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + + + if (DrawButtonKDEx("KDReleaseUnMarkAll", (b) => { + + KDCollectionReleaseSelection = {}; + + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Damage" + ".ogg"); + + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/Buttons/UnmarkAll.png", + undefined, undefined, Object.keys(KDCollectionReleaseSelection).length == 0, + (Object.keys(KDCollectionReleaseSelection).length == 0) ? "#ff5277" : KDButtonColor, undefined, undefined, { + + })) { + tooltip = true; + DrawTextFitKD(TextGet("KDReleaseUnMarkAll"), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + if (DrawButtonKDEx("KDReleaseMarkAll", (b) => { + + KDCollectionReleaseSelection = {}; + + for (let v of KDDrawnCollectionInventory) { + if (KDCanRelease(v.id)) + KDCollectionReleaseSelection[v.id] = true; + } + + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Danger" + ".ogg"); + + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/Buttons/MarkAll.png", + undefined, undefined, Object.keys(KDCollectionReleaseSelection).length == KDDrawnCollectionInventory.length, + (Object.keys(KDCollectionReleaseSelection).length == KDDrawnCollectionInventory.length) ? "#ff5277" : KDButtonColor, undefined, undefined, { + + })) { + tooltip = true; + DrawTextFitKD(TextGet("KDReleaseMarkAll"), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + + if (DrawButtonKDEx("KDReleaseMarkUnmark", (b) => { + + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + (!KDCollectionReleaseSelection[value.id] ? "DangerWeak" : "DamageWeak") + ".ogg"); + + if (KDCollectionReleaseSelection[value.id]) delete KDCollectionReleaseSelection[value.id]; + else if (KDCanRelease(value.id)) KDCollectionReleaseSelection[value.id] = true; + + + return true; + }, true, x + 10 + buttonSpacing*III++, y + 730 - 10 - 80, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + + "UI/Buttons/" + (KDCollectionReleaseSelection[value.id] ? "Unmark" : "Mark") + ".png", + undefined, undefined, false, + KDButtonColor, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeyEnter[0]), + hotkeyPress: KinkyDungeonKeyEnter[0], + })) { + tooltip = true; + DrawTextFitKD(TextGet("KDRelease" + (KDCollectionReleaseSelection[value.id] ? "Unmark" : "Mark")), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + + if (!tooltip) { + DrawTextFitKD(TextGet("KDRansomValue").replace("GP", + KDCanRansom(value.id) ? ("" + Math.round(KDRansomValue(value.id))) : TextGet("KDNA")), x + 220, y + 750, 500, "#ffffff", + KDTextGray0); + } + DrawTextFitKD(TextGet("KDCurrentGold").replace("GP", "" + Math.round(KinkyDungeonGold)), x + 220, y + 785, 500, "#ffffff", + KDTextGray0); + + + return III; +}; + +// @ts-ignore: squelch error: block-scoped variable used before declaration. +KDCollectionTabScreen.Release = (x, xOffset) => { + KDDrawCollectionInventory(x + xOffset, 150, (value, x, y) => { + if (KDCollectionReleaseSelection[value.id]) + KDDraw(kdcanvas, kdpixisprites, value.name + "_crossout," + value.id, + KinkyDungeonRootDirectory + "UI/Crossout.png", + x + 36, + y + 36, + 72, 72, undefined, { + zIndex: 111 + }, true); + }); + KDDrawCollectionFilters(1750, 920); + KDDrawCollectionTabOptions(1000, 920); +} + +function KDCanRelease(id: number) { + let v = KDGameData.Collection[id + ""]; + return v && !v.status && !v.Facility && (!v.escaped || !KinkyDungeonFindID(v.id)); // Prisoners only, not in same room +} +function KDCanRemoveGuest(id: number) { + let v = KDGameData.Collection[id + ""]; + return v && v.status == "Guest" && !v.Facility; // Prisoners only, not in same room +} +function KDCanRansom(id: number) { + let v = KDGameData.Collection[id + ""]; + return v && !v.status && !v.escaped && !KinkyDungeonFindID(id) && !KDNPCUnavailable(id, v.status) + && v.Faction && !KinkyDungeonHiddenFactions.has(v.Faction) && !v.Facility; // Prisoners only +} +function KDRansomValue(id: number) { + let v = KDGameData.Collection[id + ""]; + if (!v) return 0; + let rank = KDEnemyTypeRank(KinkyDungeonGetEnemyByName(v.type)); + return 10 + rank*rank*30 + rank * 50; +} + + +function KDIsInPlayerBase(id: number) { + return (KDIsNPCPersistent(id) && KDGetPersistentNPC(id)?.room == "Summit") + || (KDGameData.Collection[id + ""] && !KDIsNPCPersistent(id)); +} + + +function KDReleasePenalty(id: number, player: number) { + let type = KinkyDungeonGetEnemyByName(KDGameData.Collection[id + ""].type); + let rep = -0.05*KDGetEnemyTypeRep(type, KDGameData.Collection[id + ""].Faction); + if (rep == 0) return; + if ((KDGetModifiedOpinionID(id) > 0)) rep = -rep; // Positive if they are happy! + KinkyDungeonChangeFactionRep(KDGameData.Collection[id + ""].Faction, rep); +} + +function KDReleasePenaltyEntity(entity: entity, player: number) { + let type = KinkyDungeonGetEnemyByName(entity.Enemy?.name); + let rep = -0.05*KDGetEnemyTypeRep(type, KDGetFaction(entity)); + if (rep == 0) return; + if ((KDGetModifiedOpinionID(entity.id) > 0)) rep = -rep; // Positive if they are happy! + KinkyDungeonChangeFactionRep(KDGetFaction(entity), rep); +} + + +function KDReleaseNPC(id: number, player: number) { + if (KDCanRelease(id)) { + KDFreeNPCRestraints(id, player); + KDReleasePenalty(id, player); + + DisposeEntity(id, false, false, + KDIsNPCPersistent(id) + && KDGetGlobalEntity(id) + && (KDGetPersistentNPC(id)?.collect && KDIsInPlayerBase(id))); + let e = KinkyDungeonFindID(id); + if (e) + KDRemoveEntity(e, false, false, true); + delete KDCollectionReleaseSelection[id]; + } +} \ No newline at end of file diff --git a/Game/src/collection/NPCRestrain.ts b/Game/src/collection/NPCRestrain.ts new file mode 100644 index 000000000..18bf8dec9 --- /dev/null +++ b/Game/src/collection/NPCRestrain.ts @@ -0,0 +1,1424 @@ +let KDNPCBindingSelectedSlot: NPCBindingSubgroup = null; +let KDNPCBindingSelectedRow: NPCBindingGroup = null; +let KDSelectedGenericRestraintType = ""; +let KDSelectedGenericBindItem = ""; + +interface NPCRestraint extends Named { + name: string, + inventoryVariant?: string, + events?: KinkyDungeonEvent[], + powerbonus?: number, + lock: string, + id: number, + faction?: string, + conjured?: boolean, +} + +function KDNPCRestraintSlotOrder(): string[] { + let ret: string[] = []; + for (let group of NPCBindingGroups) { + for (let i = group.layers.length - 1; i >= 0; i--) { + ret.push(group.layers[i].id); + } + ret.push(group.encaseGroup.id); + } + return ret; +} + +function KDDrawNPCRestrain(npcID: number, restraints: Record, x: number, y: number) { + let rows: NPCBindingSubgroup[][] = []; + for (let group of NPCBindingGroups) { + let row: NPCBindingSubgroup[] = [group.encaseGroup]; + for (let sgroup of group.layers) { + row.push(sgroup); + } + rows.push(row); + } + + let XX = x; + let YY = y; + + /** First column is encase column */ + let paddingFirstCol = 100; + let paddingX = 50; + let paddingY = 67; + + for (let row of rows) { + let II = 0; + let tooltip = ""; + for (let sgroup of row) { + let restraint = restraints[sgroup.id]; + let preview = ""; + let Group = sgroup.allowedGroups[0]; + let grp = KDGetGroupPreviewImage(Group); + if (restraint) { + let r = KDRestraint({name: restraint.name}); + if (r) { + let prevData = KDGetRestraintPreviewImage(r); + if (prevData) { + preview = prevData; + } + } + + } + let wid = II == 0 ? 56 : 42; + if ((!sgroup.requirePerk || KinkyDungeonStatsChoice.get(sgroup.requirePerk)) && + (!sgroup.noPerk || !KinkyDungeonStatsChoice.get(sgroup.noPerk)) && DrawButtonKDEx( + "npc_rest_butsg_"+ sgroup.id, + () => { + let set = KDSetBindingSlot(sgroup, KDGetEncaseGroupRow(sgroup.id)); + if (set) { + KinkyDungeonCurrentPageInventory = 0; + } else { + KDSendInput("addNPCRestraint", { + slot: sgroup.id, + id: -1, + restraint: "", + restraintid: -1, + lock: "", + npc: npcID, + faction: undefined, + time: KinkyDungeonFindID(npcID) ? 1 : 0, + player: KDPlayer().id, + }); + } + return true; + }, true, + XX, YY, + wid, wid, "", "#ffffff", + preview, undefined, undefined, + KDNPCBindingSelectedSlot?.id != sgroup.id, + KDButtonColor, undefined, undefined, { + scaleImage: true, + } + ) || KDNPCBindingSelectedSlot?.id == sgroup.id) tooltip = sgroup.id; + + + if (II++ == 0) { + if (grp && (!sgroup.requirePerk || KinkyDungeonStatsChoice.get(sgroup.requirePerk)) + && (!sgroup.noPerk || !KinkyDungeonStatsChoice.get(sgroup.noPerk))) { + KDDraw(kdcanvas, kdpixisprites, "npc_bind_list_grp" + sgroup.id, + grp, + XX - Math.floor(wid*0.25), YY - Math.floor(wid*0.25), Math.ceil(wid*1), Math.ceil(wid*1), + undefined, { + zIndex: restraint ? 0 : 160, + } + ); + } + if (restraint?.conjured) { + KDDraw(kdcanvas, kdpixisprites, "npc_bind_list_conj" + sgroup.id, + KinkyDungeonRootDirectory + "UI/Conjured.png", + XX, YY + Math.floor(wid*0.5), + Math.ceil(wid*0.5), Math.ceil(wid*0.5), + undefined, { + zIndex: 160, + } + ); + } + XX += paddingFirstCol; + + } else { + if (grp && (!sgroup.requirePerk || KinkyDungeonStatsChoice.get(sgroup.requirePerk)) + && (!sgroup.noPerk || !KinkyDungeonStatsChoice.get(sgroup.noPerk))) { + KDDraw(kdcanvas, kdpixisprites, "npc_bind_list_grp" + sgroup.id, + grp, + XX, YY, wid, wid, + undefined, { + zIndex: restraint ? 0 : 160, + } + ); + } + if (restraint?.conjured) { + KDDraw(kdcanvas, kdpixisprites, "npc_bind_list_conj" + sgroup.id, + KinkyDungeonRootDirectory + "UI/Conjured.png", + XX, YY + Math.floor(wid*0.5), + Math.ceil(wid*0.5), Math.ceil(wid*0.5), + undefined, { + zIndex: 160, + } + ); + } + XX += paddingX; + } + + } + + if (tooltip) + DrawTextFitKD(TextGet("KDBindNPCSlot_" + tooltip), + x + paddingFirstCol + 25, YY - 12, 400, "#ffffff", KDTextGray1, + 18, "center" + ); + + XX = x; + YY += paddingY; + } + + let currentBottomTab = ""; + + if (KDNPCBindingSelectedSlot) { + let currentItem = restraints[KDNPCBindingSelectedSlot.id]; + let slot = KDNPCBindingSelectedSlot; + let groups = slot.allowedGroups; + let filter = LooseRestraint; + let ss: {selected: KDFilteredInventoryItem, tooltipitem: KDFilteredInventoryItem} = null; + + if (KDNPCBindingPalette) { + currentBottomTab = "Palette"; + // KDSetRestraintPalette\ + + DrawButtonKDEx("defaultnpcrestpalette", () => { + if (currentItem) + KDDefaultNPCBindPalette = currentItem.faction; + return true; + }, currentItem?.faction != undefined, 1100, 920, 250, 64, + TextGet("KDSetDefaultNPCPalette") + TextGet("KDPalette" + (KDDefaultNPCBindPalette || "")), + "#ffffff" + ); + DrawButtonKDEx("npcpaletteSetAll", () => { + if (currentItem) { + for (let r of Object.values(restraints)) { + r.faction = currentItem.faction; + } + KDSetNPCRestraints(npcID, restraints); + if (KDNPCChar.get(npcID)) + KDRefreshCharacter.set(KDNPCChar.get(npcID), true); + } + + return true; + }, currentItem?.faction != undefined, 800, 920, 250, 64, + TextGet("KDSetNPCPaletteAll"), + "#ffffff" + ); + + KDDrawPalettes(1300, 250, KDPaletteWidth, 72, currentItem?.faction || "", (palette) => { + + if (currentItem) { + Object.values(restraints).filter((slt) => { + return slt.id == currentItem.id; + }).forEach((slt) => { + slt.faction = palette; + }) + KDSetNPCRestraints(npcID, restraints); + if (KDNPCChar.get(npcID)) + KDRefreshCharacter.set(KDNPCChar.get(npcID), true); + } + + }, "KDSetRestraintPaletteSelect"); + + } else if (KDNPCBindingGeneric) { + currentBottomTab = "Generic"; + KDDrawGenericNPCRestrainingUI(Object.values(KDRestraintGenericTypes), 1300, 250, + currentItem, slot, npcID, KDGetNPCRestraints(npcID), (currentItem, restraint, slt, item, count, itemtype) => { + if (currentItem) { + // Remove current + if (restraints[slot.id]?.name == currentItem.name) { + KDSendInput("addNPCRestraint", { + slot: slot.id, + id: -1, + restraint: "", + restraintid: -1, + lock: "", + npc: npcID, + faction: undefined, + time: KinkyDungeonFindID(npcID) ? 1 : 0, + player: KDPlayer().id, + }); + } + } else { + // Add new one + if (!KinkyDungeonFindID(npcID) || KDCanApplyBondage(KinkyDungeonFindID(npcID), KDPlayer(), + restraint.quickBindCondition ? + (t, p) => (KDQuickBindConditions[restraint.quickBindCondition]( + t, p, + restraint, + null)) : + undefined)) { + + let condition = KinkyDungeonFindID(npcID) ? KDCanEquipItemOnNPC(restraint, npcID, + KDWillingBondage(KinkyDungeonFindID(npcID), KDPlayer())) + : ""; + if (condition) { + KinkyDungeonSendTextMessage(8, + TextGet("KDBondageCondition_" + condition), + "#ff5277", 1, true); + } else { + KDSendInput("addNPCRestraint", { + slot: slot.id, + id: KinkyDungeonGetItemID(), + restraint: restraint.name, + restraintid: -1, + lock: "", + events: itemtype.events, + powerbonus: itemtype.powerbonus, + inventoryVariant: itemtype.inventoryVariant, + npc: npcID, + faction: KDDefaultNPCBindPalette, + time: KinkyDungeonFindID(npcID) ? 1 : 0, + player: KDPlayer().id, + }); + if (item) { + item.quantity -= count; + } + } + } else { + let condition = KinkyDungeonFindID(npcID) ? KDCanEquipItemOnNPC(restraint, npcID, + KDWillingBondage(KinkyDungeonFindID(npcID), KDPlayer())) + : ""; + if (condition) { + KinkyDungeonSendTextMessage(8, + TextGet("KDBondageCondition_" + condition), + "#ff5277", 1, true); + } else { + KinkyDungeonSendTextMessage(8, TextGet("KDBondageFailInvalidTarget" + (restraint.quickBindCondition || "")), "#ff5277", 1, true); + } + } + + } + }, ); + + } else { + let filteredInventory = KinkyDungeonFilterInventory(filter, undefined, undefined, undefined, undefined, KDInvFilter); + + filteredInventory = filteredInventory.filter((inv) => { + return groups.includes(KDRestraint(inv.item)?.Group) + && slot.allowedTags.some((tag) => {return KDRestraint(inv.item)?.shrine.includes(tag);}); + }) + + + + ss = KDDrawInventoryContainer(-165, 100, filteredInventory, filter, filter, + (inv: KDFilteredInventoryItem, x, y, w, h) => { + if (restraints[slot.id]?.name == inv.item.name) { + KDSendInput("addNPCRestraint", { + slot: slot.id, + id: -1, + restraint: "", + restraintid: -1, + lock: "", + npc: npcID, + faction: undefined, + time: KinkyDungeonFindID(npcID) ? 1 : 0, + player: KDPlayer().id, + }); + } else { + + let restraint = KDRestraint(inv.item); + // Add new one + if (!KinkyDungeonFindID(npcID) || KDCanApplyBondage(KinkyDungeonFindID(npcID), KDPlayer(), + restraint.quickBindCondition ? + (t, p) => (KDQuickBindConditions[restraint.quickBindCondition]( + t, p, + restraint, + null)) : + undefined)) { + + let condition = KinkyDungeonFindID(npcID) ? KDCanEquipItemOnNPC(restraint, npcID, + KDWillingBondage(KinkyDungeonFindID(npcID), KDPlayer())) + : ""; + if (condition) { + KinkyDungeonSendTextMessage(8, + TextGet("KDBondageCondition_" + condition), + "#ff5277", 1, true); + } else { + KDSendInput("addNPCRestraint", { + slot: slot.id, + id: inv.item.id, + restraint: inv.item.name, + restraintid: inv.item.id, + lock: "", + npc: npcID, + faction: KDDefaultNPCBindPalette || inv.item.faction, + time: KinkyDungeonFindID(npcID) ? 1 : 0, + player: KDPlayer().id, + }); + } + } else { + let condition = KinkyDungeonFindID(npcID) ? KDCanEquipItemOnNPC(restraint, npcID, + KDWillingBondage(KinkyDungeonFindID(npcID), KDPlayer())) + : ""; + if (condition) { + KinkyDungeonSendTextMessage(8, + TextGet("KDBondageCondition_" + condition), + "#ff5277", 1, true); + } else { + KinkyDungeonSendTextMessage(8, TextGet("KDBondageFailInvalidTarget" + (restraint.quickBindCondition || "")), "#ff5277", 1, true); + } + } + + } + }, KDCustomDrawInvColorFilter[KinkyDungeonDrawState] ? + KDCustomDrawInvColorFilter[KinkyDungeonDrawState]({ + restraints: restraints, + id: npcID, + entity: KinkyDungeonFindID(npcID), + player: KDPlayer(), + force: !KinkyDungeonFindID(npcID), + }) + : (inv) => { + if (KDRowItemIsValid(KDRestraint(inv.item), KDNPCBindingSelectedSlot, KDNPCBindingSelectedRow, restraints)) + return KDTextGray1; + return "#e64539"; + }); + } + + + + + if (currentItem) { + DrawTextFitKD(TextGet("KDCurrentItem") + KDGetItemNameString(currentItem.name), + x + 570, 130, 500, "#ffffff", KDTextGray1, + 36, "center" + ); + } + + if (ss?.tooltipitem) { + DrawTextFitKD(TextGet("KDCurrentItem2") + KDGetItemName(ss.tooltipitem.item), + x + 570, 180, 500, "#ffffff", KDTextGray1, + 36, "center" + ); + } + + DrawButtonKDEx("paletteswapnpcrest", () => { + KDNPCBindingPalette = !KDNPCBindingPalette; + KDNPCBindingGeneric = false; + return true; + }, true, 1400, 920, 250, 64, + TextGet(currentBottomTab ? "KDSetRestraintPaletteReturn" : "KDSetRestraintPalette"), + "#ffffff" + ); + if (!currentBottomTab) + DrawButtonKDEx("genericrestraint", () => { + KDNPCBindingGeneric = !KDNPCBindingGeneric; + KDNPCBindingPalette = false; + return true; + }, true, 1100, 920, 250, 64, + TextGet("KDSetRestraintGeneric"), + "#ffffff" + ); + // TODO add properties + } + + if (!currentBottomTab) { + let enemy = KDGetGlobalEntity(npcID); + if (enemy?.boundLevel < KDGetExpectedBondageAmountTotal(npcID, enemy, false)) { + if (DrawButtonKDEx("TightenBinds", (b) => { + if (!KDIsNPCPersistent(npcID) || KDGetPersistentNPC(npcID).collect) + KDSendInput("tightenNPCRestraint", { + npc: npcID, + player: KDPlayer().id, + }); + else { + KinkyDungeonSendTextMessage(10, TextGet("KDNeedsTighten"), "#ffffff", 2, true, true); + } + if (KDSoundEnabled()) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Struggle" + ".ogg"); + return true; + }, true, x + 5, y + 740, 80, 80, + "", "#ffffff", KinkyDungeonRootDirectory + "UI/Tighten.png", + undefined, undefined, false, + (!KDIsNPCPersistent(npcID) || KDGetPersistentNPC(npcID).collect) ? + KDButtonColor : "#ff5277")) { + DrawTextFitKD(TextGet("KDTightenRestraint"), x + 0, y + 720, 500, "#ffffff", + KDTextGray0, 18, "left"); + + } + } + } +} + +let KDNPCBindingPalette = false; +let KDNPCBindingGeneric = false; +let KDDefaultNPCBindPalette = ""; + +function KDGetNPCRestraints(id: number): Record { + if (!KDGameData.NPCRestraints) + KDGameData.NPCRestraints = {}; + let value = KDGameData.NPCRestraints["" + id]; + if (!value) + return {}; + else return value; +} + +function KDSetNPCRestraints(id: number, restraints: Record) { + if (!KDGameData.NPCRestraints) + KDGameData.NPCRestraints = {}; + KDGameData.NPCRestraints["" + id] = restraints; + + if (KDGameData.Collection[id + ""]) + KDValidateEscapeGrace(KDGameData.Collection[id + ""]); +} +function KDSetNPCRestraint(id: number, slot: string, restraint: NPCRestraint): item { + if (!KDGameData.NPCRestraints) + KDGameData.NPCRestraints = {}; + let item: item = null; + let restraints = KDGetNPCRestraints(id); + if (restraints[slot]) { + item = { + name: restraints[slot].inventoryVariant || restraints[slot].name, + //curse: curse, + id: KinkyDungeonGetItemID(), + type: LooseRestraint, + events: restraints[slot].events, + inventoryVariant: restraints[slot].inventoryVariant, + conjured: restraints[slot].conjured, + quantity: 1, + showInQuickInv: KinkyDungeonRestraintVariants[restraints[slot].inventoryVariant] != undefined}; + } + if (restraint) + restraints[slot] = restraint; + else delete restraints[slot]; + + KDSetNPCRestraints(id, restraints); + + return item; +} + +function KDSetBindingSlot(sgroup: NPCBindingSubgroup, row: NPCBindingGroup): boolean { + if (sgroup != KDNPCBindingSelectedSlot) { + KDNPCBindingSelectedSlot = sgroup; + KDNPCBindingSelectedRow = row; + return true; + } + return false; +} + +function KDNPCRestraintSize(restraint: restraint, sgroup: NPCBindingSubgroup, row: NPCBindingGroup): number { + let tags = restraint.shrine; + let size = 1; + if (sgroup.id != row.encaseGroup.id) + tags.forEach((tag) => { + size = Math.max(size, NPCBindingRestraintSize[tag] || 1); + }) + return size; +} + +function KDGetRestraintsForCharacter(char): (item | NPCRestraint)[] { + if (char == KinkyDungeonPlayer) return KinkyDungeonAllRestraintDynamic().map((inv) => {return inv.item;}); + else if (KDNPCChar_ID.get(char)) { + let rest = KDGetNPCRestraints(KDNPCChar_ID.get(char)); + if (rest) return Object.values(rest); + } + return []; +} +function KDGetRestraintsForEntity(entity: entity): (item | NPCRestraint)[] { + let char = KDGetCharacter(entity); + if (char == KinkyDungeonPlayer) return KinkyDungeonAllRestraintDynamic().map((inv) => {return inv.item;}); + else { + let rest = KDGetNPCRestraints(entity.id); + if (rest) return Object.values(rest); + } + return []; +} +function KDGetRestraintsForID(id: number): (item | NPCRestraint)[] { + if (id == KDPlayer().id) return KinkyDungeonAllRestraintDynamic().map((inv) => {return inv.item;}); + else { + let rest = KDGetNPCRestraints(id); + if (rest) return Object.values(rest); + } + return []; +} + +function KDNPCRestraintValidLayers(restraint: restraint, + sgroup: NPCBindingSubgroup, + row: NPCBindingGroup, + restraints?: Record, + allowSameID?: number, + power?: number): NPCBindingSubgroup[] { + let group = restraint.Group; + let tags = restraint.shrine; + let ret = [...row.layers, row.encaseGroup].filter((sg) => { + return (!restraints // no restraints array given => general case + || !restraints[sg.id] // Slot is empty + || (allowSameID && restraints[sg.id].id == allowSameID) // allows same ID as current item + || (power != undefined && power > KDGetNPCRestraintPower(restraints[sg.id])) // power given, check if power is higher + ) && ( + sg.id == sgroup.id + || ( + sg.allowedGroups.includes(group) + && tags.some((tag) => { + return sg.allowedTags.includes(tag); + }) + ) + ); + }); + + if (ret.length > 0) { + // Resolve ambiguity + let index = ret.findIndex((slot) => { + return slot.id == sgroup.id; + }); + + if (index > 0) { + // Javascript witchery + ret.unshift(...ret.splice(index, 1)); + } + } + return ret; +} + +function KDRowItemIsValid(restraint: restraint, + sgroup: NPCBindingSubgroup, + row: NPCBindingGroup, + restraints: Record, + treatAsEmpty: boolean = false, + power?: number): boolean { + let group = restraint.Group; + + if ( + sgroup.allowedGroups.includes(group) + ) { + let tags = restraint.shrine; + if (tags.some((tag) => { + return sgroup.allowedTags.includes(tag); + })) { + if (treatAsEmpty) return true; + let size = KDNPCRestraintSize(restraint, sgroup, row); + if ((power === undefined && size == 1) || + ( + size <= + KDNPCRestraintValidLayers(restraint, sgroup, row, restraints, undefined, power).length + && KDNPCRestraintValidLayers(restraint, sgroup, row, restraints, undefined, power).some( + (slot) => {return slot.id == sgroup.id;} + ) + ) + ) { + return true; + } + } + } + + return false; +} + +/** Gets the row of the specified id */ +function KDGetEncaseGroupRow(id): NPCBindingGroup { + for (let group of NPCBindingGroups) { + if (group.encaseGroup.id == id || + group.layers.some((layer) => { + return layer.id == id; + }) + ) return group; + } + return null; +} +/** Gets the specified id */ +function KDGetEncaseGroupSlot(id): NPCBindingSubgroup { + for (let group of NPCBindingGroups) { + if (group.encaseGroup.id == id) return group.encaseGroup; + for (let layer of group.layers) { + if (layer.id == id) return layer; + } + } + return null; +} + +function KDNPCRefreshBondage(id: number, player: number, force: boolean = false, allowConjured: boolean = true, container?: Record) { + let restraints: Record = JSON.parse(JSON.stringify(KDGetNPCRestraints(id))); + + if (restraints) { + let already = {}; + for (let inv of Object.entries(restraints)) { + if (!already[inv[1].id] && (allowConjured || !inv[1].conjured)) { + already[inv[1].id] = true; + KDInputSetNPCRestraint({ + slot: inv[0], + id: -1, + restraint: "", + restraintid: -1, + lock: "", + npc: id, + player: player, + force: true, + }, container); + + } + } + // Readd + already = {}; + for (let inv of Object.entries(restraints)) { + if (!already[inv[1].id] && (allowConjured || !inv[1].conjured)) { + already[inv[1].id] = true; + KDInputSetNPCRestraint({ + slot: inv[0], + id: inv[1].id, + + faction: inv[1].faction, + restraint: inv[1].name, + restraintid: -1, + lock: inv[1].lock, + inventoryVariant: inv[1].inventoryVariant, + events: inv[1].events, + powerbonus: inv[1].powerbonus, + conjured: inv[1].conjured, + + npc: id, + player: player, + force: true, + }, container); + } + } + } +} + +function KDNPCRestraintTieUp(id: number, restraint: NPCRestraint, mult: number = 1) { + let enemy = KDGetGlobalEntity(id); + if (enemy) { + + let stats = KDGetRestraintBondageStats(restraint, enemy); + KDTieUpEnemy(enemy, stats.amount * mult, stats.type, {}, false, 0); + + KDUpdatePersistentNPC(id); + } + + if (KDGameData.Collection[id + ""]) + KDValidateEscapeGrace(KDGameData.Collection[id + ""]); +} + +function KDCanEquipItemOnNPC(r: restraint, id: number, willing: boolean): string { + let enemy = KDGetGlobalEntity(id); + // TODO make this function work on player too + if (enemy) { + let stats = KDGetRestraintBondageStats(r, enemy); + if (stats.conditions) { + for (let condition of stats.conditions) { + if (!KDBondageConditions[condition](r, id, willing)) { + return condition; + } + } + } + + return ""; + } + return "Null"; +} + +function KDFreeNPCRestraints(id: number, player: number) { + if (KDGameData.NPCRestraints) { + + let restraints = KDGameData.NPCRestraints[id + '']; + if (restraints) { + for (let inv of Object.entries(restraints)) { + KDInputSetNPCRestraint({ + slot: inv[0], + id: -1, + restraint: "", + restraintid: -1, + lock: "", + npc: id, + player: player, + }); + } + } + } +} + + +function KDInputSetNPCRestraint(data, container?: Record): boolean { + let row = KDGetEncaseGroupRow(data.slot); + let slot = KDGetEncaseGroupSlot(data.slot); + let item: item = null; + if (!slot) return false; + let willing = data.force || false; + if (KDGameData.Collection[data.npc + ""]) { + if (!KDGetGlobalEntity(data.npc)) {// We have to create it + let Enemy = KinkyDungeonGetEnemyByName(KDGameData.Collection[data.npc + ""].type); + let npc = KDGetPersistentNPC(data.npc, {summoned: true, Enemy: Enemy, id: data.npc, + x:1, y:1, + hp: (Enemy && Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, + movePoints: 0, attackPoints: 0}); // Make them persistent + npc.collect = true; // They are in collection + } + willing = willing || KDGetPersistentNPC(data.npc)?.collect; + } + + let globalEntity = KDGetGlobalEntity(data.npc); + let packed = globalEntity ? KDUnPackEnemy(globalEntity) : false; + + if (data.restraint) { + let rests = KDGetNPCRestraints(data.npc); + let restraint = KDRestraint({name: data.restraint}); + + + if (restraint) { + // Willing: true because they cant resist + let condition = KDCanEquipItemOnNPC(restraint, data.npc, willing || KDWillingBondage(KDGetGlobalEntity(data.npc), + data.player ? KDLookupID(data.player) : undefined)); + if (condition) { + KinkyDungeonSendTextMessage(8, + TextGet("KDBondageCondition_" + condition), + "#ff5277", 1, true); + return false; + } + } + + if (rests && rests[slot.id]) { + KDInputSetNPCRestraint({ + slot: slot.id, + id: -1, + restraint: "", + restraintid: -1, + lock: "", + npc: data.npc, + player: data.player, + }); + } + if (KDRowItemIsValid(restraint, slot, row, rests)) { + if (KDNPCChar.get(data.npc)) + KDRefreshCharacter.set(KDNPCChar.get(data.npc), true); + let size = KDNPCRestraintSize(restraint, slot, row); + let id = data.restraintid > 0 ? data.restraintid : KinkyDungeonGetItemID(); + let slotsToFill = KDNPCRestraintValidLayers(restraint, slot, row, rests, id); + + if (slotsToFill.length >= size) { + let rrr: NPCRestraint = { + lock: data.lock, + name: data.restraint, + id: id, + faction: data.faction, + + inventoryVariant: data.inventoryVariant, + powerbonus: data.inventoryVariant ? KinkyDungeonRestraintVariants[data.inventoryVariant]?.power : data.powerbonus, + }; + + if (data.inventoryVariant) { + rrr.events = KDGetEventsForRestraint(data.restraint); + if (rrr.events && KinkyDungeonRestraintVariants[data.inventoryVariant]?.events) + Object.assign(rrr.events, + JSON.parse(JSON.stringify(KinkyDungeonRestraintVariants[data.inventoryVariant]?.events))); + } else if (data.events) { + rrr.events = JSON.parse(JSON.stringify(data.events)); + } + + for (let i = 0; i < size; i++) { + item = KDSetNPCRestraint(data.npc, slotsToFill[i].id, rrr); + } + + // Add the tieup value + if (item) + KDNPCRestraintTieUp(data.npc, { + lock: item.lock, + name: item.name, + id: item.id, + faction: item.faction, + inventoryVariant: item.inventoryVariant, + }, -1); + KDNPCRestraintTieUp(data.npc, rrr, 1); + } else return; + + if (!data.noInventory) { + if (container && container[data.restraint]) { + container[data.restraint].quantity -= 1; + if (container[data.restraint].quantity <= 0) { + delete container[data.restraint]; + } + } else if (KinkyDungeonInventoryGetSafe(data.restraint)) { + KinkyDungeonInventoryGetSafe(data.restraint).quantity = + (KinkyDungeonInventoryGetSafe(data.restraint).quantity || 1) - 1; + if (KinkyDungeonInventoryGetSafe(data.restraint).quantity <= 0) { + KinkyDungeonInventoryRemoveSafe(KinkyDungeonInventoryGetSafe(data.restraint)); + KDSortInventory(KDPlayer()); + } + } + + } + } + + if (packed) KDPackEnemy(globalEntity); + } else { + + let rests = KDGetNPCRestraints(data.npc); + if (rests) { + let restraint = rests[slot.id]; + if (KDNPCChar.get(data.npc)) + KDRefreshCharacter.set(KDNPCChar.get(data.npc), true); + if (restraint) { + // Add the tieup value + KDNPCRestraintTieUp(data.npc, restraint, -1); + let slots = restraint.id == -1 + ? Object.entries(rests).filter((slt) => { + return slt[1].id == restraint.id; + }).map((slt) => { + return slt[0]; + }) + : Object.entries(rests).filter((slt) => { + return slt[1].id == restraint.id; + }).map((slt) => { + return slt[0]; + }) + for (let slt of slots) { + let it = KDSetNPCRestraint(data.npc, slt, undefined); + item = item || it; + } + + } + + } + + } + if (item && !data.noInventory) { + KDReturnNPCItem( + item, container + ); + } + + let npcSprite = KDNPCChar.get(data.npc); + if (npcSprite) { + NPCTags.set(npcSprite, KinkyDungeonUpdateRestraints(npcSprite, data.npc, 0)); + } + + if (packed) KDPackEnemy(globalEntity); + + return true; +} + +function KDReturnNPCItem(item: item, container?: Record) { + let restraint = KDRestraint(item); + if (!item.conjured) { + + let inventoryAs = item.inventoryVariant || restraint?.inventoryAs || item.name; + + if (container) { + if (!container[item.name]) { + if (KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]) { + container[item.name] = KDGetInventoryVariant(KinkyDungeonRestraintVariants[item.inventoryVariant || item.name], undefined, + KinkyDungeonRestraintVariants[item.inventoryVariant || item.name].curse, "", item.name); + + } else { + container[item.name] = { + name: inventoryAs, + //curse: curse, + id: item.id, + type: LooseRestraint, + //events:events, + quantity: 1, + showInQuickInv: KinkyDungeonRestraintVariants[item.inventoryVariant || item.name] != undefined,}; + } + + } else { + container[item.name].quantity = (container[item.name].quantity || 1) + 1; + } + } else { + if (!KinkyDungeonInventoryGetSafe(item.name)) { + if (KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]) { + KDGiveInventoryVariant(KinkyDungeonRestraintVariants[item.inventoryVariant || item.name], undefined, + KinkyDungeonRestraintVariants[item.inventoryVariant || item.name].curse, "", item.name); + + } else { + KinkyDungeonInventoryAdd({ + name: inventoryAs, + //curse: curse, + id: item.id, + type: LooseRestraint, + //events:events, + quantity: 1, + showInQuickInv: KinkyDungeonRestraintVariants[item.inventoryVariant || item.name] != undefined,}); + } + + + KDSortInventory(KDPlayer()); + } else KinkyDungeonInventoryGetSafe(item.name).quantity = (KinkyDungeonInventoryGetSafe(item.name).quantity || 1) + 1; + } + + } else { + if (!container) + KinkyDungeonSendTextMessage(4, TextGet("KDConjuredRestraintVanish").replace( + "RSTN", + KDGetItemName(item), + ), "#5577aa", 1); + } +} + +function KDGetRestraintBondageStats(item: Named, target: entity): KDBondageStats { + let level = Math.max(KDRestraint(item)?.power || 0, 1); + let type = KDRestraintBondageType(item) || "Leather"; + let mult = KDRestraintBondageMult(item, target) || 0; + let conditions = KDRestraintBondageConditions(item); + + return { + level: level, + type: type, + mult: mult, + amount: mult*level, + conditions: conditions, + }; +} + +/** Gets the expected total bondage amounts. allowConjured means conjured items contribute. includeunlocked means unlocked items (items with no lock) contribute*/ +function KDGetExpectedBondageAmount(id: number, target: entity, allowConjured: boolean = true, includeUnlocked: boolean = true): Record { + if (!KDGameData.NPCRestraints) return {}; + let result : Record = {}; + let restraints = Object.values(KDGameData.NPCRestraints[id + ""] || {}); + let already = {}; + for (let item of restraints) { + if (!already[item.id] && (allowConjured || !item.conjured) && (includeUnlocked || item.lock)) { + if (KDRestraint(item)) { + let stats = KDGetRestraintBondageStats(item, target) + already[item.id] = true; + result[stats.type] = (result[stats.type] || 0) + stats.amount; + } else if (item) { + KinkyDungeonSendTextMessage(12, TextGet("KDErrorMods"), "#ff5277", 2, true); + } + } + } + return result; +} +/** Gets the expected total bondage amounts */ +function KDGetExpectedBondageAmountTotal(id: number, target: entity, allowConjured: boolean = true, includeUnlocked: boolean = true): number { + if (!KDGameData.NPCRestraints) return 0; + let result = 0; + let restraints = Object.values(KDGameData.NPCRestraints[id + ""] || {}); + let already = {}; + for (let item of restraints) { + if (!already[item.id] && KDRestraint(item) && (allowConjured || !item.conjured) && (includeUnlocked || item.lock)) { + let stats = KDGetRestraintBondageStats(item, target) + already[item.id] = true; + result += stats.amount; + } + } + return result; +} + +function KDGetNPCStrugglePoints(id: number): Record { + let result : Record = {}; + let enemy = KDGetGlobalEntity(id); + let actual = enemy?.specialBoundLevel; + let expected = KDGetExpectedBondageAmount(id, enemy); + let expectedTotal = KDGetExpectedBondageAmountTotal(id, enemy); + if (expected && expectedTotal > enemy.boundLevel) { + for (let entry of Object.entries(expected)) { + result[entry[0]] = entry[1] - (actual ? actual[entry[0]] || 0 : 0); + } + } + + return result; +} + +function KDGetNPCEscapableRestraints(id: number, target: entity, bypass: boolean = false): {slot: string, inv: NPCRestraint, points: number, target: number}[] { + let restraints = KDGetNPCRestraints(id); + let retval: {slot: string, inv: NPCRestraint, points: number, target: number}[] = []; + if (restraints) { + let entries = Object.entries(restraints); + let strugglePoints = KDGetNPCStrugglePoints(id); + for (let entry of entries) { + if (KDRestraint(entry[1])) { + if (!bypass) { + let slot = KDGetEncaseGroupSlot(entry[0]); + if (slot?.encasedBy?.length > 0 && slot.encasedBy.some((slt) => { + return slt != slot.id && !!restraints[slt]; + })) continue; + } + + let stats = KDGetRestraintBondageStats(entry[1], target); + if (strugglePoints[stats.type] >= stats.amount) { + retval.push({slot: entry[0], inv: entry[1], points: strugglePoints[stats.type], target: stats.amount}); + } + } else if (entry[1]) { + KinkyDungeonSendTextMessage(12, TextGet("KDErrorMods"), "#ff5277", 2, true); + } + + } + } + return retval; +} + +/** Selects a restraint to struggle */ +function KDNPCStruggleTick(id: number, delta: number): {slot: string, inv: NPCRestraint, points: number, target: number} { + if (delta > 0) { + for (let i = 0; i < delta; i++) { + let escapable = KDGetNPCEscapableRestraints(id, KDGetGlobalEntity(id)); + if (escapable.length > 0) { + return escapable[Math.floor(KDRandom() * escapable.length)]; + } + } + } + return null; +} + +/** Possible results: + * "Remove" - removes the restraint + * "" - default, failure + * "Unlock" - removes lock + */ +function KDNPCDoStruggle(id: number, slot: string, restraint: NPCRestraint, chance: number): string { + if (!chance || KDRandom() > chance) { + return "Struggle"; + } + if (restraint.lock) { + restraint.lock = ""; + KDSetNPCRestraint(id, slot, restraint); + KDUpdatePersistentNPC(id); + return "Unlock"; + } else if (restraint) { + restraint.lock = ""; + let item = KDSetNPCRestraint(id, slot, undefined); + if (item && KDRestraint(item)?.inventory && !item.conjured) { + let entity = KDGetGlobalEntity(id); + if (entity) { + if (!entity.items) entity.items = []; + entity.items.push(KDRestraint(item)?.inventoryAs || item.name); + } + } + KDUpdatePersistentNPC(id); + return "Remove"; + } + + return ""; +} + +function KDWantsToEscape(value: KDCollectionEntry): boolean { + return !value.status // Is prisoner + && (!value.Opinion || value.Opinion < 0) // Doesn't like you + && (!KDGetGlobalEntity(value.id) // has no entity or is unimprisoned + || (!KDIsImprisoned(KDGetGlobalEntity(value.id)) + )) + && !KDIsInPartyID(value.id); +} +function KDIsOKWithRestraining(value: KDCollectionEntry): boolean { + return (value.Opinion > 0) + && ( + ( + KDGameData.Collection[value.id + ""]?.personality != undefined + && KDLoosePersonalities.includes(KDGameData.Collection[value.id + ""]?.personality) + ) + || (KDIsNPCPersistent(value.id) + && KDGetPersistentNPC(value.id).entity + && KDGetPersistentNPC(value.id).entity.personality + && KDLoosePersonalities.includes(KDGetPersistentNPC(value.id).entity.personality)) + ); +} + + +function KDCollectionNPCEscapeTicks(ticks: number = 10) { + let eligibleNPCs = Object.values(KDGameData.Collection).filter((value) => { + return KDWantsToEscape(value); + }); + + let origTick: Record = {}; + + + + for (let value of eligibleNPCs) { + if (KDGetGlobalEntity(value.id)) { + origTick[value.id] = KDGetGlobalEntity(value.id).boundLevel; + } + KDRunNPCEscapeTick(value.id, ticks); + } + + let maxmsg = 10; + let msgcount = 0; + for (let value of eligibleNPCs) { + if (!value.escaped) { + if (!KDGetGlobalEntity(value.id) || !(KDGetGlobalEntity(value.id).boundLevel)) { + // This NPC escapes!!!! + if (value.escapegrace && KDCollHasFlag(value.id, "escapegrace")) { + value.escaped = true; + KinkyDungeonSendTextMessage(10, TextGet("KDNPCEscaped").replace( + "NPC", + value.name + ), "#ff5277", 1); + } else { + KDSetCollFlag(value.id, "escapegrace", -1); + value.escapegrace = true; + KinkyDungeonSendTextMessage(10, TextGet("KDNPCEscapeGrace").replace( + "NPC", + value.name + ), "#ff5277", 1); + } + + } else { + if ((origTick[value.id] && KDGetGlobalEntity(value.id).boundLevel < origTick[value.id]) && msgcount++ < maxmsg) KinkyDungeonSendTextMessage(10, TextGet("KDNPCStruggle").replace( + "NPC", + value.name + ), "#ffa1a1", 1); + value.escapegrace = false; + } + + } + + } + KDSortCollection(); +} + +function KDRunNPCEscapeTick(id: number, ticks: number) { + let enemy = KDGetGlobalEntity(id); + if (enemy) { + let returnToString = false; + let repack = false; + if (typeof enemy.Enemy == "string") { + returnToString = true; + enemy.Enemy = KinkyDungeonGetEnemyByName(enemy.Enemy); + } else if (!enemy.Enemy.maxhp) { + KDUnPackEnemy(enemy); + repack = true; + } + if (enemy.Enemy?.tags) + for (let i = 0; i < ticks; i++) { + KDEnemyStruggleTurn(enemy, 1, KDNPCStruggleThreshMult(enemy), true, true); + KDEnemyDecayBindStun(enemy, 1); + } + KDUpdatePersistentNPC(id); + if (returnToString) (enemy as any).Enemy = enemy.Enemy.name; + else if (repack) KDPackEnemy(enemy); + } + +} + +function KDNPCStruggleThreshMult(enemy: entity) { + return 1 + KDEnemyRank(enemy) + (enemy.Enemy.tags.unstoppable ? 2 : (enemy.Enemy.tags.unflinching ? 1 : 0)) +} +function KDNPCStruggleThreshMultType(enemy: enemy) { + return 1 + KDEnemyTypeRank(enemy) + (enemy.tags.unstoppable ? 2 : (enemy.tags.unflinching ? 1 : 0)) +} + +function KDTriggerNPCEscape(maxNPC: number = 10) { + let eligibleNPCs = Object.values(KDGameData.Collection).filter((value) => { + return value.escaped && KDWantsToEscape(value); + }); + + let count = 0; + for (let i = 0; i < maxNPC && eligibleNPCs.length > 0; i++) { + let ind = Math.floor(KDRandom() * eligibleNPCs.length); + let value = eligibleNPCs[ind]; + eligibleNPCs.splice(ind, 1); + + // Find an eligible point + let point = KinkyDungeonGetRandomEnemyPoint(true, false, undefined, undefined, undefined, false); + + if (point) { + let entity = DialogueCreateEnemy(point.x, point.y, value.type, value.id, true) + if (entity) { + entity.hp = entity.Enemy.maxhp; + + KDSetToExpectedBondage(entity, -1); + + KDMakeHostile(entity, 300); + KinkyDungeonSendDialogue(entity, + TextGet((KDHelpless(entity) ? "KinkyDungeonRemindJailPlayHelpless" : "KinkyDungeonRemindJailPlayBrat") + (KDGetEnemyPlayLine(entity) ? KDGetEnemyPlayLine(entity) : "") + Math.floor(KDRandom() * 3)) + .replace("EnemyName", TextGet("Name" + entity.Enemy.name)), KDGetColor(entity), + Math.floor(12 + KDRandom() * 8), 10, false, true); + count += 1; + } + } else break; + } + return count; +} + +function KDNPCEscape(entity: entity) { + + let type = KinkyDungeonGetEnemyByName(KDGameData.Collection[entity.id + ""].type); + let rep = -1*KDGetEnemyTypeRep(type, KDGameData.Collection[entity.id + ""].Faction); + KinkyDungeonChangeFactionRep(KDGameData.Collection[entity.id + ""].Faction, rep); + + DisposeEntity(entity.id, true, false); + KDRemoveEntity(entity, false, false, true); +} + +let KDGenericMatsPerRow = 2; +let KDGenericBindsPerRow = 3; +let KDGenericBindSpacing = 75; + +function KDDrawGenericNPCRestrainingUI(cats: RestraintGenericType[], x: number, y: number, + currentItem: NPCRestraint, slot: NPCBindingSubgroup, id: number, restraints: Record, + callback: (currentItem: NPCRestraint, restraint: restraint, slot: NPCBindingSubgroup, item: item, count: number, itemtype: RestraintGenericTypeSlot) => void) { + let XX = 0; + let secondXX = KDGenericBindSpacing * (KDGenericMatsPerRow + 0.5); + let YY = 0; + let colCounter = 0; + let index = 0; + let selectedcat: RestraintGenericType = null; + let highlightedItem: string = ""; + if (KDSelectedGenericRestraintType == "" && cats[0]) + KDSelectedGenericRestraintType = cats[0].raw || cats[0].consumableRaw; + let iin = index; + for (let cat of cats) { + let selected = (cat.raw || cat.consumableRaw) == KDSelectedGenericRestraintType; + if (selected) selectedcat = cat; + let hotkey: string = ""; + if ((cats[index+1]?.raw || cats[index+1]?.consumableRaw) == KDSelectedGenericRestraintType) { + hotkey = KinkyDungeonKey[1]; + } else + if ((cats[index-1]?.raw || cats[index-1]?.consumableRaw) == KDSelectedGenericRestraintType) { + hotkey = KinkyDungeonKey[3]; + } + let preview = (cat.raw) ? + KDGetRestraintPreviewImage(KDRestraint({name: cat.raw})) + : KinkyDungeonRootDirectory + "Items/" + cat.consumableRaw + ".png"; + let inventoryItem = KinkyDungeonInventoryGetSafe(cat.raw || cat.consumableRaw); + DrawTextFitKD("" + (inventoryItem?.quantity || 0), + x + XX + 32, y + YY + 60, 72, "#ffffff", KDTextGray0, 18, "left", 160); + if (KDSelectedGenericRestraintType == (cat.raw || cat.consumableRaw)) iin = index; + if (DrawButtonKDExScroll( + "res_gen_list" + (cat.raw || cat.consumableRaw), + (amount: number) => { + if (amount < 0) { + if (cats[iin-1]) { + KDSelectedGenericRestraintType = (cats[iin-1].raw || cats[iin-1].consumableRaw); + } + } else { + if (cats[iin+1]) { + KDSelectedGenericRestraintType = (cats[iin+1].raw || cats[iin+1].consumableRaw); + } + } + }, + () => { + if (KDSelectedGenericRestraintType != (cat.raw || cat.consumableRaw)) { + KDSelectedGenericRestraintType = (cat.raw || cat.consumableRaw); + KDSelectedGenericBindItem = ""; + } else if (KDSelectedGenericRestraintType == (cat.raw || cat.consumableRaw)) KDSelectedGenericRestraintType = ""; + return true; + }, true, + + x + XX + 32, y + YY, 72, 72, "", + "#ffffff", preview, + undefined, false, !selected, KDButtonColor, undefined, true, + { + scaleImage: true, + centered: true, + hotkey: hotkey ? KDHotkeyToText(hotkey) : undefined, + hotkeyPress: hotkey, + } + )) { + DrawTextFitKD(TextGet("KDCurrentItemRaw") + + KDGetItemNameString(cat.raw || cat.consumableRaw), + x + secondXX + KDGenericBindSpacing, 180, 500, "#ffffff", KDTextGray1, + 36, "center" + ); + highlightedItem = "Null"; + } + colCounter++; + if (colCounter >= KDGenericMatsPerRow) { + colCounter = 0; + XX = 0; + YY += KDGenericBindSpacing; + } else { + XX += KDGenericBindSpacing; + } + index++; + } + + YY = 0; + colCounter = 0; + XX = secondXX; + + + if (!KDNPCBindingSelectedSlot) { + DrawTextFitKD( + TextGet("KDSelectABindingSlot"), + x + secondXX, + y + 200, + 2 * secondXX, + "#ffffff", KDTextGray0 + ); + } else if (selectedcat) { + let quantity = KinkyDungeonInventoryGetSafe(selectedcat.raw || selectedcat.consumableRaw)?.quantity; + index = 0; + let items = selectedcat.items.filter( + (item) => { + return slot.allowedGroups.includes(KDRestraint({name: item.restraint})?.Group) + && slot.allowedTags.some((tag) => {return KDRestraint({name: item.restraint})?.shrine.includes(tag);}); + } + ); + let ii = 0; + + let npc = KinkyDungeonFindID(id); + + for (let item of items) { + + let rst = KDRestraint({name: item.restraint}); + + let img = KDGetRestraintPreviewImage(rst); + + let grp = KDGetGroupPreviewImage(rst.Group); + + if (!KDSelectedGenericBindItem) KDSelectedGenericBindItem = item.restraint; + + let selected = item.restraint == KDSelectedGenericBindItem; + //if (selected) highlightedItem = item.restraint; + let hotkey: string = ""; + if (items[index+1]?.restraint == KDSelectedGenericBindItem) { + hotkey = KinkyDungeonKey[6]; + } else + if (items[index-1]?.restraint == KDSelectedGenericBindItem) { + hotkey = KinkyDungeonKey[7]; + } else + if (items[index]?.restraint == KDSelectedGenericBindItem) { + hotkey = KinkyDungeonKeyEnter[0]; + } + //let inventoryItem = KinkyDungeonInventoryGetSafe(item.restraint); + //if (inventoryItem) + DrawTextFitKD(TextGet("KDCost") + (item.count), + x + XX + 32, y + YY + 60, 72, "#ffffff", KDTextGray0, 18, "left", 160); + if (KDSelectedGenericBindItem == item.restraint) ii = index; + if (DrawButtonKDExScroll( + "gen_bind_list" + item.restraint, + (amount: number) => { + if (amount < 0) { + if (items[ii-1]) { + KDSelectedGenericBindItem = items[ii-1].restraint; + } + } else { + if (items[ii+1]) { + KDSelectedGenericBindItem = items[ii+1].restraint; + } + } + }, + () => { + if (KDSelectedGenericBindItem != item.restraint) + KDSelectedGenericBindItem = item.restraint; + else if (quantity >= item.count) { + callback(currentItem, KDRestraint({name: item.restraint}), KDNPCBindingSelectedSlot, + KinkyDungeonInventoryGetSafe(selectedcat.raw || selectedcat.consumableRaw), item.count, item); + } + return true; + }, true, + + x + XX + 32, y + YY, 72, 72, "", + "#ffffff", img, + undefined, false, + ((quantity || 0) < item.count) || !selected, + ((quantity || 0) < item.count) ? "#b74539" : (npc ? + (KDCanApplyBondage(npc, KDPlayer(), + rst?.quickBindCondition ? + (t, p) => (KDQuickBindConditions[rst?.quickBindCondition]( + t, p, + rst, + null)) : undefined) ? "#63ab3f" : "#f0b541") + : KDButtonColor), + undefined, true, + { + scaleImage: true, + centered: true, + hotkey: hotkey ? KDHotkeyToText(hotkey) : undefined, + hotkeyPress: hotkey, + } + ) || (!highlightedItem && KDSelectedGenericBindItem == item.restraint)) { + if (!highlightedItem) { + DrawTextFitKD(TextGet(KDSelectedGenericBindItem == item.restraint ? "KDCurrentItem2" : "KDCurrentItem3") + + KDGetItemNameString(item.restraint), + x + secondXX + KDGenericBindSpacing, 180, 500, "#ffffff", KDTextGray1, + 36, "center" + ); + highlightedItem = item.restraint; + } + + } + + if (grp) { + KDDraw(kdcanvas, kdpixisprites, "gen_bind_list_grp" + item.restraint, + grp, + x + XX + 32, y + YY, 72, 72, + ); + } + colCounter++; + if (colCounter >= KDGenericBindsPerRow) { + colCounter = 0; + XX = secondXX; + YY += KDGenericBindSpacing; + } else { + XX += KDGenericBindSpacing; + } + index++; + } + + } +} diff --git a/Game/src/collection/NPCRestrainGenericList.ts b/Game/src/collection/NPCRestrainGenericList.ts new file mode 100644 index 000000000..3bbac680d --- /dev/null +++ b/Game/src/collection/NPCRestrainGenericList.ts @@ -0,0 +1,300 @@ +interface RestraintGenericType { + /** Name of the raw restraint material */ + raw?: string, + /** Name of the raw consumable material */ + consumableRaw?: string, + items: RestraintGenericTypeSlot[], +} + +interface RestraintGenericTypeSlot { + count: number, + restraint: string, + icon?: string, + variant?: string, + events?: KinkyDungeonEvent[], + powerbonus?: number, + inventoryVariant?: string, +} + + + + +let KDRestraintGenericTypes: Record = { + "HempRope": { + raw: "RopeSnakeRaw", + items: [ + {count: 1, restraint: "RopeSnakeArmsBoxtie"}, + {count: 1, restraint: "RopeSnakeArmsWrist"}, + {count: 1, restraint: "RopeSnakeCuffs"}, + {count: 1, restraint: "RopeSnakeCuffsAdv"}, + {count: 1, restraint: "RopeSnakeCuffsAdv2"}, + {count: 1, restraint: "RopeSnakeLegs"}, + {count: 1, restraint: "RopeSnakeLegs2"}, + {count: 1, restraint: "RopeSnakeLegs3"}, + {count: 1, restraint: "RopeSnakeFeet"}, + {count: 1, restraint: "RopeSnakeFeet2"}, + {count: 1, restraint: "RopeSnakeFeet3"}, + {count: 1, restraint: "RopeSnakeHogtieLink"}, + {count: 1, restraint: "RopeSnakeToes"}, + {count: 1, restraint: "RopeSnakeCrotch"}, + {count: 1, restraint: "RopeSnakeHarness"}, + {count: 1, restraint: "RopeSnakeBelt"}, + ], + }, + "WeakMagic": { + raw: "WeakMagicRopeRaw", + items: [ + {count: 1, restraint: "WeakMagicRopeArmsBoxtie"}, + {count: 1, restraint: "WeakMagicRopeArmsWrist"}, + {count: 1, restraint: "WeakMagicRopeCuffs"}, + {count: 1, restraint: "WeakMagicRopeCuffsAdv"}, + {count: 1, restraint: "WeakMagicRopeCuffsAdv2"}, + {count: 1, restraint: "WeakMagicRopeLegs"}, + {count: 1, restraint: "WeakMagicRopeLegs2"}, + {count: 1, restraint: "WeakMagicRopeLegs3"}, + {count: 1, restraint: "WeakMagicRopeFeet"}, + {count: 1, restraint: "WeakMagicRopeFeet2"}, + {count: 1, restraint: "WeakMagicRopeFeet3"}, + {count: 1, restraint: "WeakMagicRopeHogtieLink"}, + {count: 1, restraint: "WeakMagicRopeToes"}, + {count: 1, restraint: "WeakMagicRopeCrotch"}, + {count: 1, restraint: "WeakMagicRopeHarness"}, + {count: 1, restraint: "WeakMagicRopeBelt"}, + ], + }, + "StrongMagic": { + raw: "StrongMagicRopeRaw", + items: [ + {count: 1, restraint: "StrongMagicRopeArmsBoxtie"}, + {count: 1, restraint: "StrongMagicRopeArmsWrist"}, + {count: 1, restraint: "StrongMagicRopeCuffs"}, + {count: 1, restraint: "StrongMagicRopeCuffsAdv"}, + {count: 1, restraint: "StrongMagicRopeCuffsAdv2"}, + {count: 1, restraint: "StrongMagicRopeLegs"}, + {count: 1, restraint: "StrongMagicRopeLegs2"}, + {count: 1, restraint: "StrongMagicRopeLegs3"}, + {count: 1, restraint: "StrongMagicRopeFeet"}, + {count: 1, restraint: "StrongMagicRopeFeet2"}, + {count: 1, restraint: "StrongMagicRopeFeet3"}, + {count: 1, restraint: "StrongMagicRopeHogtieLink"}, + {count: 1, restraint: "StrongMagicRopeToes"}, + {count: 1, restraint: "StrongMagicRopeCrotch"}, + {count: 1, restraint: "StrongMagicRopeHarness"}, + {count: 1, restraint: "StrongMagicRopeBelt"}, + ], + }, + "MithrilRope": { + raw: "MithrilRopeRaw", + items: [ + {count: 1, restraint: "MithrilRopeArmsBoxtie"}, + {count: 1, restraint: "MithrilRopeArmsWrist"}, + {count: 1, restraint: "MithrilRopeCuffs"}, + {count: 1, restraint: "MithrilRopeCuffsAdv"}, + {count: 1, restraint: "MithrilRopeCuffsAdv2"}, + {count: 1, restraint: "MithrilRopeLegs"}, + {count: 1, restraint: "MithrilRopeLegs2"}, + {count: 1, restraint: "MithrilRopeLegs3"}, + {count: 1, restraint: "MithrilRopeFeet"}, + {count: 1, restraint: "MithrilRopeFeet2"}, + {count: 1, restraint: "MithrilRopeFeet3"}, + {count: 1, restraint: "MithrilRopeHogtieLink"}, + {count: 1, restraint: "MithrilRopeToes"}, + {count: 1, restraint: "MithrilRopeCrotch"}, + {count: 1, restraint: "MithrilRopeHarness"}, + {count: 1, restraint: "MithrilRopeBelt"}, + ], + }, + "CelestialRope": { + raw: "CelestialRopeRaw", + items: [ + {count: 1, restraint: "CelestialRopeArmsBoxtie"}, + {count: 1, restraint: "CelestialRopeArmsWrist"}, + {count: 1, restraint: "CelestialRopeCuffs"}, + {count: 1, restraint: "CelestialRopeCuffsAdv"}, + {count: 1, restraint: "CelestialRopeCuffsAdv2"}, + {count: 1, restraint: "CelestialRopeLegs"}, + {count: 1, restraint: "CelestialRopeLegs2"}, + {count: 1, restraint: "CelestialRopeLegs3"}, + {count: 1, restraint: "CelestialRopeFeet"}, + {count: 1, restraint: "CelestialRopeFeet2"}, + {count: 1, restraint: "CelestialRopeFeet3"}, + {count: 1, restraint: "CelestialRopeHogtieLink"}, + {count: 1, restraint: "CelestialRopeToes"}, + {count: 1, restraint: "CelestialRopeCrotch"}, + {count: 1, restraint: "CelestialRopeHarness"}, + {count: 1, restraint: "CelestialRopeBelt"}, + ], + }, + "Slime": { + raw: "SlimeRaw", + items: [ + {count: 1, restraint: "SlimeHead"}, + {count: 1, restraint: "SlimeMouth"}, + {count: 2, restraint: "SlimeArms"}, + {count: 1, restraint: "SlimeHands"}, + {count: 1, restraint: "SlimeLegs"}, + {count: 1, restraint: "SlimeFeet"}, + {count: 1, restraint: "SlimeBoots"}, + ], + }, + "HardSlime": { + raw: "HardSlimeRaw", + items: [ + {count: 1, restraint: "HardSlimeHead"}, + {count: 1, restraint: "HardSlimeMouth"}, + {count: 2, restraint: "HardSlimeArms"}, + {count: 1, restraint: "HardSlimeHands"}, + {count: 1, restraint: "HardSlimeLegs"}, + {count: 1, restraint: "HardSlimeFeet"}, + {count: 1, restraint: "HardSlimeBoots"}, + ], + }, + "ProtoSlime": { + raw: "ProtoSlimeRaw", + items: [ + {count: 1, restraint: "ProtoSlimeHead"}, + {count: 1, restraint: "ProtoSlimeMouth"}, + {count: 2, restraint: "ProtoSlimeArms"}, + {count: 1, restraint: "ProtoSlimeHands"}, + {count: 1, restraint: "ProtoSlimeLegs"}, + {count: 1, restraint: "ProtoSlimeFeet"}, + {count: 1, restraint: "ProtoSlimeBoots"}, + ], + }, + "HardProtoSlime": { + raw: "HardProtoSlimeRaw", + items: [ + {count: 1, restraint: "HardProtoSlimeHead"}, + {count: 1, restraint: "HardProtoSlimeMouth"}, + {count: 2, restraint: "HardProtoSlimeArms"}, + {count: 1, restraint: "HardProtoSlimeHands"}, + {count: 1, restraint: "HardProtoSlimeLegs"}, + {count: 1, restraint: "HardProtoSlimeFeet"}, + {count: 1, restraint: "HardProtoSlimeBoots"}, + ], + }, + "CaptureFoam": { + raw: "CaptureFoamRaw", + items: [ + {count: 1, restraint: "CaptureFoamHead"}, + {count: 1, restraint: "CaptureFoamMouth"}, + {count: 2, restraint: "CaptureFoamArms"}, + {count: 1, restraint: "CaptureFoamHands"}, + {count: 1, restraint: "CaptureFoamLegs"}, + {count: 1, restraint: "CaptureFoamFeet"}, + {count: 1, restraint: "CaptureFoamBoots"}, + ], + }, + "HardCaptureFoam": { + raw: "HardCaptureFoamRaw", + items: [ + {count: 1, restraint: "HardCaptureFoamHead"}, + {count: 1, restraint: "HardCaptureFoamMouth"}, + {count: 2, restraint: "HardCaptureFoamArms"}, + {count: 1, restraint: "HardCaptureFoamHands"}, + {count: 1, restraint: "HardCaptureFoamLegs"}, + {count: 1, restraint: "HardCaptureFoamFeet"}, + {count: 1, restraint: "HardCaptureFoamBoots"}, + ], + }, + "DuctTape": { + raw: "DuctTapeRaw", + items: [ + {count: 1, restraint: "DuctTapeHands"}, + ], + }, + "Charms": { + raw: "CharmRaw", + items: [ + {count: 1, restraint: "DuctTapeArms"}, + {count: 1, restraint: "DuctTapeFeet"}, + {count: 1, restraint: "DuctTapeBoots"}, + {count: 1, restraint: "DuctTapeLegs"}, + {count: 1, restraint: "DuctTapeHead"}, + {count: 1, restraint: "DuctTapeMouth"}, + {count: 2, restraint: "DuctTapeHeadMummy"}, + {count: 2, restraint: "DuctTapeArmsMummy"}, + {count: 2, restraint: "DuctTapeLegsMummy"}, + {count: 2, restraint: "DuctTapeFeetMummy"}, + ], + }, + "MysticDuctTape": { + raw: "MysticDuctTapeRaw", + items: [ + {count: 1, restraint: "MysticDuctTapeHands"}, + {count: 1, restraint: "MysticDuctTapeHead"}, + {count: 1, restraint: "MysticDuctTapeEyes"}, + {count: 1, restraint: "MysticDuctTapeMouth"}, + {count: 2, restraint: "MysticDuctTapeArmsMummy"}, + {count: 2, restraint: "MysticDuctTapeLegsMummy"}, + {count: 2, restraint: "MysticDuctTapeFeetMummy"}, + {count: 2, restraint: "MysticDuctTapeBoots"}, + ], + }, + "AutoTape": { + raw: "AutoTapeRaw", + items: [ + {count: 1, restraint: "AutoTapeHands"}, + {count: 1, restraint: "AutoTapeArms"}, + {count: 1, restraint: "AutoTapeFeet"}, + {count: 1, restraint: "AutoTapeBoots"}, + {count: 1, restraint: "AutoTapeLegs"}, + {count: 1, restraint: "AutoTapeHead"}, + {count: 1, restraint: "AutoTapeMouth"}, + ], + }, + "VinylTape": { + raw: "VinylTapeRaw", + items: [ + {count: 1, restraint: "VinylTapeHands"}, + {count: 1, restraint: "VinylTapeArms"}, + {count: 1, restraint: "VinylTapeFeet"}, + {count: 1, restraint: "VinylTapeBoots"}, + {count: 1, restraint: "VinylTapeLegs"}, + {count: 1, restraint: "VinylTapeHead"}, + {count: 1, restraint: "VinylTapeMouth"}, + {count: 2, restraint: "VinylTapeHeadMummy"}, + {count: 2, restraint: "VinylTapeArmsMummy"}, + {count: 2, restraint: "VinylTapeLegsMummy"}, + {count: 2, restraint: "VinylTapeFeetMummy"}, + ], + }, + "Ribbon": { + raw: "RibbonRaw", + items: [ + {count: 1, restraint: "RibbonArms"}, + {count: 1, restraint: "RibbonLegs"}, + {count: 1, restraint: "RibbonFeet"}, + {count: 1, restraint: "RibbonHarness"}, + {count: 1, restraint: "RibbonCrotch"}, + {count: 1, restraint: "RibbonHands"}, + {count: 1, restraint: "RibbonMouth"}, + ], + }, +}; + +let KDGenericRestraintRawCache: Record = {}; +let KDGenericRestraintRawOriginalCache: Record = {}; + +function KDRefreshRawCache() { + KDGenericRestraintRawCache = {}; + for (let mat of Object.values(KDRestraintGenericTypes)) { + let raw = mat.raw; + if (!KDGenericRestraintRawOriginalCache[mat.raw] ) + KDGenericRestraintRawOriginalCache[mat.raw] = []; + for (let item of mat.items) { + KDGenericRestraintRawCache[item.restraint] = { + count: item.count, + raw: raw, + }; + KDGenericRestraintRawOriginalCache[mat.raw].push( + { + name: item.restraint, + count: item.count, + } + ); + } + } +} + +KDRefreshRawCache(); \ No newline at end of file diff --git a/Game/src/collection/NPCRestrainList.ts b/Game/src/collection/NPCRestrainList.ts new file mode 100644 index 000000000..f2dbb4652 --- /dev/null +++ b/Game/src/collection/NPCRestrainList.ts @@ -0,0 +1,261 @@ +interface NPCBindingGroup { + id: string, + encaseGroup: NPCBindingSubgroup, + /** Length must equal 3 */ + layers: NPCBindingSubgroup[], +} + +interface NPCBindingSubgroup { + id: string, + allowedTags: string[], + allowedGroups: string[], + encasedBy: string[], + requirePerk?: string, + noPerk?: string, +} + +let NPCBindingRestraintSize = { + Heels: 3, + Straitjackets: 2, + PlugGags: 2, + Yokes: 2, + Fiddles: 2, + Spreaderbars: 2, + Petsuits: 2, +} +let NPCBindingMouthSlots = [ + "Muzzle", + "OuterGag", + "InterGag", + "InnerGag", +] +let NPCBindingNeckSlots = [ + "Collar", + "ModulePunish", + "ModuleUtility", + "CollarTag", +] + +interface KDBondageStats { + level: number, + type: string, + mult: number, + amount: number, + /** List of conditions required for this item to be applied (not stay on) */ + conditions?: string[], + /** List of conditions required for this item to stay on (TODO incomplete) */ + stayconditions?: string[], +} + +/** + * + * Most items have 1 size + * + * Some exceptions: + * + * Size 2: + * Straitjackets + * Plug Gags + * Yokes + * Fiddles + * Spreaderbars + * Petsuits + * + * Size 3: + * Heels + */ + +let NPCBindingGroups: NPCBindingGroup[] = [ + {id: "Collar", encaseGroup: + {id: "Collar", encasedBy: [], allowedGroups: ["ItemNeck"], + allowedTags: ["PostureCollars", "HighCollars", "Collars"]}, + layers: [ + {id: "ModulePunish", encasedBy: [], allowedGroups: ["ItemNeckAccessories", "ItemNeck"], + allowedTags: ["ModulePunish"]}, + {id: "ModuleUtility", encasedBy: [], allowedGroups: ["ItemNeckAccessories", "ItemNeck"], + allowedTags: ["ModuleUtility"]}, + {id: "CollarTag", encasedBy: [], allowedGroups: ["ItemNeckRestraints"], + allowedTags: ["Leashes"]}, + ]}, + {id: "Head", encaseGroup: + {id: "Hood", encasedBy: [], allowedGroups: ["ItemHead"], + allowedTags: ["Masks", "Hoods", "Wrapping", "Encase"]}, + layers: [ + {id: "OuterHead", encasedBy: ["Hood"], allowedGroups: ["ItemHead"], + allowedTags: ["Blindfolds", "Earplugs"]}, + {id: "InterHead", encasedBy: ["Hood"], allowedGroups: ["ItemHead"], + allowedTags: ["Blindfolds"]}, + {id: "InnerHead", encasedBy: ["Hood"], allowedGroups: ["ItemHead"], + allowedTags: ["Blindfolds", "Tape", "Visors"]}, + ]}, + {id: "Gag", encaseGroup: + {id: "Muzzle", encasedBy: ["Hood"], allowedGroups: ["ItemMouth"], + allowedTags: ["Muzzles", "Wrapping", "Encase"]}, + layers: [ + {id: "OuterGag", encasedBy: ["Hood", "Muzzle"], allowedGroups: ["ItemMouth"], + allowedTags: ["FlatGags"]}, + {id: "InterGag", encasedBy: ["Hood", "Muzzle", "OuterGag"], allowedGroups: ["ItemMouth"], + allowedTags: ["FlatGags", "PlugGags", "BallGags", "Tape"]}, + {id: "InnerGag", encasedBy: ["Hood", "Muzzle", "InterGag", "OuterGag"], allowedGroups: ["ItemMouth"], + allowedTags: ["PlugGags", "Stuffing"]}, + ]}, + {id: "Arms", encaseGroup: + {id: "ArmEncase", encasedBy: [], allowedGroups: ["ItemArms"], + allowedTags: ["Wrapping", "Encase"]}, + layers: [ + {id: "Secure", encasedBy: ["ArmEncase"], allowedGroups: ["ItemArms"], + allowedTags: ["Petsuits", "Yokes", "Fiddles", "Straitjackets", "ChestHarnesses", "Tape", "Belts", "ElbowLink"]}, + {id: "HeavyBondage", encasedBy: ["ArmEncase"], allowedGroups: ["ItemArms"], + allowedTags: ["Petsuits", "BindingDress", "Yokes", "Fiddles", "Armbinders", "Boxbinders", "Straitjackets", "Boxties", "Wristties", "Cuffs", "WristLink"]}, + {id: "Wrists", encasedBy: ["ArmEncase", "HeavyBondage"], allowedGroups: ["ItemArms"], + allowedTags: ["ArmCuffsBase", "IntricateRopeArms"]}, + ]}, + {id: "Hands", encaseGroup: + {id: "HandEncase", encasedBy: ["ArmEncase"], allowedGroups: ["ItemHands"], + allowedTags: ["Wrapping", "Encase"]}, + layers: [ + {id: "OuterHands", encasedBy: ["ArmEncase", "HandEncase"], allowedGroups: ["ItemHands"], + allowedTags: ["Mittens"]}, + {id: "InterHands", encasedBy: ["ArmEncase", "HandEncase", "OuterHands"], allowedGroups: ["ItemHands"], + allowedTags: ["Mittens", "Tape"]}, + {id: "InnerHands", encasedBy: ["ArmEncase", "HandEncase", "InterHands", "OuterHands"], allowedGroups: ["ItemHands"], + allowedTags: ["Gloves", "Tape"]}, + ]}, + {id: "Chest", encaseGroup: + {id: "ChastityBra", encasedBy: [], allowedGroups: ["ItemBreast"], + allowedTags: ["ChastityBras"]}, + layers: [ + {id: "NippleVibe", encasedBy: ["ChastityBra"], allowedGroups: ["ItemNipples"], + allowedTags: ["Vibes"], requirePerk: "arousalMode"}, + {id: "NippleWeight", encasedBy: ["ChastityBra"], allowedGroups: ["ItemNipples"], + allowedTags: ["Weights"], requirePerk: "arousalMode"}, + {id: "Piercings", encasedBy: ["ChastityBra"], allowedGroups: ["ItemNipples"], + allowedTags: ["Piercings"], requirePerk: "arousalModePiercing"}, + ]}, + {id: "Torso", encaseGroup: + {id: "Corset", encasedBy: [], allowedGroups: ["ItemTorso"], + allowedTags: ["Corsets"]}, + layers: [ + {id: "Harness", encasedBy: ["Corset",], allowedGroups: ["ItemTorso"], + allowedTags: ["Harnesses"]}, + {id: "HarnessExtra", encasedBy: ["Corset", "ArmEncase"], allowedGroups: ["ItemTorso"], + allowedTags: ["ArmbinderHarness", "BoxbinderHarness", "Leotards", "Swimsuits"]}, + {id: "Suits", encasedBy: [], allowedGroups: ["ItemTorso"], + allowedTags: ["Suits", "Leotards", "Swimsuits"]}, + ]}, + {id: "Pelvis", encaseGroup: + {id: "ChastityBelt", encasedBy: [], allowedGroups: ["ItemPelvis"], + allowedTags: ["ChastityBelts", "RopeCrotch", "Panties"]}, + layers: [ + {id: "Vibe", encasedBy: ["ChastityBelt"], allowedGroups: ["ItemVulvaPiercings"], + allowedTags: ["Vibes"], requirePerk: "arousalMode"}, + {id: "FrontPlug", encasedBy: ["ChastityBelt"], allowedGroups: ["ItemVulva"], + allowedTags: ["Plugs"], requirePerk: "arousalMode", noPerk: "arousalModePlugNoFront"}, + {id: "RearPlug", encasedBy: ["ChastityBelt"], allowedGroups: ["ItemButt"], + allowedTags: ["Plugs"], requirePerk: "arousalModePlug"}, + ]}, + {id: "Legs", encaseGroup: + {id: "LegEncase", encasedBy: [], allowedGroups: ["ItemLegs"], + allowedTags: ["Wrapping", "Encase"]}, + layers: [ + {id: "Legbinder", encasedBy: ["LegEncase"], allowedGroups: ["ItemLegs"], + allowedTags: ["Legbinders", "RopeLegs3", "Belts", "SpreaderBars", "Tape"]}, + {id: "ThighBinds", encasedBy: ["LegEncase", "Legbinder"], allowedGroups: ["ItemLegs"], + allowedTags: ["RopeLegs2", "Belts", "Cuffs", "SpreaderBars", "ThighLink"]}, + {id: "ThighCuffs", encasedBy: ["LegEncase", "Legbinder"], allowedGroups: ["ItemLegs"], + allowedTags: ["RopeLegs1", "Belts", "LegCuffsBase"]}, + ]}, + {id: "Ankles", encaseGroup: + {id: "FeetEncase", encasedBy: [], allowedGroups: ["ItemFeet"], + allowedTags: ["Wrapping", "Encase"]}, + layers: [ + {id: "Knees", encasedBy: ["FeetEncase"], allowedGroups: ["ItemFeet"], + allowedTags: ["RopeFeet3", "Belts", "SpreaderBars", "Tape"]}, + {id: "Shins", encasedBy: ["FeetEncase"], allowedGroups: ["ItemFeet"], + allowedTags: ["RopeFeet2", "Belts", "SpreaderBars", "Cuffs", "Hogties", "AnkleLink"]}, + {id: "AnkleCuffs", encasedBy: ["FeetEncase"], allowedGroups: ["ItemFeet"], + allowedTags: ["RopeFeet1", "Belts", "AnkleCuffsBase"]}, + ]}, + {id: "Boots", encaseGroup: + {id: "BootsEncase", encasedBy: [], allowedGroups: ["ItemBoots"], + allowedTags: ["Wrapping", "Encase", "Tape"]}, + layers: [ + {id: "Heels", encasedBy: ["FeetEncase"], allowedGroups: ["ItemBoots"], + allowedTags: ["Heels"]}, + {id: "ToeTies", encasedBy: ["FeetEncase"], allowedGroups: ["ItemBoots"], + allowedTags: ["Heels", "Ties"]}, + {id: "ToeCuffs", encasedBy: ["FeetEncase"], allowedGroups: ["ItemBoots"], + allowedTags: ["Heels", "Cuffs"]}, + ]}, +]; + + + +let KDBondageConditions: Record boolean> = { + HeavyBondage: (r, id, willing) => { + if (willing) return true; + if (r.quickBindCondition) return true; + if (r.quickBindCondition) return true; + let enemy = KDGetGlobalEntity(id); + if (!enemy) return false; // Must create an entity + return enemy.stun >= 3 || enemy.freeze >= 3 || KDBoundEffects(enemy) > 3; + }, + Extra: (r, id, willing) => { + if (r.quickBindCondition) return true; + let NPC = KDGetGlobalEntity(id); + if (NPC) { + KDQuickGenNPC(NPC, false); + let npcSprite = KDNPCChar.get(id); + if (npcSprite) { + if (!NPCTags.get(npcSprite)) { + NPCTags.set(npcSprite, new Map()); + NPCTags.set(npcSprite, KinkyDungeonUpdateRestraints(npcSprite, id, 0)); + } + + if (NPCTags.get(npcSprite)) { + if (r.requireAllTagsToEquip) { + for (let tag of r.requireAllTagsToEquip) { + if (!NPCTags.get(npcSprite).get(tag)) { + return false; + } + } + } + if (r.requireSingleTagToEquip) { + for (let tag of r.requireSingleTagToEquip) { + if (NPCTags.get(npcSprite).get(tag)) { + return true; + } + } + return false; + } + } + + return true; + } else { + return true; + } + + return true; + } + return false; + }, +} + + +let KDQuickBindConditions: Record boolean> = { + Handcuffs: (target, player, restraint, item) => { + return KinkyDungeonIsDisabled(target) || target.vulnerable > 0; + }, + Stuffing: (target, player, restraint, item) => { + return KinkyDungeonIsDisabled(target) || target.vulnerable > 0; + }, + TapeGag: (target, player, restraint, item) => { + return KinkyDungeonIsDisabled(target) || target.vulnerable > 0; + }, + TapeBlindfold: (target, player, restraint, item) => { + return KinkyDungeonIsDisabled(target) || target.vulnerable > 0; + }, + BallGag: (target, player, restraint, item) => { + return KinkyDungeonIsDisabled(target) || target.vulnerable > 0 || KDEntityHasFlag(target, "verbalcast"); + }, +}; \ No newline at end of file diff --git a/Game/src/dialogue/KDSkillCheck.ts b/Game/src/dialogue/KDSkillCheck.ts new file mode 100644 index 000000000..10754245e --- /dev/null +++ b/Game/src/dialogue/KDSkillCheck.ts @@ -0,0 +1,25 @@ +enum KDSkillCheckType { + Fitness = "Fitness", + Agility = "Agility", +} + +let KDSkillCheckTypes : Record number)> = { + Fitness: (en: entity, player: entity, target: entity, diffMod: number) => { + return 1 - 1 / Math.max(0.1, 1 + KDFitnessMult(player)) + + KDEntityBuffedStat(player, "meleeDamageBuff") + - diffMod; + }, + Agility: (en: entity, player: entity, target: entity, diffMod: number) => { + return 1 - 1 / Math.max(0.1, 1 + KDReflexMult(player)) + + KDEntityBuffedStat(player, "Evasion") + - diffMod + + (target ? 0.5 * KDGetSlowMult(target) : 0) + + (target // Bonus during time stop + ? 1 * (KDEntityBuffedStat(KinkyDungeonPlayerEntity, "TimeSlow") - KDEntityBuffedStat(target, "TimeSlow")) + : 0); + }, +}; + +function KDGetSkillCheck(en: entity, player: entity, target: entity, type: KDSkillCheckType, diffMod: number = 0): number { + return KDSkillCheckTypes[type](en, player, target, diffMod); +} \ No newline at end of file diff --git a/Game/src/dialogue/KinkyDungeonDialogue.ts b/Game/src/dialogue/KinkyDungeonDialogue.ts new file mode 100644 index 000000000..c7711d498 --- /dev/null +++ b/Game/src/dialogue/KinkyDungeonDialogue.ts @@ -0,0 +1,2798 @@ +"use strict"; + +let KDDialogueData = { + CurrentDialogueIndex: 0, +}; + +/** + * Milliseconds during which clicks are ignored to avoid inadverdent clicking + */ +let KDDialogueDelay = 400; + + +/** + * @param Min + * @param Avg + * @param Max + * @param [Enemy] + */ +function KDPersonalitySpread(Min: number, Avg: number, Max: number, Enemy?: entity): number { + return KDStrictPersonalities.includes(Enemy?.personality || KDGameData.CurrentDialogMsgPersonality) ? Max : + (!KDLoosePersonalities.includes(Enemy?.personality || KDGameData.CurrentDialogMsgPersonality) ? Avg : + Min); +} + +function KinkyDungeonCanPutNewDialogue(): boolean { + return !KDGameData.CurrentDialog && !KinkyDungeonFlags.get("NoDialogue"); +} + +function KDBasicCheck(PositiveReps: string[], NegativeReps: string[], Modifier: number = 0): number { + let value = Modifier; + if (KinkyDungeonFlags.has("OfferRefused")) value -= 15; + if (KinkyDungeonFlags.has("OfferRefusedLight")) value -= 15; + // Being low willpower makes it harder + if (KinkyDungeonStatWill < 10) value -= Math.max(0, 5 * (10 - KinkyDungeonStatWill)); + for (let rep of PositiveReps) { + if (KinkyDungeonGoddessRep[rep] != undefined) value += 50 + KinkyDungeonGoddessRep[rep]; + } + for (let rep of NegativeReps) { + if (KinkyDungeonGoddessRep[rep] != undefined) value -= 50 + KinkyDungeonGoddessRep[rep]; + } + return value; +} + +function KDDialogueApplyPersonality(allowed: string[]) { + if (allowed.includes(KDGameData.CurrentDialogMsgPersonality)) KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + KDGameData.CurrentDialogMsgPersonality; +} + +function KDGetDialogue(): KinkyDialogue { + let dialogue = KDDialogue[KDGameData.CurrentDialog]; + if (KDGameData.CurrentDialogStage && dialogue?.options) { + let stages = KDGameData.CurrentDialogStage.split("_"); + for (let i = 0; i < stages.length; i++) { + if (dialogue.options[stages[i]]) + dialogue = dialogue.options[stages[i]]; + else { + // Break the dialogue + console.log("Error in dialogue " + KDGameData.CurrentDialog + ", stage = " + KDGameData.CurrentDialogStage); + KDGameData.CurrentDialog = ""; + break; + } + } + } + return dialogue; +} + +let KDMaxDialogue = 7; +let KDOptionOffset = 0; + + +function KDDrawDialogue(delta: number): void { + KDDraw(kdcanvas, kdpixisprites, "dialogbg", KinkyDungeonRootDirectory + "DialogBackground.png", 500, 0, 1000, 1000, undefined, { + zIndex: 111, + }); + + if (KDGameData.CurrentDialog && !(KDGameData.SlowMoveTurns > 0)) { + KinkyDungeonDrawState = "Game"; + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + // Get the current dialogue and traverse down the tree + let dialogue = KDGetDialogue(); + let gagged = KDDialogueGagged(); + // Now that we have the dialogue, we check if we have a message + if (dialogue.response && !KDGameData.CurrentDialogMsg) KDGameData.CurrentDialogMsg = dialogue.response; + if (KDGameData.CurrentDialogMsg == "Default") KDGameData.CurrentDialogMsg = KDGameData.CurrentDialog + KDGameData.CurrentDialogStage; + if (gagged && dialogue.responseGag) KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + "Gag"; + + gagged = KDDialogueGagged(); + + if (!dialogue.drawFunction || !dialogue.drawFunction(gagged, KinkyDungeonPlayerEntity, delta)) { + // Type the message + let text = TextGet("r" + KDGameData.CurrentDialogMsg).split("|"); + for (let i = 0; i < text.length; i++) { + let tt = text[i]; + if (KDGameData.CurrentDialogMsgData) { + for (let d of Object.entries(KDGameData.CurrentDialogMsgData)) { + tt = tt.replace(d[0], d[1]); + } + } + DrawTextFitKD(tt.replace("SPEAKER", TextGet("Name" + KDGameData.CurrentDialogMsgSpeaker)), + 1000, 300 + 50 * i - 25 * text.length, 900, "white", "black", undefined, undefined, 115); + } + + // Draw the options + if (dialogue.options) { + let entries = Object.entries(dialogue.options); + + let II = -KDOptionOffset; + for (let i = 0; i < entries.length && II < KDMaxDialogue; i++) { + if ((!entries[i][1].prerequisiteFunction || entries[i][1].prerequisiteFunction(gagged, KinkyDungeonPlayerEntity)) + && (!entries[i][1].gagRequired || gagged) + && (!entries[i][1].gagDisabled || !gagged)) { + if (II >= 0) { + let playertext = entries[i][1].playertext; + if (playertext == "Default") playertext = KDGameData.CurrentDialog + KDGameData.CurrentDialogStage + "_" + entries[i][0]; + if (entries[i][1].gag && KDDialogueGagged()) playertext = playertext + "Gag"; + + let tt = TextGet("d" + playertext); + if (KDGameData.CurrentDialogMsgData) { + for (let d of Object.entries(KDGameData.CurrentDialogMsgData)) { + tt = tt.replace(d[0], d[1]); + } + } + let notGrey = !entries[i][1].greyoutFunction || entries[i][1].greyoutFunction(gagged, KinkyDungeonPlayerEntity); + DrawButtonKDEx(KDOptionOffset + "dialogue" + II, (_bdata) => { + if (notGrey) { + KDOptionOffset = 0; + KDDialogueData.CurrentDialogueIndex = 0; + KDSendInput("dialogue", {dialogue: KDGameData.CurrentDialog, dialogueStage: KDGameData.CurrentDialogStage + ((KDGameData.CurrentDialogStage) ? "_" : "") + entries[i][0], click: true, enemy: KDGetSpeaker()?.id}); + } + return true; + }, KinkyDungeonDialogueTimer < CommonTime(), 700, 450 + II * 60, 600, 50, + (notGrey || KDDialogueData.CurrentDialogueIndex != II) ? tt : TextGet( + entries[i][1].greyoutCustomTooltip + ? entries[i][1].greyoutCustomTooltip(gagged, KDPlayer()) + : entries[i][1].greyoutTooltip), (notGrey && KinkyDungeonDialogueTimer < CommonTime()) ? "#ffffff" : "#888888", undefined, + undefined, undefined, undefined, + KDDialogueData.CurrentDialogueIndex == II ? KDTextGray3 : undefined, undefined, undefined, { + zIndex: 122, + }); + if (MouseIn(700, 450 + II * 60, 600, 50)) KDDialogueData.CurrentDialogueIndex = II; + } + + II += 1; + } + } + if (II >= KDMaxDialogue || KDOptionOffset > 0) { + if (KDOptionOffset > 0) + DrawButtonKDEx("dialogueUP", (_bdata) => { + if (KDOptionOffset > 0) { + KDOptionOffset -= 1; + //if (KDDialogueData.CurrentDialogueIndex > 0) + //KDDialogueData.CurrentDialogueIndex -= 1; + } + return true; + }, KDOptionOffset > 0, 1350, 450, 90, 40, "", KDOptionOffset > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png", + undefined, undefined, undefined, undefined, undefined, undefined, { + zIndex: 122, + }); + if (II >= KDMaxDialogue) + DrawButtonKDEx("dialogueDOWN", (_bdata) => { + if (II >= KDMaxDialogue) { + KDOptionOffset += 1; + //KDDialogueData.CurrentDialogueIndex += 1; + } + return true; + }, II >= KDMaxDialogue, 1350, 450 + (KDMaxDialogue - 1) * 60 + 10, 90, 40, "", II >= KDMaxDialogue ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png", + undefined, undefined, undefined, undefined, undefined, undefined, { + zIndex: 122, + }); + } + if (KDDialogueData.CurrentDialogueIndex > II - 1) { + KDDialogueData.CurrentDialogueIndex = II - 1; + } + if (KDDialogueData.CurrentDialogueIndex < 0) { + KDDialogueData.CurrentDialogueIndex = 0; + } + } + } + + } else if (!KDGameData.CurrentDialog) { + // Clear data + KDGameData.CurrentDialogMsgData = {}; + KDGameData.CurrentDialogMsgValue = {}; + } +} + +/** + * @param Amount + */ +function KDIncreaseOfferFatigue(Amount: number): void { + if (!KDGameData.OfferFatigue) { + KDGameData.OfferFatigue = 0; + } + KDGameData.OfferFatigue = Math.max(0, KDGameData.OfferFatigue + Amount); + + if (Amount > 0) KinkyDungeonSetFlag("OfferRefused", KDOfferCooldown * 2); + if (Amount > 0) KinkyDungeonSetFlag("OfferRefusedLight", KDOfferCooldown * 5); +} + +/** + * @param enemy + */ +function KDEnemyHelpfulness(enemy: entity): number { + if (!enemy.personality) return 1.0; + if (KDStrictPersonalities.includes(enemy.personality)) return 0.33; + if (KDLoosePersonalities.includes(enemy.personality)) return 1.75; +} + +function KDGetSpeaker(global?: boolean): entity { + let enemy = global ? KDGetGlobalEntity(KDGameData.CurrentDialogMsgID) + : KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return enemy; + } + return null; +} + +/** + * Same as KDGetSpeaker + */ +function KDDialogueEnemy(): entity { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return enemy; + } + return null; +} + + + +function KDGetSpeakerFaction(): string { + let speaker = KDGetSpeaker(); + return speaker ? KDGetFactionOriginal(speaker) : undefined; +} + +/** + * @param Amount + */ +function KDPleaseSpeaker(Amount: number) { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDAddOpinionPersistent(enemy.id, Amount * 100); + let faction = KDGetFactionOriginal(enemy); + if (!KinkyDungeonHiddenFactions.has(faction)) { + if (!KDEntityHasFlag(enemy, "PleasedRep")) { + KinkyDungeonChangeFactionRep(faction, 0.01); + KDSetIDFlag(enemy.id, "PleasedRep", -1); + } + } + } +} + +/** + * @param enemy + * @param Amount + */ +function KDAddOpinion(enemy: entity, Amount: number): number { + if (!enemy) return; + let a = Math.min(1000, Math.abs(Amount)); + while (a > 0 && (Amount < 0 || (enemy.opinion || 0) < Amount * 10)) { + enemy.opinion = + (enemy.opinion || KDGameData.Collection[enemy.id]?.Opinion || 0) + + Math.min(10, a) + * Math.min(10, a) + / (Amount > 0 ? + (Math.min(10, a) + Math.max(0, enemy.opinion || 0)) + : -(Math.min(10, a) + Math.max(0, -enemy.opinion || 0))); + a -= 10; + } + if (KDGameData.Collection[enemy.id]) KDGameData.Collection[enemy.id].Opinion = enemy.opinion; + if (enemy.opinion > 0) { + // After being made happier they will reconsider their hostilities + enemy.hostile = undefined; + enemy.rage = undefined; + } + return enemy.opinion || 0; +} +/** + * @param enemy + * @param Amount + */ +function KDAddOpinionCollection(enemy: KDCollectionEntry, Amount: number): number { + if (!enemy) return; + let a = Math.min(1000, Math.abs(Amount)); + while (a > 0 && (Amount < 0 || (enemy.Opinion || 0) < Amount * 10)) { + enemy.Opinion = + (enemy.Opinion || 0) + + Math.min(10, a) + * Math.min(10, a) + / (Amount > 0 ? (Math.min(10, a) + (enemy.Opinion || 0)) : -1); + a -= 10; + } + return enemy.Opinion || 0; +} + +function KDAllySpeaker(Turns: number, Follow: boolean) { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (!KDEntityHasFlag(enemy, "helped")) { + KinkyDungeonSetEnemyFlag(enemy, "helped", -1); + KDAddOpinionPersistent(enemy.id, 100); + } + if (!(enemy.hostile > 0)) { + enemy.allied = Turns; + if (Follow) { + KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 0); + } + } + } +} + +/** + * @param [Turns] + * @param [NoAlertFlag] + */ +function KDAggroSpeaker(Turns: number = 300, NoAlertFlag: boolean = false) { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (!(enemy.hostile > 0)) { + enemy.hostile = Turns; + } else enemy.hostile = Math.max(enemy.hostile, Turns); + if (NoAlertFlag) { + KinkyDungeonSetEnemyFlag(enemy, "nosignalothers", Turns); + } + } +} + + +// Success chance for a basic dialogue +function KDBasicDialogueSuccessChance(checkResult: number): number { + return Math.max(0, Math.min(1.0, checkResult/100)); +} + +// Success chance for a basic dialogue +function KDAgilityDialogueSuccessChance(checkResult: number): number { + let evasion = KinkyDungeonPlayerEvasion(); + return Math.max(0, Math.min(1.0, (checkResult/100 - (KDGameData.OfferFatigue ? KDGameData.OfferFatigue /100 : 0) + 0.2 * Math.max(0, 3 - KinkyDungeonSlowLevel)) * evasion)); +} + +// Success chance for an offensive dialogue +function KDOffensiveDialogueSuccessChance(checkResult: number): number { + let accuracy = KinkyDungeonGetEvasion(); + return Math.max(0, Math.min(1.0, (checkResult/100 - (KDGameData.OfferFatigue ? KDGameData.OfferFatigue / 100 : 0) + - 0.15 + 0.3 * Math.max(0, 3 - KinkyDungeonSlowLevel)) * accuracy)); +} + +let KinkyDungeonDialogueTimer = 0; + +/** + * @param Dialogue + * @param [Speaker] + * @param [Click] + * @param [Personality] + * @param [enemy] + */ +function KDStartDialog(Dialogue: string, Speaker?: string, Click?: boolean, Personality?: string, enemy?: entity) { + KinkyDungeonInterruptSleep(); + KDDisableAutoWait(); + KinkyDungeonDialogueTimer = CommonTime() + KDDialogueDelay + KDGameData.SlowMoveTurns * 200; + KDOptionOffset = 0; + KinkyDungeonFastMovePath = []; + KinkyDungeonDrawState = "Game"; + KDDialogueData.CurrentDialogueIndex = 0; + + + KDDoDialogue({dialogue: Dialogue, dialogueStage: "", click: Click, speaker: Speaker, personality: Personality, enemy: enemy ? enemy.id : undefined}); + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); +} + + +function KDDoDialogue(data: any) { + KDDelayedActionPrune(["Action", "Dialogue"]); + if (!KDGameData.CurrentDialogMsgData) KDGameData.CurrentDialogMsgData = {}; + if (!KDGameData.CurrentDialogMsgValue) KDGameData.CurrentDialogMsgValue = {}; + + KDGameData.CurrentDialog = data.dialogue; + KDGameData.CurrentDialogStage = data.dialogueStage; + if (data.speaker) { + let oldSpeaker = KDGameData.CurrentDialogMsgSpeaker; + KDGameData.CurrentDialogMsgSpeaker = data.speaker; + if (KDGameData.CurrentDialogMsgSpeaker != oldSpeaker) + KDGameData.CurrentDialogMsgPersonality = ""; // Reset when speaker changes + } + if (data.enemy) { + KDGameData.CurrentDialogMsgID = data.enemy; + } else { + KDGameData.CurrentDialogMsgID = 0; + } + if (data.personality) + KDGameData.CurrentDialogMsgPersonality = data.personality; + + let dialogue = KDGetDialogue(); + if (!dialogue) {// Means we exited { + KDGameData.CurrentDialog = ""; + KDGameData.CurrentDialogStage = ""; + return; + } + let ggagged = KDDialogueGagged(); + if (dialogue.data) KDGameData.CurrentDialogMsgData = dialogue.data; + if (dialogue.response) KDGameData.CurrentDialogMsg = dialogue.response; + if (dialogue.response == "Default") KDGameData.CurrentDialogMsg = KDGameData.CurrentDialog + KDGameData.CurrentDialogStage; + if (dialogue.personalities) { + KDDialogueApplyPersonality(dialogue.personalities); + } + if (ggagged && dialogue.responseGag) KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + "Gag"; + let abort = false; + if (data.click) { + let gagged = KDDialogueGagged(); + if (dialogue.gagFunction && gagged) { + abort = dialogue.gagFunction(KinkyDungeonPlayerEntity); + } else if (dialogue.clickFunction) { + abort = dialogue.clickFunction(gagged, KinkyDungeonPlayerEntity); + } + } + if (!abort) { + let gagged = KDDialogueGagged(); + if (dialogue.exitDialogue) { + KDGameData.CurrentDialog = ""; + KDGameData.CurrentDialogStage = ""; + } else { + let currentStage = KDGameData.CurrentDialogStage; + let modded = false; + if (dialogue.leadsTo != undefined) { + KDGameData.CurrentDialog = dialogue.leadsTo; + KDGameData.CurrentDialogStage = ""; + modded = true; + } + if (dialogue.leadsToStage != undefined) { + KDGameData.CurrentDialogStage = dialogue.leadsToStage; + modded = true; + } + let Dialogue2 = KDGetDialogue(); + if (Dialogue2?.enterFunction) { + Dialogue2.enterFunction(gagged, KinkyDungeonPlayerEntity, currentStage); + } + if (modded && !dialogue.dontTouchText) { + dialogue = KDGetDialogue(); + if (dialogue.response) KDGameData.CurrentDialogMsg = dialogue.response; + if (dialogue.response == "Default") KDGameData.CurrentDialogMsg = KDGameData.CurrentDialog + KDGameData.CurrentDialogStage; + if (gagged && dialogue.responseGag) KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + "Gag"; + } + } + } +} + +/** + * @param Dialogue + * @param [Speaker] + * @param [Click] + * @param [Personality] + * @param [enemy] + */ +function KDStartDialogInput(Dialogue: string, Speaker?: string, Click?: boolean, Personality?: string, enemy?: entity) { + KinkyDungeonInterruptSleep(); + KDDisableAutoWait(); + KinkyDungeonDialogueTimer = CommonTime() + 700 + KDGameData.SlowMoveTurns * 200; + KDOptionOffset = 0; + KinkyDungeonFastMovePath = []; + KinkyDungeonDrawState = "Game"; + KDDialogueData.CurrentDialogueIndex = 0; + KDSendInput("dialogue", {dialogue: Dialogue, dialogueStage: "", click: Click, speaker: Speaker, personality: Personality, enemy: enemy ? enemy.id : undefined}); + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); +} + +function KDDialogueGagged() { + let dialogue = KDGetDialogue(); + let threshold = dialogue?.gagThreshold ? dialogue.gagThreshold : (KinkyDungeonStatsChoice.get("SmoothTalker") ? 0.99 : 0.01); + if (KinkyDungeonGagTotal() >= threshold) return true; + return false; +} + +function KDHandleDialogue() { + if (KDGameData.CurrentDialog && KinkyDungeonDialogueTimer < CommonTime()) { + KinkyDungeonInterruptSleep(); + // Get the current dialogue and traverse down the tree + let dialogue = KDGetDialogue(); + + if (dialogue.inventory) + KinkyDungeonhandleQuickInv(true); + } + + return false; +} + + +/** + * @param x + * @param y + * @param Name + * @param [persistentid] + * @param [noLoadout] + */ +function DialogueCreateEnemy(x: number, y: number, Name: string, persistentid?: number, noLoadout?: boolean): entity { + if (KinkyDungeonEnemyAt(x, y)) KDKickEnemy(KinkyDungeonEnemyAt(x, y)); + let Enemy = KinkyDungeonGetEnemyByName(Name); + let e = {summoned: true, Enemy: Enemy, id: persistentid || KinkyDungeonGetEnemyID(), + x:x, y:y, + visual_x: x, visual_y: y, + hp: (Enemy && Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0}; + + return KDAddEntity(e, persistentid != undefined, undefined, noLoadout); +} + +function KDRunCreationScript(entity: entity, coord: WorldCoord) { + if (entity?.Enemy?.creationScript && !entity.created) { + let script = KDCreationScripts[entity.Enemy.creationScript]; + if (script && script(entity, coord)) entity.created = true; + } +} + + +function KDAllyDialogue(name: string, requireTags: string[], requireSingleTag: string[], excludeTags: string[], weight: number): KinkyDialogue { + /** + */ + let dialog: KinkyDialogue = { + response: "Default", + clickFunction: () => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDGameData.CurrentDialogMsgValue.BINDAMNT = KDGetPlayerUntieBindAmt(enemy); + KDGameData.CurrentDialogMsgData.BINDAMNT = `${Math.round(KDGameData.CurrentDialogMsgValue.BINDAMNT*10)}`; + } + let delta = KinkyDungeonFlags.get("recentlyUntied") ? 3 : 1; + KDGameData.CurrentDialogMsgData.UNTIETURNS = TextGet(delta != 1 ? "KDXTurns" : "KDXTurn").replace("AMNT", + "" + delta + ); + return false; + }, + options: {}, + }; + + + dialog.options.Leash = {playertext: name + "Leash", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (enemy.leash) return false; + if (KinkyDungeonInventoryGetConsumable("LeashItem") + || KDGetNPCRestraints(enemy.id) && Object.values(KDGetNPCRestraints(enemy.id)) + .some((rest) => {return KDRestraint(rest)?.leash;})) { + if (!KDLeashReason.PlayerLeash(enemy)) return false; + return true; + } + return false; + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (KDGetLeashedToCount(enemy) >= 3) { + KinkyDungeonSendActionMessage(7, TextGet("KDTooManyLeashes"), "#e64539", 1); + } else if (!(enemy.leash?.reason == "PlayerLeash")) { + KinkyDungeonSendActionMessage(7, TextGet("KDLeashSpell").replace("ENMY", KDGetEnemyTypeName(enemy)), "#63ab3f", 1); + KinkyDungeonAttachTetherToEntity(1.5, KDPlayer(), enemy, "PlayerLeash", "#e64539", 7); + } + } + return false; + }, + leadsToStage: "", + }; + + dialog.options.ReleaseLeash = {playertext: name + "ReleaseLeash", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (enemy.leash?.reason == "PlayerLeash") return true; + return false; + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDBreakTether(enemy); + } + return false; + }, + leadsToStage: "", + }; + dialog.options.Shop = {playertext: name + "Shop", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return KDEnemyHasFlag(enemy, "Shop"); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + for (let shop of Object.values(KDShops)) { + if (KDEnemyHasFlag(enemy, shop.name)) { + KDStartDialog(shop.name, enemy.Enemy.name, true, enemy.personality, enemy); + return true; + } + } + } + }, + exitDialogue: true, + }; + dialog.options.ShopBuy = {playertext: name + "ShopBuy", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return enemy.items?.length > 0; + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDStartDialog("ShopBuy", enemy.Enemy.name, true, enemy.personality, enemy); + return true; + } + return false; + }, + exitDialogue: true, + }; + dialog.options.Leave = {playertext: "Leave", exitDialogue: true, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "NoShop", 9999); + } + return false; + }, + }; + dialog.options.Attack = {playertext: name + "Attack", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (!enemy || (enemy.aware && !enemy.playWithPlayer)) return true; + return false; + }, + options: { + "Confirm": {playertext: name + "Attack_Confirm", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (!enemy.Enemy.allied) { + let faction = KDGetFactionOriginal(enemy); + if (faction == "Player") { + enemy.faction = "Enemy"; // They become an enemy + } else if (!KinkyDungeonHiddenFactions.has(faction) && !enemy.Enemy.tags?.scenery) { + KinkyDungeonChangeRep("Ghost", -5); + KinkyDungeonChangeFactionRep(faction, -0.06); + } + KDMakeHostile(enemy); + } else { + enemy.hp = 0; + } + } + return false; + }, + exitDialogue: true, + }, + "Leave": {playertext: name + "Attack_Leave", response: "Default", + leadsToStage: "", + }, + } + }; + dialog.options.AttackPlay = {playertext: name + "AttackPlay", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.playWithPlayer) return true; + return false; + }, + options: { + "Confirm": {playertext: name + "Attack_Confirm", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (!enemy.Enemy.allied) { + KDMakeHostile(enemy); + let faction = KDGetFactionOriginal(enemy); + if (!KinkyDungeonHiddenFactions.has(faction)) { + KinkyDungeonChangeRep("Ghost", -5); + } + } else { + enemy.hp = 0; + } + } + return false; + }, + exitDialogue: true, + }, + "Leave": {playertext: name + "AttackPlay_Leave", response: "Default", + leadsToStage: "", + }, + } + }; + dialog.options.AttackUnaware = {playertext: name + "AttackUnaware", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && (enemy.aware || enemy.playWithPlayer)) return false; + return true; + }, + options: { + "Confirm": {playertext: name + "AttackUnaware_Confirm", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (!enemy.Enemy.allied) { + KDMakeHostile(enemy); + enemy.stun = Math.max(enemy.stun || 0, 1); + enemy.vulnerable = Math.max(enemy.vulnerable || 0, 1); + } else { + enemy.hp = 0; + } + } + return false; + }, + exitDialogue: true, + }, + "Leave": {playertext: name + "AttackUnaware_Leave", response: "Default", + leadsToStage: "", + }, + } + }; + + dialog.options.Untie = {playertext: name + "Untie", response: "Default", + /*greyoutFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return enemy.hp > 0.52; + } + return false; + }, + greyoutTooltip: "KDMustHaveHP",*/ + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return KDGameData.CurrentDialogMsgValue.BINDAMNT > 0; + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + let amtOld = enemy.boundLevel; + KDUntieEnemy(enemy, KDGameData.CurrentDialogMsgValue.BINDAMNT, false, true); + + let amtNew = enemy.boundLevel; + + KDGameData.CurrentDialogMsgValue.BINDANTPREV = Math.max(0, amtOld - amtNew); + KDGameData.CurrentDialogMsgData.BINDANTPREV = `${Math.round(KDGameData.CurrentDialogMsgValue.BINDANTPREV*10)}`; + + KDGameData.CurrentDialogMsgValue.BINDAMNT = KDGetPlayerUntieBindAmt(enemy); + KDGameData.CurrentDialogMsgData.BINDAMNT = `${Math.round(KDGameData.CurrentDialogMsgValue.BINDAMNT*10)}`; + + let delta = KinkyDungeonFlags.get("recentlyUntied") ? 3 : 1; + KDGameData.CurrentDialogMsgData.UNTIETURNS = TextGet(delta != 1 ? "KDXTurns" : "KDXTurn").replace("AMNT", + "" + delta + ); + + KinkyDungeonSetFlag("recentlyUntied", 40); + + KDGameData.SlowMoveTurns = Math.max(KDGameData.SlowMoveTurns || 0, delta); + if (KinkyDungeonInDanger()) { + KDGameData.CurrentDialog = ""; + KDGameData.CurrentDialogStage = ""; + } + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + + dialog.options.Food = {playertext: name + "Food", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return enemy.hp < enemy.Enemy.maxhp; + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDGameData.InventoryAction = "Food"; + KDGameData.FoodTarget = enemy.id; + KinkyDungeonDrawState = "Inventory"; + KinkyDungeonCurrentFilter = Consumable; + KinkyDungeonSendTextMessage(8, TextGet("KDFoodTarget"), "#ffffff", 1, true); + + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + + dialog.options.JoinParty = {playertext: name + "JoinParty", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + if (KDGameData.Party?.length >= KDGameData.MaxParty) return false; + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return KDAllied(enemy) + && !KDIsInParty(enemy) + && !KDEnemyHasFlag(enemy, "shop") + && !enemy.Enemy.tags?.peaceful + && !enemy.maxlifetime + && KDCapturable(enemy) + && !enemy.Enemy.allied; + // No shopkeepers, noncombatants, or summons... + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 0); + KDAddToParty(enemy); + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + + dialog.options.Flirt = {playertext: name + "Flirt", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy) + KDGameData.CurrentDialogMsg = name + "Flirt" + (!KDEnemyCanTalk(enemy) ? "Gagged" : (enemy.personality || "")); + return false; + }, + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy) + return KDPlayPossible(enemy); + return false; + }, + options: { + "Leave": {playertext: "Leave", response: "Default", + leadsToStage: "", + }, + LinkRequestArms: { + playertext: "Default", response: "Default", gag: true, + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + let r = KinkyDungeonGetRestraint({tags: ["armLink"]}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + + if (r && KDCanAddRestraint(r, true, undefined, false, undefined, true, true)) { + return true; + } + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + let r = KinkyDungeonGetRestraint({tags: ["armLink"]}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (r && KDCanAddRestraint(r, true, undefined, false, undefined, true, true)) { + KinkyDungeonAddRestraintIfWeaker(r, ((enemy ? Math.min(10, enemy.Enemy.power) + KDEnemyRank(enemy) : 0) || 0), true, undefined, true, false, undefined, KDGetSpeakerFaction(), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined); + + } + + KinkyDungeonChangeRep("Ghost", 3); + + // Make the enemy see you + enemy.vp = Math.max(enemy.vp || 0, 3); + KDStunTurns(1, true); + } + KDGameData.CurrentDialogMsg = name + "Flirt" + (!KDEnemyCanTalk(enemy) ? "Gagged" : (enemy.personality || "")); + return false; + }, + leadsToStage: "", dontTouchText: true, exitDialogue: true, + }, + LinkRequestLegs: { + playertext: "Default", response: "Default", gag: true, + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + let r = KinkyDungeonGetRestraint({tags: ["legLink", "feetLink"]}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + + if (r && KDCanAddRestraint(r, true, undefined, false, undefined, true, true)) { + return true; + } + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + let r = KinkyDungeonGetRestraint({tags: ["legLink", "feetLink"]}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (r && KDCanAddRestraint(r, true, undefined, false, undefined, true, true)) { + KinkyDungeonAddRestraintIfWeaker(r, ((enemy ? Math.min(10, enemy.Enemy.power) + KDEnemyRank(enemy) : 0) || 0), true, undefined, true, false, undefined, KDGetSpeakerFaction(), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined); + + } + KinkyDungeonChangeRep("Ghost", 3); + + // Make the enemy see you + enemy.vp = Math.max(enemy.vp || 0, 3); + KDStunTurns(1, true); + + } + KDGameData.CurrentDialogMsg = name + "Flirt" + (!KDEnemyCanTalk(enemy) ? "Gagged" : (enemy.personality || "")); + return false; + }, + leadsToStage: "", dontTouchText: true, exitDialogue: true, + }, + PlayRequest: { + playertext: "Default", response: "Default", gag: true, + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return (KinkyDungeonCanPlay(enemy)) && !enemy.playWithPlayer; + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "forcePlay", 20); + KinkyDungeonSetEnemyFlag(enemy, "noHarshPlay", 20); + KinkyDungeonSetEnemyFlag(enemy, "allyPlay", 80); + enemy.aware = true; + enemy.gx = enemy.x; + enemy.gy = enemy.y; + enemy.path = undefined; + enemy.playWithPlayerCD = 0; + // Make the enemy see you + enemy.vp = Math.max(enemy.vp || 0, 3); + KDStunTurns(1, true); + } + KDGameData.CurrentDialogMsg = name + "Flirt" + (!KDEnemyCanTalk(enemy) ? "Gagged" : (enemy.personality || "")); + return false; + }, + leadsToStage: "", dontTouchText: true, exitDialogue: true, + }, + Release: { + playertext: "Default", response: "Default", gag: true, + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return (KDIsDistracted(enemy)) && !enemy.playWithPlayer; + } + return false; + }, + options: { + "Wand": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KinkyDungeonInventoryGet("VibeWand") != undefined && !KinkyDungeonIsHandsBound(true, true, 0.99); + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDEnemyRelease(enemy); + KDAddOpinionPersistent(KDGetSpeaker().id, 3); + } + KDGameData.CurrentDialogMsg = name + "Release_Success" + (!KDEnemyCanTalk(enemy) ? "Gagged" : (enemy.personality || "")); + return false; + }, + leadsToStage: "", dontTouchText: true, exitDialogue: true, + }, + "Cuddle": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return true; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDEnemyRelease(enemy); + KDStunTurns(2, true); + KDAddOpinionPersistent(KDGetSpeaker().id, 3); + } + KDGameData.CurrentDialogMsg = name + "Release_Success" + (!KDEnemyCanTalk(enemy) ? "Gagged" : (enemy.personality || "")); + return false; + }, + leadsToStage: "", dontTouchText: true, exitDialogue: true, + }, + "Vibe": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + return KDEntityBuffedStat(enemy, "Plug") && KinkyDungeonInventoryGet("VibeRemote") != undefined && !KinkyDungeonIsHandsBound(true, true, 0.99); + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDEnemyRelease(enemy); + KDStunTurns(2, true); + KDAddOpinionPersistent(KDGetSpeaker().id, 3); + } + KDGameData.CurrentDialogMsg = name + "Release_Success" + (!KDEnemyCanTalk(enemy) ? "Gagged" : (enemy.personality || "")); + return false; + }, + leadsToStage: "", dontTouchText: true, exitDialogue: true, + }, + } + }, + BondageOffer: { + playertext: "Default", response: "Default", gag: true, + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker && KDEnemyCanTalk(enemy)) { + KinkyDungeonSetEnemyFlag(enemy, "allyOffer", 1); + let dialogue = KDGetDialogueTrigger(enemy, { + aggressive: false, + playAllowed: true, + playerDist: 1, + canTalk: true, + allowPlayExceptionSub: true, + ignoreNoAlly: true, + ignoreCombat: true, + }, ["BondageOffer"]); + KinkyDungeonSetEnemyFlag(enemy, "allyOffer", 0); + return dialogue != ""; + } + return false; + }, + options: { + "Yes": {playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "allyOffer", 1); + let dialogue = KDGetDialogueTrigger(enemy, { + aggressive: false, + playAllowed: true, + playerDist: 1, + canTalk: true, + allowPlayExceptionSub: true, + ignoreNoAlly: true, + ignoreCombat: true, + }, ["BondageOffer"]); + if (dialogue) { + KDStartDialog(dialogue,enemy.Enemy.name, true, enemy.personality, enemy); + return true; + } + } + return false; + }, + exitDialogue: true, + }, + "No": {playertext: "Default", response: "Default", + leadsToStage: "Flirt", + }, + }, + }, + LeashWalk: { + playertext: "Default", response: "Default", gag: true, + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (enemy == KinkyDungeonJailGuard() || enemy == KinkyDungeonLeashingEnemy()) return false; + return (KinkyDungeonCanPlay(enemy) && KinkyDungeonPlayerTags.get("Collars") && KinkyDungeonGetRestraintItem("ItemNeckRestraints") && !enemy.playWithPlayer) == true; + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "allowLeashWalk", -1); + + enemy.aware = true; + enemy.gx = enemy.x; + enemy.gy = enemy.y; + enemy.path = undefined; + // Make the enemy see you + + let duration = 60 + Math.round(KDRandom()*40); + KinkyDungeonSetEnemyFlag(enemy, "notouchie", duration); + KinkyDungeonSetFlag("TempLeash", duration); + KinkyDungeonSetFlag("TempLeashCD", duration + 1); + KinkyDungeonSetFlag("noResetIntent", 12); + enemy.playWithPlayer = 12; + enemy.playWithPlayerCD = 40; + enemy.IntentAction = 'TempLeash'; + KDTickTraining("Heels", KDGameData.HeelPower > 0, + KDGameData.HeelPower <= 0, 4, 25); + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + (KDEnemyCanTalk(enemy) ? KDJailPersonality(enemy) : "Gagged") + "LeashTime").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 14, 10); + KDAddThought(enemy.id, "Play", 7, enemy.playWithPlayer); + + enemy.vp = Math.max(enemy.vp || 0, 3); + KDStunTurns(1, true); + } + KDGameData.CurrentDialogMsg = name + "Flirt" + (!KDEnemyCanTalk(enemy) ? "Gagged" : (enemy.personality || "")); + return false; + }, + leadsToStage: "", dontTouchText: true, exitDialogue: true, + }, + } + }; + dialog.options.LetMePass = {playertext: name + "LetMePass", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return !KinkyDungeonFlags.has("passthrough"); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (KinkyDungeonFlags.has("LetMePass")) { + KinkyDungeonSetEnemyFlag(enemy, "passthrough", 8); + KDGameData.CurrentDialog = ""; + KDGameData.CurrentDialogStage = ""; + KinkyDungeonSetFlag("LetMePass", 30); + } + } + return false; + }, + options: { + "Confirm": {playertext: name + "LetMePass_Confirm", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "passthrough", 8); + if (KinkyDungeonFlags.has("LetMePass")) { + KDGameData.CurrentDialog = ""; + KDGameData.CurrentDialogStage = ""; + } + KinkyDungeonSetFlag("LetMePass", 30); + } + return false; + }, + exitDialogue: true, + }, + "ConfirmAll": {playertext: name + "LetMePass_ConfirmAll", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetFlag("Passthrough", 8); + } + return false; + }, + exitDialogue: true, + }, + "Leave": {playertext: name + "LetMePass_Leave", response: "Default", + leadsToStage: "", + }, + } + }; + dialog.options.StopFollowingMe = {playertext: name + "StopFollowingMe", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return KDAllied(enemy) && !KDEnemyHasFlag(enemy, "NoFollow"); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 9999); + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + dialog.options.FollowMe = {playertext: name + "FollowMe", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return KDAllied(enemy) && KDEnemyHasFlag(enemy, "NoFollow") && !KDEnemyHasFlag(enemy, "Shop"); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (!KDEnemyHasFlag(enemy, "NoStay") + && (KDRandom() < (70 - KinkyDungeonGoddessRep.Ghost + KDGetModifiedOpinion(enemy) + (KinkyDungeonStatsChoice.get("Dominant") ? 50 : 0))/100 * 0.35 * KDEnemyHelpfulness(enemy) || enemy.Enemy.allied) + ) { + KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 0); + } else { + KDGameData.CurrentDialogMsg = name + "StayHere_Fail"; + KinkyDungeonSetEnemyFlag(enemy, "NoStay", 100); + } + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + dialog.options.DontStayHere = {playertext: name + "DontStayHere", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return !KDHostile(enemy) && KDEnemyHasFlag(enemy, "StayHere"); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "StayHere", 0); + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + dialog.options.StayHere = {playertext: name + "StayHere", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return !KDHostile(enemy) && !KDEnemyHasFlag(enemy, "StayHere") && !KDEnemyHasFlag(enemy, "Shop"); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (!KDEnemyHasFlag(enemy, "NoStay") && (KDRandom() < (50 - KinkyDungeonGoddessRep.Ghost + KDGetModifiedOpinion(enemy) + (KinkyDungeonStatsChoice.get("Dominant") ? 50 : 0))/100 * KDEnemyHelpfulness(enemy) * (KDAllied(enemy) ? 4.0 : 0.25) || enemy.Enemy.allied)) { + KinkyDungeonSetEnemyFlag(enemy, "StayHere", -1); + enemy.gx = enemy.x; + enemy.gy = enemy.y; + } else { + KDGameData.CurrentDialogMsg = name + "StayHere_Fail"; + KinkyDungeonSetEnemyFlag(enemy, "NoStay", 100); + } + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + dialog.options.Aggressive = {playertext: name + "Aggressive", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return !KDHostile(enemy) && KDEnemyHasFlag(enemy, "Defensive"); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "Defensive", 0); + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + dialog.options.Defensive = {playertext: name + "Defensive", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return !KDHostile(enemy) && !KDEnemyHasFlag(enemy, "Defensive") && !KDEnemyHasFlag(enemy, "Shop"); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "Defensive", -1); + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + dialog.options.HelpMe = {playertext: name + "HelpMe", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return !KDHostile(enemy) && enemy.Enemy.bound && !enemy.Enemy.tags.nohelp && !KDHelpless(enemy) + && !KDEnemyHasFlag(enemy, "NoHelp") && !KDEnemyHasFlag(enemy, "HelpMe") && KinkyDungeonAllRestraint().length > 0; + } + return false; + }, + options: { + "Confirm": {playertext: name + "HelpMe_Confirm", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (!KDEnemyHasFlag(enemy, "NoHelp") + && KDRandom() < (KDPersonalitySpread(125, 85, 25) - KinkyDungeonGoddessRep.Ghost + KDGetModifiedOpinion(enemy, true, true, true) + (KinkyDungeonStatsChoice.get("Dominant") ? 25 : 0))/100 * (KDPersonalitySpread(0.0, -0.25, -0.5) + (KDAllied(enemy) ? 2.0 : 1.0)) + ) { + KinkyDungeonChangeRep("Ghost", 3); + KinkyDungeonSetEnemyFlag(enemy, "HelpMe", 30); + KinkyDungeonSetEnemyFlag(enemy, "wander", 30); + } else { + KDGameData.CurrentDialogMsg = name + "HelpMe_Fail"; + KinkyDungeonSetEnemyFlag(enemy, "NoHelp", 100); + + KinkyDungeonSetEnemyFlag(enemy, "playLikely", 10); + KinkyDungeonChangeRep("Ghost", 1); + } + } + return false; + }, + leadsToStage: "", + dontTouchText: true, + }, + "Leave": {playertext: name + "HelpMe_Leave", response: "Default", + leadsToStage: "", + }, + } + }; + dialog.options.HelpMeCommandWord = {playertext: name + "HelpMeCommandWord", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker && enemy.Enemy.unlockCommandLevel > 0) { + return !KDHostile(enemy) && enemy.Enemy.bound && !enemy.Enemy.tags.nohelp && !KDHelpless(enemy) + && !KDEnemyHasFlag(enemy, "NoHelpCommandWord") && !KDEnemyHasFlag(enemy, "commandword") + && KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks).length > 0; + } + return false; + }, + options: { + "Confirm": {playertext: name + "HelpMeCommandWord_Confirm", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (!KDEnemyHasFlag(enemy, "NoHelpCommandWord") + && KDRandom() < (KDPersonalitySpread(125, 85, 25) - KinkyDungeonGoddessRep.Ghost + KDGetModifiedOpinion(enemy, true, true, true) + (KinkyDungeonStatsChoice.get("Dominant") ? 25 : 0))/100 * (KDPersonalitySpread(0.0, -0.25, -0.5) + (KDAllied(enemy) ? 2.0 : 1.0)) + ) { + KinkyDungeonChangeRep("Ghost", 3); + if (KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks).length > 0) { + for (let r of KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks, true)) { + KinkyDungeonLock(r, ""); + } + } + const unlockSpell = KinkyDungeonFindSpell("EffectEnemyCM" + (enemy?.Enemy?.unlockCommandLevel || 1), true) || KinkyDungeonFindSpell("EffectEnemyCM1", true); + KinkyDungeonCastSpell(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, unlockSpell, undefined, undefined, undefined); + + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + KinkyDungeonSetEnemyFlag(enemy, "commandword", enemy.Enemy.unlockCommandCD || 90); + } else { + KDGameData.CurrentDialogMsg = name + "HelpMeCommandWord_Fail"; + KinkyDungeonSetEnemyFlag(enemy, "NoHelpCommandWord", 100); + KinkyDungeonChangeRep("Ghost", 1); + } + } + return false; + }, + leadsToStage: "", + dontTouchText: true, + }, + "Leave": {playertext: name + "HelpMeCommandWord_Leave", response: "Default", + leadsToStage: "", + }, + } + }; + dialog.options.HelpMeKey = {playertext: name + "HelpMeKey", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return !KDHostile(enemy) && enemy.Enemy.bound && !enemy.Enemy.tags.nohelp && !KDHelpless(enemy) + && !KDEnemyHasFlag(enemy, "NoHelpKey") && enemy.items && enemy.items.includes("RedKey") && KinkyDungeonPlayerGetRestraintsWithLocks(KDKeyedLocks).length > 0; + } + return false; + }, + options: { + "Confirm": {playertext: name + "HelpMeKey_Confirm", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (!KDEnemyHasFlag(enemy, "NoHelpKey") + && KDRandom() < (KDPersonalitySpread(125, 85, 25) - KinkyDungeonGoddessRep.Ghost + KDGetModifiedOpinion(enemy, true, true, true) + (KinkyDungeonStatsChoice.get("Dominant") ? 25 : 0))/100 * (KDPersonalitySpread(0.0, -0.25, -0.5) + (KDAllied(enemy) ? 2.0 : 1.0)) + ) { + KinkyDungeonChangeRep("Ghost", 3); + KDAddConsumable("RedKey", 1); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Coins.ogg"); + enemy.items.splice(enemy.items.indexOf("RedKey"), 1); + } else { + KDGameData.CurrentDialogMsg = name + "HelpMeKey_Fail"; + KinkyDungeonSetEnemyFlag(enemy, "NoHelpKey", 100); + KinkyDungeonChangeRep("Ghost", 1); + } + } + return false; + }, + leadsToStage: "", + dontTouchText: true, + }, + "Leave": {playertext: name + "HelpMeKey_Leave", response: "Default", + leadsToStage: "", + }, + } + }; + dialog.options.DontHelpMe = {playertext: name + "DontHelpMe", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return enemy.Enemy.bound && !enemy.Enemy.tags.nohelp && !KDEnemyHasFlag(enemy, "NoHelp") && KDEnemyHasFlag(enemy, "HelpMe") && KinkyDungeonAllRestraint().length > 0; + } + return false; + }, + options: { + "Confirm": {playertext: name + "DontHelpMe_Confirm", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "HelpMe", 0); + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + } + return false; + }, + exitDialogue: true, + }, + "Leave": {playertext: name + "DontHelpMe_Leave", response: "Default", + leadsToStage: "", + }, + } + }; + + dialog.options.RemoveParty = {playertext: name + "RemoveParty", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return KDIsInParty(enemy); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "NoFollow", -1); + KDRemoveFromParty(enemy, false); + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + KDAllyDialog[name] = {name: name, tags: requireTags, singletag: requireSingleTag, excludeTags: excludeTags, weight: weight}; + return dialog; +} + + +let KDPrisonRescues: Record = {}; + + +/** + * @param name + * @param faction + * @param enemytypes + */ +function KDPrisonerRescue(name: string, faction: string, enemytypes: string[]): KinkyDialogue { + let dialogue: KinkyDialogue = { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonInterruptSleep(); + let door = KDGetJailDoor(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (door) { + if (door.tile?.Lock) { + door.tile.OGLock = door.tile.Lock; + door.tile.Lock = undefined; + door.tile.LockSeen = undefined; + KDUpdateDoorNavMap(); + } + KinkyDungeonMapSet(door.x, door.y, 'd'); + let e = DialogueCreateEnemy(door.x, door.y, enemytypes[0]); + e.allied = 9999; + e.faction = "Player"; + + KDRunCreationScript(e, KDGetCurrentLocation()); + KDGameData.CurrentDialogMsgSpeaker = e.Enemy.name; + + let reinforcementCount = Math.floor((KDRandom() > 0.5 ? 3 : 2) + + KDRandom() * (KDGameData.PriorJailbreaks ? (Math.min(5, KDGameData.PriorJailbreaks) + 1) : 1)); + KDGameData.PriorJailbreaks += 1; + for (let i = 0; i < reinforcementCount; i++) { + let pp = KinkyDungeonGetNearbyPoint(door.x, door.y, true, undefined, undefined); + if (pp) { + let ee = DialogueCreateEnemy(pp.x, pp.y, enemytypes[1] || enemytypes[0]); + ee.allied = 9999; + ee.faction = "Player"; + } + } + } + KDGameData.GuardSpawnTimer = 50 + Math.floor(KDRandom() * 10); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }; + KDPrisonRescues[name] = { + speaker: enemytypes[0], + faction: faction, + }; + return dialogue; +} + +// ["wolfGear", "wolfRestraints"] +function KDRecruitDialogue ( + name: string, + faction: string, + outfitName: string, + goddess: string, + restraints: string[], + restraintscount: number, + restraintsAngry: string[], + restraintscountAngry: number, + requireTags: string[], + requireSingleTag: string[], + excludeTags: string[], + chance: number +): KinkyDialogue +{ + /** + */ + let recruit: KinkyDialogue = { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag(name, -1, 1); + return false; + }, + options: { + "Yes": {gag: true, playertext: "Default", response: "Default", + options: { + "Yes": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDPleaseSpeaker(0.5); + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + KinkyDungeonChangeRep("Ghost", 2); + for (let i = 0; i < restraintscount; i++) { + let r = KinkyDungeonGetRestraint({tags: restraints}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (r) KinkyDungeonAddRestraintIfWeaker(r, ((enemy ? Math.min(10, enemy.Enemy.power) + KDEnemyRank(enemy) : 0) || 0), true, undefined, true, false, undefined, KDGetSpeakerFaction(), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined); + } + let outfit = {name: outfitName, type: Outfit, id: KinkyDungeonGetItemID()}; + if (!KinkyDungeonInventoryGet(outfitName)) KinkyDungeonInventoryAdd(outfit); + //if (KinkyDungeonInventoryGet("OutfitDefault")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("OutfitDefault")); + KinkyDungeonSetDress(outfitName, outfitName); + KinkyDungeonSetFlag("Recruit_" + name, -1); + KinkyDungeonSetFlag("Recruited", -1); + KDChangeFactionRelation("Player", faction, 0.4, true); + KDChangeFactionRelation("Player", faction, -0.2); + KDGameData.SlowMoveTurns = 3; + KinkyDungeonSleepTime = CommonTime() + 200; + KinkyDungeonSetFlag(name, -1, 1); + return false; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + "No": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let diff = KinkyDungeonStatsChoice.has("Dominant") ? 0 : 35; + if (KDBasicCheck([goddess], ["Ghost"]) <= diff) { + KDGameData.CurrentDialogStage = "Force"; + KDGameData.CurrentDialogMsg = name + "ForceYes"; + KDGameData.CurrentDialogMsgValue.Percent = KDAgilityDialogueSuccessChance(KDBasicCheck([goddess], ["Ghost"])); + KDGameData.CurrentDialogMsgData.PERCENT = `${Math.round(100 * KDGameData.CurrentDialogMsgValue.Percent)}%`; + } + KinkyDungeonChangeRep("Ghost", -1); + KinkyDungeonSetFlag(name, -1, 1); + return false; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + }, + }, + "No": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let diff = KinkyDungeonStatsChoice.has("Dominant") ? 0 : 45; + if (KDBasicCheck(["Metal"], ["Ghost"]) <= diff) { + KDGameData.CurrentDialogStage = "Force"; + KDGameData.CurrentDialogMsg = ""; + KDGameData.CurrentDialogMsgValue.Percent = KDAgilityDialogueSuccessChance(KDBasicCheck([goddess], ["Ghost"])); + KDGameData.CurrentDialogMsgData.PERCENT = `${Math.round(100 * KDGameData.CurrentDialogMsgValue.Percent)}%`; + } + KinkyDungeonChangeRep("Ghost", -1); + KinkyDungeonSetFlag(name, -1, 1); + return false; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + "Force": {gag: true, playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => {return false;}, + options: { + "Yes": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDPleaseSpeaker(0.08); + KinkyDungeonChangeRep("Ghost", 2); + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + for (let i = 0; i < restraintscount; i++) { + let r = KinkyDungeonGetRestraint({tags: restraints}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (r) KinkyDungeonAddRestraintIfWeaker(r, ((enemy ? Math.min(10, enemy.Enemy.power) + KDEnemyRank(enemy) : 0) || 0), true, undefined, true, false, undefined, KDGetSpeakerFaction(), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined); + } + let outfit = {name: outfitName, type: Outfit, id: KinkyDungeonGetItemID()}; + if (!KinkyDungeonInventoryGet(outfitName)) KinkyDungeonInventoryAdd(outfit); + //if (KinkyDungeonInventoryGet("Default")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Default")); + KinkyDungeonSetDress(outfitName, outfitName); + KinkyDungeonSetFlag("Recruit_" + name, -1); + KinkyDungeonSetFlag("Recruited", -1); + KDChangeFactionRelation("Player", faction, 0.4, true); + KDChangeFactionRelation("Player", faction, -0.2); + KDGameData.SlowMoveTurns = 3; + KinkyDungeonSleepTime = CommonTime() + 200; + KinkyDungeonSetFlag(name, -1, 1); + return false; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}},}, + "No": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let percent = KDGameData.CurrentDialogMsgValue.Percent; + KinkyDungeonChangeRep("Ghost", -1); + if (KDRandom() > percent) { + // Fail + KDIncreaseOfferFatigue(-20); + KDGameData.CurrentDialogMsg = name + "Force_Failure"; + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + for (let i = 0; i < restraintscountAngry; i++) { + let r = KinkyDungeonGetRestraint({tags: restraintsAngry}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (r) KinkyDungeonAddRestraintIfWeaker(r, ((enemy ? Math.min(10, enemy.Enemy.power) + KDEnemyRank(enemy) : 0) || 0), true, undefined, true, false, undefined, KDGetSpeakerFaction(), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined); + } + let outfit = {name: outfitName, type: Outfit, id: KinkyDungeonGetItemID()}; + if (!KinkyDungeonInventoryGet(outfitName)) KinkyDungeonInventoryAdd(outfit); + //if (KinkyDungeonInventoryGet("Default")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Default")); + KinkyDungeonSetDress(outfitName, outfitName); + KDGameData.SlowMoveTurns = 3; + KinkyDungeonSleepTime = CommonTime() + 200; + } else { + KDIncreaseOfferFatigue(10); + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDMakeHostile(enemy); + //KinkyDungeonChangeRep(goddess, -2); + } + } + KinkyDungeonSetFlag(name, -1, 1); + return false; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}},}, + }, + }, + } + }; + + KDRecruitDialog[name] = {name: name, outfit: outfitName, tags: requireTags, singletag: requireSingleTag, excludeTags: excludeTags, chance: chance}; + KDDialogueTriggers[name] = KDRecruitTrigger(name, KDRecruitDialog[name]); + return recruit; +} + +let KDMaxSellItems = 6; +// A shop where the NPC buys items +function KDShopDialogue(name: string, items: string[], requireTags: string[], requireSingleTag: string[], chance: number, itemsdrop: string[]): KinkyDialogue { + let shop: KinkyDialogue = { + inventory: true, + response: "Default", + clickFunction: (_gagged, _player) => { + /*let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "Shop", 0); + }*/ + let bonus = 1; + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + bonus = 1 / KDGetShopCost(enemy, true); + } + for (let i = 0; i < items.length; i++) { + let item = items[i]; + KDGameData.CurrentDialogMsgData["Item"+i] = KDGetItemNameString(item); + KDGameData.CurrentDialogMsgValue["ItemCost"+i] = Math.round(Math.min(bonus, 3.0) * KinkyDungeonItemCost(KDItem({name: item}), true, true)); + KDGameData.CurrentDialogMsgData["ItemCost"+i] = "" + KDGameData.CurrentDialogMsgValue["ItemCost"+i]; + KDGameData.CurrentDialogMsgData["AMNT"+i] = "" + ( + KinkyDungeonInventoryGetSafe(item) ? + (KinkyDungeonInventoryGetSafe(item).quantity || 1) : 0); + } + return false; + }, + options: {}, + }; + shop.options.Leave = {playertext: "Leave", exitDialogue: true, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "NoShop", 9999); + KinkyDungeonSetEnemyFlag(enemy, "NoTalk", 8); + } + return false; + }, + }; + shop.options.Buy = {playertext: "ItemShopBuy", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (enemy.items?.length > 0) return true; + } + return false; + }, + clickFunction: (_gagged, _player) => { + let e = KDGetSpeaker(); + KDStartDialog("ShopBuy", e.Enemy.name, true, e.personality, e); + return true; + }, + }; + shop.options.Attack = {gag: true, playertext: "ItemShopAttack", response: "Default", + options: { + "Confirm": {playertext: "ItemShopAttack_Confirm", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDMakeHostile(enemy); + KinkyDungeonChangeRep("Ghost", -5); + if (!KinkyDungeonHiddenFactions.has(KDGetFactionOriginal(enemy))) + KinkyDungeonChangeFactionRep(KDGetFactionOriginal(enemy), -0.06); + } + return false; + }, + exitDialogue: true, + }, + "Leave": {playertext: "ItemShopAttack_Leave", response: "Default", + leadsToStage: "", + }, + } + }; + + for (let i = 0; i < items.length; i++) { + let item = items[i]; + shop.options["Item" + i] = {playertext: "ItemShop" + i, response: name + item, + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + return KinkyDungeonInventoryGetSafe(item) != undefined && enemy && !KDHelpless(enemy); + }, + greyoutFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return KDGameData.CurrentDialogMsgValue["ItemCost"+i] < enemy.gold; + } + return false; + }, + greyoutTooltip: "KDNotEnoughMoneyVendor", + clickFunction: (_gagged, _player) => { + let itemInv = KinkyDungeonInventoryGetSafe(item); + if (itemInv.type == Consumable) + KinkyDungeonChangeConsumable(KDConsumable(itemInv), -1); + else KinkyDungeonInventoryRemoveSafe(itemInv); + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + let faction = KDGetFactionOriginal(enemy); + if (!KinkyDungeonHiddenFactions.has(faction)) { + KinkyDungeonChangeFactionRep(faction, Math.max(0.0001, KDGameData.CurrentDialogMsgValue["ItemCost"+i] * 0.00005)); + } + if (!enemy.items) enemy.items = []; + enemy.items.push(itemInv.name); + } + + for (let i = 0; i < items.length; i++) { + let item = items[i]; + KDGameData.CurrentDialogMsgData["AMNT"+i] = "" + ( + KinkyDungeonInventoryGetSafe(item) ? + (KinkyDungeonInventoryGetSafe(item).quantity || 1) : 0); + } + KinkyDungeonAddGold(KDGameData.CurrentDialogMsgValue["ItemCost"+i]); + KDPleaseSpeaker(0.05 * (KDGameData.CurrentDialogMsgValue["ItemCost"+i]/100)); + enemy.gold = enemy.gold ? Math.max(0, enemy.gold - KDGameData.CurrentDialogMsgValue["ItemCost"+i]) : 0; + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + } + KDShops[name] = {name: name, tags: requireTags, singletag: requireSingleTag, chance: chance, items: items, itemsdrop: itemsdrop}; + return shop; +} + +// The dialogue for npc selling you their inventory +function KDShopBuyDialogue(name: string): KinkyDialogue { + let shop: KinkyDialogue = { + inventory: true, + response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + let items: string[] = []; + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (enemy.items?.length > 0) items = enemy.items; + } + // Non-shopkeepers gouge you + let shopCost = KDGetShopCost(enemy, false); + for (let i = 0; i < items.length; i++) { + let item = items[i]; + let itemMult = shopCost; + KDGameData.CurrentDialogMsgData["ITM_"+i+"_"] = KDGetItemNameString(item); + KDGameData.CurrentDialogMsgValue["IC_"+i+"_"] = Math.round(itemMult * + KinkyDungeonItemCost(KDItem({name: item}))); + KDGameData.CurrentDialogMsgData["IC_"+i+"_"] = "" + KDGameData.CurrentDialogMsgValue["IC_"+i+"_"]; + KDGameData.CurrentDialogMsgData["AMNT_"+i+"_"] = "" + ( + KinkyDungeonInventoryGetSafe(item) ? + (KinkyDungeonInventoryGetSafe(item).quantity || 1) : 0); + //} + } + return false; + }, + options: {}, + }; + shop.options.Leave = {playertext: "Leave", exitDialogue: true, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "NoShop", 9999); + KinkyDungeonSetEnemyFlag(enemy, "NoTalk", 8); + } + return false; + }, + }; + shop.options.Sell = {playertext: "ShopBuySell", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + return KDEnemyHasFlag(enemy, "Shop"); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + for (let shp of Object.values(KDShops)) { + if (KDEnemyHasFlag(enemy, shp.name)) { + KDStartDialog(shp.name, enemy.Enemy.name, true, enemy.personality, enemy); + return true; + } + } + } + }, + }; + shop.options.Attack = {gag: true, playertext: "ItemShopAttack", response: "Default", + options: { + "Confirm": {playertext: "ItemShopAttack_Confirm", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDMakeHostile(enemy); + KinkyDungeonChangeRep("Ghost", -5); + if (!KinkyDungeonHiddenFactions.has(KDGetFactionOriginal(enemy))) + KinkyDungeonChangeFactionRep(KDGetFactionOriginal(enemy), -0.06); + } + return false; + }, + exitDialogue: true, + }, + "Leave": {playertext: "ItemShopAttack_Leave", response: "Default", + leadsToStage: "", + }, + } + }; + let maxNum = 100; + // Delayed so we can load the dialogue first + let _KDModsAfterLoad = KDModsAfterLoad; + KDModsAfterLoad = () => { + for (let i = 0; i < maxNum; i++) { + addTextKey("dShopBuyItem" + i, TextGet("dShopBuy") + .replace("#", "_"+i+"_") + .replace("#", "_"+i+"_") + .replace("#", "_"+i+"_") + ); + } + _KDModsAfterLoad(); + }; + for (let i = 0; i < maxNum; i++) { + shop.options["Item" + i] = {playertext: "ShopBuyItem" + i, response: name + "Item", + prerequisiteFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + let items: string[] = []; + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (enemy.items?.length > 0) items = enemy.items; + } + if (items.length > i) { + let item = items[i]; + if (KDSellCriteria[item]) { + if (!KDSellCriteria[item](enemy)) return false; + } + + // Don't sell what we want to buy + let shops = Object.values(KDShops).filter((shp) => {return KDEnemyHasFlag(enemy, shp.name);}); + + for (let shp of shops) { + if (shp.items?.includes(item)) return false; + } + + let itemInv = KinkyDungeonInventoryGet(item); + return (item && (!itemInv || itemInv.type == Consumable || itemInv.type == LooseRestraint)); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + let items: string[] = []; + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + if (enemy.items?.length > 0) items = enemy.items; + } + let item = items[i]; + let tooSubby = ((KinkyDungeonGoddessRep.Ghost + 50) / 10) > KDItemSubThreshold(item); + if (!tooSubby && KinkyDungeonGold >= KDGameData.CurrentDialogMsgValue["IC_"+i + "_"]) { + KinkyDungeonItemEvent({name: item, amount: 1}, true); + + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + let faction = KDGetFactionOriginal(enemy); + if (!KinkyDungeonHiddenFactions.has(faction)) { + KinkyDungeonChangeFactionRep(faction, Math.max(0.00005, KDGameData.CurrentDialogMsgValue["IC_"+i + "_"] * 0.00005)); + } + enemy.items.splice(i, 1); + } + KinkyDungeonAddGold(-KDGameData.CurrentDialogMsgValue["IC_"+i + "_"]); + KDPleaseSpeaker(0.025 * (KDGameData.CurrentDialogMsgValue["ItemCost"+i]/100)); + + // Refresh list + let shopCost = KDGetShopCost(enemy, false); + for (let ii = 0; ii < enemy.items.length; ii++) { + item = enemy.items[ii]; + let itemMult = shopCost; + KDGameData.CurrentDialogMsgData["ITM_"+ii+"_"] = KDGetItemNameString(item); + KDGameData.CurrentDialogMsgValue["IC_"+ii+"_"] = Math.round(itemMult * + KinkyDungeonItemCost(KDItem({name: item}))); + KDGameData.CurrentDialogMsgData["IC_"+ii+"_"] = "" + KDGameData.CurrentDialogMsgValue["IC_"+ii+"_"]; + + KDGameData.CurrentDialogMsgData["AMNT_"+ii+"_"] = "" + ( + KinkyDungeonInventoryGetSafe(item) ? + (KinkyDungeonInventoryGetSafe(item).quantity || 1) : 0); + //} + } + } else { + if (tooSubby) { + KDGameData.CurrentDialogMsg = "ShopBuy_Fail"; + } else { + KDGameData.CurrentDialogMsg = "ShopBuy_NoMoney"; + } + if (enemy && KDShopPersonalities.includes(KDGetPersonality(enemy))) KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + KDGetPersonality(enemy); + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + } + //KDShops[name] = {name: name, tags: requireTags, singletag: requireSingleTag, chance: chance}; + return shop; +} + +let KDOfferCooldown = 20; + +type refuseFunc = (firstRefused: boolean) => boolean; + +/** + * @param setupFunction - firstRefused is if the player said no first. Happens after the user clicks + * @param yesFunction - firstRefused is if the player said no then yes. Happens whenever the user submits + * @param noFunction - firstRefused is if the player said no then no. Happens whenever the user successfully avoids + * @param domFunction - firstRefused is if the player said no then no. Happens when the user clicks the Dominant response + */ +function KDYesNoTemplate(setupFunction: refuseFunc, yesFunction: refuseFunc, noFunction: refuseFunc, domFunction: refuseFunc): KinkyDialogue { + /** + */ + let dialogue: KinkyDialogue = { + tags: ["BondageOffer"], + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("BondageOffer", KDOfferCooldown); + return false; + }, + options: { + "Yes": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + return setupFunction(false); + }, + options: { + "Yes": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + return yesFunction(false); + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + "No": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + return noFunction(false); + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + "Dominant": {gag: true, playertext: "OfferDominant", response: "OfferDominantSuccess", + clickFunction: (_gagged, _player) => { + return domFunction(false); + }, + prerequisiteFunction: (_gagged, _player) => { + return !KinkyDungeonStatsChoice.get("Undeniable") && KDGetSpeaker()?.Enemy?.bound != undefined; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + }, + }, + "No": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + return setupFunction(true); + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + "Force": {gag: true, playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => {return false;}, + options: { + "Yes": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + return yesFunction(true); + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}},}, + "No": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + return noFunction(true); + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + "Dominant": {gag: true, playertext: "OfferDominant", response: "OfferDominantSuccess", + clickFunction: (_gagged, _player) => { + return domFunction(true); + }, + prerequisiteFunction: (_gagged, _player) => { + return KDGetSpeaker()?.Enemy?.bound != undefined; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + }, + }, + } + }; + + + return dialogue; +} + + +/** + * @param name + * @param goddess + * @param restraintTags + * @param allowedPrisonStates + * @param allowedPersonalities + * @param requireTagsSingle + * @param requireTagsSingle2 + * @param requireTags + * @param excludeTags + * @param requireFlags + * @param excludeFlags + * @param Lock + * @param WeightMult + */ +function KDDialogueTriggerOffer ( + name: string, + goddess: string[], + restraintTags: string[], + allowedPrisonStates: string[], + allowedPersonalities: string[], + requireTagsSingle: string[], + requireTagsSingle2: string[], + requireTags: string[], + excludeTags: string[], + requireFlags: string[], + excludeFlags: string[], + Lock: string = "Red", + WeightMult: number = 1.0 +): KinkyDialogueTrigger +{ + let trigger: KinkyDialogueTrigger = { + dialogue: name, + allowedPrisonStates: allowedPrisonStates, + allowedPersonalities: allowedPersonalities, + requireTagsSingle: requireTagsSingle, + requireTagsSingle2: requireTagsSingle2, + requireTags: requireTags, + excludeTags: excludeTags, + playRequired: true, + nonHostile: true, + noCombat: true, + noAlly: true, + talk: true, + blockDuringPlaytime: false, + onlyDuringPlay: true, + allowPlayExceptionSub: true, + prerequisite: (enemy, dist, AIData) => { + return (KDDefaultPrereqs(enemy, + AIData, + dist,1.5,0.1,restraintTags, + KDEnemyHasFlag(enemy, "allyOffer") || KDEnemyHasFlag(enemy, "forceOffer"), Lock)); + }, + weight: (_enemy, _dist) => { + if (requireFlags && !requireFlags.some((element) => KinkyDungeonFlags.get(element))) { + return 0; + } + if (excludeFlags && excludeFlags.some((element) => KinkyDungeonFlags.get(element))) { + return 0; + } + return WeightMult * (1 + 0.4 * Math.max(...goddess.map((element) => {return (Math.abs(KinkyDungeonGoddessRep[element])/100);}))); + }, + }; + return trigger; +} + +/** + * + * @param {string} name + * @param {string[]} goddess + * @param {string[]} antigoddess + * @param {string[]} restraint + * @param {number[]} diffSpread - 0 is yesfunction diff, 2 is nofunction diff, 1 is yesfunction dom (should be lower), 3 is nofunction dom (should be lower) + * @param {number[]} OffdiffSpread - 0 is submissive diff, 1 is normal diff, 2 is dom diff, 3 is dom diff if you have dom personality (should be between 1 and 2) + * @param {number} [count] + * @param {number} [countAngry] + * @param {string} [Lock] + * @param {boolean} [Ally] + * @param {{name: string, duration: number, floors?: number}[]} [Flags] - Sets flags on setup + * @returns {KinkyDialogue} + */ +function KDYesNoBasic ( + name: string, + goddess: string[], + antigoddess: string[], + restraint: string[], + diffSpread: number[], + OffdiffSpread: number[], + count: number = 1, + countAngry: number = 1, + Lock: string = "Red", + Ally: boolean = false, + Flags: { name: string, duration: number, floors?: number }[] = [], + CurseList: string = "", // Overrides Lock + HexList: string = "", + EnchantList: string = "", + hexlevelmin: number = 0, + hexlevelmax: number = 10, + enchantlevelmin: number = 0, + enchantlevelmax: number = 10, + + + +): KinkyDialogue +{ + + + return KDYesNoTemplate( + (refused) => { // Setup function. This is run when you click Yes or No in the start of the dialogue + for (let f of Flags) { + KinkyDungeonSetFlag(f.name, f.duration, f.floors); + } + // This is the restraint that the dialogue offers to add. It's selected from a set of tags. You can change the tags to change the restraint + let r = KinkyDungeonGetRestraint( + {tags: restraint}, + KDGetEffLevel() * 1.5 + KDGetOfferLevelMod(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + undefined, + Lock, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + { + allowLowPower: true + }); + if (r) { + KDGameData.CurrentDialogMsgData = { + "Data_r": r.name, + "RESTRAINT": KDGetRestraintName(r), + }; + + // Percent chance your dominant action ("Why don't you wear it instead?") succeeds + // Based on a difficulty that is the sum of four lines + // Dominant perk should help with this + KDGameData.CurrentDialogMsgValue.PercentOff = + KDOffensiveDialogueSuccessChance(KDBasicCheck(goddess, []) + - (KDDialogueGagged() ? 60 : 40) + - (KinkyDungeonStatsChoice.get("Undeniable") ? 100 : 0) + - (KinkyDungeonStatsChoice.has("Dominant") ? 0 : 40) + - KDPersonalitySpread(OffdiffSpread[0], OffdiffSpread[1], KinkyDungeonStatsChoice.has("Dominant") ? OffdiffSpread[3] : OffdiffSpread[2])); + // Set the string to replace in the UI + KDGameData.CurrentDialogMsgData.OFFPERC = `${Math.round(100 * KDGameData.CurrentDialogMsgValue.PercentOff)}%`; + } + + // If the player hits No first, this happens + if (refused) { + // Set up the difficulty of the check + // This check basically determines if we switch to the Force stage where the speaker tries to force you + let diff = KinkyDungeonStatsChoice.has("Dominant") ? diffSpread[1] : diffSpread[0]; + if (KinkyDungeonStatsChoice.get("Undeniable")) diff += 140; + // Failure condition + if (KDBasicCheck(goddess, antigoddess) <= diff) { + KDGameData.CurrentDialogStage = "Force"; + KDGameData.CurrentDialogMsg = name + "ForceYes"; // This is different from OfferLatexForce_Yes, it's a more reluctant dialogue... + // Set up percentage chance to resist + KDGameData.CurrentDialogMsgValue.Percent = KDAgilityDialogueSuccessChance(KDBasicCheck(goddess, antigoddess, KinkyDungeonStatsChoice.get("Undeniable") ? -70 : 0)); + KDGameData.CurrentDialogMsgData.PERCENT = `${Math.round(100 * KDGameData.CurrentDialogMsgValue.Percent)}%`; + } else { + // You succeed but get fatigue + KDIncreaseOfferFatigue(10); + } + KinkyDungeonChangeRep(antigoddess[0], -1); // Reduce submission because of refusal + KDAddOpinionPersistent(KDGetSpeaker().id, -5); + } + return false; + },(refused) => { // Yes function. This happens if the user submits willingly + if (!KinkyDungeonFlags.get("BoundOfferRep" + goddess[0])) { + KinkyDungeonChangeRep(goddess[0], 1.5); + KinkyDungeonSetFlag("BoundOfferRep" + goddess[0], -1, 1); + } + + if (Ally) + KDAllySpeaker(9999, true); + else + KDPleaseSpeaker(refused ? 0.012 : 0.024); // Less reputation if you refused + KinkyDungeonChangeRep(antigoddess[0], refused ? 1 : 2); // Less submission if you refused + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + let curse: string = undefined; + if (CurseList) { + curse = KDGetByWeight( + KinkyDungeonGetCurseByListWeighted( + [CurseList], + KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.Data_r).name, + false, + 0, + 1000)); + + } + if (HexList || EnchantList) { + DialogueAddCursedEnchantedHexed(KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.Data_r), + enemy, + curse, HexList, EnchantList, + hexlevelmin, hexlevelmax, + enchantlevelmin, enchantlevelmax); + } else + KinkyDungeonAddRestraintIfWeaker( + KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.Data_r), + ((enemy ? Math.min(10, enemy.Enemy.power) + KDEnemyRank(enemy) : 0) || 0), true, curse ? undefined : Lock, true, false, undefined, KDGetSpeakerFaction(), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, + curse); + KDAddOffer(1); + let num = count; + // Apply additional restraints + if (num > 1) { + let r = KinkyDungeonGetRestraint({tags: restraint}, + MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), undefined, + curse ? undefined : Lock, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + curse, + undefined, + undefined, + { + allowLowPower: true + }); + if (r) { + if (HexList || EnchantList) { + DialogueAddCursedEnchantedHexed(KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.Data_r), + enemy, + curse, HexList, EnchantList, + hexlevelmin, hexlevelmax, + enchantlevelmin, enchantlevelmax); + } else + KinkyDungeonAddRestraintIfWeaker(r, ((enemy ? Math.min(10, enemy.Enemy.power) + KDEnemyRank(enemy) : 0) || 0), true, + curse ? undefined : Lock, true, false, undefined, KDGetSpeakerFaction(), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, curse); + + } + } + return false; + },(refused) => { // No function. This happens when the user refuses. + // The first half is basically the same as the setup function, but only if the user did not refuse the first yes/no + if (!refused) { + // This check basically determines if we switch to the Force stage where the speaker tries to force you + let diff = KinkyDungeonStatsChoice.has("Dominant") ? diffSpread[3] : diffSpread[2]; // Slightly harder because we refused + if (KinkyDungeonStatsChoice.get("Undeniable")) diff += 140; + // Failure condition + if (KDBasicCheck(goddess, antigoddess) <= diff) { + KDGameData.CurrentDialogStage = "Force"; + KDGameData.CurrentDialogMsg = ""; + // Set up percentage chance to resist + KDGameData.CurrentDialogMsgValue.Percent = KDAgilityDialogueSuccessChance(KDBasicCheck(goddess, antigoddess, KinkyDungeonStatsChoice.get("Undeniable") ? -70 : 0)); + KDGameData.CurrentDialogMsgData.PERCENT = `${Math.round(100 * KDGameData.CurrentDialogMsgValue.Percent)}%`; + } else { + KDIncreaseOfferFatigue(10); + } + KinkyDungeonChangeRep(antigoddess[0], -1); + KDAddOpinionPersistent(KDGetSpeaker().id, -5); + } else { // If the user refuses we use the already generated success chance and calculate the result + let percent = KDGameData.CurrentDialogMsgValue.Percent; + KDAddOpinionPersistent(KDGetSpeaker().id, -5); + if (KDRandom() > percent) { // We failed! You get tied tight + KDIncreaseOfferFatigue(-20); + KDGameData.CurrentDialogMsg = name + "Force_Failure"; + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + let curse: string = undefined; + if (CurseList) { + curse = KDGetByWeight( + KinkyDungeonGetCurseByListWeighted( + [CurseList], + KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.Data_r).name, + false, + 0, + 1000)); + + } + if (HexList || EnchantList) { + DialogueAddCursedEnchantedHexed(KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.Data_r), + enemy, + curse, HexList, EnchantList, + hexlevelmin, hexlevelmax, + enchantlevelmin, enchantlevelmax); + } else + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.Data_r), ((enemy ? Math.min(10, enemy.Enemy.power) + KDEnemyRank(enemy) : 0) || 0), true, + curse ? undefined : Lock, true, false, undefined, KDGetSpeakerFaction(), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, curse); + KDAddOffer(1); + let num = refused ? countAngry : count; + // Apply additional restraints + if (num > 1) { + let r = KinkyDungeonGetRestraint({tags: restraint}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), undefined, + curse ? undefined : Lock, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + curse, + undefined, + undefined, + { + allowLowPower: true + }); + if (r) { + if (HexList || EnchantList) { + DialogueAddCursedEnchantedHexed(KinkyDungeonGetRestraintByName(KDGameData.CurrentDialogMsgData.Data_r), + enemy, + curse, HexList, EnchantList, + hexlevelmin, hexlevelmax, + enchantlevelmin, enchantlevelmax); + } else + KinkyDungeonAddRestraintIfWeaker(r, ((enemy ? Math.min(10, enemy.Enemy.power) + KDEnemyRank(enemy) : 0) || 0), true, + curse ? undefined : Lock, true, false, undefined, + KDGetSpeakerFaction(), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, + curse); + } + } + } else { + KDIncreaseOfferFatigue(10); + } + } + return false; + },(_refused) => { // Dom function. This is what happens when you try the dominant option + // We use the already generated percent chance + let percent = KDGameData.CurrentDialogMsgValue.PercentOff; + if (KDRandom() > percent) { + // If we fail, we aggro the enemy + KDIncreaseOfferFatigue(-20); + KDGameData.CurrentDialogMsg = "OfferDominantFailure"; + KDAggroSpeaker(100, true); + KDAddOpinionPersistent(KDGetSpeaker().id, -12); + } else { + // If we succeed, we get the speaker enemy and bind them + KDIncreaseOfferFatigue(10); + KDAddOpinionPersistent(KDGetSpeaker().id, 25); + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + enemy.playWithPlayer = 0; + enemy.playWithPlayerCD = 999; + let amount = 10; + if (!enemy.boundLevel) enemy.boundLevel = amount; + else enemy.boundLevel += amount; + } + KinkyDungeonChangeRep(antigoddess[0], -4); // Reduce submission because dom + } + return false; + }); +} + +/** + * A shop where the seller sells items + */ +function KDSaleShop(name: string, items: string[], requireTags: string[], requireSingleTag: string[], chance: number, markup: number, itemsdrop?: string[], multiplier: number = 1): KinkyDialogue { + if (!markup) markup = 1.0; + let shop: KinkyDialogue = { + response: "Default", + clickFunction: (_gagged, _player) => { + /*let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "Shop", 0); + }*/ + /*if (KDDialogueEnemy()) { + let enemy = KDDialogueEnemy(); + if (!enemy.items) + enemy.items = items; + }*/ + for (let i = 0; i < items.length; i++) { + let item = items[i]; + KDGameData.CurrentDialogMsgData["Item"+i] = KDGetItemNameString(item); + KDGameData.CurrentDialogMsgValue["ItemCost"+i] = Math.round(KinkyDungeonItemCost(KDItem({name: item})) * markup); + KDGameData.CurrentDialogMsgData["ItemCost"+i] = "" + KDGameData.CurrentDialogMsgValue["ItemCost"+i]; + KDGameData.CurrentDialogMsgData["AMNT"+i] = "" + ( + KinkyDungeonInventoryGetSafe(item) ? + (KinkyDungeonInventoryGetSafe(item).quantity || 1) : 0); + } + return false; + }, + options: {}, + }; + shop.options.Leave = {playertext: "Leave", exitDialogue: true, + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KinkyDungeonSetEnemyFlag(enemy, "NoShop", 9999); + KinkyDungeonSetEnemyFlag(enemy, "NoTalk", 8); + } + return false; + }, + }; + shop.options.Attack = {gag: true, playertext: "ItemShopAttack", response: "Default", + options: { + "Confirm": {playertext: "ItemShopAttack_Confirm", response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDMakeHostile(enemy); + KinkyDungeonChangeRep("Ghost", -5); + if (!KinkyDungeonHiddenFactions.has(KDGetFactionOriginal(enemy))) + KinkyDungeonChangeFactionRep(KDGetFactionOriginal(enemy), -0.06); + } + return false; + }, + exitDialogue: true, + }, + "Leave": {playertext: "ItemShopAttack_Leave", response: "Default", + leadsToStage: "", + }, + } + }; + + for (let i = 0; i < items.length; i++) { + let item = items[i]; + shop.options["Item" + i] = {playertext: "ItemShopBuy" + i, response: name + item, + prerequisiteFunction: (_gagged, _player) => { + return true;//KinkyDungeonInventoryGet(item) != undefined; + }, + clickFunction: (_gagged, _player) => { + let buy = false; + if (KinkyDungeonGold >= KDGameData.CurrentDialogMsgValue["ItemCost"+i]) { + buy = true; + if (!KDGiveItem(item, multiplier)) { + KDGameData.CurrentDialogMsg = name + "_AlreadyHave"; + buy = false; + } + + + /*if (KDRestraint({name: item})) { + // Sell the player a restraint + let rest = KinkyDungeonGetRestraintByName(item); + let Rname = rest.inventoryAs || rest.name; + if (!KinkyDungeonInventoryGetLoose(Rname)) { + KinkyDungeonInventoryAdd({name: Rname, type: LooseRestraint, events:rest.events, quantity: 1, id: KinkyDungeonGetItemID()}); + } else { + if (!KinkyDungeonInventoryGetLoose(Rname).quantity) KinkyDungeonInventoryGetLoose(Rname).quantity = 0; + KinkyDungeonInventoryGetLoose(Rname).quantity += 1; + } + } else if (KinkyDungeonFindBasic(item)) { + KDAddBasic(KinkyDungeonFindBasic(item)); + } else if (KDConsumable({name: item})) { + KinkyDungeonChangeConsumable(KDConsumable({name: item}), 1); + } else if (KDWeapon({name: item})) { + if (!KinkyDungeonInventoryGetWeapon(item)) { + KinkyDungeonInventoryAddWeapon(item); + } else { + + } + }*/ + } else { + KDGameData.CurrentDialogMsg = name + "_NoMoney"; + } + + if (buy) { + KinkyDungeonAddGold(-KDGameData.CurrentDialogMsgValue["ItemCost"+i]); + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + KDPleaseSpeaker(0.05 * (KDGameData.CurrentDialogMsgValue["ItemCost"+i]/100)); + let faction = KDGetFactionOriginal(enemy); + if (!KinkyDungeonHiddenFactions.has(faction)) { + KinkyDungeonChangeFactionRep(faction, Math.max(0.0001, KDGameData.CurrentDialogMsgValue["ItemCost"+i] * 0.00025)); + } + } + for (let i = 0; i < items.length; i++) { + let item = items[i]; + KDGameData.CurrentDialogMsgData["AMNT"+i] = "" + ( + KinkyDungeonInventoryGetSafe(item) ? + (KinkyDungeonInventoryGetSafe(item).quantity || 1) : 0); + } + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }; + } + KDShops[name] = {name: name, tags: requireTags, singletag: requireSingleTag, chance: chance, items: items, itemsdrop: itemsdrop || items}; + return shop; +} + +/* + + "Leave": {playertext: "Leave", exitDialogue: true} + clickFunction: (_gagged, _player) => {KinkyDungeonStartChase(undefined, "Refusal");}, + +clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", 3); +},*/ + +/** + * Yoinks a nearby enemy and brings them next to x + * + * @param x + * @param y + * @param radius + * @param [unaware] + */ +function DialogueBringNearbyEnemy(x: number, y: number, radius: number, unaware?: boolean): entity { + let nearby = KDNearbyEnemies(x, y, radius); + for (let e of nearby) { + if (!KDHelpless(e) + //&& KDistChebyshev(x - e.x, y - e.y) <= radius + && KinkyDungeonAggressive(e) + && !KDIsImmobile(e) && !e.Enemy.tags.temporary + && (!KDAIType[KDGetAI(e)]?.ambush || e.ambushtrigger) + && (!unaware || !e.aware)) { + let point = KinkyDungeonNoEnemy(x, y, true) ? {x:x, y:y} : KinkyDungeonGetNearbyPoint(x, y, true); + if (point) { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonDiscovered"), "#ff5277", 1); + KDMoveEntity(e, point.x, point.y, true); + return e; + } + } + } + return null; +} + +/** + * Yoinks a nearby enemy and brings them next to x + * + * @param x + * @param y + * @param enemy + */ +function DialogueBringSpecific(x: number, y: number, enemy: entity): entity { + if (enemy) { + let point = KinkyDungeonNoEnemy(x, y, true) ? {x:x, y:y} : KinkyDungeonGetNearbyPoint(x, y, true); + if (point) { + KDMoveEntity(enemy, point.x, point.y, true); + enemy.path = undefined; + enemy.gx = x; + enemy.gy = y; + return enemy; + } + } + return null; +} + +/** + * Returns if you are submissive enough to be played with by this enemy + * @param enemy + */ +function KDIsSubmissiveEnough(_enemy?: entity): boolean { + let diff = KDPersonalitySpread(20, -20, -51, _enemy); + if (KinkyDungeonGoddessRep.Ghost >= diff) return true; + return false; +} + + +/** + * @param enemy + * @param [allowFaction] Optionally apply faction rep modifier + * @param [allowSub] Optionally apply sub modifier + * @param [allowPerk] Optionally apply perk modifiers + * @param [allowOnlyPosNegFaction] + */ +function KDGetModifiedOpinion(enemy: entity, allowFaction: boolean = true, allowSub: boolean = true, allowPerk: boolean = false, allowOnlyPosNegFaction: number = 0): number { + if (!enemy) return 0; + let op = enemy.opinion || KDGameData.Collection[enemy.id]?.Opinion || 0; + + if (allowFaction) { + let faction = KDGetFaction(enemy); + let rel = KDFactionRelation("Player", faction); + op += (rel > 0 ? 10 : 20) * (!allowOnlyPosNegFaction ? rel : + (allowOnlyPosNegFaction > 0 ? Math.max(rel, 0) + : Math.min(rel, 0) + ) + ); + } + if (allowSub && KinkyDungeonStatsChoice.get("Dominant") && enemy.personality && KDLoosePersonalities.includes(enemy.personality)) op += 12; + if (allowPerk && KinkyDungeonStatsChoice.get("Oppression")) op -= 15; + + return op; +} + +/** + * @param Amount + */ +function KDAddOffer(Amount: number) { + if (!KDGameData.OfferCount) KDGameData.OfferCount = 0; + KDGameData.OfferCount += Amount; +} + +function KDGetOfferLevelMod(): number { + return Math.round(0.25 * (KDGameData.OfferCount || 0)); +} + +/** + * @param player + */ +function KDRunChefChance(player: entity) { + if (!KinkyDungeonFlags.get("SpawnedChef")) { + let x = player.x; + let y = player.y; + if (KDRandom() < KDDialogueParams.ChefChance && KinkyDungeonGagTotal() == 0) { + let point = KinkyDungeonGetNearbyPoint(x, y, true); + if (point) { + KinkyDungeonSetFlag("SpawnedChef", -1, 1); + let e = DialogueCreateEnemy(point.x, point.y, "Chef"); + if (e) { + + KinkyDungeonSendTextMessage(10, TextGet("KDSpawnChef"), "#ff5277", 1); + e.aware = true; + e.faction = "Ambush"; + KDRunCreationScript(e, KDGetCurrentLocation()); + } + } + } + } +} + +/** + * @param item + * @param [nomult] + */ +function KDItemSubThreshold(item: string, nomult?: boolean): number { + let mult = 1.0; + if (!nomult) { + if (KinkyDungeonStatsChoice.get("Oppression")) mult = 0.25; + else if (KinkyDungeonStatsChoice.get("Dominant")) mult = 5; + } + if (item == "RedKey") return mult*0.4; + if (item == "Pick") return mult*0.75; + if (item == "BlueKey") return mult*0.1; + if (KinkyDungeonFindConsumable(item)?.sub) return Math.max(0, 1 - mult*KinkyDungeonFindConsumable(item).rarity * KinkyDungeonFindConsumable(item).sub); + if (KinkyDungeonFindWeapon(item)?.cutBonus) return Math.max(0, 1 - mult*KinkyDungeonFindWeapon(item)?.cutBonus*3); +} + +function KDGetShopCost(enemy: entity, sell: boolean): number { + let shopCost = KDEnemyHasFlag(enemy, "Shop") ? (sell ? 0.5 : 0.5) : 1.5 + (0.1 * MiniGameKinkyDungeonLevel); + shopCost *= KinkyDungeonMultiplicativeStat(0.02*(KDGetModifiedOpinion(enemy) + (KDEnemyHasFlag(enemy, "Shop") ? 30 : 0))); + shopCost += 1; + return shopCost; +} + +function KDAggroMapFaction() { + if (KDMapData.JailFaction && KDMapData.JailFaction[0]) + KinkyDungeonAggroFaction(KDMapData.JailFaction[0]); +} + + +function DialogueAddCursedEnchantedHexed( + restraint: restraint, + enemy?: entity, + Curse?: string, + HexList?: string, + EnchantList?: string, + hexlevelmin: number = 0, + hexlevelmax: number = 10, + enchantlevelmin: number = 0, + enchantlevelmax: number = 10, + returnOnly: boolean = false, + inventory: boolean = false, + Lock?: string, +): item { + + let unlockcurse = null; + let hexVariant = ""; + let enchantVariant = ""; + let enchant_extra = []; + let hex_extra = []; + let enchants = 1; + let curses = 1; + if (HexList) { + while (curses > 0) { + let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted(HexList, restraint.name, + false, hexlevelmin, hexlevelmax, [hexVariant, ...hex_extra])); + if (!hexVariant) { + hexVariant = curs; + } else { + hex_extra.push(curs); + } + curses -= 1; + } + } + if (EnchantList) { + while (enchants > 0) { + let ench = KDGetByWeight( + KinkyDungeonGetEnchantmentsByListWeighted(EnchantList, ModifierEnum.restraint, + restraint.name, false, enchantlevelmin, enchantlevelmax, + [enchantVariant, ...enchant_extra]) + ); + if (!enchantVariant) { + enchantVariant = ench; + } else { + enchant_extra.push(ench); + } + enchants -= 1; + } + } + if (Curse) { + unlockcurse = Curse; + } + if (hexVariant || enchantVariant) { + let events: KinkyDungeonEvent[] = JSON.parse(JSON.stringify(KDRestraint({name: restraint.name}).events || [])); + let variant: KDRestraintVariant = { + template: restraint.name, + events: events, + }; + if (!!(unlockcurse ? undefined : Lock)) variant.lock = Lock; + if (hexVariant) { + events.push(...KDEventHexModular[hexVariant].events({variant: variant})); + } + for (let c of hex_extra) { + events.push(...KDEventHexModular[c].events({variant: variant})); + } + if (enchantVariant) { + events.push(...KDEventEnchantmentModular[enchantVariant].types[KDModifierEnum.restraint].events(restraint.name, undefined, hexVariant, enchantVariant, enchant_extra, {variant: variant})); + } + for (let e of enchant_extra) { + events.push(...KDEventEnchantmentModular[e].types[KDModifierEnum.restraint].events(restraint.name, undefined, hexVariant, enchantVariant, enchant_extra, {variant: variant})); + } + + if (returnOnly) { + return KDReturnInventoryVariant(variant, KDEventEnchantmentModular[enchantVariant]?.prefix, unlockcurse, undefined, undefined, KDEventEnchantmentModular[enchantVariant]?.suffix, + (enemy ? KDGetFaction(enemy) : undefined) || (unlockcurse ? "Curse" : undefined), + undefined, 1); + } else { + if (inventory) { + KDGiveInventoryVariant(variant, KDEventEnchantmentModular[enchantVariant]?.prefix, unlockcurse, undefined, undefined, KDEventEnchantmentModular[enchantVariant]?.suffix, + (enemy ? KDGetFaction(enemy) : undefined) || (unlockcurse ? "Curse" : undefined), + undefined, 1); + + } else { + KDEquipInventoryVariant(variant, KDEventEnchantmentModular[enchantVariant]?.prefix, 0, true, unlockcurse ? undefined : Lock, true, false, + (enemy ? KDGetFaction(enemy) : undefined) || (unlockcurse ? "Curse" : undefined), true, unlockcurse, enemy, false, undefined, undefined, KDEventEnchantmentModular[enchantVariant]?.suffix); + + } + } + + } + return null; +} + +/** Returns 10% of current binding or 10, whichever is more, but not including protected bondage */ +function KDGetPlayerUntieBindAmt(enemy: entity): number { + let baseAmnt = Math.max(10, (enemy.boundLevel || 0) * 0.1); + if (!enemy.boundLevel || baseAmnt > enemy.boundLevel) baseAmnt = enemy.boundLevel; + let minimumBondage = KDGetExpectedBondageAmountTotal(enemy.id, enemy, false, true); + if (enemy.specialBoundLevel) + for (let sbt of Object.entries(enemy.specialBoundLevel)) { + if (KDSpecialBondage[sbt[0]]?.helpImmune) { + minimumBondage += sbt[1]; + } + } + baseAmnt -= minimumBondage; + return Math.max(baseAmnt, 0); +} + +function KDUntieEnemy(enemy: entity, amount: number, includeConjured: boolean = false, includeUnlocked: boolean = false) { + let expected = KDGetExpectedBondageAmount(enemy.id, enemy, includeConjured, includeUnlocked); + let entries = Object.entries(enemy.specialBoundLevel || {}).sort((entry, entry2) => { + return (KDSpecialBondage[entry[0]]?.priority || 0) - (KDSpecialBondage[entry2[0]]?.priority || 0) + }); + for (let i = 0; i < entries.length && amount > 0; i++) { + let entry = entries[i]; + let amtOld = entry[1]; + entry[1] -= amount; + if (expected[entry[0]] && entry[1] < expected[entry[0]]) { + entry[1] = expected[entry[0]]; + } + if (entry[1] < 0) entry[1] = 0; + let amtNew = entry[1]; + let amntRemoved = amtOld - amtNew; + if (!enemy.specialBoundLevel) enemy.specialBoundLevel = {}; + if (entry[1] > 0) enemy.specialBoundLevel[entry[0]] = entry[1]; + else delete enemy.specialBoundLevel[entry[0]]; + amount -= amntRemoved; + if (!enemy.boundLevel) enemy.boundLevel = 0; + enemy.boundLevel -= amntRemoved; + } + if (amount > 0 && enemy.boundLevel > 0) { + enemy.boundLevel -= amount; + } + if (enemy.boundLevel < 0) { + enemy.boundLevel = 0; + } +} \ No newline at end of file diff --git a/Game/src/dialogue/KinkyDungeonDialogueList.ts b/Game/src/dialogue/KinkyDungeonDialogueList.ts new file mode 100644 index 000000000..65e67d1b5 --- /dev/null +++ b/Game/src/dialogue/KinkyDungeonDialogueList.ts @@ -0,0 +1,5464 @@ +"use strict"; + +let KDDialogueParams = { + ShopkeeperHelpFee: 230, + ShopkeeperHelpFeePerLevel: 70, + ShopkeeperHelpFeePerPower: 10, + ShopkeeperHelpFeeFreebiePower: 20, + ShopkeeperFee: 900, + ShopkeeperFeePerLevel: 100, + ShopkeeperFeePunishThresh: 2500, + ChefChance: 0.1, +}; + +/** + * Tags that are deleted on ng++ + */ +let KDResertNGTags: string[] = [ + "BossDialogueFuuka", + "BossDialogueTheWarden", + "BossDialogueSilverWitch", + "BossDialogueSelene", + "BossDialogueDollmaker", +]; + + +let KDShopPersonalities = ["", "Sub", "Dom", "Brat", "Robot"]; +let KDShops: Record = {}; + + + +let KDRecruitDialog: Record = {}; + +let KDAllyDialog: Record = {}; + +let KDSleepBedPercentage = 0.5; + +let KDDialogue: Record = { + "GhostInfo": { + response: "Default", + options: { + "Continue" : { + clickFunction: (_gagged, _player) => { + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + return false; + }, + playertext: "Default", exitDialogue: true, + }, + //"Nice" : {gag: true, playertext: "Default", exitDialogue: true}, + //"Snark" : {playertext: "Default", exitDialogue: true}, + //"Brash" : {gag: true, playertext: "Default", exitDialogue: true}, + }, + }, + "Tutorial1": { + response: "Default", + options: { + "Continue" : { + clickFunction: (_gagged, _player) => { + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + let zombie = DialogueCreateEnemy(KDMapData.StartPosition.x + 7, 3, "FastZombie"); + zombie.AI = "guard"; + zombie.gxx = KDMapData.StartPosition.x + 8; + zombie.gyy = KDMapData.GridHeight - 2; + return false; + }, + playertext: "GhostInfo_Continue", exitDialogue: true, + }, + //"Nice" : {gag: true, playertext: "Default", exitDialogue: true}, + //"Snark" : {playertext: "Default", exitDialogue: true}, + //"Brash" : {gag: true, playertext: "Default", exitDialogue: true}, + }, + }, + "Tutorial2_mp3": { + response: "Default", + options: { + "Continue" : { + clickFunction: (_gagged, _player) => { + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + DialogueCreateEnemy(KDMapData.StartPosition.x + 22, 3, "FastZombie"); + return false; + }, + playertext: "GhostInfo_Continue", exitDialogue: true, + }, + //"Nice" : {gag: true, playertext: "Default", exitDialogue: true}, + //"Snark" : {playertext: "Default", exitDialogue: true}, + //"Brash" : {gag: true, playertext: "Default", exitDialogue: true}, + }, + }, + "Tutorial2_dp2": { + response: "Default", + options: { + "Continue" : { + clickFunction: (_gagged, _player) => { + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + DialogueCreateEnemy(KDMapData.StartPosition.x + 32, 4, "FastZombie"); + return false; + }, + playertext: "GhostInfo_Continue", exitDialogue: true, + }, + //"Nice" : {gag: true, playertext: "Default", exitDialogue: true}, + //"Snark" : {playertext: "Default", exitDialogue: true}, + //"Brash" : {gag: true, playertext: "Default", exitDialogue: true}, + }, + }, + "WeaponFound": { + response: "WeaponFound", + personalities: ["Robot", "Brat", "Sub", "Dom"], + options: { + "Accept": {gag: true, playertext: "WeaponFoundAccept", response: "GoodGirl", personalities: ["Dom", "Sub", "Robot"], + clickFunction: (_gagged, _player) => { + if ((KinkyDungeonFlags.get("jailStripSearched") || 0) < KDJailStripSearchTempTime) { + KinkyDungeonSetFlag("jailStripSearched", 0); + } + + KinkyDungeonSendTextMessage(10, TextGet("KDWeaponConfiscated"), "#ff5277", 2); + if (!isUnarmed(KinkyDungeonPlayerDamage)) { + KinkyDungeonChangeRep("Ghost", 3); + let item = KinkyDungeonInventoryGetWeapon(KinkyDungeonPlayerWeapon); + KDSetWeapon(null); + if (item) { + KinkyDungeonAddLostItems([item], false); + KinkyDungeonInventoryRemove(item); + } + + KinkyDungeonSetFlag("demand", 4); + } + return false; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}}, + "Bluff": {playertext: "", response: "", + prerequisiteFunction: (_gagged, _player) => {return false;}, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}}, + "Deny": {gag: true, playertext: "WeaponFoundDeny", response: "Punishment", personalities: ["Dom", "Sub", "Robot", "Brat"], + clickFunction: (_gagged, _player) => { + KinkyDungeonStartChase(undefined, "Refusal"); + KDAggroSpeaker(); + return false; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}}, + "Illusion": {gagDisabled: true, playertext: "WeaponFoundIllusion", response: "Disbelief", personalities: ["Dom", "Sub", "Robot"], + prerequisiteFunction: (_gagged, _player) => {return KinkyDungeonGoddessRep.Illusion >= 51;}, + clickFunction: (_gagged, _player) => { + if (KDGameData.CurrentDialogMsgSpeaker == "MaidforceHead") { + KDGameData.CurrentDialogStage = "Deny"; + KDGameData.CurrentDialogMsg = "HeadMaidExcuseMe"; + KinkyDungeonStartChase(undefined, "Refusal"); + KDAggroSpeaker(); + } else { + let diff = KDPersonalitySpread(40, 60, 80); + if (KDBasicCheck(["Illusion", "Ghost"], ["Prisoner"]) > diff) { + KDGameData.CurrentDialogStage = "Bluff"; + KDGameData.CurrentDialogMsg = "Bluffed"; + KinkyDungeonChangeRep("Ghost", -2); + } + KDDialogueApplyPersonality(["Dom", "Sub", "Robot"]); + } + return false; + }, + options: {"Back": {playertext: "Pause", leadsToStage: ""}}}, + "Conjure": {gagDisabled: true, playertext: "WeaponFoundConjure", response: "Disbelief", personalities: ["Dom", "Sub", "Robot"], + prerequisiteFunction: (_gagged, _player) => {return KinkyDungeonGoddessRep.Conjure >= 51;}, + clickFunction: (_gagged, _player) => { + let diff = KDPersonalitySpread(40, 60, 80); + if (KDBasicCheck(["Conjure", "Ghost"], ["Prisoner"]) > diff) { + KDGameData.CurrentDialogStage = "Bluff"; + KDGameData.CurrentDialogMsg = "Bluffed"; + KinkyDungeonChangeRep("Ghost", -2); + } + KDDialogueApplyPersonality(["Dom", "Sub", "Robot"]); + return false; + }, + options: {"Back": {playertext: "Pause", leadsToStage: ""}}}, + "Elements": {gagDisabled: true, playertext: "WeaponFoundElements", response: "Disbelief", personalities: ["Dom", "Sub", "Robot"], + prerequisiteFunction: (_gagged, _player) => {return KinkyDungeonGoddessRep.Elements >= 51;}, + clickFunction: (_gagged, _player) => { + let diff = KDPersonalitySpread(40, 60, 80); + if (KDBasicCheck(["Elements", "Ghost"], ["Prisoner"]) > diff) { + KDGameData.CurrentDialogStage = "Bluff"; + KDGameData.CurrentDialogMsg = "Bluffed"; + KinkyDungeonChangeRep("Ghost", -2); + } + KDDialogueApplyPersonality(["Dom", "Sub", "Robot"]); + return false; + }, + options: {"Back": {playertext: "Pause", leadsToStage: ""}}}, + "Rope": {gagDisabled: true, playertext: "WeaponFoundRope", response: "Disbelief", personalities: ["Dom", "Sub", "Robot"], + prerequisiteFunction: (_gagged, _player) => {return KinkyDungeonGoddessRep.Rope >= 51;}, + clickFunction: (_gagged, _player) => { + let diff = KDPersonalitySpread(40, 60, 80); + if (KDBasicCheck(["Rope", "Ghost"], ["Prisoner"]) > diff) { + KDGameData.CurrentDialogStage = "Bluff"; + KDGameData.CurrentDialogMsg = "Bluffed"; + KinkyDungeonChangeRep("Ghost", -2); + } + KDDialogueApplyPersonality(["Dom", "Sub", "Robot"]); + return false; + }, + options: {"Back": {playertext: "Pause", leadsToStage: ""}}}, + "Leather": {gagDisabled: true, playertext: "WeaponFoundLeather", response: "Disbelief", personalities: ["Dom", "Sub", "Robot"], + prerequisiteFunction: (_gagged, _player) => {return KinkyDungeonGoddessRep.Leather >= 51;}, + clickFunction: (_gagged, _player) => { + let diff = KDPersonalitySpread(40, 60, 80); + if (KDBasicCheck(["Leather", "Ghost"], ["Prisoner"]) > diff) { + KDGameData.CurrentDialogStage = "Bluff"; + KDGameData.CurrentDialogMsg = "Bluffed"; + KinkyDungeonChangeRep("Ghost", -2); + } + KDDialogueApplyPersonality(["Dom", "Sub", "Robot"]); + return false; + }, + options: {"Back": {playertext: "Pause", leadsToStage: ""}}}, + } + }, + "StripSearch": { + response: "StripSearch", + personalities: ["Robot", "Brat", "Sub", "Dom"], + options: { + "Accept": {gag: true, playertext: "Default", response: "GoodGirl", personalities: ["Dom", "Sub", "Robot"], + clickFunction: (_gagged, _player) => { + if ((KinkyDungeonFlags.get("jailStripSearched") || 0) < KDJailStripSearchTempTime) { + KinkyDungeonSetFlag("jailStripSearched", 0); + } + + KDRemovePrisonRestraints(); + + //KinkyDungeonSendTextMessage(10, TextGet("KDWeaponConfiscated"), "#ff5277", 2); + if (!isUnarmed(KinkyDungeonPlayerDamage)) { + KinkyDungeonChangeRep("Ghost", 3); + let item = KinkyDungeonInventoryGetWeapon(KinkyDungeonPlayerWeapon); + KDSetWeapon(null); + if (item) { + KinkyDungeonAddLostItems([item], false); + KinkyDungeonInventoryRemove(item); + } + + KinkyDungeonSetFlag("demand", 4); + } + return false; + }, + options: { + "1": {playertext: "Continue", response: "Default", gag: false, + clickFunction: (_gagged, _player) => { + let CurrentDress = KinkyDungeonCurrentDress; + let dressList = KDGetDressList()[CurrentDress]; + for (let d of dressList) { + if (d.Item && ( + ModelDefs[d.Item]?.Categories.includes("Bras") + || ModelDefs[d.Item]?.Categories.includes("Panties") + )) continue; + d.Lost = true; + } + KinkyDungeonCheckClothesLoss = true; + KinkyDungeonDressPlayer(); + + return false; + }, + options: { + "2": {playertext: "Continue", response: "Default", gag: false, + clickFunction: (_gagged, _player) => { + for (let w of KinkyDungeonAllWeapon()) { + if (!KDWeapon(w) || isUnarmed(KDWeapon(w))) { + KinkyDungeonSendTextMessage(10, TextGet("KDItemConfiscated") + .replace("ITMN", KDGetItemName(w)) + .replace("AMNT", "1") + , "#ff5277", 2); + KDAddLostItemSingle(w.inventoryVariant || w.name, 1); + KinkyDungeonInventoryRemoveSafe(w); + } + + } + return false; + }, + options: { + "3": {playertext: "Continue", response: "Default", gag: false, + clickFunction: (_gagged, _player) => { + for (let c of [...KinkyDungeonAllConsumable(), ...KinkyDungeonAllLooseRestraint()]) { + let quantity = c.quantity || 1; + if (KDConsumable(c)?.isSubby) { + KinkyDungeonSendTextMessage(10, TextGet("KDItemNotConfiscated") + .replace("ITMN", KDGetItemName(c)) + .replace("AMNT", quantity + "") + , "#aaaaaa", 2); + + continue; + } + let confiscated = quantity; + if (KDConsumable(c)?.sneakChance) { + for (let i = 0; i < confiscated; i++) { + if (KDRandom() < KDConsumable(c)?.sneakChance) { + confiscated--; + } + } + if (confiscated > 1 + Math.floor(quantity * KDConsumable(c)?.sneakChance)) + confiscated = 1 + Math.floor( + KDConsumable(c)?.sneakChance * quantity + ); + confiscated = Math.floor(confiscated); + if (confiscated > quantity) confiscated = quantity; + } + + if (confiscated > 0) { + KinkyDungeonSendTextMessage(10, TextGet("KDItemConfiscated") + .replace("ITMN", KDGetItemName(c)) + .replace("AMNT", confiscated + "") + , "#ff5277", 2); + if (KDConsumable(c)) { + KDAddConsumable(c.inventoryVariant || c.name, -confiscated); + KDAddLostItemSingle(c.inventoryVariant || c.name, confiscated); + } else if (KDRestraint(c)) { + let item = KinkyDungeonInventoryGetSafe(c.inventoryVariant || c.name); + if (item.quantity) { + item.quantity = Math.max(0, item.quantity - confiscated); + } else { + item.quantity = 0; + } + if (item.quantity == 0) KinkyDungeonInventoryRemoveSafe(c); + + KDAddLostItemSingle(c.inventoryVariant || c.name, confiscated); + } + } + if (confiscated < quantity) { + KinkyDungeonSendTextMessage(10, TextGet("KDItemNotConfiscatedSneak") + .replace("ITMN", KDGetItemName(c)) + .replace("AMNT", (quantity - confiscated) + "") + , "#88ff88", 2); + } + + } + return false; + }, + options: { + "End": {gag: false, response: "Default", personalities: ["Sub"], playertext: "Continue", + clickFunction: (_gagged, _player) => { + let e = KDGetSpeaker(); + KDApplyJailOutfit(); + + if (e) { + KDTryToLeash(e, _player, 1, true); + KDTryToLeash(e, _player, 1, true); + KinkyDungeonAttachTetherToEntity(2.5, e, _player); + } + return false; + }, + options: { + "Leave": {playertext: "Leave", exitDialogue: true} + } + }, + } + }, + } + }, + } + }, + } + }, + "Deny": {gag: true, playertext: "StripSearchDeny", response: "Punishment", personalities: ["Dom", "Sub", "Robot", "Brat"], + greyoutFunction: (_gagged, _player) => { + return KinkyDungeonHasWill(0.1); + }, + greyoutTooltip: "KDTextGrayNeedWP", + clickFunction: (_gagged, _player) => { + KinkyDungeonStartChase(undefined, "Refusal"); + KDAggroSpeaker(); + return false; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}}, + } + }, + "PrisonIntro": { + response: "Default", + options: { + "NewLife": {playertext: "Default", response: "Default", + options: { + "Pout": {playertext: "Default", response: "Default", options: {"Continue" : {playertext: "Continue", leadsToStage: "Rules"}}}, + "Brat": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", -10); + KinkyDungeonChangeRep("Prisoner", 3); + return false; + }, + options: {"Continue" : {playertext: "Continue", leadsToStage: "Rules"}}}, + "Sub": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", 10); + return false; + }, + options: {"Continue" : {playertext: "Continue", leadsToStage: "Rules"}}}, + } + }, + "Rules": {playertext: "Default", response: "Default", + options: { + "Pout": {playertext: "Default", response: "Default", options: {"Continue" : {playertext: "Continue", exitDialogue: true}}}, + "Brat": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", -10); + KinkyDungeonChangeRep("Prisoner", 3); + return false; + }, + options: {"Continue" : {playertext: "Continue", exitDialogue: true}}}, + "Sub": {gag: true, playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", 10); + return false; + }, + options: {"Continue" : {playertext: "Continue", exitDialogue: true}}}, + } + }, + } + }, + "PrisonRepeat": { + response: "Default", + clickFunction: (_gagged) => { + let GoldAmount = Math.round(KDGetEffLevel() * 100 * (1 + 0.02 * Math.max(0, KDGetEffSecurityLevel() + 50))); + KDGameData.CurrentDialogMsgData = { + "BRIBECOST": "" + GoldAmount, + }; + return false; + }, + options: { + "Smile": {playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => {return !(KinkyDungeonGetRestraintItem("ItemVulva"));}, + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), 0, true, undefined, undefined, undefined, undefined, KDGetSpeakerFaction()); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug2"), 0, true, undefined, undefined, undefined, undefined, KDGetSpeakerFaction()); + KinkyDungeonChangeRep("Ghost", 3); + return false; + }, + options: { + "Correct": {playertext: "Default", response: "Default", gagDisabled: true, + prerequisiteFunction: (_gagged, _player) => {return !(KinkyDungeonGetRestraintItem("ItemMouth") || KinkyDungeonGetRestraintItem("ItemMouth2") || KinkyDungeonGetRestraintItem("ItemMouth3"));}, + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapGag"), 0, true, undefined, undefined, undefined, undefined, KDGetSpeakerFaction()); + KinkyDungeonChangeRep("Ghost", -1); + return false; + }, + options: { + "Leave": {playertext: "Leave", exitDialogue: true} + }, + }, + "Leave": {playertext: "Leave", exitDialogue: true} + }, + }, + "Smile2": {playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => {return KinkyDungeonGetRestraintItem("ItemVulva") != undefined;}, + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", 5); + return false; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + "Struggle": {playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => {return KinkyDungeonGetRestraintItem("ItemArms") != undefined;}, + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Prisoner", 3); + return false; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + "Pout": {playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", -3); + return false; + }, + options: {"Leave": {playertext: "Leave", exitDialogue: true}}, + }, + "Bribe": {playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let GoldAmount = Math.round(KDGetEffLevel() * 100 * (1 + 0.02 * Math.max(0, KDGetEffSecurityLevel() + 50))); + return KDGetEffSecurityLevel() >= -40 && KinkyDungeonGold >= GoldAmount; + }, + options: { + "Accept": {playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let GoldAmount = Math.round(KDGetEffLevel() * 100 * (1 + 0.02 * Math.max(0, KDGetEffSecurityLevel() + 50))); + if (KDGetEffSecurityLevel() >= 49.5) { + KDGameData.CurrentDialogMsg = "PrisonRepeatBribeFail"; + return false; + } + if (KinkyDungeonGold { + KinkyDungeonSetFlag("AngelHelp", 55); + return false; + }, + options: { + "Knife": { + playertext: "Default", response: "AngelHelpKnife", + prerequisiteFunction: (_gagged, _player) => { + return !KinkyDungeonFlags.get("AngelHelped") && !KinkyDungeonInventoryGet("Knife"); + }, + clickFunction: (_gagged, _player) => { + KinkyDungeonInventoryAddWeapon("Knife"); + KinkyDungeonSetFlag("AngelHelped", 5); + return false; + }, + leadsToStage: "", dontTouchText: true, + }, + "Pick": { + playertext: "Default", response: "AngelHelpPick", + prerequisiteFunction: (__gagged, _player) => { + return !KinkyDungeonFlags.get("AngelHelped"); + }, + clickFunction: (_gagged, _player) => { + KDAddConsumable("Pick", 3); + KinkyDungeonSetFlag("AngelHelped", 5); + return false; + }, + leadsToStage: "", dontTouchText: true, + }, + "BlueKey": { + playertext: "Default", response: "AngelHelpBlueKey", + prerequisiteFunction: (_gagged, _player) => { + return !KinkyDungeonFlags.get("AngelHelped"); + }, + clickFunction: (_gagged, _player) => { + KDAddConsumable("BlueKey", 1); + KinkyDungeonSetFlag("AngelHelped", 5); + return false; + }, + leadsToStage: "", dontTouchText: true, + }, + "Divine": { + playertext: "Default", response: "AngelHelpDivine", + prerequisiteFunction: (_gagged, _player) => { + return !KinkyDungeonFlags.get("AngelHelped") && KinkyDungeonPlayerGetRestraintsWithLocks(["Divine2", "Divine"]).length > 0; + }, + clickFunction: (_gagged, _player) => { + let lockedRestraints = KinkyDungeonPlayerGetRestraintsWithLocks(["Divine2"]); + if (KDGetBlessings().length > 0 && lockedRestraints.length > 0) { + let luckyItem = lockedRestraints[Math.floor(KDRandom() * lockedRestraints.length)]; + KinkyDungeonLock(luckyItem, ""); + KinkyDungeonSetFlag("AngelHelped", 5); + } else { + if (KinkyDungeonPlayerGetRestraintsWithLocks(["Divine"]).length > 0) + KDGameData.CurrentDialogMsg = "AngelHelpDivineQuest"; + else + KDGameData.CurrentDialogMsg = "AngelHelpDivineFail"; + } + return false; + }, + leadsToStage: "", dontTouchText: true, + }, + "Leave": {playertext: "Leave", exitDialogue: true}, + } + }, + "DressmakerQuest": { + response: "Default", + inventory: true, + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Help": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDAddQuest("DressmakerQuest"); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Complete": { + playertext: "Default", response: "Default", + gag: true, + clickFunction: (_gagged, _player) => { + let items = KinkyDungeonGetRestraintsWithShrine("BindingDress", true, true); + // Get the most powerful item + let item = items.length > 0 ? items.reduce((prev, current) => (KinkyDungeonRestraintPower(prev, true) > KinkyDungeonRestraintPower(current, true)) ? prev : current) : null; + + let power = item ? KDRestraint(item).power : 5; + if (KDFactionRelation("Player", "Dressmaker") < 0.25) + KinkyDungeonChangeFactionRep("Dressmaker", 0.002 * power); + else + KinkyDungeonChangeFactionRep("Dressmaker", 0.0007 * power); + KDRemoveQuest("DressmakerQuest"); + KDRemoveEntity(KDDialogueEnemy(), false); + return false; + }, + prerequisiteFunction: (_gagged, _player) => { + return KinkyDungeonPlayerTags.has("BindingDress"); + }, + options: { + "Question": { + playertext: "Default", response: "Default", + gag: true, + clickFunction: (_gagged, _player) => { + if (KinkyDungeonStatsChoice.has("Dominant")) { + KinkyDungeonRemoveRestraintsWithShrine("BindingDress"); + KDGameData.CurrentDialogMsg = "DressmakerQuestComplete_QuestionSuccess"; + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "ApprenticeQuest": { + response: "Default", + inventory: true, + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Help": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDAddQuest("ApprenticeQuest"); + return false; + }, + prerequisiteFunction: (_gagged, _player) => { + return !KDHasQuest("ApprenticeQuest"); + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "CompleteLegs": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDRemoveQuest("ApprenticeQuest"); + KDRemoveEntity(KDDialogueEnemy(), false); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollLegs, -1); + if (KDFactionRelation("Player", "Apprentice") < 0.25) + KinkyDungeonChangeFactionRep("Apprentice", 0.015); + else + KinkyDungeonChangeFactionRep("Apprentice", 0.005); + return false; + }, + prerequisiteFunction: (_gagged, _player) => { + return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollLegs") != undefined; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "CompleteArms": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDRemoveQuest("ApprenticeQuest"); + KDRemoveEntity(KDDialogueEnemy(), false); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollArms, -1); + if (KDFactionRelation("Player", "Apprentice") < 0.25) + KinkyDungeonChangeFactionRep("Apprentice", 0.015); + else + KinkyDungeonChangeFactionRep("Apprentice", 0.005); + return false; + }, + prerequisiteFunction: (_gagged, _player) => { + return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollArms") != undefined; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "CompleteVerbal": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDRemoveQuest("ApprenticeQuest"); + KDRemoveEntity(KDDialogueEnemy(), false); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollVerbal, -1); + if (KDFactionRelation("Player", "Apprentice") < 0.25) + KinkyDungeonChangeFactionRep("Apprentice", 0.015); + else + KinkyDungeonChangeFactionRep("Apprentice", 0.005); + return false; + }, + prerequisiteFunction: (_gagged, _player) => { + return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollVerbal") != undefined; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "CompletePurity": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDRemoveQuest("ApprenticeQuest"); + KDRemoveEntity(KDDialogueEnemy(), false); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollPurity, -1); + if (KDFactionRelation("Player", "Apprentice") < 0.25) + KinkyDungeonChangeFactionRep("Apprentice", 0.015); + else + KinkyDungeonChangeFactionRep("Apprentice", 0.005); + return false; + }, + prerequisiteFunction: (_gagged, _player) => { + return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollPurity") != undefined; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "DragonheartQuest": { + response: "Default", + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Help": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDAddQuest("DragonheartQuest"); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "MaidforceQuest": { + response: "Default", + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Help": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDAddQuest("MaidforceQuest"); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "JailerHiSec": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("LeashToPrison", -1); + return false; + }, + options: { + "Submit": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonDefeat(true, KDGetSpeaker()); + return true; + }, + exitDialogue: true, + }, + "Resist": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + if (KDDialogueEnemy() && !KDDialogueEnemy().hostile) { + KDDialogueEnemy().hostile = 300; + } + KinkyDungeonStartChase(undefined, "Jailbreak"); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "CyberHiSec": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("LeashToPrison", -1); + return false; + }, + options: { + "Submit": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDEnterDollTerminal(false, true, false); + return true; + }, + exitDialogue: true, + }, + "Question1": { + playertext: "Default", response: "Default", + gag: true, responseGag: true, + leadsToStage: "", + dontTouchText: true, + }, + "Question2": { + playertext: "Default", response: "Default", + gag: true, responseGag: true, + leadsToStage: "", + dontTouchText: true, + }, + "Question3": { + playertext: "Default", response: "Default", + gagDisabled: true, + options: { + "Who": { + playertext: "Default", response: "Default", + dontTouchText: true, + leadsToStage: "", + }, + "When": { + playertext: "Default", response: "Default", + dontTouchText: true, + leadsToStage: "", + }, + "Why": { + playertext: "Default", response: "Default", + clickFunction: () => { + let restraint = KinkyDungeonGetRestraint({tags: ["cyberdollrestraints", "cableGag"]}, + KDGetEffLevel(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), false, "Cyber", + undefined, undefined, undefined, undefined, undefined, + { + allowedGroups: ["ItemMouth"], + } + ); + + if (restraint) { + KinkyDungeonAddRestraintIfWeaker( + restraint, 3, false, "Cyber", false + ); + } + + return false; + + }, + leadsToStage: "", + dontTouchText: true, + }, + }, + }, + "Resist": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + if (KDDialogueEnemy() && !KDDialogueEnemy().hostile) { + KDDialogueEnemy().hostile = 300; + } + KinkyDungeonStartChase(undefined, "Jailbreak"); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "Tutorial": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("nobed", 8); + return false; + }, + options: { + "Continue": { + playertext: "Default", response: "Default", + drawFunction: (_gagged, _player, _delta) => { + // Portrait + DrawBoxKD(5, 5, 490, 990, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); + return false; + }, + options: { + "Continue": { + playertext: "Continue", response: "Default", + drawFunction: (_gagged, _player, _delta) => { + // Portrait + DrawBoxKD(5, 5, 490, 990, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); + return false; + }, + options: { + "Continue": { + playertext: "Continue", response: "Default", + drawFunction: (_gagged, _player, _delta) => { + // Pose and restraint display + DrawBoxKD(500, 900, 250, 95, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); + return false; + }, + options: { + "Continue": { + playertext: "Continue", response: "Default", + drawFunction: (_gagged, _player, _delta) => { + // Buff bar + DrawBoxKD(740, 750, 800, 175, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); + return false; + }, + options: { + "Continue": { + playertext: "Continue", response: "Default", + drawFunction: (_gagged, _player, _delta) => { + // Action Bar + DrawBoxKD(1620, 820, 440, 175, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); + return false; + }, + options: { + "Continue": { + playertext: "Continue", response: "Default", + drawFunction: (_gagged, _player, _delta) => { + // Submenus + DrawBoxKD(1845, 450, 150, 320, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); + return false; + }, + options: { + "Continue": { + // Status Bar + playertext: "Continue", response: "Default", + drawFunction: (_gagged, _player, _delta) => { + DrawBoxKD(1700, 280, 320, 180, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); + return false; + }, + options: { + "Continue": { + playertext: "Continue", response: "Default", + drawFunction: (_gagged, _player, _delta) => { + // Hotbar + DrawBoxKD(780, 920, 900, 75, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); + return false; + }, + options: { + "Continue": { + playertext: "Continue", response: "Default", + drawFunction: (_gagged, _player, _delta) => { + DrawBoxKD(550, 100, 1000, 200, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); + return false; + }, + options: { + "Continue": { + playertext: "Continue", response: "Default", + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "LeaveAndDisable": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDToggles.SkipTutorial = true; + KDSaveToggles(); + return false; + }, + exitDialogue: true, + }, + } + }, + "Bed": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("nobed", 8); + return false; + }, + options: { + "Sleep": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + if (KinkyDungeonMapGet(KDPlayer().x, KDPlayer().y) && KDGameData.InteractTargetX && KDGameData.InteractTargetY) { + if (KinkyDungeonMapGet(KDGameData.InteractTargetX, KDGameData.InteractTargetY) == 'B') { + KDMovePlayer(KDGameData.InteractTargetX, KDGameData.InteractTargetY, true); + } + } + + KinkyDungeonSetFlag("slept", -1); + if (KinkyDungeonPlayerInCell(true) && KDGameData.PrisonerState == 'jail') { + KinkyDungeonChangeRep("Ghost", KinkyDungeonIsArmsBound() ? 5 : 2); + } + //KinkyDungeonChangeWill(KinkyDungeonStatWillMax * KDSleepBedPercentage); + KDGameData.SleepTurns = KinkyDungeonSleepTurnsMax; + KDChangeMana("player","sleep", "tick", KinkyDungeonStatManaMax, false, 0, false, true); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "DollDropoff": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("nobed", 8); + + let en: entity = null; + let leashed = KDGetLeashedTo(_player); + if (leashed.length > 0) en = leashed[0]; + + if (en && !en.player && KDCanBind(en)) { + KDGameData.CurrentDialogMsgData.NME = KDEnemyName(en); + KDGameData.CurrentDialogMsgValue.ID = en.id; + KDGameData.CurrentDialogMsgData.PRCNT = "" + + Math.round(100 * Math.min(1, Math.max(0, + KDGetSkillCheck(en, _player, en, KDSkillCheckType.Agility, .5)))); + KDGameData.CurrentDialogMsgValue.PRCNT = KDGetSkillCheck(en, _player, en, KDSkillCheckType.Agility, .5); + } + + return false; + }, + options: { + "Use": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (nearestJail && nearestJail.x == KDGameData.InteractTargetX && nearestJail.y == KDGameData.InteractTargetY) { + KDMovePlayer(KDGameData.InteractTargetX + (nearestJail.direction?.x || 0), KDGameData.InteractTargetY + (nearestJail.direction?.y || 0), true); + if (nearestJail.restrainttags) { + let restraint = KinkyDungeonGetRestraint({tags: nearestJail.restrainttags}, KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), false, undefined); + if (restraint) + KinkyDungeonAddRestraintIfWeaker(restraint, KDGetEffLevel(),false, undefined); + } + } + + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "NPC": { + playertext: "Default", response: "Default", + greyoutFunction: (_gagged, _player) => { + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (nearestJail && nearestJail.x == KDGameData.InteractTargetX && nearestJail.y == KDGameData.InteractTargetY) { + if (KinkyDungeonEntityAt( + KDGameData.InteractTargetX + (nearestJail.direction?.x || 0), + KDGameData.InteractTargetY + (nearestJail.direction?.y || 0))) { + return false; + } + } + return !KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + }, + greyoutTooltip: "KDOccupied", + clickFunction: (_gagged, _player) => { + + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (nearestJail && nearestJail.x == KDGameData.InteractTargetX && nearestJail.y == KDGameData.InteractTargetY) { + KinkyDungeonDrawState = "Collection"; + KDCollectionTab = "Dropoff"; + KDCurrentFacilityTarget = ""; + KDFacilityCollectionCallback = null; + KinkyDungeonCheckClothesLoss = true; + } + + return false; + }, + exitDialogue: true, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "EnemyHelpless": { + playertext: "Default", response: "Default", + greyoutFunction: (_gagged, _player) => { + let en: entity = null; + let leashed = KDGetLeashedTo(_player); + if (leashed.length > 0) en = leashed[0]; + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (nearestJail && nearestJail.x == KDGameData.InteractTargetX && nearestJail.y == KDGameData.InteractTargetY) { + if (KinkyDungeonEntityAt( + KDGameData.InteractTargetX + (nearestJail.direction?.x || 0), + KDGameData.InteractTargetY + (nearestJail.direction?.y || 0)) + && KinkyDungeonEntityAt( + KDGameData.InteractTargetX + (nearestJail.direction?.x || 0), + KDGameData.InteractTargetY + (nearestJail.direction?.y || 0)) != en) { + return false; + } + } + return !KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY) + || KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY) == en; + }, + greyoutTooltip: "KDFurnNotClear", + prerequisiteFunction: (_gagged, _player) => { + + + let en: entity = null; + let leashed = KDGetLeashedTo(_player); + if (leashed.length > 0) en = leashed[0]; + + if (en && !en.player && KDCanBind(en)) { + return KDHelpless(en) || KDWillingBondage(en, _player); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let en: entity = null; + let leashed = KDGetLeashedTo(_player); + if (leashed.length > 0) en = leashed[0]; + if (en && !en.player && KDCanBind(en)) { + + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (nearestJail && nearestJail.x == KDGameData.InteractTargetX && nearestJail.y == KDGameData.InteractTargetY) { + KDBreakTether(en); + KDMoveEntity(en, + KDGameData.InteractTargetX + (nearestJail.direction?.x || 0), + KDGameData.InteractTargetY + (nearestJail.direction?.y || 0), false); + if (nearestJail.restrainttags) { + let restraint = KinkyDungeonGetRestraint({tags: nearestJail.restrainttags}, + KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, + "", + true, + false, + false, undefined, true); + + + if (restraint) { + KDSetNPCRestraint(en.id, "Device", { + name: restraint.name, + lock: "White", + id: KinkyDungeonGetItemID(), + faction: KDDefaultNPCBindPalette, + }); + // Add the tieup value + KDNPCRestraintTieUp(en.id, { + name: restraint.name, + lock: "White", + id: KinkyDungeonGetItemID(), + faction: KDDefaultNPCBindPalette, + }, 1); + KinkyDungeonAdvanceTime(1); + } + } + } + + } + return false; + }, + exitDialogue: true, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Enemy": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let en: entity = null; + let leashed = KDGetLeashedTo(KDPlayer()); + if (leashed.length > 0) en = leashed[0]; + if (en && !en.player && KDCanBind(en)) { + + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (nearestJail && nearestJail.x == KDGameData.InteractTargetX && nearestJail.y == KDGameData.InteractTargetY) { + if (KinkyDungeonEntityAt( + KDGameData.InteractTargetX + (nearestJail.direction?.x || 0), + KDGameData.InteractTargetY + (nearestJail.direction?.y || 0)) + && KinkyDungeonEntityAt( + KDGameData.InteractTargetX + (nearestJail.direction?.x || 0), + KDGameData.InteractTargetY + (nearestJail.direction?.y || 0)) != en) { + if (!(!KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY) + || KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY) == en)) + return false; + } + } + + + return !KDHelpless(en) && (!en.specialBoundLevel || !en.specialBoundLevel.Furniture); + } + return false; + }, + greyoutFunction: (_gagged, _player) => { + let en: entity = null; + let leashed = KDGetLeashedTo(KDPlayer()); + if (leashed.length > 0) en = leashed[0]; + + if (en && !en.player && KDCanBind(en)) { + return KinkyDungeonIsDisabled(en) || KDGameData.CurrentDialogMsgValue.PRCNT > 0; + } + return false; + }, + greyoutTooltip: "KDFurnEnemyDisabled", + clickFunction: (_gagged, _player) => { + let en: entity = null; + let leashed = KDGetLeashedTo(_player); + if (leashed.length > 0) en = leashed[0]; + if (en && !en.player && KDCanBind(en)) { + + + if (KDRandom() < KDGameData.CurrentDialogMsgValue.PRCNT) { + + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (nearestJail && nearestJail.x == KDGameData.InteractTargetX && nearestJail.y == KDGameData.InteractTargetY) { + + KDBreakTether(en); + KDMoveEntity(en, + KDGameData.InteractTargetX + (nearestJail.direction?.x || 0), + KDGameData.InteractTargetY + (nearestJail.direction?.y || 0), false); + + if ((!en.specialBoundLevel || !en.specialBoundLevel.Furniture)) { + KDTieUpEnemy(en, en.Enemy.maxhp * 0.3 + 10, "Furniture", undefined); + KinkyDungeonAdvanceTime(1); + if (en.bind) en.bind = 0; + en.bind = Math.max(en.bind, 10); + } + + KinkyDungeonAdvanceTime(1); + } + + + } else { + KDGameData.CurrentDialogMsg = "FurnitureEnemyFail"; + KinkyDungeonAdvanceTime(1); + return true; + } + + } + return false; + }, + exitDialogue: true, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Furniture": { + response: "Default", + clickFunction: (_gagged, player) => { + KinkyDungeonSetFlag("nobed", 8); + + let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + if (en && !en.player && KDCanBind(en)) { + KDGameData.CurrentDialogMsgData.NME = KDEnemyName(en); + KDGameData.CurrentDialogMsgData.PRCNT = "" + + Math.round(100 * Math.min(1, Math.max(0, + KDGetSkillCheck(en, player, en, KDSkillCheckType.Agility, .5)))); + KDGameData.CurrentDialogMsgValue.PRCNT = KDGetSkillCheck(en, player, en, KDSkillCheckType.Agility, .5); + } + + return false; + }, + options: { + "Use": { + playertext: "Default", response: "Default", + greyoutFunction: (_gagged, _player) => { + return !KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY) + || KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY) == _player; + }, + greyoutTooltip: "KDOccupied", + clickFunction: (_gagged, _player) => { + + let tile = KinkyDungeonTilesGet(KDGameData.InteractTargetX + ',' + KDGameData.InteractTargetY); + if (tile?.Furniture) { + KDMovePlayer(KDGameData.InteractTargetX, KDGameData.InteractTargetY, true); + + let furn = KDFurniture[tile.Furniture]; + if (furn) { + KinkyDungeonSetFlag("GuardCalled", 50); + let rest = KinkyDungeonGetRestraint( + {tags: [furn.restraintTag]}, MiniGameKinkyDungeonLevel, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, + "", + true, + false, + false); + if (rest) { + KinkyDungeonAddRestraintIfWeaker(rest, KDGetEffLevel(), true); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/LockHeavy.ogg"); + } + } + + } + + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "NPC": { + playertext: "Default", response: "Default", + greyoutFunction: (_gagged, _player) => { + return !KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + }, + greyoutTooltip: "KDOccupied", + clickFunction: (_gagged, _player) => { + + let tile = KinkyDungeonTilesGet(KDGameData.InteractTargetX + ',' + KDGameData.InteractTargetY); + if (tile?.Furniture) { + KinkyDungeonDrawState = "Collection"; + KDCollectionTab = "Imprison"; + KDCurrentFacilityTarget = ""; + KDFacilityCollectionCallback = null; + KinkyDungeonCheckClothesLoss = true; + } + + return false; + }, + exitDialogue: true, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "EnemyHelpless": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + if (en && !en.player && KDCanBind(en)) { + return KDHelpless(en); + } + return false; + }, + clickFunction: (_gagged, _player) => { + let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + if (en && !en.player && KDCanBind(en)) { + let tile = KinkyDungeonTilesGet(KDGameData.InteractTargetX + ',' + KDGameData.InteractTargetY); + let furn = KDFurniture[tile.Furniture]; + let rest = KinkyDungeonGetRestraint( + {tags: [furn.restraintTag]}, MiniGameKinkyDungeonLevel, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, + "", + true, + false, + false, undefined, true); + KDImprisonEnemy(en, true, "PrisonerJailOwn", { + name: rest.name, + lock: "White", + id: KinkyDungeonGetItemID(), + faction: KDDefaultNPCBindPalette, + }); + KinkyDungeonAdvanceTime(1); + } + return false; + }, + exitDialogue: true, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Enemy": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + if (en && !en.player && KDCanBind(en)) { + return !KDHelpless(en) && (!en.specialBoundLevel || !en.specialBoundLevel.Furniture); + } + return false; + }, + greyoutFunction: (_gagged, _player) => { + let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + if (en && !en.player && KDCanBind(en)) { + return KinkyDungeonIsDisabled(en) || KDGameData.CurrentDialogMsgValue.PRCNT > 0; + } + return false; + }, + greyoutTooltip: "KDFurnEnemyDisabled", + clickFunction: (_gagged, _player) => { + let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + if (en && !en.player && KDCanBind(en)) { + if (KDRandom() < KDGameData.CurrentDialogMsgValue.PRCNT) { + if ((!en.specialBoundLevel || !en.specialBoundLevel.Furniture)) { + KDTieUpEnemy(en, en.Enemy.maxhp * 0.3 + 10, "Furniture", undefined); + KinkyDungeonAdvanceTime(1); + if (en.bind) en.bind = 0; + en.bind = Math.max(en.bind, 10); + en.immobile = Math.max(en.immobile || 0, 10); + } + } else { + KDGameData.CurrentDialogMsg = "FurnitureEnemyFail"; + KinkyDungeonAdvanceTime(1); + return true; + } + + } + return false; + }, + exitDialogue: true, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Talk": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + + return !!(en && !en.player && (KDIsImprisoned(en) && en?.prisondialogue) + || en?.specialdialogue); + }, + clickFunction: (_gagged, _player) => { + let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); + if (en && !en.player) { + if (KDIsImprisoned(en) && en.prisondialogue) { + KDStartDialog(en.prisondialogue, + en.Enemy.name, true, + en.personality, en); + return true; + } else if (en.specialdialogue) { + KDStartDialog(en.specialdialogue, + en.Enemy.name, true, + en.personality, en); + return true; + } + } + return false; + }, + exitDialogue: true, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Elevator": { + response: "Default", + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + skip: true, + }, + ...Object.fromEntries(["Summit", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20].map( + (num) => { + /** + */ + let d: KinkyDialogue = { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KDIsElevatorFloorUnlocked(num); + }, + clickFunction: (_gagged, _player) => { + KDElevatorToFloor( + KDElevatorFloorIndex[num] ? (KDElevatorFloorIndex[num].Floor) : (typeof num === "string" ? 0 : num), + KDElevatorFloorIndex[num]?.RoomType || + (typeof KDGameData.ElevatorsUnlocked[num] == "string" ? KDGameData.ElevatorsUnlocked[num] : undefined)); + return false; + }, + exitDialogue: true, + }; + return [num, d]; + } + )) + } + }, + "Oriel": { + response: "Default", + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "WhoAreYou": { + playertext: "Default", response: "Default", + gag: true, responseGag: true, + prerequisiteFunction: (_gagged, _player) => { + return !KinkyDungeonFlags.get("dOriel_WhoAreYou"); + }, + clickFunction: (gagged, _player) => { + if (!gagged) + KinkyDungeonSetFlag("dOriel_WhoAreYou", -1); + return false; + }, + leadsToStage: "", dontTouchText: true, + }, + "Goddess": { + playertext: "Default", response: "Default", + gag: true, responseGag: true, + prerequisiteFunction: (_gagged, _player) => { + return KinkyDungeonFlags.get("dOriel_WhoAreYou") && !KinkyDungeonFlags.get("dOriel_Goddess"); + }, + clickFunction: (gagged, _player) => { + if (!gagged) + KinkyDungeonSetFlag("dOriel_Goddess", -1); + return false; + }, + leadsToStage: "", dontTouchText: true, + }, + "Control": { + playertext: "Default", response: "Default", + gag: true, responseGag: true, + prerequisiteFunction: (_gagged, _player) => { + return KinkyDungeonFlags.get("dOriel_WhoAreYou") && !KinkyDungeonFlags.get("dOriel_Control"); + }, + clickFunction: (gagged, _player) => { + if (!gagged) + KinkyDungeonSetFlag("dOriel_Control", -1); + return false; + }, + leadsToStage: "", dontTouchText: true, + }, + "Elevator": { + playertext: "Default", response: "Default", + gag: true, responseGag: true, + prerequisiteFunction: (_gagged, _player) => { + return (KinkyDungeonFlags.get("dOriel_WhoAreYou") && KDMapData.RoomType == "ElevatorRoom"); + }, + leadsToStage: "", dontTouchText: true, + }, + "Help": { + playertext: "Default", response: "Default", + gag: true, responseGag: true, + prerequisiteFunction: (gagged, _player) => { + if (KinkyDungeonFlags.get("dOriel_WhoAreYou") || gagged) + return KinkyDungeonAllRestraintDynamic().some((element) => { + return !KDRestraint(element.item)?.armor && !KDRestraint(element.item)?.good; + }); + return false; + }, + leadsToStage: "", dontTouchText: true, + }, + "Hello": { + playertext: "Default", response: "Default", + gag: true, responseGag: true, + prerequisiteFunction: (gagged, _player) => { + return (KinkyDungeonFlags.get("dOriel_WhoAreYou") == -1) || gagged; + }, + leadsToStage: "", dontTouchText: true, + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "WardenCourier": { + response: "Default", + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "ToolsOfTheTrade": { + response: "Default", + inventory: true, + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "SmokeBomb": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let amount = KinkyDungeonInventoryGetConsumable("Gunpowder")?.quantity; + if (amount >= 1) { + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("Gunpowder"), -1); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("SmokeBomb"), 1); + } else { + KDGameData.CurrentDialogMsg = "ToolsOfTheTradeFail"; + } + KDGameData.CurrentDialogStage = ""; + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "FlashBomb": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let amount = KinkyDungeonInventoryGetConsumable("Gunpowder")?.quantity; + let amount2 = KinkyDungeonInventoryGetConsumable("AncientPowerSource")?.quantity; + if (amount >= 1 && amount2 >= 1) { + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("Gunpowder"), -1); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("AncientPowerSource"), -1); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("FlashBomb"), 3); + } else { + KDGameData.CurrentDialogMsg = "ToolsOfTheTradeFail"; + } + KDGameData.CurrentDialogStage = ""; + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Bomb": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let amount = KinkyDungeonInventoryGetConsumable("Gunpowder")?.quantity; + if (amount >= 2) { + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("Gunpowder"), -2); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("Bomb"), 1); + } else { + KDGameData.CurrentDialogMsg = "ToolsOfTheTradeFail"; + } + KDGameData.CurrentDialogStage = ""; + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "PotionInvisibility": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let amount = KinkyDungeonInventoryGetConsumable("Ectoplasm")?.quantity; + if (amount >= 3) { + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("Ectoplasm"), -3); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("PotionInvisibility"), 1); + } else { + KDGameData.CurrentDialogMsg = "ToolsOfTheTradeFail"; + } + KDGameData.CurrentDialogStage = ""; + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "CommercePortal": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("noportal", 1); + if (!KDGameData.TeleportLocations) KDGameData.TeleportLocations = {}; + KDGameData.TeleportLocations.commerce = {portalpos_x: KDPlayer().x, portalpos_y: KDPlayer().y, + x: KDCurrentWorldSlot.x, y: KDCurrentWorldSlot.y, type: KDGameData.RoomType, level: MiniGameKinkyDungeonLevel, checkpoint: MiniGameKinkyDungeonCheckpoint}; + return false; + }, + options: { + "Go": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; + + if (KDTile() && KDTile().Portal == "CommercePortal") { + KinkyDungeonMapSet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, '0'); + KDTileDelete(); + } + KDSetWorldSlot(0, 0); + + KinkyDungeonCreateMap(params, "ShopStart", "", + MiniGameKinkyDungeonLevel, undefined, undefined, + undefined, {x: 0, y: 0}, false, undefined); + + // Place return portal + KinkyDungeonMapSet(KDMapData.EndPosition.x, KDMapData.EndPosition.y, ';'); + KinkyDungeonTilesSet("" + (KDMapData.EndPosition.x) + "," + (KDMapData.EndPosition.y), {Portal: "CommercePortalReturn", Light: 5, lightColor: 0xffff88}); + + KinkyDungeonSetFlag("noportal", 3); + + + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "CommercePortalReturn": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("noportal", 1); + return false; + }, + options: { + "Go": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, player) => { + if (KDTile() && KDTile().Portal == "CommercePortalReturn") { + KinkyDungeonMapSet(player.x, player.y, '0'); + KDTileDelete(); + } + + if (!KDGameData.TeleportLocations) KDGameData.TeleportLocations = {}; + KDSetWorldSlot(KDGameData.TeleportLocations.commerce.x || 0, KDGameData.TeleportLocations.commerce.level); + let params = KinkyDungeonMapParams[KinkyDungeonMapIndex[KDGameData.TeleportLocations.commerce.checkpoint]]; + + + + KinkyDungeonCreateMap(params, KDGameData.TeleportLocations.commerce.type, "", KDGameData.TeleportLocations.commerce.level, + undefined, undefined, undefined, {x: KDGameData.TeleportLocations.commerce.x, y: KDGameData.TeleportLocations.commerce.y}, true, undefined); + + if (KDGameData.TeleportLocations.commerce.portalpos_x && KDGameData.TeleportLocations.commerce.portalpos_y) { + KDMovePlayer(KDGameData.TeleportLocations.commerce.portalpos_x, + KDGameData.TeleportLocations.commerce.portalpos_y, + false, undefined, undefined, true, true + ) + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "TableFood": { + response: "Default", + clickFunction: (_gagged, _player) => { + if (KinkyDungeonTargetTile) { + let tile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); + if (tile) { + KDGameData.CurrentDialogMsgData = { + AMOUNT: "" + 10 * (tile.Amount || 1), + ARTICLE: "a", + FOODNAME: TextGet(KinkyDungeonTargetTile.Food), + FOODMSG: TextGet("KinkyDungeonFood" + KinkyDungeonTargetTile.Food), + }; + } + } + return false; + }, + options: { + "Eat": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + let tile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); + if (tile && tile.Type == "Food") { + let gagTotal = KinkyDungeonGagTotal(); + if (gagTotal > 0) { + //KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonFoodEatenGag"), "#ff8933", 1); + KDGameData.CurrentDialogMsg = "TableFoodEatFail"; + } else { + // Perform the deed + let Willmulti = Math.max(KinkyDungeonStatWillMax / KDMaxStatStart); + let amount = tile.Amount ? tile.Amount : 1.0; + KDChangeWill(tile.Food, "food", "consumable", amount * Willmulti); + + // Send the message and advance time + KinkyDungeonAdvanceTime(1); + + KDRunChefChance(KinkyDungeonPlayerEntity); + //KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonFoodEaten"), "lightgreen", 1); + + // Remove the food + tile.Food = "Plate"; + tile.Eaten = true; + } + } + return false; + }, + options: { + "Leave": { + clickFunction: (_gagged, _player) => { + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + return false; + }, + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Take": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + let tile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); + if (tile && tile.Type == "Food" && KDFood[tile.Food]?.Theft) { + return true; + } + return false; + }, + clickFunction: (_gagged, _player) => { + let tile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); + if (tile && tile.Type == "Food" && KDFood[tile.Food]?.Theft) { + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable(KDFood[tile.Food].Theft), 1); + + // Send the message and advance time + KinkyDungeonAdvanceTime(1); + //KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonFoodEaten"), "lightgreen", 1); + + KDRunChefChance(KinkyDungeonPlayerEntity); + + // Remove the food + tile.Food = "Plate"; + tile.Eaten = true; + } + return false; + }, + options: { + "Leave": { + clickFunction: (_gagged, _player) => { + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + return false; + }, + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + clickFunction: (_gagged, _player) => { + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + return false; + }, + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Button": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("nobutton", 3); + return false; + }, + options: { + "Press": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, player) => { + // PUSH the BUTTON + KDCreateEffectTile(player.x, player.y, { + name: "WireSparks", + duration: 2, + }, 0); + KinkyDungeonAdvanceTime(1, true, true); + return false; + }, + exitDialogue: true, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + + "LeylineMap": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("nodollterm", 4); + return false; + }, + options: { + "Leave": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDPushSpell(KinkyDungeonFindSpell("ManaPoolUp")); + KinkyDungeonUpdateStats(0); + return false; + }, + exitDialogue: true, + }, + "Cancel": { + playertext: "Default", response: "Default", + options: { + "Leave": { + playertext: "Default", response: "Default", + exitDialogue: true, + clickFunction: (_gagged, _player) => { + KDPushSpell(KinkyDungeonFindSpell("ManaPoolUp")); + KinkyDungeonUpdateStats(0); + return false; + }, + }, + "Cancel": { + playertext: "Default", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "DollTerminal_Step": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("nodollterm", 4); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Enter": { + playertext: "Default", response: "Default", + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Enter": { + playertext: "Default", response: "Default", + options: { + "Leave": { + playertext: "Leave", response: "Default", + clickFunction: (_gagged, _player) => { + KDEnterDollTerminal(true); + return false; + }, + exitDialogue: true, + }, + } + }, + } + }, + } + }, + "DollTerminal_Forced": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("nodollterm", 4); + KDGameData.CurrentDialogMsgValue = { + Percent: Math.max(0, 0.25 * KinkyDungeonSlowLevel), + }; + KDGameData.CurrentDialogMsgData = { + RESISTCHANCE: "" + Math.max(0, Math.round(100 - KDGameData.CurrentDialogMsgValue.Percent * 100)), + }; + return false; + }, + options: { + "Resist": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + if (KDRandom() < KDGameData.CurrentDialogMsgValue.Percent) { + KDGameData.CurrentDialogMsg = "DollTerminal_ForcedForced"; + KDGameData.CurrentDialogStage = "Forced"; + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Enter": { + playertext: "Default", response: "Default", + options: { + "Leave": { + playertext: "Leave", response: "Default", + clickFunction: (_gagged, _player) => { + KDEnterDollTerminal(true); + return false; + }, + exitDialogue: true, + }, + } + }, + "Forced": { + prerequisiteFunction: (_gagged, _player) => {return false;}, + playertext: "Default", response: "Default", + options: { + "Leave": { + clickFunction: (_gagged, _player) => { + KDEnterDollTerminal(false); + return false; + }, + playertext: "DollTerminal_Forced_Submit", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "Leyline": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("noleyline", 8); + return false; + }, + options: { + "Use": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, player) => { + KDChangeMana(KDPlayer().x + ',' + KDPlayer().y, "map", "interact", 0, false, 100, false, false); + if (KDTile() && KDTile().Leyline) { + KinkyDungeonMapSet(player.x, player.y, '0'); + KDTileDelete(); + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "BanditQuest": { + response: "Default", + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Help": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KDAddQuest("BanditPrisoner"); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "PrisonerRescueBountyhunter": KDPrisonerRescue("PrisonerRescueBountyhunter", "Bountyhunter", ["Nawashi", "Ninja"]), + "PrisonerRescue": KDPrisonerRescue("PrisonerRescue", "Bandit", ["Bandit", "Bandit"]), + "PrisonerRescueAlchemist": KDPrisonerRescue("PrisonerRescueAlchemist", "Alchemist", ["Alkahestor", "Alchemist"]), + "PrisonerRescueNevermere": KDPrisonerRescue("PrisonerRescueNevermere", "Nevermere", ["Wolfgirl", "WolfgirlPet"]), + "PrisonerRescueApprentice": KDPrisonerRescue("PrisonerRescueApprentice", "Apprentice", ["Apprentice2", "Apprentice"]), + "PrisonerRescueDressmaker": KDPrisonerRescue("PrisonerRescueDressmaker", "Dressmaker", ["Librarian", "Dressmaker"]), + "PrisonerRescueWitch": KDPrisonerRescue("PrisonerRescueWitch", "Witch", ["WitchIce", "Apprentice"]), + "PrisonerRescueElemental": KDPrisonerRescue("PrisonerRescueElemental", "Elemental", ["ElementalAir", "ElementalFire"]), + "PrisonerRescueDragon": KDPrisonerRescue("PrisonerRescueDragon", "Dragon", ["DragonShield", "Dragon"]), + "PrisonerRescueMaid": KDPrisonerRescue("PrisonerRescueMaid", "Maidforce", ["MaidforceStalker", "Maidforce"]), + "PrisonerRescueBast": KDPrisonerRescue("PrisonerRescueBast", "Bast", ["Cleric", "MeleeCleric"]), + "PrisonerRescueElf": KDPrisonerRescue("PrisonerRescueElf", "Elf", ["Elf", "ElfRanger"]), + //"PrisonerRescueMushy": KDPrisonerRescue("PrisonerRescueMushy", "Mushy", ["Fungal", "Mushy"]), + "PrisonerRescueAncientRobot": KDPrisonerRescue("PrisonerRescueAncientRobot", "AncientRobot", ["CaptureBot", "Drone"]), + + "ShopkeeperRescue": { + response: "Default", + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Accept": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, player) => { + KDGameData.PrisonerState = ""; + KinkyDungeonInterruptSleep(); + // Type shenanigans unintended + let doorTile = KDGetJailDoor(player.x, player.y); + let door: KDPoint = doorTile; + if (door && KDistChebyshev(door.x-player.x, door.y-player.y) < 5) { + if (doorTile.tile) { + doorTile['OGLock'] = doorTile['Lock']; + doorTile.tile.Lock = undefined; + doorTile.tile.LockSeen = undefined; + KDUpdateDoorNavMap(); + } + KinkyDungeonMapSet(door.x, door.y, 'd'); + } else door = KinkyDungeonGetNearbyPoint(player.x, player.y, true); + if (!door) { + door = {x: player.x, y: player.y}; // Better glitch than break game + } + KDMapData.Entities = []; + KDCommanderRoles = new Map(); + KDMapData.RespawnQueue = []; + KDUpdateEnemyCache = true; + let e = DialogueCreateEnemy(door.x, door.y, "ShopkeeperRescue"); + e.allied = 9999; + e.faction = "Player"; + KDGameData.CurrentDialogMsgSpeaker = e.Enemy.name; + KinkyDungeonSetEnemyFlag(e, "RescuingPlayer", -1); + + KDGameData.GuardSpawnTimer = 100; + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Refuse": { + playertext: "Default", response: "Default", + gag: true, + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("refusedShopkeeperRescue", 100); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "ShopkeeperRescueChatter": { + response: "Default", + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Treasure": { + playertext: "Default", response: "Default", gagDisabled: true, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Cost": { + playertext: "Default", response: "Default", gagDisabled: true, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "ShopkeeperTeleport": { + response: "Default", + clickFunction: (_gagged, _player) => { + if (!KDGameData.ShopkeeperFee) KDGameData.ShopkeeperFee = 0; + KDGameData.ShopkeeperFee += KDDialogueParams.ShopkeeperFee + Math.max(0, KDDialogueParams.ShopkeeperFeePerLevel * (KDGameData.HighestLevelCurrent || 1)); + KDGameData.CurrentDialogMsgValue = { + "RESCUECOST": Math.round(KDGameData.ShopkeeperFee), + }; + KDGameData.CurrentDialogMsgData = { + "RESCUECOST": "" + Math.round(KDGameData.ShopkeeperFee), + }; + return false; + }, + options: { + "Pay": { + playertext: "Default", response: "Default", gag: true, + prerequisiteFunction: (_gagged, _player) => { + return KinkyDungeonGold >= KDGameData.ShopkeeperFee; + }, + clickFunction: (_gagged, _player) => { + KinkyDungeonGold -= KDGameData.ShopkeeperFee; + KDGameData.ShopkeeperFee = 0; + KinkyDungeonRemoveRestraintsWithShrine("Rope", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Leather", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Metal", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Latex", undefined, true, false, true, false, true); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Tab": { + prerequisiteFunction: (_gagged, _player) => { + return !KDGameData.CurrentDialogMsgData.Please; + }, + playertext: "Default", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + if (KinkyDungeonGold >= KDDialogueParams.ShopkeeperFee + Math.max(0, KDDialogueParams.ShopkeeperFeePerLevel * (KDGameData.HighestLevelCurrent || 1))) { + KDGameData.CurrentDialogMsg = "ShopkeeperTeleportTabNo"; + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsgData.Please = "true"; + return false; + } else { + if (!KDGameData.CurrentDialogMsgData) KDGameData.CurrentDialogMsgData = {}; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor = KinkyDungeonGetRestraint({tags: ['basicCurse', 'shopCurse']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint = KDChooseRestraintFromListGroupPri( + KDGetRestraintsEligible({tags: ['trap', 'shopRestraint']}, 10, 'grv', true, undefined, undefined, undefined, false), + KDGetProgressiveOrderFun())?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar = KinkyDungeonGetRestraint({tags: ['shopCollar']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit = KinkyDungeonGetRestraint({tags: ['shopCatsuit']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + + if (KDGameData.ShopkeeperFee < KDDialogueParams.ShopkeeperFeePunishThresh || !( + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit + || KinkyDungeonGold > KDGameData.ShopkeeperFee + )) { + if (KinkyDungeonPlayerTags.get("Metal") || KinkyDungeonPlayerTags.get("Leather") || KinkyDungeonPlayerTags.get("Rope") || KinkyDungeonPlayerTags.get("Latex")) { + KDGameData.CurrentDialogMsg = "ShopkeeperTeleportTabYesRestrained"; + } else KDGameData.CurrentDialogMsg = "ShopkeeperTeleportTabYes"; + } else { + KDGameData.CurrentDialogStage = "Debt"; + KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; + } + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "TabRetry": { + prerequisiteFunction: (_gagged, _player) => { + return KDGameData.CurrentDialogMsgData.Please != undefined; + }, + playertext: "Default", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + if (!KDGameData.CurrentDialogMsgData) KDGameData.CurrentDialogMsgData = {}; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor = KinkyDungeonGetRestraint({tags: ['basicCurse', 'shopCurse']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint = KDChooseRestraintFromListGroupPri( + KDGetRestraintsEligible({tags: ['trap', 'shopRestraint']}, 10, 'grv', true, undefined, undefined, undefined, false), + KDGetProgressiveOrderFun())?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar = KinkyDungeonGetRestraint({tags: ['shopCollar']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit = KinkyDungeonGetRestraint({tags: ['shopCatsuit']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + + if (KDGameData.ShopkeeperFee < KDDialogueParams.ShopkeeperFeePunishThresh || !( + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit + || KinkyDungeonGold > KDGameData.ShopkeeperFee + )) { + if (KinkyDungeonPlayerTags.get("Metal") || KinkyDungeonPlayerTags.get("Leather") || KinkyDungeonPlayerTags.get("Rope") || KinkyDungeonPlayerTags.get("Latex")) { + KDGameData.CurrentDialogMsg = "ShopkeeperTeleportTabRetryRestrained"; + } else KDGameData.CurrentDialogMsg = "ShopkeeperTeleportTabRetry"; + } else { + KDGameData.CurrentDialogStage = "Debt"; + KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Debt": { + prerequisiteFunction: (_gagged, _player) => { + return false; + }, + playertext: "Default", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Armor": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Armor != undefined; + }, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogMsgData.RESTRAINTNAME = KDGetItemNameString(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor); + return false; + }, + options: { + "Yes": { + playertext: "ShopkeeperTeleportDebt_Yes", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + if (KDRandom() > (KDBasicArmorWeight_Cursed) / (KDBasicArmorWeight_Cursed + KDBasicArmorWeight)) { + KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt_Armor_YesUncursed"; + + } else { + let armor = KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor; + let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted("Common", armor, + false, 0, 50, [])); + let events = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); + let variant: KDRestraintVariant = { + template: armor, + events: events, + }; + if (curs) { + events.push(...KDEventHexModular[curs].events({variant: variant})); + } + KDEquipInventoryVariant(variant, "", 0, true, "", true, false, "Shopkeeper", true, + KDGetByWeight(KinkyDungeonGetCurseByListWeighted(["Common"], "", false, 0, 20))); + + KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt_Armor_YesCursed"; + + } + + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "No": { + playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogStage = "Debt"; + KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; + return true; + } + }, + } + }, + "Restraint": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Restraint != undefined; + }, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogMsgData.RESTRAINTNAME = KDGetItemNameString(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint); + return false; + }, + options: { + "Yes": { + playertext: "ShopkeeperTeleportDebt_Yes", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + let armor = KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint; + let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted("Common", armor, + false, 0, 50, [])); + let events = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); + let variant: KDRestraintVariant = { + template: armor, + events: events, + }; + if (curs) { + events.push(...KDEventHexModular[curs].events({variant: variant})); + } + KDEquipInventoryVariant(variant, "", 0, true, "", true, false, "Shopkeeper", true, + KDGetByWeight(KinkyDungeonGetCurseByListWeighted(["Common"], "", false, 0, 20))); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "No": { + playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogStage = "Debt"; + KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; + return true; + } + }, + } + }, + "Collar": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Collar != undefined; + }, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogMsgData.RESTRAINTNAME = KDGetItemNameString(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar); + return false; + }, + options: { + "Yes": { + playertext: "ShopkeeperTeleportDebt_Yes", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + let armor = KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar; + let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted("Common", armor, + false, 0, 50, [])); + let events = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); + let variant: KDRestraintVariant = { + template: armor, + events: events, + }; + if (curs) { + events.push(...KDEventHexModular[curs].events({variant: variant})); + } + KDEquipInventoryVariant(variant, "", 0, true, "", true, false, "Shopkeeper", true, + KDGetByWeight(KinkyDungeonGetCurseByListWeighted(["Common"], "", false, 0, 20))); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "No": { + playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogStage = "Debt"; + KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; + return true; + } + }, + } + }, + "Catsuit": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Catsuit != undefined; + }, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogMsgData.RESTRAINTNAME = KDGetItemNameString(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit); + return false; + }, + options: { + "Yes": { + playertext: "ShopkeeperTeleportDebt_Yes", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + let armor = KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit; + let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted("Common", armor, + false, 0, 50, [])); + let events = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); + let variant: KDRestraintVariant = { + template: armor, + events: events, + }; + if (curs) { + events.push(...KDEventHexModular[curs].events({variant: variant})); + } + KDEquipInventoryVariant(variant, "", 0, true, "", true, false, "Shopkeeper", true, + KDGetByWeight(KinkyDungeonGetCurseByListWeighted(["Common"], "", false, 0, 20))); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "No": { + playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogStage = "Debt"; + KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; + return true; + } + }, + } + }, + "Pay": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KinkyDungeonGold >= KDGameData.ShopkeeperFee; + }, + clickFunction: (_gagged, _player) => { + KinkyDungeonGold -= KDGameData.ShopkeeperFee; + KDGameData.ShopkeeperFee = 0; + KinkyDungeonRemoveRestraintsWithShrine("Rope", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Leather", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Metal", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Latex", undefined, true, false, true, false, true); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + } + }, + "ShopkeeperOfferHelp": { + response: "Default", + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogMsgValue = { + "RESCUECOST": Math.round(KDDialogueParams.ShopkeeperHelpFee + (KDDialogueParams.ShopkeeperHelpFeePerLevel * (KDGameData.HighestLevelCurrent || 1)) + + (KDDialogueParams.ShopkeeperHelpFeePerPower * (KDGetTotalRestraintPower( + KinkyDungeonPlayerEntity, ["Leather", "Latex", "Rope", "Metal"], [], true, false) + || 1))), + }; + KDGameData.CurrentDialogMsgData = { + "RESCUECOST": "" + Math.round(KDGameData.CurrentDialogMsgValue.RESCUECOST), + }; + return false; + }, + options: { + "Pay": { + playertext: "Default", response: "Default", gag: true, + prerequisiteFunction: (_gagged, _player) => { + return KinkyDungeonGold >= KDGameData.CurrentDialogMsgValue.RESCUECOST; + }, + clickFunction: (_gagged, _player) => { + KinkyDungeonGold -= KDGameData.CurrentDialogMsgValue.RESCUECOST; + KinkyDungeonRemoveRestraintsWithShrine("Rope", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Leather", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Metal", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Latex", undefined, true, false, true, false, true); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Tab": { + prerequisiteFunction: (_gagged, _player) => { + return !KDGameData.CurrentDialogMsgData.Please; + }, + playertext: "Default", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + if (KinkyDungeonGold >= KDGameData.CurrentDialogMsgValue.RESCUECOST) { + KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpTabNo"; + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsgData.Please = "true"; + return false; + } else { + if (!KDGameData.CurrentDialogMsgData) KDGameData.CurrentDialogMsgData = {}; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor = KinkyDungeonGetRestraint({tags: ['commonCurse']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint = KDChooseRestraintFromListGroupPri( + KDGetRestraintsEligible({tags: ['trap', 'shopRestraint']}, 10, 'grv', true, undefined, undefined, undefined, false), + KDGetProgressiveOrderFun())?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar = KinkyDungeonGetRestraint({tags: ['shopCollar']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit = KinkyDungeonGetRestraint({tags: ['shopCatsuit']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + + if (KDGetTotalRestraintPower( + KinkyDungeonPlayerEntity, ["Leather", "Latex", "Rope", "Metal"], [], true, false) > KDDialogueParams.ShopkeeperHelpFeeFreebiePower + || KinkyDungeonFlags.get("Collateral") || !( + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit + )) { + KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpTabYesRestrained"; + } else { + KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpTabNoPoor"; + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsgData.Please = "true"; + } + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "TabRetry": { + prerequisiteFunction: (_gagged, _player) => { + return KDGameData.CurrentDialogMsgData.Please != undefined; + }, + playertext: "Default", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + if (!KDGameData.CurrentDialogMsgData) KDGameData.CurrentDialogMsgData = {}; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor = KinkyDungeonGetRestraint({tags: ['commonCurse']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint = KDChooseRestraintFromListGroupPri( + KDGetRestraintsEligible({tags: ['trap', 'shopRestraint']}, 10, 'grv', true, undefined, undefined, undefined, false), + KDGetProgressiveOrderFun())?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar = KinkyDungeonGetRestraint({tags: ['shopCollar']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit = KinkyDungeonGetRestraint({tags: ['shopCatsuit']}, 10, 'grv', true, undefined, undefined, undefined, false)?.name; + + if (KDGetTotalRestraintPower( + KinkyDungeonPlayerEntity, ["Leather", "Latex", "Rope", "Metal"], [], true, false) > KDDialogueParams.ShopkeeperHelpFeeFreebiePower + || KinkyDungeonFlags.get("Collateral") || !( + KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar + || KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit + )) { + KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpTabRetryRestrained"; + } else { + KinkyDungeonSetFlag("Collateral", -1, 1); + KinkyDungeonRemoveRestraintsWithShrine("Rope", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Leather", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Metal", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Latex", undefined, true, false, true, false, true); + KDGameData.CurrentDialogStage = "Debt"; + KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt"; + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Debt": { + prerequisiteFunction: (_gagged, _player) => { + return false; + }, + playertext: "Default", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Armor": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Armor != undefined; + }, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogMsgData.RESTRAINTNAME = KDGetItemNameString(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor); + return false; + }, + options: { + "Yes": { + playertext: "ShopkeeperOfferHelpDebt_Yes", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + if (KDRandom() > (KDBasicArmorWeight_Cursed) / (KDBasicArmorWeight_Cursed + KDBasicArmorWeight)) { + KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt_Armor_YesUncursed"; + + } else { + let armor = KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Armor; + let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted("Common", armor, + false, 0, 50, [])); + let events = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); + let variant: KDRestraintVariant = { + template: armor, + events: events, + }; + if (curs) { + events.push(...KDEventHexModular[curs].events({variant: variant})); + } + KDEquipInventoryVariant(variant, "", 0, true, "", true, false, "Shopkeeper", true, + KDGetByWeight(KinkyDungeonGetCurseByListWeighted(["Common"], "", false, 0, 20))); + KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt_Armor_YesCursed"; + + } + + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "No": { + playertext: "ShopkeeperOfferHelpDebt_No", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogStage = "Debt"; + KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt"; + return true; + } + }, + } + }, + "Restraint": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Restraint != undefined; + }, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogMsgData.RESTRAINTNAME = KDGetItemNameString(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint); + return false; + }, + options: { + "Yes": { + playertext: "ShopkeeperOfferHelpDebt_Yes", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + let armor = KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Restraint; + let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted("Common", armor, + false, 0, 50, [])); + let events = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); + let variant: KDRestraintVariant = { + template: armor, + events: events, + }; + if (curs) { + events.push(...KDEventHexModular[curs].events({variant: variant})); + } + KDEquipInventoryVariant(variant, "", 0, true, "", true, false, "Shopkeeper", true, + KDGetByWeight(KinkyDungeonGetCurseByListWeighted(["Common"], "", false, 0, 20))); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "No": { + playertext: "ShopkeeperOfferHelpDebt_No", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogStage = "Debt"; + KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt"; + return true; + } + }, + } + }, + "Collar": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Collar != undefined; + }, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogMsgData.RESTRAINTNAME = KDGetItemNameString(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar); + return false; + }, + options: { + "Yes": { + playertext: "ShopkeeperOfferHelpDebt_Yes", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + let armor = KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Collar; + let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted("Common", armor, + false, 0, 50, [])); + let events = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); + let variant: KDRestraintVariant = { + template: armor, + events: events, + }; + if (curs) { + events.push(...KDEventHexModular[curs].events({variant: variant})); + } + KDEquipInventoryVariant(variant, "", 0, true, "", true, false, "Shopkeeper", true, + KDGetByWeight(KinkyDungeonGetCurseByListWeighted(["Common"], "", false, 0, 20))); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "No": { + playertext: "ShopkeeperOfferHelpDebt_No", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogStage = "Debt"; + KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt"; + return true; + } + }, + } + }, + "Catsuit": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Catsuit != undefined; + }, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogMsgData.RESTRAINTNAME = KDGetItemNameString(KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit); + return false; + }, + options: { + "Yes": { + playertext: "ShopkeeperOfferHelpDebt_Yes", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + let armor = KDGameData.CurrentDialogMsgData.RESTRAINTNAME_Catsuit; + let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted("Common", armor, + false, 0, 50, [])); + let events = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); + let variant: KDRestraintVariant = { + template: armor, + events: events, + }; + if (curs) { + events.push(...KDEventHexModular[curs].events({variant: variant})); + } + KDEquipInventoryVariant(variant, "", 0, true, "", true, false, "Shopkeeper", true, + KDGetByWeight(KinkyDungeonGetCurseByListWeighted(["Common"], "", false, 0, 20))); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "No": { + playertext: "ShopkeeperOfferHelpDebt_No", response: "Default", gag: true, + clickFunction: (_gagged, _player) => { + KDGameData.CurrentDialogStage = "Debt"; + KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt"; + return true; + } + }, + } + }, + "Pay": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KinkyDungeonGold >= KDGameData.CurrentDialogMsgValue.RESCUECOST; + }, + clickFunction: (_gagged, _player) => { + KinkyDungeonGold -= KDGameData.CurrentDialogMsgValue.RESCUECOST; + KinkyDungeonRemoveRestraintsWithShrine("Rope", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Leather", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Metal", undefined, true, false, true, false, true); + KinkyDungeonRemoveRestraintsWithShrine("Latex", undefined, true, false, true, false, true); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "ShopkeeperStart": { + response: "Default", + clickFunction: (_gagged, _player) => { + if (!KDGameData.ShopkeeperFee) KDGameData.ShopkeeperFee = 0; + KDGameData.CurrentDialogMsgValue = { + "RESCUECOST": Math.round(KDGameData.ShopkeeperFee || (KDDialogueParams.ShopkeeperFee + Math.max(0, KDDialogueParams.ShopkeeperFeePerLevel * (KDGameData.HighestLevelCurrent || 1)))), + }; + KDGameData.CurrentDialogMsgData = { + "RESCUECOST": "" + (KDGameData.ShopkeeperFee || (KDDialogueParams.ShopkeeperFee + Math.max(0, KDDialogueParams.ShopkeeperFeePerLevel * (KDGameData.HighestLevelCurrent || 1)))), + }; + return false; + }, + options: { + "Shop": { + playertext: "Default", response: "Default", + gag: true, + clickFunction: (gagged, _player) => { + if (gagged) { + KDGameData.CurrentDialogMsg = "ShopkeeperStartShopGag"; + } + return false; + }, + options: { + "Sell": { + playertext: "Default", response: "Default", + exitDialogue: true, + clickFunction: (_gagged, _player) => { + KDGameData.InventoryAction = "Sell"; + KDGameData.SellMarkup = 0.7; + KinkyDungeonDrawState = "Inventory"; + KinkyDungeonCurrentFilter = Weapon; + return false; + }, + }, + /*"SellBulk": { + playertext: "Default", response: "Default", + exitDialogue: true, + clickFunction: (_gagged, _player) => { + KDGameData.InventoryAction = "SellBulk"; + KDGameData.SellMarkup = 0.7; + KinkyDungeonDrawState = "Inventory"; + KinkyDungeonCurrentFilter = Weapon; + return false; + }, + },*/ + "Return": { + playertext: "Return", response: "Default", + leadsToStage: "", + }, + } + }, + "Help": { + playertext: "Default", response: "Default", gag: true, + prerequisiteFunction: (_gagged, _player) => { + return KinkyDungeonAllRestraintDynamic().some((element) => { + return !KDRestraint(element.item)?.armor && !KDRestraint(element.item)?.good; + }); + }, + clickFunction: (_gagged, _player) => { + if (KinkyDungeonGetRestraintsWithShrine("Metal", true, true, false).length > 0 + || KinkyDungeonGetRestraintsWithShrine("Latex", true, true, false).length > 0 + || KinkyDungeonGetRestraintsWithShrine("Leather", true, true, false).length > 0 + || KinkyDungeonGetRestraintsWithShrine("Rope", true, true, false).length > 0) { + let e = KDGetSpeaker(); + KDStartDialog("ShopkeeperOfferHelp", e.Enemy.name, true, e.personality, e); + return true; + } + return false; + }, + options: { + "Return": { + playertext: "Return", response: "Default", + leadsToStage: "", + }, + } + }, + "Buy": { + playertext: "Default", response: "Default", + gag: true, + options: { + "Return": { + playertext: "Return", response: "Default", + leadsToStage: "", + }, + } + }, + "Danger": { + playertext: "Default", response: "Default", + gagDisabled: true, + options: { + "Return": { + playertext: "Return", response: "Default", + leadsToStage: "", + }, + } + }, + "Fee": { + playertext: "Default", response: "Default", + gagDisabled: true, + options: { + "Return": { + playertext: "Return", response: "Default", + leadsToStage: "", + }, + } + }, + "Gag": { + playertext: "Default", response: "Default", + gagRequired: true, + options: { + "Return": { + playertext: "Return", response: "Default", + leadsToStage: "", + }, + } + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + + "MummyElevator": { + response: "Default", + clickFunction: (_gagged, _player) => { + let e = KDGetSpeaker(); + if (e) { + e.hp = 0; + let en = DialogueCreateEnemy(e.x, e.y, "Mummy"); + en.hostile = 9999; + en.faction = "Enemy"; + en.aware = true; + + KDRunCreationScript(en, KDGetCurrentLocation()); + + // If the roomtype is sarcophagus, spawn the sarcophagus + if (KDGameData.RoomType == "ElevatorEgyptian") { + en = DialogueCreateEnemy(e.x, e.y + 11, "SarcoKraken"); + en.faction = "Enemy"; + en.maxlifetime = 9999; + en.lifetime = 9999; + + if (KinkyDungeonTilesGet((e.x) + ',' + (e.y + 11))) { + KinkyDungeonTilesGet((e.x) + ',' + (e.y + 11)).Skin = "SarcophagusGone"; + } + KDRunCreationScript(en, KDGetCurrentLocation()); + } else if (KDGameData.RoomType == "ElevatorEgyptian2") { + // Otherwise ALL statues in the room become cursed ones + for (let X = 1; X < KDMapData.GridWidth - 1; X++) { + for (let Y = 1; Y < KDMapData.GridHeight - 1; Y++) { + if (KinkyDungeonMapGet(X, Y) == 'X') { + KinkyDungeonMapSet(X, Y, '3'); + DialogueCreateEnemy(X, Y, "MummyCursed"); + } + } + } + } + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + + "AntiqueShop": KDSaleShop("AntiqueShop", ["Sunglasses", "Snuffer", "SackOfSacks", "Rope"], [], ["blacksmith"], 0.4, 2), + "BlacksmithShop": KDSaleShop("BlacksmithShop", ["Pick", "Knife", "Sword", "Hammer", "Axe", "Spear", "TrapCuffs"], [], ["blacksmith"], 0.4, 1.5), + "ArmorerShop": KDSaleShop("ArmorerShop", ["Shield", "Breastplate", "Bracers", "Gauntlets", "SteelBoots", "ChainTunic", "ChainBikini", "TrapBelt", "TrapBra"], [], ["blacksmith"], 0.4, 2.0), + "BowyerShop": KDSaleShop("BowyerShop", ["AncientPowerSource", "Bow", "BowRecurve", "Crossbow", "CrossbowPistol", "Bustier", "LeatherGloves", "LeatherBoots", "TrapBlindfold"], [], ["blacksmith"], 0.4, 1.5), + "ShadyShop": KDSaleShop("ShadyShop", + ["RopeSnakeRaw", "VinylTapeRaw", "Stuffing", "ClothGag", "ClothGag2", "ClothGag3", "ClothGagOver"], [], ["blacksmith"], 0.4, 5, ["SmokeBomb"], 10), + "PrisonerBandit": { + response: "Default", + personalities: ["Sub"], + clickFunction: (_gagged, _player) => { + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Help": { + playertext: "Default", response: "Default", + personalities: ["Sub"], + clickFunction: (_gagged, _player) => { + if (KDDialogueEnemy()) { + let e = KDDialogueEnemy(); + KDRemoveEntity(KDDialogueEnemy(), false); + let created = DialogueCreateEnemy(e.x, e.y, "Bandit"); + created.allied = 9999; + created.personality = e.personality; + if (KDFactionRelation("Player", "Bandit") < -0.5) { + for (let enemy of KDMapData.Entities) { + if (enemy.Enemy.tags.bandit) { + if (enemy.hostile && enemy.hostile < 9000) { + enemy.hostile = 0; + } + enemy.ceasefire = 300; + } + } + } + KinkyDungeonAggroFaction("Bountyhunter"); + if (KDFactionRelation("Player", "Bandit") < 0.25) + KinkyDungeonChangeFactionRep("Bandit", 0.015); + else + KinkyDungeonChangeFactionRep("Bandit", 0.005); + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Tighten": { + playertext: "Default", response: "Default", + personalities: ["Sub"], + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "PrisonerJail": { // For prisoners in the prison level. Doesnt increase rep much, but useful for jailbreak purposes + response: "Default", + clickFunction: (_gagged, _player) => { + let e = KDDialogueEnemy(); + if (e && !KDEnemyHasFlag(e, "LockJammed")) { + KDGameData.CurrentDialogMsgData = {}; + KDGameData.CurrentDialogMsgValue = {}; + let bonus = KinkyDungeonGetPickBonus(); + KDGameData.CurrentDialogMsgValue.JamPercent = 1/Math.max(1, (2 + ((bonus > 0) ? 5*bonus : 2*bonus))); + if (KinkyDungeonFlags.get("LockJamPity")) KDGameData.CurrentDialogMsgValue.JamPercent /= 2; + KDGameData.CurrentDialogMsgData.JAMPERCENT = `${Math.round(100 * KDGameData.CurrentDialogMsgValue.JamPercent)}%`; + } else { + KDGameData.CurrentDialogStage = "Jammed"; + KDGameData.CurrentDialogMsg = "PrisonerJailJammed"; + } + + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Jammed": { + prerequisiteFunction: (_gagged, _player) => { + return false; + }, + playertext: "Default", response: "Default", + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "JammedRecent": { + prerequisiteFunction: (_gagged, _player) => { + return false; + }, + playertext: "Default", response: "Default", + options: { + "Apologize": { + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", 5); + return false; + }, + playertext: "Default", response: "Default", + gagDisabled: true, + exitDialogue: true, + }, + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Unlock": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, player) => { + if (KinkyDungeonItemCount("RedKey") > 0) { + if (KinkyDungeonCanUseKey() || !KinkyDungeonIsArmsBound()) { + if (KDDialogueEnemy()) { + let e = KDDialogueEnemy(); + KDFreeNPC(e); + if (e.specialdialogue == "PrisonerJail") delete e.specialdialogue; + e.allied = 9999; + KDAggroMapFaction(); + let faction = e.Enemy.faction ? e.Enemy.faction : "Enemy"; + e.faction = "Player"; + KinkyDungeonSetEnemyFlag(e, "NoFollow", 0); + KinkyDungeonSetEnemyFlag(e, "Defensive", -1); + if (!KinkyDungeonHiddenFactions.has(faction) && !(KDMapData.MapFaction == faction)) { + if (KDFactionRelation("Player", faction) < 0.25) + KinkyDungeonChangeFactionRep(faction, 0.03); + else + KinkyDungeonChangeFactionRep(faction, 0.015); + } + KinkyDungeonChangeRep("Prisoner", 0.5); + KDAddConsumable("RedKey", -1); + if (KinkyDungeonIsHandsBound(false, true, 0.2)) { + KinkyDungeonSetFlag("embarrassed", 8); + DialogueBringNearbyEnemy(player.x, player.y, 8, true); + KDGameData.CurrentDialogMsg = "PrisonerJailUnlockSlow"; + } else { + KDGameData.CurrentDialogMsg = "PrisonerJailUnlock"; + if (e.Enemy.tags.gagged) { + KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + "Gagged"; + } + } + KDAddToParty(e); + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerJailUnlockHandsBound"; + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerJailNoKeys"; + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Pick": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, player) => { + if (KinkyDungeonItemCount("Pick") > 0) { + if (!KinkyDungeonIsHandsBound(false, true, 0.45)) { + if (KDDialogueEnemy()) { + if (KDRandom() < KDGameData.CurrentDialogMsgValue.JamPercent && KDDialogueEnemy() && !KDEnemyHasFlag(KDDialogueEnemy(), "nojam")) { + let e = KDDialogueEnemy(); + KinkyDungeonSetEnemyFlag(e, "LockJammed", -1); + KDGameData.CurrentDialogStage = "JammedRecent"; + KDGameData.CurrentDialogMsg = "PrisonerJailPickJam"; + KinkyDungeonSetFlag("LockJamPity", -1); + } else { + KinkyDungeonSetFlag("LockJamPity", 0); + let e = KDDialogueEnemy(); + KDFreeNPC(e); + if (e.specialdialogue == "PrisonerJail") delete e.specialdialogue; + e.allied = 9999; + KDAggroMapFaction(); + + let faction = e.Enemy.faction ? e.Enemy.faction : "Enemy"; + e.faction = "Player"; + KinkyDungeonSetEnemyFlag(e, "NoFollow", 0); + KinkyDungeonSetEnemyFlag(e, "Defensive", -1); + if (!KinkyDungeonHiddenFactions.has(faction) && !(KDMapData.MapFaction == faction)) { + if (KDFactionRelation("Player", faction) < 0.25) + KinkyDungeonChangeFactionRep(faction, 0.03); + else + KinkyDungeonChangeFactionRep(faction, 0.015); + } + KinkyDungeonChangeRep("Prisoner", 0.5); + KDGameData.CurrentDialogMsg = "PrisonerJailPick"; + if (e.Enemy.tags.gagged) { + KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + "Gagged"; + } + DialogueBringNearbyEnemy(player.x, player.y, 8, true); + KDAddToParty(e); + } + + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerJailPickHandsBound"; + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerJailNoPick"; + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "PrisonerLatex": { // For prisoners in the prison level. Doesnt increase rep much, but useful for jailbreak purposes + response: "Default", + clickFunction: (_gagged, _player) => { + let e = KDDialogueEnemy(); + if (e) { + KDGameData.CurrentDialogMsgData = {}; + KDGameData.CurrentDialogMsgValue = {}; + + KDGameData.CurrentDialogMsgData.SSSvnt = KDGetCheapestLatexSolvent() || ""; + KDGameData.CurrentDialogMsgData.SLVNT = (KDGameData.CurrentDialogMsgData.SSSvnt ? + KDGetItemNameString(KDGameData.CurrentDialogMsgData.SSSvnt) : "" + ) || TextGet("KDLatexSolvent"); + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Unlock": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, player) => { + if (KDGameData.CurrentDialogMsgData.SLVNT && KinkyDungeonInventoryGet(KDGameData.CurrentDialogMsgData.SSSvnt)) { + if (!KinkyDungeonIsArmsBound()) { + if (KDDialogueEnemy()) { + let e = KDDialogueEnemy(); + KDFreeNPC(e); + if (e.specialdialogue == "PrisonerLatex") delete e.specialdialogue; + e.allied = 9999; + KDAggroMapFaction(); + let faction = e.Enemy.faction ? e.Enemy.faction : "Enemy"; + e.faction = "Player"; + KinkyDungeonSetEnemyFlag(e, "NoFollow", 0); + KinkyDungeonSetEnemyFlag(e, "Defensive", -1); + if (!KinkyDungeonHiddenFactions.has(faction) && !(KDMapData.MapFaction == faction)) { + if (KDFactionRelation("Player", faction) < 0.25) + KinkyDungeonChangeFactionRep(faction, 0.03); + else + KinkyDungeonChangeFactionRep(faction, 0.015); + } + KinkyDungeonChangeRep("Prisoner", 0.5); + KDAddConsumable( KDGameData.CurrentDialogMsgData.SSSvnt, -1); + if (KinkyDungeonIsHandsBound(false, true, 0.2)) { + KinkyDungeonSetFlag("embarrassed", 8); + DialogueBringNearbyEnemy(player.x, player.y, 8, true); + KDGameData.CurrentDialogMsg = "PrisonerLatexUnlockSlow"; + } else { + KDGameData.CurrentDialogMsg = "PrisonerLatexUnlock"; + if (e.Enemy.tags.gagged) { + KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + "Gagged"; + } + } + KDAddToParty(e); + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerLatexUnlockHandsBound"; + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerLatexNoKeys"; + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Cut": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, player) => { + if (KinkyDungeonWeaponCanCut(false)) { + if (!KinkyDungeonIsHandsBound(false, true, 0.45)) { + if (KDDialogueEnemy()) { + let e = KDDialogueEnemy(); + KDFreeNPC(e); + if (e.specialdialogue == "PrisonerLatex") delete e.specialdialogue; + e.allied = 9999; + KDAggroMapFaction(); + + let faction = e.Enemy.faction ? e.Enemy.faction : "Enemy"; + e.faction = "Player"; + KinkyDungeonSetEnemyFlag(e, "NoFollow", 0); + KinkyDungeonSetEnemyFlag(e, "Defensive", -1); + if (!KinkyDungeonHiddenFactions.has(faction) && !(KDMapData.MapFaction == faction)) { + if (KDFactionRelation("Player", faction) < 0.25) + KinkyDungeonChangeFactionRep(faction, 0.03); + else + KinkyDungeonChangeFactionRep(faction, 0.015); + } + KinkyDungeonChangeRep("Prisoner", 0.5); + + if (KinkyDungeonIsHandsBound(false, true, 0.2)) { + KinkyDungeonSetFlag("embarrassed", 8); + DialogueBringNearbyEnemy(player.x, player.y, 8, true); + KDGameData.CurrentDialogMsg = "PrisonerLatexCutSlow"; + } else { + KDGameData.CurrentDialogMsg = "PrisonerLatexCut"; + if (e.Enemy.tags.gagged) { + KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + "Gagged"; + } + } + KDAddToParty(e); + + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerLatexCutHandsBound"; + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerLatexNoCut"; + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "PrisonerJailBug": { // For prisoners in the prison level. Doesnt increase rep much, but useful for jailbreak purposes + response: "Default", + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Unlock": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, player) => { + let e = KDDialogueEnemy(); + KDFreeNPC(e); + if (e.specialdialogue == "PrisonerJailBug") delete e.specialdialogue; + return false; + }, + exitDialogue: true, + }, + + } + }, + "PrisonerJailOther": { // For boss minions + response: "Default", + clickFunction: (_gagged, _player) => { + let e = KDDialogueEnemy(); + if (e) { + KDGameData.CurrentDialogMsgData = {}; + KDGameData.CurrentDialogMsgValue = {}; + } + + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + + "PrisonerJailOwn": { // For prisoners in the prison level. Doesnt increase rep much, but useful for jailbreak purposes + response: "Default", + clickFunction: (_gagged, _player) => { + let e = KDDialogueEnemy(); + if (e) { + KDGameData.CurrentDialogMsgData = {}; + KDGameData.CurrentDialogMsgValue = {}; + } + + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + "Unlock": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, player) => { + if (KinkyDungeonItemCount("RedKey") > 0) { + if (KinkyDungeonCanUseKey() || !KinkyDungeonIsArmsBound()) { + if (KDDialogueEnemy()) { + let e = KDDialogueEnemy(); + KDFreeNPC(e); + KDDefectIfPossible(e); + if (e.specialdialogue == "PrisonerJailOwn") delete e.specialdialogue; + if (KinkyDungeonIsHandsBound(false, true, 0.2)) { + KinkyDungeonSetFlag("embarrassed", 8); + DialogueBringNearbyEnemy(player.x, player.y, 8, true); + KDGameData.CurrentDialogMsg = "PrisonerJailUnlockSlow"; + } else { + KDGameData.CurrentDialogMsg = "PrisonerJailUnlock"; + if (e.Enemy.tags.gagged) { + KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + "Gagged"; + } + } + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerJailUnlockHandsBound"; + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerJailNoKeys"; + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Flip": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + if (KDDialogueEnemy()) { + let e = KDDialogueEnemy(); + + e.flip = !e.flip; + KinkyDungeonSetEnemyFlag(e, "blush", 2); + KDUpdatePersistentNPC(e.id); + if (KDNPCChar.get(e.id)) + KDRefreshCharacter.set(KDNPCChar.get(e.id), true); + + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerJailOwnFlip"; + } + + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Reclaim": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + if (KDDialogueEnemy()) { + let e = KDDialogueEnemy(); + + return (KDIsImprisoned(e) && KDGameData.Collection[e.id + ""] != undefined); + + } + return false; + }, + clickFunction: (_gagged, _player) => { + if (KDDialogueEnemy()) { + let e = KDDialogueEnemy(); + + if (KDIsImprisoned(e) && KDGameData.Collection[e.id + ""] != undefined) { + KDRemoveEntity(e, false, false, true); + delete KDGameData.Collection[e.id + ""].escaped; + delete KDGameData.Collection[e.id + ""].spawned; + if (KDGetNPCRestraints(e.id)?.Device) { + KDSetNPCRestraint(e.id, "Device", null); + } + KDSetIDFlag(e.id, "escapegrace", 0); + if (KDIsNPCPersistent(e.id) && KDGetPersistentNPC(e.id)) { + KDGetPersistentNPC(e.id).collect = true; + KDGetPersistentNPC(e.id).captured = false; + KDMovePersistentNPC(e.id, { + mapX: 0, + mapY: 0, + room: "Summit", + }) + } + KinkyDungeonAdvanceTime(1); + } + + } + + return false; + }, + exitDialogue: true, + }, + "Pick": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, player) => { + if (KinkyDungeonItemCount("Pick") > 0) { + if (!KinkyDungeonIsHandsBound(false, true, 0.45)) { + if (KDDialogueEnemy()) { + if (KDDialogueEnemy()) { + let e = KDDialogueEnemy(); + KDFreeNPC(e); + KDDefectIfPossible(e); + if (e.specialdialogue == "PrisonerJailOwn") delete e.specialdialogue; + KDGameData.CurrentDialogMsg = "PrisonerJailPick"; + if (e.Enemy.tags.gagged) { + KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + "Gagged"; + } + DialogueBringNearbyEnemy(player.x, player.y, 8, true); + } + + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerJailPickHandsBound"; + } + } else { + KDGameData.CurrentDialogStage = ""; + KDGameData.CurrentDialogMsg = "PrisonerJailNoPick"; + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "Fuuka": { + response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + enemy.hostile = 9999; + enemy.aware = true; + enemy.vp = 2; + enemy.AI = 'hunt'; + KinkyDungeonSetFlag("BossDialogueFuuka", -1, 1); + } + return false; + }, + options: { + "Aggressive": { gag: true, + playertext: "Default", response: "Default", + options: { + "Question": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Brat": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Proceed": {gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "ProceedGag": {gagRequired: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Brat": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Proceed": {gag: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "Proceed2": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + } + }, + "Defensive": { gag: true, + playertext: "Default", response: "Default", + options: { + "Question": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question2": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question3": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KDUnlockedPerks.includes("StartCyberDoll"); + }, + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Proceed": { + playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question4": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question5": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + dontTouchText: true, + } + } + }, + "Proceed": { + playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question2": { + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question_Question_Question_Question_Question", + dontTouchText: true, + }, + "Proceed": { + playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question2": { + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question_Question_Question_Question", + dontTouchText: true, + }, + "Question3": { + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question_Question_Question_Question", + dontTouchText: true, + }, + "Proceed": { + playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question2": { + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question_Question_Question", + dontTouchText: true, + }, + "Proceed": { + playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question2": { + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question_Question_Question", + dontTouchText: true, + }, + "Proceed": { + playertext: "FuukaDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Proceed": {gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "ProceedGag": {gagRequired: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Brat": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Proceed": {gag: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "Proceed2": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + } + }, + "Brat": { gag: true, + playertext: "Default", response: "Default", + options: { + "Question": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Proceed": {gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "ProceedGag": {gagRequired: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Brat": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Proceed": {gag: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "Proceed2": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + } + }, + "Dom": { gag: true, + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", -2); + return false; + }, + options: { + "Question": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Proceed": {gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "ProceedGag": {gagRequired: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Brat": {gag: true, + playertext: "Default", response: "Default", + options: { + "Proceed": {gag: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "Proceed2": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + } + }, + "Sub": { gag: true, + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", 2); + return false; + }, + options: { + "Question": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Proceed": {gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "ProceedGag": {gagRequired: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Brat": {gag: true, + playertext: "Default", response: "Default", + options: { + "Proceed": {gag: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "Proceed2": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + } + }, + "Attack": { + + clickFunction: () => { + KDPlayMusic("black_cat.ogg", undefined, true); + return false; + }, + playertext: "Default", exitDialogue: true}, + + "PostIntro": { + enterFunction: () => { + KDPlayMusic("black_cat.ogg", undefined, true); + return false; + }, + prerequisiteFunction: (_gagged, _player) => {return false;}, + playertext: "Default", response: "Default", + options: { + "Zombie": { + gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question", + }, + "Brat": {gag: true, + playertext: "Default", response: "FuukaPostIntro_Brat", + leadsToStage: "Fight", + }, + "Dom": {gag: true, + playertext: "Default", response: "FuukaPostIntro_Dom", + leadsToStage: "Fight", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", -2); + return false; + } + }, + "Sub": {gag: true, + playertext: "Default", response: "FuukaPostIntro_Sub", + leadsToStage: "Fight", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", 2); + return false; + } + }, + "Normal": {gag: true, + playertext: "Default", response: "FuukaPostIntro_Normal", + leadsToStage: "Fight", + }, + } + }, + "Fight": { + prerequisiteFunction: (_gagged, _player) => {return false;}, + playertext: "Default", dontTouchText: true, + options: { + "Fight1": {gag: true, + playertext: "Default", exitDialogue: true, + }, + "Fight2": {gag: true, + playertext: "Default", exitDialogue: true, + }, + "Fight3": {gag: true, + playertext: "Default", exitDialogue: true, + }, + } + } + } + }, + "TheWarden": { + response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + enemy.hostile = 9999; + enemy.aware = true; + enemy.vp = 2; + enemy.AI = 'hunt'; + KinkyDungeonSetFlag("BossDialogueTheWarden", -1, 1); + } + return false; + }, + options: { + "Aggressive": { gag: true, + playertext: "Default", response: "Default", + options: { + "Question": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Brat": { + playertext: "Default", response: "Default", + options: { + "Question": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Question2": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Proceed": {gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "ProceedGag": {gagRequired: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Brat": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Proceed": {gag: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "Proceed2": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + } + }, + "Defensive": { gag: true, + playertext: "Default", response: "Default", + options: { + "Question": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "TheWardenDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question2": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "TheWardenDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question3": { + playertext: "Default", response: "Default", + prerequisiteFunction: (_gagged, _player) => { + return KDUnlockedPerks.includes("StartCyberDoll"); + }, + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "TheWardenDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question2": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "TheWardenDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question3": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + dontTouchText: true, + } + } + }, + "Proceed": { + playertext: "TheWardenDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Proceed": { + playertext: "TheWardenDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question2": { + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question_Question_Question_Question_Question", + dontTouchText: true, + }, + "Proceed": { + playertext: "TheWardenDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question2": { + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question_Question_Question_Question", + dontTouchText: true, + }, + "Question3": { + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question_Question_Question_Question", + dontTouchText: true, + }, + "Proceed": { + playertext: "TheWardenDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question2": { + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question_Question_Question", + dontTouchText: true, + }, + "Proceed": { + playertext: "TheWardenDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Question2": { + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question_Question_Question", + dontTouchText: true, + }, + "Proceed": { + playertext: "TheWardenDefensive_Question_Question_Proceed", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Proceed": {gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "ProceedGag": {gagRequired: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Brat": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Proceed": {gag: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "Proceed2": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + } + }, + "Brat": { gag: true, + playertext: "Default", response: "Default", + options: { + "Question": {gagDisabled: true, + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + if (KinkyDungeonPlayerTags.get("Collars")) { + KDGameData.CurrentDialogMsg = "TheWardenBrat_Question_Collar"; + } + return false; + }, + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Proceed": {gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "ProceedGag": {gagRequired: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Brat": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Proceed": {gag: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "Proceed2": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + } + }, + "Dom": { gag: true, + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", -2); + return false; + }, + options: { + "Question": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Proceed": {gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "ProceedGag": {gagRequired: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Brat": {gag: true, + playertext: "Default", response: "Default", + options: { + "Proceed": {gag: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "Proceed2": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + } + }, + "Sub": { gag: true, + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", 2); + return false; + }, + options: { + "Question": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Question": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + } + } + }, + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Proceed": {gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "ProceedGag": {gagRequired: true, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + "Brat": {gag: true, + playertext: "Default", response: "Default", + options: { + "Proceed": {gag: true, + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + "Proceed2": { + playertext: "Default", response: "Default", + leadsToStage: "PostIntro", + }, + } + }, + } + }, + "Attack": { + clickFunction: () => { + KDPlayMusic("factory_ambient.ogg", undefined, true); + return false; + }, + playertext: "Default", exitDialogue: true}, + + "PostIntro": { + enterFunction: () => { + KDPlayMusic("factory_ambient.ogg", undefined, true); + return false; + }, + prerequisiteFunction: (_gagged, _player) => {return false;}, + playertext: "Default", response: "Default", + options: { + "Zombie": { + gagDisabled: true, + playertext: "Default", response: "Default", + leadsToStage: "Defensive_Question", + }, + "Brat": {gag: true, + playertext: "Default", response: "TheWardenPostIntro_Brat", + leadsToStage: "Fight", + }, + "Dom": {gag: true, + playertext: "Default", response: "TheWardenPostIntro_Dom", + leadsToStage: "Fight", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", -2); + return false; + } + }, + "Sub": {gag: true, + playertext: "Default", response: "TheWardenPostIntro_Sub", + leadsToStage: "Fight", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", 2); + return false; + } + }, + "Normal": {gag: true, + playertext: "Default", response: "TheWardenPostIntro_Normal", + leadsToStage: "Fight", + }, + } + }, + "Fight": { + prerequisiteFunction: (_gagged, _player) => {return false;}, + playertext: "Default", dontTouchText: true, + options: { + "Fight1": {gag: true, + playertext: "Default", exitDialogue: true, + }, + "Fight2": {gag: true, + playertext: "Default", exitDialogue: true, + }, + "Fight3": {gag: true, + playertext: "Default", exitDialogue: true, + }, + } + } + } + }, + "Dollmaker": { + response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + enemy.hostile = 9999; + enemy.aware = true; + enemy.vp = 2; + enemy.AI = 'hunt'; + KinkyDungeonSetFlag("BossDialogueDollmaker", -1, 1); + } + KDUnlockPerk("StartCyberDollStorage"); + return false; + }, + options: { + "Ask": { + playertext: "Default", response: "Default", gag: true, + options: { + "Proceed": { + playertext: "Default", response: "Default", gag: true, + leadsToStage: "Fight", + }, + "Staff": { + prerequisiteFunction: (_gagged, _player) => { + return KinkyDungeonPlayerDamage?.name == "StaffDoll"; + }, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "Fight", + }, + } + } + } + }, + "Assume": { + playertext: "Default", response: "Default", gagDisabled: true, + options: { + "Happy": { + playertext: "Default", response: "Default", + leadsToStage: "Fight", + }, + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "Fight", + }, + "Staff": { + prerequisiteFunction: (_gagged, _player) => { + return KinkyDungeonPlayerDamage?.name == "StaffDoll"; + }, + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", response: "Default", + leadsToStage: "Fight", + }, + } + } + } + }, + + "Fight": { + prerequisiteFunction: (_gagged, _player) => {return false;}, + enterFunction: () => { + KDPlayMusic("slimy_science_1.ogg", undefined, true); + return false; + }, + playertext: "Default", response: "Default", + options: { + "Wait": {gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Dismiss": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", exitDialogue: true, + }, + } + }, + "Press": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", exitDialogue: true, + }, + } + }, + "Press2": { + playertext: "Default", response: "Default", + options: { + "Proceed": { + playertext: "Default", exitDialogue: true, + }, + } + }, + "Proceed": { + playertext: "Default", exitDialogue: true, + }, + } + }, + "Fight1": {gag: true, + playertext: "Default", exitDialogue: true, + }, + "Fight2": {gag: true, + playertext: "Default", exitDialogue: true, + }, + "Fight3": {gag: true, + playertext: "Default", exitDialogue: true, + }, + } + }, + "Attack": { + clickFunction: () => { + KDPlayMusic("slimy_science_1.ogg", undefined, true); + return false; + }, + playertext: "Default", exitDialogue: true}, + } + }, + "DollmakerStage2": { + response: "Default", + clickFunction: (_gagged, _player) => { + let point = KinkyDungeonGetNearbyPoint(KDMapData.StartPosition.x + 10, KDMapData.StartPosition.y - 5, true,undefined, true, true); + if (!point) { + point = {x: KDMapData.StartPosition.x + 10, y: KDMapData.StartPosition.y - 5}; + } + let e = DialogueCreateEnemy(point.x, point.y, "DollmakerBoss2"); + e.Enemy = JSON.parse(JSON.stringify(e.Enemy)); + if (KinkyDungeonStatsChoice.get("extremeMode")) e.Enemy.maxhp *= 4; + else if (KinkyDungeonStatsChoice.get("hardMode")) e.Enemy.maxhp *= 2; + e.hp = e.Enemy.maxhp; + e.hostile = 300; + e.modified = true; + + KDRunCreationScript(e, KDGetCurrentLocation()); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "DollmakerStage3": { + response: "Default", + clickFunction: (_gagged, player) => { + // Remove the doors + for (let en of KDMapData.Entities) { + if (en.Enemy.tags.dolldoor) en.hp = 0; + } + let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true); + if (!point) { + point = KinkyDungeonGetRandomEnemyPoint(false, false, null); + } + let e = DialogueCreateEnemy(point.x, point.y, "DollmakerBoss3"); + e.Enemy = JSON.parse(JSON.stringify(e.Enemy)); + if (KinkyDungeonStatsChoice.get("extremeMode")) e.Enemy.maxhp *= 4; + else if (KinkyDungeonStatsChoice.get("hardMode")) e.Enemy.maxhp *= 2; + e.hp = e.Enemy.maxhp; + e.hostile = 300; + e.modified = true; + KDRunCreationScript(e, KDGetCurrentLocation()); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "DollmakerWin": { + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("BossUnlocked", -1); + KinkyDungeonSetFlag("SpawnMap", -1); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + clickFunction: (_gagged, _player) => { + if (KinkyDungeonIsPlayer()) { + KDUnlockPerk("DollmakerVisor"); + KDUnlockPerk("DollmakerMask"); + KDUnlockPerk("StartCyberDoll"); + KDUnlockPerk("CommonCyber"); + } + return false; + }, + exitDialogue: true, + }, + "Accept": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerVisor"), 0, true); + KinkyDungeonAddGold(1000); + if (KinkyDungeonIsPlayer()) { + KDUnlockPerk("DollmakerVisor"); + KDUnlockPerk("DollmakerMask"); + KDUnlockPerk("StartCyberDoll"); + KDUnlockPerk("CommonCyber"); + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Accept2": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerMask"), 0, true); + KinkyDungeonAddGold(1000); + if (KinkyDungeonIsPlayer()) { + KDUnlockPerk("DollmakerVisor"); + KDUnlockPerk("DollmakerMask"); + KDUnlockPerk("StartCyberDoll"); + KDUnlockPerk("CommonCyber"); + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Gag": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", -5); + if (KinkyDungeonIsPlayer()) { + KDUnlockPerk("DollmakerVisor"); + KDUnlockPerk("DollmakerMask"); + KDUnlockPerk("StartCyberDoll"); + KDUnlockPerk("CommonCyber"); + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "DollmakerLose": { + response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + enemy.hostile = 0; + enemy.ceasefire = 4; + KinkyDungeonSetFlag("BossUnlocked", -1); + KinkyDungeonSetFlag("NoDollRoomBypass", 0); + } + return false; + }, + options: { + "Accept": { gag: true, + playertext: "Default", response: "Default", + options: { + "Continue1": { + playertext: "DollmakerLose_Continue1", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerVisor"), 0, true); + return false; + }, + }, + "Continue2": { + playertext: "DollmakerLose_Continue2", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerMask"), 0, true); + return false; + }, + }, + "Continue3": { + playertext: "DollmakerLose_Continue3", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(KDRandom() < 0.5 ? "DollmakerVisor" : "DollmakerMask"), 0, true); + return false; + }, + }, + } + }, + "Deny": { gag: true, + playertext: "Default", response: "Default", + options: { + "Continue1": { + playertext: "DollmakerLose_Continue1", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerVisor"), 0, true); + return false; + }, + }, + "Continue2": { + playertext: "DollmakerLose_Continue2", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerMask"), 0, true); + return false; + }, + }, + "Continue3": { + playertext: "DollmakerLose_Continue3", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(KDRandom() < 0.5 ? "DollmakerVisor" : "DollmakerMask"), 0, true); + return false; + }, + }, + } + }, + "Finish": { + prerequisiteFunction: (_gagged, _player) => {return false;}, + playertext: "Default", response: "DollmakerLoseFinish", + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + } + } + }, + "FuukaLose": { // Player loses to Fuuka + response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + enemy.hostile = 0; + enemy.ceasefire = 4; + KinkyDungeonSetFlag("BossUnlocked", -1); + KinkyDungeonRemoveBuffsWithTag(KinkyDungeonPlayerEntity, ["removeDefeat"]); + } + return false; + }, + options: { + "Magic": { gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Continue1": { + playertext: "FuukaLose_Continue1", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); + return false; + }, + }, + "Continue2": { + playertext: "FuukaLose_Continue2", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); + return false; + }, + }, + "Continue3": { + playertext: "FuukaLose_Continue3", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); + return false; + }, + }, + } + }, + "Accept": { gag: true, + playertext: "Default", response: "Default", + options: { + "Continue1": { + playertext: "FuukaLose_Continue1", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); + return false; + }, + }, + "Continue2": { + playertext: "FuukaLose_Continue2", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); + return false; + }, + }, + "Continue3": { + playertext: "FuukaLose_Continue3", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); + return false; + }, + }, + } + }, + "Deny": { gag: true, + playertext: "Default", response: "Default", + options: { + "Continue1": { + playertext: "FuukaLose_Continue1", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); + return false; + }, + }, + "Continue2": { + playertext: "FuukaLose_Continue2", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); + return false; + }, + }, + "Continue3": { + playertext: "FuukaLose_Continue3", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); + return false; + }, + }, + } + }, + "Finish": { + prerequisiteFunction: (_gagged, _player) => {return false;}, + playertext: "Default", response: "FuukaLoseFinish", + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + } + } + }, + "DragonQueenCrystal": { // Player defeats fuuka's first form + response: "Default", + clickFunction: (_gagged, player) => { + let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, true); + if (!point) { + point = KinkyDungeonGetRandomEnemyPoint(false, false, null); + } + let e = DialogueCreateEnemy(point.x, point.y, "DragonGirlCrystal"); + e.Enemy = JSON.parse(JSON.stringify(e.Enemy)); + if (KinkyDungeonStatsChoice.get("extremeMode")) e.Enemy.maxhp *= 4; + else if (KinkyDungeonStatsChoice.get("hardMode")) e.Enemy.maxhp *= 2; + e.hp = e.Enemy.maxhp; + e.modified = true; + KDRunCreationScript(e, KDGetCurrentLocation()); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "FuukaStage2": { // Player defeats fuuka's first form + response: "Default", + clickFunction: (_gagged, player) => { + let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true); + if (!point) { + point = KinkyDungeonGetRandomEnemyPoint(false, false, null); + } + let e = DialogueCreateEnemy(point.x, point.y, "Fuuka2"); + e.Enemy = JSON.parse(JSON.stringify(e.Enemy)); + if (KinkyDungeonStatsChoice.get("extremeMode")) e.Enemy.maxhp *= 4; + else if (KinkyDungeonStatsChoice.get("hardMode")) e.Enemy.maxhp *= 2; + e.hp = e.Enemy.maxhp; + e.hostile = 300; + e.modified = true; + KDRunCreationScript(e, KDGetCurrentLocation()); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "FuukaWin": { // Player beats Fuuka + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("BossUnlocked", -1); + KinkyDungeonSetFlag("SpawnMap", -1); + if (KinkyDungeonPlayerBuffs?.FuukaOrb) KinkyDungeonPlayerBuffs.FuukaOrb.duration = 0; + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + clickFunction: (_gagged, _player) => { + if (KinkyDungeonIsPlayer()) { + KDUnlockPerk("FuukaCollar"); + KDUnlockPerk("CommonFuuka"); + } + return false; + }, + exitDialogue: true, + }, + "Accept": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar2"), 0, true); + //KinkyDungeonAddGold(1000); + if (KinkyDungeonIsPlayer()) { + KDUnlockPerk("FuukaCollar"); + KDUnlockPerk("CommonFuuka"); + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Gag": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", -5); + if (KinkyDungeonIsPlayer()) { + KDUnlockPerk("FuukaCollar"); + KDUnlockPerk("CommonFuuka"); + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + + + "TheWardenLose": { // Player loses to TheWarden + response: "Default", + clickFunction: (_gagged, _player) => { + let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); + if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { + enemy.hostile = 0; + enemy.ceasefire = 4; + KinkyDungeonSetFlag("BossUnlocked", -1); + KinkyDungeonRemoveBuffsWithTag(KinkyDungeonPlayerEntity, ["removeDefeat"]); + } + return false; + }, + options: { + "Magic": { gagDisabled: true, + playertext: "Default", response: "Default", + options: { + "Continue1": { + playertext: "TheWardenLose_Continue1", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); + KinkyDungeonChangeRep("Prisoner", -100); + return false; + }, + }, + "Continue2": { + playertext: "TheWardenLose_Continue2", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); + KinkyDungeonChangeRep("Prisoner", -100); + return false; + }, + }, + "Continue3": { + playertext: "TheWardenLose_Continue3", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); + KinkyDungeonChangeRep("Prisoner", -100); + return false; + }, + }, + } + }, + "Accept": { gag: true, + playertext: "Default", response: "Default", + options: { + "Continue1": { + playertext: "TheWardenLose_Continue1", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); + KinkyDungeonChangeRep("Prisoner", -100); + return false; + }, + }, + "Continue2": { + playertext: "TheWardenLose_Continue2", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); + KinkyDungeonChangeRep("Prisoner", -100); + return false; + }, + }, + "Continue3": { + playertext: "TheWardenLose_Continue3", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); + KinkyDungeonChangeRep("Prisoner", -100); + return false; + }, + }, + } + }, + "Deny": { gag: true, + playertext: "Default", response: "Default", + options: { + "Continue1": { + playertext: "TheWardenLose_Continue1", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); + KinkyDungeonChangeRep("Prisoner", -100); + return false; + }, + }, + "Continue2": { + playertext: "TheWardenLose_Continue2", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); + KinkyDungeonChangeRep("Prisoner", -100); + return false; + }, + }, + "Continue3": { + playertext: "TheWardenLose_Continue3", response: "Default", + leadsToStage: "Finish", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); + KinkyDungeonChangeRep("Prisoner", -100); + return false; + }, + }, + } + }, + "Finish": { + prerequisiteFunction: (_gagged, _player) => {return false;}, + playertext: "Default", response: "TheWardenLoseFinish", + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + } + } + }, + "TheWardenStage2": { // Player defeats thewarden's first form + response: "Default", + clickFunction: (_gagged, player) => { + let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true); + if (!point) { + point = KinkyDungeonGetRandomEnemyPoint(false, false, null); + } + let e = DialogueCreateEnemy(point.x, point.y, "TheWarden2"); + e.Enemy = JSON.parse(JSON.stringify(e.Enemy)); + if (KinkyDungeonStatsChoice.get("extremeMode")) e.Enemy.maxhp *= 4; + else if (KinkyDungeonStatsChoice.get("hardMode")) e.Enemy.maxhp *= 2; + e.hp = e.Enemy.maxhp; + e.hostile = 300; + e.modified = true; + KDRunCreationScript(e, KDGetCurrentLocation()); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "TheWardenWin": { // Player beats TheWarden + response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonSetFlag("BossUnlocked", -1); + KinkyDungeonSetFlag("SpawnMap", -1); + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + clickFunction: (_gagged, _player) => { + if (KinkyDungeonIsPlayer()) { + KDUnlockPerk("WardenBelt"); + KDUnlockPerk("CommonWarden"); + } + return false; + }, + exitDialogue: true, + }, + "Accept": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt2"), 0, true); + KinkyDungeonAddGold(1000); + if (KinkyDungeonIsPlayer()) { + KDUnlockPerk("WardenBelt"); + KDUnlockPerk("CommonWarden"); + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + "Gag": { + playertext: "Default", response: "Default", + clickFunction: (_gagged, _player) => { + KinkyDungeonChangeRep("Ghost", -5); + if (KinkyDungeonIsPlayer()) { + KDUnlockPerk("WardenBelt"); + KDUnlockPerk("CommonWarden"); + } + return false; + }, + options: { + "Leave": { + playertext: "Leave", response: "Default", + exitDialogue: true, + }, + } + }, + } + }, + "ShopBuy": KDShopBuyDialogue("ShopBuy"), + "PotionSell": KDShopDialogue("PotionSell", ["PotionFrigid", "PotionStamina", "PotionMana", "PotionInvisibility"], [], ["witch", "apprentice", "alchemist", "human", "dragon"], 0.2, + ["PotionWill", "PotionFrigid"]), + "ElfCrystalSell": KDShopDialogue("ElfCrystalSell", ["PotionMana", "ManaOrb", "ElfCrystal", "EarthRune", "WaterRune", "IceRune"], [], ["elf"], 0.25, + ["ElfCrystal"]), + "ScrollSell": KDShopDialogue("ScrollSell", ["ScrollArms", "ScrollVerbal", "ScrollLegs", "ScrollPurity"], [], ["witch", "apprentice", "elf", "wizard", "dressmaker"], 0.15, + ["ScrollArms", "ScrollVerbal", "ScrollLegs"]), + "WolfgirlSell": KDShopDialogue("WolfgirlSell", ["MistressKey", "ManaOrb", "AncientPowerSource", "AncientPowerSourceSpent", "EnchantedGrinder"], [], ["trainer", "alchemist", "human"], 0.2, + ["AncientPowerSource", "AncientPowerSourceSpent", "AncientPowerSourceSpent"]), + "NinjaSell": KDShopDialogue("NinjaSell", ["SmokeBomb", "FlashBomb", "Flashbang", "Bola", "Bomb", "PotionInvisibility"], [], ["ninja", "bountyhunter"], 0.2, + ["SmokeBomb", "Bola", "Bomb"]), + "BombSell": KDShopDialogue("BombSell", ["SmokeBomb", "FlashBomb", "Flashbang", "Gunpowder", "Bomb"], [], ["miner", "bandit", "gun", "alchemist"], 0.4, + ["Bomb", "Bomb", "Bomb"]), + "CookieSell": KDShopDialogue("CookieSell", ["Cookie", "Brownies", "Donut", "CookieJailer", "DivineTear"], [], ["human"], 0.14, + ["Cookie", "Brownies", "Donut"]), + "ThiefSell": KDShopDialogue("ThiefSell", ["DiscPick", "CuffKeys", "Snuffer", "Bomb", "FlashBomb", "Flashbang", "SmokeBomb"], [], ["human"], 0.1, + ["DiscPick", "CuffKeys"]), + "GunSell": KDShopDialogue("GunSell", ["Blaster", "EscortDrone", "Gunpowder", "CrossbowHeavy", "CrossbowPistol", "Crossbow"], [], ["maid", "bandit", "gun", "bountyhunter"], 0.33, + ["CrossbowPistol", "Gunpowder"]), + "GhostSell": KDShopDialogue("GhostSell", ["Ectoplasm", "PotionInvisibility", "ElfCrystal"], [], ["alchemist", "witch", "apprentice", "dressmaker", "dragon"], 0.1, + ["Ectoplasm", "Ectoplasm", "Ectoplasm"]), + "DressSell": KDShopDialogue("DressSell", ["BindingDress", "MikoDress", "DressGag", "DressBra"], [], ["dressmaker"], 0.5, + ["BindingDress", "DressBra", "DressGag"]), + // TODO magic book dialogue in which you can read forward and there are traps + "GenericAlly": KDAllyDialogue("GenericAlly", [], [], [], 1), +}; + + diff --git a/Game/src/dialogue/KinkyDungeonDialogueTriggers.ts b/Game/src/dialogue/KinkyDungeonDialogueTriggers.ts new file mode 100644 index 000000000..8fedc56ad --- /dev/null +++ b/Game/src/dialogue/KinkyDungeonDialogueTriggers.ts @@ -0,0 +1,428 @@ +"use strict"; + +/** No dialogues will trigger when the player dist is higher than this */ +let KinkyDungeonMaxDialogueTriggerDist = 5.9; + +let KDDialogueTriggers: Record = { + "WeaponStop": { + dialogue: "WeaponFound", + allowedPrisonStates: ["parole", "jail"], + excludeTags: ["zombie", "skeleton", "gagged"], + playRequired: true, + noCombat: true, + noAlly: true, + talk: true, + blockDuringPlaytime: false, + prerequisite: (enemy, dist, _AIData) => { + return (KinkyDungeonPlayerDamage + && !KinkyDungeonPlayerDamage.unarmed + && KinkyDungeonPlayerDamage.name + && dist < 3.9 + && KDGetMainFaction() != "Player" + && (KDHostile(enemy) + || KDFactionFavorable(KDGetFaction(enemy), KDGetMainFaction())) + && KDRandom() < 0.25 + && !KinkyDungeonFlags.get("noWeaponStop") + && !KinkyDungeonFlags.has("demand")); + }, + weight: (enemy, _dist) => { + return KDStrictPersonalities.includes(enemy.personality) ? 10 : 1; + }, + }, + "OfferDress": KDDialogueTriggerOffer("OfferDress", ["Rope", "Conjure"], ["bindingDress"], + ["parole", "", "chase", "jail"], ["Sub", "Brat"], + ["dressmaker", "bindingDress"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferKigu": KDDialogueTriggerOffer("OfferKigu", ["Latex", "Conjure"], ["kiguRestraints"], + ["parole", "", "chase", "jail"], ["Dom", "Brat"], + ["dressmaker"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferSenseDep": KDDialogueTriggerOffer("OfferSenseDep", ["Leather", "Illusion"], ["sensedep"], + ["parole", "", "chase", "jail"], ["Dom", "Brat"], + ["dressmaker", "ninja", "leatherRestraints", "leatherRestraintsHeavy"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferArmor": KDDialogueTriggerOffer("OfferArmor", ["Metal", "Illusion"], ["shackleGag"], + ["parole", "", "chase", "jail"], ["Sub", "Brat"], + ["shackleGag", "metal", "shackleRestraints", "chain"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferChain": KDDialogueTriggerOffer("OfferChain", ["Metal", "Conjure"], ["chainRestraints"], + ["parole", "", "chase", "jail"], ["Sub", "Brat"], + ["chainRestraints", "metal", "handcuffer"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferVine": KDDialogueTriggerOffer("OfferVine", ["Will", "Rope"], ["vineRestraints"], + ["parole", "", "chase", "jail"], ["Dom", ""], + ["nature", "vineRestraints"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferObsidian": KDDialogueTriggerOffer("OfferObsidian", ["Metal", "Elements"], ["obsidianRestraints"], + ["parole", "", "chase", "jail"], undefined, + ["obsidianRestraints"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferMaidRestraint": KDDialogueTriggerOffer("OfferMaidRestraint", ["Latex", "Illusion"], ["maidRestraints"], + ["parole", "", "chase", "jail"], ["Sub", "Brat"], + ["maid"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined, "Blue", 0.4), + "OfferDusterGag": KDDialogueTriggerOffer("OfferDusterGag", ["Latex", "Illusion"], ["dustergag"], + ["parole", "", "chase", "jail"], ["Dom", "Brat", ""], + ["maid"], ["elite", "miniboss", "boss"], undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferDragon": KDDialogueTriggerOffer("OfferDragon", ["Leather"], ["dragonRestraints"], + ["parole", "", "chase", "jail"], ["Dom", "", "Brat"], + ["dragon"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferComfy": KDDialogueTriggerOffer("OfferComfy", ["Metal", "Prisoner"], ["comfyRestraints"], + ["parole", "", "chase", "jail"], undefined, + ["submissive"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferShackles": KDDialogueTriggerOffer("OfferShackles", ["Metal", "Prisoner"], ["shackleRestraints", "steelCuffs"], + ["parole", "", "chase", "jail"], ["Dom", ""], + ["shackleRestraints", "steelCuffs", "handcuffer", "police"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferKitty": KDDialogueTriggerOffer("OfferKitty", ["Leather", "Will"], ["kittyRestraints"], + ["parole", "", "chase", "jail"], ["Dom", "Brat", "Sub"], + ["mummy", "kittyRestraints"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferMithrilRope": KDDialogueTriggerOffer("OfferMithrilRope", ["Metal", "Will"], ["mithrilRope","mithrilRopeHogtie"], + ["parole", "", "chase", "jail"], ["Dom", "Brat", "Sub"], + ["elf"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferMithril": KDDialogueTriggerOffer("OfferMithril", ["Metal", "Will"], ["mithrilRestraints"], + ["parole", "", "chase", "jail"], ["Dom", "Brat", ""], + ["elf"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferWolfRestraint": KDDialogueTriggerOffer("OfferWolfRestraint", ["Metal", "Latex"], ["wolfRestraints", "wolfRestraintsHeavy"], + ["parole", "", "chase", "jail"], ["Dom", ""], + ["trainer"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferSlime": KDDialogueTriggerOffer("OfferSlime", ["Latex", "Prisoner"], ["slimeRestraintsRandom"], + ["parole", "", "chase", "jail"], ["Dom", "Brat"], + ["alchemist", "apprentice", "wizard"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferResin": KDDialogueTriggerOffer("OfferResin", ["Latex", "Prisoner"], ["resinRestraints"], + ["parole", "",], ["Dom", "Brat", "Sub", ""], + ["alchemist"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, ["Released"]), + + "OfferScarf": KDDialogueTriggerOffer("OfferScarf", ["Rope"], ["scarfRestraints"], + ["parole", "", "chase", "jail"], undefined, + ["scarfRestraints","ropeAuxiliary", "dressmaker"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferAutoTape": KDDialogueTriggerOffer("OfferAutoTape", ["Metal"], ["autoTape"], + ["parole", "", "chase", "jail"], ["Robot"], + ["autoTape"], undefined, ["robot"], ["zombie", "skeleton"], + undefined, undefined), + + "OfferHiTechCables": KDDialogueTriggerOffer("OfferHiTechCables", ["Metal"], ["hitechCables", "cableGag"], + ["parole", "", "chase", "jail"], ["Robot"], + ["hitechCables", "cableGag"], undefined, ["robot"], ["zombie", "skeleton"], + undefined, undefined), + + "OfferIce": KDDialogueTriggerOffer("OfferIce", ["Elements"], ["iceRestraints"], + ["parole", "", "chase", "jail"], ["Dom"], + ["apprentice", "witch"], ["iceRestraints", "ice", "water"], undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferLatex": KDDialogueTriggerOffer("OfferLatex", ["Latex", "Conjure"], ["latexRestraints", "latexpetsuit", "latexRestraintsHeavy"], + ["parole", "", "chase", "jail"], ["Sub", "Brat"], + ["latexRestraints", "latexRestraintsHeavy", "alchemist"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferLatex2": KDDialogueTriggerOffer("OfferLatex", ["Latex", "Conjure"], ["latexRestraints", "latexpetsuit", "latexRestraintsHeavy"], + ["parole", "", "chase", "jail"], ["Dom", ""], + ["latexRestraints", "latexRestraintsHeavy", "alchemist"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferRopes": KDDialogueTriggerOffer("OfferRopes", ["Rope"], ["ropeRestraints", "ropeRestraints", "ropeRestraintsWrist", "ropeRestraintsHogtie"], + ["parole", "", "chase", "jail"], ["Dom", ""], + ["ropeRestraints", "ropeRestraints", "ropeRestraintsWrist", "ropeRestraintsHogtie", "rope"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferLeather": KDDialogueTriggerOffer("OfferLeather", ["Leather"], ["armbinderSpell", "straitjacketSpell", "legbinderSpell", "harnessSpell", "gagSpell", "blindfoldSpell", "leathercuffsSpell"], + ["parole", "", "chase", "jail"], undefined, + ["leatherRestraints", "leatherRestraintsHeavy"], undefined, undefined, ["zombie", "skeleton", "robot"], + undefined, undefined), + + "OfferChastity": { + dialogue: "OfferChastity", + allowedPrisonStates: ["parole", ""], + allowedPersonalities: ["Dom"], + excludeTags: ["zombie", "skeleton", "robot"], + playRequired: true, + nonHostile: true, + noCombat: true, + noAlly: true, + talk: true, + blockDuringPlaytime: true, + prerequisite: (_enemy, dist, _AIData) => { + return (dist < 1.5 + && KinkyDungeonStatsChoice.has("arousalMode") + && !KinkyDungeonFlags.get("DangerFlag") + && !KinkyDungeonFlags.get("BondageOffer") + && !KinkyDungeonFlags.get("ChastityOffer") + && !KinkyDungeonFlags.get("NoTalk") + && KDRandom() < 0.05 + && KinkyDungeonGetRestraint({tags: ["genericChastity"]}, MiniGameKinkyDungeonLevel * 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), false, undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + { + allowLowPower: true + }) != undefined); + }, + weight: (_enemy, _dist) => { + return 0.1 + 0.1 * Math.max(Math.abs(KinkyDungeonGoddessRep.Metal)/100, Math.abs(KinkyDungeonGoddessRep.Elements)/100, Math.abs(KinkyDungeonGoddessRep.Illusion)/100, Math.abs(KinkyDungeonGoddessRep.Ghost)/100); + }, + }, + "OfferCursed": { + dialogue: "OfferCursed", + allowedPrisonStates: ["parole", ""], + allowedPersonalities: ["Sub"], + excludeTags: ["zombie", "skeleton", "robot"], + playRequired: true, + nonHostile: true, + noCombat: true, + noAlly: true, + talk: true, + blockDuringPlaytime: true, + prerequisite: (_enemy, dist, _AIData) => { + return (dist < 1.5 + && !KinkyDungeonFlags.get("DangerFlag") + && !KinkyDungeonFlags.get("BondageOffer") + && !KinkyDungeonFlags.get("NoTalk") + && !KinkyDungeonFlags.get("CursedOffer") + && KDRandom() < 0.05 + && KinkyDungeonGetRestraint({tags: ["leatherRestraints", "noBelt", "leatherHeels"]}, MiniGameKinkyDungeonLevel * 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), false, undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + { + allowLowPower: true + }) != undefined); + }, + weight: (_enemy, _dist) => { + return 1 + 0.8 * Math.max(Math.abs(KinkyDungeonGoddessRep.Metal)/100, Math.abs(KinkyDungeonGoddessRep.Elements)/100, Math.abs(KinkyDungeonGoddessRep.Illusion)/100, Math.abs(KinkyDungeonGoddessRep.Ghost)/100); + }, + }, + + "PotionSell": KDShopTrigger("PotionSell"), + //"ElfCrystalSell": KDShopTrigger("ElfCrystalSell"), + //"NinjaSell": KDShopTrigger("NinjaSell"), + //"ScrollSell": KDShopTrigger("ScrollSell"), + //"GhostSell": KDShopTrigger("GhostSell"), + //"WolfgirlSell": KDShopTrigger("WolfgirlSell"), + "Fuuka": KDBossTrigger("Fuuka", ["Fuuka1", "Fuuka2"]), + "FuukaLose": KDBossLose("FuukaLose", ["Fuuka1", "Fuuka2"], undefined, () => { + return KinkyDungeonSlowLevel > 9; // Player immobilized + }), + "TheWarden": KDBossTrigger("TheWarden", ["TheWarden1", "TheWarden2"]), + "TheWardenLose": KDBossLose("TheWardenLose", ["TheWarden1", "TheWarden2"], undefined, () => { + return (KinkyDungeonPlayerTags.get("Furniture") || KinkyDungeonPlayerTags.get("OneBar")) && !KinkyDungeonHasWill(0.1); // Player in cage + }), + "DollmakerLose1": KDBossLose("DollmakerLose", ["DollmakerBoss1", "DollmakerBoss2", "DollmakerBoss3"], undefined, () => { + return (KinkyDungeonPlayerTags.get("Furniture") || KinkyDungeonPlayerTags.get("OneBar")) && !KinkyDungeonHasWill(0.1); // Player in cage + }), + "Dollmaker": KDBossTrigger("Dollmaker", ["DollmakerBoss1", "DollmakerBoss2", "DollmakerBoss3"]), +}; + +/** + * Generic condition for Bondage Offers + * @param enemy + * @param AIData + * @param dist - Current player dist, its sent as a param for faster runtime + * @param maxdist + * @param chance + * @param restraintTags - Tags of required restraints + * @param force + * @param [Lock] + */ +function KDDefaultPrereqs(enemy: entity, AIData: any, dist: number, maxdist: number, chance: number, restraintTags: string[], force: boolean, Lock: string = "Red"): boolean { + return dist < maxdist + && (!AIData.domMe || force) + && !KDEnemyHasFlag(enemy, "playstart") + && (!KinkyDungeonFlags.get("DangerFlag") || force) + && (!KinkyDungeonFlags.get("BondageOffer") || force) + && !KinkyDungeonFlags.get("NoTalk") + && (KinkyDungeonStatsChoice.get("Undeniable") || KDRandom() < chance || force) + && (!restraintTags || KinkyDungeonGetRestraint( + {tags: restraintTags}, + KDGetEffLevel() * 1.5 + KDGetOfferLevelMod(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + undefined, + Lock, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + { + allowLowPower: true + }) != undefined) + && (KinkyDungeonStatsChoice.get("Undeniable") || !KDIsBrat(enemy) || force); +} + +function KDShopTrigger(name: string): KinkyDialogueTrigger { + return { + dialogue: name, + allowedPrisonStates: ["parole", ""], + nonHostile: true, + noCombat: true, + talk: true, + excludeTags: ["noshop"], + blockDuringPlaytime: true, + prerequisite: (enemy, dist, _AIData) => { + return (dist < 1.5 + && !KinkyDungeonFlags.get("NoTalk") + && !KDGameData.NoForceGreet + && !(KDGameData.SleepTurns > 0) + && KDEnemyHasFlag(enemy, name) + && !KDEnemyHasFlag(enemy, "NoShop")); + }, + weight: (_enemy, _dist) => { + return 100; + }, + }; +} + +/** + * @param name + * @param dialogue + */ +function KDRecruitTrigger(name: string, dialogue: KinkyDialogue): KinkyDialogueTrigger { + if (dialogue) + return { + dialogue: name, + allowedPrisonStates: ["parole", "", "chase"], + requireTags: dialogue.tags, + requireTagsSingle: dialogue.singletag, + excludeTags: dialogue.excludeTags, + playRequired: true, + nonHostile: true, + noCombat: true, + blockDuringPlaytime: true, + prerequisite: (enemy, dist, _AIData) => { + return (dist < 1.5 + && !KinkyDungeonFlags.get("Recruited") + && !KinkyDungeonFlags.get("DangerFlag") + && !KinkyDungeonFlags.get(name) + && !KinkyDungeonFlags.get("NoTalk") + && KinkyDungeonCurrentDress != dialogue.outfit + && !enemy.faction + && !enemy.allied + && KDFactionRelation("Player", KDGetFactionOriginal(enemy)) > -0.1 + && KDRandom() < dialogue.chance); + }, + weight: (_enemy, _dist) => { + return 10; + }, + }; + return null; +} + +/** Boss intro dialogue */ +function KDBossTrigger(name: string, enemyName: string[]): KinkyDialogueTrigger { + return { + dialogue: name, + nonHostile: true, + prerequisite: (enemy, dist, _AIData) => { + return (dist < 2.5 + && KDGetFaction(enemy) != "Player" + && !KinkyDungeonFlags.get("NoTalk") + && !(KDGameData.SleepTurns > 0) + && enemyName.includes(enemy.Enemy.name) + && !KinkyDungeonFlags.has("BossUnlocked") + && !KinkyDungeonFlags.has("BossDialogue" + name)); + }, + weight: (_enemy, _dist) => { + return 100; + }, + }; +} +/** + * Lose to a boss + * @param name + * @param enemyName + * @param tags + * @param [condition] + */ +function KDBossLose(name: string, enemyName: string[], tags: string[], condition?: () => boolean): KinkyDialogueTrigger { + return { + dialogue: name, + prerequisite: (enemy, dist, _AIData) => { + return (dist < 1.5 + && !KinkyDungeonFlags.get("NoTalk") + && KDGetFaction(enemy) != "Player" + && !(KDGameData.SleepTurns > 0) + && enemyName.includes(enemy.Enemy.name) + && !KinkyDungeonFlags.has("BossUnlocked") + && ((!condition && !KinkyDungeonHasWill(0.1)) || (condition && condition())) + && (!tags || !KinkyDungeonGetRestraint({tags: tags}, MiniGameKinkyDungeonLevel * 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)))); + }, + weight: (_enemy, _dist) => { + return 100; + }, + }; +} + +function KinkyDungeonGetShopForEnemy(enemy: entity, guaranteed?: boolean): string { + if (enemy.Enemy.tags.noshop) return ""; + let shoplist = []; + for (let s of Object.values(KDShops)) { + let end = false; + if (s.tags) { + for (let t of s.tags) { + if (!enemy.Enemy.tags[t]) { + end = true; + break; + } + } + } + let hasTag = !s.singletag; + if (!end && s.singletag) { + for (let t of s.singletag) { + if (enemy.Enemy.tags[t]) { + hasTag = true; + break; + } + } + } + if (!hasTag) end = true; + if (!end && (guaranteed || !s.chance || KDRandom() < s.chance)) shoplist.push(s.name); + } + if (shoplist.length > 0) return shoplist[Math.floor(KDRandom() * shoplist.length)]; + return ""; +} diff --git a/Game/src/dialogue/KinkyDungeonLore.ts b/Game/src/dialogue/KinkyDungeonLore.ts new file mode 100644 index 000000000..be0fb15a1 --- /dev/null +++ b/Game/src/dialogue/KinkyDungeonLore.ts @@ -0,0 +1,667 @@ +"use strict"; + + +let KDLore: Record> = { +}; + +let KinkyDungeonCurrentLore = "Cover"; +let KDLoreImg: Record = {}; +let KDLoreEnemy: Record = {}; +let KinkyDungeonCurrentLoreTab: string = "Default"; +let KinkyDungeonCurrentLoreTabs: string[] = ["Default"]; +let KinkyDungeonCurrentLoreItems: string[] = []; +let KinkyDungeonCurrentLoreItemOffset = 0; +let KinkyDungeonCurrentLoreTabOffset = 0; +let KinkyDungeonLoreScale = 1.5; +let KinkyDungeonRepeatLoreChance = 0.4; // Chance you will find a duplicate piece of lore +let KinkyDungeonGenericLoreChance = 0.33; // Chance you will find a generic note instead of a previous note + +let KinkyDungeonNewLoreList: string[] = localStorage.getItem("kdnewLore") ? JSON.parse(localStorage.getItem("kdnewLore")) : ["Cover"]; + +function KinkyDungeonNewLore() { + let availableLore: string[] = []; + + let exploredLore: Record = localStorage.getItem("kdexpLore") ? JSON.parse(localStorage.getItem("kdexpLore")) : {Cover: 1}; + let newLore = localStorage.getItem("kdnewLore") ? JSON.parse(localStorage.getItem("kdnewLore")) : ["Cover"]; + + let altType = KDGetAltType(MiniGameKinkyDungeonLevel, KDMapData.MapMod, KDMapData.RoomType); + + let checkpoint = (altType?.loreCheckpoint || KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint); + + if (!exploredLore || Object.keys(exploredLore).length == 0) { + availableLore = []; + for (let lore of Object.keys(KDLore[checkpoint])) { + if (!KDLore[checkpoint][lore].condition || KDLore[checkpoint][lore].condition()) + availableLore.push(lore); + } + } else if (KDLore[checkpoint]) { + for (let lore of Object.keys(KDLore[checkpoint])) { + if (!KDLore[checkpoint][lore].condition || KDLore[checkpoint][lore].condition()) + availableLore.push(lore); + } + + if (Math.random() < KinkyDungeonRepeatLoreChance) { + for (let lore of Object.keys(KDLore.Default)) { + if (!KDLore.Default[lore].condition || KDLore.Default[lore].condition()) + availableLore.push(lore); + } + //availableLore = Object.keys(KDLore.Default); + }//else Object.values(KDLore).forEach((tab) => {availableLore.push(...Object.keys(tab));}); + + } + + let result = false; + + if (availableLore.length > 0) { + KinkyDungeonCurrentLore = availableLore[Math.floor(Math.random() * availableLore.length)]; + if (!exploredLore[KinkyDungeonCurrentLore]) { + + KinkyDungeonSendActionMessage(5, TextGet("ItemPickupLore"), "white", 2, false, false, undefined, "Items"); + exploredLore[KinkyDungeonCurrentLore] = 1; + newLore.push(KinkyDungeonCurrentLore); + + KinkyDungeonCurrentLoreTab = "Default"; + for (let tab of Object.keys(KDLore)) { + if (KDLore[tab][KinkyDungeonCurrentLore] && !KDLore[tab][KinkyDungeonCurrentLore].noShow) { + KinkyDungeonCurrentLoreTab = tab; + break; + } + } + } else { + KinkyDungeonSendActionMessage(4, TextGet("ItemPickupLoreOld"), "gray", 2, false, false, undefined, "Ambient"); + KinkyDungeonCurrentLore = CommonRandomItemFromList("", Object.keys(KDLore.Default)); + } + result = true; + } else { + KinkyDungeonCurrentLore = CommonRandomItemFromList("", Object.keys(KDLore.Default)); + if (!exploredLore[KinkyDungeonCurrentLore]) { + + KinkyDungeonSendActionMessage(5, TextGet("ItemPickupLore"), "white", 2, false, false, undefined, "Items"); + exploredLore[KinkyDungeonCurrentLore] = 1; + newLore.push(KinkyDungeonCurrentLore); + + KinkyDungeonCurrentLoreTab = "Default"; + for (let tab of Object.keys(KDLore)) { + if (KDLore[tab][KinkyDungeonCurrentLore] && !KDLore[tab][KinkyDungeonCurrentLore].noShow) { + KinkyDungeonCurrentLoreTab = tab; + break; + } + } + } else { + KinkyDungeonSendActionMessage(4, TextGet("ItemPickupLoreOld"), "gray", 2, false, false, undefined, "Ambient"); + KinkyDungeonCurrentLore = CommonRandomItemFromList("", Object.keys(KDLore.Default)); + } + } + + localStorage.setItem("kdexpLore", JSON.stringify(exploredLore)); + KinkyDungeonNewLoreList = newLore; + localStorage.setItem("kdnewLore", JSON.stringify(newLore)); + + KinkyDungeonUpdateTabs(exploredLore); + + return result; +} + +function KinkyDungeonUpdateTabs(exploredLore: Record) { + KinkyDungeonCurrentLoreTabs = ["Default"]; + for (let lore of Object.keys(exploredLore)) { + for (let tab of Object.keys(KDLore)) { + if (KDLore[tab][lore] && !KDLore[tab][lore].noShow) KinkyDungeonCurrentLoreTabs.push(tab); + } + } +} + +function KinkyDungeonDrawLore() { + let xOffset = -125; + + + let x = 1300; + + if (KDToggles.SpellBook) { + KDTextTan = KDTextTanSB; + KDBookText = KDBookTextSB; + KDDraw(kdcanvas, kdpixisprites, "magicbook", KinkyDungeonRootDirectory + "MagicBookNew.png", canvasOffsetX_ui - 100, canvasOffsetY_ui - 100, 640*KinkyDungeonLoreScale, 520*KinkyDungeonLoreScale); + } else { + KDTextTan = KDTextTanNew; + KDBookText = KDBookTextNew; + FillRectKD(kdcanvas, kdpixisprites, "magicbook", { + Left: canvasOffsetX_ui, + Top: canvasOffsetY_ui- 20, + Width: 550*KinkyDungeonLoreScale - 30, + Height: 400*KinkyDungeonLoreScale, + Color: "#161920", + LineWidth: 1, + zIndex: -19, + alpha: 1 + }); + DrawRectKD(kdcanvas, kdpixisprites, "magicbook2", { + Left: canvasOffsetX_ui, + Top: canvasOffsetY_ui - 20, + Width: 550*KinkyDungeonLoreScale - 30, + Height: 400*KinkyDungeonLoreScale, + Color: KDBorderColor, + LineWidth: 1, + zIndex: -19, + alpha: 0.9 + }); + } + + + + // Draw the current note + + //let wrapAmount = KDBigLanguages.includes(TranslationLanguage) ? 19 : 45; + let loreName = TextGet("KDLoreTitle" + KinkyDungeonCurrentLore); + let loreOrig = TextGet("KDLoreText" + KinkyDungeonCurrentLore).split('|'); + let lore = []; + let mult = KDGetFontMult(); + if (KDLoreEnemy[KinkyDungeonCurrentLore]) mult *= 0.74; + for (let str of loreOrig) { + lore.push(...(KinkyDungeonWordWrap(str, 26*mult, 60*mult).split('\n'))); + } + let i = 0; + DrawTextFitKD(loreName, + 0.75 * 640*KinkyDungeonLoreScale * 0.525 + + canvasOffsetX_ui - 100 + 640*KinkyDungeonLoreScale/8, canvasOffsetY_ui - 100 + 483*KinkyDungeonLoreScale/6 + i * 40, 0.75 * 640*KinkyDungeonLoreScale, KDBookText, KDTextTan, 36, "center"); + if (KDLoreImg[KinkyDungeonCurrentLore]) { + i += 0.7; + let imgwidth = 200; + let images = KDLoreImg[KinkyDungeonCurrentLore].split('|'); + for (let ii = 0; ii < images.length; ii++) { + KDDraw(kdcanvas, kdpixisprites, "kdlorimage" + ii, + KinkyDungeonRootDirectory + images[ii], + 0.75 * 640*KinkyDungeonLoreScale * (0.525) + imgwidth * ii - (imgwidth/2 * (images.length)) + + canvasOffsetX_ui - 100 + 640*KinkyDungeonLoreScale/8, canvasOffsetY_ui - 100 + 483*KinkyDungeonLoreScale/6 + i * 40, + imgwidth, imgwidth, 0, undefined, undefined, undefined, undefined, true + ); + } + } + if (KDLoreEnemy[KinkyDungeonCurrentLore] && KinkyDungeonGetEnemyByName(KDLoreEnemy[KinkyDungeonCurrentLore])) { + let enemy = KinkyDungeonGetEnemyByName(KDLoreEnemy[KinkyDungeonCurrentLore]); + let armor = (enemy.armor || 0); + let spellResist = (enemy.spellResist || 0); + let block_phys = (enemy.Resistance?.block_phys || 0); + let block_magic = (enemy.Resistance?.block_magic || 0); + let TooltipList = []; + + if (block_phys) { + let st = TextGet("KinkyDungeonTooltipBlockPhys").replace("AMOUNT", "" + Math.round(10* block_phys) + ); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: KDTextGray0, + size: 20, + }); + } + if (block_magic) { + let st = TextGet("KinkyDungeonTooltipBlockMagic").replace("AMOUNT", "" + Math.round(10* block_magic) + ); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: KDTextGray0, + size: 20, + }); + } + if (armor) { + let st = TextGet("KinkyDungeonTooltipArmor").replace("AMOUNT", "" + Math.round(10* armor) + (block_phys ? `(+${Math.round(10* block_phys)})` : "")); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: KDTextGray0, + size: 20, + }); + } + if (spellResist) { + let st = TextGet("KinkyDungeonTooltipSpellResist").replace("AMOUNT", "" + Math.round(10* spellResist) + (block_magic ? `(+${Math.round(10* block_magic)})` : "")); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: KDTextGray0, + size: 20, + }); + } + if (enemy.tags.unstoppable) { + let st = TextGet("KDunstoppable"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } else if (enemy.tags.unflinching) { + let st = TextGet("KDunflinching"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } else if (enemy.tags.relentless) { + let st = TextGet("KDrelentless"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } + if (enemy.tags?.bulwark) { + let st = TextGet("KDBulwark"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } + if (enemy.Resistance?.toughArmorAlways) { + let st = TextGet("KDAbsoluteArmor"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } else if (enemy.Resistance?.toughArmor) { + let st = TextGet("KDToughArmor"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } + + if (enemy.disarm) { + let dt = KinkyDungeonDamageTypes[enemy.dmgType]; + if (dt) { + let st = TextGet("KDTooltipDisarm").replace("DISARMCHANCE", "" + Math.round(enemy.disarm * 100)); + TooltipList.push({ + str: st, + fg: "#ffaa55", + bg: "#000000", + size: 20, + }); + } + } + + if (enemy.dmgType) { + let dt = KinkyDungeonDamageTypes[enemy.dmgType]; + if (dt) { + let st = TextGet("KinkyDungeonTooltipDealsDamage").replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + enemy.dmgType)); + TooltipList.push({ + str: st, + fg: dt.color, + bg: dt.bg, + size: 20, + }); + } + } + if (enemy.blindSight > 0) { + let st = TextGet("KDBlindsight"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } + + let map = Object.assign({}, enemy.tags); + if (enemy.spellResist) + map.magic = true; + if (enemy.Resistance?.profile) { + for (let p of enemy.Resistance?.profile) { + for (let dt of Object.keys(KDResistanceProfiles[p])) { + map[dt] = true; + } + } + } + let list = Array.from(Object.keys(map)); + let magic = false; + let repeats: Record = {}; + //for (let t of list) { + let t = list; + for (let dt of Object.values(KinkyDungeonDamageTypes)) { + if ((t.includes(dt.name + "resist") || t.includes(dt.name + "weakness") || t.includes(dt.name + "immune") || t.includes(dt.name + "severeweakness")) + || (dt.name == "magic" && t.includes("magic"))) { + let mm = 1.0; + if (t.includes(dt.name + "resist")) mm = 0.5; + else if (t.includes(dt.name + "weakness")) mm = 1.5; + else if (t.includes(dt.name + "immune")) mm = 0; + else if (t.includes(dt.name + "severeweakness")) mm = 2.0; + if (dt.name == "magic" && !magic) { + magic = true; + } + let st = TextGet("KinkyDungeonTooltipWeakness") + .replace("MULTIPLIER", "" + Math.round(mm * 100)/100) + .replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType"+ dt.name)); + let name = TextGet("KinkyDungeonDamageType"+ dt.name); + + if (!repeats.DR) { + TooltipList.push({ + str: "", + fg: "#ffffff", + bg: "#000000", + size: 10, + }); + TooltipList.push({ + str: TextGet("KDTooltipDamageResists"), + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + repeats.DR = true; + } + if (!repeats[name]) + TooltipList.push({ + str: st, + fg: dt.color, + bg: dt.bg, + size: 18, + }); + repeats[name] = true; + } + } + + let extra = 5; + let YY = canvasOffsetY_ui - 20 + 400*KinkyDungeonLoreScale; + TooltipList.forEach((listItem) => { + YY -= (extra + listItem.size); + }); + for (let listItem of TooltipList) { + DrawTextFitKD(listItem.str, + canvasOffsetX_ui - 100 + 640*KinkyDungeonLoreScale/8 + 0.575 * 640*KinkyDungeonLoreScale, + YY, + 0.22 * 640*KinkyDungeonLoreScale, + listItem.fg, listItem.bg, + listItem.size, "left", 0); + YY += extra + listItem.size; + } + } + i = KDLoreImg[KinkyDungeonCurrentLore] ? 6 : 2; + for (let N = 0; N < lore.length; N++) { + DrawTextFitKD(lore[N], + canvasOffsetX_ui - 100 + 640*KinkyDungeonLoreScale/8, canvasOffsetY_ui - 100 + 483*KinkyDungeonLoreScale/6 + i * 40, 0.75 * 640*KinkyDungeonLoreScale, KDBookText, KDTextTan, 20, "left"); i++;} + + if (KinkyDungeonNewLoreList.includes(KinkyDungeonCurrentLore)) { + KinkyDungeonNewLoreList.splice(KinkyDungeonNewLoreList.indexOf(KinkyDungeonCurrentLore), 1); + localStorage.setItem("kdnewLore", JSON.stringify(KinkyDungeonNewLoreList)); + } + + + // Draw the tabs + let tabs = Object.values(KDLore); + let tabNames = Object.keys(KDLore); + let numTabs = 20; + for (i = 0; i < numTabs; i++) { + if (i + KinkyDungeonCurrentLoreTabOffset < tabs.length) { + let newLore = false; + + for (let ll of KinkyDungeonNewLoreList) { + if ((i == -1 && KDLore.Default[ll]) || (i >= 0 && KDLore[tabNames[i + KinkyDungeonCurrentLoreTabOffset]][ll])) { + newLore = true; + break; + } + } + + if (i == -1) { + DrawButtonKDEx("loretab" + i, (_b) => { + KinkyDungeonCurrentLoreTab = "Default"; + KinkyDungeonUpdateLore(localStorage.getItem("kdexpLore") ? JSON.parse(localStorage.getItem("kdexpLore")) : {}); + return true; + }, true, x + 300, 142 + i * 42, 230, 40, TextGet("KinkyDungeonCheckpointLore-1"), + "" == KinkyDungeonCurrentLoreTab ? "#ffffff" : (newLore ? "#88ff88" : "#ffffff"), undefined, undefined, undefined, KinkyDungeonCurrentLoreTab != "", KDButtonColor); + } else { + let index = i; + DrawButtonKDEx("loretab" + i, (_b) => { + if (tabNames[index + KinkyDungeonCurrentLoreTabOffset]) { + KinkyDungeonCurrentLoreTab = tabNames[index + KinkyDungeonCurrentLoreTabOffset]; + KinkyDungeonUpdateLore(localStorage.getItem("kdexpLore") ? JSON.parse(localStorage.getItem("kdexpLore")) : {}); + } + return true; + }, true, x + 300, 142 + i * 42, 230, 40, KinkyDungeonCurrentLoreTabs.includes(tabNames[i + KinkyDungeonCurrentLoreTabOffset]) ? + TextGet("KinkyDungeonCheckpointLore" + tabNames[i + KinkyDungeonCurrentLoreTabOffset]) : + TextGet("KinkyDungeonCheckpointLoreUnknown"), + tabNames[i + KinkyDungeonCurrentLoreTabOffset] == KinkyDungeonCurrentLoreTab ? "#ffffff" : (newLore ? "#88ff88" :"#ffffff"), + undefined, undefined, undefined, tabNames[i + KinkyDungeonCurrentLoreTabOffset] != KinkyDungeonCurrentLoreTab, KDButtonColor); + } + + } else { + if (i + KinkyDungeonCurrentLoreTabOffset > tabs.length + 3) + KinkyDungeonCurrentLoreTabOffset = 0; + break; + } + + + DrawButtonKDEx("loreUp", (_b) => { + if (KinkyDungeonCurrentLoreTabOffset > 0) KinkyDungeonCurrentLoreTabOffset -= 3; + return true; + }, true, x + 370, 30, 90, 40, "", KinkyDungeonCurrentLoreTabOffset > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png"); + DrawButtonKDEx("loreDown", (_b) => { + if (numTabs + KinkyDungeonCurrentLoreTabOffset < KinkyDungeonCurrentLoreTabs.length) KinkyDungeonCurrentLoreTabOffset += 3; + return true; + }, true, x + 370, 930, 90, 40, "", numTabs + KinkyDungeonCurrentLoreTabOffset < KinkyDungeonCurrentLoreTabs.length ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png"); + } + + let numNotes = 57; + + // Draw the lore itself + DrawButtonKDEx("loreCurrentUp", (_b) => { + if (KinkyDungeonCurrentLoreItemOffset > 0) KinkyDungeonCurrentLoreItemOffset -= 3; + return true; + }, true, x + 100, 80, 90, 40, "", KinkyDungeonCurrentLoreItemOffset > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png"); + DrawButtonKDEx("loreCurrentDown", (_b) => { + if (numNotes + KinkyDungeonCurrentLoreItemOffset < KinkyDungeonCurrentLoreItems.length) KinkyDungeonCurrentLoreItemOffset += 3; + return true; + }, true, x + 100, 860, 90, 40, "", numNotes + KinkyDungeonCurrentLoreItemOffset < KinkyDungeonCurrentLoreItems.length ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png"); + for (i = 0; i < numNotes; i++) { + let ii = Math.floor(i / 2); + let xx = i % 2; + if (i + KinkyDungeonCurrentLoreItemOffset < KinkyDungeonCurrentLoreItems.length) { + let loreNum = KinkyDungeonCurrentLoreItems[i + KinkyDungeonCurrentLoreItemOffset]; + DrawButtonKDEx("loreItem" + loreNum, (_b) => { + KinkyDungeonCurrentLore = loreNum; + return true; + }, true, x + 150 * xx, 142 + (ii) * 42, 145, 40, TextGet("KDLoreLabel" + loreNum), + loreNum == KinkyDungeonCurrentLore ? "#ffffff" : (KinkyDungeonNewLoreList.includes(loreNum) ? "#88ff88": "#ffffff"), + undefined, undefined, undefined, loreNum != KinkyDungeonCurrentLore, KDButtonColor); + } else { + if (i + KinkyDungeonCurrentLoreItemOffset > KinkyDungeonCurrentLoreItems.length + 3) + KinkyDungeonCurrentLoreItemOffset = 0; + break; + } + } + + KDDrawLoreRepTabs(xOffset); +} + +function KDDrawLoreRepTabs(xOffset: number = -125) { + FillRectKD(kdcanvas, kdpixisprites, "mainlorebg", { + Left: canvasOffsetX_ui + xOffset, + Top: canvasOffsetY_ui - 150, + Width: 1965 - (canvasOffsetX_ui), + Height: 1000 - (canvasOffsetY_ui - 150), + Color: KDInvBG, + LineWidth: 1, + zIndex: -19, + alpha: 0.7 + }); + DrawRectKD(kdcanvas, kdpixisprites, "mainlorebg2", { + Left: canvasOffsetX_ui + xOffset, + Top: canvasOffsetY_ui - 150, + Width: 1965 - (canvasOffsetX_ui), + Height: 1000 - (canvasOffsetY_ui - 150), + Color: "#222222", + LineWidth: 1, + zIndex: -19, + alpha: 0.9 + }); + let scrollFunc = (amount: number) => { + switch (KinkyDungeonDrawState) { + case "Logbook": KinkyDungeonDrawState = amount < 0 ? "Quest" : "Reputation"; break; + case "Reputation": KinkyDungeonDrawState = amount < 0 ? "Logbook" : "Quest"; break; + case "Quest": KinkyDungeonDrawState = amount < 0 ? "Reputation" : "JourneyMap"; break; + case "JourneyMap": KinkyDungeonDrawState = amount < 0 ? "Quest" : "Logbook"; break; + //case "Collection": KinkyDungeonDrawState = amount < 0 ? "Reputation" : "Facilities"; break; + //case "Facilities": KinkyDungeonDrawState = amount < 0 ? "Collection" : "Logbook"; break; + } + }; + let xxstart = 530; + let yy = 40; + let num = 4; + let width = 1100 / num; + let II = 0; + DrawButtonKDExScroll("TabLore", scrollFunc, (_b) => { + KinkyDungeonDrawState = "Logbook"; + return true; + }, true, xxstart + II*width, yy, width - 10, 40, TextGet("KinkyDungeonLog"), "#ffffff", undefined, undefined, undefined, + KinkyDungeonDrawState != "Logbook", KDButtonColor); II++; + DrawButtonKDExScroll("TabRep", scrollFunc, (_b) => { + KinkyDungeonDrawState = "Reputation"; + return true; + }, true, xxstart + II*width, yy, width - 10, 40, TextGet("KinkyDungeonReputation"), "#ffffff", undefined, undefined, undefined, + KinkyDungeonDrawState != "Reputation", KDButtonColor); II++; + DrawButtonKDExScroll("TabQuest", scrollFunc, (_b) => { + KinkyDungeonDrawState = "Quest"; + return true; + }, true, xxstart + II*width, yy, width - 10, 40, TextGet("KinkyDungeonQuest"), "#ffffff", undefined, undefined, undefined, + KinkyDungeonDrawState != "Quest", KDButtonColor); II++; + DrawButtonKDExScroll("TabJourneyMap", scrollFunc, (_b) => { + KinkyDungeonDrawState = "JourneyMap"; + return true; + }, true, xxstart + II*width, yy, width - 10, 40, TextGet("KinkyDungeonJourneyMap"), "#ffffff", undefined, undefined, undefined, + KinkyDungeonDrawState != "JourneyMap", KDButtonColor); II++; + /*DrawButtonKDExScroll("TabCollection", scrollFunc, (b) => { + KinkyDungeonDrawState = "Collection"; + return true; + }, true, xxstart + II*width, yy, width - 10, 40, TextGet("KinkyDungeonCollection"), "#ffffff", undefined, undefined, undefined, + KinkyDungeonDrawState != "Collection", KDButtonColor); II++; + DrawButtonKDExScroll("TabFacilities", scrollFunc, (b) => { + KinkyDungeonDrawState = "Facilities"; + return true; + }, true, xxstart + II*width, yy, width - 10, 40, TextGet("KinkyDungeonFacilities"), "#ffffff", undefined, undefined, undefined, + KinkyDungeonDrawState != "Facilities", KDButtonColor); II++; +*/ + +} + +let KDInvBG = "#222222"; + + +function KDDrawInventoryTabs(xOffset: number, drawBG: boolean = true): void { + if (drawBG) { + FillRectKD(kdcanvas, kdpixisprites, "mainlorebg", { + Left: canvasOffsetX_ui + xOffset, + Top: canvasOffsetY_ui - 150, + Width: 1965 - (canvasOffsetX_ui), + Height: 1000 - (canvasOffsetY_ui - 150), + Color: KDInvBG, + LineWidth: 1, + zIndex: -19, + alpha: 0.7 + }); + DrawRectKD(kdcanvas, kdpixisprites, "mainlorebg2", { + Left: canvasOffsetX_ui + xOffset, + Top: canvasOffsetY_ui - 150, + Width: 1965 - (canvasOffsetX_ui), + Height: 1000 - (canvasOffsetY_ui - 150), + Color: "#000000", + LineWidth: 1, + zIndex: -19, + alpha: 0.9 + }); + } + let scrollFunc = (amount: number) => { + switch (KinkyDungeonDrawState) { + case "Inventory": KinkyDungeonDrawState = amount < 0 ? "Facilities" : "Collection"; break; + case "Collection": KinkyDungeonDrawState = amount < 0 ? "Inventory" : "Facilities"; break; + case "Facilities": KinkyDungeonDrawState = amount < 0 ? "Collection" : "Inventory"; break; + } + }; + let xxstart = 530; + let yy = 40; + let num = 4; + let width = 1100 / num; + let II = 0; + DrawButtonKDExScroll("TabLore", scrollFunc, (_b) => { + KinkyDungeonDrawState = "Inventory"; + return true; + }, true, xxstart + II*width, yy, width - 10, 40, TextGet("KinkyDungeonInventory"), "#ffffff", undefined, undefined, undefined, + KinkyDungeonDrawState != "Inventory", KDButtonColor); II++; + DrawButtonKDExScroll("TabCollection", scrollFunc, (_b) => { + KinkyDungeonDrawState = "Collection"; + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KDCollectionTab = ""; + KDCurrentFacilityTarget = ""; + KDFacilityCollectionCallback = null; + return true; + }, true, xxstart + II*width, yy, width - 10, 40, TextGet("KinkyDungeonCollection"), "#ffffff", undefined, undefined, undefined, + KinkyDungeonDrawState != "Collection", KDButtonColor); II++; + DrawButtonKDExScroll("TabFacilities", scrollFunc, (b) => { + KinkyDungeonDrawState = "Facilities"; + return true; + }, true, xxstart + II*width, yy, width - 10, 40, TextGet("KinkyDungeonFacilities"), "#ffffff", undefined, undefined, undefined, + KinkyDungeonDrawState != "Facilities", KDButtonColor); II++; + + +} + + + +/** + * @param exploredLore + */ +function KinkyDungeonUpdateLore(exploredLore: Record) { + KinkyDungeonCurrentLoreItems = []; + if (!KinkyDungeonCurrentLoreTab) KinkyDungeonCurrentLoreTab = "Default"; + if (KDLore[KinkyDungeonCurrentLoreTab]) + for (let lore of Object.entries(KDLore[KinkyDungeonCurrentLoreTab])) { + if (!lore[1].noShow && exploredLore[lore[0]]) { + KinkyDungeonCurrentLoreItems.push(lore[0]); + } + } +} + +function KinkyDungeonHandleLore() { + return true; +} + +/** + * @param tabs + * @param id + * @param label + * @param title + * @param text + * @param [condition] + * @param [image] + * @param [noShow] + * @param [enemy] + */ +function KDNewLore(tabs: string | string[], id: string, label: string, title: string, text: string, condition?: () => boolean, image?: string, noShow?: string[], enemy?: string) { + addTextKey("KDLoreText" + id, text); + addTextKey("KDLoreTitle" + id, title); + addTextKey("KDLoreLabel" + id, label); + + if (image) { + KDLoreImg[id] = image; + } + if (enemy) { + KDLoreEnemy[id] = enemy; + } + + tabs = (typeof tabs === "string") ? [tabs] : tabs; + + for (let tab of tabs) { + if (!KDLore[tab]) { + KDLore[tab] = {}; + } + + KDLore[tab][id] = { + condition: condition, + noShow: !noShow ? undefined : noShow.includes(tab) + }; + } +} diff --git a/Game/src/dialogue/KinkyDungeonLoreList.ts b/Game/src/dialogue/KinkyDungeonLoreList.ts new file mode 100644 index 000000000..44343fbc1 --- /dev/null +++ b/Game/src/dialogue/KinkyDungeonLoreList.ts @@ -0,0 +1,244 @@ +"use strict"; + + +KDNewLore("Default", "Cover", "Cover", + "Your Journal", + "Here you will find various scraps of documents and lore you've recovered throughout your adventures.", + undefined, undefined, +); +KDNewLore(["Default", 'grv'], "Cath0", "Willows 0", + "Catherine Willows' Journal (preface)", + "I am writing this journal in the off chance that I do not come return from the Agarthan ruins. If you find this, please make an effort to deliver it back to the surface for the good of all the women lured in by its secrets.", + undefined, undefined, ['grv'], +); +KDNewLore(['grv'], "CathGrv1", "Willows 7", + "Catherine Willows' Journal (pg. 7)", + "As I scaled the mountain, I came across a massive graveyard above the treeline, a grand memorial to those who died before the Great Work. This graveyard extends into the mouth of the cave, and the guards told me not to deface any of the graves, or else the ghosts will come and get me. It would be easier to follow their instructions if there weren't so much treasure still hidden here! After all, most of us are deep in the red after sailing all this way.", + undefined, undefined, ['Default'], +); +KDNewLore(['grv'], "CathGrv2", "Willows 8", + "Catherine Willows' Journal (pg. 8)", + "It's hard to imagine I'm in a cave. Everything is so decorated and well-preserved, it's almost as if decades of adventurers never found their way to this island. In the distant future when every last piece of treasure has been hauled out of here, I imagine they'll set this place up as a tourist attraction.", + undefined, undefined, ['Default'], +); +KDNewLore(["Default", 'grv'], "CathGrv3", "Willows 14", + "Catherine Willows' Journal (pg. 14)", + "I spoke with a few locals while resupplying at the port. Apparently the village up here is far older than the twenty-some years the Adventurer's Guild has been on the island. The locals call the mountain 'Ejahl,' but the consensus is that this is the site of the legendary city Agartha where the Archmagus herself made her discovery.|(The page is dated about fifty years ago)", + undefined, undefined, ['Default'], +); +KDNewLore(['grv', 'cat'], "CathCat1", "Willows 17", + "Catherine Willows' Journal (pg. 17)", + "I made it to a deeper floor today, and was greeted by a skeleton trying to tie me up. Great.|I've looked into the local name for this mountain, 'Ejahl,' and found a footnote in the history books talking about some petty kingdom that laid siege to Agartha. There's no record of them actually winning the siege, though. I've heard there's a massive library somewhere down here, maybe I'll find answers there.", + undefined, undefined, ['Default', 'grv'], +); +KDNewLore(['cat'], "CathCat2", "Willows 19", + "Catherine Willows' Journal (pg. 19)", + "I ran into an embarrassed looking blue-haired mage. I caught a glimpse of her undergarments under her cloak. She used a powerful charged attack against me, but I was able to use their homing properties to my advantage and hit her with her own spell.||...was she really wearing no clothes under there?", + undefined, undefined, ['Default'], +); +KDNewLore(['cat'], "CathCat2", "Willows 20", + "Catherine Willows' Journal (pg. 20)", + "There was a warrior in the catacombs today. She appears to have mastered the art of witty comebacks, as I truly could not come up with anything to say that did not further humiliate myself. Fortunately her insults came at her companions' expense, and they allowed me to defeat her in a solitary duel.", + undefined, undefined, ['Default'], +); +KDNewLore(['cat'], "CathCat3", "Willows 21", + "Catherine Willows' Journal (pg. 21)", + "I almost found myself the recipient of a powerful binding arrow enchanted with force runes. Had I been hit, I would have been knocked back against the walls with my arms pinned by glowing conjured cuffs. Fortunately, this projectile hit a skeleton that was attacking me instead, and I was able to retreat.", + undefined, undefined, ['Default'], +); + +KDNewLore(['grv', 'tmb'], "CathTmb", "Willows 24", + "Catherine Willows' Journal (pg. 24)", + "In my travels I encountered a curious tomb filled with the scent of incense and herbs. Strange statues lined the halls on stone pedestals, standing as an intimidating reminder of what happens to those who disturb the locals...|I encountered resistance from the locals, who seemed to regard outsiders as 'cursed' and sought to capture me in an effort to give me a 'blessing.' I highly doubt that anyone has been truly blessed by their efforts, well-intentioned or not.", + undefined, undefined, ['Default', 'grv'], +); +KDNewLore(['tmb'], "CathTmb2", "Willows 25", + "Catherine Willows' Journal (pg. 25)", + "This 'blessing' of theirs appears to be an old ritual for immortality. I believe these peoples are older than the Great Work, based on the ancient dialect they speak and the outdated script they use.|Whatever the case may be, their method seems inexact and prone to failure, as demonstrated by their near maniacal devotion to 'bless' every adventurer they come across.", + undefined, undefined, ['Default'], +); +KDNewLore(['tmb'], "CathTmb3", "Willows 26", + "Catherine Willows' Journal (pg. 26)", + "There are two 'castes' in the Bast cult. The first are the 'blessed,' and the second are their watchful guardians. The unintuitive bit is that the 'blessed' are the ones wrapped up and sealed away inside statues, sarcophagi, and anything else the guardians can stick a person into. The free ones wandering around grabbing people? They're the ones who weren't 'blessed' apparently.", + undefined, undefined, ['Default'], +); + +KDNewLore(['cat', 'lib'], "CathLib1", "Willows 30", + "Catherine Willows' Journal (pg. 30)", + "I've found it! The Archmagus' library! Much to my chagrin, however, the place has been ransacked by witches and a curious group of mages in search of inspiration from ancient fashion choices.", + undefined, undefined, ['Default', 'cat'], +); +KDNewLore(['lib'], "CathLib2", "Willows 31", + "Catherine Willows' Journal (pg. 31)", + "It appears someone got to the Archmagus' writings before I could. Nonetheless, I will continue my search for Vinlaga's personal study. Perhaps her research materials and drafts might shed some light on my condition.", + undefined, undefined, ['Default'], +); +KDNewLore(["Default", 'lib'], "CathLib3", "Willows 33", + "Catherine Willows' Journal (pg. 36)", + "I have learned of an ancient artifact, called the Mistress' Staff. Its history and owner are hotly debated, with some attributing it to the Archmagus herself, while others say it was developed by the magical warlords that followed. Most all sources agree that its signature feature is the ability to reverse the effects of the Great Work on any person.", + () => {return MiniGameKinkyDungeonLevel > 4;}, undefined, ['Default'], +); +KDNewLore(['lib'], "CathLib4", "Willows 41", + "Catherine Willows' Journal (pg. 41)", + "There is a treasure trove of ancient history here that the blasted Dressmakers had no use for. I found a map from the 'Kingdom of Ejahl,' with sketches of many islands including this one. Like most of the warlord states, they failed to make a lasting impact on the architecture of the island, but it appears the island was uninhabited for some time between the fall of Agartha and its resettlement by Ejahl.", + undefined, undefined, +); +KDNewLore(["Default", 'lib'], "CathLib5", "Willows 37", + "Catherine Willows' Journal (pg. 47)", + "...I must find it.|They are looking for it.|They CANNOT be allowed to have it.", + () => {return MiniGameKinkyDungeonLevel > 4;}, undefined, ['Default'], +); + +KDNewLore(['jng', 'cry'], "CathJng1", "Willows 50", + "Catherine Willows' Journal (pg. 50)", + "I saw my reflection in a pool of water today. My hair looked much more silver than I remember it. I hope this isn't a side effect of all the magic I'd used to make it to this point.", + undefined, undefined, ['Default', 'cry'], +); +KDNewLore(['jng'], "CathJng2", "Willows 51", + "Catherine Willows' Journal (pg. 51)", + "I heard the bandits are looking for the Mistress' Staff. I'm not too worried--they wouldn't know what to do with it. It's that damned witch I'm worried about.|If my astute reader has come this far, you should beware the Silver Witch. She is working with forces that cannot be trusted.", + undefined, undefined, ['Default'], +); +KDNewLore(['jng', 'cry', 'lib'], "SW10", "Silver 10", + "Silver Witch's Notes #10", + "It seems I am not alone in my search for the Staff. To whom it may concern: the Great Work is a lie, and it will doom us all. If you care for your soul, you need to break the cycle, and for that we need a key: the Mistress' Staff.", + undefined, undefined, ['Default', 'jng', 'cry'], +); +KDNewLore(['jng', 'cry', 'lib'], "SW2", "Silver 2", + "Silver Witch's Notes #2", + "I met an adventurer who managed to erase weeks of golem research in the blink of an eye. This is why we Summoners have to scatter our works far and wide... if only they knew what we are working towards.", + undefined, undefined, ['Default', 'jng', 'cry'], +); +KDNewLore(['jng', 'cry', 'ore'], "SW3", "Silver 3", + "Silver Witch's Notes #3", + "The dimensional rift is especially active today. I spoke with some of the voices the other night, they offered me immortality in exchange for material wealth. They must have called the wrong universe or something...", + undefined, undefined, ['Default', 'jng', 'cry'], +); +KDNewLore(['ore'], "SW18", "Silver 18", + "Silver Witch's Notes #18", + "My new golem project did not go as expected. I'd expected the primordial one to answer once I'd opened the gate, but there was nothing but a horde of star demons which I quickly dispatched. Could this mean the source of primordial latex is not outside this universe, as I had thought, but inside? I must investigate further.", + undefined, undefined, +); +KDNewLore(['tmp'], "SW15", "Silver 15", + "Silver Witch's Notes #15", + "She did it again. Barged in on my work and called me a 'purveyor of evil magics,' whatever that means. Magic isn't evil, it was given to us directly by the gods! At least I hid my new golem in a different study of mine...", + undefined, undefined, +); +KDNewLore(['tmp'], "SW4", "Silver 4", + "Silver Witch's Notes on the Primordial One", + "Throughout my studies I have chased after the existence of a being I call 'the Primordial One.' My theories stem from the following observations:|1)Slimes were not present in ancient history, and appeared during my lifetime as a force of nature.|2)Slime can be transmuted into almost any known material, like a Prima Materia of sorts.|3) A fragment of Sariel's notes, one of my most guarded possessions, discusses the existence of slimes long before they were first observed in the world.|Based on this, I believe the world must have been created through the influence of some primordial being who then left, but must be returning somehow.|I'm sure this being holds the key to repairing our bodies.", + undefined, undefined, +); +KDNewLore(['tmp'], "SW7", "Silver 7", + "Silver Witch's Notes #7", + "Blast. An adventurer stole one of my notebooks, and now I'm encountering various cultists and weirdos trying to summon the Primordial One themselves. This is why I never bother to publish my works...", + undefined, undefined, +); + + + + +KDNewLore(['tmp'], "SW106", "Silver 106", + "Silver Witch's Notes #106", + "I haven't heard of that adventurer in decades. Perhaps her nosiness finally caught up to her?", + undefined, undefined, +); + +KDNewLore(['tmp'], "SW117", "Silver 117", + "Silver Witch's Notes #117", + "There is a new presence in the mountain. An opportunist that calls herself 'the Dollmaker.' Claims to be the lost heir to the Kingdom of Ejahl. Please~.|I've seen those hackjobs and reprogrammed wrecks. If there even was a Kingdom of Ejahl, surely their army would consist of more than just scrapped combat drones?", + undefined, undefined, +); + +KDNewLore(["Ejahl", 'tmp'], "EJ1", "Ejahl 1", + "The Chronicles of Ejahl", + "The Kingdom of Ejahl appeared in Agartha 170 years after the death of Sariel Vinlaga. It had three* rulers who vied for the throne at different times:|Diana, Princess of Machinery|Emer, the Warsage|And the Dollmaker, High General of the Kingdom||*Some manuscripts read 'two'", + undefined, undefined, ['tmp'] +); + +KDNewLore(["Ejahl", 'tmp'], "EJ2", "Ejahl 2", + "The Fall of Ejahl", + "The Kingdom of Ejahl ruled the island of Agartha for 30 years before its collapse. During the last war, an unknown figure captured the majority of its army and the majority of the population fled by boat. No one was left on the island.", + undefined, undefined, ['tmp'] +); + +KDNewLore(["Enemy", 'grv'], "en.BlindZombie", "Zombie", + "Zombie", + "Danger Level: Nearly Harmless|A reanimated corpse from before the Great Work. I can't tell if the original soul still inhabits the body, since it can barely speak let alone explain its identity.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/BlindZombie.png|EnemiesBound/Zombie.png", ['grv'], "BlindZombie" +); +KDNewLore(["Enemy", 'grv'], "en.FastZombie", "Fast Z.", + "Angry Zombie", + "Danger Level: Normal|These zombies are more motivated than the others. Their behavior is similar to that of vengeful spirits I've encountered in the depths.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/FastZombie.png|EnemiesBound/FastZombie.png", ['grv'], "FastZombie" +); + +KDNewLore(["Enemy", 'grv'], "en.MageZombie", "Mage Z.", + "Mage Zombie", + "Danger Level: Normal|A zombie that can use magic. It doesn't look like any magic I've seen outside the ruins, which makes me think that it was taught to use magic. Some of them have tattoos associated with magic in the old times. Since magic comes from the soul, I assume there is some hint of the original soul still present.|-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/MageZombie.png|EnemiesBound/MageZombie.png", ['grv'], "MageZombie" +); +KDNewLore(["Enemy", 'grv'], "en.SamuraiZombie", "Warrior Z.", + "Warrior Zombie", + "Danger Level: High|A zombie with impeccable sword technique. I've never seen an undead handle a sword so smoothly. Probably buried with their weapons and gear, since most of it is aged. Even their binding techniques resemble those in the textbooks rather than modern ropework.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/SamuraiZombie.png|EnemiesBound/SamuraiZombie.png", ['grv'], "SamuraiZombie" +); +KDNewLore(["Enemy", 'grv'], "en.TalismanZombie", "Talisman Z.", + "Talisman Zombie", + "Danger Level: High|A zombie that uses sealing charms and healing magic. Irony aside, I've seen these with rope marks and gag strap marks on their skin and face. It seems like someone is playing with them. Who could that be?||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/TalismanZombie.png|EnemiesBound/TalismanZombie.png", ['grv'], "FastZombie" +); +KDNewLore(["Enemy", 'grv'], "en.Ghost", "Ghost", + "Ghost", + "Danger Level: Annoying|A playful spirit residing in the dungeon, taking advantage of any adventurers they come across. They can pass through walls, and most physical weapons go right through them. Using a magical weapon seems to banish them for some time, at least.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/Ghost.png", ['grv'], "Ghost" +); +KDNewLore(["Enemy", 'grv'], "en.Poltergeist", "Poltergeist", + "Poltergeist", + "Danger Level: Very Annoying|It is said that ghosts are the spirits of pre-Great Work humans whose souls are bound to this world by unfinished dreams and ambitions. But I don't believe a word of that. These little guys care about nothing except humiliating people. Ask me how I know.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/Poltergeist.png|Enemies/GagGeist.png", ['grv'], "Poltergeist" +); +KDNewLore(["Enemy", 'cat'], "en.TickleTerror", "Tickle Terror", + "Tickle Terror", + "Danger Level: Medium|A very playful ghost with a penchant for teasing. It even carries spectral restraints of its own for use in 'games,' which tend to consist of tickling tied up girls.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/TickleTerror.png", ['cat'], "TickleTerror" +); +KDNewLore(["Enemy", 'cat'], "en.GreedyGhast", "Greedy Ghast", + "Greedy Ghast", + "Danger Level: Low|The feelings of a person who desired wealth in life. While it is unable to claim any physical wealth for itself, it nonetheless will rummage through your pockets and possessions if it gets a chance.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/GreedyGhast.png", ['cat'], "GreedyGhast" +); +KDNewLore(["Enemy", 'cat'], "en.HugHorror", "Hug Horror", + "Hug Horror", + "Danger Level: High|A constricting mass of negative thoughts. According to local myths, the other ghosts attempt to cheer this one up by hugging it, but its wails end up attracting them to your position. Be prepared to take it down lest you find yourself a plaything for the beyond.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/HugHorror.png", ['cat'], "HugHorror" +); + + +KDNewLore(["Enemy", 'lib'], "en.Witches", "Witches", + "The Witches' Coven", + "Danger Level: High|While most wizards spend literal centuries mastering the art of magic, there are those lacking the patience or discipline to study magic the old fashioned way. Driven by a need for power, these individuals make contracts with otherworldly beings and become Witches.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/WitchFlame.png|Enemies/WitchWater.png|Enemies/WitchEarth.png|Enemies/WitchShock.png|Enemies/WitchIce.png|Enemies/WitchSlime.png|Enemies/WitchRope.png|Enemies/WitchChain.png", ['lib'], "WitchFlame" +); + + +KDNewLore(["Enemy", 'lib'], "en.Conjure", "Conjurer", + "Master Conjurer", + "Danger Level: Extreme|A witch gifted in the arts of conjuration. Backed by an army of animated spectral hands and devious tomes, this variety of witch is extremely dangerous. Her close range attacks are slow and unwieldy, but take care not to get surrounded.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/Frog.png|Enemies/ConjurerTickler.png|EnemiesBound/ConjurerTickler.png|EnemiesBound/Conjurer.png|Enemies/TickleHand.png|Enemies/Book.png", ['lib'], "HugHorror" +); + + +KDNewLore(["Enemy", 'tmb'], "en.mummy", "Mummy", + "Bast Mummy", + "Danger Level: High|They appear to be influential figures in the ancient Bast cult. Not only are they able to wield explosive magics, they can conjure magical wrappings at close range.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/Mummy.png|EnemiesBound/Mummy.png", ['tmb'], "Mummy" +); +KDNewLore(["Enemy", 'tmb'], "en.meleecleric", "Mummy", + "Bast Clerics", + "Danger Level: Medium|Worshippers of the Cat Goddess. Devoted to the sole task of defending the tombs from outsiders, they are rarely willing to negotiate. Some maintain peak physical prowess, while others can even cast spells.||-Denizens of the Dungeon by Catherine Willows", + undefined, "Enemies/MeleeCleric.png|EnemiesBound/Cleric.png|Enemies/MeleeCleric.png|EnemiesBound/Cleric.png", ['tmb'], "Cleric" +); + + +KinkyDungeonUpdateTabs(localStorage.getItem("kdexpLore") ? JSON.parse(localStorage.getItem("kdexpLore")) : {Cover: 1}); diff --git a/Game/src/effect/KinkyDungeonBuffs.ts b/Game/src/effect/KinkyDungeonBuffs.ts new file mode 100644 index 000000000..c2d74ef3c --- /dev/null +++ b/Game/src/effect/KinkyDungeonBuffs.ts @@ -0,0 +1,434 @@ +"use strict"; + +function KinkyDungeonSendBuffEvent(Event: string, data: any) { + if (!KDMapHasEvent(KDEventMapBuff, Event)) return; + for (let buff of Object.values(KinkyDungeonPlayerBuffs)) { + if (buff && buff.events) { + for (let e of buff.events) { + if (e.trigger == Event) { + KinkyDungeonHandleBuffEvent(Event, e, buff, KinkyDungeonPlayerEntity, data); + } + } + } + } + + for (let ent of KDMapData.Entities) { + if (ent.buffs) { + for (let buff of Object.values(ent.buffs)) { + if (buff && buff.events) { + for (let e of buff.events) { + if (e.trigger == Event) { + KinkyDungeonHandleBuffEvent(Event, e, buff, ent, data); + } + } + } + } + } + } +} + +/** + * Decreases time left in buffs and also applies effects + * @param entity + * @param delta + * @param endFloor + */ +function KinkyDungeonTickBuffs(entity: entity, delta: number, endFloor: boolean): void { + let list = null; + if (entity == KinkyDungeonPlayerEntity) + list = KinkyDungeonPlayerBuffs; + else if (entity.buffs) list = entity.buffs; + for (const [key, v] of Object.entries(list)) { + const value: any = v; + if (value) { + if (value.endFloor && endFloor) KinkyDungeonExpireBuff(entity, key); + else if (value.endSleep && KDGameData.SleepTurns > 1) KinkyDungeonExpireBuff(entity, key); + else if (!value.duration || value.duration < 0) KinkyDungeonExpireBuff(entity, key); + else { + if (value.type == "restore_mp") KDChangeMana(value.id, "buff", "tick", value.power); + else if (value.type == "restore_wp") KDChangeWill(value.id, "buff", "tick", value.power); + else if (value.type == "restore_sp") KDChangeStamina(value.id, "buff", "tick", value.power); + else if (value.type == "restore_ap") KDChangeDistraction(value.id, "buff", "tick", value.power, true); + + else if (value.type == "SpellCastConstant" && value.spell && entity) { + KinkyDungeonCastSpell(entity.x, entity.y, KinkyDungeonFindSpell(value.spell, true), undefined, undefined, undefined); + } + + else if (value.type == "Flag") { + KinkyDungeonSetFlag(value.id, 1 + delta); + } + else if (KDCustomBuff[value.type]) { + KDCustomBuff[value.type](entity, value); + } + + + if (!(value.infinite)) + value.duration -= delta; + } + } + } +} + +/** + * @param entity + * @param tag + * @param Amount + */ +function KinkyDungeonTickBuffTag(entity: entity, tag: string, Amount: number = 1): void { + let list = null; + if (entity == KinkyDungeonPlayerEntity) + list = KinkyDungeonPlayerBuffs; + else if (entity.buffs) list = entity.buffs; + if (list) + for (const [key, v] of Object.entries(list)) { + const value: any = v; + if (value) { + if (value.maxCount && value.tags?.includes(tag)) { + if (!value.currentCount) value.currentCount = 0; + value.currentCount += Amount; + if (value.currentCount >= value.maxCount) KinkyDungeonExpireBuff(entity, key); + KDUpdateBuffStatMemo(list, value.type); + } + } + } +} + +/** + * @param entity + * @param tag + */ +function KDEntityHasBuffTags(entity: entity, tag: string): boolean { + let list = entity.player ? KinkyDungeonPlayerBuffs : entity.buffs; + if (list) { + for (const buff of Object.values(list)) { + if (buff) { + if (buff.tags && buff.tags.includes(tag)) return true; + } + } + } + return false; +} + +/** + * @param entity + * @param tag + * @returns {Record} + */ +function KDGetBuffsWithTag(entity: entity, tag: string): Record { + let ret = {}; + let list = entity.player ? KinkyDungeonPlayerBuffs : entity.buffs; + if (list) { + for (const [key, buff] of Object.entries(list)) { + if (buff) { + if (buff.tags && buff.tags.includes(tag)) ret[key] = buff; + } + } + } + return ret; +} + +/** + * @param entity + * @param tags + */ +function KinkyDungeonRemoveBuffsWithTag(entity: entity, tags: string[]) { + let list = null; + if (entity && entity.player) { + list = KinkyDungeonPlayerBuffs; + } else if (entity?.buffs) list = entity.buffs; + if (list) + for (const [key, v] of Object.entries(list)) { + const value: any = v; + if (value) { + for (let t of tags) + if (value.tags && value.tags.includes(t)) { + KinkyDungeonExpireBuff(entity, key); + } + } + } +} + +// Updates buffs for all creatures +function KinkyDungeonUpdateBuffs(delta: number, endFloor: boolean) { + if (delta > 0) { + KDBuffedStatTypeMemo = new Map(); + KDBuffedStatTypeMemoUpdate = new Map(); + } + // Tick down buffs the buffs + KinkyDungeonSendEvent("tickBuffs", {delta: delta}); + KinkyDungeonTickBuffs(KinkyDungeonPlayerEntity, delta, endFloor); + for (let enemy of KDMapData.Entities) { + if (!enemy.buffs) enemy.buffs = {}; + KinkyDungeonTickBuffs(enemy, delta, endFloor); + } + + // Apply the buffs from bullets + for (let b of KDMapData.Bullets) { + if (b.bullet.spell && b.bullet.spell.buffs) { // Apply the buff + for (let buff of b.bullet.spell.buffs) { + + if (buff.player && buff.range >= Math.sqrt((KinkyDungeonPlayerEntity.x - b.x) * (KinkyDungeonPlayerEntity.x - b.x) + (KinkyDungeonPlayerEntity.y - b.y) * (KinkyDungeonPlayerEntity.y - b.y))) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff); + } + if (buff.enemies) { + let nearby = KDNearbyEnemies(b.x, b.y, buff.range); + for (let enemy of nearby) { + if ((KDHostile(enemy) || !buff.noAlly) + && (KDAllied(enemy) || !buff.onlyAlly) + && (!b.bullet.spell.filterTags || b.bullet.spell.filterTags.some((tag: string) => {return enemy.Enemy.tags[tag];})) + //&& buff.range >= Math.sqrt((enemy.x - b.x) * (enemy.x - b.x) + (enemy.y - b.y) * (enemy.y - b.y)) + ) { + KinkyDungeonApplyBuffToEntity(enemy, buff); + } + } + + } + } + } + } + + KDUpdatePlayerShield(); +} + +function KDUpdatePlayerShield(PlayerBuffs?: any): void { + if (!PlayerBuffs) PlayerBuffs = KinkyDungeonPlayerBuffs; + let buffs = Object.values(PlayerBuffs);//Object.values(KinkyDungeonPlayerBuffs).sort((a, b) => {return (a.power || 0) - (b.power || 0);}); + KDGameData.Shield = 0; + + for (const bb of buffs) { + const b: any = bb; + if (b.type == "Shield" && b.power > 0) + KDGameData.Shield += b.power; + } +} + + +function KDDamagePlayerShield(Amount: number, Player: entity) { + if (!Player) Player = KinkyDungeonPlayerEntity; + let PlayerBuffs = KinkyDungeonPlayerBuffs; + let buffs = Object.values(PlayerBuffs).filter((b) => {return b.type == "Shield";}).sort((a, b) => {return (a.power || 0) - (b.power || 0);}); + + KDGameData.ShieldDamage = (KDGameData.ShieldDamage || 0) + Amount; + + for (let b of buffs) { + if (b.type == "Shield" && b.power > 0) { + b.power -= Amount; + if (b.power < 0) { + Amount = -b.power; + b.power = 0; + } + } + } + + KDUpdatePlayerShield(PlayerBuffs); +} + +function KDBuffEnabled(list: Record, buff: any, onlyPositiveDuration: boolean) { + return (!onlyPositiveDuration || buff.duration > 0) + && (!buff.disabletypes || !buff.disabletypes.some((tag: string) => { + return list[tag] != undefined; + })); +} + +let KDBuffedStatTypeMemo: Map, Record> = new Map(); +let KDBuffedStatTypeMemoUpdate: Map, string[]> = new Map(); + +function KDUpdateBuffedStatTypeMemo(list: Record) { + let obj = KDBuffedStatTypeMemo.get(list) || {}; + let updateList = KDBuffedStatTypeMemoUpdate.get(list); + if (!KDBuffedStatTypeMemo.get(list) || !updateList) { + obj = {}; + KDBuffedStatTypeMemo.set(list, obj); + for (let buff of Object.values(list)) { + if (buff) { + if (!obj[buff.type]) obj[buff.type] = []; + obj[buff.type].push(buff); + } + } + } else { + for (let stat of updateList) { + obj[stat] = [] + for (let buff of Object.values(list)) { + if (buff && buff.type == stat) { + obj[stat].push(buff); + } + } + } + } + + KDBuffedStatTypeMemoUpdate.delete(list); +} + +function KinkyDungeonGetBuffedStat(list: Record, Stat: string, onlyPositiveDuration?: boolean): number { + let stat = 0; + if (list) { + if (KDBuffedStatTypeMemoUpdate.get(list)?.length > 0 + || !KDBuffedStatTypeMemo.get(list)) { + KDUpdateBuffedStatTypeMemo(list); + } + if (KDBuffedStatTypeMemo.get(list)) { + if (KDBuffedStatTypeMemo.get(list) && KDBuffedStatTypeMemo.get(list)[Stat]) + for (let buff of KDBuffedStatTypeMemo.get(list)[Stat]) { + if (buff && buff.type == Stat + && KDBuffEnabled(list, buff, onlyPositiveDuration)) { + stat += buff.power; + } + } + } else { + for (let buff of Object.values(list)) { + if (buff && buff.type == Stat + && KDBuffEnabled(list, buff, onlyPositiveDuration)) { + stat += buff.power; + } + } + } + + } + return stat; +} +function KinkyDungeonGetMaxBuffedStat(list: Record, Stat: any, onlyPositiveDuration: boolean): number { + let stat = 0; + if (list) + for (let buff of Object.values(list)) { + if (buff && buff.type == Stat && KDBuffEnabled(list, buff, onlyPositiveDuration)) { + stat = Math.max(stat, buff.power); + } + } + return stat; +} + +/** + * @param entity + * @param key + */ +function KinkyDungeonExpireBuff(entity: entity, key: string): void { + let list = null; + if (entity == KinkyDungeonPlayerEntity) + list = KinkyDungeonPlayerBuffs; + else if (entity.buffs) list = entity.buffs; + if (list && list[key]) { + let data = { + entity: entity, + buff: list[key], + }; + let tt = list[key].type; + KinkyDungeonSendEvent("expireBuff", data); + KDUpdateBuffStatMemo(list, tt); + delete list[key]; + } +} + +function KDUpdateBuffStatMemo(list: Record, stat: string) { + if (!KDBuffedStatTypeMemoUpdate.get(list)) { + KDBuffedStatTypeMemoUpdate.set(list, []); + } + if (!KDBuffedStatTypeMemoUpdate.get(list).includes(stat)) { + KDBuffedStatTypeMemoUpdate.get(list).push(stat); + } +} + +/** + * @param entity + * @param origbuff + * @param [changes] + */ +function KinkyDungeonApplyBuffToEntity(entity: entity, origbuff: any, changes?: any) { + if (entity && entity.player) { + return KDApplyBuff(KinkyDungeonPlayerBuffs, origbuff, changes, entity); + } else if (entity) { + if (!entity.buffs) entity.buffs = {}; + return KDApplyBuff(entity.buffs, origbuff, changes, entity); + } + return null; +} + +/** + * @param origbuff + * @param [changes] + */ +function KDApplyBuff(list: Record, origbuff: any, changes: any, entity: entity): any { + if (!origbuff) return null; + let buff: any = {}; + Object.assign(buff, origbuff); + if (changes) + Object.assign(buff, changes); + let id = buff.id ? buff.id : buff.name; + + if (list[id] && buff.cancelOnReapply) { + KinkyDungeonExpireBuff(entity, id); + return null; + } else { + if (!list[id] && buff.sfxApply) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + buff.sfxApply + ".ogg"); + if (!list[id] + || (list[id].power >= 0 && buff.power >= list[id].power) + || (list[id].power < 0 + && ((buff.power > 0 && buff.power >= list[id].power) + || buff.power <= list[id].power))) + list[id] = buff; + if ((list[id].power && buff.power == list[id].power && buff.duration >= list[id].duration)) + list[id].duration = buff.duration; + KDUpdateBuffStatMemo(list, buff.type); + if (buff.tags) + for (let tag of buff.tags) { + if (tag == "darkness" && list == KinkyDungeonPlayerBuffs) { + KinkyDungeonBlindLevelBase = Math.max(KinkyDungeonBlindLevelBase, 1); + } else if (tag == "heavydarkness" && list == KinkyDungeonPlayerBuffs) { + KinkyDungeonBlindLevelBase = Math.max(KinkyDungeonBlindLevelBase, 2); + } + } + return buff; + } +} + +function KinkyDungeonGetbuff(list: Record, Buff: string): any { + if (list && list[Buff]) return list[Buff]; + else return null; +} + +function KinkyDungeonHasBuff(list: Record, Buff: string, excludeNoDuration?: boolean): boolean { + if (list && list[Buff] && (!excludeNoDuration || list[Buff].duration > 0)) return true; + else return false; +} + +/** + * @param entity + * @param buff + * @param [excludeNoDuration] + */ +function KDEntityHasBuff(entity: entity, buff: string, excludeNoDuration: boolean = false): boolean { + if (entity.player) { + return KinkyDungeonHasBuff(KinkyDungeonPlayerBuffs, buff, excludeNoDuration); + } else return KinkyDungeonHasBuff(entity.buffs, buff, excludeNoDuration); +} + +/** + * @param entity + * @param stat + * @param [onlyPositiveDuration] + */ +function KDEntityBuffedStat(entity: entity, stat: string, onlyPositiveDuration?: boolean): number { + if (!entity) return 0; + if (entity.player) { + return KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, stat, onlyPositiveDuration); + } else return KinkyDungeonGetBuffedStat(entity.buffs, stat, onlyPositiveDuration); +} + +/** + * @param entity + * @param stat + * @param [onlyPositiveDuration] + */ +function KDEntityMaxBuffedStat(entity: entity, stat: string, onlyPositiveDuration?: boolean): number { + if (entity.player) { + return KinkyDungeonGetMaxBuffedStat(KinkyDungeonPlayerBuffs, stat, onlyPositiveDuration); + } else return KinkyDungeonGetMaxBuffedStat(entity.buffs, stat, onlyPositiveDuration); +} + +/** + * @param entity + */ +function KDEntityGetBuff(entity: entity, buff: string): any { + if (entity.player) { + return KinkyDungeonGetbuff(KinkyDungeonPlayerBuffs, buff); + } else return KinkyDungeonGetbuff(entity.buffs, buff); +} diff --git a/Game/src/effect/KinkyDungeonBuffsList.ts b/Game/src/effect/KinkyDungeonBuffsList.ts new file mode 100644 index 000000000..bd4890fad --- /dev/null +++ b/Game/src/effect/KinkyDungeonBuffsList.ts @@ -0,0 +1,299 @@ +"use strict"; + +let KDAim = { + id: "Aim", replaceSpriteSuff: "_Aim", replacePower: 0.5, + type: "Aim", power: 1, duration: 3, events: [ + {type: "EnemyAim", trigger: "tickAfter", dist: 2}, + {type: "EnemyAim", sprite: "UI/Crosshair", trigger: "draw"}, + ]}; +let KDEquip = { + id: "Equip", replaceSpriteSuff: "_Equip", replacePower: 0.25, + type: "Equip", power: 1, duration: 3}; +let KDAim2 = { + id: "Aim2", + type: "MoveSpeed", power: -2, duration: 1}; +let KDAim3 = { + id: "Aim3", + type: "AttackSlow", power: 2, duration: 1}; + +let KDConduction = {id: "Conduction", type: "event", aura: "#ffff88", noAuraColor: true, aurasprite: "Conduction", power: 7.0, player: true, duration: 5, enemies: true, range: 2.99, events: [ + {type: "RemoveConduction", duration: 1, trigger: "tick"}, + {type: "Conduction", power: 0.5, duration: 5, damage: "electric", aoe: 3.99, trigger: "playerTakeDamage"}, + {type: "Conduction", power: 0.5, duration: 5, damage: "electric", aoe: 3.99, trigger: "beforeDamageEnemy"}, +]}; + +let KDDrenched = {id: "Drenched", type: "fireDamageResist", aura: "#59a0d1", aurasprite: "Drenched", power: 0.425, player: true, duration: 20, enemies: true, events: [ + {type: "RemoveDrench", duration: 1, trigger: "tick"}, + {type: "Evaporate", mult: 1, trigger: "tick"}, + {type: "ApplyConduction", duration: 1, trigger: "tick", kind: "invis"}, + {type: "ApplyConduction", duration: 1, trigger: "tickAfter", kind: "invis"}, +]}; + + +let KDAdrenaline = { + // Is a hell of a drug + id: "Adrenaline", type: "VisionRad", power: 0.5, duration: 2, tags: ["adren"], +}; + +let KDAdrenaline2 = { + // Is a hell of a drug + id: "Adrenaline2", type: "VisionRad", power: 2, duration: 2, +}; + +let KDBurning = {id: "Burning", type: "event", aura: "#ff8933", aurasprite: "Flaming", noAuraColor: true, power: 0.5, player: true, duration: 6, enemies: true, events: [ + {type: "RemoveBurning", trigger: "tick"}, + {type: "ElementalEffect", power: 0.5, damage: "fire", trigger: "tick"}, + {type: "EchoDamage", power: 1.0, damage: "fire", damageTrigger: "stun", trigger: "beforeDamageEnemy"}, + {type: "EchoDamage", power: 1.0, damage: "fire", damageTrigger: "stun", trigger: "playerTakeDamage"}, +]}; + +let KDTrainingUnit = {id: "TrainingUnit", type: "TrainingUnit", aura: "#00ff00", power: -0.5, player: false, duration: 9999, infinite: true, enemies: true, + events: [ + {type: "TrainingUnit", trigger: "tick"}, + {type: "TrainingUnitReveal", trigger: "tick"}, + ], +}; + +let KDDisenchant1 = {id: "Disenchant1", type: "MoveSpeed", aura: "#440088", power: -0.5, player: false, duration: 9999, infinite: true, enemies: true}; +let KDDisenchant2 = {id: "Disenchant2", type: "AttackSlow", aura: "#440088", power: 0.5, player: false, duration: 9999, infinite: true, enemies: true}; + +let KDVolcanism = {id: "Volcanism", type: "event", aura: "#ff5277", power: 0.5, player: false, duration: 9999, infinite: true, enemies: true, events: [ + {type: "Volcanism", power: 4.0, damage: "fire", trigger: "beforeDamageEnemy"}, +]}; + +let KDDrenched2 = {id: "Drenched2", type: "electricDamageResist", power: -0.2, player: true, duration: 20, enemies: true, + events: [ + {type: "Evaporate", mult: 1, trigger: "tick"}, + ], +}; +let KDDrenched3 = {id: "Drenched3", type: "iceDamageResist", power: -0.35, player: true, duration: 20, enemies: true, + events: [ + {type: "Evaporate", mult: 1, trigger: "tick"}, + ], +}; + +let KDBoundByFate = {id: "BoundByFate", type: "Fate", power: 1, player: true, duration: 3, enemies: false, aura: "#dddddd", events: [ + {type: "BoundByFate", kind: "mithrilRope", count: 2, trigger: "tick", power: 1, damage: "cold"}, +]}; + +let KDTaunted = {id: "Taunted", type: "Taunt", power: 1, player: true, duration: 3, enemies: false, aura: "#dddddd", events: [ + {type: "Taunted", count: 2, trigger: "tick", power: 3, damage: "soul"}, +]}; + +let KDPoisonSleep = { + id: "poisonSleep", type: "Event", power: 0.1, duration: 10, events: [ + {type: "poisonSleep", trigger: "tick"}, + {type: "poisonSleep", trigger: "expireBuff"}, + ] +} + +let KDEager = { + id: "Eager", type: "MoveSpeed", power: 0.1, duration: 1, events: [ + {type: "ApplyVuln", duration: 1, trigger: "tick"}, + {type: "ApplyVuln", duration: 1, power: -1.0, trigger: "tickAfter"}, + ] +}; +let KDMasochist = { + id: "Masochist", type: "DamageAmp", power: -1, duration: 1 +}; + +let KDChilled = {id: "Chilled", aura: "#73efe8", type: "MoveSpeed", power: -1.0, player: true, enemies: true, duration: 2,}; +let KDSlimed = { + id: "Slimed", aura: "#dc16bc", aurasprite: "Slimed", noAuraColor: true, type: "SlimeProgress", power: 1.0, player: true, enemies: true, duration: 3, range: 0.5, hideHelpless: true, tags: ["slimed"], events: [ + {type: "RemoveSlimeWalk", duration: 1, trigger: "tick"}, + {type: "Flammable", trigger: "beforeDamageEnemy"}, + {type: "Flammable", trigger: "beforePlayerDamage"}, + {type: "ApplySlowed", duration: 1, power: -1.0, trigger: "tick"}, + {type: "ApplySlowed", duration: 1, power: -1.0, trigger: "tickAfter"}, + {type: "ApplyGlueVuln", duration: 1, power: -0.3, trigger: "tick"}, + {type: "ApplyGlueVuln", duration: 1, power: -0.3, trigger: "tickAfter"}, + ] +}; +let KDEncased = { + id: "Encased", type: "SlimeProgress", power: 2.0, player: false, enemies: true, duration: 9999, infinite: true, range: 0.5, replaceSpriteBound: "EncasedFactoryDoll", replacePower: 2.5, replaceSprite: "EncasedDoll", tags: ["encased"], events: [ + {type: "RemoveSlimeWalk", duration: 1, trigger: "tick"}, + {type: "RemoveFree", trigger: "tick"}, + {type: "ApplySlowed", duration: 1, power: -2.0, trigger: "tick"}, + {type: "ApplySlowed", duration: 1, power: -2.0, trigger: "tickAfter"}, + {type: "ApplyAttackSlow", duration: 1, power: 1.0, trigger: "tick"}, + {type: "ApplyAttackSlow", duration: 1, power: 1.0, trigger: "tickAfter"}, + {type: "ApplySilence", duration: 2, power: 1.0, trigger: "tick"}, + {type: "ApplySilence", duration: 2, power: 1.0, trigger: "tickAfter"}, + {type: "ApplyGlueVuln", duration: 1, power: -0.5, trigger: "tick"}, + {type: "ApplyGlueVuln", duration: 1, power: -0.5, trigger: "tickAfter"}, + ] +}; +let KDEncasedMetal = { + id: "Encased", type: "SlimeProgress", power: 2.5, player: false, enemies: true, duration: 9999, infinite: true, range: 0.5, replaceSpriteBound: "EncasedFactoryDollMetal", replaceSprite: "EncasedDollMetal", tags: ["encased"], events: [ + {type: "RemoveSlimeWalk", duration: 1, trigger: "tick"}, + {type: "RemoveFree", trigger: "tick"}, + {type: "ApplyKnockback", duration: 1, power: -2.0, trigger: "tick"}, + {type: "ApplyKnockback", duration: 1, power: -2.0, trigger: "tickAfter"}, + {type: "ApplySlowed", duration: 1, power: -2.0, trigger: "tick"}, + {type: "ApplySlowed", duration: 1, power: -2.0, trigger: "tickAfter"}, + {type: "ApplyAttackSlow", duration: 1, power: 1.0, trigger: "tick"}, + {type: "ApplyAttackSlow", duration: 1, power: 1.0, trigger: "tickAfter"}, + {type: "ApplySilence", duration: 2, power: 1.0, trigger: "tick"}, + {type: "ApplySilence", duration: 2, power: 1.0, trigger: "tickAfter"}, + {type: "ApplyGlueVuln", duration: 1, power: -0.5, trigger: "tick"}, + {type: "ApplyGlueVuln", duration: 1, power: -0.5, trigger: "tickAfter"}, + ] +}; +let KDEncasedDoll = { + id: "EncasedDoll", type: "SlimeProgress", power: 2.0, player: false, enemies: true, duration: 9999, infinite: true, range: 0.5, replaceSpriteBound: "EncasedFactoryDoll", replaceSprite: "EncasedFactoryDoll", tags: ["encased"], events: [ + {type: "RemoveSlimeWalk", duration: 1, trigger: "tick"}, + {type: "RemoveFree", trigger: "tick"}, + {type: "ApplySlowed", duration: 1, power: -2.0, trigger: "tick"}, + {type: "ApplySlowed", duration: 1, power: -2.0, trigger: "tickAfter"}, + {type: "ApplyAttackSlow", duration: 1, power: 1.0, trigger: "tick"}, + {type: "ApplyAttackSlow", duration: 1, power: 1.0, trigger: "tickAfter"}, + {type: "ApplySilence", duration: 2, power: 1.0, trigger: "tick"}, + {type: "ApplySilence", duration: 2, power: 1.0, trigger: "tickAfter"}, + {type: "ApplyGlueVuln", duration: 1, power: -0.5, trigger: "tick"}, + {type: "ApplyGlueVuln", duration: 1, power: -0.5, trigger: "tickAfter"}, + ] +}; +let KDChastity = { + id: "Chastity", type: "Chastity", power: 1.0, aura: "#dddddd", aurasprite: "Chastity", player: false, enemies: true, duration: 9999, infinite: true, range: 0.5, tags: ["chastity"], events: [ + {type: "Distract", power: 0.01, trigger: "tick", prereq: "bound"}, + ] +}; +let KDVibrate1 = { + id: "Vibrate", type: "Vibration", power: 1.0, aura: "#ffaaaa", duration: 3, tags: ["plugged"], events: [ + {type: "RemoveNoPlug", trigger: "tick"}, + ] +}; +let KDVibrate2 = { + id: "Vibrate2", type: "Vibration", power: 2.0, aura: "#ffaaaa", duration: 3, tags: ["plugged"], events: [ + {type: "RemoveNoPlug", trigger: "tick"}, + ] +}; +let KDVibrate3 = { + id: "Vibrate3", type: "Vibration", power: 3.0, aura: "#ffaaaa", duration: 3, tags: ["plugged"], events: [ + {type: "RemoveNoPlug", trigger: "tick"}, + ] +}; +let KDToySecret = { + id: "Toy", type: "Plug", power: 0.1, duration: 9999, infinite: true, range: 0.5, tags: ["toy"], +}; +let KDToy = { + id: "Toy", type: "Plug", power: 0.1, aura: "#dddddd", aurasprite: "Toy", player: false, enemies: true, duration: 30, range: 0.5, tags: ["toy"], + events: [ + {type: "ExtendDisabledOrHelplessOrChastity", trigger: "tick"}, + ] +}; +let KDPlugged = { + id: "Plugged", type: "Plug", power: 1.0, aura: "#dddddd", aurasprite: "Plugged", player: false, enemies: true, duration: 9999, infinite: true, range: 0.5, tags: ["plugged"], events: [ + {type: "Distract", power: 0.2, trigger: "tick"}, + {type: "RemoveFree", trigger: "tick", prereq: "NoChastity"}, + ] +}; +let KDDoublePlugged = { + id: "DoublePlugged", type: "Plug", power: 2.0, aura: "#dddddd", aurasprite: "DoublePlugged", player: false, enemies: true, duration: 9998, range: 0.5, tags: ["plugged"], events: [ + {type: "Distract", power: 0.5, trigger: "tick"}, + {type: "RemoveFree", trigger: "tick", prereq: "NoChastity"}, + ] +}; + +let KDTaped = { + id: "Taped", type: "chainDamageResist", power: -0.15, duration: 1, replaceSpriteBound: "TapedDoll", tags: ["taped"], aura: "#4fa4b8", replacePower: 2.0, + events: [ + {type: "ExtendDisabledOrHelpless", trigger: "tick"}, + {type: "RemoveAuraHelpless", trigger: "tick"}, + ] +}; + +let KDGlueVulnLow = { + id: "GlueVuln", type: "glueDamageResist", power: -0.3, player: true, enemies: true, duration: 1 +}; +let KDGlueResist = { + id: "GlueVuln", type: "glueDamageResist", power: 0.5, player: false, enemies: true, duration: 1 +}; +let KDDollDebuff = { + id: "DollDebuff", type: "soulDamageResist", power: -0.5, player: false, enemies: true, duration: 2, aura: "#ff8888", +}; +let KDDollDebuff2 = { + id: "DollDebuff2", type: "charmDamageResist", power: -0.5, player: false, enemies: true, duration: 2 +}; +let KDSlowed = { + id: "Slowed", type: "MoveSpeed", power: -1.0, player: true, enemies: true, duration: 1 +}; +let KDSlowedSlightly = { + id: "Slowed", type: "MoveSpeed", power: -.5, player: true, enemies: true, duration: 1 +}; +let KDKnockbackable = { + id: "Knockbackable", type: "Knockback", power: 2.0, player: true, enemies: true, duration: 1 +}; +let KDAttackSlow = { + id: "AttackSlow", type: "AttackSlow", power: 0.5, player: true, enemies: true, duration: 1 +}; + + +let KDAntiMagicMiscast = {id: "AntiMagicMiscast", aura: "#00ffff", type: "Miscast", power: 0.5, player: false, enemies: true, + duration: 2,}; + +let KDUnsteady = {id: "Unsteady", aura: "#aa8888", type: "MoveSpeed", power: -1.0, player: true, enemies: true, duration: 1,}; +let KDUnsteady2 = {id: "Unsteady2", aura: "#aa8888", type: "HeelPower", power: 2.5, player: true, enemies: false, duration: 3,}; +let KDUnsteady3 = {id: "Unsteady3", type: "Evasion", power: -0.5, player: true, enemies: false, duration: 3,}; + +let KDWaterSlow = {id: "WaterSlow", type: "MoveSpeed", power: -1.0, player: true, enemies: true, duration: 1,}; + +let KDNoChill = {id: "ChillWalk", aura: "#73efe8", type: "ChillWalk", power: -1.0, player: true, enemies: true, duration: 2,}; +let KDNoChillNoAura = {id: "ChillWalk2", type: "ChillWalk", power: -1.0, player: true, enemies: true, duration: 2,}; +function KDChillWalk(entity: entity) { + return KDEntityHasBuff(entity, "ChillWalk") || KDEntityHasBuff(entity, "ChillWalk2"); +} + +let KDRestraintDisarmLight = {id: "RestDisarmLight", aura: "#ff5277", type: "DisarmOnAttack", power: 3, player: false, enemies: true, duration: 9999, infinite: true, events: [ + {type: "RemoveRestraint", trigger: "tick"}, + {type: "ApplyDisarm", trigger: "playerAttack"}, +]}; + +let KDRestraintReduceAccuracy = {id: "RestraintAccPen", type: "AccuracyPenalty", power: 0, duration: 2,}; + +let KDBuffReference = { + "RestraintDisarmLight": [KDRestraintDisarmLight], + "Unsteady": [KDUnsteady, KDUnsteady2, KDUnsteady3], + "Plugged": [KDPlugged], + "DoublePlugged": [KDDoublePlugged], + "Chastity": [KDChastity], + "Vibrate1": [KDVibrate1], + "Vibrate2": [KDVibrate2], + "Vibrate3": [KDVibrate3], +}; + +let KDDisenchantSelf = {id: "DisenchantSelf", aura: "#8888ff", type: "Disenchant", power: 9.9, player: true, enemies: true, duration: 10,}; + +let KDCustomBuff: Record void> = { +}; + +/** + */ +let KDBuffClick: Record void> = { + "SlimeMimic": (_buff, entity) => { + // Toggle SlimeMimic on/off + let b = KinkyDungeonPlayerBuffs.d_SlimeMimic; + if (b && b.duration > 0) { + b.duration = 0; + } else { + KinkyDungeonApplyBuffToEntity(entity, + {id: "d_SlimeMimic", click: "SlimeMimic", type: "d_SlimeMimic", aura: "#ffffff", aurasprite: "Null", duration: 9999, infinite: true, power: 1} + ); + } + }, + "OrgasmResist": (_buff, entity) => { + // Toggle SlimeMimic on/off + let b = KinkyDungeonPlayerBuffs.d_OrgasmResist; + if (b && b.duration > 0) { + b.duration = 0; + KinkyDungeonApplyBuffToEntity(entity, + {id: "e_OrgasmResist", click: "OrgasmResist", type: "e_OrgasmResist", buffSprite: true, aura: "#ffffff", aurasprite: "Null", duration: 9999, infinite: true, power: 1} + ); + } else { + KinkyDungeonApplyBuffToEntity(entity, + {id: "d_OrgasmResist", click: "OrgasmResist", type: "d_OrgasmResist", buffSprite: true, aura: "#ffffff", aurasprite: "Null", duration: 9999, infinite: true, power: 1} + ); + if (KinkyDungeonPlayerBuffs.e_OrgasmResist) KinkyDungeonPlayerBuffs.e_OrgasmResist.duration = 0; + } + }, +}; diff --git a/Game/src/effect/KinkyDungeonEvents.ts b/Game/src/effect/KinkyDungeonEvents.ts new file mode 100644 index 000000000..adc937ba4 --- /dev/null +++ b/Game/src/effect/KinkyDungeonEvents.ts @@ -0,0 +1,12058 @@ +"use strict"; + + +let KinkyDungeonAttackTwiceFlag = false; +let KinkyDungeonSlimeParts = [ + { group: "ItemHead", restraint: "Head", noUnmasked: true }, + { group: "ItemMouth", restraint: "Mouth" }, + { group: "ItemArms", restraint: "Arms" }, + { group: "ItemHands", restraint: "Hands" }, + { group: "ItemLegs", restraint: "Legs" }, + { group: "ItemFeet", restraint: "Feet" }, + { group: "ItemBoots", restraint: "Boots" }, +]; +let KDAlertCD = 5; + +let KDEventDataReset = { + +}; + +let KDSoundDescBase: SoundDescData[] = []; +let KDShockwaveDataBase: ShockwaveData[] = []; + +let KDEventDataBase = { + SlimeLevel: 0, + SlimeLevelStart: 0, + CurseHintTick: false, + ActivationsThisTurn: 0, + sounddesc: KDSoundDescBase, + shockwaves: KDShockwaveDataBase, +}; + +interface SoundDescData { + x: number, + y: number, + desc: string, + shockwave: ShockwaveData, + lastShockwave: number, + shockwavePeriod: number, +} + +interface ShockwaveData { + x: number, + y: number, + radius: number, + sprite: string, +} + +let KDEventData = Object.assign({}, KDEventDataBase); + +function KDMapHasEvent(map: Record, event: string) { + return map[event] != undefined; +} + +function KinkyDungeonSendEvent(Event: string, data: any, forceSpell?: any) { + KinkyDungeonSendMagicEvent(Event, data, forceSpell); + KinkyDungeonSendWeaponEvent(Event, data); + KinkyDungeonSendInventorySelectedEvent(Event, data); + KinkyDungeonSendInventoryIconEvent(Event, data); + KinkyDungeonSendInventoryEvent(Event, data); + if (data.NPCRestraintEvents) + KDSendNPCRestraintEvent(Event, data); + KinkyDungeonSendBulletEvent(Event, data.bullet, data); + KinkyDungeonSendBuffEvent(Event, data); + KinkyDungeonSendOutfitEvent(Event, data); + KinkyDungeonSendEnemyEvent(Event, data); + KinkyDungeonHandleGenericEvent(Event, data); + KinkyDungeonSendAltEvent(Event, data); + KinkyDungeonSendFacilityEvent(Event, data); +} +/** Called during initialization */ +function KinkyDungeonResetEventVariables() { + KinkyDungeonHandleGenericEvent("resetEventVar", {}); +} +/** Called every tick */ +function KinkyDungeonResetEventVariablesTick(delta: number) { + KDEventDataReset = {}; + KinkyDungeonAttackTwiceFlag = false; + + KinkyDungeonHandleGenericEvent("resetEventVarTick", { delta: delta }); +} + + +/** + * Function mapping + * to expand, keep (e, item, data) => {...} as a constant API call + */ +let KDEventMapInventoryIcon: Record void>> = { + "icon": { + "tintIcon": (e, item, data) => { + if (item == data.item + ) { + if (!(KinkyDungeonStatsChoice.get("UnidentifiedWear") + && KDIsUnidentified(item))) { + if (e.power > data.power) { + data.power = e.power; + if (e.color) + data.color = e.color; + if (e.bgcolor) + data.bgcolor = e.bgcolor; + } + } else { + data.power = 0.5; + data.color = "#888888"; + data.bgcolor = "#000000"; + } + + } + }, + }, +}; + +/** + * @param Event + * @param e + * @param item + * @param data + */ +function KinkyDungeonHandleInventoryIconEvent(Event: string, e: KinkyDungeonEvent, item: item, data: any) { + if (Event === e.trigger && KDEventMapInventoryIcon[Event] && KDEventMapInventoryIcon[Event][e.type]) { + if (KDCheckCondition(e, data)) + KDEventMapInventoryIcon[Event][e.type](e, item, data); + } +} + +/** + * Function mapping + * to expand, keep (e, item, data) => {...} as a constant API call + */ +let KDEventMapInventorySelected: Record void>> = { + "inventoryTooltip": { + "varModifier": (e, item, data) => { + if (item == data.item) { + data.extraLines.push(TextGet("KDVariableModifier_" + e.msg) + .replace("AMNT", `${e.power >= 0 ? "+" : ""}${Math.round(e.power)}`) + .replace("DMG", TextGet("KinkyDungeonDamageType" + e.damage)) + .replace("TYPE", `${e.kind}`)); + data.extraLineColor.push(KDBookText); // e.color || "#ffffff" + let bg = e.bgcolor || "#000000"; + if (!KDToggles.SpellBook) { + let col = DrawHexToRGB(bg); + bg = `rgba(${col.r / 2}, ${col.g / 2}, ${col.b / 2}, 0.5)`; + } + data.extraLineColorBG.push(bg); + } + }, + "invtooltipworn": (e, item, data) => { + if (item == data.item && item.type == Restraint) { + data.extraLines.push(TextGet("KDInvTooltip_" + e.msg)); + data.extraLineColor.push(KDBookText); // e.color || "#ffffff" + let bg = e.bgcolor || "#000000"; + if (!KDToggles.SpellBook) { + let col = DrawHexToRGB(bg); + bg = `rgba(${col.r / 2}, ${col.g / 2}, ${col.b / 2}, 0.5)`; + } + data.extraLineColorBG.push(bg); + } + }, + "conditionModifier": (e, item, data) => { + if (item == data.item) { + data.extraLines.push(TextGet("KDModifierCondition_" + e.msg) + .replace("AMNT", `${e.power >= 0 ? "+" : ""}${Math.round(e.power)}`) + .replace("DMG", TextGet("KinkyDungeonDamageType" + e.damage)) + .replace("TYPE", `${e.kind}`)); + data.extraLineColor.push(KDBookText); // e.color || "#ffffff" + let bg = e.bgcolor || "#000000"; + if (!KDToggles.SpellBook) { + let col = DrawHexToRGB(bg); + bg = `rgba(${col.r / 2}, ${col.g / 2}, ${col.b / 2}, 0.5)`; + } + data.extraLineColorBG.push(bg); + } + }, + "effectModifier": (e, item, data) => { + if (item == data.item) { + data.extraLines.push(TextGet("KDModifierEffect_" + e.msg) + .replace("AMNT", `${e.power >= 0 ? "+" : ""}${Math.round(e.power)}`) + .replace("DRTN", `${Math.round(e.duration)}`) + .replace("DMG", TextGet("KinkyDungeonDamageType" + e.damage)) + .replace("TYPE", `${e.kind}`)); + data.extraLineColor.push(KDBookText); // e.color || "#ffffff" + let bg = e.bgcolor || "#000000"; + if (!KDToggles.SpellBook) { + let col = DrawHexToRGB(bg); + bg = `rgba(${col.r / 2}, ${col.g / 2}, ${col.b / 2}, 0.5)`; + } + data.extraLineColorBG.push(bg); + } + }, + }, +}; + +/** + * @param Event + * @param kinkyDungeonEvent + * @param item + * @param data + */ +function KinkyDungeonHandleInventorySelectedEvent(Event: string, kinkyDungeonEvent: KinkyDungeonEvent, item: item, data: any) { + if (Event === kinkyDungeonEvent.trigger && KDEventMapInventorySelected[Event] && KDEventMapInventorySelected[Event][kinkyDungeonEvent.type]) { + KDEventMapInventorySelected[Event][kinkyDungeonEvent.type](kinkyDungeonEvent, item, data); + } +} + +// Brief explanation of dynamic events: Normally, events need to be declared for every case. +// However sometimes you want multiple events to do something generic without respect to the action. +// In this case, you can mark the event as dynamic. +// Dynamic events only have to be declared under the .dynamic object of the event map + +/** + * Function mapping + * to expand, keep (e, item, data) => {...} as a constant API call + */ +let KDEventMapInventory: Record void>> = { + "dynamic": { + "wardenPunish": (_e, item, _data) => { + let restraintAdd = KinkyDungeonGetRestraint({ tags: ["wardenLink"] }, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, "Purple", undefined, undefined, undefined, undefined, undefined, { + allowedGroups: [KDRestraint(item)?.Group], + }); + if (restraintAdd) { + KDPlayerEffectRestrain(undefined, 1, ["wardenLink"], item.faction, false, true, false, false); + } + }, + "BuffSelf": (e, item, data) => { + if (KDCheckPrereq(null, e.prereq, e, data)) { + let b = { + id: (e.kind || item.name) + e.buffType, + type: e.buffType, + power: e.power, + tags: e.tags, + currentCount: e.mult ? -1 : undefined, + maxCount: e.mult, + duration: e.time, + }; + if (e.desc) { + b['aura'] = e.color || "#ffffff"; + b['esc'] = e.desc; + + } + if (e.buffSprite != undefined) { + if (e.buffSprite) { + b['buffSpriteSpecific'] = e.buffSprite; + } + b['buffSprite'] = true; + } + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, b); + } + }, + }, + "miscast": { + "EssenceMote": (e, item, data) => { + //if (KinkyDungeonFlags.get("essMote")) return; + if (data.spell && (!data.spell.manacost || data.spell.noMiscast)) return; + if (e.chance && KDRandom() > e.chance) return; + let slots: KDPoint[] = []; + let x = KDPlayer().x; + let y = KDPlayer().y; + for (let X = -Math.ceil(e.dist); X <= Math.ceil(e.dist); X++) + for (let Y = -Math.ceil(e.dist); Y <= Math.ceil(e.dist); Y++) { + let dd = KDistEuclidean(X, Y); + if ((X != 0 || Y != 0) && dd <= e.dist) { + let loc = (x + X) + "," + (y + Y); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x + X, y + Y))) { + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("mote")) { + continue; + } + } + } + slots.push({ x: x + X, y: y + Y }) + } + } + } + + if (slots.length > 0) { + let slot = slots[Math.floor(slots.length * KDRandom())]; + KDCreateEffectTile(slot.x, slot.y, { + name: "DistractionMoteContact" + }, 0); + if (!KDEventData.shockwaves) KDEventData.shockwaves = []; + KDEventData.shockwaves.push({ + x: slot.x, + y: slot.y,// - .167, + radius: 1.5, + sprite: "Particles/PinkGlow.png", + }); + KinkyDungeonSetFlag("essMote", 1); + KinkyDungeonSendTextMessage(10, TextGet("KDEssenceNecklaceCreate"), "#e223b3", 2); + + //KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/MagicSlash.ogg"); + } + }, + }, + "beforeEnemyLoop": { + AntiMagicEnemyDebuff: (e, _item, data) => { + if (data.Wornitems.includes(_item.id)) + KinkyDungeonApplyBuffToEntity(data.enemy, KDAntiMagicMiscast, {}); + } + }, + "afterShrineBottle": {}, + "afterShrineDrink": {}, + "spellOrb": {}, + "afterFailGoddessQuest": {}, + "curseCount": { + "add": (e, item, data: KDEventData_CurseCount) => { + if (!data.activatedOnly || (KDGetCurse(item) && KDCurses[KDGetCurse(item)].activatecurse)) { + data.count += e.power; + } + } + }, + "beforeCast": { + "ReduceMiscastVerbal": (e, _item, data) => { + if (data.spell) { + let spell: spell = data.spell; + if (spell.components?.includes("Verbal")) { + data.flags.miscastChance -= e.power; + } + } + } + }, + "postApply": { + "ControlHarness": (e, item, data: KDEventData_PostApply) => { + let itemAdded = data.item; + if (!itemAdded) return; + if (data.UnLink) return; + let itemtags = KDRestraint(itemAdded)?.shrine; + console.log(itemtags); + // Ignore anything that isnt futuristic + if (itemtags?.includes("Cyber")) { + /*KinkyDungeonSendTextMessage(4, + TextGet("KDControlHarnessTest"), + "#ffffff", + 1, + );*/ + + for (let category of Object.values(KDControlHarnessCategories)) { + if (category.activateTags.some((tag) => { return itemtags.includes(tag); })) { + let restMap = new Map(); + for (let tag of category.activateTags) { + for (let inv of KinkyDungeonGetRestraintsWithShrine(tag, false, true)) { + if (!restMap.has(inv)) { + restMap.set(inv, true); + } + } + } + category.updateFunction(e, item, data, [...restMap.keys()]); + if (restMap.size == category.activateCount && KDEventData.ActivationsThisTurn < 100) { + // ACTIVATE + category.activateFunction(e, item, data, [...restMap.keys()]); + KDEventData.ActivationsThisTurn = (KDEventData.ActivationsThisTurn || 0) + 1; + } + } + } + } + }, + "BubbleCombine": (_e, item, _data: KDEventData_PostApply) => { + KinkyDungeonUpdateRestraints(); + if ((KinkyDungeonPlayerTags.get("CombineBubble1") || KDRestraint(item)?.shrine?.includes("CombineBubble1")) + && (KinkyDungeonPlayerTags.get("CombineBubble2") || KDRestraint(item)?.shrine?.includes("CombineBubble2")) + && (KinkyDungeonPlayerTags.get("CombineBubble3") || KDRestraint(item)?.shrine?.includes("CombineBubble3"))) { + for (let inv of KinkyDungeonAllRestraintDynamic()) { + let restraint = KDRestraint(inv.item); + if (restraint) { + if (restraint.shrine?.includes("CombineBubble1") + || restraint.shrine?.includes("CombineBubble2") + || restraint.shrine?.includes("CombineBubble3")) { + KinkyDungeonRemoveRestraintSpecific(inv.item, true, false, true); + } + } + } + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("Bubble"), 10, true, "", true); + KinkyDungeonSendTextMessage(7, TextGet("KDBubbleCombine"), "#4477ee", 4); + } + }, + + "NoYoke": (_e, item, data: KDEventData_PostApply) => { + if (item == data.item && KinkyDungeonPlayerTags.get("Yoked")) + KinkyDungeonRemoveRestraintSpecific(item, data.keep, false); + }, + "requireNoGags": (_e, item, data: KDEventData_PostApply) => { + if (item != data.item && KinkyDungeonPlayerTags.get("Gags")) { + KinkyDungeonRemoveRestraintSpecific(item, data.keep, false); + KinkyDungeonSendTextMessage(4, TextGet("KDGagNecklaceOff"), "#ffffff", 4); + } + }, + "EngageCurse": (_e, item, data) => { + if (item == data.item) + KinkyDungeonSendEvent("EngageCurse", {}); + }, + "cursePrefix": (_e, item, data) => { + if (item == data.item) { + let variant = KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]; + if (variant) { + if (!variant.suffix) + variant.suffix = "Cursed"; + else if (!variant.prefix) + variant.prefix = "Cursed"; + } + } + }, + }, + "calcOrgThresh": { + "CurseSensitivity": (e, _item, data) => { + if (data.player == KinkyDungeonPlayerEntity) { + data.threshold *= e.power; + } + } + }, + "afterCalcManaPool": { + "MultManaPoolRegen": (e, _item, data) => { + data.manaPoolRegen *= e.power; + }, + }, + "calcEfficientMana": { + "ManaCost": (e, _item, data) => { + data.efficiency += e.power; + }, + }, + "calcMultMana": { + "ManaCost": (e, _item, data) => { + data.cost = Math.max(data.cost * e.power, 0); + }, + }, + "edge": { + "CursedDenial": (e, _item, _data) => { + KinkyDungeonSendTextMessage(5, TextGet("KDCursedDenialDeny" + Math.floor(KDRandom() * e.count)), "#9074ab", 10); + }, + "IncrementRemovalVar": (e, item, data) => { + if (data.delta > 0 && KDIsEdged(KinkyDungeonPlayerEntity)) { + // Increase damage count + let count = KDItemDataQuery(item, e.kind) || 0; + count = Math.max(0, count + e.power); + KDItemDataSet(item, e.kind, count); + // Evaluate damage count + if (!e.count || count >= e.count) { + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonLock(item, ""); + KinkyDungeonSendTextMessage(5, TextGet(e.msg).replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } else { + KinkyDungeonSendTextMessage(5, TextGet(e.msg + "Partial").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } + } + }, + }, + "orgasm": { + "IncrementRemovalVar": (e, item, data) => { + if (data.delta > 0 && KDIsEdged(KinkyDungeonPlayerEntity)) { + // Increase damage count + let count = KDItemDataQuery(item, e.kind) || 0; + count = Math.max(0, count + e.power); + KDItemDataSet(item, e.kind, count); + // Evaluate damage count + if (!e.count || count >= e.count) { + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonLock(item, ""); + KinkyDungeonSendTextMessage(5, TextGet(e.msg).replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } else { + + KinkyDungeonSendTextMessage(5, TextGet(e.msg + "Partial").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } + } + }, + + + "RobeOfChastity": (e, item, _data) => { + let player = !(item.onEntity > 0) ? KDPlayer() : KinkyDungeonFindID(item.onEntity); + if (player) { + if (player.player && KDRandom() < 0.1) + KinkyDungeonSendTextMessage(5, TextGet("KDRobeOfChastityFail" + Math.floor(KDRandom() * e.count)), + "#ffff00", 10); + KDSetIDFlag(player.id, "disableRobeChast", e.time); + } + }, + "CursedDenial": (e, _item, _data) => { + KinkyDungeonSendTextMessage(5, TextGet("KDCursedDenialAllow" + Math.floor(KDRandom() * e.count)), "#9074ab", 10); + }, + "CursedHeal": (e, item, data) => { + if (item && KDGetCurse(item) == "CursedDamage" && KDIsEdged(KinkyDungeonPlayerEntity)) { + let alreadyDone = KDItemDataQuery(item, "cursedDamage") || 0; + if (alreadyDone > 0) { + KinkyDungeonSendTextMessage(4, TextGet("KDCursedHeal"), "#9074ab", 2); + alreadyDone = Math.max(0, alreadyDone - e.power * data.delta); + KDItemDataSet(item, "cursedDamage", alreadyDone); + KDItemDataSet(item, "cursedDamageCheckpoint", Math.floor(1 + alreadyDone / 10) * 10); + } + } + }, + "CurseSubmission": (e, item, data) => { + if (data.player == KinkyDungeonPlayerEntity) { + KinkyDungeonChangeRep("Ghost", e.power); + KinkyDungeonSendTextMessage(3, TextGet("KDSubmissionCurseApply") + .replace("RESTRAINTNAME", TextGet("Restraint" + item.name)) + , "#ceaaed", 10); + } + }, + "PunishEvent": (e, item, data) => { + if (!e.chance || KDRandom() < e.chance) { + if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); + + KinkyDungeonSendEvent("punish", Object.assign({ + item: item, + type: "orgasm", + kind: e.kind || "low", + }, data)); + + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + }, + "afterCapture": { + "SacrificeMage": (e, item, data) => { + if (data.enemy && data.enemy.Enemy?.tags?.mage) { + let value = Math.max(1, Math.max(1, KDEnemyRank(data.enemy)) * (data.enemy.Enemy.unlockCommandLevel || 1)); + // Increase damage count + let count = KDItemDataQuery(item, e.kind) || 0; + count = count + Math.max((value * (e.mult || 1)) || 1, 1); + KDItemDataSet(item, e.kind, count); + // Evaluate damage count + if (!e.count || count >= e.count) { + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonLock(item, ""); + KinkyDungeonSendTextMessage(5, TextGet("KDRemoveSacrificeMage").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } else { + KinkyDungeonSendTextMessage(5, TextGet("KDRemoveSacrificeMagePartial").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } + } + }, + }, + "capture": { + "ManaBounty": (e, _item, data) => { + if (data.attacker && data.attacker.player && data.enemy) { + KDChangeMana(_item.name, "reward", "capture", 0, false, e.power); + } + }, + + }, + "calcPlayChance": { + "CurseAttraction": (e, _item, data) => { + if (data.enemy) { + data.playChance += e.power; + if (!data.enemy.playWithPlayer && data.enemy.playWithPlayerCD > 5) { + data.enemy.playWithPlayerCD = 5; + } + } + } + }, + "changeDistraction": { + "multDistractionPos": (e, _item, data) => { + if (data.Amount > 0) + data.Amount *= e.power; + }, + }, + "changeWill": { + "multWillPos": (e, _item, data) => { + if (data.Amount > 0) + data.Amount *= e.power; + }, + }, + "changeStamina": { + "multStaminaPos": (e, _item, data) => { + if (data.Cap > 0 && data.regen) + data.Cap *= e.power; + }, + }, + "getLights": { + "ItemLight": (e, _item, data) => { + if (!e.prereq || KDCheckPrereq(undefined, e.prereq, e, data)) + data.lights.push({ + brightness: e.power, x: KinkyDungeonPlayerEntity.x, y: KinkyDungeonPlayerEntity.y, + color: string2hex(e.color || "#ffffff") + }); + }, + }, + "onWear": { + "setSkinColor": (_e, item, data) => { + if (item == data.item) { + // Ne + } + } + }, + "afterDress": { + "PrisonerJacket": (_e, item, _data) => { + if (!StandalonePatched) + for (let A = 0; A < KinkyDungeonPlayer.Appearance.length; A++) { + let asset = KinkyDungeonPlayer.Appearance[A].Asset; + if (asset?.Name == KDRestraint(item).Asset) { + KinkyDungeonPlayer.Appearance[A].Property = { + "Text": "PATIENT", + "Type": "ShortsAndStraps", + "Block": [ + "ItemNipples", + "ItemNipplesPiercings", + "ItemTorso", + "ItemBreast", + "ItemHands", + "ItemVulva", + "ItemVulvaPiercings", + "ItemButt", + "ItemPelvis" + ], + "Hide": [ + "Cloth", + "ClothLower", + "ItemNipplesPiercings", + "ItemVulva", + "ItemVulvaPiercings", + "ItemButt", + "Panties", + "Corset" + ], + "HideItemExclude": [ + "ClothLowerJeans1", + "ClothLowerJeans2", + "ClothLowerLatexPants1", + "ClothLowerLeggings1", + "ClothLowerLeggings2", + "PantiesHarnessPanties1", + "PantiesHarnessPanties2" + ] + }; + } + } + }, + }, + "kill": { + "MikoGhost": (e, _item, data) => { + if (!e.chance || KDRandom() < e.chance) { + if (data.enemy && data.enemy.lifetime == undefined && data.enemy.playerdmg && !data.enemy.Enemy.tags.ghost && !data.enemy.Enemy.tags.construct) { + KinkyDungeonSummonEnemy(data.enemy.x, data.enemy.y, "MikoGhost", 1, 1.5, true); + KinkyDungeonSendTextMessage(5, TextGet("KDMikoCollarSummmon"), "purple", 2); + } + } + }, + "MikoGhost2": (e, _item, data) => { + if (!e.chance || KDRandom() < e.chance) { + if (data.enemy && data.enemy.lifetime == undefined && data.enemy.playerdmg && !data.enemy.Enemy.tags.ghost && !data.enemy.Enemy.tags.construct) { + KinkyDungeonSummonEnemy(data.enemy.x, data.enemy.y, "MikoGhost", 1, 1.5, true, 40, false, false, "Player"); + KinkyDungeonSendTextMessage(5, TextGet("KDMikoCollarSummmon2"), "purple", 2); + } + } + }, + "DollmakerMask": (_e, _item, data) => { + // if (item.player == data.player) + if (data.enemy?.Enemy.tags.escapeddoll) KinkyDungeonSetFlag("DollmakerGrace", 70); + }, + "CursedPunishment": (e, _item, data) => { + if (data.enemy && data.enemy.lifetime == undefined && data.enemy.playerdmg && data.enemy.Enemy.bound && !data.enemy.Enemy.nonHumanoid) { + KDStunTurns(e.time, false); + KinkyDungeonSendTextMessage(8, TextGet("KDCursedPunishment"), "#9074ab", e.time); + KinkyDungeonMakeNoise(e.dist, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + } + }, + }, + "drawBuffIcons": { + "curseInfo": (e, item, data) => { + if (KDToggleShowAllBuffs) { + let curse = KDGetCurse(item); + let pre = "[" + TextGet("Restraint" + item.name) + "] "; + if (curse && (e.always || KDCurses[curse].activatecurse) && (!e.prereq || KDCheckPrereq(undefined, e.prereq, e, data))) { + data.stats[curse + ',' + item.name] = { + text: pre + TextGet("curseInfo" + e.msg), + count: "", + icon: e.buffSprite || ("curse/" + (KDCurses[curse]?.customIcon_hud || "Curse")), + category: "curse", + color: e.color, bgcolor: "#333333", + priority: e.power || 10, + }; + } + } + }, + }, + "drawSGTooltip": { + "curseInfo": (e, item, data) => { + if (item == data.item || KDRestraint(item)?.Group == data.group) { + let curse = KDGetCurse(item); + let pre = "[" + TextGet("Restraint" + item.name) + "] "; + if (curse && (e.always || KDCurses[curse].activatecurse) && (!e.prereq || KDCheckPrereq(undefined, e.prereq, e, data))) { + data.extraLines.push(pre + TextGet("curseInfo" + e.msg)); + } else { + data.extraLines.push(pre + TextGet("curseInfoDormant")); + } + data.extraLineColor.push(e.color); + } + }, + "simpleMsg": (e, item, data) => { + if (item == data.item || KDRestraint(item)?.Group == data.group) { + data.extraLines.push(TextGet(e.msg)); + data.extraLineColor.push(e.color); + } + }, + "StruggleManaBonus": (e, item, data) => { + if (item == data.item) { + let bonus = KDGetManaBonus(e.mult, e.power, e.threshold, e.threshold, e.threshold); + + data.extraLines.push(TextGet("KDMana" + (bonus >= 0 ? "Bonus" : "Penalty")) + Math.round(100 * bonus) + "%"); + data.extraLineColor.push("#99aaff"); + } + }, + + }, + "perksBonus": { + "spellDamage": (e, _item, _data) => { + KDDamageAmpPerksSpell += e.power; + }, + }, + "calcBlind": { + "DollmakerMask": (_e, _item, data) => { + if (!KinkyDungeonFlags.get("DollmakerGrace")) { + // if item.player == data.player + data.blindness = Math.max(data.blindness, 5); + KinkyDungeonSendTextMessage(2, TextGet("KDDollmakerMaskDim"), "#ff5277", 2, true); + } + }, + }, + + "draw": { + "DollmakerMask": (_e, _item, data) => { + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (altType && altType.spawns === false) return; + for (let enemy of KDMapData.Entities) { + if (enemy.Enemy.tags.escapeddoll + && KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y) < 12) { + KDDraw(kdcanvas, kdpixisprites, enemy.id + "_dolltarg", KinkyDungeonRootDirectory + "UI/DollmakerTarget.png", + (enemy.visual_x - data.CamX - data.CamX_offset - 0.5) * KinkyDungeonGridSizeDisplay, + (enemy.visual_y - data.CamY - data.CamY_offset - 0.5) * KinkyDungeonGridSizeDisplay, + KinkyDungeonSpriteSize * 2, KinkyDungeonSpriteSize * 2, undefined, { + zIndex: 10, + }); + } + } + + }, + }, + "afterPlayerDamage": { + "shatter": (e, item, data) => { + if ((KinkyDungeonShatterDamageTypes.includes(KDDamageEquivalencies[data.type] || data.type) || KinkyDungeonDismantleDamageTypes.includes(KDDamageEquivalencies[data.type] || data.type)) && data.dmg > 0) { + let alreadyDone = KDItemDataQuery(item, "shatter") || 0; + if (alreadyDone < e.count) { + alreadyDone += (KinkyDungeonShatterDamageTypes.includes(KDDamageEquivalencies[data.type] || data.type) ? e.mult : (e.mult * 0.1)) * data.dmg; + KDItemDataSet(item, "shatter", alreadyDone); + KinkyDungeonSendTextMessage(4, TextGet("KDShatterProgress").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } else { + KDRemoveThisItem(item, undefined, undefined, undefined, undefined, true); + KinkyDungeonSendTextMessage(4, TextGet("KDShatter").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } + } + }, + "iceMelt": (e, item, data) => { + if (KinkyDungeonMeltDamageTypes.includes(KDDamageEquivalencies[data.type] || data.type) && data.dmg > 0) { + let alreadyDone = KDItemDataQuery(item, "iceMelt") || 0; + if (alreadyDone < e.count) { + alreadyDone += e.mult * data.dmg; + KDItemDataSet(item, "iceMelt", alreadyDone); + KinkyDungeonSendTextMessage(4, TextGet("KDIceMeltProgress").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } else { + KDCreateEffectTile(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, { + name: "Water", + duration: 12, + }, 8); + KDRemoveThisItem(item, undefined, undefined, undefined, undefined, true); + KinkyDungeonSendTextMessage(4, TextGet("KDIceMelt").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } + } else if (KinkyDungeonFreezeDamageTypes.includes(KDDamageEquivalencies[data.type] || data.type) && data.dmg > 0) { + let alreadyDone = KDItemDataQuery(item, "iceMelt") || 0; + if (alreadyDone > 0) { + alreadyDone = Math.max(0, alreadyDone - e.subMult * data.dmg); + KDItemDataSet(item, "iceMelt", alreadyDone); + KinkyDungeonSendTextMessage(4, TextGet("KDIceMeltCancelProgress").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } + } + }, + "moduleDamage": (e, item, data) => { + if (['acid'].includes(KDDamageEquivalencies[data.type] || data.type) && data.dmg > 0) { + let alreadyDone = KDItemDataQuery(item, "moduleDamage") || 0; + if (alreadyDone < e.count) { + alreadyDone += e.mult * data.dmg; + KDItemDataSet(item, "moduleDamage", alreadyDone); + KinkyDungeonSendTextMessage(4, TextGet("KDDamageModuleProgress").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } else { + KDRemoveThisItem(item, undefined, undefined, undefined, undefined, true); + KinkyDungeonSendTextMessage(4, TextGet("KDDamageModule").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } + } + }, + "tetherDamage": (e, item, data) => { + if (['electric'].includes(KDDamageEquivalencies[data.type] || data.type) && data.dmg > (e.subMult || 0)) { + let alreadyDone = KDItemDataQuery(item, "tetherDamage") || 0; + if (alreadyDone < e.count) { + alreadyDone += e.mult * (data.dmg - (e.subMult || 0)); + KDItemDataSet(item, "tetherDamage", alreadyDone); + KinkyDungeonSendTextMessage(4, TextGet("KDDamageTetherProgress").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } else { + KDCreateEffectTile(KDPlayer().x, KDPlayer().y, { + name: "Sparks", + duration: 2, + }, 2); + KDRemoveThisItem(item, undefined, undefined, undefined, undefined, true); + KinkyDungeonSendTextMessage(4, TextGet("KDDamageTether").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } + } + }, + + "bubblePop": (e, item, data) => { + if (['pierce'].includes(KDDamageEquivalencies[data.type] || data.type) && data.dmg > 0) { + let alreadyDone = KDItemDataQuery(item, "popDamage") || 0; + if (alreadyDone < e.count) { + alreadyDone += e.mult * data.dmg; + KDItemDataSet(item, "popDamage", alreadyDone); + KinkyDungeonMakeNoise(14, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + KinkyDungeonSendTextMessage(4, TextGet("KDDamageBubbleProgress").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } else { + KDRemoveThisItem(item, undefined, undefined, undefined, undefined, true); + KinkyDungeonSendTextMessage(4, TextGet("KDDamageBubble").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } + } + }, + + + "cursedDamage": (e, item, data) => { + if (data.dmg > 0 && !["cold", "soul", "charm"].includes(data.type) && !data.flags?.includes("EnvDamage") && KinkyDungeonStatWill > 0) { + let alreadyDone: number = KDItemDataQuery(item, "cursedDamage") || 0; + let count = KDItemDataQuery(item, "cursedDamageHP") || Math.round(e.power + KDRandom() * e.limit); + KDItemDataSet(item, "cursedDamageHP", count); + let amt = e.mult * data.dmg; + if (KinkyDungeonStatWill < 1) amt *= 1 * KinkyDungeonStatWill; + if (alreadyDone + amt < count) { + alreadyDone += amt; + KDItemDataSet(item, "cursedDamage", alreadyDone); + if (alreadyDone >= KDItemDataQuery(item, "cursedDamageCheckpoint") || 0) { + KinkyDungeonSendTextMessage(4, TextGet("KDcurseDamageDamage"), "#9074ab", 2, false, true); + } + KDItemDataSet(item, "cursedDamageCheckpoint", Math.floor(1 + alreadyDone / 10) * 10); + } else { + KDCreateEffectTile(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, { + name: "Smoke", + duration: 3, + }, 3); + if (item.curse && KDCurses[item.curse]) { + KDCurses[item.curse].remove(item, KDGetRestraintHost(item), true); + } + + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonCurseUnlockCursedDamage").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } + } + }, + "CursedDistract": (e, _item, data) => { + if (data.dmg > 0) { + if (data.dmg >= 3 || !KinkyDungeonPlayerBuffs.CursedDistract) + KinkyDungeonSendTextMessage(2, TextGet("KDCursedDistractActivate"), "#9074ab", e.time); + KDChangeDistraction("stardust", "curse", "dmg", data.dmg * (e.mult || 0), false, 0.1); + KinkyDungeonApplyBuffToEntity(data.player || KinkyDungeonPlayerEntity, + { + id: "CursedDistract", + aura: "#9074ab", + duration: e.time, + power: e.power, + type: "restore_ap", + } + ); + } + }, + }, + "CurseTransform": { + "transform": (e, item, data) => { + // You can call CurseTransform with a forceItems to force one or more item to transform regardless of chance + if (!e.chance || KDRandom() < e.chance || (data.forceItems && data.forceItems.includes(item))) { + KDUpdateItemEventCache = true; + // In this first section we get the various lists + let listname = e.cursetype || KDRestraint(data.curseditem)?.name || "Common"; + if (data.noDupe) { + // TODO make it so no curses are duped + } + let selection = KDGetByWeight(KinkyDungeonGetHexByListWeighted(data.hexlist || listname, KDRestraint(item).name, false, data.hexlevelmin || 0, data.hexlevelmax || 10)); + let curse = KDGetByWeight(KinkyDungeonGetCurseByListWeighted([data.curselist || listname], KDRestraint(item).name, false, 0, 1000)); + + // Load the current inventory variant + let newvariant: KDRestraintVariant = JSON.parse(JSON.stringify(KinkyDungeonRestraintVariants[item.inventoryVariant || item.name] || {})); + /** New restraint to transform to */ + let newRestraint: restraint = null; + if (data.newRestraintTags) { + newRestraint = KinkyDungeonGetRestraint({ tags: [...data.newRestraintTags], }, + KDGetEffLevel(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, "", + false, false, false, undefined, undefined, { + allowedGroups: [KDRestraint(item).Group], + }, undefined, + curse || ""); + } + KDUpdateItemEventCache = true; + // Add the new curse + if (newRestraint) { + newvariant.template = newRestraint.name; + } + newvariant.events = [...(newvariant.events || [])]; + // Trim off the transformation... + if (!data.trimTrigger) + newvariant.events = newvariant.events.filter((event) => { return event.trigger != "CurseTransform"; }); + newvariant.events = [...newvariant.events, ...KDEventHexModular[selection].events({ variant: newvariant })]; + if (data.trimTrigger) + newvariant.events = newvariant.events.filter((event) => { return event.trigger != "CurseTransform"; }); + if (curse) { + newvariant.curse = curse; + } + // Apply the item! + let msg = data.msg || "KDCurseTransform"; + if (newRestraint) { + KinkyDungeonSendTextMessage(10, TextGet(msg + "New") + .replace("OLDITM", TextGet("Restraint" + KDRestraint(item).name)) + .replace("NEWITM", TextGet("Restraint" + newvariant.template)), + "#ffffff", 2); + } else { + KinkyDungeonSendTextMessage(10, TextGet(msg) + .replace("OLDITM", TextGet("Restraint" + KDRestraint(item).name)), + "#ffffff", 2); + } + KDUpdateItemEventCache = true; + KDMorphToInventoryVariant(item, newvariant, "", curse); + + } + }, + }, + "EngageCurse": { + "CursedCollar": (e, item, data) => { + let itemsEligible = []; + for (let inv of KinkyDungeonAllRestraintDynamic()) { + let it = inv.item; + if (it.events?.some((event) => { return event.trigger == "CurseTransform"; })) { + itemsEligible.push(it); + } + } + KinkyDungeonSendEvent("CurseTransform", { curseditem: item, newRestraintTags: e.tags, forceItems: [itemsEligible[Math.floor(KDRandom() * itemsEligible.length)]], trimTrigger: e.trim, msg: e.msg, ...data }); + }, + }, + "cleanse": { + "RemoveAndRevert": (_e, item, data) => { + if (item == data.item) { + let removed = KinkyDungeonRemoveRestraintSpecific(item, true, undefined, + true, undefined, undefined, undefined, true + ); + + if (removed.length > 0) { + KinkyDungeonSendTextMessage(10, TextGet("KDMimicCleanse") + .replace("ITMN1", KDGetItemName(item)) + .replace("ITMN2", KDGetItemNameString(_e.kind)), + "#ffff00", 2); + + let variant = KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]; + if (variant) { + variant.events = variant.events.filter((e) => { + return e.type != _e.type || e.trigger != _e.trigger; + }) + variant.template = _e.kind; + KDGiveInventoryVariant(variant, + variant.prefix, + undefined, undefined, undefined, + variant.suffix, item.faction, + variant.power, 1); + + } else { + // should probably never happen tbh + // TODO Low Priority + } + } + } + + + + + + } + }, + "tick": { + "InvisibleGhosts": (_e, _item, _data) => { + for (let entity of KDMapData.Entities) { + if (entity.Enemy?.tags?.ghost) { + KinkyDungeonSetEnemyFlag(entity, "hidden", 2); + } + } + }, + + + "mimiccurse": (_e, item, _data) => { + if (!_data.delta) return; + if (!(KDGetCurse(item) + && KDCurses[KDGetCurse(item)]?.activatecurse)) return; + if (_e.time) { + let addedTick = KDItemDataQuery(item, "mimiccurse") || 0; + if (!addedTick) + KDItemDataSet(item, "mimiccurse", KinkyDungeonCurrentTick); + if (!addedTick || KinkyDungeonCurrentTick - addedTick < _e.time) return; + } + if ((KDRandom() < _e.chance || 0.1)) { + if (item) { + let tags = _e.tags || KDGetCursedTags(item); + let lock = item.lock || "Purple"; + let curse = item.curse; + let restraintAdd = KinkyDungeonGetRestraint({ tags: [...tags] }, + KDGetEffLevel(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] + || MiniGameKinkyDungeonCheckpoint), true, + curse ? undefined : lock, + undefined, + undefined, + undefined, + undefined, + undefined, + { + allowedGroups: KDRestraint(item) ? [KDRestraint(item).Group] : undefined, + }, + undefined, + curse, + undefined, + undefined, + { + allowLowPower: true, + }); + + if (!restraintAdd) { + restraintAdd = KinkyDungeonGetRestraint({ tags: [...tags] }, + KDGetEffLevel() + 4, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] + || MiniGameKinkyDungeonCheckpoint), true, + curse ? undefined : lock, + undefined, + undefined, + undefined, + undefined, + undefined, + { + allowedGroups: KDRestraint(item) ? KDGetAdjacentGroups(KDRestraint(item).Group) : undefined, + }, + undefined, + curse, + undefined, + undefined, + { + allowLowPower: true, + }); + } + if (restraintAdd) { + KinkyDungeonRemoveRestraintSpecific(item, false, undefined, + true, undefined, undefined, undefined, + true + ); + if (_e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + _e.sfx + ".ogg", undefined, _e.vol); + + KinkyDungeonSendTextMessage(10, TextGet("KDMimicCurseTransform") + .replace("ITMN1", KDGetItemName(item)) + .replace("ITMN2", KDGetItemNameString(restraintAdd.name)), + "#ffff00", 2); + let variant = KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]; + if (variant) { + variant.events = variant.events.filter((e) => { + return e.type != _e.type || e.trigger != _e.trigger; + }) + variant.template = restraintAdd.name; + KDEquipInventoryVariant(variant, + variant.prefix, + 0, true, curse ? undefined : lock, + true, false, + item.faction, true, curse, + undefined, false, + undefined, undefined, + variant.suffix); + + } else { + KinkyDungeonAddRestraintIfWeaker(restraintAdd, + KDGetEffLevel(), true, + curse ? undefined : lock, true, + false, undefined, item.faction, true, + curse); + } + } + + } + } + }, + + + "ShrineUnlockWiggle": (e, item, _data) => { + if (item && KDCurses[e.kind].condition(item)) { + KinkyDungeonSendTextMessage(1, TextGet("KDShrineUnlockWiggle").replace("RSTRNT", KDGetItemName(item)), "#88ff88", 1, false, true); + //KinkyDungeonSetFlag("CurseHintTick", 1 + Math.round(KDRandom() * 4)); + //KDEventData.CurseHintTick = true; + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonLock(item, ""); + } + }, + "RemoveOnEdge": (e, item, data) => { + if (data.delta > 0 && KDIsEdged(KinkyDungeonPlayerEntity)) { + // Increase damage count + let count = KDItemDataQuery(item, e.kind) || 0; + count = Math.max(0, count + e.power); + KDItemDataSet(item, e.kind, count); + // Evaluate damage count + if (!e.count || count >= e.count) { + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonLock(item, ""); + KinkyDungeonSendTextMessage(5, TextGet(e.msg).replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } else if ((!KinkyDungeonFlags.get("CurseHintTick") || KDEventData.CurseHintTick)) { + KDEventData.CurseHintTick = true; + KinkyDungeonSetFlag("CurseHintTick", 1 + Math.round(KDRandom() * 4)); + KinkyDungeonSendTextMessage(5, TextGet(e.msg + "Partial").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } + } + }, + "CursedHeal": (e, item, data) => { + if (item && KDGetCurse(item) == "CursedDamage" && KDIsEdged(KinkyDungeonPlayerEntity)) { + let alreadyDone = KDItemDataQuery(item, "cursedDamage") || 0; + if (alreadyDone > 0) { + alreadyDone = Math.max(0, alreadyDone - e.power * data.delta); + KDItemDataSet(item, "cursedDamage", alreadyDone); + KDItemDataSet(item, "cursedDamageCheckpoint", Math.floor(1 + alreadyDone / 10) * 10); + } + } + }, + "CursedCorruption": (e, item, data) => { + KinkyDungeonSetFlag("CurseTypeCorruption", 2); + if (item && KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) < KDShadowThreshold) { + let buff = KinkyDungeonPlayerBuffs.Corrupted; + let buff2 = KinkyDungeonPlayerBuffs.Corrupted2; + if (!buff || !buff2) { + buff = KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "Corrupted", + aura: "#9074ab", + type: "StatGainWill", + aurasprite: "Null", + power: -0.01, + duration: 9999, infinite: true, + text: "-1%", + events: [ + { trigger: "tick", type: "Corrupted", power: 0.01 }, + ], + }); + buff2 = KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "Corrupted2", + type: "StrugglePower", + power: -0.01, + duration: 9999, infinite: true, + events: [ + { trigger: "tick", type: "Corrupted", power: 0.01 }, + ], + }); + } else { + buff.power = Math.max(e.limit || -0.9, buff.power - 0.01 * (e.power) * data.delta); + buff.text = Math.round(buff.power * 100) + "%"; + buff.duration = 9999; + + buff2.power = Math.max(e.limit || -0.9, buff.power - 0.01 * (e.power) * data.delta); + buff2.text = Math.round(buff.power * 100) + "%"; + buff2.duration = 9999; + } + } + }, + "TriggerCurseTransform": (e, item, data) => { + if (!e.chance || KDRandom() < e.chance) { + // Trigger a transform event. + KinkyDungeonSendEvent("CurseTransform", { curseditem: item, newRestraintTags: e.tags, trimTrigger: e.trim, msg: e.msg, ...data }); + } + }, + + "wardenMelt": (e, item, _data) => { + let alreadyDone = KDItemDataQuery(item, "wardenMelt") || 0; + if (alreadyDone < e.count) { + alreadyDone += e.power; + KDItemDataSet(item, "wardenMelt", alreadyDone); + } else { + KDRemoveThisItem(item, undefined, undefined, undefined, undefined, true); + KinkyDungeonSendTextMessage(4, TextGet("KDWardenMelt").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } + }, + "iceMelt": (e, item, _data) => { + let alreadyDone = KDItemDataQuery(item, "iceMelt") || 0; + if (alreadyDone < e.count) { + alreadyDone += e.power; + KDItemDataSet(item, "iceMelt", alreadyDone); + } else { + KDCreateEffectTile(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, { + name: "Water", + duration: 12, + }, 8); + KDRemoveThisItem(item, undefined, undefined, undefined, undefined, true); + KinkyDungeonSendTextMessage(4, TextGet("KDIceMelt").replace("RestraintName", TextGet("Restraint" + item.name)), "#88ff88", 2); + } + }, + "tetherRegen": (e, item, _data) => { + let alreadyDone = KDItemDataQuery(item, "tetherDamage") || 0; + if (alreadyDone > e.count) { + alreadyDone = Math.max(0, alreadyDone - e.power); + KDItemDataSet(item, "tetherDamage", alreadyDone); + } + }, + "AntiMagicGag": (e, item, _data) => { + let alreadyDone = KDItemDataQuery(item, "manaDrained") || 0; + let multiplier = KDItemDataQuery(item, "manaDrainMultiplier"); + if (!multiplier) { + // Later gags are more powerful + multiplier = (0.2 + 0.8 * (KDGetEffLevel() / (KinkyDungeonMaxLevel - 1))); + KDItemDataSet(item, "manaDrainMultiplier", multiplier); + } + if (alreadyDone < e.count * multiplier) { + if (KinkyDungeonStatMana + KinkyDungeonStatManaPool > 0) { + alreadyDone += Math.min(KinkyDungeonStatMana + KinkyDungeonStatManaPool, e.power); + KDChangeMana(item.name, "restraint", "tick", -e.power); + KDItemDataSet(item, "manaDrained", alreadyDone); + } + } else { + KDChangeMana(item.name, "restraint", "tick", -e.power * multiplier * (e.mult || 0)); + } + // else {KDChangeItemName(item, item.type, "MagicGag2");} + }, + "DollmakerMask": (_e, _item, _data) => { + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (altType && altType.spawns === false) return; + if (KDRandom() < 0.1) { + let count = 0; + for (let en of KDMapData.Entities) { + if (en.Enemy.tags.escapeddoll) count += 1; + } + if (count < 10) { + // Spawn a new doll + let point = KinkyDungeonGetRandomEnemyPoint(true, false, undefined, 6, 10); + if (point) { + let en = DialogueCreateEnemy(point.x, point.y, "DollmakerTarget"); + KDRunCreationScript(en, KDGetCurrentLocation()); + } + } + } + }, + "RemoveOnBuffName": (e, item, _data) => { + if (KinkyDungeonPlayerBuffs[e.kind] && (!e.chance || KDRandom() < e.chance)) { + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonLock(item, ""); + KinkyDungeonSendTextMessage(5, TextGet("KDRemoveOnDmgType").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } + }, + "armorBuff": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + item.name + "Armor", type: "Armor", power: e.power, duration: 2, }); + }, + "spellWardBuff": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + item.name + "SpellResist", type: "SpellResist", power: e.power, duration: 2, }); + }, + "sneakBuff": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + item.name + "Sneak", type: "SlowDetection", power: e.power, duration: 2, }); + }, + "evasionBuff": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + item.name + "Evasion", type: "Evasion", power: e.power, duration: 2, }); + }, + "blockBuff": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + item.name + "Block", type: "Block", power: e.power, duration: 2, }); + }, + "buff": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.original || "") + item.name + e.buff, type: e.buff, power: e.power, duration: 2, + tags: e.tags, + currentCount: e.mult ? -1 : undefined, + maxCount: e.mult, + }); + }, + "RestraintBlock": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + item.name + "Block", type: "RestraintBlock", power: e.power, duration: 2, }); + }, + "ShadowHandTether": (e, item, _data) => { + let player = KDPlayer(); + let enemy = (player.leash?.x && player.leash?.y) ? KinkyDungeonEnemyAt(player.leash.x, player.leash.y) : undefined; + if (KinkyDungeonFlags.get("ShadowDommed") || (KDGameData.KinkyDungeonLeashedPlayer > 0 && KinkyDungeonLeashingEnemy() && enemy != KinkyDungeonLeashingEnemy())) { + return; + } else { + if (player.leash?.x && player.leash?.y && player.leash.restraintID == item.id && player.leash.reason == "ShadowTether" && (!enemy || (e.requiredTag && !enemy.Enemy.tags[e.requiredTag]))) { + KDBreakTether(player); + } else { + // The shadow hands will link to a nearby enemy if possible + for (enemy of KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, e.dist)) { + if (!e.requiredTag || enemy.Enemy.tags[e.requiredTag]) { + KinkyDungeonAttachTetherToEntity(KDRestraint(item).tether || 1.5, enemy, player, "ShadowTether", "#a02fcc", 3, item); + } + } + } + } + }, + "Buff": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.original || "") + item.name + e.buffType, + type: e.buffType, + power: e.power, + tags: e.tags, + currentCount: e.mult ? -1 : undefined, + maxCount: e.mult, + duration: 2 + }); + }, + "PeriodicTeasing": (e, item, data) => { + if (!data.delta) return; + if (!e.chance || KDRandom() < e.chance) { + if (!KDGameData.CurrentVibration && KDIsVibeCD(e.cooldown)) { + KinkyDungeonStartVibration(item.name, "normal", KDGetVibeLocation(item), e.power, e.time, undefined, undefined, undefined, undefined, e.edgeOnly); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + } + }, + "PeriodicDenial": (e, item, data) => { + if (!data.delta) return; + if (!e.chance || KDRandom() < e.chance) { + if (!KDGameData.CurrentVibration && KDIsVibeCD(e.cooldown)) { + KinkyDungeonStartVibration(item.name, "normal", KDGetVibeLocation(item), e.power, e.time, undefined, 12, undefined, undefined, undefined, false, 0.5, 1.0); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } else { + KinkyDungeonAddVibeModifier(item.name, "tease", KDRestraint(item).Group, 0, 9, e.power, false, true, false, false, true, 0.4, 1.0); + } + } + }, + "AccuracyBuff": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.original || "") + item.name + e.type + e.trigger, + type: "Accuracy", + duration: 1, + power: e.power + }); + }, + "spellRange": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.original || "") + item.name + e.type + e.trigger, + type: "spellRange", + duration: 1, + power: e.power + }); + }, + "SneakBuff": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.original || "") + item.name + e.type + e.trigger, + type: "Sneak", + duration: 1, + power: e.power + }); + }, + "EvasionBuff": (e, item, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.original || "") + item.name + e.type + e.trigger, + type: "Evasion", + duration: 1, + power: e.power + }); + }, + "AllyHealingAura": (e, _item, data) => { + if (!data.delta) return; + let healed = false; + for (let enemy of KDMapData.Entities) { + if (KDAllied(enemy) + && (enemy.hp > 0 || KDHelpless(enemy)) + && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) <= e.aoe) { + let origHP = enemy.hp; + enemy.hp = Math.min(enemy.hp + e.power, enemy.Enemy.maxhp); + if (enemy.hp - origHP > 0) { + KinkyDungeonSendFloater(enemy, `+${Math.round((enemy.hp - origHP) * 10)}`, "#44ff77", KDToggles.FastFloaters ? 1 : 3); + healed = true; + } + } + } + if (healed) { + if (e.energyCost) KDChangeCharge(_item.name, "aura", "tick", - e.energyCost);//KinkyDungeonChangeCharge(- e.energyCost); + } + }, + "EnchantedAnkleCuffs2": (_e, item, _data) => { + KinkyDungeonRemoveRestraint(KDRestraint(item).Group, undefined, undefined, undefined, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("EnchantedAnkleCuffs"), 0, true, undefined, false, undefined, undefined, item.faction, true); + }, + "EnchantedAnkleCuffs": (_e, item, _data) => { + if (KDGameData.AncientEnergyLevel <= 0.0000001) { + KinkyDungeonRemoveRestraint(KDRestraint(item).Group, undefined, undefined, undefined, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("EnchantedAnkleCuffs2"), 0, true, undefined, false, undefined, undefined, item.faction, true); + } + }, + "RegenMana": (e, _item, _data) => { + if (!e.limit || KinkyDungeonStatMana / KinkyDungeonStatManaMax < e.limit) { + if (e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KDChangeCharge(_item.name, "restraint", "tick", - e.energyCost);//KinkyDungeonChangeCharge(- e.energyCost); + KDChangeMana(_item.name, "restraint", "tick", e.power); + } + }, + "RegenStamina": (e, _item, _data) => { + if (!e.limit || KinkyDungeonStatStamina / KinkyDungeonStatStaminaMax < e.limit) { + if (e.energyCost && KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax - 0.01) KDChangeCharge(_item.name, "restraint", "tick", - e.energyCost);//KinkyDungeonChangeCharge(- e.energyCost); + KDChangeStamina(_item.name, "restraint", "tick", e.power); + } + }, + "ApplySlowLevelBuff": (e, item, _data) => { + if (item.type === Restraint) { + if (KinkyDungeonPlayerBuffs[item.name + e.type + e.trigger]) delete KinkyDungeonPlayerBuffs[item.name + e.type + e.trigger]; + KinkyDungeonCalculateSlowLevel(0); + let player = KDPlayer(); + if (KinkyDungeonSlowLevel > 0) { + KDSetIDFlag(player.id, "negativeSlowLevel", 2); + } + if (KDIDHasFlag(player.id, "negativeSlowLevel")) { + if (e.energyCost) KDChangeCharge(item.name, "restraint", "tick", - e.energyCost); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.original || "") + item.name + e.type + e.trigger, + type: "SlowLevel", + duration: 2, + power: e.power + }); + } + } + }, + "AlertEnemies": (e, item, data) => { + if (!data.delta) return; + if (!e.chance || KDRandom() < e.chance) { + KinkyDungeonAlert = Math.max(KinkyDungeonAlert, e.power); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonAlertEnemies").replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + "iceDrain": (e, _item, data) => { + if (!data.delta) return; + if (e.power) { + KDChangeMana("ice", "restraint", "tick", e.power); + KDChangeStamina("ice", "restraint", "tick", e.power); + KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonIceDrain"), "lightblue", 2, true); + } + }, + "crystalDrain": (e, _item, data) => { + if (!data.delta) return; + if (e.power) { + KDChangeMana("crystal", "restraint", "tick", e.power); + KDChangeDistraction("crystal", "restraint", "tick", -e.power * KDBuffResist(KinkyDungeonPlayerBuffs, "soul"), false, 0.1); + KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonCrystalDrain"), "lightblue", 2, true); + } + }, + "shadowDrain": (e, _item, data) => { + if (!data.delta) return; + if (e.power) { + KDChangeMana("shadow", "restraint", "tick", e.power); + //KinkyDungeonChangeDistraction(-e.power * 3 * KDBuffResist(KinkyDungeonPlayerBuffs, "soul"), false, 0.1); + KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonShadowDrain"), "lightblue", 2, true); + } + }, + "tickleDrain": (e, _item, data) => { + if (!data.delta) return; + if (KinkyDungeonFlags.get("tickleDrain")) return; + if (e.power) { + KinkyDungeonSetFlag("tickleDrain", 3 + Math.floor(KDRandom() * 4)); + KDChangeDistraction("tickle", "restraint", "tick", -e.power * KDBuffResist(KinkyDungeonPlayerBuffs, "tickle"), false, 0.01); + KinkyDungeonSendTextMessage(0.5, TextGet("KinkyDungeonTickleDrain"), "lightblue", 2, true); + } + }, + "barrelDebuff": (_e, _item, data) => { + if (!data.delta) return; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "Counterbarrel", type: "SlowDetection", duration: 1, power: -10, player: true, enemies: true, endSleep: true, tags: ["SlowDetection", "move", "cast"] }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "Counterbarrel3", type: "Sneak", duration: 1, power: -10, player: true, enemies: true, endSleep: true, tags: ["Sneak", "move", "cast"] }); + }, + "cageDebuff": (_e, _item, data) => { + if (!data.delta) return; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "Countercage", type: "SlowDetection", duration: 1, power: -5, player: true, enemies: true, endSleep: true, tags: ["SlowDetection", "move", "cast"] }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "Countercage2", type: "Sneak", duration: 1, power: -10, player: true, enemies: true, endSleep: true, tags: ["Sneak", "move", "cast"] }); + }, + "callGuard": (_e, _item, data) => { + if (!data.delta) return; + if (KinkyDungeonFlags.get("SuppressGuardCall")) return; + if (!KinkyDungeonFlags.has("GuardCalled") && KDRandom() < 0.25) { + KinkyDungeonSetFlag("GuardCalled", 35); + console.log("Attempting to call guard"); + if (KDMapData.Entities.length < 400) { + console.log("Called guard"); + KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, true); + } + } + }, + "callGuardFurniture": (e, _item, data) => { + if (!data.delta) return; + if (KinkyDungeonFlags.get("SuppressGuardCall")) return; + if (!KinkyDungeonFlags.get("GuardCallBlock")) { + KinkyDungeonSetFlag("GuardCallBlock", 80); + if (!KinkyDungeonFlags.get("GuardCalled")) { + KinkyDungeonSetFlag("GuardCalled", -1); + } else { + KinkyDungeonSendTextMessage(11, TextGet("KDCallForHelpHint"), "#ffffff", 35, true); + } + } + if (!KinkyDungeonFlags.has("GuardCalled") && KDRandom() < (e.chance ? e.chance : 0.05)) { + KinkyDungeonSetFlag("GuardCalled", e.time || 45); + console.log("Attempting to call guard"); + if (KDMapData.Entities.length < 400 || KDGameData.CagedTime > KDMaxCageTime) { + console.log("Called guard"); + let requireTags = null; + if (KinkyDungeonFlags.has("callGuardJailerOnly")) { + requireTags = ["jailer"]; + } + let ee = KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, true, requireTags); + if (ee) { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + ee.x = point.x; + ee.y = point.y; + ee.path = undefined; + } + } + //if (ee && (KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail')) { + ee.IntentAction = 'freeFurniture'; + ee.playWithPlayer = 12; + //if (KDGameData.CagedTime > KDMaxCageTime * 10) { + //} + /*} else { + ee.gx = KinkyDungeonPlayerEntity.x; + ee.gy = KinkyDungeonPlayerEntity.y; + ee.gxx = KinkyDungeonPlayerEntity.x; + ee.gyy = KinkyDungeonPlayerEntity.y; + }*/ + + } + } + let guard = KinkyDungeonJailGuard(); + if (guard && !KinkyDungeonFlags.has("guardTP") && KDGameData.CagedTime > KDMaxCageTime && KDistChebyshev(guard.x - KinkyDungeonPlayerEntity.x, guard.y - KinkyDungeonPlayerEntity.y) > 4) { + DialogueBringSpecific(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, guard); + KinkyDungeonSetFlag("guardTP", 20); + + if (!guard.IntentAction) { + guard.IntentAction = 'freeFurniture'; + guard.playWithPlayer = 12; + } + } + }, + "slimeSpread": (e, _item, data) => { + if (!data.delta) return; + let mult = 0.4 * Math.max(0.25, Math.min(2.0, + KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist")))); + KDEventData.SlimeLevel = Math.max(KDEventData.SlimeLevel, KDEventData.SlimeLevelStart + e.power * mult); + if (KDEventData.SlimeLevel >= 0.99999) { + KDEventData.SlimeLevel = 0; + KDEventData.SlimeLevelStart = -100; + if (KDAdvanceSlime(true, e.restraint || "")) { + KDEventData.SlimeLevel = Math.min(KDEventData.SlimeLevel, 0.5); + KDEventData.SlimeLevelStart = Math.min(KDEventData.SlimeLevelStart, 0.5); + } + } + }, + "livingRestraints": (e, item, data) => { + if (data.delta <= 0) return; + let timer = KDItemDataQuery(item, "livingTimer") || 0; + let freq = KDItemDataQuery(item, "livingFreq") || e.frequencyMax; + if (KDEntityBuffedStat(KDPlayer(), "Disenchant") > 0) { + let val = Math.round(KDEntityBuffedStat(KDPlayer(), "Disenchant") * 20); + if (timer > -val + 3) { + KinkyDungeonSendTextMessage(8, TextGet("KDLivingCollarSuspendDisenchant").replace( + "AMNT", "" + val + ), "#88ff88", 8); + KDItemDataSet(item, "livingTimer", -val); + } + return; + } + if (timer < freq) { + timer = timer + 1; + KDItemDataSet(item, "livingTimer", timer); + return; + } + KDItemDataSet(item, "livingTimer", 0); + + let newtags = []; + if (!KDRestraint(item).cloneTag) { + newtags = e.tags; + } else { + newtags.push(KDRestraint(item).cloneTag); + for (let tag in e.cloneTags) { + newtags.push(KDRestraint(item).cloneTag + tag); + } + } + + let r = KinkyDungeonGetRestraint({ tags: newtags }, 24, "grv", true, undefined); + if (r) { + KinkyDungeonAddRestraintIfWeaker(r, MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, undefined, false, undefined, undefined, item.faction || e.kind, true); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonLivingSpread").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)).replace("+RestraintAdded", TextGet("Restraint" + r.name)), "lightblue", 2); + } + + //Spread accelerates as you get more of that type + let frequency = e.frequencyMax; + + for (let inv of KinkyDungeonAllRestraintDynamic()) { + let found = false; + for (let tag of newtags) { + if (KDRestraint(inv.item).enemyTags[tag] != undefined) { + found = true; + break; + } + } + if (found) { + frequency *= e.frequencyStep; + } + } + frequency = Math.floor(frequency); + + if (frequency < e.frequencyMin) + frequency = e.frequencyMin; + + if (!r) { + frequency = 100; + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonLivingDormant").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightblue", 2); + } + KDItemDataSet(item, "livingFreq", frequency); + + }, + "ApplyConduction": (e, _item, _data) => { + let bb = Object.assign({}, KDConduction); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + }, + }, + "tickAfter": { + "RobeOfChastity": (e, item, _data) => { + let player = !(item.onEntity > 0) ? KDPlayer() : KinkyDungeonFindID(item.onEntity); + if (player && !KDIDHasFlag(player.id, "disableRobeChast")) { + let nearbyTargets = KDNearbyEnemies(player.x, player.y, e.dist).filter( + (en) => { + return (KDistChebyshev(player.x - en.x, player.y - en.y) < 1.5 + || KDIDHasFlag(en.id, "RoCflag")) + && !KDHelpless(en) + && en.hp > 0 + && !en.Enemy?.tags.nobrain // only affects things that can behold it + && KDHostile(en, player.player ? undefined : player); + } + ); + for (let en of nearbyTargets) { + KDCreateEffectTile(en.x, en.y, { + name: "Radiance", + duration: 2, + }, 0); + KDSetIDFlag(en.id, "RoCflag", 4); + KinkyDungeonDamageEnemy(en, { + type: e.damage, + damage: e.power + e.mult * Math.max(0, KinkyDungeonStatDistractionMax - KinkyDungeonStatDistraction), + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + nocrit: true, + }, false, true, undefined, undefined, player, + undefined, undefined, true, false); + } + + if (player.player) { + if (KinkyDungeonStatDistractionLower > 0) { + KDChangeDesire(item.name, "restraint", "tick", KinkyDungeonStatDistractionMax * -0.00025, true); + } + } + } + + }, + "RemoveOnETTag": (e, item, _data) => { + let tiles = KDEffectTileTags(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (e.tags.some((t) => { return tiles[t] != undefined; })) { + // Increase damage count + let count = KDItemDataQuery(item, e.kind) || 0; + count = count + e.power; + KDItemDataSet(item, e.kind, count); + // Evaluate damage count + if (!e.count || count >= e.count) { + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonLock(item, ""); + KinkyDungeonSendTextMessage(5, TextGet("KDRemoveOnDmgType").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } else { + KinkyDungeonSendTextMessage(3, TextGet("KDRemoveOnDmgTypeChill").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2, true); + } + } + }, + "CursedSubmission": (e, _item, _data) => { + if (KinkyDungeonStatWill < 0.1) { + if (KinkyDungeonLastTurnAction == "Move" + && KDEntityBuffedStat(KinkyDungeonPlayerEntity, "ForcedSubmission", true) > 0 + && KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, e.dist, KinkyDungeonPlayerEntity).length == 0) { + // Condition for if you are near an enemy + KinkyDungeonRemoveBuffsWithTag(KinkyDungeonPlayerEntity, ["CursedSubmission"]); + // Submit!!! + KinkyDungeonSendTextMessage(7, TextGet("KDCursedSubmission"), "#9074ab", 3); + KDPlayerEffectRestrain(undefined, e.count, e.tags, "Ghost", false, true, false, false, false); + } else if (KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, + KDEntityBuffedStat(KinkyDungeonPlayerEntity, "ForcedSubmission") ? e.dist : 1.5, + KinkyDungeonPlayerEntity).filter((en) => { return en.Enemy?.bound && !en.Enemy.nonHumanoid; }).length > 0) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "ForcedSubmission", + type: "ForcedSubmission", + aura: "#ff5277", + aurasprite: "Null", + power: 1, + duration: 2, + text: " ", + tags: ["CursedSubmission"], + }); + } + } + }, + }, + "calcDisplayDamage": { + "BoostDamage": (e, _item, data) => { + if (KDCheckPrereq(null, e.prereq, e, data)) { + data.buffdmg = Math.max(0, data.buffdmg + e.power); + } + }, + "AmpDamage": (e, _item, data) => { + if (KDCheckPrereq(null, e.prereq, e, data)) { + data.buffdmg = Math.max(0, data.buffdmg + (KinkyDungeonPlayerDamage.damage || 0) * e.power); + } + }, + }, + "remove": { + "slimeStop": (_e, item, data) => { + if (data.item === item) KDEventData.SlimeLevel = 0; + }, + "unlinkItem": (e, item, data) => { + if (data.item === item && !data.add && !data.shrine) { + console.log("Deprecated function"); + console.log(Event, e, item, data); + console.trace(); + } + }, + }, + "postUnlock": { + "RequireLocked": (_e, item, data) => { + if (data.item == item && !item.lock && !item.curse) { + KinkyDungeonRemoveRestraintSpecific(item, true, false, false); + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveCuffsNoLock") + .replace("RSTNME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } + }, + }, + "postRemoval": { + "replaceItem": (e, item, data) => { + if (data.Character != KinkyDungeonPlayer) return; + if (data.item === item && !data.add && !data.shrine && e.list + && (!e.requireFlag || KinkyDungeonFlags.get(e.requireFlag) + ) + ) { + let added = false; + for (let restraint of e.list) { + if (KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(restraint), + e.power, true, + e.keepLock ? item.lock : e.lock, data.keep, undefined, undefined, item.faction)) { + added = true; + } + } + if (added) { + KinkyDungeonSendTextMessage(5, TextGet(e.msg) + .replace("RSTNME", TextGet("Restraint" + item.name)), "#ffffff", 2); + } + } + }, + "RequireHogtie": (_e, item, data) => { + if (data.Character != KinkyDungeonPlayer) return; + if (!data.add && data.item !== item && KDRestraint(item).Group) { + let upper = false; + let lower = false; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("HogtieUpper"))) { + upper = true; + break; + } else if (inv.dynamicLink) { + let link = inv.dynamicLink; + // Recursion thru to make sure we have an armbinder buried in there... somewhere + for (let i = 0; i < 20; i++) { + if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes("HogtieUpper"))) { + upper = true; + break; + } + if (link.dynamicLink) link = link.dynamicLink; + else i = 200; + } + } + } + + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("HogtieLower"))) { + lower = true; + break; + } else if (inv.dynamicLink) { + let link = inv.dynamicLink; + // Recursion thru to make sure we have an armbinder buried in there... somewhere + for (let i = 0; i < 20; i++) { + if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes("HogtieLower"))) { + lower = true; + break; + } + if (link.dynamicLink) link = link.dynamicLink; + else i = 200; + } + } + } + if (!upper || !lower) { + KinkyDungeonRemoveRestraintSpecific(item, false, false, false); + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveHogtie"), "lightgreen", 2); + } + } + }, + "RequireBaseArmCuffs": (_e, item, data) => { + if (data.Character != KinkyDungeonPlayer) return; + if (!data.add && data.item !== item && KDRestraint(item).Group) { + let cuffsbase = false; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("ArmCuffsBase"))) { + cuffsbase = true; + break; + } else if (inv.dynamicLink) { + let link = inv.dynamicLink; + // Recursion thru to make sure we have an armbinder buried in there... somewhere + for (let i = 0; i < 20; i++) { + if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes("ArmCuffsBase"))) { + cuffsbase = true; + break; + } + if (link.dynamicLink) link = link.dynamicLink; + else i = 200; + } + } + } + if (!cuffsbase) { + KinkyDungeonRemoveRestraintSpecific(item, false, false, false); + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveCuffs"), "lightgreen", 2); + } + } + }, + "RequireTag": (e, item, data) => { + if (data.Character != KinkyDungeonPlayer) return; + if (!data.add && data.item !== item && KDRestraint(item).Group) { + let cuffsbase = false; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes(e.requiredTag))) { + cuffsbase = true; + break; + } else if (inv.dynamicLink) { + let link = inv.dynamicLink; + // Recursion thru to make sure we have an armbinder buried in there... somewhere + for (let i = 0; i < 20; i++) { + if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes(e.requiredTag))) { + cuffsbase = true; + break; + } + if (link.dynamicLink) link = link.dynamicLink; + else i = 200; + } + } + } + if (!cuffsbase) { + KinkyDungeonRemoveRestraintSpecific(item, false, false, false); + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveCuffs" + e.requiredTag), "lightgreen", 2); + } + } + }, + "RequireCollar": (_e, item, data) => { + if (data.Character != KinkyDungeonPlayer) return; + if (!data.add && data.item !== item && KDRestraint(item).Group) { + let collar = false; + if (data.item && KDRestraint(data.item)?.Group == "ItemNeck") { + KinkyDungeonPlayerTags = KinkyDungeonUpdateRestraints(); // We update the restraints but no time drain on batteries, etc + } + if (KinkyDungeonPlayerTags.get("Collars")) collar = true; + if (!collar) { + KinkyDungeonRemoveRestraint(KDRestraint(item).Group, false, false, false); + } + } + }, + "RequireBaseAnkleCuffs": (_e, item, data) => { + if (data.Character != KinkyDungeonPlayer) return; + if (!data.add && data.item !== item && KDRestraint(item).Group) { + let cuffsbase = false; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("AnkleCuffsBase"))) { + cuffsbase = true; + break; + } else if (inv.dynamicLink) { + let link = inv.dynamicLink; + // Recursion thru to make sure we have an armbinder buried in there... somewhere + for (let i = 0; i < 20; i++) { + if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes("AnkleCuffsBase"))) { + cuffsbase = true; + break; + } + if (link.dynamicLink) link = link.dynamicLink; + else i = 200; + } + } + } + if (!cuffsbase) { + KinkyDungeonRemoveRestraintSpecific(item, false, false, false); + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveCuffs"), "lightgreen", 2); + } + } + }, + "RequireBaseLegCuffs": (_e, item, data) => { + if (data.Character != KinkyDungeonPlayer) return; + if (!data.add && data.item !== item && KDRestraint(item).Group) { + let cuffsbase = false; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("LegCuffsBase"))) { + cuffsbase = true; + break; + } else if (inv.dynamicLink) { + let link = inv.dynamicLink; + // Recursion thru to make sure we have an armbinder buried in there... somewhere + for (let i = 0; i < 20; i++) { + if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes("LegCuffsBase"))) { + cuffsbase = true; + break; + } + if (link.dynamicLink) link = link.dynamicLink; + else i = 200; + } + } + } + if (!cuffsbase) { + KinkyDungeonRemoveRestraintSpecific(item, false, false, false); + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveCuffs"), "lightgreen", 2); + } + } + }, + "collarModule": (_e, item, data) => { + if (data.Character != KinkyDungeonPlayer) return; + if (!data.add && data.item !== item && KDRestraint(item).Group) { + let collar = false; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("Collars"))) { + collar = true; + break; + } else if (inv.dynamicLink) { + let link = inv.dynamicLink; + // Recursion thru to make sure we have a collar buried in there... somewhere + for (let i = 0; i < 30; i++) { + if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes("Collars"))) { + collar = true; + break; + } + if (link.dynamicLink) link = link.dynamicLink; + else i = 30; + } + } + } + if (!collar) { + KinkyDungeonRemoveRestraint(KDRestraint(item).Group, true, false, false); + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveCollarModule"), "lightgreen", 2); + } + } + }, + "armbinderHarness": (_e, item, data) => { + if (data.Character != KinkyDungeonPlayer) return; + if (!data.add && data.item !== item && KDRestraint(item).Group) { + let armbinder = false; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).shrine && (KDRestraint(inv).shrine.includes("Armbinders") || KDRestraint(inv).shrine.includes("Boxbinders"))) { + armbinder = true; + break; + } else if (inv.dynamicLink) { + let link = inv.dynamicLink; + // Recursion thru to make sure we have an armbinder buried in there... somewhere + for (let i = 0; i < 10; i++) { + if (link && KDRestraint(link).shrine && (KDRestraint(link).shrine.includes("Armbinders") || KDRestraint(link).shrine.includes("Boxbinders"))) { + armbinder = true; + break; + } + if (link.dynamicLink) link = link.dynamicLink; + else i = 10; + } + } + } + if (!armbinder) { + KinkyDungeonRemoveRestraint(KDRestraint(item).Group, true, false, false); + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveArmbinderHarness"), "lightgreen", 2); + } + } + } + }, + "tryOrgasm": { + "CursedDenial": (e, _item, data) => { + if (KinkyDungeonStatWill > 0.1) { + if (data.auto <= 1) + KDChangeWill("stardust", "curse", "tryOrgasm", -e.power); + } else { + data.chance *= 0; + } + }, + "DivineBelt": (_e, _item, data) => { + data.chance *= 0; + KinkyDungeonEndVibration(); + KinkyDungeonSendTextMessage(6, TextGet("KDDivineBeltDeny"), "#ffff88", 4); + }, + "DivineBelt2": (_e, _item, data) => { + data.chance *= 0; + KinkyDungeonSendTextMessage(6, TextGet("KDDivineBelt2Deny"), "#ffff88", 4); + }, + "ForcedOrgasmPower": (e, item, data) => { + if (KDGameData.CurrentVibration) { + let locations = KDSumVibeLocations(); + if (KDGetVibeLocation(item)?.some((str) => { + return locations.includes(str); + })) + data.eventBonus += e.power; + } + }, + "ForcedOrgasmMin": (e, item, data) => { + if (KDGameData.CurrentVibration) { + let locations = KDSumVibeLocations(); + if (KDGetVibeLocation(item)?.some((str) => { + return locations.includes(str); + })) + if (data.amount < e.power) { + data.amount = e.power; + KinkyDungeonSendTextMessage(6, TextGet("KDForcedOrgasmMin"), "#ffaaaa", 5); + } + } + + }, + }, + "hit": { + "linkItem": (e, item, data) => { + if ((data.attack && data.attack.includes("Bind") && (!data.enemy || data.enemy.Enemy.bound) && !data.attack.includes("Suicide"))) { + KDLinkItemEvent(e, item, data); + } + }, + }, + "beforePlayerDamage": { + "RemoveOnDmg": (e, item, data) => { + let t = data.type; + if (KDDamageEquivalencies[data.type]) t = KDDamageEquivalencies[data.type]; + if (data.type && t == e.damage && data.dmg) { + if (!e.power || data.dmg >= e.power) { + // Increase damage count + let count = KDItemDataQuery(item, e.kind) || 0; + count = count + Math.max((data.dmg * (e.mult || 1)) || 1, 1); + KDItemDataSet(item, e.kind, count); + // Evaluate damage count + if (!e.count || count >= e.count) { + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonLock(item, ""); + KinkyDungeonSendTextMessage(5, TextGet("KDRemoveOnDmgType").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } else { + KinkyDungeonSendTextMessage(5, TextGet("KDRemoveOnDmgTypePartial").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); + } + } + } + }, + "bounce": (e, item, data) => { + if (data.type && data.type != "pierce" && data.type != "glue" && !KinkyDungeonTeaseDamageTypes.includes(data.type) && data.dmg) { + let chance = e.chance ? e.chance * data.dmg : 1.0; + if (item && KDRandom() < chance) { + let prereq = KDEventPrereq(e.requiredTag); + if (prereq) { + let point = KinkyDungeonGetNearbyPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, undefined, true, true); + if (point && !KinkyDungeonEnemyAt(point.x, point.y)) { + KDMovePlayer(point.x, point.y, false, false, true, true); + KinkyDungeonSendTextMessage(5, TextGet("KDBubbleBounce"), "#ffffff", 2); + + } + if (KDSoundEnabled() && e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); + } + } + } + }, + "linkItemOnDamageType": (e, item, data) => { + if (data.type && data.type == e.damage && data.dmg) { + let subMult = 1; + let chance = e.chance ? e.chance : 1.0; + if (item && (e.restraint || KDRestraint(item).Link) && KDRandom() < chance * subMult) { + let prereq = KDEventPrereq(e.requiredTag); + if (prereq) { + let newRestraint = KinkyDungeonGetRestraintByName(e.restraint || KDRestraint(item).Link); + //KinkyDungeonLinkItem(newRestraint, item, item.tightness, ""); + if ( + KinkyDungeonAddRestraintIfWeaker(newRestraint, item.tightness, true, "", false, undefined, undefined, item.faction, true)) { + if (KDSoundEnabled() && e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); + } + + } + } + } + }, + "lockItemOnDamageType": (e, item, data) => { + if (data.type && data.type == e.damage && data.dmg && !KDGetCurse(item)) { + let subMult = 1; + let chance = e.chance ? e.chance : 1.0; + if (item && KinkyDungeonGetLockMult(e.lock) > KinkyDungeonGetLockMult(item.lock) && KDRandom() < chance * subMult) { + let prereq = KDEventPrereq(e.requiredTag); + if (prereq) { + KinkyDungeonLock(item, e.lock); + } + } + } + }, + }, + "apply": { + "FilterLayer": (e, item, data) => { + if (item?.id == data.item?.id) { + data.Filters[e.kind] = e.filter; + } + }, + }, + "missPlayer": { + "EnergyCost": (e, _item, _data) => { + if (e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KDChangeCharge(_item.name, "restraint", "missPlayer", - e.energyCost); + } + }, + "missEnemy": { + "EnergyCost": (e, _item, _data) => { + if (e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KDChangeCharge(_item.name, "restraint", "missEnemy", - e.energyCost); + } + }, + "calcEvasion": { + "HandsFree": (e, _item, data) => { + if (data.flags.KDEvasionHands) { + data.flags.KDEvasionHands = false; + if (data.cost && e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KDChangeCharge(_item.name, "restraint", "enemyEvade", - e.energyCost); + } + }, + "ArmsFree": (e, _item, data) => { + if (data.flags.KDEvasionArms) { + data.flags.KDEvasionArms = false; + if (data.cost && e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KDChangeCharge(_item.name, "restraint", "enemyEvade", - e.energyCost); + } + }, + "BlindFighting": (e, _item, data) => { + if (data.flags.KDEvasionSight) { + data.flags.KDEvasionSight = false; + if (data.cost && e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KDChangeCharge(_item.name, "restraint", "enemyEvade", - e.energyCost); + } + } + }, + "beforePlayerAttack": { + "BoostDamage": (e, _item, data) => { + if (KDCheckPrereq(data.target, e.prereq, e, data)) { + data.buffdmg = Math.max(0, data.buffdmg + e.power); + if (e.energyCost) KDChangeCharge(_item.name, "restraint", "attack", - e.energyCost); + } + }, + "AmpDamage": (e, _item, data) => { + if (KDCheckPrereq(data.target, e.prereq, e, data)) { + data.buffdmg = Math.max(0, data.buffdmg + (data.Damage?.damage || KinkyDungeonPlayerDamage.damage || 0) * e.power); + if (e.energyCost) KDChangeCharge(_item.name, "restraint", "attack", - e.energyCost); + } + }, + }, + "beforeDamage": { + "ModifyDamageFlat": (e, _item, data) => { + if (data.damage > 0) { + if (!e.chance || KDRandom() < e.chance) { + data.damage = Math.max(data.damage + e.power, 0); + if (e.energyCost) KDChangeCharge(_item.name, "restraint", "playerDmg", - e.energyCost); + } + } + }, + }, + "beforeDamageEnemy": { + "MultiplyDamageStealth": (e, _item, data) => { + if (data.dmg > 0 && data.enemy && KDHostile(data.enemy) && !data.enemy.aware) { + if (!e.chance || KDRandom() < e.chance) { + let dmg = Math.max(0, Math.min(data.enemy.hp, data.dmg)); + if (e.energyCost && e.power > 1) KDChangeCharge(_item.name, "restraint", "enemyDmg", - e.energyCost * dmg * (e.power - 1)); + data.dmg = Math.max(data.dmg * e.power, 0); + } + } + }, + "AddDamageStealth": (e, _item, data) => { + if (data.dmg > 0 && data.enemy && KDHostile(data.enemy) && !data.enemy.aware) { + if (!e.chance || KDRandom() < e.chance) { + if (e.energyCost && e.power > 1) KDChangeCharge(_item.name, "restraint", "enemyDmg", - e.energyCost * (e.power - 1)); + data.dmg = Math.max(data.dmg + e.power, 0); + } + } + }, + "MultiplyDamageStatus": (e, _item, data) => { + if (data.dmg > 0 && data.enemy && KDHostile(data.enemy) && (KinkyDungeonHasStatus(data.enemy))) { + if (!e.chance || KDRandom() < e.chance) { + let dmg = Math.max(0, Math.min(data.enemy.hp, data.dmg)); + if (e.energyCost && e.power > 1) KDChangeCharge(_item.name, "restraint", "enemyDmg", - e.energyCost * dmg * (e.power - 1)); + data.dmg = Math.max(data.dmg * e.power, 0); + } + } + }, + "MultiplyDamageMagic": (e, _item, data) => { + if (data.dmg > 0 && data.incomingDamage && !KinkyDungeonMeleeDamageTypes.includes(data.incomingDamage.type)) { + if (!e.chance || KDRandom() < e.chance) { + let dmg = Math.max(0, Math.min(data.enemy.hp, data.dmg)); + if (e.energyCost && e.power > 1) KDChangeCharge(_item.name, "restraint", "enemyDmg", - e.energyCost * dmg * (e.power - 1)); + data.dmg = Math.max(data.dmg * e.power, 0); + } + } + } + }, + "calcSneak": { + FactionStealth: (e, _item, data) => { + if (data.enemy && (!e.kind || KDGetFaction(data.enemy) == e.kind)) { + data.sneakThreshold += e.power || 0; + data.visibility *= e.mult != undefined ? e.mult : 1; + } + } + + }, + "defeat": { + "linkItem": (e, item, _data) => { + if (item && (e.restraint || KDRestraint(item).Link) && (KDRandom() < e.chance)) { + let newRestraint = KinkyDungeonGetRestraintByName(e.restraint || KDRestraint(item).Link); + KinkyDungeonAddRestraintIfWeaker(newRestraint, item.tightness, true, "", false, undefined, undefined, item.faction, true); + //KinkyDungeonLinkItem(newRestraint, item, item.tightness, ""); + } + }, + "Kittify": (_e, item, _data) => { + // get defeat, upgrade suit + KinkyDungeonRemoveRestraint("ItemArms", false, false, true, false); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("KittyPetSuit"), 15, undefined, undefined, undefined, undefined, undefined, item.faction, true); + // leash if collared + let collared = KinkyDungeonPlayerTags.get("Collars"); + if (collared != undefined) { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BasicLeash"), 1, false, "Red", undefined, undefined, undefined, item.faction, true); + } + }, + }, + "struggle": { + "crotchrope": (_e, _item, data) => { + if (data.restraint && data.restraint.type === Restraint && KDRestraint(data.restraint).crotchrope && data.struggleType === "Struggle" && data.struggleType === "Remove") { + KDChangeDistraction("player", "crotchrope", "struggle", 1, false, 0.5); + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonCrotchRope").replace("RestraintName", TextGet("Restraint" + data.restraint.name)), "pink", 3); + } + }, + "VibeOnStruggle": (e, item, data) => { + if ((!e.chance || KDRandom() < e.chance) && data.struggleType === "Struggle") { + if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); + + KinkyDungeonSendEvent("punish", Object.assign({ + item: item, + type: "struggle", + kind: e.kind || "low", + }, data)); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + "celestialRopePunish": (_e, item, data) => { + if (data.restraint && item === data.restraint) { + KDChangeDistraction("celestial", "restraint", "struggle", 3); + KDChangeMana("celestial", "restraint", "struggle", -1); + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind + 1, 2); + + if (!StandalonePatched) + for (let A = 0; A < KinkyDungeonPlayer.Appearance.length; A++) { + if (KinkyDungeonPlayer.Appearance[A].Asset.Group.Name === "Eyes" || KinkyDungeonPlayer.Appearance[A].Asset.Group.Name === "Eyes2") { + let property = KinkyDungeonPlayer.Appearance[A].Property; + if (!property || property.Expression !== "Surprised") { + KinkyDungeonPlayer.Appearance[A].Property = { Expression: "Surprised" }; + KDRefresh = true; + } + } + } + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonCelestialPunish" + Math.floor(KDRandom() * 3)), "#ff5277", 2); + } + }, + "crystalPunish": (_e, item, data) => { + if (data.restraint && item === data.restraint) { + KDChangeDistraction("crystal", "restraint", "punish", 1, false, 0.1); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonCrystalPunish" + Math.floor(KDRandom() * 3)), "#ff5277", 2); + } + }, + "PunishPlayer": (e, item, data) => { + if (data.restraint && item === data.restraint) { + if (KDRandom() < e.chance || (KDGameData.WarningLevel > (e.count || 2) && KDRandom() < e.warningchance)) { + if (e.stun && KDGameData.WarningLevel > (e.count || 2)) { + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints - 1); // This is to prevent stunlock while slowed heavily + } + KDGameData.WarningLevel += 1; + KinkyDungeonDealDamage({ damage: e.power, type: e.damage }); + KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer") + (KDGameData.WarningLevel > (e.count || 2) ? "Harsh" : "")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + } + } + }, + "beforeStruggleCalc": { + "UniversalSolvent": (e, item, data) => { + if (item == data.restraint && ( + data.struggleType == "Struggle" + || + data.struggleType == "Cut" + )) { + data.escapePenalty -= e.power; + } + }, + "StruggleManaBonus": (e, item, data) => { + if (item == data.restraint) { + let bonus = KDGetManaBonus(e.mult, e.power, e.threshold, e.threshold, e.threshold); + + data.escapeChance += bonus; + + if (!data.query) { + let msg = e.msg ? e.msg : ("KDStruggleMana" + (bonus >= 0 ? "Bonus" : "Penalty")); + if (msg) { + KinkyDungeonSendTextMessage(5, TextGet(msg).replace("RestraintName", TextGet("Restraint" + data.restraint.name)), bonus > 0 ? "#88ff88" : "#ff5277", 2); + } + } + } + }, + "boostWater": (e, item, data) => { + if (item == data.restraint && KinkyDungeonPlayerBuffs.Drenched && KinkyDungeonPlayerBuffs.Drenched.duration > 0) { + data.escapeChance += e.power; + + if (!data.query) { + let msg = e.msg ? e.msg : "KinkyDungeonDrenchedSlimeBuff"; + if (msg) { + KinkyDungeonSendTextMessage(5, TextGet(msg).replace("RestraintName", TextGet("Restraint" + data.restraint.name)), "lightgreen", 2); + } + } + } + }, + "ShockForStruggle": (e, item, data) => { + if (!data.query) { + if (data.struggleType === "Struggle") { + if (KDRandom() < e.chance || (KDGameData.WarningLevel > (e.count || 2) && KDRandom() < e.warningchance) || data.group == "ItemNeck") { + + data.escapePenalty += e.bind ? e.bind : 0.1; + KDGameData.WarningLevel += 1; + if (KinkyDungeonStatsChoice.get("Estim")) { + if (e.stun && KDGameData.WarningLevel > (e.count || 2)) { + KDChangeDistraction("shock", "restraint", "punish", 5, false, 0.5); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints - 1); // This is to prevent stunlock while slowed heavily + } + KinkyDungeonDealDamage({ damage: e.power, type: "estim", src: "shock", srctype: "restraint", srctrig: "struggle" },); + KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayerEstim") + (KDGameData.WarningLevel > (e.count || 2) ? "Harsh" : "")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Estim.ogg"); + } else { + if (e.stun && KDGameData.WarningLevel > (e.count || 2)) { + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints - 1); // This is to prevent stunlock while slowed heavily + } + KinkyDungeonDealDamage({ damage: e.power, type: e.damage, src: "shock", srctype: "restraint", srctrig: "struggle" }); + KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer") + (KDGameData.WarningLevel > (e.count || 2) ? "Harsh" : "")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + + } + } + } + }, + "elbowCuffsBlock": (e, item, data) => { + + if (data.restraint && item != data.restraint && !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && KDRestraint(data.restraint).shrine.includes("ArmCuffsBase")) { + data.escapePenalty += e.power ? e.power : 1.0; + if (!data.query) + KinkyDungeonSendTextMessage(10, TextGet("KDElbowCuffsBlock" + Math.floor(KDRandom() * 3)), "#ff5277", 2); + } + }, + "vibeStruggle": (_e, item, data) => { + if (KinkyDungeonHasCrotchRope && !KinkyDungeonPlayerTags.get("ChastityLower") && data.restraint && item == data.restraint && !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && (KinkyDungeonIsHandsBound(false, false, 0.45) || KinkyDungeonIsArmsBound())) { + data.escapePenalty += data.escapeChance; + if (!data.query) + KinkyDungeonSendTextMessage(10, TextGet("KDCrotchRopeBlock" + Math.floor(KDRandom() * 3)), "#ff5277", 2); + } + }, + "struggleDebuff": (e, item, data) => { + if (e.StruggleType == data.struggleType && data.restraint && item != data.restraint && KDRestraint(data.restraint)?.shrine?.includes(e.requiredTag)) { + data.escapePenalty += e.power; + if (!data.query) + if (e.msg) + KinkyDungeonSendTextMessage(2, TextGet(e.msg), "#ff5277", 2); + } + }, + "obsidianDebuff": (e, item, data) => { + if (data.restraint && data.struggleType === "Struggle" && item != data.restraint && !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && KDRestraint(data.restraint).shrine.includes("Obsidian")) { + data.escapePenalty += e.power ? e.power : 0.075; + if (!data.query) + KinkyDungeonSendTextMessage(5, TextGet("KDObsidianDebuff" + Math.floor(KDRandom() * 3)), "#8800aa", 2, true); + } + }, + "latexDebuff": (e, item, data) => { + if (data.restraint && data.struggleType === "Struggle" && item != data.restraint && KDRestraint(data.restraint).shrine.includes("Latex")) { + data.escapePenalty += e.power ? e.power : 0.075; + if (!data.query) + KinkyDungeonSendTextMessage(5, TextGet("KDLatexDebuff" + Math.floor(KDRandom() * 3)), "#38a2c3", 2, true); + } + }, + + + "ropeDebuff": (e, item, data) => { + if (data.restraint && data.struggleType === "Struggle" && item != data.restraint && e.requireTags?.some((tag) => { return KDRestraint(data.restraint).shrine.includes(tag); })) { + data.escapePenalty += e.power ? e.power : 0.075; + if (!data.query) + KinkyDungeonSendTextMessage(5, TextGet("KDRopeDebuff" + Math.floor(KDRandom() * 3)).replace("RSTRN", TextGet("Restraint" + item.name)), "#e0af88", 2, true); + } + }, + + "shadowBuff": (_e, item, data) => { + if (data.restraint && data.struggleType === "Struggle" && item == data.restraint) { + + let brightness = KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (brightness > 4) { + data.escapeChance += 0.1 * brightness; + if (!data.query) + KinkyDungeonSendTextMessage(7, TextGet("KDShadowBuff"), "#99ff99", 2, true); + } + + + } + }, + "wristCuffsBlock": (e, item, data) => { + if (data.restraint && item != data.restraint && !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && KDRestraint(data.restraint).shrine.includes("ArmCuffsBase")) { + data.escapePenalty += e.power ? e.power : 0.075; + if (!data.query) + KinkyDungeonSendTextMessage(5, TextGet("KDWristCuffsBlock" + Math.floor(KDRandom() * 3)), "#ff5277", 2); + } + }, + }, + "sprint": { + "NippleWeights": (e, item, _data) => { + if (!e.chance || KDRandom() < e.chance * (KinkyDungeonSlowLevel > 1 ? 2 : 1)) { + if (e.msg) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#ff8888", 1, false, true); + + KDChangeDistraction("nipple", "restraint", "sprint", e.power, true, e.mult || 0.4); + + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + "MotionSensitive": (e, item, data) => { + if (!e.chance || KDRandom() < e.chance) { + if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); + + KinkyDungeonSendEvent("punish", Object.assign({ + item: item, + type: "sprint", + kind: e.kind || "low", + }, data)); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + }, + "playerAttack": { + + "DestroyDirt": (e, _item, data) => { + if (data.enemy && !data.miss && !data.disarm && data.enemy.Enemy?.tags?.dirt) { + if ((!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + addBind: e.addBind, + bindType: e.bindType, + }, false, e.power <= 0.1, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + } + }, + "DestroyMold": (e, _item, data) => { + if (data.enemy && !data.miss && !data.disarm && data.enemy.Enemy?.tags?.mold) { + if ((!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + addBind: e.addBind, + bindType: e.bindType, + }, false, e.power <= 0.1, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + } + }, + "ElementalEffect": (e, _item, data) => { + if (data.enemy && !data.miss && !data.disarm) { + if ((!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + addBind: e.addBind, + bindType: e.bindType, + }, false, e.power <= 0.1, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + } + }, + "ElementalEcho": (e, _item, data) => { + if (data.enemy && !data.miss && !data.disarm) { + if ((!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power * (data.damage.damage || KinkyDungeonPlayerDamage.damage || 0), + time: e.time, + bind: e.bind, + distract: e.distract, + addBind: e.addBind, + bindType: e.bindType, + }, false, e.power <= 0.1, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + } + }, + "MotionSensitive": (e, item, data) => { + if (!e.chance || KDRandom() < e.chance) { + if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); + + KinkyDungeonSendEvent("punish", Object.assign({ + item: item, + type: "attack", + kind: e.kind || "low", + }, data)); + + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + "NippleWeights": (e, item, _data) => { + if (!e.chance || KDRandom() < e.chance) { + if (!KinkyDungeonPlayerDamage?.noHands && KinkyDungeonCanUseWeapon(true, undefined, KinkyDungeonPlayerDamage)) { + if (e.msg) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#ff8888", 1, false, true); + + KDChangeDistraction("nipple", "restraint", "attack", e.power, true, e.mult || 0.4); + + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + } + }, + "ShadowHeel": (e, _item, data) => { + if (data.targetX && data.targetY && !(data.enemy && data.enemy.Enemy && KDAllied(data.enemy))) { + KinkyDungeonCastSpell(data.targetX, data.targetY, KinkyDungeonFindSpell("HeelShadowStrike", true), undefined, undefined, undefined); + if (e.energyCost) KDChangeCharge("ancient", "restraint", "attack", - e.energyCost); + } + }, + "AlertEnemies": (e, item, data) => { + if (KDAlertCD < 1 && data.enemy && (!e.chance || KDRandom() < e.chance)) { // (data.damage && data.damage.damage && data.enemy.hp > data.enemy.Enemy.maxhp - data.damage.damage*2 - 1) + KinkyDungeonAlert = Math.max(KinkyDungeonAlert, e.power); + KDAlertCD = 5; + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonAlertEnemies").replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + "PunishPlayer": (e, item, data) => { + if (item.type === Restraint && data.targetX && data.targetY && data.enemy && !(data.enemy && data.enemy.Enemy && KDAllied(data.enemy)) && (!KinkyDungeonHiddenFactions.has(KDGetFaction(data.enemy)) || KDGetFaction(data.enemy) == "Enemy")) { + if (KDRandom() < e.chance || (KDGameData.WarningLevel > (e.count || 2) && KDRandom() < e.warningchance)) { + if (e.stun && KDGameData.WarningLevel > (e.count || 2)) { + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints - 1); // This is to prevent stunlock while slowed heavily + } + KDGameData.WarningLevel += 1; + KinkyDungeonDealDamage({ damage: e.power, type: e.damage }); + KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer") + (KDGameData.WarningLevel > (e.count || 2) ? "Harsh" : "")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + } + }, + "cursePunish": (e, item, data) => { + if (item.type === Restraint && data.targetX && data.targetY && data.enemy && !(data.enemy && data.enemy.Enemy && KDAllied(data.enemy)) && (!KinkyDungeonHiddenFactions.has(KDGetFaction(data.enemy)) || KDGetFaction(data.enemy) == "Enemy")) { + if (!e.chance || KDRandom() < e.chance) { + if (e.stun) { + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints - 1); // This is to prevent stunlock while slowed heavily + } + KinkyDungeonDealDamage({ damage: e.power, type: e.damage }); + if (!data.cursePunish) { + KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + data.cursePunish = true; + } + } + }, + "armorNoise": (e, item, data) => { + if (item.type === Restraint && data.targetX && data.targetY && data.enemy && !data.armorNoise) { + if (!e.chance || KDRandom() < e.chance) { + KinkyDungeonMakeNoise(e.dist, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true); + KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `${TextGet("KDArmorNoise")}`, "#ffffff", KDToggles.FastFloaters ? 1 : 2); + data.armorNoise = true; + } + } + }, + }, + "calcMiscast": { + "ReduceMiscastFlat": (e, _item, data) => { + if (data.miscastChance > 0) { + data.miscastChance -= e.power; + } + } + }, + "remoteVibe": { + "RemoteActivatedVibe": (e, item, data) => { + if (!KDGameData.CurrentVibration) { + KinkyDungeonStartVibration(item.name, "tease", KDGetVibeLocation(item), e.power, e.time, undefined, undefined, undefined, undefined, e.edgeOnly); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonStartVibeRemote").replace("EnemyName", TextGet("Name" + data.enemy)), "pink", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + } + }, + "remotePunish": { + "RemoteActivatedShock": (e, item, data) => { + const enemy: entity = data.enemy; + if (!enemy || KDRandom() >= (enemy.Enemy.RemoteControl?.punishRemoteChance || 0.25) || KDEnemyHasFlag(enemy, "remoteShockCooldown") || (e.noLeash && KDGameData.KinkyDungeonLeashedPlayer >= 1)) { + return; + } + // 7 tick cooldown stops it feeling overly spammy + KinkyDungeonSetEnemyFlag(enemy, "remoteShockCooldown", 7); + if (KinkyDungeonStatsChoice.get("Estim")) { + if (e.stun) { + KDChangeDistraction("shock", "restraint", "punish", 5, false, 0.5); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints - 1); // This is to prevent stunlock while slowed heavily + } + KinkyDungeonDealDamage({ damage: e.power, type: "estim", src: "shock", srctype: "restraint", srctrig: "punish" }); + const msg = TextGet(e.msg ? e.msg : "KinkyDungeonRemoteShockEstim") + .replace("RestraintName", TextGet(`Restraint${item.name}`)) + .replace("EnemyName", TextGet(`Name${enemy.Enemy.name}`)); + KinkyDungeonSendTextMessage(5, msg, "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(`${KinkyDungeonRootDirectory}/Audio/${"Estim"}.ogg`); + } else { + if (e.stun) { + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints - 1); // This is to prevent stunlock while slowed heavily + } + KinkyDungeonDealDamage({ damage: e.power, type: e.damage }); + const msg = TextGet(e.msg ? e.msg : "KinkyDungeonRemoteShock") + .replace("RestraintName", TextGet(`Restraint${item.name}`)) + .replace("EnemyName", TextGet(`Name${enemy.Enemy.name}`)); + KinkyDungeonSendTextMessage(5, msg, "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(`${KinkyDungeonRootDirectory}/Audio/${e.sfx}.ogg`); + } + + }, + "RemoteControlHarness": (e, item, data) => { + const enemy = data.enemy; + if (KDRandom() >= (enemy.Enemy.RemoteControl?.punishRemoteChance || 0.1) || (e.noLeash && KDGameData.KinkyDungeonLeashedPlayer >= 1)) { + return; + } + + if (e.sfx) KinkyDungeonPlaySound(`${KinkyDungeonRootDirectory}/Audio/${e.sfx}.ogg`); + + let category = KDControlHarnessCategories[e.kind]; + + if (category) { + category.activateFunction(e, item, data); + } + + if (e.enemyDialogue) { + const dialogue = KinkyDungeonGetTextForEnemy(e.enemyDialogue, enemy); + KinkyDungeonSendDialogue(enemy, dialogue, KDGetColor(enemy), 2, 4); + } + + if (e.msg) { + const msg = TextGet(e.msg) + .replace("RestraintName", TextGet(`Restraint${item.name}`)) + .replace("EnemyName", TextGet(`Name${enemy.Enemy.name}`)); + KinkyDungeonSendTextMessage(5, msg, "#ff8933", 2); + } + }, + "RemoteLinkItem": (e, item, data) => { + const enemy = data.enemy; + if (KDRandom() >= (enemy.Enemy.RemoteControl?.punishRemoteChance || 0.1) || (e.noLeash && KDGameData.KinkyDungeonLeashedPlayer >= 1)) { + return; + } + + const newRestraint = KinkyDungeonGetRestraintByName(e.restraint || KDRestraint(item).Link); + if (e.sfx) KinkyDungeonPlaySound(`${KinkyDungeonRootDirectory}/Audio/${e.sfx}.ogg`); + + KinkyDungeonAddRestraintIfWeaker(newRestraint, item.tightness, true, "", false, undefined, undefined, item.faction, true, undefined, undefined, undefined); + + if (e.enemyDialogue) { + const dialogue = KinkyDungeonGetTextForEnemy(e.enemyDialogue, enemy); + KinkyDungeonSendDialogue(enemy, dialogue, KDGetColor(enemy), 2, 4); + } + + if (e.msg) { + const msg = TextGet(e.msg) + .replace("RestraintName", TextGet(`Restraint${item.name}`)) + .replace("EnemyName", TextGet(`Name${enemy.Enemy.name}`)); + KinkyDungeonSendTextMessage(5, msg, "#ff8933", 2); + } + } + }, + "playerMove": { + "removeOnMove": (e, item, _data) => { + if (!e.chance || KDRandom() < e.chance) { + if (!e.prereq || KDCheckPrereq(KinkyDungeonPlayerEntity)) { + KinkyDungeonRemoveRestraint(KDRestraint(item).Group, false, false); + } + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + "tipBallsuit": (e, _item, _data) => { + if (!e.chance || KDRandom() < e.chance) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "tipBallsuit", + duration: 6, + type: "SlowLevel", + power: KinkyDungeonStatStamina > 1 ? 4 : 15, + pose: "BallsuitTip", + }); + KinkyDungeonSendActionMessage(10, TextGet("KDBallsuitTip"), "#e7cf1a", 1); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + + }, + "punish": { + /** If this item is the one to do it it will vibe */ + "PunishSelf": (e, item, data) => { + if (item == data.item && (!e.kind || data.kind == e.kind) && (!e.requireTags || e.requireTags.includes(data.kind)) && (!e.filterTags || !e.filterTags.includes(data.kind))) { + if (!e.chance || KDRandom() < e.chance) { + if (!KDGameData.CurrentVibration) { + KinkyDungeonStartVibration(item.name, "tease", KDGetVibeLocation(item), e.power, e.time, undefined, undefined, undefined, undefined, e.edgeOnly); + } else { + KinkyDungeonAddVibeModifier(item.name, "reinforce", KDRestraint(item).Group, 1, e.time); + } + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + } + }, + /** If this item is the one to do it it will vibe */ + "PunishShock": (e, item, data) => { + if (item == data.item && (!e.kind || data.kind == e.kind) && (!e.requireTags || e.requireTags.includes(data.kind)) && (!e.filterTags || !e.filterTags.includes(data.kind))) { + if (!e.chance || KDRandom() < e.chance) { + KinkyDungeonDealDamage({ damage: e.power, type: e.damage }); + if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + } + }, + }, + + "playSelf": { + "PunishEvent": (e, item, data) => { + if (!e.chance || KDRandom() < e.chance) { + if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); + KinkyDungeonSendEvent("punish", Object.assign({ + item: item, + type: "playSelf", + kind: e.kind || "low", + }, data)); + + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + "DivineBra": (e, _item, data) => { + if (!e.chance || KDRandom() < e.chance) { + data.amount = 0; + KinkyDungeonSendTextMessage(6, TextGet("KDDivineBraDeny"), "#ffff88", 4); + } + }, + "DivineBra2": (e, _item, data) => { + if (!e.chance || KDRandom() < e.chance) { + KDChangeDistraction("divine", "restraint", "playSelf", -4 - data.amount, true, 0); + KDChangeStamina("divine", "restraint", "playSelf", 1 + data.amount * 2, false); + KinkyDungeonSendTextMessage(6, TextGet("KDDivineBra2Deny"), "#ffff88", 4); + } + }, + "QuakeCollar": (e, _item, data) => { + let amnt = -1 + data.amount * 2; + if (amnt > 0) { + if (!e.chance || KDRandom() < e.chance) { + let distractionStart = KinkyDungeonStatDistraction; + KDChangeDistraction(_item.name, "restraint", "playSelf", 1, false, 0.5); + if (distractionStart < KinkyDungeonStatDistractionMax * KinkyDungeonStatDistractionLowerCap && KinkyDungeonStatDistraction > distractionStart) { + KDChangeMana(_item.name, "restraint", "playSelf", amnt, false); + KinkyDungeonSendTextMessage(6, TextGet("KDQuakeCollar"), "#8888ff", 4); + } else { + KinkyDungeonSendTextMessage(6, TextGet("KDQuakeCollarFail"), "#8888ff", 4); + } + if (!KinkyDungeonFlags.get("QuakeUnlocked")) { + KDUnlockPerk("QuakeCollar"); + KinkyDungeonSetFlag("QuakeUnlocked", -1); + } + } + } + }, + }, + "playerCast": { + "NippleWeights": (e, item, data) => { + if (!e.chance || KDRandom() < e.chance) { + if (!data.spell || data.spell.components?.includes("Arms")) { + if (e.msg) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#ff8888", 1, false, true); + + KDChangeDistraction("nipple", "restraint", "cast", e.power, true, e.mult || 0.4); + + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + } + }, + "MagicallySensitive": (e, item, data) => { + if (!e.chance || KDRandom() < e.chance) { + if (e.msg && (e.always || !KDGameData.CurrentVibration)) KinkyDungeonSendTextMessage(1, TextGet(e.msg).replace("[RESTRAINTNAME]", TextGet("Restraint" + item.name)), "#aaaaaa", 1); + + KinkyDungeonSendEvent("punish", Object.assign({ + item: item, + type: "cast", + kind: e.kind || "low", + }, data)); + + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + "RobeOfChastity": (e, item, data) => { + let player = !(item.onEntity > 0) ? KDPlayer() : KinkyDungeonFindID(item.onEntity); + if (player) { + if (player.player && KDRandom() < 0.1) { + KinkyDungeonSendTextMessage(5, TextGet("KDRobeOfChastityArouse" + Math.floor(KDRandom() * e.count)), + "#ffff00", 10); + } + KDChangeDesire(item.name, "restraint", "cast", e.mult * KinkyDungeonGetManaCost(data.spell), false); + + } + }, + "AlertEnemies": (e, item, _data) => { + if (!e.chance || KDRandom() < e.chance) { + KinkyDungeonAlert = Math.max(KinkyDungeonAlert, e.power); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonAlertEnemies").replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + "PunishPlayer": (e, item, data) => { + if (data.spell && item.type === Restraint && (!e.punishComponent || (data.spell.components && data.spell.components.includes(e.punishComponent)))) { + if (KDRandom() < e.chance || (KDGameData.WarningLevel > (e.count || 2) && KDRandom() < e.warningchance)) { + if (e.stun && KDGameData.WarningLevel > (e.count || 2)) { + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints - 1); // This is to prevent stunlock while slowed heavily + } + KDGameData.WarningLevel += 1; + KinkyDungeonDealDamage({ damage: e.power, type: e.damage }); + KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer") + (KDGameData.WarningLevel > (e.count || 2) ? "Harsh" : "")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + } + }, + "cursePunish": (e, item, data) => { + if (data.spell && item.type === Restraint && (!e.punishComponent || (data.spell.components && data.spell.components.includes(e.punishComponent)))) { + if (!e.chance || KDRandom() < e.chance) { + if (e.stun) { + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, e.stun); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints - 1); // This is to prevent stunlock while slowed heavily + } + KinkyDungeonDealDamage({ damage: e.power, type: e.damage }); + if (!data.cursePunish) { + KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + data.cursePunish = true; + } + } + }, + "armorNoise": (e, item, data) => { + if (data.spell && item.type === Restraint && (!e.punishComponent || (data.spell.components && data.spell.components.includes(e.punishComponent))) && !data.armorNoise) { + if (!e.chance || KDRandom() < e.chance) { + KinkyDungeonMakeNoise(e.dist, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + KinkyDungeonSendTextMessage(5, TextGet((e.msg ? e.msg : "KinkyDungeonPunishPlayer")).replace("RestraintName", TextGet("Restraint" + item.name)), "#ff8933", 2); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `${TextGet("KDArmorNoise")}`, "#ffffff", KDToggles.FastFloaters ? 1 : 2); + data.armorNoise = true; + } + } + }, + }, + "calcEscapeMethod": { + "DollmakerMask": (_e, _item, data) => { + if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { + data.escapeMethod = "Kill"; + } + }, + }, + "calcEscapeKillTarget": { + "DollmakerMask": (_e, _item, data) => { + data.enemy = "DollmakerTarget"; + } + }, +}; + +/** + * @param Event + * @param e + * @param item + * @param data + */ +function KinkyDungeonHandleInventoryEvent(Event: string, e: KinkyDungeonEvent, item: item, data: any) { + if (Event === e.trigger && KDEventMapInventory[e.dynamic ? "dynamic" : Event] && KDEventMapInventory[e.dynamic ? "dynamic" : Event][e.type]) { + if (KDCheckCondition(e, data)) + KDEventMapInventory[e.dynamic ? "dynamic" : Event][e.type](e, item, data); + } +} + + +/** + * @type {Object.>} + */ +const KDEventMapBuff: Record void>> = { + "dynamic": { + "BuffSelf": (e, buff, entity, data) => { + if (KDCheckPrereq(null, e.prereq, e, data)) + KinkyDungeonApplyBuffToEntity(entity, { + id: (e.kind || buff.id) + e.buffType, + type: e.buffType, + power: e.power, + tags: e.tags, + currentCount: e.mult ? -1 : undefined, + maxCount: e.mult, + duration: e.time + }); + }, + }, + "duringDistractEnemy": { + "PsychicLink": (_e, buff, entity, data) => { + if (data.enemy != entity) return; + if (data.amount <= 0) return; + let amount = data.amount; + let target = KDLookupID(_e.source, true); + if (!target) return; + let maxDistractionSRC = KDGetEntityMaxDistraction(entity); + let maxDistractionTRG = KDGetEntityMaxDistraction(target); + let missingSRC = maxDistractionSRC - (KDGetDistraction(entity) || 0); + let missingTRG = maxDistractionTRG - (KDGetDistraction(target) || 0); + + let amountToSrc = amount * _e.mult; + let amountToTrg = amount * (1 - _e.mult); + + if (amountToSrc > missingSRC) { + amountToTrg += amountToSrc - missingSRC; + amountToSrc = missingSRC; + } else if (amountToTrg > missingTRG) { + amountToSrc += amountToTrg - missingTRG; + amountToTrg = missingTRG; + } + data.amount = amountToSrc; + if (target == KDPlayer()) { + KDChangeDistraction("PsychicLink", "spell", "distract", + amountToTrg, false, data.desireMult, undefined, true + ); + } else { + KDAddDistraction(target, amountToTrg, data.desireMult, true); + } + }, + }, + "duringChangeDistraction": { + "PsychicLink": (_e, buff, entity, data) => { + let amount = data.Amount; + if (amount <= 0) return; + let target = KDLookupID(_e.source, true); + if (!target) return; + let maxDistractionSRC = KDGetEntityMaxDistraction(entity); + let maxDistractionTRG = KDGetEntityMaxDistraction(target); + let missingSRC = maxDistractionSRC - (KDGetDistraction(entity) || 0); + let missingTRG = maxDistractionTRG - (KDGetDistraction(target) || 0); + + let amountToSrc = amount * _e.mult; + let amountToTrg = amount * (1 - _e.mult); + + if (amountToSrc > missingSRC) { + amountToTrg += amountToSrc - missingSRC; + amountToSrc = missingSRC; + } else if (amountToTrg > missingTRG) { + amountToSrc += amountToTrg - missingTRG; + amountToTrg = missingTRG; + } + data.amount = amountToSrc; + if (target == KDPlayer()) { + KDChangeDistraction("PsychicLink", "spell", "distract", + amountToTrg, false, data.lowerPerc, undefined, true + ); + } else { + KDAddDistraction(target, amountToTrg, data.lowerPerc, true); + } + }, + }, + "enemyOrgasm": { + "PsychicLink": (_e, buff, entity, data) => { + if (data.enemy != entity) return; + if (data.cancel) return; + data.intensity *= 0.5; + }, + }, + "afterEnemyOrgasm": { + "PsychicLink": (_e, buff, entity, data) => { + if (data.enemy != entity) return; + if (data.cancel) return; + let amount = 5.0 * data.intensity; + let target = KDLookupID(_e.source, true); + if (!target) return; + + if (target == KDPlayer()) { + if (KinkyDungeonFlags.get("PlayerOrgasm")) return; + KinkyDungeonSendTextMessage(4, TextGet("KDOrgasmPsychicLinkEnemy"), "ff4477", 4); + KDChangeDistraction("PsychicLink", "spell", "distract", + amount, false, 0.5, undefined, true + ); + let tb = amount; + KinkyDungeonTeaseLevelBypass += tb; + KDGameData.OrgasmStage = Math.min((KDGameData.OrgasmStage + Math.ceil(tb)) || tb, KinkyDungeonMaxOrgasmStage); + } else { + KDAddDistraction(target, amount * 3.0, 0.5, true); + } + }, + }, + "tryOrgasm": { + "PsychicLink": (_e, buff, entity, data) => { + if (!entity.player) return; + data.amount *= 0.75; + KinkyDungeonSendTextMessage(4, TextGet("KDOrgasmPsychicLinkAttempt"), "ff4477", 4); + }, + }, + "orgasm": { + "PsychicLink": (_e, buff, entity, data) => { + if (!entity.player) return; + let amount = data.amount; + if (amount <= 0) return; + let target = KDLookupID(_e.source, true); + if (!target) return; + + if (target == KDPlayer()) { + if (KinkyDungeonFlags.get("PlayerOrgasm")) return; + KinkyDungeonSendTextMessage(4, TextGet("KDOrgasmPsychicLinkEnemy"), "ff4477", 4); + KDChangeDistraction("PsychicLink", "spell", "distract", + amount, false, 0.5, undefined, true + ); + let tb = amount; + KinkyDungeonTeaseLevelBypass += tb; + KDGameData.OrgasmStage = Math.min((KDGameData.OrgasmStage + Math.ceil(tb)) || tb, KinkyDungeonMaxOrgasmStage); + } else { + KDAddDistraction(target, amount * 3.0, 0.5, true); + if (KDIsDistracted(target)) + KDEnemyRelease(target); + } + }, + }, + "tickFlags": { + "latexIntegration": (_e, buff, _entity, _data) => { + buff.duration -= 100; + if (buff.duration < 100) { + delete buff.infinite; + buff.duration = 1; + } + }, + }, + "beforeStruggleCalc": { + "BreakFree": (_e, buff, _entity, data) => { + if (data.struggleType == "Struggle") + data.escapePenalty -= buff.power; + }, + "latexIntegrationDebuff": (e, buff, _entity, data) => { + if (data.restraint && (data.struggleType === "Struggle" || data.struggleType === "Remove") && KDRestraint(data.restraint).shrine.includes("Cyber")) { + data.escapePenalty += (e.power || 1) * buff.power; + if (!data.query) + KinkyDungeonSendTextMessage(5, TextGet("KDLatexIntegration" + Math.floor(KDRandom() * 3)), "#38a2c3", 2, true); + } + }, + }, + "expireBuff": { + "poisonSleep": (_e, buff, entity, data) => { + if (buff == data.buff && entity.player) { + KDStunTurns(Math.round(12 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "poisonDamageResist")))); + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, Math.round(12 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "poisonDamageResist")))); + } + }, + "TeleportHostUnlessStunned": (_e, buff, entity, data) => { + if (buff == data.buff && buff.x && buff.y && !KinkyDungeonIsDisabled(entity)) { + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(buff.x, buff.y)) + && !KinkyDungeonEntityAt(buff.x, buff.y) + && !KDIsImmobile(entity)) { + KDMoveEntity(entity, buff.x, buff.y, true, true, true) + + KinkyDungeonRemoveBuffsWithTag(entity, ["displaceend"]); + } + } + }, + "ChaoticOverflow": (e, buff, _entity, data) => { + if (buff == data.buff) { + let restraintToAdd = KinkyDungeonGetRestraint({ tags: ["crystalRestraints", "crystalRestraintsHeavy"] }, KDGetEffLevel() + 10, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, "Gold", false, false, false); + + if (restraintToAdd) { + KinkyDungeonAddRestraintIfWeaker(restraintToAdd, 10, true, "Gold", true, false, undefined, "Observer", true); + if (e.count > 1) + for (let i = 1; i < (e.count || 1); i++) { + restraintToAdd = KinkyDungeonGetRestraint({ tags: ["crystalRestraints", "crystalRestraintsHeavy"] }, KDGetEffLevel() + 10, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, "Gold", false, false, false); + if (restraintToAdd) KinkyDungeonAddRestraintIfWeaker(restraintToAdd, 10, true, "Gold", true, false, undefined, "Observer", true); + } + + KinkyDungeonSendTextMessage(10, TextGet("KDChaoticOverflow_End"), "#ff8888", 4); + } + } + }, + }, + "beforeDamageEnemy": { + "Conduction": (e, _buff, entity, data) => { + if (data.enemy == entity && (!data.flags || !data.flags.includes("EchoDamage")) && data.dmg > 0 && (!e.damage || e.damage == data.type)) { + if (!e.chance || KDRandom() < e.chance) { + let maxSprites = 7; + let sprites = 0; + for (let enemy of KDMapData.Entities) { + if (enemy.buffs && enemy.buffs.Conduction && enemy != data.enemy && enemy.hp > 0 && KDistEuclidean(enemy.x - data.enemy.x, enemy.y - data.enemy.y) <= e.aoe) { + KinkyDungeonDamageEnemy(enemy, { + type: e.damage, + damage: data.dmg * e.power, + flags: ["EchoDamage"] + }, false, true, undefined, undefined, undefined, "Rage"); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Conduction.ogg"); + let dist = KDistEuclidean(enemy.x - data.enemy.x, enemy.y - data.enemy.y); + let tx = enemy.x; + let ty = enemy.y; + if (dist > 0 && sprites < maxSprites) + for (let d = dist / 2.99; d < dist; d += dist / 2.99) { + let xx = entity.x + d * (tx - entity.x); + let yy = entity.y + d * (ty - entity.y); + let newB = { + born: 0, time: 1 + Math.round(KDRandom() * 1), x: Math.round(xx), y: Math.round(yy), vx: 0, vy: 0, xx: xx, yy: yy, spriteID: KinkyDungeonGetEnemyID() + "ElectricEffect" + CommonTime(), + bullet: { faction: "Rage", spell: undefined, damage: undefined, lifetime: 2, passthrough: true, name: "ElectricEffect", width: 1, height: 1 } + }; + KDMapData.Bullets.push(newB); + KinkyDungeonUpdateSingleBulletVisual(newB, false); + sprites += 1; + } + } + } + if (KinkyDungeonPlayerBuffs.Conduction && KDistEuclidean(data.enemy.x - KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y - data.enemy.y) <= e.aoe) { + KinkyDungeonSendTextMessage(6, TextGet("KDConductionDamageTaken") + .replace("DAMAGEDEALT", "" + Math.round(data.dmg * e.power)), "#ff5277", 2); + KinkyDungeonDealDamage({ + type: e.damage, + damage: data.dmg * e.power, + flags: ["EchoDamage"], + }); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Conduction.ogg"); + let dist = KDistEuclidean(KinkyDungeonPlayerEntity.x - data.enemy.x, KinkyDungeonPlayerEntity.y - data.enemy.y); + let tx = KinkyDungeonPlayerEntity.x; + let ty = KinkyDungeonPlayerEntity.y; + if (dist > 0) + for (let d = dist / 2.99; d < dist; d += dist / 2.99) { + let xx = entity.x + d * (tx - entity.x); + let yy = entity.y + d * (ty - entity.y); + let newB = { + born: 0, time: 1 + Math.round(KDRandom() * 1), x: Math.round(xx), y: Math.round(yy), vx: 0, vy: 0, xx: xx, yy: yy, spriteID: KinkyDungeonGetEnemyID() + "ElectricEffect" + CommonTime(), + bullet: { faction: "Rage", spell: undefined, damage: undefined, lifetime: 2, passthrough: true, name: "ElectricEffect", width: 1, height: 1 } + }; + KDMapData.Bullets.push(newB); + KinkyDungeonUpdateSingleBulletVisual(newB, false); + } + } + } + } + }, + "EchoDamage": (e, _buff, entity, data) => { + if (data.enemy == entity && (!data.flags || (!data.flags.includes("EchoDamage"))) && data.dmg > 0 && (!e.damageTrigger || data.type == e.damageTrigger)) { + KinkyDungeonDamageEnemy(entity, { + type: e.damage, + damage: data.dmg * e.power, + flags: ["EchoDamage"] + }, false, false, undefined, undefined, undefined, data.faction); + } + }, + "Volcanism": (_e, _buff, entity, data) => { + if (data.enemy == entity && (!data.flags || (!data.flags.includes("VolcanicDamage") && !data.flags.includes("BurningDamage"))) && data.dmg > 0 && (data.type == "fire")) { + KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, KinkyDungeonFindSpell("VolcanicStrike", true), undefined, undefined, undefined, "Rock"); + data.enemy.hp = 0; + } + }, + "Flammable": (_e, _buff, entity, data) => { + if (entity == data.enemy && (!data.flags || !data.flags.includes("BurningDamage")) && !KDEntityHasBuff(entity, "Drenched") && data.dmg > 0 && (data.type == "fire")) { + KinkyDungeonApplyBuffToEntity(entity, KDBurning); + } + }, + }, + "beforePlayerDamage": { + "Flammable": (_e, _buff, entity, data) => { + if (entity == KinkyDungeonPlayerEntity && (!data.flags || !data.flags.includes("BurningDamage")) && !KDEntityHasBuff(entity, "Drenched") && data.dmg > 0 && (data.type == "fire")) { + KinkyDungeonApplyBuffToEntity(entity, KDBurning); + } + }, + "Conduction": (e, _buff, entity, data) => { + if ((!data.flags || !data.flags.includes("EchoDamage")) && data.dmg > 0 && (!e.damage || e.damage == data.type)) { + if (!e.chance || KDRandom() < e.chance) { + for (let enemy of KDMapData.Entities) { + if (enemy.buffs && enemy.buffs.Conduction && enemy.hp > 0 && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) <= e.aoe) { + KinkyDungeonDamageEnemy(enemy, { + type: e.damage, + damage: data.dmg * e.power, + flags: ["EchoDamage"] + }, false, true, undefined, undefined, undefined, "Rage"); + let dist = KDistEuclidean(enemy.x - entity.x, enemy.y - entity.y); + let tx = enemy.x; + let ty = enemy.y; + if (dist > 0) + for (let d = 0; d <= dist; d += dist / 3.01) { + let xx = entity.x + d * (tx - entity.x); + let yy = entity.y + d * (ty - entity.y); + let newB = { + born: 0, time: 1 + Math.round(KDRandom() * 1), x: Math.round(xx), y: Math.round(yy), vx: 0, vy: 0, xx: xx, yy: yy, spriteID: KinkyDungeonGetEnemyID() + "ElectricEffect" + CommonTime(), + bullet: { faction: "Rage", spell: undefined, damage: undefined, lifetime: 2, passthrough: true, name: "ElectricEffect", width: 1, height: 1 } + }; + KDMapData.Bullets.push(newB); + KinkyDungeonUpdateSingleBulletVisual(newB, false); + } + } + } + } + } + }, + "EchoDamage": (e, _buff, _entity, data) => { + if ((!data.flags || !data.flags.includes("EchoDamage")) && data.dmg > 0 && (!e.damageTrigger || e.damageTrigger == data.type)) { + KinkyDungeonSendTextMessage(6, TextGet("KDBurningFanFlamesDamageTaken").replace("DAMAGEDEALT", "" + data.dmg * e.power), "#ff5277", 2); + KinkyDungeonDealDamage({ + type: e.damage, + damage: data.dmg * e.power, + flags: ["EchoDamage"], + }); + } + }, + }, + "beforeAttack": { + "CounterattackDamage": (e, _buff, entity, data) => { + if (data.attacker && data.target == entity + && data.eventable + && (!(e.prereq == "hit") || (!data.missed && data.hit)) + && (!(e.prereq == "hit-hostile") || (!data.missed && data.hit && !data.attacker.playWithPlayer + // Player attacking = hostile? + // Enemy attacking enemy? hostile + && (data.attacker.player || !data.target.player || KinkyDungeonAggressive(data.attacker))))) { + if (data.attacker.player) { + KinkyDungeonDealDamage({ + damage: e.power, type: e.damage, crit: e.crit, + addBind: e.addBind, bindcrit: e.bindcrit, bind: e.bind, time: e.time, bindType: e.bindType, + }); + } else { + KinkyDungeonDamageEnemy(data.attacker, { damage: e.power, type: e.damage, crit: e.crit, bindcrit: e.bindcrit, bind: e.bind, bindType: e.bindType, time: e.time }, false, true, undefined, undefined, entity); + } + if (e.requiredTag) + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, e.requiredTag, 1); + } + }, + "CounterattackSpell": (e, _buff, entity, data) => { + if (data.attacker && data.target == entity + && data.eventable + && (!(e.prereq == "hit") || (!data.missed && data.hit)) + && (!(e.prereq == "hit-hostile") || (!data.missed && data.hit && !data.attacker.playWithPlayer + // Player attacking = hostile? + // Enemy attacking enemy? hostile + && (data.attacker.player || !data.target.player || KinkyDungeonAggressive(data.attacker))))) { + KinkyDungeonCastSpell(data.attacker.x, data.attacker.y, KinkyDungeonFindSpell(e.spell, true), undefined, undefined, undefined, entity.player ? "Player" : KDGetFaction(entity)); + if (e.requiredTag) + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, e.requiredTag, 1); + } + }, + }, + "afterDamageEnemy": { + "ShrineElements": (e, _buff, _entity, data) => { + if (data.enemy && data.enemy.hp > 0.52 && KDHostile(data.enemy) && data.faction == "Player" && !KDEventDataReset['ShrineElements'] && data.spell) { + KDEventDataReset['ShrineElements'] = true; + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "shrineElements", 1); + KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, KinkyDungeonFindSpell(e.spell, true), undefined, undefined, undefined, "Player"); + + } + }, + }, + "playerAttack": { + "ElementalEffect": (e, buff, entity, data) => { + if (buff.duration > 0 && data.enemy && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + if (!e.prereq || KDCheckPrereq(entity, e.prereq)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + addBind: e.addBind, + bindType: e.bindType, + }, false, e.power <= 1, undefined, undefined, undefined, undefined, undefined, data.vulnConsumed); + } + } + }, + "ShadowElementalEffect": (e, buff, entity, data) => { + if (buff.duration > 0 && data.enemy && data.enemy.hp > 0 && !KDHelpless(data.enemy) && KinkyDungeonBrightnessGet(entity.x, entity.y) <= KDShadowThreshold) { + if (!e.prereq || KDCheckPrereq(entity, e.prereq)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + addBind: e.addBind, + bindType: e.bindType, + }, false, e.power <= 1, undefined, undefined, undefined, undefined, undefined, data.vulnConsumed); + } + } + }, + "ShadowStep": (e, _buff, _entity, data) => { + if (data.enemy && KDHostile(data.enemy) && !KinkyDungeonPlayerBuffs.ShadowStep) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "ShadowStep", type: "SlowDetection", duration: e.time * 2, power: 0.667, player: true, enemies: true, endSleep: true, currentCount: -1, maxCount: 1, tags: ["SlowDetection", "hit", "cast"] }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "ShadowStep2", type: "Sneak", duration: e.time, power: Math.min(20, e.time * 2), player: true, enemies: true, endSleep: true, currentCount: -1, maxCount: 1, tags: ["Sneak", "hit", "cast"] }); + if (e.requiredTag) + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, e.requiredTag, 1); + } + }, + "ApplyDisarm": (e, _buff, entity, data) => { + if (data.enemy && data.enemy == entity && data.enemy.Enemy.bound && (!e.prereq || KDCheckPrereq(data.enemy, e.prereq))) { + let time = e.time || 0; + if (!time && entity.buffs) time = KinkyDungeonGetBuffedStat(entity.buffs, "DisarmOnAttack"); + if (time > 0) { + KDDisarmEnemy(data.enemy, time); + } + } + }, + }, + "calcMana": { + "Tablet": (e, _buff, _entity, data) => { + if (data.spell != KinkyDungeonTargetingSpellItem && data.spell.tags && data.spell.tags.includes(e.requiredTag) || (data.spell.school && data.spell.school.toLowerCase() == e.requiredTag)) { + data.cost = Math.max(data.cost * e.power, 0); + } + }, + "AvatarFire": (e, _buff, _entity, data) => { + if (data.spell.tags && data.spell.tags.includes("fire")) { + data.cost = Math.max(data.cost - e.power, 0); + } + }, + "AvatarAir": (e, _buff, _entity, data) => { + if (data.spell.tags && data.spell.tags.includes("air")) { + data.cost = Math.max(data.cost - e.power, 0); + } + }, + "AvatarWater": (e, _buff, _entity, data) => { + if (data.spell.tags && data.spell.tags.includes("water")) { + data.cost = Math.max(data.cost - e.power, 0); + } + }, + "AvatarEarth": (e, _buff, _entity, data) => { + if (data.spell.tags && data.spell.tags.includes("earth")) { + data.cost = Math.max(data.cost - e.power, 0); + } + }, + }, + "beforeDressRestraints": { + "LatexIntegration": (_e, buff, entity, data) => { + if (data.Character == KDGetCharacter(entity)) { + if (buff.power >= 100) { + let color = { "gamma": 2.7666666666666666, "saturation": 1.6833333333333333, "contrast": 0.8, "brightness": 1.5, "red": 0.6333333333333334, "green": 1.1833333333333333, "blue": 2.033333333333333, "alpha": 1 }; + let palette = ""; + let outfit = KDOutfit({ name: KinkyDungeonCurrentDress }); + if ((KDToggles.ForcePalette || outfit?.palette || KinkyDungeonPlayer.Palette) + && (KDToggles.ApplyPaletteTransform + && (outfit?.palette || KinkyDungeonPlayer.Palette || !KDDefaultPalette || KinkyDungeonFactionFilters[KDDefaultPalette]))) { + palette = (KDToggles.NoOutfitPalette ? undefined : outfit?.palette) + || KinkyDungeonPlayer.Palette || KDDefaultPalette; + } + let efd: alwaysDressModel = { + Model: "Catsuit", + faction: palette || "AncientRobot", + Filters: { + TorsoLower: color, + TorsoUpper: color, + }, + factionFilters: { + TorsoLower: { color: "Catsuit", override: true }, + TorsoUpper: { color: "Catsuit", override: true }, + }, + }; + data.extraForceDress.push(efd); + } + } + }, + }, + "tick": { + "poisonSleep": (_e, buff, entity, data) => { + if (entity.player) { + KinkyDungeonSleepiness = Math.max(KinkyDungeonSleepiness, + Math.min(8* KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "poisonDamageResist")), + KinkyDungeonSleepiness + 1.7*data.delta)); + } + }, + "EssenceMote": (_e, _buff, entity, _data) => { + if (entity == KDPlayer()) { + _buff.power = (_buff.duration) * _e.mult; + } + }, + + "TrainingUnit": (_e, _buff, entity, _data) => { + if (!entity.player) { + if (!KDMapData.PrisonStateStack.includes("Training")) { + KDRemoveEntity(entity, false, false, true); + } + } + }, + + "Corrupted": (e, buff, entity, data) => { + if (entity.player) { + if (KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) > KDShadowThreshold) { + buff.power = Math.min(0, buff.power + (e.power + * Math.min(10, KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) / KDShadowThreshold) + ) * data.delta); + buff.text = Math.round(buff.power * 100) + "%"; + if (buff.power < 0) { + buff.duration = 9999; + } else { + buff.duration = 0; + } + } + } + }, + "ShadowDommed": (_e, buff, entity, _data) => { + if (buff.duration > 0) { + if (entity.player) { + if (!KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + buff.duration = 0; + } + KinkyDungeonSetFlag("PlayerDommed", 2); + } + } + }, + "Haunting": (e, buff, entity, _data) => { + if (buff.power > 0 && entity.player) { + let tags = ["comfyRestraints", "trap"]; + let restraintAdd = KinkyDungeonGetRestraint({ tags: [...tags] }, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, "Purple", + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + { + allowLowPower: true + }); + if (!KinkyDungeonFlags.has("GhostHaunted") && !(KDNearbyEnemies(entity.x, entity.y, 1.5).filter((enemy) => { + return KinkyDungeonAggressive(enemy); + }).length > 0) && restraintAdd) { + if (KDRandom() < 0.1 && KDNearbyEnemies(entity.x, entity.y, e.dist).filter((enemy) => { + return KinkyDungeonAggressive(enemy); + }).length > 0) { + buff.power -= 1; + KinkyDungeonAddRestraintIfWeaker(restraintAdd, KDGetEffLevel(), true, "Purple", true); + KinkyDungeonSendTextMessage(5, TextGet("KDHaunting").replace("RestraintAdded", TextGet("Restraint" + restraintAdd.name)), "#ff5277", 1); + if (e.count > 1) { + for (let i = 1; i < e.count; i++) { + restraintAdd = KinkyDungeonGetRestraint({ tags: [...tags] }, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, "Purple"); + KinkyDungeonAddRestraintIfWeaker(restraintAdd, KDGetEffLevel(), true, "Purple", true); + KinkyDungeonSendTextMessage(5, TextGet("KDHaunting").replace("RestraintAdded", TextGet("Restraint" + restraintAdd.name)), "#ff5277", 1); + } + } + KinkyDungeonSetFlag("GhostHaunted", 2 + Math.round(KDRandom() * 3)); + } + } + } else { + buff.duration = 0; + } + }, + "Cursed": (e, buff, entity, _data) => { + if (buff.power > 0 && entity.player) { + if (KinkyDungeonStatDistraction > 0.99 * KinkyDungeonStatDistractionMax) { + let tags = ["obsidianRestraints", "shadowLatexRestraints", "shadowLatexPetsuit", "shadowLatexRestraintsHeavy"]; + let restraintAdd = KinkyDungeonGetRestraint({ tags: ["invisRestraints"] }, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, "Purple", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, { + ForceDeep: true, + allowLowPower: true, + }); + if (!restraintAdd) restraintAdd = KinkyDungeonGetRestraint({ tags: [...tags] }, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, "Purple", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, { + ForceDeep: true, + allowLowPower: true, + }); + if (restraintAdd) { + if (KDRandom() < 0.2) { + if (!KinkyDungeonStatsChoice.get("Haunted")) { + buff.power -= 1; + } + KinkyDungeonAddRestraintIfWeaker(restraintAdd, KDGetEffLevel(), true, "Purple", true, undefined, undefined, "Curse", true); + KinkyDungeonSendTextMessage(5, TextGet("KDObserverCursed").replace("RestraintAdded", TextGet("Restraint" + restraintAdd.name)), "#ff5277", 1); + if (e.count > 1) { + for (let i = 1; i < e.count; i++) { + restraintAdd = KinkyDungeonGetRestraint({ tags: ["invisRestraints"] }, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, "Purple"); + if (!restraintAdd) restraintAdd = KinkyDungeonGetRestraint({ tags: [...tags] }, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, "Purple"); + + KinkyDungeonAddRestraintIfWeaker(restraintAdd, KDGetEffLevel(), true, "Purple", true, undefined, undefined, "Curse", true); + KinkyDungeonSendTextMessage(5, TextGet("KDObserverCursed").replace("RestraintAdded", TextGet("Restraint" + restraintAdd.name)), "#ff5277", 1); + } + } + KinkyDungeonSetFlag("ObserverCursed", 2 + Math.round(KDRandom() * 3)); + } + } + } + } else { + buff.duration = 0; + } + }, + "BoundByFate": (e, buff, entity, _data) => { + if (buff.duration > 0) { + if (entity.player) { + if (!KDEffectTileTags(entity.x, entity.y).fate) { + buff.duration = 0; + KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, "soul", { name: "StarBondage", count: e.count, kind: e.kind, power: e.power, damage: e.damage }); + KDRemoveAoEEffectTiles(entity.x, entity.y, ["fate"], 1.5); + } + } + } + }, + "Taunted": (e, buff, entity, _data) => { + if (buff.duration > 0) { + if (entity.player) { + if (!KDEffectTileTags(entity.x, entity.y).taunt) { + buff.duration = 0; + KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, "soul", { name: "TauntShame", count: e.count, kind: e.kind, power: e.power, damage: e.damage }); + KDRemoveAoEEffectTiles(entity.x, entity.y, ["taunt"], 10); + } + } + } + }, + "ApplyConduction": (e, _buff, entity, _data) => { + let bb = Object.assign({}, KDConduction); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + if (entity.player) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + } else { + if (!entity.buffs) entity.buffs = {}; + KinkyDungeonApplyBuffToEntity(entity, bb); + } + }, + "ApplySlowed": (e, _buff, entity, _data) => { + let bb = Object.assign({}, KDSlowed); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + if (entity.player) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + } else { + if (!entity.buffs) entity.buffs = {}; + KinkyDungeonApplyBuffToEntity(entity, bb); + } + }, + "ApplyKnockback": (e, _buff, entity, _data) => { + let bb = Object.assign({}, KDKnockbackable); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + if (entity.player) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + } else { + if (!entity.buffs) entity.buffs = {}; + KinkyDungeonApplyBuffToEntity(entity, bb); + } + }, + "ApplyVuln": (_e, _buff, entity, _data) => { + if (!entity.player) { + if (!entity.vulnerable) entity.vulnerable = 1; + } + }, + "ApplyAttackSlow": (e, _buff, entity, _data) => { + let bb = Object.assign({}, KDAttackSlow); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + if (entity.player) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + } else { + if (!entity.buffs) entity.buffs = {}; + KinkyDungeonApplyBuffToEntity(entity, bb); + } + }, + "ApplySilence": (e, buff, entity, _data) => { + if (!buff.duration) return; + if (!entity.player && entity.Enemy.bound) { + if (!e.prereq || KDCheckPrereq(entity, e.prereq)) + KDSilenceEnemy(entity, e.duration); + } + }, + "ApplyGlueVuln": (e, _buff, entity, _data) => { + let bb = Object.assign({}, KDGlueVulnLow); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + if (entity.player) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + } else { + if (!entity.buffs) entity.buffs = {}; + KinkyDungeonApplyBuffToEntity(entity, bb); + } + }, + "RemoveDrench": (_e, _buff, entity, _data) => { + if (!KDWettable(entity)) { + if (entity.player) { + delete KinkyDungeonPlayerBuffs.Drenched; + delete KinkyDungeonPlayerBuffs.Drenched2; + delete KinkyDungeonPlayerBuffs.Drenched3; + } else { + delete entity.buffs.Drenched; + delete entity.buffs.Drenched2; + delete entity.buffs.Drenched3; + } + } + }, + "Evaporate": (e, buff, entity, data) => { + if (data.delta) { + let DrySpeed = -1 + KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(entity, "DrySpeed") * (e.mult || 1.0)); + if (DrySpeed != 0) { + buff.duration = Math.max(0, buff.duration - data.delta * DrySpeed); + } + } + + }, + + "BreakFree": (_e, _buff, entity, _data) => { + if (KinkyDungeonStatWill <= 0.01) { + if (entity.player) { + delete KinkyDungeonPlayerBuffs.BreakFree; + } + } + }, + + "RemoveConduction": (_e, _buff, entity, _data) => { + if (!KDConducting(entity)) { + if (entity.player) { + delete KinkyDungeonPlayerBuffs.Conduction; + } else { + delete entity.buffs.Conduction; + } + } + }, + "RemoveSlimeWalk": (_e, buff, entity, _data) => { + if (KDSlimeImmuneEntity(entity)) { + if (entity.player) { + delete KinkyDungeonPlayerBuffs[buff.id]; + } else { + delete entity.buffs[buff.id]; + } + } + }, + "RemoveNoPlug": (e, buff, entity, data) => { + if (!(KDEntityBuffedStat(entity, "Plug") > 0) && (!e.prereq || KDCheckPrereq(entity, e.prereq, e, data))) { + if (entity.player) { + delete KinkyDungeonPlayerBuffs[buff.id]; + } else { + delete entity.buffs[buff.id]; + } + } + }, + "ExtendDisabledOrHelpless": (e, buff, entity, data) => { + if (!entity.player && (KinkyDungeonIsDisabled(entity) || KDHelpless(entity)) && (!e.prereq || KDCheckPrereq(entity, e.prereq, e, data))) { + buff.duration += data.delta; + } + }, + "ExtendDisabledOrHelplessOrChastity": (e, buff, entity, data) => { + if (!entity.player && (KDEntityBuffedStat(entity, "Chastity") || KinkyDungeonIsDisabled(entity) || KDHelpless(entity)) && (!e.prereq || KDCheckPrereq(entity, e.prereq, e, data))) { + buff.duration += data.delta; + } + }, + "RemoveAuraHelpless": (e, buff, entity, data) => { + if (!entity.player && KDHelpless(entity) && (!e.prereq || KDCheckPrereq(entity, e.prereq, e, data))) { + delete buff.aura; + } + }, + "RemoveFree": (e, buff, entity, data) => { + if (!(entity.boundLevel > 0) && (!e.prereq || KDCheckPrereq(entity, e.prereq, e, data))) { + if (entity.player) { + delete KinkyDungeonPlayerBuffs[buff.id]; + } else { + delete entity.buffs[buff.id]; + } + } + }, + "RemoveFreeStrict": (e, buff, entity, data) => { + if (!(entity.boundLevel > 0 || KinkyDungeonHasStatus(entity)) && (!e.prereq || KDCheckPrereq(entity, e.prereq, e, data))) { + if (entity.player) { + delete KinkyDungeonPlayerBuffs[buff.id]; + } else { + delete entity.buffs[buff.id]; + } + } + }, + "Distract": (e, _buff, entity, data) => { + if (entity.Enemy?.bound && (!e.prereq || KDCheckPrereq(entity, e.prereq, e, data))) { + KDAddDistraction(entity, data.delta * e.power); + } + }, + "RemoveBurning": (_e, _buff, entity, data) => { + let drench = KDEntityGetBuff(entity, "Drenched"); + if (drench && drench.duration > data.delta) { + if (entity.player) { + delete KinkyDungeonPlayerBuffs.Burning; + } else { + delete entity.buffs.Burning; + } + drench.duration -= data.delta; + } + }, + "RemoveRestraint": (_e, buff, entity, data) => { + // Removes restraint debuffs once the enemy has struggled out + if (buff && buff.duration > data.delta && !entity.player) { + if (!entity.Enemy.bound || entity.boundLevel <= 0.01) + delete entity.buffs[buff.id]; + } + }, + "ElementalEffect": (e, buff, entity, _data) => { + if (buff.duration > 0) { + if (entity.player) { + KinkyDungeonDealDamage({ + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + addBind: e.addBind, + bindType: e.bindType, + flags: ["BurningDamage"] + }); + } else { + KinkyDungeonDamageEnemy(entity, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + addBind: e.addBind, + bindType: e.bindType, + flags: ["BurningDamage"] + }, false, true, undefined, undefined, undefined); + } + } + }, + + "ShadowElementalEffect": (e, buff, entity, _data) => { + if (KinkyDungeonBrightnessGet(entity.x, entity.y) <= KDShadowThreshold) { + if (buff.duration > 0) { + if (entity.player) { + KinkyDungeonDealDamage({ + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + flags: ["BurningDamage"] + }); + } else { + KinkyDungeonDamageEnemy(entity, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + flags: ["BurningDamage"] + }, e.power < 1, true, undefined, undefined, undefined); + } + } + } + }, + "UnShadowElementalEffect": (e, buff, entity, _data) => { + if (KinkyDungeonBrightnessGet(entity.x, entity.y) > KDShadowThreshold) { + if (buff.duration > 0) { + if (entity.player) { + KinkyDungeonDealDamage({ + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + flags: ["BurningDamage"] + }); + } else { + KinkyDungeonDamageEnemy(entity, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + flags: ["BurningDamage"] + }, false, true, undefined, undefined, undefined); + } + } + } + }, + }, + "draw": { + "EnemyAim": (_e, _buff, entity, data) => { + if (entity == KDPlayer()) { + // Do nothing + } else { + // Do aim subroutine + let x = _buff.x; + let y = _buff.y; + let vx = _buff.vx; + let vy = _buff.vy; + if (x != undefined && y != undefined) { + let ease = KDEasePosition( + vx, vy, x, y, 0.01, KinkyDungeonDrawDelta, "" + ); + _buff.vx = ease.x; + _buff.vy = ease.y; + + KDDraw(kdenemystatusboard, kdpixisprites, entity.id + "_aimtarg", + KinkyDungeonRootDirectory + _e.sprite + ".png", + (_buff.vx - data.CamX) * KinkyDungeonGridSizeDisplay, + (_buff.vy - data.CamY) * KinkyDungeonGridSizeDisplay, + KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { + zIndex: -5, + tint: 0xffe583, + }); + } + } + }, + }, + + "afterEnemyTick": { + + + "nurseAura": (e, _buff, enemy, data) => { + KDEventMapEnemy[e.trigger][e.type](e, enemy, data); + }, + // Simple spell checkerboard pattern + "spellX": (e, _buff, enemy, data) => { + KDEventMapEnemy[e.trigger][e.type](e, enemy, data); + }, + // Has 4 missiles, launches 1 at a time, reloads every e.time turns + "Missiles": (e, buff, enemy, data) => { + if (data.delta + && KinkyDungeonCanCastSpells(enemy) + && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + + let dist = 11 - Math.min(4, buff.power); + let nearby = (e.always || enemy.aware || enemy.vp > 0.5) ? + KDNearbyEnemies(enemy.x, enemy.y, dist, enemy).filter((en) => { + return !KDHelpless(en); + }) : []; + if ((e.always || enemy.aware || enemy.vp > 0.5) + && (e.always || nearby.length > 0 || KinkyDungeonAggressive(enemy))) { + if (buff.power > 0) { + let player = KDHostile(enemy, KDPlayer()) ? KDPlayer() : null; + let playerdist = player ? KDistChebyshev(enemy.x - player.x, enemy.y - player.y) : dist + 1; + if (nearby.length > 0) { + nearby = nearby.filter((en) => { + return KDistChebyshev(enemy.x - en.x, enemy.y - en.y) < playerdist; + }); + if (nearby.length > 0) { + // 3 attempts to retarget + for (let i = 0; i < 3; i++) { + player = nearby[Math.floor(KDRandom() * nearby.length)]; + if (KinkyDungeonCheckLOS( + enemy, + player, + KDistChebyshev(enemy.x - player.x, enemy.y - player.y), + dist, false, true, 1)) break; + } + } + } + + if (!player) return; + if (player && !enemy.aware) return; + if (KinkyDungeonCheckLOS( + enemy, + player, + KDistChebyshev(enemy.x - player.x, enemy.y - player.y), + dist, false, true, 1)) { + let origin = enemy; + let spell = KinkyDungeonFindSpell(e.spell, true); + let b = KinkyDungeonLaunchBullet(origin.x, origin.y, + player.x, player.y, + 0.5, { + noSprite: spell.noSprite, faction: KDGetFaction(enemy), name: spell.name, block: spell.block, volatile: spell.volatile, blockType: spell.blockType, + volatilehit: spell.volatilehit, + width: spell.size, height: spell.size, summon: spell.summon, + targetX: player.x, targetY: player.y, cast: Object.assign({}, spell.spellcast), + source: enemy.id, dot: spell.dot, + bulletColor: spell.bulletColor, bulletLight: spell.bulletLight, + bulletSpin: spell.bulletSpin, + effectTile: spell.effectTile, effectTileDurationMod: spell.effectTileDurationMod, + effectTileTrail: spell.effectTileTrail, effectTileDurationModTrail: spell.effectTileDurationModTrail, effectTileTrailAoE: spell.effectTileTrailAoE, + passthrough: spell.noTerrainHit, noEnemyCollision: spell.noEnemyCollision, alwaysCollideTags: spell.alwaysCollideTags, nonVolatile: spell.nonVolatile, noDoubleHit: spell.noDoubleHit, + pierceEnemies: spell.pierceEnemies, piercing: spell.piercing, events: spell.events, + lifetime: (spell.bulletLifetime ? spell.bulletLifetime : 1000), origin: { x: origin.x, y: origin.y }, range: KDGetSpellRange(spell), hit: spell.onhit, + damage: { + evadeable: spell.evadeable, noblock: spell.noblock, + ignoreshield: spell?.ignoreshield, + shield_crit: spell?.shield_crit, // Crit thru shield + shield_stun: spell?.shield_stun, // stun thru shield + shield_freeze: spell?.shield_freeze, // freeze thru shield + shield_bind: spell?.shield_bind, // bind thru shield + shield_snare: spell?.shield_snare, // snare thru shield + shield_slow: spell?.shield_slow, // slow thru shield + shield_distract: spell?.shield_distract, // Distract thru shield + shield_vuln: spell?.shield_vuln, // Vuln thru shield + + damage: e.power || spell.power, type: spell.damage, distract: spell.distract, distractEff: spell.distractEff, desireMult: spell.desireMult, bindEff: spell.bindEff, + bind: spell.bind, bindType: spell.bindType, boundBonus: spell.boundBonus, time: spell.time, flags: spell.damageFlags + }, spell: spell + }, false, enemy.x, enemy.y); + b.visual_x = origin.x; + b.visual_y = origin.y; + let dist = KDistEuclidean(player.x - origin.x, player.y - origin.y); + b.vy = 0.5 * (player.y - origin.y) / dist; + b.vx = 0.5 * (player.x - origin.x) / dist; + + buff.power -= 1; + KinkyDungeonSetEnemyFlag(enemy, "MissilesReload", e.time); + } + } + } + + if (buff.power < (e.count || 4) && !KDEnemyHasFlag(enemy, "MissilesReload") && enemy.attackPoints < 1) { + buff.power += 1; + KinkyDungeonSetEnemyFlag(enemy, "MissilesReload", e.time); + } + buff.aurasprite = "Missiles" + Math.floor(buff.power); + } + }, + "Airbender": (e, buff, enemy, data) => { + if (data.delta + && KinkyDungeonCanCastSpells(enemy) + && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + + let dist = 3; + let nearby = (e.always || enemy.aware || enemy.vp > 0.5) ? + KDNearbyEnemies(enemy.x, enemy.y, dist, enemy).filter((en) => { + return !KDHelpless(en); + }) : []; + if ((e.always || enemy.aware || enemy.vp > 0.5) + && (e.always || nearby.length > 0 || KinkyDungeonAggressive(enemy))) { + if (buff.power > 0) { + let player = KDHostile(enemy, KDPlayer()) ? KDPlayer() : null; + let playerdist = player ? KDistChebyshev(enemy.x - player.x, enemy.y - player.y) : dist + 1; + if (nearby.length > 0) { + nearby = nearby.filter((en) => { + return KDistChebyshev(enemy.x - en.x, enemy.y - en.y) < playerdist; + }); + if (nearby.length > 0) { + // 2 attempts to retarget + for (let i = 0; i < 2; i++) { + player = nearby[Math.floor(KDRandom() * nearby.length)]; + if (KinkyDungeonCheckLOS( + enemy, + player, + KDistChebyshev(enemy.x - player.x, enemy.y - player.y), + dist, false, true, 1)) break; + } + } + } + + if (!player) return; + if (player && !enemy.aware) return; + if (KinkyDungeonCheckLOS(enemy, player, + KDistChebyshev(enemy.x - player.x, enemy.y - player.y), dist, false, true, 1)) { + let origin = enemy; + let spell = KinkyDungeonFindSpell(e.spell, true); + let b = KinkyDungeonLaunchBullet(origin.x, origin.y, + player.x, player.y, + 0.5, { + noSprite: spell.noSprite, faction: KDGetFaction(enemy), name: spell.name, block: spell.block, volatile: spell.volatile, blockType: spell.blockType, + volatilehit: spell.volatilehit, + width: spell.size, height: spell.size, summon: spell.summon, + targetX: player.x, targetY: player.y,//cast: Object.assign({}, spell.spellcast), + source: enemy.id, dot: spell.dot, + bulletColor: spell.bulletColor, bulletLight: spell.bulletLight, + bulletSpin: spell.bulletSpin, + effectTile: spell.effectTile, effectTileDurationMod: spell.effectTileDurationMod, + effectTileTrail: spell.effectTileTrail, effectTileDurationModTrail: spell.effectTileDurationModTrail, effectTileTrailAoE: spell.effectTileTrailAoE, + passthrough: spell.noTerrainHit, noEnemyCollision: spell.noEnemyCollision, alwaysCollideTags: spell.alwaysCollideTags, nonVolatile: spell.nonVolatile, noDoubleHit: spell.noDoubleHit, + pierceEnemies: spell.pierceEnemies, piercing: spell.piercing, events: spell.events, + lifetime: (spell.bulletLifetime ? spell.bulletLifetime : 1000), origin: { x: origin.x, y: origin.y }, range: KDGetSpellRange(spell), hit: spell.onhit, + damage: { + evadeable: spell.evadeable, noblock: spell.noblock, + ignoreshield: spell?.ignoreshield, + shield_crit: spell?.shield_crit, // Crit thru shield + shield_stun: spell?.shield_stun, // stun thru shield + shield_freeze: spell?.shield_freeze, // freeze thru shield + shield_bind: spell?.shield_bind, // bind thru shield + shield_snare: spell?.shield_snare, // snare thru shield + shield_slow: spell?.shield_slow, // slow thru shield + shield_distract: spell?.shield_distract, // Distract thru shield + shield_vuln: spell?.shield_vuln, // Vuln thru shield + damage: spell.power, type: spell.damage, distract: spell.distract, distractEff: spell.distractEff, desireMult: spell.desireMult, bindEff: spell.bindEff, bind: spell.bind, bindType: spell.bindType, boundBonus: spell.boundBonus, time: spell.time, flags: spell.damageFlags + }, + spell: spell + }, false, enemy.x, enemy.y); + b.visual_x = origin.x; + b.visual_y = origin.y; + let dist = KDistEuclidean(player.x - origin.x, player.y - origin.y); + b.vy = spell.speed * (player.y - origin.y) / dist; + b.vx = spell.speed * (player.x - origin.x) / dist; + + buff.power -= 1; + KinkyDungeonSetEnemyFlag(enemy, "AirbenderReload", e.time); + } + } + } + + if (buff.power < (e.count || 2) && !KDEnemyHasFlag(enemy, "AirbenderReload")) { + buff.power += 1; + KinkyDungeonSetEnemyFlag(enemy, "AirbenderReload", e.time); + } + buff.aurasprite = "Airbender" + Math.floor(buff.power); + } + }, + }, + + "tickAfter": { + "EnemyAim": (_e, _buff, entity, _data) => { + if (entity == KDPlayer()) { + // Do nothing + } else { + KinkyDungeonApplyBuffToEntity(entity, KDAim2); + KinkyDungeonApplyBuffToEntity(entity, KDAim3); + if (KDEntityBuffedStat(entity, "Aim") <= 1.5 && _data.delta > 0) { + // Do aim subroutine + let x = _buff.x; + let y = _buff.y; + if (x != undefined && y != undefined && entity.target && entity.tx && entity.ty) { + if (x != entity.tx || y != entity.ty) { + // move cursor + let dist = Math.max(0, KDistChebyshev(x - entity.tx, y - entity.ty)); + let target = KDLookupID(entity.target, true); + let vx = target ? (target.lastmove == KinkyDungeonCurrentTick ? target.x - target.lastx : 0) : 0; + let vy = target ? (target.lastmove == KinkyDungeonCurrentTick ? target.y - target.lasty : 0) : 0; + let tx = entity.tx + vx*dist/_e.dist; + let ty = entity.ty + vy*dist/_e.dist; + for (let i = 0; i < _e.dist; i++) { + if (_buff.delay > 0) { + _buff.delay--; + } else { + let dir = KinkyDungeonGetDirection(tx - _buff.x, ty - _buff.y); + if (dir.delta > 0) { + _buff.x += dir.x; + _buff.y += dir.y; + } + } + + } + if (_buff.x == tx && _buff.y == ty) { + KinkyDungeonApplyBuffToEntity(entity, KDAim, { + power: 2, + x: _buff.x, + y: _buff.y, + vx: _buff.vx, + vy: _buff.vy, + }); + } + } else { + // progress to aim 2 + KinkyDungeonApplyBuffToEntity(entity, KDAim, { + power: 2, + x: _buff.x, + y: _buff.y, + vx: _buff.vx, + vy: _buff.vy, + }); + } + } + } + + } + }, + "ApplyConduction": (e, buff, entity, _data) => { + if (!buff.duration) return; + let bb = Object.assign({}, KDConduction); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + if (entity.player) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + } else { + if (!entity.buffs) entity.buffs = {}; + KinkyDungeonApplyBuffToEntity(entity, bb); + } + }, + "ApplySlowed": (e, buff, entity, _data) => { + if (!buff.duration) return; + let bb = Object.assign({}, KDSlowed); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + if (entity.player) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + } else { + if (!entity.buffs) entity.buffs = {}; + KinkyDungeonApplyBuffToEntity(entity, bb); + } + }, + "ApplyKnockback": (e, _buff, entity, _data) => { + let bb = Object.assign({}, KDKnockbackable); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + if (entity.player) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + } else { + if (!entity.buffs) entity.buffs = {}; + KinkyDungeonApplyBuffToEntity(entity, bb); + } + }, + "ApplyVuln": (_e, _buff, entity, _data) => { + if (!entity.player) { + if (!entity.vulnerable) entity.vulnerable = 1; + } + }, + "ApplyAttackSlow": (e, buff, entity, _data) => { + if (!buff.duration) return; + let bb = Object.assign({}, KDAttackSlow); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + if (entity.player) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + } else { + if (!entity.buffs) entity.buffs = {}; + KinkyDungeonApplyBuffToEntity(entity, bb); + } + }, + "ApplySilence": (e, buff, entity, _data) => { + if (!buff.duration) return; + if (!entity.player && entity.Enemy.bound) { + if (!e.prereq || KDCheckPrereq(entity, e.prereq)) + KDSilenceEnemy(entity, e.duration); + } + }, + "ApplyGlueVuln": (e, buff, entity, _data) => { + if (!buff.duration) return; + let bb = Object.assign({}, KDGlueVulnLow); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + if (entity.player) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + } else { + if (!entity.buffs) entity.buffs = {}; + KinkyDungeonApplyBuffToEntity(entity, bb); + } + }, + }, +}; + +/** + * @param Event + * @param e + * @param buff + * @param entity + * @param data + */ +function KinkyDungeonHandleBuffEvent(Event: string, e: KinkyDungeonEvent, buff: any, entity: entity, data: any) { + if (Event === e.trigger && KDEventMapBuff[e.dynamic ? "dynamic" : Event] && KDEventMapBuff[e.dynamic ? "dynamic" : Event][e.type]) { + if (KDCheckCondition(e, data)) + KDEventMapBuff[e.dynamic ? "dynamic" : Event][e.type](e, buff, entity, data); + } +} + + +let KDEventMapOutfit: Record void>> = { + "calcEvasion": { + "AccuracyBuff": (e, _outfit, data) => { + if (data.enemy && data.enemy.Enemy && data.enemy.Enemy.tags[e.requiredTag]) { + data.hitmult *= e.power; + } + }, + }, + "calcSneak": { + FactionStealth: (e, _outfit, data) => { + if (data.enemy && (!e.kind || KDGetFaction(data.enemy) == e.kind)) { + data.sneakThreshold += e.power || 0; + data.visibility *= e.mult != undefined ? e.mult : 1; + } + } + + }, + "tick": { + "sneakBuff": (e, outfit, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: outfit.name + "Sneak", type: "SlowDetection", power: e.power, duration: 2, }); + }, + "armorBuff": (e, outfit, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: outfit.name + "Armor", type: "Armor", power: e.power, duration: 2, }); + }, + "buff": (e, outfit, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: outfit.name + e.kind, type: e.kind, power: e.power, duration: 2, }); + }, + "damageResist": (e, outfit, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: outfit.name + e.damage + "damageResist", type: e.damage + "DamageResist", power: e.power, duration: 2, }); + }, + }, + +}; + +/** + * @param Event + * @param e + * @param outfit + * @param data + */ +function KinkyDungeonHandleOutfitEvent(Event: string, e: KinkyDungeonEvent, outfit: outfit, data: any) { + if (Event === e.trigger && KDEventMapOutfit[e.dynamic ? "dynamic" : Event] && KDEventMapOutfit[e.dynamic ? "dynamic" : Event][e.type]) { + if (KDCheckCondition(e, data)) + KDEventMapOutfit[e.dynamic ? "dynamic" : Event][e.type](e, outfit, data); + } +} + +let KDEventMapSpell: Record void>> = { + "afterCalcMana": { + "MakeEssenceMote": (e, spell, data) => { + if (data.spell?.name == spell.name) { + data.cost *= 1.0 / Math.max(1, (KinkyDungeonStatDistractionMax / 10)); + } + } + }, + "miscast": { + "EssenceMote": (e, spell, data) => { + if (KinkyDungeonFlags.get("essMote")) + if (data.spell && (!data.spell.manacost || data.spell.noMiscast)) return; + let slots: KDPoint[] = []; + let x = KDPlayer().x; + let y = KDPlayer().y; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + let dd = KDistEuclidean(X, Y); + if ((X != 0 || Y != 0) && dd <= spell.aoe) { + let loc = (x + X) + "," + (y + Y); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x + X, y + Y))) { + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("mote")) { + continue; + } + } + } + slots.push({ x: x + X, y: y + Y }) + } + } + } + + if (slots.length > 0) { + let slot = slots[Math.floor(slots.length * KDRandom())]; + KDCreateEffectTile(slot.x, slot.y, { + name: "DistractionMote" + }, 0); + if (!KDEventData.shockwaves) KDEventData.shockwaves = []; + KDEventData.shockwaves.push({ + x: slot.x, + y: slot.y,// - .167, + radius: 1.5, + sprite: "Particles/PinkGlow.png", + }); + KinkyDungeonSetFlag("essMote", 1); + + //KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/MagicSlash.ogg"); + } + }, + }, + "afterChangeCharge": { + "Gunslinger": (e, _spell, data) => { + if (-data.amountChanged > 0) { + let player = KinkyDungeonPlayerEntity; + let buff = KDEntityGetBuff(player, "BattleRhythm"); + let max = 0.4 * KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(player, "MaxBattleRhythm")); + let mult = e.mult * KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(player, "MultBattleRhythm")); + let powerAdded = 10 * -data.amountChanged * mult; + if (powerAdded > 0) + KinkyDungeonSetFlag("BRCombat", 20); + if (!buff) { + powerAdded = Math.min(powerAdded, max); + KinkyDungeonApplyBuffToEntity(player, + { + id: "BattleRhythm", + type: "BattleRhythm", + aura: "#ff8933", + aurasprite: "Null", + buffSprite: true, + power: powerAdded, + duration: 9999, infinite: true, + text: Math.round(100 * powerAdded), + } + ); + KinkyDungeonSendFloater(player, `+${Math.round(powerAdded * 100)} ${TextGet("KDBattleRhythm")}`, "#ff8933", 1.5); + } else { + let origPower = buff.power; + buff.power += powerAdded; + buff.power = Math.min(buff.power, max); + buff.text = Math.round(100 * KDEntityBuffedStat(player, "BattleRhythm")); + KinkyDungeonSendFloater(player, `+${Math.round((buff.power - origPower) * 100)} ${TextGet("KDBattleRhythm")}`, "#ff8933", 1.5); + } + + // Set a flag to prevent duplicating this event + //KinkyDungeonSetFlag("BattleRhythm" + data.castID, 1); + } + }, + }, + "beforeCalcComp": { + "ReplaceVerbalIfFail": (e, spell, data) => { + if (data.spell?.tags?.includes(e.requiredTag)) { + if (data.spell.components) { + let failedcomp = []; + for (let comp of data.spell.components) { + if (!KDSpellComponentTypes[comp].check(spell, data.x, data.y)) { + failedcomp.push(comp); + } + } + let castdata = { + targetX: data.targetX, + targetY: data.targetY, + spell: spell, + components: data.components, + flags: { + miscastChance: KinkyDungeonMiscastChance, + }, + gaggedMiscastFlag: false, + gaggedMiscastType: "Gagged", + query: true, + }; + let cpp = KinkyDungeoCheckComponentsPartial(data.spell, + data.x, + data.y, + false, + false, + ); + + if (cpp.length > 0) + KDDoGaggedMiscastFlag(castdata, cpp); + let oldMiscast = castdata.flags.miscastChance; + + castdata = { + targetX: data.targetX, + targetY: data.targetY, + spell: spell, + components: ["Verbal"], + flags: { + miscastChance: KinkyDungeonMiscastChance, + }, + gaggedMiscastFlag: false, + gaggedMiscastType: "Gagged", + query: true, + }; + cpp = KinkyDungeoCheckComponentsPartial(data.spell, + data.x, + data.y, + false, + false, + ); + + if (cpp.length > 0) + KDDoGaggedMiscastFlag(castdata, cpp); + let newMiscast = castdata.flags.miscastChance; + if (failedcomp.length > 0 || oldMiscast > newMiscast) { + data.components = ["Verbal"]; + } + } + } + }, + }, + "calcSpellRange": { + "AddRange": (e, _spell, data) => { + if (data.spell?.tags?.includes(e.requiredTag)) { + data.range += e.power; + } + }, + }, + "afterPlayerAttack": { + "BattleTrance": (e, _spell, data) => { + if (!KinkyDungeonAttackTwiceFlag && (!e.chance || KDRandom() < e.chance) + && KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BattleRhythm") >= 0.395) { + if (data.enemy && data.enemy.hp > 0 && !(KDHelpless(data.enemy) && data.enemy.hp < 0.6)) { + KinkyDungeonAttackTwiceFlag = true; + KinkyDungeonLaunchAttack(data.enemy, 1); + KinkyDungeonAttackTwiceFlag = false; + } else if (data.enemy && (KDHelpless(data.enemy) || data.enemy.hp < 0.6)) { + if (KDHasSpell("CombatManeuver")) { + KinkyDungeonApplyBuffToEntity(KDPlayer(), { + id: "CombatManeuverQuick", + type: "Quickness", + duration: 2, + power: 1, + endSleep: true, currentCount: -1, maxCount: 1, tags: ["quickness", "move", "attack", "cast"] + }); + KinkyDungeonSendActionMessage(6, TextGet("KDCombatManeuver"), "#ffff33", 3); + } + } + } + }, + }, + "canOffhand": { + "RogueOffhand": (_e, _spell, data) => { + if (!data.canOffhand && KDHasSpell("RogueOffhand")) { + if (!(KDWeapon(data.item)?.heavy || KDWeapon(data.item)?.massive) + || KDWeapon(data.item)?.tags?.includes("illum")) { + data.canOffhand = true; + } + } + }, + "WizardOffhand": (_e, _spell, data) => { + if (!data.canOffhand && KDHasSpell("WizardOffhand")) { + if (KDWeaponIsMagic(data.item) || KDWeapon(data.item)?.tags?.includes("illum")) { + data.canOffhand = true; + } + } + }, + "FighterOffhand": (_e, _spell, data) => { + if (!data.canOffhand) { + data.canOffhand = true; + } + }, + }, + "attackCost": { + "CombatTraining": (e, _spell, data) => { + if (KinkyDungeonStatWill > 0) { + let amount = Math.min(e.power, e.mult * KinkyDungeonStatWill); + data.mult *= 1 - amount; + } + }, + }, + "affinity": { + "RogueEscape": (e, _spell, data: KDEventData_affinity) => { + if (data.affinity == "Edge" || data.affinity == "Hook") { + let nb = KDNearbyEnemies(data.entity.x, data.entity.y, e.dist).filter((enemy) => { + return !enemy.Enemy.tags.ghost; + }); + if (nb.length > 0) data.forceTrue = 2; + } + }, + }, + "postApply": { + "RogueEscape": (e, _spell, data: KDEventData_PostApply) => { + if (KinkyDungeonFlags.get("SelfBondage")) { + let buff = KDEntityGetBuff(data.player, "RogueEscape"); + if (buff) + buff.duration = 0; + buff = KDEntityGetBuff(data.player, "RogueEscape2"); + if (buff) + buff.duration = 0; + } else if (!data.Link && !data.UnLink) { + KinkyDungeonApplyBuffToEntity(data.player, { + id: "RogueEscape", + type: "FastStruggle", + aura: "#88ff88", + buffSprite: true, + power: e.power, + duration: e.time, + }); + KinkyDungeonApplyBuffToEntity(data.player, { + id: "RogueEscape2", + type: "BoostStruggle", + power: 0.2 + KDCalcRestraintBlock() * 0.1, + duration: e.time, + }); + } + }, + }, + "beforeCrit": { + "RogueTraps2": (_e, _spell, data) => { + if (data.faction == "Player" && data.spell && data.spell.tags?.includes("trap")) { + data.forceCrit = true; + } + } + }, + "postQuest": { + }, + "blockPlayer": { + "Riposte": (_e, _spell, data) => { + KinkyDungeonDamageEnemy(data.enemy, { + type: "stun", + damage: 0, + time: 3, + }, false, true, undefined, undefined, undefined); + if (!data.enemy?.vulnerable) { + data.enemy.vulnerable = 1; + } + } + }, + "beforeCast": { + "RogueTraps": (_e, _spell, data) => { + if (data.spell && data.spell.tags?.includes("trapReducible") && data.channel) { + data.channel = 0; + } + } + }, + "calcComp": { + "OneWithSlime": (_e, _spell, data) => { + if (data.spell && data.spell.tags && data.failed.length > 0 && (data.spell.tags.includes("slime") || data.spell.tags.includes("latex"))) { + let tiles = KDGetEffectTiles(data.x, data.y); + for (let t of Object.values(tiles)) { + if (t.tags && (t.tags.includes("slime") || t.tags.includes("latex"))) { + data.failed = []; + return; + } + } + } + }, + "Psychokinesis": (_e, _spell, data) => { + if (data.spell && data.spell.tags && data.failed.length > 0 && data.spell.tags.includes("telekinesis")) { + if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax - 0.01) { + data.failed = []; + } + } + }, + }, + "calcCompPartial": { + "OneWithSlime": (_e, _spell, data) => { + if (data.spell && data.spell.tags && (data.failed.length > 0 || data.partial.length > 0) && (data.spell.tags.includes("slime") || data.spell.tags.includes("latex"))) { + let tiles = KDGetEffectTiles(data.x, data.y); + for (let t of Object.values(tiles)) { + if (t.tags && (t.tags.includes("slime") || t.tags.includes("latex"))) { + data.failed = []; + data.partial = []; + return; + } + } + } + }, + "Psychokinesis": (_e, _spell, data) => { + if (data.spell && data.spell.tags && (data.failed.length > 0 || data.partial.length > 0) && data.spell.tags.includes("telekinesis")) { + if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax - 0.01) { + data.failed = []; + data.partial = []; + } + } + }, + }, + "canSprint": { + "VaultBasic": (_e, _spell, data) => { + if (!data.passThru && KinkyDungeonSlowLevel < 2) { + let enemy = KinkyDungeonEntityAt(data.nextPosx, data.nextPosy); + if (enemy && !enemy?.player && (KDIsFlying(enemy) || !KDIsImmobile(enemy)) + && (KDIsFlying(enemy) || enemy.vulnerable || KinkyDungeonIsSlowed(enemy) || KinkyDungeonIsDisabled(enemy))) { + data.passThru = true; + } + } + }, + "Vault": (_e, _spell, data) => { + if (!data.passThru && KinkyDungeonSlowLevel < 2) { + let enemy = KinkyDungeonEntityAt(data.nextPosx, data.nextPosy); + if (enemy && !enemy?.player && (KDIsFlying(enemy) || !KDIsImmobile(enemy))) { + data.passThru = true; + } + } + }, + }, + "perkOrb": { + "Cursed": (_e, _spell, data) => { + if (data.perks && data.perks.includes("Cursed")) { + for (let shrine in KinkyDungeonShrineBaseCosts) { + KinkyDungeonGoddessRep[shrine] = -25; + } + } + }, + }, + "calcEdgeDrain": { + "ChangeEdgeDrain": (e, _spell, data) => { + data.edgeDrain *= e.mult || 1; + data.edgeDrain += e.power || 0; + }, + }, + "calcMaxStats": { + "IronWill": (e, _spell, data) => { + if (KinkyDungeonStatWill >= 9.999) + data.staminaRate += e.power; + }, + "SteadfastGuard": (e, _spell, _data) => { + if (!e.power || KinkyDungeonStatWill >= e.power) + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "SteadfastGuard", + type: "RestraintBlock", + power: (KinkyDungeonStatWill - (e.power || 0)) * e.mult, + duration: 2 + }); + }, + "IncreaseManaPool": (e, _spell, _data) => { + KinkyDungeonStatManaPoolMax += e.power; + }, + }, + "calcInvolOrgasmChance": { + "OrgasmResist": (e, _spell, data) => { + if (!KinkyDungeonPlayerBuffs?.d_OrgasmResist) { + if (KDGameData.Shield > 0) { + data.invol_chance *= 0; + } else if (KinkyDungeonStatWill >= 0.1) { + data.invol_chance *= Math.max(0, 1 - 10 * KinkyDungeonStatWill / KinkyDungeonStatWillMax); + } + + } + }, + }, + + "orgasm": { + "RestoreOrgasmMana": (e, _spell, data) => { + //if (KinkyDungeonStatWill > 0) { + let willPercentage = data.wpcost < 0 ? -KinkyDungeonStatWill / data.wpcost : 1.0; + if (willPercentage > 0) + KDChangeMana("spell", "orgasm", "tryOrgasm", 0, false, e.power * willPercentage); + KDChangeMana("spell", "orgasm", "tryOrgasm", e.power, false, 0, false, willPercentage > 0.5); + //} + }, + "OrgasmDamageBuff": (e, spell, data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: spell.name + "DamageBuff", + type: "magicDamageBuff", + power: e.power, + duration: e.time + (data.stunTime || 0) + }); + }, + "ChangeOrgasmStamina": (e, _spell, _data) => { + KDGameData.OrgasmStamina *= e.mult || 1; + KDGameData.OrgasmStamina += e.power || 0; + }, + }, + "tryOrgasm": { + "ChangeWPCost": (e, _spell, data) => { + data.wpcost *= e.mult || 1; + data.wpcost += e.power || 0; + }, + "ChangeSPCost": (e, _spell, data) => { + data.spcost *= e.mult || 1; + data.spcost += e.power || 0; + }, + }, + "deny": { + "RestoreDenyMana": (e, _spell, data) => { + let willPercentage = data.edgewpcost < 0 ? -KinkyDungeonStatWill / data.edgewpcost : 1.0; + if (willPercentage > 0) + KDChangeMana("spell", "deny", "tryOrgasm", 0, false, e.power * willPercentage); + KDChangeMana("spell", "deny", "tryOrgasm", e.power, false, 0, false, willPercentage > 0.5); + }, + }, + "calcEfficientMana": { + "ManaCost": (e, _item, data) => { + data.efficiency += e.power; + }, + }, + "calcMultMana": { + "StaffUser1": (e, _spell, data) => { + if (KinkyDungeonPlayerDamage && KDWeaponIsMagic({ name: KinkyDungeonPlayerWeapon })) + data.cost = Math.max(data.cost * e.power, 0); + }, + "StaffUser3": (e, _spell, data) => { + if (data.spell && data.spell.upcastFrom) + data.cost = data.cost * e.power; + }, + "TheShadowWithin": (e, _spell, data) => { + let player = KinkyDungeonPlayerEntity; + if (data.spell?.name == "ShadowDance") + if (!(KinkyDungeonBrightnessGet(player.x, player.y) < KDShadowThreshold || KDNearbyEnemies(player.x, player.y, 1.5).some((en) => { return en.Enemy?.tags?.shadow; }))) + data.cost = Math.max(data.cost * e.mult); + }, + }, + "beforeCalcMana": { + "ManaRegen": (e, _spell, data) => { + if (!KinkyDungeonPlayerBuffs.ManaRegenSuspend || KinkyDungeonPlayerBuffs.ManaRegenSuspend.duration < 1) { + if (data.spell && (data.spell.active || (!data.spell.passive && !data.passive))) + data.cost = Math.max(0, data.cost - KinkyDungeonStatManaMax * e.mult); + } + }, + }, + "beforeMultMana": { + "KineticMastery": (e, _spell, data) => { + if (data.spell?.tags?.includes(e.requiredTag) && KinkyDungeonPlayerDamage?.light) { + data.cost = Math.max(0, data.cost * e.mult); + } + }, + }, + "calcMana": { + "HeavyKinetic": (e, spell, data) => { + if (data.spell?.name == spell?.name && KinkyDungeonPlayerDamage?.heavy && !KinkyDungeonFlags.get("KineticMastery")) { + data.cost += e.power; + } + }, + "StaffUser2": (e, _spell, data) => { + if (data.spell && !data.spell.passive && data.spell.type != 'passive') + data.cost = Math.max(data.cost - e.power, Math.min(data.cost, 1)); + }, + }, + "afterMultMana": { + // + }, + "calcMiscast": { + "ManaBurst": (_e, _spell, data) => { + if (KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax > 0.99 || KinkyDungeonPlayerBuffs.ManaBurst) data.miscastChance -= 1.0; + }, + }, + "duringPlayerDamage": { + "ArcaneBarrier": (_e, _spell, _data) => { + /*if (data.dmg > 0) { + let player = KinkyDungeonPlayerEntity; + let buff = KDEntityGetBuff(player, "ArcaneEnergy"); + let amount = KDEntityBuffedStat(player, "ArcaneEnergy"); + let efficiency = KinkyDungeonMultiplicativeStat(-e.power + KDEntityBuffedStat(player, "EfficiencyArcaneEnergy")); + + let dmgBefore = data.dmg; + data.dmg = Math.max(0, data.dmg - Math.max(0, amount * (e.mult || 1))); + + if (buff) { + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `-${Math.round((dmgBefore - data.dmg)*efficiency*10)} ${TextGet("KDArcaneEnergy")}`, "#8888ff", 3); + buff.power = Math.max(0, buff.power - (dmgBefore - data.dmg)*efficiency); + if (buff.power <= 0) buff.duration = 0; + buff.text = Math.round(10 * KDEntityBuffedStat(player, "ArcaneEnergy")); + } + }*/ + } + }, + "doAttackCalculation": { + "BattleRhythm": (e, _spell, data) => { + if (data.target?.player && data.attacker) { + let player = KinkyDungeonPlayerEntity; + let buff = KDEntityGetBuff(player, "BattleRhythm"); + let power = KDEntityBuffedStat(player, "BattleRhythm"); + let efficiency = 2.5 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(player, "EfficiencyBattleRhythm")); + let mult = power; + let wouldHit = (data.EvasionRoll > data.BaseEvasion * KinkyDungeonMultiplicativeStat(data.accuracy - 1) - data.playerEvasion) + && (data.BlockRoll > data.BaseBlock * KinkyDungeonMultiplicativeStat(data.accuracy - 1) - data.playerBlock); + data.accuracy = Math.max(0, data.accuracy - mult); + let wouldHit2 = (data.EvasionRoll > data.BaseEvasion * KinkyDungeonMultiplicativeStat(data.accuracy - 1) - data.playerEvasion) + && (data.BlockRoll > data.BaseBlock * KinkyDungeonMultiplicativeStat(data.accuracy - 1) - data.playerBlock); + if (power > 0 && wouldHit && !wouldHit2 && KDGameData.AncientEnergyLevel >= (e.energyCost || 0)) { + if (buff) { + let enemyPower = (data.attacker.Enemy?.power || 1) * 0.01; + KinkyDungeonSendTextMessage(4, TextGet("KDBattleRhythmDodge"), "#aaff00", 2); + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `-${Math.round(efficiency * enemyPower * 100)} ${TextGet("KDBattleRhythm")}`, "#ff8933", 1.5); + buff.power = Math.max(0, buff.power - efficiency * enemyPower); + if (buff.power <= 0) buff.duration = 0; + buff.text = Math.round(100 * KDEntityBuffedStat(player, "BattleRhythm")); + } + } + } + }, + }, + "calcEnemyAccuracy": { + "BattleRhythm": (e, _spell, data) => { + if (data.target?.player && data.attacker) { + let player = KinkyDungeonPlayerEntity; + let power = KDEntityBuffedStat(player, "BattleRhythm"); + let mult = power; + data.accuracy = Math.max(0, data.accuracy - mult); + } + }, + }, + "afterPlayerCast": { + "ManaRegenSuspend": (e, _spell, data) => { + if ((data.spell && data.spell.manacost != 0) && (!(KDEntityHasBuff(KinkyDungeonPlayerEntity, "ManaRegenSuspend", true)) || !KDHasSpell("ManaRegenPlus2"))) { + let duration = KDHasSpell("ManaRegenFast2") ? e.time * 0.375 : (KDHasSpell("ManaRegenFast") ? e.time * 0.625 : e.time); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "ManaRegenSuspend", type: "ManaRegenSuspend", power: 1, duration: Math.ceil(duration), aura: "#ff5277", buffSprite: true, aurasprite: "AuraX", + }); + } + }, + "Psychokinesis": (e, _spell, data) => { + if (data.spell && data.spell.tags && data.spell.tags.includes("telekinesis")) { + if (KinkyDungeoCheckComponents(data.spell, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true).failed.length > 0) { + KDChangeDistraction("psychic", "spell", "cast", (data.spell.manacost ? data.spell.manacost : 1) * e.mult); + } + } + }, + }, + "afterSpellTrigger": { + "ManaRegenSuspend": (e, _spell, data) => { + if ((data.spell && !data.Passive && data.spell.manacost != 0) && (!KDEntityHasBuff(KinkyDungeonPlayerEntity, "ManaRegenSuspend") || !KDHasSpell("ManaRegenPlus2"))) { + let duration = KDHasSpell("ManaRegenFast2") ? e.time * 0.375 : (KDHasSpell("ManaRegenFast") ? e.time * 0.625 : e.time); + if (data.Toggle) duration *= 0.5; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "ManaRegenSuspend", type: "ManaRegenSuspend", power: 1, duration: Math.ceil(duration), aura: "#ff5277", buffSprite: true, aurasprite: "AuraX", + }); + } + }, + }, + "spellTrigger": { + "ArcaneStore": (_e, _spell, data) => { + if (!data.spell) return; + if (!data.castID) data.castID = KinkyDungeonGetSpellID(); + if (!data.manacost) data.manacost = KinkyDungeonGetManaCost(data.spell, data.Passive, data.Toggle); + if (data.manacost > 0 && !KinkyDungeonFlags.get("ArcaneStore" + data.castID)) { + let player = KinkyDungeonPlayerEntity; + let mult = 0.4 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(player, "MultArcaneEnergy")); + let powerAdded = data.manacost * mult; + + KDAddArcaneEnergy(player, powerAdded); + + // Set a flag to prevent duplicating this event + KinkyDungeonSetFlag("ArcaneStore" + data.castID, 1); + } + }, + }, + "playerCast": { + "ArcaneStore": (_e, _spell, data) => { + if (data.spell && data.manacost > 0 && !KinkyDungeonFlags.get("ArcaneStore" + data.castID)) { + let player = KinkyDungeonPlayerEntity; + let mult = 0.4 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(player, "MultArcaneEnergy")); + let powerAdded = data.manacost * mult; + + KDAddArcaneEnergy(player, powerAdded); + + // Set a flag to prevent duplicating this event + KinkyDungeonSetFlag("ArcaneStore" + data.castID, 1); + } + }, + "ArcaneBlast": (e, _spell, data) => { + if (data.spell && data.spell.name == "ArcaneBlast") { + let player = KinkyDungeonPlayerEntity; + let buff = KDEntityGetBuff(player, "ArcaneEnergy"); + let power = KDEntityBuffedStat(player, "ArcaneEnergy"); + let efficiency = KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(player, "EfficiencyArcaneEnergy")); + if (power > 0 && data.bulletfired && KDGameData.AncientEnergyLevel >= (e.energyCost || 0)) { + let damage = Math.min(KinkyDungeonStatManaMax * e.mult, power); + + data.bulletfired.bullet.damage.damage = damage; + if (buff) { + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `-${Math.round(efficiency * damage * 10)} ${TextGet("KDArcaneEnergy")}`, "#8888ff", KDToggles.FastFloaters ? 0.7 : 1.5); + buff.power = Math.max(0, buff.power - efficiency * damage); + if (buff.power <= 0) buff.duration = 0; + buff.text = Math.round(10 * KDEntityBuffedStat(player, "ArcaneEnergy")); + } + } + } + }, + "ArrowFireSpell": (e, _spell, data) => { + if (data.bulletfired && data.bulletfired.bullet?.spell?.tags?.some((t: string) => { return e.tags.includes(t); }) && KDGameData.AncientEnergyLevel > (e.energyCost || 0)) { + KDChangeCharge("arrow", "spell", "cast", (-e.energyCost || 0)); + data.bulletfired.bullet.spell = KinkyDungeonFindSpell(e.spell, true); + data.bulletfired.bullet.name = e.spell; + if (data.bulletfired.bullet.damage) { + if (e.power != undefined) + data.bulletfired.bullet.damage.damage += e.power; + if (e.damage != undefined) + data.bulletfired.bullet.damage.type = e.damage; + if (e.bind != undefined) + data.bulletfired.bullet.damage.bind = e.bind; + if (e.bindEff != undefined) + data.bulletfired.bullet.damage.bindEff = e.bindEff; + if (e.bindType != undefined) + data.bulletfired.bullet.damage.bindType = e.bindType; + if (e.addBind != undefined) + data.bulletfired.bullet.damage.addBind = e.addBind; + data.bulletfired.bullet.damage.time = e.time; + } + // Unique to FireSpell + if (e.aoe != undefined) { + data.bulletfired.bullet.hit = "aoe"; + } + data.bulletfired.bullet.height = 3; + data.bulletfired.bullet.width = 3; + data.bulletfired.bullet.pierceEnemies = undefined; + data.bulletfired.bullet.piercing = undefined; + data.bulletfired.bullet.bulletColor = 0xffaa44; + data.bulletfired.bullet.bulletLight = 5; + data.bulletfired.bullet.hitColor = 0xffaa44; + data.bulletfired.bullet.hitLight = 5; + + } + }, + "ArrowVineSpell": (e, _spell, data) => { + if (data.bulletfired && data.bulletfired.bullet?.spell?.tags?.some((t: string) => { return e.tags.includes(t); }) && KDGameData.AncientEnergyLevel > (e.energyCost || 0)) { + KDChangeCharge("arrow", "spell", "cast", (-e.energyCost || 0)); + data.bulletfired.bullet.spell = KinkyDungeonFindSpell(e.spell, true); + data.bulletfired.bullet.name = e.spell; + if (data.bulletfired.bullet.damage) { + if (e.power != undefined) + data.bulletfired.bullet.damage.damage += e.power; + if (e.damage != undefined) + data.bulletfired.bullet.damage.type = e.damage; + if (e.bind != undefined) + data.bulletfired.bullet.damage.bind = e.bind; + if (e.bindEff != undefined) + data.bulletfired.bullet.damage.bindEff = e.bindEff; + if (e.bindType != undefined) + data.bulletfired.bullet.damage.bindType = e.bindType; + if (e.addBind != undefined) + data.bulletfired.bullet.damage.addBind = e.addBind; + + data.bulletfired.bullet.damage.time = e.time; + } + // Unique to VineSpell + data.bulletfired.bullet.pierceEnemies = undefined; + data.bulletfired.bullet.piercing = undefined; + data.bulletfired.bullet.bulletColor = 0x55ff55; + data.bulletfired.bullet.hitColor = 0x55ff55; + data.bulletfired.bullet.hitLight = 5; + + } + }, + "ManaBurst": (_e, _spell, data) => { + if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.99 || KinkyDungeonPlayerBuffs.ManaBurst) { + let tb = KinkyDungeonGetManaCost(data.spell) * 0.6; + KinkyDungeonTeaseLevelBypass += tb; + KDGameData.OrgasmStage = Math.min((KDGameData.OrgasmStage + Math.ceil(tb)) || tb, KinkyDungeonMaxOrgasmStage); + } + }, + "LightningRod": (e, _spell, data) => { + if (data.spell && data.spell.tags && data.spell.manacost > 0 && (data.spell.tags.includes("air") || data.spell.tags.includes("electric"))) { + let bb = Object.assign({}, KDConduction); + bb.duration = 4; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "LightningRod", type: "electricDamageResist", aura: "#e7cf1a", power: e.power, player: true, duration: 4, + }); + } + }, + "LeatherBurst": (e, _spell, data) => { + if (data.spell && data.spell.tags && (data.spell.tags.includes("leather") && data.spell.tags.includes("burst"))) { + let power = KDEntityBuffedStat(KinkyDungeonPlayerEntity, "LeatherBurst"); + if (power < e.power) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "LeatherBurst", type: "LeatherBurst", aura: "#ffffff", power: power + 1, player: true, duration: 1.1 + }); + if (power > 0) + data.delta = 0; + } else { + KinkyDungeonExpireBuff(KinkyDungeonPlayerEntity, "LeatherBurst"); + } + } + }, + "SagittaAssault": (e, _spell, data) => { + if (data.spell && data.spell.tags && (data.spell.tags.includes("telekinesis") && data.spell.tags.includes("sagitta"))) { + let power = KDEntityBuffedStat(KinkyDungeonPlayerEntity, "SagittaAssault"); + if (power < e.power) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "SagittaAssault", type: "SagittaAssault", aura: "#ffffff", power: power + 1, player: true, duration: 1.1, buffsprite: true, + }); + if (power > 0) + data.delta = 0; + } else { + KinkyDungeonExpireBuff(KinkyDungeonPlayerEntity, "SagittaAssault"); + } + } + }, + }, + "calcPlayerEvasionEvent": { + "EvasiveManeuvers": (_e, _spell, data) => { + if (KinkyDungeonStatStamina >= KDEvasiveManeuversCost()) { + if (data.val > -2) data.val = -2; + } + + }, + }, + "calcEvasion": { + "AccuracyBuff": (e, _outfit, data) => { + if (data.enemy && data.enemy.Enemy) { + data.hitmult *= e.power; + } + }, + "HandsFree": (_e, spell, data) => { + if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.flags.KDEvasionHands) { + data.flags.KDEvasionHands = false; + } + }, + "ArmsFree": (_e, spell, data) => { + if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.flags.KDEvasionArms) { + data.flags.KDEvasionArms = false; + } + }, + }, + "calcManaPool": { + "EdgeRegenBoost": (e, _spell, data) => { + if (KDIsEdged(KinkyDungeonPlayerEntity)) { + data.manaPoolRegen += e.power; + } + }, + }, + + "afterChangeWill": { + "FirstWindStore": (e, _spell, data) => { + if (data.Amount < 0 + && ( + data.type == "tease" + || data.type == "edge" + || data.type == "deny" + || data.type == "orgasm" + ) + ) { + let player = KinkyDungeonPlayerEntity; + if (data.amountChanged < 0) { + KDAddTraineeWP(player, -data.amountChanged); + } + } + }, + }, + "tick": { + "FirstWind": (e, spell, data) => { + //if (KinkyDungeonFlags.get("FirstWind")) { + + /*if (KinkyDungeonStatWill >= 0.1) { + if (KinkyDungeonFlags.get("firstWindDis")) { + KinkyDungeonSetFlag("firstWindDis", 0); + KinkyDungeonSendTextMessage(10, TextGet("KDFirstWindEnable"), "#ff52fc", 2) + }*/ + + let amount = 0.25; + let player = KDPlayer(); + let max = KinkyDungeonStatWillMax - KinkyDungeonStatWill; + let buff = KDEntityGetBuff(player, "TraineeWP"); + if (buff?.power > max) { + buff.power = max; + if (buff.power <= 0) buff.duration = 0; + buff.text = Math.round(10 * KDEntityBuffedStat(player, "RallyWill")); + } + + + if (KinkyDungeonStatWill < KinkyDungeonStatWillMax * amount + ) { + + + if (buff?.power > 0) { + let amt = e.power; + buff.power = Math.max(0, buff.power - data.delta * amt); + KDChangeWill("trainee", "regen", "tick", Math.min(amt, buff.power), false); + if (buff.power <= 0) buff.duration = 0; + buff.text = Math.round(10 * KDEntityBuffedStat(player, "RallyWill")); + } + } + /*} else { + if (!KinkyDungeonFlags.get("firstWindDis")) { + KinkyDungeonSendTextMessage(10, TextGet("KDFirstWindDisable"), "#ff5277", 10) + } + KinkyDungeonSetFlag("firstWindDis", 2); + }*/ + + //} + }, + "FirstWindHigher": (e, spell, data) => { + let amount = 0.75; + let player = KDPlayer(); + + let max = KinkyDungeonStatWillMax - KinkyDungeonStatWill; + let buff = KDEntityGetBuff(player, "TraineeWP"); + if (buff?.power > max) { + buff.power = max; + if (buff.power <= 0) buff.duration = 0; + buff.text = Math.round(10 * KDEntityBuffedStat(player, "RallyWill")); + } + + + if (KinkyDungeonStatWill >= KinkyDungeonStatWillMax * amount + && KinkyDungeonStatWill < KinkyDungeonStatWillMax + ) { + + if (buff?.power > 0) { + let amt = Math.min(Math.abs(KinkyDungeonStatWillMax - KinkyDungeonStatWill), e.power); + KDChangeWill("trainee", "regen", "tick", data.delta * Math.min(amt, buff.power), false); + buff.power = Math.max(0, buff.power - data.delta * amt); + if (buff.power <= 0) buff.duration = 0; + buff.text = Math.round(10 * KDEntityBuffedStat(player, "RallyWill")); + } + } + }, + "ZeroResistance": (_e, _spell, _data) => { + KinkyDungeonSetFlag("ZeroResistance", 2); + }, + "ArcaneBarrier": (e, _spell, data) => { + if (data.delta > 0) { + let player = KinkyDungeonPlayerEntity; + let buff = KDEntityGetBuff(player, "ArcaneEnergy"); + let efficiency = KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(player, "EfficiencyArcaneEnergy")); + + let shieldBuff = KDEntityGetBuff(player, "ArcaneEnergyShield"); + let shieldRate = 0.1 * e.power * efficiency; + for (let i = 0; i < (e.count || 1); i++) { + if (buff?.power > 0) { + if (!shieldBuff) { + shieldBuff = KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "ArcaneEnergyShield", + type: "Shield", + power: 0, + duration: 9999, infinite: true, + tags: ["shield"], + }); + } + + if (buff && buff.power >= .1 * e.mult && shieldBuff.power < (0 + 0.1 * KinkyDungeonStatManaMax) * (1 + KDEntityBuffedStat(player, "ArcaneBarrierShield")) && KDGameData.ShieldDamage < 1) { + buff.power = Math.max(0, buff.power - data.delta * .1 * e.mult); + shieldBuff.power = Math.min(KinkyDungeonStatManaMax * (0.5 + 0.5 * KDEntityBuffedStat(player, "ArcaneBarrierShield")), shieldBuff.power + data.delta * shieldRate); + if (buff.power <= 0) buff.duration = 0; + buff.text = Math.round(10 * KDEntityBuffedStat(player, "ArcaneEnergy")); + } + } + } + } + + + + + }, + "BattleTrance": (e, _weapon, _data) => { + if (!KinkyDungeonAttackTwiceFlag && (!e.chance || KDRandom() < e.chance) && KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BattleRhythm") >= 0.395) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "BattleTrance", + type: "indicate", + power: 1, + duration: 2, + aura: "#ff8844", + buffSprite: true, + }); + } + }, + "WizardOffhand": (_e, _spell, _data) => { + if (!KDHasSpell("FighterOffhand")) { + if (KDGameData.Offhand && KinkyDungeonInventoryGetWeapon(KDGameData.Offhand)) { + let weapon = KDWeapon(KinkyDungeonInventoryGetWeapon(KDGameData.Offhand)); + if ((!KDHasSpell("RogueOffhand") && weapon?.clumsy) || weapon?.heavy || weapon?.massive) + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "WizardOffhand", + type: "SlowLevel", + power: 1, + duration: 2 + }); + } + } + }, + "CombatTrainingSlowResist": (_e, _spell, _data) => { + if (KinkyDungeonStatWill >= 0.1) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "CombatTraining", + type: "SlowLevel", + power: -1, + duration: 2 + }); + } + }, + "Offhand": (_e, _spell, _data) => { + if (KDGameData.Offhand && ( + !KinkyDungeonInventoryGetWeapon(KDGameData.Offhand) + || !KinkyDungeonCanUseWeapon(false, undefined, KDWeapon(KinkyDungeonInventoryGetWeapon(KDGameData.Offhand))) + || !KDCanOffhand(KinkyDungeonInventoryGetWeapon(KDGameData.Offhand)) + )) { + KDGameData.OffhandOld = KDGameData.Offhand; + KDGameData.Offhand = ""; + } + }, + "ArcaneEnergyBondageResist": (e, spell, _data) => { + let player = KinkyDungeonPlayerEntity; + let buff = KDEntityGetBuff(player, spell.name + "AEBR"); + let amount = Math.min(e.power, e.mult * KDEntityBuffedStat(player, "ArcaneEnergy")); + if (!buff) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, + { id: spell.name + "AEBR", type: "RestraintBlock", duration: 2, power: amount / 10 } + ); + } else { + buff.power = amount; + buff.duration = 2; + } + }, + "BREvasionBlock": (e, spell, _data) => { + let player = KinkyDungeonPlayerEntity; + if (KDEntityBuffedStat(player, "BattleRhythm") > e.mult) { + KinkyDungeonApplyBuffToEntity(player, + { id: spell.name + "BREvasion", type: "Evasion", duration: 2, power: e.power } + ); + KinkyDungeonApplyBuffToEntity(player, + { id: spell.name + "BRBlock", type: "Block", duration: 2, power: e.power } + ); + } + }, + "BRDecay": (e, _spell, data) => { + let player = KinkyDungeonPlayerEntity; + if (KDEntityBuffedStat(player, "BattleRhythm") > 0 && !KinkyDungeonFlags.get("PlayerCombat") && !KinkyDungeonFlags.get("BRCombat")) { + let buff = KDEntityGetBuff(player, "BattleRhythm"); + if (buff) { + buff.power = Math.max(0, buff.power - data.delta * e.power); + buff.text = Math.round(100 * KDEntityBuffedStat(player, "BattleRhythm")); + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `-${Math.round((e.power) * 100)} ${TextGet("KDBattleRhythm")}`, "#ff8933", 0.1); + if (buff.power == 0) buff.duration = 0; + } + } + }, + "OrgasmResistBuff": (_e, _spell, _data) => { + if (!KinkyDungeonPlayerBuffs?.d_OrgasmResist) + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, + { + id: "e_OrgasmResist", aura: "#ffffff", aurasprite: "Null", type: "e_OrgasmResist", duration: 2, power: 1, buffSprite: true, + click: "OrgasmResist", + player: true, enemies: true + } + ); + }, + "ManaRegenOld": (e, _spell, _data) => { + if (KinkyDungeonStatMana + KinkyDungeonStatManaPool < KinkyDungeonStatManaMax * e.mult && !KinkyDungeonPlayerBuffs.ManaRegenSuspend) { + + KDChangeMana("mage", "regen", "tick", e.power, false, 0, false, false); + if (KinkyDungeonStatMana > KinkyDungeonStatManaMax * e.mult) KinkyDungeonStatMana = KinkyDungeonStatManaMax * e.mult; + } + if (KinkyDungeonStatMana + KinkyDungeonStatManaPool <= KinkyDungeonStatManaMax * e.mult) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, + { id: "InnerPowerArcaneStore", aura: "#ff5277", aurasprite: "Null", type: "DisableArcaneStore", duration: 2, power: 1, buffSprite: true } + ); + } + }, + "SatisfiedDamageBuff": (e, spell, _data) => { + if (KDGameData.OrgasmStamina > 0 && (!KinkyDungeonPlayerBuffs || !KinkyDungeonPlayerBuffs[spell.name + "DamageBuff"] || KinkyDungeonPlayerBuffs[spell.name + "DamageBuff"].duration == 0)) + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: spell.name + "DamageBuffMinor", + type: "magicDamageBuff", + power: e.power, + duration: 2 + }); + }, + "RestoreEdgeMana": (e, _spell, data) => { + if (KDIsEdged(KinkyDungeonPlayerEntity) && data.delta > 0) { + KDChangeMana("trainee", "edge", "tick", e.power, true, 0, false, KinkyDungeonStatWill > 0); + if (KinkyDungeonStatWill > 0) { + KDChangeMana("trainee", "edge", "tick", 0, true, e.power); + } + } + }, + "Parry": (e, spell, _data) => { + if (KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.noHands) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: spell.name + "Block", type: "Block", power: e.power, duration: 2, }); + } + }, + "WillParry": (e, spell, _data) => { + if (KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.noHands && !KinkyDungeonPlayerDamage.light) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: spell.name + "Block", type: "Block", power: e.mult * KinkyDungeonStatWillMax, duration: 2, }); + } + }, + "SteelParry": (e, spell, _data) => { + if (KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.noHands && KinkyDungeonMeleeDamageTypes.includes(KinkyDungeonPlayerDamage.type)) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: spell.name + "Block", type: "Block", power: e.mult * KinkyDungeonStatWillMax, duration: 2, }); + } + }, + "GuardBoost": (_e, spell, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: spell.name + "Block", type: "Block", power: .15 + 0.15 * KinkyDungeonStatWill / KinkyDungeonStatWillMax, duration: 2, }); + }, + "DaggerParry": (e, spell, _data) => { + if (KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.noHands && KinkyDungeonPlayerDamage.light) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: spell.name + "Block", type: "Block", power: e.power, duration: 2, }); + } + }, + "ClaymoreParry": (e, spell, _data) => { + if (KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.noHands && KinkyDungeonPlayerDamage.heavy) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: spell.name + "Block", type: "Block", power: e.power, duration: 2, }); + } + }, + "ManaBurst": (_e, _spell, _data) => { + if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.99) { + if (!KinkyDungeonPlayerBuffs.ManaBurst) { + KinkyDungeonSendTextMessage(7, TextGet("KDManaBurstActivate"), "#ff7744", 5) + } + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "ManaBurst", type: "sfx", power: 1, duration: 3, buffSprite: true, + sfxApply: "PowerMagic", aura: "#ff8888", aurasprite: "Heart" + }); + } + }, + "Buff": (e, spell, data) => { + if (KDCheckPrereq(null, e.prereq, e, data)) + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.kind || spell.name) + e.buffType, + type: e.buffType, + power: e.power, + tags: e.tags, + currentCount: e.mult ? -1 : undefined, + maxCount: e.mult, + duration: 2 + }); + }, + "SlimeMimic": (_e, _spell, _data) => { + let tags = KDEffectTileTags(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + let condition = KinkyDungeonLastAction == "Wait" && (tags.slime || tags.latex); + let altcondition = (KinkyDungeonPlayerTags.get("Latex") || KinkyDungeonPlayerTags.get("Slime")) + && KinkyDungeonIsArmsBound(false, false) + && KinkyDungeonGagTotal() > 0.05 + && KinkyDungeonSlowLevel > 0; + if (condition || altcondition) { + let power = 4; + let groups = {}; + for (let inv of KinkyDungeonAllRestraintDynamic()) { + if (!groups[KDRestraint(inv.item).Group] + && (KDRestraint(inv.item).shrine?.includes("Latex") || KDRestraint(inv.item).shrine?.includes("Slime"))) { + groups[KDRestraint(inv.item).Group] = true; + power += 4; + } + } + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, + { + id: "SlimeMimic", aura: "#ff00ff", type: "SlowDetection", duration: 2, power: Math.min(24, power), + click: "SlimeMimic", disabletypes: ["d_SlimeMimic"], + player: true, enemies: true, endSleep: true, currentCount: -1, maxCount: 1, tags: ["SlowDetection", "move", "cast", "attack"] + } + ); + } + }, + "AccuracyBuff": (e, spell, _data) => { + if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, true))) { + //KDBlindnessCap = Math.min(KDBlindnessCap, e.power); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: spell.name + e.type + e.trigger, + type: "Accuracy", + duration: 1, + power: e.power, + }); + } + }, + "Analyze": (e, spell, _data) => { + let activate = false; + if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, false)) && !KinkyDungeonPlayerBuffs.Analyze) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "Analyze", buffSprite: true, aura: "#ff5277", type: "MagicalSight", power: e.power, duration: e.time }); + activate = true; + //KDTriggerSpell(spell, data, false, false); + } + if (KinkyDungeonPlayerBuffs.Analyze && KinkyDungeonPlayerBuffs.Analyze.duration > 1) { + // Nothing! + } else if (!activate) { + KinkyDungeonDisableSpell("Analyze"); + KinkyDungeonExpireBuff(KinkyDungeonPlayerEntity, "Analyze"); + } + }, + }, + "calcStats": { + "Blindness": (e, spell, _data) => { + if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, true))) { + //KDBlindnessCap = Math.min(KDBlindnessCap, e.power); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: spell.name + e.type + e.trigger, + type: "Blindness", + duration: e.time ? e.time : 0, + power: -1 + }); + } + }, + }, + "beforeMove": { + "FleetFooted": (e, spell, data) => { + if (!data.IsSpell && !KinkyDungeonNoMoveFlag && KinkyDungeonSlowLevel > 1 && KinkyDungeonHasStamina(1.1) && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, true))) { + let manacost = -KinkyDungeonGetManaCost(spell, true); + e.prevSlowLevel = KinkyDungeonSlowLevel; + KinkyDungeonSlowLevel = Math.max(0, KinkyDungeonSlowLevel - e.power); + if (KinkyDungeonHasMana(1.5) && KDGameData.MovePoints < 0) { + KDGameData.MovePoints = Math.min(0, KDGameData.MovePoints + 1); + manacost -= 1.5; + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonFleetFootedIgnoreSlow"), "lightgreen", 2); + } + else KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonFleetFooted"), "lightgreen", 2, false, true); + KDChangeMana(spell.name, "spell", "move", manacost); + } + }, + }, + "afterMove": { + "FleetFooted": (e, _spell, data) => { + if (e.prevSlowLevel && !data.IsSpell && KinkyDungeonSlowLevel < e.prevSlowLevel) { + KinkyDungeonSlowLevel = e.prevSlowLevel; + e.prevSlowLevel = undefined; + } + }, + }, + "beforeTrap": { + "FleetFooted": (e, spell, data) => { + if (data.flags.AllowTraps && !data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, true))) { + if (KDRandom() < e.chance) { + KDChangeMana(spell.name, "spell", "trap", -KinkyDungeonGetManaCost(spell, true)); + data.flags.AllowTraps = false; + KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonFleetFootedIgnoreTrap"), "lightgreen", 2); + } else { + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonFleetFootedIgnoreTrapFail"), "lightgreen", 2); + } + } + }, + }, + "afterDamageEnemy": { + "IcePrison": (e, _spell, data) => { + if (data.enemy && data.froze) { + if ((!e.chance || KDRandom() < e.chance) && KDHostile(data.enemy)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: "ice", + damage: 0, + time: 0, + bind: data.froze + Math.max(0, (data.enemy.Enemy.maxhp * 0.2 - (data.enemy.boundLevel || 0))), + bindType: "Ice", + }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); + if (KDHelpless(data.enemy) && !(data.enemy.freeze > 300)) data.enemy.freeze = 300; + } + } + }, + }, + "duringCrit": { + "RogueTargets": (e, _spell, data) => { + if (data.dmg > 0 && data.critical && data.enemy + && data.attacker?.player + && !data.customCrit && KDHostile(data.enemy) && !KDEnemyHasFlag(data.enemy, "RogueTarget")) { + data.crit *= e.mult; + data.bindcrit *= e.mult; + KinkyDungeonSetEnemyFlag(data.enemy, "RogueTarget", -1); + KDDamageQueue.push({ floater: TextGet("KDRogueCritical"), Entity: data.enemy, Color: "#ff5277", Delay: data.Delay }); + data.customCrit = true; + } + }, + "RogueBind": (_e, _spell, data) => { + if (data.dmg > 0 && data.critical && data.enemy && !data.customCrit && KDHostile(data.enemy) + && data.attacker?.player) { + if (data.bind || KinkyDungeonBindingDamageTypes.includes(data.type)) { + KDDamageQueue.push({ floater: TextGet("KDBindCritical"), Entity: data.enemy, Color: "#ff55aa", Delay: data.Delay }); + data.customCrit = true; + } + + } + }, + }, + + "beforeDamageEnemy": { + + "MultiplyDamageStealth": (e, spell, data) => { + if (data.dmg > 0 && data.enemy && KDHostile(data.enemy) && !data.enemy.aware && data.spell?.name == spell?.name) { + if ((!e.humanOnly || data.enemy.Enemy.bound) && (!e.chance || KDRandom() < e.chance)) { + data.dmg = Math.max(data.dmg * e.power, 0); + } + } + }, + "Peasant": (e, _spell, data) => { + if (data.dmg > 0 && data.enemy && data.enemy.Enemy.tags.plant) { + data.dmg = Math.max(data.dmg * e.mult, 0); + } + }, + "MakeVulnerable": (e, spell, data) => { + if (data.enemy && data.spell?.name == spell?.name) { + if ((!e.humanOnly || data.enemy.Enemy.bound) && (!e.chance || KDRandom() < e.chance) && !data.enemy.Enemy.tags.nonvulnerable) { + if (!data.enemy.vulnerable) data.enemy.vulnerable = 0; + data.enemy.vulnerable = Math.max(0, e.time); + } + } + }, + "TemperaturePlay": (e, _spell, data) => { + if (data.dmg > 0 && data.enemy && KDHostile(data.enemy) && ["fire", "frost", "ice"].includes(data.type)) { + if ((!e.humanOnly || data.enemy.Enemy.bound) && (!e.chance || KDRandom() < e.chance)) { + let percent = Math.min(1, KDBoundEffects(data.enemy) / 4); + data.dmg = Math.max(data.dmg * (1 + e.power * percent), 0); + } + } + }, + "Burning": (e, _spell, data) => { + if (data.enemy && (!data.flags || !data.flags.includes("BurningDamage")) && data.dmg > 0 && (!e.damage || e.damage == data.type)) { + if ((!e.chance || KDRandom() < e.chance)) { + KinkyDungeonApplyBuffToEntity(data.enemy, KDBurning); + } + } + }, + }, + "calcDamage": { + "HandsFree": (_e, spell, data) => { + if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && data.flags.KDDamageHands) { + data.flags.KDDamageHands = false; + } + }, + "ArmsFree": (_e, spell, data) => { + if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && data.flags.KDDamageArms) { + data.flags.KDDamageArms = false; + } + }, + + "UnconventionalWarfare": (_e, _spell, data) => { + if (!data.IsSpell && !data.forceUse) { + if (!KinkyDungeonCanUseWeapon(true, undefined, data.weapon) + && KDGameData.AttachedWep && data.weapon?.name == KDWeapon({ name: KDGameData.AttachedWep })?.name + && (data.flags.KDDamageHands || data.flags.KDDamageArms) + && (!KinkyDungeonIsArmsBound(false, true) || (KinkyDungeonCanStand() && KinkyDungeonSlowLevel < 2)) + && (!KDWeapon({ name: data.weapon?.name })?.noHands) + && !KDWeapon({ name: data.weapon?.name })?.unarmed) { + data.canUse = true; + data.flags.KDDamageHands = false; + data.flags.KDDamageArms = false; + data.accuracyMult = 0.6; + } + } + }, + "GuerillaFighting": (_e, _spell, data) => { + if (!data.IsSpell && !data.forceUse) { + if ((!KinkyDungeonCanUseWeapon(true, undefined, data.weapon) || KinkyDungeonIsArmsBound(false, true)) + && (KinkyDungeonGagTotal() < 0.01) && (data.flags.KDDamageHands || data.flags.KDDamageArms) + && (!KDWeapon({ name: data.weapon?.name })?.noHands) + && !KDWeapon({ name: data.weapon?.name })?.unarmed + && KDWeapon({ name: data.weapon?.name })?.light) { + data.canUse = true; + data.flags.KDDamageHands = false; + data.flags.KDDamageArms = false; + data.accuracyMult = 0.75; + } + } + }, + + + }, + "calcDamage2": { + "FloatingWeapon": (_e, _spell, data) => { + if (!data.IsSpell && !data.forceUse && (data.flags.KDDamageHands || data.flags.KDDamageArms)) { + if (!KinkyDungeonCanUseWeapon(true, undefined, data.weapon) + && (!KDWeapon({ name: data.weapon?.name })?.noHands || KDWeapon({ name: data.weapon?.name }).telekinetic) + && !KDWeapon({ name: data.weapon?.name })?.unarmed) { + data.canUse = true; + data.flags.KDDamageHands = false; + data.flags.KDDamageArms = false; + data.accuracyMult = 0; + } + } + }, + }, + "getWeapon": { + "HandsFree": (_e, spell, data) => { + if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && data.flags && !data.flags.HandsFree) { + data.flags.HandsFree = true; + } + }, + "UnconventionalWarfare": (_e, _spell, data) => { + if (!data.IsSpell && KDGameData.AttachedWep && data.flags?.weapon?.name == KDWeapon({ name: KDGameData.AttachedWep })?.name && !data.flags.HandsFree + && (!KinkyDungeonIsArmsBound(false, true) || (KinkyDungeonCanStand() && KinkyDungeonSlowLevel < 2))) { + data.flags.HandsFree = true; + } + }, + "GuerillaFighting": (_e, _spell, data) => { + if (!data.IsSpell && data.flags?.weapon && KDWeapon({ name: data.flags.weapon.name })?.light && !data.flags.HandsFree + && (KinkyDungeonGagTotal() < 0.01)) { + data.flags.HandsFree = true; + } + }, + }, + "beforePlayerAttack": { + "Shatter": (e, spell, data) => { + if ((!data.bullet || e.bullet) && KinkyDungeonPlayerDamage && (KinkyDungeonPlayerDamage.name == "IceBreaker") && data.enemy && data.enemy.freeze > 0 && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, true))) { + KDChangeMana("ice", "spell", "spellTrig", -KinkyDungeonGetManaCost(spell, true)); + KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, KinkyDungeonFindSpell("ShatterStrike", true), undefined, undefined, undefined); + KDTriggerSpell(spell, data, true, false); + } + }, + "BoostDamage": (e, spell, data) => { + if ((!data.bullet || e.bullet) && data.eva && KinkyDungeonHasMana(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell, false, true)) && !data.miss && !data.disarm && data.targetX && data.targetY && data.enemy && KDHostile(data.enemy)) { + if (KDCheckPrereq(null, e.prereq, e, data)) { + KDChangeMana("strength", "spell", "attack", -(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell, false, true))); + data.buffdmg = Math.max(0, data.buffdmg + e.power); + KDTriggerSpell(spell, data, false, true); + } + } + }, + /*"CritBoost": (e, spell, data) => { + if (data.eva&& !data.miss && !data.disarm && data.targetX && data.targetY && data.enemy && KDHostile(data.enemy)) { + if (KDCheckPrereq(null, e.prereq, e, data)) { + let power = Math.max(0, Math.max((Math.max(KinkyDungeonPlayerDamage.chance || 0, KinkyDungeonGetEvasion()) - 1)*e.power)); + data.buffdmg = Math.max(0, data.buffdmg + (KinkyDungeonPlayerDamage.dmg || 0) * power); + } + } + },*/ + }, + "calcDisplayDamage": { + "BoostDamage": (e, spell, data) => { + if (KinkyDungeonHasMana(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell, false, true))) { + if (KDCheckPrereq(null, e.prereq, e, data)) { + data.buffdmg = Math.max(0, data.buffdmg + e.power); + } + } + }, + /*"CritBoost": (e, spell, data) => { + if (KDCheckPrereq(null, e.prereq, e, data)) { + let power = Math.max(0, Math.max(((KinkyDungeonPlayerDamage.chance || 0) - 1)*e.power)); + data.buffdmg = Math.max(0, data.buffdmg + (KinkyDungeonPlayerDamage.dmg || 0) * power); + } + },*/ + }, + "calcBindCrit": { + "RogueBind": (e, _spell, data) => { + if (!e.prereq || KDCheckPrereq(null, e.prereq, e, data)) { + data.critboost += e.power; + } + }, + }, + "calcCrit": { + + "BattleCrit": (e, _spell, data) => { + if (!e.prereq || KDCheckPrereq(null, e.prereq, e, data)) { + data.critmult *= 1 + (e.mult * 100 * KDEntityBuffedStat(KinkyDungeonPlayerEntity, "BattleRhythm")); + } + }, + + "CritBoost": (e, _spell, data) => { + if (!e.prereq || KDCheckPrereq(null, e.prereq, e, data)) { + let power = Math.max(0, Math.max(((data.accuracy || 0) - 1) * e.power)); + data.critboost = Math.max(0, data.critboost + power); + } + }, + "MagicalOverload": (e, _spell, data) => { + if (!e.prereq || KDCheckPrereq(null, e.prereq, e, data)) { + data.critmult *= 1 + (e.power * KinkyDungeonStatDistraction / 10); + } + }, + }, + "tickAfter": { + "EvasiveManeuvers": (_e, spell, data) => { + let cost = KDEvasiveManeuversCost(); + if (KinkyDungeonStatStamina >= cost) { + if (data.delta > 0) + KDChangeStamina(spell.name, "spell", "evade", data.delta * (-cost), false, 1, false); + } else { + for (let i = 0; i < KinkyDungeonSpellChoices.length; i++) { + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[i]]?.name == spell.name) { + KinkyDungeonSpellChoicesToggle[i] = false; + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Damage.ogg"); + KinkyDungeonSendTextMessage(10, TextGet("KDEvasiveManeuversEnd"), "#ff8933", 2); + return; + } + } + } + + }, + "CombatTrainingSlowRecovery": (_e, _spell, data) => { + if (data.delta > 0) { + if (KDGameData.MovePoints < 0) { + if (!KinkyDungeonFlags.get("CombatTrainingRecov")) { + KinkyDungeonSetFlag("CombatTrainingRecov", 2); + } else { + KDGameData.MovePoints = Math.min(0, KDGameData.MovePoints + 1); + KinkyDungeonSetFlag("CombatTrainingRecov", 0); + } + } + } + }, + "Frustration": (_e, _spell, _data) => { + for (let en of KDMapData.Entities) { + if (en.Enemy.bound && !en.Enemy.nonHumanoid && en.buffs && KDEntityBuffedStat(en, "Chastity")) { + if (KDHelpless(en) && !KDIsImprisoned(en)) { + let Enemy = KinkyDungeonGetEnemyByName("PetChastity"); + let doll = { + summoned: true, + faction: "Rage", + Enemy: Enemy, + id: KinkyDungeonGetEnemyID(), + x: en.x, + y: en.y, + hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, + movePoints: 0, + attackPoints: 0 + }; + KDAddEntity(doll); + en.hp = 0; + KinkyDungeonSetEnemyFlag(en, "cap", 2); + } + } + } + }, + }, + "beforePlayerLaunchAttack": { + "BattleCost": (e, _spell, data) => { + if (!e.prereq || KDCheckPrereq(null, e.prereq, e, data)) { + data.attackCost *= Math.max(0, 1 - (e.mult * 100 * KDEntityBuffedStat(KinkyDungeonPlayerEntity, "BattleRhythm"))); + } + }, + "BattleRhythmStore": (_e, _spell, data) => { + let atkCost = Math.min(data.attackCost, data.attackCostOrig); + if (data.target && -atkCost > 0 && !KinkyDungeonFlags.get("BRStore" + data.target.id)) { + let player = KinkyDungeonPlayerEntity; + let buff = KDEntityGetBuff(player, "BattleRhythm"); + let max = 0.4 * KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(player, "MaxBattleRhythm")); + let mult = 0.1 * KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(player, "MultBattleRhythm")); + let powerAdded = 0.1 * -atkCost * mult; + if (powerAdded > 0) + KinkyDungeonSetFlag("BRCombat", 20); + if (!buff) { + powerAdded = Math.min(powerAdded, max); + KinkyDungeonApplyBuffToEntity(player, + { + id: "BattleRhythm", + type: "BattleRhythm", + aura: "#ff8933", + aurasprite: "Null", + buffSprite: true, + power: powerAdded, + duration: 9999, infinite: true, + text: Math.round(100 * powerAdded), + } + ); + KinkyDungeonSendFloater(data.target, `+${Math.round(powerAdded * 100)} ${TextGet("KDBattleRhythm")}`, "#ff8933", 1.5); + } else { + let origPower = buff.power; + buff.power += powerAdded; + buff.power = Math.min(buff.power, max); + buff.text = Math.round(100 * KDEntityBuffedStat(player, "BattleRhythm")); + KinkyDungeonSendFloater(data.target, `+${Math.round((buff.power - origPower) * 100)} ${TextGet("KDBattleRhythm")}`, "#ff8933", 1.5); + } + + // Set a flag to prevent duplicating this event + //KinkyDungeonSetFlag("BattleRhythm" + data.castID, 1); + } + }, + }, + "playerAttack": { + "FlameBlade": (_e, spell, data) => { + if (!data.bullet && KinkyDungeonPlayerDamage && ((KinkyDungeonPlayerDamage.name && KinkyDungeonPlayerDamage.name != "Unarmed") || KinkyDungeonStatsChoice.get("Brawler")) && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && data.targetX && data.targetY && (data.enemy && KDHostile(data.enemy))) { + KDChangeMana(spell.name, "spell", "attack", -KinkyDungeonGetManaCost(spell, false, true)); + KinkyDungeonCastSpell(data.targetX, data.targetY, KinkyDungeonFindSpell("FlameStrike", true), undefined, undefined, undefined); + KDTriggerSpell(spell, data, false, true); + } + }, + "ManaRegenSuspend": (e, _spell, data) => { + if (((!data.bullet || e.bullet) || e.bullet) && !KDHasSpell("ManaRegenPlus")) { + let time = e.time; + if (KDHasSpell("ManaRegenFast2")) time *= 0.375; + else if (KDHasSpell("ManaRegenFast")) time *= 0.625; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "ManaRegenSuspend", type: "ManaRegenSuspend", power: 1, duration: Math.ceil(time), aura: "#ff5277", buffSprite: true, aurasprite: "AuraX", + }); + } + }, + "ElementalEffect": (e, spell, data) => { + if ((!data.bullet || e.bullet) && KinkyDungeonHasMana(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell, false, true)) && !data.miss && !data.disarm && data.targetX && data.targetY && data.enemy && KDHostile(data.enemy)) { + KDChangeMana(spell.name, "spell", "attack", -(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell, false, true))); + KDTriggerSpell(spell, data, false, true); + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + bindEff: e.bindEff, + }, false, e.power < 0.5, undefined, undefined, KinkyDungeonPlayerEntity); + } + }, + "EffectTile": (e, spell, data) => { + if (KinkyDungeonHasMana(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell, false, true)) && !data.miss && !data.disarm && data.targetX && data.targetY && data.enemy && KDHostile(data.enemy)) { + KDChangeMana(spell.name, "spell", "attack", -(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell, false, true))); + KDTriggerSpell(spell, data, false, true); + KDCreateEffectTile(data.targetX, data.targetY, { + name: e.kind, + duration: e.duration, + }, e.variance); + } + }, + "EffectTileAoE": (e, spell, data) => { + if (KinkyDungeonHasMana(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell, false, true)) && !data.miss && !data.disarm && data.targetX && data.targetY && data.enemy && KDHostile(data.enemy)) { + KDChangeMana(spell.name, "spell", "attack", -(e.cost != undefined ? e.cost : KinkyDungeonGetManaCost(spell, false, true))); + KDTriggerSpell(spell, data, false, true); + KDCreateAoEEffectTiles(data.targetX, data.targetY, { + name: e.kind, + duration: e.duration, + }, e.variance, e.aoe); + } + }, + "FloatingWeapon": (_e, spell, data) => { + if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && data.targetX && data.targetY && !(data.enemy && data.enemy.Enemy && KDAllied(data.enemy))) { + let chanceWith = KinkyDungeonPlayerDamage.chance; + let weapon = KinkyDungeonPlayerDamage; + let chanceWithout = KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon(true, undefined, weapon), true).chance; + KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon(undefined, undefined, weapon)); + if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.name && chanceWithout < chanceWith) { + KDChangeMana(spell.name, "spell", "attack", -KinkyDungeonGetManaCost(spell)); + KDTriggerSpell(spell, data, false, true); + } + } + }, + }, + "beforeStruggleCalc": { + + + "ModifyStruggle": (e, spell, data) => { + if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && data.escapeChance != undefined && (!e.StruggleType || e.StruggleType == data.struggleType)) { + if (!data.query) { + KDChangeMana(spell.name, "spell", "struggle", -KinkyDungeonGetManaCost(spell, false, true)); + KDTriggerSpell(spell, data, false, true); + } + if (e.mult && data.escapeChance > 0) + data.escapeChance *= e.mult; + if (e.power) + data.escapeChance += e.power; + + if (!data.query) + if (e.msg) { + KinkyDungeonSendTextMessage(10 * e.power, TextGet(e.msg), "lightgreen", 2); + } + } + }, + "WillStruggle": (e, _spell, data) => { + if (data.escapeChance != undefined && (!e.StruggleType || e.StruggleType == data.struggleType)) { + if (!e.power || KinkyDungeonStatWill > e.power) { + let boost = (KinkyDungeonStatWill - (e.power || 0)) * e.mult; + data.escapeChance += boost; + if (!data.query) + if (e.msg) + KinkyDungeonSendTextMessage(10 * boost, TextGet(e.msg).replace("AMOUNT", "" + Math.round(100 * boost)), "lightgreen", 2); + } + } + }, + "ProblemSolving": (e, _spell, data) => { + if (data.escapeChance != undefined && (!e.StruggleType || e.StruggleType == data.struggleType)) { + let boost = e.power + KDCalcRestraintBlock() * .1 * e.mult; + data.toolBonus += boost; + data.buffBonus += boost; + data.struggleTime *= 3.0; + if (!data.query) + if (e.msg) + KinkyDungeonSendTextMessage(10 * boost, TextGet(e.msg).replace("AMOUNT", "" + Math.round(100 * boost)), "lightgreen", 2); + } + }, + + + }, + "vision": { + "TrueSight": (_e, spell, data) => { + if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && data.flags) { + if (data.update > 0 || !KinkyDungeonFlags.get("truesight")) { + KDChangeMana(spell.name, "spell", "tick", -KinkyDungeonGetManaCost(spell, false, true)); + KDTriggerSpell(spell, data, false, true); + KinkyDungeonSetFlag("truesight", 1); + } + data.flags.SeeThroughWalls = Math.max(data.flags.SeeThroughWalls, 2); + data.flags.visionAdjust = 0; + } + }, + }, + "calcVision": { + "Multiply": (e, _spell, data) => { + data.visionMult *= e.mult; + }, + "Add": (e, _spell, data) => { + data.max += e.power; + }, + }, + "calcHearing": { + "Multiply": (e, _spell, data) => { + data.hearingMult *= e.mult; + }, + }, + "draw": { + "Offhand": (_e, _spell, _data) => { + if (KDGameData.Offhand || KDGameData.OffhandOld) { + // Draw the offhand weapon + /*KDDraw(kdcanvas, kdpixisprites, "kdoffhand", KinkyDungeonRootDirectory + `Items/${KDGameData.Offhand}.png`, + 1400, + 200, + 100, 100, undefined, { + zIndex: 5, + });*/ + if (DrawButtonKDEx("offhandswitch", (_b) => { + /*let dat = {}; + if (KinkyDungeonPlayerDamage) { + if (KDCanOffhand(KinkyDungeonPlayerDamage)) { + dat.Offhand = KinkyDungeonPlayerDamage.name; + dat.OffhandOld = dat.Offhand; + } else { + dat.OffhandReturn = KinkyDungeonPlayerDamage.name; + } + } + KDSendInput("switchWeapon", { + weapon: KDGameData.Offhand || KDGameData.OffhandOld, + GameData: dat, + noOld: true, + });*/ + return true; + }, true, + 1750, + 600, + 100, 100, + "", "#ffffff", KinkyDungeonRootDirectory + `Items/${KDWeapon({ name: KDGameData.Offhand || KDGameData.OffhandOld })?.name}.png`, "", false, true, + undefined, undefined, undefined, { + tint: KDGameData.Offhand ? "#ffffff" : "#444444", scaleImage: true, zIndex: 5, + //hotkey: KDHotkeyToText(KinkyDungeonKeySwitchWeapon[1]), + } + )) { + DrawTextFitKD(KDGameData.Offhand ? TextGet("KDoffhandTooltip") : TextGet("KDoffhandOldTooltip"), 1740, 650, 600, "#ffffff", KDTextGray0, 28, "right", 10); + + } + + /*if (KDGameData.OffhandReturn && KDGameData.OffhandReturn != (KDGameData.Offhand || KDGameData.OffhandOld)) { + // Draw the offhand weapon + DrawButtonKDEx("offhandswitch2", (b) => { + KDSendInput("switchWeapon", {weapon: KDGameData.OffhandReturn, noOld: true}); + return true; + }, true, + 1400, + 300, + 100, 100, + "", "#ffffff", KinkyDungeonRootDirectory + `Items/${KDGameData.OffhandReturn}.png`, TextGet("KDoffhand2Tooltip"), false, true, + undefined, undefined, undefined, {scaleImage: true, zIndex: 5, + //hotkey: KDHotkeyToText(KinkyDungeonKeySwitchWeapon[2]), + } + ); + }*/ + } else { + if (DrawButtonKDEx("offhandreminder", (_b) => { + + return true; + }, true, + 1750, + 600, + 100, 100, + "", "#ffffff", KinkyDungeonRootDirectory + `Spells/Offhand.png`, "", false, true, + undefined, undefined, undefined, { + scaleImage: true, zIndex: 5, + //hotkey: KDHotkeyToText(KinkyDungeonKeySwitchWeapon[1]), + } + )) { + DrawTextFitKD(TextGet("KDoffhandMissingTooltip"), 1740, 650, 600, "#ffffff", KDTextGray0, 28, "right", 10); + + } + } + }, + "FloatingWeapon": (_e, _spell, _data) => { + if (KinkyDungeonPlayerWeapon && !KDToggles.HideFloatingWeapon // && !KinkyDungeonCanUseWeapon(true, undefined, KDWeapon({name: KinkyDungeonPlayerWeapon}) + && (!KDWeapon({ name: KinkyDungeonPlayerWeapon })?.noHands || KDWeapon({ name: KinkyDungeonPlayerWeapon }).telekinetic) + && !KDWeapon({ name: KinkyDungeonPlayerWeapon })?.unarmed) { + KDDraw(kdcanvas, kdpixisprites, "kdfloatingwep", KinkyDungeonRootDirectory + `Items/${KDWeapon({ name: KinkyDungeonPlayerWeapon })?.name}.png`, + 400, 300 + 50 * Math.sin(2 * Math.PI * (CommonTime() % 3000) / 3000),//50, + //400 + 50 * Math.sin(2 * Math.PI * (CommonTime() % 3000)/3000), + 200, 200, KDWeapon({ name: KinkyDungeonPlayerWeapon })?.angle != undefined ? KDWeapon({ name: KinkyDungeonPlayerWeapon }).angle : Math.PI / 2, { + zIndex: -1, + }, true); + } + }, + + }, + "getLights": { + "Light": (e, spell, data) => { + let activate = false; + if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && !KinkyDungeonPlayerBuffs.Light) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "Light", type: "Light", duration: e.time, aura: "#ffffff" }); + //KDTriggerSpell(spell, data, false, true); + activate = true; + KinkyDungeonUpdateLightGrid = true; + } + if (KinkyDungeonPlayerBuffs.Light && KinkyDungeonPlayerBuffs.Light.duration > 1) { + data.lights.push({ + brightness: e.power, x: KinkyDungeonPlayerEntity.x, y: KinkyDungeonPlayerEntity.y, + color: string2hex(e.color || "#ffffff") + }); + } else if (!activate) { + KinkyDungeonDisableSpell("Light"); + KinkyDungeonExpireBuff(KinkyDungeonPlayerEntity, "Light"); + } + }, + }, + "toggleSpell": { + "EvasiveManeuvers": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + let cost = KDEvasiveManeuversCost(); + if (KinkyDungeonStatStamina >= cost) { + KinkyDungeonSendTextMessage(10, TextGet("KDEvasiveManeuversStart"), "#88ff88", 2); + } else { + KinkyDungeonSpellChoicesToggle[data.index] = false; + KinkyDungeonSendTextMessage(10, TextGet("KDEvasiveManeuversFail"), "#ff8933", 2); + } + } + }, + "TrueSight": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonUpdateLightGrid = true; + } + }, + + "BladeDance": (e, _b, data) => { + // Deals damage to nearby enemies + if (!e.prereq || KDCheckPrereq(null, e.prereq, e, data)) { + let player = KinkyDungeonPlayerEntity; + if (player && KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed) { + let spell = KinkyDungeonFindSpell("BladeDanceBullet", true); + if (spell) { + KinkyDungeonCastSpell(player.x, player.y, spell, undefined, undefined, undefined); + } + + let enemies = KDNearbyEnemies(player.x, player.y, e.dist); + + while (enemies.length > 0) { + let en = enemies[Math.floor(KDRandom() * enemies.length)]; + if (KDHostile(en) && KinkyDungeonAggressive(en) && !KDHelpless(en) && en.hp > 0) { + let damage = (KinkyDungeonPlayerDamage?.damage || 1) * e.power; + KinkyDungeonDamageEnemy(en, { + type: KinkyDungeonPlayerDamage?.type || "slash", + damage: damage, + time: e.time, + bind: e.bind, + bindType: KinkyDungeonPlayerDamage?.bindType, + crit: KinkyDungeonPlayerDamage?.crit || KDDefaultCrit, + bindcrit: KinkyDungeonPlayerDamage?.bindcrit || KDDefaultBindCrit, + }, false, true, undefined, undefined, player); + if (KDGameData.Offhand && KinkyDungeonInventoryGet(KDGameData.Offhand) && KDCanOffhand(KinkyDungeonInventoryGet(KDGameData.Offhand))) { + let weapon = KDWeapon(KinkyDungeonInventoryGet(KDGameData.Offhand)); + if (weapon?.light) { + damage = (weapon?.damage || 1) * e.mult; + KinkyDungeonDamageEnemy(en, { + type: weapon?.type || "slash", + damage: damage, + time: e.time, + bind: e.bind, + bindType: weapon?.bindType, + crit: weapon?.crit || KDDefaultCrit, + bindcrit: weapon?.bindcrit || KDDefaultBindCrit, + }, false, true, undefined, undefined, player); + } + } + } + enemies.splice(enemies.indexOf(en), 1); + } + } + } + }, + "DistractionShield": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let player = KinkyDungeonPlayerEntity; + if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax) { + let cost = KinkyDungeonGetManaCost(spell, false, true); + if (KinkyDungeonHasMana(cost)) { + let amount = KDChangeDistraction(spell.name, "spell", "cast", Math.max(KinkyDungeonStatDistractionMax - KinkyDungeonStatDistraction, 0), false, e.mult); + + if (amount > 0) { + let apply = true; + if (KinkyDungeonPlayerBuffs.DistractionShield) { + if (KinkyDungeonPlayerBuffs.DistractionShield.power < amount * e.power) + KinkyDungeonExpireBuff(KinkyDungeonPlayerEntity, "DistractionShield"); + else { + apply = false; + KinkyDungeonPlayerBuffs.DistractionShield.duration = e.time; + } + } + if (apply) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "DistractionShield", + type: "Shield", + aura: "#ff44ff", + buffSprite: true, + aurasprite: "DistractionShield", + power: amount * e.power, + duration: e.time, + }); + } + + KDUpdatePlayerShield(); + + if (!KDEventData.shockwaves) KDEventData.shockwaves = []; + KDEventData.shockwaves.push({ + x: player.x, + y: player.y, + radius: 2, + sprite: "Particles/ShockwaveShield.png", + }); + + } + + + if (cost > 0) + KDChangeMana(spell.name, "spell", "cast", -cost, false, 0, false, true); + KDTriggerSpell(spell, data, false, false); + KinkyDungeonSendActionMessage(10, TextGet("KDDistractionShield_Yes").replace("AMNT", "" + Math.round(10 * amount * e.power)), "#ff44ff", 2); + KinkyDungeonAdvanceTime(1); + + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDDistractionShield_NoMana"), "#ff8888", 2, true); + } + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDDistractionShield_No"), "#ff8888", 2, true); + } + + } + }, + "ShockCollar": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let player: entity = KDPlayer(); + if (player.leash?.entity) { + let target = KinkyDungeonFindID(player.leash.entity); + + let cost = KDShockCollarCost(); + if (KinkyDungeonStatDistraction >= cost) { + let amount = KDChangeDistraction(spell.name, "spell", "cast", + -cost, false, 0); + + + + let power = Math.max(0, + KDEntityBuffedStat(player, "ShockCollarCD")) + KinkyDungeonApplyBuffToEntity(player, { + id: "ShockCollarCD", + type: "ShockCollarCD", + aura: "#ffffff", + buffSprite: true, + aurasprite: "ShockCollarSpell", + power: power + 1, + duration: 40, + }); + + KinkyDungeonDamageEnemy(target, { + type: spell.damage, + damage: spell.power, + }, false, false, spell, undefined, player); + KinkyDungeonDamageEnemy(target, { + type: "stun", + damage: 0, + time: KDRandom() < e.mult ? e.time : 3, + }, false, false, spell, undefined, player); + + if (!KDEventData.shockwaves) KDEventData.shockwaves = []; + KDEventData.shockwaves.push({ + x: target.x, + y: target.y, + radius: 3, + sprite: "Particles/ShockCollarHit.png", + }); + + + if (e.sfx) KinkyDungeonPlaySound(`${KinkyDungeonRootDirectory}/Audio/${e.sfx}.ogg`); + KDTriggerSpell(spell, data, false, false); + KinkyDungeonSendActionMessage(10, TextGet("KDShockCollarHit").replace("AMNT", "" + Math.round(10 * amount * e.power)), "#ff44ff", 2); + KinkyDungeonAdvanceTime(1); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDShockCollarNoDistraction"), "#ff8888", 2, true); + } + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDShockCollarNotLeashed"), "#ff8888", 2, true); + } + } + }, + + "ExclusiveTag": (e, spell, data) => { + if (spell && spell.name == data.spell?.name && KinkyDungeonSpellChoicesToggle[data.index] && !data.recursion?.includes(spell.name)) + for (let i = 0; i < KinkyDungeonSpellChoices.length; i++) { + let spellOther = KinkyDungeonSpells[KinkyDungeonSpellChoices[i]]; + if (spellOther?.name != spell.name) + for (let tag of e.tags) { + if (KinkyDungeonSpellChoicesToggle[i] && spellOther?.tags?.includes(tag)) { + KinkyDungeonSpellChoicesToggle[i] = false; + data.recursion = data.recursion ? [spell.name, ...data.recursion] : [spell.name]; + KinkyDungeonSendEvent("toggleSpell", { index: i, spell: KinkyDungeonSpells[KinkyDungeonSpellChoices[i]], recursion: data.recursion }, KinkyDungeonSpells[KinkyDungeonSpellChoices[i]]); + } + } + + } + }, + "ChaoticOverflow": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let player = KinkyDungeonPlayerEntity; + let buff = KDEntityGetBuff(player, "ChaoticOverflow"); + if (!buff) { + let amount = e.power;//KinkyDungeonStatWillMax*e.mult; + if (KinkyDungeonStatWill >= amount - 0.01) { + if (KinkyDungeonGetRestraint({ tags: ["crystalRestraints", "crystalRestraintsHeavy"] }, KDGetEffLevel() + 10, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, "Gold", false, false, false) != undefined) { + KinkyDungeonApplyBuffToEntity(player, { + id: spell.name + "1", + type: "NoLegsComp", + duration: e.time, + power: 1, + }); + KinkyDungeonApplyBuffToEntity(player, { + id: spell.name + "2", + type: "NoArmsComp", + duration: e.time, + power: 1, + }); + KinkyDungeonApplyBuffToEntity(player, { + id: spell.name + "3", + type: "NoVerbalComp", + duration: e.time, + power: 1, + }); + KinkyDungeonApplyBuffToEntity(player, { + id: spell.name, + type: "NoVerbalComp", + duration: e.time + 1, + power: 1, + aura: "#ff8888", + buffSprite: true, + events: [ + { trigger: "expireBuff", type: "ChaoticOverflow", count: 1 }, + ], + }); + + + + KDChangeMana("crystal", "spell", "cast", KinkyDungeonStatManaMax, false, 0, false, false); + KDChangeWill("crystal", "spell", "cast", -amount); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDChaoticOverflow_NoBind"), "#ff8888", 2, true); + } + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDChaoticOverflow_No"), "#ff8888", 2, true); + } + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDChaoticOverflow_Already"), "#ff8888", 2, true); + } + + } + }, + "AkashicConflux": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let player = KinkyDungeonPlayerEntity; + let power = KDEntityBuffedStat(player, "ArcaneEnergy"); + let efficiency = KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(player, "EfficiencyArcaneEnergy")); + if (power > e.power) { + let buff = KDEntityGetBuff(player, "ArcaneEnergy"); + + if (buff) { + KinkyDungeonApplyBuffToEntity(player, { + id: spell.name, + type: "NoLegsComp", + duration: e.time, + power: 1, + aura: "#aaffaa", + buffSprite: true, + }); + KinkyDungeonApplyBuffToEntity(player, { + id: spell.name + "2", + type: "NoArmsComp", + duration: e.time, + power: 1, + }); + KinkyDungeonApplyBuffToEntity(player, { + id: spell.name + "3", + type: "NoVerbalComp", + duration: e.time, + power: 1, + }); + + KDChangeMana(spell.name, "spell", "cast", efficiency * e.power, false, 0, false, true); + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `-${Math.round(efficiency * e.power * 10)} ${TextGet("KDArcaneEnergy")}`, "#8888ff", 3); + buff.power = Math.max(0, buff.power - efficiency * e.power); + if (buff.power <= 0) buff.duration = 0; + buff.text = Math.round(10 * KDEntityBuffedStat(player, "ArcaneEnergy")); + } + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDAkashicConflux_No").replace("AMNT", "" + Math.round(10 * (e.power * efficiency))), "#9074ab", 2, true); + + } + + } + }, + "DesperateStruggle": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let player = KinkyDungeonPlayerEntity; + if (KinkyDungeonHasWill(e.cost) && KinkyDungeonStatWill > 0.251 * KinkyDungeonStatWillMax) { + let eligibleRestraints = []; + + for (let inv of KinkyDungeonAllRestraintDynamic()) { + let item = inv.item; + if (!KDGetCurse(item) && item.struggleProgress > 0 && (item.struggleProgress < 0.9 || item.tightness > 0)) { + let struggleData: KDStruggleData = {} as KDStruggleData; + KinkyDungeonStruggle(KDRestraint(item).Group, "Struggle", KDGetItemLinkIndex(item), true, struggleData); + + if (struggleData.escapeChance > 0) { + eligibleRestraints.push({ + item: item, + escapeChance: struggleData.escapeChance, + limitChance: struggleData.limitChance, + }); + } + } + } + + if (eligibleRestraints.length > 0) { + for (let item of eligibleRestraints) { + let inv = item.item; + + if (inv.struggleProgress < 0.9) { + let potential = 0.08 * Math.max(0.9 - (inv.struggleProgress)); + inv.struggleProgress = Math.min(0.9, Math.max(0, inv.struggleProgress + potential * (0.5 / eligibleRestraints.length + KDRandom()))); + } + + if (inv.struggleProgress + (inv.cutProgress || 0) > 1) { + KinkyDungeonRemoveRestraintSpecific(inv, true, false, false); + } else + if (inv.tightness > 0 + && KDRandom() < Math.max( + 0.4, + item.escapeChance * (2 - 1 / eligibleRestraints.length)) - Math.max(0, item.limitChance * (1 - 0.5 / eligibleRestraints.length))) { + inv.tightness -= 1; + } + } + + + let amnt = KDChangeWill(spell.name, "spell", "cast", -e.cost, false, 0); + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `${Math.round(amnt * 10)} WP`, "#ff5277", 3); + KinkyDungeonSendTextMessage(10, TextGet("KDDesperateStruggle_Yes"), "#ff8933", 2, true); + KinkyDungeonMakeNoise(e.dist, player.x, player.y); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDDesperateStruggle_NoRestraints"), "#ff5277", 2, true); + } + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDDesperateStruggle_NoWill").replace("AMNT", "" + Math.round(10 * (e.cost))), "#ff5277", 2, true); + } + } + }, + "Quickness": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let player = KinkyDungeonPlayerEntity; + let cost = KinkyDungeonGetManaCost(spell, false, true); + if (KinkyDungeoCheckComponents(spell, player.x, player.y).failed.length == 0) { + if (KinkyDungeonHasMana(cost)) { + + KinkyDungeonApplyBuffToEntity(player, { + id: spell.name, + type: "Quickness", + duration: e.time, + power: 1, + endSleep: true, currentCount: -1, maxCount: 3, tags: ["quickness", "move", "attack", "cast"] + }); + + KinkyDungeonSetFlag("Quickness", 1); + + if (cost > 0) + KDChangeMana(spell.name, "spell", "cast", -cost, false, 0, false, true); + KDTriggerSpell(spell, data, false, false); + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `${TextGet("KDQuickness_Floater")}`, "#ffff77", 3); + KinkyDungeonSendTextMessage(10, TextGet("KDQuickness_Yes"), "#ffff77", 2, true); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDQuickness_NoMana"), "#ff5277", 2, true); + + } + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDQuickness_NoComp"), "#ff5277", 2, true); + } + + + } + }, + "Quickness2": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let player = KinkyDungeonPlayerEntity; + let cost = KinkyDungeonGetManaCost(spell, false, true); + if (KinkyDungeoCheckComponents(spell, player.x, player.y).failed.length == 0) { + if (KinkyDungeonHasMana(cost)) { + KinkyDungeonUpdateLightGrid = true; + KinkyDungeonApplyBuffToEntity(player, { + id: spell.name, + type: "TimeSlow", + duration: e.time, + aura: "#ffffff", + power: e.power, + }); + KinkyDungeonApplyBuffToEntity(player, { + id: spell.name + "2", + type: "StatGainStamina", + duration: e.time, + power: -e.mult, + }); + + KinkyDungeonSummonEnemy(player.x, player.y, "TimeGhost", Math.ceil(Math.pow(Math.max(3, cost + 4), 0.7)), 20, false, undefined, false, true, undefined, true, 12, true); + + let timeslow = KDEntityBuffedStat(KinkyDungeonPlayerEntity, "TimeSlow"); + if (timeslow <= e.power) + KinkyDungeonSetFlag("TimeSlow", timeslow); + + if (cost > 0) + KDChangeMana(spell.name, "spell", "cast", -cost, false, 0, false, true); + KDTriggerSpell(spell, data, false, false); + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `${TextGet("KD" + spell.name + "_Floater")}`, "#ffff77", 3); + KinkyDungeonSendTextMessage(10, TextGet("KD" + spell.name + "_Yes"), "#ffff77", 2, true); + KinkyDungeonAdvanceTime(1); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDQuickness_NoMana"), "#ff5277", 2, true); + + } + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDQuickness_NoComp"), "#ff5277", 2, true); + } + + } + }, + "Sonar": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let player = KinkyDungeonPlayerEntity; + let cost = KinkyDungeonGetManaCost(spell, false, true); + if (KinkyDungeoCheckComponents(spell, player.x, player.y).failed.length == 0) { + if (KinkyDungeonHasMana(cost)) { + KinkyDungeonUpdateLightGrid = true; + if (!KDGameData.RevealedTiles) KDGameData.RevealedTiles = {}; + if (!KDGameData.RevealedFog) KDGameData.RevealedFog = {}; + + let toAdd = { [player.x + ',' + player.y]: { added: false, x: player.x, y: player.y } }; + for (let i = 1; i < e.dist; i++) { + for (let value of Object.values(toAdd)) { + if (!value.added) { + // We charge value added tax + KDRevealTile(value.x, value.y, e.dist - i + e.time); + //if (i < e.dist/2) + //KDGameData.RevealedFog[value.x + ',' + value.y] = Math.max(1, KDGameData.RevealedFog[value.x + ',' + value.y] || 0); + for (let x = value.x - 1; x <= value.x + 1; x++) + for (let y = value.y - 1; y <= value.y + 1; y++) { + if (!toAdd[x + ',' + y] && KDIsInBounds(x, y, 1) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x, y))) { + toAdd[x + ',' + y] = { added: false, x: x, y: y }; + } + } + } + } + } + + KinkyDungeonMakeNoise(e.dist + 1, player.x, player.y); + + if (cost > 0) + KDChangeMana(spell.name, "spell", "cast", -cost, false, 0, false, true); + KDTriggerSpell(spell, data, false, true); + KinkyDungeonSendTextMessage(10, TextGet("KD" + spell.name + "_Yes"), "#ffff77", 2, true); + KinkyDungeonAdvanceTime(1); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDSonar_NoMana"), "#ff5277", 2, true); + + } + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDSonar_NoComp"), "#ff5277", 2, true); + } + + } + }, + "ToolsOfTheTrade": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + KDStartDialog("ToolsOfTheTrade"); + } + }, + "AllyOnMe": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let list = KDMapData.Entities.filter((en) => { + return KDAllied(en); + }); + for (let en of list) + if (en && en.buffs?.AllySelect) { + KinkyDungeonSetEnemyFlag(en, "NoFollow", 0); + } + } + }, + "AllyDisperse": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let list = KDMapData.Entities.filter((en) => { + return KDAllied(en); + }); + for (let en of list) + if (en && en.buffs?.AllySelect) { + KinkyDungeonSetEnemyFlag(en, "NoFollow", -1); + } + } + }, + "AllyDefensive": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let list = KDMapData.Entities.filter((en) => { + return KDAllied(en); + }); + let i = 0; + for (let en of list) + if (en && en.buffs?.AllySelect) { + if (!KDEntityHasFlag(en, "Defensive") && (KDRandom() < 0.5 || i == 0)) { + KinkyDungeonSendDialogue(en, + TextGet("KinkyDungeonRemindJailChase" + (KDGetEnemyPlayLine(en) ? KDGetEnemyPlayLine(en) : "") + "CommandDefend") + .replace("EnemyName", TextGet("Name" + en.Enemy.name)), KDGetColor(en), + 7, 7, false, true); + i++; + } + KinkyDungeonSetEnemyFlag(en, "Defensive", -1); + } + } + }, + "AllyAggressive": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let list = KDMapData.Entities.filter((en) => { + return KDAllied(en); + }); + for (let en of list) + if (en && en.buffs?.AllySelect) { + KinkyDungeonSetEnemyFlag(en, "Defensive", 0); + } + } + }, + "AllyHold": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let list = KDMapData.Entities.filter((en) => { + return KDAllied(en); + }); + for (let en of list) + if (en && en.buffs?.AllySelect) { + KinkyDungeonSetEnemyFlag(en, "StayHere", -1); + } + } + }, + "AllyCancelHold": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let list = KDMapData.Entities.filter((en) => { + return KDAllied(en); + }); + for (let en of list) + if (en && en.buffs?.AllySelect) { + KinkyDungeonSetEnemyFlag(en, "StayHere", 0); + } + } + }, + "AllyDeselectAll": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let list = KDMapData.Entities.filter((en) => { + return KDAllied(en); + }); + for (let en of list) + if (en) { + if (en.buffs?.AllySelect) KinkyDungeonExpireBuff(en, "AllySelect") + } + } + }, + "Offhand": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + KDGameData.InventoryAction = "Offhand"; + KDGameData.Offhand = ""; + KDGameData.OffhandOld = ""; + KinkyDungeonDrawState = "Inventory"; + KinkyDungeonCurrentFilter = Weapon; + } + }, + "UnconventionalWarfare": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + KDGameData.InventoryAction = "Attach"; + KinkyDungeonDrawState = "Inventory"; + KinkyDungeonCurrentFilter = Weapon; + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Tape.ogg"); + } + }, + "ManaRecharge": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + if (KinkyDungeonStatMana < KinkyDungeonStatManaMax) { + KinkyDungeonDealDamage({ damage: e.power, type: e.damage }); + KDChangeWill(spell.name, "spell", "cast", -KinkyDungeonStatWill * e.mult); + if (KinkyDungeonStatWill > 0) { + KDChangeMana(spell.name, "spell", "cast", KinkyDungeonStatManaMax, true, 0, false, false); + KinkyDungeonSendTextMessage(5, TextGet("KDManaRecharge_Success"), "#9074ab", 10); + KDTriggerSpell(spell, data, false, false); + } else { + let restraintToAdd = KinkyDungeonGetRestraint({ tags: ["crystalRestraints"] }, MiniGameKinkyDungeonLevel + 10, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, "Gold", false, false, false); + + if (restraintToAdd) { + KinkyDungeonAddRestraintIfWeaker(restraintToAdd, 10, true, "Gold", true, false, undefined, "Observer", true); + if (e.count > 1) + for (let i = 1; i < (e.count || 1); i++) { + restraintToAdd = KinkyDungeonGetRestraint({ tags: ["crystalRestraints"] }, MiniGameKinkyDungeonLevel + 10, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, "Gold", false, false, false); + if (restraintToAdd) KinkyDungeonAddRestraintIfWeaker(restraintToAdd, 10, true, "Gold", true, false, undefined, "Observer", true); + } + + KDChangeMana(spell.name, "spell", "cast", KinkyDungeonStatManaMax, true, 0, false, false); + KinkyDungeonSendTextMessage(10, TextGet("KDManaRecharge_Mixed"), "#9074ab", 10); + KDTriggerSpell(spell, data, false, false); + } else { + KinkyDungeonSendTextMessage(5, TextGet("KDManaRecharge_Fail"), "#9074ab", 10); + } + + } + } else { + KinkyDungeonSendTextMessage(5, TextGet("KDArcaneRecharge_No"), "#9074ab", 10); + } + } + }, + "LimitSurge": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + if (KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax) { + let willPercentage = KinkyDungeonStatWill / e.power; + KDChangeWill(spell.name, "spell", "cast", -e.power); + if (willPercentage >= 1) { + KDChangeStamina(spell.name, "spell", "cast", Math.min(willPercentage, 1.0) * e.mult * KinkyDungeonStatStaminaMax); + KinkyDungeonSendTextMessage(5, TextGet("KDLimitSurge_Success"), "#ff8933", 10); + } else { + KDChangeStamina(spell.name, "spell", "cast", Math.min(willPercentage, 1.0) * e.mult * KinkyDungeonStatStaminaMax); + KDStunTurns(e.time); + KinkyDungeonSendTextMessage(5, TextGet("KDLimitSurge_Fail"), "#ff5277", 10); + } + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "LimitSurge", + type: "StatGainStamina", + aura: "#55ff55", + //buffSprite: true, + power: 0.3, + duration: 20, + }); + KDTriggerSpell(spell, data, false, false); + } else { + KinkyDungeonSendTextMessage(5, TextGet("KDLimitSurge_No"), "#ff8933", 10); + } + } + }, + "RaiseDefenses": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + if (KinkyDungeonStatStamina >= KinkyDungeonGetStaminaCost(spell, false, false)) { + if (KinkyDungeonPlayerBuffs.RaiseDefenses) { + KinkyDungeonExpireBuff(KinkyDungeonPlayerEntity, "RaiseDefenses"); + } + + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "RaiseDefenses", + type: "Shield", + aura: "#ffaa44", + buffSprite: true, + power: KinkyDungeonPlayerBlockLinear() * 10 * e.mult, + duration: e.time, + tags: ["attack"], + currentCount: 0, + maxCount: 1, + + }); + + KDUpdatePlayerShield(); + + + KDChangeStamina(spell.name, "spell", "cast", -KinkyDungeonGetStaminaCost(spell, false, false)); + KinkyDungeonSendTextMessage(5, TextGet("KDRaiseDefensesSuccess"), "#ff8933", 10); + KDTriggerSpell(spell, data, false, false); + KinkyDungeonAdvanceTime(1); + } else { + KinkyDungeonSendTextMessage(5, TextGet("KDRaiseDefensesFail"), "#ff8933", 10); + } + } + }, + + "Enrage": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let player = KinkyDungeonPlayerEntity; + if (KinkyDungeonStatStamina > KinkyDungeonGetStaminaCost(spell)) { + if (!KinkyDungeonFlags.get("Enraged")) { + if (KinkyDungeonGagTotal() < 0.9) { + let buff = KDEntityGetBuff(player, "BattleRhythm"); + let max = 0.4 * KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(player, "MaxBattleRhythm")); + KinkyDungeonMakeNoise(e.dist, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + KinkyDungeonSetFlag("Enraged", e.time); + KDChangeStamina(spell.name, "spell", "cast", -KinkyDungeonGetStaminaCost(spell), false, 0, true); + let powerAdded = 0.01 * e.power; + if (powerAdded > 0) + KinkyDungeonSetFlag("BRCombat", 20); + if (!buff) { + powerAdded = Math.min(powerAdded, max); + KinkyDungeonApplyBuffToEntity(player, + { + id: "BattleRhythm", + type: "BattleRhythm", + aura: "#ff8933", + aurasprite: "Null", + buffSprite: true, + power: powerAdded, + duration: 9999, infinite: true, + text: Math.round(100 * powerAdded), + } + ); + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `+${Math.round(powerAdded * 100)} ${TextGet("KDBattleRhythm")}`, "#ff8933", 1.5); + } else { + let origPower = buff.power; + buff.power += powerAdded; + buff.power = Math.min(buff.power, max); + buff.text = Math.round(100 * KDEntityBuffedStat(player, "BattleRhythm")); + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `+${Math.round((buff.power - origPower) * 100)} ${TextGet("KDBattleRhythm")}`, "#ff8933", 1.5); + } + KinkyDungeonSendTextMessage(5, TextGet("KDEnrageSuccess"), "#e7cf1a", 10); + } else { + KinkyDungeonSendTextMessage(5, TextGet("KDEnrageFailGagged"), "#ff8933", 10); + } + + + } else { + KinkyDungeonSendTextMessage(5, TextGet("KDEnrageFailCooldown"), "#ff8933", 10); + } + + + } else { + KinkyDungeonSendTextMessage(5, TextGet("KDEnrageFail"), "#ff8933", 10); + } + + + } + }, + "BreakFree": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonSpellChoicesToggle[data.index] = false; + + let player = KinkyDungeonPlayerEntity; + if (KDEntityBuffedStat(player, "BattleRhythm") > e.cost) { + let buff = KDEntityGetBuff(player, "BattleRhythm"); + if (buff) { + buff.power = Math.max(0, buff.power - e.cost); + buff.text = Math.round(100 * KDEntityBuffedStat(player, "BattleRhythm")); + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `-${Math.round((e.cost) * 100)} ${TextGet("KDBattleRhythm")}`, "#ff8933", 0.1); + if (buff.power == 0) buff.duration = 0; + } + + if (KinkyDungeonStatWill > 0) { + if (KinkyDungeonPlayerBuffs.BreakFree) { + KinkyDungeonExpireBuff(KinkyDungeonPlayerEntity, "BreakFree"); + } + + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "BreakFree", + type: "BreakFree", + aura: "#ffaa44", + //buffSprite: true, + power: e.power + KDCalcRestraintBlock() * 10 * e.mult, + duration: e.time, + events: [ + { trigger: "tick", type: "BreakFree" }, + { trigger: "beforeStruggleCalc", type: "BreakFree" }, + ] + + }); + + KDUpdatePlayerShield(); + + + KDChangeStamina(spell.name, "spell", "cast", -KinkyDungeonGetStaminaCost(spell, false, false)); + KinkyDungeonSendTextMessage(5, TextGet("KDBreakFreeSuccess"), "#ff8933", 10); + KDTriggerSpell(spell, data, false, false); + KinkyDungeonAdvanceTime(1); + } else { + KinkyDungeonSendTextMessage(5, TextGet("KDBreakFreeFailWP"), "#ff8933", 10); + } + } else { + KinkyDungeonSendTextMessage(5, TextGet("KDBreakFreeFail"), "#ff8933", 10); + } + + + } + }, + + "Light": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + + KinkyDungeonUpdateLightGrid = true; + + if (KinkyDungeonPlayerBuffs.Light && KinkyDungeonPlayerBuffs.Light.duration > 1) { + KinkyDungeonExpireBuff(KinkyDungeonPlayerEntity, "Light"); + } else { + + if (KinkyDungeonSpellChoicesToggle[data.index]) { + let cost = KinkyDungeonGetManaCost(spell, false, true); + if (KinkyDungeonHasMana(cost)) { + if (cost > 0) + KDChangeMana(spell.name, "spell", "cast", -cost, false, 0, false, true); + KDTriggerSpell(spell, data, false, true); + KinkyDungeonAdvanceTime(0, true, true); + } + } + } + } + }, + "Analyze": (_e, spell, data) => { + if (data.spell?.name == spell?.name) { + if (KinkyDungeonPlayerBuffs.Analyze && KinkyDungeonPlayerBuffs.Analyze.duration > 1) { + KinkyDungeonExpireBuff(KinkyDungeonPlayerEntity, "Analyze"); + } else { + + if (KinkyDungeonSpellChoicesToggle[data.index]) { + let cost = KinkyDungeonGetManaCost(spell, false, true); + if (KinkyDungeonHasMana(cost)) { + if (cost > 0) + KDChangeMana(spell.name, "spell", "cast", -cost, false, 0, false, true); + KDTriggerSpell(spell, data, false, true); + KinkyDungeonAdvanceTime(0, true, true); + } + } + } + } + }, + "PassTime": (e, spell, data) => { + if (data.spell?.name == spell?.name) { + KinkyDungeonAdvanceTime(e.time, true, true); + + } + }, + }, + "enemyStatusEnd": { + "Shatter": (_e, spell, data) => { + if (data.enemy && data.status == "freeze" && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && data.enemy.playerdmg && KDHostile(data.enemy) && KDistChebyshev(data.enemy.x - KinkyDungeonPlayerEntity.x, data.enemy.y - KinkyDungeonPlayerEntity.y) < 10) { + KDChangeMana("ice", "spell", "spellTrig", -KinkyDungeonGetManaCost(spell, false, true)); + KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, KinkyDungeonFindSpell("ShatterStrike", true), undefined, undefined, undefined); + //KDTriggerSpell(spell, data, false, false); + } + } + }, + "kill": { + "Sowing": (_e, _spell, data) => { + if (data.enemy && !KDIsHumanoid(data.enemy) && data.enemy.playerdmg > 0) { + KDCreateEffectTile(data.enemy.x, data.enemy.y, { + name: "Vines", + duration: 20, + }, 10); + } + }, + "Shatter": (_e, spell, data) => { + if (data.enemy && data.enemy.freeze > 0 && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, true)) && data.enemy.playerdmg && KDHostile(data.enemy) && KDistChebyshev(data.enemy.x - KinkyDungeonPlayerEntity.x, data.enemy.y - KinkyDungeonPlayerEntity.y) < 10) { + KDChangeMana("ice", "spell", "spellTrig", -KinkyDungeonGetManaCost(spell, true)); + KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, KinkyDungeonFindSpell("ShatterStrike", true), undefined, undefined, undefined); + //KDTriggerSpell(spell, data, false, false); + } + }, + "ManaHarvesting": (_e, _spell, data) => { + if (data.enemy && data.enemy.playerdmg && KDHostile(data.enemy) && KDistChebyshev(data.enemy.x - KinkyDungeonPlayerEntity.x, data.enemy.y - KinkyDungeonPlayerEntity.y) < 10) { + let regen = 0; + if (data.enemy.Enemy.unlockCommandLevel > 0) regen = 10; + else if (KDIsHumanoid(data.enemy)) regen = 1; + if (regen > 0) { + let player = KinkyDungeonPlayerEntity; + let mult = 0.1 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(player, "MultArcaneEnergy")); + KDAddArcaneEnergy(player, regen * mult); + } + } + }, + }, +}; + +/** + * @param Event + * @param e + * @param spell + * @param data + */ +function KinkyDungeonHandleMagicEvent(Event: string, e: KinkyDungeonEvent, spell: spell, data: any) { + if (Event === e.trigger && KDEventMapSpell[e.dynamic ? "dynamic" : Event] && KDEventMapSpell[e.dynamic ? "dynamic" : Event][e.type]) { + if (KDCheckCondition(e, data)) + KDEventMapSpell[e.dynamic ? "dynamic" : Event][e.type](e, spell, data); + } +} + + +let KDEventMapWeapon: Record void>> = { + "calcEvasion": { + "IsMagic": (_e, _weapon, data) => { + data.flags.isMagic = true; + }, + }, + "draw": { + "Float": (_e, _weapon, _data) => { + if (!KDToggles.HideFloatingWeapon && KinkyDungeonCanUseWeapon(true, undefined, KDWeapon({ name: KinkyDungeonPlayerWeapon }))) { + KDDraw(kdcanvas, kdpixisprites, "kdfloatingwep", KinkyDungeonRootDirectory + `Items/${KDWeapon({ name: KinkyDungeonPlayerWeapon })?.name}.png`, + 400, 300 + 50 * Math.sin(2 * Math.PI * (CommonTime() % 3000) / 3000),//50, + //400 + 50 * Math.sin(2 * Math.PI * (CommonTime() % 3000)/3000), + 200, 200, KDWeapon({ name: KinkyDungeonPlayerWeapon })?.angle != undefined ? KDWeapon({ name: KinkyDungeonPlayerWeapon }).angle : Math.PI / 2, { + zIndex: -1, + }, true); + } + }, + }, + "dynamic": { + "BuffSelf": (e, weapon, data) => { + if (KDCheckPrereq(null, e.prereq, e, data)) + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.kind || weapon.name) + e.buffType, + type: e.buffType, + power: e.power, + tags: e.tags, + currentCount: e.mult ? -1 : undefined, + maxCount: e.mult, + duration: e.time + }); + }, + }, + "beforePlayerDamage": { + "StormBreakerCharge": (e, _weapon, data) => { + let dmg = Math.max(data.dmg, data.dmgOrig); + if (dmg > 0 && (!e.damageTrigger || e.damageTrigger == data.type)) { + let turns = dmg * e.power; + if (KinkyDungeonPlayerBuffs.StormCharge) { + turns += KinkyDungeonPlayerBuffs.StormCharge.duration; + } + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "StormCharge", + type: "StormCharge", + aura: e.color, + power: 1, + duration: Math.ceil(Math.min(30, turns)), + }); + } + }, + }, + "spellCast": { + "BondageBustBoost": (e, weapon, data) => { + if (!e.chance || KDRandom() < e.chance) { + if (data.spell && data.spell.name == "BondageBustBeam" && data.bulletfired) { + if (data.bulletfired.bullet && data.bulletfired.bullet.damage) { + let dmgMult = e.power; + let charge = KinkyDungeonPlayerBuffs[weapon.name + "Charge"] ? KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration : 0; + if (charge >= 9) dmgMult *= 2; + data.bulletfired.bullet.damage.damage = data.bulletfired.bullet.damage.damage + dmgMult * charge; + data.bulletfired.bullet.damage.bind = (data.bulletfired.bullet.damage.bind || 0) + dmgMult * charge; + if (KinkyDungeonPlayerBuffs[weapon.name + "Charge"]) + KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration = 0; + + if (e.energyCost) KDChangeCharge(weapon.name, "weapon", "cast", - e.energyCost * charge); + if (e.sfx && charge > 9) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); + } + } + + } + }, + }, + "playerCastSpecial": { + "Unload": (e, weapon, data) => { + let player = data.player || KinkyDungeonPlayerEntity; + if (!e.prereq || !KDPrereqs[e.prereq] || KDPrereqs[e.prereq](player, e, data)) { + let buff = KDEntityGetBuff(player, weapon.name + "Load"); + if (buff) { + buff.power *= e.mult; + buff.power += e.power; + } + } + }, + }, + "afterPlayerAttack": { + "ShadowBleed": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && data.damage && data.damage.damage) { + if (data.enemy && data.enemy.hp > 0 && !(KDHelpless(data.enemy) && data.enemy.hp < 0.6)) { + KinkyDungeonApplyBuffToEntity(data.enemy, { + aura: "#aa00ff", + power: e.power, + type: "ShadowBleed", + id: "ShadowBleed", + duration: e.time, + events: [ + { trigger: 'tick', type: 'UnShadowElementalEffect', damage: e.damage, power: 0.5 * e.power }, + { trigger: 'tick', type: 'ShadowElementalEffect', damage: e.damage, power: e.power, time: 2 }, + ] + }); + } + } + }, + "ShadowBleedCleave": (e, _weapon, data) => { + if (data.enemy && !data.disarm) { + let nearby = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5); + for (let enemy of nearby) { + if (KDHostile(enemy) && !KDHelpless(data.enemy)) { + if (KinkyDungeonEvasion(enemy)) { + KinkyDungeonApplyBuffToEntity(enemy, { + aura: "#aa00ff", + power: e.power, + type: "ShadowBleed", + id: "ShadowBleed", + duration: e.time, + events: [ + { trigger: 'tick', type: 'UnShadowElementalEffect', damage: e.damage, power: 0.5 * e.power }, + { trigger: 'tick', type: 'ShadowElementalEffect', damage: e.damage, power: e.power, time: 2 }, + ] + }); + } + } + } + } + }, + "DoubleStrike": (e, _weapon, data) => { + if (!KinkyDungeonAttackTwiceFlag && (!e.chance || KDRandom() < e.chance)) { + if (data.enemy && data.enemy.hp > 0 && !(KDHelpless(data.enemy) && data.enemy.hp < 0.6)) { + KinkyDungeonAttackTwiceFlag = true; + KinkyDungeonLaunchAttack(data.enemy, 1); + KinkyDungeonAttackTwiceFlag = false; + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "attack", - e.energyCost); + } + } + }, + "ConvertBindingToDamage": (e, _weapon, data) => { + if ((!e.chance || KDRandom() < e.chance)) { + if (data.enemy && data.enemy.hp > 0 && !(KDHelpless(data.enemy) && data.enemy.hp < 0.6) && data.enemy.boundLevel > 0) { + let bonus = Math.min(data.enemy.boundLevel, e.bind); + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: bonus * e.power, + time: e.time + }, false, false, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + + KDReduceBinding(data.enemy, bonus); + if (data.enemy.hp <= 0 && KDHelpless(data.enemy)) data.enemy.hp = 0.01; + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "attack", - e.energyCost); + } + } + }, + }, + "getLights": { + "WeaponLight": (e, _weapon, data) => { + data.lights.push({ + brightness: e.power, x: KinkyDungeonPlayerEntity.x, y: KinkyDungeonPlayerEntity.y, + color: string2hex(e.color || "#ffffff") + }); + }, + "WeaponLightDirectional": (e, _weapon, data) => { + let x = KinkyDungeonPlayerEntity.x; + let y = KinkyDungeonPlayerEntity.y; + let size = e.power - e.dist / 2; + for (let i = 0; i < e.dist; i++) { + + let x2 = x + KinkyDungeonPlayerEntity.facing_x_last || KinkyDungeonPlayerEntity.facing_x; + let y2 = y + KinkyDungeonPlayerEntity.facing_y_last || KinkyDungeonPlayerEntity.facing_y; + if (KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(x2, y2))) { + x = x2; + y = y2; + size += 0.5; + } else { + break; + } + } + data.lights.push({ + brightness: size, x: x, y: y, nobloom: true, + color: string2hex(e.color || "#ffffff") + }); + }, + + }, + "tick": { + "AccuracyBuff": (e, weapon, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.original || "") + weapon.name + e.type + e.trigger, + type: "Accuracy", + duration: 1, + power: e.power + }); + }, + "blockBuff": (e, weapon, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.kind || weapon.name) + "Block", type: "Block", power: e.power, duration: 2, }); + }, + "slowLevel": (e, weapon, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.kind || weapon.name) + "SlowLevel", type: "SlowLevel", power: e.power, duration: 2, }); + }, + "spellWardBuff": (e, weapon, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.kind || weapon.name) + "SpellResist", type: "SpellResist", power: e.power, duration: 2, }); + }, + "sneakBuff": (e, weapon, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.kind || weapon.name) + "Sneak", type: "SlowDetection", power: e.power, duration: 2, }); + }, + "evasionBuff": (e, weapon, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.kind || weapon.name) + "Evasion", type: "Evasion", power: e.power, duration: 2, }); + }, + "critBoost": (e, weapon, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.kind || weapon.name) + "CritBoost", type: "CritBoost", power: e.power, duration: 2, }); + }, + "critMult": (e, weapon, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.kind || weapon.name) + "CritMult", type: "CritMult", power: e.power, duration: 2, }); + }, + "armorBuff": (e, weapon, _data) => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.kind || weapon.name) + "Armor", type: "Armor", power: e.power, duration: 2, }); + }, + "Charge": (e, weapon, _data) => { + if (KDGameData.AncientEnergyLevel > 0 && KDGameData.SlowMoveTurns < 1) { + let currentCharge = KinkyDungeonPlayerBuffs[weapon.name + "Charge"] ? KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration : 0; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: weapon.name + "Charge", + type: e.buffType, + aura: e.color, + power: 1, + duration: Math.min(e.power, currentCharge + 2), + }); + if (KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration > e.power - 1) { + KinkyDungeonPlayerBuffs[weapon.name + "Charge"].aurasprite = undefined; + } else { + KinkyDungeonPlayerBuffs[weapon.name + "Charge"].aurasprite = weapon.name; + } + } + }, + "Patience": (e, weapon, _data) => { + if (KDGameData.SlowMoveTurns < 1) { + let currentCharge = KinkyDungeonPlayerBuffs[weapon.name + "Charge"] ? KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration : 0; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: weapon.name + "Charge", + type: e.buffType, + aura: e.color, + power: 1, + duration: Math.min(e.power, currentCharge + 2), + }); + if (KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration > e.power - 1) { + KinkyDungeonPlayerBuffs[weapon.name + "Charge"].aura = e.color; + } else { + KinkyDungeonPlayerBuffs[weapon.name + "Charge"].aura = "#888888"; + } + } + }, + "Reload": (e, weapon, data) => { + let player = data.player || KinkyDungeonPlayerEntity; + if (KDGameData.SlowMoveTurns < 1 && (!e.prereq || !KDPrereqs[e.prereq] || KDPrereqs[e.prereq](player, e, data))) { + let originalDuration = KinkyDungeonPlayerBuffs[weapon.name + "Load"]?.duration; + let currentLoad = KDEntityBuffedStat(player, weapon.name + "Load") || 0; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: weapon.name + "Load", + type: weapon.name + "Load", + aura: e.color, + aurasprite: "Reload", + //buffSprite: true, + power: Math.min(e.power, currentLoad + data.delta), + duration: 7, + }); + if (currentLoad >= e.power) { + if (originalDuration < 9000) + KinkyDungeonInterruptSleep(); // End wait if we were reloading + KinkyDungeonPlayerBuffs[weapon.name + "Load"].aura = undefined; + KinkyDungeonPlayerBuffs[weapon.name + "Load"].duration = 9999; + } else { + KinkyDungeonPlayerBuffs[weapon.name + "Load"].aura = e.color; + KinkyDungeonPlayerBuffs[weapon.name + "Load"].duration = 7; + KinkyDungeonPlayerBuffs[weapon.name + "Load"].text = ">" + Math.round(e.power - currentLoad) + "<"; + } + } + }, + "Buff": (e, weapon, data) => { + if (KDCheckPrereq(null, e.prereq, e, data)) + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.kind || weapon.name) + (e.buffType || e.buff), + type: e.buffType || e.buff, + power: e.power, + tags: e.tags, + currentCount: e.mult ? -1 : undefined, + maxCount: e.mult, + duration: 2 + }); + }, + "buff": (e, weapon, data) => { + if (KDCheckPrereq(null, e.prereq, e, data)) + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.kind || weapon.name) + (e.buffType || e.buff), + type: e.buffType || e.buff, + power: e.power, + tags: e.tags, + currentCount: e.mult ? -1 : undefined, + maxCount: e.mult, + duration: 2 + }); + }, + "BuffMulti": (e, weapon, data) => { + if (KDCheckPrereq(null, e.prereq, e, data)) + for (let buff of e.buffTypes) + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.kind || weapon.name) + buff, + type: buff, + power: e.power, + tags: e.tags, + currentCount: e.mult ? -1 : undefined, + maxCount: e.mult, + duration: 2 + }); + }, + "buffmulti": (e, weapon, data) => { + if (KDCheckPrereq(null, e.prereq, e, data)) + for (let buff of e.buffTypes) + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: (e.kind || weapon.name) + buff, + type: buff, + power: e.power, + tags: e.tags, + currentCount: e.mult ? -1 : undefined, + maxCount: e.mult, + duration: 2 + }); + }, + + "AoEDamageFrozen": (e, _weapon, _data) => { + let trigger = false; + for (let enemy of KDMapData.Entities) { + if (KDHostile(enemy) && enemy.freeze > 0 && (!e.chance || KDRandom() < e.chance) && enemy.hp > 0 && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) <= e.aoe) { + KinkyDungeonDamageEnemy(enemy, { + type: e.damage, + crit: e.crit, + damage: e.power, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + addBind: e.addBind, + bindType: e.bindType, + }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); + trigger = true; + } + } + if (trigger) { + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "tick", - e.energyCost); + } + }, + "AoEDamageBurning": (e, _weapon, _data) => { + let trigger = false; + for (let enemy of KDMapData.Entities) { + if (KDHostile(enemy) + && KDEntityHasBuff(enemy, "Burning") + && (!e.chance || KDRandom() < e.chance) + && enemy.hp > 0 + && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) <= e.aoe) { + KinkyDungeonDamageEnemy(enemy, { + type: e.damage, + crit: e.crit, + damage: e.power, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + bindType: e.bindType, + addBind: e.addBind, + flags: ["BurningDamage"], + }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); + trigger = true; + } + } + if (trigger) { + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "tick", - e.energyCost); + } + }, + "AoEDamage": (e, _weapon, _data) => { + let trigger = false; + for (let enemy of KDMapData.Entities) { + if (KDHostile(enemy) && (!e.chance || KDRandom() < e.chance) && enemy.hp > 0 && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) <= e.aoe) { + KinkyDungeonDamageEnemy(enemy, { + type: e.damage, + crit: e.crit, + damage: e.power, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + addBind: e.addBind, + bindType: e.bindType, + }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); + trigger = true; + } + } + if (trigger) { + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "tick", - e.energyCost); + } + }, + }, + "calcCrit": { + "buffMagicCrit": (e, _weapon, data) => { + if (!KinkyDungeonMeleeDamageTypes.includes(data.Damage?.type)) { + data.critboost += e.power; + } + }, + "buffWeaponCrit": (e, _weapon, data) => { + if (data.Damage?.name == KinkyDungeonPlayerDamage?.name) { + data.critboost += e.power; + } + }, + }, + "beforePlayerAttack": { + "ApplyBuff": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm) { + if (data.enemy && (!e.chance || KDRandom() < e.chance)) { + if (!data.enemy.buffs) data.enemy.buffs = {}; + KinkyDungeonApplyBuffToEntity(data.enemy, e.buff); + } + } + }, + "KatanaBoost": (e, weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && data.Damage && data.Damage.damage) { + if (data.enemy && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + if (!e.chance || KDRandom() < e.chance) { + let dmgMult = e.power; + let charge = KinkyDungeonPlayerBuffs[weapon.name + "Charge"] ? KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration : 0; + if (charge >= 9) dmgMult *= 2; + data.Damage.damage = data.Damage.damage + dmgMult * charge; + if (KinkyDungeonPlayerBuffs[weapon.name + "Charge"]) KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration = 0; + + if (e.energyCost) KDChangeCharge(weapon.name, "weapon", "attack", - e.energyCost * charge); + if (e.sfx && charge > 9) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); + } + } + } + }, + "DamageMultInShadow": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && data.Damage && data.Damage.damage) { + if (data.enemy && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + if ((!e.chance || KDRandom() < e.chance) && (KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) <= 1.5 || KinkyDungeonBrightnessGet(data.enemy.x, data.enemy.y) <= 1.5)) { + let dmgMult = e.power; + data.Damage.damage = data.Damage.damage * dmgMult; + + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "attack", - e.energyCost); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + } + } + }, + "ChangeDamageUnaware": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && data.Damage && data.Damage.damage > 0 && !data.enemy.Enemy.tags.nobrain) { + if ((!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { + if (!data.enemy.aware) { + data.Damage.damage = e.power; + data.Damage.type = e.damage; + data.Damage.time = e.time; + data.Damage.bind = e.bind; + } + } + } + }, + "ChangeDamageVulnerable": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && data.Damage && data.Damage.damage > 0 && !data.enemy.Enemy.tags.nonvulnerable) { + if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { + if (data.enemy.vulnerable > 0) { + data.Damage.damage = e.power; + data.Damage.type = e.damage; + data.Damage.time = e.time; + data.Damage.bind = e.bind; + } + } + } + }, + }, + "playerMove": { + "DealDamageToTaped": (e, _weapon, data) => { + let enemies = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, e.dist || 1.5); + for (let enemy of enemies) { + if ((!e.chance || KDRandom() < e.chance) && enemy.hp > 0 && !KDHelpless(enemy) && KDHostile(enemy) && KDEntityHasBuffTags(enemy, "taped")) { + KinkyDungeonDamageEnemy(enemy, { + type: e.damage, + // Double damage if sprinting!! + damage: e.power * Math.min(Math.max(1, data.dist || 1), 2), + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + bindType: e.bindType, + addBind: e.addBind, + }, false, e.power < 0.5, undefined, undefined, KinkyDungeonPlayerEntity); + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + } + }, + }, + "playerAttack": { + "ApplyTaped": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm) { + if (data.enemy && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + let bb = Object.assign({}, KDTaped); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + + if (!data.enemy.buffs) data.enemy.buffs = {}; + KinkyDungeonApplyBuffToEntity(data.enemy, bb); + } + } + }, + "ApplyToy": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm) { + if (data.enemy && KDCanBind(data.enemy) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { + let bb = Object.assign({}, KDToy); + if (e.duration) bb.duration = e.duration; + if (e.power) bb.power = e.power; + + if (!data.enemy.buffs) data.enemy.buffs = {}; + KinkyDungeonApplyBuffToEntity(data.enemy, bb); + } + } + }, + "ActivateVibration": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm) { + if (data.enemy && data.enemy.Enemy.bound && KDEnemyCanBeVibed(data.enemy) && (!e.chance || KDRandom() < e.chance)) { + KDApplyGenBuffs(data.enemy, "Vibrate1", 90); + } + } + }, + + + "ElementalEffectOnDisarm": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && data.enemy.disarm > 0) { + if (data.enemy && (!e.chance || KDRandom() < e.chance) + && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + crit: e.crit, + damage: e.power, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + bindType: e.bindType, + addBind: e.addBind, + }, false, e.power < 0.5, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + if (e.sfx) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); + } + } + } + }, + + "ElementalEffectOnBarricade": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && data.enemy.Enemy?.tags?.barricade) { + if (data.enemy && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + crit: e.crit, + damage: e.power, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + bindType: e.bindType, + addBind: e.addBind, + }, false, e.power < 0.5, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + if (e.sfx) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); + } + } + } + }, + "ElementalEffectCrit": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && data.predata?.vulnerable) { + if (data.enemy && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + crit: e.crit, + damage: e.power, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + bindType: e.bindType, + addBind: e.addBind, + }, false, e.power < 0.5, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + if (e.sfx) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); + } + } + } + }, + "ElementalEffect": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm) { + if (data.enemy && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + crit: e.crit, + damage: e.power, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + bindType: e.bindType, + addBind: e.addBind, + }, false, e.power < 0.5, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + if (e.sfx) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); + } + } + } + }, + "ElementalEffectStamCost": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm) { + if (data.enemy && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0 && !KDHelpless(data.enemy) && KinkyDungeonHasStamina(e.cost)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + crit: e.crit, + damage: e.power, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + bindType: e.bindType, + addBind: e.addBind, + }, false, e.power < 0.5, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + KDChangeStamina(_weapon.name, "weapon", "attack", -e.cost); + if (e.sfx) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); + } + } + } + }, + "MagicRope": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm) { + if (data.enemy && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0 && !KDHelpless(data.enemy)) { + if (!KinkyDungeonHasMana(e.cost)) { + let restrained = KDPlayerEffectRestrain(undefined, 2, ["ropeMagicWeak"], "Player", true, false, false, false, false); + if (restrained.length > 0) { + KinkyDungeonSendTextMessage(8, TextGet("KDMagicRopeBackfire"), "#92e8c0", 2); + } + } + KDChangeMana(_weapon.name, "weapon", "attack", -e.cost); + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + crit: e.crit, + damage: e.power, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + bindType: e.bindType, + addBind: e.addBind, + }, false, e.power < 0.5, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + }, + "StormBreakerDamage": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm) { + let enemies = KDNearbyEnemies(data.enemy.x, data.enemy.y, e.aoe); + for (let en of enemies) { + if (en && KDHostile(en) && (!e.chance || KDRandom() < e.chance) && en.hp > 0 && !KDHelpless(en) && KinkyDungeonPlayerBuffs.StormCharge) { + let mult = 0.2 * Math.min(5, KinkyDungeonPlayerBuffs.StormCharge.duration); + let damage = e.power * mult; + KinkyDungeonDamageEnemy(en, { + type: e.damage, + crit: e.crit, + damage: damage, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + bindType: e.bindType, + addBind: e.addBind, + }, false, false, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, en == data.enemy && data.vulnConsumed); + KDCreateEffectTile(en.x, en.y, { + name: "Sparks", + duration: 2, + }, 2); + } + } + if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg", undefined, e.vol); + } + }, + "ApplyBuff": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm) { + if (data.enemy && (!e.chance || KDRandom() < e.chance)) { + if (!data.enemy.buffs) data.enemy.buffs = {}; + KinkyDungeonApplyBuffToEntity(data.enemy, e.buff); + } + } + }, + "Cleave": (e, _weapon, data) => { + if (data.enemy && !data.disarm) { + let nearby = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5); + for (let enemy of nearby) { + if (enemy != data.enemy && KDHostile(enemy) && !KDHelpless(data.enemy)) { + if (KinkyDungeonEvasion(enemy)) { + KinkyDungeonDamageEnemy(enemy, { + type: e.damage, + crit: e.crit, + damage: e.power, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + bindType: e.bindType, + addBind: e.addBind, + }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); + } + } + } + } + }, + "MagicFlail": (e, _weapon, data) => { + if (data.enemy && !data.disarm) { + let nearby = KDNearbyEnemies(data.enemy.x, data.enemy.y, 1.5); + for (let enemy of nearby) { + if (KDHostile(enemy) && !KDHelpless(enemy)) { + KinkyDungeonDamageEnemy(enemy, { + type: e.damage, + crit: e.crit, + damage: e.power, + time: e.time, + bind: e.bind, + bindEff: e.bindEff, + distract: e.distract, + desireMult: e.desireMult, + distractEff: e.distractEff, + bindType: e.bindType, + addBind: e.addBind, + }, false, enemy != data.enemy, undefined, undefined, KinkyDungeonPlayerEntity); + } + } + } + }, + "CastSpell": (e, _weapon, data) => { + if (data.enemy && !data.disarm && !KDHelpless(data.enemy)) { + let spell = KinkyDungeonFindSpell(e.spell, true); + KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, spell, { + x: KinkyDungeonPlayerEntity.x, + y: KinkyDungeonPlayerEntity.y + }, { x: data.enemy.x, y: data.enemy.y }, undefined); + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "attack", - e.energyCost); + } + }, + "Pierce": (e, _weapon, data) => { + if (data.enemy && !data.disarm) { + let dist = e.dist ? e.dist : 1; + // Does not apply to ranged attacks + if (KDistEuclidean(data.enemy.x - KinkyDungeonPlayerEntity.x, data.enemy.y - KinkyDungeonPlayerEntity.y) > 1.5) return; + for (let i = 1; i <= dist; i++) { + let xx = data.enemy.x + i * (data.enemy.x - KinkyDungeonPlayerEntity.x); + let yy = data.enemy.y + i * (data.enemy.y - KinkyDungeonPlayerEntity.y); + for (let enemy of KDMapData.Entities) { + if (enemy != data.enemy && KDHostile(enemy) && !KDHelpless(data.enemy)) { + if (KinkyDungeonEvasion(enemy) && enemy.x == xx && enemy.y == yy) { + KinkyDungeonDamageEnemy(enemy, { + type: e.damage, + damage: e.power + }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); + } + } + } + } + } + }, + "DamageToTag": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy)) { + if (data.enemy && data.enemy.Enemy.tags[e.requiredTag] && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, false, false, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + }, + "DamageToSummons": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy)) { + if (data.enemy && data.enemy.lifetime > 0 && data.enemy.lifetime < 9999 && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, false, true, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + }, + "ElementalOnVulnerable": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && !data.enemy.Enemy.tags.nonvulnerable) { + if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { + if (data.enemy.vulnerable > 0) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, false, false, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + } + }, + "ElementalOnUnaware": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && !data.enemy.Enemy.tags.nobrain) { + if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { + if (!data.enemy.aware) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, false, false, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + } + }, + "ElementalDreamcatcher": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy)) { + if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { + if (!data.enemy.aware && !data.enemy.Enemy.tags.nobrain) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, false, false, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } else if (data.enemy.vulnerable > 0 && !data.enemy.Enemy.tags.nonvulnerable) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power * 0.5, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, false, false, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + } + }, + "ElementalUnaware": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && !data.enemy.Enemy.tags.nobrain) { + if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { + if (!data.enemy.aware) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, false, false, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + } + }, + "ElementalVulnerable": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm && !KDHelpless(data.enemy) && !data.enemy.Enemy.tags.nonvulnerable) { + if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { + if (data.enemy.vulnerable > 0) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, false, false, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + } + }, + "Dreamcatcher": (e, _weapon, data) => { + if (data.enemy && !data.miss && !data.disarm) { + if (data.enemy && (!e.requiredTag || data.enemy.Enemy.tags[e.requiredTag]) && (!e.chance || KDRandom() < e.chance) && data.enemy.hp > 0) { + if (!data.enemy.aware && !data.enemy.Enemy.tags.Temporary) { + let point = KinkyDungeonGetNearbyPoint(data.enemy.x, data.enemy.y, true, undefined, true); + if (point) { + let Enemy = KinkyDungeonGetEnemyByName("ShadowWarrior"); + KDAddEntity({ + summoned: true, + rage: Enemy.summonRage ? 9999 : undefined, + Enemy: Enemy, + id: KinkyDungeonGetEnemyID(), + x: point.x, + y: point.y, + hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, + movePoints: 0, + attackPoints: 0, + lifetime: e.time, + maxlifetime: e.time, + }); + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "attack", - e.energyCost); + } + } + } + } + }, + "Knockback": (e, _weapon, data) => { + if (e.dist && data.enemy && data.targetX && data.targetY && !data.miss && !data.disarm && !KDHelpless(data.enemy)) { + if (data.enemy.Enemy && !data.enemy.Enemy.tags.unflinching && !data.enemy.Enemy.tags.stunresist && !data.enemy.Enemy.tags.unstoppable && !data.enemy.Enemy.tags.noknockback && !KDIsImmobile(data.enemy)) { + let newX = data.targetX + Math.round(e.dist * (data.targetX - KinkyDungeonPlayerEntity.x)); + let newY = data.targetY + Math.round(e.dist * (data.targetY - KinkyDungeonPlayerEntity.y)); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) + && (e.dist == 1 || KinkyDungeonCheckProjectileClearance(data.enemy.x, data.enemy.y, newX, newY, false))) { + KDMoveEntity(data.enemy, newX, newY, false); + KinkyDungeonSetEnemyFlag(data.enemy, "takeFF", 1); + KinkyDungeonRemoveBuffsWithTag(data.enemy, ["displaceend"]); + } + } + } + }, + }, + "beforeDamageEnemy": { + "MultiplyTime": (e, _weapon, data) => { + if (data.time > 0 && (!e.damage || e.damage == data.type)) { + if (!e.chance || KDRandom() < e.chance) { + data.time = Math.ceil(data.time * e.power); + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "enemyDmg", - e.energyCost); + } + } + }, + "MultiplyDamageFrozen": (e, _weapon, data) => { + if (data.enemy && data.enemy.freeze > 0 && data.dmg > 0 && (!e.damage || e.damage == data.type)) { + if (!e.chance || KDRandom() < e.chance) { + data.dmg = Math.ceil(data.dmg * e.power); + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "enemyDmg", - e.energyCost); + } + } + }, + "EchoDamage": (e, _weapon, data) => { + if (data.enemy && (!data.flags || !data.flags.includes("EchoDamage")) && data.dmg > 0 && (!e.damage || e.damage == data.type)) { + if (!e.chance || KDRandom() < e.chance) { + let trigger = false; + for (let enemy of KDMapData.Entities) { + if ((enemy.rage || (KDAllied(enemy) && KDAllied(data.enemy)) || (KDHostile(enemy) && KDHostile(data.enemy))) && enemy != data.enemy && !KDHelpless(enemy) && enemy.hp > 0 && KDistEuclidean(enemy.x - data.enemy.x, enemy.y - data.enemy.y) <= e.aoe) { + KinkyDungeonDamageEnemy(enemy, { + type: e.damage, + damage: e.power, + time: e.time, + flags: ["EchoDamage"] + }, false, true, undefined, undefined, KinkyDungeonPlayerEntity); + trigger = true; + } + } + if (trigger) { + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "enemyDmg", - e.energyCost); + } + } + } + }, + }, + "capture": { + "Dollmaker": (e, _weapon, data) => { + if (data.attacker && data.attacker.player && data.enemy && !KDAllied(data.enemy)) { + if (!e.chance || KDRandom() < e.chance) { + let Enemy = KinkyDungeonGetEnemyByName("AllyDoll"); + let doll: entity = { + summoned: true, + rage: Enemy.summonRage ? 9999 : undefined, + Enemy: Enemy, + id: KinkyDungeonGetEnemyID(), + x: data.enemy.x, + y: data.enemy.y, + hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, + movePoints: 0, + attackPoints: 0 + }; + let dollCount = KDMapData.Entities.filter((entity) => { + return entity.Enemy.name == "AllyDoll" && KDAllied(entity); + }).length; + if (dollCount > e.power) { + doll.faction = "Enemy"; + doll.boundLevel = doll.hp * 11; + KinkyDungeonSendTextMessage(8, TextGet("KDDollmakerTooManyDolls"), "lightgreen", 2); + } + KDAddEntity(doll); + if (e.energyCost) KDChangeCharge(_weapon.name, "weapon", "enemyDmg", - e.energyCost); + } + } + }, + }, + "afterDamageEnemy": { + + }, +}; + +/** + * @param Event + * @param e + * @param weapon + * @param data + */ +function KinkyDungeonHandleWeaponEvent(Event: string, e: KinkyDungeonEvent, weapon: weapon, data: any) { + if (Event === e.trigger && KDEventMapWeapon[e.dynamic ? "dynamic" : Event] && KDEventMapWeapon[e.dynamic ? "dynamic" : Event][e.type]) { + if (KDCheckCondition(e, data)) + KDEventMapWeapon[e.dynamic ? "dynamic" : Event][e.type](e, weapon, data); + } +} + + +let KDEventMapBullet: Record void>> = { + "countRune": { + "rune": (_e, b, data: KDRuneCountData) => { + if (!b.bullet.source || !KinkyDungeonFindID(b.bullet.source)) { + data.runes += 1; + data.runeList.push(b); + } + } + }, + "beforeBulletHit": { + "DropKnife": (_e, b, _data) => { + let point = { x: b.x, y: b.y }; + if (!KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(point.x, point.y))) { + if (b.vx || b.vy) { + let speed = KDistEuclidean(b.vx, b.vy); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Math.round(b.x - b.vx / speed), Math.round(b.y - b.vy / speed)))) { + point = { x: Math.round(b.x - b.vx / speed), y: Math.round(b.y - b.vy / speed) }; + } + else if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Math.floor(b.x - b.vx / speed), Math.floor(b.y - b.vy / speed)))) { + point = { x: Math.floor(b.x - b.vx / speed), y: Math.floor(b.y - b.vy / speed) }; + } + else { + point = { x: Math.ceil(b.x - b.vx / speed), y: Math.ceil(b.y - b.vy / speed) }; + } + } + } + KinkyDungeonDropItem({ name: "Knife" }, point, KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(point.x, point.y)), true, true); + }, + }, + "bulletDestroy": { + "MagicMissileChannel": (e, b, data) => { + // If we manage to do the whole thing + if (data.outOfTime && b.bullet?.source) { + let enemy = KinkyDungeonFindID(b.bullet.source); + if (enemy && KinkyDungeonCanCastSpells(enemy)) { + // Spawn many magic missiles! + + let nearby = (e.always || enemy.aware || enemy.vp > 0.5) ? + KDNearbyEnemies(enemy.x, enemy.y, 8, enemy) : []; + + let player = KDHostile(enemy, KDPlayer()) ? KDPlayer() : null; + let playerdist = player ? KDistChebyshev(enemy.x - player.x, enemy.y - player.y) : 10; + if (nearby.length > 0) { + nearby = nearby.filter((en) => { + return KDistChebyshev(enemy.x - en.x, enemy.y - en.y) < playerdist; + }); + if (nearby.length > 0) { + player = nearby[Math.floor(KDRandom() * nearby.length)]; + } + } + + if (!player) return; + let origin = enemy; + let spell = KinkyDungeonFindSpell(e.spell, true); + for (let i = 0; i < (e.count || 1); i++) { + let bb = KinkyDungeonLaunchBullet(origin.x, origin.y, + player.x, player.y, + 0.5, { + noSprite: spell.noSprite, faction: KDGetFaction(enemy), name: spell.name, block: spell.block, volatile: spell.volatile, blockType: spell.blockType, + volatilehit: spell.volatilehit, + width: spell.size, height: spell.size, summon: spell.summon, + targetX: player.x, targetY: player.y, cast: spell.spellcast ? Object.assign({}, spell.spellcast) : undefined, + source: enemy.id, dot: spell.dot, + bulletColor: spell.bulletColor, bulletLight: spell.bulletLight, + bulletSpin: spell.bulletSpin, + effectTile: spell.effectTile, effectTileDurationMod: spell.effectTileDurationMod, + effectTileTrail: spell.effectTileTrail, effectTileDurationModTrail: spell.effectTileDurationModTrail, effectTileTrailAoE: spell.effectTileTrailAoE, + passthrough: spell.noTerrainHit, noEnemyCollision: spell.noEnemyCollision, alwaysCollideTags: spell.alwaysCollideTags, nonVolatile: spell.nonVolatile, noDoubleHit: spell.noDoubleHit, + pierceEnemies: spell.pierceEnemies, piercing: spell.piercing, events: spell.events, + lifetime: (spell.bulletLifetime ? spell.bulletLifetime : 1000), origin: { x: origin.x, y: origin.y }, range: KDGetSpellRange(spell), hit: spell.onhit, + damage: { + evadeable: spell.evadeable, noblock: spell.noblock, + ignoreshield: spell?.ignoreshield, + shield_crit: spell?.shield_crit, // Crit thru shield + shield_stun: spell?.shield_stun, // stun thru shield + shield_freeze: spell?.shield_freeze, // freeze thru shield + shield_bind: spell?.shield_bind, // bind thru shield + shield_snare: spell?.shield_snare, // snare thru shield + shield_slow: spell?.shield_slow, // slow thru shield + shield_distract: spell?.shield_distract, // Distract thru shield + shield_vuln: spell?.shield_vuln, // Vuln thru shield + + damage: spell.power, type: spell.damage, distract: spell.distract, distractEff: spell.distractEff, desireMult: spell.desireMult, bindEff: spell.bindEff, + bind: spell.bind, bindType: spell.bindType, boundBonus: spell.boundBonus, time: spell.time, flags: spell.damageFlags + }, spell: spell + }, false, enemy.x, enemy.y); + bb.visual_x = origin.x; + bb.visual_y = origin.y; + bb.xx += (-1 + KDRandom() * 2); + bb.yy += (-1 + KDRandom() * 2); + bb.x = Math.round(bb.xx); + bb.y = Math.round(bb.yy); + + let dx = bb.xx - enemy.x; + let dy = bb.yy - enemy.y; + bb.vx = dx * 0.8; + bb.vy = dy * 0.8; + + } + + + KinkyDungeonSetEnemyFlag(enemy, "MagicMissileChannelFinished", e.time); + } + } + }, + "IceBreathChannel": (e, b, data) => { + // If we manage to do the whole thing + if (data.outOfTime && b.bullet?.source) { + let enemy = KinkyDungeonFindID(b.bullet.source); + if (enemy && KinkyDungeonCanCastSpells(enemy)) { + // Spawn many magic missiles! + KinkyDungeonSetEnemyFlag(enemy, "dragonChannel", e.time); + KinkyDungeonSetEnemyFlag(enemy, "dragonChannelCD", e.time + 5); + } + } + }, + "KineticLance": (_e, b, _data) => { + if (!KinkyDungeonPlayerWeapon) return; + let point = { x: b.x, y: b.y }; + if (!KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(point.x, point.y))) { + if (b.vx || b.vy) { + let speed = KDistEuclidean(b.vx, b.vy); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Math.round(b.x - b.vx / speed), Math.round(b.y - b.vy / speed)))) { + point = { x: Math.round(b.x - b.vx / speed), y: Math.round(b.y - b.vy / speed) }; + } + else if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Math.floor(b.x - b.vx / speed), Math.floor(b.y - b.vy / speed)))) { + point = { x: Math.floor(b.x - b.vx / speed), y: Math.floor(b.y - b.vy / speed) }; + } + else { + point = { x: Math.ceil(b.x - b.vx / speed), y: Math.ceil(b.y - b.vy / speed) }; + } + } + } + KinkyDungeonDropItem({ name: KinkyDungeonPlayerWeapon }, point, KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(point.x, point.y)), true, true); + + + //We dont drop the item if we are earth magic and it was a rock + //Yay hidden synergies + if (KinkyDungeonPlayerWeapon != "Rock" || !KDHasSpell("ApprenticeEarth")) { + let oldweapon = KinkyDungeonPlayerWeapon; + if (!KDGameData.PreviousWeapon || typeof KDGameData.PreviousWeapon === 'string') KDGameData.PreviousWeapon = []; + while (KDGameData.PreviousWeapon.length < KDMaxPreviousWeapon) { + KDGameData.PreviousWeapon.push("Unarmed"); + } + if (!KDGameData.PreviousWeaponLock || !KDGameData.PreviousWeaponLock[KDWeaponSwitchPref]) + KDGameData.PreviousWeapon[KDWeaponSwitchPref] = oldweapon; + KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet(KinkyDungeonPlayerWeapon)); + KDSetWeapon("Unarmed"); + KinkyDungeonGetPlayerWeaponDamage(); + } + + }, + }, + "bulletHitEnemy": { + "KineticLance": (e, b, data) => { + if (b && data.enemy && !KDHelpless(data.enemy) && data.enemy.hp > 0 && KinkyDungeonPlayerDamage && !KDEnemyHasFlag(data.enemy, "KineticLanceHit")) { + KinkyDungeonSetEnemyFlag(data.enemy, "KineticLanceHit", 1); + let mod = (KinkyDungeonFlags.get("KineticMastery") ? 1.5 : 0) + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "KinesisBase"); + let scaling = e.mult * (KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "KinesisScale"))); + + let attData: damageInfo = { + name: KinkyDungeonPlayerDamage.name, + nodisarm: true, + + nocrit: KinkyDungeonPlayerDamage.nocrit, + noblock: KinkyDungeonPlayerDamage.noblock, + nokill: KinkyDungeonPlayerDamage.nokill, + evadeable: false, + + + addBind: KinkyDungeonPlayerDamage.addBind, + bindcrit: KinkyDungeonPlayerDamage.bindcrit, + crit: KinkyDungeonPlayerDamage.crit, + sfx: KinkyDungeonPlayerDamage.sfx, + time: KinkyDungeonPlayerDamage.time, + + damage: e.power + mod + KinkyDungeonPlayerDamage.damage * scaling, + type: KinkyDungeonPlayerDamage.type, + distract: KinkyDungeonPlayerDamage.distract, + distractEff: KinkyDungeonPlayerDamage.distractEff, + desireMult: KinkyDungeonPlayerDamage.desireMult, + bind: KinkyDungeonPlayerDamage.bind, + bindType: KinkyDungeonPlayerDamage.bindType, + bindEff: KinkyDungeonPlayerDamage.bindEff, + ignoreshield: KinkyDungeonPlayerDamage.ignoreshield, + shield_crit: KinkyDungeonPlayerDamage.shield_crit, // Crit thru shield + shield_stun: KinkyDungeonPlayerDamage.shield_stun, // stun thru shield + shield_freeze: KinkyDungeonPlayerDamage.shield_freeze, // freeze thru shield + shield_bind: KinkyDungeonPlayerDamage.shield_bind, // bind thru shield + shield_snare: KinkyDungeonPlayerDamage.shield_snare, // snare thru shield + shield_slow: KinkyDungeonPlayerDamage.shield_slow, // slow thru shield + shield_distract: KinkyDungeonPlayerDamage.shield_distract, // Distract thru shield + shield_vuln: KinkyDungeonPlayerDamage.shield_vuln, // Vuln thru shield + boundBonus: KinkyDungeonPlayerDamage.boundBonus, + novulnerable: KinkyDungeonPlayerDamage.novulnerable, + tease: KinkyDungeonPlayerDamage.tease + } + + if (KinkyDungeonPlayerDamage.stam50mult && KinkyDungeonStatMana / KinkyDungeonStatManaMax >= 0.50) { + attData.damage *= KinkyDungeonPlayerDamage.stam50mult; + } + let dd = { + target: data.enemy, + attackCost: 0.0, // Important + attackCostOrig: 0.0, + skipTurn: false, + spellAttack: true, + attackData: attData + }; + KinkyDungeonSendEvent("beforePlayerLaunchAttack", dd); + + KinkyDungeonAttackEnemy(data.enemy, dd.attackData, Math.max(2.0, 2 * KinkyDungeonGetEvasion(undefined, false, true, true))); + } + }, + + "Sagitta": (e, b, data) => { + if (b && data.enemy && !KDHelpless(data.enemy) && data.enemy.hp > 0 && KinkyDungeonPlayerDamage) { + let scaling = e.mult * (KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "KinesisScale"))); + let mod = (KinkyDungeonFlags.get("KineticMastery") ? 1.5 : 0) + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "KinesisBase"); + + let attData: damageInfo = { + name: KinkyDungeonPlayerDamage.name, + nodisarm: true, + + nocrit: KinkyDungeonPlayerDamage.nocrit, + noblock: KinkyDungeonPlayerDamage.noblock, + nokill: KinkyDungeonPlayerDamage.nokill, + evadeable: false, + + addBind: KinkyDungeonPlayerDamage.addBind, + bindcrit: KinkyDungeonPlayerDamage.bindcrit, + crit: KinkyDungeonPlayerDamage.crit, + sfx: KinkyDungeonPlayerDamage.sfx, + time: KinkyDungeonPlayerDamage.time, + + damage: e.power + mod + KinkyDungeonPlayerDamage.damage * scaling, + type: KinkyDungeonPlayerDamage.type, + distract: KinkyDungeonPlayerDamage.distract, + distractEff: KinkyDungeonPlayerDamage.distractEff, + desireMult: KinkyDungeonPlayerDamage.desireMult, + bind: KinkyDungeonPlayerDamage.bind, + bindType: KinkyDungeonPlayerDamage.bindType, + bindEff: KinkyDungeonPlayerDamage.bindEff, + ignoreshield: KinkyDungeonPlayerDamage.ignoreshield, + shield_crit: KinkyDungeonPlayerDamage.shield_crit, // Crit thru shield + shield_stun: KinkyDungeonPlayerDamage.shield_stun, // stun thru shield + shield_freeze: KinkyDungeonPlayerDamage.shield_freeze, // freeze thru shield + shield_bind: KinkyDungeonPlayerDamage.shield_bind, // bind thru shield + shield_snare: KinkyDungeonPlayerDamage.shield_snare, // snare thru shield + shield_slow: KinkyDungeonPlayerDamage.shield_slow, // slow thru shield + shield_distract: KinkyDungeonPlayerDamage.shield_distract, // Distract thru shield + shield_vuln: KinkyDungeonPlayerDamage.shield_vuln, // Vuln thru shield + boundBonus: KinkyDungeonPlayerDamage.boundBonus, + novulnerable: KinkyDungeonPlayerDamage.novulnerable, + tease: KinkyDungeonPlayerDamage.tease + }; + + if (KinkyDungeonPlayerDamage.stam50mult && KinkyDungeonStatMana / KinkyDungeonStatManaMax >= 0.50) { + attData.damage *= KinkyDungeonPlayerDamage.stam50mult; + } + let dd = { + target: data.enemy, + attackCost: 0.0, // Important + attackCostOrig: 0.0, + skipTurn: false, + spellAttack: true, + attackData: attData + }; + KinkyDungeonSendEvent("beforePlayerLaunchAttack", dd); + + KinkyDungeonAttackEnemy(data.enemy, dd.attackData, Math.max(0.8, 0.8 * KinkyDungeonGetEvasion(undefined, false, true, true)), b); + } + }, + "Arrow": (e, b, data) => { + if (b && data.enemy && !KDHelpless(data.enemy) && data.enemy.hp > 0 && b.bullet?.damage) { + let scaling = (e.mult || 1) * (KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ArrowDamage"))); + let dd = { + target: data.enemy, + attackCost: 0.0, // Important + attackCostOrig: 0.0, + skipTurn: false, + spellAttack: true, + attackData: Object.assign({}, b.bullet.damage), + }; + dd.attackData.damage *= scaling; + dd.attackData.nodisarm = true; + KinkyDungeonSendEvent("beforePlayerLaunchAttack", dd); + + KinkyDungeonAttackEnemy(data.enemy, dd.attackData, Math.max(1, KinkyDungeonGetEvasion(undefined, false, true, false)), b); + } + }, + "Blaster": (e, b, data) => { + if (b && data.enemy && !KDHelpless(data.enemy) && data.enemy.hp > 0 && b.bullet?.damage) { + let scaling = (e.mult || 1) * (KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BlasterDamage"))); + let dd = { + target: data.enemy, + attackCost: 0.0, // Important + attackCostOrig: 0.0, + skipTurn: false, + spellAttack: true, + attackData: Object.assign({}, b.bullet.damage), + }; + dd.attackData.damage *= scaling; + dd.attackData.nodisarm = true; + KinkyDungeonSendEvent("beforePlayerLaunchAttack", dd); + + KinkyDungeonAttackEnemy(data.enemy, dd.attackData, Math.max(1, KinkyDungeonGetEvasion(undefined, false, true, false)), b); + } + }, + "RubberBullet": (e, b, data) => { + if (b && data.enemy && !KDHelpless(data.enemy) && data.enemy.hp > 0 && b.bullet?.damage) { + let scaling = (e.mult || 1) * (KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "GunDamage"))); + let dd = { + target: data.enemy, + attackCost: 0.0, // Important + attackCostOrig: 0.0, + skipTurn: false, + spellAttack: true, + attackData: Object.assign({}, b.bullet.damage), + }; + dd.attackData.damage *= scaling; + dd.attackData.nodisarm = true; + KinkyDungeonSendEvent("beforePlayerLaunchAttack", dd); + + KinkyDungeonAttackEnemy(data.enemy, dd.attackData, Math.max(1, KinkyDungeonGetEvasion(undefined, false, true, false)), b); + } + }, + "ShadowSlash": (_e, b, data) => { + if (b && !b.shadowBuff && data.enemy && KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) < KDShadowThreshold) { + b.shadowBuff = true; + if (b.bullet?.damage?.damage) b.bullet.damage.damage *= 1.5; + } + }, + "BreakArmor": (e, b, data) => { + if (b && data.enemy) { + KinkyDungeonApplyBuffToEntity(data.enemy, + { id: "ExplosiveBreak", type: "ArmorBreak", duration: e.duration || 80, power: -e.power, player: true, enemies: true, tags: ["debuff", "armor"] }); + } + }, + + "Knockback": (e, b, data) => { + if (b && data.enemy && !data.enemy.Enemy.tags.noknockback && !KDIsImmobile(data.enemy)) { + let pushPower = KDPushModifier(e.power, data.enemy, false); + + if (pushPower > 0) { + let dist = e.dist; + if (pushPower > dist) dist *= 2; + for (let i = 0; i < dist; i++) { + let newX = data.enemy.x + Math.round(1 * Math.sign(b.vx)); + let newY = data.enemy.y + Math.round(1 * Math.sign(b.vy)); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) + && (e.dist == 1 || KinkyDungeonCheckProjectileClearance(data.enemy.x, data.enemy.y, newX, newY, false))) { + KDMoveEntity(data.enemy, newX, newY, false); + KinkyDungeonSetEnemyFlag(data.enemy, "takeFF", 1); + KinkyDungeonRemoveBuffsWithTag(data.enemy, ["displaceend"]); + } + } + + } + } + }, + "GreaterRage": (_e, b, data) => { + if (b && data.enemy && !(data.enemy.Enemy.tags.soulimmune)) { + let time = 300; + if (data.enemy.Enemy.tags.soulresist) time *= 0.5; + else if (data.enemy.Enemy.tags.soulweakness) time *= 2; + else if (data.enemy.Enemy.tags.soulsevereweakness) time *= 4; + if (data.enemy.Enemy.tags.boss) time *= 0.033; + else if (data.enemy.Enemy.tags.miniboss) time *= 0.1; + if (time > 100) time = 9999; + + if (!data.enemy.rage) data.enemy.rage = time; + else data.enemy.rage = Math.max(data.enemy.rage, time); + + KDAddThought(data.enemy.id, "Play", 11, time); + } + }, + + + "PsychicLink": (e, b, data) => { + if (b && data.enemy && !(data.enemy.blind > 0) + && !data.enemy.Enemy?.nonHumanoid + && data.enemy.Enemy?.bound + ) { + let source = KDLookupID(b.source || b.bullet.source); + if (source) { + KinkyDungeonApplyBuffToEntity(data.enemy, { + id: "PsychicLink", + power: 0.5, + duration: e.time || 10, + type: "PsychicLink", + aura: "#ff5277", + aurasprite: "PsychicLink", + noAuraColor: true, + events: [ + { type: "PsychicLink", trigger: "duringDistractEnemy", mult: 0.5, source: b.source || b.bullet.source }, + { type: "PsychicLink", trigger: "enemyOrgasm", mult: 0.5, source: b.source || b.bullet.source }, + { type: "PsychicLink", trigger: "afterEnemyOrgasm", mult: 0.5, source: b.source || b.bullet.source }, + ], + }); + KinkyDungeonApplyBuffToEntity(source, { + id: "PsychicLink", + power: 0.5, + duration: e.time || 10, + type: "PsychicLink", + aura: "#ff5277", + aurasprite: "PsychicLink", + noAuraColor: true, + events: [ + { type: "PsychicLink", trigger: "duringChangeDistraction", mult: 0.5, source: data.enemy.id }, + { type: "PsychicLink", trigger: "tryOrgasm", mult: 0.5, source: data.enemy.id }, + { type: "PsychicLink", trigger: "orgasm", mult: 0.5, source: data.enemy.id }, + ], + }); + } + + } + }, + "ElementalOnSlowOrBind": (e, b, data) => { + if (b && data.enemy && (KinkyDungeonIsSlowed(data.enemy) || data.enemy.bind > 0)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); + } + }, + "ApplyGenBuff": (e, b, data) => { + if (b && data.enemy) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) + KDApplyGenBuffs(data.enemy, e.buff, e.time); + } + }, + "PlugEnemy": (e, b, data) => { + if (b && data.enemy) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { + if (data.enemy.Enemy?.bound && (data.enemy.boundLevel > 0 || KDEntityGetBuff(data.enemy, "Chastity"))) { + KDPlugEnemy(data.enemy); + } + } + } + }, + "LatexWall": (e, b, data) => { + if (b && data.enemy) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { + if (!KDEnemyHasFlag(data.enemy, "latexWall")) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, true, false, b.bullet.spell, b, undefined, b.delay, true); + KDBlindEnemy(data.enemy, e.time); + KinkyDungeonSetEnemyFlag(data.enemy, "latexWall", 21); + } + } + } + }, + "EncaseBound": (e, b, data) => { + if (b && data.enemy && data.enemy.Enemy) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { + if (data.enemy.Enemy.bound && (data.enemy.boundLevel >= data.enemy.maxhp || KDHelpless(data.enemy))) { + KinkyDungeonApplyBuffToEntity(data.enemy, KDEncased); + } + } + } + }, + "SilenceHumanoid": (e, b, data) => { + if (b && data.enemy && data.enemy.Enemy.bound) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) + KDSilenceEnemy(data.enemy, e.time); + } + }, + "BlindHumanoid": (e, b, data) => { + if (b && data.enemy && data.enemy.Enemy.bound) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) + KDBlindEnemy(data.enemy, e.time); + } + }, + "BlindAll": (e, b, data) => { + if (b && data.enemy) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) + KDBlindEnemy(data.enemy, e.time); + } + }, + "DisarmHumanoid": (e, b, data) => { + if (b && data.enemy && data.enemy.Enemy.bound) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) + KDDisarmEnemy(data.enemy, e.time); + } + }, + "RemoveBlock": (e, b, data) => { + if (b && data.enemy && data.enemy.blocks > 0) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { + KinkyDungeonApplyBuffToEntity(data.enemy, { + id: "RemoveBlock", + power: -e.power, + duration: e.time || 10, + type: "MaxBlock", + events: [ + { type: "ExtendDisabledOrHelpless", trigger: "tick" }, + ], + }); + } + } + }, + "DisarmDebuff": (e, b, data) => { + if (b && data.enemy && data.enemy.Enemy.bound) { + if (!e.prereq || KDCheckPrereq(data.enemy, e.prereq)) { + KinkyDungeonApplyBuffToEntity(data.enemy, KDRestraintDisarmLight); + } + } + }, + "ElementalIfNotSilenced": (e, b, data) => { + if (b && data.enemy) { + if (!(data.enemy.silence > 0)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); + } + } + }, + "ElementalIfNotBlinded": (e, b, data) => { + if (b && data.enemy) { + if (!(data.enemy.blind > 0)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); + } + } + }, + "ElementalIfNotDisarmed": (e, b, data) => { + if (b && data.enemy) { + if (!(data.enemy.disarm > 0)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); + } + } + }, + "ElementalIfNotSnared": (e, b, data) => { + if (b && data.enemy) { + if (!(data.enemy.bind > 0)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); + } + } + }, + "ElementalIfHalfBound": (e, b, data) => { + if (b && data.enemy) { + if (KDBoundEffects(data.enemy) > 1) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); + } + } + }, + + "EnchantRope": (_e, b, data) => { + if (b && data.enemy) { + if (data.enemy.Enemy?.style && KDGetNPCRestraints(data.enemy.id)) { + KDQuickGenNPC(data.enemy, true); + let npcSprite = KDNPCChar.get(data.enemy.id); + let enemyTags: Map = null; + if (npcSprite) { + NPCTags.set(npcSprite, KinkyDungeonUpdateRestraints(npcSprite, data.enemy.id, 0)); + enemyTags = NPCTags.get(npcSprite); + } + + let transmuteLevel = 0; + if (enemyTags?.get("RopeSnake")) { + transmuteLevel = 1; + } + if (_e.power > 1 && enemyTags?.get("WeakMagicRopes")) { + transmuteLevel = 2; + } + if (_e.power > 2) { + transmuteLevel = 3; + } + if (_e.power > 3) { + transmuteLevel = 4; + } + + if (transmuteLevel > 0 && KDGetNPCRestraints(data.enemy.id)) { + if (transmuteLevel > 1) { + for (let inv of Object.values(KDGetNPCRestraints(data.enemy.id))) { + if (KDRestraint(inv)?.shrine?.includes("WeakMagicRopes") + && !inv.inventoryVariant) { + if (transmuteLevel > 3 || KDRestraint(inv)?.Group != "ItemNeck") { + let newRes = KDRestraint(inv).name.replace("WeakMagicRope", "StrongMagicRope"); + //if (KDCanAddRestraint(KinkyDungeonGetRestraintByName(newRes), true, "", false, inv.item)) + KDChangeNPCRestraint(inv, newRes); + } + } + } + } + + if (transmuteLevel > 0) { + for (let inv of Object.values(KDGetNPCRestraints(data.enemy.id))) { + if (KDRestraint(inv)?.shrine?.includes("RopeSnake") + && !inv.inventoryVariant) { + if (transmuteLevel > 2 || KDRestraint(inv)?.Group != "ItemNeck") { + let newRes = KDRestraint(inv).name.replace("RopeSnake", "WeakMagicRope"); + //if (KDCanAddRestraint(KinkyDungeonGetRestraintByName(newRes), true, "", false, inv.item)) + KDChangeNPCRestraint(inv, newRes); + } + } + } + } + } + + } + + + + + + if (data.enemy.specialBoundLevel?.Rope) { + KDTieUpEnemy(data.enemy, data.enemy.specialBoundLevel.Rope, "MagicRope", "arcane", true); + data.enemy.boundLevel -= data.enemy.specialBoundLevel.Rope; + delete data.enemy.specialBoundLevel.Rope; + } + } + }, + + "Elemental": (e, b, data) => { + if (b && data.enemy) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + bindType: e.bindType, + addBind: e.addBind, + }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); + } + }, + "BoundBonus": (e, b, data) => { + if (b && data.enemy) { + let mult = KDBoundEffects(data.enemy); + if (mult > 0) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power ? e.power * mult : undefined, + time: e.time, + bind: e.bind ? e.bind * mult : undefined, + bindType: e.bindType, + addBind: e.addBind, + }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); + } + } + }, + "ElementalOnSlowOrBindOrDrench": (e, b, data) => { + if (b && data.enemy && (KinkyDungeonIsSlowed(data.enemy) || data.enemy.bind > 0 || (data.enemy.buffs && data.enemy.buffs.Drenched))) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + addBind: e.addBind, + bindType: e.bindType, + }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); + } + }, + "ElementalOnDrench": (e, b, data) => { + if (b && data.enemy && (data.enemy.buffs && data.enemy.buffs.Drenched)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: e.damage, + damage: e.power, + time: e.time, + bind: e.bind, + distract: e.distract, + addBind: e.addBind, + bindType: e.bindType, + }, true, (b.bullet.NoMsg || e.power == 0), b.bullet.spell, b, undefined, b.delay, true); + } + }, + }, + "bulletTick": { + + "EndChance": (e, b, _data) => { + if (b.time < e.count) + if (KDRandom() < e.chance) { + b.time = 0; + } + }, + "CreateSmoke": (e, b, _data) => { + KDCreateAoEEffectTiles(b.x, b.y, { + name: e.kind || "Smoke", + duration: e.time || 10, + }, 3, e.aoe || 1.5, undefined, e.chance || 0.5); + }, + "MagicMissileChannel": (_e, b, _data) => { + if (b.bullet?.source) { + let enemy = KinkyDungeonFindID(b.bullet.source); + if (enemy) { + if (KinkyDungeonCanCastSpells(enemy)) { + KinkyDungeonSetEnemyFlag(enemy, "nocast", 2); + KinkyDungeonApplyBuffToEntity(enemy, { id: "ChannelSlow", type: "MoveSpeed", duration: 1, power: -1, tags: ["speed"] }); + b.x = enemy.x; + b.y = enemy.y; + b.xx = enemy.x; + b.yy = enemy.y; + return; // Dont cancel the bullet + } + } + } + let ind = KDMapData.Bullets.indexOf(b); + if (ind > -1) + KDMapData.Bullets.splice(ind, 1); + KinkyDungeonBulletsID[b.spriteID] = null; + KinkyDungeonUpdateSingleBulletVisual(b, true, 0); + KinkyDungeonSendEvent("bulletDestroy", { bullet: b, target: undefined, outOfRange: false, outOfTime: false }); + }, + "FlashPortal": (e, _b, _data) => { + let player = KinkyDungeonPlayerEntity; + if (player) { + let enemies = KDNearbyEnemies(player.x, player.y, e.dist); + if (enemies.length > 0) { + for (let en of enemies) { + if (en.hp > 0 && !KDIsImmobile(en, true)) { + KinkyDungeonApplyBuffToEntity(en, { + id: "FlashPortal", + aura: "#92e8c0", + type: "Marker", + duration: 1, + power: 1, + }); + } + } + } + } + }, + "TransportationPortal": (e, _b, _data) => { + let player = KinkyDungeonPlayerEntity; + if (player) { + let enemies = KDNearbyEnemies(player.x, player.y, e.dist); + if (enemies.length > 0) { + for (let en of enemies) { + if (en.hp > 0 && KDAllied(en) && !KDIsImmobile(en, true)) { + KinkyDungeonApplyBuffToEntity(en, { + id: "TransportationPortal", + aura: "#92e8c0", + type: "Marker", + duration: 1, + power: 1, + }); + } + } + } + } + }, + "BanishPortal": (e, _b, _data) => { + let player = KinkyDungeonPlayerEntity; + if (player) { + let enemies = KDNearbyEnemies(player.x, player.y, e.dist); + if (enemies.length > 0) { + for (let en of enemies) { + if (en.hp > 0 && (!KDAllied(en) || KinkyDungeonAggressive(en)) && !KDIsImmobile(en, true)) { + KinkyDungeonApplyBuffToEntity(en, { + id: "BanishPortal", + aura: "#92e8c0", + type: "Marker", + duration: 1, + power: 1, + }); + } + } + } + } + }, + "ZoneOfPurity": (e, b, _data) => { + let enemies = KDNearbyEnemies(b.x, b.y, e.aoe); + if (enemies.length > 0) { + for (let en of enemies) { + if (en && en.Enemy.bound && en.boundLevel > e.power) { + KDBindEnemyWithTags(en.id, + ["magicBeltForced"], 50, + MiniGameKinkyDungeonLevel + 10, + true, undefined, false, false); + } + } + } + if (KDistEuclidean(KinkyDungeonPlayerEntity.x - b.x, KinkyDungeonPlayerEntity.y - b.y) <= e.aoe) { + let restraintAdd = KinkyDungeonGetRestraint({ tags: ["magicBeltForced"] }, MiniGameKinkyDungeonLevel + 10, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KinkyDungeonSendActionMessage(3, TextGet("KDZoneOfPuritySelf"), "#88AAFF", 2); + KinkyDungeonAddRestraintIfWeaker(restraintAdd, 0, false, undefined, false, false, undefined, "Divine"); + } + } + }, + "ZoneOfExcitement": (e, b, _data) => { + let enemies = KDNearbyEnemies(b.x, b.y, e.aoe); + if (enemies.length > 0) { + for (let en of enemies) { + if (en && en.Enemy.bound) { + KinkyDungeonApplyBuffToEntity(en, KDToy); + KDBindEnemyWithTags(en.id, + ["genericToys"], 0, + MiniGameKinkyDungeonLevel + 10, + true, undefined, false, false); + } + } + } + if (KDistChebyshev(KinkyDungeonPlayerEntity.x - b.x, KinkyDungeonPlayerEntity.y - b.y) <= e.aoe) { + let restraintAdd = KinkyDungeonGetRestraint({ tags: ["genericToys"] }, MiniGameKinkyDungeonLevel + 10, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KinkyDungeonSendActionMessage(3, TextGet("KDZoneOfExcitementSelf"), "#88AAFF", 2); + KinkyDungeonAddRestraintIfWeaker(restraintAdd, 0, false, undefined, false, false, undefined, undefined); + } + } + }, + "CastSpellNearbyEnemy": (e, b, data) => { + if (data.delta > 0) { + let source = b.bullet.source ? KinkyDungeonFindID(b.bullet.source) : null; + let born = b.born ? 0 : 1; + let enemies = KDNearbyEnemies(b.x + b.vx * data.delta * born, b.y + b.vy * data.delta * born, e.aoe) + .filter((enemy) => { + return (!source || b.bullet.source == -1) + ? (KDHostile(enemy) || (b.x == enemy.x && b.y == enemy.y && !KDAllied(enemy))) + : (KDFactionHostile(KDGetFaction(source), KDGetFaction(enemy))); + }); + if (e.player + && KDistEuclidean( + b.x + b.vx * data.delta * born - KDPlayer().x, + b.y + b.vy * data.delta * born - KDPlayer().y) < e.aoe + && (!source + || ( + source + && KDFactionHostile(KDGetFaction(source), "Player") + ) + ) + ) { + enemies.push(KinkyDungeonPlayerEntity); + } + if (enemies.length > 0) { + let enemy = enemies[Math.floor(KDRandom() * enemies.length)]; + KinkyDungeonCastSpell(enemy.x, enemy.y, + KinkyDungeonFindSpell(e.spell, true), undefined, undefined, undefined, b.bullet.faction); + } + } + }, + }, + "afterBulletHit": { + "ShadowShroudTele": (e, b, _data) => { + let enemy = b.bullet?.source > 0 ? KinkyDungeonFindID(b.bullet.source) : null; + if (!enemy) return; + if (enemy.attackPoints > 0) return; + let target = null; + if (b.bullet.faction) { + let minDist = 1000; + let entity = null; + let playerDist = 1000; + if (KDFactionHostile(b.bullet.faction, "Player")) { + playerDist = KDistEuclidean(KinkyDungeonPlayerEntity.x - b.bullet.targetX, KinkyDungeonPlayerEntity.y - b.bullet.targetY); + if (playerDist <= e.aoe) { + entity = KinkyDungeonPlayerEntity; + minDist = playerDist; + } + } + + let enemies = KDNearbyEnemies(b.bullet.targetX, b.bullet.targetY, e.aoe); + for (let en of enemies) { + if (!KDHelpless(en) && KDFactionHostile(b.bullet.faction, en)) { + playerDist = KDistEuclidean(en.x - b.bullet.targetX, en.y - b.bullet.targetY); + if (playerDist < minDist) { + entity = en; + minDist = playerDist; + } + } + } + if (entity) { + target = entity; + } + } + + if (!target) return; + + let bullets = KDMapData.Bullets.filter((bb) => { return bb.bullet?.spell?.name == "ShadowShroud"; }); + let nearest = null; + let nearestDist = 100; + for (let bb of bullets) { + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(bb.x, bb.y))) { + let dist = KDistEuclidean(b.x - bb.x, b.y - bb.y); + let distplayer = KDistEuclidean(target.x - bb.x, target.y - bb.y); + if (dist <= e.aoe && distplayer < nearestDist + && distplayer < KDistEuclidean(target.x - enemy.x, target.y - enemy.y)) { + nearestDist = distplayer; + nearest = bb; + } + } + } + + if (nearest) { + let tdata = { + x: nearest.x, + y: nearest.y, + cancel: false, + entity: enemy, + willing: true, + }; + KinkyDungeonSendEvent("beforeTeleport", tdata); + if (tdata.cancel) { + KDMoveEntity(enemy, nearest.x, nearest.y, true); + KinkyDungeonRemoveBuffsWithTag(enemy, ["displaceend"]); + } + KinkyDungeonSendTextMessage(5, TextGet("KDDragonTeleport"), "#814fb8", 1); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Teleport.ogg", enemy); + } + + }, + + "DarkTele": (e, b, _data) => { + let enemy = b.bullet?.source > 0 ? KinkyDungeonFindID(b.bullet.source) : null; + if (!enemy) return; + if (enemy.attackPoints > 0) return; + let target = null; + if (b.bullet.faction) { + let minDist = 1000; + let entity = null; + let playerDist = 1000; + if (KDFactionHostile(b.bullet.faction, "Player")) { + playerDist = KDistEuclidean(KinkyDungeonPlayerEntity.x - b.bullet.targetX, KinkyDungeonPlayerEntity.y - b.bullet.targetY); + if (playerDist <= e.aoe) { + entity = KinkyDungeonPlayerEntity; + minDist = playerDist; + } + } + + let enemies = KDNearbyEnemies(b.bullet.targetX, b.bullet.targetY, e.aoe); + for (let en of enemies) { + if (!KDHelpless(en) && KDFactionHostile(b.bullet.faction, en)) { + playerDist = KDistEuclidean(en.x - b.bullet.targetX, en.y - b.bullet.targetY); + if (playerDist < minDist) { + entity = en; + minDist = playerDist; + } + } + } + if (entity) { + target = entity; + } + } + + if (!target) return; + + let point = { + x: b.x + (target.player ? -target.facing_x : (target.x - target.fx)), + y: b.y + (target.player ? -target.facing_y : (target.y - target.fy)), + }; + if (KDistChebyshev(enemy.x - point.x, enemy.y - point.y) > 1.5 + && KinkyDungeonBrightnessGet(point.x, point.y) <= KDShadowThreshold * 2 + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(point.x, point.y)) + && !KinkyDungeonEntityAt(point.x, point.y)) { + let tdata = { + x: point.x, + y: point.y, + cancel: false, + entity: enemy, + willing: true, + }; + KinkyDungeonSendEvent("beforeTeleport", tdata); + if (tdata.cancel) { + KDMoveEntity(enemy, point.x, point.y, true); + KinkyDungeonRemoveBuffsWithTag(enemy, ["displaceend"]); + //KinkyDungeonSendTextMessage(5, TextGet("KDDragonTeleport"), "#814fb8", 1); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Teleport.ogg", enemy); + if (KDRandom() < 0.4) + KinkyDungeonSendDialogue( + enemy, + TextGet("KDTeleportsBehindYou" + Math.floor(KDRandom() * 3)), + KDGetColor(enemy), + 4, + 10, + ); + let spell = KinkyDungeonFindSpell("Summon", true); + if (spell) { + KinkyDungeonCastSpell(point.x, point.y, spell, undefined, undefined, undefined); + } + } + } + + }, + + "CrystalBolt": (_e, b, _data) => { + let point = { x: b.x, y: b.y }; + if (!KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(point.x, point.y))) { + if (b.vx || b.vy) { + let speed = KDistEuclidean(b.vx, b.vy); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Math.round(b.x - b.vx / speed), Math.round(b.y - b.vy / speed)))) { + point = { x: Math.round(b.x - b.vx / speed), y: Math.round(b.y - b.vy / speed) }; + } + else if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Math.floor(b.x - b.vx / speed), Math.floor(b.y - b.vy / speed)))) { + point = { x: Math.floor(b.x - b.vx / speed), y: Math.floor(b.y - b.vy / speed) }; + } + else { + point = { x: Math.ceil(b.x - b.vx / speed), y: Math.ceil(b.y - b.vy / speed) }; + } + } + } + if (point) { + let en = KinkyDungeonSummonEnemy(point.x, point.y, "ChaoticCrystal", 1, 0.5); + if (en.length > 0) { + en[0].lifetime = 12; + en[0].maxlifetime = 12; + en[0].faction = b.bullet?.faction; + } + } + + }, + "CrystalShockBolt": (e, b, _data) => { + // Create the shockwave + let rad = e.dist; + let conductionPoints = {}; + + let bb = { x: b.x, y: b.y }; + if (!KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(bb.x, bb.y))) { + if (b.vx || b.vy) { + let speed = KDistEuclidean(b.vx, b.vy); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Math.round(b.x - b.vx / speed), Math.round(b.y - b.vy / speed)))) { + bb = { x: Math.round(b.x - b.vx / speed), y: Math.round(b.y - b.vy / speed) }; + } + else if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Math.floor(b.x - b.vx / speed), Math.floor(b.y - b.vy / speed)))) { + bb = { x: Math.floor(b.x - b.vx / speed), y: Math.floor(b.y - b.vy / speed) }; + } + else { + bb = { x: Math.ceil(b.x - b.vx / speed), y: Math.ceil(b.y - b.vy / speed) }; + } + } + } + + + conductionPoints[bb.x + ',' + bb.y] = true; + + + for (let i = 0; i < rad; i++) { + for (let x = -Math.ceil(i); x < Math.ceil(i); x++) { + for (let y = -Math.ceil(i); y < Math.ceil(i); y++) { + let dist = KDistEuclidean(x, y); + if (dist >= i - 0.99 && dist <= i + 0.99) { // A ring + let point = { x: bb.x + x, y: bb.y + y }; + if ( + !conductionPoints[(point.x) + ',' + (point.y)] + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(point.x, point.y)) + && (conductionPoints[(point.x + 1) + ',' + (point.y)] + || conductionPoints[(point.x - 1) + ',' + (point.y)] + || conductionPoints[(point.x) + ',' + (point.y + 1)] + || conductionPoints[(point.x) + ',' + (point.y - 1)] + || conductionPoints[(point.x + 1) + ',' + (point.y + 1)] + || conductionPoints[(point.x - 1) + ',' + (point.y + 1)] + || conductionPoints[(point.x + 1) + ',' + (point.y - 1)] + || conductionPoints[(point.x - 1) + ',' + (point.y - 1)]) + ) { + // Create it and set the delay! + conductionPoints[point.x + ',' + point.y] = true; + let ddata = KinkyDungeonCastSpell(point.x, point.y, KinkyDungeonFindSpell("CrystalShock", true), undefined, undefined, b, b.faction || b.bullet?.faction)?.data; + if (ddata.bulletfired) { + ddata.bulletfired.bullet.lifetime = i; + ddata.bulletfired.time = i; + } + } + } + } + } + } + }, + "Phase": (_e, _b, _data) => { + let player = KinkyDungeonPlayerEntity; + if (player) { + KinkyDungeonApplyBuffToEntity(player, { + id: "PhaseEvasion", + type: "Evasion", + power: 0.5, + duration: 3, + aura: "#ffffff", + }); + } + }, + "Crack": (_e, b, data) => { + KDCrackTile(b.x, b.y, data.allowCrack, data); + }, + "BladeDance": (e, _b, data) => { + // Deals damage to nearby enemies + if (!e.prereq || KDCheckPrereq(null, e.prereq, e, data)) { + let player = KinkyDungeonPlayerEntity; + if (player && KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed) { + let spell = KinkyDungeonFindSpell("BladeDanceBullet", true); + if (spell) { + KinkyDungeonCastSpell(player.x, player.y, spell, undefined, undefined, undefined); + } + + let enemies = KDNearbyEnemies(player.x, player.y, e.dist); + + while (enemies.length > 0) { + let en = enemies[Math.floor(KDRandom() * enemies.length)]; + if (KDHostile(en) && KinkyDungeonAggressive(en) && !KDHelpless(en) && en.hp > 0) { + let damage = (KinkyDungeonPlayerDamage?.damage || 1) * e.power; + KinkyDungeonDamageEnemy(en, { + type: KinkyDungeonPlayerDamage?.type || "slash", + damage: damage, + time: e.time, + bind: e.bind, + bindType: KinkyDungeonPlayerDamage?.bindType, + crit: KinkyDungeonPlayerDamage?.crit || KDDefaultCrit, + bindcrit: KinkyDungeonPlayerDamage?.bindcrit || KDDefaultBindCrit, + }, false, true, undefined, undefined, player); + if (KDGameData.Offhand && KinkyDungeonInventoryGet(KDGameData.Offhand) && KDCanOffhand(KinkyDungeonInventoryGet(KDGameData.Offhand))) { + let weapon = KDWeapon(KinkyDungeonInventoryGet(KDGameData.Offhand)); + if (weapon?.light) { + damage = (weapon?.damage || 1) * e.mult; + KinkyDungeonDamageEnemy(en, { + type: weapon?.type || "slash", + damage: damage, + time: e.time, + bind: e.bind, + bindType: weapon?.bindType, + crit: weapon?.crit || KDDefaultCrit, + bindcrit: weapon?.bindcrit || KDDefaultBindCrit, + }, false, true, undefined, undefined, player); + } + } + } + enemies.splice(enemies.indexOf(en), 1); + } + } + } + }, + "FlashPortal": (_e, _b, _data) => { + let player = KinkyDungeonPlayerEntity; + if (player) { + let enemies = KDMapData.Entities.filter((en) => { + return en.buffs?.FlashPortal?.duration > 0; + }); + + while (enemies.length > 0) { + let en = enemies[Math.floor(KDRandom() * enemies.length)]; + let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, false, true); + if (point) { + let tdata = { + x: point.x, + y: point.y, + cancel: false, + entity: en, + willing: false, + }; + KinkyDungeonSendEvent("beforeTeleport", tdata); + + if (!tdata.cancel) { + KDMoveEntity(en, point.x, point.y, false, false, true); + KinkyDungeonRemoveBuffsWithTag(en, ["displaceend"]); + } + } + enemies.splice(enemies.indexOf(en), 1); + } + } + }, + "TransportationPortal": (_e, _b, _data) => { + let player = KinkyDungeonPlayerEntity; + if (player) { + let enemies = KDMapData.Entities.filter((en) => { + return en.buffs?.TransportationPortal?.duration > 0; + }); + + while (enemies.length > 0) { + let en = enemies[Math.floor(KDRandom() * enemies.length)]; + let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, false, true); + if (point) { + let tdata = { + x: point.x, + y: point.y, + cancel: false, + entity: en, + willing: false, + }; + KinkyDungeonSendEvent("beforeTeleport", tdata); + if (tdata.cancel) { + KDMoveEntity(en, point.x, point.y, false, false, true); + en.teleporting = Math.max(en.teleporting || 0, 4); + en.teleportingmax = Math.max(en.teleportingmax || 0, 4); + KinkyDungeonRemoveBuffsWithTag(en, ["displaceend"]); + } + } + enemies.splice(enemies.indexOf(en), 1); + } + } + }, + "BanishPortal": (_e, b, _data) => { + let player = b; + if (player) { + let enemies = KDMapData.Entities.filter((en) => { + return en.buffs?.BanishPortal?.duration > 0; + }); + + while (enemies.length > 0) { + let en = enemies[Math.floor(KDRandom() * enemies.length)]; + let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, false, true); + if (point) { + let tdata = { + x: point.x, + y: point.y, + cancel: false, + entity: en, + willing: false, + }; + KinkyDungeonSendEvent("beforeTeleport", tdata); + if (tdata.cancel) { + KDMoveEntity(en, point.x, point.y, false, false, true); + en.teleporting = Math.max(en.teleporting || 0, 1); + en.teleportingmax = Math.max(en.teleportingmax || 0, 1); + KinkyDungeonRemoveBuffsWithTag(en, ["displaceend"]); + } + } + enemies.splice(enemies.indexOf(en), 1); + } + } + }, + }, + "bulletAfterTick": { + "RubberMissileHoming": (e, b, data) => { + if (data.delta > 0 && b.bullet.targetX != undefined && b.bullet.targetY != undefined) { + // Scan for targets near the target location + if (b.bullet.faction && !(e.kind == "dumb")) { + let minDist = 1000; + let entity = null; + let playerDist = 1000; + if (KDFactionHostile(b.bullet.faction, "Player")) { + playerDist = KDistEuclidean(KDPlayer().x - b.bullet.targetX, KDPlayer().y - b.bullet.targetY); + if (playerDist <= e.dist) { + entity = KDPlayer(); + minDist = playerDist; + } + } + + let enemies = KDNearbyEnemies(b.bullet.targetX, b.bullet.targetY, e.dist); + for (let en of enemies) { + if (!KDHelpless(en) && KDFactionHostile(b.bullet.faction, en)) { + playerDist = KDistEuclidean(en.x - b.bullet.targetX, en.y - b.bullet.targetY); + if (playerDist < minDist) { + entity = en; + minDist = playerDist; + } + } + } + if (entity) { + // Move the missile's target location toward it + if (b.bullet.targetX > entity.x) { + b.bullet.targetX = Math.max(entity.x, b.bullet.targetX - data.delta * e.power); + } else if (b.bullet.targetX < entity.x) { + b.bullet.targetX = Math.min(entity.x, b.bullet.targetX + data.delta * e.power); + } + if (b.bullet.targetY > entity.y) { + b.bullet.targetY = Math.max(entity.y, b.bullet.targetY - data.delta * e.power); + } else if (b.bullet.targetY < entity.y) { + b.bullet.targetY = Math.min(entity.y, b.bullet.targetY + data.delta * e.power); + } + } + } + let speed = KDistEuclidean(b.vx, b.vy); + + // Missile tracking + let direction = Math.atan2(b.bullet.targetY - b.y, b.bullet.targetX - b.x); + let vx = Math.cos(direction) * Math.max(e.power, speed); + let vy = Math.sin(direction) * Math.max(e.power, speed); + let vxx = b.vx; + let vyy = b.vy; + if (b.vx > vx) vxx = Math.max(vx, b.vx - data.delta * e.power); + else if (b.vx < vx) vxx = Math.min(vx, b.vx + data.delta * e.power); + if (b.vy > vy) vyy = Math.max(vy, b.vy - data.delta * e.power); + else if (b.vy < vy) vyy = Math.min(vy, b.vy + data.delta * e.power); + + if (!e.limit || KDistEuclidean(vxx, vyy) >= e.limit) { + b.vx = vxx; + b.vy = vyy; + } + + // Accelerate the missile + if (e.count) { + speed = KDistEuclidean(b.vx, b.vy); + speed += e.count; + } + direction = Math.atan2(b.vy, b.vx); + b.vx = Math.cos(direction) * speed; + b.vy = Math.sin(direction) * speed; + } + }, + } +}; + +/** + * @param Event + * @param e + * @param b + * @param data + */ +function KinkyDungeonHandleBulletEvent(Event: string, e: KinkyDungeonEvent, b: any, data: any) { + if (Event === e.trigger && b.bullet && KDEventMapBullet[e.dynamic ? "dynamic" : Event] && KDEventMapBullet[e.dynamic ? "dynamic" : Event][e.type]) { + if (KDCheckCondition(e, data)) + KDEventMapBullet[e.dynamic ? "dynamic" : Event][e.type](e, b, data); + } +} + + + + +let KDEventMapEnemy: Record void>> = { + "orgasm": { + "HolyOrbPunish": (e, enemy, _data) => { + // We heal nearby allies and self + if (KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < e.dist) { + let restraint = KinkyDungeonGetRestraint({ tags: ["divinebelt"] }, MiniGameKinkyDungeonLevel, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, ""); + if (!restraint) restraint = KinkyDungeonGetRestraint({ tags: ["divinebra"] }, MiniGameKinkyDungeonLevel, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, ""); + if (restraint) { + KinkyDungeonAddRestraintIfWeaker( + restraint, + 20, + true, + undefined, + true, + false, + undefined, + "Angel", + true, + undefined, + ); + KinkyDungeonSendTextMessage(10, TextGet("KDHolyOrbPunish"), "#ffff88", 10); + } + } + }, + }, + "enemyMove": { + "damageOnMove": (e, enemy, data) => { + if (enemy == data.enemy) + KinkyDungeonDamageEnemy(enemy, { damage: enemy.Enemy.maxhp * e.mult + e.power, type: "crush" }, false, true, undefined, undefined, undefined); + }, + "removeIfRobot": (_e, enemy, data) => { + if (data.enemy?.Enemy.tags?.robot && KDistChebyshev(data.enemy.x - enemy.x, data.enemy.y - enemy.y) < 1.5) { + enemy.hp = 0; + } + }, + }, + "passout": { + "delete": (e, enemy, _data) => { + if (!e.chance || KDRandom() < e.chance) + enemy.hp = 0; + } + }, + "defeat": { + "delete": (e, enemy, _data) => { + if (!e.chance || KDRandom() < e.chance) + enemy.hp = 0; + } + }, + "enemyCast": { + "RandomRespawn": (e, enemy, data) => { + if (data.enemy == enemy && KDMapData.Entities.length < 300 && (!e.chance || KDRandom() < e.chance)) { + let point = KinkyDungeonGetRandomEnemyPoint(true, false, undefined, 10, 10); + if (point) { + let ee = DialogueCreateEnemy(point.x, point.y, enemy.Enemy.name); + ee.faction = enemy.faction; + } + } + }, + "DelayedJump": (e, enemy, data) => { + if (data.enemy == enemy) { + let point = {x: data.tx, y: data.ty}; + if (point.x && point.y) { + KinkyDungeonApplyBuffToEntity(enemy, { + type: "Event", + id: "DelayedJump", + duration: 0, + x: point.x, + y: point.y, + tags: ["displaceend"], + events: [ + {trigger: "expireBuff", type: "TeleportHostUnlessStunned"} + ] + }) + } + } + }, + + }, + "calcManaPool": { + "PetManaRegen": (e, enemy, data) => { + if (KDAllied(enemy) && KDistChebyshev(enemy.x - data.player.x, enemy.y - data.player.y) < e.dist) { + data.manaPoolRegen += e.power; + } + }, + }, + "tick": { + + "FuukaManagement": (e, enemy, _data) => { + if (enemy.hostile && !KDGameData.Collection[enemy.id + ""] && !KDEnemyHasFlag(enemy, "fuukaPillars")) { + KinkyDungeonSetEnemyFlag(enemy, "fuukaPillars", -1); + for (let i = 0; i < e.count; i++) { + let point = KinkyDungeonGetRandomEnemyPointCriteria((x: number, y: number) => { + return KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(x, y)); + }, true, false, undefined, undefined, 6, false); + if (point) { + DialogueCreateEnemy(point.x, point.y, "FuukaPillar"); + } + } + } + }, + "WardenManagement": (e, enemy, _data) => { + if (enemy.hostile && !KDGameData.Collection[enemy.id + ""]) { + KDMakeHostile(enemy, KDMaxAlertTimerAggro); + + + for (let en of KDMapData.Entities) { + if (en.Enemy?.tags?.wardenprisoner && !KDEnemyHasFlag(en, "imprisoned")) { + // Direct enemies toward the player + if (!en.aware && enemy.aware) { + en.gx = KinkyDungeonPlayerEntity.x; + en.gy = KinkyDungeonPlayerEntity.y; + KDMakeHostile(en, KDMaxAlertTimerAggro); + } + } + + } + } + if (enemy.hostile && !KDGameData.Collection[enemy.id + ""] && !KDEnemyHasFlag(enemy, "wardenReleasedPrisoners")) { + KinkyDungeonSetEnemyFlag(enemy, "wardenReleasedPrisoners", -1); + let count = 0; + for (let en of KDMapData.Entities) { + if (en.Enemy?.tags?.wardenprisoner && !KDEnemyHasFlag(en, "imprisoned")) { + count += 1; + } + } + if (count < e.count || (KinkyDungeonNewGame > 0 && count < 3)) { + let filter = ""; + if (e.count == 1 && !(KinkyDungeonNewGame > 0)) { + let rand = []; + if (KinkyDungeonStatManaMax >= 20) { + rand.push("WardenMage"); + } + if (KinkyDungeonStatStaminaMax >= 20) { + rand.push("WardenArcher"); + } + if (KinkyDungeonStatWillMax >= 20) { + rand.push("WardenFighter"); + } + + if (rand.length == 0) rand = ["WardenMage", "WardenFighter", "WardenArcher"]; + filter = CommonRandomItemFromList("", rand); + } + for (let en of KDMapData.Entities) { + if (en.Enemy?.tags?.wardenprisoner) { + if (count < e.count) { + if ((!filter || en.Enemy?.name == filter) && KDEnemyHasFlag(en, "imprisoned")) { + KDFreeNPC(en); + en.aware = true; + en.vp = 4; + en.gx = KinkyDungeonPlayerEntity.x; + en.gy = KinkyDungeonPlayerEntity.y; + count += 1; + } + } + } + + } + } + } + }, + "TimeGhostDecay": (e, enemy, data) => { + if (!KinkyDungeonFlags.get("TimeSlow")) { + enemy.hp -= data.delta * e.power; + } + }, + "AdventurerAssignFaction": (e, enemy, _data) => { + if (!enemy.faction) { + let nearbyEnemies = KDNearbyEnemies(enemy.x, enemy.y, e.dist); + for (let en of nearbyEnemies) { + if (e.tags.includes(KDGetFaction(en))) { + enemy.faction = KDGetFaction(en); + break; + } + } + if (!enemy.faction) enemy.faction = "Adventurer"; + } + }, + "BossAssignFaction": (e, enemy, _data) => { + if (!enemy.faction && !KDGameData.Collection[enemy.id + ""] && !KinkyDungeonIsDisabled(enemy) && KDBoundEffects(enemy) < 4) { + if (enemy.hostile || KDMapData.Entities.some((en) => { return en.Enemy.tags?.stageBoss && en.hostile; })) enemy.faction = e.kind; + } + }, + "DeleteCurse": (e, enemy, data) => { + if (!KDCheckPrereq(undefined, "AlreadyCursed", e, data)) { + enemy.hp = 0; + let suff = "NoCurse"; + if (KinkyDungeonPlayerTags.get("Cursed") + || (e.tags && !KinkyDungeonGetRestraint({ tags: [...e.tags], }, + MiniGameKinkyDungeonLevel, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, "")) + ) suff = "Invalid"; + KinkyDungeonSendTextMessage(5, TextGet("KDEpicenterAbort" + suff + "_" + enemy.Enemy.name), "#9074ab", 10); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Fwoosh.ogg", enemy); + } + }, + + "LeashWolfgirls": (e, enemy, _data) => { + if (KDRandom() > (e.chance || 1)) return; + if (!enemy.idle && KDistChebyshev(enemy.x - enemy.gx, enemy.y - enemy.gy) > 1.5) return; + if (KDEntityHasFlag(enemy, "tooManyLeash")) return; + let enemies = KDNearbyEnemies(enemy.x, enemy.y, e.dist); + let dd = 0; + let count = KDGetLeashedToCount(enemy); + if (count < (e.count || 3)) { + for (let en of enemies) { + if (KDGetFaction(en) == KDGetFaction(enemy) && en.Enemy?.tags?.submissive && en.Enemy?.tags?.minor) { + dd = KDistChebyshev(enemy.x - en.x, enemy.y - en.y); + if (dd < e.dist) { + if (dd < 1.5) { + // Attach leash + KinkyDungeonAttachTetherToEntity(e.dist, enemy, en, "WolfgirlLeash", "#00ff00", 2); + } + else { + // Move toward + enemy.gx = en.x; + enemy.gy = en.y; + } + } + } + } + } else { + KinkyDungeonSetEnemyFlag(enemy, "tooManyLeash"); + } + }, + "DisplayAura": (e, enemy, _data) => { + let enemies = KDNearbyEnemies(enemy.x, enemy.y, e.dist, enemy); + for (let en of enemies) { + KinkyDungeonApplyBuffToEntity(en, KDDollDebuff); + KinkyDungeonApplyBuffToEntity(en, KDDollDebuff2); + } + }, + "suicideWhenBound": (_e, enemy, _data) => { + if (KDHelpless(enemy)) { + enemy.hp = 0; + } + }, + "secretToy": (_e, enemy, _data) => { + if (enemy.hp > 0) { + KinkyDungeonApplyBuffToEntity(enemy, KDToySecret); + } + }, + }, + + "kill": { + MaidKnights: (_e, enemy, data) => { + if (enemy != data.enemy) { + let npc = KDGetPersistentNPC(enemy.id); + if (data.enemy.id == npc?.data?.MaidKnightLightID + || data.enemy.id == npc?.data?.MaidKnightHeavyID + ) { + // Retreat! + if (KinkyDungeonVisionGet(enemy.x, enemy.y) > 0.1) { + KinkyDungeonSendTextMessage(10, TextGet("KDMaidKnightRetreat") + .replace("EnemyName", TextGet("Name" + data.enemy.Enemy?.name)), + "#ffffff", 7); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Miss.ogg", undefined); + + } + KDFreeNPC(enemy); + let enType = KinkyDungeonGetEnemyByName(enemy.Enemy?.name); + enemy.hp = enType.maxhp; + enemy.specialBoundLevel = {}; + enemy.boundLevel = 0; + KDDespawnEnemy(enemy, undefined, KDMapData); + } + } + }, + }, + "enemyKnockdown": { + MaidKnights: (_e, enemy, data) => { + if (enemy != data.enemy) { + let npc = KDGetPersistentNPC(enemy.id); + if (data.enemy.id == npc?.data?.MaidKnightLightID + || data.enemy.id == npc?.data?.MaidKnightHeavyID + ) { + // Retreat! + if (KinkyDungeonVisionGet(enemy.x, enemy.y) > 0.1) { + KinkyDungeonSendTextMessage(10, TextGet( + KDBoundEffects(enemy) > 3 ? "KDMaidKnightRetreatBound" + : "KDMaidKnightRetreat") + .replace("EnemyName", TextGet("Name" + data.enemy.Enemy?.name)), + "#ffffff", 7); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Miss.ogg", undefined); + + } + KDFreeNPC(enemy); + let enType = KinkyDungeonGetEnemyByName(enemy.Enemy?.name); + enemy.hp = enType.maxhp; + enemy.specialBoundLevel = {}; + enemy.boundLevel = 0; + KDDespawnEnemy(enemy, undefined, KDMapData); + } + } + }, + }, + "tickAfter": { + "MaidKnightFollow": (_e, enemy, _data) => { + if (!KDEnemyHasFlag(enemy, "followMK") && !KDEnemyHasFlag(enemy, "overrideMove") + && !KDIsInPartyID(enemy.id)) { + KinkyDungeonSetEnemyFlag(enemy, "followMK", 10); + let npc = KDGetPersistentNPC(enemy.id); + if (npc.data?.MaidKnightHeavyID) { + let target = KinkyDungeonFindID(npc.data.MaidKnightHeavyID); + if (target) { + if (!enemy.partyLeader) { + // Add to party if not already + KDChangeParty(enemy.id, target.id); + } + let point = KinkyDungeonGetNearbyPoint(target.x, target.y, true); + if (point) { + enemy.gx = point.x; + enemy.gy = point.y; + } else { + enemy.gx = target.x; + enemy.gy = target.y; + } + } + } + + } + }, + "WeaponEquip": (_e, enemy, _data) => { + if (enemy.aware && KinkyDungeonAggressive(enemy, KDPlayer())) { + KinkyDungeonApplyBuffToEntity(enemy, KDEquip); + } + }, + "EpicenterAssignHP": (_e, enemy, _data) => { + if (!KDEnemyHasFlag(enemy, "assignedHP")) { + let factor = 0.1 + 0.1 * Math.round(19 * (KDGameData.EpicenterLevel || 1) ** 0.75) / (KinkyDungeonMaxLevel - 1); + + if (!KDGameData.EpicenterLevel) KDGameData.EpicenterLevel = 0; + KDGameData.EpicenterLevel += 1; + + enemy.Enemy = JSON.parse(JSON.stringify(enemy.Enemy)); + enemy.Enemy.spellCooldownMult = enemy.Enemy.spellCooldownMult * (1 / (1 + factor)); + enemy.Enemy.maxhp = enemy.Enemy.maxhp * factor; + enemy.hp = enemy.Enemy.maxhp; + enemy.modified = true; + + KinkyDungeonSetEnemyFlag(enemy, "assignedHP", -1); + } + }, + }, + "getLights": { + "enemyTorch": (e, enemy, data) => { + data.lights.push({ + brightness: e.power, x: enemy.x, y: enemy.y, + visualxoffset: 0.25 * (enemy.fx - enemy.x) || 0, + visualyoffset: 0.25 * (enemy.fy - enemy.y) || 0, + color: string2hex(e.color || "#ffffff") + }); + }, + }, + "getCustomDefeat": { + MaidKnights: (_e, enemy, data) => { + if (enemy == data.enemy) { + // Frees the other one if they defeat you + let npc = KDGetPersistentNPC(enemy.id); + if (data.enemy.id == npc?.data?.MaidKnightLightID + || data.enemy.id == npc?.data?.MaidKnightHeavyID + ) { + let id = 0; + if (KDGameData.Collection[npc.data.MaidKnightLightID]) { + id = npc.data.MaidKnightLightID; + } else if (KDGameData.Collection[npc.data.MaidKnightHeavyID]) { + id = npc.data.MaidKnightHeavyID; + } + + if (id) { + delete KDGameData.Collection[id]; + KDGetPersistentNPC(id).collect = false; + KDGetPersistentNPC(id).captured = false; + KDMovePersistentNPC(id, KDGetCurrentLocation()); + KDFreeNPCID(id); + } + } + } + } + }, + "beforeDamage": { + + "dragonLairDefeat": (_e, enemy, data) => { + if (data.enemy == enemy && data.target == KinkyDungeonPlayerEntity && data.restraintsAdded && data.restraintsAdded.length == 0) { + if (data.enemy == enemy && data.target == KinkyDungeonPlayerEntity && data.restraintsAdded && data.restraintsAdded.length == 0) { + KDTripleBuffKill("DragonLairDefeat", KinkyDungeonPlayerEntity, 30, (_tt) => { + KinkyDungeonSetFlag("dragonIgnore", 45); + if (KDGetAltType(MiniGameKinkyDungeonLevel)?.name != "DragonLair") { + AIData.defeat = true; + KDCustomDefeat = "DragonLair"; + KDCustomDefeatEnemy = enemy; + } else { + KinkyDungeonPassOut(); + KDAddDefeatRestraints(enemy, true); + } + }, "Blindness", + (_target) => { + // Just in case + KDCreateDragonLair(enemy, "DragonLair", + KDGetWorldMapLocation( + KDCoordToPoint(enemy.homeCoord || KDGetCurrentLocation()) + )); + }); + } + } + }, + "shadowEngulf": (_e, enemy, data) => { + if (data.enemy == enemy && data.target == KinkyDungeonPlayerEntity && data.restraintsAdded && data.restraintsAdded.length == 0 && !KinkyDungeonFlags.get("shadowEngulf")) { + if (data.enemy == enemy && data.target == KinkyDungeonPlayerEntity && data.restraintsAdded && data.restraintsAdded.length == 0 && !KinkyDungeonFlags.get("shadowEngulf")) { + KDTripleBuffKill("ShadowEngulf", KinkyDungeonPlayerEntity, 9, (_tt) => { + if (KDGameData.RoomType != "DemonTransition") { + AIData.defeat = true; + KDCustomDefeat = "DemonTransition"; + KDCustomDefeatEnemy = enemy; + } else { + KinkyDungeonPassOut(); + KDAddDefeatRestraints(enemy, true); + } + }, "Blindness", + (_target) => { + // Create a portal + let point = KinkyDungeonGetNearbyPoint(enemy.x, enemy.y, true); + if (point) { + /** Create the portal */ + KDCreateEffectTile(point.x, point.y, { + name: "Portals/DarkPortal", + }, 0); + } + }); + } + } + }, + "shadowDomme": (_e, enemy, data) => { + let player = KDPlayer(); + if (data.enemy == enemy && data.target == player && data.restraintsAdded && data.restraintsAdded.length == 0 && !KinkyDungeonFlags.get("shadowEngulf")) { + + KDTripleBuffKill("ShadowEngulf", player, 15, (_tt) => { + // Passes out the player, but does NOT teleport + KinkyDungeonPassOut(true); + + KDAddDefeatRestraints(enemy, true); + KDBreakTether(player); + + // Instead it applies a debuff, and leash + KinkyDungeonApplyBuffToEntity(player, + { + id: "ShadowDommed", type: "Flag", duration: 9999, infinite: true, power: 1, maxCount: 1, currentCount: 1, tags: ["attack", "cast"], events: [ + { type: "ShadowDommed", trigger: "tick" }, + ] + } + ); + + if (!KinkyDungeonPlayerTags.get("Collars")) { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("ObsidianCollar"), 0, true, "Purple"); + } + if (!KinkyDungeonGetRestraintItem("ItemNeckRestraints") && KinkyDungeonPlayerTags.get("Collars")) { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BasicLeash"), 0, true, "Purple"); + } + + KinkyDungeonAttachTetherToEntity(3.5, enemy, player); + }, "Blindness"); + } + }, + }, + "death": { + "RandomRespawn": (e, enemy, data) => { + if (data.enemy == enemy && KDMapData.Entities.length < 300 && (!e.chance || KDRandom() < e.chance)) { + let point = KinkyDungeonGetRandomEnemyPoint(true, false, undefined, 10, 10); + if (point) { + let ee = DialogueCreateEnemy(point.x, point.y, enemy.Enemy.name); + ee.faction = enemy.faction; + } + } + }, + "frogDies": (e, enemy, data) => { + if (enemy.Enemy.name == "Conjurer" && data.enemy.Enemy.name == "Frog" && !KinkyDungeonFlags.get("frogDied") + && KDistChebyshev(enemy.x - data.enemy.x, enemy.y - data.enemy.y) < 10 + && (!e.chance || KDRandom() < e.chance) && (!e.prereq || KDPrereqs[e.prereq](enemy, e, data))) { + KinkyDungeonSetFlag("frogDied", 1); + KinkyDungeonSendDialogue(enemy, TextGet("KDConjurerFrogDied_" + (enemy.playLine || "Witch")), KDGetColor(enemy), 6, 10); + } + }, + "createEffectTile": (e, enemy, data) => { + if (enemy == data.enemy && (!e.chance || KDRandom() < e.chance) && (!e.prereq || KDPrereqs[e.prereq](enemy, e, data))) { + let count = e.power ? e.power : 1; + let rad = e.aoe ? e.aoe : 1.5; + let minrad = e.dist; + for (let i = 0; i < count; i++) { + let slots = []; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (Math.sqrt(X * X + Y * Y) <= rad && (!minrad || Math.sqrt(X * X + Y * Y) >= minrad)) { + if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KDMapData.GridWidth && enemy.y + Y < KDMapData.GridHeight) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) + slots.push({ x: X, y: Y }); + } + } + + if (slots.length > 0) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (slot) { + KDCreateEffectTile(enemy.x + slot.x, enemy.y + slot.y, { + name: e.kind, + duration: e.time, + }, e.variance); + } + } + + } + } + }, + }, + "spellCast": { + "ropeKrakenSummonTentacle": (_e, enemy, data) => { + if (enemy == data.enemy && data.spell?.name == "SummonRopeTentacle") { + enemy.hp = Math.max(enemy.hp - enemy.Enemy.maxhp * KDMagicDefs.RopeKraken_TentacleCost, Math.min(enemy.hp, enemy.Enemy.maxhp * KDMagicDefs.RopeKraken_TentacleThreshold)); + } + }, + "slimeKrakenSummonMinion": (_e, enemy, data) => { + if (enemy == data.enemy && data.spell?.name == "SummonSlimeMinion") { + enemy.hp = Math.max(enemy.hp - enemy.Enemy.maxhp * KDMagicDefs.SlimeKraken_TentacleCost, Math.min(enemy.hp, enemy.Enemy.maxhp * KDMagicDefs.SlimeKraken_TentacleThreshold)); + } + }, + "sarcoKrakenSummonTentacle": (_e, enemy, data) => { + if (enemy == data.enemy && data.spell?.name == "SummonSarcoTentacle") { + enemy.hp = Math.max(enemy.hp - enemy.Enemy.maxhp * KDMagicDefs.SarcoKraken_TentacleCost, Math.min(enemy.hp, enemy.Enemy.maxhp * KDMagicDefs.SarcoKraken_TentacleThreshold)); + } + }, + }, + "afterDamageEnemy": { + "spellReflect": (e, enemy, data) => { + if (data.bullet && enemy == data.enemy && KinkyDungeonCanCastSpells(enemy)) { + let attacker = null; + if (data.bullet?.bullet?.source) { + attacker = KinkyDungeonFindID(data.bullet.bullet.source); + } + if (attacker && (!e.time || !KDEnemyHasFlag(enemy, "spellReflect" + e.spell))) { + KinkyDungeonCastSpell(attacker.x, attacker.y, KinkyDungeonFindSpell(e.spell, true), enemy, undefined, undefined); + if (e.time) { + KinkyDungeonSetEnemyFlag(enemy, "spellReflect" + e.spell, e.time); + } + } + } + }, + "FreeWardenPrisoners": (_e, enemy, data) => { + if (enemy == data.enemy && KDEnemyHasFlag(enemy, "imprisoned") && data.faction == "Player") { + for (let en of KDMapData.Entities) { + if (en.Enemy.tags?.warden && KDGetFaction(en) != "Player") { + en.hostile = 300; + en.aware = true; + KDFreeNPC(en); + } + + } + } + }, + "bleedEffectTile": (e, enemy, data) => { + if (data.dmg > 0 && enemy == data.enemy) { + if (!e.chance || KDRandom() < e.chance) { + let count = e.power ? e.power : 1; + let rad = e.aoe ? e.aoe : 1.5; + let minrad = e.dist; + for (let i = 0; i < count; i++) { + let slots = []; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (Math.sqrt(X * X + Y * Y) <= rad && (!minrad || Math.sqrt(X * X + Y * Y) >= minrad)) { + if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KDMapData.GridWidth && enemy.y + Y < KDMapData.GridHeight) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) + slots.push({ x: X, y: Y }); + } + } + + if (slots.length > 0) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (slot) { + KDCreateEffectTile(enemy.x + slot.x, enemy.y + slot.y, { + name: e.kind, + duration: e.duration + }, e.time); + } + } + + } + } + } + }, + "ExplosiveBarrel": (e, enemy, data) => { + if (data.dmg > 0 && ['fire', 'holy', 'electric', 'arcane'].includes(data.type) && enemy == data.enemy) { + if (enemy.hp <= 0.51 || data.dmg >= e.power || !e.chance || KDRandom() < e.chance) { // Sufficient damage blows it up without a roll + if (!KDEnemyHasFlag(enemy, "exploded")) { + enemy.hp = 0; + KinkyDungeonSendTextMessage(6, TextGet("KDExplosiveBarrelExplode"), "#ffaa44", 4); + enemy.summoned = true; // To prevent gunpowder + KinkyDungeonSetEnemyFlag(enemy, "exploded", -1); + + KinkyDungeonCastSpell(enemy.x, enemy.y, KinkyDungeonFindSpell(e.spell, true), enemy, undefined, undefined); + KDRemoveEntity(enemy); + } + } + } + }, + }, + "duringDamageEnemy": { + "damageThreshold": (e, enemy, data) => { + if (enemy == data.enemy && data.dmgDealt < e.power) { + data.dmgDealt = 0; + } + }, + }, + "afterPlayerAttack": { + "spellReflect": (e, enemy, data) => { + if (data.enemy == enemy && data.attacker && KinkyDungeonCanCastSpells(enemy)) { + if (!e.time || !KDEnemyHasFlag(enemy, "spellReflect" + e.spell)) { + KinkyDungeonCastSpell(data.attacker.x, data.attacker.y, KinkyDungeonFindSpell(e.spell, true), enemy, undefined, undefined); + if (e.time) { + KinkyDungeonSetEnemyFlag(enemy, "spellReflect" + e.spell, e.time); + } + } + } + }, + "tauntMsg": (e, enemy, data) => { + if (data.enemy == enemy) { + KinkyDungeonSendDialogue(enemy, TextGet(e.msg + Math.floor(Math.random() * e.power)), KDGetColor(enemy), e.time || 6, 1, true, true); + } + }, + + }, + "hit": { + "spellReflect": (e, enemy, data) => { + if (data.target == enemy && data.attacker && KinkyDungeonCanCastSpells(enemy)) { + if (!e.time || !KDEnemyHasFlag(enemy, "spellReflect" + e.spell)) { + KinkyDungeonCastSpell(data.attacker.x, data.attacker.y, KinkyDungeonFindSpell(e.spell, true), enemy, undefined, undefined); + if (e.time) { + KinkyDungeonSetEnemyFlag(enemy, "spellReflect" + e.spell, e.time); + } + } + } + } + }, + "afterEnemyTick": { + //{trigger: "afterEnemyTick", type: "requireNearbyEnemyTag", power: 1.25, dist: 3.5, tags: ["air"]}, + "requireNearbyEnemyTag": (e, enemy, data) => { + if (data.delta && !KDHelpless(enemy) + && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + let nearby = KDNearbyEnemies(enemy.x, enemy.y, e.dist).filter((en) => { + return en.Enemy.tags + && !en.Enemy.tags.nobrain + && !en.Enemy.tags.nosustain + && e.tags.some((tag) => { return en.Enemy.tags[tag] != undefined; }); + }); + if (nearby.length == 0) { + enemy.hp -= e.power * data.delta; + } + } + }, + "breakDownForHumanoid": (e, enemy, data) => { + if (data.delta && !KDHelpless(enemy) + && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + let nearby = KDNearbyEnemies(enemy.x, enemy.y, e.dist).filter((en) => { + return !KDHelpless(en) + && KDIsHumanoid(en); + }); + if (nearby.length > 0) { + enemy.hp -= e.power * data.delta; + } + } + }, + "breakDownForDragonQueen": (e, enemy, data) => { + if (data.delta && !KDHelpless(enemy) + && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + let nearby = KDNearbyEnemies(enemy.x, enemy.y, e.dist).filter((en) => { + return !KDHelpless(en) + && en.Enemy.tags?.dragonqueen; + }); + if (nearby.length > 0) { + enemy.hp -= e.power * data.delta; + } + } + }, + + + "ShopkeeperRescueAI": (e, enemy, data) => { + // We heal nearby allies and self + let player = KDPlayer(); + if (data.delta && !KDHelpless(enemy) && !KinkyDungeonIsDisabled(enemy) && KDEnemyHasFlag(enemy, "RescuingPlayer") + && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + KinkyDungeonSetEnemyFlag(enemy, "failpath", 0); + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + KinkyDungeonSetEnemyFlag(enemy, "longPath", 3); + if (!e.chance || KDRandom() < e.chance) { + if (!KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + // Apply eager buff to make the shopkeeper fast + KinkyDungeonApplyBuffToEntity(enemy, KDEager); + // Go to leash the player + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5) { + // Attach leash + let newAdd = KinkyDungeonGetRestraint({ tags: ["leashing"] }, 0, 'grv'); + if (newAdd) { + KinkyDungeonAddRestraintIfWeaker(newAdd, 0, true, undefined, false, false, undefined, "Prisoner"); + } + if (KinkyDungeonAttachTetherToEntity(2.5, enemy, player)) { + KinkyDungeonSendTextMessage(9, TextGet("KDShopkeeperLeash"), "#ffffff", 4); + } + } + } else { + KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 3); + // Drag the player to the start position + enemy.gx = KDMapData.StartPosition.x; + enemy.gy = KDMapData.StartPosition.y; + if (KDistChebyshev(enemy.x - KDMapData.StartPosition.x, enemy.y - KDMapData.StartPosition.y) < 1.5 + && KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 2.5) { + AIData.defeat = true; + KDCustomDefeat = "ShopkeeperRescue"; + KDCustomDefeatEnemy = enemy; + } + } + } + } + }, + "dollmakerMissiles": (e, enemy, data) => { + if (data.delta && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let player = KinkyDungeonPlayerEntity; + if (!KDHelpless(enemy) && !KDEnemyHasFlag(enemy, "dollmakerMissiles") && enemy.aware && KDHostile(enemy) && KDistEuclidean(enemy.x - player.x, enemy.y - player.y) > 2.5) { + let origins = [ + { x: player.x + e.dist, y: player.y }, + { x: player.x - e.dist, y: player.y }, + { x: player.x, y: player.y + e.dist }, + { x: player.x, y: player.y - e.dist }, + { x: player.x + e.dist, y: player.y + e.dist }, + { x: player.x + e.dist, y: player.y - e.dist }, + { x: player.x - e.dist, y: player.y + e.dist }, + { x: player.x - e.dist, y: player.y - e.dist }, + { x: player.x + e.dist, y: player.y + e.dist / 2 }, + { x: player.x + e.dist, y: player.y - e.dist / 2 }, + { x: player.x - e.dist, y: player.y + e.dist / 2 }, + { x: player.x - e.dist, y: player.y - e.dist / 2 }, + { x: player.x + e.dist / 2, y: player.y + e.dist }, + { x: player.x + e.dist / 2, y: player.y - e.dist }, + { x: player.x - e.dist / 2, y: player.y + e.dist }, + { x: player.x - e.dist / 2, y: player.y - e.dist }, + ]; + + + origins = origins.filter((origin) => { + return KinkyDungeonNoEnemy(origin.x, origin.y) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(origin.x, origin.y)) + && KinkyDungeonCheckPath(origin.x, origin.y, player.x, player.y, true, false, 1); + }); + let finalorigin = []; + for (let i = 0; i < e.count; i++) { + let index = Math.floor(KDRandom() * origins.length); + if (origins[index]) { + finalorigin.push(origins[index]); + origins.splice(index, 1); + } + } + for (let origin of finalorigin) { + let spell = KinkyDungeonFindSpell(e.kind, true); + let b = KinkyDungeonLaunchBullet(origin.x, origin.y, + player.x, player.y, + 0.5, { + noSprite: spell.noSprite, faction: "Ambush", name: spell.name, block: spell.block, volatile: spell.volatile, blockType: spell.blockType, + volatilehit: spell.volatilehit, + width: spell.size, height: spell.size, summon: spell.summon, + targetX: player.x, targetY: player.y, cast: Object.assign({}, spell.spellcast), + source: enemy.id, dot: spell.dot, + bulletColor: spell.bulletColor, bulletLight: spell.bulletLight, + bulletSpin: spell.bulletSpin, + effectTile: spell.effectTile, effectTileDurationMod: spell.effectTileDurationMod, + effectTileTrail: spell.effectTileTrail, effectTileDurationModTrail: spell.effectTileDurationModTrail, effectTileTrailAoE: spell.effectTileTrailAoE, + passthrough: spell.noTerrainHit, noEnemyCollision: spell.noEnemyCollision, alwaysCollideTags: spell.alwaysCollideTags, nonVolatile: spell.nonVolatile, noDoubleHit: spell.noDoubleHit, + pierceEnemies: spell.pierceEnemies, piercing: spell.piercing, events: spell.events, + lifetime: (spell.bulletLifetime ? spell.bulletLifetime : 1000), origin: { x: origin.x, y: origin.y }, range: KDGetSpellRange(spell), hit: spell.onhit, + damage: { + evadeable: spell.evadeable, noblock: spell.noblock, + ignoreshield: spell?.ignoreshield, + shield_crit: spell?.shield_crit, // Crit thru shield + shield_stun: spell?.shield_stun, // stun thru shield + shield_freeze: spell?.shield_freeze, // freeze thru shield + shield_bind: spell?.shield_bind, // bind thru shield + shield_snare: spell?.shield_snare, // snare thru shield + shield_slow: spell?.shield_slow, // slow thru shield + shield_distract: spell?.shield_distract, // Distract thru shield + shield_vuln: spell?.shield_vuln, // Vuln thru shield + damage: spell.power, type: spell.damage, distract: spell.distract, distractEff: spell.distractEff, desireMult: spell.desireMult, bindEff: spell.bindEff, bind: spell.bind, bindType: spell.bindType, boundBonus: spell.boundBonus, time: spell.time, flags: spell.damageFlags + }, + spell: spell + }, false, enemy.x, enemy.y); + b.visual_x = origin.x; + b.visual_y = origin.y; + let dist = KDistEuclidean(player.x - origin.x, player.y - origin.y); + b.vy = 0.5 * (player.y - origin.y) / dist; + b.vx = 0.5 * (player.x - origin.x) / dist; + } + + if (finalorigin.length > 0) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Missile.ogg", enemy); + KinkyDungeonSetEnemyFlag(enemy, "dollmakerMissiles", e.time); + } + + + } + } + } + }, + "nurseAura": (e, enemy, data) => { + // We heal nearby allies and self + if (data.delta && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let nearby = KDNearbyNeutrals(enemy.x, enemy.y, e.dist, enemy); + for (let en of nearby) { + if (en.hp > 0.52) en.hp = Math.min(en.hp + e.power, en.Enemy.maxhp); + } + } + } + }, + "DragonRegen": (e, enemy, data) => { + // We heal nearby allies and self + if (data.delta && !KDHelpless(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (KinkyDungeonPlayerTags.get("Furniture")) { + enemy.hp = Math.min(enemy.hp + e.power, enemy.Enemy.maxhp); + } + } + }, + + "NatureSpiritAura": (e, enemy, data) => { + // We heal nearby allies and self + if (data.delta && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let nearby = KDNearbyEnemies(enemy.x, enemy.y, e.dist); + for (let en of nearby) { + if (KDFactionRelation(KDGetFaction(en), KDGetFaction(enemy)) > 0.05) + if (((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy))) && en.hp > 0.52) en.hp = Math.min(en.hp + e.power, en.Enemy.maxhp); + } + } + let player = KinkyDungeonPlayerEntity; + if (player.player && data.allied && KDistEuclidean(enemy.x - player.x, enemy.y - player.y) < e.dist) { + KDChangeStamina("nature", "aura", "tick", e.power * e.mult, true, 0); + } + } + }, + + + "HolyOrbAura": (e, enemy, data) => { + // We heal nearby allies and self + if (data.delta && KinkyDungeonCanCastSpells(enemy) + && enemy.hp > 0 + && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let nearby = KDNearbyEnemies(enemy.x, enemy.y, e.dist); + for (let en of nearby) { + if (en == enemy || en.Enemy.name != "HolyOrb") { + if (((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy))) && en.hp > 0.52) en.hp = Math.min(en.hp + e.power, en.Enemy.maxhp); + } else { + en.hp = Math.max(en.hp - e.power, 0); + } + } + } + } + }, + + "shadowDebuff": (_e, enemy, data) => { + // We heal nearby allies and self + if (((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + let light = KinkyDungeonBrightnessGet(enemy.x, enemy.y); + if (light >= 4.5) { + KinkyDungeonApplyBuffToEntity(enemy, { id: "ShadowDebuff1", aura: "#ff5277", type: "MoveSpeed", duration: 1, power: -0.7, tags: ["speed"] }); + KinkyDungeonApplyBuffToEntity(enemy, { id: "ShadowDebuff2", aura: "#ff5277", type: "AttackSpeed", duration: 1, power: -0.5, tags: ["speed"] }); + } else if (light > 3) { + KinkyDungeonApplyBuffToEntity(enemy, { id: "ShadowDebuff1", aura: "#ff5277", type: "MoveSpeed", duration: 1, power: -0.4, tags: ["speed"] }); + } + } + }, + "shadowDommeRefresh": (_e, enemy, _data) => { + if (KinkyDungeonFlags.get("ShadowDommed")) { + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + } + }, + "DroneNodeAura": (e, enemy, data) => { + // We apply a buff to nearby allies, but not self + if (data.delta && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let nearby = KDNearbyNeutrals(enemy.x, enemy.y, e.dist, enemy); + for (let en of nearby) { + if (en.hp > 0.52 && KDMatchTags(["drone"], en)) { + if ((en.Enemy.shield || 0) < e.power) { + KinkyDungeonApplyBuffToEntity(en, { + id: "DroneNodeShield", + aura: "#00ffff", aurasprite: "EnergyShield", + type: "MaxShield", + duration: 3, power: e.power - (en.Enemy.shield || 0), + player: false, enemies: true, tags: ["defense", "shield"] + }); + } + KinkyDungeonApplyBuffToEntity(en, { + id: "DroneNodeShieldRegen", type: "ShieldRegenBG", duration: 3, + power: e.power * e.mult, player: false, enemies: true, tags: ["defense", "shield"] + }); + KinkyDungeonApplyBuffToEntity(en, { + id: "DroneNodeSpeedBuff", type: "MoveSpeed", duration: 3, + power: 0.5, player: false, enemies: true, tags: ["speed"] + }); + } + } + } + } + }, + "wolfShieldDroneAura": (e, enemy, data) => { + // We apply a buff to nearby allies, but not self + if (data.delta && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let nearby = KDNearbyNeutrals(enemy.x, enemy.y, e.dist, enemy); + for (let en of nearby) { + if (en.hp > 0.52 && KDMatchTags(["nevermere", "wolfgirl", "alchemist", "dressmaker", "bountyhunter"], en)) { + if ((en.Enemy.shield || 0) < e.power) { + KinkyDungeonApplyBuffToEntity(en, { + id: "WolfDroneShield", + aura: "#00ffff", aurasprite: "EnergyShield", + type: "MaxShield", + duration: 3, power: e.power - (en.Enemy.shield || 0), + player: false, enemies: true, tags: ["defense", "shield"] + }); + } + KinkyDungeonApplyBuffToEntity(en, { + id: "WolfDroneShieldRegen", type: "ShieldRegenBG", duration: 3, + power: e.power * e.mult, player: false, enemies: true, tags: ["defense", "shield"] + }); + } + } + } + } + }, + "maidforceHeadAura": (e, enemy, data) => { + // We apply a buff to nearby allies, but not self + if (data.delta && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy))) + && KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 2.5) { + if (!e.chance || KDRandom() < e.chance) { + if (enemy.aware && KinkyDungeonAggressive(enemy) && (KDPlayerIsStunned())) { + KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, "charm", { name: "MaidChastity", power: 2, damage: "charm" }); + } + } + } + }, + "bubbleBarrier": (e, enemy, data) => { + if (data.delta && (enemy.aware || enemy.vp > 0.5 || e.always) && (e.always || KDNearbyEnemies(enemy.x, enemy.y, 1.5, enemy).length > 0 || KinkyDungeonAggressive(enemy)) && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let count = e.power ? e.power : 1; + let rad = e.aoe ? e.aoe : 1.5; + let minrad = 0.5; + for (let i = 0; i < count; i++) { + let slots = []; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (Math.sqrt(X * X + Y * Y) <= rad && (!minrad || Math.sqrt(X * X + Y * Y) >= minrad)) { + if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KDMapData.GridWidth && enemy.y + Y < KDMapData.GridHeight) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) + slots.push({ x: X, y: Y }); + } + } + + if (slots.length > 0) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (slot) { + KinkyDungeonCastSpell(enemy.x + slot.x, enemy.y + slot.y, KinkyDungeonFindSpell("Bubbleexp", true), enemy, undefined, undefined); + } + } + + } + } + } + }, + "electrifyLocal": (e, enemy, data) => { + if (data.delta && (enemy.aware || enemy.vp > 0.5) && (KDNearbyEnemies(enemy.x, enemy.y, 1.5, enemy).length > 0 || KinkyDungeonAggressive(enemy)) && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let count = e.power ? e.power : 1; + let rad = e.aoe ? e.aoe : 1.5; + let minrad = 0.5; + for (let i = 0; i < count; i++) { + let slots = []; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (Math.sqrt(X * X + Y * Y) <= rad && (!minrad || Math.sqrt(X * X + Y * Y) >= minrad)) { + if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KDMapData.GridWidth && enemy.y + Y < KDMapData.GridHeight) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) + slots.push({ x: X, y: Y }); + } + } + + if (slots.length > 0) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (slot) { + KinkyDungeonCastSpell(enemy.x + slot.x, enemy.y + slot.y, KinkyDungeonFindSpell("WitchElectrify", true), enemy, undefined, undefined); + } + } + + } + } + } + }, + "ShadowBubbles": (e, enemy, data) => { + if (e.time && KDEnemyHasFlag(enemy, e.type)) return; + if (data.delta + && (enemy.aware || enemy.vp > 0.5) + && (KDNearbyEnemies(enemy.x, enemy.y, e.dist, enemy).length > 0 || KinkyDungeonAggressive(enemy)) + //&& KinkyDungeonCanCastSpells(enemy) + && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let count = e.power ? e.power : 1; + let rad = e.aoe ? e.aoe : 1.5; + let minrad = 0.5; + let enemies = [...KDNearbyEnemies(enemy.x, enemy.y, e.dist, enemy)]; + if (KinkyDungeonAggressive(enemy) && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) <= e.aoe) { + enemies.unshift(KinkyDungeonPlayerEntity); + } + let currentCount = 0; + for (let en of enemies) { + for (let i = 0; i < count; i++) { + let slots = []; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (Math.sqrt(X * X + Y * Y) <= rad && (!minrad || Math.sqrt(X * X + Y * Y) >= minrad)) { + if ((en.x + X > 0 && en.y + Y > 0 && en.x + X < KDMapData.GridWidth && en.y + Y < KDMapData.GridHeight) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(en.x + X, en.y + Y)) + && KinkyDungeonBrightnessGet(en.x + X, en.y + Y) < KDShadowThreshold * 2 + && KinkyDungeonCheckPath(en.x + X, en.y + Y, en.x, en.y, true, false, 1) + ) + slots.push({ x: X, y: Y }); + } + } + + if (slots.length > 0) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (slot) { + if (e.time) + KinkyDungeonSetEnemyFlag(enemy, e.type, e.time); + KinkyDungeonCastSpell(en.x, en.y, KinkyDungeonFindSpell(e.spell, true), undefined, undefined, undefined, + KDGetFaction(enemy), { + xx: en.x + slot.x, + yy: en.y + slot.y, + } + ); + currentCount += 1; + if (currentCount >= count) return; + } + } + + } + } + + } + } + }, + // Simple spell checkerboard pattern + "spellX": (e, enemy, data) => { + if (data.delta + && (e.always || enemy.aware || enemy.vp > 0.5) + && (e.always || KDNearbyEnemies(enemy.x, enemy.y, 1.5, enemy).length > 0 || KinkyDungeonAggressive(enemy)) + && KinkyDungeonCanCastSpells(enemy) + && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!KDEnemyHasFlag(enemy, e.spell + "spellXCD") && (!e.chance || KDRandom() < e.chance)) { + let slots = []; + if (KDEnemyHasFlag(enemy, e.spell + "spellXAlt")) { + slots = [{ x: -1, y: -1 }, { x: 1, y: -1 }, { x: 1, y: 1 }, { x: -1, y: 1 }]; + KinkyDungeonSetEnemyFlag(enemy, e.spell + "spellXAlt", 0); + } else { + slots = [{ x: -1, y: 0 }, { x: 1, y: 0 }, { x: 0, y: 1 }, { x: 0, y: -1 }]; + KinkyDungeonSetEnemyFlag(enemy, e.spell + "spellXAlt", -1); + } + slots = slots.filter((slot) => { + return (enemy.x + slot.x > 0 && enemy.y + slot.y > 0 && enemy.x + slot.x < KDMapData.GridWidth && enemy.y + slot.y < KDMapData.GridHeight) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + slot.x, enemy.y + slot.y)); + }); + KinkyDungeonSetEnemyFlag(enemy, e.spell + "spellXCD", e.time); + if (slots.length > 0) { + let cnt = 0; + for (let S of slots) { + let slot = e.count ? slots[Math.floor(KDRandom() * slots.length)] : S; + KinkyDungeonCastSpell(enemy.x + slot.x, enemy.y + slot.y, KinkyDungeonFindSpell(e.spell, true), enemy, undefined, undefined); + cnt += 1; + if (cnt >= e.count) break; + } + } + } + } + }, + "createEffectTile": (e, enemy, data) => { + if (data.delta && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let count = e.power ? e.power : 1; + let rad = e.aoe ? e.aoe : 1.5; + let minrad = e.dist; + for (let i = 0; i < count; i++) { + let slots = []; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (Math.sqrt(X * X + Y * Y) <= rad && (!minrad || Math.sqrt(X * X + Y * Y) >= minrad)) { + if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KDMapData.GridWidth && enemy.y + Y < KDMapData.GridHeight) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) + slots.push({ x: X, y: Y }); + } + } + + if (slots.length > 0) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (slot) { + KDCreateEffectTile(enemy.x + slot.x, enemy.y + slot.y, { + name: e.kind, + duration: e.time, + }, e.variance); + } + } + + } + } + } + }, + "createWater": (e, enemy, data) => { + if (data.delta && !(enemy.freeze > 0) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let count = e.power ? e.power : 1; + let rad = e.aoe ? e.aoe : 1.5; + let minrad = e.dist; + for (let i = 0; i < count; i++) { + let slots = []; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (Math.sqrt(X * X + Y * Y) <= rad && (!minrad || Math.sqrt(X * X + Y * Y) >= minrad)) { + if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KDMapData.GridWidth && enemy.y + Y < KDMapData.GridHeight) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) + slots.push({ x: X, y: Y }); + } + } + + if (slots.length > 0) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (slot) { + KDCreateEffectTile(enemy.x + slot.x, enemy.y + slot.y, { + name: "Water", + duration: 12, + }, 8); + } + } + + } + } + } + }, + "createIce": (e, enemy, data) => { + if (data.delta && !(enemy.freeze > 0) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + if (!e.chance || KDRandom() < e.chance) { + let count = e.power ? e.power : 1; + let rad = e.aoe ? e.aoe : 1.5; + let minrad = e.dist; + for (let i = 0; i < count; i++) { + let slots = []; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (Math.sqrt(X * X + Y * Y) <= rad && (!minrad || Math.sqrt(X * X + Y * Y) >= minrad)) { + if ((enemy.x + X > 0 && enemy.y + Y > 0 && enemy.x + X < KDMapData.GridWidth && enemy.y + Y < KDMapData.GridHeight) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(enemy.x + X, enemy.y + Y))) + slots.push({ x: X, y: Y }); + } + } + + if (slots.length > 0) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (slot) { + KDCreateEffectTile(enemy.x + slot.x, enemy.y + slot.y, { + name: "Ice", + duration: 6, + }, 4); + } + } + + } + } + } + }, + "ApplyConductionAoE": (e, enemy, data) => { + if (data.delta > 0 && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + let bb = Object.assign({}, KDConduction); + bb.duration = 1; + let enemies = KDNearbyEnemies(enemy.x, enemy.y, e.aoe); + for (let entity of enemies) { + if (!entity.buffs) entity.buffs = {}; + KinkyDungeonApplyBuffToEntity(entity, bb); + } + if (KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < e.aoe) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, bb); + } + } + }, + "CastSpellNearbyEnemy": (e, enemy, data) => { + if (data.delta > 0 && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { + let enemies = KDNearbyEnemies(enemy.x, enemy.y, e.aoe).filter((enemy2) => { + return (KDHostile(enemy2) || (enemy.x == enemy2.x && enemy.y == enemy2.y && KDFactionRelation(KDGetFaction(enemy2), KDGetFaction(enemy)) < 0.5)); + }); + if (e.player + && KDistEuclidean(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < e.aoe + && KDFactionHostile(KDGetFaction(enemy), "Player")) { + enemies.push(KinkyDungeonPlayerEntity); + } + if (enemies.length > 0) { + let enemy2 = enemies[Math.floor(KDRandom() * enemies.length)]; + KinkyDungeonCastSpell(enemy2.x, enemy2.y, KinkyDungeonFindSpell(e.spell, true), undefined, undefined, undefined, KDGetFaction(enemy)); + } + } + }, + }, +}; + +/** + * @param Event + * @param e + * @param enemy + * @param data + */ +function KinkyDungeonHandleEnemyEvent(Event: string, e: KinkyDungeonEvent, enemy: entity, data: any) { + if (Event === e.trigger && KDEventMapEnemy[e.dynamic ? "dynamic" : Event] && KDEventMapEnemy[e.dynamic ? "dynamic" : Event][e.type]) { + if (KDCheckCondition(e, data)) + KDEventMapEnemy[e.dynamic ? "dynamic" : Event][e.type](e, enemy, data); + } +} + + + +let KDEventMapGeneric: Record void>> = { + "inventoryTooltip": { + "stamdmg": (e, data) => { + if (data.item && data.item.type == Weapon && KDWeapon(data.item)?.stam50mult) { + + data.extraLines.push(TextGet("KDStamDmgBonus") + .replace("AMNT", KDWeapon(data.item).stam50mult + "")); + data.extraLineColor.push(KDBookText); // e.color || "#ffffff" + let bg = "#000000"; + if (!KDToggles.SpellBook) { + let col = DrawHexToRGB(bg); + bg = `rgba(${col.r / 2}, ${col.g / 2}, ${col.b / 2}, 0.5)`; + } + data.extraLineColorBG.push(bg); + } + }, + }, + "perkOrb": { + "Cursed": (_e, data) => { + if (data?.perks?.includes("Cursed")) { + for (let rep of Object.keys(KinkyDungeonShrineBaseCosts)) { + KinkyDungeonChangeRep(rep, 0); + } + } + }, + }, + "stun": { + /** Unstoppable, unflinching, relentless */ + "unstp": (_e, data) => { + KDStunResist(data); + }, + }, + "freeze": { + /** Unstoppable, unflinching, relentless */ + "unstp": (_e, data) => { + KDStunResist(data); + }, + }, + "bind": { + /** Unstoppable, unflinching, relentless */ + "unstp": (_e, data) => { + KDStunResist(data); + }, + }, + + "teleport": { + "TeleportPlate": (_e, data) => { + // Creates a wire spark if teleported on + let etiles = KDGetEffectTiles(data.x, data.y); + if (etiles) { + let tilesFiltered = Object.values(etiles)?.filter((tile) => { + return tile.tags?.includes("teleportwire"); + }); + if (tilesFiltered.length > 0) { + KDCreateEffectTile(data.x, data.y, { + name: "WireSparks", + duration: 2, + }, 0); + KinkyDungeonSendTextMessage(10, TextGet("KDTeleportPlateReact"), "#8888ff", 1); + } + } + + }, + "TeleportPlateMana": (_e, data) => { + // Creates a wire spark if teleported on + let etiles = KDGetEffectTiles(data.x, data.y); + if (etiles) { + let count = 5; + let tilesFiltered = Object.values(etiles)?.filter((tile) => { + return tile.tags?.includes("teleportcrystal"); + }); + if (tilesFiltered.length > 0) { + if (data.entity.player) { + KDChangeMana(data.x + ',' + data.y, "map", "teleport", -20, false, undefined, true, true); + let restraintToAdd = KinkyDungeonGetRestraint({ + tags: ["ropeMagicStrong"] + }, KDGetEffLevel() + 10, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, "Gold", false, false, false); + + if (restraintToAdd) { + KinkyDungeonAddRestraintIfWeaker(restraintToAdd, 10, true, "Gold", true, false, undefined, "Observer", true); + if (count > 1) + for (let i = 1; i < (count || 1); i++) { + restraintToAdd = KinkyDungeonGetRestraint({ + tags: ["ropeMagicStrong"] + }, KDGetEffLevel() + 10, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, "Gold", false, false, false); + if (restraintToAdd) KinkyDungeonAddRestraintIfWeaker(restraintToAdd, 10, true, "Gold", true, false, undefined, "Observer", true); + } + } + } else { + KDTieUpEnemy( + data.entity, + 10, "Magic", undefined, true, + ); + KDSilenceEnemy(data.entity, 12); + } + KinkyDungeonSendTextMessage(10, TextGet("KDTeleportPlateManaReact"), "#8888ff", 1); + } + } + + }, + + + }, + "beforeTeleport": { + "NoTeleportPlate": (_e, data) => { + if (!data.cancel && data.entity) { + // Creates a wire spark if teleported on + let etiles = KDGetEffectTiles(data.entity.x, data.entity.y); + if (etiles) { + let tilesFiltered = Object.values(etiles)?.filter((tile) => { + return tile.tags?.includes("blockteleport"); + }); + if (tilesFiltered.length > 0) { + data.cancel = true; + KinkyDungeonSendEvent("blockTeleport", data); + KinkyDungeonSendTextMessage(10, TextGet("KDNoTeleportPlateReact"), "#8888ff", 1); + } + } + } + }, + }, + "blockTeleport": { + "NoTeleportPlate": (_e, data) => { + if (data.entity) { + // Creates a wire spark if teleported on + let etiles = KDGetEffectTiles(data.entity.x, data.entity.y); + if (etiles) { + let tilesFiltered = Object.values(etiles)?.filter((tile) => { + return tile.tags?.includes("blockteleportwire"); + }); + if (tilesFiltered.length > 0) { + KDCreateEffectTile(data.entity.x, data.entity.y, { + name: "WireSparks", + duration: 2, + }, 0); + } + } + } + }, + }, + + "beforePlayerLaunchAttack": { + "ReplacePerks": (_e: string, data: { attackData: damageInfo, attackCost: number, target: entity }) => { + if ((!KinkyDungeonPlayerDamage.name || KinkyDungeonPlayerDamage.name == "Unarmed") + && KinkyDungeonPlayerDamage.unarmed + && KDIsHumanoid(data.target)) { + if (!KinkyDungeonIsArmsBound()) { + if (KinkyDungeonStatsChoice.get("UnarmedGrope")) { data.attackData.type = "grope"; data.attackData.sfx = "Damage"; } + else if (KinkyDungeonStatsChoice.get("UnarmedPain")) { data.attackData.type = "pain"; data.attackData.sfx = "Slap" } + else if (KinkyDungeonStatsChoice.get("UnarmedTickle")) { data.attackData.type = "tickle"; data.attackData.sfx = "Tickle"; } + data.attackData.tease = true; + } else KinkyDungeonSendActionMessage(7, TextGet("KDKick"), "#ffaa88", 1, true); + + + if (KinkyDungeonStatsChoice.get("UnarmedSuck")) { + data.attackData.damage *= 0.5; + data.attackCost *= 2; + } + } + }, + }, + "calcEnemyTags": { + "perkTags": (_e, data) => { + // This event adds tags to enemy tag determination based on perk prefs + if (KinkyDungeonStatsChoice.get("TapePref")) data.tags.push("tapePref"); + else if (KinkyDungeonStatsChoice.get("TapeOptout")) data.tags.push("tapeOptout"); + if (KinkyDungeonStatsChoice.get("SlimePref")) data.tags.push("slimePref"); + else if (KinkyDungeonStatsChoice.get("SlimeOptout")) data.tags.push("slimeOptout"); + if (KinkyDungeonStatsChoice.get("BubblePref")) data.tags.push("bubblePref"); + else if (KinkyDungeonStatsChoice.get("BubbleOptout")) data.tags.push("bubbleOptout"); + } + }, + "postMapgen": { + "resetDollRoom": (_e, _data) => { + //if (!KDGameData.RoomType || !(alts[KDGameData.RoomType].data?.dollroom)) { + //KDGameData.DollRoomCount = 0; + //} + } + }, + "orgasm": { + "tickNeeds": (_e, data) => { + KDNeedsOrgasm(data); + } + }, + "playSelf": { + "tickNeeds": (_e, data) => { + KDNeedsPlaySelf(data); + } + }, + "edge": { + "tickNeeds": (_e, data) => { + KDNeedsEdge(data); + } + }, + "deny": { + "tickNeeds": (_e, data) => { + KDNeedsDeny(data); + } + }, + "defeat": { + "dollRoomRemove": (_e, _data) => { + // Removes the excess dollsmiths that are spawned when you escape the dollroom + if (KDGameData.RoomType && KinkyDungeonAltFloor(KDGameData.RoomType).data?.dollroom) { + for (let en of KDMapData.Entities) { + if (en.Enemy.tags.dollsmith) { + en.noDrop = true; + en.hp = 0; + KDClearItems(en); + } + } + } + } + }, + "beforeStairCancelFilter": { + "PerkRoom": (_e, data) => { + if (data.force) return; + if (!data.cancelfilter && data.altRoom?.requireJourneyTarget) data.cancelfilter = "JourneyChoice"; + }, + }, + "beforeHandleStairs": { + "resetDollRoom": (_e, data) => { + if (KDGameData.RoomType && KinkyDungeonAltFloor(KDGameData.RoomType).data?.dollroom) { + KDGameData.DollRoomCount += 1; + if (KDGameData.DollRoomCount >= 3) { + // Allow player to pass unless returning to previous + if (KinkyDungeonFlags.get("NoDollRoomBypass")) { + data.overrideProgression = true; + data.overrideRoomType = true; + let journeySlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; + if (journeySlot) { + KDGameData.RoomType = journeySlot.RoomType; + data.mapMod = journeySlot.MapMod; + } else { + KDGameData.RoomType = ""; + data.mapMod = ""; + } + } + } else { + data.overrideRoomType = true; + data.overrideProgression = true; + data.mapMod = ""; + KDGameData.RoomType = "DollRoom"; + } + + } + }, + "NoRepeatTunnels": (_e, data) => { + // The player can never backtrack to a tunnel + if (data.toTile == 'S' && data.tile?.RoomType == "PerkRoom") { + data.overrideRoomType = true; + let journeySlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; + if (journeySlot) { + KDGameData.RoomType = journeySlot.RoomType; + } else { + KDGameData.RoomType = ""; + } + } + }, + "endfloorfix": (_e, data) => { + // Bugfix for a case that can happen 5.1 -> 5.2 + if (data.toTile == 'S' && data.tile?.RoomType == "Tunnel") { + data.tile.RoomType = ""; + } + }, + "Shop": (_e, data) => { + // The player can never backtrack to a tunnel + if (data.toTile == 'S' && data.tile?.RoomType == "JourneyFloor") { + //data.overrideRoomType = true; + data.tile.RoomType = "ShopStart"; + } + }, + }, + "drawSGTooltip": { + "goddessBonus": (_e, data) => { + if (data.item && KDRestraint(data.item)?.shrine) { + let bonus = KDGetItemGoddessBonus(data.item); + + if (bonus) { + data.extraLines.push(TextGet("KDGoddessStat_" + (bonus > 0 ? "Bonus" : "Penalty")) + Math.round(100 * bonus) + "%"); + data.extraLineColor.push(KDGetPosNegColor(bonus)); + } + } + }, + }, + "playerMove": { + "Conveyor": (_e, data) => { + for (let player of [KinkyDungeonPlayerEntity]) { + if (KinkyDungeonMapGet(player.x, player.y) == 'V' || (!data.willing && KinkyDungeonMapGet(player.x, player.y) == 'v')) + KDConveyor(1, player.x, player.y, true); + } + + }, + "noisyTerrain": (_e, data) => { + if (data.sprint && !data.cancelmove) { + let moves = [ + { x: data.moveX, y: data.moveY, str: data.moveX + "," + data.moveY }, + ]; + for (let m of moves) + if (KinkyDungeonEffectTilesGet(m.str)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(m.str))) { + if (tile.tags && tile.tags.includes("noisy")) { + KinkyDungeonMakeNoise(5, m.x, m.y); + KinkyDungeonSendTextMessage(3, TextGet("KDNoisyTerrain"), "#ff8933", 3, false, true); + } + } + } + } + }, + }, + "beforeMove": { + "changeFace": (e, intent) => { + if (KDToggles.FlipPlayerAuto) { + let movedelta = intent.x - KinkyDungeonPlayerEntity.x; + if (movedelta > 0) { + KDToggles.FlipPlayer = true; + } + else if (movedelta < 0) { + KDToggles.FlipPlayer = false; + } + } + } + }, + "resetEventVar": { + /** + * Helper event to clear out variables that are meant to always be reset every floor + * You can add your own event like this one + */ + "resetVars": (_e, _data) => { + KDEventData.SlimeLevel = 0; + }, + }, + "resetEventVarTick": { + /** + * Helper event to clear out variables that are meant to always be reset every tick + * You can add your own event like this one + */ + "resetVars": (_e, data) => { + KDEventData.ActivationsThisTurn = 0; + KDEventData.CurseHintTick = false; + if (KDEventData.SlimeLevel < 0) + KDEventData.SlimeLevel = 0; + KDEventData.SlimeLevelStart = KDEventData.SlimeLevel; + if (KDAlertCD > 0) KDAlertCD -= data.delta; + + if (KinkyDungeonLastTurnAction != "Attack" && KDGameData.WarningLevel > 0) { + if (KDRandom() < 0.25) KDGameData.WarningLevel -= data.delta; + if (KDGameData.WarningLevel > 10) KDGameData.WarningLevel = 10; + } + }, + }, + "draw": { + "HighProfile": (_e, data) => { + if (!KinkyDungeonStatsChoice.get("HighProfile")) return; + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (altType && altType.spawns === false) return; + for (let enemy of KDMapData.Entities) { + if (KDEntityHasBuff(enemy, "HighValue") + && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 + //&& KDCanSeeEnemy(enemy) + ) { + KDDraw(kdcanvas, kdpixisprites, enemy.id + "_hvtarg", KinkyDungeonRootDirectory + "UI/HighValueTarget.png", + (enemy.visual_x - data.CamX - data.CamX_offset) * KinkyDungeonGridSizeDisplay, + (enemy.visual_y - data.CamY - data.CamY_offset) * KinkyDungeonGridSizeDisplay, + KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { + zIndex: 10, + }); + } + } + + }, + "QuestMarker": (_e, data) => { + for (let enemy of KDMapData.Entities) { + if (KDEnemyHasFlag(enemy, "questtarget") && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, enemy.id + "_questtarg", KinkyDungeonRootDirectory + "UI/DollmakerTarget.png", + (enemy.visual_x - data.CamX) * KinkyDungeonGridSizeDisplay, + (enemy.visual_y - data.CamY) * KinkyDungeonGridSizeDisplay, + KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { + zIndex: -5, + tint: 0xff5555, + }); + } + } + }, + "EscapeKillMarker": (_e, data) => { + let escapeMethod = KDGetEscapeMethod(MiniGameKinkyDungeonLevel); + if (escapeMethod != "Kill" && escapeMethod != "Miniboss") return; + for (let enemy of KDMapData.Entities) { + if (KDEnemyHasFlag(enemy, "killtarget") && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, enemy.id + "_killtarg", KinkyDungeonRootDirectory + "UI/QuestTarget.png", + (enemy.visual_x - data.CamX) * KinkyDungeonGridSizeDisplay, + (enemy.visual_y - data.CamY) * KinkyDungeonGridSizeDisplay, + KinkyDungeonSpriteSize, KinkyDungeonSpriteSize, undefined, { + zIndex: -5, + tint: 0xff5555, + }); + } + } + }, + }, + "drawminimap": { + + "QuestMarker": (_e, data) => { + for (let enemy of KDMapData.Entities) { + if (KDEnemyHasFlag(enemy, "questtarget") + && (enemy.x - data.x + .5) * data.scale > 0 && (enemy.y - data.y + .5) * data.scale > 0 + && (enemy.x - data.x + .5) * data.scale < KDMinimapWidth() + 21 && (enemy.y - data.y + .5) * data.scale < KDMinimapHeight() + 21) { + /*KDDraw(kdminimap, kdminimapsprites, enemy.id + "_questtargmm", KinkyDungeonRootDirectory + "UI/DollmakerTarget.png", + (enemy.x - data.x - 1) * data.scale, + (enemy.y - data.y - 1) * data.scale, + data.scale * 2, data.scale * 2, undefined, { + zIndex: 10, + });*/ + kdminimap.lineStyle(3, 0); + kdminimap.beginFill(0xff5555, 1.); + kdminimap.drawCircle( + (enemy.x - data.x + .5) * data.scale, + (enemy.y - data.y + .5) * data.scale, + data.scale / 2); + kdminimap.endFill(); + } + } + + }, + "EscapeKillMarker": (_e, data) => { + let escapeMethod = KDGetEscapeMethod(MiniGameKinkyDungeonLevel); + if (escapeMethod != "Kill" && escapeMethod != "Miniboss") return; + for (let enemy of KDMapData.Entities) { + if (KDEnemyHasFlag(enemy, "killtarget") + && (enemy.x - data.x + .5) * data.scale > 0 && (enemy.y - data.y + .5) * data.scale > 0 + && (enemy.x - data.x + .5) * data.scale < KDMinimapWidth() + 21 && (enemy.y - data.y + .5) * data.scale < KDMinimapHeight() + 21) { + kdminimap.lineStyle(3, 0); + kdminimap.beginFill(0xff5555, 1.); + kdminimap.drawCircle( + (enemy.x - data.x + .5) * data.scale, + (enemy.y - data.y + .5) * data.scale, + data.scale / 2); + kdminimap.endFill(); + } + } + }, + }, + + /** Stuff that occurs after the quest stuff is generated */ + "postQuest": { + /** + * Helper event to clear out flags that are meant to always be reset every floor + * You can add your own event like this one + */ + "resetFlags": (_e, _data) => { + KinkyDungeonSetFlag("slept", 0); + }, + /** Updates gold locks */ + "lockStart": (_e, _data) => { + for (let tuple of KinkyDungeonAllRestraintDynamic()) { + let inv = tuple.item; + if (inv.lock && KDLocks[inv.lock] && KDLocks[inv.lock].levelStart) { + KDLocks[inv.lock].levelStart(inv); + } + } + }, + + + /** High Profile perk */ + "HighProfile": (_e, _data) => { + if (!KinkyDungeonStatsChoice.get("HighProfile")) return; + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (altType && altType.spawns === false) return; + // Select some enemies and make them high value + let eligible = []; + for (let enemy of KDMapData.Entities) { + // Avoid stuff like minor rope snakes, summons, allies, immobile stuff, bosses, and prisoners + if (enemy.Enemy.tags.leashing && !enemy.summoned && !enemy.lifetime && !enemy.Enemy.tags.stageBoss && !KDIsImmobile(enemy) && !KDEnemyHasFlag(enemy, "imprisoned") && !KDAllied(enemy) && (!enemy.Enemy.tags.minor || enemy.Enemy.bound)) { + let chance = 0.1; + if (!enemy.Enemy.tags.minor) { + chance = 0.2; + } + if (enemy.Enemy.tags.elite) { + chance = 0.4; + } + if (enemy.Enemy.tags.miniboss) { + chance = 0.7; + } + if (enemy.Enemy.tags.boss) { + chance = 1.0; + } + if (KDRandom() < chance) eligible.push(enemy); + } + } + let maxHV = Math.max(KDMapData.Entities.length * 0.1, eligible.length * 0.5); + for (let i = 0; i < maxHV && eligible.length > 0; i++) { + let index = Math.floor(KDRandom() * eligible.length); + let enemy = eligible[index]; + eligible.splice(index, 1); + + // Select this enemy + KDMakeHighValue(enemy); + } + }, + /** For new game plus, we make the game harder by replacing basic enemies with harder ones */ + "NGPlusReplace": (_ev, _data) => { + if (!KinkyDungeonNewGame) return; + let chance = 1 - (0.8 ** KinkyDungeonNewGame); + let bosschance = 1 - (0.9 ** KinkyDungeonNewGame); + let regbuffchance = 1 - (0.95 ** KinkyDungeonNewGame); + + + let entities: entity[] = Object.assign([], KDMapData.Entities); + for (let e of entities) { + if (!KDIsHumanoid(e)) continue; + if (KDEnemyHasFlag(e, "NGPrep")) continue; + KinkyDungeonSetEnemyFlag(e, "NGPrep", -1); + if (KDRandom() < chance && !KDEntityHasBuff(e, "HighValue")) { + let Enemy = null; + if (KDHardModeReplace[e.Enemy.name]) Enemy = KinkyDungeonGetEnemyByName(KDHardModeReplace[e.Enemy.name]); + if (Enemy) { + KDRemoveEntity(e); + e.Enemy = JSON.parse(JSON.stringify(Enemy)); + e.modified = true; + KDAddEntity(e); + + if (!e.CustomName) + KDProcessCustomPatron(Enemy, e, 0.2, true); + KinkyDungeonSetEnemyFlag(e, "NoFollow", -1); + let shop = KinkyDungeonGetShopForEnemy(e, false); + if (shop) { + KinkyDungeonSetEnemyFlag(e, "Shop", -1); + KinkyDungeonSetEnemyFlag(e, shop, -1); + KDSetShopMoney(e); + } + let loadout = KinkyDungeonGetLoadoutForEnemy(e, false); + KDSetLoadout(e, loadout); + } + if (KDRandom() < bosschance || e.Enemy.tags.stageBoss) { + let buff = KDGetByWeight(KDGetSpecialBuffList(e, ["NGP_Boss"])); + if (buff) { + KDSpecialBuffs[buff].apply(e, ["NGP_Boss"]); + } + + e.Enemy = JSON.parse(JSON.stringify(e.Enemy)); + e.Enemy.power *= 1.5; + e.Enemy.maxhp = e.Enemy.maxhp * 2; + e.modified = true; + } else if (KDRandom() < regbuffchance) { + let buff = KDGetByWeight(KDGetSpecialBuffList(e, ["NGP_Reg"])); + if (buff) { + KDSpecialBuffs[buff].apply(e, ["NGP_Reg"]); + } + } + e.hp = e.Enemy.maxhp; + } + + + } + }, + "HardModeReplace": (_ev, _data) => { + if (!KinkyDungeonStatsChoice.get("hardMode")) return; + let multiplier = 0.05 + 0.95 * Math.min(1.5, KDGetEffLevel() / (KinkyDungeonMaxLevel - 1)); + + let chance = 0.2 * multiplier; + let bosschance = 0.3; + let bosshpchance = 0.4 + 0.6 * multiplier; + + let boss = ["Hardmode_Boss"]; + let reg = ["Hardmode_Reg"]; + let hpmod = 1.0; + + if (KinkyDungeonStatsChoice.get("extremeMode")) { + chance = 0.1 + 0.9 * multiplier; + bosschance = 0.4; + bosshpchance = 1.0; + hpmod = 2.0; + boss.push("ExtremeBoss", "Extreme"); + reg.push("ExtremeReg", "Extreme"); + } + + let entities: entity[] = Object.assign([], KDMapData.Entities); + for (let e of entities) { + if (!KDIsHumanoid(e)) continue; + if (KDEnemyHasFlag(e, "HMrep")) continue; + KinkyDungeonSetEnemyFlag(e, "HMrep", -1); + + if (KDRandom() < chance && !KDEntityHasBuff(e, "HighValue")) { + let Enemy = null; + if (KDHardModeReplace[e.Enemy.name] && KDRandom() < 0.5) Enemy = KinkyDungeonGetEnemyByName(KDHardModeReplace[e.Enemy.name]); + if (Enemy) { + KDRemoveEntity(e); + e.Enemy = JSON.parse(JSON.stringify(Enemy)); + e.modified = true; + KDAddEntity(e); + + if (!e.CustomName) + KDProcessCustomPatron(Enemy, e, 0.2, true); + KinkyDungeonSetEnemyFlag(e, "NoFollow", -1); + let shop = KinkyDungeonGetShopForEnemy(e, false); + if (shop) { + KinkyDungeonSetEnemyFlag(e, "Shop", -1); + KinkyDungeonSetEnemyFlag(e, shop, -1); + KDSetShopMoney(e); + } + let loadout = KinkyDungeonGetLoadoutForEnemy(e, false); + KDSetLoadout(e, loadout); + } + let bossBuff = false; + if (KDRandom() < bosschance || e.Enemy.tags.stageBoss) { + let buff = KDGetByWeight(KDGetSpecialBuffList(e, boss)); + if (buff) { + KDSpecialBuffs[buff].apply(e, boss); + } + bossBuff = true; + + if (KDRandom() < bosshpchance) { + e.Enemy = JSON.parse(JSON.stringify(e.Enemy)); + e.Enemy.power *= 1.5; + e.Enemy.maxhp = Math.max(e.Enemy.maxhp * 2, e.Enemy.maxhp + hpmod * 1.0 * (1 + KDEnemyRank(e))); + e.modified = true; + } + } + if (!bossBuff || KinkyDungeonStatsChoice.get("extremeMode") || e.Enemy.tags.stageBoss) { + let buff = KDGetByWeight(KDGetSpecialBuffList(e, reg)); + if (buff) { + KDSpecialBuffs[buff].apply(e, reg); + } + } + e.hp = e.Enemy.maxhp; + } else { + // Boring enemies have more hp + e.Enemy = JSON.parse(JSON.stringify(e.Enemy)); + e.Enemy.maxhp = e.Enemy.maxhp + hpmod * 1.0 * (1 + KDEnemyRank(e)); + e.modified = true; + + e.hp = e.Enemy.maxhp; + } + + + } + }, + + "Watchpersistent": () => { + KDPersistentWatch(); + } + }, + "hit": { + "StunBondage": (_e, data) => { + if (data.player == KinkyDungeonPlayerEntity && data.restraintsAdded?.length > 0 && KinkyDungeonStatsChoice.has("StunBondage")) { + KDStunTurns(data.restraintsAdded.length, false); + } + }, + }, + "boundBySpell": { + "StunBondage": (_e, data) => { + if (data.player == KinkyDungeonPlayerEntity && data.restraintsAdded?.length > 0 && KinkyDungeonStatsChoice.has("StunBondage")) { + KDStunTurns(data.restraintsAdded.length, false); + } + }, + }, + "sleep": { + /** + * Updates NPC escape + */ + "updateNPCEscape": (_e, _data) => { + KDCollectionNPCEscapeTicks(12 + Math.floor(KDRandom() * 24)); + }, + }, + "tickFlags": { + "TempFlagFloorTicks": (_e, data) => { + if (KDGameData.TempFlagFloorTicks) + for (let f of Object.entries(KDGameData.TempFlagFloorTicks)) { + if (!KinkyDungeonFlags.get(f[0])) delete KDGameData.TempFlagFloorTicks[f[0]]; + else { + if (f[1] > data.delta) KDGameData.TempFlagFloorTicks[f[0]] = KDGameData.TempFlagFloorTicks[f[0]] - data.delta; + else { + KinkyDungeonSetFlag(f[0], 0); + delete KDGameData.TempFlagFloorTicks[f[0]]; + } + } + } + }, + /** + * Updates failities + */ + "updateFac": (_e, _data) => { + KDUpdateFacilities(1); + }, + /** + * Updates NPC escape + */ + "updateNPCEscape": (_e, _data) => { + KDCollectionNPCEscapeTicks(24 + Math.floor(KDRandom() * 36)); + }, + /** + * Resets the flags for playing with an NPC + */ + "updateNPCOpinionFlags": (_e, _data) => { + let setIDs = {}; + + for (let value of Object.values(KDGameData.Collection)) { + if (KDCollHasFlag(value.id, "playOpin")) { + KDSetIDFlag(value.id, "playOpin", 0); + KDSetIDFlag(value.id, "PleasedRep", 0); + setIDs[value.id] = true; + } + } + for (let pers of Object.values(KDPersistentNPCs)) { + if (!setIDs[pers.id]) { + KDSetIDFlag(pers.id, "playOpin", 0); + KDSetIDFlag(pers.id, "PleasedRep", 0); + + setIDs[pers.id] = true; + } + } + }, + /** Reduce tightness by 1 per floor */ + "reduceTightness": (_e, data) => { + if (MiniGameKinkyDungeonLevel > 0 && data?.altType?.tickFlags) + for (let tuple of KinkyDungeonAllRestraintDynamic()) { + let inv = tuple.item; + if (inv.tightness > 0) { + KinkyDungeonSendTextMessage(1, TextGet("KDTightnessFade") + .replace("RSTRT", KDGetItemName(inv)) + , "#ffffff", 1); + inv.tightness = Math.max(0, inv.tightness - 1); + } + } + }, + }, + /*"calcDisplayDamage": { + "BoostDamage": (e, data) => { + if (KinkyDungeonStatMana >= KinkyDungeonStatMana * 0.999 && KinkyDungeonStatsChoice.has("GroundedInReality")) { + data.buffdmg = Math.max(0, data.buffdmg + KinkyDungeonPlayerDamage.dmg * 0.3); + } + }, + },*/ + "playerAttack": { + "trainHeels": (_e, data) => { + if (KDHostile(data.enemy) && KDIsHumanoid(data.enemy)) { + KDTickTraining("Heels", KDGameData.HeelPower > 0 && !(KDGameData.KneelTurns > 0), KDGameData.HeelPower <= 0 && !KinkyDungeonGetRestraintItem("ItemBoots"), 1.5); + } + }, + "GroundedInReality": (_e, data) => { + if (KinkyDungeonPlayerDamage && KinkyDungeonStatMana >= KinkyDungeonStatManaMax * 0.999 && KinkyDungeonStatsChoice.has("GroundedInReality")) { + if (!data.miss && !data.disarm && data.targetX && data.targetY && data.enemy && KDHostile(data.enemy)) { + KinkyDungeonDamageEnemy(data.enemy, { + type: "electric", + damage: (data.damage?.damage || KinkyDungeonPlayerDamage.damage || 0) * 0.3, + }, false, false, undefined, undefined, KinkyDungeonPlayerEntity, undefined, undefined, data.vulnConsumed); + } + } + }, + }, + "calcMultMana": { + "ImmovableObject": (_e, data) => { + if (KinkyDungeonStatWill >= KinkyDungeonStatWillMax * 0.90 && KinkyDungeonStatsChoice.has("ImmovableObject")) { + if (data.spell && data.spell.tags && data.spell.tags.includes("buff") && data.spell.tags.includes("earth")) + data.cost = data.cost * 0.5; + } + }, + }, + "canSprint": { + "NovicePet": (_e, data) => { + if (KinkyDungeonStatsChoice.has("NovicePet")) { + if (KinkyDungeonPlayerTags.get("Petsuits")) { + data.mustStand = false; + } else if (KinkyDungeonFlags.get("NovicePet3")) { + data.canSprint = false; + } + } + } + }, + "tick": { + "biggerGags": (_e, _data) => { + if (_data.delta > 0 && KinkyDungeonStatsChoice.get("BiggerGags") && KDRandom() < 0.2) { + let item = KinkyDungeonGetRestraintItem("ItemMouth"); + if (item) { + let gags = KDDynamicLinkList(item, true).filter((inv) => { + return !!KDRestraint(inv)?.biggerVersion; + }); + if (gags.length > 0) { + let gag = gags[Math.floor(gags.length * KDRandom())]; + if (gag) { + KinkyDungeonSendTextMessage(10, TextGet("KDPerkGagSizeIncrease") + .replace("ITMN1", KDGetItemName(gag)) + .replace("ITMN2", KDGetItemNameString(KDRestraint(gag).biggerVersion)), + "#ffff00", 2); + KDChangeRestraintType(gag, Restraint, KDRestraint(gag).biggerVersion); + } + } + } + } + }, + "trainHeels": (_e, _data) => { + if (KinkyDungeonLastAction == "Move" && !(KDGameData.KneelTurns > 0)) { + let danger = KinkyDungeonInDanger(); + let amt = 0.01; + let mult = ( + (KinkyDungeonLeashingEnemy() && KDIsPlayerTetheredToLocation(KinkyDungeonPlayerEntity, KinkyDungeonLeashingEnemy().x, KinkyDungeonLeashingEnemy().y, KinkyDungeonLeashingEnemy())) + || + (KinkyDungeonJailGuard() && KDIsPlayerTetheredToLocation(KinkyDungeonPlayerEntity, KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y, KinkyDungeonJailGuard())) + ) ? 1.5 : 1; + KDTickTraining("Heels", KDGameData.HeelPower > 0, + KDGameData.HeelPower <= 0 && !danger, amt, mult); + } + }, + "runes": (_e, data) => { + if (data.delta > 0) { + let dd: KDRuneCountData = { + explodeChance: 0.15, + maxRunes: 10, + runes: 0, + runeList: [], + }; + KinkyDungeonSendEvent("countRune", dd); + + if (dd.runeList.length > 0 && dd.runes > dd.maxRunes && KDRandom() < dd.explodeChance) { + let rune = dd.runeList[Math.floor(dd.runeList.length * KDRandom())]; + rune.time = 0; + } + } + }, + "HighProfile": (_e, _data) => { + if (!KinkyDungeonStatsChoice.get("HighProfile")) return; + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (altType && altType.spawns === false) return; + + let player = KinkyDungeonPlayerEntity; + let nearby = KDNearbyEnemies(player.x, player.y, 12); + for (let enemy of nearby) { + if (KDEntityHasBuff(enemy, "HighValue")) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, + { id: "HighValueFound", type: "HighValueFound", duration: 2, power: 0, buffSprite: true, aura: "#e7cf1a" } + ); + return; + } + } + }, + "DollRoomUpdate": (_e, _data) => { + if (KDGameData.RoomType && KinkyDungeonAltFloor(KDGameData.RoomType).data?.dollroom) { + // Spawn shopkeeper + + if (KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)?.OL + && KDCanSpawnShopkeeper(true) + && KDRandom() < 0.1) KDStartDialog("ShopkeeperRescue", "ShopkeeperRescue", true, "", undefined); + + let spawn = true; + let eligible = false; + for (let player of [KinkyDungeonPlayerEntity]) { + if (spawn && KDistEuclidean(player.x - KDMapData.StartPosition.x, player.y - KDMapData.StartPosition.y) < 10) { + spawn = false; + } + if (spawn && !eligible && !KinkyDungeonTilesGet(player.x + "," + player.y)?.OL) { + eligible = true; + } + } + if (eligible && spawn && !KinkyDungeonFlags.get("spawnDollsmith")) { + let count = 0; + for (let en of KDMapData.Entities) { + if (en.Enemy.tags.dollsmith) count += 1; + } + if (count < 5) { + KinkyDungeonSetFlag("spawnDollsmith", 15); + let en = DialogueCreateEnemy(KDMapData.StartPosition.x, KDMapData.StartPosition.y, "Dollsmith"); + en.summoned = true; + en.noDrop = true; + } + } + } + }, + "DollStorageUpdate": (_e, _data) => { + if (KDGameData.RoomType && KinkyDungeonAltFloor(KDGameData.RoomType).data?.dollstorage) { + // Spawn shopkeeper + + if (KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)?.OL + && KDCanSpawnShopkeeper(true) + && KDRandom() < 0.1) KDStartDialog("ShopkeeperRescue", "ShopkeeperRescue", true, "", undefined); + + } + }, + "SecondWind": (_e, _data) => { + if (KinkyDungeonStatsChoice.has("SecondWind")) { + + let amount = 0.1; + if (KinkyDungeonFlags.get("SecondWind1")) amount += 0.15; + + if (KinkyDungeonStatWill < KinkyDungeonStatWillMax * amount + && !KinkyDungeonIsArmsBound(false, false) + && !KinkyDungeonIsHandsBound(false, false, 0.01) + && KinkyDungeonSlowLevel < 1 + && KinkyDungeonGagTotal(false) < 0.01 + && KinkyDungeonGetBlindLevel() < 1) { + KDChangeWill("SecondWind", "perk", "tick", 0.2, false); + } + if (!KinkyDungeonFlags.get("SecondWindSpell")) { + KinkyDungeonSetFlag("SecondWindSpell", -1); + KinkyDungeonSpells.push(KinkyDungeonFindSpell("SecondWind0")); + } + if (!KinkyDungeonFlags.get("SecondWind1")) { + if (KDHasSpell("SecondWind1")) { + KinkyDungeonSetFlag("SecondWind1", -1); + } + } + } + }, + + /*"FirstWind": (_e, _data) => { + if (KinkyDungeonFlags.get("FirstWind")) { + + let amount = 0.75; + + if (KinkyDungeonStatWill >= KinkyDungeonStatWillMax * amount) + { + KinkyDungeonChangeWill(0.2, false); + } + } + },*/ + "NovicePet": (_e, _data) => { + if (KinkyDungeonStatsChoice.has("NovicePet")) { + + let amount = 0; + if (KinkyDungeonFlags.get("NovicePet1")) amount += 1; + if (KinkyDungeonFlags.get("NovicePet2")) amount += 1; + if (KinkyDungeonFlags.get("NovicePet3")) amount += 1; + + if (KinkyDungeonPlayerTags.get("Petsuits")) { + if (amount > 0) + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "NovicePet", + type: "SlowLevel", + power: -amount, + duration: 2, + aura: "#ffffff", + aurasprite: "Null", + buffSprite: true, + }); + } else if (KinkyDungeonFlags.get("NovicePet3")) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "NovicePetBad2", + type: "SlowLevel", + power: 2, + duration: 2, + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "NovicePetVeryBad", + type: "SprintEfficiency", + power: -1.0, + duration: 2, + aura: "#ffffff", + aurasprite: "Null", + buffSprite: true, + }); + } else if (KinkyDungeonFlags.get("NovicePet2")) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "NovicePetBad2", + type: "SlowLevel", + power: 1, + duration: 2, + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "NovicePetBad", + type: "SprintEfficiency", + power: -1.0, + duration: 2, + aura: "#ffffff", + aurasprite: "Null", + buffSprite: true, + }); + } else if (KinkyDungeonFlags.get("NovicePet1")) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "NovicePetBad", + type: "SprintEfficiency", + power: -0.3, + duration: 2, + aura: "#ffffff", + aurasprite: "Null", + buffSprite: true, + }); + } + + if (!KinkyDungeonFlags.get("NovicePetSpell")) { + KinkyDungeonSetFlag("NovicePetSpell", -1); + KinkyDungeonSpells.push(KinkyDungeonFindSpell("NovicePet0")); + } + if (!KinkyDungeonFlags.get("NovicePet1")) { + if (KDHasSpell("NovicePet1")) { + KinkyDungeonSetFlag("NovicePet1", -1); + } + } + if (!KinkyDungeonFlags.get("NovicePet2")) { + if (KDHasSpell("NovicePet2")) { + KinkyDungeonSetFlag("NovicePet2", -1); + } + } + if (!KinkyDungeonFlags.get("NovicePet3")) { + if (KDHasSpell("NovicePet3")) { + KinkyDungeonSetFlag("NovicePet3", -1); + } + } + if (!KinkyDungeonFlags.get("NovicePetX")) { + if (KDHasSpell("NovicePetX")) { + KinkyDungeonSetFlag("NovicePetX", -1); + KinkyDungeonStatsChoice.delete("NovicePet"); + } + } + } + }, + "BurningDesire": (_e, _data) => { + if (KinkyDungeonStatDistraction >= KinkyDungeonStatDistractionMax * 0.7 && KinkyDungeonStatsChoice.has("BurningDesire")) { + let px = KinkyDungeonPlayerEntity.x - 1 + Math.round(2 * KDRandom()); + let py = KinkyDungeonPlayerEntity.y - 1 + Math.round(2 * KDRandom()); + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(px, py))) + KDCreateEffectTile(px, py, { + name: "Ember", + duration: 4 + }, 1); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "BurningDesire", + type: "fireDamageBuff", + power: 0.25, + duration: 2 + }); + + } + }, + "Needs": (_e, data) => { + if (KinkyDungeonStatsChoice.get("Needs")) { + if (data.delta > 0 && !(KDGameData.OrgasmStamina > 0)) { + if (KinkyDungeonStatDistractionLower < KinkyDungeonStatDistractionLowerCap * KinkyDungeonStatDistractionMax) { + KinkyDungeonStatDistractionLower = Math.min(KinkyDungeonStatDistractionLower + data.delta * 0.01, KinkyDungeonStatDistractionLowerCap * KinkyDungeonStatDistractionMax); + } + } + } + }, + "LikeTheWind": (_e, _data) => { + if (KinkyDungeonStatStamina >= KinkyDungeonStatStaminaMax * 0.95 && KinkyDungeonStatsChoice.has("LikeTheWind")) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "LikeTheWind", + type: "Evasion", + power: 0.3, + duration: 2 + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "LikeTheWind2", + type: "SlowLevel", + power: -1, + duration: 2 + }); + + } + }, + "ImmovableObject": (_e, _data) => { + if (KinkyDungeonStatWill >= KinkyDungeonStatWillMax * 0.90 && KinkyDungeonStatsChoice.has("ImmovableObject")) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "ImmovableObject", + type: "RestraintBlock", + power: 15, + duration: 2 + }); + + } + }, + "LeastResistance": (_e, _data) => { + if (KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.01 && KinkyDungeonStatsChoice.has("LeastResistance")) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "LeastResistance", + type: "EvasionProtected", + power: 0.35, + duration: 2 + }); + } + }, + + "FrigidPersonality": (_e, _data) => { + if (KinkyDungeonStatDistraction <= KinkyDungeonStatDistractionMax * 0.1 && KinkyDungeonStatsChoice.has("FrigidPersonality")) { + let px = KinkyDungeonPlayerEntity.x - 1 + Math.round(2 * KDRandom()); + let py = KinkyDungeonPlayerEntity.y - 1 + Math.round(2 * KDRandom()); + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(px, py))) + KDCreateEffectTile(px, py, { + name: "Ice", + duration: 4 + }, 1); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "FrigidPersonality", + type: "iceDamageBuff", + power: 0.1, + duration: 2 + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "FrigidPersonality2", + type: "frostDamageBuff", + power: 0.1, + duration: 2 + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, KDNoChillNoAura); + + } + }, + }, + "playerCast": { + "ArousingMagic": (_e, data) => { + if (KinkyDungeonStatsChoice.get("ArousingMagic")) { + KDChangeDistraction("ArousingMagic", "perk", "cast", KinkyDungeonGetManaCost(data.spell), false, 0.1); + } + }, + "Clearheaded": (_e, data) => { + if (KinkyDungeonStatsChoice.get("Clearheaded")) { + KDChangeDistraction("Clearheaded", "perk", "cast", -KinkyDungeonGetManaCost(data.spell), false, 0.1); + } + }, + }, + "beforeDamage": { + "LeastResistance": (_e, data) => { + if (KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.01 && KinkyDungeonStatsChoice.has("LeastResistance")) { + if (data.attacker && data.target.player && data.bound && data.eventable && (data.attacker.player || !data.target.player || KinkyDungeonAggressive(data.attacker))) { + if (data.attacker.player) { + KinkyDungeonDealDamage({ damage: KinkyDungeonStatWillMax * 0.1, type: "soap" }); + } else { + KinkyDungeonDamageEnemy(data.attacker, { damage: KinkyDungeonStatWillMax * 0.20, type: "soap" }, false, false, undefined, undefined, KinkyDungeonPlayerEntity); + } + } + } + }, + }, + "perksStruggleCalc": { + "CursedLocks": (_e, data) => { + if (KinkyDungeonStatsChoice.get("CursedLocks") && data.struggleType == "Cut" && data.restraint.lock) { + data.escapeChance = -100; + if (data.Msg) { + KinkyDungeonSendTextMessage(10, TextGet("KDCursedLocks"), "#aa4488", 1.1); + } + } + }, + }, + "beforeChest": { + "shadowChest": (_e, data) => { + if ((data.chestType == "shadow" || data.chestType == "lessershadow") && KDCanCurse(["ChestCollar"])) { + // Shadow chests spawn cursed epicenter + if (data.chestType == "shadow" || KDRandom() < 0.2) + KDSummonCurseTrap(data.x, data.y); + } + }, + "lessergoldChest": (_e, data) => { + if ((data.chestType == "lessergold") && KDCanCurse(["ChestCollar"])) { + // Shadow chests spawn cursed epicenter + KDSummonCurseTrap(data.x, data.y); + } + }, + }, + "kill": { + "HighProfile": (_e, data) => { + if (data.enemy && KDEntityHasBuff(data.enemy, "HighValue")) { + KinkyDungeonAddGold(Math.round(Math.pow(data.enemy.Enemy.maxhp, 0.5) * 10)); + } + } + }, + "specialChests": { + "hardmode": (_e, data) => { + if (KinkyDungeonStatsChoice.get("hardMode")) { + data.specialChests.shadow = (data.specialChests.shadow || 0) + 2; + data.specialChests.blue = (data.specialChests.blue || 0) + 1; + } + }, + "demontransition": (_e, data) => { + if (data.altType?.name == "DemonTransition") data.specialChests.lessershadow = 10; + }, + "bluechest": (_e, data) => { + if (!data.altType) data.specialChests.blue = (data.specialChests.blue || 0) + 1; + }, + }, + "genSpecialChest": { + "blue": (_e, data) => { + if (data.type == "blue") { + data.lock = "Blue"; + data.guaranteedTrap = true; + } + }, + "shadow": (_e, data) => { + if (data.type == "shadow" || data.type == "lessershadow") { + data.lock = undefined; + data.guaranteedTrap = true; + } + }, + }, + "addEntity": { + "EnemyResist": (_e, data) => { + if (KinkyDungeonStatsChoice.get("EnemyResist") && KDGetFaction(data.enemy) != "Player") { + if (!KDEnemyHasFlag(data.enemy, "EnemyResist")) { + KinkyDungeonSetEnemyFlag(data.enemy, "EnemyResist", -1); + data.type = JSON.parse(JSON.stringify(data.enemy.Enemy)); + data.type.maxhp *= KDEnemyResistHPMult; + data.enemy.hp *= KDEnemyResistHPMult; + data.enemy.Enemy = data.type; + data.enemy.modified = true; + } + } + }, + "ResilientFoes": (_e, data) => { + if (KinkyDungeonStatsChoice.get("ResilientFoes") && KDGetFaction(data.enemy) != "Player") { + if (!KDEnemyHasFlag(data.enemy, "ResilientFoes")) { + KinkyDungeonSetEnemyFlag(data.enemy, "ResilientFoes", -1); + data.type = JSON.parse(JSON.stringify(data.enemy.Enemy)); + data.type.maxhp *= KDResilientHPMult; + data.enemy.hp *= KDResilientHPMult; + data.enemy.Enemy = data.type; + data.enemy.modified = true; + } + } + }, + "Stealthy": (_e, data) => { + if (KinkyDungeonStatsChoice.get("Stealthy") && KDGetFaction(data.enemy) != "Player") { + if (!KDEnemyHasFlag(data.enemy, "Stealthy")) { + KinkyDungeonSetEnemyFlag(data.enemy, "Stealthy", -1); + data.type = JSON.parse(JSON.stringify(data.enemy.Enemy)); + data.type.maxhp *= KDStealthyHPMult; + data.enemy.hp *= KDStealthyHPMult; + data.enemy.Enemy = data.type; + data.enemy.modified = true; + } + } + }, + }, + "calcVision": { + "ArchersEye": (_e, data) => { + if (KinkyDungeonStatsChoice.get("ArchersEye")) { + data.max += Math.max(0, 2 - Math.max(0, KinkyDungeonBlindLevel || 0)); + } + }, + "Nearsighted": (_e, data) => { + if (KinkyDungeonStatsChoice.get("Nearsighted")) { + data.max *= 0.5; + } + }, + }, + "vision": { + "NightOwl": (_e, data) => { + if (KinkyDungeonStatsChoice.get("NightOwl")) { + data.flags.nightVision *= 2; + } + }, + "NightBlindness": (_e, data) => { + if (KinkyDungeonStatsChoice.get("NightBlindness")) { + data.flags.nightVision *= 0.7; + } + }, + "Nearsighted": (_e, data) => { + if (KinkyDungeonStatsChoice.get("Nearsighted")) { + data.flags.nightVision *= 0.85; + } + }, + }, + "calcHearing": { + "KeenHearing": (_e, data) => { + if (KinkyDungeonStatsChoice.get("KeenHearing")) { + data.hearingMult *= 2; + } + }, + }, + "afterNoise": { + // Shockwave rendering code + "shockwave": (_e, data) => { + if (data.particle) { + if (!KDEventData.shockwaves) KDEventData.shockwaves = []; + KDEventData.shockwaves.push(data); + } + } + }, + "afterDrawFrame": { + // Shockwave rendering code + "shockwave": (_e, data) => { + if (KDEventData.shockwaves) { + if (KDToggles.ParticlesFX) + for (let s of KDEventData.shockwaves) { + KDAddShockwave((s.x - data.CamX + 0.5) * KinkyDungeonGridSizeDisplay, (s.y - data.CamY + 0.5) * KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay * (s.radius + 1) * 2, s.sprite); + } + KDEventData.shockwaves = []; + } + }, + // Sounddesc rendering code + "sounddesc": (_e, data) => { + if (KDEventData.sounddesc) { + for (let sd of KDEventData.sounddesc) { + if (KinkyDungeonVisionGet(sd.x, sd.y) > 0.1 && !KinkyDungeonEntityAt(sd.x, sd.y)) continue; + if (sd.shockwave && CommonTime() > sd.shockwavePeriod +sd.lastShockwave && KDToggles.ParticlesFX) { + sd.lastShockwave = CommonTime(); + let s = sd.shockwave; + KDAddShockwave((s.x - data.CamX + 0.5) * KinkyDungeonGridSizeDisplay, (s.y - data.CamY + 0.5) * KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay * (s.radius + 1) * 2, s.sprite); + } + DrawTextFitKDTo(kdenemystatusboard, sd.desc, + canvasOffsetX + (sd.x - KinkyDungeonCamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, + canvasOffsetY + (sd.y - KinkyDungeonCamY)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, + 500, "#aaaaaa", "#000000", 12); + } + } + } + }, + "beforeNewGame": { + // Ran before starting a new game + }, + "afterNewGame": { + // Ran immediately after a new game starts + }, + "beforeLoadGame": { + // Ran before loading a game + }, + "afterLoadGame": { + // Ran after loading a game + }, + "afterModSettingsLoad": { + // Ran after loading KDModSettings from Local Storage + }, + "afterModConfig": { + // Ran after returning to menu from the mod configuration window. + } +}; + +/** + * @param Event + * @param data + */ +function KinkyDungeonHandleGenericEvent(Event: string, data: any) { + if (!KDMapHasEvent(KDEventMapGeneric, Event)) return; + if (KDEventMapGeneric[Event] && KDEventMapGeneric[Event]) { + for (let e of Object.keys(KDEventMapGeneric[Event])) + KDEventMapGeneric[Event][e](e, data); + } +} + + + +/* TODO: Utilize item and tags parameter in future :) */ +function KDEventPrereq(_e: string, item?: item, tags?: any) { + if (tags) { + if (!tags.length) { + tags = [tags]; + } + for (let t of tags) { + if (t == "locked") { + return item.lock; + } + } + } + return true; +} + +/** + * @param enemy + */ +function KDIsHumanoid(enemy: entity): boolean { + return (enemy?.player) || (enemy?.Enemy.bound && !enemy.Enemy.nonHumanoid); +} + +/** + * For spells that arent cast, like toggles and flame blade + * @param spell + * @param data + * @param Passive + * @param Toggle + */ +function KDTriggerSpell(spell: spell, data: any, Passive: boolean, Toggle: boolean) { + if (!data.spell) data.spell = spell; + if (Passive) data.Passive = true; + if (Toggle) data.Toggle = true; + KinkyDungeonSendEvent("spellTrigger", data); + KinkyDungeonSendEvent("afterSpellTrigger", data); + + if (spell && spell.school) KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "trigger_" + spell.school.toLowerCase(), 1); + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "trigger", 1); + if (spell.tags) { + for (let t of spell.tags) { + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "trigger_" + t, 1); + } + } +} + + + +function KDAddTraineeWP(player: entity, powerAdded: number) { + let max = KinkyDungeonStatWillMax - KinkyDungeonStatWill; + let buff = KDEntityGetBuff(player, "TraineeWP"); + if (!buff) { + powerAdded = Math.min(powerAdded, max); + KinkyDungeonApplyBuffToEntity(player, + { + id: "TraineeWP", + type: "RallyWill", + aura: "#ff5277", + aurasprite: "Null", + buffSprite: true, + //buffSprite: true, + power: powerAdded, + duration: 9999, infinite: true, + text: Math.round(10 * powerAdded), + } + ); + //KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `+${Math.round(powerAdded*10)} ${TextGet("KDArcaneEnergy")}`, "#8888ff", 3); + } else { + //let origPower = buff.power; + buff.power += powerAdded; + buff.power = Math.min(buff.power, max); + buff.text = Math.round(10 * KDEntityBuffedStat(player, "RallyWill")); + //KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `+${Math.round((buff.power - origPower)*10)} ${TextGet("KDArcaneEnergy")}`, "#8888ff", 3); + } + +} + +function KDAddArcaneEnergy(player: entity, powerAdded: number) { + let max = KinkyDungeonStatManaMax + KDEntityBuffedStat(player, "MaxArcaneEnergy"); + let buff = KDEntityGetBuff(player, "ArcaneEnergy"); + if (!buff) { + powerAdded = Math.min(powerAdded, max); + KinkyDungeonApplyBuffToEntity(player, + { + id: "ArcaneEnergy", + type: "ArcaneEnergy", + aura: "#8888ff", + aurasprite: "Null", + buffSprite: true, + //buffSprite: true, + power: powerAdded, + duration: 9999, infinite: true, + text: Math.round(10 * powerAdded), + } + ); + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `+${Math.round(powerAdded * 10)} ${TextGet("KDArcaneEnergy")}`, "#8888ff", 3); + } else { + let origPower = buff.power; + buff.power += powerAdded; + buff.power = Math.min(buff.power, max); + buff.text = Math.round(10 * KDEntityBuffedStat(player, "ArcaneEnergy")); + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, `+${Math.round((buff.power - origPower) * 10)} ${TextGet("KDArcaneEnergy")}`, "#8888ff", 3); + } + +} + +let KDHardModeReplace = { + "WitchShock": "WitchMagnet", + "WitchChain": "WitchMetal", + "Drone": "CaptureBot", + "CaptureBot": "Cyborg", + "EnforcerBot": "BotMissile", + "Alchemist": "Alkahestor", + "WolfgirlPet": "WolfGuard", + "WolfApprentice": "WolfOperative", + "WolfTapeDrones": "WolfShieldDrone", + "Bandit": "BanditHunter", + "BanditHunter": "BanditGrappler", + "BanditGrappler": "BanditChief", + "SmallSlime": "SlimeAdv", + "FastSlime": "LatexCube", + "LatexCubeSmall": "LatexCubeMetal", + "Dragon": "DragonShield", + "DragonShield": "DragonLeader", + "ElementalFire": "ElementalWater", + "Pixie": "ElfRanger", + "Statue": "StatueDart", + "SoulCrystal": "SoulCrystalActive", + "ShadowHand": "ShadowGhast", + "ShadowGhast": "CorruptedAdventurer", + "Gag": "AnimArmbinder", + "Scarves": "MonsterRope", + "RopeSnake": "ElementalRope", + "LearnedRope": "ElementalLeather", + "Apprentice": "WitchRope", + "Apprentice2": "Conjurer", + "HighWizard": "Fungal", + "Dressmaker": "Librarian", + "Cleric": "Mummy", + "BlindZombie": "NawashiZombie", + "FastZombie": "SamuraiZombie", + "Ninja": "Nawashi", + "Maidforce": "MaidforceStalker", + "MaidforcePara": "MaidforceHead", + "LesserSkeleton": "GreaterSkeleton", + "Skeleton": "HeavySkeleton", + "OldDrone": "OldTapeDrone", +}; + + + + +function KinkyDungeonSendAltEvent(Event: string, data: any) { + if (!KDMapHasEvent(KDEventMapAlt, Event)) return; + let alt = KDGetAltType(MiniGameKinkyDungeonLevel); + if (alt?.events) { + for (let e of alt.events) { + KinkyDungeonHandleAltEvent(Event, e, alt, data); + } + } +} + + +/** + * @param Event + * @param e + * @param alt + * @param data + */ +function KinkyDungeonHandleAltEvent(Event: string, e: KinkyDungeonEvent, alt: any, data: any) { + if (Event === e.trigger && KDEventMapAlt[e.dynamic ? "dynamic" : Event] && KDEventMapAlt[e.dynamic ? "dynamic" : Event][e.type]) { + if (KDCheckCondition(e, data)) + KDEventMapAlt[e.dynamic ? "dynamic" : Event][e.type](e, alt, data); + } +} + +let KDEventMapAlt: Record void>> = { + "tick": { + "PerkRoom": (_e, _alt, _data) => { + if (KinkyDungeonStatsChoice.get("perksmandatory")) { + if (KinkyDungeonFlags.get("choseperk")) { + KinkyDungeonMapSet(KDMapData.EndPosition.x, KDMapData.EndPosition.y, 's'); + } + } + } + }, +}; + + + + + +function KinkyDungeonSendFacilityEvent(Event: string, data: any) { + if (!KDMapHasEvent(KDEventMapFacility, Event)) return; + let listUpdate = Object.entries(KDFacilityTypes).filter((entry) => { + return entry[1].prereq(); + }); + for (let Facility of listUpdate) { + if (Facility[1].events) { + for (let e of Facility[1].events) { + KinkyDungeonHandleFacilityEvent(Event, e, Facility[0], data); + } + } + } +} + + +/** + * @param Event + * @param e + * @param fac + * @param data + */ +function KinkyDungeonHandleFacilityEvent(Event: string, e: KinkyDungeonEvent, fac: string, data: any) { + if (Event === e.trigger && KDEventMapFacility[e.dynamic ? "dynamic" : Event] && KDEventMapFacility[e.dynamic ? "dynamic" : Event][e.type]) { + if (KDCheckCondition(e, data)) + KDEventMapFacility[e.dynamic ? "dynamic" : Event][e.type](e, fac, data); + } +} + +let KDEventMapFacility: Record void>> = { +}; + + + +function KDStunResist(data: any) { + let amount = 0; + let time = 0; + if (data.enemy?.Enemy?.tags.unstoppable) { + amount = 2; + time = 10; + } else if (data.enemy?.Enemy?.tags.unflinching) { + amount = 1.5; + time = 8; + } else if (data.enemy?.Enemy?.tags.relentless) { + amount = 1; + time = 3; + } + if (amount) { + KinkyDungeonApplyBuffToEntity(data.enemy, { + id: "ccArmor", + power: amount, + type: "StunResist", + duration: time, + aura: "#ffc2a1", + tags: ["defense", "cc"], + }); + } +} + +function KDAddEvent(map: any, trigger: any, type: any, code: any) { + if (!map) { + console.log("Error adding " + trigger + ", " + type); + } + if (!map[trigger]) { + map[trigger] = {}; + } + map[trigger][type] = code; +} diff --git a/Game/src/enemy/KDAIList.ts b/Game/src/enemy/KDAIList.ts new file mode 100644 index 000000000..15616bc8a --- /dev/null +++ b/Game/src/enemy/KDAIList.ts @@ -0,0 +1,262 @@ +'use strict'; + +let KDAIType: Record = { + "wander": { + init: (_enemy, _player, _aiData) => {}, + beforemove: (_enemy, _player, _aiData) => {return false;}, + chase: (_enemy, _player, _aiData) => {return false;}, + trackvisibletarget: (_enemy, _player, _aiData) => {return true;}, + persist: (_enemy, _player, _aiData) => {return false;}, + move: (_enemy, _player, _aiData) => {return true;}, + follower: (_enemy, _player, _aiData) => {return true;}, + followsound: (_enemy, _player, _aiData) => {return true;}, + wander_near: (_enemy, _player, _aiData) => {return true;}, + wander_far: (_enemy, _player, _aiData) => {return KDRandom() < 0.2;}, + resetguardposition: (_enemy, _player, _aiData) => {return false;}, + attack: (_enemy, _player, _aiData) => {return true;}, + spell: (_enemy, _player, _aiData) => {return true;}, + aftermove: (_enemy, _player, _aiData) => {return false;}, + wanderDelay_long: (_enemy, _aiData) => {return 35 + Math.floor(KDRandom() * 35);}, + wanderDelay_short: (_enemy, _aiData) => {return 10 + Math.floor(KDRandom() * 25);}, + }, + "hunt": { + init: (_enemy, _player, _aiData) => {}, + beforemove: (_enemy, _player, _aiData) => {return false;}, + chase: (_enemy, _player, _aiData) => {return true;}, + trackvisibletarget: (_enemy, _player, _aiData) => {return true;}, + persist: (_enemy, _player, _aiData) => {return true;}, + move: (_enemy, _player, _aiData) => {return true;}, + follower: (_enemy, _player, _aiData) => {return true;}, + followsound: (_enemy, _player, _aiData) => {return true;}, + wander_near: (_enemy, _player, _aiData) => {return true;}, + wander_far: (_enemy, _player, _aiData) => {return KDRandom() < 0.2;}, + resetguardposition: (_enemy, _player, _aiData) => {return false;}, + attack: (_enemy, _player, _aiData) => {return true;}, + spell: (_enemy, _player, _aiData) => {return true;}, + aftermove: (_enemy, _player, _aiData) => {return false;}, + wanderDelay_long: (_enemy, _aiData) => {return 35 + Math.floor(KDRandom() * 35);}, + wanderDelay_short: (_enemy, _aiData) => {return 10 + Math.floor(KDRandom() * 25);}, + wanderfar_func: (enemy, _player, _aiData) => { + if (enemy.partyLeader) { + if (KDWanderFarEnemyParty(enemy)) + return true; + } + let newPoint = (KDRandom() < 0.4 && (enemy.spawnX || enemy.spawnY)) ? KinkyDungeonGetNearbyPoint(enemy.spawnX, enemy.spawnY, true, undefined, false, false) : KinkyDungeonGetRandomEnemyPoint(false, false); + if (!newPoint) newPoint = KinkyDungeonGetRandomEnemyPoint(false, false); + if (newPoint) { + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + return true; + } + return false; + }, + }, + "huntshadow": { + init: (_enemy, _player, _aiData) => {}, + beforemove: (_enemy, _player, _aiData) => {return false;}, + chase: (_enemy, _player, _aiData) => {return true;}, + trackvisibletarget: (_enemy, _player, _aiData) => {return true;}, + persist: (_enemy, _player, _aiData) => {return true;}, + move: (_enemy, _player, _aiData) => {return true;}, + follower: (_enemy, _player, _aiData) => {return true;}, + followsound: (_enemy, _player, _aiData) => {return true;}, + wander_near: (_enemy, _player, _aiData) => {return true;}, + wander_far: (_enemy, _player, _aiData) => {return KDRandom() < 0.4;}, + wandernear_func: (enemy, _player, aiData) => { + if (KinkyDungeonAlert && aiData.playerDist < Math.max(4, aiData.visionRadius)) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + } else { + // Short distance + let ex = enemy.x; + let ey = enemy.y; + let cohesion = enemy.Enemy.cohesion ? enemy.Enemy.cohesion : 0.5; + let masterCloseness = enemy.Enemy.cohesion ? enemy.Enemy.cohesion : 0.7; + if (aiData.master && KDRandom() < masterCloseness) { + ex = aiData.master.x; + ey = aiData.master.y; + } else if (KDRandom() < cohesion) { + let minDist = enemy.Enemy.cohesionRange ? enemy.Enemy.cohesionRange : aiData.visionRadius; + for (let e of KDMapData.Entities) { + if (e == enemy) continue; + if (['guard', 'ambush'].includes(KDGetAI(enemy))) continue; + if (enemy.Enemy.clusterWith && !e.Enemy.tags[enemy.Enemy.clusterWith]) continue; + if (KinkyDungeonTilesGet(e.x + "," + e.y) && KinkyDungeonTilesGet(e.x + "," + e.y).OL) continue; + let dist = KDistEuclidean(e.x - enemy.x, e.y - enemy.y); + if (dist < minDist) { + minDist = dist; + let ePoint = KinkyDungeonGetNearbyPoint(ex, ey, false); + if (ePoint) { + ex = ePoint.x; + ey = ePoint.y; + } + } + } + } + let newPoint = KinkyDungeonGetNearbyPoint(ex, ey, false, undefined, undefined, undefined, (x, y) => { + return KinkyDungeonBrightnessGet(x, y) < 4; + }); + if (newPoint && (KDGetFaction(enemy) != "Player" || !KinkyDungeonPointInCell(newPoint.x, newPoint.y))) { + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + return true; + } + } + + return false; + }, + wanderfar_func: (enemy, _player, _aiData) => { + if (enemy.partyLeader) { + if (KDWanderFarEnemyParty(enemy)) + return true; + } + let newPoint = KinkyDungeonGetRandomEnemyPointCriteria((x: number, y: number) => { + return KinkyDungeonBrightnessGet(x, y) < 4; + }, false, enemy.tracking && KinkyDungeonHuntDownPlayer && KDGameData.PrisonerState != "parole" && KDGameData.PrisonerState != "jail"); + if (newPoint) { + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + return true; + } + return false; + }, + resetguardposition: (_enemy, _player, _aiData) => {return false;}, + attack: (_enemy, _player, _aiData) => {return true;}, + spell: (_enemy, _player, _aiData) => {return true;}, + aftermove: (_enemy, _player, _aiData) => {return false;}, + wanderDelay_long: (_enemy, _aiData) => {return 20 + Math.floor(KDRandom() * 15);}, + wanderDelay_short: (_enemy, _aiData) => {return 10 + Math.floor(KDRandom() * 10);}, + }, + "patrol": { + init: (_enemy, _player, _aiData) => {}, + beforemove: (_enemy, _player, _aiData) => {return false;}, + chase: (_enemy, _player, _aiData) => {return true;}, + trackvisibletarget: (_enemy, _player, _aiData) => {return true;}, + persist: (_enemy, _player, _aiData) => {return true;}, + move: (_enemy, _player, _aiData) => {return true;}, + follower: (_enemy, _player, _aiData) => {return true;}, + followsound: (_enemy, _player, _aiData) => {return true;}, + wander_near: (_enemy, _player, _aiData) => {return true;}, + wander_far: (_enemy, _player, _aiData) => {return true;}, + resetguardposition: (_enemy, _player, _aiData) => {return false;}, + attack: (_enemy, _player, _aiData) => {return true;}, + spell: (_enemy, _player, _aiData) => {return true;}, + aftermove: (enemy, _player, aiData) => { + if (!aiData.allyFollowPlayer && !KDEnemyHasFlag(enemy, "StayHere")) { + let patrolChance = aiData.patrolChange ? 0.13 : 0.02; + if (!enemy.patrolIndex) enemy.patrolIndex = KinkyDungeonNearestPatrolPoint(enemy.x, enemy.y); + if (KDMapData.PatrolPoints[enemy.patrolIndex] && KDRandom() < patrolChance) { + + if (enemy.patrolIndex < KDMapData.PatrolPoints.length - 1) enemy.patrolIndex += 1; + else enemy.patrolIndex = 0; + + let newPoint = KinkyDungeonGetPatrolPoint(enemy.patrolIndex, 1.4, aiData.MovableTiles); + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + } + return true; + } + return false; + }, + wanderDelay_long: (_enemy, _aiData) => {return 35 + Math.floor(KDRandom() * 35);}, + wanderDelay_short: (_enemy, _aiData) => {return 10 + Math.floor(KDRandom() * 20);}, + }, + "guard": { + guard: true, + init: (_enemy, _player, aiData) => { + aiData.visionMod *= 0.7;}, + beforemove: (_enemy, _player, _aiData) => {return false;}, + chase: (enemy, player, _aiData) => { + if (enemy.x == enemy.gxx && enemy.y == enemy.gyy) { + if (KDistEuclidean(player.x-enemy.x, player.y-enemy.y) > 3.5) return false; + } + return true; + }, + trackvisibletarget: (enemy, player, _aiData) => { + if (enemy.x == enemy.gxx && enemy.y == enemy.gyy) { + if (KDistEuclidean(player.x-enemy.x, player.y-enemy.y) > 3.5) return false; + } + return true; + }, + persist: (_enemy, _player, _aiData) => {return false;}, + move: (_enemy, _player, _aiData) => {return true;}, + follower: (_enemy, _player, _aiData) => {return true;}, + followsound: (_enemy, _player, _aiData) => {return true;}, + wander_near: (_enemy, _player, _aiData) => {return false;}, + wander_far: (_enemy, _player, _aiData) => {return false;}, + resetguardposition: (_enemy, _player, _aiData) => {return true;}, + attack: (_enemy, _player, _aiData) => {return true;}, + spell: (_enemy, _player, _aiData) => {return true;}, + aftermove: (_enemy, _player, _aiData) => {return false;}, + wanderDelay_long: (_enemy, _aiData) => {return 35 + Math.floor(KDRandom() * 35);}, + wanderDelay_short: (_enemy, _aiData) => {return 15 + Math.floor(KDRandom() * 30);}, + }, + "looseguard": { + guard: true, + strictwander: true, + init: (_enemy, _player, _aiData) => {}, + beforemove: (_enemy, _player, _aiData) => {return false;}, + chase: (_enemy, _player, _aiData) => {return true;}, + trackvisibletarget: (enemy, player, _aiData) => { + if (enemy.x == enemy.gxx && enemy.y == enemy.gyy) { + if (KDistEuclidean(player.x-enemy.x, player.y-enemy.y) > 3.5) return false; + } + return true; + }, + persist: (_enemy, _player, _aiData) => {return false;}, + move: (_enemy, _player, _aiData) => {return true;}, + follower: (_enemy, _player, _aiData) => {return true;}, + followsound: (_enemy, _player, _aiData) => {return true;}, + wander_near: (_enemy, _player, _aiData) => {return true;}, + wander_far: (_enemy, _player, _aiData) => {return false;}, + resetguardposition: (_enemy, _player, _aiData) => {return true;}, + attack: (_enemy, _player, _aiData) => {return true;}, + spell: (_enemy, _player, _aiData) => {return true;}, + aftermove: (_enemy, _player, _aiData) => {return false;}, + wanderDelay_long: (_enemy, _aiData) => {return 35 + Math.floor(KDRandom() * 35);}, + wanderDelay_short: (_enemy, _aiData) => {return 15 + Math.floor(KDRandom() * 30);}, + }, + "verylooseguard": { + guard: true, + strictwander: true, + init: (_enemy, _player, _aiData) => {}, + beforemove: (_enemy, _player, _aiData) => {return false;}, + chase: (_enemy, _player, _aiData) => {return true;}, + trackvisibletarget: (_enemy, _player, _aiData) => {return true;}, + persist: (_enemy, _player, _aiData) => {return false;}, + move: (_enemy, _player, _aiData) => {return true;}, + follower: (_enemy, _player, _aiData) => {return true;}, + followsound: (_enemy, _player, _aiData) => {return true;}, + wander_near: (_enemy, _player, _aiData) => {return true;}, + wander_far: (_enemy, _player, _aiData) => {return true;}, + resetguardposition: (_enemy, _player, _aiData) => {return true;}, + attack: (_enemy, _player, _aiData) => {return true;}, + spell: (_enemy, _player, _aiData) => {return true;}, + aftermove: (_enemy, _player, _aiData) => {return false;}, + wanderDelay_long: (_enemy, _aiData) => {return 35 + Math.floor(KDRandom() * 35);}, + wanderDelay_short: (_enemy, _aiData) => {return 15 + Math.floor(KDRandom() * 30);}, + }, + "ambush": { + ambush: true, + ambushtile: 'X', + init: (_enemy, _player, _aiData) => {}, + beforemove: (enemy, _player, aiData) => { + if (aiData.playerDist < (enemy.Enemy?.ambushRadius || 1.5)) enemy.ambushtrigger = true; + return false; + }, + chase: (enemy, _player, _aiData) => {return enemy.ambushtrigger;}, + trackvisibletarget: (enemy, _player, _aiData) => {return enemy.ambushtrigger;}, + persist: (enemy, _player, _aiData) => {return enemy.ambushtrigger;}, + move: (enemy, _player, aiData) => {return enemy.ambushtrigger || (enemy.Enemy.wanderTillSees && !aiData.canSeePlayer);}, + follower: (_enemy, _player, _aiData) => {return true;}, + followsound: (_enemy, _player, _aiData) => {return true;}, + wander_near: (enemy, _player, aiData) => {return (enemy.Enemy.wanderTillSees && !aiData.canSeePlayer);}, + wander_far: (_enemy, _player, _aiData) => {return false;}, + resetguardposition: (_enemy, _player, _aiData) => {return true;}, + attack: (enemy, _player, _aiData) => {return enemy.ambushtrigger;}, + spell: (enemy, _player, _aiData) => {return enemy.ambushtrigger;}, + aftermove: (_enemy, _player, _aiData) => {return false;}, + wanderDelay_long: (_enemy, _aiData) => {return 35 + Math.floor(KDRandom() * 35);}, + wanderDelay_short: (_enemy, _aiData) => {return 10 + Math.floor(KDRandom() * 25);}, + }, +}; diff --git a/Game/src/enemy/KDCommander.ts b/Game/src/enemy/KDCommander.ts new file mode 100644 index 000000000..f8207dba6 --- /dev/null +++ b/Game/src/enemy/KDCommander.ts @@ -0,0 +1,1423 @@ +"use strict"; + +// The commander is designed to direct enemies to spots in order to make the player suffer +// I mean... to promote tactics and fun gameplay + +/** + * Location and location/neighbors + */ +let KDCommanderChokes: Record = null; +let KDUpdateChokes = true; + +/** + * Who is helping the struggler + */ +let KDStruggleAssisters: Record = {}; +/** + * Who is capturing the struggler + */ +let KDCapturers: Record = {}; + + +/** + * Enemy ID and role + */ +let KDCommanderRoles: Map = new Map(); + +let KDCOMMANDERMAXNEIGHBORS = 2; + +let KDChokeTiles = ['d', 'D', 'g', 's', 'S', 'H']; + +/** + * The Commander determines role assignments and orders enemies + * @param delta + */ +function KDCommanderUpdate(delta: number) { + let data: KDCommanderOrderData = { + delta: delta, + aggressive: false, + fleeThresh: 0.6, + VavgWeight: 2, + combat: KinkyDungeonFlags.get("PlayerCombat") > 0, + invalidChoke: {}, + globalIgnore: KinkyDungeonFlags.get("PlayerDommed") && !KDPlayerDeservesPunishment(undefined, KinkyDungeonPlayerEntity), + }; + + //let start = performance.now(); + + KinkyDungeonSendEvent("beforeCommanderTick", data); + + if (!KDCommanderChokes || KDUpdateChokes) { + KDCommanderUpdateChokes(data); + } + + KDCommanderUpdateRoles(data); + KDCommanderUpdateOrders(data); + + //console.log(performance.now() - start); +} + +/** + * Updates the current chokes on the map + * @param data + */ +function KDCommanderUpdateChokes(_data: KDCommanderOrderData) { + + KDMovable = new Map(); + KDSmartMovable = new Map(); + + KDCommanderChokes = {}; + let chokes: Record = {}; + // Identify potential chokes + let hp: boolean, hn: boolean, vp: boolean, vn: boolean = false; + for (let x = 1; x < KDMapData.GridWidth - 1; x++) { + for (let y = 1; y < KDMapData.GridHeight - 1; y++) { + if ( + KDChokeTiles.includes(KinkyDungeonMapGet(x, y)) // is door or grate + ) { + chokes[x+','+y] = {x:x, y: y}; + } + else { + hp = !KDIsSmartMovable(x + 1, y); + hn = !KDIsSmartMovable(x - 1, y); + vp = !KDIsSmartMovable(x, y + 1); + vn = !KDIsSmartMovable(x, y - 1); + if (KDIsSmartMovable(x, y) + && ( + ((!vp && !vn) && ( + (hp && hn) + || ((hp || !KDIsSmartMovable(x + 2, y)) + && (hn || !KDIsSmartMovable(x - 1, y)) + ) + || ((hp || !KDIsSmartMovable(x + 1, y)) + && (hn || !KDIsSmartMovable(x - 2, y)) + ) + )) + || + ((!hp && !hn) && ( + (vp && vn) + || ((vp || !KDIsSmartMovable(x, y + 2)) + && (vn || !KDIsSmartMovable(x, y - 1)) + ) + || ((vp || !KDIsSmartMovable(x, y + 1)) + && (vn || !KDIsSmartMovable(x, y - 2)) + ) + )) + ))// is part of map grid border + { + chokes[x+','+y] = {x:x, y: y}; + } + } + } + } + // 2nd pass + for (let x = 1; x < KDMapData.GridWidth - 1; x++) { + for (let y = 1; y < KDMapData.GridHeight - 1; y++) { + hp = !KDIsSmartMovable(x + 1, y) || chokes[(x+1)+','+(y)] != undefined; + hn = !KDIsSmartMovable(x - 1, y) || chokes[(x-1)+','+(y)] != undefined; + vp = !KDIsSmartMovable(x, y + 1) || chokes[(x)+','+(y+1)] != undefined; + vn = !KDIsSmartMovable(x, y - 1) || chokes[(x)+','+(y-1)] != undefined; + if (KDIsSmartMovable(x, y) + && ( + ((!vp && !vn) && ( + (hp && hn) + )) + || + ((!hp && !hn) && ( + (vp && vn) + )) + ))// is part of map grid border + { + chokes[x+','+y] = {x:x, y: y}; + } + } + } + + // Add any chokes with suitable geometry + let check = (x: number, y: number) => { + return chokes[x+','+y] != undefined + || !KDIsSmartMovable(x, y); + }; + let h = false, v = false, ho = false, vo = false, n = 0; + for (let choke of Object.values(chokes)) { + v = (check(choke.x, choke.y + 1) && check(choke.x, choke.y - 1)); + h = (check(choke.x + 1, choke.y) && check(choke.x - 1, choke.y)); + vo = (KDIsSmartMovable(choke.x, choke.y + 2) && KDIsSmartMovable(choke.x, choke.y - 2)); + ho = (KDIsSmartMovable(choke.x + 2, choke.y) && KDIsSmartMovable(choke.x - 2, choke.y)); + if ( + (v && ho) + || (h && vo) + || KDChokeTiles.includes(KinkyDungeonMapGet(choke.x, choke.y)) + ) { + n = 0; + // Count neighbors. Less is better + if (h && chokes[(choke.x+1)+','+(choke.y)]) n += 1; + if (h && chokes[(choke.x-1)+','+(choke.y)]) n += 1; + if (v && chokes[(choke.x)+','+(choke.y+1)]) n += 1; + if (v && chokes[(choke.x)+','+(choke.y-1)]) n += 1; + if (n <= KDCOMMANDERMAXNEIGHBORS && KDPointWanderable(choke.x, choke.y)) + KDCommanderChokes[choke.x+','+choke.y] = {x: choke.x, y: choke.y, neighbors: n}; + } + + } + + KDUpdateChokes = false; +} +/** + * Updates the current roles of enemies + * @param data + */ +function KDCommanderUpdateRoles(data: KDCommanderOrderData) { + if (data.delta > 0) { + for (let enemy of KDMapData.Entities) { + // Set roles if there isn't one + if (!KDCommanderRoles.get(enemy.id)) { + data.aggressive = KinkyDungeonAggressive(enemy); + let role = KDGetByWeight(KDGetOrdersList(enemy, data)); + if (role && KDCommanderOrders[role]) { + KDCommanderOrders[role].apply(enemy, data); + KDCommanderRoles.set(enemy.id, role); + } + } + } + } +} + + +/** + * Updates the current roles of enemies + * @param data + */ +function KDCommanderUpdateOrders(data: KDCommanderOrderData) { + if (data.delta > 0) { + for (let order of Object.entries(KDCommanderOrders)) { + order[1].global_before(data); + } + + for (let id of KDCommanderRoles.entries()) { + let enemy = KinkyDungeonFindID(id[0]); + if (enemy) { + data.aggressive = KinkyDungeonAggressive(enemy); + let role = KDCommanderOrders[id[1]]; + if (role) { + if (enemy != KinkyDungeonJailGuard() && enemy != KinkyDungeonLeashingEnemy() && KDBoundEffects(enemy) < 4 && role.maintain(enemy, data)) { + if (role.update(enemy, data)) { + KDCommanderRoles.delete(enemy.id); + role.remove(enemy, data); + } + } else { + KDCommanderRoles.delete(enemy.id); + role.remove(enemy, data); + } + } + } + } + + for (let order of Object.entries(KDCommanderOrders)) { + order[1].global_after(data); + } + } +} + +/** + * Updates the current roles of enemies + * @param enemy + * @param data + */ +function KDGetOrdersList(enemy: entity, data: KDCommanderOrderData): Record { + let ret: Record = {}; + for (let obj of Object.keys(KDCommanderOrders)) { + if (KDCommanderOrders[obj].filter(enemy, data)) + ret[obj] = KDCommanderOrders[obj].weight(enemy, data); + } + return ret; +} + +let KDAwareEnemies = 0; +let KDEnemiesTargetingPlayer = 0; + +let KDAssaulters = 0; +let KDAssaulterList = []; +let KDMaxAssaulters = 3; // Only this many enemies will explicitly assault you + +let KDStationedChokepoints = {}; +let KDStationedChokepointsDist = {}; +let KD_Avg_VX = 0; +let KD_Avg_VY = 0; + +let KDCommanderOrders: Record = { + dummy: { + // Dummy for setting global stuff + filter: (_enemy, _data) => {return false;}, + weight: (_enemy, _data) => {return 0;}, + apply: (_enemy, _data) => {}, + + // Role maintenance + maintain: (_enemy, _data) => {return false;}, + remove: (_enemy, _data) => {}, + update: (_enemy, _data) => {}, + + // Global role variables + global_before: ( data) => { + KDAwareEnemies = 0; + KDEnemiesTargetingPlayer = 0; + for (let enemy of KDMapData.Entities) { + if (enemy.aware && KinkyDungeonAggressive(enemy)) { + KDAwareEnemies += 1; + } + if (enemy.aware && KDEnemyHasFlag(enemy, "targ_player")) { + KDEnemiesTargetingPlayer += 1; + } + } + if (data.delta > 0 && KinkyDungeonPlayerEntity.lastx && KinkyDungeonPlayerEntity.lasty) { + KD_Avg_VX = (data.VavgWeight * KD_Avg_VX + (KinkyDungeonPlayerEntity.x - KinkyDungeonPlayerEntity.lastx)) / (1 + data.VavgWeight); + KD_Avg_VY = (data.VavgWeight * KD_Avg_VY + (KinkyDungeonPlayerEntity.y - KinkyDungeonPlayerEntity.lasty)) / (1 + data.VavgWeight); + } + }, + global_after: (_data) => { + + }, + }, + assault: { + // Assault AI basically just beelines the player + // Only a certain number will do this + // Role assignment + filter: (enemy, data) => { + if (data.globalIgnore) return false; + if (enemy.ignore) return false; + if (enemy.IntentAction || !data.aggressive || KDAssaulters > KDMaxAssaulters || !enemy.aware || !KDEnemyHasFlag(enemy, "targ_player") || KDIsImmobile(enemy) || !KDHostile(enemy)) return false; + return (!KDAIType[KDGetAI(enemy)] + || (!KDAIType[KDGetAI(enemy)].guard && (!KDAIType[KDGetAI(enemy)].ambush || enemy.ambushtrigger))); + }, + weight: (enemy, _data) => { + return Math.max(0, 100 - 35 * KDAssaulters - (KDEnemyRank(enemy) * 20)); + }, + apply: (enemy, _data) => { + if (enemy.aware) + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonRemindJailChase" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "CommandAssault") + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), + 7, 7, false, true); + }, + + // Role maintenance + maintain: (enemy, data) => { + if (enemy.ignore) return false; + if (KDAssaulters > KDMaxAssaulters && KDRandom() < 0.2) { + if (!KDEnemyIsTemporary(enemy)) + return false; + } + if (enemy.ignore) return false; + return (!enemy.IntentAction && data.aggressive && enemy.aware && !KinkyDungeonIsDisabled(enemy) && KDHostile(enemy)); + }, + remove: (enemy, _data) => { + if (!KDEnemyIsTemporary(enemy)) { + KDAssaulters -= 1; + if (KDAssaulterList.indexOf(enemy) > -1) + KDAssaulterList.splice(KDAssaulterList.indexOf(enemy), 1); + } + }, + update: (enemy, _data) => { + // Increment the number of assaulters but only if the enemy isnt temporary + if (!KDEnemyIsTemporary(enemy)) { + KDAssaulters += 1; + KDAssaulterList.push(enemy); + } + + // AI control + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + }, + + // Global role variables + global_before: (_data) => { + // Reset the number of assaulters + KDAssaulters = 0; + KDMaxAssaulters = 3; + KDAssaulterList = []; + }, + global_after: (_data) => { + + }, + }, + + defend: { + // Defends the assaulters + // Role assignment + filter: (enemy, data) => { + if (KDAssaulters < 1) return false; + if (data.globalIgnore) return false; + if (enemy.IntentAction || !data.aggressive || enemy.vp == 0 || !KDEnemyHasFlag(enemy, "targ_player")) return false; + return (!KDAIType[KDGetAI(enemy)] + || ((!KDAIType[KDGetAI(enemy)].ambush || enemy.ambushtrigger))); + }, + weight: (_enemy, data) => { + return data.combat ? 24 : 1; + }, + apply: (enemy, _data) => { + if (enemy.aware || enemy.vp > 0.1) + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonRemindJailChase" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "CommandDefend") + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), + 7, 7, false, true); + }, + + // Role maintenance + maintain: (enemy, data) => { + return (!enemy.IntentAction && data.aggressive && KDHostile(enemy) && enemy.vp > 0 && !KinkyDungeonIsDisabled(enemy)); + }, + remove: (_enemy, _data) => {}, + update: (enemy, _data) => { + // AI control + if (enemy.idle && KDAssaulterList.length > 0) { + let target = KDAssaulterList[Math.floor(KDRandom() * KDAssaulterList.length)]; + if (target) { + enemy.gx = target.x; + enemy.gy = target.y; + } + } + KinkyDungeonSetEnemyFlag(enemy, "wander", 5 + Math.round(5 * KDRandom())); + }, + + // Global role variables + global_before: (_data) => {}, + global_after: (_data) => {}, + }, + + guard: { + // Guard AI will try to station at a nearby chokepoint + // Also produces barricades + // Role assignment + filter: (enemy, data) => { + let fort = KinkyDungeonStatsChoice.get("Fortify_Barricade") && KDGetMainFaction() && KDFactionRelation(KDGetFaction(enemy), KDGetMainFaction()) > 0.15; + if (!fort && data.globalIgnore) return false; + let aware = enemy.aware || enemy.vp > 0 || KDGameData.tickAlertTimer || fort; + if (enemy.ignore || (!enemy.aware && KDFactionRelation(KDGetFaction(enemy), KDGetMainFaction())) < -0.09) return false; + if (!enemy.IntentAction && data.aggressive && aware && !KDIsImmobile(enemy) && !KDEnemyHasFlag(enemy, "noGuard")) { + let xx = KinkyDungeonPlayerEntity.x + KD_Avg_VX*4; + let yy = KinkyDungeonPlayerEntity.y + KD_Avg_VY*4; + let d1 = KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y); + let dist = Math.min( + d1, + KDistChebyshev(enemy.x - xx, enemy.y - yy) + ); + // Only if the enemy notices the player or has left their station, and is within a radius + return (d1 > 1.5 + || KDAssaulters >= KDMaxAssaulters + || enemy.hp > enemy.Enemy.maxhp * 0.6) + && (dist < 12 || enemy.aware || enemy.vp > 0 || fort) + && (!KDAIType[KDGetAI(enemy)].ambush || enemy.ambushtrigger) + && (enemy.aware || enemy.x != enemy.gxx || enemy.y != enemy.gyy || fort) + && (!enemy.aware || !KDEnemyIsTemporary(enemy)); + } + return false; + }, + weight: (enemy, _data) => { + let w = 100; + if (enemy.Enemy.tags.minor) w = 200; + else if (enemy.Enemy.tags.elite) w = 40; + else if (enemy.Enemy.tags.miniboss) w = 10; + else if (enemy.Enemy.tags.stageBoss) w = 0; + else if (enemy.Enemy.tags.boss) w = 1; + return (enemy.Enemy.kite || enemy.Enemy.tags?.ranged || enemy.Enemy.tags?.caster) ? w : w*0.3; + }, + apply: (enemy, _data) => { + if (enemy.aware) + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonRemindJailChase" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "CommandBlock") + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), + 7, 7, false, true); + }, + + // Role maintenance + maintain: (enemy, _data) => { + if (enemy.ignore) return false; + let fort = KinkyDungeonStatsChoice.get("Fortify_Barricade") && KDGetMainFaction() && KDFactionRelation(KDGetFaction(enemy), KDGetMainFaction()) > 0.15; + if (!enemy.IntentAction && !(KDEnemyHasFlag(enemy, "noGuard") || KDEnemyHasFlag(enemy, "targ_ally") || KDEnemyHasFlag(enemy, "targ_npc")) + && (KDGameData.tickAlertTimer || fort || KDEnemyHasFlag(enemy, "CMDR_stationed") || KDEnemyHasFlag(enemy, "CMDR_moveToChoke")) + && (!enemy.aware || !KDEnemyIsTemporary(enemy))) { + let xx = KinkyDungeonPlayerEntity.x + KD_Avg_VX*2; + let yy = KinkyDungeonPlayerEntity.y + KD_Avg_VY*2; + let d1 = KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y); + let dist = Math.min( + d1, + KDistChebyshev(enemy.x - xx, enemy.y - yy) + ); + return (d1 > 1.5 + || KDAssaulters >= KDMaxAssaulters + || enemy.hp > enemy.Enemy.maxhp * 0.6) + && enemy != KinkyDungeonLeashingEnemy() + && enemy != KinkyDungeonJailGuard() + && (dist < 24 || enemy.aware || enemy.vp > 0 || fort); + } + return false; + }, + remove: (_enemy, _data) => { + }, + update: (enemy, data) => { + let choke = null; + let fc = KDEnemyHasFlag(enemy, "failChoke"); + let dist = fc ? 14 : 7; + if (enemy.aware || enemy.vp > 0) dist += 10; + let d = 0, dd = 0; + let x = enemy.x; + let y = enemy.y; + + let xx = KinkyDungeonPlayerEntity.x; + let yy = KinkyDungeonPlayerEntity.y; + + let weight_Cdist = 0.7; + let weight_Pdist = 0.4; + + let reset = false; + let rank = KDEnemyRank(enemy); + + + KinkyDungeonSetEnemyFlag(enemy, "dontChase", 2); + KinkyDungeonSetEnemyFlag(enemy, "wander", 5 + Math.round(5 * KDRandom())); + // Look for good chokes first, prioritizing them + if (KDStationedChokepoints[enemy.gx + "," + enemy.gy] != enemy.id && enemy.idle && !KDEnemyHasFlag(enemy, "CMDR_stationed") && !KDEnemyHasFlag(enemy, "CMDR_moveToChoke")) { + + + for (let neighbors = 1; neighbors <= KDCOMMANDERMAXNEIGHBORS; neighbors ++) + for (let X = Math.floor(x - dist); X < Math.ceil(x + dist); X++) + for (let Y = Math.floor(y - dist); Y < Math.ceil(y + dist); Y++) { + if (KDCommanderChokes[X + "," + Y] + && KDCommanderChokes[X + "," + Y].neighbors <= neighbors + ) { + if (!data.invalidChoke[X + ',' + Y]) { + dd = KDistChebyshev(xx - X, yy - Y); + if (dd < 8 + && dd > 1) { + d = weight_Cdist * KDistEuclidean(X - x, Y - y) + weight_Pdist * dd; + if (d < dist && ( + !KDStationedChokepoints[X + "," + Y] + || KDStationedChokepoints[X + "," + Y] == enemy.id + || KDStationedChokepointsDist[X + "," + Y] > d - rank + )) { + choke = KDCommanderChokes[X + "," + Y]; + dist = d; + } + } else { + data.invalidChoke[X + ',' + Y] = true; + } + } + + } + } + + if (choke) { + KDStationedChokepoints[choke.x + "," + choke.y] = enemy.id; + KDStationedChokepointsDist[choke.x + "," + choke.y] = + weight_Cdist * KDistEuclidean(choke.x - enemy.x, choke.y - enemy.y) + + weight_Pdist * KDistChebyshev(choke.x - xx, choke.y - yy) - rank; + enemy.gx = choke.x; + enemy.gy = choke.y; + if (enemy.x == enemy.gx && enemy.y == enemy.gy) { + let t = 5 + Math.round(9 * KDRandom()); + KinkyDungeonSetEnemyFlag(enemy, "CMDR_stationed", t); + KinkyDungeonSetEnemyFlag(enemy, "allowpass", t); + } else { + KinkyDungeonSetEnemyFlag(enemy, "CMDR_moveToChoke", 1 + Math.round(3 * KDRandom())); + //if (!KDEnemyHasFlag(enemy, "blocked")) + //KinkyDungeonSetEnemyFlag(enemy, "blocked", Math.round(2 * KDRandom())); // To assist in pathing + } + } else { + reset = true; + if (!KDEnemyHasFlag(enemy, "failChoke")) { + KinkyDungeonSetEnemyFlag(enemy, "failChoke", 3); + } else { + KinkyDungeonSetEnemyFlag(enemy, "noGuard", 10 + Math.round(9 * KDRandom())); + } + } + } else if (KDCommanderChokes[enemy.gx + "," + enemy.gy]) { + let ddd = weight_Cdist * KDistEuclidean(enemy.gx - enemy.x, enemy.gx - enemy.y) + + weight_Pdist * KDistChebyshev(enemy.gx - xx, enemy.gy - yy); + + if (!KDStationedChokepoints[enemy.gx + "," + enemy.gy] || ddd - rank < KDStationedChokepointsDist[enemy.gx + "," + enemy.gy]) { + KDStationedChokepoints[enemy.gx + "," + enemy.gy] = enemy.id; + KDStationedChokepointsDist[enemy.gx + "," + enemy.gy] = ddd - rank; + } else { + reset = true; + } + } else reset = true; + + if (reset) { + enemy.gx = enemy.x; + enemy.gy = enemy.y; + //KinkyDungeonSetEnemyFlag(enemy, "allowpass", + Math.round(3 * KDRandom())); + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + KinkyDungeonSetEnemyFlag(enemy, "noGuard", 10 + Math.round(9 * KDRandom())); + } + + // Place barricades + if (enemy.Enemy.bound && KDBoundEffects(enemy) < 4 && (!enemy.Enemy.tags?.minor || KDRandom() < 0.25)) { + //let placed = false; + let cpOverride = KinkyDungeonStatsChoice.get("Fortify_Trap"); + let ltOverride = KinkyDungeonStatsChoice.get("Fortify_Barricade") && KDGetMainFaction() && KDFactionRelation(KDGetFaction(enemy), KDGetMainFaction()) > 0.15; + for (let xxx = enemy.x - 1; xxx <= enemy.x + 1; xxx++) { + for (let yyy = enemy.y - 1; yyy <= enemy.y + 1; yyy++) { + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(xxx, yyy)) + && !KinkyDungeonVisionGet(xxx, yyy)) { + let checkpoint = KDStationedChokepointsDist[xxx + ',' + yyy]; + let trap = !KDEffectTileTags(xxx, yyy).trap ? KDGetTrapSpell(enemy, xxx, yyy, checkpoint) : ""; + if (trap && KDRandom() < (checkpoint ? 0.5 : (cpOverride ? 0.03 : 0))) { + //placed = true; + KinkyDungeonCastSpell(xxx, yyy, KinkyDungeonFindSpell(trap, true), enemy, undefined); + } else if (KinkyDungeonNoEnemy(xxx, yyy, true) && !( + KinkyDungeonTilesGet(xxx+','+yyy)?.OL || + KinkyDungeonTilesGet(xxx+','+yyy)?.Jail + )) { + let barricade = KDGetBarricade(enemy, xxx, yyy, checkpoint); + if (barricade && KDRepopQueueGet(KDMapData, xxx, yyy).filter( + (rp) => { + return rp.entity?.Enemy?.name == barricade + || rp.entity.Enemy?.immobile + || rp.entity.Enemy?.tags?.barricade; + } + ).length == 0) { + let en = DialogueCreateEnemy(xxx, yyy, barricade); + if (en) { + //placed = true; + en.faction = KDGetFaction(enemy); + let lt = KDBarricades[barricade].lifetime; + if (lt != undefined) { + if (!ltOverride) { + en.maxlifetime = 50; + en.lifetime = 200; + } + } else if (lt < 9000) { + en.maxlifetime = lt*0.25; + en.lifetime = lt; + } + en.temporary = true; + } + } + } + + } + } + } + } + + + }, + + // Global role variables + global_before: ( data) => { + KDStationedChokepoints = {}; + KDStationedChokepointsDist = {}; + data.invalidChoke = {}; + }, + global_after: (_data) => { + if (KDAssaulters == 0) { + for (let id of KDCommanderRoles.entries()) { + if (id[1] == "guard" && KinkyDungeonFindID(id[0])?.aware) { + KDCommanderRoles.delete(id[0]); + } + } + } + }, + }, + + + flee: { + // Run away!!! + // Role assignment + filter: (enemy, data) => { + if (!enemy.IntentAction + && data.aggressive + && KDIsHumanoid(enemy) + && enemy != KinkyDungeonLeashingEnemy() + && enemy != KinkyDungeonJailGuard() + && !KDIsImmobile(enemy) + && (!KDAIType[KDGetAI(enemy)] + || ((!KDAIType[KDGetAI(enemy)].ambush || enemy.ambushtrigger))) + && (enemy.hp < enemy.Enemy.maxhp * data.fleeThresh || + (KDEnemyRank(enemy) < 1 && !KDEnemyHasFlag(enemy, "targ_player") && KDistChebyshev(enemy.x - KDPlayer().x, enemy.y - KDPlayer().y) < 3)) + && (KDAssaulters > 1 || KDistChebyshev(enemy.x - KDPlayer().x, enemy.y - KDPlayer().y) > 3) + ) return true; + return false; + }, + weight: (_enemy, data) => { + return data.combat ? 100 : 15; + }, + apply: (enemy, _data) => { + if (enemy.aware || enemy.vp > 0.1) { + KinkyDungeonSendDialogue(enemy, + TextGet((KDHelpless(enemy) ? "KinkyDungeonRemindJailPlayHelpless" : "KinkyDungeonRemindJailPlayBrat") + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + Math.floor(KDRandom() * 3)) + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), + 6, 8, false, true); + if (KDEnemyCanTalk(enemy) && (KDHelpless(enemy) || KDBoundEffects(enemy) > 3)) { + if (!KDEnemyHasFlag(enemy, "shoutforhelp")) { + //KinkyDungeonMakeNoise(5 + KDEnemyRank(enemy), enemy.x, enemy.y); + KinkyDungeonMakeNoiseSignal(enemy, 1, true); + KinkyDungeonSetEnemyFlag(enemy, "shoutforhelp", Math.floor((10 - KDEnemyRank(enemy)) * (1 + KDRandom()))); + if (KDCanHearEnemy(KDPlayer(), enemy)) { + KinkyDungeonSendTextMessage(5, TextGet("KDShoutHelp").replace("ENMY", enemy.CustomName || TextGet("Name" + enemy.Enemy.name)), "#ffffff", 1, false, true, undefined, "Ambient"); + } + } + } + } + }, + + // Role maintenance + maintain: (enemy, data) => { + return (!enemy.IntentAction && data.aggressive && KDHostile(enemy) && enemy.vp > 0 && KDEnemyHasFlag(enemy, "targ_player")) + && (KDAssaulters > 1 || KDistChebyshev(enemy.x - KDPlayer().x, enemy.y - KDPlayer().y) > 3); + }, + remove: (_enemy, _data) => {}, + update: (enemy, _data) => { + if (KDIsPlayerTetheredToEntity(KinkyDungeonPlayerEntity, enemy)) KDBreakTether(KinkyDungeonPlayerEntity); + KinkyDungeonSetEnemyFlag(enemy, "runAway", 5 + Math.round(5 * KDRandom())); + }, + + // Global role variables + global_before: (_data) => {}, + global_after: (_data) => {}, + }, + + helpStruggle: { + struggleAssist: true, + // Move toward struggling allies to help them + filter: (enemy, _data) => { + if (!enemy.IntentAction + && KDIsHumanoid(enemy) + && (enemy.attackPoints < 1) + && !enemy.Enemy?.tags?.nohelp + && !KDIsImmobile(enemy) + && KDBoundEffects(enemy) < 4 + && (!enemy.aware || KDAssaulters >= KDMaxAssaulters) + && (!KDAIType[KDGetAI(enemy)] + || ((!KDAIType[KDGetAI(enemy)].ambush || enemy.ambushtrigger))) + && KDNearbyEnemies(enemy.x, enemy.y, enemy.Enemy.visionRadius/2 || 1.5, undefined, true, enemy).some((en) => { + return en != enemy && KDBoundEffects(en) > 1 + && !KDHostile(enemy, en) + && (!KDStruggleAssisters[en.id] || KDStruggleAssisters[en.id] == enemy.id) + && !KDIsImprisoned(en) + && (!KDEntityHasBuffTags(en, "commandword") || enemy.Enemy.unlockCommandLevel > 0) + && !KDIsTileDangerous(en, en.x, en.y, KDMapData) + && KDWillingToHelp(en, enemy) + ; + }) + ) return true; + return false; + }, + weight: (_enemy, data) => { + return data.combat ? 50 : 400; + }, + apply: (enemy, _data) => { + if ((enemy.aware || enemy.vp > 0.1) && KDRandom() < 0.45) + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonRemindJailChase" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "CommandDefend") + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), + 7, 7, false, true); + + }, + + // Role maintenance + maintain: (enemy, _data) => { + if (enemy.idle && !KDNearbyEnemies(enemy.x, enemy.y, enemy.Enemy.visionRadius/2 || 1.5, undefined, true, enemy).some((en) => { + return en != enemy && KDBoundEffects(en) > 1 && !KDHostile(enemy, en) && (!KDStruggleAssisters[en.id] || KDStruggleAssisters[en.id] == enemy.id) + && !KDIsImprisoned(en) + && (!KDEntityHasBuffTags(en, "commandword") || enemy.Enemy.unlockCommandLevel > 0) + && KDWillingToHelp(en, enemy) + ; + })) return false; + return (!enemy.IntentAction + && enemy != KinkyDungeonLeashingEnemy() + && enemy != KinkyDungeonJailGuard() + && (enemy.attackPoints < 1) + && (!enemy.aware || KDAssaulters >= KDMaxAssaulters) + + && KDBoundEffects(enemy) < 4); + }, + remove: (_enemy, _data) => {}, + update: (enemy, _data) => { + if (!KDEnemyHasFlag(enemy, "tickHS")) { + let search = KDNearbyEnemies(enemy.x, enemy.y, 1.5, undefined, true, enemy).filter((en) => { + return en != enemy && KDBoundEffects(en) > 1 && !KDHostile(enemy, en) && (!KDStruggleAssisters[en.id] || KDStruggleAssisters[en.id] == enemy.id) + && !KDIsImprisoned(en) + && (!KDEntityHasBuffTags(en, "commandword") || enemy.Enemy.unlockCommandLevel > 0) + && KDWillingToHelp(en, enemy) + ; + }); + if (search.length == 0) search = KDNearbyEnemies(enemy.x, enemy.y, enemy.Enemy.visionRadius/2 || 1.5, undefined, true, enemy).filter((en) => { + return en != enemy && KDBoundEffects(en) > 1 && !KDHostile(enemy, en) && (!KDStruggleAssisters[en.id] || KDStruggleAssisters[en.id] == enemy.id) + && !KDIsImprisoned(en) + && (!KDEntityHasBuffTags(en, "commandword") || enemy.Enemy.unlockCommandLevel > 0) + && KDWillingToHelp(en, enemy) + ; + }); + if (search.length > 0) { + let help = search[Math.floor(KDRandom() * search.length)]; + if (KDistChebyshev(help.x-enemy.x, help.y-enemy.y) < 1.5) { + enemy.gx = enemy.x; + enemy.gy = enemy.y; + } else { + let point = KinkyDungeonGetNearbyPoint(help.x, help.y, true, undefined, true); + if (point) { + enemy.gx = point.x; + enemy.gy = point.y; + } else { + enemy.gx = help.x; + enemy.gy = help.y; + } + } + + + KDStruggleAssisters[help.id] = enemy.id; + + if (help.hp <= 0.52 && KDistChebyshev(enemy.x - help.x, enemy.y - help.y) < 1.5) + help.hp = 0.6; + } + KinkyDungeonSetEnemyFlag(enemy, "tickHS", 5 + Math.round(5 * KDRandom())); + } + + }, + + // Global role variables + global_before: (_data) => { + let struggleList = JSON.parse(JSON.stringify(KDStruggleAssisters)); + KDStruggleAssisters = {}; + + for (let en of KDMapData.Entities) { + if (struggleList[en.id] != undefined && KDCommanderRoles.get(en.id) + && KDCommanderOrders[KDCommanderRoles.get(en.id)].struggleAssist) { + KDStruggleAssisters[struggleList[en.id]] = en.id; + } + } + }, + global_after: (_data) => {}, + }, + + helpDanger: { + struggleAssist: true, + // Move toward allies in a dangerous spot who cant move, in order to bump them in a safe direction + filter: (enemy, _data) => { + if (!enemy.IntentAction + && KDIsHumanoid(enemy) + && (enemy.attackPoints < 1) + && !enemy.Enemy?.tags?.nohelp + && !KDIsImmobile(enemy) + && KDBoundEffects(enemy) < 4 + && (!enemy.aware || KDAssaulters >= KDMaxAssaulters) + && (!KDAIType[KDGetAI(enemy)] + || ((!KDAIType[KDGetAI(enemy)].ambush || enemy.ambushtrigger))) + && KDNearbyEnemies(enemy.x, enemy.y, enemy.Enemy.visionRadius/1.5 || 1.5, undefined, true, enemy).some((en) => { + return en != enemy && KinkyDungeonIsDisabled(en) && !KDHostile(enemy, en) && (!KDStruggleAssisters[en.id] || KDStruggleAssisters[en.id] == enemy.id) + && !KDIsImprisoned(en) + && KDIsTileDangerous(en, en.x, en.y, KDMapData) + && KDNearbyMapTiles(en.x, en.y, 1.5).some((tile) => { + return (tile.x != en.x || tile.y != en.y) + && !KinkyDungeonEntityAt(tile.x, tile.y) + && KinkyDungeonMovableTilesEnemy.includes(tile.tile) + && !KDIsTileDangerous(en, tile.x, tile.y, KDMapData) + && KDWillingToHelp(en, enemy) + }) + ; + }) + ) return true; + return false; + }, + weight: (_enemy, data) => { + return data.combat ? 50 : 400; + }, + apply: (enemy, _data) => { + if ((enemy.aware || enemy.vp > 0.1) && KDRandom() < 0.45) + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonRemindJailChase" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "CommandDefend") + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), + 7, 7, false, true); + + }, + + // Role maintenance + maintain: (enemy, _data) => { + if (enemy.idle && !KDNearbyEnemies(enemy.x, enemy.y, enemy.Enemy.visionRadius/1.5 || 1.5, undefined, true, enemy).some((en) => { + return en != enemy && KDBoundEffects(en) > 1 && !KDHostile(enemy, en) && (!KDStruggleAssisters[en.id] || KDStruggleAssisters[en.id] == enemy.id) + && !KDIsImprisoned(en) + && (!KDEntityHasBuffTags(en, "commandword") || enemy.Enemy.unlockCommandLevel > 0) + && KDWillingToHelp(en, enemy) + ; + })) return false; + return (!enemy.IntentAction + && enemy != KinkyDungeonLeashingEnemy() + && enemy != KinkyDungeonJailGuard() + && (enemy.attackPoints < 1) + && (!enemy.aware || KDAssaulters >= KDMaxAssaulters) + && KDBoundEffects(enemy) < 4); + }, + remove: (_enemy, _data) => {}, + update: (enemy, _data) => { + if (!KDEnemyHasFlag(enemy, "tickHS")) { + let search = KDNearbyEnemies(enemy.x, enemy.y, 1.5, undefined, true, enemy).filter((en) => { + return en != enemy && KinkyDungeonIsDisabled(en) && !KDHostile(enemy, en) && (!KDStruggleAssisters[en.id] || KDStruggleAssisters[en.id] == enemy.id) + && !KDIsImprisoned(en) + && KDIsTileDangerous(en, en.x, en.y, KDMapData) + && KDWillingToHelp(en, enemy) + && KDNearbyMapTiles(en.x, en.y, 1.5).some((tile) => { + return (tile.x != en.x || tile.y != en.y) + && !KinkyDungeonEntityAt(tile.x, tile.y) + && KinkyDungeonMovableTilesEnemy.includes(tile.tile) + && !KDIsTileDangerous(en, tile.x, tile.y, KDMapData) + }) + ; + }); + if (search.length == 0) search = KDNearbyEnemies(enemy.x, enemy.y, enemy.Enemy.visionRadius/1.5 || 1.5, undefined, true, enemy).filter((en) => { + return en != enemy && KinkyDungeonIsDisabled(en) && !KDHostile(enemy, en) && (!KDStruggleAssisters[en.id] || KDStruggleAssisters[en.id] == enemy.id) + && !KDIsImprisoned(en) + && KDIsTileDangerous(en, en.x, en.y, KDMapData) + && KDWillingToHelp(en, enemy) + && KDNearbyMapTiles(en.x, en.y, 1.5).some((tile) => { + return (tile.x != en.x || tile.y != en.y) + && !KinkyDungeonEntityAt(tile.x, tile.y) + && KinkyDungeonMovableTilesEnemy.includes(tile.tile) + && !KDIsTileDangerous(en, tile.x, tile.y, KDMapData) + }) + ; + }); + KinkyDungeonSetEnemyFlag(enemy, "tickHS", 5 + Math.round(5 * KDRandom())); + if (search.length > 0) { + let help = search[Math.floor(KDRandom() * search.length)]; + if (KDistChebyshev(help.x-enemy.x, help.y-enemy.y) < 1.5) { + enemy.gx = enemy.x; + enemy.gy = enemy.y; + } else { + let point = KinkyDungeonGetNearbyPoint(help.x, help.y, true, undefined, true); + if (point) { + enemy.gx = point.x; + enemy.gy = point.y; + } else { + enemy.gx = help.x; + enemy.gy = help.y; + } + } + + + KDStruggleAssisters[help.id] = enemy.id; + + if (KDistChebyshev(enemy.x - help.x, enemy.y - help.y) < 1.5) { + // Bump! + let en = help; + let potentialTiles = KDNearbyMapTiles(en.x, en.y, 1.5).filter((tile) => { + return (tile.x != en.x || tile.y != en.y) + && (!KinkyDungeonEntityAt(tile.x, tile.y) || ( + KinkyDungeonEntityAt(tile.x, tile.y)?.id == enemy.id) + && KDNearbyMapTiles(enemy.x, enemy.y, 1.5).some((tile2) => { + return (tile2.x != enemy.x || tile2.y != enemy.y) + && !KinkyDungeonEntityAt(tile2.x, tile2.y) + && KinkyDungeonMovableTilesEnemy.includes(tile2.tile) + && !KDIsTileDangerous(enemy, tile2.x, tile2.y, KDMapData) + }) + ) + && KinkyDungeonMovableTilesEnemy.includes(tile.tile) + && !KDIsTileDangerous(en, tile.x, tile.y, KDMapData) + }); + if (potentialTiles.length > 1) { + potentialTiles = potentialTiles.filter((tile) => { + return tile.x != enemy.x || tile.y != enemy.y; + }) + } + if (potentialTiles.length > 0) { + let tileChosen = potentialTiles[Math.floor(potentialTiles.length * KDRandom())]; + if (tileChosen.x == enemy.x && tileChosen.y == enemy.y) { + let MoveFirstTiles = KDNearbyMapTiles(enemy.x, enemy.y, 1.5).filter((tile) => { + return (tile.x != enemy.x || tile.y != enemy.y) + && !KinkyDungeonEntityAt(tile.x, tile.y) + && KinkyDungeonMovableTilesEnemy.includes(tile.tile) + && !KDIsTileDangerous(enemy, tile.x, tile.y, KDMapData) + }); + if (MoveFirstTiles.length > 0) { + + let tile2Chosen = MoveFirstTiles[Math.floor(MoveFirstTiles.length * KDRandom())]; + KDMoveEntity(enemy, tile2Chosen.x, tile2Chosen.y, true); + } + + + } + KDMoveEntity(help, tileChosen.x, tileChosen.y, true); + KinkyDungeonSetEnemyFlag(enemy, "tickHS", 0); + } + return true; + } + } + } + + }, + + // Global role variables + global_before: (_data) => { + let struggleList = JSON.parse(JSON.stringify(KDStruggleAssisters)); + for (let en of KDMapData.Entities) { + if (struggleList[en.id] != undefined && KDCommanderRoles.get(en.id) == 'helpStruggle') { + KDStruggleAssisters[struggleList[en.id]] = en.id; + } + } + }, + global_after: (_data) => {}, + }, + moveToCapture: { + capturer: true, + // Move toward allies in a dangerous spot who cant move, in order to bump them in a safe direction + filter: (enemy, _data) => { + if (!enemy.IntentAction + && KDIsHumanoid(enemy) + && (enemy.attackPoints < 1) + && !enemy.Enemy?.tags?.nohelp + && !enemy.Enemy?.tags?.submissive + && !KDIsImmobile(enemy) + && KDBoundEffects(enemy) < 4 + && (!enemy.aware || KDAssaulters >= KDMaxAssaulters) + && (!KDAIType[KDGetAI(enemy)] + || ((!KDAIType[KDGetAI(enemy)].ambush || enemy.ambushtrigger))) + && KDNearbyEnemies(enemy.x, enemy.y, enemy.Enemy.visionRadius/1.5 || 1.5, enemy, + true).some((en) => { + return en != enemy && KDHelpless(en) && en.hp < 0.52 && KDCanCapturePartyMember(en) + && (!KDCapturers[en.id] || KDCapturers[en.id] == enemy.id); + }) + ) { + let pos = KDGetHighSecLoc(enemy, !KDSelfishLeash(enemy)); + return !!pos; + } + return false; + }, + weight: (_enemy, data) => { + return data.combat ? 0 : 50; + }, + apply: (enemy, _data) => { + if ((enemy.aware || enemy.vp > 0.1) && KDRandom() < 0.45) + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonRemindJail" + + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "Leash") + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), + 7, 7, false, true); + + }, + + // Role maintenance + maintain: (enemy, _data) => { + if (enemy.idle && !KDNearbyEnemies(enemy.x, enemy.y, enemy.Enemy.visionRadius/1.5 || 1.5, enemy, + true).some((en) => { + return en != enemy && KDHelpless(en) && en.hp < 0.52 && KDCanCapturePartyMember(en) + && (!KDCapturers[en.id] || KDCapturers[en.id] == enemy.id); + })) return false; + return (!enemy.IntentAction + && enemy != KinkyDungeonLeashingEnemy() + && enemy != KinkyDungeonJailGuard() + && (enemy.attackPoints < 1) + && (!enemy.aware || KDAssaulters >= KDMaxAssaulters) + && KDBoundEffects(enemy) < 4); + }, + remove: (_enemy, _data) => {}, + update: (enemy, _data) => { + if (!KDEnemyHasFlag(enemy, "tickHS")) { + let search = KDNearbyEnemies(enemy.x, enemy.y, 1.5, enemy, + true).filter((en) => { + return en != enemy && KDHelpless(en) && en.hp < 0.52 && KDCanCapturePartyMember(en) + && (!KDCapturers[en.id] || KDCapturers[en.id] == enemy.id); + }); + if (search.length == 0) search = KDNearbyEnemies(enemy.x, enemy.y, enemy.Enemy.visionRadius/1.5 || 1.5, enemy, + true).filter((en) => { + return en != enemy && KDHelpless(en) && en.hp < 0.52 && KDCanCapturePartyMember(en) + && (!KDCapturers[en.id] || KDCapturers[en.id] == enemy.id); + }) + KinkyDungeonSetEnemyFlag(enemy, "tickHS", 5 + Math.round(5 * KDRandom())); + if (search.length > 0) { + let capturepoint = search[Math.floor(KDRandom() * search.length)]; + if (KDistChebyshev(capturepoint.x-enemy.x, capturepoint.y-enemy.y) < 1.5) { + enemy.gx = enemy.x; + enemy.gy = enemy.y; + } else { + let point = KinkyDungeonGetNearbyPoint(capturepoint.x, capturepoint.y, true, undefined, true); + if (point) { + enemy.gx = point.x; + enemy.gy = point.y; + } else { + enemy.gx = capturepoint.x; + enemy.gy = capturepoint.y; + } + } + + + KDCapturers[capturepoint.id] = enemy.id; + + if (!KDEnemyHasFlag(enemy, "capCD")) + if (KDistChebyshev(enemy.x - capturepoint.x, enemy.y - capturepoint.y) < 1.5) { + KDCaptureNearby(enemy); + KinkyDungeonSetEnemyFlag(enemy, "capCD", 3); + return true; + } + } + } + + }, + + // Global role variables + global_before: (_data) => { + let capturerList = JSON.parse(JSON.stringify(KDCapturers)); + KDCapturers = {}; + for (let en of KDMapData.Entities) { + if (capturerList[en.id] != undefined && KDCommanderRoles.get(en.id) + && KDCommanderOrders[KDCommanderRoles.get(en.id)].capturer) { + KDCapturers[capturerList[en.id]] = en.id; + } + } + }, + global_after: (_data) => {}, + }, +}; + + +/** + * @param enemy + * @param x + * @param y + * @param checkpoint + * @param type + */ +function KDGetBarricade(enemy: entity, x: number, y: number, checkpoint: boolean = false, type: string[] = []): string { + let traps: Record = {}; + let max = 0; + let lvl = KDGetEffLevel(); + if (!checkpoint) return ""; // TODO allow optional + for (let obj of Object.keys(KDBarricades)) { + if (lvl >= KDBarricades[obj].minlevel && KDBarricades[obj].filter(enemy, x, y, checkpoint, type)) { + traps[obj] = KDBarricades[obj].weight(enemy, x, y, checkpoint, type); + if (traps[obj] > max) max = traps[obj]; + } + } + // Cull low level stuff + for (let t of Object.keys(traps)) { + if (traps[t] < max*0.1) traps[t] = 0; + } + return KDGetByWeight(traps); + /*if (enemy.Enemy.tags.robot || enemy.Enemy.tags.cyborg) return "BarricadeRobot"; + if (enemy.Enemy.unlockCommandLevel > 0) return "BarricadeMagic"; + if (enemy.Enemy.Security?.level_tech > 0 || KDRandom() < 0.1 * KDEnemyRank(enemy)) return "BarricadeConcrete"; + return "Barricade";*/ +} + +let KDBarricades: Record = { + "Barricade": { + minlevel: 2, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return !enemy.Enemy.tags.leather && !enemy.Enemy.tags.rope && !enemy.Enemy.tags.slime && !enemy.Enemy.tags.robot && !enemy.Enemy.tags.dollsmith && !enemy.Enemy.tags.cyborg; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 1; + }, + }, + "BarricadeBlastDoor": { + minlevel: 4, + filter: (_enemy, _x, _y, _checkpoint, _type) => { + let altRoom = KDGetAltType(MiniGameKinkyDungeonLevel); + let params = KinkyDungeonMapParams[altRoom?.useGenParams ? altRoom.useGenParams : (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; + if (params?.enemyTags?.includes("oldrobot")) + return true; + return false; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 100; + }, + lifetime: 9999, + }, + "BarricadeRobot": { + minlevel: 4, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return (enemy.Enemy.tags.robot || enemy.Enemy.tags.cyborg) && !enemy.Enemy.tags.oldrobot; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 20; + }, + }, + "BarricadeMagic": { + minlevel: 3, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.mage; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 15; + }, + }, + "BarricadeConcrete": { + minlevel: 7, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.Security?.level_tech > 0 || (MiniGameKinkyDungeonLevel > 3 && KDRandom() < 0.1 * KDEnemyRank(enemy)); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 11; + }, + }, + "BarricadeMetal": { + minlevel: 3, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.metal; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 25; + }, + }, + "ChaoticCrystal": { + minlevel: 2, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.chaos; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 25; + }, + }, + "GiantMushroom": { + minlevel: 1, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.mushroom; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 25; + }, + }, + "BarricadeFire": { + minlevel: 4, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.fire; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 25; + }, + }, + "BarricadeWater": { + minlevel: 1, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.water; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 25; + }, + }, + "BarricadeIce": { + minlevel: 3, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.ice; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 25; + }, + }, + "BarricadeEarth": { + minlevel: 5, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.earth; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 25; + }, + }, + "BarricadeElectric": { + minlevel: 4, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.electric; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 25; + }, + }, + "BarricadeAir": { + minlevel: 1, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.air; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 25; + }, + }, + "BarricadeVine": { + minlevel: 1, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.nature; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 25; + }, + }, + "BarricadeShadowMetal": { + minlevel: 3, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.shadow || enemy.Enemy.tags?.demon; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 11; + }, + }, + "BarricadeShadow": { + minlevel: 2, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.shadow; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 25; + }, + }, +}; + +/** + * @param enemy + * @param x + * @param y + * @param checkpoint + * @param type + */ +function KDGetTrapSpell(enemy: entity, x: number, y: number, checkpoint: boolean = false, type: string[] = []): string { + let traps: Record = {}; + let lvl = KDGetEffLevel(); + for (let obj of Object.keys(KDBoobyTraps)) { + if (lvl >= KDBoobyTraps[obj].minlevel && KDBoobyTraps[obj].filter(enemy, x, y, checkpoint, type)) + traps[obj] = KDBoobyTraps[obj].weight(enemy, x, y, checkpoint, type); + } + return KDGetByWeight(traps); +} + + +let KDBoobyTraps: Record = { + "RuneTrap_Rope": { + minlevel: 1, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.rope || (enemy.Enemy.unlockCommandLevel > 0 && enemy.Enemy.tags?.ropeRestraints); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 15; + }, + }, + "RuneTrap_Belt": { + minlevel: 2, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.leather || (enemy.Enemy.unlockCommandLevel > 0 && enemy.Enemy.tags?.leatherRestraints); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 15; + }, + }, + "RuneTrap_Chain": { + minlevel: 2, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.metal || enemy.Enemy.tags?.conjurer || (enemy.Enemy.unlockCommandLevel > 0 && enemy.Enemy.tags?.chainRestraints) || enemy.Enemy.tags?.magicchain; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 15; + }, + }, + "RuneTrap_Ribbon": { + minlevel: 3, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.ribbon || (enemy.Enemy.unlockCommandLevel > 0 && (enemy.Enemy.tags?.ribbonRestraints || enemy.Enemy.tags?.ribbonRestraintsHarsh)); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 15; + }, + }, + "RuneTrap_Leather": { + minlevel: 1, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.leather || enemy.Enemy.tags?.conjurer || (enemy.Enemy.unlockCommandLevel > 0 && enemy.Enemy.tags?.leatherRestraints && enemy.Enemy.tags?.antiMagic); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 7; + }, + }, + "RuneTrap_Latex": { + minlevel: 1, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.latex || enemy.Enemy.tags?.conjurer || (enemy.Enemy.unlockCommandLevel > 0 && enemy.Enemy.tags?.latexRestraints); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 7; + }, + }, + "RuneTrap_Rubber": { + minlevel: 1, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.latex || enemy.Enemy.tags?.slime || (enemy.Enemy.unlockCommandLevel > 0 && (enemy.Enemy.tags?.latexEncase || enemy.Enemy.tags?.latexEncaseRandom)); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 20; + }, + }, + "RuneTrap_VacCube": { + minlevel: 5, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.latex || (enemy.Enemy.tags?.latexEncase || enemy.Enemy.tags?.latexEncaseRandom); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 7; + }, + }, + "RuneTrap_Slime": { + minlevel: 4, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.alchemist || enemy.Enemy.tags?.slime || (enemy.Enemy.unlockCommandLevel > 0 && (enemy.Enemy.tags?.slimeRestraints || enemy.Enemy.tags?.slimeRestraintsRandom)); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 20; + }, + }, + "RuneTrap_Vine": { + minlevel: 1, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.elf || (enemy.Enemy.unlockCommandLevel > 0 && (enemy.Enemy.tags?.nature || enemy.Enemy.tags?.vineRestraints)); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 20; + }, + }, + "RuneTrap_Bubble": { + minlevel: 1, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.water; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 20; + }, + }, + "RuneTrap_SlimeBubble": { + minlevel: 4, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.slime; + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return 20; + }, + }, + "RuneTrap_LatexSphere": { + minlevel: 5, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.latex && !KinkyDungeonStatsChoice.get("bubbleOptout"); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return KinkyDungeonStatsChoice.get("bubblePref") ? 50 : 5; + }, + }, + "RuneTrap_LatexBall": { + minlevel: 5, + filter: (enemy, _x, _y, _checkpoint, _type) => { + return enemy.Enemy.tags?.latex && !KinkyDungeonStatsChoice.get("bubbleOptout"); + }, + weight: (_enemy, _x, _y, _checkpoint, _type) => { + return KinkyDungeonStatsChoice.get("bubblePref") ? 50 : 5; + }, + }, + + +}; + + +/** + * + * @param en - The enemy being helped + * @param enemy - the helper + * @returns + */ +function KDWillingToHelp(en: entity, enemy: entity) { + return !en.rage && (!KDHostile(en) + || KDFactionRelation(KDGetFaction(en), KDGetFaction(enemy)) + >= Math.max(0.1, KDFactionRelation("Player", KDGetFaction(enemy)))) +} \ No newline at end of file diff --git a/Game/src/enemy/KDCreationScripts.ts b/Game/src/enemy/KDCreationScripts.ts new file mode 100644 index 000000000..3187b5325 --- /dev/null +++ b/Game/src/enemy/KDCreationScripts.ts @@ -0,0 +1,20 @@ +let KDCreationScripts: Record boolean> = { + DragonLair: (entity, coord) => { + // Make the dragon persistent + KDSetSpawnAndWanderAI(KDGetPersistentNPC(entity.id, entity, true), undefined, undefined); + + KDGetPersistentNPC(entity.id, entity, true).special = true; + + let slot = KDGetWorldMapLocation(KDCoordToPoint(entity.homeCoord || coord)); + let res = KDCreateDragonLair(entity, "DragonLair", slot); + + if (res) { + entity.homeCoord = { + mapX: (entity.homeCoord || coord).mapX, + mapY: (entity.homeCoord || coord).mapY, + room: res, + }; + } + return !!res; + } +} \ No newline at end of file diff --git a/Game/src/enemy/KDLeashCondition.ts b/Game/src/enemy/KDLeashCondition.ts new file mode 100644 index 000000000..28e73c0a8 --- /dev/null +++ b/Game/src/enemy/KDLeashCondition.ts @@ -0,0 +1,22 @@ +// Leashconditions are to prevent stuff like bosses from trying to leash you immediately + +interface LeashCondition { + check: (enemy: entity, player: entity) => boolean, +} +let KDLeashConditions: Record = { + dollmakerLeash: { + check: (enemy, player) => { + return !!KinkyDungeonFlags.get("BossUnlocked"); + } + }, + wardenLeash: { + check: (enemy, player) => { + return !!KinkyDungeonFlags.get("BossUnlocked"); + } + }, + fuukaLeash: { + check: (enemy, player) => { + return !!KinkyDungeonFlags.get("BossUnlocked"); + } + }, +} \ No newline at end of file diff --git a/Game/src/enemy/KDLoadoutList.ts b/Game/src/enemy/KDLoadoutList.ts new file mode 100644 index 000000000..1c53ff5cc --- /dev/null +++ b/Game/src/enemy/KDLoadoutList.ts @@ -0,0 +1,423 @@ +'use strict'; + + +let KDLoadouts: Record = { + "guard": { + name: "guard", + tags: ["elite"], + singletag: ["human", "elf", "alchemist", "dragon", "witch", "apprentice", "mummy", "jailer"], + forbidtags: ["submissive", "gagged"], + chance: 0.5, + items: ["RedKey", "BasicLeash"], + }, + "thief": { + name: "thief", + tags: ["human"], + singletag: ["bandit", "bountyhunter"], + forbidtags: ["submissive", "gagged"], + chance: 0.15, + items: ["Pick", "Knife", "DiscPick"], + }, + "thief2": { + name: "thief2", + tags: ["human"], + singletag: ["bandit", "bountyhunter"], + forbidtags: ["submissive", "gagged"], + chance: 0.15, + items: ["Pick", "FlashBomb", "DiscPick",], + }, + "mistress": { + name: "mistress", + tags: ["miniboss"], + singletag: ["human", "elf", "alchemist", "dragon", "witch", "apprentice", "mummy"], + forbidtags: ["submissive", "gagged"], + chance: 0.65, + items: ["RedKey"], + }, + "scientist_I": { + name: "scientist_I", + tags: ["alchemist"], + singletag: ["alchemist"], + forbidtags: ["submissive", "gagged"], + chance: 0.65, + items: ["SmokeBomb"], + }, + "scientist_II": { + name: "scientist_II", + tags: ["alchemist"], + singletag: ["alchemist"], + forbidtags: ["submissive", "gagged"], + chance: 0.5, + items: ["PotionFrigid", "PotionStamina"], + }, + "scientist_III": { + name: "scientist_III", + tags: ["alchemist"], + singletag: ["alchemist"], + forbidtags: ["submissive", "gagged"], + chance: 0.5, + items: ["PotionMana", "FlashBomb"], + }, + "scientist_High": { + name: "scientist_High", + tags: ["alchemist"], + singletag: ["alchemist", "latex"], + singletag2: ["miniboss", "boss"], + forbidtags: ["submissive", "gagged"], + chance: 0.25, + items: ["UniversalSolvent"], + }, + "magus": { + name: "magus", + tags: [], + singletag: ["dressmaker", "elf", "witch", "apprentice", "mummy", "fungal"], + forbidtags: ["submissive", "gagged"], + chance: 0.05, + multiplier: 10, + items: ["BlueKey", "PotionMana", "ScrollVerbal", "ScrollLegs", "ScrollArms"], + }, + "magusElite": { + name: "magusElite", + tags: [], + singletag: ["dressmaker", "elf", "witch", "apprentice", "mummy", "fungal"], + singletag2: ["elite", "miniboss", "boss"], + forbidtags: ["submissive", "gagged"], + chance: 0.6, + multiplier: 10, + items: ["BlueKey", "PotionMana", "PotionMana", "ScrollVerbal", "ScrollLegs", "ScrollArms"], + }, + "scroll_arm": { + name: "scroll_arm", + tags: [], + singletag: ["dressmaker", "elf", "witch", "apprentice", "mummy", "fungal"], + forbidtags: ["submissive", "gagged"], + chance: 0.1, + items: ["ScrollArms"], + }, + "scroll_leg": { + name: "scroll_arm", + tags: [], + singletag: ["dressmaker", "elf", "witch", "apprentice", "mummy", "fungal"], + forbidtags: ["submissive", "gagged"], + chance: 0.1, + items: ["ScrollLegs"], + }, + "scroll_verbal": { + name: "scroll_arm", + tags: [], + singletag: ["dressmaker", "elf", "witch", "apprentice", "mummy", "fungal"], + forbidtags: ["submissive", "gagged"], + chance: 0.1, + items: ["ScrollVerbal"], + }, + "mage": { + name: "mage", + tags: [], + singletag: ["witch", "apprentice", "fungal", "elf", "dressmaker"], + forbidtags: [], + chance: 1.5, + items: ["PotionMana"], + }, + "police": { + name: "police", + tags: ["police"], + singletag: ["human", "bountyhunter"], + forbidtags: ["submissive", "gagged"], + chance: 0.2, + items: ["RedKey", "WristShackles", "BasicLeash"], + }, + "ninja": { + name: "ninja", + tags: [], + singletag: ["ninja", "maid", "bountyhunter"], + forbidtags: [], + chance: 0.7, + items: ["SmokeBomb", "RopeSnakeArmsBoxtie", "DiscPick"], + }, + "bandit_I": { + name: "bandit_I", + tags: [], + singletag: ["bandit"], + forbidtags: [], + chance: 0.3, + items: ["Bomb", "BasicLeash"], + }, + "bandit_II": { + name: "bandit_II", + tags: [], + singletag: ["bandit"], + forbidtags: [], + chance: 0.7, + items: ["Bola", "BasicLeash"], + }, + "bandit_III": { + name: "bandit_III", + tags: ["bandit"], + singletag: ["miniboss", "boss", "elite"], + forbidtags: [], + chance: 0.5, + items: ["PotionStamina", "Bola", "Knife", "DiscPick", "BasicLeash"], + }, + "bandit_IV": { + name: "bandit_IV", + tags: ["bandit"], + singletag: ["miniboss", "boss", "elite"], + forbidtags: [], + chance: 0.5, + multiplier: 5, + items: ["PotionWill", "Bomb", "Rope", "BasicLeash"], + }, + "bandit_V": { + name: "bandit_V", + tags: ["bandit"], + singletag: ["miniboss", "boss"], + forbidtags: [], + chance: 0.1, + multiplier: 10, + items: ["PotionStamina", "RedKey", "RedKey", "DiscPick", "BasicLeash"], + }, + "miner": { + name: "miner", + tags: ["miner"], + singletag: ["miner"], + forbidtags: [], + chance: 1.0, + items: ["Bomb", "Bomb", "Bomb"], + }, + "trainer": { + name: "trainer", + tags: ["trainer"], + singletag: ["trainer"], + forbidtags: [], + chance: 0.4, + items: ["AncientPowerSource", "RedKey", "BasicLeash"], + }, + "nevermere": { + name: "nevermere", + tags: ["nevermere"], + singletag: ["trainer", "wolfgirl"], + forbidtags: ["submissive", "gagged"], + chance: 0.15, + items: ["AncientPowerSource"], + }, + "nevermere2": { + name: "nevermere2", + tags: ["nevermere"], + singletag: ["trainer", "wolfgirl"], + forbidtags: ["submissive", "gagged"], + chance: 0.15, + items: ["FlashBomb"], + }, + "nevermere3": { + name: "nevermere3", + tags: ["nevermere"], + singletag: ["trainer", "wolfgirl"], + forbidtags: ["submissive", "gagged"], + chance: 0.15, + items: ["KeyCard"], + }, + "cyborg": { + name: "cyborg", + tags: ["cyborg"], + singletag: ["jailer"], + forbidtags: [], + chance: 0.30, + items: ["KeyCard"], + }, + "cyborg2": { + name: "cyborg2", + tags: ["cyborg"], + singletag: ["jailer"], + forbidtags: [], + chance: 0.15, + items: ["KeyCard", "AncientPowerSource"], + }, + "nevermerespent": { + name: "nevermerespent", + tags: ["nevermere"], + singletag: ["trainer", "wolfgirl"], + forbidtags: ["submissive", "gagged"], + chance: 0.5, + items: ["AncientPowerSourceSpent"], + }, + "elemental_Fire": { + name: "elemental_Fire", + tags: ["jailer"], + singletag: ["fire"], + forbidtags: [], + chance: 1.0, + items: ["PotionMana"], + }, + "elemental_Ice": { + name: "elemental_Ice", + tags: ["jailer"], + singletag: ["ice"], + forbidtags: [], + chance: 1.0, + items: ["PotionFrigid"], + }, + "elemental_Ice2": { + name: "elemental_Ice2", + tags: ["jailer"], + singletag: ["ice"], + forbidtags: [], + chance: 1.0, + items: ["PotionFrigid", "IceRune"], + }, + "elemental_Water": { + name: "elemental_Water", + tags: ["jailer"], + singletag: ["water"], + forbidtags: [], + chance: 1.0, + items: ["WaterRune"], + }, + "elemental_Earth": { + name: "elemental_Earth", + tags: ["jailer"], + singletag: ["earth"], + forbidtags: [], + chance: 1.0, + items: ["EarthRune"], + }, + "elemental_Rope": { + name: "elemental_Rope", + tags: ["jailer"], + singletag: ["rope"], + forbidtags: [], + chance: 1.0, + items: ["RopeRune"], + }, + "elemental_Air": { + name: "elemental_Air", + tags: ["jailer"], + singletag: ["air"], + forbidtags: [], + chance: 1.0, + items: ["PotionStamina"], + }, + "agent": { + name: "agent", + tags: [], + singletag: ["ninja", "maid", "bountyhunter"], + forbidtags: [], + chance: 0.1, + items: ["SmokeBomb", "PotionInvisibility", "DiscPick", "FlashBomb"], + }, + "ninja_II": { + name: "ninja_II", + tags: [], + singletag: ["ninja", "maid", "bountyhunter"], + forbidtags: [], + chance: 0.3, + items: ["SmokeBomb", "FlashBomb", "DiscPick"], + }, + "religious": { + name: "religious", + tags: ["religious"], + singletag: ["mummy", "elf"], + forbidtags: ["submissive", "gagged"], + chance: 0.01, + items: ["ScrollPurity"], + }, + "religiousElite": { + name: "religiousElite", + tags: ["religious", "elite"], + singletag: ["mummy", "elf"], + forbidtags: ["submissive", "gagged"], + chance: 0.2, + multiplier: 4, + items: ["ScrollPurity", "PotionMana", "BlueKey", "BasicLeash"], + }, + "religiousMiniboss": { + name: "religiousMiniboss", + tags: ["religious", "miniboss"], + singletag: ["mummy", "elf"], + forbidtags: ["submissive", "gagged"], + chance: 0.5, + multiplier: 10, + items: ["ScrollPurity", "PotionMana", "BlueKey", "BasicLeash"], + }, + "religiousBoss": { + name: "religiousBoss", + tags: ["religious", "boss"], + singletag: ["mummy", "elf"], + forbidtags: ["submissive", "gagged"], + chance: 0.8, + multiplier: 10, + items: ["ScrollPurity", "PotionMana", "BlueKey", "BasicLeash"], + }, + "keyholder": { + name: "keyholder", + tags: ["miniboss"], + singletag: ["human", "elf", "alchemist", "dragon", "witch", "apprentice", "mummy", "jailer"], + forbidtags: ["submissive", "gagged"], + chance: 0.22, + multiplier: 2, + items: ["Keyring", "BasicLeash"], + }, + "potMana_minor": { + name: "potMana_minor", + tags: ["jailer"], + singletag: [], + forbidtags: [], + chance: 0.05, + items: ["PotionMana"], + }, + "potStam_minor": { + name: "potStam_minor", + tags: ["jailer"], + singletag: [], + forbidtags: [], + chance: 0.05, + items: ["PotionStamina"], + }, + "potWill_minor": { + name: "potWill_minor", + tags: ["jailer"], + singletag: [], + forbidtags: [], + chance: 0.04, + items: ["PotionWill"], + }, + "potMana": { + name: "potMana", + tags: [], + singletag: ["jailer"], + forbidtags: ["minor"], + chance: 0.1, + items: ["PotionMana"], + }, + "potStam": { + name: "potStam", + tags: ["jailer"], + singletag: [], + forbidtags: ["minor"], + chance: 0.05, + items: ["PotionStamina"], + }, + "potWill": { + name: "potWill", + tags: ["jailer"], + singletag: [], + forbidtags: ["minor"], + chance: 0.04, + items: ["PotionWill"], + }, + "potFrigid": { + name: "potFrigid", + tags: ["jailer"], + singletag: [], + forbidtags: ["minor"], + chance: 0.08, + items: ["PotionFrigid"], + }, + "boss": { + name: "boss", + tags: ["boss"], + singletag: ["human", "elf", "alchemist", "dragon", "witch", "apprentice", "mummy"], + forbidtags: ["submissive", "gagged"], + chance: 1.0, + items: ["RedKey", "Keyring", "BasicLeash"], + }, +}; diff --git a/Game/src/enemy/KDPathConditions.ts b/Game/src/enemy/KDPathConditions.ts new file mode 100644 index 000000000..22989f264 --- /dev/null +++ b/Game/src/enemy/KDPathConditions.ts @@ -0,0 +1,96 @@ +// Pathconditions are conditions for enemies to be able to pass through an npc +// It is added on the npc being pathed + +interface PathCondition { + /** Returns true if the attemptingNPC can path through thisNPC. No side effects. */ + query: (attemptingNPC: entity, thisNPC: entity) => boolean, + /** Returns true if this can be displaced. TODO implement */ + displaceAttempt?: (power: number, thisNPC: entity) => boolean, + /** Returns 1 if the attemptingNPC can pass through thisNPC. Has side effects (like destroying the passthrough NPC) + * if you want the NPC to wait a turn before it can pass through, you can return false but set thisNPC.hp = 0 to destroy it + returns -1 if the entity has been removed and you should NOT try to swap + */ + doPassthrough: (attemptingNPC: entity, thisNPC: entity, mapdata: KDMapDataType) => number, + /** Returns true if this can be displaced. TODO implement */ + doDisplace?: (power: number, thisNPC: entity, mapdata: KDMapDataType) => boolean, +} + +let KDPathConditions : Record = { + barrel: { + query: (attemptingNPC: entity, thisNPC: entity) => { + // Everyone can pass barrels + // Even other barrels + return true; + }, + doPassthrough: (attemptingNPC: entity, thisNPC: entity, mapdata: KDMapDataType) => { + // The barrel simply moves out of the way + return 1; + }, + }, + barricade: { + query: (attemptingNPC: entity, thisNPC: entity) => { + // Everyone can pass barrels + // Even other barrels + return true; + }, + doPassthrough: (attemptingNPC: entity, thisNPC: entity, mapdata: KDMapDataType) => { + // Removes the barricade for 1 turn + if (KDRemoveEntity(thisNPC, false, false, true) + && !KDEnemyIsTemporary(thisNPC)) { + KDAddRepopQueue({ + x: thisNPC.x, + y: thisNPC.y, + time: 1, + entity: thisNPC, + }, mapdata); + } + return -1; + }, + }, + stonedoor: { + query: (attemptingNPC: entity, thisNPC: entity) => { + // Only Ranks 3 and above can pass through, or leashers + return KDEnemyRank(attemptingNPC) >= 3 + || KinkyDungeonJailGuard()?.id == attemptingNPC.id + || KinkyDungeonLeashingEnemy()?.id == attemptingNPC.id; + }, + doPassthrough: (attemptingNPC: entity, thisNPC: entity, mapdata: KDMapDataType) => { + // Removes the door but adds it to the map's 'repopulate' queue after 5 turns + if (KDRemoveEntity(thisNPC, false, false, true) + && !KDEnemyIsTemporary(thisNPC)) { + KDAddRepopQueue({ + x: thisNPC.x, + y: thisNPC.y, + time: 5, + entity: thisNPC, + }, mapdata); + } + return 0; + }, + }, + blastdoor: { + query: (attemptingNPC: entity, thisNPC: entity) => { + // Only Ranks 3 and above can pass through, or robots/cyborgs/dollsmiths/wolfgirls, or leashers + return (KDEnemyRank(attemptingNPC) >= 3 + || attemptingNPC.Enemy?.tags.robot + || attemptingNPC.Enemy?.tags.trainer + || attemptingNPC.Enemy?.tags.cyborg + || attemptingNPC.Enemy?.tags.dollsmith) + || KinkyDungeonJailGuard()?.id == attemptingNPC.id + || KinkyDungeonLeashingEnemy()?.id == attemptingNPC.id; + }, + doPassthrough: (attemptingNPC: entity, thisNPC: entity, mapdata: KDMapDataType) => { + // Removes the door but adds it to the map's 'repopulate' queue after 5 turns + if (KDRemoveEntity(thisNPC, false, false, true) + && !KDEnemyIsTemporary(thisNPC)) { + KDAddRepopQueue({ + x: thisNPC.x, + y: thisNPC.y, + time: 5, + entity: thisNPC, + }, mapdata); + } + return 0; + }, + }, +}; \ No newline at end of file diff --git a/Game/src/enemy/KDPersistence.ts b/Game/src/enemy/KDPersistence.ts new file mode 100644 index 000000000..6445df775 --- /dev/null +++ b/Game/src/enemy/KDPersistence.ts @@ -0,0 +1,893 @@ + +interface KDPersistentNPC { + Name: string, + id: number, + entity: entity, + /** the 'true form' of an NPC, stored and used only by scripts */ + trueEntity?: entity, + mapX: number, mapY: number, + room: string, + /** NPC is captured by enemies and therefore cannot be affected */ + captured: boolean, + /** Preferential capture here */ + captureFaction?: string, + /** Preferential capture here */ + captureCaptor?: number, + /** NPC is in collection currently. Set to false when spawned out of collection. Otherwise set to true only when adding to the collection.*/ + collect: boolean, + opinion: number, + /** If true, the NPC is here to stay */ + jailed?: boolean, + /** NPC is special and should remain persistent instead of being deleted */ + special?: boolean, + /** NPC will NOT get deleted with NG+ */ + permanent?: boolean, + /** NPC is very skilled and will never be captured */ + alwaysEscape?: boolean, + /** Wandering AI type, for moving between floors */ + wanderAI?: string, + /** Spawn AI type, for setting goals and AI*/ + spawnAI?: string, + /** Special scripting */ + specialScript?: string, + + /** Visual */ + outfit?: string, + hairstyle?: string, + bodystyle?: string, + facestyle?: string, + cosplaystyle?: string, + Palette?: string, + + storedParty?: entity[], + persistentParty?: number[], + partyLeader?: number, + + spawned?: boolean, + + /** 0 = start, 1 = end, 2 = shortcut */ + fromType?: number, + /** Shortcut index */ + fromIndex?: string, + + nextWanderTick?: number, + nextSpawnTick?: number, + nextScriptTick?: number, + + data?: PersistentNPCData, +} + +interface PersistentNPCData { + wanderTarget?: WorldCoord, + MaidKnightHeavyID?: number, + MaidKnightLightID?: number, +} + +/** Returns whether or not the NPC was found and data was successfully pushed */ +function KDPersistentAddData(id: number, key: string, data: any): boolean { + let npc = KDPersistentNPCs[id]; + if (npc) { + if (!npc.data) { + npc.data = {}; + } + npc.data[key] = data; + return true; + } + return false; +} + +function KDPersistentGetData(id: number, key: string): any { + let npc = KDPersistentNPCs[id]; + if (npc) { + if (npc.data) { + return npc.data[key]; + } + } + return undefined; +} + + +interface WorldCoord { + mapX: number, + mapY: number, + room: string, +} + +function KDGetEnemyStoredParty(partyid: number): entity[] { + let npc = KDIsNPCPersistent(partyid) ? KDGetPersistentNPC(partyid) : undefined; + if (npc) { + return npc.storedParty || []; + } + return []; +} +function KDGetEnemyPersistentParty(partyid: number): entity[] { + let npc = KDIsNPCPersistent(partyid) ? KDGetPersistentNPC(partyid) : undefined; + if (npc) { + return npc.persistentParty?.filter((id) => { + return KDIsNPCPersistent(id); + }).map((id) => { + return KDGetGlobalEntity(id); + }) || []; + } + return []; +} +function KDGetEnemyStoredPartyIDs(partyid: number): number[] { + let npc = KDIsNPCPersistent(partyid) ? KDGetPersistentNPC(partyid) : undefined; + if (npc) { + return npc.storedParty?.map((en) => {return en.id;}) || []; + } + return []; +} +function KDGetEnemyPersistentPartyIDs(partyid: number): number[] { + let npc = KDIsNPCPersistent(partyid) ? KDGetPersistentNPC(partyid) : undefined; + if (npc) { + return npc.persistentParty?.filter((id) => { + return KDIsNPCPersistent(id); + }) || []; + } + return []; +} +function KDGetEnemyParty(partyid: number): entity[] { + return [...KDGetEnemyPersistentParty(partyid), ...KDGetEnemyStoredParty(partyid)]; +} +function KDGetEnemyPartyIDs(partyid: number): number[] { + return [...KDGetEnemyPersistentPartyIDs(partyid), ...KDGetEnemyStoredPartyIDs(partyid)]; +} +function KDNPCInParty(pmid: number, partyid: number): boolean { + let npc = KDGetPersistentNPC(partyid, undefined, false); + if (KDIsNPCPersistent(pmid)) { + if (npc.persistentParty) { + return npc.persistentParty.includes(pmid); + } + } else { + if (npc.storedParty) { + return npc.storedParty.some((pm) => {return pm.id == pmid;}); + } + } + return false; +} +function KDStoreEnemyPartyMember(enemy: entity, partyid: number, location?: WorldCoord): boolean { + if (!enemy) return false; + let npc = KDGetPersistentNPC(partyid, + undefined, undefined, location + ); + if (npc) { + if (KDIsNPCPersistent(enemy.id)) { + if (!npc.persistentParty) npc.persistentParty = []; + + if (!npc.persistentParty.some((pm) => {return enemy.id == pm;})) { + npc.persistentParty.push(enemy.id); + KDGetPersistentNPC(enemy.id).partyLeader = partyid; + enemy.partyLeader = partyid; + return true; + } + } else { + if (!npc.storedParty) npc.storedParty = []; + + if (!npc.storedParty.some((pm) => {return enemy.id == pm.id;})) { + npc.storedParty.push(enemy); + enemy.partyLeader = partyid; + return true; + } + } + } + return false; +} +function KDPopEnemyPartyMember(pmid: number, partyid: number, freeFromParty?: boolean): entity { + let npc = KDIsNPCPersistent(partyid) ? KDGetPersistentNPC(partyid) : undefined; + if (npc) { + if (KDIsNPCPersistent(pmid)) { + if (!npc.persistentParty || npc.persistentParty.length == 0) return null; + let index = pmid ? npc.persistentParty.findIndex((pm) => {return pmid == pm;}) : 0; + if (index >= 0) { + let id = npc.persistentParty.splice(index, 1)[0]; + let pnpc = KDGetPersistentNPC(id); + pnpc.partyLeader = undefined; + let en = KDGetGlobalEntity(id); + if (freeFromParty) en.partyLeader = undefined; + return en; + } + } else { + if (!npc.storedParty || npc.storedParty.length == 0) return null; + let index = pmid ? npc.storedParty.findIndex((pm) => {return pmid == pm.id;}) : 0; + if (index >= 0) { + let en = npc.storedParty.splice(index, 1)[0]; + if (freeFromParty) en.partyLeader = undefined; + return en; + } + } + + } + return null; +} + +/** Despawns all party members belonging to the party ID */ +function KDDespawnParty(partyid: number, mapData: KDMapDataType) { + let pleader = KinkyDungeonFindID(partyid, mapData); + for (let en of mapData.Entities) { + if (en.partyLeader == partyid + && (!KDHelpless(en) + || KDistChebyshev(en.x - KDPlayer().x, en.y - KDPlayer().y) > 16) + && KDEnemyCanDespawn(en.id, mapData, + pleader ? KDistChebyshev(en.x - pleader.x, en.y - pleader.y) : undefined)) { + KDRemoveEntity(en, false, false, true, undefined, mapData); + } + } +} +/** Helper function to avoid repetition. Returns true if success*/ +function KDChangeParty(pmid: number, partyid: number): boolean { + let en = KDGetGlobalEntity(pmid); + if (en) { + let npc = KDGetPersistentNPC(partyid, undefined, true); + if (npc) { + if (en.partyLeader) { + KDPopEnemyPartyMember(pmid, partyid, true); + } + KDStoreEnemyPartyMember(en, npc.id, KDGetNPCLocation(npc.id)); + } + + + } + return false; +} + +function KDIsPartyLeaderCapturedOrGone(partyid: number) { + let npc = KDGetPersistentNPC(partyid, undefined, true); + if (npc) { + return npc.captured || KDIsImprisoned(KDGetGlobalEntity(partyid)); + } + return true; +} + + +function KDIsInEnemyParty(entity: entity) { + if (entity.partyLeader) { + let npc = KDGetPersistentNPC(entity.partyLeader, undefined, true); + if (npc) { + return true; + } + } + + return false; +} + +function KDPurgeParty(partyid: number) { + // Disbands a party + let npc = KDGetPersistentNPC(partyid, undefined, true); + if (npc) { + let party = KDGetEnemyPartyIDs(partyid); + for (let p of party) { + let en = KDPopEnemyPartyMember(p, partyid, true); + if (en && (!en.homeCoord)) { + en.goToDespawn = true; + } + } + KDPurgePartyGlobal(partyid); + } +} + +function KDPersistentWatch() { + let slot = KDGetWorldMapLocation(KDCoordToPoint(KDGetCurrentLocation())); + if ((!slot.main && !KDMapData.RoomType) || KDMapData.RoomType == slot.main) { + KDWatchMainPersistent(); + } + +} + +function KDWatchMainPersistent() { + // Maid knight + if (KDGameData.MaidKnightFloor == undefined || KDGameData.MaidKnightFloor == MiniGameKinkyDungeonLevel) { + KDGameData.MaidKnightFloor = MiniGameKinkyDungeonLevel; + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (!point) { + KDGameData.MaidKnightFloor++; + if (KDGameData.MaidKnightFloor % KDLevelsPerCheckpoint == 0) KDGameData.MaidKnightFloor++; + return; + } + let nearpoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, true); + if (!nearpoint) { + KDGameData.MaidKnightFloor++; + if (KDGameData.MaidKnightFloor % KDLevelsPerCheckpoint == 0) KDGameData.MaidKnightFloor++; + return; + } + let en = DialogueCreateEnemy(point.x, point.y,"MaidKnightHeavy"); + if (en) { + KinkyDungeonSetEnemyFlag(en, "leader", -1); + if (!KDProcessCustomPatron(en.Enemy, en, 0.2, true)) + KDMakePersistent(en, undefined, true); + KDRunCreationScript(en, KDGetCurrentLocation()); + } + let en2 = DialogueCreateEnemy(nearpoint.x, nearpoint.y,"MaidKnightLight"); + if (en2) { + KinkyDungeonSetEnemyFlag(en2, "led", -1); + if (!KDProcessCustomPatron(en2.Enemy, en2, 0.2, true)) + KDMakePersistent(en2, undefined, true); + KDRunCreationScript(en2, KDGetCurrentLocation()); + en2.master = { + range: 4.5, + loose: true, + type: "MaidKnightHeavy", + aggressive: true, + }; + } + if (en && en2) { + let npc = KDGetPersistentNPC(en.id); + let npc2 = KDGetPersistentNPC(en2.id); + if (!npc.data) npc.data = {}; + if (!npc2.data) npc2.data = {}; + npc.data.MaidKnightHeavyID = npc.id; + npc2.data.MaidKnightHeavyID = npc.id; + npc.data.MaidKnightLightID = npc2.id; + npc2.data.MaidKnightLightID = npc2.id; + } + } +} + + +function KDMakePersistent(e: entity, custom: any, special: boolean = true) { + let npc = KDGetPersistentNPC(e.id, e, true); + KDSetSpawnAndWanderAI(npc, custom?.spawnAI, custom?.wanderAI); + KDSetSpecialScript(npc, custom?.specialScript); + if (special) + npc.special = true; + if (custom?.name) + KDGameData.NamesGenerated[custom.name] = e.id; +} +function KDPurgePartyGlobal(pid: number) { + for (let v of Object.values(KDWorldMap)) { + if (v.data) { + for (let d of Object.values(v.data)) { + if (d?.Entities) { + for (let en of d.Entities) { + if (en.partyLeader == pid) { + delete en.partyLeader; + if (!en.homeCoord || + (en.homeCoord.mapX != d.mapX + || en.homeCoord.mapY != d.mapY + || en.homeCoord.room != d.RoomType + ) + ) { + en.goToDespawn = true; + } + } + } + } + } + } + } +} + +/** Gets all party members on this level */ +function KDGetPartyOnLevel(partyid: number, spawnedOnly: boolean): entity[] { + let party = KDGetEnemyParty(partyid); + let loc = KDGetCurrentLocation(); + + return party.filter((en) => { + return (!spawnedOnly && KDIsNPCPersistent(en.id) && KDCompareLocation(KDGetNPCLocation(en.id), loc)) + || KinkyDungeonFindID(en.id) + }); +} +/** Gets all party members on a specific coord */ +function KDGetPartyAtCoord(partyid: number, spawnedOnly: boolean, coord: WorldCoord): entity[] { + let party = KDGetEnemyParty(partyid); + let mapData = KDGetMapData(coord); + + return party.filter((en) => { + return (KDIsNPCPersistent(en.id) + && (!spawnedOnly || KDGetPersistentNPC(en.id).spawned) + && KDCompareLocation(KDGetNPCLocation(en.id), coord)) + || (mapData && KinkyDungeonFindID(en.id, mapData)) + }); +} + + +function KDMovePersistentNPC(id: number, coord: WorldCoord): boolean { + let PNPC = KDPersistentNPCs[id]; + if (PNPC) { + let oldCoord: WorldCoord = { + room: PNPC.room, + mapX: PNPC.mapX, + mapY: PNPC.mapY, + }; + + + let altered = false; + if (PNPC.mapX != coord.mapX) { + altered = true; + PNPC.mapX = coord.mapX; + } + if (PNPC.mapY != coord.mapY) { + altered = true; + PNPC.mapY = coord.mapY; + } + if (PNPC.room != coord.room) { + altered = true; + PNPC.room = coord.room; + } + + if (altered) { + PNPC.spawned = false; + if (PNPC.persistentParty) { + for (let pmid of PNPC.persistentParty) { + if (KDCompareLocation(oldCoord, KDGetNPCLocation(pmid))) { + // Move with them if they are in same slot, otherwise dont + let npc = KDGetPersistentNPC(pmid); + npc.spawned = false; + npc.room = coord.room; + npc.mapY = coord.mapY; + npc.mapX = coord.mapX; + } + } + } + // Force both caches to refresh + if (KDGameData.PersistentNPCCache) { + delete KDGameData.PersistentNPCCache[coordHash(oldCoord)]; + delete KDGameData.PersistentNPCCache[coordHash(coord)]; + } + } + return altered; + } + + return false; +} + +function coordHash(coord: WorldCoord) { + return coord.room + ',' + coord.mapX + ',' + coord.mapY; +} + +let KDPersistentNPCs: {[_ : string]: KDPersistentNPC} = {}; + +/** A 'graveyard' so to speak to store all NPCs which have been removed so they get deleted when spawned*/ +let KDDeletedIDs: {[_ : string]: number} = {}; + + +function KDGetPersistentNPCCache(coord: WorldCoord): number[] { + if (!KDGameData.PersistentNPCCache) KDGameData.PersistentNPCCache = {}; + if (KDGameData.PersistentNPCCache[coordHash(coord)]) { + return KDGameData.PersistentNPCCache[coordHash(coord)]; + } + let ret = KDGetPersistentNPCInlevel(coord); + + KDGameData.PersistentNPCCache[coordHash(coord)] = ret; + + return ret; +} + + +function KDGetPersistentNPCInlevel(coord: WorldCoord): number[] { + let ids: number[] = []; + for (let npc of Object.values(KDPersistentNPCs)) { + if (npc.mapX == coord.mapX && npc.mapY == coord.mapY && npc.room == coord.room) { + ids.push(npc.id); + } + } + + return ids; +} + +/** + * Syncs a persistent NPC with the world entity, if present + * force param makes it make the NPC persistent if desired + */ +function KDUpdatePersistentNPC(id: number, force: boolean = false) { + if (KDPersistentNPCs[id] || (force && KDGetPersistentNPC(id))) { + let enemy = KinkyDungeonFindID(id); + if (enemy) { + let entry = KDPersistentNPCs[id]; + entry.entity = enemy; + + let value = KDGameData.Collection[enemy.id + ""]; + if (value) { + // Mirror mirror in the collection + // Who is the cutest of them all... + entry.outfit = value.outfit; + entry.hairstyle = value.hairstyle; + entry.bodystyle = value.bodystyle; + entry.facestyle = value.facestyle; + entry.cosplaystyle = value.cosplaystyle; + + if (entry.entity.personality != undefined) + value.personality = entry.entity.personality; + else if (value.personality != undefined) + entry.entity.personality = value.personality; + } + + KDMovePersistentNPC(id, KDGetCurrentLocation()); + + if (enemy.opinion == undefined && KDGameData.Collection[id]?.Opinion != undefined) { + enemy.opinion = KDGameData.Collection[id].Opinion; + } + } + } +} + +/** + * Syncs a persistent NPC with the world entity, in reverse, updating the entity from the persistent one + */ +function KDRefreshPersistentNPC(id: number) { + if (KDPersistentNPCs[id]) { + let enemy = KinkyDungeonFindID(id); + if (enemy) { + let entry = KDPersistentNPCs[id]; + KDMapData.Entities[KDMapData.Entities.indexOf(enemy)] = entry.entity; + } + } +} + +function KDGetGlobalEntity(id: number): entity { + if (id == -1) return KDPlayer(); + let entity = KinkyDungeonFindID(id); + if (entity) return entity; + if (KDIsNPCPersistent(id)) + return KDGetPersistentNPC(id).entity; + return undefined; +} + +function KDIsNPCPersistent(id: number): boolean { + return KDPersistentNPCs[id] != undefined; +} + +function KDGetPersistentNPC(id: number, entity?: entity, force: boolean = true, location?: WorldCoord, special?: boolean): KDPersistentNPC { + let addToParty = 0; + let addMember: entity = null; + if (!KDPersistentNPCs[id] && force) { + + let enemy = entity || KinkyDungeonFindID(id); + if (enemy) { + if (enemy.partyLeader) { + if (KDPopEnemyPartyMember(enemy.id, enemy.partyLeader)) { + addToParty = enemy.partyLeader; + } + + } + let entry: KDPersistentNPC = { + Name: enemy.CustomName || KDGenEnemyName(enemy), + id: enemy.id, + entity: enemy, + mapX: location ? location.mapX : KDCurrentWorldSlot.x, + mapY: location ? location.mapY : KDCurrentWorldSlot.y, + room: location ? location.room : KDGameData.RoomType, + collect: false, + captured: false, + opinion: enemy.opinion || 0, + + // Mirror mirror in the collection + // Who is the cutest of them all... + outfit: KDGameData.Collection[enemy.id + ""]?.outfit, + hairstyle: KDGameData.Collection[enemy.id + ""]?.outfit, + bodystyle: KDGameData.Collection[enemy.id + ""]?.bodystyle, + facestyle: KDGameData.Collection[enemy.id + ""]?.facestyle, + cosplaystyle: KDGameData.Collection[enemy.id + ""]?.cosplaystyle, + }; + if (special || enemy.Enemy?.special) entry.special = true; + KDPersistentNPCs[enemy.id] = entry; + if (addToParty) + addMember = enemy; + KDUpdatePersistentNPC(id); + } + } + if (addToParty && addMember) { + KDStoreEnemyPartyMember(addMember, addToParty, location); + KDUpdatePersistentNPC(id); + } + return KDPersistentNPCs[id]; +} + +function KDGetCurrentLocation(): WorldCoord { + return { + mapX: KDCurrentWorldSlot.x, + mapY: KDCurrentWorldSlot.y, + room: KDGameData.RoomType, + }; +} +function KDGetNPCLocation(id: number): WorldCoord { + let npc = KDPersistentNPCs[id]; + if (npc) { + return { + mapX: npc.mapX, + mapY: npc.mapY, + room: npc.room, + }; + } + return undefined; +} +/** Returns true if they are the same */ +function KDCompareLocation(loc1: WorldCoord, loc2: WorldCoord): boolean { + if (loc1.mapX != loc2.mapX) return false; + if (loc1.mapY != loc2.mapY) return false; + if (loc1.room != loc2.room) return false; + return true; +} + +function KDRepopulatePersistentNPCs() { + let jp = KDMapData.JailPoints.filter( + (p) => { + if (p.requireLeash) return false; + // For now only furniture spawns prisoners + if (!KinkyDungeonTilesGet(p.x + ',' + p.y).Furniture) return false; // requireFurniture + if (KinkyDungeonEntityAt(p.x, p.y)) return false; + return true; + } + ); + // Suffle + let jailPoints: KDJailPoint[] = []; + if (jp.length > 0) { + while(jp.length > 0) { + let index = Math.floor(jp.length * KDRandom()); + jailPoints.push(jp[index]); + jp.splice(index, 1); + } + } + + let count = 0; + let maxCount = jailPoints.length * 0.7; + for (let point of jailPoints) { + if (KDRandom() < 0.7) { + SetpieceSpawnPrisoner(point.x, point.y, true); + count++; + if (count >= maxCount) break; + } + } +} + + +function KDSpawnPersistentNPCs(coord: WorldCoord, searchEntities: boolean): number[] { + let spawned: number[] = []; + + let slot = KDGetWorldMapLocation({x: coord.mapX, y: coord.mapY}); + if (!slot) return spawned; // We dont generate new ones + let data = slot.data[coord.room]; + if (!data) return spawned; // We dont generate new ones + let cache = KDGetPersistentNPCCache(coord); + + + + if (cache.length > 0) { + // only spawn NPCs that are in the level + for (let id of cache) { + let PNPC = KDGetPersistentNPC(id, undefined, false); + if (PNPC && !PNPC.spawned) { + let spawnAI = PNPC.spawnAI || "Default"; + let AI = KDPersistentSpawnAIList[spawnAI]; + if (AI && AI.filter(id, data)) { + if (AI.chance(id, data) > KDRandom()) { + if (AI.doSpawn(id, data, searchEntities ? KinkyDungeonFindID(id, data) : undefined)) { + PNPC.nextSpawnTick = AI.cooldown + KinkyDungeonCurrentTick; + } + } + } + } + } + } + + return spawned; +} + +function KDRunPersistentNPCScripts(coord: WorldCoord, searchEntities: boolean): number[] { + let spawned: number[] = []; + + let slot = KDGetWorldMapLocation({x: coord.mapX, y: coord.mapY}); + if (!slot) return spawned; // We dont generate new ones + let data = slot.data[coord.room]; + let cache = KDGetPersistentNPCCache(coord); + + + + if (cache.length > 0) { + // only spawn NPCs that are in the level + for (let id of cache) { + let PNPC = KDGetPersistentNPC(id, undefined, false); + if (PNPC) { // && !PNPC.spawned + let specialScript = PNPC.specialScript || ""; + let AI = KDPersistentScriptList[specialScript]; + if (AI && AI.filter(id, data)) { + if (AI.chance(id, data) > KDRandom()) { + if (AI.doScript(id, data, searchEntities ? KinkyDungeonFindID(id, data) : undefined)) { + PNPC.nextScriptTick = AI.cooldown + KinkyDungeonCurrentTick; + } + } + } + } + } + } + + return spawned; +} + + +function KDWanderPersistentNPCs(coord: WorldCoord, searchEntities: boolean): number[] { + let spawned: number[] = []; + + let slot = KDGetWorldMapLocation({x: coord.mapX, y: coord.mapY}); + if (!slot) return spawned; // We dont generate new ones + let data = slot.data[coord.room]; + let cache = KDGetPersistentNPCCache(coord); + + + + if (cache.length > 0) { + // only spawn NPCs that are in the level + for (let id of cache) { + let PNPC = KDGetPersistentNPC(id, undefined, false); + // Only wander if the party leader isnt on the floor + if (PNPC && (!PNPC.partyLeader || !cache.includes(PNPC.partyLeader))) { // && !PNPC.spawned + let wanderAI = PNPC.wanderAI || "GoToMain"; + let AI = KDPersistentWanderAIList[wanderAI]; + if (AI && AI.filter(id, data)) { + if (AI.chance(id, data) > KDRandom()) { + if (AI.doWander(id, data, searchEntities ? KinkyDungeonFindID(id, data) : undefined)) { + PNPC.nextWanderTick = AI.cooldown + KinkyDungeonCurrentTick; + } + } + } + } + } + } + + return spawned; +} + +/** Captured by NOT PLAYER */ +function KDGetCapturedPersistent(Level: number, RoomType: string, MapMod: string, faction: string): KDPersistentNPC[] { + let altType = KDGetAltType(Level, MapMod, RoomType); + let mapFaction = faction || altType?.faction || KDMapMods[MapMod ? MapMod : KDGameData.MapMod]?.faction; + + if (!mapFaction) mapFaction = ""; // Default to no faction + + let capturedPersistent = Object.values(KDPersistentNPCs).filter((npc) => { + return npc.captured && !npc.jailed && !npc.collect; + }); + let eligible: KDPersistentNPC[] = []; + let eligible_faction: KDPersistentNPC[] = []; + for (let npc of capturedPersistent) { + let oldEnemy = npc.entity.Enemy; + if (typeof npc.entity.Enemy == "string") { + // This is to prevent crash but also reduce memory footprint + npc.entity.Enemy = KinkyDungeonGetEnemyByName(npc.entity.Enemy); + }else if (!npc.entity.Enemy.maxhp) { + KDUnPackEnemy(npc.entity); + } + if (!KinkyDungeonFindID(npc.id)) { + if (KDPersonalAlt[KDMapData.RoomType]?.OwnerNPC) { + if (KDPersonalAlt[KDMapData.RoomType]?.OwnerNPC == npc.captureCaptor + // Can assign an ownerfaction as well to spawn faction based captures here, + // e.g. witch lab owned by one witch + || KDPersonalAlt[KDMapData.RoomType]?.OwnerFaction == npc.captureFaction) { + eligible.push(npc); + } + } else { + if (!mapFaction || mapFaction == npc.captureFaction + || (eligible_faction.length == 0 && KDFactionRelation(mapFaction, KDGetFaction(npc.entity)))) { + eligible.push(npc); + if (mapFaction && mapFaction == npc.captureFaction) { + eligible_faction.push(npc); + } + } + } + + } + npc.entity.Enemy = oldEnemy; + } + + if (eligible_faction.length > 0) eligible = eligible_faction; + + return eligible; +} + + + +function KDSetSpawnAndWanderAI(npc: KDPersistentNPC, customSpawnAI: string, customWanderAI: string) { + let enemy = npc.entity.Enemy; + if (typeof npc.entity.Enemy == "string") { + enemy = KinkyDungeonGetEnemyByName(npc.entity.Enemy); + } + let aitype = "Default"; + let waitype = "Default"; + if (customSpawnAI) aitype = customSpawnAI; + else if (enemy.spawnAISetting) aitype = enemy.spawnAISetting; + if (customWanderAI) waitype = customWanderAI; + else if (enemy.wanderAISetting) waitype = enemy.wanderAISetting; + + if (SpawnAISettingList[aitype]) npc.spawnAI = SpawnAISettingList[aitype](npc, enemy); + if (WanderAISettingList[waitype]) npc.wanderAI = WanderAISettingList[waitype](npc, enemy); +} + +function KDSetSpecialScript(npc: KDPersistentNPC, specialScript: string) { + let enemy = npc.entity.Enemy; + if (typeof npc.entity.Enemy == "string") { + enemy = KinkyDungeonGetEnemyByName(npc.entity.Enemy); + } + let script = specialScript || ""; + if (!script && enemy.specialScript) script = enemy.specialScript; + + if (SpecialPersistentScriptSettingList[script]) npc.specialScript = SpecialPersistentScriptSettingList[script](npc, enemy); +} + +function KDNPCCanWander(id: number): boolean { + let npc = KDIsNPCPersistent(id) ? KDGetPersistentNPC(id) : null; + + return npc && (!npc.collect && !(KDGameData.Collection[id] && npc.room == "Summit")) && !KDIsInCapturedPartyID(id) +} + +function KDGetSideroomWanderTags(slot: KDWorldSlot): Record> { + let rooms: Record> = {}; + + let journeySlot = KDGameData.JourneyMap[(slot.jx != undefined ? slot.jx : 0) + ',' + + (slot.jy != undefined ? slot.jy : slot.y)]; + + if (journeySlot) { + for (let room of journeySlot.SideRooms) { + if (KDSideRooms[room]?.wandertags) { + // Only if theres a wander tag + rooms[KDSideRooms[room]?.altRoom || ""] = Object.assign({}, KDSideRooms[room].wandertags); + } else + rooms[KDSideRooms[room]?.altRoom || ""] = {}; + } + } + + return rooms; +} + + +function KDGetLairWanderTags(roomFilter: string, slot: KDWorldSlot): Record> { + let results: Record> = {}; + + if (slot.outposts) { + for (let outpost of Object.entries(slot.outposts)) { + if (roomFilter == undefined || outpost[1] == roomFilter) { + let tags: Record = {}; + + let alt = KDPersonalAlt[outpost[0]]; + if (alt) { + if (alt.OwnerFaction) + tags["faction_" + alt.OwnerFaction] = 1; + + if (alt.OwnerNPC) + tags["owner_" + alt.OwnerNPC] = 1; + + if (alt.RoomType) + tags["type_" + alt.RoomType] = 1; + } + + if (KinkyDungeonAltFloor(outpost[0])?.wanderTags) { + Object.assign(tags, KinkyDungeonAltFloor(outpost[0])?.wanderTags); + } + + results[outpost[0]] = tags; + } + } + } + + return results; +} + +function KDGetWeightedAvgWithTags(tags: Record, rooms: Record>): Record { + let results: Record = {}; + + for (let room of Object.entries(rooms)) { + let weight = 0; + for (let tag of Object.entries(tags)) { + let tagMult = tag[1] * (room[1][tag[0]] || 0); + weight += tagMult; + } + results[room[0]] = Math.max(0, weight); + } + + return results; +} + +function KDGetPersistentWanderWeightsForRoom(AITags: Record, coord: WorldCoord, includeMain: boolean = true): Record { + let results: Record = {}; + let slot = KDGetWorldMapLocation(KDCoordToPoint(coord)); + + if (!slot) return results; // Null + + let sideRooms = KDGetWeightedAvgWithTags(AITags, KDGetSideroomWanderTags(slot)); + let lairs = KDGetWeightedAvgWithTags(AITags, KDGetLairWanderTags(coord.room, slot)); + if (includeMain) { + let main = slot.main || ""; + sideRooms[main] = (AITags.generic || 0) + (AITags.main || 0); + } + + return Object.assign(sideRooms, lairs); +} \ No newline at end of file diff --git a/Game/src/enemy/KDPersistentScriptList.ts b/Game/src/enemy/KDPersistentScriptList.ts new file mode 100644 index 000000000..f0a01d818 --- /dev/null +++ b/Game/src/enemy/KDPersistentScriptList.ts @@ -0,0 +1,61 @@ +interface PersistentNPCScript { + /** Number of turns between wanders */ + cooldown: number, + /** Whether or not NPC is willing to wander */ + filter: (id: number, mapData: KDMapDataType) => boolean, + /** Chance of wandering this CD cycle */ + chance: (id: number, mapData: KDMapDataType) => number, + /** Actually perform the wander activity */ + doScript: (id: number, mapData: KDMapDataType, entity: entity) => boolean, +} + + +let KDPersistentScriptList: Record = { + /** n/a */ + Default: { + cooldown: 400, + filter: (id, mapData) => { + let npc = KDGetPersistentNPC(id); + return KinkyDungeonCurrentTick > (npc.nextScriptTick || 0); + }, + chance: (id, mapData) => { + return 0; + }, + doScript: (id, mapData, entity) => { + // Chill and be well + return true; + }, + }, + /** n/a */ + MaidKnightAndSquire: { + cooldown: 40, + filter: (id, mapData) => { + let npc = KDGetPersistentNPC(id); + return KinkyDungeonCurrentTick > (npc.nextScriptTick || 0); + }, + chance: (id, mapData) => { + return 1; + }, + doScript: (id, mapData, entity) => { + let npc = KDGetPersistentNPC(id); + let maidKnightID = npc.data?.MaidKnightHeavyID; + let maidSquireID = npc.data?.MaidKnightLightID; + let angered = false; + if (id == maidKnightID) { + if (KDGameData.Collection[maidSquireID + ""] && KDGetPersistentNPC(maidSquireID)?.collect) { + angered = true; + } + } else if (id == maidSquireID) { + if (KDGameData.Collection[maidKnightID + ""] && KDGetPersistentNPC(maidKnightID)?.collect) { + angered = true; + } + } + if (angered) { + if (!npc.data) npc.data = {}; + npc.data.wanderTarget = KDGetCurrentLocation(); + // TODO make it so they look for clues to the player + } + return true; + }, + }, +}; \ No newline at end of file diff --git a/Game/src/enemy/KDPersistentSpawnAI.ts b/Game/src/enemy/KDPersistentSpawnAI.ts new file mode 100644 index 000000000..fbae71fdb --- /dev/null +++ b/Game/src/enemy/KDPersistentSpawnAI.ts @@ -0,0 +1,145 @@ +interface PersistentSpawnAI { + /** Number of turns between spawn cycles */ + cooldown: number, + /** Whether or not NPC is willing to spawn */ + filter: (id: number, mapData: KDMapDataType) => boolean, + /** Chance of wandering this CD cycle */ + chance: (id: number, mapData: KDMapDataType) => number, + /** Actually perform the wander activity. True = go on cooldown*/ + doSpawn: (id: number, mapData: KDMapDataType, entity?: entity) => boolean, +} + +let KDPersistentSpawnAIList: Record = { + /** Default spawn AI: spawns the NPC at a random point on the map, if onmap, otherwise at the startposition with delayed spawn flag */ + Default: { + cooldown: 50, + filter: (id, mapData) => { + let npc = KDGetPersistentNPC(id); + return KinkyDungeonCurrentTick > (npc.nextSpawnTick || 0) && !npc.captured && KDNPCCanWander(npc.id); + }, + chance: (id, mapData) => { + return mapData == KDMapData ? 0.4 : 0.1; + }, + doSpawn: (id, mapData, entity) => { + if (!entity && !mapData.Entities.some((ent) => { + return ent.id == id; + })) { + let npc = KDGetPersistentNPC(id); + if (!npc.entity) return false; + let ent = KDAddEntity(npc.entity, + false, false, true, mapData); + + if (mapData == KDMapData) { + ent.runSpawnAI = true; + entity = ent; + } else { + ent.x = mapData.StartPosition.x; + ent.y = mapData.StartPosition.y; + ent.runSpawnAI = true; + return true; + } + } + if (entity && entity.runSpawnAI) { + let npc = KDGetPersistentNPC(id); + let point = (npc.fromType == undefined || npc.fromType == -1) ? KinkyDungeonGetRandomEnemyPoint( + true, false, undefined, undefined, 10 + ) : mapData.StartPosition; + if (npc.fromType == 1) { + point = mapData.EndPosition; + } else if (npc.fromType == 2) { + if (npc.fromIndex) + point = KDGetNearestExitTo(npc.fromIndex, + mapData.mapX, mapData.mapY, + point.x, point.y, mapData, true); + } + if (point) { + KDMoveEntity(entity, point.x, point.y, + false, false, false, false, + true, mapData); + entity.runSpawnAI = false; + delete npc.fromIndex; + delete npc.fromType; + return true; + } else { + // Wait till next spawn cycle + KDRemoveEntity(entity, false, false, + true, undefined, mapData); + return true; + } + } + + return false; + }, + }, + /** Dragon spawn AI: spawns the NPC at a random point on the map, same as default atm*/ + Dragon: { + cooldown: 50, + filter: (id, mapData) => { + let npc = KDGetPersistentNPC(id); + return KinkyDungeonCurrentTick > (npc.nextSpawnTick || 0) && !npc.captured && KDNPCCanWander(npc.id); + }, + chance: (id, mapData) => { + if (!KDIDHasFlag(id, "LairCheck")) return 1.0; + return mapData == KDMapData ? 0.4 : 0.1; + }, + doSpawn: (id, mapData, entity) => { + if (!entity && !mapData.Entities.some((ent) => { + return ent.id == id; + })) { + let npc = KDGetPersistentNPC(id); + if (!npc.entity) return false; + let ent = KDAddEntity(npc.entity, + false, false, true, mapData); + + if (mapData == KDMapData) { + ent.runSpawnAI = true; + entity = ent; + } else { + ent.x = mapData.StartPosition.x; + ent.y = mapData.StartPosition.y; + ent.runSpawnAI = true; + return true; + } + } + if (entity && entity.runSpawnAI) { + let npc = KDGetPersistentNPC(id); + let point = (npc.fromType == undefined || npc.fromType == -1) ? KinkyDungeonGetRandomEnemyPoint( + true, false, undefined, undefined, 10 + ) : mapData.StartPosition; + if (npc.fromType == 1) { + point = mapData.EndPosition; + } else if (npc.fromType == 2) { + if (npc.fromIndex) + //point = mapData.ShortcutPositions[npc.fromIndex]; + point = KDGetNearestExitTo(npc.fromIndex, + mapData.mapX, mapData.mapY, + point.x, point.y, mapData, true); + } + if (point && KinkyDungeonEntityAt(point.x, point.y)) { + let pp = point; + point = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, true); + if (!point) { + point = KinkyDungeonGetNearbyPoint(pp.x, pp.y, true); + } + } + if (point) { + KDMoveEntity(entity, point.x, point.y, + false, false, false, false, + true, mapData); + entity.runSpawnAI = false; + delete npc.fromIndex; + delete npc.fromType; + return true; + } else { + // Wait till next spawn cycle + KDRemoveEntity(entity, false, false, + true, undefined, mapData); + return true; + } + } + + return false; + }, + }, +}; + diff --git a/Game/src/enemy/KDPersistentWanderAI.ts b/Game/src/enemy/KDPersistentWanderAI.ts new file mode 100644 index 000000000..bf240da28 --- /dev/null +++ b/Game/src/enemy/KDPersistentWanderAI.ts @@ -0,0 +1,550 @@ +interface PersistentWanderAI { + /** Number of turns between wanders */ + cooldown: number, + /** Whether or not NPC is willing to wander */ + filter: (id: number, mapData: KDMapDataType) => boolean, + /** Chance of wandering this CD cycle */ + chance: (id: number, mapData: KDMapDataType) => number, + /** Actually perform the wander activity */ + doWander: (id: number, mapData: KDMapDataType, entity: entity) => boolean, +} + + +let KDPersistentWanderAIList: Record = { + /** Default wander AI: choose to visit one of the journey slots on a tile, or move. */ + GoToMain: { + cooldown: 400, + filter: (id, mapData) => { + let npc = KDGetPersistentNPC(id); + return KinkyDungeonCurrentTick > (npc.nextWanderTick || 0) && !npc.captured && KDNPCCanWander(npc.id); + }, + chance: (id, mapData) => { + return mapData == KDMapData ? 0.33 : 0.8; + }, + doWander: (id, mapData, entity) => { + let currentWorldPosition = KDGetNPCLocation(id); + let targetPosition = KDGetNPCLocation(id); + let worldSlot = KDGetWorldMapLocation({x: currentWorldPosition.mapX, y: currentWorldPosition.mapY}); + let journeySlot = KDGameData.JourneyMap[ + (worldSlot.jx != undefined ? worldSlot.jx : currentWorldPosition.mapX) + ',' + + (worldSlot.jy != undefined ? worldSlot.jy : currentWorldPosition.mapY)]; + + let fromType = 0; + let fromIndex = "0"; + + if (currentWorldPosition.mapY < KDGameData.HighestLevelCurrent + && journeySlot?.SideRooms.length > 0 && worldSlot?.data && KDRandom() < 0.5) { + // 50% chance to stay or go to main + if (currentWorldPosition.room != worldSlot.main) { + targetPosition.room = worldSlot.main || ""; + + fromType = 2; + fromIndex = currentWorldPosition.room; + + if (fromIndex == "-1") fromType = 0; + } + } + + if (!KDCompareLocation(currentWorldPosition, targetPosition)) { + if (!entity) { + entity = mapData?.Entities.find((ent) => { + return ent.id == id; + }); + + } + // Despawn first + + let halt = false; + if (entity) { + if (KDEnemyCanDespawn(id, mapData)) { + KDDespawnEnemy(entity, undefined, mapData); + } else { + let exit = KDGetNearestExitTo(targetPosition.room, targetPosition.mapX, targetPosition.mapY, + entity.x, entity.y, mapData, true + ); + if (!exit) {exit = KDMapData.EndPosition;} + if (exit) { + entity.despawnX = exit.x; + entity.despawnY = exit.y; + entity.goToDespawn = true; + } + halt = true; + } + } + if (halt) return true; + + // Move the entity + if (KDMovePersistentNPC(id, targetPosition)) { + let npc = KDGetPersistentNPC(id); + npc.fromType = fromType; + npc.fromIndex = fromIndex; + } + return true; + } else { + let npc = KDGetPersistentNPC(id); + npc.fromType = -1; + delete npc.fromIndex; + } + + return false; + }, + }, + /** normal wander AI: choose to visit one of the journey slots on a tile, or move. */ + Default: { + cooldown: 400, + filter: (id, mapData) => { + let npc = KDGetPersistentNPC(id); + return KinkyDungeonCurrentTick > (npc.nextWanderTick || 0) && !npc.captured && KDNPCCanWander(npc.id); + }, + chance: (id, mapData) => { + return mapData == KDMapData ? 0.33 : 0.8; + }, + doWander: (id, mapData, entity) => { + return KDStandardWander(id, mapData, entity, () => { + let NPC = KDGetPersistentNPC(id); + let AITags = { + generic: 1.0, + }; + AITags["owner_" + id] = 1; + if (NPC?.partyLeader) { + AITags["owner_" + id] = 0.5; + } + if (NPC?.entity) { + AITags["faction_" + KDGetFaction(NPC.entity)] = 1; + } + return AITags; + }); + }, + }, + /** regular wander, but visits lair every 600 turns*/ + Dragon: { + cooldown: 175, + filter: (id, mapData) => { + let npc = KDGetPersistentNPC(id); + return KinkyDungeonCurrentTick > (npc.nextWanderTick || 0) && !npc.captured && KDNPCCanWander(npc.id); + }, + chance: (id, mapData) => { + if (!KDIDHasFlag(id, "LairCheck")) return 1.0; + return mapData == KDMapData ? 0.25 : 0.75; + }, + doWander: (id, mapData, entity) => { + let forceLair = false; + if (!KDIDHasFlag(id, "LairCheck")) { + KDSetIDFlag(id, "LairCheck", 550); + forceLair = true; + } + return KDStandardLairWander(id, mapData, entity, forceLair, 550, () => { + let NPC = KDGetPersistentNPC(id); + let AITags = { + generic: 1.0, + }; + AITags["owner_" + id] = 1; + if (NPC?.partyLeader) { + AITags["owner_" + id] = 0.5; + } + if (NPC?.entity) { + AITags["faction_" + KDGetFaction(NPC.entity)] = 1; + } + return AITags; + }); + }, + }, + /** regular wander unless targeted*/ + Targeted: { + cooldown: 90, + filter: (id, mapData) => { + let npc = KDGetPersistentNPC(id); + return KinkyDungeonCurrentTick > (npc.nextWanderTick || 0) && !npc.captured && KDNPCCanWander(npc.id); + }, + chance: (id, mapData) => { + if (KDGetPersistentNPC(id)?.data?.wanderTarget) return 1.0; + return mapData == KDMapData ? 0.25 : 0.8; + }, + doWander: (id, mapData, entity) => { + let forceTarget = false; + if (KDGetPersistentNPC(id)?.data?.wanderTarget) { + forceTarget = true; + } + return KDStandardTargetedWander(id, mapData, entity, forceTarget, KDGetPersistentNPC(id)?.data?.wanderTarget, () => { + let NPC = KDGetPersistentNPC(id); + let AITags = { + generic: 1.0, + }; + AITags["owner_" + id] = 1; + if (NPC?.partyLeader) { + AITags["owner_" + id] = 0.5; + } + if (NPC?.entity) { + AITags["faction_" + KDGetFaction(NPC.entity)] = 1; + } + return AITags; + }); + }, + }, +}; + +function KDStandardWander(id: number, mapData: KDMapDataType, entity: entity, AITagFunc: () => Record): boolean { + let currentWorldPosition = KDGetNPCLocation(id); + let targetPosition = KDGetNPCLocation(id); + let worldSlot = KDGetWorldMapLocation({x: currentWorldPosition.mapX, y: currentWorldPosition.mapY}); + let journeySlot = KDGameData.JourneyMap[ + (worldSlot.jx != undefined ? worldSlot.jx : currentWorldPosition.mapX) + ',' + + (worldSlot.jy != undefined ? worldSlot.jy : currentWorldPosition.mapY)]; + + let fromType = 0; + let fromIndex = "0"; + + if (currentWorldPosition.mapY <= KDGameData.HighestLevelCurrent + && journeySlot?.SideRooms.length > 0 && worldSlot?.data && KDRandom() < 0.5) { + // 50% chance to go to a side room or go to normal + if (currentWorldPosition.room == (worldSlot.main || "")) { + let AITags = AITagFunc(); + + let result = KDGetByWeight(KDGetPersistentWanderWeightsForRoom( + AITags, currentWorldPosition, true + )) + + if (result) { + targetPosition.room = result; + fromType = 0; + } else { + targetPosition.room = worldSlot.main || ""; + fromType = 2; + fromIndex = currentWorldPosition.room; + + if (fromIndex == "-1") fromType = 0; + } + } else { + targetPosition.room = worldSlot.main || ""; + fromType = 2; + fromIndex = currentWorldPosition.room; + + if (fromIndex == "-1") fromType = 0; + } + } else if (currentWorldPosition.room == (worldSlot.main || "")) { + // Go up or down + // We dont go beyond current max level + let dy = KDRandom() < 0.5 ? -1 : 1; + // Wont go up if its a boss level + if (currentWorldPosition.mapY + dy == KDGameData.HighestLevelCurrent + && KinkyDungeonBossFloor(currentWorldPosition.mapY + dy) + ) { + // Dont move + dy = 0; + } + + if (dy < 0) { + fromType = 1; + } + + if (dy && currentWorldPosition.mapY + dy > 0 && currentWorldPosition.mapY + dy <= KDGameData.HighestLevelCurrent) { + targetPosition.mapY = currentWorldPosition.mapY + dy; + } + } + + if (!KDCompareLocation(currentWorldPosition, targetPosition)) { + if (!entity) { + entity = mapData?.Entities.find((ent) => { + return ent.id == id; + }); + + } + // Despawn first + let halt = false; + if (entity) { + if (KDEnemyCanDespawn(id, mapData)){ + KDDespawnEnemy(entity, undefined, mapData); + } else { + let exit = KDGetNearestExitTo(targetPosition.room, targetPosition.mapX, targetPosition.mapY, + entity.x, entity.y, mapData, true + ); + if (!exit) {exit = KDMapData.EndPosition;} + if (exit) { + entity.despawnX = exit.x; + entity.despawnY = exit.y; + entity.goToDespawn = true; + } + halt = true; + } + } + if (halt) return true; + // Move the entity + if (KDMovePersistentNPC(id, targetPosition)) { + let npc = KDGetPersistentNPC(id); + npc.fromType = fromType; + npc.fromIndex = fromIndex; + } + return true; + } + + return false; +} + + +function KDStandardLairWander(id: number, mapData: KDMapDataType, entity: entity, modeAlternate: boolean, duration: number, AITagFunc: () => Record): boolean { + let currentWorldPosition = KDGetNPCLocation(id); + let targetPosition = KDGetNPCLocation(id); + let worldSlot = KDGetWorldMapLocation({x: currentWorldPosition.mapX, y: currentWorldPosition.mapY}); + let journeySlot = KDGameData.JourneyMap[ + (worldSlot.jx != undefined ? worldSlot.jx : currentWorldPosition.mapX) + ',' + + (worldSlot.jy != undefined ? worldSlot.jy : currentWorldPosition.mapY)]; + + let fromType = 0; + let fromIndex = "0"; + let NPC = KDGetPersistentNPC(id); + + if (modeAlternate && !(KDPersonalAlt[currentWorldPosition.room]?.OwnerNPC == id)) { + KDSetIDFlag(id, "LairCheck", 0); + } + + if (currentWorldPosition.mapY <= KDGameData.HighestLevelCurrent + && journeySlot?.SideRooms.length > 0 && worldSlot?.data && ((!modeAlternate && KDRandom() < 0.5) + || (modeAlternate + // Force go to lair + && NPC.entity.homeCoord && ( + currentWorldPosition.mapX == NPC.entity.homeCoord.mapX + && currentWorldPosition.mapY == NPC.entity.homeCoord.mapY + && currentWorldPosition.room != NPC.entity.homeCoord.room + ) + ))) { + // 50% chance to go to a side room or go to normal + if (currentWorldPosition.room == (worldSlot.main || "")) { + + if ( (modeAlternate + // Force go to lair + && NPC.entity.homeCoord && ( + currentWorldPosition.mapX == NPC.entity.homeCoord.mapX + && currentWorldPosition.mapY == NPC.entity.homeCoord.mapY + && currentWorldPosition.room != NPC.entity.homeCoord.room + ) + )) { + let lairs = KDGetLairs(worldSlot, id); + if (lairs.length > 0) { + let result = lairs[Math.floor(KDRandom() * lairs.length)]; + targetPosition.room = result[0]; + fromType = 0; + KDSetIDFlag(id, "LairCheck", duration); + } + } else { + let AITags = AITagFunc(); + + let result = KDGetByWeight(KDGetPersistentWanderWeightsForRoom( + AITags, currentWorldPosition, true + )) + + if (result) { + targetPosition.room = result; + fromType = 0; + } else { + targetPosition.room = worldSlot.main || ""; + fromType = 2; + fromIndex = currentWorldPosition.room; + + if (fromIndex == "-1") fromType = 0; + } + } + + } else { + targetPosition.room = worldSlot.main || ""; + fromType = 2; + fromIndex = currentWorldPosition.room; + + if (fromIndex == "-1") fromType = 0; + } + } else if ((modeAlternate && NPC.entity.homeCoord && ( + currentWorldPosition.mapX != NPC.entity.homeCoord.mapX + || currentWorldPosition.mapY != NPC.entity.homeCoord.mapY + )) || (!modeAlternate && currentWorldPosition.room == (worldSlot.main || ""))) { + // Go up or down + // We dont go beyond current max level + let dy = KDRandom() < 0.5 ? -1 : 1; + if (modeAlternate && NPC.entity.homeCoord) { + if (currentWorldPosition.mapY < NPC.entity.homeCoord.mapY) dy = 1; + else if (currentWorldPosition.mapY > NPC.entity.homeCoord.mapY) dy = -1; + } + // Wont go up if its a boss level + if (currentWorldPosition.mapY + dy == KDGameData.HighestLevelCurrent + && KinkyDungeonBossFloor(currentWorldPosition.mapY + dy) + ) { + // Dont move + dy = 0; + } + + if (dy < 0) { + fromType = 1; + } + + if (dy && currentWorldPosition.mapY + dy > 0 && currentWorldPosition.mapY + dy <= KDGameData.HighestLevelCurrent) { + targetPosition.mapY = currentWorldPosition.mapY + dy; + } + } + + if (!KDCompareLocation(currentWorldPosition, targetPosition)) { + if (!entity) { + entity = mapData?.Entities.find((ent) => { + return ent.id == id; + }); + + } + // Despawn first + + let halt = false; + if (entity) { + if (KDEnemyCanDespawn(id, mapData)){ + KDDespawnEnemy(entity, undefined, mapData); + } else { + let exit = KDGetNearestExitTo(targetPosition.room, targetPosition.mapX, targetPosition.mapY, + entity.x, entity.y, mapData, true + ); + if (!exit) {exit = KDMapData.EndPosition;} + if (exit) { + entity.despawnX = exit.x; + entity.despawnY = exit.y; + entity.goToDespawn = true; + } + halt = true; + } + } + if (halt) return true; + + // Move the entity + if (KDMovePersistentNPC(id, targetPosition)) { + let npc = KDGetPersistentNPC(id); + npc.fromType = fromType; + npc.fromIndex = fromIndex; + } + return true; + } + + return false; +} + +/** If modeAlternate, tries to wander toward target */ +function KDStandardTargetedWander(id: number, mapData: KDMapDataType, entity: entity, modeAlternate: boolean, target: WorldCoord, AITagFunc: () => Record): boolean { + let currentWorldPosition = KDGetNPCLocation(id); + let targetPosition = KDGetNPCLocation(id); + let worldSlot = KDGetWorldMapLocation({x: currentWorldPosition.mapX, y: currentWorldPosition.mapY}); + let journeySlot = KDGameData.JourneyMap[ + (worldSlot.jx != undefined ? worldSlot.jx : currentWorldPosition.mapX) + ',' + + (worldSlot.jy != undefined ? worldSlot.jy : currentWorldPosition.mapY)]; + + let fromType = 0; + let fromIndex = "0"; + let NPC = KDGetPersistentNPC(id); + + if (currentWorldPosition.mapY <= KDGameData.HighestLevelCurrent + && journeySlot?.SideRooms.length > 0 && worldSlot?.data && ((!modeAlternate && KDRandom() < 0.5) + || (modeAlternate + // Force go to lair + && NPC.entity.homeCoord && ( + currentWorldPosition.mapX == target.mapX + && currentWorldPosition.mapY == target.mapY + && currentWorldPosition.room != target.room + ) + ))) { + // 50% chance to go to a side room or go to normal + if (currentWorldPosition.room == (worldSlot.main || "")) { + + if ( (modeAlternate + // Force go to lair + && target && ( + currentWorldPosition.mapX == target.mapX + && currentWorldPosition.mapY == target.mapY + && currentWorldPosition.room != target.room + ) + )) { + targetPosition = target; + fromType = 0; + } else { + let AITags = AITagFunc(); + + let result = KDGetByWeight(KDGetPersistentWanderWeightsForRoom( + AITags, currentWorldPosition, true + )) + + if (result) { + targetPosition.room = result; + fromType = 0; + } else { + targetPosition.room = worldSlot.main || ""; + fromType = 2; + fromIndex = currentWorldPosition.room; + + if (fromIndex == "-1") fromType = 0; + } + } + + } else { + targetPosition.room = worldSlot.main || ""; + fromType = 2; + fromIndex = currentWorldPosition.room; + + if (fromIndex == "-1") fromType = 0; + } + } else if ((modeAlternate && target && ( + currentWorldPosition.mapX != target.mapX + || currentWorldPosition.mapY != target.mapY + )) || (!modeAlternate && currentWorldPosition.room == (worldSlot.main || ""))) { + // Go up or down + // We dont go beyond current max level + let dy = KDRandom() < 0.5 ? -1 : 1; + if (modeAlternate && target) { + if (currentWorldPosition.mapY < target.mapY) dy = 1; + else if (currentWorldPosition.mapY > target.mapY) dy = -1; + } + // Wont go up if its a boss level + if (currentWorldPosition.mapY + dy == KDGameData.HighestLevelCurrent + && KinkyDungeonBossFloor(currentWorldPosition.mapY + dy) + ) { + // Dont move + dy = 0; + } + + if (dy < 0) { + fromType = 1; + } + + if (dy && currentWorldPosition.mapY + dy > 0 && currentWorldPosition.mapY + dy <= KDGameData.HighestLevelCurrent) { + targetPosition.mapY = currentWorldPosition.mapY + dy; + } + } + + if (!KDCompareLocation(currentWorldPosition, targetPosition)) { + if (!entity) { + entity = mapData?.Entities.find((ent) => { + return ent.id == id; + }); + + } + // Despawn first + + let halt = false; + if (entity) { + if (KDEnemyCanDespawn(id, mapData)){ + KDDespawnEnemy(entity, undefined, mapData); + } else { + let exit = KDGetNearestExitTo(targetPosition.room, targetPosition.mapX, targetPosition.mapY, + entity.x, entity.y, mapData, true + ); + if (!exit) {exit = KDMapData.EndPosition;} + if (exit) { + entity.despawnX = exit.x; + entity.despawnY = exit.y; + entity.goToDespawn = true; + } + halt = true; + } + } + if (halt) return true; + + // Move the entity + if (KDMovePersistentNPC(id, targetPosition)) { + let npc = KDGetPersistentNPC(id); + npc.fromType = fromType; + npc.fromIndex = fromIndex; + } + return true; + } + + return false; +} \ No newline at end of file diff --git a/Game/src/enemy/KinkyDungeonEnemies.ts b/Game/src/enemy/KinkyDungeonEnemies.ts new file mode 100644 index 000000000..317f441be --- /dev/null +++ b/Game/src/enemy/KinkyDungeonEnemies.ts @@ -0,0 +1,10420 @@ +"use strict"; + +let KDEnemyStruggleHPExp = 0.8; + +let KDOpinionThreshold = 12; +let KDDespawnDistance = 1.5; + +let KDDebugOverlay2 = false; + +let KDEnemiesCache = new Map(); + +let KinkyDungeonSummonCount = 2; +let KinkyDungeonEnemyAlertRadius = 2; +let KDStealthyMult = 0.75; +let KDConspicuousMult = 1.5; + +let commentChance = 0.03; +let actionDialogueChance = 0.1; +let actionDialogueChanceIntense = 0.4; + +/** Default noisiness level of moving enemies */ +let KDDefaultEnemyMoveSound = 6; +let KDDefaultEnemyAttackSound = 10; +let KDDefaultEnemyCastSound = 8; +let KDDefaultEnemyIdleSound = 2; +let KDDefaultEnemyAlertSound = 5; + +let KDEventableAttackTypes = [ + "Lock", + "Will", + "Stamina", + "Bind", + "Effect", + "Stun", + "Blind", + "Slow", +]; + +let KDPlayerNoiseSources = { + // TODO add events + Movement: { + calc: (_player: entity) => { + return KinkyDungeonFlags.get("moved") ? ( + 4 + ) : 0; + } + }, + Sprint: { + calc: (_player: entity) => { + return KinkyDungeonFlags.get("sprinted") ? ( + 9 + ) : 0; + } + }, +}; + + +let KDAnims: Record boolean> = { + breathing: (Entity) => { + if (!Entity.animTime) Entity.animTime = CommonTime() + Math.floor(KDRandom() * 1000); + Entity.scaleY *= (0.986 - 0.014*Math.sin(Math.PI/2 + 2 * Math.PI * KDAnimQuantize(KDBreathAnimTime/2, CommonTime() - Entity.animTime)/(KDBreathAnimTime))); + Entity.scaleX *= (1.005 - 0.005*Math.sin(-Math.PI/2 + 2 * Math.PI * KDAnimQuantize(KDBreathAnimTime/2, CommonTime() - Entity.animTime)/(KDBreathAnimTime))); + Entity.offY += -0.005*Math.sin(-Math.PI/2 + 2 * Math.PI * KDAnimQuantize(KDBreathAnimTime/2, CommonTime() - Entity.animTime)/(KDBreathAnimTime)); + return true; + }, + squishy: (Entity) => { + if (!Entity.animTime) Entity.animTime = CommonTime() + Math.floor(KDRandom() * 1000); + Entity.scaleY *= (1 - 0.12*Math.sin(Math.PI + 2 * Math.PI * KDAnimQuantize(KDSquishyAnimTime/4, CommonTime() - Entity.animTime)/(KDSquishyAnimTime))); + Entity.scaleX *= (1 - 0.08*Math.sin(2 * Math.PI * KDAnimQuantize(KDSquishyAnimTime/4, CommonTime() - Entity.animTime)/(KDSquishyAnimTime))); + Entity.offY += -0.04*Math.sin(2 * Math.PI * KDAnimQuantize(KDSquishyAnimTime/4, CommonTime() - Entity.animTime)/(KDSquishyAnimTime)); + return true; + }, + squishyAmbush: (Entity) => { + if (!Entity.ambushtrigger) return false; + if (!Entity.animTime) Entity.animTime = CommonTime() + Math.floor(KDRandom() * 1000); + Entity.scaleY *= (1 - 0.12*Math.sin(Math.PI + 2 * Math.PI * KDAnimQuantize(KDSquishyAnimTime/4, CommonTime() - Entity.animTime)/(KDSquishyAnimTime))); + Entity.scaleX *= (1 - 0.08*Math.sin(2 * Math.PI * KDAnimQuantize(KDSquishyAnimTime/4, CommonTime() - Entity.animTime)/(KDSquishyAnimTime))); + Entity.offY += -0.04*Math.sin(2 * Math.PI * KDAnimQuantize(KDSquishyAnimTime/4, CommonTime() - Entity.animTime)/(KDSquishyAnimTime)); + return true; + }, +}; + +/** + * Quantizes a number + * @param amount + * @param step + */ +function KDAnimQuantize(step: number, amount: number): number { + if (!KDToggles.RetroAnim) return amount; + return Math.round((amount || 0)/step) * step; +} + + +/** + * Refreshes the enemies map + */ +function KinkyDungeonRefreshEnemiesCache() { + KDEnemiesCache = new Map(); + for (let enemy of KinkyDungeonEnemies) { + KDEnemiesCache.set(enemy.name, enemy); + } +} + + +/** + * @param Name + */ +function KinkyDungeonGetEnemyByName(Name: string | enemy): enemy { + if (typeof Name != "string") return Name; + if (KDEnemiesCache.size > 0) { + return KDEnemiesCache.get(Name) || KinkyDungeonEnemies.find(element => element.name === Name); + } else { + KinkyDungeonRefreshEnemiesCache(); + return KDEnemiesCache.get(Name) || KinkyDungeonEnemies.find(element => element.name === Name); + } +} + +/** + * @param x + * @param y + * @param [filter] + * @param [any] + * @param [qualified] - Exclude jails where the player doesnt meet conditions + * @param [unnocupied] - No enemy in the jail + */ +function KinkyDungeonNearestJailPoint(x: number, y: number, filter?: string[], any?: boolean, qualified?: boolean, unnocupied?: boolean, criteria?: (x, y, point) => boolean): KDJailPoint { + let filt = filter ? filter : ["jail", "dropoff"]; + let dist = 100000; + let point = null; + let leash = KinkyDungeonGetRestraintItem("ItemNeckRestraints"); + let furniture = KinkyDungeonGetRestraintItem("ItemDevices"); + for (let p of KDMapData.JailPoints) { + if (!any && p.type && !filt.includes(p.type)) continue; + if (qualified && p.requireLeash && !leash) continue; + if (qualified && p.requireFurniture && !furniture) continue; + if (unnocupied && KinkyDungeonEntityAt(p.x, p.y)) continue; + if (criteria && !criteria(p.x, p.y, p)) continue; + if (KinkyDungeonEntityAt(p.x, p.y, undefined, undefined, undefined, false) + && KDIsImprisoned(KinkyDungeonEntityAt(p.x, p.y))) continue; + let d = Math.max(Math.abs(x - p.x), Math.abs(y - p.y)); + if (d < dist) { + dist = d; + point = p; + } + } + + return point; +} + +function KDLockNearbyJailDoors(x: number, y: number) { + let jail = KinkyDungeonNearestJailPoint(x, y); + if (jail) { + let radius = jail.radius + 1; + if (radius) + for (let X = x - Math.ceil(radius); X <= x + Math.ceil(radius); X++) + for (let Y = y - Math.ceil(radius); Y <= y + Math.ceil(radius); Y++) + if (KinkyDungeonTilesGet(X + ',' + Y)?.Jail && KinkyDungeonMapGet(X, Y) == 'd') { + KinkyDungeonMapSet(X, Y, 'D'); + KinkyDungeonTilesGet(X + ',' + Y).Lock = "Red"; + } + } +} + + +/** + * @param [filter] + * @param [exclude] + */ +function KinkyDungeonRandomJailPoint(filter?: string[], exclude?: KDJailPoint[]): KDJailPoint { + let filt = filter ? filter : ["jail"]; + let points = []; + for (let p of KDMapData.JailPoints) { + if (p.type && !filt.includes(p.type)) continue; + if (!exclude || exclude.includes(p)) continue; + points.push(p); + } + if (points.length > 0) return points[Math.floor(KDRandom() * points.length)]; + return null; +} + +function KinkyDungeonNearestPatrolPoint(x: number, y: number): number { + let dist = 100000; + let point = -1; + for (let p of KDMapData.PatrolPoints) { + let d = Math.max(Math.abs(x - p.x), Math.abs(y - p.y)); + if (d < dist) { + dist = d; + point = KDMapData.PatrolPoints.indexOf(p); + } + } + + return point; +} + +let KinkyDungeonFlags: Map = new Map(); + +/** + * @param Flag + * @param Duration - In turns + * @param [Floors] - Optional, makes this flag expire in this many floors + */ +function KinkyDungeonSetFlag(Flag: string, Duration: number, Floors?: number) { + if (!KinkyDungeonFlags.get(Flag) || Duration <= 0 || (KinkyDungeonFlags.get(Flag) > 0 && KinkyDungeonFlags.get(Flag) < Duration)) { + KinkyDungeonFlags.set(Flag, Duration); + if (Duration == 0) { + KinkyDungeonFlags.delete(Flag); + } else if (Floors != undefined) { + if (!KDGameData.TempFlagFloorTicks) + KDGameData.TempFlagFloorTicks = {}; + // handle optional floor count flag setting logic + if (!KDGameData.TempFlagFloorTicks[Flag] || KDGameData.TempFlagFloorTicks[Flag] < Floors) { + KDGameData.TempFlagFloorTicks[Flag] = Floors; + } + if (Floors === 0) { + delete KDGameData.TempFlagFloorTicks[Flag]; + } + } + } +} + +function KinkyDungeonUpdateFlags(delta: number) { + for (let f of KinkyDungeonFlags.keys()) { + if (KinkyDungeonFlags.get(f) != -1) { + if (KinkyDungeonFlags.get(f) > 0) KinkyDungeonFlags.set(f, KinkyDungeonFlags.get(f) - delta); + if (KinkyDungeonFlags.get(f) <= 0 && KinkyDungeonFlags.get(f) != -1) KinkyDungeonFlags.delete(f); + } + } +} + +function KinkyDungeonGetPatrolPoint(index: number, radius: number, Tiles: string) { + let p = KDMapData.PatrolPoints[index]; + let t = Tiles ? Tiles : KinkyDungeonMovableTilesEnemy; + if (p) { + for (let i = 0; i < 8; i++) { + let XX = p.x + Math.round(KDRandom() * 2 * radius - radius); + let YY = p.y + Math.round(KDRandom() * 2 * radius - radius); + if (t.includes(KinkyDungeonMapGet(XX, YY)) && (KDPointWanderable(XX, YY))) { + return {x: XX, y: YY}; + } + } + } + return p; +} + +/** + * @param enemy + * @param [override] + */ +function KDGetBindAmp(enemy: entity, override?: number): number { + if (!KDAllied(enemy)) return override != undefined ? override : KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BindAmp")); + return 1; +} + +/** + * Bound and unable to do anything + * @param enemy + */ +function KDHelpless(enemy: entity): boolean { + let packed = KDUnPackEnemy(enemy); + let res = enemy && !enemy.player && (enemy.hp <= 0.52 || enemy.boundLevel > KDNPCStruggleThreshMult(enemy) * enemy.Enemy.maxhp) && KDBoundEffects(enemy) > 3; + if (packed) KDPackEnemy(enemy); + return res; +} + +/** + * Bound with no way out + * @param enemy + */ +function KDIsHopeless(enemy: entity): boolean { + return enemy && !enemy.player && (enemy.boundLevel > KDNPCStruggleThreshMult(enemy) * enemy.Enemy.maxhp) && KDBoundEffects(enemy) > 3; +} + +function KDEnemyVisionRadius(enemy: entity): number { + let data = { + enemy: enemy, + radius: enemy.Enemy.visionRadius || 2, + mult: KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(enemy, "VisionRad")), + bonusBefore: 0.0, + bonusAfter: 0.0, + }; + KinkyDungeonSendEvent("calcEnemyVision", data); + + return (data.bonusBefore + data.radius) * data.mult + data.bonusAfter; +} + +function KinkyDungeonNearestPlayer(enemy: entity, _requireVision?: boolean, decoy?: boolean, visionRadius?: number, _AI_Data?: KDAIData) { + if (enemy && enemy.Enemy && !visionRadius) { + visionRadius = KDEnemyVisionRadius(enemy); + if (enemy.blind && !enemy.aware) visionRadius = 1.5; + } + if (decoy) { + let pdist = Math.sqrt((KinkyDungeonPlayerEntity.x - enemy.x)*(KinkyDungeonPlayerEntity.x - enemy.x) + + (KinkyDungeonPlayerEntity.y - enemy.y)*(KinkyDungeonPlayerEntity.y - enemy.y)); + let nearestVisible = undefined; + + if (enemy.Enemy.focusPlayer && KinkyDungeonCheckLOS(enemy, KinkyDungeonPlayerEntity, pdist, visionRadius, false, false) && !KinkyDungeonCheckPath(enemy.x, enemy.y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, false, true)) pdist = 1.5; + let hostile = KDHostile(enemy); + let nearestDistance = (hostile) ? pdist - 0.1 : 100000; + if (KDGetFaction(enemy) == "Player" + && (KDEnemyHasFlag(enemy, "NoFollow") + || KDEnemyHasFlag(enemy, "StayHere"))) + nearestDistance = 100000; + + if ((enemy.Enemy.visionRadius || enemy.Enemy.blindSight) && !(enemy.Enemy.noAttack && !enemy.Enemy.spells)) { + let ent = KDNearbyEnemies(enemy.x, enemy.y, Math.min(nearestDistance, visionRadius), + undefined, true); + for (let e of ent) { + if (e == enemy) continue; + if (KDHelpless(e) || KDIsImprisoned(e)) continue; + if (KDGetFaction(e) == "Natural") continue; + if (enemy.Enemy.noTargetSilenced && e.silence > 0) continue; + if ((e.Enemy && !e.Enemy.noAttack && KDHostile(enemy, e))) { + if (e.Enemy?.tags?.scenery && KDAllied(enemy) && !KDEnemyHasFlag(e, "targetedForAttack")) continue; + let dist = Math.sqrt((e.x - enemy.x)*(e.x - enemy.x) + + (e.y - enemy.y)*(e.y - enemy.y)); + let pdist_enemy = + (KDGetFaction(enemy) == "Player" + && !KDEnemyHasFlag(enemy, "NoFollow") + && !KDEnemyHasFlag(enemy, "StayHere") + && (enemy.Enemy.allied || KDIsInParty(enemy) || (!KDGameData.PrisonerState || KDGameData.PrisonerState == "chase"))) + ? KDistChebyshev(e.x - KinkyDungeonPlayerEntity.x, e.y - KinkyDungeonPlayerEntity.y) : + -1; + if (pdist_enemy > 0 && pdist_enemy < 1.5 && hostile) KinkyDungeonSetFlag("AIHelpPlayer", 4); + if (pdist_enemy > 0 && KinkyDungeonFlags.get("AIHelpPlayer") && dist > 2.5) { + if (pdist_enemy > 2.5) dist += 2; + else dist = Math.max(1.01 + dist/4, dist/3); + } + if (dist <= nearestDistance && (pdist_enemy <= 0 || + ((KinkyDungeonVisionGet(e.x, e.y) > 0 || pdist_enemy < 5 || e == KinkyDungeonJailGuard() || enemy == KinkyDungeonJailGuard()) && (pdist_enemy < 8 || enemy.Enemy.followRange > 1)) + )) { + if (KinkyDungeonCheckLOS(enemy, e, dist, visionRadius, true, true) + && (KinkyDungeonVisionGet(e.x, e.y) > 0 || KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 || e.aware || enemy.aware || e == KinkyDungeonJailGuard() || enemy == KinkyDungeonJailGuard())) { + if (enemy.rage || !e.Enemy.lowpriority || (enemy.gx == e.x && enemy.gy == e.y) + || (!KinkyDungeonCheckLOS(enemy, KinkyDungeonPlayerEntity, pdist, visionRadius, true, true) + || !KinkyDungeonCheckPath(enemy.x, enemy.y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, false, true))) { + nearestVisible = e; + nearestDistance = dist; + } + } + } + } + } + } + if (nearestVisible) return nearestVisible; + } + return KinkyDungeonPlayerEntity; +} + +/** + * @param enemy + */ +function KDEnemyHidden(enemy: entity): boolean { + if (enemy?.Enemy?.tags?.timestealth && !KDEnemyHasFlag(enemy, "timereveal") && !KinkyDungeonFlags.get("TimeSlow")) { + return KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) > 1.5; + } + + return KDEnemyHasFlag(enemy, "hidden"); +} + +let KDDespawnPartyDist = 6; + +function KDEnemyCanDespawn(id: number, mapData: KDMapDataType, PMDist?: number): boolean { + let en = KDGetGlobalEntity(id) + if (en && KDIsImprisoned(en)) return false; + if (mapData != KDMapData) return !en || !KDEnemyHasFlag(en, "no_pers_wander"); // TODO make this a bit more complex + let entity = KinkyDungeonFindID(id); + if (!entity) return true; + return !KDEnemyHasFlag(entity, "no_pers_wander") + && (mapData != KDMapData || + (KinkyDungeonVisionGet(entity.x, entity.y) < 0.1 + || KDistChebyshev(entity.x - KDPlayer().x, entity.y - KDPlayer().y) >= KDDespawnDistance) + || (PMDist ? PMDist < KDDespawnPartyDist : KDEnemyNearTargetExit(entity, mapData))); +} + +function KDEnemyNearTargetExit(entity: entity, mapData: KDMapDataType): boolean { + if (mapData != KDMapData) return true; + let gx = entity.despawnX || entity.gx || entity.x; + let gy = entity.despawnY || entity.gy || entity.y; + let nearestPoint = KDGetNearestExit(gx, gy, mapData); + + return nearestPoint && KDistChebyshev(gx - nearestPoint.x, gy - nearestPoint.y) < 1.5; +} + + +function KDGetShortcutPosition(target: string, x: number, y: number, mapData: KDMapDataType) { + // Like the below, but filters out any that arent the target + let possible: KDPoint[] = [mapData.StartPosition, mapData.EndPosition, ...Object.values(mapData.ShortcutPositions || {})]; + possible = possible.filter((pos) => { + return (!!pos) && ( + (!target ) ? + ( + !(altRoom?.nostartstairs && !altRoom?.startatstartpos) ? + (KinkyDungeonMapDataGet(mapData, pos.x, pos.y) == 'S') + : (KinkyDungeonMapDataGet(mapData, pos.x, pos.y) == 's') + ) + : + (KinkyDungeonTilesGet(pos.x + ',' + pos.y)?.RoomType == target) + ) + && KinkyDungeonStairTiles.includes(KinkyDungeonMapDataGet(mapData, pos.x, pos.y)); + }); + + let altRoom = KDGetAltType(mapData.mapY, mapData.MapMod, mapData.RoomType); + + if (possible.length == 0) { + possible = [mapData.StartPosition, mapData.EndPosition, ...Object.values(mapData.ShortcutPositions || {})]; + possible = possible.filter((pos) => { + return (!!pos) && ( + (!target ) ? + ( + !(altRoom?.nostartstairs && !altRoom?.startatstartpos) ? + (KinkyDungeonMapDataGet(mapData, pos.x, pos.y) == 'S') + : (KinkyDungeonMapDataGet(mapData, pos.x, pos.y) == 's') + ) + : + (KinkyDungeonTilesGet(pos.x + ',' + pos.y)?.RoomType == target) + ); + }); + } + + if (possible.length > 0) { + let cand = null; + let canddist = 10000000; + for (let p of possible) { + let dist = KDistChebyshev(p.x - x, p.y - y); + if (!canddist || dist < canddist) { + canddist = dist; + cand = p; + } + } + return cand; + } +} + +function KDGetNearestExit(x: number, y: number, mapData: KDMapDataType, backup?: boolean): KDPoint { + let possible: KDPoint[] = [mapData.StartPosition, mapData.EndPosition, ...Object.values(mapData.ShortcutPositions || {})]; + possible = possible.filter((pos) => { + return !!pos && KinkyDungeonStairTiles.includes(KinkyDungeonMapDataGet(mapData, pos.x, pos.y)); + }); + if (possible.length == 0) { + possible = [mapData.StartPosition, mapData.EndPosition, ...Object.values(mapData.ShortcutPositions || {})]; + possible = possible.filter((pos) => { + return !!pos; + }); + } + + if (possible.length > 0) { + let cand = null; + let canddist = 10000000; + for (let p of possible) { + let dist = KDistChebyshev(p.x - x, p.y - y); + if (!canddist || dist < canddist) { + canddist = dist; + cand = p; + } + } + return cand; + } + + return null; +} + + +function KDGetNearestExitTo(roomTo: string, mapX: number, mapY: number, x: number, y: number, mapData: KDMapDataType, backup?: boolean): KDPoint { + let spOrig = Object.entries(mapData.ShortcutPositions || {}); + let sp: KDPoint[] = []; + let mapSlot = KDGetWorldMapLocation(KDCoordToPoint(mapData)); + let journeyslot = KDGameData.JourneyMap[(mapSlot.jx != undefined ? mapSlot.jx : 0) + ',' + (mapSlot.jy != undefined ? mapSlot.jy : y)]; + for (let pos of spOrig) { + if (pos[0] == roomTo || (journeyslot?.SideRooms && journeyslot?.SideRooms[pos[0]] == roomTo)) { + sp.push(pos[1]); + } + } + + let possible: KDPoint[] = [...sp]; + let noStart = KDGetAltType(mapData.mapY, mapData.MapMod, mapData.RoomType)?.nostartstairs; + let noEnd = KDGetAltType(mapData.mapY, mapData.MapMod, mapData.RoomType)?.startatstartpos; + if (mapY > mapData.mapY && (!noEnd || noStart)) { + possible.unshift(mapData.EndPosition); + } else if (mapY < mapData.mapY && (!noStart || noEnd)) { + possible.unshift(mapData.StartPosition); + } else if (mapY == mapData.mapY) { + let slot = KDGetWorldMapLocation({x: mapData.mapX, y: mapData.mapY}); + if (roomTo == slot.main) + possible.unshift(mapData.EndPosition); + } + possible = possible.filter((pos) => { + return !!pos && KinkyDungeonStairTiles.includes(KinkyDungeonMapDataGet(mapData, pos.x, pos.y)); + }); + if (possible.length == 0) { + possible = [...sp]; + + if (mapY > mapData.mapY) { + possible.unshift(mapData.EndPosition); + } else if (mapY < mapData.mapY) { + possible.unshift(mapData.StartPosition); + } else if (mapY == mapData.mapY) { + let slot = KDGetWorldMapLocation({x: mapData.mapX, y: mapData.mapY}); + if (roomTo == slot.main) + possible.unshift(mapData.EndPosition); + } + + possible = possible.filter((pos) => { + return !!pos; + }); + } + + if (possible.length > 0) { + let cand = null; + let canddist = 10000000; + for (let p of possible) { + let dist = KDistChebyshev(p.x - x, p.y - y); + if (!canddist || dist < canddist) { + canddist = dist; + cand = p; + } + } + return cand; + } + + return null; +} + +function KinkyDungeonInDanger() { + for (let b of KDMapData.Bullets) { + let bdist = 1.5; + if (b.vx && b.vy) bdist = 2*Math.sqrt(b.vx*b.vx + b.vy*b.vy); + if (KinkyDungeonVisionGet(Math.round(b.x), Math.round(b.y)) > 0 && Math.max(Math.abs(b.x - KinkyDungeonPlayerEntity.x), Math.abs(b.y - KinkyDungeonPlayerEntity.y)) < bdist) { + if (!KinkyDungeonFlags.get("tut_projec")) { + KinkyDungeonSetFlag("tut_projec", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Projec"), KDTutorialColor, 10); + } + return true; + } + } + let nearby = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KDGameData.MaxVisionDist + 1, undefined, true); + for (let enemy of nearby) { + let playerDist = KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y); + if (KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) { + if (((enemy.revealed && !enemy.Enemy.noReveal) || !enemy.Enemy.stealth || KinkyDungeonSeeAll || playerDist <= enemy.Enemy.stealth + 0.1) && !KDEnemyHidden(enemy) && !(KinkyDungeonGetBuffedStat(enemy.buffs, "Sneak") > 0 && playerDist > 1.5)) { + if (((!KDHelpless(enemy) && KinkyDungeonAggressive(enemy)) || (playerDist < 1.5 && !KDIsImprisoned(enemy)))) { + if ((KDHostile(enemy) || enemy.rage) && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && + (!KDAmbushAI(enemy) || enemy.ambushtrigger)) { + return true; + } + if ((KDHostile(enemy) || enemy.rage) && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && + (!KDAmbushAI(enemy) || enemy.ambushtrigger)) { + return true; + } + } + } + } + } + + return false; +} + +function KDAmbushAI(enemy: entity): boolean { + let AI = enemy.AI ? enemy.AI : enemy.Enemy.AI; + let AIType = KDAIType[AI]; + if (AIType) return AIType.ambush; + return false; +} + +let KinkyDungeonFastMoveSuppress = false; +let KinkyDungeonFastStruggleSuppress = false; +let KDInDanger = false; + +function KinkyDungeonDrawEnemies(_canvasOffsetX: number, _canvasOffsetY: number, CamX: number, CamY: number) { + let reenabled = false; + let reenabled2 = false; + let wasInDanger = KDInDanger; + KDInDanger = false; + + if (KinkyDungeonFastMoveSuppress) { + KinkyDungeonFastMove = true; + KinkyDungeonFastMovePath = []; + KinkyDungeonFastMoveSuppress = false; + reenabled = true; + } + if (KinkyDungeonFastStruggleSuppress) { + KinkyDungeonFastStruggle = true; + KinkyDungeonFastStruggleType = ""; + KinkyDungeonFastStruggleGroup = ""; + KinkyDungeonFastStruggleSuppress = false; + reenabled2 = true; + } + for (let b of KDMapData.Bullets) { + let bdist = 1.5; + if (b.vx && b.vy) bdist = 2*Math.sqrt(b.vx*b.vx + b.vy*b.vy); + if (KinkyDungeonVisionGet(Math.round(b.x), Math.round(b.y)) > 0 && Math.max(Math.abs(b.x - KinkyDungeonPlayerEntity.x), Math.abs(b.y - KinkyDungeonPlayerEntity.y)) < bdist) { + if (KinkyDungeonFastStruggle) { + if (KinkyDungeonFastStruggle && !KinkyDungeonFastStruggleSuppress && !reenabled2) + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + KinkyDungeonFastStruggle = false; + KinkyDungeonFastStruggleGroup = ""; + KinkyDungeonFastStruggleType = ""; + reenabled2 = false; + //if (!CommonIsMobile) + KinkyDungeonFastStruggleSuppress = true; + } + if (KinkyDungeonFastMove) { + if ((!wasInDanger && KDGameData.FocusControlToggle?.AutoPathSuppressBeforeCombat) + || (KDGameData.FocusControlToggle?.AutoPathStepDuringCombat)) { + if (KDGameData.FocusControlToggle?.AutoPathStepDuringCombat && KinkyDungeonFlags.get("startPath") && KinkyDungeonFastMovePath.length > 0) { + KinkyDungeonFastMovePath = [KinkyDungeonFastMovePath[0]]; + } else { + KinkyDungeonFastMovePath = []; + } + } + + // Cancel fast move if there is no current path + if (KinkyDungeonFastMovePath?.length == 0 && + ( + KDGameData.FocusControlToggle?.AutoPathSuppressDuringCombat + ) + ) { + KinkyDungeonFastMoveSuppress = true; + KinkyDungeonFastMove = false; + reenabled = false; + } + } + + KDInDanger = true; + } + } + let nearby = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KDGameData.MaxVisionDist + 1, undefined, true); + for (let enemy of nearby) { + let sprite = enemy.Enemy.name; + KinkyDungeonUpdateVisualPosition(enemy, KinkyDungeonDrawDelta); + let tx = enemy.visual_x; + let ty = enemy.visual_y; + let playerDist = KDistChebyshev((enemy.x - KinkyDungeonPlayerEntity.x), (enemy.y - KinkyDungeonPlayerEntity.y)); + if (enemy.x >= CamX && enemy.y >= CamY && enemy.x < CamX + KinkyDungeonGridWidthDisplay && enemy.y < CamY + KinkyDungeonGridHeightDisplay + && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && KDCanSeeEnemy(enemy, playerDist)) { + if (((enemy.revealed && !enemy.Enemy.noReveal) || !enemy.Enemy.stealth || KDAllied(enemy) || KDHelpless(enemy) || KinkyDungeonSeeAll || playerDist <= enemy.Enemy.stealth + 0.1) && !KDEnemyHidden(enemy) && !(KinkyDungeonGetBuffedStat(enemy.buffs, "Sneak", true) > 0 && playerDist > 1.5)) { + enemy.revealed = true; + if (((KinkyDungeonAggressive(enemy) && playerDist <= 6.9) || (playerDist < 1.5 && enemy.playWithPlayer))) { + if ((KDHostile(enemy) || enemy.rage) && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && KinkyDungeonFastMove && + !enemy.Enemy.tags.harmless + && !KDIsImprisoned(enemy) && !(KDHelpless(enemy) + && KDCanPassEnemy(KDPlayer(), enemy)) + && (!KDAmbushAI(enemy) || enemy.ambushtrigger)) { + if ((!wasInDanger && KDGameData.FocusControlToggle?.AutoPathSuppressBeforeCombat) + || (KDGameData.FocusControlToggle?.AutoPathStepDuringCombat && !KinkyDungeonFlags.get("startPath"))) { + if (KinkyDungeonFastMove && !KinkyDungeonFastMoveSuppress && !reenabled) + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + if (KDGameData.FocusControlToggle?.AutoPathStepDuringCombat && KinkyDungeonFlags.get("startPath") && KinkyDungeonFastMovePath.length > 0) { + KinkyDungeonFastMovePath = [KinkyDungeonFastMovePath[0]]; + } else { + KinkyDungeonFastMovePath = []; + } + } + + // Cancel fast move if there is no current path + if (KinkyDungeonFastMovePath?.length == 0 && + ( + KDGameData.FocusControlToggle?.AutoPathSuppressDuringCombat + + ) + ) { + KinkyDungeonFastMoveSuppress = true; + KinkyDungeonFastMove = false; + reenabled = false; + } + KDInDanger = true; + } + if ((KDHostile(enemy) || enemy.rage) && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && KinkyDungeonFastStruggle && + !enemy.Enemy.tags.harmless && + (!KDAmbushAI(enemy) || enemy.ambushtrigger)) { + if (KinkyDungeonFastStruggle && !KinkyDungeonFastStruggleSuppress && !reenabled2) + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + KinkyDungeonFastStruggle = false; + KinkyDungeonFastStruggleGroup = ""; + KinkyDungeonFastStruggleType = ""; + reenabled2 = false; + if (!CommonIsMobile) + KinkyDungeonFastStruggleSuppress = true; + } + } + if (KDToggles.EnemyAura && enemy.buffs && !KDHelpless(enemy) && (!KDGetAI(enemy) || !KDAIType[KDGetAI(enemy)] || !KDAIType[KDGetAI(enemy)].ambush || enemy.ambushtrigger)) { + let aura_scale = 0; + let aura_scale_max = 0; + for (let b of Object.values(enemy.buffs)) { + if (b && b.aura && b.duration > 0) { + aura_scale_max += 1; + } + } + let sp = sprite; + let dir = "Enemies/"; + if (KDToggles.OutlineAura) { + let buffSprite = ""; + let buffSpritePower = 0; + //let sprite = enemy.Enemy.name; + if (enemy.buffs) { + let bound = KDBoundEffects(enemy) > 3; + for (let b of Object.values(enemy.buffs)) { + if (b?.replaceSpriteBound && bound && (b.replacePower || b.power > buffSpritePower)) { + buffSpritePower = b.replacePower || b.power; + buffSprite = b.replaceSpriteBound; + } else if (!bound && b?.replaceSprite && (b.replacePower || b.power > buffSpritePower)) { + buffSpritePower = b.replacePower || b.power; + buffSprite = b.replaceSprite; + } else if (!bound && b?.replaceSpriteSuff + && (b.replacePower || b.power > buffSpritePower)) { + buffSpritePower = b.replacePower || b.power; + buffSprite = sp + b.replaceSpriteSuff; + } else if (bound && b?.replaceSpriteSuffBound + && (b.replacePower || b.power > buffSpritePower)) { + buffSpritePower = b.replacePower || b.power; + buffSprite = sp + b.replaceSpriteSuffBound; + } + } + } + + if (buffSprite) sprite = buffSprite; + + + if (!enemy.Enemy.bound || (KDBoundEffects(enemy) < 4 && !KDHelpless(enemy))) { + sp = sprite; + if (!enemy.ambushtrigger && enemy.Enemy.GFX?.AmbushSprite && KDAmbushAI(enemy)) sp = enemy.Enemy.GFX.AmbushSprite; + else if (enemy.CustomSprite && !buffSprite) sp = "CustomSprite/" + enemy.CustomSprite; + } else { + sp = buffSprite || enemy.Enemy.bound; + dir = "EnemiesBound/"; + if (enemy.CustomSprite && !buffSprite) { + dir = "Enemies/"; + sp = "CustomSpriteBound/" + enemy.CustomSprite; + } + } + } + + if (aura_scale_max > 0) { + let buffs = Object.values(enemy.buffs); + buffs = buffs.sort((a, b) => {return b.duration - a.duration;}); + for (let b of buffs) { + if (b && b.aura && b.duration > 0 && !(b.aurasprite == "Null") && (b.showHelpless || !KDHelpless(enemy))) { + let s = aura_scale; + if (StandalonePatched && KDToggles.OutlineAura && !(b.noAuraColor && b.aurasprite)) { + + + + let o = {filters: [KDGetOutlineFilter(string2hex(b.aura), 1.0, 0.1, 1)], zIndex: -1 - s}; + + let w = (1 + 0.25 * s) * (enemy.Enemy.GFX?.spriteWidth || KinkyDungeonGridSizeDisplay);//(1 + 0.25 * s) * + let h = (1 + 0.25 * s) * (enemy.Enemy.GFX?.spriteHeight || KinkyDungeonGridSizeDisplay); + + let spr = KDDraw(kdenemyboard, kdpixisprites, enemy.id + "," + b.id, KinkyDungeonRootDirectory + dir + sp + ".png", + (tx + (enemy.offX || 0) - CamX)*KinkyDungeonGridSizeDisplay - ((enemy.flip ? -1 : 1) * w - KinkyDungeonGridSizeDisplay)/2, + (ty + (enemy.offY || 0) - CamY)*KinkyDungeonGridSizeDisplay - (h - KinkyDungeonGridSizeDisplay)/2, + w, h, undefined, o); + if (enemy.flip && spr?.scale.x > 0) spr.scale.x = -spr.scale.x; + else if (!enemy.flip && spr?.scale.x < 0) spr.scale.x = -spr.scale.x; + } else { + + let w = enemy.Enemy.GFX?.spriteWidth || KinkyDungeonGridSizeDisplay; + let h = enemy.Enemy.GFX?.spriteHeight || KinkyDungeonGridSizeDisplay; + // Legacy + if (b.noAuraColor && b.aurasprite) { + KDDraw(kdenemyboard, kdpixisprites, enemy.id + "," + b.id, KinkyDungeonRootDirectory + "Aura/" + (b.aurasprite ? b.aurasprite : "Aura") + ".png", + (tx + (enemy.offX || 0) - CamX)*KinkyDungeonGridSizeDisplay - (w - KinkyDungeonGridSizeDisplay)/2, + (ty + (enemy.offY || 0) - CamY)*KinkyDungeonGridSizeDisplay - (h - KinkyDungeonGridSizeDisplay)/2, + w, h, undefined, { + zIndex: 2, + }); + } else { + KDDraw(kdenemyboard, kdpixisprites, enemy.id + "," + b.id, KinkyDungeonRootDirectory + "Aura/" + (b.aurasprite ? b.aurasprite : "Aura") + ".png", + (tx - CamX)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s + KinkyDungeonGridSizeDisplay * (1 + s) * 0.167, + (ty - CamY)*KinkyDungeonGridSizeDisplay - 0.5 * KinkyDungeonGridSizeDisplay * s + KinkyDungeonGridSizeDisplay * (1 + s) * 0.167, + KinkyDungeonGridSizeDisplay * (1 + s) * 0.67, + KinkyDungeonGridSizeDisplay * (1 + s) * 0.67, + undefined, { + tint: string2hex(b.aura), + zIndex: 2, + }); + } + } + aura_scale += 1/aura_scale_max; + } + } + } + } + + sprite = KDDrawEnemySprite(kdenemyboard, enemy, tx, ty, CamX, CamY); + } + } else { + // Can't see the enemy so we draw sound instead + if (KDCanHearEnemy(KinkyDungeonPlayerEntity, enemy)) { + let w = enemy.Enemy.GFX?.spriteWidth || KinkyDungeonGridSizeDisplay; + let h = enemy.Enemy.GFX?.spriteHeight || KinkyDungeonGridSizeDisplay; + let o = StandalonePatched ? + undefined + : {tint: 0x888888, blendMode: PIXI.BLEND_MODES.SCREEN}; + + let spr = KDDraw(kdgamesound, kdpixisprites, "spr_sound_" + enemy.id, KinkyDungeonRootDirectory + (KDBoundEffects(enemy) > 3 ? "EnemiesBound/" : "Enemies/") + sprite + ".png", + (tx + (enemy.offX || 0) - CamX + (enemy.flip ? 1 : 0))*KinkyDungeonGridSizeDisplay - (w - KinkyDungeonGridSizeDisplay)/2, + (ty + (enemy.offY || 0) - CamY)*KinkyDungeonGridSizeDisplay - (h - KinkyDungeonGridSizeDisplay)/2, + w, h, undefined, o); + if (enemy.flip && spr?.scale.x > 0) spr.scale.x = -spr.scale.x; + else if (!enemy.flip && spr?.scale.x < 0) spr.scale.x = -spr.scale.x; + } + + } + } + if (reenabled && KinkyDungeonFastMove) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + } else if (reenabled2 && KinkyDungeonFastStruggle) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + } +} + +function KDDrawEnemySprite(board: PIXIContainer, enemy: entity, tx: number, ty: number, CamX: number, CamY: number, StaticView?: boolean, zIndex: number = 0, id: string = ""): string { + let buffSprite = ""; + let buffSpritePower = 0; + let sprite = enemy.Enemy.name; + if (enemy.buffs) { + let bound = KDBoundEffects(enemy) > 3; + for (let b of Object.values(enemy.buffs)) { + if (b?.replaceSpriteBound && bound && (b.replacePower || b.power > buffSpritePower)) { + buffSpritePower = b.replacePower || b.power; + buffSprite = b.replaceSpriteBound; + } else if (!bound && b?.replaceSprite && (b.replacePower || b.power > buffSpritePower)) { + buffSpritePower = b.replacePower || b.power; + buffSprite = b.replaceSprite; + } else if (!bound && b?.replaceSpriteSuff + && (b.replacePower || b.power > buffSpritePower)) { + buffSpritePower = b.replacePower || b.power; + buffSprite = sprite + b.replaceSpriteSuff; + } else if (bound && b?.replaceSpriteSuffBound + && (b.replacePower || b.power > buffSpritePower)) { + buffSpritePower = b.replacePower || b.power; + buffSprite = sprite + b.replaceSpriteSuffBound; + } + } + } + + if (buffSprite) sprite = buffSprite; + + let o: any = null; + + // Generate the NPC if applicable + if ((KDToggles.ShowJailedNPCSprites && KDIsImprisoned(enemy))) { + KDQuickGenNPC(enemy, enemy.CustomName != undefined); + } + + if (!enemy.Enemy.bound || (KDBoundEffects(enemy) < 4 && !KDHelpless(enemy))) { + let sp = sprite; + if (!enemy.ambushtrigger && enemy.Enemy.GFX?.AmbushSprite && KDAmbushAI(enemy)) sp = enemy.Enemy.GFX.AmbushSprite; + else if (enemy.CustomSprite && !buffSprite) sp = "CustomSprite/" + enemy.CustomSprite; + let w = (enemy.Enemy.GFX?.spriteWidth || KinkyDungeonGridSizeDisplay) * (enemy.scaleX || 1); + let h = (enemy.Enemy.GFX?.spriteHeight || KinkyDungeonGridSizeDisplay) * (enemy.scaleY || 1); + let color = (enemy.Enemy.GFX?.lighting) ? KDGetLightColor(enemy.x, enemy.y) : undefined; + if (color) { + if (!o) o = {tint: color}; + } + if (zIndex) { + if (!o) o = {zIndex: zIndex}; + else o.zIndex = zIndex; + } + if ((KDToggles.ShowJailedNPCSprites && KDIsImprisoned(enemy)) + && KDNPCChar.get(enemy.id)) { + let char = KDNPCChar.get(enemy.id); + // We refresh + if (enemy.refreshSprite + || !kdpixisprites.get("xspr_" + enemy.id + id)) { + if (char) + KDRefreshCharacter.set(char, true); + if (!NPCTags.get(char)) { + NPCTags.set(char, new Map()); + } + NPCTags.set(char, KinkyDungeonUpdateRestraints(char, enemy.id, 0)); + enemy.refreshSprite = false; + } + KinkyDungeonDressPlayer(char, false, false, KDGameData.NPCRestraints ? KDGameData.NPCRestraints[enemy.id + ''] : undefined); + + kdpixisprites.set("xspr_" + enemy.id + id, {}); + kdSpritesDrawn.set("xspr_" + enemy.id + id, true); + + let size = Math.max(w, h); + DrawCharacter(char, + (tx + (enemy.offX || 0) - CamX)*KinkyDungeonGridSizeDisplay - (1)*(w - KinkyDungeonGridSizeDisplay)/2 + size * 0.25, + (ty + (enemy.offY || 0) - CamY)*KinkyDungeonGridSizeDisplay - (h - KinkyDungeonGridSizeDisplay)/2 + size/6, + size/1100, false, board, undefined, CHIBIMOD, 0, enemy.flip, undefined, "spr_" + enemy.id + id, CHIBIMODEND); + + } else { + let spr = KDDraw(board, kdpixisprites, "spr_" + enemy.id + id, KinkyDungeonRootDirectory + "Enemies/" + sp + ".png", + (tx + (enemy.offX || 0) - CamX + ((enemy.flip && !StaticView) ? 1 : 0))*KinkyDungeonGridSizeDisplay - ((enemy.flip && !StaticView) ? -1 : 1)*(w - KinkyDungeonGridSizeDisplay)/2, + (ty + (enemy.offY || 0) - CamY)*KinkyDungeonGridSizeDisplay - (h - KinkyDungeonGridSizeDisplay)/2, + w, h, undefined, o); + if (!StaticView) { + if (enemy.flip && spr?.scale.x > 0) spr.scale.x = -spr.scale.x; + else if (!enemy.flip && spr?.scale.x < 0) spr.scale.x = -spr.scale.x; + } + } + + + } else { + let sp = buffSprite || enemy.Enemy.bound; + let dir = "EnemiesBound/"; + if (enemy.CustomSprite && !buffSprite) { + dir = "Enemies/"; + sp = "CustomSpriteBound/" + enemy.CustomSprite; + } + let w = (enemy.Enemy.GFX?.spriteWidth || KinkyDungeonGridSizeDisplay) * (enemy.scaleX || 1); + let h = (enemy.Enemy.GFX?.spriteHeight || KinkyDungeonGridSizeDisplay) * (enemy.scaleY || 1); + let color = (enemy.Enemy.GFX?.lighting) ? KDGetLightColor(enemy.x, enemy.y) : undefined; + if (color) { + if (!o) o = {tint: color}; + } + if (zIndex) { + if (!o) o = {zIndex: zIndex}; + else o.zIndex = zIndex; + } + if (((KDToggles.ShowJailedNPCSprites && KDIsImprisoned(enemy))) + && KDNPCChar.get(enemy.id)) { + let char = KDNPCChar.get(enemy.id); + // We refresh + if (enemy.refreshSprite + || !kdpixisprites.get("xspr_" + enemy.id + id)) { + if (char) + KDRefreshCharacter.set(char, true); + if (!NPCTags.get(char)) { + NPCTags.set(char, new Map()); + } + NPCTags.set(char, KinkyDungeonUpdateRestraints(char, enemy.id, 0)); + enemy.refreshSprite = false; + } + KinkyDungeonDressPlayer(char, false, false, KDGameData.NPCRestraints ? KDGameData.NPCRestraints[enemy.id + ''] : undefined); + + kdpixisprites.set("xspr_" + enemy.id + id, {}); // Hijack pixisprites due to desired functionality + kdSpritesDrawn.set("xspr_" + enemy.id + id, true); + + let size = Math.max(w, h); + DrawCharacter(char, + (tx + (enemy.offX || 0) - CamX)*KinkyDungeonGridSizeDisplay - (1)*(w - KinkyDungeonGridSizeDisplay)/2 + size * 0.25, + (ty + (enemy.offY || 0) - CamY)*KinkyDungeonGridSizeDisplay - (h - KinkyDungeonGridSizeDisplay)/2+ size/6, + size/1100, false, board, undefined, CHIBIMOD, 0, enemy.flip, undefined, "spr_" + enemy.id + id, CHIBIMODEND); + + } else { + let spr = KDDraw(board, kdpixisprites, "spr_" + enemy.id + id, KinkyDungeonRootDirectory + dir + sp + ".png", + (tx + (enemy.offX || 0) - CamX + ((enemy.flip && !StaticView) ? 1 : 0))*KinkyDungeonGridSizeDisplay - ((enemy.flip && !StaticView) ? -1 : 1)*(w - KinkyDungeonGridSizeDisplay)/2, + (ty + (enemy.offY || 0) - CamY)*KinkyDungeonGridSizeDisplay - (h - KinkyDungeonGridSizeDisplay)/2, + w, h, undefined, o); + if (!StaticView) { + if (enemy.flip && spr?.scale.x > 0) spr.scale.x = -spr.scale.x; + else if (!enemy.flip && spr?.scale.x < 0) spr.scale.x = -spr.scale.x; + } + } + } + return sprite; +} + +/** + * @param Entity + */ +function KDAnimEnemy(Entity: entity): { offX: number, offY: number } { + let offX = 0; + let offY = 0; + let offamount = 0.25; + let resetAnim = true; + + + let noAmbushWait = !(Entity.Enemy && KDAmbushAI(Entity) && !Entity.ambushtrigger); + + + + if (noAmbushWait && KDToggles.EnemyAnimations && Entity.Enemy && (Entity.Enemy.Animations || Entity.Enemy.bound)) { + Entity.offY = 0; + Entity.offX = 0; + Entity.scaleX = 1; + Entity.scaleY = 1; + + let anim = Entity.Enemy.Animations; + if (anim) + for (let a of anim) { + if (KDAnims[a] && KDAnims[a](Entity)) { + resetAnim = false; + } + } + if (!anim && Entity.Enemy.bound && KDAnims.breathing(Entity)) { + resetAnim = false; + } + } + + if (noAmbushWait && KDToggles.EnemyAnimations && Entity.Enemy && KDIsFlying(Entity) && !(KDBoundEffects(Entity) > 3 || KDHelpless(Entity))) { + if (resetAnim) { + Entity.offY = 0; + Entity.offX = 0; + Entity.scaleX = 1; + Entity.scaleY = 1; + } + if (!Entity.animTime) Entity.animTime = CommonTime() + Math.floor(KDRandom() * 1000); + Entity.offY += 0.05*Math.sin(2 * Math.PI * KDAnimQuantize(KDFloatAnimTime/8, CommonTime() - Entity.animTime)/(KDFloatAnimTime)); + resetAnim = false; + } + + if (Entity.fx && Entity.fy && (Entity.fx != Entity.x || Entity.fy != Entity.y) && Entity.Enemy && !KDIsImmobile(Entity)) { + if (Entity.fx != Entity.x) { + offX = offamount * Math.sign(Entity.fx - Entity.x); + } + if (Entity.fy != Entity.y) { + offY = offamount * Math.sign(Entity.fy - Entity.y); + } + } else { + if (noAmbushWait && KDToggles.EnemyAnimations && Entity.Enemy && (KDBoundEffects(Entity) > 3 || KDHelpless(Entity) || Entity.bind > 0) && !KinkyDungeonIsStunned(Entity)) { + if (resetAnim) { + Entity.offY = 0; + Entity.offX = 0; + Entity.scaleX = 1; + Entity.scaleY = 1; + } + if (!Entity.animTime) Entity.animTime = CommonTime(); + Entity.offX += 0.04*Math.sin(2 * Math.PI * KDAnimQuantize(KDAnimTime/4, CommonTime() - Entity.animTime)/(KDAnimTime)); + resetAnim = false; + } + } + if (resetAnim || !noAmbushWait) { + delete Entity.offY; + delete Entity.offX; + delete Entity.scaleX; + delete Entity.scaleY; + delete Entity.animTime; + } + return {offX: offX, offY: offY}; +} + + +function KDSetCollFlag(id: number, flag: string, duration: number) { + let entry = KDGameData.Collection["" + id]; + if (entry) { + if (!entry.flags) entry.flags = {}; + if (entry.flags[flag]) { + if (duration == 0) { + delete entry.flags[flag];// = undefined; + return; + } + if (entry.flags[flag] == -1) return; + if (entry.flags[flag] < duration) entry.flags[flag] = duration; + } else if (duration) entry.flags[flag] = duration; + } +} + +/** + * @param id + * @param flag + */ +function KDCollHasFlag(id: number, flag: string): boolean { + let entry = KDGameData.Collection["" + id]; + if (entry?.flags) + return (entry.flags && (entry.flags[flag] > 0 || entry.flags[flag] == -1)); + return false; +} + +function KinkyDungeonSetEnemyFlag(enemy: entity, flag: string, duration?: number) { + KDSetCollFlag(enemy.id, flag, duration); + if (!enemy.flags) enemy.flags = {}; + if (enemy.flags[flag]) { + if (duration > 0) KDUpdateEntityFlagCache = true; + if (duration == 0) { + delete enemy.flags[flag];// = undefined; + return; + } + if (enemy.flags[flag] == -1) return; + if (enemy.flags[flag] < duration) enemy.flags[flag] = duration; + } else if (duration) enemy.flags[flag] = duration; + +} +/** + * @param id + * @param flag + * @param duration + */ +function KDSetIDFlag(id: number, flag: string, duration: number) { + if (id == -1) { + KinkyDungeonSetFlag(flag, duration) + return; + } + let enemy = KDGetGlobalEntity(id); + if (!enemy) { + KDSetCollFlag(id, flag, duration); + return; + } + if (!enemy.flags) enemy.flags = {}; + if (enemy.flags[flag]) { + if (duration > 0) KDUpdateEntityFlagCache = true; + if (duration == 0) { + delete enemy.flags[flag];// = undefined; + return; + } + if (enemy.flags[flag] == -1) return; + if (enemy.flags[flag] < duration) enemy.flags[flag] = duration; + } else if (duration) enemy.flags[flag] = duration; + +} + +/** + * @param enemy + * @param flag + */ +function KDEnemyHasFlag(enemy: entity, flag: string): boolean { + return (enemy.flags && (enemy.flags[flag] > 0 || enemy.flags[flag] == -1)) + || KDCollHasFlag(enemy.id, flag); +} +/** + * @param id + * @param flag + */ +function KDIDHasFlag(id: number, flag: string): boolean { + if (id == -1) { + return KinkyDungeonFlags.get(flag) > 0; + } + let enemy = KDGetGlobalEntity(id); + if (enemy) + return (enemy.flags && (enemy.flags[flag] > 0 || enemy.flags[flag] == -1)) + || KDCollHasFlag(enemy.id, flag); + else return enemy ? KDCollHasFlag(enemy.id, flag) : false; +} + +/** + * @param enemy + * @param flag + */ +function KDEntityHasFlag(enemy: entity, flag: string): boolean { + if (enemy.player) { + return KinkyDungeonFlags.get(flag) > 0; + } + return KDEnemyHasFlag(enemy, flag);//(enemy.flags && (enemy.flags[flag] > 0 || enemy.flags[flag] == -1)); +} + +function KinkyDungeonDrawEnemiesStatus(canvasOffsetX: number, canvasOffsetY: number, CamX: number, CamY: number) { + + let nearby = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KDGameData.MaxVisionDist + 1, undefined, true); + for (let enemy of nearby) { + if (KDAmbushAI(enemy) && !enemy.ambushtrigger) continue; + let tx = enemy.visual_x; + let ty = enemy.visual_y; + let helpless = KDHelpless(enemy); + let playerDist = Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y)); + if (KDDebugOverlay2) { + if (KDCommanderRoles.get(enemy.id)) { + DrawTextFitKD(KDCommanderRoles.get(enemy.id), + canvasOffsetX + (enemy.x - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, + canvasOffsetY + (enemy.y - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, 100, "white", "black"); + } + KDTetherGraphics.lineStyle(2, string2hex(KDGetColor(enemy)), 1); + KDTetherGraphics.moveTo((enemy.x - CamX + 0.5)*KinkyDungeonGridSizeDisplay, (enemy.y - CamY + 0.5)*KinkyDungeonGridSizeDisplay); + KDTetherGraphics.lineTo((enemy.gx - CamX + 0.5)*KinkyDungeonGridSizeDisplay, (enemy.gy - CamY + 0.5)*KinkyDungeonGridSizeDisplay); + } + + if (enemy.x >= CamX && enemy.y >= CamY && enemy.x < CamX + KinkyDungeonGridWidthDisplay && enemy.y < CamY + KinkyDungeonGridHeightDisplay + && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && KDCanSeeEnemy(enemy, playerDist)) { + let bindLevel = KDBoundEffects(enemy); + if (((enemy.revealed && !enemy.Enemy.noReveal) || !enemy.Enemy.stealth || KDHelpless(enemy) || KinkyDungeonSeeAll || playerDist <= enemy.Enemy.stealth + 0.1) && !KDEnemyHidden(enemy) && !(KinkyDungeonGetBuffedStat(enemy.buffs, "Sneak", true) > 0)) { + if (enemy.stun > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "stun" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Stun.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + if (KDToggles.ShowNPCStatuses || MouseIn((tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay)) { + if (enemy.silence > 1 && !helpless) { + KDDraw(kdenemystatusboard, kdpixisprites, "sil" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Silence.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + if (enemy.blind > 1 && !helpless) { + KDDraw(kdenemystatusboard, kdpixisprites, "bli" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Blind.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + if (enemy.disarm > 1 && !helpless) { + KDDraw(kdenemystatusboard, kdpixisprites, "dis" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Disarm.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + if (enemy.bind > 1 && bindLevel < 4) { + KDDraw(kdenemystatusboard, kdpixisprites, "bind" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Bind.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.11, + }); + } + if ((enemy.slow > 1 || KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed", true) < 0) && bindLevel < 4) { + KDDraw(kdenemystatusboard, kdpixisprites, "spd" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Slow.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + if (KinkyDungeonGetBuffedStat(enemy.buffs, "AttackDmg", true) > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "atkb" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Buff.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + if (KinkyDungeonGetBuffedStat(enemy.buffs, "AttackDmg", true) < 0 && bindLevel < 4) { + KDDraw(kdenemystatusboard, kdpixisprites, "atkdb" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Debuff.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + if (KinkyDungeonGetBuffedStat(enemy.buffs, "SpellResist") < 0 && enemy.Enemy.spellResist > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "spresd" + enemy.id, KinkyDungeonRootDirectory + "Conditions/ShieldDebuff.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } else if (KinkyDungeonGetBuffedStat(enemy.buffs, "SpellResist") > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "spres" + enemy.id, KinkyDungeonRootDirectory + "Conditions/ShieldBuff.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + if (KinkyDungeonGetBuffedStat(enemy.buffs, "Armor") < 0 && enemy.Enemy.armor > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "armd" + enemy.id, KinkyDungeonRootDirectory + "Conditions/ArmorDebuff.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.11, + }); + } else if (KinkyDungeonGetBuffedStat(enemy.buffs, "Armor") > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "arm" + enemy.id, KinkyDungeonRootDirectory + "Conditions/ArmorBuff.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.11, + }); + } + if (KinkyDungeonGetBuffedStat(enemy.buffs, "Evasion") > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "evab" + enemy.id, KinkyDungeonRootDirectory + "Conditions/EvasionBuff.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + if (KinkyDungeonGetBuffedStat(enemy.buffs, "Block") > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "blkb" + enemy.id, KinkyDungeonRootDirectory + "Conditions/BlockBuff.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + if (KinkyDungeonGetBuffedStat(enemy.buffs, "DamageReduction") > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "shield" + enemy.id, KinkyDungeonRootDirectory + "Conditions/ShieldBuff.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + if (KinkyDungeonGetBuffedStat(enemy.buffs, "DamageAmp", true) > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "amp" + enemy.id, KinkyDungeonRootDirectory + "Conditions/DamageAmp.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } + } + + if (enemy.freeze > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "frz" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Freeze.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.1, + }); + } else if (enemy.teleporting > 0) { + KDDraw(kdenemystatusboard, kdpixisprites, "frz" + enemy.id, KinkyDungeonRootDirectory + "Conditions/Teleporting.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 2.11, + }); + } + } + } + } +} + +let KDLastEnemyWarningDelta = 0; + +function KinkyDungeonDrawEnemiesWarning(_canvasOffsetX: number, _canvasOffsetY: number, CamX: number, CamY: number) { + + let delta = CommonTime() - KDLastEnemyWarningDelta; + KDLastEnemyWarningDelta = CommonTime(); + if (KDToggles.ForceWarnings || KDMouseInPlayableArea()) { + let nearby = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KDGameData.MaxVisionDist + 1, undefined, true); + for (let enemy of nearby) { + if (enemy.warningTiles) { + for (let t of enemy.warningTiles) { + let scale = t.scale || 0.01; + if (scale < 1) t.scale = Math.max(0, Math.min(1, (t.scale || 0) + delta * 0.008/KDAnimSpeed)); + else scale = 1; + let tx = enemy.x + t.x*scale; + let ty = enemy.y + t.y*scale; + let txx = enemy.x + t.x; + let tyy = enemy.y + t.y; + if (!KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(txx, tyy)) && KinkyDungeonNoEnemy(txx, tyy, true)) continue; + let special = enemy.usingSpecial ? "Special" : ""; + let attackMult = KinkyDungeonGetBuffedStat(enemy.buffs, "AttackSlow", true); + let attackPoints = enemy.attackPoints - attackMult + 1.1; + + //let preHit = false; + let balpha = 0.8; + let falpha = 0.75; + if (((enemy.usingSpecial && enemy.Enemy.specialAttackPoints) ? enemy.Enemy.specialAttackPoints : enemy.Enemy.attackPoints) > attackPoints) { + special = special + "Basic"; + balpha = 0.5; + falpha = 0.25; + //preHit = true; + } + // && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(tx, ty)) + if (txx >= CamX && tyy >= CamY && txx < CamX + KinkyDungeonGridWidthDisplay && tyy < CamY + KinkyDungeonGridHeightDisplay && !(txx == enemy.x && tyy == enemy.y)) { + let color = enemy.Enemy.color ? string2hex(enemy.Enemy.color) : 0xff5555; + + KDDraw(kdwarningboardOver, kdpixisprites, tx + "," + ty + "_w" + enemy.id, KinkyDungeonRootDirectory + ((KDAllied(enemy)) ? "WarningAlly" : "WarningColor" + special) + ".png", + (tx - CamX+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, (ty - CamY+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay*scale, KinkyDungeonGridSizeDisplay*scale, undefined, { + tint: color, + zIndex: 2.22 + 0.001 * (enemy.Enemy.power ? enemy.Enemy.power : 0), + }); + KDDraw(kdwarningboard, kdpixisprites, tx + "," + ty + "_w_b" + enemy.id, KinkyDungeonRootDirectory + "WarningBacking" + ".png", + (tx - CamX+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, (ty - CamY+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay*scale, KinkyDungeonGridSizeDisplay*scale, undefined, { + tint: color, + alpha: falpha, + zIndex: 0.21 + 0.001 * (enemy.Enemy.power ? enemy.Enemy.power : 0), + }); + + KDDraw(kdwarningboard, kdpixisprites, tx + "," + ty + "_w_b_h" + enemy.id, KinkyDungeonRootDirectory + "WarningBackingHighlight" + ".png", + (tx - CamX+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, (ty - CamY+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay*scale, KinkyDungeonGridSizeDisplay*scale, undefined, { + zIndex: 0.20, + alpha: balpha, + }); + KDDraw(kdwarningboard, kdpixisprites, tx + "," + ty + "_w_h" + enemy.id, KinkyDungeonRootDirectory + ((KDAllied(enemy)) ? "WarningHighlightAlly" : "WarningHighlight" + special) + ".png", + (tx - CamX+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay - 1, (ty - CamY+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay - 1, + KinkyDungeonGridSizeDisplay*scale + 2, KinkyDungeonGridSizeDisplay*scale + 2, undefined, { + zIndex: 2.2, + }); + } + } + } + let mp = enemy.Enemy.movePoints + KDBoundEffects(enemy) * 0.5; + let ms = KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed") ? KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed")) : 1; + if (enemy.fx && enemy.fy && enemy.movePoints >= mp - ms - 0.0001) { + let tx = enemy.fx; + let ty = enemy.fy; + if (tx >= CamX && ty >= CamY && tx < CamX + KinkyDungeonGridWidthDisplay && ty < CamY + KinkyDungeonGridHeightDisplay + && KDCanSeeEnemy(enemy, Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y))) + && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) { + let color = enemy.Enemy.color ? string2hex(enemy.Enemy.color) : 0xff5555; + KDDraw(kdenemystatusboard, kdpixisprites, tx + "," + ty + "_w_m" + enemy.id, KinkyDungeonRootDirectory + ("WarningMove") + ".png", + (tx - CamX + 0.5)*KinkyDungeonGridSizeDisplay - 1, (ty - CamY + 0.5)*KinkyDungeonGridSizeDisplay - 1, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, Math.atan2(ty - enemy.y, tx - enemy.x) || 0, { + tint: color, + zIndex: -0.05, + }, true); + } + } + if (enemy.Enemy.spells && (enemy.Enemy.spellRdy && (!KDAmbushAI(enemy) || enemy.ambushtrigger)) && !(enemy.castCooldown > 1) && (!(enemy.silence > 0) && !(enemy.stun > 0) && !(enemy.freeze > 0) && !(enemy.teleporting > 0) && !KDHelpless(enemy))) { + let tx = enemy.visual_x; + let ty = enemy.visual_y; + // && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(tx, ty)) + if (tx >= CamX && ty >= CamY && tx < CamX + KinkyDungeonGridWidthDisplay && ty < CamY + KinkyDungeonGridHeightDisplay + && KDCanSeeEnemy(enemy, Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y))) + && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) { + KDDraw(kdenemyboard, kdpixisprites, enemy.id + "_spellRdy", KinkyDungeonRootDirectory + "SpellReady.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, enemy.Enemy.color ? { + tint: string2hex(enemy.Enemy.color), + zIndex: -2, + } : undefined); + } + } + if (enemy.weakBinding) { // || enemy.specialBinding + let tx = enemy.visual_x; + let ty = enemy.visual_y; + let binder = KinkyDungeonFindID(enemy.boundTo); + // && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(tx, ty)) + if (binder && tx >= CamX && ty >= CamY && tx < CamX + KinkyDungeonGridWidthDisplay && ty < CamY + KinkyDungeonGridHeightDisplay + && KDCanSeeEnemy(enemy, Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y))) + && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) { + KDDraw(kdenemyboard, kdpixisprites, enemy.id + "_weakB", KinkyDungeonRootDirectory + "WeakBinding.png", + (tx - CamX)*KinkyDungeonGridSizeDisplay, (ty - CamY)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, binder.Enemy.color ? { + tint: string2hex(binder.Enemy.color), + zIndex: -2.1, + } : undefined); + } + } + } + } +} + +function KinkyDungeonBar ( + x: number, + y: number, + w: number, + h: number, + value: number, + foreground: string = "#66FF66", + background: string = "#e64539", + orig: number = undefined, + origColor: string = "#ff4444", + notches: number[] = undefined, + notchcolor: string = "#ffffff", + notchbg: string = "#ffffff", + zIndex: number = 55 +) +{ + KinkyDungeonBarTo(kdcanvas, x, y, w, h, value, foreground, background, orig, origColor, notches, notchcolor, notchbg, zIndex); +} + +function KinkyDungeonBarTo ( + canvas: PIXIContainer, + x: number, + y: number, + w: number, + h: number, + value: number, + foreground: string = "#66FF66", + background: string = "#e64539", + orig: number = undefined, + origColor: string = "#ff4444", + notches: number[] = undefined, + notchcolor: string = "#ffffff", + notchbg: string = "#ffffff", + zIndex: number = 55 +) +{ + if (value < 0) value = 0; + if (value > 100) value = 100; + let reverse = w < 0; + if (w < 0) w *= -1; + let id = x + "," + y + "," + w + "," + h + foreground; + if (background != "none") + FillRectKD(canvas, kdpixisprites, id + '1', { + Left: x + 1, + Top: y + 1, + Width: w - 2, + Height: h - 2, + Color: "#000000", + LineWidth: 1, + zIndex: zIndex+value*0.0001, + }); + FillRectKD(canvas, kdpixisprites, id + '2', { + Left: reverse ? x - 2 + w - Math.floor((w - 4) * value / 100) : x + 2, + Top: y + 2, + Width: Math.floor((w - 4) * value / 100), + Height: h - 4, + Color: foreground, + LineWidth: 1, + zIndex: zIndex + .1, + }); + if (background != "none") + FillRectKD(canvas, kdpixisprites, id + '3', { + Left: reverse ? x + 2 : Math.floor(x + 2 + (w - 4) * value / 100), + Top: y + 2, + Width: Math.floor((w - 4) * (100 - value) / 100), + Height: h - 4, + Color: background, + LineWidth: 1, + zIndex: zIndex + .2, + }); + if (orig != undefined) + FillRectKD(canvas, kdpixisprites, id + '4', { + Left: reverse ? Math.max( + Math.floor(x - 2 + w - (w - 4) * orig / 100), + Math.floor(x - 2 + w - (w - 4) * value / 100) + ) - Math.floor((w - 4) * Math.abs(value - orig) / 100): Math.min( + Math.floor(x + 2 + (w - 4) * orig / 100), + Math.floor(x + 2 + (w - 4) * value / 100) + ), + Top: y + 2, + Width: Math.floor((w - 4) * Math.abs(value - orig) / 100), + Height: h - 4, + Color: origColor, + LineWidth: 1, + zIndex: zIndex + .3, + }); + if (notches) { + for (let n of notches) { + if (n > 0 && n < 1) { + FillRectKD(canvas, kdpixisprites, id + '5' + n, { + Left: reverse ? x - 4 + w - Math.floor((w - 4) * n) - 1 + : x + Math.floor((w - 4) * n) - 1, + Top: y + 2, + Width: 3, + Height: h - h, + Color: notchbg, + LineWidth: 1, + zIndex: zIndex + .4, + }); + FillRectKD(canvas, kdpixisprites, id + '6' + n, { + Left: reverse ? x - 4 + w - Math.floor((w - 4) * n) + : x + Math.floor((w - 4) * n), + Top: y + 2, + Width: 1, + Height: h - 4, + Color: notchcolor, + LineWidth: 1, + zIndex: zIndex + .5, + }); + } + } + } +} + +/** + * @param enemy + * @param [playerDist] + */ +function KDCanSeeEnemy(enemy: entity, playerDist?: number): boolean { + if (enemy.player) return true; // Player!!! + if (playerDist == undefined) playerDist = KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y); + return ( + ((enemy.revealed && (!enemy.Enemy.noReveal || (KDGameData.RevealedTiles && KDGameData.RevealedTiles[enemy.x + ',' + enemy.y] > 0))) + || !enemy.Enemy.stealth + || KDHelpless(enemy) + || KDAllied(enemy) + || KinkyDungeonSeeAll + || playerDist <= enemy.Enemy.stealth + 0.1) + && !KDEnemyHidden(enemy) + && !(KinkyDungeonGetBuffedStat(enemy.buffs, "Sneak") > 0 && playerDist > 1.5) + && (playerDist <= KDMaxEnemyViewDist(enemy) + || (KDGameData.RevealedTiles && KDGameData.RevealedTiles[enemy.x + ',' + enemy.y] > 0))); +} + +function KDMaxEnemyViewDist(enemy: entity) { + let data = { + blindMult: (KinkyDungeonStatsChoice.get("Blackout") || KinkyDungeonStatsChoice.get("TotalBlackout")) ? 100 : 2, + }; + //KinkyDungeonSendEvent("calcEnemyRad", data); + if (enemy?.hp < enemy?.Enemy.maxhp || enemy?.attackPoints > 0) return KDGameData.MaxVisionDist; + if (KinkyDungeonBlindLevel < 2) return KDGameData.MaxVisionDist; + else return Math.max(KinkyDungeonStatsChoice.get("TotalBlackout") ? 0.5 : 1.5, KDGameData.MaxVisionDist - KinkyDungeonBlindLevel * data.blindMult); +} + +function KDEnemyHasHelp(enemy: entity): boolean { + return (KDNearbyEnemies(enemy.x, enemy.y, 1.5).some((en) => { + return en != enemy + && en.Enemy.bound + && !KDHelpless(en) + && KDBoundEffects(en) < 4 + && !KDEnemyHasFlag(en, "imprisoned") + && !KinkyDungeonIsDisabled(en) + && !(en.disarm > 0) + && KDWillingToHelp(enemy, en) + }) || ( + KDAllied(enemy) + && !!KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y))); +} + +function KDGetHelpers(enemy: entity): entity[] { + let list: entity[] = []; + if (( + KDAllied(enemy) + && !!KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y))) + list.push(KDPlayer()); + list.push(...KDNearbyEnemies(enemy.x, enemy.y, 1.5).filter((en) => { + return en != enemy + && en.Enemy.bound + && !KDHelpless(en) + && KDBoundEffects(en) < 4 + && !KDEnemyHasFlag(en, "imprisoned") + && !KinkyDungeonIsDisabled(en) + && !(en.disarm > 0) + && KDFactionRelation(KDGetFaction(enemy), KDGetFaction(en)) + >= Math.max(0.1, KDFactionRelation("Player", KDGetFaction(en))) + })); + return list; +} + +/** + * @param enemy + * @param force + * @param defaultSpeed + */ +function KDGetEnemyStruggleMod(enemy: entity, force: boolean, defaultSpeed: boolean, hasHelp?: boolean): number { + let level = KDBoundEffects(enemy); + let mult = (force || enemy.hp > 0.51) ? 0.1 : 0; + + if (!force && KDIsImprisoned(enemy)) return 0; // Cant help imprisoned enemies, have to free them + + if (mult > 0 && !defaultSpeed) { + if (enemy.disarm > 0) mult *= 0.5; + if (enemy.silence > 0) mult *= 0.75; + if (enemy.blind > 0) mult *= 0.75; + if (enemy.bind > 0) mult *= 0.5; + else if (enemy.slow > 0) mult *= 0.75; + if (level > 3) mult *= 3; // Struggle faster when bound heavily, because they're using all their energy to try to escape + if (enemy.vulnerable > 0 || enemy.attackPoints > 0) mult *= 0.5; // They're busy + if (enemy.boundLevel > 0) { + mult *= Math.pow(1.5, -enemy.boundLevel / enemy.Enemy.maxhp); // The more you tie, the stricter the bondage gets + } + if (enemy.distraction > 0) mult *= 1 / (1 + 2 * enemy.distraction / enemy.Enemy.maxhp); + } else { + mult *= 3; // Default Speed is 3x unbound level + } + + if (hasHelp == undefined) { + hasHelp = KDEnemyHasHelp(enemy); + } + if (!defaultSpeed && enemy.hp > 0.51 && hasHelp) { + let helpers = KDGetHelpers(enemy); + for (let helper of helpers) { + if (helper.player) { + mult += KinkyDungeonIsHandsBound(true, true) ? (enemy.boundLevel < enemy.hp ? 0.01 : 0) : 1.0; + } + else mult += 0.01 * Math.max(1, 1 + KDEnemyRank(helper)) / (1 + KDBoundEffects(helper)); + } + } + if (!defaultSpeed && enemy.boundLevel >= enemy.Enemy.maxhp) mult *= 1.0 + (enemy.boundLevel/enemy.Enemy.maxhp - 1) * 0.5; + if (!defaultSpeed && enemy.hp > 0.52) mult *= 0.5 + enemy.hp / enemy.Enemy.maxhp; + if (!defaultSpeed && mult > 0) { + if (KinkyDungeonGetBuffedStat(enemy.buffs, "Lockdown")) mult *= KinkyDungeonGetBuffedStat(enemy.buffs, "Lockdown"); + } + + return mult; +} + +/** + * @param enemy + * @param vibe + */ +function KDGetEnemyDistractRate(enemy: entity, vibe: number): number { + if (vibe) return -(enemy.Enemy.maxhp**0.5) * (0.1 + 0.05 * vibe); + if (KDEnemyHasFlag(enemy, "d_turn")) return 0; + let level = KDBoundEffects(enemy); + let mult = enemy.distraction/enemy.Enemy.maxhp > 0.9 ? 0.02 : (enemy.distraction/enemy.Enemy.maxhp > 0.5 ? 0.075 : 0.1); + if (KDStrictPersonalities.includes(enemy.personality)) mult = mult * 2; + else if (!KDLoosePersonalities.includes(enemy.personality)) mult = mult * 1.5; + + return mult * enemy.Enemy.maxhp / (1 + level * 0.35); +} + +/** + * @param enemy + * @param vibe + */ +function KDGetEnemyDistractionDamage(enemy: entity, vibe: number): number { + if (vibe <= 0) return 0; + let mult = Math.max(0.25, enemy.distraction/enemy.Enemy.maxhp) * 0.05 * vibe; + if (enemy.hp <= 1 || enemy.hp <= enemy.Enemy.maxhp * 0.101) return 0; + return Math.min(Math.max(0.2 * enemy.Enemy.maxhp**0.75, 1), mult * enemy.hp); +} +/** + * @param enemy + */ +function KDGetEnemyReleaseDamage(enemy: entity, nokill: boolean = true, intensity?: number): any { + let data = { + enemy: enemy, + damage: (intensity != undefined ? intensity : 1) * enemy.Enemy.maxhp * Math.max(0.1, enemy.desire / enemy.Enemy.maxhp), + type: "charm", + nokill: nokill, + stunTime: 6 * (intensity != undefined ? intensity : 1) + }; + KinkyDungeonSendEvent("enemyOrgasm", data); + return data; +} + +let KDMaxBindingBars = 8; + +/** + * @param currentval + * @param targetval + * @param rate + * @param minrate - Minimum rate + * @param delta + * @param eps -epsilon, threshold for making the value eqyal exactly + */ +function KDEaseValue(delta: number, currentval: number, targetval: number, rate: number, minrate: number, eps: number = 0.1): number { + let val = currentval; + let diff = Math.abs(targetval - currentval); + let amount = diff * rate * delta; + let effamount = Math.max(minrate * delta, amount); + let eps_real = Math.max(eps, effamount); + if (val > targetval + eps_real || val < targetval - eps_real) { + val = val + (targetval - currentval) * effamount; + } else val = targetval; + return val; +} + +let KDBarAdvanceRate = 1.9/1000; +let KDBarAdvanceRateMin = 1.0/1000; + +/** + * @param enemy + */ +function KDGetMaxShield(enemy: entity): number { + return (enemy?.Enemy?.shield || 0) + KDEntityBuffedStat(enemy, "MaxShield"); +} + +/** + * @param enemy + */ +function KDGetShieldRegen(enemy: entity): number { + let regen = (enemy?.Enemy?.shieldregen || 0) + KDEntityBuffedStat(enemy, "ShieldRegen"); + if (!KDEntityHasFlag(enemy, "tookShieldDmg") && !KDEntityHasFlag(enemy, "tookHpDmg")) { + regen += KDEntityBuffedStat(enemy, "ShieldRegenBG"); + } + return regen; +} + +function KDEaseBars(enemy: entity, delta: number) { + if (enemy.boundLevel != undefined && !(enemy.visual_boundlevel == enemy.boundLevel)) { + enemy.visual_boundlevel = KDEaseValue(delta, enemy.visual_boundlevel || 0, enemy.boundLevel, KDBarAdvanceRate, KDBarAdvanceRateMin * enemy.Enemy.maxhp); + } + if (enemy.hp != undefined && !(enemy.visual_hp == enemy.hp)) { + enemy.visual_hp = KDEaseValue(delta, enemy.visual_hp != undefined ? enemy.visual_hp : enemy.Enemy.maxhp, enemy.hp, KDBarAdvanceRate, KDBarAdvanceRateMin * enemy.Enemy.maxhp); + } + if (enemy.distraction != undefined && !(enemy.visual_distraction == enemy.distraction)) { + enemy.visual_distraction = KDEaseValue(delta, enemy.visual_distraction || 0, enemy.distraction, KDBarAdvanceRate, KDBarAdvanceRateMin * enemy.Enemy.maxhp); + } + if (enemy.lifetime != undefined && !(enemy.visual_lifetime == enemy.lifetime)) { + enemy.visual_lifetime = KDEaseValue(delta, enemy.visual_lifetime || 0, enemy.lifetime, KDBarAdvanceRate, KDBarAdvanceRateMin * enemy.maxlifetime); + } +} + +function KinkyDungeonDrawEnemiesHP(delta: number, canvasOffsetX: number, canvasOffsetY: number, CamX: number, CamY: number, _CamXoffset: number, CamYoffset: number) { + KDDialogueSlots = {}; + let tooltip = false; + //let bindAmpModBase = KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BindAmp")); + let nearby = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KDGameData.MaxVisionDist + 1, undefined, true); + for (let enemy of nearby) { + let xx = enemy.visual_x ? enemy.visual_x : enemy.x; + let yy = enemy.visual_y ? enemy.visual_y : enemy.y; + let maxHP = Math.max(enemy.Enemy?.maxhp, KDGetMaxShield(enemy) || enemy.shield || 0); + let hpbarMult = Math.min(1, enemy.Enemy.maxhp / maxHP); + let shieldbarMult = (KDGetMaxShield(enemy) || enemy.shield) ? Math.min(1, (KDGetMaxShield(enemy) || enemy.shield) / enemy.Enemy.maxhp) : 1; + + + + // Handle enemy bars + + KDEaseBars(enemy, delta); + + let playerDist = Math.max(Math.abs(enemy.x - KinkyDungeonPlayerEntity.x), Math.abs(enemy.y - KinkyDungeonPlayerEntity.y)); + if (enemy.x >= CamX && enemy.y >= CamY && enemy.x < CamX + KinkyDungeonGridWidthDisplay && enemy.y < CamY + KinkyDungeonGridHeightDisplay + && KinkyDungeonVisionGet(enemy.x, enemy.y) > 0 && !KDIsImprisoned(enemy)) { + let II = 0; + // Draw bars + if ((!enemy.Enemy.stealth || KDAllied(enemy) || KDHelpless(enemy) || playerDist <= enemy.Enemy.stealth + 0.1) && !KDEnemyHidden(enemy) && !(KinkyDungeonGetBuffedStat(enemy.buffs, "Sneak") > 0 && playerDist > 1.5)) { + + if ((enemy.ambushtrigger || !KDAIType[KDGetAI(enemy)]?.ambush)) { + // Handle dodge and block tokens + if (KDCanBlock(enemy)) { + + if (enemy.blocks >= 1) { + let pipY = -15 + canvasOffsetY + (yy - CamY + 1)*KinkyDungeonGridSizeDisplay; + let pipSpacing = -0.5 * (KinkyDungeonGridSizeDisplay-25)/2; + for (let pip = 0; pip < enemy.blocks && pip < 2; pip++) { + if (pip == 0) + DrawRectKD(kdenemystatusboard, kdpixisprites, enemy.id + "Bpip" + pip, { + Left: canvasOffsetX + 15 + (xx - CamX)*KinkyDungeonGridSizeDisplay, + Top: pipY, + Width: 10, + Height: 10, + Color: "#ffffff", + zIndex: 10, + LineWidth: 2, + }); + else { + DrawCrossKD(kdenemystatusboard, kdpixisprites, enemy.id + "Bpip+" + pip, { + Left: canvasOffsetX + 15 + (xx - CamX)*KinkyDungeonGridSizeDisplay, + Top: pipY + 4, + Width: 6, + Height: 6, + Color: "#ffffff", + zIndex: 10, + LineWidth: 2, + }); + } + pipY += pipSpacing; + } + } + } + + if (KDCanDodge(enemy)) { + if (enemy.dodges >= 1) { + let pipY = 15 + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay; + let pipSpacing = 0.5 * (KinkyDungeonGridSizeDisplay-25)/2; + for (let pip = 0; pip + 1 <= enemy.dodges && pip < 2; pip++) { + if (pip == 1 || enemy.dodges < 2) + DrawCircleKD(kdenemystatusboard, kdpixisprites, enemy.id + "Dpip" + pip, { + Left: canvasOffsetX + 15 + (xx - CamX)*KinkyDungeonGridSizeDisplay, + Top: pipY, + Width: 10, + Height: 10, + Color: "#ffffff", + zIndex: 10, + LineWidth: 2, + }); + else { + DrawCrossKD(kdenemystatusboard, kdpixisprites, enemy.id + "Dpip+" + pip, { + Left: canvasOffsetX + 15 + (xx - CamX)*KinkyDungeonGridSizeDisplay, + Top: pipY + 4, + Width: 6, + Height: 6, + Color: "#ffffff", + zIndex: 10, + LineWidth: 2, + }); + } + pipY += pipSpacing; + } + } + } + + if ((KDAllied(enemy) || enemy.distraction > 0 || ((enemy.lifetime != undefined || enemy.playerdmg || (enemy.shield) || enemy.hp < enemy.Enemy.maxhp || enemy.boundTo || enemy.boundLevel))) && KDCanSeeEnemy(enemy, playerDist)) { + + + + let spacing = 6; + // Draw binding bars + let helpless = KDHelpless(enemy); + let bindAmpMod = 1;//KDGetBindAmp(enemy, bindAmpModBase); + let maxbars = Math.min(KDMaxBindingBars, 1 + KDNPCStruggleThreshMult(enemy)); + if (enemy.boundLevel != undefined && enemy.boundLevel > 0) { + if (!helpless) { + let visualbond = bindAmpMod * enemy.visual_boundlevel; + let bindingBars = Math.ceil( visualbond / enemy.Enemy.maxhp); + let hasHelp = KDEnemyHasHelp(enemy); + let SM = KDGetEnemyStruggleMod(enemy, false, false, hasHelp); + let futureBound = KDPredictStruggle(enemy, SM, 1, hasHelp ? 0 : maxbars); + for (let i = 0; i < bindingBars && i < maxbars; i++) { + if (i > 0) II++; + let mod = visualbond - bindAmpMod * futureBound.boundLevel; + // Part that will be struggled out of + KinkyDungeonBarTo(kdenemystatusboard, canvasOffsetX + (xx - CamX + 0.1)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay + 12 - 15 - spacing*II, + KinkyDungeonGridSizeDisplay * 0.8, 7, Math.min(1, (visualbond - i * enemy.Enemy.maxhp) / enemy.Enemy.maxhp) * 100, "#ffffff", "#52333f"); + // Separator between part that will be struggled and not + KinkyDungeonBarTo(kdenemystatusboard, 1 + canvasOffsetX + (xx - CamX + 0.1)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay + 12 - 15 - spacing*II, + KinkyDungeonGridSizeDisplay * 0.8, 7, Math.min(1, (visualbond - mod - i * enemy.Enemy.maxhp) / enemy.Enemy.maxhp) * 100, "#444444", "none"); + + } + II -= Math.max(0, Math.min(bindingBars-1, maxbars-1)); + // Temp value of bondage level, decremented based on special bound level and priority + let bb = 0; + let bcolor = "#ffae70"; + let bondage = []; + if (futureBound.specialBoundLevel) { + for (let b of Object.entries(futureBound.specialBoundLevel) as [string, any][]) { + bondage.push({name: b[0], amount: b[1] * bindAmpMod, level: 0, pri: KDSpecialBondage[b[0]].priority}); + } + bondage = bondage.sort((a, b) => { + return b.pri - a.pri; + }); + } else { + bondage.push({name: "Normal", amount: 0, level: futureBound.boundLevel, pri: 0}); + } + + for (let b of bondage) { + if (!b.level) { + b.level = bb + b.amount; + bb = b.level; + } + } + for (let i = 0; i < bindingBars && i < maxbars; i++) { + if (i > 0) II++; + // Determine current bondage type + let bars = false; + for (let bi = bondage.length - 1; bi >= 0; bi--) { + let b = bondage[bi]; + // Filter out anything that doesnt fit currently + if (b.level > i * enemy.Enemy.maxhp) { + bcolor = KDSpecialBondage[b.name] ? KDSpecialBondage[b.name].color : "#ffae70"; + // Struggle bars themselves + KinkyDungeonBarTo(kdenemystatusboard, canvasOffsetX + (xx - CamX + 0.1)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay + 12 - 15 - spacing*II, + KinkyDungeonGridSizeDisplay * 0.8, 7, Math.min(1, (Math.max(0, b.level - i * enemy.Enemy.maxhp)) / enemy.Enemy.maxhp) * 100, bcolor, "none", + undefined, undefined, bars ? [0.25, 0.5, 0.75] : undefined, bars ? "#85522c" : undefined, bars ? "#85522c" : undefined, 57.5 + b.pri*0.01); + bars = true; + } + + } + + } + } else { + // TODO draw a lock or some other icon + } + } + // Draw HP bar + if (!helpless) { + if (enemy.hp < enemy.Enemy.maxhp || KDAllied(enemy) || enemy.boundTo || enemy.shield > 0) { + // Draw hp bar + let fg = enemy.boundTo ? (KDAllied(enemy) ? "#77aaff" : "#dd88ff") : (KDAllied(enemy) ? "#00ff88" : "#ff5277"); + let bg = KDAllied(enemy) ? "#aa0000" : "#000000"; + KinkyDungeonBarTo(kdenemystatusboard, canvasOffsetX + (xx - CamX + (enemy.boundTo? 0.1 : 0.05))*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 15 - II * spacing, + hpbarMult * KinkyDungeonGridSizeDisplay * (enemy.boundTo? 0.8 : 0.9), enemy.boundTo? 7 : 9, enemy.visual_hp / enemy.Enemy.maxhp * 100, fg, bg); + + if (enemy.shield > 0) { + KinkyDungeonBarTo(kdenemystatusboard, canvasOffsetX + (xx - CamX + (enemy.boundTo? 0.1 : 0.05))*KinkyDungeonGridSizeDisplay, + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 15 - 5 - II * spacing, + shieldbarMult * KinkyDungeonGridSizeDisplay * (enemy.boundTo? 0.8 : 0.9), 8, enemy.shield / KDGetMaxShield(enemy) * 100, '#92e8c0', bg); + + } + II++; + } + if (enemy.Enemy.maxmana > 0) { + KinkyDungeonBarTo(kdenemystatusboard, canvasOffsetX + (xx - CamX + (enemy.boundTo? 0.1 : 0.05))*KinkyDungeonGridSizeDisplay, + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 15 + 5 - II * spacing, + KinkyDungeonGridSizeDisplay * (enemy.boundTo? 0.8 : 0.9), 5, (enemy.mana || 0) / enemy.Enemy.maxmana * 100, '#4f6ab8', "#000000"); + + } + + + if (enemy.distraction > 0) { + // Draw distraction bar + KinkyDungeonBarTo(kdenemystatusboard, canvasOffsetX + (xx - CamX + 0.1)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 15 - II * spacing, + KinkyDungeonGridSizeDisplay * 0.8, 6, enemy.distraction / enemy.Enemy.maxhp * 100, "#fda1ff", "#9300ff"); + if (enemy.desire > 0) + KDDraw(kdenemystatusboard, kdpixisprites, enemy.id + "_ar_heart", KinkyDungeonRootDirectory + (enemy.distraction >= 0.9 * enemy.Enemy.maxhp ? "UI/HeartExtreme.png" : "UI/Heart.png"), + -7 + canvasOffsetX + (xx - CamX + enemy.desire / enemy.Enemy.maxhp * 0.8 + 0.1)*KinkyDungeonGridSizeDisplay, + -4 + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 15 - II * spacing, + 14, 14 , undefined, { + zIndex: 63, + }); + II++; + } + + if (enemy.lifetime != undefined && enemy.maxlifetime > 0 && enemy.lifetime <= enemy.maxlifetime && enemy.maxlifetime < 999 && ((!enemy.Enemy.hidetimerbar && !enemy.hideTimer) || KDAllied(enemy))) { + // Draw lifetime bar + KinkyDungeonBarTo(kdenemystatusboard, canvasOffsetX + (xx - CamX + (enemy.boundTo? 0.1 : 0.05))*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 15 - II * spacing, + KinkyDungeonGridSizeDisplay * (enemy.boundTo? 0.8 : 0.9), 8, enemy.visual_lifetime / enemy.maxlifetime * 100, "#cccccc", "#000000"); II++; + } + } + + if (enemy.teleporting > 0 && enemy.teleportingmax > 1 && enemy.teleporting < enemy.teleportingmax) { + // Draw lifetime bar + KinkyDungeonBarTo(kdenemystatusboard, canvasOffsetX + (xx - CamX + (enemy.boundTo? 0.1 : 0.05))*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 15 - II * spacing, + KinkyDungeonGridSizeDisplay * (enemy.boundTo? 0.8 : 0.9), 8, (enemy.teleportingmax - enemy.teleporting) / enemy.teleportingmax * 100, "#92e8c0", "#4c6885"); II++; + } + } + } + } + + + // Draw status bubbles + let canSee = KDCanSeeEnemy(enemy, playerDist); + let canHear = KDCanHearEnemy(KinkyDungeonPlayerEntity, enemy); + if (canSee || canHear) { + // Draw thought bubbles + let yboost = II * -20; + if (canSee) { + if ((KDToggles.ForceWarnings || KDMouseInPlayableArea()) && (enemy.Enemy.specialdialogue || enemy.specialdialogue || (enemy.prisondialogue && KDIsImprisoned(enemy)))) { + KDDraw(kdenemystatusboard, kdpixisprites, enemy.id + "_th", KinkyDungeonRootDirectory + "Conditions/Dialogue.png", + canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 23, + }); + } + let bb = false; + if (KDToggles.ShowNPCStatuses && enemy.Enemy.bound && KDThoughtBubbles.has(enemy.id)) { + let bubble = KDThoughtBubbles.get(enemy.id); + if (bubble.index + bubble.duration >= KinkyDungeonCurrentTick && (enemy.ambushtrigger || !KDAIType[KDGetAI(enemy)]?.ambush)) { + bb = true; + let name = CommonTime() % 1000 < 500 ? "Thought" : bubble.name; + if (name != "Thought" || !((enemy.lifetime != undefined || enemy.hp < enemy.Enemy.maxhp || enemy.boundLevel))) + KDDraw(kdenemystatusboard, kdpixisprites, enemy.id + "_th", KinkyDungeonRootDirectory + `Conditions/Thought/${name}.png`, + canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 23, + }); + } + } + if (!KDHelpless(enemy) && !KDIsImprisoned(enemy)) { + if (!KinkyDungeonAggressive(enemy) && ((!KDAllied(enemy) && !enemy.Enemy.specialdialogue && !bb) || KDEnemyHasFlag(enemy, "Shop")) && !enemy.playWithPlayer && enemy.Enemy.movePoints < 90 && !KDAmbushAI(enemy)) { + KDDraw(kdenemystatusboard, kdpixisprites, enemy.id + "_shop", KinkyDungeonRootDirectory + ((KDEnemyHasFlag(enemy, "Shop")) ? "Conditions/Shop.png" : (KDAllied(enemy) ? "Conditions/Heart.png" : "Conditions/Peace.png")), + canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 22, + }); + } else if (!bb && enemy.aware && KDHostile(enemy) && enemy.vp >= 0.5 && KDEnemyHasFlag(enemy, "targ_player") && enemy.Enemy && !enemy.Enemy.noAlert && enemy.Enemy.movePoints < 90 && !KDAmbushAI(enemy)) { + KDDraw(kdenemystatusboard, kdpixisprites, enemy.id + "_aw", KinkyDungeonRootDirectory + "Conditions/Aware.png", + canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 22, + }); + } else if (!bb && enemy.vp > 0.01 && KDHostile(enemy) && enemy.Enemy && !enemy.Enemy.noAlert && enemy.Enemy.movePoints < 90 && !KDAmbushAI(enemy)) { + let sneakThreshold = enemy.Enemy.sneakThreshold ? enemy.Enemy.sneakThreshold : 2; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")) sneakThreshold = Math.max(0.1, sneakThreshold + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")); + if (enemy.vp > sneakThreshold/2) { + KDDraw(kdenemystatusboard, kdpixisprites, enemy.id + "_vp", KinkyDungeonRootDirectory + "Conditions/vp.png", + canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 22, + }); + } + if (enemy.vp < sneakThreshold) + KinkyDungeonBarTo(kdenemystatusboard, + canvasOffsetX + (xx - CamX + 0.15)*KinkyDungeonGridSizeDisplay, + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - 0, + KinkyDungeonGridSizeDisplay * 0.7, 7, enemy.vp / sneakThreshold * 100, "#ffffff", "#333333"); + } + if (enemy.vulnerable > 0) + KDDraw(kdenemystatusboard, kdpixisprites, enemy.id + "_vuln", KinkyDungeonRootDirectory + "Conditions/" + ( + KDToughArmor(enemy) ? "VulnerableBlocked" : "Vulnerable") + ".png", + canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/2 + yboost, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 22, + }); + } + if (!tooltip && (((!KDAmbushAI(enemy) || enemy.ambushtrigger) + && (MouseIn(canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay) + || MouseIn(canvasOffsetX + (enemy.x - CamX)*KinkyDungeonGridSizeDisplay, canvasOffsetY + (enemy.y - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay)) + || (KDGameData.CurrentDialog && KDGetSpeaker() == enemy)))) { + let faction = KDGetFaction(enemy); + if (faction && (!KinkyDungeonHiddenFactions.has(faction) || KinkyDungeonTooltipFactions.includes(faction))) { + let tt = TextGet("KinkyDungeonFaction" + faction); + let ttlength = 10; + if (CJKcheck(tt,2)){ + DrawTextFitKD(tt, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, 10 + tt.length * 8, "white", "black"); + yboost += -2*KinkyDungeonGridSizeDisplay/7; + } else { + let ttCJKcheck1 = CJKcheck(tt,1); + let ttCJKcheck2 = CJKcheck(tt); + + if (ttCJKcheck1 && typeof (ttCJKcheck1) != 'boolean'){ + for (const i in ttCJKcheck1){ttlength += ttCJKcheck1[i].length * 8;} + } + if (ttCJKcheck2 && typeof (ttCJKcheck2) != 'boolean'){ + for (const i in ttCJKcheck2){ttlength += ttCJKcheck2[i].length * 16;} + } + DrawTextFitKD(tt, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, ttlength, "white", "black"); + yboost += -3*KinkyDungeonGridSizeDisplay/8; + } + } + + let name = TextGet("Name" + enemy.Enemy.name); + let namelength = 10; + if (CJKcheck(name,2)){ + DrawTextFitKD(name, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, 10 + name.length * 8, "white", "black"); + } else { + let nameCJKcheck1 = CJKcheck(name,1); + let nameCJKcheck2 = CJKcheck(name); + + if (nameCJKcheck1 && typeof (nameCJKcheck1) != 'boolean'){ + for (const i in nameCJKcheck1){namelength += nameCJKcheck1[i].length * 8;} + } + if (nameCJKcheck2 && typeof (nameCJKcheck2) != 'boolean'){ + for (const i in nameCJKcheck2){namelength += nameCJKcheck2[i].length * 16;} + } + DrawTextFitKD(name, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/3, namelength, "white", "black"); + } + + if (enemy.CustomName) { + DrawTextKD(enemy.CustomName, canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/1.5, enemy.CustomNameColor, "black"); + } + tooltip = true; + } + } + + if (enemy.dialogue && !tooltip) { + let dialogueOffset = 6; + while (dialogueOffset < 300 && (KDDialogueSlots[yboost + canvasOffsetY + (yy - CamY - CamYoffset)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/1.5 - dialogueOffset])) { + dialogueOffset += 18; + } + KDDialogueSlots[yboost + canvasOffsetY + (yy - CamY - CamYoffset)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/1.5 - dialogueOffset] = true; + + let dialougelenth = 30; + if (CJKcheck(enemy.dialogue,2)){ + DrawTextFitKDTo(kdenemydialoguecanvas, enemy.dialogue, + canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, + yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - dialogueOffset, 120 + enemy.dialogue.length * 8, enemy.dialogueColor, "#000000", 18, undefined, 30); + } else { + let dialougeCJKcheck1 = CJKcheck(enemy.dialogue,1); + let dialougeCJKcheck2 = CJKcheck(enemy.dialogue); + + if (dialougeCJKcheck1 && typeof (dialougeCJKcheck1) != 'boolean'){ + for (const i in dialougeCJKcheck1){dialougelenth += dialougeCJKcheck1[i].length * 8;} + } + if (dialougeCJKcheck2 && typeof (dialougeCJKcheck2) != 'boolean'){ + for (const i in dialougeCJKcheck2){dialougelenth += dialougeCJKcheck2[i].length * 16;} + } + DrawTextFitKDTo(kdenemystatusboard, enemy.dialogue, + canvasOffsetX + (xx - CamX)*KinkyDungeonGridSizeDisplay + KinkyDungeonGridSizeDisplay/2, + yboost + canvasOffsetY + (yy - CamY)*KinkyDungeonGridSizeDisplay - KinkyDungeonGridSizeDisplay/1.5 - dialogueOffset, dialougelenth, enemy.dialogueColor, "#000000", 18, undefined, 30); + } + } + } + } + } +} + +let KDDialogueSlots = {}; + +/** + * @param enemy + */ +function KDEnemyName(enemy: entity): string { + return enemy.CustomName || KDGetName(enemy.id) || TextGet("Name" + enemy.Enemy?.name); +} +/** + * @param enemy + */ +function KDEnemyNameColor(enemy: entity): string { + return enemy.CustomNameColor || KDGetNameColor(enemy.id); +} + +function KDGetName(id: number): string { + return KDGameData.Collection[id + ""]?.name || (KDIsNPCPersistent(id) ? KDGetPersistentNPC(id).Name : ""); +} +function KDGetNameColor(id: number): string { + return KDGameData.Collection[id + ""]?.color || "#ffffff"; +} + +/** + * Resyncs the boundlevel so it matches en.specialBoundLevel + * Or else sets it to 0 + * @param en + */ +function KDResyncBondage(en: entity) { + if (en.specialBoundLevel) { + en.boundLevel = 0; + for (let value of Object.values(en.specialBoundLevel)) { + en.boundLevel += value; + } + if (en.boundLevel == 0) { + en.specialBoundLevel = undefined; + } + } else if (en.boundLevel) { + en.boundLevel = 0; + } +} + +/** + * Sets the bondage of an enemy to be the expected amount + * @param en + * @param mode -1 is downgrade only, +1 is upgrade only + */ +function KDSetToExpectedBondage(en: entity, mode: number = 0) { + let expected = KDGetExpectedBondageAmount(en.id,en); + let expectedSum = 0; + if (expected) for (let value of Object.values(expected)) { + expectedSum += value; + } + if (mode == 0) { + if (expectedSum > 0) { + en.boundLevel = expectedSum; + en.specialBoundLevel = JSON.parse(JSON.stringify(expected)); + } else { + en.boundLevel = 0; + en.specialBoundLevel = undefined; + } + } else if (mode > 0) { + if (expectedSum > (en.boundLevel || 0)) { + KDResyncBondage(en); + if (!en.specialBoundLevel) en.specialBoundLevel = {}; + for (let entry of Object.entries(expected)) { + en.specialBoundLevel[entry[0]] = Math.max(en.specialBoundLevel[entry[0]] || 0, entry[1]); + } + KDResyncBondage(en); + } + } else if (mode < 0) { + if (expectedSum > 0 && expectedSum < (en.boundLevel || 0)) { + KDResyncBondage(en); + if (!en.specialBoundLevel) en.specialBoundLevel = {}; + for (let entry of Object.entries(expected)) { + en.specialBoundLevel[entry[0]] = Math.min(en.specialBoundLevel[entry[0]] || 0, entry[1] || 0); + } + KDResyncBondage(en); + } else if (expectedSum == 0) { + en.boundLevel = 0; + en.specialBoundLevel = undefined; + } + } +} + +/** + * @param en + */ +function KDFreeNPC(en: entity) { + if (en.prisondialogue) { + en.prisondialogue = undefined; + } else if (en.specialdialogue && KDEnemyHasFlag(en, "imprisoned")) { + en.specialdialogue = undefined; + } + KinkyDungeonSetEnemyFlag(en, "imprisoned", 0); + if (!KDGameData.NPCRestraints) KDGameData.NPCRestraints = {}; + else if (KDGameData.NPCRestraints["" + en.id]?.Device) { + KDSetNPCRestraint(en.id, "Device", undefined); + } + if (KDGameData.Collection[en.id + ""] && KDIsNPCPersistent(en.id)) { + KDGetPersistentNPC(en.id).collect = true; // Collect them) + //KDTPToSummit(en.id); + } + if (KDIsNPCPersistent(en.id)) { + delete KDGetPersistentNPC(en.id).captured; + } + if (en.hp < 0.52) en.hp = 0.52; + KDSetToExpectedBondage(en, 0); + KDUpdatePersistentNPC(en.id); +} + +/** + * @param id + */ +function KDFreeNPCID(id: number) { + let en = KDGetGlobalEntity(id); + KDFreeNPC(en); +} + +let KDDrewEnemyTooltip = ""; +let KDDrewEnemyTooltipThisFrame = ""; + +let KDCurrentEnemyTooltip: entity = null; + +/** + * @param enemy + * @param offset + */ +function KDDrawEnemyTooltip(enemy: entity, offset: number): number { + let analyze = KDGameData.Collection[enemy.id + ""] || KinkyDungeonFlags.get("AdvTooltips") || KDHasSpell("ApprenticeKnowledge"); + // Previously this was dependent on using a spell called Analyze. Now it is enabled by default if you have Knowledge + let TooltipList = []; + if (KDEnemyName(enemy) != TextGet("Name" + enemy.Enemy.name)) + TooltipList.push({ + str: KDEnemyName(enemy), + fg: KDEnemyNameColor(enemy), + bg: "#000000", + size: 28, + center: true, + }); + TooltipList.push({ + str: TextGet("Name" + enemy.Enemy.name), + fg: enemy.Enemy.color || "#ff5277", + bg: "#000000", + size: 24, + center: true, + }); + + KDCurrentEnemyTooltip = enemy; + + KDQuickGenNPC(enemy, enemy.CustomName != undefined || !!enemy.Enemy?.outfit); + + if (KDNPCChar.get(enemy.id)) { + if (KDDrewEnemyTooltip && KDDrewEnemyTooltip != "" + enemy.id) { + KDDrewEnemyTooltip = ""; + } + KDDrewEnemyTooltipThisFrame = "" + enemy.id; + TooltipList.push({ + str: "", + fg: "#ffffff", + bg: "#000000", + size: 144, + center: true, + npcSprite: KDNPCChar.get(enemy.id), + id: enemy.id, + }); + } + + if (enemy.shield > 0) { + TooltipList.push({ + str: TextGet("KDTooltipShield") + Math.round(enemy.shield*10), + fg: "#88ffff", + bg: "#000000", + size: 20, + center: true, + }); + } + TooltipList.push({ + str: TextGet("KDTooltipHP") + Math.round(enemy.hp*10) + " / " + Math.round(enemy.Enemy.maxhp * 10), + fg: "#ffffff", + bg: "#000000", + size: 20, + center: true, + }); + if (enemy.boundLevel) { + + if (KDToggles.BindPercent) { + TooltipList.push({ + str: TextGet("KDTooltipBinding") + Math.round(enemy.boundLevel/enemy.Enemy.maxhp*100/KDGetBindEffectMult(enemy)) + "%", + fg: "#ffae70", + bg: "#000000", + size: 20, + center: true, + }); + } else { + TooltipList.push({ + str: TextGet("KDTooltipBinding") + Math.round(enemy.boundLevel*10) + " / " + + Math.round(KDGetBindEffectMult(enemy) * enemy.Enemy.maxhp *10) + "", + fg: "#ffae70", + bg: "#000000", + size: 20, + center: true, + }); + } + } + if (enemy.boundTo) { + TooltipList.push({ + str: TextGet(enemy.weakBinding ? "KDTooltipWeakBinding" : "KDTooltipNormalBinding"), + fg: KDHostile(enemy) ? "#88ff88" : "#ff5277", + bg: "#000000", + size: 14, + center: true, + }); + let caster = KinkyDungeonFindID(enemy.boundTo); + if (caster || caster?.player) + TooltipList.push({ + str: TextGet("KDTooltipBoundTo").replace("ENEMYNAME", TextGet("Name" + caster.Enemy.name)), + fg: KDHostile(enemy) ? "#88ff88" : "#ff5277", + bg: "#000000", + size: 14, + center: true, + }); + else + TooltipList.push({ + str: TextGet("KDTooltipDisappearing"), + fg: "#ff5277", + bg: "#000000", + size: 14, + center: true, + }); + } + let statuses = []; + + if (KDIsDistracted(enemy)) statuses.push({name: "Distracted", count: undefined}); + if (enemy.vulnerable > 0) statuses.push({name: "Vulnerable", count: undefined}); + if (KDIsFlying(enemy)) statuses.push({name: "Flying", count: undefined}); + if (KDEntityBuffedStat(enemy, "Vibration")) statuses.push({name: "Vibed", count: undefined}); + if (enemy.stun > 0) statuses.push({name: "Stunned", count: Math.round(enemy.stun)}); + if (enemy.bind > 0) statuses.push({name: "Bind", count: Math.round(enemy.bind)}); + if (enemy.silence > 0) statuses.push({name: "Silence", count: Math.round(enemy.silence)}); + if (enemy.disarm > 0) statuses.push({name: "Disarm", count: Math.round(enemy.disarm)}); + if (enemy.blind > 0) statuses.push({name: "Blind", count: Math.round(enemy.blind)}); + if (enemy.slow > 0 || KDEntityBuffedStat(enemy, "MoveSpeed") < 0) statuses.push({name: "Slow", count: Math.round(enemy.slow)}); + if (KDBoundEffects(enemy)) statuses.push({name: "Bound" + (KDHelpless(enemy) ? 10 : KDBoundEffects(enemy))}); + if (KDEntityBuffedStat(enemy, "Plug")) statuses.push({name: "Plug", count: undefined}); + if (KDEntityBuffedStat(enemy, "Chastity")) statuses.push({name: "Belt", count: undefined}); + + if (statuses.length > 0) { + let strings = [""]; + let strr = ""; + let count = 0; + let maxcount = 4; + for (let stat of statuses) { + count += 1; + if (count > maxcount) { + strr = ""; + strings.push(""); + } + if (strr) strr = strr + ", "; + strr = strr + `${TextGet("KDStatusTooltipEnemy" + stat.name)}`; + if (stat.count) strr = strr + ` (${stat.count})`; + strings[strings.length - 1] = strr; + } + for (let stringlisted of strings) + TooltipList.push({ + str: stringlisted, + fg: "#dddddd", + bg: "#000000", + size: 14, + center: true, + }); + } + + + TooltipList.push({ + str: "", + fg: "#ffaa55", + bg: "#000000", + size: 12, + }); + if (!enemy.Enemy.tags?.nobrain && !enemy.Enemy.tags?.scenery && KDIsHumanoid(enemy)) { + let opinion = Math.max(-3, Math.min(3, Math.round(KDGetModifiedOpinion(enemy)/KDOpinionThreshold))); + let str = TextGet("KDTooltipOpinion"+opinion); + TooltipList.push({ + str: str, + fg: "#ffffff", + bg: KDTextGray0, + size: 20, + }); + + let ttt = KDGetAwareTooltip(enemy); + TooltipList.push({ + str: TextGet("KDTooltipAware" + ttt.suff), + fg: ttt.color, + bg: "#000000", + size: 20, + }); + } + let armor = (enemy.Enemy.armor || 0) + KinkyDungeonGetBuffedStat(enemy.buffs, "Armor"); + let spellResist = (enemy.Enemy.spellResist || 0) + KinkyDungeonGetBuffedStat(enemy.buffs, "SpellResist"); + let armorBreak = KinkyDungeonGetBuffedStat(enemy.buffs, "ArmorBreak"); + let spellResistBreak = KinkyDungeonGetBuffedStat(enemy.buffs, "SpellResistBreak"); + let block_phys = (enemy.Enemy.Resistance?.block_phys || 0) + KinkyDungeonGetBuffedStat(enemy.buffs, "BlockPhys"); + let block_magic = (enemy.Enemy.Resistance?.block_magic || 0) + KinkyDungeonGetBuffedStat(enemy.buffs, "BlockMagic"); + //let evasion = KinkyDungeonMultiplicativeStat(enemy.Enemy.evasion) + //* KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(enemy.buffs, "Evasion")); + + if (block_phys) { + let st = TextGet("KinkyDungeonTooltipBlockPhys").replace("AMOUNT", "" + Math.round(10* block_phys) + ); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: KDTextGray0, + size: 20, + }); + } + if (block_magic) { + let st = TextGet("KinkyDungeonTooltipBlockMagic").replace("AMOUNT", "" + Math.round(10* block_magic) + ); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: KDTextGray0, + size: 20, + }); + } + if (armor) { + let st = TextGet("KinkyDungeonTooltipArmor").replace("AMOUNT", "" + Math.round(10* armor) + (block_phys ? `(+${Math.round(10* block_phys)})` : "") + + (armorBreak ? ` - ${Math.round(10* armorBreak)}` : "")); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: KDTextGray0, + size: 20, + }); + } + if (spellResist) { + let st = TextGet("KinkyDungeonTooltipSpellResist").replace("AMOUNT", "" + Math.round(10* spellResist) + (block_magic ? `(+${Math.round(10* block_magic)})` : "") + + (spellResistBreak ? ` - ${Math.round(10* spellResistBreak)}` : "")); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: KDTextGray0, + size: 20, + }); + } + /*if (evasion != 1.0) { + let st = TextGet("KinkyDungeonTooltipEvasion").replace("AMOUNT", "" + Math.round(100 - 100 * evasion)); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: KDTextGray0, + size: 20, + }); + }*/ + if (enemy.Enemy.tags.unstoppable) { + let st = TextGet("KDunstoppable"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } else if (enemy.Enemy.tags.unflinching) { + let st = TextGet("KDunflinching"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } else if (enemy.Enemy.tags.relentless) { + let st = TextGet("KDrelentless"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } + if (KDEntityBlocksExp(enemy)) { + let st = TextGet("KDBulwark"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } + if (KDAbsoluteArmor(enemy)) { + let st = TextGet("KDAbsoluteArmor"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } else if (KDToughArmor(enemy)) { + let st = TextGet("KDToughArmor"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } + if (KinkyDungeonGetBuffedStat(enemy.buffs, "StunResist")) { + let st = TextGet("KDStunResist"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } + + let accData = { + accuracy: KDEnemyAccuracy(enemy, KDPlayer()), + attacker: enemy, + target: KDPlayer(), + origAccuracy: 0, + } + accData.origAccuracy = accData.accuracy; + KinkyDungeonSendEvent("calcEnemyAccuracy", accData); + if (accData.accuracy < 1) { + let st = TextGet("KinkyDungeonTooltipDealsAccuracy").replace( + "AMNT", (accData.origAccuracy != accData.accuracy ? + Math.round(100 * (accData.origAccuracy)) + " => " : "") + Math.round(100 * (accData.accuracy)) + ); + TooltipList.push({ + str: st, + fg: "#e64539", + bg: "#000000", + size: 20, + }); + } + + if (analyze) { + if (enemy.Enemy.disarm) { + let dt = KinkyDungeonDamageTypes[enemy.Enemy.dmgType]; + if (dt) { + let st = TextGet("KDTooltipDisarm").replace("DISARMCHANCE", "" + Math.round(enemy.Enemy.disarm * 100)); + TooltipList.push({ + str: st, + fg: "#ffaa55", + bg: "#000000", + size: 20, + }); + } + } + + if (enemy.Enemy.dmgType) { + let dt = KinkyDungeonDamageTypes[enemy.Enemy.dmgType]; + if (dt) { + let st = TextGet("KinkyDungeonTooltipDealsDamage").replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType" + enemy.Enemy.dmgType)); + TooltipList.push({ + str: st, + fg: dt.color, + bg: dt.bg, + size: 20, + }); + } + } + if (enemy.Enemy.blindSight > 0) { + let st = TextGet("KDBlindsight"); + TooltipList.push({ + str: st, + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + } + } + + if (KDGameData.NPCRestraints[enemy.id]) { + let renderedID = {}; + let items = Object.values(KDGameData.NPCRestraints[enemy.id]).filter((item) => { + let ret = !renderedID[item.id]; + renderedID[item.id] = true; + return ret; + }); + if (items.length > 0) { + TooltipList.push({ + str: "", + fg: "#ffaa55", + bg: "#000000", + size: 8, + }); + TooltipList.push({ + str: TextGet("KDTooltipInventoryWorn"), + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + + for (let i = 0; i < 6 && i < items.length; i++) { + TooltipList.push({ + str: TextGet(KDGetItemName(items[i], Restraint)), + fg: "#ffffff", + bg: "#000000", + size: 18, + }); + } + if (items.length > 6) { + TooltipList.push({ + str: TextGet("KDTooltipInventoryFull").replace("NUMBER", "" + (items.length - 6)), + fg: "#ffffff", + bg: "#000000", + size: 18, + }); + } + + + TooltipList.push({ + str: "", + fg: "#ffaa55", + bg: "#000000", + size: 8, + }); + } + + } + + if (enemy.items && enemy.items.length > 0) { + TooltipList.push({ + str: "", + fg: "#ffaa55", + bg: "#000000", + size: 8, + }); + TooltipList.push({ + str: TextGet("KDTooltipInventory"), + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + + for (let i = 0; i < 6 && i < enemy.items.length; i++) { + TooltipList.push({ + str: KDGetItemNameString(enemy.items[i]), + fg: "#ffffff", + bg: "#000000", + size: 18, + }); + } + if (enemy.items.length > 6) { + TooltipList.push({ + str: TextGet("KDTooltipInventoryFull").replace("NUMBER", "" + (enemy.items.length - 6)), + fg: "#ffffff", + bg: "#000000", + size: 18, + }); + } + + + TooltipList.push({ + str: "", + fg: "#ffaa55", + bg: "#000000", + size: 8, + }); + } + + if (analyze) { + let map = Object.assign({}, enemy.Enemy.tags); + if (enemy.Enemy.spellResist) + map.magic = true; + if (enemy.Enemy.Resistance?.profile) { + for (let p of enemy.Enemy.Resistance?.profile) { + for (let dt of Object.keys(KDResistanceProfiles[p])) { + map[dt] = true; + } + } + } + let list = Array.from(Object.keys(map)); + let magic = false; + let repeats = {}; // Record? + //for (let t of list) { + let t = list; + for (let dt of Object.values(KinkyDungeonDamageTypes)) { + if ((t.includes(dt.name + "resist") || t.includes(dt.name + "weakness") || t.includes(dt.name + "immune") || t.includes(dt.name + "severeweakness")) + || (dt.name == "magic" && t.includes("magic"))) { + let mult = 1.0; + if (t.includes(dt.name + "resist")) mult = 0.5; + else if (t.includes(dt.name + "weakness")) mult = 1.5; + else if (t.includes(dt.name + "immune")) mult = 0; + else if (t.includes(dt.name + "severeweakness")) mult = 2.0; + if (dt.name == "magic" && !magic) { + magic = true; + } + let st = TextGet("KinkyDungeonTooltipWeakness") + .replace("MULTIPLIER", "" + Math.round(mult * 100)/100) + .replace("DAMAGETYPE", TextGet("KinkyDungeonDamageType"+ dt.name)); + let name = TextGet("KinkyDungeonDamageType"+ dt.name); + + if (!repeats['DR']) { + TooltipList.push({ + str: "", + fg: "#ffffff", + bg: "#000000", + size: 10, + }); + TooltipList.push({ + str: TextGet("KDTooltipDamageResists"), + fg: "#ffffff", + bg: "#000000", + size: 20, + }); + repeats['DR'] = true; + } + if (!repeats[name]) + TooltipList.push({ + str: st, + fg: dt.color, + bg: dt.bg, + size: 18, + }); + repeats[name] = true; + } + } + //} + } + return KDDrawTooltip(TooltipList, offset); +} + + + +/** + * @param enemy + * @param offset + */ +function KDDrawEnemyDialogue(enemy: entity, offset: number): number { + // Previously this was dependent on using a spell called Analyze. Now it is enabled by default if you have Knowledge + let TooltipList = []; + if (KDEnemyName(enemy) != TextGet("Name" + enemy.Enemy.name)) + TooltipList.push({ + str: KDEnemyName(enemy), + fg: KDEnemyNameColor(enemy), + bg: "#000000", + size: 28, + center: true, + }); + TooltipList.push({ + str: TextGet("Name" + enemy.Enemy.name), + fg: enemy.Enemy.color || "#ff5277", + bg: "#000000", + size: 24, + center: true, + }); + + KDCurrentEnemyTooltip = enemy; + + KDQuickGenNPC(enemy, true); + + if (KDNPCChar.get(enemy.id)) { + if (KDDrewEnemyTooltip && KDDrewEnemyTooltip != "d" + enemy.id) { + KDDrewEnemyTooltip = ""; + } + KDDrewEnemyTooltipThisFrame = "d" + enemy.id; + TooltipList.push({ + str: "", + fg: "#ffffff", + bg: "#000000", + size: 500, + center: true, + npcSprite: KDNPCChar.get(enemy.id), + id: enemy.id, + }); + } + + if (enemy.shield > 0) { + TooltipList.push({ + str: TextGet("KDTooltipShield") + Math.round(enemy.shield*10), + fg: "#88ffff", + bg: "#000000", + size: 24, + center: true, + }); + } + TooltipList.push({ + str: TextGet("KDTooltipHP") + Math.round(enemy.hp*10) + " / " + Math.round(enemy.Enemy.maxhp * 10), + fg: "#ffffff", + bg: "#000000", + size: 20, + center: true, + }); + if (enemy.boundLevel) { + if (KDToggles.BindPercent) { + TooltipList.push({ + str: TextGet("KDTooltipBinding") + Math.round(enemy.boundLevel/enemy.Enemy.maxhp*100/KDGetBindEffectMult(enemy)) + "%", + fg: "#ffae70", + bg: "#000000", + size: 20, + center: true, + }); + } else { + TooltipList.push({ + str: TextGet("KDTooltipBinding") + Math.round(enemy.boundLevel*10) + " / " + + Math.round(KDGetBindEffectMult(enemy) * enemy.Enemy.maxhp *10) + "", + fg: "#ffae70", + bg: "#000000", + size: 20, + center: true, + }); + } + + + + } + + return KDDrawTooltip(TooltipList, offset, true); +} + +function KDGetColor(enemy: entity): string { + //return "#ffffff"; + if (enemy?.CustomNameColor) return enemy.CustomNameColor; + if (enemy?.['color']) return enemy['color']; + if (enemy?.Enemy.color) return enemy.Enemy.color; + return "#ffffff"; +} + +let KDChampionMax = 10; + +/** + * @param enemy + * @returns Whether or not it was a Champion capture + */ +function KinkyDungeonCapture(enemy: entity): boolean { + let msg = "KinkyDungeonCapture"; + //let goddessCapture = false; + msg = "KinkyDungeonCaptureBasic"; + if (!KinkyDungeonFlags.get("tut_capture")) { + KinkyDungeonSetFlag("tut_capture", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Capture"), KDTutorialColor, 10); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Capture2"), KDTutorialColor, 10); + } + KDDropStolenItems(enemy, KDMapData); + KinkyDungeonSetEnemyFlag(enemy, "questtarget", 0); + if (KDIsImprisoned(enemy)) KDFreeNPC(enemy); + if (KDIsNPCPersistent(enemy.id)) { + KDGetPersistentNPC(enemy.id).collect = true; + KDTPToSummit(enemy.id); + KDGetPersistentNPC(enemy.id).captured = false; + KDUpdatePersistentNPC(enemy.id); + } + KinkyDungeonSendEvent("afterCapture", {enemy: enemy}); + KinkyDungeonSendActionMessage(10, + TextGet(msg).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)).replace("GODDESS", TextGet("KinkyDungeonShrine" + KDGameData.Champion)), + "lightgreen", 2, false, false, undefined, "Kills"); + return false; +} + +/** + * @param enemy + */ +function KDDropStolenItems(enemy: entity, mapData?: KDMapDataType) { + if (enemy.items && mapData) { + for (let name of enemy.items) { + if (!enemy.tempitems || !enemy.tempitems.includes(name)) { + let item = {x:enemy.x, y:enemy.y, name: name}; + (mapData).GroundItems.push(item); + } + } + enemy.items = []; + enemy.tempitems = undefined; + } +} + +/** + * @param enemy + */ +function KDClearStolenItems(enemy: entity) { + if (enemy.items) { + for (let name of enemy.items) { + if (!enemy.tempitems || !enemy.tempitems.includes(name)) { + KDAddLostItemSingle(name); + } + } + enemy.items = []; + enemy.tempitems = undefined; + } +} + +/** + * @param enemy + */ +function KDGetStolenItems(enemy: entity): string[] { + let items = []; + if (enemy.items) { + for (let name of enemy.items) { + if (!enemy.tempitems || !enemy.tempitems.includes(name)) { + items.push(name); + } + } + enemy.items = []; + enemy.tempitems = undefined; + } + return items; +} + + +/** + * @param enemy + * @param E + */ +function KinkyDungeonEnemyCheckHP(enemy: entity, E: number, mapData: KDMapDataType): boolean { + if (enemy.hp <= 0 && !KDIsImprisoned(enemy)) { + let noRepHit = false; + KinkyDungeonSendEvent("death", {enemy: enemy}); + if (((KDBoundEffects(enemy) > 3 && enemy.boundLevel > 0) || KDEntityHasFlag(enemy, "cap")) + && KDHostile(enemy) && !enemy.Enemy.tags.nocapture && enemy.playerdmg) { + KDDropStolenItems(enemy, mapData); + if (!KinkyDungeonCapture(enemy)) noRepHit = true; + } else { + KDDropStolenItems(enemy, mapData); + if (enemy == KinkyDungeonKilledEnemy) { + + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 10) + KinkyDungeonSendActionMessage(9, TextGet("Kill"+enemy.Enemy.name), "orange", 2, false, false, undefined, "Kills"); + KinkyDungeonKilledEnemy = null; + } + } + + + if (!(enemy.lifetime < 9000)) { + if (enemy.playerdmg) { + + if (!KDEntityHasFlag(enemy, "killedOnce")) { + KinkyDungeonSetEnemyFlag(enemy, "killedOnce", -1); + if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.boss) + KinkyDungeonChangeRep("Ghost", -3); + else if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.miniboss) + KinkyDungeonChangeRep("Ghost", -1); + else if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.elite && KDRandom() < 0.33) + KinkyDungeonChangeRep("Ghost", -1); + + + + if (enemy.rep) + for (let rep of Object.keys(enemy.rep)) + KinkyDungeonChangeRep(rep, enemy.rep[rep]); + + if (enemy.factionrep) + for (let rep of Object.keys(enemy.factionrep)) + KinkyDungeonChangeFactionRep(rep, enemy.factionrep[rep]); + + if (enemy.Enemy.rep && !KDEnemyHasFlag(enemy, "norep")) + for (let rep of Object.keys(enemy.Enemy.rep)) + KinkyDungeonChangeRep(rep, enemy.Enemy.rep[rep]); + + if (enemy.Enemy.factionrep && !KDEnemyHasFlag(enemy, "norep")) + for (let rep of Object.keys(enemy.Enemy.factionrep)) + KinkyDungeonChangeFactionRep(rep, enemy.Enemy.factionrep[rep]); + + if (KinkyDungeonStatsChoice.has("Vengeance")) { + KDChangeDistraction("Vengeance", "perk", "kill", Math.max(0, 0.1*Math.ceil(Math.pow(enemy.Enemy.maxhp, 0.7))), false, 0.75); + } + + let faction = KDGetFaction(enemy); + let amount = KDGetEnemyRep(enemy); + if (!noRepHit && !KDEnemyHasFlag(enemy, "norep")) { + let will = KDGetEnemyWillReward(enemy); + if (will > 0) { + if (!KinkyDungeonFlags.get("tut_kill")) { + KinkyDungeonSetFlag("tut_kill", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_WPOnKill"), KDTutorialColor, 10); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_WPOnKill2"), KDTutorialColor, 10); + } + KDChangeWill("enemy" + enemy.id, "reward", "kill", will, false); + } + } + + + if (amount && !noRepHit && !enemy.Enemy.Reputation?.noRepLoss) { + + KDGameData.Guilt = Math.max(0, (KDGameData.Guilt || 0) + KDEnemyRank(enemy)**2) + + KinkyDungeonChangeFactionRep(faction, -amount); + + // For being near a faction + let boostfactions = []; + let hurtfactions = []; + for (let e of KDMapData.Entities) { + let dist = KDistChebyshev(e.x - enemy.x, e.y - enemy.y); + if (dist < 10) { + let faction2 = KDGetFaction(e); + if (!KinkyDungeonHiddenFactions.has(faction2)) { + if (KDFactionRelation(faction, faction2) < -0.1 && !boostfactions.includes(faction2)) { + boostfactions.push(faction2); + let mult = 1.0; + if (amount > 0) { + if (KDFactionRelation("Player", faction2) > 0.5) + mult *= 0.05; + else if (KDFactionRelation("Player", faction2) > 0.25) + mult *= 0.5; + } + KinkyDungeonChangeFactionRep(faction2, 0.5 * amount * mult * -KDFactionRelation(faction, faction2)); + // Add a favor + KDAddFavor(faction2, amount); + } else + if (KDFactionRelation(faction, faction2) > 0.1 && !hurtfactions.includes(faction2)) { + hurtfactions.push(faction2); + KinkyDungeonChangeFactionRep(faction2, 0.5 * amount * -KDFactionRelation(faction, faction2)); + } + } + } + } + } + } + + } else if (!enemy.summoned && !KDIsImmobile(enemy) && !enemy.Enemy.tags.temporary + && !KDGetPersistentNPC(enemy.id)) { + if (!KDMapData.RespawnQueue) KDMapData.RespawnQueue = []; + KDMapData.RespawnQueue.push({enemy: enemy.Enemy.name, faction: KDGetFaction(enemy)}); + } + } + + + KinkyDungeonSendEvent("kill", {enemy: enemy, capture: KDBoundEffects(enemy) > 3 && enemy.boundLevel > 0 && KDHostile(enemy) && !enemy.Enemy.tags.nocapture}); + + if (!enemy.droppedItems) + KDDropItems(enemy, mapData); + + + KDRemoveEntity(enemy, true, true, false, E); + return true; + } else if (KDHelpless(enemy) && !KDIsImprisoned(enemy)) { + KDDropStolenItems(enemy, mapData); + if (!enemy.droppedItems) + KDDropItems(enemy, mapData); + } + return false; +} + + +/** + * @param enemy + * @param E + */ +function KDCheckDespawn(enemy: entity, E: number, mapData: KDMapDataType): boolean { + if (enemy == KinkyDungeonLeashingEnemy()) return false; + if (enemy.despawnX && enemy.despawnY && KDEnemyCanDespawn(enemy.id, mapData)) { + if (KDistChebyshev(enemy.despawnX - enemy.x, enemy.despawnY - enemy.y) < 1.5) { + KDDespawnEnemy(enemy, E, mapData); + return true; + } + } else if (enemy.goToDespawn && !(enemy.despawnX && enemy.despawnY)) { + let point = KDGetNearestExit(enemy.x, enemy.y, mapData, true); + if (point) { + enemy.despawnX = point.x; + enemy.despawnY = point.y; + } else { + KDDespawnEnemy(enemy, E, mapData); + return true; + } + } + return false; +} + +/** + * @param enemy + */ +function KDDropItems(enemy: entity, mapData: KDMapDataType) { + if (!enemy.noDrop && (enemy.playerdmg || !enemy.summoned) && !enemy.droppedItems) { + KinkyDungeonItemDrop(enemy.x, enemy.y, enemy.Enemy.dropTable, enemy.summoned); + enemy.droppedItems = true; + let dropped = null; + if (enemy.data && enemy.data.shop && KDShops[enemy.data.shop] && KDShops[enemy.data.shop].itemsdrop) { + for (let i of KDShops[enemy.data.shop].itemsdrop) { + if (!enemy.tempitems || !enemy.tempitems.includes(i)) { + dropped = {x:enemy.x, y:enemy.y, name: i}; + mapData.GroundItems.push(dropped); + } + } + } + if (KDEnemyHasFlag(enemy, "Shop")) { + dropped = {x:enemy.x, y:enemy.y, name: "Gold", amount: 100}; + mapData.GroundItems.push(dropped); + } + } +} + + +/** + * @param Enemy + * @returns - If the NPC is eligible to use favors + */ +function KDFavorNPC(Enemy: entity): boolean { + // Only enemies which are not temporarily allied, or summoned by you, or specifically allied (like angels), are eligible to show up in dialogue + return Enemy && !Enemy.allied && !Enemy.Enemy.allied; +} + +/** + * @param Enemy + * @returns - Gets the favor with the enemy + */ +function KDGetFavor(Enemy: entity): number { + if (KDGameData.Favors) + return KDGameData.Favors[KDGetFactionOriginal(Enemy)] ? KDGameData.Favors[KDGetFactionOriginal(Enemy)] : 0; + return 0; +} + +/** + * @param Enemy + * @param Amount + */ +function KDChangeFavor(Enemy: entity, Amount: number) { + KDModFavor(KDGetFactionOriginal(Enemy), Amount); +} + +function KDAddFavor(Faction: string, Amount: number) { + KDModFavor(Faction, Math.abs(Amount)); +} + +function KDModFavor(Faction: string, Amount: number) { + if (!KDGameData.Favors) KDGameData.Favors = {}; + if (!KDGameData.Favors[Faction]) KDGameData.Favors[Faction] = 0; + KDGameData.Favors[Faction] = Math.max(KDGameData.Favors[Faction] + Amount, 0); +} + +function KinkyDungeonCheckLOS(enemy: entity, player: any, distance: number, maxdistance: number, allowBlind: boolean, allowBars: boolean, maxFails?: number): boolean { + let bs = (enemy && enemy.Enemy && enemy.Enemy.blindSight) ? enemy.Enemy.blindSight : 0; + if (KinkyDungeonStatsChoice.get("KillSquad")) bs += 3.5; + if (player.player && enemy.Enemy && (enemy.Enemy.playerBlindSight || KDAllied(enemy))) bs = enemy.Enemy.playerBlindSight; + return distance <= maxdistance && ((allowBlind && bs >= distance) || KinkyDungeonCheckPath(enemy.x, enemy.y, player.x, player.y, allowBars, false, maxFails)); +} + +function KinkyDungeonTrackSneak(enemy: entity, delta: number, player: any, darkmult?: number): number { + if (!enemy.vp) enemy.vp = 0; + if (!player.player) return 1; + + let data = { + sneakThreshold: enemy.Enemy.sneakThreshold ? enemy.Enemy.sneakThreshold : 2, + deltaMult: 0.7/Math.max(1, (1 + KinkyDungeonSubmissiveMult))*(enemy.Enemy.Awareness?.senseSpeed || 1), + visibility: 1.0, + darkmult: darkmult * (KinkyDungeonStatsChoice.get("Stalker") ? 2.5: 1.25), + enemy: enemy, + delta: delta, + player: player, + }; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")) data.sneakThreshold = Math.max(0.51, data.sneakThreshold + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")); + + if (KDGameData.Outfit) { + let outfit = KinkyDungeonGetOutfit(KDGameData.Outfit); + if (outfit && outfit.visibility) + data.visibility *= outfit.visibility; + } + + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowDetection")) data.visibility *= KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowDetection")); + + if (KinkyDungeonStatsChoice.get("Conspicuous")) data.visibility *= KDConspicuousMult; + else if (KinkyDungeonStatsChoice.get("Stealthy")) data.visibility *= KDStealthyMult; + + KinkyDungeonSendEvent('calcSneak', data); + + if (data.darkmult) { + data.deltaMult *= KDPlayerLight/(data.darkmult + KDPlayerLight); + } + enemy.vp = Math.min(data.sneakThreshold * 2, enemy.vp + delta*data.deltaMult*data.visibility); + return (enemy.vp/data.sneakThreshold); +} + + +function KinkyDungeonCalcVisibility(player: any, darkmult?: number): number { + if (!player.player) return 1; + + let data = { + sneakThreshold: 2, + deltaMult: 0.7/Math.max(1, (1 + KinkyDungeonSubmissiveMult)), + visibility: 1.0, + darkmult: darkmult * (KinkyDungeonStatsChoice.get("Stalker") ? 2.5: 1.25), + player: player, + }; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")) + data.sneakThreshold = Math.max(0.51, data.sneakThreshold + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")); + + if (KDGameData.Outfit) { + let outfit = KinkyDungeonGetOutfit(KDGameData.Outfit); + if (outfit && outfit.visibility) + data.visibility *= outfit.visibility; + } + + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowDetection")) + data.visibility *= KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowDetection")); + + if (KinkyDungeonStatsChoice.get("Conspicuous")) data.visibility *= KDConspicuousMult; + else if (KinkyDungeonStatsChoice.get("Stealthy")) data.visibility *= KDStealthyMult; + + KinkyDungeonSendEvent('calcVisibility', data); + + if (data.darkmult) { + data.deltaMult *= KDPlayerLight/(data.darkmult + KDPlayerLight); + } + return data.visibility / Math.max(0.5, data.sneakThreshold); +} + +function KinkyDungeonMultiplicativeStat(Stat: number): number { + if (Stat > 0) { + return 1 / (1 + Stat); + } + if (Stat < 0) { + return 1 - Stat; + } + + return 1; +} +function KDBlockDodgeStat(Stat: number): number { + if (Stat > 0) { + return 1 / (1 + Stat); + } + if (Stat < 0) { + return 1 / (1 - Stat); + } + + return 1; +} + +/** + * + * @param x + * @param y + * @param dist + * @param [hostileEnemy] - Select enemies hostile to this one + * @param [cheb] - use chebyshev distance + * @param [nonhostileEnemy] - Select enemies not hostile to this one + */ +function KDNearbyEnemies(x: number, y: number, dist: number, hostileEnemy?: entity, cheb?: boolean, nonhostileEnemy?: entity): entity[] { + let cache = KDGetEnemyCache(); + let list = []; + // We may end up just checking more... + if (!cache || (dist*dist > KDMapData.Entities.length)) { + if (cheb) { + for (let e of KDMapData.Entities) { + if (KDistChebyshev(x - e.x, y - e.y) <= dist + && (!hostileEnemy || KDHostile(e, hostileEnemy)) + && (!nonhostileEnemy || !KDHostile(e, nonhostileEnemy))) list.push(e); + } + } else { + for (let e of KDMapData.Entities) { + if (KDistEuclidean(x - e.x, y - e.y) <= dist + && (!hostileEnemy || KDHostile(e, hostileEnemy)) + && (!nonhostileEnemy || !KDHostile(e, nonhostileEnemy))) list.push(e); + } + } + + } else { + let e = null; + let xmin = Math.floor(x - dist); + let xmax = Math.ceil(x + dist); + let ymin = Math.floor(y - dist); + let ymax = Math.ceil(y + dist); + if (cheb) { + for (let X = xmin; X < xmax; X++) + for (let Y = ymin; Y < ymax; Y++) + if (KDistChebyshev(X - x, Y - y) <= dist) { + e = cache.get(X + "," + Y); + if (e && (!hostileEnemy || KDHostile(e, hostileEnemy)) + && (!nonhostileEnemy || !KDHostile(e, nonhostileEnemy))) list.push(e); + } + } else { + for (let X = xmin; X < xmax; X++) + for (let Y = ymin; Y < ymax; Y++) { + e = cache.get(X + "," + Y); + if (e && KDistEuclidean(X - x, Y - y) <= dist && (!hostileEnemy || KDHostile(e, hostileEnemy)) + && (!nonhostileEnemy || !KDHostile(e, hostileEnemy))) list.push(e); + } + } + + } + return list; +} + + +/** + * + * @param x + * @param y + * @param dist + */ +function KDNearbyEntities(x: number, y: number, dist: number): entity[] { + let list: entity[] = []; + + if (KDistEuclidean(x - KDPlayer().x, y - KDPlayer().y) <= dist) list.push(KDPlayer()); + + return [...list, ...KDNearbyEnemies(x, y, dist)]; +} + + +/** + * @param x + * @param y + * @param dist + */ +function KDNearbyTiles(x: number, y: number, dist: number): {x: number, y: number, tile: any}[] { + let list = []; + for (let X = Math.floor(x - dist); X < Math.ceil(x + dist); X++) + for (let Y = Math.floor(y - dist); Y < Math.ceil(y + dist); Y++) + if (KDistEuclidean(X - x, Y - y) <= dist) { + if (KinkyDungeonTilesGet(X + ',' + Y)) list.push({x: X, y: Y, tile: KinkyDungeonTilesGet(X + ',' + Y)}); + } + return list; +} + + +/** + * @param x + * @param y + * @param dist + */ +function KDNearbyMapTiles(x: number, y: number, dist: number): {x: number, y: number, tile: string}[] { + let list = []; + for (let X = Math.floor(x - dist); X < Math.ceil(x + dist); X++) + for (let Y = Math.floor(y - dist); Y < Math.ceil(y + dist); Y++) + if (KDistEuclidean(X - x, Y - y) <= dist) { + list.push({x: X, y: Y, tile: KinkyDungeonMapGet(X, Y)}); + } + return list; +} + +/** + * @param x + * @param y + * @param dist + * @param [neutralEnemy] + */ +function KDNearbyNeutrals(x: number, y: number, dist: number, neutralEnemy?: entity): entity[] { + let cache = KDGetEnemyCache(); + let list = []; + if (!cache) { + for (let e of KDMapData.Entities) { + if (KDistEuclidean(x - e.x, y - e.y) <= dist && (!neutralEnemy || !KDHostile(e, neutralEnemy))) list.push(e); + } + } else { + let e = null; + for (let X = Math.floor(x - dist); X < Math.ceil(x + dist); X++) + for (let Y = Math.floor(y - dist); Y < Math.ceil(y + dist); Y++) + if (KDistEuclidean(X - x, Y - y) <= dist) { + e = cache.get(X + "," + Y); + if (e && (!neutralEnemy || !KDHostile(e, neutralEnemy))) list.push(e); + } + } + return list; +} + +/** + * @param avoidPlayer + * @param [onlyPlayer] + * @param [Enemy] + * @param [playerDist] + * @param [minDist] + * @param [maxDist] + */ +function KinkyDungeonGetRandomEnemyPoint ( + avoidPlayer: boolean, + onlyPlayer?: boolean, + Enemy?: entity, + playerDist: number = 6, + minDist: number = 6, + ignoreOL: boolean = false, + maxDist: number = 100 +): KDPoint +{ + return KinkyDungeonGetRandomEnemyPointCriteria(undefined, avoidPlayer, onlyPlayer, Enemy, playerDist, minDist, ignoreOL, maxDist); +} + +/** + * @param entity + * @param ignoreID - ignores any entity with this ID standing on a point + * @param ignoreEntity - Ignores any entity standing on a point + */ +function KDGetNearestInterestingLabel ( + x: number, + y: number, + entity: entity, + ignoreID: number, + ignoreEntity: boolean, + typeFilter: string = "", + maxDist: number = 1000, + _navigable: boolean = true +): KDLabel +{ + if (!KDMapData.Labels) return null; + let filtered: KDLabel[] = []; + if (typeFilter) { + if (!KDMapData.Labels[typeFilter]) return null; + for (let l of KDMapData.Labels[typeFilter]) { + if (l.interesting && + KDPointWanderable(l.x, l.y) && + (l.faction && entity && l.faction == KDGetFaction(entity)) && ( + ignoreEntity + || (ignoreID && KinkyDungeonNoEnemyExceptID(l.x, l.y, true, ignoreID)) + || (!ignoreID && KinkyDungeonNoEnemy(l.x, l.y, true)) + )) { + filtered.push(l); + } + } + } else { + for (let t of Object.values(KDMapData.Labels)) { + for (let l of t) { + if (l.interesting && + KDPointWanderable(l.x, l.y) && + (l.faction && entity && l.faction == KDGetFaction(entity)) && ( + ignoreEntity + || (ignoreID && KinkyDungeonNoEnemyExceptID(l.x, l.y, true, ignoreID)) + || (!ignoreID && KinkyDungeonNoEnemy(l.x, l.y, true)) + )) { + filtered.push(l); + } + } + } + } + + let dist = maxDist; + let label: KDLabel = null; + let dd = dist; + for (let l of filtered) { + if (KDistChebyshev(l.x - x, l.y - y) > dist) continue; + dd = KDistEuclidean(l.x - x, l.y - y); + if (dd < dist) { + dist = dd; + label = l; + } + } + return label; +} + + +/** + * @param entity + * @param ignoreID - ignores any entity with this ID standing on a point + * @param ignoreEntity - Ignores any entity standing on a point + */ +function KDGetNearestGuardLabel ( + x: number, + y: number, + entity: entity, + ignoreID: number, + ignoreEntity: boolean, + typeFilter: string = "", + maxDist: number = 1000, + _navigable: boolean = true +): KDLabel +{ + if (!KDMapData.Labels) return null; + let filtered: KDLabel[] = []; + if (typeFilter) { + if (!KDMapData.Labels[typeFilter]) return null; + for (let l of KDMapData.Labels[typeFilter]) { + if (l.guard && + KDPointWanderable(l.x, l.y) && + (l.faction && entity && l.faction == KDGetFaction(entity)) && ( + ignoreEntity + || (ignoreID && KinkyDungeonNoEnemyExceptID(l.x, l.y, true, ignoreID)) + || (!ignoreID && KinkyDungeonNoEnemy(l.x, l.y, true)) + )) { + filtered.push(l); + } + } + } else { + for (let t of Object.values(KDMapData.Labels)) { + for (let l of t) { + if (l.guard && + KDPointWanderable(l.x, l.y) && + (l.faction && entity && l.faction == KDGetFaction(entity)) && ( + ignoreEntity + || (ignoreID && KinkyDungeonNoEnemyExceptID(l.x, l.y, true, ignoreID)) + || (!ignoreID && KinkyDungeonNoEnemy(l.x, l.y, true)) + )) { + filtered.push(l); + } + } + } + } + + let dist = maxDist; + let label: KDLabel = null; + let dd = dist; + for (let l of filtered) { + if (KDistChebyshev(l.x - x, l.y - y) > dist) continue; + dd = KDistEuclidean(l.x - x, l.y - y); + if (dd < dist) { + dist = dd; + label = l; + } + } + return label; +} + +let RandomPathList = []; + +/** + * @param criteria + * @param avoidPlayer + * @param onlyPlayer + * @param [Enemy] + * @param [playerDist] + * @param [minDist] + * @param [maxDist] + */ +function KinkyDungeonGetRandomEnemyPointCriteria ( + criteria: (x: number, y:number) => boolean, + avoidPlayer: boolean, + onlyPlayer: boolean, + Enemy?: entity, + playerDist: number = 6, + minDist: number = 6, + ignoreOL: boolean = false, + maxDist: number = 100 +): KDPoint +{ + let tries = 0; + let points = RandomPathList; + + while (tries < 100) { + let point = points[Math.floor(points.length * KDRandom())]; + if (point) { + let X = point.x;//1 + Math.floor(KDRandom()*(KDMapData.GridWidth - 1)); + let Y = point.y;//1 + Math.floor(KDRandom()*(KDMapData.GridHeight - 1)); + let PlayerEntity = KinkyDungeonNearestPlayer({x:X, y:Y}); + + if ( + (!maxDist || !Enemy || KDistChebyshev(Enemy.x - X, Enemy.y - Y) < maxDist) + && ((!avoidPlayer || Math.sqrt((X - PlayerEntity.x) * (X - PlayerEntity.x) + (Y - PlayerEntity.y) * (Y - PlayerEntity.y)) > minDist) + && (!onlyPlayer || Math.sqrt((X - PlayerEntity.x) * (X - PlayerEntity.x) + (Y - PlayerEntity.y) * (Y - PlayerEntity.y)) <= playerDist)) + && (!KinkyDungeonPointInCell(X, Y)) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y)) + && (!Enemy || KinkyDungeonNoEnemyExceptSub(X, Y, true, Enemy)) + && (ignoreOL || !KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OL || (Enemy && KinkyDungeonTilesGet(Enemy.x + "," + Enemy.x)?.Jail && KinkyDungeonTilesGet(X + "," + Y).Jail)) + && (ignoreOL || !KDDefaultAvoidTiles.includes(KinkyDungeonMapGet(X, Y))) + && (!criteria || criteria(X, Y))) { + return {x: X, y:Y}; + } + } + tries += 1; + } + + return undefined; +} + +/** + * @param x + * @param y + * @param [allowNearPlayer] + * @param [Enemy] + * @param [Adjacent] + * @param [ignoreOL] allow using offlimits spaces + * @param [callback] + */ +function KinkyDungeonGetNearbyPoint ( + x: number, + y: number, + allowNearPlayer: boolean = false, + Enemy?: entity, + Adjacent?: boolean, + ignoreOL?: boolean, + callback?: (x: number, y: number) => boolean, + allowOrigin?: boolean, + allowInsideEnemy?:boolean, + mapData?: KDMapDataType, +): KDPoint +{ + if (!mapData) mapData = KDMapData; + let slots = []; + for (let X = -Math.ceil(1); X <= Math.ceil(1); X++) + for (let Y = -Math.ceil(1); Y <= Math.ceil(1); Y++) { + if ((X != 0 || Y != 0 || allowOrigin) + && KinkyDungeonTransparentObjects.includes( + KinkyDungeonMapDataGet(mapData, x + X, y + Y))) { + // We add the slot and those around it + slots.push({x:x + X, y:y + Y}); + slots.push({x:x + X, y:y + Y}); + slots.push({x:x + X, y:y + Y}); + if (!Adjacent) + for (let XX = -Math.ceil(1); XX <= Math.ceil(1); XX++) + for (let YY = -Math.ceil(1); YY <= Math.ceil(1); YY++) { + if ((Math.abs(X + XX) > 1 || Math.abs(Y + YY) > 1) + && KinkyDungeonMovableTilesEnemy.includes( + KinkyDungeonMapDataGet(mapData, x + XX + X, y + YY + Y))) { + slots.push({x:x + XX + X, y:y + YY + Y}); + slots.push({x:x + XX + X, y:y + YY + Y}); + for (let XXX = -Math.ceil(1); XXX <= Math.ceil(1); XXX++) + for (let YYY = -Math.ceil(1); YYY <= Math.ceil(1); YYY++) { + if ((Math.abs(X + XX + XXX) > 2 || Math.abs(Y + YY + YYY) > 2) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x + XX + XXX + X, y + YYY + YY + Y))) { + slots.push({x:x + XXX + XX + X, y:y + YYY + YY + Y}); + } + } + } + } + } + } + + let foundslot = undefined; + for (let C = 0; C < 100; C++) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (slot && (allowInsideEnemy + || KinkyDungeonNoEnemyExceptSub(slot.x, slot.y, false, Enemy, mapData)) + && (ignoreOL || KDPointWanderable(slot.x, slot.y, mapData)) + && (allowNearPlayer || mapData != KDMapData + || Math.max(Math.abs(KinkyDungeonPlayerEntity.x - slot.x), + Math.abs(KinkyDungeonPlayerEntity.y - slot.y)) > 1.5) + && KinkyDungeonMovableTilesEnemy.includes( + KinkyDungeonMapDataGet(mapData, slot.x, slot.y)) + && (!callback || callback(slot.x, slot.y))) { + foundslot = {x: slot.x, y: slot.y}; + + C = 100; + } else slots.splice(C, 1); + } + return foundslot; +} + + +/** + * @param enemy + * @param delta + */ +function KinkyDungeonTickFlagsEnemy(enemy: entity, delta: number): boolean { + let changed = false; + if (enemy.flags) { + for (let f of Object.entries(enemy.flags)) { + if (f[1] == -1) continue; + if (f[1] <= delta) { + delete enemy.flags[f[0]]; + changed = true; + } + else if (f[1] > 0) { + enemy.flags[f[0]] = f[1] - delta; + changed = true; + } + } + } + return changed; +} + +let KinkyDungeonDamageTaken = false; +let KinkyDungeonTorsoGrabCD = 0; +let KinkyDungeonHuntDownPlayer = false; + +/** + * @param enemy + */ +function KinkyDungeonHasStatus(enemy: entity): boolean { + return enemy && + (enemy.bind > 0 + || enemy.slow > 0 + || enemy.stun > 0 + || enemy.freeze > 0 + || enemy.silence > 0 + || KinkyDungeonIsSlowed(enemy) + || KDBoundEffects(enemy) > 0); +} + +/** + * @param enemy + */ +function KinkyDungeonIsStunned(enemy: entity): boolean { + return enemy && (enemy.stun > 0 || enemy.freeze > 0); +} + +/** + * @param enemy + */ +function KinkyDungeonIsDisabled(enemy: entity): boolean { + return enemy && (KinkyDungeonIsStunned(enemy) || KDBoundEffects(enemy) > 3); +} + + +/** + * @param enemy + */ +function KinkyDungeonIsSlowed(enemy: entity): boolean { + return enemy && ((KDBoundEffects(enemy) > 0 && KDBoundEffects(enemy) < 4) || enemy.slow > 0 || enemy.bind > 0 || KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed") < 0); +} + + +/** + * @param enemy + */ +function KinkyDungeonCanCastSpells(enemy: entity): boolean { + return enemy && !(KinkyDungeonIsDisabled(enemy) || KDGetEnemyMiscast(enemy) >= 1.0); +} + + +interface KDMiscastEventData { + enemy: entity, + miscast: number, + distractionbonus: number, + silencebonus: number, +} + +/** + * @param enemy + */ +function KDGetEnemyMiscast(enemy: entity): number { + if (enemy) { + let data: KDMiscastEventData = { + enemy: enemy, + miscast: KDEntityBuffedStat(enemy, "Miscast"), + distractionbonus: enemy.distraction > 0 ? enemy.distraction / enemy.Enemy.maxhp * 0.8 : 0, + silencebonus: Math.max(0, Math.min((enemy.silence || 0) * 0.1)), + }; + KinkyDungeonSendEvent("calcEnemyMiscast", data); + data.miscast += data.distractionbonus; + data.miscast += data.silencebonus; + return data.miscast; + } + return 0; +} + +/** Can the enemy be bound in principle */ +function KDCanBind(enemy: entity): boolean { + return (enemy?.Enemy?.bound != undefined); +} + +function KDBoundEffects(enemy: entity): number { + if (!enemy.Enemy.bound) return 0; + if (KDIsImprisoned(enemy)) return 4; + if (!enemy.boundLevel) return 0; + let boundLevel = enemy.boundLevel ? enemy.boundLevel : 0; + let bindAmp = 1;//KDGetBindAmp(enemy); //KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BindAmp")); + boundLevel *= bindAmp; + let mult = KDGetBindEffectMult(enemy); + if (boundLevel >= enemy.Enemy.maxhp * mult || (enemy.hp <= 0.1*enemy.Enemy.maxhp && Math.max(boundLevel, 0.1) > enemy.hp)) return 4; // Totally tied + if (boundLevel > enemy.Enemy.maxhp*0.75 * mult) return 3; + if (boundLevel > enemy.Enemy.maxhp*0.5 * mult) return 2; + if (boundLevel > enemy.Enemy.maxhp*0.25 * mult) return 1; + return 0; +} + +function KDGetBindEffectMult(enemy: entity) { + let mult = 1; + if (enemy.Enemy.tags.unstoppable) mult = 3; + else if (enemy.Enemy.tags.unflinching) mult = 2; + return mult; +} + + +function KinkyDungeonUpdateEnemies(maindelta: number, Allied: boolean) { + KDGameData.tickAlertTimer = false; + KDGameData.HostileFactions = []; + let visionMod = 1.0; + let defeat = false; + + let timeDelta = KinkyDungeonFlags.get('TimeSlowTick') ? 1 : maindelta; + let enemyDelta = {}; + for (let entity of KDMapData.Entities) { + if (!entity.Enemy?.maxhp) + KDUnPackEnemy(entity); + if (KDIsTimeImmune(entity)) { + enemyDelta[entity.id] = timeDelta; + if (timeDelta > 0) { + KinkyDungeonSetEnemyFlag(entity, "timereveal", 2 + KinkyDungeonFlags.get('TimeSlow')); + } + } else { + enemyDelta[entity.id] = maindelta; + } + } + + if (KinkyDungeonLeashingEnemy() && !KDIsPlayerTetheredToEntity(KinkyDungeonPlayerEntity, KinkyDungeonLeashingEnemy())) { + KDGameData.KinkyDungeonLeashingEnemy = 0; + } + + /*if (KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]) { + if (KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)].brightness) { + visionMod = Math.min(1.0, Math.max(0.5, KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)].brightness / 8)); + } + }*/ + + if (Allied) { + KinkyDungeonUpdateDialogue(KinkyDungeonPlayerEntity, maindelta); + let KinkyDungeonSummons = 0; + for (let i = KDMapData.Entities.length-1; i >= 0; i--) { + let enemy = KDMapData.Entities[i]; + KinkyDungeonUpdateDialogue(enemy, enemyDelta[enemy.id] || maindelta); + if (KDAllied(enemy) && enemy.summoned && enemy.Enemy.allied && enemy.Enemy.CountLimit && (!enemy.lifetime || enemy.lifetime > 999)) { + KinkyDungeonSummons += 1; + if (KinkyDungeonSummons > KinkyDungeonSummonCount) { + enemy.hp -= Math.max(0.1 * enemy.hp) + 1; + } + } + } + } else { + if (KinkyDungeonTorsoGrabCD > 0) KinkyDungeonTorsoGrabCD -= 1; + + if (KDGameData.KinkyDungeonLeashedPlayer > 0) { + KDGameData.KinkyDungeonLeashedPlayer -= 1; + + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (nearestJail) { + let xx = nearestJail.x; + let yy = nearestJail.y; + let jaildoor = KDGetJailDoor(xx, yy).tile; + if (jaildoor?.Lock && jaildoor.Type == "Door" && KDShouldUnLock(xx, yy, jaildoor)) { + jaildoor.OGLock = jaildoor.Lock; + + if (jaildoor.LockSeen) + jaildoor.LockSeen = + jaildoor.Lock; + jaildoor.Lock = undefined; + } + } + + } + + } + + KDGameData.DollCount = 0; + + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + + // Loop 1 + for (let enemy of KDMapData.Entities) { + let delta = enemyDelta[enemy.id] || maindelta; + if ((Allied && KDAllied(enemy)) || (!Allied && !KDAllied(enemy))) { + let tile = KinkyDungeonTilesGet(enemy.x + "," + enemy.y); + if (tile?.OL && (enemy.gxx != enemy.x || enemy.gyy != enemy.y)) { + // We remove certain flags when enemies are in an 'offlimits' area so we can get them out + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + } + if (enemy.Enemy.tags.doll) KDGameData.DollCount += 1; + + + let master = KinkyDungeonFindMaster(enemy); + if (master.master && enemy.aware) { + + if (!master.master.aware) KDEnemyAddSound(master.master, master.master.Enemy.Sound?.alertAmount != undefined ? master.master.Enemy.Sound?.alertAmount : KDDefaultEnemyAlertSound, + undefined, enemy.Enemy.Sound?.alertSoundName ? TextGet("KDAmbSound_" + enemy.Enemy.Sound.alertSoundName) : undefined + ); + + master.master.aware = true; + } + if (master.master && master.master.aware) { + + if (!enemy.aware && !enemy.ignore) KDEnemyAddSound(enemy, enemy.Enemy.Sound?.alertAmount != undefined ? enemy.Enemy.Sound?.alertAmount : KDDefaultEnemyAlertSound, + undefined, enemy.Enemy.Sound?.alertSoundName ? TextGet("KDAmbSound_" + enemy.Enemy.Sound.alertSoundName) : undefined + ); + + enemy.aware = true; + } + if (master.info && master.info.dependent && !master.master) enemy.hp = -10000; + else if (master.info?.dependent) enemy.boundTo = master.master.id; + + if (!enemy.castCooldown) enemy.castCooldown = 0; + if (enemy.castCooldown > 0) { + let cdmult = enemy.distraction ? 1 / (1 + enemy.distraction / enemy.Enemy.maxhp) : 1; + cdmult = cdmult * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(enemy.buffs, "CastSpeed")); + enemy.castCooldown = Math.max(0, enemy.castCooldown-delta * cdmult); + if (enemy.castCooldown <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "specialCD"}); + } + if (!enemy.castCooldownSpecial) enemy.castCooldownSpecial = 0; + if (enemy.castCooldownSpecial > 0) { + enemy.castCooldownSpecial = Math.max(0, enemy.castCooldownSpecial-delta); + if (enemy.castCooldownSpecial <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "castCooldownSpecial"}); + } + if (enemy.castCooldownUnique) { + for (let cd of Object.entries(enemy.castCooldownUnique)) { + enemy.castCooldownUnique[cd[0]] = Math.max(0, cd[1]-delta); + if (enemy.castCooldownUnique[cd[0]] <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "castCooldownUnique", spell: cd[0]}); + } + + } + + let restraints = (KDGameData.NPCRestraints && KDGameData.NPCRestraints[enemy.id + ""]) + ? Object.values(KDGameData.NPCRestraints[enemy.id + ""]) + : []; + for (let item of restraints) { + let status = KDRestraintBondageStatus(item); + + if (status.belt) { + KinkyDungeonApplyBuffToEntity(enemy, KDChastity, {}); + } + if (status.toy) { + KinkyDungeonApplyBuffToEntity(enemy, KDToy, {}); + } + if (status.plug) { + KinkyDungeonApplyBuffToEntity(enemy, KDEntityBuffedStat(enemy, "Plug") > 0 ? KDDoublePlugged : KDPlugged, {}); + } + if (status.blind) { + enemy.blind = Math.max(enemy.blind || 0, status.blind); + } + if (status.silence) { + enemy.silence = Math.max(enemy.silence || 0, status.silence); + } + if (status.bind) { + enemy.bind = Math.max(enemy.bind || 0, status.bind); + } + if (status.slow) { + enemy.slow = Math.max(enemy.slow || 0, status.slow); + } + if (status.disarm) { + enemy.disarm = Math.max(enemy.disarm || 0, status.disarm); + } + if (status.reduceaccuracy) { + KinkyDungeonApplyBuffToEntity(enemy, + KDRestraintReduceAccuracy, + { + power: status.reduceaccuracy, + }, + ); + } + } + + + if (enemy.Enemy.specialCharges && enemy.specialCharges <= 0) enemy.specialCD = 999; + KinkyDungeonTickFlagsEnemy(enemy, delta); + if (enemy.specialCD > 0) { + enemy.specialCD -= delta; + if (enemy.specialCD <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "specialCD"}); + } + if (enemy.slow > 0) { + enemy.slow -= delta; + if (enemy.slow <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "slow"}); + } + if (!(enemy.stun > 0 || enemy.freeze > 0 || enemy.teleporting > 0) && (!KDHelpless(enemy) || KDEnemyHasHelp(enemy))) { + KDEnemyStruggleTurn(enemy, delta, KDNPCStruggleThreshMult(enemy), false, false); + } + KDEnemyDecayBindStun(enemy, delta); + let vibe = KDEntityMaxBuffedStat(enemy, "Vibration"); + if (enemy.distraction > 0 || vibe) { + let DD = KDGetEnemyDistractionDamage(enemy, vibe); + if (DD > 0) { + KinkyDungeonDamageEnemy(enemy, { + damage: DD, + type: "charm", + nocrit: true, + flags: ["BurningDamage"], + }, true, true); + } + + + let DR = KDGetEnemyDistractRate(enemy, vibe); + if (enemy.distraction > enemy.Enemy.maxhp) { + enemy.distraction = enemy.Enemy.maxhp; + KDAddThought(enemy.id, "Embarrassed", 10, 5); + } else { + if (DR <= 0 || KDRandom() < 0.1) { + KDAddThought(enemy.id, "GiveUp", 5, DR <= 0 ? 4 : 1); + } else { + if (KDLoosePersonalities.includes(enemy.personality)) { + KDAddThought(enemy.id, "Play", 1, 4); + } else if (KDStrictPersonalities.includes(enemy.personality)) { + KDAddThought(enemy.id, "Annoyed", 1, 3); + } else { + KDAddThought(enemy.id, "Embarrassed", 1, 2); + } + } + } + KDAddDistraction(enemy, -delta * DR, DR > 0 ? 0 : 0.5); + + + if (enemy.distraction <= 0) { + KDAddThought(enemy.id, "Annoyed", 5, 1); + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "boundLevel"}); + } + } + + let maxshieldBase = KDGetMaxShield(enemy); + let shieldDrain = maxshieldBase > 0 ? 0 : 1; + if (maxshieldBase > 0) { + if (KDGetShieldRegen(enemy) > 0) { + if (!enemy.shield) enemy.shield = 0; + let maxshield = KDGetMaxShield(enemy) - Math.max(KDEntityBuffedStat(enemy, "ShieldNoRegen")); + if (enemy.shield < maxshield) enemy.shield = Math.max(enemy.shield, Math.min(enemy.shield + delta * KDGetShieldRegen(enemy), maxshield)); + // Regen shield + shieldDrain = 0; + } + } + + if (enemy.shield && (KDEntityBuffedStat(enemy, "ShieldDrain") + shieldDrain) > 0) { + if (enemy.shield > 0) { + let val = ((KDEntityBuffedStat(enemy, "ShieldDrain") + shieldDrain) + - Math.max(0, KDGetShieldRegen(enemy))); + if (val > 0) + enemy.shield = Math.max(0, + enemy.shield + - delta * val); + } + } + + + let bindLevel = KDBoundEffects(enemy); + let statusBonus = 1; + if (enemy.Enemy.tags.unstoppable) statusBonus *= 4; + else if (enemy.Enemy.tags.unflinching) statusBonus *= 2; + + if (enemy.Enemy.rage) enemy.rage = 9999; + if (enemy.bind > 0) { + enemy.bind -= delta; + if (enemy.bind <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "bind"}); + } + if (enemy.immobile > 0) { + enemy.immobile -= delta; + if (enemy.immobile <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "immobile"}); + } + if (enemy.rage > 0) { + enemy.rage -= delta; + if (enemy.rage <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "rage"}); + } + if (enemy.hostile > 0) { + enemy.hostile -= delta; + if (enemy.hostile <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "hostile"}); + } + if (enemy.allied > 0 && enemy.allied < 9000) { + enemy.allied -= delta; + if (enemy.allied <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "allied"}); + } + if (enemy.ceasefire > 0 && enemy.ceasefire < 9000) { + enemy.ceasefire -= delta; + if (enemy.ceasefire <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "ceasefire"}); + } + if (enemy.blind > 0 && bindLevel < 4) { + if (enemy.dodges > 0) enemy.dodges = Math.max(0, enemy.dodges - delta * 1); + enemy.blind -= delta * statusBonus / (1 + 1*bindLevel); + if (enemy.blind <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "blind"}); + } + if (enemy.disarm > 0 && bindLevel < 4) { + enemy.disarm -= delta * statusBonus / (1 + 1*bindLevel); + if (enemy.disarm <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "disarm"}); + } + if (enemy.playWithPlayer > 0) { + enemy.playWithPlayer -= delta; + if (enemy.playWithPlayer <= 0) { + if (!KinkyDungeonAggressive(enemy) && !KinkyDungeonFlags.get("noResetIntentFull")) { + KDResetIntent(enemy, AIData); + KDAddThought(enemy.id, "Happy", 5, 1); + } + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "playWithPlayer"}); + } + } else enemy.playWithPlayer = 0; + if (enemy.playWithPlayerCD > 0) { + enemy.playWithPlayerCD -= delta; + if (enemy.playWithPlayerCD <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "playWithPlayerCD"}); + } + if (enemy.silence > 0 && bindLevel < 4) { + enemy.silence -= delta * statusBonus / (1 + 1*bindLevel); + if (enemy.silence <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "silence"}); + } + if (enemy.disarmflag > 0 && enemy.Enemy.disarm && KinkyDungeonLastAction != "Attack") { + enemy.disarmflag = Math.max(0, enemy.disarmflag - enemy.Enemy.disarm); + if (enemy.disarmflag <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "disarmflag"}); + } + if (enemy.stun > 0 || enemy.freeze > 0) { + enemy.warningTiles = []; + enemy.disarmflag = 0; + enemy.fx = undefined; + enemy.fy = undefined; + let smult = 1 - 0.167 * KDBoundEffects(enemy); + let fmult = KDHelpless(enemy) ? 0.1 : 1 - 0.2 * KDBoundEffects(enemy); + if (enemy.stun > 0 && enemy.stun <= delta*smult) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "stun"}); + if (enemy.freeze > 0 && enemy.freeze <= delta*fmult) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "freeze"}); + if (enemy.stun > 0) enemy.stun = Math.max(enemy.stun - delta * smult, 0); + if (enemy.freeze > 0) enemy.freeze = Math.max(enemy.freeze - delta * fmult, 0); + } + if (enemy.channel > 0) { + enemy.warningTiles = []; + if (enemy.channel > 0) enemy.channel -= delta; + + if (enemy.channel <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "channel"}); + } + if (enemy.teleporting > 0) { + enemy.warningTiles = []; + if (enemy.teleporting > 0) enemy.teleporting -= delta; + + if (enemy.teleporting <= 0) + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "teleporting"}); + } + let maxblock = KDGetMaxBlock(enemy); + let maxdodge = KDGetMaxDodge(enemy); + if (enemy.vp > 0) { + if (!enemy.blockedordodged && !KinkyDungeonIsDisabled(enemy)) { + if (enemy.aware) { + + let blockRate = (enemy.Enemy.block || 0) + KDEntityBuffedStat(enemy, "Block") + KDEntityBuffedStat(enemy, "AttackSpeed"); + + if (maxblock > 0 && blockRate > -9 && !(enemy.blocks >= maxblock)) { + if (!enemy.blocks) enemy.blocks = 0; + // Roll for a token + let mult = KDBlockDodgeStat(blockRate); + enemy.blocks += Math.min(1, KDRandom() * KDGetBaseBlock(enemy) / mult); + } + //Only raise guard in the right conditions + + let dodgeRate = (enemy.Enemy.evasion || 0) + KDEntityBuffedStat(enemy, "Dodge") + KDEntityBuffedStat(enemy, "MoveSpeed"); + + if (maxdodge > 0 && dodgeRate > -9 && !(enemy.dodges >= maxdodge)) { + if (!enemy.dodges) enemy.dodges = 0; + // Roll for a token + let mult = KDBlockDodgeStat(dodgeRate); + enemy.dodges += Math.min(1, KDRandom() * KDGetBaseDodge(enemy) / mult); + } + } + } else if (delta > 0 && enemy.blockedordodged) { + enemy.blockedordodged -= delta; + if (enemy.blockedordodged <= 0) delete enemy.blockedordodged; + } + } else if (!enemy.aware || enemy.ignore) { + delete enemy.blockedordodged; + delete enemy.dodges; + delete enemy.blocks; + } + if (enemy.blocks > maxblock) enemy.blocks = Math.max(0, maxblock); + if (enemy.dodges > maxdodge) enemy.dodges = Math.max(0, maxdodge); + + } + } + + KDGameData.otherPlaying = 0; + //let defeatEnemy = undefined; + // Loop 2 + for (let E = 0; E < KDMapData.Entities.length; E++) { + let enemy = KDMapData.Entities[E]; + let delta = enemyDelta[enemy.id] || maindelta; + if ((Allied && KDAllied(enemy)) || (!Allied && !KDAllied(enemy))) { + if (enemy.vulnerable > 0) enemy.vulnerable -= delta; + else enemy.vulnerable = 0; + if (enemy.Enemy.tags.nonvulnerable && enemy.vulnerable) enemy.vulnerable = 0; + if (!(KDGameData.KinkyDungeonPenance && KinkyDungeonAngel()) || enemy == KinkyDungeonAngel()) { + // Delete the enemy + if (KinkyDungeonEnemyCheckHP(enemy, E, KDMapData)) { E -= 1; continue;} + + let player = (!KinkyDungeonAngel()) ? KinkyDungeonNearestPlayer(enemy, false, true, enemy.Enemy.visionRadius ? (KDEnemyVisionRadius(enemy) + ((enemy.lifetime > 0 && enemy.Enemy.visionSummoned) ? enemy.Enemy.visionSummoned : 0)) : 0, AIData) : KinkyDungeonPlayerEntity; + if (player) { + + enemy.tx = player.x; + enemy.ty = player.y; + enemy.target = player.id; + + if (player.player) KinkyDungeonSetEnemyFlag(enemy, "targ_player", 1); + else if (KDGetFaction(player) == "Player") KinkyDungeonSetEnemyFlag(enemy, "targ_ally", 1); + else KinkyDungeonSetEnemyFlag(enemy, "targ_npc", 1); + if (KinkyDungeonAggressive(enemy, player)) { + KinkyDungeonSetEnemyFlag(enemy, "aggression", 1); + } + } else { + delete enemy.tx; + delete enemy.ty; + delete enemy.target; + } + + + if (enemy.Enemy.convertTiles) { + let tile = KinkyDungeonMapGet(enemy.x, enemy.y); + for (let c of enemy.Enemy.convertTiles) { + if (c.from == tile && c.to) { + KinkyDungeonMapSet(enemy.x, enemy.y, c.to); + } + } + } + + KinkyDungeonHandleTilesEnemy(enemy, delta); + + if (enemy.Enemy.triggersTraps || (KinkyDungeonIsStunned(enemy) && !enemy.teleporting)) { + KinkyDungeonHandleTraps(enemy, enemy.x, enemy.y, true); + } + + let idle = true; + //let bindLevel = KDBoundEffects(enemy); + + KinkyDungeonSendEvent("beforeEnemyLoop", { + enemy: enemy, + Wornitems: KDGameData.NPCRestraints[enemy.id] ? + Object.values(KDGameData.NPCRestraints[enemy.id]) + .filter((rest) => {return rest.events}) + .map((rest) => {return rest.id;}) + : [], + NPCRestraintEvents: + KDGameData.NPCRestraints[enemy.id] + }); + + if (!( + KinkyDungeonIsDisabled(enemy) + || KDHelpless(enemy) + || enemy.channel > 0 + || enemy.teleporting > 0 + )) { + let start = performance.now(); + + let playerItems = []; + if (player.player) { + for (let inv of KinkyDungeonAllWeapon()) { + if (inv.name != "Unarmed") + playerItems.push(inv); + } + for (let inv of KinkyDungeonAllConsumable()) { + playerItems.push(inv); + } + } + + let ret = KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems); + if (enemy.playWithPlayer) KDGameData.otherPlaying += 1; + idle = ret.idle; + if (ret.defeat) { + defeat = true; + AIData.defeat = false; + + KDCustomDefeatEnemy = enemy; + let fac = KDGetFaction(enemy); + if (!KDFactionProperties[fac]) { + fac = KDGetFactionOriginal(enemy); + } + if (enemy.Enemy?.customDefeat && ( + !KDFactionProperties[fac]?.customDefeat + || enemy.Enemy?.overrideFactionDefeat + )) { + KDCustomDefeat = enemy.Enemy.customDefeat; + } else if (KDFactionProperties[fac]?.customDefeat) { + KDCustomDefeat = KDFactionProperties[fac]?.customDefeat; + } + + + let CDdata = { + enemy: enemy, + player: player, + KDCustomDefeatEnemy: KDCustomDefeatEnemy, + KDCustomDefeat: KDCustomDefeat, + }; + + KinkyDungeonSendEvent("getCustomDefeat", CDdata) + KDCustomDefeatEnemy = CDdata.KDCustomDefeatEnemy; + KDCustomDefeat = CDdata.KDCustomDefeat; + } else { + KDMaintainEnemyAction(enemy, delta); + } + + //TODO pass items to more dominant nearby enemies + if (enemy.items && !KDEnemyHasFlag(enemy, "shop")) { + let light = KinkyDungeonVisionGet(enemy.x, enemy.y); + if (light == 0 && !enemy.aware && KDRandom() < 0.2 && !KDIsImprisoned(enemy)) { + //KDClearItems(enemy); + if (!altType?.norestock) + KDRestockRestraints(enemy, enemy.Enemy.RestraintFilter?.restockPercent || 0.5); + if (enemy.hp < 0.5 * enemy.Enemy.maxhp) { + // Todo unify heal + enemy.hp = Math.min(enemy.Enemy.maxhp, enemy.hp + 0.1); + } + } + } + + if (idle && enemy.hp > 0) { + if (KDCanIdleFidget(enemy)) { + let checkX = enemy.flip ? enemy.x - 3 : enemy.x + 3; + if (KDRandom() < 0.1 + || KinkyDungeonCheckPath(enemy.x, enemy.y, checkX, enemy.y, true, true, 1)) { + enemy.flip = !enemy.flip; + KinkyDungeonSetEnemyFlag(enemy, "fidget", 10); + } + } + + // Removed for non guards because its fun to find tied up girls around + if (enemy == KinkyDungeonJailGuard()) + KDCaptureNearby(enemy, true); + + if (['s','S','H'].includes(KinkyDungeonMapGet(enemy.x, enemy.y)) && KDEnemyHasFlag(enemy, "despawn")) { + KDClearItems(enemy); + KDRemoveEntity(enemy, false, false, true); + } + + } + + let end = performance.now(); + if (KDDebug) + console.log(`Took ${end - start} milliseconds to run loop for enemy ${enemy.Enemy.name}`); + } else { + // These happen when an enemy is disabled + enemy.disarmflag = 0; + enemy.fx = undefined; + enemy.fy = undefined; + } + + if (KDHelpless(enemy)) enemy.playWithPlayer = 0; + + if (idle) { + // These happen when an enemy is disabled or not doing anything + enemy.movePoints = 0; + enemy.attackPoints = 0; + enemy.warningTiles = []; + + // Also let go of leashes here + if (enemy == KinkyDungeonLeashingEnemy() && ( + !enemy.playWithPlayer + && !enemy.IntentAction + && !enemy.CurrentAction + && (!enemy.action || !KDEnemyAction[enemy.action]?.holdleash) + && !enemy.IntentLeashPoint + && !KinkyDungeonFlags.get("PlayerDommed") + && !KinkyDungeonAggressive(enemy, KinkyDungeonPlayerEntity) + )) { + KDBreakTether(KinkyDungeonPlayerEntity); + } + + if (enemy.Enemy.Sound?.idleSoundName) { + KDEnemyAddSound(enemy, enemy.Enemy.Sound?.baseAmount || KDDefaultEnemyIdleSound, + undefined, + enemy.Enemy.Sound?.idleSoundName ? TextGet("KDAmbSound_" + enemy.Enemy.Sound.idleSoundName) : undefined, + 1 + ); + } + + KDEnemySoundDecay(enemy, delta); + + } else { + KDEnemyAddSound(enemy, enemy.Enemy.Sound?.moveAmount != undefined ? enemy.Enemy.Sound?.moveAmount : KDDefaultEnemyMoveSound, + undefined, enemy.Enemy.Sound?.moveSoundName ? TextGet("KDAmbSound_" + enemy.Enemy.Sound.moveSoundName) : undefined + ); + } + + if (enemy.movePoints == 0 && enemy.attackPoints == 0 && !(enemy.warningTiles?.length > 0) && !enemy.sprinted) { + KDEnemyChangeSprint(enemy, -delta); + } + enemy.sprinted = false; + + KinkyDungeonHandleTilesEnemy(enemy, delta); + + if (enemy.vp > 0 && (!enemy.path || enemy.path.length < 4)) { + let sneakThreshold = enemy.Enemy.sneakThreshold ? enemy.Enemy.sneakThreshold : 2; + if (enemy.vp > sneakThreshold * 2 && !enemy.aware) { + let sneak = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak"); + if (sneak > 0) + enemy.vp = Math.max(sneakThreshold + 1, Math.max(Math.min(enemy.vp, sneakThreshold), enemy.vp * 0.7 - 0.1*delta)); + } + if (!player?.player || KDistChebyshev(enemy.x - player.x, enemy.y - player.y) > 2.5) { + enemy.vp = Math.max(0, enemy.vp - 0.04*delta); + } + + } + + // Updates the NPC's persistence record if available + // This does not MAKE the NPC persistent, only updates it if they are + // We do, however, make + KDUpdatePersistentNPC(enemy.id, KDGameData.Collection[enemy.id + ""] != undefined); + + // Delete the enemy + if (KinkyDungeonEnemyCheckHP(enemy, E, KDMapData)) + { E -= 1;} + else if (KDGetFaction(enemy) != "Player") { + if (enemy.aware && (enemy.lifetime == undefined || enemy.lifetime > 9000) && !enemy.Enemy.tags.temporary && !enemy.Enemy.tags.peaceful) { + if (enemy.hostile > 0 && enemy.hostile < 9000 && (KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail')) { + if (!(enemy.silence > 0) && KDEnemyCanSignalMap(enemy)) { + KDGameData.tickAlertTimer = true; + if (KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y) < 9 && !KDGameData.HostileFactions.includes(KDGetFaction(enemy))) { + KDGameData.HostileFactions.push(KDGetFaction(enemy)); + } + } + } else if (KinkyDungeonAggressive(enemy)) { + if (!(enemy.silence > 0) && KDEnemyCanSignalMap(enemy)) { + KDGameData.tickAlertTimer = true; + if (KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y) < 9 && !KDGameData.HostileFactions.includes(KDGetFaction(enemy))) { + KDGameData.HostileFactions.push(KDGetFaction(enemy)); + } + } + } + } + } + if (enemy.Enemy.regen && (enemy.hp > 0.01 || enemy.Enemy.regen < 0)) enemy.hp = Math.min(enemy.Enemy.maxhp, enemy.hp + enemy.Enemy.regen * delta); + if (enemy.Enemy.lifespan || enemy.lifetime != undefined) { + if (enemy.lifetime == undefined) enemy.lifetime = enemy.Enemy.lifespan; + if (enemy.lifetime <= 9000) + enemy.lifetime -= delta; + if (enemy.lifetime <= 0) enemy.hp = -10000; + } + if (enemy.boundTo) { + if (enemy.boundTo == -1) { + if (KDPlayerIsDefeated()) enemy.hp = 0; + if (enemy.weakBinding && KDPlayerIsStunned()) enemy.hp = Math.max(0, enemy.hp - enemy.Enemy.maxhp*0.2); + } else if ( + !KinkyDungeonFindID(enemy.boundTo) + || KDHelpless(KinkyDungeonFindID(enemy.boundTo)) + || (enemy.weakBinding + && KinkyDungeonIsDisabled(KinkyDungeonFindID(enemy.boundTo)))) + enemy.hp = 0; + } + if (enemy.fx && !enemy.Enemy.noFlip) { + if (Math.sign(enemy.fx - enemy.x) < 0) { + delete enemy.flip; + } else if (Math.sign(enemy.fx - enemy.x) > 0) { + enemy.flip = true; + } + } + } + } + } + + + if (!Allied) { + // vulnerability calc + for (let i = KDMapData.Entities.length-1; i >= 0; i--) { + let enemy = KDMapData.Entities[i]; + // Make it so you can backstab enemies while your allies fight them + KDCheckVulnerableBackstab(enemy); + // Alert enemies if youve aggroed one + if (!KDAllied(enemy) && !(enemy.ceasefire > 0)) { + if (!(enemy.hostile > 0) + && KDGameData.HostileFactions.length > 0 + && !KinkyDungeonAggressive(enemy) + && !enemy.Enemy.tags.peaceful + && (enemy.vp > 0.5 || enemy.lifetime < 900 + || (!KDHostile(enemy) + && KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 7))) { + let opMod = KDOpinionRepMod(enemy, KDPlayer()); + for (let f of KDGameData.HostileFactions) { + let f2 = KDGetFaction(enemy); + if ((KDGameData.PrisonerState == 'jail' || KDGameData.PrisonerState == 'parole') + && KDFactionRelation(f2, "Jail") > -0.05 && KDFactionRelation(f, "Jail") < 0) { + continue; + } + if ((f2 != "Player") && ( + // Either the player has aggroed second faction for some reason or this faction is dishonorable + KDGetHonor(f, f2) < 0 + || !KDFactionHostile("Player", f2) + ) + && ( + (KDFactionRelation(f, f2) > 0.15 && KDFactionRelation(f, f2) < 0.5 && // Favored + KDFactionRelation("Player", f2) + opMod < 0) // Angered + 0.1 + || (KDFactionRelation(f, f2) >= 0.5 && // Allied + KDFactionRelation("Player", f2) + opMod < 0.3) // Not thankful + 0.1 + ) + ) { + if (!(enemy.hostile > 0) && + (enemy.Enemy.tags.jail || enemy.Enemy.tags.jailer || KDGetEnemyPlayLine(enemy))) { + let h = f == (KDGetFaction(enemy)) ? "Defend" : "Honor"; + let suff = KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) + h : h; + let index = ("" + Math.floor(Math.random() * 3)); + + if ((!enemy.dialogue || !enemy.dialogueDuration) && !enemy.playWithPlayer) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailChase" + suff + index).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 7, (!KDGameData.PrisonerState) ? 3 : 5); + } + KDMakeHostile(enemy, KDMaxAlertTimerAggro * 0.5); + } + } + } + } + } + + let alertingFaction = false; + for (let f of KDGameData.HostileFactions) { + if (KDFactionRelation("Jail", f) > -0.01 && KDFactionRelation("Chase", f) > -0.01) { + alertingFaction = true; + } + } + if (KDGameData.tickAlertTimer && (KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail') && alertingFaction) { + if (KDGameData.AlertTimer < 3*KDMaxAlertTimer) KDGameData.AlertTimer += maindelta; + } else if (KDGameData.AlertTimer > 0) { + KDGameData.AlertTimer -= maindelta * 3; + } + if (KDGameData.AlertTimer >= KDMaxAlertTimer) { + KinkyDungeonStartChase(undefined, "Alert"); + } + + if (KDMapData.PrisonType) { + let prisonType = KDPrisonTypes[KDMapData.PrisonType]; + if (!KDMapData.PrisonState) KDMapData.PrisonState = prisonType.default_state; + let prisonState = KDMapData.PrisonState; + let newState = KDPrisonTypes[KDMapData.PrisonType]?.update ? KDPrisonTypes[KDMapData.PrisonType].update(timeDelta) : ""; + if (newState && newState != KDMapData.PrisonState) { + if (prisonType.states[prisonState].finally) prisonType.states[prisonState].finally(timeDelta, newState, false); + KDMapData.PrisonState = newState; + KinkyDungeonSendEvent("postPrisonStateForce", {delta: timeDelta}); + } + if (KDMapData.PrisonStateStack?.length > 0) { + for (let s of KDMapData.PrisonStateStack) { + if (prisonType.states[s].updateStack) prisonType.states[s].updateStack(timeDelta); + } + KinkyDungeonSendEvent("postPrisonUpdateStack", {delta: timeDelta}); + } + if (prisonState) { + newState = prisonType.states[prisonState].update(timeDelta); + if (newState != KDMapData.PrisonState) { + if (prisonType.states[prisonState].finally) prisonType.states[prisonState].finally(timeDelta, newState, false); + KDMapData.PrisonState = newState; + KinkyDungeonSendEvent("postPrisonStateChange", {delta: timeDelta}); + } + KinkyDungeonSendEvent("postPrisonUpdate", {delta: timeDelta}); + } + } else { + KinkyDungeonHandleJailSpawns(maindelta); + KinkyDungeonHandleWanderingSpawns(maindelta); + } + KinkyDungeonAlert = 0; + } + + if (defeat) { + KDRunDefeatForEnemy(); + } +} + +function KDRunDefeatForEnemy() { + let CD = KDCustomDefeat; + let CDE = KDCustomDefeatEnemy; + KDCustomDefeat = ""; + KDCustomDefeatEnemy = null; + if (CD && KDCustomDefeats[CD]) KDCustomDefeats[CD](CDE); + else if (!KinkyDungeonFlags.get("CustomDefeat")) { + if (KDRunRegularJailDefeatAttempt(CDE)) { + KinkyDungeonDefeat(KinkyDungeonFlags.has("LeashToPrison"), CDE); + } + } +} + +/** @returns {boolean} - TRUE if defeat is success */ +function KDRunRegularJailDefeatAttempt(CDE: entity, allowMain: boolean = true, runBackup: boolean = true): boolean { + let forceFaction = KDGetLeashFaction(CDE); + let jailroom = KDGetLeashJailRoom(CDE); + + let slot = KDGetWorldMapLocation(KDCurrentWorldSlot); + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + let fromHere = false; + if (!((slot.main || "") == KDGameData.RoomType) + && (!altType || altType.placeJailEntrances || slot?.main == KDGameData.RoomType) + && !KDSelfishLeash(CDE)) + fromHere = true; + + + let outpost = KDAddOutpost( + slot, + fromHere ? KDGameData.RoomType : slot.main || "", + jailroom, + forceFaction || "Jail", + false, + "Jail", + fromHere ? slot.main || "" : undefined, + fromHere ? "Jail" : undefined, + fromHere ? "Jail" : undefined, + true + ); + if (KDHasEntranceToJailRoom(outpost || jailroom, KDGetCurrentLocation(), allowMain)) { + return true; + } + + if (!runBackup) return false; + // We failed, so we teleport to the next room over + let exit = KDGetNearestExit(CDE.x, CDE.y, KDMapData, true); + + let oldLeash = KDPlayer().leash; + + + if (!CDE.homeCoord) { + CDE.homeCoord = KDGetCurrentLocation(); + } + + let currentMapData = KDMapData; + + + + KDGoThruTile(exit.x, exit.y, true, true, false); + + + // The above condition is the condition to start in jail + // We move the player to the jail after generating one + /*nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (nearestJail) { + + KDMovePlayer(nearestJail.x, nearestJail.y, false); + KDLockNearbyJailDoors(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + }*/ + let entrance = KDGetNearestExitTo(currentMapData.RoomType, currentMapData.mapX, currentMapData.mapY, + 1, 1, KDMapData, true + ); + + let altRoom = KDGetAltType(MiniGameKinkyDungeonLevel); + if (!entrance || (altRoom?.nostartstairs && entrance.x == KDMapData.StartPosition.x + && entrance.y == KDMapData.StartPosition.y) + ) { + entrance = KDMapData.EndPosition; + } + + KDMovePlayer(entrance.x, entrance.y, false); + + KDDespawnEnemy(CDE, undefined, currentMapData, KDMapData.RoomType); + let nextExit = KDGetNearestExitTo( + currentMapData.RoomType, currentMapData.mapX, currentMapData.mapY, + CDE.x, + CDE.y, + KDMapData, true + ); + if (nextExit) { + CDE.despawnX = nextExit.x; + CDE.despawnY = nextExit.y; + } else { + CDE.despawnX = KDMapData.EndPosition.x; + CDE.despawnY = KDMapData.EndPosition.y; + } + KDPlayer().leash = oldLeash; + + if (CDE) KDGameData.JailGuard = CDE.id; + if (CDE && KinkyDungeonJailGuard()) { + KDAttachLeashOrCollar(KinkyDungeonJailGuard(), KDPlayer(), 1, true); + if (!KDPlayer().leash) + KinkyDungeonAttachTetherToEntity( + 2.5, KinkyDungeonJailGuard(), KDPlayer() + ); + else { + KDPlayer().leash.x = CDE.x; + KDPlayer().leash.y = CDE.y; + } + let guard = KinkyDungeonJailGuard(); + guard.aware = true; + guard.gx = guard.x; + guard.gy = guard.y; + + + let action = "CaptureJail"; + if (guard.IntentAction != action) { + KDIntentEvents[action].trigger(guard, {}); + } + + KDAssignLeashPoint(CDE); + if (!CDE.IntentLeashPoint) { + CDE.gx = AIData.nearestJail.x; + CDE.gy = AIData.nearestJail.y; + } + } + + let en = KinkyDungeonEntityAt(entrance.x, entrance.y); + if (en) { + let pp = KinkyDungeonGetNearbyPoint( + en.x, en.y, true + ); + if (pp) { + KDMoveEntity(en, pp.x, pp.y, true, false, + false, false, true); + } + } + + + + return false; +} + +let KDCustomDefeat: string = ""; +let KDCustomDefeatEnemy: entity = null; + +function KDMakeHostile(enemy: entity, timer?: number) { + if (!timer) timer = KDMaxAlertTimerAggro; + if (!enemy.hostile) enemy.hostile = timer; + else enemy.hostile = Math.max(enemy.hostile, timer); + + delete enemy.ceasefire; + delete enemy.allied; +} + +/** + * Makes an enemy vulnerable if you are behind them + * @param enemy + */ +function KDCheckVulnerableBackstab(enemy: entity): boolean { + if (KinkyDungeonAggressive(enemy) && enemy != KinkyDungeonLeashingEnemy()) { + if (KDistChebyshev(enemy.fx - enemy.x, enemy.fy - enemy.y) < 1.5 && !enemy.Enemy.tags.noflank) { + if (enemy.fx && enemy.fx) { + if (enemy.x * 2 - enemy.fx == KinkyDungeonPlayerEntity.x && enemy.y * 2 - enemy.fy == KinkyDungeonPlayerEntity.y) { + KDAddThought(enemy.id, "Annoyed", 4, 1); + enemy.vulnerable = Math.max(enemy.vulnerable, 1); + + + if (!KinkyDungeonFlags.get("tut_nothingpersonnel")) { + KinkyDungeonSetFlag("tut_nothingpersonnel", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_TeleCrit"), KDTutorialColor, 10); + } + return true; + } + } else if (!enemy.fx && !enemy.fy) { + let xmod = 0; + if (!enemy.Enemy?.nonDirectional) { + xmod = enemy.flip ? 1 : -1; + } + if (enemy.x + xmod == KinkyDungeonPlayerEntity.x && enemy.y == KinkyDungeonPlayerEntity.y) { + KDAddThought(enemy.id, "Confused", 4, 1); + enemy.vulnerable = Math.max(enemy.vulnerable, 1); + return true; + } + } + } + } + return false; +} + +/** + * @param enemy + */ +function KDGetAI(enemy: entity): string { + if (enemy.AI) return enemy.AI; + else return enemy.Enemy.AI; +} + +let KDThoughtBubbles: Map = new Map(); + +function KDAddThought(id: number, name: string, priority: number, duration: number) { + let pri = -1; + let n = ""; + let i = 0; + let d = 1; + if (KDThoughtBubbles.has(id)) { + pri = KDThoughtBubbles.get(id).priority; + n = KDThoughtBubbles.get(id).name; + d = KDThoughtBubbles.get(id).duration; + i = KDThoughtBubbles.get(id).index; + } + // Different name means the bubble is refreshed + if (priority > pri || (n != name && KinkyDungeonCurrentTick > d + i) || (n != name && priority >= pri)) { + KDThoughtBubbles.set(id, { + name: name, + priority: priority, + duration: duration, + index: KinkyDungeonCurrentTick, + }); + } +} + +function KDGetEnemyPlayLine(enemy: entity): string { + return enemy.playLine || enemy.Enemy.playLine || ""; +} + +/** + * @param enemy + */ +function KDEnemyCanTalk(enemy: entity): boolean { + return enemy?.Enemy && !enemy.Enemy.tags?.gagged && (enemy.Enemy.tags.jailer || enemy.Enemy.tags.jail || KDGetEnemyPlayLine(enemy)) && !(enemy.silence > 0); +} + +let AIData: KDAIData = {}; + +/** + * @param enemy + * @param player + * @param delta + * @param visionMod + * @param playerItems + */ +function KinkyDungeonEnemyLoop(enemy: entity, player: any, delta: number, visionMod: number, playerItems: item[]): {idle: boolean, defeat: boolean, defeatEnemy: entity} { + AIData = {}; + + if (!enemy.Enemy.maxhp) { + enemy.Enemy = KinkyDungeonGetEnemyByName(enemy.Enemy.name); + } + + + + //let allied = KDAllied(enemy); + //let hostile = KDHostile(enemy); + + AIData.playerItems = playerItems; + AIData.player = player; + AIData.defeat = false; + AIData.idle = true; + AIData.moved = false; + AIData.ignore = false; + AIData.visionMod = visionMod; + AIData.followRange = enemy.Enemy.followRange == 1 ? 1.5 : enemy.Enemy.followRange; + AIData.visionRadius = enemy.Enemy.visionRadius ? (KDEnemyVisionRadius(enemy) + ((enemy.lifetime > 0 && enemy.Enemy.visionSummoned) ? enemy.Enemy.visionSummoned : 0)) : 0; + AIData.visionRadius = Math.max(1.5, AIData.visionRadius + KinkyDungeonGetBuffedStat(enemy.buffs, "Vision")); + let AIType = KDAIType[enemy.AI ? enemy.AI : enemy.Enemy.AI]; + if (AIData.visionMod && AIData.visionRadius > 1.5) AIData.visionRadius = Math.max(1.5, AIData.visionRadius * AIData.visionMod); + AIData.chaseRadius = (enemy.Enemy.Awareness?.chaseradius != undefined) ? enemy.Enemy.Awareness.chaseradius + : 10 + 1.5*(Math.max(AIData.followRange, 0)) + 1.5*Math.max(AIData.visionRadius ? AIData.visionRadius : 0, enemy.Enemy.blindSight ? enemy.Enemy.blindSight : 0); + AIData.blindSight = (enemy && enemy.Enemy && enemy.Enemy.blindSight) ? enemy.Enemy.blindSight : 0; + if (KinkyDungeonStatsChoice.get("KillSquad")) { + AIData.visionRadius *= 1.2; + AIData.chaseRadius *= 1.2; + AIData.blindSight += 3.5; + if (AIData.blindSight > AIData.visionRadius) { + AIData.visionRadius = AIData.blindSight; + } + if (AIData.blindSight > AIData.chaseRadius) { + AIData.chaseRadius = AIData.blindSight; + } + } + AIData.ignoreLocks = enemy.Enemy.keys || enemy.keys + || enemy == KinkyDungeonLeashingEnemy() + || enemy == KinkyDungeonJailGuard() || (KDEnemyHasFlag(enemy, "keys")); + if (KinkyDungeonJailGuard()) KinkyDungeonSetEnemyFlag(enemy, "keys", 100); + AIData.harmless = (KinkyDungeonPlayerDamage.damage <= enemy.Enemy.armor || !KinkyDungeonHasWill(0.1)) + && !KinkyDungeonFlags.has("PlayerCombat") + && !KinkyDungeonCanTalk() + && (!KinkyDungeonCanUseWeapon() || KinkyDungeonPlayerDamage?.unarmed) + && KinkyDungeonSlowLevel > 1; + + AIData.directionOffset = enemy.Enemy.nonDirectional ? 0 : (enemy.flip ? Math.max(1, AIData.visionRadius - 2) : -Math.max(1, AIData.visionRadius - 2)); + + AIData.playerDist = KDistEuclidean(enemy.x - player.x, enemy.y - player.y); + AIData.playerDistDirectional = KDistEuclidean(enemy.x + AIData.directionOffset - player.x, enemy.y - player.y); + if (AIData.playerDistDirectional < AIData.playerDist && AIData.playerDist < Math.abs(AIData.directionOffset)) AIData.playerDistDirectional = 0; // Within AIData.directionOffset + AIData.hostile = KDHostile(enemy, player); + AIData.allied = KDAllied(enemy); + AIData.aggressive = KinkyDungeonAggressive(enemy, player); + AIData.domMe = (player.player && AIData.aggressive) ? false : KDCanDom(enemy); + + + AIData.leashing = enemy.Enemy.tags.leashing && (KDFactionRelation(KDGetFaction(enemy), "Jail")) > -0.5; + AIData.highdistraction = KDIsDistracted(enemy) + && (enemy.id != KinkyDungeonJailGuard()?.id || !!KinkyDungeonFlags.get("PlayerCombat")) + && (!KDEntityHasFlag(enemy, "overrideMove")); + AIData.distracted = AIData.highdistraction + && KDLoosePersonalities.includes(enemy.personality) + && AIData.playerDist > 2.5 && KDRandom() < (KDGetFaction(enemy) == "Player" ? 0.1 : 0.2); + // Check if the enemy ignores the player + if (player.player && (enemy.aware || enemy.vp > 0) && !KDAllied(enemy) && !KDEnemyHasFlag(enemy, "noignore")) { + if (AIData.playerDist < 1.5 && KinkyDungeonAllRestraint().some((r) => {return KDRestraint(r).ignoreNear;})) AIData.ignore = true; + if (!AIData.leashing && !KinkyDungeonHasWill(0.1) && KinkyDungeonAllRestraint().some((r) => {return KDRestraint(r).ignoreIfNotLeash;})) AIData.ignore = true; + + if (enemy != KinkyDungeonLeashingEnemy() && enemy != KinkyDungeonJailGuard() && (!KinkyDungeonFlags.has("PlayerCombat") || enemy.Enemy.tags.ignorebrat)) { + if (enemy.Enemy.tags.ignorenoSP && !KinkyDungeonHasWill(0.1)) AIData.ignore = true; + if (((enemy.Enemy.tags.ignoreharmless)) && (!enemy.warningTiles || enemy.warningTiles.length == 0) + && !(KDGameData.PrisonerState == 'chase' && KDFactionRelation(KDGetFaction(enemy), KDGetMainFaction()) > 0.09) // Dont ignore if the enemy is hunting the player for escape + && AIData.harmless && (!enemy.Enemy.ignorechance || KDRandom() < enemy.Enemy.ignorechance || !KinkyDungeonHasWill(0.1))) AIData.ignore = true; + if (enemy.Enemy.tags.ignoretiedup && (!enemy.warningTiles || enemy.warningTiles.length == 0) && enemy.lifetime == undefined + && !KinkyDungeonCanUseWeapon() && !KinkyDungeonCanTalk() && KinkyDungeonSlowLevel > 1 + && (!enemy.Enemy.ignorechance || KDRandom() < enemy.Enemy.ignorechance || !KinkyDungeonHasWill(0.1))) AIData.ignore = true; + if (enemy.Enemy.tags.ignoregagged && (!enemy.warningTiles || enemy.warningTiles.length == 0) && enemy.lifetime == undefined + && !KinkyDungeonCanTalk() + && (!enemy.Enemy.ignorechance || KDRandom() < enemy.Enemy.ignorechance || !KinkyDungeonHasWill(0.1))) AIData.ignore = true; + if (enemy.Enemy.tags.ignoreboundhands && (!enemy.warningTiles || enemy.warningTiles.length == 0) && enemy.lifetime == undefined + && (KinkyDungeonPlayerDamage.damage <= enemy.Enemy.armor || !KinkyDungeonHasWill(0.1)) && !KinkyDungeonCanUseWeapon() + && (!enemy.Enemy.ignorechance || KDRandom() < enemy.Enemy.ignorechance || !KinkyDungeonHasWill(0.1))) AIData.ignore = true; + } + if (enemy.Enemy.ignoreflag) { + for (let f of enemy.Enemy.ignoreflag) { + if (KinkyDungeonFlags.get(f) || KinkyDungeonPlayerTags.get(f)) AIData.ignore = true; + } + } + // Instead of leashing we ignore + if (enemy.Enemy.tags.leashing && !AIData.leashing && !KinkyDungeonHasWill(0.1) && !KinkyDungeonCanUseWeapon() && KDIsPlayerTethered(player)) { + AIData.ignore = true; + } + if (!AIData.aggressive && !(enemy.rage > 0) && !enemy.Enemy.alwaysHostile && (!enemy.playWithPlayer || !player.player)) AIData.ignore = true; + if (AIData.distracted) AIData.ignore = true; + + // If the player is already being held by another NPC and is not resisting + if (KinkyDungeonFlags.get("PlayerDommed") && !KDPlayerDeservesPunishment(enemy, player)) AIData.ignore = true; + } + + if (KDOverrideIgnore(enemy, player)) AIData.ignore = false; + if (player?.player && KinkyDungeonFlags.get("forceIgnore")) AIData.ignore = true; + + AIData.MovableTiles = KinkyDungeonMovableTilesEnemy; + AIData.AvoidTiles = "" + KDDefaultAvoidTiles; + if (enemy.Enemy.tags && enemy.Enemy.tags.opendoors) AIData.MovableTiles = KinkyDungeonMovableTilesSmartEnemy; + else if (enemy == KinkyDungeonLeashingEnemy() || enemy == KinkyDungeonJailGuard()) AIData.MovableTiles = KinkyDungeonMovableTilesSmartEnemy; + if (enemy.Enemy.ethereal) { + AIData.AvoidTiles = ""; + AIData.MovableTiles = AIData.MovableTiles + "1X"; + } else if ((enemy.Enemy.squeeze || enemy.Enemy.earthmove) && KinkyDungeonLeashingEnemy()?.id != enemy.id) { + AIData.MovableTiles = AIData.MovableTiles + (enemy.Enemy.earthmove ? '4' : '') + (enemy.Enemy.squeeze ? 'b' : ''); + AIData.AvoidTiles = ""; + } + + let attackPre = ""; + AIData.attack = enemy.Enemy.attack; + AIData.range = (enemy.Enemy.attackRange == 1 ? 1.5 : enemy.Enemy.attackRange) + KinkyDungeonGetBuffedStat(enemy.buffs, "AttackRange"); + AIData.width = enemy.Enemy.attackWidth + KinkyDungeonGetBuffedStat(enemy.buffs, "AttackWidth"); + AIData.bindLevel = KDBoundEffects(enemy); + AIData.accuracy = KDEnemyAccuracy(enemy, player); + + AIData.vibe = false; + AIData.damage = enemy.Enemy.dmgType; + AIData.power = enemy.Enemy.power + KinkyDungeonGetBuffedStat(enemy.buffs, "AttackPower"); + + AIData.targetRestraintLevel = 0.25 + (enemy.aggro && !enemy.playWithPlayer ? enemy.aggro : 0) + 0.004 * Math.max(0, KDGetEffSecurityLevel(KDGetFaction(enemy) || KDGetFactionOriginal(enemy)) + 50); + if (enemy.aggro > 0 && delta > 0 && enemy.aggro > enemy.hp / enemy.Enemy.maxhp) enemy.aggro = enemy.aggro * 0.95; + if (KinkyDungeonStatsChoice.has("NoWayOut") || (enemy.playWithPlayer > 0 && !KinkyDungeonAggressive(enemy)) || enemy.hp < enemy.Enemy.maxhp * 0.5 || !KDIsHumanoid(enemy)) + AIData.targetRestraintLevel = Math.max(0.7, AIData.targetRestraintLevel); + if (enemy.Enemy.Behavior?.thorough) AIData.targetRestraintLevel = Math.max(AIData.targetRestraintLevel, enemy.Enemy.Behavior?.thorough); + AIData.addLeash = AIData.leashing && KDBoundPowerLevel >= AIData.targetRestraintLevel && (!KinkyDungeonPlayerTags.get("Collars") || !KinkyDungeonGetRestraintItem("ItemNeckRestraints")); + if (!AIData.addLeash && AIData.leashing && enemy.IntentLeashPoint && (!KinkyDungeonPlayerTags.get("Collars") || !KinkyDungeonGetRestraintItem("ItemNeckRestraints"))) AIData.addLeash = true; + + if (player.player && enemy.Enemy.tags && AIData.leashing && (!KinkyDungeonHasWill(0.1) || AIData.addLeash) && enemy.aware) { + AIData.followRange = 1.5; + if (!AIData.attack.includes("Bind")) { + attackPre = attackPre + "Bind"; + AIData.attack = attackPre + AIData.attack; + } + } + + AIData.refreshWarningTiles = false; + + AIData.hitsfx = (enemy.Enemy && enemy.Enemy.hitsfx) ? enemy.Enemy.hitsfx : ""; + // Only target the player for alerts + if (KinkyDungeonAlert && player.player && AIData.playerDist < KinkyDungeonAlert) { + if (KDPlayerLight < 1.5 && AIData.playerDist < KinkyDungeonAlert*0.5) { + if (!enemy.aware && AIData.aggressive) KDAddThought(enemy.id, "Blind", 3, 3); + } else { + if (!enemy.aware && AIData.aggressive) { + KDAddThought(enemy.id, "Aware", 3, 3); + if (KDRandom() < actionDialogueChanceIntense) + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonRemindJailChase" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "Alert") + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), + 4, 5, false, true); + } + + if (!enemy.aware) KDEnemyAddSound(enemy, enemy.Enemy.Sound?.alertAmount != undefined ? enemy.Enemy.Sound?.alertAmount : KDDefaultEnemyAlertSound, + undefined, enemy.Enemy.Sound?.alertSoundName ? TextGet("KDAmbSound_" + enemy.Enemy.Sound.alertSoundName) : undefined + ); + + enemy.aware = true; + + if (!enemy.aggro) enemy.aggro = 0; + enemy.aggro += 0.1; + } + + } + let specialCondition = enemy.Enemy.specialAttack != undefined && (!enemy.specialCD || enemy.specialCD <= 0) && (!enemy.Enemy.specialMinRange || AIData.playerDist > enemy.Enemy.specialMinRange); + let specialConditionSpecial = (enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialCondition) ? KDSpecialConditions[enemy.Enemy.specialCondition].criteria(enemy, AIData) : true; + + let updateSpecial = () => { + specialCondition = enemy.Enemy.specialAttack != undefined && (!enemy.specialCD || enemy.specialCD <= 0) && (!enemy.Enemy.specialMinRange || AIData.playerDist > enemy.Enemy.specialMinRange) + && (!enemy.Enemy.specialCharges || enemy.specialCharges > 0); + specialConditionSpecial = (enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialCondition) ? KDSpecialConditions[enemy.Enemy.specialCondition].criteria(enemy, AIData) : specialCondition; + + AIData.hitsfx = (enemy.Enemy && enemy.Enemy.hitsfx) ? enemy.Enemy.hitsfx : ""; + AIData.attack = attackPre + enemy.Enemy.attack; + AIData.range = (enemy.Enemy.attackRange == 1 ? 1.5 : enemy.Enemy.attackRange) + KinkyDungeonGetBuffedStat(enemy.buffs, "AttackRange"); + AIData.width = enemy.Enemy.attackWidth + KinkyDungeonGetBuffedStat(enemy.buffs, "AttackWidth"); + AIData.damage = enemy.Enemy.dmgType; + AIData.power = enemy.Enemy.power + KinkyDungeonGetBuffedStat(enemy.buffs, "AttackPower"); + + if (specialCondition && specialConditionSpecial) { + AIData.attack = AIData.attack + enemy.Enemy.specialAttack; + if (!enemy.attackPoints) { + AIData.refreshWarningTiles = !enemy.usingSpecial; + enemy.usingSpecial = true; + } + + if (enemy.Enemy && enemy.Enemy.hitsfxSpecial) AIData.hitsfx = enemy.Enemy.hitsfxSpecial; + + if (enemy.Enemy.specialRemove) AIData.attack = AIData.attack.replace(enemy.Enemy.specialRemove, ""); + if (enemy.Enemy.specialRange && enemy.usingSpecial) { + AIData.range = enemy.Enemy.specialRange == 1 ? 1.5 : enemy.Enemy.specialRange; + } + if (enemy.Enemy.specialWidth && enemy.usingSpecial) { + AIData.width = enemy.Enemy.specialWidth; + } + if (enemy.Enemy.specialPower && enemy.usingSpecial) { + AIData.power = enemy.Enemy.specialPower; + } + if (enemy.Enemy.specialDamage && enemy.usingSpecial) { + AIData.damage = enemy.Enemy.specialDamage; + } + } + if (enemy.usingSpecial && !specialConditionSpecial) { + enemy.usingSpecial = false; + if (KDSpecialConditions[enemy.Enemy.specialCondition]?.resetCD) enemy.specialCD = enemy.Enemy.specialCD; + } + }; + updateSpecial(); + + if (KDEnemyHasFlag(enemy, "nobind")) { + AIData.addMoreRestraints = false; + } else { + AIData.addMoreRestraints = !AIData.leashing || (AIData.attack.includes("Bind") + && ( + KDBoundPowerLevel < AIData.targetRestraintLevel // General restraint level + || (enemy.Enemy.Behavior && ( + enemy.Enemy.Behavior.ensureGroupTied?.some((group) => {return KinkyDungeonGetRestraintItem(group) != undefined;}) // Some enemies won't stop until these groups are filled + || enemy.Enemy.Behavior.ensurePlayerTag?.some((tag) => {return KinkyDungeonPlayerTags.has(tag);}) // Some enemies won't stop until these tags are had + || (KinkyDungeonStatsChoice.get("arousalMode") && + (enemy.Enemy.Behavior.ensureGroupTied?.some((group) => {return KinkyDungeonGetRestraintItem(group) != undefined;}) // Some enemies won't stop until these groups are filled + || enemy.Enemy.Behavior.ensurePlayerTag?.some((tag) => {return KinkyDungeonPlayerTags.has(tag);})))) // Some enemies won't stop until these tags are had + ) + || !KinkyDungeonIsArmsBound() // All enemies should bind arms or have ignore tag + ) + ); + } + + + if (!enemy.Enemy.attackWhileMoving && AIData.range > AIData.followRange) { + AIData.followRange = AIData.range; + } + if (player.player && enemy.Enemy && enemy.Enemy.playerFollowRange) AIData.followRange = enemy.Enemy.playerFollowRange == 1.5 ? 1.5 : enemy.Enemy.playerFollowRange; + + if (!enemy.warningTiles) enemy.warningTiles = []; + AIData.canSensePlayer = !AIData.distracted + && (KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius, true, true) + || KDCanHearEnemy(enemy,player, 1.0)); + if (AIData.canSensePlayer && !AIData.distracted) { + AIData.canSeePlayer = KinkyDungeonCheckLOS(enemy, player, AIData.playerDistDirectional, AIData.visionRadius, false, false); + AIData.canSeePlayerChase = (enemy.aware ? + AIData.canSensePlayer + || KDCanHearEnemy(enemy,player, 2.0) // Better hearing due to paying attention + || KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.chaseRadius, false, false) + : AIData.canSensePlayer); // Reduced awareness + AIData.canSeePlayerMedium = KinkyDungeonCheckLOS(enemy, player, AIData.playerDistDirectional, AIData.visionRadius/2, false, true); + AIData.canSeePlayerClose = KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius/2, false, true); + AIData.canSeePlayerVeryClose = KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius/3, false, true); + AIData.canShootPlayer = KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius, false, true); + } + + if (!player.player && AIData.canShootPlayer && KDHostile(enemy, player)) { + enemy.aware = true; + } + + + if (KinkyDungeonLastTurnAction && AIData.canSeePlayer) { + if (!enemy.aggro) enemy.aggro = 0; + enemy.aggro += KinkyDungeonLastTurnAction == "Struggle" ? 0.1 : + (KinkyDungeonLastTurnAction == "Spell" ? 0.3 : + (KinkyDungeonLastTurnAction == "Attack" ? 0.25 : + 0.01)); + } + + if ((enemy.Enemy.projectileAttack || enemy.Enemy.projectileTargeting) && (!AIData.canShootPlayer || !KinkyDungeonCheckProjectileClearance(enemy.x, enemy.y, player.x, player.y, !player.player))) AIData.followRange = 1.5; + + if (!AIData.aggressive && !enemy.Enemy.alwaysHostile && !(enemy.rage > 0) && AIData.canSeePlayer && player.player && !KDAllied(enemy) + && ((!KinkyDungeonFlags.has("nojailbreak") && !KinkyDungeonPlayerInCell(true, true)) || KinkyDungeonLastTurnAction == "Struggle" || KinkyDungeonLastAction == "Struggle")) { + if (enemy.Enemy.tags.jailer || enemy.Enemy.tags.jail || enemy.Enemy.tags.leashing) { + if ( + (!KinkyDungeonFlags.has("nojailbreak") && !KinkyDungeonPlayerInCell(true, true)) + && (KDGameData.PrisonerState == 'jail' || (KDGameData.PrisonerState == 'parole' && KDPlayerIsRestricted(player, enemy))) // Restricted areas + && !KDIsPlayerTethered(KinkyDungeonPlayerEntity) + && KinkyDungeonSlowLevel < 9) + KinkyDungeonAggroAction('jailbreak', {enemy: enemy, force: true}); + else if (KDGameData.PrisonerState == 'parole' && !KinkyDungeonIsArmsBound() && !KDEnemyHasFlag(enemy, "Shop")) + KinkyDungeonAggroAction('unrestrained', {enemy: enemy}); + else if ((KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail') && (KinkyDungeonLastTurnAction == "Struggle" || KinkyDungeonLastAction == "Struggle")) + KinkyDungeonAggroAction('struggle', {enemy: enemy}); + } + AIData.ignore = !AIData.aggressive && (!enemy.playWithPlayer || !player.player); + } + + let sneakThreshold = enemy.Enemy.sneakThreshold ? enemy.Enemy.sneakThreshold : 2; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")) sneakThreshold = Math.max(0.1, sneakThreshold + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sneak")); + + + let aware = (enemy.vp > sneakThreshold || KDEnemyReallyAware(enemy, player)); + + AIData.playAllowed = false; + AIData.startedDialogue = false; + AIData.playChance = 0.1; + if (!enemy.personality) enemy.personality = KDGetPersonality(enemy); + + if (KDMapData.KeysHeld > 0) AIData.playChance += 0.25; + if (AIData.playerDist < 1.5) AIData.playChance += 0.1; + + + if (AIData.playerDist < AIData.visionRadius / 2) AIData.playChance += 0.1; + if (AIData.playerDist < 1.5) AIData.playChance += 0.3; + + if (KDAllied(enemy) || (!AIData.hostile && KDGameData.PrisonerState != "jail" && KDGameData.PrisonerState != "parole" && !KinkyDungeonStatsChoice.has("Submissive"))) AIData.playChance *= 0.07; // Drastically reduced chance to play if not hostile + else { + if (KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed) { + AIData.playChance += 0.25; + } + if (playerItems?.length > 0 || KinkyDungeonItemCount("RedKey") > 0) { + AIData.playChance += 0.2; + if (playerItems.length > 6) { + AIData.playChance += 0.5; + } + } + } + if (AIData.domMe) { + AIData.playChance += 0.2; + } else if (!KDPlayerIsTied()) { + AIData.playChance *= 0.4; + } + + AIData.playChance = KDCalcPlayChance(AIData.playChance, enemy); + + let playData = { + playChance: AIData.playChance, + AIData: AIData, + enemy: enemy, + player: player, + }; + KinkyDungeonSendEvent("calcPlayChance", playData); + AIData.playChance = playData.playChance; + if (KinkyDungeonFlags.get("noPlay")) AIData.playChance = 0; + AIData.canTalk = KDEnemyCanTalk(enemy); + + if (KDEnemyHasFlag(enemy, "forcePlay")) AIData.playChance = 1.0; + + if (KinkyDungeonCanPlay(enemy) && enemy != KinkyDungeonJailGuard() && !KinkyDungeonFlags.get("NPCCombat") && !enemy.Enemy.alwaysHostile + && !(enemy.rage > 0) && !(enemy.hostile > 0) + && player.player && AIData.canSeePlayer && (aware) && !KinkyDungeonInJail(KDJailFilters)) { + AIData.playAllowed = true; + + if (KDEnemyHasFlag(enemy, "allyPlay")) AIData.ignoreNoAlly = true; + if (!(enemy.playWithPlayerCD > 0) && !(enemy.playWithPlayer > 0) && KDRandom() < AIData.playChance && (!KDAllied(enemy) || AIData.ignoreNoAlly)) { + AIData.playEvent = true; + } + } + + // Intent events + if (enemy.vp < 0.01 && !KDEnemyHasFlag(enemy, "noResetIntent")) { + KDResetIntent(enemy, AIData); + } + + if (player.player && AIData.canSeePlayer && aware && !enemy.IntentAction) { + let event = KDGetIntentEvent(enemy, AIData, AIData.playEvent, KDAllied(enemy), AIData.hostile, AIData.aggressive); + if (event) event(enemy, AIData); + } + + + if (KinkyDungeonCanPutNewDialogue() && AIData.playerDist <= KinkyDungeonMaxDialogueTriggerDist && player.player) { + let dialogue = KDGetDialogueTrigger(enemy, AIData); + if (dialogue) { + KDStartDialog(dialogue,enemy.Enemy.name, true, enemy.personality, enemy); + AIData.startedDialogue = true; + } + } + + // Intro line + if (enemy.aware && (enemy.Enemy.bound || enemy.intro || enemy.Enemy.intro) && player?.player && (enemy.CustomName || enemy.intro || enemy.Enemy.intro) && !KDEnemyHasFlag(enemy, "PatronIntro")) { + KinkyDungeonSendDialogue(enemy, ( + enemy.intro || TextGet("KinkyDungeonRemindJail" + (enemy.Enemy.intro || (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "")) + "Intro") + ) + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)) + .replace("PTRN", enemy.CustomName), KDGetColor(enemy), 12, 10); + KinkyDungeonSetEnemyFlag(enemy, "PatronIntro", 9999); + } + + let intentAction = (enemy.IntentAction && KDIntentEvents[enemy.IntentAction]) ? KDIntentEvents[enemy.IntentAction] : null; + + if (!AIData.aggressive && player.player && (enemy.playWithPlayer || (intentAction && intentAction.forceattack))) AIData.ignore = false; + + AIData.canAggro = player && (((AIData.hostile && (AIData.aggressive || !KDEnemyHasFlag(enemy, "notouchie"))) + || (player.player && enemy.playWithPlayer && !AIData.domMe && !KDEnemyHasFlag(enemy, "notouchie"))) + || (!player.player && ( + !player.Enemy + || KDHostile(player) + || enemy.rage > 0))); + AIData.wantsToAttack = AIData.canAggro && ( + (!player.player // NPCs will aggro NPCs no questions asked + || ( // However there are situations where the player will not get attacked + !AIData.ignore // For example if the player is ignored + && ( // In order to be attacked the player must fulfill one of these conditions + ( // The most common is that the player is not currently leashed + !KDGameData.KinkyDungeonLeashedPlayer + || !KDIsPlayerTethered(player)) + || KinkyDungeonFlags + .get("overrideleashprotection") // The player is leashed but something allows her to be attacked anyway + || ((AIData.addMoreRestraints + || ( + KDPlayer().x == (enemy.fx||0) + && KDPlayer().y == (enemy.fy||0) + ) + || ( + KDPlayer().x == enemy.gx + && KDPlayer().y == enemy.gy + ) + || enemy.attackPoints > 0 + || KDEnemyHasFlag(enemy, "playerBlocking")) + && ( + KDIsPlayerTetheredToLocation(player, enemy.x, enemy.y, enemy) // The player is attached to this enemy + || enemy.id == KinkyDungeonLeashingEnemy()?.id // The player is being leashed by this enemy + )) + || (enemy.IntentLeashPoint && ( + KDistChebyshev(enemy.x- enemy.IntentLeashPoint.x, enemy.y- enemy.IntentLeashPoint.y) < 1.5 + )) + || KinkyDungeonFlags.has("PlayerCombat") // If the player is fighting back + // Basically the result of all this is that only the leashing enemy will attack a leashed player + // Unless the player is resisting being leashed + ) + )) ? + // If we meet the above conditions, we still have to consult whether or not the intent action gates it + // If we dont have an intent action, then we have the default gate + ((intentAction?.decideAttack) ? + (intentAction.decideAttack(enemy, player, AIData, AIData.allied, AIData.hostile, AIData.aggressive)) + : KDGateAttack(enemy)) + // Otherwise if we dont meet the conditions we dont want to attack + : false + ); + AIData.wantsToTease = AIData.canAggro && ( + (player.player && enemy.playWithPlayer && !KinkyDungeonAggressive(enemy) && !AIData.domMe && !KDEnemyHasFlag(enemy, "notouchie")) + && (!player.player // NPCs will aggro NPCs no questions asked + || ( // However there are situations where the player will not get attacked + !AIData.ignore // For example if the player is ignored + && ( // In order to be attacked the player must fulfill one of these conditions + ( // The most common is that the player is not currently leashed + !KDGameData.KinkyDungeonLeashedPlayer + || !KDIsPlayerTethered(player)) + || KinkyDungeonFlags + .get("overrideleashprotection") // The player is leashed but something allows her to be attacked anyway + || KDIsPlayerTetheredToLocation(player, enemy.x, enemy.y, enemy) // The player is attached to this enemy + || enemy.id == KinkyDungeonLeashingEnemy()?.id // The player is being leashed by this enemy + || KinkyDungeonFlags.has("PlayerCombat") // If the player is fighting back + // Basically the result of all this is that only the leashing enemy will attack a leashed player + // Unless the player is resisting being leashed + ) + )) ? + // If we meet the above conditions, we still have to consult whether or not the intent action gates it + ((intentAction?.decideAttack) ? + (intentAction.decideAttack(enemy, player, AIData, AIData.allied, AIData.hostile, AIData.aggressive)) + : true) + // Otherwise if we dont meet the conditions we dont want to attack + : false + ); + AIData.wantsToCast = player && ( + (!player.player || ( // We cast spells at NPCs since enemies dont want to capture NPCs (yet) + !AIData.ignore + && (player.player && ( + // Unlike attacking, we only cast spells at a leashed player if they are resisting + (!KDGameData.KinkyDungeonLeashedPlayer || !KDIsPlayerTethered(player)) + || KinkyDungeonFlags.get("PlayerCombat"))) + )) ? + // Same thing as attacking but for spells + ((intentAction?.decideSpell) ? + (intentAction.decideSpell(enemy, player, AIData, AIData.allied, AIData.hostile, AIData.aggressive)) + : true) + // Otherwise if we dont meet the conditions we dont want to cast + : false); + + + AIData.sneakMult = 0.05; + + if (AIData.canSeePlayer) AIData.sneakMult += 0.15; + if (AIData.canSeePlayerMedium) AIData.sneakMult += 0.2; + if (AIData.canSeePlayerClose) AIData.sneakMult += 0.2; + if (AIData.canSeePlayerVeryClose) AIData.sneakMult += 0.4; + //if (KinkyDungeonAlert > 0) AIData.sneakMult += 1; + + if (KinkyDungeonLastAction == "" || (KinkyDungeonSlowLevel > 1 && KinkyDungeonLastAction == "Move")) AIData.sneakMult *= 0.5; + else if (KinkyDungeonLastAction == "Cast" || KinkyDungeonLastAction == "Attack" || KinkyDungeonLastAction == "Move") AIData.sneakMult *= 1.5; + + if (enemy.vp > 0.2 && (!KDForcedToGround() && KinkyDungeonCanStand())) AIData.sneakMult += 0.1; + if (enemy.vp > 0.5 && (!KDForcedToGround() && KinkyDungeonCanStand())) AIData.sneakMult += 0.3; + + AIData.sneakMult *= KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(enemy, "sneakMult")); + + let sneakPerc = (AIData.canSensePlayer || AIData.canSeePlayer || AIData.canShootPlayer || AIData.canSeePlayerChase) ? + KinkyDungeonTrackSneak(enemy, delta * (AIData.sneakMult), player, (AIData.canSeePlayerClose) ? 0 : (enemy.Enemy.tags.darkvision ? 0.5 : 1.5)) + : 0; + + + + if ((!AIData.aggressive && player.player + && KDEnemyHasFlag(enemy, "seePlayer")) || enemy == KinkyDungeonLeashingEnemy()) { + enemy.aware = true; + sneakPerc = 1; + } + + if ( + // If the player is visible + (AIData.canSensePlayer || AIData.canSeePlayer || AIData.canShootPlayer || AIData.canSeePlayerChase) + // If we SEE the player as opposed to just being able to + && sneakPerc >= 0.5) { + + if (AIData.aggressive) + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); // Reset wander timer + + + if (!KDEnemyHasFlag(enemy, "StayHere") + && !KDEnemyHasFlag(enemy, "overrideMove")) { + // Enemies that arent told to hold still will decide to follow their targets + if (KDEnemyHasFlag(enemy, "Defensive")) { + // Defensive AI will follow the player + if (!KDEnemyHasFlag(enemy, "NoFollow")) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + } + } else if ( + // Dont chase the player if ignoring + !AIData.ignore + && !KDEnemyHasFlag(enemy, "dontChase") + // We want to track the target + && AIType.trackvisibletarget(enemy, player, AIData) + && ( + // We will follow the player if aggressive, playing, or not told to not follow + AIData.aggressive || enemy.playWithPlayer || !KDEnemyHasFlag(enemy, "NoFollow")) + ) { + let pp = KDistChebyshev(enemy.x - player.x, enemy.y - player.y) < 1.5 ? null : KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, true); + if (pp) { + // Go to a place near the target + enemy.gx = pp.x; + enemy.gy = pp.y; + KinkyDungeonSetEnemyFlag(enemy, "wander", Math.floor(4 + 6 * KDRandom())); + } else { + // Go to the target directly + enemy.gx = player.x; + enemy.gy = player.y; + KinkyDungeonSetEnemyFlag(enemy, "wander", Math.floor(4 + 6 * KDRandom())); + } + } + } + if (sneakPerc > 0.99 && (AIData.canSensePlayer || AIData.canSeePlayer || AIData.canShootPlayer)) { + if (!enemy.aware && AIData.aggressive && !KDHelpless(enemy)) { + KDAddThought(enemy.id, "Aware", 3, 3); + if (KDRandom() < actionDialogueChanceIntense) + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonRemindJailChase" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "Alert") + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), + 4, 5, false, true); + } + if (!enemy.aware) KDEnemyAddSound(enemy, enemy.Enemy.Sound?.alertAmount != undefined ? enemy.Enemy.Sound?.alertAmount : KDDefaultEnemyAlertSound, + undefined, enemy.Enemy.Sound?.alertSoundName ? TextGet("KDAmbSound_" + enemy.Enemy.Sound.alertSoundName) : undefined + ); + let wasAware = enemy.aware; + enemy.aware = true; + // Share aggro + if (!AIData.ignore + && player.player + && KDHostile(enemy) + && AIData.aggressive + && KDEnemyCanSignalOthers(enemy) + && !(enemy.silence > 0) && !enemy.Enemy.tags.minor && (!(enemy.silence > 0 || enemy.Enemy.tags.gagged) || enemy.Enemy.tags.alwaysAlert)) { + + if (!KDEntityHasFlag(enemy, "shoutforhelp")) { + KinkyDungeonMakeNoiseSignal(enemy, 1, wasAware); + KinkyDungeonSetEnemyFlag(enemy, "shoutforhelp", + Math.floor((10 - KDEnemyRank(enemy)) * (1 + KDRandom()))); + } + + if (!enemy.rage) { + let ent = KDNearbyEnemies(enemy.x, enemy.y, KinkyDungeonEnemyAlertRadius); + for (let e of ent) { + if (KDHostile(e) && KinkyDungeonAggressive(e) && !enemy.rage && e != enemy) { + if (player.player && KDPlayerLight < 1.5) { + if (!e.aware && !KDEnemyHasFlag(e, "dontChase")) { + KDAddThought(e.id, "Blind", 3, 3); + e.path = null; + let pp = KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, true); + if (pp) { + e.gx = pp.x; + e.gy = pp.y; + } else { + e.gx = player.x; + e.gy = player.y; + } + + } + } else { + if (!e.aware) KDAddThought(e.id, "Confused", 3, 3); + + if (!enemy.aware) KDEnemyAddSound(enemy, enemy.Enemy.Sound?.alertAmount != undefined ? enemy.Enemy.Sound?.alertAmount : KDDefaultEnemyAlertSound, + undefined, enemy.Enemy.Sound?.alertSoundName ? TextGet("KDAmbSound_" + enemy.Enemy.Sound.alertSoundName) : undefined + ); + + e.aware = true; + } + + } + } + } + } + } + } + + AIData.ignoreRanged = AIData.canShootPlayer && KinkyDungeonAllRestraint().some((r) => {return KDRestraint(r).ignoreSpells;}); + // Close the gap to leash + if ((AIData.ignoreRanged || (!enemy.Enemy.alwaysKite && AIData.harmless)) && AIData.leashing) AIData.followRange = 1.5; + if (enemy == KinkyDungeonJailGuard() || enemy == KinkyDungeonLeashingEnemy()) { + AIData.followRange = 1.5; + } + + AIData.kite = false; + AIData.kiteChance = enemy.Enemy.kiteChance ? enemy.Enemy.kiteChance : 0.75; + if (AIData.canSeePlayer && (!player.player || AIData.aggressive) && enemy.Enemy && enemy.Enemy.kite && !enemy.usingSpecial && (!player.player || KinkyDungeonHasWill(0.1)) && (enemy.attackPoints <= 0 || enemy.Enemy.attackWhileMoving) && AIData.playerDist <= enemy.Enemy.kite && (AIData.aggressive || !player.player)) { + if (!enemy.Enemy.dontKiteWhenDisabled || !(KDPlayerIsDisabled())) + if (!enemy.Enemy.noKiteWhenHarmless || !AIData.harmless) + if (AIData.kiteChance >= 1 || KDRandom() < AIData.kiteChance) + if (!AIData.ignoreRanged) + AIData.kite = true; + } + + if (!AIData.aggressive && player.player && (enemy.playWithPlayer || KDAllied(enemy))) { + if (enemy.playWithPlayer && AIData.domMe && KDIsBrat(enemy)) { + AIData.followRange = 4.9; + AIData.kite = true; + } else + AIData.followRange = 1.5; + } + //else, AIData.aggressive && + if (enemy.attackPoints && !enemy.Enemy.attackWhileMoving && AIData.followRange < ((enemy.usingSpecial ? enemy.Enemy.specialRange : undefined) || AIData.range) + && enemy.Enemy.attack?.includes("Melee")) { + AIData.followRange = Math.max(1.5, (enemy.usingSpecial ? enemy.Enemy.specialRange : undefined) || AIData.range || AIData.followRange); + } + + if ((AIType.resetguardposition(enemy, player, AIData)) && (!enemy.gxx || !enemy.gyy)) { + enemy.gxx = enemy.gx; + enemy.gyy = enemy.gy; + } + + if (KDEnemyHasFlag(enemy, "runAway")) { + AIData.followRange = 5.9; + if (AIData.playerDist > 1.5 || KDRandom() < 0.75) + AIData.kite = true; + } + + // Movement loop + + // If an enemy was trying to attack the player but the player got behind them somehow, they get stunned + let flanked = KDCheckVulnerableBackstab(enemy); + if (player.player && flanked && !enemy.stun && !enemy.Enemy.tags.nosurpriseflank && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + enemy.vulnerable = Math.max(1, enemy.vulnerable||0); + } + + // Whether or not the enemy should hold when nearby + // Summons are mainly the ones who should behave like this + AIData.holdStillWhenNear = !( + (enemy == KinkyDungeonLeashingEnemy() && !AIData.wantsToAttack) + || (KDEnemyHasFlag(enemy, "overrideMove")) + ) + && ( + AIData.aggressive + || (!enemy.Enemy.attackWhileMoving && enemy.warningTiles.length > 0) + || enemy.Enemy.Behavior?.holdStillWhenNear + || (player.player && enemy.Enemy.allied && !enemy.Enemy.Behavior?.behaveAsEnemy + && KDAllied(enemy) && !KDEnemyHasFlag(enemy, "NoFollow") + && !KDEnemyHasFlag(enemy, "StayHere")) + ); + + + if (!AIData.startedDialogue) { + if ( + !AIType.beforemove(enemy, player, AIData) + && ( + (enemy.Enemy.attackWhileMoving && enemy != KinkyDungeonLeashingEnemy()) + || AIData.ignore + || !( + KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.followRange, enemy.attackPoints < 1 || !(enemy.Enemy.projectileTargeting || enemy.Enemy.projectileAttack), false) + && enemy.aware + && ( + AIData.wantsToAttack + || AIData.holdStillWhenNear + ) + ) + || AIData.kite + ) + ) { + if (!enemy.gx) enemy.gx = enemy.x; + if (!enemy.gy) enemy.gy = enemy.y; + + AIData.idle = true; + AIData.patrolChange = false; + AIData.allyFollowPlayer = false; + AIData.dontFollow = false; + + if (AIType.follower(enemy, player, AIData)) { + if (KDAllied(enemy) && player.player) { + if (!KDEnemyHasFlag(enemy, "NoFollow") && !KDEnemyHasFlag(enemy, "StayHere")) { + AIData.allyFollowPlayer = true; + } else { + AIData.dontFollow = true; + if (enemy.gx == player.x && enemy.gy == player.y && !KDEnemyHasFlag(enemy, "StayHere")) { + //enemy.gx = undefined; + //enemy.gy = undefined; + } + } + } else { + if (KDEnemyHasFlag(enemy, "Defensive") && !KDEnemyHasFlag(enemy, "StayHere") && !KDEnemyHasFlag(enemy, "dontChase")) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + } + if (KDEnemyHasFlag(enemy, "StayHere") && (KDEnemyHasFlag(enemy, "Defensive") && !KinkyDungeonFlags.get("PlayerCombat"))) + AIData.dontFollow = true; + if (KDHostile(enemy)) { + KinkyDungeonSetEnemyFlag(enemy, "StayHere", 0); + KinkyDungeonSetEnemyFlag(enemy, "Defensive", 0); + } else if (!KDAllied(enemy)) { + KinkyDungeonSetEnemyFlag(enemy, "Defensive", 0); + } + } + } + + // First we will cancel the path if Gx or Gy has been updated + if (enemy.path?.length > 0) { + let lastPoint = enemy.path[enemy.path.length-1]; + if ((enemy.gx && lastPoint.x != enemy.gx) || (enemy.gy && lastPoint.y != enemy.gy)) { + enemy.path = null; + } + } + + + let rThresh = enemy.Enemy.RestraintFilter?.powerThresh || (KDDefaultRestraintThresh + (Math.max(0, enemy.Enemy.power - 1) || 0)); + + AIData.wantsToLeash = !KinkyDungeonFlags.get("PlayerDommed"); + AIData.focusOnLeash = (!KinkyDungeonFlags.has("PlayerCombat") && KDEnemyHasFlag(enemy, "focusLeash")) || ( + enemy == KinkyDungeonLeashingEnemy() + && !AIData.addLeash && ( + !AIData.addMoreRestraints + || !KinkyDungeonAggressive(enemy, KinkyDungeonPlayerEntity) + || !AIData.wantsToAttack + || !KinkyDungeonGetRestraint( + {tags: KDGetTags(enemy, enemy.usingSpecial)}, KDGetEffLevel() + (enemy.Enemy.RestraintFilter?.levelBonus || enemy.Enemy.power || 0) + (AIData.attack.includes("Suicide") ? 10 : 0), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + enemy.Enemy.bypass, + enemy.Enemy.useLock ? enemy.Enemy.useLock : "", + !(enemy.Enemy.ignoreStaminaForBinds || (enemy.usingSpecial && enemy.Enemy.specialIgnoreStam)) && !AIData.attack.includes("Suicide"), + !AIData.addMoreRestraints && !enemy.usingSpecial && AIData.addLeash, + !KinkyDungeonStatsChoice.has("TightRestraints"), + KDGetExtraTags(enemy, enemy.usingSpecial, true), + false, + { + maxPower: rThresh + 0.01, + looseLimit: true, + onlyUnlimited: true, + ignore: enemy.items, + }, enemy, undefined, true))); + + AIData.SlowLeash = !KinkyDungeonAggressive(enemy, player) && KDEntityHasFlag(player, "leashtug"); + AIData.moveTowardPlayer = + // We can move + !KDIsImmobile(enemy) + // We are willing to move + && !KDEnemyHasFlag(enemy, "dontChase") + // We are willing to move + && (!KDEnemyHasFlag(enemy, "Defensive") || !KDEnemyHasFlag(enemy, "StayHere")) + // We want to move + && AIType.chase(enemy, player, AIData) + // We are not ignoring the target + && !AIData.ignore + // We aren't prevented from following the target + && !AIData.dontFollow + // We are aware of the target OR we are allied and are following + && (enemy.aware || AIData.allyFollowPlayer) + // Player is within our max chase range + && (AIData.playerDist <= AIData.chaseRadius && AIData.canSeePlayerChase) + // We aren't already following a path or stationed at our current point + // TODO evaluate whether we should check gxx and gyy instead of gx and gy (station point vs goto point) + && ((enemy.gx != enemy.x || enemy.gy != enemy.y || enemy.path || enemy.fx || enemy.fy + || (KDAllied(enemy) && (!KDEnemyHasFlag(enemy, "Defensive") || KinkyDungeonFlags.get("PlayerCombat")))) ? true : false); + + // Also if the enemy is supposed to go to the player (goal x and y are same as players) and the enemy can see, it just does it + // Party members get a free pass too on sight + if (player && !AIData.ignore && ((KDEnemyReallyAware(enemy, player) && AIData.canSensePlayer) || KDIsInParty(enemy)) && enemy.gx == player.x && enemy.gy == player.y) { + AIData.moveTowardPlayer = true; + } + + // try 12 times to find a moveable tile, with some random variance + // First part is player chasing behavior + + if (// We aren't focusing on pulling + !AIData.focusOnLeash + // We want to move toward the target instead of our goal + && AIData.moveTowardPlayer) { + //enemy.aware = true; + + if (AIData.kite ? true : KDistChebyshev(enemy.x - player.x, enemy.y - player.y) > AIData.followRange) { + for (let T = 0; T < 12; T++) { + let dir = KDGetDir(enemy, player); + let splice = false; + if (T >= 8 || (enemy.path && !AIData.canSeePlayer) || (!AIData.canSeePlayer && !(enemy.Enemy.stopToCast && AIData.canShootPlayer))) { + // Allies are a little smarter and can always see the player usually + if (!enemy.path && (AIData.allied || KinkyDungeonAlert || KDEnemyReallyAware(enemy, player) || AIData.canSeePlayer)) { + if (!AIData.canSeePlayer) { + if (AIData.canShootPlayer) { + KDAddThought(enemy.id, "Shoot", 4, 2); + } else if (AIData.canSensePlayer) { + KDAddThought(enemy.id, "Sense", 2, 6); + } else { + KDAddThought(enemy.id, "Search", 2, 6); + } + } + enemy.path = KinkyDungeonFindPath(enemy.x, enemy.y, player.x, player.y, + KDEnemyHasFlag(enemy, "blocked") || KDEnemyHasFlag(enemy, "blockedenemy"), KDEnemyHasFlag(enemy, "blocked") && enemy != KinkyDungeonLeashingEnemy(), + AIData.ignoreLocks, AIData.MovableTiles, + undefined, undefined, undefined, enemy, + !enemy.CurrentAction && enemy != KinkyDungeonJailGuard() && !KDEnemyHasFlag(enemy, "longPath")); // Give up and pathfind + } + if (enemy.path) { + if (enemy.path && enemy.path.length > 0 && Math.max(Math.abs(enemy.path[0].x - enemy.x),Math.abs(enemy.path[0].y - enemy.y)) < 1.5) { + dir = {x: enemy.path[0].x - enemy.x, y: enemy.path[0].y - enemy.y, delta: KDistChebyshev(enemy.path[0].x - enemy.x, enemy.path[0].y - enemy.y)}; + if (!KinkyDungeonNoEnemyExceptSub(enemy.x + dir.x, enemy.y + dir.y, false, enemy) + || !AIData.MovableTiles.includes(KinkyDungeonMapGet(enemy.path[0].x, enemy.path[0].y))) { + if (AIData.MovableTiles.includes(KinkyDungeonMapGet(enemy.path[0].x, enemy.path[0].y))) { + KinkyDungeonSetEnemyFlag(enemy, "blockedenemy", 15); + } + KDBlockedByPlayer(enemy, dir); + KinkyDungeonSetEnemyFlag(enemy, "failpath", (enemy == KinkyDungeonJailGuard() || enemy == KinkyDungeonLeashingEnemy()) ? 2 : 20); + KinkyDungeonSetEnemyFlag(enemy, "blocked", 4); + + enemy.path = null; + } else { + splice = true; + } + } else { + enemy.path = null; + KinkyDungeonSetEnemyFlag(enemy, "failpath", (enemy == KinkyDungeonJailGuard() || enemy == KinkyDungeonLeashingEnemy()) ? 2 : 20); + if (!AIData.canSensePlayer) { + if (enemy.aware) KDAddThought(enemy.id, "Lose", 1, 4); + enemy.aware = false; + } + + //dir = KinkyDungeonGetDirectionRandom(0, 0); // Random... + } + } + } else if (T > 2 && T < 8) dir = KinkyDungeonGetDirectionRandom(dir.x * 10, dir.y * 10); // Fan out a bit + if (dir.delta > 1.5) { + enemy.path = null; + KinkyDungeonSetEnemyFlag(enemy, "failpath", 20); + } + else if (KinkyDungeonEnemyCanMove(enemy, dir, AIData.MovableTiles, AIData.AvoidTiles, AIData.ignoreLocks, T)) { + if (KinkyDungeonEnemyTryMove(enemy, dir, delta, enemy.x + dir.x, enemy.y + dir.y, true)) AIData.moved = true; + if (AIData.moved && splice && enemy.path) enemy.path.splice(0, 1); + AIData.idle = false; + + // If we moved we will pick a candidate for next turns attempt + if (AIData.moved) { + dir = enemy.movePoints >= 1 ? KDGetDir(enemy, player, KinkyDungeonGetDirection) : KDGetDir(enemy, player); + if (KinkyDungeonEnemyCanMove(enemy, dir, AIData.MovableTiles, AIData.AvoidTiles, AIData.ignoreLocks, T)) { + if (!KinkyDungeonEnemyTryMove(enemy, dir, 0, enemy.x + dir.x, enemy.y + dir.y, true)) { + // Use up spare move points + enemy.fx = enemy.x + dir.x; + enemy.fy = enemy.y + dir.y; + } + } + } else { + KDBlockedByPlayer(enemy, dir); + } + break; + } else { + KDBlockedByPlayer(enemy, dir); + enemy.fx = undefined; + enemy.fy = undefined; + } + } + } else { + enemy.fx = undefined; + enemy.fy = undefined; + } + + } else if ( + // We can move + !KDIsImmobile(enemy) + // We want to move + && AIType.move(enemy, player, AIData) + // We are not where we want to be + && (Math.abs(enemy.x - enemy.gx) > 0 || Math.abs(enemy.y - enemy.gy) > 0)) { + if (AIData.focusOnLeash && AIData.moveTowardPlayer && AIData.wantsToLeash) { + // Only break awareness if the AI cant chase player + if (player.player) { + if (!enemy.IntentLeashPoint) { + if ((AIData.aggressive)) { + KDAssignLeashPoint(enemy); + enemy.gx = AIData.nearestJail.x; + enemy.gy = AIData.nearestJail.y; + } + } else { + enemy.gx = enemy.IntentLeashPoint.x; + enemy.gy = enemy.IntentLeashPoint.y; + if (!KinkyDungeonFlags.get("tut_surr")) { + KinkyDungeonSetFlag("tut_surr", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Surr"), KDTutorialColor, 10); + } + } + } + + if (enemy.x == enemy.gx && enemy.y == enemy.gy) { + enemy.gx = player.x; + enemy.gy = player.y; + } + } else if (!AIData.canSensePlayer) { + if (KDEnemyReallyAware(enemy, player) && KinkyDungeonAggressive(enemy, player)) { + enemy.path = null; + } + enemy.aware = false; + } + for (let T = 0; T < 8; T++) { + let dir = KDGetDir(enemy, {x: enemy.gx, y: enemy.gy}, KinkyDungeonGetDirection); + let splice = false; + let pathThresh = (enemy == KinkyDungeonJailGuard() || enemy == KinkyDungeonLeashingEnemy()) ? 3 : 8; + if (T > 2 && T < pathThresh) dir = KinkyDungeonGetDirectionRandom(dir.x * 10, dir.y * 10); // Fan out a bit + if (T >= pathThresh || enemy.path || !KinkyDungeonCheckPath(enemy.x, enemy.y, enemy.gx, enemy.gy) || KDEnemyHasFlag(enemy, "forcepath")) { + if (!enemy.path && !KDEnemyHasFlag(enemy, "genpath")) { + enemy.path = KinkyDungeonFindPath( + enemy.x, enemy.y, enemy.gx, enemy.gy, + KDEnemyHasFlag(enemy, "blocked") || KDEnemyHasFlag(enemy, "blockedenemy") || enemy == KinkyDungeonLeashingEnemy(), + KDEnemyHasFlag(enemy, "blocked") && enemy != KinkyDungeonLeashingEnemy(), + AIData.ignoreLocks, AIData.MovableTiles, + undefined, undefined, undefined, enemy, enemy != KinkyDungeonJailGuard() && enemy != KinkyDungeonLeashingEnemy() && !KDEnemyHasFlag(enemy, "longPath")); // Give up and pathfind + KinkyDungeonSetEnemyFlag(enemy, "genpath", (enemy == KinkyDungeonJailGuard() || enemy == KinkyDungeonLeashingEnemy()) ? 1 : (KinkyDungeonTilesGet(enemy.x + ',' + enemy.y)?.OL ? 2 + Math.floor(KDRandom() * 4) : 10 + Math.floor(KDRandom() * 30))); + } + if (enemy.path) { + if (enemy.path && enemy.path.length > 0 && Math.max(Math.abs(enemy.path[0].x - enemy.x),Math.abs(enemy.path[0].y - enemy.y)) < 1.5) { + dir = {x: enemy.path[0].x - enemy.x, y: enemy.path[0].y - enemy.y, delta: KDistChebyshev(enemy.path[0].x - enemy.x, enemy.path[0].y - enemy.y)}; + if (!KinkyDungeonNoEnemyExceptSub(enemy.x + dir.x, enemy.y + dir.y, false, enemy) + || !AIData.MovableTiles.includes(KinkyDungeonMapGet(enemy.path[0].x, enemy.path[0].y))) { + if (AIData.MovableTiles.includes(KinkyDungeonMapGet(enemy.path[0].x, enemy.path[0].y))) { + KinkyDungeonSetEnemyFlag(enemy, "blockedenemy", 15); + } + KDBlockedByPlayer(enemy, dir); + KinkyDungeonSetEnemyFlag(enemy, "failpath", (enemy == KinkyDungeonJailGuard() || enemy == KinkyDungeonLeashingEnemy()) ? 2 : 20); + KinkyDungeonSetEnemyFlag(enemy, "blocked", 4); + + enemy.path = null; + } else { + splice = true; + } + } else { + KDBlockedByPlayer(enemy, dir); + enemy.path = null; + KinkyDungeonSetEnemyFlag(enemy, "failpath", (enemy == KinkyDungeonJailGuard() || enemy == KinkyDungeonLeashingEnemy()) ? 2 : 20); + } + } else { + KinkyDungeonSetEnemyFlag(enemy, "longPath", 24); + } + + } + if (dir.delta > 1.5) {enemy.path = null;} + else if ( + (T > 7 || AIData.moveTowardPlayer || ( + enemy.x + dir.x == enemy.gx + && enemy.y + dir.y == enemy.gy + ) || !KDPointWanderable(enemy.gx, enemy.gy) || !KDPointWanderable(enemy.x, enemy.y) || KDPointWanderable(enemy.x + dir.x, enemy.y + dir.y) || KDEnemyHasFlag(enemy, "forcepath")) + && KinkyDungeonEnemyCanMove(enemy, dir, AIData.MovableTiles, AIData.AvoidTiles, AIData.ignoreLocks, T)) { + if (AIData.SlowLeash) { + // Don't tug too hard + AIData.idle = false;// If we moved we will pick a candidate for next turns attempt + enemy.fx = enemy.x; + enemy.fy = enemy.y; + } else { + if (KinkyDungeonEnemyTryMove(enemy, dir, delta, enemy.x + dir.x, enemy.y + dir.y, enemy.action && KDEnemyAction[enemy.action]?.sprint)) AIData.moved = true; + if (AIData.moved && splice && enemy.path) enemy.path.splice(0, 1); + AIData.idle = false;// If we moved we will pick a candidate for next turns attempt + if (AIData.moved) { + dir = enemy.movePoints >= 1 ? KDGetDir(enemy, {x: enemy.gx, y: enemy.gy}, KinkyDungeonGetDirection) + : KDGetDir(enemy, {x: enemy.gx, y: enemy.gy}); + if (KinkyDungeonEnemyCanMove(enemy, dir, + AIData.MovableTiles, AIData.AvoidTiles, + AIData.ignoreLocks, T)) { + if (!KinkyDungeonEnemyTryMove(enemy, dir, 0, enemy.x + dir.x, enemy.y + dir.y, enemy.action && KDEnemyAction[enemy.action]?.sprint)) { + // Use up spare move points + enemy.fx = enemy.x + dir.x; + enemy.fy = enemy.y + dir.y; + } + } + } + } + break; + } else { + if (!KDPointWanderable(enemy.x + dir.x, enemy.y + dir.y)) { + KinkyDungeonSetEnemyFlag(enemy, "forcepath", 3); + } + + KDBlockedByPlayer(enemy, dir); + enemy.fx = undefined; + enemy.fy = undefined; + if (KinkyDungeonPlayerEntity.x == enemy.x + dir.x && KinkyDungeonPlayerEntity.y == enemy.y + dir.y) enemy.path = null; + } + } + } else if (!AIData.moveTowardPlayer && (Math.abs(enemy.x - enemy.gx) < 2 || Math.abs(enemy.y - enemy.gy) < 2)) AIData.patrolChange = true; + + if (enemy.leash?.entity && KDAcceptsLeash(enemy, enemy.leash)) { + let leasher = KDLookupID(enemy.leash.entity); + if (leasher && !leasher.idle && (leasher.gx != leasher.x || leasher.gy != leasher.y)) { + enemy.gx = leasher.gx; + enemy.gy = leasher.gy; + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 1); + } + + } + + /** QoL for party members to follow you */ + let allyHoming = (AIData.allyFollowPlayer && KDIsInParty(enemy) && enemy.idle && !enemy.aware); + + if ((allyHoming || !KDEnemyHasFlag(enemy, "Defensive")) + && !KDEnemyHasFlag(enemy, "StayHere") + && !KDEnemyHasFlag(enemy, "overrideMove") + && !KDIsImmobile(enemy) + && !AIType.aftermove(enemy, player, AIData) + && (allyHoming + || (!AIData.moveTowardPlayer && !KDEnemyHasFlag(enemy, "dontChase")))) { + + if (AIType.resetguardposition(enemy, player, AIData) + && !AIData.allyFollowPlayer + && Math.max(Math.abs(enemy.x - enemy.gx), Math.abs(enemy.y - enemy.gy)) < 1.5 && enemy.gxx && enemy.gyy) { + enemy.gx = enemy.gxx; + enemy.gy = enemy.gyy; + } + + if (enemy.goToDespawn && !KDEnemyHasFlag(enemy, "overrideMove") + && enemy.despawnX && enemy.despawnY) { + enemy.gx = enemy.despawnX; + enemy.gy = enemy.despawnY; + } else if (allyHoming) { + // TODO add mechanism for allies finding where you are + enemy.gx = KDPlayer().x; + enemy.gy = KDPlayer().y; + } else { + let wanderfar = AIType.wander_far(enemy, player, AIData) || KDEnemyHasFlag(enemy, "forceWFar"); + let wandernear = AIType.wander_near(enemy, player, AIData); + if ((wanderfar || wandernear) && !AIData.allyFollowPlayer && (!enemy.Enemy.allied && !KDEnemyHasFlag(enemy, "StayHere")) && !KDEnemyHasFlag(enemy, "StayHere") && enemy.movePoints < 1 && (!enemy.aware || !AIData.aggressive || enemy.ignore)) { + if ((Math.max(Math.abs(enemy.x - enemy.gx), Math.abs(enemy.y - enemy.gy)) < 2.5 || (KDRandom() < 0.02 && KDEnemyHasFlag(enemy, "failpath"))) || (!(enemy.vp > 0.05) && (!enemy.path || KDRandom() < 0.1))) { + AIData.master = KinkyDungeonFindMaster(enemy).master; + if (!KDEnemyHasFlag(enemy, "wander")) { + if (!AIData.master && wanderfar) { + if (!AIType.wanderfar_func || !AIType.wanderfar_func(enemy, player, AIData)) { + if (enemy.partyLeader && KDWanderFarEnemyParty(enemy)) { + // Nothing! + } else { + // long distance hunt + let newPoint = KinkyDungeonGetRandomEnemyPointCriteria((X, Y) => { + return KDistChebyshev(enemy.x - X, enemy.y - Y) < 24; + }, false, + enemy.tracking && KinkyDungeonHuntDownPlayer && KDGameData.PrisonerState != "parole" && KDGameData.PrisonerState != "jail"); + if (newPoint) { + // Gravitate toward interesting stuff + let np = + (['guard', 'ambush', 'looseguard'].includes(KDGetAI(enemy))) + ? KDGetNearestGuardLabel(newPoint.x, newPoint.y, enemy, undefined, false, "Patrol", 8) + : KDGetNearestInterestingLabel(newPoint.x, newPoint.y, enemy, undefined, false, "Patrol", 8); + if (np) { + newPoint.x = np.x; + newPoint.y = np.y; + np.assigned = enemy.id; + } + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + } + } + + } + KinkyDungeonSetEnemyFlag(enemy, "wander", AIType.wanderDelay_long(enemy) || 50); + } else if (wandernear) { + KinkyDungeonSetEnemyFlag(enemy, "wander", AIType.wanderDelay_short(enemy) || 20); + if (!AIType.wandernear_func || !AIType.wandernear_func(enemy, player, AIData)) { + if (KinkyDungeonAlert && AIData.playerDist < Math.max(4, AIData.visionRadius)) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + } else { + // Short distance + let ex = enemy.x; + let ey = enemy.y; + let cohesion = enemy.Enemy.cohesion ? enemy.Enemy.cohesion : 0.5; + let masterCloseness = enemy.Enemy.cohesion ? enemy.Enemy.cohesion : 0.7; + if (AIData.master) KinkyDungeonSetEnemyFlag(enemy, "led", 100); + if (AIData.master && KDRandom() < masterCloseness) { + ex = AIData.master.x; + ey = AIData.master.y; + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + } else if (KDRandom() < cohesion) { + let minDist = enemy.Enemy.cohesionRange ? enemy.Enemy.cohesionRange : AIData.visionRadius; + let ent = KDNearbyEnemies(enemy.x, enemy.y, minDist); + for (let e of ent) { + if (e == enemy) continue; + if (['guard', 'ambush', 'looseguard'].includes(KDGetAI(enemy))) continue; + if (['guard', 'ambush', 'looseguard'].includes(KDGetAI(e))) continue; + if (!( + (enemy.Enemy.clusterWith && !e.Enemy.tags[enemy.Enemy.clusterWith]) + || e.Enemy.clusterWith && !enemy.Enemy.tags[enemy.Enemy.clusterWith] + )) continue; + if (KDGetFaction(e) != KDGetFaction(enemy)) continue; + if (KinkyDungeonTilesGet(e.x + "," + e.y) && KinkyDungeonTilesGet(e.x + "," + e.y).OL) continue; + let dist = KDistEuclidean(e.x - enemy.x, e.y - enemy.y); + if (dist < minDist) { + minDist = dist; + let ePoint = KinkyDungeonGetNearbyPoint(ex, ey, false); + if (ePoint) { + ex = ePoint.x; + ey = ePoint.y; + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + } + } + } + } + let newPoint = KinkyDungeonGetNearbyPoint(ex, ey, false); + if (newPoint && (KDGetFaction(enemy) != "Player" || !KinkyDungeonPointInCell(newPoint.x, newPoint.y))) { + // Gravitate toward interesting stuff + let np = + (['guard', 'ambush', 'looseguard'].includes(KDGetAI(enemy))) + ? KDGetNearestGuardLabel(newPoint.x, newPoint.y, enemy, enemy.id, false, "Patrol", 8) + : KDGetNearestInterestingLabel(newPoint.x, newPoint.y, enemy, enemy.id, false, "Patrol", 8); + if (np) { + newPoint.x = np.x; + newPoint.y = np.y; + np.assigned = enemy.id; + } + if (!AIType.strictwander || KinkyDungeonCheckPath(enemy.x, enemy.y, newPoint.x, newPoint.y)) { + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + } + } + } + } + } + } + } + } + } + } + } + } + + + if (enemy.usingSpecial && !enemy.specialCD) enemy.specialCD = 0; + + let minRange = enemy.Enemy.attackMinRange || 0; + if (enemy.usingSpecial && enemy.Enemy.specialMinRange != undefined) minRange = enemy.Enemy.specialMinRange; + + let KDOperateTease = () => { + let teaseAttack = KDGetTeaseAttack(enemy, player, AIData); + if (teaseAttack) { + let dodged = false; + let blocked = false; + if (teaseAttack.dodgeable && !KDEnemyHasFlag(enemy, "allyPlay")) { + let BaseEvasion = KinkyDungeonMultiplicativeStat(0.25 + AIData.accuracy - 1); + let playerEvasion = 1.01 * ((player.player) ? + KinkyDungeonPlayerEvasion(true) + : KinkyDungeonMultiplicativeStat(((player.Enemy && player.Enemy.evasion) ? player.Enemy.evasion : 0)) + * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(player.buffs, "Evasion"))); + if (KDRandom() < BaseEvasion-playerEvasion) dodged = true; + } + if (teaseAttack.blockable && !dodged && !KDEnemyHasFlag(enemy, "allyPlay")) { + let BaseBlock = KinkyDungeonMultiplicativeStat(0.0 + AIData.accuracy - 1); + let playerBlock = 1.01 * ((player.player) ? + KinkyDungeonPlayerBlock(true) + : KinkyDungeonMultiplicativeStat(((player.Enemy && player.Enemy.block) ? player.Enemy.block : 0)) + * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(player.buffs, "Block"))); + if (KDRandom() < BaseBlock-playerBlock) blocked = true; + } + + teaseAttack.apply(enemy, player, AIData, blocked, dodged, KDGetTeaseDamageMod(enemy)); + } + }; + + // Attack loop + AIData.playerDist = Math.sqrt((enemy.x - player.x)*(enemy.x - player.x) + (enemy.y - player.y)*(enemy.y - player.y)); + AIData.canAttack = !(enemy.disarm > 0) + && AIData.wantsToAttack + && (!player?.player || !enemy.Enemy.followLeashedOnly || KDPlayerDeservesPunishment(enemy, player) || KDGameData.KinkyDungeonLeashedPlayer < 1 || KinkyDungeonLeashingEnemy()?.id == enemy.id || KinkyDungeonFlags.get("overrideleashprotection")) + && (enemy.warningTiles.length > 0 || (enemy.aware && (!player.player || enemy.vp > 0.25) && KDCanDetect(enemy, player)) || (!KDAllied(enemy) && !AIData.hostile)) + && !AIData.ignore + && (!minRange || (AIData.playerDist > minRange)) + && (AIData.attack.includes("Melee") || (enemy.Enemy.tags && AIData.leashing && !KinkyDungeonHasWill(0.1))) + && (!AIData.ignoreRanged || AIData.playerDist < 1.5) + && AIType.attack(enemy, player, AIData) + && KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.range, !enemy.Enemy.projectileAttack, !enemy.Enemy.projectileAttack); + let first = true; + AIData.canTease = !AIData.canAttack + && !(enemy.disarm > 0) + && AIData.wantsToTease + && (!player?.player || !enemy.Enemy.followLeashedOnly || KDPlayerDeservesPunishment(enemy, player) || KDGameData.KinkyDungeonLeashedPlayer < 1 || KinkyDungeonLeashingEnemy()?.id == enemy.id || KinkyDungeonFlags.get("overrideleashprotection")) + && (enemy.warningTiles.length > 0 || (enemy.aware && (!player.player || enemy.vp > 0.25) && KDCanDetect(enemy, player)) || (!KDAllied(enemy) && !AIData.hostile)) + && !AIData.ignore + && (!minRange || (AIData.playerDist > minRange)) + && (AIData.attack.includes("Melee") || (enemy.Enemy.tags && AIData.leashing && !KinkyDungeonHasWill(0.1))) + && (!AIData.ignoreRanged || AIData.playerDist < 1.5) + && AIType.attack(enemy, player, AIData) + && KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.range, !enemy.Enemy.projectileAttack, !enemy.Enemy.projectileAttack); + + if (player.player && !AIData.canAttack && AIData.canTease && enemy.playWithPlayer && !KinkyDungeonAggressive(enemy)) { + KDOperateTease(); + } + while (AIData.canAttack && (first || enemy.attackBonus > 0)) {//Player is adjacent + AIData.idle = false; + enemy.revealed = true; + if (!first) { + updateSpecial(); + } + + let dir = KinkyDungeonGetDirection(player.x - enemy.x, player.y - enemy.y); + + if (enemy.usingSpecial && !specialConditionSpecial) { + enemy.usingSpecial = false; + if (KDSpecialConditions[enemy.Enemy.specialCondition].resetCD) enemy.specialCD = enemy.Enemy.specialCD; + } + + if (!AIData.moved || enemy.Enemy.attackWhileMoving) { + let moveMult = KDBoundEffects(enemy) * 0.5; + let attackMult = KinkyDungeonGetBuffedStat(enemy.buffs, "AttackSlow"); + let attackTiles = enemy.warningTiles ? enemy.warningTiles : [dir]; + let ap = (KDGameData.MovePoints < 0 && !KinkyDungeonHasWill(0.1) && KinkyDungeonLeashingEnemy()?.id == enemy.id) ? enemy.Enemy.movePoints+moveMult+1 : enemy.Enemy.attackPoints + attackMult; + if (!KinkyDungeonEnemyTryAttack(enemy, player, attackTiles, first ? delta : 0, enemy.x + dir.x, enemy.y + dir.y, (enemy.usingSpecial && enemy.Enemy.specialAttackPoints) ? enemy.Enemy.specialAttackPoints : ap, undefined, undefined, enemy.usingSpecial, AIData.refreshWarningTiles, AIData.attack, AIData.MovableTiles)) { + if (enemy.warningTiles.length == 0 || (AIData.refreshWarningTiles && enemy.usingSpecial)) { + let minrange = enemy.Enemy.tilesMinRange ? enemy.Enemy.tilesMinRange : 1; + if (enemy.usingSpecial && enemy.Enemy.tilesMinRangeSpecial) minrange = enemy.Enemy.tilesMinRangeSpecial; + if ((!enemy.usingSpecial && enemy.attackPoints > 0) || enemy.specialCD < 1) { + enemy.fx = player.x; + enemy.fy = player.y; + enemy.warningTiles = KinkyDungeonGetWarningTiles(player.x - enemy.x, player.y - enemy.y, AIData.range, AIData.width, minrange, enemy); + let playerIn = false; + for (let tile of enemy.warningTiles) { + if (KinkyDungeonPlayerEntity.x == enemy.x + tile.x && KinkyDungeonPlayerEntity.y == enemy.y + tile.y) {playerIn = true; break;} + } + if (!playerIn) { + enemy.fx = player.x; + enemy.fy = player.y; + } + } + if (AIData.refreshWarningTiles && enemy.usingSpecial) enemy.attackPoints = Math.min(enemy.attackPoints, delta); + } else { + let playerIn = false; + for (let tile of enemy.warningTiles) { + if (player.x == enemy.x + tile.x && player.y == enemy.y + tile.y) {playerIn = true; break;} + } + if (!playerIn) { + if (enemy.Enemy.specialRange && enemy.usingSpecial && enemy.Enemy.specialCDonAttack) { + enemy.specialCD = enemy.Enemy.specialCD; + if (enemy.Enemy.stunOnSpecialCD) enemy.stun = enemy.Enemy.stunOnSpecialCD; + if (AIData.attack.includes("Dash") && !enemy.Enemy.Dash?.noDashOnSidestep) { + KDDash(enemy, player, AIData.MovableTiles); + } + } + if (enemy.Enemy.specialWidth && enemy.usingSpecial && enemy.Enemy.specialCDonAttack) { + enemy.specialCD = enemy.Enemy.specialCD; + if (enemy.Enemy.stunOnSpecialCD) enemy.stun = enemy.Enemy.stunOnSpecialCD; + if (AIData.attack.includes("Dash") && !enemy.Enemy.Dash?.noDashOnSidestep) { + KDDash(enemy, player, AIData.MovableTiles); + } + } + } + } + + if (first && AIData.attack.includes("Bonus") && !enemy.movePoints) { + if (!enemy.attackBonus) enemy.attackBonus = 0; + enemy.attackBonus += enemy.Enemy.attackBonus || 1; // bonus means they can attack again + } + + // Enemies can take advantage of you~ + KDOperateTease(); + } else { // Attack lands! + enemy.revealed = true; + let hit = ((enemy.usingSpecial && enemy.Enemy.specialAttackPoints) ? enemy.Enemy.specialAttackPoints : ap) <= 1; + for (let tile of enemy.warningTiles) { + if (enemy.x + tile.x == player.x && enemy.y + tile.y == player.y) { + hit = true; + break; + } + } + + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", enemy.Enemy?.attackPoints || 2); + + KDEnemyAddSound(enemy, enemy.Enemy.Sound?.attackAmount != undefined ? enemy.Enemy.Sound?.attackAmount : KDDefaultEnemyAttackSound); + + let playerEvasion = 1.01 * (player.player) ? KinkyDungeonPlayerEvasion(true) + : KinkyDungeonMultiplicativeStat(((player.Enemy && player.Enemy.evasion) ? player.Enemy.evasion : 0)) * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(player.buffs, "Evasion")); + + let playerBlock = 1.01 * (player.player) ? KinkyDungeonPlayerBlock(true) + : KinkyDungeonMultiplicativeStat(((player.Enemy && player.Enemy.block) ? player.Enemy.block : 0)) * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(player.buffs, "Block")); + + if (hit) { + if (player.player) { + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "incomingHit", 1); + } else + KinkyDungeonTickBuffTag(player, "incomingHit", 1); + } + let eventable = KDEventableAttackTypes.some((type) => {return AIData.attack.includes(type);}); + let dash = AIData.attack.includes("Dash"); + + let preDataPreBlock = { + playerEvasion: playerEvasion, + playerBlock: playerBlock, + eventable: eventable || (dash && enemy.Enemy.Dash?.EventOnDashMiss) || (dash && enemy.Enemy.Dash?.EventOnDashMiss), + attack: AIData.attack, + enemy: enemy, + damagetype: AIData.damage, + attacker: enemy, + target: player, + hit: hit, + accuracy: AIData.accuracy, + EvasionRoll: KDRandom(), + BlockRoll: KDRandom(), + BaseEvasion: 1, + BaseBlock: 1, + }; + KinkyDungeonSendEvent("beforeAttackCalculation", preDataPreBlock); + KinkyDungeonSendEvent("doAttackCalculation", preDataPreBlock); + + preDataPreBlock.BaseEvasion *= KinkyDungeonMultiplicativeStat(0.0 + preDataPreBlock.accuracy - 1); + preDataPreBlock.BaseBlock *= KinkyDungeonMultiplicativeStat(0.0 + preDataPreBlock.accuracy - 1); + + let missed = (eventable || (dash && enemy.Enemy.Dash?.EventOnDashMiss)) && preDataPreBlock.EvasionRoll < preDataPreBlock.BaseEvasion - preDataPreBlock.playerEvasion; + let blockedAtk = (eventable || (dash && enemy.Enemy.Dash?.EventOnDashBlock)) && preDataPreBlock.BlockRoll < preDataPreBlock.BaseBlock - preDataPreBlock.playerBlock; + let preData = { + playerEvasion: preDataPreBlock.playerEvasion, + playerBlock: preDataPreBlock.playerBlock, + BaseEvasion: preDataPreBlock.BaseEvasion, + BaseBlock: preDataPreBlock.BaseBlock, + EvasionRoll: preDataPreBlock.EvasionRoll, + BlockRoll: preDataPreBlock.BlockRoll, + accuracy: preDataPreBlock.accuracy, + eventable: eventable || (dash && enemy.Enemy.Dash?.EventOnDashMiss) || (dash && enemy.Enemy.Dash?.EventOnDashMiss), + attack: AIData.attack, + enemy: enemy, + damagetype: AIData.damage, + attacker: enemy, + target: player, + missed: missed, + blocked: blockedAtk, + hit: hit, + preBlockData: preDataPreBlock, + }; + KinkyDungeonSendEvent("beforeAttack", preData); + + if (!hit || missed) { + let sfx = (enemy.Enemy && enemy.Enemy.misssfx) ? enemy.Enemy.misssfx : "Miss"; + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + sfx + ".ogg", enemy); + if (player.player) { + KinkyDungeonSendEvent("missPlayer", {enemy: enemy, player: player}); + KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonAttackMiss" + (KDGameData.Crouch ? "Crouch" : "")).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "#44aa44", 1, + false, false, undefined, "Combat"); + + if (KDRandom() < actionDialogueChance) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "Miss").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 4); + } else { + KinkyDungeonSendEvent("missEnemy", {enemy: enemy, player: player}); + } + KDAddThought(enemy.id, "Annoyed", 4, 1); + + enemy.vulnerable = Math.max(enemy.vulnerable, 1); + if (!KinkyDungeonFlags.get("tut_dodge")) { + KinkyDungeonSetFlag("tut_dodge", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Dodge"), KDTutorialColor, 10); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Dodge2"), KDTutorialColor, 10); + } + if (dash && !enemy.Enemy.Dash?.noDashOnMiss) { + KDDash(enemy, player, AIData.MovableTiles); + } + hit = false; + } + if (hit && blockedAtk) { + let sfx = (enemy.Enemy && enemy.Enemy.blocksfx) ? enemy.Enemy.blocksfx : "WoodBlock"; + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + sfx + ".ogg", enemy); + if (player.player) { + KinkyDungeonSendEvent("blockPlayer", {enemy: enemy, player: player, preData: preData}); + KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonAttackBlock").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "#44aa44", 1, + false, false, undefined, "Combat"); + + if (KDRandom() < actionDialogueChance) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "Block").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 4); + } else { + KinkyDungeonSendEvent("blockEnemy", {enemy: enemy, player: player, preData: preData}); + } + KDAddThought(enemy.id, "Annoyed", 4, 1); + + if (AIData.attack.includes("Dash") && !enemy.Enemy.Dash?.noDashOnBlock) { + KDDash(enemy, player, AIData.MovableTiles); + } + if (first && AIData.attack.includes("Bonus") && !enemy.movePoints) { + if (!enemy.attackBonus) enemy.attackBonus = 0; + enemy.attackBonus += enemy.Enemy.attackBonus || 1; // bonus means they can attack again + } + hit = false; + } + if (hit) { + if (KDRandom() < actionDialogueChanceIntense && !enemy.playWithPlayer) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "HitPlayer").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 3, 5); + let replace = []; + let restraintAdd: {r: restraint, v: ApplyVariant, iv: string}[] = []; + let restraintFromInventory = []; + let willpowerDamage = 0; + let staminaDamage = 0; + let msgColor = "#f0dc41"; + let Locked = false; + let Effected = false; + let Stun = false; + let Blind = false; + let priorityBonus = 0; + let addedRestraint = false; + + let happened = 0; + let bound = 0; + + if (player.player && !KDEnemyHasFlag(enemy, "noleash")) { + if (player.player + && AIData.playerDist <= AIData.range + && ((AIData.aggressive || AIData.attack.includes("Pull") && !enemy.playWithPlayer) || enemy.IntentLeashPoint) + && ( // If we are already leashing or pulling or we are a leashing type that is able to leash + ((!enemy.Enemy.noLeashUnlessExhausted || !KinkyDungeonHasWill(0.1)) + && enemy.Enemy.tags + && AIData.leashing)//&& KDGetFaction(enemy) != "Ambush") + || AIData.attack.includes("Pull") + || enemy.IntentLeashPoint + ) + // Only attempt to leash if the player is not already being leashed + && (KDGameData.KinkyDungeonLeashedPlayer < 1 || KinkyDungeonLeashingEnemy() == enemy) + && (!KinkyDungeonPlayerTags.get("Furniture") || enemy.IntentLeashPoint || KDSelfishLeash(enemy)) + ) { + AIData.intentToLeash = true; + + let wearingLeash = false; + if (!wearingLeash && !AIData.attack.includes("Pull")) + wearingLeash = KinkyDungeonIsWearingLeash(); + AIData.leashed = wearingLeash || AIData.attack.includes("Pull"); + + if (AIData.leashed) { + + let leashToExit = AIData.leashing && !KinkyDungeonHasWill(0.1) + && AIData.playerDist < 1.5; + if (!enemy.IntentLeashPoint) { + KDAssignLeashPoint(enemy); + } + + let leashPos = AIData.aggressive ? (AIData.nearestJail) : {x: enemy.x, y: enemy.y, type: "", radius: 1}; + let findMaster = undefined; + if (enemy.CurrentAction == 'jailLeashTour') { + // TODO replace with intent action + leashPos = {x: enemy.NextJailLeashTourWaypointX, y: enemy.NextJailLeashTourWaypointY, type: "", radius: 1}; + } else + if (enemy.IntentLeashPoint) leashPos = enemy.IntentLeashPoint; + if (!leashToExit && enemy.Enemy.pullTowardSelf && (Math.abs(player.x - enemy.x) > 1.5 || Math.abs(player.y - enemy.y) > 1.5)) { + findMaster = enemy; + if (findMaster) leashPos = {x: findMaster.x, y: findMaster.y, type: "", radius: 1}; + } else { + if (AIData.attack.includes("Pull") && (enemy.master || enemy.Enemy.master)) { + /*let masterDist = 1000; + for (let e of KDMapData.Entities) { + let dist = Math.sqrt((e.x - enemy.x) * (e.x - enemy.x) + (e.y - enemy.y)*(e.y - enemy.y)); + if ((!enemy.Enemy.master.maxDist || dist < enemy.Enemy.master.maxDist) + && dist < masterDist + && (!enemy.Enemy.master.loose || KinkyDungeonCheckLOS(enemy, e, dist, 100, false))) { + masterDist = Math.sqrt((e.x - enemy.x) * (e.x - enemy.x) + (e.y - enemy.y)*(e.y - enemy.y)); + findMaster = e; + } + }*/ + let fm = KinkyDungeonFindMaster(enemy); + findMaster = fm.master; + if (findMaster) leashPos = {x: findMaster.x, y: findMaster.y, type: "", radius: 1}; + } + } + + + if (AIData.playerDist < 1.5 || (AIData.attack.includes("Pull")) || !KinkyDungeonGetRestraintItem("ItemDevices")) + AIData.leashPos = leashPos; + } + } + + if (AIData.attack.includes("Lock") && KinkyDungeonPlayerGetLockableRestraints().length > 0) { + let Lockable = KinkyDungeonPlayerGetLockableRestraints(); + let Lstart = 0; + let Lmax = Lockable.length-1; + if (!enemy.Enemy.attack.includes("LockAll")) { + Lstart = Math.floor(Lmax*KDRandom()); // Lock one at random + } + for (let L = Lstart; L <= Lmax; L++) { + let l = enemy.Enemy.attackLock ? KDProcessLock(enemy.Enemy.attackLock) : KinkyDungeonGenerateLock(true, KDGetEffLevel() + enemy.Enemy.power || 0, undefined, "Enemy", {enemy: enemy}); + KinkyDungeonLock(Lockable[L], l); // Lock it! + priorityBonus += KDRestraint(Lockable[L]).power; + } + Locked = true; + happened += 1; + if (enemy.usingSpecial && Locked && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Lock")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + if (KDRandom() < actionDialogueChanceIntense && !enemy.playWithPlayer) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "Lock").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 4); + + } else if (AIData.attack.includes("Bind") + && (((enemy.Enemy.smartBind && !KinkyDungeonFlags.get("PlayerCombat")) + || (!enemy.usingSpecial && !enemy.Enemy.bindOnDisable) || (enemy.usingSpecial && !enemy.Enemy.bindOnDisableSpecial)) || !KinkyDungeonHasWill(0.01) || !KinkyDungeonHasStamina(2.5) + || !KinkyDungeonCanStand() || KDForcedToGround())) { + + if (AIData.addMoreRestraints || AIData.addLeash || enemy.usingSpecial) { + if (!AIData.intentToLeash && !KinkyDungeonFlags.get("Released") && enemy.Enemy.bound + && KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y) && KDGameData.KinkyDungeonLeashedPlayer < 1 + && KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture + && !KinkyDungeonPlayerTags.has("Furniture") + && KDFurniture[KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture]) { + let furn = KDFurniture[KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture]; + if (furn) { + let rest = KDGetRestraintWithVariants( + {tags: [furn.restraintTag]}, KDGetEffLevel() + (enemy.Enemy.RestraintFilter?.levelBonus || enemy.Enemy.power || 0), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, + "", + !KDPlayerIsStunned(), + false, + false); + replace.push({keyword:"RestraintAdded", value: KDGetRestraintName(rest.r, rest.v)}); + restraintAdd.push({r: rest.r, v: rest.v, iv: rest.iv}); + addedRestraint = true; + } + } else { + let numTimes = 1; + if (enemy.Enemy.multiBind) numTimes = enemy.Enemy.multiBind; + for (let times = 0; times < numTimes; times++) { + // Note that higher power enemies get a bonus to the floor restraints appear on + let rThresh = enemy.Enemy.RestraintFilter?.powerThresh || (KDDefaultRestraintThresh + (Math.max(0, enemy.Enemy.power - 1) || 0)); + let rest = KDGetRestraintWithVariants( + {tags: KDGetTags(enemy, enemy.usingSpecial)}, KDGetEffLevel() + (enemy.Enemy.RestraintFilter?.levelBonus || enemy.Enemy.power || 0), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + enemy.Enemy.bypass, + enemy.Enemy.useLock ? enemy.Enemy.useLock : "", + !(KDPlayerIsStunned() || enemy.Enemy.ignoreStaminaForBinds || (enemy.usingSpecial && enemy.Enemy.specialIgnoreStam)) && !AIData.attack.includes("Suicide"), + !AIData.addMoreRestraints && !enemy.usingSpecial && AIData.addLeash, + !KinkyDungeonStatsChoice.has("TightRestraints"), + KDGetExtraTags(enemy, enemy.usingSpecial, true), + false, + { + //minPower: rThresh, + //onlyLimited: !enemy.Enemy.RestraintFilter?.limitedRestraintsOnly, + ignore: [...restraintAdd.map((rst) => {return rst.r.name;})], + looseLimit: true, + require: enemy.Enemy.RestraintFilter?.unlimitedRestraints ? undefined : enemy.items, + }, enemy, undefined, true, undefined, { + allowLowPower: KDRandom() < 0.5, + extraOptions: enemy.items, + }); + + if (!rest) { + rest = KDGetRestraintWithVariants( + {tags: KDGetTags(enemy, enemy.usingSpecial)}, KDGetEffLevel() + (enemy.Enemy.RestraintFilter?.levelBonus || enemy.Enemy.power || 0), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + enemy.Enemy.bypass, + enemy.Enemy.useLock ? enemy.Enemy.useLock : "", + !(KDPlayerIsStunned() || enemy.Enemy.ignoreStaminaForBinds || (enemy.usingSpecial && enemy.Enemy.specialIgnoreStam)) && !AIData.attack.includes("Suicide"), + !AIData.addMoreRestraints && !enemy.usingSpecial && AIData.addLeash, + !KinkyDungeonStatsChoice.has("TightRestraints"), + KDGetExtraTags(enemy, enemy.usingSpecial, true), + false, + { + maxPower: rThresh + 0.01, + looseLimit: true, + onlyUnlimited: true, + ignore: [...(enemy.items || []), ...restraintAdd.map((rst) => {return rst.r.name;})], + }, enemy, undefined, true, undefined, { + allowLowPower: KDRandom() < 0.5, + }); + } else { + restraintFromInventory.push(rest.iv || rest.r.name); + } + if (rest) { + replace.push({keyword:"RestraintAdded", value: KDGetRestraintName(rest.r, rest.v)}); + restraintAdd.push({r: rest.r, v: rest.v, iv: rest.iv}); + addedRestraint = true; + } + } + if (enemy.usingSpecial && addedRestraint && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Bind")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + if (!addedRestraint && enemy.Enemy.fullBoundBonus) { + willpowerDamage += enemy.Enemy.fullBoundBonus; // Some enemies deal bonus damage if they cannot put a binding on you + } + } + } else if (enemy.Enemy.fullBoundBonus) { + willpowerDamage += enemy.Enemy.fullBoundBonus; // Some enemies deal bonus damage if they cannot put a binding on you + } + } + } + + + if (AIData.attack.includes("Vibe")) { + AIData.vibe = true; + } + if (AIData.intentToLeash) { + let leashPos = AIData.leashPos; + if (AIData.leashPos) { + if (leashPos && leashPos == enemy.IntentLeashPoint && Math.abs(enemy.x - leashPos.x) <= 1.5 && Math.abs(enemy.y - leashPos.y) <= 1.5) { + if (enemy.IntentAction && KDIntentEvents[enemy.IntentAction] && KDIntentEvents[enemy.IntentAction].arrive) { + KDIntentEvents[enemy.IntentAction].arrive(enemy, AIData); + } else { + KDResetIntent(enemy, AIData); + } + } + else if (enemy.Enemy.tags.leashing && AIData.nearestJail && leashPos == AIData.nearestJail && Math.abs(enemy.x - leashPos.x) <= 1 && Math.abs(enemy.y - leashPos.y) <= 1) { + AIData.defeat = true; + if (leashPos && + KinkyDungeonStairTiles.includes(KinkyDungeonMapGet(leashPos.x, leashPos.y))) { + KinkyDungeonSetFlag("LeashToPrison", 1); + } + KDGameData.KinkyDungeonLeashedPlayer = 3 + ap * 2; + KDGameData.KinkyDungeonLeashingEnemy = enemy.id; + KDBreakTether(KinkyDungeonPlayerEntity); + } + else if (leashPos && ( + (AIData.attack.includes("Pull") && enemy.x == leashPos.x && enemy.y == leashPos.y) + || Math.abs(enemy.x - leashPos.x) > 0.5 + || Math.abs(enemy.y - leashPos.y) > 0.5) + ) { + if (!KinkyDungeonHasWill(0.1) && KDRandom() < 0.25) KDGameData.MovePoints = Math.min(-1, KDGameData.MovePoints); + // Leash pullback + if (AIData.playerDist < 1.5) { + let path = KinkyDungeonFindPath(enemy.x, enemy.y, leashPos.x, leashPos.y, true, false, true, KinkyDungeonMovableTilesSmartEnemy, undefined, undefined, undefined, enemy); + if (path && path.length > 0) { + let leashPoint = path[0]; + let enemySwap = KinkyDungeonEnemyAt(leashPoint.x, leashPoint.y); + if ((!enemySwap || !enemySwap.Enemy.noDisplace) && Math.max(Math.abs(leashPoint.x - enemy.x), Math.abs(leashPoint.y - enemy.y)) <= 1.5) { + KDGameData.KinkyDungeonLeashedPlayer = 3 + ap * 2; + KDGameData.KinkyDungeonLeashingEnemy = enemy.id; + if (enemySwap) { + enemySwap.x = KinkyDungeonPlayerEntity.x; + enemySwap.y = KinkyDungeonPlayerEntity.y; + enemySwap.warningTiles = []; + } + let formerx = enemy.x; + let formery = enemy.y; + KDMoveEntity(enemy, leashPoint.x, leashPoint.y, true, false, undefined, true); + KDMovePlayer(formerx, formery, false); + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + AIData.hitsfx = "Struggle"; + for (let invItem of KinkyDungeonAllRestraintDynamic()) { + let inv = invItem.item; + if (KDRestraint(inv).removeOnLeash) { + KinkyDungeonRemoveRestraintSpecific(inv, false); + if (KDRestraint(inv).Group == "ItemDevices") { + KinkyDungeonSetFlag("Released", 15); + KinkyDungeonSetFlag("nojailbreak", 15); + } + } + } + if (!KinkyDungeonHasWill(0.1)) { + KDStunTurns(enemy.Enemy.movePoints + moveMult - 1); + KinkyDungeonSleepTime = CommonTime() + 200; + } + KinkyDungeonSetFlag("grabbed", 4); + + if (AIData.leashing && !KDPlayerIsImmobilized() && !KDIsPlayerTetheredToEntity(KinkyDungeonPlayerEntity, enemy)) { + KinkyDungeonAttachTetherToEntity(2.5, enemy, player); + KinkyDungeonSetFlag("leashtug", 3); + } + //KinkyDungeonSetFlag("nojailbreak", KDGameData.KinkyDungeonLeashedPlayer); + KinkyDungeonSetFlag("nojailbreak", 12); + if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Pull")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + if (KinkyDungeonMapGet(enemy.x, enemy.y) == 'D') { + KinkyDungeonMapSet(enemy.x, enemy.y, 'd'); + if (KinkyDungeonTilesGet(enemy.x + ',' +enemy.y)?.Lock + && KinkyDungeonTilesGet(enemy.x + ',' +enemy.y).Type == "Door" + && KDShouldUnLock(enemy.x, +enemy.y, KinkyDungeonTilesGet(enemy.x + ',' +enemy.y))) { + KinkyDungeonTilesGet(enemy.x + ',' +enemy.y).OGLock = KinkyDungeonTilesGet(enemy.x + ',' +enemy.y).Lock; + KinkyDungeonTilesGet(enemy.x + ',' +enemy.y).Lock = undefined; + } + } + + if (KDRandom() < actionDialogueChanceIntense) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "Leash").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 3); + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonLeashGrab").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "#ff8933", 1, + false, false, undefined, "Combat"); + } + } + } else if (!(player?.player && KinkyDungeonFlags.get("forceMoved"))) { + // Simple pull + let path = KinkyDungeonFindPath(player.x, player.y, leashPos.x, leashPos.y, true, false, false, KinkyDungeonMovableTilesEnemy, undefined, undefined, undefined, enemy); + let pullDist = enemy.Enemy.pullDist ? enemy.Enemy.pullDist : 1; + if (path && path.length > 0) { + let leashPoint = path[Math.min(Math.max(0,path.length-2), Math.floor(Math.max(0, pullDist-1)))]; + if (!KinkyDungeonEnemyAt(leashPoint.x, leashPoint.y) + && Math.sqrt((leashPoint.x - enemy.x) * (leashPoint.x - enemy.x) + (leashPoint.y - enemy.y) * (leashPoint.y - enemy.y)) < AIData.playerDist + && Math.sqrt((leashPoint.x - player.x) * (leashPoint.x - player.x) + (leashPoint.y - player.y) * (leashPoint.y - player.y)) <= pullDist * 1.45) { + if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Pull")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + KDGameData.KinkyDungeonLeashedPlayer = 2; + KDGameData.KinkyDungeonLeashingEnemy = enemy.id; + + if (player.player) + KDMovePlayer(leashPoint.x, leashPoint.y, false); + else + KDMoveEntity(player, leashPoint.x, leashPoint.y, false); + let msg = "KinkyDungeonLeashGrab"; + if (enemy.Enemy.pullMsg) msg = "Attack" + enemy.Enemy.name + "Pull"; + + if (KDRandom() < actionDialogueChanceIntense) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "Pull").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 3); + KinkyDungeonSendTextMessage(8, TextGet(msg).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "#ff8933", 1, + false, false, undefined, "Combat"); + } + } + } + } + } + } + let Dash = false; + + + let data: any = {}; + if (AIData.attack.includes("Dash") && (enemy.Enemy.dashThruWalls || AIData.canSeePlayer)) { + let d = KDDash(enemy, player, AIData.MovableTiles); + Dash = d.Dash; + happened += d.happened; + } + if (first && AIData.attack.includes("Bonus") && !enemy.movePoints) { + if (!enemy.attackBonus) enemy.attackBonus = 0; + enemy.attackBonus += enemy.Enemy.attackBonus || 1; // bonus means they can attack again + } + if (AIData.attack.includes("Will") || willpowerDamage > 0 || KDEnemyHasFlag(enemy, "alwayswill")) { + if (willpowerDamage == 0) + willpowerDamage += AIData.power; + let buffdmg = KinkyDungeonGetBuffedStat(enemy.buffs, "AttackDmg"); + if (buffdmg) willpowerDamage = Math.max(0, willpowerDamage + buffdmg); + msgColor = "#ff5277"; + if (enemy.usingSpecial && willpowerDamage > 0 && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Will")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + } + if (AIData.attack.includes("Stamina") || staminaDamage > 0) { + if (staminaDamage == 0) + staminaDamage += AIData.power; + let buffdmg = KinkyDungeonGetBuffedStat(enemy.buffs, "StaminaDmg"); + if (buffdmg) staminaDamage = Math.max(0, staminaDamage + buffdmg + enemy.Enemy.staminaDamage); + msgColor = "#ff5277"; + if (enemy.usingSpecial && staminaDamage > 0 && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Stamina")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + } + let dmgString = ""; + if (player.player) { + KinkyDungeonTickBuffTag(enemy, "hit", 1); + if (restraintAdd && restraintAdd.length > 0) { + msgColor = "#ff8933"; + bound += KDRunBondageResist(enemy, KDGetFaction(enemy), restraintAdd,(r) => { + KDDamageQueue.push({floater: TextGet("KDBlockedRestraint"), Entity: {x: enemy.x - 0.5, y: enemy.y - 0.5}, Color: "#88ff88", Time: 2, Delay: 0}); + for (let rep of replace) { + if (rep.keyword == "RestraintAdded") rep.value = TextGet("KDRestraintBlockedItem"); + } + if (!r) + KinkyDungeonSendTextMessage(1, TextGet("KDBondageResistBlockTotal"), "#f0dc41", 1, + false, false, undefined, "Combat"); + msgColor = "#f0dc41"; + bound += 1; + if (willpowerDamage == 0) + willpowerDamage += AIData.power; + }, + restraintFromInventory).length*2; + } + + if (restraintAdd && restraintAdd.length == 0 && AIData.attack.includes("Bind")) { + if ((!KinkyDungeonHasWill(0.1) || (enemy.Enemy.Attack?.mustBindorFail)) && enemy.Enemy.failAttackflag) { + if (!enemy.Enemy.failAttackflagChance || KDRandom() < enemy.Enemy.failAttackflagChance) + for (let f of enemy.Enemy.failAttackflag) { + KinkyDungeonSetFlag(f, enemy.Enemy.failAttackflagDuration || 12); + KDSetIDFlag(enemy.id, "wander", 0); + } + } + } + + + if (AIData.attack.includes("Slow")) { + KDGameData.MovePoints = Math.max(KDGameData.MovePoints - 2, -1); + if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Slow")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + happened += 1; + } + if (AIData.attack.includes("Effect") && enemy.Enemy.effect) { + let affected = KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, enemy.Enemy.effect.damage, enemy.Enemy.effect.effect, enemy.Enemy.effect.spell, KDGetFaction(enemy), undefined, enemy); + if (affected && enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Effect")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + Effected = true; + happened += 1; + } + if (AIData.attack.includes("Stun")) { + let time = enemy.Enemy.stunTime ? enemy.Enemy.stunTime : 1; + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, time); + KDGameData.MovePoints = Math.max(Math.min(-1, -time+1), KDGameData.MovePoints-time); // This is to prevent stunlock while slowed heavily + if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Stun")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + happened += 1; + priorityBonus += 3*time; + Stun = true; + if (KDRandom() < actionDialogueChanceIntense) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "Stun").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 3); + + } + if (AIData.attack.includes("Blind")) { + let time = enemy.Enemy.blindTime ? enemy.Enemy.blindTime : 1; + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, time); + if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Blind")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + happened += 1; + priorityBonus += 3*time; + Blind = true; + } + happened += bound; + + data = { + attack: AIData.attack, + enemy: enemy, + bound: bound, + damage: willpowerDamage, + staminaDamage: staminaDamage, + damagetype: AIData.damage, + restraintsAdded: restraintAdd, + attacker: enemy, + target: player, + happened: happened, + player: player, + eventable: eventable || (dash && enemy.Enemy.Dash?.EventOnDashMiss) || (dash && enemy.Enemy.Dash?.EventOnDashMiss), + + }; + KinkyDungeonSendEvent("beforeDamage", data); + KDDelayedActionPrune(["Hit"]); + let dmg = KinkyDungeonDealDamage({damage: data.damage, type: data.damagetype}); + if (!dmg.happened) { + // Sometimes enemies will flinch for a turn if their attack did nothing + if (KDRandom() < 0.4) KinkyDungeonSetEnemyFlag(enemy, "failAttack", 1); + } + data.happened += dmg.happened; + if (staminaDamage) { + KDChangeStamina("enemy" + enemy.id, "enemy", "enemyHit", -staminaDamage, false, 1, false, KDGetStamDamageThresh()); + data.happened += staminaDamage; + } + if (!enemy.playWithPlayer) + KinkyDungeonSetFlag("NPCCombat", 3); + happened = data.happened; + dmgString = dmg.string || TextGet("KDNoDamage"); + KinkyDungeonSetEnemyFlag(enemy, "touchedPlayer", 2); + replace.push({keyword:"DamageTaken", value: dmgString}); + } else { // if (KDRandom() <= playerEvasion) + if (AIData.attack.includes("Slow")) { + if (player.movePoints) + player.movePoints = Math.max(player.movePoints - 1, 0); + if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Slow")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + happened += 1; + } + if (AIData.attack.includes("Stun")) { + let time = enemy.Enemy.stunTime ? enemy.Enemy.stunTime : 1; + if (!player.stun) player.stun = time; + else player.stun = Math.max(time, player.stun); + if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Stun")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + happened += 1; + } + if (AIData.attack.includes("Blind")) { + let time = enemy.Enemy.blindTime ? enemy.Enemy.blindTime : 1; + if (!player.blind) player.blind = time; + else player.blind = Math.max(time, player.blind); + if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Blind")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + happened += 1; + } + if (AIData.attack.includes("Silence")) { + let time = enemy.Enemy.silenceTime ? enemy.Enemy.silenceTime : 1; + KDSilenceEnemy(player, time); + if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Blind")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + happened += 1; + } + + + let dmg = AIData.power; + let buffdmg = KinkyDungeonGetBuffedStat(enemy.buffs, "AttackDmg"); + if (buffdmg) dmg = Math.max(0, dmg + buffdmg); + if (enemy.Enemy.fullBoundBonus) { + dmg += enemy.Enemy.fullBoundBonus; // Some enemies deal bonus damage if they cannot put a binding on you + } + let damaged = KinkyDungeonDamageEnemy(player, {type: enemy.Enemy.dmgType, damage: dmg}, false, true, undefined, undefined, enemy); + if (!(damaged > 0)) { + // Sometimes enemies will flinch for a turn if their attack did nothing + if (KDRandom() < 0.7) KinkyDungeonSetEnemyFlag(enemy, "failAttack", 1); + } + happened += damaged; + KinkyDungeonSetFlag("NPCCombat", 3); + KinkyDungeonTickBuffTag(enemy, "hit", 1); + if (happened > 0) { + // Decrement play timer on a hit, less if they are on furniture + if (enemy.playWithPlayer) { + if (!KDEntityHasFlag(enemy, "playOpin")) { + KDAddOpinionPersistent(enemy.id, 10); + KinkyDungeonSetEnemyFlag(enemy, "playOpin", -1); + } + enemy.playWithPlayer = Math.max(0, enemy.playWithPlayer - (!KinkyDungeonPlayerTags.has("Furniture") ? 2 : 1) * Math.max(1, ((enemy.usingSpecial && enemy.Enemy.specialAttackPoints) ? enemy.Enemy.specialAttackPoints : enemy.Enemy.attackPoints))); // Decrement each attack.... + if (enemy.playWithPlayer == 0 && !KinkyDungeonFlags.get("noResetIntentFull")) KDResetIntent(enemy, AIData); + } + let sfx = (AIData.hitsfx) ? AIData.hitsfx : "DealDamage"; + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + sfx + ".ogg", enemy); + } + } + + if (AIData.attack.includes("Suicide")) { + if ((!enemy.Enemy.suicideOnAdd && !enemy.Enemy.suicideOnLock && !enemy.Enemy.suicideOnEffect) + || (enemy.Enemy.suicideOnAdd && addedRestraint) + || (enemy.Enemy.suicideOnLock && Locked) + || (enemy.Enemy.suicideOnEffect && Effected) + || (!player.player && AIData.attack.includes("Bind") && enemy.Enemy.suicideOnAdd)) { + enemy.hp = 0; + } else if ((!KinkyDungeonHasWill(0.1) || (enemy.Enemy.Attack?.mustBindorFail)) && enemy.Enemy.failAttackflag) { + if (!enemy.Enemy.failAttackflagChance || KDRandom() < enemy.Enemy.failAttackflagChance) + for (let f of enemy.Enemy.failAttackflag) { + KinkyDungeonSetFlag(f, enemy.Enemy.failAttackflagDuration || 12); + KDSetIDFlag(enemy.id, "wander", 0); + } + } + } + + if (enemy.usingSpecial && enemy.specialCD > 0 && enemy.Enemy.specialCharges) { + if (enemy.specialCharges == undefined) enemy.specialCharges = enemy.Enemy.specialCharges-1; + else enemy.specialCharges -= 1; + } + + if (happened > 0 && player.player) { + let suffix = ""; + if (Stun) suffix = "Stun"; + else if (Blind) suffix = "Blind"; + else if (Locked) suffix = "Lock"; + else if (bound > 0) suffix = "Bind"; + if (Dash) suffix = "Dash"; + if (enemy.usingSpecial && enemy.Enemy.specialMsg) suffix = "Special"; + + let sfx = (AIData.hitsfx) ? AIData.hitsfx : + AIData.damage == "pain" ? "Slap" + : (AIData.damage == "grope" ? "Grope" + : (AIData.damage == "tickle" ? "Tickle" + : (data.damage > 1 ? "Damage" : "DamageWeak"))) + ; + if (enemy.usingSpecial && enemy.Enemy.specialsfx) sfx = enemy.Enemy.specialsfx; + KinkyDungeonSendEvent("hit", data); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + sfx + ".ogg", enemy); + let text = TextGet("Attack"+enemy.Enemy.name + suffix).KDReplaceOrAddDmg(dmgString); + if (replace) + for (let R = 0; R < replace.length; R++) + text = text.replace(replace[R].keyword, "" + replace[R].value); + KinkyDungeonSendTextMessage(happened+priorityBonus, text, msgColor, 1, + false, false, undefined, "Self"); + if (!enemy.Enemy.tags.temporary && AIData.attack.includes("Bind") && KDCanPickpocket(enemy)) + KinkyDungeonLoseJailKeys(true, undefined, enemy); + } + } + KinkyDungeonTickBuffTag(enemy, "damage", 1); + + enemy.warningTiles = []; + if (enemy.usingSpecial) enemy.usingSpecial = false; + } + } else { + enemy.warningTiles = []; + enemy.attackPoints = 0; + if (enemy.usingSpecial) enemy.usingSpecial = false; + enemy.fx = enemy.x + dir.x; + enemy.fy = enemy.y + dir.y; + } + + first = false; + } + if (first) { + enemy.warningTiles = []; + enemy.attackPoints = 0; + } + + enemy.moved = (AIData.moved || enemy.movePoints > 0); + enemy.idle = AIData.idle && !(AIData.moved || enemy.attackPoints > 0); + if (enemy.idle) { + enemy.fx = undefined; + enemy.fy = undefined; + } + + + if (!AIType.afteridle || !AIType.afteridle(enemy, player, AIData)) { + // Spell loop + if (AIData.wantsToCast + && !KDEnemyHasFlag(enemy, "nocast") + && (!enemy.Enemy.enemyCountSpellLimit || KDMapData.Entities.length < enemy.Enemy.enemyCountSpellLimit) + && ((!player.player || (AIData.aggressive || (KDGameData.PrisonerState == 'parole' && enemy.Enemy.spellWhileParole)))) + && (!enemy.blind || enemy.blind < 0.01 || AIData.playerDist < 2.99) + && (!enemy.Enemy.noSpellDuringAttack || enemy.attackPoints < 1) + && (!enemy.Enemy.noSpellsWhenHarmless || !AIData.harmless) + && (!enemy.Enemy.noSpellsLowSP || KinkyDungeonHasWill(0.1) || KinkyDungeonFlags.has("PlayerCombat")) + && (!enemy.Enemy.noSpellLeashing || KinkyDungeonLeashingEnemy()?.id != enemy.id || KDGameData.KinkyDungeonLeashedPlayer < 1) + && (!enemy.Enemy.followLeashedOnly || (KDGameData.KinkyDungeonLeashedPlayer < 1 || KinkyDungeonLeashingEnemy()?.id == enemy.id)) + && (AIData.hostile || (!player.player && (KDHostile(player) || enemy.rage))) + && ((KDEnemyReallyAware(enemy, player) && (KDCanDetect(enemy, player))) || (!KDAllied(enemy) && !AIData.hostile)) + && !AIData.ignore && (!AIData.moved || enemy.Enemy.castWhileMoving) && enemy.Enemy.attack.includes("Spell") + && !AIData.ignoreRanged + && AIType.spell(enemy, player, AIData) + && KinkyDungeonCheckLOS(enemy, player, AIData.playerDist, AIData.visionRadius, false, true) && enemy.castCooldown <= 0) { + AIData.idle = false; + let spellchoice: string = null; + let spell: spell = null; + let spelltarget: entity = undefined; + + let spellPriority = []; + if (enemy.Enemy.Magic?.priority) { + spellPriority = Object.entries(enemy.Enemy.Magic.priority); + spellPriority.sort((a, b) => { + return b[1] - a[1]; + }); + } + + + for (let tries = 0; tries < 6 + spellPriority.length; tries++) { + spelltarget = null; + if (tries < spellPriority.length) { + spellchoice = spellPriority[tries][0]; + } else { + spellchoice = enemy.Enemy.spells[Math.floor(KDRandom()*enemy.Enemy.spells.length)]; + } + spell = KinkyDungeonFindSpell(spellchoice, true); + if (spell?.targetPlayerOnly && !player.player) spell = null; + if (spell && (enemy.blind > 0 && (spell.projectileTargeting)) && !KDCanHearEnemy(enemy, player, 1.2)) spell = null; + if (spell && ((!spell.castRange && AIData.playerDist > KDGetSpellRange(spell)) || (spell.castRange && AIData.playerDist > spell.castRange))) spell = null; + if (spell && spell.specialCD && enemy.castCooldownSpecial > 0) spell = null; + if (spell && enemy.castCooldownUnique && enemy.castCooldownUnique[spell.name] > 0) spell = null; + if (spell && spell.noFirstChoice && tries <= 2) spell = null; + if (spell && spell.projectileTargeting && !KinkyDungeonCheckProjectileClearance(enemy.x, enemy.y, player.x, player.y, !player.player && !spell.noFF)) spell = null; + if (spell && spell.buff) { + if (enemy.Enemy.buffallies || spell.buffallies) { + // Select a random nearby ally of the enemy + let nearAllies = []; + for (let e of KDMapData.Entities) { + if ((e != enemy || spell.selfbuff) && (!spell.heal || e.hp < e.Enemy.maxhp - spell.power*0.5) + && e.aware && !KinkyDungeonHasBuff(e.buffs, spell.name) + && !e.rage + && ((KDAllied(enemy) && KDAllied(e)) || (!KDHostile(enemy, e) + && KDFactionRelation(KDGetFaction(e), KDGetFaction(enemy)) >= 0.1)) + && Math.sqrt((enemy.x - e.x)*(enemy.x - e.x) + (enemy.y - e.y)*(enemy.y - e.y)) < KDGetSpellRange(spell) + && (!spell.castCondition || (KDCastConditions[spell.castCondition] && KDCastConditions[spell.castCondition](enemy, e, spell)))) { + let allow = !spell.filterTags; + if (spell.filterTags && KDMatchTags(spell.filterTags, e)) allow = true; + if (allow) + nearAllies.push(e); + } + } + if (nearAllies.length > 0) { + let e = nearAllies[Math.floor(KDRandom() * nearAllies.length)]; + if (e) { + spelltarget = e; + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonSpellCast" + spell.name).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "#ffffff", 2, + false, false, undefined, "Combat"); + break; + } + } else spell = null; + } else if (!spell.noSelfBuff) { + spelltarget = enemy; + if (spell.castCondition && (!KDCastConditions[spell.castCondition] && !KDCastConditions[spell.castCondition](enemy, enemy, spell))) spell = null; + } else spell = null; + } else if (spell?.castCondition && (KDCastConditions[spell.castCondition] && !KDCastConditions[spell.castCondition](enemy, player, spell))) spell = null; + let minSpellRange = (spell && spell.minRange != undefined) ? spell.minRange : ((spell && (spell.selfcast || (enemy.Enemy.selfCast && enemy.Enemy.selfCast[spell.name]) || spell.buff || (spell.range && KDGetSpellRange(spell) < 1.6))) ? 0 : 1.5); + if (spell && spell.heal && spelltarget.hp >= spelltarget.Enemy.maxhp) spell = null; + if (spell && !(!minSpellRange || (AIData.playerDist > minSpellRange))) spell = null; + if (spell && !(!spell.minRange || (AIData.playerDist > spell.minRange))) spell = null; + if (spell) break; + } + if (spell && !enemy.Enemy.noMiscast && KDRandom() < KDGetEnemyMiscast(enemy)) { + if (player == KinkyDungeonPlayerEntity) KinkyDungeonSendTextMessage(4, + TextGet(enemy.Enemy.miscastmsg || "KDEnemyMiscast").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "#ff88ff", 2, + false, false, undefined, "Combat"); + if (spell?.components?.includes("Verbal")) KinkyDungeonSetEnemyFlag(enemy, "verbalcast", 2); + + KinkyDungeonCastSpell(enemy.x, enemy.y, + KinkyDungeonFindSpell("EnemyMiscast", true), enemy, player); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + (enemy.Enemy.miscastsfx || "SoftShield") + ".ogg", enemy); + KinkyDungeonSendEvent("enemyMiscast", {spell: spell, enemy: enemy, player: player, AIData: AIData}); + + if (KDRandom() < actionDialogueChanceIntense) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailMiscast" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "")) + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)) + .replace("SPL", TextGet("KinkyDungeonSpell" + spell.name)), KDGetColor(enemy), 2, 3); + + KDEnemyAddSound(enemy, enemy.Enemy.Sound?.castAmount != undefined ? enemy.Enemy.Sound?.castAmount : KDDefaultEnemyCastSound); + } else if (spell) { + if (spell.channel && !enemy.Enemy.noChannel) enemy.channel = spell.channel; + enemy.castCooldown = spell.manacost*enemy.Enemy.spellCooldownMult + enemy.Enemy.spellCooldownMod + 1; + if (spell.specialCD) + enemy.castCooldownSpecial = spell.specialCD; + if (enemy.Enemy.Magic?.castCooldownUnique && enemy.Enemy.Magic.castCooldownUnique[spell.name] != undefined) { + if (!enemy.castCooldownUnique) enemy.castCooldownUnique = {}; + enemy.castCooldownUnique[spell.name] = enemy.Enemy.Magic.castCooldownUnique[spell.name]; + } + let xx = player.x; + let yy = player.y; + if (AIData.playerDist > 1.5 && enemy.blind > 0) { + let pp = KinkyDungeonGetNearbyPoint(xx, yy, true, undefined, true, + true, undefined, true, true + ); + if (pp) { + xx = pp.x; + yy = pp.y; + } + } + + if (spelltarget) { + xx = spelltarget.x; + yy = spelltarget.y; + } + if (spell.extraDist) { + xx += spell.extraDist * (xx - enemy.x) / AIData.playerDist; + yy += spell.extraDist * (yy - enemy.y) / AIData.playerDist; + } + if (spell && (spell.selfcast || (enemy.Enemy.selfCast && enemy.Enemy.selfCast[spell.name]))) { + xx = enemy.x; + yy = enemy.y; + if (!spell.noCastMsg) + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonSpellCast" + spell.name).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "#ff8844", 4, undefined, undefined, enemy, + "Combat"); + } else if (spell && spell.msg) { + + if (!spell.noCastMsg) + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonSpellCast" + spell.name).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), "#ff8844", 4, undefined, undefined, enemy, + "Combat"); + } + + + if (spell && KinkyDungeonCastSpell(xx, yy, spell, enemy, player).result == "Cast" && spell.sfx) { + if (spell?.components?.includes("Verbal")) KinkyDungeonSetEnemyFlag(enemy, "verbalcast", 3); + if (!enemy.Enemy.noFlip) { + if (Math.sign(xx - enemy.x) < 0) { + delete enemy.flip; + } else if (Math.sign(xx - enemy.x) > 0) { + enemy.flip = true; + } + } + if (enemy.Enemy.suicideOnSpell) enemy.hp = 0; + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + spell.sfx + ".ogg", enemy); + } + + KinkyDungeonSendEvent("enemyCast", { + spell: spell, spelltarget: spelltarget, enemy: enemy, + player: player, AIData: AIData, + tx: xx, + ty: yy, + }); + + if (KDRandom() < actionDialogueChanceIntense) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailCast" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "")) + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)) + .replace("SPL", TextGet("KinkyDungeonSpell" + spell.name)), KDGetColor(enemy), 2, 3); + + KDEnemyAddSound(enemy, enemy.Enemy.Sound?.castAmount != undefined ? enemy.Enemy.Sound?.castAmount : KDDefaultEnemyCastSound); + + //console.log("casted "+ spell.name); + } + } + if (AIData.vibe || (enemy.Enemy.RemoteControl?.remote && AIData.playerDist < enemy.Enemy.RemoteControl?.remote && player?.player)) { + KinkyDungeonSendEvent("remoteVibe", {enemy: enemy.Enemy.name, power: enemy.Enemy.RemoteControl?.remoteAmount ? enemy.Enemy.RemoteControl?.remoteAmount : 5, overcharge: AIData.vibe, noSound: AIData.vibe}); + } + if (AIData.aggressive && AIData.canSensePlayer && enemy.Enemy.RemoteControl?.punishRemote && AIData.playerDist < enemy.Enemy.RemoteControl?.punishRemote && player?.player) { + KinkyDungeonSendEvent("remotePunish", {enemy}); + } + + + if (enemy.aware && enemy.idle && (!KDEnemyHasFlag(enemy, "targ_player") ? (enemy.vp || 0) < sneakThreshold : ((enemy.vp || 0) < sneakThreshold * 0.25 && !enemy.path && !AIData.canSensePlayer))) { + if (enemy.aware) KDAddThought(enemy.id, "Lose", 1, 4); + enemy.aware = false; + } + } + + if (enemy.IntentAction && KDIntentEvents[enemy.IntentAction] && KDIntentEvents[enemy.IntentAction].maintain) { + KDIntentEvents[enemy.IntentAction].maintain(enemy, delta, AIData); + } + + if (enemy.playWithPlayer > 0 && !AIData.aggressive) { + KinkyDungeonApplyBuffToEntity(enemy, KDEager); + if (AIData.domMe) + KinkyDungeonApplyBuffToEntity(enemy, KDMasochist); + } + + if (enemy.usingSpecial && (AIData.idle || (AIData.moved && !enemy.Enemy.attackWhileMoving)) && enemy.Enemy.specialCDonAttack) { + enemy.specialCD = enemy.Enemy.specialCD; + } + if (enemy.specialCD > 0) enemy.usingSpecial = false; + + if (AIData.idle) KDAddThought(enemy.id, "Idle", 0.5, 3); + + if (AIData.ignore) enemy.ignore = true; + else delete enemy.ignore; + + return {idle: AIData.idle, defeat: AIData.defeat, defeatEnemy: enemy}; +} + +// Unique ID for enemies, to prevent bullets from hitting them +// Dont want to pass object handles around +function KinkyDungeonGetEnemyID() { + if (KinkyDungeonEnemyID > 100000000) KinkyDungeonEnemyID = 1; + return KinkyDungeonEnemyID++; +} +// Unique ID for enemies, to prevent bullets from hitting them +// Dont want to pass object handles around +function KinkyDungeonGetSpellID() { + if (KinkyDungeonSpellID > 100000000) KinkyDungeonSpellID = 1; + return KinkyDungeonSpellID++; +} +// Unique ID for items for identification reasons +// Dont want to pass object handles around +function KinkyDungeonGetItemID() { + if (KDGameData.ItemID > 100000000 || KDGameData.ItemID == undefined) KDGameData.ItemID = 1; + return KDGameData.ItemID++; +} + +// Unique ID for items for identification reasons +// Dont want to pass object handles around +function KinkyDungeonGetRegimentID() { + if (KDGameData.RegimentID > 100000000 || KDGameData.RegimentID == undefined) KDGameData.RegimentID = 1; + return KDGameData.RegimentID++; +} + +let KinkyDungeonEnemyID = 1; +let KinkyDungeonSpellID = 1; + +function KinkyDungeonNoEnemy(x: number, y: number, Player?: boolean): boolean { + + if (KinkyDungeonEnemyAt(x, y)) return false; + if (Player) + for (let player of KinkyDungeonPlayers) + if ((player.x == x && player.y == y)) return false; + return true; +} + +/** + * @param enemy + * @param [strict] + */ +function KDIsImmobile(enemy: entity, strict?: boolean): boolean { + return enemy?.Enemy && (enemy.Enemy.immobile || enemy.immobile > 0 || (!strict && enemy.Enemy.tags?.immobile) || KDEnemyHasFlag(enemy, "imprisoned")); +} + +// e = potential sub +// Enemy = leader +/** + * + * @param e - Target enemy + * @param Enemy - Enemy trying to move + * @returns + */ +function KinkyDungeonCanSwapWith(e: entity, Enemy: entity): boolean { + if (( + (KDIsImmobile(e) && (e.Enemy.immobile)) + || e.Enemy?.pathcondition + ) && + (!e.Enemy?.pathcondition || !( + KDPathConditions[e.Enemy.pathcondition] + && !KDPathConditions[e.Enemy.pathcondition].query(Enemy, e) + ))) return false; // Fail path conditions + if (e && KDEnemyHasFlag(e, "noswap")) return false; // Definition of noSwap + if (Enemy && KDEnemyHasFlag(Enemy, "donotswap")) return false; // Definition of noSwap + + if (Enemy && Enemy.Enemy && Enemy.Enemy.ethereal + && e && !(e.Enemy && e.Enemy.ethereal)) return false; + if (Enemy && Enemy.Enemy && (Enemy.Enemy.squeeze && KinkyDungeonMapGet(Enemy.x, Enemy.y) == 'b') + && e && !(e.Enemy && e.Enemy.squeeze)) return false; + if (Enemy && Enemy.Enemy && (Enemy.Enemy.earthmove && KinkyDungeonMapGet(Enemy.x, Enemy.y) == '4') + && e && !(e.Enemy && e.Enemy.earthmove)) return false; + + if (!e.Enemy.tags || (e.Enemy.tags.scenery && !Enemy.Enemy.tags.scenery)) + return true; + + // Only jailguard or aggressive enemy is allowed to swap into offlimits spaces unless hostile + + // Should not swap or block the leasher + if (e == KinkyDungeonLeashingEnemy() && Enemy) return false; + if (KDIsPlayerTetheredToLocation(KinkyDungeonPlayerEntity, e.x, e.y, e)) return false; // KD Tethered to entity + if (e == KinkyDungeonJailGuard() && Enemy != KinkyDungeonLeashingEnemy()) return false; + if (Enemy == KinkyDungeonLeashingEnemy() || KDIsPlayerTetheredToLocation(KinkyDungeonPlayerEntity, Enemy.x, Enemy.y, Enemy)) return true; + if (Enemy == KinkyDungeonJailGuard()) return true; + if (KDIsPlayerTetheredToLocation(KinkyDungeonPlayerEntity, Enemy.x, Enemy.y, Enemy)) return true; // KD Tethered to entity + + // I HAVE THINGS TO DO + if (e && KDEnemyHasFlag(Enemy, "overrideMove") && !KDEnemyHasFlag(e, "overrideMove")) return true; + if (e && !KDEnemyHasFlag(Enemy, "overrideMove") && KDEnemyHasFlag(e, "overrideMove")) return false; + + if (KinkyDungeonTilesGet(e.x + "," + e.y) && KinkyDungeonTilesGet(e.x + "," + e.y).OL && Enemy != KinkyDungeonJailGuard() && Enemy != KinkyDungeonLeashingEnemy() && !KinkyDungeonAggressive(Enemy)) return false; + + + if (e.idle && !Enemy.idle) return true; + if (KDBoundEffects(e) > 3) return true; + else if (!e.Enemy.tags || (e.Enemy.tags.minor && !Enemy.Enemy.tags.minor)) + return true; + else if (Enemy && Enemy.Enemy && Enemy.Enemy.tags && Enemy.Enemy.tags.elite) { + if (!e.Enemy.tags || (!e.Enemy.tags.elite && !e.Enemy.tags.miniboss && !e.Enemy.tags.boss)) + return true; + } else if (Enemy && Enemy.Enemy && Enemy.Enemy.tags && Enemy.Enemy.tags.miniboss) { + if (!e.Enemy.tags || (!e.Enemy.tags.miniboss && !e.Enemy.tags.boss)) + return true; + } else if (Enemy && Enemy.Enemy && Enemy.Enemy.tags && Enemy.Enemy.tags.boss) { + if (!e.Enemy.tags || (!e.Enemy.tags.boss)) + return true; + } + if (KDEnemyHasFlag(e, "CMDR_stationed") && !KDEnemyHasFlag(Enemy, "CMDR_stationed")) return true; + if (KDEnemyHasFlag(e, "allowpass") && !KDEnemyHasFlag(Enemy, "allowpass")) return true; + return false; +} + +function KinkyDungeonNoEnemyExceptSub(x: number, y: number, Player: boolean, Enemy: entity, mapData?: KDMapDataType): boolean { + let e = KinkyDungeonEnemyAt(x, y, mapData); + if (e && e.Enemy) { + if (e.Enemy.master && Enemy && Enemy.Enemy && e.Enemy.master.type == Enemy.Enemy.name) return true; + let seniority = Enemy ? KinkyDungeonCanSwapWith(e, Enemy) : false; + return seniority; + } + if (!mapData) mapData = KDMapData; + if (Player && mapData == KDMapData) + for (let pp of KinkyDungeonPlayers) + if ((pp.x == x && pp.y == y)) return false; + return true; +} + +function KinkyDungeonNoEnemyExceptID(x: number, y: number, Player: boolean, ID: number, mapData?: KDMapDataType): boolean { + let e = KinkyDungeonEnemyAt(x, y, mapData); + if (e) { + if (ID && e?.id == ID) return true; + return false; + } + if (Player && (!mapData || mapData == KDMapData)) + for (let pp of KinkyDungeonPlayers) + if ((pp.x == x && pp.y == y)) return false; + return true; +} + +function KinkyDungeonEnemyAt(x: number, y: number, mapData?: KDMapDataType): entity { + if (!mapData) mapData = KDMapData; + if (mapData == KDMapData) { + let cache = KDGetEnemyCache(); + if (cache) return cache.get(x + "," + y); + } + + for (let enemy of mapData.Entities) { + if (enemy.x == x && enemy.y == y) + return enemy; + } + return null; +} + +/** + * @param x + * @param y + * @param [requireVision] + * @param [vx] - vision x, usually player x + * @param [vy] - vision y, usually player y + * @param [player] + */ +function KinkyDungeonEntityAt(x: number, y: number, requireVision: boolean = false, vx?: number, vy?: number, + player: boolean = true, mapData?: KDMapDataType): entity { + if (!mapData) mapData = KDMapData; + if (player && mapData == KDMapData && KinkyDungeonPlayerEntity.x == x && KinkyDungeonPlayerEntity.y == y) return KinkyDungeonPlayerEntity; + + if (mapData == KDMapData) { + let cache = KDGetEnemyCache(); + if (!requireVision && cache) return cache.get(x + "," + y); + else if (cache) { + let enemy = cache.get(x + "," + y); + if (KDCanSeeEnemy(enemy, KDistEuclidean(x - vx, y - vy))) return enemy; + } + } + + for (let enemy of mapData.Entities) { + if (enemy.x == x && enemy.y == y + && (!requireVision || mapData != KDMapData + || KDCanSeeEnemy(enemy, KDistEuclidean(x - vx, y - vy)))) + return enemy; + } + return null; +} + +let KDDefaultEnemySprint = 1.5; + +function KinkyDungeonEnemyTryMove ( + enemy: entity, + Direction: { x: number, y: number, delta: number }, + delta: number, + x: number, + y: number, + canSprint: boolean +) +{ + let speedMult = KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed") ? KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(enemy.buffs, "MoveSpeed")) : 1; + if (canSprint && KDEnemyCanSprint(enemy)) { + speedMult *= enemy.Enemy.sprintspeed || KDDefaultEnemySprint; + KDEnemyChangeSprint(enemy, delta); + enemy.sprinted = true; + } + + if (enemy.bind > 0) enemy.movePoints += speedMult * delta/10; + else if (enemy.slow > 0) enemy.movePoints += speedMult * delta/2; + else enemy.movePoints += KDGameData.SleepTurns > 0 ? 4*delta * speedMult : delta * speedMult; + + let moveMult = KDBoundEffects(enemy) * 0.5; + + if (enemy.movePoints > 0) { + enemy.fx = enemy.x + Direction.x; + enemy.fy = enemy.y + Direction.y; + } + + if (enemy.movePoints >= enemy.Enemy.movePoints + moveMult) { + enemy.movePoints = Math.max(0, enemy.movePoints - enemy.Enemy.movePoints + moveMult); + let dist = Math.abs(x - KinkyDungeonPlayerEntity.x) + Math.abs(y - KinkyDungeonPlayerEntity.y); + + let ee = KinkyDungeonEnemyAt(enemy.x + Direction.x, enemy.y + Direction.y); + + if (!ee && KinkyDungeonMapGet(enemy.x, enemy.y) == 'd' && enemy.Enemy + && (enemy.Enemy.tags.closedoors + || (enemy.Enemy.tags.opendoors && KinkyDungeonTilesGet(enemy.x + ',' + enemy.y)?.OGLock)) + && !(KDGameData.KinkyDungeonLeashedPlayer > 0 || KinkyDungeonFlags.has("noclosedoors")) + && ((dist > 5) || + (KinkyDungeonTilesGet(enemy.x + "," + enemy.y) && !KDAllied(enemy) && (KinkyDungeonTilesGet(enemy.x + "," + enemy.y).Jail || KinkyDungeonTilesGet(enemy.x + "," + enemy.y).ReLock) && !KinkyDungeonFlags.has("nojailbreak")))) { + KinkyDungeonMapSet(enemy.x, enemy.y, 'D'); + if ((KDGameData.PrisonerState == 'jail' || KinkyDungeonTilesGet(enemy.x + "," + enemy.y)?.OGLock) + && KinkyDungeonTilesGet(enemy.x + "," + enemy.y) + && !KDAllied(enemy) + && (KinkyDungeonTilesGet(enemy.x + "," + enemy.y).Jail || KinkyDungeonTilesGet(enemy.x + "," + enemy.y).ReLock || KinkyDungeonTilesGet(enemy.x + "," + enemy.y).OGLock) + && (!KinkyDungeonFlags.has("nojailbreak") || KinkyDungeonTilesGet(enemy.x + "," + enemy.y)?.OGLock) + && KDShouldLock(enemy.x, enemy.y, KinkyDungeonTilesGet(enemy.x + ',' +enemy.y))) { + KinkyDungeonTilesGet(enemy.x + "," + enemy.y).Type = "Door"; + if (KinkyDungeonTilesGet(enemy.x + "," + enemy.y).LockSeen) + KinkyDungeonTilesGet(enemy.x + "," + enemy.y).LockSeen = + KinkyDungeonTilesGet(enemy.x + ',' +enemy.y).Lock; + KinkyDungeonTilesGet(enemy.x + "," + enemy.y).Lock = + KinkyDungeonTilesGet(enemy.x + "," + enemy.y).OGLock || "Red"; + KDUpdateDoorNavMap(); + } + if (dist < 10) { + KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonHearDoorCloseNear"), "#dddddd", 4, + false, false, undefined, "Ambient"); + } else if (dist < 20) + KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonHearDoorCloseFar"), "#999999", 4, + false, false, undefined, "Ambient"); + } + + if (ee && KinkyDungeonCanSwapWith(ee, enemy)) { + let move = 1; + if (ee.Enemy?.pathcondition + && KDPathConditions[ee.Enemy.pathcondition] + && KDPathConditions[ee.Enemy.pathcondition].doPassthrough + ) { + move = KDPathConditions[ee.Enemy.pathcondition].doPassthrough(enemy, ee, KDMapData); + } + if (move == 1) { + KDMoveEntity(ee, enemy.x, enemy.y, false,undefined, undefined, true); + KinkyDungeonSetEnemyFlag(enemy, "fidget", 0); + ee.warningTiles = []; + ee.movePoints = 0; + ee.stun = 1; + KinkyDungeonSetEnemyFlag(ee, "donotswap", 4); + KinkyDungeonSetEnemyFlag(ee, "fidget", 0); + } else if (move == 0) { + return false; + } + } else if (KinkyDungeonEntityAt(enemy.x + Direction.x, enemy.y + Direction.y)?.player) { + if (KDPlayerCanMove(KinkyDungeonEntityAt(enemy.x + Direction.x, enemy.y + Direction.y), + enemy.x + Direction.x, enemy.y + Direction.y)) { + KDMovePlayer(enemy.x, enemy.y, false, false, false, true); + } else { + return false; + } + } + if (!ee || !KinkyDungeonEnemyAt(enemy.x + Direction.x, enemy.y + Direction.y)) { + KDMoveEntity(enemy, enemy.x + Direction.x, enemy.y + Direction.y, true,undefined, undefined, true); + KinkyDungeonSetEnemyFlag(enemy, "nofidget", 3); + } + + if (KinkyDungeonMapGet(x, y) == 'D' && enemy.Enemy && enemy.Enemy.tags.opendoors) { + KinkyDungeonMapSet(x, y, 'd'); + if (KinkyDungeonTilesGet(x + ',' +y)?.Lock + && KinkyDungeonTilesGet(x + ',' +y).Type == "Door" + && KDShouldUnLock(x, y, KinkyDungeonTilesGet(x + ',' +y))) { + KinkyDungeonTilesGet(x + ',' +y).OGLock = KinkyDungeonTilesGet(x + ',' +y).Lock; + + if (KinkyDungeonTilesGet(x + "," + y).LockSeen) + KinkyDungeonTilesGet(x + "," + y).LockSeen = + KinkyDungeonTilesGet(x + ',' +y).Lock; + KinkyDungeonTilesGet(x + ',' +y).Lock = undefined; + } + if (dist < 5) { + KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonHearDoorOpenNear"), "#dddddd", 4, + false, false, undefined, "Ambient"); + } else if (dist < 15) + KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonHearDoorOpenFar"), "#999999", 4, + false, false, undefined, "Ambient"); + } + + return true; + } + return false; +} + +function KinkyDungeonEnemyTryAttack ( + enemy: entity, + player: any, + Tiles: any, + delta: number, + _x: number, + _y: number, + points: number, + _replace: any, + _msgColor: any, + _usingSpecial: boolean, + refreshWarningTiles: boolean, + attack: string, + MovableTiles: string +): boolean +{ + if (!enemy.Enemy.noCancelAttack && !refreshWarningTiles && points > 1) { + let playerIn = false; + for (let T = 0; T < Tiles.length; T++) { + let ax = enemy.x + Tiles[T].x; + let ay = enemy.y + Tiles[T].y; + + if (player.x == ax && player.y == ay && (!enemy.Enemy.strictAttackLOS || KinkyDungeonCheckProjectileClearance(enemy.x, enemy.y, player.x, player.y, false))) { + playerIn = true; + break; + } + } + + if (!playerIn && Tiles.length > 0) { + if (enemy.Enemy.specialRange && enemy.usingSpecial && enemy.Enemy.specialCDonAttack) { + enemy.specialCD = enemy.Enemy.specialCD; + enemy.attackPoints = 0; + enemy.warningTiles = []; + enemy.usingSpecial = false; + if (enemy.Enemy.stunOnSpecialCD) enemy.stun = enemy.Enemy.stunOnSpecialCD; + if (attack.includes("Dash") && !enemy.Enemy.Dash?.noDashOnSidestep) { + KDDash(enemy, player, MovableTiles); + } + return false; + } + if (enemy.Enemy.specialWidth && enemy.usingSpecial && enemy.Enemy.specialCDonAttack) { + enemy.specialCD = enemy.Enemy.specialCD; + enemy.attackPoints = 0; + enemy.warningTiles = []; + enemy.usingSpecial = false; + if (enemy.Enemy.stunOnSpecialCD) enemy.stun = enemy.Enemy.stunOnSpecialCD; + if (attack.includes("Dash") && !enemy.Enemy.Dash?.noDashOnSidestep) { + KDDash(enemy, player, MovableTiles); + } + return false; + } + } + } + + if (player?.player && !KinkyDungeonFlags.get("tut_dodge")) { + KinkyDungeonSetFlag("tut_dodge", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Dodge"), KDTutorialColor, 10); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Dodge2"), KDTutorialColor, 10); + } + + enemy.attackPoints += delta * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(enemy.buffs, "AttackSpeed")); + if (enemy.attackBonus) { + enemy.attackPoints += enemy.attackBonus * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(enemy.buffs, "AttackSpeed")); + enemy.attackBonus = 0; + } + if (!enemy.playWithPlayer) + KinkyDungeonSetFlag("NPCCombat", 3); + + if (enemy.attackPoints >= points) { + enemy.attackPoints = enemy.attackPoints - points; + return true; + } + return false; +} + +type warningTileEntry = { + x: number; + y: number; + visual_x: number; + visual_y: number; + scale: number; +} + +function KinkyDungeonGetWarningTilesAdj(enemy: entity): warningTileEntry[] { + let arr: warningTileEntry[] = []; + + arr.push({x:1, y:1, visual_x:enemy.x, visual_y:enemy.y, scale: 0}); + arr.push({x:0, y:1, visual_x:enemy.x, visual_y:enemy.y, scale: 0}); + arr.push({x:1, y:0, visual_x:enemy.x, visual_y:enemy.y, scale: 0}); + arr.push({x:-1, y:-1, visual_x:enemy.x, visual_y:enemy.y, scale: 0}); + arr.push({x:-1, y:1, visual_x:enemy.x, visual_y:enemy.y, scale: 0}); + arr.push({x:1, y:-1, visual_x:enemy.x, visual_y:enemy.y, scale: 0}); + arr.push({x:-1, y:0, visual_x:enemy.x, visual_y:enemy.y, scale: 0}); + arr.push({x:0, y:-1, visual_x:enemy.x, visual_y:enemy.y, scale: 0}); + + return arr; +} + + +/** + * Returns whether or not the player can be pickpocketed + * Current conditions are: + * - Player has less than 50 willpower + * @param player + */ +function KDCanPickpocketPlayer(_player: entity): boolean { + return !KinkyDungeonHasWill(5) || KDIsPlayerTethered(KinkyDungeonPlayerEntity); +} + +function KDCanPickpocket(enemy: entity) { + if (enemy.Enemy.attack?.includes("Suicide")) return false; + if (KDEnemyHasFlag(enemy, "allyPlay")) return false; + if (KinkyDungeonFlags.has("pickpocket")) return false; + if (KDAllied(enemy)) return false; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).enclose) return false; + } + return KDHostile(enemy) || ((KDGameData.PrisonerState == 'jail' || KDGameData.PrisonerState == 'parole') && KinkyDungeonPlayerTags.has("Furniture")); +} + + +function KinkyDungeonGetWarningTiles(dx: number, dy: number, range: number, width: number, forwardOffset: number = 1, enemy: entity): warningTileEntry[] { + if (range == 1 && width == 8) return KinkyDungeonGetWarningTilesAdj(enemy); + + let arr: warningTileEntry[] = []; + /* + let cone = 0.78539816 * (width-0.9)/2; + let angle_player = Math.atan2(dx, dy) + ((width % 2 == 0) ? ((KDRandom() > 0.5) ? -0.39269908 : 39269908) : 0); + if (angle_player > Math.PI) angle_player -= Math.PI; + if (angle_player < -Math.PI) angle_player += Math.PI; + + for (let X = -range; X <= range; X++) + for (let Y = -range; Y <= range; Y++) { + let angle = Math.atan2(X, Y); + + let angleDiff = angle - angle_player; + angleDiff += (angleDiff>Math.PI) ? -2*Math.PI : (angleDiff<-Math.PI) ? 2*Math.PI : 0; + + if (Math.abs(angleDiff) < cone + 0.22/Math.max(Math.abs(X), Math.abs(Y)) && Math.sqrt(X*X + Y*Y) < range + 0.5) arr.push({x:X, y:Y}); + } + */ + let dist = Math.sqrt(dx*dx + dy*dy); + let radius = Math.ceil(width/2); + if (dist > 0) { + let x_step = dx/dist; + let y_step = dy/dist; + + for (let d = forwardOffset; d <= range; d++) { + let xx = x_step * d; + let yy = y_step * d; + for (let X = Math.floor(xx-radius); X <= Math.ceil(xx+radius); X++) + for (let Y = Math.floor(yy-radius); Y <= Math.ceil(yy+radius); Y++) { + let dd = Math.sqrt((X - xx)*(X - xx) + (Y - yy)*(Y - yy)); + let dd2 = Math.sqrt(X*X+Y*Y); + if (dd < width*0.49 && dd2 < range + 0.5) { + let dupe = false; + for (let a of arr) { + if (a.x == X && a.y == Y) {dupe = true; break;} + } + if (!dupe) arr.push({x:X, y:Y, visual_x:enemy.x, visual_y:enemy.y, scale: 0}); + } + } + } + } + + return arr; +} + +/** + * @param enemy + */ +function KinkyDungeonFindMaster(enemy: entity): { master: entity; dist: number; info: any; } { + let findMaster = undefined; + let masterDist = 1000; + let masterInfo = enemy.master || enemy.Enemy.master; + if (masterInfo) { + for (let e of KDMapData.Entities) { + if (e.Enemy.name == masterInfo.type || (masterInfo.masterTag && e.Enemy.tags && e.Enemy.tags[masterInfo.masterTag])) { + let dist = Math.sqrt((e.x - enemy.x) * (e.x - enemy.x) + (e.y - enemy.y)*(e.y - enemy.y)); + if ((!masterInfo.maxDist || dist < masterInfo.maxDist) + && dist < masterDist + && (!masterInfo.loose || KinkyDungeonCheckLOS(enemy, e, dist, 100, false, false))) { + masterDist = Math.sqrt((e.x - enemy.x) * (e.x - enemy.x) + (e.y - enemy.y)*(e.y - enemy.y)); + findMaster = e; + } + } + } + } else { + let checkDist = 4; + let closestmaster: entity = null; + if (KDEntityHasFlag(enemy, "led")) checkDist = 10; + let closestdist = checkDist + 1; + let nearby = KDNearbyEnemies(enemy.x, enemy.y, checkDist, undefined, true, enemy); + for (let en of nearby) { + if (KDGetFaction(enemy) == KDGetFaction(en)) { + let rankDiff = KDEnemyRank(en) - KDEnemyRank(enemy); + if (KDEntityHasFlag(en, "leader")) rankDiff += 2; + if (rankDiff >= 2) { + let dd = KDistChebyshev(en.x - enemy.x, en.y - enemy.y); + if (dd < closestdist) { + closestmaster = en; + closestdist = dd; + } + } + } + } + if (closestmaster) { + return {master: closestmaster, dist: closestdist, info: undefined}; + } + } + return {master: findMaster, dist: masterDist, info: masterInfo}; +} + +function KinkyDungeonEnemyCanMove(enemy: entity, dir: { x: number, y: number, delta: number }, MovableTiles: string, AvoidTiles: string, ignoreLocks: boolean, Tries: number) { + if (!dir) return false; + let master = enemy.master || enemy.Enemy.master; + let xx = enemy.x + dir.x; + let yy = enemy.y + dir.y; + if (master && (!master.aggressive || !enemy.aware || enemy.ignore)) { + let fm = KinkyDungeonFindMaster(enemy); + let findMaster = fm.master; + let masterDist = fm.dist; + if (findMaster) { + if (Math.sqrt((xx - findMaster.x) * (xx - findMaster.x) + (yy - findMaster.y) * (yy - findMaster.y)) > master.range + && Math.sqrt((xx - findMaster.x) * (xx - findMaster.x) + (yy - findMaster.y) * (yy - findMaster.y)) > masterDist) return false; + } + } + return MovableTiles.includes(KinkyDungeonMapGet(xx, yy)) && ((Tries && Tries > 5) || !AvoidTiles.includes(KinkyDungeonMapGet(enemy.x + dir.x, enemy.y + dir.y))) + && (ignoreLocks || !KinkyDungeonTilesGet((xx) + "," + (yy)) || !(KinkyDungeonTilesGet((xx) + "," + (yy)).Lock)) + && KinkyDungeonNoEnemyExceptSub(xx, yy, !KinkyDungeonLeashingEnemy(), enemy); +} + +/** + * @param id + * @param [mapData] + * @returns {entity} + */ +function KinkyDungeonFindID(id: number, mapData?: KDMapDataType): entity { + if (!mapData || mapData == KDMapData) { + if (KDIDCache.get(id)) return KDIDCache.get(id); + for (let e of KDMapData.Entities) { + if (e.id == id) return e; + } + } else { + for (let e of mapData.Entities) { + if (e.id == id) return e; + } + } + return null; +} + +/** + * + * @param {number} id + * @returns {entity} + */ +function KDLookupID(id: number, allowPlayer: boolean = true): entity { + if (allowPlayer && id == -1) return KDPlayer(); + if (KDIDCache.get(id)) return KDIDCache.get(id); + for (let e of KDMapData.Entities) { + if (e.id == id) return e; + } + return null; +} + +function KDDash(enemy: entity, player: entity, MovableTiles: string): { happened: number, Dash: boolean } { + let happened = 0; + let Dash = false; + // Check player neighbor tiles + let tiles = []; + for (let X = player.x-1; X <= player.x+1; X++) + for (let Y = player.y-1; Y <= player.y+1; Y++) { + let tile = KinkyDungeonMapGet(X, Y); + if ((X != 0 || Y != 0) && !(!KinkyDungeonNoEnemy(X, Y, true) || !MovableTiles.includes(tile) || (tile == 'D' && !enemy.Enemy.ethereal))) { + tiles.push({x:X, y:Y}); + } + } + if (tiles.length > 0) { + let tile = tiles[Math.floor(KDRandom()*tiles.length)]; + if (enemy.Enemy.dashThrough) { + let tiled = 0; + for (let t of tiles) { + let dist = Math.sqrt((enemy.x - t.x)*(enemy.x - t.x) + (enemy.y - t.y)*(enemy.y - t.y)); + if (dist > tiled) { + tile = t; + tiled = dist; + } + } + } else { + let tiled = Math.sqrt((enemy.x - tile.x)*(enemy.x - tile.x) + (enemy.y - tile.y)*(enemy.y - tile.y)); + for (let t of tiles) { + let dist = Math.sqrt((enemy.x - t.x)*(enemy.x - t.x) + (enemy.y - t.y)*(enemy.y - t.y)); + if (dist < tiled) { + tile = t; + tiled = dist; + } + } + } + if (tile && (tile.x != player.x || tile.y != player.y) && (tile.x != KinkyDungeonPlayerEntity.x || tile.y != KinkyDungeonPlayerEntity.y) && MovableTiles.includes(KinkyDungeonMapGet(tile.x, tile.y))) { + Dash = true; + KDMoveEntity(enemy, tile.x, tile.y, true); + enemy.movePoints = 0; + enemy.path = null; + happened += 1; + if (enemy.usingSpecial && enemy.Enemy.specialAttack != undefined && enemy.Enemy.specialAttack.includes("Dash")) { + enemy.specialCD = enemy.Enemy.specialCD; + } + } + } + return {happened: happened, Dash: Dash}; +} + +function KinkyDungeonSendEnemyEvent(Event: string, data: any) { + if (!KDMapHasEvent(KDEventMapEnemy, Event)) return; + KDGetEnemyCache(); + if (KDEnemyEventCache.get(Event)) + for (let enemy of KDMapData.Entities) { + if (enemy.Enemy.events && KDEnemyEventCache.get(Event)?.get(enemy.id)) { + for (let e of enemy.Enemy.events) { + if (e.trigger === Event) { + KinkyDungeonHandleEnemyEvent(Event, e, enemy, data); + } + } + } + } +} + + +/** + * @param enemy + * @param data + * @param play + * @param allied + * @param hostile + * @param aggressive + */ +function KDGetIntentEvent(enemy: entity, data: any, play: boolean, allied: boolean, hostile: boolean, aggressive: boolean): (enemy: entity, aiData: KDAIData) => void { + let eventWeightTotal = 0; + let eventWeights = []; + + for (let event of Object.values(KDIntentEvents)) { + if (((event.aggressive && aggressive) || (event.nonaggressive && !aggressive)) + && (!event.play || play) + && (!event.noplay || !play)) { + eventWeights.push({event: event, weight: eventWeightTotal}); + eventWeightTotal += event.weight(enemy, data, allied, hostile, aggressive); + } + } + + let selection = KDRandom() * eventWeightTotal; + + for (let L = eventWeights.length - 1; L >= 0; L--) { + if (selection > eventWeights[L].weight) { + return eventWeights[L].event.trigger; + } + } + return (_e, _a) => {}; +} + +/** + * @param enemy + * @param target + */ +function KDGetDir(enemy: entity, target: any, func: typeof KinkyDungeonGetDirectionRandom = KinkyDungeonGetDirectionRandom): { x: number, y: number, delta: number } { + return (enemy.fx && enemy.fy) ? + AIData.kite ? func(enemy.x - target.x, enemy.y - target.y) : {x: Math.max(-1, Math.min(1, enemy.fx - enemy.x)), y: Math.max(-1, Math.min(1, enemy.fy - enemy.y)), delta: 1} : + (AIData.kite ? func(enemy.x - target.x, enemy.y - target.y) : func(target.x - enemy.x, target.y - enemy.y)); +} + + +/** + * @param enemy + */ +function KDPullResistance(enemy: entity): number { + let tags = enemy?.Enemy?.tags; + if (!tags) return; + return tags.unstoppable ? 0.25 : (tags.unflinching ? 0.5 : 1.0); +} + +/** + * @param power + * @param enemy + * @param [allowNeg] + */ +function KDPushModifier(power: number, enemy: entity, allowNeg: boolean = false): number { + let pushPower = power; + if (KinkyDungeonIsSlowed(enemy) || enemy.bind > 0) pushPower += 1; + if (KDEntityHasBuff(enemy, "Chilled")) pushPower += 1; + if (enemy.freeze) pushPower += 3; + if (KDEntityBuffedStat(enemy, "Knockback")) pushPower += KDEntityBuffedStat(enemy, "Knockback"); + if (enemy.Enemy.tags.stunimmune) pushPower -= 2; + else if (enemy.Enemy.tags.stunresist) pushPower -= 1; + if (enemy.Enemy.tags.unstoppable) pushPower -= 3; + else if (enemy.Enemy.tags.unflinching || enemy.Enemy.tags.slowresist || enemy.Enemy.tags.slowimmune) pushPower -= 1; + if (allowNeg) return pushPower; + return Math.max(0, pushPower); +} + +/** + * @param enemy + * @param amount + * @param [type] + * @param [Damage] + * @param [Msg] + * @param [Delay] + */ +function KDTieUpEnemy(enemy: entity, amount: number, type: string = "Leather", Damage?: any, Msg?: any, Delay?: any): any { + if (!enemy) return 0; + let data = { + amount: amount, + specialAmount: amount, + type: type, // Type of BONDAGE, e.g. leather, rope, etc + Damage: Damage, + Msg: Msg, + amntAdded: 0, + }; + + KinkyDungeonSendEvent("bindEnemy", data); + + if (data.type) { + if (!enemy.specialBoundLevel) + enemy.specialBoundLevel = {}; + let orig = enemy.specialBoundLevel[type] || 0; + enemy.specialBoundLevel[type] = Math.max(0, (enemy.specialBoundLevel[type] || 0) + data.specialAmount); + data.amntAdded = (enemy.specialBoundLevel[type] || 0) - orig; + } + if (data.amount || data.amntAdded != undefined) { + enemy.boundLevel = Math.max(0, (enemy.boundLevel || 0) + (data.amntAdded != undefined ? data.amntAdded : data.amount)); + KDApplyBindStun(enemy, data.amntAdded); + } + + if (data.Msg) { + KDDamageQueue.push({floater: TextGet("KDTieUp").replace("AMNT", + Math.round((data.amntAdded != undefined ? data.amntAdded : data.amount)*10) + ""), + Entity: enemy, Color: "#ff8933", Delay: Delay}); + } + + return data; +} + +/** + * @param enemy + * @param struggleMod + * @param delta + * @param [allowStruggleAlwaysThresh] + */ +function KDPredictStruggle(enemy: entity, struggleMod: number, delta: number, allowStruggleAlwaysThresh?: number): any { + let data = { + enemy: enemy, + struggleMod: struggleMod, + delta: delta, + boundLevel: enemy.boundLevel || 0, + specialBoundLevel: enemy.specialBoundLevel ? Object.assign({}, enemy.specialBoundLevel): {}, + minBoundAmounts: {}, + minBoundLevel: 0, + }; + + if (allowStruggleAlwaysThresh && enemy.boundLevel > enemy.Enemy.maxhp * allowStruggleAlwaysThresh) { + // In this block we limit the NPC from struggling below any certain amount limited by restraints, but only if the total binding is above the restraint level + // Note that if this gets below the expected amount then the NPC can get totally free + let expected = KDGetExpectedBondageAmount(enemy.id, enemy); + for (let bt of Object.entries(expected)) { + data.minBoundAmounts[bt[0]] = (data.minBoundAmounts[bt[0]] || 0) + bt[1]; + data.minBoundLevel += bt[1]; + } + } + + // Reduce to delta amount; + data.struggleMod *= data.delta; + + if (enemy.bindStun > 0) + data.struggleMod = Math.max(0, data.struggleMod - 0.01*enemy.bindStun) + + let minLevel = Math.max(data.minBoundLevel, + (enemy.buffs && KinkyDungeonGetBuffedStat(enemy.buffs, "MinBoundLevel")) + ? KinkyDungeonGetBuffedStat(enemy.buffs, "MinBoundLevel") + : 0); + + if (Object.keys(data.specialBoundLevel).length < 1) { + // Simple math, reduce bound level, dont have to worry. + data.struggleMod *= (10 + Math.pow(Math.max(0.01, enemy.hp ** KDEnemyStruggleHPExp), 0.75)); + //data.struggleMod = Math.max(data.struggleMod - (enemy.bindStun || 0), 0); + data.boundLevel = Math.max(Math.min(Math.max(0, data.boundLevel), minLevel), data.boundLevel - data.struggleMod); + } else { + // We go layer by layer + let bondage = Object.entries(data.specialBoundLevel); + bondage = bondage.sort((a, b) => { + return KDSpecialBondage[a[0]].priority - KDSpecialBondage[b[0]].priority; + }); + // These are the base resources, we exhaust till they are out + data.struggleMod *= 2; + //data.struggleMod = Math.max(data.struggleMod - (enemy.bindStun || 0), 0); + + let i = 0; + while (i < bondage.length + && data.struggleMod > 0 + && data.boundLevel > 0) { + let layer = bondage[i]; + let type = KDSpecialBondage[layer[0]]; + let hBoost = type.healthStruggleBoost; + let pBoost = type.powerStruggleBoost; + let mBoost = type.mageStruggleBoost; + let sr = type.struggleRate; + + if (sr <= 0) { + i = bondage.length; + // We are done, cant struggle past here + } + // Otherwise + let totalCost = layer[1] / sr; + if (enemy.hp > 1) + totalCost *= 10/(10 + hBoost * Math.pow(enemy.hp, 0.9)); + totalCost *= 3/(3 + (pBoost * enemy.Enemy.power || 0)); + totalCost *= 2/(2 + (mBoost * enemy.Enemy.unlockCommandLevel || 0)); + + let effect = Math.min(data.struggleMod, totalCost); + let difference = layer[1] * (totalCost ? (effect / totalCost) : 1); + let origBL = data.boundLevel; + data.boundLevel = Math.max(minLevel, data.boundLevel - difference); + data.specialBoundLevel[layer[0]] -= Math.max(0, origBL - data.boundLevel); + + if (data.minBoundAmounts[layer[0]] && data.specialBoundLevel[layer[0]] <= data.minBoundAmounts[layer[0]]) { + if (data.specialBoundLevel[layer[0]] < data.minBoundAmounts[layer[0]]) { + data.struggleMod -= effect; + data.specialBoundLevel[layer[0]] = data.minBoundAmounts[layer[0]]; + } + // No struggle mod change + } else { + data.struggleMod -= effect; + } + if (data.specialBoundLevel[layer[0]] <= 0) delete data.specialBoundLevel[layer[0]]; + if (data.struggleMod <= 0) data.struggleMod = 0; + i++; + } + // We can only struggle as much as the current struggle layer + // If we have complicated types we have to do advanced differential calculus + } + + return data; +} + +let KDDomThresh_Loose = 0.5; +let KDDomThresh_Normal = 0.0; +let KDDomThresh_Strict = -0.4; + +let KDDomThresh_Variance = 0.15; // random variance +let KDDomThresh_PerkMod = -0.5; + +function KDSetDomVariance(enemy: entity) { + if (enemy.domVariance == undefined) enemy.domVariance = (KDEnemyPersonalities[enemy.personality]?.domVariance || KDDomThresh_Variance) * (2 * KDRandom() - 1); +} + +/** + * @param enemy - the enemy to check if the player can domme + * @param ignoreRelative - ignore the relative determinants + */ +function KDCanDom(enemy: entity, ignoreRelative: boolean = false): boolean { + if (!ignoreRelative) { + if ((enemy == KinkyDungeonJailGuard() || enemy == KinkyDungeonLeashingEnemy())) return false; + if (KDGameData.KinkyDungeonLeashedPlayer > 0) return false; + } + if (!enemy.Enemy.bound) return false; + if (KDEnemyHasFlag(enemy, "isSubbing")) return true; + if (KDEnemyHasFlag(enemy, "isDomming")) return false; + if (enemy.Enemy.tags.nosub) return false; + if (!ignoreRelative) { + if (KinkyDungeonIsArmsBoundFast(false, true) + || KinkyDungeonIsHandsBoundFast(false, true) + || KDIsGaggedFast()) return false; + } + KDSetDomVariance(enemy); + let modifier = (KinkyDungeonGoddessRep.Ghost + 50)/100 + enemy.domVariance; + if (!ignoreRelative) { + if (KinkyDungeonStatsChoice.get("Dominant")) modifier += KDDomThresh_PerkMod; + } + if (KDEnemyPersonalities[enemy.personality] && KDEnemyPersonalities[enemy.personality].domThresh) return modifier <= KDEnemyPersonalities[enemy.personality].domThresh; + if (KDLoosePersonalities.includes(enemy.personality)) return modifier <= KDDomThresh_Loose; + if (KDStrictPersonalities.includes(enemy.personality)) return modifier <= KDDomThresh_Strict; + + if (!ignoreRelative) { + if (KDPlayerIsNotDom()) return false; + } + return modifier <= KDDomThresh_Normal; +} + +/** + * Returns true if any non-dominant activities are currently being performed on the player which compromises their ability to dominate + */ +function KDPlayerIsNotDom(): boolean { + return KDGameData.KinkyDungeonLeashedPlayer > 1 || KinkyDungeonStatsChoice.get("Submissive") || KDPlayerIsTied(); +} +/** + * Returns true if player has any level of bondage + */ +function KDPlayerIsTied(): boolean { + return KinkyDungeonSlowLevel > 1 + || KDIsGaggedFast() + || KinkyDungeonIsArmsBoundFast() + || KinkyDungeonIsHandsBoundFast() ; +} + + +/** + * is this entity objectively subby + * @param entity + */ +function KDIsSubbyPersonality(entity: entity): boolean { + if (entity && !entity.player) { + if (KDCanDom(entity, true)) return true; + } + return false; +} + +/** + * is this entity objectively bratty + * @param entity + */ +function KDIsBrattyPersonality(entity: entity): boolean { + if (entity && !entity.player) { + if (KDIsSubbyPersonality(entity) && KinkyDungeonStatsChoice.get("OnlyBrats")) return true; + if (KDEnemyPersonalities[entity.personality]?.brat || KDEnemyHasFlag(entity, "forcebrat")) return true; + } + return false; +} + +/** + * Is this entity bratty to the player + * @param enemy + */ +function KDIsBrat(enemy: entity): boolean { + if (KinkyDungeonStatsChoice.get("OnlyBrats")) return true; + if (KinkyDungeonStatsChoice.get("NoBrats")) return false; + if (!KDEnemyPersonalities[enemy.personality]?.brat && !KDEnemyHasFlag(enemy, "forcebrat")) return false; + if (KDPlayerIsNotDom()) return false; + return true; +} + +/** + * Captures helpless enemies near the enemy + * @param enemy + */ +function KDCaptureNearby(enemy: entity, noParty: boolean = false) { + let enemies = KDNearbyEnemies(enemy.x, enemy.y, 1.5, enemy); + for (let en of enemies) { + if (KDHelpless(en) && en.hp < 0.52 && (!noParty || KDCanCapturePartyMember(en))) { + en.hp = 0; + } + } +} + +function KDCanCapturePartyMember(en: entity): boolean { + if (KDIsImprisoned(en)) return false; + return !KDIsInPartyID(en.id) || !(KinkyDungeonVisionGet(en.x, en.y) > 0.1 || KDistChebyshev( + en.x - KDPlayer().x, en.y - KDPlayer().y + ) <= 6); +} + +/** + * @param enemy + * @param guaranteed + */ +function KinkyDungeonGetLoadoutForEnemy(enemy: entity, guaranteed: boolean): string { + if (enemy.Enemy.tags.noshop) return ""; + let loadout_list: Record = {}; + for (let s of Object.values(KDLoadouts)) { + let end = false; + if (s.tags) { + for (let t of s.tags) { + if (!enemy.Enemy.tags[t]) { + end = true; + break; + } + } + } + if (s.forbidtags) { + for (let t of s.forbidtags) { + if (enemy.Enemy.tags[t]) { + end = true; + break; + } + } + } + let hasTag = !s.singletag; + if (!end && s.singletag) { + for (let t of s.singletag) { + if (enemy.Enemy.tags[t]) { + hasTag = true; + break; + } + } + } + let hasTag2 = !s.singletag2; + if (!end && s.singletag2) { + for (let t of s.singletag2) { + if (enemy.Enemy.tags[t]) { + hasTag = true; + break; + } + } + } + if (!hasTag) end = true; + if (!hasTag2) end = true; + if (!end) { // (guaranteed || !s.chance || KDRandom() < s.chance) + /*for (let i = 0; i < (s.multiplier || 1); i++) + loadout_list.push(s.name);*/ + loadout_list[s.name] = (s. chance || 1) * (s.multiplier || 1); + } + } + if (!guaranteed) { + loadout_list.Null = 1; + } + //if (Object.entries() > 0) { + let ret = KDGetByWeight(loadout_list); + if (ret != "Null") return ret; + //} + //return loadout_list[Math.floor(KDRandom() * loadout_list.length)]; + return ""; +} + +/** + * Gets the text for a key, suffixed with the enemy faction or name if available. Otherwise falls back to just the key + * @param key - The base text key + * @param enemy - The enemy + * @param useName - Whether to use the enemy name or faction + */ +function KinkyDungeonGetTextForEnemy(key: string, enemy: entity, useName: boolean = false): string { + const enemyKey = `${key}${useName ? enemy.Enemy.name : enemy.Enemy.faction}`; + let text = TextGet(enemyKey); + if (!text || text.endsWith(enemyKey)) { + // Couldn't find enemy-specific text - fall back to just the key + text = TextGet(key); + } + return text; +} + + +function KDPlayerIsDefeated() { + return KinkyDungeonFlags.get("playerDefeated"); +} + +function KDPlayerIsDisabled() { + return KinkyDungeonFlags.get("playerDisabled") + || (KinkyDungeonStatBlind > 0 || KinkyDungeonStatBind > 0 || KinkyDungeonStatFreeze > 0 || (KinkyDungeonFlags.get("playerStun") && !KinkyDungeonFlags.get("channeling")) || KDGameData.SleepTurns > 0); +} + +function KDPlayerIsStunned() { + return KinkyDungeonStatBlind > 0 || KinkyDungeonFlags.get("playerStun") || KDGameData.SleepTurns > 0 || KinkyDungeonStatFreeze > 0; +} +function KDPlayerIsImmobilized() { + return KinkyDungeonSlowLevel > 9 || KinkyDungeonGetRestraintItem("ItemDevices"); +} + +function KDPlayerIsSlowed() { + return KinkyDungeonSlowLevel > 1 || KDPlayerIsStunned() || KinkyDungeonSleepiness > 0 + || (KDGameData.MovePoints < 0 || KDGameData.KneelTurns > 0); +} + + +function KDEnemyReallyAware(enemy: entity, player: any): boolean { + return (enemy.aware && (!player?.player || enemy.vp > 0.5)); +} + +/** + * @param enemy + */ +function KDGetAwareTooltip(enemy: entity): {suff: string, color: string} { + if (KDGameData.CurrentDialog && KDGetSpeaker() == enemy && (enemy.aware || enemy.vp > 2)) return { + suff: "Talking", + color: "#ffffff", + }; + if (KDEnemyReallyAware(enemy, KinkyDungeonPlayerEntity)) { + if (KDHostile(enemy)) { + if (enemy.ignore) return { + suff: "AwareIgnore", + color: "#ffff55", + }; + return { + suff: "Aware", + color: "#ff5277", + }; + } else return { + suff: "AwareFriendly", + color: "#ffffff", + }; + } + if (enemy.aware && enemy.ignore) return { + suff: "AwareIgnore", + color: "#ffff55", + }; + if (enemy.vp > 2) return { + suff: "DangerHigh", + color: "#ff5277", + }; + if (enemy.vp > 0.5) return { + suff: "Danger", + color: "#ffaa55", + }; + if (enemy.vp > 0) return { + suff: "Suspicious", + color: "#f0dc41", + }; + return { + suff: "Unnoticed", + color: "#88ff88", + }; +} + +/** + * @param lock + */ +function KDProcessLock(lock: string): string { + if (lock == "Red") return KDRandomizeRedLock(); + else return lock; +} + + +let KDDefaultRestraintThresh = 3; + +/** + * @param enemy + * @param restMult + */ +function KDRestockRestraints(enemy: entity, restMult: number) { + if ((enemy.Enemy.attack?.includes("Bind") || enemy.Enemy.specialAttack?.includes("Bind")) + && !enemy.Enemy.RestraintFilter?.noRestock && !KDEnemyHasFlag(enemy, "restocked")) { + let rCount = KDDetermineBaseRestCount(enemy, restMult); + if ((enemy.items?.length || 0) < rCount) { + KDStockRestraints(enemy, restMult, rCount - (enemy.items?.length || 0)); + KinkyDungeonSetEnemyFlag(enemy, "restocked", 200); + } + if (enemy.Enemy.RestraintFilter?.requiredItems) { + if (!enemy.items) enemy.items = []; + for (let item of enemy.Enemy.RestraintFilter?.requiredItems) { + if (!enemy.items.includes(item)) enemy.items.unshift(item); + } + } + } +} + +/** + * @param enemy + * @param restMult + */ +function KDDetermineBaseRestCount(enemy: entity, restMult: number): number { + let rCount = 1; + if (enemy.Enemy.RestraintFilter?.unlimitedRestraints && !enemy.Enemy.RestraintFilter?.forceStock) + return 0; + if (enemy.Enemy.tags.boss) rCount += 6; + else if (enemy.Enemy.tags.miniboss) rCount += 3; + else if (enemy.Enemy.tags.elite) rCount += 2; + else if (!enemy.Enemy.tags.minor) rCount += 1; + if (enemy.Enemy.RestraintFilter?.bonusRestraints) rCount += enemy.Enemy.RestraintFilter?.bonusRestraints; + if (KinkyDungeonStatsChoice.has("TightRestraints")) { + rCount *= 2; + rCount += 1; + } + return Math.ceil(rCount * restMult); +} + +/** + * @param enemy + * @param restMult + * @param [count] + */ +function KDStockRestraints(enemy: entity, restMult: number, count?: number) { + if (!enemy.items) enemy.items = []; + let rCount = count || KDDetermineBaseRestCount(enemy, restMult); + let rThresh = enemy.Enemy.RestraintFilter?.powerThresh || (KDDefaultRestraintThresh + (Math.max(0, enemy.Enemy.power - 1) || 0)); + if (rCount > 0) enemy.items = enemy.items || []; + for (let i = 0; i < rCount; i++) { + let r = KDGetRestraintWithVariants( + {tags: KDGetTags(enemy, false)}, KDGetEffLevel() + (enemy.Enemy.RestraintFilter?.levelBonus || enemy.Enemy.power || 0), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + enemy.Enemy.bypass, + enemy.Enemy.useLock ? enemy.Enemy.useLock : "", + false, + false, + false, + KDGetExtraTags(enemy, true, i < 3 && ( + KDEnemyIsTemporary(enemy) ? enemy.tempitems?.length < 3 + : enemy.items?.length < 3 + )), + true, + { + minPower: rThresh, + noUnlimited: !enemy.Enemy.RestraintFilter?.limitedRestraintsOnly, + onlyLimited: enemy.Enemy.RestraintFilter?.limitedRestraintsOnly,//!enemy.Enemy.RestraintFilter?.invRestraintsOnly, + looseLimit: !enemy.Enemy.RestraintFilter?.limitedRestraintsOnly, + ignore: enemy.items.concat(enemy.Enemy.RestraintFilter?.ignoreInitial || []), + ignoreTags: enemy.Enemy.RestraintFilter?.ignoreInitialTag, + }, undefined, undefined, true, enemy.items); + + if (r) { + let rest = r.r; + enemy.items.push(rest.name); + if (KDEnemyIsTemporary(enemy)) { + if (!enemy.tempitems) enemy.tempitems = []; + enemy.tempitems.push(rest.name); + } + } + } + + if (enemy.Enemy.RestraintFilter?.requiredItems) { + if (!enemy.items) enemy.items = []; + for (let item of enemy.Enemy.RestraintFilter?.requiredItems) { + if (!enemy.items.includes(item)) enemy.items.unshift(item); + } + } +} + +/** + * @param enemy + * @param loadout + */ +function KDSetLoadout(enemy: entity, loadout: string) { + if (loadout) { + let temp = enemy.Enemy.startingItems ? Object.assign([], enemy.Enemy.startingItems) : []; + enemy.items = Object.assign(temp, KDLoadouts[loadout].items); + } + if ((!enemy.Enemy.RestraintFilter?.unlimitedRestraints || enemy.Enemy.RestraintFilter?.requiredItems) + && (enemy.Enemy.attack?.includes("Bind") || enemy.Enemy.RestraintFilter?.requiredItems || enemy.Enemy.specialAttack?.includes("Bind"))) { + let restMult = KDLoadouts[loadout]?.restraintMult || 1; + KDStockRestraints(enemy, restMult); + } +} + +function KDClearItems(enemy: entity) { + if (enemy.items) { + for (let item of enemy.items) { + KDAddLostItemSingle(item); + } + enemy.items = undefined; + } +} + +/** + * @param item + * @param quantity + */ +function KDAddLostItemSingle(item: string, _quantity: number = 1): boolean { + if (KDWeapon({name: item})) { + KinkyDungeonAddLostItems([{name: item, type: Weapon, id: KinkyDungeonGetItemID()}], false); + return true; + } else if (KDRestraint({name: item}) && ( + KinkyDungeonRestraintVariants[item] + || (KDRestraint({name: item}).armor && !KDRestraint({name: item})?.noRecover) + || KDRestraintSpecial({name: item}))) { + KinkyDungeonAddLostItems([{name: item, type: LooseRestraint, events: KDGetEventsForRestraint(item), quantity: 1, id: KinkyDungeonGetItemID()}], false); + return true; + } else if (KDConsumable({name: item})) { + KinkyDungeonAddLostItems([{name: item, type: Consumable, quantity: 1, id: KinkyDungeonGetItemID()}], false); + return true; + } + return false; +} + +/** + * @param enemy + * @param player + * @param [allowBlind] + */ +function KDCanDetect(enemy: entity, player: entity, allowBlind: boolean = false): boolean { + if (player?.player != true) { + return KinkyDungeonCheckLOS(enemy, player, 1, 10, true, true, 2); + } + let invisibility = KDEntityBuffedStat(player, "Invisible"); + return (KinkyDungeonTrackSneak(enemy, 0, player) > 0.99 || (AIData.playerDist < Math.max(1.5 - invisibility, allowBlind ? AIData.blindSight : 0) && ((enemy.vp > 0.1 && enemy.aware) || + (enemy.gx == player.x && enemy.gy == player.y)))); +} + +/** + * @param enemy + * @param type + */ +function KDGetSecurity(enemy: entity, type: string): number { + // Base securities; inherited from BaseSecurity but otherwise populated by the Security matrix of the enemy + let security = KDBaseSecurity[type] != undefined ? KDBaseSecurity[type] : -100; + if (enemy?.Enemy?.Security && enemy.Enemy.Security[type]) + security = enemy.Enemy.Security[type]; + + // Add factional securities + let faction = KDGetFactionOriginal(enemy); + if (KDFactionSecurityMod[faction] && KDFactionSecurityMod[faction][type] != undefined) security = Math.max(security + KDFactionSecurityMod[faction][type], KDFactionSecurityMod[faction][type]); + + // If the enemy is cleared to have security, increase it based on rank + if (security >= -10) { + if (enemy.Enemy.tags.boss) security += 4; + else if (enemy.Enemy.tags.miniboss) security += 3; + else if (enemy.Enemy.tags.elite) security += 2; + else if (!enemy.Enemy.tags.minor) security += 1; + } + return security; +} + +/** + * Reduces the enemy's binding by a certain amount + * @param enemy + * @param bonus + */ +function KDReduceBinding(enemy: entity, bonus: number) { + let bindingPercent = enemy.boundLevel > 0 ? (((Math.max(0, enemy.boundLevel - bonus)) / enemy.boundLevel) || 0) : 0; + enemy.boundLevel = Math.max(0, enemy.boundLevel - bonus); + if (enemy.specialBoundLevel) + for (let key of Object.keys(enemy.specialBoundLevel)) { + enemy.specialBoundLevel[key] *= bindingPercent; + } +} + +/** + * Helper function to determine if a character needs punishing + * @param enemy + * @param player + */ +function KDPlayerDeservesPunishment(_enemy: entity, player: entity): boolean { + if (player.player) { + if (KinkyDungeonFlags.get("PlayerCombat")) return true; + } else { + return true; + } +} + +/** + * @param enemy + */ +function KDPlugEnemy(enemy: entity) { + let plugAmount = KDEntityBuffedStat(enemy, "Plug"); + if (!plugAmount) + KDApplyGenBuffs(enemy, "Plugged", 9999); + else if (plugAmount == 1) { + KinkyDungeonExpireBuff(enemy, "Plugged"); + KDApplyGenBuffs(enemy, "DoublePlugged", 9998); + } +} + +/** + * @param enemy + * @param removeSpecial + */ +function KDGetTags(enemy: entity, removeSpecial: boolean): Record { + /*let addOn = enemy.Enemy.bound ? Object.assign({}, KDExtraEnemyTags) : undefined; + if (addOn) { + + let effLevel = KDGetEffLevel(); + + if (KinkyDungeonStatsChoice.has("TightRestraints")) { + effLevel *= KDTightRestraintsMult; + effLevel += KDTightRestraintsMod; + } + for (let entry of Object.entries(addOn)) { + if (entry[1] > 0 && effLevel < entry[1]) delete addOn[entry[0]]; + else addOn[entry[0]] = true; + } + }*/ + + let tags = Object.assign({}, enemy.Enemy.tags); + //if (addOn) Object.assign(tags, addOn); + if (removeSpecial && enemy.Enemy.specialRemoveTags) { + for (let t of enemy.Enemy.specialRemoveTags) { + delete tags[t]; + } + } + + return tags; +} + +/** + * @param enemy + * @param useSpecial + */ +function KDGetExtraTags(enemy: entity, useSpecial: boolean, useGlobalExtra: boolean): Record { + let addOn: Record = enemy.Enemy.bound ? Object.assign({}, useGlobalExtra ? KDExtraEnemyTags : {}) : undefined; + if (addOn) { + /*let effLevel = KDGetEffLevel(); + + if (KinkyDungeonStatsChoice.has("TightRestraints")) { + effLevel *= KDTightRestraintsMult; + effLevel += KDTightRestraintsMod; + }*/ + //for (let entry of Object.entries(addOn)) { + //if (entry[1] > 0 && effLevel < entry[1]) delete addOn[entry[0]]; + //else + //addOn[entry[0]] = true; + //} + } + + let tags = addOn ? Object.assign({}, addOn) : {}; + if (useSpecial && enemy.Enemy.specialExtraTags) { + for (let t of enemy.Enemy.specialExtraTags) { + tags[t] = 0; + } + } + + return tags; +} + +/** + * @param enemy + * @param faction + * @param restraintsToAdd + * @param blockFunction + * @param [restraintFromInventory] + * @param [spell] + * @param [Lock] + * @param [Keep] + */ +function KDRunBondageResist ( + enemy: entity, + faction: string, + restraintsToAdd: {r: restraint, v: ApplyVariant, iv: string}[], + blockFunction: (r?: any) => void, + restraintFromInventory?: string[], + spell?: spell, + Lock?: string, + Keep?: boolean +): { r:restraint, v: ApplyVariant, iv: string}[] +{ + let restraintblock = KDCalcRestraintBlock(); + let restraintpower = 0; + for (let r of restraintsToAdd) { + if (r) + restraintpower += Math.max(1, r.r.power); + } + let added: { r:restraint, v: ApplyVariant, iv: string}[] = []; + let name = enemy ? TextGet("Name" + enemy.Enemy.name) : (spell ? TextGet("KinkyDungeonSpell" + spell.name) : ""); + if (enemy && ((enemy.Enemy.power * 0.5) || 0) < KDGameData.Shield) { + restraintblock = -1; + } else if (spell && (spell.power*0.5 || 0) < KDGameData.Shield) { + restraintblock = -1; + } else if (KDEntityBuffedStat(KinkyDungeonPlayerEntity, "bondageImmune")) { + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "bondageResist", 1); + restraintblock = -1; + } else if (restraintblock > 0) + restraintblock = KDRestraintBlockPower(restraintblock, restraintpower + (enemy?.Enemy.power || spell?.power || 0)); + if (!restraintblock || KDRandom() < restraintblock) { // lower = FAILING, it gets smaller the more block + let protection = 0; + let multiPower = restraintsToAdd.length; + let targetGroups = {}; + for (let r of restraintsToAdd) { + targetGroups[r.r.Group] = true; + } + // Calculate power of an attack vs protection + let protectRestraints = KinkyDungeonAllRestraint().filter((r) => {return KDRestraint(r).protection > 0;}); + for (let r of protectRestraints) { + if (r && KDRestraint(r).protection + && (KDRestraint(r).protectionTotal || targetGroups[KDRestraint(r).Group]) + && (!KDRestraint(r).protectionCursed || !KDGetCurse(r) || !KDCurses[KDGetCurse(r)].activatecurse)) { + protection += KDRestraint(r).protection; + } + } + + let count = 0; + if (protection >= multiPower) { + for (let r of protectRestraints) { + if (count < multiPower) { + // @ts-ignore + if (KinkyDungeonDropItem({name: r.inventoryVariant || r.inventoryAs || r.name}, KinkyDungeonPlayerEntity, false, true, true)) { + KinkyDungeonRemoveRestraintSpecific(r, false, + undefined, undefined, undefined, undefined, + undefined, true); + KinkyDungeonSendTextMessage( + 5, TextGet("KDArmorBlock") + .replace("ArmorName", KDGetItemName(r)) + .replace("EnemyName", name), + "#ff8933", 1, + false, false, undefined, "Combat"); + } else { + KinkyDungeonSendTextMessage( + 5, TextGet("KDArmorBlockBug") + .replace("ArmorName", KDGetItemName(r)) + .replace("EnemyName", name), + "#ff8933", 1, + false, false, undefined, "Combat"); + } + + + } + count += KDRestraint(r).protection; + } + blockFunction(); + } else { + for (let r of restraintsToAdd) { + let bb = 0; + if (count >= protection) { + if (r.iv && KinkyDungeonRestraintVariants[r.iv]) { + bb = KDEquipInventoryVariant(KinkyDungeonRestraintVariants[r.iv], "", + ((enemy ? enemy.Enemy.power + KDEnemyRank(enemy) : 0) || spell?.power || 0), + KinkyDungeonStatsChoice.has("MagicHands") ? true : enemy?.Enemy.bypass, (enemy?.Enemy.useLock ? enemy.Enemy.useLock : (r.r.DefaultLock || Lock)), + Keep, undefined, enemy?.Enemy.applyFaction || faction || enemy?.Enemy.defaultFaction, KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, + undefined, enemy, true, undefined, undefined, undefined) * 2; + } else { + bb = KinkyDungeonAddRestraintIfWeaker(r.r, ((enemy ? enemy.Enemy.power + KDEnemyRank(enemy) : 0) || spell?.power || 0), + KinkyDungeonStatsChoice.has("MagicHands") ? true : enemy?.Enemy.bypass, (enemy?.Enemy.useLock ? enemy.Enemy.useLock : (r.r.DefaultLock || Lock)), + Keep, undefined, undefined, enemy?.Enemy.applyFaction || faction || enemy?.Enemy.defaultFaction, + KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, + undefined, enemy, true, undefined, undefined, undefined, r.v) * 2; + + } + if (bb) { + if (KDGroupBlocked(r.r.Group) && !enemy?.Enemy.bypass) { + KinkyDungeonSendTextMessage( + 5, TextGet("KDBypasses") + .replace("RestraintName", KDGetRestraintName(r.r)) + .replace("EnemyName", name), + "#f0dc41", 1, + false, false, undefined, "Combat"); + } + if (restraintFromInventory && enemy && restraintFromInventory.includes(r.iv || r.r.name)) { + restraintFromInventory.splice(restraintFromInventory.indexOf(r.iv || r.r.name), 1); + if (enemy.items?.includes(r.iv || r.r.name)) { + enemy.items.splice(enemy.items.indexOf(r.iv || r.r.name), 1); + } + } + added.push(r); + count += 1; + } + count += 0; + } else { + count += 1; + } + } + } + } else { + blockFunction(); + } + + return added; +} + +/** + * Assigns the point an enemy leashes the player to + * @param enemy + */ +function KDAssignLeashPoint(enemy: entity): KDJailPoint { + let nj = KinkyDungeonNearestJailPoint(enemy.x, enemy.y); + if (!nj || KDGenHighSecCondition(false, enemy)) { + let pos = KDGetHighSecLoc(enemy, !KDSelfishLeash(enemy)); + AIData.nearestJail = {type: "jail", radius: 1, x: pos.x, y: pos.y}; + } else AIData.nearestJail = nj; + return AIData.nearestJail; +} + +function KDGetHighSecLoc(enemy: entity, fromHere?: boolean): KDPoint { + let forceFaction = KDGetLeashFaction(enemy); + let jailroom = KDGetLeashJailRoom(enemy); + + let slot = KDGetWorldMapLocation(KDCurrentWorldSlot); + let altRoom = KDGetAltType(MiniGameKinkyDungeonLevel); + if (((slot.main || "") == KDGameData.RoomType) && (altRoom && altRoom.placeJailEntrances)) + fromHere = false; + + if (KDFactionProperties[KDGetFaction(enemy)]?.lairType + || KDGetLairs(slot, enemy.id).length > 0) { + let lairType = KDLairTypes[jailroom]; + let outpost = KDAddLair( + slot, + fromHere ? KDGameData.RoomType : slot.main || "", + jailroom, + enemy.id, + false, + lairType.Entrances[fromHere ? KDGameData.RoomType : slot.main || ""] + || lairType.DefaultEntrance, + fromHere ? slot.main || "" : undefined, + fromHere ? + lairType.Entrances[slot.main || ""] + || lairType.DefaultEntrance : undefined, + fromHere ? + lairType.EntrancesFrom[slot.main || ""] + || lairType.DefaultEntranceFrom : undefined, + true + ); + + + let pos = KDGetShortcutPosition(outpost || jailroom, enemy.x, enemy.y, KDMapData); + + if (!pos) pos = (altRoom?.nostartstairs && !altRoom?.startatstartpos) ? KDMapData.StartPosition : KDMapData.EndPosition; + return pos; + } + let lairType = KDLairTypes[jailroom]; + let outpost = KDAddOutpost( + slot, + fromHere ? KDGameData.RoomType : slot.main || "", + jailroom, + forceFaction || "Jail", + false, + lairType.Entrances[fromHere ? KDGameData.RoomType : slot.main || ""] + || lairType.DefaultEntrance, + fromHere ? slot.main || "" : undefined, + fromHere ? + lairType.Entrances[slot.main || ""] + || lairType.DefaultEntrance : undefined, + fromHere ? + lairType.EntrancesFrom[slot.main || ""] + || lairType.DefaultEntranceFrom : undefined, + true + ); + + + let pos = KDGetShortcutPosition(outpost || jailroom, enemy.x, enemy.y, KDMapData); + + if (!pos) pos = (altRoom?.nostartstairs && !altRoom?.startatstartpos) ? KDMapData.StartPosition : KDMapData.EndPosition; + return pos; +} + +/** + * Assigns the point an enemy leashes the player to indirectly + * @param enemy + */ +function KDSelfishLeash(enemy: entity): boolean { + if (enemy.faction == "Ambush") return false; + return KDEnemyUnfriendlyToMainFaction(enemy) || KDFactionRelation(KDGetFaction(enemy), "Jail") < -0.2; +} + +/** + * Enemy is not friendly to the jail faction + * @param enemy + */ +function KDEnemyUnfriendlyToMainFaction(enemy: entity): boolean { + if (!enemy) return false; + let mainFaction = KDGetMainFaction(); + return KDGetFaction(enemy) != mainFaction + && KDFactionRelation(KDGetFaction(enemy), mainFaction) < -0.05; +} + +/** + * + * @returns {string} + */ +function KDGetMainFaction(mapData?: KDMapDataType): string { + if (!mapData) mapData = KDMapData; + let mainFaction = mapData.MapFaction; + if (!mainFaction && mapData.JailFaction && mapData.JailFaction.length > 0) mainFaction = mapData.JailFaction[0]; + if (!mainFaction && mapData.GuardFaction && mapData.GuardFaction.length > 0) mainFaction = mapData.GuardFaction[0]; + return mainFaction; +} + +/** + * @param player + */ +function KDPlayerLeashed(player: entity): boolean { + if (player?.player) { + let r = KinkyDungeonGetRestraintItem("ItemNeckRestraints"); + if (r && KDRestraint(r)?.leash) { + return true; + } + } + return false; +} + +/** + * @param player + */ +function KDPlayerLeashable(player: entity): boolean { + if (player?.player) { + return KinkyDungeonPlayerTags.get("Collars"); + } + return false; +} + + +/** + * @param en + */ +function KDEnemyCanBeVibed(en: entity): boolean { + return KDEntityBuffedStat(en, "Plug") > 0 || KDEntityBuffedStat(en, "Toy") > 0; +} + +/** + * @param enemy + * @param delta + */ +function KDEnemySoundDecay(enemy: entity, delta: number) { + let data = { + enemy: enemy, + decay: enemy.Enemy.Sound?.decay != undefined ? enemy.Enemy.Sound?.decay : 1, + base: enemy.Enemy.Sound?.baseAmount != undefined ? enemy.Enemy.Sound?.baseAmount : (KDDefaultSound(enemy)), + }; + KinkyDungeonSendEvent("enemySoundDecay", data); + if (enemy.sound == undefined) enemy.sound = 0; + + enemy.sound = Math.max(data.base, enemy.sound - delta * data.decay); +} + +/** + * @param enemy + */ +function KDDefaultSound(enemy: entity): number { + let mult = 1; + if (enemy.Enemy) { + if (enemy.Enemy.tags.construct) mult *= 0.5; + else if (enemy.Enemy.tags.scenery) mult *= 0.5; + else if (enemy.Enemy.tags.mushroom) mult *= 0.5; + else if (enemy.Enemy.tags.plant) mult *= 0.5; + else if (enemy.Enemy.tags.mummy) mult *= 0.65; + else if (enemy.Enemy.tags.elf) mult *= 0.65; + + if (KDIsImmobile(enemy)) mult -= 0.5; + } + return Math.max(mult, 0)*KDDefaultEnemyIdleSound; +} + +/** + * Only the noisiest thing counts + * @param enemy + * @param amount + * @param [novisual] + */ +function KDEnemyAddSound(enemy: entity, amount: number, novisual: boolean = false, desc?: string, forcemult?: number) { + if (enemy.sound == undefined) enemy.sound = 0; + let prevSound = enemy.sound || 0; + + let data = { + enemy: enemy, + amount: amount, + base: enemy.Enemy.Sound?.baseAmount != undefined ? enemy.Enemy.Sound?.baseAmount : KDDefaultEnemyIdleSound + }; + KinkyDungeonSendEvent("enemySoundAdd", data); + + enemy.sound = Math.max(data.base, data.amount); + + if (!novisual) { + let mult = 0.25; + // Draw a visual shockwave to help the player realize + if (forcemult != undefined) mult = forcemult; + else if (enemy.sound == prevSound) { + let ret = KinkyDungeonGetHearingRadius(); + mult = 0.4 * ret.mult; + } + + if ((enemy.sound > prevSound || (enemy.sound == prevSound && KDRandom() < mult)) + && (!KDCanSeeEnemy(enemy) || !(KinkyDungeonVisionGet(enemy.x, enemy.y) > 0))) { + let vol = KDCanHearSound(KinkyDungeonPlayerEntity, enemy.sound, enemy.x, enemy.y, 1.5); + if (vol > 0) { + if (desc) { + if (!KDEventData.sounddesc) KDEventData.sounddesc = []; + KDEventData.sounddesc.push({ + x: enemy.x, + y: enemy.y, + desc: desc, + shockwave: { + x: enemy.x, + y: enemy.y, + radius: Math.min(4, vol) * 0.3 + 0.25, + sprite: "Particles/ShockwaveEnemy.png", + }, + shockwavePeriod: 1500, + lastShockwave: CommonTime(), + }); + } else { + if (!KDEventData.shockwaves) KDEventData.shockwaves = []; + KDEventData.shockwaves.push({ + x: enemy.x, + y: enemy.y, + radius: Math.min(4, vol) * 0.3 + 0.25, + sprite: "Particles/ShockwaveEnemy.png", + }); + } + + } + + } + } +} + +/** + * @param entity + * @param enemy + * @param mult + */ +function KDCanHearEnemy(entity: entity, enemy: entity, mult: number = 1.0): boolean { + if (enemy) { + if (entity?.player) { + let ret = KinkyDungeonGetHearingRadius(); + let data = { + player: entity, + enemy: enemy, + hearingRadius: ret.radius, + hearingMult: ret.mult, + sound: enemy.sound, + dist: KDistChebyshev(entity.x - enemy.x, entity.y - enemy.y), + }; + KinkyDungeonSendEvent("playerCanHear", data); + if (data.dist < data.hearingRadius * mult && data.sound * data.hearingMult * mult >= data.dist - 0.5) + return KinkyDungeonCheckPath(entity.x, entity.y, enemy.x, enemy.y, true, false, mult * (0.5 + data.hearingMult), true); + return false; + } else { + let ret = KinkyDungeonGetHearingRadius(entity); + let data = { + player: entity, + enemy: enemy, + hearingRadius: ret.radius, + hearingMult: ret.mult, + sound: enemy?.player ? KDPlayerSound(enemy) : enemy.sound, + dist: KDistChebyshev(entity.x - enemy.x, entity.y - enemy.y), + }; + KinkyDungeonSendEvent("enemyCanHear", data); + if (data.dist < data.hearingRadius * mult && data.sound * data.hearingMult * mult >= data.dist - 0.5) + return KinkyDungeonCheckPath(entity.x, entity.y, enemy.x, enemy.y, true, false, mult * (0.5 + data.hearingMult), true); + } + return false; + } + return false; +} + +/** + * @param entity + */ +function KDPlayerSound(entity: entity): number { + return entity.sound; +} + +/** + * @param entity + * @param sound + * @param x + * @param y + * @param mult + */ +function KDCanHearSound(entity: entity, sound: number, x: number, y: number, mult: number = 1.0): number { + if (sound > 0) { + if (entity?.player) { + let ret = KinkyDungeonGetHearingRadius(); + let data = { + player: entity, + enemy: null, + hearingRadius: ret.radius, + hearingMult: ret.mult, + sound: sound, + dist: KDistChebyshev(entity.x - x, entity.y - y), + }; + KinkyDungeonSendEvent("playerCanHear", data); + if (data.dist < data.hearingRadius * mult && data.sound * data.hearingMult * mult >= data.dist - 0.5) + return Math.max(0, -0.1 + data.sound * data.hearingMult * mult + /Math.max(1, data.dist - 0.5) + /(1 + KinkyDungeonCheckPathCount(entity.x, entity.y, x, y, true, false, + Math.max(mult * (0.5 + data.hearingMult), 4), true))); + return 0; + } else { + let ret = KDEntitySenses(entity); + let data = { + player: entity, + enemy: null, + hearingRadius: ret.radius, + hearingMult: ret.mult, + sound: sound, + dist: KDistChebyshev(entity.x - x, entity.y - y), + }; + KinkyDungeonSendEvent("enemyCanHear", data); + if (data.dist < data.hearingRadius * mult && data.sound * data.hearingMult * mult >= data.dist - 0.5) + return Math.max(0, -0.1 + data.sound * data.hearingMult * mult + /Math.max(1, data.dist - 0.5) + /(1 + KinkyDungeonCheckPathCount(entity.x, entity.y, x, y, true, false, + Math.max(mult * (0.5 + data.hearingMult), 4), true))); + return 0; + } + } + return 0; +} + +/** + * @param x + * @param y + */ +function KDPointWanderable(x: number, y: number, mapData?: KDMapDataType): boolean { + if (!mapData) mapData = KDMapData; + let enemy = KinkyDungeonEntityAt(x, y, undefined, undefined, undefined, undefined, mapData); + if (enemy && !enemy.player && KDEnemyHasFlag(enemy, "tryNotToSwap")) return false; + return mapData.RandomPathablePoints[x + ',' + y] != undefined; +} + +/** + * @param enemy + * @param player + */ +function KDOverrideIgnore(enemy: entity, player: entity): boolean { + if (player.player) { + if (enemy.IntentAction && ( + KDIntentEvents[enemy.IntentAction]?.overrideIgnore + )) + return true; + } + return false; +} + +/** + * @param enemy + */ +function KDIsFlying(enemy: entity): boolean { + return enemy.Enemy.tags?.flying || KDEnemyHasFlag(enemy, "flying"); +} + +/** + * @param enemy + */ +function KDEnemyCanSignal(enemy: entity): boolean { + return !enemy.Enemy.tags?.nosignal; +} + +/** + * @param enemy + */ +function KDEnemyCanSignalMap(enemy: entity): boolean { + return !enemy.Enemy.tags?.passivesignal && !(enemy.silence > 0) + && KDEnemyCanSignal(enemy) && !KDEnemyHasFlag(enemy, "passivesignal"); +} +/** + * @param enemy + */ +function KDEnemyCanSignalOthers(enemy: entity): boolean { + return !enemy.Enemy.tags?.nosignalothers + && KDEnemyCanSignal(enemy) && !KDEnemyHasFlag(enemy, "nosignalothers"); +} + + + + + + +/** + * @param enemy + * @param Data + * @param [requireTags] + */ +function KDGetDialogueTrigger(enemy: entity, Data: KDAITriggerData, requireTags?: string[]): string { + let WeightTotal = 0; + let Weights = []; + for (let e of Object.entries(KDDialogueTriggers)) { + let trigger = e[1]; + let weight = 0; + if ((!trigger.blockDuringPlaytime || enemy.playWithPlayer < 1 || !enemy.playWithPlayer) + && (!trigger.noAlly || !KDAllied(enemy) || Data.ignoreNoAlly) + && (!trigger.talk || Data.canTalk) + && (!trigger.playRequired || Data.playAllowed) + && (!trigger.noCombat || !KinkyDungeonFlags.get("NPCCombat") || Data.ignoreCombat) + && (!trigger.nonHostile || !Data.aggressive) + && (!trigger.allowedPrisonStates || trigger.allowedPrisonStates.includes(KDGameData.PrisonerState)) + && (!trigger.allowedPersonalities || trigger.allowedPersonalities.includes(enemy.personality)) + && (!trigger.onlyDuringPlay || enemy.playWithPlayer > 0 + || (trigger.allowPlayExceptionSub && KDIsSubmissiveEnough(enemy)) + || Data.allowPlayExceptionSub)) { + let end = false; + if (requireTags) { + let dialogue = KDDialogue[trigger.dialogue]; + if (dialogue && dialogue.tags) { + if (dialogue.tags.some((t) => {return !requireTags.includes(t);})) { + end = true; + break; + } + } + } + if (trigger.excludeTags) { + for (let tt of trigger.excludeTags) { + if (enemy.Enemy.tags[tt]) { + end = true; + break; + } + } + } + if (!end && trigger.requireTags) { + for (let tt of trigger.requireTags) { + if (!enemy.Enemy.tags[tt]) { + end = true; + break; + } + } + } + let hastag = !trigger.requireTagsSingle; + if (!end && trigger.requireTagsSingle) { + for (let tt of trigger.requireTagsSingle) { + if (enemy.Enemy.tags[tt]) { + hastag = true; + break; + } + } + } + if (!hastag) end = true; + hastag = !trigger.requireTagsSingle2; + if (!end && trigger.requireTagsSingle2) { + for (let tt of trigger.requireTagsSingle2) { + if (enemy.Enemy.tags[tt]) { + hastag = true; + break; + } + } + } + if (!hastag) end = true; + if (!end && (!trigger.prerequisite || trigger.prerequisite(enemy, Data.playerDist, Data))) { + weight = trigger.weight(enemy, Data.playerDist); + } + } + if (weight > 0) { + Weights.push({t: trigger, weight: WeightTotal}); + WeightTotal += weight; + } + } + + let selection = KDRandom() * WeightTotal; + + for (let L = Weights.length - 1; L >= 0; L--) { + if (selection > Weights[L].weight) { + return Weights[L].t.dialogue; + + } + } + return ""; +} + +/** + * @param enemy + */ +function KDCanOverrideAI(enemy: entity): boolean { + let AI = KDGetAI(enemy); + if (KDAIType[AI] && KDAIType[AI].noOverride) return false; + return true; +} + +/** + * @param enemy + * @param index + */ +function KDGetAIOverride(enemy: entity, index: string): string { + let AI = KDGetAI(enemy); + if (KDAIType[AI] && KDAIType[AI].override) return KDAIType[AI].override[index]; + return undefined; +} + +/** + * @param Enemy + * @param index + */ +function KDGetAITypeOverride(Enemy: enemy, index: string): string { + let AI = Enemy.AI; + if (KDAIType[AI] && KDAIType[AI].override) return KDAIType[AI].override[index]; + return undefined; +} + +/** + * @param enemy + */ +function KDMakeHighValue(enemy: entity) { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "HighValue", + type: "MoveSpeed", + power: 0.1, + duration: 9999, infinite: true, + tags: ["removeOnRemove"], + }); + + // Hitpoint bonuses + let hp = Math.max(10, enemy.Enemy.maxhp) * (1.5 + Math.round(KDRandom()*5)/10); + enemy.Enemy = JSON.parse(JSON.stringify(enemy.Enemy)); + enemy.Enemy.maxhp = hp; + enemy.hp = hp; + enemy.modified = true; + + // MS bonus + if (KDRandom() * 0.5) { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "HighValue_MS", + type: "MoveSpeed", + power: 0.1 * Math.ceil(KDRandom()*10), + duration: 9999, infinite: true, + }); + } + + // AS bonus + if (KDRandom() * 0.5) { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "HighValue_AS", + type: "AttackSpeed", + power: 0.1 * Math.ceil(KDRandom()*10), + duration: 9999, infinite: true, + }); + } + + // Power bonus + if (KDRandom() * 0.5) { + let power = enemy.Enemy.power + Math.round(KDRandom() * 3); + enemy.Enemy.power = power; + } + + // Items + if (!enemy.items) enemy.items = []; + for (let i = Math.round(KDRandom()*3) ; i < 1; i++) { + enemy.items.unshift("AncientPowerSource"); + } + for (let i = Math.round(KDRandom()*2) ; i < 1; i++) { + enemy.items.unshift("PotionMana"); + } + for (let i = Math.round(KDRandom()*3) ; i < 0; i++) { + enemy.items.unshift("PotionWill"); + } + + let list = KDGetSpecialBuffList(enemy, ["HighValue"]); + let buff = KDGetByWeight(list); + if (buff) { + KDSpecialBuffs[buff].apply(enemy, ["HighValue"]); + list[buff] = 0; + } + buff = KDGetByWeight(list); + if (buff) { + KDSpecialBuffs[buff].apply(enemy, ["HighValue"]); + } +} + +/** + * Gets a list of curses applied to the item + * @param enemy + * @param types + */ +function KDGetSpecialBuffList(enemy: entity, types: string[]): Record { + let ret: Record = {}; + for (let obj of Object.keys(KDSpecialBuffs)) { + if (KDSpecialBuffs[obj].filter(enemy, types)) + ret[obj] = KDSpecialBuffs[obj].weight(enemy, types); + } + return ret; +} + + + +/** + * @param enemy + */ +function KDEnemyRank(enemy: entity): number { + let tags = enemy.Enemy.tags; + if (tags) { + if (tags.stageBoss) return 5; + if (tags.boss) return 4; + if (tags.miniboss) return 3; + if (tags.elite) return 2; + if (tags.minor) return 0; + } + return 1; +} +/** + * @param enemy + */ +function KDEnemyTypeRank(enemy: enemy): number { + let tags = enemy.tags; + if (tags) { + if (tags.stageBoss) return 5; + if (tags.boss) return 4; + if (tags.miniboss) return 3; + if (tags.elite) return 2; + if (tags.minor) return 0; + } + return 1; +} + +/** + * @param enemy + */ +function KDEnemyCanSprint(enemy: entity): boolean { + let amt = enemy.Enemy.stamina || 0; + return (enemy.exertion || 0) < amt; +} +/** + * @param enemy + */ +function KDEnemyChangeSprint(enemy: entity, amt: number) { + enemy.exertion = Math.max(0, amt + (enemy.exertion || 0)); +} + +let KDShopMoneyBase = 150; +let KDShopMoneyPerFloor = 50; +let KDShopMoneyPerRank = 40; + +/** + * @param enemy + * @param [dontSet] + */ +function KDSetShopMoney(enemy: entity, dontSet?: boolean): number { + let money = KDShopMoneyBase + KDShopMoneyPerFloor * KDGetEffLevel() + KDShopMoneyPerRank * (KDEnemyRank(enemy)**2); + KinkyDungeonSendEvent("shopMoney", {enemy: enemy, dontSet: dontSet}); + if (!dontSet) + enemy.gold = money; + return money; +} + + +/** + * @param enemy + * @returns true if the NPC is in the party + */ +function KDIsInParty(enemy: entity): boolean { + if (!KDGameData.Party) KDGameData.Party = []; // Null protection + for (let pm of (KDGameData.Party)) { + if (pm.id == enemy.id) { + return true; + } + } + return false; +} +/** + * @param id + * @returns true if the NPC is in the party + */ +function KDIsInPartyID(id: number): boolean { + if (!KDGameData.Party) KDGameData.Party = []; // Null protection + for (let pm of (KDGameData.Party)) { + if (pm.id == id) { + return true; + } + } + return false; +} + +/** + * @param enemy + * @returns true if the NPC has been previously captured + */ +function KDIsInCapturedParty(enemy: entity): boolean { + if (!KDGameData.CapturedParty) KDGameData.CapturedParty = []; // Null protection + for (let pm of (KDGameData.CapturedParty)) { + if (pm.id == enemy.id) { + return true; + } + } + return false; +} + +/** + * @param id + * @returns true if the NPC has been previously captured + */ +function KDIsInCapturedPartyID(id: number): boolean { + if (!KDGameData.CapturedParty) KDGameData.CapturedParty = []; // Null protection + for (let pm of (KDGameData.CapturedParty)) { + if (pm.id == id) { + return true; + } + } + return false; +} + +/** + * Returns the enemies in the map data based on the party members + * @returns Array of enemies from KDMapData.Entities + */ +function KDGetPartyRefs(): entity[] { + if (!KDGameData.Party) KDGameData.Party = []; // Null protection + let ret = []; + for (let pm of (KDGameData.Party)) { + let entity = KinkyDungeonFindID(pm.id); + if (entity) ret.push(entity); + } + return ret; +} + +/** + * @param enemy + */ +function KDCapturedPartyMemberIsOnMap(_enemy: entity): entity { + if (!KDGameData.CapturedParty) KDGameData.CapturedParty = []; // Null protection + for (let pm of (KDGameData.CapturedParty)) { + let entity = KinkyDungeonFindID(pm.id); + if (entity) return entity; + } + return null; +} + +/** + * @param enemy + * @returns - Returns true if the NPC was added + */ +function KDAddToParty(enemy: entity): boolean { + if (KDIsInParty(enemy)) return false; + if (KDGameData.Party.length >= KDGameData.MaxParty) return false; + // Add a copy to the party + enemy.faction = "Player"; + KDGameData.Party.push(JSON.parse(JSON.stringify(enemy))); + if (KDCapturable(enemy)) { + if (!KDGameData.Collection[enemy.id + ""]) + KDAddCollection(enemy, undefined, "Guest"); + KDGetPersistentNPC(enemy.id).collect = true; // Collect them + //KDTPToSummit(enemy.id); + } + if (KDGameData.Collection[enemy.id + ""]?.Facility) { + KDGameData.Collection[enemy.id + ""].Facility = ""; + } + return true; + +} + +/** + * @param enemy + * @returns - Returns true if the NPC was added + */ +function KDAddToCapturedParty(enemy: entity): boolean { + if (!KDCapturable(enemy)) return false; + if (KDHostile(enemy)) return false; + if (KDIsInCapturedParty(enemy)) return false; + // Add a copy to the party + KDGameData.CapturedParty.push(JSON.parse(JSON.stringify(enemy))); + return true; + +} + +/** + * Removes a party member and optionally adds to capture list + * @param enemy - The enemy to be removed + * @param capture - Whether to add to CapturedParty + * @returns - Whether the party member was found or not + */ +function KDRemoveFromParty(enemy: entity, capture: boolean): boolean { + if (!KDGameData.Party) KDGameData.Party = []; // Null protection + if (!KDGameData.CapturedParty) KDGameData.CapturedParty = []; + for (let pm of (KDGameData.Party)) { + if (pm.id == enemy.id) { + KDGameData.Party.splice(KDGameData.Party.indexOf(pm), 1); + let enn = KinkyDungeonGetEnemyByName(enemy.Enemy); + if (capture && (!enemy.maxlifetime || enemy.maxlifetime > 9000) && enn?.bound && KDCapturableType(enn)) { + //if (!enemy.hostile) { // In the future player will be able to keep as slaves + KDAddToCapturedParty(pm); + //} + } + return true; + } + } + return false; +} + +/** + * Removes a party member and optionally adds to capture list + * @param enemy - The enemy to be removed + * @param capture - Whether to add to CapturedParty + * @returns - Whether the party member was found or not + */ +function KDRemoveFromPartyID(id: number, capture: boolean): boolean { + if (!KDGameData.Party) KDGameData.Party = []; // Null protection + if (!KDGameData.CapturedParty) KDGameData.CapturedParty = []; + for (let pm of (KDGameData.Party)) { + if (pm.id == id) { + KDGameData.Party.splice(KDGameData.Party.indexOf(pm), 1); + let enemy = KDGetGlobalEntity(id); + if (enemy) { + let enn = KinkyDungeonGetEnemyByName(enemy.Enemy); + if (capture && (!enemy.maxlifetime || enemy.maxlifetime > 9000) && enn?.bound && KDCapturableType(enn)) { + //if (!enemy.hostile) { // In the future player will be able to keep as slaves + KDAddToCapturedParty(pm); + //} + } + } + return true; + } + } + return false; +} + + +/** + * @param entity + * @param [makepersistent] - If true, the game will update the npc to be persistent + * @param [dontteleportpersistent] - If true, the game will create a new NPC not a persistent one + * @param [noLoadout] - if true, will not restock the NPC + * @param [mapData] - map data to update + */ +function KDAddEntity(entity: entity, makepersistent?: boolean, dontteleportpersistent?: boolean, noLoadout?: boolean, mapData?: KDMapDataType): entity { + + entity.visual_x = entity.x; + entity.visual_y = entity.y; + if (!mapData) mapData = KDMapData; + let data = { + enemy: entity, + x: entity.x, + y: entity.y, + type: entity.Enemy, + typeOverride: false, + data: undefined, + loadout: undefined, + persistent: makepersistent, + mapData: mapData, + }; + + + if (mapData == KDMapData) { + KDUpdateEnemyCache = true; + KDGetEnemyCache(); + } + + if (!dontteleportpersistent && KDIsNPCPersistent(data.enemy.id) && KinkyDungeonFindID(data.enemy.id, mapData)) { + // Move the enemy instead of creating + + let npc = KinkyDungeonFindID(data.enemy.id, mapData); + + KDUnPackEnemy(data.enemy); + npc.x = data.x; + npc.y = data.y; + npc.visual_x = npc.x; + npc.visual_y = npc.y; + if (KDIsNPCPersistent(data.enemy.id) && !KDGetAltType(MiniGameKinkyDungeonLevel)?.keepPrisoners) + KDGetPersistentNPC(data.enemy.id).collect = false; + if (KDIsNPCPersistent(data.enemy.id)) + KDGetPersistentNPC(data.enemy.id).spawned = true; + + if (data.enemy.hp <= 0.5) data.enemy.hp = 0.51; + + if (mapData == KDMapData) + KDUpdateEnemyCache = true; + + return npc; + } else if (!dontteleportpersistent && KDDeletedIDs[data.enemy.id]) { + return null; + } + + + + let createpersistent = false; + + if (makepersistent || KDPersistentNPCs["" + data.enemy.id]) { + let npc = KDGetPersistentNPC(data.enemy.id); + if (npc) { + data.enemy = npc.entity; + if (typeof npc.entity.Enemy == "string") { + npc.entity.Enemy = KinkyDungeonGetEnemyByName(npc.entity.Enemy); + } else if (!data.enemy.Enemy.maxhp) { + KDUnPackEnemy(data.enemy); + } + npc.entity.x = data.x; + npc.entity.y = data.y; + + KDUpdateEnemyCache = true; + if (KDIsNPCPersistent(data.enemy.id)) + KDGetPersistentNPC(data.enemy.id).spawned = true; + + } else { + createpersistent = true; + } + } + KinkyDungeonSendEvent("addEntity", data); + if (KDMapData == mapData) { + KDUnPackEnemy(data.enemy); + } + mapData.Entities.push(data.enemy); + if (!noLoadout) + KDSetLoadout(data.enemy, data.loadout); + if (!data.enemy.data && data.enemy.Enemy.data) data.enemy.data = data.enemy.Enemy.data; + if (data.data) { + if (!data.enemy.data) data.enemy.data = {}; + Object.assign(data.enemy.data, data.data); + } + if (data.enemy.Enemy?.startBuffs) { + if (!data.enemy.buffs) data.enemy.buffs = {}; + let buffs = JSON.parse(JSON.stringify(data.enemy.Enemy?.startBuffs)); + if (buffs) + for (let b of buffs) + data.enemy.buffs[b.id] = b; + } + if (mapData == KDMapData) + KDUpdateEnemyCache = true; + + // In case it wasnt made already + if (createpersistent) KDGetPersistentNPC(data.enemy.id); + + + // Note: you have to do this yourself if you are manipulating enemies on other maps + if ((mapData == KDMapData) && KDIsNPCPersistent(data.enemy.id) && !KDGetAltType(MiniGameKinkyDungeonLevel)?.keepPrisoners) + KDGetPersistentNPC(data.enemy.id).collect = false; + + if (KDIsNPCPersistent(data.enemy.id)) { + KDGetPersistentNPC(data.enemy.id).spawned = true; + } + return data.enemy; +} + +function KDSpliceIndex(index: number, num: number = 1, mapData?: KDMapDataType) { + if (!mapData) mapData = KDMapData; + if (mapData.Entities[index]) { + KDCommanderRoles.delete(mapData.Entities[index].id); + } + mapData.Entities.splice(index, num); + + if (mapData == KDMapData) + KDUpdateEnemyCache = true; +} + + + +/** + * Removes an enemy and does some stuff like party management, etc to keep things sanitary + * @param enemy + * @param [kill] + * @param [capture] + * @param [noEvent] + * @param [forceIndex] + */ +function KDDespawnEnemy(enemy: entity, E: number, mapData: KDMapDataType, moveThruExit?: string, moveToX?: number, moveToY?: number): boolean { + KinkyDungeonSendEvent("despawn", {enemy: enemy, mapData: mapData}); + + KDDespawnParty(enemy.id, mapData); + KDRemoveEntity(enemy, false, false, false, E, mapData); + + delete enemy.despawnX; + delete enemy.despawnY; + + if (!KDIsNPCPersistent(enemy.id) && !KDIsInEnemyParty(enemy)) { + + if (moveThruExit == undefined) { + KDClearStolenItems(enemy); + DisposeEntity(enemy.id); + } + + } else if (KDIsInEnemyParty(enemy) && !KDIsPartyLeaderCapturedOrGone(enemy.partyLeader)) { + + let npc = KDGetPersistentNPC(enemy.partyLeader); + if (npc?.entity) { + let items = KDGetStolenItems(enemy); + // Hand it over + if (items.length > 0 && !npc.entity.items) { + npc.entity.items = []; + } + for (let item of items) { + npc.entity.items.push(item); + } + } + + } + + if (moveThruExit != undefined && (KDIsNPCPersistent(enemy.id) || enemy.homeCoord)) { + let failPlaceThru = true; + let currentRoom = mapData.RoomType; + let homeCoord = enemy.homeCoord; + + + let slot = KDGetWorldMapLocation({x: moveToX || mapData.mapX, y: moveToY || mapData.mapY}); + // Create the enemy in the next location + if (slot && slot.data && slot.data[moveThruExit]) { + let mdata = slot.data[moveThruExit]; + + // Enemies have an ability to pathfind only by 1... + if (moveThruExit != homeCoord.room) { + let nextExit = KDGetNearestExitTo( + currentRoom, mapData.mapX, mapData.mapY, + mdata.GridWidth/2, + mdata.GridHeight/2, + mdata, + ); + + if (nextExit) { + enemy = KDAddEntity(enemy, false, false, true, + mdata + ); + if (enemy) { + failPlaceThru = false; + let pp = KinkyDungeonGetNearbyPoint( + nextExit.x, nextExit.y, undefined, undefined, undefined, undefined, undefined, undefined, + undefined, mdata + ) || nextExit; + KDMoveEntity(enemy, pp.x, pp.y, true, false, false, true, true, mdata); + + } + } + } + } + + if (KDIsNPCPersistent(enemy.id)) { + KDMovePersistentNPC(enemy.id, { + mapX: moveToX || mapData.mapX, + mapY: moveToY || mapData.mapY, + room: moveThruExit, + }) + } + if (failPlaceThru) { + KDClearStolenItems(enemy); + DisposeEntity(enemy.id); + } + } + + + return true; +} + +/** + * Removes an enemy and does some stuff like party management, etc to keep things sanitary + * @param enemy + * @param [kill] + * @param [capture] + * @param [noEvent] + * @param [forceIndex] + */ +function KDRemoveEntity(enemy: entity, kill?: boolean, capture?: boolean, noEvent?: boolean, forceIndex?: number, mapData?: KDMapDataType): boolean { + let data = { + enemy: enemy, + kill: kill, + capture: capture, + cancel: false, + mapData: mapData || KDMapData, + }; + if (!noEvent) + KinkyDungeonSendEvent("removeEnemy", data); + + + + if (data.cancel) return false; + if (data.kill || data.capture) { + KDDropStolenItems(enemy, data.mapData); + enemy.items = []; + enemy.playerdmg = undefined; + enemy.hostile = 0; + enemy.ceasefire = 0; + if (KDEnemyHasFlag(enemy, "killtarget")) KDSetIDFlag(enemy.id, "killtarget", 0); + KinkyDungeonRemoveBuffsWithTag(enemy, ["removeOnRemove"]); + + //enemy.noDrop = true; + if (KDIsNPCPersistent(enemy.id)) { + if (KDGetPersistentNPC(enemy.id).collect + || KDGetAltType(data.mapData.mapY, data.mapData.MapMod, data.mapData.RoomType)?.keepPrisoners + || (data.mapData == KDMapData && enemy.playerdmg > 0 && KDistChebyshev(enemy.x - KDPlayer().x, enemy.y - KDPlayer().y) < 8)) { + KDGetPersistentNPC(enemy.id).captured = false; + KDGetPersistentNPC(enemy.id).collect = true; + + if (enemy.hp < 0.52) enemy.hp = 0.52; + if (KDGameData.Collection[enemy.id + ""]) { + KDGameData.Collection[enemy.id + ""].escaped = false; + if (!KDGameData.Collection[enemy.id + ""].status) + KDTPToSummit(enemy.id); + } + } else { + if (KDEntityAtRiskOfCapture(enemy, data.mapData)) { + KDGetPersistentNPC(enemy.id).captured = true; + let npc = KDGetCapturingNPC(enemy, 8); + if (npc) KDGetPersistentNPC(npc.id).captureCaptor = npc.id; + else KDGetPersistentNPC(enemy.id).captureCaptor = undefined; + KDGetPersistentNPC(enemy.id).captureFaction = KDMapData.MapFaction; + } + } + } + + if (KDGameData.SpawnedPartyPrisoners && KDGameData.SpawnedPartyPrisoners[enemy.id + ""] + ) { + KDAddToCapturedParty(enemy); + } else { + KDRemoveFromParty(data.enemy, data.capture && KDGetFaction(data.enemy) == "Player"); + } + } + + + if (KDIsNPCPersistent(enemy.id) && KDGetPersistentNPC(enemy.id)) { + KDGetPersistentNPC(enemy.id).jailed = undefined; + KDGetPersistentNPC(enemy.id).spawned = undefined; + } + + KDSpliceIndex(forceIndex || data.mapData.Entities.indexOf(data.enemy), 1, data.mapData); + if (data.mapData == KDMapData) + KDUpdateEnemyCache = true; + + if (kill) { + if (enemy.Enemy?.SFX?.death && data.mapData == KDMapData) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + enemy.Enemy.SFX.death + ".ogg", enemy); + } + if (enemy.ondeath) { + for (let o of enemy.ondeath) { + KDOndeath[o.type](enemy, o, data.mapData); + } + } + if (enemy.Enemy.ondeath) { + for (let o of enemy.Enemy.ondeath) { + KDOndeath[o.type](enemy, o, data.mapData); + } + } + } + return true; +} + +/** + * Gets the max block of an enemy + * @param entity + */ +function KDGetMaxBlock(entity: entity): number { + if (!((entity.Enemy.block || entity.Enemy.maxblock != undefined || (KDIsHumanoid(entity) && !entity.Enemy.tags?.submissive)))) return 0; + let mod = KDEntityBuffedStat(entity, "MaxBlock"); + if (entity.Enemy?.maxblock != undefined) return Math.max(0, entity.Enemy?.maxblock + mod); + return Math.max(0, mod + Math.max(1, KDEnemyRank(entity))); +} + +/** + * Gets the max block of an enemy + * @param entity + */ +function KDGetMaxDodge(entity: entity): number { + if (entity.Enemy?.alwaysEvade || KDIsImmobile(entity)) return 0; + let mod = KDEntityBuffedStat(entity, "MaxDodge"); + if (entity.Enemy?.maxdodge != undefined) return Math.max(0, entity.Enemy?.maxdodge + mod); + return Math.max(0, mod + Math.max(1, KDEnemyRank(entity))); +} + + +/** + * Gets the max block of an enemy + * @param entity + */ +function KDGetBaseBlock(entity: entity): number { + let mod = KDEntityBuffedStat(entity, "BlockRate"); + + /*let spellResist = entity.Enemy.spellResist || -1; + if (KDEntityBuffedStat(entity, "SpellResist")) spellResist += KDEntityBuffedStat(entity, "SpellResist"); + if (KDEntityBuffedStat(entity, "SpellResistBreak")) spellResist -= Math.min(Math.max(0, spellResist), KDEntityBuffedStat(entity, "SpellResistBreak")); + let armor = entity.Enemy.armor || -1; + if (KDEntityBuffedStat(entity, "Armor")) armor += KDEntityBuffedStat(entity, "Armor"); + if (KDEntityBuffedStat(entity, "ArmorBreak")) armor -= Math.min(Math.max(0, armor), KDEntityBuffedStat(entity, "ArmorBreak")); + + let armorBonus = Math.max(spellResist, armor) + Math.max(0, 0.5 * Math.min(spellResist, armor)); + if (entity.Enemy.tags?.meleeresist) armorBonus += 3; + else if (entity.Enemy.tags?.meleeimmune) armorBonus += 5; + let attackBonus = 2 - entity.Enemy.attackPoints;*/ + + return Math.max(0, mod + entity.Enemy.block);//0.05 * (1 + KDEnemyRank(entity)) / (1 + KinkyDungeonMultiplicativeStat(attackBonus + armorBonus))); +} + +/** + * Gets the max block of an enemy + * @param entity + */ +function KDGetBaseDodge(entity: entity): number { + let mod = KDEntityBuffedStat(entity, "DodgeRate"); + + + let moveBonus = 2 - entity.Enemy.movePoints; + if (entity.Enemy.attack?.includes("Dash")) moveBonus += 5; + else if (entity.Enemy.specialAttack?.includes("Dash")) moveBonus += 3; + if (entity.Enemy.kite) moveBonus += 1; + if (entity.Enemy.tags?.melee) moveBonus += 1; + let staminabonus = 0.2 * (entity.Enemy.stamina != undefined ? entity.Enemy.stamina : 6) * (entity.Enemy.sprintspeed || 1.7); + let reflexBonus = Math.max(0, (entity.Enemy.stealth ? 4 / entity.Enemy.stealth : 0)) + Math.max(0, (entity.Enemy.blindSight ? 4 / entity.Enemy.blindSight : 0)); + + return Math.max(0, mod + 0.1 * (1 + KDEnemyRank(entity)) / (1 + KinkyDungeonMultiplicativeStat(staminabonus + moveBonus + reflexBonus))); +} + +/** + * Returns the amount of hp a single block protects an enemy from + * @param entity + */ +function KDGetBlockAmount(entity: entity): number { + let mod = KDEntityBuffedStat(entity, "BlockAmount"); + + if (entity.Enemy?.blockAmount) return Math.max(0, entity.Enemy?.blockAmount + mod); + return (1 + mod + 0.5*(KDEnemyRank(entity))); +} + +/** + * Returns if the enemy can block + * @param enemy + */ +function KDCanBlock(enemy: entity): boolean { + return !KDHelpless(enemy) && !KinkyDungeonIsDisabled(enemy) && !enemy.vulnerable; +} + +/** + * Returns if the enemy can dodge + * @param enemy + */ +function KDCanDodge(enemy: entity): boolean { + return !KDIsImmobile(enemy) && !KDHelpless(enemy) && (!KinkyDungeonFlags.get("TimeSlow") || KDIsTimeImmune(enemy)) && !(enemy.bind > 0) && !KinkyDungeonIsDisabled(enemy) && KinkyDungeonGetNearbyPoint(enemy.x, enemy.y, true, undefined, true, true, (x, y) => {return x != enemy.x && y != enemy.y;}) != undefined; +} + +/** + * @param enemy + */ +function KDIsTimeImmune(enemy: entity): boolean { + return enemy?.player || enemy?.Enemy.tags?.timeimmune; +} + +/** + * @param entity + * @param amount + * @param desireMult + */ +function KDAddDistraction(entity: entity, amt: number, desireMult: number = 0.25, noEvent?: boolean): number { + if (entity?.Enemy?.nonHumanoid) return 0; + let origDistraction = entity.distraction || 0; + + let data = { + enemy: entity, + origDistraction: origDistraction, + amount: amt, + changed: 0, + desireMult: desireMult, + } + if (!noEvent) { + KinkyDungeonSendEvent("beforeDistractEnemy", data); + KinkyDungeonSendEvent("duringDistractEnemy", data); + } + entity.distraction = Math.max(entity.desire || 0, + Math.min(entity.Enemy.maxhp, (entity.distraction || 0) + data.amount)); + + entity.desire = Math.max(0, Math.min(entity.Enemy.maxhp, (entity.desire || 0) + data.amount * data.desireMult)); + if (data.amount > 0) { + KinkyDungeonSetEnemyFlag(entity, "d_turn", 2); + } + data.changed = entity.distraction - origDistraction; + + if (!noEvent) { + KinkyDungeonSendEvent("afterDistractEnemy", data); + } + return data.changed; +} + +/** + * @param entity + */ +function KDToughArmor(entity: entity): boolean { + return (entity?.aware && (entity.Enemy?.Resistance?.toughArmor || (KDEntityBuffedStat(entity, "ToughArmor") > 0))) + || KDAbsoluteArmor(entity); +} + +/** + * @param entity + */ +function KDAbsoluteArmor(entity: entity): boolean { + return entity?.Enemy?.Resistance?.toughArmorAlways || (KDEntityBuffedStat(entity, "ToughArmorAlways") > 0); +} + +/** + * @param enemy + */ +function KDIsDisarmed(enemy: entity): boolean { + return (enemy.disarm > 0); +} + +/** + * @param enemy + */ +function KDHasArms(enemy: entity): boolean { + return !enemy.Enemy?.tags?.noarms; +} + +/** + * @param player + * @param enemy + */ +function KDPlayerFacingAway(player: any, enemy: entity): boolean { + let dx = player.x - enemy.x; + let dy = player.y - enemy.y; + if ((dx && player.facing_x && (Math.sign(player.facing_x) == Math.sign(dx))) + || (dy && player.facing_y && (Math.sign(player.facing_y) == Math.sign(dy))) + ) { + return true; + } + + + return false; + +} + +/** + * @param enemy + * @param player + * @param AData + */ +function KDGetTeaseAttack(enemy: entity, player: entity, AData: KDAIData): KDTeaseAttack { + let list = enemy.Enemy.bound ? "Basic" : ""; + if (enemy.Enemy.teaseAttacks) list = enemy.Enemy.teaseAttacks; + if (list && KDTeaseAttackLists[list]) { + let candidates = KDTeaseAttackLists[list].filter((str) => { + return KDTeaseAttacks[str]?.filter(enemy, player, AData); + }); + let maxPri = 0; + for (let c of candidates) { + maxPri = Math.max(KDTeaseAttacks[c].priority, maxPri); + } + candidates = candidates.filter((str) => { + return KDTeaseAttacks[str].priority >= maxPri - 1.5*KDRandom(); + }); + if (candidates.length > 0) { + let chosen = candidates[Math.floor(KDRandom() * candidates.length)]; + return KDTeaseAttacks[chosen]; + } + return null; + } + return null; +} + +function KDBasicTeaseAttack(enemy: entity, player: entity, noglobal?: boolean): boolean { + return player.player + && KDistChebyshev(enemy.x-player.x, enemy.y - player.y) < 1.5 + && !KDEnemyHasFlag(enemy, "teaseAtkCD") + && (noglobal || !KinkyDungeonFlags.get("globalteaseAtkCD")) + && !KinkyDungeonIsDisabled(enemy) + && !(enemy.vulnerable > 0) + && !KDEnemyHasFlag(enemy, "targetedForAttack"); +} + + +/** + * @param enemy + */ +function KDGetVibeToys(enemy: entity): string[] { + if (!enemy.items) return []; + return enemy.items.filter((item) => {return KDRestraint({name: item})?.shrine?.includes("Vibes");}); +} + +/** + * @param enemy + */ +function KDGetTeaseDamageMod(enemy: entity): number { + let rank = KDEnemyRank(enemy); + let mod = enemy.Enemy?.teaseMod || ( + rank == 0 ? 0.25 : (0.4 + 0.12*rank) + ); + mod *= KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(enemy, "TeaseDamage")); + return mod; +} + +function KDPlayerIsRestricted(player: any, enemy: entity): boolean { + if (player.player && KDFactionRelation("Player", KDGetFaction(enemy)) < 0.35) { + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (altType?.restricted) return true; + return false; + } + return false; +} + +function KDGetUnassignedGuardTiles(type = "Patrol", ignoreNegative = false) { + if (KDMapData.Labels) return []; + let labels = KDMapData.Labels[type]; + let ret = []; + if (labels) { + for (let l of labels) { + if (!ignoreNegative || l.assigned >= 0) { + let en = KinkyDungeonFindID(l.assigned); + if (!en || KDHelpless(en)) { + ret.push(l); + } + } + } + } + return ret; +} + +/** + * @param enemy + */ +function KDCanIdleFidget(enemy: entity): boolean { + return enemy?.idle && !enemy.Enemy?.nonDirectional && !enemy.Enemy?.tags?.nofidget + && (!KDEnemyHasFlag(enemy, "fidget") || KDEntityHasBuffTags(enemy, "adren")) + && !KDEnemyHasFlag(enemy, "nofidget"); +} + +function KDRescueRepGain(en: entity) { + let faction = KDGetFaction(en); + if (!en.summoned && !en.maxlifetime && !KinkyDungeonHiddenFactions.has(faction)) { + if (!KDIDHasFlag(en.id, "rescuedRep")) { + KDGameData.Guilt = Math.max(0, (KDGameData.Guilt || 0) - KDEnemyRank(en)**2) + KinkyDungeonChangeFactionRep(faction, + (KDFactionRelation("Player", faction) > 0.25 ? 0.5 : 1) + * (KinkyDungeonFlags.get("rescuedFloor" + faction) ? 0.01 : 0.05)); + KDSetIDFlag(en.id, "rescuedRep", -1); + KinkyDungeonSetFlag("rescuedFloor" + faction, -1, 1); + } + } +} + +/** + * @param rescueType + * @param en + * @param makePlayer + */ +function KDRescueEnemy(rescueType: string, en: entity, makePlayer: boolean = true): boolean { + if (!KDHelpless(en) && !(en.boundLevel > 0.01)) { + + let newType = ""; + if (en.Enemy?.rescueTo) { + newType = en.Enemy?.rescueTo[rescueType]; + } + if (newType) { + let enemyType = KinkyDungeonGetEnemyByName(newType); + if (enemyType) { + en.Enemy = JSON.parse(JSON.stringify(enemyType)); + } + en.hp = Math.min(en.Enemy.maxhp, en.hp); + en.hostile = 0; + if (makePlayer) + en.faction = "Player"; + return true; + } + } + return false; +} + +/** + * @param enemy + */ +function KDGetEnemyTypeName(enemy: entity): string { + return enemy.CustomName || TextGet("Name" + enemy.Enemy.name); +} + +/** + * + * @param {entity} enemy + * @param {AIData} AID + * @returns {boolean} + */ +function KDGateAttack(enemy: entity, AID?: KDAIData): boolean { + return !((!enemy.attackPoints && KDEnemyHasFlag(enemy, "runAway") && (!AID || AID.kite)) || KDEnemyHasFlag(enemy, "attackFail")); +} + +/** + * @param enemy + * @param leash + */ +function KDAcceptsLeash(enemy: entity, _leash: KDLeashData): boolean { + return enemy.Enemy?.tags?.submissive || (enemy.personality && KDLoosePersonalities.includes(enemy.personality)); +} + +/** + * @param enemy + * @param player + */ +function KDEnemyAccuracy(enemy: entity, player: entity): number { + let accuracy = enemy.Enemy.accuracy ? enemy.Enemy.accuracy : 1.0; + if (enemy.distraction) accuracy = accuracy / (1 + 1.5 * enemy.distraction / enemy.Enemy.maxhp); + if (enemy.boundLevel) accuracy = accuracy / (1 + 0.5 * enemy.boundLevel / enemy.Enemy.maxhp); + if (enemy.blind > 0) accuracy = AIData.playerDist > 1.5 ? 0 : accuracy * 0.5; + + if (player?.player) { + if (accuracy < 1 && KDistChebyshev(enemy.x - player.x, enemy.y - player.y) < 1.5) { + let penalty = KDPlayerEvasionPenalty(); + if (penalty > 0) { + if (!KinkyDungeonStatsChoice.get("tut_AccuracyClose")) { + KinkyDungeonStatsChoice.set("tut_AccuracyClose", true); + KinkyDungeonSendTextMessage(10, TextGet("tut_AccuracyClose2"), "#ffffff", 5); + KinkyDungeonSendTextMessage(10, TextGet("tut_AccuracyClose1"), "#ffffff", 5); + } + } + accuracy += penalty; + } + } else if (player?.Enemy) { + if (player.bind > 0) accuracy *= 3; + else if (player.slow > 0) accuracy *= 2; + if ((player.stun > 0 || player.freeze > 0)) accuracy *= 5; + else { + if (player.distraction > 0) accuracy *= 1 + 2 * Math.min(1, player.distraction / player.Enemy.maxhp); + if (player) accuracy *= 1 + 0.25 * KDBoundEffects(player); + } + if (player.vulnerable) accuracy *= KDVulnerableHitMult; + } + + accuracy *= KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(enemy, "Accuracy")); + accuracy *= KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(enemy, "AccuracyPenalty")); + + return Math.min(1, accuracy); +} + +/** + * @param enemy + */ +function KDIsDistracted(enemy: entity): boolean { + return enemy.distraction > 0 && enemy.distraction >= enemy.Enemy.maxhp * 0.9; +} + +/** + * @param Enemy + */ +function KDEnemyRelease(Enemy: entity): boolean { + let data = { + cancel: false, + enemy: Enemy, + intensity: 1.0, + }; + KinkyDungeonSendEvent("enemyOrgasm", data); + if (data.cancel) return false; + let damageData = KDGetEnemyReleaseDamage(Enemy, undefined, data.intensity); + KinkyDungeonDamageEnemy(Enemy, damageData, true, true, undefined, undefined, undefined, 0.99, undefined, true, false); + if (damageData.stunTime) { + KinkyDungeonDamageEnemy(Enemy, { + damage: 0, + type: "stun", + time: Math.ceil(damageData.stunTime), + }, true, true, undefined, undefined, undefined, + 0.99, undefined, true, false); + + } + + if (KinkyDungeonVisionGet(Enemy.x, Enemy.y)) { + KinkyDungeonSendTextMessage(1, TextGet("KDEnemyLetGo") + .replace("ENMY", TextGet("Name" + Enemy.Enemy.name)) + .replace("AMNT", "" + Math.round(10*damageData.damage)), + "#e7cf1a", 2, undefined, undefined, undefined, "Combat"); + } + Enemy.distraction = 0; + Enemy.desire = 0; + KDAddThought(Enemy.id, "Embarrassed", 10, 5); + KinkyDungeonSendEvent("afterEnemyOrgasm", data); + return true; +} + + +function KDBlockedByPlayer(enemy: entity, dir: { x: number, y: number, delta: number }) { + if ((KDPlayer().x != enemy.gx + || KDPlayer().y != enemy.gy) + && KDPlayer().x == enemy.x + dir.x + && KDPlayer().y == enemy.y + dir.y) { + KinkyDungeonSetEnemyFlag(enemy, "playerBlocking", 6); + if (!KinkyDungeonGetRestraintItem("ItemDevices") && !KDIsPlayerTetheredToEntity(KDPlayer(), enemy)) + KinkyDungeonSendDialogue(enemy, TextGet("KDDialogue_StepAside" + (!KDEnemyCanTalk(enemy) ? "Gagged" : (enemy.personality || ""))) + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 3, 10); + } +} + +/** + * @param enemy + * @param delta + * @param [allowStruggleAlwaysThresh] + * @param [force] + * @param [defaultSpeed] + */ +function KDEnemyStruggleTurn(enemy: entity, delta: number, allowStruggleAlwaysThresh?: number, force: boolean = false, defaultSpeed: boolean = false) { + if (enemy.boundLevel > 0) { + let hasHelp = KDEnemyHasHelp(enemy); + let SM = KDGetEnemyStruggleMod(enemy, force, defaultSpeed, hasHelp); + let newBound = KDPredictStruggle(enemy, SM, delta, hasHelp ? 0 : allowStruggleAlwaysThresh); + enemy.boundLevel = newBound.boundLevel; + enemy.specialBoundLevel = newBound.specialBoundLevel; + + let SR = SM * (10 + Math.pow(Math.max(0.01, enemy.hp), 0.75)); + if (SR <= 0 || KDRandom() < 0.1) { + KDAddThought(enemy.id, "GiveUp", 5, SR <= 0 ? 4 : 1); + } else { + if (KDLoosePersonalities.includes(enemy.personality)) { + KDAddThought(enemy.id, "Embarrassed", 2, 4); + } else if (KDStrictPersonalities.includes(enemy.personality)) { + KDAddThought(enemy.id, "Struggle", 2, 2); + } else { + KDAddThought(enemy.id, "Annoyed", 2, 2); + } + } + + if (enemy.boundLevel <= 0) { + KDAddThought(enemy.id, "Annoyed", 5, 1); + KinkyDungeonSendEvent("enemyStatusEnd", {enemy: enemy, status: "boundLevel"}); + } + } + + if (enemy.specialBoundLevel) { + let sum = 0; + for (let entry of Object.values(enemy.specialBoundLevel)) { + sum += entry; + } + if (sum > 0) { + for (let entry of Object.keys(enemy.specialBoundLevel)) { + enemy.specialBoundLevel[entry] *= enemy.boundLevel / sum; + } + } else { + enemy.specialBoundLevel = {}; + } + } + + /** Do NPC restraint struggling */ + if (delta > 0) { + let struggleNPCTarget = KDNPCStruggleTick(enemy.id, delta); + if (struggleNPCTarget) { + let result = KDNPCDoStruggle(enemy.id, + struggleNPCTarget.slot, + struggleNPCTarget.inv, + KDEntityHasFlag(enemy, "bound") ? 0 : + -0.1 * struggleNPCTarget.target + 0.1 * (enemy.strugglePoints || 0) + + (1 + struggleNPCTarget.points) / (3 + struggleNPCTarget.target + struggleNPCTarget.points) + ); + if (result == "Struggle") { + if (!enemy.strugglePoints) enemy.strugglePoints = 0; + enemy.strugglePoints += delta; + } else if (result != "Struggle") { + if (struggleNPCTarget.inv.conjured && result == "Remove") result = "ConjuredRemove"; + KinkyDungeonSendTextMessage(3, TextGet("KDNPCEscape" + result) + .replace("ENMY", KDEnemyName(enemy)) + .replace("ITMN", KDGetItemName(struggleNPCTarget.inv, Restraint)), + "#ffffff", 2); + delete enemy.strugglePoints; + } + } else { + if (enemy.strugglePoints > 0) enemy.strugglePoints -= delta; + else delete enemy.strugglePoints + } + } + +} + +function KDGetEnemyWillReward(enemy: entity): number { + if (enemy.temporary) return 0; + switch (KDEnemyRank(enemy)) { + case 5: + return 1; + case 4: + return .8; + case 3: + return .5; + case 2: + return .3; + case 1: + return .2; + default: + return .1; + } +} + +/** + * @param enemy + */ +function KDGetEnemyRep(enemy: entity): number { + let faction = KDGetFaction(enemy); + let amount = 0; + if (!KinkyDungeonHiddenFactions.has(faction)) { + + if (enemy.Enemy.tags?.scenery) amount = 0; + else { + if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.boss) + amount = 0.04; + else if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.miniboss) + amount = 0.02; + else if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.elite) + amount = 0.01; + if (enemy.Enemy && enemy.Enemy.tags && !enemy.Enemy.tags.minor) + amount = 0.004; + if (enemy.Enemy && enemy.Enemy.tags && enemy.Enemy.tags.minor) + amount = KDRandom() < 0.33 ? 0.004 : 0.001; + } + + + } + return amount; +} +/** + * @param enemy + * @param faction + */ +function KDGetEnemyTypeRep(enemy: enemy, faction: string): number { + let amount = 0; + if (!KinkyDungeonHiddenFactions.has(faction)) { + + if (enemy.tags?.scenery) amount = 0; + else { + if (enemy && enemy.tags && enemy.tags.boss) + amount = 0.04; + else if (enemy && enemy.tags && enemy.tags.miniboss) + amount = 0.02; + else if (enemy && enemy.tags && enemy.tags.elite) + amount = 0.01; + if (enemy && enemy.tags && !enemy.tags.minor) + amount = 0.004; + if (enemy && enemy.tags && enemy.tags.minor) + amount = KDRandom() < 0.33 ? 0.004 : 0.001; + } + + + } + return amount; +} + +/** + * @param enemy + * @param force + */ +function KDQuickGenNPC(enemy: entity, force: boolean) { + let value: KDCollectionEntry | KDPersistentNPC = KDGameData.Collection[enemy.id + ""]; + if (force && !value && !KDIsNPCPersistent(enemy.id)) { + let enemyType = enemy.Enemy; + if (!enemyType.style) return; // Dont make one for enemies without styles + value = KDGetVirtualCollectionEntry(enemy.id); + if (!value) return; + } + if ((value || KDIsNPCPersistent(enemy.id))) { + let id = value ? value.id : KDGetPersistentNPC(enemy.id).id; + + let enemyType = enemy.Enemy; + if (!enemyType.style) return; // Dont make one for enemies without styles + let NPC = null; + if (!KDNPCChar.get(id)) { + NPC = CharacterLoadNPC(id, KDEnemyName(enemy), value?.Palette); + KDNPCChar.set(id, NPC); + KDNPCChar_ID.set(NPC, id); + value = value || KDGetPersistentNPC(enemy.id); + // Use a pointer + KDNPCStyle.set(NPC, value); + if (!value.bodystyle && !value.facestyle && !value.hairstyle) { + if (enemyType?.style || enemyType.style) { + if (KDModelStyles[enemyType?.style || enemyType.style]) { + let style = KDModelStyles[enemyType?.style || enemyType.style]; + if (!value.bodystyle && style.Bodystyle) { + value.bodystyle = style.Bodystyle[Math.floor(Math.random() * style.Bodystyle.length)]; + } + if (!value.hairstyle && style.Hairstyle) { + value.hairstyle = style.Hairstyle[Math.floor(Math.random() * style.Hairstyle.length)]; + } + if (!value.facestyle && style.Facestyle) { + value.facestyle = style.Facestyle[Math.floor(Math.random() * style.Facestyle.length)]; + } + if (!value.cosplaystyle && style.Cosplay) { + value.cosplaystyle = style.Cosplay[Math.floor(Math.random() * style.Cosplay.length)]; + } + + } + } + } + + // Draw once to create the model + // Kinda a hack... + DrawCharacter(NPC, PIXIWidth, PIXIHeight, 0.1); + if (enemyType?.outfit || enemyType.outfit) { + KinkyDungeonSetDress( + value?.outfit || enemyType.outfit, + value?.outfit || enemyType.outfit, NPC, true); + } + KDRefreshCharacter.set(NPC, true); + } else { + NPC = KDNPCChar.get(id); + KDNPCChar_ID.set(NPC, id); + } + } +} + +/** + * Function for filtering various things that would make it impossible for an NPC to play with the player + * @param enemy + */ +function KDPlayPossible(enemy: entity): boolean { + return enemy?.Enemy && !enemy.Enemy.tags?.nobrain && !enemy.Enemy.tags?.noplay && !enemy.Enemy.Behavior?.noPlay; +} + +/** + * @param target + * @param player + */ +function KDCanApplyBondage(target: entity, player: entity, extraCondition: (t: entity, p: entity) => boolean = undefined): boolean { + if (player?.player) { + return (extraCondition ? extraCondition(target, player) : false) + || (KDEntityBuffedStat(KinkyDungeonPlayerEntity, "TimeSlow") + > KDEntityBuffedStat(target, "TimeSlow")) + || (KinkyDungeonIsDisabled(target)) + || KDWillingBondage(target, player); + } + return KinkyDungeonIsDisabled(target); +} + +/** + * @param target + * @param player + */ +function KDWillingBondage(target: entity, player: entity): boolean { + return (KDIsDistracted(target) && KDLoosePersonalities.includes(target.personality)) + || (player?.player && (target.playWithPlayer && KDCanDom(target))); +} + + +function KDIsSubmissive(entity: entity, threshold: number = 0.5): boolean { + if (!entity.player) { + KDSetDomVariance(entity); + let submissiveness = (-entity.domVariance || 0) + KDEntityBuffedStat(entity, "submissiveness"); + if (entity.personality && KDEnemyPersonalities[entity.personality]?.submissiveness) + submissiveness += KDEnemyPersonalities[entity.personality].submissiveness; + + return submissiveness > threshold; + } else { + return KDIsSubmissiveEnough(); + } + return false; +} + + +function KDGetCapturingNPC(enemy: entity, dist: number = 1.5) { + let maxDist = Math.max(0.5, Math.min( + KDistChebyshev(enemy.x - KDPlayer().x, enemy.y - KDPlayer().y) - 1, dist)); + let nearbyNPCs = KDNearbyEnemies(enemy.x, enemy.y, maxDist, enemy).filter( (en) => { + return !KDHelpless(enemy) && !KinkyDungeonIsDisabled(en); + }); + if (nearbyNPCs.length == 0) return null; + + let captor: entity = nearbyNPCs[Math.floor(nearbyNPCs.length * KDRandom())]; + let lairs = KDGetLairs(KDGetWorldMapLocation(KDCoordToPoint(KDGetCurrentLocation()))); + let outposts = KDGetOutposts(KDGetWorldMapLocation(KDCoordToPoint(KDGetCurrentLocation()))); + + let nearbyLairOwners = nearbyNPCs.filter((en) => { + return lairs.some((op) => {return op[1] == "" + en.id;}); + }); + if (nearbyLairOwners.length > 0) { + captor = nearbyLairOwners[Math.floor(nearbyLairOwners.length * KDRandom())] + } else { + let nearbyOutpostOwners = nearbyNPCs.filter((en) => { + return outposts.some((op) => {return op[1] == KDGetFaction(en);}); + }); + if (nearbyOutpostOwners.length > 0) { + captor = nearbyOutpostOwners[Math.floor(nearbyOutpostOwners.length * KDRandom())] + } + } + + return captor; +} + +function KDEntityAtRiskOfCapture(enemy: entity, mapData: KDMapDataType): boolean { + let persistent = KDIsNPCPersistent(enemy.id) ? KDGetPersistentNPC(enemy.id) : undefined; + if (persistent.alwaysEscape) return false; + if (!KDGameData.Collection[enemy.id + ""] + && enemy.hp >= enemy.Enemy?.maxhp + && !enemy.boundLevel) return false; + if (KDFactionHostile(KDGetFaction(enemy), KDGetMainFaction(mapData))) return true; + return false; +} + +function KDGetEntityMaxDistraction(entity: entity) { + if (entity == KDPlayer()) { + return KinkyDungeonStatDistractionMax; + } else { + return entity.Enemy.maxhp; + } +} +function KDGetDistraction(entity: entity) { + if (entity == KDPlayer()) { + return KinkyDungeonStatDistraction; + } else { + return entity.distraction || 0; + } +} + + +function KDIsNearbyFurniture(enemy: entity, dist: number) { + let furn = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"], undefined, undefined, true); + + return furn && KDistChebyshev(enemy.x - furn.x, enemy.y - furn.y) <= dist; +} + +/** Wanders toward party leader */ +function KDWanderFarEnemyParty(enemy: entity) { + // long distance hunt + let pm = KinkyDungeonFindID(enemy.partyLeader); + if (pm) { + let newPoint = KinkyDungeonGetNearbyPoint(pm.x, pm.y, true); + if (newPoint) { + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + return true; + } + } + return false; +} + +/** returns the amount added */ +function KDApplyBindStun(enemy: entity, amount: number): number { + if (amount > 0 && enemy.Enemy.bound) { + if (!enemy.bindStun) enemy.bindStun = 0; + let orig = enemy.bindStun; + enemy.bindStun = Math.max(amount, enemy.bindStun); + return enemy.bindStun - orig; + } + return 0; +} + +let KDBindStunDecayHPFactor = 0.5; +let KDBindStunDecayHPFactorExp = 0.5; +let KDBindStunDecayMaxHPFactor = 0.1; +let KDBindStunCurrentStunFactor = 0.1; +let KDBindStunDecayMaxHPFactorExp = 0.5; + +function KDEnemyDecayBindStun(enemy: entity, delta: number) { + if (enemy.bindStun > 0) { + let packed = KDUnPackEnemy(enemy); + for (let i = 0; i < delta; i++) { + let decay = Math.max( + Math.max(enemy.hp, 0)**KDBindStunDecayHPFactorExp * KDBindStunDecayHPFactor, + Math.max(enemy.Enemy.maxhp, 0)**KDBindStunDecayMaxHPFactorExp * KDBindStunDecayMaxHPFactor, + enemy.bindStun * KDBindStunCurrentStunFactor, + ); + + enemy.bindStun = Math.max(0, enemy.bindStun - decay); + } + if (packed) KDPackEnemy(enemy); + } else { + delete enemy.bindStun; + } +} \ No newline at end of file diff --git a/Game/src/enemy/KinkyDungeonEnemiesList.ts b/Game/src/enemy/KinkyDungeonEnemiesList.ts new file mode 100644 index 000000000..fd301c947 --- /dev/null +++ b/Game/src/enemy/KinkyDungeonEnemiesList.ts @@ -0,0 +1,6582 @@ +"use strict"; + +let KDNoCaptureTypes = ["skeleton", "construct", "nobrain", "nocapture"]; + +let KinkyDungeonEnemies: enemy[] = [ + // Prisoners + {name: "PrisonerBandit", tags: KDMapInit(["prisoner", "bandit", "human", "peaceful", "noshop"]), faction: "Prisoner", immobile: true, lowpriority: true, evasion: -100, armor: 0, followRange: 100, AI: "wander", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "PrisonerBandit", + Behavior: {noPlay: true}, + terrainTags: {}, floors:KDMapInit([])}, + {name: "MummyElevator", tags: KDMapInit(["prisoner", "mummy", "peaceful", "noshop", "nofidget"]), + faction: "Prisoner", immobile: true, lowpriority: true, evasion: -100, armor: 0, followRange: 100, AI: "wander", regen: 100, + visionRadius: 0, maxhp: 1000, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + specialdialogue: "MummyElevator", + Behavior: {noPlay: true}, + terrainTags: {}, floors:KDMapInit([])}, + {name: "FactoryDoll", bound: "FactoryDoll", playLine: "Gagged", tags: KDMapInit(["prisoner", + "nocapture", "dollmakerconvert", "doll", "human", "minor", "peaceful", "nohelp", "noshop"]), + rescueTo: { + Remove: "FreeDoll", + Unlock: "FreeDoll", + }, + faction: "Prisoner", lowpriority: true, evasion: -100, armor: 1, followRange: 100, AI: "wander", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-10, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, events: [ + {trigger: "tick", type: "secretToy"}, + ], + Behavior: {noPlay: true}, + terrainTags: {"bellowsDoll": 20}, allFloors: true}, + {name: "FreeDoll", bound: "FactoryDoll", tags: KDMapInit(["formerprisoner", "nocapture", "doll", "human", "minor", "peaceful", "noshop"]), + faction: "Prisoner", lowpriority: true, evasion: -100, armor: 1, followRange: 100, AI: "wander", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, + Behavior: {noPlay: true}, + terrainTags: {}, allFloors: true}, + {name: "DollmakerTarget", nameList: "cyborg", outfit: "DollsmithDoll", style: "Water", bound: "FactoryDoll", playLine: "Gagged", tags: KDMapInit(["prisoner", "silenceimmune", "blindimmune", "escapeddoll", "doll", "human", "minor", "peaceful", "noshop"]), + faction: "Prisoner", lowpriority: true, evasion: -100, armor: 0, followRange: 100, AI: "wander", regen: 0.01, events: [ + {trigger: "tick", type: "secretToy"}, + ], + visionRadius: 0, maxhp: 8, minLevel:0, weight:-10, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, + Behavior: {noPlay: true}, + ondeath: [{type: "dollID"}], + terrainTags: {}, allFloors: true}, + + + + // Easy mode rescuer + {name: "ShopkeeperRescue", tags: KDMapInit(["human", "peaceful", "alwayshelp", "noshop", "opendoors"]), faction: "Prisoner", lowpriority: true, armor: 2, followRange: 100, AI: "guard", + visionRadius: 0, maxhp: 120, regen: 10, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "ShopkeeperRescueChatter", + Behavior: {noPlay: true}, + noDisplace: false, keys: true, + events: [ + {type: "ShopkeeperRescueAI", trigger: "afterEnemyTick"}, + ], + terrainTags: {}, floors:KDMapInit([])}, + + // Easy mode NPC + {name: "ShopkeeperStart", tags: KDMapInit(["human", "peaceful", "alwayshelp", "noshop", "opendoors"]), faction: "Prisoner", lowpriority: true, armor: 2, followRange: 100, AI: "guard", + visionRadius: 0, maxhp: 120, regen: 10, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "ShopkeeperStart", + Behavior: {noPlay: true}, + spawnAISetting: "None", + noDisplace: false, keys: true, + terrainTags: {}, floors:KDMapInit([])}, + + // Quest NPC + {name: "DressmakerQuest", tags: KDMapInit(["dressmaker", "human", "peaceful", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "DressmakerQuest", + Behavior: {noPlay: true}, + terrainTags: {}, floors:KDMapInit([])}, + {name: "ApprenticeQuest", tags: KDMapInit(["apprentice", "human", "peaceful", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "ApprenticeQuest", + Behavior: {noPlay: true}, + terrainTags: {}, floors:KDMapInit([])}, + {name: "BlacksmithQuest", tags: KDMapInit(["human", "peaceful", "alwayshelp", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "BlacksmithShop", data: {"shop": "BlacksmithShop"}, + Behavior: {noPlay: true}, + ondeath: [{type: "murder", count: 1}], + terrainTags: {}, floors:KDMapInit([])}, + {name: "AntiqueQuest", tags: KDMapInit(["skeleton", "peaceful", "alwayshelp", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "AntiqueShop", data: {"shop": "AntiqueShop"}, + Behavior: {noPlay: true}, + ondeath: [{type: "murder", count: 1}], + terrainTags: {}, floors:KDMapInit([])}, + {name: "BowyerQuest", tags: KDMapInit(["human", "peaceful", "alwayshelp", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "BowyerShop", data: {"shop": "BowyerShop"}, + Behavior: {noPlay: true}, + ondeath: [{type: "murder", count: 1}], + terrainTags: {}, floors:KDMapInit([])}, + {name: "ShadyQuest", tags: KDMapInit(["human", "peaceful", "alwayshelp", "noshop"]), + faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", + attackRange: 0, specialdialogue: "ShadyShop", data: {"shop": "ShadyShop"}, + Behavior: {noPlay: true}, + ondeath: [{type: "murder", count: 1}], + terrainTags: {}, floors:KDMapInit([])}, + {name: "ArmorerQuest", tags: KDMapInit(["human", "peaceful", "alwayshelp", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "ArmorerShop", data: {"shop": "ArmorerShop"}, + Behavior: {noPlay: true}, + ondeath: [{type: "murder", count: 1}], + terrainTags: {}, floors:KDMapInit([])}, + {name: "DragonheartQuest", tags: KDMapInit(["dragon", "peaceful", "alwayshelp", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "DragonheartQuest", + Behavior: {noPlay: true}, + terrainTags: {}, floors:KDMapInit([])}, + {name: "MaidforceQuest", tags: KDMapInit(["maid", "peaceful", "alwayshelp", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "MaidforceQuest", + Behavior: {noPlay: true}, + terrainTags: {}, floors:KDMapInit([])}, + {name: "DragonLeaderDuelist", nameList: "demon", outfit: "RebelScum", style: "Earth", faction: "Enemy", bound: "DragonLeader", color: "#F92900", + tags: KDMapInit(["opendoors", "fire", "leashing", "noshop", "dragon", "melee", "elite", + "dragonRestraints", "unflinching", "handcuffer", "leatherRestraints", "leatherRestraintsHeavy", "fireimmune"]), + stamina: 7, + sprintspeed: 1.25, + ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", focusPlayer: true, + specialCD: 3, specialAttack: "Dash", specialRemove: "BindLockWill", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 3, specialMinRange: 1.5, dashThrough: true, specialsfx: "Miss", + visionRadius: 7, maxhp: 28, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 2, attack: "MeleeBindLockWill", attackWidth: 1, attackRange: 1, power: 4, dmgType: "crush", fullBoundBonus: 2, + terrainTags: {}, shrines: ["Leather"], allFloors: true, + dropTable: [], factionrep: {"Dragon": 0.015}, ondeath: [{type: "removeQuest", quest: "DragonheartQuest"}]}, + {name: "BanditQuest", style: "Bandit", tags: KDMapInit(["bandit", "peaceful", "alwayshelp", "noshop"]), faction: "Prisoner", lowpriority: true, armor: 0, followRange: 100, AI: "hunt", regen: 0.1, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 4, attackPoints: 0, attack: "", attackRange: 0, specialdialogue: "BanditQuest", + Behavior: {noPlay: true}, + terrainTags: {}, floors:KDMapInit([])}, + + + {name: "PinkLabAssistant", faction: "Latex", clusterWith: "alchemist", playLine: "Gagged", bound: "LabAssistant", color: "#ff8888", + tags: KDMapInit(["opendoors", "pink", "nocapture", "leashing", "latexRestraints", "latexpetsuit", "human", "alchemist", "ranged", "silenceimmune", "blindimmune", "minor", "latexGag"]), + ignorechance: 0, followRange: 4.5, AI: "hunt", + difficulty: 0.3, + spells: ["AmpuleBlue", "LatexBubble"], spellCooldownMult: 1, spellCooldownMod: 1, kite: 2.5, projectileAttack: true, noKiteWhenHarmless: true, + attackLock: "White", + stamina: 3, + Resistance: { + profile: ["alchemist"], + }, + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "LatexThin", aoe: 1.5, power: 3, chance: 1.0, duration: 20}, + ], + visionRadius: 6, maxhp: 6, minLevel:0, weight:-1000, movePoints: 2.5, attackPoints: 3, attack: "SpellMeleeBlindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 1, blindTime: 3, + terrainTags: {pink: 1100}, shrines: ["Latex"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}, {name: "SlimeRaw", amount: 3, weight: 10}]}, + + {name: "PinkAlchemist", faction: "Latex", clusterWith: "alchemist", playLine: "Gagged", bound: "Alchemist", color: "#ff8888", + tags: KDMapInit(["opendoors", "pink", "nocapture", "leashing", "imprisonable", "latexpetsuit", "human", "alchemist", "silenceimmune", "blindimmune", "ranged", "latexRestraints", "handcuffer", + "leatherRestraintsHeavy", "latexGag"]), + ignorechance: 0, armor: 0, followRange: 2, AI: "hunt", + spells: ["AmpuleBlue", "AmpuleGreen", "AmpuleYellow"], spellCooldownMult: 1, spellCooldownMod: 4, kite: 1.5, projectileAttack: true, + attackLock: "White", + Resistance: { + profile: ["alchemist"], + }, + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "LatexThin", aoe: 1.5, power: 3, chance: 1.0, duration: 20}, + ], + stamina: 4, + visionRadius: 6, maxhp: 8, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {pink: 1100}, shrines: [], allFloors: true, + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}, {name: "SlimeRaw", amount: 3, weight: 10}]}, + {name: "PinkAlkahestor", faction: "Latex", clusterWith: "alchemist", playLine: "Gagged", bound: "Alkahestor", color: "#ff8888", + tags: KDMapInit(["pink", "opendoors", "nocapture", "antiMagic", "leashing", "latexpetsuit", "human", "alchemist", "silenceimmune", "blindimmune", "ranged", "miniboss", "expRestraints", "latexCollar", "latexRestraints", "handcuffer", "latexGag"]), + ignorechance: 0, armor: 1, followRange: 2, AI: "hunt", + spells: ["AmpuleBlue", "BubbleBurstSlime"], spellCooldownMult: 1, spellCooldownMod: 4, kite: 1.5, projectileAttack: true, + attackLock: "Red", + stamina: 4, + Resistance: { + profile: ["alchemist"], + }, + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "LatexThin", aoe: 1.5, power: 3, chance: 1.0, duration: 20}, + ], + visionRadius: 6, maxhp: 16, minLevel:4, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1.5, dmgType: "grope", fullBoundBonus: 2.5, + terrainTags: {pink: 1025}, shrines: ["Latex"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "SlimeRaw", amount: 10, weight: 10}, {name: "HardSlimeRaw", amount: 7, weight: 10}]}, + {name: "PinkGlueTechnician", faction: "Latex", clusterWith: "alchemist", playLine: "Gagged", bound: "GlueTechnician", color: "#ff8888", + tags: KDMapInit(["opendoors", "pink", "nocapture", "leashing", "human", "latexpetsuit", "alchemist", "ranged", "silenceimmune", "blindimmune", "unflinching", "elite", "expRestraints", "latexRestraints", "latexRestraintsHeavy", "latexGag", "handcuffer",]), + ignorechance: 0, armor: 1.5, followRange: 2, AI: "hunt", + spells: ["AmpuleYellow", "GlueBomb"], spellCooldownMult: 0.7, spellCooldownMod: 0, projectileAttack: true, + attackLock: "White", + stamina: 4, + Resistance: { + profile: ["alchemist"], + }, + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "LatexThin", aoe: 1.5, power: 3, chance: 1.0, duration: 20}, + ], + visionRadius: 7.5, maxhp: 12, minLevel:2, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLockSlow", attackWidth: 2.5, attackRange: 1, power: 2, dmgType: "tickle", fullBoundBonus: 2, + terrainTags: {pink: 1050}, shrines: ["Latex"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 15, weight: 10}, {name: "SlimeRaw", amount: 5, weight: 10}]}, + + {name: "DroneNode", faction: "AncientRobot", clusterWith: "robot", color: "#00EFAB", playLine: "Robot", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit(["ignoreharmless", + "stunweakness", "disarmimmune", "doortrap", "robot", "flying", "drone", "server", "robotServer", + "acidweakness", "soapweakness", "soulresist", "miniboss", "melee", "electricsevereweakness", "coldresist", "iceresist", + "slashresist", "crushsevereweakness", "pierceweakness"]), + followRange: 4.9, kite: 3.5, difficulty: 0.2, + evasion: -0.2, + maxblock: 1, + maxdodge: 0, + Sound: { + baseAmount: 4.5, + moveAmount: 4.5, + alertAmount: 12, + idleSoundName: "NodeHum", + }, + shield: 5, + AI: "hunt", visionRadius: 9, maxhp: 4, minLevel:0, weight:-100, movePoints: 2.5, cohesion: 1.0, armor: 0, spellResist: 1.5, + attackPoints: 3, attack: "", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "grope", + terrainTags: {"robotServer": 200}, floors:KDMapInit([]), shrines: ["Metal"], + events: [ + {trigger: "afterEnemyTick", type: "DroneNodeAura", power: 10, mult: 0.04, dist: 4.5}, + ], + }, + {name: "OldDroneNode", faction: "Enemy", clusterWith: "oldrobot", color: "#ff5277", playLine: "Robot", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit(["ignoreharmless", + "stunweakness", "disarmimmune", "doortrap", "robot", "oldrobot", "flying", "drone", "server", "robotServer", + "acidweakness", "soapweakness", "soulresist", "miniboss", "melee", "electricsevereweakness", "coldresist", "iceresist", + "slashresist", "crushsevereweakness", "pierceweakness"]), + followRange: 4.9, kite: 3.5, difficulty: 0.2, + evasion: -0.2, + maxblock: 1, + maxdodge: 0, + Sound: { + baseAmount: 6, + moveAmount: 7, + alertAmount: 12, + idleSoundName: "NodeHum", + }, + AI: "hunt", visionRadius: 9, maxhp: 16, minLevel:0, weight:-100, movePoints: 2.5, cohesion: 1.0, armor: 0, spellResist: 0, + attackPoints: 3, attack: "", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "grope", + terrainTags: {"robotServer": 200}, floors:KDMapInit([]), shrines: ["Metal"], + + }, + {name: "WolfServer", tags: KDMapInit(["poisonmmune", + "soulimmune", + "server", "immobile", "wolfServer", + "noknockback", "melee", + "nofidget", "notalk", + "stunweakness", + "nonvulnerable", "nobrain", + "passivesignal", + "acidweakness", "soapsevereweakness"]), + SFX: {death: "SciFiExplode"}, + faction: "Nevermere", lowpriority: true, evasion: -100, armor: -1, followRange: 100, AI: "wander", + visionRadius: 0, maxhp: 20, minLevel:0, weight:-100, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + ondeath: [ + {type: "WolfServer"} + ], + Sound: { + baseAmount: 5, + moveAmount: 0, + idleSoundName: "ServerHum", + }, + terrainTags: {"wolfServer": 200}, floors:KDMapInit([])}, + + + // End Quest NPC + + {name: "DirtPile", tags: KDMapInit(["poisonmmune", "soulimmune", "dirt", "immobile", "noknockback", "melee", "nofidget", "notalk", "nonvulnerable", "nobrain", "nosignal", "acidweakness", "soapsevereweakness"]), + faction: "Door", spellResist: -3, lowpriority: true, evasion: -100, armor: -1, followRange: 100, AI: "wander", + visionRadius: 0, maxhp: 4, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + ondeath: [ + {type: "DirtPile"} + ], + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + terrainTags: {}, floors:KDMapInit([])}, + + {name: "ExplosiveBarrel", tags: KDMapInit(["poisonmmune", "soulimmune", "noknockback", "melee", "minor", "scenery", "explosiveBarrel", "notalk", "nonvulnerable", "nobrain", "nosignal", "immobile", "fireweakness", "stunweakness"]), + faction: "Barrel", immobile: true, lowpriority: true, evasion: -100, armor: 1, followRange: 100, AI: "wander", + difficulty: 0.01, + pathcondition: "barrel", + visionRadius: 0, maxhp: 6, minLevel:0, weight:-10, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + dropTable: [{name: "Gunpowder", amount: 3, weight: 10, noSummon: true}], + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + events: [ + {trigger: "afterDamageEnemy", type: "ExplosiveBarrel", chance: 0.5, power: 3.0, spell: "ExplosiveBarrel"}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Gunpowder", time: 4, power: 2, chance: 0.5, aoe: 0.5}, + ], + terrainTags: {"explosiveBarrel": 40, open: -16, passage: -30}, allFloors: true}, + + {name: "ChainWall", + tags: KDMapInit(["construct", "flying", "poisonmmune", "soulimmune", "noknockback", "melee", "temporary", "notalk", "nonvulnerable", "nobrain", "nosignal", + "bulwark", "immobile"]), + faction: "Witch", immobile: true, spellResist: 0, lowpriority: true, evasion: -100, armor: 3, followRange: 100, AI: "wander", regen: -0.25, + visionRadius: 0, maxhp: 5, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + terrainTags: {}, floors:KDMapInit([])}, + + {name: "IceWall", + tags: KDMapInit(["construct", "poisonmmune", "soulimmune", "noknockback", "melee", "temporary", "notalk", "nonvulnerable", "nobrain", "nosignal", "immobile", "fireweakness", + "bulwark", "iceimmune"]), + faction: "Natural", immobile: true, spellResist: 0, lowpriority: true, evasion: -100, armor: 1, followRange: 100, AI: "wander", regen: -0.5, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + terrainTags: {}, floors:KDMapInit([])}, + + {name: "OneBar", tags: KDMapInit(["construct", "poisonmmune", "soulimmune", "noknockback", "melee", "temporary", "notalk", "nonvulnerable", "nobrain", "nosignal", "immobile"]), + immobile: true, spellResist: 0, lowpriority: true, evasion: -100, armor: 3, followRange: 100, AI: "wander", + visionRadius: 0, maxhp: 4, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + faction: "Warden", + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + events: [ + {trigger: "afterEnemyTick", type: "breakDownForHumanoid", power: 2, dist: 1.5}, + ], + terrainTags: {}, floors:KDMapInit([])}, + + {name: "ForceField", + tags: KDMapInit(["construct", "flying", "poisonmmune", "soulimmune", + "bulwark", "noknockback", "melee", "temporary", "notalk", "nonvulnerable", "nobrain", "nosignal", "immobile"]), + faction: "Enemy", immobile: true, spellResist: 3, lowpriority: true, evasion: -100, armor: 0, followRange: 100, AI: "wander", regen: -0.6, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + + terrainTags: {}, floors:KDMapInit([])}, + + + // Door lock, trap + {name: "DoorLock", + tags: KDMapInit(["construct", "soulimmune", "melee", "noknockback", "unstoppable", "temporary", + "bulwark", "nonvulnerable", "nobrain", "nosignal", "immobile", "poisonimmune", + "soulimmune", + ]), faction: "KinkyConstruct", immobile: true, lowpriority: true, spellResist: 1.5, evasion: -100, armor: 3, followRange: 100, AI: "wander", regen: -1.0, + visionRadius: 0, maxhp: 30, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + terrainTags: {}, floors:KDMapInit([]), + events: [ + {trigger: "duringDamageEnemy", type: "damageThreshold", power: 1, chance: 1.0}, + ], + }, + + {name: "EarthenMonolith", tags: KDMapInit(["construct", "poisonimmune", "soulimmune", "player", "playerinstakill", "noknockback", "melee", "temporary", "notalk", "immobile", "summonedRock", "fireresist", "nonvulnerable", "nobrain", "nosignal"]), immobile: true, spellResist: 1.0, faction: "Rock", lowpriority: true, evasion: -100, armor: 2.5, followRange: 100, AI: "wander", regen: -0.25, + visionRadius: 0, maxhp: 5, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + terrainTags: {}, floors:KDMapInit([])}, + + {name: "Wall", + tags: KDMapInit(["construct", "player", "playerinstakill", "noknockback", "melee", "temporary", "notalk", "nonvulnerable", "immobile", + "bulwark", "nobrain", "nosignal"]), + immobile: true, spellResist: 4, allied: true, lowpriority: true, evasion: -100, armor: 1, followRange: 100, AI: "wander", regen: -1.0, + Resistance: { + profile: ["construct"], + }, + visionRadius: 0, maxhp: 15, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + terrainTags: {}, floors:KDMapInit([])}, + {name: "WallDoor", + tags: KDMapInit(["construct", "player", "playerinstakill", "noknockback", "melee", "temporary", "notalk", + "bulwark", "nonvulnerable", "immobile", "nobrain", "nosignal"]), + immobile: true, spellResist: 4, allied: true, lowpriority: true, evasion: -100, armor: 2.5, followRange: 100, AI: "wander", regen: -0.8, + Resistance: { + profile: ["construct"], + }, + visionRadius: 0, maxhp: 25, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + terrainTags: {}, floors:KDMapInit([])}, + {name: "StaticSphere", tags: KDMapInit(["construct", "flying", "poisonimmune", "silenceimmune", "blindimmune", "soulimmune", "player", "playerinstakill", "noknockback", "melee", "electricImmune", "nowet", "immobile", "temporary", "notalk", "nonvulnerable", "nobrain", "nosignal"]), immobile: true, spellResist: 4, allied: true, lowpriority: true, evasion: -100, armor: 1, followRange: 100, AI: "wander", + visionRadius: 0, maxhp: 20, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 0, attack: "", attackRange: 0, + terrainTags: {}, floors:KDMapInit([]), + events: [ + {type: "CastSpellNearbyEnemy", trigger: "afterEnemyTick", spell: "StaticSphereStrike", aoe: 1.5, player: false}, + {type: "ApplyConductionAoE", trigger: "afterEnemyTick", aoe: 1.5}, + {trigger: "getLights", type: "enemyTorch", power: 5, color: "#ffffff"}, + ], + }, + {name: "Decoy", tags: KDMapInit(["construct", "nosignal", "poisonimmune", "soulimmune", "player", "temporary", "notalk", "deaf"]), noblockplayer: true, allied: true, evasion: 3, armor: 0, + followRange: 100, AI: "wander", triggersTraps: true, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 0, attack: "", attackRange: 0, + maxblock: 0, + maxdodge: 3, + terrainTags: {}, floors:KDMapInit([])}, + {name: "Ally", tags: KDMapInit(["ghost", "flying", "silenceimmune", "blindimmune", "player", "melee"]), keepLevel: true, allied: true, armor: 0, followRange: 1, AI: "hunt", evasion: 0.33, accuracy: 1.5, + visionRadius: 20, playerBlindSight: 100, maxhp: 8, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 1, attack: "MeleeWill", attackRange: 1, attackWidth: 3, power: 1, dmgType: "slash", CountLimit: true, + stamina: 4, + maxblock: 0, + maxdodge: 2, + nonDirectional: true, + terrainTags: {}, floors:KDMapInit([])}, + {name: "AllyDoll", bound: "AllyDoll", color: "#9c2a70", tags: KDMapInit(["human", "nocapture", "player", "blindweakness", "gagged", "blindfold", "melee", "glueimmune", "tickleweakness", "nohelp"]), allied: true, armor: 0, followRange: 1, AI: "hunt", + visionRadius: 20, playerBlindSight: 100, maxhp: 8, regen: -0.1, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 2, attack: "MeleeWill", attackRange: 1, attackWidth: 1, power: 1.5, dmgType: "glue", events: [ + {trigger: "tick", type: "secretToy"}, + ], + stamina: 2, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + terrainTags: {}, floors:KDMapInit([])}, + {name: "PetChastity", bound: "AllyDoll", color: "#8888ff", tags: KDMapInit(["human", "nocapture", "player", "gagged", "blindfold", "melee", "charmresist", "soulweakness", "tickleweakness", "nohelp"]), armor: 1.0, followRange: 1, AI: "hunt", + visionRadius: 6, maxhp: 8, minLevel:0, weight:-1000, movePoints: 3, attackPoints: 2, attack: "MeleeWill", attackRange: 1, attackWidth: 1, power: 2, dmgType: "charm", events: [ + {trigger: "tick", type: "secretToy"}, + ], + stamina: 10, + maxblock: 0, + maxdodge: 0, + sprintspeed: 3.0, + nonDirectional: true, + terrainTags: {}, floors:KDMapInit([])}, + {name: "Pet", color: "#8888ff", tags: KDMapInit(["human", "nocapture", "player", "gagged", "melee", "tickleweakness", "nohelp"]), allied: true, armor: 0, followRange: 4, AI: "hunt", + events: [ + {trigger: "calcManaPool", type: "PetManaRegen", power: 0.01, dist: 1.5}, + {trigger: "tick", type: "secretToy"}, + ], + stamina: 4, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + visionRadius: 20, playerBlindSight: 100, maxhp: 10, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 2, attack: "", attackRange: 0, power: 1.5, dmgType: "tickle", focusPlayer: true, + terrainTags: {}, floors:KDMapInit([])}, + {name: "PetDisplay", color: "#8888ff", tags: KDMapInit(["human", "nocapture", "player", "gagged", "melee", "meleeresist", "nohelp"]), immobile: true, allied: true, armor: 1.5, followRange: 4, AI: "hunt", + events: [ + {trigger: "calcManaPool", type: "PetManaRegen", power: 0.04, dist: 3.99}, + {trigger: "tick", type: "DisplayAura", power: 0.5, dist: 3.99}, + {trigger: "tick", type: "secretToy"}, + ], + nonDirectional: true, + evasion: -9, + maxblock: 0, + maxdodge: 0, + visionRadius: 0, playerBlindSight: 100, maxhp: 15, minLevel:0, weight:-1000, movePoints: 9999, attackPoints: 2, attack: "", attackRange: 0, power: 1.5, dmgType: "tickle", focusPlayer: true, + terrainTags: {}, floors:KDMapInit([])}, + {name: "PlayerGag", tags: KDMapInit(["construct", "nosignal", "poisonresist", "silenceimmune", "blindimmune", "soulimmune", "player", "melee", "temporary", "notalk"]), noblockplayer: true, allied: true, armor: 0, followRange: 1, AI: "guard", accuracy: 1.5, noTargetSilenced: true, + visionRadius: 20, playerBlindSight: 100, maxhp: 4, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 1, attack: "MeleeWillSilenceSuicideStun", + nonDirectional: true, + maxblock: 0, + maxdodge: 0, + silenceTime: 9, stunTime: 1, attackRange: 1, attackWidth: 1, power: 3.5, dmgType: "grope", + terrainTags: {}, floors:KDMapInit([])}, + {name: "ShadowWarrior", tags: KDMapInit(["ghost", "player", "shadow", "flying", "melee", "silenceimmune", "blindimmune", "tickleimmune", "glueimmune", "temporary", "notalk"]), + allied: true, armor: 0, followRange: 1, AI: "hunt", evasion: 1, + spells: ["AllyShadowStrike"], spellCooldownMult: 1, spellCooldownMod: 0, + visionRadius: 5.99, playerBlindSight: 100, maxhp: 11, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 1, attack: "Spell", attackRange: 0, power: 1, + stamina: 4, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + dmgType: "holy", + terrainTags: {}, floors:KDMapInit([])}, + + {name: "FireElemental", color: "#FF6200", tags: KDMapInit(["elemental", "flying", "silenceimmune", "blindimmune", "fire", "player", "ranged", "charmimmune", "fireimmune", "coldweakness", "soapweakness", "icesevereweakness", "stunweakness", "nohelp"]), + keepLevel: true, allied: true, armor: 0, kite: 1.5, followRange: 3, playerFollowRange: 1, AI: "hunt", + spells: ["AllyFirebolt"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, spellRdy: true, evasion: 0.5, CountLimit: true, + visionRadius: 20, playerBlindSight: 100, maxhp: 8, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 1, attack: "Spell", attackRange: 0, power: 1, + terrainTags: {}, floors:KDMapInit([]), + stamina: 3, + maxblock: 0, + maxdodge: 1, + nonDirectional: true, + events: [ + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Ember", time: 3, power: 2, chance: 0.2, aoe: 1.5}, + {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff8933"}, + ], + }, + {name: "NatureSpirit", color: "#88FF88", tags: KDMapInit(["elemental", "flying", "silenceimmune", "blindimmune", "defensive", "nature", "player", "ranged", "groperesist", "crushresist", "chainresist", "glueresist", "charmimmune", "fireweakness", "soapimmune", "acidweakness", "slashweakness", "holyresist", "nohelp"]), + keepLevel: true, allied: true, armor: 0, followRange: 1.5, playerFollowRange: 1, AI: "hunt", + spells: ["NatureMoteBolt"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, spellRdy: true, evasion: -0.2, CountLimit: true, + spellResist: 1, kite: 2.5, + visionRadius: 20, playerBlindSight: 100, maxhp: 12, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 1, attack: "Spell", attackRange: 0, power: 2, + terrainTags: {}, floors:KDMapInit([]), + stamina: 0, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + events: [ + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Vines", time: 3, power: 2, chance: 0.2, aoe: 1.5}, + {trigger: "getLights", type: "enemyTorch", power: 2.5, color: "#88ffaa"}, + {trigger: "afterEnemyTick", type: "NatureSpiritAura", power: 0.2, mult: 1.5, dist: 4.5}, + ], + }, + {name: "HolyOrb", immobile: true, color: "#FFFF88", tags: KDMapInit(["holy", "ghost", "flying", "silenceimmune", "blindimmune", "player", "ranged", "soulresist", "unstoppable", "coldsevereweakness", "flying", "holyresist", "nohelp"]), + allied: true, armor: 0, followRange: 1.5, playerFollowRange: 1, AI: "hunt", + spells: ["AllyHolyBolt"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, evasion: -10, + spellResist: 3, + visionRadius: 20, playerBlindSight: 100, maxhp: 16, minLevel:0, weight:-1000, movePoints: 1000, attackPoints: 1, attack: "Spell", attackRange: 0, power: 3, + terrainTags: {}, floors:KDMapInit([]), + stamina: 0, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 7.99, color: "#ffff88"}, + {trigger: "afterEnemyTick", type: "HolyOrbAura", power: 0.2, mult: 1.5, dist: 7.99}, + {trigger: "orgasm", type: "HolyOrbPunish", dist: 7.99}, + ], + }, + {name: "WaterMote", color: "#73efe8", tags: KDMapInit(["elemental", "flying", "silenceimmune", "blindimmune", "water", "player", "melee", "charmimmune", "fireresist", "iceweakness", "soapimmune", "acidresist", "electricsevereweakness", "nohelp"]), + keepLevel: true, allied: true, armor: 0, followRange: 1, playerFollowRange: 1, AI: "hunt", + evasion: 1.0, CountLimit: true, specialAttack: "Stun", specialCD: 6, + stamina: 4, + maxblock: 0, + maxdodge: 2, + nonDirectional: true, + visionRadius: 20, playerBlindSight: 100, maxhp: 14, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 2, attack: "MeleeWill", attackRange: 1, attackWidth: 1, power: 2, stunTime: 2, dmgType: "soap", + terrainTags: {}, floors:KDMapInit([]), + events: [{trigger: "afterEnemyTick", type: "createWater", power: 1, chance: 0.5, aoe: 0.5}],}, + {name: "EarthMote", color: "#ff5277", tags: KDMapInit(["elemental", "flying", "silenceimmune", "blindimmune", "earth", "player", "melee", "charmimmune", "fireresist", "electricresist", "tickleresist", "nohelp"]), keepLevel: true, allied: true, followRange: 1, playerFollowRange: 1, AI: "hunt", + evasion: -0.4, armor: 2.0, spellResist: 0.5, CountLimit: true, + stamina: 4, + maxblock: 2, + maxdodge: 0, + nonDirectional: true, + visionRadius: 20, playerBlindSight: 100, maxhp: 12, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 4, attack: "MeleeWillSlow", attackRange: 1, attackWidth: 1, power: 6, dmgType: "crush", + terrainTags: {}, floors:KDMapInit([]), + events: [{trigger: "death", type: "createEffectTile", kind: "Cracked", power: 1, chance: 1, aoe: 0.5, time: 40, variance: 10}],}, + {name: "AirMote", color: "#ffffff", tags: KDMapInit(["elemental", "flying", "air", "silenceimmune", "defensive", "blindimmune", "nowet", "player", "ranged", "charmimmune", "fireweakness", "electricresist", "stunimmune", "painresist", "tickleweakness", "groperesist", "nohelp"]), keepLevel: true, allied: true, followRange: 3, kite: 1.5, playerFollowRange: 1, AI: "hunt", + spells: ["AllyWindBlast"], spellCooldownMult: 1, spellCooldownMod: 0, spellRdy: true, evasion: 1.0, CountLimit: true, castWhileMoving: true, + stamina: 4, + maxblock: 0, + maxdodge: 2, + nonDirectional: true, + visionRadius: 20, playerBlindSight: 100, maxhp: 8, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 1, attack: "Spell", attackRange: 0, power: 1, + terrainTags: {}, floors:KDMapInit([])}, + + {name: "Golem", + tags: KDMapInit(["construct", "nosignal", "poisonimmune", "disarmresist", "blindresist", "soulimmune", + "bulwark", "player", "melee", "fireresist", "unstoppable", "tickleresist", "groperesist", "electricresist", "notalk"]), + keepLevel: true, allied: true, armor: 2.0, spellResist: 0.4, followRange: 1, AI: "hunt", + visionRadius: 20, playerBlindSight: 100, maxhp: 18, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "MeleeWill", attackRange: 1, attackWidth: 1, power: 4.5, accuracy: 0.7, CountLimit: true, + stamina: 4, + nonDirectional: true, dmgType: "crush", + terrainTags: {}, floors:KDMapInit([])}, + {name: "StormCrystal", tags: KDMapInit(["construct", "nosignal", "flying", "silenceimmune", "blindimmune", "poisonimmune", "soulimmune", "player", "ranged", "unstoppable", "meleeresist", "tickleimmune", "electricimmune", "soulimmune", "temporary", "notalk", "nonvulnerable", "immobile", "nobrain", "nosignal"]), immobile: true, noblockplayer: true, allied: true, armor: 1.5, followRange: 1, AI: "wander", evasion: -10, + spells: ["AllyCrackle"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, movePoints: 1000, + nonDirectional: true, noFlip: true, + visionRadius: 6, maxhp: 30, regen: -1, minLevel:0, weight:-1000, attackPoints: 1, attack: "Spell", attackRange: 0, power: 1, + terrainTags: {}, floors:KDMapInit([]), + events: [ + {trigger: "getLights", type: "enemyTorch", power: 8, color: "#8888ff"}, + ], + }, + + + {name: "HolyConstruct", nonHumanoid: true, faction: "Angel", clusterWith: "angel", color: "#ffffaa", tags: KDMapInit(["opendoors", "minor", "holy", "holyresist", "construct", "nosignal", "ranged", "soulimmune", "meleeresist", "unstoppable", "celestialRopes", "coldsevereweakness", "flying"]), + cohesion: 0.7, cohesionRange: 10, + spellResist: 3, + nonDirectional: true, + maxblock: 0, + maxdodge: 1, + followLeashedOnly: true, ignorechance: 0, armor: 0.5, followRange: 3, AI: "hunt", buffallies: true, + spells: ["OrbHeal", "CelestialBolt"], spellCooldownMult: 2, spellCooldownMod: 0, tilesMinRange: 1, stopToCast: true, kite: 1.5, kiteChance: 0.9, + visionRadius: 10, maxhp: 7, minLevel: 0, weight: -1, movePoints: 3, attackPoints: 4, attack: "SpellMeleeBlindBind", blindTime: 3, attackWidth: 8, attackRange: 1, power: 4, dmgType: "fire", + terrainTags: {"goddessRage":7, "willPleased":2, "willFriendly":2, "angel": 6}, shrines: ["Will"], allFloors: true, dropTable: [{name: "Ectoplasm", weight: 9}, {name: "ElfCrystal", weight: 3}], + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffff44"} + ], + }, + + {name: "Angel", bound: "Angel", outfit: "Angel", style: "Angel", faction: "Angel", color:"#ffffaa", tags: KDMapInit(["angel", "flying", "ranged", "holyimmune", "divineRestraints", "coldweakness", "meleeresist", "unflinching"]), + followRange: 0, AI: "hunt", evasion: 0.25, attackWhileMoving: true, + Behavior: { + noPlay: true, + }, + maxblock: 2, + maxdodge: 2, + armor: 2.5, spellResist: 2.5, + spells: ["HeatBolt", "WitchElectrify", "EnemyCorona"], spellCooldownMult: 0, spellCooldownMod: 4, castWhileMoving: true, noSpellsLowSP: true, spellRdy: true, + visionRadius: 10, maxhp: 25, minLevel: 4, movePoints: 1.7, attackPoints: 3, attack: "SpellMeleeBindLock", attackRange: 1, attackWidth: 3, power: 2, fullBoundBonus: 4, dmgType: "tickle", + attackLock: "Blue", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 6, color: "#ffff44"}, + ], + terrainTags: {"goddessRage": 0.4, "increasingWeight": 0.2, "goddessAnger": 0.6, "angel": 3,}, allFloors: true, weight: -0.5, + dropTable: [{name: "MagicSword", weight: 1, ignoreInInventory: true}, {name: "MagicSpear", weight: 1, ignoreInInventory: true}, {name: "MagicAxe", weight: 1, ignoreInInventory: true}, {name: "MagicFlail", weight: 1, ignoreInInventory: true}, {name: "MagicHammer", weight: 1, ignoreInInventory: true}], + rep: {"Will": -1, "Elements": -1, "Conjure": -1, "Illusion": -1}}, + + {name: "BlindZombie", bound: "Zombie", style: "Zombie", outfit: "Zombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["ignoretiedup", "nocapture", "minor", "zombie", "melee", "fireweakness", "ribbonRestraints", "meleeweakness"]), + evasion: -1, ignorechance: 0.33, armor: 0, followRange: 1, AI: "wander", + visionRadius: 2.5, maxhp: 8, minLevel:0, weight:14, movePoints: 3, attackPoints: 4, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"increasingWeight":-1.5}, floors:KDMapInit(["grv"]), dropTable: [], difficulty: 0.9}, + {name: "FastZombie", bound: "Zombie", style: "Zombie", outfit: "Zombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["ignoretiedup", "nocapture", "zombie", "melee", "fireweakness", "ribbonRestraints", "meleeweakness"]), + evasion: -1, ignorechance: 0.33, armor: 1, followRange: 1, AI: "hunt", + stamina: 3, + visionRadius: 5, maxhp: 10, minLevel:0, weight:9, movePoints: 3, attackPoints: 4, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"secondhalf":10, "lastthird":14}, floors:KDMapInit(["grv"]), dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, + {name: "SummonedZombie", bound: "Zombie", style: "Zombie", outfit: "Zombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["ignoretiedup", "nocapture", "zombieTrap", "zombie", "melee", "fireweakness", "ribbonRestraints", "meleeweakness", "temporary", "nocapture"]), + evasion: -1, ignorechance: 0.33, armor: 1.5, followRange: 1, AI: "hunt", regen: -0.1, + Behavior: { + leashCondition: "fuukaLeash", + }, + visionRadius: 5, maxhp: 12, minLevel:0, weight:-1000, movePoints: 3, attackPoints: 3, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"secondhalf":10, "zombieTrap": 50, "lastthird":14}, floors:KDMapInit([])}, + {name: "MageZombie", bound: "MageZombie", style: "Zombie", outfit: "Zombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["leashing", "zombie", "ranged", "zombieTrap", "fireweakness", "ribbonRestraints", "meleeweakness", "hunter"]), + spellResist: 0.5, evasion: -1, armor: 1, followRange: 2, AI: "hunt", + spells: ["ZombieOrb", "ZombieOrbIce"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, projectileAttack: true, + visionRadius: 6, maxhp: 11, minLevel:2, weight:14, movePoints: 3, attackPoints: 4, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, + attackLock: "Purple", + terrainTags: {"zombieTrap": 25}, floors:KDMapInit(["grv", "tmb"]), dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10}]}, + {name: "TalismanZombie", bound: "TalismanZombie", style: "Zombie", outfit: "Zombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["leashing", "zombie", "zombieTrap", "ranged", "fireweakness", "ribbonRestraints", "meleeweakness", "hunter"]), + spellResist: 0.5, evasion: -1, armor: 1, followRange: 3, AI: "hunt", + spells: ["ZombieOrb", "ZombieBuff", "OrbHeal", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, kite: 1.5, projectileAttack: true, + visionRadius: 6, maxhp: 20, minLevel:3, weight:14, movePoints: 3, attackPoints: 4, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, + attackLock: "Purple", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffff44"}, + ], + terrainTags: {"mummy": 3, "zombieTrap": 10}, floors:KDMapInit(["grv", "tmb"]), dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10}]}, + {name: "SamuraiZombie", bound: "SamuraiZombie", style: "Zombie", outfit: "Zombie", playLine: "Zombie", clusterWith: "zombie", + tags: KDMapInit(["leashing", "zombie", + "bulwark", "zombieTrap", "melee", "elite", "fireweakness", "unflinching", "ropeRestraints", "ropeRestraints2", "meleeweakness", "hunter"]), + evasion: -1, armor: 1, followRange: 1, AI: "hunt", + stunTime: 2, specialCD: 6, specialAttack: "Stun", specialRemove: "BindLock", specialPower: 5, specialDamage: "pain", + attackLock: "White", + Resistance: { + block_phys: 2, + }, + stamina: 2, + specialCDonAttack: false, visionRadius: 6, maxhp: 20, minLevel:4, weight:9, movePoints: 3, attackPoints: 3, attack: "MeleeBindLock", + attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, specialWidth: 5, specialRange: 1, + terrainTags: {"secondhalf":5, "zombieTrap": 20, "lastthird":5}, shrines: ["Will"], floors:KDMapInit(["grv", "tmb"]), dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Sword", weight: 3.5, ignoreInInventory: true},]}, + {name: "NawashiZombie", bound: "NawashiZombie", style: "Zombie", outfit: "Zombie", playLine: "Zombie", clusterWith: "zombie", tags: KDMapInit(["leashing", "zombie", "zombieTrap", "melee", "elite", "fireweakness", "unflinching", "ropeRestraints", "ropeRestraints2", "meleeweakness", "hunter"]), + evasion: -1, armor: 0, followRange: 1, AI: "hunt", + visionRadius: 8, maxhp: 11, minLevel:2, weight:2, movePoints: 2, attackPoints: 2, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, difficulty: 1.4, + terrainTags: {"secondhalf":1, "lastthird":2}, shrines: [], floors:KDMapInit(["grv", "tmb"]), dropTable: [{name: "Gold", amountMin: 5, amountMax: 15, weight: 10}, {name: "Rope", weight: 3.5, ignoreInInventory: true}, {name: "Scissors", weight: 0.5, ignoreInInventory: true},]}, + + {name: "Ninja", nameList: "japanese", playLine: "Hunter", outfit: "Ninja", style: "Fire", faction: "Bountyhunter", bound: "Ninja", clusterWith: "human", color: "#814BB7", tags: KDMapInit(["leashing", "shadowclan", "antiMagic", "opendoors", "human", "guardCall", "imprisonable", "bountyhunter", "ninja", "melee", "ropeRestraints", "ropeRestraints2", "jailer", "unarmedresist", "pierceresist", "slashresist", "glueweakness", "chainweakness", "search"]), followLeashedOnly: true, blindSight: 5, followRange: 1, AI: "hunt", projectileAttack: true, + stunTime: 4, specialCD: 6, specialCharges: 6, specialAttack: "Stun", specialRemove: "BindLock", specialCDonAttack: true, strictAttackLOS: true, focusPlayer: true, + projectileTargeting: true, + Sound: { + baseAmount: 0.5, + moveAmount: 4, + decay: 1.5, + }, + Resistance: { + block_phys: 3, + }, + armor: -1, + preferDodge: true, + maxblock: 2, + maxdodge: 2, + stamina: 8, + attackLock: "White", + visionRadius: 7, maxhp: 9, minLevel:4, weight:5, movePoints: 1, attackPoints: 3, attack: "MeleeBindLock", attackWidth: 1, attackRange: 1, power: 1.5, dmgType: "crush", fullBoundBonus: 1.5, specialWidth: 1, specialAttackPoints: 3, specialRange: 4, specialMinRange: 1.5, //specialFollow: 3, + terrainTags: {"secondhalf":3, "lastthird":7, "ropeAnger": 2, "bountyhunter": 8, "rope": 5}, shrines: ["Illusion", "Rope"], floors:KDMapInit(["cat", "tmb", "tmp", "cry"]), + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, + {name: "Deputy", playLine: "Officer", color: "#1451f1", faction: "Bountyhunter", bound: "Deputy", outfit: "Bountyhunter", style: "Water", clusterWith: "human", tags: KDMapInit(["leashing", "antiMagic", "opendoors", "imprisonable", "human", "police", "guardCall", "bountyhunter", "handcuffer", "steelCuffs", "police", "melee", "search", "jail", "jailer"]), + followLeashedOnly: true, blindSight: 5, followRange: 1, AI: "hunt", projectileAttack: true, + projectileTargeting: true, + armor: 0.8, + stamina: 1, + maxblock: 2, + maxdodge: 1, evasion: -0.3, + stunTime: 5, specialCD: 11, specialCharges: 4, specialAttack: "Stun", specialRemove: "BindLock", specialCDonAttack: true, strictAttackLOS: true, specialWidth: 2, specialAttackPoints: 4, specialRange: 5, specialMinRange: 1.5, //specialFollow: 3, + visionRadius: 8, maxhp: 12, minLevel:2, weight:1, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 3, + attackLock: "White", + terrainTags: {"secondhalf":2, "lastthird":4, "leatherAnger": 2, "metalAnger": 2, "bountyhunter": 8, "metal": 2, "NoPolice": -10000}, shrines: ["Leather", "Metal"], floors:KDMapInit(["grv", "jng", "lib", "cry"]), + dropTable: [{name: "Donut", weight: 1}]}, + {name: "NinjaStalker", nameList: "japanese", playLine: "Hunter", faction: "Bountyhunter", bound: "NinjaStalker", outfit: "Ninja", style: "Ice", clusterWith: "human", color: "#814BB7", tags: KDMapInit(["leashing", "shadowclan", "antiMagic", "opendoors", "ninja", "human", "bountyhunter", "melee", "ropeRestraints", "ropeRestraints2", "unarmedresist", "pierceresist", "slashresist", "glueweakness", "chainweakness", "search"]), blindSight: 5, followRange: 1, AI: "ambush", stealth: 1, noReveal: true, + ambushRadius: 1.9, wanderTillSees: true, visionRadius: 7, maxhp: 9, minLevel:4, weight:4, movePoints: 1, attackPoints: 3, focusPlayer: true, + Sound: { + baseAmount: 0.25, + moveAmount: 3, + decay: 1.5, + }, + preferDodge: true, + maxblock: 1, + maxdodge: 2, + stamina: 8, + Resistance: { + block_phys: 2, + }, + armor: -1, + attackLock: "White", + attack: "MeleeBindLock", attackWidth: 1, attackRange: 1, power: 3, dmgType: "crush", fullBoundBonus: 2, specialWidth: 1, specialAttackPoints: 3, specialRange: 4, specialMinRange: 1.5, //specialFollow: 3, + terrainTags: {"secondhalf":3, "lastthird":7, "ropeAnger": 2, "bountyhunter": 8, "rope": 5}, shrines: ["Illusion", "Rope"], floors:KDMapInit(["cat", "tmb", "tmp", "cry"]), + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, + {name: "Nawashi", nameList: "japanese", playLine: "Hunter", outfit: "Sailor", style: "Earth", + faction: "Bountyhunter", bound: "Nawashi", clusterWith: "construct", color: "#5261ff", + tags: KDMapInit(["leashing", "antiMagic", "opendoors", "guardCall", "human", "bountyhunter", "elite", "melee", "ropeRestraints", "ropeRestraints2", "ropeRestraintsWrist", "ropeAuxiliary", "jail", "jailer", "ropeRestraintsHogtie"]), + spells: ["RopeAttack"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, stealth: 2, noReveal: true, focusPlayer: true, + followLeashedOnly: true, blindSight: 10, followRange: 1, kite: 3, AI: "hunt", evasion: 0.5, dontKiteWhenDisabled: true, + stamina: 6, + preferDodge: true, + maxblock: 1, + maxdodge: 3, + visionRadius: 7, maxhp: 22, minLevel:8, weight:1, movePoints: 1.5, attackPoints: 2, attack: "SpellMeleeBind", attackWidth: 1, attackRange: 1, power: 2, dmgType: "crush", fullBoundBonus: 1, specialWidth: 1, specialAttackPoints: 3, specialRange: 4, specialMinRange: 1.5, //specialFollow: 3, + terrainTags: {"secondhalf":1, "lastthird":2, "ropeAnger": 1, "ropeRage": 1, "bountyhunter": 4, "rope": 5}, shrines: ["Rope"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 10}, {name: "Scissors", ignoreInInventory: true, weight: 10}, {name: "EnchKnife", ignoreInInventory: true, weight: 1}, {name: "Rope", weight: 100, ignoreInInventory: true},]}, + + {name: "Maidforce", nameList: "maid", faction: "Maidforce", bound: "Maid", outfit: "Maidforce", style: "Maid", clusterWith: "maid", playLine: "SubMaid", color: "#814BB7", tags: KDMapInit(["leashing", "submissive", "tickleweakness", "imprisonable", "opendoors", "human", "minor", "maid", "melee", "ropeRestraints", "ropeRestraints2", "handcuffer", "maidVibeRestraintsLimited", "maidRestraintsLight", "jail", "jailer", "search"]), blindSight: 3, followRange: 1, AI: "hunt", + stealth: 3.5, noReveal: true, bindOnDisableSpecial: true, bindOnDisable: true, hitsfx: "Tickle", events: [ + {trigger: "tick", type: "secretToy"}, + ], + Sound: { + baseAmount: 1, + moveAmount: 5, + decay: 1.5, + }, + preferDodge: true, + stamina: 4, + maxblock: 0, + maxdodge: 1, + smartBind: true, + attackLock: "White", + specialCD: 3, specialAttack: "BindLock", specialCDonAttack: true, + visionRadius: 6, maxhp: 8, minLevel:0, weight:-2, movePoints: 2, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 2, dmgType: "tickle", fullBoundBonus: 2, + terrainTags: {"secondhalf":1, "lastthird":1, "illusionAnger": 22, "illusionRage": 12, "increasingWeight":-1, "maid": 25}, shrines: ["Illusion"], allFloors: true, + dropTable: [{name: "Duster", weight: 10, ignoreInInventory: true}, {name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, + {name: "MaidforcePara", nameList: "maid", faction: "Maidforce", bound: "MaidforcePara", outfit: "MaidforcePara", style: "Maid", clusterWith: "maid", playLine: "DomMaid", color: "#814BB7", tags: KDMapInit(["leashing", "antiMagic", "ballGagRestraints", "opendoors", "imprisonable", "tickleweakness", "guardCall", "human", "miniboss", "maid", "ranged", "ropeRestraints", "ropeRestraints2", "handcuffer", "maidVibeRestraintsLimited", "maidRestraintsLight", "jail", "jailer", "hunter"]), followLeashedOnly: true, blindSight: 5, followRange: 4, AI: "hunt", guardChance: 0.6, projectileAttack: true, + spells: ["ParasolBuff", "Hairpin", "EnemyCM1"], + unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: 0, + buffallies: true, kite: 2.5, events: [ + {trigger: "tick", type: "secretToy"}, + ], + preferDodge: true, + Sound: { + baseAmount: 0.5, + moveAmount: 4, + decay: 1.5, + }, + maxblock: 1, + maxdodge: 1, + stamina: 4, + stealth: 2.5, disarm: 0.5, spellRdy: true, armor: 0.4, + attackLock: "White", + visionRadius: 8, maxhp: 10, minLevel:0, weight:-2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", + terrainTags: {"secondhalf":1, "lastthird":1, "illusionAnger": 17, "illusionRage": 11, "maid": 16}, shrines: ["Illusion"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, ]}, + {name: "MaidforceStalker", nameList: "maid", faction: "Maidforce", bound: "MaidforceStalker", outfit: "MaidforceNinja", style: "Maid", clusterWith: "maid", playLine: "DomMaid", color: "#814BB7", + tags: KDMapInit(["leashing", "opendoors", "human", "maid", "melee", "maidRestraints", "handcuffer", "maidRestraintsHeavy", "maidVibeRestraintsLimited", "shadowclan", "unarmedresist", "pierceresist", "antiMagic", "tickleweakness", "slashresist", "glueweakness", "chainweakness", "jail", "jailer", "hunter"]), + followLeashedOnly: true, blindSight: 5, followRange: 1, AI: "hunt", guardChance: 0.6, projectileAttack: true, evasion: 0.33, events: [ + {trigger: "tick", type: "secretToy"}, + ], + preferDodge: true, + maxblock: 2, + maxdodge: 3, + stamina: 8, + Sound: { + baseAmount: 0.5, + moveAmount: 3, + decay: 1.5, + }, + spells: ["EnemyFlashBomb", "MirrorImage"], spellCooldownMult: 1, spellCooldownMod: 0, kite: 2, dontKiteWhenDisabled: true, castWhileMoving: true, + stealth: 1.5, + attackLock: "White", + visionRadius: 7, maxhp: 12, minLevel:4, weight:-2, movePoints: 1, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"secondhalf":1, "lastthird":1, "illusionAnger": 15, "illusionRage": 10, "increasingWeight":0.5, "maid": 15}, shrines: ["Illusion"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "PotionInvisibility", weight: 3}]}, + {name: "MaidforceStalkerImage", faction: "Maidforce", color: "#814BB7", tags: KDMapInit(["ghost", "maid", "melee"]), followLeashedOnly: true, blindSight: 12, followRange: 2, AI: "hunt", guardChance: 0.6, projectileAttack: true, evasion: -10, + kite: 2, dontKiteWhenDisabled: true, + stealth: 1.5, + stamina: 4, + preferDodge: true, + maxblock: 0, + maxdodge: 3, + visionRadius: 7, maxhp: 1, minLevel:0, weight:-10, movePoints: 1.25, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "grope", + terrainTags: {}, shrines: ["Illusion"], floors:KDMapInit([]),}, + {name: "MaidforceMafia", nameList: "italian", faction: "Maidforce", bound: "MaidforceMafia", outfit: "MaidforceMafia", style: "Maid", clusterWith: "maid", color: "#814BB7", playLine: "GunnerMaid", tags: KDMapInit(["leashing", "gun", "opendoors", "imprisonable", "tickleweakness", "human", "elite", "maid", "ranged", "maidRestraints", "handcuffer", "maidVibeRestraintsLimited", "jail", "jailer", "hunter"]), followLeashedOnly: true, followRange: 4, AI: "hunt", guardChance: 0.6, projectileAttack: true, evasion: -0.25, + spells: ["RubberBullets"], spellCooldownMult: 1, spellCooldownMod: 0, kite: 3, noKiteWhenHarmless: true, noSpellsWhenHarmless: true, armor: 0.8, + events: [ + {trigger: "tick", type: "secretToy"}, + // It's supposed to be the light of the cigar + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ffaa00"}, + ], + preferBlock: true, + maxblock: 2, + maxdodge: 1, + specialAttack: "Stun", specialRemove: "BindLock", specialCD: 10, + visionRadius: 7.5, maxhp: 14, minLevel:4, weight:-7, movePoints: 2.5, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "pain", fullBoundBonus: 3, + stamina: 5, sprintspeed: 2.0, + terrainTags: {"secondhalf":1, "lastthird":1, "open": 2, "illusionAnger": 12, "illusionRage": 5, "latexAnger": 4, "maid": 15}, shrines: ["Illusion"], allFloors: true, + attackLock: "White", + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}]}, + {name: "MaidforceMini", nameList: "russian", faction: "Maidforce", bound: "MaidforceMini", outfit: "MaidforceHeavy", style: "Maid", clusterWith: "maid", color: "#814BB7", playLine: "GunnerMaid", + tags: KDMapInit(["leashing", "opendoors", "imprisonable", "tickleweakness", "human", "elite", "maid", "ranged", "maidRestraintsLight", + "bulwark", "handcuffer", "gun", "jail", "jailer", "hunter"]), + followLeashedOnly: true, followRange: 12, AI: "hunt", guardChance: 0.7, projectileAttack: true, evasion: -1.0, + spells: ["Minigun", "MinigunWindup"], spellCooldownMult: 1, spellCooldownMod: 0, noKiteWhenHarmless: true, noSpellsWhenHarmless: true, armor: 1.0, stopToCast: true, + events: [ + {trigger: "tick", type: "secretToy"}, + ], + preferBlock: true, + maxblock: 1, + maxdodge: 0, + sneakThreshold: 3, kite: 3.5, kiteChance: 0.75, + visionRadius: 8, maxhp: 10, minLevel:3, weight:-6, movePoints: 3.2, attackPoints: 4, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "pain", fullBoundBonus: 4, + terrainTags: {"secondhalf":2, "lastthird":-1, "open": 8, "illusionAnger": 9, "illusionPleased": 9, "illusionFriendly": 5, "illusionRage": 3, "latexAnger": 3, "maid": 10}, shrines: ["Illusion"], allFloors: true, + weightMult: 0.5, + attackLock: "White", + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}]}, + {name: "MaidforceHead", nameList: "bountyhunter", faction: "Maidforce", bound: "MaidforceHead", outfit: "MaidforceHead", style: "Maid", clusterWith: "maid", color: "#814BB7", playLine: "HeadMaid", tags: KDMapInit(["leashing", "antiMagic", "guardCall", "tickleweakness", "opendoors", "human", "maid", "unflinching", "boss", "ranged", "maidRestraintsHeavy", "maidRestraintsNonChastity", "maidVibeRestraints", "handcuffer", "jailer", "hunter"]), followLeashedOnly: true, followRange: 3.5, AI: "hunt", guardChance: 0.6, projectileAttack: true, + spells: ["AmpuleGreen", "Hairpin", "RestrainingDevice"], spellCooldownMult: 1, spellCooldownMod: 0, hitsfx: "Tickle", disarm: 1, ignoreStaminaForBinds: true, sneakThreshold: 1, focusPlayer: true, + useLock: "Red", kite: 2.5, armor: 1.5, + RestraintFilter: { + ignoreInitialTag: ["maidVibeRestraints"], + }, + stamina: 4, + maxblock: 3, + maxdodge: 3, + preferBlock: true, + Sound: { + baseAmount: 0.5, + moveAmount: 4, + decay: 1.5, + }, + RemoteControl: { + remote: 5, remoteAmount: 4, + }, bypass: true, noLeashUnlessExhausted: true, evasion: 0.15, //-15 weight + events: [ + {trigger: "afterEnemyTick", type: "maidforceHeadAura", dist: 1.5}, + ], + visionRadius: 8, maxhp: 28, minLevel:6, weight:-14, movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLockAllVibe", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 1.5, dmgType: "tickle", fullBoundBonus: 1, + terrainTags: {"secondhalf":1, "lastthird":1, "open": 4, "illusionAnger": 10, "illusionRage": 4, "maid": 10}, shrines: ["Illusion"], allFloors: true, attackLock: "Red", + dropTable: [{name: "Gold", amountMin: 30, amountMax: 40, weight: 20}, {name: "KeyCard", weight: 10}, {name: "EnchKnife", ignoreInInventory: true, weight: 1}]}, + + {name: "Skeleton", nonHumanoid: true, bound: "Skeleton", playLine: "Skeleton", clusterWith: "skeleton", tags: KDMapInit(["nosub", "skeletonTrap", "leashing", "skeleton", "gagged", "melee", "ropeRestraints", "leatherRestraints", "clothRestraints", "coldresist", "crushweakness", "search"]), ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", + visionRadius: 4, maxhp: 5, minLevel:0, weight:8, movePoints: 2, attackPoints: 3, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1.0, + evasion: -0.1, + summon: [{enemy: "LesserSkeleton", range: 2.5, count: 2, strict: true}], + master: {type: "Necromancer", range: 4.5}, + stamina: 3, + maxblock: 1, + maxdodge: 1, + preferBlock: true, + terrainTags: {"secondhalf":4, "skeletonTrap": 50, "increasingWeight":-0.5, "skeleton": 14}, shrines: ["Leather"], floors:KDMapInit(["cat", "tmb"]), dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}]}, + {name: "SkeletonArcher", nonHumanoid: true, bound: "Skeleton", playLine: "Skeleton", clusterWith: "skeleton", tags: KDMapInit(["nosub", "skeletonTrap", "leashing", "skeleton", "gagged", "ranged", "ropeRestraints", "leatherRestraints", "clothRestraints", "coldresist", "crushweakness", "search"]), ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", + visionRadius: 6, maxhp: 5, minLevel:0, weight:6, movePoints: 2.5, attackPoints: 3, attack: "SpellMeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1.0, + master: {type: "Necromancer", range: 3.5}, + summon: [{enemy: "LesserSkeleton", range: 2.5, count: 2, strict: true}], + dontKiteWhenDisabled: true, kite: 3.5, followLeashedOnly: true, + spells: ["CursedArrow"], miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, castWhileMoving: true, projectileAttack: true, + evasion: -0.1, + stamina: 3, + maxblock: 0, + maxdodge: 1, + terrainTags: {"secondhalf":4.5, "skeletonTrap": 30, "skeleton": 10}, shrines: ["Leather"], floors:KDMapInit(["cat", "tmb"]), dropTable: [{name: "Gold", amountMin: 5, amountMax: 15, weight: 10}, {name: "Bow", ignoreInInventory: true, weight: 100}]}, + {name: "SummonedSkeleton", nonHumanoid: true, bound: "Skeleton", playLine: "Skeleton", clusterWith: "skeleton", tags: KDMapInit(["nosub", "leashing", "skeleton", "gagged", "minor", "melee", "coldresist", "ropeRestraints", "leatherRestraints", "clothRestraints", "crushweakness"]), ignorechance: 0, armor: 0, followRange: 1, AI: "guard", + visionRadius: 5, maxhp: 5, minLevel:0, weight:8, movePoints: 2, attackPoints: 3, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 0.5, dmgType: "grope", fullBoundBonus: 0.5, + evasion: -0.1, + stamina: 3, + maxblock: 0, + maxdodge: 0, + preferBlock: true, + terrainTags: {"lastthird":-8}, shrines: [], floors:KDMapInit([])}, + {name: "LesserSkeleton", nonHumanoid: true, bound: "Skeleton", playLine: "Skeleton", noChaseUnrestrained: true, clusterWith: "skeleton", tags: KDMapInit(["nosub", "skeletonTrap", "minor", "leashing", "skeleton", "gagged", "melee", "coldresist", "crushweakness"]), ignorechance: 0, armor: 0, followRange: 1, AI: "wander", evasion: -2, + visionRadius: 1, maxhp: 2.5, minLevel:0, weight:10, movePoints: 2, attackPoints: 3, attack: "MeleeWillSlow", attackWidth: 1, attackRange: 1, power: 0.5, dmgType: "grope", fullBoundBonus: 0.5, + stamina: 3, + master: {type: "Necromancer", range: 4.5}, + preferBlock: true, + maxblock: 0, + maxdodge: 1, + terrainTags: {"secondhalf":-8, "skeletonTrap": 100, "lastthird":-8, "increasingWeight":-1}, floors:KDMapInit(["cat", "tmb"])}, + {name: "GreaterSkeleton", nonHumanoid: true, bound: "GreaterSkeleton", playLine: "Skeleton", clusterWith: "skeleton", + tags: KDMapInit(["nosub", "leashing", "skeletonTrap", + "bulwark", "skeleton", "gagged", "melee", "unflinching", "elite", "coldresist", "crushweakness", "hunter"]), + stamina: 4, + master: {type: "Necromancer", range: 5.5}, + maxblock: 4, + maxdodge: 1, + preferBlock: true, + ignorechance: 0, armor: 2, followRange: 1.5, AI: "hunt", guardChance: 0.6, disarm: 0.5, + visionRadius: 4, maxhp: 10, minLevel:9, weight:5, movePoints: 3, attackPoints: 3, attack: "MeleeWillSlow", attackWidth: 3, attackRange: 1, power: 5, dmgType: "crush", fullBoundBonus: 0, + evasion: -0.4, + terrainTags: {"secondhalf":4, "lastthird":6, "skeletonTrap": 25, "increasingWeight":0.5}, floors:KDMapInit(["cat", "tmb", "tmp"]), dropTable: [{name: "PotionStamina", weight: 3}, {name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Hammer", weight: 50, ignoreInInventory: true}]}, + {name: "HeavySkeleton", nonHumanoid: true, bound: "HeavySkeleton", playLine: "Skeleton", clusterWith: "skeleton", color: "#aaaaaa", + tags: KDMapInit(["nosub", "leashing", + "bulwark", "skeletonTrap", "skeleton", "gagged", "melee", "unflinching", "elite", "coldresist", "crushweakness", "hunter", "fiddle", "obsidianRestraints"]), + stamina: 4, + preferBlock: true, + master: {type: "Necromancer", range: 5.5}, + maxblock: 4, + maxdodge: 1, + ignorechance: 0, armor: 3, followRange: 1.5, AI: "hunt", guardChance: 0.6, disarm: 0.5, + visionRadius: 6, maxhp: 16, minLevel:15, weight:4, movePoints: 3, attackPoints: 3, attack: "MeleeWillSlowBind", attackWidth: 3.6, attackRange: 1, power: 5, dmgType: "crush", fullBoundBonus: 3, + evasion: -0.4, + terrainTags: {"secondhalf":1, "lastthird":4, "skeletonTrap": 10, "increasingWeight":1}, floors:KDMapInit(["cat", "tmb", "tmp"]), + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Axe", weight: 50, ignoreInInventory: true}]}, + + {name: "Ghost", color: "#FFFFFF", faction: "Ghost", clusterWith: "ghost", tags: KDMapInit(["illusionTrap", "ghost", "flying", "spooky", "melee", "minor", "glueimmune", "chainimmune", "magicweakness"]), + ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", guardChance: 0.6, hitsfx: "Tickle", + visionRadius: 6, blindSight: 3, evasion: 9.0, alwaysEvade: true, maxhp: 1, minLevel:0, weight:1, movePoints: 1.5, + attackPoints: 2, attack: "MeleeSuicideEffectWill", attackWidth: 1, attackRange: 1, power: 1, dmgType: "tickle", suicideOnEffect: true, fullBoundBonus: 1, + effect: { + effect: {name: "GhostHaunt", count: 1}, + }, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ffffff"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0.5, + attackAmount: 0, + decay: 5, + }, + maxblock: 0, + maxdodge: 0, + terrainTags: {"ghost" : 4.9}, shrines: ["Illusion"], allFloors: true, + dropTable: [{name: "Ectoplasm", weight: 1}]}, + {name: "TickleTerror", faction: "Ghost", color: "#FFFFFF", tags: KDMapInit(["illusionTrap", "chestTrap", "ignorenoSP", "comfyRestraints", "spooky", "ghost", "flying", "melee", "glueimmune", "chainimmune", "meleeresist", "magicweakness"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", noAlert: true, hitsfx: "Tickle", + visionRadius: 8, blindSight: 8, evasion: 0.5, maxhp: 12, minLevel:4, weight:0.1, movePoints: 2, attackPoints: 2, attack: "MeleeWillBind", attackWidth: 3, attackRange: 1, power: 3, dmgType: "tickle", fullBoundBonus: 3, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ffffff"}, + ], + RestraintFilter: { + unlimitedRestraints: true, + }, + Sound: { + baseAmount: 0, + moveAmount: 1.5, + attackAmount: 0, + decay: 5, + }, + maxblock: 0, + maxdodge: 0, + terrainTags: {"ghost" : 1.9, "increasingWeight": 0.2, "chestTrap": 50, revenge: 50, "goddessRage": 4}, shrines: ["Illusion"], allFloors: true, + dropTable: [{name: "Ectoplasm", weight: 1}]}, + {name: "HugHorror", faction: "Ghost", color: "#FFFFFF", tags: KDMapInit(["illusionTrap", "chestTrap", "ignorenoSP", "ghostRestraints", "spooky", "ghost", "flying", "melee", "glueimmune", "chainimmune", "meleeresist", "magicweakness"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", noAlert: true, + spells: ["GhostAttack", "GagGeistAttack"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, + stunTime: 4, specialCD: 20, specialAttack: "Stun", specialPower: 4, + visionRadius: 8, blindSight: 8, evasion: 0.2, maxhp: 20, minLevel:4, weight:0.1, movePoints: 3, attackPoints: 2, attack: "MeleeWillSpell", attackWidth: 3, attackRange: 1, power: 1, dmgType: "crush", fullBoundBonus: 2, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ffffff"}, + ], + RestraintFilter: { + unlimitedRestraints: true, + }, + Sound: { + baseAmount: 0, + moveAmount: 2.5, + attackAmount: 0, + decay: 3, + }, + maxblock: 0, + maxdodge: 0, + terrainTags: {"ghost" : 1.9, "increasingWeight": 0.2, "chestTrap": 50, revenge: 50, "goddessRage": 4}, shrines: ["Illusion"], allFloors: true, + dropTable: [{name: "Ectoplasm", weight: 1}]}, + {name: "GagGeist", faction: "Ghost", color: "#FFFFFF", tags: KDMapInit(["illusionTrap", "chestTrap", "ignoregagged", "invisGag", "spooky", "ghost", "flying", "melee", "glueimmune", "chainimmune", "meleeresist", "magicweakness"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", noAlert: true, + stealth: 1.5, + RestraintFilter: { + unlimitedRestraints: true, + }, + visionRadius: 8, blindSight: 8, evasion: 0.3, maxhp: 9, minLevel:0, weight:0.3, movePoints: 1.4, attackPoints: 2, attack: "MeleeBindWill", attackWidth: 3, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ffffff"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0.5, + attackAmount: 0, + decay: 5, + }, + maxblock: 0, + maxdodge: 0, + terrainTags: {"ghost" : 3.9, "increasingWeight": 0.15, "chestTrap": 80, revenge: 60, "goddessRage": 5}, shrines: ["Illusion"], allFloors: true, + dropTable: [{name: "Ectoplasm", weight: 1}]}, + {name: "TimeGhost", faction: "Ghost", color: "#FFFFFF", tags: KDMapInit(["timeghost", "timestealth", "ignoreharmless", "invisRestraints", "timeimmune", "spooky", "ghost", "flying", "melee", "glueimmune", "chainimmune", "meleeresist"]), + ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", noAlert: true, + RestraintFilter: { + unlimitedRestraints: true, + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + stealth: 4.5, + stunTime: 3, + visionRadius: 14, blindSight: 14, evasion: 1.0, maxhp: 10, minLevel:0, weight:-1000, movePoints: 3, attackPoints: 2, attack: "MeleeBindWillStamina", attackWidth: 3, attackRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 2, + events: [ + {trigger: "tick", type: "TimeGhostDecay", power: 5}, + ], regen: 4, + maxblock: 0, + maxdodge: 0, + terrainTags: {"timeghost" : 1010}, shrines: ["Illusion"], allFloors: true,}, + + {name: "Poltergeist", faction: "Ghost", color: "#FFFFFF", tags: KDMapInit(["illusionTrap", "chestTrap", "ignoreharmless", "invisRestraints", "spooky", "ghost", "flying", "melee", "glueimmune", "chainimmune", "meleeresist", "magicweakness"]), + ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", noAlert: true, + RestraintFilter: { + unlimitedRestraints: true, + }, + stealth: 1.5, + visionRadius: 8, blindSight: 8, evasion: 0.2, maxhp: 16, minLevel:4, weight:0.3, movePoints: 2, attackPoints: 2, attack: "MeleeBindWillStamina", attackWidth: 3, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ffffff"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0.5, + attackAmount: 0, + decay: 5, + }, + maxblock: 0, + maxdodge: 1, + terrainTags: {"ghost" : 3, "increasingWeight": 0.1, "chestTrap": 50, revenge: 50, "goddessRage": 4}, shrines: ["Illusion"], allFloors: true, + dropTable: [{name: "Ectoplasm", weight: 1}]}, + {name: "GreedyGhast", faction: "Ghost", color: "#FFFFFF", tags: KDMapInit(["illusionTrap", "chestTrap", "ignorenoSP", "ghost", "flying", "melee", "spooky", "glueimmune", "chainimmune", "meleeresist", "magicweakness"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", noAlert: true, + visionRadius: 6, blindSight: 4, evasion: 0.5, maxhp: 7, minLevel:2, weight:0.1, movePoints: 2.2, attackPoints: 2, attack: "MeleeWill", attackWidth: 3, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ffffff"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 1, + attackAmount: 0, + decay: 4, + }, + maxblock: 0, + maxdodge: 0, + terrainTags: {"ghost" : 1.9, "increasingWeight": 0.05, "chestTrap": 100, revenge: 50, "goddessRage": 5}, shrines: ["Illusion"], allFloors: true, + dropTable: [{name: "Ectoplasm", weight: 1}]}, + + {name: "OrbGuardian", faction: "Ghost", alwaysHostile: true, clusterWith: "ghost", tags: KDMapInit(["divine", "melee", "flying", "glueimmune", "chainimmune"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", + spells: ["ShadowStrike"], spellCooldownMult: 1, spellCooldownMod: 0, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 5, color: "#440099"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0.5, + attackAmount: 0, + decay: 5, + }, + maxblock: 0, + maxdodge: 0, + visionRadius: 100, blindSight: 100, evasion: 0.5, alwaysEvade: true, maxhp: 12, minLevel:0, weight:-10, movePoints: 2, attackPoints: 1, attack: "Spell", attackWidth: 3, + attackRange: 1, power: 4, dmgType: "cold", fullBoundBonus: 0, + terrainTags: {}, shrines: [], floors:KDMapInit([]), + dropTable: [{name: "Ectoplasm", weight: 1}]}, + + + + {name: "TickleHand", hidetimerbar: true, faction: "Witch", clusterWith: "ghost", color: "#FFFFFF", tags: KDMapInit(["ignorenoSP", "ghost", "flying", "melee", "glueimmune", "chainimmune", "magicweakness"]), + ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", regen: -0.1, noAlert: true, hitsfx: "Tickle", + visionRadius: 10, blindSight: 3, evasion: 9.0, alwaysEvade: true, maxhp: 1, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 1, attack: "MeleeWill", attackWidth: 3, attackRange: 1, power: 3, dmgType: "tickle", fullBoundBonus: 0, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ffffff"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0.5, + attackAmount: 0, + decay: 5, + }, + maxblock: 0, + maxdodge: 0, + terrainTags: {}, shrines: [], allFloors: true}, + {name: "TickleHandSlave", faction: "Witch", color: "#FFFFFF", tags: KDMapInit(["ignorenoSP", "ghost", "flying", "melee", "glueimmune", "chainimmune", "magicweakness"]), + ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", + master: {type: "ConjurerTickler", range: 3, dependent: true}, noAlert: true, hitsfx: "Tickle", + visionRadius: 10, blindSight: 3, evasion: 9.0, alwaysEvade: true, maxhp: 1, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 1, attack: "MeleeWill", attackWidth: 3, attackRange: 1, power: 3, dmgType: "tickle", fullBoundBonus: 0, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ffffff"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0.5, + attackAmount: 0, + decay: 5, + }, + maxblock: 0, + maxdodge: 0, + terrainTags: {}, shrines: [], allFloors: true, + Reputation: { + noRepLoss: true, + }, + dropTable: [{name: "Ectoplasm", weight: 1}]}, + {name: "Frog", faction: "Witch", clusterWith: "beast", color: "#00FF44", + tags: KDMapInit(["summoned", "beast", "ranged", "acidweakness", "electricsevereweakness", "soapresist"]), + followLeashedOnly: true, armor: 1, followRange: 1, AI: "hunt", + pullTowardSelf: true, pullDist: 3, master: {type: "Conjurer", range: 3}, projectileAttack: true, projectileTargeting: true, + evasion: -0.4, + stamina: 4, + Sound: { + baseAmount: 4, + moveAmount: 8, + }, + maxblock: 1, + maxdodge: 0, + visionRadius: 8, maxhp: 19, minLevel:0, weight:0, movePoints: 1.5, attackPoints: 2, attack: "MeleePullWill", attackRange: 4, attackWidth: 1, power: 4, strictAttackLOS: true, dmgType: "tickle", + terrainTags: {}, floors:KDMapInit([])}, + {name: "Conjurer", nameList: "witch", faction: "Witch", clusterWith: "apprentice", bound: "Conjurer", outfit: "Conjurer", style: "Necromancer", playLine: "Witch", + tags: KDMapInit(["leashing", "opendoors", "mage", "antiMagic", "conjurer", "leatherRestraintsMagic", "closedoors", "witch", "ranged", "boss", "unflinching", "dressRestraints", "latexRestraints", "handcuffer"]), + followRange: 1, + events: [ + {trigger: "death", type: "frogDies"}, + ], + stamina: 2, + maxblock: 2, + maxdodge: 2, + summon: [{enemy: "Frog", range: 2.5, count: 1, strict: true}], + spells: ["SummonTickleHand", "SummonEnemyGag2", "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 9, spellCooldownMult: 2, spellCooldownMod: 1, AI: "guard", + visionRadius: 8, maxhp: 24, minLevel:7, weight:3, movePoints: 3, spellRdy: true, + spellResist: 1.5, attackLock: "Purple", + attackPoints: 4, attack: "MeleeLockAllWillSpellBind", attackWidth: 1, attackRange: 1, power: 3, dmgType: "tickle", + terrainTags: {"secondhalf":16, "lastthird":5, "boss": -4, "open": 20, "passage": -20, "conjureAnger": 20, "conjureRage": 70, "increasingWeight":0.5, "witch": 30}, + allFloors: true, shrines: ["Conjure"], + dropTable: [{name: "MagicSword", weight: 1, ignoreInInventory: true}, {name: "MagicSpear", weight: 1, ignoreInInventory: true}, {name: "MagicAxe", weight: 1, ignoreInInventory: true}, {name: "MagicFlail", weight: 1, ignoreInInventory: true}, {name: "MagicHammer", weight: 1, ignoreInInventory: true}, {name: "BlueKey", weight: 2}]}, + {name: "ConjurerTickler", nameList: "witch", faction: "Witch", clusterWith: "apprentice", bound: "ConjurerTickler", outfit: "Conjurer", style: "Necromancer", playLine: "Witch", + tags: KDMapInit(["leashing", "opendoors", "mage", "antiMagic", "conjurer", "leatherRestraintsMagic", "closedoors", "witch", "ranged", "boss", "unflinching", "dressRestraints", "latexRestraints", "handcuffer"]), + followRange: 1, + summon: [{enemy: "TickleHandSlave", range: 2.5, count: 3, strict: true}], + spells: ["SummonBookChain", "SummonBookBelt", "SummonBookRope", "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 9, spellCooldownMult: 2, spellCooldownMod: 1, AI: "guard", + visionRadius: 8, maxhp: 24, minLevel:6, weight:-1, movePoints: 3, spellRdy: true, + spellResist: 1.5, attackLock: "Purple", + stamina: 2, + maxblock: 3, + maxdodge: 1, + attackPoints: 4, attack: "MeleeLockAllWillSpellBind", attackWidth: 1, attackRange: 1, power: 3, dmgType: "tickle", + terrainTags: {"secondhalf":16, "lastthird":5, "boss": -4, "open": 20, "passage": -20, "conjureAnger": 20, "conjureRage": 70, "increasingWeight":0.5, "witch": 30}, + allFloors: true, shrines: ["Conjure"], + dropTable: [{name: "MagicSword", weight: 1, ignoreInInventory: true}, {name: "MagicSpear", weight: 1, ignoreInInventory: true}, {name: "MagicAxe", weight: 1, ignoreInInventory: true}, {name: "MagicFlail", weight: 1, ignoreInInventory: true}, {name: "MagicHammer", weight: 1, ignoreInInventory: true}, {name: "BlueKey", weight: 2}]}, + + {name: "BookChain", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "chainimmune", "blindimmune", "ignoreharmless", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "soapweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, + spells: ["MagicChain"], spellCooldownMult: 1, spellCooldownMod: 1, sneakthreshold: 0.7, kite: 1.5, difficulty: 0.05, noSpellLeashing: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#aaaaaa"}, + ], + maxblock: 0, + maxdodge: 0, + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 0, + }, + nonDirectional: true, + projectileTargeting: true, + spellResist: 2.0, + dropTable: [{name: "BondageTome", weight: 0.5, ignoreInInventory: true}], + visionRadius: 6, maxhp: 5, minLevel:0, weight:20, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, + terrainTags: {"open": 100, "passage": -7, "witch": 2}, floors:KDMapInit(["lib"])}, + {name: "BookRope", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "chainimmune", "blindimmune", "ignoreharmless", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "soapweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, + spells: ["MagicRope"], spellCooldownMult: 1, spellCooldownMod: 1, sneakthreshold: 0.7, kite: 1.5, difficulty: 0.05, noSpellLeashing: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#aaaaaa"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 0, + }, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + projectileTargeting: true, + spellResist: 2.0, + dropTable: [{name: "BondageTome", weight: 0.5, ignoreInInventory: true}], + visionRadius: 6, maxhp: 5, minLevel:0, weight:20, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, + terrainTags: {"open": 100, "passage": -7, "witch": 2}, floors:KDMapInit(["lib"])}, + {name: "BookBelt", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "chainimmune", "blindimmune", "ignoreharmless", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "soapweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, + spells: ["MagicBelt"], spellCooldownMult: 1, spellCooldownMod: 1, sneakthreshold: 0.7, kite: 1.5, difficulty: 0.05, noSpellLeashing: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#aaaaaa"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 0, + }, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + projectileTargeting: true, + spellResist: 2.0, + dropTable: [{name: "BondageTome", weight: 0.5, ignoreInInventory: true}], + visionRadius: 6, maxhp: 5, minLevel:0, weight:20, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, + terrainTags: {"open": 100, "passage": -7, "witch": 2}, floors:KDMapInit(["lib"])}, + {name: "BookBondage", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "chainimmune", "blindimmune", "ignoreharmless", "book", "flying", "ranged", "slashsevereweakness", "acidweakness", "soapweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.2, noAlert: true, + spells: ["MagicChain", "MagicBelt", "MagicRope"], spellCooldownMult: 1, spellCooldownMod: -2, sneakthreshold: 0.7, kite: 1.5, noSpellLeashing: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4, color: "#aaaaaa"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 0, + }, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + projectileTargeting: true, + spellResist: 2.0, + dropTable: [{name: "ManaOrb", weight: 0.5}, {name: "Nothing", weight: 3, ignoreInInventory: true}], + visionRadius: 7, maxhp: 12, minLevel:0, weight:20, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, + terrainTags: {"open": 100, "passage": -7, "witch": 2}, floors:KDMapInit(["lib", "cat", "tmb"])}, + {name: "BookCelestial", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireresist", "holyimmune", "blindimmune", "ignoreharmless", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "soapweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, + spells: ["EnemyCorona", "OrbHeal"], spellCooldownMult: 1, spellCooldownMod: 1, sneakthreshold: 0.7, difficulty: 0.05, noSpellLeashing: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ffff44"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 0, + }, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + spellResist: 2.0, + dropTable: [{name: "BondageTome", weight: 0.5, ignoreInInventory: true}], + visionRadius: 6, maxhp: 5, minLevel:6, weight:18, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, + terrainTags: {"open": 100, "passage": -7, "elf": 2}, floors:KDMapInit(["lib"])}, + {name: "BookNature", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["unstoppable", "fireweakness", "blindimmune", "ignoreharmless", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "soapweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, + spells: ["Entangle", "OrbHeal"], spellCooldownMult: 1, spellCooldownMod: 1, sneakthreshold: 0.7, difficulty: 0.05, noSpellLeashing: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#88ff88"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 0, + }, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + spellResist: 2.0, + dropTable: [{name: "BondageTome", weight: 0.5, ignoreInInventory: true}], + visionRadius: 6, maxhp: 5, minLevel:0, weight:18, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, + terrainTags: {"open": 100, "passage": -7, "elf": 2}, floors:KDMapInit(["lib"])}, + {name: "BookElectric", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "electricimmune", "blindimmune", "ignoreharmless", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "soapweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, + spells: ["AreaElectrify"], spellCooldownMult: 1, spellCooldownMod: 1, sneakthreshold: 0.7, difficulty: 0.05, noSpellLeashing: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#8888ff"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 0, + }, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + spellResist: 2.0, + dropTable: [{name: "ArcaneTome", weight: 0.5, ignoreInInventory: true}], + visionRadius: 6, maxhp: 5, minLevel:3, weight:18, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, + terrainTags: {"open": 100, "passage": -7, "elemental": 2}, floors:KDMapInit(["lib"])}, + {name: "BookSlime", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "glueimmune", "blindimmune", "ignoreharmless", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "soapweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, + spells: ["WitchSlimeBall", "WitchSlimeBall", "WitchSlime"], spellCooldownMult: 1, spellCooldownMod: 0, sneakthreshold: 0.7, difficulty: 0.05, noSpellLeashing: true, + spellResist: 2.0, + visionRadius: 6, maxhp: 5, minLevel:2, weight:18, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ff00ff"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 0, + }, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + projectileTargeting: true, + dropTable: [{name: "ArcaneTome", weight: 0.5, ignoreInInventory: true}], + terrainTags: {"open": 100, "passage": -7, "alchemist": 2}, floors:KDMapInit(["lib"])}, + {name: "BookIce", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "iceimmune", "blindimmune", "ignoreharmless", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "soapweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, + spells: ["IceSlowPrepare", "IceDragonBreathPrepare"], spellCooldownMult: 1, spellCooldownMod: 4, sneakthreshold: 0.7, difficulty: 0.05, noSpellLeashing: true, + spellResist: 2.0, + visionRadius: 6, maxhp: 5, minLevel:4, weight:18, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#44aaff"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 0, + }, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + dropTable: [{name: "ArcaneTome", weight: 0.5, ignoreInInventory: true}], + terrainTags: {"open": 100, "passage": -7, "elemental": 2}, floors:KDMapInit(["lib"])}, + {name: "BookForbidden", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "blindimmune", "coldimmune", "ignoreharmless", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "soapweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, + spells: ["SoulCrystalBind"], spellCooldownMult: 1, spellCooldownMod: 3, sneakthreshold: 0.7, difficulty: 0.05, noSpellLeashing: true, + spellResist: 2.0, + visionRadius: 6, maxhp: 5, minLevel:5, weight:15, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#ff5577"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 0, + }, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + dropTable: [{name: "BondageTome", weight: 0.5, ignoreInInventory: true}], + terrainTags: {"open": 100, "passage": -8, "witch": 2}, floors:KDMapInit(["lib", "tmp"])}, + {name: "BookArcane", hidetimerbar: true, clusterWith: "book", tags: KDMapInit(["fireweakness", "blindimmune", "coldimmune", "ignoreharmless", "book", "flying", "minor", "ranged", "slashsevereweakness", "acidweakness", "soapweakness", "piercesevereweakness"]), followLeashedOnly: true, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, noAlert: true, + spells: ["MummyBolt"], spellCooldownMult: 1, spellCooldownMod: 3, sneakthreshold: 0.7, difficulty: 0.05, noSpellLeashing: true, + spellResist: 2.0, + visionRadius: 6, maxhp: 5, minLevel:0, weight:15, movePoints: 5, attackPoints: 2, attack: "Spell", attackRange: 1, attackWidth: 1, power: 6, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 1, color: "#4fd658"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 0, + }, + maxblock: 0, + maxdodge: 0, + projectileTargeting: true, + dropTable: [{name: "ArcaneTome", weight: 0.5, ignoreInInventory: true}], + nonDirectional: true, + terrainTags: {"open": 100, "passage": -8, "mummy": 2}, floors:KDMapInit(["lib", "tmp"])}, + + {name: "AnimatedArmor", blockVisionWhileStationary: true, + tags: KDMapInit(["mimicBlock", "removeDoorSpawn", "ignoreharmless", "leashing", "construct", "nosignal", "blindresist", "fiddle", + "poisonimmune", "soulimmune", "minor", "melee", "acidweakness", "shackleRestraints", "shackleGag", "slashresist", "crushweakness"]), + evasion: -0.5, ignorechance: 1.0, armor: 3, followRange: 1, AI: "ambush", difficulty: 0.05, guardChance: 0, + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + maxblock: 4, + maxdodge: 0, + GFX: { + lighting: true, + }, + Sound: { + baseAmount: 0.0, + moveAmount: 10, + }, + Resistance: { + profile: ["construct"], + }, + useLock: "White", + visionRadius: 100, ambushRadius: 1.9, blindSight: 100, maxhp: 20, minLevel:0, weight:0, movePoints: 2, attackPoints: 3, attack: "MeleeBind", + attackWidth: 1, attackRange: 1, power: 4, dmgType: "crush", fullBoundBonus: 4, + terrainTags: {"secondhalf":4, "lastthird":7, "passage": 70, "adjChest": 58, "door": 50, "rubble": 15}, floors:KDMapInit(["cat"]), shrines: ["Metal"], + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}, {name: "Sword", weight: 1, ignoreInInventory: true}]}, + {name: "Mimic", blockVisionWhileStationary: true, tags: KDMapInit(["removeDoorSpawn", "ignoreharmless", "ignoreharmless", "blindresist", "construct", "nosignal", "poisonresist", "soulresist", "minor", "melee", "trap", "shackleGag", "crushweakness", "meleeresist", "fireweakness", "electricresist", "chainweakness"]), + evasion: -0.5, ignorechance: 1.0, armor: 1, followRange: 1, AI: "ambush", bypass: true, difficulty: 0.15, guardChance: 0, + nonDirectional: true, + useLock: "White", + GFX: { + lighting: true, + }, + maxblock: 1, + maxdodge: 0, + Sound: { + baseAmount: 0, + alertAmount: 0, + moveAmount: 10, + }, + stamina: 10, + visionRadius: 100, ambushRadius: 1.9, blindSight: 100, maxhp: 20, minLevel:2, weight:-1, movePoints: 1.5, attackPoints: 2, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 3, dmgType: "tickle", fullBoundBonus: 1, + terrainTags: {"rubble": 100, "adjChest": 15, "passage": 14, "illusionRage": 2, "illusionAnger": 2}, allFloors: true, shrines: ["Illusion"], + dropTable: [{name: "RedKey", weight: 1}, {name: "Gold", amountMin: 10, amountMax: 40, weight: 6}, {name: "ScrollArms", weight: 1}, {name: "ScrollVerbal", weight: 1}, {name: "ScrollLegs", weight: 1}]}, + + {name: "VineSpitter", faction: "Plant", clusterWith: "plant", color: "#4fd658", blockVisionWhileStationary: true, + tags: KDMapInit(["nature", "blindresist", "removeDoorSpawn", "nosignalothers", "ignoreharmless", "plant", "melee", "glueresist", "slashweakness", "coldweakness", "firesevereweakness", "unarmedresist", "crushresist", "vineRestraints"]), + ignorechance: 1.0, armor: 0, followRange: 4, AI: "ambush", guardChance: 0, + evasion: -0.5, + GFX: { + lighting: true, + AmbushSprite: "VinePlant", + }, + spells: ["VineSlimeBall"], castWhileMoving: true, spellRdy: false, spellCooldownMult: 1, spellCooldownMod: 3, projectileAttack: true, + maxblock: 0, + maxdodge: 0, + kite: 1.5, + stamina: 3, + visionRadius: 5, ambushRadius: 2.5, blindSight: 5, maxhp: 10, minLevel:0, weight:25, movePoints: 1.8, attackPoints: 2, attack: "SpellMeleeBind", attackWidth: 1, attackRange: 1, power: 2, dmgType: "crush", fullBoundBonus: 3, + terrainTags: {"passage": -50, "adjChest": 8, "door": 12, "elf": 5, "nature": 5}, floors:KDMapInit(["jng"]), shrines: ["Rope", "Will"]}, + {name: "DragonVinePlant", faction: "Plant", clusterWith: "plant", color: "#4fd658", blockVisionWhileStationary: true, + tags: KDMapInit(["nature", "blindresist", "removeDoorSpawn", "ignoreharmless", "nosignalothers", "plant", "elite", "melee", "chainresist", "slashweakness", "coldweakness", "firesevereweakness", "unarmedresist", "crushresist", "vineRestraints"]), + ignorechance: 1.0, armor: 0, followRange: 4, AI: "ambush", guardChance: 0, + ondeath: [{type: "spellOnSelf", spell: "Entangle"}], + evasion: -0.5, + GFX: { + lighting: true, + AmbushSprite: "VinePlant", + }, + spells: ["DragonVine"], castWhileMoving: true, spellRdy: false, spellCooldownMult: 1, spellCooldownMod: 3, projectileAttack: true, + maxblock: 0, + maxdodge: 0, + stamina: 2, + visionRadius: 5, ambushRadius: 2.5, blindSight: 5, maxhp: 13, minLevel: 5, weight:25, movePoints: 2.3, attackPoints: 3, attack: "SpellMeleeBind", multiBind: 2, + attackWidth: 3, attackRange: 1, power: 3, dmgType: "crush", fullBoundBonus: 3, + terrainTags: {"passage": -50, "adjChest": 8, "door": 12, "elf": 5, "nature": 5}, floors:KDMapInit(["jng"]), shrines: ["Rope", "Will"]}, + {name: "DragonFlower", faction: "Plant", clusterWith: "plant", color: "#4fd658", + tags: KDMapInit(["nature", "blindresist", "removeDoorSpawn", "ignoreharmless", "nosignalothers", "plant", "melee", "minor", "scenery", "chainresist", "slashweakness", "coldweakness", "firesevereweakness", "unarmedresist", "crushresist", "vineRestraints"]), + ignorechance: 1.0, armor: 0, followRange: 1.5, AI: "guard", guardChance: 1, + ondeath: [{type: "spellOnSelf", spell: "DragonFlowerSpores"}], + evasion: -2, + spells: ["DragonFlowerSpores"], castWhileMoving: true, spellRdy: false, spellCooldownMult: 1, spellCooldownMod: 3, projectileAttack: true, + maxblock: 0, + maxdodge: 0, + stamina: 2, + visionRadius: 5, ambushRadius: 2.5, blindSight: 5, maxhp: 1, minLevel: 5, weight:25, movePoints: 4, attackPoints: 3, attack: "Spell", multiBind: 2, + attackWidth: 3, attackRange: 1, power: 3, dmgType: "crush", fullBoundBonus: 3, + terrainTags: {"passage": -50, "adjChest": 8, "door": 12, "elf": 5, "nature": 5}, floors:KDMapInit(["jng"]), shrines: ["Rope", "Will"]}, + + {name: "VinePlant", faction: "Plant", clusterWith: "plant", color: "#4fd658", blockVisionWhileStationary: true, + tags: KDMapInit(["nature", "blindresist", "removeDoorSpawn", "ignoreharmless", "nosignalothers", "plant", "minor", "melee", "chainresist", "slashweakness", "coldweakness", "firesevereweakness", "unarmedresist", "crushresist", "vineRestraints"]), + ignorechance: 1.0, armor: 0, followRange: 1, AI: "ambush", specialCD: 99, specialAttack: "Stun", specialAttackPoints: 1, specialRemove: "Bind", difficulty: 0.05, guardChance: 0, + evasion: -0.5, + GFX: { + lighting: true, + }, + ignoreflag: ["vineplantatk"], failAttackflag: ["vineplantatk"], failAttackflagDuration: 9, failAttackflagChance: 0.4, + maxblock: 1, + maxdodge: 0, + stamina: 3, + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 2, + }, + nonDirectional: true, + visionRadius: 3, ambushRadius: 1.9, blindSight: 5, maxhp: 10, minLevel:0, weight:25, movePoints: 1.5, attackPoints: 2, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 2, dmgType: "crush", fullBoundBonus: 3, + terrainTags: {"passage": -50, "adjChest": 8, "door": 12, "elf": 5, "nature": 5}, floors:KDMapInit(["jng"]), shrines: ["Rope", "Will"]}, + {name: "Bramble", faction: "Plant", clusterWith: "plant", color: "#4fd658", hitsfx: "DealDamage", + sneakthreshold: 0.6, + nonDirectional: true, + GFX: { + lighting: true, + }, + maxblock: 0, + maxdodge: 0, + Sound: { + baseAmount: 0, + moveAmount: 0, + attackAmount: 1, + }, + tags: KDMapInit(["removeDoorSpawn", "immobile", "blindresist", "nature", "nosignalothers", "plant", "minor", "melee", "glueresist", "slashweakness", "coldweakness", "firesevereweakness", "unarmedresist", "crushresist"]), + evasion: -9, ignorechance: 1.0, armor: 1.5, followRange: 1, AI: "wander", specialCD: 2, specialAttack: "Slow", specialAttackPoints: 1, + visionRadius: 1.5, blindSight: 1.5, maxhp: 16, minLevel:0, weight:-80, movePoints: 99999, attackPoints: 1, attack: "MeleeWill", attackWidth: 8, attackRange: 1, power: 1, dmgType: "pain", + terrainTags: {"passage": -50, "adjChest": -50, "door": -50, "open": 140, "elf": 10}, floors:KDMapInit(["jng"]), shrines: ["Rope", "Will"]}, + + {name: "Alchemist", outfit: "Alchemist", style: "GreenHair", faction: "Alchemist", clusterWith: "alchemist", playLine: "Alchemist", bound: "Alchemist", color: "#50a968", + tags: KDMapInit(["opendoors", "leashing", "imprisonable", "guardCall", "human", "alchemist", "ranged", "latexRestraints", "handcuffer", + "leatherRestraintsHeavy", "jail", "jailer", "latexGag", "search"]), + ignorechance: 0, armor: 0, followRange: 2, AI: "hunt", + spells: ["AmpuleBlue", "AmpuleGreen", "AmpuleYellow", "AmpuleRed"], spellCooldownMult: 1, spellCooldownMod: 4, kite: 1.5, projectileAttack: true, + attackLock: "White", + Resistance: { + profile: ["alchemist"], + }, + Sound: { + idleSoundName: "Rubber", + }, + maxblock: 0, + maxdodge: 2, + stamina: 4, + visionRadius: 6, maxhp: 8, minLevel:0, weight:0.1, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {"secondhalf":1, "thirdhalf":1, "latexAnger": 12, "latexRage": 5, "latexPleased": 12, "latexFriendly": 5, "alchemist": 15}, shrines: ["Latex"], allFloors: true, + dropTable: [{name: "VinylTapeRaw", amount: 8, weight: 10}, {name: "Gunpowder", amount: 1, weight: 10}]}, + {name: "Alkahestor", outfit: "Alchemist", style: "Water", faction: "Alchemist", clusterWith: "alchemist", playLine: "Alchemist", bound: "Alkahestor", color: "#92b9e8", + tags: KDMapInit(["opendoors", "antiMagic", "leashing", "guardCall", "human", "alchemist", "ranged", "miniboss", "expRestraints", "latexRestraints", "handcuffer", "jailer", "latexGag", "search"]), + ignorechance: 0, armor: 1, followRange: 2, AI: "hunt", + spells: ["AmpuleBlue", "SummonLatexElemental", "BubbleBurstLatex"], spellCooldownMult: 1, spellCooldownMod: 4, kite: 1.5, projectileAttack: true, + attackLock: "Red", + stamina: 4, + Resistance: { + profile: ["alchemist"], + }, + Sound: { + idleSoundName: "Rubber", + }, + maxblock: 2, + maxdodge: 3, + visionRadius: 6, maxhp: 16, minLevel:4, weight:-1, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1.5, dmgType: "grope", fullBoundBonus: 2.5, + terrainTags: {"secondhalf":1, "thirdhalf":1, "latexAnger": 4, "bubbleOptout": -2, "bubblePref": 4, "latexRage": 4, "latexPleased": 3, "latexFriendly": 5, "alchemist": 10}, shrines: ["Latex"], allFloors: true, + dropTable: [{name: "HardSlimeRaw", amount: 25, weight: 3}, {name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Gunpowder", amount: 3, weight: 10}]}, + {name: "ElementalLatex", faction: "Elemental", hidetimerbar: true, playLine: "Elemental", clusterWith: "alchemist", outfit: "ElementalLatex", style: "ElementalLatex", bound: "ElementalLatex", squeeze: true, + tags: KDMapInit(["opendoors", "latexTrap", "elemental", "latex", "elite", "slashweakness", "melee", "glueimmune", "coldweakness", "electricresist", "pierceweakness", "acidweakness", "latexRestraints", "latexRestraintsHeavy", "latexGag", "leashing", "search", "doortrap"]), + armor: 0, followRange: 1, AI: "hunt", spellResist: 1.5, + stamina: 6, + maxblock: 2, + maxdodge: 0, + Sound: { + idleSoundName: "Rubber", + }, + events: [ + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "LatexThinBlue", time: 4, power: 1, chance: 0.5, aoe: 0.5}, + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "LatexThinBlue", aoe: 1.5, power: 1, chance: 1.0}, + ], + visionRadius: 7, maxhp: 20, minLevel:4, weight:-3, movePoints: 2, attackPoints: 2, attack: "MeleeWillBind", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, + terrainTags: {"secondhalf":2, "thirdhalf":1, "latexAnger": 4, "latexRage": 4, "latexPleased": 2, "latexFriendly": 3, "temple": 4, "doortrap":2, revenge: 5, "alchemist": 5, "witch": 5}, allFloors: true, shrines: ["Latex", "Elements"], + dropTable: [{name: "HardSlimeRaw", amount: 5, weight: 10}, {name: "RopeRune", weight: 1, noSummon: true}]}, + {name: "GlueTechnician", outfit: "Alchemist", style: "Earth", faction: "Alchemist", clusterWith: "alchemist", playLine: "Alchemist", bound: "GlueTechnician", color: "#ffee43", + tags: KDMapInit(["opendoors", "leashing", "human", "alchemist", "ranged", "unflinching", "elite", "expRestraints", "latexRestraints", "latexRestraintsHeavy", "latexGag", "handcuffer", "jail", "jailer", "hunter"]), + ignorechance: 0, armor: 1.5, followRange: 2, AI: "hunt", + spells: ["AmpuleYellow", "GlueBomb"], spellCooldownMult: 0.7, spellCooldownMod: 0, projectileAttack: true, + attackLock: "White", + stamina: 4, + maxblock: 2, + maxdodge: 1, + Resistance: { + profile: ["alchemist"], + }, + Sound: { + idleSoundName: "Rubber", + }, + visionRadius: 7.5, maxhp: 12, minLevel:2, weight:0, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLockSlow", attackWidth: 2.5, attackRange: 1, power: 2, dmgType: "tickle", fullBoundBonus: 2, + terrainTags: {"secondhalf":0.5, "thirdhalf":1, "latexAnger": 5, "latexRage": 5, "latexPleased": 2, "latexFriendly": 2, "alchemist": 10}, shrines: ["Latex"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 15, weight: 10}, {name: "Gunpowder", amount: 2, weight: 10}]}, + + {name: "SlimeEnthusiast", outfit: "Alchemist", style: "RedHair", faction: "Alchemist", clusterWith: "alchemist", playLine: "Alchemist", bound: "SlimeEnthusiast", + tags: KDMapInit(["opendoors", "leashing", "human", "alchemist", "ranged", "unflinching", "elite", "latexRestraints", "latexRestraintsHeavy", "latexGag", "handcuffer", "jail", "jailer", "hunter"]), + ignorechance: 0, armor: 1.5, followRange: 2, AI: "hunt", + spells: ["RedSlime"], spellCooldownMult: 1, spellCooldownMod: 1, projectileAttack: true, + attackLock: "White", + stamina: 4, + maxblock: 1, + maxdodge: 2, + Resistance: { + profile: ["alchemist"], + }, + visionRadius: 6, maxhp: 12, minLevel:2, weight:0, movePoints: 3, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 2.5, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {"secondhalf":0.5, "thirdhalf":1, "latexAnger": 5, "latexRage": 5, "latexPleased": 2, "latexFriendly": 2, "alchemist": 10}, shrines: ["Latex"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 15, weight: 10}, {name: "Gunpowder", amount: 2, weight: 10}]}, + {name: "RedSlime", faction: "Alchemist", clusterWith: "alchemist", color: "#ff5277", hidetimerbar: true, tags: KDMapInit(["ignoretiedup", "disarmimmune", "blindresist", "ignoregagged", "experiment", "slime", "melee", "minor", "ballGagRestraints", "meleeresist", "chainimmune", "electricresist", "iceweakness"]), + squeeze: true, followRange: 1, AI: "hunt", sneakThreshold: 1, hitsfx: "", armor: 0, + spells: ["RedSlime"], spellCooldownMult: 1, spellCooldownMod: 1, evasion: 1, + regen: 0.3, + maxblock: 0, + maxdodge: 0, + Sound: { + idleSoundName: "Slime", + }, + nonDirectional: true, + nopickpocket: true, + Reputation: { + noRepLoss: true, + }, + stamina: 2, + visionRadius: 4.5, maxhp: 3.2, minLevel: 5, weight:10, movePoints: 2, attackPoints: 3, attack: "SpellMeleeSlowBindSuicide", suicideOnSpell: true, suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "crush", + terrainTags: {}, floors:KDMapInit(["tmp"]), shrines: ["Latex"]}, + {name: "LabAssistant", faction: "Alchemist", clusterWith: "alchemist", playLine: "Apprentice", outfit: "BlueSuit", bound: "LabAssistant", color: "#92b9e8", + tags: KDMapInit(["opendoors", "leashing", "human", "alchemist", "latexRestraints", "ranged", "minor", "latexGag", "jail", "jailer", "hunter"]), + ignorechance: 0, followRange: 4.5, AI: "hunt", + difficulty: 0.3, + spells: ["AmpuleBlue", "LatexBubble"], spellCooldownMult: 1, spellCooldownMod: 1, kite: 2.5, projectileAttack: true, noKiteWhenHarmless: true, + attackLock: "White", + stamina: 3, + maxblock: 0, + maxdodge: 2, + Resistance: { + profile: ["alchemist"], + }, + Sound: { + idleSoundName: "Rubber", + }, + visionRadius: 6, maxhp: 6, minLevel:0, weight:1, movePoints: 2.5, attackPoints: 3, attack: "SpellMeleeBlindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, blindTime: 3, + terrainTags: {"secondhalf":2, "thirdhalf":-4, "latexAnger": 4, "latexRage": 4, "latexPleased": 2, "latexFriendly": 2, "alchemist": 40}, shrines: ["Latex"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}, {name: "Gunpowder", amount: 1, weight: 7}]}, + + {name: "SummonedDrone", playLine: "Robot", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit([ "drone","oldrobot", "disarmimmune", "ignoreharmless", "doortrap", "robot", "flying", "acidweakness", "soapweakness", "soulresist", "minor", "melee", + "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "temporary"]), + evasion: 0.2, armor: 1.5, followRange: 3.5, AI: "hunt", + spells: ["EncaseBoltDrone"], spellCooldownMult: 2, spellCooldownMod: 0, projectileTargeting: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#e7cf1a"}, + ], + Behavior: { + leashCondition: "dollmakerLeash", + }, + maxblock: 0, + maxdodge: 0, + stamina: 2, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + Sound: { + baseAmount: 3.5, + moveAmount: 3.5, + alertAmount: 12, + }, + visionRadius: 14, sneakthreshold: 0.85, maxhp: 14, minLevel:0, weight:-1000, kite: 1.5, movePoints: 1.5, attackPoints: 3, attack: "Spell", attackWidth: 1, attackRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 1, + terrainTags: {}, floors:KDMapInit([])}, + {name: "SummonedCaptureDrone", playLine: "Robot", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit([ "drone","leashing", "disarmimmune", "oldrobot", "ignoreharmless", "doortrap", "robot", "flying", "acidweakness", "soapweakness", "soulresist", "minor", "melee", + "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "temporary"]), + evasion: 0.15, armor: 2.0, followRange: 1, AI: "hunt", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#e7cf1a"}, + ], + Behavior: { + leashCondition: "dollmakerLeash", + }, + maxblock: 0, + maxdodge: 0, + stamina: 4, + Sound: { + baseAmount: 3.5, + moveAmount: 3.5, + alertAmount: 12, + }, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + visionRadius: 15, sneakthreshold: 0.85, maxhp: 16, minLevel:0, weight:-1000, movePoints: 1.35, attackPoints: 2, attack: "MeleeBind", attackWidth: 1.5, attackRange: 1, power: 1, dmgType: "chain", fullBoundBonus: 1.5, + ondeath: [{type: "spellOnSelf", spell: "RubberSlime"}], + terrainTags: {}, floors:KDMapInit([])}, + {name: "OldDrone", faction: "Enemy", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, + SFX: {death: "SciFiExplode"}, + color: "#ff3367", + tags: KDMapInit([ "drone","oldrobot", "disarmimmune", "ignoreharmless", "doortrap", "robot", "flying", "acidweakness", "soapweakness", "soulresist", "minor", "melee", + "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "jail", "search"]), + AI: "hunt", difficulty: 0.05, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#e7cf1a"}, + ], + maxblock: 0, + maxdodge: 1, + stamina: 2, + Sound: { + baseAmount: 5, + moveAmount: 5, + alertAmount: 12, + }, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + RestraintFilter: { + unlimitedRestraints: true, + }, + armor: 1.5, maxhp: 5, movePoints: 1.1, + visionRadius: 7, followRange: 1, projectileAttack: true, useLock: "White", followLeashedOnly: true, + bindOnDisable: true, suicideOnAdd: true, + attack: "MeleeBindSuicideWill", attackPoints: 2, attackWidth: 1, attackRange: 1, power: 2, dmgType: "electric", multiBind: 2, fullBoundBonus: 4, + minLevel:0, weight:15, terrainTags: {"oldrobot": 10}, shrines: ["Metal"], floors:KDMapInit(["bel"]), + dropTable: [{name: "Nothing", weight: 19}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, + {name: "OldTapeDrone", faction: "Enemy", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, + SFX: {death: "SciFiExplode"}, + color: "#ff3367", + tags: KDMapInit([ "drone","oldrobot", "leashing", "doortrap", "robot", "flying", "acidweakness", "soapweakness", "soulresist", "melee", + "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushweakness", "autoTape", "jail", "search"]), + AI: "patrol", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#e7cf1a"}, + ], + stamina: 2, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + RestraintFilter: { + unlimitedRestraints: true, + }, + maxblock: 0, + maxdodge: 1, + Sound: { + baseAmount: 6, + moveAmount: 6, + alertAmount: 12, + }, + armor: 2.0, maxhp: 9, movePoints: 1.75, + visionRadius: 7, followRange: 1, + evasion: -0.1, + attack: "MeleeBind", attackPoints: 2, attackWidth: 1, attackRange: 1, power: 2, dmgType: "glue", fullBoundBonus: 1, + minLevel:2, weight:15, terrainTags: {"notapebot": -1000, "oldrobot": 10, "tapePref": 10, "tapeOptout": -15}, shrines: ["Metal"], floors:KDMapInit(["bel"]), + dropTable: [{name: "Gold", amountMin: 7, amountMax: 15, weight: 10, noSummon: true}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, + + {name: "RubberTurret", faction: "Enemy", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, + SFX: {death: "SciFiExplodeLarge"}, + nonDirectional: true, + color: "#ff3367", + tags: KDMapInit(["oldrobot", "disarmimmune", "turret", "basicturret", "immobile", "ignoreharmless", "mimicBlock", "doortrap", "robot", "acidweakness", "soapweakness", "soulresist", "minor", "ranged", + "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness"]), + AI: "hunt", difficulty: 0.2, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff5277"}, + ], + spells: ["EncaseBolt"], spellCooldownMult: 1, spellCooldownMod: 0, projectileTargeting: true, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + maxblock: 0, + maxdodge: 0, + Sound: { + baseAmount: 0, + moveAmount: 0, + alertAmount: 12, + }, + RestraintFilter: { + unlimitedRestraints: true, + }, + armor: 2.0, maxhp: 20, movePoints: 9999, immobile: true, + visionRadius: 6.5, followRange: 999, + sneakThreshold: 1, + evasion: -9, + attack: "SpellMeleeWill", attackPoints: 2, attackWidth: 1, attackRange: 1, power: 2, dmgType: "electric", + minLevel:0, weight:-50, terrainTags: {"oldrobot": 7, "oldrobotturret": 50, "oldrobotturretspawn": 150, open: 50, "latexOptout": -50}, shrines: ["Latex"], floors:KDMapInit(["bel"]), + ondeath: [{type: "spellOnSelf", spell: "RubberSlime"}], + dropTable: [{name: "AncientPowerSourceSpent", weight: 9, noSummon: true}, {name: "AncientPowerSource", weight: 1, noSummon: true}]}, + + {name: "RubberSilo", faction: "Enemy", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, + SFX: {death: "SciFiExplodeLarge"}, + color: "#ff3367", + nonDirectional: true, + tags: KDMapInit(["oldrobot", "disarmimmune", "turret", "immobile", "ignoreharmless", "mimicBlock", "doortrap", "robot", "acidweakness", "soapweakness", "soulresist", "minor", "ranged", + "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness"]), + AI: "hunt", difficulty: 0.2, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff5277"}, + ], + maxblock: 0, + maxdodge: 0, + spells: ["RubberMissile"], spellCooldownMult: 1, spellCooldownMod: 0, projectileTargeting: true, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + alertAmount: 12, + }, + RestraintFilter: { + unlimitedRestraints: true, + }, + armor: 2.0, maxhp: 20, movePoints: 9999, immobile: true, + visionRadius: 8.5, followRange: 999, + sneakThreshold: 1, + evasion: -9, + attack: "SpellMeleeWill", attackPoints: 2, attackWidth: 1, attackRange: 1, power: 2, dmgType: "electric", + minLevel: 7, weight:-50, terrainTags: {"oldrobot": 7, "oldrobotturret": 30, oldrobotturretspawn: 100, open: 50, "latexOptout": -24}, shrines: ["Latex"], floors:KDMapInit(["bel"]), + ondeath: [{type: "spellOnSelf", spell: "RubberSlime"}], + dropTable: [{name: "Gunpowder", weight: 8, noSummon: true}, {name: "AncientPowerSource", weight: 2, noSummon: true}]}, + + + {name: "LatexSprayer", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, + SFX: {death: "SciFiExplodeLarge"}, + nonDirectional: true, + color: "#2789cd", + tags: KDMapInit(["disarmimmune", "turret", "basicturret", "immobile", "ignoreharmless", "mimicBlock", "doortrap", "robot", "acidweakness", "soapweakness", "soulresist", "minor", "ranged", + "electricsevereweakness", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness"]), + AI: "hunt", difficulty: 0.25, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff5277"}, + ], + effect: { + effect: {name: "LatexSpray", count: 1, time: 4, power: 2, mult: 2, damage: "glue"}, + }, + spells: ["LatexSpray"], spellCooldownMult: 1, spellCooldownMod: 0, projectileTargeting: true, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + maxblock: 0, + maxdodge: 0, + Sound: { + baseAmount: 0, + moveAmount: 0, + alertAmount: 12, + }, + RestraintFilter: { + unlimitedRestraints: true, + }, + armor: 2.0, maxhp: 20, movePoints: 9999, immobile: true, + visionRadius: 7.5, followRange: 999, + sneakThreshold: 1, + evasion: -9, + attack: "SpellMeleeEffect", attackPoints: 2, attackWidth: 2.5, attackRange: 1, power: 1, dmgType: "glue", + minLevel:0, weight:-50, terrainTags: {"robot": 7, "oldrobot": -3, "oldrobotturret": -50, "oldrobotturretspawn": -150, "robotturret": 50, "robotturretspawn": 150, open: 50, "latexOptout": -50}, + shrines: ["Latex"], floors:KDMapInit(["bel"]), + dropTable: [{name: "AncientPowerSource", weight: 9}, {name: "EnchantedGrinder", weight: 1, noSummon: true}]}, + + {name: "Drone", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, color: "#ff7755", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit([ "drone","ignoreharmless", "disarmimmune", "doortrap", "robot", "flying", "acidweakness", "soapweakness", "soulresist", "minor", "melee", "electricsevereweakness", "coldresist", "iceresist", + "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "jail", "search"]), + AI: "patrol", difficulty: 0.3, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ff5277"}, + ], + maxblock: 0, + maxdodge: 3, + stamina: 8, + sprintspeed: 1.8, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + Sound: { + baseAmount: 4, + moveAmount: 4, + alertAmount: 12, + }, + RestraintFilter: { + unlimitedRestraints: true, + }, + //summon: [ + //{enemy: "Drone", range: 2, count: 2, chance: 0.7, strict: true},], + armor: 2, maxhp: 5, movePoints: 1.8, + visionRadius: 6, followRange: 1, projectileAttack: true, useLock: "Red", + bindOnDisable: true, suicideOnAdd: true, + evasion: 0.15, + specialCD: 30, specialAttack: "Stun", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 3, specialRange: 7, specialWidth: 1.5, specialMinRange: 3, specialsfx: "Laser", stunTime: 5, + attack: "MeleeBindSuicideWill", attackPoints: 2, attackWidth: 1, attackRange: 1, power: 3, dmgType: "electric", multiBind: 2, fullBoundBonus: 6, + minLevel:0, weight:-4, terrainTags: {"secondhalf":0.5, "thirdhalf":0.5, "increasingWeight":0.25, "metalAnger": 4, "metalRage": 2, "metalPleased": 4, "metalFriendly": 4, "robot": 40}, shrines: ["Metal"], allFloors: true, + dropTable: [{name: "Nothing", weight: 19}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, + + {name: "DroneGuardian", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", noChaseUnrestrained: true, color: "#ff7755", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit([ "drone","ignoreharmless", "disarmimmune", "doortrap", "robot", "flying", "acidweakness", "soapweakness", "soulresist", "guardian", "minor", "melee", "electricsevereweakness", "coldresist", "iceresist", + "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "jail", "search"]), + AI: "patrol", difficulty: 0.3, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#e7cf1a"}, + ], + maxblock: 0, + maxdodge: 3, + stamina: 8, + sprintspeed: 1.8, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + Sound: { + baseAmount: 4, + moveAmount: 4, + alertAmount: 12, + }, + RestraintFilter: { + unlimitedRestraints: true, + }, + //summon: [ + //{enemy: "Drone", range: 2, count: 2, chance: 0.7, strict: true},], + armor: 2, maxhp: 8, movePoints: 1.5, + visionRadius: 6, followRange: 1, projectileAttack: true, useLock: "Red", + bindOnDisable: true, suicideOnAdd: true, + evasion: 0.15, + specialCD: 30, specialAttack: "Stun", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 3, specialRange: 7, specialWidth: 1.5, specialMinRange: 3, specialsfx: "Laser", stunTime: 5, + attack: "MeleeBindSuicideWill", attackPoints: 2, attackWidth: 1, attackRange: 1, power: 3, dmgType: "electric", multiBind: 2, fullBoundBonus: 6, + minLevel:0, weight:-40, terrainTags: {guardian: 40, "secondhalf":0.5, "thirdhalf":0.5, "increasingWeight":0.25, "metalAnger": 4, "metalRage": 2, "metalPleased": 4, "metalFriendly": 4, "robot": 40}, shrines: ["Metal"], allFloors: true, + dropTable: [{name: "Nothing", weight: 19}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, + + // Miku + {name: "Cyborg", faction: "AncientRobot", + playLine: "Cyborg", + outfit: "Cyborg", + style: "GreenHair", + bound: "Cyborg", color: "#95e892", + tags: KDMapInit(["leashing", "opendoors", "closedoors", "jail", "jailer", "melee", "unflinching", "elite", "robot", "cyborg", "cyberdollrestraints", "cyberhogtie", "cyberdollheavy", "controlharness", "handcuffer", + "electricweakness", "coldresist", "iceresist", "slashresist", "pierceresist", "guardian"]), + noDisplace: false, disarm: 0.5, + armor: 2, + keys: true, followRange: 1, AI: "guard", visionRadius: 7, maxhp: 10, minLevel: 0, weight:-20, movePoints: 1.5, attackPoints: 2, evasion: -0.2, focusPlayer: true, + attack: "MeleeBindLockWillStun", attackWidth: 3, attackRange: 1, power: 4, dmgType: "electric", stunTime: 1, attackLock: "Red", + stamina: 4, + maxblock: 1, + maxdodge: 2, + sprintspeed: 2.4, + RemoteControl: { + punishRemote: 4, + punishRemoteChance: 0.2, + }, + Sound: { + baseAmount: 3.5, + alertAmount: 8, + }, + RestraintFilter: { + requiredItems: ["CyberDollJacket"], + }, + events: [ + {trigger: "defeat", type: "delete", chance: 1.0}, + {trigger: "tick", type: "secretToy"}, + ], + terrainTags: {"jailGuard": 50, "robot": 25, guardian: 26, "cyborg": 25}, allFloors: true, dropTable: [{name: "RedKey", weight: 1}, {name: "KeyCard", weight: 1}]}, + + // Rin + {name: "CyborgGuardian", faction: "AncientRobot", + playLine: "Cyborg", + outfit: "Cyborg", + style: "Bandit", + bound: "CyborgGuardian", color: "#f0b541", + tags: KDMapInit(["leashing", "opendoors", "closedoors", "jail", "jailer", "melee", "unflinching", "miniboss", "robot", "cyborg", "guardian", "cyberhogtie", "cyberdollrestraints", "cyberdollheavy", "controlharness", "handcuffer", + "electricweakness", "coldresist", "iceresist", "slashresist", "pierceresist"]), + noDisplace: false, disarm: 0.5, + spells: ["SummonForceFields", "RobotBolt"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, + projectileTargeting: true, + armor: 2, + keys: true, followRange: 1, AI: "guard", visionRadius: 7.5, maxhp: 16, minLevel: 0, weight:-30, movePoints: 1.8, attackPoints: 2, evasion: -0.3, focusPlayer: true, + attack: "SpellMeleeBindLockWillStun", attackWidth: 3, attackRange: 1, power: 4, dmgType: "electric", stunTime: 1, attackLock: "Red", + stamina: 3, + maxblock: 2, + maxdodge: 1, + sprintspeed: 2.4, + RemoteControl: { + punishRemote: 4, + punishRemoteChance: 0.2, + }, + Sound: { + baseAmount: 3.5, + alertAmount: 8, + }, + RestraintFilter: { + requiredItems: ["CyberDollJacket"], + }, + events: [ + {trigger: "defeat", type: "delete", chance: 1.0}, + {trigger: "tick", type: "secretToy"}, + ], + terrainTags: {"robot": 5, "cyborg": 25, guardian: 50}, allFloors: true, dropTable: [{name: "RedKey", weight: 1}, {name: "KeyCard", weight: 1}, {name: "BlueKey", weight: 0.1}]}, + + + + {name: "CaptureBot", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", color: "#2a319c", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit(["leashing", "jailer", "doortrap", "robot", "acidweakness", "soapweakness", "melee", "electricsevereweakness", "coldresist", "cyberhogtie", "soulresist", "guardCall", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "controlHarness", "opendoors", "closedoors", "search"]), + AI: "patrol", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff5277"}, + ], + maxblock: 2, + maxdodge: 0, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + stamina: 2, + Sound: { + baseAmount: 3, + moveAmount: 8, + alertAmount: 12, + }, + armor: 2.5, maxhp: 10, movePoints: 2, + evasion: -0.2, + visionRadius: 6, followRange: 1, projectileAttack: true, useLock: "Red", + RemoteControl: { + punishRemote: 4, + punishRemoteChance: 0.25, + }, + attack: "MeleeBind", attackPoints: 4, attackWidth: 3, attackRange: 1, power: 3, dmgType: "crush", multiBind: 2, fullBoundBonus: 2, + minLevel:3, weight:-6, terrainTags: {"nocablebot": -1000, "secondhalf":1, "thirdhalf":1, "increasingWeight":0.5, "metalAnger": 6, "metalRage": 4, "metalPleased": 6, "metalFriendly": 4, "robot": 20, "tapePref": -4, "tapeOptout": 3}, shrines: ["Metal"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10, noSummon: true}, {name: "KeyCard", weight: 1}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, + {name: "ForcefieldBot", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", color: "#2a319c", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit(["leashing", "jailer", "doortrap", "robot", "acidweakness", "soapweakness", "melee", "elite", "electricsevereweakness", + "bulwark", "coldresist", "soulresist", "guardCall", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "controlHarness", "opendoors", "closedoors", "search"]), + AI: "patrol", + spells: ["SummonForceFields"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff5277"}, + ], + maxblock: 3, + maxdodge: 0, + stamina: 2, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + Sound: { + baseAmount: 4, + moveAmount: 8, + alertAmount: 12, + }, + armor: 2.5, maxhp: 14, movePoints: 3, + evasion: -0.35, + visionRadius: 6, followRange: 1, projectileAttack: true, useLock: "Red", + RemoteControl: { + punishRemote: 4, + punishRemoteChance: 0.25, + }, + attack: "SpellMeleeBind", attackPoints: 4, attackWidth: 1, attackRange: 1, power: 3, dmgType: "electric", multiBind: 1, fullBoundBonus: 4, + minLevel:6, weight:-6, + terrainTags: {"secondhalf":1, "thirdhalf":1, "increasingWeight":0.5, "metalAnger": 5, "metalRage": 3, "metalPleased": 5, "metalFriendly": 3, "robot": 17}, shrines: ["Metal"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10, noSummon: true}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, + {name: "TapeBot", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", color: "#00eeee", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit(["leashing", "jailer", "doortrap", "robot", "acidweakness", "soapweakness", "melee", "electricsevereweakness", "coldresist", "soulresist", "guardCall", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "autoTape", "opendoors", "closedoors", "search"]), + AI: "patrol", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4, color: "#00eeee"}, + ], + maxblock: 1, + maxdodge: 0, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + stamina: 2, + Sound: { + baseAmount: 3, + moveAmount: 8, + alertAmount: 12, + }, + armor: 2.5, maxhp: 10, movePoints: 1.7, + evasion: -0.2, + visionRadius: 6, followRange: 3.5, projectileAttack: true, useLock: "Red", + RemoteControl: { + punishRemote: 4, + punishRemoteChance: 0.25, + }, + attack: "MeleeBind", attackPoints: 3, attackWidth: 1, attackRange: 3.5, power: 3, dmgType: "glue", multiBind: 1, fullBoundBonus: 2, + minLevel:2, weight:-8, terrainTags: {"notapebot": -1000, "secondhalf":1, "thirdhalf":1, "increasingWeight":0.5, "metalAnger": 6, "metalRage": 4, "metalPleased": 6, "metalFriendly": 4, "robot": 20, "tape": 5, "tapePref": 6, "tapeOptout": -30}, shrines: ["Metal"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10, noSummon: true}, {name: "KeyCard", weight: 1}, {name: "AncientPowerSourceSpent", weight: 1, noSummon: true}]}, + {name: "BotMissile", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", color: "#2a319c", + SFX: {death: "SciFiExplodeLarge"}, + tags: KDMapInit(["leashing", "disarmresist", "robot", "ranged", "miniboss", "acidweakness", "soapweakness", "electricsevereweakness", + "unflinching", "coldresist", "soulresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", + "bulwark", "hitechCables", "cableGag", "controlHarness", "search", "dollRoomBoss"]), + AI: "guard", spellRdy: true, bypass: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff5277"}, + ], + maxblock: 0, + maxdodge: 0, + spells: ["RubberMissile"], spellCooldownMult: 0.7, spellCooldownMod: 0, castWhileMoving: true, followLeashedOnly: true, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + Sound: { + baseAmount: 5, + moveAmount: 10, + alertAmount: 12, + }, + armor: 4, maxhp: 20, movePoints: 4, + evasion: -0.5, + visionRadius: 9, followRange: 3.5, projectileAttack: true, useLock: "Red", + RemoteControl: { + punishRemote: 6, + punishRemoteChance: 0.5, + }, + attack: "SpellMeleeBind", attackPoints: 2, attackWidth: 1, attackRange: 3.5, power: 1, dmgType: "crush", multiBind: 1, fullBoundBonus: 3, + minLevel:7, weight:-106, terrainTags: {"nolatexbot": -1000,"thirdhalf":1, "increasingWeight":0.5, "open": 100, "metalAnger": 44, "metalRage": 13, "metalPleased": 44, "latex": 5, "metalFriendly": 13, "robot": 7}, shrines: ["Metal"], allFloors: true, + dropTable: [{name: "Gunpowder", amountMin: 2, amountMax: 3, weight: 5, noSummon: true}, {name: "KeyCard", weight: 1}, {name: "AncientPowerSource", weight: 1, noSummon: true}]}, + {name: "EnforcerBot", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", color: "#2a319c", + SFX: {death: "SciFiExplodeLarge"}, + tags: KDMapInit(["leashing", "disarmresist", "robot", "ranged", "miniboss", "acidweakness", "soapweakness", + "bulwark", "electricsevereweakness", "unstoppable", "coldresist", "soulresist", "iceresist", "slashresist", "cyberhogtie", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "controlHarness", "search"]), + AI: "guard", spellRdy: true, bypass: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff5277"}, + ], + maxblock: 0, + maxdodge: 0, + spells: ["RobotBolt"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, followLeashedOnly: true, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + Sound: { + baseAmount: 5, + moveAmount: 10, + alertAmount: 12, + }, + summon: [ + {enemy: "Drone", range: 2, count: 2, chance: 0.25, strict: true},], + armor: 5, maxhp: 28, movePoints: 4, + evasion: -0.5, + visionRadius: 9, followRange: 3.5, projectileAttack: true, useLock: "Red", + RemoteControl: { + punishRemote: 6, + punishRemoteChance: 0.5, + }, + attack: "SpellMeleeBind", attackPoints: 2, attackWidth: 1, attackRange: 3.5, power: 1, dmgType: "crush", multiBind: 1, fullBoundBonus: 3, + minLevel:9, weight:-106, terrainTags: {"thirdhalf":1, "increasingWeight":0.5, guardian: 100, "robot": 7}, shrines: ["Metal"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 5, noSummon: true}, {name: "KeyCard", weight: 1}, {name: "AncientPowerSource", weight: 1, noSummon: true}]}, + + {name: "EnforcerBotGuardian", faction: "AncientRobot", clusterWith: "robot", playLine: "Robot", color: "#2a319c", + SFX: {death: "SciFiExplodeLarge"}, + tags: KDMapInit(["leashing", "disarmresist", "robot", "ranged", "miniboss", "acidweakness", "soapweakness", + "bulwark", "electricsevereweakness", "guardian", "unstoppable", "coldresist", "soulresist", "iceresist", "cyberhogtie", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "controlHarness", "search"]), + AI: "guard", spellRdy: true, bypass: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#e7cf1a"}, + ], + maxblock: 0, + maxdodge: 0, + spells: ["RobotBolt"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, followLeashedOnly: true, + cueSfx: { + Block: "Clang", + Resist: "SoftShield", + Damage: "RobotHit", + }, + Sound: { + baseAmount: 5, + moveAmount: 10, + alertAmount: 12, + }, + summon: [ + {enemy: "DroneGuardian", range: 2, count: 2, chance: 0.25, strict: true},], + armor: 5, maxhp: 24, movePoints: 4, + evasion: -0.5, + visionRadius: 9, followRange: 3.5, projectileAttack: true, useLock: "Red", + RemoteControl: { + punishRemote: 6, + punishRemoteChance: 0.5, + }, + attack: "SpellMeleeBind", attackPoints: 2, attackWidth: 1, attackRange: 3.5, power: 1, dmgType: "crush", multiBind: 1, fullBoundBonus: 3, + minLevel:9, weight:-106, terrainTags: {"nocablebot": -1000, "thirdhalf":1, "increasingWeight":0.5, "open": 100, "metalAnger": 44, "metalRage": 13, "metalPleased": 44, "metalFriendly": 13, "robot": 7}, shrines: ["Metal"], allFloors: true, + dropTable: [{name: "KeyCard", weight: 5}, {name: "AncientPowerSource", weight: 1, noSummon: true}]}, + + {name: "AlchemistPet", style: "Nevermere", outfit: "AlchemistPet", faction: "Alchemist", clusterWith: "alchemist", bound: "AlchemistPet", playLine: "Gagged", color: "#007C59", tags: KDMapInit(["opendoors", "disarmresist", "noarms", "submissive", "noshop", "gagged", "imprisonable", "ignoreharmless", "alchemist", "ranged", "glueweakness", "electricresist", "ticklesevereweakness", "iceresist", "charmweakness", "stunweakness", "search"]), + ignorechance: 0, armor: 1, followRange: 1.5, AI: "hunt", + master: {type: "Alchemist", range: 2, loose: true, aggressive: true}, sneakThreshold: 1, blindSight: 2, projectileAttack: true, strictAttackLOS: true, events: [ + {trigger: "tick", type: "secretToy"}, + ], + maxblock: 0, + maxdodge: 2, + stamina: 7, + nopickpocket: true, + specialCD: 11, specialAttack: "DashStun", specialRemove: "Will", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialMinRange: 1.5, specialsfx: "HeavySwing", stunTime: 4, stunOnSpecialCD: 4, + visionRadius: 6, maxhp: 10, minLevel:3, weight:0, movePoints: 1, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {"latexAnger": 2, "latexRage": 2, "alchemist": 7}, shrines: ["Latex"], allFloors: true, + dropTable: []}, + {name: "WolfgirlPet", style: "Nevermere", outfit: "Wolfgirl", faction: "Nevermere", clusterWith: "nevermere", bound: "WolfgirlPet", playLine: "Gagged", color: "#009C79", tags: KDMapInit(["opendoors", "wolfSub", "disarmresist", "nevermere", "noarms", "submissive", "noshop", "gagged", "wolfPet", "alwaysAlert", "imprisonable", "wolfgirl", "minor", "ignoreharmless", "ranged", "glueweakness", "electricresist", "ticklesevereweakness", "iceresist", "charmweakness", "stunweakness", "search"]), + ignorechance: 0, armor: 1, followRange: 2, AI: "hunt", cohesion: 0.9, + master: {type: "Wolfgirl", range: 2, loose: true, aggressive: true}, sneakThreshold: 1, blindSight: 2, projectileAttack: true, strictAttackLOS: true, difficulty: 0.5, events: [ + {trigger: "tick", type: "secretToy"}, + ], + maxblock: 0, + maxdodge: 2, + stamina: 7, + nopickpocket: true, + specialCD: 11, specialAttack: "DashStun", specialRemove: "Will", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialMinRange: 1.5, specialsfx: "HeavySwing", stunTime: 4, stunOnSpecialCD: 4, + visionRadius: 6, maxhp: 10, minLevel:0, weight:0.1, movePoints: 1, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {"metalAnger": 3, "metalRage": 3, "metalPleased": 2, "metalFriendly": 2, "nevermere": 2}, shrines: ["Metal"], allFloors: true, + dropTable: []}, + {name: "WolfGuard", style: "Nevermere", outfit: "Wolfgirl", faction: "Nevermere", clusterWith: "nevermere", bound: "WolfGuard", color: "#00dCa9", playLine: "Gagged", + tags: KDMapInit([ + "opendoors", "blindweakness", "disarmimmune", "wolfSub", "nevermere", "noarms", "submissive", "noshop", "gagged", "wolfPet", "autoTape", "alwaysAlert", "leashing", "wolfLeash", "imprisonable", "wolfgirl", "ranged", "glueweakness", "electricresist", "ticklesevereweakness", "iceresist", "charmweakness", "stunweakness", "search", + "bulwark"]), + ignorechance: 0, armor: 2.5, followRange: 2, AI: "hunt", cohesion: 0.5, events: [ + {trigger: "tick", type: "secretToy"}, + ], + maxblock: 0, + maxdodge: 3, + nopickpocket: true, + attackLock: "White", + master: {type: "Wolfgirl", range: 2, loose: true, aggressive: true}, sneakThreshold: 1, blindSight: 2, projectileAttack: true, strictAttackLOS: true, + specialCD: 9, specialAttack: "DashWill", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialMinRange: 1.5, specialsfx: "HeavySwing", stunTime: 4, stunOnSpecialCD: 4, specialDamage: "crush", + visionRadius: 6, maxhp: 14, minLevel:6, weight:0, movePoints: 1, attackPoints: 3, attack: "MeleeBind", attackWidth: 1, attackRange: 3, projectileTargeting: true, power: 2, dmgType: "electric", fullBoundBonus: 2, + terrainTags: {"metalAnger": 1.5, "metalRage": 8, "metalPleased": 4, "metalFriendly": 4, "nevermere": 1}, shrines: ["Metal"], allFloors: true, + dropTable: [{name: "Nothing", weight: 10}, {name: "EscortDrone", weight: 0.5, ignoreInInventory: true}, {name: "VibeWand", weight: 100, ignoreInInventory: true},]}, + {name: "WolfInstructor", style: "Nevermere", outfit: "Wolfgirl", faction: "Nevermere", clusterWith: "nevermere", bound: "Wolfgirl", playLine: "Wolfgirl", color: "#00EFAB", tags: KDMapInit(["leashing", "nevermere", "wolfPetsuit", "antiMagic", "imprisonable", "trainer", "controlHarness", "wolfRestraintsHeavy","wolfgirl", "jailer", "opendoors", "unflinching", "closedoors", "wolfGear", "handcuffer", "melee", "unflinching", "iceresist", "electricresist", "charmweakness", "stunweakness", "ticklesevereweakness", "jail", "jailer", "hunter"]), + followRange: 3, kite: 2.5, + summon: [ + {enemy: "WolfgirlPet", range: 2, count: 1, chance: 1.0, strict: true}, + {enemy: "WolfgirlPet", range: 2, count: 1, chance: 0.5, strict: true}, + ], + maxblock: 1, + maxdodge: 1, + stamina: 5, + spells: ["NevermereBoost"], spellCooldownMult: 1, spellCooldownMod: 5, buffallies: true, + AI: "hunt", visionRadius: 10, maxhp: 9, minLevel:6, weight:-2, movePoints: 2, evasion: 0.3, + RemoteControl: { + punishRemote: 4, + punishRemoteChance: 0.25, + }, + attackPoints: 3, attack: "MeleeBindLockWillSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 3, dmgType: "pain", + attackLock: "White", + terrainTags: {"secondhalf":4, "lastthird":4, "metalAnger": 4, "metalRage": 4, "metalPleased": 9, "metalFriendly": 4, "nevermere": 9}, allFloors: true, shrines: ["Metal"], + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "KeyCard", weight: 1}] + }, + {name: "WolfExecutive", style: "Nevermere", outfit: "Wolfgirl", faction: "Nevermere", clusterWith: "nevermere", bound: "WolfExecutive", color: "#00EFAB", playLine: "Wolfgirl", + tags: KDMapInit(["leashing", "wolfPetsuit", "nevermere", "trainer", "wolfgirl", "jailer", "opendoors", "unflinching", "closedoors", "antiMagic", "wolfGear", "controlHarness", "wolfRestraints", "wolfRestraintsHeavy", "melee", + "boss", "unstoppable", "iceresist", "electricresist", "charmweakness", "stunweakness", "ticklesevereweakness", "jailer", "hunter"]), + followRange: 4.5, kite: 2.5, + summon: [ + {enemy: "WolfGuard", range: 2, count: 2, chance: 1.0, strict: true}, + {enemy: "WolfShieldDrone", range: 2, count: 1, chance: 0.5, strict: true}, + ], + maxblock: 2, + maxdodge: 3, + spells: ["NevermereBoost", "SummonWolfDrone", "SummonWolfTapeDrone", "EnemyBlast"], spellCooldownMult: 0.5, spellCooldownMod: 0, buffallies: true, projectileTargeting: true, + stamina: 5, + AI: "hunt", visionRadius: 10, maxhp: 30, minLevel:5, weight:-30, movePoints: 1.2, evasion: 0.2, bindOnDisable: true, + smartBind: true, + RemoteControl: { + punishRemote: 5, + punishRemoteChance: 0.35, + }, + attackPoints: 4, attack: "MeleeWillBindLockAllSpell", multiBind: 2, attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 3, fullBoundBonus: 3, dmgType: "charm", attackLock: "Blue", + terrainTags: {"secondhalf":5, "lastthird":5, "boss": -30, "open": 10, "passage": -40, "metalAnger": 2, "metalRage": 2, "metalPleased": 5, "metalFriendly": 5, "increasingWeight":0.5, "nevermere": 30}, + allFloors: true, shrines: ["Metal"], + dropTable: [{name: "KeyCard", weight: 10}, {name: "Blaster", weight: 100, ignoreInInventory: true},] + }, + + {name: "Wolfgirl", style: "Nevermere", outfit: "Wolfgirl", faction: "Nevermere", clusterWith: "nevermere", bound: "Wolfgirl", color: "#00EFAB", playLine: "Wolfgirl", + tags: KDMapInit(["leashing", "wolfPetsuit", "nevermere", "imprisonable", "trainer", "wolfgirl", "jailer", "opendoors", "unflinching", "closedoors", "wolfRestraints", "melee", "miniboss", "unflinching", "glueweakness", "ticklesevereweakness", "iceresist", "electricresist", "charmweakness", "stunweakness", "unflinching", "jail", "jailer", "hunter"]), followRange: 1, + summon: [ + {enemy: "WolfgirlPet", range: 2, count: 1, chance: 0.7, strict: true},], + spells: ["RestrainingDevice"], spellCooldownMult: 1, spellCooldownMod: 1, AI: "hunt", visionRadius: 10, maxhp: 20, minLevel:0, weight:-6, movePoints: 2, disarm: 0.5, armor: 1.5, + RemoteControl: { + punishRemote: 4, + punishRemoteChance: 0.25, + }, + events: [ + {trigger: "tick", type: "LeashWolfgirls", dist: 3.5, chance: 0.3}, + ], + maxblock: 3, + maxdodge: 2, + stamina: 6, + attackPoints: 3, attack: "MeleeBindLockAllWillSpell", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 4, dmgType: "grope", attackLock: "Red", + terrainTags: {"secondhalf":3, "lastthird":5, "metalAnger": 7, "metalRage": 2, "metalPleased": 9, "metalFriendly": 6, "nevermere": 7}, allFloors: true, shrines: ["Metal"], + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "EscortDrone", weight: 1.0, ignoreInInventory: true}] + }, + + {name: "WolfOperative", style: "Nevermere", outfit: "Wolfgirl", faction: "Nevermere", clusterWith: "nevermere", bound: "WolfOperative", color: "#00EFAB", playLine: "Hunter", + tags: KDMapInit(["leashing", "bountyhunter", "nevermere", "imprisonable", "trainer", "wolfgirl", "jailer", "antiMagic", "opendoors", "imprisonable", "unflinching", "closedoors", "wolfRestraints", "wolfRestraintsHeavy", "melee", "elite", "unflinching", "glueweakness", "ticklesevereweakness", "iceresist", "electricresist", "charmweakness", "stunweakness", "unflinching", "jail", "jailer", "hunter"]), followRange: 1, + spells: ["EnemyBlast"], spellCooldownMult: 0.75, spellCooldownMod: 0, AI: "hunt", visionRadius: 10, maxhp: 18, minLevel:5, weight:-3, movePoints: 1.7, disarm: 0.5, stealth: 3.5, armor: 0.5, + RemoteControl: { + punishRemote: 3, + punishRemoteChance: 0.2, + }, + maxblock: 2, + maxdodge: 2, + stamina: 7, + Sound: { + baseAmount: 1, + moveAmount: 4, + }, + bindOnDisable: true, projectileTargeting: true, cohesion: 0.1, + smartBind: true, + attackPoints: 2, attack: "MeleeBindLockAllWillSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, + attackLock: "White", + terrainTags: {"secondhalf":1, "lastthird":2, "metalAnger": 5, "metalRage": 5, "metalPleased": 15, "metalFriendly": 10, "nevermere": 13, "bountyhunter": 3}, allFloors: true, shrines: ["Metal"], + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 19}, {name: "Blaster", ignoreInInventory: true, weight: 0.5}]}, + + {name: "WolfApprentice", style: "Nevermere", outfit: "Wolfgirl", faction: "Nevermere", clusterWith: "nevermere", bound: "Wolfgirl", color: "#00EFAB", playLine: "Wolfgirl", + tags: KDMapInit(["leashing", "imprisonable", "nevermere", "trainer", "wolfgirl", "jailer", "opendoors", "unflinching", "closedoors", "wolfRestraints", "melee", "elite", "unflinching", "glueweakness", "ticklesevereweakness", "iceresist", "electricresist", "charmweakness", "stunweakness", "unflinching", "jail", "jailer", "hunter"]), + spells: ["SummonWolfDrone"], spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", visionRadius: 10, maxhp: 9, minLevel:0, weight:1, movePoints: 2.5, events: [ + {trigger: "tick", type: "secretToy"}, + ], + maxblock: 1, + maxdodge: 1, + armor: 0.5, + RemoteControl: { + punishRemote: 3, + punishRemoteChance: 0.15, + }, + stamina: 2, + attackLock: "White", + followRange: 1, kite: 2.5, dontKiteWhenDisabled: true, castWhileMoving: true, + attackPoints: 3, attack: "MeleeBindLockWillSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", sneakThreshold: 2.5, + terrainTags: {"secondhalf":1, "lastthird":2, "metalAnger": 12, "metalRage": 6, "metalPleased": 5, "metalFriendly": 10, "nevermere": 15}, allFloors: true, shrines: ["Metal"], + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "EscortDrone", weight: 0.25, ignoreInInventory: true}]}, + + {name: "WolfDrone", faction: "Nevermere", clusterWith: "nevermere", color: "#00EFAB", playLine: "Robot", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit(["ignoreharmless", "quadcopter", "disarmimmune", "robot", "nevermere", "wolfdrone", "flying", "acidweakness", "soapweakness", "soulresist", "minor", "ranged", "electricsevereweakness", "wolfPet", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "hitechCables", "cableGag", "search"]), + followRange: 2.5, kite: 1.5, + maxblock: 0, + maxdodge: 0, + Sound: { + baseAmount: 5, + moveAmount: 8, + alertAmount: 12, + }, + spells: ["WolfCrackle"], spellCooldownMult: 1, spellCooldownMod: 1, AI: "hunt", visionRadius: 9, maxhp: 5, armor: 1, minLevel:0, weight:-1000, movePoints: 1, + attackPoints: 3, attack: "Spell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "grope", + terrainTags: {}, allFloors: true, shrines: ["Metal"], + }, + {name: "WolfShieldDrone", faction: "Nevermere", clusterWith: "nevermere", color: "#00EFAB", playLine: "Robot", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit(["ignoreharmless", "quadcopter", "disarmimmune", "robot", "wolfdrone", "nevermere", "flying", "acidweakness", + "bulwark", "soapweakness", "soulresist", "minor", "ranged", "electricsevereweakness", "wolfPet", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "search"]), + followRange: 3.9, kite: 2.5, difficulty: 0.2, + evasion: -0.2, + maxblock: 1, + maxdodge: 0, + Sound: { + baseAmount: 4.5, + moveAmount: 4.5, + alertAmount: 12, + }, + shield: 5, + AI: "hunt", visionRadius: 9, maxhp: 6, minLevel:0, weight:-4, movePoints: 1.5, cohesion: 1.0, armor: 1.5, spellResist: 1.5, + attackPoints: 3, attack: "", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "grope", + terrainTags: {"metalAnger": 4, "metalRage": 4, "nevermere": 8}, allFloors: true, shrines: ["Metal"], + events: [ + {trigger: "afterEnemyTick", type: "wolfShieldDroneAura", power: 10, mult: 0.04, dist: 4.5}, + ], + }, + {name: "WolfTapeDrones", faction: "Nevermere", clusterWith: "nevermere", color: "#00eeee", playLine: "Robot", + SFX: {death: "SciFiExplode"}, + tags: KDMapInit(["ignoreharmless", "quadcopter", "disarmimmune", "robot", "wolfdrone", "leashing", "nevermere", "flying", "acidweakness", "soapweakness", "soulresist", "minor", "ranged", "fireweakness", "electricsevereweakness", "wolfPet", "coldresist", "iceresist", "slashresist", "crushsevereweakness", "pierceweakness", "autoTape", "search"]), + followRange: 1, difficulty: 0.5, + maxblock: 0, + maxdodge: 0, + Sound: { + baseAmount: 4, + moveAmount: 7, + alertAmount: 12, + }, + AI: "hunt", visionRadius: 9, maxhp: 7, minLevel:0, weight:-3, movePoints: 1, cohesion: 1.0, armor: 1, spellResist: -0.5, evasion: 0.5, + attackPoints: 2, attack: "MeleeBind", attackWidth: 2.5, attackRange: 1, tilesMinRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 1, + terrainTags: {"metalPleased": 4, "metalFriendly": 8, "nevermere": 13, "tapeOptout": -30, "tape": 5, "tapePref": 2}, allFloors: true, shrines: ["Metal"], + }, + + + {name: "BanditGuard", outfit: "BanditGuard", style: "Earth", faction: "Bandit", clusterWith: "bandit", playLine: "Bandit", bound: "Bandit", tags: KDMapInit(["opendoors", "closedoors", "leashing", "cacheguard", "bandit", "minor", "melee", "leatherRestraints", "leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "jail", "jailer", "search"]), + cohesion: 0.9, armor: 1, followRange: 1, AI: "hunt", + maxblock: 2, + maxdodge: 1, + master: {type: "BanditChief", range: 2, loose: true, aggressive: true}, + spells: ["BanditBola"], spellCooldownMult: 1, spellCooldownMod: 6, noSpellLeashing: true, difficulty: 0.9, miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", + visionRadius: 7, maxhp: 11, minLevel:9, weight:20, movePoints: 1.5, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, + attackLock: "White", + stamina: 4, + terrainTags: {"BanditEnemy": 10, "increasingWeight":-1, "BanditWanted": 10, "BanditHated": 5}, shrines: ["Leather"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 5, amountMax: 20, weight: 24}, {name: "Rope", weight: 100.5, ignoreInInventory: true},]}, + {name: "Miner", outfit: "Bandit", style: "Earth", faction: "Bandit", clusterWith: "human", playLine: "Bandit", bound: "Miner", tags: KDMapInit(["opendoors", "closedoors", "leashing", "bandit", "human", "miner", "imprisonable", "melee", "leatherRestraints", "leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "search"]), + cohesion: 0.9, armor: 2.0, followRange: 1, AI: "hunt", + maxblock: 1, + maxdodge: 0, + spells: ["MinerBomb"], spellCooldownMult: 1, spellCooldownMod: 3, noSpellLeashing: true, miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ffdd00"}, + ], + attackLock: "White", + stamina: 5, + visionRadius: 5, maxhp: 10, minLevel:0, weight:12, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "pain", fullBoundBonus: 2, + terrainTags: {"increasingWeight": 1}, shrines: [], floors:KDMapInit(["cry"]), noOverrideFloor: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 21}, {name: "Pickaxe", ignoreInInventory: true, weight: 100}, {name: "Bomb", weight: 9}]}, + {name: "Bandit", style: "Earth", outfit: "Bandit", faction: "Bandit", clusterWith: "bandit", playLine: "Bandit", bound: "Bandit", tags: KDMapInit(["opendoors", "closedoors", "leashing", "cacheguard", "imprisonable", "bandit", "minor", "melee", "leatherRestraints", "leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "jail", "jailer", "search"]), + cohesion: 0.9, armor: 0, followRange: 1, AI: "hunt", + spells: ["BanditBola"], spellCooldownMult: 1, spellCooldownMod: 8, noSpellLeashing: true, difficulty: 0.9, miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", + visionRadius: 6, maxhp: 9, minLevel:0, maxLevel: 9, weight:23, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {"thirdhalf":-4, "increasingWeight":-1, "BanditEnemy": -7, "BanditWanted": -6, "BanditHated": -5}, shrines: ["Leather"], floors:KDMapInit(["jng", "cry"]), + attackLock: "White", + stamina: 3, + maxblock: 1, + maxdodge: 1, + dropTable: [{name: "Gold", amountMin: 5, amountMax: 15, weight: 24}, {name: "Rope", weight: 3.5, ignoreInInventory: true},]}, + {name: "BanditChief", nameList: "italian", style: "Earth", outfit: "BanditChief", faction: "Bandit", clusterWith: "bandit", playLine: "Bandit", bound: "BanditChief", + tags: KDMapInit(["opendoors", + "bulwark", "cacheguard", "closedoors", "leashing", "bandit", "miniboss", "banditleader", "melee", "unflinching", "ballGagRestraints", "handcuffer", "leatherRestraints", "leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "jail", "jailer", "hunter"]), + cohesion: 0.9, armor: 0, followRange: 1, AI: "hunt", + maxblock: 4, + summon: [ + {enemy: "BanditPet", range: 3, count: 1, chance: 1.0, strict: true},], + stamina: 4, + spells: ["BanditBola"], spellCooldownMult: 1, spellCooldownMod: 4, noSpellLeashing: true, miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", + visionRadius: 8, maxhp: 18, minLevel:0, weight:-11, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3.6, attackRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {"secondhalf":16, "lastthird":5, "open": 10, "passage": -10, "increasingWeight":1}, shrines: ["Leather"], floors:KDMapInit(["jng", "cry", "tmp"]), + factionrep: {"Maidforce": 0.005}, + dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 10}, {name: "Knife", ignoreInInventory: true, weight: 2}, {name: "Rope", weight: 100, ignoreInInventory: true},]}, + {name: "BanditPet", style: "Earth", outfit: "BanditPet", faction: "Bandit", clusterWith: "human", playLine: "Gagged", bound: "BanditPet", tags: KDMapInit(["opendoors", "silenceimmune", "submissive", "noshop", "gagged", "imprisonable", "cacheguard", "closedoors", "leashing", "bandit", "melee", "minor", "ballGagRestraints", "ropeRestraints", "tickleweakness", "chainweakness", "glueweakness", "jail", "search"]), + cohesion: 0.9, armor: 0, followRange: 1, AI: "hunt", + maxblock: 0, + maxdodge: 2, + master: {type: "BanditChief", range: 2, loose: true, aggressive: true}, difficulty: 0.7, events: [ + {trigger: "tick", type: "secretToy"}, + ], + stamina: 6, + visionRadius: 6, maxhp: 6, minLevel:0, weight:13, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindLockWill", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {"thirdhalf":-1, "increasingWeight":-1}, shrines: ["Leather"], floors:KDMapInit(["jng", "cry"]), + dropTable: [{name: "Gold", amountMin: 1, amountMax: 5, weight: 10}, {name: "Feather", weight: 50, ignoreInInventory: true}]}, + {name: "BanditHunter", nameList: "japanese", style: "Earth", outfit: "BanditHunter", faction: "Bandit", bound: "BanditHunter", playLine: "Bandit", tags: KDMapInit(["opendoors", "closedoors", "leashing", "bandit", "imprisonable", "melee", "elite", "leatherRestraints", "leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "jail", "jailer", "hunter"]), + ignorechance: 0, armor: 0.5, followRange: 1.5, AI: "hunt", guardChance: 0.6, stealth: 1, + spells: ["BanditBola"], spellCooldownMult: 1, spellCooldownMod: 3, noSpellLeashing: true, projectileTargeting: true, focusPlayer: true, miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", + visionRadius: 7, maxhp: 9, minLevel:0, weight:4 , movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 2, + attackLock: "White", + maxblock: 1, + maxdodge: 2, + stamina: 5, + terrainTags: {"secondhalf":7, "thirdhalf":5}, shrines: ["Leather"], floors:KDMapInit(["jng", "cry", "tmp"]), + Sound: { + baseAmount: 1, + }, + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Rope", weight: 8, ignoreInInventory: true},]}, + {name: "BanditGrappler", nameList: "russian", style: "Earth", outfit: "BanditGuard", faction: "Bandit", clusterWith: "bandit", playLine: "Bandit", bound: "BanditGrappler", color: "#ddcaaa", + tags: KDMapInit(["opendoors", "closedoors", "leashing", "bandit", "imprisonable", "melee", "cacheguard", "elite", "unflinching", "fiddle", "chainRestraints", + "bulwark", "handcuffer","leatherRestraintsHeavy", "clothRestraints", "chainweakness", "glueweakness", "jail", "jailer", "hunter"]), + ignorechance: 0, armor: 2.0, followRange: 1, AI: "hunt", + specialCD: 10, specialAttack: "Pull", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialsfx: "Chain", specialWidth: 1, specialRemove: "BindLock", pullDist: 3, pullTowardSelf: true, + visionRadius: 7, maxhp: 10, minLevel:3, weight:4, movePoints: 3, attackPoints: 2, attack: "MeleeBindLock", attackWidth: 2, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 2, + attackLock: "White", + stamina: 3, + maxblock: 3, + maxdodge: 0, + terrainTags: {"secondhalf":10, "thirdhalf":1}, shrines: ["Leather", "Metal"], floors:KDMapInit(["jng", "cry", "tmp"]), + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}]}, + + {name: "SlimeMold", clusterWith: "mold", faction: "Mold", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "disarmimmune", "doortrap", "mold", "minor", "melee", "moldRestraints", "fireweakness", "glueresist", "acidweakness"]), + squeeze: true, ignorechance: 0.75, followRange: 1, AI: "hunt", sneakThreshold: 1, + nonDirectional: true, + maxblock: 0, + maxdodge: 0, + Sound: { + baseAmount: 0, + idleSoundName: "Slime", + }, + visionRadius: 5, maxhp: 1, minLevel: 0, weight:-15, movePoints: 1.5, attackPoints: 2, attack: "MeleeBindSuicide", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 1, + terrainTags: {"increasingWeight":-2, "mold": 25}, allFloors: true, shrines: ["Latex"]}, + {name: "SlimeMoldLeaper", clusterWith: "mold", faction: "Mold", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "disarmimmune", "doortrap", "mold", "minor", "melee", "moldRestraints", "fireweakness", "glueresist", "acidweakness"]), + squeeze: true, ignorechance: 0.75, followRange: 1, AI: "hunt", sneakThreshold: 1, + nonDirectional: true, + maxblock: 0, + maxdodge: 2, + Sound: { + baseAmount: 0, + idleSoundName: "Slime", + }, + specialCD: 5, specialAttack: "DashBonus", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 3, specialMinRange: 1.5, specialsfx: "Miss", + visionRadius: 9, maxhp: 1, minLevel: 3, weight:-5, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicide", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 2, + terrainTags: {"increasingWeight":-1, "mold": 25}, allFloors: true, shrines: ["Latex"]}, + + {name: "SlimeMoldSpawner", clusterWith: "mold", faction: "Mold", color: "#FF00FF", tags: KDMapInit(["mold", "silenceimmune", "immobile", "spawner", "melee", "moldRestraints", "meleeresist", "fireweakness", "glueresist", "acidweakness"]), + immobile: true, squeeze: true, followRange: 1, AI: "hunt", sneakThreshold: 1, enemyCountSpellLimit: 40, + evasion: -9, + Sound: { + baseAmount: 10, + moveAmount: 10, + idleSoundName: "SlimeLarge2", + }, + spells: ["SummonSlimeMold"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, + visionRadius: 30, blindSight: 30, maxhp: 12, minLevel: 0, weight:-15, movePoints: 1000, attackPoints: 0, attack: "Spell", attackRange: 0, attackWidth: 1, power: 1, dmgType: "acid", fullBoundBonus: 5, + terrainTags: {"increasingWeight":0, "mold": 25, "maid": 15.25}, allFloors: true, shrines: ["Latex"], ondeath: [{type: "summon", enemy: "SlimeMold", range: 2.5, count: 4, strict: true}], + factionrep: {"Maidforce": 0.005}, + }, + + + + {name: "SlimeAdv", faction: "Slime", clusterWith: "slime", bound: "SlimeAdv", playLine: "Gagged", color: "#FF00FF", + tags: KDMapInit([ + "ignoretiedup", "nocapture", "latexTrap", "slime", "disarmresist", "blindimmune", "melee", "slimeRestraints", "electricweakness", "acidresist", "iceweakness", "ticklesevereweakness", "charmweakness", + "submissive", "noshop", "gagged", "imprisonable", "rescueslime", "nocapture", "noarms", "arcaneweakness" + ]), + Sound: { + baseAmount: 4, + moveAmount: 4, + idleSoundName: "Rubber", + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + ignorechance: 0, armor: 1, followRange: 1.5, AI: "hunt", cohesion: 0.45, sneakThreshold: 1, + evasion: -0.25, + master: {type: "WitchSlime", range: 2, loose: true, aggressive: true}, + visionRadius: 4.5, blindSight: 2.5, maxhp: 10, minLevel:2, weight:2, movePoints: 1.7, + attackPoints: 3, attack: "MeleeBindSlow", attackWidth: 1, attackRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 2, + terrainTags: {"latexAnger": 3, "latexRage": 3, "alchemist": 2, "slimeBonus": 2, "slime": 5, "slimeOptOut": -2, "slimePref": 2, "jungle": 8, revenge: 10}, shrines: ["Latex"], allFloors: true, + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, + ],}, + + {name: "AquaSlime", clusterWith: "water", faction: "Slime", color: "#2277ee", + tags: KDMapInit(["ignoretiedup", "disarmimmune", "blindimmune", "elementsTrap", "minor", "water", "melee", "aquaRestraints", "pierceweakness", "electricweakness", "acidresist", "iceweakness"]), squeeze: true, ignorechance: 0.75, followRange: 1, AI: "hunt", sneakThreshold: 1, + visionRadius: 4.5, blindSight: 2.5, maxhp: 7, minLevel: 0, weight:8, movePoints: 1.5, attackPoints: 2, attack: "MeleeBindSuicideWill", + suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "soap", fullBoundBonus: 2, + Animations: ["squishy"], + Sound: { + baseAmount: 0, + idleSoundName: "Slime", + }, + nopickpocket: true, + terrainTags: {"water": 4, "bubbleOptout": -3, "bubblePref": 6, "jungle": 20, "temple": 4, "elements": 4}, allFloors: true, shrines: ["Elements"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Water", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, + ],}, + + {name: "SmallSlime", clusterWith: "slime", faction: "Slime", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "disarmimmune", "blindimmune", "latexTrap", "minor", "slime", "melee", "slimeRestraints", "meleeresist", "chainimmune", "electricweakness", "acidresist", "iceweakness"]), squeeze: true, ignorechance: 0.75, followRange: 1, AI: "hunt", sneakThreshold: 1, + visionRadius: 3, blindSight: 2.5, maxhp: 3, minLevel: 0, maxLevel: 5, weight:8, movePoints: 1.5, attackPoints: 2, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 2, + Animations: ["squishy"], + Sound: { + baseAmount: 0, + idleSoundName: "Slime", + }, + Resistance: { + profile: ["slime"], + }, + nopickpocket: true, + dropTable: [{name: "SlimeRaw", amount: 1, weight: 10}], + terrainTags: {"increasingWeight":-1, "slime": 4, "slimeOptOut": -2, "slimePref": 2, "jungle": 20, "alchemist": 4}, allFloors: true, shrines: ["Latex"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, + ],}, + {name: "SmallSlimeLeaper", clusterWith: "slime", faction: "Slime", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "disarmimmune", "latexTrap", "minor", "slime", "melee", "slimeRestraints", "meleeresist", "chainimmune", "electricweakness", "acidresist", "iceweakness"]), squeeze: true, ignorechance: 0.75, followRange: 1, AI: "hunt", sneakThreshold: 1, + visionRadius: 4.5, blindSight: 2.5, maxhp: 3, minLevel: 5, weight:8, movePoints: 1.5, attackPoints: 2, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "glue", fullBoundBonus: 2, + Animations: ["squishy"], + Sound: { + baseAmount: 0, + moveAmount: 7, + idleSoundName: "Slime", + }, + Resistance: { + profile: ["slime"], + }, + nopickpocket: true, + dropTable: [{name: "SlimeRaw", amount: 1, weight: 10}], + specialCD: 5, specialAttack: "DashBonus", specialRemove: "BindSuicideWill", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.99, specialMinRange: 1.5, specialsfx: "Miss", + terrainTags: {"increasingWeight":-1, "slime": 4, "slimeOptOut": -2, "slimePref": 2, "jungle": 20, "alchemist": 4}, allFloors: true, shrines: ["Latex"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, + ],}, + {name: "FastSlime", clusterWith: "slime", faction: "Slime", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "disarmimmune", "latexTrap", "slime", "melee", "slimeRestraints", "meleeresist", "chainimmune", "electricweakness", "acidresist", "iceweakness"]), squeeze: true, evasion: 0.3, followRange: 1, AI: "hunt", sneakThreshold: 1, + visionRadius: 4.5, blindSight: 2.5, maxhp: 3, minLevel: 9, weight:3, movePoints: 1, attackPoints: 3, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 3, power: 2, dmgType: "glue", fullBoundBonus: 2, + Animations: ["squishy"], + Sound: { + baseAmount: 0, + idleSoundName: "Slime", + }, + Resistance: { + profile: ["slime"], + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 2, + dropTable: [{name: "SlimeRaw", amount: 1, weight: 10}], + terrainTags: {"increasingWeight":1, "slime": 2.5, "slimeOptOut": -1.2, "slimePref": 1.2, "jungle": 8, "alchemist": 4}, allFloors: true, shrines: ["Latex"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, + ],}, + {name: "BigSlime", clusterWith: "slime", faction: "Slime", color: "#FF00FF", tags: KDMapInit(["ignoretiedup", "disarmimmune", "slime", "latexTrap", "elite", "melee", "slimeRestraints", "meleeresist", "chainimmune", "electricweakness", "acidresist", "iceweakness"]), + squeeze: true, evasion: -0.3, followRange: 1, AI: "hunt", sneakThreshold: 1, + Animations: ["squishy"], + Sound: { + baseAmount: 0, + idleSoundName: "SlimeLarge", + }, + Resistance: { + profile: ["slime"], + }, + maxblock: 0, + maxdodge: 0, + nopickpocket: true, + dropTable: [{name: "SlimeRaw", amount: 5, weight: 10}], + visionRadius: 4.5, blindSight: 2.5, maxhp: 12, minLevel: 9, weight:2, movePoints: 3, attackPoints: 3, attack: "MeleeBind", + attackWidth: 3, attackRange: 1, power: 4, dmgType: "glue", fullBoundBonus: 2, disarm: 0.5, + terrainTags: {"slime": 1.5, "alchemist": 3, "slimeOptOut": -1, "slimePref": 1}, allFloors: true, shrines: ["Latex"], + ondeath: [{type: "summon", enemy: "SmallSlime", range: 2.5, count: 4, strict: true, lifetime: 50}], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 3, chance: 1.0, duration: 20}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Slime", time: 25, power: 2, chance: 0.3, aoe: 0.5} + ], + }, + {name: "LatexCube", faction: "Latex", color: "#aa00cc", + tags: KDMapInit(["ignoretiedup", "unstoppable", "slime", "latex", "latexTrap", "elite", "slashweakness", "disarmimmune", "melee", "chainimmune", "glueresist", "coldweakness", "electricresist", "pierceweakness", "latexRestraints", "latexEncaseRandom"]), + Animations: ["squishyAmbush"], + GFX: { + AmbushSprite: "LatexCubeHidden", + }, + RestraintFilter: { + unlimitedRestraints: true, + }, + Sound: { + baseAmount: 0, + moveAmount: 3, + idleSoundName: "SlimeLarge", + }, + Resistance: { + profile: ["slime"], + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + stamina: 3, + nonDirectional: true, + squeeze: true, evasion: -1, followRange: 1, AI: "ambush", sneakThreshold: 3, ambushRadius: 1.5, + visionRadius: 7.0, blindSight: 2.5, maxhp: 18, minLevel: 6, weight:1, movePoints: 4, attackPoints: 3, attack: "MeleeBind", attackWidth: 3, attackRange: 1, power: 4, dmgType: "glue", fullBoundBonus: 2, disarm: 0.7, + terrainTags: {"slime": 2.5, "plant": 2, "passage": 20, "open": -10, "slimeOptOut": -0.9, "slimePref": 1}, + allFloors: true, shrines: ["Latex"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "LatexThin", aoe: 1.5, power: 3, chance: 1.0, duration: 20}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "LatexThin", time: 25, power: 2, chance: 0.5, aoe: 0.5}, + ], + dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 1}, {name: "HardSlimeRaw", amount: 10, weight: 10}, {name: "StaffGlue", weight: 130, ignoreInInventory: true}], + }, + {name: "LatexCubeSmall", faction: "Latex", color: "#aa00cc", + tags: KDMapInit(["ignoretiedup", "unflinching", "slime", "latex", "latexTrap", "minor", "melee", "disarmimmune", "chainimmune", "glueresist", "coldweakness", "electricresist", "pierceweakness", "latexRestraints", "latexEncaseRandom"]), + Animations: ["squishyAmbush"], + GFX: { + AmbushSprite: "LatexCubeSmallHidden", + }, + stamina: 3, + nonDirectional: true, + RestraintFilter: { + unlimitedRestraints: true, + }, + Resistance: { + profile: ["slime"], + }, + nopickpocket: true, + Sound: { + baseAmount: 0, + moveAmount: 2, + idleSoundName: "SlimeLarge", + }, + difficulty: 0.3, + squeeze: true, evasion: -0.5, followRange: 1, AI: "ambush", sneakThreshold: 3, ambushRadius: 1.5, + visionRadius: 7.0, blindSight: 2.5, maxhp: 7, minLevel: 0, weight:1, movePoints: 2, attackPoints: 3, attack: "MeleeBindSuicide", attackWidth: 1, attackRange: 1, power: 2, dmgType: "glue", fullBoundBonus: 1, disarm: 0.2, + suicideOnAdd: true, focusPlayer: true, multiBind: 3, + terrainTags: {"slime": 3.5, "plant": 3, "passage": 30, "open": -10, "slimeOptOut": -1, "slimePref": 1}, allFloors: true, shrines: ["Latex"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "LatexThin", aoe: 1.5, power: 3, chance: 1.0, duration: 20}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "LatexThin", time: 25, power: 2, chance: 0.5, aoe: 0.5}, + ], + dropTable: [{name: "HardSlimeRaw", amount: 3, weight: 14}, {name: "StaffGlue", weight: 3, ignoreInInventory: true}], + }, + {name: "LiquidMetalCube", faction: "Latex", color: "#aa00cc", + tags: KDMapInit(["ignoretiedup", "unstoppable", "metal", "metalTrap", "minor", "melee", "disarmimmune", "construct", "nosignal", "poisonimmune", "soulimmune", "chainimmune", "glueresist", "acidweakness", "metallatexRestraints", "mithrilRestraints", "liquidMetalRestraintsRandom"]), + Animations: ["squishyAmbush"], + GFX: { + AmbushSprite: "SteelDoor", + }, + RestraintFilter: { + unlimitedRestraints: true, + }, + Sound: { + baseAmount: 0, + moveAmount: 5, + idleSoundName: "SlimeLarge", + }, + nopickpocket: true, + maxblock: 3, + maxdodge: 0, + nonDirectional: true, + squeeze: true, evasion: -10, followRange: 1, AI: "ambush", sneakThreshold: 3, ambushRadius: 1.5, armor: 3, + visionRadius: 7.0, blindSight: 2.5, maxhp: 18, minLevel: 9, weight:0.1, movePoints: 4, attackPoints: 4, attack: "MeleeBind", attackWidth: 3, attackRange: 1, power: 5, dmgType: "crush", fullBoundBonus: 2, disarm: 0.7, multiBind: 2, + terrainTags: {"metal": 2.5, "demon": 2, "magic": 2, "passage": 8, "open": -50, "slimeOptOut": -3, "slimePref": 0.1}, allFloors: true, shrines: ["Latex"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "LiquidMetal", aoe: 1.5, power: 3, chance: 1.0, duration: 6}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "LiquidMetal", time: 25, power: 2, chance: 0.5, aoe: 0.5}, + ], + dropTable: [{name: "LiquidMetalRaw", amount: 2, weight: 14}, {name: "StaffBind", weight: 4, ignoreInInventory: true}], + }, + {name: "LatexCubeMetal", faction: "Latex", color: "#aa00cc", + tags: KDMapInit(["ignoretiedup", "unstoppable", "metal", "metalTrap", "minor", "melee", "disarmimmune", "construct", "nosignal", + "bulwark", "poisonimmune", "soulimmune", "chainimmune", "glueresist", "acidweakness", "metallatexRestraints", "mithrilRestraints", "liquidMetalRestraintsRandom"]), + Animations: ["squishyAmbush"], + GFX: { + AmbushSprite: "LatexCubeSmallHidden", + }, + nonDirectional: true, + RestraintFilter: { + unlimitedRestraints: true, + }, + Sound: { + baseAmount: 0, + moveAmount: 4, + idleSoundName: "SlimeLarge", + }, + nopickpocket: true, + maxblock: 1, + maxdodge: 0, + difficulty: 0.4, + squeeze: true, evasion: -0.5, followRange: 1, AI: "ambush", sneakThreshold: 3, ambushRadius: 1.5, + visionRadius: 7.0, blindSight: 2.5, maxhp: 8, armor: 1.5, minLevel: 2, weight:0.1, movePoints: 2.4, attackPoints: 3, attack: "MeleeBindSuicide", attackWidth: 1, attackRange: 1, power: 2, dmgType: "crush", fullBoundBonus: 1, disarm: 0.35, + suicideOnAdd: true, focusPlayer: true, multiBind: 3, + terrainTags: {"metal": 3.5, "demon": 3, "magic": 3, "passage": 10, "open": -50, "slimeOptOut": -3, "slimePref": 0.1}, allFloors: true, shrines: ["Latex"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "LiquidMetal", aoe: 1.5, power: 3, chance: 1.0, duration: 6}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "StarryTrail", time: 25, power: 2, chance: 0.5, aoe: 0.5}, + ], + dropTable: [{name: "Nothing", weight: 10}, {name: "LiquidMetalRaw", amount: 10, weight: 10}, {name: "StaffChain", weight: 3, ignoreInInventory: true}, {name: "StaffBind", weight: 0.5, ignoreInInventory: true}], + }, + + {name: "Barricade", faction: "Door", + lowpriority: true, + nonDirectional: true, noFlip: true, + /*cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + },*/ + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + GFX: { + lighting: true, + }, + pathcondition: "barricade", + tags: KDMapInit(["obstacledoor", "scenery", "barricade", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", "temporary", + "soulimmune", "pierceresist", "electricresist", "crushweakness", "unarmedresist", "glueresist", "tickleresist", "groperesist", "painresist", "charmimmune", + ]), spellResist: 0, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, armor: 0, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, + visionRadius: 0, maxhp: 8, minLevel:0, weight:-1, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", + terrainTags: {"obstacle": 2, "obstacletile": 5, "increasingWeight":-0.5,}, allFloors: true, shrines: [], + events: [ + {trigger: "enemyMove", type: "damageOnMove", power: 1, mult: 0.25}, + ], + }, + + {name: "BarricadeVine", faction: "Plant", + lowpriority: true, + nonDirectional: true, noFlip: true, + /*cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + },*/ + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + GFX: { + lighting: true, + }, + tags: KDMapInit(["obstacledoor", "scenery", "barricade", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", "plant", "vine", "temporary", + "soulimmune", "slashweakness", "fireweakness", "crushresist", "tickleresist", "groperesist", "painresist", "charmimmune", + ]), spellResist: 0, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, armor: 0, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, regen: 0.05, + visionRadius: 0, maxhp: 12, minLevel:0, weight:-1, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "grope", + terrainTags: {"obstacle": 2, "obstacletile": 5, "increasingWeight":-0.5,}, allFloors: true, shrines: [], + events: [ + {trigger: "afterPlayerAttack", type: "spellReflect", spell: "Vineexp", time: 2}, + {trigger: "hit", type: "spellReflect", spell: "Vineexp", time: 2}, + ], + }, + + {name: "BarricadeConcrete", faction: "Door", + lowpriority: true, + nonDirectional: true, noFlip: true, + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + GFX: { + lighting: true, + }, + tags: KDMapInit(["obstacledoor", "scenery", "barricade", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", "temporary", + "soulimmune", "pierceresist", "electricresist", "crushweakness", "unarmedresist", "glueresist", "tickleresist", "groperesist", "painresist", "charmimmune", + ]), spellResist: 0, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, armor: 1, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, + visionRadius: 0, maxhp: 10, minLevel:0, weight:-1, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", + terrainTags: {"obstacle": 4, "obstacletile": 8, "increasingWeight":-1,}, allFloors: true, shrines: [], + events: [ + {trigger: "enemyMove", type: "damageOnMove", power: 1, mult: 0.25}, + ], + }, + + + {name: "BarricadeBlastDoor", faction: "Door", color: "#ff9944", + lowpriority: true, + nonDirectional: true, noFlip: true, + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + GFX: { + lighting: true, + }, + tags: KDMapInit(["obstacledoor", "scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", "temporary", + "soulimmune", "slashresist", "pierceresist", "electricimmune", "unarmedresist", "chainimmune", "glueresist", "tickleresist", "groperesist", "painresist", "charmimmune", + "bulwark", + ]), spellResist: 1.5, sneakthreshold: 0.6, immobile: true, + pathcondition: "blastdoor", + evasion: -9, ignorechance: 1.0, armor: 2, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, blockVision: true, + visionRadius: 0, maxhp: 11, minLevel:0, weight:-1, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", + terrainTags: {"obstacle": 4, "obstacletile": 14, "increasingWeight":-1,}, floors:KDMapInit(["bel"]), shrines: [], + events: [ + {trigger: "enemyMove", type: "removeIfRobot"}, + {trigger: "afterPlayerAttack", type: "tauntMsg", msg: "KDDoorAccessDenied", power: 3}, + ], + }, + + {name: "BarricadeMetal", faction: "Door", + lowpriority: true, + nonDirectional: true, noFlip: true, + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + GFX: { + lighting: true, + }, + Resistance: { + profile: ["construct"], + }, + tags: KDMapInit(["obstacledoor", "scenery", "barricade", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", "temporary", + "soulimmune", "electricimmune", "acidweakness", "meleeresist", "glueresist", "tickleresist", "groperesist", "painresist", "charmimmune", + ]), spellResist: 0, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, armor: 2, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, + visionRadius: 0, maxhp: 8, minLevel:0, weight:-1, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", + terrainTags: {"obstacle": 4, "obstacletile": 8, "increasingWeight":-1,}, allFloors: true, shrines: [], + events: [ + {trigger: "enemyMove", type: "damageOnMove", power: 1, mult: 0.25}, + ], + }, + {name: "BarricadeShadowMetal", faction: "Door", + lowpriority: true, + nonDirectional: true, noFlip: true, + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + GFX: { + lighting: true, + }, + Resistance: { + profile: ["construct"], + }, + ondeath: [{type: "spellOnSelf", spell: "ShadowGrasp"}], + tags: KDMapInit(["obstacledoor", "scenery", "barricade", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", "temporary", + "soulimmune", "electricimmune", "acidweakness", "meleeresist", "glueresist", "tickleimmune", "coldimmune", "gropeimmune", "painimmune", "charmimmune", + ]), spellResist: 1, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, armor: 1, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, + visionRadius: 0, maxhp: 10, minLevel:0, weight:-10, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", + terrainTags: {"obstacle": 4, "obstacletile": 8, "shadow":8,}, allFloors: true, shrines: [], + events: [ + {trigger: "enemyMove", type: "damageOnMove", power: 1, mult: 0.25}, + ], + }, + + {name: "BarricadeRobot", faction: "Door", + lowpriority: true, + nonDirectional: true, noFlip: true, + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + tags: KDMapInit(["obstacledoor", "scenery", "barricade", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", "temporary", + "soulimmune", "pierceresist", "electricresist", "crushweakness", "unarmedresist", "glueresist", "acidweakness", "soapweakness", "tickleresist", "groperesist", "painresist", "charmimmune", + "bulwark", + ]), spellResist: 1, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, armor: 1, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, + visionRadius: 0, maxhp: 10, minLevel:0, weight:-10, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", + terrainTags: {"obstacle": 4, "obstacletile": 8, "increasingWeight":-1,}, allFloors: true, shrines: [], + events: [ + {trigger: "enemyMove", type: "damageOnMove", power: 1, mult: 0.25}, + ], + }, + + {name: "BarricadeMagic", faction: "Door", + lowpriority: true, + nonDirectional: true, noFlip: true, + cueSfx: { + Block: "Shield", + Resist: "Shield", + Damage: "Shield", + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + Resistance: { + profile: ["construct"], + }, + tags: KDMapInit(["obstacledoor", "scenery", "barricade", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", "temporary", + "soulimmune", "pierceresist", "electricresist", "crushweakness", "unarmedresist", "glueresist", "tickleresist", "groperesist", "painresist", "charmimmune", + "bulwark", + ]), spellResist: 3, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, armor: 0, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, regen: 0.5, + visionRadius: 0, maxhp: 6, minLevel:0, weight:-10, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", + terrainTags: {"obstacle": 4, "obstacletile": 8, "increasingWeight":-1,}, allFloors: true, shrines: [], + events: [ + {trigger: "enemyMove", type: "damageOnMove", power: 1, mult: 0.25}, + {trigger: "afterEnemyTick", type: "requireNearbyEnemyTag", power: 0.6, dist: 5.5, tags: ["mage"]}, + ], + }, + + {name: "BarricadeShadow", faction: "Ghost", color: "#8800ff", + lowpriority: true, + nonDirectional: true, noFlip: true, + cueSfx: { + Block: "Shield", + Resist: "Shield", + Damage: "Shield", + }, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + tags: KDMapInit(["obstacledoor", "shadow", "barricade", "holyweakness", "scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "temporary", + "soulimmune", "meleeresist", "fireweakness", "glueresist", "coldimmune", "tickleresist", "groperesist", "painresist", "charmimmune", "shadowHands", "ghost", + ]), spellResist: 1, sneakthreshold: 0.6, + evasion: -1, ignorechance: 1.0, armor: 0, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, regen: 0.25, + visionRadius: 0, maxhp: 7, minLevel:0, weight:-15, movePoints: 99999, attackPoints: 4, attack: "MeleeBindWillSuicide", attackWidth: 8, attackRange: 1, power: 2, dmgType: "cold", + terrainTags: {"obstacle": 4, "obstacletile": 8, "shadow": 18}, allFloors: true, shrines: [], + events: [ + {trigger: "enemyMove", type: "damageOnMove", power: 1, mult: 0.25}, + ], + }, + + + {name: "BarricadeAir", faction: "Elemental", color: "#ffffff", + lowpriority: true, + nonDirectional: true, noFlip: true, + effect: { + effect: {name: "PushAway", damage: "stun", power: 1, dist: 1}, + }, + Sound: { + baseAmount: 4.5, + moveAmount: 0, + }, + Resistance: { + profile: ["construct"], + }, + tags: KDMapInit(["scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "air", "temporary", + "poisonimmune", "soulimmune", "meleeresist", "pierceimmune", "stunweakness", "glueweakness", "tickleresist", "groperesist", "painresist", "charmimmune", + ]), + spellResist: 0, armor: 0, + sneakthreshold: 0.6, + evasion: 1.5, ignorechance: 1.0, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, regen: 0.75, + visionRadius: 0, maxhp: 8, minLevel:0, weight:-10, movePoints: 99999, attackPoints: 4, attack: "MeleeEffect", attackWidth: 8, attackRange: 1, power: 2, dmgType: "stun", + terrainTags: {}, allFloors: false, shrines: ["Elements"], + events: [ + {trigger: "afterEnemyTick", type: "requireNearbyEnemyTag", power: 1.25, dist: 4.5, tags: ["air"]}, + ], + }, + {name: "BarricadeElectric", faction: "Elemental", color: "#e7cf1a", + lowpriority: true, + nonDirectional: true, noFlip: true, + effect: { + effect: {name: "Shock", damage: "electric", time: 2, power: 2.5}, + }, + Sound: { + baseAmount: 3, + moveAmount: 0, + }, + Resistance: { + profile: ["construct"], + }, + tags: KDMapInit(["scenery", "minor", "barricade", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "electric", "temporary", + "poisonimmune", "soulimmune", "electricresist", "crushweakness", "acidweakness", "soapweakness", "iceweakness", "glueweakness", "tickleresist", "groperesist", "painresist", "charmimmune", + ]), + spellResist: 0, armor: 2, + sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, followRange: 3.5, AI: "ambush", ambushRadius: 0, difficulty: -0.05, regen: 0.05, + visionRadius: 3.5, maxhp: 15, minLevel:0, weight:-10, movePoints: 99999, attackPoints: 4, attack: "MeleeEffect", attackWidth: 1.25, attackRange: 3.5, power: 2.5, dmgType: "electric", + terrainTags: {}, allFloors: false, shrines: ["Elements"], + events: [ + {trigger: "afterEnemyTick", type: "requireNearbyEnemyTag", power: 0.5, dist: 4.5, tags: ["electric"]}, + ], + }, + + + {name: "BarricadeFire", faction: "Elemental", color: "#e7cf1a", + lowpriority: true, + nonDirectional: true, noFlip: true, + Sound: { + baseAmount: 1, + moveAmount: 0, + }, + Resistance: { + profile: ["construct"], + }, + tags: KDMapInit(["scenery", "minor", "barricade", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "fire", "temporary", + "poisonimmune", "soulimmune", "fireimmune", "pierceresist", "soapsevereweakness", "iceweakness", "glueweakness", "tickleresist", "groperesist", "painresist", "charmimmune", + "bulwark", + ]), + spellResist: 1, armor: 2, + sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, followRange: 3.5, AI: "ambush", ambushRadius: 0, difficulty: -0.05, regen: 0.05, + visionRadius: 3.5, maxhp: 15, minLevel:0, weight:-10, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 1.25, attackRange: 1, power: 1, dmgType: "fire", + terrainTags: {}, allFloors: false, shrines: ["Elements"], + events: [ + {trigger: "afterEnemyTick", type: "requireNearbyEnemyTag", power: 0.5, dist: 5.5, tags: ["fire"]}, + {trigger: "afterPlayerAttack", type: "spellReflect", spell: "Fireexp", time: 1}, + {trigger: "hit", type: "spellReflect", spell: "Fireexp", time: 1}, + ], + }, + + + {name: "BarricadeEarth", faction: "Elemental", color: "#ff8933", + lowpriority: true, + nonDirectional: true, noFlip: true, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + Resistance: { + profile: ["construct"], + }, + tags: KDMapInit(["scenery", "minor", "barricade", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "earth", "temporary", + "poisonimmune", "soulimmune", "crushweakness", "meleeresist", "chainweakness", "stunweakness", "tickleresist", "groperesist", "painresist", "charmimmune", + "bulwark", + ]), + spellResist: 0, armor: 1, + sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, followRange: 2.5, AI: "ambush", ambushRadius: 0, difficulty: -0.05, regen: 0.05, + spells: ["GravityPullEarth"], spellCooldownMult: 1.3, spellCooldownMod: 0, stopToCast: true, castWhileMoving: true, selfCast: {GravityPullEarth: true}, + visionRadius: 2.5, maxhp: 12, minLevel:0, weight:-10, movePoints: 99999, attackPoints: 4, attack: "Spell", attackWidth: 8, attackRange: 1, power: 3, dmgType: "crush", + terrainTags: {}, allFloors: false, shrines: ["Elements"], + events: [ + {trigger: "afterEnemyTick", type: "requireNearbyEnemyTag", power: 0.5, dist: 4.5, tags: ["earth", "gravity"]}, + ], + }, + + {name: "BarricadeIce", faction: "Elemental", color: "#8899ff", + lowpriority: true, + nonDirectional: true, noFlip: true, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + Resistance: { + profile: ["construct"], + }, + tags: KDMapInit(["scenery", "minor", "barricade", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "ice", "temporary", + "poisonimmune", "soulimmune", "crushweakness", "iceimmune", "fireweakness", "stunweakness", "tickleresist", "groperesist", "painresist", "charmimmune", + "bulwark", + ]), + spellResist: 0, armor: 1, + sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, followRange: 2.5, AI: "ambush", ambushRadius: 0, difficulty: -0.05, regen: 0.05, + visionRadius: 2.5, maxhp: 12, minLevel:0, weight:-10, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 1, power: 3, dmgType: "ice", + terrainTags: {}, allFloors: false, shrines: ["Elements"], + events: [ + {trigger: "afterEnemyTick", type: "createIce", power: 1, chance: 1.0, aoe: 2.5}, + {trigger: "afterEnemyTick", type: "requireNearbyEnemyTag", power: 0.5, dist: 4.5, tags: ["ice"]}, + ], + }, + + {name: "BarricadeWater", faction: "Elemental", color: "#4fa4b8", + lowpriority: true, + nonDirectional: true, noFlip: true, + Sound: { + baseAmount: 0, + moveAmount: 0, + }, + Resistance: { + profile: ["construct"], + }, + tags: KDMapInit(["scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "water", "temporary", + "poisonweakness", "iceweakness", "soulimmune", "fireresist", "meleeresist", "pierceimmune", "soapimmune", "glueweakness", "tickleresist", "groperesist", "painresist", "charmimmune", + ]), + spellResist: 0, armor: 0, + sneakthreshold: 0.6, + evasion: 1.5, ignorechance: 1.0, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, regen: 2, + visionRadius: 0, maxhp: 5, minLevel:0, weight:-10, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 1, power: 2, dmgType: "stun", + terrainTags: {}, allFloors: false, shrines: ["Elements"], + events: [ + {trigger: "afterEnemyTick", type: "bubbleBarrier", power: 2, chance: 1.0, aoe: 1.5, always: true,}, + {trigger: "afterEnemyTick", type: "requireNearbyEnemyTag", power: 2.5, dist: 4.5, tags: ["water"]}, + ], + }, + + {name: "StoneDoor", faction: "Door", blockVision: true, + lowpriority: true, + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + pathcondition: "stonedoor", + Sound: { + baseAmount: 0, + }, + GFX: { + lighting: true, + }, + tags: KDMapInit(["obstacledoor", "scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", + "soulimmune", "slashresist", "electricresist", "crushweakness", "unarmedresist", "chainimmune", "glueresist", "soapresist", "tickleresist", "groperesist", "painresist", "charmimmune", + "bulwark", + ]), spellResist: 2, sneakthreshold: 0.6, + nonDirectional: true, + evasion: -9, ignorechance: 1.0, armor: 3, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, immobile: true, + visionRadius: 0, maxhp: 10, minLevel:0, weight:-4, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", + terrainTags: {"obstacle": 10, "obstacletile": 50}, allFloors: true, shrines: [], + events: [ + {trigger: "duringDamageEnemy", type: "damageThreshold", power: 1, chance: 1.0}, + ], + }, + {name: "SteelDoor", faction: "Door", blockVision: true, + nonDirectional: true, + lowpriority: true, + pathcondition: "stonedoor", + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + Sound: { + baseAmount: 0, + }, + GFX: { + lighting: true, + }, + tags: KDMapInit(["obstacledoor", "steeldoor", "scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", + "soulimmune", "slashresist", "pierceresist", "electricimmune", "unarmedresist", "chainimmune", "glueresist", "tickleresist", "groperesist", "painresist", "charmimmune", + "bulwark", + ]), spellResist: 3, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, armor: 5, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, immobile: true, + visionRadius: 0, maxhp: 15, minLevel:9, weight:-4, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", + terrainTags: {"obstacle": 10, "obstacletile": 30}, allFloors: true, shrines: [], + events: [ + {trigger: "duringDamageEnemy", type: "damageThreshold", power: 1, chance: 1.0}, + ], + }, + {name: "DollDoor", faction: "Door", blockVision: true, + nonDirectional: true, + lowpriority: true, + cueSfx: { + Block: "Clang", + Resist: "Clang", + Damage: "ArmorHit", + }, + Sound: { + baseAmount: 0, + }, + GFX: { + lighting: true, + }, + tags: KDMapInit(["dolldoor", "scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", + "soulimmune", "slashresist", "pierceresist", "electricimmune", "unarmedresist", "chainimmune", "glueresist", "tickleresist", "groperesist", "painresist", "charmimmune", + "bulwark", + ]), spellResist: 5, armor: 5, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, immobile: true, + visionRadius: 0, maxhp: 60, minLevel:0, weight:-100, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", + terrainTags: {dolldoor: 200}, allFloors: true, shrines: [], + events: [ + {trigger: "duringDamageEnemy", type: "damageThreshold", power: 1, chance: 1.0}, + ], + }, + + {name: "GiantMushroom", faction: "Natural", clusterWith: "mushroom", tags: KDMapInit(["mushroom", "nofidget", "scenery", "nonvulnerable", "minor", "inactive", "harmless", "immobile", "unstoppable", "soulimmune", "slashweakness", "fireweakness", "glueresist", "poisonimmune", "coldweakness"]), spellResist: 0.33, sneakthreshold: 0.6, + lowpriority: true, + nonDirectional: true, + evasion: -9, ignorechance: 1.0, armor: 0, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, + visionRadius: 0, maxhp: 1, minLevel:0, weight:5, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 1, dmgType: "souldrain", + terrainTags: {}, floors:KDMapInit(["cry", "jng"]), shrines: ["Will"], ondeath: [{type: "spellOnSelf", spell: "Spores"}], + Sound: { + baseAmount: 0.5, + }, + GFX: { + lighting: true, + }, + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0}, + ],}, + {name: "Toad", faction: "Beast", clusterWith: "beast", color: "#00FF44", tags: KDMapInit(["ignoreharmless", "beast", "soulresist", "ranged", "pierceweakness", "electricsevereweakness", "soapresist"]), followLeashedOnly: true, armor: 1, followRange: 1, AI: "hunt", + pullTowardSelf: true, pullDist: 3, master: {type: "GiantMushroom", range: 3}, projectileAttack: true, projectileTargeting: true, + evasion: -0.4, + visionRadius: 5, maxhp: 16, minLevel:0, weight:7, movePoints: 2, attackPoints: 3, attack: "MeleePullWill", attackRange: 5, attackWidth: 1, power: 2, strictAttackLOS: true, dmgType: "tickle", + terrainTags: {"increasingWeight":2, "secondhalf":3, }, floors:KDMapInit(["cry"]), dropTable: [{name: "Nothing", weight: 12}, {name: "WaterRune", weight: 3}]}, + {name: "Mushy", faction: "Mushy", clusterWith: "mushroom", color: "#4fa4b8", difficulty: 0.2, + tags: KDMapInit(["leashing", "mushroom", "soulresist", "mushy", "mushroomTrap", "melee", "minor", "slashweakness", "fireweakness", "glueresist", "poisonimmune", "coldweakness", "ropeMagicStrong", "ropeAuxiliary", "ropeRestraintsHogtie", "clothRestraints", "tapeRestraints"]), + Animations: ["squishy"], + squeeze: true, evasion: -0.5, followRange: 1, AI: "patrol", regen: 0.1, + visionRadius: 5, maxhp: 8, minLevel: 4, weight:14, movePoints: 4, attackPoints: 2, attack: "MeleeBindBlindWill", blindTime: 2, attackWidth: 3, attackRange: 1, power: 2, dmgType: "poisongas", fullBoundBonus: 2, + terrainTags: {"mushy": 10, "mushroomTrap": 50}, floors:KDMapInit(["cry"]), shrines: [], ondeath: [{type: "spellOnSelf", spell: "Spores"}], + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}], + attackLock: "White", + stamina: 4, + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0}, + ],}, + {name: "MushyHappy", clusterWith: "mushroom", color: "#4fa4b8", difficulty: 0.1, + tags: KDMapInit(["ignorenoSP", "mushroom", "soulresist", "mushy", "melee", "mushroomTrap", "minor", "slashweakness", "fireweakness", "glueresist", "poisonimmune", "coldweakness"]), + Animations: ["squishy"], + squeeze: true, evasion: -0.5, followRange: 1, AI: "hunt", regen: 0.1, + spells: ["SporesHappy"], spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, castWhileMoving: true, + visionRadius: 5, maxhp: 8, minLevel: 7, weight:14, movePoints: 4, attackPoints: 2, attack: "SpellMeleeWillBlind", blindTime: 2, attackWidth: 1, attackRange: 1, power: 4, dmgType: "tickle", hitsfx: "Tickle", + terrainTags: {"mushy": 10, "mushroomTrap": 50}, floors:KDMapInit(["cry"]), shrines: [], ondeath: [{type: "spellOnSelf", spell: "Spores"}], + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}], + stamina: 4, + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0}, + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff44aa"}, + ],}, + {name: "MushySick", clusterWith: "mushroom", color: "#4fa4b8", difficulty: 0.1, + tags: KDMapInit(["ignorenoSP", "mushroom", "soulresist", "mushy", "melee", "mushroomTrap", "minor", "slashweakness", "fireweakness", "glueresist", "poisonimmune", "coldweakness"]), + Animations: ["squishy"], + squeeze: true, evasion: -0.5, followRange: 1, AI: "hunt", + spells: ["SporesSick"], spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, castWhileMoving: true, + visionRadius: 5, maxhp: 8, minLevel: 0, weight:4, movePoints: 4, attackPoints: 2, attack: "SpellMeleeWillBlind", blindTime: 2, attackWidth: 1, attackRange: 1, power: 2, dmgType: "poisongas", + terrainTags: {"mushy": 17, "mushroomTrap": 75}, floors:KDMapInit(["cry", "cat"]), shrines: ["Will"], ondeath: [{type: "spellOnSelf", spell: "Spores"}], + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 1, chance: 1.0}, + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#4fd658"}, + ],}, + + {name: "DragonQueenPoison", color: "#9bd45d", + faction: "DragonQueen", + tags: KDMapInit(["opendoors", "noreinforce", "boss", "vineRestraints", "nokillescape", "dragonqueen", "unstoppable", + "bulwark", "slashweakness", "meleeresist", "fireresist", "poisonresist", "melee", "beast", "search", "nature"]), cohesion: 0.1, + GFX: { + spriteHeight: 144, + spriteWidth: 144, + }, + projectileTargeting: true, projectileAttack: true, + castWhileMoving: true, + + dontKiteWhenDisabled: true, + + wanderAISetting: "Dragon", + spawnAISetting: "Dragon", + + evasion: -1, disarm: 0.4, + stamina: 12, sprintspeed: 2.0, + preferBlock: true, maxdodge: 0, + maxblock: 1, + followLeashedOnly: true, ignorechance: 0, followRange: 1, AI: "hunt", guardChance: 0.0, kite: 1.5, + kiteChance: 0.5, // doesnt always kite-- usually turns around to use Breath + Sound: { + moveAmount: 12, + attackAmount: 20, + }, + Awareness: { + chaseradius: 25, + hearingMult: 2, + vision: 1.5, + senseSpeed: 1.1, + hearingRadius: 20, + }, + startBuffs: [ + { + id: "DragonQueenCritArmor", + power: 1, + type: "ToughArmor", + duration: 9999, infinite: true, + aura: "#ffffff", + currentCount: 0, maxCount: 3, tags: ["defense", "crit"], + } + ], + Resistance: { + block_magic: 3.0, + }, + effect: { + effect: {name: "VineSuspend"}, + }, + events: [ + {trigger: "beforeDamage", type: "dragonLairDefeat", power: 0, color: "#ff5277"}, + {trigger: "afterEnemyTick", type: "DragonRegen", power: 0.2}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Vines", time: 45, power: 2, chance: 0.5, aoe: 1.5}, + ], + spells: ["SummonDragonVinePlant", "PoisonBreath"], spellCooldownMult: 1, spellCooldownMod: -1, + visionRadius: 7, blindSight: 2.5, maxhp: 40, armor: 3, minLevel:12, weight:2.5, movePoints: 3, attackPoints: 2, attack: "SpellMeleeWillBindEffect", + attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 5, dmgType: "slash", + terrainTags: {"nature": 4, "lair": -100, "dragonqueen": 50}, shrines: ["Leather"], allFloors: true, // Adventurers don't appear in lairs + ondeath: [{type: "summon", enemy: "DragonGirlPoison", range: 0.5, count: 1, sameid: true, storeTrueForm: true, strict: false}], + Defeat: { + furnitureTags: [ + {tags: ["vineRestraints"], count: 12}, + {tags: ["vineSuspend"], count: 1}, + ], + }, + ignoreflag: ["dragonIgnore"], + creationScript: "DragonLair", + dropTable: [{name: "Gold", amountMin: 200, amountMax: 300, weight: 15}]}, + + {name: "DragonGirlPoison", nameList: "DragonGirl", outfit: "DragonGirlPoison", style: "DragonPoison", faction: "DragonQueen", clusterWith: "beast", + bound: "DragonPoison", color: "#8d3fab", + playLine: "DragonGirl", + tags: KDMapInit(["opendoors", "noreinforce", "poison", "nature", "dragongirl", "nokillescape", "human", "melee", "miniboss", "vineRestraints", "relentless", + "poisonresist", "fireresist", "chainweakness"]), cohesion: 0.75, + followLeashedOnly: true, ignorechance: 0, armor: 1.5, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonQueenPoison", range: 4, loose: true, aggressive: true}, + spells: ["SummonDragonFlower", "DragonSlash"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, spellRdy: true, + + effect: { + effect: {name: "VineSuspend"}, + }, + noKiteWhenHarmless: true, + dontKiteWhenDisabled: true, + kite: 2.5, + + wanderAISetting: "Dragon", + spawnAISetting: "Dragon", + + events: [ + {trigger: "beforeDamage", type: "dragonLairDefeat", power: 0, color: "#ff5277"}, + {trigger: "afterEnemyTick", type: "DragonRegen", power: 0.2}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Vines", time: 45, power: 2, chance: 0.2, aoe: 1.5}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Cracked", time: 1400, power: 2, chance: 0.02, aoe: 0.5}, + ], + visionRadius: 9, maxhp: 30, minLevel:0, weight:0, movePoints: 1.4, attackPoints: 3, attack: "SpellMeleeBindLockWillEffect", multiBind: 2, + stunTime: 1, attackWidth: 2.5, attackRange: 1, power: 4.5, dmgType: "slash", fullBoundBonus: 2, + terrainTags: {"nature": 7, "dragongirl": 50}, shrines: ["Leather", "Will"], floors: {}, + attackLock: "Purple", maxdodge: 0, + stamina: 7, + preferBlock: true, + ondeath: [{type: "DragonSeal"}], + Defeat: { + furnitureTags: [ + {tags: ["vineRestraints"], count: 12}, + {tags: ["vineSuspend"], count: 1}, + ], + }, + ignoreflag: ["dragonIgnore"], + creationScript: "DragonLair", + dropTable: [{name: "WaterRune", weight: 3}]}, + + {name: "DragonQueenCrystal", color: "#92e8c0", + faction: "DragonQueen", + tags: KDMapInit(["opendoors", "noreinforce", "boss", "dragonqueen", "nokillescape", "pierceweakness", "unstoppable", + "bulwark", "meleeresist", "electricresist", "fireresist", "melee", "beast", "search", "crystalline"]), cohesion: 0.1, + GFX: { + spriteHeight: 144, + spriteWidth: 144, + }, + specialCD: 20, specialAttack: "DashStun", specialRemove: "WillEffect", specialPower: 1, specialDamage: "soul", dashThrough: true, stunTime: 4, specialAttackPoints: 3, + specialRange: 12, projectileTargeting: true, projectileAttack: true, specialMinRange: 4, specialCDonAttack: true, specialWidth: 1.25, + castWhileMoving: true, + + + wanderAISetting: "Dragon", + spawnAISetting: "Dragon", + + evasion: -1, disarm: 0.4, + stamina: 12, sprintspeed: 2.0, + preferBlock: true, maxdodge: 0, + maxblock: 1, + followLeashedOnly: true, ignorechance: 0, followRange: 1, AI: "hunt", guardChance: 0.0, + Sound: { + moveAmount: 12, + attackAmount: 20, + }, + Awareness: { + chaseradius: 25, + hearingMult: 2, + vision: 1.5, + senseSpeed: 1.1, + hearingRadius: 20, + }, + Defeat: { + furnitureTags: [ + {tags: ["crystalCuffs"], count: 7}, + {tags: ["crystalEncase"], count: 1}, + ], + }, + ignoreflag: ["dragonIgnore"], + startBuffs: [ + { + id: "DragonQueenCritArmor", + power: 1, + type: "ToughArmor", + duration: 9999, infinite: true, + aura: "#ffffff", + currentCount: 0, maxCount: 3, tags: ["defense", "crit"], + } + ], + Resistance: { + block_magic: 3.0, + }, + effect: { + effect: {name: "CrystalEncase"}, + }, + events: [ + {trigger: "beforeDamage", type: "dragonLairDefeat", power: 0, color: "#ff5277"}, + {trigger: "afterEnemyTick", type: "DragonRegen", power: 0.2}, + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff44aa"}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Cracked", time: 1400, power: 2, chance: 0.02, aoe: 0.5}, + ], + spells: ["CrystalBolt", "CrystalSlash"], spellCooldownMult: 1, spellCooldownMod: -1, + visionRadius: 7, blindSight: 2.5, maxhp: 40, armor: 3, minLevel:12, weight:2.5, movePoints: 3, attackPoints: 2, attack: "SpellMeleeWillEffect", + attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 5, dmgType: "slash", + attackLock: "Crystal", + + terrainTags: {"crystalline": 4, "lair": -100, "dragonqueen": 50}, shrines: ["Leather"], allFloors: true, // Adventurers don't appear in lairs + ondeath: [{type: "summon", enemy: "DragonGirlCrystal", range: 0.5, sameid: true, storeTrueForm: true, count: 1, strict: false}], + creationScript: "DragonLair", + dropTable: [{name: "Gold", amountMin: 200, amountMax: 300, weight: 15}]}, + + {name: "DragonGirlCrystal", nameList: "DragonGirl", outfit: "DragonGirlCrystal", style: "DragonCrystal", faction: "DragonQueen", clusterWith: "beast", + bound: "DragonCrystal", color: "#ff5277", + playLine: "DragonGirl", + tags: KDMapInit(["opendoors", "noreinforce", "chaos", "crystal", "dragongirl", "nokillescape", "human", "melee", "miniboss", "crystalRestraints", "relentless", + "electricresist", "fireresist", "chainweakness"]), cohesion: 0.75, + followLeashedOnly: true, ignorechance: 0, armor: 1.5, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonQueenCrystal", range: 4, loose: true, aggressive: true}, + spells: ["CrystalShockBolt", "CrystalSlash", "CrystalBoltSingle"], spellCooldownMult: 1, spellCooldownMod: 2, castWhileMoving: true, spellRdy: true, + events: [ + {trigger: "beforeDamage", type: "dragonLairDefeat", power: 0, color: "#ff5277"}, + {trigger: "afterEnemyTick", type: "DragonRegen", power: 0.2}, + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff44aa"}, + ], + effect: { + effect: {name: "CrystalEncase"}, + }, + wanderAISetting: "Dragon", + spawnAISetting: "Dragon", + noKiteWhenHarmless: true, + dontKiteWhenDisabled: true, + kite: 2.5, + ondeath: [{type: "DragonSeal"}], + Defeat: { + furnitureTags: [ + {tags: ["crystalCuffs"], count: 3}, + {tags: ["crystalEncase"], count: 1}, + ], + }, + ignoreflag: ["dragonIgnore"], + visionRadius: 9, maxhp: 30, minLevel:0, weight:0, movePoints: 1.5, attackPoints: 2, attack: "SpellMeleeBindLockWillEffect", + stunTime: 1, attackWidth: 1, attackRange: 1, power: 4.5, dmgType: "crush", fullBoundBonus: 2, + terrainTags: {"magic": 7, "dragongirl": 50}, shrines: ["Leather", "Conjure"], floors: {}, + attackLock: "Crystal", maxdodge: 0, + stamina: 7, + preferBlock: true, + creationScript: "DragonLair", + dropTable: [{name: "EarthRune", weight: 3}]}, + + + {name: "DragonQueenShadow", color: "#92e8c0", + faction: "DragonQueen", + tags: KDMapInit(["opendoors", "noreinforce", "boss", "dragonqueen", "nokillescape", "chainweakness", + "bulwark", "unstoppable", "meleeresist", "coldresist", "fireresist", "melee", "beast", "search", "shadow", "shadowLatexRestraints"]), cohesion: 0.1, + GFX: { + spriteHeight: 144, + spriteWidth: 144, + }, + castWhileMoving: true, + + wanderAISetting: "Dragon", + spawnAISetting: "Dragon", + + RestraintFilter: { + unlimitedRestraints: true, + levelBonus: 3, + }, + + evasion: -0.5, disarm: 0.4, + stamina: 12, sprintspeed: 1.8, + maxdodge: 1, + followLeashedOnly: true, ignorechance: 0, followRange: 1, AI: "hunt", guardChance: 0.0, + Sound: { + moveAmount: 12, + attackAmount: 20, + }, + Awareness: { + chaseradius: 25, + hearingMult: 2, + vision: 1.5, + senseSpeed: 1.1, + hearingRadius: 20, + }, + Defeat: { + furnitureTags: [ + {tags: ["shadowLatexRestraints"], count: 5}, + {tags: ["shadowBall"], count: 1}, + ], + }, + ignoreflag: ["dragonIgnore"], + startBuffs: [ + { + id: "DragonQueenCritArmor", + power: 1, + type: "ToughArmor", + duration: 9999, infinite: true, + aura: "#ffffff", + currentCount: 0, maxCount: 3, tags: ["defense", "crit"], + } + ], + Resistance: { + block_magic: 3.0, + }, + effect: { + effect: {name: "ShadowEncase"}, + }, + events: [ + {trigger: "beforeDamage", type: "dragonLairDefeat", power: 0, color: "#ff5277"}, + {trigger: "afterEnemyTick", type: "DragonRegen", power: 0.2}, + {trigger: "afterEnemyTick", type: "ShadowBubbles", spell: "ShadowBubble", power: 1, count: 1, dist: 10, aoe: 6.5, time: 2}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Cracked", time: 1400, power: 2, chance: 0.02, aoe: 0.5}, + ], + spells: ["ShadowShroud", "ShadowShroudTele"], spellCooldownMult: 1, spellCooldownMod: 0, + visionRadius: 7, blindSight: 7.5, maxhp: 40, armor: 3, minLevel:12, weight:2.5, movePoints: 2, attackPoints: 2, attack: "MeleeWillEffectSpell", + attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 5, dmgType: "slash", + + terrainTags: {"shadow": 4, "lair": -100, "dragonqueen": 50}, shrines: ["Leather"], allFloors: true, // Adventurers don't appear in lairs + ondeath: [{type: "summon", enemy: "DragonGirlShadow", range: 0.5, sameid: true, storeTrueForm: true, count: 1, strict: false}], + creationScript: "DragonLair", + dropTable: [{name: "Gold", amountMin: 200, amountMax: 300, weight: 15}]}, + + {name: "DragonGirlShadow", nameList: "DragonGirl", outfit: "DragonGirlShadow", style: "DragonShadow", faction: "DragonQueen", clusterWith: "beast", + bound: "DragonShadow", color: "#999999", + playLine: "DragonGirl", + tags: KDMapInit(["opendoors", "noreinforce", "shadow", "dragongirl", "nokillescape", "human", "melee", "miniboss", "shadowLatexRestraints", "relentless", + "coldresist", "fireresist", "chainweakness"]), cohesion: 0.75, + followLeashedOnly: true, ignorechance: 0, armor: 0, spellResist: 2, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonQueenShadow", range: 4, loose: true, aggressive: true}, + spells: ["DarkTele", "ShadowShroudGirl",], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, spellRdy: true, + events: [ + {trigger: "beforeDamage", type: "dragonLairDefeat", power: 0, color: "#ff5277"}, + {trigger: "afterEnemyTick", type: "DragonRegen", power: 0.2}, + //{trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff44aa"}, + ], + effect: { + effect: {name: "ShadowEncase"}, + }, + Resistance: { + block_phys: 1, + }, + Defeat: { + furnitureTags: [ + {tags: ["shadowLatexRestraints"], count: 3}, + {tags: ["shadowBall"], count: 1}, + ], + }, + RestraintFilter: { + unlimitedRestraints: true, + levelBonus: 2, + }, + ignoreflag: ["dragonIgnore"], + wanderAISetting: "Dragon", + spawnAISetting: "Dragon", + noKiteWhenHarmless: true, + dontKiteWhenDisabled: true, + kite: 3.5, kiteChance: 0.25, + visionRadius: 9, blindSight: 6.5, maxhp: 30, minLevel:0, weight:0, movePoints: 1.3, attackPoints: 2, attack: "SpellMeleeBindLockWillEffect", + stunTime: 1, attackWidth: 3, attackRange: 1, power: 4.5, dmgType: "soul", fullBoundBonus: 2, + terrainTags: {"shadow": 7, "dragongirl": 50}, shrines: ["Leather", "Illusion"], floors: {}, + attackLock: "Purple", maxdodge: 0, + stamina: 6, + preferBlock: true, + ondeath: [{type: "DragonSeal"}], + creationScript: "DragonLair", + dropTable: [{name: "PotionInvisibility", weight: 3}]}, + + + + {name: "DragonQueenIce", color: "#92e8c0", + faction: "DragonQueen", + tags: KDMapInit(["opendoors", "noreinforce", "ice", "boss", "iceRestraints", "dragonqueen", "nokillescape", + "bulwark", "unstoppable", "crushweakness", "meleeresist", "soapresist", "fireresist", "iceresist", "melee", "beast", "search"]), cohesion: 0.1, + GFX: { + spriteHeight: 144, + spriteWidth: 144, + }, + projectileAttack: true, + castWhileMoving: true, + + dontKiteWhenDisabled: true, + + wanderAISetting: "Dragon", + spawnAISetting: "Dragon", + evasion: -1, disarm: 0.4, + stamina: 12, sprintspeed: 2.0, + preferBlock: true, maxdodge: 0, + maxblock: 1, + followLeashedOnly: true, ignorechance: 0, followRange: 1, AI: "hunt", guardChance: 0.0, kite: 1.5, + kiteChance: 0.5, // doesnt always kite-- usually turns around to use Breath + Sound: { + moveAmount: 12, + attackAmount: 20, + }, + Defeat: { + furnitureTags: [ + {tags: ["iceCuffs"], count: 7}, + {tags: ["iceEncase"], count: 1}, + ], + }, + ignoreflag: ["dragonIgnore"], + Awareness: { + chaseradius: 25, + hearingMult: 2, + vision: 1.5, + senseSpeed: 1.1, + hearingRadius: 20, + }, + startBuffs: [ + { + id: "DragonQueenCritArmor", + power: 1, + type: "ToughArmor", + duration: 9999, infinite: true, + aura: "#ffffff", + currentCount: 0, maxCount: 3, tags: ["defense", "crit"], + } + ], + Resistance: { + block_magic: 3.0, + }, + effect: { + effect: {name: "IceEncase"}, + }, + + Magic: { + priority: { + SummonIceWall: 9, + SummonIceWall2: 10, + }, + }, + spells: ["SummonIceWall", "SummonIceWall2", "IceBreathChannel", "DragonIceBolt"], spellCooldownMult: 1, spellCooldownMod: 0, + visionRadius: 7, blindSight: 2.5, maxhp: 40, armor: 3, minLevel:12, weight:2.5, movePoints: 4, attackPoints: 2, attack: "SpellMeleeWillBindEffect", + attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 5, dmgType: "crush", + events: [ + {trigger: "beforeDamage", type: "dragonLairDefeat", power: 0, color: "#ff5277"}, + {trigger: "afterEnemyTick", type: "createIce", power: 1, chance: 1.0, aoe: 1.0}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Cracked", time: 1400, power: 2, chance: 0.02, aoe: 0.5}, + ], + terrainTags: {"ice": 4, "lair": -100, "dragonqueen": 50}, shrines: ["Leather"], allFloors: true, // Adventurers don't appear in lairs + ondeath: [{type: "summon", enemy: "DragonGirlIce", range: 0.5, sameid: true, storeTrueForm: true, count: 1, strict: false}], + creationScript: "DragonLair", + dropTable: [{name: "Gold", amountMin: 200, amountMax: 300, weight: 15}]}, + + + {name: "DragonGirlIce", nameList: "DragonGirl", outfit: "DragonGirlIce", style: "DragonIce", faction: "DragonQueen", clusterWith: "beast", + bound: "DragonIce", color: "#92e8c0", + playLine: "DragonGirl", + tags: KDMapInit(["opendoors", "noreinforce", "water", "ice", "dragongirl", "nokillescape", "human", "melee", "miniboss", "iceRestraints", "relentless", + "soapresist", "fireresist", "chainweakness"]), cohesion: 0.75, + followLeashedOnly: true, ignorechance: 0, armor: 1.5, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonQueenCrystal", range: 4, loose: true, aggressive: true}, + spells: [ "IceBreathChannel", "DragonIceBolt", "EnemyWinterblast"], spellCooldownMult: 1, spellCooldownMod: 2, castWhileMoving: true, spellRdy: true, + + effect: { + effect: {name: "IceEncase"}, + }, + Magic: { + priority: { + EnemyWinterblast: 10, + }, + }, + Defeat: { + furnitureTags: [ + {tags: ["iceCuffs"], count: 3}, + {tags: ["iceEncase"], count: 1}, + ], + }, + ignoreflag: ["dragonIgnore"], + wanderAISetting: "Dragon", + spawnAISetting: "Dragon", + ondeath: [{type: "DragonSeal"}], + events: [ + {trigger: "beforeDamage", type: "dragonLairDefeat", power: 0, color: "#ff5277"}, + {trigger: "afterEnemyTick", type: "createIce", power: 1, chance: 0.5, aoe: 1.0}, + ], + noKiteWhenHarmless: true, + dontKiteWhenDisabled: true, + kite: 2.5, + visionRadius: 9, maxhp: 30, minLevel:0, weight:0, movePoints: 1.5, attackPoints: 2, attack: "SpellMeleeBindLockWillEffect", + stunTime: 1, attackWidth: 1, attackRange: 1, power: 4.5, dmgType: "crush", fullBoundBonus: 2, + terrainTags: {"ice": 7, "dragongirl": 50}, shrines: ["Leather", "Elements"], floors: {}, + attackLock: "Purple", maxdodge: 0, + stamina: 7, + preferBlock: true, + creationScript: "DragonLair", + dropTable: [{name: "IceRune", weight: 3}]}, + + + + + {name: "Dragon", nameList: "dragonheart", outfit: "Dragon", style: "Fire", faction: "Dragon", playLine: "Adventurer_Brat_Fighter", clusterWith: "dragon", bound: "Dragon", color: "#F92900", + tags: KDMapInit(["opendoors", "fire", "guardCall", "jailer", "leashing", "imprisonable", "minor", "dragon", "melee", "relentless","dragonRestraints", "handcuffer", "leatherRestraints", "fireresist", "jail", "jailer", "search"]), cohesion: 0.75, + followLeashedOnly: true, ignorechance: 0, armor: 1, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, difficulty: 0.5, + visionRadius: 6, maxhp: 9, minLevel:0, weight:-1, movePoints: 2, attackPoints: 2, attack: "MeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, maxLevel: 7, + terrainTags: {"secondhalf":2, "leatherAnger":3, "dragon": 30, "fire": 4}, shrines: ["Leather"], allFloors: true, + attackLock: "White", + preferBlock: true, maxdodge: 0, + stamina: 5, + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 15}]}, + {name: "DragonShield", nameList: "dragonheart", outfit: "DragonShield", style: "Fire", faction: "Dragon", clusterWith: "dragon", bound: "DragonShield", color: "#F92900", + tags: KDMapInit(["opendoors", "guardCall", "fire", "imprisonable", "leashing", "dragon", "melee", "dragonRestraints", "handcuffer", "relentless","leatherRestraints", "fireresist", "jail", "jailer", "search"]), + cohesion: 0.75, + stunTime: 2, specialCD: 6, specialAttack: "Stun", specialRemove: "BindLock", specialPower: 6, specialDamage: "pain", + spells: ["ArmorUpArea"], spellCooldownMult: 1, spellCooldownMod: 5, buffallies: true, + startBuffs: [ + { + id: "DragonShieldCritArmor", + power: 1, + type: "ToughArmor", + duration: 9999, infinite: true, + aura: "#ffffff", + currentCount: 0, maxCount: 1, tags: ["defense", "crit"], + } + ], + shield: 3, + preferBlock: true, maxdodge: 0, + followLeashedOnly: true, ignorechance: 0, armor: 1, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, + visionRadius: 7, maxhp: 9, minLevel:4, weight:-1, movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLock", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"secondhalf":1, "thirdhalf":1, "leatherAnger":3, "leatherRage":4, "dragon": 25, "fire": 4}, shrines: ["Leather"], allFloors: true, + attackLock: "White", + stamina: 5, + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 15}]}, + {name: "DragonIce", nameList: "dragonheart", outfit: "DragonIce", style: "Ice", faction: "Dragon", clusterWith: "dragon", bound: "DragonIce", color: "#aaaaff", + tags: KDMapInit(["opendoors", "ice", "leashing", "dragon", "melee", "elite", "dragonRestraints", "handcuffer", "leatherRestraints", "relentless","iceimmune", "fireweakness", "crushweakness", "jail", "jailer", "hunter"]), cohesion: 0.75, + followLeashedOnly: true, ignorechance: 0, armor: 2.0, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, + spells: ["IceDragonBreathPrepare"], spellCooldownMult: 1, spellCooldownMod: 3, spellRdy: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#00ffff"}, + ], + preferBlock: true, maxdodge: 0, + visionRadius: 7, maxhp: 14, minLevel:4, weight:-2, movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLockAll", attackWidth: 1, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 1, + attackLock: "Purple", + stamina: 5, + terrainTags: {"secondhalf":2, "thirdhalf":2, "dragon": 16, "ice": 4}, shrines: ["Leather", "Elements"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 12}, {name: "IceRune", weight: 3}, {name: "IceBreaker", weight: 0.1, ignoreInInventory: true}]}, + {name: "DragonPoison", nameList: "dragonheart", outfit: "DragonPoison", style: "GreenHair", faction: "Dragon", clusterWith: "dragon", bound: "DragonPoison", color: "#44ff77", + tags: KDMapInit(["opendoors", "nature", "leashing", "imprisonable", "dragon", "melee", "elite", "dragonRestraints", "handcuffer", "leatherRestraints", "unflinching", "fireresist", "jail", "jailer", "hunter"]), cohesion: 0.75, + followLeashedOnly: true, ignorechance: 0, armor: 0.5, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, + spells: ["PoisonDragonBlast", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: -1, tilesMinRange: 2, stopToCast: true, spellRdy: true, + visionRadius: 7, maxhp: 11, minLevel:6, weight:-2, movePoints: 3, attackPoints: 4, attack: "SpellMeleeStunWillLock", stunTime: 1, attackWidth: 3, attackRange: 2, power: 3, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {"secondhalf":2, "thirdhalf":2, "dragon": 16, "nature": 4}, shrines: ["Leather", "Will"], allFloors: true, + attackLock: "Purple", + stamina: 5, + preferBlock: true, maxdodge: 0, + dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 12}, {name: "Pick", weight: 4}, {name: "PotionStamina", weight: 3}]}, + {name: "DragonCrystal", nameList: "dragonheart", outfit: "DragonCrystal", style: "Water", faction: "Dragon", clusterWith: "dragon", bound: "DragonCrystal", color: "#ff00aa", + tags: KDMapInit(["opendoors", "chaos", "crystal", "leashing", "dragon", "melee", "elite", "dragonRestraints", "handcuffer", "leatherRestraints", "leatherRestraintsHeavy", "relentless", + "pierceweakness", "electricresist", "crushweakness", "fireresist", "jail", "jailer", "hunter"]), cohesion: 0.75, + followLeashedOnly: true, ignorechance: 0, armor: 1.5, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, + spells: ["SummonCrystals"], spellCooldownMult: 1, spellCooldownMod: 2, castWhileMoving: true, spellRdy: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff44aa"}, + ], + visionRadius: 7, maxhp: 10, minLevel:7, weight:-1, movePoints: 1.5, attackPoints: 2, attack: "SpellMeleeBindLockWill", stunTime: 1, attackWidth: 1, attackRange: 1, power: 3, dmgType: "crush", fullBoundBonus: 2, + terrainTags: {"secondhalf":1, "thirdhalf":2, "crystalline": 10, "dragon": 13}, shrines: ["Leather", "Conjure"], allFloors: true, + attackLock: "White", maxdodge: 0, + stamina: 5, + preferBlock: true, + dropTable: [{name: "Gold", amountMin: 20, amountMax: 30, weight: 15}, {name: "EarthRune", weight: 3}]}, + {name: "DragonShadow", nameList: "dragonheart", outfit: "DragonShadow", style: "Shadow", faction: "Dragon", clusterWith: "dragon", bound: "DragonShadow", color: "#4400ff", + tags: KDMapInit(["opendoors", "shadowclan", "shadow", "holyweakness", "chaos", "leashing", "dragon", "melee", "elite", "dragonRestraints", "handcuffer", "shadowRestraints", "relentless", "coldimmune", "fireresist", "jail", "jailer", "hunter"]), + cohesion: 0.75, + followLeashedOnly: true, ignorechance: 0, armor: 0.5, followRange: 1, AI: "hunt", guardChance: 0.6, master: {type: "DragonLeader", range: 4, loose: true, aggressive: true}, + spells: ["ShadowOrb"], spellCooldownMult: 1, spellCooldownMod: 0, pullTowardSelf: true, pullDist: 3, disarm: 0.4, + specialCD: 7, specialAttack: "Pull", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialsfx: "MagicSlash", + visionRadius: 7, maxhp: 15, minLevel:9, weight:-1, movePoints: 2, attackPoints: 2, attack: "SpellMeleeWillLock", stunTime: 3, attackWidth: 1, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {"secondhalf":1, "thirdhalf":2, "dragon": 13, "shadow": 4}, shrines: ["Leather", "Conjure"], allFloors: true, + attackLock: "Purple", maxdodge: 1, + stamina: 5, + preferBlock: true, + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Knife", ignoreInInventory: true, weight: 4}]}, + {name: "DragonLeader", nameList: "dragonheart", outfit: "DragonLeader", style: "Fire", faction: "Dragon", clusterWith: "dragon", bound: "DragonLeader", color: "#F92900", + tags: KDMapInit(["opendoors", "antiMagic", "fire", "leashing", "dragon", "melee", "boss", "dragonRestraints", "unflinching", "handcuffer", "leatherRestraints", "leatherRestraintsHeavy", "jailer", "fireimmune"]), + ignorechance: 0, armor: 1, followRange: 1, AI: "patrol", focusPlayer: true, + preferBlock: true, maxdodge: 2, + summon: [ + {enemy: "Dragon", range: 2, count: 2, chance: 0.4, strict: true}, + {enemy: "DragonIce", range: 3, count: 1, chance: 0.25, strict: true}, + {enemy: "DragonPoison", range: 3, count: 1, chance: 0.25, strict: true}, + {enemy: "DragonCrystal", range: 3, count: 1, chance: 0.25, strict: true}, + {enemy: "DragonShadow", range: 3, count: 1, chance: 0.25, strict: true},], + specialCD: 5, specialAttack: "Dash", specialRemove: "BindLockWill", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 3, specialMinRange: 1.5, specialsfx: "Miss", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ff5277"}, + ], + stamina: 8, + sprintspeed: 1.25, + visionRadius: 8, maxhp: 18, minLevel:4, weight:-11, movePoints: 2, attackPoints: 2, attack: "MeleeBindLockWill", attackWidth: 1, attackRange: 1, power: 4, dmgType: "crush", fullBoundBonus: 2, + terrainTags: {"secondhalf":2, "thirdhalf":4, "open": 10, "fire": 4, "leatherAnger":6, "leatherRage":30, "boss": -55, "increasingWeight":0.5, "dragon": 5}, shrines: ["Leather"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 30, amountMax: 40, weight: 10}, {name: "Sword", ignoreInInventory: true, weight: 100}, {name: "EnchKnife", ignoreInInventory: true, weight: 1}]}, + + {name: "Adventurer_Brat_Fighter", nameList: "dragonheart", outfit: "AdventurerBrat", style: "GreenHair", clusterWith: "adventurer", bound: "Adventurer_Brat", color: "#ffffff", + playLine: "Adventurer_Brat_Fighter", + tags: KDMapInit(["opendoors", "elite", "imprisonable", "leashing", "adventurer", "human", "melee", "ropeRestraints", "ropeRestraintsHogtie", "charmweakness", "jail", "jailer", "brat", "search", + "bulwark"]), cohesion: 0.9, + stunTime: 2, specialCD: 5, specialAttack: "Stun", specialRemove: "BindLock", specialPower: 6, specialDamage: "pain", + evasion: -0.5, + preferBlock: true, maxdodge: 1, + spells: ["RopeEngulfWeak", "WitchRope"], spellCooldownMult: 2, spellCooldownMod: 1, buffallies: true, + followLeashedOnly: true, ignorechance: 0, armor: 3, followRange: 1, AI: "hunt", guardChance: 0.0, + visionRadius: 8, maxhp: 20, minLevel:2, weight:1, movePoints: 2.0, attackPoints: 2, attack: "SpellMeleeWillBindLock", + attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 3, dmgType: "pain", fullBoundBonus: 1, + stamina: 5, + block: 0.1, + events: [ + {trigger: "tick", type: "AdventurerAssignFaction", dist: 4.0, tags: ["Adventurer", "Bandit", "Nevermere", "Bountyhunter", "Dragon"]}, + ], + terrainTags: {"adventurer": 10, "lair": -10, "brat": 50}, shrines: ["Rope"], allFloors: true, // Adventurers don't appear in lairs + dropTable: [{name: "Gold", amountMin: 20, amountMax: 40, weight: 15}, {name: "Axe", ignoreInInventory: true, weight: 100}, {name: "MagicAxe", ignoreInInventory: true, weight: 1}, {name: "Breastplate", ignoreInInventory: true, weight: 200}]}, + + {name: "Adventurer_Dom_Fighter", nameList: "dragonheart", outfit: "AdventurerDom", style: "BlackCatGirl", clusterWith: "adventurer", bound: "Adventurer_Dom", color: "#ffffff", + playLine: "Adventurer_Dom_Fighter", + Resistance: { + profile: ["catgirl"], + }, + preferDodge: true, maxdodge: 3, maxblock: 2, + tags: KDMapInit(["opendoors", "elite", "imprisonable", "leashing", "adventurer", "human", "melee", "latexRestraints", "soulweakness", "jail", "jailer", "dom", "search"]), cohesion: 0.9, + stunTime: 2, specialCD: 7, specialAttack: "Dash", specialRemove: "WillBindLock", specialPower: 6, specialDamage: "pain", + specialAttackPoints: 1, specialRange: 3.5, specialMinRange: 2.4, specialsfx: "Miss", castWhileMoving: true, dashThruWalls: true, dashThrough: true, + bindOnDisable: true, + smartBind: true, + block: 0.15, + evasion: 0.4, disarm: 0.4, + followLeashedOnly: true, ignorechance: 0, armor: 1.5, followRange: 1, AI: "hunt", guardChance: 0.0, + visionRadius: 8, maxhp: 17, minLevel:5, weight:1, movePoints: 1.4, attackPoints: 2, attack: "MeleeWillBindLock", + attackWidth: 1, attackRange: 2.5, tilesMinRange: 1, power: 2, dmgType: "pain", fullBoundBonus: 2, + stamina: 7, + events: [ + {trigger: "tick", type: "AdventurerAssignFaction", dist: 4.0, tags: ["Adventurer", "Bandit", "Maidforce", "Bountyhunter", "Bast"]}, + ], + terrainTags: {"adventurer": 10, "lair": -10, "dom": 50}, shrines: ["Latex"], allFloors: true, // Adventurers don't appear in lairs + dropTable: [{name: "Gold", amountMin: 20, amountMax: 40, weight: 15}, {name: "Foil", ignoreInInventory: true, weight: 100}, {name: "Rapier", ignoreInInventory: true, weight: 100}, {name: "Dirk", ignoreInInventory: true, weight: 100}, {name: "Bracers", ignoreInInventory: true, weight: 200}]}, + + {name: "Adventurer_Switch_Fighter", nameList: "dragonheart", outfit: "AdventurerSwitch", style: "WhiteHair", clusterWith: "adventurer", bound: "Adventurer_Switch", color: "#ffffff", + playLine: "Adventurer_Switch_Fighter", + armor: 1.0, + tags: KDMapInit(["opendoors", "elite", "imprisonable", "leashing", "adventurer", "human", "melee", "mithrilRestraints", "gropeweakness", "jail", "jailer", "switch", "search"]), cohesion: 0.9, + specialCD: 6, specialAttack: "Bind", specialRemove: "Lock", specialCDonAttack: true, strictAttackLOS: true, specialDamage: "chain", + specialRange: 4, projectileTargeting: true, specialWidth: 1, ignoreStaminaForBinds: true, + projectileAttack: true, + evasion: 0.2, kite: 1.5, + spells: ["ArmorUpArea"], spellCooldownMult: 2, spellCooldownMod: 1, buffallies: true, + followLeashedOnly: true, ignorechance: 0, spellResist: 1.5, followRange: 2.5, AI: "hunt", guardChance: 0.0, + visionRadius: 8, maxhp: 15, minLevel:3, weight:1, movePoints: 2.4, attackPoints: 3, attack: "SpellMeleeWillBindLock", + attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 3, dmgType: "chain", fullBoundBonus: 1, + stamina: 3, + preferDodge: true, maxblock: 0, + events: [ + {trigger: "tick", type: "AdventurerAssignFaction", dist: 4.0, tags: ["Adventurer", "Bandit", "Nevermere", "Bountyhunter", "Alchemist"]}, + ], + terrainTags: {"adventurer": 10, "lair": -10, "switch": 50}, shrines: ["Metal"], allFloors: true, // Adventurers don't appear in lairs + dropTable: [{name: "Gold", amountMin: 20, amountMax: 40, weight: 15}, {name: "ManaOrb", weight: 30}, {name: "PotionStamina", weight: 10}, {name: "LeatherBoots", ignoreInInventory: true, weight: 200}]}, + + {name: "Adventurer_Sub_Fighter", nameList: "elf", outfit: "AdventurerSub", style: "DarkElf", clusterWith: "adventurer", bound: "Adventurer_Sub", color: "#ffffff", + playLine: "Adventurer_Sub_Fighter", + tags: KDMapInit(["opendoors", "elite", "imprisonable", "leashing", "adventurer", "human", "melee", "leatherRestraints", "leatherRestraintsHeavy", "painweakness", "jail", "jailer", "sub", "search"]), cohesion: 0.9, + stunTime: 2, specialCD: 10, specialAttack: "StunDash", specialRemove: "WillBindLock", specialPower: 6, specialDamage: "cold", + specialAttackPoints: 3, specialRange: 6, + evasion: -0.1, disarm: 0.2, + stamina: 4, + preferBlock: true, maxdodge: 1, + spells: ["ShadowOrb"], spellCooldownMult: 2, spellCooldownMod: 1, + followLeashedOnly: true, ignorechance: 0, spellResist: 2.0, followRange: 1, AI: "hunt", guardChance: 0.0, + visionRadius: 8, maxhp: 30, minLevel:6, weight:1, movePoints: 1.8, attackPoints: 2, attack: "SpellMeleeWillBindLock", + attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 1, + events: [ + {trigger: "tick", type: "AdventurerAssignFaction", dist: 4.0, tags: ["Adventurer", "Bandit", "Nevermere", "Bountyhunter", "Elf"]}, + ], + terrainTags: {"adventurer": 10, "lair": -10, "sub": 50}, shrines: ["Leather"], allFloors: true, // Adventurers don't appear in lairs + dropTable: [{name: "Gold", amountMin: 20, amountMax: 40, weight: 15}, {name: "Spear", ignoreInInventory: true, weight: 100}, {name: "MagicSpear", ignoreInInventory: true, weight: 1}, {name: "ElfCrystal", weight: 5}]}, + + {name: "ElementalFire", nameList: "elemental", outfit: "ElementalFire", style: "FireElemental", faction: "Elemental", playLine: "Elemental", clusterWith: "fire", bound: "ElementalFire", color: "#FF6200", tags: KDMapInit(["opendoors", "flying", "imprisonable", "nowet", "fire", "guardCall", "elemental", "fireimmune", "ranged", "coldweakness", "icesevereweakness", "obsidianRestraints", "shackleRestraints", "leashing", "jail", "jailer", "search"]), + armor: 0.5, kite: 1.5, followRange: 3, AI: "hunt", + spells: ["HeatBolt"], spellCooldownMult: 1, spellCooldownMod: 1, followLeashedOnly: true, stopToCast: true, spellRdy: true, projectileTargeting: true, + visionRadius: 7, maxhp: 8, minLevel:0, weight:-1, movePoints: 1.5, attackPoints: 3, attack: "SpellMeleeWillBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "pain", fullBoundBonus: 2, + terrainTags: {"secondhalf":2, "thirdhalf":1, "open": 1, "elementsAnger": 12, "elementsRage": 6, "temple": 5, "elemental": 6}, allFloors: true, shrines: ["Elements", "Metal"], + attackLock: "White", + RestraintFilter: { + bonusRestraints: 1, + requiredItems: ["ObsidianArmCuffs"], + }, + maxblock: 0, + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}, {name: "Gunpowder", weight: 1}], + events: [ + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Ember", time: 5, power: 2, chance: 0.2, aoe: 1.5}, + {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff8933"}], + }, + /*{name: "KeeperFire", faction: "Elemental", playLine: "Elemental", clusterWith: "fire", bound: "ElementalFire", color: "#FF6200", + tags: KDMapInit(["opendoors", "miniboss", + "imprisonable", "fire", "guardCall", "elemental", "fireimmune", "ranged", "coldweakness", "icesevereweakness", "obsidianRestraints", "shackleRestraints", "leashing", "jail", "jailer", "search"]), + armor: 0.5, kite: 1.5, followRange: 3, AI: "hunt", + spells: ["FlameDash"], spellCooldownMult: 1, spellCooldownMod: 0, followLeashedOnly: true, stopToCast: true, spellRdy: true, projectileTargeting: true, + visionRadius: 6.5, maxhp: 8, minLevel:0, weight:-1, movePoints: 1.5, attackPoints: 2, attack: "SpellMeleeWillBindLockEffect", attackWidth: 1.5, attackRange: 1, power: 2, dmgType: "pain", fullBoundBonus: 2, + terrainTags: {"secondhalf":2, "thirdhalf":1, "open": 1, "elementsAnger": 12, "elementsRage": 6, "temple": 5, "elemental": 6}, allFloors: true, shrines: ["Elements", "Metal"], + attackLock: "Purple", + RestraintFilter: { + bonusRestraints: 1, + requiredItems: ["ObsidianArmCuffs", "ObsidianAnkleCuffs", "ObsidianLegCuffs"], + }, + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Gunpowder", amount: 3, weight: 5}], + events: [ + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Ember", time: 3, power: 2, chance: 0.2, aoe: 1.5}, + {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff8933"}, + {trigger: "hit", type: "castSpell", time: 3, spell: "FlameKeeperBlade", color: "#ff8933"}, + {trigger: "miss", type: "castSpell", time: 3, spell: "FlameKeeperBlade", color: "#ff8933"}, + ], + },*/ + + //region MaidKnight + + {name: "MaidKnightHeavy", nameList: "MaidKnightHeavy", + outfit: "MaidKnightHeavy", style: "MaidKnightHeavy", + clusterWith: "adventurer", + bound: "MaidKnightHeavy", + color: "#ffffff", + faction: "Adventurer", + playLine: "Adventurer_Dom_Fighter", + preferDodge: true, maxdodge: 1, maxblock: 2, + tags: KDMapInit(["opendoors", "elite", "imprisonable", + "leashing", "adventurer", "human", "melee", + "leatherRestraintsHeavy", "maidRestraints", + "soulweakness", "jail", "jailer", "dom", "search"]), + cohesion: 0.5, + bindOnDisable: true, + smartBind: true, + block: 0.2, + spells: ["HeavySlash", "SelfCharge"], spellCooldownMult: 1, spellCooldownMod: 0, + evasion: 0.25, disarm: 0.35, + followLeashedOnly: true, ignorechance: 0, armor: 2.5, followRange: 1, AI: "hunt", guardChance: 0.0, + visionRadius: 11, maxhp: 50, minLevel:0, weight: -100, movePoints: 1.4, attackPoints: 2, attack: "SpellMeleeWillBindLock", + attackWidth: 2.5, attackRange: 1.5, power: 3, dmgType: "tickle", fullBoundBonus: 3, + stamina: 7, + events: [ + {trigger: "enemyCast", type: "DelayedJump"}, + {trigger: "tickAfter", type: "WeaponEquip"}, + {trigger: "enemyKnockdown", type: "MaidKnights"}, + {trigger: "kill", type: "MaidKnights"}, + {trigger: "getCustomDefeat", type: "MaidKnights"}, + ], + Defeat: { + specificRestraints: [ + {name: "MaidDress", minlevel: 0}, + {name: "MaidGag", minlevel: 4}, + {name: "MaidMuzzle", minlevel: 8}, + {name: "TrapBoots", minlevel: 2}, + {name: "TrapHarness", minlevel: 6}, + ], + }, + specialScript: "MaidKnightAndSquire", + wanderAISetting: "Targeted", + terrainTags: {}, shrines: ["Leather"], floors: {}, // Adventurers don't appear in lairs + dropTable: [{name: "Gold", amountMin: 699, amountMax: 799, weight: 10}, + {name: "Sweeper", weight: 100, ignoreInInventory: true},]}, + + {name: "MaidKnightLight", nameList: "MaidKnightLight", + outfit: "MaidKnightLight", style: "MaidKnightLight", + clusterWith: "adventurer", + bound: "MaidKnightLight", color: "#ffffff", + faction: "Adventurer", + playLine: "Adventurer_Sub_Fighter", + tags: KDMapInit(["opendoors", "elite", "imprisonable", "leashing", "adventurer", "human", + "melee", "leatherRestraints", "trap", "painweakness", "jail", "jailer", "sub", "search"]), + cohesion: 0.9, stunTime: 2, + evasion: -0.1, + stamina: 4, + preferBlock: true, maxdodge: 1, + castWhileMoving: true, + Defeat: { + specificRestraints: [ + {name: "MaidDress", minlevel: 0}, + {name: "MaidGag", minlevel: 4, maxlevel: 12}, + {name: "MaidGag", minlevel: 12, applyVariant: "AntiMagic"}, + {name: "MaidMuzzle", minlevel: 8}, + {name: "TrapBoots", minlevel: 2}, + {name: "TrapHarness", minlevel: 6}, + ], + }, + events: [ + {trigger: "tickAfter", type: "WeaponEquip"}, + {trigger: "enemyKnockdown", type: "MaidKnights"}, + {trigger: "kill", type: "MaidKnights"}, + {trigger: "tickAfter", type: "MaidKnightFollow"}, + {trigger: "getCustomDefeat", type: "MaidKnights"}, + + ], + specialScript: "MaidKnightAndSquire", + wanderAISetting: "Targeted", + spells: ["Aim_MaidKnightLight"], spellCooldownMult: 1, spellCooldownMod: 0, + followLeashedOnly: true, ignorechance: 0, armor: 0.8, followRange: 1, AI: "hunt", guardChance: 0.0, + visionRadius: 11, maxhp: 40, minLevel:0, weight: -100, movePoints: 1.5, attackPoints: 2, attack: "SpellMeleeWillBindLock", + attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 2.5, dmgType: "tickle", fullBoundBonus: 1.5, + terrainTags: {}, shrines: ["Leather"], floors: {}, // Adventurers don't appear in lairs + dropTable: [{name: "Gold", amountMin: 399, amountMax: 499, weight: 10}, + {name: "Persuader", weight: 100, ignoreInInventory: true},]}, + + + // endregion + + + + {name: "ElementalIce", nameList: "elemental", outfit: "ElementalIce", style: "IceElemental", faction: "Elemental", playLine: "Elemental", clusterWith: "ice", bound: "ElementalIce", color: "#aaaaff", tags: KDMapInit(["opendoors", "flying", "antiMagic", "imprisonable", "elemental", "guardCall", "ice", "ranged", "firesevereweakness", "crushweakness", "coldresist", "iceimmune", "iceRestraints", "leashing", "jail", "jailer", "search"]), + armor: 1.5, kite: 1.5, followRange: 3, AI: "hunt", + spells: ["IceSlowPrepare"], spellCooldownMult: 1, spellCooldownMod: 1, followLeashedOnly: true, noSpellLeashing: true, spellRdy: true, projectileTargeting: true, + visionRadius: 7, maxhp: 8, minLevel:3, weight:-2, movePoints: 1.5, attackPoints: 3, attack: "SpellMeleeWillBindLockAll", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, multiBind: 2, + terrainTags: {"secondhalf":1, "thirdhalf":1, "open": 1, "elementsAnger": 8, "elementsRage": 3, "temple": 6, "elemental": 6, "ice": 4}, allFloors: true, shrines: ["Elements"], attackLock: "Purple", + RestraintFilter: { + unlimitedRestraints: true, + }, + maxblock: 2, + maxdodge: 0, + events: [ + {trigger: "afterEnemyTick", type: "createIce", power: 1, chance: 1.0, aoe: 1.0}, + {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#00ffff"}, + ], + dropTable: [{name: "Gold", amountMin: 5, amountMax: 10, weight: 10}, {name: "IceRune", weight: 1}, {name: "IceBreaker", weight: 1, ignoreInInventory: true}]}, + {name: "ElementalWater", nameList: "elemental", outfit: "ElementalWater", style: "WaterElemental", faction: "Elemental", playLine: "Elemental", clusterWith: "ice", bound: "ElementalWater", color: "#57ff88", tags: KDMapInit(["opendoors", "flying", "antiMagic", "water", "elemental", "ranged", "fireresist", "soapimmune", "acidresist", "electricsevereweakness", "latexRestraints", "ropeRestraints", "elite", "leashing", "jail", "jailer", "hunter"]), + armor: 0, kite: 1.5, followRange: 3, AI: "hunt", guardChance: 0.6, evasion: 0.25, summon: [{enemy: "ElementalIce", range: 2.5, count: 1, chance: 0.6, strict: true}], + specialCD: 5, specialAttack: "PullWill", specialCDonAttack: true, specialAttackPoints: 4, specialRange: 4, specialWidth: 3, specialMinRange: 1.5, specialsfx: "Song", hitsfx: "Song", tilesMinRangeSpecial: 2, + visionRadius: 7, maxhp: 12, minLevel:3, weight:-2, movePoints: 1.5, followLeashedOnly: true, projectileTargeting: true, + attackPoints: 3, attack: "MeleeBindLockAll", attackWidth: 3, attackRange: 1, power: 5, dmgType: "charm", pullTowardSelf: true, pullDist: 2, pullMsg: true, + attackLock: "Purple", + stamina: 5, + maxblock: 0, + maxdodge: 2, + RestraintFilter: { + bonusRestraints: 1, + requiredItems: ["LatexArmbinder", "LatexStraitjacket", "LatexBoxbinder"], + }, + terrainTags: {"secondhalf":1, "thirdhalf":1, "open": 1, "elementsAnger": 8, "elementsRage": 3, "illusionAnger": 2, "latexAnger": 2, "temple": 5, "elemental": 4, "water": 4}, allFloors: true, shrines: ["Elements"], + events: [{trigger: "afterEnemyTick", type: "createWater", power: 2, chance: 1.0, aoe: 0.5}], + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "WaterRune", weight: 2}]}, + {name: "ElementalEarth", nameList: "elemental", outfit: "ElementalEarth", style: "EarthElemental", faction: "Elemental", playLine: "Elemental", clusterWith: "elemental", bound: "ElementalEarth", color: "#C1703A", + tags: KDMapInit(["opendoors", "flying", "imprisonable", "elemental", "fireresist", "melee", "nofreeze", "earth", "miniboss", "electricimmune", "guardCall", "unflinching", "iceweakness", "unarmedresist", "slashresist", "pierceresist", "obsidianRestraints", "shackleRestraints", "leashing", "magicresist", "jail", "jailer", "hunter"]), + armor: 2.0, followRange: 1, AI: "hunt", + earthmove: true, + blindSight: 2.5, + specialCD: 15, specialAttack: "Dash", specialRemove: "BindWill", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4, specialMinRange: 1.5, specialsfx: "Miss", castWhileMoving: true, dashThruWalls: true, + spells: ["ArmorUp", "Earthfield",], spellCooldownMult: 1, spellCooldownMod: 14, followLeashedOnly: true, spellRdy: true, + attackLock: "White", + stamina: 4, + maxblock: 2, + maxdodge: 0, + RestraintFilter: { + bonusRestraints: 2, + requiredItems: ["LatexArmbinder", "LatexStraitjacket", "LatexBoxbinder"], + }, + visionRadius: 7, maxhp: 16, minLevel:4, weight:-2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLockWill", attackWidth: 3, attackRange: 1, power: 2, dmgType: "plush", fullBoundBonus: 2, + terrainTags: {"secondhalf":1, "thirdhalf":2, "elementsAnger": 12, "elementsRage": 6, "temple": 6, "elemental": 4, "earth": 4}, allFloors: true, shrines: ["Elements", "Metal"], + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "EarthRune", weight: 3}], + events: [{trigger: "afterEnemyTick", type: "createEffectTile", kind: "Cracked", time: 10, power: 2, chance: 0.3, aoe: 0.5}], + }, + {name: "KeeperEarth", nameList: "elemental", outfit: "KeeperEarth", style: "EarthElemental", faction: "Elemental", playLine: "Elemental", clusterWith: "elemental", bound: "ElementalEarth", color: "#C1703A", + tags: KDMapInit(["opendoors", "flying", "imprisonable", "elemental", "fireresist", "melee", "nofreeze", "earth", "elite", "electricimmune", "guardCall", "unflinching", "iceweakness", "unarmedresist", "slashresist", "pierceresist", "obsidianRestraints", "shackleRestraints", "leashing", "magicresist", "jail", "jailer", "hunter"]), + armor: 2.0, followRange: 3.5, AI: "hunt", + earthmove: true, + blindSight: 2.5, + effect: { + effect: {name: "PushAway", damage: "crush", power: 1, dist: 2, msg: "KDKeeperKick"}, + }, + castWhileMoving: true, dontKiteWhenDisabled: true, + specialCD: 15, specialAttack: "SlowEffect", specialRemove: "Bind", specialCDonAttack: true, specialWidth: 3, specialAttackPoints: 2, specialsfx: "HeavySwing", + spells: ["WitchBoulder", "GravityPullEarth", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, specialDamage: "crush", spellCooldownMult: 1, spellCooldownMod: 0, followLeashedOnly: true, + attackLock: "White", + stamina: 4, + maxblock: 2, + maxdodge: 0, + RestraintFilter: { + bonusRestraints: 2, + requiredItems: ["LatexArmbinder", "LatexStraitjacket", "LatexBoxbinder"], + }, + visionRadius: 8, kite: 1.5, maxhp: 8, shield: 2, minLevel:5, weight:-1, movePoints: 2.4, attackPoints: 3, attack: "SpellMeleeBindLockWill", attackWidth: 1.5, attackRange: 1, power: 2, dmgType: "plush", fullBoundBonus: 2, + terrainTags: {"secondhalf":4, "thirdhalf":2, "elementsAnger": 8, "elementsRage": 9, "temple": 5, "elemental": 2, "earth": 3}, allFloors: true, shrines: ["Elements", "Metal"], + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "EarthRune", weight: 5}], + events: [{trigger: "afterEnemyTick", type: "createEffectTile", kind: "Cracked", time: 10, power: 2, chance: 0.3, aoe: 0.5}], + }, + {name: "ElementalAir", nameList: "elemental", outfit: "ElementalAir", style: "AirElemental", faction: "Elemental", playLine: "Elemental", clusterWith: "electric", bound: "ElementalAir", color: "#88aaff", tags: KDMapInit(["opendoors", "flying", "air", "electric", "nofreeze", "elemental", "melee", "elite", "fireweakness", "electricresist", "coldweakness", "latexRestraints", "ropeRestraints", "leashing", "jail", "jailer", "hunter"]), + armor: -1, followRange: 1, AI: "hunt", guardChance: 0.6, evasion: 0.5, + specialCD: 5, specialAttack: "Dash", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 3, specialMinRange: 1.5, specialsfx: "Miss", castWhileMoving: true, dashThruWalls: true, dashThrough: true, + spells: ["AreaElectrify"], spellCooldownMult: 1, spellCooldownMod: 3, followLeashedOnly: true, disarm: 1, noSpellLeashing: true, spellRdy: true, noChannel: true, + attackLock: "White", + RestraintFilter: { + bonusRestraints: 2, + requiredItems: ["ObsidianArmCuffs"], + }, + maxblock: 0, + maxdodge: 3, + stamina: 10, + visionRadius: 7, maxhp: 12, minLevel:7, weight:-2, movePoints: 1.25, attackPoints: 2, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 3, + terrainTags: {"secondhalf":1, "thirdhalf":2, "elementsAnger": 12, "elementsRage": 6, "temple": 5, "elemental": 4, "electric": 4, "air": 4}, allFloors: true, shrines: ["Elements", "Latex"], + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "StormBreaker", weight: 1, ignoreInInventory: true}]}, + + {name: "Dryad", nameList: "elf", outfit: "Dryad", style: "Dryad", faction: "Elf", clusterWith: "nature", bound: "Dryad", playLine: "Dryad", color: "#67ff44", tags: KDMapInit(["opendoors", "nature", "elf", "leashing", "plant", "ranged", "vineRestraints", "slashweakness", "pierceweakness", "fireweakness", "search"]), cohesion: 0.0, + followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 3, AI: "hunt", + specialCD: 15, specialAttack: "Stun", specialRemove: "Bind", specialCDonAttack: true, specialAttackPoints: 2, specialRange: 4, specialWidth: 2, specialMinRange: 1.5, specialsfx: "Song", tilesMinRangeSpecial: 2, stunTime: 4, + specialDamage: "charm", spellRdy: true, + stamina: 3, + maxdodge: 0, + spells: ["PoisonDragonBlast", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: -2, tilesMinRange: 1, stopToCast: true, kite: 1.5, + visionRadius: 6, maxhp: 10, minLevel:2, weight:-3, movePoints: 1.5, attackPoints: 3, attack: "SpellMeleeBind", attackWidth: 3, attackRange: 1, power: 2, dmgType: "tickle", fullBoundBonus: 2, hitsfx: "Tickle", + terrainTags: {"secondhalf":1, "thirdhalf":2, "willAnger": 11, "willRage": -6, "elf": 5, "nature": 4}, shrines: ["Will"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 12}, {name: "WaterRune", weight: 4}]}, + {name: "JungleDryad", nameList: "elf", outfit: "Dryad", style: "Dryad", faction: "Enemy", clusterWith: "nature", bound: "JungleDryad", playLine: "Dryad", color: "#67ff44", tags: KDMapInit(["opendoors", "nature", "elf", "leashing", "plant", "ranged", "vineRestraints", "slashweakness", "pierceweakness", "fireweakness", "search"]), cohesion: 0.0, + followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 3, AI: "hunt", + spellRdy: true, + stamina: 3, + maxdodge: 0, + spells: ["PoisonDragonBlast", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: -2, tilesMinRange: 1, stopToCast: true, kite: 1.5, + visionRadius: 6, maxhp: 10, minLevel:7, weight:5, movePoints: 1, attackPoints: 3, attack: "SpellMeleeBind", attackWidth: 3, attackRange: 1, power: 2, dmgType: "tickle", fullBoundBonus: 2, hitsfx: "Tickle", + terrainTags: {"secondhalf":3, "thirdhalf":4}, shrines: ["Will"], floors:KDMapInit(["jng"]), noOverrideFloor: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 12}, {name: "WaterRune", weight: 4}]}, + + {name: "ElfRanger", nameList: "elf", outfit: "Elven", style: "Elf", faction: "Elf", clusterWith: "nature", bound: "ElfRanger", playLine: "Elf", color: "#67ff44", + tags: KDMapInit(["opendoors", "guardCall", "leashing", "elf", "imprisonable", "ranged", "elite", "mithrilRope", "pierceweakness", "iceweakness", "chainresist", "jail", "jailer", "hunter"]), cohesion: 0.0, + followLeashedOnly: true, ignorechance: 0, armor: 0.5, followRange: 3, AI: "hunt", stealth: 3, focusPlayer: true, + spellResist: 1.0, + stamina: 5, + maxblock: 0, + maxdodge: 3, + spells: ["ElfArrow"], miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, castWhileMoving: true, kite: 1.5, projectileAttack: true, + visionRadius: 9, maxhp: 13, minLevel:3, weight:-0.5, movePoints: 1, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, + attackLock: "White", + terrainTags: {"secondhalf":1, "thirdhalf":1, "willAnger": 5, "willRage": 8, "temple": 5, "nature": 1.5, "elf": 12}, shrines: ["Will"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 12}, {name: "BowRecurve", ignoreInInventory: true, weight: 100}, {name: "ElfCrystal", weight: 3}]}, + {name: "Elf", nameList: "elf", outfit: "Elven2", style: "Elf", faction: "Elf", clusterWith: "elf", bound: "Elf", playLine: "Elf", color: "#67ff44", + tags: KDMapInit(["opendoors", "antiMagic", "guardCall", "religious", "jailer", "leashing", "elf", "imprisonable", "ranged", "elite", "mithrilRestraints", "pierceweakness", "iceweakness", "chainresist", "jail", "jailer", "hunter"]), cohesion: 0.7, + followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 3, AI: "hunt", guardChance: 0.6, buffallies: true, spellRdy: true, + spellResist: 2.0, + stamina: 2, + maxdodge: 1, + maxblock: 0, + spells: ["Entangle", "OrbHeal", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 16, spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, castWhileMoving: true, kite: 1.5, + visionRadius: 9, maxhp: 16, minLevel:7, weight:-3, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, + attackLock: "Purple", + terrainTags: {"secondhalf":1, "thirdhalf":1, "willAnger": 4, "willRage": 6, "nature": 3, "temple": 5, "elf": 8}, shrines: ["Will"], allFloors: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 9}, {name: "ElfCrystal", weight: 4}], + ondeath: [ + {type: "summon", enemy: "Bramble", range: 0.5, count: 1, strict: true} + ], + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4, color: "#ffffff"} + ], + }, + + {name: "OrbOfLight", clusterWith: "nature", color: "#e7cf1a", tags: KDMapInit(["opendoors", "ignorenoSP", "nosignal", "nature", "ghost", "ranged", "soulimmune", "unstoppable", "coldsevereweakness", "flying"]), cohesion: 1.0, cohesionRange: 10, + followLeashedOnly: true, ignorechance: 0, armor: 0, followRange: 3, AI: "hunt", buffallies: true, spellRdy: true, sneakthreshold: 0.95, + spellResist: 2.0, + evasion: -0.5, + maxdodge: 0, + maxblock: 0, + nonDirectional: true, + spells: ["OrbHeal"], spellCooldownMult: 1, spellCooldownMod: 0, tilesMinRange: 1, stopToCast: true, kite: 1.5, kiteChance: 0.9, + visionRadius: 10, blindSight: 10, maxhp: 10, minLevel:3, weight:1.5, movePoints: 3, attackPoints: 4, attack: "SpellMeleeBlindWill", blindTime: 3, attackWidth: 8, attackRange: 1, power: 6, dmgType: "fire", + terrainTags: {"willAnger":4, "willRage":4, "magical": 4, "elf": 6}, shrines: ["Will"], allFloors: true, dropTable: [{name: "Ectoplasm", weight: 9}, {name: "ElfCrystal", weight: 3}], + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffff44"} + ], + }, + + {name: "Monolith", clusterWith: "chaos", color: "#ff5277", + tags: KDMapInit(["opendoors", "ignoreharmless", "construct", "nosignal", "poisonimmune", "soulimmune", "temple", "minor", "chaos", "ranged", "slashimmune", "unarmedresist", "pierceimmune", "fireresist", "unstoppable", "tickleresist", "groperesist", "electricresist", "flying"]), + cohesion: 0, cohesionRange: 10, difficulty: 0.3, + evasion: -2.0, + nonDirectional: true, + followLeashedOnly: true, ignorechance: 0, armor: 1.5, spellResist: 0.5, followRange: 2.5, AI: "guard", buffallies: true, spellRdy: false, sneakthreshold: 0.95, + spells: ["MonolithBeam"], spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, kite: 1.5, kiteChance: 0.9, + visionRadius: 5, blindSight: 5, maxhp: 7, minLevel:10, weight:4, movePoints: 4, attackPoints: 4, attack: "Spell", attackWidth: 8, attackRange: 1, power: 3, dmgType: "fire", + terrainTags: {"open": 25, "temple": 6}, shrines: [], floors:KDMapInit(["tmp", "tmb", "cry"]), dropTable: [{name: "EarthRune", weight: 7}, {name: "ElfCrystal", weight: 3}], + }, + + {name: "Pixie", nameList: "elf", clusterWith: "nature", tags: KDMapInit(["ignorenoSP", "fairy", "soulresist", "chaos", "melee", "minor", "magicweakness", "flying"]), followRange: 1, AI: "hunt", squeeze: true, ethereal: true, cohesion: 1.0, + summon: [ + {enemy: "Pixie", range: 3, count: 2, chance: 0.2, strict: true},], + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ffffff"} + ], + difficulty: 0.2, + spells: ["EnemyFlash"], spellCooldownMult: 1, spellCooldownMod: 14, castWhileMoving: true, + visionRadius: 6, blindSight: 4, maxhp: 1, evasion: 1.0, minLevel:0, weight:0.1, movePoints: 1.25, attackPoints: 2, attack: "MeleeWillSpell", attackWidth: 1, attackRange: 1, power: 2, dmgType: "charm", + terrainTags: {"willAnger": 2, "willRage": 3, "elf": 0.4}, shrines: ["Will"], allFloors: true}, + + {name: "ChaoticCrystal", faction: "Natural", clusterWith: "chaos", color: "#ff00aa", immobile: true, hitsfx: "Evil", tags: KDMapInit(["crystal", "chaos", "minor", "inactive", "melee", "crushweakness", "soulimmune"]), + evasion: -9, ignorechance: 1.0, armor: 1, followRange: 1, AI: "wander", sneakthreshold: 0.6, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ff44aa"}, + {trigger: "afterEnemyTick", type: "breakDownForDragonQueen", power: 4, dist: 1.5}, + ], + nopickpocket: true, + nonDirectional: true, + visionRadius: 1.5, blindSight: 1.5, maxhp: 8, minLevel:0, weight:0, movePoints: 99999, attackPoints: 1, attack: "MeleeWill", attackWidth: 8, attackRange: 1, power: 1, dmgType: "drain", + terrainTags: {"passage": -999, "door": -99, "crystalline": 45}, floors:KDMapInit(["cry"]), shrines: []}, + {name: "ChaoticCrystalActive", faction: "Natural", clusterWith: "chaos", immobile: true, color: "#ff00aa", hitsfx: "Evil", tags: KDMapInit(["crystal", "active", "chaos", "melee", "crushweakness", "crystalRestraints", "soulimmune"]), + evasion: -9, ignorechance: 1.0, armor: 1, followRange: 1, AI: "wander", sneakthreshold: 0.6, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#ff44aa"} + ], + nopickpocket: true, + nonDirectional: true, + visionRadius: 5, blindSight: 5, maxhp: 16, minLevel:0, weight:0, movePoints: 99999, attackPoints: 4, attack: "MeleeWillBind", attackWidth: 8, attackRange: 2, power: 2, dmgType: "drain", fullBoundBonus: 2, + terrainTags: {"passage": -999, "door": -99, "crystalline": 5, "open": 45}, floors:KDMapInit(["cry"]), shrines: []}, + + {name: "Statue", faction: "Natural", + tags: KDMapInit(["mimicBlock", "statue", "minor", "melee", + "unflinching", "crushweakness", "harmless", "pierceweakness", "chainresist", "soulimmune"]), + immobile: true, spellResist: 0.33, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, armor: 2, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: 0.05, + GFX: { + lighting: true, + }, + Sound: { + baseAmount: 0, + }, + nonDirectional: true, + nopickpocket: true, + visionRadius: 0, maxhp: 8, minLevel:0, weight:140, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 8, attackRange: 3, power: 4, dmgType: "souldrain", + terrainTags: {"passage": -999, "temple": 82, "open": 10}, floors:KDMapInit(["tmp"]), shrines: []}, + {name: "StatueGag", + tags: KDMapInit(["ignoregagged", "mimicBlock", "statue", "minor", "melee", + "unflinching", "ballGagRestraintsMagic", "crushweakness", "pierceweakness", "chainresist", "soulimmune"]), + spellResist: 0.33, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, armor: 2, followRange: 1, AI: "ambush", ambushRadius: 1.5, difficulty: 0.05, + RestraintFilter: { + unlimitedRestraints: true, + }, + nonDirectional: true, + GFX: { + lighting: true, + }, + Sound: { + baseAmount: 0, + }, + nopickpocket: true, + noOverrideFloor: true, + visionRadius: 8, maxhp: 12, minLevel:0, weight:80, movePoints: 2, attackPoints: 2, attack: "MeleeBindWill", attackWidth: 1, attackRange: 1, power: 4, dmgType: "grope", + terrainTags: {"passage": -999, "temple": 72, "open": 20}, floors:KDMapInit(["tmp"]), shrines: []}, + {name: "StatueDart", + tags: KDMapInit(["mimicBlock", "statue", "minor", "melee", "unflinching", "crushweakness", + "pierceweakness", "chainresist", "soulimmune"]), + immobile: true, spellResist: 0.33, sneakthreshold: 0.3, + spells: ["SleepDart"], spellCooldownMult: 1, spellCooldownMod: 30, + stopToCast: true, castWhileMoving: true, projectileAttack: true, + evasion: -9, ignorechance: 1.0, armor: 2, followRange: 1, AI: "ambush", + ambushRadius: 2.1, difficulty: 0.1, + nonDirectional: true, + GFX: { + lighting: true, + }, + Sound: { + baseAmount: 0, + }, + nopickpocket: true, + noOverrideFloor: true, + visionRadius: 8, maxhp: 8, minLevel:5, weight:0, movePoints: 99999, attackPoints: 4, attack: "Spell", attackWidth: 8, attackRange: 3, power: 4, dmgType: "souldrain", + terrainTags: {"passage": -999, "temple": 50, "open": 90, increasingWeight: 5}, floors:KDMapInit(["tmp"]), shrines: []}, + + // region ancientworship + {name: "CuffedGirl", clusterWith: "chaos", bound: "CuffedGirl", playLine: "Gagged", color: "#9564b8", + tags: KDMapInit([ + "minor", "leashing", "obsidianLeash", "obsidianCollar", + "ignoretiedup", "elementsTrap", "chaos", "disarmresist", "blindimmune", "melee", + "crystalRestraints", "crystalRestraintsHeavy", + "soulresist", "crushweakness", "charmweakness", + "submissive", "noshop", "gagged", "imprisonable", "rescuecrystal", "noarms", + ]), + style: "Worshipper", + outfit: "Worshipper", + events: [ + {trigger: "tick", type: "secretToy"}, + ], + Sound: { + baseAmount: 4, + moveAmount: 5, + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + ignorechance: 0, armor: 2, spellResist: 1, followRange: 1.5, AI: "hunt", cohesion: 0.45, sneakThreshold: 1, + evasion: -0.4, + master: {type: "SoulCrystalActive", range: 4, loose: true, aggressive: true}, + visionRadius: 7.5, maxhp: 7, minLevel:0, weight:9, movePoints: 2.7, + attackPoints: 3, attack: "MeleeBindLock", attackWidth: 2.5, attackRange: 1, power: 2, + dmgType: "soul", fullBoundBonus: 2, + ondeath: [{type: "spellOnSelf", spell: "SoulCrystalBind"}], + terrainTags: {"elementsAnger": 3, "elementsRage": 3, temple: 13, + "soul": 24, "chaos": 35, "elemental": 1, + revenge: 10}, shrines: ["Elements"], floors:KDMapInit(["tmp", "ore", "DemonTransition"]), + }, + {name: "CuffedGirl2", clusterWith: "chaos", bound: "CuffedGirl2", + playLine: "Gagged", color: "#9564b8", + tags: KDMapInit([ + "leashing", "obsidianLeash", "obsidianCollar", + "ignoretiedup", "elementsTrap", "chaos", "disarmresist", "blindimmune", "melee", + "crystalRestraints", "crystalRestraintsHeavy", + "soulresist", "crushweakness", "charmweakness", + "submissive", "noshop", "gagged", "imprisonable", "rescuecrystal", "noarms", + ]), + style: "Worshipper", + outfit: "Worshipper", + events: [ + {trigger: "tick", type: "secretToy"}, + ], + spells: ["CrystalBoltSingle"], spellCooldownMult: 1, spellCooldownMod: 3, + Sound: { + baseAmount: 4, + moveAmount: 5, + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + ignorechance: 0, armor: 1, spellResist: 2, followRange: 2.5, AI: "hunt", cohesion: 0.45, sneakThreshold: 1, + evasion: -0.4, + kite: 1.5, noKiteWhenHarmless: true, projectileTargeting: true, + master: {type: "SoulCrystalActive", range: 4, loose: true, aggressive: true}, + visionRadius: 8.5, maxhp: 14, minLevel:0, weight:4, movePoints: 2.4, + attackPoints: 3, attack: "SpellMeleeBindLockAll", attackWidth: 1, attackRange: 1, power: 2, + dmgType: "soul", fullBoundBonus: 2, + ondeath: [{type: "spellOnSelf", spell: "SoulCrystalBind"}], + terrainTags: {"elementsAnger": 3, "elementsRage": 3, temple: 7, + "soul": 24, "chaos": 35, "elemental": 1, + revenge: 5}, shrines: ["Elements"], floors:KDMapInit(["tmp", "ore", "DemonTransition"]), + }, + {name: "CuffedGirl3", clusterWith: "chaos", bound: "CuffedGirl2", + playLine: "Gagged", color: "#9564b8", + tags: KDMapInit([ + "elite", + "leashing", "obsidianLeash", "obsidianCollar", + "ignoretiedup", "elementsTrap", "chaos", "disarmresist", "blindimmune", "melee", + "crystalRestraints", "crystalRestraintsHeavy", + "soulresist", "crushweakness", "charmweakness", + "submissive", "noshop", "gagged", "imprisonable", "rescuecrystal", "noarms", + ]), + style: "Worshipper", + outfit: "Worshipper", + events: [ + {trigger: "tick", type: "secretToy"}, + ], + spells: ["CrystalShockBolt", "CrystalBoltMany"], spellCooldownMult: 1, spellCooldownMod: 3, + Magic: { + castCooldownUnique: { + CrystalShockBolt: 24, + }, + priority: { + CrystalShockBolt: 10, + }, + }, + Sound: { + baseAmount: 4, + moveAmount: 5, + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + ignorechance: 0, armor: 0, spellResist: 3, followRange: 3.5, AI: "hunt", cohesion: 0.45, sneakThreshold: 1, + evasion: -0.4, + kite: 2.5, noKiteWhenHarmless: true, projectileTargeting: true, + master: {type: "SoulCrystalActive", range: 4, loose: true, aggressive: true}, + visionRadius: 9.5, maxhp: 21, minLevel:0, weight:3, movePoints: 3.0, + attackPoints: 3, attack: "SpellMeleeBindLockAll", attackWidth: 3, attackRange: 1, power: 2, + dmgType: "soul", fullBoundBonus: 2, + ondeath: [{type: "spellOnSelf", spell: "SoulCrystalBind"}], + terrainTags: {"elementsAnger": 3, "elementsRage": 3, temple: 4, + "soul": 17, "chaos": 20, "elemental": 1, + revenge: 3}, shrines: ["Elements"], floors:KDMapInit(["tmp", "ore", "DemonTransition"]), + }, + //endregion + + {name: "SoulCrystal", clusterWith: "chaos", color: "#880000", immobile: true, hitsfx: "Evil", + tags: KDMapInit(["crystal", "soul", "minor", "unstoppable", "ranged", + "crushweakness", "soulimmune", "flying"]), spellResist: 0.33, sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, armor: 1.5, followRange: 1, AI: "wander", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ff5277"} + ], + Sound: { + baseAmount: 4, + }, + nopickpocket: true, + nonDirectional: true, + visionRadius: 100, maxhp: 20, minLevel:0, weight:-99, movePoints: 99999, attackPoints: 4, attack: "MeleeWill", attackWidth: 2.5, attackRange: 3, power: 4, dmgType: "souldrain", + terrainTags: {"passage": -999, "temple": 20, "open": 125}, floors:KDMapInit(["tmp"]), shrines: ["Conjure"], + dropTable: [{name: "AncientPowerSourceSpent", weight: 9}, {name: "AncientPowerSource", weight: 1}]}, + {name: "SoulCrystalActive", clusterWith: "chaos", color: "#880000", immobile: true, hitsfx: "Evil", + tags: KDMapInit(["crystal", "soul", "active", "unstoppable", "minor", "ranged", "crushweakness", "soulimmune", "flying"]), spellResist: 0.33, + evasion: -9, ignorechance: 1.0, armor: 1.5, followRange: 1, AI: "wander", + difficulty: 0.5, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 5.5, color: "#ff5277"} + ], + Sound: { + baseAmount: 6, + }, + nopickpocket: true, + nonDirectional: true, + spells: ["SoulCrystalBind"], spellCooldownMult: 1, spellCooldownMod: 0, followLeashedOnly: true, stopToCast: true, castWhileMoving: true, sneakthreshold: 0.6, + visionRadius: 100, maxhp: 20, minLevel:0, weight:-99, movePoints: 99999, attackPoints: 4, attack: "SpellMeleeWill", attackWidth: 2.5, attackRange: 3, power: 4, dmgType: "souldrain", + terrainTags: {"passage": -999, "temple": 10, "open": 115}, floors:KDMapInit(["tmp"]), shrines: ["Conjure"], + dropTable: [{name: "AncientPowerSource", weight: 10}]}, + + + + + {name: "ShadowHand", faction: "Ghost", clusterWith: "ghost", color: "#880044", tags: KDMapInit(["opendoors", "shadow", "holyweakness", "shadowHandEnemy", "shadowTrap", "ghost", "soulimmune", "fireweakness", "melee", "shadowimmune", "glueimmune", "chainimmune", "shadowHands", "poisonimmune", "meleeresist", "flying"]), + ignorechance: 0, armor: 0, followRange: 1, AI: "huntshadow", noAlert: true, hitsfx: "Evil", ignoreflag: ["ShadowHand"], failAttackflag: ["ShadowHand"], failAttackflagDuration: 2, + visionRadius: 10, blindSight: 4, evasion: 0.4, maxhp: 6, minLevel: 0, weight:-5, movePoints: 1, attackPoints: 2, attack: "MeleeWillBind", attackWidth: 1, attackRange: 1, power: 1.0, dmgType: "grope", fullBoundBonus: 4, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 0, color: "#880044"}, + {trigger: "beforeDamage", type: "shadowEngulf", power: 0, color: "#880044"}, + {trigger: "afterEnemyTick", type: "shadowDebuff", power: -0.5}, + ], + Sound: { + baseAmount: 0, + moveAmount: 1.4, + attackAmount: 3, + decay: 1, + }, + terrainTags: {"trap": 100, revenge: 10}, shrines: [], allFloors: true}, + + {name: "ShadowGhast", faction: "Ghost", clusterWith: "ghost", color: "#880044", tags: KDMapInit(["opendoors", "shadow", "holyweakness", "shadowHandEnemy", "shadowTrap", "ghost", "soulimmune", "fireweakness", "melee", "shadowimmune", "glueimmune", "chainimmune", "shadowHands", "poisonimmune", "meleeresist", "flying"]), + ignorechance: 0, armor: 0, followRange: 1, AI: "huntshadow", hitsfx: "Evil", ignoreflag: ["ShadowHand"], failAttackflag: ["ShadowHand"], failAttackflagDuration: 2, + visionRadius: 10, blindSight: 5, evasion: 0.15, maxhp: 14, minLevel: 0, weight:-4, movePoints: 4, attackPoints: 3, attack: "SpellMeleeWillBindSlow", attackWidth: 1, attackRange: 3, power: 2.0, dmgType: "cold", fullBoundBonus: 2, + projectileAttack: true, + spells: ["SummonShadowHand"], spellCooldownMult: 2, spellCooldownMod: 0, castWhileMoving: true, followLeashedOnly: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 0, color: "#880044"}, + {trigger: "beforeDamage", type: "shadowEngulf", power: 0, color: "#880044"}, + {trigger: "afterEnemyTick", type: "shadowDebuff", power: -0.5}, + ], + Sound: { + baseAmount: 0.5, + moveAmount: 1.4, + attackAmount: 3, + decay: 1, + }, + terrainTags: {"shadowcreature" : 20, "increasingWeight": 0.1, "trap": 10, revenge: 10, "goddessRage": 1}, shrines: [], allFloors: true, + dropTable: [{name: "Ectoplasm", weight: 1}]}, + + {name: "CorruptedAdventurer", nameList: "demon", outfit: "CorrAdv", style: "Fire", faction: "Ghost", clusterWith: "ghost", bound: "CorruptedAdventurer", playLine: "Elemental", color: "#880044", + tags: KDMapInit(["shadowHandEnemy", "shadowclan", "shadow", "holyweakness", "shadowTrap", "ghost", "soulresist", "fireweakness", "melee", "shadowresist", "glueresist", "chainresist", "shadowHands", "opendoors"]), + followRange: 1, ignoreflag: ["ShadowDommed"], failAttackflag: ["ShadowDommed"], + spells: ["ShadowBolt"], spellCooldownMult: 1, spellCooldownMod: 0, + AI: "huntshadow", visionRadius: 10, maxhp: 20, minLevel: 3, weight:-1, movePoints: 4, disarm: 0.33, + events: [ + {trigger: "afterEnemyTick", type: "shadowDebuff", power: -0.5}, + {trigger: "afterEnemyTick", type: "shadowDommeRefresh"}, + {trigger: "beforeDamage", type: "shadowDomme", power: 0, color: "#880044"}, + ], + attackPoints: 4, attack: "MeleeBindWillSpellLock", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 3, dmgType: "cold", multiBind: 2, + attackLock: "White", + terrainTags: {"shadowcreature" : 9, revenge: 3, "increasingWeight": 0.1, "goddessRage": 3}, shrines: [], allFloors: true, + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "Ectoplasm", weight: 10}] + }, + + {name: "ChainBeing", nameList: "demon", outfit: "ChainBeing", style: "FireElemental", clusterWith: "elemental", bound: "ChainBeing", playLine: "Elemental", color: "#c7a9fa", + tags: KDMapInit(["construct", "shadow", "holyweakness", "metalTrap", "soulresist", "fireweakness", "melee", "shadowresist", "glueresist", "chainimmune", "obsidianRestraints", "chainRestraintsMagic", "leashing"]), + armor: 1.5, kite: 1.5, followRange: 3, AI: "hunt", + spells: ["ObsidianBolt"], spellCooldownMult: 1, spellCooldownMod: 1, followLeashedOnly: true, stopToCast: true, spellRdy: true, projectileTargeting: true, + visionRadius: 10, maxhp: 11, minLevel: 0, weight:-10, movePoints: 2, + attackPoints: 4, attack: "MeleeBindLockAllSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "soul", fullBoundBonus: 2.5, + attackLock: "White", + stamina: 3, + Sound: { + baseAmount: 5, + moveAmount: 6, + attackAmount: 10, + }, + terrainTags: {"shadowcreature" : 6, revenge: 6, "increasingWeight": 0.1, "metalAnger": 10, "metalPleased": 10, }, shrines: ["Metal"], allFloors: true, + events: [ + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Chains", time: 12, power: 1, chance: 0.5, aoe: 0.5}, + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Chains", aoe: 1.5, power: 1, chance: 1.0}, + ], + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}] + }, + + + {name: "DemonEye", nameList: "cthulu", outfit: "Demon", style: "Demon", clusterWith: "demon", bound: "Demon", faction: "Observer", playLine: "Elemental", color: "#ff5577", + tags: KDMapInit(["opendoors", "chaos", "observer", "demon", "holyweakness", "obsAttract", "melee", "miniboss", "obsidianRestraints", "electricresist", "fireresist", "coldresist", "soulweakness", "charmweakness"]), + armor: 2, spellResist: 2, followRange: 0, AI: "hunt", disarm: 0.33, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4, color: "#ff5277"}, + ], + effect: { + effect: {name: "TheShadowCurse", power: 4, count: 1}, + }, + spells: ["GravityPull", "ShadowGraspMulti"], spellCooldownMult: 1.4, spellCooldownMod: 0, followLeashedOnly: true, castWhileMoving: true, spellRdy: true, projectileTargeting: true, + + Magic: { + castCooldownUnique: { + ShadowGraspMulti: 12, + }, + priority: { + ShadowGraspMulti: 10, + }, + }, + Sound: { + baseAmount: 0, + moveAmount: 2.5, + attackAmount: 5, + }, + nonDirectional: true, + stamina: 4, + visionRadius: 15, blindSight: 4, maxhp: 30, minLevel: 0, weight:-10, movePoints: 4, regen: 0.04, keys: true, + attackPoints: 4, attack: "SpellMeleeBindLockAllWillEffect", attackWidth: 3, attackRange: 1, power: 5, dmgType: "cold", + fullBoundBonus: 5, multiBind: 4, + attackLock: "Purple", + useLock: "Purple", + terrainTags: {}, shrines: [], floors:KDMapInit([]), + dropTable: [{name: "ManaOrb", weight: 10}] + }, + {name: "Observer", faction: "Observer", color: "#ff5577", clusterWith: "demon", tags: KDMapInit(["chaos", "shadow", "holyweakness", "melee", "minor", "soulimmune", "meleeresist", "flying"]), + squeeze: true, followRange: 1, AI: "hunt", sneakThreshold: 1, hitsfx: "", ethereal: true, + spells: ["ObserverBeam"], spellCooldownMult: 1, spellCooldownMod: 1, evasion: 0.4, sneakthreshold: 3.5, + events: [ + {trigger: "enemyCast", type: "RandomRespawn"}, + ], + Sound: { + baseAmount: 0, + moveAmount: 1, + }, + nopickpocket: true, + nonDirectional: true, + visionRadius: 4.5, maxhp: 3, minLevel: 0, weight:-100, movePoints: 3, attackPoints: 3, + attack: "Spell", suicideOnSpell: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "soul", + terrainTags: {}, floors:KDMapInit([]), shrines: []}, + + {name: "DemonStar", nameList: "aztec", outfit: "Demon", style: "Demon", clusterWith: "demon", bound: "Demon", playLine: "Elemental", color: "#9ea7de", + tags: KDMapInit(["opendoors", "order", "leashing", "demon", "holyweakness", "melee", "miniboss", "mithrilRestraints", "electricresist", "fireresist", "coldresist", "soulweakness", "charmweakness", "jail", "jailer", "hunter"]), + armor: 1.5, followRange: 0, AI: "hunt", + spells: ["BoundByFate"], spellCooldownMult: 1, spellCooldownMod: 0, followLeashedOnly: true, stopToCast: true, spellRdy: true, projectileTargeting: true, + visionRadius: 10, maxhp: 16, minLevel: 0, weight:-10, movePoints: 4, + attackPoints: 3, attack: "MeleeBindLockSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 4, dmgType: "cold", fullBoundBonus: 2, + attackLock: "Purple",multiBind: 3, + stamina: 5, + Sound: { + baseAmount: 0, + moveAmount: 2.5, + attackAmount: 5, + }, + terrainTags: {"demon" : 15, "increasingWeight": 0.1, "goddessRage": 10, "goddessPleased": 10, }, shrines: [], allFloors: true, + dropTable: [{name: "Gold", amountMin: 25, amountMax: 35, weight: 10}] + }, + + {name: "DemonMoon", nameList: "space", outfit: "Demon", style: "Demon", clusterWith: "demon", bound: "Demon", playLine: "Elemental", color: "#9ea7de", + tags: KDMapInit(["opendoors", "order", "leashing", "demon", "holyweakness", "melee", "miniboss", "mithrilRestraints", "electricresist", "fireresist", "coldresist", "soulweakness", "charmweakness", "jail", "jailer", "hunter"]), + armor: 1.5, followRange: 0, AI: "hunt", + spells: ["CrushingFate"], spellCooldownMult: 1, spellCooldownMod: 0, followLeashedOnly: true, stopToCast: true, spellRdy: true, projectileTargeting: true, + visionRadius: 10, maxhp: 16, minLevel: 0, weight:-10, movePoints: 4, + attackPoints: 3, attack: "MeleeBindLockSpell", attackWidth: 1, attackRange: 1, tilesMinRange: 1, power: 4, dmgType: "cold", fullBoundBonus: 2, + attackLock: "Purple", multiBind: 3, + stamina: 5, + Sound: { + baseAmount: 0, + moveAmount: 2.5, + attackAmount: 5, + }, + terrainTags: {"demon" : 15, "increasingWeight": 0.1, "goddessRage": 10, "goddessPleased": 10, }, shrines: [], allFloors: true, + dropTable: [{name: "Gold", amountMin: 25, amountMax: 35, weight: 10}] + }, + {name: "DemonVoid", nameList: "science", outfit: "Demon", style: "Demon", clusterWith: "demon", bound: "Demon", playLine: "Elemental", color: "#9ea7de", + tags: KDMapInit(["opendoors", "order", "leashing", "demon", "holyweakness", "melee", "miniboss", "obsidianRestraints", "electricresist", "fireresist", "coldresist", "soulweakness", "charmweakness", "jail", "jailer", "hunter"]), + armor: 1.5, followRange: 0, AI: "hunt", + spells: ["GravityPull"], spellCooldownMult: 1, spellCooldownMod: 0, followLeashedOnly: true, castWhileMoving: true, spellRdy: true, projectileTargeting: true, + visionRadius: 10, maxhp: 18, minLevel: 0, weight:-10, movePoints: 2.5, + attackPoints: 2, attack: "MeleeBindLockSpell", attackWidth: 1.5, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "cold", fullBoundBonus: 2, + attackLock: "Purple", multiBind: 2, + Sound: { + baseAmount: 0, + moveAmount: 2.5, + attackAmount: 5, + }, + stamina: 9, sprintspeed: 1.7, + terrainTags: {"demon" : 15, "increasingWeight": 0.1, "goddessRage": 10, "goddessPleased": 10, }, shrines: [], allFloors: true, + dropTable: [{name: "Gold", amountMin: 25, amountMax: 35, weight: 10}] + }, + + {name: "Demon", nameList: "demon", outfit: "DemonHeavy", style: "Demon", clusterWith: "demon", bound: "Demon", playLine: "Elemental", color: "#9ea7de", + tags: KDMapInit(["opendoors", "order", "leashing", "demon", "holyweakness", "relentless", "melee", "obsidianRestraints", "electricresist", "fireresist", "coldresist", "soulweakness", "charmweakness", "jail", "jailer", "hunter"]), + armor: 3, followRange: 0, AI: "hunt", + stunTime: 2, specialCD: 8, specialAttack: "Stun", specialRemove: "BindLock", specialPower: 4, specialDamage: "crush", specialWidth: 3, specialCDonAttack: true, + visionRadius: 10, maxhp: 8, minLevel: 0, weight:-14, movePoints: 2, + attackPoints: 2, attack: "MeleeBindLock", attackWidth: 1.5, attackRange: 1, tilesMinRange: 1, power: 1.5, dmgType: "cold", fullBoundBonus: 0.5, + attackLock: "Purple", + Sound: { + baseAmount: 1, + moveAmount: 3.5, + attackAmount: 5, + }, + stamina: 6, sprintspeed: 2, + terrainTags: {"demon" : 27, "increasingWeight": 0.15, "goddessRage": 14, "goddessPleased": 14, }, shrines: [], allFloors: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 15, weight: 10}] + }, + + {name: "Gag", faction: "KinkyConstruct", clusterWith: "construct", + tags: KDMapInit(["leatherTrap", "ropeTrap", "ignoregagged", "construct", "nosignal", "poisonresist", "soulimmune", "melee", "ballGagRestraints", "gagSpell", "minor", "chainresist", "doortrap", "flying"]), + ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_Gag"], failAttackflag: ["FA_Gag"], squeeze: true, ignoreStaminaForBinds: true, + Attack: { + mustBindorFail: true, + }, + Resistance: { + profile: ["construct"], + }, + RestraintFilter: { + unlimitedRestraints: true, + levelBonus: 4, + }, + nopickpocket: true, + specialCD: 8, specialAttack: "DashBonus", specialRemove: "BindSuicide", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.99, specialMinRange: 1.5, dashThrough: true, specialsfx: "Miss", + visionRadius: 5, visionSummoned: 12, maxhp: 4, minLevel: 0, weight:0, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicide", focusPlayer: true, + suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"trap": 50, revenge: 50, gag: -40}, allFloors: true, shrines: [], summonTags: ["gag"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + {name: "AnimLegbinder", faction: "KinkyConstruct", clusterWith: "construct", + tags: KDMapInit(["leatherTrap", "ignoreharmless", "construct", "nosignal", "poisonresist", "soulimmune", "melee", "legbinderSpell", "minor", "chainresist", "doortrap", "flying", + "backup_harness", "harnessSpell", + ]), + ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_Legb"], failAttackflag: ["FA_Legb"], squeeze: true, ignoreStaminaForBinds: true, + Attack: { + mustBindorFail: true, + }, + Resistance: { + profile: ["construct"], + }, + RestraintFilter: { + unlimitedRestraints: true, + levelBonus: 4, + }, + nopickpocket: true, + visionRadius: 6, visionSummoned: 12, maxhp: 10, minLevel: 5, weight:0, movePoints: 2, attackPoints: 3, attack: "MeleeBindSuicide", focusPlayer: true, + suicideOnAdd: true, attackWidth: 3, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"trap": 30, revenge: 30, legbinder: -25}, allFloors: true, shrines: [], summonTags: ["legbinder"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + {name: "AnimArmbinder", faction: "KinkyConstruct", clusterWith: "construct", + tags: KDMapInit(["leatherTrap", "ignoreharmless", "construct", "nosignal", "poisonresist", "soulimmune", "melee", "armbinderSpell", "minor", "chainresist", "doortrap", "flying", + "backup_harness", "harnessSpell", + ]), + ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_Armb"], failAttackflag: ["FA_Armb"], squeeze: true, ignoreStaminaForBinds: true, + Attack: { + mustBindorFail: true, + }, + Resistance: { + profile: ["construct"], + }, + RestraintFilter: { + unlimitedRestraints: true, + levelBonus: 4, + }, + nopickpocket: true, + visionRadius: 6, visionSummoned: 12, maxhp: 8, minLevel: 3, weight:0, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindSuicide", focusPlayer: true, + suicideOnAdd: true, attackWidth: 3, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"trap": 30, revenge: 30, armbinder: -25}, allFloors: true, shrines: [], summonTags: ["armbinder"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + {name: "AnimHarness", faction: "KinkyConstruct", clusterWith: "construct", + tags: KDMapInit(["leatherTrap", "ignoreharmless", "construct", "nosignal", "poisonresist", "soulimmune", "melee", "harnessSpell", "binderharnessSpell", "minor", "chainresist", "doortrap", "flying"]), + ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_Harness"], failAttackflag: ["FA_Harness"], squeeze: true, ignoreStaminaForBinds: true, + Attack: { + mustBindorFail: true, + }, + Resistance: { + profile: ["construct"], + }, + RestraintFilter: { + unlimitedRestraints: true, + levelBonus: 4, + }, + nopickpocket: true, + visionRadius: 6, visionSummoned: 12, maxhp: 6, minLevel: 0, weight:0, movePoints: 1.5, attackPoints: 2, attack: "MeleeBindSuicide", focusPlayer: true, + suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 2, dmgType: "crush", fullBoundBonus: 1, + terrainTags: {"trap": 25, revenge: 25, harness: -20}, allFloors: true, shrines: [], summonTags: ["harness"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + {name: "AnimBlindfold", faction: "KinkyConstruct", clusterWith: "construct", + tags: KDMapInit(["leatherTrap", "ropeTrap", "ignoreharmless", "construct", "nosignal", "poisonresist", "soulimmune", "melee", "blindfoldSpell", "minor", "chainresist", "doortrap", "flying"]), + ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_BF"], failAttackflag: ["FA_BF"], squeeze: true, ignoreStaminaForBinds: true, + Attack: { + mustBindorFail: true, + }, + Resistance: { + profile: ["construct"], + }, + RestraintFilter: { + unlimitedRestraints: true, + levelBonus: 4, + }, + nopickpocket: true, + specialCD: 8, specialAttack: "DashBonus", specialRemove: "BindSuicide", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.99, specialMinRange: 1.5, dashThrough: true, specialsfx: "Miss", + visionRadius: 9, visionSummoned: 12, maxhp: 4, minLevel: 4, weight:0, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicide", focusPlayer: true, + suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"trap": 25, revenge: 25, blindfold: -20}, allFloors: true, shrines: [], summonTags: ["blindfold"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + {name: "AnimStraitjacket", faction: "KinkyConstruct", clusterWith: "construct", + tags: KDMapInit(["leatherTrap", "ignoreharmless", "construct", "nosignal", "poisonresist", "soulimmune", "melee", "jacketSpell", "minor", "chainresist", "doortrap", "flying", + "backup_harness", "harnessSpell", "transportJacket" + ]), + ignorechance: 0.75, followRange: 1, AI: "hunt", ignoreflag: ["FA_Jacket"], failAttackflag: ["FA_Jacket"], squeeze: true, ignoreStaminaForBinds: true, + Attack: { + mustBindorFail: true, + }, + Resistance: { + profile: ["construct"], + }, + RestraintFilter: { + unlimitedRestraints: true, + levelBonus: 4, + }, + nopickpocket: true, + visionRadius: 9, visionSummoned: 12, maxhp: 12, minLevel: 7, weight:0, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindSuicide", focusPlayer: true, + suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"trap": 20, revenge: 20, "leatherRage": 5, jacket: -20}, allFloors: true, shrines: [], summonTags: ["jacket"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + {name: "Cuffs", faction: "KinkyConstruct", clusterWith: "construct", + tags: KDMapInit(["metalTrap", "doortrap", "ignoreharmless", "construct", "nosignal", "poisonimmune", "soulimmune", "melee", "cuffsSpell", "minor", "chainresist", "meleeresist", "glueweakness", "iceweakness", "flying"]), ignorechance: 0.75, + armor: 1, followRange: 1, AI: "hunt", ignoreflag: ["FA_Cuffs"], failAttackflag: ["FA_Cuffs"], squeeze: true, ignoreStaminaForBinds: true, + Attack: { + mustBindorFail: true, + }, + Resistance: { + profile: ["construct"], + }, + RestraintFilter: { + unlimitedRestraints: true, + levelBonus: 4, + }, + nopickpocket: true, + specialCD: 8, specialAttack: "DashBonus", specialRemove: "BindSuicide", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.99, specialMinRange: 1.5, dashThrough: true, specialsfx: "Miss", + visionRadius: 5, visionSummoned: 12, maxhp: 2, minLevel: 0, weight:0, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicide", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "charm", fullBoundBonus: 1, + terrainTags: {"doortrap": 6, revenge: 50, "trap": 50, cuffs: -40}, allFloors: true, shrines: ["Metal"], summonTags: ["cuffs"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Chains", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + {name: "AnimChastity", arousalMode: true, faction: "KinkyConstruct", clusterWith: "construct", + tags: KDMapInit(["metalTrap", "ignoreharmless", "doortrap", "construct", "nosignal", "poisonimmune", "soulimmune", "melee", "chastitySpell", "minor", "chainresist", "meleeresist", "glueweakness", "iceweakness", "flying"]), ignorechance: 0.75, + armor: 2, followRange: 1, AI: "hunt", ignoreflag: ["FA_Chastity"], failAttackflag: ["FA_Chastity"], squeeze: true, ignoreStaminaForBinds: true, + Attack: { + mustBindorFail: true, + }, + Resistance: { + profile: ["construct"], + }, + RestraintFilter: { + unlimitedRestraints: true, + levelBonus: 4, + }, + nopickpocket: true, + visionRadius: 6, visionSummoned: 12, maxhp: 5, minLevel: 2, weight:0, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindSuicide", suicideOnAdd: true, attackWidth: 3, attackRange: 1, power: 2, dmgType: "charm", fullBoundBonus: 1, + terrainTags: {"doortrap": 6, revenge: 35, "trap": 35, chastity: -25}, allFloors: true, shrines: ["Metal"], summonTagsMulti: ["chastity"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Chains", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + {name: "AnimYoke", arousalMode: true, faction: "KinkyConstruct", clusterWith: "construct", + tags: KDMapInit(["metalTrap", "ignoreharmless", "doortrap", "construct", "nosignal", "poisonimmune", "soulimmune", "melee", "yokeSpell", "minor", "chainresist", "meleeresist", "glueweakness", "iceweakness", "flying"]), ignorechance: 0.75, + armor: 2, followRange: 1, AI: "hunt", ignoreflag: ["FA_Yoke"], failAttackflag: ["FA_Yoke"], squeeze: true, ignoreStaminaForBinds: true, + Attack: { + mustBindorFail: true, + }, + Resistance: { + profile: ["construct"], + }, + RestraintFilter: { + unlimitedRestraints: true, + levelBonus: 4, + }, + nopickpocket: true, + visionRadius: 6, visionSummoned: 12, maxhp: 5, minLevel: 4, weight:0, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindSuicide", suicideOnAdd: true, attackWidth: 3, attackRange: 1, power: 2, dmgType: "charm", fullBoundBonus: 1, + terrainTags: {"doortrap": 6, revenge: 35, "trap": 35, yoke: -30}, allFloors: true, shrines: ["Metal"], summonTags: ["yoke"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Chains", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + {name: "Lock", faction: "KinkyConstruct", clusterWith: "construct", color: "#bbbbbb", + tags: KDMapInit(["metalTrap", "leatherTrap", "ignorenoSP", "lock", "construct", "nosignal", "poisonimmune", "soulimmune", "melee", "minor", "chainresist", "meleeresist", "glueweakness", "iceweakness", "doortrap", "flying"]), difficulty: 0.2, + ignorechance: 0.75, armor: 1, followRange: 1, AI: "hunt", ignoreflag: ["FA_Lock"], failAttackflag: ["FA_Lock"], squeeze: true, suicideOnLock: true, + Attack: { + mustBindorFail: true, + }, + Resistance: { + profile: ["construct"], + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + specialCD: 8, specialAttack: "MeleeDash", specialRemove: "SuicideMeleeBindLockWill", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.99, specialMinRange: 1.5, dashThrough: false, specialsfx: "Miss", + visionRadius: 5, visionSummoned: 12, maxhp: 4, minLevel: 0, weight:0, movePoints: 1, attackPoints: 3, attack: "SuicideMeleeBindLockWill", attackWidth: 3, tilesMinRange: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {"secondhalf":1, "lastthird":1, revenge: 60, "doortrap": 5, "trap": 40}, allFloors: true, shrines: ["Metal"], + maxLevel: 3, + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Chains", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + {name: "LockMaster", faction: "KinkyConstruct", clusterWith: "construct", color: "#bbbbbb", + tags: KDMapInit(["metalTrap", "leatherTrap", + "lock", "construct", "nosignal", "poisonimmune", "soulimmune", "melee", "minor", + "chainresist", "meleeresist", "glueweakness", "iceweakness", "doortrap", "flying"]), + Resistance: { + profile: ["construct"], + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + difficulty: 0.5, + armor: 2, spellResist: 2, followRange: 2.5, AI: "hunt", + squeeze: true, + nonDirectional: true, kite: 1.5, + spells: ["LockBullet"], castWhileMoving: true, projectileTargeting: true, + spellCooldownMod: 0, spellCooldownMult: 1, + visionRadius: 5.5, visionSummoned: 12, maxhp: 10, minLevel: 3, weight:0, movePoints: 2, + stamina: 5, + sprintspeed: 2.0, + attackLock: "Purple", + attackPoints: 3, attack: "SpellMeleeLockWill", attackWidth: 1, tilesMinRange: 1, attackRange: 1, power: 1, dmgType: "soul", fullBoundBonus: 2, + terrainTags: {"secondhalf":2, "lastthird":2, "doortrap": 8, revenge: 50, "trap": 100}, allFloors: true, shrines: ["Metal"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Chains", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + {name: "Feathers", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["ignorenoSP", "construct", "nosignal", "poisonresist", "soulimmune", "melee", "chainRestraints", "minor", "firesevereweakness", "meleeresist", "doortrap", "flying"]), ignorechance: 0.75, armor: -1, followRange: 1, AI: "hunt", ignoreflag: ["feathers"], failAttackflag: ["feathers"], squeeze: true, + visionRadius: 5, visionSummoned: 12, maxhp: 3, minLevel: 0, weight:0.25, movePoints: 2, attackPoints: 2, attack: "MeleeWill", + nonDirectional: true, + Resistance: { + profile: ["construct"], + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + attackWidth: 3, tilesMinRange: 1, attackRange: 1, power: 1, dmgType: "tickle", ondeath: [{type: "spellOnSelf", spell: "Feathers"}], + terrainTags: {"secondhalf":2, "lastthird":-1, "increasingLevel": -0.25, revenge: 7, "doortrap": 8}, allFloors: true, shrines: [], difficulty: 0.7, hitsfx: "Tickle",}, + {name: "Scarves", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["ignoreharmless", "construct", "nosignal", "flying", "poisonresist", "soulimmune", "melee", "scarfRestraints", "minor", "firesevereweakness", "acidweakness", "soapweakness", "slashweakness", "meleeresist", "doortrap"]), ignorechance: 0.75, armor: 0, followRange: 1, AI: "hunt", ignoreflag: ["scarves"], failAttackflag: ["scarves"], squeeze: true, + visionRadius: 3, visionSummoned: 12, maxhp: 1, minLevel: 0, maxLevel: 3, weight:1, movePoints: 1.5, attackPoints: 2, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "plush", fullBoundBonus: 1, + Attack: { + mustBindorFail: true, + }, + Resistance: { + profile: ["construct"], + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 1, + stamina: 6, + nonDirectional: true, + terrainTags: {"secondhalf":-1, "lastthird":-2, "increasingLevel": -2, revenge: 12, "doortrap": 6, "ribbon": 3}, allFloors: true, shrines: [], difficulty: 0.4}, + {name: "Ribbons", faction: "KinkyConstruct", color: "#f135a4", clusterWith: "dressmaker", tags: KDMapInit(["ropeTrap", "ignoreharmless", "construct", "ribbon", "nosignal", "ribbon", "melee", "magicRibbons", "minor", "meleeresist", "doortrap", "flying"]), ignorechance: 0.75, armor: 0, followRange: 1, AI: "hunt", ignoreflag: ["ribbons"], failAttackflag: ["ribbons"], squeeze: true, + visionRadius:5, visionSummoned: 12, maxhp: 6, minLevel: 0, weight:0, movePoints: 1.25, attackPoints: 3, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 1, dmgType: "chain", fullBoundBonus: 1, + Resistance: { + profile: ["rope", "construct"], + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 1, + nonDirectional: true, + Attack: { + mustBindorFail: true, + }, + terrainTags: { "dressmaker": 7, "conjureAnger": 4, "ribbon": 3, revenge: 4}, allFloors: true, shrines: ["Conjure", "Rope"], difficulty: 0.2, ondeath: [{type: "spellOnSelf", spell: "RibbonBurst"}]}, + {name: "RopeSnake", faction: "KinkyConstruct", clusterWith: "construct", color: "#ffae70", tags: KDMapInit(["ropeTrap", "ignoreharmless", "construct", "nosignal", "melee", "ropeRestraints", "minor", "doortrap"]), ignorechance: 0.75, followRange: 1, AI: "wander", squeeze: true, + Resistance: { + profile: ["rope", "construct"], + }, + ignoreflag: ["ropesnake"], failAttackflag: ["ropesnake"], + Attack: { + mustBindorFail: true, + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + stamina: 6, + visionRadius: 3, maxhp: 4, minLevel: 0, weight:3, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "chain", fullBoundBonus: 1, + terrainTags: {"increasingWeight":-3, revenge: 40, "trap": 40}, allFloors: true, shrines: ["Rope"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Ropes", aoe: 1.5, power: 1, chance: 1.0}, + ], + dropTable: [{name: "RopeSnakeRaw", amount: 1, weight: 10}], + }, + {name: "UnforseenRope", faction: "KinkyConstruct", clusterWith: "construct", color: "#ffae70", tags: KDMapInit(["ignoreharmless", "construct", "nosignal", "melee", "ropeRestraints", "ropeRestraints2", "minor", "search"]), ignorechance: 0.75, followRange: 1, AI: "hunt", stealth: 2.5, squeeze: true, + ignoreflag: ["ropesnake"], failAttackflag: ["ropesnake"], + Resistance: { + profile: ["rope", "construct"], + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + stamina: 6, + visionRadius: 10, blindSight: 8, maxhp: 4, minLevel: 0, weight:0, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 1, power: 1, dmgType: "chain", fullBoundBonus: 1, + terrainTags: {"secondhalf":1, "lastthird":3, revenge: 20, "trap": 20}, allFloors: true, shrines: ["Rope"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Ropes", aoe: 1.5, power: 1, chance: 1.0}, + {trigger: "death", type: "RandomRespawn", chance: 0.33}, + ], + dropTable: [{name: "RopeSnakeRaw", amount: 1, weight: 10}], + }, + {name: "LearnedRope", faction: "KinkyConstruct", clusterWith: "construct", color: "#ffae70", tags: KDMapInit(["ignoreharmless", "construct", "nosignal", "melee", "ropeRestraints", "ropeRestraints2", "search"]), ignorechance: 0.75, followRange: 1, AI: "hunt", squeeze: true, disarm: 0.5, + ignoreflag: ["ropesnake"], failAttackflag: ["ropesnake"], + Attack: { + mustBindorFail: true, + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 2, + stamina: 6, + Resistance: { + profile: ["rope", "construct"], + }, + specialCD: 8, specialAttack: "DashBonus", specialRemove: "BindSuicide", specialCDonAttack: true, specialAttackPoints: 1, specialRange: 4.99, specialMinRange: 1.5, dashThrough: true, specialsfx: "Miss", + visionRadius: 5, maxhp: 8, minLevel: 2, weight:1, movePoints: 1, attackPoints: 3, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 1, attackRange: 2.5, power: 2, multiBind: 2, dmgType: "chain", fullBoundBonus: 2, + terrainTags: {"trap": 30, revenge: 30}, allFloors: true, shrines: ["Rope"], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Ropes", aoe: 1.5, power: 1, chance: 1.0}, + ], + dropTable: [{name: "RopeSnakeRaw", amount: 1, weight: 10}], + }, + {name: "MonsterRope", faction: "KinkyConstruct", clusterWith: "construct", color: "#ffae70", + tags: KDMapInit(["ropeTrap", "ignoreharmless", "doortrap", "construct", "nosignal", "melee", + "unstoppable", "ropeRestraintsHogtie", "ropeRestraints", "ropeRestraints2", "elite", "hunter"]), + ignorechance: 0.75, followRange: 1, AI: "guard", + armor: 2.0, + ignoreflag: ["ropesnake"], failAttackflag: ["ropesnake"], disarm: 0.5, ignoreStaminaForBinds: true, + Resistance: { + profile: ["rope", "construct"], + }, + effect: { + effect: {name: "Hogtie", power: 4}, + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + stamina: 2, + visionRadius: 6, maxhp: 20, minLevel: 3, weight:0, movePoints: 3.5, attackPoints: 3, + attack: "EffectMeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 3, attackRange: 1, + power: 8, multiBind: 10, dmgType: "chain", fullBoundBonus: 6, + terrainTags: {"secondhalf":1, "lastthird":4, "increasingWeight":2, "trap": 20, revenge: 20}, allFloors: true, shrines: ["Rope"], + ondeath: [ + {type: "summon", enemy: "RopeSnake", range: 2.5, count: 3, strict: true, lifetime: 30}, + {type: "summon", enemy: "LearnedRope", range: 2.5, count: 1, strict: true, lifetime: 30}, + ], + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Ropes", aoe: 1.5, power: 1, chance: 1.0}, + ], + dropTable: [{name: "RopeSnakeRaw", amount: 8, weight: 10}], + }, + + {name: "ElementalRope", outfit: "Lingerie", style: "EarthElemental", faction: "Elemental", playLine: "Elemental", clusterWith: "elemental", bound: "ElementalRope", squeeze: true, color: "#ffae70", + tags: KDMapInit(["opendoors", "elemental", "rope", "melee", "chainresist", "jail", "jailer", "unarmedresist", "ropeRestraints", "ropeRestraints2", "ballGagRestraints", "leashing", "search", "doortrap"]), + armor: 0, followRange: 1, AI: "hunt", + Resistance: { + profile: ["rope"], + }, + stamina: 6, + RestraintFilter: { + unlimitedRestraints: true, + }, + maxblock: 2, + maxdodge: 0, + visionRadius: 6, maxhp: 14, minLevel:0, weight:-2, movePoints: 1.5, attackPoints: 3, attack: "MeleeBind", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 2.5, dmgType: "chain", fullBoundBonus: 2.5, + terrainTags: {"secondhalf":2, "thirdhalf":1, "ropeAnger": 4, "ropeRage": 4, "temple": 8, "doortrap": 4, revenge: 5, "elemental": 3, "witch": 5, "rope": 4}, allFloors: true, shrines: ["Rope", "Elements"], + dropTable: [{name: "RopeSnakeRaw", amount: 5, weight: 10}, {name: "WeakMagicRopeRaw", amount: 3, weight: 10}, {name: "Knife", ignoreInInventory: true, weight: 3, noSummon: true}], + events: [ + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Ropes", time: 15, power: 1, chance: 0.5, aoe: 0.5}, + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Ropes", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + + {name: "ElementalRubber", outfit: "ElementalRubber", style: "EarthElemental", faction: "Elemental", playLine: "Elemental", clusterWith: "Elemental", bound: "ElementalRubber", squeeze: true, + tags: KDMapInit(["opendoors", "latexTrap", "latex", "elemental", "slashweakness", "melee", "glueimmune", "coldweakness", "jail", "jailer", "electricresist", "pierceweakness", "latexRestraints", "latexGag", "leashing", "search", "doortrap"]), + armor: -0.5, followRange: 1, AI: "hunt", Resistance: { + block_phys: 1.5, + block_magic: 0, + }, + color: "#73a0ef", + spells: ["EnemySummonLatexArmbinder", "EnemySummonLatexLegbinder", "EnemySummonLatexGag", "EnemySummonLatexRestraint"], spellCooldownMult: 1, spellCooldownMod: 1, followLeashedOnly: true, stopToCast: true, spellRdy: false, projectileTargeting: true, + stamina: 3, + maxblock: 2, + maxdodge: 0, + useLock: "Rubber", attackLock: "Rubber", + visionRadius: 7, maxhp: 10, minLevel:0, weight:-2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeWillBindLockAll", attackWidth: 2.5, attackRange: 1, tilesMinRange: 1, power: 2, dmgType: "glue", fullBoundBonus: 3, + terrainTags: {"secondhalf":2, "thirdhalf":1, "latexAnger": 4, "latexRage": 4, "latexPleased": 2, "latexFriendly": 3, "temple": 8, "doortrap":5, revenge: 5, "alchemist": 5, "latex": 5, "slime": 5}, allFloors: true, shrines: ["Latex", "Elements"], + events: [ + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "LatexThinBlue", time: 4, power: 1, chance: 0.5, aoe: 0.5}, + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "LatexThinBlue", aoe: 1.5, power: 1, chance: 1.0}, + ], + dropTable: [{name: "HardSlimeRaw", amount: 4, weight: 10}, {name: "RopeRune", weight: 2, noSummon: true}], + }, + {name: "ElementalLeather", outfit: "ElementalLeather", style: "EarthElemental", faction: "Elemental", playLine: "Elemental", clusterWith: "elemental", bound: "ElementalLeather", squeeze: true, color: "#9999a0", + tags: KDMapInit(["opendoors", "elemental", "leather", "melee", "chainresist", "crushresist", "jail", "antiMagic", "jailer", "leatherRestraints", "leatherRestraintsHeavy", "ballGagRestraints", "leashing", "search", "doortrap"]), + armor: 1, followRange: 1, AI: "hunt", guardChance: 0.6, kite: 1.5, + RestraintFilter: { + unlimitedRestraints: true, + }, + stamina: 3, + maxblock: 1, + maxdodge: 1, + projectileAttack: true, + visionRadius: 6, maxhp: 10, minLevel:2, weight:-2, movePoints: 1.5, attackPoints: 3, attack: "MeleeBindLock", attackWidth: 1, attackRange: 2.5, tilesMinRange: 1, power: 2.5, dmgType: "pain", fullBoundBonus: 2.5, projectileTargeting: true, + terrainTags: {"secondhalf":2, "thirdhalf":1, "leatherAnger": 4, "leatherRage": 4, "temple": 8, "doortrap": 5, revenge: 5, "elemental": 3, "witch": 5, "leather": 4}, allFloors: true, shrines: ["Leather", "Elements"], + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 10, noSummon: true}, {name: "RopeRune", weight: 2, noSummon: true}], + events: [ + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Belts", time: 14, power: 1, chance: 0.5, aoe: 0.5}, + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Belts", aoe: 1.5, power: 1, chance: 1.0}, + ], + }, + + + {name: "RopeKraken", faction: "KinkyConstruct", clusterWith: "construct", tags: KDMapInit(["construct", "nosignal", "melee", "boss", "elite", "unflinching", "hunter"]), + Awareness: { + chaseradius: 15, + }, + Resistance: { + profile: ["rope", "construct"], + }, + maxblock: 3, + maxdodge: 0, + evasion: -1.4, armor: 1.5, + ignorechance: 0.75, followRange: 1, AI: "hunt", summon: [{enemy: "RopeMinion", range: 2.5, count: 4, strict: true}], + spells: ["RopeEngulf", "EnemyEnchantRope3", "SummonRopeTentacle"], spellCooldownMult: 0.5, spellCooldownMod: 0, ignoreflag: ["kraken"], disarm: 0.25, + visionRadius: 9, maxhp: 40, minLevel: 3, weight:-31, movePoints: 4, attackPoints: 2, attack: "Spell", attackWidth: 1, attackRange: 1, power: 6, dmgType: "chain", + terrainTags: {"secondhalf":12, "lastthird":5, "boss": -80, "open": 20, "passage": -60, "ropeAnger": 20, "ropeRage": 40, "increasingWeight":0.5}, allFloors: true, shrines: ["Rope"], + events: [ + {trigger: "passout", type: "delete", chance: 1.0}, // All rope krakens vanish after you pass outevents: [ + {trigger: "spellCast", type: "ropeKrakenSummonTentacle"}, // Drain HP when casting + ], + dropTable: [{name: "StrongMagicRopeRaw", amount: 50, weight: 10}, {name: "Scissors", ignoreInInventory: true, weight: 2}, {name: "Knife", ignoreInInventory: true, weight: 5}, {name: "EnchKnife", ignoreInInventory: true, weight: 2}, {name: "ElfCrystal", weight: 3}]}, + {name: "RopeMinion", faction: "KinkyConstruct", tags: KDMapInit(["construct", "nosignal", "melee", "fireweakness", "minor","krakententacle"]), ignorechance: 0.75, followRange: 1, AI: "hunt", master: {type: "RopeKraken", range: 4}, ignoreflag: ["kraken"], dependent: true, + visionRadius: 10, + Awareness: { + chaseradius: 15, + }, + nopickpocket: true, + maxblock: 0, + maxdodge: 1, + Resistance: { + profile: ["rope", "construct"], + }, + dropTable: [{name: "WeakMagicRopeRaw", amount: 1, weight: 10},], + maxhp: 8, minLevel: 0, weight:-1000, movePoints: 1.5, attackPoints: 2, attack: "MeleePullWill", attackWidth: 1, attackRange: 1, power: 3, dmgType: "crush", noAlert: true, + terrainTags: {}, allFloors: true, shrines: ["Rope"]}, + + + {name: "SlimeKraken", faction: "Slime", clusterWith: "slime", color: "#aa0088", tags: KDMapInit(["slime", "boss", "unflinching", "melee", "slimeRestraints", "meleeresist", "chainimmune", "electricweakness", "acidresist", "iceweakness", "hunter"]), + Animations: ["squishy"], + Awareness: { + chaseradius: 15, + }, + effect: { + effect: {name: "SlimeEngulf", power: 4}, + }, + Sound: { + idleSoundName: "SlimeLarge2", + }, + Resistance: { + profile: ["slime"], + }, + maxblock: 0, + maxdodge: 0, + nonDirectional: true, + regen: 0.1, + evasion: -1.5, + nopickpocket: true, + ignorechance: 0.75, followRange: 1, AI: "hunt", + spells: ["SummonSlimeMinion"], spellCooldownMult: 1, spellCooldownMod: 0, ignoreflag: ["kraken"], disarm: 0.25, + visionRadius: 7.5, maxhp: 30, minLevel: 3, weight:-31, movePoints: 4, attackPoints: 3, attack: "MeleeWillBindEffectSpell", attackWidth: 3, attackRange: 1.5, power: 6, dmgType: "glue", + terrainTags: {"secondhalf":12, "lastthird":5, "boss": -40, "open": 20, "passage": -60, "alchemist": 20, "latexAnger": 20, "latexRage": 40, "increasingWeight":0.5}, allFloors: true, shrines: ["Rope"], + events: [ + {trigger: "spellCast", type: "slimeKrakenSummonMinion"}, // Drain HP when casting + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "Slime", aoe: 1.5, power: 3, chance: 1.0, duration: 20}, + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Slime", time: 25, power: 3, chance: 1.0, aoe: 1.5} + ], + ondeath: [{type: "spellOnSelf", spell: "WitchSlime"}], + dropTable: [{name: "SlimeRaw", amountMin: 40, amountMax: 50, weight: 1}, {name: "Slimethrower", weight: 30, ignoreInInventory: true}, {name: "StaffDoll", weight: 40, ignoreInInventory: true}, {name: "StaffGlue", weight: 130, ignoreInInventory: true}]}, + + {name: "SarcoKraken", faction: "KinkyConstruct", clusterWith: "construct", color: "#3b7d4f", tags: KDMapInit(["construct", "nosignal", "poisonresist", "soulimmune", "melee", "boss", "elite", "unflinching", "fireresist", "crushweakness", "chainweakness", "glueweakness", "hunter"]), + armor: 3.0, spellResist: 1.5, + evasion: -2.0, + maxblock: 2, + blockAmount: 2.5, + maxdodge: 0, + nopickpocket: true, + ignorechance: 0.75, followRange: 1, AI: "hunt", summon: [{enemy: "SarcoMinion", range: 2.5, count: 3, strict: true}], + spells: ["SarcoHex", "SummonSarcoTentacle"], spellCooldownMult: 1, spellCooldownMod: 0, ignoreflag: ["kraken"], + events: [ + {trigger: "spellCast", type: "sarcoKrakenSummonTentacle"}, // Drain HP when casting + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "FabricGreen", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, + ], + visionRadius: 10, maxhp: 34, minLevel: 0, weight:-11, movePoints: 4, attackPoints: 3, attack: "SpellMeleePull", attackWidth: 1.5, attackMinRange: 1.5, attackRange: 6, power: 4, pullDist: 4, pullTowardSelf: true, dmgType: "charm", + terrainTags: {"secondhalf":16, "lastthird":5, "boss": -10, "open": 20, "passage": -60, "increasingWeight":1}, floors: KDMapInit(["tmb"]), shrines: [], + dropTable: [{name: "MysticDuctTapeRaw", amountMin: 25, amountMax: 50, weight: 12}], + }, + {name: "SarcoMinion", faction: "KinkyConstruct", color: "#99ff99", tags: KDMapInit(["construct", "nosignal", "poisonresist", "soulimmune", "melee", "fireweakness", "minor", "slashweakness", "chainresist", "sarcotentacle", "mummyRestraints"]), + ignorechance: 0.75, followRange: 1, AI: "hunt", master: {type: "SarcoKraken", range: 7}, ignoreflag: ["kraken"], dependent: true, suicideOnAdd: true, + visionRadius: 10, maxhp: 5, minLevel: 0, weight:-1000, movePoints: 1, attackPoints: 2, attack: "MeleeBindSuicide", attackWidth: 1, attackRange: 1, power: 2, fullBoundBonus: 2, dmgType: "chain", noAlert: true, + events: [ + {trigger: "afterDamageEnemy", type: "bleedEffectTile", kind: "FabricGreen", aoe: 1.5, power: 1, chance: 1.0, duration: 20}, + ], + nopickpocket: true, + maxblock: 0, + maxdodge: 0, + dropTable: [{name: "MysticDuctTapeRaw", amount: 1, weight: 12}], + terrainTags: {}, allFloors: true, shrines: ["Rope"]}, + + + {name: "Dollsmith", nameList: "cyborg", outfit: "DollsmithDoll", style: "Fire", faction: "Enemy", clusterWith: "smithdoll", bound: "FactoryDoll", playLine: "Robot", color: "#ff3388", + applyFaction: "Dollsmith", + tags: KDMapInit(["leashing", "dollsmith", "doll", "opendoors", "closedoors", "jail", "jailer", "melee", "elite", "antiMagic", "glueresist", "crushresist", "electricresist", "handcuffer", "iceweakness", "blacksteelRestraints", "blacksteelCuffs", "teasetoys"]), + spellResist: 1.0, armor: 1.0, + followLeashedOnly: true, followRange: 1, + spells: ["RubberBolt"], spellCooldownMult: 2, spellCooldownMod: 0, + Security: { + level_key: 3, + level_tech: 1, + }, + preferBlock: true, + Behavior: { + thorough: 0.6, + ensurePlayerTagArousal: ["ChastityUpper", "ChastityLower"], + }, + stamina: 6, + RestraintFilter: { + bonusRestraints: 2, + requiredItems: ["BlacksteelBelt", "BlacksteelBra"], + }, + summon: [{enemy: "DollsmithDoll", range: 2.5, count: 1, strict: true}, {enemy: "DollsmithDoll", range: 2.5, count: 1, chance: 0.5, strict: true}], + specialCD: 6, specialAttack: "WillBind", specialRemove: "Lock", specialExtraTags: ["redLatexBasic"], specialRemoveTags: ["blacksteelRestraints", "blacksteelCuffs", "leashing", "teasetoys"], + specialAttackPoints: 2, specialWidth: 3, specialMsg: true, specialCondition: "canRestrainWithExtra", specialCDonAttack: true, specialIgnoreStam: true, + attackLock: "Red", + AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 14, minLevel:3, weight:15, movePoints: 2, + attackPoints: 2, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1.5, + terrainTags: {"increasingWeight":1, "dollsmith": 5}, floors:KDMapInit(["bel"]), shrines: ["Metal", "Latex"], + + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "KeyCard", weight: 1}]}, + + {name: "Dollmaker", nameList: "cyborg", outfit: "DollmakerApprentice", style: "Water", faction: "Enemy", clusterWith: "smithdoll", bound: "FactoryDoll", playLine: "Robot", color: "#ff88ff", + applyFaction: "Dollsmith", + tags: KDMapInit(["leashing", "dollsmith", "doll", "opendoors", "closedoors", "jail", "antiMagic", "jailer", "ranged", "miniboss", "antiMagic", + "imprisonable", + "glueresist", "electricresist", "crushresist", "iceweakness", "blacksteelchastity", "latexEncase", "teasetoys"]), + spellResist: 1.5, armor: 0.5, + followLeashedOnly: true, followRange: 1.5, dontKiteWhenDisabled: true, kite: 4.5, noKiteWhenHarmless: true, + spells: ["RubberBolt", "EncaseBolt", "DollConvert", "DollBoost", "EnemyCM1"], + unlockCommandLevel: 2, unlockCommandCD: 30, spellCooldownMult: 1, spellCooldownMod: -1, buffallies: true, projectileTargeting: true, bypass: true, + Security: { + level_key: 3, + level_tech: 1, + }, + stamina: 2, + Behavior: { + thorough: 0.6, + ensurePlayerTagArousal: ["ChastityUpper", "ChastityLower"], + }, + RestraintFilter: { + bonusRestraints: 2, + requiredItems: ["BlacksteelBelt", "BlacksteelBra"], + }, + useLock: "Purple", + specialAttack: "WillBind", specialCD: 5, specialExtraTags: ["redLatexBasic"], specialRemoveTags: ["blacksteelchastity", "latexEncase", "leashing", "teasetoys"], + specialAttackPoints: 2, specialWidth: 3, specialMsg: true, specialCondition: "canRestrainWithExtra", specialCDonAttack: true, specialIgnoreStam: true, + AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 14, minLevel:5, weight:10, movePoints: 2.4, + attackPoints: 3, attack: "SpellMeleeBindWill", attackWidth: 1, attackRange: 1, power: 4, dmgType: "glue", + terrainTags: {"increasingWeight":1, "dollsmith": 5, "latexOptout": -9}, floors:KDMapInit(["bel"]), shrines: ["Metal", "Latex"], + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "StaffDoll", ignoreInInventory: true, weight: 100}, {name: "KeyCard", weight: 4}]}, + + {name: "DollsmithDoll", nameList: "cyborg", outfit: "DollsmithDoll", style: "Water", faction: "Enemy", clusterWith: "dollsmith", bound: "EncasedFactoryDoll", playLine: "Gagged", color: "#ff3388", + applyFaction: "Dollsmith", + tags: KDMapInit(["opendoors", "doll", "smithdoll", "submissive", "noshop", "gagged", "alwaysAlert", "imprisonable", "minor", "ignorenoSP", "melee", "noarms", + "glueresist", "electricresist", "ticklesevereweakness", "chainresist", "charmweakness", "crushresist"]), + ignorechance: 0, armor: 1, spellResist: 1.0, followRange: 1, AI: "hunt", cohesion: 0.9, events: [ + {trigger: "tick", type: "secretToy"}, + ], + nopickpocket: true, + stamina: 4, + master: {type: "Dollsmith", range: 2.5, loose: true, aggressive: true}, + sneakThreshold: 2.5, difficulty: 0.05, + ignoreflag: ["dollSmithDoll"], failAttackflag: ["dollSmithDoll"], + visionRadius: 7.5, maxhp: 8, minLevel:0, weight:4, movePoints: 1.5, + attackPoints: 3, attack: "MeleeWillSlow", attackWidth: 3, attackRange: 1, power: 2, dmgType: "charm", + terrainTags: {"latexAnger": 3, "latexRage": 3, "metalAnger": 3, "metalRage": 3, "smithdoll": 40}, + shrines: ["Metal"], floors:KDMapInit(["bel"])}, + + + {name: "Rat", faction: "Beast", tags: KDMapInit(["ignorenoSP", "beast", "darkvision", "melee", "minor"]), followRange: 1, AI: "guard", squeeze: true, + visionRadius: 4, maxhp: 1, evasion: 0.5, minLevel:0, weight:8, movePoints: 1.5, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 1, dmgType: "pain", + terrainTags: {"rubble":20, "increasingWeight":-5}, floors:KDMapInit(["grv"])}, + {name: "Bat", faction: "Beast", tags: KDMapInit(["ignorenoSP", "beast", "darkvision", "melee", "minor", "chainresist", "flying"]), followRange: 1, AI: "guard", squeeze: true, ethereal: true, + visionRadius: 4, maxhp: 1, evasion: 0.5, minLevel:0, weight:4, movePoints: 1, attackPoints: 1, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 1, dmgType: "pain", + terrainTags: {"rubble":20, "increasingWeight":-5}, floors:KDMapInit(["jng"])}, + + {name: "Apprentice", nameList: "witch", outfit: "ApprenticeBlue", style: "Air", faction: "Apprentice", color: "#9563ff", spellWhileParole: true, bound: "Apprentice", playLine: "Apprentice", + tags: KDMapInit(["leashing", "mage", "opendoors", "rope", "binding", + "jail", "human", "imprisonable", "shadowclan", "closedoors", "apprentice", "ropeRestraints", "antiMagic", "ranged", "glueweakness", "chainweakness", "tickleweakness", "search", "jailer", "jail"]), followRange: 2, + castWhileMoving: true, spells: ["RopeEngulfWeak", "EnemyEnchantRope", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, cohesion: 1.0, followLeashedOnly: true, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 5, maxhp: 8, minLevel:2, weight:10, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"secondhalf":3, "lastthird":3, "increasingWeight": -1, "apprentice": 4, "rope": 4, "magical": 4}, allFloors: true, shrines: ["Elements"], + attackLock: "White", + stamina: 2, + maxblock: 0, + maxdodge: 0, + dropTable: [{name: "RedKey", weight: 1}, {name: "Nothing", weight: 29}]}, + {name: "Apprentice2", nameList: "witch", outfit: "ApprenticeRed", style: "Earth", faction: "Apprentice", color: "#ff1616", bound: "Apprentice2", playLine: "Apprentice", + tags: KDMapInit(["leashing", "mage", "opendoors", "leather", "binding", "human", + "jail", "imprisonable", "conjurer", "latexRestraints", "ropeRestraints", "closedoors", "apprentice", "ranged", "glueweakness", "chainweakness", "tickleweakness", "search"]), followRange: 2, + castWhileMoving: true, spells: ["SummonSingleTickleHand", "SummonEnemyGag", "SummonLock", "SummonCuff", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, cohesion: 1.0, followLeashedOnly: true, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 5.5, maxhp: 8, + minLevel:1, weight:6, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"secondhalf":3, "lastthird":3, "increasingWeight": -1, "apprentice": 4, "conjure": 4, "magical": 4}, allFloors: true, shrines: ["Conjure"], + attackLock: "White", + stamina: 2, + maxblock: 0, + maxdodge: 0, + dropTable: [{name: "RedKey", weight: 1}, {name: "Nothing", weight: 29}]}, + {name: "WitchApprentice", nameList: "witch", outfit: "ApprenticeBlue", style: "Earth", + faction: "Witch", color: "#812fcc", bound: "WitchApprentice", playLine: "Apprentice", + buffallies: true, + tags: KDMapInit(["leashing", "witchapprentice", "mage", "opendoors", "leather", + "jailer", + "binding", "human", "imprisonable", "conjurer", "leatherRestraintsMagic", "beltRestraintsMagic", + "closedoors", "apprentice", "ranged", "arcaneweakness", "tickleweakness", "search"]), followRange: 2, + castWhileMoving: true, spells: ["MagicBelt", "ShieldTheWitch", "EnemyEnchantRope", "EnemyCM1"], + unlockCommandLevel: 1, unlockCommandCD: 90, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, cohesion: 1.0, followLeashedOnly: true, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 5.5, maxhp: 10, + minLevel:2, weight:8, movePoints: 2, attackPoints: 3, + attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"secondhalf":3, "lastthird":3, "increasingWeight": -1, + "apprentice": 4, "witch": 15, "magical": 4}, allFloors: true, shrines: ["Elements"], + attackLock: "White", + stamina: 2, + maxblock: 0, + maxdodge: 0, + Magic: { + castCooldownUnique: { + ShieldTheWitch: 9, + }, + priority: { + EnemyCM1: 4, + ShieldTheWitch: 5, + EnemyEnchantRope: 3, + }, + }, + + dropTable: [{name: "RedKey", weight: 1}, {name: "Nothing", weight: 29}]}, + {name: "ApprenticeSlime", nameList: "witch", outfit: "ApprenticeSlime", style: "Necromancer", faction: "Apprentice", color: "#FF00FF", bound: "ApprenticeSlime", playLine: "Apprentice", + tags: KDMapInit(["leashing", "mage", "opendoors", "binding", "human", "imprisonable", + "jail", + "conjurer", "latexRestraints", "closedoors", "apprentice", "ranged", "glueresist", + "chainweakness", "tickleweakness", "search"]), followRange: 2, + castWhileMoving: true, spells: ["SlimePuddle", "ManySlimes", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, cohesion: 1.0, followLeashedOnly: true, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 5, maxhp: 8, minLevel:2, weight:8, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, + terrainTags: {"secondhalf":3, "lastthird":3, "increasingWeight": -1, "apprentice": 4, "slime": 4, "slimeOptOut": -2, "slimePref": 2, "magical": 4}, allFloors: true, shrines: ["Latex"], + attackLock: "White", + stamina: 2, + maxblock: 0, + maxdodge: 0, + dropTable: [{name: "RedKey", weight: 1}, {name: "Nothing", weight: 29}]}, + + {name: "WitchRope", nameList: "witch", outfit: "WitchRope", style: "Earth", color: "#ffae70", faction: "Witch", clusterWith: "apprentice", bound: "WitchRope", playLine: "Witch", + tags: KDMapInit(["leashing", "mage", "guardCall", "jail", "rope", "jailer", "imprisonable", "opendoors", "ropeRestraints", "closedoors", "human", "witch", "ranged", "elite", "hunter"]), followRange: 2, + castWhileMoving: true, spells: ["WitchRope", "EnemyEnchantRope", "RopeEngulfWeak", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 10, minLevel:0, weight:4, movePoints: 3, attackPoints: 2, attack: "SpellMeleeBind", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, + terrainTags: {"secondhalf":1, "lastthird":2, "increasingWeight": -1, "ropeAnger": 6, "tech": -6, "rope": 6}, allFloors: true, shrines: ["Rope"], followLeashedOnly: true, + stamina: 2, + maxblock: 1, + maxdodge: 1, + Magic: { + castCooldownUnique: { + EnemyEnchantRope: 6, + }, + priority: { + EnemyEnchantRope: 8, + }, + }, + dropTable: [{name: "Gold", amountMin: 5, amountMax: 15, weight: 14, noSummon: true}, {name: "RopeRune", weight: 1, noSummon: true}]}, + + {name: "WitchShibari", nameList: "witch", outfit: "Bikini", style: "Earth", color: "#ffae70", faction: "Witch", clusterWith: "apprentice", bound: "WitchRope", playLine: "Witch", tags: KDMapInit(["leashing", "mage", "guardCall", "jail", "rope", "jailer", "imprisonable", "opendoors", "ropeRestraints", "closedoors", "human", "witch", "ranged", "miniboss", "hunter"]), followRange: 2, + castWhileMoving: true, spells: ["WitchRopeBoltLaunchMany", "EnemyEnchantRope2", "RopeEngulfWeak", "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 20, stopToCast: true, spellRdy: true, kite: 2.5, kiteChance: 0.9, + spellCooldownMult: 0.7, spellCooldownMod: 0, AI: "hunt", guardChance: 0.2, visionRadius: 7, maxhp: 12, minLevel:2, weight:1, movePoints: 2.2, attackPoints: 2, attack: "EffectSpellMeleeBind", attackWidth: 2.5, attackRange: 1, power: 3, dmgType: "charm", fullBoundBonus: 3, + terrainTags: {"secondhalf":0, "lastthird":1.5, "increasingWeight": -1, "ropeAnger": 8, "tech": -1, "rope": 4}, allFloors: true, shrines: ["Rope"], followLeashedOnly: true, + stamina: 5, + maxblock: 1, + effect: { + effect: {name: "Disrobe"}, + }, + Magic: { + castCooldownUnique: { + WitchRopeBoltLaunchMany: 20, + EnemyEnchantRope2: 4, + }, + priority: { + WitchRopeBoltLaunchMany: 10, + EnemyEnchantRope2: 8, + }, + }, + maxdodge: 2, + evasion: 0.3, + dropTable: [{name: "Gold", amountMin: 15, amountMax: 25, weight: 3, noSummon: true}, {name: "RopeRune", weight: 7, noSummon: true}]}, + + {name: "WitchFlame", nameList: "witch", outfit: "WitchFlame", style: "Fire", faction: "Witch", clusterWith: "elemental", bound: "WitchFlame", playLine: "Witch", color: "#d30000", tags: KDMapInit(["leashing", "mage", "guardCall", "jail", "jailer", "imprisonable", "opendoors", "handcuffer", "fire", "closedoors", "human", "witch", "ranged", "elite", "unflinching", "fireresist", "soapweakness", "iceweakness", "hunter"]), followRange: 2, + castWhileMoving: true, spells: ["HeatBolt", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 11, minLevel:0, weight:2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, + terrainTags: {"secondhalf":1, "lastthird":2, "elementsAnger": 6, "tech": -6, "fire": 4}, allFloors: true, shrines: [], followLeashedOnly: true, + attackLock: "White", + stamina: 2, + maxblock: 0, + maxdodge: 1, + events: [{trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ff8933"}], + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}], + }, + {name: "WitchIce", nameList: "witch", outfit: "WitchIce", style: "Ice", faction: "Witch", clusterWith: "elemental", bound: "WitchIce", playLine: "Witch", color: "#73efe8", tags: KDMapInit(["leashing", "mage", "guardCall", "jail", "jailer", "imprisonable", "opendoors", "handcuffer", "ice", "closedoors", "human", "witch", "ranged", "elite", "unflinching", "crushweakness", "fireweakness", "soapresist", "iceresist", "slashresist", "hunter"]), followRange: 2, + castWhileMoving: true, spells: ["WitchIcebolt", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 11, minLevel:2, weight:2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, + terrainTags: {"secondhalf":1, "lastthird":2, "elementsAnger": 6, "tech": -6, "ice": 6, "water": 2}, allFloors: true, shrines: [], followLeashedOnly: true, + attackLock: "White", + stamina: 2, + maxblock: 2, + maxdodge: 0, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}], + }, + {name: "WitchEarth", nameList: "witch", outfit: "WitchEarth", style: "Earth", faction: "Witch", clusterWith: "elemental", bound: "WitchEarth", playLine: "Witch", color: "#f8c53a", tags: KDMapInit(["leashing", "mage", "guardCall", "jail", "jailer", "imprisonable", "opendoors", "handcuffer", "earth", "closedoors", "human", "witch", "ranged", "elite", "unflinching", "crushresist", "stunweakness", "iceweakness", "fireresist", "hunter", "slashresist", "pierceresist", "shackleRestraints"]), followRange: 1, + castWhileMoving: true, spells: ["WitchBoulder", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.7, visionRadius: 7, maxhp: 14, minLevel:2, weight:2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, + terrainTags: {"secondhalf":1, "lastthird":2, "elementsAnger": 6, "tech": -6, "earth": 4}, allFloors: true, shrines: [], followLeashedOnly: true, + attackLock: "White", + stamina: 2, + maxblock: 2, + maxdodge: 0, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}], + }, + {name: "WitchWater", nameList: "witch", outfit: "WitchWater", style: "Water", faction: "Witch", clusterWith: "elemental", bound: "WitchWater", playLine: "Witch", color: "#4572e3", tags: KDMapInit(["leashing", "mage", "guardCall", "jailer", "opendoors", "imprisonable", "handcuffer", "water", "closedoors", "human", "witch", "ranged", "elite", "unflinching", "fireresist", "acidresist", "soapresist", "electricsevereweakness", "pierceresist", "hunter", "latexRestraints"]), followRange: 1, + castWhileMoving: true, spells: ["WitchWaterBall", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, evasion: 0.25, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 11, minLevel:0, weight:2, movePoints: 3, attackPoints: 4, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, + terrainTags: {"secondhalf":1, "lastthird":2, "elementsAnger": 6, "tech": -6, "water": 6, "ice": 2}, allFloors: true, shrines: [], followLeashedOnly: true, + attackLock: "White", + stamina: 2, + maxblock: 0, + maxdodge: 2, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}], + }, + {name: "WitchAqua", nameList: "witch", outfit: "WitchWater", style: "Water", faction: "Witch", clusterWith: "elemental", bound: "WitchWater", playLine: "Witch", color: "#4572e3", + tags: KDMapInit(["leashing", "mage", "guardCall", "jailer", "opendoors", "imprisonable", "handcuffer", "water", "closedoors", "human", "witch", "ranged", "miniboss", "unflinching", "fireresist", "acidresist", "soapresist", "electricsevereweakness", "pierceresist", "hunter", "latexRestraints"]), + followRange: 1, dontKiteWhenDisabled: true, kite: 2.5, + castWhileMoving: true, spells: ["WitchWaterBall", "EnemyCM1", "BubbleBurst"], unlockCommandLevel: 1, unlockCommandCD: 12, stopToCast: true, spellRdy: true, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 20, + Magic: { + castCooldownUnique: { + WitchWaterBall: 2, + }, + }, + minLevel:3, weight:2, movePoints: 3, attackPoints: 4, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, + terrainTags: {"secondhalf":2, "lastthird":1, "bubbleOptout": -5, "bubblePref": 5, "elementsAnger": 6, "tech": -4, "water": 4, "ice": 2}, allFloors: true, shrines: [], followLeashedOnly: true, + attackLock: "White", + stamina: 5, + maxblock: 0, + maxdodge: 0, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}], + }, + + + + {name: "WitchShock", nameList: "witch", outfit: "WitchShock", style: "Air", faction: "Witch", clusterWith: "apprentice", bound: "Witch", playLine: "Witch", + tags: KDMapInit(["leashing", "mage", "opendoors", "antiMagic", "handcuffer", "electric", "jail", "jailer", "closedoors", "human", "witch", "ranged", "miniboss", "unflinching", "electricresist", "glueweakness", "iceweakness", "hunter"]), followRange: 2, + castWhileMoving: true, spells: ["WitchElectrify", "WitchElectricOrb", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 12, stopToCast: true, spellRdy: true, kite: 1.5, kiteChance: 0.9, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 15, minLevel:3, weight:2, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 3, + terrainTags: {"secondhalf":2, "lastthird":1, "tech": -10, "electric": 6}, allFloors: true, shrines: [], followLeashedOnly: true, + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}], attackLock: "White", + maxblock: 0, + maxdodge: 1, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 2, color: "#8888ff"}, + {trigger: "afterEnemyTick", type: "electrifyLocal", power: 1, chance: 0.5, aoe: 1.5} + ], + }, + {name: "WitchMagnet", nameList: "science", outfit: "WitchMagnet", style: "Air", faction: "Witch", color: "#92e8c0", clusterWith: "apprentice", bound: "Witch", playLine: "Witch", tags: KDMapInit(["leashing", "mage", "opendoors", "antiMagic", "magnetCuffs", "electric", "metal", "jailer", "closedoors", "human", "witch", "ranged", "miniboss", "unflinching", "electricresist", "glueweakness", "iceweakness", "hunter"]), + castWhileMoving: true, spells: ["AreaElectrify", "WitchElectricOrb", "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 10, stopToCast: true, spellRdy: true, followRange: 1, + armor: 1, + maxblock: 0, + maxdodge: 1, + spellCooldownMult: 1, spellCooldownMod: -1, AI: "hunt", guardChance: 0.6, visionRadius: 8, maxhp: 24, minLevel:12, weight:1, movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLock", + attackWidth: 1, attackRange: 1, power: 1, dmgType: "electric", fullBoundBonus: 1, noLeashUnlessExhausted: true, attackLock: "Purple", + terrainTags: {"lastthird":1, "miniboss": -10, "tech": -10, "metalAnger": 4, "elementsAnger": 6, "increasingWeight": 0.5, "electric": 6}, allFloors: true, shrines: [], followLeashedOnly: true, + dropTable: [{name: "BlueKey", weight: 3}, {name: "ScrollArms", weight: 1}, {name: "ScrollVerbal", weight: 1}, {name: "ScrollLegs", weight: 1}], + RestraintFilter: { + requiredItems: ["MagneticArmCuffs", "MagneticAnkleCuffs"], + }, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 2, color: "#8888ff"}, + {trigger: "afterEnemyTick", type: "electrifyLocal", power: 1, aoe: 1.5}, + ], + }, + {name: "WitchChain", nameList: "witch", outfit: "WitchChain", style: "Earth", faction: "Witch", clusterWith: "bandit", bound: "WitchChain", playLine: "Witch", color: "#AAAAAA", tags: KDMapInit(["leashing", "mage", "opendoors", "fiddle", "antiMagic", "closedoors", "metal", "imprisonable", "jail", "jailer", "chainRestraints", "human", "witch", "melee", "miniboss", "unflinching", "electricweakness", "chainresist", "crushweakness", "meleeresist", "fireweakness", "hunter"]), + followRange: 1, spells: ["WitchChainBolt", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 12, spellRdy: true, + armor: 1, + maxblock: 2, + maxdodge: 0, + spellCooldownMult: 2, spellCooldownMod: 2, AI: "hunt", guardChance: 0.6, visionRadius: 6, maxhp: 18, minLevel:3, weight:2, movePoints: 3, disarm: 0.33, + attackPoints: 3, attack: "MeleeLockAllBindSpell", attackWidth: 2.5, attackRange: 1, tilesMinRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 3, multiBind: 2, attackLock: "Red", + terrainTags: {"secondhalf":3, "lastthird":3, "tech": -10, "metal": 6}, allFloors: true, shrines: [], + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}]}, + {name: "WitchMetal", nameList: "dragonheart", outfit: "WitchMetal", style: "Earth", faction: "Witch", clusterWith: "bandit", bound: "WitchChain", playLine: "Witch", color: "#AAAAAA", + tags: KDMapInit(["leashing", "opendoors", "closedoors", "jailer", "chainRestraints", "shackleRestraints", "fiddle", "mage", "handcuffer", "human", "antiMagic", "witch", "metal", "melee", "elite", "miniboss", "unflinching", "chainresist", "electricweakness", "crushweakness", "meleeresist", "fireweakness", "hunter"]), + armor: 2, + maxblock: 4, + maxdodge: 0, + followRange: 1, spells: ["ManyChains", "SummonChainWalls", "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 10, spellRdy: true, + spellCooldownMult: 1, spellCooldownMod: 2, AI: "hunt", guardChance: 0.6, visionRadius: 6, maxhp: 24, shield: 5, minLevel:9, weight:1, movePoints: 3, disarm: 0.33, + attackPoints: 3, attack: "MeleeLockAllBindSpell", attackWidth: 3, attackRange: 1, tilesMinRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 4, multiBind: 3, attackLock: "Purple", + terrainTags: {"lastthird":1, "miniboss": -10, "tech": -10, "metalAnger": 4, "metalFriendly": 6, "conjureAnger": 6, "increasingWeight": 0.5, "metal": 6}, allFloors: true, shrines: [], + dropTable: [{name: "BlueKey", weight: 3}, {name: "ScrollArms", weight: 1}, {name: "ScrollVerbal", weight: 1}, {name: "ScrollLegs", weight: 1}], + }, + {name: "WitchSlime", nameList: "witch", outfit: "WitchSlime", style: "Necromancer", faction: "Witch", clusterWith: "slime", bound: "WitchSlime", playLine: "Witch", + tags: KDMapInit(["leashing", "mage", "slimewalk", "slime", "opendoors", "closedoors", "witch", "jail", "jailer", "ranged", "miniboss", "antiMagic", + "unflinching", "slimeRestraints", "glueimmune", "acidweakness", "soapweakness", "electricweakness", "iceweakness", "hunter"]), squeeze: true, + followLeashedOnly: true, kite: 1.5, kiteChance: 0.9, followRange: 4, castWhileMoving: true, + spells: ["ManySlimes", "ManySlimes", "WitchSlimeBall", "WitchSlime", "BubbleBurstSlime", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 12, stopToCast: true, spellRdy: true, + spellCooldownMult: 2, spellCooldownMod: -7, AI: "hunt", guardChance: 0.6, visionRadius: 8, maxhp: 13, minLevel:3, weight:2, movePoints: 3, attackPoints: 3, attack: "Spell", attackWidth: 1, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 1, + attackLock: "Purple", + maxblock: 0, + maxdodge: 2, + terrainTags: {"secondhalf":2, "lastthird":1, "bubbleOptout": -2, "bubblePref": 2, "open": 4, "tech": -8, "slime": 4, "slimeOptOut": -2, "slimePref": 2}, allFloors: true, shrines: [], + events: [ + {trigger: "afterEnemyTick", type: "createEffectTile", kind: "Slime", time: 14, power: 1, chance: 0.5, aoe: 0.5}, + {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ff00ff"}, + ], + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}]}, + {name: "Necromancer", nameList: "chinese", outfit: "Necromancer", style: "Necromancer", faction: "Enemy", clusterWith: "skeleton", bound: "Necromancer", playLine: "Necromancer", + stamina: 2, + maxblock: 1, + maxdodge: 0, + tags: KDMapInit(["leashing", "guardCall", "opendoors", "jailer", "closedoors", "human", "witch", "antiMagic", "shadowclan", "velvetpact", + "ranged", "mage", "miniboss", "unflinching", "meleeweakness", "hunter"]), followRange: 1, cohesion: 0.9, + spells: ["SummonSkeleton", "SummonSkeletons", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 16, spellCooldownMult: 1, spellCooldownMod: 2, spellRdy: true, + AI: "hunt", guardChance: 0.6, visionRadius: 6, maxhp: 20, minLevel: 2, weight:3, movePoints: 3, attackPoints: 3, attack: "MeleeLockAllWillSpellBind", attackWidth: 1, attackRange: 1, power: 5, dmgType: "grope", + terrainTags: {"secondhalf":3, "lastthird":3, "miniboss": -7, "tech": -20, "velvet": 4, "skeleton": 3}, shrines: [], floors:KDMapInit(["cat", "jng", "tmb", "tmp"]), attackLock: "White", + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 14, noSummon: true}]}, + + {name: "HighWizard", nameList: "witch", outfit: "WitchShock", style: "Water", clusterWith: "mushroom", + bound: "HighWizard", faction: "Mushy", playLine: "Witch", color: "#a583ff", + tags: KDMapInit(["leashing", "mage", "mushy", "imprisonable", "opendoors", "closedoors", "human", "ranged", "unflinching", "hunter"]), squeeze: true, + stamina: 2, + maxblock: 0, + maxdodge: 0, + followLeashedOnly: true, kite: 1.5, kiteChance: 0.9, followRange: 4, castWhileMoving: true, spells: ["HighBolt", "Spores", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 12, stopToCast: true, spellRdy: true, + spellCooldownMult: 2, spellCooldownMod: 1, AI: "hunt", guardChance: 0.6, visionRadius: 6, maxhp: 13, minLevel:4, weight:12, movePoints: 2, attackPoints: 2, attack: "Spell", attackWidth: 1, attackRange: 1, power: 1, dmgType: "tickle", fullBoundBonus: 1, + terrainTags: {"secondhalf":2, "lastthird":1, "open": 4, "mushy": 5}, floors:KDMapInit(["cry"]), shrines: [], + dropTable: [{name: "Gold", amountMin: 10, amountMax: 20, weight: 9}]}, + {name: "Fungal", nameList: "space", outfit: "FunGal", style: "Water", clusterWith: "mushroom", bound: "HighWizard", faction: "Mushy", playLine: "Fungal", color: "#a583ff", tags: KDMapInit(["leashing", "guardCall", "mushy", "jail", "jailer", "opendoors", "closedoors", "mushroom", "ranged", "unflinching", "hunter", "glueresist"]), squeeze: true, + followLeashedOnly: true, kite: 1.5, kiteChance: 0.9, followRange: 4, castWhileMoving: true, spells: ["HighBolt", "CrystalPuff", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 30, stopToCast: true, spellRdy: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4.5, color: "#892fcc"}, + ], + maxblock: 2, + maxdodge: 0, + stamina: 2, + spellCooldownMult: 1, spellCooldownMod: 1, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 8, regen: 0.1, minLevel:3, weight:12, movePoints: 3, attackPoints: 3, attack: "SpellMeleeWillLockAll", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, + attackLock: "Purple", + terrainTags: {"secondhalf":2, "lastthird":1, "open": 4, "mushroom": 4, "mushy": 5}, floors:KDMapInit(["cry"]), shrines: [], + dropTable: [{name: "Gold", amountMin: 5, amountMax: 0, weight: 8}]}, + + + {name: "Dressmaker", nameList: "french", outfit: "Dressmaker", style: "Fire", clusterWith: "construct", bound: "Dressmaker", playLine: "Dressmaker", faction: "Dressmaker", color: "#f135a4", tags: KDMapInit(["leashing", "antiMagic", "ribbon", "dressmaker", "imprisonable", "kiguRestraints", "guardCall", "jail", "jailer", "conjurer", "acidweakness", "soapresist", "opendoors", "closedoors", "human", "ranged", "unflinching", "hunter", "dressRestraints"]), + RestraintFilter: { + requiredItems: ["BindingDress"], + }, + stamina: 3, + maxblock: 1, + maxdodge: 1, + followLeashedOnly: true, kite: 1.5, kiteChance: 0.3, followRange: 4, castWhileMoving: true, spells: ["Ribbons", "Ribbons", "Ribbons", "RibbonBurst", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, stopToCast: true, spellRdy: true, noKiteWhenHarmless: true, noSpellsWhenHarmless: true, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 13, minLevel:0, weight:-6, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", projectileTargeting: true, + attackWidth: 1, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 3, focusPlayer: true, attackLock: "Purple", + terrainTags: {"secondhalf":2, "lastthird":1, "open": 4, "dressmaker": 20, "conjureAnger": 5, "conjureRage": 4, "ropeAnger": 3, "ropeRage": 2}, allFloors: true, shrines: ["Conjure", "Rope"], + dropTable: [{name: "RibbonRaw", amount: 7, weight: 14}]}, + {name: "Nurse", outfit: "Nurse", style: "Earth", clusterWith: "construct", bound: "Nurse", playLine: "Nurse", faction: "Dressmaker", color: "#f135a4", + RestraintFilter: { + requiredItems: ["AsylumJacket"], + }, + stamina: 4, + maxblock: 2, + maxdodge: 0, + tags: KDMapInit(["leashing", "guardCall", "genericJailer", "dressmaker", "imprisonable", "leather", "jail", "jailer", "conjurer", "soapresist", "opendoors", "closedoors", "human", "ranged", "unflinching", "hunter", "nurseRestraints"]), + followLeashedOnly: true, kite: 1.5, kiteChance: 0.3, followRange: 4, castWhileMoving: true, spells: ["NurseBola", "NurseSyringe"], miscastmsg: "KDBanditMiscast", miscastsfx: "Miss", stopToCast: true, spellRdy: true, noKiteWhenHarmless: true, noSpellsWhenHarmless: true, dontKiteWhenDisabled: true, + spellCooldownMult: 1, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 11, minLevel:0, weight:-40, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindWillLock", projectileTargeting: true, + attackWidth: 1, attackRange: 1, power: 3, dmgType: "charm", fullBoundBonus: 3, focusPlayer: true, attackLock: "White", + terrainTags: {"secondhalf":2, "lastthird":1, "jailGuard": 50, "Guard": 50, "willAnger": 49, "willRage": 4, "ropeAnger": 3, "ropeRage": 2, "dressmaker": 50, "NoNurse": -10000}, allFloors: true, shrines: ["Will", "Rope"], + events: [ + {trigger: "afterEnemyTick", type: "nurseAura", power: 0.1, dist: 2.59}, + + ], + dropTable: [{name: "Gold", amountMin: 5, amountMax: 15, weight: 14, noSummon: true}]}, + + + + {name: "Librarian", nameList: "cyborg", outfit: "Librarian", style: "Water", clusterWith: "construct", bound: "Librarian", playLine: "Librarian", faction: "Dressmaker", color: "#f135a4", + tags: KDMapInit(["leashing", "mage", "ice", "metal", "rubber", "vine", "electric", "dressmaker", "miniboss", "jailer", "acidweakness", "soapweakness", "antiMagic", "conjurer", "opendoors", "closedoors", "human", "ranged", "unflinching", "hunter", "lowWeightRibbons", "magicRibbonsHarsh", "gagSpell", "mittensSpell"]), + followLeashedOnly: true, kite: 1.5, kiteChance: 0.3, followRange: 4, castWhileMoving: true, spells: [ + "SummonBookSlime", + "SummonBookIce", + "SummonBookNature", + "SummonBookForbidden", + "SummonBookArcane", + "SummonBookCelestial", + "SummonBookElectric", + "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 12, stopToCast: true, spellRdy: true, noKiteWhenHarmless: true, noSpellsWhenHarmless: true, + evasion: -0.4, + maxblock: 3, + maxdodge: 0, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#ffffff"}, + ], + spellCooldownMult: 0.7, spellCooldownMod: 0, AI: "hunt", guardChance: 0.6, visionRadius: 10, maxhp: 12, spellResist: 2.0, minLevel:0, weight: -12, movePoints: 2, attackPoints: 2, attack: "SpellMeleeBindLockAll", projectileAttack: true, + attackWidth: 1, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 3, focusPlayer: true, attackLock: "Purple", + terrainTags: {"secondhalf":2, "lastthird":1, "open": 10, "miniboss": -5, "dressmaker": 12, "elementsAnger": 7, "elementsRage": 5}, allFloors: true, shrines: ["Conjure", "Elements"], + dropTable: [{name: "ScrollArms", weight: 2}, {name: "ScrollVerbal", weight: 2}, {name: "ScrollLegs", weight: 2}, {name: "ScrollPurity", weight: 1}]}, + + {name: "MummyCursed", nameList: "bast", outfit: "Mummy", style: "Mummy", bound: "MummyCursed", nopickpocket: true, color: "#55ff55", playLine: "GaggedMummy", faction: "Bast", tags: KDMapInit(["mimicBlock", "mummyTrap", "gagged", "removeDoorSpawn", "ignoreharmless", "darkvision", "mummy", "melee", "elite", "mummyRestraints", "soapweakness", "fireweakness", "meleeweakness", "charmweakness"]), + evasion: -0.25, ignorechance: 1.0, armor: 0, followRange: 1, AI: "ambush", difficulty: 0.05, guardChance: 0, events: [ + {trigger: "tick", type: "secretToy"}, + ], + stamina: 2, + Resistance: { + profile: ["catgirl"], + }, + maxblock: 0, + maxdodge: 0, + GFX: { + lighting: true, + }, + visionRadius: 10, ambushRadius: 2.01, blindSight: 10, maxhp: 12, minLevel:0, weight:5, movePoints: 1, attackPoints: 2, attack: "MeleeBind", attackWidth: 1, attackRange: 1, power: 2, dmgType: "charm", fullBoundBonus: 1, + terrainTags: {"secondhalf":5, "mummyTrap": 50, "lastthird":5, "door": 50}, floors:KDMapInit(["tmb"]), shrines: ["Will"], + dropTable: [{name: "MysticDuctTapeRaw", amount: 4, weight: 25}]}, + + + {name: "Mummy", nameList: "bast", outfit: "Mummy", style: "Mummy", clusterWith: "mummy", bound: "Mummy", faction: "Bast", color: "#55ff55", tags: KDMapInit(["leashing", "religious", "antiMagic", "darkvision", "opendoors", "closedoors", "jail", "jailer", "mummy", "melee", "elite", "mummyRestraints", "fireweakness", "soapweakness", "hunter"]), followLeashedOnly: true, followRange: 1, + spells: ["MummyBolt", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, specialCD: 3, specialAttack: "BindLock", playLine: "Mummy", spellCooldownMult: 1, spellCooldownMod: 5, specialAttackPoints: 2, specialWidth: 3, spellRdy: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3, color: "#4fd658"}, + ], + maxblock: 1, + maxdodge: 1, + stamina: 4, + Resistance: { + profile: ["catgirl"], + }, + attackLock: "Purple", + AI: "hunt", guardChance: 0.6, visionRadius: 7, maxhp: 8, minLevel:3, weight:18, movePoints: 2, attackPoints: 1, attack: "SpellMeleeWill", attackWidth: 1, attackRange: 1, power: 2, fullBoundBonus: 1, dmgType: "crush", + terrainTags: {"secondhalf":2, "lastthird":4, "open": 2, "increasingWeight":1, "mummy": 4}, + floors:KDMapInit(["tmb"]), shrines: ["Will"], + dropTable: [{name: "Gold", amountMin: 15, amountMax: 20, weight: 10}, {name: "MysticDuctTapeRaw", amount: 15, weight: 4}]}, + {name: "Cleric", nameList: "bast", outfit: "Cleric", style: "Mummy", clusterWith: "mummy", bound: "Cleric", faction: "Bast", playLine: "Mummy", color: "#4fd658", tags: KDMapInit(["leashing", "religious", "opendoors", "closedoors", "mummy", "ranged", "search", "fireweakness", "soapweakness"]), + followLeashedOnly: true, followRange: 4, attackThruBars: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 2, color: "#4fd658"}, + ], + maxblock: 0, + maxdodge: 1, + stamina: 2, + Resistance: { + profile: ["catgirl"], + }, + spells: ["ClericBeam", "EnemyCM1"], unlockCommandLevel: 1, unlockCommandCD: 90, spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, kite: 1.5, kiteChance: 0.9, + attackPoints: 3, attack: "Spell", attackWidth: 1, attackRange: 1, power: 3, dmgType: "fire", + AI: "guard", visionRadius: 7, maxhp: 8, minLevel:0, weight:13, movePoints: 1.5, fullBoundBonus: 1, + terrainTags: {"secondhalf":0, "lastthird":1, "passage": -99, "open": 4, "mummy": 5}, floors:KDMapInit(["tmb"]), + shrines: ["Will"], dropTable: [{name: "MysticDuctTapeRaw", amount: 5, weight: 25}]}, + {name: "ClericHigh", nameList: "bast", outfit: "Cleric", style: "Mummy", clusterWith: "mummy", bound: "Cleric", + faction: "Bast", playLine: "Mummy", color: "#4fd658", + tags: KDMapInit(["leashing", "religious", "opendoors", "closedoors", "mummy", "ranged", "search", + "miniboss", + "fireweakness", "soapweakness"]), + followLeashedOnly: true, followRange: 2, attackThruBars: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 4, color: "#4fd658"}, + ], + ondeath: [{type: "spellOnSelf", spell: "HexLatexExplosion"}], + maxblock: 0, + maxdodge: 1, + stamina: 2, + Resistance: { + profile: ["catgirl"], + }, + Magic: { + priority: { + HexOrb: 10, + }, + }, + spells: ["ClericBeamMulti", "HexOrb", "EnemyCM1"], unlockCommandLevel: 2, unlockCommandCD: 30, + spellCooldownMult: 1, spellCooldownMod: 0, stopToCast: true, kite: 1.5, kiteChance: 0.9, + spellResist: 1.0, + attackPoints: 3, attack: "MeleeBindLockSpell", attackWidth: 2.5, attackRange: 1, power: 3, dmgType: "chain", + AI: "hunt", visionRadius: 8, maxhp: 16, minLevel:3, weight:10, movePoints: 1.8, fullBoundBonus: 1, + blindSight: 2, + terrainTags: {"secondhalf":0, "lastthird":1, "passage": -99, "open": 14, "mummy": 5}, floors:KDMapInit(["tmb"]), + shrines: ["Will"], dropTable: [{name: "MysticDuctTapeRaw", amount: 25, weight: 50}]}, + {name: "MeleeCleric", nameList: "bast", outfit: "Cleric", style: "Mummy", clusterWith: "mummy", bound: "MeleeCleric", playLine: "Mummy", faction: "Bast", tags: KDMapInit(["leashing", "darkvision", "opendoors", "closedoors", "mummy", "imprisonable", "melee", "kittyRestraints", "jail", "jailer", "search", "fireweakness", "soapweakness"]), + followRange: 1, blindSight: 2.5, specialCD: 5, specialAttack: "BindLock", + armor: 1, + stamina: 6, + Resistance: { + profile: ["catgirl"], + }, + maxblock: 2, + maxdodge: 1, + attackLock: "White", + AI: "hunt", guardChance: 0.6, visionRadius: 6, maxhp: 8, minLevel:0, weight:15, movePoints: 1.5, attackPoints: 2, attack: "MeleeWill", attackWidth: 1, attackRange: 1, power: 2, fullBoundBonus: 2, dmgType: "grope", + terrainTags: {"secondhalf":0, "lastthird":-2, "mummy": 6}, floors:KDMapInit(["tmb"]), + shrines: ["Will"], dropTable: [{name: "MysticDuctTapeRaw", amount: 5, weight: 25}]}, + + {name: "Jailer", outfit: "Jailer", style: "Earth", bound: "Jailer", tags: KDMapInit(["leashing", "opendoors", "closedoors", "antiMagic", "jail", "jailer", "genericJailer", "melee", "shackleRestraints", "guardCall", "jailRestraints"]), keys: true, followRange: 1, AI: "patrol", + visionRadius: 6, maxhp: 12, minLevel: -1, weight:0, movePoints: 1, attackPoints: 3, attack: "MeleeBindLockWill", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", fullBoundBonus: 2, + stamina: 3, + maxblock: 1, + maxdodge: 0, + terrainTags: {"jailGuard": 15, "Guard": 1}, allFloors: true, disarm: 0.5, evasion: -0.5, focusPlayer: true, attackLock: "White", + dropTable: [{name: "Pick", weight: 15}, {name: "RedKey", weight: 5}]}, + {name: "Chef", nameList: "italian", outfit: "Chef", style: "Fire", bound: "Jailer", tags: KDMapInit(["leashing", "ignoregagged", "opendoors", "closedoors", "melee", "ballGagRestraintsMagic"]), followRange: 1, AI: "hunt", + visionRadius: 6, maxhp: 24, minLevel: -1, weight:-1000, movePoints: 1.4, armor: 1.5, + stamina: 6, + maxblock: 5, + maxdodge: 0, + RestraintFilter: { + unlimitedRestraints: true, + }, + attackPoints: 2, attack: "MeleeBind", attackWidth: 2.5, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {}, allFloors: true, disarm: 0.33, evasion: -0.5, focusPlayer: true, + useLock: "Blue", + dropTable: [{name: "Brownies", weight: 15}]}, + {name: "Guard", outfit: "Jailer", style: "Ice", bound: "Guard", tags: KDMapInit(["leashing", "opendoors", "closedoors", "antiMagic", "miniboss", "jail", "jailer", "melee", "shackleRestraints", "jailRestraints", "guardCall"]), noDisplace: false, keys: true, followRange: 1, AI: "guard", visionRadius: 6, disarm: 0.5, + maxhp: 12, minLevel: -1, weight:-1000, movePoints: 1, attackPoints: 3, attack: "MeleeBindLockWill", attackWidth: 1, attackRange: 1, power: 2, dmgType: "grope", + fullBoundBonus: 2, evasion: -0.5, focusPlayer: true, attackLock: "White", + stamina: 2, + maxblock: 1, + maxdodge: 0, + RemoteControl: { + punishRemote: 3, + punishRemoteChance: 0.15, + }, + events: [ + {trigger: "defeat", type: "delete", chance: 1.0}, + ], + terrainTags: {"Guard": 1010}, allFloors: true, dropTable: [{name: "RedKey", weight: 1}]}, + {name: "GuardHeavy", nameList: "russian", outfit: "Jailer", style: "Air", bound: "GuardHeavy", tags: KDMapInit(["leashing", "opendoors", "closedoors", "antiMagic", "jail", "jailer", "melee", "unflinching", "hunter", "guardCall", "miniboss", "shackleRestraints", "handcuffer", "jailRestraints"]), noDisplace: false, disarm: 0.5, + keys: true, followRange: 1, AI: "guard", visionRadius: 7, armor: 1.5, maxhp: 12, minLevel: 4, weight:-20, movePoints: 1, attackPoints: 2, evasion: -0.5, focusPlayer: true, + attack: "MeleeBindLockWillStun", attackWidth: 3, attackRange: 1, power: 5, dmgType: "electric", stunTime: 1, attackLock: "Red", + RemoteControl: { + punishRemote: 4, + punishRemoteChance: 0.2, + }, + maxblock: 2, + maxdodge: 1, + stamina: 3, + events: [ + {trigger: "defeat", type: "delete", chance: 1.0}, + ], + terrainTags: {"jailGuard": 22, "increasingWeight": 1, "jailbreak": 28}, allFloors: true, dropTable: [{name: "RedKey", weight: 1}]}, + + + // Minibosses + {name: "BanditMerchant", nameList: "french", outfit: "BanditChief", style: "Bandit", faction: "Bandit", clusterWith: "bandit", playLine: "Bandit", bound: "BanditChief", + tags: KDMapInit([ + "opendoors", "cacheguard", "closedoors", "leashing", "bandit", "banditleader", + "boss", "melee", "ranged", "caster", "antiMagic", + "ballGagRestraints", "banditMagicRestraints","leatherRestraints", "leatherRestraintsHeavy", "chainweakness", "glueweakness", "jailer", "hunter" + ]), cohesion: 0.9, armor: -1, followRange: 1, AI: "hunt", + spells: ["PoisonDagger", "BearTrap", "LustBomb"], spellCooldownMult: 1, spellCooldownMod: 0, noSpellLeashing: true, + stamina: 2, + maxblock: 0, + maxdodge: 3, + summon: [ + {enemy: "BanditPet", range: 3, count: 2, chance: 1.0, strict: true},], + visionRadius: 8, maxhp: 30, minLevel:3, weight:-20, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3.6, attackRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 2, + terrainTags: {"boss": -5, "open": 10, "increasingWeight":1, "BanditEnemy": 11, "BanditWanted": 3, "BanditHated": 4}, shrines: ["Leather"], allFloors: true, + factionrep: {"Bountyhunter": 0.02}, + dropTable: [{name: "Gold", amountMin: 80, amountMax: 100, weight: 10}]}, + + + + // Bosses + {name: "Fuuka1", outfit: "Fuuka", style: "Fuuka", nameList: "Fuuka", playLine: "Fuuka", bound: "Fuuka", faction: "Boss", clusterWith: "zombie", tags: KDMapInit(["nosub", "nocapture", "leashing", "noshop", "fuuka", "zombie", "ranged", "mikoRestraints", "stageBoss", "boss", "nocapture", "unflinching"]), + armor: 0, followRange: 3, AI: "guard", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ffffff"}, + {trigger: "tick", type: "BossAssignFaction", kind: "Fuuka"}, + {trigger: "tick", type: "FuukaManagement", count: 30}, + ], + RestraintFilter: { + unlimitedRestraints: true, + requiredItems: ["MikoGag", "MikoDress"], + }, + Behavior: { + leashCondition: "fuukaLeash", + }, + preferDodge: true, + stamina: 4, + maxblock: 1, + maxdodge: 3, + unlockCommandLevel: 3, unlockCommandCD: 7, + Magic: { + castCooldownUnique: { + FuukaOrb: 12, + }, + priority: { + FuukaOrb: 10, + }, + }, + spells: ["ZombieOrb", "ManyOrbs", "EnemyCM_self"], spellCooldownMult: 0.25, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, kite: 1.5, projectileAttack: true, accuracy: 0.7, noChannel: true, + visionRadius: 8, maxhp: 80, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3, attackRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 4, + attackLock: "White", + terrainTags: {}, floors:KDMapInit([]), dropTable: [{name: "Scrolls", weight: 10}], ondeath: [{type: "dialogue", dialogue:"FuukaStage2", click: true}]}, + {name: "Fuuka2", outfit: "Fuuka", style: "Fuuka", nameList: "Fuuka", playLine: "Fuuka", bound: "Fuuka", faction: "Boss", clusterWith: "zombie", + tags: KDMapInit(["nosub", "leashing", "fuuka", + "bulwark", "zombie", "ranged", "mikoRestraints", "stageBoss", "boss", "unstoppable"]), + armor: 0, followRange: 1, AI: "hunt", + RestraintFilter: { + unlimitedRestraints: true, + requiredItems: ["MikoGag", "MikoDress"], + }, + Behavior: { + leashCondition: "fuukaLeash", + }, + special: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ff7777"}, + {trigger: "tick", type: "BossAssignFaction", kind: "Fuuka"}, + {trigger: "tick", type: "FuukaManagement", count: 15}, + ], + maxblock: 3, + maxdodge: 3, + preferBlock: true, + Magic: { + castCooldownUnique: { + FuukaOrbMulti: 12, + SummonZombies: 30, + SummonMikoGhosts: 24, + }, + priority: { + FuukaOrbMulti: 10, + SummonZombies: 9, + SummonMikoGhosts: 8, + }, + }, + stamina: 6, + unlockCommandLevel: 3, unlockCommandCD: 7, + spells: ["ZombieOrb", "ManyOrbs", "SummonMikoGhosts", "SummonZombies", "EnemyCM_self", "FuukaOrbMulti"], spellCooldownMult: 0.25, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, projectileAttack: true, accuracy: 0.85, noChannel: true, + visionRadius: 12, maxhp: 45, minLevel:0, weight:-1000, movePoints: 1, attackPoints: 3, attack: "SpellMeleeBindLock", attackWidth: 3, attackRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 4, + attackLock: "Purple", + terrainTags: {}, floors:KDMapInit([]), dropTable: [{name: "BlueKey", weight: 10}], ondeath: [{type: "dialogue", dialogue:"FuukaWin", click: true}]}, + + + {name: "FuukaPillar", faction: "Natural", color: "#ff5277", + lowpriority: true, + nonDirectional: true, noFlip: true, + Sound: { + baseAmount: 1, + moveAmount: 0, + }, + Resistance: { + profile: ["construct"], + }, + tags: KDMapInit(["scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "fire", "temporary", "coldimmune", + "poisonimmune", "soulimmune", "fireimmune", "pierceresist", "coldweakness", "holyweakness", "tickleresist", "groperesist", "painresist", "charmimmune", + ]), + spellResist: 1, armor: 2, + sneakthreshold: 0.6, + evasion: -9, ignorechance: 1.0, followRange: 3.5, AI: "ambush", ambushRadius: 0, difficulty: -0.05, regen: 0.05, + visionRadius: 3.5, maxhp: 7, minLevel:0, weight:-10, movePoints: 99999, attackPoints: 4, attack: "", attackWidth: 1.25, attackRange: 1, power: 1, dmgType: "fire", + terrainTags: {}, allFloors: false, shrines: ["Will"], + ondeath: [{type: "summon", enemy: "SummonedZombie", range: 2.5, count: 4, strict: true, lifetime: 50}], + events: [ + {trigger: "afterPlayerAttack", type: "spellReflect", spell: "SealingBolt", time: 1}, + {trigger: "hit", type: "spellReflect", spell: "SealingBolt", time: 1}, + {trigger: "afterDamageEnemy", type: "spellReflect", spell: "SealingBolt", time: 1}, + ], + }, + + {name: "MikoGhost", faction: "Ghost", color: "#FFFFFF", clusterWith: "ghost", + tags: KDMapInit(["flying", "fuuka", "ghost", "melee", "glueimmune", "chainimmune", "temporary"]), ethereal: true, ignorechance: 0, armor: 0, followRange: 1, AI: "hunt", + specialCD: 7, specialAttack: "Slow", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 2, color: "#ffffff"}, + ], + stamina: 2, + maxblock: 0, + maxdodge: 0, + visionRadius: 30, blindSight: 30, evasion: 9.0, alwaysEvade: true, maxhp: 1, regen: -0.051, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 1, attack: "MeleeWill", attackWidth: 3, attackRange: 1, power: 1, dmgType: "grope", fullBoundBonus: 0, + terrainTags: {}, shrines: ["Illusion"], floors:KDMapInit([]), dropTable: [{name: "Ectoplasm", chance: 0.6, weight: 10}],}, + + {name: "WardenArcher", nameList: "dragonheart", outfit: "Bandit", style: "GreenHair", bound: "WardenArcher", color: "#88ff88", + playLine: "Adventurer_Sub_Fighter", + armor: -0.5, + tags: KDMapInit(["opendoors", "warden", "wardenprisoner", "miniboss", "leashing", "human", "melee", "leatherRestraints", + "leatherRestraintsHeavy", "gropeweakness", "iceweakness", "jail", "jailer", "submissive"]), cohesion: 0.9, + evasion: 0.2, kite: 4.5, + faction: "Boss", + dontKiteWhenDisabled: true, + Behavior: { + leashCondition: "wardenLeash", + }, + + spells: ["RestrainingBolt"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, projectileTargeting: true, accuracy: 1.5, + + followLeashedOnly: true, ignorechance: 0, followRange: 2.5, AI: "hunt", guardChance: 0.0, + visionRadius: 14.5, blindSight: 8, maxhp: 40, minLevel:12, weight:1, movePoints: 2, attackPoints: 3, attack: "SpellMeleeWillBindLock", + attackWidth: 2.5, attackRange: 1, power: 3, dmgType: "grope", fullBoundBonus: 1, + stamina: 10, + preferDodge: true, maxblock: 0, maxdodge: 2, + events: [ + {trigger: "tick", type: "BossAssignFaction", kind: "Warden"}, + {trigger: "afterDamageEnemy", type: "FreeWardenPrisoners"}, + ], + attackLock: "Red_Hi", + terrainTags: {}, shrines: [], floors:KDMapInit([]), + dropTable: [{name: "PotionStamina", weight: 100, amount: 3}]}, + + {name: "WardenFighter", nameList: "dragonheart", outfit: "AdventurerDom", style: "BlackCatGirl", bound: "WardenFighter", color: "#ff5277", + playLine: "Adventurer_Switch_Fighter", + armor: 1, + Resistance: { + block_phys: 1.0, + }, + tags: KDMapInit(["opendoors", "warden", "wardenprisoner", "miniboss", "leashing", "human", "melee", "leatherRestraints", + "bulwark", + "leatherRestraintsHeavy", "painweakness", "iceweakness", "jail", "jailer", "submissive"]), cohesion: 0.9, + faction: "Boss", + dontKiteWhenDisabled: true, + Behavior: { + leashCondition: "wardenLeash", + }, + + spells: ["Taunt"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, projectileTargeting: true, accuracy: 1.5, + + followLeashedOnly: true, ignorechance: 0, followRange: 2.5, AI: "hunt", guardChance: 0.0, + visionRadius: 13.5, blindSight: 8, maxhp: 50, minLevel:12, weight:1, movePoints: 1.5, attackPoints: 2, attack: "SpellMeleeWillBindLock", + attackWidth: 3, attackRange: 1, power: 3, dmgType: "pain", fullBoundBonus: 1, + stamina: 7, + preferDodge: true, maxblock: 0, maxdodge: 1, + events: [ + {trigger: "tick", type: "BossAssignFaction", kind: "Warden"}, + {trigger: "afterDamageEnemy", type: "FreeWardenPrisoners"}, + ], + attackLock: "Red_Hi", + terrainTags: {}, shrines: [], floors:KDMapInit([]), + dropTable: [{name: "PotionWill", weight: 100, amount: 3}]}, + + + {name: "WardenMage", nameList: "dragonheart", outfit: "AdventurerSub", style: "BlueHair", bound: "WardenMage", color: "#8888ff", + playLine: "Adventurer_Brat_Fighter", + armor: -1, + Resistance: { + block_magic: 2.0, + }, + tags: KDMapInit(["opendoors", "warden", "wardenprisoner", "miniboss", "leashing", "human", "melee", "leatherRestraints", + "leatherRestraintsHeavy", "tickleweakness", "iceweakness", "jail", "jailer", "submissive"]), cohesion: 0.9, + evasion: -0.2, kite: 4.5, + faction: "Boss", + dontKiteWhenDisabled: true, + + spells: ["MagicMissile", "MagicMissileChannel", "MagicMissileChannel"], spellCooldownMult: 1, spellCooldownMod: 0, castWhileMoving: true, projectileTargeting: true, accuracy: 1.5, + + followLeashedOnly: true, ignorechance: 0, followRange: 2.5, AI: "hunt", guardChance: 0.0, + visionRadius: 14.5, blindSight: 8, maxhp: 30, minLevel:12, weight:1, movePoints: 1.4, attackPoints: 3, attack: "SpellMeleeWillBindLockAll", + attackWidth: 2.5, attackRange: 1, power: 3, dmgType: "tickle", fullBoundBonus: 1, + stamina: 4, + preferDodge: true, maxblock: 0, maxdodge: 1, + events: [ + {trigger: "tick", type: "BossAssignFaction", kind: "Warden"}, + {trigger: "afterDamageEnemy", type: "FreeWardenPrisoners"}, + ], + Behavior: { + leashCondition: "wardenLeash", + }, + attackLock: "Purple", + terrainTags: {}, shrines: [], floors:KDMapInit([]), + dropTable: [{name: "PotionMana", weight: 100, amount: 3}]}, + + {name: "TheWarden1", outfit: "Jailer", style: "Jailer", nameList: "TheWarden", playLine: "TheWarden", bound: "TheWarden", faction: "Boss", clusterWith: "human", + color: "#ffaa44", + tags: KDMapInit(["nosub", "nocapture", "leashing", "noshop", "warden", "human", "magicresist", "soulweakness", "ranged", "highsecRestraints", "leatherRestraints", "leatherRestraintsHeavy", "stageBoss", "boss"]), + armor: 1, followRange: 3, AI: "guard", + events: [ + {trigger: "tick", type: "BossAssignFaction", kind: "Warden"}, + {trigger: "tick", type: "WardenManagement", count: 1}, + ], + RestraintFilter: { + unlimitedRestraints: true, + }, + Behavior: { + leashCondition: "wardenLeash", + }, + preferDodge: true, + stamina: 4, + maxblock: 1, + maxdodge: 0, + unlockCommandLevel: 3, unlockCommandCD: 7, + spells: ["OneBarMissile", "EnemyCM_self"], spellCooldownMult: 0.4, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, kite: 2.5, projectileAttack: true, accuracy: 0.75, noChannel: true, + visionRadius: 8, maxhp: 30, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLockAllWill", attackWidth: 2.5, attackRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 4, + attackLock: "Purple", + terrainTags: {}, floors:KDMapInit([]), dropTable: [{name: "Scrolls", weight: 10}], ondeath: [{type: "dialogue", dialogue:"TheWardenStage2", click: true}]}, + + {name: "TheWarden2", outfit: "Jailer", style: "Jailer", nameList: "TheWarden", playLine: "TheWarden", bound: "TheWarden", faction: "Boss", clusterWith: "human", + color: "#ffaa44", + tags: KDMapInit(["nosub", "leashing", "noshop", "warden", "human", "soulweakness", "magicresist", "ranged", "highsecRestraints", "leatherRestraints", "leatherRestraintsHeavy", "stageBoss", "boss", "unflinching"]), + armor: 1, followRange: 3, AI: "guard", + events: [ + {trigger: "tick", type: "BossAssignFaction", kind: "Warden"}, + {trigger: "tick", type: "WardenManagement", count: 3}, + ], + RestraintFilter: { + unlimitedRestraints: true, + }, + Behavior: { + leashCondition: "wardenLeash", + }, + special: true, + preferDodge: true, + stamina: 4, + maxblock: 1, + maxdodge: 1, + unlockCommandLevel: 3, unlockCommandCD: 7, + spells: ["OneBarMissile", "EnemySteelRainBurst", "EnemyCM_self"], spellCooldownMult: 0.4, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, kite: 2.5, projectileAttack: true, accuracy: 0.75, noChannel: true, + visionRadius: 9, maxhp: 80, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLockAllWill", attackWidth: 2.5, attackRange: 1, power: 4, dmgType: "grope", fullBoundBonus: 4, + attackLock: "HiSec", + terrainTags: {}, floors:KDMapInit([]), dropTable: [{name: "Scrolls", weight: 10}], ondeath: [{type: "dialogue", dialogue:"TheWardenWin", click: true}]}, + + + + + {name: "DollmakerBoss1", outfit: "DollSuit", playLine: "Dollmaker", bound: "DollmakerBoss", faction: "Boss", clusterWith: "dollsmith", + applyFaction: "Dollsmith", + tags: KDMapInit(["nosub", "leashing", "noshop", "dollsmith", "ranged", "nocapture", "slimewalk", + "bulwark", + "glueresist", "electricresist", "crushresist", "iceweakness", "dollmakerrestraints", "controlharness", "cyberdollchastity", "teasetoys", "stageBoss", "boss", "nocapture", "unstoppable"]), + spellResist: 2.0, armor: 0.5, followRange: 1.5, AI: "guard", kite: 4.5, noKiteWhenHarmless: true, dontKiteWhenDisabled: true, + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ff88ff"}, + {trigger: "afterEnemyTick", type: "dollmakerMissiles", count: 2, time: 8, dist: 10, kind: "RubberMissile"}, + {trigger: "tick", type: "BossAssignFaction", kind: "Dollsmith"}, + ], + RestraintFilter: { + unlimitedRestraints: true, + }, + Behavior: { + leashCondition: "dollmakerLeash", + }, + maxblock: 3, + maxdodge: 1, + preferDodge: true, + stamina: 2, + unlockCommandLevel: 3, unlockCommandCD: 14, + spells: ["SummonDrones", "DollConvertMany", "DollBoost", "EnemyCM_self"], + spellCooldownMult: 0.25, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, projectileAttack: true, accuracy: 0.7, noChannel: true, + visionRadius: 9, maxhp: 70, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLockAll", attackWidth: 3, attackRange: 1, power: 4, dmgType: "soul", fullBoundBonus: 4, + terrainTags: {}, floors:KDMapInit([]), + ondeath: [{type: "dialogue", dialogue:"DollmakerStage2", click: true}], + }, + + {name: "DollmakerBoss2", outfit: "DollSuit", playLine: "Dollmaker", bound: "DollmakerBoss", faction: "Boss", clusterWith: "dollsmith", + applyFaction: "Dollsmith", + tags: KDMapInit(["nosub", "leashing", "noshop", "dollsmith", "ranged", "nocapture", "slimewalk", + "bulwark", + "glueresist", "electricresist", "crushresist", "iceweakness", "dollmakerrestraints", "cyberdollchastity", "cyberdollrestraints", "controlharness", "teasetoys", "stageBoss", "boss", "nocapture", "unstoppable"]), + spellResist: 2.0, armor: 0.5, followRange: 5.5, AI: "guard", + events: [ + {trigger: "tick", type: "suicideWhenBound"}, + {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ff88ff"}, + {trigger: "afterEnemyTick", type: "dollmakerMissiles", count: 2, time: 15, dist: 10, kind: "RubberNuke"}, + {trigger: "tick", type: "BossAssignFaction", kind: "Dollsmith"}, + ], + stamina: 3, + maxblock: 1, + maxdodge: 3, + RestraintFilter: { + unlimitedRestraints: true, + }, + Behavior: { + leashCondition: "dollmakerLeash", + }, + preferDodge: true, + unlockCommandLevel: 3, unlockCommandCD: 14, + spells: ["SummonCaptureDrones", "DollConvertMany", "DollBoost", "EnemyCM_self"], + spellCooldownMult: 0.15, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, kite: 2.5, accuracy: 0.85, noChannel: true, + visionRadius: 20, blindSight: 7, maxhp: 60, minLevel:0, weight:-1000, movePoints: 2, attackPoints: 3, attack: "SpellMeleeBindLockAll", attackWidth: 3, attackRange: 1, power: 4, dmgType: "soul", fullBoundBonus: 4, + terrainTags: {}, floors:KDMapInit([]), + ondeath: [{type: "dialogue", dialogue:"DollmakerStage3", click: true}]}, + + {name: "DollmakerBoss3", nameList: "Dollmaker", outfit: "Dollmaker", style: "Dollmaker", playLine: "Dollmaker", bound: "DollmakerBoss", faction: "Boss", clusterWith: "dollsmith", + applyFaction: "Dollsmith", + tags: KDMapInit(["nosub", "leashing", "noshop", "dollsmith", "ranged", "slimewalk", + "bulwark", + "glueresist", "electricresist", "crushresist", "iceweakness", "dollmakerrestraints", "cyberdollchastity", "cyberdollrestraints", "cyberdollheavy", "controlharness", "teasetoys", "stageBoss", "boss", "unstoppable"]), + spellResist: 2.0, armor: 0.5, followRange: 1.5, AI: "guard", + events: [ + {trigger: "getLights", type: "enemyTorch", power: 3.5, color: "#ff88ff"}, + {trigger: "afterEnemyTick", type: "dollmakerMissiles", count: 2, time: 9, dist: 10, kind: "RubberNuke"}, + {trigger: "tick", type: "BossAssignFaction", kind: "Dollsmith"}, + ], + preferBlock: true, + maxblock: 5, + maxdodge: 0, + stamina: 5, + RestraintFilter: { + unlimitedRestraints: true, + }, + Behavior: { + leashCondition: "dollmakerLeash", + }, + special: true, + unlockCommandLevel: 3, unlockCommandCD: 14, + spells: ["DollConvertMany", "DollBoost", "EnemyCM_self", "ManyCables"], + spellCooldownMult: 0.2, spellCooldownMod: 0, castWhileMoving: true, buffallies: true, projectileAttack: true, accuracy: 1.15, noChannel: true, + visionRadius: 30, blindSight: 30, maxhp: 140, minLevel:0, weight:-1000, movePoints: 1.7, attackPoints: 3, attack: "SpellMeleeBindLockAll", attackWidth: 3, attackRange: 1, power: 4, dmgType: "soul", fullBoundBonus: 4, + terrainTags: {}, floors:KDMapInit([]), + ondeath: [{type: "dialogue", dialogue:"DollmakerWin", click: true}]}, + + //region curse + + {name: "EpicenterCursed", faction: "Curse", color: "#880044", + tags: KDMapInit(["opendoors", "epicenterCursed", "epicenter", "curseTrap", "ghost", "cursed", "soulimmune", "melee", "fireweakness", "shadowimmune", "glueimmune", "chainimmune", "shadowHands", "poisonimmune", "meleeresist", "flying"]), + ignorechance: 0, armor: 0, followRange: 1, AI: "huntshadow", noAlert: true, hitsfx: "Evil", + ethereal: true, + spells: ["ManyShadowHands", "ManyObsidianBolts", "CursingCircle", "CursingCircle"], spellCooldownMult: 1.1, spellCooldownMod: 0, castWhileMoving: true, + visionRadius: 15, blindSight: 8, evasion: -2, maxhp: 61.7, minLevel: 0, weight:0, + movePoints: 4, attackPoints: 2, attack: "Spell", + attackWidth: 1, attackRange: 1, power: 1.0, dmgType: "cold", fullBoundBonus: 4, + regen: 0.02, + maxblock: 0, + maxdodge: 0, + stamina: 2, + events: [ + {trigger: "tick", type: "DeleteCurse", tags: ["cursedCollar"]}, + {trigger: "tickAfter", type: "EpicenterAssignHP"}, + ], + terrainTags: {"curseTrap": 10}, shrines: [], allFloors: true, + dropTable: [{name: "ManaOrb", weight: 1}, {name: "DarkKatana", weight: 100, ignoreInInventory: true}, {name: "StaffDoll", weight: 100, ignoreInInventory: true}, {name: "StaffBind", weight: 100, ignoreInInventory: true}, {name: "MagicAxe", weight: 100, ignoreInInventory: true}], + }, + {name: "EpicenterCursed2", faction: "Curse", color: "#a4affa", + tags: KDMapInit(["opendoors", "epicenterCursed", "epicenter", "curseTrap", "ghost", "cursed", "soulimmune", "melee", "fireweakness", "shadowimmune", "glueimmune", "chainimmune", "shadowHands", "poisonimmune", "meleeresist", "flying"]), + ignorechance: 0, armor: 0, followRange: 1, AI: "huntshadow", noAlert: true, hitsfx: "Evil", + ethereal: true, + spells: ["ManyShadowHands", "ManyMithrilBolts", "CursingCircle2", "CursingCircle2"], spellCooldownMult: 1.1, spellCooldownMod: 0, castWhileMoving: true, + visionRadius: 15, blindSight: 8, evasion: -2, maxhp: 61.7, minLevel: 0, weight:0, + movePoints: 4, attackPoints: 2, attack: "Spell", + attackWidth: 1, attackRange: 1, power: 1.0, dmgType: "cold", fullBoundBonus: 4, + regen: 0.02, + maxblock: 0, + maxdodge: 0, + stamina: 2, + events: [ + {trigger: "tick", type: "DeleteCurse", tags: ["cursedCollar2"]}, + {trigger: "tickAfter", type: "EpicenterAssignHP"}, + ], + terrainTags: {"curseTrap": 10}, shrines: [], allFloors: true, + dropTable: [{name: "ManaOrb", weight: 1}, {name: "StaffStorm", weight: 100, ignoreInInventory: true}, {name: "StaffIncineration", weight: 100, ignoreInInventory: true}, {name: "StaffFrostbite", weight: 100, ignoreInInventory: true}, {name: "MagicSword", weight: 100, ignoreInInventory: true}], + }, + //endregion +]; + + +let KDOndeath: Record void> = { + "DirtPile": (enemy, _o, mapData) => { + if (!KDGameData.QuestData.DirtPiles) KDGameData.QuestData.DirtPiles = { + pilesTotal: 0, + pilesSinceLastSpawn: 0, + lastSpawn: "Frog", + quota: -10, + }; + if (KDRandom() < -0.2 + 0.1 * KDGameData.QuestData.DirtPiles.pilesSinceLastSpawn) { + let type = CommonRandomItemFromList(KDGameData.QuestData.DirtPiles.lastSpawn, [ + "Frog", + "SlimeMold", + "SlimeMoldLeaper", + "SmallSlime", + "Bat", + "Rat", + "Ghost", + "Mimic", + "Gag", + "AnimArmbinder", + "AnimHarness", + "AnimStraitjacket", + "AnimYoke", + ]); + if (mapData == KDMapData) + KinkyDungeonSummonEnemy(enemy.x, enemy.y, type, 1, 0.5, false, undefined, false, undefined, "Ambush", true, 0, true, undefined, false); + KDGameData.QuestData.DirtPiles.lastSpawn = type; + if (mapData == KDMapData) + KinkyDungeonSendTextMessage(9, TextGet("KDDirtPileSurprise").replace("ENMY", TextGet("Name" + type)), "#ff8933", 6); + KDGameData.QuestData.DirtPiles.pilesSinceLastSpawn = 0; + } else { + KDGameData.QuestData.DirtPiles.pilesSinceLastSpawn += 1; + } + KDGameData.QuestData.DirtPiles.pilesTotal += 1; + }, + "WolfServer": (enemy, _o, mapData) => { + // TODO + }, + "DragonSeal": (enemy, _o, mapData) => { + if (enemy.id == KDGameData.DragonTarget) { + KDGameData.DragonCaptured = true; + } + }, + + "summon": (enemy, o, mapData) => { + if (mapData == KDMapData) { + let f: entity = null; + let e = KinkyDungeonSummonEnemy(enemy.x, enemy.y, o.enemy, o.count, o.range, o.strict, o.lifetime, o.hidden, undefined, o.faction || KDGetFaction(enemy), o.hostile, o.minradius, o.startAware, undefined, o.hideTimer); + for (let en of e) { + if (o.sameid && !f) { + f = en; + f.id = enemy.id; + f.CustomName = enemy.CustomNameColor; + f.CustomNameColor = enemy.CustomNameColor; + f.created = enemy.created; + f.homeCoord = enemy.homeCoord; + if (o.storeTrueForm) { + let NPC = KDGetPersistentNPC(f.id); + if (NPC) { + NPC.trueEntity = enemy; + } + } + + } else + KDProcessCustomPatron(en.Enemy, en, 0, false); + + } + } + + }, + "dialogue": (enemy, o, mapData) => { + if (mapData == KDMapData) + KDStartDialog(o.dialogue, enemy.Enemy.name, o.click, enemy.personality, enemy); + }, + "murder": (_enemy, _o, mapData) => { + if (mapData == KDMapData) + KDMurderShopkeeper(1); + }, + "spellOnSelf": (enemy, o, mapData) => { + if (mapData == KDMapData) { + let spell = KinkyDungeonFindSpell(o.spell, true); + if (spell) KinkyDungeonCastSpell(enemy.x, enemy.y, spell, undefined, undefined, undefined, KDGetFaction(enemy)); + } + }, + "removeQuest": (_enemy, o) => { + KDRemoveQuest(o.quest); + }, + "dollID": (enemy, _o, mapData) => { + if (mapData == KDMapData && KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 9) { + if (!KinkyDungeonFlags.get("gotDollID")) { + let dropped = {x:enemy.x, y:enemy.y, name: "DollID"}; + KDMapData.GroundItems.push(dropped); + KinkyDungeonSetFlag("gotDollID", -1, 1); + } + } + }, + "addQuest": (_enemy, o) => { + KDAddQuest(o.quest); + }, +}; + +let KDSpecialConditions: Record = { + "canRestrainWithExtra": { + resetCD: false, + criteria: (enemy, AIData) => { + let rThresh = enemy.Enemy.RestraintFilter?.powerThresh || KDDefaultRestraintThresh; + return !AIData.player?.player + || (KDEnemyHasFlag(enemy, "targ_player") + && KDistChebyshev(enemy.x - AIData.player.x, enemy.y - AIData.player.y) < 3 + && KDGetRestraintsEligible( + {tags: KDGetTags(enemy, true)}, MiniGameKinkyDungeonLevel, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + enemy.Enemy.bypass, + enemy.Enemy.useLock ? enemy.Enemy.useLock : "", + !(enemy.Enemy.ignoreStaminaForBinds || (true && enemy.Enemy.specialIgnoreStam)) && !AIData.attack.includes("Suicide"), + false, + !(KinkyDungeonStatsChoice.has("TightRestraints") || enemy.Enemy.tags.miniboss || enemy.Enemy.tags.boss), + KDGetExtraTags(enemy, true, true), + false, + { + maxPower: rThresh + 0.01, + looseLimit: true, + onlyUnlimited: true, + ignore: enemy.items, + }, enemy, undefined, undefined, undefined, undefined, undefined, { + QuitOnFirst: true, + } + ).length > 0); + } + } +}; + +let KDSpecialBuffs: Record = { + "Armored": { + filter: (_enemy, types) => { + return types.some((type) => {return ["HighValue", "NGP_Reg", "Hardmode_Reg"].includes(type);}); + }, + weight: (_enemy, _types) => { + return 40; + }, + apply: (enemy, _types) => { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "Armored", + aura: "#ffffff", + aurasprite: "Armored", + noAuraColor: true, + duration: 9999, infinite: true, + power: 3, + type: "Armor", + }); + }, + }, + "Fast": { + filter: (enemy, types) => { + if (KDIsImmobile(enemy)) return false; + return types.some((type) => {return ["HighValue", "NGP_Reg", "Hardmode_Reg"].includes(type);}); + }, + weight: (_enemy, _types) => { + return 40; + }, + apply: (enemy, _types) => { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "Fast", + aura: "#ffffff", + aurasprite: "Fast", + noAuraColor: true, + duration: 9999, infinite: true, + power: 0.5, + type: "MoveSpeed", + }); + }, + }, + "Muscle": { + filter: (enemy, types) => { + if (!enemy.Enemy.attack?.includes("Melee") && !enemy.Enemy.specialAttack?.includes("Melee")) return false; + return types.some((type) => {return ["HighValue", "NGP_Reg", "Hardmode_Reg"].includes(type);}); + }, + weight: (_enemy, _types) => { + return 40; + }, + apply: (enemy, _types) => { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "Muscle", + aura: "#ffffff", + aurasprite: "Muscle", + noAuraColor: true, + duration: 9999, infinite: true, + power: Math.min(5, enemy.Enemy.power*2), + type: "AttackPower", + }); + KinkyDungeonApplyBuffToEntity(enemy, { + id: "Muscle2", + duration: 9999, infinite: true, + power: 1, + type: "AttackWidth", + }); + }, + }, + "EnergyShield": { + filter: (_enemy, types) => { + return types.some((type) => {return ["HighValue", "NGP_Reg", "Hardmode_Reg"].includes(type);}); + }, + weight: (_enemy, _types) => { + return 40; + }, + apply: (enemy, _types) => { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "EnergyShield", + aura: "#ffffff", + aurasprite: "EnergyShield", + duration: 9999, infinite: true, + noAuraColor: true, + power: enemy.Enemy.maxhp * 0.25, + type: "MaxShield", + }); + KinkyDungeonApplyBuffToEntity(enemy, { + id: "EnergyShield2", + duration: 9999, infinite: true, + power: 0.5, + type: "ShieldRegenBG", + }); + }, + }, + "HealingAura": { + filter: (enemy, types) => { + if (enemy.Enemy.tags?.robot || enemy.Enemy.tags?.construct || enemy.Enemy.tags?.nobrain) return false; + return types.some((type) => {return ["HighValue", "NGP_Boss", "Hardmode_Boss", "Extreme"].includes(type);}); + }, + weight: (enemy, _types) => { + return 10 + (enemy.Enemy.shrines?.includes("Will") ? 20 : 0); + }, + apply: (enemy, _types) => { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "HealingAuraSBuff", + aura: "#ffffff", + aurasprite: "HealingAura", + duration: 9999, infinite: true, + noAuraColor: true, + power: 1, + events: [ + {trigger: "afterEnemyTick", type: "nurseAura", power: 0.3, dist: 1.5}, + ], + }); + }, + }, + "Missiles": { + filter: (_enemy, types) => { + return types.some((type) => {return ["HighValue", "NGP_Boss", "Hardmode_Boss", "Extreme"].includes(type);}); + }, + weight: (enemy, _types) => { + return 4 + (enemy.Enemy.shrines?.includes("Latex") || enemy.Enemy.tags?.robot ? 40 : 0); + }, + apply: (enemy, _types) => { + let count = Math.min(4, Math.max(1, Math.ceil(KDGetEffLevel()/3))); + if ((enemy.Enemy.tags?.boss)) count = 4; + else if (enemy.Enemy.tags?.miniboss) count = Math.max(count, 3); + else if (enemy.Enemy.tags?.elite) count = Math.max(count, 2); + KinkyDungeonApplyBuffToEntity(enemy, { + id: "Missiles", + duration: 9999, infinite: true, + power: count, + aura: "#ffffff", + aurasprite: "Missiles4", + noAuraColor: true, + events: [ + {trigger: "afterEnemyTick", count: count, type: "Missiles", power: 1.5, + time: 12 + ((enemy.Enemy.tags?.minor) ? 10 : (enemy.Enemy.tags?.elite || enemy.Enemy.tags?.miniboss || enemy.Enemy.tags?.boss) ? 0 : 5), spell: "RubberMissile"}, + ], + }); + }, + }, + "Airbender": { + filter: (_enemy, types) => { + return types.some((type) => {return ["HighValue", "NGP_Boss", "Hardmode_Boss", "Extreme"].includes(type);}); + }, + weight: (enemy, _types) => { + return 4 + ((enemy.Enemy.kite || enemy.Enemy.tags?.ranged) ? 20 : 0); + }, + apply: (enemy, _types) => { + let count = 2; + KinkyDungeonApplyBuffToEntity(enemy, { + id: "Airbender", + duration: 9999, infinite: true, + power: count, + aura: "#ffffff", + aurasprite: "Airbender1", + noAuraColor: true, + events: [ + {trigger: "afterEnemyTick", count: count, type: "Airbender", time: 4 + ((enemy.Enemy.tags?.minor) ? 4 : (enemy.Enemy.tags?.elite || enemy.Enemy.tags?.miniboss || enemy.Enemy.tags?.boss) ? 0 : 2), spell: "EnemyWindBlast"}, + ], + }); + }, + }, + "ElectrifyX": { + filter: (_enemy, types) => { + return types.some((type) => {return ["HighValue", "NGP_Boss", "Hardmode_Boss"].includes(type);}); + }, + weight: (enemy, _types) => { + return 10 + (enemy.Enemy.shrines?.includes("Metal") ? 20 : 0) + ((enemy.Enemy.tags?.water) ? 20 : 0); + }, + apply: (enemy, _types) => { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "ElectrifyX", + duration: 9999, infinite: true, + power: 1, + events: [ + {trigger: "afterEnemyTick", type: "spellX", time: 4, spell: "WitchElectrify"}, + ], + }); + }, + }, + "FireexpX": { + filter: (enemy, types) => { + if (enemy.Enemy.tags?.water || enemy.Enemy.tags?.ice) return false; + return types.some((type) => {return ["HighValue", "NGP_Boss", "Hardmode_Boss"].includes(type);}); + }, + weight: (enemy, _types) => { + return 10 + (enemy.Enemy.tags?.fire ? 20 : 0); + }, + apply: (enemy, _types) => { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "FireexpX", + duration: 9999, infinite: true, + power: 1, + events: [ + {trigger: "afterEnemyTick", type: "spellX", time: 3, spell: "Fireexp"}, + ], + }); + }, + }, + "VineexpX": { + filter: (_enemy, types) => { + return types.some((type) => {return ["HighValue", "NGP_Boss", "Hardmode_Boss"].includes(type);}); + }, + weight: (enemy, _types) => { + return 10 + (enemy.Enemy.tags?.plant || enemy.Enemy.tags?.nature || enemy.Enemy.tags?.elf ? 20 : 0); + }, + apply: (enemy, _types) => { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "VineexpX", + duration: 9999, infinite: true, + power: 1, + events: [ + {trigger: "afterEnemyTick", type: "spellX", time: 3, spell: "Vineexp"}, + ], + }); + }, + }, + "BubbleexpX": { + filter: (enemy, types) => { + if (enemy.Enemy.tags?.fire) return false; + return types.some((type) => {return ["HighValue", "NGP_Boss", "Hardmode_Boss"].includes(type);}); + }, + weight: (enemy, _types) => { + return 10 + ((enemy.Enemy.tags?.water) ? 20 : 0); + }, + apply: (enemy, _types) => { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "BubbleexpX", + duration: 9999, infinite: true, + power: 1, + events: [ + {trigger: "afterEnemyTick", type: "spellX", time: 6, spell: "Bubbleexp"}, + ], + }); + }, + }, + "IceexpX": { + filter: (_enemy, types) => { + return types.some((type) => {return ["HighValue", "NGP_Boss", "Hardmode_Boss"].includes(type);}); + }, + weight: (enemy, _types) => { + return 10 + ((enemy.Enemy.tags?.ice) ? 20 : 0); + }, + apply: (enemy, _types) => { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "IceexpX", + duration: 9999, infinite: true, + power: 1, + events: [ + {trigger: "afterEnemyTick", type: "spellX", time: 6, spell: "Iceexp"}, + ], + }); + }, + }, + "BearTrapper": { + filter: (enemy, types) => { + if (KDIsImmobile(enemy)) return false; + return types.some((type) => {return ["HighValue", "NGP_Boss", "Hardmode_Boss"].includes(type);}); + }, + weight: (enemy, _types) => { + return 10 + (enemy.Enemy.attack?.includes("Bind") ? 20 : 0); + }, + apply: (enemy, _types) => { + KinkyDungeonApplyBuffToEntity(enemy, { + id: "BearTrapper", + duration: 9999, infinite: true, + power: 1, + events: [ + {trigger: "afterEnemyTick", type: "spellX", time: 8, spell: "BearTrap", always: true, count: 1}, + ], + }); + }, + }, +}; + +/** + * @param enemy + */ +function KDEndEnemyAction(enemy: entity) { + if (KDEnemyAction[enemy.action]?.end) { + KDEnemyAction[enemy.action].end(enemy); + } + enemy.action = ""; +} + +/** + * @param enemy + */ +function KDMaintainEnemyAction(enemy: entity, delta: number) { + let forceEnd = false; + if (enemy.FacilityAction) { + KDTickCollectionWanderEntity(enemy, delta); + } + if (KDEnemyHasFlag(enemy, "overrideMove") || KDEnemyHasFlag(enemy, "endAction") || enemy.playWithPlayer > 0) + forceEnd = true; + if (!KDEnemyAction[enemy.action]?.maintain || !KDEnemyAction[enemy.action].maintain(enemy, delta) || forceEnd) { + KDEndEnemyAction(enemy); + } +} + +let KDEnemyAction: Record = { + "observerchase": { + holdleash: true, + end: (enemy) => { + // Reset position + enemy.gx = enemy.x; + enemy.gy = enemy.y; + }, + filter: (enemy) => { + return !(enemy.aware); + }, + maintain: (enemy, _delta) => { + // Stops investigating if alerted or idle + return ((enemy.idle && KDRandom() < 0.1) + || !(enemy.aware) + || enemy.attackPoints + || KDistChebyshev(enemy.x - enemy.gx, enemy.y - enemy.gy) <= 1.5); + }, + sprint: false, + }, + "investigatesound": { + holdleash: true, + end: (enemy) => { + // Reset position + enemy.gx = enemy.x; + enemy.gy = enemy.y; + }, + filter: (enemy) => { + return !(enemy.aware); + }, + maintain: (enemy, _delta) => { + // Stops investigating if alerted or idle + return !(enemy.idle + || (KinkyDungeonAggressive(enemy) && enemy.aware) + || enemy.attackPoints + || KDistChebyshev(enemy.x - enemy.gx, enemy.y - enemy.gy) <= 1.5); + }, + sprint: false, + }, + "investigatesignal": { + holdleash: true, + end: (enemy) => { + // Reset position + enemy.gx = enemy.x; + enemy.gy = enemy.y; + }, + filter: (enemy) => { + return !(enemy.aware); + }, + maintain: (enemy, _delta) => { + // Stops investigating if alerted or idle + return ((enemy.idle && KDRandom() < 0.5) + || !(enemy.aware) + || enemy.attackPoints + || KDistChebyshev(enemy.x - enemy.gx, enemy.y - enemy.gy) <= 1.5); + }, + sprint: true, + }, +}; + + + + +let SpecialPersistentScriptSettingList: Record string> = { + Default: (npc: KDPersistentNPC, enemy: enemy) => { + return undefined; + }, + Dragon: (npc: KDPersistentNPC, enemy: enemy) => { + return "Dragon"; + }, + MaidKnightAndSquire: (npc: KDPersistentNPC, enemy: enemy) => { + return "MaidKnightAndSquire"; + }, +} +let SpawnAISettingList: Record string> = { + Default: (npc: KDPersistentNPC, enemy: enemy) => { + return "Default"; + }, + None: (npc: KDPersistentNPC, enemy: enemy) => { + return "None"; + }, + Dragon: (npc: KDPersistentNPC, enemy: enemy) => { + return "Dragon"; + }, +} + +let WanderAISettingList: Record string> = { + Default: (npc: KDPersistentNPC, enemy: enemy) => { + if (npc?.entity?.summoned) { + return "GoToMain"; + } + return "Default"; + }, + None: (npc: KDPersistentNPC, enemy: enemy) => { + return "None"; + }, + Dragon: (npc: KDPersistentNPC, enemy: enemy) => { + return "Dragon"; + }, + Targeted: (npc: KDPersistentNPC, enemy: enemy) => { + return "Targeted"; + }, +} diff --git a/Game/src/enemy/KinkyDungeonEnemyEventList.ts b/Game/src/enemy/KinkyDungeonEnemyEventList.ts new file mode 100644 index 000000000..d3e5becfc --- /dev/null +++ b/Game/src/enemy/KinkyDungeonEnemyEventList.ts @@ -0,0 +1,1379 @@ +"use strict"; + +/** + * Play is actions enemies do when they are NEUTRAL + */ +let KDIntentEvents: Record = { + "leashFurniture": { + play: true, + nonaggressive: true, + // This will make the enemy want to leash you + weight: (enemy, _aiData, allied, hostile, _aggressive) => { + if (allied) return 0; + if (!enemy.Enemy.tags.leashing) return 0; + if (KinkyDungeonFlags.get("Released")) return 0; + if (KDGameData.PrisonerState == 'jail') return 0; + if (KinkyDungeonGetRestraintItem("ItemDevices")) return 0; + if (enemy.playWithPlayer > 0) return 0; + if (KDSelfishLeash(enemy)) return 0; + if (KDEnemyHasFlag(enemy, "noHarshPlay")) return 0; + if (KDEnemyHasFlag(enemy, "dontChase")) return 0; + let mult = hostile ? 3 : 1; + if (enemy.Enemy?.Behavior?.leashCondition) { + if (!KDLeashConditions[enemy.Enemy.Behavior.leashCondition].check(enemy, _aiData.play)) + return 0; + } + + if (KinkyDungeonFlags.get("LeashToPrison")) mult = hostile ? 0 : 0.1; + let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"], undefined, undefined, true); + return nearestfurniture && KDistChebyshev(enemy.x - nearestfurniture.x, enemy.y - nearestfurniture.y) < 14 ? (mult * 40 * (KDGameData.PrisonerState == 'parole' ? 0 : 1)) : 0; + }, + trigger: (enemy, aiData) => { + KDResetIntent(enemy, aiData); + enemy.IntentAction = 'leashFurniture'; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 140); + let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"], undefined, undefined, true); + enemy.IntentLeashPoint = nearestfurniture; + enemy.playWithPlayer = 22; + KDSetPlayCD(enemy, 3); + + KinkyDungeonSetEnemyFlag(enemy, "playstart", 3); + KinkyDungeonSetEnemyFlag(enemy, "motivated", 50); + + KDAddThought(enemy.id, "Jail", 5, enemy.playWithPlayer); + + let suff = (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : ""); + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff + "Leash").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 3); + }, + arrive: (enemy, aiData) => { + // When the enemy arrives at the leash point we move the player to it + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", -1); + enemy.playWithPlayer = 12 + Math.floor(KDRandom() * 12); + enemy.playWithPlayerCD = 30; + KinkyDungeonSetEnemyFlag(enemy, "playstart", 7); + KDResetAllIntents(true); + return KDSettlePlayerInFurniture(enemy, aiData); + }, + maintain: (enemy, delta, aiData) => { + let player = KDPlayer(); + let tethered = KDIsPlayerTethered(player); + if (KDistChebyshev(enemy.x - player.x, enemy.y - player.y) < 1.5 && !tethered && KDPlayerLeashed(player)) { + KinkyDungeonAttachTetherToEntity(2.5, enemy, player); + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 30); + return true; + } + else if (!tethered) { + if (enemy.aware) { + enemy.gx = player.x; + enemy.gy = player.y; + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 12); + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 2); + KDTryToLeash(enemy, player, delta, false, + (KDBoundPowerLevel < 0.5 || !KinkyDungeonHasWill(0.1)) && aiData.canAttack); + } + } else if (tethered && KDIsPlayerTetheredToEntity(KinkyDungeonPlayerEntity, enemy)) { + enemy.aware = true; + + if (!enemy.IntentLeashPoint) { + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + enemy.gx = enemy.IntentLeashPoint?.x; + enemy.gy = enemy.IntentLeashPoint?.y; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 12); + } else { + enemy.gx = enemy.IntentLeashPoint.x; + enemy.gy = enemy.IntentLeashPoint.y; + if (KDistChebyshev(enemy.IntentLeashPoint.x - enemy.x, enemy.IntentLeashPoint.y - enemy.y) < 1.5 && !aiData.aggressive) { + KDIntentEvents.leashFurniture.arrive(enemy, aiData); + } + } + + // If they are not attacking player + + } + if ((KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5 && (KDEnemyHasFlag(enemy, "motivated") || KDHostile(enemy))) + || KDIsPlayerTetheredToLocation(KinkyDungeonPlayerEntity, enemy.x, enemy.y, enemy)) { + if (enemy.playWithPlayer < 10) { + enemy.playWithPlayer = 10; + KDSetPlayCD(enemy, 2.5); + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 12); + KinkyDungeonSetEnemyFlag(enemy, "seePlayer", 2); + }// else enemy.playWithPlayer += delta; + } + return false; + }, + }, + leashToPoint: { + play: true, + nonaggressive: true, + // This will make the enemy want to leash you + weight: (_enemy, _aiData, _allied, _hostile, _aggressive) => { + return 0; + }, + trigger: (enemy, aiData) => { + KDResetIntent(enemy, aiData); + enemy.IntentAction = 'leashToPoint'; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 140); + enemy.IntentLeashPoint = { + radius: aiData.radius || 1, + x: aiData.point?.x || 1, + y: aiData.point?.y || 1, + type: "point", + }; + enemy.playWithPlayer = 22; + KDSetPlayCD(enemy, 3); + + KinkyDungeonSetEnemyFlag(enemy, "playstart", 3); + KinkyDungeonSetEnemyFlag(enemy, "motivated", 50); + + KDAddThought(enemy.id, "Jail", 5, enemy.playWithPlayer); + + let suff = (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : ""); + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff + "Leash").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 3); + }, + arrive: (enemy, _aiData) => { + // When the enemy arrives at the leash point we move the player to it + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", -1); + enemy.playWithPlayer = 0; + enemy.playWithPlayerCD = 80; + KinkyDungeonSetEnemyFlag(enemy, "playstart", 0); + KDResetAllAggro(); + if (KDGameData.PrisonerState == 'chase') KDGameData.PrisonerState = 'jail'; + KDResetAllIntents(); + KDBreakTether(KinkyDungeonPlayerEntity); + + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + return true; + }, + maintain: (enemy, delta, aiData) => { + let player = KDPlayer(); + let tethered = KDIsPlayerTethered(KinkyDungeonPlayerEntity); + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5 && !tethered && KDPlayerLeashed(KinkyDungeonPlayerEntity)) { + KinkyDungeonAttachTetherToEntity(2.5, enemy, player); + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 30); + return true; + } + else if (!tethered) { + if (enemy.aware) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 12); + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 2); + KDTryToLeash(enemy, player, delta, false, + (KDBoundPowerLevel < 0.5 || !KinkyDungeonHasWill(0.1)) && aiData.canAttack); + } + } else if (tethered && KDIsPlayerTetheredToEntity(KinkyDungeonPlayerEntity, enemy)) { + enemy.aware = true; + + if (!enemy.IntentLeashPoint) { + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + enemy.gx = enemy.IntentLeashPoint?.x; + enemy.gy = enemy.IntentLeashPoint?.y; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 12); + } + } + if (enemy.playWithPlayer < 10) { + enemy.playWithPlayer = 10; + } + return false; + }, + }, + "leashStorage": { + play: true, + nonaggressive: true, + // This will make the enemy want to leash you + weight: (_enemy, _aiData, _allied, _hostile, _aggressive) => { + return 0; + }, + trigger: (enemy, aiData) => { + KDResetIntent(enemy, aiData); + enemy.IntentAction = 'leashStorage'; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 140); + let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["storage"]); + enemy.IntentLeashPoint = nearestfurniture; + enemy.playWithPlayer = 22; + KDSetPlayCD(enemy, 3); + + KinkyDungeonSetEnemyFlag(enemy, "playstart", 3); + KinkyDungeonSetEnemyFlag(enemy, "motivated", 50); + + KDAddThought(enemy.id, "Jail", 5, enemy.playWithPlayer); + + let suff = (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : ""); + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff + "Leash").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 3); + }, + arrive: (enemy, aiData) => { + // When the enemy arrives at the leash point we move the player to it + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", -1); + enemy.playWithPlayer = 0; + enemy.playWithPlayerCD = 80; + KDGameData.PrisonerState = 'jail'; + KDResetAllAggro(KinkyDungeonPlayerEntity); + KinkyDungeonSetEnemyFlag(enemy, "playstart", 0); + KDResetAllIntents(true); + return KDSettlePlayerInFurniture(enemy, aiData, undefined, undefined, ["storage"]); + }, + maintain: (enemy, delta, aiData) => { + let player = KDPlayer(); + let tethered = KDIsPlayerTethered(KinkyDungeonPlayerEntity); + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5 && !tethered && KDPlayerLeashed(KinkyDungeonPlayerEntity)) { + KinkyDungeonAttachTetherToEntity(2.5, enemy, player); + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 30); + return true; + } + else if (!tethered) { + if (enemy.aware) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 12); + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 2); + KDTryToLeash(enemy, player, delta, false, + (KDBoundPowerLevel < 0.5 || !KinkyDungeonHasWill(0.1)) && aiData.canAttack); + } + } else if (tethered && KDIsPlayerTetheredToEntity(KinkyDungeonPlayerEntity, enemy)) { + enemy.aware = true; + + if (!enemy.IntentLeashPoint) { + let nj = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["storage"]); + enemy.IntentLeashPoint = nj; + } else { + enemy.gx = enemy.IntentLeashPoint?.x || KDMapData.StartPosition.y; + enemy.gy = enemy.IntentLeashPoint?.y || KDMapData.StartPosition.x; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 12); + + if (KDistChebyshev(enemy.IntentLeashPoint.x - enemy.x, enemy.IntentLeashPoint.y - enemy.y) < 1.5 && !aiData.aggressive) { + KDIntentEvents.leashStorage.arrive(enemy, aiData); + } + } + + + + + + } + if (enemy.playWithPlayer < 10) { + enemy.playWithPlayer = 10; + } + return false; + }, + }, + "leashCell": { + play: true, + nonaggressive: true, + noMassReset: true, + // This will make the enemy want to leash you + weight: (_enemy, _aiData, _allied, _hostile, _aggressive) => { + return 0; + }, + trigger: (enemy, aiData) => { + KDResetIntent(enemy, aiData); + enemy.IntentAction = 'leashCell'; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 140); + let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail"]); + enemy.IntentLeashPoint = nearestfurniture; + enemy.playWithPlayer = 22; + KDSetPlayCD(enemy, 3); + + KinkyDungeonSetEnemyFlag(enemy, "playstart", 3); + KinkyDungeonSetEnemyFlag(enemy, "motivated", 50); + + KDAddThought(enemy.id, "Jail", 5, enemy.playWithPlayer); + + let suff = (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : ""); + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff + "Leash").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 3); + }, + arrive: (enemy, aiData) => { + // When the enemy arrives at the leash point we move the player to it + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", -1); + enemy.playWithPlayer = 0; + enemy.playWithPlayerCD = 80; + KDGameData.PrisonerState = 'jail'; + KDResetAllAggro(KinkyDungeonPlayerEntity); + KinkyDungeonSetEnemyFlag(enemy, "playstart", 0); + KDResetAllIntents(true); + KDGameData.KinkyDungeonPrisonExtraGhostRep -= 1; + return KDPutInJail(KinkyDungeonPlayerEntity, enemy, null);; + }, + maintain: (enemy, delta, aiData) => { + let player = KDPlayer(); + let tethered = KDIsPlayerTethered(KinkyDungeonPlayerEntity); + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5 && !tethered && KDPlayerLeashed(KinkyDungeonPlayerEntity)) { + KinkyDungeonAttachTetherToEntity(2.5, enemy, player); + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 30); + return true; + } + else if (!tethered) { + if (enemy.aware) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 12); + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 2); + KDTryToLeash(enemy, player, delta, false, + (KDBoundPowerLevel < 0.5 || !KinkyDungeonHasWill(0.1)) && aiData.canAttack); + } + } else if (tethered && KDIsPlayerTetheredToEntity(KinkyDungeonPlayerEntity, enemy)) { + enemy.aware = true; + + if (!enemy.IntentLeashPoint) { + let nj = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail"]); + enemy.IntentLeashPoint = nj; + } else { + enemy.gx = enemy.IntentLeashPoint?.x || KDMapData.StartPosition.y; + enemy.gy = enemy.IntentLeashPoint?.y || KDMapData.StartPosition.x; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 12); + + if (KDistChebyshev(enemy.IntentLeashPoint.x - enemy.x, enemy.IntentLeashPoint.y - enemy.y) < 1.5 && !aiData.aggressive) { + KDIntentEvents.leashCell.arrive(enemy, aiData); + } + } + } + if (enemy.playWithPlayer < 10) { + enemy.playWithPlayer = 10; + } + return false; + }, + }, + "Ignore": { + nonaggressive: true, + // This is the basic leash to jail mechanic + weight: (_enemy, _aiData, _allied, _hostile, _aggressive) => { + return 90; + }, + trigger: (_enemy, _aiData) => { + }, + }, + "Play": { + play: true, + nonaggressive: true, + // This is the basic 'it's time to play!' dialogue + weight: (enemy, _aiData, allied, _hostile, _aggressive) => { + if (KDHelpless(enemy)) return 0; + return (KDEnemyHasFlag(enemy, "HelpMe")) ? + 0 + : (!enemy?.playWithPlayer ? (allied ? 10 : 110) : 0); + }, + trigger: (enemy, aiData) => { + KDResetIntent(enemy, aiData); + enemy.playWithPlayer = 8 + Math.floor(KDRandom() * (5 * Math.min(5, Math.max(enemy.Enemy.attackPoints || 0, enemy.Enemy.movePoints || 0)))); + KinkyDungeonSetEnemyFlag(enemy, "playstart", 7); + KDSetPlayCD(enemy, 3.5); + if (aiData.domMe) enemy.playWithPlayer = Math.floor(enemy.playWithPlayer * 0.7); + KDAddThought(enemy.id, "Play", 4, enemy.playWithPlayer); + + let index = Math.floor(Math.random() * 3); + let suff = (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : ""); + if (aiData.domMe) { + if (KDIsBrat(enemy)) + suff = "Brat" + suff; + else + suff = "Sub" + suff; + } + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff + index).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 12, 3); + }, + }, + "freeFurniture": { + // This is called to make an enemy free you from furniture + weight: (_enemy, _aiData, _allied, _hostile, _aggressive) => { + return 0; + }, + trigger: (enemy, _aiData) => { + // n/a + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 100); + }, + maintain: (enemy, _delta, aiData) => { + if (KinkyDungeonGetRestraintItem("ItemDevices")) { + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5) { + KinkyDungeonRemoveRestraint("ItemDevices", false, false, false); + KDResetIntent(enemy, undefined); + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", -1); + KinkyDungeonSetFlag("Released", 90); + KinkyDungeonSetFlag("nojailbreak", 15); + if (KDGameData.PrisonerState == 'jail' && KDIntentEvents.CaptureJail.weight(enemy, aiData, aiData.allied, true, true) > 0) { + KDIntentEvents.CaptureJail.trigger(enemy, {}); + } + if (enemy.playWithPlayer > 0) + enemy.playWithPlayerCD = Math.max(enemy.playWithPlayer, 30); + } else { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 12); + } + if (enemy.playWithPlayer > 0) + enemy.playWithPlayer = 12; + KinkyDungeonSetEnemyFlag(enemy, "seePlayer", 4); + return true; + } + return false; + }, + }, + "Capture": { + aggressive: true, + noplay: true, + // This is the basic leash to jail mechanic + weight: (_enemy, _aiData, _allied, _hostile, _aggressive) => { + return 100; + }, + trigger: (enemy, _aiData) => { + enemy.playWithPlayer = 0; + }, + }, + "CaptureJail": { + // Capture and bring to jail + aggressive: true, + nonaggressive: false, + noplay: true, + forceattack: true, + overrideIgnore: true, + // This is the basic leash to jail mechanic + weight: (enemy, _aiData, _allied, hostile, _aggressive) => { + //if (KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison) return 0; + if (enemy.Enemy?.Behavior?.leashCondition) { + if (!KDLeashConditions[enemy.Enemy.Behavior.leashCondition].check(enemy, _aiData.play)) + return 0; + } + return (hostile + && (enemy.Enemy.tags.jailer || enemy.Enemy.tags.jail || enemy.Enemy.tags.leashing) + && ((KinkyDungeonFlags.has("Released")) + || ( + !KDIsNearbyFurniture(enemy, 14) + ) + ) + && !KDEnemyHasFlag(enemy, "dontChase")) ? + ((KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["dropoff"]) + && !KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail"])) ? 0 : 100) + : 0; + }, + trigger: (enemy, _aiData) => { + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 30); + enemy.playWithPlayer = 0; + enemy.IntentAction = 'CaptureJail'; + + + let nj = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail"]); + let pos = KDMapData.StartPosition; + if (!nj || KinkyDungeonFlags.get("LeashToPrison") || KDSelfishLeash(enemy)) { + nj = null; + if (KDGenHighSecCondition(!nj, enemy)) { + pos = KDGetHighSecLoc(enemy, !KDSelfishLeash(enemy)); + } + KinkyDungeonSetFlag("LeashToPrison", -1, 1); + } + enemy.IntentLeashPoint = nj ? nj : Object.assign({ type: "jail", radius: 1 }, pos); + + }, + maintain: (enemy, delta, aiData) => { + let player = KDPlayer(); + let tethered = KDIsPlayerTethered(KinkyDungeonPlayerEntity); + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5 && !tethered && KDPlayerLeashed(KinkyDungeonPlayerEntity)) { + KinkyDungeonAttachTetherToEntity(2.5, enemy, player); + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 30); + return true; + } + else if (!tethered) { + if (enemy.aware) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 2); + KDTryToLeash(enemy, player, delta, false, + (KDBoundPowerLevel < 0.5 || !KinkyDungeonHasWill(0.1)) && aiData.canAttack); + } + } else if (tethered && KDIsPlayerTetheredToEntity(KinkyDungeonPlayerEntity, enemy)) { + enemy.aware = true; + + if (!enemy.IntentLeashPoint) { + let nj = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail"]); + let pos = KDMapData.StartPosition; + if (!nj || KinkyDungeonFlags.get("LeashToPrison")) { + if (KDGenHighSecCondition(!nj, enemy)) { + pos = KDGetHighSecLoc(enemy, !KDSelfishLeash(enemy)); + } + KinkyDungeonSetFlag("LeashToPrison", -1, 1); + } + enemy.IntentLeashPoint = nj ? nj : Object.assign({ type: "jail", radius: 1 }, pos); + } + + enemy.gx = enemy.IntentLeashPoint?.x || KDMapData.StartPosition.y; + enemy.gy = enemy.IntentLeashPoint?.y || KDMapData.StartPosition.x; + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 12); + + // If they are not attacking player + if (KDistChebyshev(enemy.gx - enemy.x, enemy.gy - enemy.y) < 1.5 && !aiData.aggressive) { + KDIntentEvents.CaptureJail.arrive(enemy, aiData); + } + // TODO add release case based on alliance + } + if (enemy.playWithPlayer < 10) { + enemy.playWithPlayer = 10; + } + return false; + }, + arrive: (enemy, aiData) => { + if (KDGameData.PrisonerState == 'parole') { + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "Mistake").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 6, 8); + KDBreakTether(KinkyDungeonPlayerEntity); + if (enemy.IntentLeashPoint) + KDMovePlayer(enemy.IntentLeashPoint.x, enemy.IntentLeashPoint.y, false, false); + KDResetIntent(enemy, aiData); + enemy.playWithPlayer = 0; + enemy.playWithPlayerCD = 24; + return true; + } else if (KDGameData.PrisonerState == 'jail') { + let nj = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail"]); + KDPutInJail(KinkyDungeonPlayerEntity, enemy, nj ? nj : KDMapData.StartPosition); + KDResetIntent(enemy, aiData); + KDBreakTether(KinkyDungeonPlayerEntity); + if (!nj) + aiData.defeat = true; + } else { + let nj = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail"]); + KDPutInJail(KinkyDungeonPlayerEntity, enemy, nj ? nj : KDMapData.StartPosition); + KDResetIntent(enemy, aiData); + KDBreakTether(KinkyDungeonPlayerEntity); + aiData.defeat = true; + } + KDResetAllAggro(); + KDResetAllIntents(); + return false; + }, + }, + "ToyWithPlayer": { + // Capture and bring to jail + aggressive: true, + nonaggressive: false, + noplay: true, + forceattack: true, + overrideIgnore: true, + // This is the basic leash to jail mechanic + weight: (enemy, _aiData, _allied, hostile, _aggressive) => { + if (!["", "Dom", "Sub", "Brat"].includes(KDJailPersonality(enemy))) return 0; + if (KinkyDungeonLeashingEnemy() || KDGameData.PrisonerState == 'chase') return 0; + if (KDBoundPowerLevel < 0.5) return 0; + if (!KDEnemyCanTalk(enemy) || !enemy.Enemy?.bound) return 0; + if (KinkyDungeonFlags.get("PlayerCombat") || KinkyDungeonFlags.get("ToyedWith")) return 0; + return (hostile && (enemy.Enemy.tags.jailer || enemy.Enemy.tags.jail || enemy.Enemy.tags.leashing) && !KDEnemyHasFlag(enemy, "dontChase")) ? + KDBoundPowerLevel * 10 + (KinkyDungeonFlags.get("CallForHelp") ? 40 : 0) + : 0; + }, + trigger: (enemy, _aiData) => { + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 20); + KinkyDungeonSetEnemyFlag(enemy, "toyWithPlayer", 20 + Math.floor(KDRandom() * 10)); + for (let en of KDNearbyEnemies(enemy.x, enemy.y, 10)) { + if (en != enemy) en.ceasefire = 20; + } + enemy.playWithPlayer = 0; + enemy.IntentAction = 'ToyWithPlayer'; + KinkyDungeonSetFlag("ToyedWith", 100); + + KinkyDungeonSendDialogue(enemy, TextGet("KDCombatLine_YoureFinished_" + KDJailPersonality(enemy) + Math.floor(Math.random() * 3)), KDGetColor(enemy), 9, 10); + + }, + maintain: (enemy, _delta, _aiData) => { + if (KinkyDungeonFlags.get("PlayerCombat") + || !KDEnemyHasFlag(enemy, "toyWithPlayer") + || KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) > 5.5) { + KDResetIntent(enemy); + KinkyDungeonAggroAction('attack', {enemy: enemy}); + return false; + } + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 5.5) { + + KinkyDungeonSetEnemyFlag(enemy, "nobind", 2); + KinkyDungeonSetEnemyFlag(enemy, "noleash", 2); + KinkyDungeonSetEnemyFlag(enemy, "nosteal", 2); + KinkyDungeonSetEnemyFlag(enemy, "alwayswill", 2); + + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + return true; + } + return false; + }, + }, + "TempLeash": { + aggressive: false, + nonaggressive: true, + //play: true, + // This is the basic leash to jail mechanic + weight: (enemy, aiData, _allied, _hostile, _aggressive) => { + if (enemy.Enemy?.Behavior?.leashCondition) { + if (!KDLeashConditions[enemy.Enemy.Behavior.leashCondition].check(enemy, aiData.play)) + return 0; + } + return (aiData?.playerDist < 6.99 + && enemy != KinkyDungeonJailGuard() + && KinkyDungeonPlayerTags.get("Collars") && KinkyDungeonGetRestraintItem("ItemNeckRestraints") + && !KinkyDungeonFlags.has("TempLeashCD") + && (KDGameData.PrisonerState == 'parole' || KinkyDungeonGoddessRep.Ghost > 0 || KDEnemyHasFlag(enemy, "allowLeashWalk")) + && (KDGameData.PrisonerState != 'jail' || (!KDHostile(enemy) && !KinkyDungeonPlayerInCell(true))) + //&& KDStrictPersonalities.includes(KDJailPersonality(enemy)) + && KDEnemyCanTalk(enemy) + && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)) ? + ((KDStrictPersonalities.includes(KDJailPersonality(enemy)) || KDJailPersonality(enemy) == "Robot") ? 100 : 10) + : 0; + }, + trigger: (enemy, _aiData) => { + KinkyDungeonSetEnemyFlag(enemy, "templeashpause", 3); + let duration = 60 + Math.round(KDRandom()*40); + KinkyDungeonSetFlag("TempLeash", duration); + KinkyDungeonSetFlag("TempLeashCD", duration*2); + KinkyDungeonSetFlag("noResetIntent", 12); + KinkyDungeonSetFlag("nojailbreak", 12); + + if (!KDHostile(enemy)) + KinkyDungeonSetEnemyFlag(enemy, "noHarshPlay", 12); + + enemy.playWithPlayer = 12; + enemy.playWithPlayerCD = 40; + enemy.IntentAction = 'TempLeash'; + KDTickTraining("Heels", KDGameData.HeelPower > 0, + KDGameData.HeelPower <= 0, 4, 25); + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + (KDEnemyCanTalk(enemy) ? KDJailPersonality(enemy) : "Gagged") + "LeashTime").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 14, 10); + KDAddThought(enemy.id, "Play", 7, enemy.playWithPlayer); + + }, + maintain: (enemy, _delta, aiData) => { + if (!KDHostile(enemy)) + KinkyDungeonSetEnemyFlag(enemy, "noHarshPlay", 12); + + if (!KinkyDungeonFlags.has("TempLeash") + || !(KinkyDungeonPlayerTags.get("Collars") + && KinkyDungeonGetRestraintItem("ItemNeckRestraints"))) { + if (!(KinkyDungeonPlayerTags.get("Collars") + && KinkyDungeonGetRestraintItem("ItemNeckRestraints")) + || KDGameData.PrisonerState != 'jail' + || KDIsInPartyID(enemy.id)) { + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + KinkyDungeonSetEnemyFlag(enemy, "wander", 7); + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 0); + + if (KDIsPlayerTetheredToLocation(KinkyDungeonPlayerEntity, enemy.x, enemy.y, enemy)) { + if (!KinkyDungeonFlags.has("TempLeash")) + KDTickTraining("Heels", KDGameData.HeelPower > 0, + KDGameData.HeelPower <= 0, 6, 25); + KDBreakTether(KinkyDungeonPlayerEntity); + enemy.playWithPlayer = 0; + enemy.playWithPlayerCD = 30; + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "LeashEndNow").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 7, 10); + } + } else { + // Bring back! + if (aiData?.playerDist < 7.5) { + if (enemy.playWithPlayer < 10 && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + enemy.playWithPlayer = 10; + KinkyDungeonSetFlag("nojailbreak", 2); + }// else enemy.playWithPlayer += delta; + KinkyDungeonSetFlag("noResetIntentFull", 10); + } + + // Enemies will still be able to play with you! + KinkyDungeonSetFlag("overrideleashprotection", 2); + + if (!KinkyDungeonFlags.get("TempLeashReturn")) { + KinkyDungeonSetFlag("TempLeashReturn", 40); + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "LeashEndReturn").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 7, 7); + } + if (!KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5 && !KDEntityHasFlag(enemy, "templeashpause")) { + let player = KDPlayer(); + // Leash the player if they are close + KinkyDungeonAttachTetherToEntity(4.5, enemy, player); + if (KinkyDungeonGetRestraintItem("ItemDevices")) { + KinkyDungeonRemoveRestraint("ItemDevices", false, false, false); + } + KinkyDungeonSetEnemyFlag(enemy, "templeashpause", 3); + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "Leashed").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 5, 10); + + KDAddThought(enemy.id, "Happy", 6, enemy.playWithPlayer); + } + } else { + // We will wander more than usual + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + if (enemy.idle || (KDistChebyshev(enemy.x - enemy.gx, enemy.y - enemy.gy) < 4)) { + KDResetGuardSpawnTimer(); + let furn = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"], undefined, undefined, true); + let jail = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail"]); + let newPoint = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail", "furniture"]); + if (newPoint) { + enemy.keys = true; + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + KinkyDungeonSetEnemyFlag(enemy, "wander", 300); + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 300); + if ((furn && KDistChebyshev(enemy.x - furn.x, enemy.y - furn.y) < 1.5) + || (jail && KDistChebyshev(enemy.x - jail.x, enemy.y - jail.y) < 1.5)) { + if (newPoint && newPoint.x == furn?.x && newPoint.y == furn?.y) { + KDSettlePlayerInFurniture(enemy, aiData); + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + } else { + let nearestJail = KinkyDungeonNearestJailPoint(enemy.x, enemy.y); + let jailRadius = (nearestJail && nearestJail.radius) ? nearestJail.radius : 1.5; + let playerInCell = nearestJail ? (Math.abs(KinkyDungeonPlayerEntity.x - nearestJail.x) < jailRadius - 1 && Math.abs(KinkyDungeonPlayerEntity.y - nearestJail.y) <= jailRadius) + : null; + if (!playerInCell) { + let point = {x: nearestJail.x, y: nearestJail.y};//KinkyDungeonGetNearbyPoint(nearestJail.x, nearestJail.y, true, undefined, true); + if (point) { + let lastx = KinkyDungeonPlayerEntity.x; + let lasty = KinkyDungeonPlayerEntity.y; + KDMovePlayer(point.x, point.y, false); + KDMoveEntity(enemy, lastx, lasty, true); + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 0); + let newPoint2 = KinkyDungeonGetRandomEnemyPoint(true, + false, enemy); + if (newPoint2) { + enemy.path = undefined; + KinkyDungeonSetEnemyFlag(enemy, "blocked", 24); + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + enemy.gx = newPoint2.x; + enemy.gy = newPoint2.y; + } else { + enemy.path = undefined; + KinkyDungeonSetEnemyFlag(enemy, "blocked", 24); + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + enemy.gx = KDMapData.EndPosition.x; + enemy.gy = KDMapData.EndPosition.y; + } + } + } + KDBreakTether(KinkyDungeonPlayerEntity); + } + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + KinkyDungeonSetEnemyFlag(enemy, "wander", 7); + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 0); + } + } else { + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + KinkyDungeonSetEnemyFlag(enemy, "wander", 7); + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 0); + } + + } + } + } + + } else { + if (aiData?.playerDist < 5.5) { + if (enemy.playWithPlayer < 10 && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + enemy.playWithPlayer = 10; + }// else enemy.playWithPlayer += delta; + KinkyDungeonSetFlag("noResetIntentFull", 10); + } + + // Enemies will still be able to play with you! + KinkyDungeonSetFlag("overrideleashprotection", 2); + + let returnToJail = KDGameData.PrisonerState == 'jail'; + + if (KinkyDungeonFlags.get("TempLeash") == 10 && returnToJail) { + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "LeashEndReturn").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 7, 7); + } + if (!KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5) { + let player = KDPlayer(); + // Leash the player if they are close + KinkyDungeonAttachTetherToEntity(4.5, enemy, player); + if (KinkyDungeonGetRestraintItem("ItemDevices")) { + KinkyDungeonRemoveRestraint("ItemDevices", false, false, false); + } + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "Leashed").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 5, 10); + + KDAddThought(enemy.id, "Happy", 6, enemy.playWithPlayer); + } + } else { + // We will wander more than usual + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + if (enemy.idle) { + KDResetGuardSpawnTimer(); + if (KDRandom() < 0.33) { + let newPoint = KinkyDungeonGetRandomEnemyPoint(false, + enemy.tracking && KinkyDungeonHuntDownPlayer && KDGameData.PrisonerState != "parole" && KDGameData.PrisonerState != "jail"); + if (newPoint) { + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + } + } else { + let newPoint = KinkyDungeonGetNearbyPoint(enemy.x, enemy.y, false); + if (newPoint) { + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + } + } + + } + } + + } + return false; + }, + }, + "Cuddle": { + aggressive: false, + nonaggressive: true, + //play: true, + // This is the basic leash to jail mechanic + weight: (enemy, aiData, _allied, _hostile, _aggressive) => { + return (aiData?.playerDist < 6.99 + && enemy != KinkyDungeonJailGuard() + && KinkyDungeonPlayerTags.get("Collars") && KinkyDungeonGetRestraintItem("ItemNeckRestraints") + && !KinkyDungeonFlags.has("TempLeashCD") + && (KDGameData.PrisonerState == 'parole' || KinkyDungeonGoddessRep.Ghost > 0 || KDEnemyHasFlag(enemy, "allowLeashWalk")) + && (KDGameData.PrisonerState != 'jail' || (!KDHostile(enemy) && !KinkyDungeonPlayerInCell(true))) + //&& KDStrictPersonalities.includes(KDJailPersonality(enemy)) + && KDEnemyCanTalk(enemy) + && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)) ? + ((KDStrictPersonalities.includes(KDJailPersonality(enemy)) || KDJailPersonality(enemy) == "Robot") ? 100 : 10) + : 0; + }, + trigger: (enemy, _aiData) => { + KinkyDungeonSetEnemyFlag(enemy, "templeashpause", 3); + let duration = 60 + Math.round(KDRandom()*40); + KinkyDungeonSetFlag("TempLeash", duration); + KinkyDungeonSetFlag("TempLeashCD", duration*2); + KinkyDungeonSetFlag("noResetIntent", 12); + KinkyDungeonSetFlag("nojailbreak", 12); + + if (!KDHostile(enemy)) + KinkyDungeonSetEnemyFlag(enemy, "noHarshPlay", 12); + + enemy.playWithPlayer = 12; + enemy.playWithPlayerCD = 40; + enemy.IntentAction = 'TempLeash'; + KDTickTraining("Heels", KDGameData.HeelPower > 0, + KDGameData.HeelPower <= 0, 4, 25); + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + (KDEnemyCanTalk(enemy) ? KDJailPersonality(enemy) : "Gagged") + "LeashTime").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 14, 10); + KDAddThought(enemy.id, "Play", 7, enemy.playWithPlayer); + + }, + maintain: (enemy, _delta, aiData) => { + if (!KDHostile(enemy)) + KinkyDungeonSetEnemyFlag(enemy, "noHarshPlay", 12); + + if (!KinkyDungeonFlags.has("TempLeash") || !(KinkyDungeonPlayerTags.get("Collars") && KinkyDungeonGetRestraintItem("ItemNeckRestraints"))) { + if (!(KinkyDungeonPlayerTags.get("Collars") && KinkyDungeonGetRestraintItem("ItemNeckRestraints")) || KDGameData.PrisonerState != 'jail') { + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + KinkyDungeonSetEnemyFlag(enemy, "wander", 7); + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 0); + + if (KDIsPlayerTetheredToLocation(KinkyDungeonPlayerEntity, enemy.x, enemy.y, enemy)) { + if (!KinkyDungeonFlags.has("TempLeash")) + KDTickTraining("Heels", KDGameData.HeelPower > 0, + KDGameData.HeelPower <= 0, 6, 25); + KDBreakTether(KinkyDungeonPlayerEntity); + enemy.playWithPlayer = 0; + enemy.playWithPlayerCD = 30; + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "LeashEndNow").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 7, 10); + } + } else { + // Bring back! + if (aiData?.playerDist < 7.5) { + if (enemy.playWithPlayer < 10 && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + enemy.playWithPlayer = 10; + KinkyDungeonSetFlag("nojailbreak", 2); + }// else enemy.playWithPlayer += delta; + KinkyDungeonSetFlag("noResetIntentFull", 10); + } + + // Enemies will still be able to play with you! + KinkyDungeonSetFlag("overrideleashprotection", 2); + + if (!KinkyDungeonFlags.get("TempLeashReturn")) { + KinkyDungeonSetFlag("TempLeashReturn", 40); + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "LeashEndReturn").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 7, 7); + } + if (!KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5 && !KDEntityHasFlag(enemy, "templeashpause")) { + let player = KDPlayer(); + // Leash the player if they are close + KinkyDungeonAttachTetherToEntity(4.5, enemy, player); + if (KinkyDungeonGetRestraintItem("ItemDevices")) { + KinkyDungeonRemoveRestraint("ItemDevices", false, false, false); + } + KinkyDungeonSetEnemyFlag(enemy, "templeashpause", 3); + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "Leashed").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 5, 10); + + KDAddThought(enemy.id, "Happy", 6, enemy.playWithPlayer); + } + } else { + // We will wander more than usual + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + if (enemy.idle || (KDistChebyshev(enemy.x - enemy.gx, enemy.y - enemy.gy) < 4)) { + KDResetGuardSpawnTimer(); + let furn = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"], undefined, undefined, true); + let jail = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail"]); + let newPoint = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["jail", "furniture"]); + if (newPoint) { + enemy.keys = true; + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + KinkyDungeonSetEnemyFlag(enemy, "wander", 300); + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 300); + if ((furn && KDistChebyshev(enemy.x - furn.x, enemy.y - furn.y) < 1.5) + || (jail && KDistChebyshev(enemy.x - jail.x, enemy.y - jail.y) < 1.5)) { + if (newPoint && newPoint.x == furn?.x && newPoint.y == furn?.y) { + KDSettlePlayerInFurniture(enemy, aiData); + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + } else { + let nearestJail = KinkyDungeonNearestJailPoint(enemy.x, enemy.y); + let jailRadius = (nearestJail && nearestJail.radius) ? nearestJail.radius : 1.5; + let playerInCell = nearestJail ? (Math.abs(KinkyDungeonPlayerEntity.x - nearestJail.x) < jailRadius - 1 && Math.abs(KinkyDungeonPlayerEntity.y - nearestJail.y) <= jailRadius) + : null; + if (!playerInCell) { + let point = {x: nearestJail.x, y: nearestJail.y};//KinkyDungeonGetNearbyPoint(nearestJail.x, nearestJail.y, true, undefined, true); + if (point) { + let lastx = KinkyDungeonPlayerEntity.x; + let lasty = KinkyDungeonPlayerEntity.y; + KDMovePlayer(point.x, point.y, false); + KDMoveEntity(enemy, lastx, lasty, true); + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 0); + let newPoint2 = KinkyDungeonGetRandomEnemyPoint(true, + false, enemy); + if (newPoint2) { + enemy.path = undefined; + KinkyDungeonSetEnemyFlag(enemy, "blocked", 24); + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + enemy.gx = newPoint2.x; + enemy.gy = newPoint2.y; + } else { + enemy.path = undefined; + KinkyDungeonSetEnemyFlag(enemy, "blocked", 24); + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + enemy.gx = KDMapData.EndPosition.x; + enemy.gy = KDMapData.EndPosition.y; + } + } + } + KDBreakTether(KinkyDungeonPlayerEntity); + } + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + KinkyDungeonSetEnemyFlag(enemy, "wander", 7); + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 0); + } + } else { + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + KinkyDungeonSetEnemyFlag(enemy, "wander", 7); + KinkyDungeonSetEnemyFlag(enemy, "overrideMove", 0); + } + + } + } + } + + } else { + if (aiData?.playerDist < 5.5) { + if (enemy.playWithPlayer < 10 && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + enemy.playWithPlayer = 10; + }// else enemy.playWithPlayer += delta; + KinkyDungeonSetFlag("noResetIntentFull", 10); + } + + // Enemies will still be able to play with you! + KinkyDungeonSetFlag("overrideleashprotection", 2); + + if (KinkyDungeonFlags.get("TempLeash") == 10 && KDGameData.PrisonerState == 'jail') { + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "LeashEndReturn").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 7, 7); + } + if (!KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { + enemy.gx = KinkyDungeonPlayerEntity.x; + enemy.gy = KinkyDungeonPlayerEntity.y; + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5) { + let player = KDPlayer(); + // Leash the player if they are close + KinkyDungeonAttachTetherToEntity(4.5, enemy, player); + if (KinkyDungeonGetRestraintItem("ItemDevices")) { + KinkyDungeonRemoveRestraint("ItemDevices", false, false, false); + } + KinkyDungeonSendDialogue(enemy, + TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "Leashed").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + KDGetColor(enemy), 5, 10); + + KDAddThought(enemy.id, "Happy", 6, enemy.playWithPlayer); + } + } else { + // We will wander more than usual + KinkyDungeonSetEnemyFlag(enemy, "wander", 0); + KinkyDungeonSetEnemyFlag(enemy, "genpath", 0); + if (enemy.idle) { + KDResetGuardSpawnTimer(); + if (KDRandom() < 0.33) { + let newPoint = KinkyDungeonGetRandomEnemyPoint(false, + enemy.tracking && KinkyDungeonHuntDownPlayer && KDGameData.PrisonerState != "parole" && KDGameData.PrisonerState != "jail"); + if (newPoint) { + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + } + } else { + let newPoint = KinkyDungeonGetNearbyPoint(enemy.x, enemy.y, false); + if (newPoint) { + enemy.gx = newPoint.x; + enemy.gy = newPoint.y; + } + } + + } + } + + } + return false; + }, + }, + "CaptureDoll": { + // Capture and bring to dropoff + aggressive: true, + nonaggressive: true, + noplay: true, + forceattack: true, + // This is the basic leash to jail mechanic + weight: (enemy, _aiData, _allied, hostile, _aggressive) => { + if (enemy.Enemy?.Behavior?.leashCondition) { + if (!KDLeashConditions[enemy.Enemy.Behavior.leashCondition].check(enemy, _aiData.play)) + return 0; + } + return hostile && (enemy.Enemy.tags.jailer || enemy.Enemy.tags.jail || enemy.Enemy.tags.leashing) && (KinkyDungeonFlags.has("Released") + && !KDEnemyHasFlag(enemy, "dontChase") && KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["dropoff"])) ? 200 : 0; + }, + trigger: (enemy, _aiData) => { + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 30); + enemy.playWithPlayer = 0; + enemy.IntentAction = 'CaptureDoll'; + enemy.IntentLeashPoint = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["dropoff"]); + }, + arrive: (enemy, aiData) => { + if (KDGameData.PrisonerState == 'parole') { + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonJailer" + KDJailPersonality(enemy) + "Mistake").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 6, 8); + KDBreakTether(KinkyDungeonPlayerEntity); + if (enemy.IntentLeashPoint) + KDMovePlayer(enemy.IntentLeashPoint.x, enemy.IntentLeashPoint.y, false, false); + KDResetIntent(enemy, aiData); + enemy.playWithPlayer = 0; + enemy.playWithPlayerCD = 24; + return true; + } + aiData.defeat = true; + KDBreakTether(KinkyDungeonPlayerEntity); + return false; + }, + }, + "CaptureDemon": { + aggressive: true, + nonaggressive: true, + noplay: true, + forceattack: true, + // This is the basic leash to jail mechanic + weight: (enemy, _aiData, _allied, hostile, _aggressive) => { + return hostile && (enemy.Enemy.tags.leashing && enemy.Enemy.tags.demon) && KDPlayerLeashed(KinkyDungeonPlayerEntity) ? 2000 : 0; + }, + trigger: (enemy, _aiData) => { + let point = KinkyDungeonGetRandomEnemyPointCriteria((x,y) => { + return KDistEuclidean(x - enemy.x, y - enemy.y) < 10 && KDistEuclidean(x - KinkyDungeonPlayerEntity.x, y - KinkyDungeonPlayerEntity.y) > 4; + }, true, false, enemy); + if (point) { + KinkyDungeonSetEnemyFlag(enemy, "noResetIntent", 30); + /** Create the portal */ + KDCreateEffectTile(point.x, point.y, { + name: "Portals/DarkPortal", + }, 0); + + enemy.playWithPlayer = 0; + enemy.IntentAction = 'CaptureDemon'; + enemy.IntentLeashPoint = { + x: point.x, + y: point.y, + type: "DemonPortal", + radius: 1.0, + }; + } + }, + maintain: (enemy, _delta, aiData) => { + if (!enemy.IntentLeashPoint || !KDEffectTileTags(enemy.IntentLeashPoint.x, enemy.IntentLeashPoint.y).demonportal || !KDPlayerLeashed(KinkyDungeonPlayerEntity)) { + KDResetIntent(enemy, aiData); + return true; + } + return false; + }, + arrive: (enemy, aiData) => { + if (!enemy.IntentLeashPoint || !KDEffectTileTags(enemy.IntentLeashPoint.x, enemy.IntentLeashPoint.y).demonportal || !KDPlayerLeashed(KinkyDungeonPlayerEntity)) { + return false; + } + KDResetIntent(enemy, aiData); + KDBreakTether(KinkyDungeonPlayerEntity); + aiData.defeat = true; + KDCustomDefeat = "DemonTransition"; + KDCustomDefeatEnemy = enemy; + return true; + }, + }, + "leashFurnitureAggressive": { + noplay: true, + aggressive: true, + // This will make the enemy want to leash you + weight: (enemy, aiData, _allied, hostile, _aggressive) => { + if (!enemy.Enemy.tags.leashing) return 0; + if (KinkyDungeonFlags.get("Released")) return 0; + if (KinkyDungeonFlags.get("LeashToPrison")) return 0; + if (KDGameData.PrisonerState == 'jail') return 0; + if (KDSelfishLeash(enemy)) return 0; + if (KinkyDungeonGetRestraintItem("ItemDevices") + && KinkyDungeonSlowLevel >= 9 && KDGameData.PrisonerState != 'chase') return 0; + if (KDEnemyHasFlag(enemy, "dontChase")) return 0; + if (enemy.Enemy?.Behavior?.leashCondition) { + if (!KDLeashConditions[enemy.Enemy.Behavior.leashCondition].check(enemy, aiData.play)) + return 0; + } + let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"], undefined, undefined, true); + return nearestfurniture && KDistChebyshev(enemy.x - nearestfurniture.x, enemy.y - nearestfurniture.y) <= 14 ? (hostile ? 120 : (aiData.domMe ? 0 : 40)) : 0; + }, + trigger: (enemy, aiData) => { + KDResetIntent(enemy, aiData); + enemy.IntentAction = 'leashFurnitureAggressive'; + let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ["furniture"], undefined, undefined, true); + enemy.IntentLeashPoint = nearestfurniture; + + KDAddThought(enemy.id, "Jail", 5, 3); + + let suff = (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : ""); + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff + "Leash").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 3); + }, + arrive: (enemy, aiData) => { + // When the enemy arrives at the leash point we move the player to it + enemy.IntentAction = ''; + enemy.IntentLeashPoint = null; + let res = KDSettlePlayerInFurniture(enemy, aiData, ["callGuardJailerOnly"]); + if (res) { + KDResetAllAggro(); + KDResetAllIntents(); + for (let e of KDMapData.Entities) { + if (e.hostile < 9000) e.hostile = 0; + if (e.attackPoints > 0) e.attackPoints = 0; + if (!e.ceasefire) e.ceasefire = 1; + } + KDGameData.PrisonerState = 'jail'; + } + return res; + }, + maintain: (enemy, _delta, _aiData) => { + if (KDistChebyshev(enemy.x - KinkyDungeonPlayerEntity.x, enemy.y - KinkyDungeonPlayerEntity.y) < 1.5 + || KDIsPlayerTetheredToLocation(KinkyDungeonPlayerEntity, enemy.x, enemy.y, enemy)) { + if (enemy.playWithPlayer < 10) { + enemy.playWithPlayer = 10; + }// else enemy.playWithPlayer += delta; + } + return false; + }, + }, +}; + +/** + * @param enemy + * @param [aiData] + */ +function KDResetIntent(enemy: entity, _aiData?: KDAIData) { + enemy.IntentLeashPoint = null; + enemy.IntentAction = ""; +} + +/** + * Helper function called to leash player to the nearest furniture + * @param enemy + * @param aiData + * @param [tags] + * @param [guardDelay] + * @param [ftype] + */ +function KDSettlePlayerInFurniture(enemy: entity, _aiData: KDAIData, tags?: string[], guardDelay: number = 24, ftype: string[] = ["furniture"]): boolean { + let nearestfurniture = KinkyDungeonNearestJailPoint(enemy.x, enemy.y, ftype); + let tile = KinkyDungeonTilesGet(nearestfurniture.x + "," + nearestfurniture.y); + let type = tile ? tile.Furniture : undefined; + + let ee = KinkyDungeonEnemyAt(nearestfurniture.x, nearestfurniture.y); + if (ee && ee != enemy) { + KDKickEnemy(ee, undefined, true); + } + if (enemy.x == nearestfurniture.x && enemy.y == nearestfurniture.y) + KDMoveEntity(enemy, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, + true, undefined, undefined, true); + KDMovePlayer(nearestfurniture.x, nearestfurniture.y, false); + if (KinkyDungeonPlayerEntity.x == nearestfurniture.x && KinkyDungeonPlayerEntity.y == nearestfurniture.y) { + let furn = KDFurniture[type]; + if (furn) { + KinkyDungeonSetFlag("GuardCalled", guardDelay); + if (tags) { + for (let t of tags) { + KinkyDungeonSetFlag(t, guardDelay + 60); + } + } + + let res = KDApplyFurnitureRestraint(nearestfurniture.x, nearestfurniture.y, KDPlayer()); + if (!res) { + return false; + } + KinkyDungeonMakeNoise(10, nearestfurniture.x, nearestfurniture.y); + } + + KDResetAllAggro(); + KDResetAllIntents(); + KDBreakTether(KinkyDungeonPlayerEntity); + return true; + } + return false; +} + +/** + * @param enemy + * @param player + * @param delta + * @param slow uses the spell + */ +function KDTryToLeash(enemy: entity, player: entity, delta: number, instant?: boolean, atkOnly?: boolean) { + if (delta > 0 && KDistChebyshev(enemy.x - player.x, enemy.y - player.y) < 1.5) { + KDAttachLeashOrCollar(enemy, player, delta, instant, atkOnly); + } +} + + +/** + * + * @param enemy + * @param player + * @param delta + * @param instant + * @param slow uses the spell + */ +function KDAttachLeashOrCollar(enemy: entity, player: entity, delta: number = 0, instant?: boolean, atkOnly?: boolean) { + let newRestraint = KinkyDungeonGetRestraintByName(KDPlayerLeashable(player) ? "BasicLeash" : "BasicCollar"); + if (newRestraint) { + if (!atkOnly) { + // Attach a leash or collar + if (KDEnemyHasFlag(enemy, "applyItem2") || KDEnemyHasFlag(enemy, "applyItem")){ + if (enemy.targetingX != player.x || enemy.targetingY != player.y) { + delete enemy.targetingX; + delete enemy.targetingY; + KinkyDungeonSetEnemyFlag(enemy, "applyItem", 0); + KinkyDungeonSetEnemyFlag(enemy, "applyItem2", 0); + } + } + + if (!instant && (!KDEnemyHasFlag(enemy, "applyItem"))) { + enemy.targetingX = player.x; + enemy.targetingY = player.y; + KinkyDungeonCreateWarningTile(player.x, player.y, enemy.Enemy.color || "#ff5277", + 1 + delta, 2 + ); + KinkyDungeonSetEnemyFlag(enemy, "applyItem", 2 + delta); + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonJailerStartAdding") + .replace("RestraintName", TextGet("Restraint" + newRestraint.name)) + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + "yellow", 2, true); + } else if (!instant && !KDEnemyHasFlag(enemy, "applyItem2")) { + KinkyDungeonCreateWarningTile(player.x, player.y, enemy.Enemy.color || "#ff5277", + 1 + delta, + ); + KinkyDungeonSetEnemyFlag(enemy, "applyItem2", 1 + delta); + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonJailerStartAdding") + .replace("RestraintName", TextGet("Restraint" + newRestraint.name)) + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + "yellow", 2, true); + } else { + KinkyDungeonAddRestraintIfWeaker(newRestraint, 0, true); + KinkyDungeonSetEnemyFlag(enemy, "applyItem", 0); + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonAddRestraints") + .replace("NewRestraintName", TextGet("Restraint" + newRestraint.name)) + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + "yellow", 2, true); + } + } else { + if (!KDEnemyHasFlag(enemy, "applyItemAtk")) { + if (KDEnemyHasFlag(enemy, "touchedPlayer")) { + KinkyDungeonAddRestraintIfWeaker(newRestraint, 0, true); + KinkyDungeonSetEnemyFlag(enemy, "applyItemAtk", 4); + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonAddRestraints") + .replace("NewRestraintName", TextGet("Restraint" + newRestraint.name)) + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + "yellow", 2, true); + } else { + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonJailerStartAdding") + .replace("RestraintName", TextGet("Restraint" + newRestraint.name)) + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), + "yellow", 2, true); + } + + + } + } + } +} + +function KDApplyFurnitureRestraint(x: number, y: number, player: entity) { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (!tile) return false; + let type = tile ? tile.Furniture : undefined; + if (!type) return false; + let furn = KDFurniture[type]; + if (!furn) return false; + + if (player == KDPlayer()) { + let rest = KinkyDungeonGetRestraint( + {tags: [furn.restraintTag]}, MiniGameKinkyDungeonLevel, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, + "", + true, + false, + false); + if (rest) { + KinkyDungeonAddRestraintIfWeaker(rest, 0, true); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); + + return true; + } + else return false; + } + return false; +} \ No newline at end of file diff --git a/Game/src/enemy/KinkyDungeonEnemyTeaseAttacks.ts b/Game/src/enemy/KinkyDungeonEnemyTeaseAttacks.ts new file mode 100644 index 000000000..6ddfabf46 --- /dev/null +++ b/Game/src/enemy/KinkyDungeonEnemyTeaseAttacks.ts @@ -0,0 +1,757 @@ +"use strict"; + +let KDTeaseAttackLists: KDTeaseAttackListsType = { + Basic: [ + "SquishBreast", + "LeashGrab", + "SpankButt", + "TickleArmpits", + "TickleFeet", + "Headpat", + "ShoulderMassage", + "Praise", + "SqueezeButt", + "VibeToy", + "InsertToy", + "AddStuffing", + "AddGag", + "Disarm", + "Pickpocket", + /*, + "AddCarabiner",*/ + ], +}; + +let KDTeaseAttacks: KDTeaseAttacksType = { + Praise: { + name: "Praise", + priority: 1, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + return KDBasicTeaseAttack(enemy, player) + && KDEnemyCanTalk(enemy) + && ( + KinkyDungeonGoddessRep.Ghost + 50 >= 75 + ); + }, + apply: (enemy, _player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*(0.5 + 1.5 * (KinkyDungeonGoddessRep.Ghost + 50)/100), type: "soul"}); + let index = Math.floor(Math.random() * 3); + let suff = (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : ""); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/DamageWeak.ogg"); + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff + index) + .replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 3); + + if (dmg.happened) { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_Praise") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_Praise") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + SquishBreast: { + name: "SquishBreast", + priority: 1, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + return KDBasicTeaseAttack(enemy, player) + && !KDPlayerFacingAway(player, enemy) + && ( + KinkyDungeonFlags.get("armspell") + || (enemy.playWithPlayer && !KinkyDungeonAggressive(enemy)) + ) + && KDHasArms(enemy) + && !KDIsDisarmed(enemy); + }, + apply: (enemy, _player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*1, type: "grope"}); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Grope.ogg"); + KinkyDungeonSetFlag("grope", 4); + if (dmg.happened) { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_SquishBreast" + (KinkyDungeonLastAction == "Cast" ? "Cast" : "")) + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_SquishBreast") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + SpankButt: { + name: "SpankButt", + priority: 2, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + return KDBasicTeaseAttack(enemy, player) + && ( + KinkyDungeonFlags.get("legspell") + || (KDPlayerFacingAway(player, enemy) && KinkyDungeonFlags.get("sprint")) + ) + && KDHasArms(enemy) + && !KDIsDisarmed(enemy); + }, + apply: (enemy, player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + KinkyDungeonSetFlag("spank", 4); + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*1.5, type: "grope"}); + if (!(blocked || evaded)) + KDChangeDistraction("enemy" + enemy.id, "spank", "tease", 1*damagemod, false, 0.25); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Slap.ogg"); + if (!(blocked || evaded)) + KDChangeBalanceSrc("enemy" + enemy.id, "spank", "tease", damagemod * (KDBaseBalanceDmgLevel + KDGameData.HeelPower) / KDBaseBalanceDmgLevel * 0.5*-KDBalanceDmgMult() * 1.5*KDFitnessMult(), true); + if (dmg.happened) { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_SpankButt" + ( (KDPlayerFacingAway(player, enemy) && KinkyDungeonFlags.get("sprint")) ? "Sprint" : "")) + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_SpankButt") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + VibeToy: { + name: "VibeToy", + priority: 1.25, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + return KDBasicTeaseAttack(enemy, player) + && !KDPlayerFacingAway(player, enemy) + && !KDIsDisarmed(enemy) + && KDHasArms(enemy) + && ( + (KDPlayerIsSlowed() + || (enemy.playWithPlayer && !KinkyDungeonAggressive(enemy) && !KDPlayerFacingAway(player, enemy))) + && KDGetVibeToys(enemy).length > 0 + && 1*KinkyDungeonChastityMult() < 1.5 + ); + }, + apply: (enemy, _player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*(1.5 - 1*KinkyDungeonChastityMult()), type: "charm"}); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Vibe.ogg"); + let toys = KDGetVibeToys(enemy); + let toy = (toys.length > 0) ? toys[Math.floor(KDRandom() * toys.length)] : ""; + KinkyDungeonSetFlag("buzz", 4); + if (dmg.happened) { + // Half of it bypasses + KinkyDungeonTeaseLevel += 1; + KinkyDungeonTeaseLevelBypass += 1; + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_VibeToy" + (KDPlayerIsSlowed() ? "Slow" : "")) + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string) + .replace("VTY", TextGet("Restraint"+toy)), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_VibeToy") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("VTY", TextGet("Restraint"+toy)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + InsertToy: { + name: "InsertToy", + priority: 3, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + return KDBasicTeaseAttack(enemy, player) + && !KinkyDungeonIsSlowed(enemy) + && !KDIsDisarmed(enemy) + && KDHasArms(enemy) + && ( + KDGetVibeToys(enemy).length > 0 + && KDGetVibeToys(enemy).some((toy) => { + return KDCanAddRestraint(KDRestraint({name: toy}), false, "", true, undefined, false, true); + }) + && (KDPlayerIsStunned() != false || (KDPlayerFacingAway(player, enemy) && !KinkyDungeonCanStand()) + || (enemy.playWithPlayer && !KinkyDungeonAggressive(enemy) && KDPlayerFacingAway(player, enemy)) + ) + ); + }, + apply: (enemy, _player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + KinkyDungeonSetFlag("insert", 4); + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*1, type: "pierce"}); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Grope.ogg"); + let toys = KDGetVibeToys(enemy).filter((toy) => { + return KDCanAddRestraint(KDRestraint({name: toy}), false, "", true, undefined, false, true); + }); + let selected = (toys.length > 0) ? toys[Math.floor(KDRandom() * toys.length)] : ""; + if (dmg.happened && KinkyDungeonAddRestraintIfWeaker(selected, 0, false, "", true)) { + enemy.items.splice(enemy.items.indexOf(selected), 1); + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_InsertToy") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string) + .replace("VTY", TextGet("Restraint"+selected)), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_InsertToy") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("VTY", TextGet("Restraint"+selected)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + AddStuffing: { + name: "AddStuffing", + priority: 3, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + return KDBasicTeaseAttack(enemy, player) + && !KinkyDungeonIsSlowed(enemy) + && !KDIsDisarmed(enemy) + && KDHasArms(enemy) + && ( + !KDPlayerFacingAway(player, enemy) + && KinkyDungeonFlags.get("verbalspell") + && KDCanAddRestraint(KDRestraint({name: "Stuffing"}), false, "", true, undefined, false, true) + ); + }, + apply: (enemy, _player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*1, type: "chain"}); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Struggle.ogg"); + let selected = "Stuffing"; + KinkyDungeonSetFlag("stuff", 4); + if (dmg.happened && KinkyDungeonAddRestraintIfWeaker(selected, 0, false, "", true)) { + + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_AddStuffing") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string) + .replace("VTY", TextGet("Restraint"+selected)), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_AddStuffing") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("VTY", TextGet("Restraint"+selected)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + AddGag: { + name: "AddGag", + priority: 4, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + if (KDBasicTeaseAttack(enemy, player) + && !KinkyDungeonIsSlowed(enemy) + && !KDIsDisarmed(enemy) + && KDHasArms(enemy) + && ( + KinkyDungeonFlags.get("verbalspell") + && KinkyDungeonPlayerTags.get("GagNecklance") + )) { + let gagType = KDGetNecklaceGagType(KDPlayer()) || "TrapGag"; + + if (KDCanAddRestraint(KDRestraint({name: gagType}), false, "", true, undefined, false, true)) { + return true; + } + } + return false; + }, + apply: (enemy, _player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*1, type: "chain"}); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Struggle.ogg"); + let selected = KDGetNecklaceGagType(KDPlayer()) || "TrapGag"; + + + KinkyDungeonSetFlag("stuff", 4); + if (dmg.happened && KinkyDungeonAddRestraintIfWeaker(selected, 0, false, "", true)) { + + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_AddGag") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string) + .replace("VTY", TextGet("Restraint"+selected)), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_AddGag") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("VTY", TextGet("Restraint"+selected)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + SqueezeButt: { + name: "SqueezeButt", + priority: 1, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + return KDBasicTeaseAttack(enemy, player) + && ( + KinkyDungeonFlags.get("legspell") + || (KDPlayerFacingAway(player, enemy) && KDPlayerIsStunned()) + || (enemy.playWithPlayer && !KinkyDungeonAggressive(enemy) && KDPlayerFacingAway(player, enemy)) + ) + && KDHasArms(enemy) + && !KDIsDisarmed(enemy); + }, + apply: (enemy, player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*0.5, type: "grope"}); + if (!(blocked || evaded)) + KDChangeDistraction("enemy" + enemy.id, "squeeze", "tease", 1*damagemod, false, 0.25); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Grope.ogg"); + KinkyDungeonSetFlag("grope", 4); + if (dmg.happened) { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_SqueezeButt" + (KinkyDungeonLastAction == "Move" ? "Move" : ((KDPlayerFacingAway(player, enemy) && KDPlayerIsStunned()) ? "Behind" : ""))) + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_SqueezeButt") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + ShoulderMassage: { + name: "ShoulderMassage", + priority: 1, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + return KDBasicTeaseAttack(enemy, player) + && ( + (KDPlayerFacingAway(player, enemy) || KinkyDungeonCanStand()) + && (KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax * 0.2 + || (enemy.playWithPlayer && !KinkyDungeonAggressive(enemy))) + && KDistEuclidean(player.x - enemy.x, player.y - enemy.y) < 1.1 // Only adjacent + && KinkyDungeonFlags.get("armspell") + ) + && KDHasArms(enemy) + && !KDIsDisarmed(enemy); + }, + apply: (enemy, _player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*2, type: "plush"}); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Grope.ogg"); + KinkyDungeonSetFlag("soft", 4); + if (dmg.happened) { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_ShoulderMassage") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_ShoulderMassage") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + Headpat: { + name: "Headpat", + priority: 2, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + return KDBasicTeaseAttack(enemy, player) + && ( + !KinkyDungeonCanStand() + || KinkyDungeonFlags.get("miscast") + || (enemy.playWithPlayer && !KinkyDungeonAggressive(enemy)) + ) + && KDHasArms(enemy) + && !KDIsDisarmed(enemy); + }, + apply: (enemy, _player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + KinkyDungeonSetFlag("headpat", 4); + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*(2 - 1.9*(KinkyDungeonGoddessRep.Ghost + 50)/100), type: "plush"}); + if ((KinkyDungeonGoddessRep.Ghost + 50)/100 > 0) + if (!(blocked || evaded)) + KDChangeDistraction("enemy" + enemy.id, "headpat", "tease", (KinkyDungeonGoddessRep.Ghost + 50)/100 * 2*damagemod, false, 0.5); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Grope.ogg"); + if (dmg.happened) { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_Headpat" + (KinkyDungeonLastAction == "Cast" ? "Cast" : "")) + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_Headpat") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + TickleArmpits: { + name: "TickleArmpits", + priority: 1, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + return KDBasicTeaseAttack(enemy, player) + && ( + KinkyDungeonFlags.get("armspell") + || (KinkyDungeonFlags.get("armattack") && KDPlayerFacingAway(player, enemy)) + || (enemy.playWithPlayer && !KinkyDungeonAggressive(enemy) && KDPlayerFacingAway(player, enemy)) + ) + && KDHasArms(enemy) + && !KDIsDisarmed(enemy); + }, + apply: (enemy, player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*1, type: "tickle"}); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Tickle.ogg"); + KinkyDungeonSetFlag("tickle", 4); + if (dmg.happened) { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_TickleArmpits" + ((enemy.playWithPlayer && !KinkyDungeonAggressive(enemy) && KDPlayerFacingAway(player, enemy)) ? "" : "Raised")) + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_TickleArmpits") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + TickleFeet: { + name: "TickleFeet", + priority: 2, + blockable: true, dodgeable: true, + filter: (enemy, player, _aiData) => { + return KDBasicTeaseAttack(enemy, player) + && ( + KinkyDungeonFlags.get("legspell") + || (KinkyDungeonLastAction == "Move" && KDPlayerFacingAway(player, enemy) && !KinkyDungeonCanStand()) + ) + && !KinkyDungeonPlayerTags.get("BootsArmor") + && !KinkyDungeonPlayerTags.get("Boots") + && KDHasArms(enemy) + && !KDIsDisarmed(enemy); + }, + apply: (enemy, player, _aiData, blocked, evaded, damagemod) => { + KinkyDungeonSetEnemyFlag(enemy, "teaseAtkCD", (enemy.Enemy?.attackPoints*2) || 4); + KinkyDungeonSetFlag("globalteaseAtkCD", 2); + let strip = false; + if (player.player) { + let CurrentDress = KinkyDungeonCurrentDress; + let DressList = KDGetDressList()[CurrentDress]; + for (let clothes of DressList) { + if (!clothes.Lost && (clothes.Group == "Shoes" || ( + StandalonePatched && ModelDefs[clothes.Item]?.Categories?.includes("Shoes") + ))) { + clothes.Lost = true; + strip = true; + } + } + } + let dmg = (blocked || evaded) ? {string: "", happened: 0} : KinkyDungeonDealDamage({damage: damagemod*2, type: "tickle"}); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Tickle.ogg"); + KinkyDungeonSetFlag("tickle", 4); + if (dmg.happened) { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_TickleFeet" + ((strip) ? "Remove" : "")) + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + .replace("DMGDLT", dmg.string), + "#ff9999", 1); + } else { + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_TickleFeet") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + } + + return true; + }, + }, + + Disarm: { + name: "Disarm", + priority: 10, + blockable: true, dodgeable: true, + filter: (enemy, player, aiData) => { + if (KDistChebyshev(enemy.x - player.x, enemy.y - player.y) < 1.5 + && !KinkyDungeonIsSlowed(enemy) + && ( + aiData.attack.includes("Bind") + && enemy.Enemy.disarm + && KinkyDungeonFlags.get("disarmFlagVulnerable") + && KinkyDungeonFlags.get("disarmFlagVulnerable") != 3 + ) + && !KDIsDisarmed(enemy)) { + return true; + } + return false; + }, + apply: (enemy, _player, _aiData, blocked, evaded, _damagemod) => { + if (!blocked && !evaded) { + // Easier to evase harness grabs + KinkyDungeonDisarm(enemy); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Grope.ogg"); + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttack_Disarm") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)), + "#ff9999", 1); + return true; + } + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_Disarm") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + return false; + } + }, + Pickpocket: { + name: "Pickpocket", + priority: 9, + blockable: true, dodgeable: true, + filter: (enemy, player, aiData) => { + if (KDistChebyshev(enemy.x - player.x, enemy.y - player.y) < 1.5 + && !KinkyDungeonIsSlowed(enemy) + && ( + player.player && aiData.attack.includes("Bind") && KDCanPickpocketPlayer(player) && !KDEnemyHasFlag(enemy, "nosteal") + && !enemy.Enemy.nopickpocket && KDMapData.KeysHeld==0 && KDCanPickpocket(enemy) + ) && KDPlayerIsStunned() && + ( + ((KDIsPlayerTethered(KinkyDungeonPlayerEntity) || KinkyDungeonSlowLevel > 9) && KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed + && KinkyDungeonIsArmsBound()) + || (KDGameData.KinkyDungeonLeashedPlayer < 1 && aiData.playerItems.length > 0 && aiData.playerItems.length > 0 + && KinkyDungeonIsArmsBound() && (KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.05)) + || (KDGameData.KinkyDungeonLeashedPlayer < 1 && KinkyDungeonItemCount("Pick") > 0) + || (KDGameData.KinkyDungeonLeashedPlayer < 1 && KinkyDungeonItemCount("RedKey") > 0) + || (KDGameData.KinkyDungeonLeashedPlayer < 1 && KinkyDungeonItemCount("BlueKey") > 0) + ) + && KDHasArms(enemy) + && !KDIsDisarmed(enemy)) { + return true; + } + return false; + }, + apply: (enemy, _player, aiData, blocked, evaded, _damagemod) => { + if (!blocked && !evaded) { + + let item = aiData.playerItems.length > 0 ? aiData.playerItems[Math.floor(KDRandom() * aiData.playerItems.length)] : undefined; + let picked = false; + // If the player's location is trapped she will get disarmed + if ((KDIsPlayerTethered(KinkyDungeonPlayerEntity) || KinkyDungeonSlowLevel > 9) && KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed + && KinkyDungeonIsArmsBound() && KDRandom() < 0.5) { + // Disarm the player + KinkyDungeonDisarm(enemy, "Leash"); + picked = true; + } else if (KDGameData.KinkyDungeonLeashedPlayer < 1 && item && aiData.playerItems.length > 0 + && KinkyDungeonIsArmsBound() && ((!KinkyDungeonPlayerDamage || item.name != KinkyDungeonPlayerDamage.name) || KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.05) && KDRandom() < 0.5) { + if (item.type == Weapon) { + if (KDWeapon(item)?.name == KinkyDungeonPlayerDamage?.name) + KinkyDungeonDisarm(enemy, "Leash"); + else + KinkyDungeonInventoryRemove(item); + //KinkyDungeonAddLostItems([item], false); + if (!enemy.items) enemy.items = [item.name]; + else if (!enemy.items.includes(item.name)) + enemy.items.push(item.name); + } else if (item.type == Consumable) { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables[item.name], -1); + let item2: item = Object.assign({}, item); + //KinkyDungeonAddLostItems([item2], false); + item2.quantity = 1; + if (!enemy.items) enemy.items = [item.name]; + enemy.items.push(item.name); + } + if (item) { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStealItem").replace("ITEMSTOLEN", KDGetItemName(item)), "yellow", 2); + picked = true; + } + } else if (KDGameData.KinkyDungeonLeashedPlayer < 1 && KinkyDungeonItemCount("Pick") > 0 && KDRandom() < 0.5) { + KDAddConsumable("Pick", -1); + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonStealPick"), "yellow", 2); + if (!enemy.items) enemy.items = ["Pick"]; + enemy.items.push("Pick"); + picked = true; + } else if (KDGameData.KinkyDungeonLeashedPlayer < 1 && KinkyDungeonItemCount("RedKey") > 0) { + KDAddConsumable("RedKey", -1); + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonStealRedKey"), "yellow", 2); + if (!enemy.items) enemy.items = ["RedKey"]; + enemy.items.push("RedKey"); + picked = true; + } else if (KDGameData.KinkyDungeonLeashedPlayer < 1 && KinkyDungeonItemCount("BlueKey") > 0) { + KDAddConsumable("BlueKey", -1); + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonStealBlueKey"), "yellow", 2); + if (!enemy.items) enemy.items = ["BlueKey"]; + enemy.items.push("BlueKey"); + picked = true; + } + /*else if (KinkyDungeonEnchantedBlades > 0 && KDRandom() < 0.5) { + KinkyDungeonEnchantedBlades -= 1; + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonStealEnchKnife"), "yellow", 2); + if (!enemy.items) enemy.items = ["EnchKnife"]; + enemy.items.push("knife"); + }*/ + if (picked) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Grope.ogg"); + KinkyDungeonSetFlag("pickpocket", 1); + if (KDRandom() < actionDialogueChanceIntense) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "Pickpocket").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 1); + + return true; + } + } + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_Pickpocket") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + return false; + } + }, + LeashGrab: { + name: "LeashGrab", + priority: 6, + blockable: true, dodgeable: true, + filter: (enemy, player, aiData) => { + if (KDBasicTeaseAttack(enemy, player, true) + && !KinkyDungeonIsSlowed(enemy) + && ( + aiData.attack.includes("Bind") + && enemy.Enemy.bound + && KDGameData.MovePoints > -1 + && KinkyDungeonTorsoGrabCD < 1 + && (KinkyDungeonLastAction == "Move" || KinkyDungeonLastAction == "Cast") + ) + && KDHasArms(enemy) + && !KDIsDisarmed(enemy)) { + let caught = false; + for (let tile of enemy.warningTiles) { + if (enemy.x + tile.x == player.x && enemy.y + tile.y == player.y) { + caught = true; + break; + } + } + if (caught) { + let list = KinkyDungeonAllRestraintDynamic(); + for (let restraint of list) { + if (KDRestraint(restraint.item) && KDRestraint(restraint.item).harness) { + return true; + } + } + } + } + + return false; + }, + apply: (enemy, _player, _aiData, blocked, evaded, _damagemod) => { + if (!blocked && !evaded) { + // Easier to evase harness grabs + let harnessChance = 0; + let harnessRestraintName = ""; + let list = KinkyDungeonAllRestraintDynamic(); + let list2 = []; + for (let restraint of list) { + if (KDRestraint(restraint.item) && KDRestraint(restraint.item).harness) { + harnessChance += 1; + list2.push(restraint.item.name); + } + } + let rest = list2[Math.floor(KDRandom() * list2.length)]; + if (rest) harnessRestraintName = rest; + + if (harnessChance > 0) { + let roll = KDRandom(); + let bonus = 0; + if (KDForcedToGround() || !KinkyDungeonCanStand()) bonus += KinkyDungeonTorsoGrabChanceBonus; + if (KinkyDungeonStatWill < 0.01) bonus += KinkyDungeonTorsoGrabChanceBonus*2; + for (let T = 0; T < harnessChance; T++) { + roll = Math.min(roll, KDRandom()); + } + if (roll < KinkyDungeonTorsoGrabChance + bonus) { + KDGameData.MovePoints = Math.min(-1, KDGameData.MovePoints); + let msg = TextGet("KinkyDungeonTorsoGrab").replace("RestraintName", KDGetItemNameString(harnessRestraintName)).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)); + + KinkyDungeonSendTextMessage(5, msg, "#ff8933", 1); + + if (KDRandom() < actionDialogueChance) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) : "") + "Grab").replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 2, 4); + + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Grab.ogg", enemy); + KinkyDungeonTorsoGrabCD = 3; + KinkyDungeonSetFlag("grabbed", 3); + return true; + } + } + } + KinkyDungeonSendTextMessage(4, + TextGet("KDTeaseAttackResist_LeashGrab") + .replace("ENMY", TextGet("Name" + enemy.Enemy.name)) + + TextGet("ResistType" + (blocked ? "Block" : (evaded ? "Dodge" : ""))), + "#ff9999", 1); + return false; + } + } +}; diff --git a/Game/src/enemy/KinkyDungeonNames.ts b/Game/src/enemy/KinkyDungeonNames.ts new file mode 100644 index 000000000..198923130 --- /dev/null +++ b/Game/src/enemy/KinkyDungeonNames.ts @@ -0,0 +1,3043 @@ +"use strict"; + +let KDDefaultNames = [ + "default", + "default", + "default", + "default", + "nevermere", + "bountyhunter", + "japanese", + "japanese", + "japanese", + "elf", + "dragonheart", + "maid", + "russian", + "elemental", + "aztec", + "witch", + "cyborg", + "bast", + "DragonGirl", +]; + +let KDNameList = { + default: [ + "Aiko", + "Aina", + "Alexa", + "Alice", + "Amber", + "Ami", + "Anna", + "Aria", + "Avery", + "Ayumi", + "Bailey", + "Beth", + "Bianca", + "Blair", + "Bonnie", + "Brooke", + "Cara", + "Cassidy", + "Chloe", + "Chika", + "Daisy", + "Dana", + "Daniela", + "Darcy", + "Dawn", + "Delilah", + "Diana", + "Dylan", + "Eden", + "Elena", + "Elise", + "Ellie", + "Emi", + "Emily", + "Emma", + "Erin", + "Eva", + "Evelyn", + "Faith", + "Fiona", + "Freya", + "Fumiko", + "Gemma", + "Grace", + "Hailey", + "Hana", + "Hannah", + "Harper", + "Hazel", + "Heidi", + "Iris", + "Isabel", + "Isabella", + "Isla", + "Ivy", + "Jade", + "Jamie", + "Jasmine", + "Jenna", + "Jill", + "Jodie", + "Julia", + "Kaede", + "Kai", + "Kana", + "Karen", + "Karina", + "Kate", + "Kayla", + "Keira", + "Kelly", + "Kendra", + "Kimiko", + "Kira", + "Kylie", + "Lana", + "Lara", + "Laura", + "Lauren", + "Layla", + "Leah", + "Leila", + "Lila", + "Lily", + "Lina", + "Lola", + "Lucy", + "Luna", + "Macy", + "Maddie", + "Maeve", + "Mai", + "Makayla", + "Maki", + "Malia", + "Mandy", + "Maria", + "Marie", + "Maya", + "Mayu", + "Megan", + "Melanie", + "Mia", + "Mika", + "Mila", + "Mina", + "Mira", + "Misaki", + "Molly", + "Naomi", + "Natalie", + "Natasha", + "Nia", + "Nicole", + "Nina", + "Noa", + "Noelle", + "Nora", + "Noriko", + "Olivia", + "Paige", + "Parker", + "Peyton", + "Piper", + "Quinn", + "Rachel", + "Reagan", + "Reese", + "Rei", + "Reina", + "Renee", + "Riley", + "Rina", + "Risa", + "Ruby", + "Rumi", + "Sabrina", + "Sage", + "Sakura", + "Samantha", + "Sara", + "Sasha", + "Scarlett", + "Selena", + "Serena", + "Shannon", + "Sienna", + "Skye", + "Sofia", + "Stella", + "Summer", + "Tara", + "Tessa", + "Tia", + "Tina", + "Tracy", + "Valeria", + "Vanessa", + "Veronica", + "Victoria", + "Violet", + "Wendy", + "Willow", + "Wren", + "Xena", + "Yoko", + "Yui", + "Yuka", + "Yuki", + "Yumi", + "Zara", + "Zoe", + "Zoey" + ], + nevermere: [ + "Aada", + "Aila", + "Aino", + "Airi", + "Alma", + "Anja", + "Anni", + "Arja", + "Asta", + "Aune", + "Birgit", + "Bodil", + "Brynja", + "Brita", + "Britt", + "Camilla", + "Cecilia", + "Clara", + "Corinna", + "Christina", + "Dagmar", + "Dagny", + "Dana", + "Diana", + "Dora", + "Ebba", + "Edda", + "Eira", + "Elin", + "Elisa", + "Embla", + "Emma", + "Enni", + "Erika", + "Erna", + "Freya", + "Frida", + "Gerda", + "Greta", + "Gunhild", + "Hanna", + "Hanne", + "Heidi", + "Helga", + "Helle", + "Hilda", + "Iida", + "Iiris", + "Ilona", + "Inga", + "Ingrid", + "Irene", + "Isa", + "Janna", + "Jenny", + "Kaia", + "Kaisa", + "Kari", + "Katja", + "Kerttu", + "Kiira", + "Laila", + "Laura", + "Leena", + "Liisa", + "Lilja", + "Linnea", + "Lotta", + "Lydia", + "Maia", + "Maija", + "Maiju", + "Malin", + "Maren", + "Maria", + "Marja", + "Matilda", + "Meeri", + "Mette", + "Mia", + "Milla", + "Nanna", + "Nella", + "Nora", + "Oda", + "Olga", + "Orla", + "Otti", + "Paula", + "Petra", + "Ragna", + "Rakel", + "Rebekka", + "Riina", + "Riitta", + "Rita", + "Ronja", + "Runa", + "Saana", + "Saga", + "Sanna", + "Sara", + "Selma", + "Signe", + "Sigrid", + "Sini", + "Sirpa", + "Sofia", + "Solveig", + "Sonja", + "Suvi", + "Taina", + "Tanja", + "Tea", + "Terhi", + "Tiia", + "Tiina", + "Tuula", + "Tyra", + "Ulla", + "Ulrika", + "Una", + "Vala", + "Vanja", + "Veera", + "Vera", + "Vivi", + "Vilma", + "Ylva", + "Yrsa", + "Zara", + "Zoe", + "Zora" + ], + bountyhunter: [ + "Abigail", + "Ada", + "Adriana", + "Aileen", + "Alice", + "Alina", + "Alison", + "Amelia", + "Anastasia", + "Angelina", + "Barbara", + "Belle", + "Beth", + "Bianca", + "Blair", + "Bonnie", + "Bridget", + "Brooke", + "Cara", + "Cecily", + "Charlotte", + "Chloe", + "Christina", + "Claire", + "Clara", + "Cora", + "Cynthia", + "Daisy", + "Dana", + "Daria", + "Delilah", + "Diana", + "Dora", + "Dylan", + "Edith", + "Eira", + "Elena", + "Elise", + "Elizabeth", + "Ellie", + "Emilia", + "Emma", + "Erica", + "Eva", + "Evelyn", + "Faith", + "Fiona", + "Freya", + "Gemma", + "Grace", + "Hanna", + "Harriet", + "Hazel", + "Heidi", + "Helena", + "Holly", + "Hope", + "Iris", + "Isabel", + "Ivy", + "Jade", + "Jane", + "Jasmine", + "Jennifer", + "Jessica", + "Jill", + "Jodie", + "Julia", + "Kaia", + "Kara", + "Kate", + "Katya", + "Keira", + "Kelly", + "Kim", + "Kira", + "Kristina", + "Lana", + "Lara", + "Laura", + "Leah", + "Lena", + "Lila", + "Lily", + "Lina", + "Lola", + "Lucy", + "Luna", + "Macy", + "Maddie", + "Maeve", + "Mara", + "Maria", + "Marina", + "Martha", + "Mary", + "Maya", + "Megan", + "Melanie", + "Mia", + "Mila", + "Mina", + "Mira", + "Molly", + "Nadia", + "Nancy", + "Naomi", + "Natalia", + "Natasha", + "Nina", + "Noor", + "Nora", + "Olga", + "Olivia", + "Paige", + "Penny", + "Piper", + "Quinn", + "Rachel", + "Rebecca", + "Renee", + "Riley", + "Rina", + "Rita", + "Ruby", + "Ruth", + "Sabrina", + "Sage", + "Samantha", + "Sara", + "Scarlett", + "Selena", + "Serena", + "Shannon", + "Sienna", + "Sofia", + "Sonya", + "Stella", + "Summer", + "Tara", + "Tessa", + "Tina", + "Tracy", + "Valeria", + "Vanessa", + "Veronica", + "Victoria", + "Violet", + "Vivian", + "Wendy", + "Willow", + "Wren", + "Xena", + "Yana", + "Yulia", + "Zara", + "Zoe", + "Zoya" + ], + japanese: [ + "Akane", + "Akemi", + "Akiko", + "Akira", + "Aoi", + "Asami", + "Asuka", + "Ayaka", + "Ayame", + "Azumi", + "Chiaki", + "Chie", + "Chiharu", + "Chika", + "Chinatsu", + "Chiyoko", + "Chizuru", + "Emi", + "Eri", + "Etsuko", + "Fumiko", + "Fuyumi", + "Haruka", + "Haruko", + "Harumi", + "Hikari", + "Hikaru", + "Hinata", + "Hitomi", + "Honoka", + "Izumi", + "Junko", + "Kaede", + "Kagome", + "Kana", + "Kanako", + "Kaori", + "Kasumi", + "Katsumi", + "Kayo", + "Keiko", + "Kikyo", + "Kimiko", + "Kiyomi", + "Koharu", + "Kotone", + "Kumiko", + "Kureha", + "Kurumi", + "Kyoko", + "Machi", + "Mai", + "Maki", + "Mami", + "Mao", + "Mariko", + "Masami", + "Mayu", + "Mei", + "Michiko", + "Mika", + "Miki", + "Miku", + "Mina", + "Mio", + "Misaki", + "Mitsuki", + "Miyako", + "Miyu", + "Miyuki", + "Moe", + "Momoko", + "Nagisa", + "Nami", + "Nana", + "Nanami", + "Nao", + "Naoko", + "Narumi", + "Natsuki", + "Natsumi", + "Noriko", + "Rei", + "Reika", + "Reiko", + "Rena", + "Rika", + "Riko", + "Rin", + "Rina", + "Rio", + "Risa", + "Ritsuko", + "Rumi", + "Runa", + "Ruri", + "Ryoko", + "Sachi", + "Sachiko", + "Saki", + "Sakura", + "Satomi", + "Sayaka", + "Sayo", + "Sayuri", + "Setsuko", + "Shiho", + "Shinobu", + "Shiori", + "Shizuka", + "Shizuko", + "Sora", + "Sumi", + "Sumire", + "Suzume", + "Suzuna", + "Tamaki", + "Tamami", + "Tami", + "Tomoe", + "Tomoko", + "Tsukiko", + "Tsukimi", + "Ume", + "Umeko", + "Yoko", + "Yoshiko", + "Yui", + "Yuka", + "Yuki", + "Yukiko", + "Yuko", + "Yumi", + "Yuna", + "Yuri", + "Yuriko", + "Yuuka", + "Yuuki", + "Yuzuki" + ], + elf: [ + + + "Aerith", "Aira", "Alanna", "Alora", "Amara", "Anara", "Anwen", "Aria", "Ariana", "Arwen", + "Bella", "Brielle", "Brynn", "Calia", "Cara", "Carys", "Celia", "Cora", "Cyra", "Dara", + "Della", "Diana", "Dora", "Eira", "Elena", "Elia", "Elin", "Elora", "Elysia", "Ember", + "Enna", "Eowyn", "Erin", "Eva", "Fae", "Fara", "Fay", "Faye", "Fiona", "Freya", + "Gala", "Gwen", "Gwyn", "Hana", "Hazel", "Iara", "Ida", "Ila", "Iris", "Isa", + "Isla", "Ivy", "Jade", "Jana", "Jara", "Jasmine", "Jenna", "Jessa", "Jora", "Julia", + "Kaia", "Kara", "Kaya", "Kayla", "Keira", "Kira", "Kyra", "Lana", "Lara", "Layla", + "Lea", "Lena", "Lia", "Lila", "Lily", "Lina", "Lira", "Livia", "Lora", + "Luna", "Lyra", "Mae", "Maia", "Mara", "Maya", "Mia", "Mila", "Mira", "Myra", + "Nadia", "Nala", "Nara", "Naya", "Nia", "Nina", "Nora", "Nova", "Nyra", "Ora", + "Orla", "Pia", "Rae", "Raina", "Rana", "Rayla", "Rea", "Ria", "Rina", "Risa", + "Rona", "Rosa", "Ruby", "Runa", "Ryla", "Sage", "Sara", "Sela", "Shay", "Shira", + "Sia", "Sira", "Skye", "Sora", "Stella", "Talia", "Tara", "Tessa", "Thea", "Thora", + "Tia", "Tina", "Tyra", "Una", "Ura", "Vala", "Vana", "Vera", "Vina", "Willa", + "Wren", "Xara", "Xena", "Yara", "Yna", "Yora", "Zara", "Zayla", "Zella", "Zia", + "Zira", "Zoe", "Zora", "Zyla", "Zyra" + ], + dragonheart: [ + "Aanya", "Astrid", "Athena", "Aria", "Anika", "Alia", "Ava", "Anya", "Asha", "Aurora", + "Bianca", "Bryn", "Bhavna", "Bella", "Britt", "Bina", "Bria", "Bhumi", "Brielle", "Bria", + "Chloe", "Chaya", "Cora", "Cleo", "Chandra", "Cara", "Cassia", "Calla", "Celia", "Clara", + "Daisy", "Dahlia", "Daphne", "Diana", "Divya", "Dana", "Drishti", "Dora", "Dina", "Delia", + "Ella", "Eva", "Elsa", "Elena", "Esha", "Erika", "Eira", "Eliana", "Eve", "Elise", + "Freya", "Fiona", "Flora", "Faith", "Frida", "Faye", "Fia", "Fara", "Freyja", "Felicity", + "Grace", "Gia", "Gaia", "Gwen", "Greta", "Gemma", "Gia", "Gauri", "Gloria", "Gianna", + "Hazel", "Hera", "Hannah", "Harper", "Heidi", "Holly", "Hira", "Helena", "Hana", "Hope", + "Iris", "Isla", "Ivy", "Isabel", "Ingrid", "Irene", "Isha", "Ida", "Iliana", "Iona", + "Jade", "Jasmine", "Jaya", "Julia", "Juno", "Jenna", "Jia", "Jyoti", "Jessa", "Joy", + "Kira", "Kara", "Kavya", "Kaya", "Kendra", "Kira", "Kiara", "Kali", "Kaia", "Kira", + "Lila", "Luna", "Lily", "Lara", "Lila", "Lana", "Lia", "Lina", "Lola", + "Maya", "Mia", "Mila", "Mira", "Mina", "Mona", "Mara", "Maia", "Molly", "Macy", + "Nora", "Nina", "Nia", "Navya", "Nadia", "Nora", "Nola", "Naya", "Nora", "Neva", + "Olivia", "Olive", "Ophelia", "Opal", "Orla", "Oona", "Odessa", "Oriana", "Octavia", "Olympia", + "Pia", "Phoebe", "Priya", "Piper", "Pari", "Paige", "Peyton", "Penelope", "Polly", "Poppy", + "Quinn", "Quincy", "Quin", "Quiana", "Quira", "Quinta", "Quilla", "Quorra", "Quella", "Querida", + "Ruby", "Riya", "Rhea", "Rosa", "Ria", "Renee", "Raya", "Rani", "Rina", "Riley", + "Sara", "Sophia", "Sienna", "Stella", "Sana", "Sage", "Sofia", "Siri", "Sia", "Skyla", + "Tara", "Tessa", "Thea", "Tia", "Trisha", "Tara", "Thora", "Tara", "Tina", "Talia", + "Uma", "Ursa", "Una", "Uma", "Uma", "Uma", "Uma", "Uma", "Uma", "Uma", + "Vera", "Veda", "Violet", "Veda", "Veda", "Veda", "Veda", "Veda", "Veda", "Veda", + "Willa", "Wren", "Willa", + "Xena", "Xara", "Xia", + "Yara", + "Zara", "Zoe", "Zara" + ], + maid: [ + // My fav food + "Cozonac", + "Castella", "Magdalena", "Nonnette", "Pavlova", "Tiramisu", + "Abby", "Ada", "Adelaide", "Alice", "Alma", "Amelia", "Amy", "Anna", "Anne", "Annie", + "Bea", "Bella", "Belle", "Bess", "Bessie", "Beth", "Betsy", "Betty", "Blanche", "Bonnie", + "Callie", "Carla", "Carrie", "Cathy", "Cecily", "Clara", "Cora", "Coral", "Cynthia", "Daisy", + "Dana", "Daphne", "Darla", "Dawn", "Debbie", "Delia", "Della", "Diane", "Dinah", "Dolly", + "Dora", "Doris", "Dorothy", "Edith", "Edna", "Effie", "Eileen", "Ella", "Ellen", "Elsie", + "Emma", "Erin", "Esther", "Ethel", "Etta", "Eva", "Eve", "Evelyn", "Fanny", "Faye", + "Fiona", "Flora", "Florence", "Fran", "Frances", "Gail", "Gemma", "Gertie", "Gina", "Gloria", + "Grace", "Greta", "Gwen", "Haley", "Hannah", "Harriet", "Hazel", "Heidi", "Helen", "Holly", + "Ida", "Irene", "Iris", "Isabel", "Ivy", "Jackie", "Jane", "Janet", "Janice", "Jean", + "Jenny", "Jessie", "Jill", "Joan", "Joanna", "Jody", "Judy", "Julia", "Julie", "June", + "Kara", "Karen", "Kate", "Kathy", "Katie", "Kay", "Kelly", "Kim", "Kitty", "Laura", + "Leah", "Leila", "Lena", "Lila", "Lily", "Linda", "Lisa", "Liza", "Lola", "Lora", + "Lorna", "Lottie", "Louisa", "Lucy", "Lydia", "Lynn", "Mabel", "Macy", "Maggie", "Maisie", + "Mandy", "Marcia", "Margaret", "Maria", "Marie", "Marion", "Martha", "Mary", "Maud", "Maude", + "Mavis", "May", "Megan", "Melanie", "Melissa", "Mia", "Mildred", "Millie", "Mina", "Minnie", + "Mira", "Miranda", "Molly", "Mona", "Muriel", "Myra", "Myrtle", "Nadia", "Nancy", "Nanette", + "Naomi", "Natalie", "Nell", "Nellie", "Nettie", "Nina", "Nora", "Norma", "Olive", "Olivia", + "Opal", "Pam", "Pansy", "Pat", "Patty", "Paula", "Peggy", "Penny", "Phoebe", "Polly", + "Priscilla", "Rachel", "Renee", "Rhoda", "Rita", "Roberta", "Robin", "Rosa", "Rose", "Rosie", + "Ruby", "Ruth", "Sadie", "Sally", "Samantha", "Sandy", "Sara", "Sharon", "Sheila", "Shelley", + "Shirley", "Sophie", "Stella", "Sue", "Susan", "Sylvia", "Tara", "Teresa", "Tess", "Tessa", + "Thelma", "Tina", "Tracy", "Trudy", "Una", "Valerie", "Vera", "Veronica", "Vicky", "Viola", + "Violet", "Wanda", "Wendy", "Willa", "Winifred", "Winnie", "Yolanda", "Yvonne", "Zara", "Zoe" + ], + russian: [ + "Ada", "Adelina", "Agniya", "Aida", "Aksinya", "Albina", "Aleksandra", "Alena", "Alina", "Alisa", + "Anastasiya", "Angela", "Anita", "Anna", "Antonina", "Arina", "Asya", "Aurora", "Avdotya", "Bella", + "Dana", "Daria", "Dayana", "Diana", "Dina", "Dinara", "Dora", "Dunya", "Eva", "Evgeniya", + "Faina", "Fekla", "Galina", "Gella", "Gera", "Gleb", "Glenda", "Gloria", "Grusha", "Inga", + "Inna", "Ira", "Irina", "Iskra", "Iva", "Ivana", "Ivanna", "Izabella", "Jana", "Julia", + "Kamilla", "Karina", "Katerina", "Katya", "Kira", "Klara", "Kristina", "Lada", "Lana", "Lara", + "Larisa", "Lena", "Lera", "Lidiya", "Lika", "Liliya", "Lina", "Liza", "Lola", "Luba", + "Ludmila", "Lyuba", "Makar", "Maksima", "Mara", "Margarita", "Maria", "Marina", "Marta", "Marya", + "Matryona", "Maya", "Melaniya", "Mila", "Milana", "Milena", "Mira", "Miroslava", "Nadezhda", "Nadia", + "Nadya", "Nastya", "Natalia", "Natasha", "Nelli", "Nika", "Nina", "Nona", "Oksana", "Olga", + "Olya", "Pasha", "Paulina", "Pelageya", "Polina", "Rada", "Radmila", "Raisa", "Regina", "Renata", + "Rima", "Rina", "Rita", "Roksana", "Roma", "Roza", "Rufina", "Ruslana", "Sabina", "Sasha", + "Serafina", "Sofia", "Sofiya", "Sonya", "Stasya", "Sveta", "Svetlana", "Taisiya", "Tamara", "Tanya", + "Tara", "Tatiana", "Taya", "Toma", "Uliana", "Valentina", "Valeria", "Varya", "Vasilisa", "Vera", + "Veronika", "Vika", "Viktoria", "Violetta", "Vita", "Vitaliya", "Vlada", "Yana", "Yaroslava", "Yelena", + "Yeva", "Yulia", "Yulya", "Yuna", "Zara", "Zhenya", "Zina", "Zinaida", "Zlata", "Zoya" + ], + elemental: [ + "Aara", + "Abia", + "Adara", + "Aelia", + "Aeris", + "Afra", + "Aila", + "Aira", + "Akira", + "Alaia", + "Alara", + "Aleia", + "Alia", + "Alina", + "Alira", + "Alora", + "Amara", + "Ambra", + "Amia", + "Amira", + "Anara", + "Ania", + "Anira", + "Anora", + "Arda", + "Aria", + "Ariana", + "Arisa", + "Arya", + "Asa", + "Asha", + "Astra", + "Aura", + "Aurora", + "Ava", + "Ayana", + "Ayla", + "Azara", + "Azura", + "Bala", + "Bela", + "Bia", + "Bina", + "Bira", + "Blia", + "Bora", + "Bria", + "Calia", + "Cara", + "Cassia", + "Celia", + "Cera", + "Chia", + "Cira", + "Clara", + "Cora", + "Cyra", + "Dalia", + "Dana", + "Dara", + "Daria", + "Delia", + "Dia", + "Dina", + "Dora", + "Drea", + "Eira", + "Ela", + "Elaia", + "Elara", + "Elena", + "Elia", + "Elina", + "Elira", + "Elora", + "Elyra", + "Emara", + "Emia", + "Emira", + "Ena", + "Enya", + "Era", + "Eria", + "Eris", + "Erya", + "Esra", + "Estia", + "Etta", + "Eva", + "Evana", + "Evia", + "Evira", + "Eyla", + "Ezra", + "Fara", + "Fayra", + "Fia", + "Fina", + "Flora", + "Freya", + "Gala", + "Gara", + "Gia", + "Gina", + "Gira", + "Glora", + "Haia", + "Hana", + "Hara", + "Helia", + "Hera", + "Hila", + "Iana", + "Iara", + "Ila", + "Ilia", + "Ilira", + "Ilora", + "Ina", + "Inara", + "Ira", + "Iria", + "Iris", + "Isa", + "Isra", + "Iva", + "Ivana", + "Ivia", + "Ivira", + "Iya", + "Izara", + "Izora", + "Jada", + "Jana", + "Jara", + "Jaya", + "Jia", + "Jina", + "Jira", + "Jora", + "Kaia", + "Kala", + "Kara", + "Kasia", + "Kaya", + "Kayra", + "Keira", + "Kia", + "Kina", + "Kira", + "Kora", + "Kyla", + "Kyra", + "Lana", + "Lara", + "Laya", + "Lea", + + "Lena", + "Lia", + "Lila", + "Lina", + "Lira", + "Lora", + "Luna", + "Lyra", + "Mada", + "Mala", + "Mara", + "Maya", + "Mayra", + "Mela", + "Mia", + "Mila", + "Mina", + "Mira", + "Mora", + "Myra", + "Nadia", + "Nala", + "Nara", + "Naya", + "Nayra", + "Nela", + "Nia", + "Nila", + "Nina", + "Nira", + "Nora", + "Nyra", + "Oana", + "Ola", + "Olina", + "Ora", + "Orla", + "Oya", + "Rana", + "Raya", + "Rea", + "Reia", + "Rena", + "Ria", + "Rila", + "Rina", + "Risa", + "Riya", + "Rora", + "Ryla", + "Ryna", + "Saba", + "Sada", + "Sana", + "Sara", + "Saya", + "Sayra", + "Sela", + "Sia", + "Sila", + "Sina", + "Sira", + "Sola", + "Sora", + "Syla", + "Syra", + "Tala", + "Tara", + "Taya", + "Tayra", + "Tela", + "Tia", + "Tila", + "Tina", + "Tira", + "Tora", + "Tyra", + "Ula", + "Una", + "Ura", + "Ursa", + "Vala", + "Vana", + "Vara", + "Vaya", + "Vela", + "Via", + "Vila", + "Vina", + "Vira", + "Vola", + "Vora", + "Vyra", + "Xara", + "Xia", + "Xina", + "Xira", + "Xora", + "Yana", + "Yara", + "Yela", + "Yia", + "Yila", + "Yina", + "Yira", + "Yora", + "Yula", + "Yura", + "Zara", + "Zaya", + "Zela", + "Zia", + "Zila", + "Zina", + "Zira", + "Zola", + "Zora", + "Zyla", + "Zyra" + ], + witch: [ + "Circe", + "Abigail", "Agatha", "Agnes", "Alecto", "Alexis", "Alice", "Alma", "Althea", "Alyssa", "Amara", + "Amber", "Amelia", "Angelica", "Anita", "Annabelle", "Ariana", "Ariel", "Artemis", "Astra", "Athena", + "Aurora", "Avery", "Bailey", "Beatrice", "Beatrix", "Bellatrix", "Bianca", "Blair", "Bonnie", "Bree", + "Bridget", "Buffy", "Callie", "Calliope", "Cara", "Cassandra", "Cecilia", "Celeste", "Celia", "Celine", + "Charity", "Charlotte", "Chloe", "Christine", "Circe", "Clara", "Clarissa", "Cleo", "Cora", "Cordelia", + "Cynthia", "Dahlia", "Daphne", "Darcy", "Davina", "Delia", "Delilah", "Diana", "Dora", "Dorothy", + "Eden", "Edith", "Elena", "Eliza", "Elizabeth", "Ella", "Ellie", "Eloise", "Elsa", "Elsie", + "Elvira", "Ember", "Emilia", "Emily", "Emma", "Enid", "Erica", "Esme", "Estelle", "Esther", + "Eva", "Eve", "Evelyn", "Faye", "Fiona", "Flora", "Freya", "Gabrielle", "Garnet", "Genevieve", + "Gillian", "Ginevra", "Glenda", "Gloria", "Grace", "Gwen", "Gwendolyn", "Haley", "Hanna", "Harmony", + "Hazel", "Heather", "Hecate", "Helena", "Hermione", "Hilda", "Holly", "Hope", "Imogen", "Ingrid", + "Iris", "Isabel", "Isadora", "Isla", "Ivy", "Jade", "Jasmine", "Jenna", "Jennifer", "Jessica", + "Jill", "Joan", "Jocelyn", "Josephine", "Joyce", "Julia", "Juliet", "June", "Kara", "Karen", + "Katrina", "Kayla", "Keira", "Kendra", "Kira", "Kylie", "Lana", "Lara", "Laura", "Laurel", + "Layla", "Leah", "Leila", "Lena", "Leonora", "Lila", "Lilith", "Lillian", "Lily", "Linda", + "Lisa", "Lola", "Lorelei", "Lorna", "Louisa", "Lucia", "Lucille", "Lucinda", "Lucy", "Luna", + "Lydia", "Lyra", "Mabel", "Macy", "Madeline", "Maeve", "Maggie", "Malia", "Mallory", "Mara", + "Margot", "Maria", "Marie", "Marina", "Marion", "Marissa", "Marta", "Matilda", "Maya", "Melanie", + "Melinda", "Melissa", "Mia", "Mila", "Mildred", "Mina", "Mira", "Miranda", "Molly", "Mona", + "Morgan", "Myra", "Myrtle", "Nadia", "Nancy", "Naomi", "Natalie", "Nell", "Nessa", "Nicole", + "Nina", "Nora", "Nova", "Octavia", "Olive", "Olivia", "Opal", "Ophelia", "Paige", "Pamela", + "Pandora", "Patience", "Patricia", "Paula", "Pearl", "Penelope", "Phoebe", "Piper", "Poppy", "Priscilla", + "Prue", "Rachel", "Raina", "Ramona", "Rebecca", "Regina", "Renee", "Rhiannon", "Riley", "Rita", + "Robin", "Robyn", "Romy", "Rosalie", "Rose", "Rosemary", "Rowan", "Ruby", "Ruth", "Sabrina", + "Sadie", "Sage", "Samantha", "Sandra", "Sara", "Sarah", "Scarlett", "Selena", "Serena", "Shannon", + "Shay", "Sheila", "Shelby", "Shirley", "Sienna", "Sierra", "Simone", "Skye", "Sofia", "Sonya", + "Stella", "Stephanie", "Summer", "Sybil", "Sydney", "Sylvia", "Tabitha", "Talia", "Tamara", "Tara", + "Tatiana", "Tessa", "Thea", "Theresa", "Tia", "Tiffany", "Tracy", "Trinity", "Ursula", "Valeria", + "Vanessa", "Veronica", "Victoria", "Violet", "Vivian", "Wanda", "Wendy", "Willow"], + aztec: [ + "Huixtoci", + "Chanti", + "Meztli", + "Chalchi", + "Tlazol", + "Mictecaci", + "Citlali", + "Natah", + "Nena", + "Tonaca", + "Tlaltec", + "Chicome", + "Xilonen", + "Coatli", + "Chimalma", + "Xochi", + "Itzpa", + "Toci", + "Tzitzi", + "Xolotl", + "Nemonten", + "Tezcatli", + "Mimix", + "Xolotl", + "Atlahua", + "Quetzal", + "Tonatiuh", + ], + + + space: [ + "Kepler", + "Hubble", + "Webb", + "Schwarzschild", + "Kerr", + "Agrippa", + "Arzachel", + "Casaba", + "Cassini", + "Chandrasekhar", + "Drake", + "Galilei", + "Geller", + "Kidinnu", + "Lagadha", + "Messier", + "Murakami", + "Oikawa", + "Copernicus", + "Copernicus", + + // region cookie if you know these + "Pluto", + "Saturn", + "Luna-Terra", + // endregion + + + "Selene", + "Luna", + "Laniakea", + "Void", + "Magellan", + "Rigel", + "Rayet", + "Sagitta", + "Voyager", + "Alcyon", + "Seyfert", + "Quasar", + "Redshift", + "Cosmos", + "Axion", + "Vector", + "Nova", + "Wolf", + "Spectra", + "Yerkes", + "Herschel", + "Asymptote", + "Gaia", + "Akatsuki", + "Psyche", + "Juno", + "Lucy", + "Danuri", + "Hera", + "Chang'e", + "Osiris", + "Gagarin", + "Glenn", + "Armstrong", + "Aldrin", + "Apollo", + "Challenger", + "Artemis", + "Titan", + "Io", + "Europa", + "Ganymede", + "Mercury", + "Sputnik", + + "Andromeda", + "Antlia", + "Apus", + "Aquarius", + "Aquila", + "Ara", + "Aries", + "Auriga", + "Boötes", + "Caelum", + "Camelopardalis", + "Cancer", + "Canis", + "Capricornus", + "Carina", + "Cassiopeia", + "Centaurus", + "Cepheus", + "Cetus", + "Chamaeleon", + "Circinus", + "Columba", + "Coma", + "Berenices", + "Corona", + "Borealis", + "Corvus", + "Crater", + "Crux", + "Cygnus", + "Delphinus", + "Dorado", + "Draco", + "Equuleus", + "Eridanus", + "Fornax", + "Gemini", + "Grus", + "Hercules", + "Horologium", + "Hydra", + "Hydrus", + "Indus", + "Lacerta", + "Leo", + "Lepus", + "Libra", + "Lupus", + "Lynx", + "Lyra", + "Mensa", + "Microscopium", + "Monoceros", + "Musca", + "Norma", + "Octans", + "Ophiuchus", + "Orion", + "Pavo", + "Pegasus", + "Perseus", + "Phoenix", + "Pictor", + "Pisces", + "Piscis", + "Puppis", + "Pyxis", + "Reticulum", + "Sagitta", + "Sagittarius", + "Scorpius", + "Sculptor", + "Scutum", + "Serpens", + "Sextans", + "Taurus", + "Telescopium", + "Triangulum", + "Tucana", + "Ursa", + "Vela", + "Virgo", + "Volans", + "Vulpecula", + ], + italian: [ + "Abriana", + "Ada", + "Adalgisa", + "Adelina", + "Adriana", + "Agata", + "Agnesa", + "Aida", + "Alessa", + "Alessandra", + "Alessia", + "Alfonsina", + "Alice", + "Alina", + "Allegra", + "Alma", + "Aloisa", + "Amalia", + "Amanda", + "Amara", + "Ambra", + "Amelia", + "Anastasia", + "Andrea", + "Angela", + "Angelica", + "Angelina", + "Anita", + "Anna", + "Annabella", + "Annalisa", + "Antonia", + "Aria", + "Ariana", + "Arianna", + "Artemisia", + "Asia", + "Assunta", + "Astra", + "Aurora", + "Bambi", + "Barbara", + "Battista", + "Beata", + "Beatrice", + "Bella", + "Benedetta", + "Bianca", + "Bibiana", + "Blanca", + "Brigida", + "Bruna", + "Camila", + "Camilla", + "Candida", + "Caprice", + "Carina", + "Carla", + "Carlotta", + "Carmela", + "Carmen", + "Carola", + "Carolina", + "Cassandra", + "Caterina", + "Cecilia", + "Celeste", + "Celia", + "Chiara", + "Cinzia", + "Clara", + "Claudia", + "Clementina", + "Clio", + "Colomba", + "Concetta", + "Consuelo", + "Cora", + "Coralia", + "Cosima", + "Cristina", + "Dafne", + "Dalia", + "Dana", + "Daniela", + "Daria", + "Debora", + "Delia", + "Diana", + "Diletta", + "Dina", + "Dolores", + "Donatella", + "Dora", + "Dorotea", + "Eda", + "Edith", + "Elena", + "Eleonora", + "Elia", + "Elisa", + "Elisabetta", + "Ella", + "Elsa", + "Elvira", + "Emilia", + "Emma", + "Enrica", + "Erica", + "Erika", + "Erminia", + "Ester", + "Eva", + "Fabiana", + "Fabrizia", + "Federica", + "Felicia", + "Fiamma", + "Fiammetta", + "Filippa", + "Filomena", + "Fiorella", + "Fiorenza", + "Flaminia", + "Flavia", + "Flora", + "Florence", + "Francesca", + "Gabriela", + "Gabriella", + "Gaia", + "Gemma", + "Gia", + "Giada", + "Gianna", + "Ginevra", + "Gioia", + "Giorgia", + "Giorgina", + "Giovanna", + "Giulia", + "Giuliana", + "Giuseppina", + "Gloria", + "Graziella", + "Greta", + "Griselda", + "Guendalina", + "Guida", + "Ida", + "Ilaria", + "Imelda", + "Ines", + "Iolanda", + "Irene", + "Iris", + "Irma", + "Isa", + "Isabella", + "Isadora", + "Isotta", + "Ivana", + "Ivonne", + "Jade", + "Jasmine", + "Jessica", + "Jolanda", + "Julia", + "Karina", + "Katia", + "Kira", + "Laila", + "Lara", + "Laura", + "Lauretta", + "Lavinia", + "Lea", + "Leila", + "Lelia", + "Lena", + "Leonora", + "Letizia", + "Lia", + "Liana", + "Lidia", + "Liliana", + "Linda", + "Lisa", + "Livia", + "Lola", + "Lorena", + "Loretta", + "Lorna", + "Luana", + "Lucia", + "Luciana", + "Lucrezia", + "Ludovica", + "Luisa", + "Luna", + "Maddalena", + "Magda", + "Maida", + "Manuela", + "Mara", + "Marcella", + "Margherita", + "Maria", + "Marianna", + "Marica", + "Marilena", + "Marina", + "Marisa", + "Marta", + "Martina", + "Marzia", + "Matilde", + "Maura", + "Mauro", + "Melania", + "Melissa", + "Mia", + "Michela", + "Milena", + "Mina", + "Miranda", + "Miriam", + "Mirta", + "Monica", + "Nadia", + "Natalia", + "Natalina", + "Nella", + "Nerina", + "Nicoletta", + "Nina", + "Noemi", + "Nora", + "Norma", + "Novella", + "Olga", + "Olivia", + "Oriana", + "Ornella", + "Orsola", + "Ottavia", + "Paola", + "Patrizia", + "Perla", + "Petra", + "Pia", + "Piera", + "Pietra", + "Prisca", + "Priscilla", + "Quinta", + "Rachele", + "Raffaella", + "Rebecca", + "Regina", + "Renata", + "Riccarda", + "Rina", + "Rita", + "Roberta", + "Roma", + "Romana", + "Romina", + "Rosa", + "Rosalia", + "Rosanna", + "Rosaria", + "Rosella", + "Rosetta", + "Rossana", + "Rossella", + "Roxana", + "Sabina", + "Sabrina", + "Samantha", + "Sandra", + "Sara", + "Savina", + "Selena", + "Selma", + "Serena", + "Sergio", + "Sibilla", + "Silvana", + "Silvia", + "Simona", + "Sofia", + "Sonia", + "Stefania", + "Stella", + "Susanna", + "Tania", + "Tatiana", + "Tecla", + "Teresa", + "Tessa", + "Tina", + "Tiziana", + "Tommasa", + "Umberta", + "Valeria", + "Valeriana", + "Vanessa", + "Vanna", + "Vera", + "Veronica", + "Viola", + "Virginia", + "Vittoria", + "Viviana", + "Zara", + "Zelinda", + "Zita", + "Zoe" + ], + Fuuka: ["Fuuka Windsong"], + TheWarden: ["Dawn Carver"], + TheWardenFighter: ["Citrina"], + TheWardenWizard: ["Agatha"], + TheWardenRogue: ["Luna"], + TheWardenDoll: ["Doll #51"], + Dollmaker: ["Catherine Willows"], + MaidKnightHeavy: ["Saryth"], + MaidKnightLight: ["Alisza"], + chinese: [ + "Ai", + "Aimei", + "Anli", + "Bai", + "Bao", + "Bei", + "Bing", + "Cai", + "Caihong", + "Caiyun", + "Can", + "Chang", + "Chao", + "Chen", + "Cheng", + "Chou", + "Chu", + "Chun", + "Chunhua", + "Chunlan", + "Chunli", + "Chunyan", + "Chunying", + "Cong", + "Cuifen", + "Dai", + "Daiyu", + "Dan", + "Dandan", + "Danyang", + "Deng", + "Dong", + "Dongmei", + "En", + "Fang", + "Fangfang", + "Fanghua", + "Fangyuan", + "Fei", + "Feifei", + "Fen", + "Feng", + "Fengge", + "Fenghua", + "Fenglan", + "Fengling", + "Fengyun", + "Fu", + "Fuyao", + "Fuyu", + "Gan", + "Gang", + "Ge", + "Gen", + "Guang", + "Guifen", + "Guihua", + "Guilan", + "Guirong", + "Guixiang", + "Guo", + "Hai", + "Haifeng", + "Hailan", + "Haiyan", + "Haiying", + "Han", + "Hanhua", + "Hanyu", + "He", + "Hei", + "Heng", + "Hong", + "Hongmei", + "Hongxia", + "Hongyan", + "Hongyu", + "Hou", + "Hua", + "Huahua", + "Huai", + "Huan", + "Huanyu", + "Hui", + "Huifang", + "Huifen", + "Huihui", + "Huiling", + "Huimin", + "Huiqing", + "Huirong", + "Huiying", + "Huiyun", + "Jia", + "Jiahui", + "Jiali", + "Jian", + "Jiang", + "Jiao", + "Jie", + "Jielin", + "Jin", + "Jing", + "Jingjing", + "Jingyi", + "Jingyu", + "Jinhua", + "Jinlan", + "Jinmei", + "Jinping", + "Jinyu", + "Jiuyue", + "Ju", + "Juan", + "Jue", + "Jun", + "Junjie", + "Junlan", + "Junru", + "Juxia", + "Kai", + "Kaihua", + "Kaiyu", + "Kang", + "Kun", + "Lan", + "Lanfen", + "Lanhua", + "Lanlan", + "Lanying", + "Lei", + "Lian", + "Liang", + "Lianhua", + "Liangliang", + "Liangying", + "Liangyu", + "Liao", + "Lian", + "Liang", + "Lihua", + "Lijuan", + "Lili", + "Liling", + "Limei", + "Limin", + "Lin", + "Lina", + "Ling", + "Lingling", + "Lingyun", + "Linlin", + "Liping", + "Liqin", + "Liqing", + "Lirong", + "Liwei", + "Liwen", + "Liyan", + "Liying", + "Liyu", + "Liyun", + "Lizhen", + "Lizi", + "Long", + "Luan", + "Luli", + "Lulu", + "Lun", + "Luo", + "Luping", + "Luyu", + "Mai", + "Man", + "Mao", + "Mei", + "Meifen", + "Meihua", + "Meijuan", + "Meili", + "Meiling", + "Meimei", + "Meirong", + "Meixiang", + "Meixiu", + "Meiyu", + "Meizhen", + "Meng", + "Menghua", + "Mengmeng", + "Miao", + "Min", + "Ming", + "Minghua", + "Mingli", + "Mingmei", + "Mingxia", + "Mingyu", + "Mingzhu", + "Nan", + "Nana", + "Ning", + "Ningning", + "Niu", + "Nuan", + "Pei", + "Peifen", + "Peihua", + "Peipei", + "Peng", + "Ping", + "Pingping", + "Qian", + "Qiang", + "Qiao", + "Qiaoyun", + "Qin", + "Qing", + "Qingge", + "Qinghua", + "Qinglan", + "Qingling", + "Qingmei", + "Qingqing", + "Qingshan", + "Qingyuan", + "Qingyun", + "Qiong", + "Qiu", + "Qiuyue", + "Quan", + "Ran", + "Rong", + "Ronghua", + "Rongrong", + "Ru", + "Rui", + "Ruirui", + "Ruyi", + "Ruyu", + "San", + "Shan", + "Shanhua", + "Shanli", + "Shanshan", + "Shao", + "Shen", + "Sheng", + "Shi", + "Shuang", + "Shuangshuang", + "Shui", + "Shun", + "Shu", + "Shufen", + "Shuhua", + "Shui", + "Shun", + "Shu", + "Shufen", + "Shuhua", + "Shujun", + "Shulan", + "Shuli", + "Shumei", + "Shun", + "Shuyi", + "Shuyu", + "Shuzhen", + "Song", + "Sufen", + "Suhua", + "Sui", + "Suyin", + "Suyu", + "Suzhen", + "Tao", + "Tian", + "Ting", + "Tingting", + "Tong", + "Tongtong", + "Wei", + "Weifen", + "Weihua", + "Weili", + "Weimei", + "Weiping", + "Weixia", + "Weiyu", + "Wen", + "Wenhua", + "Wenjing", + "Wenli", + "Wenping", + "Wenwen", + "Xia", + "Xiafen", + "Xiaohong", + "Xiaohua", + "Xiaojing", + "Xiaolan", + "Xiaoli", + "Xiaoling", + "Xiaomei", + "Xiaoping", + "Xiaoyan", + "Xiaoying", + "Xiaoyu", + "Xiaozhen", + "Xie", + "Xin", + "Xing", + "Xingxing", + "Xinlan", + "Xinru", + "Xinyi", + "Xinyu", + "Xiu", + "Xiulan", + "Xiuli", + "Xiumei", + "Xiumin", + "Xiuying", + "Xue", + "Xuefen", + "Xuehua", + "Xueli", + "Xuemei", + "Xueping", + "Xueyan", + "Xueying", + "Xun", + "Yafen", + "Yahui", + "Yali", + "Yan", + "Yanfen", + "Yanhong", + "Yanhua", + "Yanli", + "Yanling", + "Yanmei", + "Yanping", + "Yanru", + "Yanxia", + ], + vampire: [ + "Abriana", + "Ada", + "Adrielle", + "Agrippina", + "Ailith", + "Akasha", + "Akshayaa", + "Alina", + "Amalia", + "Amaris", + "Ambra", + "Ambrosia", + "Amelia", + "Amira", + "Anastasia", + "Anne", + "Artemisia", + "Asra", + "Astra", + "Aurora", + "Azrael", + "Bambi", + "Belladonna", + "Bianca", + "Briar", + "Camilla", + "Carmen", + "Cassandra", + "Catherine", + "Celeste", + "Celia", + "Chime", + "Ciarra", + "Cinzia", + "Clara", + "Cora", + "Coralia", + "Cosima", + "Crimson", + "Daeva", + "Dahlia", + "Dana", + "Darcia", + "Darya", + "Debora", + "Delia", + "Desdemona", + "Diana", + "Dina", + "Drusilla", + "Edith", + "Elena", + "Elisaria", + "Elvira", + "Enyo", + "Erica", + "Esmeray", + "Essie", + "Eva", + "Fala", + "Fiamma", + "Fiona", + "Flora", + "Gemma", + "Gia", + "Gisela", + "Godfrey", + "Graziella", + "Griselda", + "Guendalina", + "Ida", + "Ines", + "Iris", + "Isadora", + "Isotta", + "Ivonne", + "Jade", + "Jezebel", + "Jett", + "Jolanda", + "Julia", + "Keket", + "Kira", + "Laila", + "Lara", + "Leila", + "Lena", + "Leonora", + "Letizia", + "Lia", + "Lilith", + "Livia", + "Lola", + "Lorena", + "Lucia", + "Lucrezia", + "Luna", + "Maddalena", + "Magda", + "Magnifica", + "Mara", + "Marcella", + "Marianna", + "Marina", + "Maryse", + "Matilde", + "Melania", + "Melissa", + "Mia", + "Mina", + "Miranda", + "Mira", + "Mirta", + "Monica", + "Nadia", + "Natalia", + "Nella", + "Nerezza", + "Nerina", + "Nina", + "Noemi", + "Nora", + "Novella", + "Olga", + "Olivia", + "Oriana", + "Ornella", + "Perla", + "Petra", + "Pia", + "Piera", + "Polemia", + "Prisca", + "Rachele", + "Raven", + "Rebecca", + "Regina", + "Renata", + "Rina", + "Roma", + "Romina", + "Rosa", + "Rosalia", + "Rosaria", + "Rosceline", + "Rosella", + "Roxana", + "Sabina", + "Sabrina", + "Samara", + "Samantha", + "Sandra", + "Sara", + "Selena", + "Selma", + "Serena", + "Sibilla", + "Silvia", + "Simona", + "Sofia", + "Stella", + "Susanna", + "Tania", + "Tatiana", + "Thana", + "Tina", + "Valeria", + "Vanessa", + "Vera", + "Veronica", + "Viola", + "Vittoria", + "Viviana", + "Zara", + "Zelinda", + "Zita", + "Zoe" + ], + french: [ + "Abella", + "Adalie", + "Adeline", + "Adrienne", + "Aimee", + "Alaine", + "Albertine", + "Alice", + "Aline", + "Alizee", + "Amalie", + "Amelie", + "Anais", + "Angele", + "Angelique", + "Annette", + "Anouk", + "Antoinette", + "Ariane", + "Arielle", + "Astrid", + "Audrey", + "Aurelie", + "Aveline", + "Axelle", + "Babette", + "Beatrice", + "Belle", + "Bernadette", + "Blanche", + "Brigitte", + "Camille", + "Candice", + "Capucine", + "Carine", + "Carla", + "Carole", + "Caroline", + "Catherine", + "Cecile", + "Celeste", + "Celine", + "Cerise", + "Chantal", + "Charlotte", + "Chloe", + "Christelle", + "Christiane", + "Christine", + "Claire", + "Clara", + "Clarisse", + "Claudette", + "Claudine", + "Colette", + "Coline", + "Constance", + "Coralie", + "Coraline", + "Corinne", + "Cosette", + "Danielle", + "Daphne", + "Delphine", + "Denise", + "Diane", + "Dominique", + "Edith", + "Elaine", + "Eleanor", + "Eleonore", + "Elise", + "Elodie", + "Eloise", + "Emeline", + "Emilie", + "Emma", + "Emmanuelle", + "Esme", + "Estelle", + "Eugenie", + "Eulalie", + "Eve", + "Evelyn", + "Fabienne", + "Fantine", + "Fay", + "Faye", + "Felicie", + "Fiona", + "Flavie", + "Fleur", + "Florence", + "Floriane", + "Francoise", + "Gabrielle", + "Gaia", + "Genevieve", + "Georgette", + "Georgine", + "Geraldine", + "Ghislaine", + "Gigi", + "Gilberte", + "Ginette", + "Gisele", + "Giselle", + "Helene", + "Heloise", + "Henriette", + "Hortense", + "Ines", + "Irene", + "Iris", + "Isabeau", + "Isabelle", + "Isaline", + "Isolde", + "Jacqueline", + "Jade", + "Janine", + "Jeanne", + "Jeannette", + "Jeannine", + "Joceline", + "Jocelyne", + "Joelle", + "Josephine", + "Josette", + "Josiane", + "Julia", + "Julie", + "Juliette", + "Justine", + "Karine", + "Katell", + "Kathleen", + "Katia", + "Katrine", + "Laetitia", + "Lara", + "Laura", + "Laure", + "Laurel", + "Laurene", + "Laurentine", + "Laurie", + "Layla", + "Lea", + "Leila", + "Leonie", + "Lila", + "Liliane", + "Lilou", + "Lina", + "Linda", + "Line", + "Lise", + "Lisette", + "Livia", + "Lola", + "Lorelei", + "Lorraine", + "Lou", + "Louane", + "Louisa", + "Louise", + "Lucie", + "Lucienne", + "Lucile", + "Lucille", + "Ludivine", + "Luna", + "Lyla", + "Lydie", + "Lynette", + "Madeleine", + "Magali", + "Magalie", + "Maelle", + "Maeva", + "Manon", + "Marceline", + "Margaux", + "Margot", + "Marguerite", + "Mariam", + "Marie", + "Marie-Claire", + "Marie-France", + "Marie-Laure", + "Marie-Noelle", + "Marie-Pierre", + "Marina", + "Marine", + "Marion", + "Marise", + "Marjorie", + "Marlene", + "Martine", + "Mathilde", + "Maude", + "Maud", + "Maurine", + "Maxime", + "Maxine", + "Maya", + "Melanie", + "Melina", + "Melissa", + "Melodie", + "Mercedes", + "Michelle", + "Mila", + "Mireille", + "Mirella", + "Mirelle", + "Monique", + "Morgane", + "Myriam", + "Nadia", + "Nadine", + "Nanette", + "Natalie", + "Nathalie", + "Nelly", + "Nicole", + "Nicolette", + "Nina", + "Noa", + "Noelie", + "Noelle", + "Noemie", + "Nora", + "Odette", + "Odile", + "Olive", + "Olivia", + "Olympe", + "Ophelie", + "Paola", + "Paule", + "Paulette", + "Pauline", + "Perrine", + "Philippine", + "Philomene", + "Phoebe", + "Pia", + "Pierrette", + "Priscille", + "Prune", + "Quitterie", + "Rachel", + "Raphaelle", + "Rebecca", + "Reine", + "Renee", + "Rochelle", + "Romane", + "Romy", + "Rosalie", + "Rosanne", + "Rose", + "Rose-Marie", + "Roseline", + "Rosine", + "Roxane", + "Roxanne", + "Sabine", + "Sabrina", + "Salome", + "Sandrine", + "Sara", + "Sarah", + "Sasha", + "Savannah", + "Severine", + "Simone", + "Sixtine", + "Solange", + "Soleil", + "Solenne", + "Sonia", + "Sophia", + "Sophie", + "Stella", + "Suzanne", + "Suzette", + "Sylvia", + "Sylvie", + "Talia", + "Tatiana", + "Thais", + "Therese", + "Tiffany", + "Valentine", + "Valerie", + "Vanessa", + "Vera", + "Veronique", + "Victoire", + "Victoria", + "Violette", + "Virginie", + "Viviane", + "Vivienne", + "Yasmina", + "Yolande", + "Yseult", + "Yvette", + "Yvonne", + "Zara", + "Zoe", + "Zoey" + ], + science: [ + "Aryabhatta", + "Alcubierre", + "Alhazen", + "Archimedes", + "Avicenna", + "Asimov", + "Banks", + "Bernoulli", + "Bohr", + "Bosscha", + "Casimir", + "Chernokov", + "Newton", + "Curie", + "Dirac", + "Doppler", + "Eigen", + "Faraday", + "Fermi", + "Mach", + "Fourier", + "Geiger", + "Euler", + "Goddard", + "Hamilton", + "Heisenberg", + "Neumann", + "Turing", + "Huygens", + "Kaku", + "Maiani", + "Navarro", + "Nezan", + "Ohm", + "Poincare", + "Qian", + "Rayleigh", + "Reynolds", + "Schrodinger", + "Desitter", + "Teller", + "Dyson", + "Ampere", + "Watt", + "Volt", + "Coloumb", + "Einstein", + "Laplace", + "Yukawa", + "Celsius", + "Kelvin", + "Hawking", + "Maxwell", + "Weber", + "Fresnel", + "da Vinci", + "Boole", + "Hilbert", + "Pascal", + "Penrose", + ], + cthulu: [ + "Oukranos", + "Lobon", + "Horthath", + "Tamash", + "Zo-Kalar", + "Hagarg", + "Ryonis", + "Karakal", + "Abhoth", + "Aiueb", + "Aletheia", + "Azathoth", + "Azathoth", + "Azhorra", + "Blackness", + "C'thalpa", + "Cxaxukluth", + "Daoloth", + "Darkness", + "D'endrrah", + "Hydra", + "Ialdagorth", + "Lukthu", + "Mh'ithrha", + "Nameless", + "Korath", + "Nyarlathotep", + "Nyctelios", + "Atheron", + "Rakath", + "Trunembra", + "Tulzscha", + "Xa'ligha", + "Xexanoth", + "Yidhra", + "Yog-Sothoth", + "Shavalyoth", + "Yaggdytha", + "Yig", + "Cthylla", + "Ctoggha", + "Dythalla", + "Ei'lor", + "Kaunuzoth", + "Shista", + "Swarog", + "Xitalu", + "Yamath", + "Ythogtha", + "Yorith", + "Rokon", + "Perse", + "Oorn", + "Annihilation", + ], + demon: [ + // The demon that answers when you call its name + "Chara", + + "Babylon", + "Akhkhazu", + "Alara", + "Artemis", + "Astra", + "Axe", + "Azura", + "Bardiche", + "Batibat", + "Blade", + "Bow", + "Caliver", + "Catapult", + "Chamunda", + "Charmo", + "Chedipe", + "Chesma", + "Chordeva", + "Crossbow", + "Culverin", + "Dagger", + "Dakini", + "Daruka", + "Dia", + "Dracon", + "Drea", + "Durukti", + "Estoc", + "Falconet", + "Flail", + "Flame", + "Futakuchi", + "Glaive", + "Griselda", + "Guisarme", + "Gungdo", + "Gwisin", + "Halberd", + "Hanako", + "Hankyu", + "Hannya", + "Harionago", + "Hashihime", + "Hatchet", + "Hone", + "Huli", + "Iara", + "Iris", + "Istinggar", + "Javelin", + "Jiaozhi", + "Jorogumo", + "Kali", + "Katana", + "Kestros", + "Kira", + "Kora", + "Krasue", + "Kumiho", + "Kunai", + "Lance", + "Lantaka", + "Mace", + "Maeve", + "Mangonel", + "Mara", + "Messina", + "Mina", + "Paimon", + "Sara", + "Saya", + "Scythe", + "Shuri", + "Shuriken", + "Sira", + "Spear", + "Sword", + "Tarrasque", + "Minokawa", + "Balaur", + "Strigoi", + "Zmei", + "Grendel", + "Messer", + "Daikyu", + "Gungdo", + "Hankyu", + "Skane", + "Maul", + "Culverin", + "Hwacha", + "Kage", + "Khopesh", + "Nimcha", + "Shashka", + "Dao", + "Tsurugi", + "Kodachi", + "Bolo", + "Katagan", + "Kama", + "Hasta", + "Yari", + "Voulge", + "Lancea", + "Vel", + "Assegai", + "Rungu", + "Basilisk", + "Lantaka", + "Xanadu", + ], + + cyborg: [ + "Ace", + "Ada", + "Adira", + "Aiko", + "Alexa", + "Alia", + "Alita", + "Alma", + "Amber", + "Angel", + "Anika", + "Anna", + "Anya", + "Aphrodite", + "Aria", + "Ariel", + "Ash", + "Astra", + "Athena", + "Aura", + "Ava", + "Avery", + "Bailey", + "Bella", + "Blade", + "Blair", + "Blaze", + "Blitz", + "Bolt", + "Byte", + "Cali", + "Callie", + "Camila", + "Cara", + "Carmen", + "Cassidy", + "Catherine", + "Celeste", + "Cherry", + "Chloe", + "Chronos", + "Cipher", + "Claire", + "Clara", + "Cleo", + "Cora", + "Cortex", + "Cyberia", + "Cyra", + "Daisy", + "Dana", + "Daniela", + "Daphne", + "Data", + "Delta", + "Demon", + "Diva", + "Dixie", + "Dora", + "Dot", + "Echo", + "Eden", + "Electra", + "Elena", + "Eliana", + "Elise", + "Ella", + "Ellie", + "Elsa", + "Ember", + "Emma", + "Enigma", + "Eris", + "Eva", + "Eve", + "Evie", + "Faith", + "Faye", + "Fiona", + "Flame", + "Flash", + "Flora", + "Freya", + "Frost", + "Fury", + "Galatea", + "Galaxina", + "Gia", + "Gigi", + "Gina", + "Glitch", + "Grace", + "Hailey", + "Halo", + "Hana", + "Harley", + "Harper", + "Hazel", + "Heidi", + "Hera", + "Holly", + "Hope", + "Iris", + "Isla", + "Ivy", + "Jade", + "Jasmine", + "Jenna", + "Jessa", + "Jessie", + "Jill", + "Jinx", + "Joan", + "Jodie", + "Jordan", + "Joy", + "Juno", + "Kara", + "Karma", + "Kate", + "Kayla", + "Kaylee", + "Keira", + "Kelly", + "Kendra", + "Kira", + "Kitty", + "Kora", + "Kyla", + "Kylie", + "Lana", + "Lara", + "Layla", + "Leah", + + "Leila", + "Lena", + "Lexi", + "Lia", + "Lila", + "Lily", + "Lina", + "Lisa", + "Liv", + "Lola", + "Lorelei", + "Lottie", + "Lucia", + "Lucy", + "Luna", + "Lydia", + "Lyra", + "Mabel", + "Macy", + "Maddie", + "Maeve", + "Maggie", + "Maia", + "Mara", + "Maria", + "Marie", + "Marina", + "Marta", + "Maya", + "Mia", + "Mila", + "Mina", + "Mira", + "Misty", + "Molly", + "Morgan", + "Mya", + "Nadia", + "Nala", + "Natalie", + "Naya", + "Nebula", + "Nia", + "Nico", + "Nina", + "Noa", + "Noelle", + "Nora", + "Nova", + "Nyx", + "Olive", + "Olivia", + "Opal", + "Orla", + "Paige", + "Paisley", + "Parker", + "Pearl", + "Penny", + "Peyton", + "Phoebe", + "Piper", + "Pixel", + "Poppy", + "Quinn", + "Rain", + "Raven", + "Rebel", + "Reese", + "Remy", + "Renee", + "Ria", + "Riley", + "Rina", + "Rita", + "River", + "Robin", + "Rogue", + "Romy", + "Rosa", + "Rose", + "Rosie", + "Roxy", + "Ruby", + "Rue", + "Ryder", + "Sabrina", + "Sage", + "Sally", + "Sam", + "Sara", + "Sasha", + "Scarlet", + "Selena", + "Serena", + "Serenity", + "Shade", + "Shadow", + "Shay", + "Shea", + "Shelby", + "Sienna", + "Sierra", + "Silver", + "Sky", + "Skye", + "Skylar", + "Sofia", + "Sophia", + "Sophie", + "Spark", + "Spectre", + "Stella", + "Storm", + "Summer", + "Sydney", + "Talia", + "Tara", + "Tasha", + "Tatum", + "Taylor", + "Tessa", + "Thalia", + "Thea", + "Tia", + "Tina", + "Tori", + "Trinity", + "Tris", + "Tyra", + "Valerie", + "Valkyrie", + "Vega", + "Vera", + "Veronica", + "Vesper", + "Violet", + "Vixen", + "Willa", + "Winter", + "Wren", + "Xena", + "Zara", + "Zara", + "Zia", + "Zoe", + "Zoey", + "Zola", + "Zora", + "Zoya", + "Zyra" + ], + bast: [ + "Ahhotep", + "Ahmose", + "Akila", + "Amunet", + "Anat", + "Anippe", + "Ankhesenamun", + "Ankhet", + "Asenath", + "Auset", + "Bastet", + "Berenice", + "Cleopatra", + "Djoser", + "Esi", + "Eshe", + "Hatshepsut", + "Heba", + "Heqet", + "Hetepheres", + "Iman", + "Imhotep", + "Isis", + "Jendayi", + "Kamilah", + "Keket", + "Kiya", + "Layla", + "Maat", + "Mandisa", + "Mara", + "Mehit", + "Menna", + "Meret", + "Meritamen", + "Meryt", + "Mesi", + "Mut", + "Nadia", + "Nafretiri", + "Nailah", + "Nakia", + "Nebet", + "Nebetah", + "Nefertari", + "Nefertiti", + "Neith", + "Nekhbet", + "Nema", + "Nenet", + "Nephthys", + "Nerfertum", + "Nesma", + "Nila", + "Nitocris", + "Nour", + "Nubia", + "Nyla", + "Panya", + "Rana", + "Rania", + "Rashida", + "Ren", + "Renenutet", + "Safiya", + "Salma", + "Sanaa", + "Saniya", + "Sekhmet", + "Selma", + "Serqet", + "Shani", + "Sharmila", + "Shayma", + "Sobek", + "Sohalia", + "Sopdet", + "Tahirah", + "Talibah", + "Tanis", + "Taweret", + "Tefnut", + "Thema", + "Thutmose", + "Tiye", + "Umayma", + "Wadjet", + "Yamila", + "Yasmin", + "Zahra", + "Zalika", + "Zara", + "Zaynab", + "Zillah", + "Zola", + "Zuberi" + ], + DragonGirl: [ + "Aeliana", "Althaea", "Amaranya", "Amara", "Anais", + "Angelina", "Astridra", "Aureliax", "Azuraitha", "Brynhildr", + "Caelia", "Camilla", "Chiaraflame", + "Draconia", "Drakaina", "Elysia", "Emmeline", + "Fenra", "Fiora", "Galladria", "Gwyndolin", + "Helios", "Ilyana", "Ignisia", "Isolde", "Jasmina", + "Kaida", "Kaelith", "Lysandra", "Lorelei", "Luciana", + "Myrrh", "Maelis", "Nimue", "Norberta", "Ophira", + "Pyralis", "Pandora", "Quelara", "Ravana", "Ramoth", + "Siveth", "Sylvara", "Tiamara", "Ursula", "Vaeloria", + "Vermithrax", "Wyverna", "Xanthe", "Ysolt", "Zephyra", + "Belladonna", "Dahlia", + "Umbra", "Vespera", "Wisteria", "Xylia", "Ygraine", + "Zephyrine", "Zara", "Zephyr", + ], + +}; \ No newline at end of file diff --git a/Game/src/enemy/KinkyDungeonPathfinding.ts b/Game/src/enemy/KinkyDungeonPathfinding.ts new file mode 100644 index 000000000..81350a34c --- /dev/null +++ b/Game/src/enemy/KinkyDungeonPathfinding.ts @@ -0,0 +1,304 @@ +"use strict"; + +interface KDPointCostSource extends KDPoint { + /** g = cost */ + g: number; + /** f = cost with heuristic */ + f: number; + /** s = source */ + s: string; +}; + +let KDPathCache: Map = new Map(); + +let KDPathCacheIgnoreLocks: Map = new Map(); + +let KDSmartMovable = new Map(); +let KDMovable = new Map(); + +function KDUpdateDoorNavMap() { + KDPathCache = new Map(); + KDUpdateChokes = true; + KDMovable = new Map(); + KDSmartMovable = new Map(); +} + +/** + * @param x + * @param y + */ +function KDIsMovable(x: number, y: number): boolean { + if (KDMovable.has(x+','+y)) { + return KDMovable.get(x+','+y); + } else { + let m = KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x, y)); + KDMovable.set(x+','+y, m); + return m; + } +} + +/** + * @param x + * @param y + */ +function KDIsSmartMovable(x: number, y: number): boolean { + if (KDSmartMovable.has(x+','+y)) { + return KDSmartMovable.get(x+','+y); + } else { + let m = KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(x, y)); + KDSmartMovable.set(x+','+y, m); + return m; + } +} + +let KDPathfindingCacheHits = 0; +let KDPathfindingCacheFails = 0; + +let KDPFTrim = 40; + +/** + * @param startx - the start position + * @param starty - the start position + * @param endx - the end positon + * @param endy - the end positon + * @param blockEnemy - Do enemies block movement? + * @param blockPlayer - Does player block movement? + * @param ignoreLocks + * @param Tiles - Allowed move tiles! + * @param [RequireLight] + * @param [noDoors] + * @param [needDoorMemory] + * @param [Enemy] - Enemy trying to pathfind + * @param [trimLongDistance] - Give up after 1000 or so tiles checked + * @param [heuristicOverride] + * @param [taxicab] + * @param [ignoreTrafficLaws] + */ +function KinkyDungeonFindPath ( + startx: number, + starty: number, + endx: number, + endy: number, + blockEnemy: boolean, + blockPlayer: boolean, + ignoreLocks: boolean, + Tiles: string, + RequireLight?: boolean, + noDoors?: boolean, + needDoorMemory?: boolean, + Enemy?: entity, + trimLongDistance?: boolean, + heuristicOverride?: (x: number, y: number, xx: number, yy: number) => number, + taxicab?: boolean, + ignoreTrafficLaws?: boolean +): KDPoint[] +{ + let tileShort = Tiles; + if (Tiles == KinkyDungeonMovableTilesSmartEnemy) tileShort = "TSE"; + else if (Tiles == KinkyDungeonMovableTilesEnemy) tileShort = "TE"; + else if (Tiles == KinkyDungeonGroundTiles) tileShort = "TG"; + let index = `${startx},${starty},${endx},${endy},${tileShort}`; + if (!blockEnemy && !blockPlayer && !RequireLight && !noDoors && !needDoorMemory) { + if (ignoreLocks) { + if (KDPathCacheIgnoreLocks.has(index)) { + KDPathfindingCacheHits++; + if (KDPathCacheIgnoreLocks.get(index)[0] && KDistChebyshev(KDPathCacheIgnoreLocks.get(index)[0].x - startx, KDPathCacheIgnoreLocks.get(index)[0].y - starty) < 1.5) + return KDPathCacheIgnoreLocks.get(index).slice(0); + else KDPathCacheIgnoreLocks.delete(index); + } + } else { + if (KDPathCache.has(index)) { + KDPathfindingCacheHits++; + if (KDPathCache.get(index)[0] && KDistChebyshev(KDPathCache.get(index)[0].x - startx, KDPathCache.get(index)[0].y - starty) < 1.5) + return KDPathCache.get(index).slice(0); + else KDPathCache.delete(index); + } + } + + } + + if (KDistChebyshev(startx - endx, starty - endy) < 1.5) { + return [{x: endx, y: endy}]; + } + + function heuristic(xx: number, yy: number, endxx: number, endyy: number) { + return ((xx - endxx) * (xx - endxx) + (yy - endyy) * (yy - endyy)) ** 0.5; + } + let heur = heuristicOverride || heuristic; + // g = cost + // f = cost with heuristic + // s = source + let TilesTemp = Tiles; + if (noDoors) TilesTemp = Tiles.replace("D", ""); + let start: KDPointCostSource = {x: startx, y: starty, g: 0, f: 0, s: ""}; + + // We generate a grid based on map size + let open: Map = new Map(); + open.set(startx + "," + starty, start); + let closed: Map = new Map(); + + let costBonus = 0; + let MapTile = null; + let moveCost = 1; + let succ = new Map(); + + while(open.size > 0) { + // Trim if it takes too long + if (trimLongDistance && (closed.size > KDPFTrim || open.size > 3*KDPFTrim)) { + console.log("Quit pathfinding"); + return undefined; // Give up + } + let lowest: KDPointCostSource = undefined; + let lc = 1000000000; + // Get the open tile with the lowest weight + open.forEach(o => { + if (o.f < lc) { + lc = o.f; + lowest = o; + } + }); + if (lowest) { + let lowLoc = lowest.x + "," + lowest.y; + moveCost = 1; + succ = new Map(); + // Check bordering tiles on the lowest + for (let x = -1; x <= 1; x++) { + for (let y = -1; y <= 1; y++) { + if ((x != 0 || y != 0) && (!taxicab || y == 0 || x == 0)) { + let xx = lowest.x + x; + let yy = lowest.y + y; + let tile = (xx == endx && yy == endy) ? "" : KinkyDungeonMapGet(xx, yy); + MapTile = KinkyDungeonTilesGet((xx) + "," + (yy)); + let locIndex = `${lowLoc},${endx},${endy},${tileShort}`; + // If we have found the end + if (xx == endx && yy == endy) { + closed.set(lowLoc, lowest); + let newPath = KinkyDungeonGetPath(closed, lowest.x, lowest.y, endx, endy); + if (!blockEnemy && !blockPlayer && !RequireLight && !noDoors && !needDoorMemory) { + if (ignoreLocks) { + if (!KDPathCacheIgnoreLocks.has(index)) KDSetPathfindCache(KDPathCacheIgnoreLocks, newPath, endx, endy, tileShort, index); + } else { + if (!KDPathCache.has(index)) KDSetPathfindCache(KDPathCache, newPath, endx, endy, tileShort, index); + } + } + KDPathfindingCacheFails++; + if (newPath.length > 0 && TilesTemp.includes(KinkyDungeonMapGet(newPath[0].x, newPath[0].y))) + return newPath; + else return undefined; + } else if (!blockEnemy && !blockPlayer && !RequireLight && !noDoors && !needDoorMemory + && ((ignoreLocks && KDPathCacheIgnoreLocks.has(locIndex)) || (!ignoreLocks && KDPathCache.has(locIndex)))) { + let newPath = []; + if (ignoreLocks) { + closed.set(lowLoc, lowest); + newPath = KinkyDungeonGetPath(closed, lowest.x, lowest.y); + let endPath = KDPathCacheIgnoreLocks.get(locIndex).slice(0); + KDPathfindingCacheHits++; + newPath.push(...endPath); + } else { + closed.set(lowLoc, lowest); + newPath = KinkyDungeonGetPath(closed, lowest.x, lowest.y); + let endPath = KDPathCache.get(locIndex).slice(0); + KDPathfindingCacheHits++; + newPath.push(...endPath); + } + if (newPath.length > 0) { + if (newPath[0] && KDistChebyshev(newPath[0].x - startx, newPath[0].y - starty) < 1.5) { + if (ignoreLocks) { + if (!KDPathCacheIgnoreLocks.has(index)) KDSetPathfindCache(KDPathCacheIgnoreLocks, newPath, endx, endy, tileShort, index); + } else { + if (!KDPathCache.has(index)) KDSetPathfindCache(KDPathCache, newPath, endx, endy, tileShort, index); + } + return newPath; + } + else if (ignoreLocks) { + KDPathCacheIgnoreLocks.delete(locIndex); + } else { + KDPathCache.delete(locIndex); + } + } else return undefined; + } + // Give up and add to the test array + else if (TilesTemp.includes(tile) && (!RequireLight || KinkyDungeonVisionGet(xx, yy) > 0) + && (ignoreLocks || !MapTile || !MapTile.Lock || (Enemy && KDLocks[MapTile.Lock].canNPCPass(xx, yy, MapTile, Enemy))) + && (!blockEnemy || KinkyDungeonNoEnemyExceptSub(xx, yy, false, Enemy)) + && (!blockPlayer || KinkyDungeonPlayerEntity.x != xx || KinkyDungeonPlayerEntity.y != yy) + && (!needDoorMemory || tile != "d" || KDOpenDoorTiles.includes(KDMapData.TilesMemory[xx + "," + yy]))) { + costBonus = 0; + if (!ignoreTrafficLaws) { + if (tile == "V" && !(MapTile?.Sfty)) costBonus = 14; + else if (tile == "N") costBonus = 30; + else if (tile == "D") costBonus = 3; + else if (tile == "d") costBonus = -2; + else if (tile == "g") costBonus = 9; + else if (tile == "L") costBonus = 9; + else if (tile == "T") costBonus = 4; + costBonus = (MapTile && MapTile.Lock) ? costBonus + 2 : costBonus; + costBonus = (MapTile && MapTile.OL) ? costBonus + 12 : costBonus; + costBonus = (KDMapData.Traffic?.length > 0 && KDMapData.Traffic[yy]) ? costBonus + (KDMapData.Traffic[yy][xx] || 0) : costBonus; + costBonus = Math.max(0, costBonus); + } + succ.set(xx + "," + yy, {x: xx, y: yy, + g: moveCost + costBonus + lowest.g, + f: moveCost + costBonus + lowest.g + heur(xx, yy, endx, endy), + s: lowLoc}); + } + } + } + } + succ.forEach(s => { + let q = s.x + "," + s.y; + let openSucc = open.get(q); + if (!openSucc || openSucc.f > s.f) { + let closedSucc = closed.get(q); + if (!closedSucc || closedSucc.f > s.f) { + open.set(q, s); + } + } + }); + + + open.delete(lowLoc); + + closed.set(lowLoc, lowest); + } else { + open.clear(); + console.log("Pathfinding error! Please report this!"); + } + } + + return undefined; +} + +// Goes back and gets path backwards from xx, adding endx and endy +function KinkyDungeonGetPath(closed: Map, xx: number, yy: number, endx?: number, endy?: number): KDPoint[] { + let list = []; + if (endx && endy) list.push({x: endx, y: endy}); + + let current = closed.get(xx + "," + yy); + while (current) { + if (current.s) { + list.push({x: current.x, y: current.y}); + current = closed.get(current.s); + } else current = undefined; + } + + return list.reverse(); +} + +/** + * @param PathMap + * @param newPath + * @param endx + * @param endy + * @param Tiles + * @param Finalindex + */ +function KDSetPathfindCache(PathMap: Map, newPath: KDPoint[], endx: number, endy: number, Tiles: string, Finalindex: string): void { + for (let i = 0; i < newPath.length - 1; i++) { + let path = newPath.slice(i); + let index = `${path[0].x},${path[0].y},${endx},${endy},${Tiles}`; + PathMap.set(index, path.slice(1)); + } + if (Finalindex) + PathMap.set(Finalindex, newPath.slice(0)); +} diff --git a/Game/src/enemy/KinkyDungeonPersonality.ts b/Game/src/enemy/KinkyDungeonPersonality.ts new file mode 100644 index 000000000..61d4cef0c --- /dev/null +++ b/Game/src/enemy/KinkyDungeonPersonality.ts @@ -0,0 +1,178 @@ +"use strict"; + +let KDJailPersonalities = { + "Robot": true, + "Dom": true, + "Sub": true, +}; + +let KDStrictPersonalities = [ + "Dom", +]; +let KDLoosePersonalities = [ + "Sub", +]; + +let KDEnemyPersonalities = { + "": {weight: 10, + loose: false, + strict: false, + brat: false, + domVariance: 0.4, + submissiveness: 0.25, + tags: { + "robot": -100, + "switch": 10, + "veryswitch": 100, + "nobrain": -100, + }, + }, + "Robot": {weight: -100, + loose: false, + strict: false, + brat: false, + submissiveness: 0.25, + tags: { + "robot": 200, + "cyborg": -200, + "nobrain": -100, + }, + }, + "NoBrain": {weight: -100, + loose: false, + strict: false, + brat: false, + submissiveness: 0.0, + tags: { + "nobrain": 200, + }, + }, + "Dom": {weight: 1, + loose: false, + strict: true, + brat: false, + submissiveness: 0, + tags: { + "minor": -3, + "alchemist": 2, + "elite": 3, + "boss": 3, + "robot": -100, + "cyborg": 100, + "submissive": -10, + "dom": 10, + "verydom": 100, + "nobrain": -100, + }, + }, + "Sub": {weight: 0, + loose: true, + strict: false, + brat: false, + submissiveness: 1.0, + tags: { + "minor": 3, + "human": 1, + "elite": -2, + "boss": -10, + "robot": -100, + "cyborg": 100, + "submissive": 10, + "sub": 10, + "verysub": 100, + "nobrain": -100, + }, + }, + "Brat": {weight: 0, + loose: true, + strict: false, + brat: true, + domMod: 0.7, + domVariance: 0.2, + submissiveness: 0.75, + tags: { + "minor": 3, + "brat": 10, + "verybrat": 100, + "human": 1, + "boss": -3, + "robot": -100, + "nobrain": -100, + "cyborg": 100, + "submissive": 1, + }, + }, +}; + +/** + * Do NOT call this during UI loop, as can lead to desyncs in future w/ replay system or possible netcode + * @param enemy + */ +function KDGetPersonality(enemy: entity): string { + if (!enemy.Enemy) return undefined; + if (enemy.personality) return enemy.personality; + let WeightTotal = 0; + let Weights = []; + + for (let p of Object.entries(KDEnemyPersonalities)) { + let weight = p[1].weight; + Weights.push({p: p[0], weight: WeightTotal}); + if (p[1].tags) + for (let tag of Object.entries(p[1].tags)) { + if (enemy.Enemy.tags[tag[0]]) weight += tag[1]; + } + WeightTotal += Math.max(weight, 0); + } + + let selection = KDRandom() * WeightTotal; + + for (let L = Weights.length - 1; L >= 0; L--) { + if (selection > Weights[L].weight) { + if (Weights[L].p != undefined) { + return Weights[L].p; + } + return ""; + } + } + + return ""; +} + + +/** + * @param Enemy + */ +function KDGetPersonalityType(Enemy: enemy): string { + let WeightTotal = 0; + let Weights = []; + + for (let p of Object.entries(KDEnemyPersonalities)) { + let weight = p[1].weight; + Weights.push({p: p[0], weight: WeightTotal}); + if (p[1].tags) + for (let tag of Object.entries(p[1].tags)) { + if (Enemy.tags[tag[0]]) weight += tag[1]; + } + WeightTotal += Math.max(weight, 0); + } + + let selection = KDRandom() * WeightTotal; + + for (let L = Weights.length - 1; L >= 0; L--) { + if (selection > Weights[L].weight) { + if (Weights[L].p != undefined) { + return Weights[L].p; + } + return ""; + } + } + + return ""; +} + +/** + * @param enemy + */ +function KDJailPersonality(enemy: entity): string { + return (enemy.personality && KDJailPersonalities[enemy.personality]) ? enemy.personality : ""; +} diff --git a/Game/src/enemy/KinkyDungeonSpawns.ts b/Game/src/enemy/KinkyDungeonSpawns.ts new file mode 100644 index 000000000..e812a431b --- /dev/null +++ b/Game/src/enemy/KinkyDungeonSpawns.ts @@ -0,0 +1,560 @@ +"use strict"; + + + +function KinkyDungeonAddTags(tags: string[], Floor: number) { + let security = (KDGetEffSecurityLevel() + 50); + + + + if (Floor % KDLevelsPerCheckpoint >= 2 || Floor % KDLevelsPerCheckpoint == 0 || KinkyDungeonDifficulty >= 20) tags.push("secondhalf"); + if (Floor % KDLevelsPerCheckpoint >= 3 || Floor % KDLevelsPerCheckpoint == 0 || KinkyDungeonDifficulty >= 40) tags.push("lastthird"); + + let angeredGoddesses = []; + let pleasedGoddessess = []; + + if (KinkyDungeonGoddessRep.Rope < KDANGER) angeredGoddesses.push({tag: "ropeAnger", type: "rope"}); + if (KinkyDungeonGoddessRep.Rope < KDRAGE) angeredGoddesses.push({tag: "ropeRage", type: "rope"}); + if (KinkyDungeonGoddessRep.Leather < KDANGER) angeredGoddesses.push({tag: "leatherAnger", type: "leather"}); + if (KinkyDungeonGoddessRep.Leather < KDRAGE) angeredGoddesses.push({tag: "leatherRage", type: "leather"}); + if (KinkyDungeonGoddessRep.Metal < KDANGER) angeredGoddesses.push({tag: "metalAnger", type: "metal"}); + if (KinkyDungeonGoddessRep.Metal < KDRAGE) angeredGoddesses.push({tag: "metalRage", type: "metal"}); + if (KinkyDungeonGoddessRep.Latex < KDANGER) angeredGoddesses.push({tag: "latexAnger", type: "latex"}); + if (KinkyDungeonGoddessRep.Latex < KDRAGE) angeredGoddesses.push({tag: "latexRage", type: "latex"}); + if (KinkyDungeonGoddessRep.Elements < KDANGER) angeredGoddesses.push({tag: "elementsAnger", type: "elements"}); + if (KinkyDungeonGoddessRep.Elements < KDRAGE) angeredGoddesses.push({tag: "elementsRage", type: "elements"}); + if (KinkyDungeonGoddessRep.Conjure < KDANGER) angeredGoddesses.push({tag: "conjureAnger", type: "conjure"}); + if (KinkyDungeonGoddessRep.Conjure < KDRAGE) angeredGoddesses.push({tag: "conjureRage", type: "conjure"}); + if (KinkyDungeonGoddessRep.Illusion < KDANGER) angeredGoddesses.push({tag: "illusionAnger", type: "illusion"}); + if (KinkyDungeonGoddessRep.Illusion < KDRAGE) angeredGoddesses.push({tag: "illusionRage", type: "illusion"}); + if (KinkyDungeonGoddessRep.Will < KDANGER) angeredGoddesses.push({tag: "willAnger", type: "will"}); + if (KinkyDungeonGoddessRep.Will < KDRAGE) angeredGoddesses.push({tag: "willRage", type: "will"}); + + if (KinkyDungeonGoddessRep.Rope > KDPLEASED) pleasedGoddessess.push({tag: "ropePleased", type: "rope"}); + if (KinkyDungeonGoddessRep.Rope > KDFRIENDLY) pleasedGoddessess.push({tag: "ropeFriendly", type: "rope"}); + if (KinkyDungeonGoddessRep.Leather > KDPLEASED) pleasedGoddessess.push({tag: "leatherPleased", type: "leather"}); + if (KinkyDungeonGoddessRep.Leather > KDFRIENDLY) pleasedGoddessess.push({tag: "leatherFriendly", type: "leather"}); + if (KinkyDungeonGoddessRep.Metal > KDPLEASED) pleasedGoddessess.push({tag: "metalPleased", type: "metal"}); + if (KinkyDungeonGoddessRep.Metal > KDFRIENDLY) pleasedGoddessess.push({tag: "metalFriendly", type: "metal"}); + if (KinkyDungeonGoddessRep.Latex > KDPLEASED) pleasedGoddessess.push({tag: "latexPleased", type: "latex"}); + if (KinkyDungeonGoddessRep.Latex > KDFRIENDLY) pleasedGoddessess.push({tag: "latexFriendly", type: "latex"}); + if (KinkyDungeonGoddessRep.Elements > KDPLEASED) pleasedGoddessess.push({tag: "elementsPleased", type: "elements"}); + if (KinkyDungeonGoddessRep.Elements > KDFRIENDLY) pleasedGoddessess.push({tag: "elementsFriendly", type: "elements"}); + if (KinkyDungeonGoddessRep.Conjure > KDPLEASED) pleasedGoddessess.push({tag: "conjurePleased", type: "conjure"}); + if (KinkyDungeonGoddessRep.Conjure > KDFRIENDLY) pleasedGoddessess.push({tag: "conjureFriendly", type: "conjure"}); + if (KinkyDungeonGoddessRep.Illusion > KDPLEASED) pleasedGoddessess.push({tag: "illusionPleased", type: "illusion"}); + if (KinkyDungeonGoddessRep.Illusion > KDFRIENDLY) pleasedGoddessess.push({tag: "illusionFriendly", type: "illusion"}); + if (KinkyDungeonGoddessRep.Will > KDPLEASED) pleasedGoddessess.push({tag: "willPleased", type: "will"}); + if (KinkyDungeonGoddessRep.Will > KDFRIENDLY) pleasedGoddessess.push({tag: "willFriendly", type: "will"}); + + for (let pair of KDFactionRelations.get("Player").entries()) { + if (pair[1] > 0.5) { + tags.push(pair[0] + "Friendly"); + } else if (pair[1] < -0.5) { + tags.push(pair[0] + "Enemy"); + } + if (pair[1] > 0.75) { + tags.push(pair[0] + "Allied"); + } else if (pair[1] < -0.75) { + tags.push(pair[0] + "Wanted"); + } + if (pair[1] > 0.9) { + tags.push(pair[0] + "Loved"); + } else if (pair[1] < -0.9) { + tags.push(pair[0] + "Hated"); + } + } + + if (angeredGoddesses.length > 0) { + let rage = false; + for (let a of angeredGoddesses) { + if (!rage && a.tag && a.tag.includes("Rage")) { + rage = true; + tags.push("goddessRage"); + break; + } + } + for (let i = 0; i < 2; i++) { + let tag = angeredGoddesses[Math.floor(angeredGoddesses.length * KDRandom())]; + if (tag && !tags.includes(tag.tag)) { + for (let a of angeredGoddesses) { + if (a.type == tag.type) { + tags.push(a.tag); + } + } + } + } + tags.push("goddessAnger"); + } + if (pleasedGoddessess.length > 0) { + let rage = false; + for (let a of pleasedGoddessess) { + if (!rage && a.tag && a.tag.includes("Friend")) { + rage = true; + tags.push("goddessFriendly"); + break; + } + } + for (let i = 0; i < 2; i++) { + let tag = pleasedGoddessess[Math.floor(pleasedGoddessess.length * KDRandom())]; + if (tag && !tags.includes(tag.tag)) { + for (let a of pleasedGoddessess) { + if (a.type == tag.type) { + tags.push(a.tag); + } + } + } + } + tags.push("goddessPleased"); + + } + + + // let overrideTags = []; + if (KinkyDungeonGoddessRep.Will < -45) {tags.push("plant"); tags.push("beast");} + if (KinkyDungeonGoddessRep.Metal < -45) tags.push("robot"); + if (KinkyDungeonGoddessRep.Leather < -45) tags.push("bandit"); + if (KinkyDungeonGoddessRep.Illusion < -45) tags.push("ghost"); + if (KinkyDungeonGoddessRep.Conjure < -45) tags.push("witch"); + if (KinkyDungeonGoddessRep.Conjure < -45) tags.push("book"); + if (KinkyDungeonGoddessRep.Elements < -45) tags.push("elemental"); + if (KinkyDungeonGoddessRep.Latex < -45) tags.push("slime"); + if (KinkyDungeonGoddessRep.Rope < -45) tags.push("construct"); + + if (KinkyDungeonGoddessRep.Will >= 0) {tags.push("posWill");} + if (KinkyDungeonGoddessRep.Metal >= 0) tags.push("posMetal"); + if (KinkyDungeonGoddessRep.Leather >= 0) tags.push("posLeather"); + if (KinkyDungeonGoddessRep.Illusion >= 0) tags.push("posIllusion"); + if (KinkyDungeonGoddessRep.Conjure >= 0) tags.push("posConjure"); + if (KinkyDungeonGoddessRep.Elements >= 0) tags.push("posElements"); + if (KinkyDungeonGoddessRep.Latex >= 0) tags.push("posLatex"); + if (KinkyDungeonGoddessRep.Rope >= 0) tags.push("posRope"); + + if (security > 0) tags.push("jailbreak"); + if (security > 40) tags.push("highsecurity"); + + let data = { + tags: tags, + }; + KinkyDungeonSendEvent("calcEnemyTags", data); +} + +let KDPerkToggleTags = [ + "NoNurse", + "NoPolice", +]; + +/** + * + * @param {string[]} enemytags + * @param {number} Level + * @param {string} Index + * @param {string} Tile + * @param {string[]} [requireTags] + * @param {{requireHostile?: string, requireAllied?: string, requireNonHostile?: string}} [alliances] + * @param {Record} [bonusTags] + * @param {string[]} [filterTags] + * @param {string[]} [requireSingleTag] + * @param {number} minWeight - Cut off weights below this one + * @param {boolean} minWeightFallback - Fallback to 0 minweight + * @param {boolean} noOverrideFloor - Fallback to 0 minweight + * @returns {enemy} + */ +function KinkyDungeonGetEnemy ( + enemytags: string[], + Level: number, + Index: string, + Tile: string, + requireTags?: string[], + alliances?: {requireHostile?: string, requireAllied?: string, requireNonHostile?: string}, + bonusTags?: Record, + filterTags?: string[], + requireSingleTag?: string[], + minWeight: number = 0.0, + minWeightFallback: boolean = true, + noOverrideFloor: boolean = false +): enemy +{ + let enemyWeightTotal = 0; + let enemyWeights = []; + let tags = Object.assign([], enemytags); + for (let t of KDPerkToggleTags) { + if (KinkyDungeonStatsChoice.get(t)) { + tags.push(t); + } + } + + for (let enemy of KinkyDungeonEnemies) { + let effLevel = Level + 25 * KinkyDungeonNewGame; + let weightMulti = 1.0; + let weightBonus = 0; + + if (!KinkyDungeonStatsChoice.get("arousalMode") && enemy.arousalMode) weightMulti = 0; + + if (enemy.shrines) { + for (let shrine of enemy.shrines) { + if (KinkyDungeonGoddessRep[shrine]) { + let rep = KinkyDungeonGoddessRep[shrine]; + if (rep > 0) weightMulti *= Math.max(0, 1 - rep/100); // ranges from 1 to 0.5 + else if (rep < 0) { + weightMulti = Math.max(weightMulti, Math.max(1, 1 - rep/100)); // ranges from 1 to 2 + weightBonus = Math.max(weightBonus, Math.min(10, -rep/10)); + //effLevel += -rep/2.5; + } + } + } + } + + let noOverride = ["boss", "miniboss", "elite", "minor"]; + let overrideFloor = false; + for (let t of tags) { + if (!noOverrideFloor && !enemy.noOverrideFloor && !noOverride.includes(t)) { + // We don't override the floor just for having the seniority tags specified + if (enemy.tags[t]) { + overrideFloor = true; + weightMulti *= 1.25; + } + } else if (noOverride.includes(t)) { + // We DO override if the enemy has outOfBoxWeightMult, otherwise we apply a penalty. + if (enemy.outOfBoxWeightMult) { + weightMulti *= 1.25; + } else { + weightMulti *= 0.1; + } + } + } + if (bonusTags) + for (let t of Object.entries(bonusTags)) { + if (enemy.tags[t[0]]) { + weightBonus += t[1].bonus; + weightMulti *= t[1].mult; + } + } + + if (effLevel >= enemy.minLevel && (!enemy.maxLevel || effLevel < enemy.maxLevel) + && (!filterTags || !filterTags.some((tag) => {return enemy.tags[tag];})) + && (!alliances?.requireHostile || (alliances?.requireHostile == "Player" && !enemy.faction) || (enemy.faction && KDFactionRelation(alliances?.requireHostile, enemy.faction) <= -0.5)) + && (!alliances?.requireAllied || (alliances?.requireAllied == "Player" && !enemy.faction) || (enemy.faction && KDFactionRelation(alliances?.requireAllied, enemy.faction) > 0.2)) + && (!alliances?.requireNonHostile || (alliances?.requireNonHostile == "Player" && !enemy.faction) || (enemy.faction && KDFactionRelation(alliances?.requireNonHostile, enemy.faction) > -0.49)) + && (overrideFloor || enemy.allFloors || !enemy.floors || enemy.floors[Index]) + && (KinkyDungeonGroundTiles.includes(Tile) || !enemy.tags.spawnFloorsOnly)) { + let rt = true; + let rst = false; + if (requireTags) + for (let t of requireTags) { + if (!enemy.tags[t]) {rt = false; break;} + } + if (requireSingleTag) + for (let t of requireSingleTag) { + if (enemy.tags[t]) {rst = true; break;} + } + else rst = true; + if (rt && rst) { + enemyWeights.push({enemy: enemy, weight: enemyWeightTotal}); + let weight = enemy.weight + weightBonus; + if (enemy.terrainTags.increasingWeight) + weight += enemy.terrainTags.increasingWeight * Math.floor(Level/KDLevelsPerCheckpoint); + if (!enemy.terrainTags.grate && tags.includes("grate")) + weight -= 1000; + for (let tag of tags) + if (enemy.terrainTags[tag]) weight += enemy.terrainTags[tag]; + + if (enemy.weightMult) weightMulti *= enemy.weightMult; + if (weight > minWeight) + enemyWeightTotal += Math.max(0, weight*weightMulti); + } + } + } + + let selection = KDRandom() * enemyWeightTotal; + + for (let L = enemyWeights.length - 1; L >= 0; L--) { + if (selection > enemyWeights[L].weight) { + if (enemyWeights[L].enemy.name == "Mimic") console.log("Mimic says boo"); + return enemyWeights[L].enemy; + } + } + + // Mild recursion + if (minWeight > 0 && minWeightFallback) return KinkyDungeonGetEnemy(enemytags, Level, Index, Tile, requireTags, alliances, bonusTags, filterTags, requireSingleTag, 0, false); + return undefined; +} + +function KDEntityCanBeGuard(en: entity, faction: string, requireTags: string[]): boolean { + if (KDGetFaction(en) == faction) { + return !en.hostile && !KDIsImprisoned(en) && KDBoundEffects(en) <= 2 + && !en.action + && !KDEntityHasFlag(en, "overrideMove") + && !KinkyDungeonIsDisabled(en) + && en.Enemy?.tags && requireTags.every((tag) => {return !!en.Enemy.tags[tag];}); + } + return false; +} + +/** + * @param x + * @param y + * @param noTransgress + * @param normalDrops + * @param [requireTags] + */ +function KinkyDungeonCallGuard(x: number, y: number, _noTransgress: boolean, normalDrops: boolean, requireTags?: string[]): entity { + //if (!noTransgress) + // KinkyDungeonAggroAction('call', {}); + let point = KinkyDungeonGetNearbyPoint(x, y, true, undefined, true, true); + if (!point) point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + + if (!KinkyDungeonJailGuard()) { + let mainFaction = KDGetMainFaction(); + + let entities = KDNearbyEnemies(x, y, 20).filter((en) => { + return KDEntityCanBeGuard(en, mainFaction, requireTags || ["jail"]); + }); + if (entities.length == 0) { + entities = KDMapData.Entities.filter((en) => {return KDEntityCanBeGuard(en, mainFaction, requireTags || ["jail"]);}); + } + if (entities.length > 0) { + let en = entities[Math.floor(KDRandom() * entities.length)]; + KDGameData.JailGuard = en.id; + en.gx = point.x; + en.gy = point.y; + } + } + if (!KinkyDungeonJailGuard()) { + // Jail tag + let mainFaction = KDGetMainFaction(); + + let jt = KDMapData.GuardFaction?.length > 0 ? KinkyDungeonFactionTag[KDMapData.GuardFaction[Math.floor(KDRandom() * KDMapData.GuardFaction.length)]] : "guardCall"; + + let Enemy = KinkyDungeonGetEnemy(["Guard", jt], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', requireTags ? requireTags : [jt, "jail"], {requireHostile: "Player"}, undefined, ["gagged"]); + if (!Enemy) { + Enemy = KinkyDungeonGetEnemy(["Guard", jt], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', [jt, "jail"], undefined, undefined, ["gagged"]); + if (!Enemy) { + jt = "guardCall"; + Enemy = KinkyDungeonGetEnemy(["Guard", jt], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', [jt, "jail"], undefined); + } + } + let guard: entity = {summoned: true, temporary: true, noDrop: !normalDrops, Enemy: Enemy, id: KinkyDungeonGetEnemyID(), + x:KDMapData.StartPosition.x, y:KDMapData.StartPosition.y, gx: point.x, gy: point.y, + hp: (Enemy && Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0}; + + if (mainFaction) guard.faction = mainFaction; + if (mainFaction == "Player") guard.faction = "Enemy"; + KinkyDungeonSetEnemyFlag(guard, "norep", -1); + KDGameData.JailGuard = guard.id; + guard = KDAddEntity(guard); + return guard; + } else { + KinkyDungeonJailGuard().gx = point.x; + KinkyDungeonJailGuard().gy = point.y; + KinkyDungeonJailGuard().gxx = point.x; + KinkyDungeonJailGuard().gyy = point.y; + if (KinkyDungeonFindPath(KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, false, true, KinkyDungeonMovableTilesSmartEnemy)?.length < 15) { + let p = KinkyDungeonGetRandomEnemyPoint(true, true, undefined, 20, 10); + if (p) { + KinkyDungeonJailGuard().x = p.x; + KinkyDungeonJailGuard().y = p.y; + KinkyDungeonJailGuard().path = undefined; + } else { + let p = KinkyDungeonGetRandomEnemyPoint(true, true, undefined, 20, 5); + if (p) { + KinkyDungeonJailGuard().x = p.x; + KinkyDungeonJailGuard().y = p.y; + KinkyDungeonJailGuard().path = undefined; + } + } + } + return KinkyDungeonJailGuard(); + } + } + return null; +} + +let KinkyDungeonTotalSleepTurns = 0; +let KinkyDungeonSearchTimer = 0; +let KinkyDungeonSearchTimerMin = 60; +let KinkyDungeonFirstSpawn = false; +let KinkyDungeonSearchStartAmount = 30; +let KinkyDungeonSearchHuntersAmount = 90; +let KinkyDungeonSearchEntranceAdjustAmount = 130; +let KinkyDungeonSearchEntranceChaseAmount = 160; + +function KinkyDungeonHandleWanderingSpawns(delta: number) { + if (KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel) && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel).spawns) return; + if (KDGameData.RoomType && KinkyDungeonAltFloor(KDGameData.RoomType) && !KinkyDungeonAltFloor(KDGameData.RoomType).spawns) return; + let effLevel = MiniGameKinkyDungeonLevel + KinkyDungeonDifficulty; + let HunterAdjust = KinkyDungeonDifficulty; + let EntranceAdjust = KinkyDungeonDifficulty/2; + let BaseAdjust = KinkyDungeonDifficulty/10; + if (KinkyDungeonStatsChoice.get("SearchParty")) { + BaseAdjust *= 1.2; + BaseAdjust += KinkyDungeonSearchStartAmount; + HunterAdjust += KinkyDungeonSearchHuntersAmount - 50; + EntranceAdjust += KinkyDungeonSearchEntranceAdjustAmount - 30; + effLevel += 12; + } + + let sleepTurnsSpeedMult = 100; + let sleepTurnsPerExtraSpawnLevel = 25; + let baseChance = ((KDGameData.SleepTurns > 0 && (KinkyDungeonStatStamina > KinkyDungeonStatStaminaMax - 10 * KinkyDungeonStatStaminaRegenSleep || KDGameData.SleepTurns < 11)) ? 0.05 : 0.0005) * Math.sqrt(Math.max(1, effLevel)) * (1 + KinkyDungeonTotalSleepTurns / sleepTurnsSpeedMult); + + let Queue = []; + if (KDMapData.RespawnQueue && KDMapData.RespawnQueue.length > 0) { + let firstEnemy = KDMapData.RespawnQueue[Math.floor(KDRandom() * KDMapData.RespawnQueue.length)]; + for (let e of KDMapData.RespawnQueue) { + if (KDFactionRelation(e.faction, firstEnemy.faction) >= 0.1) { + Queue.push(e); + } + } + } + if (Queue.length > 0) baseChance = 0.07 * Math.sqrt(Math.max(1, effLevel)); + // Chance of bothering with random spawns this turn + if (delta > 0 && KDRandom() < baseChance && KinkyDungeonSearchTimer > KinkyDungeonSearchTimerMin) { + let hunters = false; + let spawnLocation = KDMapData.StartPosition; + let spawnPlayerExclusionRadius = 11; + if ((KinkyDungeonTotalSleepTurns > KinkyDungeonSearchStartAmount - BaseAdjust || Queue.length > 0) && KDMapData.Entities.length < Math.min(100, (!KinkyDungeonAggressive()) ? (5 + effLevel/15) : (20 + effLevel/KDLevelsPerCheckpoint))) { + if (KinkyDungeonTotalSleepTurns > KinkyDungeonSearchHuntersAmount - HunterAdjust) hunters = true; + if (((KinkyDungeonTotalSleepTurns > KinkyDungeonSearchEntranceAdjustAmount - EntranceAdjust || Queue.length > 0) && KDistChebyshev(KinkyDungeonPlayerEntity.x - KDMapData.EndPosition.x, KinkyDungeonPlayerEntity.y - KDMapData.EndPosition.y) > spawnPlayerExclusionRadius && KDRandom() < 0.5) + || KDistChebyshev(KinkyDungeonPlayerEntity.x - KDMapData.StartPosition.x, KinkyDungeonPlayerEntity.y - KDMapData.StartPosition.y) < spawnPlayerExclusionRadius) spawnLocation = KDMapData.EndPosition; + + if (KinkyDungeonVisionGet(spawnLocation.x, spawnLocation.y) < 1 || KinkyDungeonSeeAll) { + KinkyDungeonSearchTimer = 0; + let count = 0; + let maxCount = (2 + Math.min(5, Math.round(MiniGameKinkyDungeonLevel/10))) * Math.sqrt(1 + KinkyDungeonTotalSleepTurns / sleepTurnsSpeedMult); + if (KinkyDungeonStatsChoice.get("SearchParty")) { + maxCount *= 2; + } + // Spawn a killsquad! + let tags = []; + KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); + tags.push("boss"); + + let filtertags = ["noreinforce"]; + + let miniboss = false; + let requireTags = ["search"]; + if (hunters) { + requireTags = ["hunter"]; + tags.push("secondhalf"); + if (KinkyDungeonTotalSleepTurns > KinkyDungeonSearchEntranceChaseAmount) + tags.push("thirdhalf"); + } + + tags.push("bandit"); + + let qq = Queue.length > 0 ? Queue[Math.floor(KDRandom() * Queue.length)] : null; + + let Enemy = qq ? + KinkyDungeonGetEnemyByName(qq.enemy) + : KinkyDungeonGetEnemy( + tags, MiniGameKinkyDungeonLevel + KinkyDungeonDifficulty/5 + Math.round(KinkyDungeonTotalSleepTurns / sleepTurnsPerExtraSpawnLevel), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + KinkyDungeonMapGet(spawnLocation.x, spawnLocation.y), requireTags, {requireHostile: "Player"}, undefined, filtertags); + let EnemiesSummoned = []; + // We are going to reroll the ghost decision just to provide some grace for players who are well and truly stuck + KinkyDungeonMakeGhostDecision(); + while (Enemy && count < maxCount) { + let point = KinkyDungeonGetNearbyPoint(spawnLocation.x, spawnLocation.y, true); + if (point) { + let X = point.x; + let Y = point.y; + EnemiesSummoned.push(Enemy.name); + let e: entity = {tracking: true, summoned: true, faction: qq ? qq.faction : undefined, Enemy: Enemy, id: KinkyDungeonGetEnemyID(), x:X, y:Y, shield: Enemy.shield, hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0}; + e = KDAddEntity(e); + KinkyDungeonSetEnemyFlag(e, "NoFollow", -1); + let shop = KinkyDungeonGetShopForEnemy(e); + if (shop) { + KinkyDungeonSetEnemyFlag(e, "Shop", -1); + KinkyDungeonSetEnemyFlag(e, shop, -1); + KDSetShopMoney(e); + } + + if (Enemy.tags.minor) count += 0.1; else count += 1; // Minor enemies count as 1/10th of an enemy + if (Enemy.tags.boss) { + count += 3 * Math.max(1, 100/(100 + KinkyDungeonDifficulty)); + tags.push("boss"); + } // Boss enemies count as 4 normal enemies + else if (Enemy.tags.elite) count += Math.max(1, 1000/(2000 + 20*KinkyDungeonDifficulty + KinkyDungeonTotalSleepTurns)); // Elite enemies count as 1.5 normal enemies + if (Enemy.tags.miniboss) { + if (!miniboss) tags.push("boss"); + miniboss = true; // Adds miniboss as a tag + } + + let ii = KDMapData.RespawnQueue ? KDMapData.RespawnQueue.indexOf(qq) : -1; + if (ii >= 0) + KDMapData.RespawnQueue.splice(ii, 1); + Queue.splice(Queue.indexOf(qq), 1); + + if (Enemy.summon) { + for (let sum of Enemy.summon) { + if (!sum.chance || KDRandom() < sum.chance) + KinkyDungeonSummonEnemy(X, Y, sum.enemy, sum.count, sum.range, sum.strict); + } + } + } else count += 0.1; + + qq = Queue.length > 0 ? Queue[Math.floor(KDRandom() * Queue.length)] : null; + + Enemy = qq ? + KinkyDungeonGetEnemyByName(qq.enemy) + : KinkyDungeonGetEnemy(tags, MiniGameKinkyDungeonLevel + effLevel/KDLevelsPerCheckpoint, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), KinkyDungeonMapGet(spawnLocation.x, spawnLocation.y), requireTags); + } + if (EnemiesSummoned.length > 0 && KinkyDungeonFirstSpawn) { + KinkyDungeonFirstSpawn = false; + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonFirstSpawn"), "white", KDGameData.SleepTurns + 5); + } + if (KinkyDungeonTotalSleepTurns > KinkyDungeonSearchEntranceChaseAmount && !KinkyDungeonHuntDownPlayer && KDGameData.SleepTurns < 3) { + KinkyDungeonHuntDownPlayer = true; + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonHuntDownPlayer"), "#ff5277", KDGameData.SleepTurns + 10); + } + console.log(EnemiesSummoned); + } + } + // Only increment the timer when not in jail + } else if (!(KDGameData.PrisonerState == 'jail')) KinkyDungeonSearchTimer += delta; + + // Trigger when there is no hunter timer or is 0 + if (!(KDGameData.HunterTimer > 0)) { + // If undefined we set it so that it starts ticking down + if (KDGameData.HunterTimer == undefined) KDGameData.HunterTimer = HunterPulse; + else { + // If defined and 0 then we check if hunters are still alive, spawn if not, + if (!KDGameData.Hunters) KDGameData.Hunters = []; + let hunters = KDGameData.Hunters.map((id) => {return KinkyDungeonFindID(id);}); + + let spawnLocation = {x: KDMapData.StartPosition.x, y: KDMapData.StartPosition.y}; + + if (hunters.length > 0 || KDistChebyshev(spawnLocation.x - KinkyDungeonPlayerEntity.x, spawnLocation.y - KinkyDungeonPlayerEntity.y) < 10) { + // Hunters still exist, or player is too close, simple pulse + KDGameData.HunterTimer = Math.max(KDGameData.HunterTimer, HunterPulse); + } else { + // Hunters are dead, we spawn more + let eToSpawn: entity[] = []; + KDGameData.Hunters = []; + + // Determine enemies to spawn + + // Spawn them + for (let e of eToSpawn) { + let point = KinkyDungeonGetNearbyPoint(spawnLocation.x, spawnLocation.y, true); + if (point) { + e.x = point.x; + e.y = point.y; + e = KDAddEntity(e); + KDGameData.Hunters.push(e.id); + } + } + } + + } + } + // Decrement the hunter timer + if (KDGameData.HunterTimer > 0) KDGameData.HunterTimer = Math.max(0, KDGameData.HunterTimer - delta); +} + +/** The defauilt interval between hunter checks */ +let HunterPulse = 25; +/** Cooldown for hunter spawns */ +let HunterSpawnTimer = 120; diff --git a/Game/src/faction/KinkyDungeonFactions.ts b/Game/src/faction/KinkyDungeonFactions.ts new file mode 100644 index 000000000..260d9ee90 --- /dev/null +++ b/Game/src/faction/KinkyDungeonFactions.ts @@ -0,0 +1,190 @@ +"use strict"; + +/** + * Determines if the enemy (which can be hostile) is aggressive, i.e. will pursue the player or ignore + * @param [enemy] + * @param [player] + */ +function KinkyDungeonAggressive(enemy?: entity, player?: entity): boolean { + if (!player || player.player) { + // Player mode + if (enemy && enemy.hostile > 0) return true; + if (!KDGameData.PrisonerState || KDGameData.PrisonerState == "chase") return KDHostile(enemy); + if (enemy && KDFactionRelation(KDGetFaction(enemy), "Jail") < -0.4) return KDHostile(enemy); + if (enemy && KDFactionRelation(KDGetFaction(enemy), "Jail") < -0.1 + && KDGameData.PrisonerState != 'jail' + && (KDGameData.PrisonerState != 'parole' || !KinkyDungeonPlayerInCell(true, true))) + return KDHostile(enemy); + return false; + } + // Non player mode + return KDHostile(enemy, player); +} + +/** + * Returns whether or not the enemy is ALLIED, i.e it will follow the player + * @param enemy + * @returns {boolean} + */ +function KDAllied(enemy: entity): boolean { + return !(enemy.rage > 0) && !(enemy.hostile > 0) && KDFactionAllied("Player", enemy, undefined, + KDOpinionRepMod(enemy, KDPlayer())); +} + +/** + * Returns whether the enemy is HOSTILE to the player (if no optional argument) or the optional enemy + * @param enemy + * @param [enemy2] + */ +function KDHostile(enemy: entity, enemy2?: entity): boolean { + if (enemy == enemy2) return false; + return (enemy.rage > 0) || + ( + !(!enemy2 && enemy.ceasefire > 0) + && !(enemy2 && enemy2.ceasefire > 0) + && ( + ((!enemy2 + && (enemy.hostile > 0 + || KDFactionHostile("Player", enemy, KDOpinionRepMod(enemy, enemy2 || KDPlayer())) + )) + || (enemy2 && ((KDGetFaction(enemy2) == "Player" && enemy.hostile > 0))) + || (enemy2 && KDFactionHostile(KDGetFaction(enemy), enemy2, + KDOpinionRepMod(enemy, enemy2)))))); +} + +/** + * @param enemy + * @param player + * @returns The modifier to reputation based on the NPC's opinion + */ +function KDOpinionRepMod(enemy: entity, player: entity): number { + if (!player?.player) return 0; + let op = KDGetModifiedOpinionID(enemy.id, true, true, true, 0); + if (op) { + return 0.1 * Math.max(-3, Math.min(20, op/KDOpinionThreshold)); + } + return 0; +} + +/** + * @param value + */ +function KDIsServant(value: KDCollectionEntry): boolean { + return value && value.status == "Servant"; +} + +/** + * Gets the faction of the enemy, returning "Player" if its an ally, or "Enemy" if no faction + * @param enemy + */ +function KDGetFaction(enemy: entity): string { + if (!enemy) return undefined; + if (enemy.player) return "Player"; + if (enemy.rage > 0) return "Rage"; + if (enemy.faction) return enemy.faction; + if (KDGameData.Collection && KDIsServant(KDGameData.Collection[enemy.id + ""])) return "Player"; + let E = enemy.Enemy; + if ((E && E.allied) + || enemy.allied + || KDIsInParty(enemy)) + return "Player"; + if (E && E.faction) return E.faction; + return "Enemy"; +} + +/** + * Gets the faction of the enemy, returning "Player" if its an ally, or "Enemy" if no faction + * @param enemy + */ +function KDGetFactionOriginal(enemy: entity): string { + if (enemy.player) return "Player"; + if (enemy.faction) return enemy.faction; + if (KDGameData.Collection && KDIsServant(KDGameData.Collection[enemy.id + ""])) return "Player"; + let E = enemy.Enemy; + if (E && E.faction) return E.faction; + return "Enemy"; +} + +/** + * Consults the faction table and decides if the two mentioned factions are hostile + * @param a - Faction 1 + * @param b - Faction 2 + * @param [mod] - modifier to faction rep - constrained to positive + * @param [modfree] - modifier to faction rep - free + */ +function KDFactionHostile(a: string, b: string | entity, mod: number = 0, modfree: number = 0): boolean { + if (a == "Player" && b && !(typeof b === "string") && b.hostile > 0) return true; + if (!(typeof b === "string") && b.rage > 0) return true; + if (a == "Player" && !(typeof b === "string") && b.allied > 0) return false; + if (!(typeof b === "string")) b = KDGetFaction(b); + if (a == "Rage" || b == "Rage") return true; + if (a == "Player" && b == "Enemy") return true; + if (b == "Player" && a == "Enemy") return true; + if (KDFactionRelation(a, b) + Math.max(0, mod) + modfree <= -0.5) return true; + if (a == b) return false; + return false; +} + +/** + * Consults the faction table and decides if the two mentioned factions are allied + * @param a - Faction 1 + * @param b - Faction 2 + * @param [threshold] - Faction 2 + * @param [mod] + */ +function KDFactionAllied(a: string, b: string | entity, threshold: number = 0.7, _mod: number = 0): boolean { + if (a == "Player" && b && !(typeof b === "string") && b.hostile > 0) return false; + if (!(typeof b === "string") && b.rage > 0) return false; + if (a == "Player" && !(typeof b === "string") && b.allied > 0) return true; + if (!(typeof b === "string")) b = KDGetFaction(b); + if (a == "Rage" || b == "Rage") return false; + if (a == "Player" && b == "Player") return true; + if (b == "Enemy" && a == "Enemy") return true; + if (KDFactionRelation(a, !(typeof b === "string") ? KDGetFaction(b) : b) >= threshold) return true; + if (a == b) return true; + return false; +} + +/** + * Consults the faction table and decides if the two mentioned factions are favorable (i.e no friendly fire) + * @param a - Faction 1 + * @param b - Faction 2 + */ +function KDFactionFavorable(a: string, b: string | entity): boolean { + return KDFactionAllied(a, b, 0.099); +} + + +/** + * @param list + * @param Floor + * @param Checkpoint + * @param tags + * @param bonustags + * @param [X] + * @param [Y] + */ +function KDGetFactionProps(list: string[], Floor: number, Checkpoint: string, tags: string[], bonustags: Record, X: number = 0, Y: number = 0): Record { + let mp: Record = {}; + for (let faction of list) { + if (KDFactionProperties[faction]) { + mp[faction] = KDFactionProperties[faction].weight(Floor, Checkpoint, tags, bonustags, X, Y); + } + } + return mp; +} + +/** + * Gets the honor from faction a toward faction b + * @param a + * @param b + */ +function KDGetHonor(a: string, b: string): number { + if (KDFactionProperties[a]) { + if (KDFactionProperties[a].honor_specific[b]) { + return KDFactionProperties[a].honor_specific[b]; + } + return KDFactionProperties[a].honor; + } + return -1; +} diff --git a/Game/src/faction/KinkyDungeonFactionsList.ts b/Game/src/faction/KinkyDungeonFactionsList.ts new file mode 100644 index 000000000..19c0b8609 --- /dev/null +++ b/Game/src/faction/KinkyDungeonFactionsList.ts @@ -0,0 +1,1282 @@ +"use strict"; + +let KinkyDungeonFactionColors = { + "Jail": ["#8A120C"], + "Slime": ["#9B49BD", "#9B49BD"], + "Latex": ["#9B49BD", "#9B49BD"], + "Dressmaker": ["#6B48E0", "#F8BD01"], + "Alchemist": ["#4c6885", "#7bef41"], + "Elf": ["#4fd658", "#F8BD01"], + "Bountyhunter": ["#252525", "#bfbfbf"], + "AncientRobot": ["#444444", "#4fa4b8"], + "Dollsmith": ["#444444", "#b1062a", "#ff5277"], + "Mushy": ["#bfbfbf", "#92c1e8"], + "Apprentice": ["#686f99", "#ff5277"], + "Witch": ["#222222", "#8359b3"], +}; + +let KDFactionNoCollection = ["Ambush"]; + +let KinkyDungeonFactionFilters: Record> = { + "Jail": { + Catsuit: {"gamma":1.0166666666666666,"saturation":0,"contrast":0.8833333333333333,"brightness":1.5666666666666669,"red":4.216666666666667,"green":0.7166666666666667,"blue":0.7000000000000001,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0,"contrast":1.0833333333333335,"brightness":0.7666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0,"contrast":1.0,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Highlight: {"gamma":0.6833333333333333,"saturation":0,"contrast":2.55,"brightness":0.41666666666666663,"red":2.5333333333333337,"green":0.7666666666666666,"blue":0.8500000000000001,"alpha":1}, + }, + "Maidforce": { + Catsuit: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}, + LightNeutral: {"gamma":1.2,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.0980392156862746,"alpha":1}, + Highlight: {"gamma":1.9,"saturation":0,"contrast":1,"brightness":1.5666666666666669,"red":1,"green":1,"blue":1.1,"alpha":1}, + }, + "Bountyhunter": { + Catsuit: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0,"contrast":1.0833333333333335,"brightness":0.7666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0.0,"contrast":1.0,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Highlight: {"gamma":0.7333333333333334,"saturation":0,"contrast":2.3499999999999996,"brightness":0.8166666666666667,"red":1.7833333333333334,"green":0.9666666666666667,"blue":0.6,"alpha":1}, + }, + "Bandit": { + Catsuit: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0,"contrast":1.0833333333333335,"brightness":0.7666666666666666, + "red":1,"green":1,"blue":1,"alpha":1}, + LightNeutral: {"gamma":0.6333333333333334,"saturation":1,"contrast":0.6833333333333333,"brightness":0.6,"red":1.7999999999999998,"green":1.2333333333333334,"blue":1,"alpha":1}, + Highlight: {"gamma":0.6833333333333333,"saturation":0,"contrast":2.55,"brightness":0.41666666666666663,"red":2.5333333333333337,"green":0.7666666666666666,"blue":0.8500000000000001,"alpha":1}, + }, + "Warden": { + Catsuit: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0,"contrast":1.0833333333333335,"brightness":0.7666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0.0,"contrast":1.0,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Highlight: {"gamma":0.7333333333333334,"saturation":0,"contrast":2.3499999999999996,"brightness":0.8166666666666667,"red":1.7833333333333334,"green":0.9666666666666667,"blue":0.6,"alpha":1}, + }, + "Elemental2": { + Catsuit: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + DarkNeutral: {"gamma":0.6,"saturation":0,"contrast":1.2666666666666668,"brightness":0.44999999999999996,"red":1.5833333333333333,"green":0.43333333333333335,"blue":0.7000000000000001,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0,"contrast":1.0833333333333335,"brightness":1.0333333333333332,"red":1.2,"green":0.9333333333333333,"blue":0.4666666666666667,"alpha":1}, + Highlight: {"gamma":1,"saturation":0,"contrast":1,"brightness":1.6666666666666665,"red":1,"green":1,"blue":1,"alpha":1}, + }, + "Elemental": { + Catsuit: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0,"contrast":1.0833333333333335,"brightness":0.7666666666666666,"red":1.5833333333333333,"green":1,"blue":1,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0,"contrast":0.95,"brightness":1.35,"red":0.7833333333333334,"green":0.7833333333333334,"blue":0.8,"alpha":1}, + Highlight: {"gamma":1,"saturation":0,"contrast":1,"brightness":1.6500000000000001,"red":1.1166666666666667,"green":0.8833333333333333,"blue":0.6833333333333333,"alpha":1}, + }, + "Miku": { + Catsuit: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0.03333333333333333,"contrast":1.1333333333333333,"brightness":0.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0.016666666666666666,"contrast":0.8166666666666667,"brightness":0.7666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + Highlight: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":0.25,"green":1.3833333333333333,"blue":0.8,"alpha":1}, + }, + "Nevermere": { + Catsuit: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":0.8,"red":0.7833333333333334,"green":0.9166666666666666,"blue":0.95,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0.016666666666666666,"contrast":1,"brightness":1.25,"red":0.8833333333333333,"green":1,"blue":1.1500000000000001,"alpha":1}, + Highlight: {"gamma":1,"saturation":0,"contrast":1,"brightness":1.35,"red":0.8333333333333333,"green":1.3833333333333333,"blue":0.4,"alpha":1}, + }, + "Dressmaker": { + Catsuit: {"gamma":1,"saturation":0,"contrast":0.91,"brightness":1,"red":2.1372549019607843,"green":1.1764705882352942,"blue":3.1176470588235294,"alpha":1}, + DarkNeutral: {"gamma":0.8333333333333333,"saturation":0.1,"contrast":1.03,"brightness":1,"red":2.372549019607843,"green":1.7058823529411764,"blue":3.2941176470588234,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0,"contrast":1.83,"brightness":1,"red":5,"green":0.5686274509803921,"blue":1.8823529411764706,"alpha":1}, + Highlight: {"gamma":0.5333333333333333,"saturation":0,"contrast":2.05,"brightness":1.2833333333333332,"red":1,"green":1,"blue":1,"alpha":1}, + }, + "Dollsmith": { + Catsuit: {"gamma":1,"saturation":0,"contrast":0.8300000000000001,"brightness":1,"red":1.2549019607843137,"green":1,"blue":4,"alpha":1}, + // Tis inverted, light is dark and dark is light + LightNeutral: {"gamma":0.8,"saturation":0.1,"contrast":2.05,"brightness":0.5333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + Highlight: {"gamma":0.7833333333333334,"saturation":0,"contrast":2.8666666666666667,"brightness":1.1833333333333333,"red":2.4166666666666665,"green":0.6166666666666667,"blue":1.76,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0.0,"contrast":1.15,"brightness":0.7,"red":1.2166666666666665,"green":0.65,"blue":1.76,"alpha":1}, + }, + "Latex": { + Catsuit: {"gamma":1,"saturation":0,"contrast":0.9299999999999999,"brightness":1,"red":4.509803921568627,"green":0.8431372549019608,"blue":4.745098039215686,"alpha":1}, + DarkNeutral: {"gamma":0.8333333333333333,"saturation":0,"contrast":1.2,"brightness":1.2,"red":1,"green":1,"blue":1,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0,"contrast":0.9299999999999999,"brightness":1,"red":4.549019607843137,"green":1.0392156862745099,"blue":4.764705882352941,"alpha":1}, + Highlight: {"gamma":1,"saturation":0.11666666666666667,"contrast":1.3,"brightness":1.1166666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + }, + "Rubber": { + Catsuit: {"gamma":2.7666666666666666,"saturation":0,"contrast":0.8,"brightness":1.5,"red":0.6333333333333334,"green":1.1833333333333333,"blue":2.033333333333333,"alpha":1}, + DarkNeutral: {"gamma":1.3566666666666665,"saturation":0,"contrast":0.8,"brightness":1.5,"red":0.6333333333333334,"green":1.1833333333333333,"blue":2.033333333333333,"alpha":1}, + LightNeutral: {"gamma":1.6500000000000001,"saturation":1,"contrast":1,"brightness":1.2333333333333334,"red":0.44999999999999996,"green":1.3166666666666664,"blue":2.4,"alpha":1}, + Highlight: {"gamma":2.05,"saturation":0.016666666666666666,"contrast":0.8,"brightness":1.5,"red":0.8999999999999999,"green":1.1833333333333333,"blue":1.75,"alpha":1}, + }, + "Slime": { + Catsuit: {"gamma":1,"saturation":0,"contrast":0.9299999999999999,"brightness":1,"red":4.980392156862745,"green":0.6078431372549019,"blue":5,"alpha":1}, + DarkNeutral: {"gamma":0.8,"saturation":0.1,"contrast":0.8666666666666667,"brightness":1.4166666666666665,"red":2.05,"green":1,"blue":2.15,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0,"contrast":0.9299999999999999,"brightness":1,"red":4.549019607843137,"green":1.0392156862745099,"blue":4.764705882352941,"alpha":1}, + Highlight: {"gamma":0.8,"saturation":0,"contrast":0.8666666666666667,"brightness":1.4166666666666665,"red":2.05,"green":1,"blue":2.15,"alpha":1}, + }, + "Alchemist": { + Catsuit: {"gamma":1.7666666666666666,"saturation":0.016666666666666666,"contrast":0.6833333333333333,"brightness":1.9,"red":1,"green":1,"blue":1,"alpha":1}, + DarkNeutral: {"gamma":0.8333333333333333,"saturation":0,"contrast":0.9666666666666667,"brightness":0.6166666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0,"contrast":1.1833333333333333,"brightness":0.6666666666666666,"red":0.5294117647058824,"green":1.7450980392156863,"blue":3.9019607843137254,"alpha":1}, + //Catsuit: {"gamma":2.7666666666666666,"saturation":1.6833333333333333,"contrast":0.8,"brightness":1.5,"red":0.6333333333333334,"green":1.1833333333333333,"blue":2.033333333333333,"alpha":1}, + Highlight: {"gamma":0.65,"saturation":0.06666666666666667,"contrast":2.283333333333333,"brightness":1,"red":0.5833333333333334,"green":1.55,"blue":0.8166666666666667,"alpha":1}, + }, + "Apprentice": { + DarkNeutral: {"gamma":1,"saturation":0,"contrast":1.0833333333333335,"brightness":0.7666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + Catsuit: {"gamma":1,"saturation":0,"contrast":1.0499999999999998,"brightness":1,"red":2.019607843137255,"green":3.0980392156862746,"blue":4.137254901960785,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0,"contrast":1.1833333333333333,"brightness":0.6666666666666666,"red":0.5294117647058824,"green":1.1666666666666667,"blue":3.9019607843137254,"alpha":1}, + Highlight: {"gamma":1,"saturation":0,"contrast":1.0833333333333335,"brightness":1,"red":0.5294117647058824,"green":1.0784313725490196,"blue":1.0196078431372548,"alpha":1}, + }, + "Witch": { + Catsuit: {"gamma":1,"saturation":0,"contrast":1.0499999999999998,"brightness":1,"red":2.8823529411764706,"green":2.196078431372549,"blue":3.980392156862745,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0.1,"contrast":0.7,"brightness":1,"red":0.8823529411764706,"green":0.7058823529411765,"blue":0.8823529411764706,"alpha":1}, + LightNeutral: {"gamma":0.43333333333333335,"saturation":0,"contrast":2.3166666666666664,"brightness":0.9666666666666667,"red":0.6,"green":0.6833333333333333,"blue":1.5333333333333332,"alpha":1}, + Highlight: {"gamma":1,"saturation":0,"contrast":2.216666666666667,"brightness":1.35,"red":0.41666666666666663,"green":0.35000000000000003,"blue":0.8666666666666667,"alpha":1}, + }, + "Curse": { + Catsuit: {"gamma":1.8333333333333333,"saturation":0,"contrast":0.7833333333333334,"brightness":0.3833333333333333,"red":2.3000000000000003,"green":1,"blue":4.833333333333333,"alpha":1}, + DarkNeutral: {"gamma":0.6666666666666666,"saturation":0,"contrast":0.95,"brightness":1,"red":1.5098039215686274,"green":1.8431372549019607,"blue":3.7254901960784315,"alpha":1}, + LightNeutral: {"gamma":1.4666666666666668,"saturation":0,"contrast":2.3166666666666664,"brightness":0.9666666666666667,"red":0.6,"green":0.6833333333333333,"blue":1.5333333333333332,"alpha":1}, + Highlight: {"gamma":1,"saturation":0,"contrast":1.4833333333333334,"brightness":1.0833333333333335,"red":1.0666666666666667,"green":0.6666666666666666,"blue":0.8666666666666667,"alpha":1}, + }, + "AncientRobot": { + Catsuit: {"gamma":1.0166666666666666,"saturation":0,"contrast":0.8999999999999999,"brightness":1.4000000000000001,"red":0.7666666666666666,"green":1,"blue":4.833333333333333,"alpha":1}, + DarkNeutral: {"gamma":1.5,"saturation":0,"contrast":2.1166666666666667,"brightness":0.9833333333333333,"red":0.7666666666666667,"green":1,"blue":4.4166666666666665,"alpha":1}, + LightNeutral: {"gamma":0.7666666666666666,"saturation":0,"contrast":2.1166666666666667,"brightness":0.8833333333333333,"red":0.3666666666666667,"green":0.6666666666666666,"blue":2.4166666666666665,"alpha":1}, + Highlight: {"gamma":0.5333333333333333,"saturation":0,"contrast":2.6500000000000004,"brightness":0.95,"red":1.85,"green":0.633333333333334,"blue":0.7666666666666666,"alpha":1}, + }, + "Mushy": { + Catsuit: {"gamma":1.0166666666666666,"saturation":0,"contrast":0.8999999999999999,"brightness":1.4000000000000001,"red":1.7333333333333334,"green":2.5166666666666666,"blue":1.55,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0,"contrast":1,"brightness":0.6333333333333334,"red":1.3,"green":1,"blue":1.5333333333333332,"alpha":1}, + LightNeutral: {"gamma":1,"saturation":0,"contrast":1.0833333333333335,"brightness":1.4166666666666665,"red":0.55,"green":1.4666666666666668,"blue":1.2333333333333334,"alpha":1}, + Highlight: {"gamma":1,"saturation":0,"contrast":1.0833333333333335,"brightness":1.6833333333333333,"red":0.55,"green":1.9666666666666666,"blue":1.8333333333333333,"alpha":1}, + }, + "Bast": { + Catsuit: {"gamma":1.0166666666666666,"saturation":0,"contrast":0.8999999999999999,"brightness":1.4000000000000001,"red":4,"green":2.5166666666666666,"blue":1.55,"alpha":1}, + // DarkNeutral is much lighter than usual + DarkNeutral: {"gamma":1.3166666666666664,"saturation":0,"contrast":1.6500000000000001,"brightness":0.7333333333333333,"red":1.3666666666666667,"green":1.2333333333333334,"blue":1,"alpha":1}, + LightNeutral: {"gamma":1.3166666666666664,"saturation":0,"contrast":1.1833333333333333,"brightness":0.7333333333333333,"red":1.4166666666666665,"green":1.2333333333333334,"blue":1,"alpha":1}, + Highlight: {"gamma":1,"saturation":0,"contrast":1,"brightness":0.8,"red":1,"green":2.4,"blue":1,"alpha":1}, + }, + "Elf": { + Catsuit: {"gamma":1.0166666666666666,"saturation":0,"contrast":0.8999999999999999,"brightness":1.4000000000000001,"red":1.7333333333333334,"green":2.5166666666666666,"blue":1.55,"alpha":1}, + //Catsuit: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":2.4,"blue":1,"alpha":1}, + DarkNeutral: {"gamma":1.1500000000000001,"saturation":0,"contrast":1.5833333333333333,"brightness":0.7000000000000001,"red":1,"green":2.4,"blue":1.3,"alpha":1}, + LightNeutral: {"gamma":0.4666666666666667,"saturation":0,"contrast":1.1166666666666667,"brightness":0.5666666666666667,"red":1.0666666666666667,"green":1.6166666666666665,"blue":1.1833333333333333,"alpha":1}, + Highlight: {"gamma":0.8333333333333333,"saturation":0,"contrast":0.65,"brightness":1.1166666666666667,"red":1.3666666666666667,"green":1.2333333333333334,"blue":1,"alpha":1}, + }, + "Goddess": { + Catsuit: {"gamma":1,"saturation":0,"contrast":0.8666666666666667,"brightness":1.7666666666666666,"red":3.5166666666666666,"green":2.9333333333333336,"blue":1.6,"alpha":1}, + DarkNeutral: {"gamma":1,"saturation":0,"contrast":1.09,"brightness":0.6833333333333333,"red":1.4901960784313726,"green":1.5490196078431373,"blue":1.607843137254902,"alpha":1}, + LightNeutral: {"gamma":1.5333333333333332,"saturation":0.016666666666666666,"contrast":1.7833333333333334,"brightness":0.5333333333333333,"red":1.6666666666666665,"green":1.6166666666666665,"blue":1.6333333333333333,"alpha":1}, + Highlight: {"gamma":1,"saturation":0.016666666666666666,"contrast":1.5166666666666666,"brightness":0.5333333333333333,"red":2.9333333333333336,"green":2.166666666666667,"blue":1.6333333333333333,"alpha":1}, + }, +}; + +/** + */ +let KDFactionProperties: Record = { + Dressmaker: { + honor: -1, + jailBackupFaction: "Apprentice", + honor_specific: { + Witch: 1, + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 5; + if (tags.includes("dressmaker")) w += 40; + if (tags.includes("magical")) w += 5; + if (tags.includes("book")) w += 5; + if (tags.includes("manakin")) w += 15; + if (tags.includes("dollsmith")) w += 10; + return w; + }, + jailOutfit: "Bikini", + }, + Bountyhunter: { + nameList: ["bountyhunter"], + jailBackupFaction: "Maidforce", + honor: 1, + honor_specific: { + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 10; + if (tags.includes("bountyhunter")) w += 40; + if (tags.includes("ninja")) w += 20; + if (tags.includes("police")) w += 20; + if (tags.includes("human")) w += 5; + if (tags.includes("tech")) w += 5; + return w; + }, + jailOutfit: "LatexPrisoner", + }, + AncientRobot: { + honor: 0, + honor_specific: { + Dollsmith: -1, + }, + customDefeat: "DollStorage", + customHiSecDialogue: (enemy) => { + if (KDGetEnemyPlayLine(enemy).includes("Robot")) { + KinkyDungeonSendDialogue(enemy, TextGet("KDJailerHiSecDialogue" + KDGetEnemyPlayLine(enemy)), + KDGetColor(enemy), 8, 10, true); + KinkyDungeonSetFlag("LeashToPrison", -1); + if (enemy?.hostile) { + enemy.hostile = 300; + } + KinkyDungeonStartChase(undefined, "Jailbreak"); + } + else { + return "CyberHiSec"; + } + return ""; + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 0; + if (tags.includes("robot")) w += 100; + if (tags.includes("oldrobot")) w += 10; + if (tags.includes("electric")) w += 5; + if (tags.includes("estim")) w += 5; + if (tags.includes("metal")) w += 5; + if (tags.includes("factory")) w += 15; + if (tags.includes("industrial")) w += 15; + return w; + }, + jailOutfit: "CyberDoll", + }, + Elf: { + honor: 1, + honor_specific: { + Plant: 0, + Nature: 0, + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 0; + if (tags.includes("elf")) w += 50; + if (tags.includes("nature")) w += 40; + if (tags.includes("magical")) w += 20; + if (tags.includes("jungle")) w += 10; + return w; + }, + jailOutfit: "Elven", + }, + Bast: { + honor: 0, + honor_specific: { + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 0; + if (tags.includes("bast")) w += 100; + if (tags.includes("mummy")) w += 50; + if (tags.includes("egyptian")) w += 10; + return w; + }, + jailOutfit: "Bast", + }, + Maidforce: { + honor: 1, + jailBackupFaction: "Bountyhunter", + honor_specific: { + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 5; + if (tags.includes("maid")) w += 100; + if (tags.includes("slime")) w += 20; + if (tags.includes("urban")) w += 5; + if (tags.includes("library")) w += 20; + if (tags.includes("tech")) w += 5; + return w; + }, + jailOutfit: "Maid", + }, + Dragon: { + honor: 1, + jailBackupFaction: "Bountyhunter", + honor_specific: { + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 5; + if (tags.includes("dragon")) w += 40; + if (tags.includes("elemental")) w += 15; + if (tags.includes("magical")) w += 5; + if (tags.includes("adventurer")) w += 5; + if (tags.includes("crystalline")) w += 5; + return w; + }, + jailOutfit: "Dragon", + }, + Elemental: { + honor: -1, + jailBackupFaction: "Witch", + honor_specific: { + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 0; + if (tags.includes("elemental")) w += 40; + if (tags.includes("magical")) w += 20; + if (tags.includes("book")) w += 10; + if (tags.includes("library")) w += 10; + if (tags.includes("witch")) w += 20; + if (tags.includes("shadow")) w += 5; + if (tags.includes("angel")) w += 5; + return w; + }, + jailOutfit: "Obsidian", + }, + Apprentice: { + honor: 1, + jailBackupFaction: "Dragon", + honor_specific: { + Witch: 0, + Wizard: -1, + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 5; + if (tags.includes("apprentice")) w += 40; + if (tags.includes("witch")) w += 5; + if (tags.includes("library")) w += 20; + if (tags.includes("magical")) w += 20; + if (tags.includes("book")) w += 15; + return w; + }, + jailOutfit: "Lingerie", + }, + Witch: { + honor: 1, + jailBackupFaction: "Apprentice", + honor_specific: { + Apprentice: 0, + Wizard: -1, + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 5; + if (tags.includes("apprentice")) w += 10; + if (tags.includes("witch")) w += 35; + if (tags.includes("library")) w += 20; + if (tags.includes("magical")) w += 20; + if (tags.includes("book")) w += 15; + return w; + }, + jailOutfit: "Lingerie", + }, + Nevermere: { + honor: -1, + jailBackupFaction: "Dressmaker", + honor_specific: { + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 5; + if (tags.includes("nevermere")) w += 40; + if (tags.includes("metal")) w += 15; + if (tags.includes("crystalline")) w += 10; + if (tags.includes("wolfgirl")) w += 5; + if (tags.includes("tech")) w += 5; + return w; + }, + jailOutfit: "Wolfgirl", + }, + Alchemist: { + honor: 0, + jailBackupFaction: "Apprentice", + honor_specific: { + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 5; + if (tags.includes("alchemist")) w += 40; + if (tags.includes("latex")) w += 25; + if (tags.includes("tech")) w += 15; + if (tags.includes("slime")) w += 15; + if (tags.includes("library")) w += 20; + if (tags.includes("magical")) w += 5; + return w; + }, + jailOutfit: "BlueSuit", + }, + Bandit: { + honor: -1, + honor_specific: { + }, + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { + let w = 20; + if (tags.includes("bandit")) w += 40; + if (tags.includes("cavern")) w += 15; + if (tags.includes("jungle")) w += 5; + if (tags.includes("nature")) w += 5; + return w; + }, + jailOutfit: "Prisoner", + }, + + Virus: { + honor: 0, + honor_specific: { + AncientRobot: -1, + Dollsmith: 1, + }, + customDefeat: "DollStorage", + customHiSecDialogue: (enemy) => { + if (KDGetEnemyPlayLine(enemy).includes("Robot")) { + KinkyDungeonSendDialogue(enemy, TextGet("KDJailerHiSecDialogue" + KDGetEnemyPlayLine(enemy)), + KDGetColor(enemy), 8, 10, true); + KinkyDungeonSetFlag("LeashToPrison", -1); + if (enemy?.hostile) { + enemy.hostile = 300; + } + KinkyDungeonStartChase(undefined, "Jailbreak"); + } + else { + return "CyberHiSec"; + } + return ""; + }, + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { + return 0; + }, + jailAlliedFaction: "Dollsmith", + jailBackupFaction: "Dollsmith", + jailOutfit: "CyberDoll", + + }, + + Owners: { + customDefeat: "ElementalSlave", + jailAlliedFaction: "Elemental", + jailBackupFaction: "Witch", + honor: 1, + jailFaction: "Elemental", + honor_specific: { + }, + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { + return 0; + }, + jailOutfit: "Obsidian", + }, + WolfgirlHunters: { + customDefeat: "WolfgirlHunters", + jailAlliedFaction: "Nevermere", + jailBackupFaction: "Bandit", + jailFaction: "Bandit", + honor: 1, + honor_specific: { + }, + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { + return 0; + }, + jailOutfit: "Nevermere", + }, + Delinquent: { + customDefeat: "MaidSweeper", + jailAlliedFaction: "Maidforce", + jailBackupFaction: "Bountyhunter", + jailFaction: "Maidforce", + honor: 1, + honor_specific: { + }, + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { + return 0; + }, + jailOutfit: "Lingerie", + }, + RopeDojo: { + customDefeat: "RopeDojo", + jailAlliedFaction: "Apprentice", + jailBackupFaction: "Bountyhunter", + honor: 1, + honor_specific: { + }, + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { + return 0; + }, + jailOutfit: "Bikini", + }, + Adventurer: { + customDefeat: "Adventurer", + jailAlliedFaction: "Bountyhunter", + jailBackupFaction: "Dragonheart", + honor: 1, + honor_specific: { + }, + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { + return 0; + }, + jailOutfit: "Bikini", + }, + DollShoppe: { + customDefeat: "DollShoppe", + jailAlliedFaction: "Dressmaker", + jailBackupFaction: "Apprentice", + jailFaction: "Dressmaker", + honor: -1, + honor_specific: { + }, + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { + return 0; + }, + jailOutfit: "BindingDress", + }, +}; + +/** Hidden factions do not auto-rep change when you attack them */ +let KDHiddenFactions = [ + "Plant", + "Natural", + "Barrel", + "Door", + "Player", + "Enemy", + "Jail", + "Prisoner", + "Beast", + "DragonQueen", + "Slime", + "Latex", + "Mold", + "KinkyConstruct", + "Boss", + "Ambush", + "Rage", + "Ghost", + "Trap", + "Rebel", + "Rock", + "Delinquent", + "Virus", + "ShadowClan", + "Dollsmith", + "Warden", + "DollShoppe", + "RopeDojo", + "Fuuka", + "DubiousWitch", + "Extraplanar", + "Owners", + "Debate", + "Wolfhunter", + "Chase", + "Mushy", + "Witch", + "Curse", + "Observer", + "Door", + "Adventurer", +]; + +let KinkyDungeonHiddenFactions: Map = new Map(); +for (let f of KDHiddenFactions) { + KinkyDungeonHiddenFactions.set(f, true); +} + +function KinkyDungeonHiddenFactionsPush(str: any) { + KinkyDungeonHiddenFactions.set(str, true); +} + + + +let KDFactionSecurityMod = { + Dressmaker: { + level_magic: 1, + level_key: 1, + }, + Witch: { + level_magic: 1, + level_key: 1, + }, + Elemental: { + level_magic: 2, + }, + Mushy: { + level_magic: 1, + level_tech: 0, + }, + Apprentice: { + level_magic: 0, + level_key: -1, + }, + Elf: { + level_magic: 1, + level_key: 1, + }, + Bast: { + level_magic: 1, + }, + AncientRobot: { + level_tech: 2, + level_key: 1, + }, + Nevermere: { + level_tech: 1, + level_key: 1, + }, + Maidforce: { + level_tech: 0, + level_magic: -1, + level_key: 1, + }, + Alchemist: { + level_tech: 1, + level_magic: -1, + }, + Bountyhunter: { + level_tech: 0, + level_key: 2, + }, +}; + +let KDBaseSecurity = { + level_key: 0, +}; + +let KDPiousFactions = { + "Angel": 1.0, +}; + +/** Shows tooltips for these factions even though they are hidden */ +let KinkyDungeonTooltipFactions = [ + "Rebel", + "Ambush", + "Delinquent", + "DubiousWitch", + "Extraplanar", + "Owners", + "Virus", + "ShadowClan", + "DollShoppe", + "RopeDojo", + "Dollsmith", + "Warden", + "Fuuka", + "Debate", + "Wolfhunter", + "Rock", + "Rage", + "Curse", + "Observer", +]; + +/** Tag for these factions, these also can have increased chances to appear on a map */ +let KinkyDungeonFactionTag = { + Bountyhunter: "bountyhunter", + Bandit: "bandit", + Alchemist: "alchemist", + Nevermere: "nevermere", + Apprentice: "apprentice", + RopeDojo: "apprentice", + Dressmaker: "dressmaker", + DollShoppe: "dressmaker", + Witch: "witch", + Elemental: "elemental", + Owners: "elemental", + Dragon: "dragon", + Maidforce: "maid", + Delinquent: "maid", + Bast: "mummy", + Elf: "elf", + //Mushy: "mushy", + AncientRobot: "robot", + ShadowClan: "shadow", + Debate: "elf", + Wolfhunter: "nevermere", + Extraplanar: "demon", + DubiousWitch: "mage", + Virus: "robot", + Dollsmith: "dollsmith", + Warden: "warden", +}; +/** Tag for these factions, these also can have increased chances to appear on a map */ +let KinkyDungeonFactionJailTag = { + Bountyhunter: "bountyhunter", + Bandit: "bandit", + Alchemist: "alchemist", + Nevermere: "nevermere", + Apprentice: "apprentice", + RopeDojo: "apprentice", + Dressmaker: "dressmaker", + DollShoppe: "dressmaker", + Witch: "apprentice", + Elemental: "elemental", + Owners: "elemental", + Dragon: "dragon", + Maidforce: "maid", + Delinquent: "maid", + Bast: "mummy", + Elf: "elf", + //Mushy: "mushy", + AncientRobot: "robot", + ShadowClan: "shadow", + Debate: "elf", + Wolfhunter: "nevermere", + Extraplanar: "demon", + DubiousWitch: "mage", + Virus: "robot", + Dollsmith: "dollsmith", + Warden: "warden", +}; + +let KinkyDungeonFactionRelationsBase = { + "Player": { + Enemy: -1.0, + Jail: -1.0, + Chase: -1, + Prisoner: 0.1, + + // Wild factions + KinkyConstruct: -0.9, + Plant: -0.9, + Slime: -1.0, + Latex: -1.0, + Mold: -1.0, + Beast: -0.6, + DragonQueen: -1, + + // Mainline factions + Bountyhunter: -0.3, + Bandit: -0.7, + Alchemist: -0.2, + Nevermere: -0.1, + Apprentice: 0.2, + Dressmaker: -0.4, + Witch: -0.8, + Elemental: -0.6, + Dragon: 0.1, + Maidforce: -0.1, + Bast: -0.6, + Elf: -0.3, + Mushy: -0.6, + AncientRobot: -0.2, + + // Special factions + Angel: 0.1, + Demon: -0.25, + }, + "Angel": { + Demon: -1.0, + Ghost: -0.7, + Elemental: 0.15, + Dragon: 0.05, + AncientRobot: -0.25, + Nevermere: -0.1, + Enemy: 0.1, + }, + "Natural": { + Player: -1, + Jail: -1, + Chase: -1, + }, + "Barrel": { + Jail: -1, + Chase: -1, + }, + "Door": { + Player: -1, + Jail: -1, + Chase: -1, + }, + "Ghost": { + Player: -1.0, + Jail: -0.25, + Chase: -1, + }, + "Observer": { + Player: -1.0, + Jail: -1, + Chase: -1, + }, + "Rock": { + Player: -1.0, + Jail: -0.1, + Chase: -1, + }, + "Rebel": { + Jail: -0.1, + Chase: -1, + }, + "Adventurer": { + Jail: -0.1, + Chase: -1, + }, + "Demon": { + Elf: -1.0, + Bast: -1.0, + Witch: 0.25, + Jail: -0.25, + Chase: -1, + + Bountyhunter: -0.5, + Bandit: -0.5, + Alchemist: -0.5, + Nevermere: -0.5, + Apprentice: -0.5, + Dressmaker: -0.5, + Elemental: -0.1, + Dragon: -1.0, + Maidforce: -0.5, + Mushy: -0.5, + AncientRobot: -0.45, + }, + "Enemy": { + KinkyConstruct: .1, + Dragon: .1, + Bountyhunter: .1, + Bandit: .1, + Alchemist: .1, + Nevermere: .1, + Apprentice: .1, + Dressmaker: .1, + Witch: .1, + Elemental: .1, + Maidforce: .1, + Bast: .1, + Elf: .1, + Mushy: .1, + AncientRobot: .1, + }, + dollsmith: {}, // Dummy to help peoples old saves + "Dollsmith": { + KinkyConstruct: .1, + Dragon: -0.5, + Bountyhunter: .1, + Bandit: .1, + Alchemist: .1, + Nevermere: 0.3, + Apprentice: .1, + Dressmaker: .1, + Witch: .1, + Elemental: -0.1, + Maidforce: -0.2, + Bast: -0.1, + Elf: -0.1, + Mushy: -0.1, + AncientRobot: -0.3, + + Player: -1, + }, + "Warden": { + KinkyConstruct: .1, + AncientRobot: -0.3, + + Player: -1, + Jail: 0.5, + }, + "Virus": { + Player: -1, + Chase: -1, + Jail: -0.25, + }, + "DubiousWitch": { + Player: -1, + Witch: 1, + Chase: -1, + Jail: -0.25, + }, + "Extraplanar": { + Player: -1, + Demon: 1, + Chase: -1, + Jail: -0.25, + }, + "Owners": { + Player: -1, + Demon: -1, + Elemental: 0.6, + Chase: -1, + Jail: -0.25, + }, + "Delinquent": { + Player: -1, + Maidforce: -1, + Chase: -1, + Jail: -0.25, + }, + "ShadowClan": { + Player: -1, + Demon: 1, + Angel: -1, + Chase: -1, + Jail: -0.25, + }, + "Fuuka": { + Player: -1, + Chase: -1, + Jail: -0.25, + }, + "RopeDojo": { + Player: -1, + Chase: -1, + Jail: -0.25, + }, + "DollShoppe": { + Player: -1, + Chase: -1, + Dressmaker: 0.5, + Jail: -0.25, + }, + "Debate": { + Player: 0, + Chase: -1, + Jail: -0.25, + }, + "Wolfhunter": { + Player: -1, + Nevermere: -1, + Chase: -1, + Jail: -0.25, + }, + "Trap": { + Enemy: -1.0, + Jail: -1.0, + Prisoner: 1, + Ambush: 1, + Boss: -1, + + // Wild factions + KinkyConstruct: -1, + Plant: -1, + Slime: -1, + Mold: -1, + Beast: -1, + DragonQueen: -1, + + Bountyhunter: -1, + Bandit: -1, + Alchemist: -1, + Nevermere: -1, + Apprentice: -1, + Dressmaker: -1, + Witch: -1, + Elemental: -1, + Dragon: -1, + Maidforce: -1, + Bast: -1, + Elf: -1, + Mushy: -1, + AncientRobot: -1, + + // Hidden Factions + Delinquent: -1, + "Virus": -1, + "ShadowClan": -1, + "DollShoppe": -1, + RopeDojo: -1, + Fuuka: -1, + "DubiousWitch": -1, + "Extraplanar": -1, + "Owners": -1, + "Debate": -1, + Dollsmith: -1, + "Wolfhunter": -1, + + Observer: 1, + + // Special factions + Angel: -1, + Demon: -1, + + + Chase: -1, + }, + "Boss": { + Chase: -1, + Enemy: 0.6, + }, + "Chase": { + // Dummy faction, used for deciding if a faction will make you go On The Run + }, + "Ambush": { + Player: -1.0, + Jail: -0.25, + + Chase: -1, + }, + "Curse": { + Player: -1.0, + Jail: -0.4, + + Chase: -1, + }, + "Prisoner": { + }, + "Jail": { + // Dummy faction, used for deciding if a faction will attack you as a prisoner + }, + "Slime": { + Jail: -1, + Chase: -1, + + Bountyhunter: -0.5, + Bandit: -0.6, + Alchemist: -0.8, + Nevermere: -0.55, + Apprentice: -0.55, + Dressmaker: -0.4, + Elemental: -0.4, + Dragon: -1.0, + Maidforce: -1.0, + Bast: -0.1, + Elf: -0.1, + Mushy: 0.1, + }, + "Latex": { + Jail: -1, + Chase: -1, + + Maidforce: -1.0, + }, + "Mold": { + Jail: -1, + Chase: -1, + + Enemy: -0.5, + Bountyhunter: -0.5, + Bandit: -0.6, + Alchemist: -0.8, + Nevermere: -0.55, + Apprentice: -0.55, + Dressmaker: -0.5, + Witch: -0.5, + Elemental: -0.5, + Dragon: -1.0, + Maidforce: -1.0, + Bast: -0.5, + Elf: -0.5, + Mushy: -0.5, + AncientRobot: -1.0, + }, + "Beast": { + Jail: -1, + Chase: -1, + + Bountyhunter: -0.4, + Bandit: -0.4, + Alchemist: -0.4, + Nevermere: -0.4, + Apprentice: -0.4, + Dressmaker: -0.4, + Witch: -0.1, + Elemental: -0.4, + Dragon: -1.0, + Maidforce: -0.4, + Mushy: -0.4, + AncientRobot: -1.0, + }, + "DragonQueen": { + Jail: -1, + Chase: -1, + + Bountyhunter: -0.4, + Bandit: -0.4, + Alchemist: -0.4, + Nevermere: -0.4, + Apprentice: -0.4, + Dressmaker: -0.4, + Witch: -0.1, + Elemental: -1, + Dragon: -1.0, + Maidforce: -0.4, + Mushy: -0.4, + AncientRobot: -1.0, + }, + "KinkyConstruct": { + Jail: -0.25, + Chase: -1, + + Apprentice: -0.55, + Dragon: -1.0, + }, + "Plant": { + Jail: -1, + Chase: -1, + }, + "Nevermere": { + "Alchemist": 0.4, + "Bast": -0.55, + "Mushy": -0.4, + "Bandit": 0.25, + "Apprentice": 0, + "AncientRobot": -0.51, + }, + "Alchemist": { + "Bandit": 0.15, + "AncientRobot": -0.55, + "Dressmaker": -0.25, + }, + "Bountyhunter": { + "Jail": 0.8, + "Dragon": 0.5, + "Bandit": -0.55, + "Maidforce": -0.15, + "Witch": -0.4, + "Dressmaker": 0.4, + "Nevermere": 0.4, + }, + "Elf": { + "Mushy": 0.4, + "Beast": 0.2, + "Plant": 0.2, + }, + "Bast": { + "Elf": -1.0, + "Witch": -0.4, + "Beast": 0.2, + }, + "Bandit": { + "Mushy": -0.6, + "Apprentice": -0.1, + "Witch": 0.15, + }, + "Elemental": { + "KinkyConstruct": 0.55, + "Bandit": -0.15, + "Elf": 0.5, + "Bast": -0.35, + "Dragon": -0.5, + "AncientRobot": -0.15, + }, + "AncientRobot": { + "Bast": 0.55, + "Elf": -0.6, + //"Maidforce": 0.55, + //"Dragon": 0.45, + //"Dressmaker": 0.55, + //"Apprentice": 0.52, + }, + "Dragon": { + "Jail": 1.0, + "Apprentice": 0.4, + "Bandit": -0.6, + "Witch": -0.4, + "Alchemist": -0.15, + "Beast": -1.0, + "Mushy": -0.15, + }, + "Mushy": { + "Alchemist": -0.55, + "Elemental": 0.25, + }, + "Witch": { + "Elf": -1.0, + }, + "Dressmaker": { + "Witch": 0.15, + "Nevermere": 0.55, + "Bandit": -0.5, + "Dragon": -0.5, + }, + "Apprentice": { + "Jail": 1.0, + "Elf": 0.75, + }, + "Necromancer": { + "Jail": 0.55, + "Witch": 0.55, + "Apprentice": -.2, + "Dragon": -.4, + "Maidforce": -.4, + "Alchemist": .05, + "Nevermere": -.2, + }, + "Maidforce": { + "Alchemist": 0.55, + "Jail": 0.55, + "Dragon": 0.55, + "Apprentice": 0.55, + "Bandit": -0.6, + "Witch": -0.4, + }, +}; + +let KinkyDungeonFactionRelations = Object.assign({}, KinkyDungeonFactionRelationsBase); + +function KDFactionRelation(a: string, b: string): number { + if (a == "Rage" || b == "Rage") return -1.0; + if (a == b) return 1.0; + if (KDFactionRelations.get(a) && KDFactionRelations.get(a).get(b)) { + return KDFactionRelations.get(a).get(b); + } + return 0.0; +} + +let KDFactionRelations: Map> = new Map(); + +function KDInitFactions(Reset?: boolean) { + if (Reset) { + KinkyDungeonFactionRelations = Object.assign({}, KinkyDungeonFactionRelationsBase); + for (let relation of Object.entries(KinkyDungeonFactionRelationsBase)) { + KinkyDungeonFactionRelations[relation[0]] = Object.assign({}, KinkyDungeonFactionRelationsBase[relation[0]]); + } + } + + for (let f of Object.keys(KinkyDungeonFactionRelationsBase)) { + if (!KinkyDungeonFactionRelations[f]) + KinkyDungeonFactionRelations[f] = Object.assign(KinkyDungeonFactionRelationsBase[f]); + } + + KDFactionRelations = new Map(); + // For each faction in faction relations we create all the maps + for (let f1 of Object.entries(KinkyDungeonFactionRelationsBase)) { + let fmap = new Map(); + + KDFactionRelations.set(f1[0], fmap); + } + // Next we create the faction relationships + for (let f1 of Object.entries(KinkyDungeonFactionRelations)) { + let fmap = KDFactionRelations.get(f1[0]); + if (fmap) + for (let f2 of Object.entries(f1[1])) { + // Set mutual opinions + fmap.set(f2[0], f2[1]); + if (!KDFactionRelations.get(f2[0])) { + console.log("Could not find faction " + f2[0]); + } else { + KDFactionRelations.get(f2[0]).set(f1[0], f2[1]); + } + } + } +} + +/** + * Sets faction relation and refreshes the map + * @param a + * @param b + * @param relation + */ +function KDSetFactionRelation(a: string, b: string, relation: number) { + if (a == "Rage" || b == "Rage") return; + if (KinkyDungeonFactionRelations[a]) + KinkyDungeonFactionRelations[a][b] = Math.max(-1, Math.min(1, relation)); + if (KinkyDungeonFactionRelations[b]) + KinkyDungeonFactionRelations[b][a] = Math.max(-1, Math.min(1, relation)); + KDInitFactions(); +} + +/** + * Changes faction relation and refreshes the map + * @param a + * @param b + * @param amount + * @param [AffectRivals] + */ +function KDChangeFactionRelation(a: string, b: string, amount: number, AffectRivals?: boolean) { + if (a == "Rage" || b == "Rage") return; + if ((a != "Player" && KinkyDungeonHiddenFactions.has(a)) || (b != "Player" && KinkyDungeonHiddenFactions.has(b))) return; + if (!KinkyDungeonFactionRelations[a]) KinkyDungeonFactionRelations[a] = KinkyDungeonFactionRelationsBase[a] || 0; + if (!KinkyDungeonFactionRelations[b]) KinkyDungeonFactionRelations[b] = KinkyDungeonFactionRelationsBase[b] || 0; + + let amountSetTo = 0; + let amountSet = false; + + if (KinkyDungeonFactionRelations[a]) { + if (!KinkyDungeonFactionRelations[a][b] && KinkyDungeonFactionRelations[b][a]) + KinkyDungeonFactionRelations[a][b] = KinkyDungeonFactionRelations[b][a]; + else if (!KinkyDungeonFactionRelations[a][b]) KinkyDungeonFactionRelations[a][b] = 0; + amountSetTo = Math.max(-1, Math.min(1, KinkyDungeonFactionRelations[a][b] + amount)); + KinkyDungeonFactionRelations[a][b] = amountSetTo; + amountSet = true; + } + + if (KinkyDungeonFactionRelations[b]) { + if (!KinkyDungeonFactionRelations[b][a] && KinkyDungeonFactionRelations[a][b]) + KinkyDungeonFactionRelations[b][a] = KinkyDungeonFactionRelations[a][b]; + else if (!KinkyDungeonFactionRelations[b][a]) KinkyDungeonFactionRelations[b][a] = 0; + KinkyDungeonFactionRelations[b][a] = amountSet ? amountSetTo : Math.max(-1, Math.min(1, KinkyDungeonFactionRelations[b][a] + amount)); + } + + if (AffectRivals && a == "Player") { + for (let faction of Object.keys(KinkyDungeonFactionRelations)) { + if (!KinkyDungeonHiddenFactions.has(faction) && faction != a && faction != b) { + let relation = KDFactionRelation(b, faction); + KDChangeFactionRelation("Player", faction, amount * relation); + } + } + } + KDInitFactions(); +} diff --git a/Game/src/faction/KinkyDungeonQuest.ts b/Game/src/faction/KinkyDungeonQuest.ts new file mode 100644 index 000000000..6327b1ff8 --- /dev/null +++ b/Game/src/faction/KinkyDungeonQuest.ts @@ -0,0 +1,1265 @@ +"use strict"; + +let QuestCompleteWeight = 1000; +let KDDefaultGoddessQuestRep = 5; + +let KDQuests: Record = { + "DressmakerQuest": { + name: "DressmakerQuest", + npc: "DressmakerQuest", + visible: true, + worldgenstart: () => { + if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { + for (let i = 0; i < 3; i++) { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + KinkyDungeonSummonEnemy(point.x, point.y, "Dressmaker", 1, 2.9); + } + } + } + }, + weight: (RoomType, _MapMod, _data, _currentQuestList) => { + if (RoomType == "PerkRoom") { + let weight = 15; + if (KinkyDungeonPlayerTags.has("BindingDress")) { + return weight * QuestCompleteWeight; + } + return weight; + } + return 0; + }, + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { + //if (KinkyDungeonFlags.has("DressmakerQuest") && KinkyDungeonPlayerTags.has("BindingDress")) { + //return false; + //} + if (RoomType == "PerkRoom") { + return true; + } + return false; + } + }, + "ApprenticeQuest": { + name: "ApprenticeQuest", + npc: "ApprenticeQuest", + visible: true, + worldgenstart: () => { + if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel) && !KinkyDungeonFlags.get("ApprenticeQuestSpawn")) { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + KinkyDungeonSummonEnemy(point.x, point.y, "Librarian", 1, 2.9); + } + KinkyDungeonSetFlag("ApprenticeQuestSpawn", -1); + + } + }, + weight: (RoomType, _MapMod, _data, _currentQuestList) => { + if (RoomType == "PerkRoom") { + let weight = 30; + if ( + KinkyDungeonInventoryGet("ScrollLegs") + || KinkyDungeonInventoryGet("ScrollArms") + || KinkyDungeonInventoryGet("ScrollVerbal") + || KinkyDungeonInventoryGet("ScrollPurity") + ) { + return weight * QuestCompleteWeight; + } + return weight; + } + return 0; + }, + accept: () => { + KinkyDungeonSetFlag("ApprenticeQuestSpawn", 0); + }, + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { + if (KDHasQuest("ApprenticeQuest") && !(KinkyDungeonInventoryGet("ScrollLegs") + || KinkyDungeonInventoryGet("ScrollArms") + || KinkyDungeonInventoryGet("ScrollVerbal") + || KinkyDungeonInventoryGet("ScrollPurity") + )) { + return false; + } + if (RoomType == "PerkRoom") { + return true; + } + return false; + } + }, + "DragonheartQuest": { + name: "DragonheartQuest", + npc: "DragonheartQuest", + visible: true, + weight: (RoomType, _MapMod, _data, _currentQuestList) => { + if (RoomType == "PerkRoom") { + let weight = 20; + return weight; + } + return 0; + }, + worldgenstart: () => { + if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { + if (KinkyDungeonFlags.get("DragonheartQuest")) KDRemoveQuest("DragonheartQuest"); + else { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + KinkyDungeonSummonEnemy(point.x, point.y, "DragonLeaderDuelist", 1, 2.9); + } + } + KinkyDungeonSetFlag("DragonheartQuest", -1, 1); + + } + }, + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { + if (KDHasQuest("DragonheartQuest")) { + return false; + } + if (KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel + 1)) return false; + if (RoomType == "PerkRoom") { + return true; + } + return false; + } + }, + "MaidforceQuest": { + name: "MaidforceQuest", + npc: "MaidforceQuest", + visible: true, + weight: (RoomType, _MapMod, _data, _currentQuestList) => { + if (RoomType == "PerkRoom") { + let weight = 20; + return weight; + } + return 0; + }, + worldgenstart: () => { + if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { + + if (KinkyDungeonFlags.get("MaidforceQuest")) KDRemoveQuest("MaidforceQuest"); + else { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let e = KinkyDungeonGetEnemy(["maid", "miniboss"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["maid", "miniboss"], undefined, {"maid": {mult: 4, bonus: 10}}); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "Delinquent"; + ee.factionrep = {"Maidforce": 0.01}; + if (KDCanOverrideAI(ee)) + ee.AI = "looseguard"; + else ee.AI = KDGetAIOverride(ee, 'looseguard'); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + let count = 3 + KDRandom() * Math.min(4, KinkyDungeonDifficulty / 20); + for (let i = 0; i < count; i++) { + e = KinkyDungeonGetEnemy(["maid"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["maid"], undefined, {"maid": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "Delinquent"; + ee.factionrep = {"Maidforce": 0.0025}; + if (KDCanOverrideAI(ee)) + ee.AI = "looseguard"; + else ee.AI = KDGetAIOverride(ee, 'looseguard'); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + } + KinkyDungeonSetFlag("MaidforceQuest", -1, 1); + } + }, + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { + if (KDHasQuest("MaidforceQuest")) { + return false; + } + if (KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel + 1)) return false; + if (RoomType == "PerkRoom") { + return true; + } + return false; + } + }, + "WolfgirlHunters": { + name: "WolfgirlHunters", + npc: "Wolfgirl", + visible: true, + nocancel: true, + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { + return 0; + }, + worldgenstart: () => { + if (KDRandom() < 0.6 && KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let e = KinkyDungeonGetEnemy(["wolfgirl", "miniboss"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["wolfgirl", "miniboss"], undefined, {"wolfgirl": {mult: 4, bonus: 10}}); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "Wolfhunter"; + ee.AI = "patrol"; + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + let count = 3 + KDRandom() * Math.min(4, KinkyDungeonDifficulty / 20); + for (let i = 0; i < count; i++) { + e = KinkyDungeonGetEnemy(["nevermere"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["nevermere"], undefined, {"wolfgirl": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "Wolfhunter"; + ee.AI = "patrol"; + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + } + }, + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { + return false; + } + }, + + "LatexDoll": { + name: "LatexDoll", + npc: "Dressmaker", + visible: true, + nocancel: true, + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { + return 0; + }, + worldgenstart: () => { + if (KDRandom() < 0.6 && KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let e = KinkyDungeonGetEnemy(["dressmaker"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["dressmaker"], undefined, {"dressmaker": {mult: 4, bonus: 10}}, ["minor"]); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "DollShoppe"; + ee.AI = "patrol"; + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + let count = 3 + KDRandom() * Math.min(4, KinkyDungeonDifficulty / 20); + for (let i = 0; i < count; i++) { + e = KinkyDungeonGetEnemy(["dressmaker"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["dressmaker"], undefined, {"dressmaker": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "DollShoppe"; + ee.AI = "patrol"; + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + } + }, + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { + return false; + } + }, + + + "MaidSweeper": { + name: "MaidSweeper", + npc: "DirtPile", + visible: true, + nocancel: true, + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { + return 0; + }, + worldgenstart: () => { + if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { + if (!KDGameData.QuestData.DirtPiles) KDGameData.QuestData.DirtPiles = { + pilesTotal: 0, + pilesSinceLastSpawn: 0, + lastSpawn: "Frog", + quota: -3, + }; + + if (KDGameData.QuestData.DirtPiles.pilesTotal < KDGameData.QuestData.DirtPiles.quota * 0.95) { + KDGameData.QuestData.DirtPiles.quota = KDGameData.QuestData.DirtPiles.pilesTotal; + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let e = KinkyDungeonGetEnemy(["maid", "miniboss"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["maid", "miniboss"], undefined, {"maid": {mult: 4, bonus: 10}}); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "Delinquent"; + if (KDCanOverrideAI(ee)) + ee.AI = "patrol"; + else ee.AI = KDGetAIOverride(ee, 'patrol'); + ee.gx = KinkyDungeonPlayerEntity.x; + ee.gy = KinkyDungeonPlayerEntity.y; + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + let count = 3 + KDRandom() * Math.min(4, KinkyDungeonDifficulty / 20); + for (let i = 0; i < count; i++) { + e = KinkyDungeonGetEnemy(["maid"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["maid"], undefined, {"maid": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "Delinquent"; + if (KDCanOverrideAI(ee)) + ee.AI = "patrol"; + else ee.AI = KDGetAIOverride(ee, 'patrol'); + ee.gx = KinkyDungeonPlayerEntity.x; + ee.gy = KinkyDungeonPlayerEntity.y; + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + KinkyDungeonChangeFactionRep("Maidforce", -0.2); + KinkyDungeonSendTextMessage(10, TextGet("KDNotEnoughDirtPiles"), "#ff8933", 4); + } + + + let count2 = 14 + 6 * KDRandom(); + for (let i = 0; i < count2; i++) { + let epoint = KinkyDungeonGetRandomEnemyPoint(true); + if (epoint) { + DialogueCreateEnemy(epoint.x, epoint.y, "DirtPile"); + KDGameData.QuestData.DirtPiles.quota += 1; + } + } + } + }, + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { + return false; + } + }, + + "ElementalSlave": { + name: "ElementalSlave", + npc: "ElementalFire", + visible: true, + nocancel: true, + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { + return 0; + }, + worldgenstart: () => { + KinkyDungeonSetFlag("ElementalSlaveTeleport", -1); + }, + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { + return false; + }, + tick: (delta) => { + if (delta > 0 && KinkyDungeonFlags.get("ElementalSlaveTeleport")) { + let altType = KDGetAltType(MiniGameKinkyDungeonLevel, KDGameData.MapMod, KDGameData.RoomType); + if (!altType || altType.makeMain) { + let tiles = KDNearbyTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 3.5).filter( + (tile) => { + return KinkyDungeonMapGet(tile.x, tile.y) == 'A' && tile.tile?.Name == "Elements"; + } + ); + if (tiles.length > 0 && KDRandom() < 0.4) { + let altar = tiles[0]; + + let point = KinkyDungeonGetNearbyPoint(altar.x, altar.y, true, undefined, false); + if (point) { + let element = CommonRandomItemFromList("", ['fire', 'earth', 'air', 'water', 'ice']); + + let e = KinkyDungeonGetEnemy(["elemental", "miniboss", element], MiniGameKinkyDungeonLevel + 8, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["elemental", element, "miniboss"], undefined, {"elemental": {mult: 4, bonus: 10}}, ["minor"]); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "Owners"; + ee.AI = "hunt"; + ee.teleporting = 3; + ee.teleportingmax = 3; + KinkyDungeonSetFlag("ElementalSlaveTeleport", 0); + } + } + } + let count = 3 + KDRandom() * Math.min(4, KinkyDungeonDifficulty / 20); + for (let i = 0; i < count; i++) { + e = KinkyDungeonGetEnemy(["elemental", element], MiniGameKinkyDungeonLevel + 4, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["elemental", element], undefined, {"elemental": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "Owners"; + ee.AI = "hunt"; + ee.teleporting = 3; + ee.teleportingmax = 3; + KinkyDungeonSetFlag("ElementalSlaveTeleport", 0); + } + } + } + } + } + + } + } + }, + }, + + "EscapedDoll": { + name: "EscapedDoll", + npc: "DollmakerBoss1", + visible: true, + nocancel: true, + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { + return 0; + }, + worldgenstart: () => { + if (KDRandom() < 0.35 && KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let e = KinkyDungeonGetEnemy(["dollsmith", "miniboss"], MiniGameKinkyDungeonLevel + 10, 'bel', '0', ["dollsmith", "miniboss"], undefined, {"dollsmith": {mult: 4, bonus: 10}}, ["minor"]); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "Dollsmith"; + ee.AI = "patrol"; + } + } + } + let count = 3 + KDRandom() * Math.min(4, KinkyDungeonDifficulty / 20); + for (let i = 0; i < count; i++) { + e = KinkyDungeonGetEnemy(["dollsmith"], MiniGameKinkyDungeonLevel + 4, 'bel', '0', ["dollsmith"], undefined, {"dollsmith": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + ee.faction = "Dollsmith"; + ee.AI = "patrol"; + } + } + } + } + } + }, + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { + return false; + } + }, + + + "Nawashi": { + name: "Nawashi", + npc: "Nawashi", + visible: true, + nocancel: true, + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { + return 0; + }, + worldgenstart: () => { + if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, "Nawashi"); + if (ee) { + ee.faction = "RopeDojo"; + ee.AI = "hunt"; + } + } + } + } + }, + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { + return false; + } + }, + "BanditQuest": { + name: "BanditQuest", + npc: "BanditQuest", + visible: true, + nocancel: true, + weight: (RoomType, _MapMod, _data, _currentQuestList) => { + if (RoomType == "PerkRoom") { + let weight = 20; + return weight; + } + return 0; + }, + worldgenstart: () => { + if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { + if (KinkyDungeonFlags.get("BanditPrisoner")) KDRemoveQuest("BanditPrisoner"); + else { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + point = KinkyDungeonNearestJailPoint(point.x, point.y); + if (point) { + KinkyDungeonSummonEnemy(point.x, point.y, "PrisonerBandit", 1, 1.5); + } + } + } + KinkyDungeonSetFlag("BanditPrisoner", -1, 1); + } + }, + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { + if (KDHasQuest("BanditPrisoner")) { + return false; + } + if (KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel + 1)) return false; + if (RoomType == "PerkRoom") { + return true; + } + return false; + } + }, + "BlacksmithQuest": { + name: "BlacksmithQuest", + npc: "BlacksmithQuest", + visible: false, + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { + return 100; + }, + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { + if (RoomType == "PerkRoom") { + return true; + } + return false; + } + }, + "BowyerQuest": { + name: "BowyerQuest", + npc: "BowyerQuest", + visible: false, + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { + return 100; + }, + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { + if (RoomType == "PerkRoom") { + return true; + } + return false; + } + }, + "ShadyQuest": { + name: "ShadyQuest", + npc: "ShadyQuest", + visible: false, + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { + return 100; + }, + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { + if (RoomType == "PerkRoom") { + return true; + } + return false; + } + }, + "ArmorerQuest": { + name: "ArmorerQuest", + npc: "ArmorerQuest", + visible: false, + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { + return 100; + }, + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { + if (RoomType == "PerkRoom") { + return true; + } + return false; + } + }, + + + "LatexQuest": KDGenQuestTemplate("LatexQuest", "PinkAlchemist", "Latex", (_goddess, _flag) => { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let ens = KinkyDungeonSummonEnemy(point.x, point.y, "LatexCube", Math.max(1, Math.min(3, Math.round(KDGetEffLevel()/6))), 2.9); + for (let enemy of ens) { + //KinkyDungeonSetEnemyFlag(enemy, "LatexQuest", -1); + enemy.AI = "guard"; + } + + let count = 1 + KDRandom() * Math.min(3, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["alchemist", "pink", "miniboss"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["pink", "miniboss"], undefined, {"alchemist": {mult: 4, bonus: 10}}); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "LatexQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "Latex"; + if (KDCanOverrideAI(ee)) + ee.AI = "looseguard"; + else ee.AI = KDGetAIOverride(ee, 'looseguard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + count = 3 + KDRandom() * Math.min(8, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["alchemist", "pink"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["pink"], undefined, {"alchemist": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "LatexQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "Latex"; + if (KDCanOverrideAI(ee)) + ee.AI = "looseguard"; + else ee.AI = KDGetAIOverride(ee, 'looseguard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + + } + }, 1, ["latexRestraints", "latexRestraintsHeavy"]), + + "WillQuest": KDGenQuestTemplate("WillQuest", "Elf", "Will", (_goddess, _flag) => { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let count = 4 + KDRandom() * Math.min(8, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["mummy"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["mummy"], undefined, {"mummy": {mult: 2, bonus: 10}}, ["miniboss", "boss", "submissive"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "WillQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "Debate"; + if (KDCanOverrideAI(ee)) + ee.AI = "guard"; + else ee.AI = KDGetAIOverride(ee, 'guard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + count = 4 + KDRandom() * Math.min(8, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["elf"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["elf"], undefined, {"elf": {mult: 2, bonus: 10}}, ["miniboss", "boss", "turret"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "WillQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "Debate"; + if (KDCanOverrideAI(ee)) + ee.AI = "guard"; + else ee.AI = KDGetAIOverride(ee, 'guard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + + } + }, 1.5, ["mithrilCuffs", "leatherRestraints", "leatherRestraintsHeavy"]), + + "RopeQuest": KDGenQuestTemplate("RopeQuest", "RopeKraken", "Rope", (_goddess, _flag) => { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let e = KinkyDungeonSummonEnemy(point.x, point.y, "RopeKraken", Math.max(1, Math.min(6, Math.round(KDGetEffLevel()/6))), 2.9); + for (let enemy of e) { + KinkyDungeonSetEnemyFlag(enemy, "RopeQuest", -1); + KinkyDungeonSetEnemyFlag(enemy, "questtarget", -1); + enemy.gxx = point.x; + enemy.gyy = point.y; + enemy.spawnX = point.x; + enemy.spawnY = point.y; + enemy.AI = "looseguard"; + enemy.homeCoord = KDGetCurrentLocation(); + } + } + }, 2, ["dressRestraints", "leatherRestraints", "leatherRestraintsHeavy"]), + + "LeatherQuest": KDGenQuestTemplate("LeatherQuest", "ChainBeing", "Leather", (_goddess, _flag) => { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let beings = ["ChainBeing", "CorruptedAdventurer", "ShadowGhast"]; + let ens = KinkyDungeonSummonEnemy(point.x, point.y, beings[Math.floor(KDRandom() * beings.length)], Math.max(2, Math.min(6, Math.round(KDGetEffLevel()/4))), 2.9); + for (let enemy of ens) { + KinkyDungeonSetEnemyFlag(enemy, "LeatherQuest", -1); + KinkyDungeonSetEnemyFlag(enemy, "questtarget", -1); + enemy.AI = "guard"; + enemy.faction = "Rebel"; + } + + let count = 1 + KDRandom() * Math.min(3, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["dragon", "miniboss"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["dragon", "miniboss"], undefined, {"dragon": {mult: 4, bonus: 10}}); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + //KinkyDungeonSetEnemyFlag(ee, "LeatherQuest", -1); + ee.faction = "Rebel"; + if (KDCanOverrideAI(ee)) + ee.AI = "looseguard"; + else ee.AI = KDGetAIOverride(ee, 'looseguard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + + count = 3 + KDRandom() * Math.min(8, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["dragonheart"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["dragon"], undefined, {"dragon": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + //KinkyDungeonSetEnemyFlag(ee, "LeatherQuest", -1); + ee.faction = "Rebel"; + if (KDCanOverrideAI(ee)) + ee.AI = "looseguard"; + else ee.AI = KDGetAIOverride(ee, 'looseguard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + + } + }, 1, ["dragonRestraints", "leatherRestraints", "leatherRestraintsHeavy"]), + + "MetalQuest": KDGenQuestTemplate("MetalQuest", "Drone", "Metal", (_goddess, _flag) => { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let count = 1 + KDRandom() * Math.min(3, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["oldrobot", "robot", "miniboss"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["robot", "miniboss"], undefined, {"oldrobot": {mult: 2, bonus: 10}}, ["turret"]); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "MetalQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "Virus"; + if (KDCanOverrideAI(ee)) + ee.AI = "looseguard"; + else ee.AI = KDGetAIOverride(ee, 'looseguard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + + count = 3 + KDRandom() * Math.min(8, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["robot", "oldrobot"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["robot"], undefined, {"oldrobot": {mult: 2, bonus: 10}}, ["miniboss", "boss", "turret"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "MetalQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "Virus"; + if (KDCanOverrideAI(ee)) + ee.AI = "looseguard"; + else ee.AI = KDGetAIOverride(ee, 'looseguard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + + } + }, 0.7, ["cyberdollrestraints", "cyberdollcuffs", "cyberdollheavy", "controlharness", "blacksteelRestraints"]), + + "ConjureQuest": KDGenQuestTemplate("ConjureQuest", "WitchShock", "Conjure", (_goddess, _flag) => { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let count = 1 + KDRandom() * Math.min(3, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["witch", "apprentice", "miniboss"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["witch", "miniboss"], undefined, {"witch": {mult: 2, bonus: 10}}); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "ConjureQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "DubiousWitch"; + if (KDCanOverrideAI(ee)) + ee.AI = "guard"; + else ee.AI = KDGetAIOverride(ee, 'guard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + + count = 3 + KDRandom() * Math.min(8, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["apprentice", "witch"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["mage"], undefined, {"witch": {mult: 4, bonus: 10}, "apprentice": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "ConjureQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "DubiousWitch"; + if (KDCanOverrideAI(ee)) + ee.AI = "guard"; + else ee.AI = KDGetAIOverride(ee, 'guard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + + } + }, 1, ["dressRestraints", "latexRestraints"]), + + "ElementsQuest": KDGenQuestTemplate("ElementsQuest", "DemonStar", "Elements", (_goddess, _flag) => { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let count = 1 + KDRandom() * Math.min(3, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["demon", "miniboss"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["demon", "miniboss"], undefined, {"demon": {mult: 2, bonus: 10}}); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "ElementsQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "Extraplanar"; + if (KDCanOverrideAI(ee)) + ee.AI = "looseguard"; + else ee.AI = KDGetAIOverride(ee, 'looseguard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + + count = 3 + KDRandom() * Math.min(8, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["demon"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["demon"], undefined, {"demon": {mult: 2, bonus: 10}}, ["miniboss", "boss"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "ElementsQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "Extraplanar"; + if (KDCanOverrideAI(ee)) + ee.AI = "looseguard"; + else ee.AI = KDGetAIOverride(ee, 'looseguard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + + } + }, 1, ["steelbondage", "crystalRestraints", "leatherRestraints", "leatherRestraintsHeavy"]), + + "IllusionQuest": KDGenQuestTemplate("IllusionQuest", "DragonShadow", "Illusion", (_goddess, _flag) => { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let count = 1 + KDRandom() * Math.min(3, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["shadowclan", "miniboss"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["shadowclan", "miniboss"], undefined, {"shadowclan": {mult: 2, bonus: 10}}); + if (e) { + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "IllusionQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "ShadowClan"; + if (KDCanOverrideAI(ee)) + ee.AI = "guard"; + else ee.AI = KDGetAIOverride(ee, 'guard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + count = 4 + KDRandom() * Math.min(8, KDGetEffLevel()/3); + for (let i = 0; i < count; i++) { + let e = KinkyDungeonGetEnemy(["shadowclan"], MiniGameKinkyDungeonLevel + 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["shadowclan"], undefined, {"shadowclan": {mult: 2, bonus: 10}}, ["miniboss", "boss"]); + let epoint = KinkyDungeonGetNearbyPoint(point.x, point.y, true, undefined, false); + if (e && epoint) { + let ee = DialogueCreateEnemy(epoint.x, epoint.y, e.name); + if (ee) { + KinkyDungeonSetEnemyFlag(ee, "IllusionQuest", -1); + KinkyDungeonSetEnemyFlag(ee, "questtarget", -1); + ee.faction = "ShadowClan"; + if (KDCanOverrideAI(ee)) + ee.AI = "guard"; + else ee.AI = KDGetAIOverride(ee, 'guard'); + ee.gxx = point.x; + ee.gyy = point.y; + ee.spawnX = point.x; + ee.spawnY = point.y; + ee.homeCoord = KDGetCurrentLocation(); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + + } + }, 1, ["shadowLatexRestraints", "shadowLatexRestraintsHeavy", "obsidianRestraints"]) +}; + + + +function KDQuestList(count: number, mods: Record, RoomType: string, MapMod: string, data: any): KDQuest[] { + let ret: KDQuest[] = []; + for (let i = 0; i < count; i++) { + let genWeightTotal = 0; + let genWeights = []; + + for (let mod of Object.values(mods)) { + if (!ret.includes(mod) && mod.prerequisite(RoomType, MapMod, data, ret)) { + genWeights.push({mod: mod, weight: genWeightTotal}); + genWeightTotal += mod.weight(RoomType, MapMod, data, ret); + } + } + + let selection = KDRandom() * genWeightTotal; + + for (let L = genWeights.length - 1; L >= 0; L--) { + if (selection > genWeights[L].weight) { + ret.push(genWeights[L].mod); + break; + } + } + } + return ret; +} + +function KDQuestWorldgenStart(quests: string[]) { + if (quests) { + for (let q of quests) { + if (KDQuests[q] && KDQuests[q].worldgenstart) { + KDQuests[q].worldgenstart(); + } + } + } +} + +function KDQuestTick(quests: string[], delta: number) { + if (quests) { + for (let q of quests) { + if (KDQuests[q] && KDQuests[q].tick) { + KDQuests[q].tick(delta); + } + } + } +} + +function KDRemoveQuest(quest: string) { + if (!KDGameData.Quests) + KDGameData.Quests = []; + else if (KDGameData.Quests.indexOf(quest) > -1) + KDGameData.Quests.splice(KDGameData.Quests.indexOf(quest), 1); +} + +function KDAddQuest(quest: string) { + if (!KDGameData.Quests) KDGameData.Quests = []; + if (!KDGameData.Quests.includes(quest)) { + if (KDQuests[quest]?.accept) { + KDQuests[quest].accept(); + } + KDGameData.Quests.push(quest); + KinkyDungeonSendTextMessage(10, TextGet("KDNewQuest"), "#ffffff", 2); + } +} + +function KDHasQuest(quest: string): boolean { + if (!KDGameData.Quests) return false; + return KDGameData.Quests.includes(quest); +} + +let KDQuestsIndex = 0; +let KDQuestsVisible = 0; +let KDMaxQuests = 7; + + +function KinkyDungeonDrawQuest() { + let xOffset = -125; + let yStart = 200; + let xStart = 500; + let spacing = 100; + let II = 0; + let ytt = 120; + + if (KDGameData.Quests) { + for (let q of KDGameData.Quests) { + if (KDQuests[q]?.visible) { + if (II < KDQuestsIndex + KDMaxQuests && II >= KDQuestsIndex) { + let width = 1050; + + FillRectKD(kdcanvas, kdpixisprites, "questrec" + q, { + Left: xStart + xOffset + 100, + Top: yStart + (II-KDQuestsIndex)*spacing - 40, + Width: width, + Height: 80, + Color: "#000000", + LineWidth: 1, + zIndex: -18, + alpha: 0.3 + }); + DrawRectKD(kdcanvas, kdpixisprites, "questrec2" + q, { + Left: xStart + xOffset + 100, + Top: yStart + (II-KDQuestsIndex)*spacing - 40, + Width: width, + Height: 80, + Color: "#000000", + LineWidth: 1, + zIndex: -18, + alpha: 0.9 + }); + + DrawTextFitKD(TextGet("KDQuest_" + q), xStart + xOffset + 200, yStart + (II-KDQuestsIndex)*spacing, 850, "#ffffff", KDTextGray0, 28, "left"); + KDDraw(kdcanvas, kdpixisprites, "kdquest" + q, KinkyDungeonRootDirectory + "Enemies/" + KDQuests[q]?.npc + ".png", + xStart + xOffset + 100, yStart + (II-KDQuestsIndex)*spacing - 36, 72, 72); + if (DrawButtonKDEx("kdquestquit" + q, (_b) => { + if (!KDQuests[q]?.nocancel) + KDRemoveQuest(q); + return true; + }, true, xStart + xOffset + 1200, yStart + (II-KDQuestsIndex)*spacing - 36, 220, 72, + TextGet("KDQuestListCancel"), KDQuests[q]?.nocancel ? KDTextGray3 : "#ffffff", + KinkyDungeonRootDirectory + "UI/X.png", "", false, true, KDButtonColor, undefined, true)) + DrawTextFitKD(TextGet(KDQuests[q]?.nocancel ? "KDQuestListDescCancelFail" : "KDQuestListDescCancel"), + xStart + xOffset + 625, ytt, 1000, "#ffffff", KDTextGray0, 20, "center", 70); + } + + II++; + } + } + } + + KDQuestsVisible = II; + + if (KDQuestsVisible == 0) { + let x = 1225 + xOffset; + + DrawTextFitKD(TextGet("KDNoQuests"), x, 300, 1050, "#ffffff", KDTextGray0, 24); + //DrawTextFitKD(TextGet("KDNoQuests"), + //xStart + xOffset + 625, ytt, 1000, "#ffffff", KDTextGray0, 20, "center", 70); + } + + if (KDQuestsVisible > KDMaxQuests) { + DrawButtonKDEx("questUp", (_b) => { + KDQuestsIndex -= 2; + return true; + }, true, xStart, yStart - spacing, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Up.png"); + DrawButtonKDEx("questDown", (_b) => { + KDQuestsIndex += 2; + return true; + }, true, xStart, yStart + KDMaxQuests*spacing, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Down.png"); + + + KDQuestsIndex = Math.max(0, Math.min(KDQuestsIndex, KDQuestsVisible - Math.round(KDMaxQuests/2))); + } else { + KDQuestsIndex = 0; + } + + + KDDrawLoreRepTabs(xOffset); +} + +function KDGetQuestData(quest: string): any { + if (KDGameData.QuestData) return KDGameData.QuestData[quest] || {}; + return {}; +} + +function KDSetQuestData(quest: string, data: any) { + if (!KDGameData.QuestData) KDGameData.QuestData = {}; + KDGameData.QuestData[quest] = data; +} + +/** + * @param Name + * @param Icon + * @param Goddess + * @param spawnFunction + * @param restraintsCountMult + * @param restraintsTags + * @param [Loot] + * @param [Rep] + */ +function KDGenQuestTemplate(Name: string, Icon: string, Goddess: string, spawnFunction: (Goddess: string, Flag: string) => void, restraintsCountMult: number, restraintsTags: string[], Loot?: string, Rep: number = KDDefaultGoddessQuestRep): KDQuest { + if (!Loot) Loot = Name; + let quest: KDQuest = { + name: Name, + npc: Icon, + visible: true, + nocancel: true, + accept: () => { + if (KinkyDungeonStatsChoice.get("BoundCrusader")) { + KDPlayerEffectRestrain(undefined, 1, restraintsTags, "Goddess", false, true, false, false, false, "Divine", { + Progressive: false, + ProgressiveSkip: false, + DontPreferWill: false, + Keep: true, + }); + for (let i = 0; i < 2; i++) { + KDPlayerEffectRestrain(undefined, 1, restraintsTags, "Goddess", false, true, false, false, false, "Divine", { + Progressive: true, + ProgressiveSkip: true, + DontPreferWill: false, + Keep: true, + }); + } + } + KDSetQuestData(Name, { + QuestLocation: KDCurrentWorldSlot, + QuestRoom: KDMapData.RoomType, + }); + KDMapData.QuestsAccepted++; + KinkyDungeonSetFlag(Name, -1, -1); + spawnFunction(Goddess, Name); + }, + worldgenstart: () => { + }, + tick: (delta) => { + if (KDMapData.RoomType == "PerkRoom") { + KDRemoveQuest(Name); + KinkyDungeonChangeRep(Goddess, -KDDefaultGoddessQuestRep); + KinkyDungeonSendTextMessage(10, TextGet("KDQuestFail_" + Name), "#ffffff", 1); + KDPlayerEffectRestrain(undefined, Math.round(restraintsCountMult * (1 + KDGetEffLevel()/3)), restraintsTags, "Goddess", false, true, false, false, false, "Divine", { + Progressive: true, + DontPreferWill: true, + Keep: true, + }); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + "Evil" + ".ogg"); + KinkyDungeonSendEvent("afterFailGoddessQuest", {quest: Name, goddess: Goddess}); + } + if (!(KDGetQuestData(Name).QuestRoom == KDMapData.RoomType) + || !(KDGetQuestData(Name).QuestLocation?.x == KDCurrentWorldSlot.x) + || !(KDGetQuestData(Name).QuestLocation?.y == KDCurrentWorldSlot.y)) return; + if (delta > 0 && KinkyDungeonFlags.get(Name)) { + for (let enemy of KDMapData.Entities) { + if (KDEnemyHasFlag(enemy, Name)) { + return; + } + } + for (let i = 0 ; i < 3; i++) { + KinkyDungeonLoot(KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), Name); + } + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + "Magic" + ".ogg"); + + KinkyDungeonChangeRep(Goddess, (!KinkyDungeonFlags.get("QuestFirstRep")) ? 2.5 + Rep : Rep); + KinkyDungeonSetFlag("QuestFirstRep", -1, 1); + KinkyDungeonSendTextMessage(10, TextGet("KDQuestSucceed" + (KinkyDungeonGoddessRep.Ghost > 1 ? "Sub" : "") + "_" + Name), "#ffffff", 1); + KDRemoveQuest(Name); + for (let inv of KinkyDungeonAllRestraintDynamic()) { + if (inv.item.lock == "Divine") KinkyDungeonLock(inv.item, ""); + } + } + }, + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { + return 10; + }, + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { + return false; + }, + tags: [Goddess], + }; + + return quest; +} diff --git a/Game/src/faction/KinkyDungeonReputation.ts b/Game/src/faction/KinkyDungeonReputation.ts new file mode 100644 index 000000000..851901551 --- /dev/null +++ b/Game/src/faction/KinkyDungeonReputation.ts @@ -0,0 +1,697 @@ +"use strict"; + +const KDANGER = -19; +const KDRAGE = -31; +const KDPLEASED = 15; +const KDFRIENDLY = 35; + +let KDStatRep = ["Ghost", "Prisoner", "Passion", "Frustration"]; + +let KDRepColor = { + Passion: "#ff5277", + Frustration: "#ff9999", +}; +let KDRepNameColor = { + Leather: "#3e0000", + Latex: "#692464", + Rope: "#494f11", + Metal: "#2f68cc", + Will: "#2f573d", + Elements: "#ad2f45", + Conjure: "#2f4a3d", + Illusion: "#551d78", +}; + +let KDFactionGoddess = { + "Metal": { + "Angel": 0.002, + "Demon": -0.001, + "Nevermere": -0.001, + "AncientRobot": 0.007, + "Elemental": 0.001, + }, + "Rope": { + "Angel": 0.002, + "Demon": -0.001, + "KinkyConstruct": 0.005, + "Dressmaker": 0.005, + "Bountyhunter": 0.002, + "Bast": 0.0025, + "AncientRobot": 0.001, + }, + "Elements": { + "Angel": 0.007, + "Demon": -0.001, + "Witch": 0.003, + "Apprentice": 0.0015, + "Elemental": 0.01, + //"Mushy": 0.001, + "AncientRobot": -0.001, + }, + "Leather": { + "Angel": 0.002, + "Demon": -0.001, + "Elf": 0.001, + "Dragon": 0.005, + "Bandit": 0.01, + "Elemental": 0.002, + "AncientRobot": 0.001, + }, + "Latex": { + "Angel": 0.002, + "Demon": -0.001, + "Maidforce": 0.0015, + "Alchemist": 0.01, + "Nevermere": 0.003, + "AncientRobot": 0.001, + }, + "Will": { + "Angel": 0.007, + "Demon": -0.005, + "Elf": 0.005, + //"Mushy": 0.0035, + "Bast": 0.005, + "Apprentice": 0.001, + "AncientRobot": -0.001, + }, + "Conjure": { + "Angel": 0.007, + "Demon": -0.001, + "Alchemist": 0.002, + "Witch": 0.003, + "Apprentice": 0.0015, + "Dressmaker": 0.005, + "AncientRobot": -0.001, + }, + "Illusion": { + "Angel": 0.007, + "Demon": -0.001, + "Witch": 0.003, + "Apprentice": 0.0015, + "Maidforce": 0.007, + "Bountyhunter": 0.002, + "AncientRobot": -0.001, + //"Ghost": 0.005, + }, +}; + +let KinkyDungeonGoddessRep: Record = {}; + +let KinkyDungeonRescued: Record = {}; +let KinkyDungeonAid: Record = {}; + +let KDRepSelectionMode = ""; + +let KDBlessedRewards: Record = { + "Latex": ["TheEncaser"], + "Rope": ["MoiraiScissors"], + "Metal": ["BondageBuster"], + "Leather": ["Dragonslaver"], + "Will": ["MessengerOfLove"], + "Elements": ["FourSeasons",], + "Conjure": ["Arbiter"], + "Illusion": ["Dreamcatcher"], +}; + +/** + * Returns whether or not the player meets a requirement for a pearl reward chest + */ +function KDPearlRequirement(): boolean { + let has = false; + for (let rep of Object.entries(KinkyDungeonGoddessRep)) { + let rewards = KDBlessedRewards[rep[0]]; + if (rewards) { + let missing = true; + for (let r of rewards) { + if (KinkyDungeonInventoryGet(r)) { + missing = false; + break; + } + for (let c of Object.values(KDGameData.Containers)) { + if (c.location?.mapY < 1 && c.items[r]) { + missing = false; + break; + } + } + if (missing) break; + } + if (missing && rep[1] > 45) { + has = true; + break; + } + } + + } + return has; +} + +/** + * Returns whether or not the player meets a requirement for ANY pearl reward + */ +function KDGetBlessings(): string[] { + let blessings = []; + for (let rep of Object.entries(KinkyDungeonGoddessRep)) { + let rewards = KDBlessedRewards[rep[0]]; + if (rewards) { + if (rep[1] > 45) { + blessings.push(rep[0]); + break; + } + } + + } + return blessings; +} + +function KinkyDungeonInitReputation() { + KinkyDungeonGoddessRep = {"Ghost" : -50, "Prisoner" : -50, "Frustration" : -50, "Passion" : -50}; + for (let shrine in KinkyDungeonShrineBaseCosts) { + KinkyDungeonGoddessRep[shrine] = KinkyDungeonStatsChoice.get("Cursed") ? -25 : 0; + } + if (KinkyDungeonStatsChoice.get("Wanted")) KinkyDungeonChangeRep("Prisoner", 100); + if (KinkyDungeonStatsChoice.get("Submissive")) KinkyDungeonChangeRep("Ghost", 100); + + if (KinkyDungeonStatsChoice.get("Unchained")) KinkyDungeonChangeRep("Metal", 10); + if (KinkyDungeonStatsChoice.get("Artist")) KinkyDungeonChangeRep("Rope", 10); + if (KinkyDungeonStatsChoice.get("Slippery")) KinkyDungeonChangeRep("Latex", 10); + if (KinkyDungeonStatsChoice.get("Escapee")) KinkyDungeonChangeRep("Leather", 10); + + if (KinkyDungeonStatsChoice.get("Damsel")) KinkyDungeonChangeRep("Metal", -10); + if (KinkyDungeonStatsChoice.get("Bunny")) KinkyDungeonChangeRep("Rope", -10); + if (KinkyDungeonStatsChoice.get("Doll")) KinkyDungeonChangeRep("Latex", -10); + if (KinkyDungeonStatsChoice.get("Dragon")) KinkyDungeonChangeRep("Leather", -10); +} + +/** + * @param Amount + */ +function KinkyDungeonRepName(Amount: number): string { + let name = ""; + + if (Amount >= 10) name = "Thankful"; + if (Amount >= 30) name = "Pleased"; + if (Amount >= 45) name = "Blessed"; + if (Amount < KDANGER) name = "Angered"; + if (Amount < KDRAGE) name = "Enraged"; + if (Amount < -45) name = "Cursed"; + + return TextGet("KinkyDungeonRepName" + name); +} + + +/** + * @param Amount + */ +function KinkyDungeonRepNameFaction(Amount: number): string { + let name = ""; + + if (Amount > 0.2) name = "Thankful"; + if (Amount >= 0.4) name = "Pleased"; + if (Amount > 0.7) name = "Blessed"; + if (Amount < -0.1) name = "Angered"; + if (Amount <= -0.5) name = "Enraged"; + if (Amount < -0.9) name = "Cursed"; + + return TextGet("KinkyDungeonRepNameFaction" + name); +} + +/** + * @param Rep + * @param Amount + */ +function KinkyDungeonChangeFactionRep(Rep: string, Amount: number): boolean { + let data = { + Rep: Rep, + Amount: Amount, + }; + KinkyDungeonSendEvent("changeFactionRep", data); + Rep = data.Rep; + Amount = data.Amount; + let last = KDFactionRelation("Player", Rep); + KDChangeFactionRelation("Player", Rep, Amount); + let curr = KDFactionRelation("Player", Rep); + + if (curr != last) { + let amount = 0.5*(Amount > 0 ? Math.ceil : Math.floor)((curr - last)*10000)/100; // 0.5% due to the fact that the scale is -1 to +1 but it gets mapped from 0 to 100% + KinkyDungeonSendFloater({x: 1100, y: 800 - KDRecentRepIndex * 40}, `${amount > 0 ? '+' : ''}${amount}% ${TextGet("KinkyDungeonFaction" + Rep)} rep`, "white", 5, true); + KDRecentRepIndex += 1; + } + + return false; +} + +/** + * @param Rep + * @param Amount + */ +function KinkyDungeonChangeRep(Rep: string, Amount: number): boolean { + let data = { + Rep: Rep, + Amount: Amount, + }; + KinkyDungeonSendEvent("changeRep", data); + Rep = data.Rep; + Amount = data.Amount; + if (KinkyDungeonGoddessRep[Rep] != undefined) { + let last = KinkyDungeonGoddessRep[Rep]; + let minimum = (Rep == "Ghost" && KinkyDungeonStatsChoice.get("Submissive")) || (Rep == "Prisoner" && KinkyDungeonStatsChoice.get("Wanted")) ? 20: -50; + let maximum = (KinkyDungeonStatsChoice.get("Cursed") && !KDStatRep.includes(Rep)) ? -25: 50; + //let target = -50; + //let interval = 0.02; + let start = KinkyDungeonGoddessRep[Rep]; + //if (Amount >= 0) target = 50; + /*for (let i = 0; i < Math.abs(Amount); i++) { + KinkyDungeonGoddessRep[Rep] += (target - KinkyDungeonGoddessRep[Rep]) * interval; + }*/ + KinkyDungeonGoddessRep[Rep] += Amount; + KinkyDungeonGoddessRep[Rep] = Math.min(maximum, Math.max(minimum, KinkyDungeonGoddessRep[Rep])); + if (Math.abs(KinkyDungeonGoddessRep[Rep] - start) > 0.1) { + let value = KinkyDungeonGoddessRep[Rep] - start; + let amount = Math.round((value)*10)/10; + KinkyDungeonSendFloater({x: 700, y: 800 - KDRecentRepIndex * 40}, `${amount > 0 ? '+' : ''}${amount}% ${TextGet("KinkyDungeonShrine" + Rep)} ${!KDStatRep.includes(Rep) ? TextGet("KDRep") : ""}`, "white", 5, true); + KDRecentRepIndex += 1; + } + + if (KDFactionGoddess[Rep]) { + for (const [k, v] of Object.entries(KDFactionGoddess[Rep]) as [string, number][]) { + let mult = (Amount > 0 ? 1 : 1); + if (Amount > 0) { + const relation = KDFactionRelation("Player", k); + if (relation <= -0.25) mult *= 0.5; + else if (relation <= -0.1) mult *= 0.75; + else if (relation >= 0.55) mult *= 0; + else if (relation >= 0.35) mult *= 0.25; + else if (relation >= 0.25) mult *= 0.5; + else if (relation >= 0.1) mult *= 0.75; + } + KDChangeFactionRelation("Player", k, v * mult * Amount); + } + } + + if (KinkyDungeonGoddessRep[Rep] != last) return true; + return false; + } + return false; +} + +function KinkyDungeonHandleReputation(): boolean { + return true; +} + +function KinkyDungeonDrawReputation() { + + let xOffset = -125; + KDDrawLoreRepTabs(xOffset); + //KinkyDungeonDrawMessages(true); + + let i = 0; + let XX = 0; + let spacing = 600 / Object.keys(KinkyDungeonGoddessRep).length; + let yPad = 50; + let tooltip = ""; + + if (!KDRepSelectionMode) { + tooltip = KinkyDungeonDrawFactionRep(); + } + + for (let rep in KinkyDungeonGoddessRep) { + let value = KinkyDungeonGoddessRep[rep]; + + if (rep) { + let color = "#e7cf1a"; + let goddessColor = "white"; + let goddessSuff = ""; + if (KDRepColor[rep]) color = KDRepColor[rep]; + else { + if (value < -10) { + if (value < -30) color = "#ff5277"; + else color = "#ff8933"; + } else if (value >= 10) { + if (value >= 30) color = "#4fd658"; + else color = "#9bd45d"; + } + } + + + + if (tooltip) { + goddessColor = "#888888"; + if (KDFactionGoddess[rep] && KDFactionGoddess[rep][tooltip] != 0) { + goddessColor = KDFactionGoddess[rep][tooltip] > 0 ? "#ffffff" : (KDFactionGoddess[rep][tooltip] < 0 ? "#ff5277" : "#999999"); + if (KDFactionGoddess[rep][tooltip] >= 0.006) goddessSuff = "+++"; + else if (KDFactionGoddess[rep][tooltip] >= 0.003) goddessSuff = "++"; + else if (KDFactionGoddess[rep][tooltip] >= 0.00001) goddessSuff = "+"; + else if (KDFactionGoddess[rep][tooltip] <= -0.00001) goddessSuff = "-"; + else if (KDFactionGoddess[rep][tooltip] <= 0.004) goddessSuff = "--"; + else if (KDFactionGoddess[rep][tooltip] <= 0.006) goddessSuff = "---"; + } + } + let suff = ""; + if (!KDStatRep.includes(rep)) suff = "" + KinkyDungeonRepName(value); + DrawTextKD(TextGet("KinkyDungeonShrine" + rep) + goddessSuff, canvasOffsetX_ui + xOffset + XX + 20, yPad + canvasOffsetY_ui + spacing * i, goddessColor, KDRepNameColor[rep] || "#000000", undefined, "left"); + if (suff) { + DrawTextFitKD(suff, canvasOffsetX_ui + xOffset + 275 + XX + 240, yPad + canvasOffsetY_ui + spacing * i, 100, "white", "black", undefined, "left"); + } + // Draw between the % and bar and suffix if debug mode is active. + if (KDDebugMode) { + DrawButtonKDEx("minusrep" + rep, (_bdata) => { + KinkyDungeonChangeRep(rep, -5) + return true; + }, true, canvasOffsetX_ui + xOffset + 275 + XX - 30, yPad + canvasOffsetY_ui + spacing * i - 15, 30, 30, "-", "#ffffff"); + DrawButtonKDEx("plusrep" + rep, (_bdata) => { + KinkyDungeonChangeRep(rep, 5) + return true; + }, true, canvasOffsetX_ui + xOffset + 275 + XX + 203, yPad + canvasOffsetY_ui + spacing * i - 15, 30, 30, "+", "#ffffff"); + } + DrawProgressBar(canvasOffsetX_ui + xOffset + 275 + XX, yPad + canvasOffsetY_ui + spacing * i - spacing/4, 200, spacing/2, 50 + + (rep == "Prisoner" ? KDGetEffSecurityLevel(undefined, true) : + value), color, KDTextGray2); + if (KinkyDungeonShrineBaseCosts[rep]) + KDDrawRestraintBonus(rep, canvasOffsetX_ui + xOffset + 275 + XX - 50, yPad + canvasOffsetY_ui + spacing * i, undefined, 24); + + if (MouseIn(canvasOffsetX_ui + xOffset + XX, yPad + canvasOffsetY_ui + spacing * i - 1 - spacing/2, 500, spacing - 2)) { + DrawTextFitKD(TextGet("KDRepDescription" + rep).replace("MNFCTN", TextGet("KinkyDungeonFaction" + KDGetMainFaction())), 1100, 880, 1250, "#ffffff", "#000000"); + } + let v2 = Math.round(KDGetEffSecurityLevel() - value); + let numSuff = rep == "Prisoner" ? `${v2 >= 0 ? '+' + v2 : v2} ` : " "; + DrawTextKD(" " + (Math.round(value)+50) + numSuff, canvasOffsetX_ui + xOffset + 275 + XX + 100, 2+yPad + canvasOffsetY_ui + spacing * i, "white", "black"); + + if (KDFactionRepIndex < 0.1) { + if (KDRepSelectionMode == "") { + /*DrawButtonKDEx("rescueswitch", (bdata) => { + if (KinkyDungeonAllRestraint().length > 0) + KDRepSelectionMode = "Rescue"; + return true; + }, true, 600, 800, 250, 50, TextGet("KinkyDungeonAskRescue"), KinkyDungeonAllRestraint().length > 0 ? "white" : "#999999"); + //DrawButtonVis(1200, 800, 250, 50, TextGet("KinkyDungeonAskPenance"), "white"); + //DrawButtonVis(900, 800, 250, 50, TextGet("KinkyDungeonAskAid"), "white"); + DrawButtonKDEx("champswitch", (bdata) => { + KDRepSelectionMode = "Champion"; + return true; + }, true, 900, 800, 250, 50, TextGet("KinkyDungeonAskChampion"), "white");*/ + } else { + DrawButtonKDEx("backtorep", (_bdata) => { + KDRepSelectionMode = ""; + return true; + }, true, 600, 800, 550, 50, TextGet("KinkyDungeonBack"), "white"); + } + + if (KinkyDungeonShrineBaseCosts[rep]) { + //DrawButtonVis(canvasOffsetX_ui + xOffset + 275 + XX + 400, yPad + canvasOffsetY_ui + spacing * i - 20, 100, 40, TextGet("KinkyDungeonAid"), value > 10 ? "white" : "pink"); + if (KDRepSelectionMode == "Rescue") { + DrawButtonKDEx("rep_rescue" + rep, (_bdata) => { + if (KinkyDungeonCanRescue(rep, value)) { + if (KDSendInput("rescue", {rep: rep, value: value}) != "FailRescue") { + KinkyDungeonDrawState = "Game"; + KDRepSelectionMode = ""; + } + } + return true; + }, true, canvasOffsetX_ui + xOffset + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40, TextGet("KinkyDungeonRescue"), (KinkyDungeonCanRescue(rep, value)) ? "white" : (KinkyDungeonAllRestraint().length > 0 && !KinkyDungeonRescued[rep] ? "pink" : "#999999")); + if (MouseIn(canvasOffsetX_ui + xOffset + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40)) { + DrawTextFitKD(TextGet("KinkyDungeonRescueDesc"), 1100, 880, 1250, "white", "black"); + // Rescue + } + } + if (KDRepSelectionMode == "Champion") { + let isChampion = KDGameData.Champion == rep; + DrawButtonKDEx("rep_champ" + rep, (_bdata) => { + KDSendInput("champion", {rep: rep, value: value}); + return true; + }, true, canvasOffsetX_ui + xOffset + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40, TextGet(isChampion ? "KinkyDungeonChampionCurrent" : "KinkyDungeonChampionSwitch"), + (isChampion) ? "white" : "#999999"); + if (MouseIn(canvasOffsetX_ui + xOffset + 275 + XX + 520, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40)) { + DrawTextFitKD(TextGet("KinkyDungeonChampionDesc"), 1100, 880, 1250, "white", "black"); + // Rescue + } + } + + //DrawButtonVis(canvasOffsetX_ui + xOffset + 275 + XX + 690, yPad + canvasOffsetY_ui + spacing * i - 20, 150, 40, TextGet("KinkyDungeonPenance"), "white"); + } + } else KDRepSelectionMode = ""; + + i++; + } + } +} + +let KDFactionRepIndex = 0; +let KDMaxFactionsPerBar = 14; + +function KinkyDungeonDrawFactionRep() { + let xOffset = -100; + let i = 0; + let XX = 675; + let spacing = 42; + let yPad = 45; + let barSpacing = 375; + let tooltip = ""; + + let index = 0; + + for (let e of Object.keys(KinkyDungeonFactionRelations.Player)) { + let rep = e; + if (rep && !KinkyDungeonHiddenFactions.has(rep)) { + index++; + if (index < KDFactionRepIndex * KDMaxFactionsPerBar + 1) continue; + if (index > KDFactionRepIndex * KDMaxFactionsPerBar + KDMaxFactionsPerBar) continue; + if (!tooltip && MouseIn(canvasOffsetX_ui + xOffset + XX, yPad + canvasOffsetY_ui + spacing * i - spacing/2, barSpacing + 200, yPad)) { + tooltip = rep; + } + i++; + } + } + i = 0; + index = 0; + + DrawButtonKDEx("FactionIndexUp", () => { + KDFactionRepIndex -= 0.5; + return true; + }, KDFactionRepIndex > 0, + 1802 + xOffset, 140, 90, 40, "", KDFactionRepIndex > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png"); + + DrawButtonKDEx("FactionIndexDown", () => { + KDFactionRepIndex += 0.5; + return true; + }, KDFactionRepIndex < (Object.keys(KinkyDungeonFactionRelations.Player).length - KDHiddenFactions.length) / KDMaxFactionsPerBar, + 1802 + xOffset, 790, 90, 40, "", KDFactionRepIndex < (Object.keys(KinkyDungeonFactionRelations.Player).length - KDHiddenFactions.length) / KDMaxFactionsPerBar ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png"); + + let text = false; + + for (let e of Object.keys(KinkyDungeonFactionRelations.Player)) { + let rep = e; + + if (rep && !KinkyDungeonHiddenFactions.has(rep)) { + index++; + if (index < KDFactionRepIndex * KDMaxFactionsPerBar + 1) continue; + if (index > KDFactionRepIndex * KDMaxFactionsPerBar + KDMaxFactionsPerBar) continue; + + let value = KinkyDungeonFactionRelations.Player[rep]; + let color = "#e7cf1a"; + if (value <= -0.1) { + if (value <= -0.5) color = "#ff5277"; + else color = "#ff8933"; + } else if (value >= 0.1) { + if (value >= 0.5) color = "#4fd658"; + else color = "#9bd45d"; + } + let suff = KinkyDungeonRepNameFaction(value); + let tcolor = "white"; + switch (rep) { + case "Bountyhunter": tcolor ="#448844"; break; + case "Bandit": tcolor ="orange"; break; + case "Alchemist": tcolor ="lightgreen"; break; + case "Nevermere": tcolor ="teal"; break; + case "Apprentice": tcolor ="lightblue"; break; + case "Dressmaker": tcolor ="#ceaaed"; break; + case "Witch": tcolor ="purple"; break; + case 'Elemental': tcolor ="#f1641f"; break; + case 'Dragon': tcolor ="#b9451d"; break; + case 'Maidforce': tcolor ="white"; break; + case "Bast": tcolor ="#ff5277"; break; + case "Elf": tcolor ="#42a459"; break; + //case 'Mushy': tcolor ="cyan"; break; + case 'AncientRobot': tcolor ="grey"; break; + } + + if (MouseIn(canvasOffsetX_ui + xOffset + XX, yPad + canvasOffsetY_ui + spacing * i - spacing/2, barSpacing + 200, yPad)) { + let allytext = ""; + let enemytext = ""; + let friendstext = ""; + for (let ee of Object.keys(KinkyDungeonFactionRelations.Player)) { + if (!KinkyDungeonHiddenFactions.has(ee)) { + if (rep != ee && KDFactionRelation(rep, ee) >= 0.5) { + if (allytext) allytext += ", "; + allytext += TextGet("KinkyDungeonFaction" + ee); + } + if (rep != ee && KDFactionRelation(rep, ee) > 0.15 && KDFactionRelation(rep, ee) < 0.5) { + if (friendstext) friendstext += ", "; + friendstext += TextGet("KinkyDungeonFaction" + ee); + } + if (rep != ee && KDFactionRelation(rep, ee) <= -0.5) { + if (enemytext) enemytext += ", "; + enemytext += TextGet("KinkyDungeonFaction" + ee); + } + } + } + let loc = {x: 1175, y: 812, fit: 600}; + if (KDFactionRepIndex > 0.1) { + loc = {x: canvasOffsetX_ui + xOffset, y: 820, fit: 1400}; + } + if (!text) { + if (enemytext) { + text = true; + DrawTextFitKD(TextGet("KDFriendsWith") + friendstext, loc.x, loc.y, loc.fit, "white", KDTextGray1, 20, "left"); + } + if (allytext) { + text = true; + DrawTextFitKD(TextGet("KDAlliedWith") + allytext, loc.x, loc.y + 30, loc.fit, "white", KDTextGray1, 20, "left"); + } + if (enemytext) { + text = true; + DrawTextFitKD(TextGet("KDHostileWith") + enemytext, loc.x, loc.y + 60, loc.fit, "white", KDTextGray1, 20, "left"); + } + } + + } + + if (tooltip && tooltip != rep) { + tcolor = "gray"; + if (KDFactionRelation(rep, tooltip) <= -0.5) tcolor = "#ff5277"; + else if (KDFactionRelation(rep, tooltip) <= -0.25) tcolor = "orange"; + else if (KDFactionRelation(rep, tooltip) <= -0.1) tcolor = "yellow"; + else if (KDFactionRelation(rep, tooltip) >= 0.5) tcolor = "cyan"; + else if (KDFactionRelation(rep, tooltip) >= 0.25) tcolor = "#569eb8"; + else if (KDFactionRelation(rep, tooltip) >= 0.1) tcolor = "#597085"; + } else if (tooltip == rep) { + tcolor = "white"; + } + + DrawTextKD(TextGet("KinkyDungeonFaction" + rep), canvasOffsetX_ui + xOffset + XX, yPad + canvasOffsetY_ui + spacing * i, tcolor, KDTextGray1, undefined, "left"); + if (suff) { + DrawTextFitKD(suff, canvasOffsetX_ui + xOffset + barSpacing + XX + 250, yPad + canvasOffsetY_ui + spacing * i, 100, "white", "black", undefined, "left"); + } + // Draw between the % and bar and suffix if debug mode is active. + if (KDDebugMode) { + DrawButtonKDEx("minusfactionrep" + rep, (_bdata) => { + KinkyDungeonChangeFactionRep(rep, -0.1) + return true; + }, true, canvasOffsetX_ui + xOffset + barSpacing + XX - 30, yPad + canvasOffsetY_ui + spacing * i - 15, 30, 30, "-", "#ffffff"); + DrawButtonKDEx("plusfactionrep" + rep, (_bdata) => { + KinkyDungeonChangeFactionRep(rep, 0.1) + return true; + }, true, canvasOffsetX_ui + xOffset + barSpacing + XX + 203, yPad + canvasOffsetY_ui + spacing * i - 15, 30, 30, "+", "#ffffff"); + } + DrawProgressBar(canvasOffsetX_ui + xOffset + barSpacing + XX, yPad + canvasOffsetY_ui + spacing * i - spacing/4, 200, spacing/2, 50 + value * 50, color, KDTextGray2); + + DrawTextKD(" " + (Math.round(value * 50)+50) + " ", canvasOffsetX_ui + xOffset + barSpacing + XX + 100, 1+yPad + canvasOffsetY_ui + spacing * i, "white", "black"); + + + i++; + if (i > KDMaxFactionsPerBar + 1) { + break; + } + } + + } + return tooltip; +} + +/** + * Current costs multipliers for shrines + */ +let KinkyDungeonPenanceCosts: Record = {}; +let KinkyDungeonPenanceRepBonus = 5; +let KinkyDungeonPenanceRepBonusFail = 1; +let KinkyDungeonPenanceCostGrowth = 50; +let KinkyDungeonPenanceCostDefault = 200; + +/** + * @param rep + */ +function KinkyDungeonPenanceCost(rep: string): number { + if (KinkyDungeonGoddessRep[rep]) { + if (KinkyDungeonPenanceCosts[rep]) { + return KinkyDungeonPenanceCosts[rep]; + } + } + return KinkyDungeonPenanceCostDefault; +} + +/** + * @param rep + * @param value + */ +function KinkyDungeonCanPenance(_rep: string, value: number): boolean { + return value < 40 && !KDGameData.KinkyDungeonPenance && KDMapData.Bullets.length < 1; +} + +/** + * @param rep + * @param value + */ +function KinkyDungeonAidManaCost(_rep: string, value: number): number { + let percent = (value + 50)/100; + return Math.ceil((1 - KinkyDungeonStatMana/KinkyDungeonStatManaMax) * 15 * Math.max(0.3, Math.min(1, 1.3 - percent))); +} + +/** + * @param rep + * @param value + */ +function KinkyDungeonAidManaAmount(_rep: string, _value: number): number { + return KinkyDungeonStatManaMax - KinkyDungeonStatMana;//1 + Math.floor(19 * (value + 50) / 100); +} + +/** + * @param rep + * @param value + */ +function KinkyDungeonCanAidMana(_rep: string, value: number): boolean { + return value > -30 && KinkyDungeonStatMana < KinkyDungeonStatManaMax; +} + +function KinkyDungeonRescueTiles(): { x: number, y: number }[] { + let tiles: { x: number, y: number }[] = []; + for (let X = KinkyDungeonPlayerEntity.x - 1; X <= KinkyDungeonPlayerEntity.x + 1; X++) + for (let Y = KinkyDungeonPlayerEntity.y - 1; Y <= KinkyDungeonPlayerEntity.y + 1; Y++) { + if (X != 0 || Y != 0) { + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) && KinkyDungeonNoEnemy(X, Y, true)) { + tiles.push({x:X, y:Y}); + } + } + } + return tiles; +} + +/** + * @param rep + * @param value + */ +function KinkyDungeonCanRescue(rep: string, value: number): boolean { + return KinkyDungeonAllRestraint().length > 0 && value > KDRAGE && !KinkyDungeonRescued[rep] && KinkyDungeonRescueTiles().length > 0; +} + +/** + * @param delta + */ +function KinkyDungeonUpdateAngel(_delta: number): void { + // Remove it + if (KinkyDungeonFlags.get("AngelHelp") > 0 && KinkyDungeonFlags.get("AngelHelp") < 5) { + for (let t of Object.entries(KDMapData.Tiles)) { + if (t[1].Type == "Angel") { + let x = parseInt(t[0].split(',')[0]); + let y = parseInt(t[0].split(',')[1]); + if (x && y) { + if (t[0] == KinkyDungeonTargetTileLocation) { + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + } + KinkyDungeonTilesDelete(t[0]); + KinkyDungeonMapSet(x, y, '0'); + } + } + } + } +} diff --git a/Game/src/fight/KinkyDungeonFight.ts b/Game/src/fight/KinkyDungeonFight.ts new file mode 100644 index 000000000..69ab525ea --- /dev/null +++ b/Game/src/fight/KinkyDungeonFight.ts @@ -0,0 +1,3389 @@ +"use strict"; +let KinkyDungeonKilledEnemy = null; +let KinkyDungeonAlert = 0; + +let KDMaxPreviousWeapon = 4; + +let KDMINDAMAGENOISE = 2; +let KDDMGSOUNDMULT = 1.5; + +let KDBrawlerAmount = 1.0; +let KDClumsyAmount = 0.7; +let KDUnfocusedParams = { + AmountMin: 0.1, + AmountMax: 0.4, + ThreshMin: 0.1, + ThreshMax: 0.9, +}; + +interface KDBulletVisual { + end: boolean, + temporary: boolean, + zIndex: number, + spin: number, + spinAngle: number, + name: string, + size: number, + spriteID: string, + xx:number, + yy:number, + visual_x: number, + visual_y: number, + aoe?: boolean, + updated: boolean, + vx: number, + vy: number, + scale: number, + alpha: number, + delay: number}; + +let KDDodgeAmount = 0.75; +let KinkyDungeonMissChancePerBlind = 0.1; // Max 3 +let KinkyDungeonBlockMissChancePerBlind = 0.1; // Max 3 +let KinkyDungeonMissChancePerSlow = 0.1; // Max 3 +KDMapData.Bullets = []; // Bullets on the game board +let KinkyDungeonBulletsVisual: Map = new Map(); // Bullet sprites on the game board +let KinkyDungeonBulletsID = {}; // Bullets on the game board + +let KDVulnerableDmg = 1.0; +let KDVulnerableHitMult = 2.00; + +let KDVulnerableBlockHitMult = 2.0; +let KDPacifistReduction = 0.1; +let KDEnemyResistHPMult = 1.4; +let KDRiggerDmgBoost = 0.2; +let KDRiggerBindBoost = 0.3; +let KDStealthyHPMult = 1.5; +let KDStealthyEvaMult = 0.8; +let KDResilientHPMult = 1.3; +let KDStealthyEnemyCountMult = 1.7; +let KDBoundPowerMult = 0.4; +let KDBerserkerAmp = 0.3; +let KDUnstableAmp = 0.6; + +let KDFightParams = { + KDFreezeMeleeMult: 1.5, + KDFreezeShatterMult: 2.5, +}; + +let KinkyDungeonOpenObjects = KinkyDungeonTransparentObjects; // Objects bullets can pass thru +let KinkyDungeonMeleeDamageTypes = ["unarmed", "crush", "slash", "pierce", "grope", "pain", "chain", "tickle"]; +let KinkyDungeonTeaseDamageTypes = ["tickle", "charm", "grope", "pain", "plush"]; +let KinkyDungeonPacifistDamageTypes = ["tickle", "charm", "grope", "pain", "chain", "glue", "grope", "soul"]; +let KinkyDungeonStunDamageTypes = ["fire", "electric", "stun"]; +let KinkyDungeonBindDamageTypes = ["chain", "glue", "holy"]; +let KinkyDungeonFreezeDamageTypes = ["ice"]; +let KinkyDungeonSlowDamageTypes = ["crush", "slash", "pierce", "soap", "frost", "cold", "poison"]; +let KinkyDungeonVulnerableDamageTypes = ["tickle", "acid", "magicbind", "estim"]; +let KinkyDungeonMeltDamageTypes = ["fire", "holy", "acid"]; +let KinkyDungeonShatterDamageTypes = ["crush", "stun", "fire"]; +let KinkyDungeonDismantleDamageTypes = ["stun", "fire", ...KinkyDungeonMeleeDamageTypes, "electric", "holy", "acid", "magicbind", "cold", "ice", "soap"]; +let KinkyDungeonIgnoreShieldTypes = ["soul", "holy"]; +let KinkyDungeonIgnoreBlockTypes = ["soul", "charm", "gas"]; + +let KDTorchExtinguishTypes = ["ice", "frost", "cold", "soap", "water", "stun", "glue"]; +let KDSlimeExtinguishTypes = ["ice", "frost", "cold", "acid", "soap", "water"]; +let KDIgnitionSources = ["fire", "electric"]; + +let KDDamageEquivalencies = { + "frost": "ice", + //"happygas": "charm", + "souldrain": "soul", + "drain": "soul", + "shock": "electric", + "blast": "stun", + "estim": "electric", +}; + +let KDDamageBinds = { + "glue": "Slime", + "ice": "Ice", + "frost": "Ice", + "crush": "Metal", +}; +let KDSpellTagBinds = { + "rope": "Rope", + "leather": "Leather", + "chain": "Metal", + "metal": "Metal", + "vine": "Vine", + "nature": "Vine", +}; + +let KDResistanceProfiles = { + // Its rope. what do you expect. + rope: KDMapInit(["poisonresist", "fireweakness", "slashweakness", "acidweakness", "chainresist", ]), + // Generic resistances for constructs + construct: KDMapInit(["soulimmune", "charmimmune", "poisonimmune"]), + // Catgirls dont like water. And are snuggly + catgirl: KDMapInit(["acidweakness", "soapweakness", "stunweakness", "coldresist", "plushweakness"]), + // Catsuits dont do much for the insulation, but resist chemicals + alchemist: KDMapInit(["electricresist", "iceweakness", "glueresist", "acidresist", "soapresist", "gropeweakness"]), + // Slimes are weak to concentrated mana + slime: KDMapInit(["arcaneweakness"]), +}; + +/** + * These also are affected by resistances to the second damage type, but not weaknesses + * Repeats up to 3 times + */ +let KinkyDungeonDamageTypesExtension = { + "tickle": "charm", + "grope": "charm", + "pain": "charm", + "happygas": "charm", + "poisongas": "poison", + "charm": "soul", +}; + +let KinkyDungeonBindingDamageTypes = ["chain", "glue", "magicbind"]; +let KinkyDungeonDistractDamageTypes = ["tickle", "grope", "happygas", "charm"]; +let KinkyDungeonMasochistDamageTypes = ["crush", "pain", "unarmed", "electric", "shock", "fire", "magicbind", "glue", "chain", "souldrain", "drain"]; + +// Weapons +let KinkyDungeonPlayerWeapon = ""; +let KinkyDungeonPlayerWeaponLastEquipped = ""; +let KinkyDungeonPlayerDamageDefault: weapon = {name: "", damage: 2, chance: 0.9, type: "unarmed", unarmed: true, rarity: 0, shop: false, sfx: "Unarmed"}; +let KinkyDungeonPlayerDamage: weapon = KinkyDungeonPlayerDamageDefault; + +let KinkyDungeonDamageTypes = { + heal: {name: "heal", color: "#88ff88", bg: "black", harmless: true}, + holy: {name: "holy", color: "#ffff88", bg: "black"}, + acid: {name: "acid", color: "#9bd45d", bg: "black"}, + soap: {name: "soap", color: "#44aaff", bg: "black"}, + cold: {name: "cold", color: "#554bd4", bg: "black"}, + arcane: {name: "arcane", color: "#ff5277", bg: "black"}, + ice: {name: "ice", color: "#00D8FF", bg: "black"}, + frost: {name: "ice", color: "#00D8FF", bg: "black"}, + fire: {name: "fire", color: "#FF6A00", bg: "black"}, + poison: {name: "poison", color: "#00D404", bg: "black"}, + poisongas: {name: "poisongas", color: "#20E424", bg: "black"}, + happygas: {name: "happygas", color: "#E27CD0", bg: "black"}, + charm: {name: "charm", color: "#E27CD0", bg: "black"}, + soul: {name: "soul", color: "#E27CD0", bg: "black"}, + drain: {name: "soul", color: "#E27CD0", bg: "black"}, + souldrain: {name: "soul", color: "#E27CD0", bg: "black"}, + electric: {name: "electric", color: "#FFD800", bg: "black"}, + estim: {name: "estim", color: "#ff52eb", bg: "black"}, + glue: {name: "glue", color: "#E200D0", bg: "black"}, + stun: {name: "stun", color: "#f4f390", bg: "black"}, + chain: {name: "chain", color: "#ffffff", bg: "black"}, + tickle: {name: "tickle", color: "#72a6b7", bg: "black"}, + plush: {name: "plush", color: "#92c6d7", bg: "black"}, + crush: {name: "crush", color: "#a16640", bg: "black"}, + grope: {name: "grope", color: "#ffabe5", bg: "black"}, + slash: {name: "slash", color: "#a14052", bg: "black"}, + pierce: {name: "pierce", color: "#9c5f7b", bg: "black"}, + pain: {name: "pain", color: "#aa80d1", bg: "black"}, + unarmed: {name: "unarmed", color: "#dcc186", bg: "black"}, + magic: {name: "magic", color: "#00FF90", bg: "black"}, + melee: {name: "melee", color: "#aaaaaa", bg: "black"}, + spell: {name: "spell", color: "#00FF90", bg: "black"}, +}; + +/** + * @param item + */ +function KDWeapon(item: Named): weapon { + if (!item) return null; + return KinkyDungeonWeapons[KinkyDungeonWeaponVariants[item.name]?.template || item.name]; +} + + +function KinkyDungeonFindWeapon(Name: string) { + for (let con of Object.values(KinkyDungeonWeapons)) { + if (con.name == Name) return con; + } + return undefined; +} + +function KinkyDungeonWeaponCanCut(RequireInteract: boolean, MagicOnly?: boolean): boolean { + if (KinkyDungeonPlayerWeapon + && KDWeapon({name: KinkyDungeonPlayerWeapon})?.cutBonus != undefined + && (!MagicOnly || KDWeaponIsMagic({name: KinkyDungeonPlayerWeapon})) + && (!RequireInteract || !KinkyDungeonIsHandsBound(false, false, 0.55))) return true; + if (KinkyDungeonPlayerBuffs) { + for (let b of Object.values(KinkyDungeonPlayerBuffs)) { + if (b && b.tags && (b.tags.includes("allowCutMagic") || (!MagicOnly && b.tags.includes("allowCut")))) return true; + } + } + return false; +} + +/** + * We reset the pity timer on weapon switch to prevent issues + * @param Weapon + * @param [forced] + */ +function KDSetWeapon(Weapon: string, forced?: boolean) { + if (!Weapon) Weapon = 'Unarmed'; + KinkyDungeonEvasionPityModifier = 0; + KinkyDungeonPlayerWeapon = Weapon; + if (!forced) + KinkyDungeonPlayerWeaponLastEquipped = Weapon; +} + +/* +function KDCanWieldWeapon(weapon, HandsFree, NoOverride) { + let flags = { + KDDamageHands: true.valueOf, + KDDamageArms: true.valueOf, + }; + if (!NoOverride) + KinkyDungeonSendEvent("calcDamage", {flags: flags}); + if (weapon && weapon.noHands) HandsFree = true; + let armBondage = KinkyDungeonIsArmsBound(false, true); + if (!HandsFree + || (KinkyDungeonStatsChoice.get("Brawler") && !KinkyDungeonPlayerWeapon) + || (weapon.clumsy && flags.KDDamageArms && armBondage)) { + return false; + } + return true; +}*/ + +function KinkyDungeonGetPlayerWeaponDamage(HandsFree?: boolean, NoOverride?: boolean): weapon { + let flags = { + KDDamageHands: true.valueOf, + KDDamageArms: true.valueOf, + }; + let damage = KinkyDungeonPlayerDamageDefault; + let weapon = KDWeapon({name: KinkyDungeonPlayerWeapon}); + if (weapon && weapon?.noHands) HandsFree = true; + + let data = {flags: flags, accuracyMult: 1.0, damageMult: 1.0, weapon: weapon, HandsFree: HandsFree, + canUse: KinkyDungeonCanUseWeapon(NoOverride, undefined, weapon), + forceUse: false, // Set this to true if you want to disable accuracy penalty from Telekinesis 101 + handBondage: KDHandBondageTotal(true), + armBondage : KinkyDungeonIsArmsBound(false, true), + legBondage: !KDGetAvailablePosesLegs(KinkyDungeonPlayer, undefined, true) + .includes("Spread"), + brawler: KinkyDungeonStatsChoice.get("Brawler"), + }; + + if (!NoOverride) + KinkyDungeonSendEvent("calcDamage", data); + + if (!NoOverride) + KinkyDungeonSendEvent("calcDamage2", data); + + if (!data.canUse && !weapon?.unarmed) { + damage = KinkyDungeonPlayerDamageDefault; + if (!NoOverride) { + if (weapon && KinkyDungeonInventoryGetWeapon(KinkyDungeonPlayerWeapon)) + KinkyDungeonSendTextMessage(10, TextGet("KDCantWield").replace("WPN", KDGetItemName(KinkyDungeonInventoryGetWeapon(KinkyDungeonPlayerWeapon))), + "#ff5277", 1, false, true, undefined, "Action"); + KDSetWeapon('Unarmed', true); + } + } else if (KinkyDungeonPlayerWeapon && weapon) { + damage = weapon; + } + + + KinkyDungeonPlayerDamage = JSON.parse(JSON.stringify(damage)); + if (KinkyDungeonWeaponVariants[KinkyDungeonPlayerWeapon]) { + if (!KinkyDungeonPlayerDamage.events) KinkyDungeonPlayerDamage.events = []; + KinkyDungeonPlayerDamage.events.push(...KinkyDungeonWeaponVariants[KinkyDungeonPlayerWeapon].events); + } + + + + if (KinkyDungeonStatsChoice.get("Brawler") && isUnarmed(KinkyDungeonPlayerDamage)) { + KinkyDungeonPlayerDamage.damage += KDBrawlerAmount; + } + + + if (((KDForcedToGround() || data.legBondage || KinkyDungeonSlowLevel > 1) && data.armBondage) + && (flags.KDDamageHands || weapon?.unarmed) && (!weapon || !weapon.noHands || weapon.unarmed)) { + // Total helplessness + KinkyDungeonPlayerDamage.chance *= (KDForcedToGround() || data.legBondage) ? 0.5 + : Math.max(0.5, Math.min(1.0, 1.25 - 0.25 * KinkyDungeonSlowLevel)); + + if ((!data.brawler || !weapon?.unarmed) && !KDWeaponNoDamagePenalty(KinkyDungeonPlayerDamage)) + KinkyDungeonPlayerDamage.damage *= KDIsHogtied() ? 0.01 : 0.5; + } + + if (data.legBondage || !data.brawler || !isUnarmed(KinkyDungeonPlayerDamage)) { + if (data.armBondage && (flags.KDDamageArms || isUnarmed(KinkyDungeonPlayerDamage)) + && (!weapon?.noHands)) { + KinkyDungeonPlayerDamage.chance *= KDIsHogtied(KinkyDungeonPlayer) ? 0.1 : 0.5; + if ((!data.brawler || !isUnarmed(KinkyDungeonPlayerDamage)) + && !KDWeaponNoDamagePenalty(KinkyDungeonPlayerDamage)) + KinkyDungeonPlayerDamage.damage /= 2; + } else if (data.handBondage && (flags.KDDamageHands || isUnarmed(KinkyDungeonPlayerDamage)) + && (!weapon || !weapon.noHands || (!data.brawler && isUnarmed(KinkyDungeonPlayerDamage)))) { + KinkyDungeonPlayerDamage.chance *= 0.5 + Math.max(0, 0.5 * Math.min(1, data.handBondage)); + if ((!data.brawler || !isUnarmed(KinkyDungeonPlayerDamage)) + && !KDWeaponNoDamagePenalty(KinkyDungeonPlayerDamage)) + KinkyDungeonPlayerDamage.damage *= 0.5 + Math.max(0, 0.5 * Math.min(1, data.handBondage)); + } + if (KinkyDungeonSlowLevel > 1) { + if (!data.brawler && !isUnarmed(KinkyDungeonPlayerDamage)) + KinkyDungeonPlayerDamage.damage *= Math.max(0.5, Math.min(1.0, 1.25 - 0.25 * KinkyDungeonSlowLevel)); + } + } + + KinkyDungeonPlayerDamage.chance *= data.accuracyMult; + KinkyDungeonPlayerDamage.damage *= data.damageMult; + return KinkyDungeonPlayerDamage; +} +/** + * @param weapon + * @returns true if the weapon represents Unarmed + */ +function isUnarmed(weapon: weapon): boolean { + return !weapon || !weapon.name || weapon.name == "Unarmed" || weapon.unarmed; +} + + +let KinkyDungeonEvasionPityModifier = 0; // Current value +let KinkyDungeonEvasionPityModifierIncrementPercentage = 0.5; // Percent of the base hit chance to add +let KDDefaultCrit = 1.3; +let KDDefaultBindCrit = 1.5; + +function KinkyDungeonGetCrit(accuracy?: number, Damage?: damageInfo, Enemy?: entity) { + if (accuracy == undefined) accuracy = KinkyDungeonGetEvasion(); + let data = { + Damage: Damage, + accuracy: accuracy, + enemy: Enemy, + basecrit: Damage?.crit || KDDefaultCrit, + critmult: 1.0 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerEntity, "CritMult"), + critboost: 0.0 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerEntity, "CritBoost"), + }; + KinkyDungeonSendEvent("calcCrit", data); + + return (data.basecrit + data.critboost) * data.critmult; +} +function KinkyDungeonGetBindCrit(accuracy?: number, Damage?: damageInfo, Enemy?: entity) { + if (accuracy == undefined) accuracy = KinkyDungeonGetEvasion(); + let data = { + Damage: Damage, + accuracy: accuracy, + enemy: Enemy, + basecrit: Damage?.bindcrit || KDDefaultBindCrit, + critmult: 1.0, + critboost: 0.0, + }; + KinkyDungeonSendEvent("calcBindCrit", data); + + return (data.basecrit + data.critboost) * data.critmult; +} + +function KDGetSpellAccuracy() { + let data = { + accuracy: KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Accuracy")), + accuracyBonus: 0, + accuracyMult: 1, + }; + KinkyDungeonSendEvent("calcSpellAccuracy", data); + return (data.accuracy + data.accuracyBonus) * data.accuracyMult; +} + +function KDGetSlowMult(Enemy: entity): number { + let mult = 1; + + if (Enemy && Enemy.bind > 0) mult *= 2; + else if (Enemy && Enemy.slow > 0) mult *= 1.4; + + if (Enemy && KinkyDungeonIsStunned(Enemy)) mult *= 5; + else { + if (Enemy && Enemy.distraction > 0) mult *= 1 + 2 * Math.min(1, Enemy.distraction / Enemy.Enemy.maxhp); + if (Enemy) mult *= 1 + 0.125 * KDBoundEffects(Enemy); + } + + return mult; +} + +let KDSTAMPENTYPE = { + Weapon: { + onEvasion: (data) => { + let perk = "Focused"; + let focusStat = "WepDPAccPenalty"; + let accPenMult = KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(KDPlayer(), focusStat) + + (KinkyDungeonStatsChoice.get(perk) ? 9 : 0)) + let amount = 1; + let dist = KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax; + if (dist >= KDUnfocusedParams.ThreshMin) { + amount = (1 - accPenMult*KDUnfocusedParams.AmountMin) + + ((1 - accPenMult*KDUnfocusedParams.AmountMax) - (1 - accPenMult*KDUnfocusedParams.AmountMin)) + * (dist - KDUnfocusedParams.ThreshMin) + / (KDUnfocusedParams.ThreshMax - KDUnfocusedParams.ThreshMin); + } + if (amount != 1) data.hitmult *= amount; + }, + }, + Staff: { + onAttack: (data) => { + let perk = "FocusedStaff"; + let focusStat = "WepDPStamPenalty"; + let accPenMult = KinkyDungeonMultiplicativeStat(-KDEntityBuffedStat(KDPlayer(), focusStat) + + (KinkyDungeonStatsChoice.get(perk) ? 9 : 0)) + let amount = 1; + let dist = KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax; + if (dist >= KDUnfocusedParams.ThreshMin) { + amount = (1 - accPenMult*KDUnfocusedParams.AmountMin) + + ((1 - accPenMult*KDUnfocusedParams.AmountMax) - (1 - accPenMult*KDUnfocusedParams.AmountMin)) + * (dist - KDUnfocusedParams.ThreshMin) + / (KDUnfocusedParams.ThreshMax - KDUnfocusedParams.ThreshMin); + } + if (amount != 1) data.attackCost /= amount; + } + }, +} + +function KinkyDungeonGetEvasion(Enemy?: entity, NoOverride?: boolean, IsSpell?: boolean, IsMagic?: boolean, cost?: boolean): number { + let flags = { + KDEvasionHands: true, + KDEvasionSight: true, + KDEvasionDeaf: true, + KDEvasionSlow: true, + }; + let data = {enemy: Enemy, + isSpell: IsSpell, + isMagic: IsMagic, + flags: flags, + cost: cost, + hitmult: 1.0, + stamPenType: IsSpell ? "Spell" : KDWeaponStamPenType(KinkyDungeonPlayerDamage), + }; + + if (!NoOverride) + KinkyDungeonSendEvent("calcEvasion", data); + let hitChance = (Enemy && Enemy.buffs) ? KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(Enemy.buffs, "Evasion")) : 1.0; + + + if (KinkyDungeonStatsChoice.get("Clumsy")) hitChance *= KDClumsyAmount; + if (KDSTAMPENTYPE[data.stamPenType]?.onEvasion) { + KDSTAMPENTYPE[data.stamPenType].onEvasion(data); + } + + hitChance *= data.hitmult; + + if (Enemy && Enemy.Enemy && Enemy.Enemy.evasion && ((!(Enemy.stun > 0) && !(Enemy.freeze > 0)) || Enemy.Enemy.alwaysEvade || Enemy.Enemy.evasion < 0)) hitChance *= Math.max(0, + (Enemy.aware ? KinkyDungeonMultiplicativeStat(Enemy.Enemy.evasion) : Math.max(1, KinkyDungeonMultiplicativeStat(Enemy.Enemy.evasion)))); + if (Enemy && Enemy.Enemy && Enemy.Enemy.tags.ghost && (IsMagic || (KinkyDungeonPlayerDamage && KDWeaponIsMagic({name: KinkyDungeonPlayerWeapon})))) hitChance = Math.max(hitChance, 1.0); + if (Enemy && Enemy.Enemy && Enemy.Enemy.Resistance?.alwaysHitByMagic && (IsMagic || (KinkyDungeonPlayerDamage && KDWeaponIsMagic({name: KinkyDungeonPlayerWeapon})))) hitChance = Math.max(hitChance, 1.0); + + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Accuracy")) { + hitChance *= KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Accuracy")); + } + + if (!IsSpell) hitChance *= KinkyDungeonPlayerDamage.chance; + let slowMult = KDGetSlowMult(Enemy); + hitChance *= slowMult; + if (Enemy && Enemy.vulnerable) hitChance *= KDVulnerableHitMult; + + if (!IsSpell) { + if (flags.KDEvasionSight) + hitChance = Math.min(hitChance, Math.max(0.1, hitChance - Math.min(3, KinkyDungeonBlindLevel) * KinkyDungeonMissChancePerBlind)); + if (flags.KDEvasionSlow && KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.name && KinkyDungeonSlowLevel > 0) hitChance *= 1.0 - Math.max(0.5, KinkyDungeonMissChancePerSlow * KinkyDungeonSlowLevel); + } + return hitChance; +} + + +function KinkyDungeonAggro(Enemy: entity, Spell: spell, Attacker: entity, Faction?: string) { + if (Enemy?.Enemy + && (!Spell || !Spell.enemySpell) + && (!Spell || !Spell.noAggro) + && (!Faction || Faction == "Player") + && !(Enemy.rage > 0) + && (Attacker?.player || (!Attacker && (Spell || Faction == "Player")))) { + if (Enemy.playWithPlayer && (KDCanDom(Enemy) || !KDHostile(Enemy))) { + KDAddThought(Enemy.id, "Embarrassed", 5, 1); + Enemy.distraction = (Enemy.distraction || 0) + Enemy.Enemy.maxhp * 0.1; + if (KDCanDom(Enemy)) { + if (!KDEntityHasFlag(Enemy, "playOpin")) { + KDAddOpinionPersistent(Enemy.id, 1); + KinkyDungeonSetEnemyFlag(Enemy, "playOpin", -1); + } + } + } else { + KinkyDungeonApplyBuffToEntity(Enemy, KDAdrenaline, { + duration: 4, + power: 0.8, + }); + KinkyDungeonApplyBuffToEntity(Enemy, KDAdrenaline2, { + duration: 2, + power: 0.5, + }); + if (Enemy && !Enemy.Enemy.allied) { + if (Enemy.vp) Enemy.vp = Math.min(2, Enemy.vp*2); + KinkyDungeonSetFlag("PlayerCombat", 8); + if (!Enemy.hostile) { + KDAddOpinionPersistent(Enemy.id, -10); + } + KinkyDungeonAggroAction('attack', {enemy: Enemy}); + } + } + } +} + +function KDPlayerEvasionPenalty() { + if (KinkyDungeonFlags.get("ZeroResistance")) return 1000; + let evasionPenalty = .25 * KinkyDungeonSlowLevel; + if (KinkyDungeonStatBlind > 0) evasionPenalty += 0.5; + if (KDGameData.MovePoints < 0) evasionPenalty += 0.5; + if (KinkyDungeonStatFreeze) evasionPenalty += 1; + + evasionPenalty += KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "EvasionPenalty"); + + return evasionPenalty; +} +function KDPlayerBlockPenalty() { + if (KinkyDungeonFlags.get("ZeroResistance")) return 1000; + let blockPenalty = Math.min(0.5, .1 * KinkyDungeonBlindLevel); + + if (KinkyDungeonIsArmsBound(false, true)) blockPenalty = blockPenalty + (1 - blockPenalty) * 0.7; + if (KinkyDungeonStatFreeze) blockPenalty += 1; + if (KinkyDungeonStatBlind) blockPenalty += 0.5; + + blockPenalty += KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BlockPenalty"); + + + return Math.min(1, blockPenalty); +} +function KDRestraintBlockPenalty() { + if (KinkyDungeonFlags.get("ZeroResistance")) return 1000; + let RestraintBlockPenalty = .1 * KinkyDungeonSlowLevel; + if (KinkyDungeonIsArmsBound(false, true)) RestraintBlockPenalty += .25; + if (KinkyDungeonStatFreeze) RestraintBlockPenalty += 0.8; + if (KinkyDungeonStatBlind) RestraintBlockPenalty += 0.4; + + RestraintBlockPenalty += KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "RestraintBlockPenalty"); + + + return RestraintBlockPenalty; +} + +function KDCalcRestraintBlock() { + let RestraintBlock = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "RestraintBlock"); + let RestraintBlockPenalty = KDRestraintBlockPenalty(); + let val = RestraintBlock * Math.max(0, 1 - RestraintBlockPenalty) + + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "RestraintBlockProtected"); + + return val; +} + +function KinkyDungeonPlayerEvasion(Event?: boolean): number { + let data = { + playerEvasionMult: 1.0, + penalty: KDPlayerEvasionPenalty(), + eva: KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Evasion"), + evaPenalty: 0, + val: 0 + }; + + data.evaPenalty = data.eva > 0 ? Math.min(1, data.penalty) : 0; + + + KinkyDungeonSendEvent(Event ? "beforecalcPlayerEvasionEvent" : "beforecalcPlayerEvasion", data); + data.val = data.playerEvasionMult * KinkyDungeonMultiplicativeStat(data.eva * (1 - data.evaPenalty) / Math.max(1, data.penalty) + + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "EvasionProtected")); + + KinkyDungeonSendEvent(Event ? "calcPlayerEvasionEvent" : "calcPlayerEvasion", data); + + return data.val; +} + +function KinkyDungeonPlayerBlock(_Event?: boolean): number { + let playerBlockMult = 1.0; + let blk = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Block"); + let playerBlockPenalty = blk > 0 ? Math.min(1, KDPlayerBlockPenalty()) : 0; + let val = playerBlockMult * KinkyDungeonMultiplicativeStat(blk * (1 - playerBlockPenalty) + + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BlockProtected")); + + return val; +} + +function KinkyDungeonPlayerBlockLinear() { + let playerBlockMult = 1.0; + let blk = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Block"); + let playerBlockPenalty = blk > 0 ? Math.min(1, KDPlayerBlockPenalty()) : 0; + let val = playerBlockMult * (blk * (1 - playerBlockPenalty) + + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BlockProtected")); + + return val; +} + +function KinkyDungeonGetPlayerStat(stat: any, mult?: number) { + let data = { + mult: mult, + stat: !mult ? KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, stat) : KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, stat)), + }; + KinkyDungeonSendEvent("calcPlayer" + stat, data); + + return data.stat; +} + +function KDRestraintBlockPower(block: any, power: number): number { + return KinkyDungeonMultiplicativeStat(block / Math.max(1, power)); +} + +function KinkyDungeonEvasion(Enemy: entity, IsSpell?: boolean, IsMagic?: boolean, Attacker?: entity, chance?: number) { + + + let hitChance = chance != undefined ? chance : KinkyDungeonGetEvasion(Enemy, undefined, IsSpell, IsMagic, true); + + if (KDHostile(Enemy) && KinkyDungeonStatsChoice.get("Stealthy")) { + hitChance *= KDStealthyEvaMult; + } + + if (!Enemy) KinkyDungeonSleepTime = 0; + + let dodged = false; + if (hitChance > 0) { + if ((Enemy.lifetime > 9000 || !Enemy.maxlifetime)) KinkyDungeonAggro(Enemy, undefined, Attacker); + // Smart enemies wont even try if they cant dodge it. Dumb enemies will + if (Enemy.dodges >= 1 && (Enemy.dodges >= hitChance || KDRandom() < 1 - 0.2 * KDEnemyRank(Enemy))) { + if (Enemy?.Enemy.preferDodge || Enemy.hp < 0.5 * Enemy.Enemy.maxhp || ((!Enemy.blocks || Enemy.blocks < 1 || !KDCanBlock(Enemy)) && Enemy.hp < 0.65 * Enemy.Enemy.maxhp) || ((Enemy.hp < 0.9 * Enemy.Enemy.maxhp ? true : KDRandom() < 0.33))) { + while (Enemy?.dodges >= 1 && KDCanDodge(Enemy) && hitChance > 0) { + hitChance -= 1; + // The way this works: + // Positive accuracy has higher hitchance, so it requires more dodges + // Negative accuracy has a chance to not consume the dodge token + if (hitChance >= 0 || KDRandom() > -hitChance) + Enemy.dodges = Math.max(0, Enemy.dodges - 1); + Enemy.blockedordodged = (Enemy.blockedordodged || 0) + 1; + dodged = true; + } + } + } + + + if (dodged) { + let point = KinkyDungeonGetNearbyPoint(Enemy.x, Enemy.y, true, undefined, true, true, (x, y) => {return x != Enemy.x && y != Enemy.y;}); + if (point) { + KDMoveEntity(Enemy, point.x, point.y, true, true, true, false); + Enemy.movePoints = 0; + if (!Enemy.Enemy.attackWhileMoving) { + Enemy.attackPoints = 0; + Enemy.warningTiles = []; + } + } + } + } + + if (!dodged && hitChance > 0.6) return true; + + + if (KDRandom() < hitChance + KinkyDungeonEvasionPityModifier) { + KinkyDungeonEvasionPityModifier = 0; // Reset the pity timer + return true; + } + + if (Enemy) { + // Increment the pity timer + KinkyDungeonEvasionPityModifier += KinkyDungeonEvasionPityModifierIncrementPercentage * hitChance; + } + + return false; +} + + +/** + * + * @param {Record} tags + * @param {string[] | undefined} profile + * @param {string} type + * @param {string} resist + * @param {number} mode - 0 = either, 1 = specific, 2 = general + * @returns {boolean} + */ +function KinkyDungeonGetImmunity(tags, profile, type, resist, mode = 0) { + + let doFunc = (t) => { + if (!mode || mode == 1) { + if (tags && tags[t + resist]) + return true; + if (profile) { + for (let pp of profile) { + let p = KDResistanceProfiles[pp]; + if (p && (p[t + resist])) + return true; + } + } + } + if (!mode || mode == 2) { + if (tags && (((KinkyDungeonMeleeDamageTypes.includes(t) && (type != "unarmed" || !resist.includes("weakness"))) && tags["melee" + resist]) + || (!KinkyDungeonMeleeDamageTypes.includes(t) && tags["magic"+resist]))) + return true; + if (profile) { + for (let pp of profile) { + let p = KDResistanceProfiles[pp]; + if (p && (((KinkyDungeonMeleeDamageTypes.includes(t) && (type != "unarmed" || !resist.includes("weakness"))) && p["melee" + resist]) + || (!KinkyDungeonMeleeDamageTypes.includes(t) && p["magic"+resist]))) + return true; + } + } + } + } + if (doFunc(KDDamageEquivalencies[type] || type)) return true; + let t = KDDamageEquivalencies[type] || type; + + if (KinkyDungeonDamageTypesExtension[t]) { + for (let i = 0; i < 10; i++) { + if (KinkyDungeonDamageTypesExtension[t]) + t = KinkyDungeonDamageTypesExtension[t]; + else { + if (doFunc(t)) return true; + break; + } + } + } + + + return false; +} + +let KDDamageQueue = []; + +function KDArmorFormula(DamageAmount: number, Armor: number): number { + if (DamageAmount <= 0) return 1; + if (Armor < 0) return Math.min(3, (DamageAmount - Armor) / DamageAmount); + return DamageAmount / (DamageAmount + Armor); +} + + +/** + * @param Enemy + * @param Damage + * @param Ranged + * @param NoMsg + * @param [Spell] + * @param [bullet] + * @param [attacker] + * @param [Delay] + * @param [noAlreadyHit] + * @param [noVuln] + * @param [Critical] + * @param [Attack] + */ +function KinkyDungeonDamageEnemy(Enemy: entity, Damage: damageInfo, Ranged: boolean, NoMsg: boolean, Spell?: spell, bullet?: any, attacker?: entity, Delay?: any, noAlreadyHit?: boolean, noVuln?: boolean, Critical?: any, Attack?: boolean): number { + if (bullet && !noAlreadyHit) { + if (!bullet.alreadyHit) bullet.alreadyHit = []; + // A bullet can only damage an enemy once per turn + if (bullet.alreadyHit.includes(Enemy.id)) return 0; + bullet.alreadyHit.push(Enemy.id); + } + + let predata = { + allowConjuredRestraint: !!Damage?.addBind, + useRealRestraint: Damage?.realBind, + shieldBlocked: false, + aggro: false, + faction: "Enemy", + enemy: Enemy, + spell: Spell, + bullet: bullet, + attacker: attacker, + nocrit: Spell?.nocrit || Enemy?.Enemy.tags?.nocrit || Damage?.nocrit, + crit: KDDefaultCrit, + bindcrit: KDDefaultBindCrit, + type: (Damage) ? Damage.type : "stun", + bufftype: (Damage) ? Damage.type : 0, + time: (Damage) ? Damage.time : 0, + dmg: (Damage) ? Damage.damage : 0, + bind: (Damage) ? Damage.bind : 0, + bindType: (Damage) ? Damage.bindType : "Leather", + flags: (Damage) ? Damage.flags : undefined, + boundBonus: (Damage) ? Damage.boundBonus : 0, + bindEff: (Damage) ? (Damage.bindEff || 1) : 1, + distract: (Damage) ? Damage.distract : 0, + distractEff: (Damage) ? Damage.distractEff : 0, + desireMult: (Damage) ? Damage.desireMult : 0, + incomingDamage: Damage, + dmgDealt: 0, + dmgShieldDealt: 0, + freezebroke: false, + froze: 0, + vulnerable: (Enemy.vulnerable || (KDHostile(Enemy) && !Enemy.aware)) && Damage && !Damage.novulnerable && (!Enemy.Enemy.tags || !Enemy.Enemy.tags.nonvulnerable), + vulnConsumed: false, + critical: Critical, + forceCrit: false, + customCrit: false, + noblock: !Damage || Damage.noblock, + blocked: false, + Delay: Delay, + ignoreshield: (Damage?.ignoreshield != undefined) ? Damage.ignoreshield : KinkyDungeonIgnoreShieldTypes.includes(Damage?.type || ""), + shield_crit: Damage?.shield_crit, // Crit thru shield + shield_stun: Damage?.shield_stun, // stun thru shield + shield_freeze: Damage?.shield_freeze, // freeze thru shield + shield_bind: Damage?.shield_bind, // bind thru shield + shield_snare: Damage?.shield_snare, // snare thru shield + shield_slow: Damage?.shield_slow, // slow thru shield + shield_distract: Damage?.shield_distract, // Distract thru shield + shield_vuln: Damage?.shield_vuln, // Vuln thru shield + tease: Damage?.tease, + stunResist: 0, + distractMult: undefined, + }; + + if (KDDamageEquivalencies[predata.type]) predata.bufftype = KDDamageEquivalencies[predata.type]; + + if (attacker) { + if (attacker.player) predata.faction = "Player"; + else if (attacker.Enemy) predata.faction = KDGetFaction(attacker); + } else if (bullet) { + if (bullet.bullet.faction) predata.faction = bullet.bullet.faction; + else if (bullet.bullet.spell && bullet.bullet.spell.enemySpell) predata.faction = "Enemy"; + else predata.faction = "Player"; + } else if (Spell) { + if (Spell.faction) predata.faction = Spell.faction + else if (Spell.enemySpell) predata.faction = "Enemy"; + else predata.faction = "Player"; + } + + KinkyDungeonSendEvent("beforeCrit", predata); + + // Only player can crit on spells + + if (!predata.blocked) + if (!Enemy.shield || predata.ignoreshield || predata.shield_crit) + if (!predata.nocrit && (predata.faction == "Player" || predata.forceCrit) && predata.type != 'heal') { + if ((predata.vulnerable && (predata.dmg > 0.5 || predata.bind > 1)) || predata.forceCrit) { + predata.crit = KinkyDungeonGetCrit(KDGetSpellAccuracy(), Damage, Enemy) || KDDefaultCrit; + if (KDToughArmor(Enemy) && predata.crit > 1) predata.crit = 1 + (predata.crit - 1)*0.5; // TOUGH armor + predata.bindcrit = KinkyDungeonGetBindCrit(KDGetSpellAccuracy(), Damage, Enemy) || KDDefaultBindCrit; + + predata.critical = true; + if (!predata.forceCrit && (predata.dmg > 0 || predata.bind > 0)) { + predata.vulnConsumed = true; + } + + KinkyDungeonSendEvent("duringCrit", predata); + let dmgBonus = predata.dmg * (predata.crit - 1); + predata.dmg = Math.max(0, predata.dmg + dmgBonus); + predata.bindEff *= predata.bindcrit; + if (!NoMsg) + KinkyDungeonSendTextMessage(4, TextGet((Enemy.vulnerable || Enemy.distraction > Enemy.Enemy.maxhp) ? "KinkyDungeonVulnerable" : "KinkyDungeonUnseen") + .replace("AMOUNT", "" + Math.round(10 * dmgBonus)) + .replace("EnemyName", TextGet("Name" + Enemy.Enemy.name)), "lightgreen", 2, + undefined, undefined, undefined, "Combat"); + + + + KinkyDungeonSendEvent("afterCrit", predata); + + if (predata.critical && Enemy.buffs) KinkyDungeonTickBuffTag(Enemy, "crit"); + } + } + + KinkyDungeonSendEvent("beforeDamageEnemy", predata); + + if (!predata.dmg) predata.dmg = 0; + //let type = (Damage) ? Damage.type : ""; + let effect = false; + let resistStun = 0; + let resistSlow = 0; + let resistDamage = 0; + let spellResist = (Damage && Enemy.Enemy.spellResist && !KinkyDungeonMeleeDamageTypes.includes(predata.type)) ? Enemy.Enemy.spellResist : 0; + if (KinkyDungeonGetBuffedStat(Enemy.buffs, "SpellResist")) spellResist += KinkyDungeonGetBuffedStat(Enemy.buffs, "SpellResist"); + let armor = (Damage && Enemy.Enemy.armor && KinkyDungeonMeleeDamageTypes.includes(predata.type)) ? Enemy.Enemy.armor : 0; + if (KinkyDungeonGetBuffedStat(Enemy.buffs, "Armor")) armor += KinkyDungeonGetBuffedStat(Enemy.buffs, "Armor"); + + predata.stunResist += KinkyDungeonGetBuffedStat(Enemy.buffs, "StunResist"); + + if (!predata.critical && !KinkyDungeonIsDisabled(Enemy)) { + let block_phys = (Enemy.Enemy.Resistance?.block_phys || 0) + KinkyDungeonGetBuffedStat(Enemy.buffs, "BlockPhys"); + let block_magic = (Enemy.Enemy.Resistance?.block_magic || 0) + KinkyDungeonGetBuffedStat(Enemy.buffs, "BlockMagic"); + if (block_phys) armor += block_phys; + if (block_magic) spellResist += block_magic; + } + + + if (KinkyDungeonGetBuffedStat(Enemy.buffs, "ArmorBreak")) armor -= Math.min(Math.max(0, armor), KinkyDungeonGetBuffedStat(Enemy.buffs, "ArmorBreak")); + if (KinkyDungeonGetBuffedStat(Enemy.buffs, "SpellResistBreak")) spellResist -= Math.min(Math.max(0, spellResist), KinkyDungeonGetBuffedStat(Enemy.buffs, "SpellResistBreak")); + + if (Enemy.freeze > 0 && Damage && KinkyDungeonShatterDamageTypes.includes(predata.type)) { + predata.dmg *= KDFightParams.KDFreezeShatterMult; + } else if (Enemy.freeze > 0 && Damage && KinkyDungeonMeleeDamageTypes.includes(predata.type)) { + predata.dmg *= KDFightParams.KDFreezeMeleeMult; + } + + + let miss = !(!Damage || !Damage.evadeable || KinkyDungeonEvasion(Enemy, !!Spell, !KinkyDungeonMeleeDamageTypes.includes(predata.type), attacker)); + if (Damage && !miss) { + if (predata.faction == "Player") { + if (!predata.tease && KinkyDungeonStatsChoice.get("Pacifist") && Enemy.Enemy.bound && !Enemy.Enemy.nonHumanoid && !KinkyDungeonPacifistDamageTypes.includes(predata.type)) { + predata.dmg *= KDPacifistReduction; + } + if (KinkyDungeonStatsChoice.get("EnemyArmor")) { + armor += KDPerkParams.KDEnemyArmorBoost; + spellResist += KDPerkParams.KDEnemyArmorBoost; + } + } + let DamageAmpBonusPerks = KDDamageAmpPerks + + (KinkyDungeonMeleeDamageTypes.includes(predata.type) ? KDDamageAmpPerksMelee : KDDamageAmpPerksMagic) + + (Spell && (Spell.faction == "Player" || (!Spell.allySpell && !Spell.enemySpell)) ? KDDamageAmpPerksSpell : 0); + let damageAmp = KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(Enemy.buffs, "DamageAmp") - (KDHostile(Enemy) && (!attacker || attacker.player) ? (DamageAmpBonusPerks) : 0)); + let buffreduction = KinkyDungeonGetBuffedStat(Enemy.buffs, "DamageReduction"); + let buffresist = KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(Enemy.buffs, predata.bufftype + "DamageResist")); + buffresist *= KinkyDungeonMeleeDamageTypes.includes(predata.type) ? + KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(Enemy.buffs, "meleeDamageResist")) + : KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(Enemy.buffs, "magicDamageResist")); + let buffType = predata.bufftype + "DamageBuff"; + let buffAmount = 1 + (KDHostile(Enemy) ? KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, buffType) : 0); + predata.dmg *= buffAmount; + predata.dmg *= buffresist; + + if (KinkyDungeonMeltDamageTypes.includes(predata.type) && Enemy.freeze > 0) { + predata.dmg *= 1.4; + } + + if (damageAmp) predata.dmg *= damageAmp; + + + + if (Enemy.Enemy.tags) { + if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "severeweakness", 1)) resistDamage = -2; + else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "weakness", 1)) resistDamage = -1; + else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "resist", 1)) resistDamage = 1; + else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "immune", 1)) resistDamage = 2; + + else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "severeweakness", 2)) resistDamage = -2; + else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "weakness", 2)) resistDamage = -1; + else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "resist", 2)) resistDamage = 1; + else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "immune", 2)) resistDamage = 2; + + if (Enemy.Enemy.tags.unstoppable) resistStun = 2; + else if (Enemy.Enemy.tags.unflinching) resistStun = 1; + if (Enemy.Enemy.tags.unslowable) resistSlow = 2; + else if (Enemy.Enemy.tags.slowresist) resistSlow = 1; + + } + + if (Enemy.boundLevel > 0 && (KinkyDungeonTeaseDamageTypes.includes(predata.type) || KDIsTeasing(Damage))) { + let eff = KDBoundEffects(Enemy); + let mult = 1.0; + if (eff > 0) { + mult += 0.5; + } + if (eff > 3) { + mult += 0.5; + } + + if (KinkyDungeonGetBuffedStat(Enemy.buffs, "TeaseVuln")) mult += KinkyDungeonGetBuffedStat(Enemy.buffs, "TeaseVuln"); + if (attacker?.player && KDEntityBuffedStat(attacker, "TeaseBuff")) mult += KDEntityBuffedStat(attacker, "TeaseBuff"); + predata.dmg *= mult; + } + if (Enemy.boundLevel > 0 && Damage && Damage.boundBonus) { + let eff = KDBoundEffects(Enemy); + predata.dmg += Damage.boundBonus * eff; + } + + let killed = Enemy.hp > 0; + let forceKill = false; + + + let time = predata.time ? predata.time : 0; + if (!KinkyDungeonMeleeDamageTypes.includes(predata.type)) { + if (time && spellResist) + time = Math.max(0, Math.ceil(time * KDArmorFormula(predata.dmg, spellResist))); + //predata.dmg = Math.max(0, predata.dmg * KDArmorFormula(predata.dmg, spellResist)); + armor = spellResist || 0; + } + + if (time > 0 && predata.stunResist) { + time = Math.max(0, Math.min(time - predata.stunResist, time * KDArmorFormula(time, predata.stunResist))); + } + + if (predata.type != "inert" && resistDamage < 2) { + if (resistDamage == 1) { + predata.dmgDealt = Math.max(predata.dmg * KDArmorFormula(predata.dmg, armor), 0); // Armor goes before resistance + predata.dmgDealt = predata.dmgDealt*0.5; // Enemies that are vulnerable take either dmg+0.5 or 1.5x damage, whichever is greater + } else if (resistDamage == -1) { + if (predata.dmg > 0) + predata.dmgDealt = Math.max(predata.dmg+0.5, predata.dmg*1.5); // Enemies that are vulnerable take either dmg+1 or 1.5x damage, whichever is greater + else predata.dmgDealt = 0; + predata.dmgDealt = Math.max(predata.dmgDealt * KDArmorFormula(predata.dmg, armor), 0); // Armor comes after vulnerability + } else if (resistDamage == -2) { + predata.dmgDealt = Math.max(predata.dmg+1, predata.dmg*2); // Enemies that are severely vulnerable take either dmg+1 or 2x damage, whichever is greater + predata.dmgDealt = Math.max(predata.dmgDealt * KDArmorFormula(predata.dmg, armor), 0); // Armor comes after vulnerability + } else { + predata.dmgDealt = Math.max(predata.dmg * KDArmorFormula(predata.dmg, armor), 0); + } + + if (Enemy.Enemy.tags && Enemy.Enemy.tags.playerinstakill && attacker && attacker.player) predata.dmgDealt = Enemy.hp; + else if (buffreduction && predata.dmgDealt > 0) { + predata.dmgDealt = Math.max(predata.dmgDealt - buffreduction, 0); + KinkyDungeonTickBuffTag(Enemy, "damageTaken", 1); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Shield.ogg"); + } + + if (!predata.blocked) + if (!Enemy.shield || predata.ignoreshield) + if (Enemy.freeze > 0 && predata.dmgDealt > 0) { + if ((KinkyDungeonShatterDamageTypes.includes(predata.type)) || (KinkyDungeonMeleeDamageTypes.includes(predata.type))) { + Enemy.freeze = 0; + } else if (!["ice", "frost"].includes(predata.type)) { + Enemy.freeze = Math.max(0, Enemy.freeze - predata.dmgDealt * (predata.type == "fire" ? 0.75 : 0.25)); + } + if (Enemy.freeze == 0) { + predata.freezebroke = true; + } + } + + KinkyDungeonSendEvent("duringDamageEnemy", predata); + + if (Spell && Spell.hitsfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + Spell.hitsfx + ".ogg"); + else if (!(Spell && Spell.hitsfx) && predata.dmgDealt > 0 && bullet) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/DealDamage.ogg"); + if (!predata.blocked && !KinkyDungeonIgnoreBlockTypes.includes(predata.type) && predata.dmgDealt >= 1 && !predata.noblock && Enemy.blocks >= 1 && KDCanBlock(Enemy)) { + let blockCount = 1; + Enemy.blocks -= 1; + Enemy.blockedordodged = (Enemy.blockedordodged || 0) + 1; + let amount = KDGetBlockAmount(Enemy); + let orig = predata.dmgDealt; + predata.dmgDealt -= Math.max(0, amount); + + while (predata.dmgDealt > 0 && Enemy.blocks >= 1 && (predata.dmgDealt > Enemy.hp * 0.1 || predata.dmgDealt > Enemy.Enemy.maxhp*0.5)) { + blockCount += 1; + Enemy.blocks -= 1; + Enemy.blockedordodged = (Enemy.blockedordodged || 0) + 1; + amount = KDGetBlockAmount(Enemy); + predata.dmgDealt -= Math.max(0, amount); + } + + let knockback = () => { + if (blockCount > 1 && Enemy.Enemy.tags.noknockback && !KDIsImmobile(Enemy)) { + if (bullet && (bullet.vx || bullet.vy)) { + // Gets pushed back by the projectile + let dist = blockCount - 1; + let speed = KDistEuclidean(bullet.vx, bullet.vy); + for (let i = dist; i > 0; i--) { + let newX = Enemy.x + Math.round(i * bullet.vx/speed); + let newY = Enemy.y + Math.round(i * bullet.vy/speed); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) + && (i == 1 || KinkyDungeonCheckProjectileClearance(Enemy.x, Enemy.y, newX, newY))) { + KDMoveEntity(Enemy, newX, newY, false); + } + } + } else if (bullet && (Enemy.x != bullet.x || Enemy.y != bullet.y)) { + // Gets knocked away from the explosion + let dist = blockCount - 1; + let speed = KDistEuclidean(Enemy.x - bullet.x, Enemy.y - bullet.y); + for (let i = dist; i > 0; i--) { + let newX = Enemy.x + Math.round(-i * (Enemy.x - bullet.x)/speed); + let newY = Enemy.y + Math.round(-i * (Enemy.y - bullet.y)/speed); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) + && (i == 1 || KinkyDungeonCheckProjectileClearance(Enemy.x, Enemy.y, newX, newY))) { + KDMoveEntity(Enemy, newX, newY, false); + } + } + } else if (!bullet && attacker && !Spell) { + // Gets knocked away from the explosion + let dist = blockCount - 1; + let speed = KDistEuclidean(Enemy.x - attacker.x, Enemy.y - attacker.y); + for (let i = dist; i > 0; i--) { + let newX = Enemy.x + Math.round(-i * (Enemy.x - attacker.x)/speed); + let newY = Enemy.y + Math.round(-i * (Enemy.y - attacker.y)/speed); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) + && (i == 1 || KinkyDungeonCheckProjectileClearance(Enemy.x, Enemy.y, newX, newY))) { + KDMoveEntity(Enemy, newX, newY, false); + } + } + } + } + }; + + if (predata.dmgDealt <= 0) { + predata.dmgDealt = 0; + predata.blocked = true; + if (!NoMsg && predata.faction == "Player") { + KinkyDungeonSendTextMessage(4, TextGet(blockCount == 1 ? "KDEnemyBlockSuccess" : "KDEnemyBlockSuccessMulti") + .replace("ENMY", TextGet("Name" + Enemy.Enemy.name)), "orange", 2, undefined, undefined, undefined, "Combat"); + } + + knockback(); + } else { + if (!NoMsg && predata.faction == "Player") { + KinkyDungeonSendTextMessage(4, TextGet(blockCount == 1 ? "KDEnemyBlockPartial" : "KDEnemyBlockPartialMulti") + .replace("PCNT", "" + Math.round(100 * amount/orig)) + .replace("ENMY", TextGet("Name" + Enemy.Enemy.name)), "orange", 2, undefined, undefined, undefined, "Combat"); + } + + knockback(); + } + } + + if (Damage && Damage.damage) { + if (predata.faction == "Player" || KinkyDungeonVisionGet(Enemy.x, Enemy.y) > 0) { + if (predata.critical && !predata.customCrit) KDDamageQueue.push({floater: TextGet("KDCritical"), Entity: Enemy, Color: "#e7cf1a", Delay: Delay}); + KDDamageQueue.push({floater: Math.round(predata.dmgDealt*10) + ` ${TextGet("KinkyDungeonDamageType" + KinkyDungeonDamageTypes[predata.type]?.name)} ${TextGet("KDdmg")}`, + Entity: Enemy, Color: "#ff4444", Delay: Delay, + size: 12 + Math.min(24, Math.floor(predata.dmgDealt * 2))}); + } + } + + if (Enemy.shield > 0 && predata.dmgDealt > 0) { + KinkyDungeonSetEnemyFlag(Enemy, "tookShieldDmg", KDEnemyShieldRegenStopTime(Enemy)); + let orig = predata.dmgDealt; + Enemy.shield -= predata.dmgDealt; + if (Enemy.shield <= 0) { + predata.dmgShieldDealt += predata.dmgDealt + Enemy.shield; + predata.dmgDealt = -Enemy.shield; + + delete Enemy.shield; + } else { + Enemy.playerdmg = (Enemy.playerdmg || 0) + orig; + predata.dmgShieldDealt += predata.dmgDealt; + predata.dmgDealt = 0; + predata.shieldBlocked = true; + } + } + if (predata.dmgDealt > 0) { + Enemy.hp -= predata.dmgDealt; + KinkyDungeonSetEnemyFlag(Enemy, "tookHpDmg", KDEnemyShieldRegenStopTime(Enemy)); + KDApplyBindStun(Enemy, 0.5*predata.dmgDealt); + } + if (Enemy.hp > 0 && Enemy.hp <= 0.51 && predata.dmgDealt > 0.51 && !forceKill && KDBoundEffects(Enemy) < 4) { + Enemy.hp = 0; + } + if (predata.dmgDealt > 0) Enemy.revealed = true; + } + + + if (!predata.blocked) + if (!Enemy.shield || predata.ignoreshield || predata.shield_stun) + if ((KinkyDungeonStunDamageTypes.includes(predata.type))) { // Being immune to the damage stops the stun as well + effect = true; + if (!Enemy.stun) KDAddThought(Enemy.id, "Status", 5, 1); + if (!Enemy.stun) Enemy.stun = 0; + let origStun = Enemy.stun; + if (resistStun == 2 || resistDamage == 2) + Enemy.stun = Math.max(Enemy.stun, Math.min(Math.floor(time/3), time-2)); + // Unstoppable have stuns reduced to 1/3, and anything that stuns them for 2 turns doesn't affect them + else if (resistStun == 1 || resistDamage == 1) + Enemy.stun = Math.max(Enemy.stun, Math.min(Math.floor(time/2), time-1)); + // Enemies with stun resistance have stuns reduced to 1/2, and anything that stuns them for one turn doesn't affect them + else Enemy.stun = Math.max(Enemy.stun, time); + + if (Enemy.stun > origStun) { + KinkyDungeonSendEvent("stun", predata); + } + } + + if (!predata.blocked) + if (!Enemy.shield || predata.ignoreshield || predata.shield_freeze) + if ((KinkyDungeonFreezeDamageTypes.includes(predata.type))) { // Being immune to the damage stops the stun as well + effect = true; + if (!Enemy.freeze) KDAddThought(Enemy.id, "Freeze", 5, 1); + if (!(Enemy.freeze > 0)) Enemy.freeze = 0; + let preFreeze = Enemy.freeze > 0; + let origStun = Enemy.freeze; + if (resistDamage == 2 || resistStun == 2) + Enemy.freeze = Math.max(Enemy.freeze, Math.min(Math.floor(time/3), time-2)); + else if (resistDamage == 1 || resistStun == 1) + Enemy.freeze = Math.max(Enemy.freeze, Math.min(Math.floor(time/2), time-1)); + // Enemies with ice resistance have freeze reduced to 1/2, and anything that freezes them for one turn doesn't affect them + else Enemy.freeze = Math.max(Enemy.freeze, time); + predata.froze = (Enemy.freeze > 0 && !preFreeze) ? Enemy.freeze : 0; + + if (Enemy.freeze > origStun) { + KinkyDungeonSendEvent("freeze", predata); + } + } + if (!predata.blocked) + if (!Enemy.shield || predata.ignoreshield || predata.shield_snare) + if ((KinkyDungeonBindDamageTypes.includes(predata.type))) { // Being immune to the damage stops the bind + effect = true; + if (!Enemy.bind) Enemy.bind = 0; + let origStun = Enemy.bind; + if (resistDamage == 2 || resistStun == 2) + Enemy.bind = Math.max(Enemy.bind, Math.min(Math.floor(time/3), time-2)); + else if (resistDamage == 1 || resistStun == 1) + Enemy.bind = Math.max(Enemy.bind, Math.min(Math.floor(time/2), time-1)); + // Enemies with resistance have bind reduced to 1/2, and anything that binds them for one turn doesn't affect them + else Enemy.bind = Math.max(Enemy.bind, time); + + if (Enemy.bind > origStun) { + KinkyDungeonSendEvent("bind", predata); + } + } + if (!predata.blocked) + if (!Enemy.shield || predata.ignoreshield || predata.shield_bind) + if ((predata.dmg || predata.bind) && Enemy.Enemy.bound && (resistDamage < 2) && (predata.bind || predata.bindType || KinkyDungeonBindingDamageTypes.includes(predata.type))) { + effect = true; + if (!Enemy.boundLevel) Enemy.boundLevel = 0; + + let effmult = 1; + if (resistDamage == 1) { + predata.bindEff *= 0.75; + effmult *= 0.75; + } + if (resistDamage == 2) { + predata.bindEff *= 0.5; + effmult *= 0.5; + } + if (KinkyDungeonIsDisabled(Enemy)) { + predata.bindEff *= 2; + effmult *= 2; + } else if (KinkyDungeonIsSlowed(Enemy)) { + predata.bindEff *= 1.5; + effmult *= 1.5; + } + + if (predata.faction == "Player") { + let bindAmpModBase = KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BindAmp")); + let amp = KDGetBindAmp(Enemy, bindAmpModBase); + predata.bindEff *= amp; + } + + if (!(Enemy.boundLevel > 0)) { + let Thought = "Annoyed"; + if (KDStrictPersonalities.includes(Enemy.personality)) Thought = "Struggle"; + else if (KDLoosePersonalities.includes(Enemy.personality)) Thought = "Embarrassed"; + KDAddThought(Enemy.id, Thought, 5, 2); + } + + + let amt = predata.bindEff * (predata.bind ? predata.bind : predata.dmg); + /*if (predata.vulnerable && predata.bindEff * (predata.bind ? predata.bind : predata.dmg) > 0.01 && Enemy.boundLevel < Enemy.Enemy.maxhp * 0.4) { + amt += Enemy.Enemy.maxhp * 0.2; + }*/ + // Determine binding type based on damage and spell -- best guess + if (amt > 0 && !predata.bindType) { + if (KDDamageBinds[predata.type]) predata.bindType = KDDamageBinds[predata.type]; + else if (Spell) { + if (Spell.tags) { + for (let t of Spell.tags) { + if (KDSpellTagBinds[t]) { + predata.bindType = KDSpellTagBinds[t]; + break; + } + } + } + } + } + // Do the deed + KDTieUpEnemy(Enemy, amt, predata.bindType, predata.dmg, predata.faction == "Player", Delay); + + if (predata.bindType && predata.allowConjuredRestraint) + KDBindEnemyWithTags(Enemy.id, KDGetBulletBindingTags(predata.bindType, undefined, false), + 0, + amt, !predata.useRealRestraint, undefined, false, false); + + if (!NoMsg && predata.faction == "Player") { + KinkyDungeonSendTextMessage(4, TextGet(effmult == 1 ? "KDIsBound" : (effmult > 1 ? "KDDisabledBonus" : "KDUnflinchingPenalty")) + .replace("AMNT", "" + Math.round(10 * amt)) + .replace("TargetEnemy", TextGet("Name" + Enemy.Enemy.name)), "lightgreen", 2, undefined, undefined, undefined, "Combat"); + } + + } + if (!predata.blocked) + if (!Enemy.shield || predata.ignoreshield || predata.shield_distract) + if ((predata.dmg || predata.distract) && Enemy.Enemy.bound && (resistDamage < 2) + && (predata.distract || KinkyDungeonDistractDamageTypes.includes(predata.type) || (KDLoosePersonalities.includes(Enemy.personality) && KinkyDungeonMasochistDamageTypes.includes(predata.type)))) { + if (!Enemy.distraction) Enemy.distraction = 0; + if (Enemy.distraction < Enemy.Enemy.maxhp) { + effect = true; + + let efficiency = predata.distractEff ? predata.distractEff : 1.0; + efficiency *= 1; // Always multiply by 2 + if (resistDamage == 1) { + efficiency *= 0.75; + } + if (resistDamage == 2) { + efficiency *= 0.5; + } + if (predata.vulnerable || Enemy.boundLevel > 0) { + efficiency *= 1 + Math.min(1, predata.vulnerable ? 1 : Enemy.boundLevel / Enemy.Enemy.maxhp); + } + + if (!(Enemy.distraction > 0)) { + let Thought = "Embarrassed"; + if (KDStrictPersonalities.includes(Enemy.personality)) Thought = "Angry"; + else if (KDLoosePersonalities.includes(Enemy.personality)) Thought = "Play"; + KDAddThought(Enemy.id, Thought, 5, 2); + } + + KDAddDistraction(Enemy, efficiency * (predata.distract ? predata.distract : predata.dmg), predata.distractMult != undefined ? predata.distractMult : 0.25); + if (predata.vulnerable && efficiency * (predata.distract ? predata.distract : predata.dmg) > 0.01 && Enemy.distraction < Enemy.Enemy.maxhp * 0.5) { + KDAddDistraction(Enemy, Enemy.Enemy.maxhp*0.35, 0.1); + } + if (Enemy.distraction >= Enemy.Enemy.maxhp && (predata.tease || KDIsTeasing(Damage)) && !predata.flags?.includes("BurningDamage")) { + KDEnemyRelease(Enemy); + } + } + } + + if (!forceKill && (KDBoundEffects(Enemy) > 3 || KDIsInParty(Enemy) || Damage.nokill) && (Enemy.hp <= 0 || (KDBoundEffects(Enemy) > 3 && Enemy.hp <= Enemy.Enemy.maxhp * 0.1))) { + if (!(Enemy.boundLevel > 0) && ( + KDIsInParty(Enemy) + ) && KDCanBind(Enemy)) { + KDTieUpEnemy(Enemy, 2*Enemy.Enemy.maxhp, "Null"); + } + if ((predata.faction == "Player" || KinkyDungeonVisionGet(Enemy.x, Enemy.y) > 0) && Enemy.hp > 0.001) { + let Thought = "GiveUp"; + if (KDStrictPersonalities.includes(Enemy.personality)) Thought = "Fire"; + else if (KDLoosePersonalities.includes(Enemy.personality)) Thought = "Play"; + if (!(Enemy.boundLevel > 0)) KDAddThought(Enemy.id, Thought, 6, 3); + KDAddThought(Enemy.id, Thought, 6, 3); + KinkyDungeonSendEvent("enemyKnockdown", predata); + KDDamageQueue.push({floater: TextGet("KDHelpless"), Entity: Enemy, Color: "#ff5277", Time: 2, Delay: Delay}); + } + if (killed) + Enemy.hp = 0.001; + } + + if (!predata.blocked) + if (!Enemy.shield || predata.ignoreshield || predata.shield_slow) + if ((resistSlow < 2 && resistDamage < 2) && (KinkyDungeonSlowDamageTypes.includes(predata.type))) { // Being immune to the damage stops the stun as well + effect = true; + if (!Enemy.slow) KDAddThought(Enemy.id, "Annoyed", 5, 1); + if (!Enemy.slow) Enemy.slow = 0; + let origStun = Enemy.slow; + if (resistSlow == 1 || resistDamage == 1) + Enemy.slow = Math.max(Enemy.slow, Math.min(Math.floor(time/2), time-1)); // Enemies with stun resistance have stuns reduced to 1/2, and anything that stuns them for one turn doesn't affect them + else Enemy.slow = Math.max(Enemy.slow, time); + + + if (Enemy.slow > origStun) { + KinkyDungeonSendEvent("slow", predata); + } + } + + if (predata.vulnConsumed && !noVuln) { + KinkyDungeonSetEnemyFlag(Enemy, "removeVuln", 1); + //Enemy.vulnerable = 0; + } + if (!predata.blocked) + if (!Enemy.shield || predata.ignoreshield || predata.shield_vuln) + if ((resistDamage < 2) && (KinkyDungeonVulnerableDamageTypes.includes(predata.type))) { // Being immune to the damage stops the stun as well + effect = true; + if (!Enemy.vulnerable) KDAddThought(Enemy.id, "Status", 4, 1); + if (!Enemy.vulnerable && predata.dmg > 0) Enemy.vulnerable = 0; + let origStun = Enemy.vulnerable; + if (resistDamage == 1) + Enemy.vulnerable = Math.max(Enemy.vulnerable, Math.min(Math.floor(time/2), time-1)); // Enemies with stun resistance have stuns reduced to 1/2, and anything that stuns them for one turn doesn't affect them + else Enemy.vulnerable = Math.max(Enemy.vulnerable, time); + + + if (Enemy.vulnerable > origStun) { + KinkyDungeonSendEvent("vulnerable", predata); + } + } + } else { + predata.vulnConsumed = false; + } + + if (KDBoundEffects(Enemy) > 3) { + if (!Enemy.vulnerable && predata.dmg > 0) Enemy.vulnerable = 0; + Enemy.vulnerable = Math.max(Enemy.vulnerable, 1); + } + + predata.aggro = + KDGetFaction(Enemy) != "Player" + && (Enemy.lifetime > 9000 || !Enemy.maxlifetime) + && predata.type != "heal" + && predata.type != "inert" + && (!Spell + || !Spell.allySpell) + && (!bullet + || !bullet.spell + || (!bullet.spell.allySpell && !(bullet.spell.enemySpell && bullet.faction != "Player"))); + + KinkyDungeonSendEvent("afterDamageEnemy", predata); + + let atkname = (Spell) ? TextGet("KinkyDungeonSpell" + Spell.name) : TextGet("KinkyDungeonBasicAttack"); + let damageName = TextGet("KinkyDungeonDamageType" + predata.type); + if (!NoMsg && !Spell && !Attack) { + atkname = TextGet("KinkyDungeonBasicDamage"); + } + + if (Enemy.hp <= 0) { + KinkyDungeonKilledEnemy = Enemy; + } + let mod = ""; + if (resistDamage == 1) mod = "Weak"; + if (resistDamage == 2) mod = "Immune"; + if (resistDamage == -1) mod = "Strong"; + if (resistDamage == -2) mod = "VeryStrong"; + if (Damage && !mod && spellResist > 0 && !KinkyDungeonMeleeDamageTypes.includes(predata.type)) mod = "SpellResist"; + + if (predata.faction == "Player") { + if (!Enemy.playerdmg) Enemy.playerdmg = 0.01; + Enemy.playerdmg += predata.dmgDealt; + } + + if (!NoMsg && (!predata.blocked) && (predata.dmgDealt > 0 || !Spell || effect) && (!Damage || Damage.damage > 0)) {KinkyDungeonSendActionMessage(4 + predata.dmgDealt * 0.01, (Damage && predata.dmgDealt > 0) ? + TextGet((Ranged) ? "PlayerRanged" + mod : "PlayerAttack" + mod).replace("TargetEnemy", TextGet("Name" + Enemy.Enemy.name)).replace("AttackName", atkname).replace("DamageDealt", "" + Math.round(predata.dmgDealt * 10)).replace("DamageType", ("" + damageName).toLowerCase()) + : TextGet("PlayerMiss" + ((Damage && !miss) ? (predata.shieldBlocked ? "Shield" : "Armor") : "")).replace("TargetEnemy", TextGet("Name" + Enemy.Enemy.name)), + (Damage && (predata.dmg > 0 || effect)) ? "orange" : "#ff5277", 2, undefined, undefined, Enemy, "Combat", predata.dmgDealt == 0 ? "Action" : undefined); + } + + if (Enemy && Enemy.Enemy && KDAmbushAI(Enemy) && Spell) { + Enemy.ambushtrigger = true; + } + + + if (!Damage && predata.type != "inert" && predata.dmgDealt <= 0) { + KDAddThought(Enemy.id, "Laugh", 4, 1); + + if (Enemy.playerdmg || KinkyDungeonVisionGet(Enemy.x, Enemy.y)) { + KDDamageQueue.push({floater: TextGet("KDMissed"), Entity: Enemy, Color: "#ff5277", Time: 0.5, Delay: Delay}); + if (KDRandom() < actionDialogueChanceIntense) + KinkyDungeonSendDialogue(Enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(Enemy) ? KDGetEnemyPlayLine(Enemy) : "") + "MissedMe").replace("EnemyName", TextGet("Name" + Enemy.Enemy.name)), KDGetColor(Enemy), 4, 5, false, true); + } + + let vol = KDCanHearSound(KinkyDungeonPlayerEntity, Math.max(KDMINDAMAGENOISE, KDDMGSOUNDMULT * Math.max(predata.dmg, predata.dmgDealt)), Enemy.x, Enemy.y, 1.0); + if (vol > 0) { + if (KDSoundEnabled() && Enemy.Enemy.cueSfx && Enemy.Enemy.cueSfx.Miss) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + Enemy.Enemy.cueSfx.Miss + ".ogg", undefined, Math.min(1, vol)); + } + } + } else if (Damage && Damage.damage > 0 && predata.type != "inert" && predata.dmgDealt <= 0 && !miss) { + if (KinkyDungeonVisionGet(Enemy.x, Enemy.y) > 0) { + KDAddThought(Enemy.id, "Laugh", 5, 3); + if (KDRandom() < actionDialogueChanceIntense) + KinkyDungeonSendDialogue(Enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(Enemy) ? KDGetEnemyPlayLine(Enemy) : "") + "BlockedMe").replace("EnemyName", TextGet("Name" + Enemy.Enemy.name)), KDGetColor(Enemy), 4, 5, false, true); + KDDamageQueue.push({floater: TextGet("KDBlocked"), Entity: Enemy, Color: "#ff5277", Time: 0.5, Delay: Delay}); + } + + let type = KinkyDungeonMeleeDamageTypes.includes(predata.type) ? "Block" : "Resist"; + let vol = KDCanHearSound(KinkyDungeonPlayerEntity, Math.max(KDMINDAMAGENOISE, KDDMGSOUNDMULT * Math.max(predata.dmg, predata.dmgDealt)), Enemy.x, Enemy.y, 1.0); + if (vol > 0) { + if (KDSoundEnabled() && Enemy.Enemy.cueSfx && Enemy.Enemy.cueSfx[type]) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + Enemy.Enemy.cueSfx[type] + ".ogg", undefined, Math.min(1, vol)); + } + } + //KinkyDungeonSendFloater({x: Enemy.x - 0.5 + Math.random(), y: Enemy.y - 0.5 + Math.random()}, TextGet("KDBlocked"), "white", 2); + } else if (predata.dmgDealt > 0 && KDSoundEnabled() && Enemy.Enemy.cueSfx && Enemy.Enemy.cueSfx.Damage) { + let vol = KDCanHearSound(KinkyDungeonPlayerEntity, Math.max(KDMINDAMAGENOISE, KDDMGSOUNDMULT * Math.max(predata.dmg, predata.dmgDealt)), Enemy.x, Enemy.y, 1.0); + if (vol > 0) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + Enemy.Enemy.cueSfx.Damage + ".ogg", undefined, Math.min(1, vol)); + } + if (KDRandom() < actionDialogueChance) + KinkyDungeonSendDialogue(Enemy, TextGet("KinkyDungeonRemindJail" + (KDGetEnemyPlayLine(Enemy) ? KDGetEnemyPlayLine(Enemy) : "") + "Hit").replace("EnemyName", TextGet("Name" + Enemy.Enemy.name)), KDGetColor(Enemy), 4, 5); + } + + if (predata.aggro) + KinkyDungeonAggro(Enemy, Spell, attacker, predata.faction); + + if (predata.dmg > 0) { + KinkyDungeonTickBuffTag(Enemy, "takeDamage", 1); + KinkyDungeonSetEnemyFlag(Enemy, "wander", 0); + KinkyDungeonSetEnemyFlag(Enemy, "blocked", 0); + KinkyDungeonSetEnemyFlag(Enemy, "genpath", 0); + KinkyDungeonSetEnemyFlag(Enemy, "failpath", 0); + } + + return predata.dmgDealt + predata.dmgShieldDealt; +} + +function KinkyDungeonDisarm(Enemy: entity, suff?: string): boolean { + if (!KinkyDungeonPlayerDamage || KinkyDungeonPlayerDamage.unarmed) return false; + + if (!Enemy) { + console.log("Error processing disarm! Please report!"); + return false; + } + if (KDRandom() < KinkyDungeonWeaponGrabChance) { + let slots = []; + for (let X = -Math.ceil(1); X <= Math.ceil(1); X++) + for (let Y = -Math.ceil(1); Y <= Math.ceil(1); Y++) { + if ((X != 0 || Y != 0) && KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(Enemy.x + X, Enemy.y + Y))) { + // We add the slot and those around it + slots.push({x:Enemy.x + X, y:Enemy.y + Y}); + for (let XX = -Math.ceil(1); XX <= Math.ceil(1); XX++) + for (let YY = -Math.ceil(1); YY <= Math.ceil(1); YY++) { + if ((Math.abs(X + XX) > 1 || Math.abs(Y + YY) > 1) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Enemy.x + XX + X, Enemy.y + YY + Y))) { + slots.push({x:Enemy.x + XX + X, y:Enemy.y + YY + Y}); + } + } + } + } + + let foundslot = null; + for (let C = 0; C < 100; C++) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (slot && KinkyDungeonNoEnemy(slot.x, slot.y, true) + && Math.max(Math.abs(KinkyDungeonPlayerEntity.x - slot.x), Math.abs(KinkyDungeonPlayerEntity.y - slot.y)) > 1.5 + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(slot.x, slot.y))) { + foundslot = {x: slot.x, y: slot.y}; + + C = 100; + } else slots.splice(C, 1); + } + + if (foundslot) { + let weapon = KinkyDungeonPlayerWeapon; + + let dropped = {x:foundslot.x, y:foundslot.y, name: weapon}; + + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, TextGet("KDDisarmed"), "#ff5277", KDToggles.FastFloaters ? 1.5 : 3); + + KDSetWeapon('Unarmed', true); + KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); + KinkyDungeonInventoryRemove(KinkyDungeonInventoryGetWeapon(weapon)); + + KDMapData.GroundItems.push(dropped); + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonDisarm" + (suff ? suff : "")), "#ff5277", 2, + undefined, undefined, undefined, "Combat"); + + return true; + } + } + return false; +} + +/** + * @param Enemy + * @param Damage + * @param [chance] + * @param [bullet] + */ +function KinkyDungeonAttackEnemy(Enemy: entity, Damage: damageInfo, chance?: number, bullet?: any): boolean { + let disarm = false; + if ((Damage && !Damage.nodisarm) && Enemy.Enemy && Enemy.Enemy.disarm && Enemy.disarmflag > 0) { + if (Enemy.stun > 0 || Enemy.freeze > 0 || Enemy.blind > 0 || Enemy.teleporting > 0 || (Enemy.playWithPlayer && !Enemy.hostile)) Enemy.disarmflag = 0; + else if (Enemy.Enemy && Enemy.Enemy.disarm && Enemy.disarmflag >= 0.97 && KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed) { + Enemy.disarmflag = 0; + disarm = true; + } + } + let evaded = KinkyDungeonEvasion(Enemy, false, undefined, KinkyDungeonPlayerEntity, chance); + let dmg = Damage; + let buffdmg = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackDmg"); + let channel = KinkyDungeonPlayerDamage?.channel || 0; + let slow = KinkyDungeonPlayerDamage?.channelslow || 0; + let predata = { + bullet: bullet, + channel: channel, + slow: slow, + targetX: Enemy.x, + targetY: Enemy.y, + enemy: Enemy, + evaded: evaded, + miss: !evaded, + disarm: disarm, + eva: !disarm && evaded, + Damage: Damage, + buffdmg: buffdmg, + vulnConsumed: Enemy.vulnerable > 0, + critical: false, + vulnerable: (Enemy.vulnerable || (KDHostile(Enemy) && !Enemy.aware)) && dmg && !dmg.novulnerable && (!Enemy.Enemy.tags || !Enemy.Enemy.tags.nonvulnerable), + }; + KinkyDungeonSendEvent("beforePlayerAttack", predata); + + if (predata.buffdmg) dmg.damage = Math.max(0, dmg.damage + predata.buffdmg); + + /*if (predata.vulnerable && (predata.eva)) { + let crit = KinkyDungeonGetCrit(KinkyDungeonGetEvasion(), KinkyDungeonPlayerDamage, Enemy) || KDDefaultCrit; + let dmgBonus = Math.max(Math.min(dmg.damage, KDVulnerableDmg), dmg.damage * (crit - 1)); + dmg.damage = Math.max(0, dmg.damage + dmgBonus); + KinkyDungeonSendTextMessage(4, TextGet((Enemy.vulnerable || Enemy.distraction > Enemy.Enemy.maxhp) ? "KinkyDungeonVulnerable" : "KinkyDungeonUnseen") + .replace("AMOUNT", "" + Math.round(10 * dmgBonus)) + .replace("EnemyName", TextGet("Name" + Enemy.Enemy.name)), "lightgreen", 2); + + predata.critical = true; + if (dmg.damage > 0 || dmg.bind > 0) + predata.vulnConsumed = true; + }*/ + + + let hp = Enemy.hp; + if (KinkyDungeonWeaponVariants[KinkyDungeonPlayerWeapon]) { + if (!KDGameData.IdentifiedObj) KDGameData.IdentifiedObj = {}; + KDGameData.IdentifiedObj[KinkyDungeonPlayerWeapon] = 2; + } + KinkyDungeonDamageEnemy(Enemy, (predata.eva) ? dmg : null, undefined, undefined, undefined, bullet, KinkyDungeonPlayerEntity, undefined, undefined, predata.vulnConsumed, predata.critical, true); + if (predata.eva && (Damage.sfx || (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.sfx))) { + if (KDSoundEnabled()) KDDamageQueue.push({sfx: KinkyDungeonRootDirectory + "Audio/" + (Damage.sfx || KinkyDungeonPlayerDamage.sfx) + ".ogg"}); + //AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + KinkyDungeonPlayerDamage.sfx + ".ogg"); + } else if (!predata.eva) if (KDSoundEnabled()) KDDamageQueue.push({sfx: KinkyDungeonRootDirectory + "Audio/Miss.ogg"}); + //AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Miss.ogg"); + if (disarm) { + //KinkyDungeonDisarm(Enemy); + KinkyDungeonSendTextMessage(10, TextGet("KDDisarmFlag") + .replace("ENMY", TextGet("Name" + Enemy.Enemy.name)), + "#ff8844", 2, undefined, undefined, undefined, "Combat"); + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Grope.ogg"); + KinkyDungeonSetFlag("disarmFlagVulnerable", 2); + } + if (!KinkyDungeonPlayerDamage || !KinkyDungeonPlayerDamage.silent || !(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Silence") > 0)) { + if (Enemy && hp < Enemy.Enemy.maxhp) { + KinkyDungeonAlert = 4; + } else { + KinkyDungeonAlert = 2; + } + } else { + if (!KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Silence") || KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Silence") < 2) { + if (KinkyDungeonAlert) { + KinkyDungeonAlert = 2; + } else { + KinkyDungeonAlert = 1; + } + } else if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Silence") < 3) { + // Meep + } + } + + if (Enemy.Enemy && Enemy.Enemy.disarm && !disarm && KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed) { + if (!Enemy.disarmflag) Enemy.disarmflag = 0; + Enemy.disarmflag += Enemy.Enemy.disarm; + } + let data = { + bullet: bullet, + channel: predata.channel, + slow: predata.slow, + targetX: Enemy.x, + targetY: Enemy.y, + enemy: Enemy, + miss: !evaded, + disarm: disarm, + damage: Damage, + vulnConsumed: predata.vulnConsumed, + attacker: KinkyDungeonPlayerEntity, + predata: predata, + }; + KinkyDungeonSendEvent("playerAttack", data); + + if (data.slow) { + KDGameData.MovePoints = Math.min(KDGameData.MovePoints, -1); + } + if (data.channel) { + KinkyDungeonSetFlag("channeling", data.channel); + KDGameData.SlowMoveTurns = Math.max(KDGameData.SlowMoveTurns, data.channel); + KinkyDungeonSleepTime = CommonTime() + 200; + } + + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "damage", 1); + KinkyDungeonTickBuffTag(Enemy, "incomingHit", 1); + if (predata.eva) + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "hit", 1); + + + KinkyDungeonSendEvent("afterPlayerAttack", data); + + if (data.vulnConsumed) { + KinkyDungeonSetEnemyFlag(Enemy, "removeVuln", 1); + } + return predata.eva; +} + +let KDBulletWarnings = []; +let KDUniqueBulletHits = new Map(); + + +function KDUpdateBulletEffects(b: any, d: number) { + // At the start we guarantee interactions + if (!b.bullet.noInteractTiles) { + let rad = b.bullet.aoe || 0.5; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (AOECondition(b.x, b.y, b.x + X, b.y + Y, rad, KDBulletAoEMod(b))) { + KDEffectTileInteractions(b.x + X, b.y + Y, b, d); + } + } + } +} + +function KinkyDungeonUpdateBullets(delta: number, Allied?: boolean): void { + if (delta > 0) { + + if (Allied) KDUniqueBulletHits = new Map(); + + for (let b of KDMapData.Bullets) { + if ((Allied && b.bullet && b.bullet.spell && !(b.bullet.spell.enemySpell && b.bullet.faction != "Player")) + || (!Allied && !(b.bullet && b.bullet.spell && !(b.bullet.spell.enemySpell && b.bullet.faction != "Player")))) { + if (b.bullet.followPlayer) { + b.x = KinkyDungeonPlayerEntity.x; + b.y = KinkyDungeonPlayerEntity.y; + } else if (b.bullet.followCaster) { + let enemy = KinkyDungeonFindID(b.bullet.followCaster); + if (enemy) { + b.x = enemy.x; + b.y = enemy.y; + } + } + if (b.bullet.cancelCaster) { + let enemy = KinkyDungeonFindID(b.bullet.cancelCaster); + if (!enemy) { + b.lifetime = 0; + } + } + + KinkyDungeonSendEvent("bulletTick", {bullet: b, delta: delta, allied: Allied}); + if (b.bullet && b.bullet.dot) { + KinkyDungeonBulletDoT(b); + } + if (b.bullet.cast && b.bullet.spell && b.bullet.spell.castDuringDelay && (!b.bullet.cast.chance || KDRandom() < b.bullet.cast.chance) && b.time > 1) { + let xx = b.bullet.cast.tx; + let yy = b.bullet.cast.ty; + if (b.bullet.cast.targetID) { + if (b.bullet.cast.targetID == -1) { + xx = KinkyDungeonPlayerEntity.x; + yy = KinkyDungeonPlayerEntity.y; + } else { + let enemy = KinkyDungeonFindID(b.bullet.cast.targetID); + if (enemy) { + xx = enemy.x; + yy = enemy.y; + } + } + + } + let castingSpell = KinkyDungeonFindSpell(b.bullet.cast.spell, true); + if (b.bullet.cast.spread) { + let xxx = xx + Math.round(-b.bullet.cast.spread + 2*b.bullet.cast.spread * KDRandom()); + let yyy = yy + Math.round(-b.bullet.cast.spread + 2*b.bullet.cast.spread * KDRandom()); + if (xxx != b.x || yyy != b.y || castingSpell.type != 'bolt') { + xx = xxx; + yy = yyy; + } + } + + if (castingSpell.type != 'bolt') { + if (!xx) xx = b.x; + if (!yy) yy = b.y; + } else if (xx == b.x && yy == b.y) { + for (let i = 0; i < 20; i++) { + xx = b.x + Math.floor(KDRandom() * 3 - 1); + yy = b.y + Math.floor(KDRandom() * 3 - 1); + if (xx != b.x || yy != b.y) i = 1000; + else if (i > 19) { + xx = b.x + 1; + yy = b.y + 0; + } + } + } + + KinkyDungeonCastSpell(xx, yy, castingSpell, undefined, undefined, b); + if (b.bullet.cast.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + b.bullet.cast.sfx + ".ogg"); + } + } + } + } + if (Allied && delta > 0) { + KDBulletWarnings = []; + } + for (let E = 0; E < KDMapData.Bullets.length; E++) { + let b = KDMapData.Bullets[E]; + + if ((Allied && b.bullet && b.bullet.spell && !(b.bullet.spell.enemySpell && b.bullet.faction != "Player")) || (!Allied && !(b.bullet && b.bullet.spell && !(b.bullet.spell.enemySpell && b.bullet.faction != "Player")))) { + let d = delta; + let first = true; + let justBorn = false; + let trailSquares = []; + let startx = b.x; + let starty = b.y; + let end = false; + let mod = (b.bullet.spell && !b.bullet.spell.slowStart && (b.bullet.spell.fastStart || (b.bullet.spell.speed > (KDGetSpellRange(b.bullet.spell) || b.bullet.spell.range) * 0.8 && b.bullet.spell.speed > 1) || (!(b.bullet.spell.enemySpell && b.bullet.faction != "Player") && !b.bullet.spell.allySpell && (b.vx != 0 || b.vy != 0)))) ? 1 : 0; + + KDBulletEffectTiles(b); + KDUpdateBulletEffects(b, 0); + + let dt = 0.1; + while (d >= 0.05) { + dt = (d - Math.max(0, d - 1))/Math.sqrt(Math.max(1, b.vx*b.vx+b.vy*b.vy)); + if (!first && delta > 0) { + if (b.born >= 0) { + b.born -= dt; + justBorn = true; + } + if (b.born < mod) { + b.xx += b.vx * dt; + b.yy += b.vy * dt; + b.time -= dt; + } else if (mod <= 0) { + d = 0; + b.born = 0; + } + + if (b.bullet.spell && (b.trail || b.trailEffectTile) && (b.x != Math.round(b.xx) || b.y != Math.round(b.yy) || (b.bullet.spell && b.bullet.spell.trailOnSelf)) + && !trailSquares.includes(Math.round(b.xx) + "," + Math.round(b.yy))) { + if (KinkyDungeonBulletTrail(b)) { + trailSquares.push(Math.round(b.xx) + "," + Math.round(b.yy)); + } + } + + b.x = Math.round(b.xx); + b.y = Math.round(b.yy); + + d -= dt; + } else first = false; + + let outOfRange = false; + let endTime = false; + if (b.bullet && b.bullet.origin) { + let dist = Math.sqrt((b.bullet.origin.x - b.x) * (b.bullet.origin.x - b.x) + (b.bullet.origin.y - b.y) * (b.bullet.origin.y - b.y)); + if (dist > b.bullet.range) outOfRange = true; + if (dist >= b.bullet.range) endTime = true; + } + let outOfTime = (b.bullet.lifetime != 0 && b.time <= 0.001); + end = false; + let checkCollision = (b.bullet.faction == "Player" && (b.x != KinkyDungeonPlayerEntity.x || b.y != KinkyDungeonPlayerEntity.y)) + || justBorn || (b.x != startx || b.y != starty) || (!b.vx && !b.vy) || (KDistEuclidean(b.vx, b.vy) < 0.9); // Check collision for bullets only once they leave their square or if they are slower than one + if ((checkCollision && !KinkyDungeonBulletsCheckCollision(b, undefined, undefined, delta - d, false)) || outOfTime || outOfRange) { + if (!(b.bullet.spell + && ( + (!b.bullet.trail + && (b.bullet.spell.piercing + || (b.bullet.spell.pierceEnemies + && KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(b.x, b.y))))) + || (b.bullet.trail + && b.bullet.spell.piercingTrail))) + || outOfRange + || outOfTime) + end = true; + if (end) { + d = 0; + KDMapData.Bullets.splice(E, 1); + KinkyDungeonBulletsID[b.spriteID] = null; + KinkyDungeonSendEvent("bulletDestroy", {bullet: b, target: undefined, outOfRange:outOfRange, outOfTime: outOfTime}); + E -= 1; + } + if (!((outOfTime || outOfRange) && b.bullet.spell && ((!b.bullet.trail && b.bullet.spell.nonVolatile) || (b.bullet.trail && b.bullet.spell.nonVolatileTrail)))) + KinkyDungeonBulletHit(b, 1.0, outOfTime, outOfRange, d, dt, end); + } + if (endTime) b.time = 0; + // Update the bullet's visual position + KinkyDungeonUpdateSingleBulletVisual(b, end); + } + if (!end || (b.bullet.spell && b.bullet.spell.alwaysWarn)) { + KinkyDungeonSendEvent("bulletAfterTick", {bullet: b, delta: delta, allied: Allied}); + // Update the bullet's visual position + KinkyDungeonUpdateSingleBulletVisual(b, end); + + let show = + (!KDFactionFavorable("Player", b.bullet.faction) + || (((b.bullet.spell && b.bullet.spell.playerEffect) + || b.bullet.playerEffect) + && !b.bullet.spell?.noHitAlliedPlayer) + || (b.bullet.spell && b.bullet.spell.alwaysWarn)) + && !(b.bullet.spell && b.bullet.spell.hideWarnings) + && ((b.bullet.spell && b.bullet.spell.alwaysWarn) + || b.bullet.hit == "lingering" + || (b.bullet.spell && b.bullet.name == b.bullet.spell.name + && (b.bullet.spell.onhit == "aoe" || b.bullet.spell.onhit == "dot")) + || (b.bullet.trail && !b.bullet.spell?.nonVolatileTrail) + || ((b.lifetime > 0 || b.lifetime == undefined) && b.bullet.damage && b.bullet.damage.type && b.bullet.damage.type != "heal" && b.bullet.damage.type != "inert") + ); + if (KinkyDungeonStatsChoice.get("BulletHell2") || (b.vx || b.vy) && KinkyDungeonStatsChoice.get("BulletHell")) show = false; + let bxx = b.xx; + let byy = b.yy; + let bx = b.x; + let by = b.y; + let btime = b.time; + let bborn = b.born; + // Lookforward + d = delta; + first = true; + startx = bx; + starty = by; + + b.warnings = []; + + while (d > 0.1) { + if (!first && delta > 0) { + dt = 0.5 * (d - Math.max(0, d - 1))/Math.sqrt(Math.max(1, b.vx*b.vx+b.vy*b.vy)); + + if (bborn >= 0) bborn -= dt; + if (bborn < mod) { + bxx += b.vx * dt; + byy += b.vy * dt; + btime -= dt; + } + + bx = Math.round(bxx); + by = Math.round(byy); + + d -= dt; + } else first = false; + + let outOfRange = false; + if (b.bullet && b.bullet.origin) { + let dist = Math.sqrt((b.bullet.origin.x - bx) * (b.bullet.origin.x - bx) + (b.bullet.origin.y - by) * (b.bullet.origin.y - by)); + if (dist > b.bullet.range) outOfRange = true; + } + let outOfTime = (b.bullet.lifetime != 0 + && (btime <= 0.001 || ((b.bullet.damage && !b.bullet.trail) && btime <= 1.001))); + let checkCollision = (bx != startx || by != starty) + || (!b.vx && !b.vy) || (KDistEuclidean(b.vx, b.vy) < 0.9) || b.bullet.aoe; // Check collision for bullets only once they leave their square or if they are slower than one + if (outOfTime || outOfRange) { + d = 0; + } + if ((!(outOfTime || outOfRange) || (b.bullet.spell?.alwaysWarn)) && checkCollision) { + let rad = b.bullet.aoe ? b.bullet.aoe : ((b.bullet.spell && b.bullet.spell.aoe && b.bullet.name == b.bullet.spell.name) ? b.bullet.spell.aoe : 0); + for (let xx = bx - Math.floor(rad); xx <= bx + Math.ceil(rad); xx++) { + for (let yy = by - Math.floor(rad); yy <= by + Math.ceil(rad); yy++) { + if (AOECondition(bx, by, xx, yy, rad, KDBulletAoEMod(b))) { + if (show && !KDBulletWarnings.some((w) => {return w.x == xx && w.y == yy;})) + KDBulletWarnings.push({x: xx, y: yy, x_orig: b.xx, y_orig: b.yy, scale: 0, color:b.bullet.spell ? (b.bullet.spell.color ? b.bullet.spell.color : "#ff5277") : "#ff5277"}); + if (!b.warnings.includes(xx + "," + yy)) { + b.warnings.push(xx + "," + yy); + } + } + } + } + } + } + } + + + // A bullet can only damage an enemy in one location at a time + // Resets at the end of the bullet update! + // But only for piercing bullets. Non-piercing bullets just expire + if (!b.bullet.piercing && !b.bullet.pierceEnemies && !b.bullet.noDoubleHit) + b.alreadyHit = undefined; + } + } +} + +function KinkyDungeonUpdateSingleBulletVisual(b: any, end: boolean, delay?: number) { + if (b.spriteID && !b.bullet.noSprite) { + let bb = KinkyDungeonBulletsVisual.get(b.spriteID); + let scale = bb ? bb.scale : 0; + let alpha = bb ? bb.alpha : 0; + let dd = bb ? bb.delay : delay; + let spinAngle = bb ? bb.spinAngle : 0; + let visx = bb ? bb.visual_x : b.visual_x; + let visy = bb ? bb.visual_y : b.visual_y; + if (visx == undefined) visx = b.xx; + if (visy == undefined) visy = b.yy; + + let temp = (!b.vx && !b.vy && b.time <= 1 && !(b.bullet.hit || (b.bullet.trail && !b.bullet.spell?.nonVolatileTrail))); + let zIndex = (b.vx == 0 && b.vy == 0) ? 2 : 0; + zIndex += b.bullet.spell?.power || 0; + KinkyDungeonBulletsVisual.set(b.spriteID, {end: end, zIndex: zIndex, temporary: temp, spin: b.bullet.bulletSpin, spinAngle: spinAngle, name: b.bullet.name, spriteID: b.spriteID, size: b.bullet.width ? b.bullet.width : 1, aoe: (b.bullet.spell && b.bullet.spell.aoe) ? b.bullet.spell.aoe : undefined, vx: b.vx, vy: b.vy, xx: b.xx, yy: b.yy, visual_x: visx, visual_y: visy, updated: true, scale: scale, alpha: alpha, delay: dd}); + } +} + +function KinkyDungeonUpdateBulletVisuals(delta: number) { + if (delta > 0) + for (let b of KinkyDungeonBulletsVisual.entries()) { + if (b[1].updated) { + b[1].updated = false; + } else if (!b[1].end || b[1].alpha <= 0.01) KinkyDungeonBulletsVisual.delete(b[0]); + } +} + +let KinkyDungeonExtraWarningTiles = []; + +function KinkyDungeonCreateWarningTile(x: number, y: number, color: string = "#ffffff", + duration: number = 1, delay: number = 0, x_orig?: number, y_orig?: number) { + KinkyDungeonExtraWarningTiles.push({ + duration: duration, + delay: delay, + warning: { + color: color, + scale: 1, + x: x, + x_orig: (x_orig) ? x_orig : x, + y: y, + y_orig: (y_orig) ? y_orig : y + } + }) +} + +function KinkyDungeonParseExtraWarningTiles(delta: number) { + for (let i = 0; i < KinkyDungeonExtraWarningTiles.length; i++) { + if (KinkyDungeonExtraWarningTiles[i].delay > 0) { + KinkyDungeonExtraWarningTiles[i].delay -= delta; + } + else { + KDBulletWarnings.push(Object.assign({}, KinkyDungeonExtraWarningTiles[i].warning)); + } + KinkyDungeonExtraWarningTiles[i].duration -= delta; + if (KinkyDungeonExtraWarningTiles[i].duration <= 0) { + KinkyDungeonExtraWarningTiles.splice(i, 1); + i--; + } + } +} + +let KinkyDungeonCurrentTick = 0; + +function KinkyDungeonUpdateBulletsCollisions(delta: number, Catchup?: boolean) { + for (let E = 0; E < KDMapData.Bullets.length; E++) { + let b = KDMapData.Bullets[E]; + if ((!Catchup && !b.secondary) || (Catchup && b.secondary)) { + // This is a bit of a brute force way of forcing the bullet to only check for collisions when time has passed, i.e. when delta = 1 + // However the collision check still happens if the bullet was born in between turns, e.g the player uses Leather Package + + if (b.collisionUpdate == undefined || delta > 0) { + if (!KinkyDungeonBulletsCheckCollision(b, b.time >= 0, undefined, undefined, !(b.bullet.faction == "Player" || (!b.vx && !b.vy) || b.bullet.aoe || (KDistEuclidean(b.vx, b.vy) < 0.9)), delta)) { // (b.bullet.faction == "Player" || (!b.vx && !b.vy) || b.bullet.aoe || (KDistEuclidean(b.vx, b.vy) < 0.9)) && + if (!(b.bullet.spell && (b.bullet.spell.piercing || (b.bullet.spell.pierceEnemies && KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(b.x, b.y)))))) { + KDMapData.Bullets.splice(E, 1); + KinkyDungeonBulletsID[b.spriteID] = null; + KinkyDungeonUpdateSingleBulletVisual(b, true); + KinkyDungeonSendEvent("bulletDestroy", {bullet: b, target: undefined, outOfRange:false, outOfTime: false}); + E -= 1; + } + KinkyDungeonBulletHit(b, 0); + } + if (delta > 0 && !b.collisionUpdate && b.bullet.damage) { + b.born = 0; + } + } + b.collisionUpdate = true; + } + } +} + + +function KDCheckCollideableBullets(entity: entity, force: boolean) { + for (let E = 0; E < KDMapData.Bullets.length; E++) { + let b = KDMapData.Bullets[E]; + if (b.x == entity.x && b.y == entity.y && b.bullet && b.bullet.damage + && (b.time > 1 // Only bullets that arent instantly ending + && (!entity.player || !(b.vx != 0 || b.vy != 0)))) {// Enemies can run into bullets as they move, but the player can walk into bullets that are moving without being hit + let pierce = b.bullet.spell && (b.bullet.spell.piercing || b.bullet.spell.pierceEnemies); + + //if (noDirect && b.bullet.damage.damage != 0) continue; + if (pierce && b.bullet.damage.damage != 0) continue; + if (!KDBulletCanHitEntity(b, entity) && !force) continue; + + let noDirect = b.bullet.spell && (b.bullet.spell.noDirectHit); + if (!noDirect) { + if (entity.player) KDBulletHitPlayer(b, KinkyDungeonPlayerEntity); + else KDBulletHitEnemy(b, entity, 0, b.bullet.NoMsg); + } + + if (!pierce) { + KDMapData.Bullets.splice(E, 1); + KinkyDungeonBulletsID[b.spriteID] = null; + KinkyDungeonUpdateSingleBulletVisual(b, true); + KinkyDungeonSendEvent("bulletDestroy", {bullet: b, target: undefined, outOfRange:false, outOfTime: false}); + E -= 1; + } + KinkyDungeonBulletHit(b, 1); + } + } +} + +/** + * @param b + * @param born + * @param [outOfTime] + * @param [outOfRange] + * @param [d] - Fraction of the timestep that this hit happened in + * @param [dt] - Timestep + * @param [end] - If the bullet is dying + */ +function KinkyDungeonBulletHit(b: any, born: number, outOfTime?: boolean, outOfRange?: boolean, d?: number, dt?: number, end?: boolean) { + if (d > 0 && (b.vx || b.vy) && end) { + let tt = KinkyDungeonMapGet(b.x, b.y); + if (!KinkyDungeonMovableTilesEnemy.includes(tt)) { + b.xx -= b.vx * dt; + b.yy -= b.vy * dt; + b.x = Math.round(b.xx); + b.y = Math.round(b.yy); + } + } + + if (b.bullet.hit && b.bullet.spell && b.bullet.hit != b.bullet.spell.secondaryhit && b.bullet.spell.landsfx) { + if (KDSoundEnabled() && (b.bullet.faction == "Player" || KinkyDungeonVisionGet(b.x, b.y) > 0)) { + KDDamageQueue.push({sfx: KinkyDungeonRootDirectory + "Audio/" + b.bullet.spell.landsfx + ".ogg"}); + } + //KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + b.bullet.spell.landsfx + ".ogg"); + } + let data = {bullet: b, target: undefined, outOfRange:outOfRange, outOfTime: outOfTime, noise: b.bullet.spell?.noise || b.bullet.noise}; + KinkyDungeonSendEvent("beforeBulletHit", data); + + if (b.bullet.cast && (!b.bullet.cast.chance || KDRandom() < b.bullet.cast.chance) && (!b.bullet.spell || !b.bullet.spell.noCastOnHit)) { + let xx = b.bullet.cast.tx; + let yy = b.bullet.cast.ty; + if (b.bullet.cast.targetID) { + let enemy = KinkyDungeonFindID(b.bullet.cast.targetID); + if (enemy) { + xx = enemy.x; + yy = enemy.y; + } + } + if (!xx) xx = b.x; + if (!yy) yy = b.y; + KinkyDungeonCastSpell(xx, yy, KinkyDungeonFindSpell(b.bullet.cast.spell, true), undefined, undefined, b); + } + + if (b.bullet.hit == "") { + let newB = {born: born, time:1, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), + ox: b.x, oy: b.y, + bullet:{ + source: b.bullet.source, + bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, + bulletSpin: b.bullet.spell?.hitSpin, + hitevents: b.bullet.spell.hitevents, + faction: b.bullet.faction, lifetime: 1, passthrough:true, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height + }}; + if (data.noise) { + KinkyDungeonMakeNoise(data.noise, b.x, b.y); + } + KDMapData.Bullets.push(newB); + KinkyDungeonUpdateSingleBulletVisual(newB, false, d); + if (b.bullet.effectTile) { + KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); + } + } else if (b.bullet.hit == "buff" || b.bullet.hit == "buffonly" || b.bullet.hit == "buffnoAoE") { + if (b.bullet.hit == "buff") { + let newB = {born: born, time:1, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), + ox: b.x, oy: b.y, + bullet:{ + source: b.bullet.source, + bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, + bulletSpin: b.bullet.spell?.hitSpin, + faction: b.bullet.faction, lifetime: 1, passthrough:true, + hitevents: b.bullet.spell.hitevents, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height}}; + KDMapData.Bullets.push(newB); + KinkyDungeonUpdateSingleBulletVisual(newB, false, d); + } + if (data.noise) { + KinkyDungeonMakeNoise(data.noise, b.x, b.y); + } + if (b.bullet.spell) { + let aoe = b.bullet.spell.aoe ? b.bullet.spell.aoe : 0.5; + if (b.bullet.hit == "buffnoAoE") aoe = 0.5; + if (b.bullet.spell && (b.bullet.spell.playerEffect || b.bullet.playerEffect) && AOECondition(b.x, b.y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, aoe, KDBulletAoEMod(b))) { + KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, b.bullet.damage.type, b.bullet.playerEffect ? b.bullet.playerEffect : b.bullet.spell.playerEffect, b.bullet.spell, b.bullet.faction, b); + } + for (let enemy of KDMapData.Entities) { + if (((enemy.x == b.x && enemy.y == b.y) || (b.bullet.spell && aoe && AOECondition(b.x, b.y, enemy.x, enemy.y, aoe, KDBulletAoEMod(b))))) { + for (let buff of b.bullet.spell.buffs) { + if (buff.enemies + && (!buff.noAlly || !b.bullet.faction || KDFactionRelation(b.bullet.faction, KDGetFaction(enemy)) < 0.5) + && (!buff.onlyAlly || !b.bullet.faction || KDFactionRelation(b.bullet.faction, KDGetFaction(enemy)) >= 0.5)) { + if (!enemy.buffs) enemy.buffs = {}; + KinkyDungeonApplyBuffToEntity(enemy, buff); + } + } + } + } + } + if (b.bullet.effectTile) { + KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); + } + } else if (b.bullet.hit == "aoe") { + let newB = {secondary: true, born: born, time:b.bullet.spell.lifetime, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), + ox: b.x, oy: b.y, + bullet:{faction: b.bullet.faction, spell:b.bullet.spell, bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, + source: b.bullet.source, + hitevents: b.bullet.spell.hitevents, + bulletSpin: b.bullet.spell?.hitSpin, damage: { + evadeable:false, noblock: (b.bullet.spell.lifetime > 1.9), + damage:(b.bullet.spell.aoedamage) ? b.bullet.spell.aoedamage : b.bullet.spell.power, type:b.bullet.spell.damage, + ignoreshield: b.bullet.spell?.ignoreshield, + shield_crit: b.bullet.spell?.shield_crit, // Crit thru shield + shield_stun: b.bullet.spell?.shield_stun, // stun thru shield + shield_freeze: b.bullet.spell?.shield_freeze, // freeze thru shield + shield_bind: b.bullet.spell?.shield_bind, // bind thru shield + shield_snare: b.bullet.spell?.shield_snare, // snare thru shield + shield_slow: b.bullet.spell?.shield_slow, // slow thru shield + shield_distract: b.bullet.spell?.shield_distract, // Distract thru shield + shield_vuln: b.bullet.spell?.shield_vuln, // Vuln thru shield + tease: b.bullet.spell?.tease, + addBind: b.bullet.spell?.addBind, + distract: b.bullet.spell.distract, distractEff: b.bullet.spell.distractEff, desireMult: b.bullet.spell.desireMult, bindEff: b.bullet.spell.bindEff, + bind: b.bullet.spell.bind, crit: b.bullet.spell.crit, bindcrit: b.bullet.spell.bindcrit, bindType: b.bullet.spell.bindType, time:b.bullet.spell.time}, aoe: b.bullet.spell.aoe, lifetime: b.bullet.spell.lifetime, passthrough:true, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height}}; + KDMapData.Bullets.push(newB); + KinkyDungeonUpdateSingleBulletVisual(newB, false, d); + + if (data.noise) { + KinkyDungeonMakeNoise(data.noise, b.x, b.y); + } + + if (b.bullet.effectTile) { + KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); + } + } else if (b.bullet.hit == "instant") { + if (!KinkyDungeonBulletsCheckCollision(b, true, true, d)) { + if (!(b.bullet.spell && (b.bullet.spell.piercing || (b.bullet.spell.pierceEnemies && KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(b.x, b.y)))))) { + let ind = KDMapData.Bullets.indexOf(b); + if (data.noise) { + KinkyDungeonMakeNoise(data.noise, b.x, b.y); + } + if (ind > -1) + KDMapData.Bullets.splice(ind, 1); + KinkyDungeonBulletsID[b.spriteID] = null; + KinkyDungeonUpdateSingleBulletVisual(b, true, d); + KinkyDungeonSendEvent("bulletDestroy", {bullet: b, target: undefined, outOfRange:outOfRange, outOfTime: outOfTime}); + } + } + let newB = {born: born, time:1, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), + ox: b.x, oy: b.y, + bullet:{ + source: b.bullet.source, + hitevents: b.bullet.spell.hitevents, + bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, + bulletSpin: b.bullet.spell?.hitSpin, + faction: b.bullet.faction, lifetime: 1, passthrough:true, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height}}; + KDMapData.Bullets.push(newB); + KinkyDungeonUpdateSingleBulletVisual(newB, false); + if (b.bullet.effectTile) { + KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); + } + } else if (b.bullet.hit == "lingering") { + if (b.bullet.effectTile) { + KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); + } + let rad = (b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (AOECondition(b.x, b.y, b.x + X, b.y + Y, rad, KDBulletAoEMod(b), b.ox, b.oy)) { + let dd = KDistEuclidean(X, Y) / rad; + let LifetimeBonus = (b.bullet.spell.lifetimeHitBonus) ? Math.floor(KDRandom() * b.bullet.spell.lifetimeHitBonus) : 0; + let newB = {delay: dd, born: born, time:b.bullet.spell.lifetime + LifetimeBonus, x:b.x+X, y:b.y+Y, vx:0, vy:0, xx:b.x+X, yy:b.y+Y, + ox: b.x, oy: b.y, + source: b.bullet.source, + spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), + bullet:{faction: b.bullet.faction, spell:b.bullet.spell, block: (b.bullet.blockhit ? b.bullet.blockhit : 0), + blockType: (b.bullet.blockTypehit ? b.bullet.blockTypehit : undefined), + volatile: (b.bullet.volatilehit ? b.bullet.volatilehit : undefined), + bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, hit: b.bullet.spell?.secondaryhit, + bulletSpin: b.bullet.spell?.hitSpin, + effectTileLinger: b.bullet.spell.effectTileLinger, effectTileDurationModLinger: b.bullet.spell.effectTileDurationModLinger, + hitevents: b.bullet.spell.hitevents, + passthrough: b.bullet.spell.noTerrainHit, + damage: { + evadeable:false, noblock: (b.bullet.spell.lifetime > 1.9), + ignoreshield: b.bullet.spell?.ignoreshield, + shield_crit: b.bullet.spell?.shield_crit, // Crit thru shield + shield_stun: b.bullet.spell?.shield_stun, // stun thru shield + shield_freeze: b.bullet.spell?.shield_freeze, // freeze thru shield + shield_bind: b.bullet.spell?.shield_bind, // bind thru shield + shield_snare: b.bullet.spell?.shield_snare, // snare thru shield + shield_slow: b.bullet.spell?.shield_slow, // slow thru shield + shield_distract: b.bullet.spell?.shield_distract, // Distract thru shield + shield_vuln: b.bullet.spell?.shield_vuln, // Vuln thru shield + tease: b.bullet.spell?.tease, + addBind: b.bullet.spell?.addBind, + damage:b.bullet.spell.power, type:b.bullet.spell.damage, bind: b.bullet.spell.bind, crit: b.bullet.spell.crit, bindcrit: b.bullet.spell.bindcrit, bindType: b.bullet.spell.bindType, time:b.bullet.spell.time, + distract: b.bullet.spell.distract, distractEff: b.bullet.spell.distractEff, desireMult: b.bullet.spell.desireMult, bindEff: b.bullet.spell.bindEff, + }, lifetime: b.bullet.spell.lifetime + LifetimeBonus, name:b.bullet.name+"Hit", width:1, height:1}}; + KDMapData.Bullets.push(newB); + + if (data.noise) { + KinkyDungeonMakeNoise(data.noise, b.x, b.y); + } + KinkyDungeonUpdateSingleBulletVisual(newB, false, dd); + } + } + + } else if (b.bullet.hit == "heal") { + let newB = {born: born, time:b.bullet.spell.lifetime, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), + ox: b.x, oy: b.y, + bullet:{faction: b.bullet.faction, spell:b.bullet.spell, bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, + bulletSpin: b.bullet.spell?.hitSpin, + hitevents: b.bullet.spell.hitevents, + source: b.bullet.source, + damage: { + damage:(b.bullet.spell.aoedamage) ? b.bullet.spell.aoedamage : b.bullet.spell.power, type:b.bullet.spell.damage, + ignoreshield: b.bullet.spell?.ignoreshield, + shield_crit: b.bullet.spell?.shield_crit, // Crit thru shield + shield_stun: b.bullet.spell?.shield_stun, // stun thru shield + shield_freeze: b.bullet.spell?.shield_freeze, // freeze thru shield + shield_bind: b.bullet.spell?.shield_bind, // bind thru shield + shield_snare: b.bullet.spell?.shield_snare, // snare thru shield + shield_slow: b.bullet.spell?.shield_slow, // slow thru shield + shield_distract: b.bullet.spell?.shield_distract, // Distract thru shield + shield_vuln: b.bullet.spell?.shield_vuln, // Vuln thru shield + tease: b.bullet.spell?.tease, + addBind: b.bullet.spell?.addBind, + distract: b.bullet.spell.distract, distractEff: b.bullet.spell.distractEff, desireMult: b.bullet.spell.desireMult, bindEff: b.bullet.spell.bindEff, + bind: b.bullet.spell.bind, crit: b.bullet.spell.crit, bindcrit: b.bullet.spell.bindcrit, bindType: b.bullet.spell.bindType, time:b.bullet.spell.time + }, aoe: b.bullet.spell.aoe, lifetime: b.bullet.spell.lifetime, passthrough:true, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height}}; + KDMapData.Bullets.push(newB); + KinkyDungeonUpdateSingleBulletVisual(newB, false); + + if (data.noise) { + KinkyDungeonMakeNoise(data.noise, b.x, b.y); + } + + if (b.bullet.spell && (b.bullet.spell.playerEffect || b.bullet.playerEffect) && AOECondition(b.x, b.y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, b.spell.aoe, KDBulletAoEMod(b))) { + KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, b.bullet.damage.type, b.bullet.playerEffect ? b.bullet.playerEffect : b.bullet.spell.playerEffect, b.bullet.spell, b.bullet.faction, b); + } + for (let enemy of KDMapData.Entities) { + if ((b.reflected + || KDEntityHasFlag(enemy, "takeFF") + || (!b.bullet.spell || !b.bullet.faction + || (!KDFactionHostile(b.bullet.faction, enemy)) + )) + && ((enemy.x == b.x && enemy.y == b.y) || (b.bullet.spell && b.bullet.spell.aoe && + AOECondition(b.x, b.y, enemy.x, enemy.y, b.bullet.spell.aoe, KDBulletAoEMod(b))))) { + let origHP = enemy.hp; + enemy.hp = Math.min(enemy.hp + b.bullet.spell.power, enemy.Enemy.maxhp); + //KDDamageQueue.push({floater: `+${Math.round((enemy.hp - origHP) * 10)}`, Entity: enemy, Color: "#ffaa00", Time: 3}); + if (b.bullet.faction == "Player" || KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) + KinkyDungeonSendFloater(enemy, `+${Math.round((enemy.hp - origHP) * 10)}`, "#ffaa00", KDToggles.FastFloaters ? 1 : 3); + if (b.bullet.faction == "Player") + KDHealRepChange(enemy, enemy.hp - origHP); + } + } + if (b.bullet.effectTile) { + KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); + } + } else if (b.bullet.hit == "cast" && b.bullet.spell && b.bullet.spell.spellcasthit) { + let cast = b.bullet.spell.spellcasthit; + let rad = (b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0; + if (data.noise) { + KinkyDungeonMakeNoise(data.noise, b.x, b.y); + } + if (cast.countPerCast) { + for (let cc = 0; cc < cast.countPerCast; cc++) { + let spell = KinkyDungeonFindSpell(cast.spell, true); + let xx = b.x + Math.round(rad * (1 - 2*KDRandom())); + let yy = b.y + Math.round(rad * (1 - 2*KDRandom())); + KinkyDungeonCastSpell(xx, yy, spell, undefined, undefined, b); + } + } else { + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (AOECondition(b.x, b.y, b.x + X, b.y + Y, rad, KDBulletAoEMod(b)) && (!cast.chance || KDRandom() < cast.chance)) { + let spell = KinkyDungeonFindSpell(cast.spell, true); + let xx = b.x + X; + let yy = b.y + Y; + KinkyDungeonCastSpell(xx, yy, spell, undefined, undefined, b); + } + } + } + + if (b.bullet.effectTile) { + KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); + } + } else if (b.bullet.hit == "teleport") { + if (KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(b.x, b.y))) { + let newB = {born: born, time:b.bullet.spell.lifetime, x:b.x, y:b.y, vx:0, vy:0, xx:b.x, yy:b.y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Hit" + CommonTime(), + ox: b.x, oy: b.y, + bullet:{faction: b.bullet.faction, spell:b.bullet.spell, + source: b.bullet.source, + bulletColor: b.bullet.spell?.hitColor, bulletLight: b.bullet.spell?.hitLight, + bulletSpin: b.bullet.spell?.hitSpin, + hitevents: b.bullet.spell.hitevents, + damage: { + damage:(b.bullet.spell.aoedamage) ? b.bullet.spell.aoedamage : b.bullet.spell.power, type:b.bullet.spell.damage, boundBonus: b.bullet.spell.boundBonus, + ignoreshield: b.bullet.spell?.ignoreshield, + shield_crit: b.bullet.spell?.shield_crit, // Crit thru shield + shield_stun: b.bullet.spell?.shield_stun, // stun thru shield + shield_freeze: b.bullet.spell?.shield_freeze, // freeze thru shield + shield_bind: b.bullet.spell?.shield_bind, // bind thru shield + shield_snare: b.bullet.spell?.shield_snare, // snare thru shield + shield_slow: b.bullet.spell?.shield_slow, // slow thru shield + shield_distract: b.bullet.spell?.shield_distract, // Distract thru shield + shield_vuln: b.bullet.spell?.shield_vuln, // Vuln thru shield + tease: b.bullet.spell?.tease, + addBind: b.bullet.spell?.addBind, + distract: b.bullet.spell.distract, distractEff: b.bullet.spell.distractEff, desireMult: b.bullet.spell.desireMult, bindEff: b.bullet.spell.bindEff, + bind: b.bullet.spell.bind, crit: b.bullet.spell.crit, bindcrit: b.bullet.spell.bindcrit, bindType: b.bullet.spell.bindType, time:b.bullet.spell.time}, aoe: b.bullet.spell.aoe, lifetime: b.bullet.spell.lifetime, passthrough:true, name:b.bullet.name+"Hit", width:b.bullet.width, height:b.bullet.height + }}; + KDMapData.Bullets.push(newB); + KinkyDungeonUpdateSingleBulletVisual(newB, false); + if (data.noise) { + KinkyDungeonMakeNoise(data.noise, b.x, b.y); + } + + if (KinkyDungeonEnemyAt(b.x, b.y)) { + let point = KinkyDungeonGetNearbyPoint(b.x, b.y, true, undefined, false, false); + if (point) { + KinkyDungeonSetFlag("teleported", 1); + let tdata = { + x: point.x, + y: point.y, + cancel: false, + entity: KDPlayer(), + willing: true, + }; + KinkyDungeonSendEvent("beforeTeleport", tdata); + if (!tdata.cancel) { + KDMovePlayer(point.x, point.y, false); + KinkyDungeonSendTextMessage(10, TextGet("KDTeleportNearby"), "#e7cf1a", 2, undefined, undefined, undefined, "Combat"); + KinkyDungeonSendEvent("teleport", tdata); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDTeleportFail"), "#e7cf1a", 2, undefined, undefined, undefined, "Combat"); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/SoftShield.ogg"); + } + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDTeleportFail"), "#e7cf1a", 2, undefined, undefined, undefined, "Combat"); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/SoftShield.ogg"); + } + } else { + KinkyDungeonSetFlag("teleported", 1); + let tdata = { + x: b.x, + y: b.y, + cancel: false, + entity: KDPlayer(), + willing: true, + }; + KinkyDungeonSendEvent("beforeTeleport", tdata); + if (!tdata.cancel) { + KDMovePlayer(b.x, b.y, false); + KinkyDungeonSendEvent("teleport", tdata); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDTeleportFail"), "#e7cf1a", 2, undefined, undefined, undefined, "Combat"); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/SoftShield.ogg"); + } + } + + + //KinkyDungeonMoveTo(b.x, b.y, true); + } + if (b.bullet.effectTile) { + KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); + } + } else if (b.bullet.hit == "summon") { + if (data.noise) { + KinkyDungeonMakeNoise(data.noise, b.x, b.y); + } + if (b.bullet.effectTile) { + KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTile, b.bullet.effectTileDurationMod, (b.bullet.spell.effectTileAoE ? b.bullet.spell.effectTileAoE : ((b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0.5)), undefined, b.bullet.spell.effectTileDensity, KDBulletAoEMod(b)); + } + } + + if (b.bullet.summon && b.bullet.summon) { + let created = 0; + let type = ""; + for (let sum of b.bullet.summon) { + if (!sum.chance || KDRandom() < sum.chance) { + let summonType = sum.name; // Second operand is the enemy type + if (!type) type = summonType; + let count = sum.count ? sum.count : 1; + let rad = (b.bullet.spell.aoe) ? b.bullet.spell.aoe : 0; + if (count > 0) { + let faction = (b.bullet.spell && b.bullet.spell.defaultFaction) ? undefined : b.bullet.faction; + //if (!faction && b.bullet.spell && b.bullet.spell.enemySpell) faction = "Enemy"; + //else + if (!faction && b.bullet.spell && b.bullet.spell.allySpell) faction = "Player"; + + if (b.bullet.faction) faction = b.bullet.faction; + if (sum.faction) faction = sum.faction; + let e = KinkyDungeonSummonEnemy(b.x, b.y, + summonType, count, rad, sum.strict, + sum.time ? sum.time : undefined, sum.hidden, + sum.goToTarget, faction, faction && KDFactionRelation("Player", faction) <= -0.5, + sum.minRange, sum.aware, undefined, sum.hideTimer, undefined, + KDBulletAoEMod(b), sum.bound ? b.bullet.source : undefined, sum.weakBinding, sum.teleportTime, + b.ox, b.oy, true + ); + created += e.length; + } + } + } + if (!b.bullet.spell || !b.bullet.spell.noSumMsg) { + if (created == 1) KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSummonSingle"+type), "white", 2, undefined, undefined, b, "Combat"); + else if (created > 1) KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonSummonMulti"+type).replace("SummonCount", "" + created), "white", 3, undefined, undefined, b, "Combat"); + } + } + + + KinkyDungeonSendEvent("afterBulletHit", data); +} + + +/** + * @param x + * @param y + * @param summonType + * @param count + * @param rad + * @param [strict] + * @param [lifetime] + * @param [hidden] + * @param [goToTarget] + * @param [faction] + * @param [hostile] + * @param [minrad] + * @param [startAware] + * @param [noBullet] + * @param [hideTimer] + * @param [pathfind] + * @param [mod] + * @param [boundTo] + * @param [weakBinding] + * @param [teleportTime] + * @param [ox] + * @param [oy] + */ +function KinkyDungeonSummonEnemy ( + x: number, + y: number, + summonType: string | enemy, + count: number, + rad: number, + strict?: boolean, + lifetime?: number, + hidden?: boolean, + goToTarget?: boolean, + faction?: string, + hostile?: boolean, + minrad?: number, + startAware?: boolean, + noBullet?: boolean, + hideTimer?: boolean, + pathfind?: boolean, + mod?: string, + boundTo?: number, + weakBinding?: boolean, + teleportTime?: number, + ox?: number, + oy?: number, + temporary?: boolean +): entity[] +{ + let slots = []; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (AOECondition(x, y, x + X, y + Y, rad, mod, ox, oy) && (!minrad || Math.sqrt(X*X+Y*Y) >= minrad)) { + if ((x + X > 0 && y + Y > 0 && x + X < KDMapData.GridWidth && y + Y < KDMapData.GridHeight)) + slots.push({x:X, y:Y}); + } + } + + if (slots.length == 0) return []; + let created = []; + let maxcounter = 0; + let Enemy = KinkyDungeonGetEnemyByName(summonType); + for (let C = 0; C < count && (KDMapData.Entities.length < 300 || faction == "Player" || faction == "Ambush" || faction == "Prisoner") && maxcounter < count * 30; C++) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (Enemy && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x+slot.x, y+slot.y)) + && (KinkyDungeonNoEnemy(x+slot.x, y+slot.y, true) || (KinkyDungeonNoEnemy(x+slot.x, y+slot.y, false) && Enemy.noblockplayer && KDistChebyshev(x+slot.x - KinkyDungeonPlayerEntity.x, y+slot.y - KinkyDungeonPlayerEntity.y) < 1.5)) + && (!strict || KinkyDungeonCheckPath(x, y, x+slot.x, y+slot.y, false)) + && (!hidden || (KinkyDungeonVisionGet(x+slot.x, y+slot.y) < 1))) { + let path = (hidden || pathfind) ? KinkyDungeonFindPath( + x+slot.x, y+slot.y, + goToTarget ? KinkyDungeonTargetX : x, goToTarget ? KinkyDungeonTargetY : y, + false, false, + false, Enemy.tags.opendoors ? KinkyDungeonMovableTilesSmartEnemy : KinkyDungeonMovableTilesEnemy, + ) : null; + + if ((!hidden && !pathfind) || path) { + let e: entity = {summoned: true, temporary: temporary, + boundTo: boundTo, weakBinding: weakBinding, faction: faction, hostile: hostile ? 100 : undefined, hideTimer: hideTimer, rage: Enemy.summonRage ? 9999 : undefined, Enemy: Enemy, + id: KinkyDungeonGetEnemyID(), gx: goToTarget ? KinkyDungeonTargetX : undefined, gy: goToTarget ? KinkyDungeonTargetY : undefined, ambushtrigger: startAware, + x:x+slot.x, y:y+slot.y, hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, shield: Enemy.shield, movePoints: 0, attackPoints: 0, lifetime: lifetime, maxlifetime: lifetime, path: path}; + KDProcessCustomPatron(Enemy, e, 0, false); + if (teleportTime) { + e.teleporting = teleportTime; + e.teleportingmax = teleportTime; + } + e = KDAddEntity(e); + if (!noBullet) { + let spell = KinkyDungeonFindSpell("Summon", true); + if (spell) { + KinkyDungeonCastSpell(e.x, e.y, spell, undefined, undefined, undefined); + } + } + if (startAware) { + e.vp = 2; + e.aware = true; + } + if (e.Enemy.tags?.defensive) KinkyDungeonSetEnemyFlag(e, "Defensive", -1); + created.push(e); + } + } else C -= 1; + maxcounter += 1; + } + return created; +} + +function KinkyDungeonBulletDoT(b: any) { + KinkyDungeonBulletHit(b, 1.1); +} + +function KinkyDungeonBulletTrail(b: any): boolean { + let avoidPoint = b.bullet.spell.noTrailOnPlayer ? {x: KinkyDungeonPlayerEntity.x, y: KinkyDungeonPlayerEntity.y} : null; + let trail = false; + if (b.bullet.spell.trail) { + if (b.bullet.spell.trail == "lingering" && !b.bullet.trail) { + let aoe = b.bullet.spell.trailspawnaoe ? b.bullet.spell.trailspawnaoe : 0.0; + let rad = Math.ceil(aoe/2); + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (AOECondition(b.x, b.y, b.x + X, b.y + Y, rad, KDBulletTrailAoEMod(b)) && KDRandom() < b.bullet.spell.trailChance && (!avoidPoint || avoidPoint.x != X + b.x || avoidPoint.y != Y + b.y)) { + trail = true; + let newB = {born: 0, time:b.bullet.spell.trailLifetime + (b.bullet.spell.trailLifetimeBonus ? Math.floor(KDRandom() * b.bullet.spell.trailLifetimeBonus) : 0), x:b.x + X, y:b.y + Y, vx:0, vy:0, xx:b.x + X, yy:b.y + Y, spriteID: KinkyDungeonGetEnemyID() + b.bullet.name+"Trail" + CommonTime(), + bullet:{faction: b.bullet.faction, trail: true, hit: b.bullet.spell.trailHit, spell:b.bullet.spell, playerEffect:b.bullet.spell.trailPlayerEffect, + source: b.bullet.source, + bulletColor: b.bullet.spell?.trailColor, bulletLight: b.bullet.spell?.trailLight, + hitevents: b.bullet.spell.hitevents, + bulletSpin: b.bullet.spell?.hitSpin, damage: { + + evadeable: b.bullet.spell.trailEvadeable, noblock: b.bullet.spell.trailNoBlock, + damage:b.bullet.spell.trailPower, type:b.bullet.spell.trailDamage, boundBonus: b.bullet.spell.boundBonus, + ignoreshield: b.bullet.spell?.ignoreshield, + shield_crit: b.bullet.spell?.shield_crit, // Crit thru shield + shield_stun: b.bullet.spell?.shield_stun, // stun thru shield + shield_freeze: b.bullet.spell?.shield_freeze, // freeze thru shield + shield_bind: b.bullet.spell?.shield_bind, // bind thru shield + shield_snare: b.bullet.spell?.shield_snare, // snare thru shield + shield_slow: b.bullet.spell?.shield_slow, // slow thru shield + shield_distract: b.bullet.spell?.shield_distract, // Distract thru shield + shield_vuln: b.bullet.spell?.shield_vuln, // Vuln thru shield + tease: b.bullet.spell?.tease, + addBind: b.bullet.spell?.addBind, + distract: b.bullet.spell.distract, distractEff: b.bullet.spell.distractEff, desireMult: b.bullet.spell.desireMult, bindEff: b.bullet.spell.bindEff, + bind: b.bullet.spell.trailBind, crit: b.bullet.spell.crit, bindcrit: b.bullet.spell.bindcrit, bindType: b.bullet.spell.bindType, time:b.bullet.spell.trailTime}, lifetime: b.bullet.spell.trailLifetime, name:b.bullet.name+"Trail", width:1, height:1}}; + KDMapData.Bullets.push(newB); + KinkyDungeonUpdateSingleBulletVisual(newB, false); + } + } + } else if (b.bullet.spell.trail == "cast" && !b.bullet.trail && b.bullet.spell && b.bullet.spell.trailcast) { + let aoe = b.bullet.spell.trailspawnaoe ? b.bullet.spell.trailspawnaoe : 0.0; + let rad = Math.ceil(aoe/2); + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (AOECondition(b.x, b.y, b.x + X, b.y + Y, rad, KDBulletTrailAoEMod(b)) && KDRandom() < b.bullet.spell.trailChance && (!avoidPoint || avoidPoint.x != X + b.x || avoidPoint.y != Y + b.y)) { + trail = true; + let cast = b.bullet.spell.trailcast; + let spell = KinkyDungeonFindSpell(cast.spell, true); + if (spell) { + KinkyDungeonCastSpell(b.x + X, b.y + Y, spell, undefined, undefined, b); + } + } + } + } + } + if (b.bullet.effectTileTrail) { + KDCreateAoEEffectTiles(b.x, b.y, b.bullet.effectTileTrail, b.bullet.effectTileDurationModTrail, (b.bullet.spell.effectTileTrailAoE) ? b.bullet.spell.effectTileTrailAoE : 0.5, avoidPoint, b.bullet.spell.effectTileDensityTrail, KDBulletTrailAoEMod(b)); + } + return trail; +} + +function KinkyDungeonBulletsCheckCollision(bullet: any, AoE: boolean, force: boolean, d: number, inWarningOnly?: boolean, _delta?: number) { + let mapItem = KinkyDungeonMapGet(bullet.x, bullet.y); + if (bullet.vx || bullet.vy) // Moving projectiles get blocked by grates and walls, but not still objects + if (!bullet.bullet.passthrough && !bullet.bullet.piercing && !KinkyDungeonOpenObjects.includes(mapItem)) return false; + + KDBulletEffectTiles(bullet); + + if (bullet.bullet.noEnemyCollision && !(bullet.bullet && bullet.bullet.alwaysCollideTags)) return true; + + if (bullet.delay && !d) d = bullet.delay; + + let hitEnemy = false; + if (bullet.bullet.damage && (bullet.time > 0 || force)) { + if ((AoE || (bullet.vx != 0 || bullet.vy != 0))) { // Moving bullets always have a chance to hit, while AoE only has a chance to hit when AoE is explicitly being checked + if (bullet.bullet.aoe ? KDBulletAoECanHitEntity(bullet, KinkyDungeonPlayerEntity) : KDBulletCanHitEntity(bullet, KinkyDungeonPlayerEntity, inWarningOnly)) { + if (!bullet.bullet.spell || bullet.born < 1 || (bullet.vx == 0 && bullet.vy == 0) || (bullet.bullet.spell.enemySpell && bullet.bullet.faction != "Player")) { // Projectiles just born cant hurt you, unless they're enemy projectiles + //if (!(!bullet.secondary && bullet.bullet.spell && bullet.bullet.spell.noDirectDamage)) + KDBulletHitPlayer(bullet, KinkyDungeonPlayerEntity); + hitEnemy = true; + } + } + let nomsg = bullet.bullet && bullet.bullet.spell && (bullet.bullet.spell.enemySpell && bullet.bullet.faction != "Player") && !bullet.reflected; + for (let enemy of KDMapData.Entities) { + let overrideCollide = !bullet.bullet.aoe ? false : (bullet.bullet.spell && bullet.bullet.alwaysCollideTags && bullet.bullet.alwaysCollideTags.some((tag: string) => {return enemy.Enemy.tags[tag];})); + if (bullet.bullet.aoe ? KDBulletAoECanHitEntity(bullet, enemy) : KDBulletCanHitEntity(bullet, enemy, inWarningOnly, overrideCollide)) { + //if (!(!bullet.secondary && bullet.bullet.spell && bullet.bullet.spell.noDirectDamage)) { + KDBulletHitEnemy(bullet, enemy, d, nomsg); + nomsg = true; + //} + hitEnemy = true; + } + } + + KDUpdateBulletEffects(bullet, d); + + } + } + if (!bullet.bullet.aoe && hitEnemy) return false; + + if (!(bullet.bullet.block > 0) && (bullet.vx != 0 || bullet.vy != 0 || bullet.bullet.volatile)) { + for (let b2 of KDMapData.Bullets) { + if (b2 != bullet && b2.bullet.block > 0 && b2.x == bullet.x && b2.y == bullet.y) { + if (!b2.bullet.blockType || b2.bullet.blockType.includes(bullet.bullet.damage?.type)) { + b2.bullet.block -= bullet.bullet.damage.damage; + if (b2.bullet.block <= 0) b2.bullet.block = -1; + + //if (bullet.bullet.volatile) bullet.time = 0; + return false; + } + } + } + } else if (bullet.bullet.block == -1) { + //if (bullet.bullet.volatile) bullet.time = 0; + return false; // Shields expire + } + + if (bullet.bullet.lifetime == -1) return false; // Instant spells + + if (!bullet.bullet.passthrough && !KinkyDungeonOpenObjects.includes(mapItem)) return false; + return true; +} + +function KDBulletAoECanHitEntity(bullet: any, enemy: entity): boolean { + if (enemy.player) { + return (bullet.bullet.spell && (bullet.bullet.spell.playerEffect || bullet.bullet.playerEffect) + && (!bullet.bullet.spell?.noHitAlliedPlayer + || !bullet.bullet.faction + || !KDFactionFavorable(bullet.bullet.faction, "Player")) + && AOECondition(bullet.x, bullet.y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, bullet.bullet.aoe || 0.5, KDBulletAoEMod(bullet))) + && (!bullet.bullet.spell || !bullet.bullet.spell.noUniqueHits || !KDUniqueBulletHits.get(KDBulletID(bullet, KinkyDungeonPlayerEntity))); + } else { + return (bullet.reflected + || KDEntityHasFlag(enemy, "takeFF") + || (!bullet.bullet.spell || !bullet.bullet.faction + || (!KDFactionFavorable(bullet.bullet.faction, enemy) && (!bullet.bullet.damage || bullet.bullet.damage.type != "heal")) + || (!KDFactionHostile(bullet.bullet.faction, enemy) && (bullet.bullet.damage && bullet.bullet.damage.type == "heal")) + )) + && AOECondition(bullet.x, bullet.y, enemy.x, enemy.y, bullet.bullet.aoe || 0.5, KDBulletAoEMod(bullet)) + && (!bullet.bullet.spell || !bullet.bullet.spell.noUniqueHits || !KDUniqueBulletHits.get(KDBulletID(bullet, enemy))); + } +} +function KDBulletCanHitEntity(bullet: any, enemy: entity, inWarningOnly?: boolean, overrideCollide?: boolean): boolean { + if (enemy.player) { + return bullet.bullet.spell && (bullet.bullet.spell.playerEffect || bullet.bullet.playerEffect) + && (!bullet.bullet.noEnemyCollision || (bullet.bullet.spell && bullet.bullet.alwaysCollideTags && bullet.bullet.alwaysCollideTags.includes("PlayerChar"))) + && KinkyDungeonPlayerEntity.x == bullet.x && KinkyDungeonPlayerEntity.y == bullet.y + && (!bullet.bullet.spell.noFF || !bullet.bullet.faction + || (!KDFactionFavorable(bullet.bullet.faction, "Player") && (!bullet.bullet.damage || bullet.bullet.damage.type != "heal")) + || (!KDFactionHostile(bullet.bullet.faction, "Player") && (bullet.bullet.damage && bullet.bullet.damage.type == "heal")) + ) + && (!inWarningOnly || (bullet.warnings && bullet.warnings.includes(KinkyDungeonPlayerEntity.lastx + "," + KinkyDungeonPlayerEntity.lasty))) + && (!bullet.bullet.spell || !bullet.bullet.spell.noUniqueHits || !KDUniqueBulletHits.get(KDBulletID(bullet, KinkyDungeonPlayerEntity))); + } else { + return (enemy.x == bullet.x && enemy.y == bullet.y) && (bullet.reflected || overrideCollide + || KDEntityHasFlag(enemy, "takeFF") + || (!bullet.bullet.spell || !bullet.bullet.faction + || (!KDFactionFavorable(bullet.bullet.faction, enemy) && (!bullet.bullet.damage || bullet.bullet.damage.type != "heal")) + || (!KDFactionHostile(bullet.bullet.faction, enemy) && (bullet.bullet.damage && bullet.bullet.damage.type == "heal")) + )) + && (!bullet.bullet.noEnemyCollision || overrideCollide) + && (!inWarningOnly || (bullet.warnings && bullet.warnings.includes(enemy.lastx + "," + enemy.lasty))) + && (!bullet.bullet.spell || !bullet.bullet.spell.noUniqueHits || !KDUniqueBulletHits.get(KDBulletID(bullet, enemy))); + } +} + +function KDBulletEffectTiles(bullet: any) { + if (bullet.bullet.spell && bullet.bullet.spell.type == "dot") { + if (bullet.bullet.spell.effectTileDoT) { + KDCreateAoEEffectTiles(bullet.x, bullet.y, bullet.bullet.spell.effectTileDoT, bullet.bullet.spell.effectTileDurationModDoT, + (bullet.bullet.spell.effectTileDistDoT ? bullet.bullet.spell.effectTileDistDoT : (bullet.bullet.spell.effectTileAoE ? bullet.bullet.spell.effectTileAoE : ((bullet.bullet.spell.aoe) ? bullet.bullet.spell.aoe : 0.5))), undefined, bullet.bullet.spell.effectTileDensityDoT, KDBulletAoEMod(bullet)); + } + if (bullet.bullet.spell.effectTileDoT2) { + KDCreateAoEEffectTiles(bullet.x, bullet.y, bullet.bullet.spell.effectTileDoT2, bullet.bullet.spell.effectTileDurationModDoT, + (bullet.bullet.spell.effectTileDistDoT ? bullet.bullet.spell.effectTileDistDoT : (bullet.bullet.spell.effectTileAoE ? bullet.bullet.spell.effectTileAoE : ((bullet.bullet.spell.aoe) ? bullet.bullet.spell.aoe : 0.5))), undefined, bullet.bullet.spell.effectTileDensityDoT, KDBulletAoEMod(bullet)); + } + } + + if (bullet.bullet.effectTileLinger) { + if (bullet.bullet.effectTileLinger) { + KDCreateEffectTile(bullet.x, bullet.y, bullet.bullet.effectTileLinger, bullet.bullet.effectTileDurationModLinger); + } + } +} + +function KDBulletHitPlayer(bullet: any, player: entity) { + let pf = bullet.bullet.playerEffect ? bullet.bullet.playerEffect : bullet.bullet.spell.playerEffect; + if (pf) { + KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, bullet.bullet.damage.type, pf, bullet.bullet.spell, bullet.bullet.faction, bullet); + KDUniqueBulletHits.set(KDBulletID(bullet, player), true); + } +} + + + +/** + * @param bullet + * @param enemy + * @param d + * @param nomsg + */ +function KDBulletHitEnemy(bullet: any, enemy: entity, d: number, nomsg: boolean) { + KinkyDungeonSendEvent("bulletHitEnemy", {bullet: bullet, enemy: enemy}); + KDUniqueBulletHits.set(KDBulletID(bullet, enemy), true); + if (bullet.bullet.damage.type == "heal") { + let origHP = enemy.hp; + enemy.hp = Math.min(enemy.hp + bullet.bullet.spell.power, enemy.Enemy.maxhp); + if (bullet.bullet.faction == "Player" || KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) + KinkyDungeonSendFloater(enemy, `+${Math.round((enemy.hp - origHP) * 10)}`, "#ffaa00", KDToggles.FastFloaters ? 1 : 3); + if (bullet.bullet.faction == "Player") + KDHealRepChange(enemy, enemy.hp - origHP); + } else //if (bullet.bullet.faction == "Player" || KinkyDungeonVisionGet(enemy.x, enemy.y) > 0) + { + // Avoid damaging the enemy if its a no direct damage spell + if (!(!bullet.secondary && bullet.bullet.spell && bullet.bullet.spell.noDirectDamage) && bullet.bullet.damage.type != "inert") + KinkyDungeonDamageEnemy(enemy, bullet.bullet.damage, true, nomsg, bullet.bullet.spell, bullet, undefined, d); + + // Apply whatever it would apply to the player + let pf = bullet.bullet.playerEffect ? bullet.bullet.playerEffect : bullet.bullet.spell.playerEffect; + if ((bullet.bullet.damage.bindTags || bullet.bullet.spell.bindTags) + || bullet.bullet.damage.bindType || bullet.bullet.spell.bindType || pf) + if (pf) { + let tags = + (bullet.bullet.damage.bindTags + || bullet.bullet.spell.bindTags + || (pf?.tag ? [pf.tag] : undefined) + || pf?.tags + ) + || KDGetBulletBindingTags(bullet.bullet.damage.bindType + || bullet.bullet.spell.bindType, pf, false); + if (tags) { + KDBindEnemyWithTags(enemy.id, tags, + bullet.bullet.damage.bind || bullet.bullet.damage.power, + (bullet.bullet.spell?.power || 0), + !pf?.realBind, undefined, + true, true, pf?.count); + } + } + } +} + +// Gets ID for unique bullet hits +function KDBulletID(bullet: any, enemy: entity): string { + if (enemy.player) + return (bullet.name) + (bullet.bullet.spell) + "_player"; + return (bullet.name) + (bullet.bullet.spell) + "_" + (enemy.id); +} + + +function KinkyDungeonLaunchBullet(x: number, y: number, targetx: number, targety: number, speed: number, bullet: any, miscast: boolean, ox: number, oy: number): any { + let direction = (!targetx && !targety) ? 0 : Math.atan2(targety, targetx); + let vx = (targetx != 0 && targetx != undefined) ? Math.cos(direction) * speed : 0; + let vy = (targety != 0 && targety != undefined) ? Math.sin(direction) * speed : 0; + let lifetime = bullet.lifetime; + if (miscast) { + vx = 0; + vy = 0; + //lifetime = 1; + } + let b = {born: 1, time:lifetime, x:x, y:y, vx:vx, vy:vy, xx:x, yy:y, spriteID: KinkyDungeonGetEnemyID() + bullet.name + CommonTime(), + ox: ox, oy: oy, + bullet:bullet, trail:bullet.spell.trail, trailEffectTile: bullet.spell.effectTileTrail}; + KDMapData.Bullets.push(b); + KinkyDungeonUpdateSingleBulletVisual(b, false); + return b; +} + +let KDLastFightDelta = 0; + + +function KinkyDungeonDrawFight(_canvasOffsetX: number, _canvasOffsetY: number, CamX: number, CamY: number) { + let delta = CommonTime() - KDLastFightDelta; + KDLastFightDelta = CommonTime(); + for (let damage of KDDamageQueue) { + if (!damage.Delay || KDTimescale * (performance.now() - KDLastTick) > damage.Delay) { + if (damage.sfx && KDSoundEnabled()) KinkyDungeonPlaySound(damage.sfx); + + if (damage.floater && !KDToggles.NoDmgFloaters) { + KinkyDungeonSendFloater(damage.Entity, damage.floater, damage.Color, (KDToggles.FastFloaters ? 0.3 : 1) * damage.Time, undefined, undefined, damage.size); + } + + KDDamageQueue.splice(KDDamageQueue.indexOf(damage), 1); + } + } + + if (KDToggles.ForceWarnings || KDMouseInPlayableArea()) + for (let t of KDBulletWarnings) { + let scale = t.scale || 0.01; + if (scale < 1) t.scale = Math.max(0, Math.min(1, (t.scale || 0) + delta * 0.005/KDAnimSpeed)); + else scale = 1; + let tx = t.x; + let ty = t.y; + let txvis = (t.x - t.x_orig)*scale + t.x_orig; + let tyvis = (t.y - t.y_orig)*scale + t.y_orig; + + if (tx >= CamX && ty >= CamY && tx < CamX + KinkyDungeonGridWidthDisplay && ty < CamY + KinkyDungeonGridHeightDisplay && KinkyDungeonVisionGet(tx, ty) > 0) { + + KDDraw(kdwarningboardOver, kdpixisprites, tx + "," + ty + "_w" + t.color, KinkyDungeonRootDirectory + "WarningColorSpell.png", + (txvis - CamX+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, (tyvis - CamY+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay*scale, KinkyDungeonGridSizeDisplay*scale, undefined, { + tint: string2hex(t.color || "#ff5277"), + zIndex: -0.1, + alpha: 0.5, + }); + KDDraw(kdwarningboard, kdpixisprites, tx + "," + ty + "_w_b" + t.color, KinkyDungeonRootDirectory + "WarningBacking.png", + (txvis - CamX+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, (tyvis - CamY+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay*scale, KinkyDungeonGridSizeDisplay*scale, undefined, { + tint: string2hex(t.color || "#ff5277"), + zIndex: -0.2, + alpha: 0.5, + }); + KDDraw(kdwarningboard, kdpixisprites, tx + "," + ty + "_w_b_h", KinkyDungeonRootDirectory + "WarningBackingHighlight" + ".png", + (txvis - CamX+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, (tyvis - CamY+0.5-0.5*scale)*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay*scale, KinkyDungeonGridSizeDisplay*scale, undefined, { + zIndex: -0.21, + alpha: 0.5, + }); + } + } + + for (let bullet of KinkyDungeonBulletsVisual.values()) { + if (!bullet.delay || KDTimescale * (performance.now() - KDLastTick) > bullet.delay) { + let sprite = bullet.name; + + let dd = KinkyDungeonUpdateVisualPosition(bullet, KinkyDungeonDrawDelta); + let tx = bullet.visual_x; + let ty = bullet.visual_y; + let scale = bullet.scale != undefined ? bullet.scale : 1.0; + let alpha = bullet.alpha != undefined ? bullet.alpha : 1.0; + let aoe = bullet.aoe ? Number(bullet.aoe) : 3; + + if (KDBulletTransparency) { + if (bullet.vx || bullet.vy) { + alpha *= 0.7; + } else { + alpha *= 0.1; + } + } + + if ((bullet.end) && dd == 0 && (!bullet.scale || bullet.scale <= 0.0)) { + KinkyDungeonBulletsVisual.delete(bullet.spriteID); + } else if (bullet.xx >= CamX && bullet.yy >= CamY && bullet.xx < CamX + KinkyDungeonGridWidthDisplay && bullet.yy < CamY + KinkyDungeonGridHeightDisplay + && (KinkyDungeonVisionGet(Math.round(tx), Math.round(ty)) > 0 || KDistChebyshev(tx - KinkyDungeonPlayerEntity.x, ty - KinkyDungeonPlayerEntity.y) < aoe) && alpha > 0) { + + if (!bullet.end && bullet.temporary && alpha >= 1.0 && scale >= 1.0) { + bullet.end = true; + } + + KDDraw(kdbulletboard, kdpixisprites, bullet.spriteID, KinkyDungeonRootDirectory + "Bullets/" + sprite + ".png", + (tx - CamX + 0.5)*KinkyDungeonGridSizeDisplay, + (ty - CamY + 0.5)*KinkyDungeonGridSizeDisplay, + bullet.size*scale*KinkyDungeonGridSizeDisplay, + bullet.size*scale*KinkyDungeonGridSizeDisplay, + (!bullet.vy && !bullet.vx) ? KDAnimQuantize(Math.PI/3 * (bullet.spin || 1), bullet.spinAngle) : KDAnimQuantize(Math.PI/3 * (bullet.spin || 1), bullet.spinAngle) + Math.atan2(bullet.vy, bullet.vx), { + alpha : alpha, + zIndex: (bullet.zIndex || 0), + }, true); + } + bullet.delay = undefined; + } + } +} + +function KinkyDungeonSendWeaponEvent(Event: string, data: any) { + if (!KDMapHasEvent(KDEventMapWeapon, Event)) return; + if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.events) { + for (let e of KinkyDungeonPlayerDamage.events) { + if (e.trigger == Event && !e.offhandonly && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + KinkyDungeonHandleWeaponEvent(Event, e, KinkyDungeonPlayerDamage, data); + } + } + } + if (KDGameData.Offhand + && KinkyDungeonInventoryGetWeapon(KDGameData.Offhand)) { + let weapon = KDWeapon(KinkyDungeonInventoryGetWeapon(KDGameData.Offhand)); + if (KinkyDungeonInventoryGetWeapon(KDGameData.Offhand).events) { + for (let e of KinkyDungeonInventoryGetWeapon(KDGameData.Offhand).events) { + if (e.trigger == Event && e.offhand && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + KinkyDungeonHandleWeaponEvent(Event, e, KDWeapon(weapon), data); + } + } + } else for (let e of weapon.events) { + if (e.trigger == Event && e.offhand && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + KinkyDungeonHandleWeaponEvent(Event, e, KDWeapon(weapon), data); + } + } + } +} + +function KinkyDungeonSendBulletEvent(Event: string, b: any, data: any) { + if (!KDMapHasEvent(KDEventMapBullet, Event)) return; + if (b && b.bullet) { + if (b.bullet.events) + for (let e of b.bullet.events) { + if (e.trigger == Event) { + KinkyDungeonHandleBulletEvent(Event, e, b, data); + } + } + + if (b.bullet.hitevents) { + for (let e of b.bullet.hitevents) { + if (e.trigger == Event) { + KinkyDungeonHandleBulletEvent(Event, e, b, data); + } + } + } + } else { + for (let bb of KDMapData.Bullets) { + if (bb.bullet?.events) + for (let e of bb.bullet.events) { + if (e.trigger == Event) { + KinkyDungeonHandleBulletEvent(Event, e, bb, data); + } + } + if (bb.bullet?.hitevents) + for (let e of bb.bullet.hitevents) { + if (e.trigger == Event) { + KinkyDungeonHandleBulletEvent(Event, e, bb, data); + } + } + } + } + +} + + +function KDHealRepChange(enemy: entity, amount: number) { + // De-aggro an enemy if you heal them to full + if (enemy.hostile && amount > 0) { + if (enemy.hp >= enemy.Enemy.maxhp - 0.5) { + enemy.hostile = 0; + } + } else if ((!enemy.allied || enemy.allied <= 400) && amount > 0) { + // Befriend enemies if you save them + if (enemy.hp <= 0.25 * enemy.Enemy.maxhp && enemy.allied <= 400) { + enemy.allied = 400; + } else if (enemy.allied < 15) enemy.allied = 15; + } + // Raise rep based on amount + let amountRep = amount * 0.001; + if (KDHostile(enemy)) amountRep *= 0.5; + else if (KDFactionRelation("Player", KDGetFactionOriginal(enemy)) > 0.45) amountRep *= 0; + else if (KDFactionRelation("Player", KDGetFactionOriginal(enemy)) > 0.35) amountRep *= 0.25; + else if (KDFactionRelation("Player", KDGetFactionOriginal(enemy)) > 0.25) amountRep *= 0.5; + if (amountRep > 0 && !KinkyDungeonHiddenFactions.has(KDGetFactionOriginal(enemy))) { + if (amountRep > 0.01) amountRep = 0.01; + KinkyDungeonChangeFactionRep(KDGetFactionOriginal(enemy), amountRep); + } +} + +function KDApplyGenBuffs(entity: entity, buff: string, time: number) { + let buffs = KDBuffReference[buff]; + if (buffs && entity) { + for (let b of buffs) { + let newBuff = Object.assign({}, b); + if (newBuff && time) newBuff.duration = time; + KinkyDungeonApplyBuffToEntity(entity, newBuff); + } + } +} + +function KDSilenceEnemy(enemy: entity, time: number) { + if (!enemy.Enemy?.tags?.silenceimmune) { + if (enemy.Enemy?.tags?.silenceresist) time /= 2; + else if (enemy.Enemy?.tags?.silenceweakness) time *= 2; + if (!enemy.silence) enemy.silence = 0; + enemy.silence = Math.max(time, enemy.silence); + } +} +function KDBlindEnemy(enemy: entity, time: number) { + if (!enemy.Enemy?.tags?.blindimmune) { + if (enemy.Enemy?.tags?.blindresist) time /= 2; + else if (enemy.Enemy?.tags?.blindweakness) time *= 2; + if (!enemy.blind) enemy.blind = 0; + enemy.blind = Math.max(time, enemy.blind); + } + +} +function KDDisarmEnemy(enemy: entity, time: number) { + if (!enemy.Enemy?.tags?.disarmimmune) { + if (enemy.Enemy?.tags?.disarmresist) time /= 2; + else if (enemy.Enemy?.tags?.disarmweakness) time *= 2; + if (!enemy.disarm) enemy.disarm = 0; + enemy.disarm = Math.max(time, enemy.disarm); + } +} + +let KDConditions: Record boolean> = { + "DamageTypeTeasing": (_e, data) => { + return data.damage && KDIsTeasing(data.damage); + }, + "DamageType": (e, data) => { + return data.damage && data.damage.type == e.damage; + }, + "spellType": (e, data) => { + return data.spell?.tags?.includes(e.kind); + }, +}; + +function KDCheckCondition(e: KinkyDungeonEvent, data: any): boolean { + if (!e.condition) return true; + if (KDConditions[e.condition]) return KDConditions[e.condition](e, data); + return false; +} + +let KDPrereqs: Record boolean> = { + "HasWill": (_enemy, _e, _data) => { + return KinkyDungeonStatWill >= 0.1; + }, + "noCorruption": (_enemy, _e, _data) => { + return !KinkyDungeonFlags.get("CurseTypeCorruption") + || (KinkyDungeonFlags.get("CurseTypeLight") && KinkyDungeonFlags.get("CurseTypeCorruption") + && KinkyDungeonFlags.get("CurseTypeLight") > KinkyDungeonFlags.get("CurseTypeCorruption")); + }, + "AlreadyCursed": (_enemy, e, _data) => { + if (KinkyDungeonPlayerTags.get("CursedSet")) return false; + if (e.tags && !KinkyDungeonGetRestraint({tags: [...e.tags],}, + MiniGameKinkyDungeonLevel, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, "")) return false; + for (let inv of KinkyDungeonAllRestraintDynamic()) { + let item = inv.item; + if (item.events.some((event) => {return event.trigger == "CurseTransform" && event.kind == "transform";})) return true; + } + return false; + }, + "NoChastity": (enemy, _e, _data) => {return KDEntityBuffedStat(enemy, "Chastity") < 0.01;}, + "blinded": (enemy, _e, _data) => {return enemy.blind > 0;}, + "silenced": (enemy, _e, _data) => {return enemy.silence > 0;}, + "disarmed": (enemy, _e, _data) => {return enemy.disarm > 0;}, + "bound": (enemy, _e, _data) => {return enemy.boundLevel > 0;}, + "Waiting": (enemy, _e, _data) => {return (enemy && !enemy.player) ? enemy.idle : KinkyDungeonLastTurnAction == "Wait";}, + "damageType": (_enemy, e, data) => { + switch (e.kind) { + case "melee": return KinkyDungeonMeleeDamageTypes.includes(data.Damage?.type); + case "magic": return !KinkyDungeonMeleeDamageTypes.includes(data.Damage?.type); + } + return data.damage?.type == e.kind; + }, + "wepDamageType": (_enemy, e, data) => { + switch (e.kind) { + case "melee": return KinkyDungeonMeleeDamageTypes.includes(KinkyDungeonPlayerDamage?.type); + case "magic": return !KinkyDungeonMeleeDamageTypes.includes(KinkyDungeonPlayerDamage?.type); + } + return data.damage?.type == e.kind; + }, + "afterAmbush": (enemy, _e, _data) => { + return !enemy?.ambushtrigger; + }, + "HaveDildoBatPlus": (_enemy, _e, _data) => { + return KinkyDungeonPlayerWeapon == "DildoBatPlus"; + }, + "LightLoad": (_enemy, e, _data) => { + if (e.requireEnergy && KDGameData.AncientEnergyLevel < e.energyCost) return false; + return !( + KinkyDungeonLastAction == "Attack" + || KinkyDungeonLastAction == "Cast" + || KinkyDungeonLastAction == "Struggle"); + }, + "HeavyLoad": (_enemy, e, _data) => { + if (e.requireEnergy && KDGameData.AncientEnergyLevel < e.energyCost) return false; + return !( + KinkyDungeonLastAction == "Attack" + || KinkyDungeonLastAction == "Move" + || KinkyDungeonLastAction == "Cast" + || KinkyDungeonLastAction == "Struggle"); + }, + "Loaded": (_enemy, _e, _data) => { // Really crude code + return KinkyDungeonPlayerBuffs + && KinkyDungeonPlayerBuffs[KinkyDungeonPlayerDamage.name + "Load"] + && KinkyDungeonPlayerBuffs[KinkyDungeonPlayerDamage.name + "Load"].aura == undefined; + }, +}; +function KDCheckPrereq(enemy: entity, prereq?: string, e?: KinkyDungeonEvent, data?: any): boolean { + if (!prereq) return true; + if (KDPrereqs[prereq]) return KDPrereqs[prereq](enemy, e, data); + return false; +} + +function KDBulletAoEMod(b: any) { + return b?.bullet?.aoetype || b?.bullet?.spell?.aoetype; +} +function KDBulletTrailAoEMod(b: any) { + return b?.bullet?.aoetypetrail || b?.bullet?.spell?.aoetypetrail; +} + +/** + * @param bx + * @param by + * @param xx + * @param yy + * @param rad + * @param [modifier] + * @param [originx] + * @param [originy] + */ +function AOECondition(bx: number, by: number, xx: number, yy: number, rad: number, modifier: string = "", originx?: number, originy?: number): boolean { + if (!originx) originx = bx; + if (!originy) originx = by; + switch (modifier) { + case "vert": + if (bx != xx) return false; + break; + case "horiz": + if (by != yy) return false; + break; + case "cross": + if (by != yy && bx != xx) return false; + break; + case "box": + return KDistChebyshev(bx - xx, by - yy) <= rad; + } + if (KDAOETypes[modifier]) return KDAOETypes[modifier](bx, by, xx, yy, rad, modifier, originx, originy); + return KDistEuclidean(bx - xx, by - yy) <= rad; +} + +/** + * @param xx + * @param yy + * @param name + */ +function KDCreateParticle(xx: number, yy: number, name: string) { + let newB = {born: 0, time:2, x:Math.round(xx), y:Math.round(yy), vx:0, vy:0, xx:xx, yy:yy, spriteID: KinkyDungeonGetEnemyID() + name + CommonTime(), + ox: xx, oy: yy, + bullet:{faction: "Rage", spell:undefined, damage: undefined, lifetime: 2, passthrough:true, name:name, width:1, height:1}}; + KDMapData.Bullets.push(newB); + KinkyDungeonUpdateSingleBulletVisual(newB, false); +} + +function KDIsTeasing(Damage: any): boolean { + return Damage && (Damage.tease || KinkyDungeonTeaseDamageTypes.includes(Damage.type)); +} + +/** + * @param x + * @param y + * @param aoe + * @param Damage + * @param [Attacker] + */ +function KDDealEnvironmentalDamage(x: number, y: number, aoe: number, Damage: any, Attacker?: entity) { + for (let enemy of KDNearbyEnemies(x, y, aoe)) { + KinkyDungeonDamageEnemy(enemy, Damage, true, true, undefined, undefined, Attacker, 0.1); + } + if (KinkyDungeonPlayerEntity.x == x && KinkyDungeonPlayerEntity.y == y) { + KinkyDungeonPlayerEffect(KinkyDungeonPlayerEntity, Damage.type, {name: "EnvDamage", power: Damage.damage, damage: Damage.type, flags: ["EnvDamage"]}, undefined, KDGetFaction(Attacker), undefined); + } +} + + + +function KDCanOffhand(item: item): boolean { + let data = { + item: item, + is2handed: KDWeapon(item)?.clumsy, + is2handedPrimary: KinkyDungeonPlayerDamage?.clumsy, + allowedOffhand: !KinkyDungeonPlayerDamage?.clumsy && KDWeapon(item)?.events?.some((e) => { + return e.offhand; + }), + canOffhand: false, + }; + + KinkyDungeonSendEvent("canOffhand", data); + + return data.item && data.canOffhand && data.allowedOffhand; +} + +/** + * Returns whether or not a weapon takes a damage penalty from not being wielded properly + * e.g. staffs + * @param weapon + */ +function KDWeaponNoDamagePenalty(weapon: Named): boolean { + if (KDWeapon({name: weapon.name})?.noDamagePenalty) return true; + // Quik n dirty + if (KinkyDungeonWeaponVariants[weapon.name]?.events?.some((e) => { + return e.type == "noDamagePenalty" && e.trigger == "calcEvasion";})) return true; + return false; +} + + +/** + * @param weapon + */ +function KDWeaponIsMagic(weapon: Named): boolean { + if (KDWeapon({name: weapon.name})?.magic) return true; + // Quik n dirty + if (KinkyDungeonWeaponVariants[weapon.name]?.events?.some((e) => {return e.type == "IsMagic" && e.trigger == "calcEvasion";})) return true; + return false; +} + +function KDEvasiveManeuversCost() { + let eva = KinkyDungeonPlayerEvasion(); + return (5.0 * eva) + 1 * KinkyDungeonSlowLevel; +} + +/** + * @param entity + */ +function KDEntityBlocksExp(entity: entity): boolean { + return entity.Enemy?.tags?.bulwark || KDEntityBuffedStat(entity, "Bulwark") > 0; +} + +function KDCrackTile(x: number, y: number, allowCrack: boolean, data: any) { + let origTile = KinkyDungeonMapGet(x, y); + KinkyDungeonSendEvent("beforeCrackTile", data); + if (allowCrack || KDCrackableTiles.includes(origTile)) { + + let Mend = KDMendableTiles.includes(data.origTile); + KinkyDungeonMapSet(x, y, '0'); + if (KinkyDungeonTilesGet(x + ',' + y)) { + delete KinkyDungeonTilesGet(x + ',' + y).Type; + } + KDCreateEffectTile(x, y, { + name: Mend ? "Rubble" : "RubbleNoMend", + duration: 9999, + }, 0); + KinkyDungeonUpdateLightGrid = true; + + KinkyDungeonSendEvent("crackTile", data); + } +} + +function KDBindEnemyWithTags(id: number, tags: string[], + amount: number = 0, power: number = 0, + forceConjure: boolean = true, maxTries: number = 100, allowOverride: boolean = false, + allowVariants: boolean = true, maxAdded: number = 10, faction: string = ""): string[] { + let entity = KDGetGlobalEntity(id); + let addedItems: string[] = []; + if (entity) { + let maxBinding = entity.boundLevel + amount; + let expected = KDGetExpectedBondageAmountTotal(id, entity); + let regenEligible = () => { + let currentWill = Math.min(entity.hp, entity.Enemy.maxhp - (entity.boundLevel || 0)/(1 + KDGetBindEffectMult(entity)))/entity.Enemy.maxhp; + let delta = 0.25; + for (let will = currentWill; will >= 0; will = (will == 0 ? -1 : Math.max(0, will - delta))) + restraintsEligible = KDGetNPCEligibleRestraints_fromTags( + id, + tags, + { + forceEffLevel: KDGetEffLevel() + power, + allowVariants: allowVariants, + noOverride: !allowOverride, + forceConjure: forceConjure, + currentWill: will, + } + ); + } + let restraintsEligible: EligibleRestraintEntry[] = []; + regenEligible(); + let iterations = 0; + let added = 0; + + while (added < maxAdded && expected < maxBinding && iterations++ < maxTries && restraintsEligible.length > 0) { + let restraintTry = restraintsEligible[Math.floor(KDRandom() * restraintsEligible.length)]; + let bondageStats = KDGetRestraintBondageStats(restraintTry.restraint, entity); + if ((expected + bondageStats.amount < maxBinding || (iterations > maxTries/2 && + (!KDGetNPCRestraints(id) || !KDGetNPCRestraints(id)[restraintTry.slot.id]) + )) && (!amount || added < amount)) { + // Apply the restraint + let variant: item = null; + if (restraintTry.applyVariant) { + let restraintVariant = KDApplyVarToInvVar( + restraintTry.restraint, + restraintTry.applyVariant); + + variant = KDGetInventoryVariant( + restraintVariant, + restraintTry.applyVariant.prefix, + restraintTry.applyVariant.curse, + undefined, + undefined, + restraintTry.applyVariant.suffix, + faction || restraintTry.faction || KDDefaultNPCBindPalette, + restraintTry.applyVariant.powerBonus + ); + } + + + KinkyDungeonSetEnemyFlag(entity, "bound", 1); + KDSetNPCRestraint(id, restraintTry.slot.id, { + name: variant?.name || restraintTry.restraint.name, + inventoryVariant: variant?.name, + id: variant?.id || KinkyDungeonGetItemID(), + lock: variant?.lock || restraintTry.lock, + conjured: restraintTry.forceConjure, + faction: faction || restraintTry.faction || KDDefaultNPCBindPalette, + events: variant?.events || undefined, + }); + added += bondageStats.amount; + addedItems.push(variant?.name || restraintTry.restraint.name) + // Refresh the stats + expected = KDGetExpectedBondageAmountTotal(id, entity); + + regenEligible(); + } + } + } + + return addedItems; + +} + +function KDWeaponStamPenType(weapon: weapon): string { + if (weapon.stamPenType != undefined) return weapon.stamPenType; + return "Weapon"; +} + +function KDEnemyShieldRegenStopTime(enemy: entity) { + return 3; +} \ No newline at end of file diff --git a/Game/src/fight/KinkyDungeonWeaponList.ts b/Game/src/fight/KinkyDungeonWeaponList.ts new file mode 100644 index 000000000..d5fca5a48 --- /dev/null +++ b/Game/src/fight/KinkyDungeonWeaponList.ts @@ -0,0 +1,634 @@ +"use strict"; + +let KinkyDungeonStatStaminaCostAttack = -1.0; // Cost to attack + +let KDWeaponLootList: Record> = { + "CommonWeapon": { + "Sword": 1, + "Spear": 1, + "Hammer": 1, + "Axe": 1, + "Knife": 2.5, + "Flail": 1, + "Shield": 1.5, + "Foil": 1, + "Pike": 0.5, + "Katana": 0.5, + "Rapier": 0.5, + "Dirk": 1.5, + }, + "CommonToy": { + "Feather": 1, + "Crop": 1, + "IceCube": 1, + "VibeWand": 1, + "DildoBat": 1, + "Scissors": 1, + }, +}; + +/** + */ +let KinkyDungeonWeapons: Record = { + "Unarmed": {name: "Unarmed", damage: 2, chance: 0.9, type: "unarmed", unarmed: true, rarity: 0, shop: false, noequip: true, sfx: "Unarmed", + tags: ["unarmed"], + //tease: true, + events: [ + {type: "ElementalEffectOnDisarm", trigger: "playerAttack", power: 0, damage: "stun", time: 3, chance: 0.5, sfx: "Slap"} + ], + }, + + + "Rock": {name: "Rock", damage: 1.5, chance: 0.8, staminacost: 3.8, type: "crush", + unarmed: false, rarity: 0, shop: true, heavy: true, sfx: "HeavySwing", + crit: 1.5, + tags: ["rock"], + stam50mult: 2.0, + events: [ + {type: "ElementalEffectCrit", trigger: "playerAttack", power: 0, damage: "stun", time: 6, sfx: "Slap"} + ], + }, + + // Knives + "Knife": {name: "Knife", damage: 2.0, chance: 1.1, staminacost: 1.5, type: "slash", unarmed: false, rarity: 1, cutBonus: 0.05, shop: true, sfx: "Unarmed", light: true, + crit: 1.5, + tags: ["knife"], + events: [ + {type: "blockBuff", trigger: "tick", offhand: true, offhandonly: true, power: 0.1}, + ], + }, + "EnchKnife": {name: "EnchKnife", damage: 2.5, chance: 1.1, staminacost: 1.5, type: "cold", unarmed: false, rarity: 3, cutBonus: 0.05, magic: true, shop: true, sfx: "MagicSlash", light: true, + crit: 1.5, + tags: ["knife"], + events: [ + {type: "buffMagicCrit", trigger: "calcCrit", offhand: true, offhandonly: true, power: 0.2}, + ], + }, + "Dirk": {name: "Dirk", damage: 2.5, chance: 1.15, staminacost: 1.8, type: "slash", unarmed: false, rarity: 2, shop: true, cutBonus: 0.05, light: true, sfx: "LightSwing", + crit: 1.75, + tags: ["knife"], + events: [ + {type: "ChangeDamageUnaware", trigger: "beforePlayerAttack", power: 4, damage: "pierce"}, + {type: "buffWeaponCrit", trigger: "calcCrit", offhand: true, offhandonly: true, power: 0.1}, + ], + }, + + // Shields + "Shield": {name: "Shield", damage: 2.0, chance: 0.6, staminacost: 5.5, type: "crush", unarmed: false, rarity: 2, shop: false, sfx: "HeavySwing", + crit: 1.1, + clumsy: true, + tags: ["shield"], + events: [ + {type: "blockBuff", trigger: "tick", power: 0.6, offhand: true, kind: "Shield",}, + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "stun", time: 4} + ]}, + "ShieldTower": {name: "ShieldTower", damage: 4.0, chance: 0.25, staminacost: 6.0, type: "crush", unarmed: false, rarity: 4, shop: true, sfx: "HeavySwing", + clumsy: true, heavy: true, massive: true, + crit: 1.1, channelslow: true, + tags: ["shield"], + events: [ + {type: "armorBuff", trigger: "tick", offhand: true, kind: "Shield", power: 3.0}, + {type: "blockBuff", trigger: "tick", offhand: true, kind: "Shield", power: 1.2}, + {type: "slowLevel", trigger: "tick", offhand: true, kind: "Shield", power: 1}, + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "stun", time: 7} + ]}, + "ShieldReinforced": {name: "ShieldReinforced", damage: 3.0, chance: 0.4, staminacost: 5.5, type: "crush", unarmed: false, rarity: 3, shop: true, sfx: "HeavySwing", + crit: 1.1, + clumsy: true, heavy: true, + tags: ["shield"], + events: [ + {type: "armorBuff", trigger: "tick", offhand: true, kind: "Shield", power: 1.5}, + {type: "blockBuff", trigger: "tick", offhand: true, kind: "Shield", power: 0.8}, + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "stun", time: 5} + ]}, + "ShieldMagic": {name: "ShieldMagic", damage: 3.0, chance: 0.4, staminacost: 5.5, type: "crush", unarmed: false, rarity: 4, shop: true, sfx: "HeavySwing", + crit: 1.1, + clumsy: true, heavy: true, + tags: ["shield"], + events: [ + {type: "spellWardBuff", trigger: "tick", offhand: true, kind: "Shield", power: 2.0}, + {type: "blockBuff", trigger: "tick", offhand: true, kind: "Shield", power: 0.8}, + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "stun", time: 5} + ]}, + + // Swords + "Sword": {name: "Sword", damage: 3, chance: 1.5, staminacost: 2.4, type: "slash", unarmed: false, rarity: 2, shop: false, cutBonus: 0.01, + tags: ["sword"], + sfx: "LightSwing"}, + "ChainSword": {name: "ChainSword", damage: 2.5, bind: 1.0, bindType: "Metal", addBind: true, chance: 1.6, staminacost: 2.4, type: "slash", unarmed: false, rarity: 3, shop: true, cutBonus: 0.01, + tags: ["sword", "bondage"], + sfx: "Chain"}, + "SlimeSword": {name: "SlimeSword", damage: 2.4, bind: 2.5, bindEff: 0, bindType: "Slime", addBind: true, chance: 1.3, staminacost: 2.6, type: "glue", unarmed: false, rarity: 3, shop: true, + tags: ["sword", "bondage"], + sfx: "RubberBolt"}, + "Katana": {name: "Katana", damage: 3, chance: 1.5, staminacost: 3.0, type: "slash", unarmed: false, rarity: 4, shop: true, cutBonus: 0.01, sfx: "LightSwing", + tags: ["sword"], + crit: 1.5, + events: [ + {type: "Patience", trigger: "tick", power: 11, buffType: "KatanaCharge", color: "#ffffff"}, + {type: "KatanaBoost", trigger: "beforePlayerAttack", power: 0.25, sfx: "Fwoosh"}, + ] + }, + "DarkKatana": {name: "DarkKatana", damage: 3, chance: 2.0, staminacost: 2.6, type: "cold", unarmed: false, rarity: 5, shop: false, magic: true, cutBonus: 0.01, sfx: "LightSwing", + tags: ["sword"], + crit: 2.0, + events: [ + {type: "DamageMultInShadow", trigger: "beforePlayerAttack", power: 2.0, sfx: "Fwoosh"}, + ] + }, + "MagicSword": {name: "MagicSword", damage: 3, chance: 2, staminacost: 2.3, type: "slash", unarmed: false, rarity: 6, shop: false, magic: true, cutBonus: 0.1, + tags: ["sword"], + sfx: "LightSwing"}, + "Flamberge": {name: "Flamberge", damage: 2.0, chance: 1.0, staminacost: 2.8, type: "fire", unarmed: false, rarity: 4, shop: true, cutBonus: 0.1, sfx: "FireSpell", magic: true, + tags: ["illum", "sword"], + events: [{type: "ElementalEffect", trigger: "playerAttack", power: 2.0, damage: "slash"}, {type: "WeaponLight", trigger: "getLights", offhand: true, power: 5}], + special: {type: "ignite"},}, + "FrostSword": {name: "FrostSword", damage: 1.5, chance: 1.0, staminacost: 2.5, type: "slash", unarmed: false, rarity: 4, shop: true, cutBonus: 0.1, sfx: "LesserFreeze", magic: true, + tags: ["illum", "sword"], + events: [{type: "ElementalEffect", trigger: "playerAttack", power: 2.0, time: 5, damage: "frost"}, {type: "WeaponLight", trigger: "getLights", power: 3, color: "#92e8c0"}] + }, + "Foil": {name: "Foil", damage: 0.8, chance: 1.5, staminacost: 1.5, type: "pierce", unarmed: false, rarity: 3, shop: true, sfx: "Miss", + tags: ["sword"], + crit: 2.0, + events: [ + {type: "ChangeDamageVulnerable", trigger: "beforePlayerAttack", power: 3.0, damage: "pierce"}, + ], + }, + "Rapier": {name: "Rapier", damage: 2.5, chance: 1.3, staminacost: 3.0, type: "slash", unarmed: false, rarity: 4, shop: true, sfx: "LightSwing", + tags: ["sword"], + crit: 1.5, + events: [ + {type: "ChangeDamageVulnerable", trigger: "beforePlayerAttack", power: 5.0, damage: "pierce"}, + ], + }, + + // Axes + "Axe": {name: "Axe", damage: 2.4, chance: 1.0, staminacost: 3, type: "slash", unarmed: false, rarity: 2, shop: false, sfx: "HeavySwing", + tags: ["axe"], + stam50mult: 1.5, + events: [{type: "Cleave", trigger: "playerAttack", power: 2, damage: "slash"}]}, + "MagicAxe": {name: "MagicAxe", damage: 2.8, chance: 1.0, staminacost: 3, type: "slash", unarmed: false, rarity: 6, + magic: true, shop: false, cutBonus: 0.2, sfx: "HeavySwing", + tags: ["axe"], + stam50mult: 1.5, + crit: 1.5, + events: [{type: "Cleave", trigger: "playerAttack", power: 2, damage: "cold", time: 3}, + {type: "ShadowBleed", trigger: "afterPlayerAttack", time: 10, power: 0.6, damage: "cold"}, + {type: "ShadowBleedCleave", trigger: "afterPlayerAttack", time: 10, power: 0.6, damage: "cold"}, + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "cold", time: 3}]}, + + // Hammers + "Hammer": {name: "Hammer", damage: 2.5, chance: 1.0, staminacost: 4, type: "crush", unarmed: false, rarity: 2, shop: true, sfx: "HeavySwing", cutBonus: 0.01, + tags: ["hammer"], + crit: 1.2, + stam50mult: 2, + clumsy: true, + events: [{type: "Knockback", trigger: "playerAttack", dist: 1}]}, + "Maul": {name: "Maul", damage: 5, chance: 1.0, staminacost: 6, type: "crush", unarmed: false, rarity: 3, shop: true, sfx: "HeavySwing", + tags: ["hammer"], + crit: 1.5, + stam50mult: 1.25, + heavy: true, + clumsy: true, + events: [{type: "Knockback", trigger: "playerAttack", dist: 2}, + {type: "ElementalEffectOnBarricade", trigger: "playerAttack", power: 10, damage: "crush", sfx: "HeavyThudPixel"}]}, + "MagicHammer": {name: "MagicHammer", damage: 3, chance: 1.0, staminacost: 3.5, type: "crush", unarmed: false, rarity: 7, magic: true, shop: false, cutBonus: 0.01, sfx: "HeavySwing", + tags: ["hammer"], + crit: 1.2, + stam50mult: 2, + clumsy: true, + events: [{type: "Knockback", trigger: "playerAttack", dist: 1}]}, + "IceBreaker": {name: "IceBreaker", damage: 2.0, chance: 1.2, staminacost: 2.4, type: "crush", unarmed: false, rarity: 5, magic: true, shop: false, sfx: "HeavySwing", + tags: ["hammer"], + stam50mult: 2.0, + clumsy: true, + events: [{type: "MultiplyDamageFrozen", trigger: "beforeDamageEnemy", power: 1.5}]}, + "StormBreaker": {name: "StormBreaker", damage: 2.0, chance: 1.0, staminacost: 2.6, type: "crush", unarmed: false, rarity: 5, magic: true, shop: false, sfx: "HeavySwing", + tags: ["hammer"], + crit: 1.4, + stam50mult: 2.0, + clumsy: true, + events: [ + {type: "Buff", kind: "Weapon", trigger: "tick", power: 1.0, buffType: "electricDamageResist", offhand: true}, + {type: "StormBreakerDamage", trigger: "playerAttack", power: 4.0, sfx: "Shock", aoe: 1.5, damage: "electric"}, + {type: "StormBreakerCharge", trigger: "beforePlayerDamage", power: 1.5, damageTrigger: "electric", color: "#3de1ff"}, + ]}, + + // Flails + "Flail": {name: "Flail", damage: 2.5, chance: 1.4, staminacost: 2.8, type: "crush", unarmed: false, rarity: 2, shop: true, sfx: "LightSwing", + tags: ["mace"], + crit: 1.5, + events: [{type: "Cleave", trigger: "playerAttack", power: 1, damage: "crush"}]}, + "MagicFlail": {name: "MagicFlail", damage: 2.5, chance: 1.5, staminacost: 3.0, type: "crush", unarmed: false, rarity: 5, magic: true, shop: false, sfx: "LightSwing", + tags: ["mace"], + crit: 2.0, + events: [{type: "MagicFlail", trigger: "playerAttack", power: 2, damage: "holy", crit: 2.0}]}, + + // Spears + "Spear": {name: "Spear", damage: 4.0, chance: 1.0, staminacost: 3.3, type: "pierce", unarmed: false, rarity: 2, shop: false, sfx: "LightSwing", + tags: ["spear"], + crit: 1.4, + special: {type: "attack", range: 2.99}, + events: [{type: "Pierce", trigger: "playerAttack", power: 4.0, damage: "pierce"}]}, + "Pike": {name: "Pike", damage: 4.4, chance: 1.0, staminacost: 3.5, type: "pierce", unarmed: false, rarity: 3, shop: false, sfx: "LightSwing", + tags: ["spear"], + crit: 1.25, + clumsy: true, + heavy: true, + special: {type: "attack", range: 3.99}, + events: [{type: "Pierce", trigger: "playerAttack", power: 4.4, damage: "pierce"}]}, + "MagicSpear": {name: "MagicSpear", damage: 4.0, chance: 1.5, staminacost: 3.3, type: "pierce", unarmed: false, rarity: 5, magic: true, shop: true, sfx: "LightSwing", + tags: ["spear"], + crit: 1.5, + special: {type: "attack", range: 2.99}, + events: [{type: "Pierce", trigger: "playerAttack", power: 4.0, damage: "pierce", dist: 2}]}, + + // Specialty Weapons + "StaffTape": {name: "StaffTape", damage: 1, bindEff: 2.0, bindType: "Tape", addBind: true, chance: 1.0, staminacost: 1.5, type: "chain", unarmed: false, rarity: 4, shop: true, sfx: "Tape", magic: false, + tags: ["bondage"], noDamagePenalty: true, + events: [ + {type: "ApplyTaped", trigger: "playerAttack", power: -0.15, duration: 12}, + {type: "DealDamageToTaped", trigger: "playerMove", power: 1.0, dist: 1.5, damage: "chain", addBind: true, bindType: "Tape", bindEff: 2.0, sfx: "TapeStruggle"}, + ] + }, + + // Tier 1 Staves + "StaffFlame": {name: "StaffFlame", damage: 4, chance: 0.85, staminacost: 5.0, type: "fire", unarmed: false, rarity: 3, shop: true, sfx: "MagicSlash", magic: true, + tags: ["staff"], noDamagePenalty: true, + crit: 1.1, + stamPenType: "Staff", + events: [{type: "Buff", kind: "Staff", trigger: "tick", power: 0.15, buffType: "fireDamageBuff", offhand: true}], + special: {type: "ignite"},}, + "StaffChain": {name: "StaffChain", damage: 3, bindEff: 1.25, bindType: "Metal", addBind: true, chance: 1.1, staminacost: 3.0, type: "chain", unarmed: false, rarity: 4, shop: true, sfx: "Chain", magic: true, + tags: ["staff", "bondage"], noDamagePenalty: true, + crit: 1.1, + stamPenType: "Staff", + events: [{type: "Buff", kind: "Staff", trigger: "tick", power: 0.1, buffType: "chainDamageBuff", offhand: true}, + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "chain", time: 2}]}, + "StaffGlue": {name: "StaffGlue", damage: 3, bindEff: 1.5, bindType: "Slime", addBind: true, chance: 1.0, staminacost: 4.0, type: "glue", unarmed: false, rarity: 4, shop: true, sfx: "MagicSlash", magic: true, + tags: ["staff", "bondage"], noDamagePenalty: true, + crit: 1.1, + stamPenType: "Staff", + events: [{type: "Buff", kind: "Staff", trigger: "tick", power: 0.1, buffType: "glueDamageBuff", offhand: true}]}, + "StaffElectric": {name: "StaffElectric", damage: 3, chance: 1.1, staminacost: 4.0, type: "electric", unarmed: false, rarity: 3, shop: true, sfx: "Shock", magic: true, + tags: ["staff"], noDamagePenalty: true, + crit: 1.1, + stamPenType: "Staff", + events: [{type: "Buff", kind: "Staff", trigger: "tick", power: 0.1, buffType: "electricDamageBuff", offhand: true}, {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "electric", time: 3, chance: 0.1}]}, + "StaffPermafrost": {name: "StaffPermafrost", damage: 4, chance: 1.0, staminacost: 4.0, type: "ice", unarmed: false, rarity: 3, shop: true, sfx: "MagicSlash", magic: true, + tags: ["staff"], noDamagePenalty: true, + crit: 1.1, + stamPenType: "Staff", + events: [{type: "Buff", kind: "Staff", trigger: "tick", power: 0.1, buffType: "iceDamageBuff", offhand: true}, + {type: "Buff", kind: "Staff", trigger: "tick", power: 0.1, buffType: "frostDamageBuff", offhand: true}, + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "ice", time: 4, chance: 0.15}, + {type: "MultiplyTime", trigger: "beforeDamageEnemy", power: 1.5, damage: "ice"}]}, + + // Tier 2 Staves + "StaffBind": {name: "StaffBind", damage: 2.3, bindEff: 1, bindType: "Metal", addBind: true, chance: 1.0, staminacost: 3.0, type: "chain", unarmed: false, rarity: 5, shop: true, sfx: "Chain", magic: true, + tags: ["staff", "bondage"], noDamagePenalty: true, + crit: 1.1, + stamPenType: "Staff", + events: [ + {type: "Buff", kind: "Staff", trigger: "tick", power: 0.2, buffType: "chainDamageBuff", offhand: true}, + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "chain", time: 4}]}, + "StaffIncineration": {name: "StaffIncineration", damage: 6, chance: 0.7, staminacost: 5.0, type: "fire", unarmed: false, rarity: 5, shop: true, sfx: "MagicSlash", magic: true, + tags: ["staff"], noDamagePenalty: true, + crit: 1.1, + stamPenType: "Staff", + events: [ + {type: "Buff", kind: "Staff", trigger: "tick", power: 0.25, buffType: "fireDamageBuff", offhand: true}, + {type: "AoEDamageBurning", trigger: "tick", aoe: 10, power: 0.5, damage: "fire"}], + special: {type: "ignite"},}, + "StaffStorm": {name: "StaffStorm", damage: 4.5, chance: 1.0, staminacost: 4.5, type: "electric", unarmed: false, rarity: 7, shop: true, sfx: "Shock", magic: true, + tags: ["staff"], noDamagePenalty: true, + crit: 1.1, + stamPenType: "Staff", + events: [ + {type: "Buff", kind: "Staff", trigger: "tick", power: 0.2, buffType: "electricDamageBuff", offhand: true}, + {type: "EchoDamage", trigger: "beforeDamageEnemy", aoe: 2.99, power: 1.5, damage: "electric"}]}, + "StaffDoll": {name: "StaffDoll", damage: 3.0, chance: 1.0, staminacost: 4.0, type: "soul", unarmed: false, rarity: 6, shop: true, sfx: "MagicSlash", magic: true, + tags: ["staff", "bondage"], noDamagePenalty: true, + crit: 1.1, + stamPenType: "Staff", + events: [ + {type: "Buff", kind: "Staff", trigger: "tick", power: 0.15, buffType: "glueDamageBuff", offhand: true}, + {type: "Dollmaker", trigger: "capture"}]}, + "StaffFrostbite": {name: "StaffFrostbite", damage: 4, chance: 1.0, staminacost: 4.0, type: "ice", unarmed: false, rarity: 5, shop: true, sfx: "MagicSlash", magic: true, + tags: ["staff"], noDamagePenalty: true, + crit: 1.1, + stamPenType: "Staff", + events: [{type: "Buff", kind: "Staff", trigger: "tick", power: 0.2, buffType: "iceDamageBuff", offhand: true}, + {type: "Buff", kind: "Staff", trigger: "tick", power: 0.2, buffType: "frostDamageBuff", offhand: true}, + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "ice", time: 4, chance: 0.25}, + {type: "AoEDamageFrozen", trigger: "tick", aoe: 10, power: 0.5, damage: "ice"}]}, + + // Tier 1 orbs + "ArcaneCrystal": {name: "ArcaneCrystal", damage: 3.3, chance: 0.8, staminacost: 3.0, type: "arcane", + noHands: true, unarmed: false, novulnerable: true, magic: true, rarity: 2, shop: true, sfx: "Laser", + nocrit: true, + stamPenType: "Staff", + tags: ["illum"], noDamagePenalty: true, + angle: 0, + events: [{type: "WeaponLight", trigger: "getLights", offhand: true, power: 3.5, color: "#6700ff"}, {type: "Float", trigger: "draw"}, ]}, + "ArcaneTome": {name: "ArcaneTome", damage: 1.5, chance: 1.0, staminacost: 1.5, crit: 1.0, + tags: ["tome"], noDamagePenalty: true, + type: "arcane", unarmed: false, novulnerable: true, magic: true, rarity: 2, shop: true, sfx: "Laser", + nocrit: true, + angle: 0, + stamPenType: "Staff", + special: {type: "spell", selfCast: true, spell: "TomeArcane", prereq: "HasWill"}, + events: [ + {type: "Buff", kind: "Book", trigger: "tick", power: 0.05, buffType: "magicDamageBuff", offhand: true}, + ]}, + "BondageTome": {name: "BondageTome", damage: 1.5, chance: 1.0, staminacost: 1.5, crit: 1.0, + tags: ["tome"], noDamagePenalty: true, + type: "chain", unarmed: false, novulnerable: true, magic: true, rarity: 3, shop: true, sfx: "Chain", + nocrit: true, + angle: 0, + stamPenType: "Staff", + bindType: "Magic", bindEff: 1.5, bindcrit: 2.0, addBind: true, + special: {type: "spell", selfCast: true, spell: "TomeBondage", prereq: "HasWill"}, + events: [ + {type: "Buff", kind: "Book", trigger: "tick", power: 0.1, buffType: "BindAmp", offhand: true}, + ]}, + + // Techy + "Slimethrower": {name: "Slimethrower", damage: 3.5, chance: 1.0, staminacost: 6.0, type: "crush", unarmed: false, rarity: 6, shop: false, sfx: "HeavySwing", + tags: ["ranged"], + crit: 1.1, + angle: 0, + special: {type: "spell", spell: "Slimethrower", requiresEnergy: true, energyCost: 0.015}}, + "EscortDrone": {name: "EscortDrone", damage: 1.5, chance: 1.0, staminacost: 0.0, type: "electric", noHands: true, unarmed: false, rarity: 5, shop: false, sfx: "Laser", + tags: ["illum", "drone"], noDamagePenalty: true, + crit: 1.1, + angle: 0, + events: [{type: "ElementalEffect", trigger: "playerAttack", power: 0, chance: 0.33, damage: "electric", time: 4}, + {type: "Float", trigger: "draw"}, {type: "WeaponLight", offhand: true, trigger: "getLights", power: 4}]}, + + // Special + "BoltCutters": {name: "BoltCutters", damage: 3.5, staminacost: 3.8, chance: 1.0, type: "crush", unarmed: false, rarity: 4, shop: false, cutBonus: 0.3, sfx: "Unarmed", + tags: ["utility"], + crit: 1.1, + events: [{type: "DamageToTag", trigger: "playerAttack", requiredTag: "lock", power: 7, damage: "slash", chance: 1.0}]}, + "Pickaxe": {name: "Pickaxe", damage: 3, chance: 1.0, staminacost: 3.0, type: "pierce", unarmed: false, rarity: 3, shop: true, sfx: "LightSwing", + tags: ["utility"], + crit: 1.4, + digSpell: "Pickaxe", + special: {type: "spell", spell: "Pickaxe", range: 1.5}, + events: [{type: "ApplyBuff", trigger: "playerAttack", buff: {id: "ArmorDown", type: "ArmorBreak", duration: 6, power: -1.5, player: true, enemies: true, tags: ["debuff", "armor"]}}]}, + "Torch": {name: "Torch", damage: 1.5, chance: 0.75, type: "fire", unarmed: false, rarity: 1, shop: true, sfx: "FireSpell", + crit: 1.1, noDamagePenalty: true, + angle: 0, + tags: ["illum", "utility"], + events: [{type: "WeaponLight", trigger: "getLights", offhand: true, power: 5, color: "#ff8933"}], + special: {type: "ignite"},}, + "Flashlight": {name: "Flashlight", damage: 1.0, chance: 1.0, type: "crush", unarmed: false, rarity: 2, shop: true, sfx: "Miss", light: true, + crit: 1.1, + angle: 0, + tags: ["illum", "utility"], + events: [{type: "WeaponLightDirectional", trigger: "getLights", offhand: true, power: 7, dist: 5, color: "#ffdd00"}], + }, + + // BDSM Gear + "Feather": {name: "Feather", damage: 0.1, chance: 1.25, + tags: ["toy"], + crit: 2.0, + events: [ + {type: "ElementalEffectStamCost", trigger: "playerAttack", power: 0.1, distract: 1, damage: "tickle", offhand: true, offhandonly: true, cost: 0.3, sfx: "Tickle"}, + ], + staminacost: 0.5, distract: 2, type: "tickle", unarmed: false, rarity: 1, shop: true, sfx: "Tickle"}, + "Duster": {name: "Duster", damage: 1.5, chance: 1.5, + tags: ["toy"], + crit: 2.5, + events: [ + {type: "ElementalEffectStamCost", trigger: "playerAttack", power: 0, distract: 1.5, damage: "tickle", offhand: true, offhandonly: true, sfx: "Tickle", cost: 0.1}, + ], + staminacost: 1.0, distract: 4, type: "tickle", unarmed: false, rarity: 2, shop: true, sfx: "Tickle"}, + "Crop": {name: "Crop", damage: 2.5, chance: 1.0, staminacost: 2.0, + tags: ["toy"], + events: [ + {type: "ElementalEffectStamCost", trigger: "playerAttack", power: 0.5, damage: "pain", offhand: true, offhandonly: true, cost: 0.3, sfx: "Whip"}, + ], + crit: 1.8, distract: 3, type: "pain", tease: true, unarmed: false, rarity: 2, shop: true, sfx: "Whip"}, + "IceCube": {name: "IceCube", damage: 1.5, chance: 1.0, staminacost: 1.0, + tags: ["toy"], noDamagePenalty: true, + crit: 2.0, + distract: 1, type: "ice", tease: true, unarmed: false, rarity: 2, shop: true, sfx: "Freeze", + events: [ + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "ice", time: 3, chance: 0.1}, + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "frost", time: 2, offhand: true}, + ] + }, + "Rope": {name: "Rope", damage: 1.0, bind: 5, chance: 1.0, staminacost: 1.0, type: "chain", + tags: ["bondage"], + crit: 1.1, unarmed: false, rarity: 1, shop: true, sfx: "Struggle", addBind: true, bindType: "Rope"}, + "MagicRope": {name: "MagicRope", damage: 1.0, bind: 5, chance: 1.0, staminacost: 1.0, type: "chain", unarmed: false, rarity: 4, magic: true, shop: true, sfx: "TapeStruggle", bindType: "Rope", + tags: ["illum", "bondage"], noDamagePenalty: true, addBind: true, + events: [ + {type: "MagicRope", trigger: "playerAttack", power: 0, addBind: true, cost: 1, bindType: "Magic", bind: 5}, + {type: "WeaponLight", trigger: "getLights", offhand: true, power: 3, color: "#92e8c0"} + ], + }, + "VibeWand": {name: "VibeWand", damage: 2.0, chance: 1.0, staminacost: 1.5, type: "charm", unarmed: false, rarity: 2, shop: true, sfx: "Vibe", + tags: ["toy"], noDamagePenalty: true, + crit: 1.4, + angle: 0, + playSelfBonus: 4, + arousalMode: true, + playSelfMsg: "KinkyDungeonPlaySelfVibeWand", + playSelfSound: "Vibe", + events: [ + {type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "stun", time: 2, chance: 0.2}, + {type: "ElementalEffectStamCost", trigger: "playerAttack", power: 0.5, damage: "charm", offhand: true, offhandonly: true, cost: 0.3, sfx: "Vibe"}, + ]}, + "BagOfGoodies": {name: "BagOfGoodies", arousalMode: true, damage: 0.4, chance: 1.0, staminacost: 0.5, type: "charm", unarmed: false, rarity: 2, shop: false, sfx: "Vibe", + tags: ["toy"], noDamagePenalty: true, + crit: 1.1, + playSelfBonus: 3, + playSelfMsg: "KinkyDungeonPlaySelfBagOfGoodies", + playSelfSound: "Vibe", + events: [ + {type: "ApplyToy", trigger: "playerAttack", duration: 40, offhand: true}, + ], + special: {type: "spell", spell: "CommandVibrateBagOfGoodies", requiresEnergy: true, energyCost: 0.01, range: 4.5}, + }, + "VibeRemote": {name: "VibeRemote", damage: 0.1, chance: 0.4, staminacost: 0.5, type: "charm", unarmed: false, rarity: 3, shop: true, magic: true, sfx: "Vibe", + tags: ["toy"], noDamagePenalty: true, + crit: 1.1, + arousalMode: true, + events: [ + {type: "ActivateVibration", trigger: "playerAttack", power: 1, time: 15}, + {type: "ActivateVibration", trigger: "playerAttack", power: 2, time: 5, offhand: true, offhandonly: true} + ], + special: {type: "spell", spell: "CommandVibrateVibeRemote", requiresEnergy: true, energyCost: 0.015}}, + + + "DildoBat": {name: "DildoBat", damage: 1.5, chance: 2.0, staminacost: 3, + tags: ["toy"], noDamagePenalty: true, + crit: 3.0, type: "grope", unarmed: false, rarity: 3, shop: true, sfx: "RubberBolt"}, + "DildoBatPlus": {name: "DildoBatPlus", damage: 2.0, chance: 2.0, staminacost: 3, type: "grope", unarmed: false, rarity: 4, shop: false, sfx: "RubberBolt", + tags: ["toy"], noDamagePenalty: true, + crit: 3.0, + special: {type: "spell", selfCast: true, spell: "DildoBatBuff", requiresEnergy: true, energyCost: 0.04}, + }, + + "Scissors": {name: "Scissors", damage: 1.2, chance: 1.8, staminacost: 0.7, type: "slash", unarmed: false, rarity: 2, shop: true, light: true, cutBonus: 0.1, + sfx: "Cut"}, + + "Blaster": {name: "Blaster", damage: 1, chance: 1.0, crit: 1.1, staminacost: 0.5, type: "tickle", unarmed: false, rarity: 6, shop: false, sfx: "Shock", + tags: ["blaster", "ranged"], noDamagePenalty: true, + special: {type: "spell", spell: "BlasterBlast", requiresEnergy: true, energyCost: 0.01, range: 8}}, + + "Persuader": {name: "Persuader", damage: 2.5, chance: 1.0, crit: 1.5, + staminacost: 1.4, type: "tickle", unarmed: false, rarity: 7, shop: false, sfx: "Tickle", + tags: ["gun", "ranged", "duster"], noDamagePenalty: true, + clumsy: true, + events: [ + {type: "Reload", trigger: "tick", requireEnergy: true, energyCost: 0.02, power: 3, color: "#ffffff", prereq: "LightLoad"}, + {type: "Unload", trigger: "playerCastSpecial", power: 0, mult: 0}, + ], + special: {type: "spell", spell: "PlayerRubberSniper", prereq: "Loaded", requiresEnergy: true, energyCost: 0.02, range: 12}}, + + "Sweeper": {name: "Sweeper", damage: 2.5, chance: 1.0, + staminacost: 3.2, type: "slash", unarmed: false, rarity: 7, + magic: false, shop: false, cutBonus: 0.15, sfx: "HeavySwing", + tags: ["halberd"], + stam50mult: 1.6, + clumsy: true, + crit: 1.75, + distract: 5, + special: {type: "attack", range: 2.99}, + events: [ + {type: "Cleave", trigger: "playerAttack", power: 3, damage: "tickle", time: 3}, + ]}, + + + // Bows + "Bow": {name: "Bow", damage: 1.0, chance: 0.8, staminacost: 1, type: "crush", unarmed: false, rarity: 2, shop: true, sfx: "Miss", + clumsy: true, + crit: 1.5, + tags: ["bow", "normalbow", "ranged"], + special: {type: "spell", spell: "ArrowNormal", requiresEnergy: true, energyCost: 0.01, range: 6}}, + "BowRecurve": {name: "BowRecurve", damage: 1.3, chance: 0.7, staminacost: 1, type: "crush", unarmed: false, rarity: 3, shop: true, sfx: "Miss", + clumsy: true, + crit: 1.5, + tags: ["bow", "normalbow", "ranged"], + events: [ + {type: "Reload", trigger: "tick", requireEnergy: true, energyCost: 0.014, power: 1, color: "#ffffff", prereq: "LightLoad"}, + {type: "Unload", trigger: "playerCastSpecial", power: 0, mult: 0}, + ], + special: {type: "spell", spell: "ArrowRecurve", prereq: "Loaded", requiresEnergy: true, energyCost: 0.014, range: 6}}, + "Longbow": {name: "Longbow", damage: 1.4, chance: 0.6, staminacost: 1, type: "crush", unarmed: false, rarity: 4, shop: true, sfx: "Miss", + clumsy: true, + crit: 1.5, + tags: ["bow", "normalbow", "ranged"], + events: [ + {type: "Reload", trigger: "tick", requireEnergy: true, energyCost: 0.018, power: 2, color: "#ffffff", prereq: "LightLoad"}, + {type: "Unload", trigger: "playerCastSpecial", power: 0, mult: 0}, + ], + special: {type: "spell", spell: "ArrowLongbow", prereq: "Loaded", requiresEnergy: true, energyCost: 0.018, range: 8}}, + + "Crossbow": {name: "Crossbow", damage: 1.5, chance: 0.5, staminacost: 1, type: "crush", unarmed: false, rarity: 3, shop: true, sfx: "Miss", + clumsy: true, + crit: 2.0, + tags: ["bow", "normalbow", "crossbow", "ranged"], + events: [ + {type: "Reload", trigger: "tick", requireEnergy: true, energyCost: 0.02, power: 3, color: "#ffffff", prereq: "HeavyLoad"}, + {type: "Unload", trigger: "playerCastSpecial", power: 0, mult: 0}, + ], + special: {type: "spell", spell: "ArrowBolt", prereq: "Loaded", requiresEnergy: true, energyCost: 0.02, range: 8}}, + + "CrossbowPistol": {name: "CrossbowPistol", damage: 1.5, chance: 1.0, staminacost: 1, type: "crush", unarmed: false, rarity: 4, shop: true, sfx: "Miss", + clumsy: true, + crit: 2.0, + tags: ["bow", "normalbow", "crossbow", "ranged"], + events: [ + {type: "Reload", trigger: "tick", requireEnergy: true, energyCost: 0.015, power: 3, color: "#ffffff", prereq: "LightLoad"}, + {type: "Unload", trigger: "playerCastSpecial", power: 0, mult: 0}, + ], + special: {type: "spell", spell: "ArrowBoltPistol", prereq: "Loaded", requiresEnergy: true, energyCost: 0.015, range: 9}}, + + "CrossbowHeavy": {name: "CrossbowHeavy", damage: 3.0, chance: 0.3, staminacost: 2.0, type: "crush", unarmed: false, rarity: 5, shop: true, sfx: "Miss", + clumsy: true, + heavy: true, + crit: 2.5, + tags: ["bow", "normalbow", "crossbow", "ranged"], + events: [ + {type: "Reload", trigger: "tick", requireEnergy: true, energyCost: 0.025, power: 5, color: "#ffffff", prereq: "HeavyLoad"}, + {type: "Unload", trigger: "playerCastSpecial", power: 0, mult: 0}, + ], + special: {type: "spell", spell: "ArrowBoltHeavy", prereq: "Loaded", requiresEnergy: true, energyCost: 0.025, range: 12}}, + + // Divine + "MoiraiScissors": {name: "MoiraiScissors", crit: 2.0, damage: 3.0, chance: 1.1, staminacost: 2.0, type: "slash", unarmed: false, rarity: 10, shop: false, magic: true, cutBonus: 0.4, sfx: "Cut", + tags: ["divine"], + special: {type: "spell", spell: "MoiraiScissors", selfCast: true, requiresEnergy: true, energyCost: 0.05}, + events: [ + {type: "ApplyBuff", trigger: "beforePlayerAttack", buff: {id: "MoiraiScissors", type: "ArmorBreak", duration: 1, power: 10, player: true, enemies: true, tags: ["debuff", "armor"]}}, + {type: "ApplyBuff", trigger: "beforePlayerAttack", buff: {id: "MoiraiScissors2", type: "SpellResistBreak", duration: 1, power: 10, player: true, enemies: true, tags: ["debuff", "armor"]}}, + //{type: "DoubleStrike", trigger: "afterPlayerAttack", requireEnergy: true, energyCost: 0.005}, + //{type: "ConvertBindingToDamage", trigger: "afterPlayerAttack", power: 1.0, bind: 3.0, damage: "soul"}, + ], + }, + "Dreamcatcher": {name: "Dreamcatcher", crit: 1.5, damage: 2.5, chance: 1.0, staminacost: 1.5, type: "cold", unarmed: false, rarity: 10, shop: false, magic: true, cutBonus: 0.15, sfx: "Fwoosh", + tags: ["knife", "divine"], + light: true, + events: [ + {type: "Dreamcatcher", trigger: "playerAttack", time: 20, requireEnergy: true, energyCost: 0.03}, + {type: "ElementalDreamcatcher", trigger: "playerAttack", power: 3.0, damage: "soul"}, + ], + }, + "MessengerOfLove": {name: "MessengerOfLove", crit: 1.1, damage: 2, chance: 0.75, staminacost: 1, type: "crush", unarmed: false, rarity: 10, shop: false, magic: true, sfx: "Unarmed", + tags: ["ranged", "bow", "specialbow", "divine"], + clumsy: true, + special: {type: "spell", spell: "HeartArrow", requiresEnergy: true, energyCost: 0.05, range: 50}, + }, + "Dragonslaver": {name: "Dragonslaver", crit: 1.4, damage: 3.5, chance: 1.25, staminacost: 2.5, type: "slash", unarmed: false, rarity: 10, shop: false, cutBonus: 0.1, sfx: "LightSwing", + tags: ["ranged", "sword", "divine"], + events: [{type: "CastSpell", spell: "BeltStrike", trigger: "playerAttack", requireEnergy: true, energyCost: 0.008}], + special: {type: "hitorspell", noSkip: true, spell: "BeltStrike", requiresEnergy: true, energyCost: 0.0075, range: 2.99}}, + "Arbiter": {name: "Arbiter", crit: 1.1, bindcrit: 2.0, damage: 3.5, bindEff: 1.25, chance: 2.0, bindType: "Metal", staminacost: 3, type: "chain", unarmed: false, rarity: 10, shop: false, magic: true, sfx: "HeavySwing", + tags: ["sword", "divine"], addBind: true, + events: [ + {type: "BuffMulti", trigger: "tick", power: 0.25, buffTypes: [ + "glueDamageBuff", + "chainDamageBuff", + ]}, + {type: "DamageToSummons", trigger: "playerAttack", power: 4, damage: "cold", chance: 1.0} + ], + special: {type: "spell", spell: "Disarm", requiresEnergy: true, energyCost: 0.025, range: 3.99}}, + "BondageBuster": {name: "BondageBuster", crit: 1.5, damage: 0.7, chance: 1.0, staminacost: 0.5, type: "tickle", unarmed: false, rarity: 10, shop: false, sfx: "Shock", + tags: ["ranged", "blaster", "divine"], noDamagePenalty: true, + events: [ + {type: "ElementalEffect", trigger: "playerAttack", power: 0, time: 4, damage: "tickle"}, + {type: "Charge", trigger: "tick", power: 11, buffType: "BondageBustCharge", color: "#e7cf1a"}, + {type: "BondageBustBoost", trigger: "spellCast", power: 0.25, sfx: "Shock", energyCost: 0.0025}, + ], + special: {type: "spell", spell: "BondageBust", requiresEnergy: true, energyCost: 0.005, range: 4}}, + "TheEncaser": {name: "TheEncaser", damage: 4, chance: 1.0, bindType: "Slime", staminacost: 3.0, type: "glue", unarmed: false, rarity: 10, shop: false, magic: true, sfx: "MagicSlash", crit: 1.25, + tags: ["staff", "divine"], noDamagePenalty: true, addBind: true, + stamPenType: "Staff", + events: [{type: "ElementalEffect", trigger: "playerAttack", power: 0, damage: "glue", time: 2, offhand: true,}], + special: {type: "spell", selfCast: true, spell: "SlimeForm", requiresEnergy: true, energyCost: 0.025}}, + "FourSeasons": {name: "FourSeasons", damage: 4, chance: 1.0, staminacost: 4.0, type: "cold", unarmed: false, rarity: 10, shop: false, magic: true, sfx: "Fwoosh", crit: 1.25, + tags: ["staff", "divine"], noDamagePenalty: true, + stamPenType: "Staff", + events: [ + {type: "BuffMulti", trigger: "tick", power: 0.25, offhand: true, buffTypes: [ + "fireDamageBuff", + "iceDamageBuff", + "frostDamageBuff", + "soapDamageBuff", + "electricDamageBuff", + "crushDamageBuff", + "gravityDamageBuff", + "stunDamageBuff", + ]} + ], + special: {type: "spell", selfCast: true, spell: "AvatarForm", requiresEnergy: true, energyCost: 0.05}}, + + +}; + + diff --git a/Game/src/item/KDCurse.ts b/Game/src/item/KDCurse.ts new file mode 100644 index 000000000..896f8e80f --- /dev/null +++ b/Game/src/item/KDCurse.ts @@ -0,0 +1,718 @@ +"use strict"; + + + +/** + * Unlockcurse list. This is always referenced dynamically when the restraint is picked up + */ +let KDCurseUnlockList = { + "Common": [ + "ShrineWill", + "ShrineIllusion", + "ShrineElements", + "ShrineConjure", + "BlueLock", + "Will", + "TakeDamageFire", + "TakeDamageElectric", + "TakeDamageIce", + "TakeDamageGlue", + "TakeDamageChain", + "OrgasmResist", + "Mana", + "SacrificeMage", + ], + "Dragon": [ + "ShrineWill", + "ShrineIllusion", + "ShrineElements", + "ShrineConjure", + ], + "Divine": [ + "ShrineWill", + "ShrineIllusion", + "ShrineElements", + "ShrineConjure", + "OrgasmResist", + "SacrificeMage", + ], + "CursedCollar": [ + "CursedDamage", + ], + "CursedCollar2": [ + "CursedDamage", + ], +}; + +/** + * onApply: occurs when applied + * condition: required to remove it + * remove: happens when removing + * events: these events are added to the restraint + */ +let KDCurses: Record = { + "GhostLock" : { + powerMult: 5, + lock: true, + level: 10, + weight: (_item) => { + return 1; + }, + condition: (_item) => { + return KinkyDungeonItemCount("Ectoplasm") >= 25; + }, + remove: (_item, _host, _specialMethod) => { + if (!_specialMethod) + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.Ectoplasm, -25); + }, + }, + "DollLock" : { + powerMult: 4, + lock: true, + level: 15, + weight: (_item) => { + return 1; + }, + condition: (_item) => { + return KinkyDungeonItemCount("DollID") >= 4; + }, + remove: (_item, _host, _specialMethod) => { + if (!_specialMethod) + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.DollID, -4); + } + }, + "SpellLock1" : { + powerMult: 2.8, + lock: true, + level: 4, + weight: (_item) => { + return 1; + }, + condition: (_item) => { + return KinkyDungeonSpellPoints > 0; + }, + remove: (_item, _host, _specialMethod) => { + if (!_specialMethod) + KinkyDungeonSpellPoints -= 1; + } + }, + "SpellLock8" : { + powerMult: 4, + lock: true, + level: 12, + weight: (_item) => { + return 1; + }, + condition: (_item) => { + let amount = KinkyDungeonStatsChoice.get("randomMode") ? 3 : 8; + return KinkyDungeonSpellPoints >= amount; + }, + remove: (_item, _host, _specialMethod) => { + if (!_specialMethod) { + let amount = KinkyDungeonStatsChoice.get("randomMode") ? 3 : 8; + KinkyDungeonSpellPoints -= amount; + } + }, + customInfo: (item, Curse) => { + let amount = KinkyDungeonStatsChoice.get("randomMode") ? 3 : 8; + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseInfo" + Curse) + .replace("RestraintName", KDGetItemName(item))//TextGet("Restraint" + KDRestraint(item).name)) + .replace("AMNT", "" + (amount)), + "#ffffff", 2); + }, + }, + "CursedCollar": { + powerMult: 10, + lock: true, + noShrine: true, + activatecurse: true, + level: 30, + customIcon_hud: "StarCurse", + weight: (_item) => { + return 1; + }, + condition: (_item) => { + for (let inv of KinkyDungeonAllRestraintDynamic()) { + if (KDGetCurse(inv.item) == "CursedDamage") return false; + } + return true; + }, + remove: (_item, _host) => { + //KinkyDungeonChangeConsumable(KinkyDungeonConsumables.MistressKey, -1); + } + }, + "CursedDamage": { + powerMult: 10, + lock: true, + noShrine: true, + activatecurse: true, + level: 9, + customIcon_hud: "StarCurse", + weight: (_item) => { + return 1; + }, + condition: (_item) => { + return false; + }, + remove: (_item, _host) => {}, + customInfo: (item, Curse) => { + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseInfo" + Curse) + .replace("RestraintName", KDGetItemName(item))//TextGet("Restraint" + KDRestraint(item).name)) + .replace("AMNT", "" + (Math.round(10 * ((KDItemDataQuery(item, "cursedDamageHP") || 0) - (KDItemDataQuery(item, "cursedDamage") || 0))) || "???")), + "#ffffff", 2); + }, + events: [ + {type: "cursedDamage", trigger: "afterPlayerDamage", mult: 1.0, power: 20, limit: 40}, + ], + }, + "MistressKey": { + powerMult: 4, + lock: true, + noShrine: true, + customIcon_RemoveFailure: "Locks/Gold", + level: 10, + weight: (_item) => { + return 1; + }, + condition: (_item) => { + return KinkyDungeonItemCount("MistressKey") > 0; + }, + remove: (_item, _host, _specialMethod) => { + if (!_specialMethod) + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.MistressKey, -1); + } + }, + "5Keys" : { + lock: true, + level: 3, + powerMult: 2.4, + weight: (_item) => { + return 3; + }, + condition: (_item) => { + return KinkyDungeonItemCount("RedKey") >= 5; + }, + remove: (_item, _host, _specialMethod) => { + if (!_specialMethod) + KDAddConsumable("RedKey", -5); + } + }, + "Key" : { + powerMult: 2.1, + lock: true, + level: 1, + weight: (_item) => { + return 10; + }, + condition: (_item) => { + return KinkyDungeonItemCount("RedKey") >= 1; + }, + remove: (_item, _host, _specialMethod) => { + if (!_specialMethod) + KDAddConsumable("RedKey", -1); + } + }, + "BlueLock" : { + lock: true, + activatecurse: true, + level: 4, + weight: (_item) => { + return 10; + }, + condition: (_item) => { + return KinkyDungeonItemCount("BlueKey") >= 1; + }, + remove: (_item, _host, _specialMethod) => { + if (!_specialMethod) + KDAddConsumable("BlueKey", -1); + } + }, + "TakeDamageFire" : { + powerMult: 2.2, + activatecurse: true, + level: 4, + weight: (_item) => { + return 10; + }, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, + events: [ + {type: "RemoveOnDmg", power: 1, count: 3, damage: "fire", trigger: "beforePlayerDamage", kind: "CurseMelt"}, + {type: "RemoveOnDmg", power: 1, count: 3, damage: "crush", trigger: "beforePlayerDamage", kind: "CurseMelt"}, + ], + }, + "TakeDamageIce" : { + powerMult: 2.2, + activatecurse: true, + level: 4, + weight: (_item) => { + return 10; + }, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, + events: [ + {type: "RemoveOnDmg", power: 1, count: 4, damage: "ice", trigger: "beforePlayerDamage", kind: "CurseExtinguish"}, + {type: "RemoveOnDmg", power: 1, mult: 0.5, count: 4, damage: "acid", trigger: "beforePlayerDamage", kind: "CurseExtinguish"}, + {type: "RemoveOnDmg", power: 1, mult: 0.5, count: 4, damage: "soap", trigger: "beforePlayerDamage", kind: "CurseExtinguish"}, + {type: "RemoveOnETTag", power: 0.1, count: 4, tags: ["ice"], trigger: "tickAfter", kind: "CurseExtinguish"}, + {type: "RemoveOnETTag", power: 0.4, count: 4, tags: ["water"], trigger: "tickAfter", kind: "CurseExtinguish"}, + //{type: "RemoveOnBuffName", trigger: "tick", kind: "Drenched"}, + //{type: "RemoveOnBuffName", trigger: "tick", kind: "Chilled"}, + ], + }, + "TakeDamageElectric" : { + powerMult: 2.2, + activatecurse: true, + level: 4, + weight: (_item) => { + return 10; + }, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, + events: [ + {type: "RemoveOnDmg", power: 1, count: 2, damage: "electric", trigger: "beforePlayerDamage", kind: "CurseShock"}, + {type: "RemoveOnDmg", power: 1, count: 2, damage: "estim", trigger: "beforePlayerDamage", kind: "CurseShock"}, + ], + }, + "TakeDamageGlue" : { + powerMult: 2.2, + activatecurse: true, + level: 4, + weight: (_item) => { + return 10; + }, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, + events: [ + {type: "RemoveOnDmg", power: 1, count: 5, damage: "glue", trigger: "beforePlayerDamage", kind: "CurseGlue"} + ], + }, + "TakeDamageChain" : { + powerMult: 2.2, + activatecurse: true, + level: 4, + weight: (_item) => { + return 10; + }, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, + events: [ + {type: "RemoveOnDmg", power: 1, count: 5, damage: "chain", trigger: "beforePlayerDamage", kind: "CurseChain"} + ], + }, + "SacrificeMage" : { + powerMult: 2.5, + activatecurse: true, + level: 6, + weight: (_item) => { + return 10; + }, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, + events: [ + {type: "SacrificeMage", power: 1, count: 5, mult: 1, trigger: "afterCapture", kind: "SacrificeMage"} + ], + }, + "Will" : { + powerMult: 2, + activatecurse: true, + level: 2, + weight: (_item) => { + return 10; + }, + onApply: (_item, _host) => { + KDChangeWill("Will", "curse", "curse", -1); + }, + condition: (_item) => { + return KinkyDungeonStatWill >= KinkyDungeonStatWillMax*0.99; + }, + remove: (_item, _host) => { + // For free! + } + }, + "Mana" : { + powerMult: 2, + activatecurse: true, + level: 2, + weight: (_item) => { + return 10; + }, + condition: (_item) => { + return KinkyDungeonStatMana + KinkyDungeonStatManaPool >= 20; + }, + remove: (_item, _host, _specialMethod) => { + if (!_specialMethod) + KDChangeMana("Mana", "curse", "uncurse", -20, false, 0, true, true); + } + }, + "ShrineWill" : { + powerMult: 2.5, + activatecurse: true, + level: 2, + weight: (_item) => { + return 10; + }, + events: [ + {type: "ShrineUnlockWiggle", trigger: "tick", kind: "ShrineWill"} + ], + condition: (_item) => { + return KDNearbyTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some((tile) => { + return tile?.tile?.Type == "Shrine" && tile.tile.Name == "Will"; + }); + }, remove: (_item, _host) => {/* For free! */}}, + "ShrineElements" : { + powerMult: 2.5, + activatecurse: true, + level: 2, + weight: (_item) => { + return 10; + }, + events: [ + {type: "ShrineUnlockWiggle", trigger: "tick", kind: "ShrineElements"} + ], + condition: (_item) => { + return KDNearbyTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some((tile) => { + return tile?.tile?.Type == "Shrine" && tile.tile.Name == "Elements"; + }); + }, remove: (_item, _host) => {/* For free! */}}, + "ShrineConjure" : { + powerMult: 2.5, + activatecurse: true, + level: 2, + weight: (_item) => { + return 10; + }, + events: [ + {type: "ShrineUnlockWiggle", trigger: "tick", kind: "ShrineConjure"} + ], + condition: (_item) => { + return KDNearbyTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some((tile) => { + return tile?.tile?.Type == "Shrine" && tile.tile.Name == "Conjure"; + }); + }, remove: (_item, _host) => {/* For free! */}}, + "ShrineIllusion" : { + powerMult: 2.5, + activatecurse: true, + level: 2, + weight: (_item) => { + return 10; + }, + events: [ + {type: "ShrineUnlockWiggle", trigger: "tick", kind: "ShrineIllusion"} + ], + condition: (_item) => { + return KDNearbyTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some((tile) => { + return tile?.tile?.Type == "Shrine" && tile.tile.Name == "Illusion"; + }); + }, remove: (_item, _host) => {/* For free! */}}, + "OrgasmResist" : { + powerMult: 2.9, + activatecurse: true, + level: 5, + weight: (_item) => { + return KinkyDungeonStatsChoice.get("arousalMode") ? 7 : 0; + }, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, + events: [ + {type: "RemoveOnEdge", power: 1, count: 50, trigger: "tick", kind: "OrgasmResist", msg: "KDRemoveOnEdge"}, + {type: "IncrementRemovalVar", power: 3, count: 50, trigger: "edge", kind: "OrgasmResist", msg: "KDRemoveOnEdgeSucceed"}, + {type: "IncrementRemovalVar", power: -25, count: 50, trigger: "orgasm", kind: "OrgasmResist", msg: "KDRemoveOnEdgeFail"}, + ], + }, + "HaveOrgasm" : { + powerMult: 2.5, + activatecurse: true, + level: 5, + weight: (_item) => { + return KinkyDungeonStatsChoice.get("arousalMode") ? 9 : 0; + }, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, + events: [ + {type: "IncrementRemovalVar", power: 25, count: 50, trigger: "orgasm", kind: "HaveOrgasm", msg: "KDRemoveOnOrgasmFail"}, + ], + }, +}; + + + +/** + * TODO +curseInfoAnimation,"Curse of Animation: Causes loose restraints to animate and attack you!" +curseInfoSensitivity,"Curse of Sensitivity: Makes it easier to lose control of yourself." + */ + +/** Cursed variants of restraints + */ +let KDCursedVars: Record = { + "Common": { + level: 1, + variant: (restraint, newRestraintName) => { + return KDAddEventVariant(restraint, newRestraintName, [ + // We add this to ALL cursed items (including dormant curses) + {trigger: "curseCount", type: "add", power: 1, inheritLinked: true, + removeOnUncurse: true}, + ], 4, restraint.DefaultLock || "", {commonCurse: 10}); + } + }, + "Skimpy": { + level: 1, + variant: (restraint, newRestraintName) => { + let ret = KDAddEventVariant(restraint, newRestraintName, [ + // We add this to ALL cursed items (including dormant curses) + {trigger: "curseCount", type: "add", power: 1, inheritLinked: true, + removeOnUncurse: true}, + {original: "MimicHoly", trigger: "inventoryTooltip", + type: "invtooltipworn", msg: "SkimpyCurse", color: "#000044", bgcolor: "#ffffff", + removeOnUncurse: true}, + ], 4, restraint.DefaultLock || "", {}); + if (KDSkimpyModelReplace[restraint.Model]) { + KDSkimpyModelReplace[restraint.Model](ret, restraint, newRestraintName); + } + return ret; + } + }, + "Mimic": { + level: 2, + variant: (restraint, newRestraintName) => { + return KDAddEventVariant(restraint, newRestraintName, [ + // We add this to ALL cursed items (including dormant curses) + {trigger: "curseCount", type: "add", power: 1, inheritLinked: true, + removeOnUncurse: true}, + {trigger: "tick", type: "mimiccurse", time: 10, chance: 0.2, sfx: "Evil", + inheritLinked: true, removeOnUncurse: true}, + ], 8, restraint.DefaultLock || "", {mimicCurse: 10}); + } + }, + "MimicHoly": { + level: 2, + variant: (restraint, newRestraintName) => { + return KDAddEventVariant(restraint, newRestraintName, [ + // We add this to ALL cursed items (including dormant curses) + {trigger: "curseCount", type: "add", power: 1, inheritLinked: true, + removeOnUncurse: true}, + {trigger: "tick", type: "mimiccurse", time: 10, chance: 0.2, sfx: "Evil", + inheritLinked: true, removeOnUncurse: true}, + {trigger: "cleanse", type: "RemoveAndRevert", kind: restraint.name, sfx: "Magic", + inheritLinked: true}, + {original: "MimicHoly", trigger: "inventoryTooltip", + type: "invtooltipworn", msg: "MimicHolyGlow", color: "#000044", bgcolor: "#ffff88", + removeOnUncurse: true}, + + ], 8, restraint.DefaultLock || "", {divinemimicCurse: 10}); + } + }, + "Shibari": { + level: 2, + variant: (restraint, newRestraintName) => { + let ret = KDAddEventVariant(restraint, newRestraintName, [ + // We add this to ALL cursed items (including dormant curses) + {trigger: "curseCount", type: "add", power: 1, inheritLinked: true, + removeOnUncurse: true}, + {original: "MimicHoly", trigger: "inventoryTooltip", + type: "invtooltipworn", msg: "ShibariCurse", color: "#000044", bgcolor: "#ffffff", + removeOnUncurse: true}, + ], 8, restraint.DefaultLock || "", {shibariCurse: 10}); + let mapGroup = KDRopeMapByGroup; + if (!ret.alwaysDressModel) ret.alwaysDressModel = []; + ret.alwaysDressModel.push( + { + Model: mapGroup[restraint.Group] || "RopeHarness", + factionFilters: { + Rope: {color: "Highlight", override: true}, + }, + } + ); + return ret; + } + }, +}; + + +/** + * Bestows an event-type curse onto an item by adding events + * @param item + * @param ev + */ +function KDBestowCurse(item: item, ev: KinkyDungeonEvent[]): void { + // Sanitize to avoid duped pointer + ev = JSON.parse(JSON.stringify(ev)); + if (!item.events) item.events = []; + // Add curse to events + for (let e of Object.values(ev)) { + e.curse = true; + item.events.push(e); + } +} + +/** + * @param restraint + * @param newRestraintName + * @param ev + * @param power + * @param lock + * @param enemyTags + * @param noPick + */ +function KDAddEventVariant(restraint: restraint, newRestraintName: string, ev: KinkyDungeonEvent[], power: number = 4, lock: string = undefined, enemyTags: Record = {basicCurse: 10}, noPick: boolean = true): any { + // Sanitize to avoid duped pointer + ev = JSON.parse(JSON.stringify(ev)); + KinkyDungeonDupeRestraintText(restraint.name, newRestraintName); + let events: KinkyDungeonEvent[] = ev.concat(restraint.events); + let escapeChance = Object.assign({}, restraint.escapeChance); + Object.assign(escapeChance, { + Struggle: Math.min(restraint.escapeChance.Struggle, -0.2), + Cut: Math.min(restraint.escapeChance.Cut || 1.0, -0.1), + }); + if (!noPick) { + Object.assign(escapeChance, { + Pick: Math.min(restraint.escapeChance.Pick || 0, 0.1), + }); + } + return { + //protection: 0, + preview: restraint.preview || restraint.name, + protectionCursed: true, + escapeChance: escapeChance, + DefaultLock: lock == undefined ? restraint.DefaultLock : lock, + HideDefaultLock: lock != restraint.DefaultLock || restraint.HideDefaultLock, + magic: true, + events: events, + power: power, + good: false, + enemyTags: Object.assign({}, enemyTags), + shrine: restraint.shrine?.concat(["Cursed"]), + inventoryAsSelf: restraint.inventoryAsSelf || restraint.inventoryAs || restraint.name, + displayPower: restraint.displayPower || restraint.power, + }; +} + +function KinkyDungeonCurseInfo(item: item, Curse: string) { + if (Curse == "MistressKey" && KinkyDungeonItemCount("MistressKey")) { + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseInfoMistressKeyHave").replace("KeyAmount", "" + KinkyDungeonItemCount("MistressKey")), "White", 2); + } else if (KDCurses[Curse].customInfo) { + KDCurses[Curse].customInfo(item, Curse); + } else { + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseInfo" + Curse), "White", 2); + } +} + +function KinkyDungeonCurseStruggle(item: item, Curse: string) { + if (Curse == "MistressKey") { + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseStruggle" + Curse + item.name), "White", 2); + } else if (KDCurses[Curse].customStruggle) { + KDCurses[Curse].customStruggle(item, Curse); + } else { + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseStruggle" + Curse), "White", 2); + } +} + +function KinkyDungeonCurseAvailable(item: item, Curse: string) { + if (KDCurses[Curse] && KDCurses[Curse].condition(item)) { + return true; + } + return false; +} + +/** + * @param group + * @param index + * @param Curse + */ +function KinkyDungeonCurseUnlock(group: string, index: number, Curse: string) { + let unlock = true; + let keep = true; + let restraint = KinkyDungeonGetRestraintItem(group); + let host = restraint; + if (index) { + let surfaceItems = KDDynamicLinkListSurface(restraint); + if (surfaceItems[index]) { + host = surfaceItems[index - 1]; + restraint = surfaceItems[index]; + } + else console.log("Error! Please report the item combination and screenshot to Ada!"); + } + + let inventoryAs = restraint.inventoryVariant || restraint.name || (KDRestraint(restraint).inventoryAs); + restraint.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + + if (KDCurses[Curse]) { + unlock = KDCurses[Curse].alwaysRemoveOnUnlock || !KDGroupBlocked(group); + let res = KDCurses[Curse].remove(restraint, host, false); + if (typeof res === "boolean") { + unlock = res; + } + } + + if (unlock) { + KDSendStatus('escape', KinkyDungeonGetRestraintItem(group).name, "Curse"); + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonCurseUnlock" + Curse), "#99FF99", 2); + KinkyDungeonRemoveRestraintSpecific(restraint, keep, undefined, false, false, false, KinkyDungeonPlayerEntity); + } + + +} + +/** + * @param curse + */ +function KDCursePower(curse: string): number { + if (KDCurses[curse]) { + return KDCurses[curse].powerBoost || 5; + } + return 0; +} + +/** + * @param curse + */ +function KDCurseMult(curse: string): number { + if (KDCurses[curse]) { + return KDCurses[curse].powerMult || 3; + } + return 1; +} + +type KDSkimpyReplacer = (ret, restraint: restraint, newRestraintName: string) => any + +let KDSkimpyModelReplace: Record = { + ChainSkirt: (ret, restraint, newRestraintName) => { + ret.enemyTags = {skimpyCurse: 10}; + ret.Model = "ChainPanties2"; + ret.remove = ["ClothLower", "Skirts", "Pants"]; + if (restraint.addPose) { + ret.addPose = [...restraint.addPose, "SkimpyLower"]; + } else ret.addPose = ["SkimpyLower"]; + return ret; + }, + ChainSkirt2: (ret, restraint, newRestraintName) => { + ret.enemyTags = {skimpyCurse: 10}; + ret.Model = "ChainPanties"; + ret.remove = ["ClothLower", "Skirts", "Pants"]; + if (restraint.addPose) { + ret.addPose = [...restraint.addPose, "SkimpyLower"]; + } else ret.addPose = ["SkimpyLower"]; + return ret; + }, + ChainTunic: (ret, restraint, newRestraintName) => { + ret.enemyTags = {skimpyCurse: 10}; + ret.Model = "ChainBikini"; + ret.remove = ["Cloth", "Shirts"]; + if (restraint.addPose) { + ret.addPose = [...restraint.addPose, "SkimpyUpper"]; + } else ret.addPose = ["SkimpyUpper"]; + return ret; + }, +} + +let KDRopeMapByGroup = { + ItemTorso: "RopeHarness", + ItemPelvis: "RopeCrotch", + ItemLegs: "RopeCrotch", + ItemArms: "RopeChestStraps2", + ItemBreast: "RopeChestStraps2", +} \ No newline at end of file diff --git a/Game/src/item/KDEnchant.ts b/Game/src/item/KDEnchant.ts new file mode 100644 index 000000000..15c30aaa5 --- /dev/null +++ b/Game/src/item/KDEnchant.ts @@ -0,0 +1,762 @@ +"use strict"; + + +/** + * Contains a list of enchantment variant types + * Can be modified dynamically so mods can add basic curses + */ +let KDEnchantVariantList = { + "Common": [ + "Evasion", + "Sneak", + "Accuracy", + "SpellWard", + "BondageResist", + "DamageResist", + "DamageBuff", + "ManaCost", + "ManaCostSpecific", + "ManaRegen", + "BaseDamageBuffMelee", + "CommonPair", + //"DPDecay", + //"DPGain", + //"DPGainWhenAttacked", + ], + "Pair": [ + "CommonPair", + ], + "Mana": [ + "ManaRegenOnKill", + "ManaCost", + "ManaCostSpecific", + ], + "Damage": [ + "BaseDamageBuffMelee", + "BaseDamageBuffMagic", + "DamageBuff", + "ElementalEcho", + "ElementalDmg", + ], + "Gold": [ + "ElementalEcho", + "ElementalDmg", + "BaseDamageBuffMelee", + "BaseDamageBuffMagic", + "ManaRegenOnKill", + "DamageBuff", + "ManaCost", + "ManaCostSpecific", + ], + "Dragon": [ + "Evasion", + "Sneak", + "Accuracy", + "SpellWard", + "CommonPair", + "ElementalEcho", + "ElementalDmg", + "BaseDamageBuffMelee", + "BaseDamageBuffMagic", + "DamageResist", + "DamageBuff", + "ManaRegenOnKill", + "ManaCost", + "ManaCostSpecific", + ], + "CommonWeapon": [ + "Accuracy", + "SpellWard", + "DamageResist", + "ElementalDmg", + "AoEDamageFrozen", + "ShadowBleed", + ], +}; + +/** + * @param amt + * @param item + * @param Loot + * @param curse + * @param primaryEnchantment + */ +function KDGenericMultEnchantmentAmount(amt: number, _item: string, Loot: any, curse: string, primaryEnchantment: string): number { + amt *= 1 + ((KDGetEffLevel() - 1)/(KinkyDungeonMaxLevel - 1)); // Higher floor = higher rewards + if (Loot?.amtMult) amt *= Loot.amtMult; + if (primaryEnchantment) amt *= 0.45; // Reduce the power if there are already enchantments + if (curse && KDEventHexModular[curse]?.level > 0) amt *= 1 + 0.5 * Math.pow(KDEventHexModular[curse].level, 0.5); + return Math.ceil(amt); +} +/** + * Normalized for stats that are multiplicative, E.G mana costs + * Only works for stuff normalized to a range of (0-100) + * @param amt + * @param item + * @param Loot + * @param curse + * @param primaryEnchantment + */ +function KDNormalizedMultEnchantmentAmount(amt: number, _item: string, Loot: any, curse: string, primaryEnchantment: string): number { + let original = amt * 0.01; + amt *= 1 + ((KDGetEffLevel() - 1)/(KinkyDungeonMaxLevel - 1)); // Higher floor = higher rewards + if (Loot?.amtMult) amt *= Loot.amtMult; + if (primaryEnchantment) amt *= 0.3; // Reduce the power if there are already enchantments + if (curse && KDEventHexModular[curse]?.level > 0) amt *= 1 + 0.5 * Math.pow(KDEventHexModular[curse].level, 0.5); + return 100 * (1 - (1 - original) * Math.pow(1 - original, (amt / (100 * original)))); +} + +let KDEventEnchantmentModular: Record = { + "CommonPair": { + tags: ["condition"], + types: { + 2: null, //consumable + 1: null, //weapon + 0: /*restraint*/{level: 1, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (_item, allEnchant) => { + if (allEnchant.includes("condition")) return 0; + return 5; + }, + events: (item, Loot, curse, primaryEnchantment, enchantments) => { + let data = { + Loot: Loot, + curse: curse, + primaryEnchantment: primaryEnchantment, + enchantments: enchantments, + }; + return [ + ...KDGenerateEffectConditionPair("Common", "Common", ModifierEnum.restraint, item, 0, 10, 1, data) + ];}}, + }}, + + "Evasion": { + tags: ["evasion", "defense", "passive"], + suffix: "Evasion", + types: { + 2: null, //consumable + 1: null, //weapon + 0: /*restraint*/{level: 1, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("Evasion")) return 0; + if (allEnchant.includes("Sneak")) return 20; + if (KDRestraint({name: item})?.blockfeet) return 0; + if (KDRestraint({name: item})?.shrine?.includes("Light")) return 10; + if (KDRestraint({name: item})?.hobble) return 20; + return 3; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemPower(item), 4); + let amt = 7 + Math.round((0.4 + 0.6*KDRandom()) * 4 * Math.pow(power, 0.75)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "Evasion", trigger: "tick", type: "evasionBuff", power: amt/100, inheritLinked: true}, + {original: "Evasion", trigger: "inventoryTooltip", type: "varModifier", msg: "Evasion", power: amt, color: "#004400", bgcolor: "#88ff88"}, + {original: "Evasion", trigger: "icon", type: "tintIcon", power: 1, color: "#88ff88"}, + ];}}, + }}, + "Accuracy": { + tags: ["accuracy", "offense", "passive"], + prefix: "Accuracy", + types: { + 2: null, //consumable + 1: /*weapon*/{level: 1, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("Accuracy")) return 0; + if (allEnchant.includes("Sneak")) return 20; + if (KDWeapon({name: item})?.crit > KDDefaultCrit) return 10; + return 4; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemRarity(item), 1); + let amt = 7 + Math.round((0.4 + 0.6*KDRandom()) * 8 * Math.pow(power, 0.75)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "Accuracy", trigger: "calcEvasion", type: "IsMagic"}, + {original: "Accuracy", trigger: "tick", type: "AccuracyBuff", power: amt/100}, + {original: "Accuracy", trigger: "inventoryTooltip", type: "varModifier", msg: "Accuracy", power: amt, color: "#004400", bgcolor: "#aaffaa"}, + {original: "Accuracy", trigger: "icon", type: "tintIcon", power: 1, color: "#ffffff"}, + ];}}, + 0: /*restraint*/{level: 1, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("Accuracy")) return 0; + if (KDRestraint({name: item})?.blindfold) return 40; + if (KDRestraint({name: item})?.bindhands) return 4; + if (KDRestraint({name: item})?.bindarms) return 1; + return 24; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemPower(item), 3); + let amt = 6 + Math.round((0.4 + 0.6*KDRandom()) * 8 * Math.pow(power, 0.75)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "Accuracy", trigger: "tick", type: "AccuracyBuff", power: amt/100, inheritLinked: true}, + {original: "Accuracy", trigger: "inventoryTooltip", type: "varModifier", msg: "Accuracy", power: amt, color: "#004400", bgcolor: "#aaffaa"}, + {original: "Accuracy", trigger: "icon", type: "tintIcon", power: 1, color: "#ffffff"}, + ];}}, + }}, + "Sneak": { + tags: ["stealth", "defense", "passive"], + prefix: "Sneak", + types: { + 2: null, //consumable + 1: null, //weapon + 0: /*restraint*/{level: 2, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("Sneak")) return 0; + if (allEnchant.includes("Evasion")) return 20; + if (allEnchant.includes("Accuracy")) return 20; + if (KDRestraint({name: item})?.shrine?.includes("Light")) return 10; + if (!KDRestraint({name: item})?.armor) return 15; + return 4; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemPower(item), 2); + let amt = 5 + Math.round((0.4 + 0.6*KDRandom()) * 4 * Math.pow(power, 0.5)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + amt = Math.pow(amt, 0.9); + return [ + {original: "Sneak", trigger: "tick", type: "sneakBuff", power: amt/100, inheritLinked: true}, + {original: "Sneak", trigger: "inventoryTooltip", type: "varModifier", msg: "Sneak", power: amt, color: "#330033", bgcolor: "#692464"}, + {original: "Sneak", trigger: "icon", type: "tintIcon", power: 1, color: "#692464"}, + ];}}, + }}, + "AoEDamageFrozen": { + tags: ["magic", "offense", "ice", "passive"], + prefix: "AoEDamageFrozen", + types: { + 2: null, //consumable + 1: /*weapon*/{level: 1, + filter: (item, _allEnchant) => { + return (KinkyDungeonWeapons[item]?.type == 'ice' || KinkyDungeonWeapons[item]?.type == 'frost'); + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("AoEDamageFrozen")) return 0; + if (KDWeapon({name: item})?.type == "ice" || KDWeapon({name: item})?.type == "frost") return 100; + return 15; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemRarity(item), 1); + let amt = 1 + Math.round((0.4 + 0.6*KDRandom()) * 2 * Math.pow(power, 0.6)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "AoEDamageFrozen", trigger: "calcEvasion", type: "IsMagic"}, + {original: "AoEDamageFrozen", type: "AoEDamageFrozen", trigger: "tick", aoe: 10, power: amt, damage: "ice"}, + {original: "AoEDamageFrozen", trigger: "inventoryTooltip", type: "varModifier", msg: "AoEDamageFrozen", power: amt, color: "#000044", bgcolor: "#aaddff"}, + {original: "AoEDamageFrozen", trigger: "icon", type: "tintIcon", power: 2, color: "#aaddff"}, + ];}}, + 0: /*restraint*/null + } + }, + "ShadowBleed": { + tags: ["magic", "offense", "shadow", "passive"], + prefix: "ShadowBleed", + types: { + 2: null, //consumable + 1: /*weapon*/{level: 1, + filter: (item, _allEnchant) => { + return (KinkyDungeonWeapons[item]?.type == 'cold' || KinkyDungeonWeapons[item]?.light); + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("ShadowBleed")) return 0; + if (KDWeapon({name: item})?.tease) return 0; + if (KDWeapon({name: item})?.type == "charm") return 0; + if (KDWeapon({name: item})?.type == "tickle") return 0; + if (KDWeapon({name: item})?.type == "cold") return 100; + return 20; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemRarity(item), 1); + let amt = 4 + Math.round((0.4 + 0.6*KDRandom()) * 5 * Math.pow(power, 0.7)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "ShadowBleed", type: "ShadowBleed", trigger: "afterPlayerAttack", time: 10, power: 0.1 * amt, damage: "cold"}, + {original: "ShadowBleed", trigger: "calcEvasion", type: "IsMagic"}, + {original: "ShadowBleed", trigger: "inventoryTooltip", type: "varModifier", msg: "ShadowBleed", power: amt, color: "#000044", bgcolor: "#aa00ff"}, + {original: "ShadowBleed", trigger: "icon", type: "tintIcon", power: 2, color: "#aa00ff"}, + ];}}, + 0: /*restraint*/null + } + }, + "SpellWard": { + tags: ["magic", "defense", "passive"], + suffix: "SpellWard", + types: { + 2: null, //consumable + 1: /*weapon*/{level: 1, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("SpellWard")) return 0; + return KinkyDungeonWeapons[item]?.magic ? 12 : 2 + (KinkyDungeonWeapons[item]?.tags?.includes("shield") ? 30 : 0); + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemRarity(item), 1); + let amt = 7 + Math.round((0.4 + 0.6*KDRandom()) * 20 * Math.pow(power, 0.6)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "SpellWard", trigger: "calcEvasion", type: "IsMagic"}, + {original: "SpellWard", trigger: "tick", type: "spellWardBuff", power: amt/10, inheritLinked: true, offhand: KDWeapon({name: item})?.tags?.includes("shield") ? true : undefined}, + {original: "SpellWard", trigger: "inventoryTooltip", type: "varModifier", msg: "SpellWard", power: amt, color: "#000044", bgcolor: "#4444ff"}, + {original: "SpellWard", trigger: "icon", type: "tintIcon", power: 2, color: "#4444ff"}, + ];}}, + 0: /*restraint*/{level: 2, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("SpellWard")) return 0; + if (KDRestraint({name: item})?.magic) return 40; + return 5; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemPower(item), 3); + let amt = 3 + Math.round((0.4 + 0.6*KDRandom()) * 3 * Math.pow(power, 0.75)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "SpellWard", trigger: "tick", type: "spellWardBuff", power: amt/10, inheritLinked: true}, + {original: "SpellWard", trigger: "inventoryTooltip", type: "varModifier", msg: "SpellWard", power: amt, color: "#000044", bgcolor: "#4444ff"}, + {original: "SpellWard", trigger: "icon", type: "tintIcon", power: 2, color: "#4444ff"}, + ];}}, + }}, + "BondageResist": { + tags: ["melee", "bondage", "defense", "passive"], + suffix: "BondageResist", + types: { + 2: null, //consumable + 1: null, //weapon + 0: /*restraint*/{level: 2, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("BondageResist")) return 0; + if (KDRestraint({name: item})?.armor || KDRestraint({name: item})?.good) return 10; + return 0; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemPower(item), 5); + let amt = 10 + Math.round((0.4 + 0.6*KDRandom()) * 8 * Math.pow(power, 0.75)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "BondageResist", trigger: "tick", type: "RestraintBlock", power: amt/10, inheritLinked: true}, + {original: "BondageResist", trigger: "inventoryTooltip", type: "varModifier", msg: "BondageResist", power: amt, color: "#441100", bgcolor: "#ffaa88"}, + {original: "BondageResist", trigger: "icon", type: "tintIcon", power: 2, color: "#ffaa88"}, + ];}}, + }}, + "DamageResist": { + tags: ["damage", "defense", "passive"], + suffix: "DamageResist", + types: { + 2: null, //consumable + 1: /*weapon*/{level: 3, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("DamageResist")) return 0; + return (KinkyDungeonWeapons[item]?.tags?.includes("shield") ? 50 : 0); + }, + events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + let power = Math.max(KDGetItemRarity(item), 4); + let amt = 14 + Math.round((0.4 + 0.6*KDRandom()) * 11 * Math.pow(power, 0.75)); + let types = ['fire', 'ice', 'soap', "acid", 'glue', 'chain', 'grope', 'crush', 'cold', 'electric', 'poison', 'soul', 'tickle']; + let type = KDEnchantDetermineKind(item, Loot, curse, primaryEnchantment, enchantments, data, types); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "DamageResist", trigger: "tick", type: "buff", power: amt/100, buff: type+"DamageResist", kind: type, inheritLinked: true, offhand: KDWeapon({name: item})?.tags?.includes("shield") ? true : undefined}, + {original: "DamageResist", trigger: "icon", type: "tintIcon", power: 3, bgcolor: KinkyDungeonDamageTypes[type].color}, + {original: "DamageResist", trigger: "inventoryTooltip", type: "varModifier", msg: "DamageResist", power: amt, kind: TextGet("KinkyDungeonDamageType" + type), bgcolor: KinkyDungeonDamageTypes[type].color, color: KinkyDungeonDamageTypes[type].bg || "#004400"}, + ];}}, + 0: /*restraint*/{level: 3, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("DamageResist")) return 0; + if (allEnchant.includes("DamageBuff")) return 40; + if (KDRestraint({name: item})?.armor) return 40; + return 20; + }, + events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + let power = Math.max(KDGetItemPower(item), 4); + let amt = 10 + Math.round((0.4 + 0.6*KDRandom()) * 10 * Math.pow(power, 0.75)); + let types = ['fire', 'ice', "soap" ,'acid', 'glue', 'chain', 'grope', 'crush', 'cold', 'electric', 'poison', 'soul', 'tickle']; + let type = KDEnchantDetermineKind(item, Loot, curse, primaryEnchantment, enchantments, data, types); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "DamageResist", trigger: "tick", type: "buff", power: amt/100, buff: type+"DamageResist", kind: type, inheritLinked: true}, + {original: "DamageResist", trigger: "icon", type: "tintIcon", power: 3, bgcolor: KinkyDungeonDamageTypes[type].color}, + {original: "DamageResist", trigger: "inventoryTooltip", type: "varModifier", msg: "DamageResist", power: amt, kind: TextGet("KinkyDungeonDamageType" + type), bgcolor: KinkyDungeonDamageTypes[type].color, color: KinkyDungeonDamageTypes[type].bg || "#004400"}, + ];}}, + }}, + "DamageBuff": { + tags: ["damage", "offense", "passive"], + suffix: "DamageBuff", + types: { + 2: null, //consumable + 1: null, //weapon + 0: /*restraint*/{level: 4, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("DamageBuff")) return 0; + if (allEnchant.includes("DamageResist")) return 40; + if (KDRestraint({name: item})?.magic) return 40; + return 15; + }, + events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + let power = Math.max(KDGetItemPower(item), 2); + let amt = 2 + Math.round((0.4 + 0.6*KDRandom()) * 4 * Math.pow(power, 0.75)); + let types = ['fire', 'ice', 'soap', 'slash', 'pierce', 'unarmed', 'pain', 'cold', 'glue', 'chain', 'tickle', 'crush', 'electric', 'soul', 'charm']; + let type = KDEnchantDetermineKind(item, Loot, curse, primaryEnchantment, enchantments, data, types); + + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "DamageBuff", trigger: "tick", type: "buff", power: amt/100, buff: type+"DamageBuff", kind: type, inheritLinked: true}, + {original: "DamageBuff", trigger: "icon", type: "tintIcon", power: 4, bgcolor: KinkyDungeonDamageTypes[type].color}, + {original: "DamageBuff", trigger: "inventoryTooltip", type: "varModifier", msg: "DamageBuff", power: amt, kind: TextGet("KinkyDungeonDamageType" + type), bgcolor: KinkyDungeonDamageTypes[type].color, color: KinkyDungeonDamageTypes[type].bg || "#004400"}, + ];}}, + }}, + "ManaCost": { + tags: ["magic", "mana", "economy", "passive"], + prefix: "ManaCost", + types: { + 2: null, //consumable + 1: null, //weapon + 0: /*restraint*/{level: 5, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("ManaCost")) return 0; + if (allEnchant.includes("ManaCostSpecific")) return 0; + if (KDRestraint({name: item})?.magic) return 18; + if (KDRestraint({name: item})?.blindfold) return 14; + if (KDRestraint({name: item})?.gag) return 14; + if (KDRestraint({name: item})?.bindhands) return 9; + if (KDRestraint({name: item})?.armor) return 8; + return 3; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemPower(item), 2); + let amt = 2 + Math.round((0.4 + 0.6*KDRandom()) * 4 * Math.pow(power, 0.7)); + amt = KDNormalizedMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "ManaCost", trigger: "calcEfficientMana", type: "ManaCost", power: amt*0.01, inheritLinked: true}, + {original: "ManaCost", trigger: "inventoryTooltip", type: "varModifier", msg: "ManaCost", power: amt, color: "#0000ff", bgcolor: "#8888ff"}, + {original: "ManaCost", trigger: "icon", type: "tintIcon", power: 5, color: "#0000ff"}, + ];}}, + }}, + "ManaCostSpecific": { + tags: ["magic", "mana", "economy", "passive"], + prefix: "ManaCostSpecific", + types: { + 2: null, //consumable + 1: null, //weapon + 0: /*restraint*/{level: 5, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("ManaCost")) return 0; + if (allEnchant.includes("ManaCostSpecific")) return 0; + if (KDRestraint({name: item})?.magic) return 25; + if (KDRestraint({name: item})?.blindfold) return 20; + if (KDRestraint({name: item})?.gag) return 20; + if (KDRestraint({name: item})?.bindhands) return 15; + if (KDRestraint({name: item})?.armor) return 14; + return 6; + }, + events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + let power = Math.max(KDGetItemPower(item), 3); + let amt = 3 + Math.round((0.4 + 0.6*KDRandom()) * 6 * Math.pow(power, 0.85)); + let types = ['air', 'earth', 'fire', 'water', 'electric', 'ice', 'latex', 'metal', 'rope', 'leather', 'light', 'shadow', 'stealth', 'summon', 'knowledge', 'arrow']; + + let type = KDEnchantDetermineKind(item, Loot, curse, primaryEnchantment, enchantments, data, types); + + amt = KDNormalizedMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "ManaCostSpecific", trigger: "calcEfficientMana", type: "ManaCost", condition: "spellType", kind: type, power: amt*0.01, inheritLinked: true}, + {original: "ManaCostSpecific", trigger: "inventoryTooltip", type: "varModifier", msg: "ManaCostSpecific", kind: TextGet("KinkyDungeonFilter" + type), power: amt, color: "#0000ff", bgcolor: "#8888ff"}, + {original: "ManaCostSpecific", trigger: "icon", type: "tintIcon", power: 5, color: "#0000ff"}, + ];}}, + }}, + "ManaRegenOnKill": { + tags: ["magic", "mana", "economy", "trigger"], + prefix: "ManaRegenOnKill", + types: { + 2: null, //consumable + 1: null, //weapon + 0: /*restraint*/{level: 5, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("ManaRegenOnKill")) return 0; + if (KDRestraint({name: item})?.magic) return 12; + return 6; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemPower(item), 1); + let amt = 0.5 + Math.round((0.4 + 0.6*KDRandom()) * 1.5 * Math.pow(power, 0.5)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "ManaRegenOnKill", trigger: "capture", type: "ManaBounty", power: amt * 0.1, inheritLinked: true}, + {original: "ManaRegenOnKill", trigger: "inventoryTooltip", type: "varModifier", msg: "ManaRegenOnKill", power: amt, color: "#0000ff", bgcolor: "#8888ff"}, + {original: "ManaRegenOnKill", trigger: "icon", type: "tintIcon", power: 5, color: "#00bbbb"}, + ];}}, + }}, + "ElementalEcho": { + tags: ["melee", "magic", "elemental", "offense", "passive"], + suffix: "ElementalEcho", + types: { + 2: null, //consumable + 1: null, // weapon + 0: /*restraint*/{level: 5, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("ElementalEcho")) return 0; + if (KDRestraint({name: item})?.bindarms) return 1; + if (KDRestraint({name: item})?.bindhands) return 2; + if (KDRestraint({name: item})?.armor) return 40; + if (["ItemArms", "ItemHands", "ItemBoots", "ItemHead", "ItemVulva", "ItemVulvaPiercings", "ItemNipples"].includes(KDRestraint({name: item})?.Group)) return 13; + return 3; + }, + events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + let power = Math.max(KDGetItemPower(item), 1); + let amt = 2 + Math.round((0.4 + 0.6*KDRandom()) * 4 * Math.pow(power, 0.5)); + let types = ['fire', 'ice', 'soap', 'acid', 'cold', 'electric', 'stun', 'soul']; + + let type = KDEnchantDetermineKind(item, Loot, curse, primaryEnchantment, enchantments, data, types); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "ElementalEcho", trigger: "playerAttack", type: "ElementalEcho", power: amt * 0.01, kind: type, damage: type, inheritLinked: true}, + {original: "ElementalEcho", trigger: "inventoryTooltip", type: "varModifier", msg: "ElementalEcho", power: amt, kind: TextGet("KinkyDungeonDamageType" + type), bgcolor: KinkyDungeonDamageTypes[type].color, color: KinkyDungeonDamageTypes[type].bg || "#004400"}, + {original: "ElementalEcho", trigger: "icon", type: "tintIcon", power: 5, color: "#e7cf1a", bgcolor: KinkyDungeonDamageTypes[type].color}, + ];}}, + }}, + "ElementalDmg": { + tags: ["magic", "elemental", "offense", "passive"], + prefix: "ElementalDmg", + types: { + 2: null, //consumable + 1: /*weapon*/{level: 5, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("ElementalDmg")) return 0; + if (!KinkyDungeonMeleeDamageTypes.includes(KinkyDungeonWeapons[item]?.type)) return 0; + if (["ItemArms", "ItemHands", "ItemBoots", "ItemHead", "ItemVulva", "ItemVulvaPiercings", "ItemNipples"].includes(KDRestraint({name: item})?.Group)) return 20; + return 14; + }, + events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + let power = Math.max(KDGetItemRarity(item), 1); + let amt = 3 + Math.round((0.4 + 0.6*KDRandom()) * 4 * Math.pow(power, 0.7)); + let types = ['fire', 'ice', "soap", 'acid', 'cold', 'electric', 'stun', 'soul']; + + let type = KDEnchantDetermineKind(item, Loot, curse, primaryEnchantment, enchantments, data, types); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "ElementalDmg", trigger: "calcEvasion", type: "IsMagic"}, + {original: "ElementalDmg", trigger: "playerAttack", type: "ElementalEffect", power: amt * 0.1, kind: type, damage: type}, + {original: "ElementalDmg", trigger: "inventoryTooltip", type: "varModifier", msg: "ElementalDmg", power: amt, kind: TextGet("KinkyDungeonDamageType" + type), bgcolor: KinkyDungeonDamageTypes[type].color, color: KinkyDungeonDamageTypes[type].bg || "#004400"}, + {original: "ElementalDmg", trigger: "icon", type: "tintIcon", power: 5, color: "#e7cf1a", bgcolor: KinkyDungeonDamageTypes[type].color}, + ];}}, + 0: /*restraint*/{level: 5, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant, _data) => { + if (allEnchant.includes("ElementalDmg")) return 0; + if (KDRestraint({name: item})?.armor) return 11; + return 8; + }, + events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + let power = Math.max(KDGetItemPower(item), 1); + let amt = 0.8 + Math.round((0.4 + 0.6*KDRandom()) * 2.8 * Math.pow(power, 0.4)); + let types = ['fire', 'ice', "soap", 'acid', 'cold', 'electric', 'stun', 'soul']; + + let type = KDEnchantDetermineKind(item, Loot, curse, primaryEnchantment, enchantments, data, types); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "ElementalDmg", trigger: "playerAttack", type: "ElementalEffect", power: amt * 0.1, damage: type, inheritLinked: true}, + {original: "ElementalDmg", trigger: "inventoryTooltip", type: "varModifier", msg: "ElementalDmg", power: amt, kind: TextGet("KinkyDungeonDamageType" + type), bgcolor: KinkyDungeonDamageTypes[type].color, color: KinkyDungeonDamageTypes[type].bg || "#004400"}, + {original: "ElementalDmg", trigger: "icon", type: "tintIcon", power: 5, color: "#ff5277", bgcolor: KinkyDungeonDamageTypes[type].color}, + ];}}, + }}, + "ManaRegen": { + tags: ["magic", "mana", "passive"], + prefix: "ManaRegen", + types: { + 2: null, //consumable + 1: null, //weapon + 0: /*restraint*/{level: 2, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("ManaRegen")) return 0; + if (KDRestraint({name: item})?.gag) return 20; + return 12; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemPower(item), 3); + let amt = 15 + Math.round((0.4 + 0.6*KDRandom()) * 10 * Math.pow(power, 0.75)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "ManaRegen", trigger: "afterCalcManaPool", type: "MultManaPoolRegen", power: 1 + amt*0.01, inheritLinked: true}, + {original: "ManaRegen", trigger: "inventoryTooltip", type: "varModifier", msg: "ManaRegen", power: amt, color: "#0088ff", bgcolor: "#88aaff"}, + {original: "ManaRegen", trigger: "icon", type: "tintIcon", power: 2, color: "#0055aa"}, + ];}}, + }}, + "BaseDamageBuffMelee": { + tags: ["melee", "offense", "damage", "passive"], + suffix: "BaseDamageBuffMelee", + types: { + 2: null, //consumable + 1: null, //weapon + 0: /*restraint*/{level: 4, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("BaseDamageBuffMelee")) return 0; + if (KDRestraint({name: item})?.bindarms) return 3; + if (KDRestraint({name: item})?.bindhands) return 1; + return 18; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemPower(item), 1); + let amt = 1.5 + Math.round((0.4 + 0.6*KDRandom()) * 3.5 * Math.pow(power, 0.33)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "BaseDamageBuffMelee", trigger: "beforePlayerAttack", type: "AmpDamage", prereq: "damageType", kind: "melee", power: amt*.01, inheritLinked: true}, + {original: "BaseDamageBuffMelee", trigger: "calcDisplayDamage", type: "AmpDamage", prereq: "damageType", kind: "melee", power: amt*.01, inheritLinked: true}, + {original: "BaseDamageBuffMelee", trigger: "inventoryTooltip", type: "varModifier", msg: "BaseDamageBuffMelee", power: amt, color: "#000000", bgcolor: "#ff5277"}, + {original: "BaseDamageBuffMelee", trigger: "icon", type: "tintIcon", power: 4, color: "#ff5277"}, + ];}}, + }}, + "BaseDamageBuffMagic": { + tags: ["magic", "damage", "offense", "passive"], + suffix: "BaseDamageBuffMagic", + types: { + 2: null, //consumable + 1: null, //weapon + 0: /*restraint*/{level: 5, + filter: (_item, _allEnchant) => { + return true; + }, + weight: (item, allEnchant) => { + if (allEnchant.includes("BaseDamageBuffMagic")) return 0; + if (KDRestraint({name: item})?.bindarms) return 15; + if (KDRestraint({name: item})?.bindhands) return 11; + if (KDRestraint({name: item})?.gag) return 9; + if (KDRestraint({name: item})?.heelpower) return 5; + return 3; + }, + events: (item, Loot, curse, primaryEnchantment, _enchantments, _data) => { + let power = Math.max(KDGetItemPower(item), 1); + let amt = 1.8 + Math.round((0.4 + 0.6*KDRandom()) * 4 * Math.pow(power, 0.4)); + amt = KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantment); + return [ + {original: "BaseDamageBuffMagic", trigger: "beforePlayerAttack", type: "AmpDamage", prereq: "damageType", kind: "magic", power: amt*.01, inheritLinked: true}, + {original: "BaseDamageBuffMagic", trigger: "calcDisplayDamage", type: "AmpDamage", prereq: "damageType", kind: "magic", power: amt*.01, inheritLinked: true}, + {original: "BaseDamageBuffMagic", trigger: "inventoryTooltip", type: "varModifier", msg: "BaseDamageBuffMagic", power: amt, color: "#000000", bgcolor: "#8800ff"}, + {original: "BaseDamageBuffMagic", trigger: "icon", type: "tintIcon", power: 5, color: "#8800ff"}, + ];}}, + }}, +}; + +function KDGetItemPower(item: string): number { + return KinkyDungeonGetRestraintByName(item)?.displayPower || KinkyDungeonGetRestraintByName(item)?.power || 0; +} + +function KDGetItemRarity(item: string): number { + return KinkyDungeonFindWeapon(item)?.rarity || KinkyDungeonFindConsumable(item)?.rarity || 0; +} + +/** + * @param item + * @param Loot + * @param curse + * @param primaryEnchantment + * @param enchantments + * @param data + * @param types + */ +function KDEnchantDetermineKind(_item: string, _Loot: any, _curse: string, _primaryEnchantment: string, _enchantments: string[], data: KDHexEnchantEventsData, types: string[]): string { + let type = CommonRandomItemFromList("", types); + if (data?.variant?.events) { + for (let event of data?.variant?.events) { + if (types.includes(event.kind) && KDRandom() < 0.8) { + return event.kind; + } else if (types.includes(event.damage) && KDRandom() < 0.8) { + return event.damage; + } else if (event.kind == "melee" && KDRandom() < 0.8) { + types.filter((typ) => {return KinkyDungeonMeleeDamageTypes.includes(typ);}); + return CommonRandomItemFromList("", types) || type; + } else if (event.kind == "magic" && KDRandom() < 0.8) { + types.filter((typ) => {return !KinkyDungeonMeleeDamageTypes.includes(typ);}); + return CommonRandomItemFromList("", types) || type; + } + else if (event.kind == "latex" && types.includes('glue') && KDRandom() < 0.8) { + return 'glue'; + } else if (event.kind == "glue" && types.includes('latex') && KDRandom() < 0.8) { + return 'latex'; + } + else if ((event.kind == "leather" || event.kind == "rope" || event.kind == "metal") && types.includes('chain') && KDRandom() < 0.8) { + return 'chain'; + } else if (event.kind == "chain" && KDRandom() < 0.8) { + if (types.includes('leather')) return 'leather'; + if (types.includes('metal')) return 'leather'; + if (types.includes('rope')) return 'leather'; + } + else if (event.kind == "water" && types.includes('soap') && KDRandom() < 0.8) { + return 'soap'; + } else if (event.kind == "soap" && types.includes('water') && KDRandom() < 0.8) { + return 'water'; + } + else if (event.kind == "earth" && types.includes('crush') && KDRandom() < 0.8) { + return 'crush'; + } else if (event.kind == "crush" && types.includes('earth') && KDRandom() < 0.8) { + return 'earth'; + } + else if (event.kind == "air" && types.includes('stun') && KDRandom() < 0.8) { + return 'stun'; + } else if (event.kind == "stun" && types.includes('air') && KDRandom() < 0.8) { + return 'air'; + } + else if (event.kind == "light" && types.includes('holy') && KDRandom() < 0.8) { + return 'holy'; + } else if (event.kind == "holy" && types.includes('light') && KDRandom() < 0.8) { + return 'light'; + } + else if (event.kind == "shadow" && types.includes('cold') && KDRandom() < 0.8) { + return 'cold'; + } else if (event.kind == "cold" && types.includes('shadow') && KDRandom() < 0.8) { + return 'shadow'; + } + } + } + return type; +} diff --git a/Game/src/item/KDHex.ts b/Game/src/item/KDHex.ts new file mode 100644 index 000000000..cf53dab11 --- /dev/null +++ b/Game/src/item/KDHex.ts @@ -0,0 +1,256 @@ +'use strict'; + + +let KDBaseCursedVars = [ + "Mimic", + "Common", + "MimicHoly", +]; +/** + * Contains a list of curse variant types + * Can be modified dynamically so mods can add basic curses + */ +let KDHexVariantList = { + "Base": [...KDBaseCursedVars], + "BaseWithSkimpy": [ + ...KDBaseCursedVars, + "Skimpy", + ], + "BaseWithShibari": [ + ...KDBaseCursedVars, + "Shibari", + ], + "BaseWithSkimpyShibari": [ + ...KDBaseCursedVars, + "Skimpy", + "Shibari", + ], + "Common": [ + "Tickle", + "Punish", + "Light", + "Attraction", + "Submission", + "Distraction", + "Breathlessness", + "Futility", + "Sensitivity", + ], + "Dragon": [ + "Punish", + "Submission", + "Distraction", + "Breathlessness", + "Futility", + ], + "CursedCollar": [ + "CursedHeal", + "CursedCorruption", + "CursedDistract", + "CursedPunishment", + "CursedSubmission", + "CursedDenial", + ], + "CursedCollar2": [ + "CursedHeal", + "CursedCorruption", + "CursedDistract", + "CursedPunishment", + "CursedSubmission", + "CursedDenial", + ], +}; + +let KDEventHexModular: Record number, events: (data: KDHexEnchantEventsData) => KinkyDungeonEvent[]}> = { + "AntiMagic": {level: 1, + weight: (_item, _allHex, _data) => { + return 10; + }, + events: (_data) => [ + {trigger: "beforeEnemyLoop", type: "AntiMagicEnemyDebuff"}, + {trigger: "tick", type: "AntiMagicGag", inheritLinked: true, count: 8, power: 0.4, mult: 0.1}, + {trigger: "apply", type: "FilterLayer", inheritLinked: true, kind: "Ball", filter: + {"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":3.016666666666667,"blue":3.95,"alpha":1}, + }, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "AntiMagic", color: "#92e8c0", inheritLinked: true, original: "AntiMagic", always: true}, + + {original: "AntiMagic", trigger: "inventoryTooltip", type: "varModifier", msg: "AntiMagic", color: "#000000", bgcolor: "#ff5277"}, + {original: "AntiMagic", trigger: "icon", type: "tintIcon", power: 8, bgcolor: "#ff5277", color: "#ff5277"}, + ]}, + "Light": {level: 1, + weight: (_item, _allHex, _data) => { + return 8; + }, + events: (_data) => [ + // All hexes have this + {trigger: "CurseTransform", type: "transform", chance: 0.05, inheritLinked: true, kind: "transform", original: "Light"}, + {type: "ItemLight", trigger: "getLights", prereq: "noCorruption", power: 3.5, color: "#ffff55", inheritLinked: true, curse: true, original: "Light"}, + {trigger: "tick", type: "sneakBuff", power: -1.0, inheritLinked: true, curse: true, original: "Light"}, + {trigger: "drawSGTooltip", type: "curseInfo", prereq: "noCorruption", msg: "Illumination", color: "#ff5277", inheritLinked: true, original: "Light"}, + {trigger: "drawBuffIcons", type: "curseInfo", prereq: "noCorruption", msg: "Illumination", color: "#ff5277", inheritLinked: true, original: "Light"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "Attraction": {level: 4, + weight: (_item, allHex, _data) => { + return (!allHex?.includes("Attraction")) ? 2 : 0; + }, + events: (_data) => [ + // All hexes have this + {trigger: "CurseTransform", type: "transform", chance: 0.05, inheritLinked: true, kind: "transform", original: "Attraction"}, + {type: "CurseAttraction", trigger: "calcPlayChance", power: 0.5, inheritLinked: true, curse: true, original: "Attraction"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "Attraction", color: "#ff5277", inheritLinked: true, original: "Attraction"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "Attraction", color: "#ff5277", inheritLinked: true, original: "Attraction"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "Sensitivity": {level: 1, + weight: (_item, _allHex, _data) => { + return 8; + }, + events: (_data) => [ + // All hexes have this + {trigger: "CurseTransform", type: "transform", chance: 0.05, inheritLinked: true, kind: "transform", original: "Sensitivity"}, + {type: "CurseSensitivity", trigger: "calcOrgThresh", power: 0.5, inheritLinked: true, curse: true, original: "Sensitivity"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "Sensitivity", color: "#ff5277", inheritLinked: true, original: "Sensitivity"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "Sensitivity", color: "#ff5277", inheritLinked: true, original: "Sensitivity"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "Submission": {level: 1, + weight: (_item, _allHex, _data) => { + return 8; + }, + events: (_data) => [ + // All hexes have this + {trigger: "CurseTransform", type: "transform", chance: 0.05, inheritLinked: true, kind: "transform", original: "Submission"}, + {type: "CurseSubmission", trigger: "orgasm", power: 10, inheritLinked: true, curse: true, original: "Submission"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "Submission", color: "#ff5277", inheritLinked: true, original: "Submission"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "Submission", color: "#ff5277", inheritLinked: true, original: "Submission"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "Distraction": {level: 1, + weight: (_item, _allHex, _data) => { + return 8; + }, + events: (_data) => [ + // All hexes have this + {trigger: "CurseTransform", type: "transform", chance: 0.05, inheritLinked: true, kind: "transform", original: "Distraction"}, + {type: "multDistractionPos", trigger: "changeDistraction", power: 1.5, inheritLinked: true, curse: true, original: "Distraction"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "Distraction", color: "#ff5277", inheritLinked: true, original: "Distraction"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "Distraction", color: "#ff5277", inheritLinked: true, original: "Distraction"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "Breathlessness": {level: 1, + weight: (_item, _allHex, _data) => { + return 8; + }, + events: (_data) => [ + // All hexes have this + {trigger: "CurseTransform", type: "transform", chance: 0.05, inheritLinked: true, kind: "transform", original: "Breathlessness"}, + {type: "multStaminaPos", trigger: "changeStamina", power: 0.75, inheritLinked: true, curse: true, original: "Breathlessness"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "Breathlessness", color: "#ff5277", inheritLinked: true, original: "Breathlessness"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "Breathlessness", color: "#ff5277", inheritLinked: true, original: "Breathlessness"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "Futility": {level: 1, + weight: (_item, _allHex, _data) => { + return 8; + }, + events: (_data) => [ + // All hexes have this + {trigger: "CurseTransform", type: "transform", chance: 0.05, inheritLinked: true, kind: "transform", original: "Futility"}, + {type: "multWillPos", trigger: "changeWill", power: 0.5, inheritLinked: true, curse: true, original: "Futility"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "Futile", color: "#ff5277", inheritLinked: true, original: "Futility"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "Futile", color: "#ff5277", inheritLinked: true, original: "Futility"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "Tickle": {level: 1, + weight: (_item, _allHex, _data) => { + return 8; + }, + events: (_data) => [ + // All hexes have this + {trigger: "CurseTransform", type: "transform", chance: 0.05, inheritLinked: true, kind: "transform", original: "Tickle"}, + {trigger: "tick", type: "tickleDrain", power: -0.1, inheritLinked: true, curse: true, original: "Tickle"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "Tickle", color: "#ff5277", inheritLinked: true, original: "Tickle"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "Tickle", color: "#ff5277", inheritLinked: true, original: "Tickle"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "Punish": {level: 2, + weight: (_item, _allHex, _data) => { + return 8; + }, + events: (_data) => [ + // All hexes have this + {trigger: "CurseTransform", type: "transform", chance: 0.05, inheritLinked: true, kind: "transform", original: "Punish"}, + {trigger: "playerAttack", type: "cursePunish", chance: 1, damage: "souldrain", power: 1, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerCurse", inheritLinked: true, curse: true, original: "Punish"}, + {trigger: "playerCast", type: "cursePunish", chance: 1, damage: "souldrain", power: 1, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerCurse", inheritLinked: true, curse: true, original: "Punish"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "Punish", color: "#ff5277", inheritLinked: true, original: "Punish"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "Punish", color: "#ff5277", inheritLinked: true, original: "Punish"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + + //region Cursed + "CursedHeal": {level: 5, + weight: (_item, _allHex, _data) => { + return 30; + }, + events: (_data) => [ + {trigger: "tick", type: "CursedHeal", power: 0.5, inheritLinked: true, curse: true, original: "CursedHeal"}, + {trigger: "orgasm", type: "CursedHeal", power: 10.0, inheritLinked: true, curse: true, original: "CursedHeal"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "CursedHeal", color: "#9074ab", inheritLinked: true, original: "CursedHeal"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "CursedHeal", color: "#9074ab", inheritLinked: true, original: "CursedHeal"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "CursedCorruption": {level: 6, + weight: (_item, _allHex, _data) => { + return 40; + }, + events: (_data) => [ + {trigger: "tick", type: "CursedCorruption", power: 0.1, limit: -0.9, inheritLinked: true, curse: true, original: "CursedCorruption"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "CursedCorruption", color: "#9074ab", inheritLinked: true, original: "CursedCorruption"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "CursedCorruption", color: "#9074ab", inheritLinked: true, original: "CursedCorruption"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "CursedDistract": {level: 4, + weight: (_item, _allHex, _data) => { + return 80; + }, + events: (_data) => [ + {trigger: "afterPlayerDamage", type: "CursedDistract", power: 0.3, time: 10, mult: 0.5, inheritLinked: true, curse: true, original: "CursedDistract"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "CursedDistract", color: "#9074ab", inheritLinked: true, original: "CursedDistract"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "CursedDistract", color: "#9074ab", inheritLinked: true, original: "CursedDistract"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "CursedPunishment": {level: 8, + weight: (_item, _allHex, _data) => { + return 80; + }, + events: (_data) => [ + {trigger: "kill", type: "CursedPunishment", time: 4, dist: 8, inheritLinked: true, curse: true, original: "CursedPunishment"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "CursedPunishment", color: "#9074ab", inheritLinked: true, original: "CursedPunishment"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "CursedPunishment", color: "#9074ab", inheritLinked: true, original: "CursedPunishment"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "CursedSubmission": {level: 8, + weight: (_item, _allHex, _data) => { + return 80; + }, + events: (_data) => [ + {trigger: "tickAfter", type: "CursedSubmission", dist: 2.5, count: 2, tags: ["shadowHands"], inheritLinked: true, curse: true, original: "CursedSubmission"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "CursedSubmission", color: "#9074ab", inheritLinked: true, original: "CursedSubmission"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "CursedSubmission", color: "#9074ab", inheritLinked: true, original: "CursedSubmission"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + "CursedDenial": {level: 8, + weight: (_item, _allHex, _data) => { + return KinkyDungeonStatsChoice.get("arousalMode") ? 35 : 0; + }, + events: (_data) => [ + {trigger: "tryOrgasm", type: "CursedDenial", mult: 0, power: 1.0, inheritLinked: true, curse: true, original: "CursedDenial"}, + {trigger: "orgasm", type: "CursedDenial", count: 3, inheritLinked: true, curse: true, original: "CursedDenial"}, + {trigger: "edge", type: "CursedDenial", count: 3, inheritLinked: true, curse: true, original: "CursedDenial"}, + {trigger: "drawSGTooltip", type: "curseInfo", msg: "CursedDenial", color: "#9074ab", inheritLinked: true, original: "CursedDenial"}, + {trigger: "drawBuffIcons", type: "curseInfo", msg: "CursedDenial", color: "#9074ab", inheritLinked: true, original: "CursedDenial"}, + {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, + ]}, + //endregion +}; diff --git a/Game/src/item/KDInventoryActions.ts b/Game/src/item/KDInventoryActions.ts new file mode 100644 index 000000000..1147a3385 --- /dev/null +++ b/Game/src/item/KDInventoryActions.ts @@ -0,0 +1,1358 @@ +"use strict"; + +let KDMarketRateDecay = 0.98; + +let KDInventoryAction: Record = { + "Equip": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[0]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[0];}, + text: (_player, item) => { + return TextGet("KDInventoryAction" + (KinkyDungeonPlayerWeapon != item.name ? "Equip" : "Unequip")); + }, + icon: (_player, item) => { + if (item.type == LooseRestraint) { + let newItem = null; + let currentItem = null; + let linkable = null; + + newItem = KDRestraint(item); + if (newItem) { + currentItem = KinkyDungeonGetRestraintItem(newItem.Group); + if (KDDebugLink) { + linkable = KDCanAddRestraint(KDRestraint(newItem), true, "", false, currentItem, true, true); + } else { + if (!currentItem) return "InventoryAction/Equip"; + linkable = KDCanAddRestraint(KDRestraint(newItem), false, "", false, currentItem, true, true); + + //linkable = KDCurrentItemLinkable(currentItem, newItem); + } + if (linkable) { + return "InventoryAction/Equip"; + } else return "InventoryAction/Unequip"; + } + } + return KinkyDungeonPlayerWeapon != item.name ? "InventoryAction/Equip" : "InventoryAction/Unequip"; + }, + valid: (_player, item) => { + if ((item?.type == Restraint)) return false; + if (item.type == LooseRestraint) { + let newItem = null; + let currentItem = null; + let linkable = null; + + newItem = KDRestraint(item); + if (newItem) { + + if (newItem.requireSingleTagToEquip && !newItem.requireSingleTagToEquip.some((tag: any) => {return KinkyDungeonPlayerTags.get(tag);})) return false; + if (newItem.requireAllTagsToEquip && newItem.requireAllTagsToEquip.some((tag: any) => {return !KinkyDungeonPlayerTags.get(tag);})) return false; + + currentItem = KinkyDungeonGetRestraintItem(newItem.Group); + if (KDDebugLink) { + linkable = KDCanAddRestraint(KDRestraint(newItem), true, "", false, currentItem, true, true); + } else { + if (!currentItem) return true; + //linkable = KDCurrentItemLinkable(currentItem, newItem); + linkable = KDCanAddRestraint(KDRestraint(newItem), false, "", false, currentItem, true, true); + + } + if (linkable) { + return true; + } else return false; + } + return true; + } + return item.type == Outfit || item.type == Weapon; + }, + click: (_player, item) => { + if (item.type == LooseRestraint) { + let equipped = false; + let newItem = null; + let currentItem = null; + let linkable = null; + + newItem = KDRestraint(item); + if (newItem) { + currentItem = KinkyDungeonGetRestraintItem(newItem.Group); + if (!currentItem) equipped = false; + else { + if (KDDebugLink) { + linkable = KDCanAddRestraint(KDRestraint(newItem), true, "", false, currentItem, true, true); + } else { + //linkable = KDCurrentItemLinkable(currentItem, newItem); + linkable = KDCanAddRestraint(KDRestraint(newItem), false, "", false, currentItem, true, true); + + } + if (!currentItem || linkable) { + equipped = false; + } else equipped = true; + } + } + if (!equipped && newItem) { + if (KDGameData.InventoryAction && !KDConfirmOverInventoryAction) { + KDConfirmOverInventoryAction = true; + return true; + } else if (KDSendInput("equip", {name: item.name, + faction: item.faction, + inventoryVariant: item.name != newItem.name ? + item.name : undefined, + group: newItem.Group, curse: item.curse, currentItem: currentItem ? currentItem.name : undefined, events: Object.assign([], item.events)})) return true; + + } + } else if (item.type == Weapon) { + let weapon = item.name; + let equipped = item.name == KinkyDungeonPlayerWeapon; + if (equipped) { + KDSendInput("unequipweapon", {weapon: weapon}); + } else { + KDSendInput("switchWeapon", {weapon: weapon}); + } + } else if (item.type == Outfit) { + let outfit = item.name; + let toWear = KinkyDungeonGetOutfit(outfit); + if (toWear) { + let dress = toWear.dress; + if (dress == "JailUniform" && KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]) + dress = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)].defeat_outfit; + KDSendInput("dress", {dress: dress, outfit: outfit}); + } + } + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "Drop": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[2]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[2];}, + icon: (_player, _item) => { + return "InventoryAction/Drop"; + }, + valid: (_player, item) => { + if ((item?.type == Restraint)) return false; + if ((item?.type == Weapon && isUnarmed(KDWeapon(item)))) return false; + return true; + }, + click: (_player, item) => { + KDSendInput("drop", {item: item.name}); + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "Hotbar": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[3]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[3];}, + icon: (_player, _item) => { + return "InventoryAction/Hotbar"; + }, + valid: (_player, _item) => { + return true; + }, + click: (_player, _item) => { + KDConfigHotbar = !KDConfigHotbar; + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "Recolor": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[8]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[8];}, + icon: (_player, _item) => { + return "InventoryAction/Recolor"; + }, + valid: (_player, _item) => { + return true; + }, + click: (_player, _item) => { + KDConfigRestraintColor = !KDConfigRestraintColor; + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "Remove": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[6]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[6];}, + icon: (_player, _item) => { + return "InventoryAction/Remove"; + }, + show: (_player, item) => { + return !KDGetCurse(item) && !item.lock; + }, + valid: (_player, item) => { + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + return !sg.blocked; + }, + click: (_player, item) => { + let itemIndex = KDGetItemLinkIndex(item, false); + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + if (itemIndex >= 0 && !sg.blocked) { + KDSendInput("struggle", {group: sg.group, index: itemIndex, type: "Remove"}); + } + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "Unlock": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[4]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[4];}, + icon: (_player, item) => { + return "Locks/" + item.lock; + }, + show: (_player, item) => { + return !KDGetCurse(item) && !item.lock == false; + }, + valid: (_player, item) => { + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + return !sg.blocked; + }, + click: (_player, item) => { + let itemIndex = KDGetItemLinkIndex(item, false); + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + if (itemIndex >= 0 && !sg.blocked) { + KDSendInput("struggle", {group: sg.group, index: itemIndex, type: "Unlock"}); + } + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "Lock": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[7]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[7];}, + icon: (_player, _item) => { + return "InventoryAction/Lock"; + }, + show: (_player, item) => { + return !KDGetCurse(item) && !item.lock && KinkyDungeonIsLockable(KDRestraint(item)); + }, + valid: (_player, item) => { + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + return !sg.blocked; + }, + click: (_player, item) => { + let itemIndex = KDGetItemLinkIndex(item, false); + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + if (itemIndex >= 0 && !sg.blocked) { + KDSendInput("lock", {group: sg.group, index: itemIndex, type: "White"}); + } + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "Pick": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[5]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[5];}, + icon: (_player, _item) => { + return "InventoryAction/Pick"; + }, + show: (_player, item) => { + return !KDGetCurse(item) && !item.lock == false; + }, + valid: (_player, item) => { + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + return KinkyDungeonItemCount("Pick") > 0 && !sg.blocked; + }, + click: (_player, item) => { + let itemIndex = KDGetItemLinkIndex(item, false); + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + if (itemIndex >= 0 && !sg.blocked) { + KDSendInput("struggle", {group: sg.group, index: itemIndex, type: "Unlock"}); + } + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + + "CurseStruggle": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[3]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[3];}, + icon: (_player, _item) => { + return "InventoryAction/CurseStruggle"; + }, + show: (_player, item) => { + return !(KDGetCurse(item) || item.lock); + }, + valid: (_player, _item) => { + return true; + }, + click: (_player, item) => { + KinkyDungeonCurseStruggle(item, (KDGetCurse(item))); + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "CurseInfo": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[2]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[2];}, + icon: (_player, _item) => { + return "InventoryAction/CurseInfo"; + }, + show: (_player, item) => { + return !(KDGetCurse(item) || item.lock); + }, + valid: (_player, _item) => { + return true; + }, + click: (_player, item) => { + KinkyDungeonCurseInfo(item, (KDGetCurse(item))); + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "CurseUnlock": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[4]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[4];}, + icon: (_player, _item) => { + return "InventoryAction/CurseUnlock"; + }, + show: (_player, item) => { + return !KDGetCurse(item) == true; + }, + valid: (_player, item) => { + return KinkyDungeonCurseAvailable(item, (KDGetCurse(item))); + }, + click: (_player, item) => { + let itemIndex = KDGetItemLinkIndex(item, false); + if (itemIndex >= 0 && KinkyDungeonCurseAvailable(item, (KDGetCurse(item)))) { + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + KDSendInput("curseUnlock", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], curse: (KDGetCurse(item))}); + } + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "Struggle": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[2]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[2];}, + icon: (_player, _item) => { + return "InventoryAction/Struggle"; + }, + show: (_player, item) => { + return !KDGetCurse(item) && !item.lock; + }, + valid: (_player, _item) => { + return true; + }, + click: (_player, item) => { + let itemIndex = KDGetItemLinkIndex(item, false); + if (itemIndex >= 0) { + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + KDSendInput(KDGetCurse(item) ? "struggleCurse" : "struggle", {group: sg.group, index: itemIndex, type: "Struggle", curse: KDGetCurse(item)}); + } + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "Cut": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[3]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[3];}, + icon: (_player, _item) => { + return (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.name && !KinkyDungeonPlayerDamage.unarmed) ? "Items/" + KinkyDungeonPlayerWeapon :"InventoryAction/Cut"; + }, + show: (_player, item) => { + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + return !KDGetCurse(item) && !sg.noCut; + }, + valid: (_player, item) => { + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + return !sg.blocked; + }, + click: (_player, item) => { + let itemIndex = KDGetItemLinkIndex(item, false); + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + if (itemIndex >= 0 && !sg.blocked && !sg.noCut) { + KDSendInput("struggle", {group: sg.group, index: itemIndex, type: "Cut"}); + } + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + + "Favorite": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[1]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[1];}, + text: (_player, item) => { + return TextGet("KDInventoryAction" + (!(KDGameData.ItemPriority[item.name] > 9) ? "Favorite" : "Unfavorite")); + }, + icon: (_player, item) => { + return !(KDGameData.ItemPriority[item.name] > 9) ? "InventoryAction/Favorite" : "InventoryAction/Unfavorite"; + }, + valid: (_player, _item) => { + return true; + }, + click: (_player, item) => { + if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; + if (!(KDGameData.ItemPriority[item.name] > 9)) KDGameData.ItemPriority[item.name] = 10; + else KDGameData.ItemPriority[item.name] = 0; + KDSortInventory(KinkyDungeonPlayerEntity); + + + let filteredInventory = KinkyDungeonFilterInventory(KinkyDungeonCurrentFilter, undefined, undefined, undefined, undefined, KDInvFilter); + let index = filteredInventory.findIndex((element) => {return element.item.name == item.name;}); + if (index >= 0) { + KinkyDungeonCurrentPageInventory = index; + } + + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "Use": { + icon: (_player, _item) => { + return "InventoryAction/Use"; + }, + valid: (_player, item) => { + return item.quantity > 0; + }, + click: (_player, item) => { + KDSendInput("consumable", {item: item.name, quantity: 1}); + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + + "QuickSlot1": { + icon: (_player, _item) => { + return KDGameData.PreviousWeapon[0] ? "Items/" + (KinkyDungeonWeaponVariants[KDGameData.PreviousWeapon[0]]?.template || KDGameData.PreviousWeapon[0]) : "InventoryAction/Quickslot"; + }, + valid: (_player, _item) => { + return true;//KDGameData.PreviousWeapon[0] != item.name; + }, + label: (_player, _item) => { + if (KDGameData.PreviousWeaponLock && KDGameData.PreviousWeaponLock[0]) { + return TextGet("KDLocked"); + } + return ""; + }, + click: (_player, item) => { + KDGameData.PreviousWeapon[0] = item.name; + if (!KDGameData.PreviousWeaponLock) { + KDGameData.PreviousWeaponLock = []; + for (let i = 0; i < KDMaxPreviousWeapon; i++) { + KDGameData.PreviousWeaponLock.push(false); + } + } + KDGameData.PreviousWeaponLock[0] = !KDGameData.PreviousWeaponLock[0]; + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "QuickSlot2": { + icon: (_player, _item) => { + return KDGameData.PreviousWeapon[1] ? "Items/" + (KinkyDungeonWeaponVariants[KDGameData.PreviousWeapon[1]]?.template || KDGameData.PreviousWeapon[1]) : "InventoryAction/Quickslot"; + }, + valid: (_player, _item) => { + return true;//KDGameData.PreviousWeapon[0] != item.name; + }, + label: (_player, _item) => { + if (KDGameData.PreviousWeaponLock && KDGameData.PreviousWeaponLock[1]) { + return TextGet("KDLocked"); + } + return ""; + }, + click: (_player, item) => { + KDGameData.PreviousWeapon[1] = item.name; + if (!KDGameData.PreviousWeaponLock) { + KDGameData.PreviousWeaponLock = []; + for (let i = 0; i < KDMaxPreviousWeapon; i++) { + KDGameData.PreviousWeaponLock.push(false); + } + } + KDGameData.PreviousWeaponLock[1] = !KDGameData.PreviousWeaponLock[1]; + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "QuickSlot3": { + icon: (_player, _item) => { + return KDGameData.PreviousWeapon[2] ? "Items/" + (KinkyDungeonWeaponVariants[KDGameData.PreviousWeapon[2]]?.template || KDGameData.PreviousWeapon[2]) : "InventoryAction/Quickslot"; + }, + valid: (_player, _item) => { + return true;//KDGameData.PreviousWeapon[0] != item.name; + }, + label: (_player, _item) => { + if (KDGameData.PreviousWeaponLock && KDGameData.PreviousWeaponLock[2]) { + return TextGet("KDLocked"); + } + return ""; + }, + click: (_player, item) => { + KDGameData.PreviousWeapon[2] = item.name; + if (!KDGameData.PreviousWeaponLock) { + KDGameData.PreviousWeaponLock = []; + for (let i = 0; i < KDMaxPreviousWeapon; i++) { + KDGameData.PreviousWeaponLock.push(false); + } + } + KDGameData.PreviousWeaponLock[2] = !KDGameData.PreviousWeaponLock[2]; + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + "QuickSlot4": { + icon: (_player, _item) => { + return KDGameData.PreviousWeapon[3] ? "Items/" + (KinkyDungeonWeaponVariants[KDGameData.PreviousWeapon[3]]?.template || KDGameData.PreviousWeapon[3]) : "InventoryAction/Quickslot"; + }, + valid: (_player, _item) => { + return true;//KDGameData.PreviousWeapon[0] != item.name; + }, + label: (_player, _item) => { + if (KDGameData.PreviousWeaponLock && KDGameData.PreviousWeaponLock[3]) { + return TextGet("KDLocked"); + } + return ""; + }, + click: (_player, item) => { + KDGameData.PreviousWeapon[3] = item.name; + if (!KDGameData.PreviousWeaponLock) { + KDGameData.PreviousWeaponLock = []; + for (let i = 0; i < KDMaxPreviousWeapon; i++) { + KDGameData.PreviousWeaponLock.push(false); + } + } + KDGameData.PreviousWeaponLock[3] = !KDGameData.PreviousWeaponLock[3]; + }, + cancel: (_player, _delta) => { + return false; // NA for default actions + }, + }, + + + "RemoveCurseOrHex": { + icon: (_player, _item) => { + return "InventoryAction/Macaron"; + }, + valid: (_player, item) => { + if (!(item?.type == Restraint)) return false; + return KDHasRemovableCurse(item, KDGameData.CurseLevel) || KDHasRemovableHex(item, KDGameData.CurseLevel); + }, + /** Happens when you click the button */ + click: (_player, item) => { + if (KDHasRemovableCurse(item, KDGameData.CurseLevel) || KDHasRemovableHex(item, KDGameData.CurseLevel)) { + if (KDHasRemovableCurse(item, KDGameData.CurseLevel)) { + if (item.curse && KDCurses[item.curse]) { + KDCurses[item.curse].remove(item, KDGetRestraintHost(item), true); + } + + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + } + let removeHexes = {}; + for (let e of KDGetRemovableHex(item, KDGameData.CurseLevel)) { + removeHexes[e.original] = true; + } + let newEvents: KinkyDungeonEvent[] = []; + for (let event of item.events) { + if (!event.original || !removeHexes[event.original]) newEvents.push(event); + } + item.events = newEvents; + //let transform = false; + //for (let event of newEvents) { + // if (event.trigger == "CurseTransform") transform = true; + //} + //if (!transform) { + for (let event of newEvents) { + if (event.trigger == "curseCount" || event.removeOnUncurse) { + newEvents.splice(newEvents.indexOf(event), 1); + } + } + if (KDGetRestraintVariant(item)) { + KDGetRestraintVariant(item).events = JSON.parse(JSON.stringify(item.events)); + if (KDGetRestraintVariant(item).suffix == "Cursed") KDGetRestraintVariant(item).suffix = "Purified"; + if (KDGetRestraintVariant(item).prefix == "Cursed") KDGetRestraintVariant(item).prefix = "Purified"; + } + + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Evil.ogg"); + + KinkyDungeonSendEvent("cleanse", { + item: item, + }); + + if (KDGameData.UsingConsumable) { + KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonInventoryItem" + KDGameData.UsingConsumable + "Use"), "#ff5277", 1, true); + let con = KinkyDungeonInventoryGetConsumable(KDGameData.UsingConsumable); + if (con) { + if (con.quantity > 1) con.quantity -= 1; + else { + KDGameData.InventoryAction = ""; + KDGameData.UsingConsumable = ""; + KinkyDungeonInventoryRemoveSafe(con); + } + } + KinkyDungeonLastAction = ""; + KinkyDungeonAdvanceTime(1, true, true); + } + } + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (KinkyDungeonLastTurnAction != "Wait" + || !(KinkyDungeonAllRestraintDynamic().some((r) => {return KDHasRemovableCurse(r.item, KDGameData.CurseLevel) || KDHasRemovableHex(r.item, KDGameData.CurseLevel);}))) { + KDGameData.UsingConsumable = ""; + return true; + } + } + return false; + }, + }, + "RemoveMagicLock": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeyEnter[0]);}, + hotkeyPress: () => {return KinkyDungeonKeyEnter[0];}, + icon: (_player, _item) => { + return "InventoryAction/CommandWord"; + }, + valid: (_player, item) => { + if (!(item?.type == Restraint)) return false; + return KDMagicLocks.includes(item.lock); + }, + /** Happens when you click the button */ + click: (_player, item) => { + if (KDMagicLocks.includes(item.lock)) { + KDChangeMana(item.lock, "lock", "unlock", -KDGameData.InventoryActionManaCost || 0); + KinkyDungeonLock(item, ""); + + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonPurpleLockRemove"), "#e7cf1a", 2); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + + KDGameData.InventoryAction = ""; + KinkyDungeonLastAction = "Cast"; + KinkyDungeonAdvanceTime(1, true, true); + } + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (!KinkyDungeonHasMana(KDGameData.InventoryActionManaCost) || !(KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks).length > 0)) { + return true; + } + } + return false; + }, + }, + "Offhand": { + icon: (_player, _item) => { + return "InventoryAction/Offhand"; + }, + valid: (_player, item) => { + if (!(item?.type == Weapon && KDCanOffhand(item))) return false; + return KinkyDungeonCanUseWeapon(false, undefined, KDWeapon(item)); + }, + show: (_player, item) => { + return KDGameData.Offhand != item.name; + }, + /** Happens when you click the button */ + click: (_player, item) => { + KDGameData.Offhand = item.name; + KDGameData.OffhandOld = item.name; + KinkyDungeonAdvanceTime(1, true, true); + //if (KDGameData.InventoryAction == "Offhand") + // KinkyDungeonDrawState = "Game"; + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (KinkyDungeonLastTurnAction != "Wait") { + return true; + } + } + return false; + }, + }, + "RemoveOffhand": { + icon: (_player, _item) => { + return "InventoryAction/RemoveOffhand"; + }, + valid: (_player, item) => { + return KDGameData.Offhand == item.name; + }, + /** Happens when you click the button */ + click: (_player, item) => { + KDGameData.Offhand = ""; + KDGameData.OffhandOld = ""; + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (KinkyDungeonLastTurnAction != "Wait") { + return true; + } + } + return false; + }, + }, + "Attach": { + icon: (_player, _item) => { + return "InventoryAction/Attach"; + }, + valid: (_player, item) => { + if (!(item?.type == Weapon && !KDWeapon(item)?.noHands && !KDWeapon(item)?.unarmed)) return false; + return item.name != KDGameData.AttachedWep; + }, + label: (_player, _item) => { + if (KDGameData.AttachedWep && KinkyDungeonInventoryGet(KDGameData.AttachedWep)) + return KDGetItemNameString(KDGameData.AttachedWep); + return ""; + }, + itemlabel: (_player, item) => { + if (KDGameData.AttachedWep == item.name) + return TextGet("KDAttached"); + return ""; + }, + /** Happens when you click the button */ + click: (_player, item) => { + KDGameData.AttachedWep = item.name; + KinkyDungeonAdvanceTime(1, true, true); + KDStunTurns(4, true); + KinkyDungeonDrawState = "Game"; + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Tape.ogg"); + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (KinkyDungeonLastTurnAction != "Wait") { + return true; + } + } + return false; + }, + }, + "Sell": { + alsoShow: ["SellBulk", "SellExcess"], + icon: (_player, _item) => { + return "InventoryAction/Sell"; + }, + label: (_player, item) => { + if (KDWeapon(item)?.unarmed) return ""; + let mult = 1; + let quantity = 1; + let quantitystart = 0; + if (KDGameData.ItemsSold && KDGameData.ItemsSold[item.name]) { + quantitystart = KDGameData.ItemsSold[item.name]; + } + // Use partial sum formula (maths) + mult = ((KDMarketRateDecay**(quantitystart + quantity) - 1))/(KDMarketRateDecay - 1) - ((KDMarketRateDecay**(quantitystart) - 1))/(KDMarketRateDecay - 1); + let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); + return TextGet("KDGP").replace("AMNT", value + ""); + }, + itemlabel: (_player, item) => { + if (KDWeapon(item)?.unarmed) return ""; + let mult = 1; + let quantity = 1; + let quantitystart = 0; + if (KDGameData.ItemsSold && KDGameData.ItemsSold[item.name]) { + quantitystart = KDGameData.ItemsSold[item.name]; + } + // Use partial sum formula (maths) + mult = ((KDMarketRateDecay**(quantitystart + quantity) - 1))/(KDMarketRateDecay - 1) - ((KDMarketRateDecay**(quantitystart) - 1))/(KDMarketRateDecay - 1); + let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); + return TextGet("KDGP").replace("AMNT", value + ""); + }, + itemlabelcolor: (_player, _item) => {return "#ffff44";}, + text: (_player, item) => { + let mult = 1; + let quantity = 1; + let quantitystart = 0; + if (KDGameData.ItemsSold && KDGameData.ItemsSold[item.name]) { + quantitystart = KDGameData.ItemsSold[item.name]; + } + // Use partial sum formula (maths) + mult = ((KDMarketRateDecay**(quantitystart + quantity) - 1))/(KDMarketRateDecay - 1) - ((KDMarketRateDecay**(quantitystart) - 1))/(KDMarketRateDecay - 1); + let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); + return TextGet("KDInventoryActionSell").replace("VLU", value + ""); + }, + valid: (_player, item) => { + if (KDGameData.ItemPriority[item.name] > 9) return false; + if (KDWeapon(item)?.unarmed) return false; + return item?.type == Weapon || item?.type == LooseRestraint || item?.type == Consumable; + }, + /** Happens when you click the button */ + click: (_player, item) => { + let mult = 1; + let quantity = 1; + let quantitystart = 0; + if (KDGameData.ItemsSold && KDGameData.ItemsSold[item.name]) { + quantitystart = KDGameData.ItemsSold[item.name]; + } + // Use partial sum formula (maths) + + mult = ((KDMarketRateDecay**(quantitystart + quantity) - 1))/(KDMarketRateDecay - 1) - ((KDMarketRateDecay**(quantitystart) - 1))/(KDMarketRateDecay - 1); + let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); + let itemInv = KinkyDungeonInventoryGetSafe(item.name); + if (!itemInv) return; + if (itemInv.type == Consumable) + KinkyDungeonChangeConsumable(KDConsumable(itemInv), -1); + else if (itemInv.quantity > 1) itemInv.quantity -= 1; + else KinkyDungeonInventoryRemoveSafe(itemInv); + KinkyDungeonAddGold(value); + if (!KDGameData.ItemsSold) KDGameData.ItemsSold = {}; + KDGameData.ItemsSold[item.name] = (KDGameData.ItemsSold[item.name] || 0) + 1; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Coins.ogg"); + KinkyDungeonSendTextMessage(10, TextGet("KDSell") + .replace("ITM", KDGetItemName(item)) + .replace("VLU", "" + value) + , "#ffffff", 2); + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (KinkyDungeonLastTurnAction != "Wait") { + return true; + } + } + return false; + }, + }, + "SellBulk": { + icon: (_player, _item) => { + return "InventoryAction/SellBulk"; + }, + label: (_player, item) => { + let mult = 1; + let quantity = ((item.quantity) ? item.quantity : 1); + let quantitystart = 0; + if (KDGameData.ItemsSold && KDGameData.ItemsSold[item.name]) { + quantitystart = KDGameData.ItemsSold[item.name]; + } + // Use partial sum formula (maths) + + mult = ((KDMarketRateDecay**(quantitystart + quantity) - 1))/(KDMarketRateDecay - 1) - ((KDMarketRateDecay**(quantitystart) - 1))/(KDMarketRateDecay - 1); + let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); + return TextGet("KDGP").replace("AMNT", value + ""); + }, + text: (_player, item) => { + let mult = 1; + let quantity = ((item.quantity) ? item.quantity : 1); + let quantitystart = 0; + if (KDGameData.ItemsSold && KDGameData.ItemsSold[item.name]) { + quantitystart = KDGameData.ItemsSold[item.name]; + } + // Use partial sum formula (maths) + + mult = ((KDMarketRateDecay**(quantitystart + quantity) - 1))/(KDMarketRateDecay - 1) - ((KDMarketRateDecay**(quantitystart) - 1))/(KDMarketRateDecay - 1); + let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); + return TextGet("KDInventoryActionSellBulk").replace("VLU", value + ""); + }, + valid: (_player, item) => { + if (KDGameData.ItemPriority[item.name] > 9) return false; + return item?.type == LooseRestraint || item?.type == Consumable; + }, + show: (_player, item) => { + return item?.type == LooseRestraint || item?.type == Consumable; + }, + /** Happens when you click the button */ + click: (_player, item) => { + let mult = 1; + let quantity = ((item.quantity) ? item.quantity : 1); + let quantitystart = 0; + if (KDGameData.ItemsSold && KDGameData.ItemsSold[item.name]) { + quantitystart = KDGameData.ItemsSold[item.name]; + } + // Use partial sum formula (maths) + + mult = ((KDMarketRateDecay**(quantitystart + quantity) - 1))/(KDMarketRateDecay - 1) - ((KDMarketRateDecay**(quantitystart) - 1))/(KDMarketRateDecay - 1); + let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); + let itemInv = KinkyDungeonInventoryGetSafe(item.name); + if (!itemInv) return; + if (itemInv.type == Consumable) + KinkyDungeonChangeConsumable(KDConsumable(itemInv), -itemInv.quantity); + else KinkyDungeonInventoryRemoveSafe(itemInv); + if (!KDGameData.ItemsSold) KDGameData.ItemsSold = {}; + KDGameData.ItemsSold[item.name] = (KDGameData.ItemsSold[item.name] || 0) + quantity; + KinkyDungeonAddGold(value); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Coins.ogg"); + KinkyDungeonSendTextMessage(10, TextGet("KDSellBulk") + .replace("ITM", KDGetItemName(item)) + .replace("VLU", "" + value) + .replace("#", "" + (itemInv.quantity || 1)) + , "#ffffff", 2); + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (KinkyDungeonLastTurnAction != "Wait") { + return true; + } + } + return false; + }, + }, + "SellExcess": { + icon: (_player, _item) => { + return "InventoryAction/SellExcess"; + }, + label: (_player, item) => { + let mult = 1; + let quantity = ((item.quantity) ? item.quantity : 1) - 1; + let quantitystart = 0; + if (KDGameData.ItemsSold && KDGameData.ItemsSold[item.name]) { + quantitystart = KDGameData.ItemsSold[item.name]; + } + // Use partial sum formula (maths) + + mult = ((KDMarketRateDecay**(quantitystart + quantity) - 1))/(KDMarketRateDecay - 1) - ((KDMarketRateDecay**(quantitystart) - 1))/(KDMarketRateDecay - 1); + let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); + return TextGet("KDGP").replace("AMNT", value + ""); + }, + text: (_player, item) => { + let mult = 1; + let quantity = ((item.quantity) ? item.quantity : 1) - 1; + let quantitystart = 0; + if (KDGameData.ItemsSold && KDGameData.ItemsSold[item.name]) { + quantitystart = KDGameData.ItemsSold[item.name]; + } + // Use partial sum formula (maths) + + mult = ((KDMarketRateDecay**(quantitystart + quantity) - 1))/(KDMarketRateDecay - 1) - ((KDMarketRateDecay**(quantitystart) - 1))/(KDMarketRateDecay - 1); + let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); + return TextGet("KDInventoryActionSellExcess").replace("VLU", value + ""); + }, + valid: (_player, item) => { + if (KDGameData.ItemPriority[item.name] > 9) return false; + return item?.type == LooseRestraint || item?.type == Consumable; + }, + show: (_player, item) => { + if (!item.quantity || item.quantity == 1) return false; + return item?.type == LooseRestraint || item?.type == Consumable; + }, + /** Happens when you click the button */ + click: (_player, item) => { + let mult = 1; + let quantity = ((item.quantity) ? item.quantity : 1) - 1; + let quantitystart = 0; + if (KDGameData.ItemsSold && KDGameData.ItemsSold[item.name]) { + quantitystart = KDGameData.ItemsSold[item.name]; + } + // Use partial sum formula (maths) + + mult = ((KDMarketRateDecay**(quantitystart + quantity) - 1))/(KDMarketRateDecay - 1) - ((KDMarketRateDecay**(quantitystart) - 1))/(KDMarketRateDecay - 1); + let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); + let itemInv = KinkyDungeonInventoryGetSafe(item.name); + if (!itemInv) return; + if (itemInv.type == Consumable) + KinkyDungeonChangeConsumable(KDConsumable(itemInv), -quantity); + else KinkyDungeonInventoryGetSafe(item.name).quantity = 1; + if (!KDGameData.ItemsSold) KDGameData.ItemsSold = {}; + KDGameData.ItemsSold[item.name] = (KDGameData.ItemsSold[item.name] || 0) + quantity; + KinkyDungeonAddGold(value); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Coins.ogg"); + KinkyDungeonSendTextMessage(10, TextGet("KDSellExcess") + .replace("ITM", KDGetItemName(item)) + .replace("VLU", "" + value) + .replace("#", "" + (quantity || 1)) + , "#ffffff", 2); + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (KinkyDungeonLastTurnAction != "Wait") { + return true; + } + } + return false; + }, + }, + + + "Recycle": { + alsoShow: ["RecycleBulk", "RecycleExcess"], + icon: (_player, _item) => { + return "InventoryAction/Recycle"; + }, + show: (_player, item) => { + return item?.type == LooseRestraint; + }, + label: (_player, item) => { + return KDRecycleString(item, 1); + }, + itemlabel: (_player, item) => { + return KDRecycleString(item, 1); + }, + itemlabelcolor: (_player, _item) => {return "#ffffff";}, + text: (_player, _item) => { + let value = Math.round(100); + return TextGet("KDInventoryActionRecycle").replace("VLU", value + ""); + }, + valid: (_player, item) => { + if (KDGameData.ItemPriority[item.name] > 9) return false; + if (KDWeapon(item)?.unarmed) return false; + if (KDRestraint(item)?.noRecycle != undefined) return false; + return item?.type == Weapon || item?.type == LooseRestraint || item?.type == Consumable; + }, + /** Happens when you click the button */ + click: (_player, item) => { + KDChangeRecyclerInput(KDRecycleItem(item, 1)); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Recycle.ogg"); + KinkyDungeonSendTextMessage(10, KDRecycleResourceString(false, "RecyclerInput_"), "#ffffff", 2); + KinkyDungeonSendTextMessage(10, TextGet("KDRecycle") + .replace("ITM", KDGetItemName(item)) + .replace("VLU", "" + 100) + , "#ffffff", 2); + + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (KinkyDungeonLastTurnAction != "Wait") { + return true; + } + } + return false; + }, + }, + "RecycleBulk": { + icon: (_player, _item) => { + return "InventoryAction/RecycleBulk"; + }, + label: (_player, item) => { + return KDRecycleString(item, item.quantity || 1); + }, + text: (_player, item) => { + return KDRecycleString(item, item.quantity || 1); + }, + valid: (_player, item) => { + if (KDGameData.ItemPriority[item.name] > 9) return false; + return item?.type == LooseRestraint; + }, + show: (_player, item) => { + return item?.type == LooseRestraint; + }, + /** Happens when you click the button */ + click: (_player, item) => { + + let itemInv = KinkyDungeonInventoryGetSafe(item.name); + if (!itemInv) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/BeepEngage.ogg"); + return; + } + + let quant = (itemInv.quantity || 1); + + KDChangeRecyclerInput(KDRecycleItem(item, itemInv.quantity || 1)); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Recycle.ogg"); + KinkyDungeonSendTextMessage(10, KDRecycleResourceString(false, "RecyclerInput_"), "#ffffff", 2); + KinkyDungeonSendTextMessage(10, TextGet("KDRecycleBulk") + .replace("ITM", KDGetItemName(item)) + .replace("VLU", "" + 100) + .replace("#", "" + quant) + , "#ffffff", 2); + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (KinkyDungeonLastTurnAction != "Wait") { + return true; + } + } + return false; + }, + }, + "RecycleExcess": { + icon: (_player, _item) => { + return "InventoryAction/RecycleExcess"; + }, + label: (_player, item) => { + if (item.quantity > 1) + return KDRecycleString(item, item.quantity - 1); + return ""; + }, + text: (_player, _item) => { + let value = Math.round(100); + return TextGet("KDInventoryActionRecycleExcess").replace("VLU", value + ""); + }, + valid: (_player, item) => { + if (KDGameData.ItemPriority[item.name] > 9) return false; + return (item?.type == LooseRestraint); + }, + show: (_player, item) => { + return item?.type == LooseRestraint; + }, + /** Happens when you click the button */ + click: (_player, item) => { + + let itemInv = KinkyDungeonInventoryGetSafe(item.name); + if (!itemInv || !(itemInv.quantity > 1)) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/BeepEngage.ogg"); + return; + } + + let quant = (itemInv.quantity - 1); + + KDChangeRecyclerInput(KDRecycleItem(item, itemInv.quantity - 1)); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Recycle.ogg"); + KinkyDungeonSendTextMessage(10, KDRecycleResourceString(false, "RecyclerInput_"), "#ffffff", 2); + KinkyDungeonSendTextMessage(10, TextGet("KDRecycleExcess") + .replace("ITM", KDGetItemName(item)) + .replace("VLU", "" + 100) + .replace("#", "" + quant) + , "#ffffff", 2); + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (KinkyDungeonLastTurnAction != "Wait") { + return true; + } + } + return false; + }, + }, + + "Disassemble": { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[4]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[4];}, + icon: (_player, _item) => { + return "InventoryAction/Disassemble"; + }, + show: (_player, item) => { + return item?.type == LooseRestraint && KDRestraint(item)?.disassembleAs != undefined; + }, + itemlabelcolor: (_player, _item) => {return "#ffffff";}, + text: (_player, item) => { + let one = (item.quantity || 1) == 1 ? "One" : ""; + return TextGet("KDInventoryActionDisassemble" + one); + }, + valid: (_player, item) => { + if (KDGameData.ItemPriority[item.name] > 9) return false; + if (KDWeapon(item)?.unarmed) return false; + return KDRestraint(item)?.disassembleAs != undefined; + }, + /** Happens when you click the button */ + click: (_player, item) => { + let itemInv = KinkyDungeonInventoryGetSafe(item.name); + if (!itemInv || !(itemInv.quantity > 0)) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/BeepEngage.ogg"); + return; + } + + let quant = Math.max(1, ((itemInv.quantity || 1) - 1)); + let mult = KDRestraint(item)?.disassembleCount || 1; + let product = KDRestraint(item)?.disassembleAs; + + //KDChangeRecyclerInput(KDRecycleItem(item, itemInv.quantity - 1)); + + KinkyDungeonInventoryAddLoose( + product, undefined, undefined, quant + ); + + itemInv.quantity = (itemInv.quantity || 1) - quant; + if (itemInv.quantity == 0) KinkyDungeonInventoryRemoveSafe(itemInv); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Recycle.ogg"); + KinkyDungeonSendTextMessage(10, TextGet("KDRecycleExcess") + .replace("ITM", KDGetItemName(item)) + .replace("PRD", TextGet("Restraint" + product)) + .replace("#", "" + quant) + .replace("$", "" + quant*mult) + , "#ffffff", 2); + + }, + /** Return true to cancel it */ + cancel: (_player, delta) => { + if (delta > 0) { + if (KinkyDungeonLastTurnAction != "Wait") { + return true; + } + } + return false; + }, + }, + + + + "Bondage": { + icon: (_player, _item) => { + return "InventoryAction/Bondage"; + }, + /** Returns if the button is greyed out */ + valid: (player, item) => { + if (!(item?.type == LooseRestraint)) return false; + if (KDRestraintSpecial(item) || KDRestraint(item).armor) return false; + let nearby = KDNearbyEnemies(player.x, player.y, 1.5); + for (let enemy of nearby) { + if (enemy.id == KDGameData.BondageTarget && (KinkyDungeonIsDisabled(enemy) || (enemy.playWithPlayer && KDCanDom(enemy)))) { + return true; + } + } + return false; + }, + /** Happens when you click the button */ + click: (player, item) => { + let nearby = KDNearbyEnemies(player.x, player.y, 1.5); + for (let enemy of nearby) { + if (enemy.id == KDGameData.BondageTarget && (KinkyDungeonIsDisabled(enemy) || (enemy.playWithPlayer && KDCanDom(enemy)))) { + let level = KDRestraint(item).power; + let type = KDRestraintBondageType(item); + let status = KDRestraintBondageStatus(item); + let mult = KDRestraintBondageMult(item, enemy); + KDTieUpEnemy(enemy, level*mult, type); + KinkyDungeonSendTextMessage(10, + TextGet("KDTieUpEnemy") + .replace("RSTR", KDGetItemName(item))//TextGet("Restraint" + KDRestraint(item)?.name)) + .replace("ENNME", TextGet("Name" + enemy.Enemy.name)) + .replace("AMNT", "" + Math.round(100 * enemy.boundLevel / enemy.Enemy.maxhp)), + "#ffffff", 1); + if (status.belt) { + KinkyDungeonApplyBuffToEntity(enemy, KDChastity, {}); + } + if (status.toy) { + KinkyDungeonApplyBuffToEntity(enemy, KDToy, {}); + } + if (status.plug) { + KinkyDungeonApplyBuffToEntity(enemy, KDEntityBuffedStat(enemy, "Plug") > 0 ? KDDoublePlugged : KDPlugged, {}); + } + if (status.blind) { + enemy.blind = Math.max(enemy.blind || 0, status.blind); + } + if (status.silence) { + enemy.silence = Math.max(enemy.silence || 0, status.silence); + } + if (status.bind) { + enemy.bind = Math.max(enemy.bind || 0, status.bind); + } + if (status.immobile) { + enemy.immobile = Math.max(enemy.immobile || 0, status.immobile); + } + if (status.slow) { + enemy.slow = Math.max(enemy.slow || 0, status.slow); + } + if (status.disarm) { + enemy.disarm = Math.max(enemy.disarm || 0, status.disarm); + } + if (status.reduceaccuracy) { + KinkyDungeonApplyBuffToEntity(enemy, + KDRestraintReduceAccuracy, + { + power: status.reduceaccuracy, + }, + ); + } + + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/LockLight.ogg"); + + if (!enemy.items) enemy.items = []; + enemy.items.push(item.inventoryVariant || item.name); + if (item.quantity > 1) item.quantity -= 1; + else KinkyDungeonInventoryRemoveSafe(item); + KinkyDungeonAdvanceTime(1, true, true); + + break; + } + } + }, + /** Return true to cancel it */ + cancel: (player, delta) => { + if (delta > 0) { + let nearby = KDNearbyEnemies(player.x, player.y, 1.5); + for (let enemy of nearby) { + if (enemy.id == KDGameData.BondageTarget && (KinkyDungeonIsDisabled(enemy) || (enemy.playWithPlayer && KDCanDom(enemy)))) { + return false; + } + } + return true; + } + return false; + }, + }, + "Food": { + icon: (_player, _item) => { + return "InventoryAction/Cookie"; + }, + /** Returns if the button is greyed out */ + valid: (player, item) => { + if (!(item?.type == Consumable) || item.quantity < 1 || !KDConsumable(item)?.wp_instant) return false; + let nearby = KDNearbyEnemies(player.x, player.y, 1.5); + for (let enemy of nearby) { + if (enemy.id == KDGameData.FoodTarget && enemy.hp < enemy.Enemy.maxhp) { + return true; + } + } + return false; + }, + /** Happens when you click the button */ + click: (player, item) => { + let nearby = KDNearbyEnemies(player.x, player.y, 1.5); + for (let enemy of nearby) { + if (enemy.id == KDGameData.FoodTarget) { + enemy.hp = Math.min(enemy.Enemy.maxhp, enemy.hp + KDConsumable(item)?.wp_instant * 5); + let faction2 = KDGetFaction(enemy); + if (!KinkyDungeonHiddenFactions.has(faction2)) { + KinkyDungeonChangeFactionRep(faction2, 0.01 * KDConsumable(item)?.wp_instant); + } + + if (KDConsumable(item)?.sideEffects) { + for (let effect of KDConsumable(item).sideEffects) { + KinkyDungeonConsumableEffectNPC(KDConsumable(item), enemy, effect); + } + } + + KinkyDungeonSendTextMessage(10, + TextGet("KDGiveFood") + .replace("RSTR", KDGetItemName(item))//TextGet("Restraint" + KDRestraint(item)?.name)) + .replace("ENNME", TextGet("Name" + enemy.Enemy.name)) + .replace("AMNT1", "" + Math.round(10 * enemy.hp)) + .replace("AMNT2", "" + Math.round(10 * enemy.Enemy.maxhp)), + "#ffffff", 1); + + + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Cookie.ogg"); + + if (item.quantity > 1) item.quantity -= 1; + else KinkyDungeonInventoryRemoveSafe(item); + KinkyDungeonAdvanceTime(1, true, true); + + break; + } + } + }, + /** Return true to cancel it */ + cancel: (player, delta) => { + if (delta > 0) { + let nearby = KDNearbyEnemies(player.x, player.y, 1.5); + for (let enemy of nearby) { + if (enemy.id == KDGameData.FoodTarget) { + return false; + } + } + return true; + } + return false; + }, + }, +}; diff --git a/Game/src/item/KDModifier.ts b/Game/src/item/KDModifier.ts new file mode 100644 index 000000000..ebefebc46 --- /dev/null +++ b/Game/src/item/KDModifier.ts @@ -0,0 +1,243 @@ +'use strict'; + + + + +let KDELEMENTS = [ + "fire", + "soap", + "crush", + "stun", + "electric", + "ice", +]; + +/** + * Contains a list of modifier variant effects classes + * Can be modified dynamically so mods can add basic curses + */ +let KDModifierEffectVariantList = { + "Common": [ + "SpellDamageBuff", + "ElementalBuff", + "ElementalResist", + ], +}; +/** + * Contains a list of modifier variant condition classes + * Can be modified dynamically so mods can add basic curses + */ +let KDModifierConditionVariantList = { + "Common": [ + "OnTease", + "OnElementalSpell", + ], +}; + +let KDModifierEffects: Record = { + SpellDamageBuff: { + tags: ['buff', 'positive', 'temp', 'magic'], + types: { + // Weapon + 2: null, + // Consumable + 1: null, + // Restraint + 0: { + level: 6, + filter: (_item, _positive, _data) => { + return true; + }, + weight: (_item, _positive, _data) => { + return 10; + }, + events: (item, _positive, data) => { + let power = Math.max(KDGetItemPower(item), 2); + let amt = 5 + Math.round((0.4 + 0.6*KDRandom()) * 4 * Math.pow(power, 0.7)); + + amt = KDGenericMultEnchantmentAmount(amt, item, data.Loot, data.curse, data.primaryEnchantment); + let time = 12 + Math.floor(KDRandom() * amt * 0.35); + + return [ + {trigger: "CONDITION", inheritLinked: true, type: "BuffSelf", buffType: "spellDamageBuff", time: time, power: 0.01*amt, desc: "SpellDamageBuff", buffSprite: "SpellDamageUp", }, + {original: "SpellDamageBuff", inheritLinked: true, trigger: "inventoryTooltip", type: "effectModifier", msg: "SpellDamageBuff", power: amt, duration: time, color: "#000000", bgcolor: "#8888ff"}, + {original: "SpellDamageBuff", inheritLinked: true, trigger: "icon", type: "tintIcon", power: 4, color: "#ff8933"}, + ]; + }, + }, + } + }, + ElementalBuff: { + tags: ['buff', 'positive', 'temp', 'magic', "element"], + types: { + // Weapon + 2: null, + // Consumable + 1: null, + // Restraint + 0: { + level: 5, + filter: (_item, _positive, _data) => { + return true; + }, + weight: (_item, _positive, _data) => { + return 10; + }, + onSelect: (_item, data) => { + if (!data.element) + data.element = CommonRandomItemFromList("", KDELEMENTS); + }, + events: (item, _positive, data) => { + let type = data.element; + + let power = Math.max(KDGetItemPower(item), 2); + let amt = 8 + Math.round((0.4 + 0.6*KDRandom()) * 5 * Math.pow(power, 0.75)); + + amt = KDGenericMultEnchantmentAmount(amt, item, data.Loot, data.curse, data.primaryEnchantment); + let time = 6 + Math.floor(KDRandom() * amt * 0.2); + + return [ + {trigger: "CONDITION", inheritLinked: true, type: "BuffSelf", buffType: type + "DamageBuff", time: time, power: 0.01*amt, desc: "ElementalBuff", damage: data.element, buffSprite: "SpellDamageUp",}, + {original: "ElementalBuff", inheritLinked: true, trigger: "inventoryTooltip", type: "effectModifier", msg: "ElementalBuff", damage: data.element, power: amt, duration: time, color: "#000000", + bgcolor: KinkyDungeonDamageTypes[type].color}, + {original: "ElementalBuff", inheritLinked: true, trigger: "icon", type: "tintIcon", power: 4, color: KinkyDungeonDamageTypes[type].color}, + ]; + }, + }, + } + }, + ElementalResist: { + tags: ['buff', 'positive', 'temp', 'magic', "element"], + types: { + // Weapon + 2: null, + // Consumable + 1: null, + // Restraint + 0: { + level: 4, + filter: (_item, _positive, _data) => { + return true; + }, + weight: (_item, _positive, _data) => { + return 10; + }, + onSelect: (_item, data) => { + if (!data.element) + data.element = CommonRandomItemFromList("", KDELEMENTS); + }, + events: (item, _positive, data) => { + let type = data.element; + + let power = Math.max(KDGetItemPower(item), 2); + let amt = 20 + Math.round((0.4 + 0.6*KDRandom()) * 15 * Math.pow(power, 0.75)); + + amt = KDGenericMultEnchantmentAmount(amt, item, data.Loot, data.curse, data.primaryEnchantment); + let time = 15 + Math.floor(KDRandom() * amt * 0.15); + + return [ + {trigger: "CONDITION", inheritLinked: true, type: "BuffSelf", buffType: type + "DamageResist", time: time, power: 0.01*amt, desc: "ElementalResist", damage: data.element, buffSprite: "SpellDamageUp",}, + {original: "ElementalResist", inheritLinked: true, trigger: "inventoryTooltip", type: "effectModifier", msg: "ElementalResist", damage: data.element, power: amt, duration: time, color: "#000000", + bgcolor: KinkyDungeonDamageTypes[type].color}, + {original: "ElementalResist", inheritLinked: true, trigger: "icon", type: "tintIcon", power: 4, bgcolor: KinkyDungeonDamageTypes[type].color}, + ]; + }, + }, + } + }, +}; + +let KDModifierConditions: Record = { + OnTease: { + tags: ['accessible', 'melee', 'common', 'riskmed'], + types: { + // Weapon + 2: null, + // Consumable + 1: null, + // Restraint + 0: { + level: 6, + filter: (_item, _pos, _neut, _neg, _data) => { + return true; + }, + weight: (_item, _pos, _neut, _neg, _data) => { + return 10; + }, + events: (item, pos, neut, neg, data) => { + let effects = KDGenericEffects(item, ModifierEnum.restraint, pos, neut, neg, data); + for (let eff of effects) { + if (eff.trigger == "CONDITION") { + eff.trigger = "playerAttack"; + eff.targetType = "enemy"; + eff.attackerType = "KDPLAYER"; + eff.condition = "DamageTypeTeasing"; + eff.dynamic = true; + } + } + return [ + {original: "OnTease", inheritLinked: true, trigger: "inventoryTooltip", type: "conditionModifier", msg: "OnTease", color: "#000000", bgcolor: "#ffffff"}, + ...effects]; + }, + }, + } + }, + OnElementalSpell: { + tags: ['accessible', 'melee', 'common', 'riskmed'], + types: { + // Weapon + 2: null, + // Consumable + 1: null, + // Restraint + 0: { + level: 6, + filter: (_item, _pos, _neut, _neg, data) => { + return data.element && KDELEMENTS.includes(data.element); + }, + weight: (_item, _pos, _neut, _neg, _data) => { + return 100; + }, + events: (item, pos, neut, neg, data) => { + let effects = KDGenericEffects(item, ModifierEnum.restraint, pos, neut, neg, data); + for (let eff of effects) { + if (eff.trigger == "CONDITION") { + eff.trigger = "playerCast"; + eff.targetType = "enemy"; + eff.attackerType = "KDPLAYER"; + eff.condition = "spellType"; + eff.damage = data.element; + eff.kind = data.element; + eff.dynamic = true; + } + } + return [ + {original: "OnElementalSpell", inheritLinked: true, trigger: "inventoryTooltip", type: "conditionModifier", msg: "OnElementalCast", damage: data.element, color: "#000000", bgcolor: "#ffffff"}, + ...effects]; + }, + }, + } + }, +}; + +/** + * @param item + * @param type + * @param pos + * @param neut + * @param neg + * @param data + */ +function KDGenericEffects(item: string, type: ModifierEnum, pos: KDModifierEffect[], neut: KDModifierEffect[], neg: KDModifierEffect[], data: KDModifierConditionData): KinkyDungeonEvent[] { + let effects: KinkyDungeonEvent[] = []; + for (let eff of [...pos]) { + effects.push(...eff.types[type].events(item, PosNeutNeg.positive, data)); + } + for (let eff of [...neut]) { + effects.push(...eff.types[type].events(item, PosNeutNeg.neutral, data)); + } + for (let eff of [...neg]) { + effects.push(...eff.types[type].events(item, PosNeutNeg.negative, data)); + } + return effects; +} diff --git a/Game/src/item/KinkyDungeonConsumables.ts b/Game/src/item/KinkyDungeonConsumables.ts new file mode 100644 index 000000000..c70564c7f --- /dev/null +++ b/Game/src/item/KinkyDungeonConsumables.ts @@ -0,0 +1,415 @@ +"use strict"; + +/** + * @param item + */ +function KDConsumable(item: Named): consumable { + return KinkyDungeonConsumables[item.name]; +} + +function KinkyDungeonFindConsumable(Name: string): consumable { + for (let con of Object.values(KinkyDungeonConsumables)) { + if (con.name == Name) return con; + } + return undefined; +} + +/** Returns an abbreviated consumable. */ +function KinkyDungeonFindBasic(Name: string): any { + for (let con of Object.values(KinkyDungneonBasic)) { + if (con.name == Name) return con; + } + return undefined; +} + +function KinkyDungeonFindConsumableOrBasic(Name: string): consumable | any { + for (let con of Object.values(KinkyDungeonConsumables)) { + if (con.name == Name) return con; + } + + for (let con of Object.values(KinkyDungneonBasic)) { + if (con.name == Name) return con; + } + return undefined; +} + +function KinkyDungeonGetInventoryItem(Name: string, Filter: string = Consumable): itemPreviewEntry { + let Filtered = KinkyDungeonFilterInventory(Filter); + for (let item of Filtered) { + if (item.name == Name) return item; + } + return null; +} + +function KinkyDungeonItemCount(Name: string): number { + let item = KinkyDungeonGetInventoryItem(Name); + if (item && item.item && item.item.quantity) { + return item.item.quantity; + } + return 0; +} + +function KinkyDungeonGetShopItem(_Level: number, Rarity: number, _Shop: boolean, ShopItems: any[], uniqueTags: Record = {}) { + let Table = []; + let params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; + if (params.ShopExclusives) { + for (let exc of params.ShopExclusives) { + Table.push(exc); + } + } + if (KinkyDungeonStatsChoice.get('arousalMode')) { + if (params.ShopExclusivesArousal) { + for (let exc of params.ShopExclusivesArousal) { + Table.push(exc); + } + } + } + let Shopable: Record = Object.entries(KinkyDungeonConsumables).filter(([_k, v]) => (v.shop)); + for (let S = 0; S < Shopable.length; S++) { + let s = Shopable[S][1]; + s.shoptype = Consumable; + if ((KinkyDungeonStatsChoice.get('arousalMode') || !KinkyDungeonConsumables[s.name].arousalMode)) + Table.push(s); + } + Shopable = Object.entries(KinkyDungneonBasic).filter(([_k, v]) => (v.shop)); + for (let S = 0; S < Shopable.length; S++) { + let s = Shopable[S][1]; + s.shoptype = "basic"; + if ((!s.ignoreInventory || !KinkyDungeonInventoryGet(s.ignoreInventory)) && (KinkyDungeonStatsChoice.get('arousalMode') || !s.arousalMode)) + Table.push(s); + } + Shopable = Object.entries(KinkyDungneonShopRestraints).filter(([_k, v]) => (v.shop)); + for (let S = 0; S < Shopable.length; S++) { + let s = Shopable[S][1]; + s.shoptype = LooseRestraint; + if (!KinkyDungeonInventoryGet(s.name) && (KinkyDungeonStatsChoice.get('arousalMode') || !s.arousalMode)) + Table.push(s); + } + Shopable = Object.entries(KinkyDungeonWeapons).filter(([_k, v]) => (v.shop)); + for (let S = 0; S < Shopable.length; S++) { + let s = Shopable[S][1]; + s.shoptype = Weapon; + if (!KinkyDungeonInventoryGet(s.name) && (KinkyDungeonStatsChoice.get('arousalMode') || !KinkyDungeonWeapons[s.name].arousalMode)) + Table.push(s); + } + + // No duplicates or uniqueTag dupes + for (let R = Rarity; R >= 0; R--) { + let available = Table.filter((item) => (item.rarity == R && !ShopItems.some((item2) => {return item2.name == item.name;}))); + available = available.filter((item) => { + + return !item.uniqueTags || !item.uniqueTags.some((t: string) => {return uniqueTags[t];}); + }); + if (available.length > 0) return available[Math.floor(KDRandom() * available.length)]; + } + return null; +} + + +/** + * @param consumable + * @param Quantity + */ +function KinkyDungeonChangeConsumable(consumable: consumable, Quantity: number, container?: KDContainer): boolean { + let item = container ? container.items[consumable.name] : KinkyDungeonInventoryGetConsumable(consumable.name); + if (item) { + item.quantity = (item.quantity || 1) + Quantity; + if (item.quantity <= 0) { + if (container) + delete container.items[consumable.name] + else + KinkyDungeonInventoryRemove(item); + } + return true; + } + + if (Quantity >= 0) { + if (container) { + container.items[consumable.name] = {name: consumable.name, id: KinkyDungeonGetItemID(), type: Consumable, quantity: Quantity}; + } else { + KinkyDungeonInventoryAdd({name: consumable.name, id: KinkyDungeonGetItemID(), type: Consumable, quantity: Quantity}); + } + } + + return false; +} + +/** + * @param name + * @param Quantity + */ +function KDAddConsumable(name: string, Quantity: number, container?: KDContainer): boolean { + let item = container ? container.items[name] : KinkyDungeonInventoryGetConsumable(name); + if (item) { + item.quantity = (item.quantity || 1) + Quantity; + if (item.quantity <= 0) { + if (container) + delete container.items[name] + else + KinkyDungeonInventoryRemove(item); + } + return true; + } + + if (Quantity > 0) { + if (container) { + container.items[name] = {name: name, id: KinkyDungeonGetItemID(), type: Consumable, quantity: Quantity}; + } else { + KinkyDungeonInventoryAdd({name: name, id: KinkyDungeonGetItemID(), type: Consumable, quantity: Quantity}); + } + } + + return false; +} + +function KinkyDungeonConsumableEffect(Consumable: consumable, type?: string) { + if (!type) type = Consumable.type; + + if (KDConsumableEffects[type]) { + KDConsumableEffects[type](Consumable, KDPlayer()); + } else if (type == "spell") { + KinkyDungeonCastSpell(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonFindSpell(Consumable.spell, true), undefined, undefined, undefined); + KDStunTurns(1, true); + } else if (type == "targetspell") { + KDCloseQuickInv(); + if (KinkyDungeonDrawState == "Inventory") KinkyDungeonDrawState = "Game"; + KinkyDungeonTargetingSpell = KinkyDungeonFindSpell(Consumable.spell, true); + KinkyDungeonTargetingSpellItem = Consumable; + KinkyDungeonTargetingSpellWeapon = null; + } else if (type == "charge") { + KDChangeCharge(Consumable.name, type, "consumable", Consumable.amount); + //KDGameData.AncientEnergyLevel = Math.min(Math.max(0, KDGameData.AncientEnergyLevel + Consumable.amount), 1.0); + if (!KinkyDungeonStatsChoice.get("LostTechnology")) + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSourceSpent, 1); + } else if (type == "buff") { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: Consumable.name, type: Consumable.buff, power: Consumable.power, duration: Consumable.duration, aura: Consumable.aura}); + } else if (type == "recharge") { + //KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); + //KinkyDungeonAddGold(-Consumable.rechargeCost); + //KDStunTurns(1); + } else if (type == "shrineRemove") { + KinkyDungeonRemoveRestraintsWithShrine(Consumable.shrine); + KDStunTurns(1, true); + } else if (type == "goldKey") { + for (let r of KinkyDungeonPlayerGetRestraintsWithLocks(["Gold"])) { + KinkyDungeonLock(r, "Blue"); + } + } +} + +function KinkyDungeonConsumableEffectNPC(Consumable: consumable, entity: entity, type?: string) { + if (!type) type = Consumable.type; + + if (KDConsumableEffects[type]) { + KDConsumableEffects[type](Consumable, entity); + } +} + + + +function KinkyDungeonPotionCollar() { + for (let r of KinkyDungeonAllRestraint()) { + if (KDRestraint(r).potionCollar) return true; + } + return false; +} + +function KinkyDungeonCanDrink(byEnemy?: boolean): boolean { + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).allowPotions) return true; + } + if (KDGroupBlocked("ItemMouth", byEnemy)) return false; + return KinkyDungeonCanTalk(true); +} + +function KinkyDungeonAttemptConsumable(Name: any, Quantity: number): boolean { + if (KDGameData.SleepTurns > 0 || KDGameData.SlowMoveTurns > 0) return false; + let item = KinkyDungeonGetInventoryItem(Name, Consumable); + if (!item) return false; + + + if (KDConsumable(item.item).prereq && KDConsumablePrereq[KDConsumable(item.item).prereq]) { + if (KDConsumablePrereq[KDConsumable(item.item).prereq](item.item, Quantity)) { + KinkyDungeonUseConsumable(Name, Quantity); + return true; + } else return false; + } + + if (item.item && KDConsumable(item.item) && KDConsumable(item.item).type == "unusuable") { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonUnusable"), "#ff5277", 1); + return false; + } + if (item.item && KDConsumable(item.item) && KDConsumable(item.item).type == "goldKey") { + if (KinkyDungeonPlayerGetRestraintsWithLocks(["Gold"]).length == 0) { + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonMistressKeyFail"), "#ff5277", 1); + return false; + } + } + if (item.item && KDConsumable(item.item) && KDConsumable(item.item).type == "charge" && KDGameData.AncientEnergyLevel >= 1) { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonFullpower"), "#ff5277", 1); + return false; + } + if (item.item && KDConsumable(item.item) && KDConsumable(item.item).type == "recharge") { + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonInventoryItemAncientPowerSourceSpentUseFail"), "#ff5277", 1); + return false; + } + + if (item.item && KDConsumable(item.item) && KDConsumable(item.item).type == "shrineRemove" && KinkyDungeonGetRestraintsWithShrine(KDConsumable(item.item).shrine).length < 1) { + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonNoItemToRemove"), "pink", 1); + return false; + } + + let needMouth = item.item && KDConsumable(item.item) && ((KDConsumable(item.item).potion && !KDConsumable(item.item).gagFloor) || KDConsumable(item.item).needMouth); + let needArms = !(item.item && KDConsumable(item.item) && KDConsumable(item.item).noHands); + let strictness = KinkyDungeonStrictness(false, "ItemHands"); + let maxStrictness = (item.item && KDConsumable(item.item) && KDConsumable(item.item).maxStrictness) ? KDConsumable(item.item).maxStrictness : 1000; + + if (needMouth && ((!KDConsumable(item.item).potion && ((KDConsumable(item.item).gagMax && KinkyDungeonGagTotal() > KDConsumable(item.item).gagMax) || (!KDConsumable(item.item).gagMax && !KinkyDungeonCanTalk(true)))) + || (KDConsumable(item.item).potion && !KinkyDungeonCanDrink()))) { + let allowPotions = KinkyDungeonPotionCollar(); + if (KDConsumable(item.item).potion && allowPotions) { + //KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - energyCost); + } else { + KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonPotionGagged"), "#ff5277", 1); + + if (KinkyDungeonTextMessageTime > 0) + KinkyDungeonDrawState = "Game"; + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + + return false; + } + } + if (!(KinkyDungeonHasHelp()) && needArms && !KinkyDungeonStatsChoice.get("Psychic") && !(item.item && KDConsumable(item.item).potion && !KinkyDungeonIsArmsBound() && (!KinkyDungeonStatsChoice.has("WeakGrip") || !KinkyDungeonIsHandsBound(false, false))) && (KinkyDungeonIsHandsBound(false, true) || (KinkyDungeonStatsChoice.has("WeakGrip") && item.item && KDConsumable(item.item).potion)) && !KinkyDungeonCanUseFeet()) { + let allowPotions = KinkyDungeonPotionCollar(); + let nohands = KinkyDungeonIsHandsBound(false, true); + if (KDConsumable(item.item).potion && allowPotions) { + //KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - energyCost); + } else if (!nohands && KinkyDungeonCanKneel() && KDGameData.KneelTurns < 1) { + if (!KDGameData.KneelTurns) KDGameData.KneelTurns = 2; + else KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns, 2); + KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonCantUsePotionsKneel"), "#e7cf1a", 1); + + if (KinkyDungeonTextMessageTime > 0) + KinkyDungeonDrawState = "Game"; + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + KinkyDungeonAdvanceTime(1, true, true); + + return false; + } else if (nohands || KDGameData.KneelTurns < 1) { + //KinkyDungeonAdvanceTime(1); + KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonCantUsePotions"), "#ff5277", 1); + + if (KinkyDungeonTextMessageTime > 0) + KinkyDungeonDrawState = "Game"; + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + return false; + } + } + + if (strictness >= maxStrictness) { + //KinkyDungeonAdvanceTime(1); + KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonCantUsePotionsStrict"), "#ff5277", 1); + + if (KinkyDungeonTextMessageTime > 0) + KinkyDungeonDrawState = "Game"; + + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + return false; + } + + if (KDConsumable(item.item).postreq && KDConsumablePrereq[KDConsumable(item.item).postreq]) { + if (KDConsumablePrereq[KDConsumable(item.item).postreq](item.item, Quantity)) { + KDDelayedActionPrune(["Action", "Consume"]); + if (KDConsumable(item.item).delay || (KDConsumable(item.item).potion && KinkyDungeonStatsChoice.has("SavourTheTaste"))) { + let maxtime = KDConsumable(item.item).delay || 2; + for (let i = 1; i <= maxtime; i++) + KDAddDelayedAction({ + commit: i == maxtime ? "Consumable" : undefined, + update: i < maxtime ? "Consumable" : undefined, + data: { + Name: Name, + Quantity: Quantity, + }, + time: i, + tick: i - 1, + maxtime: maxtime, + tags: ["Action", "Remove", "Restrain"], + }); + KDDelayedActionStart(); + //KDStunTurns(KDConsumable(item.item).delay || 2, true); + } else KinkyDungeonUseConsumable(Name, Quantity); + return true; + } else return false; + } + KDDelayedActionPrune(["Action", "Consume"]); + if (KDConsumable(item.item).delay || (KDConsumable(item.item).potion && KinkyDungeonStatsChoice.has("SavourTheTaste"))) { + let maxtime = KDConsumable(item.item).delay || 2; + for (let i = 1; i <= maxtime; i++) + KDAddDelayedAction({ + commit: i == maxtime ? "Consumable" : undefined, + update: i < maxtime ? "Consumable" : undefined, + data: { + Name: Name, + Quantity: Quantity, + }, + time: i, + tick: i - 1, + maxtime: maxtime, + tags: ["Action", "Remove", "Restrain"], + }); + + KDDelayedActionStart(); + //KDStunTurns(KDConsumable(item.item).delay || 2, true); + } else KinkyDungeonUseConsumable(Name, Quantity); + return true; +} + +function KinkyDungeonUseConsumable(Name: string, Quantity: number): boolean { + let item = KinkyDungeonGetInventoryItem(Name, Consumable); + if (!item || item.item.quantity < Quantity) return false; + + for (let I = 0; I < Quantity; I++) { + KinkyDungeonConsumableEffect(KDConsumable(item.item)); + if (KDConsumable(item.item).sideEffects) { + for (let effect of KDConsumable(item.item).sideEffects) { + KinkyDungeonConsumableEffect(KDConsumable(item.item), effect); + } + } + } + if (!KDConsumable(item.item).noConsumeOnUse) + KinkyDungeonChangeConsumable(KDConsumable(item.item), -(KDConsumable(item.item).useQuantity ? KDConsumable(item.item).useQuantity : 1) * Quantity); + + if (KinkyDungeonConsumableVariants[item.item.inventoryVariant || item.item.name]) { + if (!KDGameData.IdentifiedObj) KDGameData.IdentifiedObj = {}; + KDGameData.IdentifiedObj[item.item.inventoryVariant || item.item.name] = 2; + } + KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonInventoryItem" + Name + "Use"), "#88FF88", 1); + if (KDConsumable(item.item).sfx) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + KDConsumable(item.item).sfx + ".ogg"); + } + return true; +} + + +function KDGetCheapestLatexSolvent(tag: string = "latexsolvent"): string { + let cheapest = ""; + let cheapestcost = -1000; + for (let c of KinkyDungeonAllConsumable()) { + if (KDConsumable(c) && KDConsumable(c)[tag] + && (cheapestcost == -1000 || KDConsumable(c)[tag] < cheapestcost)) { + cheapest = c.inventoryVariant || c.name; + cheapestcost = KDConsumable(c)[tag] + } + } + + return cheapest; +} \ No newline at end of file diff --git a/Game/src/item/KinkyDungeonConsumablesList.ts b/Game/src/item/KinkyDungeonConsumablesList.ts new file mode 100644 index 000000000..ea1e25c89 --- /dev/null +++ b/Game/src/item/KinkyDungeonConsumablesList.ts @@ -0,0 +1,235 @@ +"use strict"; + +let KDMaxRarity = 10; // By normal means + +let KinkyDungeonConsumables: Record = { + "PotionMana" : {name: "PotionMana", potion: true, costMod: 0.5, rarity: 0, shop: true, type: "restore", mp_instant: 5, mpool_instant: 0, mp_gradual: 0, scaleWithMaxMP: true, gagFloor: 0.5, duration: 0, sfx: "PotionDrink"}, + "ManaOrb" : {name: "ManaOrb", noHands: true, rarity: 2, shop: true, type: "restore", mp_instant: 0, mpool_instant: 20, mp_gradual: 0, scaleWithMaxMP: false, duration: 0, sfx: "Invis"}, + "PotionWill" : {name: "PotionWill", potion: true, rarity: 1, shop: true, type: "restore", wp_instant: 2.5, wp_gradual: 0, scaleWithMaxWP: true, duration: 0, gagFloor: 0.5, sfx: "PotionDrink"}, + "PotionStamina" : {name: "PotionStamina", potion: true, rarity: 1, shop: true, type: "restore", sp_instant: 5, sp_gradual: 25, scaleWithMaxSP: true, duration: 25, gagFloor: 0.5, sfx: "PotionDrink"}, + "PotionFrigid" : {name: "PotionFrigid", potion: true, rarity: 1, costMod: 1, shop: true, type: "restore", ap_instant: -10, ap_gradual: -20, duration: 50, arousalRatio: 1.0, gagFloor: 0.5, sfx: "PotionDrink"}, + "SmokeBomb" : {name: "SmokeBomb", noHands: true, rarity: 2, costMod: -1, shop: false, noConsumeOnUse: true, type: "targetspell", sfx: "FireSpell", spell: "SmokeBomb"}, + "FlashBomb" : {name: "FlashBomb", noHands: true, rarity: 3, costMod: -1, shop: false, noConsumeOnUse: true, type: "targetspell", sfx: "FireSpell", spell: "FlashBomb"}, + "Flashbang" : {name: "Flashbang", noHands: true, rarity: 4, costMod: -1, shop: false, noConsumeOnUse: true, type: "targetspell", sfx: "FireSpell", spell: "Flashbang"}, + "PotionInvisibility" : {name: "PotionInvisibility", potion: true, rarity: 3, costMod: -1, shop: true, type: "spell", spell: "Invisibility", sfx: "PotionDrink"}, + "Ectoplasm" : {name: "Ectoplasm", noHands: true, rarity: 1, shop: false, type: "spell", spell: "LesserInvisibility", sfx: "Invis"}, + "Gunpowder" : {name: "Gunpowder", rarity: 1, shop: true, useQuantity: 1, noConsumeOnUse: true, type: "targetspell", spell: "Gunpowder", sfx: "FireSpell"}, + "EarthRune" : {name: "EarthRune", rarity: 2, costMod: -1, shop: false, type: "spell", spell: "Earthrune", sfx: "HeavySwing"}, + "RopeRune" : {name: "RopeRune", rarity: 2, costMod: -1, shop: false, type: "spell", spell: "EnchantRope", sfx: "HeavySwing"}, + "WaterRune" : {name: "WaterRune", rarity: 2, costMod: -1, shop: false, type: "spell", spell: "WaterRune", sfx: "HeavySwing"}, + "Bola" : {name: "Bola", rarity: 0, costMod: -1, shop: false, useQuantity: 1, noConsumeOnUse: true, type: "targetspell", spell: "PlayerBola"}, + "LeashItem" : {name: "LeashItem", rarity: 2, costMod: -2, shop: true, useQuantity: 0, noConsumeOnUse: true, type: "targetspell", spell: "LeashSpell"}, + "IceRune" : {name: "IceRune", rarity: 2, costMod: -1, shop: false, type: "spell", spell: "Icerune", sfx: "Freeze"}, + "Bomb" : {name: "Bomb", rarity: 1, costMod: -1, shop: false, type: "spell", spell: "BombItem", sfx: "FireSpell"}, + "Dynamite" : {name: "Dynamite", rarity: 2, costMod: -1, shop: false, type: "spell", spell: "DynamiteItem", sfx: "FireSpell"}, + "C4" : {name: "C4", rarity: 3, costMod: -1, shop: false, type: "spell", spell: "C4Item", sfx: "FireSpell"}, + "ElfCrystal" : {name: "ElfCrystal", noHands: true, rarity: 3, costMod: -1, shop: false, type: "spell", spell: "Slippery", sfx: "MagicSlash"}, + "EnchantedGrinder" : {name: "EnchantedGrinder", noHands: true, rarity: 4, shop: true, type: "spell", spell: "Cutting", sfx: "Laser"}, + "MistressKey" : {name: "MistressKey", rarity: 8, costMod: -1, shop: false, type: "goldKey"}, + "AncientPowerSource" : {name: "AncientPowerSource", noHands: true, rarity: 4, costMod: -2, shop: true, type: "charge", amount: 0.250}, + "AncientPowerSourceSpent" : {name: "AncientPowerSourceSpent", noHands: true, rarity: 3, costMod: -3, shop: false, type: "recharge"}, + "ScrollArms" : {name: "ScrollArms", sub: 0.25, noHands: true, rarity: 2, costMod: 1, shop: true, type: "buff", buff: "NoArmsComp", duration: 12, power: 1, aura: "#aaffaa", sfx: "FireSpell"}, + "ScrollVerbal" : {name: "ScrollVerbal", sub: 0.25, noHands: true, rarity: 2, costMod: 1, shop: true, type: "buff", buff: "NoVerbalComp", duration: 12, power: 1, aura: "#aaaaff", sfx: "FireSpell"}, + "ScrollLegs" : {name: "ScrollLegs", sub: 0.25, noHands: true, rarity: 2, costMod: 1, shop: true, type: "buff", buff: "NoLegsComp", duration: 12, power: 1, aura: "#ffaaaa", sfx: "FireSpell"}, + "ScrollPurity" : {name: "ScrollPurity", isSubby: true, sub: 0.20, noHands: true, rarity: 4, shop: true, type: "shrineRemove", shrine: "Vibes", sfx: "FireSpell"}, + + "DollID" : {name: "DollID", rarity: 0, shop: false, type: "dollID", noHands: true, sfx: "FutureLock", noConsumeOnUse: true}, + "KeyCard" : {name: "KeyCard", rarity: 1, shop: false, type: "KeyCard", noHands: true, sfx: "FutureLock", noConsumeOnUse: true}, + "CuffKeys" : {name: "CuffKeys", rarity: 1, sub: 0.25, shop: false, type: "CuffKeys", noConsumeOnUse: true}, + "Pick" : {name: "Pick", sneakChance: 0.15, rarity: 0, sub: 0.25, shop: false, type: "Lockpick", noConsumeOnUse: true}, + "RedKey" : {name: "RedKey", sneakChance: 0.1, rarity: 1, sub: 0.25, shop: false, type: "RedKey", noConsumeOnUse: true}, + "BlueKey" : {name: "BlueKey", rarity: 2, costMod: 2, shop: false, type: "BlueKey", noConsumeOnUse: true}, + "Snuffer" : {name: "Snuffer", rarity: 3, costMod: -1, shop: true, type: "Snuffer", noConsumeOnUse: true}, + "SackOfSacks" : {name: "SackOfSacks", rarity: 3, costMod: -2, shop: true, type: "SackOfSacks", noConsumeOnUse: true}, + "DiscPick" : {name: "DiscPick", rarity: 4, costMod: -1, sub: 0.2, shop: true, type: "DiscPick", noConsumeOnUse: true, uniqueTags: ["pick"]}, + + "UniversalSolvent" : {name: "UniversalSolvent", rarity: 5, + latexsolvent: 10, shop: true, useQuantity: 1, noConsumeOnUse: true, type: "targetspell", spell: "UniversalSolvent", sfx: "PotionDrink"}, + + "DivineTear" : {name: "DivineTear", rarity: 6, sub: 0.05, shop: true, delay: 3, power: 10, noHands: true, duration: 0, sfx: "Cookie", type: "RemoveCurseOrHex", noConsumeOnUse: true}, +}; + +// Separate for organizational purposes +let KDCookies: Record = { + "Cookie" : {name: "Cookie", rarity: 0, shop: true, type: "restore", wp_instant: 1.0, wp_gradual: 0, scaleWithMaxWP: true, needMouth: true, delay: 3, gagMax: 0.59, duration: 0, sfx: "Cookie"}, + "Brownies" : {name: "Brownies", rarity: 1, shop: true, type: "restore", wp_instant: 3.0, wp_gradual: 0, scaleWithMaxWP: true, needMouth: true, delay: 4, gagMax: 0.59, duration: 0, sfx: "Cookie"}, + "Donut" : {name: "Donut", rarity: 0, shop: true, type: "restore", wp_instant: 1.0, wp_gradual: 0, scaleWithMaxWP: true, needMouth: true, delay: 3, gagMax: 0.59, duration: 0, sfx: "Cookie"}, + "CookieJailer" : {name: "CookieJailer", isSubby: true, rarity: 0, shop: true, + type: "restore", wp_instant: 1.5, wp_gradual: 0, scaleWithMaxWP: true, needMouth: true, + delay: 3, gagMax: 0.59, duration: 0, sfx: "Cookie", + sideEffects: ["subAdd"], + data: { + subAdd: 5, + subPower: 0.3, + subPowerVar: 0.5, + subDuration: 100, + }}, +}; +Object.assign(KinkyDungeonConsumables, KDCookies); + +let KDRechargeCost = 100; + +/** Criteria that must be true for an enemy to sell you an item */ +let KDSellCriteria = { + Keyring: (seller: entity) => { + return KDMapData.EscapeMethod == "Key"; + }, +} + +let KinkyDungneonBasic = { + "Key" : {name: "Key", rarity: 0, shop: false}, + "Keyring" : {name: "Key", rarity: 0, shop: false}, + "RedKey" : {name: "RedKey", rarity: 0, shop: true}, + "BlueKey" : {name: "BlueKey", rarity: 2, costMod: 2, shop: true}, + //"4Lockpick" : {name: "4Lockpick", rarity: 1, shop: true}, + "3Bola" : {name: "3Bola", consumable: "Bola", quantity: 3, rarity: 0, shop: true}, + "3Bomb" : {name: "3Bomb", consumable: "Bomb", quantity: 3, rarity: 1, shop: true}, + "2Dynamite" : {name: "2Dynamite", consumable: "Dynamite", quantity: 2, rarity: 2, shop: true}, + "2C4" : {name: "2C4", consumable: "C4", quantity: 2, rarity: 3, shop: true}, + "3Flash" : {name: "3Flash", consumable: "FlashBomb", quantity: 3, rarity: 2, shop: true}, + "3Flashbang" : {name: "3Flashbang", consumable: "Flashbang", quantity: 3, rarity: 3, shop: true}, + "3Smoke" : {name: "3Smoke", consumable: "SmokeBomb", quantity: 3, rarity: 1, shop: true}, + "MaidUniform" : {name: "MaidUniform", outfit: "MaidUniform", rarity: 2, shop: true, ignoreInventory: "Maid", uniqueTags: ["outfit"]}, + "Bast" : {name: "Bast", outfit: "Bast", rarity: 2, shop: true, ignoreInventory: "Bast", uniqueTags: ["outfit"]}, + "Bountyhunter" : {name: "Bountyhunter", outfit: "Bountyhunter", rarity: 2, shop: true, ignoreInventory: "Bountyhunter", uniqueTags: ["outfit"]}, + "Dragon" : {name: "Dragon", outfit: "Dragon", rarity: 2, shop: true, ignoreInventory: "Dragon", uniqueTags: ["outfit"]}, + "BlueSuit" : {name: "BlueSuit", outfit: "BlueSuit", rarity: 2, shop: true, ignoreInventory: "Maid", uniqueTags: ["outfit"]}, + "Elven" : {name: "Elven", outfit: "Elven", rarity: 2, shop: true, ignoreInventory: "Elven", uniqueTags: ["outfit"]}, + "ElementalDress" : {name: "ElementalDress", outfit: "ElementalDress", rarity: 2, shop: true, ignoreInventory: "ElementalDress", uniqueTags: ["outfit"]}, + //"PotionCollar" : {name: "PotionCollar", rarity: 2, shop: true}, +}; + +let KinkyDungneonShopRestraints = { + "SlimeWalkers" : {name: "SlimeWalkers", rarity: 2, shop: true}, + "SarielPanties" : {name: "SarielPanties", rarity: 5, shop: true}, + "ElvenPanties" : {name: "ElvenPanties", rarity: 3, shop: true}, + "DivineBelt" : {name: "DivineBelt", rarity: 5, shop: true, uniqueTags: ["divine"]}, + "DivineBelt2" : {name: "DivineBelt2", rarity: 5, shop: true, uniqueTags: ["divine"]}, + "DivineBra" : {name: "DivineBra", rarity: 5, shop: true, uniqueTags: ["divine"]}, + "DivineBra2" : {name: "DivineBra2", rarity: 5, shop: true, uniqueTags: ["divine"]}, + "DusterGag" : {name: "DusterGag", rarity: 2, shop: true}, + "GasMask" : {name: "GasMask", rarity: 2, shop: true}, + "PotionCollar" : {name: "PotionCollar", rarity: 3, shop: true}, + "Sunglasses" : {name: "Sunglasses", rarity: 2, shop: true, uniqueTags: ["shades"]}, + "Sunglasses2" : {name: "Sunglasses2", rarity: 2, shop: true, uniqueTags: ["shades"]}, +}; + +let KDConsumableEffects: Record void> = { + "Snuffer": (_Consumable, entity) => { + let tiles = KDGetEffectTiles(entity.x, entity.y); + for (let tile of Object.values(tiles)) { + if (tile?.tags?.includes("snuffable")) { + tile.duration = 0; + KDCreateEffectTile(tile.x, tile.y, { + name: tile.name + "Unlit", + duration: 9999, infinite: true, + }, 0); + KinkyDungeonAdvanceTime(1); + return; + } + } + KinkyDungeonSendTextMessage(10, TextGet("KDNotSnuffable"), "#ff5277", 3); + }, + "SackOfSacks": (_Consumable, entity) => { + let tiles = KDGetEffectTiles(entity.x, entity.y); + for (let tile of Object.values(tiles)) { + if (tile?.tags?.includes("unsackable")) { + tile.duration = 0; + KinkyDungeonAdvanceTime(1); + KinkyDungeonSendTextMessage(10, TextGet("KDUnbag"), "#ff5277", 3); + return; + } + if (tile?.tags?.includes("sackable")) { + KDCreateEffectTile(tile.x, tile.y, { + name: "Sack", + duration: 8000, + }, 0); + KinkyDungeonAdvanceTime(1); + return; + } + } + KinkyDungeonSendTextMessage(10, TextGet("KDNotBaggable"), "#ff5277", 3); + }, + "RemoveCurseOrHex": (Consumable, entity) => { + if (!entity?.player) return; + if (KinkyDungeonAllRestraintDynamic().some((r) => {return KDHasRemovableCurse(r.item, Consumable.power) || KDHasRemovableHex(r.item, Consumable.power);})) { + KDGameData.InventoryAction = "RemoveCurseOrHex"; + KDGameData.CurseLevel = Consumable.power; + KDGameData.UsingConsumable = Consumable.name; + KinkyDungeonDrawState = "Inventory"; + KinkyDungeonCurrentFilter = Restraint; + KinkyDungeonSendTextMessage(8, TextGet("KDRemoveCurseOrHex"), "#ff5277", 1, true); + } else { + KinkyDungeonSendTextMessage(8, TextGet("KDRemoveCurseOrHexFail"), "#ff5277", 1, true); + } + }, + "subAdd": (Consumable, entity) => { + if (entity.player) { + let amount = typeof Consumable.data?.subAdd === 'number' ? Consumable.data?.subAdd : 5; + KinkyDungeonChangeRep("Ghost", amount); + } else { + let power = + KinkyDungeonApplyBuffToEntity(entity, {id: Consumable.name, + type: "submissiveness", power: Math.max(0, + (Consumable.data.subPower as number) + (KDRandom() * (Consumable.data.subPowerVar as number)) + ), duration: Consumable.data.subDuration}); + } + + }, + "restore": (Consumable, entity) => { + if (entity.player) { + let multi = 1.0; + if (Consumable.scaleWithMaxSP) { + multi = Math.max(KinkyDungeonStatStaminaMax / KDMaxStatStart); + } + let Manamulti = 1.0; + if (Consumable.scaleWithMaxMP) { + Manamulti = Math.max(KinkyDungeonStatManaMax / KDMaxStatStart); + } + let Willmulti = 1.0; + if (Consumable.scaleWithMaxWP) { + Willmulti = Math.max(KinkyDungeonStatWillMax / KDMaxStatStart); + } + let Distmulti = 1.0; + if (Consumable.scaleWithMaxAP) { + Distmulti = Math.max(KinkyDungeonStatDistractionMax / KDMaxStatStart); + } + let gagFloor = Consumable.gagFloor ? Consumable.gagFloor : 0; + let gagMult = (Consumable.potion && gagFloor != 1.0) ? Math.max(0, gagFloor + (1 - gagFloor) * (1 - Math.max(0, Math.min(1.0, KinkyDungeonGagTotal(true))))) : 1.0; + if (gagMult < 0.999) { + KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonConsumableLessEffective"), "#ff5277", 2); + } + if (Consumable.mp_instant != undefined) { + //let manaAmt = Math.min(KinkyDungeonStatManaMax, KinkyDungeonStatMana + Consumable.mp_instant * Manamulti * gagMult) - KinkyDungeonStatMana; + KDChangeMana(Consumable.name, "restore", "consumable", Consumable.mp_instant * Manamulti * gagMult, false, Consumable.mpool_instant * Manamulti * gagMult, false, true); + } + if (Consumable.wp_instant) KDChangeWill(Consumable.name, "restore", "consumable", Consumable.wp_instant * Willmulti * gagMult); + if (Consumable.sp_instant) KDChangeStamina(Consumable.name, "restore", "consumable", Consumable.sp_instant * multi * gagMult); + if (Consumable.ap_instant) KDChangeDistraction(Consumable.name, "restore", "consumable", Consumable.ap_instant * Distmulti * gagMult, false, Consumable.arousalRatio ? Consumable.arousalRatio : 0); + + KinkyDungeonCalculateMiscastChance(); + if (Consumable.mp_gradual) KinkyDungeonApplyBuffToEntity(entity, {id: "PotionMana", type: "restore_mp", power: Consumable.mp_gradual/Consumable.duration * gagMult * Manamulti, duration: Consumable.duration}); + if (Consumable.wp_gradual) KinkyDungeonApplyBuffToEntity(entity, {id: "PotionWill", type: "restore_wp", power: Consumable.wp_gradual/Consumable.duration * gagMult * Willmulti, duration: Consumable.duration}); + if (Consumable.sp_gradual) KinkyDungeonApplyBuffToEntity(entity, {id: "PotionStamina", type: "restore_sp", power: Consumable.sp_gradual/Consumable.duration * gagMult * multi, duration: Consumable.duration}); + if (Consumable.ap_gradual) KinkyDungeonApplyBuffToEntity(entity, {id: "PotionFrigid", type: "restore_ap", power: Consumable.ap_gradual/Consumable.duration * gagMult * Distmulti, duration: Consumable.duration}); + + } else { + let gagFloor = Consumable.gagFloor ? Consumable.gagFloor : 0; + let gagMult = (Consumable.potion && gagFloor != 1.0) ? Math.max(0, gagFloor + (1 - gagFloor) * (1 - Math.max(0, Math.min(1.0, + KDEnemyCanTalk(entity) ? 0 : 1 + )))) : 1.0; + + if (Consumable.mp_gradual) KinkyDungeonApplyBuffToEntity(entity, {id: "PotionMana", type: "restore_mp", power: Consumable.mp_gradual/Consumable.duration * gagMult, duration: Consumable.duration}); + if (Consumable.wp_gradual) KinkyDungeonApplyBuffToEntity(entity, {id: "PotionWill", type: "restore_wp", power: Consumable.wp_gradual/Consumable.duration * gagMult, duration: Consumable.duration}); + if (Consumable.sp_gradual) KinkyDungeonApplyBuffToEntity(entity, {id: "PotionStamina", type: "restore_sp", power: Consumable.sp_gradual/Consumable.duration * gagMult, duration: Consumable.duration}); + if (Consumable.ap_gradual) KinkyDungeonApplyBuffToEntity(entity, {id: "PotionFrigid", type: "restore_ap", power: Consumable.ap_gradual/Consumable.duration * gagMult, duration: Consumable.duration}); + + } + + + }, +}; + +let KDConsumablePrereq: Record boolean> = { + +}; diff --git a/Game/src/item/KinkyDungeonInventory.ts b/Game/src/item/KinkyDungeonInventory.ts new file mode 100644 index 000000000..ad09c7782 --- /dev/null +++ b/Game/src/item/KinkyDungeonInventory.ts @@ -0,0 +1,3796 @@ +"use strict"; + + +let KDPreventAccidentalClickTime = 0; +let KDInventoryActionSpacing = 76; +let KDInventoryActionPerRow = 6; + + +let KinkyDungeonFilters = [ + Consumable, + Restraint, + Weapon, + Outfit, + LooseRestraint, + Armor, +]; + +let KDInventoryActionsDefault: Record string[]> = { + restraint: (item) => { + let ret: string[] = []; + ret.push("Favorite"); + if (!KDGetCurse(item)) { + ret.push("Struggle"); + if (KinkyDungeonGetAffinity(false, "Sharp", KDRestraint(item)?.Group)) { + ret.push("Cut"); + } + if (item.lock) { + ret.push("Unlock", "Pick"); + } else if (KinkyDungeonIsLockable(KDRestraint(item))) { + ret.push("Remove"); + ret.push("Lock"); + } + } else { + ret.push("CurseInfo", "CurseStruggle"); + if (KinkyDungeonCurseAvailable(item, KDGetCurse(item))) ret.push("CurseUnlock"); + } + ret.push("Recolor"); + return ret; + }, + looserestraint: (_item) => { + let ret: string[] = []; + ret.push("Favorite"); + ret.push("Equip"); + ret.push("Drop"); + ret.push("Hotbar"); + ret.push("Disassemble"); + ret.push("Recolor"); + + return ret; + }, + weapon: (_item) => { + let ret: string[] = []; + ret.push("Equip"); + ret.push("Favorite"); + ret.push("Drop"); + ret.push("QuickSlot1"); + ret.push("QuickSlot2"); + ret.push("QuickSlot3"); + ret.push("QuickSlot4"); + if (KDGameData.Offhand == _item.name) + ret.push("RemoveOffhand"); + else if (KDGameData.InventoryAction != "Offhand") + ret.push("Offhand"); + ret.push("Hotbar"); + return ret; + }, + consumable: (_item) => { + let ret: string[] = []; + ret.push("Use"); + ret.push("Favorite"); + ret.push("Drop"); + ret.push("Hotbar"); + return ret; + }, + outfit: (_item) => { + let ret: string[] = []; + ret.push("Equip"); + ret.push("Favorite"); + ret.push("Drop"); + return ret; + }, +}; + +let KDConfigHotbar = false; +let KDConfigRestraintColor = false; + +let KDWeaponTags = { + "magic" : true, + "light" : true, + "bow" : true, + "noHands": true, + "clumsy": true, + "offhand": true, + "shield": true, + "heavy": true, + "massive": true, + "illum": true, +}; + +let KDInvFilter = ""; + +let KDFilterTransform = { + 'armor': 'looserestraint', +}; + +let KinkyDungeonRestraintVariants: Record = {}; + +let KinkyDungeonWeaponVariants: Record = {}; + +let KinkyDungeonConsumableVariants: Record = {}; + + +/** + * @param item + */ +function KDGetRestraintVariant(item: item): KDRestraintVariant { + // @ts-ignore + return KinkyDungeonRestraintVariants[item.inventoryVariant || item.inventoryAs || item.name]; +} +/** + * @param item + */ +function KDGetConsumableVariant(item: item): KDConsumableVariant { + // @ts-ignore + return KinkyDungeonConsumableVariants[item.inventoryVariant || item.inventoryAs || item.name]; +} +/** + * @param item + */ +function KDGetWeaponVariant(item: item): KDWeaponVariant { + // @ts-ignore + return KinkyDungeonWeaponVariants[item.inventoryVariant || item.inventoryAs || item.name]; +} + +let KDInventoryUseIconConfig: Record = {}; +KDInventoryUseIconConfig[Weapon] = true; +KDInventoryUseIconConfig[Consumable] = true; +KDInventoryUseIconConfig[LooseRestraint] = true; +KDInventoryUseIconConfig[Restraint] = true; +KDInventoryUseIconConfig[Armor] = true; +KDInventoryUseIconConfig.All = true; + + +/** Index of current filters for each filter type */ +let KDFilterIndex: Record = {}; +let KDMaxFilters = 14; + +/** List of current filters for each filter type */ +let KDFilterFilters: Record> = {}; +KDFilterFilters[LooseRestraint] = { + Special: false, + Mundane: false, + QuickBind: false, + Rope: false, + Leather: false, + Metal: false, + Latex: false, + Tape: false, + Toys: false, + Wrapping: false, + Ties: false, + Belts: false, + Cuffs: false, + Collars: false, + Gags: false, + Boots: false, + + Chains: false, + Mittens: false, + Harnesses: false, + Corsets: false, + ChastityBelts: false, + ChastityBras: false, + Armbinders: false, + Boxbinders: false, + Straitjackets: false, + Legbinders: false, + Cyber: false, + Devices: false, + Disassemble: false, + Raw: false, +}; +KDFilterFilters[Armor] = { + Enchanted: false, + Mundane: false, + Light: false, + Heavy: false, + Mage: false, + Accessory: false, + + Head: false, + Chest: false, + + Arms: false, + Gloves: false, + + Torso: false, + Panties: false, + + Legs: false, + Boots: false, +}; +KDFilterFilters[Restraint] = { + Special: false, + Mundane: false, + Armor: false, + Restraint: false, + Ancient: false, + Cursed: false, + + Rope: false, + Leather: false, + Metal: false, + Latex: false, + Locked: false, + Unlocked: false, + + Blocked: false, + Unblocked: false, +}; +KDFilterFilters[Weapon] = { + Mundane: false, + Magic: false, + Shield: false, + Ranged: false, + Melee: false, + Ability: false, + Physical: false, + Magical: false, + Light: false, + Heavy: false, + /*Sword: false, + Spear: false, + Hammer: false, + Axe: false, + Mace: false,*/ + Staff: false, + Toy: false, + Bondage: false, + Tease: false, +}; + + +let KDSpecialFilters: Record boolean>> = { + looserestraint: { + Special: (item, handle) => { + if (handle) KDFilterFilters[LooseRestraint].Mundane = false; + return KDRestraintSpecial(item); + }, + Mundane: (item, handle) => { + if (handle) KDFilterFilters[LooseRestraint].Special = false; + return !(KDRestraintSpecial(item)); + }, + Disassemble: (item, _handle) => { + return KDRestraint(item)?.disassembleAs != undefined; + }, + QuickBind: (item, _handle) => { + return KDRestraint(item)?.quickBindCondition != undefined; + }, + }, + armor: { + Enchanted: (item, handle) => { + if (handle) KDFilterFilters[Armor].Mundane = false; + return KinkyDungeonRestraintVariants[item.inventoryVariant || item.name] != undefined; + }, + Mundane: (item, handle) => { + if (handle) KDFilterFilters[Armor].Enchanted = false; + return !KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]; + }, + + Head: (item, _handle) => { + return KDRestraint(item)?.Group == "ItemHead" || KDRestraint(item)?.Group == "ItemMouth" || KDRestraint(item)?.Group == "ItemNeck"; + }, + Neck: (item, _handle) => { + return KDRestraint(item)?.Group == "ItemNeck"; + }, + Chest: (item, _handle) => { + return KDRestraint(item)?.Group == "ItemBreast"; + }, + Arms: (item, _handle) => { + return KDRestraint(item)?.Group == "ItemArms"; + }, + Gloves: (item, _handle) => { + return KDRestraint(item)?.Group == "ItemHands"; + }, + Torso: (item, _handle) => { + return KDRestraint(item)?.Group == "ItemTorso"; + }, + Panties: (item, _handle) => { + return KDRestraint(item)?.Group == "ItemPelvis"; + }, + Legs: (item, _handle) => { + return KDRestraint(item)?.Group == "ItemLegs"; + }, + Ankles: (item, _handle) => { + return KDRestraint(item)?.Group == "ItemFeet"; + }, + Boots: (item, _handle) => { + return KDRestraint(item)?.Group == "ItemBoots"; + }, + }, + weapon: { + Mundane: (item, handle) => { + if (handle) KDFilterFilters[Weapon].Magic = false; + return !KDWeapon(item)?.magic && !KinkyDungeonWeaponVariants[item.inventoryVariant || item.name]; + }, + Magic: (item, handle) => { + if (handle) KDFilterFilters[Weapon].Mundane = false; + return KDWeapon(item)?.magic || KinkyDungeonWeaponVariants[item.inventoryVariant || item.name] != undefined; + }, + Divine: (item, _handle) => { + return KDWeapon(item)?.tags?.includes("divine"); + }, + Ranged: (item, handle) => { + if (handle) KDFilterFilters[Weapon].Melee = false; + return KDWeapon(item)?.tags?.includes("ranged"); + }, + Melee: (item, handle) => { + if (handle) KDFilterFilters[Weapon].Ranged = false; + return !KDWeapon(item)?.tags?.includes("ranged"); + }, + Ability: (item, _handle) => { + return KDWeapon(item)?.special != undefined; + }, + Physical: (item, handle) => { + if (handle) KDFilterFilters[Weapon].Magical = false; + return KinkyDungeonMeleeDamageTypes.includes(KDWeapon(item)?.type); + }, + Magical: (item, handle) => { + if (handle) KDFilterFilters[Weapon].Physical = false; + return !KinkyDungeonMeleeDamageTypes.includes(KDWeapon(item)?.type); + }, + Light: (item, handle) => { + if (handle) KDFilterFilters[Weapon].Heavy = false; + return KDWeapon(item)?.light; + }, + Heavy: (item, handle) => { + if (handle) KDFilterFilters[Weapon].Light = false; + return KDWeapon(item)?.heavy || KDWeapon(item)?.clumsy || KDWeapon(item)?.massive; + }, + Toy: (item, _handle) => { + return KDWeapon(item)?.tags?.includes("toy"); + }, + Bondage: (item, _handle) => { + return KDWeapon(item)?.tags?.includes("bondage"); + }, + Utility: (item, _handle) => { + return KDWeapon(item)?.tags?.includes("utility"); + }, + Staff: (item, _handle) => { + return KDWeapon(item)?.tags?.includes("staff"); + }, + Shield: (item, _handle) => { + return KDWeapon(item)?.tags?.includes("shield"); + }, + Tease: (item, _handle) => { + return KinkyDungeonTeaseDamageTypes.includes(KDWeapon(item)?.type) || KDWeapon(item)?.tease; + }, + }, + restraint: { + Special: (item, handle) => { + if (handle) KDFilterFilters[Restraint].Mundane = false; + return (KDRestraint(item)?.armor && KinkyDungeonRestraintVariants[item.inventoryVariant || item.name] != undefined) + || (!KDRestraint(item)?.armor && (KDRestraintSpecial(item))); + }, + Enchanted: (item, handle) => { + if (handle) KDFilterFilters[Restraint].Mundane = false; + return (KDRestraint(item)?.armor && KinkyDungeonRestraintVariants[item.inventoryVariant || item.name] != undefined); + }, + Good: (item, _handle) => { + return (KDRestraint(item)?.good); + }, + Mundane: (item, handle) => { + if (handle) KDFilterFilters[Restraint].Special = false; + return !( + (KDRestraint(item)?.armor && KinkyDungeonRestraintVariants[item.inventoryVariant || item.name] != undefined) + || (!KDRestraint(item)?.armor && (KDRestraintSpecial(item))) + ); + }, + Armor: (item, handle) => { + if (handle) KDFilterFilters[Restraint].Restraint = false; + return KDRestraint(item)?.armor; + }, + Locked: (item, handle) => { + if (handle) KDFilterFilters[Restraint].Unlocked = false; + return !(!item.lock); + }, + Unlocked: (item, handle) => { + if (handle) KDFilterFilters[Restraint].Locked = false; + return !item.lock; + }, + Blocked: (item, handle) => { + if (handle) KDFilterFilters[Restraint].Unblocked = false; + return KDGroupBlocked(KDRestraint(item)?.Group) || !KDDynamicLinkListSurface(item).includes(item); + }, + Unblocked: (item, handle) => { + if (handle) KDFilterFilters[Restraint].Blocked = false; + return !(KDGroupBlocked(KDRestraint(item)?.Group) || !KDDynamicLinkListSurface(item).includes(item)); + }, + Restraint: (item, handle) => { + if (handle) KDFilterFilters[Restraint].Armor = false; + return !KDRestraint(item)?.armor; + }, + Cursed: (item, _handle) => { + return KDGetCurse(item) != undefined; + }, + }, +}; + +let KinkyDungeonCurrentFilter = KinkyDungeonFilters[0]; +let KinkyDungeonCurrentPageInventory = 0; + +let KinkyDungeonShowInventory = false; +let KinkyDungeonInventoryOffset = 0; +let KinkyDungeonContainerOffset = 0; + +let KDConfirmOverInventoryAction = false; + +function KDCloseQuickInv() { + KinkyDungeonShowInventory = false; + for (let invStat of Object.keys(KDInventoryStatus)) { + KDInventoryStatus[invStat] = false; + } + KDSortInventory(KinkyDungeonPlayerEntity); + KDInventoryStatus.HideQuickInv = false; +} + +function KDRestraintSpecial(item: Named): boolean { + return KDRestraint(item)?.enchanted + || KDRestraint(item)?.special + || KDRestraint(item)?.showInQuickInv + || (item as item).showInQuickInv; +} + +let KDWeaponSwitchPref = 0; + +function KDSwitchWeapon(weapon?: string, pref?: number) { + if (typeof KDGameData.PreviousWeapon === 'string' || !KDGameData.PreviousWeapon) KDGameData.PreviousWeapon = []; + //let previousWeapon = weapon || (KDGameData.PreviousWeapon ? KDGameData.PreviousWeapon[0] : null); + + if (weapon && KinkyDungeonInventoryGet(weapon)) KDSendInput("switchWeapon", {weapon: weapon, pref: pref}); + else for (let i = 0; i < KinkyDungeonKeySwitchWeapon.length; i++) { + if (KinkyDungeonKeybindingCurrentKey == KinkyDungeonKeySwitchWeapon[i] && (KDGameData.PreviousWeapon ? KDGameData.PreviousWeapon[i] : null) + && KinkyDungeonInventoryGet(KDGameData.PreviousWeapon[i])) + KDSendInput("switchWeapon", {weapon: KDGameData.PreviousWeapon[i], pref: i}); + } + + //if (KinkyDungeonKeybindingCurrentKey == KinkyDungeonKeySwitchWeapon[0] && KDGameData.PreviousWeapon ? KDGameData.PreviousWeapon[0] : null) + + /*if (KinkyDungeonKeybindingCurrentKey == KinkyDungeonKeySwitchWeapon[1]) KDClickButton("offhandswitch");//previousWeapon = KDGameData.Offhand || KDGameData.OffhandOld; + else if (KinkyDungeonKeybindingCurrentKey == KinkyDungeonKeySwitchWeapon[2]) KDClickButton("offhandswitch2");//previousWeapon = KDGameData.OffhandReturn; + else + if (!previousWeapon || KinkyDungeonInventoryGet(previousWeapon)) + KDSendInput("switchWeapon", {weapon: previousWeapon}); + */ +} + +function KinkyDungeonHandleInventory() { + let xOffset = -125; + //let filter = KinkyDungeonCurrentFilter; + //if (KDFilterTransform[KinkyDungeonCurrentFilter]) filter = KDFilterTransform[KinkyDungeonCurrentFilter]; + + let filteredInventory = KinkyDungeonFilterInventory(KinkyDungeonCurrentFilter, undefined, undefined, undefined, undefined, KDInvFilter); + + + + if (CommonTime() < KDPreventAccidentalClickTime) return false; + + if (KinkyDungeonDrawInventorySelected(filteredInventory[KinkyDungeonCurrentPageInventory], undefined, undefined, xOffset)) { + /*if (filter == Consumable && MouseIn(canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 350, 55)) { + let item = KinkyDungeonFilterInventory(KinkyDungeonCurrentFilter, undefined, undefined, undefined, undefined, KDInvFilter)[KinkyDungeonCurrentPageInventory]; + if (!item || !item.name) return true; + + + KDSendInput("consumable", {item: item.name, quantity: 1}); + //KinkyDungeonAttemptConsumable(item.name, 1); + }*/ + + } + KDConfirmOverInventoryAction = false; + + return true; +} + +function KinkyDungeonInventoryAddWeapon(Name: string) { + if (!KinkyDungeonInventoryGetWeapon(Name) && KinkyDungeonWeapons[Name]) + KinkyDungeonInventoryAdd({name:Name, type:Weapon, events: Object.assign([], KinkyDungeonWeapons[Name].events), id: KinkyDungeonGetItemID()}); +} + +function KinkyDungeonInventoryAddLoose(Name: string, UnlockCurse?: string, faction?: string, quantity: number = 1) { + if (!KinkyDungeonInventoryGetLoose(Name) || UnlockCurse) + KinkyDungeonInventoryAdd({faction: faction, name: Name, type: LooseRestraint, curse: UnlockCurse, + events:KDRestraint(KinkyDungeonGetRestraintByName(Name)).events, quantity: quantity, id: KinkyDungeonGetItemID()}); + else { + KinkyDungeonInventoryGetLoose(Name).quantity += quantity; + } +} + +function KinkyDungeonInventoryAddOutfit(Name: string) { + if (!KinkyDungeonInventoryGetOutfit(Name) && KinkyDungeonOutfitCache.has(Name)) + KinkyDungeonInventoryAdd({name:Name, type:Outfit, id: KinkyDungeonGetItemID()}); +} + +function KDInvAddWeapon(container: KDContainer | null, Name: string) { + if (container) { + container.items[Name] = {name:Name, type:Weapon, events: Object.assign([], + KinkyDungeonWeapons[Name].events), id: KinkyDungeonGetItemID()}; + } else { + if (!KinkyDungeonInventoryGetWeapon(Name) && KinkyDungeonWeapons[Name]) + KinkyDungeonInventoryAdd({name:Name, type:Weapon, events: Object.assign([], KinkyDungeonWeapons[Name].events), id: KinkyDungeonGetItemID()}); + } +} + +function KDInvAddLoose(container: KDContainer | null, Name: string, UnlockCurse?: string, faction?: string, quantity: number = 1) { + if (container) { + if (!container.items[Name]) { + container.items[Name] = {faction: faction, name: Name, type: LooseRestraint, curse: UnlockCurse, + events:KDRestraint(KinkyDungeonGetRestraintByName(Name)).events, quantity: quantity, id: KinkyDungeonGetItemID()}; + } else { + container.items[Name].quantity = (container.items[Name].quantity || 1) + quantity; + } + } else { + if (!KinkyDungeonInventoryGetLoose(Name) || UnlockCurse) + KinkyDungeonInventoryAdd({faction: faction, name: Name, type: LooseRestraint, curse: UnlockCurse, + events:KDRestraint(KinkyDungeonGetRestraintByName(Name)).events, quantity: quantity, id: KinkyDungeonGetItemID()}); + else { + KinkyDungeonInventoryGetLoose(Name).quantity += quantity; + } + } +} + +/** + * @param item + */ +function KDInventoryType(item: item): string {return item.type;} + +function KinkyDungeonFullInventory() { + let ret = []; + for (let m of KinkyDungeonInventory.values()) { + for (let item of m.values()) { + ret.push(item); + } + } + return ret; +} + +function KinkyDungeonInventoryLength() { + let size = 0; + for (let m of KinkyDungeonInventory.values()) { + size += m.size; + } + return size; +} + +/** + * @param item + */ +function KinkyDungeonInventoryAdd(item: item) { + let type = KDInventoryType(item); + if (KinkyDungeonInventory.has(type)) { + KinkyDungeonInventory.get(type).set(item.name, item); + } +} + +/** + * @param item + */ +function KDInvAdd(container: KDContainer | null, item: item) { + if (container) { + container.items[item.name] = item; + } else { + let type = KDInventoryType(item); + if (KinkyDungeonInventory.has(type)) { + KinkyDungeonInventory.get(type).set(item.name, item); + } + } +} + +/** + * @param item + */ +function KinkyDungeonInventoryRemove(item: item) { + if (item) { + let type = KDInventoryType(item); + if (KinkyDungeonInventory.has(type)) { + KinkyDungeonInventory.get(type).delete(item.name); + } + } +} +/** + * Does not remove equipped restraints + * @param item + */ +function KinkyDungeonInventoryRemoveSafe(item: item) { + if (item) { + let type = KDInventoryType(item); + if (type != Restraint && KinkyDungeonInventory.has(type)) { + KinkyDungeonInventory.get(type).delete(item.name); + } + } +} + +/** + * @param Name + */ +function KinkyDungeonInventoryGet(Name: string): item | null { + for (let m of KinkyDungeonInventory.values()) { + if (m.has(Name)) return m.get(Name); + } + return null; +} + +/** + * @param Name + */ +function KinkyDungeonInventoryGetSafe(Name: string): item | null { + for (let m of KinkyDungeonInventory.entries()) { + if (m[0] != Restraint && m[1].has(Name)) return m[1].get(Name); + } + return null; +} + +/** + * @param Name + */ +function KinkyDungeonInventoryGetLoose(Name: string): item | null { + return KinkyDungeonInventory.get(LooseRestraint).get(Name); +} +/** + * @param Name + */ +function KinkyDungeonInventoryGetWorn(Name: string): item | null { + return KinkyDungeonInventory.get(Restraint).get(Name); +} + + + +/** + * @param Name + */ +function KinkyDungeonInventoryGetConsumable(Name: string): item | null { + return KinkyDungeonInventory.get(Consumable).get(Name); +} + +/** + * @param Name + */ +function KinkyDungeonInventoryGetWeapon(Name: string): item | null { + return KinkyDungeonInventory.get(Weapon).get(Name); +} + +/** + * @param Name + */ +function KinkyDungeonInventoryGetOutfit(Name: string): item | null { + return KinkyDungeonInventory.get(Outfit).get(Name); +} + +/** + * Returns list + */ +function KinkyDungeonAllRestraint(): item[] { + return KinkyDungeonInventory.get(Restraint) ? Array.from(KinkyDungeonInventory.get(Restraint).values()) : []; +} +/** + * Returns list + */ +function KDAllInventorySafe(): item[] { + return [ + ...Array.from(KinkyDungeonInventory.get(LooseRestraint).values()), + ...Array.from(KinkyDungeonInventory.get(Consumable).values()), + ...Array.from(KinkyDungeonInventory.get(Weapon).values()), + ]; +} + + +/** + * Returns list of tuples of restraints, including dynamics and their hosts + */ +function KinkyDungeonAllRestraintDynamic(): { item: item, host: item }[] { + let ret = []; + for (let inv of KinkyDungeonAllRestraint()) { + ret.push({item: inv, host: null}); + if (inv.dynamicLink) { + let link = inv.dynamicLink; + let host = inv; + while (link) { + ret.push({item: link, host: host}); + link = link.dynamicLink; + } + } + } + return ret; +} + +/** + * Returns list + */ +function KinkyDungeonAllLooseRestraint(): item[] { + return KinkyDungeonInventory.get(LooseRestraint) ? Array.from(KinkyDungeonInventory.get(LooseRestraint).values()) : []; +} +/** + * Returns list + */ +function KinkyDungeonAllConsumable(): item[] { + return KinkyDungeonInventory.get(Consumable) ? Array.from(KinkyDungeonInventory.get(Consumable).values()) : []; +} +/** + * Returns list + */ +function KinkyDungeonAllOutfit(): item[] { + return KinkyDungeonInventory.get(Outfit) ? Array.from(KinkyDungeonInventory.get(Outfit).values()) : []; +} +/** + * Returns list + */ +function KinkyDungeonAllWeapon(): item[] { + return KinkyDungeonInventory.get(Weapon) ? Array.from(KinkyDungeonInventory.get(Weapon).values()) : []; +} + +/*for (let item of KinkyDungeonInventory.get(LooseRestraint).values()) { + if (item.looserestraint && item.looserestraint.name == Name) return item; +} +return null;*/ + +type itemPreviewEntry = { + name: any; + item: any; + preview: string; + preview2?: string; + previewcolor?: string; + previewcolorbg?: string; + key?: string; +} + +/** + * @param item + */ +function KDGetItemPreview(item: NamedAndTyped): itemPreviewEntry { + let ret: itemPreviewEntry = null; + let Group = ""; + if (item.type == Restraint && KDRestraint(item)?.Group) Group = KDRestraint(item).Group; + else if (item.type == LooseRestraint && KDRestraint(item)?.Group) Group = KDRestraint(item).Group; + if ((item.type == Restraint || item.type == LooseRestraint) && KDRestraint(item)?.AssetGroup) Group = KDRestraint(item).AssetGroup; + if (Group == "ItemMouth2" || Group == "ItemMouth3") Group = "ItemMouth"; + + if (item.type == Restraint && KDRestraint(item)) { + let data = { + power: -1, + color: undefined, + bgcolor: undefined, + RenderedItem: item, + item: item, + }; + KinkyDungeonSendEvent("icon", data); + ret = {name: item.name, item: item, + preview: KDGetRestraintPreviewImage(KDRestraint(item)), + preview2: KDGetGroupPreviewImage(KDRestraint(item)?.Group), + }; + if (data.color) { + ret.previewcolor = data.color; + } + if (data.bgcolor) { + ret.previewcolorbg = data.bgcolor; + } + } + else if (item.type == LooseRestraint && KDRestraint(item)) { + let data = { + power: -1, + color: undefined, + bgcolor: undefined, + RenderedItem: item, + item: item, + }; + KinkyDungeonSendEvent("icon", data); + ret = {name: KDRestraint(item).name, item: item, + preview: KDGetRestraintPreviewImage(KDRestraint(item)), + preview2: KDGetGroupPreviewImage(KDRestraint(item)?.Group), + }; + if (data.color) { + ret.previewcolor = data.color; + } + if (data.bgcolor) { + ret.previewcolorbg = data.bgcolor; + } + } + else if (item.type == Weapon && KDWeapon(item)) { + let data = { + power: -1, + color: undefined, + bgcolor: undefined, + RenderedItem: item, + item: item, + }; + KinkyDungeonSendEvent("icon", data); + ret = {name: KDWeapon(item).name, item: item, preview: KinkyDungeonRootDirectory + `Items/${KDWeapon(item).name}.png`}; + if (data.color) { + ret.previewcolor = data.color; + } + if (data.bgcolor) { + ret.previewcolorbg = data.bgcolor; + } + } + else if (item.type == Consumable && KDConsumable(item)) { + let data = { + power: -1, + color: undefined, + bgcolor: undefined, + RenderedItem: item, + item: item, + }; + KinkyDungeonSendEvent("icon", data); + ret = {name: KDConsumable(item).name, item: item, preview: KinkyDungeonRootDirectory + `Items/${KDConsumable(item).name}.png`}; + if (data.color) { + ret.previewcolor = data.color; + } + if (data.bgcolor) { + ret.previewcolorbg = data.bgcolor; + } + } + else if (item.type == Outfit) ret = {name: KDOutfit(item) ? KDOutfit(item).name : "Prisoner", item: item, preview: KinkyDungeonRootDirectory + `Outfits/${KDOutfit(item).name}.png`}; + else if (item.type == 'basic') ret = {name: item.name, item: item, preview: KinkyDungeonRootDirectory + `ShopBasic/${item.name}.png`}; + //else if (item && item.name) ret.push({name: item.name, item: item, preview: ``}); + return ret; +} + + +/** + * @param Group + */ +function KDGetGroupPreviewImage(Group: string): string { + try { + if (KDTex(KinkyDungeonRootDirectory + `Items/Group/${Group}.png`)?.valid) return KinkyDungeonRootDirectory + `Items/Group/${Group}.png`; + } catch (e) { + console.log(e); + } + + return KinkyDungeonRootDirectory + `Items/Restraint.png`; +} + + +/** + * @param restraint + */ +function KDGetRestraintPreviewImage(restraint: restraint): string { + if (KDModFiles[KinkyDungeonRootDirectory + `Items/Restraint/${restraint.preview || restraint.name}.png`] + || PIXI.Assets.cache.has(KinkyDungeonRootDirectory + `Items/Restraint/${restraint.preview || restraint.name}.png`)) + return KDModFiles[KinkyDungeonRootDirectory + `Items/Restraint/${restraint.preview || restraint.name}.png`] || KinkyDungeonRootDirectory + `Items/Restraint/${restraint.preview || restraint.name}.png`; + for (let tag of restraint.shrine) { + if (KDModFiles[KinkyDungeonRootDirectory + `Items/Restraint/${tag}.png`] + || PIXI.Assets.cache.has(KinkyDungeonRootDirectory + `Items/Restraint/${tag}.png`)) + return KDModFiles[KinkyDungeonRootDirectory + `Items/Restraint/${tag}.png`] || KinkyDungeonRootDirectory + `Items/Restraint/${tag}.png`; + } + + try { + if (KDTex(KinkyDungeonRootDirectory + `Items/Restraint/${restraint.preview || restraint.name}.png`)?.valid) return KinkyDungeonRootDirectory + `Items/Restraint/${restraint.preview || restraint.name}.png`; + } catch (e) { + console.log(e); + } + + try { + for (let tag of restraint.shrine) { + if (KDTex(KinkyDungeonRootDirectory + `Items/Restraint/${tag}.png`)?.valid) return KinkyDungeonRootDirectory + `Items/Restraint/${tag}.png`; + } + } catch (e) { + console.log(e); + } + return KinkyDungeonRootDirectory + `Items/Restraint.png`; + /*return StandalonePatched ? (KDTex(KinkyDungeonRootDirectory + `Items/Restraint/${restraint.name}.png`)?.valid ? KinkyDungeonRootDirectory + `Items/Restraint/${restraint.name}.png` : KinkyDungeonRootDirectory + `Items/Restraint.png`) : + `Assets/Female3DCG/${restraint.Group}/Preview/${restraint.Asset}.png`*/ +} + + +/** + * @param Filter + * @param [enchanted] + * @param [ignoreHidden] + * @param [ignoreFilters] + * @param [click] - this filter will be handled and thus updates the filters + * @param [namefilter] + */ +function KinkyDungeonFilterInventory(Filter: string, enchanted?: boolean, ignoreHidden?: boolean, ignoreFilters?: boolean, click?: string, namefilter?: string, + overrideInventory?: Record, ignoreFilterList: string[] = [] +): itemPreviewEntry[] { + let filter_orig = Filter; + if (KDFilterTransform[Filter]) Filter = KDFilterTransform[Filter]; + + let ret = []; + let values: item[] = overrideInventory ? Object.values(overrideInventory).filter((inv) => { + return Filter == "All" || inv.type == Filter; + }) : + (Filter == "All" ? KDAllInventorySafe().filter((inv) => {return !ignoreFilterList.includes(inv.type);}) + : (Filter == Restraint ? KinkyDungeonAllRestraintDynamic().map((inv) => {return inv.item;}) + : Array.from(KinkyDungeonInventory.get(Filter).values()))); + if (values) { + for (let item of values) { + if (ignoreHidden && KDGameData.HiddenItems && KDGameData.HiddenItems[item.inventoryVariant || item.name]) continue; + + // Special filters here + if (filter_orig == Armor && !KDRestraint(item)?.armor) continue; + if (filter_orig == LooseRestraint && KDRestraint(item)?.armor) continue; + //else if (Filter == Armor && !KDRestraint(item).armor) continue; + + // Configurable filters + if (!ignoreFilters && KDFilterFilters[filter_orig]) { + let filters = []; + for (let filter of Object.entries(KDFilterFilters[filter_orig])) { + if (filter[1]) + filters.push(filter[0]); + } + if (filters.length > 0) { + switch (filter_orig) { + case Armor: + case Restraint: // Fallthrough + case LooseRestraint: { + if (KDRestraint(item) && !filters.every((filter) => { + if (KDSpecialFilters[filter_orig] && KDSpecialFilters[filter_orig][filter]) return KDSpecialFilters[filter_orig][filter](item, filter == click); + return KDRestraint(item).shrine?.includes(filter); + })) continue; + break; + } + case Weapon: { + if (KDWeapon(item) && !filters.every((filter) => { + if (KDSpecialFilters[filter_orig] && KDSpecialFilters[filter_orig][filter]) return KDSpecialFilters[filter_orig][filter](item, filter == click); + return KDWeapon(item)?.tags?.includes(filter); + })) continue; + break; + } + } + } + } + + let preview = KDGetItemPreview(item); + //let pre = (item.type == LooseRestraint || item.type == Restraint) ? "Restraint" : "KinkyDungeonInventoryItem"; + if (preview + && (item.type != LooseRestraint || (!enchanted || KDRestraint(item).enchanted || KDRestraint(item).showInQuickInv || item.showInQuickInv)) + && (!namefilter + || KDGetItemName(preview.item).toLocaleLowerCase().includes(namefilter.toLocaleLowerCase())) + || (item.type == Weapon && TextGet("KinkyDungeonDamageType" + KDWeapon(item)?.type).toLocaleLowerCase().includes(namefilter.toLocaleLowerCase()) + || ((item.type == LooseRestraint || item.type == Restraint) && KDRestraint(item)?.shrine?.some((tag) => { + return tag.toLocaleLowerCase().includes(namefilter.toLocaleLowerCase()); + } + )) + || ((item.type == LooseRestraint || item.type == Restraint) && (item.events || KDRestraint(item)?.events)?.some((e) => { + return TextGet("KinkyDungeonDamageType" + (e.damage || e.kind)).toLocaleLowerCase().includes(namefilter.toLocaleLowerCase()) + || e.damage?.toLocaleLowerCase().includes(namefilter.toLocaleLowerCase()) + || e.kind?.toLocaleLowerCase().includes(namefilter.toLocaleLowerCase()) + || e.original?.toLocaleLowerCase().includes(namefilter.toLocaleLowerCase()); + } + ))) + ) { + if (item.type == Restraint) { + if (item.lock) { + let locktype = KDLocks[item.lock]; + if (locktype) { + let restraint = item; + + let affinity = KDGetRestraintAffinity(restraint, {StruggleType: "Unlock"}); + let struggleGroup = KDRestraint(item)?.Group; + /** + */ + let data: KDStruggleData = { + minSpeed: KDMinEscapeRate, + handBondage: 0, + handsBound: false, + armsBound: false, + query: true, + cutBonus: 0, + restraint: restraint, + struggleType: "Unlock", + struggleGroup: struggleGroup, + escapeChance: 0, + origEscapeChance: 0, + origLimitChance: 0.12, + limitChance: 0, + helpChance: 0, + cutSpeed: 0.25, + affinity: affinity, + noise: 0, + strict: KinkyDungeonStrictness(true, struggleGroup, restraint), + hasAffinity: KinkyDungeonGetAffinity(false, affinity, struggleGroup), + restraintEscapeChance: KDRestraint(restraint).escapeChance.Unlock, + cost: KinkyDungeonStatStaminaCostStruggle, + wcost: KinkyDungeonStatWillCostStruggle, + escapePenalty: -KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StrugglePower"), + willEscapePenalty: KDGetWillPenalty("Unlock"), + canCut: KinkyDungeonWeaponCanCut(false, false), + canCutMagic: KinkyDungeonWeaponCanCut(false, true), + toolBonus: 0.0, + toolMult: 1.0, + buffBonus: 0.0, + failSuffix: "", + buffMult: KinkyDungeonHasWill(0.01, false) ? 1.0 : 0.75, + struggleTime: 1.0, + restriction: KDGameData.Restriction || 0, + speedMult: KinkyDungeonHasHelp() ? 2.0 : 1.0, + escapeSpeed: 0, + maxLimit: 1, + result: "", + lockType: (restraint.lock && KDLocks[restraint.lock]) ? KDLocks[restraint.lock] : null, + + extraLim: 0, + extraLimPenalty: 0, + extraLimThreshold: 0, + }; + + if (locktype.canUnlock(data)) { + preview.key = "UI/restraint_key"; + } else { + preview.key = "UI/restraint_nokey"; + } + } + + } else if (KDGetCurse(item)) { + preview.key = "Locks/" + (KDCurses[KDGetCurse(item)]?.customIcon_hud || "Curse"); + } + } + + ret.push(preview); + } + /*if (item.dynamicLink) { + let link = item.dynamicLink; + for (let I = 0; I < 30; I++) { + preview = KDGetItemPreview(link); + if (preview && (link.type == Restraint) && (!namefilter || TextGet(pre + ("" + preview.name)).toLocaleLowerCase().includes(namefilter.toLocaleLowerCase()))) + ret.push(preview); + if (link.dynamicLink) { + link = link.dynamicLink; + } else I = 1000; + } + }*/ + + } + } + + return ret; +} + +/** + * @param item + * @param [noscroll] + * @param [treatAsHover] + * @param [xOffset] + */ +function KinkyDungeonDrawInventorySelected ( + item: {name: any, item: item, preview: string, preview2?: string, key?: string}, + noscroll?: boolean, + _treatAsHover?: boolean, + xOffset: number = 0 +) +{ + if (!noscroll) { + if (KDToggles.SpellBook) { + KDTextTan = KDTextTanSB; + KDBookText = KDBookTextSB; + KDDraw(kdcanvas, kdpixisprites, "magicBook", + KinkyDungeonRootDirectory + "MagicBookNew.png", xOffset + canvasOffsetX_ui, canvasOffsetY_ui, 640*KinkyDungeonBookScale, 520*KinkyDungeonBookScale, undefined, { + zIndex: 128, + }); + } else { + KDTextTan = KDTextTanNew; + KDBookText = KDBookTextNew; + FillRectKD(kdcanvas, kdpixisprites, "magicBook", { + Left: canvasOffsetX_ui + xOffset + 70, + Top: canvasOffsetY_ui + 90, + Width: 590*KinkyDungeonBookScale - 75, + Height: 450*KinkyDungeonBookScale - 50, + Color: "#161920", + LineWidth: 1, + zIndex: 128, + alpha: 1, + }); + DrawRectKD(kdcanvas, kdpixisprites, "magicBook2", { + Left: canvasOffsetX_ui + xOffset + 70, + Top: canvasOffsetY_ui + 90, + Width: 590*KinkyDungeonBookScale - 75, + Height: 450*KinkyDungeonBookScale - 50, + Color: KDBorderColor, + LineWidth: 1, + zIndex: 128, + alpha: 0.9 + }); + } + + + + + + //DrawImageZoomCanvas(, MainCanvas, 0, 0, 640, 483, canvasOffsetX_ui, canvasOffsetY_ui, 640*KinkyDungeonBookScale, 483*KinkyDungeonBookScale, false); + } + if (!item) return false; + let name = item.name; + let unidentified = KinkyDungeonStatsChoice.get("UnidentifiedWear") && KDIsUnidentified(item.item); + + let prefix = "KinkyDungeonInventoryItem"; + let nameText = KDGetItemName(item.item) + if (item.item.type == Restraint || item.item.type == LooseRestraint) { + prefix = "Restraint"; + } + + + DrawTextFitKD(nameText, xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5, 300, KDBookText, KDTextTan, undefined, undefined, 129); + //let wrapAmount = KDBigLanguages.includes(TranslationLanguage) ? 9 : 22; + let mult = KDGetFontMult(); + let textSplit = KinkyDungeonWordWrap((unidentified && prefix == "Restraint") ? TextGet(`${prefix}${KDRestraint(item.item).name}Desc`) : TextGet(prefix + name + "Desc"), 12*mult, 26*mult).split('\n'); + let textSplit2 = KinkyDungeonWordWrap((unidentified && prefix == "Restraint") ? TextGet(`${prefix}${KDRestraint(item.item).name}Desc2`) : TextGet(prefix + name + "Desc2"), 12*mult, 28*mult).split('\n'); + + let data = { + extraLines: [], + extraLineColor: [], + extraLineColorBG: [], + extraLinesPre: [], + extraLineColorPre: [], + extraLineColorBGPre: [], + SelectedItem: item.item, + item: item.item, + }; + KinkyDungeonSendEvent("inventoryTooltip", data); + + let showpreview = (item.preview);//&& !MouseIn(xOffset + canvasOffsetX_ui, canvasOffsetY_ui, 840, 583) + + + let i = 2; + if (showpreview) { + //DrawPreviewBox(canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35 - 100, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 45, item.preview, "", {Background: "#00000000"}); + //if (!treatAsHover) { + KDDraw(kdcanvas, kdpixisprites, "preview", + item.preview, xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35 - 50, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 40, 100, 100, undefined, { + zIndex: 129, + }, undefined, undefined, undefined, true); + + if (item.item.type == Restraint) { + let lock = item.item.lock; + if (KDGetCurse(item.item)) { + lock = KDCurses[KDGetCurse(item.item)]?.customIcon_hud || "Curse"; + } + let size = 56; + if (lock) { + KDDraw(kdcanvas, kdpixisprites, "preview_lock", + KinkyDungeonRootDirectory + "Locks/" + lock + ".png", xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35 - size/2 + 70, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 40 + (100 - size)/2, 56, 56, undefined, { + zIndex: 129, + }, undefined, undefined, undefined, true); + } + } + /*if (item.preview2) { + let size = 56; + KDDraw(kdcanvas, kdpixisprites, "preview2", + item.preview2, xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35 - size/2 - 20 - size, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 40 + (100 - size)/2, 56, 56, undefined, { + zIndex: 129, + }, undefined, undefined, undefined, true); + }*/ + //} else { + // Draw desc2//} + + if (item.item.type == Restraint || item.item.type == LooseRestraint) { + let restraint = KDRestraint(item.item); + let pp = (restraint.displayPower != undefined ? restraint.displayPower : restraint.power); + pp /= 5; // inflection point between 8 (mythic) and 9 (angelic) should be around 47 power + DrawTextKD(TextGet("KinkyDungeonRestraintLevel").replace("RestraintLevel", "" + Math.max(1, restraint.displayPower != undefined ? restraint.displayPower : restraint.power)).replace("Rarity", TextGet("KinkyDungeonRarity" + Math.max(0, Math.min(Math.floor(pp),10)))), + xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 408, KDBookText, KDTextTan, 22, undefined, 130); + DrawTextKD( + restraint.escapeChance ? (item.item.lock ? (TextGet("KinkyLocked") + " " + TextGet("Kinky" + item.item.lock + "LockType")) : + (restraint.DefaultLock && !restraint.HideDefaultLock ? (TextGet("KinkyLocked") + " " + TextGet("Kinky" + restraint.DefaultLock + "LockType")) : + ((item.item.type == Restraint && KDGetCurse(item.item)) ? TextGet("KinkyCursed") : TextGet("KinkyUnlocked")))) + : (restraint.escapeChance.Pick != null ? TextGet("KinkyLockable") : TextGet("KinkyNonLockable")), + xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 375, KDBookText, KDTextTan, 30, undefined, 130); + + let goddesses = ""; + if (restraint.shrine) + for (let shrine of restraint.shrine) { + if (KinkyDungeonGoddessRep[shrine] != undefined) { + if (goddesses) { + goddesses = goddesses + ", "; + } + goddesses = goddesses + TextGet("KinkyDungeonShrine" + shrine); + } + } + if (goddesses) + DrawTextFitKD(TextGet("KDGoddess") + goddesses, xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 435, 300, KDBookText, KDTextTan, 22, undefined, 130); + } else if (item.item.type == Consumable) { + let consumable = KDConsumable(item.item); + DrawTextKD(TextGet("KinkyDungeonConsumableQuantity") + item.item.quantity, xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 375, KDBookText, KDTextTan, 30, undefined, 130); + DrawTextKD(TextGet("KinkyDungeonRarity") + TextGet("KinkyDungeonRarity" + consumable.rarity), xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 410, KDBookText, KDTextTan, 22, undefined, 130); + } else if (item.item.type == Weapon) { + let weapon = KDWeapon(item.item); + let magic = KDWeaponIsMagic(item.item); + let tags = []; + if (magic) { + tags.push("magic"); + //DrawTextKD(TextGet("KDMagicWeapon"), xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 24, "#000000", "#8888ff", 18, undefined, 129); + } + if (weapon?.noHands) { + tags.push("noHands"); + } + if (weapon?.light) { + tags.push("light"); + } + if (weapon?.clumsy) { + tags.push("clumsy"); + } + if (weapon?.heavy) { + tags.push("heavy"); + } + if (weapon?.massive) { + tags.push("massive"); + } + if (weapon?.events) { + if (weapon.events.some((e) => {return e.offhand;})) { + tags.push("offhand"); + } + + //DrawTextKD(TextGet("KDMagicWeapon"), xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 24, "#000000", "#8888ff", 18, undefined, 129); + } + + if (weapon?.stamPenType) { + tags.push("stamPenType_" + weapon.stamPenType); + } + if (weapon.tags) { + for (let t of weapon.tags) { + if (KDWeaponTags[t]) { + tags.push(t); + } + } + } + + let st = TextGet("KinkyDungeonDamageType" + weapon.type); + if (tags.length > 0) { + for (let t of tags) { + if (st) { + st = st + ', '; + } + st = st + (TextGet("KDWeaponTag_" + t)); + } + } + DrawTextFitKD(st, xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 24, 300, KDBookText, KDTextTan, 18, undefined, 129); + + // Draw tag icons + let spritesize = 46; + + if (tags.length > 6) { + spritesize *= 6/tags.length; + } + let spritesize2 = spritesize + 4; + for (let tagi = -1; tagi < tags.length; tagi++) { + if (tagi == -1) { + // draw the weapon damage type icon + KDDraw(kdcanvas, kdpixisprites, "wt_" + tagi, + KinkyDungeonRootDirectory + `Buffs/dmg${weapon.type}.png`, + canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/3.35 - spritesize2/2 * (tags.length - 1) + spritesize2*tagi, + canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 46 - spritesize + 133, + spritesize, spritesize, + undefined, { + zIndex: 130, + }); + } else { + // Draw the tag + KDDraw(kdcanvas, kdpixisprites, "wt_" + tagi, + KinkyDungeonRootDirectory + `Buffs/weaponTag/${tags[tagi]}.png`, + canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/3.35 - spritesize2/2 * (tags.length - 1) + spritesize2*tagi, + canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 46 - spritesize + 133, + spritesize, spritesize, + undefined, { + zIndex: 130, + }); + if (MouseIn( + canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/3.35 - spritesize2/2 * (tags.length - 1) + spritesize2*tagi, + canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 46 - spritesize + 133, + spritesize, spritesize, + )) { + mult = KDGetFontMult(); + textSplit = KinkyDungeonWordWrap(TextGet("KDWeaponTagD_" + tags[tagi]), 13*1.3*mult, 30*1.3*mult).split('\n'); + } + } + } + + + let bindEff = weapon.bindEff || (KinkyDungeonBindingDamageTypes.includes(weapon.type) ? 1 : 0); + let bind = weapon.bind; + let off = (bindEff || bind) ? 75 : 0; + let offCost = (weapon.cutBonus) ? 75 : 0; + + DrawTextKD(TextGet("KinkyDungeonWeaponDamage") + Math.round(weapon.damage * 10), xOffset - off + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 350, KDBookText, KDTextTan, 24, undefined, 130); + if (off) DrawTextKD(TextGet("KinkyDungeonWeaponDamageBind") + (bind ? Math.round(bind * 10) : (bindEff ? Math.round(bindEff * 100) + "%" : "")), xOffset + off + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 350, KDBookText, KDTextTan, 24, undefined, 130); + + DrawTextKD(TextGet("KinkyDungeonWeaponCrit") + Math.round((weapon.crit || KDDefaultCrit) * 100) + "%", xOffset - off + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 380, KDBookText, KDTextTan, 24, undefined, 130); + if (off) DrawTextKD(TextGet("KinkyDungeonWeaponBindCrit") + Math.round((weapon.bindcrit || KDDefaultBindCrit) * 100) + "%", xOffset + off + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 380, KDBookText, KDTextTan, 24, undefined, 130); + + DrawTextKD(TextGet("KinkyDungeonWeaponAccuracy") + Math.round(weapon.chance * 100) + "%", xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 410, KDBookText, KDTextTan, 24, undefined, 130); + let cost = -KinkyDungeonStatStaminaCostAttack; + if (weapon.staminacost) cost = weapon.staminacost; + DrawTextKD(TextGet("KinkyDungeonWeaponStamina") + Math.round(10*cost), offCost + xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 440, KDBookText, KDTextTan, 24, undefined, 130); + + if (weapon.cutBonus) + DrawTextKD(TextGet("KinkyDungeonWeaponCutPower").replace("AMNT", Math.round(100*weapon.cutBonus) + ""), + -offCost + xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, + canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 440, KDBookText, KDTextTan, 24, undefined, 130); + + + } + + + for (let N = 0; N < textSplit.length; N++) { + DrawTextFitKD(textSplit[N], + xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 155 + i * 23, 330, KDBookText, KDTextTan, 20, undefined, 130); i++;} + + } else { + for (let N = 0; N < textSplit.length; N++) { + DrawTextFitKD(textSplit[N], + xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale/3.35, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + i * 25, 640*KinkyDungeonBookScale/2.5, KDBookText, KDTextTan, 24, undefined, 130); i++;} + } + i = 0; + for (let N = 0; N < data.extraLinesPre.length; N++) { + DrawTextFitKD(data.extraLinesPre[N], + xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale*(1-1.0/3.35), canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + i * 32, 640*KinkyDungeonBookScale/2.5, data.extraLineColorPre[N], data.extraLineColorBGPre[N], 24, undefined, 130); i++;} + for (let N = 0; N < textSplit2.length; N++) { + DrawTextFitKD(textSplit2[N], + xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale*(1-1.0/3.35), canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + i * 32, 640*KinkyDungeonBookScale/2.5, KDBookText, KDTextTan, 24, undefined, 130); i++;} + if ((unidentified && item.item.type == Restraint) || (!unidentified)) { + for (let N = 0; N < data.extraLines.length; N++) { + DrawTextFitKD(data.extraLines[N], + xOffset + canvasOffsetX_ui + 640*KinkyDungeonBookScale*(1-1.0/3.35), canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + i * 32, 640*KinkyDungeonBookScale/2.5, data.extraLineColor[N], data.extraLineColorBG[N], 24, undefined, 130); i++;} + } + i = 0; + + return true; +} + +let KDInventoryDrawContainerHotkeys = { + Chest: { + up: () => {return KinkyDungeonKey[5]}, + down: () => {return KinkyDungeonKey[7]}, + left: () => {return KinkyDungeonKey[1]}, + right: () => {return KinkyDungeonKey[3]}, + }, +} + +let KinkyDungeonCurrentPageContainer = 0; + +/** + * @param xOffset + * @param yOffset + * @param filteredInventory + * @param filter + * @param CurrentFilter + * @param [itemcallback] + * @param [colorcallback] + * @returns {{selected: KDFilteredInventoryItem, tooltipitem: KDFilteredInventoryItem}} + */ +function KDDrawInventoryContainer ( + xOffset: number, + yOffset: number, + filteredInventory: KDFilteredInventoryItem[], + filter: string, + CurrentFilter: string, + itemcallback?: (item: KDFilteredInventoryItem, x: number, y: number, w: number, h: number, different: boolean) => void, + colorcallback?: (item: KDFilteredInventoryItem) => string, + prefix: string = "", + nosearch?: boolean, +): {selected: KDFilteredInventoryItem, tooltipitem: KDFilteredInventoryItem} +{ + if (prefix) { + if (KinkyDungeonCurrentPageContainer >= filteredInventory.length) KinkyDungeonCurrentPageContainer = 0; + } else { + if (KinkyDungeonCurrentPageInventory >= filteredInventory.length) KinkyDungeonCurrentPageInventory = 0; + } + + + let tooltipitem = null; + + + if (!nosearch) { + DrawTextFitKD( + TextGet("KDInvFilter") + .replace("ITMNS", TextGet("KinkyDungeonCategoryFilter" + CurrentFilter)), + 1460 + xOffset + 350/2, yOffset + 150 - 20, 200, "#ffffff", KDTextGray0, 18, "center"); + let TF = KDTextField(prefix + "InvFilter", 1460 + xOffset, yOffset + 150, 350, 54, "text", "", "45"); + if (TF.Created) { + KDInvFilter = ""; + TF.Element.oninput = (_event: any) => { + KDInvFilter = ElementValue("InvFilter"); + }; + } + } + + + let selected = filteredInventory[ + prefix ? KinkyDungeonCurrentPageContainer + : KinkyDungeonCurrentPageInventory + ]; + if (filteredInventory) { + let useIcons = KDInventoryUseIconConfig[filter]; + let rowsShort = useIcons ? 4 : 1; + let rowsLong = useIcons ? 6 : 2; + let xBonusShort = useIcons ? 2 : 1; + let numRows = rowsLong; + let maxList = useIcons ? 7 : 12; + let b_width = useIcons ? 80 : 200; + let b_height = useIcons ? 80 : 45; + let padding = 4; + let yy = 0; + let xx = -1; + + + if (!KDRenderAlternateInventory(selected, xOffset, yOffset, prefix)) { + KDResetAlternateInventoryRender(); + for (let i = 0; i < numRows*maxList && yy < maxList; i++) { + let xBonus = 0; + if (KDFilterFilters[CurrentFilter] && Object.keys(KDFilterFilters[CurrentFilter]).length/2 > yy + (xx + 1 >= (rowsLong) ? 1 : 0)) { + numRows = rowsShort; + xBonus = xBonusShort; + } else { + numRows = rowsLong; + xBonus = 0; + } + xx = (xx + 1) % (xBonus + numRows); + if (xx == 0) { + if (i > 0) yy++; + xx += xBonus; + } + /** If there are defined filters we use them instead of double stacking */ + + if (yy >= maxList) break; + let index = i + (prefix ? KinkyDungeonContainerOffset : KinkyDungeonInventoryOffset); + if (filteredInventory[index] && filteredInventory[index].item) { + let text = KDGetItemName(filteredInventory[index].item); + let suff = ""; + if (filteredInventory[index].item.quantity) { + suff = " x" + filteredInventory[index].item.quantity; + } + + if (DrawButtonKDExScroll(prefix + "invchoice_" + i, (amount) => { + if (prefix) { + KinkyDungeonContainerOffset = Math.max(0, Math.min(filteredInventory.length + 2 - numRows*3, + (KinkyDungeonContainerOffset) + numRows*Math.sign(amount)*Math.ceil(Math.abs(amount)/b_height/numRows/b_width))); + } else { + KinkyDungeonInventoryOffset = Math.max(0, Math.min(filteredInventory.length + 2 - numRows*3, + (KinkyDungeonInventoryOffset) + numRows*Math.sign(amount)*Math.ceil(Math.abs(amount)/b_height/numRows/b_width))); + } + }, (_bdata) => { + let diff = false; + if (prefix) { + if (KinkyDungeonCurrentPageContainer != index) diff = true; + KinkyDungeonCurrentPageContainer = index; + } else { + if (KinkyDungeonCurrentPageInventory != index) diff = true; + KinkyDungeonCurrentPageInventory = index; + } + + if (itemcallback) itemcallback(filteredInventory[index], + canvasOffsetX_ui + xOffset + xx * b_width + 640*KinkyDungeonBookScale + 135, + yOffset + canvasOffsetY_ui + 50 + b_height * yy, + b_width-padding, b_height-padding, diff + ); + return true; + }, true, canvasOffsetX_ui + xOffset + xx * b_width + 640*KinkyDungeonBookScale + 135, yOffset + canvasOffsetY_ui + 50 + b_height * yy, + b_width-padding, b_height-padding, + useIcons ? ("") : (text + suff), + "#ffffff",//useIcons ? "#ffffff" : index == KinkyDungeonCurrentPageInventory ? "#ffffff" : "#888888", + useIcons ? filteredInventory[index].preview || "" : "", + undefined, undefined, index != + (prefix ? KinkyDungeonCurrentPageContainer : KinkyDungeonCurrentPageInventory), + colorcallback ? colorcallback(filteredInventory[index]) : KDTextGray1, undefined, undefined, { + scaleImage: true, + }) && !tooltipitem) { + tooltipitem = filteredInventory[index]; + } + if (useIcons && filteredInventory[index].preview2) + KDDraw(kdcanvas, kdpixisprites, prefix + "invchoice_2_" + i, + filteredInventory[index].preview2, canvasOffsetX_ui + xOffset + xx * b_width + 640*KinkyDungeonBookScale + 135, yOffset + canvasOffsetY_ui + 50 + b_height * yy, b_width-padding, b_height-padding, + undefined, { + zIndex: 100.1, + alpha: 0.9, + }); + if (filteredInventory[index].previewcolor) { + KDDraw(kdcanvas, kdpixisprites, prefix + "invchoice_halo" + i, + KinkyDungeonRootDirectory + "UI/ItemAura.png", canvasOffsetX_ui + xOffset + xx * b_width + 640*KinkyDungeonBookScale + 135, yOffset + canvasOffsetY_ui + 50 + b_height * yy, b_width-padding, b_height-padding, + undefined, { + zIndex: 100.003, + tint: string2hex(filteredInventory[index].previewcolor), + alpha: 0.9, + }); + } + if (filteredInventory[index].previewcolorbg) { + KDDraw(kdcanvas, kdpixisprites, prefix + "invchoice_halobg" + i, + KinkyDungeonRootDirectory + "UI/ItemAuraBG.png", canvasOffsetX_ui + xOffset + xx * b_width + 640*KinkyDungeonBookScale + 135, yOffset + canvasOffsetY_ui + 50 + b_height * yy, b_width-padding, b_height-padding, + undefined, { + zIndex: 100.002, + tint: string2hex(filteredInventory[index].previewcolorbg), + alpha: 0.8, + }); + } + if (KDGameData.ItemPriority && KDGameData.ItemPriority[filteredInventory[index].item?.name|| filteredInventory[index].item.name] > 0) { + KDDraw(kdcanvas, kdpixisprites, prefix + "invchoice_star" + i, + KinkyDungeonRootDirectory + "UI/Star.png", + canvasOffsetX_ui + xOffset + xx * b_width + 640*KinkyDungeonBookScale + 135, yOffset + canvasOffsetY_ui + 50 + b_height * yy, undefined, undefined, + undefined, { + zIndex: 100.2, + }); + } + if (filteredInventory[index].key) { + KDDraw(kdcanvas, kdpixisprites, prefix + "invchoice_key" + i, + KinkyDungeonRootDirectory + filteredInventory[index].key + ".png", + canvasOffsetX_ui + xOffset + xx * b_width + b_width - 36 + 640*KinkyDungeonBookScale + 135, yOffset + 4 + canvasOffsetY_ui + 50 + b_height * yy, 28, 28, + undefined, { + zIndex: 100.2, + }); + } + if (filteredInventory[index].item.quantity != undefined) { + DrawTextKD("" + filteredInventory[index].item.quantity, canvasOffsetX_ui + xOffset + xx * b_width + 640*KinkyDungeonBookScale + 140, yOffset + canvasOffsetY_ui + 50 + b_height * yy + 18, "#ffffff", undefined, 18, "left"); + } + + if (KDGameData.InventoryAction && KDInventoryAction[KDGameData.InventoryAction]?.itemlabel + && (!KDInventoryAction[KDGameData.InventoryAction].show || KDInventoryAction[KDGameData.InventoryAction].show(KDPlayer(), filteredInventory[index].item)) + && (!KDInventoryAction[KDGameData.InventoryAction].valid || KDInventoryAction[KDGameData.InventoryAction].valid(KDPlayer(), filteredInventory[index].item)) + ) + DrawTextFitKD(KDInventoryAction[KDGameData.InventoryAction].itemlabel(KinkyDungeonPlayerEntity, filteredInventory[index].item), + 36 + canvasOffsetX_ui + xOffset + xx * b_width + 640*KinkyDungeonBookScale + 140, yOffset + canvasOffsetY_ui + 50 + b_height * yy + (useIcons ? 72 : 36) - 9, 72, KDInventoryAction[KDGameData.InventoryAction].itemlabelcolor ? KDInventoryAction[KDGameData.InventoryAction].itemlabelcolor(KinkyDungeonPlayerEntity, filteredInventory[index].item) : "#ffffff", + KDTextGray0, 18, "center"); + } else { + if (i + (prefix ? KinkyDungeonContainerOffset : KinkyDungeonInventoryOffset) > filteredInventory.length + numRows*3) { + if (prefix) { + KinkyDungeonContainerOffset = Math.max(0, filteredInventory.length + numRows*3 - i); + } else { + KinkyDungeonInventoryOffset = Math.max(0, filteredInventory.length + numRows*3 - i); + } + } + //break; + // Instead of breaking, we fill in the missing squares + DrawButtonKDExScroll(prefix + "invchoice_" + i, (amount) => { + if (prefix) { + KinkyDungeonContainerOffset = Math.max(0, Math.min(filteredInventory.length + 2 - numRows*3, + KinkyDungeonContainerOffset + numRows*Math.sign(amount)*Math.ceil(Math.abs(amount)/b_height/numRows/b_width))); + } else { + KinkyDungeonInventoryOffset = Math.max(0, Math.min(filteredInventory.length + 2 - numRows*3, + KinkyDungeonInventoryOffset + numRows*Math.sign(amount)*Math.ceil(Math.abs(amount)/b_height/numRows/b_width))); + } + }, (_bdata) => { + //KinkyDungeonCurrentPageInventory = index; + return true; + }, true, canvasOffsetX_ui + xOffset + xx * b_width + 640*KinkyDungeonBookScale + 135, yOffset + canvasOffsetY_ui + 50 + b_height * yy, b_width-padding, b_height-padding, + "", + "#ffffff", + "", + undefined, undefined, + index != (prefix ? KinkyDungeonCurrentPageContainer : KinkyDungeonCurrentPageInventory), + KDTextGray1, undefined, undefined, { + scaleImage: true, + }); + + + /*FillRectKD(kdcanvas, kdpixisprites, "kdInvEmptySpot" + i, { + Left: canvasOffsetX_ui + xOffset + xx * b_width + 640*KinkyDungeonBookScale + 135, + Top: canvasOffsetY_ui + 50 + b_height * yy, + Width: b_width-padding, + Height: b_height-padding, + Color: KDTextGray1, + LineWidth: 1, + zIndex: 20, + alpha: 0.4, + });*/ + } + } + + + DrawButtonKDEx(prefix + "invScrollUp", (_bdata) => { + if (filteredInventory.length > 0) { + if ((prefix ? KinkyDungeonContainerOffset : KinkyDungeonInventoryOffset) > 0) { + if (prefix) { + KinkyDungeonContainerOffset = Math.max(0, KinkyDungeonContainerOffset - numRows*3); + } else { + KinkyDungeonInventoryOffset = Math.max(0, KinkyDungeonInventoryOffset - numRows*3); + } + } + } + return true; + }, true, + canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale + 526, yOffset + canvasOffsetY_ui, 90, 44, "", KinkyDungeonInventoryOffset > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png", + undefined, undefined, undefined, undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KDInventoryDrawContainerHotkeys[prefix] ? + KDInventoryDrawContainerHotkeys[prefix].up() : KinkyDungeonKey[4]), + hotkeyPress: KDInventoryDrawContainerHotkeys[prefix] ? + KDInventoryDrawContainerHotkeys[prefix].up() : KinkyDungeonKey[4], + }); + DrawButtonKDEx(prefix + "invScrollDown", (_bdata) => { + if (filteredInventory.length > 0) { + if ((prefix ? KinkyDungeonContainerOffset : KinkyDungeonInventoryOffset) + numRows*3 < filteredInventory.length + 2) { + if (prefix) { + KinkyDungeonContainerOffset += numRows*3; + } else { + KinkyDungeonInventoryOffset += numRows*3; + } + } + } + return true; + }, true, + canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale + 526, yOffset + 480*KinkyDungeonBookScale + canvasOffsetY_ui - 4, 90, 44, "", ((prefix ? KinkyDungeonContainerOffset : KinkyDungeonInventoryOffset) + 24 < filteredInventory.length) ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png", + undefined, undefined, undefined, undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KDInventoryDrawContainerHotkeys[prefix] ? + KDInventoryDrawContainerHotkeys[prefix].down() : KinkyDungeonKey[6]), + hotkeyPress: KDInventoryDrawContainerHotkeys[prefix] ? + KDInventoryDrawContainerHotkeys[prefix].down() : KinkyDungeonKey[6], + }); + } + } + if (KDFilterFilters[CurrentFilter] && !KDAlternateInventoryRender()) { + if (KDFilterIndex[CurrentFilter] == undefined) { + KDFilterIndex[CurrentFilter] = 0; + } + let filters = Object.entries(KDFilterFilters[CurrentFilter]); + let activeUp = false; + let activeDown = false; + let index = KDFilterIndex[CurrentFilter]; + for (let i = 0; i < filters.length - index + 2 * KDMaxFilters + 1; i++) { + let xx = 0; + let yy = i - index; + let show = i >= index && i < index + KDMaxFilters && i < filters.length; + if (!show && i < filters.length && KDFilterFilters[CurrentFilter][filters[i][0]]) { + if (i < index) { + activeUp = true; + } else { + activeDown = true; + } + } + let scroll = (amount: number) => { + if (filters.length > KDMaxFilters) + return Math.max(0, + Math.min(Object.keys(KDFilterFilters[CurrentFilter]).length - KDMaxFilters/2, + 3 * Math.sign(amount) + index + ) + ); + return 0; + }; + if (index > 0 && i == index) { + // Draw up button + DrawButtonKDExScroll(prefix + "invchoice_filter_" + i, (amount) => { + KDFilterIndex[CurrentFilter] = scroll(amount); + }, (_bdata) => { + KDFilterIndex[CurrentFilter] = scroll(-1); + return true; + }, true, canvasOffsetX_ui + xOffset + xx * 200 + 640*KinkyDungeonBookScale + 132, yOffset + canvasOffsetY_ui + 50 + 40 * yy, 159, 36, + "", "#ffffff", KinkyDungeonRootDirectory + "Up.png", undefined, undefined, !activeUp, + KDTextGray1, 20, undefined, { + centered: true, + scaleImage: false, + hotkey: KDHotkeyToText(KinkyDungeonKey[0]), + hotkeyPress: KinkyDungeonKey[0], + }); + } else if (filters.length > KDMaxFilters && i == KDMaxFilters + index - 1 && + scroll(1) != scroll(0) // Test for limit + ) { + // Draw down button + DrawButtonKDExScroll(prefix + "invchoice_filter_" + i, (amount) => { + KDFilterIndex[CurrentFilter] = scroll(amount); + }, (_bdata) => { + KDFilterIndex[CurrentFilter] = scroll(1); + return true; + }, true, canvasOffsetX_ui + xOffset + xx * 200 + 640*KinkyDungeonBookScale + 132, yOffset + canvasOffsetY_ui + 50 + 40 * yy, 159, 36, + "", "#ffffff", KinkyDungeonRootDirectory + "Down.png", undefined, undefined, !activeDown, + KDTextGray1, 20, undefined, { + centered: true, + scaleImage: false, + hotkey: KDHotkeyToText(KinkyDungeonKey[2]), + hotkeyPress: KinkyDungeonKey[2], + }); + } else if (i - index < KDMaxFilters && i - index >= 0) { + // Draw filter + DrawButtonKDExScroll(prefix + "invchoice_filter_" + i, (amount) => { + if (filters.length > KDMaxFilters) + KDFilterIndex[CurrentFilter] = Math.max(0, + Math.min(Object.keys(KDFilterFilters[CurrentFilter]).length - KDMaxFilters/2, + 3 * Math.sign(amount) + index + ) + ); + }, (_bdata) => { + if (show) { + KDFilterFilters[CurrentFilter][filters[i][0]] = !KDFilterFilters[CurrentFilter][filters[i][0]]; + if (prefix) { + KinkyDungeonContainerOffset = 0; + } else { + KinkyDungeonInventoryOffset = 0; + } + KinkyDungeonFilterInventory(CurrentFilter, undefined, undefined, undefined, filters[i][0], KDInvFilter); + } + return true; + }, true, canvasOffsetX_ui + xOffset + xx * 200 + 640*KinkyDungeonBookScale + 132, yOffset + canvasOffsetY_ui + 50 + 40 * yy, 159, 36, + show ? TextGet("KDFilterFilters" + filters[i][0]) : "", (show && filters[i][1]) ? "#ffffff" : "#aaaaaa", undefined, undefined, undefined, (!show || !filters[i][1]), + KDTextGray1, 20); + } + + + } + } + return {selected: selected, tooltipitem: tooltipitem}; +} + +function KDDrawInventoryFilters(xOffset, yOffset = 0, filters = [], addFilters = []) { + + let defaultIndex = 0; + //if (KinkyDungeonFilterInventory(KinkyDungeonFilters[0], undefined, undefined, undefined, undefined, KDInvFilter).length == 0) { + // defaultIndex = 1; + //} + + let KDFilters = [...addFilters, ...KinkyDungeonFilters]; + + let selected = ""; + let first = ""; + let II = 0; + for (let I = 0; I < KDFilters.length; I++) { + if (filters.includes(KDFilters[I])) continue; + if (!first) first = KDFilters[I]; + let col = KDTextGray2; + if (KinkyDungeonFilterInventory(KDFilters[I], false, false, true).length > 0) { + col = "#888888"; + } + //if (KDFilters.indexOf(KinkyDungeonCurrentFilter) == I) { + // KinkyDungeonCurrentFilter = KDFilters[defaultIndex]; + // KDPreventAccidentalClickTime = CommonTime() + 1200; + //} + + if (!KDAlternateInventoryRender()) + DrawButtonKDEx("categoryfilter" + I, (_bdata) => { + KinkyDungeonCurrentFilter = KDFilters[I]; + + KinkyDungeonCurrentPageInventory = 0; + KinkyDungeonCurrentPageContainer = 0; + return true; + }, true, canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale - 55, yOffset + canvasOffsetY_ui + 115 + II*65, 180, 60, + TextGet("KinkyDungeonCategoryFilter" + KDFilters[I]), + (KinkyDungeonCurrentFilter == KDFilters[I]) ? "White" : col, "", ""); + + if (KinkyDungeonCurrentFilter == KDFilters[I]) selected = KDFilters[I]; + II++; + } + if (!selected && first) KinkyDungeonCurrentFilter = first; +} + +function KinkyDungeonDrawInventory() { + let xOffset = -125; + KinkyDungeonDrawMessages(true, 550, true, 600); + + + KDDrawInventoryTabs(xOffset, true); + + KDDrawInventoryFilters(xOffset); + let filter = KinkyDungeonCurrentFilter; + if (KDFilterTransform[KinkyDungeonCurrentFilter]) filter = KDFilterTransform[KinkyDungeonCurrentFilter]; + let filteredInventory = KinkyDungeonFilterInventory(KinkyDungeonCurrentFilter, undefined, undefined, undefined, undefined, KDInvFilter); + + + let ss = KDDrawInventoryContainer(xOffset, 0, filteredInventory, filter, KinkyDungeonCurrentFilter); + let selected = ss.selected; + KDDrawHotbarBottom(selected, undefined, undefined, -432, true); + + if (KinkyDungeonDrawInventorySelected(filteredInventory[KinkyDungeonCurrentPageInventory], undefined, undefined, xOffset) && !KDAlternateInventoryRender()) { + + let inventoryActions: string[] = []; + + for (let action of Object.entries(KDInventoryActionsDefault)) { + if (filter == action[0]) { + inventoryActions.push(...action[1](filteredInventory[KinkyDungeonCurrentPageInventory].item)); + } + } + + if (KDGameData.InventoryAction) { + inventoryActions.push(KDGameData.InventoryAction); + if (KDInventoryAction[KDGameData.InventoryAction]?.alsoShow) inventoryActions.push(...KDInventoryAction[KDGameData.InventoryAction].alsoShow); + } + + if (inventoryActions.length > 0) { + let XX = canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale - 2; + let YY = canvasOffsetY_ui + 483*KinkyDungeonBookScale - 5; + let YYTooltip = YY - 30; + let II = 0; + for (let action of inventoryActions) { + if (!KDInventoryAction[action]?.show || KDInventoryAction[action]?.show(KinkyDungeonPlayerEntity, filteredInventory[KinkyDungeonCurrentPageInventory].item)) { + if (KDInventoryAction[action]) { + if (KDInventoryAction[action]?.label + && (!KDInventoryAction[action].show || KDInventoryAction[action].show(KDPlayer(), filteredInventory[KinkyDungeonCurrentPageInventory].item)) + && (!KDInventoryAction[action].valid || KDInventoryAction[action].valid(KDPlayer(), filteredInventory[KinkyDungeonCurrentPageInventory].item)) + ) + DrawTextFitKD(KDInventoryAction[action].label(KinkyDungeonPlayerEntity, filteredInventory[KinkyDungeonCurrentPageInventory].item), + XX + II*KDInventoryActionSpacing + 34, YY + 72 - 9, 72, KDInventoryAction[action].labelcolor ? KDInventoryAction[action].labelcolor(KinkyDungeonPlayerEntity, filteredInventory[KinkyDungeonCurrentPageInventory].item) : "#ffffff", + KDTextGray0, 18, "center"); + if (DrawButtonKDEx("invAction" + action, (_bdata) => { + KDSendInput("inventoryAction", {action: action, player: KinkyDungeonPlayerEntity, item: filteredInventory[KinkyDungeonCurrentPageInventory].item}); + return true; + }, true, XX + II*KDInventoryActionSpacing, YY, 74, 74, "", "", + KinkyDungeonRootDirectory + KDInventoryAction[action].icon(KinkyDungeonPlayerEntity, filteredInventory[KinkyDungeonCurrentPageInventory].item) + ".png", + "", + !KDInventoryAction[action].valid(KinkyDungeonPlayerEntity, filteredInventory[KinkyDungeonCurrentPageInventory].item), + true, KDInventoryAction[action].valid(KinkyDungeonPlayerEntity, filteredInventory[KinkyDungeonCurrentPageInventory].item) ? KDButtonColor : "rgba(255, 50, 50, 0.5)", + undefined, undefined, {centered: true, + hotkey: KDInventoryAction[action].hotkey ? KDInventoryAction[action].hotkey() : undefined, + hotkeyPress: KDInventoryAction[action].hotkeyPress ? KDInventoryAction[action].hotkeyPress() : undefined, + + }, + )) { + DrawTextFitKD(KDInventoryAction[action].text ? + KDInventoryAction[action].text(KinkyDungeonPlayerEntity, filteredInventory[KinkyDungeonCurrentPageInventory].item) + : TextGet("KDInventoryAction" + action), + XX, YYTooltip, KDInventoryActionSpacing*6, "#ffffff", KDTextGray0, 24, "left"); + } + } + + II++; + if (II > KDInventoryActionPerRow) { + II = 0; + YY += KDInventoryActionSpacing; + } + } + + } + } else { + + if (filter == Restraint) { + let item = filteredInventory[KinkyDungeonCurrentPageInventory].item; + let itemIndex = KDGetItemLinkIndex(item, false); + DrawButtonKDEx("struggleItem", (_bdata) => { + if (itemIndex >= 0 && KDCanStruggle(item)) { + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + KDSendInput("struggle", {group: sg.group, index: itemIndex, type: "Struggle"}); + } + return true; + }, itemIndex >= 0 && KDCanStruggle(item), canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 275, 55, TextGet("KinkyDungeonStruggle"), + (itemIndex >= 0 && KDCanRemove(item)) ? "#ffffff" : "#888888", "", ""); + DrawButtonKDEx("removeItem", (_bdata) => { + if (itemIndex >= 0 && KDCanRemove(item)) { + let r = KDRestraint(item); + let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); + KDSendInput("struggle", {group: sg.group, index: itemIndex, type: (item.lock) ? "Unlock" : "Remove"}); + } + return true; + }, itemIndex >= 0 && KDCanRemove(item), canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale + 25, canvasOffsetY_ui + 483*KinkyDungeonBookScale + 60, 275, 55, TextGet("KinkyDungeon" + ((item.lock) ? "Unlock" : "Remove")), + (itemIndex >= 0 && KDCanRemove(item)) ? "#ffffff" : "#888888", "", ""); + + if (KDGameData.InventoryAction) { + DrawButtonKDEx("inventoryAction", (_bdata) => { + KDSendInput("inventoryAction", {player: KinkyDungeonPlayerEntity, item: filteredInventory[KinkyDungeonCurrentPageInventory].item}); + return true; + }, true, canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale + 325, canvasOffsetY_ui + 483*KinkyDungeonBookScale + 60, 275, 55, + KDInventoryAction[KDGameData.InventoryAction] && KDInventoryAction[KDGameData.InventoryAction].text ? KDInventoryAction[KDGameData.InventoryAction].text(KinkyDungeonPlayerEntity, filteredInventory[KinkyDungeonCurrentPageInventory].item) : TextGet("KDInventoryAction" + KDGameData.InventoryAction), + KDInventoryAction[KDGameData.InventoryAction] && KDInventoryAction[KDGameData.InventoryAction].valid(KinkyDungeonPlayerEntity, filteredInventory[KinkyDungeonCurrentPageInventory].item) + ? "#ffffff" : "#888888", + "", "", undefined, undefined, undefined, undefined, undefined, { + hotkey: KDInventoryAction[KDGameData.InventoryAction].hotkey ? KDInventoryAction[KDGameData.InventoryAction].hotkey() : undefined, + hotkeyPress: KDInventoryAction[KDGameData.InventoryAction].hotkeyPress ? KDInventoryAction[KDGameData.InventoryAction].hotkeyPress() : undefined, + }); + } + } + } + + } + if (KinkyDungeonCurrentPageInventory >= filteredInventory.length) KinkyDungeonCurrentPageInventory = Math.max(0, KinkyDungeonCurrentPageInventory - 1); + + if (KinkyDungeonCurrentPageInventory > 0) { + DrawButtonKDEx("invlastpage", (_bdata) => { + if (KinkyDungeonCurrentPageInventory > 0) { + KinkyDungeonCurrentPageInventory -= 1; + return true; + } + return true; + }, true, canvasOffsetX_ui + xOffset + 100 + 50, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 50, TextGet("KinkyDungeonBookLastPage"), "White", "", "", undefined, true, KDButtonColor, + undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKey[1]), + hotkeyPress: KinkyDungeonKey[1], + }); + } + if (KinkyDungeonCurrentPageInventory < filteredInventory.length-1) { + DrawButtonKDEx("invnextpage", (_bdata) => { + if (KinkyDungeonCurrentPageInventory < filteredInventory.length-1) { + KinkyDungeonCurrentPageInventory += 1; + return true; + } + return true; + }, true, canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale - 375, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 50, TextGet("KinkyDungeonBookNextPage"), "White", "", "", undefined, true, KDButtonColor, + undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKey[3]), + hotkeyPress: KinkyDungeonKey[3], + }); + } + +} + +function KinkyDungeonSendInventoryEvent(Event: string, data: any) { + if (!KDMapHasEvent(KDEventMapInventory, Event)) return; + let iteration = 0; + let stack = true; + KDGetItemEventCache(); + if (!KDItemEventCache.get(Event)) return; + while ((stack) && iteration < 100) { + stack = false; + for (let item of KinkyDungeonAllRestraint()) { + if (!KDItemEventCache.get(Event)?.get(KDRestraint(item)?.Group)) continue; + let curse = KDGetCurse(item); + if (item.dynamicLink) + for (let d_item of KDDynamicLinkList(item)) { + let oldEvents = d_item.events; + let d_curse = KDGetCurse(d_item); + if (oldEvents) + for (let e of oldEvents) { + if (e.inheritLinked && e.trigger === Event && (!e.curse || d_curse) && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + if (iteration == (e.delayedOrder ? e.delayedOrder : 0)) { + KinkyDungeonHandleInventoryEvent(Event, e, d_item, data); + } else { + stack = true; + } + + } + } + if (d_curse && KDCurses[d_curse]?.events) { + for (let e of KDCurses[d_curse].events) { + if (e.trigger === Event && (!e.curse || d_curse) && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + if (iteration == (e.delayedOrder ? e.delayedOrder : 0)) { + KinkyDungeonHandleInventoryEvent(Event, e, d_item, data); + } else { + stack = true; + } + } + } + } + } + if (item.events) { + for (let e of item.events) { + if (e.trigger === Event && (!e.curse || curse) && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + if (iteration == (e.delayedOrder ? e.delayedOrder : 0)) { + KinkyDungeonHandleInventoryEvent(Event, e, item, data); + } else { + stack = true; + } + } + } + } + if (curse && KDCurses[curse]?.events) { + for (let e of KDCurses[curse].events) { + if (e.trigger === Event && (!e.curse || curse) && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + if (iteration == (e.delayedOrder ? e.delayedOrder : 0)) { + KinkyDungeonHandleInventoryEvent(Event, e, item, data); + } else { + stack = true; + } + } + } + } + } + iteration += 1; + } +} + + +function KDSendNPCRestraintEvent(Event: string, data: any) { + let iteration = 0; + let stack = true; + KDGetItemEventCache(); + while ((stack) && iteration < 100) { + stack = false; + for (let item of Object.values(data.NPCRestraintEvents as Record)) { + let curse = KDGetCurse(item); + + if (item.events) { + for (let e of item.events) { + if (e.trigger === Event && (!e.curse || curse)) { + if (iteration == (e.delayedOrder ? e.delayedOrder : 0)) { + KinkyDungeonHandleInventoryEvent(Event, e, item, data); + } else { + stack = true; + } + } + } + } + if (curse && KDCurses[curse]?.events) { + for (let e of KDCurses[curse].events) { + if (e.trigger === Event && (!e.curse || curse) && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + if (iteration == (e.delayedOrder ? e.delayedOrder : 0)) { + KinkyDungeonHandleInventoryEvent(Event, e, item, data); + } else { + stack = true; + } + } + } + } + } + iteration += 1; + } +} + +function KinkyDungeonSendInventorySelectedEvent(Event: string, data: any) { + if (!KDMapHasEvent(KDEventMapInventorySelected, Event)) return; + let item = data.SelectedItem; + if (item?.events) { + for (let e of item.events) { + if (e.trigger === Event) { + KinkyDungeonHandleInventorySelectedEvent(Event, e, item, data); + } + } + } +} + +function KinkyDungeonSendInventoryIconEvent(Event: string, data: any) { + if (!KDMapHasEvent(KDEventMapInventoryIcon, Event)) return; + let item = data.RenderedItem; + if (item?.events) { + for (let e of item.events) { + if (e.trigger === Event) { + KinkyDungeonHandleInventoryIconEvent(Event, e, item, data); + } + } + } +} + +let KinkyDungeonInvDraw = []; + +function KinkyDungeonQuickGrid(I: number, Width: number, Height: number, Xcount: number): KDPoint { + let i = 0; + let h = 0; + let v = 0; + while (i < I) { + if (h < Xcount - 1) h++; else { + h = 0; + v++; + } + i++; + } + return {x: Width*h, y: Height*v}; +} + +let KDScrollOffset = { + "Consumable": 0, + "Restraint": 0, + "Weapon": 0, +}; + +let KDItemsPerScreen = { + "Consumable": 24, + "Restraint": 24, + "Weapon": 18, +}; + +let KDNumOfQuickLoadouts = 3; +let KDQuickLoadoutSave = false; + +let KDScrollAmount = 6; +let KDInventoryStatus = { + HideQuickInv: false, + DropQuickInv: false, + SortQuickInv: false, + FilterQuickInv: false, +}; + +function KinkyDungeonDrawQuickInv() { + let H = 80; + let V = 80; + let fC = KinkyDungeonFilterInventory(Consumable, false, !KDInventoryStatus.HideQuickInv, undefined, undefined, KDInvFilter); + let consumables = fC.slice(KDScrollOffset.Consumable, KDScrollOffset.Consumable + KDItemsPerScreen.Consumable); + let fW = KinkyDungeonFilterInventory(Weapon, false, !KDInventoryStatus.HideQuickInv, undefined, undefined, KDInvFilter); + let weapons = fW.slice(KDScrollOffset.Weapon, KDScrollOffset.Weapon + KDItemsPerScreen.Weapon); + let fR = [ + ...KinkyDungeonFilterInventory(LooseRestraint, true, !KDInventoryStatus.HideQuickInv, undefined, undefined, KDInvFilter), + ...KinkyDungeonFilterInventory(Armor, true, !KDInventoryStatus.HideQuickInv, undefined, undefined, KDInvFilter)]; + let restraints = fR.slice(KDScrollOffset.Restraint, KDScrollOffset.Restraint + KDItemsPerScreen.Restraint); + let Wheight = KinkyDungeonQuickGrid(weapons.length-1, H, V, 6).y; + let Rheight = 480; + + DrawTextFitKD( + TextGet("KDInvFilterQ"), + 75 + 340/2, 350 - 20, 200, "#ffffff", KDTextGray0, 18, "center"); + let TF = KDTextField("QInvFilter", 75, 350, 340, 54, "text", "", "45"); + if (TF.Created) { + KDInvFilter = ""; + TF.Element.oninput = (_event: any) => { + KDInvFilter = ElementValue("QInvFilter"); + }; + } + + KDScrollOffset.Consumable = Math.max(0, Math.min(Math.ceil((fC.length - KDItemsPerScreen.Consumable)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Consumable)); + KDScrollOffset.Restraint = Math.max(0, Math.min(Math.ceil((fR.length - KDItemsPerScreen.Restraint)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Restraint)); + KDScrollOffset.Weapon = Math.max(0, Math.min(Math.ceil((fW.length - KDItemsPerScreen.Weapon)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Weapon)); + + if (fC.length > KDItemsPerScreen.Consumable) { + DrawButtonVis(510, 105, 90, 40, "", "white", KinkyDungeonRootDirectory + "Up.png"); + DrawButtonVis(510, 150, 90, 40, "", "white", KinkyDungeonRootDirectory + "Down.png"); + } + if (fW.length > KDItemsPerScreen.Weapon) { + DrawButtonVis(510, 705, 90, 40, "", "white", KinkyDungeonRootDirectory + "Up.png"); + DrawButtonVis(510, 750, 90, 40, "", "white", KinkyDungeonRootDirectory + "Down.png"); + } + if (fR.length > KDItemsPerScreen.Restraint) { + DrawButtonVis(510, 455, 90, 40, "", "white", KinkyDungeonRootDirectory + "Up.png"); + DrawButtonVis(510, 500, 90, 40, "", "white", KinkyDungeonRootDirectory + "Down.png"); + } + + FillRectKD(kdcanvas, kdpixisprites, "quickinvbg", { + Left: 5, + Top: 5, + Width: 490, + Height: 990, + Color: "#000000", + LineWidth: 1, + zIndex: 59, + alpha: 0.9 + }); + + /*DrawButtonKDEx("inventoryfilter", (bdata) => { + if (!KDGameData.HiddenItems) + KDGameData.HiddenItems = {}; + for (let invStat of Object.keys(KDInventoryStatus)) { + if (invStat == "FilterQuickInv") KDInventoryStatus[invStat] = !KDInventoryStatus[invStat]; + else KDInventoryStatus[invStat] = false; + } + return true; + }, true, 510, 465, 120, 60, "", KDButtonColor, KinkyDungeonRootDirectory + "InvFilter.png", undefined, false, !KDInventoryStatus.FilterQuickInv); + */ + if (KinkyDungeonControlsEnabled()) { + DrawButtonKDEx("inventorysort", (_bdata) => { + if (!KDGameData.HiddenItems) + KDGameData.HiddenItems = {}; + for (let invStat of Object.keys(KDInventoryStatus)) { + if (invStat == "SortQuickInv") KDInventoryStatus[invStat] = !KDInventoryStatus[invStat]; + else KDInventoryStatus[invStat] = false; + } + KDSortInventory(KinkyDungeonPlayerEntity); + return true; + }, true, 630, 545, 120, 60, "", KDButtonColor, KinkyDungeonRootDirectory + "InvSort.png", undefined, false, !KDInventoryStatus.SortQuickInv); + + DrawButtonKDEx("inventoryhide", (_bdata) => { + if (!KDGameData.HiddenItems) + KDGameData.HiddenItems = {}; + for (let invStat of Object.keys(KDInventoryStatus)) { + if (invStat == "HideQuickInv") KDInventoryStatus[invStat] = !KDInventoryStatus[invStat]; + else KDInventoryStatus[invStat] = false; + } + KDSortInventory(KinkyDungeonPlayerEntity); + return true; + }, true, 630, 625, 120, 60, "", KDButtonColor, KinkyDungeonRootDirectory + "InvHide.png", undefined, false, !KDInventoryStatus.HideQuickInv); + + DrawButtonKDEx("inventorydrop", (_bdata) => { + for (let invStat of Object.keys(KDInventoryStatus)) { + if (invStat == "DropQuickInv") KDInventoryStatus[invStat] = !KDInventoryStatus[invStat]; + else KDInventoryStatus[invStat] = false; + } + KDSortInventory(KinkyDungeonPlayerEntity); + return true; + }, true, 630, 705, 120, 60, "", KDButtonColor, KinkyDungeonRootDirectory + "InvDrop.png", undefined, false, !KDInventoryStatus.DropQuickInv); + + + // Quick loadouts + let QL_y = 260; + DrawButtonKDEx("quickLoadout_save", (_bdata) => { + KDQuickLoadoutSave = !KDQuickLoadoutSave; + return true; + }, true, 630, QL_y, 120, 60, TextGet("KDQuickLoadoutSave"), "#dddddd", "", undefined, false, !KDQuickLoadoutSave, KDButtonColor); + + if (KDQuickLoadoutSave) { + DrawCheckboxKDEx("QuickLoadout_Weapon", (_bdata) => { + KDGameData.QuickLoadout_Weapon = !KDGameData.QuickLoadout_Weapon; + return true; + }, true, 510, 110, 64, 64, TextGet("KDQuickLoadout_Weapon"), KDGameData.QuickLoadout_Weapon, false, "#ffffff"); + + DrawCheckboxKDEx("QuickLoadout_Merge", (_bdata) => { + KDGameData.QuickLoadout_Merge = !KDGameData.QuickLoadout_Merge; + return true; + }, true, 510, 180, 64, 64, TextGet("KDQuickLoadout_Merge"), KDGameData.QuickLoadout_Merge, false, "#ffffff"); + } + + for (let i = 1; i <= KDNumOfQuickLoadouts; i++) { + DrawButtonKDEx("quickLoadout_num_" + i, (_bdata) => { + if (KDQuickLoadoutSave) { + // Save the loadout + KDGameData.CurrentLoadout = i; + KDQuickLoadoutSave = false; + KDSaveQuickLoadout(i); + } else { + if (KDGameData.CurrentLoadout != i) { + // Load the loadout + KDGameData.CurrentLoadout = i; + KDLoadQuickLoadout(i, true); + } else KDGameData.CurrentLoadout = 0; + } + + return true; + }, true, 630, QL_y + 70 * i, 120, 60, i + "", "#dddddd", "", + undefined, false, KDGameData.CurrentLoadout != i || KDQuickLoadoutSave, KDButtonColor, + undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySwitchLoadout[i]), + }); + if (MouseIn(630, QL_y + 70 * i, 120, 60)) { + for (let ii = 0; ii < 20 && ii < (KDGameData.QuickLoadouts ? (KDGameData.QuickLoadouts[i+""] ? KDGameData.QuickLoadouts[i+""].length : 0) : 0); ii++) { + let item = KDGameData.QuickLoadouts[i+""][ii]; + let str = KDGetItemNameString(item); + DrawTextKD(str, 770, QL_y + ii * 25, KinkyDungeonInventoryGet(item) ? "#ffffff" : "#ff5277", undefined, 22, "left"); + } + } + } + + // Dummy button for BG + DrawButtonKDEx("quickinvbg2_button", (_bdata) => { + return true; + }, true, 620, 250, 140, 520, "", KDButtonColor, undefined, undefined, false, true, + "#000000", undefined, undefined, {zIndex: -1, alpha: 0.9}); + + + } + + for (let c = 0; c < consumables.length; c++) { + let item = consumables[c]; + if (item.preview) { + let point = KinkyDungeonQuickGrid(c, H, V, 6); + if (MouseIn(point.x + 1, 1+ point.y + 30, H-2, V-2)) { + /*FillRectKD(kdcanvas, kdpixisprites, "consumables" + c, { + Left: point.x, + Top: point.y + 30, + Width: H, + Height: V, + Color: KDTextGray3, + LineWidth: 1, + zIndex: 60, + alpha: 0.5 + });*/ + KinkyDungeonDrawInventorySelected(item, false, true); + } + + DrawButtonKDExScroll("consumablesicon" + c, + (amount) => { + if (amount > 0) + KDScrollOffset.Consumable = Math.min(Math.ceil((fC.length - KDItemsPerScreen.Consumable)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Consumable + + Math.ceil(0.5*amount/80) * KDScrollAmount); + else + KDScrollOffset.Consumable = Math.max(0, KDScrollOffset.Consumable - + Math.ceil(0.5*-amount/80) * KDScrollAmount); + }, + (_bdata)=> { + if (!KinkyDungeonControlsEnabled()) return true; + if (KDInventoryStatus.HideQuickInv) { + KDGameData.HiddenItems[item.name] = !KDGameData.HiddenItems[item.name]; + } else if (KDInventoryStatus.DropQuickInv) { + KDSendInput("drop", {item: item.item.name}); + } else if (KDInventoryStatus.SortQuickInv) { + if (MouseIn(point.x + H/2, point.y + 30, H/2, V)) { + // Sort left + if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; + if (KDGameData.ItemPriority[item.item?.name|| item.name] == undefined) KDGameData.ItemPriority[item.item?.name|| item.name] = -1; + else if (KDGameData.ItemPriority[item.item?.name|| item.name] > -9) KDGameData.ItemPriority[item.item?.name|| item.name] -= 1; + } else { + // Sort right + if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; + if (KDGameData.ItemPriority[item.item?.name|| item.name] == undefined) KDGameData.ItemPriority[item.item?.name|| item.name] = 1; + else if (KDGameData.ItemPriority[item.item?.name|| item.name] < 9) KDGameData.ItemPriority[item.item?.name|| item.name] += 1; + } + } else { + KDSendInput("consumable", {item: item.item.name, quantity: 1}); + } + return true; + }, true, + point.x, point.y + 30, 80, 80, + "", "#ffffff", item.preview, undefined, undefined, true, undefined, undefined, undefined, + { + zIndex: 109, + scaleImage: true, + } + ); + /* + KDDraw(kdcanvas, kdpixisprites, "consumablesicon" + c, + item.preview, point.x, point.y + 30, 80, 80, undefined, { + zIndex: 109, + });*/ + + + if (item.previewcolor) { + KDDraw(kdcanvas, kdpixisprites, "coniconhalo" + c, + KinkyDungeonRootDirectory + "UI/ItemAura.png", point.x, point.y + 30, 80, 80, undefined, { + zIndex: 108.5, + tint: string2hex(item.previewcolor), + alpha: 0.9, + }); + } + if (item.previewcolorbg) { + KDDraw(kdcanvas, kdpixisprites, "coniconhalobg" + c, + KinkyDungeonRootDirectory + "UI/ItemAuraBG.png", point.x, point.y + 30, 80, 80, undefined, { + zIndex: 108.4, + tint: string2hex(item.previewcolorbg), + alpha: 0.8, + }); + } + + if ((KDGameData.HiddenItems && KDGameData.HiddenItems[item.name]) || KDInventoryStatus.HideQuickInv) { + KDDraw(kdcanvas, kdpixisprites, "consumablesiconhidden" + c, + KinkyDungeonRootDirectory + ((KDGameData.HiddenItems && KDGameData.HiddenItems[item.name]) ? "InvHidden.png" : "InvVisible.png"), point.x, point.y + 30, 80, 80, undefined, { + zIndex: 110, + }); + } else if (KDInventoryStatus.DropQuickInv) { + KDDraw(kdcanvas, kdpixisprites, "consumablesiconhidden" + c, + KinkyDungeonRootDirectory + "InvItemDrop.png", point.x, point.y + 30, 80, 80, undefined, { + zIndex: 111, + }); + } else if (KDInventoryStatus.SortQuickInv) { + KDDraw(kdcanvas, kdpixisprites, "consumablesiconsort" + c, + KinkyDungeonRootDirectory + "InvItemSort.png", point.x, point.y + 30, 80, 80, undefined, { + zIndex: 111, + }); + DrawTextKD("" + (KDGameData.ItemPriority? KDGameData.ItemPriority[item.item?.name|| item.name] || 0 : 0), point.x + 40, point.y + 30 + 20, "#ffffff", undefined, 30,); + } else if (MouseIn(point.x, point.y + 30, 80, 80) || KDGameData.ItemPriority && KDGameData.ItemPriority[item.item?.name|| item.name] > 0) { + DrawButtonKDEx("consumablesiconfav" + c + (KDGameData.ItemPriority && KDGameData.ItemPriority[item.item?.name|| item.name] ? "b" : "a"), (_bdata) => { + if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; + if (!(KDGameData.ItemPriority[item.item?.name|| item.name] > 9)) KDGameData.ItemPriority[item.item?.name|| item.name] = 10; + else KDGameData.ItemPriority[item.item?.name|| item.name] = 0; + KDSortInventory(KinkyDungeonPlayerEntity); + return true; + },true, point.x + 80 - 32, point.y + 30, 32, 32, "", "#ffffff", KinkyDungeonRootDirectory + + (KDGameData.ItemPriority && KDGameData.ItemPriority[item.item?.name|| item.name] > 0 ? "UI/Star.png" : "UI/StarOff.png"), + "", false, true, undefined, undefined, undefined, { + zIndex: 111, + }); + } + //DrawImageEx(item.preview, point.x, point.y + 30, {Width: 80, Height: 80}); + + DrawTextKD("" + item.item.quantity, point.x, point.y + 30, "#ffffff", undefined, 18, "left"); + } + } + + for (let w = 0; w < weapons.length; w++) { + let item = weapons[w]; + if (item.preview) { + let point = KinkyDungeonQuickGrid(w, H, V, 6); + if (MouseIn(point.x + 1, 1+ 1000 - V - Wheight + point.y, H-2, V-2)) { + /*FillRectKD(kdcanvas, kdpixisprites, "weapons" + w, { + Left: point.x, + Top: 1000 - V - Wheight + point.y, + Width: H, + Height: V, + Color: KDTextGray3, + LineWidth: 1, + zIndex: 60, + alpha: 0.5 + });*/ + KinkyDungeonDrawInventorySelected(item, false, true); + } + + DrawButtonKDExScroll("weaponsicon" + w, + (amount) => { + if (amount > 0) + KDScrollOffset.Weapon = Math.min(Math.ceil((fW.length - KDItemsPerScreen.Weapon)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Weapon + + Math.ceil(0.5*amount/80) * KDScrollAmount); + else + KDScrollOffset.Weapon = Math.max(0, KDScrollOffset.Weapon - + Math.ceil(0.5*-amount/80) * KDScrollAmount); + }, + (_bdata)=> { + if (!KinkyDungeonControlsEnabled()) return true; + if (KDInventoryStatus.HideQuickInv) { + KDGameData.HiddenItems[item.name] = !KDGameData.HiddenItems[item.name]; + } else if (KDInventoryStatus.DropQuickInv && item.name != "Unarmed") { + KDSendInput("drop", {item: item.item.name}); + } else if (KDInventoryStatus.SortQuickInv) { + if (MouseIn(point.x + H/2, 1000 - V - Wheight + point.y, H/2, V)) { + // Sort left + if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; + if (KDGameData.ItemPriority[item.item?.name|| item.name] == undefined) KDGameData.ItemPriority[item.item?.name|| item.name] = -1; + else if (KDGameData.ItemPriority[item.item?.name|| item.name] > -9) KDGameData.ItemPriority[item.item?.name|| item.name] -= 1; + } else { + // Sort right + if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; + if (KDGameData.ItemPriority[item.item?.name|| item.name] == undefined) KDGameData.ItemPriority[item.item?.name|| item.name] = 1; + else if (KDGameData.ItemPriority[item.item?.name|| item.name] < 9) KDGameData.ItemPriority[item.item?.name|| item.name] += 1; + } + } else { + let weapon = item.name != "Unarmed" ? item.item.name : null; + KDSendInput("switchWeapon", {weapon: weapon}); + KDCloseQuickInv(); + } + return true; + }, true, + point.x, 1000 - V - Wheight + point.y, 80, 80, + "", "#ffffff", item.preview, undefined, undefined, true, undefined, undefined, undefined, + { + zIndex: 109, + scaleImage: true, + } + ); + /*KDDraw(kdcanvas, kdpixisprites, "weaponsicon" + w, + item.preview, point.x, 1000 - V - Wheight + point.y, 80, 80, undefined, { + zIndex: 109, + });*/ + + if (item.previewcolor) { + KDDraw(kdcanvas, kdpixisprites, "weaponiconhalo" + w, + KinkyDungeonRootDirectory + "UI/ItemAura.png", point.x, 1000 - V - Wheight + point.y, 80, 80, undefined, { + zIndex: 108.5, + tint: string2hex(item.previewcolor), + alpha: 0.9, + }); + } + if (item.previewcolorbg) { + KDDraw(kdcanvas, kdpixisprites, "weaponiconhalobg" + w, + KinkyDungeonRootDirectory + "UI/ItemAuraBG.png", point.x, 1000 - V - Wheight + point.y, 80, 80, undefined, { + zIndex: 108.4, + tint: string2hex(item.previewcolorbg), + alpha: 0.8, + }); + } + + if ((KDGameData.HiddenItems && KDGameData.HiddenItems[item.name]) || KDInventoryStatus.HideQuickInv) { + KDDraw(kdcanvas, kdpixisprites, "weaponsiconhid" + w, + KinkyDungeonRootDirectory + ((KDGameData.HiddenItems && KDGameData.HiddenItems[item.name]) ? "InvHidden.png" : "InvVisible.png"), point.x, 1000 - V - Wheight + point.y, 80, 80, undefined, { + zIndex: 110, + }); + } else if (KDInventoryStatus.DropQuickInv && item.name != "Unarmed") { + KDDraw(kdcanvas, kdpixisprites, "weaponsiconhid" + w, + KinkyDungeonRootDirectory + "InvItemDrop.png", point.x, 1000 - V - Wheight + point.y, 80, 80, undefined, { + zIndex: 110, + }); + } else if (KDInventoryStatus.SortQuickInv) { + KDDraw(kdcanvas, kdpixisprites, "weaponsiconhid" + w, + KinkyDungeonRootDirectory + "InvItemSort.png", point.x, 1000 - V - Wheight + point.y, 80, 80, undefined, { + zIndex: 110, + }); + DrawTextKD("" + (KDGameData.ItemPriority? KDGameData.ItemPriority[item.item?.name|| item.name] || 0 : 0), point.x + 40, 1000 - V - Wheight + point.y + 20, "#ffffff", undefined, 30,); + } else if (MouseIn(point.x, 1000 - V - Wheight + point.y, 80, 80) || KDGameData.ItemPriority && KDGameData.ItemPriority[item.item?.name|| item.name] > 0) { + DrawButtonKDEx("weaponsiconfavOfffav" + w + (KDGameData.ItemPriority && KDGameData.ItemPriority[item.item?.name|| item.name] ? "b" : "a"), (_bdata) => { + if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; + if (!(KDGameData.ItemPriority[item.item?.name|| item.name] > 9)) KDGameData.ItemPriority[item.item?.name|| item.name] = 10; + else KDGameData.ItemPriority[item.item?.name|| item.name] = 0; + KDSortInventory(KinkyDungeonPlayerEntity); + return true; + },true, point.x + 80 - 32, 1000 - V - Wheight + point.y, 32, 32, "", "#ffffff", KinkyDungeonRootDirectory + + (KDGameData.ItemPriority && KDGameData.ItemPriority[item.item?.name|| item.name] > 0 ? "UI/Star.png" : "UI/StarOff.png"), + "", false, true, undefined, undefined, undefined, { + zIndex: 111, + }); + } + //DrawImageEx(item.preview, point.x, 1000 - V - Wheight + point.y, {Width: 80, Height: 80}); + } + } + + for (let w = 0; w < restraints.length; w++) { + let item = restraints[w]; + if (item.preview) { + let point = KinkyDungeonQuickGrid(w, H, V, 6); + if (MouseIn(point.x +1, 1+ 1000 - V - Rheight + point.y, H - 2, V - 2)) { + /*FillRectKD(kdcanvas, kdpixisprites, "restraints" + w, { + Left: point.x, + Top: 1000 - V - Rheight + point.y, + Width: H, + Height: V, + Color: KDTextGray3, + LineWidth: 1, + zIndex: 60, + alpha: 0.5 + });*/ + KinkyDungeonDrawInventorySelected(item, false, true); + } + DrawButtonKDExScroll("restraintsicon" + w, + (amount) => { + if (amount > 0) + KDScrollOffset.Restraint = Math.min(Math.ceil((fR.length - KDItemsPerScreen.Restraint)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Restraint + + Math.ceil(0.5*amount/80) * KDScrollAmount); + else + KDScrollOffset.Restraint = Math.max(0, KDScrollOffset.Restraint - + Math.ceil(0.5*-amount/80) * KDScrollAmount); + }, + (_bdata)=> { + if (!KinkyDungeonControlsEnabled()) return true; + if (KDInventoryStatus.HideQuickInv) { + KDGameData.HiddenItems[item.item.name] = !KDGameData.HiddenItems[item.item.name]; + } else if (KDInventoryStatus.DropQuickInv) { + KDSendInput("drop", {item: item.item.name}); + } else if (KDInventoryStatus.SortQuickInv) { + if (MouseIn(point.x + H/2, 1000 - V - Rheight + point.y, H/2, V)) { + // Sort left + if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; + if (KDGameData.ItemPriority[item.item.name] == undefined) KDGameData.ItemPriority[item.item.name] = -1; + else if (KDGameData.ItemPriority[item.item.name] > -9) KDGameData.ItemPriority[item.item.name] -= 1; + } else { + // Sort right + if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; + if (KDGameData.ItemPriority[item.item.name] == undefined) KDGameData.ItemPriority[item.item.name] = 1; + else if (KDGameData.ItemPriority[item.item.name] < 9) KDGameData.ItemPriority[item.item.name] += 1; + } + } else { + if (KDToggles.OnlySelfQuickInv || KDRestraint(item.item)?.good || KDRestraint(item.item)?.armor) { + let equipped = false; + let newItem = null; + let currentItem = null; + let linkable = null; + + if (item + && item.item) { + newItem = KDRestraint(item.item); + if (newItem) { + currentItem = KinkyDungeonGetRestraintItem(newItem.Group); + if (!currentItem) equipped = false; + else { + if (KDDebugLink) { + linkable = KDCanAddRestraint(KDRestraint(newItem), true, "", false, currentItem, true, true); + } else { + //linkable = KDCurrentItemLinkable(currentItem, newItem); + linkable = KDCanAddRestraint(KDRestraint(newItem), false, "", false, currentItem, true, true); + + } + if (linkable) { + equipped = false; + } else equipped = true; + } + } + } + if (!equipped && newItem) { + if (KDSendInput("equip", {name: item.item.name, + inventoryVariant: item.item.name != newItem.name ? + item.item.name : undefined, + faction: item.item.faction, + group: newItem.Group, curse: item.item.curse, currentItem: currentItem ? currentItem.name : undefined, events: Object.assign([], item.item.events)})) return true; + } + } else + KDSendInput("quickRestraint", {item: item.item.name, quantity: 1}); + + } + return true; + }, true, + point.x, 1000 - V - Rheight + point.y, 80, 80, + "", "#ffffff", item.preview, undefined, undefined, true, undefined, undefined, undefined, + { + zIndex: 109, + scaleImage: true, + } + ); + if (item.preview2) + KDDraw(kdcanvas, kdpixisprites, "restraintsicon2" + w, + item.preview2, point.x, 1000 - V - Rheight + point.y, 80, 80, + undefined, { + zIndex: 110.1, + alpha: 0.9, + }); + //DrawImageEx(item.preview, point.x, 1000 - V - Rheight + point.y, {Width: 80, Height: 80}); + /*KDDraw(kdcanvas, kdpixisprites, "restraintsicon" + w, + item.preview, point.x, 1000 - V - Rheight + point.y, 80, 80, undefined, { + zIndex: 109, + });*/ + if (item.previewcolor) { + KDDraw(kdcanvas, kdpixisprites, "restraintsiconhalo" + w, + KinkyDungeonRootDirectory + "UI/ItemAura.png", point.x, 1000 - V - Rheight + point.y, 80, 80, undefined, { + zIndex: 108.5, + tint: string2hex(item.previewcolor), + alpha: 0.9, + }); + } + if (item.previewcolorbg) { + KDDraw(kdcanvas, kdpixisprites, "restraintsiconhalobg" + w, + KinkyDungeonRootDirectory + "UI/ItemAuraBG.png", point.x, 1000 - V - Rheight + point.y, 80, 80, undefined, { + zIndex: 108.4, + tint: string2hex(item.previewcolorbg), + alpha: 0.8, + }); + } + if ((KDGameData.HiddenItems && KDGameData.HiddenItems[item.item.name]) || KDInventoryStatus.HideQuickInv) { + KDDraw(kdcanvas, kdpixisprites, "restraintsiconhid" + w, + KinkyDungeonRootDirectory + ((KDGameData.HiddenItems && KDGameData.HiddenItems[item.item.name]) ? "InvHidden.png" : "InvVisible.png"), point.x, 1000 - V - Rheight + point.y, 80, 80, undefined, { + zIndex: 109, + }); + } else if (KDInventoryStatus.DropQuickInv) { + KDDraw(kdcanvas, kdpixisprites, "restraintsiconhid" + w, + KinkyDungeonRootDirectory + "InvItemDrop.png", point.x, 1000 - V - Rheight + point.y, 80, 80, undefined, { + zIndex: 109, + }); + } else if (KDInventoryStatus.SortQuickInv) { + KDDraw(kdcanvas, kdpixisprites, "restraintsiconsort" + w, + KinkyDungeonRootDirectory + "InvItemSort.png", point.x, 1000 - V - Rheight + point.y, 80, 80, undefined, { + zIndex: 109, + }); + DrawTextKD("" + (KDGameData.ItemPriority? KDGameData.ItemPriority[item.item?.name|| item.name] || 0 : 0), point.x + 40, 1000 - V - Rheight + point.y + 20, "#ffffff", undefined, 30,); + } else if (MouseIn(point.x, 1000 - V - Rheight + point.y, 80, 80) || KDGameData.ItemPriority && KDGameData.ItemPriority[item.item?.name|| item.name] > 0) { + DrawButtonKDEx("restraintsiconfav" + w + (KDGameData.ItemPriority && KDGameData.ItemPriority[item.item?.name|| item.name] ? "b" : "a"), (_bdata) => { + if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; + if (!(KDGameData.ItemPriority[item.item?.name|| item.name] > 9)) KDGameData.ItemPriority[item.item?.name|| item.name] = 10; + else KDGameData.ItemPriority[item.item?.name|| item.name] = 0; + KDSortInventory(KinkyDungeonPlayerEntity); + return true; + },true, point.x + 80 - 32, 1000 - V - Rheight + point.y, 32, 32, "", "#ffffff", KinkyDungeonRootDirectory + + (KDGameData.ItemPriority && KDGameData.ItemPriority[item.item?.name|| item.name] > 0 ? "UI/Star.png" : "UI/StarOff.png"), + "", false, true, undefined, undefined, undefined, { + zIndex: 111, + }); + } + DrawTextKD("" + (item.item.quantity || 1), point.x, 1000 - V - Rheight + point.y, "#ffffff", undefined, 18, "left"); + + } + } +} + +function KinkyDungeonhandleQuickInv(NoUse?: boolean): boolean { + + + //let H = 80; + //let V = 80; + let fC = KinkyDungeonFilterInventory(Consumable, false, !KDInventoryStatus.HideQuickInv, undefined, undefined, KDInvFilter); + //let consumables = fC.slice(KDScrollOffset.Consumable, KDScrollOffset.Consumable + KDItemsPerScreen.Consumable); + let fW = KinkyDungeonFilterInventory(Weapon, false, !KDInventoryStatus.HideQuickInv, undefined, undefined, KDInvFilter); + //let weapons = fW.slice(KDScrollOffset.Weapon, KDScrollOffset.Weapon + KDItemsPerScreen.Weapon); + let fR = [ + ...KinkyDungeonFilterInventory(LooseRestraint, true, !KDInventoryStatus.HideQuickInv, undefined, undefined, KDInvFilter), + ...KinkyDungeonFilterInventory(Armor, true, !KDInventoryStatus.HideQuickInv, undefined, undefined, KDInvFilter)]; + //let restraints = fR.slice(KDScrollOffset.Restraint, KDScrollOffset.Restraint + KDItemsPerScreen.Restraint); + //let Wheight = KinkyDungeonQuickGrid(weapons.length-1, H, V, 6).y; + //let Rheight = 480; + + if (fC.length > KDItemsPerScreen.Consumable) { + if (MouseIn(510, 105, 90, 40)) { + KDScrollOffset.Consumable = Math.max(0, KDScrollOffset.Consumable - KDScrollAmount); + return true; + } + if (MouseIn(510, 150, 90, 40)) { + KDScrollOffset.Consumable = Math.min(Math.ceil((fC.length - KDItemsPerScreen.Consumable)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Consumable + KDScrollAmount); + return true; + } + } + if (fW.length > KDItemsPerScreen.Weapon) { + if (MouseIn(510, 705, 90, 40)) { + KDScrollOffset.Weapon = Math.max(0, KDScrollOffset.Weapon - KDScrollAmount); + return true; + } + if (MouseIn(510, 750, 90, 40)) { + KDScrollOffset.Weapon = Math.min(Math.ceil((fW.length - KDItemsPerScreen.Weapon)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Weapon + KDScrollAmount); + return true; + } + } + if (fR.length > KDItemsPerScreen.Restraint) { + if (MouseIn(510, 455, 90, 40)) { + KDScrollOffset.Restraint = Math.max(0, KDScrollOffset.Restraint - KDScrollAmount); + return true; + } + if (MouseIn(510, 500, 90, 40)) { + KDScrollOffset.Restraint = Math.min(Math.ceil((fR.length - KDItemsPerScreen.Restraint)/KDScrollAmount) * KDScrollAmount, KDScrollOffset.Restraint + KDScrollAmount); + return true; + } + } + + if (NoUse) { + return false; + } + if (MouseX > 500) { + KDCloseQuickInv(); + return false; + } + + + return false; +} + +/** + * @param name + * @param [player] + * @param [playerDropped] + */ +function KDDropItemInv(name: string, player?: entity, playerDropped: boolean = true) { + let item = KinkyDungeonInventoryGetLoose(name) || KinkyDungeonInventoryGet(name); + if (!player) player = KinkyDungeonPlayerEntity; + if (item && item.type != Restraint && item.name != KinkyDungeonPlayerWeapon + && KDCanDrop(item)) { // We cant drop equipped items + // Drop one of them + if (item.quantity > 1) { + item.quantity -= 1; + } else KinkyDungeonInventoryRemove(item); + + let dropped = {x:player.x, y:player.y, name: name, amount: 1, playerDropped: playerDropped}; + + KDMapData.GroundItems.push(dropped); + + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Coins.ogg"); + } +} + +/** + * @param player + */ +function KDSortInventory(_player: entity) { + if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; + let m = KinkyDungeonInventory.get(Consumable); + KinkyDungeonInventory.set(Consumable, new Map([...m.entries()].sort((a,b) => ( + KDGameData.ItemPriority[b[1].name] || 0) + - (KDGameData.ItemPriority[a[1].name] || 0) + ))); + m = KinkyDungeonInventory.get(Weapon); + KinkyDungeonInventory.set(Weapon, new Map([...m.entries()].sort((a,b) => ( + KDGameData.ItemPriority[b[1].name] || 0) + - (KDGameData.ItemPriority[a[1].name] || 0) + ))); + m = KinkyDungeonInventory.get(LooseRestraint); + KinkyDungeonInventory.set(LooseRestraint, new Map([...m.entries()].sort((a,b) => ( + KDGameData.ItemPriority[b[1].name] || 0) + - (KDGameData.ItemPriority[a[1].name] || 0) + ))); +} + +function KDLoadQuickLoadout(num: number, clearFirst: boolean) { + if (clearFirst) { + // Remove all armor that can be removed + // TODO + } + let loadout = KDGameData.QuickLoadouts ? KDGameData.QuickLoadouts[num + ""] : undefined; + if (loadout) { + let alreadyEquipped = false; + let refreshedWeapons = false; + for (let item of loadout) { + if (KinkyDungeonInventoryGetWeapon(item)) { + if (!refreshedWeapons) { + KDGameData.PreviousWeapon = []; + refreshedWeapons = true; + } + // Equip weapon + if (!alreadyEquipped) { + alreadyEquipped = true; + if (item != KinkyDungeonPlayerWeapon) + KDSendInput("switchWeapon", {weapon: item}); + } else { + KDGameData.PreviousWeapon.push(item); + } + } else if (KinkyDungeonInventoryGetLoose(item)) { + // Equip armor + let restraintItem = KinkyDungeonInventoryGetLoose(item); + let newItem = restraintItem ? KDRestraint(restraintItem) : undefined; + if (newItem) { + let currentItem = KinkyDungeonGetRestraintItem(newItem.Group); + KDSendInput("equip", { + name: restraintItem.name, + inventoryVariant: item != newItem.name ? + item : undefined, + group: newItem.Group, + curse: restraintItem.curse, + faction: restraintItem.faction, + currentItem: currentItem ? currentItem.name : undefined, + events: Object.assign([], KinkyDungeonInventoryGetLoose(item).events)}); + //events: Object.assign([], restraintItem.events) + } + } + } + } +} + +function KDSaveQuickLoadout(num: number) { + if (!KDGameData.QuickLoadouts) KDGameData.QuickLoadouts = {}; + let currentLoadout = KDGameData.QuickLoadouts[num + ""]; + + let loadout = []; + + if (KDGameData.QuickLoadout_Weapon) { + if (KinkyDungeonPlayerWeapon) { + loadout.push(KinkyDungeonPlayerWeapon); + } + if (KDGameData.PreviousWeapon && typeof KDGameData.PreviousWeapon != 'string') { + loadout.push(...KDGameData.PreviousWeapon); + } + } + + + for (let item of KinkyDungeonAllRestraint()) { + if (KDRestraint(item)?.good || KDRestraint(item)?.armor) { + loadout.push(item.inventoryVariant || item.name); + } + } + + if (KDGameData.QuickLoadout_Merge && currentLoadout) { + for (let item of currentLoadout) { + let rest = KDRestraint({name: item}); + if (rest && !loadout.some((inv) => { + return rest.Group == KDRestraint({name: inv})?.Group; + })) { + loadout.push(item); + } + } + } + + + + KDGameData.QuickLoadouts[num + ""] = loadout; +} + +/** + * @param Name + */ +function KDRemoveInventoryVariant(Name: string, _Prefix: string = "Restraint") { + delete KinkyDungeonRestraintVariants[Name]; +} +/** + * @param Name + */ +function KDRemoveWeaponVariant(Name: string, _Prefix: string = "KinkyDungeonInventoryItem") { + delete KinkyDungeonWeaponVariants[Name]; +} +/** + * @param Name + */ +function KDRemoveConsumableVariant(Name: string, _Prefix: string = "KinkyDungeonInventoryItem") { + delete KinkyDungeonConsumableVariants[Name]; +} + +/** + * @param [worn] + * @param [loose] + * @param [lost] + * @param [ground] + * @param [hotbar] + * @param [entities] + * @param [npcrestraints] + */ +function KDPruneInventoryVariants(worn: boolean = true, loose: boolean = true, lost: boolean = true, ground: boolean = true, hotbar: boolean = true, entities: boolean = true, npcrestraints: boolean = true, containers: boolean = true) { + let entries = Object.entries(KinkyDungeonRestraintVariants); + let entrieswep = Object.entries(KinkyDungeonWeaponVariants); + let entriescon = Object.entries(KinkyDungeonConsumableVariants); + let found = {}; + let identified = KDGameData.IdentifiedObj || {}; + if (worn) { + let list = KinkyDungeonAllRestraintDynamic(); + for (let inv of list) { + if ((inv.item.inventoryVariant && KinkyDungeonRestraintVariants[inv.item.inventoryVariant])) { + found[inv.item.inventoryVariant] = true; + } + } + } + if (loose) { + let list = KinkyDungeonAllLooseRestraint(); + if (list.length < entries.length) { + for (let inv of list) { + if (KinkyDungeonRestraintVariants[inv.name]) { + found[inv.name] = true; + } + } + } else { + for (let type of entries) { + if (KinkyDungeonInventoryGetLoose(type[0])) { + found[type[0]] = true; + } + } + } + + let listwep = KinkyDungeonAllWeapon(); + if (listwep.length < entrieswep.length) { + for (let inv of listwep) { + if (KinkyDungeonWeaponVariants[inv.name]) { + found[inv.name] = true; + } + } + } else { + for (let type of entrieswep) { + if (KinkyDungeonInventoryGetWeapon(type[0])) { + found[type[0]] = true; + } + } + } + let listcon = KinkyDungeonAllConsumable(); + if (listcon.length < entriescon.length) { + for (let inv of listcon) { + if (KinkyDungeonConsumableVariants[inv.name]) { + found[inv.name] = true; + } + } + } else { + for (let type of entriescon) { + if (KinkyDungeonInventoryGetWeapon(type[0])) { + found[type[0]] = true; + } + } + } + } + + if (hotbar) { + if (KinkyDungeonWeaponChoices) { + for (let item of KinkyDungeonWeaponChoices) { + if (KinkyDungeonWeaponVariants[item]) found[item] = true; + } + } + if (KinkyDungeonArmorChoices) { + for (let item of KinkyDungeonArmorChoices) { + if (KinkyDungeonRestraintVariants[item]) found[item] = true; + } + } + if (KinkyDungeonConsumableChoices) { + for (let item of KinkyDungeonConsumableChoices) { + if (KinkyDungeonConsumableVariants[item]) found[item] = true; + } + } + } + + if (lost) { + let list = KinkyDungeonLostItems; + for (let inv of list) { + if (KinkyDungeonRestraintVariants[inv.name]) { + found[inv.name] = true; + } + if (KinkyDungeonConsumableVariants[inv.name]) { + found[inv.name] = true; + } + if (KinkyDungeonWeaponVariants[inv.name]) { + found[inv.name] = true; + } + } + + } + if (ground) { + let list = KDMapData.GroundItems; + for (let inv of list) { + if (KinkyDungeonRestraintVariants[inv.name]) { + found[inv.name] = true; + } + if (KinkyDungeonConsumableVariants[inv.name]) { + found[inv.name] = true; + } + if (KinkyDungeonWeaponVariants[inv.name]) { + found[inv.name] = true; + } + } + + if (!KDGameData.PersistentItems) KDGameData.PersistentItems = {}; + for (let plist of Object.values(KDGameData.PersistentItems)) { + for (let name of Object.keys(plist)) { + if (KinkyDungeonRestraintVariants[name]) { + found[name] = true; + } + if (KinkyDungeonConsumableVariants[name]) { + found[name] = true; + } + if (KinkyDungeonWeaponVariants[name]) { + found[name] = true; + } + } + } + } + if (entities) { + let list = KDMapData.Entities; + for (let enemy of list) { + if (enemy.items) { + for (let inv of enemy.items) { + if (KinkyDungeonRestraintVariants[inv]) { + found[inv] = true; + } + if (KinkyDungeonConsumableVariants[inv]) { + found[inv] = true; + } + if (KinkyDungeonWeaponVariants[inv]) { + found[inv] = true; + } + } + } + } + + } + if (npcrestraints && KDGameData.NPCRestraints) { + for (let list of Object.values(KDGameData.NPCRestraints)) { + for (let restraint of Object.values(list)) { + if (restraint?.name) { + found[restraint.name] = true; + } + if (restraint?.inventoryVariant) { + found[restraint.inventoryVariant] = true; + } + } + } + } + if (containers && KDGameData.Containers) { + for (let con of Object.values(KDGameData.Containers)) { + for (let restraint of Object.keys(con.items)) { + found[restraint] = true; + } + } + } + for (let type of entries) { + if (!found[type[0]]) { + KDRemoveInventoryVariant(type[0]); + delete identified[type[0]]; + } + } + for (let type of entrieswep) { + if (!found[type[0]]) { + KDRemoveWeaponVariant(type[0]); + delete identified[type[0]]; + } + } + for (let type of entriescon) { + if (!found[type[0]]) { + KDRemoveConsumableVariant(type[0]); + delete identified[type[0]]; + } + } + + KDGameData.IdentifiedObj = identified; +} + +/** + * Changes an inventory variant of an item + * @param item + * @param variant + * @param [prefix] + * @param [curse] + */ +function KDMorphToInventoryVariant(item: item, variant: KDRestraintVariant, prefix: string = "", curse?: string) { + let origRestraint = KinkyDungeonGetRestraintByName(variant.template); + let events = origRestraint.events ? JSON.parse(JSON.stringify(origRestraint.events)) : []; + let newname = prefix + variant.template + KinkyDungeonGetItemID() + (curse ? curse : ""); + if (prefix) variant.prefix = prefix; + if (curse) { + variant = JSON.parse(JSON.stringify(variant)); + variant.curse = curse; + } + if (!KinkyDungeonRestraintVariants[newname]) + KinkyDungeonRestraintVariants[newname] = variant; + if (variant.events) + Object.assign(events, variant.events); + KDUpdateItemEventCache = true; + KDChangeItemName(item, item.type, variant.template); + if (item.type == LooseRestraint) { + item.name = newname; + item.curse = curse; + item.events = events; + item.showInQuickInv = true; + } else { + item.name = variant.template; + item.curse = curse; + item.events = events; + item.inventoryVariant = newname; + } + KDUpdateItemEventCache = true; +} + +/** + * Adds an weapon variant to the player's inventory + * @param variant + * @param [prefix] + * @param [forceName] + * @param [suffix] + */ +function KDGiveWeaponVariant(variant: KDWeaponVariant, prefix: string = "", forceName?: string, suffix: string = "", container?: KDContainer) { + let origWeapon = KinkyDungeonFindWeapon(variant.template); + let events = origWeapon.events ? JSON.parse(JSON.stringify(origWeapon.events)) : []; + let newname = forceName ? forceName : (prefix + variant.template + KinkyDungeonGetItemID()); + if (prefix) variant.prefix = prefix; + if (suffix) variant.suffix = suffix; + if (!KinkyDungeonWeaponVariants[newname]) + KinkyDungeonWeaponVariants[newname] = variant; + if (variant.events) + Object.assign(events, variant.events); + let q = 1; + if (container) { + if (container.items[newname]) { + container.items[newname].quantity = (container.items[newname].quantity || 1) + 1; + } else { + container.items[newname] = {name: newname, id: KinkyDungeonGetItemID(), type: Weapon, events:events, quantity: q, showInQuickInv: true,}; + } + } else { + if (KinkyDungeonInventoryGet(newname)) q = KinkyDungeonInventoryGet(newname).quantity + 1; + KinkyDungeonInventoryAdd({name: newname, id: KinkyDungeonGetItemID(), type: Weapon, events:events, quantity: q, showInQuickInv: true,}); + } +} + +/** + * Adds an Consumable variant to the player's inventory + * @param variant + * @param [prefix] + * @param [forceName] + * @param [suffix] + * @param [Quantity] + */ +function KDGiveConsumableVariant(variant: KDConsumableVariant, prefix: string = "", forceName?: string, suffix: string = "", Quantity: number = 1, container?: KDContainer) { + //let origConsumable = KinkyDungeonFindConsumable(variant.template); + let events = [];//TODO//origConsumable.events ? JSON.parse(JSON.stringify(origConsumable.events)) : []; + let newname = forceName ? forceName : (prefix + variant.template + KinkyDungeonGetItemID()); + if (prefix) variant.prefix = prefix; + if (suffix) variant.suffix = suffix; + if (!KinkyDungeonConsumableVariants[newname]) + KinkyDungeonConsumableVariants[newname] = variant; + if (variant.events) + Object.assign(events, variant.events); + let q = Quantity; + if (container) { + if (container.items[newname]) { + container.items[newname].quantity = (container.items[newname].quantity || 1) + 1; + } else { + container.items[newname] = {name: newname, id: KinkyDungeonGetItemID(), type: Consumable, events:events, quantity: q, showInQuickInv: true,}; + } + } else { + if (KinkyDungeonInventoryGet(newname)) q = KinkyDungeonInventoryGet(newname).quantity + Quantity; + KinkyDungeonInventoryAdd({name: newname, id: KinkyDungeonGetItemID(), type: Consumable, events:events, quantity: q, showInQuickInv: true,}); + } +} +/** + * Adds an inventory variant to the player's inventory + * @param variant + * @param [prefix] + * @param [curse] + * @param [ID] + * @param [forceName] + * @param [suffix] + * @param [faction] + * @param [powerBonus] + * @param [quantity] + */ +function KDReturnInventoryVariant(variant: KDRestraintVariant, prefix: string = "", curse: string = undefined, ID: string = "", forceName?: string, suffix: string = "", faction: string = "", powerBonus?: number, quantity: number = 1): item { + let origRestraint = KinkyDungeonGetRestraintByName(variant.template); + let events = origRestraint.events ? JSON.parse(JSON.stringify(origRestraint.events)) : []; + let newname = forceName ? forceName : (prefix + variant.template + (ID || (KinkyDungeonGetItemID() + "")) + (curse ? curse : "")); + if (prefix) variant.prefix = prefix; + if (suffix) variant.suffix = suffix; + if (curse) { + variant = JSON.parse(JSON.stringify(variant)); + variant.curse = curse; + } + if (powerBonus) variant.power = powerBonus; + if (!KinkyDungeonRestraintVariants[newname]) + KinkyDungeonRestraintVariants[newname] = variant; + if (variant.events) + Object.assign(events, variant.events); + let q = quantity; + return {faction: faction, name: newname, curse: curse, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:events, quantity: q, showInQuickInv: true,}; +} + + +/** + * Adds an inventory variant to the player's inventory + * @param variant + * @param [prefix] + * @param [curse] + * @param [ID] + * @param [forceName] + * @param [suffix] + * @param [faction] + * @param [powerBonus] + * @param [quantity] + */ +function KDGiveInventoryVariant(variant: KDRestraintVariant, prefix: string = "", curse: string = undefined, ID: string = "", forceName?: string, suffix: string = "", faction: string = "", powerBonus?: number, quantity: number = 1, container?: KDContainer) { + let origRestraint = KinkyDungeonGetRestraintByName(variant.template); + let events = origRestraint.events ? JSON.parse(JSON.stringify(origRestraint.events)) : []; + let newname = forceName ? forceName : (prefix + variant.template + (ID || (KinkyDungeonGetItemID() + "")) + (curse ? curse : "")); + if (prefix) variant.prefix = prefix; + if (suffix) variant.suffix = suffix; + if (curse) { + variant = JSON.parse(JSON.stringify(variant)); + variant.curse = curse; + } + if (powerBonus) variant.power = powerBonus; + if (!KinkyDungeonRestraintVariants[newname]) + KinkyDungeonRestraintVariants[newname] = variant; + if (variant.events) + Object.assign(events, variant.events); + let q = quantity; + if (container) { + if (container.items[newname]) { + container.items[newname].quantity = (container.items[newname].quantity || 1) + 1; + } else { + container.items[newname] = {faction: faction, name: newname, curse: curse, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:events, quantity: q, showInQuickInv: true,}; + } + } else { + if (KinkyDungeonInventoryGet(newname)) q = KinkyDungeonInventoryGet(newname).quantity + quantity; + KinkyDungeonInventoryAdd({faction: faction, name: newname, curse: curse, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:events, quantity: q, showInQuickInv: true,}); + } +} + + +/** + * Creates an inventory variant item + * @param variant + * @param [prefix] + * @param [curse] + * @param [ID] + * @param [forceName] + * @param [suffix] + * @param [faction] + * @param [powerBonus] + * @param [quantity] + */ +function KDGetInventoryVariant(variant: KDRestraintVariant, prefix: string = "", curse: string = undefined, ID: string = "", forceName?: string, suffix: string = "", faction: string = "", powerBonus?: number, quantity: number = 1): item { + let origRestraint = KinkyDungeonGetRestraintByName(variant.template); + let events = origRestraint.events ? JSON.parse(JSON.stringify(origRestraint.events)) : []; + let newname = forceName ? forceName : (prefix + variant.template + (ID || (KinkyDungeonGetItemID() + "")) + (curse ? curse : "")); + if (prefix) variant.prefix = prefix; + if (suffix) variant.suffix = suffix; + if (curse) { + variant = JSON.parse(JSON.stringify(variant)); + variant.curse = curse; + } + if (powerBonus) variant.power = powerBonus; + if (!KinkyDungeonRestraintVariants[newname]) + KinkyDungeonRestraintVariants[newname] = variant; + if (variant.events) + Object.assign(events, variant.events); + let q = quantity; + return {faction: faction, name: newname, curse: curse, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:events, quantity: q, showInQuickInv: true,}; +} +/** + * Adds an inventory variant to the player's inventory + * @param variant + * @param [prefix] + * @param [Tightness] + * @param [Bypass] + * @param [Lock] + * @param [Keep] + * @param [Trapped] + * @param [faction] + * @param [Deep] - whether or not it can go deeply in the stack + * @param [curse] - Curse to apply + * @param [securityEnemy] - Bypass is treated separately for these groups + * @param [useAugmentedPower] - Augment power to keep consistency + * @param [inventoryAs] - inventoryAs for the item + * @param [ID] + * @param [suffix] + * @param [powerBonus] + */ +function KDEquipInventoryVariant ( + variant: KDRestraintVariant, + prefix: string = "", + Tightness?: number, + Bypass?: boolean, + Lock?: string, + Keep?: boolean, + Trapped?: boolean, + faction?: string, + Deep?: boolean, + curse?: string, + securityEnemy?: entity, + useAugmentedPower?: boolean, + _inventoryAs?: string, + ID: string = "", + suffix: string = "", + powerBonus: number = 0, + NoActionPrune: boolean = false, +) +{ + KDUpdateItemEventCache = true; + let origRestraint = KinkyDungeonGetRestraintByName(variant.template); + let events = origRestraint.events ? JSON.parse(JSON.stringify(origRestraint.events)) : []; + let newname = prefix + variant.template + (ID || (KinkyDungeonGetItemID() + "")) + (curse ? curse : ""); + if (prefix) variant.prefix = prefix; + if (suffix) variant.suffix = suffix; + if (curse) { + variant = JSON.parse(JSON.stringify(variant)); + variant.curse = curse; + } + if (powerBonus) variant.power = powerBonus; + if (!KinkyDungeonRestraintVariants[newname]) + KinkyDungeonRestraintVariants[newname] = variant; + if (variant.events) + Object.assign(events, variant.events); + return KinkyDungeonAddRestraintIfWeaker(origRestraint, + Tightness, Bypass, Lock, Keep, Trapped, + events, faction, Deep, curse, + securityEnemy, useAugmentedPower, newname, + undefined, undefined, undefined, + powerBonus, NoActionPrune + ); +} + +/** + * @param item + */ +function KDItem(item: Named): weapon | restraint | outfit | consumable { + return KDRestraint(item) || KDConsumable(item) || KDWeapon(item) || KDOutfit(item) || KinkyDungneonBasic[item?.name]; +} +/** + * @param item + */ +function KDItemNoRestraint(item: Named): weapon | outfit | consumable { + return KDConsumable(item) || KDWeapon(item) || KDOutfit(item) || KinkyDungneonBasic[item?.name]; +} + +/** + * @param name + * @param [quantity] + */ +function KDGiveItem(name: string, quantity: number = 1): boolean { + + if (KinkyDungeonWeaponVariants[name]) { + KDGiveWeaponVariant(KinkyDungeonWeaponVariants[name], undefined, name); + return true; + } else if (KDWeapon({name: name})) { + if (!KinkyDungeonInventoryGetWeapon(name)) + KinkyDungeonInventoryAddWeapon(name); + else return false; + return true; + } else if (KinkyDungeonConsumableVariants[name]) { + KDGiveConsumableVariant(KinkyDungeonConsumableVariants[name], undefined, name, undefined, quantity); + return true; + } else if (KDConsumable({name: name})) { + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable(name), quantity); + return true; + } else if (KinkyDungeonRestraintVariants[name]) { + let variant = KinkyDungeonRestraintVariants[name]; + KDGiveInventoryVariant(variant, undefined, variant.curse, undefined, name, KinkyDungeonRestraintVariants[name].suffix, undefined, undefined, quantity); + return true; + } else if (KDRestraint({name: name})) { + let restraint = KDRestraint({name: name}); + if (!KinkyDungeonInventoryGetLoose(name)) { + KinkyDungeonInventoryAdd({name: name, type: LooseRestraint, events:restraint.events, quantity: quantity, id: KinkyDungeonGetItemID()}); + } else { + if (!KinkyDungeonInventoryGetLoose(name).quantity) KinkyDungeonInventoryGetLoose(name).quantity = 0; + KinkyDungeonInventoryGetLoose(name).quantity += quantity; + } + return true; + } else if (KDOutfit({name: name})) { + if (!KinkyDungeonInventoryGet(name)) { + KinkyDungeonInventoryAdd({name: name, type: Outfit, id: KinkyDungeonGetItemID()}); + } + else return false; + return true; + } else if (KinkyDungneonBasic[name]) { + KDAddBasic(KinkyDungneonBasic[name]); + return true; + } + return false; +} + +function KDDrawHotbarBottom(selected: KDFilteredInventoryItem, spells: boolean, selectSpell: spell, xshift: number = 0, allowOverflow: boolean = false) { + if (KDToggles.BuffSide) allowOverflow = true; + let i = 0; + let HotbarStart = 995 - 70; + let hotBarSpacing = 72; + let hotBarX = 790 + hotBarSpacing + xshift; + + DrawButtonKDEx("CycleSpellButton", () => { + KDCycleSpellPage(false, false, true); + return true; + }, true, hotBarX + 713, HotbarStart, 72, 72, `${KDSpellPage + 1}`, "#ffffff", + KinkyDungeonRootDirectory + "UI/Cycle.png", undefined, undefined, true, undefined, 28, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpellPage[0]), + hotkeyPress: KinkyDungeonKeySpellPage[0], + scaleImage: true, + centered: true, + centerText: true, + }); + KDCullSpellChoices(); + + //if (!KDToggles.TransparentUI) { + DrawRectKD( + kdcanvas, kdpixisprites, "Ahotbarborder", { + Left: hotBarX - 5, Top: HotbarStart - 5, Width: 72 * 11, + Height: 82, + Color: KDUIColorHighlight, alpha: KDUIAlphaHighlight, zIndex: -20, + LineWidth: 2, + } + ); + FillRectKD( + kdcanvas, kdpixisprites, "Ahotbarbg", { + Left: hotBarX - 5, Top: HotbarStart - 5, Width: 72 * 11, + Height: 82, + Color: KDUIColor, alpha: 1, zIndex: -10 + } + ); + //} + + + + for (i = 0; i < KinkyDungeonSpellChoiceCountPerPage; i++) { + let index = i + KDSpellPage * KinkyDungeonSpellChoiceCountPerPage; + let buttonDim = { + x: hotBarX + hotBarSpacing*i, + y: HotbarStart, + w: 72, + h: 72, + wsmall: 36, + hsmall: 36, + }; + + + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[index]] && !KinkyDungeonSpells[KinkyDungeonSpellChoices[index]].passive) { + let spell = KinkyDungeonSpells[KinkyDungeonSpellChoices[index]]; + + // Render MP cost + let data = { + spell: spell, + cost: Math.round(KinkyDungeonGetManaCost( + spell, + !spell.active && spell.passive, + !spell.active && spell.type == "passive") * 10) + "mp", + color: "#ccddFF", + }; + if (data.cost == "0mp") { + let c2 = Math.round(KinkyDungeonGetStaminaCost(spell) * 10) + "sp"; + if (c2 != "0sp") { + data.cost = c2; + } + } + if (data.cost == "0mp") { + let c2 = Math.round(KinkyDungeonGetChargeCost(spell) * 10) + "c"; + if (c2 != "0c") { + data.cost = c2; + } + } + if (spell.customCost && KDCustomCost[spell.customCost]) { + KDCustomCost[spell.customCost](data); + } + + DrawTextFitKD(data.cost == "0mp" ? TextGet("KDFree") : data.cost, buttonDim.x + buttonDim.w/2, buttonDim.y+buttonDim.h-7, buttonDim.w, + data.color, "#333333", 12, "center", 110); + + // Draw the main spell icon + if (spell.type == "passive" && KinkyDungeonSpellChoicesToggle[index]) { + FillRectKD(kdcanvas, kdpixisprites, "rectspella" + i, { + Left: buttonDim.x-2, + Top: buttonDim.y-2, + Width: buttonDim.w+4, + Height: buttonDim.h+4, + Color: "#dbdbdb", + zIndex: 70, + }); + FillRectKD(kdcanvas, kdpixisprites, "rectspellb" + i, { + Left: buttonDim.x, + Top: buttonDim.y, + Width: buttonDim.w, + Height: buttonDim.h, + Color: "#101010", + zIndex: 70.1, + }); + } + + + DrawButtonKDEx("SpellHotbar" + index, + () => { + let I = index; + if (spells) { + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]] == spell) { + KDSendInput("spellRemove", {I:I}); + } else { + if (KinkyDungeonSpellChoices.includes(KinkyDungeonCurrentPage)) { + KDSendInput("spellRemove", {I:KinkyDungeonSpellChoices.indexOf(KinkyDungeonCurrentPage)}); + } + KinkyDungeonClickSpellChoice(I, KinkyDungeonCurrentPage); + } + } else if (KinkyDungeonConsumableChoices[I] || KinkyDungeonWeaponChoices[I] || KinkyDungeonArmorChoices[I] || KinkyDungeonSpellChoices[I] >= 0) { + KDSendInput("spellRemove", {I:I}); + } else if (selected) { + KinkyDungeonClickItemChoice(I, selected.item.name); + } + return true; + }, + true, + buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, "", "rgba(0, 0, 0, 0)", + KinkyDungeonRootDirectory + "Spells/" + spell.name + ".png", "", false, true, + undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpell[i]), + scaleImage: true, + }); + if (KinkyDungeoCheckComponentsPartial(spell, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true).length > 0) { + let sp = KinkyDungeoCheckComponents(spell).failed.length > 0 ? "SpellFail" : "SpellFailPartial"; + KDDraw(kdcanvas, kdpixisprites, "spellFail" + "SpellCast" + i, KinkyDungeonRootDirectory + "Spells/" + sp + ".png", + buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, undefined, { + zIndex: 72, + }); + } + if (KDHasUpcast(spell.name)) { + KDDraw(kdcanvas, kdpixisprites, "spellCanUpcast" + i, KinkyDungeonRootDirectory + "Spells/" + "CanUpcast" + ".png", + buttonDim.x, buttonDim.y, 72, 72, undefined, { + zIndex: 71, + }); + } + + if (MouseIn(buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h)) { + DrawTextFitKD(TextGet("KinkyDungeonSpell"+ spell.name), + buttonDim.x, buttonDim.y - 140, 300, "#ffffff", "#333333", undefined, "center", + 200); + } + // Render number + //DrawTextFitKD((i+1) + "", buttonDim.x + 10, buttonDim.y + 13, 25, "#ffffff", KDTextGray0, 18, undefined, 101); + + + //let cost = KinkyDungeonGetManaCost(spell) + TextGet("KinkyDungeonManaCost") + comp; + } else if (KinkyDungeonConsumableChoices[index] || KinkyDungeonWeaponChoices[index] || KinkyDungeonArmorChoices[index]) { + let item = KinkyDungeonConsumableChoices[index] || KinkyDungeonWeaponChoices[index] || KinkyDungeonArmorChoices[index]; + let arm = KinkyDungeonArmorChoices[index]; + let consumable = KinkyDungeonConsumableChoices[index]; + let wep = KinkyDungeonWeaponChoices[index]; + // Draw the main icon + let name = item; + if (arm && KinkyDungeonRestraintVariants[arm]) name = KinkyDungeonRestraintVariants[arm].template; + if (consumable && KinkyDungeonConsumableVariants[consumable]) name = KinkyDungeonConsumableVariants[consumable].template; + if (wep && KinkyDungeonWeaponVariants[wep]) name = KinkyDungeonWeaponVariants[wep].template; + if (KDGetItemPreview({name: item, type: consumable ? Consumable : (arm ? LooseRestraint : Weapon)})) { + DrawButtonKDEx("UseItem" + index, + () => { + let I = index; + if (spells) { + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]] == selectSpell) { + KDSendInput("spellRemove", {I:I}); + } else { + if (KinkyDungeonSpellChoices.includes(KinkyDungeonCurrentPage)) { + KDSendInput("spellRemove", {I:KinkyDungeonSpellChoices.indexOf(KinkyDungeonCurrentPage)}); + } + KinkyDungeonClickSpellChoice(I, KinkyDungeonCurrentPage); + } + } else { + if (KinkyDungeonConsumableChoices[I] || KinkyDungeonWeaponChoices[I] || KinkyDungeonArmorChoices[I] || KinkyDungeonSpellChoices[I] >= 0) { + KDSendInput("spellRemove", {I:I}); + } else { + KinkyDungeonClickItemChoice(I, selected.item.name); + } + } + + return true; + }, + true, + buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, "", "rgba(0, 0, 0, 0)", + KDGetItemPreview({name: item, type: consumable ? Consumable : (arm ? LooseRestraint : Weapon)}).preview, "", false, true, + undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpell[i]), + scaleImage: true, + }); + + if (MouseIn(buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h)) { + DrawTextFitKD(TextGet((arm ? "Restraint" : ("KinkyDungeonInventoryItem")) + name), + buttonDim.x, buttonDim.y - 140, 300, + "#ffffff", "#333333", undefined, "center", + 200); + } + // Render number + //DrawTextFitKD((i+1) + "", buttonDim.x + 10, buttonDim.y + 13, 25, "#ffffff", KDTextGray0, 18, undefined, 101); + if (consumable) { + let con = KinkyDungeonInventoryGetConsumable(consumable); + if (con) { + DrawTextFitKD((con.quantity || 0) + 'x', + buttonDim.x + buttonDim.w-1, + buttonDim.y + buttonDim.h - 9, + buttonDim.hsmall, "#ffffff", KDTextGray0, 18, "right"); + } + } + } + if (!KinkyDungeonInventoryGet(item)) { + let sp = "SpellFail"; + KDDraw(kdcanvas, kdpixisprites, "spellFail" + "SpellCast" + i, KinkyDungeonRootDirectory + "Spells/" + sp + ".png", + buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, undefined, { + zIndex: 72, + }); + //DrawImage(KinkyDungeonRootDirectory + "Spells/" + sp + ".png", buttonDim.x + 2, buttonDim.y + 2,); + } + + } else if (selected || spells) { + + DrawButtonKDEx("UseItem" + index, + () => { + let I = index; + if (spells) { + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]] == selectSpell) { + KDSendInput("spellRemove", {I:I}); + } else { + if (KinkyDungeonSpellChoices.includes(KinkyDungeonCurrentPage)) { + KDSendInput("spellRemove", {I:KinkyDungeonSpellChoices.indexOf(KinkyDungeonCurrentPage)}); + } + KinkyDungeonClickSpellChoice(I, KinkyDungeonCurrentPage); + } + } else + KinkyDungeonClickItemChoice(I, selected.item.name); + return true; + }, + true, + buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h, "", "rgba(0, 0, 0, 0)", + "", "", false, true, + undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpell[i]), + scaleImage: true, + }); + } + let icon = 0; + let maxSmallIcons = allowOverflow ? KinkyDungeonSpellChoiceRenderRows : 3; + // Draw icons for the other pages, if applicable + for (let page = 1; page < maxSmallIcons && page <= Math.floor((KinkyDungeonSpellChoiceCount - 1) / KinkyDungeonSpellChoiceCountPerPage); page += 1) { + let pg = KDSpellPage + page; + if (pg > Math.floor((KinkyDungeonSpellChoiceCount) / KinkyDungeonSpellChoiceCountPerPage)) pg -= 1 + Math.floor((KinkyDungeonSpellChoiceCount - 1) / KinkyDungeonSpellChoiceCountPerPage); + + // Now we have our page... + let indexPaged = (i + pg * KinkyDungeonSpellChoiceCountPerPage) % (KinkyDungeonSpellChoiceCount); + let spellPaged = KinkyDungeonSpells[KinkyDungeonSpellChoices[indexPaged]]; + let item = KinkyDungeonConsumableChoices[indexPaged] || KinkyDungeonWeaponChoices[indexPaged] || KinkyDungeonArmorChoices[indexPaged]; + let arm = KinkyDungeonArmorChoices[indexPaged]; + let consumable = KinkyDungeonConsumableChoices[indexPaged]; + //let weapon = KinkyDungeonWeaponChoices[index]; + // Draw the main spell icon + let buttonDimSmall = { + x: buttonDim.x-1 + (buttonDim.wsmall) * ((page - 1) % 2), + y: buttonDim.y-1 - (buttonDim.hsmall) * (1 + Math.floor((page - 1)/2)), + }; + if (spellPaged) { + if (spellPaged.type == "passive" && KinkyDungeonSpellChoicesToggle[indexPaged]) { + FillRectKD(kdcanvas, kdpixisprites, page + "pgspell" + i, { + Left: buttonDimSmall.x - 1 - 4, + Top: buttonDimSmall.y - 1 - 4, + Width: buttonDim.wsmall+2, + Height: buttonDim.hsmall+2, + Color: "#dbdbdb", + zIndex: 70, + }); + FillRectKD(kdcanvas, kdpixisprites, page + "pgspell2" + i, { + Left: buttonDimSmall.x - 4, + Top: buttonDimSmall.y - 4, + Width: buttonDim.wsmall, + Height: buttonDim.hsmall, + Color: "#101010", + zIndex: 70.1, + }); + } + icon += 1; + DrawButtonKDEx("ASpellHotbar" + indexPaged, () => { + let I = indexPaged; + if (spells) { + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]] == selectSpell) { + KDSendInput("spellRemove", {I:I}); + } else { + if (KinkyDungeonSpellChoices.includes(KinkyDungeonCurrentPage)) { + KDSendInput("spellRemove", {I:KinkyDungeonSpellChoices.indexOf(KinkyDungeonCurrentPage)}); + } + KinkyDungeonClickSpellChoice(I, KinkyDungeonCurrentPage); + } + } else { + if (KinkyDungeonConsumableChoices[I] || KinkyDungeonWeaponChoices[I] || KinkyDungeonArmorChoices[I] || KinkyDungeonSpellChoices[I] >= 0) { + KDSendInput("spellRemove", {I:I}); + } else { + KinkyDungeonClickItemChoice(I, selected.item.name); + } + } + + return true; + }, true, buttonDimSmall.x - 4, buttonDimSmall.y - 4, buttonDim.wsmall - 2, buttonDim.hsmall - 2, "", + KDButtonColor, "", "", false, true, KDButtonColor, undefined, undefined, {zIndex: 50}); + KDDraw(kdcanvas, kdpixisprites, "spellIcon" + icon + "," + indexPaged, KinkyDungeonRootDirectory + "Spells/" + spellPaged.name + ".png" + ,buttonDimSmall.x - 4, buttonDimSmall.y - 4, buttonDim.wsmall, buttonDim.hsmall, undefined, { + zIndex: 71, + }); + if ((KinkyDungeoCheckComponents(spellPaged).failed.length > 0 || (spellPaged.components.includes("Verbal") && !KinkyDungeonStatsChoice.get("Incantation") && KinkyDungeonGagTotal() > 0 && !spellPaged.noMiscast))) { + let sp = "SpellFail"; + if (spellPaged.components.includes("Verbal") && !KinkyDungeonStatsChoice.get("Incantation") && KinkyDungeonGagTotal() < 1) { + sp = "SpellFailPartial"; + } + KDDraw(kdcanvas, kdpixisprites, "spellFail" + icon + "," + page + "," + indexPaged, KinkyDungeonRootDirectory + "Spells/" + sp + ".png", + buttonDimSmall.x - 4, buttonDimSmall.y - 4, buttonDim.wsmall, buttonDim.hsmall, undefined, { + zIndex: 72, + }); + + //DrawImageEx(KinkyDungeonRootDirectory + "Spells/" + sp + ".png", buttonDim.x + 2 - buttonDim.wsmall * page, buttonDim.y + 2, { + //Width: buttonDim.wsmall, + //Height: buttonDim.hsmall, + //}); + } + } else if (item) { + icon += 1; + let prev = KDGetItemPreview({name: item, type: consumable ? Consumable : (arm ? LooseRestraint : Weapon)}); + if (prev) { + KDDraw(kdcanvas, kdpixisprites, "spellIcon" + icon + "," + indexPaged, prev.preview + ,buttonDimSmall.x - 4, buttonDimSmall.y - 4, buttonDim.wsmall, buttonDim.hsmall, undefined, { + zIndex: 71, + }); + if (prev.preview2) + KDDraw(kdcanvas, kdpixisprites, "spellIcon2" + icon + "," + indexPaged, prev.preview2 + ,buttonDimSmall.x - 4, buttonDimSmall.y - 4, buttonDim.wsmall, buttonDim.hsmall, undefined, { + zIndex: 71, + }); + DrawButtonKDEx("AHotbarItem" + indexPaged, () => { + let I = indexPaged; + if (spells) { + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]] == selectSpell) { + KDSendInput("spellRemove", {I:I}); + } else { + if (KinkyDungeonSpellChoices.includes(KinkyDungeonCurrentPage)) { + KDSendInput("spellRemove", {I:KinkyDungeonSpellChoices.indexOf(KinkyDungeonCurrentPage)}); + } + KinkyDungeonClickSpellChoice(I, KinkyDungeonCurrentPage); + } + } else { + if (KinkyDungeonConsumableChoices[I] || KinkyDungeonWeaponChoices[I] || KinkyDungeonArmorChoices[I] || KinkyDungeonSpellChoices[I] >= 0) { + KDSendInput("spellRemove", {I:I}); + } else { + KinkyDungeonClickItemChoice(I, selected.item.name); + } + } + + return true; + }, true, buttonDimSmall.x - 4, buttonDimSmall.y - 4, buttonDim.wsmall - 2, buttonDim.hsmall - 2, "", + KDButtonColor, "", "", false, true, KDButtonColor, undefined, undefined, {zIndex: 50}); + + } + + + if (consumable) { + let con = KinkyDungeonInventoryGetConsumable(consumable); + //if (con) { + DrawTextFitKD((con?.quantity || 0) + "x", buttonDimSmall.x + buttonDim.hsmall - 1, buttonDimSmall.y + buttonDim.hsmall - 6, 50, + "#ffffff", KDTextGray0, 12, "right"); + //} + } + + if (!KinkyDungeonInventoryGet(item)) { + let sp = "SpellFail"; + KDDraw(kdcanvas, kdpixisprites, "spellFail" + icon + "," + page + "," + indexPaged, KinkyDungeonRootDirectory + "Spells/" + sp + ".png", + buttonDimSmall.x - 4, buttonDimSmall.y - 4, buttonDim.wsmall, buttonDim.hsmall, undefined, { + zIndex: 72, + }); + } + } else if (selected || spells) { + icon += 1; + /*KDDraw(kdcanvas, kdpixisprites, "spellIcon" + icon + "," + indexPaged, prev.preview + ,buttonDimSmall.x - 4, buttonDimSmall.y - 4, buttonDim.wsmall, buttonDim.hsmall, undefined, { + zIndex: 71, + });*/ + DrawButtonKDEx("AHotbarItem" + indexPaged, () => { + let I = indexPaged; + if (spells) { + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]] == selectSpell) { + KDSendInput("spellRemove", {I:I}); + } else { + if (KinkyDungeonSpellChoices.includes(KinkyDungeonCurrentPage)) { + KDSendInput("spellRemove", {I:KinkyDungeonSpellChoices.indexOf(KinkyDungeonCurrentPage)}); + } + KinkyDungeonClickSpellChoice(I, KinkyDungeonCurrentPage); + } + } else + KinkyDungeonClickItemChoice(I, selected.item.name); + return true; + }, true, buttonDimSmall.x - 4, buttonDimSmall.y - 4, buttonDim.wsmall - 2, buttonDim.hsmall - 2, "", + KDButtonColor, "", "", false, true, KDButtonColor, undefined, undefined, {zIndex: 50}); + + } + } + } +} + + + + +function KinkyDungeonAttemptQuickRestraint(Name: string): boolean { + if (KDGameData.SleepTurns > 0 || KDGameData.SlowMoveTurns > 0) return false; + let item = KinkyDungeonInventoryGetLoose(Name); + if (!item) return false; + + //KDCloseQuickInv(); + if (KinkyDungeonDrawState == "Inventory") KinkyDungeonDrawState = "Game"; + if (item) { + KinkyDungeonTargetingSpell = KDBondageSpell; + KinkyDungeonTargetingSpellItem = item; + KinkyDungeonTargetingSpellWeapon = null; + } + + return true; +} + + +function KDIsUnidentified(item: item) { + return (item.inventoryVariant || KinkyDungeonRestraintVariants[item.name] + || KinkyDungeonWeaponVariants[item.name] + || KinkyDungeonConsumableVariants[item.name] + ) + && (!KDGameData.IdentifiedObj || !KDGameData.IdentifiedObj[item.inventoryVariant || item.name]); +} + + +/** Returns true if an alternate inventory mode is enabled */ +function KDAlternateInventoryRender(): boolean { + return KDConfigRestraintColor || KDConfigHotbar; +} + +function KDResetAlternateInventoryRender() { + KDConfigHotbar = false; + KDConfigRestraintColor = false; +} + +function KDRenderAlternateInventory(selected: KDFilteredInventoryItem, xOffset: number, yOffset: number, prefix: string): boolean { + if (selected && KDConfigHotbar) { + KDDrawHotbar(canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale - 15, yOffset + canvasOffsetY_ui + 50, selected.item.name, (I) => { + if (KinkyDungeonConsumableChoices[I] || KinkyDungeonWeaponChoices[I] || KinkyDungeonArmorChoices[I] || KinkyDungeonSpellChoices[I] >= 0) { + KDSendInput("spellRemove", {I:I}); + } else { + KinkyDungeonClickItemChoice(I, selected.item.name); + } + }); + DrawButtonKDEx(prefix + "KDBack", (_bdata) => { + KDConfigHotbar = !KDConfigHotbar; + return true; + }, true, canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale + 185, yOffset + canvasOffsetY_ui + 483*KinkyDungeonBookScale - 250, 190, 55, TextGet("KDBack"), "#ffffff", ""); + return true; + } else if (selected && KDConfigRestraintColor) { + let currentItem: item = selected.item; + KDDrawPalettes(1300, 250, KDPaletteWidth, 72, + currentItem?.forceFaction != undefined ? currentItem?.forceFaction || "" : "-1", (palette) => { + + if (currentItem) { + if (currentItem.forceFaction == palette) { + delete currentItem.forceFaction; + } else { + currentItem.forceFaction = palette; + currentItem.faction = palette; + } + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonCheckClothesLoss = true; + KinkyDungeonDressPlayer(); + } + + }, "KDSetRestraintPaletteSelect"); + + DrawButtonKDEx(prefix + "KDBack", (_bdata) => { + KDConfigRestraintColor = !KDConfigRestraintColor; + return true; + }, true, canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale + 185, + yOffset + canvasOffsetY_ui + 483*KinkyDungeonBookScale + 0, 190, 55, TextGet("KDBack"), "#ffffff", ""); + return true; + } + return false; +} \ No newline at end of file diff --git a/Game/src/item/KinkyDungeonItem.ts b/Game/src/item/KinkyDungeonItem.ts new file mode 100644 index 000000000..9a15eacd0 --- /dev/null +++ b/Game/src/item/KinkyDungeonItem.ts @@ -0,0 +1,459 @@ +"use strict"; + +/** Certain items, when dropped, have specific properties +*/ +let KDDroppedItemProperties: Record = { + "RedKey": { + tinyness: 2, + }, + "Pick": { + tinyness: 1, + }, + "BlueKey": { + tinyness: 2, + }, + "Knife": { + tinyness: 3, + }, + "EnchKnife": { + tinyness: 3, + }, + "Dirk": { + tinyness: 3, + }, + "Scissors": { + tinyness: 3, + }, + "Heart": { + persistent: true, + }, + "Lore": { + tinyness: 3, + persistent: true, + }, + +}; + +type GroundItem = { + x: number; + y: number; + name: string; + amount?: number; +} + +function KinkyDungeonItemDrop(x: number, y: number, dropTable: any[], summoned: boolean): boolean | GroundItem { + if (dropTable) { + let dropWeightTotal = 0; + let dropWeights = []; + + for (let drop of dropTable) { + let weight = drop.weight; + dropWeights.push({drop: drop, weight: dropWeightTotal}); + if (drop.ignoreInInventory && (KinkyDungeonInventoryGet(drop.name) || KinkyDungeonFlags.get("ItemDrop_" + drop.name))) weight = 0; + if (drop.chance && KDRandom() > drop.chance) weight = 0; + dropWeightTotal += Math.max(weight, 0); + } + + let selection = KDRandom() * dropWeightTotal; + + for (let L = dropWeights.length - 1; L >= 0; L--) { + if (selection > dropWeights[L].weight) { + if (dropWeights[L].drop.name != "Nothing" && (!KinkyDungeonStatsChoice.get("Stealthy") || dropWeights[L].drop.name != "Gold") && (!summoned || !dropWeights[L].drop.noSummon)) { + let dropped: GroundItem = {x:x, y:y, name: dropWeights[L].drop.name, amount: dropWeights[L].drop.amountMin ? (dropWeights[L].drop.amountMin + Math.floor(KDRandom()*dropWeights[L].drop.amountMax)) : dropWeights[L].drop.amount}; + if (!KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x, y))) { + let newPoint = KinkyDungeonGetNearbyPoint(x, y, false, undefined, true); + if (newPoint) { + dropped.x = newPoint.x; + dropped.y = newPoint.y; + } else { + console.log("Failed to find point to drop " + TextGet("KinkyDungeonInventoryItem" + dropWeights[L].drop.name)); + } + } + KDMapData.GroundItems.push(dropped); + KinkyDungeonSetFlag("ItemDrop_" + dropped.name, Math.round(12 + KDRandom() * 8)); + return dropped; + } + return false; + } + } + } + return false; +} + +function KinkyDungeonDropItem(Item: any, Origin: any, PreferOrigin: boolean, noMsg?: boolean, allowEnemies?: boolean): boolean { + let slots = []; + for (let X = -Math.ceil(1); X <= Math.ceil(1); X++) + for (let Y = -Math.ceil(1); Y <= Math.ceil(1); Y++) { + if ((X != 0 || Y != 0)) + slots.push({x:X, y:Y}); + } + + let foundslot = PreferOrigin ? {x:Origin.x, y:Origin.y} : null; + + // Old code used for enclosure in box--todo reimplement enclosure + //if (!(Origin == KinkyDungeonPlayerEntity && PreferOrigin && KinkyDungeonPlayer.IsEnclose())) { + if (!foundslot || !(KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(foundslot.x, foundslot.y)) + && (allowEnemies || KinkyDungeonNoEnemy(foundslot.x, foundslot.y, true)))) + for (let C = 0; C < 100; C++) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(Origin.x+slot.x, Origin.y+slot.y)) + && (allowEnemies || KinkyDungeonNoEnemy(Origin.x+slot.x, Origin.y+slot.y, true))) { + foundslot = {x: Origin.x+slot.x, y: Origin.y+slot.y}; + + C = 100; + } else slots.splice(C, 1); + } + //} + + + if (foundslot) { + + let dropped: GroundItem = {x:foundslot.x, y:foundslot.y, name: Item.name}; + if (Item.amountMin && Item.amountMax) { + dropped.amount = Item.amountMin + Math.floor(KDRandom()*Item.amountMax); + } else if (Item.amount) { + dropped.amount = Item.amount; + } + + KDMapData.GroundItems.push(dropped); + if (!noMsg) + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonDrop" + Item.name), "#ff5277", 2); + + return true; + } + + return false; +} + +function KinkyDungeonItemEvent(Item: any, nomsg?: boolean) { + let color = "white"; + let priority = 1; + let sfx = "Coins"; + let name = Item.name; + let replace = ""; + if (Item.amount == undefined && Item.quantity) { + Item.amount = Item.quantity; + } + if (KDCustomItems[name]) { + let ret = KDCustomItems[name](Item); + if (ret.sfx != undefined) sfx = ret.sfx; + if (ret.replace != undefined) replace = ret.replace; + if (ret.priority != undefined) priority = ret.priority; + if (ret.color != undefined) color = ret.color; + if (ret.name != undefined) name = ret.name; + } else if (Item.name == "Gold") { + color = "yellow"; + KinkyDungeonAddGold(Item.amount); + } else if (Item.name == "Lore") { + return KinkyDungeonNewLore(); + } else if (Item.name == "Pick") { + priority = 2; + color = "lightgreen"; + KDAddConsumable("Pick", 1); + } else if (Item.name == "MagicSword") { + priority = 8; + color = "orange"; + KinkyDungeonInventoryAddWeapon("MagicSword"); + } else if (Item.name == "Scrolls") { + priority = 4; + color = "lightgreen"; + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollArms, 1); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollLegs, 1); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollVerbal, 1); + } else if (Item.name == "Knife") { + priority = 2; + color = "lightgreen"; + KinkyDungeonInventoryAddWeapon("Knife"); + } else if (Item.name == "Knives") { + priority = 3; + color = "lightgreen"; + KinkyDungeonInventoryAddWeapon("Knife"); + if (!KinkyDungeonPlayerDamage || KinkyDungeonPlayerDamage.unarmed) { + KDSetWeapon("Knife"); + KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); + } + } else if (Item.name == "EnchKnife") { + priority = 2; + color = "lightgreen"; + KinkyDungeonInventoryAddWeapon("EnchKnife"); + if (!KinkyDungeonPlayerDamage || KinkyDungeonPlayerDamage.unarmed) { + KDSetWeapon("EnchKnife"); + KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); + } + } else if (Item.name == "RedKey") { + priority = 2; + color = "lightgreen"; + KDAddConsumable("RedKey", 1); + } else if (Item.name == "BlueKey") { + priority = 2; + color = "lightgreen"; + KDAddConsumable("BlueKey", 1); + } else if (KDConsumable(Item)) { + if (KinkyDungeonWeaponVariants[Item.name]) { + KDGiveConsumableVariant(KinkyDungeonConsumableVariants[Item.name], undefined, Item.name, undefined, Item.amount); + color = "#aaaaff"; + name = "Generic"; + replace = TextGet("KinkyDungeonInventoryItem" + KinkyDungeonConsumableVariants[Item.name].template); + } else { + let item = KinkyDungeonFindConsumable(Item.name); + priority = item.rarity; + if (item.potion) sfx = "PotionDrink"; + color = "white"; + KinkyDungeonChangeConsumable(item, Item.amount || 1); + } + } else if (KDWeapon(Item)) { + if (KinkyDungeonWeaponVariants[Item.name]) { + KDGiveWeaponVariant(KinkyDungeonWeaponVariants[Item.name], undefined, Item.name); + color = "#aaaaff"; + name = "Generic"; + replace = TextGet("KinkyDungeonInventoryItem" + KinkyDungeonWeaponVariants[Item.name].template); + } else { + let item = KinkyDungeonFindWeapon(Item.name); + priority = Math.min(8, item.rarity + 4); + color = "orange"; + KinkyDungeonInventoryAddWeapon(Item.name); + } + + } else if (KDRestraint(Item)) { + if (KinkyDungeonRestraintVariants[Item.name]) { + KDGiveInventoryVariant(KinkyDungeonRestraintVariants[Item.name], undefined, KinkyDungeonRestraintVariants[Item.name].curse, "", Item.name, undefined, undefined, undefined, Item.amount || 1); + color = "#aaaaff"; + name = "Generic"; + replace = TextGet("Restraint" + KinkyDungeonRestraintVariants[Item.name].template); + } else { + if (!KinkyDungeonInventoryGetLoose(Item.name)) { + KinkyDungeonInventoryAdd({name: Item.name, id: KinkyDungeonGetItemID(), + type: LooseRestraint, events:Item.events || KDGetEventsForRestraint(Item.name), quantity: Item.amount || 1}); + } else { + if (!KinkyDungeonInventoryGetLoose(Item.name).quantity) KinkyDungeonInventoryGetLoose(Item.name).quantity = 0; + KinkyDungeonInventoryGetLoose(Item.name).quantity += Item.amount || 1; + } + color = "#ffffff"; + name = "Generic"; + replace = TextGet("Restraint" + Item.name); + } + + } else if (KDOutfit(Item)) { + priority = 1; + color = "white"; + KinkyDungeonInventoryAddOutfit(Item.name); + } else if (Item.name == "Heart") { + if (KinkyDungeonStatDistractionMax >= KDMaxStat && KinkyDungeonStatStaminaMax >= KDMaxStat && KinkyDungeonStatManaMax >= KDMaxStat && KinkyDungeonStatWillMax >= KDMaxStat) { + KinkyDungeonDrawState = "Game"; + KDChangeStamina("tablet", "restore", "interact", 10); + KDChangeMana("tablet", "restore", "interact", 5); + KDChangeWill("tablet", "restore", "interact", 5.0); + KDGameData.HeartTaken = true; + } else if (KinkyDungeonIsPlayer()) { + KinkyDungeonDrawState = "Heart"; + KinkyDungeonInterruptSleep(); + KinkyDungeonDialogueTimer = CommonTime() + 700; + KinkyDungeonSetFlag("NoDialogue", 3); + } + } else if (Item.name == "Keyring") { + KDMapData.KeysHeld++; + KinkyDungeonAggroAction('key', {}); + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + sfx + ".ogg"); + if (!nomsg) { + KinkyDungeonSendActionMessage(priority, TextGet("ItemPickup" + name).replace("XXX", Item.amount).replace("ReplaceValue", replace), color, 1, false, false, undefined, "Items"); + if (!KDCanSeeDroppedItem(Item)) + KinkyDungeonSendActionMessage(priority + 1, TextGet("ItemFoundHidden").replace("XXX", Item.amount).replace("ReplaceValue", replace), color, 1, false, false, undefined, "Items"); + + } +} + + +function KDAllowUseItems(Message: boolean, _x?: number, _y?: number): boolean { + let ret = !KinkyDungeonStatsChoice.get("CantTouchThat") || KinkyDungeonHasHelp() || !(KinkyDungeonIsArmsBound() && !KinkyDungeonCanUseFeet() && KinkyDungeonIsHandsBound(false, true, 0.01)); + if (!ret && KinkyDungeonCanTalk()) { + if (KDGameData.KneelTurns > 0) {return true;} + if (Message) KinkyDungeonSendActionMessage(7, TextGet("KDMouthGround"), "#ffaa44", 3, undefined, true); + return false; + } + return ret; +} + +function KinkyDungeonItemCheck(x: number, y: number, _Index: number, autoEquip?: boolean) { + let allowManip = KDAllowUseItems(false, x, y); + let msg = false; + let pickedone = false; + for (let I = 0; I < KDMapData.GroundItems.length; I++) { + let item = KDMapData.GroundItems[I]; + if (x == item.x && y == item.y) { + if (allowManip + || (item.name == "Keyring" && "SsH".includes(KinkyDungeonMapGet(item.x, item.y))) + || (!pickedone && KinkyDungeonStatsChoice.get("Psychic") && x && y && KDistChebyshev(KinkyDungeonPlayerEntity.x-x, KinkyDungeonPlayerEntity.y - y) < 1.5)) { + KDMapData.GroundItems.splice(I, 1); + I -= 1; + pickedone = true; + KinkyDungeonItemEvent(item); + if (autoEquip && KDWeapon(item) && KinkyDungeonPlayerWeapon == "Unarmed") { + KDSetWeapon(item.name); + } + } else { + let point = null; + if (KinkyDungeonLastAction == "Move" && (KinkyDungeonPlayerEntity.lastx != KinkyDungeonPlayerEntity.x || KinkyDungeonPlayerEntity.lasty != KinkyDungeonPlayerEntity.y)) { + point = { + x: KinkyDungeonPlayerEntity.x * 2 - KinkyDungeonPlayerEntity.lastx, + y: KinkyDungeonPlayerEntity.y * 2 - KinkyDungeonPlayerEntity.lasty, + }; + if (!KinkyDungeonMovableTilesSmartEnemy.includes(KinkyDungeonMapGet(point.x, point.y))) point = null; + } + if (!point) + point = KinkyDungeonGetNearbyPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, undefined, true, true); + if (point) { + item.x = point.x; + item.y = point.y; + } + msg = true; + } + + } + } + if (msg) { + KinkyDungeonSendTextMessage(6, TextGet("KDCantTouchThat"), "#ff8933",1, false, true); + } +} + +function KDCanSeeDroppedItem(item: GroundItem): boolean { + if (KDDroppedItemProperties[item.name]?.tinyness <= KinkyDungeonBlindLevel) return false; + return true; +} + +/** + * @param item + */ +function KDGetItemType(item: Named): string { + if (KDWeapon(item)) return Weapon; + if (KDRestraint(item)) return LooseRestraint; + if (KDConsumable(item)) return Consumable; + if (KDOutfit(item)) return Outfit; + return Misc; +} + +function KinkyDungeonDrawItems(_canvasOffsetX: number, _canvasOffsetY: number, CamX: number, CamY: number) { + let sprite = null; + let counts = {}; + let max = 10; + for (let item of KDMapData.GroundItems) { + //if (KinkyDungeonGetRestraintByName(item.name)) sprite = "Restraint"; + if (item.x >= CamX && item.y >= CamY && item.x < CamX + KinkyDungeonGridWidthDisplay && item.y < CamY + KinkyDungeonGridHeightDisplay && KinkyDungeonVisionGet(item.x, item.y) > 0) { + let scale = 0.5; + if (KDRestraint({name: item.name}) && KDRestraintSpecial({name: item.name})) { + sprite = KinkyDungeonRootDirectory + "Items/Restraint.png"; + scale = 1; + } + else sprite = KDGetItemPreview({name: item.name, type: KDGetItemType(item)})?.preview || (KinkyDungeonRootDirectory + "Items/" + item.name + ".png"); + if (KDCanSeeDroppedItem(item)) { + KDDraw(kditemsboard, kdpixisprites, item.x + "," + item.y + "_" + item.name, sprite, + (item.x - CamX + ((0.25/max) * (counts[item.x + ',' + item.y] || 0)))*KinkyDungeonGridSizeDisplay, (item.y - CamY + (1 - scale))*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay*scale, KinkyDungeonGridSizeDisplay*scale); + if (!counts[item.x + ',' + item.y]) { + counts[item.x + ',' + item.y] = 0; + } + if (counts[item.x + ',' + item.y] < max) + counts[item.x + ',' + item.y] += 1; + } + } + } +} + + + +function KinkyDungeonDrawHeart() { + + DrawTextKD(TextGet("KinkyDungeonHeartIntro"), 1250, 200, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonHeartIntro1"), 1250, 300, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonHeartIntro2"), 1250, 350, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonHeartIntro3"), 1250, 400, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonHeartIntro4"), 1250, 450, "#ffffff", KDTextGray2); + + DrawTextKD(TextGet("StatDistraction").replace("PERCENT", "" + Math.round(100*KinkyDungeonStatDistractionMax / KDMaxStatStart)), 650 + 250/2, 650, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("StatStamina").replace("CURRENT/MAX", "" + KinkyDungeonStatStaminaMax * KDMaxStatStart), 950 + 250/2, 650, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("StatMana").replace("CURRENT/MAX", "" + KinkyDungeonStatManaMax * KDMaxStatStart), 1250 + 250/2, 650, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("StatWill").replace("CURRENT/MAX", "" + KinkyDungeonStatWillMax * KDMaxStatStart), 1550 + 250/2, 650, "#ffffff", KDTextGray2); + + // Fix softlock + //if ((KinkyDungeonStatDistractionMax > KDMaxStat && KinkyDungeonStatStaminaMax > KDMaxStat && KinkyDungeonStatManaMax > KDMaxStat && KinkyDungeonStatWillMax > KDMaxStat)) KinkyDungeonDrawState = "Game"; + + DrawButtonVis(650, 700, 250, 60, TextGet("KinkyDungeonHeartDistraction"), KinkyDungeonStatDistractionMax < KDMaxStat ? "#ffffff" : "#999999"); + DrawButtonVis(950, 700, 250, 60, TextGet("KinkyDungeonHeartStamina"), KinkyDungeonStatStaminaMax < KDMaxStat ? "#ffffff" : "#999999"); + DrawButtonVis(1250, 700, 250, 60, TextGet("KinkyDungeonHeartMana"), KinkyDungeonStatManaMax < KDMaxStat ? "#ffffff" : "#999999"); + DrawButtonVis(1550, 700, 250, 60, TextGet("KinkyDungeonHeartWill"), KinkyDungeonStatWillMax < KDMaxStat ? "#ffffff" : "#999999"); + + DrawButtonKDEx("discardheart", (_bdata) => { + KinkyDungeonDrawState = "Game"; + return true; + }, CommonTime() > KinkyDungeonDialogueTimer, 1000, 850, 450, 60, TextGet("KinkyDungeonHeartDiscard"), KinkyDungeonStatWillMax < KDMaxStat ? "#ffffff" : "#999999"); +} + +function KinkyDungeonHandleHeart() { + if (CommonTime() > KinkyDungeonDialogueTimer) { + if (MouseIn(650, 700, 250, 60) && KinkyDungeonStatDistractionMax < KDMaxStat) { + KDSendInput("heart", {type: "AP"}); + KinkyDungeonDrawState = "Game"; + } else if (MouseIn(950, 700, 250, 60) && KinkyDungeonStatStaminaMax < KDMaxStat) { + KDSendInput("heart", {type: "SP"}); + KinkyDungeonDrawState = "Game"; + } else if (MouseIn(1250, 700, 250, 60) && KinkyDungeonStatManaMax < KDMaxStat) { + KDSendInput("heart", {type: "MP"}); + KinkyDungeonDrawState = "Game"; + } else if (MouseIn(1550, 700, 250, 60) && KinkyDungeonStatWillMax < KDMaxStat) { + KDSendInput("heart", {type: "WP"}); + KinkyDungeonDrawState = "Game"; + } + } + + + return true; +} + +let KDCustomItems = { + "LeylineMap": () => { + KDStartDialog("LeylineMap", "", true, ""); + return { + sfx: undefined, + replace: undefined, + priority: undefined, + color: undefined, + }; + }, +}; + +/** + * @param items + * @param offset + */ +function KDDrawItemsTooltip(items: any[], offset: number): number { + let TooltipList = []; + TooltipList.push({ + str: TextGet("KDTooltipItems"), + fg: "#ffffff", + bg: "#000000", + size: 24, + center: true, + }); + let str = ""; + for (let item of items) { + str = str + (str ? ", " : "") + KDGetItemNameString(item.name); + } + let mult = KDGetFontMult(); + let strSplit = KinkyDungeonWordWrap(str, 12*mult, 28*mult).split('\n'); + + let i = 1; + const imax = 5; + for (let line of strSplit) { + TooltipList.push({ + str: (i == imax ? line.substring(0, line.length - 1) + "..." : line), + fg: "#dddddd", + bg: "#000000", + size: 18, + center: true, + }); + if (i >= imax) break; + i++; + } + + return KDDrawTooltip(TooltipList, offset); +} diff --git a/Game/src/item/KinkyDungeonLoot.ts b/Game/src/item/KinkyDungeonLoot.ts new file mode 100644 index 000000000..d9d32904e --- /dev/null +++ b/Game/src/item/KinkyDungeonLoot.ts @@ -0,0 +1,1172 @@ +"use strict"; + +let KinkyDungeonLostItems: item[] = []; +let KDTightRestraintsMod = 6; +let KDTightRestraintsMult = 2; + +let KDPartialLootRecoveryChance = 0.25; + +/** + * @param list + * @param excludeBound - "bound weapons", i.e. magic knives and weapons in really old nomenclature back when there were like 4 weapons + */ +function KinkyDungeonAddLostItems(list: item[], excludeBound: boolean) { + for (let item of list) { + let unique = true; + if (item.type && item.name == "Knife") unique = false; + for (let item2 of KinkyDungeonLostItems) { + if (item2.name == item.name) { + unique = false; + break; + } + } + if (!KinkyDungeonRestraintVariants[item.inventoryVariant || item.name] + && (KDRestraint(item)?.noRecover)) + unique = false; + if (!KinkyDungeonWeaponVariants[item.name] + && (KDWeapon(item)?.rarity < 3)) + unique = false; + + if (unique && (!excludeBound || item.type != Weapon || (KDWeapon(item).magic))) { + KinkyDungeonLostItems.push(item); + if (item.type == Consumable) { + item.quantity = Math.min(item.quantity, 10); + } + } else if (!unique && item.type == Consumable && item.quantity) { + for (let item2 of KinkyDungeonLostItems) { + if (item2.name == item.name) { + item2.quantity = Math.min(item2.quantity + item.quantity, 10); + break; + } + } + } + } +} + +let cursedRestraintCache = { + +}; + + +// Determines if you get a good loot from a blue locked chest +let KinkyDungeonSpecialLoot = false; +let KinkyDungeonLockedLoot = false; + +function KinkyDungeonLoot( + Level: number, + Index: string, + Type: string, + roll?: number, + tile?: any, + /** Used for the case where you only want to return the loot object and not execute it */ + returnOnly?: boolean, + noTrap?: boolean, + minWeight: number = 0.1, + minWeightFallback: boolean = true, + container?: KDContainer, lootType?: any[]): boolean | any { + let lootWeightTotal = 0; + let lootWeights: { loot: any; weight: number; }[] = []; + + if (!lootType) lootType = KinkyDungeonLootTable[Type]; + for (let loot of lootType) { + let effLevel = Level; + if (loot.trap && KinkyDungeonStatsChoice.has("TightRestraints")) { + effLevel *= KDTightRestraintsMult; + effLevel += KDTightRestraintsMod; + } + if ((effLevel >= loot.minLevel || KinkyDungeonNewGame > 0) && (loot.allFloors || loot.floors[Index])) { + let prereqs = true; + if (loot.arousalMode && !KinkyDungeonStatsChoice.get("arousalMode")) prereqs = false; + + + if (loot.noflag?.some((flag: string) => {return KinkyDungeonFlags.get(flag) != undefined;})) prereqs = false; + if (loot.notag?.some((flag: any) => {return KinkyDungeonPlayerTags.get(flag) != undefined;})) prereqs = false; + + if (loot.prerequisites && prereqs) { + + let maxlevel = 999; + let minlevel = 0; + let SpellList = null; + if (prereqs && (loot.minCurseCount != undefined || loot.maxCurseCount != undefined)) { + let count = KDCurseCount(loot.activatedCurseOnly); + if (count < loot.minCurseCount || count > loot.maxCurseCount) + prereqs = false; + } + + + if (prereqs && loot.hardmode && !KinkyDungeonStatsChoice.get("hardMode")) prereqs = false; + if (prereqs && loot.nohardmode && KinkyDungeonStatsChoice.get("hardMode")) prereqs = false; + if (prereqs && loot.prerequisites.includes("nopetsuit") && KinkyDungeonPlayerTags.get("NoPet")) prereqs = false; + if (prereqs && loot.prerequisites.includes("nokigu") && KinkyDungeonPlayerTags.get("NoKigu")) prereqs = false; + if (prereqs && loot.prerequisites.includes("noblindfold") && KinkyDungeonPlayerTags.get("NoBlindfolds")) prereqs = false; + if (prereqs && loot.prerequisites.includes("nofrontplug") && KinkyDungeonPlayerTags.get("arousalModePlugNoFront")) prereqs = false; + + if (prereqs && loot.prerequisites.includes("vibe") && KinkyDungeonPlayerTags.get("NoVibes")) prereqs = false; + if (prereqs && loot.prerequisites.includes("alreadyBelted") && KinkyDungeonChastityMult() < 0.9) prereqs = false; + if (prereqs && loot.prerequisites.includes("lowlevel")) maxlevel = 2; + if (prereqs && loot.prerequisites.includes("fewpick") && KinkyDungeonItemCount("Pick") >3) prereqs = false; + if (prereqs && loot.prerequisites.includes("lowpotions") && ( + KinkyDungeonItemCount("PotionFrigid") + KinkyDungeonItemCount("PotionMana") + KinkyDungeonItemCount("PotionStamina") > 10 + )) prereqs = false; + if (prereqs && loot.prerequisites.includes("lowmanapotions") && ( + KinkyDungeonItemCount("PotionMana") > 20 + )) prereqs = false; + if (prereqs && loot.prerequisites.includes("lowwillpotions") && ( + KinkyDungeonItemCount("PotionWill") > 15 + )) prereqs = false; + if (prereqs && loot.prerequisites.includes("UnlearnedElements")) SpellList = KinkyDungeonSpellList.Elements; + if (prereqs && loot.prerequisites.includes("UnlearnedConjure")) SpellList = KinkyDungeonSpellList.Conjure; + if (prereqs && loot.prerequisites.includes("UnlearnedIllusion")) SpellList = KinkyDungeonSpellList.Illusion; + if (prereqs && loot.prerequisites.includes("NoBoltCutters") && KinkyDungeonInventoryGet("BoltCutters")) prereqs = false; + else if (prereqs && loot.prerequisites.includes("LostItems") && KinkyDungeonLostItems.length < 1) prereqs = false; + else if (prereqs && loot.prerequisites.includes("LightRestraint") && KinkyDungeonAllRestraint().length < 1) prereqs = false; + else if (prereqs && loot.prerequisites.includes("ModerateRestraint") && KinkyDungeonAllRestraint().length < 4 && !(!KinkyDungeonIsHandsBound() && !KinkyDungeonCanTalk() && KinkyDungeonSlowLevel < 1)) prereqs = false; + if (prereqs && loot.prerequisites.includes("pearlChest") && !KDPearlRequirement()) prereqs = false; + + if (prereqs) + for (let prereq of loot.prerequisites) { + if (prereq.startsWith("Group_")) { + let group = prereq.substring(6); + let item = KinkyDungeonGetRestraintItem(group); + let power = item && KDRestraint(item) && KDRestraint(item).power ? KinkyDungeonRestraintPower(item) : 0; + if (power && (power + 0.01 >= loot.power || KDRestraint(item).enchanted)) { + prereqs = false; + break; + } + } + } + + if (SpellList != null && KinkyDungeonGetUnlearnedSpells(minlevel, maxlevel, SpellList).length == 0) { + prereqs = false; + } + + if (prereqs && loot.prerequisites.includes("hasBow")) { + prereqs = false; + for (let w of KinkyDungeonAllWeapon()) { + if (KDWeapon(w)?.tags?.includes("normalbow")) { + prereqs = true; + break; + } + } + } + } + if (KinkyDungeonGoddessRep.Ghost && loot.submissive && (KinkyDungeonGoddessRep.Ghost + 50 < loot.submissive)) prereqs = false; + if (prereqs && loot.noweapon) { + for (let w of loot.noweapon) { + if (KinkyDungeonInventoryGet(w)) { + prereqs = false; + break; + } + } + } + if (prereqs && loot.nospell) { + for (let s of loot.nospell) { + if (KDHasSpell(s)) { + prereqs = false; + break; + } + } + } + if (prereqs && loot.norestraint) { + for (let r of loot.norestraint) { + if (KinkyDungeonInventoryGet(r)) { + prereqs = false; + break; + } + } + } + // Check for cursed norestraint as well + if (prereqs && loot.norestraintcursed) { + let id = loot.norestraintcursed + `${loot.hexlevelmin || 0},${loot.hexlevelmax || 0}`; + if (!cursedRestraintCache[id]) cursedRestraintCache[id] = [...KinkyDungeonGetHexByList(loot.norestraintcursed, true, loot.hexlevelmin, loot.hexlevelmax)]; + for (let r of cursedRestraintCache[id]) { + if (KinkyDungeonInventoryGet(r)) { + prereqs = false; + break; + } + } + } + + if (prereqs) { + let weightMult = 1.0; + let weightBonus = 0; + if (loot.goddess) { + let grep = KinkyDungeonGoddessRep[loot.goddess]; + if (grep) { + weightBonus += loot.goddessWeight * grep/50; + } + } + if (loot.playerTags) + for (let tag in loot.playerTags) + if (KinkyDungeonPlayerTags.get(tag)) weightBonus += loot.playerTags[tag]; + if (Type == "chest") { + if (tile && tile.Special && loot.special) weightBonus += loot.special; + else if (tile && tile.Special) weightMult = 0; + if (tile && tile.RedSpecial && loot.redspecial) weightBonus += loot.redspecial; + } + + let rep = (KinkyDungeonGoddessRep.Ghost + 50)/100; + if (loot.trap || loot.magic) weightMult *= (1 + rep); + if (loot.trap && KinkyDungeonCurrentMaxEnemies > 0) { + let nonSumEnemies = 0; + for (let e of KDMapData.Entities) {if (!e.summoned) nonSumEnemies++;} + weightMult *= Math.max(0, 1 - 0.5*nonSumEnemies/KinkyDungeonCurrentMaxEnemies); + } + if (loot.trap && noTrap) + weightMult = 0; + + + let w = (loot.weight + weightBonus) * weightMult; + if (w > minWeight) { + lootWeights.push({loot: loot, weight: lootWeightTotal}); + lootWeightTotal += Math.max(0, w); + } + + } + } + } + + let selection = (roll ? roll : KDRandom()) * lootWeightTotal; + + for (let L = lootWeights.length - 1; L >= 0; L--) { + if (selection > lootWeights[L].weight) { + if (returnOnly) return lootWeights[L].loot; + for (let i = 0; i < (lootWeights[L].loot.count || 1); i++) { + let replace = KinkyDungeonLootEvent(lootWeights[L].loot, Level, TextGet(lootWeights[L].loot.message), lootWeights[L].loot.lock, container); + + if (!KinkyDungeonSendActionMessage(8, replace, lootWeights[L].loot.messageColor, lootWeights[L].loot.messageTime || 2)) + KinkyDungeonSendTextMessage(8, replace, lootWeights[L].loot.messageColor, lootWeights[L].loot.messageTime || 2, true, true); + + } + + return true; + } + } + // Go with it otherwise + if (minWeight > 0 && minWeightFallback) return KinkyDungeonLoot(Level, Index, Type, roll, tile, returnOnly, noTrap, 0, false, container); + return false; +} + + +/* +You find a scrap of a journal! (pg. 24) +From the journal of Catherine Edgar Willows, well-known explorer (who vanished in the dungeon 30 years ago) + +"Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?' + +They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. +Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence. + +So the question is not "why did somebody lay these traps." The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. + +As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with." +*/ + + +function KinkyDungeonLootEvent(Loot: any, Floor: number, Replacemsg: string, Lock?: string, container?: KDContainer): string { + let data = { + loot: Loot, + replacemsg: Replacemsg, + lock: Lock, + }; + KinkyDungeonSendEvent("loot", data); + + + Loot = data.loot; + Replacemsg = data.replacemsg; + Lock = data.lock; + + let levelPercent = KDGetEffLevel()/(KinkyDungeonMaxLevel - 1); + + let value = 0; + + if (Loot.weapon || Loot.weaponlist) { + let weapon = Loot.weapon; + + if (Loot.weaponlist) weapon = KDGetByWeight(KinkyDungeonGetWeaponsByListWeighted(Loot.weaponlist, false, (Loot.minRarity || 0), (Loot.maxRarity || 4))) || weapon; + + let enchantVariant = ""; + let enchant_extra = []; + let enchants = (Loot.minEnchants || 1) + Math.floor(KDRandom() * ((Loot.maxEnchants || 1) - (Loot.minEnchants || 1))); + + if (Loot.enchantlist && (Loot.enchantchance == undefined || KDRandom() < Loot.enchantchance + (Loot.enchantscale|| 0) * levelPercent)) { + while (enchants > 0) { + let ench = KDGetByWeight( + KinkyDungeonGetEnchantmentsByListWeighted(Loot.enchantlist, ModifierEnum.weapon, weapon, false, Loot.enchantlevelmin, Loot.enchantlevelmax, [enchantVariant, ...enchant_extra]) + ); + if (!enchantVariant) { + enchantVariant = ench; + } else { + enchant_extra.push(ench); + } + enchants -= 1; + } + } + + if (enchantVariant) { + let events = JSON.parse(JSON.stringify([])); // no weapon events needed due to the way it's referenced usually + if (enchantVariant) { + events.push(...KDEventEnchantmentModular[enchantVariant].types[KDModifierEnum.weapon].events(weapon, Loot, "", undefined, enchant_extra)); + } + for (let e of enchant_extra) { + events.push(...KDEventEnchantmentModular[e].types[KDModifierEnum.weapon].events(weapon, Loot, "", enchantVariant, enchant_extra)); + } + let variant: KDWeaponVariant = { + template: weapon, + events: events, + }; + KDGiveWeaponVariant(variant, KDEventEnchantmentModular[enchantVariant]?.prefix, undefined, KDEventEnchantmentModular[enchantVariant]?.suffix, container); + + if (Replacemsg) + Replacemsg = Replacemsg.replace("WeaponAcquired", (enchantVariant ? TextGet("KDVarPrefEnchanted") : "") + ' ' + TextGet("KinkyDungeonInventoryItem" + weapon)); + } else { + KDInvAddWeapon(container, weapon); + if (Replacemsg) + Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItem" + weapon)); + } + + } + if (Loot.spell) { + let spell = KinkyDungeonFindSpell(Loot.spell, true); + KDPushSpell(spell); + if (spell.autoLearn) { + for (let sp of spell.autoLearn) { + if (KinkyDungeonSpellIndex(sp) < 0) { + KDPushSpell(KinkyDungeonFindSpell(sp, true)); + KDSendStatus('learnspell', sp); + } + } + } + if (spell.learnFlags) { + for (let sp of spell.learnFlags) { + KinkyDungeonFlags.set(sp, -1); + } + } + + if (spell.learnPage) { + for (let sp of spell.learnPage) { + KDAddSpellPage(sp, KDSpellColumns[sp] || []); + } + } + if (Replacemsg) + Replacemsg = Replacemsg.replace("SpellLearned", TextGet("KinkyDungeonSpell" + Loot.spell)); + } + else if (Loot.armor || Loot.armortags) { + let armor = Loot.armor; + let hexed = Loot.hexlist && (Loot.hexchance == undefined || KDRandom() < Loot.hexchance + (Loot.hexscale|| 0) * levelPercent || (Loot.nouncursed && !Loot.enchantlist && KinkyDungeonInventoryGet(Loot.nouncursed))); + let forceequip = Loot.forceEquip || (hexed && (Loot.forceEquipCursed || KinkyDungeonStatsChoice.get("CurseSeeker"))) || (!hexed && (Loot.forceEquipUncursed)); + if (Loot.noForceEquip) forceequip = false; + if (Loot.armortags) { + let newarmor = KinkyDungeonGetRestraint({tags: Loot.armortags}, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, "", + undefined, undefined, undefined, undefined, true, undefined, undefined, undefined, forceequip); + if (!newarmor && forceequip) { + KinkyDungeonGetRestraint({tags: Loot.armortags}, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, "", + undefined, undefined, undefined, undefined, true, undefined, undefined, undefined, false); + } + if (newarmor) armor = newarmor.name; + } + let unlockcurse = null; + let hexVariant = ""; + let enchantVariant = ""; + let enchant_extra = []; + let hex_extra = []; + let enchants = (Loot.minEnchants || 1) + Math.floor(KDRandom() * ((Loot.maxEnchants || 1) - (Loot.minEnchants || 1))); + let curses = (Loot.minHex || 1) + Math.floor(KDRandom() * ((Loot.maxHex || 1) - (Loot.minHex || 1))); + if (hexed) { + while (curses > 0) { + let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted(Loot.hexlist, armor, false, Loot.hexlevelmin, Loot.hexlevelmax, [hexVariant, ...hex_extra])); + if (!enchantVariant) { + hexVariant = curs; + // Sets the armor to the cursed type + armor = armor+(Loot.cursesuffix != undefined ? Loot.cursesuffix : (KDGetCursedSuffix(armor)) || Loot.hexlist); + } else { + hex_extra.push(curs); + } + curses -= 1; + } + } + if (Loot.enchantlist && (Loot.enchantchance == undefined || KDRandom() < Loot.enchantchance + (Loot.enchantscale|| 0) * levelPercent || (Loot.nouncursed && !hexVariant && KinkyDungeonInventoryGet(Loot.nouncursed)) || (hexVariant && Loot.alwaysenchanthex))) { + while (enchants > 0) { + let ench = KDGetByWeight( + KinkyDungeonGetEnchantmentsByListWeighted(Loot.enchantlist, ModifierEnum.restraint, armor, false, Loot.enchantlevelmin, Loot.enchantlevelmax, [enchantVariant, ...enchant_extra]) + ); + if (!enchantVariant) { + enchantVariant = ench; + } else { + enchant_extra.push(ench); + } + enchants -= 1; + } + } + if (Loot.unlockcurse && (hexVariant || !Loot.hexlist) && (Loot.cursechance == undefined || KDRandom() < Loot.cursechance + (Loot.cursescale|| 0) * levelPercent)) { + let curselist = []; + for (let c of Loot.unlockcurse) { + curselist.push(c); + } + unlockcurse = KDGetByWeight(KinkyDungeonGetCurseByListWeighted(curselist, armor, false, Loot.hexlevelmin, Loot.hexlevelmax)); + } + if (hexVariant || enchantVariant) { + let events: KinkyDungeonEvent[] = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); + let variant: KDRestraintVariant = { + template: armor, + events: events, + }; + if (hexVariant) { + events.push(...KDEventHexModular[hexVariant].events({variant: variant})); + } + for (let c of hex_extra) { + events.push(...KDEventHexModular[c].events({variant: variant})); + } + if (enchantVariant) { + events.push(...KDEventEnchantmentModular[enchantVariant].types[KDModifierEnum.restraint].events(armor, Loot, hexVariant, enchantVariant, enchant_extra, {variant: variant})); + } + for (let e of enchant_extra) { + events.push(...KDEventEnchantmentModular[e].types[KDModifierEnum.restraint].events(armor, Loot, hexVariant, enchantVariant, enchant_extra, {variant: variant})); + } + + let equipped = 0; + if (forceequip) { + equipped = KDEquipInventoryVariant(variant, KDEventEnchantmentModular[enchantVariant]?.prefix, 0, true, undefined, true, false, Loot.faction || (unlockcurse ? "Curse" : undefined), true, unlockcurse, undefined, false, undefined, undefined, KDEventEnchantmentModular[enchantVariant]?.suffix); + } + if (!equipped) { + KDGiveInventoryVariant(variant, KDEventEnchantmentModular[enchantVariant]?.prefix, unlockcurse, undefined, undefined, KDEventEnchantmentModular[enchantVariant]?.suffix, Loot.faction || (unlockcurse ? "Curse" : undefined), undefined, undefined, container); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDCursedChestEquip" + (unlockcurse ? "Cursed" : "")) + .replace("NEWITM", TextGet("Restraint" + variant.template)), + "#aa88ff", 10); + } + + if (Replacemsg) + Replacemsg = Replacemsg.replace("ArmorAcquired", (enchantVariant ? TextGet("KDVarPrefEnchanted") : "") + ' ' + TextGet("Restraint" + armor)); + } else { + KDInvAddLoose(container, armor, unlockcurse, Loot.faction || (unlockcurse ? "Curse" : undefined)); + if (Replacemsg) + Replacemsg = Replacemsg.replace("ArmorAcquired", TextGet("Restraint" + armor)); + } + + } + else if (Loot.name == "spell_points") { + let amount = 1; + KinkyDungeonSpellPoints += amount; + KinkyDungeonSendFloater({x: 1100, y: 800 - KDRecentRepIndex * 40}, `+${amount} Spell Points!!!`, "#8888ff", 5, true); + KDRecentRepIndex += 1; + if (Replacemsg) + Replacemsg = Replacemsg.replace("AMOUNT", "" + amount); + } + else if (Loot.name == "spell_illusion_low") { + let SpellsUnlearned = KinkyDungeonGetUnlearnedSpells(0, 2, KinkyDungeonSpellList.Illusion); + let spellIndex = Math.floor(KDRandom()*SpellsUnlearned.length); + + let spell = SpellsUnlearned[spellIndex]; + if (Replacemsg) + Replacemsg = Replacemsg.replace("SpellLearned", TextGet("KinkyDungeonSpell" + spell.name)); + KDPushSpell(spell); + } + else if (Loot.name == "spell_conjuration_low") { + let SpellsUnlearned = KinkyDungeonGetUnlearnedSpells(0, 2, KinkyDungeonSpellList.Conjure); + let spellIndex = Math.floor(KDRandom()*SpellsUnlearned.length); + + let spell = SpellsUnlearned[spellIndex]; + if (Replacemsg) + Replacemsg = Replacemsg.replace("SpellLearned", TextGet("KinkyDungeonSpell" + spell.name)); + KDPushSpell(spell); + } + else if (Loot.name == "spell_elemental_low") { + let SpellsUnlearned = KinkyDungeonGetUnlearnedSpells(0, 2, KinkyDungeonSpellList.Elements); + let spellIndex = Math.floor(KDRandom()*SpellsUnlearned.length); + + let spell = SpellsUnlearned[spellIndex]; + if (Replacemsg) + Replacemsg = Replacemsg.replace("SpellLearned", TextGet("KinkyDungeonSpell" + spell.name)); + KDPushSpell(spell); + } + else if (Loot.name == "pearlReward") { + let rewardAvailable = []; + for (let rep of Object.entries(KinkyDungeonGoddessRep)) { + let rewards = KDBlessedRewards[rep[0]]; + if (rewards && rep[1] > 45) { + for (let r of rewards) { + if (!KinkyDungeonInventoryGet(r)) { + rewardAvailable.push(r); + } + } + } + } + let reward = rewardAvailable[Math.floor(KDRandom() * rewardAvailable.length)]; + if (KinkyDungeonWeapons[reward]) { + KDInvAddWeapon(container, reward); + if (Replacemsg) + Replacemsg = Replacemsg.replace("ITEMGET", TextGet("KinkyDungeonInventoryItem" + reward)); + } + else if (KinkyDungeonFindSpell(reward, true)) { + KDPushSpell(KinkyDungeonFindSpell(reward, true)); + if (Replacemsg) + Replacemsg = Replacemsg.replace("ITEMGET", TextGet("KinkyDungeonSpell" + reward)); + } + else if (KinkyDungeonConsumables[reward]) { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables[reward], 1); + if (Replacemsg) + Replacemsg = Replacemsg.replace("ITEMGET", TextGet("KinkyDungeonInventoryItem" + reward)); + } + else { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); + if (Replacemsg) + Replacemsg = Replacemsg.replace("ITEMGET", TextGet("KinkyDungeonInventoryItemAncientPowerSource")); + } + + } + else if (Loot.name == "gold") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + } + else if (Loot.name == "biggold") { + value = Math.ceil((250 + 100 * KDRandom()) * (1 + Floor/40)); + } + else if (Loot.name == "smallgold") { + value = Math.ceil((25 + 15 * KDRandom()) * (1 + Floor/35)); + } + else if (Loot.name == "knife") { + KDInvAddWeapon(container, "Knife"); + } + else if (Loot.name == "magicknife") { + KDInvAddWeapon(container, "EnchKnife"); + } + else if (Loot.name == "pick") { + KDAddConsumable("Pick", 1, container); + } + else if (Loot.name == "redkey") { + KDAddConsumable("RedKey", 1, container); + } + else if (Loot.name == "bluekey") { + KDAddConsumable("BlueKey", 1, container); + } + else if (Loot.name == "grinder") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.EnchantedGrinder, 1, container); + } + else if (Loot.name == "bola") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.Bola, 2, container); + } + else if (Loot.name == "bomb") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.Bomb, 1, container); + } + else if (Loot.name == "gunpowder") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.Gunpowder, 3 + Math.floor(KDRandom() * 3), container); + } + else if (Loot.name == "MistressKey") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.MistressKey, 1, container); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 2, container); + } + else if (Loot.name == "DivineTear") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.DivineTear, 1, container); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 2, container); + } + else if (Loot.name == "Scrolls") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 2); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollArms, 2 + Math.floor(KDRandom() * 3), container); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollLegs, 2 + Math.floor(KDRandom() * 3), container); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollVerbal, 2 + Math.floor(KDRandom() * 3), container); + } + else if (Loot.name == "scroll_legs") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollLegs, 1, container); + } + else if (Loot.name == "scroll_arms") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollArms, 1, container); + } + else if (Loot.name == "scroll_verbal") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollVerbal, 1, container); + } + else if (Loot.name == "scrolls_basic") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollArms, 1 + Math.floor(KDRandom() * 3), container); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollLegs, 1 + Math.floor(KDRandom() * 3), container); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollVerbal, 1 + Math.floor(KDRandom() * 3), container); + } + else if (Loot.name == "scrolls_purity") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollPurity, 1, container); + } + else if (Loot.name == "AncientCores") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, Loot.count ? Loot.count : 2, container); + } + else if (Loot.name == "AncientCoreSingle") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, Loot.count ? Loot.count : 1, container); + } + else if (Loot.name == "AncientCoreSingleSpent") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSourceSpent, Loot.count ? Loot.count : 1, container); + } + else if (Loot.name == "EnchantedBelt"||Loot.name == "EnchantedBra"||Loot.name == "EnchantedHeels"||Loot.name == "EnchantedAnkleCuffs"||Loot.name == "EnchantedMuzzle"||Loot.name == "EnchantedBlindfold"||Loot.name == "EnchantedMittens"||Loot.name == "EnchantedBallGag"||Loot.name == "EnchantedArmbinder") { + let restraint = KinkyDungeonGetRestraintByName(Loot.name); + KDInvAdd(container, {name: Loot.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events: Object.assign([], restraint.events)}); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1, container); + } + else if (Loot.name == "PotionCollar") { + let restraint = KinkyDungeonGetRestraintByName("PotionCollar"); + KDInvAdd(container, {name: Loot.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events: Object.assign([], restraint.events)}); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1, container); + } + else if (Loot.name == "weapon_boltcutters") { + KDInvAddWeapon(container, "BoltCutters"); + if (Replacemsg) + Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItemBoltCutters")); + } + else if (Loot.name == "weapon_spear") { + KDInvAddWeapon(container, "Spear"); + if (Replacemsg) + Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItemSpear")); + } + else if (Loot.name == "weapon_flail") { + KDInvAddWeapon(container, "Flail"); + if (Replacemsg) + Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItemFlail")); + } + else if (Loot.name == "staff_flame") { + KDInvAddWeapon(container, "StaffFlame"); + if (Replacemsg) + Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItemStaffFlame")); + } + else if (Loot.name == "staff_bind") { + KDInvAddWeapon(container, "StaffBind"); + if (Replacemsg) + Replacemsg = Replacemsg.replace("WeaponAcquired", TextGet("KinkyDungeonInventoryItemStaffBind")); + } + else if (Loot.name == "potions_mana") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 3+Math.floor(KDRandom()*2), container); + } + else if (Loot.name == "manaorb") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ManaOrb, 1, container); + } + else if (Loot.name == "manaorbmany") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ManaOrb, 3, container); + } + else if (Loot.name == "potions_will") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, 2+Math.floor(KDRandom()*2), container); + } + else if (Loot.name == "potions_many") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 2+Math.floor(KDRandom()*2), container); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionStamina, 1+Math.floor(KDRandom()*3), container); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionFrigid, Math.floor(KDRandom()*3), container); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, Math.floor(KDRandom()*3), container); + } + else if (Loot.name == "potion_mana") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 1, container); + } + else if (Loot.name == "potion_stamina") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionStamina, 1, container); + } + else if (Loot.name == "potion_will") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, 1, container); + } + else if (Loot.name == "potion_frigid") { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionFrigid, 1, container); + } + else if (Loot.name == "trap_armbinder") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapArmbinder"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, "", undefined, Loot.trap); + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapArmbinder")); + } + else if (Loot.name == "trap_armbinderHeavy") { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapArmbinder"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + let harness = KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapArmbinderHarness"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, KinkyDungeonGenerateLock(true)); + if (Replacemsg) + if (!harness) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapArmbinder")); + else Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapArmbinderHarness")); + } + else if (Loot.name == "trap_cuffs") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapCuffs"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapCuffs")); + } + else if (Loot.name == "trap_harness") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapHarness"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapHarness")); + } + else if (Loot.name == "trap_gag") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapGag"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapGag")); + } + else if (Loot.name == "trap_gagHeavy") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("PanelGag"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + KDMapData.TrapsTriggered++; + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintPanelGag")); + } + else if (Loot.name == "trap_mithrilankle") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MithrilAnkleCuffs"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + KDMapData.TrapsTriggered++; + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintMithrilAnkleCuffs")); + } + else if (Loot.name == "trap_mitts") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapMittens"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + KDMapData.TrapsTriggered++; + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapMittens")); + } + else if (Loot.name == "trap_blindfold") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBlindfold"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapBlindfold")); + } + else if (Loot.name == "trap_boots") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBoots"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapBoots")); + } + else if (Loot.name == "trap_legirons") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapLegirons"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapLegirons")); + } + else if (Loot.name == "trap_belt") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibe"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapVibe")); + } + else if (Loot.name == "trap_protobelt") { + value = Math.ceil((200 + 100 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibeProto"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBeltProto"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapVibe")); + } + else if (Loot.name == "trap_beltonly") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapBelt")); + } + else if (Loot.name == "trap_plug") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + KDMapData.TrapsTriggered++; + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug")); + } + else if (Loot.name == "trap_plug_tease") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug2"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + KDMapData.TrapsTriggered++; + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug2")); + } + else if (Loot.name == "trap_plug_torment") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug3"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + KDMapData.TrapsTriggered++; + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug3")); + } + else if (Loot.name == "trap_plug_thunder") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug4"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + KDMapData.TrapsTriggered++; + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug4")); + } + else if (Loot.name == "trap_nipple") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("NippleClamps"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBra"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, Lock ? Lock : KinkyDungeonGenerateLock(true, undefined, true), undefined, Loot.trap); + KDMapData.TrapsTriggered++; + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintNippleClamps")); + } + else if (Loot.name == "trap_plug2") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibe"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt2"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, (MiniGameKinkyDungeonLevel > 5 || KinkyDungeonNewGame > 0) ? "Gold" : "Red", undefined, Loot.trap); + KDMapData.TrapsTriggered++; + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug")); + } + else if (Loot.name == "trap_plug2_torment") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapVibe"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug3"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt2"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, (MiniGameKinkyDungeonLevel > 5 || KinkyDungeonNewGame > 0) ? "Gold" : "Red", undefined, Loot.trap); + KDMapData.TrapsTriggered++; + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapPlug3")); + } + else if (Loot.name == "trap_nipple2") { + value = Math.ceil((150 + 50 * KDRandom()) * (1 + Floor/40)); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("NippleClamps"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBra2"), MiniGameKinkyDungeonLevel / KDLevelsPerCheckpoint, true, (MiniGameKinkyDungeonLevel > 5 || KinkyDungeonNewGame > 0) ? "Gold" : "Red", undefined, false); + KDMapData.TrapsTriggered++; + if (Replacemsg) + Replacemsg = Replacemsg.replace("RestraintType", TextGet("RestraintTrapBra2")); + } + else if (Loot.name == "trap_book") { + let spell = null; + if (KDRandom() < 0.33) { + spell = KinkyDungeonFindSpell("TrapRopeStrong", true); + } else if (KDRandom() < 0.5) { + spell = KinkyDungeonFindSpell("TrapMagicChainsWeak", true); + } else { + spell = KinkyDungeonFindSpell("TrapRibbons", true); + } + if (spell) { + KinkyDungeonCastSpell(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, spell, undefined, undefined, undefined); + KDMapData.TrapsTriggered++; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/MagicSlash.ogg"); + } + } + else if (Loot.name == "lost_clothes") { + let outfit = {name: "Default", id: KinkyDungeonGetItemID(), type: Outfit}; + if (!KinkyDungeonInventoryGet("Default")) KDInvAdd(container, outfit); + } + else if (Loot.name == "lost_items") { + if (!KinkyDungeonInventoryGet("Default")) { + KDInvAdd(container, {name: "Default", id: KinkyDungeonGetItemID(), type: Outfit}); + } + let newLostItems = []; + let recovOne = false; + for (let I = 0; I < KinkyDungeonLostItems.length; I++) { + let lostitem = KinkyDungeonLostItems[I]; + + if (lostitem) { + if (!KinkyDungeonStatsChoice.get("itemPartialMode") || KDRandom() < KDPartialLootRecoveryChance || (!recovOne && I == KinkyDungeonLostItems.length-1)) { + let remove = false; + let existingitem = KinkyDungeonGetInventoryItem(lostitem.name, lostitem.type); + if (existingitem && existingitem.item) { + if (KDConsumable(existingitem.item)) { + if (lostitem.name != "MistressKey") { + if (!existingitem.item.quantity) existingitem.item.quantity = lostitem.quantity; + else existingitem.item.quantity += lostitem.quantity; + KinkyDungeonSendFloater({x: KinkyDungeonPlayerEntity.x - 1 + 2 * KDRandom(), y: KinkyDungeonPlayerEntity.y - 1 + 2 * KDRandom()}, + `+${lostitem.quantity} ${TextGet("KinkyDungeonInventoryItem" + lostitem.name)}`, "white", 5); + } else + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonMistressKeysTakenAway"), "orange", 2); + } + } else { + if (lostitem.type == Consumable && KDConsumable(lostitem)) { + if (lostitem.name != "MistressKey") + KinkyDungeonSendFloater({x: KinkyDungeonPlayerEntity.x - 1 + 2 * KDRandom(), y: KinkyDungeonPlayerEntity.y - 1 + 2 * KDRandom()}, + `+${lostitem.quantity} ${TextGet("KinkyDungeonInventoryItem" + lostitem.name)}`, "white", 4); + else + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonMistressKeysTakenAway"), "orange", 2); + remove = true; + } if (lostitem.type == Weapon && KDWeapon(lostitem) && !KinkyDungeonInventoryGet(lostitem.name)) { + //KinkyDungeonSendFloater({x: KinkyDungeonPlayerEntity.x - 1 + 2 * KDRandom(), y: KinkyDungeonPlayerEntity.y - 1 + 2 * KDRandom()}, + //`+${TextGet("KinkyDungeonInventoryItem" + lostitem.name)}`, "white", 6); + remove = true; + } else if (lostitem.type == Outfit && KDOutfit(lostitem) && !KinkyDungeonInventoryGet(lostitem.name)) { + //KinkyDungeonSendFloater({x: KinkyDungeonPlayerEntity.x - 1 + 2 * KDRandom(), y: KinkyDungeonPlayerEntity.y - 1 + 2 * KDRandom()}, + //`+${TextGet("KinkyDungeonInventoryItem" + lostitem.name)}`, "white", 7); + remove = true; + } else if (lostitem.type == LooseRestraint && KDRestraint(lostitem) && !KinkyDungeonInventoryGet(lostitem.name)) { + //if (KinkyDungeonGetRestraintByName(lostitem.name).armor || KinkyDungeonRestraintVariants[lostitem.name] != undefined) + //KinkyDungeonSendFloater({x: KinkyDungeonPlayerEntity.x - 1 + 2 * KDRandom(), y: KinkyDungeonPlayerEntity.y - 1 + 2 * KDRandom()}, + //`+ (loose) ${TextGet("Restraint" + lostitem.name)}`, "white", 5); + remove = true; + } + } + if (remove) { + if (lostitem.name != "MistressKey") { + //if (lostitem.looserestraint && lostitem.looserestraint.enchanted) { + //KinkyDungeonInventory.unshift(lostitem); + //} else + //if (KinkyDungeonRestraintVariants[lostitem.name]) KDGiveInventoryVariant() + + + recovOne = true; + KinkyDungeonItemEvent( + lostitem, + KDRestraint(lostitem)?.armor + || !!KinkyDungeonRestraintVariants[lostitem.name]); + } + //KinkyDungeonLostItems.splice(I, 1); + //I -= 1; + } + } else { + newLostItems.push(lostitem); + } + } + } + KinkyDungeonLostItems = newLostItems; + } + if (KDLootEvents[Loot.name]) { + let ret = KDLootEvents[Loot.name](Loot, Floor, Replacemsg, Lock, container); + if (ret.value) value = ret.value; + if (ret.Replacemsg) Replacemsg = ret.Replacemsg; + } + + + if (Loot.trap) { + if (!Loot.noSmoke) { + KDSmokePuff(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 2.9, 0.4); + } + KDSendStatus('bound', Loot.name, "chest"); + } + + if (value > 0) { + if (Replacemsg) + Replacemsg = Replacemsg.replace("XXX", "" + value); + KinkyDungeonAddGold(value); + } + return Replacemsg; +} + + +function KinkyDungeonAddGold(value: number) { + if (!isNaN(value)) { + KinkyDungeonGold += value; + //if (ArcadeDeviousChallenge && KinkyDungeonDeviousDungeonAvailable()) CharacterChangeMoney(Player, Math.round(value/10)); + let pre = value >= 0 ? "+" : ""; + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, pre + `${value} GP`, "white", 3.5); + } else KinkyDungeonSendActionMessage(10, "Error, the thing you just did would have set your gold to infinity. Please report.", "white", 4); + +} + + +function KDSpawnLootTrap(x: number, y: number, _trap: any, _mult: number, duration: number) { + let spawned = 0; + /*let maxspawn = 1 + Math.round(Math.min(2 + KDRandom() * 2, KinkyDungeonDifficulty/25) + Math.min(2 + KDRandom() * 2, 0.5*MiniGameKinkyDungeonLevel/KDLevelsPerCheckpoint)); + if (mult) maxspawn *= mult; + let requireTags = trap ? [trap] : undefined; + + let tags = ["trap", trap]; + KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); + + for (let i = 0; i < 30; i++) { + if (spawned < maxspawn) { + let Enemy = KinkyDungeonGetEnemy( + tags, MiniGameKinkyDungeonLevel + KinkyDungeonDifficulty/5, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + '0', requireTags, true); + if (Enemy) { + let pass = false; //KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, Enemy.name, 1, 7, true, (duration || Enemy.tags.construct) ? (duration || 40) : undefined, undefined, false, "Ambush", true, 1.5, true, undefined, true, true); + if (pass) { + if (Enemy.tags.minor) spawned += 0.5; + else if (Enemy.tags.elite) spawned += 1.5; + else if (Enemy.tags.miniboss) spawned += 2; + else if (Enemy.tags.boss) spawned += 4; + else spawned += 1; + if (Enemy.summonTags) { + for (let t of Enemy.summonTags) { + if (!tags.includes(t)) tags.push(t); + } + } + if (Enemy.summonTagsMulti) { + for (let t of Enemy.summonTagsMulti) { + tags.push(t); + } + } + } + } + } + }*/ + + for (let tile of KDNearbyTiles(x, y, 2.5)) { + if (tile.tile.lootTrapEnemy) { + let etiles = Object.values(KDGetEffectTiles(tile.x, tile.y)).filter((etile) => { + return etile.tags && etile.tags.includes("runesummon"); + }); + if (etiles?.length > 0) { + let Enemy = KinkyDungeonGetEnemyByName(tile.tile.lootTrapEnemy); + if (Enemy) { + let created = KinkyDungeonSummonEnemy(tile.x, tile.y, Enemy.name, 1, 0.5, true, (duration || Enemy.tags.construct) ? (duration || 40) : undefined, undefined, false, "Ambush", true, undefined, true, undefined, duration > 300, false); + if (tile.tile.lootTrapEnemy) { + for (let en of created) { + en.teleporting = tile.tile.lootTrapEnemy; + en.teleportingmax = tile.tile.lootTrapEnemy; + } + } + if (created.length > 0) + spawned += created.length; + for (let et of etiles) { + et.duration = 0; + } + delete tile.tile.lootTrapEnemy; + } + } + } + + } + if (spawned > 0) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/MagicSlash.ogg"); + KinkyDungeonMakeNoise(12, x, y); + KinkyDungeonSendTextMessage(10, TextGet("LootChestTrap"), "#ff8933", 2); + } +} + +function KDGenChestTrap(guaranteed: boolean, x: number, y: number, chestType: string, lock: any, noTrap: boolean): any { + let trap = undefined; + if (chestType && chestType != "cache" && chestType != "chest" && chestType != "silver" && !KDTrapChestType[chestType]) return undefined; + if (lock && KDRandom() < 0.8) return undefined; + if (guaranteed || KDRandom() < (noTrap ? 0.4 : 1.0)) { + if (KDTrapChestType[chestType]) return KDTrapChestType[chestType](guaranteed, x, y, chestType, lock, noTrap); + else return KDTrapChestType.default(guaranteed, x, y, chestType, lock, noTrap); + } + return trap; +} + +let KDChestTrapWeights = { + metalTrap: { + weight: () => {return 100 - (KinkyDungeonGoddessRep.Metal);}, + mult: 1, + time: 2, + }, + leatherTrap: { + weight: () => {return 100 - (KinkyDungeonGoddessRep.Leather);}, + mult: 1.2, + time: 2, + }, + latexTrap: { + weight: () => {return 100 - (KinkyDungeonGoddessRep.Latex);}, + mult: 1.2, + time: 2, + }, + ropeTrap: { + weight: () => {return 110 - (KinkyDungeonGoddessRep.Rope) - (KinkyDungeonGoddessRep.Conjure);}, + mult: 1.4, + time: 2, + }, + illusionTrap: { + weight: () => {return 100 - (KinkyDungeonGoddessRep.Illusion);}, + mult: 1, + }, + skeletonTrap: { + weight: () => {return KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]?.enemyTags?.includes("skeleton") ? 300 : 0;}, + mult: 1.4, + }, + zombieTrap: { + weight: () => {return KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]?.enemyTags?.includes("zombie") ? 300 : 0;}, + mult: 1.5, + }, + mummyTrap: { + weight: () => {return KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]?.enemyTags?.includes("mummy") ? 300 : 0;}, + mult: 1, + }, + mushroomTrap: { + weight: () => {return KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]?.enemyTags?.includes("mushroom") ? 300 : 0;}, + mult: 1, + }, +}; + +type trapChestFunc = (guaranteed: boolean, x: number, y: number, chestType: string, lock: any, noTrap: boolean) => { trap: string, mult: number, time: number, duration?: number }; + +let KDTrapChestType: Record = { + "default" : (_guaranteed, _x, _y, _chestType, _lock, _noTrap) => { + let obj = KDGetWeightedString(KDChestTrapWeights) || "metalTrap"; + return {trap: obj, mult: KDChestTrapWeights[obj].mult, time: KDChestTrapWeights[obj].time}; + }, + "shadow" : (_guaranteed, _x, _y, _chestType, _lock, _noTrap) => { + return {trap: "shadowTrap", mult: 2.5, duration: 300, time: 3}; + }, +}; + +function KDTriggerLoot(Loot: string, Type: string) { + let lootobj = KinkyDungeonLootTable[Type].find((element) => {return element.name == Loot;}); + console.log(KinkyDungeonLootEvent(lootobj, MiniGameKinkyDungeonLevel, lootobj.message)); +} + +/** + * @param WeightList - contains values that have a weight param + */ +function KDGetWeightedString(WeightList: Record, params?: any): any { + let WeightTotal = 0; + let Weights = []; + + for (let obj of Object.entries(WeightList)) { + Weights.push({obj: obj[0], weight: WeightTotal}); + WeightTotal += obj[1].weight(params); + } + + let selection = KDRandom() * WeightTotal; + + for (let L = Weights.length - 1; L >= 0; L--) { + if (selection > Weights[L].weight) { + return Weights[L].obj; + } + } + return null; +} + +/** + * @param tags - Type of restraint + */ +function KDCanCurse(tags: string[]): boolean { + return KDCheckPrereq(undefined, "AlreadyCursed", {tags: tags, type: undefined, trigger: undefined}, {}); +} + +/** + * Helper function used to summon cursed epicenters + * @param x + * @param y + */ +function KDSummonCurseTrap(x: number, y: number) { + let enemy = KinkyDungeonGetEnemy(["curseTrap"], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["epicenter"]); + if (enemy) { + let point = {x: x, y: y};//KinkyDungeonGetNearbyPoint(x, y, true); + if (point) { + let en = DialogueCreateEnemy(point.x, point.y, enemy.name); + + en.teleporting = 4; + en.teleportingmax = 4; + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/SummonCurse.ogg"); + KinkyDungeonSendTextMessage(8, TextGet("KDSummonCurse"), "#9074ab", 5); + } + } +} + + +function KDGenerateMinorLoot(lootType: string, coord: WorldCoord, tile: any, x: number, y: number, container: KDContainer) { + if (KDMinorLootTable[lootType]) { + let type = KDMinorLootTable[lootType]; + let count = 1 + type.rarity + (type.extraQuantity || 0); + let loots: any[] = []; + for (let i = 0; i < count; i++) { + loots.push( + KinkyDungeonLoot(coord.mapY, + KDGetWorldMapLocation({x: coord.mapX, y: coord.mapY})?.data[coord.room]?.Checkpoint || KDGetCurrentCheckpoint(), + lootType, undefined, tile, true, true, undefined, undefined, + container, type.options + ) + ); + } + for (let l of loots) { + let itemType = KDGetItemType(l); + if (itemType == Consumable) { + KDAddConsumable(l.name, (l.quantity || 1) + Math.floor(KDRandom() * l.extraQuantity || 0), container); + } else if (itemType == Weapon && !container.items[l.name]) { + KDInvAddWeapon(container, l.name); + } else if (itemType == LooseRestraint) { + KDInvAddLoose(container, l.name, undefined, tile.Faction, + (l.quantity || 1) + Math.floor(KDRandom() * l.extraQuantity || 0)); + } + } + } +} + +function KDGetCursedSuffix(armor: string) { + if (KDRestraint({name: armor + "Cursed"})) return "Cursed"; + if (KDRestraint({name: armor + "Common"})) return "Common"; + + return ""; +} + +function KDGetCursedTags(item: item): string[] { + let params = KDGetMapParams(); + if (params?.curseTags) { + return params.curseTags; + } + return ["trap"]; +} \ No newline at end of file diff --git a/Game/src/item/KinkyDungeonLootList.ts b/Game/src/item/KinkyDungeonLootList.ts new file mode 100644 index 000000000..0b1ff0a25 --- /dev/null +++ b/Game/src/item/KinkyDungeonLootList.ts @@ -0,0 +1,1537 @@ +"use strict"; + +let KDBasicArmorWeight = 4.7; +let KDBasicArmorWeight_Cursed = 0.5; +let KDEnchantedRestraintsWeight = 1.0; +let KDAdvancedArmorWeight = 3; +let KDAdvancedArmorWeight_Cursed = 0.5; + +let KD_hexchance_Default = 0.1; +let KD_hexscale_Default = 0.4; // based on % of max level +let KD_enchantchance_Default = 0.25; +let KD_enchantscale_Default = 1/0.7; // % of max level, ~70% of the way through all will be enchanted + +let KD_hexchance_EnchantedRestraints = 0.3; +let KD_hexscale_EnchantedRestraints = 0.7; + + +let KDBasicArmor = [ + {name: "Swimsuit", minLevel: 0, weight: KDBasicArmorWeight*0.8, + armor: "Swimsuit", + cursesuffix: "Common", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["Swimsuit"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "SwimsuitMimic", minLevel: 0, weight: KDBasicArmorWeight*0.5, + armor: "Swimsuit", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["Swimsuit"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Breastplate", minLevel: 0, weight: KDBasicArmorWeight*0.7, + armor: "Breastplate", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["Breastplate"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "BreastplateShibari", minLevel: 0, weight: KDBasicArmorWeight*0.3, + armor: "Breastplate", + cursesuffix: "Shibari", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["Breastplate"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Bustier", minLevel: 0, weight: KDBasicArmorWeight*0.7, + armor: "Bustier", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["Bustier"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "BustierShibari", minLevel: 0, weight: KDBasicArmorWeight*0.4, + armor: "Bustier", + cursesuffix: "Shibari", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["Bustier"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ChainTunic", minLevel: 0, weight: KDBasicArmorWeight * 0.5, + armor: "ChainTunic", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["ChainTunic"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ChainTunicShibari", minLevel: 0, weight: KDBasicArmorWeight * 0.25, + armor: "ChainTunic", + cursesuffix: "Shibari", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["ChainTunic"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ChainTunicSkimpy", minLevel: 0, weight: KDBasicArmorWeight * 0.3, + armor: "ChainTunic", + cursesuffix: "Skimpy", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["ChainTunic"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ChainBikini", minLevel: 0, weight: KDBasicArmorWeight * 0.7, + armor: "ChainBikini", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["ChainBikini"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ChainBikiniShibari", minLevel: 0, weight: KDBasicArmorWeight * 0.3, + armor: "ChainBikini", + cursesuffix: "Shibari", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["ChainBikini"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Bracers", minLevel: 0, weight: KDBasicArmorWeight*0.7, + armor: "Bracers", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["Bracers"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "BracersShibari", minLevel: 0, weight: KDBasicArmorWeight*0.5, + armor: "Bracers", + cursesuffix: "Shibari", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["Bracers"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LeatherGloves", minLevel: 0, weight: KDBasicArmorWeight, + armor: "LeatherGloves", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["LeatherGloves"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Gauntlets", minLevel: 0, weight: KDBasicArmorWeight, + armor: "Gauntlets", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["Gauntlets"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "SteelBoots", minLevel: 0, weight: KDBasicArmorWeight, + armor: "SteelBoots", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["SteelBoots"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LeatherBoots", minLevel: 0, weight: KDBasicArmorWeight, + armor: "LeatherBoots", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["LeatherBoots"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "SteelSkirt2", minLevel: 0, weight: KDBasicArmorWeight*0.6, + armor: "SteelSkirt2", + hexlist: "Common", + cursesuffix: "Mimic", + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["SteelSkirt2"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "SteelSkirt2Skimpy", minLevel: 0, weight: KDBasicArmorWeight*0.4, + armor: "SteelSkirt2", + hexlist: "Common", + cursesuffix: "Skimpy", + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["SteelSkirt2"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, +]; +let KDAdvancedArmor = [ + {name: "SteelArmor", minLevel: 0, weight: KDAdvancedArmorWeight, + armor: "SteelArmor", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["SteelArmor"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "SteelArmorShibari", minLevel: 0, weight: KDAdvancedArmorWeight, + armor: "SteelArmor", + cursesuffix: "Shibari", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["SteelArmor"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "SteelSkirt", minLevel: 0, weight: KDAdvancedArmorWeight*0.5, + armor: "SteelSkirt", + hexlist: "Common", + cursesuffix: "Mimic", + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["SteelSkirt"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "SteelSkirtSkimpy", minLevel: 0, weight: KDAdvancedArmorWeight*0.5, + armor: "SteelSkirt", + hexlist: "Common", + cursesuffix: "Skimpy", + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["SteelSkirt"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "MageArmor", minLevel: 0, weight: KDAdvancedArmorWeight, + armor: "MageArmor", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["MageArmor"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "MageArmorShibari", minLevel: 0, weight: KDAdvancedArmorWeight, + armor: "MageArmor", + cursesuffix: "Shibari", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["MageArmor"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "Cape", minLevel: 0, weight: KDAdvancedArmorWeight, + armor: "Cape", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["Cape"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "CapeShibari", minLevel: 0, weight: KDAdvancedArmorWeight, + armor: "Cape", + cursesuffix: "Shibari", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["Cape"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "MagicArmbandsMimic", minLevel: 0, weight: KDAdvancedArmorWeight*0.5, + armor: "MagicArmbands", + cursesuffix: "Mimic", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["MagicArmbands"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "MagicArmbands", minLevel: 0, weight: KDAdvancedArmorWeight*0.8, + armor: "MagicArmbands", + cursesuffix: "Common", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_Default, enchantchance: KD_enchantchance_Default, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + nouncursed: ["MagicArmbands"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + +]; +let KDGoldArmor = [...JSON.parse(JSON.stringify(KDAdvancedArmor)), ...JSON.parse(JSON.stringify(KDBasicArmor))]; +for (let armor of KDGoldArmor) { + armor.enchantlist = "Gold"; + armor.enchantchance = 1.0; + armor.amtMult = 2; + armor.weight *= 0.2; +} +let KDGoldArmor2 = [...JSON.parse(JSON.stringify(KDAdvancedArmor)), ...JSON.parse(JSON.stringify(KDBasicArmor))]; +for (let armor of KDGoldArmor2) { + armor.enchantlist = "Common"; + armor.enchantchance = 1.0; + armor.minEnchants = 2; + armor.maxEnchants = 3; + armor.amtMult = 1.5; + armor.weight *= 0.2; +} + +let KDGoldArmorGoddess = [...JSON.parse(JSON.stringify(KDAdvancedArmor)), ...JSON.parse(JSON.stringify(KDBasicArmor))]; +for (let armor of KDGoldArmorGoddess) { + armor.enchantlist = "Gold"; + armor.enchantchance = 1.0; + armor.minEnchants = 2; + armor.maxEnchants = 3; + armor.amtMult = 2; + armor.weight *= 0.2; + armor.hexchance *= 2; + armor.unlockcurse = ["Divine"]; + if (armor.cursesuffix == "Mimic") + armor.cursesuffix = "MimicHoly"; +} +let KDGoldArmor2Goddess = [...JSON.parse(JSON.stringify(KDAdvancedArmor)), ...JSON.parse(JSON.stringify(KDBasicArmor))]; +for (let armor of KDGoldArmor2Goddess) { + armor.enchantlist = "Common"; + armor.enchantchance = 1.0; + armor.minEnchants = 3; + armor.maxEnchants = 4; + armor.amtMult = 1.5; + armor.weight *= 0.2; + armor.hexchance *= 2; + armor.unlockcurse = ["Divine"]; + if (armor.cursesuffix == "Mimic") + armor.cursesuffix = "MimicHoly"; +} +let KDSilverArmor = [...JSON.parse(JSON.stringify(KDBasicArmor))]; +for (let armor of KDSilverArmor) { + armor.amtMult = 1.4; + armor.maxEnchants = 2; + armor.enchantchance =(armor.enchantchance || 0) * 2; + armor.enchantscale = (armor.enchantscale || 0) * 2; +} + +let KDEnchantedRestraints = [ + {name: "TrapRestraints", minLevel: 0, weight: KDEnchantedRestraintsWeight*2, + armortags: ["trap"], armor: "TrapGag", // Backup to a gag + cursesuffix: "", + maxEnchants: 2, + faction: "Curse", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_EnchantedRestraints, enchantchance: 1, alwaysenchanthex: true, + hexscale: KD_hexscale_EnchantedRestraints, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "SteelRestraints", minLevel: 0, weight: KDEnchantedRestraintsWeight*1, + armortags: ["steelbondage"], armor: "TrapYoke", // Backup to a gag + cursesuffix: "", + maxEnchants: 3, + amtMult: 1.3, + faction: "Curse", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_EnchantedRestraints, enchantchance: 1, alwaysenchanthex: true, + hexscale: KD_hexscale_EnchantedRestraints, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LatexRestraints", minLevel: 0, weight: KDEnchantedRestraintsWeight*2.5, + armortags: ["latexRestraintsHeavy", "latexpetsuit", "latexRestraints"], armor: "LatexBallGag", + cursesuffix: "", + amtMult: 1.5, + maxEnchants: 2, + faction: "Curse", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_EnchantedRestraints, enchantchance: 1, alwaysenchanthex: true, + hexscale: KD_hexscale_EnchantedRestraints, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LeatherRestraints", minLevel: 0, weight: KDEnchantedRestraintsWeight*3, + armortags: ["leatherRestraintsHeavy"], armor: "TrapGag", + cursesuffix: "", + amtMult: 1.5, + maxEnchants: 2, + faction: "Curse", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_EnchantedRestraints, enchantchance: 1, alwaysenchanthex: true, + hexscale: KD_hexscale_EnchantedRestraints, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "MagicRopes", minLevel: 0, weight: KDEnchantedRestraintsWeight*0.25, + armortags: ["weakMagicRopes"], armor: "TrapGag", + cursesuffix: "", + amtMult: 2.5, + faction: "Curse", + hexlist: "Common", enchantlist: "Common", hexchance: 1.0, enchantchance: 1, alwaysenchanthex: true, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, +]; + +let KDShadowRestraints = [...JSON.parse(JSON.stringify(KDEnchantedRestraints)), + {name: "CursedToys", minLevel: 0, weight: KDEnchantedRestraintsWeight*1, + armortags: ["genericToys", "plugSpell"], armor: "SteelPlugF", + arousalMode: true, + amtMult: 2, + forceEquip: true, + cursesuffix: "", + faction: "Curse", + hexlist: "Common", enchantlist: "Common", hexchance: 1.0, enchantchance: 1, alwaysenchanthex: true, + unlockcurse: ["Common"], + message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Moon", minLevel: 0, weight: KDEnchantedRestraintsWeight*1, + armortags: ["shadowLatexRestraints", "shadowLatexRestraintsHeavy", "shadowLatexPetsuit", "obsidianRestraints"], armor: "SteelPlugF", + arousalMode: true, + amtMult: 1.5, + maxEnchants: 3, + forceEquip: true, + cursesuffix: "", + faction: "Curse", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_EnchantedRestraints, enchantchance: 1, alwaysenchanthex: true, + hexscale: KD_hexscale_EnchantedRestraints, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Star", minLevel: 0, weight: KDEnchantedRestraintsWeight*1, + armortags: ["liquidMetalRestraintsRandom", "shadowLatexRestraintsHeavy", "shadowLatexPetsuit", "mithrilRestraints"], armor: "SteelPlugF", + arousalMode: true, + amtMult: 1.5, + maxEnchants: 3, + forceEquip: true, + cursesuffix: "", + faction: "Curse", + hexlist: "Common", enchantlist: "Common", hexchance: KD_hexchance_EnchantedRestraints, enchantchance: 1, alwaysenchanthex: true, + hexscale: KD_hexscale_EnchantedRestraints, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + +]; +for (let armor of KDShadowRestraints) { + armor.amtMult = (armor.amtMult || 1) * 2.25; + armor.maxEnchants = (armor.maxEnchants || 1) + 1; + armor.forceEquip = true; +} + + + +let KinkyDungeonLootTable = { + "rubble": [ + //{name: "nothing", minLevel: 0, weight:9, message:"LootRubbleFail", messageColor:"#aaaaaa", messageTime: 2, allFloors: true}, + {name: "smallgold", minLevel: 0, weight:5, message:"LootRubbleSmallGold", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "pick", minLevel: 0, weight:2.5, message:"LootRubbleLockpick", messageColor:"lightgreen", messageTime: 3, allFloors: true, prerequisites: ["fewpick"],}, + {name: "redkey", key: true, minLevel: 0, weight:0.8, message:"LootRubbleRedKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + //{name: "greenkey", minLevel: 2, weight:2, message:"LootRubbleGreenKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + //{name: "bluekey", key: true, minLevel: 2, weight:0.33, message:"LootRubbleBlueKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + {name: "potion_mana", minLevel: 0, weight:2, message:"LootPotionMana", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "potion_will", minLevel: 0, weight:1, message:"LootPotionWill", messageColor:"#ff4444", messageTime: 3, allFloors: true}, + {name: "potion_stamina", minLevel: 0, weight:1, message:"LootPotionStamina", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + {name: "potion_frigid", minLevel: 0, weight:1, message:"LootPotionFrigid", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + + + {name: "AncientCoreSingle", minLevel: 0, weight:0.1, count: 1, message:"LootChestAncientCoreSingle", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "AncientCoreSingleSpent", minLevel: 0, weight:1.5, count: 1, message:"LootChestAncientCoreSingleSpent", messageColor:"yellow", messageTime: 3, allFloors: true}, + + {name: "Rock", minLevel: 0, weapon: "Rock", weight:10, message:"LootChestWeapon", messageColor:"lightgreen", messageTime: 3, allFloors: true, noweapon: ["Rock"]}, + {name: "knife", minLevel: 0, weight:5, message:"LootRubbleKnife", messageColor:"lightgreen", messageTime: 3, allFloors: true, noweapon: ["Knife"]}, + {name: "Torch", minLevel: 0, weight:7, weapon: "Torch", noweapon: ["Torch"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Rope", minLevel: 0, weight:8, weapon: "Rope", noweapon: ["Rope"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Scissors", minLevel: 0, weight:5, weapon: "Scissors", noweapon: ["Scissors"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "BagOfGoodies", arousalMode: true, minLevel: 0, weight:1.0, weapon: "BagOfGoodies", noweapon: ["BagOfGoodies"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ], + "shelf": [ + {name: "ArcaneCrystal", minLevel: 5, weight:5, weapon: "ArcaneCrystal", + noweapon: ["ArcaneCrystal"], message:"LootChestWeapon", + messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "redkey", key: true, minLevel: 1, weight:1, message:"LootBookshelfKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + {name: "bluekey", key: true, minLevel: 0, weight:0.33, message:"LootBookshelfBlueKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + {name: "scroll_arms", minLevel: 0, weight:1, message:"LootBookshelfScroll", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "scroll_legs", minLevel: 0, weight:1, message:"LootBookshelfScroll", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "scroll_verbal", minLevel: 0, weight:1, message:"LootBookshelfScroll", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "trap_book", minLevel: 1, weight:5, message:"LootBookshelfTrap", messageColor:"#ff5277", messageTime: 3, allFloors: true}, + {name: "ArcaneTome", minLevel: 0, weapon: "ArcaneTome", weight:1, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["ArcaneTome"]}, + {name: "BondageTome", minLevel: 0, weapon: "BondageTome", weight:2, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["BondageTome"]}, + ], + "pearl": [ + {name: "pearlReward", minLevel: 0, weight:1, message:"LootPearlChest", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["pearlChest"],}, + ], + "shadow": [ + {name: "ArcaneCrystal", minLevel: 5, weight:3, weapon: "ArcaneCrystal", + noweapon: ["ArcaneCrystal"], message:"LootChestWeapon", + messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "slimeThrower", minLevel: 0, weapon: "Slimethrower", weight:2, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["Slimethrower"]}, + {name: "StaffDoll", minLevel: 0, weapon: "StaffDoll", weight:2, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["StaffDoll"]}, + {name: "staff_incineration", minLevel: 0, weight:.5, weapon: "StaffIncineration", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["StaffIncineration"]}, + {name: "staff_storms", minLevel: 0, weight:.5, weapon: "StaffStorm", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["StaffStorm"]}, + {name: "staff_frostbite", minLevel: 0, weight:.5, weapon: "StaffFrostbite", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["StaffFrostbite"]}, + {name: "staff_bind", minLevel: 0, weight:.5, weapon: "StaffBind", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["StaffBind"]}, + {name: "AncientCores", minLevel: 0, weight:0.5, message:"LootChestAncientCores", messageColor:"yellow", messageTime: 3, allFloors: true, max: 1}, + {name: "bluekey", minLevel: 0, weight:0.5, message:"LootChestBlueKey", messageColor:"lightblue", messageTime: 3, allFloors: true}, + //{name: "spell_points", magic: true, minLevel: 0, weight:5, message:"LootChestSpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, + ...KDShadowRestraints, + ], + "kitty": [ + {name: "CursedPetsuit", minLevel: 0, weight: 10, + armor: "KittyPetSuit", + amtMult: 4, + maxEnchants: 3, + //forceEquip: true, + cursesuffix: "", + prerequisites: ["nopetsuit"], + faction: "Bast", + hexlist: "Common", enchantlist: "Common", hexchance: 0.25, enchantchance: 1, alwaysenchanthex: true, + hexscale: 0.75, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 10, enchantlevelmin: 0, enchantlevelmax: 10, + message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "staff_incineration", minLevel: 0, weight:4, weapon: "StaffIncineration", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["StaffIncineration"]}, + {name: "StaffBind", minLevel: 0, weight:4, weapon: "StaffBind", goddess: "Rope", goddessWeight: 2.75, noweapon: ["StaffBind"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "MistressKey", minLevel: 0, weight:1, message:"LootChestMistressKey", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "grinder", minLevel: 1, weight:4, message:"LootChestGrinder", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "AncientCores", max: 1, minLevel: 0, weight:1, count: 3, message:"LootChestAncientCores", messageColor:"yellow", messageTime: 3, allFloors: true, submissive: 50}, + ], + "robot": [ + {name: "Slimethrower", minLevel: 0, weight:4, weapon: "Slimethrower", noweapon: ["Slimethrower"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "EscortDrone", minLevel: 0, weight:4, weapon: "EscortDrone", noweapon: ["EscortDrone"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Blaster", minLevel: 0, weight:4, weapon: "Blaster", noweapon: ["Blaster"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "AncientCores", max: 1, minLevel: 0, weight:8, count: 3, message:"LootChestAncientCores", messageColor:"yellow", messageTime: 3, allFloors: true, submissive: 50}, + {name: "grinder", minLevel: 0, weight:3, message:"LootChestGrinder", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "StormBreaker", minLevel: 0, weight:3, weapon: "StormBreaker", goddess: "Elements", goddessWeight: 3, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["StormBreaker"]}, + {name: "IceBreaker", minLevel: 0, weight:3, weapon: "IceBreaker", goddess: "Elements", goddessWeight: 3, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["IceBreaker"]}, + {name: "DivineTear", minLevel: 0, weight:0.1, message:"LootChestDivineTear", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "MistressKey", minLevel: 0, weight:0.1, message:"LootChestMistressKey", messageColor:"yellow", messageTime: 3, allFloors: true}, + ], + "lessershadow": [ + {name: "ArcaneCrystal", minLevel: 5, weight:3, weapon: "ArcaneCrystal", + noweapon: ["ArcaneCrystal"], message:"LootChestWeapon", + messageColor:"lightblue", messageTime: 3, allFloors: true}, + //{name: "AncientCores", minLevel: 0, weight:1.5, message:"LootChestAncientCores", messageColor:"yellow", messageTime: 3, allFloors: true, max: 1}, + //{name: "bluekey", minLevel: 0, weight:1.0, message:"LootChestBlueKey", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "pick", minLevel: 0, weight:2.5, message:"LootRubbleLockpick", messageColor:"lightgreen", messageTime: 3, allFloors: true, prerequisites: ["fewpick"],}, + //{name: "redkey", key: true, minLevel: 0, weight:1, message:"LootRubbleRedKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + {name: "potions_many", minLevel: 0, weight:3, message:"LootPotionsMedley", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["lowpotions"]}, + {name: "magicknife", minLevel: 0, weight:1.5, weapon: "EnchKnife", message:"LootChestMagicKnife", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["EnchKnife"]}, + ...KDShadowRestraints, + ], + "storage": [ + {name: "redkey", key: true, minLevel: 0, weight:1, message:"LootChestRedKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + {name: "bola", minLevel: 0, weight:3, message:"LootChestBola", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + {name: "bomb", minLevel: 0, weight:2, message:"LootChestBomb", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + {name: "gunpowder", minLevel: 0, weight:8, message:"LootChestGunpowder", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + {name: "rope", minLevel: 0, weight:1, weapon: "Rope", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["Rope"]}, + ], + "kinky": [ + {name: "Trap", minLevel: 0, weight: 10, + count: 4, + armortags: ["trap", "leatherRestraints", "leatherRestraintsHeavy"], armor: "TrapGag", // Backup to a gag + faction: "Jail", + message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Latex", minLevel: 0, weight: 10, + count: 4, + armortags: ["latexRestraintsHeavy", "latexpetsuit", "latexRestraints"], armor: "TrapGag", // Backup to a gag + faction: "Jail", + message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "CommonToy", weaponlist: "CommonToy", minLevel: 0, weight:1, + message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "rope", minLevel: 0, weight:1, weapon: "Rope", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["Rope"]}, + ], + "blue": [ + {name: "spell_points", magic: true, minLevel: 0, weight:1, message:"LootChestSpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, + ], + "tutorial1": [ + {name: "trap_cuffs", minLevel: 0, weight:1, lock: "Red", message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms"], power: 2}, + ], + "tutorial2": [ + {name: "trap_armbinder", minLevel: 0, weight:1, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms"], power: 6}, + ], + "magicWeapon": [ + {name: "CommonWeapon", weaponlist: "CommonWeapon", enchantlist: "CommonWeapon", enchantchance: 1.0, minLevel: 0, weight:1, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "CommonToy", weaponlist: "CommonToy", enchantlist: "CommonWeapon", enchantchance: 1.0, minLevel: 0, weight:1, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ], + "pair": [ + {name: "BindingDress", minLevel: 0, weight: 10, + armor: "BindingDress", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0, cursescale: 0, + cursesuffix: "", + enchantlist: "Pair", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ], + // TODO make it so that it wont try to give you a non enchanted weapon you already have + /*"weapon": [ + {name: "CommonWeapon", weaponlist: "CommonWeapon", enchantlist: "CommonWeapon", enchantchance: KD_enchantchance_Default, enchantscale: KD_enchantscale_Default, + minLevel: 0, weight:1, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "CommonToy", weaponlist: "CommonToy", enchantlist: "CommonWeapon", enchantchance: KD_enchantchance_Default, enchantscale: KD_enchantscale_Default, + minLevel: 0, weight:1, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ],*/ + "chest": [ + + {name: "ArrowFireSpell", spell: "ArrowFireSpell", nospell: ["ArrowFireSpell"], minLevel: 0, weight: 1.25, message:"LootChestSpell", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["hasBow"]}, + {name: "ArrowVineSpell", spell: "ArrowVineSpell", nospell: ["ArrowVineSpell"], minLevel: 0, weight: 1.25, message:"LootChestSpell", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["hasBow"]}, + + {name: "archerykit", minLevel: 0, weight: 4, noweapon: ["Bow"], message:"LootArcheryKit", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "gold", minLevel: 0, weight:1, message:"LootChestGold", messageColor:"#e7cf1a", messageTime: 3, allFloors: true}, + {name: "magicknife", minLevel: 0, weight:1.5, weapon: "EnchKnife", message:"LootChestMagicKnife", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["EnchKnife"]}, + {name: "bluekey", redspecial: 8.5, key: true, minLevel: 3, weight:0.65, message:"LootChestBlueKey", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + {name: "weapon_boltcutters", minLevel: 5, weight:0.7, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["BoltCutters"]}, + {name: "hammer", minLevel: 0, weight:1, weapon: "Hammer", noweapon: ["Hammer"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Maul", minLevel: 0, weight:1, weapon: "Maul", noweapon: ["Maul"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "flail", minLevel: 0, weight:1, weapon: "Flail", noweapon: ["Flail"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "axe", minLevel: 0, weight:1, weapon: "Axe", noweapon: ["Axe"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "spear", minLevel: 0, weight:1, weapon: "Spear", noweapon: ["Spear"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ShieldTower", minLevel: 0, weight:1.5, weapon: "ShieldTower", noweapon: ["ShieldTower"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ShieldReinforced", minLevel: 0, weight:1.0, weapon: "ShieldReinforced", noweapon: ["ShieldReinforced"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ShieldMagic", minLevel: 0, weight:1.0, weapon: "ShieldMagic", noweapon: ["ShieldMagic"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + //{name: "sword", minLevel: 0, weight:1, weapon: "Sword", noweapon: ["Sword"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "SlimeSword", minLevel: 0, weight:1, weapon: "SlimeSword", noweapon: ["SlimeSword"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ChainSword", minLevel: 0, weight:1, weapon: "ChainSword", noweapon: ["ChainSword"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Dirk", minLevel: 0, weight:1, weapon: "Dirk", noweapon: ["Dirk"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Foil", minLevel: 0, weight:0.5, weapon: "Foil", noweapon: ["Foil"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Crossbow", minLevel: 0, weight:1.5, weapon: "Crossbow", noweapon: ["Crossbow"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "BagOfGoodies", arousalMode: true, minLevel: 0, weight:0.5, weapon: "BagOfGoodies", noweapon: ["BagOfGoodies"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "VibeRemote", arousalMode: true, minLevel: 0, weight:0.5, weapon: "VibeRemote", noweapon: ["VibeRemote"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ...KDBasicArmor, + {name: "MagicWeapon", weaponlist: "CommonWeapon", enchantlist: "CommonWeapon", enchantchance: 1.0, minLevel: 0, weight:2, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "MagicToy", weaponlist: "CommonToy", enchantlist: "CommonWeapon", enchantchance: 1.0, minLevel: 0, weight:2, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + /*{name: "trap_armbinder", trap: true, minLevel: 1, weight:2, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms", "ModerateRestraint"], power: 6}, + {name: "trap_armbinderHeavy", minLevel: 1, weight:2, message:"LootChestTrapMagicHarness", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms", "ModerateRestraint"], submissive: 15, power: 8}, + {name: "trap_cuffs", trap: true, minLevel: 1, weight:1, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms"], power: 2}, + {name: "trap_harness", trap: true, minLevel: 1, weight:2, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemTorso"], power: 4}, + {name: "trap_gag", trap: true, minLevel: 1, weight:3, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemMouth"], power: 6}, + {name: "trap_blindfold", trap: true, minLevel: 1, weight:2, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemHead"], power: 6}, + {name: "trap_boots", trap: true, minLevel: 1, weight:1.5, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemBoots"], power: 6}, + {name: "trap_legirons", trap: true, minLevel: 1, weight:1, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemFeet"], power: 8}, + {name: "trap_beltonly", arousalMode: true, trap: true, minLevel: 1, weight:3, message:"LootChestTrapMagicBelt", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemPelvis"], power: 5}, + {name: "trap_belt", arousalMode: true, trap: true, minLevel: 1, weight:1.5, message:"LootChestTrapMagicVibe", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulvaPiercings", "alreadyBelted", "vibe"], power: 1}, + */ + {name: "trap_plug", notag: ["SupremeBelt"], arousalMode: true, trap: true, minLevel: 1, weight:1.5, message:"LootChestTrapMagicPlug", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 3}, + {name: "trap_nipple", notag: ["SupremeBra"], arousalMode: true, trap: true, minLevel: 1, weight:1.5, message:"LootChestTrapMagicNipple", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemNipples", "alreadyBelted", "vibe"], power: 3}, + //{name: "trap_mitts", trap: true, minLevel: 7, weight:2, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemHands", "LightRestraint"], power: 10}, + {name: "potions_mana", minLevel: 0, weight:1, message:"LootPotionsMana", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["lowmanapotions"]}, + {name: "manaorb", minLevel: 0, weight:0.25, message:"LootManaOrb", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "potions_will", minLevel: 0, weight:1, message:"LootPotionsWill", messageColor:"#ff4444", messageTime: 3, allFloors: true, prerequisites: ["lowwillpotions"]}, + //{name: "potions_many", minLevel: 1, weight:0.5, message:"LootPotionsMedley", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["lowpotions"]}, + ], + "lost_items": [ + {name: "lost_items", minLevel: 0, weight:999999999999, message:"LootCacheLostItems", messageColor:"lightgreen", messageTime: 3, allFloors: true, prerequisites: ["LostItems"]}, + ], + "lost_clothes": [ + {name: "lost_clothes", minLevel: 0, weight:999999999999, message:"LootCacheLostClothes", messageColor:"lightgreen", messageTime: 3, allFloors: true}, + ], + "cache": [ + //{name: "lost_items", minLevel: 0, weight:999999999999, message:"LootCacheLostItems", messageColor:"lightgreen", messageTime: 3, allFloors: true, prerequisites: ["LostItems"]}, + {name: "potions_many", minLevel: 0, weight:0.001, message:"LootPotionsMedley", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "weapon_boltcutters", minLevel: 2, weight:1, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["BoltCutters"]}, + {name: "flamberge", minLevel: 3, weight:0.8, weapon: "Flamberge", noweapon: ["Flamberge"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "FrostSword", minLevel: 3, weight:0.8, weapon: "FrostSword", noweapon: ["FrostSword"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Rapier", minLevel: 3, weight:0.8, weapon: "Rapier", noweapon: ["Rapier"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Katana", minLevel: 3, weight:0.8, weapon: "Katana", noweapon: ["Katana"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "CrossbowHeavy", minLevel: 5, weight:0.8, weapon: "CrossbowHeavy", noweapon: ["CrossbowHeavy"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Longbow", minLevel: 3, weight:0.8, weapon: "Longbow", noweapon: ["Longbow"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "StaffTape", minLevel: 0, weight:1, weapon: "StaffTape", noweapon: ["StaffTape"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "DildoBatPlus", minLevel: 0, weight:1.0, weapon: "DildoBatPlus", noweapon: ["DildoBatPlus"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "StaffFlame", minLevel: 0, weight:1, weapon: "StaffFlame", noweapon: ["StaffFlame"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "StaffChain", minLevel: 0, weight:1, weapon: "StaffChain", noweapon: ["StaffChain"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "StaffGlue", minLevel: 0, weight:1, weapon: "StaffGlue", noweapon: ["StaffGlue"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "StaffElectric", minLevel: 0, weight:1, weapon: "StaffElectric", noweapon: ["StaffElectric"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "StaffPermafrost", minLevel: 0, weight:1, weapon: "StaffPermafrost", noweapon: ["StaffPermafrost"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "StaffDoll", minLevel: 5, weight:0.25, weapon: "StaffDoll", goddess: "Latex", goddessWeight: 1.25, noweapon: ["StaffDoll"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "StaffIncineration", minLevel: 5, weight:1, weapon: "StaffIncineration", goddess: "Elements", goddessWeight: 0.75, noweapon: ["StaffIncineration"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "StaffStorm", minLevel: 5, weight:1, weapon: "StaffStorm", goddess: "Elements", goddessWeight: 0.75, noweapon: ["StaffStorm"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "StaffFrostbite", minLevel: 5, weight:1, weapon: "StaffFrostbite", goddess: "Elements", goddessWeight: 0.75, noweapon: ["StaffFrostbite"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "StaffBind", minLevel: 5, weight:1, weapon: "StaffBind", goddess: "Rope", goddessWeight: 2.75, noweapon: ["StaffBind"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "Slimethrower", minLevel: 5, weight:1, weapon: "Slimethrower", goddess: "Latex", goddessWeight: 1.25, noweapon: ["Slimethrower"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + ...KDAdvancedArmor, + ...KDEnchantedRestraints, + ], + "magicrestraint": [ + ...KDEnchantedRestraints, + ], + "wizard": [ + + {name: "EssenceNecklace", minLevel: 1, weight:4, message:"LootEssenceNecklace", + armor: "EssenceNecklace", + messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EssenceNecklace"]}, + {name: "ArcaneCrystal", minLevel: 5, weight:3, weapon: "ArcaneCrystal", + noweapon: ["ArcaneCrystal"], message:"LootChestWeapon", + messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "spell_illusion_low", magic: true, minLevel: 0, weight: 0.75, message:"LootChestSpell", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["UnlearnedIllusion", "lowlevel"]}, // lowlevel is spell levels 1-2 + {name: "spell_conjuration_low", magic: true, minLevel: 0, weight: 0.75, message:"LootChestSpell", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["UnlearnedConjure", "lowlevel"]}, // lowlevel is spell levels 1-2 + {name: "spell_elemental_low", magic: true, minLevel: 0, weight: 0.75, message:"LootChestSpell", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["UnlearnedElements", "lowlevel"]}, // lowlevel is spell levels 1-2 + {name: "MageArmor", minLevel: 0, weight: 5, + armor: "MageArmor", + hexlist: "Common", enchantlist: "Gold", hexchance: KD_hexchance_Default/2, enchantchance: 1.0, alwaysenchanthex: true, + hexscale: KD_hexscale_Default, enchantscale: KD_enchantscale_Default, + maxEnchants: 3, + minEnchants: 2, + unlockcurse: ["Common"], hexlevelmin: 0, hexlevelmax: 30, enchantlevelmin: 0, enchantlevelmax: 30, + nouncursed: ["MageArmor"], message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ], + "gold": [ + {name: "MistressKey", minLevel: 0, weight:6, message:"LootChestMistressKey", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "AncientCores", max: 1, minLevel: 0, weight:7, count: 3, message:"LootChestAncientCores", messageColor:"yellow", messageTime: 3, allFloors: true, submissive: 50}, + {name: "EnchantedBelt", arousalMode: true, minLevel: 0, weight:4, message:"LootChestEnchantedBelt", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedBelt"]}, + {name: "EnchantedBra", arousalMode: true, minLevel: 0, weight:4, message:"LootChestEnchantedBra", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedBra"]}, + {name: "EnchantedHeels", minLevel: 0, weight:4, message:"LootChestEnchantedHeels", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedHeels"]}, + {name: "EnchantedAnkleCuffs", minLevel: 0, weight:4, message:"LootChestEnchantedAnkleCuffs", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedAnkleCuffs", "EnchantedAnkleCuffs2"]}, + {name: "EnchantedBlindfold", minLevel: 3, weight:4, message:"LootChestEnchantedBlindfold", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedBlindfold"]}, + {name: "EnchantedMuzzle", minLevel: 0, weight:4, message:"LootChestEnchantedMuzzle", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedMuzzle"]}, + {name: "EnchantedMittens", minLevel: 3, weight:4, message:"LootChestEnchantedMittens", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedMittens"]}, + {name: "EnchantedArmbinder", minLevel: 5, weight:4, message:"LootChestEnchantedArmbinder", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedArmbinder"]}, + {name: "EnchantedBallGag", minLevel: 0, weight:4, message:"LootChestEnchantedBallGag", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EnchantedBallGag"]}, + {name: "PotionCollar", minLevel: 1, weight:10, message:"LootPotionCollar", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["PotionCollar"]}, + {name: "QuakeCollar", minLevel: 5, weight:1, armor: "QuakeCollar", message:"LootChestArmor", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["QuakeCollar"]}, + ...KDEnchantedRestraints, + ], + "lessergold": [ + ...KDGoldArmor, ...KDGoldArmor2, + {name: "RobeOfChastity", arousalMode: true, minLevel: 0, weight:4, message:"LootChestArmor", + armor: "RobeOfChastity", + messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["RobeOfChastity"]}, + + {name: "scrolls_purity", minLevel: 0, weight: 1, message:"LootChestScrollsPurity", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "MistressKey", minLevel: 0, weight:1, message:"LootChestMistressKey", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "DivineTear", minLevel: 0, weight:5, message:"LootChestDivineTear", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "AncientCores", max: 1, minLevel: 0, weight:3, message:"LootChestAncientCores", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "magicknife", minLevel: 0, weight:7, weapon: "EnchKnife", message:"LootChestMagicKnife", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["EnchKnife"]}, + {name: "Scrolls", minLevel: 0, weight:2, message:"LootChestScrolls", messageColor:"yellow", messageTime: 3, allFloors: true}, + //{name: "spell_points", magic: true, minLevel: 3, weight: 3, message:"LootChestSpellPoints", messageColor:"lightblue", messageTime: 3, special:100, allFloors: true, max: 1}, + {name: "manaorbmany", minLevel: 0, weight:1, message:"LootManaOrbMany", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "MagicSword", minLevel: 3, weight:0.33, weapon: "MagicSword", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["MagicSword"]}, + {name: "MagicAxe", minLevel: 3, weight:0.33, weapon: "MagicAxe", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["MagicAxe"]}, + {name: "MagicSpear", minLevel: 3, weight:0.33, weapon: "MagicSpear", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["MagicSpear"]}, + {name: "MagicFlail", minLevel: 3, weight:0.33, weapon: "MagicFlail", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["MagicFlail"]}, + {name: "MagicHammer", minLevel: 3, weight:0.33, weapon: "MagicHammer", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["MagicHammer"]}, + {name: "IceBreaker", minLevel: 2, weight:0.33, weapon: "IceBreaker", goddess: "Elements", goddessWeight: 3, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["IceBreaker"]}, + {name: "StormBreaker", minLevel: 2, weight:0.33, weapon: "StormBreaker", goddess: "Elements", goddessWeight: 3, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["StormBreaker"]}, + {name: "DarkKatana", minLevel: 2, weight:0.33, goddess: "Illusion", goddessWeight: 6, weapon: "DarkKatana", message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["DarkKatana"]}, + //{name: "trap_protobelt", arousalMode: true, trap: true, minLevel: 9, goddess: "Metal", goddessWeight: 4, weight:0, message:"LootChestTrapMagicVibe", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulvaPiercings"], power: 15}, + {name: "trap_plug2", notag: ["SupremeBelt"], arousalMode: true, trap: true, minLevel: 6, weight:1.5, message:"LootChestTrapMagicPlug", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 3}, + {name: "trap_plug2_torment", notag: ["SupremeBelt"], arousalMode: true, trap: true, lock: "Gold", minLevel: 11, weight:1, message:"LootChestTrapMagicPlug", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 5}, + {name: "trap_nipple2", notag: ["SupremeBra"], arousalMode: true, trap: true, minLevel: 7, weight:4, message:"LootChestTrapMagicNipple", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemNipples", "vibe"], power: 3}, + {name: "PotionCollar", minLevel: 1, weight:1.5, message:"LootPotionCollar", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["PotionCollar"]}, + {name: "SarielPanties", armor: "SarielPanties", minLevel: 1, weight:1.2, message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true, norestraint: ["SarielPanties"]}, + ], + "silver": [ + {name: "EssenceNecklace", minLevel: 1, weight:10, message:"LootEssenceNecklace", + armor: "EssenceNecklace", + messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["EssenceNecklace"]}, + {name: "manaorb", minLevel: 0, weight:4, message:"LootManaOrb", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "biggold", minLevel: 0, weight:10, message:"LootChestGold", messageColor:"#e7cf1a", messageTime: 3, allFloors: true}, + {name: "magicknife", minLevel: 0, weight:2.5, weapon: "EnchKnife", message:"LootChestMagicKnife", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["EnchKnife"]}, + {name: "MagicRope", arousalMode: true, minLevel: 0, weight:4, weapon: "MagicRope", noweapon: ["MagicRope"], message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "scrolls_basic", minLevel: 0, weight: 1.75, message:"LootChestScrollsBasic", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "scrolls_purity", minLevel: 0, weight: 0.75, message:"LootChestScrollsPurity", messageColor:"yellow", messageTime: 3, allFloors: true}, + /*{name: "trap_armbinderHeavy", trap:true, minLevel: 5, weight:2, message:"LootChestTrapMagicHarness", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemArms", "ModerateRestraint"], power: 6}, + {name: "trap_harness", trap: true, minLevel: 1, weight:2, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemTorso"], power: 4}, + {name: "trap_gagHeavy", trap:true, minLevel: 3, weight:3, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemMouth2"], power: 10}, + {name: "trap_mithrilankle", trap:true, minLevel: 4, weight:3, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemFeet"], power: 18}, + {name: "trap_beltonly", arousalMode: true, trap: true, minLevel: 1, weight:2, message:"LootChestTrapMagicBelt", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemPelvis"], power: 5}, + {name: "trap_belt", arousalMode: true, trap: true, minLevel: 3, weight:2, message:"LootChestTrapMagicVibe", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulvaPiercings", "alreadyBelted"], power: 1}, + */ + {name: "trap_plug", notag: ["SupremeBelt"], arousalMode: true, trap: true, minLevel: 5, weight:1.5, message:"LootChestTrapMagicPlug", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 3}, + {name: "trap_plug_tease", notag: ["SupremeBelt"], arousalMode: true, trap: true, minLevel: 11, weight:1, message:"LootChestTrapMagicPlug", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 4}, + {name: "trap_plug_torment", notag: ["SupremeBelt"], arousalMode: true, trap: true, minLevel: 15, weight:0.5, message:"LootChestTrapMagicPlug", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 5}, + {name: "trap_plug_thunder", notag: ["SupremeBelt"], arousalMode: true, trap: true, minLevel: 15, weight:0.5, message:"LootChestTrapMagicPlug", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemVulva", "alreadyBelted", "vibe"], power: 5}, + {name: "trap_nipple", notag: ["SupremeBra"], arousalMode: true, trap: true, minLevel: 2, weight:2, message:"LootChestTrapMagicNipple", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemNipples", "vibe"], power: 3}, + //{name: "trap_mitts", trap: true, minLevel: 5, weight:2, message:"LootChestTrapMagic", messageColor:"#ff5277", messageTime: 3, allFloors: true, prerequisites: ["Group_ItemHands", "LightRestraint"], power: 10}, + {name: "potions_mana", minLevel: 0, weight:3, message:"LootPotionsMana", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["lowmanapotions"]}, + {name: "potions_will", minLevel: 0, weight:2, message:"LootPotionsWill", messageColor:"#ff4444", messageTime: 3, allFloors: true, prerequisites: ["lowwillpotions"]}, + {name: "potions_many", minLevel: 1, weight:2, message:"LootPotionsMedley", messageColor:"lightblue", messageTime: 3, allFloors: true, prerequisites: ["lowpotions"]}, + {name: "grinder", minLevel: 1, weight:2, message:"LootChestGrinder", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "PotionCollar", minLevel: 1, weight:0.5, message:"LootPotionCollar", messageColor:"yellow", messageTime: 3, allFloors: true, norestraint: ["PotionCollar"]}, + {name: "SlimeWalkers", armor: "SlimeWalkers", minLevel: 1, weight:0.5, message:"LootSlimeWalkers", messageColor:"lightblue", messageTime: 3, allFloors: true, norestraint: ["SlimeWalkers"]}, + {name: "ElvenPanties", armor: "ElvenPanties", minLevel: 1, weight:1, message:"LootChestArmor", messageColor:"lightblue", messageTime: 3, allFloors: true, norestraint: ["ElvenPanties"]}, + ...KDAdvancedArmor, ...KDSilverArmor, + ], + + + RopeQuest: [ + {name: "spell_points", magic: true, minLevel: 0, weight:4, message:"KDGoddessQuestReward_SpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, + {name: "StaffBind", minLevel: 0, weight:5, weapon: "StaffBind", noweapon: ["StaffBind"], message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "BindingDress", minLevel: 0, weight: 10, + armor: "BindingDress", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + cursesuffix: "", + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "DressMuzzle", minLevel: 0, weight: 10, + armor: "DressMuzzle", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + cursesuffix: "", + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "DressBra", minLevel: 0, weight: 10, + armor: "DressBra", + amtMult: 1, + maxEnchants: 3, + minEnchants: 2, + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + cursesuffix: "", + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapPlug", minLevel: 0, weight: 3, arousalMode: true, + armor: "TrapPlug", + amtMult: 1, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapPlug2", minLevel: 0, weight: 3, arousalMode: true, + armor: "TrapPlug2", + amtMult: 1, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapPlug3", minLevel: 0, weight: 3, arousalMode: true, + armor: "TrapPlug3", + amtMult: 1, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "TrapVibeProto", minLevel: 0, weight: 3, arousalMode: true, + armor: "TrapVibeProto", + amtMult: 1.5, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ...KDGoldArmorGoddess, ...KDGoldArmor2Goddess, + ], + LatexQuest: [ + {name: "spell_points", magic: true, minLevel: 0, weight:4, message:"KDGoddessQuestReward_SpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, + {name: "SlimeWalkers", armor: "SlimeWalkers", minLevel: 0, weight:10, message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true, norestraint: ["SlimeWalkers"]}, + {name: "Corset", minLevel: 0, weight: 10, + armor: "LatexCorset", + amtMult: 1, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LatexCatsuit", minLevel: 0, weight: 10, + armor: "LatexCatsuit", + amtMult: 1, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LatexHeels", minLevel: 0, weight: 10, + armor: "LatexBoots", + amtMult: 1, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LatexStraitjacket", minLevel: 0, weight: 10, + armor: "LatexStraitjacket", + amtMult: 2, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LatexBoxbinder", minLevel: 0, weight: 10, + armor: "LatexBoxbinder", + amtMult: 2, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LatexArmbinder", minLevel: 0, weight: 10, + armor: "LatexArmbinder", + amtMult: 2, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "NeckCorset", minLevel: 0, weight: 10, + armor: "ExpCollar", + amtMult: 2, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ...KDGoldArmorGoddess, ...KDGoldArmor2Goddess, + ], + LeatherQuest: [ + {name: "spell_points", magic: true, minLevel: 0, weight:4, message:"KDGoddessQuestReward_SpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, + {name: "StaffDoll", minLevel: 0, weight: 8, weapon: "StaffDoll", noweapon: ["StaffDoll"], message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LeatherArmCuffs", minLevel: 0, weight: 7, + armor: "LeatherArmCuffs", + amtMult: 1, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LeatherAnkleCuffs", minLevel: 0, weight: 7, + armor: "LeatherAnkleCuffs", + amtMult: 1, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "LeatherLegCuffs", minLevel: 0, weight: 7, + armor: "LeatherLegCuffs", + amtMult: 1, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Armbinder", minLevel: 0, weight: 10, + armor: "HighsecArmbinder", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Boxbinder", minLevel: 0, weight: 10, + armor: "HighsecBoxbinder", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Straitjacket", minLevel: 0, weight: 10, + armor: "HighsecStraitjacket", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "Legbinder", minLevel: 0, weight: 10, + armor: "HighsecLegbinder", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ScaleArmbinder", minLevel: 0, weight: 10, + armor: "DragonArmbinder", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ...KDGoldArmorGoddess, ...KDGoldArmor2Goddess, + ], + MetalQuest: [ + {name: "spell_points", magic: true, minLevel: 0, weight:4, message:"KDGoddessQuestReward_SpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, + {name: "Blaster", minLevel: 0, weight:5, weapon: "Blaster", noweapon: ["Blaster"], message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "MistressKey", minLevel: 0, weight:5, message:"KDGoddessQuestReward_MistressKey", messageColor:"yellow", messageTime: 3, allFloors: true}, + {name: "DollJacket", minLevel: 0, weight: 10, + armor: "CyberDollJacket", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "HeavyYoke", minLevel: 0, weight: 10, + armor: "HeavyYoke", + amtMult: 2, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "HeavyYoke", minLevel: 0, weight: 4, + armor: "HeavyYoke", + amtMult: 2, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "TrapFiddle", minLevel: 0, weight: 4, + armor: "TrapFiddle", + amtMult: 2, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "CyberDoll", minLevel: 0, weight: 40, + armortags: ["cyberDollRestraints"], armor: "ControlHarness", + amtMult: 1.75, + maxEnchants: 3, + cursesuffix: "", + faction: "Curse", + enchantlist: "Gold", enchantchance: 1, + unlockcurse: ["Divine"], enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ControlHarness", minLevel: 0, weight: 10, + armor: "ControlHarness", + amtMult: 2.5, + maxEnchants: 2, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "CyberBallGag", minLevel: 0, weight: 10, + armor: "CyberBallGag", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "CyberMuzzle", minLevel: 0, weight: 10, + armor: "CyberMuzzle", + amtMult: 2, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "WolfPetsuit", minLevel: 0, weight: 10, + armor: "WolfPetsuit", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + prerequisites: ["nopetsuit"], + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "CyberBelt", minLevel: 0, weight: 4, + armor: "CyberBelt", arousalMode: true, + amtMult: 1.5, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapBelt", minLevel: 0, weight: 4, + armor: "TrapBelt", arousalMode: true, + amtMult: 1.5, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "WolfPanties", minLevel: 0, weight: 4, + armor: "WolfPanties", arousalMode: true, + amtMult: 1.5, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapBra", minLevel: 0, weight: 4, + armor: "TrapBra", arousalMode: true, + amtMult: 1.5, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapBra2", minLevel: 0, weight: 4, + armor: "TrapBra2", arousalMode: true, + amtMult: 1.5, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapBeltProto", minLevel: 0, weight: 4, + armor: "TrapBeltProto", arousalMode: true, + amtMult: 1.5, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ...KDGoldArmorGoddess, ...KDGoldArmor2Goddess, + ], + WillQuest: [ + {name: "spell_points", magic: true, minLevel: 0, weight:4, message:"KDGoddessQuestReward_SpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, + {name: "PotionCollar", armor: "PotionCollar", minLevel: 0, weight:10, message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true, norestraint: ["PotionCollar"]}, + {name: "Petsuit", minLevel: 0, weight: 10, + armor: "KittyPetSuit", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + prerequisites: ["nopetsuit"], + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + + {name: "MikoDress", minLevel: 0, weight: 10, + armor: "MikoDress", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "MikoGag", minLevel: 0, weight: 10, + armor: "MikoGag", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ...KDGoldArmorGoddess, ...KDGoldArmor2Goddess, + ], + ElementsQuest: [ + {name: "spell_points", magic: true, minLevel: 0, weight:4, message:"KDGoddessQuestReward_SpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, + {name: "IceBreaker", minLevel: 0, weight:3, weapon: "IceBreaker", message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["IceBreaker"]}, + {name: "StormBreaker", minLevel: 0, weight:3, weapon: "StormBreaker", message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["StormBreaker"]}, + {name: "ChastityBelt", minLevel: 0, weight: 10, + armor: "BlacksteelBelt", + arousalMode: true, + amtMult: 2, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapBelt2", minLevel: 0, weight: 4, arousalMode: true, + armor: "TrapBelt2", + amtMult: 1.5, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapPlug", minLevel: 0, weight: 3, arousalMode: true, + armor: "TrapPlug", + amtMult: 1, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + prerequisites: ["nofrontplug"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapPlug2", minLevel: 0, weight: 3, arousalMode: true, + armor: "TrapPlug2", + amtMult: 1, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + prerequisites: ["nofrontplug"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapPlug3", minLevel: 0, weight: 3, arousalMode: true, + armor: "TrapPlug3", + amtMult: 1, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + prerequisites: ["nofrontplug"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapPlug4", minLevel: 0, weight: 2, arousalMode: true, + armor: "TrapPlug4", + amtMult: 0.75, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + prerequisites: ["nofrontplug"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "TrapPlug5", minLevel: 0, weight: 1, arousalMode: true, + armor: "TrapPlug5", + amtMult: 1, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + prerequisites: ["nofrontplug"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "StaffIncineration", minLevel: 0, weight:5, weapon: "StaffIncineration", noweapon: ["StaffIncineration"], message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "StaffStorm", minLevel: 0, weight:5, weapon: "StaffStorm", noweapon: ["StaffStorm"], message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "StaffFrostbite", minLevel: 0, weight:5, weapon: "StaffFrostbite", noweapon: ["StaffFrostbite"], message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, allFloors: true}, + ...KDGoldArmorGoddess, ...KDGoldArmor2Goddess, + + ], + ConjureQuest: [ + {name: "spell_points", magic: true, minLevel: 0, weight:4, message:"KDGoddessQuestReward_SpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, + + {name: "BallGag", minLevel: 0, weight: 10, + armor: "HighsecBallGag", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "ComfyStraitjacket", minLevel: 0, weight: 10, + armor: "ComfyStraitjacket", + amtMult: 2, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ComfyGag", minLevel: 0, weight: 10, + armor: "ComfyGag", + amtMult: 1.5, + maxEnchants: 3, + minEnchants: 1, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "MagicHammer", minLevel: 0, weight:3, weapon: "MagicHammer", message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["MagicHammer"]}, + {name: "MagicSword", minLevel: 0, weight:3, weapon: "MagicSword", message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["MagicSword"]}, + {name: "MagicFlail", minLevel: 0, weight:3, weapon: "MagicFlail", message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["MagicFlail"]}, + {name: "MagicSpear", minLevel: 0, weight:3, weapon: "MagicSpear", message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["MagicSpear"]}, + {name: "MagicAxe", minLevel: 0, weight:3, weapon: "MagicAxe", message:"KDGoddessQuestReward_Weapon", messageColor:"lightblue", messageTime: 3, + allFloors: true, noweapon: ["MagicAxe"]}, + ...KDGoldArmorGoddess, ...KDGoldArmor2Goddess, + ], + IllusionQuest: [ + {name: "Blindfold", minLevel: 0, weight: 10, + armor: "TrapBlindfold", + amtMult: 2, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + prerequisites: ["noblindfold"], + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "InvisibleBlindfold", minLevel: 0, weight: 10, + armor: "InvisibleBlindfold", + amtMult: 1, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "KiguMask", minLevel: 0, weight: 10, + armor: "KiguMask", + amtMult: 1, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + prerequisites: ["nokigu"], + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "MaidDress", minLevel: 0, weight: 10, + armor: "MaidDress", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ShadowLatexLegbinder", minLevel: 0, weight: 10, + armor: "ShadowLatexLegbinder", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + {name: "ShadowLatexStraitjacket", minLevel: 0, weight: 10, + armor: "ShadowLatexStraitjacket", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "ShadowLatexBoxbinder", minLevel: 0, weight: 10, + armor: "ShadowLatexBoxbinder", + amtMult: 2.5, + maxEnchants: 4, + minEnchants: 2, + cursesuffix: "", + noForceEquip: true, + unlockcurse: ["Divine"], + cursechance: 0.25, cursescale: 0.5, + enchantlist: "Gold", enchantchance: 1, + enchantlevelmin: 0, enchantlevelmax: 20, + message:"KDGoddessQuestReward_Armor", messageColor:"lightblue", messageTime: 3, allFloors: true}, + + {name: "spell_points", magic: true, minLevel: 0, weight:4, message:"KDGoddessQuestReward_SpellPoints", messageColor:"lightblue", messageTime: 3, allFloors: true, max: 1}, + {name: "DivineTear", minLevel: 0, weight:5, message:"KDGoddessQuestReward_Macaron", messageColor:"yellow", messageTime: 3, allFloors: true}, + ...KDGoldArmorGoddess, ...KDGoldArmor2Goddess, + ], +}; + + +type lootEventFunc = (Loot: any, Floor: number, Replacemsg: string, Lock: string, container?: KDContainer) => { value: number; Replacemsg: string }; + +let KDLootEvents: Record = { + "Armor": (_Loot, _Floor, Replacemsg, _Lock, container) => { + return { + value: 0, + Replacemsg: Replacemsg, + }; + }, + "archerykit": (_Loot, _Floor, Replacemsg, _Lock, container) => { + KDInvAddWeapon(container, "Bow"); + KDAddConsumable("AncientPowerSource", 1, container); + return { + value: 0, + Replacemsg: Replacemsg, + }; + }, +}; + +interface KDMinorLootEntry { + rarity: number, + options: any[], +} + +let KDMinorLootTable = { + chest: { + rarity: 1, + extraQuantity: 0, + options: [ + {name: "Knife", minLevel: 0, weight:5, allFloors: true, message:"", messageColor:""}, + {name: "Pick", minLevel: 0, weight:5, quantity: 1, extraQuantity: 2, allFloors: true, message:"", messageColor:""}, + {name: "RedKey", minLevel: 0, weight:3, quantity: 1, extraQuantity: 1, allFloors: true, message:"", messageColor:""}, + {name: "Bomb", minLevel: 0, weight:5, quantity: 1, allFloors: true, message:"", messageColor:""}, + {name: "FlashBomb", minLevel: 0, weight:0.1, quantity: 1, allFloors: true, message:"", messageColor:""}, + {name: "SmokeBomb", minLevel: 0, weight:5, quantity: 2, allFloors: true, message:"", messageColor:""}, + {name: "Flashbang", minLevel: 0, weight:5, quantity: 2, allFloors: true, message:"", messageColor:""}, + {name: "PotionMana", minLevel: 0, weight:3, quantity: 1, allFloors: true, message:"", messageColor:""}, + {name: "PotionStamina", minLevel: 0, weight:3, quantity: 1, allFloors: true, message:"", messageColor:""}, + {name: "PotionWill", minLevel: 0, weight:2, quantity: 1, allFloors: true, message:"", messageColor:""}, + {name: "PotionFrigid", minLevel: 0, weight:2, quantity: 1, allFloors: true, message:"", messageColor:""}, + {name: "Gunpowder", minLevel: 0, weight:2, quantity: 1, allFloors: true, message:"", messageColor:""}, + ], + }, +} \ No newline at end of file diff --git a/Game/src/magic/KDAoEList.ts b/Game/src/magic/KDAoEList.ts new file mode 100644 index 000000000..2c67dd633 --- /dev/null +++ b/Game/src/magic/KDAoEList.ts @@ -0,0 +1,156 @@ +"use strict"; + +let KDAOETypes = { + "slash": (bx, by, xx, yy, rad, modifier = "", ox, oy) => { + let dist = KDistEuclidean(ox-xx , oy-yy); + let dist2 = KDistEuclidean(ox-bx , oy-by); + // Special case to reduce aoe in melee + if (ox == bx && yy == oy) return false; + if (oy == by && xx == ox) return false; + //Main case + return Math.abs(dist2-dist) < 0.49; + }, + "arc": (bx, by, xx, yy, rad, modifier = "", ox, oy) => { + let dist = KDistEuclidean(ox-xx , oy-yy); + let dist2 = KDistEuclidean(ox-bx , oy-by); + // Special case to reduce aoe in melee + if (ox == bx && yy == oy) return false; + if (oy == by && xx == ox) return false; + //Main case + return Math.abs(dist2-dist) < 0.49 && KDistEuclidean(xx-bx , yy-by) < rad * Math.min(1, dist2*0.5); + }, + "cross": (bx, by, xx, yy, rad, modifier = "", ox, oy) => { + let points = {}; + points[bx + ',' + by] = true; + /** + * @type {{x: number, y: number} []} + */ + let dirs = [ + {x: 1, y: 0}, + {x: -1, y: 0}, + {x: 0, y: 1}, + {x: 0, y: -1}, + ]; + for (let r = 1; r <= rad; r++) { + for (let d of dirs) { + if (points[(bx + (r - 1) * d.x) + ',' + (by + (r - 1) * d.y)] + && !KinkyDungeonWallTiles.includes(KinkyDungeonMapGet((bx + (r) * d.x), (by + (r) * d.y))) + && (!KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)) || !KDEntityBlocksExp(KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)))) + ) { + points[(bx + (r) * d.x) + ',' + (by + (r) * d.y)] = true; + } + } + } + //Main case + return points[xx + ',' + yy] != undefined; + }, + "Xcross": (bx, by, xx, yy, rad, modifier = "", ox, oy) => { + let points = {}; + points[bx + ',' + by] = true; + /** + * @type {{x: number, y: number} []} + */ + let dirs = [ + {x: 1, y: 0}, + {x: -1, y: 0}, + {x: 0, y: 1}, + {x: 0, y: -1}, + {x: 1, y: 1}, + {x: -1, y: 1}, + {x: 1, y: -1}, + {x: -1, y: -1}, + ]; + for (let r = 1; r <= rad; r++) { + for (let d of dirs) { + if (points[(bx + (r - 1) * d.x) + ',' + (by + (r - 1) * d.y)] + && !KinkyDungeonWallTiles.includes(KinkyDungeonMapGet((bx + (r) * d.x), (by + (r) * d.y))) + && (!KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)) || !KDEntityBlocksExp(KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)))) + ) { + points[(bx + (r) * d.x) + ',' + (by + (r) * d.y)] = true; + } + } + } + //Main case + return points[xx + ',' + yy] != undefined; + }, + + + "crossCrack": (bx, by, xx, yy, rad, modifier = "", ox, oy) => { + let points = {}; + points[bx + ',' + by] = true; + /** + * @type {{x: number, y: number} []} + */ + let dirs = [ + {x: 1, y: 0}, + {x: -1, y: 0}, + {x: 0, y: 1}, + {x: 0, y: -1}, + ]; + for (let r = 1; r <= rad; r++) { + for (let d of dirs) { + if (points[(bx + (r - 1) * d.x) + ',' + (by + (r - 1) * d.y)] + && !KinkyDungeonWallTiles.includes(KinkyDungeonMapGet((bx + (r) * d.x), (by + (r) * d.y))) + && (!KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)) || !KDEntityBlocksExp(KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)))) + ) { + points[(bx + (r) * d.x) + ',' + (by + (r) * d.y)] = true; + } + } + } + // Run a second time to break walls + for (let r = 1; r <= rad; r++) { + for (let d of dirs) { + if (points[(bx + (r - 1) * d.x) + ',' + (by + (r - 1) * d.y)] + && (KDCrackableTiles.includes(KinkyDungeonMapGet((bx + (r) * d.x), (by + (r) * d.y))) + || (KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)) && KDEntityBlocksExp(KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)))) + )) { + points[(bx + (r) * d.x) + ',' + (by + (r) * d.y)] = true; + break; // Break the d + } + } + } + //Main case + return points[xx + ',' + yy] != undefined; + }, + "XcrossCrack": (bx, by, xx, yy, rad, modifier = "", ox, oy) => { + let points = {}; + points[bx + ',' + by] = true; + /** + * @type {{x: number, y: number} []} + */ + let dirs = [ + {x: 1, y: 0}, + {x: -1, y: 0}, + {x: 0, y: 1}, + {x: 0, y: -1}, + {x: 1, y: 1}, + {x: -1, y: 1}, + {x: 1, y: -1}, + {x: -1, y: -1}, + ]; + for (let r = 1; r <= rad; r++) { + for (let d of dirs) { + if (points[(bx + (r - 1) * d.x) + ',' + (by + (r - 1) * d.y)] + && !KinkyDungeonWallTiles.includes(KinkyDungeonMapGet((bx + (r) * d.x), (by + (r) * d.y))) + && (!KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)) || !KDEntityBlocksExp(KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)))) + ) { + points[(bx + (r) * d.x) + ',' + (by + (r) * d.y)] = true; + } + } + } + // Run a second time to break walls + for (let r = 1; r <= rad; r++) { + for (let d of dirs) { + if (points[(bx + (r - 1) * d.x) + ',' + (by + (r - 1) * d.y)] + && (KDCrackableTiles.includes(KinkyDungeonMapGet((bx + (r) * d.x), (by + (r) * d.y))) + || (KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)) && KDEntityBlocksExp(KinkyDungeonEntityAt((bx + (r) * d.x), (by + (r) * d.y)))) + )) { + points[(bx + (r) * d.x) + ',' + (by + (r) * d.y)] = true; + break; // Break the d + } + } + } + //Main case + return points[xx + ',' + yy] != undefined; + }, +}; \ No newline at end of file diff --git a/Game/src/magic/KinkyDungeonMagic.ts b/Game/src/magic/KinkyDungeonMagic.ts new file mode 100644 index 000000000..f4678aa12 --- /dev/null +++ b/Game/src/magic/KinkyDungeonMagic.ts @@ -0,0 +1,2758 @@ +"use strict"; +let KinkyDungeonManaCost = 10; // The base mana cost of a spell, multiplied by the spell's level + +let KDEmpowerSprite = "Empower"; +let KDMaxEmpower = 3; // Max upcast level + +let KDConfirmClearSpells = false; + +let KinkyDungeonBookScale = 1.3; + +let KDFlashMana = 0; + +let KinkyDungeonMysticSeals = 0; // Mystic seals are used to unlock a spell from one of 3 books: +// 0 Ars Pyrotecnica - Elemental magic such as fireballs, ice, wind, etc +// 1 Codex Imaginus - Conjuring things such as weapons and restraints, and also enchanting (and disenchanting) +// 2 Clavicula Romantica - Illusory magic, disorientation and affecting enemy AI + +// Magic book image source: https://www.pinterest.es/pin/54324739242326557/ + +// Note that you have these 3 books in your inventory at the start; you select the page open in each of them but you need to have hands free or else you can only turn to a random page at a time. If you are blind, you also can't see any page after you turn the page + +let KinkyDungeonCurrentBook = "Elements"; +let KinkyDungeonCurrentPage = 0; +let KinkyDungeonCurrentSpellsPage = 0; +let KinkyDungeonBooks = ["Elements", "Conjure", "Illusion"]; +let KinkyDungeonPreviewSpell = null; + +let KinkyDungeonDisplayLore = false; + +let KinkyDungeonSpellChoices = [0, 1, 2]; +let KinkyDungeonWeaponChoices: string[] = []; +let KinkyDungeonArmorChoices: string[] = []; +let KinkyDungeonConsumableChoices: string[] = []; + +let KinkyDungeonSpellChoicesToggle = [true, true]; +let KinkyDungeonSpellChoiceCount = 50; +let KinkyDungeonSpellChoiceRenderRows = 7; +let KinkyDungeonSpellChoiceCountPerPage = 10; +let KDSpellPage = 0; + +let KinkyDungeonSpellOffset = 100; +let KinkyDungeonSpellChoiceOffset = 80; + +let KDPlayerHitBy = []; + +let KDSchoolColors = { + "Elements": "#ff4444", + "Conjure": "#77cc99", + "Illusion": "#8877ff", +}; + +let KinkyDungeonMiscastPityModifier = 0; // Current value +let KinkyDungeonMiscastPityModifierIncrementPercentage = 0.5; // Percent of the base hit chance to add + +let KDSpellComponentTypes: Record = { + "Verbal": { + stringShort: (_ret) => { + return TextGet("KDShortCompVerbal"); + }, + stringLong: (_spell) => { + return TextGet("KinkyDungeonComponentsVerbal"); + }, + check: (_spell, _x, _y) => { + let gagTotal = (KinkyDungeonStatsChoice.get("Incantation") && KinkyDungeonGagTotal() > 0) ? 1.0 : KinkyDungeonGagTotal(); + if (gagTotal >= 0.99 && !(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoVerbalComp") > 0)) return false; + + return true; + }, + ignore: (_spell, _x, _y) => { + return (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoVerbalComp") > 0); + }, + partialMiscastChance: (_spell, _x, _y) => { + let gagTotal = (KinkyDungeonStatsChoice.get("Incantation") && KinkyDungeonGagTotal() > 0) ? 1.0 : KinkyDungeonGagTotal(); + if (KinkyDungeonStatsChoice.get("SmoothTalker") && gagTotal < 0.99) gagTotal = 0; + return Math.max(0, Math.min(1, gagTotal)); + }, + partialMiscastType: (_spell, _x, _y) => { + return "Gagged"; + }, + cast: (_spell, data) => { + KinkyDungeonSetFlag("verbalspell", 1); + if (data.originX && data.originY) + KinkyDungeonMakeNoise(4, data.originX, data.originY, false, true); + } + }, + "Arms": { + stringShort: (_ret) => { + return TextGet("KDShortCompArms"); + }, + stringLong: (_spell) => { + return TextGet("KinkyDungeonComponentsArms"); + }, + check: (_spell, _x, _y) => { + if (!(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoArmsComp") > 0)) { + if (KinkyDungeonStatsChoice.get("SomaticPlus") && KDHandBondageTotal(false) < 0.99) return true; + if (KinkyDungeonStatsChoice.get("SomaticMinus") && KinkyDungeonIsHandsBound(false, false, 0.01)) return false; + return !KinkyDungeonIsArmsBound(false, false); + } + return true; + }, + ignore: (_spell, _x, _y) => { + return (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoArmsComp") > 0); + }, + partialMiscastChance: (_spell, _x, _y) => { + if (!KinkyDungeonIsArmsBound(false, false) && !KinkyDungeonStatsChoice.get("SomaticMinus")) return 0; + let handsTotal = (!KinkyDungeonStatsChoice.get("SomaticPlus") && KinkyDungeonIsHandsBound(false, false, 0.01)) ? 1.0 : KDHandBondageTotal(false); + return Math.max(0, Math.min(1, handsTotal)); + }, + partialMiscastType: (_spell, _x, _y) => { + if (KinkyDungeonStatsChoice.get("SomaticMinus")) return "Arms"; + if (KinkyDungeonStatsChoice.get("SomaticPlus")) return "Fingers"; + return "Bug"; + }, + cast: (_spell, _data) => { + KinkyDungeonSetFlag("armspell", 1); + } + }, + "Legs": { + stringShort: (_ret) => { + return TextGet("KDShortCompLegs"); + }, + stringLong: (_spell) => { + return TextGet("KinkyDungeonComponentsLegs"); + }, + check: (_spell, _x, _y) => { + if ((KinkyDungeonSlowLevel > (KinkyDungeonStatsChoice.get("HeelWalker") ? 2 : 1) || (!KinkyDungeonStatsChoice.get("HeelWalker") && KinkyDungeonLegsBlocked())) && !(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoLegsComp") > 0)) return false; + return true; + }, + ignore: (_spell, _x, _y) => { + return (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoLegsComp") > 0); + }, + partialMiscastChance: (_spell, _x, _y) => { + if (KinkyDungeonStatsChoice.get("HeelWalker")) { + if (KinkyDungeonSlowLevel > 1) return 0.5; + } else if (KinkyDungeonSlowLevel > 0) return 0.25; + return 0; + }, + partialMiscastType: (_spell, _x, _y) => { + if (KinkyDungeonStatsChoice.get("PoorForm")) return "PoorForm"; + return "Legs"; + }, + cast: (_spell, _data) => { + KinkyDungeonSetFlag("legspell", 1); + } + }, + "Vision": { + stringShort: (_ret) => { + return TextGet("KDShortCompVision"); + }, + stringLong: (_spell) => { + return TextGet("KinkyDungeonComponentsVision"); + }, + check: (_spell, _x, _y) => { + if (KDMaxEnemyViewDist(undefined) < 2 && !(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoVisionComp") > 0)) return false; + return true; + }, + ignore: (_spell, _x, _y) => { + return (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoVisionComp") > 0); + }, + partialMiscastChance: (_spell, _x, _y) => { + let vd = KDMaxEnemyViewDist(undefined); + if (vd < KDGameData.MaxVisionDist) { + return (KDGameData.MaxVisionDist - vd) / KDGameData.MaxVisionDist; + } + return 0; + }, + partialMiscastType: (_spell, _x, _y) => { + return "Vision"; + }, + cast: (_spell, _data) => { + KinkyDungeonSetFlag("visionspell", 1); + } + }, + +}; + +function KinkyDungeonSearchSpell(list: spell[], name: string): spell { + for (let spell of list) { + if (spell.name == name) { + return spell; + } + } + return null; +} + +let KDSpellMemo = {}; + +/** + * @param name + * @param SearchEnemies + */ +function KinkyDungeonFindSpell(name: string, SearchEnemies: boolean = false): spell { + if (KDSpellMemo[name]) return KDSpellMemo[name]; + if (SearchEnemies) { + let spell = KinkyDungeonSearchSpell(KinkyDungeonSpellListEnemies, name); + if (spell) { + KDSpellMemo[name] = spell; + return spell; + } + } + let spell2 = KinkyDungeonSearchSpell(KinkyDungeonSpellsStart, name); + if (spell2) { + KDSpellMemo[name] = spell2; + return spell2; + } + for (let key in KinkyDungeonSpellList) { + let list = KinkyDungeonSpellList[key]; + let spell = KinkyDungeonSearchSpell(list, name); + if (spell) { + KDSpellMemo[name] = spell; + return spell; + } + } + return KinkyDungeonSearchSpell(KinkyDungeonSpells, name); +} + +function KinkyDungeonDisableSpell(Name: string) { + for (let i = 0; i < KinkyDungeonSpellChoices.length; i++) { + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[i]] && KinkyDungeonSpells[KinkyDungeonSpellChoices[i]].name == Name) { + KinkyDungeonSpellChoicesToggle[i] = false; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + } + } +} + +let KinkyDungeonSpellPress = ""; + +function KinkyDungeonResetMagic() { + KDClearChoices(); + //KinkyDungeonSpellChoiceCount = 50; + KinkyDungeonSpells = []; + KDRefreshSpellCache = true; + Object.assign(KinkyDungeonSpells, KinkyDungeonSpellsStart); // Copy the dictionary + KinkyDungeonMysticSeals = 1.3; + KinkyDungeonSpellPress = ""; + KinkyDungeonCurrentPage = 0; + KinkyDungeonCurrentSpellsPage = 0; + KinkyDungeonSpellPoints = 3; + KDSpellPage = 0; + if (KinkyDungeonStatsChoice.get("randomMode")) { + for (let s of [...KinkyDungeonSpellList.Conjure, ...KinkyDungeonSpellList.Elements, ...KinkyDungeonSpellList.Illusion]) { + if (s.tags?.includes("randomfree")) KDPushSpell(s); + } + } +} + +let KDRefreshSpellCache = true; +function KDPushSpell(spell: spell) { + KinkyDungeonSpells.push(JSON.parse(JSON.stringify(spell))); + KDRefreshSpellCache = true; +} + +let KDSpellCache = new Map(); +let KDUpcastFromCache = new Map(); +let KDEventSpells = new Map(); + +function KDUpdateSpellCache() { + if (KDRefreshSpellCache) { + KDSpellCache = new Map(); + KDUpcastFromCache = new Map(); + KDEventSpells = new Map(); + for (let sp of KinkyDungeonSpells) { + KDSpellCache.set(sp.name, sp); + if (sp.upcastFrom) { + if (!KDUpcastFromCache.get(sp.upcastFrom)) KDUpcastFromCache.set(sp.upcastFrom, []); + KDUpcastFromCache.get(sp.upcastFrom).push(sp); + } + if (sp.events) { + for (let e of sp.events) { + if (!KDEventSpells.get(e.trigger)) KDEventSpells.set(e.trigger, new Map()); + KDEventSpells.get(e.trigger).set(sp, true); + } + } + } + KDRefreshSpellCache = false; + } +} + +/** + * @param name + */ +function KDHasSpell(name: string): boolean { + for (let s of KinkyDungeonSpells) { + if (s.name == name) return true; + } + return false; +} + +/** + * @param name + * @param Level - Spell level. Set to -1 to allow any level + */ +function KDGetUpcast(name: string, Level: number): spell { + if (Level < 0) { + KDUpdateSpellCache(); + return KDUpcastFromCache.get(name) ? KDUpcastFromCache.get(name)[0] : null; + /*for (let sp of KinkyDungeonSpells) { + if (sp.upcastFrom && sp.upcastFrom == name) { + return sp; + } + }*/ + } else { + for (let i = Level; i > 0; i--) { + if (KDUpcastFromCache.get(name)) { + for (let sp of KDUpcastFromCache.get(name)) { + if (i == sp.upcastLevel) { + return sp; + } + } + } + } + } + return null; +} + +/** + * @param name + */ +function KDHasUpcast(name: string): boolean { + return KDUpcastFromCache.get(name); +} + +function KDCanUpcast(): boolean { + for (let i of KinkyDungeonSpellChoices) { + let spell = KinkyDungeonSpells[i]; + if (spell) { + let upcast = KDGetUpcast(spell.name, -1); + if (upcast) { + return true; + } + } + + } + return false; +} + +function KDEmpower(_data: any, _entity: any) { + let Level = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellEmpower"); + if (!KDCanUpcast()) { + KinkyDungeonSendActionMessage(10, TextGet("KDSpellEmpowerFail"), "#ffffff", 1); + } else { + KinkyDungeonTargetingSpell = null; + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + // Success, we upcast + let newLevel = Math.min(KDMaxEmpower, Level + 1); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "Empower", + aura: "#aaaaff", + type: "SpellEmpower", + maxCount: 1, + currentCount: 1, + power: newLevel, + duration: 13, + tags: ["cast", "upcast"], + }); + KinkyDungeonSendActionMessage(5, TextGet("KDSpellEmpowerMsg").replace("LEVEL", "" + newLevel), "#aaaaff", 2); + KinkyDungeonAdvanceTime(1, true); + } +} + +function KinkyDungeoCheckComponentsPartial(spell: spell, x: number, y: number, includeFull: boolean, noOverride?: boolean): string[] { + + let failedcomp: string[] = []; + let failedcompFull: string[] = []; + + if (spell.components) + for (let comp of spell.components) { + if (includeFull && !KDSpellComponentTypes[comp].check(spell, x, y)) { + failedcompFull.push(comp); + } else if (KDSpellComponentTypes[comp].partialMiscastChance(spell, x, y) > 0) { + failedcomp.push(comp); + } + } + + let data = { + spell: spell, + failed: failedcompFull, + partial: failedcomp, + x: x || KinkyDungeonPlayerEntity.x, + y: y || KinkyDungeonPlayerEntity.y}; + if (!noOverride) + KinkyDungeonSendEvent("calcCompPartial", data); + if (includeFull) { + return [...data.partial, ...data.failed]; + } + return data.partial; +} + +function KinkyDungeoCheckComponents(spell: spell, x?: number, y?: number, noOverride?: boolean): { + components: string[], + failed: string[], + } { + let failedcomp: string[] = []; + + let data = { + spell: spell, + components: spell.components, + failed: failedcomp, + x: x || KinkyDungeonPlayerEntity.x, + y: y || KinkyDungeonPlayerEntity.y}; + + if (!noOverride) + KinkyDungeonSendEvent("beforeCalcComp", data); + + if (data.components) + for (let comp of data.components) { + if (!KDSpellComponentTypes[comp].check(spell, x, y)) { + failedcomp.push(comp); + } + } + + if (!noOverride) + KinkyDungeonSendEvent("calcComp", data); + return { + components: data.components, + failed: data.failed, + }; +} + +function KinkyDungeonHandleSpellChoice(SpellChoice: number): spell { + let spell = KinkyDungeonHandleSpellCast(KDGetUpcast(KinkyDungeonSpells[SpellChoice].name, + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellEmpower")) || KinkyDungeonSpells[SpellChoice]); + return spell; +} + +/** + * @param spell + * @param [x] + * @param [y] + */ +function KDSpellIgnoreComp(spell: spell, x?: number, y?: number, components?: string[]): boolean { + let ignore = true; + if (components || spell?.components) { + for (let c of components || spell.components) { + if (!KDSpellComponentTypes[c]?.ignore || !KDSpellComponentTypes[c].ignore(spell, x, y)) ignore = false; + } + } + + return ignore; +} + +function KinkyDungeonHandleSpellCast(spell: spell) { + let cp = KinkyDungeoCheckComponents(spell); + if (cp.failed.length == 0 || ( + KDSpellIgnoreComp(spell,undefined,undefined,cp.components) + )) { + if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) + && (!spell.staminacost || KinkyDungeonHasStamina(spell.staminacost))) + return spell; + else { + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonNoMana"), "#ff5277", 1); + KDFlashMana = 1000; + } + } else { + KinkyDungeonTargetingSpell = null; + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonComponentsFail" + KinkyDungeoCheckComponents(spell)?.components[0]), "#ff5277", 1); + } + return null; +} + +function KinkyDungeonClickSpell(i: number) { + let spell = null; + let clicked = false; + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[i]]) { + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[i]] && KinkyDungeonSpells[KinkyDungeonSpellChoices[i]].type == "passive") { + KDSendInput("toggleSpell", {i: i}); + if (KinkyDungeonSpellChoicesToggle[i] && KinkyDungeonSpells[KinkyDungeonSpellChoices[i]].cancelAutoMove) { + KinkyDungeonFastMove = false; + KinkyDungeonFastMoveSuppress = false; + } + KinkyDungeonSpellPress = ""; + clicked = true; + } else { + spell = KinkyDungeonHandleSpellChoice(KinkyDungeonSpellChoices[i]); + clicked = true; + } + } else if (KinkyDungeonConsumableChoices[i] && KinkyDungeonInventoryGetConsumable(KinkyDungeonConsumableChoices[i])?.quantity > 0) { + KDSendInput("consumable", {item: KinkyDungeonConsumableChoices[i], quantity: 1}); + KinkyDungeonSpellPress = ""; + clicked = true; + } else if (KinkyDungeonWeaponChoices[i] && KinkyDungeonInventoryGetWeapon(KinkyDungeonWeaponChoices[i])) { + KDSendInput("switchWeapon", {weapon: KinkyDungeonWeaponChoices[i]}); + KinkyDungeonSpellPress = ""; + clicked = true; + } else if (KinkyDungeonArmorChoices[i] && KinkyDungeonInventoryGetLoose(KinkyDungeonArmorChoices[i])) { + let item = KinkyDungeonInventoryGetLoose(KinkyDungeonArmorChoices[i]); + + if (KDRestraint(item)?.good || KDRestraint(item)?.armor) { + let equipped = false; + let newItem = null; + let currentItem = null; + + if (item) { + newItem = KDRestraint(item); + if (newItem) { + currentItem = KinkyDungeonGetRestraintItem(newItem.Group); + + if (!currentItem + || KDCurrentItemLinkable(currentItem, newItem)) { + equipped = false; + } else equipped = true; + } + } + if (!equipped && newItem) { + KDSendInput("equip", {name: item.name, + inventoryVariant: item.name != newItem.name ? + item.name : undefined, + faction: item.faction, + group: newItem.Group, curse: item.curse, currentItem: currentItem ? currentItem.name : undefined, events: Object.assign([], item.events)}); + } + } else { + KDSendInput("quickRestraint", {item: item.name, quantity: 1}); + } + + KinkyDungeonSpellPress = ""; + clicked = true; + } + return {spell: spell, clicked: clicked}; +} + +let KDSwapSpell = -1; + +function KinkyDungeonHandleSpell(ind?: number): boolean { + let clicked = false; + let spell = null; + if (!ind) { + for (let i = 0; i < KinkyDungeonSpellChoiceCountPerPage; i++) { + let index = i + KDSpellPage*KinkyDungeonSpellChoiceCountPerPage; + + if (KinkyDungeonSpellPress == KinkyDungeonKeySpell[i]) { + let result = KinkyDungeonClickSpell(index); + spell = result.spell; + clicked = result.clicked; + } + } + for (let ii = 0; ii < KinkyDungeonSpellChoiceCount; ii++) { + if (MouseInKD("SpellCast" + ii) || MouseInKD("UseItem" + ii)) { + let result = KinkyDungeonClickSpell(ii); + spell = result.spell; + clicked = result.clicked; + } + } + } else { + let result = KinkyDungeonClickSpell(ind); + spell = result.spell; + clicked = result.clicked; + } + + if (spell) { + // Otherwise. + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + KinkyDungeonTargetingSpell = spell; + KDModalArea = false; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = null; + KinkyDungeonSendActionMessage(5, TextGet("KinkyDungeonSpellTarget" + spell.name).replace("SpellArea", "" + Math.floor(spell.aoe)), "white", 0.1, true); + return true; + } + if (clicked) return true; + return false; +} + +/** + * @param Spell + * @param [Passive] + * @param [Toggle] + */ +function KinkyDungeonGetStaminaCost(Spell: spell, Passive?: boolean, Toggle?: boolean): number { + let data = { + passive: Passive, + toggle: Toggle, + spell: Spell, + cost: Spell.staminacost || 0, + costscale: KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StaminaCostMult")), + }; + KinkyDungeonSendEvent("calcStamina", data); + if (data.costscale) data.cost = Math.floor(1000* data.cost * data.costscale)/1000; + //if (data.costscale > 0) data.cost = Math.max(0, data.cost); // Keep it from rounding to 0 + KinkyDungeonSendEvent("beforeMultStamina", data); + KinkyDungeonSendEvent("calcMultStamina", data); + KinkyDungeonSendEvent("afterMultStamina", data); + KinkyDungeonSendEvent("afterCalcStamina", data); + + return data.cost; +} + +/** + * @param Spell + * @param [Passive] + * @param [Toggle] + */ +function KinkyDungeonGetManaCost(Spell: spell, Passive?: boolean, Toggle?: boolean): number { + let data = { + passive: Passive, + toggle: Toggle, + spell: Spell, + cost: Spell.manacost, + costscale: KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ManaCostMult")), + lvlcostscale: KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ManaCostLevelMult"), + efficiency: 0 + }; + KinkyDungeonSendEvent("beforeCalcMana", data); + KinkyDungeonSendEvent("calcMana", data); + if (data.costscale) data.cost = Math.floor(1000* data.cost * data.costscale)/1000; + //if (data.costscale > 0) data.cost = Math.max(0, data.cost); // Keep it from rounding to 0 + if (data.lvlcostscale && Spell.level && Spell.manacost) data.cost += Spell.level * data.lvlcostscale; + KinkyDungeonSendEvent("beforeMultMana", data); + KinkyDungeonSendEvent("calcEfficientMana", data); + KinkyDungeonSendEvent("calcMultMana", data); + data.cost *= KinkyDungeonMultiplicativeStat(data.efficiency); + KinkyDungeonSendEvent("afterMultMana", data); + KinkyDungeonSendEvent("afterCalcMana", data); + + return data.cost; +} + +/** + * @param Spell + * @param [Passive] + * @param [Toggle] + */ +function KinkyDungeonGetChargeCost(Spell: spell, Passive?: boolean, Toggle?: boolean): number { + let data = { + passive: Passive, + toggle: Toggle, + spell: Spell, + cost: Spell.chargecost || 0, + costscale: KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ChargeCostMult")), + }; + KinkyDungeonSendEvent("calcCharge", data); + if (data.costscale) data.cost = Math.floor(1000* data.cost * data.costscale)/1000; + KinkyDungeonSendEvent("beforeMultCharge", data); + KinkyDungeonSendEvent("calcMultCharge", data); + KinkyDungeonSendEvent("afterMultCharge", data); + KinkyDungeonSendEvent("afterCalcCharge", data); + + return data.cost; +} + +/** + * @param Spell + */ +function KinkyDungeonGetCost(Spell: spell): number { + let cost = Spell.level; + if (Spell.spellPointCost != undefined) cost = Spell.spellPointCost; + //if (Spell.level > 1 && !Spell.passive && KinkyDungeonStatsChoice.get("Novice")) cost *= 2; + if (Spell.classSpecific && KDGameData.Class != Spell.classSpecific) cost *= 2; + let bonus = 0; + if (Spell.increasingCost) { + for (let s of KinkyDungeonSpells) { + if (s != Spell && s.increasingCost && (!KinkyDungeonStatsChoice.get("randomMode") || !s.tags?.includes("randomfree"))) bonus += 1; + if (s != Spell && s.decreaseCost) bonus -= 1; + } + if (KinkyDungeonStatsChoice.get("Studious")) bonus -= 2; + } + return Math.max(0, cost + bonus); +} + + + +/** + * @param enemy - Origin + * @param [mult] - Radius multiplier + * @param [hideShockwave] + */ +function KinkyDungeonMakeNoiseSignal(enemy: entity, mult: number = 1, hideShockwave?: boolean): entity[] { + let data = { + enemy: enemy, + mult: mult, + bonus: 0, + bonusafter: 2, + radius: 5, + x: enemy.x, + y: enemy.y, + enemiesHeard: [], + particle: !hideShockwave, + }; + KinkyDungeonSendEvent("beforeSignal", data); + + data.radius += data.bonus; + data.radius *= mult; + data.radius += data.bonusafter; + + for (let e of KDNearbyEnemies(enemy.x, enemy.y, data.radius * 2)) { + if (e != enemy && (!e.aware || e.idle) && (!e.action || e.action == "investigatesignal" || e.action == "investigatesound") + && !e.path + && KDEnemyAction.investigatesignal.filter(e) + && KDFactionAllied(KDGetFaction(enemy), KDGetFaction(e)) + && (!e.Enemy.tags.peaceful || KDRandom() < 0.15) + && !e.Enemy.tags.deaf + && !KDAmbushAI(e) + && KDCanHearSound(e, data.radius, enemy.x, enemy.y)) + { + e.gx = enemy.x; + e.gy = enemy.y; + e.action = "investigatesignal"; + KinkyDungeonSetEnemyFlag(e, ""); + KDAddThought(e.id, "Search", 2, 2 + 3*KDistEuclidean(e.x - data.x, e.y - data.y)); + data.enemiesHeard.push(e); + } + } + + KinkyDungeonMakeNoise(data.radius, enemy.x, enemy.y, !data.particle, true); + + + + KinkyDungeonSendEvent("afterSignal", data); + + return data.enemiesHeard; +} + +/** + * @param radius - Magnitude of the noise + * @param noiseX - Location of noise + * @param noiseY - Location of noise + * @param [hideShockwave] - Whether it shows a ping + * @param [attachToEntity] - Whether it adds to the entity's sound or not + * @returns {entity[]} enemies who heard it + */ +function KinkyDungeonMakeNoise(radius: number, noiseX: number, noiseY: number, hideShockwave?: boolean, + attachToEntity?: boolean): entity[] { + let data = { + radius: radius, + x: noiseX, + y: noiseY, + enemiesHeard: [], + particle: !hideShockwave, + }; + KinkyDungeonSendEvent("beforeNoise", data); + + if (attachToEntity) { + let entity = KinkyDungeonEntityAt(noiseX, noiseY); + if (entity) { + entity.sound = Math.max(entity.sound || 0, data.radius); + } + } + + for (let e of KDMapData.Entities) { + if ((!e.aware || e.idle) && (!e.action || e.action == "investigatesound") + && !e.path + && !KDAllied(e) + && (KDHostile(e) || KDRandom() < 0.33) + && (!e.Enemy.tags.peaceful || KDRandom() < 0.15) + && !e.Enemy.tags.deaf + && KDEnemyAction.investigatesound.filter(e) + && !KDAmbushAI(e) + && KDCanHearSound(e, data.radius, data.x, data.y)) + { + e.gx = data.x; + e.gy = data.y; + e.action = "investigatesound"; + KDAddThought(e.id, "Search", 2, 2 + 3*KDistEuclidean(e.x - data.x, e.y - data.y)); + data.enemiesHeard.push(e); + } + } + KinkyDungeonSendEvent("afterNoise", data); + return data.enemiesHeard; +} + +/** + * + * @param data + * @param {spell} data.spell + * @param {string} data.gaggedMiscastType + * @param {number} data.targetX + * @param {number} data.targetY + * @param {object} data.flags + * @param {boolean} data.gaggedMiscastFlag + */ +function KDDoGaggedMiscastFlag(data: any, components: string[]) { + let lastPartialChance = 0; + + + if (!KDSpellIgnoreComp(data.spell)) { + for (let c of components || data.components || data.spell.components) { + if (KDSpellComponentTypes[c]?.partialMiscastChance && KDSpellComponentTypes[c].check(data.spell, data.targetX, data.targetY)) { + let partialMiscastChance = KDSpellComponentTypes[c].partialMiscastChance(data.spell, data.targetX, data.targetY); + if (partialMiscastChance > 0) { + if (lastPartialChance == 0 || KDRandom() < partialMiscastChance) { + lastPartialChance = partialMiscastChance; + data.gaggedMiscastType = KDSpellComponentTypes[c].partialMiscastType(data.spell, data.targetX, data.targetY); + } + data.flags.miscastChance = data.flags.miscastChance + Math.max(0, 1 - data.flags.miscastChance) * (partialMiscastChance); + data.gaggedMiscastFlag = true; + } + + } + } + } +} + +/** + * @param targetX + * @param targetY + * @param spell + * @param enemy + * @param player + * @param bullet + * @param [forceFaction] + * @param [castData] + */ +function KinkyDungeonCastSpell(targetX: number, targetY: number, spell: spell, enemy: entity, player: any, bullet?: any, forceFaction?: string, castData?: any): {result: string, data: any} { + let entity = KinkyDungeonPlayerEntity; + let moveDirection = KinkyDungeonMoveDirection; + let flags = { + miscastChance: KinkyDungeonMiscastChance, + }; + + let faction = spell.allySpell ? "Player" : (spell.enemySpell ? "Enemy" : "Player"); + if (forceFaction) faction = forceFaction; + else { + if (!enemy && !bullet && player) faction = "Player"; + else if (enemy) { + let f = KDGetFaction(enemy); + if (f) faction = f; + } else if (bullet && bullet.bullet) { + let f = bullet.bullet.faction; + if (f) faction = f; + } + if (spell.faction) faction = spell.faction; + } + + + if (!enemy && !bullet && player) { + // Face spell cast direction + KDTurnToFace(targetX - KinkyDungeonPlayerEntity.x, targetY - KinkyDungeonPlayerEntity.y); + } + + let cp = KinkyDungeoCheckComponents(spell, targetX, targetY, false); + + let data = Object.assign({...castData}, { + spell: spell, + bulletfired: null, + target: null, + targetX: targetX, + targetY: targetY, + originX: KinkyDungeonPlayerEntity.x, + originY: KinkyDungeonPlayerEntity.y, + flags: flags, + enemy: enemy, + bullet: bullet, + player: player, + delta: 1, + components: cp.components, + failed: cp.failed, + gaggedMiscastFlag: false, + gaggedMiscastType: "Gagged", + channel: spell.channel, + castID: KinkyDungeonGetSpellID(), + manacost: (!enemy && !bullet && player) ? KinkyDungeonGetManaCost(spell) : 0, + }); + + if (!enemy && !bullet && player && data.components) { + let cpp = KinkyDungeoCheckComponentsPartial(data.spell, + data.originX, + data.originY, + false, + false, + ); + + if (cpp.length > 0) + KDDoGaggedMiscastFlag(data, cpp); + } + + + if (!enemy && !bullet && player) { + KinkyDungeonSendEvent("beforeCast", data); + } + let tX = targetX; + let tY = targetY; + let miscast = false; + let selfCast = !enemy && !bullet && player && targetX == KinkyDungeonPlayerEntity.x && targetY == KinkyDungeonPlayerEntity.y; + if (!enemy && !player && !bullet) { + moveDirection = {x:0, y:0, delta:1}; + } + + //let noiseX = targetX; + //let noiseY = targetY; + + if (enemy && player) { + entity = enemy; + moveDirection = KinkyDungeonGetDirection(player.x - entity.x, player.y - entity.y); + flags.miscastChance = 0; + } + if (bullet) { + entity = bullet; + if (bullet.bullet.cast) { + moveDirection = {x:bullet.bullet.cast.mx, y:bullet.bullet.cast.my, delta: 1}; + } else { + moveDirection = {x:0, y:0, delta: 0}; + } + flags.miscastChance = 0; + } + if (enemy && !player && !bullet) { + entity = enemy; + moveDirection = KinkyDungeonGetDirection(targetX - entity.x, targetY - entity.y); + flags.miscastChance = 0; + } + if (!spell.noMiscast && !enemy && !bullet && player && Math.min(1, KDRandom() + KinkyDungeonMiscastPityModifier) < flags.miscastChance) { + // Increment the pity timer + KinkyDungeonMiscastPityModifier += KinkyDungeonMiscastPityModifierIncrementPercentage * Math.max(1 - flags.miscastChance, 0); + + if (data.gaggedMiscastFlag) + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSpellMiscast" + data.gaggedMiscastType), "#ff8933", 2); + else + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSpellMiscast"), "#ff8933", 2); + + miscast = true; + + if (!spell.special) { + moveDirection = {x:0, y:0, delta:1}; + tX = entity.x; + tY = entity.y; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + (spell.miscastSfx || "SoftShield") + ".ogg"); + KinkyDungeonSendEvent("miscast", data); + KinkyDungeonSetFlag("miscast", 1); + + return {result: "Miscast", data: data}; + } + } + + + + let spellRange = KDGetSpellRange(spell); + + if (spell.type != "bolt" && spell.effectTilePre) { + KDCreateAoEEffectTiles(tX,tY, spell.effectTilePre, spell.effectTileDurationModPre, (spell.aoe) ? spell.aoe : 0.5); + } + + let originaltX = tX; + let originaltY = tY; + let originalSpeed = spell.speed; + let castCount = spell.shotgunCount ? spell.shotgunCount : 1; + let base = spell.shotgunSpread ? KDRandom()*Math.PI*2 : 0; + for (let castI = 0; castI < castCount; castI++) { + // Reset tx + tX = originaltX; + tY = originaltY; + // Project out to shotgundistance + if (spell.shotgunDistance) { + let dx = tX - entity.x; + let dy = tY - entity.y; + let dmult = KDistEuclidean(dx, dy); + if (dmult != 0) dmult = 1/dmult; + + tX = entity.x + dx*dmult * spell.shotgunDistance; + tY = entity.y + dy*dmult * spell.shotgunDistance; + } + // Add spread + if (spell.shotgunSpread) { + if (spell.shotgunFan) { + let dx = tX - entity.x; + let dy = tY - entity.y; + let dmult = KDistEuclidean(dx, dy); + let ang = Math.atan2(dy, dx) - spell.shotgunSpread + 2 * spell.shotgunSpread * (castCount > 1 ? ((castI / (castCount - 1))) : KDRandom()); + tX = entity.x + Math.cos(ang)*(spell.shotgunDistance || dmult); + tY = entity.y + Math.sin(ang)*(spell.shotgunDistance || dmult); + } else { + let ang = base + 2 * Math.PI * (castCount > 1 ? ((castI / (castCount - 1))) : KDRandom());// * 2 * Math.PI; + tX += spell.shotgunSpread * ((castI+1) / castCount) * Math.cos(ang); + tY += spell.shotgunSpread * ((castI+1) / castCount) * Math.sin(ang); + } + } + + let speed = originalSpeed; + // Add speedSpread + if (spell.shotgunSpeedBonus && castCount > 1) { + speed += spell.shotgunSpeedBonus * (castI / (castCount - 1)); + } + + + let cast = spell.spellcast ? Object.assign({}, spell.spellcast) : undefined; + + if (cast) { + if (cast.target == "target") { + if (tX == entity.x + moveDirection.x && tY == entity.y + moveDirection.y && !cast.noTargetMoveDir) { + cast.tx = tX + moveDirection.x; + cast.ty = tY + moveDirection.y; + } else { + cast.tx = tX; + cast.ty = tY; + } + } else if (cast.target == "origin") { + cast.tx = entity.x; + cast.ty = entity.y; + } + if (cast.directional) { + if (cast.randomDirection) { + let slots = []; + for (let XX = -1; XX <= 1; XX++) { + for (let YY = -1; YY <= 1; YY++) { + if ((XX != 0 || YY != 0) && KinkyDungeonNoEnemy(entity.x + XX, entity.y + YY, true) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(entity.x + XX, entity.y + YY))) slots.push({x:XX, y:YY}); + } + } + if (slots.length > 0) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + cast.mx = slot.x; + cast.my = slot.y; + moveDirection.x = slot.x; + moveDirection.y = slot.y; + } else { + cast.mx = moveDirection.x; + cast.my = moveDirection.y; + } + } else if (cast.randomDirectionPartial || cast.randomDirectionFallback) { + if (cast.randomDirectionFallback && (!cast.alwaysRandomBuff || !KDEntityHasBuff(entity, cast.alwaysRandomBuff)) + && KinkyDungeonNoEnemy(entity.x + moveDirection.x, entity.y + moveDirection.y, true) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(entity.x + moveDirection.x, entity.y + moveDirection.y))) { + + cast.mx = moveDirection.x; + cast.my = moveDirection.y; + } else { + let slots = []; + let dist = KDistEuclidean(entity.x - tX, entity.y - tY); + for (let XX = -1; XX <= 1; XX++) { + for (let YY = -1; YY <= 1; YY++) { + if ((XX != 0 || YY != 0) && KinkyDungeonNoEnemy(entity.x + XX, entity.y + YY, true) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(entity.x + XX, entity.y + YY)) + && (entity.x + XX != tX || entity.y + YY != tY) + && KDistEuclidean(entity.x + XX - tX, entity.y + YY - tY) <= dist + 0.1) slots.push({x:XX, y:YY}); + } + } + if (slots.length == 0) { + let src = (entity?.player ? -1 : entity?.id) || bullet?.bullet?.source; + if (src == -1 || KinkyDungeonFindID(src)) { + for (let XX = -1; XX <= 1; XX++) { + for (let YY = -1; YY <= 1; YY++) { + if ((XX != 0 || YY != 0) && ( + src == -1 ? ( + KDHostile(KinkyDungeonEntityAt(entity.x + XX, entity.y + YY)) + ) : ( + KDHostile(KinkyDungeonFindID(src), KinkyDungeonEntityAt(entity.x + XX, entity.y + YY)) + ) + ) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(entity.x + XX, entity.y + YY)) + && (entity.x + XX != tX || entity.y + YY != tY) + && KDistEuclidean(entity.x + XX - tX, entity.y + YY - tY) <= dist + 0.1) slots.push({x:XX, y:YY}); + } + } + } + + } + if (slots.length == 0) { + for (let XX = -1; XX <= 1; XX++) { + for (let YY = -1; YY <= 1; YY++) { + if ((XX != 0 || YY != 0) && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(entity.x + XX, entity.y + YY)) + && (entity.x + XX != tX || entity.y + YY != tY) + && KDistEuclidean(entity.x + XX - tX, entity.y + YY - tY) <= dist + 0.1) slots.push({x:XX, y:YY}); + } + } + + } + if (slots.length > 0) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + cast.mx = slot.x; + cast.my = slot.y; + moveDirection.x = slot.x; + moveDirection.y = slot.y; + } else { + cast.mx = moveDirection.x; + cast.my = moveDirection.y; + if (entity.x + cast.mx == tX && entity.y + cast.my == tY) { + cast.tx += moveDirection.x; + cast.ty += moveDirection.y; + } + } + } + } else { + cast.mx = moveDirection.x; + cast.my = moveDirection.y; + } + + } + if (cast.aimAtTarget && KinkyDungeonPlayerEntity.x == targetX && KinkyDungeonPlayerEntity.x == targetY) { + cast.targetID = -1; + } + else if (cast.aimAtTarget && KinkyDungeonEnemyAt(targetX, targetY) && KDCanSeeEnemy(KinkyDungeonEnemyAt(targetX, targetY), KDistEuclidean(entity.x - targetX, entity.y - targetY))) { + cast.targetID = KinkyDungeonEnemyAt(targetX, targetY).id; + } + } + + + if (spell.type == "bolt") { + let size = (spell.size) ? spell.size : 1; + let xx = entity.x; + let yy = entity.y; + //noiseX = entity.x; + //noiseY = entity.y; + if (!spell.noDirectionOffset) { + if (!bullet || (bullet.spell && bullet.spell.cast && bullet.spell.cast.offset)) { + xx += moveDirection.x; + yy += moveDirection.y; + } + } + if (data.xx || data.yy) { + xx = data.xx; + yy = data.yy; + } + + if (spell.effectTilePre) { + KDCreateAoEEffectTiles(tX-entity.x,tY - entity.y, spell.effectTilePre, spell.effectTileDurationModPre, (spell.aoe) ? spell.aoe : 0.5); + } + if (xx == tX-entity.x && yy == tY-entity.y) { + // Avoid bolt bullets in place + if (moveDirection && (moveDirection.x || moveDirection.y)) { + tX += moveDirection.x; + tY += moveDirection.y; + } else { + tX += 1; + } + } + let b = KinkyDungeonLaunchBullet(xx, yy, + tX - entity.x,tY - entity.y, + speed, {noSprite: spell.noSprite, faction: faction, name:spell.name, block: spell.block, volatile: spell.volatile, blockType: spell.blockType, + volatilehit: spell.volatilehit, + width:size, height:size, summon:spell.summon, + targetX: tX, targetY: tY, + source: spell.noSource ? undefined : ((entity?.player ? -1 : entity?.id) || bullet?.bullet?.source), cast: cast, dot: spell.dot, + bulletColor: spell.bulletColor, bulletLight: spell.bulletLight, + bulletSpin: spell.bulletSpin, + followPlayer: (!enemy && player && spell.followCaster) ? true : undefined, + followCaster: (enemy && spell.followCaster) ? enemy.id : undefined, + effectTile: spell.effectTile, effectTileDurationMod: spell.effectTileDurationMod, aoe: spell.bulletAoE, + effectTileTrail: spell.effectTileTrail, effectTileDurationModTrail: spell.effectTileDurationModTrail, effectTileTrailAoE: spell.effectTileTrailAoE, + passthrough: spell.noTerrainHit, noEnemyCollision: spell.noEnemyCollision, alwaysCollideTags: spell.alwaysCollideTags, nonVolatile:spell.nonVolatile, noDoubleHit: spell.noDoubleHit, + pierceEnemies: spell.pierceEnemies, piercing: spell.piercing, events: spell.events, + lifetime:miscast || selfCast ? 1 : (spell.bulletLifetime ? spell.bulletLifetime : 1000), origin: {x: entity.x, y: entity.y}, range: spellRange, hit:spell.onhit, + damage: {evadeable: spell.evadeable, noblock: spell.noblock, damage:spell.power, type:spell.damage, distract: spell.distract, distractEff: spell.distractEff, desireMult: spell.desireMult, bindEff: spell.bindEff, + shield_crit: spell?.shield_crit, // Crit thru shield + shield_stun: spell?.shield_stun, // stun thru shield + shield_freeze: spell?.shield_freeze, // freeze thru shield + shield_bind: spell?.shield_bind, // bind thru shield + shield_snare: spell?.shield_snare, // snare thru shield + shield_slow: spell?.shield_slow, // slow thru shield + shield_distract: spell?.shield_distract, // Distract thru shield + shield_vuln: spell?.shield_vuln, // Vuln thru shield + tease: spell?.tease, + addBind: spell?.addBind, + bind: spell.bind, crit: spell.crit, bindcrit: spell.bindcrit, bindType: spell.bindType, boundBonus: spell.boundBonus, time:spell.time, flags:spell.damageFlags}, spell: spell}, miscast, + entity.x, entity.y); + b.visual_x = entity.x; + b.visual_y = entity.y; + data.bulletfired = b; + } else if (spell.type == "inert" || spell.type == "dot") { + let sz = spell.size; + if (!sz) sz = 1; + if (spell.meleeOrigin) { + if (!spell.noDirectionOffset) { + tX = entity.x + moveDirection.x; + tY = entity.y + moveDirection.y; + } else { + tX = entity.x; + tY = entity.y; + } + } + let b = KinkyDungeonLaunchBullet(tX, tY, + moveDirection.x,moveDirection.y, + 0, { + noSprite: spell.noSprite, faction: faction, name:spell.name, block: spell.block, volatile: spell.volatile, blockType: spell.blockType, + volatilehit: spell.volatilehit, + width:sz, height:sz, summon:spell.summon, + targetX: tX, targetY: tY, + aoe: spell.type == "dot" ? spell.bulletAoE : undefined, + source: spell.noSource ? undefined : ((entity?.player ? -1 : entity?.id) || bullet?.bullet?.source), + lifetime:spell.delay + + (spell.delayRandom ? Math.floor(KDRandom() * spell.delayRandom) : 0), + cast: cast, dot: spell.dot, events: spell.events, alwaysCollideTags: spell.alwaysCollideTags, + bulletColor: spell.bulletColor, bulletLight: spell.bulletLight, + bulletSpin: spell.bulletSpin, + followPlayer: (!enemy && player && spell.followCaster) ? true : undefined, + followCaster: (enemy && spell.followCaster) ? enemy.id : undefined, + passthrough:(spell.CastInWalls || spell.WallsOnly || spell.noTerrainHit), hit:spell.onhit, + noDoubleHit: spell.noDoubleHit, effectTile: spell.effectTile, effectTileDurationMod: spell.effectTileDurationMod, + damage: spell.type == "inert" ? null : {evadeable: spell.evadeable, noblock: spell.noblock, damage:spell.power, type:spell.damage, distract: spell.distract, distractEff: spell.distractEff, desireMult: spell.desireMult, + shield_crit: spell?.shield_crit, // Crit thru shield + shield_stun: spell?.shield_stun, // stun thru shield + shield_freeze: spell?.shield_freeze, // freeze thru shield + shield_bind: spell?.shield_bind, // bind thru shield + shield_snare: spell?.shield_snare, // snare thru shield + shield_slow: spell?.shield_slow, // slow thru shield + shield_distract: spell?.shield_distract, // Distract thru shield + shield_vuln: spell?.shield_vuln, // Vuln thru shield + tease: spell?.tease, + bindEff: spell?.bindEff, + addBind: spell?.addBind, + bind: spell.bind, crit: spell.crit, bindcrit: spell.bindcrit, bindType: spell.bindType, boundBonus: spell.boundBonus, time:spell.time, flags:spell.damageFlags}, spell: spell + }, miscast, + entity.x, entity.y); + data.bulletfired = b; + } else if (spell.type == "hit") { + let sz = spell.size; + if (!sz) sz = 1; + if (spell.meleeOrigin) { + if (!spell.noDirectionOffset) { + tX = entity.x + moveDirection.x; + tY = entity.y + moveDirection.y; + } else { + tX = entity.x; + tY = entity.y; + } + } + let b = {x: tX, y:tY, + vx: moveDirection.x,vy: moveDirection.y, born: 1, + ox: entity.x, oy: entity.y, + bullet: {noSprite: spell.noSprite, faction: faction, name:spell.name, block: spell.block, volatile: spell.volatile, blockType: spell.blockType, + volatilehit: spell.volatilehit, + width:sz, height:sz, summon:spell.summon, + targetX: tX, targetY: tY, + followPlayer: (!enemy && player && spell.followCaster) ? true : undefined, + followCaster: (enemy && spell.followCaster) ? enemy.id : undefined, + source: spell.noSource ? undefined : ((entity?.player ? -1 : entity?.id) || bullet?.bullet?.source), + lifetime:spell.lifetime, cast: cast, dot: spell.dot, events: spell.events, + aoe: spell.aoe, + passthrough:(spell.CastInWalls || spell.WallsOnly || spell.noTerrainHit), hit:spell.onhit, noDoubleHit: spell.noDoubleHit, effectTile: spell.effectTile, effectTileDurationMod: spell.effectTileDurationMod, + damage: {evadeable: spell.evadeable, noblock: spell.noblock, damage:spell.power, type:spell.damage, distract: spell.distract, distractEff: spell.distractEff, desireMult: spell.desireMult, bindEff: spell.bindEff, + shield_crit: spell?.shield_crit, // Crit thru shield + shield_stun: spell?.shield_stun, // stun thru shield + shield_freeze: spell?.shield_freeze, // freeze thru shield + shield_bind: spell?.shield_bind, // bind thru shield + shield_snare: spell?.shield_snare, // snare thru shield + shield_slow: spell?.shield_slow, // slow thru shield + shield_distract: spell?.shield_distract, // Distract thru shield + shield_vuln: spell?.shield_vuln, // Vuln thru shield + tease: spell?.tease, + addBind: spell?.addBind, + bind: spell.bind, bindcrit: spell.bindcrit, crit: spell.crit, bindType: spell.bindType, boundBonus: spell.boundBonus, time:spell.time, flags:spell.damageFlags}, spell: spell}}; + KinkyDungeonBulletHit(b, 1); + data.bulletfired = b; + } else if (spell.type == "buff") { + let aoe = spell.aoe; + let casted = false; + if (!aoe) aoe = 0.1; + if (Math.sqrt((KinkyDungeonPlayerEntity.x - targetX) * (KinkyDungeonPlayerEntity.x - targetX) + (KinkyDungeonPlayerEntity.y - targetY) * (KinkyDungeonPlayerEntity.y - targetY)) <= aoe) { + for (let buff of spell.buffs) { + if (buff.player) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff); + if (KinkyDungeonPlayerEntity.x == targetX && KinkyDungeonPlayerEntity.y == targetY) data.target = KinkyDungeonPlayerEntity; + casted = true; + } + } + } + for (let e of KDMapData.Entities) { + if (Math.sqrt((e.x - targetX) * (e.x - targetX) + (e.y - targetY) * (e.y - targetY)) <= aoe) { + for (let buff of spell.buffs) { + if (!spell.filterTags || KDMatchTags(spell.filterTags, e)) { + if (!e.buffs) e.buffs = {}; + KinkyDungeonApplyBuffToEntity(e, buff); + if (e.x == targetX && e.y == targetY) data.target = e; + casted = true; + } + } + } + } + if (!casted) + return {result: "Fail", data: data}; + } else if (spell.type == "special" || spell.special) { + let ret = KinkyDungeonSpellSpecials[spell.special](spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast); + if (ret == "Miscast") { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + (spell.miscastSfx || "SoftShield") + ".ogg"); + KinkyDungeonSendEvent("miscast", data); + KinkyDungeonSetFlag("miscast", 1); + + return {result: "Miscast", data: data}; + } + if (ret) { + if (!enemy && !bullet && player) { + if (data.targetingSpellItem) { + if (ret == "Cast") { + KinkyDungeonChangeConsumable(KinkyDungeonTargetingSpellItem, -(KinkyDungeonTargetingSpellItem.useQuantity != undefined ? KinkyDungeonTargetingSpellItem.useQuantity : 1)); + if (!spell.noAggro) + KinkyDungeonAggroAction('item', {}); + } + KinkyDungeonTargetingSpellItem = null; + } else if (data.targetingSpellWeapon) { + + if (ret == "Cast") { + let special = KinkyDungeonPlayerDamage ? KinkyDungeonPlayerDamage.special : null; + if (special) { + let energyCost = KinkyDungeonPlayerDamage.special.energyCost; + if (KDGameData.AncientEnergyLevel < energyCost) { + if (!KinkyDungeonPlayerDamage.special.noSkip) + return {result: "Fail", data: data}; + } else { + if (energyCost) KDChangeCharge(KinkyDungeonPlayerDamage?.name, "weapon", "wepSpecial", - energyCost); + } + KinkyDungeonSendEvent("playerCastSpecial", data); + KinkyDungeonSendEvent("afterPlayerCastSpecial", data); + } + if (!spell.noAggro) + KinkyDungeonAggroAction('item', {}); + } + KinkyDungeonTargetingSpellWeapon = null; + } + + if (ret == "Cast") { + KinkyDungeonSendEvent("playerCast", data); + if (KDGameData.HeelPower > 0) { + if (spell.components?.includes("Arms")) + KDChangeBalanceSrc(KinkyDungeonPlayerDamage?.name, "debuff", "wepSpecial", -KDGetBalanceCost() * (0.75 + 0.5 * KDRandom()) * KDBalanceCastArmsMult, true); + if (spell.components?.includes("Legs")) + KDChangeBalanceSrc(KinkyDungeonPlayerDamage?.name, "debuff", "wepSpecial", -KDGetBalanceCost() * (0.5 + 1.0 * KDRandom()) * KDBalanceCastLegsMult, true); + } + if (spell.school) KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "cast_" + spell.school.toLowerCase(), 1); + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "cast", 1); + if (spell.tags) { + for (let t of spell.tags) { + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "cast_" + t, 1); + } + } + if (data.channel) { + KinkyDungeonSetFlag("channeling", data.channel); + KDGameData.SlowMoveTurns = Math.max(KDGameData.SlowMoveTurns, data.channel); + KinkyDungeonSleepTime = CommonTime() + 200; + } + if (spell.components) { + for (let comp of spell.components) { + if (KDSpellComponentTypes[comp].cast) + KDSpellComponentTypes[comp].cast(spell, data); + } + } + KinkyDungeonSendEvent("afterPlayerCast", data); + } + + + + } + return {result: ret, data: data}; + } + } + } + + tX = originaltX; + tY = originaltY; + + if (spell.extraCast) { + for (let extraCast of spell.extraCast) + KinkyDungeonCastSpell(targetX, targetY, KinkyDungeonFindSpell(extraCast.spell, true), undefined, undefined, undefined, forceFaction); + } + + /*if (spell.noise && !(spell.delay > 0)) { + KinkyDungeonMakeNoise(spell.noise, noiseX, noiseY); + }*/ + + if (!enemy && !bullet && player) { // Costs for the player + // Sawflags + if (data.components?.length > 0) { + let nearby = KDNearbyEnemies(KDPlayer().x, KDPlayer().y, 10, undefined, true) + .filter((en) => {return !!en.aware || + (spell.noise && KDCanHearSound(en, spell.noise, KDPlayer().x, KDPlayer().y));}); + let f = ""; + for (let en of nearby) { + for (let c of data.components) { + f = "saw_" + c; + if (!en.flags || !en.flags[f]) + KDSetIDFlag(en.id, f, -1); + } + } + } + if (spell.tags?.length > 0) { + let nearby = KDNearbyEnemies(KDPlayer().x, KDPlayer().y, 10, undefined, true) + .filter((en) => {return !!en.aware || + (spell.noise && KDCanHearSound(en, spell.noise, KDPlayer().x, KDPlayer().y));}); + let f = ""; + for (let en of nearby) { + for (let c of spell.tags) { + f = "saw_" + c; + if (!en.flags || !en.flags[f]) + KDSetIDFlag(en.id, f, -1); + } + } + } + + KinkyDungeonSetFlag("PlayerCombat", 8); + + if (data.targetingSpellItem) { + KinkyDungeonChangeConsumable(KinkyDungeonTargetingSpellItem, -(KinkyDungeonTargetingSpellItem.useQuantity != undefined ? KinkyDungeonTargetingSpellItem.useQuantity : 1)); + KinkyDungeonTargetingSpellItem = null; + if (!spell.noAggro) + KinkyDungeonAggroAction('item', {}); + } else if (data.targetingSpellWeapon) { + let special = KinkyDungeonPlayerDamage ? KinkyDungeonPlayerDamage.special : null; + if (special) { + let energyCost = KinkyDungeonPlayerDamage.special.energyCost; + if (KDGameData.AncientEnergyLevel < energyCost) return {result: "Fail", data: data}; + if (energyCost) KDChangeCharge(KinkyDungeonPlayerDamage?.name, "weapon", "wepSpecial", - energyCost); + + KinkyDungeonSendEvent("playerCastSpecial", data); + KinkyDungeonSendEvent("afterPlayerCastSpecial", data); + } + KinkyDungeonTargetingSpellWeapon = null; + if (!spell.noAggro) + KinkyDungeonAggroAction('item', {}); + } else { + if (!spell.noAggro) + KinkyDungeonAggroAction('magic', {}); + if (spell.school) KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "cast_" + spell.school.toLowerCase(), 1); + } + if (!spell.noCastMsg) + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (data.channel ? data.channel - 1 : 0)); + KDSendSpellCast(spell.name); + + KinkyDungeonSendEvent("playerCast", data); + if (KDGameData.HeelPower > 0) { + if (spell.components?.includes("Arms")) + KDChangeBalanceSrc(spell?.name, "debuff", "cast", -KDGetBalanceCost() * (0.75 + 0.5 * KDRandom()) * KDBalanceCastArmsMult, true); + if (spell.components?.includes("Legs")) + KDChangeBalanceSrc(spell?.name, "debuff", "cast", -KDGetBalanceCost() * (0.5 + 1.0 * KDRandom()) * KDBalanceCastLegsMult, true); + } + //let cost = spell.staminacost ? spell.staminacost : KinkyDungeonGetCost(spell.level); + + //KinkyDungeonStatWillpowerExhaustion += spell.exhaustion + 1; + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "cast", 1); + if (spell.tags) { + for (let t of spell.tags) { + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "cast_" + t, 1); + } + } + KDChangeMana(spell?.name, "spell", "cast", -data.manacost); + if (spell.staminacost) KDChangeStamina(spell?.name, "spell", "cast", -spell.staminacost, false, 1); + if (data.channel) { + KinkyDungeonSetFlag("channeling", data.channel); + KDGameData.SlowMoveTurns = Math.max(KDGameData.SlowMoveTurns, data.channel); + KinkyDungeonSleepTime = CommonTime() + 200; + } + if (spell.components) { + for (let comp of spell.components) { + if (KDSpellComponentTypes[comp].cast) + KDSpellComponentTypes[comp].cast(spell, data); + } + } + KinkyDungeonSendEvent("afterPlayerCast", data); + KinkyDungeonLastAction = "Spell"; + KinkyDungeonMiscastPityModifier = 0; + } else { + KinkyDungeonSendEvent("spellCast", data); + } + + return {result: "Cast", data: data}; +} + +function KinkyDungeonClickSpellChoice(I: number, CurrentSpell: number) { + // Set spell choice + KDSendInput("spellChoice", {I:I, CurrentSpell: CurrentSpell}); + //if (KinkyDungeonTextMessageTime > 0 && KinkyDungeonTextMessagePriority > 3) + //KinkyDungeonDrawState = "Game"; + if (KinkyDungeonSpellChoicesToggle[I] && KinkyDungeonSpells[KinkyDungeonSpellChoices[I]].cancelAutoMove) { + KinkyDungeonFastMove = false; + KinkyDungeonFastMoveSuppress = false; + } +} + +function KinkyDungeonClickItemChoice(I: number, name: string) { + KDSendInput("itemChoice", {I:I, name: name}); +} + +function KinkyDungeonHandleMagic(): boolean { + //if (KinkyDungeonPlayer.CanInteract()) { // Allow turning pages + let xOffset = -125; + + + if (KinkyDungeonSpells[KinkyDungeonCurrentPage] && !KinkyDungeonPreviewSpell) { + + if (MouseIn(canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale * 0.5 - 175, canvasOffsetY_ui - 55 + 483*KinkyDungeonBookScale, 375, 45)) { + KDSendInput("spellCastFromBook", {CurrentSpell: KinkyDungeonCurrentPage}); + KinkyDungeonTargetingSpellItem = null; + KinkyDungeonTargetingSpellWeapon = null; + KinkyDungeonTargetingSpell = KinkyDungeonHandleSpellCast(KinkyDungeonSpells[KinkyDungeonCurrentPage]); + KDModalArea = false; + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = null; + KinkyDungeonDrawState = "Game"; + } + } else if (KinkyDungeonPreviewSpell && MouseIn(canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale + 40, canvasOffsetY_ui + 125, 225, 60)) { + if (KinkyDungeonPreviewSpell.hideLearned) KinkyDungeonDrawState = "MagicSpells"; + KDSendInput("spellLearn", {SpellName: KinkyDungeonPreviewSpell.name}); + return true; + } + + KDConfirmClearSpells = false; + + return true; +} + +function KDGetPrerequisite(spell: spell): string { + if (!spell.prerequisite) return ""; + if (typeof spell.prerequisite === "string") { + return TextGet("KinkyDungeonSpell" + spell.prerequisite); + } + let str = ""; + for (let pr of spell.prerequisite) { + if (!str) { + str = TextGet("KinkyDungeonSpell" + pr); + } else { + str = str + "/" + TextGet("KinkyDungeonSpell" + pr); + } + } + return str; +} + +/** + * @param spell + */ +function KinkyDungeonCheckSpellPrerequisite(spell: spell): boolean { + if (!spell) return true; + if (spell.upcastFrom && !KDHasSpell(spell.upcastFrom)) return false; + if (spell.blockedBy && spell.blockedBy.some((sp) => {return KDHasSpell(sp);})) return false; + if (spell.arousalMode && !KinkyDungeonStatsChoice.get("arousalMode")) return false; + + if (!spell.prerequisite) return true; + + // Prerequisite + if (!spell.prerequisite) return true; + if (typeof spell.prerequisite === "string") { + let spell_prereq = KinkyDungeonSearchSpell(KinkyDungeonSpells, spell.prerequisite); + if (spell_prereq) return true; + return false; + } else { + for (let pr of spell.prerequisite) { + let spell_prereq = KinkyDungeonSearchSpell(KinkyDungeonSpells, pr); + if (spell_prereq) return true; + } + return false; + } +} + +// Patch un-translated english string display issue in chinese Language game mode +// the using detect lib from https://github.com/richtr/guessLanguage.js +// i rewrite the origin lib useless callback mode to return mode +// now only fix chinese +function KinkyDungeonDetectLanguageForMaxWidth(str: string, maxWidthTranslate: number, maxWidthEnglish: number): number { + try { + if (KDBigLanguages.includes(TranslationLanguage) && guessLanguage) { + let languageName = guessLanguage.name(str); + // console.log('KinkyDungeonDetectLanguageForMaxWidth languageName', languageName); + if (languageName === "unknown") { + return maxWidthTranslate; + } else if (KDBigLanguages2.includes(languageName)) { + return maxWidthTranslate; + } else if (languageName === "English") { + return maxWidthEnglish; + } else { + // if not Chinese then all are english fallback + return maxWidthEnglish; + } + } else { + return maxWidthEnglish; + } + } catch (e) { + return maxWidthEnglish; + } +} + +// https://stackoverflow.com/questions/14484787/wrap-text-in-javascript +function KinkyDungeonWordWrap(str: string, maxWidthTranslate: number, maxWidthEnglish: number): string { + let newLineStr = "\n"; + let res = ''; + // console.log('KinkyDungeonDetectLanguageForMaxWidth before', str, maxWidth); + let maxWidth = KinkyDungeonDetectLanguageForMaxWidth(str, maxWidthTranslate, maxWidthEnglish); + // console.log('KinkyDungeonDetectLanguageForMaxWidth after', maxWidth); + + // Check language + if (maxWidth == maxWidthTranslate){ + //CJK + while (str.length > maxWidth) { + let found = false; + let maxCJKWidth = maxWidth; + + for (let i = 0; i <= maxCJKWidth+1; i++) { + //Numbers are calculated as 0.5 characters,Space are calculated as 0 characters + if (KinkyDungeonTestWhite(str.charAt(i),"Num")) {maxCJKWidth += 0.5;} + if (KinkyDungeonTestWhite(str.charAt(i),"English")) {maxCJKWidth += 1;} + if (KinkyDungeonTestWhite(str.charAt(i),"CJKP") && (maxCJKWidth-i) <= 2) { + //Inserts new line at first punctuation and seventh character of the line + res = res + [str.slice(0, i+1), newLineStr].join(''); + str = str.slice(i + 1); + found = true; + break; + } + } + + //Round up + maxCJKWidth = Math.ceil(maxCJKWidth); + + if (!found) { + if ((str.length - maxCJKWidth) <= 2) { + //If the last line does not satisfy at least 2 characters, the last 2 characters are moved to the previous line + res += [str.slice(0, maxCJKWidth+3), newLineStr].join(''); + str = str.slice(maxCJKWidth+3); + } else if ((str.length - maxCJKWidth) <= 5){ + //If the last line does not satisfy at least 5 characters, the last character of the previous line is moved to the last line + res += [str.slice(0, maxCJKWidth-1), newLineStr].join(''); + str = str.slice(maxCJKWidth-1); + } else { + res += [str.slice(0, maxCJKWidth), newLineStr].join(''); + str = str.slice(maxCJKWidth); + } + } + } + } else { + //Engilsh + while (str.length > maxWidth) { + let found = false; + if (str.slice(0, maxWidth).indexOf("\n") >= 0) { + let i = str.indexOf("\n"); + res = res + [str.slice(0, i), newLineStr].join(''); + str = str.slice(i + 1); + found = true; + } else + // Inserts new line at first whitespace of the line + for (let i = maxWidth - 1; i >= 0; i--) { + if (KinkyDungeonTestWhite(str.charAt(i),"English")) { + res = res + [str.slice(0, i), newLineStr].join(''); + str = str.slice(i + 1); + found = true; + break; + } + } + // Inserts new line at maxWidth position, the word is too long to wrap + if (!found) { + res += [str.slice(0, maxWidth), newLineStr].join(''); + str = str.slice(maxWidth); + } + + } + } + + + return res + str; +} + +function KinkyDungeonTestWhite(x: string, language: string): boolean { + if (language == "English") { + let white = new RegExp(/^\s$/); + return white.test(x.charAt(0)); + } + if (language == "CJKP") { + /* 'test' option returns a boolean. */ + return CJKcheck(x.charAt(0),3,"test") as boolean; + } + if (language == "Num") { + let white = new RegExp(/^[0-9.]$/); + return white.test(x.charAt(0)); + } +} + +function KDSchoolColor(school: string): string { + return KDSchoolColors[school] || KDTextTan; +} + +function KinkyDungeonDrawMagic() { + KinkyDungeonDrawMessages(true); + let xOffset = -125; + + FillRectKD(kdcanvas, kdpixisprites, "mainmagicbg", { + Left: canvasOffsetX_ui + xOffset + 40, + Top: canvasOffsetY_ui - 60, + Width: 1965 - (canvasOffsetX_ui + 40), + Height: 815, + Color: KDInvBG, + LineWidth: 1, + zIndex: -19, + alpha: 0.7 + }); + DrawRectKD(kdcanvas, kdpixisprites, "mainmagicbg2", { + Left: canvasOffsetX_ui + xOffset + 40, + Top: canvasOffsetY_ui - 60, + Width: 1965 - (canvasOffsetX_ui + 40), + Height: 815, + Color: "#000000", + LineWidth: 1, + zIndex: -19, + alpha: 0.9 + }); + + if (KDToggles.SpellBook) { + KDTextTan = KDTextTanSB; + KDBookText = KDBookTextSB; + KDDraw(kdcanvas, kdpixisprites, "magicBook", + KinkyDungeonRootDirectory + "MagicBookNew.png", xOffset + canvasOffsetX_ui, canvasOffsetY_ui, 640*KinkyDungeonBookScale, 520*KinkyDungeonBookScale, undefined, { + zIndex: 20, + }); + } else { + KDTextTan = KDTextTanNew; + KDBookText = KDBookTextNew; + FillRectKD(kdcanvas, kdpixisprites, "magicbook", { + Left: canvasOffsetX_ui + xOffset + 70, + Top: canvasOffsetY_ui + 90, + Width: 590*KinkyDungeonBookScale - 75, + Height: 450*KinkyDungeonBookScale -50, + Color: "#161920", + LineWidth: 1, + zIndex: 20, + alpha: 1 + }); + DrawRectKD(kdcanvas, kdpixisprites, "magicbook2", { + Left: canvasOffsetX_ui + xOffset + 70, + Top: canvasOffsetY_ui + 90, + Width: 590*KinkyDungeonBookScale - 75, + Height: 450*KinkyDungeonBookScale - 50, + Color: KDBorderColor, + LineWidth: 1, + zIndex: 20, + alpha: 0.9 + }); + } + + + + if (KinkyDungeonSpells[KinkyDungeonCurrentPage] || KinkyDungeonPreviewSpell) { + let spell = KinkyDungeonPreviewSpell ? KinkyDungeonPreviewSpell : KinkyDungeonSpells[KinkyDungeonCurrentPage]; + let column1Mult = 3.5; + + let SchoolColor = KDTextTan; + if (spell.school) SchoolColor = KDSchoolColor(spell.school); + + if (!spell.passive) + KDDraw(kdcanvas, kdpixisprites, "kdspellPreview", KinkyDungeonRootDirectory + "Spells/" + spell.name + ".png", + canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/column1Mult - 100, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 45, 200, 200, undefined, { + zIndex: 129, + }, undefined, undefined, undefined, true); + + + DrawTextFitKD(TextGet("KinkyDungeonSpell"+ spell.name), canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/column1Mult, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5, 640*KinkyDungeonBookScale * 0.35, KDBookText, SchoolColor); + DrawTextFitKD(TextGet("KinkyDungeonSpellsSchool" + spell.school), canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/column1Mult, canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + 40, 640*KinkyDungeonBookScale * 0.35, KDBookText, SchoolColor); + + if (spell.prerequisite) { + DrawTextFitKD(TextGet("KDPrerequisite"), canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/column1Mult, canvasOffsetY_ui + 483*KinkyDungeonBookScale*0.6 + 80, 640*KinkyDungeonBookScale * 0.35, KDBookText, KDTextTan, 24); + DrawTextFitKD(KDGetPrerequisite(spell), canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/column1Mult, canvasOffsetY_ui + 483*KinkyDungeonBookScale*0.6 + 105, 640*KinkyDungeonBookScale * 0.35, KDBookText, KDTextTan, 24); + } + + if (spell.upcastFrom) { + DrawTextFitKD(TextGet("KDUpcastFrom").replace("SPELL", TextGet("KinkyDungeonSpell" + spell.upcastFrom)), + canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/column1Mult, canvasOffsetY_ui + 483*KinkyDungeonBookScale*0.6 + 25, 640*KinkyDungeonBookScale * 0.35, KDBookText, KDTextTan, 24); + DrawTextFitKD(TextGet("KDUpcastLevel").replace("LEVEL", "" + spell.upcastLevel), + canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/column1Mult, canvasOffsetY_ui + 483*KinkyDungeonBookScale*0.6, 640*KinkyDungeonBookScale * 0.35, KDBookText, KDTextTan, 24); + } + + if (KinkyDungeonPreviewSpell) + DrawTextKD(TextGet("KinkyDungeonMagicCost") + KinkyDungeonGetCost(spell), canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/column1Mult, canvasOffsetY_ui + 483*KinkyDungeonBookScale*0.6 + 185, KDBookText, KDTextTan, 24); + DrawTextKD(TextGet("KinkyDungeonMagicManaCost") + (spell.manacost * 10), canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale/column1Mult, canvasOffsetY_ui + 483*KinkyDungeonBookScale*0.6 + 160, KDBookText, KDTextTan, 24); + let mult = KDGetFontMult(); + let textSplit = KinkyDungeonWordWrap(TextGet("KinkyDungeonSpellDescription"+ spell.name).replace(/[|]+/g, "\n").replace("DamageDealt", "" + (spell.power * 10)).replace("Duration", spell.time).replace("LifeTime", spell.lifetime).replace("DelayTime", spell.delay).replace("BlockAmount", "" + (10 * spell.block)), + 12*mult, 28*mult).split('\n'); + let textSplitDesc = KinkyDungeonWordWrap(TextGet("KinkyDungeonSpellDescription2"+ spell.name).replace(/[|]+/g, "\n").replace("DamageDealt", "" + (spell.power * 10)).replace("Duration", spell.time).replace("LifeTime", spell.lifetime).replace("DelayTime", spell.delay).replace("BlockAmount", "" + (10 * spell.block)), + 12*mult, 28*mult).split('\n'); + + if (TextGet("KinkyDungeonSpellDescription2" + spell.name) != `KinkyDungeonSpellDescription2${spell.name}`) { + DrawButtonKDEx("KinkyDungeonDisplayLoreButton", (_bdata) => { + KinkyDungeonDisplayLore = !KinkyDungeonDisplayLore; + return true; + }, true, canvasOffsetX_ui + xOffset + 570 + 102, canvasOffsetY_ui + 420 * KinkyDungeonBookScale, 80, 30, TextGet("Lore"), "White", "", "", false, true, KDButtonColor); + } + + let i = 0; + + if (KinkyDungeonDisplayLore) { + for (let N = 0; N < textSplitDesc.length; N++) { + DrawTextFitKD(textSplitDesc[N], + canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale*(1-1/3.35), canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + i * 32, 350, KDBookText, KDTextTan, 20); i++;} + } + else { + for (let N = 0; N < textSplit.length; N++) { + DrawTextFitKD(textSplit[N], + canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale*(1-1/3.35), canvasOffsetY_ui + 483*KinkyDungeonBookScale/5 + i * 32, 350, KDBookText, KDTextTan, 20); i++;} + } + + i = 0; + if (spell.components?.length > 0) { + + for (let comp of spell.components) { + DrawTextKD(KDSpellComponentTypes[comp].stringLong(spell), canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale*(1-1/3.35), canvasOffsetY_ui + 483*KinkyDungeonBookScale/2 + 215 - 35*i, KDBookText, KDTextTan, 24); i++; + } + DrawTextKD(TextGet("KinkyDungeonComponents"), canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale*(1-1/3.35), canvasOffsetY_ui + 483*KinkyDungeonBookScale/2 + 215 - 35*i, KDBookText, KDTextTan, 20); i = 1; + + } + + if (!KinkyDungeonPreviewSpell) { + + if (!spell.passive && !spell.upcastFrom) { + KDDrawHotbarBottom(undefined, true, spell, 0, true); + + KDDrawHotbar(canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale - 15, canvasOffsetY_ui + 50, spell.name, (I: number) => { + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]] == spell) { + KDSendInput("spellRemove", {I:I}); + } else { + if (KinkyDungeonSpellChoices.includes(KinkyDungeonCurrentPage)) { + KDSendInput("spellRemove", {I:KinkyDungeonSpellChoices.indexOf(KinkyDungeonCurrentPage)}); + } + KinkyDungeonClickSpellChoice(I, KinkyDungeonCurrentPage); + } + }); + } + + + if (!spell.passive && !(spell.type == "passive") && !spell.upcastFrom) + // Castfrombook + DrawButtonVis(canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale * 0.5 - 175, canvasOffsetY_ui - 55 + 483*KinkyDungeonBookScale, 375, 45, TextGet("KinkyDungeonSpellCastFromBook") + .replace("XXX", KinkyDungeonStatsChoice.has("Disorganized") ? "3" : (KinkyDungeonStatsChoice.has("QuickDraw") ? "No" : "1")), "White", "", "", false, true, KDButtonColor); + } else { + let cost = KinkyDungeonGetCost(spell); + DrawButtonVis(canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale + 40, canvasOffsetY_ui + 125, 225, 60, TextGet("KinkyDungeonSpellsBuy"), + (KinkyDungeonSpellPoints >= cost && KinkyDungeonCheckSpellPrerequisite(spell)) ? "White" : "Pink", "", ""); + } + } + + if (KinkyDungeonCurrentPage > 0) { + DrawButtonKDEx("magiclastpage", (_bdata) => { + if (KinkyDungeonCurrentPage > 0) { + if (KinkyDungeonPreviewSpell) KinkyDungeonPreviewSpell = undefined; + else { + KinkyDungeonCurrentPage -= 1; + for (let i = 0; i < 30; i++) + if (KinkyDungeonCurrentPage > 0 && KinkyDungeonSpells[KinkyDungeonCurrentPage] && (KinkyDungeonSpells[KinkyDungeonCurrentPage].hide)) KinkyDungeonCurrentPage -= 1; + } + return true; + } + return true; + }, true, canvasOffsetX_ui + xOffset + 100 + 50, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 50, TextGet("KinkyDungeonBookLastPage"), "White", "", "", false, true, KDButtonColor, + undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKey[1]), + hotkeyPress: KinkyDungeonKey[1], + }); + } + if (KinkyDungeonCurrentPage < KinkyDungeonSpells.length-1) { + DrawButtonKDEx("magicnextpage", (_bdata) => { + if (KinkyDungeonCurrentPage < KinkyDungeonSpells.length-1) { + if (KinkyDungeonPreviewSpell) KinkyDungeonPreviewSpell = undefined; + else { + KinkyDungeonCurrentPage += 1; + for (let i = 0; i < 30; i++) + if (KinkyDungeonSpells[KinkyDungeonCurrentPage] && KinkyDungeonSpells[KinkyDungeonCurrentPage].hide) KinkyDungeonCurrentPage += 1; + } + return true; + } + + return true; + }, true, canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale - 375, canvasOffsetY_ui + 483*KinkyDungeonBookScale, 250, 50, TextGet("KinkyDungeonBookNextPage"), "White", "", "", false, true, KDButtonColor, + undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKey[3]), + hotkeyPress: KinkyDungeonKey[3], + }); + } + if (KDSwapSpell != -1) { + DrawTextKD(TextGet("KinkyDungeonMagicSpellsQuick").replace("SPELLNAME", TextGet("KinkyDungeonSpell" + KinkyDungeonSpells[KinkyDungeonSpellChoices[KDSwapSpell]].name)), canvasOffsetX_ui + xOffset + 600, 900, "white", KDTextGray0); + } else { + DrawTextKD(TextGet("KinkyDungeonSpellsLevels") + .replace("SPELLPOINTS", "" + KinkyDungeonSpellPoints), canvasOffsetX_ui + xOffset + 300, 890, "white", KDTextGray0); + } + +} + + +let selectedFilters = ["learnable"]; +let genericfilters = ['learnable', 'unlearned', 'learned', 'noupgrade', 'yesupgrade', "upcast"]; + + +let KDSpellListIndex = 0; +let KDSpellListIndexVis = 0; +let KDMaxSpellPerColumn = 8; +let KDMaxSpellYY = 480; + +function KDFilterSpellPages() { + if (!KDGameData.AllowedSpellPages) KDGameData.AllowedSpellPages = {}; + let pages = []; + for (let i = 0; i < KinkyDungeonLearnableSpells.length; i++) { + if (KDGameData.AllowedSpellPages[KinkyDungeonSpellPages[i]] || KinkyDungeonSpellPagesDefault[KinkyDungeonSpellPages[i]]) { + pages.push(KinkyDungeonLearnableSpells[i]); + } + } + return pages; +} +function KDFilterSpellPageNames() { + if (!KDGameData.AllowedSpellPages) KDGameData.AllowedSpellPages = {}; + let pages = []; + for (let i = 0; i < KinkyDungeonLearnableSpells.length; i++) { + if (KDGameData.AllowedSpellPages[KinkyDungeonSpellPages[i]] || KinkyDungeonSpellPagesDefault[KinkyDungeonSpellPages[i]]) { + pages.push(KinkyDungeonSpellPages[i]); + } + } + return pages; +} + + +let KDMagicFilter = ""; + +/** + * @param spell + */ +function KDFilterSpell(spell: spell): boolean { + let prereq = spell ? KinkyDungeonCheckSpellPrerequisite(spell) : false; + let prereqHost = spell ? prereq || + (spell.upcastFrom && KinkyDungeonCheckSpellPrerequisite(KinkyDungeonFindSpell(spell.upcastFrom))) || + (KDToggles.ShowSameCatSpells && typeof spell.prerequisite == "string" && spell.prerequisite && spell.prerequisite != "Null" && !KinkyDungeonFindSpell(spell.prerequisite)?.increasingCost && KinkyDungeonCheckSpellPrerequisite(KinkyDungeonFindSpell(spell.prerequisite))) + : false; + let learned = spell ? KinkyDungeonSpellIndex(spell.name) >= 0 : false; + // Youve learned the spell tree + let upgrade = spell ? spell.passive : false; + let passive = spell ? spell.type == "passive" : false; + let upcast = spell ? spell.upcastFrom : false; + return (!spell.hideLearned || !learned) + && (!spell.hide) + && (!spell.hideUnlearnable || prereq || learned || prereqHost) + && (learned || !spell.hideWithout || KDHasSpell(spell.hideWithout)) + && (!spell.hideWith || !KDHasSpell(spell.hideWith)) + && (!spell.arousalMode || KinkyDungeonStatsChoice.has("arousalMode")) + && (selectedFilters.length == 0 || (selectedFilters.every((element) => {return genericfilters.includes(element) || (spell.tags && spell.tags.includes(element));}))) + && (!selectedFilters.includes("learnable") || (prereq || learned || prereqHost)) + && (!selectedFilters.includes("unlearned") || (!learned)) + && (!selectedFilters.includes("learned") || (learned)) + && (!selectedFilters.includes("noupgrade") || (!upgrade && !upcast)) + && (!selectedFilters.includes("yesupgrade") || (upgrade || passive)) + && (!selectedFilters.includes("upcast") || (upcast)) + && (!KDMagicFilter + || TextGet("KinkyDungeonSpell" + (spell.name)).toLocaleLowerCase().includes(KDMagicFilter.toLocaleLowerCase()) + || spell.tags?.some((tag) => {return tag.toLocaleLowerCase().includes(KDMagicFilter.toLocaleLowerCase());})); +} + +function KinkyDungeonListSpells(Mode: string): spell { + let xOffset = -125; + + FillRectKD(kdcanvas, kdpixisprites, "mainmagicspellsbg", { + Left: canvasOffsetX_ui + xOffset - 25, + Top: canvasOffsetY_ui - 150, + Width: 1990 - (canvasOffsetX_ui), + Height: 1000 - (canvasOffsetY_ui - 150), + Color: KDInvBG, + LineWidth: 1, + zIndex: -19, + alpha: 0.7 + }); + DrawRectKD(kdcanvas, kdpixisprites, "mainmagicspellsbg2", { + Left: canvasOffsetX_ui + xOffset - 25, + Top: canvasOffsetY_ui - 150, + Width: 1990 - (canvasOffsetX_ui), + Height: 1000 - (canvasOffsetY_ui - 150), + Color: "#000000", + LineWidth: 1, + zIndex: -19, + alpha: 0.9 + }); + + let i = 0; + //let ii = 0; + //let maxY = 560; + let XX = 0; + let spacing = 52; + let subspell_reduction = 20; + let ypadding = 3; + let yPad = 120 + MagicSpellsUIShift; + let buttonwidth = 280; + let filterWidth = 190; + let xpadding = 20; + let col = 0; + let ypadding_min = -2; + + let weight = 5; + KDSpellListIndexVis = (KDSpellListIndex + KDSpellListIndexVis * (weight-1)) / weight; + + let pages = KDFilterSpellPages(); + let currentPage = Math.min(KinkyDungeonCurrentSpellsPage, pages.length - 1); + let spellPages = currentPage == 0 ? + [ // Dynamically generate known spells + KinkyDungeonSpells.filter((spell) => {return !spell.passive && spell.components && spell.components[0] == "Verbal";}).map((spell) => {return spell.name;}), + KinkyDungeonSpells.filter((spell) => {return !spell.passive && spell.components && spell.components[0] == "Arms";}).map((spell) => {return spell.name;}), + KinkyDungeonSpells.filter((spell) => {return !spell.passive && spell.components && spell.components[0] == "Legs";}).map((spell) => {return spell.name;}), + KinkyDungeonSpells.filter((spell) => {return !spell.passive && (!spell.components || + (spell.components[0] != "Verbal" && spell.components[0] != "Arms" && spell.components[0] != "Legs"));}).map((spell) => {return spell.name;}), + KinkyDungeonSpells.filter((spell) => {return spell.passive && (!spell.components || + (spell.components[0] != "Verbal" && spell.components[0] != "Arms" && spell.components[0] != "Legs"));}).map((spell) => {return spell.name;}), + ] + : pages[currentPage]; + + if (currentPage == 0 && spellPages[3] && spellPages[4]) { + spellPages[3] = [...spellPages[3], ...spellPages[4]]; + spellPages.splice(4, 1); + } + let pageNames = KDFilterSpellPageNames(); + let columnLabels = KDColumnLabels[currentPage] || (KDGameData.AllowedSpellPages?.length ? KDGameData.AllowedSpellPages[pageNames[currentPage]] : undefined); + let extraFilters = filtersExtra[currentPage]; + + // Draw filters + let cutoff = false; + if (Mode == "Draw") { + let x = 4 * (buttonwidth + xpadding); + let y = 25 + canvasOffsetY_ui; + let filterlist = Object.assign([], filters); + if (extraFilters) { + for (let ff of extraFilters) { + filterlist.push(ff); + } + } + // Now we have our total filters, time to draw + for (let f of filterlist) { + let ticked = selectedFilters.includes(f); + DrawButtonKDEx("filter" + f, (_bdata) => { + if (selectedFilters.includes(f)) + selectedFilters.splice(selectedFilters.indexOf(f), 1); + else + selectedFilters.push(f); + return true; + }, true, canvasOffsetX_ui + xOffset + x + 30, y, filterWidth, 32, TextGet("KinkyDungeonFilter" + f), selectedFilters.includes(f) ? "#ffffff" : "#999999", ticked ? (KinkyDungeonRootDirectory + "UI/Tick.png") : "", "", false, true, KDButtonColor, 22); + y += 38; + } + } + + if (columnLabels) { + for (let column = 0; column < columnLabels.length; column++) { + let x = canvasOffsetX_ui + xOffset + column * (buttonwidth + xpadding); + let y = yPad - 40 + canvasOffsetY_ui; + DrawTextKD(TextGet("KinkyDungeonColumn" + columnLabels[column]), x + buttonwidth/2, y + 20, "#ffffff", KDTextGray0); + } + } + + + let longestList = 0; + for (let pg of spellPages) { + longestList = Math.max(longestList, pg.filter( + (sp: string) => { + return KDFilterSpell(KinkyDungeonFindSpell(sp)); + } + ).length); + } + if (KDSpellListIndex > longestList) KDSpellListIndex = 0; + + DrawTextFitKD( + TextGet("KDMagicFilter") + .replace("ITMNS", TextGet("KinkyDungeonCategoryFilter" + KinkyDungeonCurrentFilter)), + 1720 + xOffset + 200/2, 120 - 20, 200, "#ffffff", KDTextGray0, 18, "center"); + let TF = KDTextField("MagicFilter", 1720 + xOffset, 120, 200, 45, "text", "", "45"); + if (TF.Created) { + KDMagicFilter = ""; + TF.Element.oninput = (_event: any) => { + KDMagicFilter = ElementValue("MagicFilter"); + + }; + } + + // Draw the spells themselves + for (let pg of spellPages) { + let column = col;//Math.floor((spacing * i) / (maxY)); + i = 0; + let iii = 0; + + let YY = 0; + for (let sp of pg) { + let spell = KinkyDungeonFindSpell(sp, false); + + if (spell + && (KDSwapSpell == -1 || KinkyDungeonSpellIndex(spell.name) >= 0) + //&& i < KDMaxSpellPerColumn + && YY < KDMaxSpellYY + spacing + && KDFilterSpell(spell) + ) { + + if (iii < Math.round(KDSpellListIndexVis)) { + iii += 1; + continue; + } + XX = column * (buttonwidth + xpadding); + //ii = i;// - column * Math.ceil(maxY / spacing); + + if (!spell.upcastFrom && i > 0) { + YY += ypadding; + } + + let cost = KinkyDungeonGetCost(spell); + let suff = `${cost}`; + let yy = yPad + canvasOffsetY_ui + YY + (spell.upcastFrom ? 2 : 0); + let h = spacing - ypadding + (spell.upcastFrom ? -subspell_reduction : 0); + let w = buttonwidth + (spell.upcastFrom ? -30 : 0); + let xx = canvasOffsetX_ui + xOffset + XX + (spell.upcastFrom ? 30 : 0); + + if (Mode == "Draw") { + let color = KDSwapSpell == -1 ? "#bcbcbc" : "#777777"; + let index = KinkyDungeonSpellIndex(spell.name); + if (index >= 0 && (KDSwapSpell == -1 || !KinkyDungeonSpellChoices.includes(index))) { + color = "#ffffff"; + suff = ""; + } else if (!KinkyDungeonCheckSpellPrerequisite(spell)) { + color = "#555555"; + //suff = ""; + } + if (!spell.passive) + KDDraw(kdcanvas, kdpixisprites, "spIcon" + spell.name, KinkyDungeonRootDirectory + "Spells/" + spell.name + ".png", + xx, + yy, + h, + h, + undefined, + { + zIndex: 110, + alpha: index >= 0 ? 1.0 : 0.5 + }, + ); + if (index >= 0) + KDDraw(kdcanvas, kdpixisprites, "spIconTick" + spell.name, KinkyDungeonRootDirectory + "UI/" + "CheckSmall" + ".png", + xx + w - 30, + yy + h/2-15, + 30, + 30, + undefined, + { + zIndex: 110, + }, + ); + + DrawButtonKDExScroll("spellmagiclist" + spell.name, + (amount) => { + KDSpellListIndex = Math.max(0, Math.min(longestList - KDMaxSpellPerColumn + 1, + KDSpellListIndex + Math.round(amount/h))); + }, + (_bdata) => { + if (spell) { + if (KDSwapSpell == -1) { + KinkyDungeonSetPreviewSpell(spell); + } else if (!spell.upcastFrom) { + let ind = KinkyDungeonSpellIndex(spell.name); + if (!KinkyDungeonSpellChoices.includes(ind)) { + KinkyDungeonClickSpellChoice(KDSwapSpell, ind); + KinkyDungeonDrawState = "Game"; + } + } + return true; + } + }, true, + xx, + yy, + w, + h, + "", color, + "", "", false, true, (index >= 0) ? "#070707" : "#040404", + // Image: KinkyDungeonSpellChoices.includes(index) ? (KinkyDungeonRootDirectory + "UI/Tick.png") : "" + (spell.upcastFrom ? 20 : 24), + false, + { + alpha: index >= 0 ? 0.9 : 0.9, + zIndex: 20, + }); + DrawTextFitKD(TextGet("KinkyDungeonSpell" + spell.name), + xx + h + 2 + (spell.upcastFrom ? 0 : 8), + yy + h/2, + w - h*1.75, color, undefined, (spell.upcastFrom ? 18 : 22), "left", undefined, undefined, undefined); + DrawTextFitKD(suff, + xx + w - 8, + yy + h/2, + h, KinkyDungeonSpellPoints >= cost ? color : "#ff5277", undefined, 20, "right", undefined, undefined, undefined); + } else if (Mode == "Click") { + if (MouseIn(xx, + yy, + w, + h,)) return spell; + } + i++; + YY += h + ypadding_min; + } else if (YY >= KDMaxSpellYY + spacing) {cutoff = true;} + } + col++; + } + + if ( KDSpellListIndex > 0) + DrawButtonKDEx("spellsUp", (_bdata) => { + KDSpellListIndex = Math.max(0, KDSpellListIndex - 3); + return true; + }, KDSpellListIndex > 0, 910, 800, 90, 40, "", KDSpellListIndex > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png"); + if (cutoff) + DrawButtonKDEx("spellsDown", (_bdata) => { + KDSpellListIndex = Math.max(0, Math.min(longestList - KDMaxSpellPerColumn + 1, KDSpellListIndex + 3)); + return true; + }, KDSpellListIndex < longestList - KDMaxSpellPerColumn + 1, 1160, 800, 90, 40, "", KDSpellListIndex < longestList - KDMaxSpellPerColumn + 1 ? "white" : "#888888", KinkyDungeonRootDirectory + "Down.png"); + + + let procList = pageNames; + let adjLists = GetAdjacentList(procList, currentPage, 1); + let left = adjLists.left; + let right = adjLists.right; + + let center = canvasOffsetX_ui + xOffset + 705; + let tabWidth = 200; + let tabHeight = 35; + + if (left.length < 3) center -= tabWidth * (3 - left.length); + else if (right.length < 3) center += tabWidth * (3 - right.length); + + DrawButtonVis( + center - tabWidth/2, 30, tabWidth, tabHeight + 10, + TextGet("KinkyDungeonSpellsPage" + pageNames[currentPage]), + //TextGet("KinkyDungeonSpellsPage" + KinkyDungeonCurrentSpellsPage) + //.replace("NUM", "" + (currentPage + 1)) + //.replace("TOTAL", "" + (pages.length)) + ": " + TextGet("KinkyDungeonSpellsPage" + pageNames[currentPage]), + "#ffffff", "", undefined, undefined, false, KDButtonColor); + + drawHorizList(right, center + tabWidth + 1, 40, 200, tabHeight, 3 + Math.max(0, 3 - left.length), 24, (data) => { + return (_bdata) => { + KinkyDungeonCurrentSpellsPage = procList.indexOf(data.name); + return true; + }; + }, "KinkyDungeonSpellsPage", false); + drawHorizList(left.reverse(), center - tabWidth - 1, 40, 200, tabHeight, 3 + Math.max(0, 3 - right.length), 24, (data) => { + return (_bdata) => { + KinkyDungeonCurrentSpellsPage = procList.indexOf(data.name); + return true; + }; + }, "KinkyDungeonSpellsPage", true); + + return undefined; +} + +let MagicSpellsUIShift = -80; + +function KinkyDungeonDrawMagicSpells() { + let xOffset = -125; + + KinkyDungeonListSpells("Draw"); + + + + //DrawTextKD(TextGet("KinkyDungeonSpellsPoints") + KinkyDungeonSpellPoints, 650, 900, "white", KDTextGray0); + + /*MainCanvas.beginPath(); + MainCanvas.lineWidth = 3; + MainCanvas.strokeStyle = KDBorderColor; + MainCanvas.moveTo(canvasOffsetX_ui + xOffset, canvasOffsetY_ui + 70 + MagicSpellsUIShift); + MainCanvas.lineTo(canvasOffsetX_ui + xOffset + 1150, canvasOffsetY_ui + 70 + MagicSpellsUIShift); + MainCanvas.stroke(); + MainCanvas.closePath(); + + MainCanvas.textAlign = "center";*/ + if (KDSwapSpell != -1) { + DrawTextKD(TextGet( + "KinkyDungeonMagicSpellsQuick").replace( + "SPELLNAME", + (KinkyDungeonSpells[KinkyDungeonSpellChoices[KDSwapSpell]]) ? + TextGet("KinkyDungeonSpell" + KinkyDungeonSpells[KinkyDungeonSpellChoices[KDSwapSpell]].name) + : TextGet("KinkyDungeonSpellNone")), + canvasOffsetX_ui + xOffset + 600, 900, "white", KDTextGray0); + } else { + DrawTextKD(TextGet("KinkyDungeonSpellsLevels") + .replace("SPELLPOINTS", "" + KinkyDungeonSpellPoints), canvasOffsetX_ui + xOffset + 600, 890, "white", KDTextGray0); + } + //DrawButtonVis(canvasOffsetX_ui + xOffset + 0, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50, TextGet("KinkyDungeonSpellsPageBackFast"), "White", "", "", false, false, KDButtonColor); + //DrawButtonVis(canvasOffsetX_ui + xOffset + 1100, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50, TextGet("KinkyDungeonSpellsPageNextFast"), "White", "", "", false, false, KDButtonColor); + //DrawButtonVis(canvasOffsetX_ui + xOffset + 55, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50, TextGet("KinkyDungeonSpellsPageBack"), "White", "", "", false, false, KDButtonColor); + //DrawButtonVis(canvasOffsetX_ui + xOffset + 1045, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50, TextGet("KinkyDungeonSpellsPageNext"), "White", "", "", false, false, KDButtonColor); +} + + +function KinkyDungeonHandleMagicSpells() { + /*let xOffset = -125; + + let pages = KDFilterSpellPages(); + + if (MouseIn(canvasOffsetX_ui + xOffset + 50, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50)) { + if (KinkyDungeonCurrentSpellsPage > 0) KinkyDungeonCurrentSpellsPage -= 1; + else KinkyDungeonCurrentSpellsPage = pages.length - 1; + KDSpellListIndex = 0; + selectedFilters = selectedFilters.filter((filter) => { + return filters.includes(filter); + }); + return true; + } else if (MouseIn(canvasOffsetX_ui + xOffset + 1045, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50)) { + if (KinkyDungeonCurrentSpellsPage < pages.length - 1) KinkyDungeonCurrentSpellsPage += 1; + else KinkyDungeonCurrentSpellsPage = 0; + KDSpellListIndex = 0; + selectedFilters = selectedFilters.filter((filter) => { + return filters.includes(filter); + }); + return true; + } else if (MouseIn(canvasOffsetX_ui + xOffset + 0, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50)) { + if (KinkyDungeonCurrentSpellsPage > 0) { + if (KinkyDungeonCurrentSpellsPage > 2) KinkyDungeonCurrentSpellsPage -= 3; + else KinkyDungeonCurrentSpellsPage = 0; + } else KinkyDungeonCurrentSpellsPage = pages.length - 1; + KDSpellListIndex = 0; + selectedFilters = selectedFilters.filter((filter) => { + return filters.includes(filter); + }); + return true; + } else if (MouseIn(canvasOffsetX_ui + xOffset + 1100, canvasOffsetY_ui + MagicSpellsUIShift, 50, 50)) { + if (KinkyDungeonCurrentSpellsPage < pages.length - 1) { + if (KinkyDungeonCurrentSpellsPage < pages.length - 3) KinkyDungeonCurrentSpellsPage += 3; + else KinkyDungeonCurrentSpellsPage = pages.length - 1; + } + else KinkyDungeonCurrentSpellsPage = 0; + selectedFilters = selectedFilters.filter((filter) => { + return filters.includes(filter); + }); + KDSpellListIndex = 0; + return true; + }*/ + + return true; +} + +function KinkyDungeonSpellIndex(Name: string): number { + for (let i = 0; i < KinkyDungeonSpells.length; i++) { + if (KinkyDungeonSpells[i].name == Name) return i; + } + return -1; +} + +function KinkyDungeonSetPreviewSpell(spell: spell) { + let index = KinkyDungeonSpellIndex(spell.name); + KinkyDungeonPreviewSpell = index >= 0 ? null : spell; + if (!KinkyDungeonPreviewSpell) KinkyDungeonCurrentPage = index; + KinkyDungeonDrawState = "Magic"; +} + +function KinkyDungeonGetCompList(spell: spell): string { + let ret = ""; + if (spell.components) + for (let c of spell.components) { + if (ret) ret = ret + "/"; + ret = ret + (KDSpellComponentTypes[c].stringShort(ret)); + } + + //if (ret) + //return "(" + ret + ")"; + //else + return ret; +} + +function KinkyDungeonSendMagicEvent(Event: string, data: any, forceSpell?: spell) { + if (!KDMapHasEvent(KDEventMapSpell, Event)) return; + KDUpdateSpellCache(); + let iteration = 0; + let stack = true; + let upcastLevel = KDEntityBuffedStat(KinkyDungeonPlayerEntity, "SpellEmpower"); + while ((stack) && iteration < 100) { + stack = false; + for (let i = 0; i < KinkyDungeonSpellChoices.length; i++) { + let spell = + (KinkyDungeonSpells[KinkyDungeonSpellChoices[i]] + ? KDGetUpcast(KinkyDungeonSpells[KinkyDungeonSpellChoices[i]].name, upcastLevel) + : null) + || KinkyDungeonSpells[KinkyDungeonSpellChoices[i]]; + if (spell && spell.events && KDEventSpells.get(Event)?.get(spell)) { + for (let e of spell.events) { + if (e.trigger == Event && !e.always + && ((KinkyDungeonSpellChoicesToggle[i] && spell.type == "passive") + || spell.type != "passive" || spell.name == forceSpell?.name)) { + if (iteration == (e.delayedOrder ? e.delayedOrder : 0)) { + KinkyDungeonHandleMagicEvent(Event, e, spell, data); + } else { + stack = true;//stack.push(() => {KinkyDungeonHandleMagicEvent(Event, e, spell, data);}); + } + } + } + } + } + if (KDEventSpells.get(Event)) + for (let spell of KDEventSpells.get(Event).keys()) { + if ((spell.passive || spell.mixedPassive) && spell.events) { + for (let e of spell.events) { + if (e.trigger == Event && (spell.passive || e.always)) { + if (iteration == (e.delayedOrder ? e.delayedOrder : 0)) { + KinkyDungeonHandleMagicEvent(Event, e, spell, data); + } else { + stack = true;//stack.push(() => {KinkyDungeonHandleMagicEvent(Event, e, spell, data);}); + } + } + } + } + } + iteration += 1; + } + +} + + +function KDCastSpellToEnemies(fn: (en: entity) => boolean, tX: number, tY: number, spell: spell): boolean { + let enList = KDNearbyEnemies(tX, tY, spell.aoe); + let cast = false; + + if (enList.length > 0) { + for (let en of enList) { + if (fn(en)) cast = true; + } + } + + return cast; +} + +/** + * Returns true if the enemy matches one of the tags + * @param tags + * @param entity + */ +function KDMatchTags(tags: string[], entity: entity): boolean { + if (tags) { + for (let tag of tags) { + if (entity?.Enemy?.tags[tag]) return true; + } + } + return false; +} + + +function KinkyDungeonLoadSpellsConfig() { + let spellsChoice = localStorage.getItem('KinkyDungeonSpellsChoice' + KinkyDungeonSpellsConfig); + let spellsChoiceToggle = localStorage.getItem('KDSpellsChoiceToggle' + KinkyDungeonSpellsConfig); + if (spellsChoice) { + //KinkyDungeonSpellChoices = []; + KDClearChoices(); + let list: string[] = JSON.parse(spellsChoice); + let i = 0; + for (let spell of list) { + if (spellsChoiceToggle && spellsChoiceToggle[i]) { + KinkyDungeonSpellChoicesToggle[i] = true; + } + if (KDHasSpell(spell)) { + KinkyDungeonSpellChoices[i] = KinkyDungeonSpells.findIndex((sp) => { + return sp.name == spell; + }); + } + else if (KinkyDungeonInventoryGetConsumable(spell)) { + KinkyDungeonConsumableChoices[i] = spell; + } + else if (KinkyDungeonInventoryGetWeapon(spell)) { + KinkyDungeonWeaponChoices[i] = spell; + } + else if (KinkyDungeonInventoryGet(spell)) { + KinkyDungeonArmorChoices[i] = spell; + } + + i++; + } + } +} +function KinkyDungeonSaveSpellsConfig() { + let list = KinkyDungeonSpellChoices.map((index) => {return KinkyDungeonSpells[index]?.name;}); + for (let i = 0; i < KinkyDungeonSpellChoiceCount; i++) { + if (KinkyDungeonConsumableChoices[i]) list[i] = KinkyDungeonConsumableChoices[i]; + else if (KinkyDungeonWeaponChoices[i]) list[i] = KinkyDungeonWeaponChoices[i]; + else if (KinkyDungeonArmorChoices[i]) list[i] = KinkyDungeonArmorChoices[i]; + } + let list2 = KinkyDungeonSpellChoicesToggle.map((index) => {return index ? 1 : 0;}); + localStorage.setItem('KinkyDungeonSpellsChoice' + KinkyDungeonSpellsConfig, JSON.stringify(list)); + localStorage.setItem('KDSpellsChoiceToggle' + KinkyDungeonSpellsConfig, JSON.stringify(list2)); +} + +function KDDrawHotbar(xLoc: number, _yLoc: number, _name: string, _fn: (I: number) => void) { + let w = 225; + let h = 50; + /*let x_start = xLoc; + let y_start = yLoc; + for (let I = 0; I < KinkyDungeonSpellChoiceCount; I++) { + let x = x_start + w * Math.floor(I / KinkyDungeonSpellChoiceCountPerPage); + let y = y_start + h * (I % KinkyDungeonSpellChoiceCountPerPage); + + let spell = ""; + let label = ""; + let armor = ""; + let weapon = ""; + let consumable = ""; + if (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]]) { + spell = KinkyDungeonSpells[KinkyDungeonSpellChoices[I]].name; + label = TextGet("KinkyDungeonSpell" + spell); + KDDraw(kdcanvas, kdpixisprites, "kdspellPreview" + spell, KinkyDungeonRootDirectory + "Spells/" + spell + ".png", x - h, y, h, h); + } else { + spell = KinkyDungeonConsumableChoices[I] || KinkyDungeonWeaponChoices[I] || KinkyDungeonArmorChoices[I]; + armor = KinkyDungeonArmorChoices[I]; + if (armor && KinkyDungeonRestraintVariants[armor]) spell = KinkyDungeonRestraintVariants[armor].template; + weapon = KinkyDungeonWeaponChoices[I]; + if (weapon && KinkyDungeonWeaponVariants[weapon]) spell = KinkyDungeonWeaponVariants[weapon].template; + consumable = KinkyDungeonConsumableChoices[I]; + if (weapon && KinkyDungeonConsumableVariants[consumable]) spell = KinkyDungeonConsumableVariants[consumable].template; + if (spell && KDGetItemPreview({name: spell, type: KinkyDungeonConsumableChoices[I] ? Consumable : (armor ? LooseRestraint : Weapon)})) { + label = TextGet((armor ? "Restraint" : "KinkyDungeonInventoryItem") + spell); + KDDraw(kdcanvas, kdpixisprites, "kdspellPreview" + spell, KDGetItemPreview({name: spell, type: KinkyDungeonConsumableChoices[I] ? Consumable : (armor ? LooseRestraint : Weapon)}).preview, x - h, y, h, h); + } + } + + DrawTextFitKD(`${1 + (I % KinkyDungeonSpellChoiceCountPerPage)}`, x - h, y + h*0.5, 50, "#efefef", "#888888", 18); + DrawButtonKDEx("SpellSlotBook" + I, (bdata) => { + fn(I); + return true; + }, true, x, y, w - 25 - h, h - 5, label, + spell == name ? "White" : KDTextGray3, "", ""); + }*/ + + let strs = TextGet("KDHotbarTutorial").split("|"); + let II = 0; + + let yy = 350; + let x = 1475; + + for (let s of strs) { + DrawTextFitKD(s, x, yy + II++*32, 675, "#ffffff", KDTextGray0, 24); + } + + DrawButtonKDEx("KDSpellsClear", (_bdata) => { + if (!KDConfirmClearSpells) { + KDConfirmClearSpells = true; + KinkyDungeonSendTextMessage(10, TextGet("KDConfirmSpellsClear"), "#ffffff", 2, true); + } else { + KDClearChoices(); + } + return true; + }, true, 1800, 940, 190, 50, TextGet("KinkyDungeonClearConfig"), "#ffffff", ""); + + DrawButtonKDEx("KDSpellsConfig1", (_bdata) => { + KinkyDungeonSpellsConfig = "1"; + KinkyDungeonLoadSpellsConfig(); + return true; + }, true, xLoc, 640, 150, 54, + localStorage.getItem('KinkyDungeonSpellsChoice' + 1) ? TextGet("KinkyDungeonLoadConfig") + "1" : "x", KinkyDungeonSpellsConfig == "1" ? "#ffffff" : "#888888", ""); + + DrawButtonKDEx("KDSpellsConfig2", (_bdata) => { + KinkyDungeonSpellsConfig = "2"; + KinkyDungeonLoadSpellsConfig(); + return true; + }, true, xLoc + 225, 640, w - 25 - h, 54, + localStorage.getItem('KinkyDungeonSpellsChoice' + 2) ? TextGet("KinkyDungeonLoadConfig") + "2" : "x", KinkyDungeonSpellsConfig == "2" ? "#ffffff" : "#888888", ""); + + DrawButtonKDEx("KDSpellsConfig3", (_bdata) => { + KinkyDungeonSpellsConfig = "3"; + KinkyDungeonLoadSpellsConfig(); + return true; + }, true, xLoc + 450, 640, w - 25 - h, 54, + localStorage.getItem('KinkyDungeonSpellsChoice' + 3) ? TextGet("KinkyDungeonLoadConfig") + "3" : "x", KinkyDungeonSpellsConfig == "3" ? "#ffffff" : "#888888", ""); + + DrawButtonKDEx("KDSaveSpellsConfig1", (_bdata) => { + KinkyDungeonSpellsConfig = "1"; + KinkyDungeonSaveSpellsConfig(); + return true; + }, true, xLoc, 700, w - 25 - h, 54, TextGet("KinkyDungeonSaveConfig") + "1", KinkyDungeonSpellsConfig == "1" ? "#ffffff" : "#888888", ""); + + DrawButtonKDEx("KDSaveSpellsConfig2", (_bdata) => { + KinkyDungeonSpellsConfig = "2"; + KinkyDungeonSaveSpellsConfig(); + return true; + }, true, xLoc + 225, 700, w - 25 - h, 54, TextGet("KinkyDungeonSaveConfig") + "2", KinkyDungeonSpellsConfig == "2" ? "#ffffff" : "#888888", ""); + + DrawButtonKDEx("KDSaveSpellsConfig3", (_bdata) => { + KinkyDungeonSpellsConfig = "3"; + KinkyDungeonSaveSpellsConfig(); + return true; + }, true, xLoc + 450, 700, w - 25 - h, 54, TextGet("KinkyDungeonSaveConfig") + "3", KinkyDungeonSpellsConfig == "3" ? "#ffffff" : "#888888", ""); + +} + +function KDClearChoices() { + KinkyDungeonSpellChoices = []; + KinkyDungeonSpellChoicesToggle = []; + KinkyDungeonWeaponChoices = []; + KinkyDungeonArmorChoices = []; + KinkyDungeonConsumableChoices = []; +} + +function KDGetRandomSpell(maxSpellLevel = 4) { + let spell = null; + let spellList = []; + for (let k of Object.keys(KinkyDungeonSpellList)) { + for (let sp of KinkyDungeonSpellList[k]) { + if (KinkyDungeonCheckSpellPrerequisite(sp) && sp.school == k && !sp.secret && !sp.passive) { + for (let iii = 0; iii < maxSpellLevel - sp.level; iii++) + spellList.push(sp); + } + } + } + + for (let sp of KinkyDungeonSpells) { + for (let S = 0; S < spellList.length; S++) { + if (sp.name == spellList[S].name) { + spellList.splice(S, 1); + S--; + } + } + } + + spell = spellList[Math.floor(KDRandom() * spellList.length)]; + + return spell; +} + + +function KinkyDungeonGetUnlearnedSpells(minlevel: number, maxlevel: number, SpellList: spell[]): spell[] { + let SpellsUnlearned: spell[] = []; + + for (let spell of SpellList) { + if (spell.level >= minlevel && spell.level <= maxlevel && !spell.passive && !spell.secret && KinkyDungeonCheckSpellPrerequisite(spell)) { + SpellsUnlearned.push(spell); + } + } + + for (let spell of KinkyDungeonSpells) { + for (let S = 0; S < SpellsUnlearned.length; S++) { + if (spell.name == SpellsUnlearned[S].name) { + SpellsUnlearned.splice(S, 1); + S--; + } + } + } + + return SpellsUnlearned; +} + +function KinkyDungeonSpellChoiceAssign(spell: spell | string, hotbarslot: number = undefined) { + // Determine if the spell passed to us is a string or not + let spellname: string; + if (typeof spell == "string") { + spellname = spell; + } + else { + // This is a spell object - take the .name property + spellname = spell.name; + } + // Check if the player has this spell unlocked. If they don't, do not assign it. + // Define a spell location and assign it to -1 + let spellloc = -1; + for (let i = 0; i < KinkyDungeonSpells.length; i++) { + if (KinkyDungeonSpells[i].name === spellname) { + spellloc = i; + } + } + // Now assign it to the hotbarslot. If it is undefined, find the next available one up to 29 + if (spellloc > -1) { + if (hotbarslot == undefined) { + let i = 0; + while (hotbarslot == undefined) { + if (KinkyDungeonSpellChoices[i] == undefined) { + hotbarslot = i; + } + i++; + } + } + if (hotbarslot < 30) { + KinkyDungeonSpellChoices[hotbarslot] = spellloc; + } + else { + console.log("Error adding spell - hotbarslot is out of range"); + } + } + else { + console.log("Spell is not in player's spellbook!"); + } +} + +/** + * Removes a spell with either a spell object or a spell name as a string to the player's hotbar + */ +function KinkyDungeonSpellChoiceUnassign(spell: spell | string) { + // Determine if the spell passed to us is a string or not + let spellname: string; + if (typeof spell == "string") { + spellname = spell; + } + else { + // This is a spell object - take the .name property + spellname = spell.name; + } + // Check if the player has this spell unlocked. If they don't, do not unassign it. + // Define a spell location and assign it to -1 + let spellloc = -1; + for (let i = 0; i < KinkyDungeonSpells.length; i++) { + if (KinkyDungeonSpells[i].name === spellname) { + spellloc = i; + } + } + // Now remove from the hotbar. + if (spellloc > -1) { + for (let i = 0; i < KinkyDungeonSpellChoices.length; i++) { + if (KinkyDungeonSpellChoices[i] == spellloc) { + KinkyDungeonSpellChoices[i] = undefined; + } + } + } + else { + console.log("Spell is not in player's spellbook!"); + } +} + +/** + * Adds a spell to the players spell to the player's spellbook if an object is passed + * Grabs the spell from the spell list if the spell is not an object. + * Use index to insert at that index. + */ +function KinkyDungeonSpellAdd(spellobject: spell | string, index: number = undefined) { + // Determine if the spell passed to us is a string or not + let spell: spell; + if (typeof spellobject == "string") { + spell = KinkyDungeonFindSpell(spellobject); + } + else { + // This is a spell object - take the .name property + spell = spellobject; + } + // Sanity check that we have a valid spell object, either passed in or the name found something + if ((spell == undefined) || spell == null) { + return false; + } + // This *should* be a valid spell we can add to the player's spellbook. Hopefully. + // Create a spell object and assign those values to it. + else { + let newspell = { + name: "NewSpell" + KDRandom().toString(), + damage: "inert", + components: [], + power: 0, + time: 0, + level: 1, + manacost: 0, + tags: [], + type: "inert", + }; + // Pass all the values from spell onto newspell, overwriting them + newspell = Object.assign(newspell, spell); + // Finally, push the spell to the list. + if (index !== undefined) { + KinkyDungeonSpells.splice(index, 0, newspell); + } + else { + KinkyDungeonSpells.push(newspell); + } + KDRefreshSpellCache = true; + } +} + +/** + * Removes a spell from the player's spellbook if they have it. + */ +function KinkyDungeonSpellRemove(spellobject: spell | string) { + // Determine if the spell passed to us is a string or not + let spellname: string; + if (typeof spellobject == "string") { + spellname = spellobject; + } + else { + // This is a spell object - take the .name property + spellname = spellobject.name; + } + // Remove it from the hotbar if the player has it assigned. + KinkyDungeonSpellChoiceUnassign(spellname); + // Check if the player has this spell unlocked. If they don't, do not unassign it. + // Define a spell location and assign it to -1 + let spellloc = -1; + for (let i = 0; i < KinkyDungeonSpells.length; i++) { + if (KinkyDungeonSpells[i].name === spellname) { + spellloc = i; + } + } + // Now go to every hotbar slot and reduce by one if they are higher than the list. + for (let i = 0; i < KinkyDungeonSpellChoices.length; i++) { + if (KinkyDungeonSpellChoices[i] > spellloc) { + KinkyDungeonSpellChoices[i] -= 1; + } + } + // Finally, splice this from the list. + KinkyDungeonSpells.splice(spellloc, 1); + KDRefreshSpellCache = true; +} + + +function KDShockCollarCost() { + return 3*(2**Math.max(0, KDEntityBuffedStat(KDPlayer(), "ShockCollarCD", true))); +} \ No newline at end of file diff --git a/Game/src/magic/KinkyDungeonMagicCode.ts b/Game/src/magic/KinkyDungeonMagicCode.ts new file mode 100644 index 000000000..a101f017f --- /dev/null +++ b/Game/src/magic/KinkyDungeonMagicCode.ts @@ -0,0 +1,2411 @@ +"use strict"; + +type KDSpellSpecialCode = ( + spell: spell, + data: any, + targetX: number, + targetY: number, + tX: number, + tY: number, + entity: entity, + enemy: entity, + moveDirection: MoveDirection, + bullet: any, /** TODO add bullet definition */ + miscast: boolean, + faction: string, + cast: any, /** Todo add CastInfo definition */ + selfCast: boolean) => void | string; + +let KinkyDungeonSpellSpecials: Record = { + "analyze": (_spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let en = KinkyDungeonEnemyAt(targetX, targetY); + if (en) { + if (!en.buffs || !en.buffs.Analyze) { + if (_miscast) return "Miscast"; + if (!en.buffs) en.buffs = {}; + KinkyDungeonApplyBuffToEntity(en, {id: "Analyze", aura: "#ffffff", type: "DamageAmp", duration: 99999, power: 0.3, player: false, enemies: true, maxCount: 3, tags: ["defense", "damageTaken"]},); + KinkyDungeonApplyBuffToEntity(en, {id: "Analyze2", type: "Info", duration: 99999, power: 1.0, player: false, enemies: true, tags: ["info"]},); + } else return "Fail"; + } else { + let tile = KinkyDungeonTilesGet(targetX + "," + targetY); + if (tile) { + if (tile.Loot && tile.Roll) { + if (_miscast) return "Miscast"; + let event = KinkyDungeonLoot(MiniGameKinkyDungeonLevel, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), tile.Loot, tile.Roll, tile, true); + if (event.trap || tile.lootTrap) KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonShrineTooltipTrap"), "#ff5277", 2); + else KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonShrineTooltipNoTrap"), "lightgreen", 2); + + } else return "Fail"; + } else return "Fail"; + } + }, + "LeashSpell": (spell, _data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let en = KinkyDungeonEntityAt(targetX, targetY); + if (en != entity) { + if (!KDLeashReason.PlayerLeash(undefined)) { + KinkyDungeonSendActionMessage(7, TextGet("KDLeashSpellCant"), "#e64539", 1); + return "Fail"; + } else if (!KDLeashReason.PlayerLeash(en)) { + KinkyDungeonSendActionMessage(7, TextGet("KDLeashSpellMustTie"), "#e64539", 1); + return "Fail"; + } + } + + if (en) { + if (en == entity) { + KinkyDungeonSendActionMessage(7, TextGet("KDLeashSpellRemoveAll"), "#63ab3f", 1); + KDBreakAllLeashedTo(en, "PlayerLeash"); + return "Cast"; + } else { + if (KDGetLeashedToCount(entity) >= 3) { + KinkyDungeonSendActionMessage(7, TextGet("KDTooManyLeashes"), "#e64539", 1); + return "Fail"; + } + if (!(en.leash?.reason == "PlayerLeash")) { + KinkyDungeonSendActionMessage(7, TextGet("KDLeashSpell").replace("ENMY", KDGetEnemyTypeName(en)), "#63ab3f", 1); + KinkyDungeonAttachTetherToEntity(spell.range, entity, en, "PlayerLeash", "#e64539", 7); + return "Cast"; + + } else if (en.leash?.reason == "PlayerLeash") { + KinkyDungeonSendActionMessage(7, TextGet("KDLeashSpellRemove").replace("ENMY", KDGetEnemyTypeName(en)), "#63ab3f", 1); + KDBreakTether(en); + return "Cast"; + } + } + return "Fail"; + } else { + return "Fail"; + } + }, + "BoulderKick": (spell, _data, targetX, targetY, tX, tY, entity, _enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + let en = KinkyDungeonEnemyAt(targetX, targetY); + if (en) { + if (en.Enemy.tags.summonedRock) { + if (miscast) return "Miscast"; + en.hp = 0; + en.faction = "Player"; + en.rage = 0; + en.hostile = 0; + let spell2 = KinkyDungeonFindSpell("BoulderKicked", true); + let size = (spell2.size) ? spell2.size : 1; + let xx = entity.x; + let yy = entity.y; + if (!bullet || (bullet.spell && bullet.spell.cast && bullet.spell.cast.offset)) { + xx += moveDirection.x; + yy += moveDirection.y; + } + let b = KinkyDungeonLaunchBullet(xx, yy, + tX-entity.x,tY - entity.y, + spell2.speed, {noSprite: spell2.noSprite, faction: faction, name:spell2.name, block: spell2.block, volatile: spell2.volatile, blockType: spell2.blockType, + volatilehit: spell2.volatilehit, + width:size, height:size, summon:spell2.summon, cast: cast, dot: spell2.dot, + bulletColor: spell.bulletColor, bulletLight: spell.bulletLight, + effectTile: spell2.effectTile, effectTileDurationMod: spell2.effectTileDurationMod, + effectTileTrail: spell2.effectTileTrail, effectTileDurationModTrail: spell2.effectTileDurationModTrail, effectTileTrailAoE: spell2.effectTileTrailAoE, + passthrough: spell2.noTerrainHit, noEnemyCollision: spell2.noEnemyCollision, alwaysCollideTags: spell2.alwaysCollideTags, nonVolatile:spell2.nonVolatile, noDoubleHit: spell2.noDoubleHit, + pierceEnemies: spell2.pierceEnemies, piercing: spell2.piercing, events: spell2.events, + lifetime:miscast || selfCast ? 1 : (spell2.bulletLifetime ? spell2.bulletLifetime : 1000), origin: {x: entity.x, y: entity.y}, range: KDGetSpellRange(spell2), hit:spell2.onhit, + damage: {evadeable: spell2.evadeable, noblock: spell2.noblock, damage:spell2.power, type:spell2.damage, crit: spell2.crit, bindcrit: spell2.bindcrit, bind: spell2.bind, + shield_crit: spell2?.shield_crit, // Crit thru shield + shield_stun: spell2?.shield_stun, // stun thru shield + shield_freeze: spell2?.shield_freeze, // freeze thru shield + shield_bind: spell2?.shield_bind, // bind thru shield + shield_snare: spell2?.shield_snare, // snare thru shield + shield_slow: spell2?.shield_slow, // slow thru shield + shield_distract: spell2?.shield_distract, // Distract thru shield + shield_vuln: spell2?.shield_vuln, // Vuln thru shield + bindEff: spell2.bindEff, distract: spell2.distract, distractEff: spell2.distractEff, desireMult: spell2.desireMult, boundBonus: spell2.boundBonus, time:spell2.time, flags:spell2.damageFlags}, spell: spell2}, miscast, + entity.x, entity.y); + b.visual_x = entity.x; + b.visual_y = entity.y; + } else return "Fail"; + } else return "Fail"; + }, + "Volcanism": (spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let rocks = []; + for (let e of KDMapData.Entities) { + if (spell.filterTags.some((tag: string) => {return e.Enemy.tags[tag];}) && KDistEuclidean(targetX - e.x, targetY - e.y) <= spell.aoe + && (!e.buffs || !KinkyDungeonHasBuff(e.buffs, KDVolcanism.id))) { + rocks.push(e); + } + } + if (rocks.length == 0) return "Fail"; + for (let rock of rocks) { + if (_miscast) return "Miscast"; + KinkyDungeonApplyBuffToEntity(rock, KDVolcanism); + rock.hostile = 9999; + } + }, + "dress": (spell, _data, _targetX, _targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + if (_miscast) return "Miscast"; + KinkyDungeonSetDress(spell.outfit); + }, + "MoiraiScissors": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let enList = KDNearbyEnemies(tX, tY, spell.range); + + if (enList.length > 0) { + let succeed = false; + for (let en of enList) { + if (KDAllied(en) && en.boundLevel > 0) { + if (_miscast) return "Miscast"; + succeed = true; + // Free allies + en.boundLevel = 0; + en.specialBoundLevel = {}; + } + if (KDHostile(en) && KDIsHumanoid(en)) { + if (_miscast) return "Miscast"; + succeed = true; + // Disrobe enemies + KinkyDungeonApplyBuffToEntity(en, { + id: "MoiraiDisrobe", + aura: "#ff88ff", + aurasprite: "Disrobe", + duration: spell.time, + power: spell.power, + type: "charmDamageResist", + }); + KinkyDungeonApplyBuffToEntity(en, { + id: "MoiraiDisrobe2", + duration: spell.time, + power: 10, + type: "ArmorBreak", + }); + KinkyDungeonApplyBuffToEntity(en, { + id: "MoiraiDisrobe3", + duration: spell.time, + power: 10, + type: "SpellResistBreak", + }); + } + } + if (succeed) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/MagicSlash.ogg"); + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeCharge("divine", "weapon", "wepSpecial", -KinkyDungeonGetChargeCost(spell)); + return "Cast"; + } + + KinkyDungeonSendActionMessage(3, TextGet("KDMoiraiFail"), "#ff5277", 2); + return "Fail"; + } + KinkyDungeonSendActionMessage(3, TextGet("KDMoiraiFail"), "#ff5277", 2); + return "Fail"; + }, + "Charge": (spell, _data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let cost = KDAttackCost().attackCost + KDSprintCost(); + let en = KinkyDungeonEntityAt(targetX, targetY); + let space = false; + let dash_x = targetX; + let dash_y = targetY; + let push_x = targetX; + let push_y = targetY; + let powerful = false; + if (en?.Enemy) { + if (KinkyDungeonHasStamina(-cost)) { + let dist = KDistChebyshev(en.x - entity.x, en.y - entity.y); + if (dist < 1.5) { + // if enemy is nearby we need room to push them + push_x = en.x*2 - entity.x; + push_y = en.y*2 - entity.y; + if (KinkyDungeonNoEnemy(push_x, push_y) && KDIsMovable(push_x, push_y)) { + space = true; + } + } else { + // Otherwise we need a space between us and the enemy + dash_x = Math.round((en.x + entity.x) / 2); + dash_y = Math.round((en.y + entity.y) / 2); + push_x = en.x + dash_x - entity.x; + push_y = en.y + dash_y - entity.y; + if (KinkyDungeonNoEnemy(dash_x, dash_y) && KDIsMovable(dash_x, dash_y)) { + space = true; + } + } + if (space) { + if (_miscast) return "Miscast"; + let origHP = en.hp; + let result = KinkyDungeonLaunchAttack(en, 1); + if (en.hp <= origHP * 0.8 + 0.01) powerful = true; + let failPush = true; + if (result == "confirm" || result == "dialogue") return "Fail"; + if (result == "hit" || result == "capture") { + if (!KDIsImmobile(en, true) && powerful && KinkyDungeonNoEnemy(push_x, push_y) && KDIsMovable(push_x, push_y)) { + let xx = en.x; + let yy = en.y; + KDMoveEntity(en, push_x, push_y, false); + KDMovePlayer(xx, yy, true, true); + KinkyDungeonRemoveBuffsWithTag(en, ["displaceend"]); + KinkyDungeonRemoveBuffsWithTag(KDPlayer(), ["displaceend"]); + failPush = false; + } else if (KinkyDungeonNoEnemy(dash_x, dash_y) && KDIsMovable(dash_x, dash_y)) { + KDMovePlayer(dash_x, dash_y, true, true); + } + if (failPush && powerful) { + KinkyDungeonDamageEnemy(en, { + type: "crush", + damage: 0.15 * en.Enemy.maxhp, + time: 2, + bind: 0, + }, false, false, spell, undefined, entity); + } + KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonSpellCastCharge"), "#e7cf1a", 1, false); + KDChangeStamina(spell.name, "spell", "cast", KDSprintCost()); + } else if (result == "miss") { + if (KinkyDungeonNoEnemy(dash_x, dash_y) && KDIsMovable(dash_x, dash_y)) { + KDMovePlayer(dash_x, dash_y, true, true); + } + KinkyDungeonSendTextMessage(8, TextGet("KDChargeFail_AttackMiss"), "#ff5277", 1, true); + } + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Miss.ogg"); + return "Cast"; + } else { + KinkyDungeonSendTextMessage(8, TextGet("KDChargeFail_NoSpace"), "#ff5277", 1, true); + } + } else { + KinkyDungeonSendTextMessage(8, TextGet("KDChargeFail_NoStamina"), "#ff5277", 1, true); + } + } else { + KinkyDungeonSendTextMessage(8, TextGet("KDChargeFail_NoTarget"), "#ff5277", 1, true); + } + return "Fail"; + }, + + "Bondage": (spell, _data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let en = KinkyDungeonEntityAt(targetX, targetY); + if (en?.Enemy) { + let cp = KinkyDungeoCheckComponents(spell, entity.x, entity.y, false); + let fail = cp.failed.length > 0; + if (!fail) { + let castdata = { + targetX: targetX, + targetY: targetY, + spell: spell, + components: cp.components, + flags: { + miscastChance: KinkyDungeonMiscastChance, + }, + gaggedMiscastFlag: false, + gaggedMiscastType: "Gagged", + }; + let cpp = KinkyDungeoCheckComponentsPartial(spell, + entity.x, + entity.y, + false, + false, + ); + + if (cpp.length > 0) + KDDoGaggedMiscastFlag(castdata, cpp); + + if (castdata.gaggedMiscastFlag) fail = true; + } + if (!fail) { + if (KDCanBind(en)) { + //KDGameData.InventoryAction = "Bondage"; + + let canApply = KDCanApplyBondage(en, entity, + KinkyDungeonTargetingSpellItem ? ( + KDRestraint(KinkyDungeonTargetingSpellItem)?.quickBindCondition ? + (t: entity, p: entity) => (KDQuickBindConditions[KDRestraint(KinkyDungeonTargetingSpellItem)?.quickBindCondition]( + t, p, + KDRestraint(KinkyDungeonTargetingSpellItem), + KinkyDungeonTargetingSpellItem)) : + undefined + ) : undefined); + if (!canApply) { + KinkyDungeonSendTextMessage(8, TextGet("KDBondageFailInvalidTarget" + + (KinkyDungeonTargetingSpellItem ? (KDRestraint(KinkyDungeonTargetingSpellItem).quickBindCondition || "") : "")), "#ff5277", 1, true); + } + + if (KinkyDungeonTargetingSpellItem) { + let r = KDRestraint(KinkyDungeonTargetingSpellItem); + let raw = r.shrine.includes("Raw"); + + if (raw) { + KDNPCBindingGeneric = true; + + KDSelectedGenericRestraintType = Object.values(KDRestraintGenericTypes).find( + (type) => {return type.raw == r.name;} + )?.raw || null; + + KDCurrentRestrainingTarget = en.id; + KinkyDungeonDrawState = "Bondage"; + // Select wrists + KDSetBindingSlot(NPCBindingGroups[3].layers[2], NPCBindingGroups[4]); + } else { + // get the binding slot this item fits in + let slots = KDGetNPCBindingSlotForItem(r, en.id); + if (slots) { + let rs = KDGetNPCRestraints(en.id); + if (rs && rs[slots.sgroup.id] != undefined) { + // If its filled we indicate to the player that its full + KDNPCBindingGeneric = false; + KDNPCBindingSelectedRow = slots.row; + KDNPCBindingSelectedSlot = slots.sgroup; + KDSelectedGenericBindItem = KinkyDungeonTargetingSpellItem.name; + } else { + // if it's empty we attempt to apply it + let condition = KDCanEquipItemOnNPC(r, en.id, KDWillingBondage(en, entity)); + if (condition) { + KinkyDungeonSendTextMessage(8, + TextGet("KDBondageCondition_" + condition), + "#ff5277", 1, true); + + KDCurrentRestrainingTarget = en.id; + KinkyDungeonDrawState = "Bondage"; + // Hover the new item + KDNPCBindingGeneric = false; + KDNPCBindingSelectedRow = slots.row; + KDNPCBindingSelectedSlot = slots.sgroup; + KDSelectedGenericBindItem = KinkyDungeonTargetingSpellItem.name; + } else if (canApply) { + KDInputSetNPCRestraint({ + slot: slots.sgroup.id, + id: undefined, + faction: KinkyDungeonTargetingSpellItem.faction, + restraint: KinkyDungeonTargetingSpellItem.name, + restraintid: KinkyDungeonTargetingSpellItem.id, + lock: "", + variant: undefined, + events: KinkyDungeonTargetingSpellItem.events, + powerbonus: undefined, + inventoryVariant: KinkyDungeonTargetingSpellItem.inventoryVariant, + npc: en.id, + player: entity?.id, + }); + + KinkyDungeonSendTextMessage(10, + TextGet("KDTieUpEnemy") + .replace("RSTR", + KDGetItemName(KinkyDungeonTargetingSpellItem))//TextGet("Restraint" + KDRestraint(item)?.name)) + .replace("ENNME", + TextGet("Name" + en?.Enemy.name)) + .replace("AMNT", + "" + Math.round(100 * en?.boundLevel / en?.Enemy.maxhp)), + "#ffffff", 1); + + KinkyDungeonAdvanceTime(1, true); + KDSetCollFlag(en.id, "restrained", 1); + KDSetCollFlag(en.id, "restrained_recently", 24); + if (KDNPCChar.get(en.id)) + KDRefreshCharacter.set(KDNPCChar.get(en.id), true); + } + } + } else { + KinkyDungeonSendTextMessage(8, + TextGet("KDAlreadyBound"), + "#ff5277", 1, true); + + KDCurrentRestrainingTarget = en.id; + KinkyDungeonDrawState = "Bondage"; + KinkyDungeonSetFlag("quickBind", 1); + // Hover the new item + KDNPCBindingGeneric = false; + slots = KDGetNPCBindingSlotForItem(r, en.id, true); + if (slots) { + KDNPCBindingSelectedRow = slots.row; + KDNPCBindingSelectedSlot = slots.sgroup; + } + KDSelectedGenericBindItem = KinkyDungeonTargetingSpellItem.name; + //KinkyDungeonTargetingSpellItem = null; + } + } + return "Cast"; + } else { + + KDCurrentRestrainingTarget = en.id; + KinkyDungeonDrawState = "Bondage"; + + // Select wrists + KDSetBindingSlot(NPCBindingGroups[3].layers[2], NPCBindingGroups[4]); + + KinkyDungeonSendTextMessage(8, TextGet("KDBondageTarget"), "#ff5277", 1, true); + return "Fail"; + } + + //KinkyDungeonCurrentFilter = LooseRestraint; + } else { + KinkyDungeonSendTextMessage(8, TextGet("KDBondageFailInvalidTarget"), "#ff5277", 1, true); + return "Fail"; + } + } + KinkyDungeonSendTextMessage(8, TextGet("KDBondageFailComponents"), "#ff5277", 1, true); + return "Fail"; + + } else if (en == entity) { + if (KinkyDungeonTargetingSpellItem) { + let r = KDRestraint(KinkyDungeonTargetingSpellItem); + if (r) { + + let equippable = false; + if (KDDebugLink) { + equippable = KDCanAddRestraint(r, true, "", false, + KinkyDungeonTargetingSpellItem, true, true); + } else { + equippable = !KinkyDungeonGetRestraintItem(r.Group) + || KDCurrentItemLinkable(KinkyDungeonGetRestraintItem(r.Group), r); + } + if (equippable) { + if (KDSendInput("equip", {name: KinkyDungeonTargetingSpellItem.name, + inventoryVariant: KinkyDungeonTargetingSpellItem.name != r.name ? + KinkyDungeonTargetingSpellItem.name : undefined, + faction: KinkyDungeonTargetingSpellItem.faction, + group: r.Group, curse: KinkyDungeonTargetingSpellItem.curse, + currentItem: KinkyDungeonGetRestraintItem(r.Group) ? + KinkyDungeonGetRestraintItem(r.Group).name : undefined, + events: Object.assign([], KinkyDungeonTargetingSpellItem.events)}, undefined, undefined, true)) { + return "Cast"; + } else { + KinkyDungeonSendTextMessage(8, TextGet("KDBondageFailError"), "#ff5277", 1, true); + } + } else { + KinkyDungeonSendTextMessage(8, TextGet("KDBondageFailCantAdd"), "#ff5277", 1, true); + } + + + } else { + KinkyDungeonSendTextMessage(8, TextGet("KDBondageFailError"), "#ff5277", 1, true); + } + } + KinkyDungeonSendTextMessage(8, TextGet("KDBondageFailNoSelect"), "#ff5277", 1, true); + return "Fail"; + } + KinkyDungeonSendTextMessage(8, TextGet("KDBondageFailNoTarget"), "#ff5277", 1, true); + return "Fail"; + }, + "Pickaxe": (_spell, _data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let tile = KinkyDungeonMapGet(targetX, targetY); + if (KDCrackableTiles.includes(tile)) { + let fail = false;/*KinkyDungeoCheckComponents(spell, entity.x, entity.y, false).length > 0; + if (!fail) { + let castdata = { + targetX: targetX, + targetY: targetY, + spell: spell, + flags: { + miscastChance: KinkyDungeonMiscastChance, + }, + gaggedMiscastFlag: false, + gaggedMiscastType: "Gagged", + }; + KDDoGaggedMiscastFlag(castdata); + + if (castdata.gaggedMiscastFlag) fail = true; + }*/ + if (!fail) { + let tileOppX = targetX + Math.sign(targetX - entity.x); + let tileOppY = targetY + Math.sign(targetY - entity.y); + let oppTile = KinkyDungeonMapGet(tileOppX, tileOppY); + if (KDCrackableTiles.includes(oppTile) || KinkyDungeonMovableTiles.includes(oppTile)) { + if (_miscast) return "Miscast"; + KDChangeStamina(KinkyDungeonPlayerDamage?.name || "Pickaxe", "weapon", "wepSpecial", -3, false, 1); + KDCrackTile(targetX, targetY, undefined, {}); + KinkyDungeonSendTextMessage(8, TextGet("KDPickaxeSucceed"), "#88ff88", 1, false); + return "Cast"; + } + KinkyDungeonSendTextMessage(8, TextGet("KDPickaxeFailNoOpen"), "#ffffff", 1, true); + return "Fail"; + } + KinkyDungeonSendTextMessage(8, TextGet("KDPickaxeFailNoComp"), "#ff5277", 1, true); + return "Fail"; + } + KinkyDungeonSendTextMessage(8, TextGet("KDPickaxeFailNoTarget"), "#ff5277", 1, true); + return "Fail"; + }, + "CommandWord": (spell, data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + if (!KDSpellIgnoreComp(spell) && (data.gaggedMiscastFlag && KinkyDungeonGagTotal() >= 0.25)) { + KinkyDungeonSendTextMessage(8, TextGet("KDCommandWordFail_Miscast"), "#ff5277", 1); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/SoftShield.ogg"); + return "Miscast"; + } + let en = KinkyDungeonEnemyAt(targetX, targetY); + if (en) { + let cc = false; + if (en.boundLevel > 0) { + if (_miscast) return "Miscast"; + if (KDHostile(en) && en.hp <= en.Enemy.maxhp * 0.1) { + en.ceasefire = 50; + } else if (!KDHostile(en) && en.hp <= en.Enemy.maxhp * 0.1) { + en.faction = "Player"; + let ff = KDGetFactionOriginal(en); + if (!KinkyDungeonHiddenFactions.has(ff)) { + KinkyDungeonChangeFactionRep(ff, 0.005); + } + } + if (en.buffs) + for (let b of Object.values(en.buffs)) { + if (b.tags && b.tags.includes("commandword")) { + b.duration = 0; + } + } + KDUntieEnemy(en, 2*spell.power, false, false); + + cc = true; + + if (!KDHelpless(en)) { + KDRescueRepGain(en); + } + } + + if (KDRescueEnemy("Unlock", en, true) || cc) { + if (_miscast) return "Miscast"; + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + return "Cast"; + } + KinkyDungeonSendTextMessage(8, TextGet("KDCommandWordFail_NoEnemy"), "#ff5277", 1, true); + return "Fail"; + } else if (targetX == KinkyDungeonPlayerEntity.x && targetY == KinkyDungeonPlayerEntity.y) { + if (KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks).length > 0) { + if (spell.aoe > 0) { + for (let r of KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks, true)) { + KinkyDungeonLock(r, ""); + } + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonPurpleLockRemove"), "#e7cf1a", 2); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + } else { + KDGameData.InventoryAction = "RemoveMagicLock"; + KinkyDungeonDrawState = "Inventory"; + KinkyDungeonCurrentFilter = Restraint; + KDGameData.InventoryActionManaCost = KinkyDungeonGetManaCost(spell); + } + return "Cast"; + } + KinkyDungeonSendTextMessage(8, TextGet("KDCommandWordFail_NoLocks"), "#ff5277", 1, true); + return "Fail"; + } else if (KinkyDungeonTilesGet(targetX + "," + targetY) && KinkyDungeonTilesGet(targetX + "," + targetY).Type == "Charger" && KinkyDungeonTilesGet(targetX + "," + targetY).NoRemove) { + KinkyDungeonTilesGet(targetX + "," + targetY).NoRemove = false; + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonPurpleLockRemoveCharger"), "#e7cf1a", 2); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + return "Cast"; + } + KinkyDungeonSendTextMessage(8, TextGet("KDCommandWordFail_NoTarget"), "#ff5277", 1, true); + return "Fail"; + }, + "Windup": (spell, _data, _targetX, _targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + if (!KDEnemyHasFlag(entity, "winding")) { + if (_miscast) return "Miscast"; + KinkyDungeonSetEnemyFlag(entity, "winding", spell.time); + KinkyDungeonSetEnemyFlag(entity, "winding2", spell.time - 1); + } else if (!KDEnemyHasFlag(entity, "winding2")) { + if (_miscast) return "Miscast"; + KinkyDungeonSetEnemyFlag(entity, "windup", 9); + KinkyDungeonApplyBuffToEntity(entity, {id: "ExtraSight", type: "Vision", duration:9, power: 7}); + } + if (_miscast) return "Miscast"; + KinkyDungeonPlaySound(spell.sfx, entity); + + KinkyDungeonSendTextMessage(4, TextGet("KDWindup"), "#888888", 2); + return "Cast"; + }, + "Lockdown": (spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let en = KinkyDungeonEntityAt(targetX, targetY); + if (en && !en.player && en.boundLevel > 0) { + if (_miscast) return "Miscast"; + KinkyDungeonApplyBuffToEntity(en, { + id: "Lockdown", aura: "#a96ef5", type: "MinBoundLevel", duration: 9000, power: Math.min(en.Enemy.maxhp + 0.01, en.boundLevel), maxCount: 1, tags: ["lock", "debuff", "commandword", "CM1"] + }); + KinkyDungeonCastSpell(targetX, targetY, KinkyDungeonFindSpell("EffectEnemyLock1", true), undefined, undefined, undefined); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + return "Cast"; + } else if (en && en.player) { + let lockable = KinkyDungeonPlayerGetLockableRestraints(); + if (lockable.length > 0) { + if (_miscast) return "Miscast"; + for (let item of lockable) { + KinkyDungeonLock(item, "Purple"); + } + KinkyDungeonSendTextMessage(4, TextGet("KDSelfLock"), "#8888ff", 2); + KinkyDungeonCastSpell(targetX, targetY, KinkyDungeonFindSpell("EffectEnemyLock1", true), undefined, undefined, undefined); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + return "Cast"; + } + + + } + + return "Fail"; + }, + "Wall": (spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let en = KinkyDungeonEnemyAt(targetX, targetY); + if (!en) { + if (_miscast) return "Miscast"; + let tile = KinkyDungeonMapGet(targetX, targetY); + let door = (tile == 'D' || tile == 'd'); + let e = DialogueCreateEnemy(targetX, targetY, "Wall" + (door ? "Door" : "")); + if (e) { + if (_miscast) return "Miscast"; + if (door) { + KinkyDungeonMapSet(targetX, targetY, 'D'); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/DoorClose.ogg"); + } + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + return "Cast"; + } + } else return "Fail"; + }, + "Enemy_CM1": (_spell, _data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let en = KinkyDungeonEnemyAt(targetX, targetY); + if (en) { + if (_miscast) return "Miscast"; + KinkyDungeonTickBuffTag(en, "CM1", 1); + KinkyDungeonCastSpell(targetX, targetY, KinkyDungeonFindSpell("EffectEnemyCM" + (entity?.Enemy?.unlockCommandLevel || 1), true), undefined, undefined, undefined); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + if (entity?.Enemy) { + KinkyDungeonSetEnemyFlag(entity, "commandword", entity.Enemy.unlockCommandCD || 90); + KinkyDungeonSendActionMessage(7, + TextGet("KDCastCM1").replace("EnemyName", TextGet("Name" + entity.Enemy.name)).replace("TargetName", TextGet("Name" + en.Enemy.name)), + "#ff5277", 4); + } + return "Cast"; + } + return "Fail"; + }, + "Chastity": (spell, _data, targetX, targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, faction, _cast, _selfCast) => { + let en = KinkyDungeonEnemyAt(targetX, targetY); + if (en && en.Enemy.bound && KinkyDungeonIsDisabled(en) && !en.Enemy.nonHumanoid) { + if (_miscast) return "Miscast"; + KDTieUpEnemy(en, spell.power, "Metal"); + if (KDBindEnemyWithTags(en.id, + ["magicBeltForced"], 50, + MiniGameKinkyDungeonLevel + 10, + true, undefined, false, false).length > 0) { + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + } else { + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)/2); + } + return "Cast"; + } else { + if (KinkyDungeonPlayerEntity.x == tX && KinkyDungeonPlayerEntity.y == tY) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["magicBeltForced"]}, MiniGameKinkyDungeonLevel + 10, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), undefined, undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + { + allowLowPower: true + }); + if (restraintAdd) { + if (_miscast) return "Miscast"; + KinkyDungeonSendActionMessage(3, TextGet("KDZoneOfPuritySelf"), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KinkyDungeonAddRestraintIfWeaker(restraintAdd, 0, false, undefined, false, false, undefined, faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + return "Cast"; + } + } + return "Fail"; + } + }, + "DisplayStand": (spell, _data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, faction, _cast, _selfCast) => { + let en = KinkyDungeonEntityAt(targetX, targetY); + if (en && en.player) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["displaySpell"]}, KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + if (_miscast) return "Miscast"; + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCastSelf"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KinkyDungeonAddRestraintIfWeaker(restraintAdd, 0, false, undefined, false, false, undefined, faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + return "Cast"; + } + + + } else if (en && KDCanBind(en) && KDHelpless(en) && !en.Enemy.nonHumanoid) { + // Summon a pet + let Enemy = KinkyDungeonGetEnemyByName("PetDisplay"); + if (Enemy) { + if (_miscast) return "Miscast"; + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + + // Deal 0 damage to aggro + KinkyDungeonDamageEnemy(en, { + type: "chain", + damage: 0, + time: 0, + bind: 0, + }, false, true, undefined, undefined, entity); + en.hp = 0; + KinkyDungeonSetEnemyFlag(en, "cap", 2); + + let doll = { + summoned: true, + rage: Enemy.summonRage ? 9999 : undefined, + Enemy: Enemy, + id: KinkyDungeonGetEnemyID(), + x: en.x, + y: en.y, + hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, + movePoints: 0, + attackPoints: 0 + }; + KDAddEntity(doll); + + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + KDChangeCharge(spell.name, "spell", "cast", 0.05); + return "Cast"; + } + return "Fail"; + } else return "Fail"; + }, + "Petsuit": (spell, _data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, faction, _cast, _selfCast) => { + let en = KinkyDungeonEntityAt(targetX, targetY); + if (en && en.player) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["petsuitSpell"]}, KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + if (_miscast) return "Miscast"; + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCastSelf"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KinkyDungeonAddRestraintIfWeaker(restraintAdd, 0, false, undefined, false, false, undefined, faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + return "Cast"; + } + + + } else if (en && KDCanBind(en) && KDHelpless(en) && !en.Enemy.nonHumanoid) { + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + // Summon a pet + let Enemy = KinkyDungeonGetEnemyByName("Pet"); + if (Enemy) { + if (_miscast) return "Miscast"; + // Deal 0 damage to aggro + KinkyDungeonDamageEnemy(en, { + type: "chain", + damage: 0, + time: 0, + bind: 0, + }, false, true, undefined, undefined, entity); + en.hp = 0; + KinkyDungeonSetEnemyFlag(en, "cap", 2); + + let doll = { + summoned: true, + rage: Enemy.summonRage ? 9999 : undefined, + Enemy: Enemy, + id: KinkyDungeonGetEnemyID(), + x: en.x, + y: en.y, + hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, + movePoints: 0, + attackPoints: 0 + }; + KDAddEntity(doll); + + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + return "Cast"; + } + return "Fail"; + } else return "Fail"; + }, + "CommandCapture": (spell, _data, targetX, targetY, tX, tY, entity, _enemy, _moveDirection, bullet, miscast, faction, _cast, _selfCast) => { + let en = KinkyDungeonEntityAt(targetX, targetY); + if (en && (en.player || en.Enemy.bound)) { + // Only bind bindable targets + let bindTypes = []; + let bindCounts = {}; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + if (KDistEuclidean(X, Y) <= spell.aoe) { + let loc = (tX + X) + "," + (tY + Y); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("bind")) { + for (let t of tile.tags) { + // Run the special feature per restraint type + if (KDCommandCaptureBindings[t]) { + if (miscast) return "Miscast"; + bindTypes.push(t); + if (!bindCounts[t]) bindCounts[t] = 0; + bindCounts[t] += 1; + KDCommandCaptureBindings[t](spell, en, faction, bullet, miscast, entity, bindCounts[t]); + } + } + } + } + } + } + } + if (bindTypes.length > 0) { + if (miscast) return "Miscast"; + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + if (!en.player) + KinkyDungeonDamageEnemy(en, { + type: "chain", + damage: spell.power, + time: spell.time, + bind: spell.bind, + }, false, false, undefined, undefined, entity); + return "Cast"; + } else return "Fail"; + } else return "Fail"; + }, + "AnimatePuppet": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let maxCount = 3; + let enemies = []; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + if (KDistEuclidean(X, Y) <= spell.aoe) { + let en = KinkyDungeonEntityAt(tX+X, tY+Y); + if (en && !en.player && en.Enemy && KDHelpless(en) && KDEntityBuffedStat(en, "SlimeProgress") >= 1.99) { + if (KDRandom() < 0.5) + enemies.push(en); + else + enemies.unshift(en); + } + } + } + if (enemies.length > 0) { + let n = 0; + let cost = KinkyDungeonGetManaCost(spell) / 3; + for (let s of enemies) { + if (n < maxCount) { + if (_miscast) return "Miscast"; + KDChangeMana(spell.name, "spell", "cast", -cost); + s.hp = 0; + KinkyDungeonSetEnemyFlag(s, "cap", 2); + let Enemy = KinkyDungeonGetEnemyByName("AllyDoll"); + let doll = { + summoned: true, + rage: Enemy.summonRage ? 9999 : undefined, + Enemy: Enemy, + id: KinkyDungeonGetEnemyID(), + x: s.x, + y: s.y, + hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, + movePoints: 0, + attackPoints: 0 + }; + KDAddEntity(doll); + n += 1; + } + } + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + return "Cast"; + } else return "Fail"; + }, + "Animate": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let maxCount = 3; + let slots = []; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + if (KDistEuclidean(X, Y) <= spell.aoe) { + let loc = (tX + X) + "," + (tY + Y); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("slime") && !KinkyDungeonEntityAt(tX+X, tY+Y)) { + if (KDRandom() < 0.5) + slots.push({x: tX+X, y:tY+Y}); + else + slots.unshift({x: tX+X, y:tY+Y}); + } + } + } + } + } + if (slots.length > 0) { + if (_miscast) return "Miscast"; + let n = 0; + let cost = KinkyDungeonGetManaCost(spell) / 3; + for (let s of slots) { + if (n < maxCount) { + KDChangeMana(spell.name, "spell", "cast", -cost); + KinkyDungeonSummonEnemy(s.x, s.y, "SmallSlime", 1, 0.5, undefined, 50, undefined, undefined, "Player"); + n += 1; + } + } + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + return "Cast"; + } else return "Fail"; + }, + "AnimateLarge": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let slimeCount = 0; + let slots = []; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + if (KDistEuclidean(X, Y) <= spell.aoe) { + let loc = (tX + X) + "," + (tY + Y); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("slime")) { + if (!KinkyDungeonEntityAt(tX+X, tY+Y)) { + if (KDRandom() < 0.5) + slots.push({x: tX+X, y:tY+Y}); + else + slots.unshift({x: tX+X, y:tY+Y}); + } + slimeCount += 1; + } + } + } + } + } + if (slimeCount > 0 && slots.length > 0) { + if (_miscast) return "Miscast"; + let cost = KinkyDungeonGetManaCost(spell) / 3; + let s = slots[Math.floor(KDRandom() * slots.length)]; + KDChangeMana(spell.name, "spell", "cast", -cost); + KinkyDungeonSummonEnemy(s.x, s.y, "BigSlime", 1, 0.5, undefined, 90, undefined, undefined, "Player"); + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + return "Cast"; + } else return "Fail"; + }, + "ElasticGrip": (spell, _data, targetX, targetY, tX, tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + if (!KinkyDungeonCheckPath(entity.x, entity.y, tX, tY, true, false)) { + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonSpellCastFail"+spell.name), "#ff5277", 1); + return "Fail"; + } + let en = KinkyDungeonEntityAt(targetX, targetY); + if (en && !en.player) { + if (!KDIsImmobile(en)) { + if (_miscast) return "Miscast"; + if (!en.player) + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + let dist = Math.min(KDistEuclidean(en.x - entity.x, en.y - entity.y), + Math.max(1, KDPushModifier(4, en))) + 0.01; + let pullToX = entity.x; + let pullToY = entity.y; + KDCreateParticle(tX, tY, "ElasticGripHit"); + let lastx = en.x; + let lasty = en.y; + + for (let i = dist; i > 0; i -= 0.2499) { + if (KDistChebyshev(pullToX - en.x, pullToY - en.y) > 1.5) { + let newX = pullToX + Math.round((en.x - pullToX) * i / dist); + let newY = pullToY + Math.round((en.y - pullToY) * i / dist); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) + && (KinkyDungeonCheckProjectileClearance(en.x, en.y, newX, newY))) { + KDMoveEntity(en, newX, newY, false, true, KDHostile(en)); + if (en.x != lastx || en.y != lasty) { + lastx = en.x; + lasty = en.y; + KDCreateParticle(en.x, en.y, "ElasticGripHit"); + } + KinkyDungeonSetEnemyFlag(en, "takeFF", 2); + + KinkyDungeonRemoveBuffsWithTag(en, ["displaceend"]); + } + } else break; + } + + + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + KDCreateParticle(en.x, en.y, "ElasticGripHit"); + + if (!en.player) + KinkyDungeonDamageEnemy(en, { + type: "glue", + damage: spell.power, + time: spell.time, + bind: spell.bind, + }, false, true, undefined, undefined, entity); + return "Cast"; + } else return "Fail"; + } else return "Fail"; + }, + "RecoverObject": (spell, _data, targetX, targetY, tX, tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + if (!spell.aoe && !KinkyDungeonCheckPath(entity.x, entity.y, tX, tY, true, false)) { + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonSpellCastFailObstacle"+spell.name), "#ff5277", 1); + return "Fail"; + } + let tilesToCheck = [{x:targetX, y:targetY}]; + if (spell.aoe) { + tilesToCheck = []; + for (let x = Math.floor(-spell.aoe); x < Math.ceil(spell.aoe); x++) + for (let y = Math.floor(-spell.aoe); y < Math.ceil(spell.aoe); y++) { + if (AOECondition(targetX, targetY, targetX+x, targetY+y, spell.aoe, spell.aoetype, entity.x, entity.y)) { + tilesToCheck.push({x:targetX+x, y:targetY+y}); + } + } + } + let found = false; + let grabbed = false; + let chest = false; + let locked = false; + for (let tt of tilesToCheck) { + let items = KDMapData.GroundItems.filter((item) => {return item.x == tt.x && item.y == tt.y;}); + let tile = KinkyDungeonMapGet(tt.x, tt.y); + let allowedTiles = "CYR"; + if (items.length > 0 || allowedTiles.includes(tile)) { + if (_miscast) return "Miscast"; + let dist = KDistEuclidean(tt.x - entity.x, tt.y - entity.y); + let pullToX = entity.x; + let pullToY = entity.y; + KDCreateParticle(tX, tY, "RecoverObjectHit"); + let lastx = tt.x; + let lasty = tt.y; + let xxx = tt.x; + let yyy = tt.y; + + for (let i = dist; i > 0; i -= 0.2499) { + if (KDistChebyshev(pullToX - xxx, pullToY - yyy) > 1.5) { + let newX = pullToX + Math.round((xxx - pullToX) * i / dist); + let newY = pullToY + Math.round((yyy - pullToY) * i / dist); + xxx = newX; + yyy = newY; + if (xxx != lastx || yyy != lasty) { + lastx = xxx; + lasty = yyy; + KDCreateParticle(xxx, yyy, "RecoverObjectHit"); + } + } else break; + } + let success = true; + KinkyDungeonItemCheck(tt.x, tt.y, MiniGameKinkyDungeonLevel, true); + if (allowedTiles.includes(tile)) { + if (KDMoveObjectFunctions[tile]) { + if (!KinkyDungeonTilesGet(tt.x + ',' + tt.y)?.Lock) { + if (_miscast) return "Miscast"; + if (spell.aoe) KinkyDungeonChestConfirm = true; + success = KDMoveObjectFunctions[tile](tt.x, tt.y); + KinkyDungeonChestConfirm = false; + } else { + locked = true; + success = false; + } + } + } + + if (success) { + if (_miscast) return "Miscast"; + if (tile == 'C') chest = true; + KDCreateParticle(tt.x, tt.y, "RecoverObjectHit"); + grabbed = true; + } + found = true; + } + } + if (locked) KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonSpellCastFailLock"+spell.name), "#ff5277", 1); + if (grabbed) { + if (_miscast) return "Miscast"; + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell) * (chest ? 1.0 : 0.25)); + return "Cast"; + } else if (!found) KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonSpellCastFail"+spell.name), "#ff5277", 1); + return "Fail"; + }, + "Aim_MaidKnightLight": (spell, data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + // Spell that can ONLY be cast by NPCs + let aimBuff = KDEntityGetBuff(entity, "Aim"); + if (aimBuff) { + let aimMode = KDEntityBuffedStat(entity, "Aim"); + if (aimMode > 1.5) { + // FIRE!!! + KinkyDungeonCastSpell( + aimBuff.x, + aimBuff.y, + KinkyDungeonFindSpell("RubberSniper", + true), + entity, undefined, undefined); + + KinkyDungeonExpireBuff(entity, "Aim"); + KinkyDungeonExpireBuff(entity, "Aim2"); + } else { + // Do nothing. Aim buff handles the subroutine just fine + KinkyDungeonApplyBuffToEntity(entity, KDAim, { + x: aimBuff.x, y: aimBuff.y, + vx: aimBuff.vx, + vy: aimBuff.vy, + }); + } + return "Cast"; + } else { + // Start aiming + KinkyDungeonApplyBuffToEntity(entity, KDAim, { + x: entity.x, y: entity.y, + vx: entity.x, vy: entity.y, + delay: 1 + }); + return "Cast"; + } + + return "Fail"; + }, + "TelekineticSlash": (spell, data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let tilesHit = []; + for (let xx = -spell.aoe; xx <= spell.aoe; xx++) { + for (let yy = -spell.aoe; yy <= spell.aoe; yy++) { + if (AOECondition(targetX, targetY, targetX+xx, targetY+yy, spell.aoe, 'slash', entity.x, entity.y)) { + tilesHit.push({x:targetX + xx, y:targetY+yy}); + } + } + } + let hit = false; + for (let tile of tilesHit) { + let en = KinkyDungeonEnemyAt(tile.x, tile.y); + if (en && !KDAllied(en) && !KDHelpless(en) && en.hp > 0) { + if (_miscast) return "Miscast"; + if (!hit) { + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + } + KDTriggerSpell(spell, data, false, false); + hit = true; + let mod = (KinkyDungeonFlags.get("KineticMastery") ? 1.5 : 0) + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "KinesisBase"); + let scaling = 0.9 * (KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "KinesisScale"))); + let ad : damageInfo = { + name: KinkyDungeonPlayerDamage.name, + nodisarm: true, + damage: spell.power + mod + KinkyDungeonPlayerDamage.damage * scaling, + type: KinkyDungeonPlayerDamage.type, + distract: KinkyDungeonPlayerDamage.distract, + distractEff: KinkyDungeonPlayerDamage.distractEff, + desireMult: KinkyDungeonPlayerDamage.desireMult, + bind: KinkyDungeonPlayerDamage.bind, + bindType: KinkyDungeonPlayerDamage.bindType, + bindEff: KinkyDungeonPlayerDamage.bindEff, + ignoreshield: KinkyDungeonPlayerDamage.ignoreshield, + shield_crit: KinkyDungeonPlayerDamage.shield_crit, // Crit thru shield + shield_stun: KinkyDungeonPlayerDamage.shield_stun, // stun thru shield + shield_freeze: KinkyDungeonPlayerDamage.shield_freeze, // freeze thru shield + shield_bind: KinkyDungeonPlayerDamage.shield_bind, // bind thru shield + shield_snare: KinkyDungeonPlayerDamage.shield_snare, // snare thru shield + shield_slow: KinkyDungeonPlayerDamage.shield_slow, // slow thru shield + shield_distract: KinkyDungeonPlayerDamage.shield_distract, // Distract thru shield + shield_vuln: KinkyDungeonPlayerDamage.shield_vuln, // Vuln thru shield + boundBonus: KinkyDungeonPlayerDamage.boundBonus, + novulnerable: KinkyDungeonPlayerDamage.novulnerable, + tease: KinkyDungeonPlayerDamage.tease}; + data = { + target: en, + attackCost: 0.0, // Important + attackCostOrig: 0.0, + skipTurn: false, + spellAttack: true, + attackData: ad + }; + if (KinkyDungeonPlayerDamage.stam50mult && KinkyDungeonStatMana/KinkyDungeonStatManaMax >= 0.50) { + data.attackData.damage *= KinkyDungeonPlayerDamage.stam50mult; + } + KinkyDungeonSendEvent("beforePlayerLaunchAttack", data); + + KinkyDungeonAttackEnemy(en, data.attackData, Math.max(1, KinkyDungeonGetEvasion(undefined, false, true, true))); + } + } + if (hit) { + if (KinkyDungeonStatsChoice.has("BerserkerRage")) { + KDChangeDistraction(spell.name, "spell", "cast", 0.7 + 0.5 * KinkyDungeonGetManaCost(spell), false, 0.33); + } + if (!KDEventData.shockwaves) KDEventData.shockwaves = []; + KDEventData.shockwaves.push({ + x: targetX, + y: targetY, + radius: 1.5, + sprite: "Particles/Slash.png", + }); + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + return "Cast"; + } + + return "Fail"; + }, + + + "Swap": (spell, _data, targetX, targetY, tX, tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + if (!KinkyDungeonCheckPath(entity.x, entity.y, tX, tY, true, false, 1, true)) { + KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonSpellCastFail"+spell.name), "#ff5277", 1); + return "Fail"; + } + let en = KinkyDungeonEntityAt(targetX, targetY); + if (en && !en.player) { + if (!KDIsImmobile(en)) { + + if (_miscast) return "Miscast"; + + let newX = entity.x; + let newY = entity.y; + + + let tdata = { + x: newX, + y: newY, + cancel: false, + entity: KDPlayer(), + willing: true, + }; + KinkyDungeonSendEvent("beforeTeleport", tdata); + + if (tdata.cancel) { + return "Fail"; + } + + if (!(en.Enemy.tags?.unstoppable)) { + + KDMovePlayer(en.x, en.y, true, false, false, true); + KDMoveEntity(en, newX, newY, false, false, KDHostile(en)); + + KinkyDungeonRemoveBuffsWithTag(en, ["displaceend"]); + KinkyDungeonRemoveBuffsWithTag(KDPlayer(), ["displaceend"]); + + + KinkyDungeonSetEnemyFlag(en, "takeFF", 3); + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + } else { + let point = KinkyDungeonGetNearbyPoint(en.x, en.y, true, undefined, true, true); + if (point) { + KDMovePlayer(point.x, point.y, true, false, false, true); + + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCastPartial"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + } else { + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCastFail"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + } + } + + return "Cast"; + } else return "Fail"; + } else return "Fail"; + }, + + "UniversalSolvent": (spell, _data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, bullet, _miscast, _faction, _cast, _selfCast) => { + if (KDistChebyshev(entity.x - targetX, entity.y - targetY) && KinkyDungeonIsArmsBound(true, true)) { + KinkyDungeonSendActionMessage(8, TextGet("KDUniversalSolventFail"), "#ff5277", 1); + return "Fail"; + } + let en = KinkyDungeonEntityAt(targetX, targetY); + if (en && !en.player) { + if (_miscast) return "Miscast"; + KinkyDungeonDamageEnemy(en, { + type: spell.damage, + damage: spell.power, + time: spell.time, + bind: spell.bind, + }, false, true, spell, undefined, entity); + + let bondage = en.specialBoundLevel; + let mult = 4; + let repgain = en.boundLevel > 0; + if (bondage) + for (let b of Object.entries(bondage)) { + if (KDSpecialBondage[b[0]]?.latex) { + en.boundLevel = Math.max(0, en.boundLevel - Math.min(b[1], mult * spell.power)); + bondage[b[0]] -= mult * spell.power; + if (bondage[b[0]] <= 0) + delete bondage[b[0]]; + } + } + if ((KDRescueEnemy("Slime", en, true) || repgain) && !KDHelpless(en)) { + KDRescueRepGain(en); + } + + KinkyDungeonRemoveBuffsWithTag(en, ["encased", "slimed"]); + KDRescueSlime(en, entity); + + KinkyDungeonApplyBuffToEntity(en, KDGlueResist, {duration: 30}); + + KinkyDungeonSendActionMessage(3, TextGet("KDUniversalSolventSucceedEnemy") + .replace("ENMY", KDGenEnemyName(en)), + "#88FFAA", 2 + (spell.channel ? spell.channel - 1 : 0)); + + + return "Cast"; + } else if (en?.player) { + if (_miscast) return "Miscast"; + let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + + KDAddSpecialStat("LatexIntegration", KDPlayer(), -25, true); + for (let inv of KinkyDungeonAllRestraintDynamic()) { + let r = inv.item; + let restraint = KDRestraint(r); + if (restraint?.shrine.includes("Latex") || restraint?.shrine.includes("Slime")) { + if (!r.events) r.events = KDGetEventsForRestraint(r.inventoryVariant || r.name); + + if (!r.events.some((ev) => { + return ev.type == "UniversalSolvent"; + })) { + r.events.push({ + trigger: "beforeStruggleCalc", + type: "UniversalSolvent", + power: 0.1, + }); + r.events.push({ + original: "UniversalSolvent", + trigger: "inventoryTooltip", + type: "varModifier", + msg: "UniversalSolvent", + color: "#000000", + bgcolor: "#ff8933" + }); + r.events.push({ + original: "UniversalSolvent", + trigger: "drawSGTooltip", + type: "simpleMsg", + msg: "KDVariableModifier_UniversalSolvent", + color: "#ff8933", + bgcolor: KDTextGray0, + }); + KDUpdateItemEventCache = true; + + + + } + } + } + + KinkyDungeonRemoveBuffsWithTag(en, ["encased", "slimed"]); + KinkyDungeonApplyBuffToEntity(en, KDGlueResist, {duration: 30}); + + KinkyDungeonSendActionMessage(3, TextGet("KDUniversalSolventSucceedSelf") + .KDReplaceOrAddDmg( dmg.string), + "#88FFAA", 2 + (spell.channel ? spell.channel - 1 : 0)); + + return "Cast"; + } + return "Fail"; + }, + "Awaken": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let count = 0; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + if (KDistEuclidean(X, Y) <= spell.aoe) { + let loc = (tX + X) + "," + (tY + Y); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && (tile.tags.includes("slime") || tile.tags.includes("latex"))) { + //for (let t of tile.tags) { + // Run the special feature per restraint type + count += 1; + if (_miscast) return "Miscast"; + KinkyDungeonCastSpell(tX + X, tY + Y, KinkyDungeonFindSpell("AwakenStrike", true), undefined, undefined, undefined, "Player"); + //} + } + } + } + } + } + if (count > 0) { + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + return "Cast"; + } else return "Fail"; + }, + "Spread": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let slots = []; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + if (KDistEuclidean(X, Y) <= spell.aoe) { + let loc = (tX + X) + "," + (tY + Y); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && (tile.tags.includes("slime"))) { + slots.push({x: tX + X, y: tY+Y, duration: tile.duration}); + } + } + } + } + } + if (slots.length > 0) { + if (_miscast) return "Miscast"; + for (let s of slots) { + for (let xx = -1; xx <= 1; xx++) + for (let yy = -1; yy <= 1; yy++) { + if ((xx == 0 || yy == 0) && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(s.x + xx, s.y + yy))) + KDCreateEffectTile(s.x + xx, s.y + yy, { + name: "Slime", + duration: Math.max(s.duration, 12), + }, 8); + } + + } + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + return "Cast"; + } else return "Fail"; + }, + "CommandBind": (spell, _data, _targetX, _targetY, tX, tY, entity, _enemy, _moveDirection, bullet, miscast, faction, _cast, _selfCast) => { + let count = 0; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + if (KDistEuclidean(X, Y) <= spell.aoe) { + let loc = (tX + X) + "," + (tY + Y); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("bind")) { + for (let t of tile.tags) { + // Run the special feature per restraint type + if (KDCommandCaptureBindings[t]) { + if (miscast) return "Miscast"; + count += 1; + KDCommandBindBindings[t](spell, tX + X, tY + Y, faction, bullet, miscast, entity); + } + } + } + } + } + } + } + if (count > 0) { + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + return "Cast"; + } else return "Fail"; + }, + "Coalesce": (spell, _data, _targetX, _targetY, tX, tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let count = 0; + let finalTile = "Slime"; + let finalTilePri = -1; + let finalTileDuration = 0; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + if (KDistEuclidean(X, Y) <= spell.aoe) { + let loc = (tX + X) + "," + (tY + Y); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("slime")) { + if (_miscast) return "Miscast"; + count += 1; + if (tile.duration > finalTileDuration) finalTileDuration = tile.duration; + if (tile.priority > finalTilePri) { + finalTile = tile.name; + finalTilePri = tile.priority; + } + tile.duration = 0; + tile.pauseDuration = 0; + } + } + } + } + } + if (count == 0) return "Fail"; + + KDCreateEffectTile(tX, tY, { + name: finalTile, + duration: finalTileDuration, + }, 10); + + let enList = KDNearbyEnemies(tX, tY, spell.aoe); + + if (enList.length > 0) { + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + for (let en of enList) { + if (en.buffs && KinkyDungeonGetBuffedStat(en.buffs, "SlimeProgress")) { + KinkyDungeonApplyBuffToEntity(en, KDEncased); + KinkyDungeonDamageEnemy(en, { + type: spell.damage, + damage: spell.power * count, + time: spell.time, + bind: spell.bind, + }, false, true, undefined, undefined, entity); + // Get a point near the target point + let point = KinkyDungeonEntityAt(tX, tY) ? KinkyDungeonGetNearbyPoint(tX, tY, true, undefined, true) : {x:tX, y:tY}; + if (point) { + KDMoveEntity(en, point.x, point.y, false, true); + + KinkyDungeonRemoveBuffsWithTag(en, ["displaceend"]); + KinkyDungeonRemoveBuffsWithTag(KDPlayer(), ["displaceend"]); + } + } + } + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)/2); + } + + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)/2); + return "Cast"; + }, + "SlimeToLatex": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let count = 0; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + if (KDistEuclidean(X, Y) <= spell.aoe) { + let loc = (tX + X) + "," + (tY + Y); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("slime")) { + if (_miscast) return "Miscast"; + count += 1; + tile.duration = 0; + tile.pauseDuration = 0; + KDCreateEffectTile(tX + X, tY + Y, { + name: "Latex" + }, 20); + } + } + } + } + } + if (count == 0) return "Fail"; + + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + return "Cast"; + }, + "LiquidMetal": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let count = 0; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + if (KDistEuclidean(X, Y) <= spell.aoe) { + let loc = (tX + X) + "," + (tY + Y); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("latex")) { + count += 1; + if (_miscast) return "Miscast"; + tile.duration = 0; + tile.pauseDuration = 0; + KDCreateEffectTile(tX + X, tY + Y, { + name: "LiquidMetal" + }, 20); + } + } + } + } + } + if (count == 0) return "Fail"; + + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + return "Cast"; + }, + + "CommandDisenchant": (spell, _data, _targetX, _targetY, tX, tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, cast, _selfCast) => { + let enList = KDNearbyEnemies(tX, tY, spell.aoe); + + if (enList.length > 0) { + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + for (let en of enList) { + if (en.Enemy.tags.construct && (!en.buffs || !en.buffs.Disenchant1)) { + if (_miscast) return "Miscast"; + KinkyDungeonApplyBuffToEntity(en, KDDisenchant1); + KinkyDungeonApplyBuffToEntity(en, KDDisenchant2); + KinkyDungeonDamageEnemy(en, { + type: "cold", + damage: spell.power, + time: 0, + bind: 0, + }, false, true, undefined, undefined, entity); + } + } + cast = true; + } + + if (AOECondition(tX, tY, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, spell.aoe, KinkyDungeonTargetingSpell.aoetype || "")) { + if (_miscast) return "Miscast"; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, KDDisenchantSelf); + cast = true; + } + if (cast) { + KDChangeMana(spell.name, "spell", "cast", -(1 - 0.5 * Math.min(1, (enList.length-1) / 2)) * (KinkyDungeonGetManaCost(spell))); + return "Cast"; + } else return "Fail"; + }, + "NegateRune": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, cast, _selfCast) => { + let bList = KDMapData.Bullets.filter((b) => { + return AOECondition(tX, tY, b.x, b.y, spell.aoe, KinkyDungeonTargetingSpell.aoetype || "") && b.bullet?.spell?.tags?.includes("rune"); + }); + + if (AOECondition(tX, tY, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, spell.aoe, KinkyDungeonTargetingSpell.aoetype || "")) { + KinkyDungeonSendActionMessage(5, TextGet("KDNegateRuneSelf"), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + + bList = KDMapData.Bullets.filter((b) => { + return b.bullet.source == -1 && b.bullet?.spell?.tags?.includes("rune"); + }); + + } else { + if (_miscast) return "Miscast"; + cast = true; + } + + let refund = false; + if (bList.length > 0) { + if (_miscast) return "Miscast"; + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + for (let b of bList) { + b.time = 0; + if (b.bullet?.source != -1) { + refund = true; + } + } + cast = true; + } + + if (cast) { + if (refund) { + KinkyDungeonSendActionMessage(6, TextGet("KDNegateRuneEnemy"), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", 1, false, 0, undefined, true); + } else if (bList.length == 0) { + KinkyDungeonSendActionMessage(6, TextGet("KDNegateRuneFail"), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", -0.5, false, 0, undefined, true); + } + return "Cast"; + } else return "Fail"; + }, + "DollConvert": (spell, _data, _targetX, _targetY, tX, tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let enList = KDNearbyEnemies(tX, tY, spell.aoe); + + if (enList.length > 0) { + let count = 0; + let seen = 0; + for (let en of enList) { + if (!KDHelpless(en) && en.Enemy.tags?.dollmakerconvert) { + if (_miscast) return "Miscast"; + en.hp = 0; + let e = DialogueCreateEnemy(en.x, en.y, "DollsmithDoll"); + if (entity) + e.faction = KDGetFaction(entity); + count += 1; + KDCreateEffectTile(en.x, en.y, { + name: "Latex", + duration: 4, + }, 0); + if (KinkyDungeonVisionGet(en.x, en.y) > 0) + seen += 1; + } + if (count >= 3) break; + } + if (count > 0) { + if (_miscast) return "Miscast"; + if (KinkyDungeonVisionGet(entity?.x||0, entity?.y||0) > 0 || seen > 0) + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSpellCast"+spell.name).replace("ENEMYNAME", TextGet("Name" + entity?.Enemy?.name)), "#ff4488", 2); + + return "Cast"; + } + + } + return "Fail"; + }, + + "CommandVibrate": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, cast, _selfCast) => { + if (!KDGameData.CurrentVibration + && AOECondition(tX, tY, + KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, + spell.aoe, spell.aoetype || "")) { + + let vibes = []; + if (KinkyDungeonPlayerTags.get("ItemVulvaFull")) vibes.push("ItemVulva"); + if (KinkyDungeonPlayerTags.get("ItemButtFull")) vibes.push("ItemButt"); + if (KinkyDungeonPlayerTags.get("ItemVulvaPiercingsFull")) vibes.push("ItemVulvaPiercings"); + if (KinkyDungeonPlayerTags.get("ItemNipplesFull")) vibes.push("ItemNipples"); + + if (vibes.length > 0) { + if (_miscast) return "Miscast"; + if (!KDGameData.CurrentVibration) { + KinkyDungeonStartVibration( + KinkyDungeonGetRestraintItem(vibes[Math.floor(KDRandom() * vibes.length)]).name, + "tease", + vibes, + 0.5, 30, undefined, undefined, undefined, undefined, true); + } else { + KinkyDungeonAddVibeModifier( + KinkyDungeonGetRestraintItem(vibes[Math.floor(KDRandom() * vibes.length)]).name, + "tease", + vibes[0], + 1, 30, undefined, false, false, false, false, true, 0.1, 0.2); + } + cast = true; + } + } + cast = KDCastSpellToEnemies((en) => { + if (en.Enemy.bound && KDEnemyCanBeVibed(en)) { + if (_miscast) return true; + KDApplyGenBuffs(en, "Vibrate1", spell.time); + return true; + } + }, tX, tY, spell) || cast; + if (cast) { + if (_miscast) return "Miscast"; + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + KDChangeCharge(spell.name, "spell", "cast", -KinkyDungeonGetChargeCost(spell)); + return "Cast"; + } else return "Fail"; + }, + "CommandVibrateLV2": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, cast, _selfCast) => { + if (!KDGameData.CurrentVibration && AOECondition(tX, tY, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, spell.aoe, spell.aoetype || "") + && (KinkyDungeonPlayerTags.get("ItemVulvaFull") + || KinkyDungeonPlayerTags.get("ItemButtFull") + || KinkyDungeonPlayerTags.get("ItemVulvaPiercingsFull") + || KinkyDungeonPlayerTags.get("ItemNipplesFull"))) { + + let vibes = []; + if (KinkyDungeonPlayerTags.get("ItemVulvaFull")) vibes.push("ItemVulva"); + if (KinkyDungeonPlayerTags.get("ItemButtFull")) vibes.push("ItemButt"); + if (KinkyDungeonPlayerTags.get("ItemVulvaPiercingsFull")) vibes.push("ItemVulvaPiercings"); + if (KinkyDungeonPlayerTags.get("ItemNipplesFull")) vibes.push("ItemNipplesP"); + + if (vibes.length > 0 && _miscast) return "Miscast"; + KinkyDungeonStartVibration(KinkyDungeonGetRestraintItem(vibes[Math.floor(KDRandom() * vibes.length)]).name, "tease", vibes, 2.0, 15, undefined, undefined, undefined, undefined, false); + + cast = true; + } + cast = cast || KDCastSpellToEnemies((en) => { + if (en.Enemy.bound && KDEnemyCanBeVibed(en)) { + if (_miscast) return true; + KDApplyGenBuffs(en, "Vibrate2", spell.time); + return true; + } + }, tX, tY, spell); + if (cast) { + if (_miscast) return "Miscast"; + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + KDChangeCharge(spell.name, "spell", "cast", -KinkyDungeonGetChargeCost(spell)); + return "Cast"; + } else return "Fail"; + }, + "CommandVibrateLV3": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, cast, _selfCast) => { + if (!KDGameData.CurrentVibration && AOECondition(tX, tY, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, spell.aoe, spell.aoetype || "") + && (KinkyDungeonPlayerTags.get("ItemVulvaFull") + || KinkyDungeonPlayerTags.get("ItemButtFull") + || KinkyDungeonPlayerTags.get("ItemVulvaPiercingsFull") + || KinkyDungeonPlayerTags.get("ItemNipplesFull"))) { + + let vibes = []; + if (KinkyDungeonPlayerTags.get("ItemVulvaFull")) vibes.push("ItemVulva"); + if (KinkyDungeonPlayerTags.get("ItemButtFull")) vibes.push("ItemButt"); + if (KinkyDungeonPlayerTags.get("ItemVulvaPiercingsFull")) vibes.push("ItemVulvaPiercings"); + if (KinkyDungeonPlayerTags.get("ItemNipplesFull")) vibes.push("ItemNipplesP"); + + if (vibes.length > 0 && _miscast) return "Miscast"; + KinkyDungeonStartVibration(KinkyDungeonGetRestraintItem(vibes[Math.floor(KDRandom() * vibes.length)]).name, "tease", vibes, 3.0, 10, undefined, undefined, undefined, undefined, false); + + cast = true; + } + cast = KDCastSpellToEnemies((en) => { + if (en.Enemy.bound && KDEntityBuffedStat(en, "Plug") > 0) { + if (_miscast) return true; + KDApplyGenBuffs(en, "Vibrate3", spell.time); + return true; + } + }, tX, tY, spell) || cast; + if (cast) { + if (_miscast) return "Miscast"; + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + KDChangeCharge(spell.name, "spell", "cast", -KinkyDungeonGetChargeCost(spell)); + return "Cast"; + } else return "Fail"; + }, + "CommandOrgasm": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, cast, _selfCast) => { + if (!KDGameData.CurrentVibration && AOECondition(tX, tY, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, spell.aoe, KinkyDungeonTargetingSpell.aoetype || "") + && (KinkyDungeonPlayerTags.get("ItemVulvaFull") || KinkyDungeonPlayerTags.get("ItemButtFull") || KinkyDungeonPlayerTags.get("ItemVulvaPiercingsFull"))) { + + let vibes = []; + if (KinkyDungeonPlayerTags.get("ItemVulvaFull")) vibes.push("ItemVulva"); + if (KinkyDungeonPlayerTags.get("ItemButtFull")) vibes.push("ItemButt"); + if (KinkyDungeonPlayerTags.get("ItemVulvaPiercingsFull")) vibes.push("ItemVulvaPiercings"); + if (vibes.length > 0 && _miscast) return "Miscast"; + KinkyDungeonStartVibration(KinkyDungeonGetRestraintItem(vibes[Math.floor(KDRandom() * vibes.length)]).name, "tease", vibes, 3.0, 10, undefined, undefined, undefined, undefined, true); + KinkyDungeonCastSpell(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonFindSpell("OrgasmStrike", true), undefined, undefined, undefined, "Player"); + cast = true; + } + cast = KDCastSpellToEnemies((en) => { + if (en.Enemy.bound && en.distraction > 0) { + if (_miscast) return true; + let dist = en.distraction / en.Enemy.maxhp; + if (dist >= 0.9) dist *= 2; + KinkyDungeonDamageEnemy(en, { + type: "charm", + damage: spell.power * Math.max(0.1, dist), + }, true, false, spell); + if (KDIsDistracted(en)) { + KDEnemyRelease(en); + } + KinkyDungeonCastSpell(en.x, en.y, KinkyDungeonFindSpell("OrgasmStrike", true), undefined, undefined, undefined, "Player"); + en.distraction = 0; + return true; + } + }, tX, tY, spell) || cast; + if (cast) { + if (_miscast) return "Miscast"; + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + return "Cast"; + } else return "Fail"; + }, + "CommandSlime": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let enList = KDNearbyEnemies(tX, tY, spell.aoe); + let count = 0; + + if (enList.length > 0) { + count += enList.length; + for (let en of enList) { + if (_miscast) return "Miscast"; + let repgain = false; + if (en.boundLevel) { + repgain = true; + KDUntieEnemy(en, 5, false, false); + } + if ((KDRescueEnemy("Slime", en, true) || repgain) && !KDHelpless(en)) { + KDRescueRepGain(en); + } + KinkyDungeonRemoveBuffsWithTag(en, ["encased", "slimed"]); + KDRescueSlime(en, _entity); + + KinkyDungeonApplyBuffToEntity(en, KDGlueResist, {duration: 10}); + } + } + + let tried = false; + let playerInRange = KDistEuclidean(KinkyDungeonPlayerEntity.x - tX, KinkyDungeonPlayerEntity.y - tY) <= spell.aoe; + if (playerInRange) { + let active = false; + let restraints = KinkyDungeonAllRestraint(); + for (let r of restraints) { + if (KDRestraint(r).shrine && KDRestraint(r).shrine.includes("Slime")) { + if (_miscast) return "Miscast"; + KinkyDungeonRemoveRestraint(KDRestraint(r).Group); + active = true; + tried = true; + } else if (!tried && KDRestraint(r).shrine && KDRestraint(r).shrine.includes("SlimeHard")) { + tried = true; + } + } + + if (active) count += 1; + } + + if (count > 0) { + if (_miscast) return "Miscast"; + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + return "Cast"; + } else { + if (tried && playerInRange) { + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCastFail"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + } + return "Fail"; + } + }, + "EssenceMote": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let mote: effectTile = null; + let moteDist = 0; + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + let dd = KDistEuclidean(X, Y); + if (dd <= spell.aoe) { + let loc = (tX + X) + "," + (tY + Y); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("distractionmote")) { + if (!mote || moteDist > dd) { + moteDist = dd; + mote = tile; + } + } + } + } + } + } + + if (mote) { + if (_miscast) return "Miscast"; + mote.duration = 0; + if (!KDEventData.shockwaves) KDEventData.shockwaves = []; + KDEventData.shockwaves.push({ + x: mote.x, + y: mote.y,// - .167, + radius: 1, + sprite: "Particles/PinkGlow.png", + }); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/PowerMagic.ogg"); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "DistractionCast", type: "MiscastChance", power: -1, duration: KDEssenceMoteDuration(), + aura: "#ff8888", aurasprite: "Heart", buffsprite: true, + events: [{type: "EssenceMote", trigger: "tick", mult: -1/KDEssenceMoteDuration()}], + }); + KDAddEssenceMoteDP(); + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + + return "Cast"; + } + return "Fail"; + + }, + "MakeEssenceMote": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + + let loc = (_targetX) + "," + (_targetY); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("mote")) { + KinkyDungeonSendActionMessage(3, + TextGet("KinkyDungeonSpellTarget"+spell.name), "#ff5277", 2 + (spell.channel ? spell.channel - 1 : 0)); + + return "Fail"; + } + } + } + + if (KinkyDungeonStatDistraction == KinkyDungeonStatDistractionMax) { + KinkyDungeonSendActionMessage(3, + TextGet("KinkyDungeonSpellTooDistracted"+spell.name), "#ff5277", 2 + (spell.channel ? spell.channel - 1 : 0)); + + return "Fail"; + } + + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(_targetX, _targetY))) { + if (KinkyDungeonStatDistraction >= spell.power) { + KDChangeDistraction(spell.name, "spell", "cast", -spell.power, undefined, + 0 + ); + let cost = KinkyDungeonGetManaCost(spell, false, false); + + KDCreateEffectTile(_targetX, _targetY, { + name: "DistractionMote" + }, 0); + if (!KDEventData.shockwaves) KDEventData.shockwaves = []; + KDEventData.shockwaves.push({ + x: _targetX, + y: _targetY,// - .167, + radius: 1.5, + sprite: "Particles/PinkGlow.png", + }); + + if (cost > 0) + KDChangeMana(spell.name, "spell", "cast", -cost, false, 0, false, true); + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonSpellCast"+spell.name), "#ff44ff", 2); + KinkyDungeonAdvanceTime(1); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/MagicSlash.ogg"); + + return "Cast"; + } + + KinkyDungeonSendActionMessage(3, + TextGet("KinkyDungeonSpellFail"+spell.name), "#ff5277", 2 + (spell.channel ? spell.channel - 1 : 0)); + return "Fail"; + + } else { + KinkyDungeonSendActionMessage(3, + TextGet("KinkyDungeonSpellNoRoom"+spell.name), "#ff5277", 2 + (spell.channel ? spell.channel - 1 : 0)); + return "Fail"; + } + return "Fail"; + + }, + "DistractionBurst": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + if (KinkyDungeonStatDistractionLower < KinkyDungeonStatDistractionMax * 0.1) { + KinkyDungeonSendTextMessage(10, TextGet("KDDistractionBurst_No"), "#ff8888", 2, true); + return "Fail"; + } + let player = _entity; + let aoe = 2.5; + + let motes: effectTile[] = [] + for (let X = -Math.ceil(spell.aoe); X <= Math.ceil(spell.aoe); X++) + for (let Y = -Math.ceil(spell.aoe); Y <= Math.ceil(spell.aoe); Y++) { + let dd = KDistEuclidean(X, Y); + if (dd <= spell.aoe) { + let loc = (tX + X) + "," + (tY + Y); + if (KinkyDungeonEffectTilesGet(loc)) { + for (let tile of Object.values(KinkyDungeonEffectTilesGet(loc))) { + if (tile.tags && tile.tags.includes("distractionmote")) { + motes.push(tile); + } + } + } + } + } + + + if (motes.length > 0) { + let cost = KinkyDungeonGetManaCost(spell, false, true); + + if (KinkyDungeonHasMana(cost)) { + if (KinkyDungeonStatDistractionLower >= 1) { + let frac = motes.length * 0.1; + let dmgMult = 0.2; + let amount = Math.min(KinkyDungeonStatDistractionLower, KinkyDungeonStatDistractionMax*frac); + let desire = Math.max(0.01, -KDChangeDesire(spell.name, "spell", "cast", -amount, false)); + if (desire > 0) { + if (_miscast) return "Miscast"; + + for (let mote of motes) { + mote.duration = 0; + if (!KDEventData.shockwaves) KDEventData.shockwaves = []; + KDEventData.shockwaves.push({ + x: mote.x, + y: mote.y, + radius: 3, + sprite: "Particles/ShockwaveDesire.png", + }); + let nearby = KDNearbyEntities(mote.x, mote.y, aoe); + for (let enemy of nearby) { + if (enemy.player) { + let dmg = KinkyDungeonDealDamage({damage: spell.power + dmgMult * (desire/frac), type: spell.damage,}); + KinkyDungeonSendTextMessage(5, TextGet("KDDistractionBurstEffect").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + } else { + if (enemy.hp > 0 && KDHostile(enemy) && !KDHelpless(enemy)) { + KinkyDungeonDamageEnemy(enemy, { + type: spell.damage, + damage: spell.power + dmgMult * (desire/frac), + }, true, false, spell, undefined, player); + + let sp = KinkyDungeonFindSpell("DistractionBurstBullet", true); + if (sp) { + KinkyDungeonCastSpell(enemy.x, enemy.y, sp, undefined, undefined, undefined); + } + + } + } + + } + } + if (cost > 0) + KDChangeMana(spell.name, "spell", "cast", -cost, false, 0, false, true); + KinkyDungeonSendActionMessage(10, TextGet("KDDistractionBurst_Yes"), "#ff44ff", 2); + KinkyDungeonAdvanceTime(1); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/PowerMagic.ogg"); + + return "Cast"; + } + } + KinkyDungeonSendTextMessage(10, TextGet("KDDistractionBurst_No"), "#ff8888", 2, true); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDDistractionBurst_NoMana"), "#ff8888", 2, true); + } + + } + KinkyDungeonSendTextMessage(10, TextGet("KDDistractionBurst_NoMote"), "#ff8888", 2, true); + return "Fail"; + + }, + + + "CommandRelease": (spell, _data, _targetX, _targetY, tX, tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let enList = KDNearbyEnemies(tX, tY, spell.aoe); + let count = 0; + + if (enList.length > 0) { + count += enList.length; + for (let en of enList) { + if (_miscast) return "Miscast"; + let repgain = false; + if (en.boundLevel) { + repgain = true; + + KDUntieEnemy(en, spell.power, false, false); + + } + + + if ((KDRescueEnemy("Remove", en, true) || repgain) && !KDHelpless(en)) { + KDRescueRepGain(en); + } + } + } + + let tried = false; + let playerInRange = KDistEuclidean(KinkyDungeonPlayerEntity.x - tX, KinkyDungeonPlayerEntity.y - tY) <= spell.aoe; + if (playerInRange) { + let active = false; + let restraints = KinkyDungeonAllRestraint(); + if (restraints.length > 0) tried = true; + for (let r of restraints) { + if (!r.lock && !KDGetCurse(r) && KDGetEscapeChance(r, "Remove", undefined, undefined, false, false).escapeChance > 0 && !KDGroupBlocked(KDRestraint(r).Group)) { + if (_miscast) return "Miscast"; + KinkyDungeonRemoveRestraint(KDRestraint(r).Group); + active = true; + } + } + if (active) count += 1; + } + + if (count > 0) { + if (_miscast) return "Miscast"; + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCast"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + KDChangeMana(spell.name, "spell", "cast", -KinkyDungeonGetManaCost(spell)); + return "Cast"; + } else { + if (tried && playerInRange) { + KinkyDungeonSendActionMessage(3, TextGet("KinkyDungeonSpellCastFail"+spell.name), "#88AAFF", 2 + (spell.channel ? spell.channel - 1 : 0)); + } + return "Fail"; + } + }, + "AllyToggle": (_spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let en = KinkyDungeonEnemyAt(targetX, targetY); + if (en && KDAllied(en)) { + if (en.buffs?.AllySelect) KinkyDungeonExpireBuff(en, "AllySelect"); + else KinkyDungeonApplyBuffToEntity(en, { + id: "AllySelect", + aura: "#ffffff", + aurasprite: "Select", + duration: 9999, infinite: true, + type: "Sel", + power: 1, + }); + return "Cast"; + } else return "Fail"; + }, + "AllyAttention": (spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let list = KDNearbyEnemies(targetX, targetY, spell.aoe); + let succeed = false; + for (let en of list) + if (en && KDAllied(en)) { + KinkyDungeonApplyBuffToEntity(en, { + id: "AllySelect", + aura: "#ffffff", + aurasprite: "Select", + duration: 9999, infinite: true, + type: "Sel", + power: 1, + }); + succeed = true; + } + if (succeed) return "Cast"; + return "Fail"; + }, + "AllyDeselect": (spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let list = KDNearbyEnemies(targetX, targetY, spell.aoe); + let succeed = false; + for (let en of list) + if (en && KDAllied(en)) { + if (en.buffs?.AllySelect) KinkyDungeonExpireBuff(en, "AllySelect") + succeed = true; + } + if (succeed) return "Cast"; + return "Fail"; + }, + "AllyMove": (_spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let list = KDMapData.Entities.filter((en) => { + return !KDHelpless(en) && KDAllied(en); + }); + let succeed = false; + for (let en of list) + if (en && en.buffs?.AllySelect) { + en.gx = targetX; + en.gy = targetY; + KinkyDungeonSetEnemyFlag(en, "NoFollow", 9000); + succeed = true; + } + if (succeed) return "Cast"; + return "Fail"; + }, + "Disarm": (spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + let en = KinkyDungeonEnemyAt(targetX, targetY); + if (en) { + if (_miscast) return "Miscast"; + let time = Math.max(1, spell.time + - (en.Enemy.disarm ? en.Enemy.disarm : 0) + - (en.Enemy.tags.elite ? 1 : 0) + - (en.Enemy.tags.miniboss ? 2 : 0) + - (en.Enemy.tags.boss ? 4 : 0)); + en.disarm = Math.max(0, time); + return "Cast"; + } else return "Fail"; + }, + "weaponAttack": (_spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + KinkyDungeonTargetingSpellWeapon = null; + let en = KinkyDungeonEnemyAt(targetX, targetY); + if (en) { + if (_miscast) return "Miscast"; + KinkyDungeonLaunchAttack(en, 1); + return "Cast"; + } else return "Fail"; + }, + "weaponAttackOrSpell": (_spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { + KinkyDungeonTargetingSpellWeapon = null; + let en = KinkyDungeonEnemyAt(targetX, targetY); + if (en) { + if (_miscast) return "Miscast"; + KinkyDungeonLaunchAttack(en, 1); + return "Cast"; + } else { + if (_miscast) return "Miscast"; + return KinkyDungeonActivateWeaponSpell(true) ? "Cast" : "Fail"; + } + }, + "debugBind": (spell, _data, targetX, targetY, tX, tY, entity, _enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + try { + let e = KDNearbyEnemies(tX, tY, 1) + let debugDamage = { + type: "chain", + damage: 999.9, + time: 0, + bind: 1000, + distract: 0, + } + if (e) { + console.log(e); + if (e[0]) { + KinkyDungeonDamageEnemy(e[0], debugDamage, false, true, undefined, undefined, KinkyDungeonPlayerEntity, 0.1); + } + } + } + catch (err) { + console.log(err); + } + }, + "debugDefeat": (spell, _data, targetX, targetY, tX, tY, entity, _enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + try { + let e = KDNearbyEnemies(tX, tY, 1) + let debugDamage = { + type: "pain", + damage: 999.9, + time: 0, + bind: 0, + distract: 0, + } + if (e) { + console.log(e); + if (e[0]) { + KinkyDungeonDamageEnemy(e[0], debugDamage, false, true, undefined, undefined, KinkyDungeonPlayerEntity, 0.1); + } + } + } + catch (err) { + console.log(err); + } + } +}; + +let KDCommandCaptureBindings: Record void> = { + "vine": (spell, entity, faction, bullet, _miscast, _attacker, _counter) => { + // Vines slow the target down + if (entity.player) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["vineRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleVine"), "#ff5277", spell.time); + } else { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", spell.time); + KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + } + } else { + if (!(entity.slow)) entity.slow = spell.level * 5; + } + }, + "rope": (spell, entity, faction, bullet, _miscast, attacker, counter) => { + // Ropes slow the target down + if (entity.player) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleRope"), "#ff5277", spell.time); + } else { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", spell.time); + KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + } + } else { + if (!(entity.slow)) entity.bind = counter * spell.level * 3; + else entity.bind = Math.max(entity.bind, counter * spell.level * 3); + KinkyDungeonDamageEnemy(entity, { + type: "chain", + damage: 0, + time: 0, + bind: 0, + }, false, false, undefined, undefined, attacker); + } + }, + "fabric": (spell, entity, faction, bullet, _miscast, attacker, counter) => { + // Ropes slow the target down + if (entity.player) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["ribbonRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleFabric"), "#ff0055", spell.time); + } else { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", spell.time); + KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + } + } else { + if (!(entity.slow)) entity.bind = counter * spell.level * 3; + else entity.bind = Math.max(entity.bind, counter * spell.level * 3); + KinkyDungeonDamageEnemy(entity, { + type: "glue", + damage: 0, + time: 0, + bind: 0, + }, false, false, undefined, undefined, attacker); + } + }, + "belt": (spell, entity, faction, bullet, _miscast, attacker, _counter) => { + // Belts apply extra binding (10 per spell level) + if (entity.player) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["leatherRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleBelt"), "#ff5277", spell.time); + } else { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", spell.time); + KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + } + } else { + KinkyDungeonDamageEnemy(entity, { + type: "chain", + damage: 0, + time: 0, + bind: spell.level * 2.0, + }, false, true, undefined, undefined, attacker); + } + }, + "chain": (spell, entity, faction, bullet, _miscast, attacker, _counter) => { + // Chains deal crush damage + if (entity.player) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["chainRestraints"]}, MiniGameKinkyDungeonLevel + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KinkyDungeonAddRestraintIfWeaker(restraintAdd, spell.power, false, undefined, false, false, undefined, faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleChain"), "#ff5277", spell.time); + } else { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell"), "yellow", spell.time); + KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + } + } else { + KinkyDungeonDamageEnemy(entity, { + type: "crush", + damage: spell.level * 1.5, + time: 0, + bind: 0, + }, false, true, undefined, undefined, attacker); + } + }, +}; + + +let KDCommandBindBindings: Record void> = { + "vine": (_spell, x, y, _faction, _bullet, _miscast, _attacker, _counter) => { + KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindVine", true), undefined, undefined, undefined, "Player"); + }, + "rope": (_spell, x, y, _faction, _bullet, _miscast, _attacker, _counter) => { + KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindRope", true), undefined, undefined, undefined, "Player"); + }, + "fabric": (_spell, x, y, _faction, _bullet, _miscast, _attacker, _counter) => { + KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindFabric", true), undefined, undefined, undefined, "Player"); + }, + "wrapping": (_spell, x, y, _faction, _bullet, _miscast, _attacker, _counter) => { + KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindWrapping", true), undefined, undefined, undefined, "Player"); + }, + "chain": (_spell, x, y, _faction, _bullet, _miscast, _attacker, _counter) => { + KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindChain", true), undefined, undefined, undefined, "Player"); + }, + "belt": (_spell, x, y, _faction, _bullet, _miscast, _attacker, _counter) => { + KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindBelt", true), undefined, undefined, undefined, "Player"); + }, +}; + + +function KDRescueSlime(en: entity, rescuer: entity) { + if (en.Enemy.tags?.rescueslime && !KDEnemyIsTemporary(en)) { + // Replace with a random adventurer. We do NOT refresh the health + let newType = KDRandom() < 0.25 ? "Adventurer_Sub_Fighter" + : (KDRandom() < 0.25 ? "Adventurer_Brat_Fighter" + : KDRandom() < 0.25 ? "Adventurer_Switch_Fighter" + : "Adventurer_Dom_Fighter"); + let enemyType = KinkyDungeonGetEnemyByName(newType); + if (enemyType) { + en.Enemy = JSON.parse(JSON.stringify(enemyType)); + } + en.hp = Math.min(en.Enemy.maxhp, en.hp); + en.faction = KDGetFaction(rescuer); + en.hostile = 0; + } +} + +function KDEssenceMoteDuration() { + return 10; +} +function KDAddEssenceMoteDP() { + KDChangeDistraction("EssenceMote", "mote", "mote", 1, false, 0.1); +} \ No newline at end of file diff --git a/Game/src/magic/KinkyDungeonMagicList.ts b/Game/src/magic/KinkyDungeonMagicList.ts new file mode 100644 index 000000000..0628eb232 --- /dev/null +++ b/Game/src/magic/KinkyDungeonMagicList.ts @@ -0,0 +1,4211 @@ +"use strict"; +// Glossary of spell effects +// manacost: Number of turns of no stamina regen after casting the spell. Stacks +// Components: Components required to cast the spell. All of them need to be met +// Level: Determines mana cost and availability. On enemies, increases cooldown +// Power: Determines damage +// Type: "bolt" is a projectile. "inert" is a static delayed blast. "self" is a spell that casts on the player. +// Delay: If the spell's type is "inert", this determines how long before it explodes +// Range: Max targeting range +// damage: damage TYPE. Various damage types have different effects, see KinkyDungeonDealDamage +// speed: speed of a "bolt" projectile +// playerEffect: What happens when the effect hits a player +// trail, trailchance, traildamage, traillifetime: for lingering projectiles left behind the projectile +// onhit: What happens on AoE. Deals aoedamage damage, or just power otherwise + +let KDCommandWord: spell = {name: "CommandWord", tags: ["command", "binding", "utility", "defense"], sfx: "Magic", school: "Conjure", manacost: 6, components: ["Verbal"], level:1, type:"special", special: "CommandWord", noMiscast: true, + onhit:"", time:25, power: 2, range: 2.8, size: 1, damage: ""}; +let KDBondageSpell: spell = {name: "Bondage", tags: ["binding", "utility", "offense", "truss"], quick: true, school: "Any", manacost: 0, components: ["Arms"], level:1, spellPointCost: 0, type:"special", special: "Bondage", noMiscast: true, + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}; +let KDZeroResistanceSpell: spell = {name: "ZeroResistance", tags: ["utility", "defense"], quick: true, school: "Any", manacost: 0, components: [], level:1, spellPointCost: 0, type:"passive", noMiscast: true, + events: [ + {type: "ZeroResistance", trigger: "tick", }, + ], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}; + +/** + * These are starting spells + */ +let KinkyDungeonSpellsStart: spell[] = [ + //{name: "FleetFooted", sfx: "FireSpell", school: "Illusion", manacost: 0.5, components: [], level:1, type:"passive", + //events: [{type: "FleetFooted", trigger: "beforeMove", power: 1}, {type: "FleetFooted", trigger: "afterMove"}, {type: "FleetFooted", trigger: "beforeTrap", msg: "KinkyDungeonFleetFootedIgnoreTrapFail", chance: 0.35}]}, +]; + +// Filters +let filters = genericfilters.concat(...["buff", "bolt", "aoe", "dot", "offense", "defense", "utility"]); +/** Extra filters, indexed according to the learnable spells menu */ +let filtersExtra = [ + ["upgrade", "magic"], + ["upgrade", "magic"], + ["will", "stamina", "mana", "damage"], + ["will", "stamina", "mana", "binding"], + ["fire", "ice", "earth", "electric", "air", "water"], + ["binding", "latex", "summon", "physics", "metal", "leather", "rope"], + ["stealth", "light", "shadow", "knowledge"], +]; + +let KDColumnLabels = [ + ["Verbal", "Arms", "Legs", "Passive"], + ["Elements", "Conjure", "Illusion", "Other"], + ["Unique", "Active", "Passive", "Upgrades"], + ["Strength", "Dexterity", "Intelligence", "Misc"], + ["Verbal", "Arms", "Legs", "Passive"], + ["Verbal", "Arms", "Legs", "Passive"], + ["Verbal", "Arms", "Legs", "Passive"], +]; + +let KinkyDungeonSpellPages = [ + "All", + "Upgrade", + "Class", + "Upgrades", + "Elements", + "Conjure", + "Illusion", +]; + +let KinkyDungeonSpellPagesDefault = { + "All": true, + "Upgrade": true, + "Class": true, + "Upgrades": true, + "Elements": true, + "Conjure": true, + "Illusion": true, +}; + +let KDSpellColumns = { + +}; + +function KDAddSpellPage(page: string, columnLabels: string[] = []) { + if (!KDGameData.AllowedSpellPages) KDGameData.AllowedSpellPages = {}; + KDGameData.AllowedSpellPages[page] = columnLabels; +} + +/** + * These spells occur in the menu and the player can learn them + * Spells with NoBuy cannot be bought, but can be looked at. + * Spells with NoMenu do not appear in the menu until the player has them + */ +let KinkyDungeonLearnableSpells = [ + //Page -1: All learnable + [ + [], + ], + //Page 0: Spell Tree + [ + // Elements + ["ApprenticeFire", "ApprenticeLightning", "ApprenticeAir", "ApprenticeIce", "ApprenticeWater", "ApprenticeEarth"], + // Conjure + ["ApprenticeRope", "ApprenticeLeather", "ApprenticeMetal", "ApprenticeLatex", "ApprenticePhysics", "ApprenticeSummon", "FloatingWeapon"], + // Illusion + ["ApprenticeLight", "ApprenticeShadow", "ApprenticeMystery", "ApprenticeProjection", "ApprenticeKnowledge"], + // Special exclusive + ["AllyCommand"], + ], + + // Class specific + [ + [ + "Bondage", "ZeroResistance", "DesperateStruggle", "LeashSkill", + "BattleRhythm", "ManaRegen", "Peasant", "RogueTargets", "DistractionCast", + "Offhand", "RogueOffhand", "WizardOffhand", "UnconventionalWarfare", "GuerillaFighting", + + + ], + [ + "RaiseDefenses", "BreakFree", "Enrage", "LimitSurge", "Charge", "BladeDance", + "ToolsOfTheTrade", "EvasiveManeuvers", + "ArcaneBlast", "AkashicConflux", "ArcaneBarrier", + + + "MakeEssenceMote", "ChaoticOverflow", "DistractionBurst", "DistractionShield", "ShockCollar", "PsychicLink", + ], + [ + "Gunslinger", "BattleTrance", "CombatManeuver", + "ProblemSolving", + "ManaRegenFast","ManaRegenFast2","ManaRegenPlus","ManaRegenPlus2", + "Sowing", + "OrgasmMana1", "EdgeMana1", + ], + [ + "BattleCrit", "BattleCost", + "RogueTraps", "RogueTraps2", "RogueStudy", + "ManaHarvesting", + "ManaBurst", "FirstWind", "OrgasmBuff", "MagicalOverload", + ], + ], + //Page 4: Upgrades + [ + // Strength + ["IronWill", "SteadfastGuard", "WillStruggle", "Parry", "WillParry", "SteelParry", "GuardBoost", "DaggerParry", "Riposte", "PhysDamage"], + // Dex + ["Athlete", "CombatTraining", "Sneaky", "Accurate1", "Accurate2", "Accurate3", "Evasive1", "Evasive2", "Evasive3", "Vault", "ArrowFireSpell", "ArrowVineSpell", "NovicePet1", "NovicePet2", "NovicePet3", "NovicePetX", "RogueBind", "RogueEscape"], + // Intellect + ["SummonUp1", "SummonUp2", "StaffUser1", "StaffUser2", "StaffUser3"], + // Misc + ["CriticalStrike", "OrgasmFrequency", "OrgasmFrequency2", "OrgasmResist"], + ], + //Page 1: Elements + [ + // Verbal + ["Firecracker", "Incinerate", "Gust", "Freeze", "FlashFreeze", "Hailstorm", "IceBreath", "Tremor", "Earthquake", "Shield", "GreaterShield", "IronBlood", "Electrify", "Thunderstorm", "StaticSphere", "Rainstorm"], + // Arms + ["Firebolt", "Fireblast", "Fireball", "WindBlast", "Icebolt", "Snowball", "IceOrb", "Icicles", "IceLance", "StoneSkin", "Shock", "Crackle", "LightningBolt", "WaterBall", "TidalBall"], + // Legs + ["Ignite", "Fissure", "ColdFeet", "ZoneOfFrost", "Sleet", "BoulderLaunch", "BigBoulderLaunch", "Earthform", "EarthformRing", "EarthformMound", "EarthformLine", "EarthformArc", "BoulderKick", "Volcanism", "FlameRune", "FreezeRune", "LightningRune",], + // Passive + ["FlameBlade", "Burning", "TemperaturePlay", "Strength", "Shatter", "IcePrison", "LightningRod"], + ], + + //Page 2: Conjuration + [ + // Verbal + ["TelekineticSlash", "KineticLance", "CommandWord", "CommandWordGreater", "CommandDisenchant", "CommandRelease", "CommandCapture", "CommandBind", "CommandVibrate", "CommandOrgasm", "ZoneOfExcitement", "Lockdown", "Chastity", "ZoneOfPurity", "Blink", "TransportationPortal", "BanishPortal", "Bomb", "RopeBoltLaunch", "RopeBoltLaunchMany", "EnchantRope", "RopeStrike", "Leap", "Leap2", "Leap3", "CommandSlime", "Spread", "Awaken", "Animate", "AnimateLarge", "AnimatePuppet", "Coalesce", "FireElemental", "AirMote"], + // Arms + ["RecoverObject", "RecoverObject2", "TickleCloud", "FeatherCloud", "Swap", "ChainBolt", "SteelRainPlug", "SteelRainBurst", "DisplayStand", "SummonGag", "SummonAMGag", "SummonLatexGag", "SummonBlindfold", "SummonCuffs", "SummonLeatherCuffs", "SummonArmbinder", "SummonStraitjacket", "SummonLatexArmbinder", "SummonLegbinder", "SummonLatexLegbinder", "SummonHarness", "Petsuit", "SlimeBall", "ElasticGrip", "WaterMote"], + // Legs + ["NegateRune", "Sagitta", "Snare", "Wall", "Quickness", "Quickness2", "Quickness3", "Quickness4", "Quickness5", "SlimeSplash", "Slime", "SlimeEruption", "SlimeWall", "SlimeWallVert", "LatexWallVert", "SlimeWallHoriz", "LatexWallHoriz", "LatexWall", "SlimeToLatex", "LiquidMetal", "LiquidMetalBurst", "Ally", "NatureSpirit", "StormCrystal", "EarthMote", "Golem"], + // Passive + ["CommandRange", "Psychokinesis", "KineticMastery", "SagittaAssault", "Frustration", "ChainStrike", "Ropework", "LeatherBurst", "LeatherWhip", "OneWithSlime", "SlimeWalk", "SlimeMimic", "Engulf"], + ], + + //Page 3: Illusion + [ + // Verbal + ["Flash", "GreaterFlash", "FocusedFlash", "Heal", "Heal2", "ShadowWarrior", "Shroud", "Invisibility", "GreaterInvisibility", "Sonar"], + // Arms + ["ShadowBlade", "ShadowSlash", "Dagger", "TrueSteel", "Ring", "Light", "Corona"], + // Legs + ["HolyOrb", "ShadowDance", "Evasion", "Camo", "Decoy"], + // Passive + ["Analyze", "TheShadowWithin", "TrueSight", "EnemySense"], + ], + +]; + +/** + * @param page + * @param list + */ +function KDDefineSpellPage(page: string, list: string[][]) { + KinkyDungeonSpellPages.push(page); + KinkyDungeonLearnableSpells.push(list); +} + + +/** + * Spells that the player can choose + */ +let KinkyDungeonSpellList: Record = { // List of spells you can unlock in the 3 books. When you plan to use a mystic seal, you get 3 spells to choose from. + "Any": [ + KDBondageSpell, + KDZeroResistanceSpell, + + {name: "AllyCommand", tags: ["utility"], school: "Any", spellPointCost: 1, learnPage: ["Command"], + hideLearned: true, + autoLearn: [ + "AllyToggle", + "AllyAttention", + "AllyDeselect", + "AllyMove", + "AllyOnMe", + "AllyDisperse", + "AllyAggressive", + "AllyDefensive", + "AllyDeselectAll", + "AllyHold", + "AllyCancelHold", + ], + manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "AllyToggle", tags: ["utility"], prerequisite: "AllyCommand", quick: true, school: "Any", manacost: 0, components: [], level:1, spellPointCost: 0, type:"special", special: "AllyToggle", noMiscast: true, + onhit:"", time:25, power: 0, range: 10, size: 1, damage: ""}, + {name: "AllyAttention", tags: ["utility"], prerequisite: "AllyCommand", quick: true, school: "Any", manacost: 0, components: [], aoe: 1.5, level:1, spellPointCost: 0, type:"special", special: "AllyAttention", noMiscast: true, + onhit:"", time:25, power: 0, range: 10, size: 1, damage: ""}, + {name: "AllyDeselect", tags: ["utility"], prerequisite: "AllyCommand", quick: true, school: "Any", manacost: 0, components: [], aoe: 1.5, level:1, spellPointCost: 0, type:"special", special: "AllyDeselect", noMiscast: true, + onhit:"", time:25, power: 0, range: 10, size: 1, damage: ""}, + {name: "AllyMove", tags: ["utility"], prerequisite: "AllyCommand", quick: true, school: "Any", manacost: 0, components: [], level:1, spellPointCost: 0, type:"special", special: "AllyMove", noMiscast: true, + onhit:"", time:25, power: 0, range: 10, size: 1, damage: ""}, + + {name: "AllyOnMe", tags: ["utility", "defense"], prerequisite: "AllyCommand", quick: true, school: "Any", + manacost: 0, components: [], level:1, spellPointCost: 0, type:"passive", defaultOff: true, + events: [ + {type: "AllyOnMe", trigger: "toggleSpell", }, + ], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + + {name: "AllyDisperse", tags: ["utility", "defense"], prerequisite: "AllyCommand", quick: true, school: "Any", + manacost: 0, components: [], level:1, spellPointCost: 0, type:"passive", defaultOff: true, + events: [ + {type: "AllyDisperse", trigger: "toggleSpell", }, + ], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + + {name: "AllyDefensive", tags: ["utility", "defense"], prerequisite: "AllyCommand", quick: true, school: "Any", + manacost: 0, components: [], level:1, spellPointCost: 0, type:"passive", defaultOff: true, + events: [ + {type: "AllyDefensive", trigger: "toggleSpell", }, + ], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + + {name: "AllyAggressive", tags: ["utility", "defense"], prerequisite: "AllyCommand", quick: true, school: "Any", + manacost: 0, components: [], level:1, spellPointCost: 0, type:"passive", defaultOff: true, + events: [ + {type: "AllyAggressive", trigger: "toggleSpell", }, + ], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + + {name: "AllyHold", tags: ["utility", "defense"], prerequisite: "AllyCommand", quick: true, school: "Any", + manacost: 0, components: [], level:1, spellPointCost: 0, type:"passive", defaultOff: true, + events: [ + {type: "AllyHold", trigger: "toggleSpell", }, + ], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + + {name: "AllyCancelHold", tags: ["utility", "offense"], prerequisite: "AllyCommand", quick: true, school: "Any", + manacost: 0, components: [], level:1, spellPointCost: 0, type:"passive", defaultOff: true, + events: [ + {type: "AllyCancelHold", trigger: "toggleSpell", }, + ], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + + {name: "AllyDeselectAll", tags: ["utility"], prerequisite: "AllyCommand", quick: true, school: "Any", + manacost: 0, components: [], level:1, spellPointCost: 0, type:"passive", defaultOff: true, + events: [ + {type: "AllyDeselectAll", trigger: "toggleSpell", }, + ], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + + {name: "DesperateStruggle", tags: ["will", "utility"], school: "Any", + spellPointCost: 1, + customCost: "DesperateStruggle", + manacost: 0, components: [], defaultOff: true, level:1, type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "DesperateStruggle", trigger: "toggleSpell", power: 0.5, dist: 7, time: 3, cost: 2}, + ]}, + + + {name: "LeashSkill", color: "#e64539", noMiscast: true, spellPointCost: 1, school: "Any", + staminacost: 1, + sfx: "Miss", manacost: 0, components: ["Arms"], level:1, type:"special", special: "LeashSpell", + onhit:"", power: 0, delay: 0, range: 1.5, damage: "chain", speed: 2}, + + {name: "SPUp1", school: "Any", hide: true, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "WPUp1", school: "Any", hide: true, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + + {name: "APUp1", hide: true, school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "APUp2", hide: true, school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "APUp3", hide: true, school: "Any", manacost: 0, components: [], level:4, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + + {name: "MPUp1", hide: true, school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "MPUp2", hide: true, school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "MPUp3", hide: true, school: "Any", manacost: 0, components: [], level:4, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "SummonUp1", tags: ["upgrade"], hideLearned: true, hideUnlearnable: true, school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "SummonUp2", tags: ["upgrade"], hideLearned: false, hideUnlearnable: true, prerequisite: "SummonUp1", school: "Any", manacost: 0, components: [], level:2, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + + {name: "OrgasmResist", tags: ["will", "utility"], school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "OrgasmResistBuff", trigger: "tick"}, + {type: "OrgasmResist", trigger: "calcInvolOrgasmChance", power: 0}, + {type: "ChangeEdgeDrain", trigger: "calcEdgeDrain", mult: 0.3}, + {type: "Buff", trigger: "tick", power: 1.0, buffType: "soulDamageResist"}, + {type: "Buff", trigger: "tick", power: 1.0, buffType: "charmDamageResist"}, + ]}, + + {name: "Athlete", tags: ["stamina", "utility"], school: "Any", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Buff", trigger: "tick", power: 0.67, buffType: "SprintEfficiency"}, + ]}, + {name: "Sneaky", tags: ["buff", "utility"], school: "Any", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Buff", trigger: "tick", power: 0.5, prereq: "Waiting", buffType: "Sneak", mult: 1, tags: ["SlowDetection", "move", "cast"]}, + ]}, + {name: "Evasive1", tags: ["buff", "defense"], school: "Any", spellPointCost: 1, hideLearned: true, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Buff", trigger: "tick", power: 0.1, buffType: "Evasion"}, + ]}, + {name: "Evasive2", tags: ["buff", "defense"], school: "Any", spellPointCost: 1, hideLearned: true, prerequisite: "Evasive1", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Buff", trigger: "tick", power: 0.15, buffType: "Evasion"}, + ]}, + {name: "Evasive3", tags: ["buff", "defense"], school: "Any", spellPointCost: 1, prerequisite: "Evasive2", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Buff", trigger: "tick", power: 0.25, buffType: "Evasion"}, + ]}, + + {name: "Accurate1", tags: ["buff", "offense"], school: "Any", spellPointCost: 1, hideLearned: true, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Buff", trigger: "tick", power: 0.1, buffType: "Accuracy"}, + ]}, + {name: "Accurate2", tags: ["buff", "offense"], school: "Any", spellPointCost: 1, hideLearned: true, prerequisite: "Accurate1", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Buff", trigger: "tick", power: 0.15, buffType: "Accuracy"}, + ]}, + {name: "Accurate3", tags: ["buff", "offense"], school: "Any", spellPointCost: 1, prerequisite: "Accurate2", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Buff", trigger: "tick", power: 0.25, buffType: "Accuracy"}, + ]}, + + + {name: "PhysDamage", tags: ["buff", "offense", "will"], school: "Any", spellPointCost: 3, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Buff", trigger: "tick", power: 0.2, buffType: "meleeDamageBuff"}, + ]}, + + + + {name: "CriticalStrike", tags: ["damage", "offense", "buff"], school: "Any", spellPointCost: 2, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + //{trigger: "beforePlayerAttack", type: "CritBoost", prereq: "damageType", kind: "melee", power: 0.5}, + //{trigger: "calcDisplayDamage", type: "CritBoost", prereq: "damageType", kind: "melee", power: 0.5}, + {trigger: "calcCrit", type: "CritBoost", prereq: "damageType", kind: "melee", power: 0.5}, + ]}, + {name: "MagicalOverload", tags: ["damage", "offense", "buff"], school: "Special", classSpecific: "Trainee", prerequisite: "DistractionCast", hideWithout: "DistractionCast", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {trigger: "calcCrit", type: "MagicalOverload", prereq: "damageType", kind: "magic", power: 0.25}, + ]}, + {name: "CriticalStrikeMagic", tags: ["damage", "offense", "buff"], school: "Any", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + //{trigger: "beforePlayerAttack", type: "CritBoost", prereq: "damageType", kind: "melee", power: 0.5}, + //{trigger: "calcDisplayDamage", type: "CritBoost", prereq: "damageType", kind: "melee", power: 0.5}, + {trigger: "calcCrit", type: "CritBoost", prereq: "damageType", kind: "magic", power: 0.5}, + ]}, + {name: "Vault", tags: ["damage", "utility", "buff"], prerequisite: "Evasive1", school: "Any", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {trigger: "canSprint", type: "VaultBasic"}, + ]}, + {name: "VaultAdv", tags: ["damage", "utility", "buff"], prerequisite: "Vault", school: "Any", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {trigger: "canSprint", type: "Vault"}, + ]}, + {name: "IronWill", tags: ["will", "defense"], school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "IronWill", trigger: "calcMaxStats", power: 0.4}, + ]}, + {name: "SteadfastGuard", tags: ["will", "defense"], school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "SteadfastGuard", trigger: "calcMaxStats", mult: 0.5, power: 5, }, + ]}, + {name: "WillStruggle", tags: ["will", "utility"], school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "WillStruggle", mult: 0.01, power: 5, StruggleType: "Struggle", trigger: "beforeStruggleCalc", msg: "KinkyDungeonSpellWillStruggleMsg"}, + ]}, + {name: "Riposte", tags: ["will", "offense"], school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Riposte", trigger: "blockPlayer"}, + ]}, + {name: "Parry", tags: ["will", "defense"], school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Parry", power: 0.15, trigger: "tick"}, + ]}, + {name: "GuardBoost", tags: ["defense"], prerequisite: "WillParry", school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "GuardBoost", trigger: "tick"}, + ]}, + {name: "WillParry", tags: ["defense"], prerequisite: "Parry", school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "WillParry", mult: 0.005, trigger: "tick"}, + ]}, + {name: "SteelParry", tags: ["defense"], prerequisite: "WillParry", school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "SteelParry", mult: 0.005, trigger: "tick"}, + ]}, + {name: "DaggerParry", tags: ["defense"], prerequisite: "Parry", school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "DaggerParry", power: 0.15, trigger: "tick"}, + ]}, + {name: "StaffUser1", tags: ["utility"], school: "Any", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "StaffUser1", trigger: "calcMultMana", power: 0.8}, + ]}, + {name: "ManaPoolUp", tags: ["utility"], hideUnlearnable: true, school: "Any", manacost: 0, components: [], level:2, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0.5, damage: "inert", events: [ + {type: "IncreaseManaPool", trigger: "calcMaxStats", power: 10}, + ]}, + {name: "StaffUser3", tags: ["utility"], prerequisite: "StaffUser1", school: "Any", manacost: 0, components: [], level:3, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "StaffUser3", trigger: "calcMultMana", power: 0.75}, + ]}, + ], + "Special": [ + {name: "Offhand", tags: ["utility", "defense", "offense"], quick: true, school: "Special", prerequisite: "BattleRhythm", classSpecific: "Fighter", hideWithout: "BattleRhythm", + manacost: 0, components: [], level:1, spellPointCost: 0, type:"passive", defaultOff: true, + mixedPassive: true, + events: [ + {type: "Offhand", trigger: "toggleSpell", }, + {type: "Offhand", trigger: "draw", always: true,}, + {type: "Offhand", trigger: "tick", always: true,}, + ], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + + {name: "UnconventionalWarfare", tags: ["utility", "defense", "offense"], quick: true, school: "Special", prerequisite: "CombatTraining", classSpecific: "Fighter", hideWithout: "BattleRhythm", + manacost: 0, components: [], level:1, spellPointCost: 0, type:"passive", defaultOff: true, + mixedPassive: true, + events: [ + {type: "UnconventionalWarfare", trigger: "toggleSpell", }, + {type: "UnconventionalWarfare", trigger: "calcDamage", always: true, delayedOrder: 2}, + {type: "UnconventionalWarfare", trigger: "getWeapon", always: true, delayedOrder: 2}, + ], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + + {name: "GuerillaFighting", tags: ["utility", "defense", "offense"], school: "Special", prerequisite: "RogueTargets", classSpecific: "Rogue", hideWithout: "RogueTargets", + manacost: 0, components: [], level:1, spellPointCost: 0, type:"", passive: true, + events: [ + {type: "GuerillaFighting", trigger: "calcDamage", always: true, delayedOrder: 1}, + {type: "GuerillaFighting", trigger: "getWeapon", always: true, delayedOrder: 1}, + ], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + + + + {name: "FighterOffhand", tags: ["utility", "defense", "offense"], school: "Special", + prerequisite: "BattleRhythm", classSpecific: "Fighter", hideWithout: "BattleRhythm", + hideLearned: true, hideWith: "FighterOffhand", + events: [ + {trigger: "canOffhand", type: "FighterOffhand"}, + ], + manacost: 0, components: [], level:1, spellPointCost: 1, type:"", passive: true, autoLearn: ["Offhand"], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + {name: "RogueOffhand", tags: ["utility", "defense", "offense"], school: "Special", + prerequisite: "RogueTargets", classSpecific: "Rogue", hideWithout: "RogueTargets", + hideLearned: true, hideWith: "FighterOffhand", + events: [ + {trigger: "canOffhand", type: "RogueOffhand", delayedOrder: 1}, + ], + manacost: 0, components: [], level:1, spellPointCost: 1, type:"", passive: true, autoLearn: ["Offhand"], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + {name: "WizardOffhand", tags: ["utility", "defense", "offense"], school: "Special", prerequisite: "ManaRegen", classSpecific: "Mage", hideWithout: "ManaRegen", + hideLearned: true, hideWith: "FighterOffhand", + events: [ + {trigger: "canOffhand", type: "WizardOffhand", delayedOrder: 1}, + {trigger: "tick", type: "WizardOffhand", delayedOrder: 1}, + ], + manacost: 0, components: [], level:1, spellPointCost: 1, type:"", passive: true, autoLearn: ["Offhand"], + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + {name: "RogueTargets", tags: ["utility"], school: "Special", manacost: 0, components: [], classSpecific: "Rogue", prerequisite: "Null", hideUnlearnable: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + //{type: "RogueTargets", trigger: "tick"}, + //{type: "RogueTargets", trigger: "postQuest"}, + //{type: "RogueTargets", trigger: "kill"}, + //{type: "RogueTargets", trigger: "draw"}, + {type: "RogueTargets", trigger: "duringCrit", mult: 1.5}, + ]}, + {name: "RogueBind", tags: ["utility"], school: "Special", manacost: 0, components: [], classSpecific: "Rogue", prerequisite: "RogueTargets", hideWithout: "RogueTargets", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "RogueBind", trigger: "duringCrit"}, + {type: "RogueBind", trigger: "calcBindCrit", power: 0.4}, + ]}, + {name: "RogueTraps", tags: ["utility"], school: "Special", manacost: 0, components: [], classSpecific: "Rogue", prerequisite: "RogueTargets", hideWithout: "RogueTargets", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "RogueTraps", trigger: "beforeCast"}, + ]}, + {name: "RogueTraps2", tags: ["utility"], school: "Special", manacost: 0, components: [], classSpecific: "Rogue", prerequisite: "RogueTraps", hideWithout: "RogueTargets", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "RogueTraps2", trigger: "beforeCrit"}, + ]}, + {name: "RogueEscape", tags: ["utility"], school: "Special", manacost: 0, components: [], classSpecific: "Rogue", prerequisite: "RogueTargets", hideWithout: "RogueTargets", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "RogueEscape", trigger: "postApply", power: 2, time: 12}, + {type: "RogueEscape", trigger: "affinity", dist: 1.5}, + ]}, + + + {name: "ProblemSolving", tags: ["utility", "defense", "evasion"], school: "Special", manacost: 0, components: [], + classSpecific: "Rogue", prerequisite: "RogueTargets", hideWithout: "RogueTargets", level:1, + type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "ProblemSolving", mult: 0.2, power: 0.4, trigger: "beforeStruggleCalc", msg: "KinkyDungeonSpellProblemSolvingMsg"}, + //{type: "ProblemSolving", mult: 0.2, power: 0.25, trigger: "beforeStruggleCalc", msg: "KinkyDungeonSpellProblemSolvingMsg"}, + ]}, + {name: "EvasiveManeuvers", tags: ["utility", "defense", "evasion"], school: "Special", manacost: 0, components: [], + defaultOff: true, + classSpecific: "Rogue", prerequisite: "RogueTargets", hideWithout: "RogueTargets", level:1, customCost: "evasive", + type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "EvasiveManeuvers", trigger: "tickAfter"}, + {type: "EvasiveManeuvers", trigger: "calcPlayerEvasionEvent"}, + {type: "EvasiveManeuvers", trigger: "toggleSpell"}, + ]}, + + + {name: "RogueStudy", tags: ["utility"], school: "Special", manacost: 0, components: [], classSpecific: "Rogue", learnFlags: ["AdvTooltips"], prerequisite: "ToolsOfTheTrade", hideWithout: "RogueTargets", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Multiply", trigger: "calcHearing", mult: 1.15}, + ]}, + {name: "ToolsOfTheTrade", tags: ["will", "mana", "utility"], prerequisite: "RogueTargets", classSpecific: "Rogue", hideWithout: "RogueTargets", school: "Special", + manacost: 0, components: [], defaultOff: true, level:1, type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "ToolsOfTheTrade", trigger: "toggleSpell"}, + ]}, + + {name: "Peasant", tags: ["plant", "offense"], school: "Special", manacost: 0, components: [], classSpecific: "Peasant", prerequisite: "Null", hideUnlearnable: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Peasant", trigger: "beforeDamageEnemy", mult: 1.2}, + ]}, + {name: "Sowing", tags: ["plant", "utility"], prerequisite: "Peasant", classSpecific: "Peasant", hideWithout: "Peasant", school: "Special", manacost: 0, components: [], level:1, + type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "Sowing", trigger: "kill"}, + ]}, + + {name: "ArcaneBlast", tags: ["arcane", "offense", "aoe"], prerequisite: "ManaRegen", classSpecific: "Mage", hideWithout: "ManaRegen", noise: 4.5, sfx: "Shock", castCondition: "hasArcaneEnergy", + customCost: "arcane_blast", + effectTileDurationModTrail: 2, effectTileTrail: { + name: "Sparks", + duration: 3, + }, + events: [ + {type: "ArcaneStore", trigger: "spellTrigger"}, + {type: "ArcaneStore", trigger: "playerCast"}, + {type: "ArcaneBlast", trigger: "playerCast", mult: 0.25}, + ], + school: "Special", manacost: 1, components: [], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 0.0, delay: 0, time: 1, range: 8, speed: 8, size: 1, damage: "arcane", + trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1.0}, + + + + {name: "StaffUser2", tags: ["utility"], school: "Special", prerequisite: "ManaRegen", classSpecific: "Mage", hideWithout: "ManaRegen", manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0.5, damage: "inert", events: [ + {type: "IncreaseManaPool", trigger: "calcMaxStats", power: 40}, + ]}, + + {name: "ArcaneBarrier", tags: ["arcane", "will", "utility"], prerequisite: "ManaRegen", classSpecific: "Mage", hideWithout: "ManaRegen", school: "Special", manacost: 0, components: [], level:1, + type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + mixedPassive: true, + events: [ + {type: "ArcaneStore", trigger: "spellTrigger", always: true}, + {type: "ArcaneStore", trigger: "playerCast", always: true}, + //{type: "ArcaneEnergyBondageResist", trigger: "tick", power: 200, mult: 4}, + //{type: "ArcaneBarrier", trigger: "duringPlayerDamage", power: 0}, + {type: "ArcaneBarrier", trigger: "tick", mult: 0.5, power: 1, count: 5}, + ]}, + + + {name: "BattleRhythm", tags: ["fight", "will", "stamina"], prerequisite: "Null", hideUnlearnable: true, school: "Special", + manacost: 0, components: [], level:1, + type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + mixedPassive: true, + events: [ + {type: "BattleRhythmStore", trigger: "beforePlayerLaunchAttack", always: true}, + {type: "BattleRhythm", trigger: "doAttackCalculation"}, + {type: "BattleRhythm", trigger: "calcEnemyAccuracy"}, + {type: "BREvasionBlock", trigger: "tick", mult: 0.1, power: 0.1}, + {type: "BRDecay", trigger: "tick", power: 0.01, always: true,}, + ]}, + + {name: "BattleTrance", tags: ["fight", "will", "stamina"], prerequisite: "Enrage", classSpecific: "Fighter", hideWithout: "BattleRhythm", school: "Special", manacost: 0, components: [], level:1, + type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "BattleTrance", trigger: "afterPlayerAttack",}, + {type: "BattleTrance", trigger: "tick",}, + ]}, + + {name: "CombatManeuver", tags: ["fight", "will", "stamina"], prerequisite: "BattleTrance", + classSpecific: "Fighter", + hideWithout: "BattleRhythm", school: "Special", manacost: 0, components: [], level:1, + type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + passive: true, + events: [ + ]}, + + {name: "Gunslinger", tags: ["fight", "will", "ranged", "offense"], prerequisite: "BattleRhythm", classSpecific: "Fighter", hideWithout: "BattleRhythm", school: "Special", manacost: 0, components: [], level:1, + type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", passive: true, + events: [ + {type: "Gunslinger", trigger: "afterChangeCharge", mult: 0.2}, + ]}, + + {name: "Enrage", tags: ["will", "defense"], prerequisite: "BattleRhythm", classSpecific: "Fighter", hideWithout: "BattleRhythm", school: "Special", staminacost: 8, + customCost: "Enrage", manacost: 0, components: [], defaultOff: true, level:1, type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "Enrage", trigger: "toggleSpell", power: 10, time: 100, dist: 12}, + ]}, + + {name: "BladeDance", tags: ["stamina", "utility", "offense"], school: "Special", prerequisite: "BattleRhythm", classSpecific: "Fighter", hideWithout: "BattleRhythm", sfx: "Miss", spellPointCost: 1, + events: [ + {trigger: "afterBulletHit", type: "BladeDance", dist: 1.5, power: 0.5, mult: 0.75, prereq: "wepDamageType", kind: "melee"}, + ], + noMiscast: true, + staminacost: 6, + manacost: 0, components: ["Legs"], noTargetEnemies: true, level:1, type:"hit", onhit:"teleport", delay: 0, lifetime:1, range: 1.5, damage: ""}, // A quick blink + + + {name: "Charge", tags: ["stamina", "utility", "offense"], school: "Special", prerequisite: "BattleRhythm", classSpecific: "Fighter", hideWithout: "BattleRhythm", manacost: 0, customCost: "SprintPlusAttack", components: [], level:1, type:"special", special: "Charge", noMiscast: true, + onhit:"", time:25, power: 0, range: 2.99, size: 1, damage: ""}, + + {name: "RaiseDefenses", tags: ["stamina", "defense"], prerequisite: "BattleRhythm", classSpecific: "Fighter", hideWithout: "BattleRhythm", school: "Special", + staminacost: 9, manacost: 0, components: [], defaultOff: true, level:1, type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "RaiseDefenses", trigger: "toggleSpell", mult: 1.0, time: 10}, + ]}, + {name: "BreakFree", tags: ["will", "defense"], prerequisite: "BattleRhythm", classSpecific: "Fighter", hideWithout: "BattleRhythm", school: "Special", + customCost: "BreakFree", manacost: 0, components: [], defaultOff: true, level:1, type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "BreakFree", trigger: "toggleSpell", mult: 0.01, power: 0.2, time: 60, cost: .20}, + ]}, + + + {name: "LimitSurge", tags: ["will", "stamina", "utility"], prerequisite: "BattleRhythm", classSpecific: "Fighter", hideWithout: "BattleRhythm", school: "Special", customCost: "LimitSurge", manacost: 0, components: [], defaultOff: true, level:1, type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "LimitSurge", trigger: "toggleSpell", power: 4.0, mult: 1.0, time: 2}, + ]}, + + {name: "CombatTraining", tags: ["will", "stamina", "utility"], prerequisite: "BattleRhythm", classSpecific: "Fighter", hideWithout: "BattleRhythm", school: "Special", manacost: 0, components: [], level:1, type:"", passive: true, onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "CombatTraining", trigger: "attackCost", power: 0.4, mult: 0.01}, + {type: "CombatTrainingSlowResist", trigger: "tick"}, + {type: "CombatTrainingSlowRecovery", trigger: "tickAfter"}, + ]}, + + {name: "BattleCrit", tags: ["will", "stamina", "offense"], prerequisite: "Gunslinger", classSpecific: "Fighter", hideWithout: "BattleRhythm", school: "Special", manacost: 0, components: [], level:1, type:"", passive: true, onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {trigger: "calcCrit", type: "BattleCrit", mult: 0.01}, + ]}, + + {name: "BattleCost", tags: ["will", "stamina", "offense"], prerequisite: "BattleRhythm", classSpecific: "Fighter", hideWithout: "BattleRhythm", school: "Special", manacost: 0, components: [], level:1, type:"", passive: true, onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {trigger: "beforePlayerLaunchAttack", type: "BattleCost", mult: 0.01}, + ]}, + + + {name: "SecondWind0", tags: ["mana", "utility"], school: "Special", manacost: 0, components: [], prerequisite: "Null", hideUnlearnable: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "SecondWind1", tags: ["mana", "utility"], spellPointCost: 2, school: "Special", manacost: 0, components: [], prerequisite: "SecondWind0", hideUnlearnable: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "FirstWind", tags: ["mana", "utility"], spellPointCost: 2, school: "Special", classSpecific: "Trainee", + manacost: 0, components: [], prerequisite: "DistractionCast", hideUnlearnable: true, + learnFlags: ["FirstWind"], + blockedBy: ["FirstWindHigher"], + events: [ + {type: "FirstWind", trigger: "tick", power: 0.5}, + {type: "FirstWindStore", trigger: "afterChangeWill", always: true}, + ], + level:1, mixedPassive: true, type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "FirstWindHigher", tags: ["mana", "utility"], spellPointCost: 2, school: "Special", classSpecific: "Trainee", + manacost: 0, components: [], prerequisite: "DistractionCast", hideUnlearnable: true, + learnFlags: ["FirstWindHigher"], + blockedBy: ["FirstWind"], + events: [ + {type: "FirstWindHigher", trigger: "tick", power: 0.5}, + {type: "FirstWindStore", trigger: "afterChangeWill", always: true}, + ], + level:1, mixedPassive: true, type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + + {name: "NovicePet0", tags: ["mana", "utility"], school: "Special", manacost: 0, components: [], prerequisite: "Null", hideUnlearnable: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "NovicePet1", tags: ["mana", "utility"], spellPointCost: 1, school: "Special", manacost: 0, components: [], hideLearned: true, prerequisite: "NovicePet0", hideUnlearnable: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "NovicePet2", tags: ["mana", "utility"], spellPointCost: 1, school: "Special", manacost: 0, components: [], hideLearned: true, prerequisite: "NovicePet1", hideUnlearnable: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "NovicePet3", tags: ["mana", "utility"], spellPointCost: 1, school: "Special", manacost: 0, components: [], prerequisite: "NovicePet2", hideUnlearnable: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "NovicePetX", tags: ["mana", "utility"], spellPointCost: 3, school: "Special", manacost: 0, components: [], hideLearned: true, prerequisite: "NovicePet3", hideUnlearnable: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + + + + {name: "ManaRegen", tags: ["mana", "utility"], school: "Special", manacost: 0, components: [], classSpecific: "Mage", prerequisite: "Null", hideUnlearnable: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, + decreaseCost:true, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + + {type: "ManaRegenSuspend", trigger: "afterPlayerCast", time:16}, + {type: "ManaRegenSuspend", trigger: "afterSpellTrigger", time:16}, + {type: "ManaRegenSuspend", trigger: "playerAttack", time:16}, + //{type: "ManaRegenOld", trigger: "tick", mult: 0.2, power: 0.5}, + {type: "ManaRegen", trigger: "beforeCalcMana", mult: 0.2}, + ]}, + {name: "ManaRegenPlus", tags: ["mana", "offense"], school: "Special", manacost: 0, components: [], prerequisite: "ManaRegen", classSpecific: "Mage", hideWithout: "ManaRegen", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert",}, + {name: "ManaRegenPlus2", tags: ["mana", "offense"], school: "Special", manacost: 0, components: [], prerequisite: "ManaRegen", classSpecific: "Mage", hideWithout: "ManaRegen", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert",}, + {name: "ManaRegenFast", spellPointCost: 1, tags: ["mana", "offense"], school: "Special", manacost: 0, components: [], prerequisite: "ManaRegen", classSpecific: "Mage", hideWithout: "ManaRegen", hideLearned: true, level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert",}, + {name: "ManaRegenFast2", spellPointCost: 2, tags: ["mana", "offense"], school: "Special", manacost: 0, components: [], prerequisite: "ManaRegenFast", classSpecific: "Mage", hideWithout: "ManaRegen", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert",}, + + {name: "ManaHarvesting", tags: ["mana", "offense"], school: "Special", manacost: 0, components: [], prerequisite: "ManaRegen", classSpecific: "Mage", hideWithout: "ManaRegen", + level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "ArcaneStore", trigger: "spellTrigger", always: true}, + {type: "ArcaneStore", trigger: "playerCast", always: true}, + {type: "ManaHarvesting", trigger: "kill", always: true}, + ] + }, + + + + {name: "AkashicConflux", tags: ["will", "mana", "utility"], prerequisite: "ArcaneBlast", classSpecific: "Mage", hideWithout: "ManaRegen", school: "Special", + customCost: "arcane_akashic", + manacost: 0, components: [], defaultOff: true, level:1, type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "ArcaneStore", trigger: "spellTrigger"}, + {type: "ArcaneStore", trigger: "playerCast"}, + {type: "AkashicConflux", trigger: "toggleSpell", power: 10.0, time: 3}, + ]}, + + {name: "ChaoticOverflow", tags: ["will", "mana", "utility"], castCondition: "requireCrystallable", classSpecific: "Trainee", prerequisite: "DistractionCast", hideWithout: "DistractionCast", school: "Special", manacost: 0, components: [], defaultOff: true, time: 10, level:1, type:"passive", onhit:"", delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "ChaoticOverflow", trigger: "toggleSpell", time: 10, mult: 0.25, power: 3.5}, + ]}, + + + {name: "DistractionShield", tags: ["will", "defense"], prerequisite: "DistractionCast", classSpecific: "Trainee", hideWithout: "DistractionCast", school: "Special", manacost: 2.5, components: [], defaultOff: true, time: 10, level:1, type:"passive", onhit:"", delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "DistractionShield", trigger: "toggleSpell", power: 0.5, mult: 0.1, time: 10}, // power: shield per DP, mult: percentage gained as Desire + ]}, + + {name: "DistractionBurst", tags: ["will", "offense"], prerequisite: "OrgasmMana1", classSpecific: "Trainee", hideWithout: "DistractionCast", school: "Special", manacost: 7, components: [], defaultOff: true, + time: 10, level:1, type:"special", special: "DistractionBurst", onhit:"", delay: 0, range: 4.5, aoe: 2.5, + lifetime: 0, power: 1, damage: "charm", + }, + + {name: "MakeEssenceMote", tags: ["will", "offense"], prerequisite: "DistractionCast", + classSpecific: "Trainee", hideWithout: "DistractionCast", + school: "Special", manacost: 4, components: [], defaultOff: true, + //customCost: "scaleWithDP", + mixedPassive: true, + events: [ + {trigger: "afterCalcMana", type: "MakeEssenceMote", always: true} + ], + time: 10, level:1, type:"special", special: "MakeEssenceMote", onhit:"", delay: 0, range: 4.5, aoe: 0.5, + lifetime: 0, power: 2.5, damage: "charm", + }, + + + {name: "ShockCollar", tags: ["electric", "defense"], + prerequisite: "DistractionCast", classSpecific: "Trainee", + hideWithout: "DistractionCast", school: "Special", manacost: 0.0, + customCost: "ShockCollar", + components: [], defaultOff: true, time: 10, level:1, type:"passive", + onhit:"", delay: 0, range: 0, lifetime: 0, power: 4.0, damage: "estim", + events: [ + {type: "ShockCollar", trigger: "toggleSpell", power: 4.0, mult: 0.25, time: 7, + sfx: "Estim", + }, + ]}, + + {name: "PsychicLink", tags: ["psychic", "defense"], + prerequisite: "DistractionCast", classSpecific: "Trainee", + hideWithout: "DistractionCast", school: "Special", manacost: 2.5, + components: ["Vision"], time: 0, level:1, type:"hit", + onhit:"instant", delay: 0, range: 4.5, lifetime: 0, power: 2.0, damage: "soul", + events: [{type: "PsychicLink", trigger: "bulletHitEnemy", time: 50},] + }, + + {name: "ManaRecharge", tags: ["will", "mana", "utility"], prerequisite: "ManaRegen", classSpecific: "Mage", hideWithout: "ManaRegen", school: "Special", manacost: 0, components: [], defaultOff: true, level:1, type:"passive", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "ManaRecharge", trigger: "toggleSpell", power: 8.0, mult: 0.1, damage: "soul", count: 3}, + ]}, + + {name: "DistractionCast", tags: ["will", "utility"], school: "Special", + special: "EssenceMote", mixedPassive: true, + manacost: 0, components: [], classSpecific: "Trainee", prerequisite: "Null", + noMiscast: true, + hideUnlearnable: true, decreaseCost:true, level:1, type:"special", onhit:"", time: 0, delay: 0, range: 2.5, lifetime: 0, aoe: 1.5, power: 0, damage: "inert", events: [ + //{type: "DistractionCast", trigger: "calcMiscast"}, + //{type: "DistractionCast", trigger: "tick"}, + //{type: "DistractionCast", trigger: "playerCast"}, + {type: "EssenceMote", trigger: "miscast", dist: 1.5}, + ]}, + {name: "ManaBurst", tags: ["will", "utility"], school: "Special", + passive: true, + manacost: 0, components: [], classSpecific: "Trainee", prerequisite: "DistractionCast", + hideUnlearnable: true, level:1, type:"", onhit:"", time: 0, + delay: 0, range: 2.5, lifetime: 0, aoe: 1.5, power: 0, damage: "inert", events: [ + {type: "ManaBurst", trigger: "calcMiscast"}, + {type: "ManaBurst", trigger: "tick"}, + {type: "ManaBurst", trigger: "playerCast"}, + ]}, + {name: "OrgasmMana1", tags: ["will", "utility"], school: "Special", manacost: 0, components: [], classSpecific: "Trainee", prerequisite: "DistractionCast", hideWithout: "DistractionCast", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + blockedBy: ["EdgeMana1"], events: [ + {type: "RestoreOrgasmMana", trigger: "orgasm", power: 5.0}, + ]}, + {name: "OrgasmBuff", tags: ["will", "utility"], school: "Special", manacost: 0, components: [], classSpecific: "Trainee", prerequisite: "OrgasmMana1", hideWithout: "DistractionCast", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "SatisfiedDamageBuff", trigger: "tick", power: 0.1}, + {type: "OrgasmDamageBuff", trigger: "orgasm", power: 0.4, time: 8}, + ]}, + + + {name: "OrgasmFrequency", tags: ["will", "utility"], arousalMode: true, school: "Special", manacost: 0, components: [], level:1, hideLearned: true, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "ChangeOrgasmStamina", trigger: "orgasm", mult: 0.3}, + {type: "ChangeSPCost", trigger: "tryOrgasm", mult: 0.5}, + ]}, + {name: "OrgasmFrequency2", tags: ["will", "utility"], arousalMode: true, school: "Special", prerequisite: "OrgasmFrequency", hideUnlearnable: true, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "ChangeOrgasmStamina", trigger: "orgasm", mult: 0.1}, + {type: "ChangeSPCost", trigger: "tryOrgasm", mult: 0.5}, + {type: "ChangeWPCost", trigger: "tryOrgasm", mult: 0.5}, + ]}, + {name: "EdgeMana1", tags: ["will", "utility"], school: "Special", manacost: 0, components: [], classSpecific: "Trainee", prerequisite: "DistractionCast", hideWithout: "DistractionCast", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + blockedBy: ["OrgasmMana1"], events: [ + {type: "RestoreEdgeMana", trigger: "tick", power: 0.1}, + {type: "EdgeRegenBoost", trigger: "calcManaPool", power: 0.04}, + //{type: "RestoreDenyMana", trigger: "deny", power: 4.0}, + ]}, + {name: "DenyMana", tags: ["will", "utility"], school: "Special", manacost: 0, components: [], classSpecific: "Trainee", prerequisite: "EdgeMana1", hideWithout: "DistractionCast", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "RestoreDenyMana", trigger: "deny", power: 4.0}, + ]}, + ], + "Elements": [ + {goToPage: 4, name: "ApprenticeFire", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["Firebolt"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 4, name: "ApprenticeWater", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["WaterBall"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 4, name: "ApprenticeEarth", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["StoneSkin"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 4, name: "ApprenticeAir", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["WindBlast"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 4, name: "ApprenticeLightning", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["Electrify"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "Buff", trigger: "tick", power: 0.5, buffType: "blindResist"}, + ],}, + {goToPage: 4, name: "ApprenticeIce", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["Freeze"], hideLearned: true, hideUnlearnable: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + + {name: "Earthform", tags: ["earth", "utility", "summon"], autoLearn: ["EarthformRing", "EarthformMound", "EarthformLine", "EarthformArc"], prerequisite: "ApprenticeEarth", hideLearned: true, school: "Elements", manacost: 0, spellPointCost: 1, components: [], level:1, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "BoulderKick", tags: ["earth", "offense", "utility"], sfx: "HeavySwing", school: "Elements", prerequisite: "Earthform", manacost: 1, components: [], level:1, type:"special", special: "BoulderKick", noMiscast: true, + onhit:"", power: 4.0, range: 1.5, size: 1, damage: ""}, + {name: "Volcanism", tags: ["earth", "fire", "offense"], sfx: "FireSpell", school: "Elements", prerequisite: "Earthform", manacost: 6, components: [], level:1, type:"special", special: "Volcanism", noMiscast: true, + filterTags: ["summonedRock"], onhit:"", power: 6.0, range: 5.99, aoe: 2.5, size: 1, damage: ""}, + {name: "EarthformRing", secret: true, tags: ["earth", "utility", "summon"], noSprite: true, noise: 6, minRange: 0, landsfx: "Bones", school: "Elements", hideUnlearnable: true, manacost: 4, components: ["Legs"], prerequisite: ["Earthform"], + level:1, type:"hit", onhit:"summon", summon: [{name: "EarthenMonolith", faction: "Rock", count: 30, minRange: 2.5, time: 9999, bound: true}], power: 0, time: 9999, delay: 1, range: 2.5, size: 1, aoe: 3.99, lifetime: 1, damage: "inert", + effectTileDurationMod: 40, effectTile: { + name: "Cracked", + duration: 100, + }, effectTileDensity: 0.3}, + {name: "EarthformMound", secret: true, tags: ["earth", "utility", "summon"], noSprite: true, noise: 6, minRange: 0, landsfx: "Bones", school: "Elements", hideUnlearnable: true, manacost: 3, components: ["Legs"], prerequisite: ["Earthform"], + level:1, type:"hit", onhit:"summon", summon: [{name: "EarthenMonolith", count: 9, faction: "Rock", time: 9999, bound: true}], power: 0, time: 9999, delay: 1, range: 4, size: 1, aoe: 1.5, lifetime: 1, damage: "inert", + effectTileDurationMod: 40, effectTile: { + name: "Cracked", + duration: 100, + }}, + {name: "EarthformArc", secret: true, tags: ["earth", "utility", "summon"], noSprite: true, noise: 6, minRange: 0, landsfx: "Bones", school: "Elements", hideUnlearnable: true, manacost: 2.5, components: ["Legs"], prerequisite: ["Earthform"], + aoetype: 'arc', + spellPointCost: 0, + level:1, type:"hit", onhit:"summon", summon: [{name: "EarthenMonolith", count: 9, faction: "Rock", time: 9999, bound: true}], power: 0, time: 9999, delay: 1, range: 3.5, size: 1, aoe: 2.5, lifetime: 1, damage: "inert", + effectTileDurationMod: 40, effectTile: { + name: "Cracked", + duration: 100, + }}, + + {name: "EarthformLine", secret: true, tags: ["earth", "utility", "summon"], noSprite: true, noise: 6, sfx: "Bones", school: "Elements", hideUnlearnable: true, manacost: 2, components: ["Legs"], level:1, type:"bolt", prerequisite: ["Earthform"], + piercing: true, projectileTargeting:true, castRange: 3, nonVolatile: true, onhit:"", power: 3, delay: 0, range: 4.99, speed: 7, size: 1, damage: "inert", + trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"cast", trailChance: 1.0, trailOnSelf: true, + trailcast: {spell: "EarthformSingle", target: "onhit", directional:true, offset: false}, + effectTileDurationModTrail: 40, effectTileTrail: { + name: "Cracked", + duration: 100, + }, + }, + + + {name: "TemperaturePlay", tags: ["fire", "ice", "offense"], prerequisite: ["ApprenticeIce", "ApprenticeFire"], school: "Elements", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "TemperaturePlay", trigger: "beforeDamageEnemy", power: 0.3}, + ]}, + + {name: "Burning", tags: ["fire", "offense"], prerequisite: "ApprenticeFire", school: "Elements", spellPointCost: 2, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Burning", trigger: "beforeDamageEnemy", damage: "fire"}, + ]}, + {name: "IcePrison", tags: ["ice", "offense"], prerequisite: "ApprenticeIce", school: "Elements", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "IcePrison", trigger: "afterDamageEnemy"}, + ]}, + {name: "LightningRod", tags: ["electric", "air", "defense", "utility"], prerequisite: "ApprenticeLightning", school: "Elements", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "LightningRod", trigger: "playerCast", power: 3.0}, + ]}, + {name: "Incinerate", prerequisite: "Firecracker", tags: ["fire", "aoe", "dot", "offense", "denial"], noUniqueHits: true, noise: 3, landsfx: "FireSpell", school: "Elements", manacost: 8, + upcastFrom: "Firecracker", upcastLevel: 1, hitSpin: 1, + pierceEnemies: true, + hideWarnings: true, + components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 1, power: 2.5, range: 2.5, size: 3, aoe: 1.5, lifetime: 6, damage: "fire", playerEffect: {name: "Damage"}, + effectTileDurationMod: 12, effectTile: { + name: "Ember", + duration: -6, + } + }, + + {name: "Tremor", prerequisite: "ApprenticeEarth", tags: ["earth", "offense", "utility"], sfx: "Telekinesis", school: "Elements", manacost: 2, components: ["Verbal"], level:1, + type:"hit", onhit:"instant", evadeable: true, noblock: true, time:8, power: 2, range: 3.99, size: 3, lifetime: 1, aoe: 1.5, damage: "crush", + events: [{trigger: "beforeDamageEnemy", type: "MakeVulnerable", time: 2}], + effectTileDurationMod: 40, effectTile: { + name: "Cracked", + duration: 100, + }, effectTileDensity: 0.5, + }, + + {name: "Earthquake", prerequisite: "Tremor", landsfx: "Telekinesis", school: "Elements", manacost: 9, components: ["Verbal"], level:1, type:"inert", onhit:"cast", + upcastFrom: "Tremor", upcastLevel: 2, + dot: true, time: 4, delay: 6, range: 2.99, size: 5, aoe: 1.5, lifetime: 1, power: 1, damage: "inert", noEnemyCollision: true, noTerrainHit: true, + spellcasthit: {spell: "Tremor", target: "onhit", chance: 1.0, countPerCast: 2, directional:false, offset: false}, channel: 7}, + + {name: "Firecracker", prerequisite: "ApprenticeFire", landsfx: "Lightning", tags: ["fire", "aoe", "offense"], noUniqueHits: true, noise: 7, sfx: "FireSpell", school: "Elements", manacost: 4, + components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 1, power: 3.5, range: 3.99, size: 3, aoe: 1, lifetime: 1, damage: "fire", playerEffect: {name: "Damage"}, + effectTileDurationMod: 8, effectTile: { + name: "Ember", + duration: -4, + } + }, + + + {name: "Hailstorm", color: "#92e8c0", prerequisite: "ApprenticeIce", tags: ["ice", "aoe", "dot", "offense", "utility", "denial"], noUniqueHits: true, noise: 3, sfx: "FireSpell", school: "Elements", manacost: 7, + components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 1, power: 1.0, time: 2, range: 2.5, size: 3, aoe: 1.5, lifetime: 8, damage: "frost", playerEffect: {name: "Damage"}, + pierceEnemies: true, + effectTileDurationMod: 12, effectTile: { + name: "Ice", + duration: -6, + } + }, + {name: "Rainstorm", prerequisite: "ApprenticeWater", tags: ["water", "soap", "aoe", "dot", "offense", "utility", "denial"], noUniqueHits: true, noise: 3, sfx: "FireSpell", school: "Elements", manacost: 4.5, + components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 3, power: 3.5, time: 2, range: 2.5, size: 3, aoe: 1.5, lifetime: 1, damage: "soap", + pierceEnemies: true, + effectTileDurationMod: 8, effectTile: { + name: "Water", + duration: 14, + } + }, + {name: "FlashFreeze", color: "#92e8c0", tags: ["ice", "utility", "offense", "aoe"], prerequisite: "Freeze", sfx: "Freeze", school: "Elements", manacost: 5, components: ["Verbal"], + level:2, type:"hit", onhit:"instant", evadeable: false, noblock: true, power: 2.0, range: 2.99, size: 3, lifetime: 1, aoe: 1.5, damage: "ice", + events: [{type: "ElementalOnDrench", trigger: "bulletHitEnemy", damage: "ice", time: 8, power: 0.0},]}, + {name: "ColdFeet", color: "#92e8c0", tags: ["ice", "dot", "offense", "denial"], + prerequisite: "ApprenticeIce", effectTileDurationMod: 10, + playerEffect: {name: "DamageIfChill", damage: "ice", power: 0.3}, + effectTile: { + name: "Ice", + duration: 12, + }, hitSpin: 0.0, bulletSpin: 0.25, noUniqueHits: true, noblock: true, noise: 4, + sfx: "FireSpell", school: "Elements", manacost: 2, components: ["Legs"], level:1, pierceEnemies: true, + type:"inert", onhit:"aoe", delay: 1, power: 0.7, range: 4.5, aoe: 0.5, lifetime: 10, time: 2, damage: "frost"}, + {name: "ZoneOfFrost", color: "#92e8c0", tags: ["ice", "aoe", "dot", "offense", "denial"], + prerequisite: "ColdFeet", effectTileDurationMod: 10, + upcastLevel: 1, upcastFrom: "ColdFeet", + playerEffect: {name: "DamageIfChill", damage: "ice", power: 0.5}, + effectTile: { + name: "Ice", + duration: 16, + }, hitSpin: 0.65, bulletSpin: 0.45, noUniqueHits: true, noblock: true, noise: 6, + sfx: "FireSpell", school: "Elements", manacost: 6, components: ["Legs"], level:1, pierceEnemies: true, + type:"inert", onhit:"aoe", delay: 1, power: 0.8, range: 4.5, size: 3, aoe: 1.5, lifetime: 12, time: 2, damage: "frost"}, + {name: "Sleet", color: "#92e8c0", tags: ["ice", "aoe", "dot", "offense", "denial"], + prerequisite: "ZoneOfFrost", effectTileDurationMod: 10, + upcastLevel: 2, upcastFrom: "ColdFeet", + spellPointCost: 0, + playerEffect: {name: "DamageIfChill", damage: "ice", power: 0.4}, + effectTile: { + name: "Ice", + duration: 20, + }, hitSpin: 0.5, bulletSpin: 0.25, noUniqueHits: true, noblock: true, noise: 8, + sfx: "FireSpell", school: "Elements", manacost: 10, components: ["Legs"], level:1, pierceEnemies: true, + type:"inert", onhit:"aoe", delay: 1, power: 1, range: 4.5, size: 5, aoe: 2.9, lifetime: 15, time: 2, damage: "frost"}, + {name: "WindBlast", tags: ["air", "bolt", "offense", "utility"], + prerequisite: "ApprenticeAir", sfx: "FireSpell", school: "Elements", manacost: 2.5, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", power: 1.0, time: 2, delay: 0, range: 2.99, damage: "stun", speed: 3, hitSpin: 1, bulletSpin: 1, + pierceEnemies: true, + shotgunCount: 3, shotgunDistance: 4, shotgunSpread: 3, shotgunSpeedBonus: 1, + events: [{type: "Knockback", trigger: "bulletHitEnemy", power: 1.0, dist: 1.0},]}, + {name: "Gust", tags: ["air", "bolt", "offense", "utility"], + prerequisite: "ApprenticeAir", sfx: "FireSpell", school: "Elements", manacost: 4.5, components: ["Verbal"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", power: 1.5, delay: 0, range: 7.99, damage: "stun", speed: 1, hitSpin: 1, bulletSpin: 1, + pierceEnemies: true, + shotgunCount: 3, shotgunDistance: 8, shotgunSpread: .25, shotgunSpeedBonus: 2, + events: [{type: "Knockback", trigger: "bulletHitEnemy", power: 0.8, dist: 1.0},]}, + + {name: "Firebolt", tags: ["fire", "bolt", "offense"], prerequisite: "ApprenticeFire", sfx: "FireSpell", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", + noise: 3, + bulletColor: 0xb83716, bulletLight: 4, + hitColor: 0xe64539, hitLight: 6, + hideWarnings: true, + projectileTargeting:true, onhit:"", power: 4.0, delay: 0, range: 50, damage: "fire", speed: 3, playerEffect: {name: "Damage"}, + effectTileDurationMod: 3, effectTile: { + name: "Ember", + duration: 3, + }}, // Throws a fireball in a direction that moves 1 square each turn + {name: "Fireblast", prerequisite: "Firebolt", tags: ["fire", "bolt", "aoe", "offense"], sfx: "FireSpell", school: "Elements", manacost: 5.5, components: ["Arms"], level:1, + noise: 5, noDirectDamage: true, + upcastFrom: "Firebolt", upcastLevel: 1, + hideWarnings: true, + bulletColor: 0xb83716, bulletLight: 6.5, + hitColor: 0xe64539, hitLight: 8, + landsfx: "Lightning", + type:"bolt", projectileTargeting:true, onhit:"aoe", power: 6, delay: 0, range: 50, aoe: 1.5, size: 3, lifetime:1, damage: "fire", speed: 2, playerEffect: {name: "Damage"}, + effectTileDurationModTrail: 8, effectTileTrail: { + name: "Ember", + duration: 2, + }, + effectTileDurationMod: 6, effectTile: { + name: "Ember", + duration: 5, + }}, // Throws a fireball in a direction that moves 1 square each turn + + {name: "Fireball", prerequisite: "Fireblast", tags: ["fire", "bolt", "aoe", "offense"], sfx: "FireSpell", school: "Elements", manacost: 10, components: ["Arms"], level:1, + noise: 8, noDirectDamage: true, + upcastFrom: "Firebolt", upcastLevel: 2, + bulletColor: 0xb83716, bulletLight: 8, + hitColor: 0xe64539, hitLight: 11, + landsfx: "Lightning", + hideWarnings: true, + type:"bolt", projectileTargeting:true, onhit:"aoe", power: 10, delay: 0, range: 50, aoe: 2.8, size: 5, lifetime:1, damage: "fire", speed: 1.5, playerEffect: {name: "Damage"}, + effectTileDurationModTrail: 12, effectTileTrail: { + name: "Ember", + duration: 4, + }, + effectTileDurationMod: 8, effectTile: { + name: "Ember", + duration: 7, + }}, // Throws a fireball in a direction that moves 1 square each turn + + {name: "Freeze", color: "#92e8c0", tags: ["ice", "utility", "offense"], prerequisite: "ApprenticeIce", sfx: "Freeze", school: "Elements", manacost: 3, components: ["Verbal"], + effectTileDurationMod: 10, effectTile: { + name: "Ice", + duration: 20, + }, + noise: 1.5, + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: true, time:6, power: 3, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "frost", + events: [{type: "ElementalOnSlowOrBindOrDrench", trigger: "bulletHitEnemy", damage: "ice", time: 6, power: 0},]}, + {name: "Icebolt", tags: ["ice", "bolt", "offense"], prerequisite: "ApprenticeIce", sfx: "MagicSlash", hitsfx: "Freeze", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", + bulletColor: 0x92e4e8, bulletLight: 3, + hitColor: 0x92e4e8, hitLight: 5, + effectTileDurationMod: 10, effectTile: { + name: "Ice", + duration: 20, + }, + projectileTargeting:true, onhit:"", time: 4, power: 3.5, delay: 0, range: 50, damage: "frost", speed: 3, playerEffect: {name: "Chill", damage: "ice", power: 3, time: 3}, + events: [{type: "ElementalOnSlowOrBindOrDrench", trigger: "bulletHitEnemy", damage: "ice", time: 4, power: 0},]}, + {name: "Snowball", color: "#92e8c0", tags: ["ice", "bolt", "offense"], prerequisite: "ApprenticeIce", sfx: "Freeze", hitsfx: "LesserFreeze", school: "Elements", manacost: 5, components: ["Arms"], level:1, type:"bolt", + noise: 5, + bulletColor: 0x92e4e8, bulletLight: 6, + projectileTargeting:true, onhit:"lingering", time: 3, power: 2.0, delay: 0, lifetime: 6, lifetimeHitBonus: 2, range: 50, aoe: 2.5, damage: "frost", speed: 3, playerEffect: {name: "Damage"}, + effectTileDurationMod: 2, effectTile: { + name: "Ice", + duration: 6, + }, effectTileDensity: 0.5}, + {name: "IceLance", color: "#92e8c0", tags: ["ice", "bolt", "offense", "aoe"], prerequisite: "Icicles", sfx: "Lightning", hitsfx: "Freeze", school: "Elements", pierceEnemies: true, + noise: 4, + upcastFrom: "Icicles", upcastLevel: 2, + manacost: 7, components: ["Arms"], level:1, type:"bolt", + bulletColor: 0x92e4e8, bulletLight: 4, + hitColor: 0x92e4e8, hitLight: 7, + effectTileDurationModTrail: 10, effectTileTrail: { + name: "Ice", + duration: 20, + }, + projectileTargeting:true, onhit:"", time: 3, power: 10, delay: 0, range: 50, damage: "frost", speed: 6, playerEffect: {name: "Damage"}, + events: [{type: "ElementalOnSlowOrBindOrDrench", trigger: "bulletHitEnemy", damage: "ice", time: 3, power: 0},]}, + {name: "IceOrb", color: "#92e8c0", tags: ["ice", "bolt", "offense", "utility", "aoe"], prerequisite: "Snowball", sfx: "LesserFreeze", hitsfx: "LesserFreeze", school: "Elements", + noise: 6, + upcastFrom: "Snowball", upcastLevel: 1, + manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, pierceEnemies: true, delay: 0, range: 50, damage: "frost", speed: 2, + bulletColor: 0x92e4e8, bulletLight: 5, + effectTileDurationModTrail: 4, effectTileTrailAoE: 1.5, noTrailOnPlayer: true, effectTileTrail: { + name: "Ice", + duration: 10, + }}, + {name: "Icicles", tags: ["ice", "bolt", "offense"], prerequisite: "Icebolt", sfx: "MagicSlash", school: "Elements", manacost: 6, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + noise: 3, + spellcast: {spell: "Icicle", target: "target", directional:true, offset: false}, channel: 3}, + {name: "BoulderLaunch", tags: ["earth", "bolt", "offense"], prerequisite: "ApprenticeEarth", sfx: "Telekinesis", school: "Elements", manacost: 2, components: ["Legs"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 4, delay: 1, power: 4, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "Boulder", target: "target", directional:true, offset: false}, channel: 1}, + {name: "BigBoulderLaunch", tags: ["earth", "bolt", "offense", "aoe"], prerequisite: "BoulderLaunch", sfx: "Telekinesis", school: "Elements", + upcastFrom: "BoulderLaunch", upcastLevel: 2, + manacost: 6, components: ["Legs"], projectileTargeting: true, noTargetPlayer: true, noEnemyCollision: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 8, delay: 1, power: 12, range: 50, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "BigBoulder", target: "target", directional:true, offset: false}, channel: 1}, + {name: "Electrify", tags: ["electric", "offense"], prerequisite: "ApprenticeLightning", noise: 6, + effectTileDurationMod: 2, effectTile: { + name: "Sparks", + duration: 3, + }, + sfx: "FireSpell", landsfx: "Shock", school: "Elements", manacost: 5, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", power: 9, time: 4, delay: 1, range: 4, size: 1, aoe: 0.75, lifetime: 1, damage: "electric", playerEffect: {name: "Shock", time: 1}}, // A series of light shocks incapacitate you + {name: "Shock", tags: ["electric", "bolt", "offense", "dot"], prerequisite: "ApprenticeLightning", sfx: "FireSpell", + effectTileDurationMod: 2, effectTile: { + name: "Sparks", + duration: 3, + }, + school: "Elements", manacost: 5, components: ["Arms"], noEnemyCollision: true, level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2.5, delay: 0, range: 50, damage: "inert", speed: 1, + events: [{type: "CastSpellNearbyEnemy", trigger: "bulletTick", spell: "ShockStrike", aoe: 1.5},]}, + {name: "Crackle", tags: ["electric", "offense", "aoe"], prerequisite: "Shock", noise: 6, sfx: "Shock", + effectTileDurationModTrail: 2, effectTileTrail: { + name: "Sparks", + duration: 3, + }, + school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 4.0, delay: 0, time: 1, range: 4, speed: 4, size: 1, damage: "electric", + trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1.0, playerEffect: {name: "Shock", time: 1}}, + {name: "Fissure", tags: ["fire", "denial", "dot", "aoe", "offense"], noUniqueHits: true, prerequisite: "Ignite", noise: 7, sfx: "FireSpell", school: "Elements", manacost: 8, components: ["Legs"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 5.5, delay: 0, range: 4, speed: 4, size: 1, damage: "fire", + trailPower: 1.5, trailLifetime: 6, piercingTrail: true, trailDamage:"fire", trail:"lingering", trailChance: 1, playerEffect: {name: "DamageNoMsg", hitTag: "Fissure", time: 1, damage:"fire", power: 3}}, + //{name: "Shield", sfx: "MagicSlash", school: "Elements", manacost: 1, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, level:1, type:"inert", block: 10, onhit:"", power: 0,delay: 2, range: 1.5, size: 1, damage: ""}, // Creates a shield that blocks projectiles for 1 turn + {name: "Shield", tags: ["shield", "defense", "earth"], prerequisite: "ApprenticeEarth", sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Verbal"], mustTarget: true, level:1, type:"buff", + buffs: [ + {id: "Shield", type: "SpellResist", aura: "#73efe8", duration: 50, power: 3.0, player: true, enemies: true, tags: ["defense", "damageTaken"]}, + ], onhit:"", time:50, power: 0, range: 2, size: 1, damage: ""}, + {name: "GreaterShield", tags: ["shield", "defense", "utility", "earth"], prerequisite: "Shield", spellPointCost: 1, sfx: "MagicSlash", school: "Elements", manacost: 1, components: ["Verbal"], + noTargetEnemies: true, noTargetPlayer: true, level:1, type:"inert", block: 20, onhit:"", power: 0, delay: 5, range: 2.99, size: 1, damage: ""}, // Creates a shield that blocks projectiles for 5 turns + {name: "IceBreath", tags: ["ice", "denial", "offense", "utility", "aoe"], prerequisite: "Hailstorm", sfx: "MagicSlash", hitsfx: "Freeze", school: "Elements", manacost: 8, + upcastFrom: "Hailstorm", upcastLevel: 1, + components: ["Verbal"], level:1, type:"inert", onhit:"lingering", time: 1, delay: 1, range: 3, size: 3, aoe: 1.5, lifetime: 10, power: 5, lifetimeHitBonus: 5, damage: "ice"}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + {name: "LightningBolt", tags: ["electric", "aoe", "offense"], prerequisite: "Crackle", noise: 11, sfx: "Lightning", + school: "Elements", spellPointCost: 1, manacost: 9.5, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 8.5, delay: 0, time: 2, range: 50, speed: 50, size: 1, damage: "electric", + upcastFrom: "Crackle", upcastLevel: 2, + trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1, playerEffect: {name: "Shock", time: 3}, + effectTileDurationModTrail: 4, effectTileDensityTrail: 0.6, effectTileTrail: { + name: "Sparks", + duration: 2, + } + }, + {name: "StoneSkin", tags: ["earth", "buff", "defense"], prerequisite: "ApprenticeEarth", sfx: "Bones", school: "Elements", manacost: 5.5, components: ["Arms"], mustTarget: true, level:1, type:"buff", buffs: [{id: "StoneSkin", aura: "#FF6A00", type: "Armor", duration: 50, power: 2.0, player: true, enemies: true, tags: ["defense", "armor"]}], onhit:"", time:50, power: 0, range: 2, size: 1, damage: ""}, + {name: "IronBlood", tags: ["earth", "buff", "offense"], prerequisite: "ApprenticeEarth", sfx: "FireSpell", school: "Elements", manacost: 0, components: ["Verbal"], mustTarget: true, selfTargetOnly: true, level:1, type:"buff", channel: 4, + buffs: [ + {id: "IronBlood", aura: "#ff5277", type: "AttackStamina", duration: 99999, cancelOnReapply: true, endSleep: true, power: 1, player: true, enemies: false, tags: ["attack", "stamina"]}, + {id: "IronBlood2", type: "ManaCostMult", duration: 99999, cancelOnReapply: true, endSleep: true, power: 0.25, player: true, enemies: false, tags: ["manacost"]}, + ], onhit:"", time:30, power: 0, range: 2, size: 1, damage: ""}, + {name: "FlameBlade", tags: ["fire", "aoe", "offense", "buff"], prerequisite: "ApprenticeFire", sfx: "FireSpell", school: "Elements", manacost: 3, components: [], level:1, type:"passive", events: [{type: "FlameBlade", trigger: "playerAttack"}]}, + {name: "Strength", tags: ["earth", "struggle", "buff", "utility", "offense"], prerequisite: "ApprenticeEarth", sfx: "FireSpell", school: "Elements", manacost: 1, components: [], level:1, type:"passive", events: [ + //{type: "ElementalEffect", power: 2, damage: "crush", trigger: "playerAttack"}, + {trigger: "beforePlayerAttack", type: "BoostDamage", prereq: "damageType", kind: "melee", power: 2}, + {trigger: "calcDisplayDamage", type: "BoostDamage", prereq: "damageType", kind: "melee", power: 2}, + {type: "ModifyStruggle", mult: 1.5, power: 0.2, StruggleType: "Struggle", trigger: "beforeStruggleCalc", msg: "KinkyDungeonSpellStrengthStruggle"}, + ]}, + {name: "Ignite", tags: ["fire", "aoe", "dot", "buff"], prerequisite: "ApprenticeFire", sfx: "FireSpell", school: "Elements", + manacost: 2, spellPointCost: 1, components: ["Legs"], mustTarget: true, noTargetEnemies: true, exceptionFactions: ["Player", "Rock"], level:1, type:"buff", + buffs: [ + {id: "Ignite", aura: "#ff8400", type: "SpellCastConstant", duration: 6, power: 10.0, player: true, enemies: true, spell: "Ignition", tags: ["offense"]}, + ], + onhit:"", time:6, power: 1.5, range: 2.9, size: 1, damage: ""}, + + {name: "Thunderstorm", tags: ["aoe", "utility", "offense", "electric"], prerequisite: "ApprenticeLightning", spellPointCost: 1, sfx: "Fwoosh", school: "Elements", manacost: 4, components: ["Verbal"], level:1, type:"inert", buffs: [ + Object.assign({}, KDConduction), + ], bulletSpin: 0.1, onhit:"", time:8, aoe: 1.5, power: 0, delay: 8, range: 4, size: 3, damage: ""}, // Creates a shroud. Enemies within are hard to hit with melee attacks. + {name: "StaticSphere", tags: ["electric", "metal", "summon", "aoe", "offense"], prerequisite: "Thunderstorm", sfx: "MagicSlash", school: "Elements", manacost: 8, + upcastFrom: "Thunderstorm", upcastLevel: 2, + components: ["Verbal"], noTargetEnemies: true, noTargetPlayer: true, level:1, type:"hit", noSprite: true, onhit:"summon", + summon: [{name: "StaticSphere", count: 1, time: 12, bound: true}], power: 1.5, time: 12, delay: -1, range: 6, size: 1, aoe: 0, lifetime: 1, damage: "inert"}, + + {name: "LightningRune", castCondition: "noStationaryBullet", tags: ["electric", "offense", "defense", "utility", "trap", "trapReducible"], prerequisite: "ApprenticeLightning", noise: 0, sfx: "Fwoosh", school: "Elements", spellPointCost: 1, manacost: 2, + components: ["Legs"], noTargetPlayer: true, CastInWalls: false, level:1, type:"inert", + onhit:"aoe", time: 5, delay: 3, power: 4.5, range: 2.99, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "LightningRuneStrike", target: "onhit", directional:false, offset: false}, channel: 2}, + {name: "FlameRune", castCondition: "noStationaryBullet", tags: ["fire", "offense", "defense", "trap", "trapReducible"], prerequisite: "ApprenticeFire", noise: 0, sfx: "Fwoosh", school: "Elements", spellPointCost: 1, manacost: 2, + components: ["Legs"], noTargetPlayer: true, CastInWalls: false, level:1, type:"inert", + onhit:"aoe", delay: 3, power: 5.5, range: 2.99, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "FlameRuneStrike", target: "onhit", directional:false, offset: false}, channel: 2}, + {name: "FreezeRune", castCondition: "noStationaryBullet", tags: ["ice", "offense", "defense", "utility", "trap", "trapReducible"], prerequisite: "ApprenticeIce", noise: 0, sfx: "Fwoosh", school: "Elements", spellPointCost: 1, manacost: 5, + components: ["Legs"], noTargetPlayer: true, CastInWalls: false, level:1, type:"inert", + onhit:"aoe", time: 30, delay: 3, power: 3, range: 2.99, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "FreezeRuneStrike", target: "onhit", directional:false, offset: false}, channel: 2}, + + {name: "WaterBall", color: "#4f7db8", tags: ["water", "soap", "bolt", "offense", "utility"], prerequisite: "ApprenticeWater", sfx: "FireSpell", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"buff", + power: 3.5, delay: 0, range: 50, damage: "soap", speed: 3, playerEffect: {name: "Drench"}, + buffs: [ + Object.assign({}, KDDrenched), + Object.assign({}, KDDrenched2), + Object.assign({}, KDDrenched3), + ], + effectTileDurationMod: 40, effectTile: { + name: "Water", + duration: 40, + }, + }, + {name: "TidalBall", color: "#4f7db8", tags: ["water", "soap", "bolt", "offense", "utility"], prerequisite: "WaterBall", sfx: "FireSpell", school: "Elements", manacost: 6, components: ["Arms"], level:1, type:"bolt", size: 3, aoe: 1.5, projectileTargeting:true, onhit:"", power: 3.5, pierceEnemies: true, delay: 0, range: 50, damage: "soap", speed: 1, + upcastFrom: "WaterBall", upcastLevel: 1, bulletAoE: 1.5, + effectTileDurationModTrail: 100, effectTileTrailAoE: 1.5, noTrailOnPlayer: true, effectTileTrail: { + name: "Water", + duration: 40, + }}, + + // Passive spells + {name: "Shatter", tags: ["ice", "aoe", "offense"], prerequisite: "ApprenticeIce", school: "Elements", manacost: 1, components: [], power: 1.5, time: 4, level:1, type:"passive", events: [ + {type: "Shatter", trigger: "enemyStatusEnd"}, + {type: "Shatter", trigger: "beforePlayerAttack"}, + {type: "Shatter", trigger: "kill"}, + ]}, + + ], + "Conjure": [ + {goToPage: 5, name: "ApprenticeRope", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["RopeBoltLaunch"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 5, name: "ApprenticeMetal", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["SummonCuffs"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 5, name: "ApprenticeLeather", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["SummonGag"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 5, name: "ApprenticeSummon", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["Ally"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 5, name: "ApprenticeLatex", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["SlimeBall"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 5, name: "ApprenticePhysics", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["Wall"], hideLearned: true, hideUnlearnable: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 5, name: "FloatingWeapon", increasingCost: true, tags: ["magic"], autoLearn: ["RecoverObject"], + hideUnlearnable: true, school: "Conjure", manacost: 0, + mixedPassive: true, + spellPointCost: 1, components: [], level:1, type:"passive", onhit:"", + time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + + events: [ + //{type: "FloatingWeapon", trigger: "playerAttack"}, + {type: "HandsFree", trigger: "getWeapon", delayedOrder: 3}, + {type: "FloatingWeapon", trigger: "calcDamage2", delayedOrder: 3}, + {type: "FloatingWeapon", trigger: "draw"}, + ] + }, + + {name: "Psychokinesis", tags: ["telekinesis", "defense", "utility"], prerequisite: "FloatingWeapon", school: "Conjure", + spellPointCost: 2, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Psychokinesis", trigger: "calcComp", requiredTag: "telekinesis"}, + {type: "Psychokinesis", trigger: "calcCompPartial", requiredTag: "telekinesis"}, + {type: "Psychokinesis", trigger: "afterPlayerCast", requiredTag: "telekinesis", mult: 2}, + + ]}, + + {name: "KineticMastery", tags: ["telekinesis", "defense", "utility"], prerequisite: "TelekineticSlash", school: "Conjure", + learnFlags: ["KineticMastery"], + spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, + lifetime: 0, power: 0, damage: "inert", events: [ + {type: "KineticMastery", trigger: "beforeMultMana", requiredTag: "kinetic", mult: 0.7}, + ]}, + + + {name: "RecoverObject", prerequisite: "FloatingWeapon", tags: ["telekinesis", "utility"], sfx: "Teleport", school: "Conjure", manacost: 4.0, components: ["Arms"], level:1, + type:"special", special: "RecoverObject", + onhit:"", time:0, power: 1.0, range: 4.99, size: 1, damage: "glue"}, + + {name: "RecoverObject2", prerequisite: "RecoverObject", tags: ["telekinesis", "utility"], sfx: "Teleport", school: "Conjure", manacost: 8.0, components: ["Arms"], level:1, + upcastFrom: "RecoverObject", upcastLevel: 1, + type:"special", special: "RecoverObject", + onhit:"", time:0, power: 1.0, range: 7.99, aoe: 2.5, size: 1, damage: "glue"}, + + {name: "TelekineticSlash", castCondition: "FloatingWeapon", prerequisite: "FloatingWeapon", tags: ["telekinesis", "kinetic", "offense"], sfx: "FireSpell", school: "Conjure", + manacost: 5.0, components: ["Verbal"], level:1, + type:"special", special: "TelekineticSlash", aoetype: "slash", aoe: 1, + events: [ + {trigger: "calcMana", type: "HeavyKinetic", power: 1.0}, + ], + onhit:"", time:0, power: 1.0, range: 2.5, size: 1, damage: "crush"}, + + {name: "KineticLance", castCondition: "FloatingWeapon", prerequisite: "TelekineticSlash", tags: ["telekinesis", "kinetic", "offense"], sfx: "Lightning", school: "Conjure", + noise: 6, + manacost: 6, components: ["Verbal"], level:1, type:"bolt", pierceEnemies: true, projectileTargeting:true, onhit:"", power: 0.0, delay: 0, time: 1, range: 6, speed: 7, size: 3, damage: "crush", + events: [ + {trigger: "bulletHitEnemy", type: "KineticLance", mult: 1.6, power: 3.0}, + {trigger: "bulletDestroy", type: "KineticLance"}, + {trigger: "calcMana", type: "HeavyKinetic", power: 1.5}, + ], + }, + + {name: "Sagitta", castCondition: "FloatingWeapon", prerequisite: "TelekineticSlash", tags: ["telekinesis", "kinetic", "offense", "sagitta"], sfx: "FireSpell", school: "Conjure", + meleeOrigin: true, noTargetPlayer: true, noEnemyCollision: true, CastInWalls: true, lifetime: 1, + events: [ + {trigger: "calcMana", type: "HeavyKinetic", power: 0.5}, + ], + manacost: 1.5, components: ["Legs"], level:1, type:"hit", projectileTargeting:true, onhit:"aoe", power: 0.0, delay: 0, time: 1, range: 4.99, speed: 5, size: 1, damage: "pierce", + spellcast: {spell: "SagittaBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "SagittaAssault", aimAtTarget: true, noTargetMoveDir: true, offset: false}, + + }, + {name: "SagittaAssault", prerequisite: "Sagitta", tags: ["buff", "offense", "telekinesis"], sfx: "MagicSlash", school: "Conjure", manacost: 0, components: [], level:1, passive: true, type:"", + events: [{type: "SagittaAssault", trigger: "playerCast", power: 3}]}, + + {name: "CommandWordGreater", tags: ["command", "binding", "utility", "defense"], sfx: "Magic", + school: "Conjure", manacost: 14, components: ["Verbal"], level:1, type:"special", special: "CommandWord", noMiscast: true, + prerequisite: "CommandWord", + onhit:"", time:100, power: 10, aoe: 0.5, range: 4.5, size: 1, damage: ""}, + + {name: "Bomb", color: "#ff5277", prerequisite: "ApprenticeSummon", tags: ["aoe", "offense"], noise: 5, sfx: "FireSpell", school: "Conjure", manacost: 5, components: ["Verbal"], level:1, + aoetype: "crossCrack", + hitevents: [ + {trigger: "afterBulletHit", type: "Crack"}, + ], + block: 1.5, noTerrainHit: true, volatilehit: true, blockType: [...KDIgnitionSources], + effectTileDurationMod: 7, hitSpin: 0.2, effectTile: { + name: "Smoke", + duration: -1, + }, type:"inert", onhit:"lingering", time: 3, delay: 5, power: 10, range: 3, size: 3, aoe: 2, lifetime: 1, damage: "stun", playerEffect: {name: "Damage"},}, + + {name: "FeatherCloud", color: "#ffffff", prerequisite: "TickleCloud", tags: ["tickle", "aoe", "dot", "offense", "utility", "denial"], noUniqueHits: true, noise: 1, landsfx: "Tickle", hitsfx: "Tickle", school: "Elements", manacost: 4, + components: ["Arms"], hitSpin: 0.7, bulletSpin: 0.4, level:1, type:"inert", onhit:"aoe", delay: 1, power: 2.0, distract: 6.0, range: 2.5, size: 3, aoe: 1, pierceEnemies: true, + lifetime: 3, damage: "tickle", playerEffect: {name: "Damage"}, + }, + {name: "TickleCloud", color: "#ffffff", prerequisite: "ApprenticeSummon", tags: ["tickle", "aoe", "dot", "offense", "utility", "denial"], piercing: true, noUniqueHits: true, noise: 1, landsfx: "Tickle", hitsfx: "Tickle", school: "Elements", manacost: 2, + components: ["Arms"], hitSpin: 1, bulletSpin: 0.4, level:1, type:"dot", onhit:"aoe", delay: 9, power: 0.5, range: 3.99, size: 1, aoe: 0.5, lifetime: 1, damage: "tickle", playerEffect: {name: "Damage"}, + },//, distractEff: 2.0 + {name: "Snare", color: "#ff8899", castCondition: "noStationaryBullet", tags: ["rope", "binding", "denial", "utility", "offense", "trap", "trapReducible"], + prerequisite: "ApprenticeRope", noise: 0, sfx: "Fwoosh", school: "Conjure", spellPointCost: 1, manacost: 2, + components: ["Legs"], noTargetPlayer: true, CastInWalls: false, level:1, type:"inert", + onhit:"aoe", delay: 3, power: 5.5, range: 2.99, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "RopeRuneStrike", target: "onhit", directional:false, offset: false}, channel: 2}, + + {name: "LeatherBurst", prerequisite: "ApprenticeLeather", tags: ["buff", "offense", "binding", "leather"], sfx: "MagicSlash", school: "Conjure", manacost: 0, components: [], level:1, passive: true, type:"", + events: [{type: "LeatherBurst", trigger: "playerCast", power: 3}]}, + + {name: "SummonGag", prerequisite: "ApprenticeLeather", tags: ["leather", "bolt", "binding", "burst", "gag", "utility", "offense"], components: ["Arms"], noise: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 1.5, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 2, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "GagBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {name: "SummonAMGag", prerequisite: "SummonGag", tags: ["leather", "bolt", "binding", "burst", "gag", "utility", "offense"], components: ["Arms"], noise: 1, + upcastFrom: "SummonGag", upcastLevel: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 5, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "AMGagBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {name: "SummonArmbinder", prerequisite: "SummonLeatherCuffs", tags: ["leather", "bolt", "binding", "burst", "armbinder", "utility", "offense"], components: ["Arms"], noise: 1, + upcastFrom: "SummonLeatherCuffs", upcastLevel: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 5, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "ArmbinderBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {name: "SummonLegbinder", prerequisite: "SummonLeatherCuffs", tags: ["leather", "bolt", "binding", "burst", "legbinder", "utility", "offense"], components: ["Arms"], noise: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 4, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "LegbinderBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + + {name: "SummonLatexGag", prerequisite: "SlimeToLatex", tags: ["latex", "bolt", "binding", "burst", "gag", "utility", "offense"], components: ["Arms"], noise: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 1.5, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 2, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "LatexGagBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "RubberBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {name: "SummonLatexArmbinder", prerequisite: "SlimeToLatex", tags: ["latex", "bolt", "binding", "burst", "armbinder", "utility", "offense"], components: ["Arms"], noise: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 5, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "LatexArmbinderBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "RubberBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {name: "SummonLatexLegbinder", prerequisite: "SlimeToLatex", tags: ["latex", "bolt", "binding", "burst", "legbinder", "utility", "offense"], components: ["Arms"], noise: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 4, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "LatexLegbinderBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "RubberBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + + {name: "SummonBlindfold", prerequisite: "ApprenticeLeather", tags: ["leather", "bolt", "binding", "burst", "blindfold", "utility", "offense"], components: ["Arms"], noise: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 1.5, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 2, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "BlindfoldBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {name: "SummonLeatherCuffs", prerequisite: "ApprenticeLeather", tags: ["leather", "bolt", "binding", "burst", "cuffs", "utility", "offense"], components: ["Arms"], noise: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 2.5, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 1, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "LeatherCuffsBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {name: "SummonCuffs", prerequisite: "ApprenticeMetal", tags: ["metal", "bolt", "binding", "burst", "cuffs", "utility", "offense"], components: ["Arms"], noise: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 2, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 3, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "CuffsBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {name: "SummonHarness", prerequisite: "ApprenticeLeather", tags: ["leather", "bolt", "binding", "burst", "harness", "utility", "offense"], components: ["Arms"], noise: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 3, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 5, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "HarnessBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {name: "SummonStraitjacket", prerequisite: "SummonLeatherCuffs", tags: ["leather", "bolt", "binding", "burst", "straitjacket", "utility", "offense"], components: ["Arms"], noise: 1, + upcastFrom: "SummonLeatherCuffs", upcastLevel: 2, + sfx: "MagicSlash", school: "Conjure", manacost: 7, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 12, range: 6, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "StraitjacketBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "LeatherBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + + + {name: "Petsuit", prerequisite: "SummonHarness", tags: ["leather", "summon", "utility", "petsuit"], sfx: "Magic", school: "Conjure", manacost: 1, components: [], level:1, + type:"special", special: "Petsuit", + onhit:"", time:0, power: 0.0, range: 2.99, size: 1, aoe: 0.5, damage: "glue"}, + + {name: "DisplayStand", prerequisite: "ApprenticeMetal", tags: ["metal", "summon", "utility", "petsuit"], sfx: "Magic", school: "Conjure", manacost: 1, components: [], level:1, + type:"special", special: "DisplayStand", + onhit:"", time:0, power: 0.0, range: 2.99, size: 1, aoe: 0.5, damage: "glue"}, + + {name: "RopeBoltLaunch", tags: ["rope", "bolt", "binding", "offense"], prerequisite: "ApprenticeRope", sfx: "MagicSlash", school: "Conjure", + manacost: 3, components: ["Verbal"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 1, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + spellcast: {spell: "RopeBolt", target: "target", directional:true, aimAtTarget: true, offset: false}}, + + {name: "RopeBoltLaunchMany", tags: ["rope", "bolt", "binding", "offense"], prerequisite: "RopeBoltLaunch", sfx: "MagicSlash", school: "Conjure", + upcastFrom: "RopeBoltLaunch", upcastLevel: 1, + manacost: 7, components: ["Verbal"], projectileTargeting: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 9, power: 1, range: 8, meleeOrigin: true, noDirectionOffset: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + followCaster: true, + spellcast: {spell: "RopeBoltLaunchSingle", target: "target", directional:true, aimAtTarget: true, offset: false}}, + {name: "EnchantRope", color: "#ffae70", tags: ["rope", "utility", "binding", "offense"], prerequisite: "ApprenticeRope", sfx: "Freeze", school: "Conjure", manacost: 5.5, components: ["Verbal"], + level:1, type:"hit", onhit:"instant", evadeable: false, noblock: true, power: 1.0, range: 2.99, size: 3, lifetime: 1, aoe: 1.5, damage: "arcane", + playerEffect: {name: "EnchantRope", power: 2}, + events: [ + {type: "EnchantRope", trigger: "bulletHitEnemy", mult: 1.0, power: 2}, + ]}, + {name: "RopeStrike", prerequisite: "RopeBoltLaunch", tags: ["rope", "binding", "aoe", "offense"], sfx: "MagicSlash", effectTileDurationMod: 10, effectTile: { + name: "Ropes", + duration: 20, + }, bulletSpin: 1, school: "Conjure", manacost: 3.5, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 1, power: 3, bind: 5, time: 6, range: 3.5, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", bindType: "Rope", playerEffect: {name: "MagicRope", time: 4, tags: ["ropeMagicWeak"], msg: "Rope"}}, + {name: "Slime", color: "#ff00ff", prerequisite: "SlimeSplash", tags: ["latex", "slime", "aoe", "offense"], landsfx: "MagicSlash", school: "Conjure", manacost: 4, components: ["Legs"], level:1, type:"inert", + upcastFrom: "SlimeSplash", upcastLevel: 1, + requireLOS: true, + effectTileDurationMod: 12, effectTile: { + name: "Slime", + duration: 8, + }, + bindTags: ["slimeRestraintsRandom"], + onhit:"lingering", time: 4, delay: 1, range: 3.5, size: 3, aoe: 1.5, lifetime: 3, power: 3.5, damage: "glue", playerEffect: {name: "SlimeTrap", time: 3}}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + {name: "SlimeSplash", color: "#ff00ff", prerequisite: "ApprenticeLatex", tags: ["latex", "slime", "aoe", "offense"], landsfx: "MagicSlash", school: "Conjure", + manacost: 1.4, components: ["Legs"], level:1, type:"inert", + requireLOS: true, + effectTileDurationMod: 4, effectTile: { + name: "Slime", + duration: 6, + }, + bindTags: ["slimeRestraintsRandom"], + onhit:"lingering", time: 0, delay: 1, range: 2.5, size: 1, aoe: 1.01, lifetime: 1, power: 1, damage: "glue", playerEffect: {name: "SlimeTrap", time: 3}}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + {name: "SlimeEruption", color: "#ff00ff", prerequisite: "Slime", tags: ["latex", "slime", "aoe", "denial", "offense"], landsfx: "MagicSlash", school: "Conjure", manacost: 7, components: ["Legs"], level:1, type:"inert", + upcastFrom: "SlimeSplash", upcastLevel: 2, + requireLOS: true, + effectTileDurationMod: 16, effectTile: { + name: "Slime", + duration: 8, + }, + bindTags: ["slimeRestraintsRandom"], + onhit:"lingering", time: 4, delay: 1, range: 4, size: 3, aoe: 2.99, lifetime: 8, power: 4, lifetimeHitBonus: 4, damage: "glue", playerEffect: {name: "SlimeTrap", time: 3}}, + //{name: "PinkGas", manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"lingering", time: 1, delay: 2, range: 4, size: 3, aoe: 2.5, lifetime: 9999, damage: "stun", playerEffect: {name: "PinkGas", time: 3}}, // Dizzying gas, increases distraction + {name: "ChainBolt", color: "#ffffff", prerequisite: "ApprenticeMetal", tags: ["metal", "binding", "bolt", "offense"], noise: 5, + sfx: "FireSpell", school: "Conjure", manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 0, power: 2.5, delay: 0, range: 50, damage: "chain", speed: 3, bindType: "Metal", + playerEffect: {name: "SingleChain", time: 1}, effectTileDurationMod: 10, effectTile: { + name: "Chains", + duration: 20, + }, + events: [ + {type: "ElementalIfHalfBound", trigger: "bulletHitEnemy", damage: "crush", power: 5.0, time: 4}, + ] + + }, + {name: "SlimeBall", color: "#ff00ff", prerequisite: "ApprenticeLatex", tags: ["latex", "slime", "denial", "bolt", "offense"], noise: 1, sfx: "FireSpell", school: "Conjure", manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 3, power: 4, delay: 0, range: 50, damage: "glue", speed: 2, + trailPower: 2, trailLifetime: 10, trailTime: 3, + bindTags: ["slimeRestraintsRandom"], trailDamage:"glue", trail:"lingering", trailChance: 1.0, playerEffect: {name: "Slime", time: 3}, trailPlayerEffect: {name: "Slime", power: 1.0, time: 3}, + effectTileDurationModTrail: 4, effectTileTrail: { + name: "Slime", + duration: 4, + }}, // Throws a ball of slime which oozes more slime + + {name: "Swap", tags: ["physics", "utility", "offense"], prerequisite: "ApprenticePhysics", sfx: "Teleport", + school: "Conjure", manacost: 5.5, components: ["Arms"], level:1, type:"special", special: "Swap", noMiscast: true, + onhit:"", time:25, power: 2, range: 3.5, size: 1, damage: ""}, + {name: "Leap", prerequisite: "ApprenticePhysics", tags: ["physics", "utility", "defense"], sfx: "Teleport", school: "Conjure", spellPointCost: 1, autoLearn: ["Leap2", "Leap3"], + events: [ + {trigger: "afterBulletHit", type: "Phase"}, + ], + manacost: 1.5, components: ["Verbal"], requireLOS: true, noTargetEnemies: true, level:1, type:"hit", onhit:"teleport", delay: 0, lifetime:1, range: 1.5, damage: ""}, // A quick blink + {name: "Leap2", prerequisite: "Leap", tags: ["physics", "utility", "defense"], sfx: "Teleport", school: "Conjure", spellPointCost: 1, + upcastFrom: "Leap", upcastLevel: 1, + manacost: 3, components: ["Verbal"], requireLOS: true, noTargetEnemies: true, level:1, type:"hit", onhit:"teleport", delay: 0, lifetime:1, range: 2.5, damage: ""}, // A quick blink + {name: "Leap3", prerequisite: "Leap", tags: ["physics", "utility", "defense"], sfx: "Teleport", school: "Conjure", spellPointCost: 1, + upcastFrom: "Leap", upcastLevel: 2, + manacost: 4.5, components: ["Verbal"], requireLOS: true, noTargetEnemies: true, level:1, type:"hit", onhit:"teleport", delay: 0, lifetime:1, range: 3.9, damage: ""}, // A quick blink + + + + {name: "Blink", prerequisite: "ApprenticeSummon", tags: ["physics", "utility", "defense"], sfx: "Teleport", school: "Conjure", CastInDark: true, channel: 2, + events: [ + {trigger: "afterBulletHit", type: "FlashPortal"}, + {trigger: "bulletTick", type: "FlashPortal", dist: 1.5}, + ], + manacost: 4, components: ["Verbal"], level:1, type:"inert", power: 0.1, onhit:"teleport", delay: 2, lifetime:1, range: 5.99, damage: "arcane"}, // portal + + {name: "TransportationPortal", prerequisite: "Blink", tags: ["physics", "utility", "defense"], sfx: "Teleport", school: "Conjure", CastInDark: true, channel: 3, + upcastFrom: "Blink", upcastLevel: 1, + events: [ + {trigger: "afterBulletHit", type: "TransportationPortal"}, + {trigger: "bulletTick", type: "TransportationPortal", dist: 2.99}, + ], + manacost: 6, components: ["Verbal"], level:1, type:"inert", power: 0.1, onhit:"teleport", delay: 3, lifetime:1, range: 5.99, damage: "arcane"}, + + {name: "BanishPortal", prerequisite: "TransportationPortal", tags: ["physics", "utility", "defense"], sfx: "Teleport", school: "Conjure", CastInDark: true, channel: 3, + upcastFrom: "Blink", upcastLevel: 2, + events: [ + {trigger: "afterBulletHit", type: "BanishPortal"}, + {trigger: "bulletTick", type: "BanishPortal", dist: 2.99}, + ], + manacost: 10, components: ["Verbal"], level:1, type:"inert", power: 0.1, onhit:"", delay: 3, lifetime:1, range: 5.99, damage: "inert"}, + + {name: "Wall", prerequisite: "ApprenticePhysics", tags: ["summon", "utility", "defense", "physics"], + sfx: "MagicSlash", school: "Conjure", + type:"special", special: "Wall", + onhit:"", time:8, power: 0, range: 6, size: 1, damage: "", + manacost: 3, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, + piercing: true, level:1, noSprite: true,}, + {name: "Quickness", prerequisite: "ApprenticePhysics", tags: ["utility", "offense", "defense", "physics"], sfx: "Teleport", school: "Conjure", + manacost: 3, components: ["Legs"], defaultOff: true, level:1, type:"passive", onhit:"", time: 3, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "Quickness", trigger: "toggleSpell", power: 10.0, time: 3}, + ]}, + {name: "Quickness2", prerequisite: "ApprenticePhysics", tags: ["utility", "offense", "defense", "physics"], sfx: "Teleport", school: "Conjure", + manacost: 6.0, components: ["Legs"], defaultOff: true, level:1, type:"passive", onhit:"", time: 10, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "Quickness2", trigger: "toggleSpell", power: 2.0, time: 10, mult: 0.5}, + ]}, + {name: "Quickness3", prerequisite: "Quickness2", upcastFrom: "Quickness2", upcastLevel: 1, tags: ["utility", "offense", "defense", "physics"], sfx: "Teleport", school: "Conjure", + manacost: 10.0, components: ["Legs"], defaultOff: true, level:1, type:"passive", onhit:"", time: 10, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "Quickness2", trigger: "toggleSpell", power: 3.0, time: 10, mult: .75}, + ]}, + {name: "Quickness4", prerequisite: "Quickness3", upcastFrom: "Quickness2", upcastLevel: 2, tags: ["utility", "offense", "defense", "physics"], sfx: "Teleport", school: "Conjure", + manacost: 15.0, components: ["Legs"], defaultOff: true, level:1, type:"passive", onhit:"", time: 10, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "Quickness2", trigger: "toggleSpell", power: 4.0, time: 10, mult: 100}, + ]}, + {name: "Quickness5", prerequisite: "Quickness4", upcastFrom: "Quickness2", upcastLevel: 3, tags: ["utility", "offense", "defense", "physics"], sfx: "Teleport", school: "Conjure", + manacost: 20.0, components: ["Legs"], defaultOff: true, level:1, type:"passive", onhit:"", time: 10, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "Quickness2", trigger: "toggleSpell", power: 10.0, time: 1, mult: 100}, + ]}, + {name: "Ally", prerequisite: "ApprenticeSummon", tags: ["summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 8, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", onhit:"summon", noSprite: true, summon: [{name: "Ally", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 2.9, size: 1, aoe: 0.5, lifetime: 1, damage: "fire"}, + {name: "FireElemental", prerequisite: "ApprenticeSummon", tags: ["fire", "summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 12, components: ["Verbal"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "FireElemental", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 3.5, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, + {name: "WaterMote", prerequisite: "ApprenticeSummon", tags: ["water", "soap", "summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 12, components: ["Arms"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "WaterMote", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 3.5, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, + {name: "AirMote", prerequisite: "ApprenticeSummon", tags: ["air", "summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 12, components: ["Verbal"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "AirMote", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 3.5, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, + {name: "EarthMote", prerequisite: "ApprenticeSummon", tags: ["earth", "summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 12, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "EarthMote", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 3.5, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, + {name: "NatureSpirit", prerequisite: "Ally", tags: ["nature", "summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 18, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "NatureSpirit", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 3.5, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, + + {name: "Golem", prerequisite: "Ally", tags: ["summon", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 24, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:3, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "Golem", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 2.5, size: 1, aoe: 0.5, lifetime: 1, damage: "fire"}, + {name: "StormCrystal", prerequisite: "ApprenticeSummon", tags: ["summon", "denial", "offense"], noise: 7, sfx: "MagicSlash", school: "Conjure", manacost: 10, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "StormCrystal", count: 1, time: 9999, bound: true}], power: 0, time: 30, delay: -1, range: 2.5, size: 1, aoe: 0.5, lifetime: 1, damage: "fire"}, + {noAggro: true, tags: ["heal", "light"], name: "Heal", prerequisite: "ApprenticeLight", bulletSpin: 0.1, hitSpin: 0.4, noise: 3, sfx: "FireSpell", school: "Conjure", manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", delay: 1, power: 1.5, range: 4.5, size: 5, aoe: 2.9, lifetime: 4, time: 2, damage: "heal", channel: 4}, + {noAggro: true, tags: ["heal", "light"], buff: true, heal: true, name: "Heal2", prerequisite: "ApprenticeLight", sfx: "MagicSlash", school: "Conjure", manacost: 3, components: ["Verbal"], noTargetPlayer: true, mustTarget: true, level:1, type:"hit", + events: [ + {type: "Buff", trigger: "tick", power: 1.0, buffType: "blindResist"}, + ], + onhit:"heal", time:2, lifetime: 1, delay: 1, power: 4.5, aoe: 0.9, range: 7, size: 1, damage: "inert"}, + /*{name: "FloatingWeapon", prerequisite: "ApprenticePhysics", tags: ["buff", "offense", "physics"], sfx: "MagicSlash", school: "Conjure", manacost: 2, components: [], level:3, type:"passive", + events: [ + {type: "FloatingWeapon", trigger: "playerAttack"}, + {type: "HandsFree", trigger: "getWeapon"}, + {type: "HandsFree", trigger: "calcDamage"}, + {type: "ArmsFree", trigger: "calcDamage"}, + ]},*/ + {name: "Lockdown", prerequisite: "ApprenticeMetal", tags: ["metal", "lock", "binding", "utility", "command", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 4.5, components: ["Verbal"], mustTarget: true, level:1, + /*buffs: [ + {id: "Lockdown", aura: "#a96ef5", type: "Locked", duration: 8, power: 1.0, player: true, enemies: true, tags: ["lock", "debuff"]}, + {id: "Lockdown2", type: "MoveSpeed", duration: 8, power: -1.0, player: false, enemies: true, noAlly: true, tags: ["slow", "debuff"]}, + {id: "Lockdown3", type: "AttackSlow", duration: 8, power: 1.0, player: false, enemies: true, noAlly: true, tags: ["slow", "debuff"]}, + ], */ + type:"special", special: "Lockdown", + onhit:"", time:8, power: 0, range: 1.5, size: 1, damage: ""}, + {name: "Chastity", prerequisite: "Lockdown", tags: ["metal", "binding", "utility"], sfx: "MagicSlash", school: "Conjure", manacost: 3.5, components: ["Verbal"], mustTarget: true, level:1, + type:"special", special: "Chastity", + onhit:"", time:8, power: 3.5, range: 1.5, size: 1, damage: ""}, + {name: "ZoneOfPurity", color: "#e7cf1a", prerequisite: "Chastity", tags: ["metal", "binding", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 7, components: ["Verbal"], level:1, type:"inert", + onhit:"aoe", power: 0, delay: 40, range: 4.5, size: 3, lifetime: 1, aoe: 2.5, damage: "charm", + events: [{trigger: "bulletTick", type: "ZoneOfPurity", aoe: 2.5, power: 0.01}] + }, + {name: "ZoneOfExcitement", color: "#ff8888", prerequisite: "CommandVibrate", tags: ["binding", "utility"], sfx: "MagicSlash", school: "Conjure", manacost: 3.5, components: ["Verbal"], level:1, type:"inert", + onhit:"aoe", power: 0, delay: 30, range: 4.5, size: 3, lifetime: 1, aoe: 1.99, damage: "charm", + events: [{trigger: "bulletTick", type: "ZoneOfExcitement", aoe: 1.99, power: 0.5}] + }, + {name: "Frustration", tags: ["metal", "offense", "utility"], prerequisite: "Chastity", sfx: "FireSpell", school: "Conjure", manacost: 0, components: [], level:1, type:"passive", events: [ + {type: "Frustration", trigger: "tickAfter"} + ]}, + + + {name: "CommandCapture", prerequisite: "CommandDisenchant", tags: ["command", "binding", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 4.5, components: ["Verbal"], mustTarget: true, level:1, + type:"special", special: "CommandCapture", + onhit:"", time:0, power: 2.5, range: 3.5, bind: 5, size: 1, aoe: 1.5, damage: "chain"}, + {name: "CommandBind", prerequisite: "CommandDisenchant", tags: ["command", "binding", "offense", "aoe"], sfx: "MagicSlash", school: "Conjure", manacost: 4.5, components: ["Verbal"], level:1, + type:"special", special: "CommandBind", + onhit:"", time:0, power: 0, range: 2.5, size: 1, aoe: 2.5, damage: "inert"}, + {name: "CommandDisenchant", prerequisite: "CommandWord", tags: ["command", "offense", "aoe"], sfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Verbal"], level:1, + type:"special", special: "CommandDisenchant", + onhit:"", time:0, power: 3.0, range: 3.5, size: 1, aoe: 3.5, damage: "inert"}, + {name: "CommandVibrate", prerequisite: "CommandWord", tags: ["command", "offense", "aoe", "sexy"], sfx: "MagicSlash", school: "Conjure", manacost: 4.5, components: ["Verbal"], level:1, + type:"special", special: "CommandVibrate", + onhit:"", time:30, power: 5, range: 3.5, size: 1, aoe: 3.5, damage: "charm"}, + {name: "CommandOrgasm", prerequisite: "CommandVibrate", tags: ["command", "offense", "aoe", "sexy"], sfx: "MagicSlash", school: "Conjure", manacost: 4.5, components: ["Verbal"], level:1, + type:"special", special: "CommandOrgasm", + onhit:"", time:0, power: 5, range: 7, size: 1, aoe: 4.99, damage: "charm"}, + {name: "CommandRelease", prerequisite: "CommandDisenchant", tags: ["command", "binding", "defense"], sfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Verbal"], level:1, + type:"special", special: "CommandRelease", + onhit:"", time:0, power: 10.0, range: 2.5, size: 1, aoe: 1.5, damage: "inert"}, + KDCommandWord, + {name: "CommandRange", prerequisite: "CommandWordGreater", tags: ["command", "binding", "utility"], + sfx: "MagicSlash", school: "Conjure", manacost: 0, components: ["Verbal"], level:1, + type:"", passive: true, + events: [ + {trigger: "beforeCalcComp", type: "ReplaceVerbalIfFail", requiredTag: "truss"},// No delayedOrder since it has no cost + {trigger: "calcSpellRange", type: "AddRange", requiredTag: "command", power: 1}, + {trigger: "calcSpellRange", type: "AddRange", requiredTag: "truss", power: 2}, + ], + onhit:"", time:0, power: 10.0, range: 2.5, size: 1, aoe: 1.5, damage: "inert"}, + + {name: "NegateRune", prerequisite: "CommandDisenchant", tags: ["command", "offense", "aoe"], sfx: "MagicSlash", school: "Conjure", manacost: 0, components: ["Legs"], level:1, + type:"special", special: "NegateRune", + onhit:"", time:0, power: 3.0, range: 1.5, size: 1, aoe: 0.5, damage: "inert"}, + + {name: "CommandSlime", prerequisite: "ApprenticeLatex", tags: ["slime", "defense", "latex"], sfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Verbal"], level:1, + type:"special", special: "CommandSlime", + onhit:"", time:0, power: 9.9, range: 2.5, size: 1, aoe: 1.5, damage: "inert"}, + + {name: "SlimeWalk", tags: ["slime", "latex", "defense"], prerequisite: "ApprenticeLatex", school: "Conjure", spellPointCost: 2, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "Buff", trigger: "tick", power: 0.5, buffType: "glueDamageResist"}, + ]}, + + {name: "SlimeWall", tags: ["latex", "utility", "slime", "wall"], autoLearn: ["SlimeWallHoriz", "SlimeWallVert"], prerequisite: "ApprenticeLatex", hideLearned: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "SlimeWallVert", secret: true, spellPointCost: 0, color: "#ff00ff", hideUnlearnable: true, prerequisite: "SlimeWall", tags: ["latex", "slime", "defense", "aoe", "denial", "utility", "wall"], landsfx: "MagicSlash", school: "Conjure", manacost: 4, components: ["Legs"], level:1, type:"inert", + onhit:"lingering", aoetype: "vert", pierceEnemies: true, time: 2, delay: 2, range: 4, size: 3, aoe: 2.5, lifetime: 20, power: 0, lifetimeHitBonus: 4, damage: "glue", secondaryhit: "buffnoAoE", + hitColor: 0xff00ff, hitLight: 2.5, bulletColor: 0xff00ff, bulletLight: 3.5, + buffs: [KDSlimed]}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + {name: "SlimeWallHoriz", secret: true, spellPointCost: 0, color: "#ff00ff", hideUnlearnable: true, prerequisite: "SlimeWall", tags: ["latex", "slime", "defense", "aoe", "denial", "utility", "wall"], landsfx: "MagicSlash", school: "Conjure", manacost: 4, components: ["Legs"], level:1, type:"inert", + onhit:"lingering", aoetype: "horiz", pierceEnemies: true, time: 2, delay: 2, range: 4, size: 3, aoe: 2.5, lifetime: 20, power: 0, lifetimeHitBonus: 4, damage: "glue", secondaryhit: "buffnoAoE", + hitColor: 0xff00ff, hitLight: 2.5, bulletColor: 0xff00ff, bulletLight: 3.5, + buffs: [KDSlimed]}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + + {name: "LatexWall", tags: ["latex", "utility", "slime", "wall"], autoLearn: ["LatexWallVert", "LatexWallHoriz"], + prerequisite: "SlimeWall", hideLearned: true, school: "Conjure", manacost: 0, spellPointCost: 1, components: [], level:1, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {name: "LatexWallVert", secret: true, spellPointCost: 0, color: "#aa00ff", hideUnlearnable: true, prerequisite: "LatexWall", tags: ["latex", "slime", "defense", "aoe", "denial", "utility", "wall"], landsfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Legs"], level:1, type:"inert", + upcastFrom: "SlimeWallVert", upcastLevel: 1, + hitColor: 0xff00ff, hitLight: 2.5, bulletColor: 0xff00ff, bulletLight: 3.5, + onhit:"lingering", aoetype: "vert", pierceEnemies: true, time: 0, delay: 2, range: 4, size: 3, aoe: 2.5, lifetime: 20, power: 0, lifetimeHitBonus: 4, damage: "glue", secondaryhit: "buffnoAoE", + hitevents: [ + {trigger: "bulletHitEnemy", type: "LatexWall", power: 5, damage: "glue", time: 6}, + ], + buffs: [KDEncased]}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + {name: "LatexWallHoriz", secret: true, spellPointCost: 0, color: "#aa00ff", hideUnlearnable: true, prerequisite: "LatexWall", tags: ["latex", "slime", "defense", "aoe", "denial", "utility", "wall"], landsfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Legs"], level:1, type:"inert", + upcastFrom: "SlimeWallHoriz", upcastLevel: 1, + hitColor: 0xff00ff, hitLight: 2.5, bulletColor: 0xff00ff, bulletLight: 3.5, + onhit:"lingering", aoetype: "horiz", pierceEnemies: true, time: 0, delay: 2, range: 4, size: 3, aoe: 2.5, lifetime: 20, power: 0, lifetimeHitBonus: 4, damage: "glue", secondaryhit: "buffnoAoE", + hitevents: [ + {trigger: "bulletHitEnemy", type: "LatexWall", power: 5, damage: "glue", time: 6}, + ], + buffs: [KDEncased]}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + + {name: "Coalesce", prerequisite: "Spread", tags: ["latex", "slime", "aoe", "utility", "offense"], sfx: "MagicSlash", school: "Conjure", manacost: 4, components: ["Verbal"], level:1, + type:"special", special: "Coalesce", + requireLOS: true, + onhit:"", time:0, power: 0.5, range: 3.5, size: 1, aoe: 2.5, damage: "glue"}, + + {name: "ElasticGrip", prerequisite: "ApprenticeLatex", tags: ["latex", "utility"], sfx: "FireSpell", school: "Conjure", manacost: 2, components: ["Arms"], level:1, + type:"special", special: "ElasticGrip", + onhit:"", time:0, power: 1.0, range: 7.99, size: 1, damage: "glue"}, + + {name: "SlimeToLatex", prerequisite: "ApprenticeLatex", tags: ["latex", "aoe", "utility", "denial"], sfx: "MagicSlash", school: "Conjure", manacost: 9, components: ["Legs"], level:1, + type:"special", special: "SlimeToLatex", + onhit:"", time:0, power: 2, range: 3.0, size: 1, aoe: 1.5, damage: "glue"}, + + {name: "LiquidMetal", prerequisite: "ApprenticeMetal", tags: ["latex", "metal", "aoe", "utility", "denial"], sfx: "MagicSlash", school: "Conjure", manacost: 5, components: ["Legs"], level:1, + type:"special", special: "LiquidMetal", + onhit:"", time:0, power: 2, range: 3.0, size: 1, aoe: 1.5, damage: "glue"}, + + {name: "LiquidMetalBurst", color: "#aaaaaa", prerequisite: "ApprenticeMetal", tags: ["latex", "metal", "aoe", "offense"], landsfx: "FireSpell", school: "Conjure", manacost: 7, components: ["Legs"], level:1, type:"inert", + castCondition: "LiquidMetalBurst", + requireLOS: true, + effectTileDurationMod: 12, effectTile: { + name: "LiquidMetal", + duration: 24, + }, + onhit:"aoe", time: 4, delay: 3, lifetime: 1, evadeable: true, range: 6.99, size: 3, aoe: 1.5, power: 9, bindType: "Metal", bind: 80, damage: "crush", playerEffect: {name: "LiquidMetalEngulf", damage: "crush", power: 9}}, + + {name: "Engulf", tags: ["latex", "slime", "buff", "offense"], prerequisite: "ApprenticeLatex", sfx: "MagicSlash", school: "Conjure", manacost: 0.8, components: [], level:1, type:"passive", events: [ + {type: "ElementalEffect", power: 1, addBind: true, damage: "glue", bindType: "Slime", bindEff: 1.5, trigger: "playerAttack"}, + {type: "EffectTileAoE", aoe: 1.1, kind: "Slime", duration: 7, trigger: "playerAttack", cost: 0}, + ]}, + {name: "ChainStrike", tags: ["chain", "metal", "buff", "offense"], prerequisite: "ApprenticeMetal", sfx: "MagicSlash", school: "Conjure", manacost: 0.7, components: [], level:1, type:"passive", events: [ + {type: "ElementalEffect", power: 1, addBind: true, damage: "chain", bindType: "Metal", bindEff: 1.25, trigger: "playerAttack"}, + {type: "EffectTileAoE", aoe: 1.1, kind: "Chains", duration: 16, trigger: "playerAttack", cost: 0}, + ]}, + {name: "LeatherWhip", tags: ["leather", "buff", "offense"], prerequisite: "ApprenticeLeather", sfx: "MagicSlash", school: "Conjure", manacost: 0.6, components: [], level:1, type:"passive", events: [ + {type: "ElementalEffect", power: 1, addBind: true, damage: "pain", bindType: "Leather", bindEff: 2.5, trigger: "playerAttack"}, + {type: "EffectTileAoE", aoe: 1.1, kind: "Belts", duration: 12, trigger: "playerAttack", cost: 0}, + ]}, + {name: "Ropework", tags: ["rope", "buff", "offense"], prerequisite: "ApprenticeRope", sfx: "MagicSlash", school: "Conjure", manacost: 0.7, components: [], level:1, type:"passive", events: [ + {type: "ElementalEffect", power: 1, addBind: true, damage: "chain", bindType: "Rope", bindEff: 4, trigger: "playerAttack"}, + {type: "EffectTileAoE", aoe: 1.1, kind: "Ropes", duration: 12, trigger: "playerAttack", cost: 0}, + ]}, + + {name: "Awaken", prerequisite: "Spread", tags: ["slime", "latex", "binding", "offense", "aoe"], sfx: "MagicSlash", school: "Conjure", manacost: 2.0, components: ["Verbal"], level:1, + type:"special", special: "Awaken", + onhit:"", time:0, power: 0, range: 3.99, size: 1, aoe: 2.5, damage: "inert"}, + + {name: "Spread", prerequisite: "ApprenticeLatex", tags: ["slime", "latex", "utility",], sfx: "MagicSlash", school: "Conjure", manacost: 1.0, components: ["Verbal"], level:1, + type:"special", special: "Spread", + requireLOS: true, + onhit:"", time:0, power: 0, range: 3.99, size: 1, aoe: 2, damage: "inert"}, + + {name: "Animate", prerequisite: "Awaken", tags: ["slime", "latex", "summon"], sfx: "MagicSlash", school: "Conjure", manacost: 6, components: ["Verbal"], level:1, + type:"special", special: "Animate", upcastFrom: "Awaken", upcastLevel: 1, + onhit:"", time:0, power: 0, range: 3.99, size: 1, aoe: 1.5, damage: "inert"}, + + {name: "AnimateLarge", prerequisite: "Animate", tags: ["slime", "latex", "summon"], sfx: "MagicSlash", school: "Conjure", manacost: 10, components: ["Verbal"], level:1, + type:"special", special: "AnimateLarge", upcastFrom: "Awaken", upcastLevel: 2, + onhit:"", time:0, power: 0, range: 3.99, size: 1, aoe: 1.1, damage: "inert"}, + + {name: "AnimatePuppet", prerequisite: "Awaken", tags: ["slime", "latex", "summon"], sfx: "MagicSlash", school: "Conjure", manacost: 6, components: ["Verbal"], level:2, + type:"special", special: "AnimatePuppet", + onhit:"", time:0, power: 0, range: 3.99, size: 1, aoe: 2.5, damage: "inert"}, + + {name: "OneWithSlime", tags: ["slime", "latex", "utility"], prerequisite: "ApprenticeLatex", school: "Elements", spellPointCost: 3, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "OneWithSlime", trigger: "calcComp", requiredTag: "slime"}, + {type: "OneWithSlime", trigger: "calcCompPartial", requiredTag: "slime"}, + ]}, + + {name: "SlimeMimic", tags: ["slime", "latex", "utility"], prerequisite: "ApprenticeLatex", school: "Elements", spellPointCost: 1, manacost: 0, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", events: [ + {type: "SlimeMimic", trigger: "tick"}, + ]}, + + + {name: "SteelRainPlug", color: "#ffffff", tags: ["binding", "metal", "bolt", "offense"], prerequisite: "ApprenticeMetal", sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 2, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", time: 0, power: 2.0, delay: 0, range: 15, damage: "pierce", speed: 3, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "pierce", power: 2, tag: "plugSpell"}, + bulletColor: 0xffffff, bulletLight: 1, + tease: true, + events: [ + {type: "PlugEnemy", trigger: "bulletHitEnemy"}, + ] + }, + {name: "SteelRainBurst", tags: ["binding", "metal", "bolt", "offense"], prerequisite: "SteelRainPlug", sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 5, components: ["Arms"], level:1, + upcastFrom: "SteelRainPlug", upcastLevel: 1, + projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 5, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + shotgunCount: 4, shotgunDistance: 4, shotgunSpread: 1, shotgunSpeedBonus: 1, + spellcast: {spell: "SteelRainPlug", target: "target", directional:true, randomDirectionPartial: true, aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + + + ], + "Illusion": [ + {goToPage: 6, name: "ApprenticeShadow", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["Dagger"], hideLearned: true, hideUnlearnable: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 6, name: "ApprenticeLight", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["Flash"], hideLearned: true, hideUnlearnable: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 6, name: "ApprenticeMystery", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["Camo"], hideLearned: true, hideUnlearnable: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 6, name: "ApprenticeProjection", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["Decoy"], hideLearned: true, hideUnlearnable: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + {goToPage: 6, name: "ApprenticeKnowledge", increasingCost: true, tags: ["magic", "randomfree"], autoLearn: ["TrueSteel"], learnFlags: ["AdvTooltips"], hideLearned: true, hideUnlearnable: true, school: "Illusion", manacost: 0, spellPointCost: 1, components: [], level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert"}, + + {name: "Analyze", prerequisite: "ApprenticeKnowledge", tags: ["buff", "utility", "knowledge"], school: "Illusion", manacost: 2.5, defaultOff: true, cancelAutoMove: true, components: [], level:1, type:"passive", + events: [{type: "Analyze", trigger: "toggleSpell", power: 5, time: 20}, {type: "Analyze", trigger: "tick", power: 5, time: 20}]}, + + {name: "Light", prerequisite: "ApprenticeLight", tags: ["buff", "utility", "light"], school: "Illusion", manacost: 2, spellPointCost: 1, defaultOff: true, cancelAutoMove: true, time: 12, components: [], level:1, type:"passive", + events: [{type: "Light", trigger: "getLights", power: 12, time: 12}, {type: "Light", trigger: "toggleSpell", power: 12, time: 12}]}, + + + {name: "ShadowDance", prerequisite: "ApprenticeShadow", tags: ["shadow", "utility", "defense"], sfx: "MagicSlash", school: "Illusion", spellPointCost: 1, + castCondition: "ShadowDance", + manacost: 2.5, components: ["Legs"], requireLOS: true, noTargetEnemies: true, level:1, type:"hit", onhit:"teleport", delay: 0, lifetime:1, range: 4.99, damage: ""}, + + {name: "TheShadowWithin", tags: ["shadow", "utility"], school: "Illusion", manacost: 0, components: [], learnFlags: ["TheShadowWithin"], prerequisite: "ShadowDance", level:1, passive: true, type:"", onhit:"", time: 0, delay: 0, range: 0, lifetime: 0, power: 0, damage: "inert", + events: [ + {type: "TheShadowWithin", trigger: "calcMultMana", mult: 2}, + ], + }, + + + {name: "Dagger", prerequisite: "ApprenticeShadow", tags: ["bolt", "shadow", "offense"], sfx: "MagicSlash", school: "Illusion", manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, noDoubleHit: true, piercing: true, onhit:"", power: 2.5, time: 0, delay: 0, range: 6, damage: "cold", speed: 4, playerEffect: {name: "Damage"}}, // Throws a fireball in a direction that moves 1 square each turn + {name: "Flash", color: "#ffffff", prerequisite: "ApprenticeLight", tags: ["light", "utility", "aoe", "offense"], noise: 8, sfx: "FireSpell", + hitColor: 0xffffff, hitLight: 6, + hitevents: [ + {type: "BlindAll", trigger: "bulletHitEnemy", time: 8}, + ], + school: "Illusion", manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 0, delay: 1, power: 1, range: 2.5, size: 3, aoe: 1.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 4}}, + {name: "Ring", prerequisite: "ApprenticeLight", tags: ["aoe", "utility", "light"], + noise: 10, sfx: "MagicSlash", school: "Illusion", + manacost: 1, components: ["Arms"], level:1, type:"inert", onhit:"aoe", + time: 2, delay: 4, power: 1, range: 6.5, size: 3, aoe: 1.5, lifetime: 1, damage: "stun"}, + {name: "GreaterFlash", color: "#ffffff", tags: ["light", "utility", "aoe", "offense"], prerequisite: "Flash", spellPointCost: 1, + upcastFrom: "Flash", upcastLevel: 1, + hitColor: 0xffffff, hitLight: 8, + hitevents: [ + {type: "BlindAll", trigger: "bulletHitEnemy", time: 17}, + ], + noise: 10, sfx: "FireSpell", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 2, delay: 1, power: 1, range: 2.5, size: 3, aoe: 1.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 6}}, // Much greater AoE. Careful not to get caught! + {name: "FocusedFlash", color: "#ffffff", tags: ["light", "utility", "aoe", "offense"], prerequisite: "GreaterFlash", spellPointCost: 1, + upcastFrom: "Flash", upcastLevel: 2, + hitColor: 0xffffff, hitLight: 11, + hitevents: [ + {type: "BlindAll", trigger: "bulletHitEnemy", time: 31}, + ], + noise: 10, sfx: "FireSpell", school: "Illusion", manacost: 7, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 4, delay: 2, power: 1, range: 2.5, size: 5, aoe: 2.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 10}}, // Longer delay, but the stun lasts much longer. + {name: "Shroud", prerequisite: "ApprenticeShadow", tags: ["aoe", "buff", "utility", "shadow", "defense"], sfx: "Fwoosh", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", + noise: 3.5,// Attracts some enemies + buffs: [ + {id: "Shroud", type: "Evasion", power: 7.0, player: true, enemies: true, tags: ["darkness"], range: 1.5}, + {id: "Shroud2", aura: "#444488", type: "Sneak", power: 4.0, player: true, duration: 8, enemies: false, tags: ["darkness"], range: 1.5} + ], onhit:"", time:8, aoe: 1.5, power: 0, delay: 8, range: 4.5, size: 3, damage: "", + effectTileDurationModPre: 3, effectTilePre: { + name: "Smoke", + duration: 8, + }}, // Creates a shroud. Enemies within are hard to hit with melee attacks. + {name: "Invisibility", prerequisite: "ApprenticeMystery", tags: ["buff", "utility", "stealth", "defense"], sfx: "Invis", school: "Illusion", manacost: 6, components: ["Verbal"], mustTarget: true, level:1, type:"buff", + buffs: [ + {id: "Invisibility", aura: "#888888", type: "Sneak", duration: 12, power: 15.0, player: true, enemies: true, tags: ["invisibility"]}, + {id: "Invisibility2", type: "SlowDetection", duration: 12, power: 0.5, player: true, enemies: false, tags: ["invisibility"]}, + ], onhit:"", time:12, power: 0, range: 2, size: 1, damage: ""}, + {name: "GreaterInvisibility", prerequisite: "Invisibility", tags: ["buff", "utility", "stealth", "defense"], sfx: "Invis", school: "Illusion", manacost: 10, components: ["Verbal"], mustTarget: true, level:1, type:"buff", + upcastFrom: "Invisibility", upcastLevel: 1, + buffs: [ + {id: "Invisibility", aura: "#888888", type: "Sneak", duration: 15, power: 20.0, player: true, enemies: true, tags: ["invisibility"]}, + {id: "Invisibility2", type: "SlowDetection", duration: 15, power: 0.5, player: true, enemies: false, tags: ["invisibility"]}, + {id: "GreaterInvisibility", aura: "#a45fd7", type: "Invisible", duration: 15, power: 1.5, player: true, currentCount: -1, maxCount: 1, tags: ["invisibility", "attack", "cast"]} + ], onhit:"", time:15, power: 0, range: 2, size: 1, damage: ""}, + {name: "TrueSteel", prerequisite: "ApprenticeKnowledge", tags: ["offense", "stealth", "knowledge"], sfx: "MagicSlash", school: "Illusion", manacost: 2, components: ["Arms"], noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, noblock: true, time:1, power: 4, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "slash", + events: [{trigger: "beforeDamageEnemy", type: "MultiplyDamageStealth", power: 2.5, humanOnly: true}] + }, + {name: "Camo", prerequisite: "ApprenticeMystery", tags: ["buff", "utility", "stealth", "defense"], sfx: "MagicSlash", school: "Illusion", manacost: 3, components: ["Legs"], mustTarget: true, noTargetEnemies: true, level:1, type:"buff", + buffs: [ + {id: "Camo", aura: "#3b7d4f", type: "SlowDetection", duration: 50, power: 49.0, player: true, enemies: true, endSleep: true, currentCount: -1, maxCount: 1, tags: ["SlowDetection", "moveOpen", "attack", "cast"]} + ], onhit:"", time:50, power: 0, range: 2, size: 1, damage: ""}, + {name: "ShadowBlade", prerequisite: "ApprenticeShadow", tags: ["buff", "offense", "shadow"], sfx: "MagicSlash", school: "Illusion", manacost: 6, components: ["Arms"], mustTarget: true, level:1, type:"buff", + buffs: [ + {id: "ShadowBlade", aura: "#7022a0", type: "AttackDmg", duration: 50, power: 2.0, player: true, + enemies: true, maxCount: 5, tags: ["damage"]}], + onhit:"", time:50, power: 0, range: 2, size: 1, damage: ""}, + {name: "ShadowSlash", tags: ["aoe", "offense", "shadow"], prerequisite: "ShadowBlade", sfx: "Evil", school: "Illusion", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, piercing: true, noTerrainHit: true, noEnemyCollision: true, onhit:"aoe", power: 4, delay: 0, range: 1.5, aoe: 1.5, size: 3, lifetime:1, damage: "cold", speed: 1, time: 2, + hitevents: [ + {trigger: "bulletHitEnemy", type: "ShadowSlash"}, + ], + trailspawnaoe: 1.5, trailPower: 0, trailLifetime: 1, trailHit: "", trailDamage:"inert", trail:"lingering", trailChance: 0.4}, + {name: "Decoy", tags: ["summon", "utility", "stealth", "defense"], prerequisite: "ApprenticeProjection", sfx: "MagicSlash", school: "Illusion", manacost: 6, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "Decoy", count: 1, time: 20}], power: 0, time: 20, delay: -1, range: 4, size: 1, aoe: 0, lifetime: 1, damage: "fire"}, + + {name: "HolyOrb", prerequisite: "ApprenticeLight", tags: ["light", "summon", "defense"], sfx: "MagicSlash", school: "Illusion", manacost: 14, components: ["Legs"], noTargetEnemies: true, noTargetPlayer: true, piercing: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "HolyOrb", count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: -1, range: 3.5, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, + + {name: "ShadowWarrior", prerequisite: "ApprenticeShadow", tags: ["summon", "offense", "shadow", "dot"], sfx: "MagicSlash", school: "Illusion", manacost: 10, components: ["Verbal"], noTargetEnemies: true, noTargetPlayer: true, level:1, type:"hit", noSprite: true, onhit:"summon", summon: [{name: "ShadowWarrior", count: 1, time: 12}], power: 6, time: 12, delay: -1, range: 3.5, size: 1, aoe: 0, lifetime: 1, damage: "inert"}, + + {name: "Corona", color: "#ffffff", + bulletColor: 0xffff77, bulletLight: 5, + tags: ["light", "offense"], prerequisite: "Light", sfx: "MagicSlash", school: "Illusion", spellPointCost: 1, manacost: 7, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 12, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "CoronaBeam", target: "target", directional:true, offset: false}, channel: 2}, + {name: "TrueSight", prerequisite: "ApprenticeKnowledge", tags: ["buff", "utility", "knowledge"], school: "Illusion", manacost: 0.8, defaultOff: true, cancelAutoMove: true, components: [], level:1, type:"passive", events: [ + {type: "TrueSight", trigger: "vision"}, + {type: "TrueSight", trigger: "toggleSpell"}, + {type: "Blindness", trigger: "calcStats", power: -1}, + {type: "AccuracyBuff", trigger: "tick", power: 0.4}, + ]}, + {name: "EnemySense", prerequisite: "ApprenticeKnowledge", tags: ["buff", "utility", "knowledge", "sound"], school: "Illusion", manacost: 0, defaultOff: true, cancelAutoMove: true, components: [], level:1, type:"passive", + events: [ + {type: "Multiply", trigger: "calcHearing", mult: 3.0}, + {type: "Multiply", trigger: "calcVision", mult: 0.1}, + {type: "PassTime", trigger: "toggleSpell", time: 1} + ]}, + + {name: "Sonar", prerequisite: "ApprenticeKnowledge", tags: ["buff", "utility", "knowledge", "sound"], school: "Illusion", manacost: 2, defaultOff: true, cancelAutoMove: true, components: [], level:1, type:"passive", + events: [ + {type: "Sonar", trigger: "toggleSpell", dist: 8, power: 8, time: 1} + ],}, + {name: "Evasion", prerequisite: "ApprenticeMystery", tags: ["buff", "utility", "defense"], sfx: "Fwoosh", school: "Illusion", manacost: 5, components: ["Legs"], mustTarget: true, level:1, type:"buff", + buffs: [ + {id: "Evasion", type: "Evasion", labelcolor: "#a288b6", duration: 25, power: 3.0, player: true, enemies: true, maxCount: 5, tags: ["defense", "incomingHit"]}, + ], onhit:"", time:25, power: 0, range: 2, size: 1, damage: ""}, + + + {name: "ArrowFireSpell", prerequisite: "ApprenticeFire", tags: ["offense", "aoe", "arrow"], school: "Elements", manacost: 0, defaultOff: true, cancelAutoMove: true, components: [], level:1, type:"passive", + events: [ + {type: "ArrowFireSpell", trigger: "playerCast", tags: ["arrowreplace"], spell: "ArrowFire", power: 2, aoe: 1.5, time: 3, energyCost: .03, damage: "fire"}, + {type: "ExclusiveTag", trigger: "toggleSpell", tags: ["arrow"]} + ]}, + {name: "ArrowVineSpell", prerequisite: "ApprenticeWater", tags: ["offense", "binding", "utility", "arrow"], school: "Elements", manacost: 0, defaultOff: true, cancelAutoMove: true, components: [], level:1, type:"passive", + events: [ + {type: "ArrowVineSpell", trigger: "playerCast", tags: ["arrowreplace"], spell: "ArrowVine", bind: 5, time: 3, energyCost: .02, bindType: "Vine", damage: "chain"}, + {type: "ExclusiveTag", trigger: "toggleSpell", tags: ["arrow"]} + ]}, + ], +}; +/** + * Spells that are not in the base spell lists + */ +let KinkyDungeonSpellListEnemies: spell[] = [ + {name: "AwakenStrike", tags: ["offense", "latex", "slime", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, noblock: true, power: 2.5, time: 5, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "glue", + playerEffect: {name: "Bind", damage: "glue", power: 3, tag: "slimeRestraints"}, + events: [ + {trigger: "bulletHitEnemy", type: "EncaseBound"}, + ], + }, + + {name: "CommandVibrateVibeRemote", prerequisite: "CommandWord", tags: ["command", "offense", "aoe", "sexy"], sfx: "MagicSlash", school: "Conjure", manacost: 0, components: ["Verbal"], level:2, + type:"special", special: "CommandVibrateLV2", + onhit:"", time:30, power: 5, range: 3.5, size: 1, aoe: 3.5, damage: "charm"}, + {name: "CommandVibrateBagOfGoodies", prerequisite: "CommandWord", tags: ["command", "offense", "aoe", "sexy"], sfx: "MagicSlash", school: "Conjure", manacost: 0, components: ["Verbal"], level:1, + chargecost: 0.015, + type:"special", special: "CommandVibrate", + onhit:"", time:15, power: 5, range: 3.5, size: 1, aoe: 2.5, damage: "charm"}, + + + /** The following are particle effects */ + {name: "OrgasmStrike", tags: ["offense", "nature", "binding"], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, noblock: true, power: 0, time: 10, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "inert", + }, + {name: "EffectEnemyCM1", tags: [], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, noblock: true, power: 0, time: 10, range: 1.5, size: 3, lifetime: 1, aoe: 0.5, damage: "inert", + }, + {name: "EffectEnemyCM2", tags: [], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, noblock: true, power: 0, time: 10, range: 1.5, size: 3, lifetime: 1, aoe: 0.5, damage: "inert", + }, + {name: "EffectEnemyCM3", tags: [], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, noblock: true, power: 0, time: 10, range: 1.5, size: 3, lifetime: 1, aoe: 0.5, damage: "inert", + }, + {name: "EffectEnemyLock1", tags: [], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, noblock: true, power: 0, time: 10, range: 1.5, size: 3, lifetime: 1, aoe: 0.5, damage: "inert", + }, + {name: "EnemyMiscast", tags: [], sfx: "FireSpell", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: false, noblock: true, power: 0, time: 10, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "inert", + }, + {name: "Summon", faction: "Enemy", school: "Any", manacost: 0, components: [], level:1, type:"hit", onhit:"instant", time:0, power: 0, delay: 0, range: 4, size: 1, lifetime: 1, damage: "inert"}, + {name: "BladeDanceBullet", bulletSpin: 0.5, school: "Any", manacost: 0, components: [], level:1, type:"hit", onhit:"instant", time:0, power: 0, delay: 0, range: 4, size: 3, lifetime: 1, damage: "inert"}, + {name: "DistractionBurstBullet", bulletSpin: 0.5, school: "Any", manacost: 0, components: [], level:1, type:"hit", onhit:"instant", time:0, power: 0, delay: 0, range: 4, size: 1, lifetime: 1, damage: "inert"}, + + /** End particle effects */ + + {name: "BindRope", tags: ["offense", "rope", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: true, noblock: true, power: 3.0, time: 5, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "chain", + playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "ropeRestraints"}, + }, + {name: "BindFabric", tags: ["offense", "fabric", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: true, noblock: true, power: 3.0, time: 5, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "glue", + playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "ribbonRestraints"}, + }, + {name: "BindVine", tags: ["offense", "nature", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: true, noblock: true, power: 3.0, time: 10, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "crush", + playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "vineRestraints"}, + }, + {name: "BindWrapping", tags: ["offense", "fabric", "wrapping", "binding"], sfx: "HexOrbMinor", school: "Conjure", manacost: 0.5, components: ["Verbal"], bind: 3.0, + bindType: "Wrapping", + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: true, noblock: true, power: 2.0, time: 10, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "crush", + playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "mummyRestraints"}, + }, + {name: "BindChain", tags: ["offense", "metal", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: true, noblock: true, power: 3.0, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "crush", + events: [{trigger: "bulletHitEnemy", type: "DisarmHumanoid", time: 8}], + playerEffect: {name: "Bind", damage: "crush", power: 2, tag: "chainRestraints"}, + }, + {name: "BindBelt", tags: ["offense", "leather", "binding"], sfx: "MagicSlash", school: "Conjure", manacost: 0.5, components: ["Verbal"], + noTargetPlayer: true, mustTarget: true, level:1, type:"hit", onhit:"instant", evadeable: true, noblock: true, power: 0, bind: 4.0, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "chain", + events: [{type: "MakeVulnerable", trigger: "beforeDamageEnemy", time: 3,},], + playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "leatherRestraints"}, + }, + + + {name: "SagittaBolt", castCondition: "FloatingWeapon", prerequisite: "TelekineticSlash", tags: ["telekinesis", "offense"], sfx: "Lightning", school: "Conjure", + manacost: 1.5, components: ["Legs"], level:1, type:"bolt", slowStart: true, projectileTargeting:true, onhit:"", power: 0.0, delay: 0, time: 1, range: 4.99, speed: 5, size: 1, damage: "pierce", + bulletLifetime: 5, + events: [ + {trigger: "bulletHitEnemy", type: "Sagitta", mult: 0.4, power: 1}, + ], + }, + + {name: "GagBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 3, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", time: 0, power: 2.0, delay: 0, range: 15, damage: "chain", speed: 5, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "gagSpell"}, + events: [ + {type: "ElementalIfNotSilenced", trigger: "bulletHitEnemy", damage: "chain", power: 0, bind: 4}, + {type: "SilenceHumanoid", trigger: "bulletHitEnemy", time: 8}, + ], effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { + name: "Belts", + duration: 20, + }, + }, + {name: "AMGagBolt", tags: ["binding", "leather", "bolt", "offense", "antimagic"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 3, components: ["Arms"], level:1, type:"bolt", + bindType: "Magic", + tease: true, + projectileTargeting:true, onhit:"", time: 0, power: 5, delay: 0, range: 15, damage: "arcane", speed: 5, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "arcane", power: 2, tags: ["gagSpell", "antiMagic", "forceAntiMagic"]}, + events: [ + {type: "SilenceHumanoid", trigger: "bulletHitEnemy", time: 15}, + ], effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { + name: "Belts", + duration: 20, + }, + }, + {name: "ArmbinderBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 3, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", time: 0, power: 5.0, delay: 0, range: 15, noblock: true, damage: "chain", speed: 2, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "armbinderSpell"}, + events: [ + {type: "RemoveBlock", trigger: "bulletHitEnemy", power: 2}, + {type: "DisarmHumanoid", trigger: "bulletHitEnemy", time: 14}, + {type: "SilenceHumanoid", trigger: "bulletHitEnemy", time: 14, prereq: "silenced"}, + {type: "BlindHumanoid", trigger: "bulletHitEnemy", time: 14, prereq: "blinded"}, + ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "Belts", + duration: 20, + }, + }, + {name: "LegbinderBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 6, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", time: 11, power: 4.0, delay: 0, range: 15, damage: "chain", noblock: true, speed: 3, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 4, tag: "legbinderSpell"}, + events: [ + {type: "ElementalIfNotSnared", trigger: "bulletHitEnemy", damage: "chain", power: 0, bind: 5}, + ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "Belts", + duration: 20, + }, + }, + + + {name: "LatexGagBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 3, components: ["Arms"], level:1, type:"bolt", + bindType: "Latex", + projectileTargeting:true, onhit:"", time: 0, power: 2.0, delay: 0, range: 15, damage: "glue", speed: 5, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "glue", power: 2, tag: "latexgagSpell"}, + events: [ + {type: "ElementalIfNotSilenced", trigger: "bulletHitEnemy", damage: "glue", power: 0, bind: 4}, + {type: "SilenceHumanoid", trigger: "bulletHitEnemy", time: 15}, + ], effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { + name: "LatexThinBlue", + duration: 20, + }, + }, + {name: "LatexArmbinderBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 3, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", time: 0, power: 5.0, delay: 0, range: 15, noblock: true, damage: "glue", speed: 2, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "glue", power: 2, tag: "latexarmbinderSpell"}, + events: [ + {type: "RemoveBlock", trigger: "bulletHitEnemy", power: 2}, + {type: "DisarmHumanoid", trigger: "bulletHitEnemy", time: 14}, + {type: "SilenceHumanoid", trigger: "bulletHitEnemy", time: 14, prereq: "silenced"}, + {type: "BlindHumanoid", trigger: "bulletHitEnemy", time: 14, prereq: "blinded"}, + ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "LatexThinBlue", + duration: 20, + }, + }, + {name: "LatexLegbinderBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 6, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", time: 11, power: 4.0, delay: 0, range: 15, damage: "glue", noblock: true, speed: 3, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "glue", power: 4, tag: "latexlegbinderSpell"}, + events: [ + {type: "ElementalIfNotSnared", trigger: "bulletHitEnemy", damage: "glue", power: 0, bind: 5}, + ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "LatexThinBlue", + duration: 20, + }, + }, + {enemySpell: true, name: "EnemyEnchantRope", castCondition: "EnemyEnchantRope", color: "#ff5277", tags: ["rope", "utility", "binding", "offense"], prerequisite: "ApprenticeRope", sfx: "Freeze", school: "Conjure", manacost: 5.5, components: ["Verbal"], + level:1, type:"inert", onhit:"aoe", evadeable: false, noblock: true, power: 1.0, range: 2.99, size: 3, lifetime: 1, aoe: 1.5, damage: "arcane", delay: 1, + playerEffect: {name: "EnchantRope", power: 1}, + events: [ + {type: "EnchantRope", trigger: "bulletHitEnemy", mult: 0.5, power: 1}, + ]}, + + {enemySpell: true, name: "EnemyEnchantRope2", castCondition: "EnemyEnchantRope2", color: "#92e8c0", tags: ["rope", "utility", "binding", "offense"], prerequisite: "ApprenticeRope", sfx: "Freeze", school: "Conjure", manacost: 5.5, components: ["Verbal"], + level:1, type:"inert", onhit:"aoe", evadeable: false, noblock: true, power: 1.0, range: 2.99, size: 3, lifetime: 1, aoe: 1.5, damage: "arcane", delay: 1, + playerEffect: {name: "EnchantRope", power: 3}, + events: [ + {type: "EnchantRope", trigger: "bulletHitEnemy", mult: 1.0, power: 3}, + ]}, + + {enemySpell: true, name: "EnemyEnchantRope3", castCondition: "EnemyEnchantRope3", color: "#92e8c0", tags: ["rope", "utility", "binding", "offense"], prerequisite: "ApprenticeRope", sfx: "Freeze", school: "Conjure", manacost: 5.5, components: ["Verbal"], + level:1, type:"inert", onhit:"aoe", evadeable: false, noblock: true, power: 1.0, range: 2.99, size: 3, lifetime: 1, aoe: 1.5, damage: "arcane", delay: 1, + playerEffect: {name: "EnchantRope", power: 4}, + events: [ + {type: "EnchantRope", trigger: "bulletHitEnemy", mult: 1.0, power: 4}, + ]}, + + {enemySpell: true, name: "EnemyLatexRestraintBolt", tags: ["binding", "leather", "bolt", "offense"], sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 4, components: ["Arms"], level:1, type:"bolt", + bindType: "Latex", slowStart: true, color: "#9abcf7", + alwaysWarn: true, + projectileTargeting:true, onhit:"", time: 0, power: 3.0, delay: 0, range: 15, damage: "glue", speed: 3.5, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "glue", time: 3, power: 3, tags: ["latexheelSpell", "latexcatsuitSpell", "latexcorsetSpell"]}, + effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { + name: "LatexThinBlue", + duration: 20, + }, + }, + {enemySpell: true, name: "EnemyLatexGagBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 4, components: ["Arms"], level:1, type:"bolt", + slowStart: true, color: "#9abcf7", + alwaysWarn: true, + bindType: "Latex", + projectileTargeting:true, onhit:"", time: 0, power: 2.0, delay: 0, range: 15, damage: "glue", speed: 5, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "glue", power: 2, tag: "latexgagSpell"}, + events: [ + {type: "ElementalIfNotSilenced", trigger: "bulletHitEnemy", damage: "glue", power: 0, bind: 4}, + {type: "SilenceHumanoid", trigger: "bulletHitEnemy", time: 15}, + ], effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { + name: "LatexThinBlue", + duration: 20, + }, + }, + {enemySpell: true, name: "EnemyLatexArmbinderBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 5, components: ["Arms"], level:1, type:"bolt", + slowStart: true, color: "#9abcf7", + alwaysWarn: true, + bindType: "Latex", + projectileTargeting:true, onhit:"", time: 0, power: 5.0, delay: 0, range: 15, noblock: true, damage: "glue", speed: 2, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "glue", power: 2, tag: "latexarmbinderSpell"}, + events: [ + {type: "RemoveBlock", trigger: "bulletHitEnemy", power: 2}, + {type: "DisarmHumanoid", trigger: "bulletHitEnemy", time: 14}, + {type: "SilenceHumanoid", trigger: "bulletHitEnemy", time: 14, prereq: "silenced"}, + {type: "BlindHumanoid", trigger: "bulletHitEnemy", time: 14, prereq: "blinded"}, + ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "LatexThinBlue", + duration: 20, + }, + }, + {enemySpell: true, name: "EnemyLatexLegbinderBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 5, components: ["Arms"], level:1, type:"bolt", + slowStart: true, color: "#9abcf7", + alwaysWarn: true, + bindType: "Latex", + projectileTargeting:true, onhit:"", time: 11, power: 4.0, delay: 0, range: 15, damage: "glue", noblock: true, speed: 3, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "glue", power: 4, tag: "latexlegbinderSpell"}, + events: [ + {type: "ElementalIfNotSnared", trigger: "bulletHitEnemy", damage: "glue", power: 0, bind: 5}, + ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "Belts", + duration: 20, + }, + }, + + {enemySpell: true, name: "EnemySummonLatexRestraint", prerequisite: "ApprenticeLatex", tags: ["latex", "bolt", "binding", "burst", "gag", "utility", "offense"], components: ["Arms"], noise: 1, + sfx: "MagicSlash", school: "Conjure", manacost: 5, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 2, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "EnemyLatexRestraintBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "RubberBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {enemySpell: true, name: "EnemySummonLatexGag", prerequisite: "ApprenticeLatex", tags: ["latex", "bolt", "binding", "burst", "gag", "utility", "offense"], components: ["Arms"], noise: 1, + castCondition: "latexGagSpell", + sfx: "MagicSlash", school: "Conjure", manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 2, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "EnemyLatexGagBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "RubberBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {enemySpell: true, name: "EnemySummonLatexArmbinder", prerequisite: "SummonLatexGag", tags: ["latex", "bolt", "binding", "burst", "armbinder", "utility", "offense"], components: ["Arms"], noise: 1, + castCondition: "latexArmbinderSpell", + sfx: "MagicSlash", school: "Conjure", manacost: 3, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 5, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "EnemyLatexArmbinderBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "RubberBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + {enemySpell: true, name: "EnemySummonLatexLegbinder", prerequisite: "SummonLatexGag", tags: ["latex", "bolt", "binding", "burst", "legbinder", "utility", "offense"], components: ["Arms"], noise: 1, + castCondition: "latexLegbinderSpell", + sfx: "MagicSlash", school: "Conjure", manacost: 3, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 4, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "EnemyLatexLegbinderBolt", target: "target", directional:true, randomDirectionFallback: true, alwaysRandomBuff: "RubberBurst", aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + + + {name: "LeatherCuffsBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 3, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", time: 0, power: 1.0, bind: 4, delay: 0, range: 15, damage: "chain", speed: 2, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "leathercuffsSpell"}, + events: [ + {type: "ApplyGenBuff", trigger: "bulletHitEnemy", buff: "RestraintDisarmLight", time: 9999}, + ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "Belts", + duration: 20, + }, + }, + {name: "BlindfoldBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 3, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", time: 0, power: 2.0, delay: 0, range: 15, damage: "chain", speed: 5, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "blindfoldSpell"}, + events: [ + {type: "ElementalIfNotBlinded", trigger: "bulletHitEnemy", damage: "chain", power: 0, bind: 4}, + {type: "BlindHumanoid", trigger: "bulletHitEnemy", time: 20}, + ], effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { + name: "Belts", + duration: 20, + }, + }, + {name: "CuffsBolt", tags: ["binding", "metal", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 4, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", time: 0, power: 3.0, delay: 0, range: 15, damage: "chain", speed: 5, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 3, tag: "cuffsSpell"}, + events: [ + {type: "ElementalIfNotDisarmed", trigger: "bulletHitEnemy", damage: "chain", power: 0, bind: 4}, + {type: "DisarmHumanoid", trigger: "bulletHitEnemy", time: 6}, + ], effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { + name: "Chains", + duration: 20, + }, + }, + {name: "HarnessBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 6, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", time: 0, power: 5.0, delay: 0, range: 15, damage: "chain", noblock: true, speed: 3, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 5, tag: "harnessSpell"}, + events: [ + {type: "BoundBonus", trigger: "bulletHitEnemy", damage: "chain", power: 0, bind: 5}, + ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "Belts", + duration: 20, + }, + }, + {name: "StraitjacketBolt", tags: ["binding", "leather", "bolt", "offense"], minRange: 1.5, sfx: "MagicSlash", hitsfx: "LightSwing", school: "Conjure", manacost: 6, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"buff", time: 0, bind: 12, power: 1.0, delay: 0, range: 6, noblock: true, damage: "crush", speed: 2, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "chain", power: 5, tag: "jacketSpell"}, + buffs: [ + {id: "StraitjacketBolt", aura: "#ff4400", type: "Locked", duration: 14, power: 2.0, player: true, enemies: true, tags: ["lock", "debuff"]}, + ], + events: [ + {type: "RemoveBlock", trigger: "bulletHitEnemy", power: 3}, + {type: "DisarmHumanoid", trigger: "bulletHitEnemy", time: 10}, + ], effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.75, effectTile: { + name: "Belts", + duration: 20, + }, + }, + + // A puff of smoke + {name: "SmokePuff", school: "Illusion", manacost: 1, components: ["Verbal"], level:1, type:"inert", buffs: [ + {id: "SmokePuff", type: "Evasion", power: 3.0, player: true, enemies: true, tags: ["darkness"], range: 0.5}, + {id: "SmokePuff2", type: "Sneak", power: 3.0, player: true, duration: 1, enemies: true, tags: ["darkness"], range: 0.5} + ], onhit:"", time:5, aoe: 0.5, power: 0, delay: 2, delayRandom: 5, range: 4, size: 1, damage: ""}, // Creates a shroud. Enemies within are hard to hit with melee attacks. + {name: "SteamPuff", school: "Illusion", manacost: 1, components: ["Verbal"], level:1, type:"inert", buffs: [ + {id: "SmokePuff", type: "Evasion", power: 5.0, player: true, enemies: true, tags: ["darkness"], range: 0.5}, + {id: "SmokePuff2", type: "Sneak", power: 3.0, player: true, duration: 1, enemies: true, tags: ["darkness"], range: 0.5} + ], onhit:"", time:5, aoe: 0.5, power: 0, delay: 2, delayRandom: 5, range: 4, size: 1, damage: ""}, + + {name: "LesserInvisibility", sfx: "MagicSlash", school: "Illusion", manacost: 0, components: ["Verbal"], mustTarget: true, level:1, type:"buff", buffs: [{id: "LesserInvisibility", aura: "#888888", type: "Sneak", duration: 10, power: 3, player: true, enemies: true, tags: ["invisibility"]}], onhit:"", time:10, power: 0, range: 1.5, size: 1, damage: ""}, + + + // Divine Gifts + {name: "Disarm", tags: ["weapon"], sfx: "Chain", school: "Illusion", manacost: 0, components: [], level:1, type:"special", special: "Disarm", noMiscast: true, + onhit:"", time:5, power: 0, range: 3.99, size: 1, damage: ""}, + {name: "Freedom", sfx: "Magic", hitsfx: "Struggle", school: "Conjure", manacost: 15, components: [], mustTarget: true, selfTargetOnly: true, level:5, type:"hit", + onhit:"instant", time:4, lifetime: 1, bind: 8, delay: 1, power: 4, aoe: 2.99, range: 1.5, size: 5, damage: "chain", playerEffect: {name: "RemoveLowLevelRope"}}, + + {allySpell: true, name: "BeltStrike", noise: 2, sfx: "Struggle", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, castRange: 3, nonVolatile: true, onhit:"", power: 4, delay: 0, range: 4, speed: 4, size: 1, damage: "inert", + trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"cast", trailChance: 1.0, + trailcast: {spell: "SingleBelt", target: "onhit", directional:true, offset: false}}, + + {allySpell: true, name: "SingleBelt", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 4, bind: 4, range: 2, size: 1, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsLeatherWeak", tags: ["leatherRestraints", "leatherRestraintsHeavy"], power: 3, damage: "chain", count: 2, noGuard: true}}, + {name: "Slimethrower", + bindTags: ["slimeRestraintsRandom"], landsfx: "FireSpell", + noMiscast: true, manacost: 0, components: ["Legs"], level:1, type:"hit", + onhit:"lingering", time: 3, range: 3.9, power: 3.5, size: 1, aoe: 1, lifetime: + 1, lifetimeHitBonus: 9, damage: "glue", playerEffect: {name: "SlimeTrap", time: 3}}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + {allySpell: true, name: "Slimethrower2", + bindTags: ["slimeRestraintsRandom"], landsfx: "FireSpell", + manacost: 0, components: [], level:1, type:"hit", onhit:"lingering", + time: 3, range: 3.9, power: 2.5, size: 1, aoe: 1, lifetime: 1, + lifetimeHitBonus: 9, damage: "glue"}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + {name: "SlimeSuit", sfx: "MagicSlash", school: "Illusion", manacost: 5, components: [], level:1, type:"special", special: "dress", outfit: "SlimeSuit", noMiscast: true, + onhit:"", time:25, power: 0, range: 1.5, size: 1, damage: ""}, + + {name: "DildoBatBuff", sfx: "Vibe", school: "Elements", manacost: 0, components: ["Verbal"], mustTarget: true, level:1, type:"buff", noMiscast: true, + buffs: [ + { + id: "DildoBatBuff", type: "DildoBatBuff", duration: 11, power: 3.0, player: true, enemies: false, tags: [], + aura: "#ffff55", events: [ + {trigger: "playerAttack", type: "ElementalEffect", crit: 3.0, power: 3.0, damage: "charm", prereq: "HaveDildoBatPlus"}, + ] + }, + ], onhit:"", time:10, power: 3.0, range: 2, size: 1, damage: "", + }, + + {name: "SlimeForm", sfx: "MagicSlash", school: "Illusion", manacost: 8, components: ["Verbal"], mustTarget: true, level:1, type:"buff", noMiscast: true, + buffs: [ + {id: "SlimeForm", type: "glueDamageResist", aura: "#ff00ff", duration: 25, power: 0.5, player: true, enemies: false, tags: ["defense"]}, + {id: "SlimeForm2", type: "Squeeze", duration: 25, power: 0.5, player: true, enemies: false, tags: ["mobility"]}, + {id: "SlimeForm3", type: "Evasion", duration: 25, power: 0.5, player: true, enemies: false, tags: ["defense"]}, + {id: "SlimeForm4", type: "Counterattack", duration: 25, power: 2.5, player: true, enemies: false, tags: ["counter"], events: [ + {trigger: "beforeAttack", type: "CounterattackDamage", power: 2.5, damage: "glue", prereq: "hit-hostile"}, + ]}, + ], onhit:"", time:10, power: 0, range: 2, size: 1, damage: "", + extraCast: [{spell: "Slimethrower2"}, {spell: "SlimeSuit"}]}, + {name: "AvatarForm", sfx: "PowerMagic", school: "Elements", manacost: 0, components: ["Verbal"], mustTarget: true, level:1, type:"buff", noMiscast: true, + buffs: [ + {id: "AvatarFire", aura: "#f1641f", type: "event", duration: 9999, infinite: true, power: 5, player: true, enemies: false, maxCount: 1, tags: ["cast_fire", "trigger_fire"], events: [ + {trigger: "calcMana", type: "AvatarFire", power: 5.0}, + ]}, + {id: "AvatarWater", aura: "#2789cd", type: "event", duration: 9999, infinite: true, power: 5, player: true, enemies: false, maxCount: 1, tags: ["cast_water", "trigger_water"], events: [ + {trigger: "calcMana", type: "AvatarWater", power: 5.0}, + ]}, + {id: "AvatarAir", aura: "#c9d4fd", type: "event", duration: 9999, infinite: true, power: 5, player: true, enemies: false, maxCount: 1, tags: ["cast_air", "trigger_air"], events: [ + {trigger: "calcMana", type: "AvatarAir", power: 5.0}, + ]}, + {id: "AvatarEarth", aura: "#61a53f", type: "event", duration: 9999, infinite: true, power: 5, player: true, enemies: false, maxCount: 1, tags: ["cast_earth", "trigger_earth"], events: [ + {trigger: "calcMana", type: "AvatarEarth", power: 5.0}, + ]}, + ], onhit:"", time:10, power: 0, range: 2, size: 1, damage: ""}, + + + // Rest of the spells + {name: "ShockStrike", sfx: "Shock", manacost: 1, bulletColor: 0x8888ff, bulletLight: 2, + hitColor: 0x8888ff, hitLight: 6, components: ["Arms"], level:1, type:"hit", noTerrainHit: true, onhit:"aoe", time: 1, delay: 1, power: 2.5, range: 2, size: 1, aoe: 0.5, lifetime: 1, damage: "electric"}, + {name: "StaticSphereStrike", sfx: "Shock", manacost: 2, bulletColor: 0x8888ff, bulletLight: 2, + hitColor: 0x8888ff, hitLight: 6, components: ["Verbal"], level:1, type:"hit", noTerrainHit: true, onhit:"aoe", time: 1, delay: 1, power: 1.5, range: 2, size: 1, aoe: 0.5, lifetime: 1, damage: "electric"}, + {name: "LightningRuneStrike", bulletColor: 0x8888ff, bulletLight: 2, tags: ["electric", "trap", "rune"], + hideWarnings: true, + crit: 2, + events: [ + {trigger: "countRune", type: "rune"}, + ], + effectTileDurationMod: 2, effectTile: { + name: "Sparks", + duration: 3, + }, + hitColor: 0x8888ff, hitLight: 6, hitsfx: "Shock", manacost: 2, components: ["Legs"], level:1, type:"dot", + noTerrainHit: true, onhit:"", time: 4, delay: 3000, power: 4.5, range: 2, size: 1, aoe: 0.5, lifetime: 1, damage: "electric"}, + {name: "FlameRuneStrike", bulletColor: 0xb83716, bulletLight: 2, tags: ["fire", "trap", "rune"], + hideWarnings: true, + crit: 2, + events: [ + {trigger: "countRune", type: "rune"}, + ], + hitColor: 0xe64539, hitLight: 6, hitsfx: "Lightning", manacost: 2, components: ["Legs"], noDirectHit: true, + level:1, type:"dot", noTerrainHit: true, onhit:"aoe", delay: 3000, power: 5.5, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "fire"}, + {name: "RopeRuneStrike", bulletColor: 0xff73ef, bulletLight: 2, tags: ["rope", "trap", "rune"], + hideWarnings: true, + crit: 2, + effectTileDurationMod: 10, effectTile: { + name: "Ropes", + duration: 20, + }, + events: [ + {trigger: "countRune", type: "rune"}, + ], + bindType: "MagicRope", + hitColor: 0xff73ef, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["ropeMagicWeak"], msg: "Rope"}, + noTerrainHit: true, onhit:"aoe", delay: 3000, noDirectHit: true, + power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "chain"}, + {name: "FreezeRuneStrike", hitsfx: "Freeze", manacost: 2, bulletColor: 0x8888ff, bulletLight: 2, tags: ["ice", "trap", "rune"], + hideWarnings: true, + crit: 2, + events: [ + {trigger: "countRune", type: "rune"}, + ], + hitColor: 0x8888ff, hitLight: 6, components: ["Legs"], level:1, type:"dot", noTerrainHit: true, onhit:"", time: 30, delay: 3000, power: 3.0, range: 2, size: 3, aoe: 0.5, lifetime: 1, damage: "ice"}, + {name: "EarthformSingle", tags: ["earth", "utility", "summon"], noSprite: true, minRange: 0, landsfx: "Bones", hideUnlearnable: true, manacost: 4, components: ["Legs"], prerequisite: ["Earthform"], + level:1, type:"hit", onhit:"summon", summon: [{name: "EarthenMonolith", faction: "Rock" , count: 1, time: 9999, bound: true}], power: 0, time: 9999, delay: 1, range: 4, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, + + {name: "DarkShroud", sfx: "FireSpell", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", buffs: [{id: "DarkShroud", type: "Evasion", power: 1.5, player: false, enemies: true, tags: ["heavydarkness"], range: 1.5},], + onhit:"", time:8, aoe: 1.5, power: 0, delay: 8, range: 4, size: 3, damage: "", + effectTileDurationModPre: 3, effectTilePre: { + name: "Smoke", + duration: 8, + }}, // Creates a shroud. Enemies within are hard to hit with melee attacks. + {name: "Slippery", sfx: "FireSpell", school: "Elements", manacost: 0, components: ["Verbal"], mustTarget: true, selfTargetOnly: true, level:1, type:"buff", channel: 4, + buffs: [ + {id: "Slippery", aura: "#4fd658", type: "BoostStruggle", duration: 100, power: 0.1, player: true, enemies: false, tags: ["struggle"]}, + ], onhit:"", time:100, power: 0, range: 2, size: 1, damage: ""}, + {name: "Cutting", sfx: "FireSpell", school: "Elements", manacost: 0, components: ["Verbal"], mustTarget: true, selfTargetOnly: true, level:1, type:"buff", channel: 4, + buffs: [ + {id: "Cutting", aura: "#e7cf1a", type: "BoostCutting", duration: 10, power: 0.3, player: true, enemies: false, tags: ["struggle"]}, + {id: "Cutting2", type: "BoostCuttingMinimum", duration: 10, power: 0.8, player: true, enemies: false, tags: ["struggle", "allowCut"]}, + ], onhit:"", time:10, power: 0, range: 2, size: 1, damage: ""}, + {enemySpell: true, name: "EnemyCorona", + bulletColor: 0xffff77, bulletLight: 5, + minRange: 0, sfx: "MagicSlash", school: "Illusion", manacost: 7, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 12, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, + spellcast: {spell: "EnemyCoronaBeam", target: "target", directional:true, offset: false}, channel: 2}, + {enemySpell: true, name: "EnemyCoronaBeam", + trailColor: 0xffff77, trailLight: 3, slowStart: true, color: "#ffff88", noise: 1, + events: [ + {type: "BlindAll", trigger: "bulletHitEnemy", time: 12}, + ], + sfx: "FireSpell", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 4, delay: 0, range: 8, speed: 50, size: 1, damage: "holy", + trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1, playerEffect: {name: "CoronaShock", time: 3}}, + {enemySpell: true, name: "MonolithBeam", + bulletColor: 0xff5555, bulletLight: 5, + minRange: 0, sfx: "MagicSlash", school: "Illusion", manacost: 7, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 12, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, + spellcast: {spell: "MonolithBeamBeam", target: "target", directional:true, offset: false}, channel: 2}, + {enemySpell: true, name: "MonolithBeamBeam", + trailColor: 0xff5555, trailLight: 3, slowStart: true, color: "#ff5277", noise: 1, + sfx: "MagicSlash", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 6, delay: 0, range: 8, speed: 50, size: 1, damage: "soul", + trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1, playerEffect: {name: "CrystalBind", time: 3}}, + + {enemySpell: true, name: "ObserverBeam", noDirectionOffset: true, color: "#bc4a9b", + bulletColor: 0xff5555, bulletLight: 5, + minRange: 0, sfx: "MagicSlash", school: "Illusion", manacost: 7, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 6, range: 6, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, + spellcast: {spell: "ObserverBeamBeam", target: "target", directional: false, offset: false}, channel: 2}, + {enemySpell: true, name: "ObserverBeamBeam", + trailColor: 0xff5555, trailLight: 3, slowStart: true, color: "#bc4a9b", noDoubleHit: true, + sfx: "Evil", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, piercing: true, nonVolatile: true, onhit:"", power: 6, delay: 0, range: 6, speed: 50, size: 1, damage: "soul", + trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1, playerEffect: {name: "ObserverBeam", count: 1}}, + + + {enemySpell: true, name: "HexLatexExplosion", color: "#88ffaa", sfx: "Fwoosh", effectTileDurationMod: 10, effectTileDensity: 0.33, effectTile: { + name: "LatexThinGreen", + duration: 20, + }, manacost: 3, minRange: 0, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, + delay: 1, power: 3, range: 2.5, size: 3, aoe: 1, lifetime: 1, damage: "chain", + playerEffect: {name: "HexLatex", power: 4, damage: "glue"}}, + + + {enemySpell: true, name: "HexOrb", color: "#88ff88", sfx: "HexOrb", manacost: 4, specialCD: 12, + minRange: 0, + components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", + power: 0, delay: 0, range: 5, damage: "chain", speed: 1, playerEffect: {name: ""}, + events: [{type: "CastSpellNearbyEnemy", player: true, trigger: "bulletTick", spell: "HexWrapping", aoe: 1.5},], + spellcast: {spell: "HexLatexExplosion", target: "onhit", directional:true, offset: false}}, + + {name: "HexWrapping", tags: ["offense", "fabric", "wrapping", "binding"], sfx: "HexOrbMinor", school: "Conjure", manacost: 0.5, components: ["Verbal"], bind: 3.0, + bindType: "Wrapping", + noTargetPlayer: true, mustTarget: true, level:1, type:"inert", onhit:"aoe", evadeable: true, noblock: true, + delay: 1, + power: 2.0, time: 10, range: 1.5, size: 1, lifetime: 1, aoe: 0.5, damage: "crush", + playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "mummyRestraints"}, + }, + + {enemySpell: true, name: "ClericBeamMulti", sfx: "Evil", minRange: 0, manacost: 6, + projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + spellcast: {spell: "ClericBeam", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 1, offset: false}, channel: 3}, + + {enemySpell: true, name: "ClericBeam", + bulletColor: 0x88ff88, bulletLight: 5, + color: "#88ff88", minRange: 0, sfx: "MagicSlash", school: "Illusion", manacost: 7, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 12, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, + spellcast: {spell: "ClericBeamBeam", target: "target", directional:true, offset: false}, channel: 2}, + {enemySpell: true, name: "ClericBeamBeam", + trailColor: 0x88ff88, trailLight: 3, slowStart: true, color: "#88ff88", noise: 1, + sfx: "HexOrbMinor", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 6, delay: 0, range: 8, speed: 50, size: 1, damage: "fire", + trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1, playerEffect: {name: "MysticShock", time: 3}}, + + + + {name: "Pickaxe", tags: ["pickaxe", "melee"], color: "#88ff88", sfx: "HeavySwing", manacost: 0, noMiscast: true, components: [], level: 1, + type:"special", + special: "Pickaxe", + faction: "Player", + staminacost: 0, + CastInWalls: true, + onhit:"", power: 2.5, delay: 0, range: 1.5, damage: "pierce", speed: 1.5}, + + {name: "ArrowNormal", tags: ["arrowreplace"], color: "#88ff88", sfx: "Arrow", manacost: 0, noMiscast: true, components: [], level: 1, type:"bolt", + faction: "Player", + staminacost: 2, + crit: 1.5, + events: [ + {trigger: "bulletHitEnemy", type: "Arrow"}, + ], + projectileTargeting:true, onhit:"", power: 2.5, delay: 0, range: 7.5, damage: "pierce", speed: 2.5}, + {name: "ArrowRecurve", tags: ["arrowreplace"], color: "#88ff88", sfx: "Arrow", manacost: 0, noMiscast: true, components: [], level: 1, type:"bolt", + faction: "Player", + staminacost: 3.5, + crit: 1.5, + events: [ + {trigger: "bulletHitEnemy", type: "Arrow"}, + ], + projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 8.5, damage: "pierce", speed: 3}, + {name: "ArrowLongbow", tags: ["arrowreplace"], color: "#88ff88", sfx: "Arrow", manacost: 0, noMiscast: true, components: [], level: 1, type:"bolt", + faction: "Player", + staminacost: 6.0, + crit: 1.5, + events: [ + {trigger: "bulletHitEnemy", type: "Arrow"}, + ], + projectileTargeting:true, onhit:"", power: 6.0, delay: 0, range: 10, damage: "pierce", speed: 3.5}, + {name: "ArrowBolt", tags: ["arrowreplace"], color: "#88ff88", sfx: "ArrowBolt", manacost: 0, noMiscast: true, components: [], level: 1, type:"bolt", + crit: 2.0, + events: [ + {trigger: "bulletHitEnemy", type: "Arrow"}, + ], + faction: "Player", + projectileTargeting:true, onhit:"", power: 6.5, delay: 0, range: 10, damage: "pierce", speed: 3}, + {name: "ArrowBoltPistol", tags: ["arrowreplace"], color: "#88ff88", sfx: "ArrowBolt", manacost: 0, noMiscast: true, components: [], level: 1, type:"bolt", + crit: 2.0, + events: [ + {trigger: "bulletHitEnemy", type: "Arrow"}, + ], + faction: "Player", + projectileTargeting:true, onhit:"", power: 4.5, delay: 0, range: 7.5, damage: "pierce", speed: 2.5}, + {name: "ArrowBoltHeavy", tags: ["arrowreplace"], color: "#88ff88", sfx: "ArrowBolt", manacost: 0, noMiscast: true, components: [], level: 1, type:"bolt", + crit: 2.5, pierceEnemies: true, + faction: "Player", + events: [ + {trigger: "bulletHitEnemy", type: "Arrow"}, + ], + projectileTargeting:true, onhit:"", power: 7, delay: 0, range: 14, damage: "pierce", speed: 4}, + + {name: "ArrowFire", tags: ["arrowspecial"], color: "#e7cf1a", sfx: "FireSpell", landsfx: "Lightning", manacost: 0, noMiscast: true, components: [], level: 1, type:"bolt", projectileTargeting:true, + crit: 1.5, + faction: "Player", + effectTileDurationMod: 12, effectTile: { + name: "Ember", + duration: -4, + }, + events: [ + {trigger: "bulletHitEnemy", type: "Arrow"}, + ], + onhit:"aoe", power: 4, noDirectDamage: true, delay: 0, range: 7.5, aoe: 1.5, lifetime: 1, damage: "fire", speed: 2.5, playerEffect: {name: "HeatBlast", time: 1, damage: "fire", power: 4}}, + {name: "ArrowVine", tags: ["arrowspecial"], color: "#55ff55", sfx: "FireSpell", + landsfx: "MagicSlash", manacost: 0, noMiscast: true, components: [], level: 1, + type:"bolt", projectileTargeting:true, + crit: 1.5, + faction: "Player", + bindType: "Vine", + addBind: true, + + effectTileDurationMod: 10, effectTile: { + name: "Vines", + duration: 20, + }, + events: [ + {trigger: "bulletHitEnemy", type: "Arrow"}, + ], + onhit:"", power: 4, delay: 0, range: 7.5, bind: 8, lifetime: 1, + damage: "chain", speed: 2.5, + playerEffect: {name: "Bind", damage: "chain", power: 2, tag: "vineRestraints"}}, + + {name: "BlasterBlast", hitsfx: "Shock", sfx: "Laser", school: "Elements", manacost: 0, components: [], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 2.5, time: 1, delay: 0, + bulletColor: 0xffff00, bulletLight: 5, noMiscast: true, + events: [ + {trigger: "bulletHitEnemy", type: "Blaster"}, + ], + range: 8, speed: 3, size: 1, damage: "electric", playerEffect: {name: "Shock", time: 3}}, + {enemySpell: true, name: "EnemyBlast", noFirstChoice: true, hitsfx: "Shock", sfx: "Laser", school: "Elements", manacost: 6, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 2.5, time: 1, delay: 0, + bulletColor: 0x00ffff, bulletLight: 5, + range: 8, speed: 3, size: 1, damage: "electric", playerEffect: {name: "Shock", time: 1}}, + + {allySpell: true, name: "AllyHolyBolt", hitsfx: "Shock", sfx: "Laser", school: "Elements", manacost: 4, components: [], level:1, type:"bolt", projectileTargeting:true, onhit:"aoe", power: 2.0, time: 1, delay: 0, aoe: 1.5, lifetime: 1, + bulletColor: 0xffff88, bulletLight: 5, + events: [ + {type: "BlindAll", trigger: "bulletHitEnemy", time: 8}, + ], + range: 7.99, speed: 2, size: 1, damage: "holy"}, + + + {name: "BondageBust", noise: 7, sfx: "Laser", school: "Illusion", manacost: 0, components: [], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + bulletColor: 0xffff00, bulletLight: 5, + spellcast: {spell: "BondageBustBeam", target: "target", directional:true, offset: false}, noMiscast: true, channel: 1}, + {name: "BondageBustBeam", hitsfx: "Shock", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 3, time: 3, delay: 0, range: 8, speed: 50, size: 1, damage: "electric", + trailColor: 0xffff00, trailLight: 3, crit: 1.5, bind: 3, bindType: "Energy", + events: [ + {trigger: "bulletHitEnemy", type: "Blaster"}, + ], + trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1, playerEffect: {name: "Shock", time: 3}}, + {name: "HeartArrow", sfx: "MagicSlash", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "soul", speed: 2, + events: [ + {type: "GreaterRage", trigger: "bulletHitEnemy"}, + ], + }, + + + {enemySpell: true, name: "BearTrap", tags: ["fire", "offense", "defense"], noise: 0, sfx: "Miss", school: "Elements", spellPointCost: 1, manacost: 4, + components: ["Legs"], level:1, type:"inert", + selfcast: true, + onhit:"aoe", delay: 2, power: 2, range: 2.99, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "BearTrapStrike", target: "onhit", directional:false, offset: false}}, + {enemySpell: true, name: "BearTrapStrike", bulletColor: 0xaaaaaa, hideWarnings: true, + hitsfx: "Clang", manacost: 2, components: ["Legs"], level:1, type:"dot", noTerrainHit: true, onhit:"", delay: 20, power: 1, range: 2, bind: 4, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", + playerEffect: {name: "BearTrapStun", count: 1, power: 2.0, damage: "chain", time: 3}}, + + {name: "MoiraiScissors", tags: ["defense", "offense"], school: "Special", chargecost: 0.05, manacost: 0, customCost: "SprintPlusAttack", components: [], level:1, type:"special", special: "MoiraiScissors", noMiscast: true, + onhit:"", time:25, power: -1, range: 4.5, size: 1, damage: ""}, + + {name: "CoronaBeam", sfx: "FireSpell", + trailColor: 0xffff77, trailLight: 3, noise: 2, crit: 1.5, + events: [ + {type: "BlindAll", trigger: "bulletHitEnemy", time: 12}, + ], + school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, nonVolatile: true, onhit:"", power: 12, delay: 0, range: 8, speed: 50, size: 1, damage: "holy", + trailHit: "", trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1}, + {name: "AllyCrackle", sfx: "Shock", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 4, delay: 0, time: 1, range: 4, speed: 4, size: 1, damage: "electric", + trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1.0}, + {allySpell: true, name: "AllyFirebolt", sfx: "FireSpell", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4.5, delay: 0, range: 50, damage: "fire", speed: 3}, + {allySpell: true, name: "AllyWindBlast", sfx: "FireSpell", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", power: 2.0, time: 2, delay: 0, range: 50, damage: "stun", speed: 1, hitSpin: 1, bulletSpin: 1, + events: [{type: "Knockback", trigger: "bulletHitEnemy", power: 1.0, dist: 1.0},]}, + {enemySpell: true, name: "EnemyWindBlast", tags: ["air", "bolt", "offense", "utility"], + slowStart: true, + prerequisite: "ApprenticeAir", sfx: "FireSpell", school: "Elements", manacost: 2.5, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", power: 1.0, time: 2, delay: 0, range: 2.99, damage: "stun", speed: 3, hitSpin: 1, bulletSpin: 1, + shotgunCount: 3, shotgunDistance: 4, shotgunSpread: 3, shotgunSpeedBonus: 1, + playerEffect: {name: "EnemyWindBlast", power: 0.5, damage: "stun", dist: 1.0}, + events: [{type: "Knockback", trigger: "bulletHitEnemy", power: 1.0, dist: 1.0},]}, + {allySpell: true, name: "AllyShadowStrike", minRange: 0, sfx: "MagicSlash", school: "Illusion", manacost: 3, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", power: 6, time: 2, delay: 1, range: 1.5, size: 1, aoe: 0.75, lifetime: 1, damage: "cold"}, + {allySpell: true, name: "HeelShadowStrike", sfx: "MagicSlash", school: "Illusion", manacost: 3, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", power: 2.5, time: 4, delay: 1, range: 1.5, size: 1, aoe: 0.75, lifetime: 1, damage: "cold"}, + {allySpell: true, name: "FlameStrike", sfx: "FireSpell", school: "Element", manacost: 6, components: [], level:1, type:"inert", onhit:"aoe", noTerrainHit: true, power: 3, delay: 1, range: 1.5, size: 3, aoe: 1.5, lifetime: 1, damage: "fire"}, + {allySpell: true, name: "ShatterStrike", sfx: "MagicSlash", school: "Element", manacost: 0, components: [], level:1, type:"hit", onhit:"instant", noTerrainHit: true, power: 1.5, delay: 1, range: 1.5, time: 4, size: 3, aoe: 1.5, lifetime: 1, damage: "frost"}, + {name: "Ignition", faction: "Rage", school: "Element", manacost: 0, components: [], level:1, type:"hit", onhit:"instant", noTerrainHit: true, power: 1.5, delay: 1, range: 1.5, size: 3, aoe: 1.5, lifetime: 1, damage: "fire", playerEffect: {name: "Ignition", power: 1, damage: "fire"}}, + {name: "VolcanicStrike", school: "Element", manacost: 0, components: [], level:1, hitsfx: "Lightning", type:"hit", onhit:"instant", noTerrainHit: true, power: 6.0, delay: 1, range: 1.5, size: 5, aoe: 2.99, damageFlags: ["VolcanicDamage"], lifetime: 1, damage: "fire", playerEffect: {name: "Damage"}}, + {allySpell: true, name: "ArcaneStrike", school: "Element", manacost: 0, components: [], level:1, type:"hit", onhit:"instant", noTerrainHit: true, power: 2.5, delay: 1, range: 1.5, size: 3, aoe: 1.5, lifetime: 1, damage: "arcane"}, + {enemySpell: true, name: "ShadowStrike", sfx: "MagicSlash", school: "Illusion", manacost: 3, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", power: 6, time: 2, delay: 1, range: 1.5, size: 1, aoe: 0.75, lifetime: 1, damage: "cold", playerEffect: {name: "ShadowStrike", damage: "cold", power: 4, count: 1}}, + + + {name: "RopeBolt", color: "#e7cf1a", sfx: "Miss", school: "Conjure", manacost: 1, tags: ["rope"], components: ["Verbal"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", power: 1.0, bind: 3.2, delay: 0, range: 50, damage: "chain", bindType: "Rope", speed: 3, playerEffect: {name: "SingleRope"}, + evadeable: true, + effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { + name: "Ropes", + duration: 20, + },}, + + + {enemySpell: true, name: "WitchRopeBoltLaunchMany", tags: ["rope", "bolt", "binding", "offense"], prerequisite: "RopeBoltLaunch", sfx: "MagicSlash", school: "Conjure", + upcastFrom: "RopeBoltLaunch", upcastLevel: 1, specialCD: 20, hideWarnings: true, + noSprite: true, + manacost: 5, components: ["Verbal"], projectileTargeting: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 6, power: 1, range: 7, meleeOrigin: true, noDirectionOffset: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + followCaster: true, + spellcast: {spell: "WitchRopeBoltLaunchSingle", target: "target", directional:true, aimAtTarget: true, offset: false}}, + {enemySpell: true, name: "WitchRopeBoltLaunchSingle", tags: ["rope", "bolt", "binding", "offense"], prerequisite: "ApprenticeRope", school: "Conjure", + manacost: 1, components: ["Verbal"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 1, range: 9, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + noMiscast: false, noCastOnHit: false, fastStart: true, hideWarnings: true, landsfx: "FireSpell",sfx: "FireSpell",hitsfx: "FireSpell", + shotgunCount: 1, shotgunDistance: 6, shotgunSpread: 0.1, shotgunSpeedBonus: 0, shotgunFan: true, + spellcast: {spell: "WitchRope", target: "target", directional:true, randomDirectionPartial: true, aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + + {name: "RopeBoltLaunchSingle", tags: ["rope", "bolt", "binding", "offense"], prerequisite: "ApprenticeRope", sfx: "MagicSlash", school: "Conjure", + manacost: 1, components: ["Verbal"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 1, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + noMiscast: false, noCastOnHit: false, + shotgunCount: 1, shotgunDistance: 6, shotgunSpread: 0.1, shotgunSpeedBonus: 0, shotgunFan: true, + spellcast: {spell: "RopeBolt", target: "target", directional:true, randomDirectionPartial: true, aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + + + {name: "Icicle", sfx: "MagicSlash", hitsfx: "Freeze", school: "Elements", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 4, + power: 3, delay: 0, range: 50, damage: "frost", speed: 2, playerEffect: {name: "Damage"}, + evadeable: true, + bulletColor: 0x92e4e8, bulletLight: 3, + events: [{type: "ElementalOnSlowOrBindOrDrench", trigger: "bulletHitEnemy", damage: "ice", time: 3, power: 0},]}, + {name: "Boulder", sfx: "Bones", hitsfx: "HeavySwing", school: "Elements", manacost: 3, components: ["Arms"], level:1, + noise: 5, + type:"bolt", projectileTargeting:true, onhit:"", block: 8, time: 4, power: 4, delay: 0, range: 50, damage: "crush", speed: 2, playerEffect: {name: "Damage"}}, // Throws a blast of ice which stuns the target for 4 turns + {allySpell: true, name: "BoulderKicked", sfx: "Bones", hitsfx: "HeavySwing", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 4, power: 4, delay: 0, range: 50, damage: "crush", speed: 3.5, playerEffect: {name: "Damage"}}, // Throws a blast of ice which stuns the target for 4 turns + {name: "BigBoulder", sfx: "Bones", hitsfx: "HeavySwing", school: "Elements", manacost: 7, components: ["Arms"], level:1, type:"bolt", noDirectDamage: true, + noise: 7, + projectileTargeting:true, alwaysCollideTags: ["summonedRock"], onhit:"aoe", block: 20, time: 8, power: 12, aoe: 1.5, size: 3, delay: 0, lifetime: 1, range: 50, damage: "crush", speed: 1, playerEffect: {name: "Damage"}}, // Throws a blast of ice which stuns the target for 4 turns + + + {enemySpell: true, name: "Ribbons", color: "#6700ff", noise: 6, sfx: "Struggle", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, castRange: 3, nonVolatile: true, onhit:"", power: 3, delay: 0, range: 4, speed: 4, size: 1, damage: "inert", + trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"cast", trailChance: 1.0, + trailcast: {spell: "SingleRibbon", target: "onhit", directional:true, offset: false}}, + {enemySpell: true, name: "SingleRibbon", color: "#6700ff", sfx: "Struggle", manacost: 4, components: [], level:1, + effectTileDurationMod: 10, effectTileAoE: 0.5, effectTile: { + name: "Fabric", + duration: 20, + }, + type:"inert", onhit:"aoe", time: 5, delay: 1, power: 4, range: 2, size: 1, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsRibbons", tags: ["magicRibbons"], power: 3, damage: "chain", count: 1, noGuard: true}}, + + {enemySpell: true, msg: true, name: "AreaElectrify", minRange: 0, landsfx: "Shock", school: "Conjure", specialCD: 10, manacost: 10, components: ["Legs"], level:1, type:"inert", onhit:"cast", + dot: true, time: 4, delay: 3, range: 2.5, size: 3, aoe: 2.5, lifetime: 1, power: 1, damage: "inert", + spellcasthit: {spell: "WitchElectrify", target: "onhit", chance: 0.22, directional:false, offset: false}, channel: 2}, + + {enemySpell: true, name: "IceDragonBreath", color: "#00ffff", sfx: "Freeze", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", time: 1, power: 4, delay: 0, range: 4, speed: 50, size: 1, damage: "inert", + trailPower: 4, trailLifetime: 1, trailLifetimeBonus: 4, trailTime: 3, trailspawnaoe: 1.5, trailDamage:"ice", trail:"lingering", trailChance: 0.3, trailPlayerEffect: {name: "Freeze", damage: "ice", time: 3}}, + {enemySpell: true, name: "IceDragonBreathPrepare", color: "#00ffff", minRange: 0, sfx: "MagicSlash", school: "Illusion", manacost: 8, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 12, range: 5, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "IceDragonBreath", target: "target", directional:true, offset: false}, channel: 2}, + + {enemySpell: true, name: "IceSlow", color: "#00ffff", sfx: "Freeze", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 1, delay: 0, time: 2, range: 4, speed: 50, size: 1, damage: "inert", + trailPower: 4, trailLifetime: 2, trailLifetimeBonus: 8, trailTime: 3, trailspawnaoe: 1.5, trailDamage:"ice", trail:"lingering", trailChance: 0.5, trailPlayerEffect: {name: "Chill", time: 3, damage: "ice", power: 1}}, + {enemySpell: true, name: "IceSlowPrepare", color: "#00ffff", minRange: 0, sfx: "MagicSlash", school: "Illusion", manacost: 8, components: ["Arms"], projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 12, range: 5, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + spellcast: {spell: "IceSlow", target: "target", directional:true, offset: false}, channel: 1}, + + {name: "SmokeBomb", tags: ["aoe", "buff", "utility", "stealth", "defense"], sfx: "Fwoosh", school: "Illusion", manacost: 0, components: [], level:1, type:"inert", buffs: [ + {id: "Shroud", type: "Evasion", power: 7.0, player: true, enemies: true, tags: ["darkness"], range: 1.5}, + {id: "Shroud2", aura: "#444488", type: "Sneak", power: 4.0, player: true, duration: 8, enemies: false, tags: ["darkness"], range: 1.5} + ], onhit:"", time:14, aoe: 1.5, power: 0, delay: 8, range: 3.5, size: 3, damage: "", + noise: 1, + noMiscast: true, + effectTileDurationModPre: 3, effectTilePre: { + name: "Smoke", + duration: 8, + }}, // Creates a shroud. Enemies within are hard to hit with melee attacks. + + {enemySpell: true, name: "EnemyFlashBomb", color: "#ff2200", minRange: 0, sfx: "Miss", landsfx: "Lightning", school: "Illusion", manacost: 3, specialCD: 12, components: ["Verbal"], hideWarnings: true, + hitColor: 0xffffff, hitLight: 7, + noise: 4, + faction: "Trap", + hitevents: [ + {type: "BlindAll", trigger: "bulletHitEnemy", time: 9}, + ], + level:1, type:"inert", onhit:"aoe", time: 0, delay: 1, power: 1, range: 3.5, size: 3, aoe: 1.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 3}}, + + {name: "FlashBomb", color: "#ff2200", minRange: 0, sfx: "Miss", landsfx: "Lightning", school: "Illusion", manacost: 0, specialCD: 12, components: ["Verbal"], hideWarnings: true, + noise: 4, + hitColor: 0xffffff, hitLight: 7, + noMiscast: true, + hitevents: [ + {type: "BlindAll", trigger: "bulletHitEnemy", time: 20}, + ], + level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 1, range: 4, size: 3, aoe: 1.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 6}}, + {name: "Flashbang", color: "#ff2200", minRange: 0, landsfx: "Lightning", school: "Illusion", manacost: 0, specialCD: 12, components: ["Verbal"], hideWarnings: true, + noise: 9, + hitColor: 0xffffff, hitLight: 7, + noMiscast: true, + hitevents: [ + {type: "BlindAll", trigger: "bulletHitEnemy", time: 30}, + ], + level:1, type:"hit", onhit:"aoe", time: 6, delay: 1, power: 1, range: 4, size: 3, aoe: 1.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 7}}, + {enemySpell: true, name: "EnemyFlash", color: "#ffffff", minRange: 0, noise: 8, sfx: "FireSpell", school: "Illusion", manacost: 4, components: ["Verbal"], level:1, + hitColor: 0xffffff, hitLight: 7, + hitevents: [ + {type: "BlindAll", trigger: "bulletHitEnemy", time: 7}, + ], + type:"inert", onhit:"aoe", time: 3, delay: 1, power: 1, range: 2.5, size: 3, aoe: 1.5, lifetime: 1, damage: "stun", playerEffect: {name: "Blind", time: 4}}, + + {enemySpell: true, name: "SleepGas", color: "#4fd658", sfx: "Miss", school: "Illusion", manacost: 4, specialCD: 24, components: ["Verbal"], level:1, type:"inert", passthrough: true, noTerrainHit: true, buffs: [ + {id: "SleepGas", type: "SleepinessGas", power: 1, player: true, enemies: false, tags: ["sleep", "gas"], range: 1.5}], onhit:"", time:6, aoe: 1.5, power: 1, delay: 8, range: 4, size: 3, damage: "poisongas", playerEffect: {name: "DamageNoMsg", damage: "poisongas", power: 1}}, // Creates a shroud. Enemies within are hard to hit with melee attacks. + + + {enemySpell: true, name: "GlueBomb", color: "#e7cf1a", minRange: 2.5, sfx: "Miss", school: "Conjure", + manacost: 2, specialCD: 12, components: ["Arms"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3.5, range: 4.5, size: 3, aoe: 1.5, lifetime: 1, + effectTileDurationMod: 10, effectTileAoE: 1.5, effectTile: { + name: "Glue", + duration: 20, + }, + damage: "glue", playerEffect: {name: "Glue", count: 3, damage: "glue", power: 4, time: 1}}, + + {enemySpell: true, name: "Glue", color: "#e7cf1a", landsfx: "Freeze", school: "Conjure", + manacost: 9, components: ["Arms"], level:1, type:"inert", onhit:"lingering", time: 4, delay: 1, range: 4, size: 3, aoe: 1.5, lifetime: 24, power: 4, lifetimeHitBonus: 76, damage: "glue", + playerEffect: {name: "Glue", count: 1, damage: "glue", power: 4, time: 1}}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + + {enemySpell: true, name: "RedSlime", sfx: "Miss", manacost: 4, specialCD: 15, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "glue", speed: 1.5, playerEffect: {name: "DamageNoMsg", power: 4, damage: "glue"}, + spellcast: {spell: "SummonSingleRedSlime", target: "onhit", directional:false, offset: false, strict: true}}, + + {enemySpell: true, name: "AmpuleBlue", sfx: "Miss", manacost: 5, specialCD: 15, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "glue", speed: 1, playerEffect: {name: "AmpuleBlue", damage: "glue", power: 4, count: 1}}, + {enemySpell: true, name: "LatexBubble", bindType: "Slime", color: "#2789cd", sfx: "RubberBolt", manacost: 4, specialCD: 14, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", + pierceEnemies: true, + time: 3, power: 2, delay: 0, range: 12, damage: "glue", speed: 1, trailLifetime: 10, trailDamage:"glue", trail:"lingering", trailPower: 2, trailChance: 1.0, playerEffect: {name: "LatexBubble", time: 12, power: 2, damage: "glue"}, + }, + {enemySpell: true, name: "AmpuleGreen", sfx: "Miss", manacost: 4, specialCD: 15, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1, delay: 0, range: 50, damage: "crush", speed: 1, playerEffect: {name: "Ampule", damage: "inert"}, + spellcast: {spell: "SleepGas", target: "onhit", directional:false, offset: false}}, + {enemySpell: true, name: "AmpuleYellow", sfx: "Miss", manacost: 7, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1, delay: 0, range: 50, damage: "crush", speed: 1, playerEffect: {name: "Ampule", damage: "inert"}, + effectTileDurationMod: 10, effectTileAoE: 1.5, effectTile: { + name: "Glue", + duration: 20, + }, + //spellcast: {spell: "Glue", target: "onhit", directional:false, offset: false} + }, + {enemySpell: true, name: "AmpuleRed", sfx: "Miss", manacost: 7, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1, delay: 0, range: 50, damage: "crush", speed: 1, playerEffect: {name: "Ampule", damage: "inert"}, + spellcast: {spell: "SummonRedSlime", target: "onhit", directional:true, offset: false}}, + + {name: "ManyOrbs", sfx: "MagicSlash", minRange: 0, manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + spellcast: {spell: "ZombieOrbMini", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 2.5, offset: false}, channel: 3}, + {enemySpell: true, name: "ZombieOrbMini", sfx: "MagicSlash", + noFF: true, manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1.5, delay: 0, range: 50, damage: "chain", speed: 1, + playerEffect: {name: "MysticShock", time: 3}}, + + {enemySpell: true, name: "ZombieOrb", sfx: "MagicSlash", manacost: 5, + noFF: true, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, delay: 0, range: 50, damage: "chain", speed: 1, + playerEffect: {name: "CharmWraps", power: 2, damage: "ice", time: 1}}, + {enemySpell: true, name: "ZombieOrbIce", color: "#00ffff", + noFF: true, specialCD: 12, sfx: "MagicSlash", hitsfx: "Freeze", manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, time: 3, onhit:"", power: 3, delay: 0, range: 50, damage: "ice", speed: 1, + playerEffect: {name: "Freeze", power: 4, damage: "ice", time: 4}}, + + {enemySpell: true, name: "SarcoEngulf", castCondition: "sarcoEngulf", color: "#ff2200", sfx: "Fwoosh", effectTileDurationMod: 10, effectTileDensity: 0.33, effectTile: { + name: "FabricGreen", + duration: 20, + }, manacost: 3, minRange: 0, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 3, range: 2.5, size: 3, aoe: 1, lifetime: 1, damage: "chain", playerEffect: {name: "SarcoEngulf", power: 2, damage: "chain"}}, + + {enemySpell: true, name: "SarcoHex", castCondition: "sarcoHex", color: "#ff2200", sfx: "Fwoosh", manacost: 3, minRange: 0, components: ["Verbal"], + level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 4, range: 2.5, size: 3, aoe: 1, lifetime: 1, damage: "charm", playerEffect: {name: "SarcoHex", power: 2}}, + + + {enemySpell: true, name: "RopeEngulf", color: "#ff2200", sfx: "Struggle", effectTileDurationMod: 10, effectTileDensity: 0.33, effectTile: { + name: "Ropes", + duration: 20, + }, manacost: 3, minRange: 0, + bindType: "MagicRope", components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 4.5, range: 2, size: 3, aoe: 1, lifetime: 1, damage: "chain", playerEffect: {name: "RopeEngulf", power: 3}}, + {enemySpell: true, name: "RopeEngulfWeak", color: "#ff2200", sfx: "Struggle", effectTileDurationMod: 10, effectTile: { + name: "Ropes", + duration: 20, + }, manacost: 4, components: ["Verbal"], + bindType: "Rope", level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 3, range: 3.5, size: 3, aoe: 1, lifetime: 1, damage: "chain", playerEffect: {name: "RopeEngulfWeak", power: 1, damage: "chain"}}, + {enemySpell: true, name: "Entangle", color: "#88ff88", minRange: 0, sfx: "Struggle", effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "Vines", + duration: 20, + }, manacost: 4, + bindType: "Vine", components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 4, range: 6, size: 3, aoe: 1, lifetime: 1, damage: "chain", playerEffect: {name: "VineEngulf", power: 2}}, + + {enemySpell: true, name: "BubbleBurst", color: "#88ffff", minRange: 0, sfx: "Grope", landsfx: "RubberBolt", effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "Water", + duration: 20, + }, manacost: 4, specialCD: 12, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 5, range: 6, size: 3, aoe: 1.5, lifetime: 1, damage: "soap", channel: 2, + playerEffect: {name: "WaterBubble", power: 5}}, + + {enemySpell: true, name: "BubbleBurstLatex", color: "#88aaff", minRange: 0, sfx: "Grope", landsfx: "RubberBolt", effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "LatexThinBlue", + duration: 20, + }, manacost: 6, specialCD: 17, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 5, power: 6, range: 6, size: 3, aoe: 1.5, lifetime: 1, damage: "glue", channel: 4, + playerEffect: {name: "LatexBubble", power: 6}}, + + {enemySpell: true, name: "BubbleBurstSlime", color: "#ff00ff", minRange: 0, sfx: "Grope", landsfx: "RubberBolt", effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "Slime", + duration: 20, + }, manacost: 4, specialCD: 16, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 5, power: 6, range: 6, size: 3, aoe: 1.5, lifetime: 1, damage: "glue", channel: 4, + playerEffect: {name: "SlimeBubble", power: 6, time: 4}}, + + {enemySpell: true, name: "CursingCircle", color: "#FF5277", minRange: 0, sfx: "Fwoosh", bulletSpin: 0.1, specialCD: 12, + selfcast: true, noTerrainHit: true, + manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 4, delay: 3, power: 4, range: 7, size: 5, aoe: 2.5, lifetime: 1, damage: "soul", + playerEffect: {name: "CursingCircle", count: 1, kind: "cursedCollar", power: 3.5, damage: "soul", time: 40}}, + {enemySpell: true, name: "CursingCircle2", color: "#8f52ff", minRange: 0, sfx: "Fwoosh", bulletSpin: 0.1, specialCD: 12, + selfcast: true, noTerrainHit: true, + manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 4, delay: 3, power: 4, range: 7, size: 5, aoe: 2.5, lifetime: 1, damage: "soul", + playerEffect: {name: "CursingCircle", count: 1, kind: "cursedCollar2", power: 3.5, damage: "soul", time: 40}}, + + {enemySpell: true, name: "GravityPull", meleeOrigin: true, color: "#dddddd", minRange: 0, sfx: "Teleport", bulletSpin: 0.25, hideWarnings: true, + manacost: 3, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 1, range: 3.5, size: 5, aoe: 2.5, lifetime: 1, damage: "cold", playerEffect: {name: "GravityPull", dist: 2}}, + + {enemySpell: true, name: "GravityPullEarth", specialCD: 7, color: "#ff8933", minRange: 0, sfx: "Teleport", bulletSpin: 0.25, hideWarnings: true, + manacost: 3, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 3, delay: 2, power: 1, range: 4.5, size: 5, aoe: 2.5, lifetime: 1, damage: "crush", playerEffect: {name: "GravityPull", dist: 2, power: 2, damage: "crush"}}, + + {enemySpell: true, name: "CrushingFate", color: "#dddddd", minRange: 0, sfx: "MagicSlash", bulletSpin: 0.25, + manacost: 7, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 4, delay: 6, power: 5, range: 7, size: 5, aoe: 2.5, lifetime: 1, damage: "crush", playerEffect: {name: "MoonBondage", count: 2, kind: "mithrilRestraints"}}, + {enemySpell: true, name: "BoundByFate", color: "#dddddd", minRange: 0, sfx: "MagicSlash", bulletSpin: -0.25, + manacost: 7, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 4, range: 7, size: 3, aoe: 1.5, lifetime: 1, damage: "soul", playerEffect: {name: "BoundByFate", time: 6}}, + {enemySpell: true, name: "Taunt", color: "#ff5277", minRange: 0, sfx: "MagicSlash", bulletSpin: -0.25, + manacost: 6, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 5.5, range: 5.5, size: 3, aoe: 1.5, lifetime: 1, damage: "soul", playerEffect: {name: "Taunted", time: 6}}, + + + {name: "Gunpowder", landsfx: "Bones", tags: ["fire", "aoe", "offense"], noise: 0, sfx: "FireSpell", school: "Elements", manacost: 0, + noMiscast: true, + components: ["Arms"], level:1, type:"hit", onhit:"aoe", delay: 1, power: 0, range: 3.5, size: 3, aoe: 1, lifetime: 1, damage: "inert", + effectTileDurationMod: 0, effectTile: { + name: "Gunpowder", + duration: 400, + } + }, + {name: "UniversalSolvent", landsfx: "Acid", + tags: ["acid", "alchemy", "offense", "utility"], noise: 0, sfx: "PotionDrink", school: "Elements", manacost: 0, + noMiscast: true, noAggro: true, + components: [], special: "UniversalSolvent", + level:1, type:"special", onhit:"aoe", delay: 1, power: 9, range: 2.5, size: 3, aoe: 0.5, lifetime: 1, damage: "acid", + effectTileDurationMod: 2, effectTile: { + name: "Acid", + duration: 4, + } + }, + + {enemySpell: true, name: "Feathers", color: "#ffffff", sfx: "Tickle", manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 5, range: 6, size: 3, aoe: 1.5, lifetime: 1, damage: "tickle", playerEffect: {name: "Damage"}}, + {enemySpell: true, name: "NurseBola", color: "#ff2200", sfx: "Miss", manacost: 5, components: ["Arms"], + bindType: "Rope", + level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 3, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "NurseBola"}}, // Throws a chain which stuns the target for 1 turn + {enemySpell: true, name: "NurseSyringe", color: "#ff00ff", minRange: 1.5, sfx: "Miss", manacost: 2, castRange: 6, components: ["Arms"], level:1, speed: 1, + type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "pain", playerEffect: {name: "NurseSyringe", power: 4, type: "poison", time: 8},}, + {enemySpell: true, name: "RibbonBurst", color: "#ff00ff", sfx: "MagicSlash", manacost: 5, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 4, range: 6, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsRibbons", tags: ["magicRibbons"], power: 3, damage: "chain", count: 2, noGuard: true}}, + {enemySpell: true, name: "Spores", bulletSpin: 0.1, color: "#6733aa", sfx: "MagicSlash", manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 3, range: 6, size: 3, aoe: 1.5, lifetime: 1, damage: "poisongas", playerEffect: {name: "Spores", power: 2, damage: "poisongas"}}, + {enemySpell: true, name: "DragonFlowerSpores", bulletSpin: 0.1, hideWarnings: true, selfcast: true, color: "#6733aa", sfx: "MagicSlash", manacost: 4, components: ["Verbal"], level:1, type:"inert", + onhit:"aoe", time: 5, delay: 2, power: 1.5, range: 2.5, size: 3, aoe: 1.5, lifetime: 1, damage: "poisongas", playerEffect: { + name: "DragonFlowerSpores", + power: 1.5, amount: 0.75, damage: "poisongas" + }}, + + + {enemySpell: true, name: "SporesHappy", bulletSpin: 0.1, + color: "#ff00ff", sfx: "FireSpell", noCastMsg: true, selfcast: true, manacost: 3, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 1, power: 2.5, range: 3, size: 3, aoe: 1.5, lifetime: 1, damage: "happygas", playerEffect: {name: "SporesHappy", power: 2.5, damage: "happygas"}}, + {enemySpell: true, name: "SporesSick", bulletSpin: 0.1, color: "#55ff55", noCastMsg: true, hitsfx: "DamageWeak", selfcast: true, manacost: 0, components: ["Verbal"], level:1, type:"hit", onhit:"aoe", time: 5, delay: 0, power: 0.5, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "poisongas", playerEffect: {name: "SporesSick", power: 0.5, damage: "poisongas"}}, + {enemySpell: true, name: "SoulCrystalBind", color: "#ff5277", minRange: 0, sfx: "Evil", manacost: 7, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 2, power: 6, range: 6, size: 3, aoe: 1.5, lifetime: 1, damage: "drain", playerEffect: {name: "ObsidianEngulf", count: 1, power: 6, damage: "drain"}}, + + {name: "BombItem", color: "#ff5277", prerequisite: "ApprenticeSummon", tags: ["aoe", "offense"], noise: 5, sfx: "FireSpell", school: "Conjure", manacost: 5, components: ["Verbal"], level:1, + aoetype: "XcrossCrack", + hitevents: [ + {trigger: "afterBulletHit", type: "Crack"}, + ], + block: 1.5, noTerrainHit: true, volatilehit: true, blockType: ["stun", "holy", ...KDIgnitionSources], + effectTileDurationMod: 7, hitSpin: 0.2, effectTile: { + name: "Smoke", + duration: -1, + }, type:"inert", onhit:"lingering", time: 3, delay: 5, power: 10, range: 3, size: 3, aoe: 2, lifetime: 1, damage: "stun", playerEffect: {name: "Damage"}}, + + {name: "DynamiteItem", color: "#ff5277", prerequisite: "ApprenticeSummon", tags: ["aoe", "offense"], noise: 10, sfx: "Lightning", school: "Conjure", manacost: 5, components: ["Verbal"], level:1, + aoetype: "XcrossCrack", + events: [ + {trigger: "bulletTick", type: "EndChance", chance: 0.25, count: 8}, + ], + hitevents: [ + {trigger: "afterBulletHit", type: "Crack"}, + {trigger: "bulletHitEnemy", type: "BreakArmor", power: 2}, + ], + block: 0.5, noTerrainHit: true, volatilehit: true, blockType: ["stun", "holy", ...KDIgnitionSources], + effectTileDurationMod: 7, hitSpin: 0.2, effectTile: { + name: "Cracked", + duration: 13, + }, type:"inert", onhit:"lingering", time: 7, delay: 10, power: 14, range: 3, size: 3, aoe: 3.99, lifetime: 1, damage: "stun", playerEffect: {name: "Damage"}}, + + + {name: "C4Item", color: "#ff5277", prerequisite: "ApprenticeSummon", tags: ["aoe", "offense"], noise: 15, sfx: "Lightning", school: "Conjure", manacost: 5, components: ["Verbal"], level:1, + hitevents: [ + {trigger: "afterBulletHit", type: "Crack"}, + {trigger: "bulletHitEnemy", type: "BreakArmor", power: 5}, + ], + block: 4, noTerrainHit: true, volatilehit: true, blockType: ["stun", "holy", ...KDIgnitionSources], + effectTileDurationMod: 70, hitSpin: 0.2, effectTile: { + name: "RubbleNoMend", + duration: 130, + }, type:"inert", onhit:"lingering", time: 10, delay: 60, power: 21, range: 3, size: 3, aoe: 4.99, lifetime: 1, damage: "stun", playerEffect: {name: "Damage"}}, + + {enemySpell: true, name: "MinerBomb", color: "#ff2200", selfcast: true, noise: 5, sfx: "FireSpell", hitsfx: "FireSpell", school: "Conjure", manacost: 5, components: ["Verbal"], level:1, hideWarnings: true, + aoetype: "crossCrack", + hitevents: [ + {trigger: "afterBulletHit", type: "Crack"}, + ], + + block: 1.5, noTerrainHit: true, volatile: true, blockType: [...KDIgnitionSources], + effectTileDurationMod: 7, effectTile: { + name: "Smoke", + duration: -1, + }, type:"inert", onhit:"lingering", delay: 5, power: 6, range: 3, size: 3, aoe: 2, lifetime: 1, damage: "fire", playerEffect: {name: "HeatBlast", time: 3, damage: "fire", power: 6}}, + + {name: "ManyChains", sfx: "MagicSlash", minRange: 0, manacost: 3, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + spellcast: {spell: "WitchChainBolt", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 1, offset: false}, channel: 3}, + + {enemySpell: true, name: "WitchChainBolt", color: "#ffffff", sfx: "FireSpell", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", bind: 12, time: 6, power: 6, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "SingleChain", time: 1}, effectTileDurationMod: 10, effectTile: { + name: "Chains", + duration: 20, + },}, // Throws a chain which stuns the target for 1 turn + {enemySpell: true, name: "MagicChain", color: "#ff00ff", sfx: "FireSpell", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 6, power: 4, bindType: "Metal", bind: 3, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "SingleMagicBind", time: 1, msg: "MChain", tags: ["chainRestraintsMagic"], sfx: "Chain"}, effectTileDurationMod: 10, effectTile: { + name: "Chains", + duration: 20, + },}, + {enemySpell: true, name: "MagicBelt", color: "#ff00ff", sfx: "FireSpell", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 6, power: 4, bindType: "Leather", bind: 6, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "SingleMagicBind", time: 1, msg: "MBelt", tags: ["beltRestraintsMagic"], sfx: "MagicSlash"}, effectTileDurationMod: 10, effectTile: { + name: "Belts", + duration: 20, + },}, + {enemySpell: true, name: "MagicRope", color: "#ff00ff", sfx: "FireSpell", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 6, power: 4, bindType: "MagicRope", bind: 8, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "SingleMagicBind", time: 1, msg: "MRope", tags: ["ropeMagicStrong"], sfx: "MagicSlash"}, effectTileDurationMod: 10, effectTile: { + name: "Ropes", + duration: 20, + },}, + {enemySpell: true, name: "BanditBola", bindType: "Rope", color: "#ff2200", sfx: "Miss", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1.5, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "BanditBola"}}, // Throws a chain which stuns the target for 1 turn + + + + {enemySpell: true, name: "WitchRope", bindType: "Rope", color: "#ffae70", sfx: "Miss", effectTileDurationMod: 10, effectTile: { + name: "Ropes", + duration: 20, + }, manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, delay: 0, range: 50, damage: "chain", speed: 3, playerEffect: {name: "SingleRope"}}, + {allySpell: true, name: "PlayerBola", bindType: "Rope", fastStart: true, color: "#ff2200", noMiscast: true, sfx: "Miss", manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", time: 4, power: 3, bind: 9, delay: 0, range: 50, damage: "chain", speed: 2, playerEffect: {name: "BanditBola", time: 1}}, // Throws a chain which stuns the target for 1 turn + + {allySpell: true, name: "LeashSpell", fastStart: true, color: "#e64539", noMiscast: true, + sfx: "Miss", manacost: 0, components: ["Arms"], level:1, type:"special", special: "LeashSpell", + onhit:"", power: 0, delay: 0, range: 1.5, damage: "chain", speed: 2}, + + {enemySpell: true, name: "RestrainingDevice", bindType: "Metal", color: "#19fac1", sfx: "Miss", manacost: 6, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", + effectTileDurationMod: 8, effectTile: { + name: "Chains", + duration: 10, + }, + power: 6, delay: 0, range: 3.99, damage: "chain", speed: 1, playerEffect: {name: "RestrainingDevice", count: 3, time: 3, power: 5, damage: "chain"}}, + + {enemySpell: true, name: "MiniCable", bindType: "Metal", color: "#19fac1", sfx: "MechLaunch", manacost: 6, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", + effectTileDurationMod: 8, effectTile: { + name: "Chains", + duration: 10, + }, + power: 6, delay: 0, range: 4.99, damage: "chain", speed: 1, playerEffect: {name: "RestrainingDevice", count: 1, time: 3, power: 5, damage: "chain"}}, + {enemySpell: true, name: "ManyCables", sfx: "MechEngage", minRange: 0, manacost: 12, color: "#19fac1", projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", + time: 5, delay: 3, power: 3, range: 6.99, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + spellcast: {spell: "MiniCable", sfx: "MechLaunch", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 1, offset: false}, channel: 3}, + + {name: "ManyShadowHands", sfx: "MagicSlash", minRange: 0, manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + spellcast: {spell: "ShadowBolt", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 1.5, offset: false}, channel: 3}, + {name: "ManyObsidianBolts", sfx: "MagicSlash", minRange: 0, manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + spellcast: {spell: "ObsidianBolt", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 1.5, offset: false}, channel: 3}, + {name: "ManyMithrilBolts", sfx: "MagicSlash", minRange: 0, manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + spellcast: {spell: "MithrilBolt", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 1.5, offset: false}, channel: 3}, + + {enemySpell: true, name: "ShadowGrasp", bindType: "Magic", color: "#ff00ff", minRange: 0, landsfx: "MagicSlash", manacost: 7, components: ["Legs"], level:1, type:"inert", onhit:"aoe", + bulletSpin: 0.5, hitSpin: 0.3, + time: 2, delay: 1, range: 4, power: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "cold", playerEffect: {name: "ShadowBolt", count: 3, time: 4, power: 5, damage: "cold"}, + }, + + {enemySpell: true, name: "FuukaOrb", bindType: "Magic", color: "#aaaaaa", sfx: "Evil", + //hideWarnings: true, + minRange: 0, + noFF: true, + hitSpin: 0.25, + noDirectionOffset: true, + manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", + power: 8, delay: 0, range: 50, damage: "arcane", speed: 0.5, + playerEffect: {name: "FuukaOrb", type: "Purple", count: 1, time: 30, power: 4, damage: "arcane"}}, + + {enemySpell: true, name: "FuukaOrbMulti", bindType: "Magic", color: "#aaaaaa", sfx: "Evil", + //hideWarnings: true, + shotgunCount: 3, shotgunDistance: 6, shotgunSpread: 1, shotgunSpeedBonus: 0, shotgunFan: true, + minRange: 0, + noFF: true, + hitSpin: 0.25, + noDirectionOffset: true, + manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", + power: 8, delay: 0, range: 50, damage: "arcane", speed: 0.5, + playerEffect: {name: "FuukaOrb", type: "Purple", count: 1, time: 30, power: 4, damage: "arcane"}}, + + {enemySpell: true, name: "ShadowGraspMulti", bindType: "Magic", color: "#aa55ff", sfx: "Evil", + bulletColor: 0xaa55ff, + bulletLight: 4, + bulletSpin: 0.25, + hitSpin: 0.25, + castCondition: "notImmobile", + //hideWarnings: true, + noTerrainHit: true, + shotgunCount: 5, shotgunDistance: 6, shotgunSpread: 2, shotgunSpeedBonus: 0, shotgunFan: true, + minRange: 0, + noDirectionOffset: true, + manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", + power: 2, time: 12, delay: 0, range: 50, damage: "ice", speed: 0.5, + playerEffect: {name: "ShadowSeal", type: "Purple", count: 1, time: 30, power: 4, damage: "ice"}}, + + {enemySpell: true, name: "SealingBolt", faction: "Natural", bindType: "Magic", color: "#6a15fa", sfx: "Evil", manacost: 5, components: ["Arms"], level:1, type:"bolt", + pierceEnemies: true, + projectileTargeting:true, onhit:"", power: 3, delay: 0, range: 50, damage: "cold", speed: 2, playerEffect: {name: "ShadowBolt", count: 1, time: 3, power: 3, damage: "cold"}}, + + {enemySpell: true, name: "ShadowBolt", bindType: "Magic", color: "#6a15fa", sfx: "Evil", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 3, delay: 0, range: 50, damage: "cold", speed: 2, playerEffect: {name: "ShadowBolt", count: 1, time: 3, power: 3, damage: "cold"}}, + {enemySpell: true, name: "ObsidianBolt", bindType: "Metal", color: "#ff5277", sfx: "Evil", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 3, delay: 0, range: 50, damage: "cold", speed: 2, playerEffect: {name: "ObsidianBolt", count: 1, time: 3, power: 3, damage: "cold"}}, + {enemySpell: true, name: "LockBullet", bindType: "Magic", color: "#9f96d5", sfx: "LockLight", + minRange: 0, + noDirectionOffset: true, + manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", + power: 1, pierceEnemies: true, delay: 0, range: 50, damage: "chain", speed: 2, + playerEffect: {name: "LockBullet", type: "Purple", count: 1, time: 9, power: 2, damage: "chain"}}, + + {enemySpell: true, name: "LatexSpray", bindType: "Latex", color: "#2789cd", sfx: "RubberBolt", + manacost: 2.5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 3.5, pierceEnemies: true, delay: 0, range: 5.5, damage: "glue", speed: 1.5, + playerEffect: {name: "LatexSpray", count: 1, time: 4, power: 2.5, mult: 1, damage: "glue"}}, + + + {enemySpell: true, name: "MithrilBolt", bindType: "Rope", color: "#999999", sfx: "Evil", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 3, delay: 0, range: 50, damage: "cold", speed: 2, playerEffect: {name: "MithrilBolt", count: 1, time: 3, power: 3, damage: "cold"}}, + {enemySpell: true, name: "RubberBolt", bindType: "Slime", color: "#ff3388", sfx: "RubberBolt", manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "glue", speed: 2, playerEffect: {name: "RubberBolt", count: 1, time: 4, power: 4, damage: "glue"}}, + {enemySpell: true, name: "EncaseBolt", bindType: "Slime", color: "#a04abd", sfx: "RubberBolt", manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, delay: 0, range: 50, damage: "glue", speed: 2, playerEffect: {name: "EncaseBolt", count: 1, time: 4, power: 2, damage: "glue"}}, + {enemySpell: true, name: "EncaseBoltDrone", bindType: "Slime", color: "#a04abd", sfx: "RubberBolt", manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1, delay: 0, range: 50, damage: "glue", speed: 2, playerEffect: {name: "EncaseBoltDrone", count: 1, time: 4, power: 1, damage: "glue"}}, + + {enemySpell: true, name: "RubberNuke", bindType: "Slime", color: "#ff3388", sfx: "Missile", manacost: 8, components: ["Arms"], + spellcast: {spell: "RubberNukeExplosion", target: "onhit", directional:true, offset: false}, + events: [{type: "RubberMissileHoming", trigger: "bulletAfterTick", power: 1.0, dist: 5.5, count: 0.25, limit: 0.7},], + level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 12, delay: 0, range: 50, damage: "crush", speed: 0.5, playerEffect: {name: "RubberMissile", count: 4, time: 4, power: 8, damage: "glue"}}, + {enemySpell: true, name: "RubberNukeExplosion", landsfx: "Lightning", bindType: "Slime", school: "Element", manacost: 0, components: [], + effectTileDurationMod: 3, effectTile: { + name: "Slime", + duration: 12, + }, + level:1, type:"hit", onhit:"instant", noTerrainHit: true, power: 20, delay: 1, range: 2.5, size: 5, aoe: 2.5, lifetime: 1, damage: "glue"}, + + {enemySpell: true, name: "RubberMissile", bindType: "Slime", color: "#ff3388", sfx: "Missile", manacost: 8, components: ["Arms"], + spellcast: {spell: "RubberMissileExplosion", target: "onhit", directional:true, offset: false}, + events: [{type: "RubberMissileHoming", trigger: "bulletAfterTick", power: 1.0, dist: 5.5, count: 0.5, limit: 0.7},], + level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2.0, delay: 0, range: 50, damage: "crush", speed: 0.5, playerEffect: {name: "RubberMissile", count: 2, time: 4, power: 4, damage: "glue"}}, + {enemySpell: true, name: "RubberMissileExplosion", landsfx: "Lightning", bindType: "Slime", school: "Element", manacost: 0, components: [], + effectTileDurationMod: 3, effectTile: { + name: "Slime", + duration: 12, + }, + level:1, type:"hit", onhit:"instant", noTerrainHit: true, power: 1.5, bind: 7, delay: 1, range: 1.5, size: 3, aoe: 1.5, lifetime: 1, damage: "glue"}, + + + + {enemySpell: true, slowStart: true, name: "EnemySteelRainPlug", color: "#ffffff", tags: ["binding", "metal", "bolt", "offense"], prerequisite: "ApprenticeMetal", sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 2, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", time: 0, power: 2.0, delay: 0, range: 15, damage: "pierce", speed: 3, bulletLifetime: 5, playerEffect: {name: "Bind", damage: "pierce", power: 2, tag: "plugSpell"}, + bulletColor: 0xffffff, bulletLight: 1, + events: [ + {type: "PlugEnemy", trigger: "bulletHitEnemy"}, + ] + }, + {enemySpell: true, name: "EnemySteelRainBurst", tags: ["binding", "metal", "bolt", "offense"], prerequisite: "SteelRainPlug", sfx: "MagicSlash", hitsfx: "HeavySwing", school: "Conjure", manacost: 5, components: ["Arms"], level:1, + upcastFrom: "SteelRainPlug", upcastLevel: 1, + projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, type:"inert", onhit:"aoe", + time: 0, delay: 1, power: 5, range: 12, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", + shotgunCount: 4, shotgunDistance: 4, shotgunSpread: 1, shotgunSpeedBonus: 1, + spellcast: {spell: "SteelRainPlug", target: "target", directional:true, randomDirectionPartial: true, aimAtTarget: true, noTargetMoveDir: true, offset: false}}, + + {enemySpell: true, name: "RestrainingBolt", bindType: "Magic", + color: "#ffaa57", sfx: "Miss", + hitsfx: "FireSpell", manacost: 3, components: ["Arms"], level: 1, type:"bolt", + projectileTargeting:true, slowStart: true, onhit:"", power: 3, bind: 2.5, delay: 0, + range: 10.5, damage: "chain", + speed: 4, playerEffect: {name: "RestrainingBolt", count: 1, dist: 1, sfx: "MagicSlash"}}, + + {name: "EnemyWinterblast", enemySpell: true, color: "#92e8c0", tags: ["ice", "bolt", "offense", "utility", "aoe"], prerequisite: "Snowball", sfx: "LesserFreeze", hitsfx: "LesserFreeze", school: "Elements", + noise: 2, + specialCD: 9, + manacost: 0, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, pierceEnemies: true, delay: 0, range: 50, damage: "frost", speed: 2, + bulletColor: 0x92e4e8, bulletLight: 5, + effectTileDurationModTrail: 4, effectTileTrailAoE: 1.5, effectTileTrail: { + name: "Ice", + duration: 10, + }, + playerEffect: {name: "Chill", damage: "ice", power: 1, time: 3}, + events: [{type: "ElementalOnSlowOrBindOrDrench", trigger: "bulletHitEnemy", damage: "ice", time: 4, power: 0},], + + }, + {enemySpell: true, name: "DragonIceBolt", color: "#92e8c0", tags: ["ice", "bolt", "offense"], sfx: "MagicSlash", hitsfx: "Freeze", school: "Elements", manacost: 0, components: ["Arms"], level:1, type:"bolt", + effectTileDurationMod: 10, effectTile: { + name: "Ice", + duration: 20, + }, + minRange: 0, + shotgunCount: 3, shotgunDistance: 6, shotgunSpread: 0.6, shotgunSpeedBonus: 0, shotgunFan: true, + castCondition: "DragonChanneled", + onhit:"", time: 4, power: 1, delay: 0, range: 50, damage: "ice", speed: 2, playerEffect: {name: "Chill", damage: "ice", power: 1, time: 3}, + events: [{type: "ElementalOnSlowOrBindOrDrench", trigger: "bulletHitEnemy", damage: "ice", time: 4, power: 0},]}, + + {enemySpell: true, name: "IceBreathChannel", bindType: "Magic", color: "#92e8c0", sfx: "MagicSlash", landsfx: "MagicSlash", manacost: 1, components: ["Arms"], + hitSpin: 0.5, bulletSpin: 0.5, + pierceEnemies: true, + hideWarnings: true, + selfcast: true, + castCondition: "NotDragonChanneled", + events: [ + {type: "MagicMissileChannel", trigger: "bulletTick"}, + {type: "IceBreathChannel", trigger: "bulletDestroy", time: 9}, + ], + level:1, type:"inert", onhit:"aoe", delay: 5, power: 0, range: 10, size: 3, lifetime: 1, damage: "inert" + }, + + {enemySpell: true, name: "MagicMissileChannel", bindType: "Magic", color: "#ffaa77", sfx: "MagicSlash", landsfx: "MagicSlash", manacost: 1, components: ["Arms"], + specialCD: 8, + hitSpin: 0.5, bulletSpin: 0.5, + pierceEnemies: true, + hideWarnings: true, + selfcast: true, + castCondition: "MagicMissileChannel", + events: [ + {type: "v", trigger: "bulletTick"}, + {type: "MagicMissileChannel", trigger: "bulletDestroy", count: 8, spell: "MagicMissile2", dist: 10, time: 21}, + ], + level:1, type:"inert", onhit:"aoe", delay: 6, power: 0, range: 10, size: 3, lifetime: 1, damage: "inert" + }, + + {enemySpell: true, name: "Aim_MaidKnightLight", color: "#ffffff", + manacost: 1, components: ["Arms"], + pierceEnemies: true, + hideWarnings: true, + projectileTargeting: true, + meleeOrigin: true, + minRange: 1.5, + special: "Aim_MaidKnightLight", + level:1, type:"special", onhit:"", delay: 0, power: 0, range: 9, size: 3, lifetime: 1, damage: "inert" + }, + + + {enemySpell: true, name: "MagicMissile", bindType: "Magic", color: "#ffaa77", sfx: "MagicSlash", landsfx: "MagicSlash", manacost: 4, components: ["Arms"], + faction: "Warden", + hitSpin: 1, bulletSpin: 1, + bulletLifetime: 12, + level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2.4, delay: 0, range: 12, damage: "arcane", speed: 2, playerEffect: {name: "MagicMissile", count: 2, dist: 1, sfx: "MagicSlash"}}, + {enemySpell: true, name: "MagicMissile2", bindType: "Magic", color: "#ffaa77", sfx: "MagicSlash", landsfx: "MagicSlash", manacost: 4, components: ["Arms"], + faction: "Warden", + hitSpin: 2, bulletSpin: 1.4, + minRange: 0, + bulletLifetime: 12, + noDirectionOffset: true, + events: [{type: "RubberMissileHoming", trigger: "bulletAfterTick", power: 0.9, dist: 15, count: 0.2, limit: 0},], + level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2.4, delay: 0, range: 12, damage: "arcane", speed: 2, playerEffect: {name: "MagicMissile", count: 1, dist: 1, sfx: "MagicSlash"}}, + + {enemySpell: true, name: "WardenCageDrop", color: "#ffffff", minRange: 0, landsfx: "MagicSlash", manacost: 2, components: [], level:1, type:"inert", onhit:"aoe", + castCondition: "WardenCageDrop", + power: 2.5, time: 1, delay: 5, range: 8, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "CageDrop", time: 1}}, + + {enemySpell: true, name: "ShadowShroud", tags: ["aoe", "buff", "utility", "stealth", "defense"], sfx: "Fwoosh", school: "Illusion", manacost: 2, components: ["Verbal"], level:1, type:"inert", + specialCD: 8, + onhit:"", time:13, aoe: 1.5, power: 0, delay: 18, range: 9.5, size: 3, damage: "", + events: [{type: "CreateSmoke", trigger: "bulletTick", kind: "Smoke", aoe: 2.5, chance: 0.25},]}, + + {enemySpell: true, name: "ShadowShroudGirl", tags: ["aoe", "buff", "utility", "stealth", "defense"], sfx: "Fwoosh", school: "Illusion", manacost: 0, components: ["Verbal"], level:1, type:"inert", + specialCD: 14, + minRange: 0, + selfcast: true, + onhit:"", time:13, aoe: 1.5, power: 0, delay: 9, range: 9.5, size: 1, damage: "", + events: [{type: "CreateSmoke", trigger: "bulletTick", kind: "Smoke", aoe: 3.5, chance: 0.5},]}, + + {enemySpell: true, name: "ShadowShroudTele", tags: ["aoe", "buff", "utility", "stealth", "defense"], school: "Illusion", manacost: 1, components: ["Verbal"], level:1, type:"hit", + onhit:"", time:8, aoe: 6.5, power: 0, delay: 8, range: 12, size: 3, damage: "", noSprite: true, + events: [ + {trigger: "afterBulletHit", type: "ShadowShroudTele", aoe: 6.5}, + ] + }, + + {enemySpell: true, name: "DarkTele", tags: ["aoe", "buff", "utility", "stealth", "defense"], school: "Illusion", manacost: 0, components: ["Verbal"], level:1, type:"hit", + onhit:"", time:8, aoe: 6.5, power: 0, delay: 8, range: 12, size: 3, damage: "", noSprite: true, + minRange: 0, + events: [ + {trigger: "afterBulletHit", type: "DarkTele", aoe: 6.5}, + ] + }, + + {enemySpell: true, name: "ShadowBubble", bindType: "Magic", color: "#9574ff", sfx: "FireSpell", landsfx: "Teleport", manacost: 1, components: ["Arms"], + minRange: 0, + bulletLifetime: 12, + noDirectionOffset: true, + events: [ + {type: "RubberMissileHoming", trigger: "bulletAfterTick", power: 0.4, dist: 15, count: 0.2, limit: 0} + ], + level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, delay: 0, range: 50, damage: "cold", speed: 0.5, + playerEffect: {name: "Bind", damage: "cold", power: 2, tag: "shadowLatexRestraints"}}, + + + {enemySpell: true, name: "OneBarMissile", + bindType: "Metal", color: "#ffffff", sfx: "MagicSlash", landsfx: "MagicSlash", + manacost: 6, components: ["Arms"], specialCD: 25, + noTerrainHit: true, + pierceEnemies: true, + faction: "Warden", + minRange: 0, + bulletLifetime: 32, + noDirectionOffset: true, + trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"cast", trailChance: 1.0, trailOnSelf: true, + trailcast: {spell: "SummonOneBar", target: "onhit", directional:true, offset: false}, + effectTileDurationModTrail: 4, effectTileTrail: { + name: "Cracked", + duration: 50, + }, + events: [{type: "RubberMissileHoming", trigger: "bulletAfterTick", power: 0.4, + dist: 15, count: 0.2, limit: 0},], + bind: 8, + level:1, type:"bolt", projectileTargeting:true, onhit:"", power: .1, delay: 0, range: 50, damage: "crush", + speed: 0.5, playerEffect: {name: "Bind", damage: "pierce", power: 7.2, tag: "onebar"}}, + {enemySpell: true, name: "SummonOneBar", noSprite: true, minRange: 0, manacost: 2, specialCD: 12, + noSumMsg: true, + faction: "Warden", + effectTileDurationModTrail: 12, effectTileTrail: { + name: "Chains", + duration: 10, + }, + effectTileDensity: 0.15, + effectTileAoE: 1.5, + components: ["Verbal"], level:4, type:"hit", onhit:"summon", summon: [{name: "OneBar", faction: "Enemy", count: 1, time: 0, bound: true}], power: 0, time: 10, delay: 0, range: 40, size: 1, aoe: 0.5, lifetime: 1, damage: "inert"}, + + + {enemySpell: true, name: "CelestialBolt", bindType: "Rope", color: "#ffff44", sfx: "MagicSlash", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 3, delay: 0, range: 50, damage: "holy", bind: 6, speed: 4, playerEffect: {name: "CelestialBolt", count: 2, time: 3, power: 3, damage: "holy"}}, + {enemySpell: true, name: "WolfCrackle", color: "#8789fd", tags: ["electric", "offense", "aoe"], prerequisite: "Shock", noise: 6, sfx: "Shock", slowStart: true, + effectTileDurationModTrail: 2, effectTileTrail: { + name: "Sparks", + duration: 3, + }, + school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", piercing: true, projectileTargeting:true, nonVolatile: true, onhit:"", power: 2.0, delay: 0, time: 1, range: 4, speed: 4, size: 1, damage: "electric", + trailPower: 0, trailLifetime: 1.1, trailTime: 4, trailDamage:"inert", trail:"lingering", trailChance: 1.0, playerEffect: {name: "Shock", time: 1}}, + + + {enemySpell: true, name: "MummyBolt", color: "#88ff88", sfx: "FireSpell", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "soul", speed: 3, playerEffect: {name: "MysticShock", time: 3}}, + {enemySpell: true, name: "RobotBolt", color: "#ff5277", sfx: "Laser", manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "electric", speed: 2, playerEffect: {name: "RobotShock", time: 2}}, + {enemySpell: true, name: "RubberBullets", bindType: "Slime", color: "#e7cf1a", + noise: 8, + bindTags: ["captureFoamRandom"], + minRange: 2.9, sfx: "Gunfire", manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, time: 0, delay: 0, range: 50, damage: "glue", speed: 3, playerEffect: {name: "RubberBullets", power: 4, count: 1, damage: "glue"}}, + {enemySpell: true, name: "RubberSniper", bindType: "Slime", color: "#e7cf1a", minRange: 1.5, + noise: 9, + sfx: "Sniper2", manacost: 2, components: ["Arms"], level:1, type:"bolt", + bindTags: ["captureFoamRandom"], + projectileTargeting:true, onhit:"", power: 8, time: 0, delay: 0, range: 50, + damage: "glue", speed: 5, playerEffect: {name: "RubberSniper", power: 8, count: 3, damage: "glue"}}, + {name: "PlayerRubberSniper", bindType: "Slime", color: "#e7cf1a", minRange: 1.5, + noise: 9, + sfx: "Sniper2", manacost: 0, components: ["Arms"], level:1, type:"bolt", + projectileTargeting:true, onhit:"", power: 8, time: 0, delay: 0, range: 50, + noMiscast: true, + bindTags: ["captureFoamRandom"], + events: [ + {trigger: "bulletHitEnemy", type: "Blaster"}, + ], + damage: "glue", speed: 5, playerEffect: {name: "RubberSniper", power: 8, count: 3, damage: "glue"}}, + + {enemySpell: true, name: "Minigun", castCondition: "Windup_Ready", bindType: "Slime", color: "#e7cf1a", minRange: 1.5, sfx: "MiniFire", manacost: 0, components: ["Arms"], + fastStart: true, + shotgunCount: 3, shotgunDistance: 6, shotgunSpread: 1.5, shotgunSpeedBonus: 1.5, + level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 1, time: 0, delay: 0, range: 50, damage: "glue", speed: 1.5, playerEffect: {name: "RubberBullets", power: 1, count: 1, damage: "glue"}}, + {enemySpell: true, name: "MinigunWindup", castCondition: "Windup_Start", minRange: 1.5, + tags: [], sfx: "MiniWind", school: "Any", manacost: 0, components: [], noise: 3, + noTargetPlayer: true, mustTarget: true, level:1, type:"special", onhit:"", special: "Windup", noSprite: true, evadeable: false, noblock: true, power: 0, time: 3, range: 20, size: 1, lifetime: 1, aoe: 0.5, damage: "inert", + }, + + {enemySpell: true, name: "Vineexp", color: "#88ff88", bindType: "Vine", minRange: 0, landsfx: "Bones", manacost: 5, + effectTileDurationMod: 8, effectTile: { + name: "Vines", + duration: 20, + }, + components: ["Arms"], level:1, type:"inert", onhit:"aoe", power: 2.5, bind: 2.2, time: 1, delay: 1, range: 4, size: 1, aoe: 0.75, lifetime: 1, damage: "grope", playerEffect: {name: "VineEngulf", power: 2}}, + + {enemySpell: true, name: "Bubbleexp", color: "#4444ff", bindType: "Magic", minRange: 0, landsfx: "Bones", manacost: 5, block: 5, + effectTileDurationMod: 8, effectTile: { + name: "Water", + duration: 20, + }, + components: ["Arms"], level:1, type:"inert", onhit:"aoe", power: 2.0, bind: 1, time: 1, delay: 1, range: 4, size: 1, aoe: 0.75, lifetime: 1, damage: "soap", playerEffect: {name: "WaterBubble", time: 8, power: 2, damage: "soap"}}, + {enemySpell: true, name: "Fireexp", color: "#e7cf1a", minRange: 0, landsfx: "FireSpell", manacost: 5, + effectTileDurationMod: 2, effectTile: { + name: "Ember", + duration: 3, + }, + components: ["Arms"], level:1, type:"inert", onhit:"aoe", power: 3.5, time: 1, delay: 1, range: 4, size: 1, aoe: 0.75, lifetime: 1, damage: "fire", playerEffect: {name: "HeatBlast", time: 1, damage: "fire", power: 5}}, + {enemySpell: true, name: "Iceexp", color: "#00ffff", minRange: 0, landsfx: "Freeze", manacost: 5, + effectTileDurationMod: 5, effectTile: { + name: "Ice", + duration: 5, + }, + components: ["Arms"], level:1, type:"inert", onhit:"aoe", power: 3.5, time: 1, delay: 1, range: 4, size: 1, aoe: 0.75, lifetime: 1, damage: "ice", playerEffect: {name: "Chill", damage: "ice", power: 3, time: 3}}, + + {name: "TomeArcane", school: "Element", manacost: 0, components: [], level:1, type:"hit", onhit:"instant", + + noTerrainHit: true, power: 5, delay: 1, range: 1.5, size: 3, aoe: 1.5, lifetime: 1, damage: "arcane", playerEffect: {name: "HeatBlast", time: 1, damage: "arcane", power: 5}}, + + {name: "TomeBondage", school: "Element", manacost: 0, components: [], level:1, type:"hit", onhit:"instant", + + noTerrainHit: true, power: 2.0, bind: 10, bindType: "Magic", delay: 1, range: 1.5, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsMagicChainsWeak", tags: ["chainRestraintsMagic"], count: 3, power: 5.0, damage: "chain"}}, + + {enemySpell: true, name: "HeatBolt", color: "#e7cf1a", sfx: "FireSpell", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "fire", + speed: 2, playerEffect: {name: "HeatBlast", time: 1, damage: "fire", power: 5}}, + {enemySpell: true, name: "CrystalBolt", color: "#ff5277", sfx: "FireSpell", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2.5, delay: 0, range: 8, damage: "soul", + shotgunCount: 5, shotgunDistance: 6, shotgunSpread: 1, shotgunSpeedBonus: 0, shotgunFan: true, + meleeOrigin: true, + events: [ + {trigger: "afterBulletHit", type: "CrystalBolt"}, + ], + speed: 2.5, playerEffect: {name: "CrystalBind", time: 1}}, + {name: "CrystalBoltMany", sfx: "MagicSlash", color: "#ff5277", minRange: 0, manacost: 4, projectileTargeting: true, + noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, + meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + spellcast: {spell: "CrystalBoltSingle", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 2.5, offset: false}, channel: 3}, + + {enemySpell: true, name: "CrystalBoltSingle", color: "#ff5277", sfx: "FireSpell", manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2.5, delay: 0, range: 8, damage: "soul", + meleeOrigin: true, + noFF: true, + events: [ + {trigger: "afterBulletHit", type: "CrystalBolt"}, + ], + speed: 2.5, playerEffect: {name: "CrystalBind", time: 1}}, + + {name: "CrystalSlash", tags: ["aoe", "offense", "crystal"], sfx: "MagicSlash", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", + minRange: 0, + color: "#92e8c0", + projectileTargeting:true, piercing: true, noTerrainHit: true, noEnemyCollision: true, onhit:"aoe", power: 4, delay: 0, range: 1.5, aoe: 1.5, size: 3, lifetime:1, damage: "soul", speed: 1, time: 2, + playerEffect: {name: "CrystalBind", time: 1, count: 2}, + }, + {name: "HeavySlash", tags: ["aoe", "offense", "physical"], + landsfx: "HeavySwing2", school: "Any", + manacost: 2.5, components: ["Arms"], level:1, type:"bolt", + minRange: 0, + color: "#aaaaaa", + projectileTargeting:true, piercing: true, noTerrainHit: true, + noEnemyCollision: true, onhit:"aoe", power: 5.5, delay: 0, + range: 1.5, aoe: 1.5, size: 3, castRange: 2.5, + lifetime:1, damage: "crush", speed: 1, time: 2, + playerEffect: {name: "Damage"}, + }, + + {enemySpell: true, name: "CrystalShock", hideWarnings: true, color: "#ff5277", minRange: 0, + noHitAlliedPlayer: true, + bulletSpin: 0.25, landsfx: "MagicSlash", manacost: 4, components: ["Arms"], level:1, type:"inert", onhit:"aoe", power: 3.5, time: 1, delay: 1, range: 4, size: 1, aoe: 0.75, lifetime: 1, damage: "souldrain", playerEffect: {name: "CrystalBind", time: 1}}, + + {enemySpell: true, name: "CrystalShockBolt", color: "#ff5277", sfx: "FireSpell", manacost: 3, specialCD: 6, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 8, damage: "soul", + size: 3, + shotgunCount: 1, shotgunDistance: 6, shotgunSpread: 1, shotgunSpeedBonus: 0, meleeOrigin: true, + events: [ + {trigger: "afterBulletHit", type: "CrystalShockBolt", dist: 5}, + ], + speed: 1.25, playerEffect: {name: "CrystalBind", time: 1, count: 3}}, + {enemySpell: true, noFirstChoice: true, name: "Hairpin", color: "#ffffff", minRange: 2.9, sfx: "Miss", manacost: 2, castRange: 6, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "pain", speed: 2, playerEffect: {name: "Hairpin", power: 2, damage: "pain", time: 1}}, + + {enemySpell: true, name: "PoisonBreath", color: "#4fa460", sfx: "FireSpell", manacost: 4, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", + time: 5, delay: 2, power: 1.5, range: 2.6, size: 3, aoe: 1.5, + lifetime: 3, damage: "poisongas", playerEffect: {name: "PoisonBreath", power: 2, amount: 0.1, time: 12, damage: "poisongas"}}, + + {enemySpell: true, name: "DragonVine", bindType: "Vine", color: "#88ff88", sfx: "Miss", effectTileDurationMod: 10, effectTile: { + name: "Vines", + duration: 20, + }, manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, delay: 0, range: 50, damage: "chain", speed: 2.5, playerEffect: {name: "VineEngulf", power: 2}}, + + {enemySpell: true, name: "DragonSlash", bindType: "Vine", color: "#88ff88", sfx: "Miss", effectTileDurationMod: 10, effectTile: { + name: "Vines", + duration: 20, + }, manacost: 2, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, delay: 0, range: 50, damage: "chain", speed: 2.5, playerEffect: + {name: "PoisonSlash", power: 2, amount: 0.25, time: 12}}, + + {enemySpell: true, name: "PoisonDragonBlast", bindType: "Vine", color: "#88ff88", sfx: "FireSpell", hitsfx: "Bones", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "grope", speed: 3, effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "Vines", + duration: 20, + }, playerEffect: {name: "VineEngulf", power: 2}}, + {enemySpell: true, name: "NatureMoteBolt", bindType: "Vine", color: "#88ff88", sfx: "FireSpell", hitsfx: "Bones", manacost: 7, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 2, time: 3, bind: 3, delay: 0, range: 50, damage: "chain", speed: 1.5, effectTileDurationMod: 10, effectTileAoE: 1.5, effectTileDensity: 0.5, effectTile: { + name: "Vines", + duration: 20, + }}, + {enemySpell: true, name: "ElfArrow", bindType: "Vine", color: "#88ff88", sfx: "Miss", hitsfx: "FireSpell", manacost: 3, components: ["Arms"], level: 1, type:"bolt", projectileTargeting:true, slowStart: true, onhit:"", power: 4, bind: 6, delay: 0, range: 12, damage: "chain", speed: 4, playerEffect: {name: "EnchantedArrow", power: 2, count: 1}}, + {enemySpell: true, name: "CursedArrow", bindType: "Magic", color: "#aa77ff", sfx: "Miss", hitsfx: "FireSpell", manacost: 5, components: ["Arms"], level: 1, type:"bolt", projectileTargeting:true, slowStart: true, onhit:"", power: 3, bind: 3, delay: 0, range: 7.99, damage: "cold", speed: 4, playerEffect: {name: "SingleMagicBind", time: 1, msg: "MBelt", tags: ["beltRestraintsMagic"], sfx: "MagicSlash"}}, + {enemySpell: true, name: "ShadowOrb", color: "#8833ff", minRange: 2.9, sfx: "MagicSlash", manacost: 5, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 5, damage: "inert", speed: 2, playerEffect: {name: ""}, + spellcast: {spell: "ShadowScythe", target: "onhit", directional:true, offset: false}}, + {enemySpell: true, name: "ShadowScythe", color: "#0000ff", sfx: "MagicSlash", manacost: 4, components: ["Verbal"], level:1, type:"inert", noTerrainHit: true, onhit:"aoe", time: 5, delay: 1, power: 3.5, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "cold", playerEffect: {name: "ShadowBind", time: 4}}, + {enemySpell: true, name: "WitchSlime", bindType: "Slime", color: "#ff00ff", minRange: 0, landsfx: "MagicSlash", manacost: 7, components: ["Legs"], level:1, type:"inert", onhit:"lingering", + time: 2, delay: 1, range: 4, power: 2, size: 3, aoe: 1, lifetime: 1, lifetimeHitBonus: 9, damage: "glue", playerEffect: {name: "SlimeTrap", time: 3}, + bindTags: ["slimeRestraintsRandom"], effectTileDurationModLinger: 8, effectTileLinger: { + name: "Slime", + duration: 10, + },}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + {enemySpell: true, name: "RubberSlime", bindType: "Slime", color: "#ff00ff", minRange: 0, landsfx: "MagicSlash", manacost: 7, components: ["Legs"], level:1, type:"inert", onhit:"lingering", + time: 2, delay: 1, range: 4, power: 2, size: 3, aoe: 1, lifetime: 1, lifetimeHitBonus: 9, damage: "glue", playerEffect: {name: "EncaseBolt", count: 1, time: 4, power: 5, damage: "glue"}, + effectTileDurationModLinger: 8, effectTileLinger: { + name: "Slime", + duration: 10, + },}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + {enemySpell: true, name: "WitchSlimeBall", bindType: "Slime", color: "#ff00ff", sfx: "RubberBolt", manacost: 6, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", + time: 2, power: 2, delay: 0, range: 50, damage: "glue", speed: 1, trailLifetime: 10, trailDamage:"glue", trail:"lingering", trailPower: 2, trailChance: 1.0, playerEffect: {name: "Slime", time: 3}, + effectTileDurationModTrail: 4, effectTileTrail: { + name: "Slime", + duration: 4, + } + }, // Throws a ball of slime which oozes more slime + {enemySpell: true, name: "SlimePuddle", bindType: "Slime", color: "#ff00ff", sfx: "FireSpell", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"lingering", + time: 2, power: 2, lifetime: 5, lifetimeHitBonus: 5, aoe: 1.5, delay: 0, range: 50, damage: "glue", speed: 1, playerEffect: {name: "SlimeTrap", time: 3}, + bindTags: ["slimeRestraintsRandom"], effectTileDurationModLinger: 8, effectTileLinger: { + name: "Slime", + duration: 10, + }, + }, + + {enemySpell: true, name: "MiniSlime", color: "#ff00ff", sfx: "MagicSlash", landsfx: "MagicSlash", manacost: 1, level:1, type:"bolt", projectileTargeting:true, onhit:"", + time: 2, power: 2, delay: 0, range: 9, damage: "glue", speed: 1, playerEffect: {name: "MiniSlime", time: 2}, + noFF: true, + effectTileDurationMod: 8, effectTile: { + name: "Slime", + duration: 10, + },}, // Throws a ball of slime which oozes more slime + {enemySpell: true, name: "VineSlimeBall", color: "#ff00ff", sfx: "MagicSlash", landsfx: "MagicSlash", manacost: 1, level:1, type:"bolt", projectileTargeting:true, onhit:"", + time: 2, power: 2.5, delay: 0, range: 9, damage: "glue", speed: 1, playerEffect: {name: "Slime", time: 2}, + effectTileDurationMod: 8, effectTile: { + name: "Slime", + duration: 14, + },}, // Throws a ball of slime which oozes more slime + {enemySpell: true, name: "ManySlimes", sfx: "MagicSlash", minRange: 0, manacost: 4, projectileTargeting: true, noTargetPlayer: true, CastInWalls: true, level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 3, range: 8, meleeOrigin: true, size: 1, lifetime: 1, damage: "inert", noMiscast: false, castDuringDelay: true, noCastOnHit: true, + spellcast: {spell: "MiniSlime", target: "target", directional:true, randomDirection: true, noTargetMoveDir: true, spread: 1, offset: false}, channel: 3}, + + // Bandit trader + {enemySpell: true, name: "PoisonDagger", color: "#ff00ff", minRange: 1.5, sfx: "Miss", manacost: 2, castRange: 6, components: ["Arms"], level:1, speed: 1, + type:"bolt", projectileTargeting:true, onhit:"", power: 4, delay: 0, range: 50, damage: "poison", playerEffect: {name: "PoisonDagger", power: 4, type: "poison", time: 8},}, + {enemySpell: true, name: "LustBomb", color: "#ff5277", minRange: 0, sfx: "Miss", school: "Illusion", manacost: 2, specialCD: 12, components: ["Verbal"], level:1, type:"inert", onhit:"aoe", time: 5, delay: 3, power: 2.5, range: 4, size: 3, aoe: 1.5, lifetime: 1, damage: "charm", playerEffect: {name: "LustBomb", damage: "charm", power: 3.5 }}, + + + // Fungal spells + {enemySpell: true, name: "CrystalPuff", color: "#b37bdc", minRange: 0, landsfx: "MagicSlash", manacost: 4, components: ["Arms"], level:1, type:"inert", onhit:"aoe", power: 3.5, time: 1, delay: 1, range: 4, size: 3, aoe: 0.75, lifetime: 1, damage: "souldrain", playerEffect: {name: "CrystalBind", time: 1}}, + {enemySpell: true, name: "HighBolt", color: "#8888ff", sfx: "MagicSlash", manacost: 3, specialCD: 7, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", + power: 6, delay: 0, range: 50, damage: "arcane", speed: 1, playerEffect: {name: "Flummox", time: 1, damage: "arcane", power: 6}}, + + // Shockwitch spells + {enemySpell: true, name: "WitchElectrify", color: "#8888ff", minRange: 0, landsfx: "Shock", manacost: 5, + effectTileDurationMod: 2, effectTile: { + name: "Sparks", + duration: 3, + }, + components: ["Arms"], level:1, type:"inert", onhit:"aoe", power: 3.5, time: 1, delay: 1, range: 4, size: 1, aoe: 0.75, lifetime: 1, damage: "electric", playerEffect: {name: "Shock", time: 1}}, // A series of light shocks incapacitate you + {enemySpell: true, name: "WitchElectricOrb", color: "#8888ff", sfx: "MagicSlash", manacost: 4, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 0, delay: 0, range: 5, damage: "electric", speed: 1, playerEffect: {name: ""}, + spellcast: {spell: "WitchElectricBurst", target: "onhit", directional:true, offset: false}}, + {enemySpell: true, name: "WitchElectricBurst", sfx: "Shock", manacost: 4, components: ["Verbal"], level:1, type:"hit", + effectTileDurationMod: 2, effectTile: { + name: "Sparks", + duration: 3, + }, + noTerrainHit: true, onhit:"aoe", time: 5, delay: 1, power: 4, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "electric", playerEffect: {name: "Shock", time: 1}}, + + // Elemental witch spells + {enemySpell: true, name: "WitchWaterBall", color: "#4f7db8", tags: ["water", "soap", "bolt", "offense", "utility"], sfx: "FireSpell", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"buff", + power: 3.0, delay: 0, range: 50, damage: "soap", speed: 3, playerEffect: {name: "Drench"}, + buffs: [ + Object.assign({}, KDDrenched), + Object.assign({}, KDDrenched2), + Object.assign({}, KDDrenched3), + ], + effectTileDurationMod: 40, effectTile: { + name: "Water", + duration: 40, + }, + }, + {enemySpell: true, name: "WitchIcebolt", color: "#92e8c0", tags: ["ice", "bolt", "offense"], sfx: "MagicSlash", hitsfx: "Freeze", school: "Elements", manacost: 4, components: ["Arms"], level:1, type:"bolt", + effectTileDurationMod: 10, effectTile: { + name: "Ice", + duration: 20, + }, + projectileTargeting:true, onhit:"", time: 4, power: 3.5, delay: 0, range: 50, damage: "frost", speed: 2, playerEffect: {name: "Chill", damage: "ice", power: 3, time: 3}, + events: [{type: "ElementalOnSlowOrBindOrDrench", trigger: "bulletHitEnemy", damage: "ice", time: 4, power: 0},]}, + + {enemySpell: true, name: "WitchBoulder", sfx: "Bones", hitsfx: "HeavySwing", school: "Elements", manacost: 3, components: ["Arms"], level:1, type:"bolt", projectileTargeting:true, onhit:"", block: 8, time: 4, power: 4, delay: 0, range: 50, damage: "crush", speed: 2, playerEffect: {name: "WitchBoulder", time: 2}}, + + {enemySpell: true, name: "SummonSlimeMold", noSprite: true, minRange: 0, sfx: "Bones", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "SlimeMold", count: 1, strict: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}}, + + {enemySpell: true, name: "SummonSkeleton", landsfx: "Bones", minRange: 0, manacost: 8, components: ["Verbal"], level:3, type:"inert", onhit:"summon", summon: [{name: "SummonedSkeleton", count: 1, time: 12, strict: true, bound: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 4, size: 3, aoe: 2.1, lifetime: 1, damage: "inert"}, + {enemySpell: true, name: "SummonSkeletons", landsfx: "Bones", minRange: 0, manacost: 18, components: ["Verbal"], level:4, type:"inert", onhit:"summon", summon: [{name: "SummonedSkeleton", count: 4, time: 16, strict: true, bound: true, weakBinding: true}], power: 0, time: 16, delay: 1, range: 4, size: 3, aoe: 2.6, lifetime: 1, damage: "inert"}, + {enemySpell: true, name: "SummonZombies", landsfx: "Bones", specialCD:16, minRange: 0, manacost: 4, components: ["Verbal"], level:4, type:"inert", onhit:"summon", summon: [{name: "SummonedZombie", count: 2, time: 200, strict: true, minRange: 1.5, bound: true, weakBinding: true}], power: 0, time: 16, delay: 1, range: 4, size: 3, aoe: 4.6, lifetime: 1, damage: "inert"}, + {enemySpell: true, name: "SummonDrones", landsfx: "Teleport", specialCD: 12, selfcast: true, minRange: 0, manacost: 4, components: ["Verbal"], level:4, type:"inert", onhit:"summon", + summon: [{name: "SummonedDrone", count: 1, strict: true, bound: true, time: 80, faction: "Ambush"}], power: 0, time: 15, delay: 3, range: 8, size: 3, aoe: 4.6, lifetime: 1, damage: "inert"}, + {enemySpell: true, name: "SummonCaptureDrones", landsfx: "Teleport", specialCD: 7, minRange: 0, manacost: 4, components: ["Verbal"], level:4, type:"inert", onhit:"summon", + summon: [{name: "SummonedCaptureDrone", count: 1, strict: true, bound: true, time: 90, faction: "Ambush"}], power: 0, time: 15, delay: 3, range: 14, size: 3, aoe: 4.6, lifetime: 1, damage: "inert"}, + {enemySpell: true, name: "RopeAttack", hitsfx: "Struggle", manacost: 6, components: ["Verbal"], level:4, type:"hit", onhit:"null", noSprite: true, noSumMsg: true, summon: [ + {name: "LearnedRope", count: 1, chance: 0.5, time: 20, strict: true, bound: true}, + {name: "UnforseenRope", count: 1, chance: 0.5, time: 20, strict: true, bound: true} + ], power: 0, time: 12, delay: 1, range: 8, size: 3, aoe: 10, lifetime: 1, damage: "fire"}, + {enemySpell: true, name: "GhostAttack", hitsfx: "Evil", manacost: 8, components: ["Verbal"], level:4, type:"hit", onhit:"null", noSprite: true, noSumMsg: true, summon: [ + {name: "Ghost", count: 1, time: 20, strict: true, bound: true, aware: true,}, + ], power: 0, time: 12, delay: 1, range: 8, size: 3, aoe: 10, lifetime: 1, damage: "fire"}, + {enemySpell: true, name: "GagGeistAttack", hitsfx: "Evil", castCondition: "NoGag", manacost: 7, components: ["Verbal"], level:4, type:"hit", onhit:"null", noSprite: true, noSumMsg: true, summon: [ + {name: "GagGeist", count: 1, time: 20, strict: true, bound: true, aware: true,}, + ], power: 0, time: 12, delay: 1, range: 8, size: 3, aoe: 10, lifetime: 1, damage: "fire"}, + {enemySpell: true, name: "SummonCrystals", noSprite: true, minRange: 0, landsfx: "Freeze", manacost: 12, components: ["Verbal"], level:4, type:"inert", onhit:"summon", summon: [{name: "ChaoticCrystal", teleportTime: 1, count: 3, time: 10, bound: true, weakBinding: true}], power: 0, time: 10, delay: 1, range: 40, size: 1, aoe: 2.01, lifetime: 1, damage: "inert"}, + {enemySpell: true, name: "SummonChainWalls", noSprite: true, minRange: 0, landsfx: "MagicSlash", manacost: 2, specialCD: 12, components: ["Verbal"], level:4, type:"inert", onhit:"summon", summon: [{name: "ChainWall", count: 3, time: 0, bound: true, weakBinding: true}], power: 0, time: 10, delay: 1, range: 40, size: 1, aoe: 3.5, lifetime: 1, damage: "inert"}, + {enemySpell: true, name: "SummonForceFields", noSprite: true, minRange: 0, landsfx: "MagicSlash", manacost: 2, specialCD: 12, components: ["Verbal"], level:4, type:"inert", onhit:"summon", summon: [{name: "ForceField", count: 3, time: 0, bound: true, weakBinding: true}], power: 0, time: 10, delay: 1, range: 40, size: 1, aoe: 3.5, lifetime: 1, damage: "inert"}, + {enemySpell: true, name: "SummonForceFieldsGuardian", noSprite: true, minRange: 0, landsfx: "MagicSlash", manacost: 2, specialCD: 12, components: ["Verbal"], level:4, type:"inert", onhit:"summon", summon: [{name: "ForceFieldGuardian", count: 3, time: 0, bound: true, weakBinding: true}], power: 0, time: 10, delay: 1, range: 40, size: 1, aoe: 3.5, lifetime: 1, damage: "inert"}, + {enemySpell: true, name: "SummonTickleHand", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "TickleHand", teleportTime: 1, count: 3, time: 12, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonShadowHand", noSprite: true, minRange: 0, sfx: "Evil", castCondition: "shadowHand3count", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "ShadowHand", teleportTime: 3, count: 1, time: 40, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonMikoGhosts", noSprite: true, minRange: 0, specialCD: 20, sfx: "MagicSlash", manacost: 4, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "MikoGhost", count: 8, minRange: 8, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 12.9, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonSingleTickleHand", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 6, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "TickleHand", teleportTime: 1, count: 1, time: 12, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonEnemyGag", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 6, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "Gag", teleportTime: 1, count: 1, time: 12, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonEnemyGag2", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 3, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "Gag", teleportTime: 1, count: 1, time: 12, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonCuff", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 6, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "Cuffs", teleportTime: 1, count: 1, time: 12, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonLock", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 6, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "Lock", teleportTime: 1, count: 1, time: 12, bound: true, weakBinding: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.6, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonRedSlime", noSprite: true, minRange: 0, sfx: "Freeze", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "RedSlime", count: 1, time: 12, strict: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 1, aoe: 2.01, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonSingleRedSlime", noSprite: true, minRange: 0, sfx: "Freeze", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "RedSlime", count: 1, time: 12, strict: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonLatexElemental", noSprite: true, sfx: "MagicSlash", manacost: 6, specialCD: 40, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "ElementalLatex", teleportTime: 3, count: 1, time: 40, bound: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonWolfDrone", noSprite: true, sfx: "MagicSlash", castCondition: "wolfDrone", manacost: 3, specialCD: 10, components: ["Verbal"], level:1, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "WolfDrone", teleportTime: 1, count: 1, time: 40, bound: true}], power: 0, damage: "inert", time: 34, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "SummonRopeTentacle", noSprite: true, sfx: "MagicSlash", castCondition: "ropeKraken", manacost: 2, specialCD: 4, components: ["Verbal"], level:1, + projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "RopeMinion", count: 1, bound: true}], + power: 0, damage: "inert", time: 34, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}, + }, + {enemySpell: true, name: "SummonSarcoTentacle", noSprite: true, sfx: "Evil", castCondition: "sarcoKraken", manacost: 2, specialCD: 4, components: ["Verbal"], level:1, + projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "SarcoMinion", count: 1, bound: true}], + power: 0, damage: "inert", time: 34, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}, + }, + {enemySpell: true, name: "SummonSlimeMinion", noSprite: true, sfx: "Evil", castCondition: "slimeKraken", manacost: 2, specialCD: 4, components: ["Verbal"], level:1, + projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "SmallSlimeLeaper", count: 1, bound: true}], + power: 0, damage: "inert", time: 34, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}, + }, + {enemySpell: true, name: "SummonSlime", noSprite: true, minRange: 0, sfx: "Bones", manacost: 3, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "SmallSlimeLeaper", count: 1, strict: true}], power: 0, damage: "inert", time: 12, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}}, + + {enemySpell: true, name: "ExplosiveBarrel", minRange: 0, sfx: "Lightning", school: "Elements", manacost: 4, components: [], mustTarget: true, level:1, type:"hit", + onhit:"aoe", time:5, lifetime: 1, delay: 0, power: 6, aoe: 1.5, range: 8, size: 3, damage: "fire", playerEffect: {name: "HeatBlast", time: 1, damage: "fire", power: 6}}, + + {enemySpell: true, name: "SummonTapeDrone", noSprite: true, sfx: "MagicSlash", castCondition: "wolfTapeDrone", manacost: 3, specialCD: 10, components: ["Verbal"], level:1, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "WolfDrone", count: 1, time: 40, weakBinding: true, bound: true}], power: 0, damage: "inert", time: 34, delay: 1, range: 0.5, size: 1, aoe: 1.5, lifetime: 1, speed: 1, playerEffect: {}}, + {enemySpell: true, name: "MirrorImage", noSprite: true, minRange: 0, selfcast: true, sfx: "FireSpell", manacost: 12, components: ["Verbal"], level:4, castRange: 50, type:"inert", onhit:"summon", summon: [{name: "MaidforceStalkerImage", count: 1, time: 12}], power: 0, time: 12, delay: 1, range: 2.5, size: 3, aoe: 1.5, lifetime: 1, damage: "inert", + spellcast: {spell: "DarkShroud", target: "origin", directional:false, offset: false}}, + + {enemySpell: true, name: "SummonDragonVinePlant", noSprite: true, minRange: 0, sfx: "Bones", manacost: 4, components: ["Verbal"], level:4, specialCD: 8, + projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "DragonVinePlant", teleportTime: 1, aware: true,bound: true, count: 1, time: 40, strict: true, weakBinding: true,}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 1.5, lifetime: 1, speed: 1}, + + {enemySpell: true, name: "SummonDragonFlower", noSprite: true, minRange: 0, sfx: "Bones", manacost: 4, components: ["Verbal"], level:4, specialCD: 16, + projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "DragonFlower", teleportTime: 1, aware: true,bound: true, count: 3, time: 20, strict: true, weakBinding: true,}], + power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.5, lifetime: 1, speed: 1}, + + {enemySpell: true, name: "SummonIceWall", noSprite: true, minRange: 0, sfx: "Bones", manacost: 1, components: ["Verbal"], level:1, specialCD: 12, + castCondition: "iceWallMelee", + aoetype: 'arc', + projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "IceWall", aware: true,bound: true, count: 3, time: 20, strict: true, weakBinding: true,}], + power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 2.5, lifetime: 1, speed: 1}, + + {enemySpell: true, name: "SummonIceWall2", noSprite: true, minRange: 0, sfx: "Bones", manacost: 1, components: ["Verbal"], level:1, specialCD: 12, + //castCondition: "iceWallMelee", + aoetype: 'arc', extraDist: 1, + projectileTargeting:true, castRange: 50, type:"hit", onhit:"summon", summon: [{name: "IceWall", aware: true,bound: true, count: 7, time: 20, strict: true, weakBinding: true,}], + power: 0, time: 12, delay: 1, range: 7, size: 3, aoe: 3.5, lifetime: 1, speed: 1}, + + {enemySpell: true, name: "SummonBookChain", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookChain", teleportTime: 1, aware: true,bound: true, count: 3, time: 13, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, + {enemySpell: true, name: "SummonBookBelt", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookBelt", teleportTime: 1, aware: true,bound: true, count: 3, time: 13, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, + {enemySpell: true, name: "SummonBookRope", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookRope", teleportTime: 1, aware: true,bound: true, count: 3, time: 13, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, + {enemySpell: true, name: "SummonBookBondage", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 24, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookBondage", teleportTime: 1, aware: true,bound: true, count: 1, time: 24, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, + {enemySpell: true, name: "SummonBookNature", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookNature", teleportTime: 1, aware: true,bound: true, count: 2, time: 13, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, + {enemySpell: true, name: "SummonBookElectric", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookElectric", teleportTime: 1, aware: true,bound: true, count: 1, time: 13, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, + {enemySpell: true, name: "SummonBookIce", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookIce", teleportTime: 1, aware: true,bound: true, count: 3, time: 13, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, + {enemySpell: true, name: "SummonBookCelestial", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookCelestial", teleportTime: 1, aware: true,bound: true, count: 3, time: 13, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, + {enemySpell: true, name: "SummonBookArcane", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookArcane", teleportTime: 1, aware: true,bound: true, count: 3, time: 13, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, + {enemySpell: true, name: "SummonBookForbidden", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 12, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookForbidden", teleportTime: 1, aware: true,bound: true, count: 3, time: 13, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, + {enemySpell: true, name: "SummonBookSlime", noSprite: true, minRange: 0, sfx: "MagicSlash", manacost: 8, components: ["Verbal"], level:4, projectileTargeting:true, castRange: 50, type:"bolt", onhit:"summon", summon: [{name: "BookSlime", teleportTime: 1, aware: true,bound: true, count: 2, time: 13, strict: true, weakBinding: true}], power: 0, time: 12, delay: 1, range: 0.5, size: 3, aoe: 3, lifetime: 1, speed: 1}, + + {enemySpell: true, selfcast: true, buff: true, minRange: 0, name: "ArmorUp", sfx: "Bones", school: "Elements", manacost: 8, components: ["Arms"], mustTarget: true, level:1, type:"buff", buffs: [{id: "ArmorUp", type: "Armor", duration: 6, power: 1.0, player: true, enemies: true, tags: ["defense", "armor"]}], onhit:"", time:6, power: 0, range: 2, size: 1, damage: ""}, + {enemySpell: true, selfcast: true, buff: true, name: "SelfCharge", sfx: "HexOrb", + school: "Elements", manacost: 1, components: ["Arms"], mustTarget: true, level:1, type:"buff", + specialCD: 12, + noCastMsg: true, + minRange: 3.5, + castRange: 14, + buffs: [ + {id: "SelfCharge", type: "MoveSpeed", aura: "#ffff00", duration: 6, power: 0.5, player: true, enemies: true, tags: ["offense", "speed"]}, + { + id: "Eager", type: "MoveSpeed", power: 0.5, duration: 3, events: [ + {type: "ApplyVuln", duration: 1, trigger: "tick"}, + {type: "ApplyVuln", duration: 1, power: -1.0, trigger: "tickAfter"}, + ] + } + ], onhit:"", time:6, power: 0, range: 2, size: 1, damage: ""}, + {enemySpell: true, selfcast: true, buff: true, minRange: 0, name: "ArmorUpArea", sfx: "MagicSlash", school: "Elements", manacost: 8, components: ["Arms"], mustTarget: true, level:1, + type:"buff", buffs: [{id: "ArmorUpArea", type: "Armor", duration: 6, power: 2.0, player: false, enemies: true, tags: ["defense", "armor"]}], onhit:"", time:6, power: 0, range: 2.9, aoe: 2.9, size: 1, damage: ""}, + + {enemySpell: true, selfcast: true, buff: true, minRange: 0, name: "SpellArmorUpAreaNevermere", sfx: "MagicSlash", school: "Elements", manacost: 8, components: ["Arms"], mustTarget: true, level:1, filterTags: ["wolfPet", "robot"], + type:"buff", buffs: [ + {id: "SpellArmorUpAreaNevermere", type: "SpellResist", duration: 6, power: 2.0, player: false, enemies: true, tags: ["defense", "spellresist"]}, + {id: "ArmorUpAreaNevermere", type: "Armor", duration: 6, power: 1.5, player: false, enemies: true, tags: ["defense", "armor"]} + ], onhit:"", time:6, power: 0, range: 4.9, aoe: 4.9, size: 1, damage: ""}, + {enemySpell: true, selfcast: true, buff: true, minRange: 0, name: "NevermereBoost", sfx: "MagicSlash", school: "Elements", manacost: 4, specialCD: 18, components: ["Arms"], mustTarget: true, level:1, filterTags: ["wolfSub"], + type:"buff", buffs: [ + {id: "NevermereBoost", aura: "#ffaaaa", type: "MoveSpeed", duration: 10, power: 1.0, player: false, enemies: true, tags: ["offense", "speed"]}, + {id: "NevermereBoost2", type: "Evasion", duration: 6, power: 0.3, player: false, enemies: true, tags: ["offense", "evasion"]}, + {id: "NevermereBoost3", type: "AttackSpeed", duration: 6, power: 0.5, player: false, enemies: true, tags: ["offense", "attackspeed"]}, + ], onhit:"", time:6, power: 0, range: 4.9, aoe: 4.9, size: 1, damage: ""}, + + {enemySpell: true, selfcast: true, buff: true, minRange: 0, name: "DollBoost", sfx: "MagicSlash", school: "Elements", manacost: 4, specialCD: 18, components: ["Arms"], mustTarget: true, level:1, filterTags: ["smithdoll"], + type:"buff", buffs: [ + {id: "NevermereBoost", aura: "#ffaaaa", type: "MoveSpeed", duration: 10, power: 1.0, player: false, enemies: true, tags: ["offense", "speed"]}, + {id: "NevermereBoost2", type: "Evasion", duration: 6, power: 0.3, player: false, enemies: true, tags: ["offense", "evasion"]}, + {id: "NevermereBoost3", type: "AttackSpeed", duration: 6, power: 0.5, player: false, enemies: true, tags: ["offense", "attackspeed"]}, + ], onhit:"", time:6, power: 0, range: 4.9, aoe: 4.9, size: 1, damage: ""}, + + {name: "DollConvert", tags: ["dummy"], sfx: "Dollify", school: "Illusion", manacost: 0, components: [], level:1, type:"special", special: "DollConvert", noMiscast: true, castCondition: "dollConvert", + onhit:"", time:5, power: 0, range: 5.5, aoe: 5.5, size: 1, damage: ""}, + + {name: "DollConvertMany", tags: ["dummy"], sfx: "Dollify", school: "Illusion", manacost: 0, components: [], level:1, type:"special", special: "DollConvert", noMiscast: true, castCondition: "dollConvert", + onhit:"", time:5, power: 0, range: 5.5, aoe: 5.5, size: 1, damage: ""}, + + {enemySpell: true, buff: true, name: "ParasolBuff", minRange: 0, sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Arms"], mustTarget: true, level:3, type:"buff", + noSelfBuff: true, + buffallies: true, + buffs: [ + {id: "ParasolBuff", type: "Armor", duration: 5, power: 1.0, player: false, enemies: true, tags: ["defense", "armor"]}, + {id: "ParasolBuff2", type: "Evasion", duration: 5, power: 0.33, player: false, enemies: true, tags: ["defense", "evasion"]}, + {id: "ParasolBuff3", type: "SpellResist", duration: 5, power: 2.5, player: false, enemies: true, tags: ["defense", "spellresist"]}, + ], onhit:"", time:5, power: 0, range: 6, size: 1, damage: ""}, + + {enemySpell: true, buff: true, name: "ShieldTheWitch", + castCondition: "ShieldTheWitch", + buffallies: true, + noSelfBuff: true, + minRange: 0, sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Arms"], mustTarget: true, level:3, type:"buff", + buffs: [ + { + id: "ShieldTheWitch", + aura: "#bd80f4", aurasprite: "EnergyShield", + type: "MaxShield", + duration: 6, power: 8, + player: false, enemies: true, tags: ["defense", "shield"] + }, + { + id: "ShieldTheWitch2", + type: "ShieldRegen", + duration: 2, power: 4, + player: false, enemies: true, tags: ["defense", "shield"] + }, + ], onhit:"", time:5, power: 0, range: 4.5, size: 1, damage: ""}, + + {enemySpell: true, commandword: true, buff: true, buffallies: true, castCondition: "commandword", name: "EnemyCM1", minRange: 0, sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Arms"], mustTarget: true, level:3, type:"special", special: "Enemy_CM1", + onhit:"", time:5, power: 0, range: 6, size: 1, damage: "", noCastMsg: true}, + {enemySpell: true, commandword: true, buff: true, buffallies: true, selfbuff: true, castCondition: "commandword", name: "EnemyCM_self", minRange: 0, sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Arms"], mustTarget: true, level:3, type:"special", special: "Enemy_CM1", + onhit:"", time:5, power: 0, range: 6, size: 1, damage: "", noCastMsg: true}, + {enemySpell: true, buff: true, name: "ZombieBuff", minRange: 0, sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Arms"], mustTarget: true, level:3, type:"buff", filterTags: ["zombie", "mummy"], + buffs: [ + {id: "ZombieBuff", type: "Armor", duration: 8, power: 2.0, player: false, enemies: true, tags: ["defense", "armor"]}, + {id: "ZombieBuff2", type: "MoveSpeed", duration: 8, power: 2.1, player: false, enemies: true, tags: ["offense", "speed"]}, + ], onhit:"", time:5, power: 0, range: 6, size: 1, damage: ""}, + {enemySpell: true, buff: true, heal: true, name: "OrbHeal", minRange: 0, sfx: "MagicSlash", school: "Elements", manacost: 4, components: ["Arms"], mustTarget: true, level:3, type:"hit", + onhit:"heal", time:2, lifetime: 1, delay: 1, power: 2, aoe: 1.5, range: 8, size: 3, damage: "inert"}, + {enemySpell: true, name: "Earthfield", selfcast: true, sfx: "Bones", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", buffs: [{id: "Earthfield", type: "Armor", power: 2.0, player: false, enemies: true, noAlly: true, tags: ["armor", "defense"], range: 1.5}], onhit:"", time:6, aoe: 1.5, power: 0, delay: 8, range: 4, size: 3, damage: ""}, // Creates a shroud. Enemies within are hard to hit with melee attacks. + {name: "Earthrune", selfcast: true, sfx: "Bones", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", buffs: [{id: "Earthfield", type: "Armor", power: 2.0, player: true, enemies: true, onlyAlly: true, tags: ["armor", "defense"], range: 1.5}], onhit:"", time:9, aoe: 1.5, power: 0, delay: 9, range: 4, size: 3, damage: ""}, // Creates a shroud. Enemies within are hard to hit with melee attacks. + {name: "Icerune", sfx: "MagicSlash", hitsfx: "Freeze", school: "Elements", manacost: 8, components: ["Verbal"], level:1, type:"inert", onhit:"lingering", time: 1, delay: 1, range: 3, size: 3, aoe: 1.5, lifetime: 5, power: 4, lifetimeHitBonus: 3, damage: "ice"}, // Creates a huge pool of slime, slowing enemies that try to enter. If you step in it, you have a chance of getting trapped! + {name: "WaterRune", selfcast: true, sfx: "Bones", school: "Illusion", manacost: 5, components: ["Verbal"], level:1, type:"inert", + buffs: [ + {id: "WaterRune", type: "SpellResist", power: 3.0, player: true, enemies: true, onlyAlly: true, tags: ["spellresist", "defense"], range: 1.5}, + {id: "WaterRune2", type: "MoveSpeed", power: -1.0, player: false, enemies: true, noAlly: true, tags: ["slow", "debuff"], range: 1.5}, + ], onhit:"", time:9, aoe: 1.5, power: 0, delay: 9, range: 4, size: 3, damage: ""}, // Creates a shroud. Enemies within are hard to hit with melee attacks. + + {enemySpell: true, name: "RuneTrap_Rope", bulletColor: 0xff73ef, tags: ["rope", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "Ropes", + duration: 20, + }, + effectTileDoT: { + name: "Ropes", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0xff73ef, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["ropeMagicWeak"], msg: "Rope"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "chain"}, + + {enemySpell: true, name: "RuneTrap_Chain", bulletColor: 0xcf52ff, tags: ["rope", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "Chains", + duration: 20, + }, + effectTileDoT: { + name: "Chains", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0xcf52ff, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["chainRestraintsMagic"], msg: "Chain"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "chain"}, + + {enemySpell: true, name: "RuneTrap_Ribbon", bulletColor: 0xcf52ff, tags: ["rope", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "Fabric", + duration: 20, + }, + effectTileDoT: { + name: "Fabric", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0xcf52ff, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["ribbonRestraints", "magicRibbonsHarsh"], msg: "Ribbon"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "chain"}, + + {enemySpell: true, name: "RuneTrap_Vine", bulletColor: 0x3b7d4f, tags: ["rope", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "Vines", + duration: 20, + }, + effectTileDoT: { + name: "Vines", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0x3b7d4f, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["vineRestraints"], msg: "Vine"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "chain"}, + + {enemySpell: true, name: "RuneTrap_Belt", bulletColor: 0xffffff, tags: ["rope", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "Belts", + duration: 20, + }, + effectTileDoT: { + name: "Belts", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0xffffff, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["beltRestraints"], msg: "Belt"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "chain"}, + + {enemySpell: true, name: "RuneTrap_Leather", bulletColor: 0xffffff, tags: ["rope", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "Belts", + duration: 20, + }, + effectTileDoT: { + name: "Belts", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0xffffff, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["leatherRestraints", "leatherRestraintsHeavy"], msg: "Leather"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "chain"}, + + {enemySpell: true, name: "RuneTrap_Latex", bulletColor: 0x4fa4b8, tags: ["rope", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "Belts", + duration: 20, + }, + effectTileDoT: { + name: "LatexThinBlue", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0x4fa4b8, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["latexRestraints", "latexRestraintsHeavy"], msg: "Latex"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "glue"}, + + {enemySpell: true, name: "RuneTrap_VacCube", bulletColor: 0x4fa4b8, tags: ["latex", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "Latex", + duration: 20, + }, + effectTileDoT: { + name: "LatexThin", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0x4fa4b8, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["latexcube"], msg: "VacCube"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "glue"}, + + {enemySpell: true, name: "RuneTrap_Bubble", bulletColor: 0x8888ff, tags: ["water", "soap", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "Water", + duration: 20, + }, + effectTileDoT: { + name: "Water", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0x4fa4b8, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["bubble"], msg: "Bubble"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "soap"}, + + {enemySpell: true, name: "RuneTrap_SlimeBubble", bulletColor: 0xff00ff, tags: ["latex", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "Slime", + duration: 20, + }, + effectTileDoT: { + name: "Slime", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0x4fa4b8, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["slimebubble"], msg: "SlimeBubble"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "glue"}, + + {enemySpell: true, name: "RuneTrap_LatexSphere", bulletColor: 0xff00ff, tags: ["latex", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "LatexThinBlue", + duration: 20, + }, + effectTileDoT: { + name: "LatexThinBlue", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0x4fa4b8, hitLight: 6, hitsfx: "RubberBolt", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["latexSphere"], msg: "LatexSphere"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "glue"}, + + {enemySpell: true, name: "RuneTrap_LatexBall", bulletColor: 0xff00ff, tags: ["latex", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "LatexThinBlue", + duration: 20, + }, + effectTileDoT: { + name: "LatexThinBlue", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0x4fa4b8, hitLight: 6, hitsfx: "RubberBolt", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["ballsuit"], msg: "BallSuit"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "glue"}, + + {enemySpell: true, name: "RuneTrap_Rubber", bulletColor: 0xff5277, tags: ["rope", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "LatexThin", + duration: 20, + }, + effectTileDoT: { + name: "LatexThin", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0xff5277, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 3, tags: ["latexEncaseRandom"], msg: "Rubber"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "glue"}, + + {enemySpell: true, name: "RuneTrap_Slime", bulletColor: 0xff5277, tags: ["rope", "trap", "rune"], + hideWarnings: true, + effectTileDurationMod: 10, effectTile: { + name: "Slime", + duration: 20, + }, + effectTileDoT: { + name: "Slime", + duration: 2, + }, effectTileDistDoT: 0.5, + effectTileDoT2: { + name: "BoobyTrapMagic", + duration: 2, + }, + hitColor: 0xff5277, hitLight: 6, hitsfx: "Struggle", manacost: 2, components: ["Legs"], level:1, type:"dot", + playerEffect: {name: "MagicRope", time: 3, count: 1, tags: ["slimeRestraints"], msg: "Slime"}, + noTerrainHit: true, onhit:"", delay: 300, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "glue"}, + + {enemySpell: true, faction: "Trap", name: "TrapCharmWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsCharmWeak", tags: ["ribbonRestraints"], power: 4, count: 4}}, + {enemySpell: true, faction: "Trap", name: "SpikeTrap", sfx: "SpikeTrapTrigger", hitsfx: "SpikeTrapHit", + manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, + noTerrainHit: true, time: 5, delay: 1, power: 6, range: 2, size: 3, aoe: 1.5, + bind: 10, + bindType: "Furniture", + lifetime: 1, damage: "crush", + playerEffect: {name: "TrapBindings", text: "KinkyDungeonTrapBindingsOneBar", + tags: ["onebar"], power: 4, count: 4}}, + {enemySpell: true, faction: "Trap", name: "TrapRibbons", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 4, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsRibbons", tags: ["magicRibbons"], power: 10, count: 3}}, + {enemySpell: true, faction: "Trap", name: "TrapShackleWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsShackleWeak", tags: ["shackleRestraints"], power: 6, count: 2}}, + {enemySpell: true, faction: "Trap", name: "TrapMummyWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsMummyWeak", tags: ["mummyRestraints"], power: 8, count: 2}}, + {enemySpell: true, faction: "Trap", name: "TrapRopeWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsRopeWeak", tags: ["ropeMagicWeak", "clothRestraints"], power: 6, count: 3}}, + {enemySpell: true, faction: "Trap", name: "TrapRopeStrong", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsRopeStrong", tags: ["ropeMagicStrong", "ropeAuxiliary", "clothRestraints", "tapeRestraints"], power: 10, count: 4}}, + {enemySpell: true, faction: "Trap", name: "TrapRopeHoly", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "holy", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsRopeHoly", tags: ["celestialRopes"], power: 10, count: 2}}, + {enemySpell: true, faction: "Trap", name: "TrapLeatherWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsLeatherWeak", tags: ["leatherRestraints", "leatherRestraintsHeavy"], power: 8, count: 3}}, + {enemySpell: true, faction: "Trap", name: "TrapCableWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsCableWeak", tags: ["hitechCables"], power: 6, count: 3}}, + {enemySpell: true, faction: "Trap", name: "TrapSlimeWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "glue", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsSlimeWeak", tags: ["slimeRestraints"], power: 5, count: 2}}, + {enemySpell: true, faction: "Trap", name: "TrapMagicChainsWeak", sfx: "Struggle", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "chain", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsMagicChainsWeak", tags: ["chainRestraintsMagic"], power: 7, count: 3}}, + {enemySpell: true, faction: "Trap", name: "TrapShadowLatex", sfx: "Evil", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "cold", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsShadowLatex", tags: ["shadowLatexRestraints"], power: 12, count: 3}}, + {enemySpell: true, faction: "Trap", name: "TrapObsidian", sfx: "Evil", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "cold", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsObsidian", tags: ["obsidianRestraints"], power: 9, count: 3}}, + {enemySpell: true, faction: "Trap", distract: 10, name: "TrapCrystal", sfx: "Freeze", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "arcane", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsCrystal", tags: ["crystalRestraints"], power: 9, count: 3}}, + {nonmagical: true, faction: "Trap", enemySpell: true, name: "TrapLatex", sfx: "MagicSlash", manacost: 4, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "arcane", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsLatex", tags: ["latexRestraints", "latexRestraintsHeavy", "redLatexBasic"], power: 7, count: 3}}, + {faction: "Trap", enemySpell: true, name: "TrapLatexBubble", sfx: "Grope", manacost: 6, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 2, power: 4, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "glue", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsLatexBubble", tags: ["latexSphere"], power: 6, count: 1}}, + {faction: "Trap", enemySpell: true, name: "TrapLatexBall", sfx: "Grope", manacost: 6, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 2, power: 4, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "glue", playerEffect: {name: "TrapBindings", realBind: true, text: "KinkyDungeonTrapBindingsLatexBall", tags: ["ballSuit"], power: 6, count: 1}}, + {nonmagical: true, enemySpell: true, name: "TrapSleepDart", hideWarnings: true, sfx: "Gunfire", manacost: 1, components: [], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, time: 0, delay: 0, range: 50, damage: "poison", speed: 2, playerEffect: {name: "TrapSleepDart", realBind: true, power: 5}}, + {enemySpell: true, faction: "Trap", distract: 20, name: "TrapLustCloud", sfx: "Freeze", manacost: 1, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "happygas", playerEffect: {name: "TrapLustCloud", realBind: true, damage: "happygas", power: 8 }}, + {enemySpell: true, faction: "Trap", name: "TrapSCloud", sfx: "Freeze", manacost: 1, components: [], level:1, type:"inert", onhit:"aoe", passthrough: true, noTerrainHit: true, time: 5, delay: 1, power: 3, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "poison", playerEffect: {name: "TrapSPCloud", realBind: true, damage: "poison", power: 5.0 }}, + {nonmagical: true, enemySpell: true, + noDirectionOffset: true, name: "SleepDart", sfx: "SpikeTrapTrigger", manacost: 1, components: [], level:1, type:"bolt", projectileTargeting:true, onhit:"", power: 4, time: 0, delay: 0, range: 50, damage: "poison", speed: 1, playerEffect: {name: "TrapSleepDart", realBind: true, power: 5}}, +]; + +KDDefineSpellPage("Command", [ + ["AllyToggle", "AllyAttention", "AllyDeselect", "AllyDeselectAll"], + ["AllyMove"], + ["AllyOnMe", "AllyDisperse", "AllyHold", "AllyCancelHold"], + ["AllyDefensive", "AllyAggressive"], +]); + + +let KDSpecialBondage: Record = { + "Energy": { + priority: 25, + color: "#e7cf1a", + struggleRate: 0.7, + powerStruggleBoost: 0.3, + healthStruggleBoost: 1.5, + mageStruggleBoost: 1.5, + enemyBondageMult: 1.0, + }, + "Wrapping": { + priority: 14, + color: "#88ff88", + struggleRate: 0.95, + powerStruggleBoost: 0.3, + healthStruggleBoost: 1.5, + mageStruggleBoost: 2.5, + enemyBondageMult: 1.0, + }, + "Magic": { + priority: -5, + color: "#92e8c0", + struggleRate: 0.6, + powerStruggleBoost: 1.0, + healthStruggleBoost: 1.0, + mageStruggleBoost: 1.75, + enemyBondageMult: 0.8, + }, + "Leather": { + priority: 0, + color: "#ad2f45", + struggleRate: 1.0, + powerStruggleBoost: 1.0, + healthStruggleBoost: 1.0, + enemyBondageMult: 1.0, + }, + "Null": { + priority: 100, + color: "#ff5277", + struggleRate: 1, + powerStruggleBoost: 0.5, + healthStruggleBoost: 0.8, + enemyBondageMult: 1.0, + helpImmune: true, + }, + "Latex": { + priority: -8, + color: "#87b5c4", + struggleRate: 1.05, + powerStruggleBoost: 0.6, + healthStruggleBoost: 1.2, + enemyBondageMult: 0.8, + latex: true, + }, + "Rope": { + priority: -3, + color: "#ffae70", + struggleRate: 4.0, + powerStruggleBoost: 1.0, + healthStruggleBoost: 1.0, + enemyBondageMult: 2.0, + }, + "MagicRope": { + priority: -4, + color: "#b7e892", + struggleRate: 1.5, + powerStruggleBoost: 1.0, + healthStruggleBoost: 1.0, + mageStruggleBoost: 1.4, + enemyBondageMult: 2.0, + }, + "Metal": { + priority: 10, + color: "#aaaaaa", + struggleRate: 0.4, + powerStruggleBoost: 0.25, + healthStruggleBoost: 1.0, + enemyBondageMult: 0.6, + }, + "Slime": { + priority: -10, + color: "#f23db7", + struggleRate: 1.5, + powerStruggleBoost: 2.0, + healthStruggleBoost: 0.75, + enemyBondageMult: 1.75, + mageStruggleBoost: 0.3, + latex: true, + }, + "Tape": { + priority: -5, + color: "#3454f4", + struggleRate: 1.35, + powerStruggleBoost: 0.75, + healthStruggleBoost: 1.5, + enemyBondageMult: 1.5, + }, + "Vine": { + priority: -7, + color: "#4fd658", + struggleRate: 1.25, + powerStruggleBoost: 2.0, + healthStruggleBoost: 1.0, + mageStruggleBoost: 0.1, + enemyBondageMult: 1.5, + }, + "Ice": { + priority: -15, + color: "#00ffff", + struggleRate: 0.6, + powerStruggleBoost: 3.0, + healthStruggleBoost: 0.7, + mageStruggleBoost: 0.7, + enemyBondageMult: 0.5, + }, + "Furniture": { + priority: -100, + color: "#aaaaaa", + struggleRate: 1.2, + powerStruggleBoost: 2.0, + healthStruggleBoost: 2.0, + enemyBondageMult: 1.0, + }, +}; + +let KDMagicDefs = { + RopeKraken_TentacleCost:0.05, + RopeKraken_TentacleThreshold: 0.16, + RopeKraken_TentacleCountMin: 1, + RopeKraken_TentacleCountShare: 0.29, //1 tentacle max per this much hp + SarcoKraken_TentacleCost:0.00, + SarcoKraken_TentacleThreshold: 0.05, + SarcoKraken_TentacleCountMin: 1, + SarcoKraken_TentacleCountMax: 3, + SarcoKraken_TentacleCountShare: 0.2, //1 tentacle max per this much hp + SlimeKraken_TentacleCost:0.08, + SlimeKraken_TentacleThreshold: 0.1, + SlimeKraken_TentacleCountMin: 4, + SlimeKraken_TentacleCountShare: 0.1, //1 slime max per this much hp +}; + +let KDCastConditions: Record boolean> = { + "latexLegbinderSpell": (_enemy, target) => { + if (target.player) { + let restraint = KinkyDungeonGetRestraint({tags: ["latexlegbinderSpell"]}, 100, "tmb"); + if (!restraint) return false; + return true; + } + return true; + }, + "iceWallMelee": (enemy, target) => { + return enemy.hp < enemy.Enemy.maxhp/2 && KDistEuclidean(enemy.x-target.x, enemy.y - target.y) < 3; + }, + "latexGagSpell": (_enemy, target) => { + if (target.player) { + let restraint = KinkyDungeonGetRestraint({tags: ["latexgagSpell"]}, 100, "tmb"); + if (!restraint) return false; + return true; + } + return true; + }, + "latexArmbinderSpell": (_enemy, target) => { + if (target.player) { + let restraint = KinkyDungeonGetRestraint({tags: ["latexarmbinderSpell"]}, 100, "tmb"); + if (!restraint) return false; + return true; + } + return true; + }, + "ShieldTheWitch": (_enemy, target) => { + return target?.Enemy?.tags?.witch; + }, + + + "notImmobile": (_enemy, _target) => { + if (KinkyDungeonSlowLevel < 10) return true; + return false; + }, + "Windup_Start": (enemy, _target) => { + if (!KDEnemyHasFlag(enemy, "windup")) return true; + return false; + }, + "Windup_Ready": (enemy, _target) => { + if (KDEnemyHasFlag(enemy, "windup")) return true; + return false; + }, + "commandword": (enemy, target) => { + if (KDEnemyHasFlag(enemy, "commandword")) return false; + return KDEntityHasBuffTags(target, "commandword"); + }, + "dollConvert": (enemy, _target, spell) => { + if (KDNearbyEnemies(enemy.x, enemy.y, KDGetSpellRange(spell)).filter((en) => {return en.Enemy?.tags.smithdoll;}).length > 3 || KDNearbyEnemies(enemy.x, enemy.y, spell.aoe).filter((en) => {return !en.allied && en.Enemy?.tags.dollmakerconvert;}).length < 1) return false; + return true; + }, + "dollConvertMany": (enemy, _target, spell) => { + if (KDNearbyEnemies(enemy.x, enemy.y, KDGetSpellRange(spell)).filter((en) => {return en.Enemy?.tags.smithdoll;}).length > 8 || KDNearbyEnemies(enemy.x, enemy.y, spell.aoe).filter((en) => {return !en.allied && en.Enemy?.tags.dollmakerconvert;}).length < 1) return false; + return true; + }, + "wolfDrone": (enemy, _target) => { + if (KDNearbyEnemies(enemy.x, enemy.y, 10).filter((en) => {return en.Enemy?.tags.wolfdrone;}).length > 3) return false; + return true; + }, + "wolfTapeDrone": (enemy, _target) => { + if (KDNearbyEnemies(enemy.x, enemy.y, 10).filter((en) => {return en.Enemy?.tags.wolfdrone;}).length > 3) return false; + return true; + }, + "shadowHand3count": (enemy, _target) => { + if (KDNearbyEnemies(enemy.x, enemy.y, 10).filter((en) => {return en.Enemy?.name == "ShadowHand";}).length > 3) return false; + return true; + }, + "ropeKraken": (enemy, _target) => { + if (enemy.hp <= KDMagicDefs?.RopeKraken_TentacleThreshold) return false; + if (KDNearbyEnemies(enemy.x, enemy.y, 10).filter((en) => {return en.Enemy?.tags.krakententacle;}).length + > KDMagicDefs?.RopeKraken_TentacleCountMin + Math.floor(enemy.hp/enemy.Enemy.maxhp/KDMagicDefs?.RopeKraken_TentacleCountShare)) return false; + return true; + }, + "slimeKraken": (enemy, _target) => { + if (enemy.hp <= KDMagicDefs?.SlimeKraken_TentacleThreshold) return false; + if (KDNearbyEnemies(enemy.x, enemy.y, 10).filter((en) => {return en.Enemy?.tags.latexTrap;}).length + > KDMagicDefs?.SlimeKraken_TentacleCountMin + Math.floor(enemy.hp/enemy.Enemy.maxhp/KDMagicDefs?.SlimeKraken_TentacleCountShare)) return false; + return true; + }, + "sarcoKraken": (enemy, target) => { + if (target.player) { + if (KinkyDungeonPlayerTags.get("Sarcophagus")) return false; + + let restraint = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); + if (!restraint) return false; + } + if (enemy.hp <= KDMagicDefs?.SarcoKraken_TentacleThreshold) return false; + if (KDNearbyEnemies(enemy.x, enemy.y, 10).filter((en) => {return en.Enemy?.tags.sarcotentacle;}).length + > Math.min(KDMagicDefs?.SarcoKraken_TentacleCountMax - 1, KDMagicDefs?.SarcoKraken_TentacleCountMin + Math.floor(enemy.hp/enemy.Enemy.maxhp/KDMagicDefs?.SarcoKraken_TentacleCountShare))) return false; + return true; + }, + "sarcoEngulf": (_enemy, target) => { + if (target.player && !KinkyDungeonPlayerTags.get("Sarcophagus")) { + let restraint = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); + if (!restraint) return false; + return true; + } + return false; + }, + "sarcoHex": (_enemy, target) => { + if (target.player && !KinkyDungeonPlayerTags.get("Sarcophagus")) { + let restraint = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); + if (!restraint) return true; + return false; + } + return false; + }, + "NoGag": (_enemy, target) => { + if (target.player && !KinkyDungeonPlayerTags.get("ItemMouthFull")) { + return true; + } + return false; + }, + "EnemyEnchantRope": (_enemy, target) => { + if (target.player && KinkyDungeonPlayerTags.get("RopeSnake")) { + return MiniGameKinkyDungeonLevel > 1; + } + else if (target?.specialBoundLevel?.Rope > 0) return MiniGameKinkyDungeonLevel > 1; + return false; + }, + "EnemyEnchantRope2": (_enemy, target) => { + if (target.player && (KinkyDungeonPlayerTags.get("RopeSnake") || KinkyDungeonPlayerTags.get("WeakMagicRopes"))) { + return MiniGameKinkyDungeonLevel > 4; + } + else if (target?.specialBoundLevel?.Rope > 0) return MiniGameKinkyDungeonLevel > 4; + return false; + }, + "MagicMissileChannel": (enemy, _target) => { + return !KDEnemyHasFlag(enemy, "MagicMissileChannelFinished"); + }, + "NotDragonChanneled": (enemy, _target) => { + return !KDEnemyHasFlag(enemy, "dragonChannel") && !KDEnemyHasFlag(enemy, "dragonChannelCD"); + }, + "DragonChanneled": (enemy, _target) => { + return KDEnemyHasFlag(enemy, "dragonChannel"); + }, + + "WardenCageDrop": (_enemy, target) => { + if (target.player && KinkyDungeonPlayerTags.get("OneBar")) { + return true; + } + return false; + }, +}; + +let KDPlayerCastConditions: Record boolean> = { + "hasArcaneEnergy": (_player, _x, _y) => { + return KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ArcaneEnergy") > 0; + }, + "noStationaryBullet": (player, x, y) => { + return !KDMapData.Bullets.some((b) => { + return b.x == x && b.y == y && !(b.bullet?.source != player?.id); + }); + }, + "ShadowDance": (player, x, y) => { + return (KinkyDungeonFlags.get("TheShadowWithin") || KinkyDungeonBrightnessGet(player.x, player.y) < KDShadowThreshold || KDNearbyEnemies(player.x, player.y, 1.5).some((en) => {return en.Enemy?.tags?.shadow;})) + && (KinkyDungeonBrightnessGet(x, y) < KDShadowThreshold || KDNearbyEnemies(x, y, 1.5).some((en) => {return en.Enemy?.tags?.shadow;})); + }, + "LiquidMetalBurst": (_player, x, y) => { + + return KDEffectTileTags(x, y).liquidmetal; + }, + "weapon": (_player, _x, _y) => { + return KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed; + }, + "FloatingWeapon": (_player, _x, _y) => { + return KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed && (!KinkyDungeonPlayerDamage.noHands || KinkyDungeonPlayerDamage.telekinetic); + + }, + "ShockCollar": (_player, _x, _y) => { + return !!KinkyDungeonLeashingEnemy() && !!_player.leash; + }, + + +}; + + + +let KDCustomCost: Record void> = { + "SprintPlusAttack": (data) => { + data.cost = Math.round(10 * -(KDAttackCost().attackCost + KDSprintCost())) + "SP"; + data.color = "#88ff88"; + }, + "LimitSurge": (data) => { + data.cost = "50WP"; + data.color = "#ff5277"; + }, + "DesperateStruggle": (data) => { + data.cost = "20WP"; + data.color = "#ff5277"; + }, + "stamina": (data) => { + data.cost = Math.round(10 * KinkyDungeonGetStaminaCost(data.spell)) + "SP"; + data.color = "#88ff88"; + }, + "arcane_blast": (data) => { + data.cost = Math.min(KinkyDungeonStatManaMax * 2.5, Math.round(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ArcaneEnergy") * 10)) + "E"; + data.color = "#8888ff"; + }, + "arcane_akashic": (data) => { + data.cost = "100E"; + data.color = "#e7cf1a"; + }, + "rhythm": (data) => { + data.cost = ""; + }, + "evasive": (data) => { + data.cost = Math.round(10 * KDEvasiveManeuversCost()) + "SP"; + data.color = "#88ff88"; + }, + "scaleWithDP": (data) => { + let cost = KinkyDungeonGetManaCost(data.spell, false, false); + data.cost = Math.round(10 * cost) + "MP"; + data.color = "#8888ff"; + }, + "ShockCollar": (data) => { + let cost = KDShockCollarCost(); + data.cost = Math.round(10 * cost) + "DP"; + data.color = "#ff5277"; + }, + "Enrage": (data) => { + if (KinkyDungeonFlags.get("Enraged")) { + data.cost = Math.round(KinkyDungeonFlags.get("Enraged")) + " " + TextGet("KDTurns"); + data.color = "#ffffff"; + } + }, +}; diff --git a/Game/src/magic/KinkyDungeonPlayerEffects.ts b/Game/src/magic/KinkyDungeonPlayerEffects.ts new file mode 100644 index 000000000..b19366dd0 --- /dev/null +++ b/Game/src/magic/KinkyDungeonPlayerEffects.ts @@ -0,0 +1,2562 @@ +'use strict'; + + +let KDPlayerEffects: Record {sfx: string, effect: boolean}> = { + "MagicRope": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (dmg.happened) { + let roped = KDPlayerEffectRestrain(spell, playerEffect.count || 2, playerEffect.tags, undefined, false, false, false, false); + + if (roped) KDSendStatus('bound', "WeakMagicRopeArms", "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonMagic" + (playerEffect.msg || "Rope")).KDReplaceOrAddDmg( dmg.string) + , "#ff5277", playerEffect.time); + if (roped) KDMapData.TrapsTriggered++; + if (roped) return {sfx: "MagicSlash", effect: true}; + } + return {sfx: "Shield", effect: false}; + }, + "Disrobe": (_target, _damage, _playerEffect, _spell, _faction, _bullet, entity) => { + let strip = false; + let CurrentDress = KinkyDungeonCurrentDress; + let DressList = KDGetDressList()[CurrentDress]; + for (let clothes of DressList) { + if (!clothes.Lost && ( + !ModelDefs[clothes.Item].Protected + && ["Shirts", "Skirts", "Pants", "Shorts", "Tops", "Clothes"].some((ee) => { + return ModelDefs[clothes.Item]?.Categories?.includes(ee); + }) + )) { + clothes.Lost = true; + strip = true; + } + } + if (strip) { + KinkyDungeonDressPlayer(); + KinkyDungeonSendTextMessage(1, TextGet("KDWitchShibariDisrobe").replace("ENMY", TextGet("Name" + entity?.Enemy?.name)), "#e7cf1a", 3); + return {sfx: "Tickle", effect: true}; + } + return {sfx: "", effect: false}; + }, + "EnvDamage": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage, flags: playerEffect?.flags}, bullet); + if (dmg.happened) { + KinkyDungeonSendTextMessage(Math.min(playerEffect.power, 5), TextGet("KinkyDungeonDamageSelf").KDReplaceOrAddDmg(dmg.string), "#ff5277", 1); + return {sfx: "DamageWeak", effect: true}; + } + + return {sfx: undefined, effect: false}; + }, + "GhostHaunt": (target, _damage, _playerEffect, _spell, _faction, _bullet, _entity) => { + let count = 1; + if (target?.player && KDEntityBuffedStat(target, "Haunting")) { + count = KDEntityBuffedStat(target, "Haunting") + 1; + } + KinkyDungeonApplyBuffToEntity(target, + { + id: "Haunted", + type: "Haunting", + power: count, + events: [ + {type: "Haunting", trigger: "tick", dist: 4.5, count: 1}, + ], + aura: "#ffffff", + aurasprite: "Null", + duration: 9999, infinite: true,}); + return {sfx: "Evil", effect: true}; + }, + "ObserverBeam": (target, _damage, _playerEffect, spell, _faction, bullet, _entity) => { + // If you are hit then the shadow is called + for (let en of KDMapData.Entities) { + if (en.Enemy?.tags?.obsAttract) { + if ((!en.aware || en.idle) && (!en.action || en.action == "observerchase") + && !en.path + && !KDAllied(en) + && (KDHostile(en) || KDRandom() < 0.33) + && (!en.Enemy.tags.peaceful || KDRandom() < 0.15)) { + en.gx = target.x; + en.gy = target.y; + en.action = "observerchase"; + KDAddThought(en.id, "Search", 2, + 2 + 2*KDistEuclidean(en.x - target.x, en.y - target.y)); + + } + } + } + if (!KDBulletAlreadyHit(bullet, target, true)) { + let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + if (dmg.happened) { + let count = 1; + if (target?.player && KDEntityBuffedStat(target, "Cursed")) { + count = Math.min(10, KDEntityBuffedStat(target, "Cursed") + 1); + } + KinkyDungeonApplyBuffToEntity(target, + { + id: "Cursed", + type: "Cursed", + power: count, + events: [ + {type: "Cursed", trigger: "tick", count: 1}, + ], + aura: "#4488ff", + aurasprite: "Null", + duration: 9999, infinite: true,}); + + KinkyDungeonSendTextMessage(3, TextGet("KDObserverCurseApply").KDReplaceOrAddDmg(dmg.string), "#ff5277", 1); + return {sfx: "Evil", effect: true}; + } + } + + return {sfx: "Shield", effect: false}; + }, + "TheShadowCurse": (_target, _damage, playerEffect, _spell, _faction, _bullet, entity) => { + let applied = ""; + + for (let i = 0; i < playerEffect.count; i++) { + let curse = KDGetByWeight(KinkyDungeonGetCurseByListWeighted(["Common"], "", false, 0, 100)); + let restraint = KDChooseRestraintFromListGroupPri( + KDGetRestraintsEligible({tags: ['leatherRestraints', 'leatherRestraintsHeavy', "obsidianRestraints", "shadowLatexRestraints"]}, 10, 'grv', true, undefined, undefined, undefined, false, undefined, undefined, undefined, undefined, curse), + KDGetProgressiveOrderFun(), true)?.name; + + if (!restraint) restraint = KDChooseRestraintFromListGroupPri( + KDGetRestraintsEligible({tags: ['leatherRestraints', 'leatherRestraintsHeavy', "obsidianRestraints", "shadowLatexRestraints"]}, 10, 'grv', true, undefined, undefined, undefined, false, undefined, undefined, undefined, undefined, + curse, undefined, undefined, undefined, undefined, { + extraOptions: entity?.items + }), + KDGetProgressiveOrderFun(), true)?.name; + + if (restraint && KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(restraint), 0, true, "", true, false, undefined, "Observer", true, curse)) { + applied = restraint || applied; + } + } + + KinkyDungeonSendTextMessage(3, TextGet("KDObserverVanish" + (applied ? "Succeed" : "Fail")).replace("RNAME", + TextGet("Restraint" + applied)), "#ff5277", 1); + + let point = KinkyDungeonGetRandomEnemyPoint(true, false, undefined, 10, 10); + if (point) { + KDMoveEntity(entity, point.x, point.y, false); + + KinkyDungeonRemoveBuffsWithTag(entity, ["displaceend"]); + } + + return {sfx: "Evil", effect: true}; + }, + "CursingCircle": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { + let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + + if (dmg.happened) { + let corruption = KDEntityBuffedStat(KDPlayer(), "Corruption"); + let applyCurse = KinkyDungeonStatWill < 0.1 || corruption >= 20; + + KDAddSpecialStat("Corruption", KDPlayer(), Math.floor(2 + 6 * KDRandom()), false); // Add a significant amount of corruption + + KinkyDungeonSendTextMessage(3, TextGet("KDEpicenterCurseDamage").KDReplaceOrAddDmg(dmg.string), "#ff5277", 2); + + if (applyCurse) { + if (!KinkyDungeonPlayerBuffs.CursingCircle && corruption < 100) { + KinkyDungeonSendTextMessage(9, TextGet("KDEpicenterCurseEffectStart"), "#8E72AA", playerEffect.time); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "CursingCircle", + aura: "#8E72AA", + type: "CursingCircle", + duration: playerEffect.time, + }); + } else { + let happened = KDPlayerEffectRestrain(spell, playerEffect.count, [playerEffect.kind], "Curse", false, true, false, false, false); + + if (happened.length > 0) { + for (let en of KDMapData.Entities) { + if (en.Enemy.tags?.epicenterCursed) { + en.hp = 0; + en.playerdmg = 0; + } + } + if (KinkyDungeonPlayerBuffs.CursingCircle) + KinkyDungeonPlayerBuffs.CursingCircle.duration = 0; + KinkyDungeonSendTextMessage(9, TextGet("KDEpicenterCurseEffectEnd"), "#8E72AA", 5); + } + } + } + return {sfx: "Evil", effect: true}; + } + + return {sfx: "Shield", effect: false}; + }, + "MaidChastity": (_target, _damage, playerEffect, spell, faction, _bullet, _entity) => { + + if (KinkyDungeonFlags.get("ChastityBelts")) { + // Tease the player + /*if (KinkyDungeonFlags.get("Vibes")) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + KinkyDungeonSendTextMessage(Math.min(playerEffect.power, 5), TextGet("KDMaidforceHeadVibe").KDReplaceOrAddDmg(dmg.string), "#ff9999", 1); + if (dmg.happened) return {sfx: "Vibe", effect: true}; return {sfx: undefined, effect: false}; + }*/ + } else { + if (KDTestSpellHits(spell, 1.0, 1.0)) { + let restrained = false; + for (let i = 0; i < 4; i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["maidVibeRestraints"]}, KDGetEffLevel() + (playerEffect.level || 0), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd && KinkyDungeonAddRestraintIfWeaker(restraintAdd, playerEffect.tightness || 0, false, undefined, false, false, undefined, faction)) { + KDSendStatus('bound', restraintAdd.name, "maidhead"); + restrained = true; + } + } + if (restrained) + KinkyDungeonSendTextMessage(8, TextGet("KDMaidforceHeadBelting"), "#ff5277", 2, false, true); + + return {sfx: "LockHeavy", effect: restrained}; + } + } + return {sfx: undefined, effect: false}; + }, + "ShadowBolt": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + if (KDRandom() < 0.5) KDAddSpecialStat("Corruption", KDPlayer(), 1, false); // Add a small amount of corruption + KDPlayerEffectRestrain(spell, playerEffect.count, ["shadowHands"], "Ghost", false, false, false, false); + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonShadowBolt").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + } + return {sfx: "Evil", effect: true}; + }, + "BearTrapStun": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { + let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KDStunTurns(playerEffect.time); + KinkyDungeonSendTextMessage(4, TextGet("KDBearTrapHit").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time+1); + + return {sfx: "Clang", effect: true}; + }, + "LatexSpray": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.5, 0.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + + let mult = playerEffect?.mult || 3; + //let integration = KDEntityBuffedStat(KDPlayer(), "LatexIntegration"); + + KDAddSpecialStat("LatexIntegration", KDPlayer(), mult * (playerEffect?.power || spell?.power || 1), false); // Add a significant amount of corruption + + let textIndex = "0"; + let buffedStat = KDEntityBuffedStat(KDPlayer(), "LatexIntegration"); + + if (buffedStat >= 99) { + KDUnlockPerk("StartLatexIntegration"); + textIndex = "4"; + } else if (buffedStat >= 75) { + textIndex = "3"; + } else if (buffedStat >= 50) { + textIndex = "2"; + } else if (buffedStat >= 25) { + textIndex = "1"; + } else { + textIndex = "0"; + } + + KinkyDungeonSendTextMessage(4, TextGet("KDLatexIntegration" + textIndex).KDReplaceOrAddDmg( dmg.string), "#2789cd", 1); + + + return {sfx: "Dollify", effect: true}; + } + return {sfx: "Fwoosh", effect: true}; + }, + "RubberBolt": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KDPlayerEffectRestrain(spell, playerEffect.count, ["redLatexBasic"], "Dollsmith", false, false, false, false); + + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRubberBolt").KDReplaceOrAddDmg( dmg.string), "yellow", 1); + + } + return {sfx: "Dollify", effect: true}; + }, + "RestrainingBolt": (target, _damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + if (!dmg.happened) return {sfx: "Shield", effect: false}; + let restrain = KDPlayerEffectRestrain(spell, playerEffect.count, ["wardenCuffs"], "Warden", false, false, false, false); + if (restrain.length > 0) { + KinkyDungeonSendTextMessage(7, TextGet("KDRestrainingBoltBind").KDReplaceOrAddDmg( dmg.string), "yellow", 1); + return {sfx: "MagicSlash", effect: true}; + } else if (!KinkyDungeonFlags.get("pinned") && KinkyDungeonPlayerTags.get("Warden")) { + let moved = false; + let dist = playerEffect.dist; + for (let i = 0; i < dist; i++) { + let newX = target.x + Math.round(1 * Math.sign(bullet.vx)); + let newY = target.y + Math.round(1 * Math.sign(bullet.vy)); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) + && (dist == 1 || KinkyDungeonCheckProjectileClearance(target.x, target.y, newX, newY))) { + KDMovePlayer(newX, newY, false); + moved = true; + } + } + if (moved) { + KinkyDungeonSendTextMessage(9, TextGet("KDRestrainingBoltKnockback").KDReplaceOrAddDmg( dmg.string), "yellow", 1); + return {sfx: "Evil", effect: true}; + } + else { + KinkyDungeonSendTextMessage(10, TextGet("KDRestrainingBoltPin").KDReplaceOrAddDmg( dmg.string), "yellow", 4); + KDStunTurns(3); + KinkyDungeonSetFlag("pinned", 5); + return {sfx: "Evil", effect: true}; + } + } else { + KinkyDungeonSendTextMessage(2, TextGet("KDRestrainingBoltHit").KDReplaceOrAddDmg( dmg.string), "red", 1); + return {sfx: "Shield", effect: true}; + } + + } + return {sfx: "Miss", effect: false}; + }, + "MagicMissile": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + if (!dmg.happened) return {sfx: "Shield", effect: false}; + let restrain = KDPlayerEffectRestrain(spell, playerEffect.count, ["wardenCuffs"], "Warden", false, false, false, false); + if (restrain.length > 0) { + KinkyDungeonSendTextMessage(7, TextGet("KDMagicMissileBind").KDReplaceOrAddDmg( dmg.string), "yellow", 1); + return {sfx: "MagicSlash", effect: true}; + } else if (!KDPlayerIsStunned()) { + KinkyDungeonSendTextMessage(10, TextGet("KDMagicMissileStun").KDReplaceOrAddDmg( dmg.string), "yellow", 4); + KDStunTurns(3); + KinkyDungeonSetFlag("pinned", 5); + return {sfx: "MagicSlash", effect: true}; + } else { + KinkyDungeonSendTextMessage(2, TextGet("KDMagicMissileHit").KDReplaceOrAddDmg( dmg.string), "red", 1); + return {sfx: "Shield", effect: true}; + } + + } + return {sfx: "Miss", effect: false}; + }, + "EncaseBolt": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KDPlayerEffectRestrain(spell, playerEffect.count, ["latexEncaseRandom"], "Dollsmith", false, false, false, false); + + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonEncaseBolt").KDReplaceOrAddDmg( dmg.string), "yellow", 1); + + } + return {sfx: "Dollify", effect: true}; + }, + "EnemyWindBlast": (target, damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 1.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let dist = playerEffect.dist; + for (let i = 0; i < dist; i++) { + let newX = target.x + Math.round(1 * Math.sign(bullet.vx)); + let newY = target.y + Math.round(1 * Math.sign(bullet.vy)); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) + && (dist == 1 || KinkyDungeonCheckProjectileClearance(target.x, target.y, newX, newY))) { + KDMovePlayer(newX, newY, false); + } + } + KinkyDungeonSendTextMessage(4, TextGet("KDEnemyWindBlast").KDReplaceOrAddDmg( dmg.string), "yellow", 1); + + } + return {sfx: "Fwosh", effect: true}; + }, + "PushAway": (target, damage, playerEffect, spell, _faction, bullet, entity) => { + if (KDTestSpellHits(spell, 1.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + if (dmg.happened) { + let dist = playerEffect.dist; + for (let i = 0; i < dist; i++) { + let newX = target.x + Math.round(1 * Math.sign(entity.x)); + let newY = target.y + Math.round(1 * Math.sign(entity.y)); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) + && (dist == 1 || KinkyDungeonCheckProjectileClearance(target.x, target.y, newX, newY))) { + KDMovePlayer(newX, newY, false); + } + } + KinkyDungeonSendTextMessage(4, TextGet(playerEffect.msg || "KDEnemyWindBlast").KDReplaceOrAddDmg( dmg.string), "#e7cf1a", 1); + } + + } + return {sfx: "Fwosh", effect: true}; + }, + "GravityPull": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 1.0, 0.0)) { + let dist = playerEffect.dist; + for (let i = 0; i < dist; i++) { + let dd = KDistEuclidean(KinkyDungeonPlayerEntity.x - bullet.x, KinkyDungeonPlayerEntity.y - bullet.y); + let newX = Math.round(KinkyDungeonPlayerEntity.x + (bullet.x - KinkyDungeonPlayerEntity.x)/dd); + let newY = Math.round(KinkyDungeonPlayerEntity.y + (bullet.y - KinkyDungeonPlayerEntity.y)/dd); + if (KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(newX, newY)) && KinkyDungeonNoEnemy(newX, newY, true) + && (dist == 1 || KinkyDungeonCheckProjectileClearance(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, newX, newY))) { + KDMovePlayer(newX, newY, false); + } + } + if (playerEffect.power) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect.power, type: playerEffect.damage}); + KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonGravityPull").KDReplaceOrAddDmg( dmg.string), "#8800ff", 2); + } else { + KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonGravityPull2"), "#8800ff", 2); + } + KDStunTurns(1); + } + return {sfx: "Evil", effect: true}; + }, + "LatexBubble": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.5, 0.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + + if (KinkyDungeonPlayerBuffs.LatexBubble|| KinkyDungeonPlayerBuffs.LatexBubble2 || playerEffect.power > 5) { + // Add the sarcophagus + let newAdd = KinkyDungeonGetRestraint({tags: ["latexSphere"]}, 100, "grv"); + if (newAdd) { + KinkyDungeonAddRestraintIfWeaker(newAdd, spell.power, false, undefined, false, false, undefined, faction); + KinkyDungeonSendTextMessage(4, TextGet("KDLatexBubbleEngulf").KDReplaceOrAddDmg( dmg.string), "#2789cd", 1); + } + } else { + + KinkyDungeonSendTextMessage(4, TextGet("KDLatexBubble").KDReplaceOrAddDmg( dmg.string), "#2789cd", 1); + } + + + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "LatexBubble", + aura: "#2789cd", + aurasprite: "LatexBubble", + noAuraColor: true, + buffSprite: true, + type: "meleeDamageBuff", + power: -0.3, + duration: playerEffect.time, + tags: ["debuff"], + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "LatexBubble2", + type: "Blindness", + power: 4, + duration: playerEffect.time, + tags: ["debuff"], + }); + } + return {sfx: "Fwosh", effect: true}; + }, + "LatexBall": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.5, 0.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + + if (KinkyDungeonPlayerBuffs.LatexBubble|| KinkyDungeonPlayerBuffs.LatexBubble2 || playerEffect.power > 5) { + // Add the sarcophagus + let newAdd = KinkyDungeonGetRestraint({tags: ["ballsuit"]}, 100, "grv"); + if (newAdd) { + KinkyDungeonAddRestraintIfWeaker(newAdd, spell.power, false, undefined, false, false, undefined, faction); + KinkyDungeonSendTextMessage(4, TextGet("KDLatexBallEngulf").KDReplaceOrAddDmg( dmg.string), "#2789cd", 1); + } + } else { + + KinkyDungeonSendTextMessage(4, TextGet("KDLatexBall").KDReplaceOrAddDmg( dmg.string), "#2789cd", 1); + } + + + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "LatexBubble", + aura: "#2789cd", + aurasprite: "LatexBubble", + noAuraColor: true, + buffSprite: true, + type: "meleeDamageBuff", + power: -0.3, + duration: playerEffect.time, + tags: ["debuff"], + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "LatexBubble2", + type: "Blindness", + power: 4, + duration: playerEffect.time, + tags: ["debuff"], + }); + } + return {sfx: "Fwosh", effect: true}; + }, + "WaterBubble": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.5, 0.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + if (KinkyDungeonPlayerBuffs.WaterBubble|| KinkyDungeonPlayerBuffs.WaterBubble2 || playerEffect.power > 4) { + // Add the sarcophagus + let newAdd = KinkyDungeonGetRestraint({tags: ["bubble"]}, 100, "grv"); + if (newAdd) { + KinkyDungeonAddRestraintIfWeaker(newAdd, spell.power, false, undefined, false, false, undefined, faction); + KinkyDungeonSendTextMessage(4, TextGet("KDWaterBubbleEngulf").KDReplaceOrAddDmg( dmg.string), "#2789cd", 1); + } + } else { + + KinkyDungeonSendTextMessage(4, TextGet("KDWaterBubble").KDReplaceOrAddDmg( dmg.string), "#2789cd", 1); + } + KDApplyBubble(KinkyDungeonPlayerEntity, playerEffect.time); + } + return {sfx: "Fwosh", effect: true}; + }, + "EncaseBoltDrone": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + if (KDGameData.MovePoints >= 0) { + KDGameData.MovePoints = Math.min(-1, KDGameData.MovePoints); + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonEncaseBoltDroneSlow").KDReplaceOrAddDmg( dmg.string), "yellow", 1); + } else { + KDPlayerEffectRestrain(spell, playerEffect.count, ["latexEncaseRandom"], "Dollsmith", false, false, false, false); + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonEncaseBoltDrone").KDReplaceOrAddDmg( dmg.string), "yellow", 1); + } + + } + return {sfx: "Dollify", effect: true}; + }, + "RubberMissile": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KDPlayerEffectRestrain(spell, playerEffect.count, ["latexEncaseRandom"], "Dollsmith"); + + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRubberMissile").KDReplaceOrAddDmg( dmg.string), "yellow", 1); + + return {sfx: "Lightning", effect: true}; + }, + "ObsidianBolt": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KDPlayerEffectRestrain(spell, playerEffect.count, ["obsidianRestraints"], "Elemental", false, false, false, false); + + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonObsidianBolt").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + + } + return {sfx: "Evil", effect: true}; + }, + "MithrilBolt": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KDPlayerEffectRestrain(spell, playerEffect.count, ["mithrilRope"], "Elemental", false, false, false, false); + + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonMithrilBolt").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + + } + return {sfx: "Evil", effect: true}; + }, + "LockBullet": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 1.0, 1.0)) { + + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (dmg.happened) { + //KDPlayerEffectRestrain(spell, playerEffect.count, ["mithrilRope"], "Elemental", false, false, false, false); + + let Lockable = KinkyDungeonPlayerGetLockableRestraints(); + let Lstart = 0; + let Lmax = Lockable.length-1; + let locked = false; + if (Lmax >= 0) { + Lstart = Math.floor(Lmax*KDRandom()); // Lock one at random + for (let L = Lstart; L <= Lmax; L++) { + let l = playerEffect.type ? KDProcessLock(playerEffect.type) : KinkyDungeonGenerateLock(true, undefined, undefined, undefined, {bullet: bullet}); + KinkyDungeonLock(Lockable[L], l); // Lock it! + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonLockBullet").KDReplaceOrAddDmg( dmg.string) + .replace("LKTYP", TextGet(`Kinky${l}LockType`)), "orange", 1); + locked = true; + } + } + + if (!locked) { + if (dmg.string) + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonLockBulletFail") + .replace("Dmgdlt", dmg.string), "yellow", 1); + if (!KinkyDungeonFlags.get("slowSpellFlag")) { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); + KinkyDungeonSetFlag("slowSpellFlag", playerEffect.time || 2); + } + } + } else return {sfx: "Shield", effect: false}; + + } + return {sfx: "LockHeavy", effect: true}; + }, + "CelestialBolt": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KDPlayerEffectRestrain(spell, playerEffect.count, ["celestialRopes"], "Angel", false, false, false, false); + + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonCelestialBolt").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + + } + return {sfx: "Evil", effect: true}; + }, + "BoundByFate": (_target, _damage, playerEffect, _spell, _faction, bullet, _entity) => { + KDCreateAoEEffectTiles( + bullet.x, + bullet.y, + { + name: "FateBoundGround", + duration: playerEffect.time + 1, + }, 0, 2.5, undefined, undefined, undefined); + + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonBoundByFate"), "yellow", playerEffect.time); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, KDBoundByFate, { + duration: playerEffect.time, + }); + + return {sfx: "Evil", effect: true}; + }, + "StarBondage": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (dmg.happened) { + KDPlayerEffectRestrain(spell, playerEffect.count, [playerEffect.kind], "Demon"); + KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonStarBondage").KDReplaceOrAddDmg( dmg.string), "#ff5277", 4); + } else return {sfx: "Shield", effect: false}; + + return {sfx: "Evil", effect: true}; + }, + "Taunted": (_target, _damage, playerEffect, _spell, _faction, bullet, _entity) => { + let ent = (bullet?.bullet?.source ? KinkyDungeonFindID(bullet.bullet.source) : null) || bullet; + KDCreateAoEEffectTiles( + ent.x, + ent.y, + { + name: "TauntGround", + duration: playerEffect.time + 1, + }, 0, Math.max(2.5, KDistEuclidean(ent.x - KinkyDungeonPlayerEntity.x, ent.y - KinkyDungeonPlayerEntity.y)), undefined, undefined, undefined); + + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonTaunted"), "yellow", playerEffect.time); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, KDTaunted, { + duration: playerEffect.time, + }); + + return {sfx: "Evil", effect: true}; + }, + "TauntShame": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + + KinkyDungeonSendTextMessage(7, TextGet("KDTauntPunishment").KDReplaceOrAddDmg( dmg.string), "#ff5277", 1); + KDStunTurns(KinkyDungeonFlags.get("sprint") ? 5 : 4); + if (!dmg.happened) return{sfx: "Shield", effect: true}; + //KDPlayerEffectRestrain(spell, playerEffect.count, [playerEffect.kind], "Warden"); + + return {sfx: "Tickle", effect: true}; + }, + "MoonBondage": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + if (KDTestSpellHits(spell, 0.0, 0.2)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + + KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonMoonBondage").KDReplaceOrAddDmg( dmg.string), "#ff5277", 1); + KDPlayerEffectRestrain(spell, playerEffect.count, [playerEffect.kind], "Demon"); + } + return {sfx: "Evil", effect: true}; + }, + "FuukaOrb": (_target, _damage, _playerEffect, _spell, _faction, _bullet, _entity) => { + KDTripleBuffKill("FuukaOrb", KinkyDungeonPlayerEntity, 300, (_tt) => { + // Nothing! + }, "Sealing", (tt) => { + if (tt?.player) { + KinkyDungeonApplyBuffToEntity(tt, { + id: "FuukaOrb", + duration: 300, + tags: ["removeNewMap", "removeDefeat"], + power: 1, + type: "SlowLevel", + aura: "#ff6767", + buffSprite: true, + aurasprite: "AuraSeal", + }); + } + }, (tt) => { + KinkyDungeonApplyBuffToEntity(tt, { + id: "FuukaOrb", + duration: 300, + tags: ["removeNewMap", "removeDefeat"], + power: 3, + type: "SlowLevel", + aura: "#ff6767", + buffSprite: true, + aurasprite: "AuraSeal", + }); + }, (tt) => { + + KinkyDungeonApplyBuffToEntity(tt, { + id: "FuukaOrb", + duration: 300, + tags: ["removeNewMap", "removeDefeat"], + power: 100, + type: "SlowLevel", + aura: "#ff6767", + buffSprite: true, + aurasprite: "AuraSeal", + }); + }, ); + return {sfx: "Evil", effect: true}; + }, + "ShadowSeal": (target, _damage, _playerEffect, _spell, _faction, _bullet, _entity) => { + KinkyDungeonApplyBuffToEntity(target, { + id: "ShadowSeal", + duration: 10, + tags: ["removeNewMap", "removeDefeat"], + power: 100, + type: "SlowLevel", + aura: "#ff6767", + buffSprite: true, + aurasprite: "AuraSeal", + }); + KinkyDungeonMakeNoise(10, target.x, target.y); + KinkyDungeonSendTextMessage(8, TextGet("KDShadowSeal"), "#aa55ff", 4); + return {sfx: "Evil", effect: true}; + }, + "SlimeEngulf": (_target, _damage, playerEffect, _spell, faction, _bullet, _entity) => { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["slimeRestraintsRandom"]}, KDGetEffLevel() + playerEffect.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (!restraintAdd) { + KDTripleBuffKill("SlimeEngulfEnd", KinkyDungeonPlayerEntity, 6, (_tt) => { + // Remove the nearby slime kraken + let kraken = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 10); + + // Put the player somewhere and harden all slime + KinkyDungeonPassOut(); + for (let i = 0; i < 30; i++) { + KDAdvanceSlime(false, ""); + } + let newAdd = KinkyDungeonGetRestraintByName("HardSlimeCollar"); + if (newAdd) { + KinkyDungeonAddRestraintIfWeaker(newAdd, playerEffect.power, true, undefined, false, false, undefined, faction, true); + } + + let master = null; + for (let enemy of kraken) { + if (enemy.Enemy.name == "SlimeKraken") { + KDKickEnemy(enemy); + master = enemy; + } + } + // Recombine + if (master) + for (let enemy of kraken) { + if (enemy.boundTo == master.id) { + enemy.hp = 0; + master.hp = Math.min(master.Enemy.maxhp, master.hp + KDMagicDefs.SlimeKraken_TentacleCost); + } + } + + }, "Blindness"); + return {sfx: "Struggle", effect: true}; + } + return {sfx: "RubberBolt", effect: false}; + }, + "SarcoEngulf": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let added = []; + for (let i = 0; i < playerEffect.power; i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["mummyRestraints"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + added.push(restraintAdd); + effect = true; + } + } + if (added.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSarcoEngulf").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + effect = true; + } + + return {sfx: "MagicSlash", effect: effect}; + }, + + "HexLatex": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let added = []; + let converted = []; + for (let i = 0; i < playerEffect.power; i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["mummyRestraints"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + added.push(restraintAdd); + effect = true; + } + } + if (converted.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonHexLatex").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + effect = true; + } else + if (added.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonHexLatexFail").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + effect = true; + } + + return {sfx: "MagicSlash", effect: effect}; + }, + "SarcoHex": (_target, _damage, _playerEffect, spell, faction, _bullet, _entity) => { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); + if (!restraintAdd && !KinkyDungeonPlayerTags.get("Sarcophagus")) { + KDTripleBuffKill("SarcoHexEnd", KinkyDungeonPlayerEntity, 6, (_tt) => { + // Remove the nearby sarcokraken and all tentacles + let kraken = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 10); + for (let enemy of kraken) { + if (enemy.Enemy.name == "SarcoKraken" || enemy.Enemy.name == "SarcoMinion") enemy.hp = 0; + } + // Put the player somewhere + let candidates = KDMapData.JailPoints?.filter((point) => {return point.type == "furniture" + && KinkyDungeonTilesGet(point.x + ',' + point.y)?.Furniture == "Sarcophagus";}); + if (candidates.length == 0) + candidates = KDMapData.JailPoints?.filter((point) => {return point.type == "furniture";}); + if (candidates && candidates.length > 0) { + let candidate = candidates[Math.floor(KDRandom() * candidates.length)]; + KDMovePlayer(candidate.x, candidate.y, false); + } + // Add the sarcophagus + let newAdd = KinkyDungeonGetRestraint({tags: ["sarcophagus"]}, 100, "tmb"); + if (newAdd) { + KinkyDungeonAddRestraintIfWeaker(newAdd, spell.power, false, undefined, false, false, undefined, faction); + } + newAdd = KinkyDungeonGetRestraintByName("MysticDuctTapeCollar"); + if (newAdd) { + KinkyDungeonAddRestraintIfWeaker(newAdd, spell.power, true, undefined, false, false, undefined, faction, true); + } + }, "Blindness"); + return {sfx: "Evil", effect: true}; + } + return {sfx: "Struggle", effect: false}; + }, + "Bind": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 1.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let restraintAdd = KinkyDungeonGetRestraint({tags: playerEffect.tags || [playerEffect.tag]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, playerEffect.tags || [playerEffect.tag], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpell" + spell.name + "Bind").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + effect = true; + } else { + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpell" + spell.name + "Damage").KDReplaceOrAddDmg(dmg.string), "#ff5277", 2); + if (dmg.happened) effect = true; + } + if (playerEffect.time == 1) { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); + } else if (playerEffect.time) { + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); + } + return {sfx: "Struggle", effect: effect}; + + } + return {sfx: "Miss", effect: effect}; + }, + "AmpuleBlue": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 1.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + effect = true; + let restraintAdd = KinkyDungeonGetRestraint({tags: ["latexRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), undefined, undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + { + allowLowPower: true + }); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["latexRestraints"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpellShatterBind" + spell.name).KDReplaceOrAddDmg( dmg.string), "#ff5277", 1); + effect = true; + } else { + if (KinkyDungeonCurrentDress != "BlueSuit" && !KinkyDungeonStatsChoice.get("KeepOutfit")) { + KinkyDungeonSetDress("BlueSuit", "Latex"); + KinkyDungeonDressPlayer(); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpellShatterDress" + spell.name).KDReplaceOrAddDmg( dmg.string), "#ff5277", 1); + effect = true; + } else { + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpellShatter" + spell.name).KDReplaceOrAddDmg( dmg.string), "#ff5277", 1); + } + + } + return {sfx: "Dollify", effect: effect}; + } + return {sfx: "Miss", effect: effect}; + + }, + "Hairpin": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.2, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + if (!KinkyDungeonGetRestraintItem("ItemEyes")) + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonHairpin").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + effect = true; + } + return {sfx: "Miss", effect: effect}; + }, + + "Blind": (_target, _damage, playerEffect, _spell, _faction, _bullet, _entity) => { + let effect = false; + if (Math.round( + playerEffect.time * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "lightDamageResist")) + ) > 0) { + if (!(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "blindResist") > 0)) + KDGameData.visionAdjust = Math.min(1, (KDGameData.visionAdjust || 0) + 1.5); + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, + Math.round(playerEffect.time * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "blindResist")))); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonBlindSelf"), "#ff5277", Math.round( + playerEffect.time * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "lightDamageResist")) + )); + effect = true; + } + + return {sfx: "Damage", effect: effect}; + }, + "DamageNoMsg": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (dmg.happened) effect = true; + return {sfx: "DamageWeak", effect: effect}; + }, + "Ignition": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + effect = true; + KinkyDungeonSendTextMessage(playerEffect.power, TextGet("KinkyDungeonBuffIgniteDamage").KDReplaceOrAddDmg(dmg.string), "#ff5277", 1); + return {sfx: "FireSpell", effect: effect}; + }, + "IceBolt": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); + + KinkyDungeonSendTextMessage(Math.min(spell.power, 5), TextGet("KDEffectWitchBoulder").KDReplaceOrAddDmg(dmg.string), "#ff5277", 1); + effect = true; + + return {sfx: "Freeze", effect: effect}; + } + return {sfx: "Bones", effect: effect}; + }, + "WitchBoulder": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 1.0, 0.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); + KDGameData.KneelTurns = 2; + KinkyDungeonSendTextMessage(Math.min(spell.power, 5), TextGet("KDEffectWitchBoulder").KDReplaceOrAddDmg(dmg.string), "#ff5277", 1); + effect = true; + + return {sfx: "ClangDeep", effect: effect}; + } + return {sfx: "Miss", effect: effect}; + }, + "Damage": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonSendTextMessage(Math.min(spell.power, 5), TextGet("KinkyDungeonDamageSelf").KDReplaceOrAddDmg(dmg.string), "#ff5277", 1); + effect = true; + return {sfx: undefined, effect: effect}; + }, + + "SingleChain": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let restraintAdd = KinkyDungeonGetRestraint({tags: ["chainRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["chainRestraints"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleChain").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + effect = true; + } else { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + + } + effect = true; + return {sfx: "Chain", effect: effect}; + } + return {sfx: "ArmorHit", effect: effect}; + }, + "SingleMagicBind": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let restraintAdd = KinkyDungeonGetRestraint({tags: playerEffect.tags}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, playerEffect.tags, faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingle" + (playerEffect.msg || "Chain")).KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + effect = true; + } + //KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + effect = true; + return {sfx: playerEffect.sfx || "Chain", effect: effect}; + } + return {sfx: "ArmorHit", effect: effect}; + }, + + "RubberBullets": (_target, _damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0.2)) { + let dmg = spell.power ? KinkyDungeonDealDamage({damage: playerEffect.power || spell.power, type: playerEffect.damage || spell.damage}, bullet) : {happened: 0, string: "null"}; + if (spell.power && !dmg) return {sfx: "Shield", effect: false}; + if (KDRandom() < 0.25 && KinkyDungeonStatWill < KinkyDungeonStatWillMax/2) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["captureFoamRandom"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["captureFoamRandom"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonRubberBulletsAttach").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + } + } else KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonRubberBullets").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + + effect = true; + return {sfx: "RubberBolt", effect: effect}; + } + return {sfx: "Miss", effect: effect}; + }, + "RubberSniper": (_target, _damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0.2)) { + let dmg = spell.power ? KinkyDungeonDealDamage({damage: playerEffect.power || spell.power, type: playerEffect.damage || spell.damage}, bullet) : {happened: 0, string: "null"}; + if (spell.power && !dmg) return {sfx: "Shield", effect: false}; + let restraintAdd = KinkyDungeonGetRestraint({tags: ["captureFoamRandom"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["captureFoamRandom"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonRubberSniperAttach").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + } else KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonRubberSniper").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns || 0, KDGameData.SlowMoveTurns + 2); + + effect = true; + return {sfx: "RubberBolt", effect: effect}; + } + return {sfx: "Miss", effect: effect}; + }, + "HeatBlast": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns || 0, KDGameData.SlowMoveTurns + 2); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonHeatBlast").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time + 1); + effect = true; + return {sfx: "Lightning", effect: effect}; + } + return {sfx: "MetalBang", effect: effect}; + }, + "RobotShock": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: KinkyDungeonStatsChoice.get("Estim") ? "estim" : "electric"}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + if (KinkyDungeonStatsChoice.get("Estim")) { + KDChangeDistraction(_entity ? "enemy" + _entity.id : (spell ? spell.name : (bullet ? bullet.spriteID || "bullet" : "")), + _entity ? "enemy" : (spell ? "spell" : (bullet ? "bullet" : "")), "playerEffect", playerEffect?.power || spell?.power, false, 0.3); + } else { + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); + } + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(5, TextGet(KinkyDungeonStatsChoice.get("Estim") ? "KDRobotEstim" : "KinkyDungeonRobotShock").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + + effect = true; + return {sfx: KinkyDungeonStatsChoice.get("Estim") ? "Estim" : "Shock", effect: effect}; + } + return {sfx: "Shield", effect: effect}; + }, + "MysticShock": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonMysticShock").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + + effect = true; + return {sfx: "Evil", effect: effect}; + } + return {sfx: "Shield", effect: effect}; + }, + CageDrop: (_target, _damage, _playerEffect, spell, faction, _bullet, _entity) => { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["cage"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["cage"], faction, false, true, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + } + KinkyDungeonSendTextMessage(5, TextGet("KDCageDrop"), "#ff5277", 3); + + return {sfx: "MetalHit", effect: true}; + }, + "CrystalBind": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + for (let i = 0; i < (playerEffect.count || 1); i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["crystalRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["crystalRestraints"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + }//else if (KDGameData.PrisonerState != 'jail' && KDGameData.PrisonerState != 'parole') { + //KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + //} + } + + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonCrystalBind").KDReplaceOrAddDmg( dmg.string), "#ff5277", 3); + effect = true; + return {sfx: "MagicSlash", effect: effect}; + } + return {sfx: "MetalHit", effect: effect}; + }, + "CrystalEncase": (_target, _damage, _playerEffect, spell, faction, _bullet, _entity) => { + let effect = false; + let restraintAdd = KinkyDungeonGetRestraint({tags: ["crystalRestraints"]}, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (!restraintAdd) { + restraintAdd = KinkyDungeonGetRestraint({tags: ["crystalEncase"]}, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["crystalEncase"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_crystal"); + KinkyDungeonSendTextMessage(5, TextGet("KDCrystalEncase"), "#ff5277", 3); + effect = true; + } + + } + + return {sfx: "Freeze", effect: effect}; + }, + "IceEncase": (_target, _damage, _playerEffect, spell, faction, _bullet, _entity) => { + let effect = false; + let restraintAdd = KinkyDungeonGetRestraint({tags: ["iceRestraints"]}, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (!restraintAdd) { + restraintAdd = KinkyDungeonGetRestraint({tags: ["iceEncase"]}, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["iceEncase"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_ice"); + KinkyDungeonSendTextMessage(5, TextGet("KDIceEncase"), "#ff5277", 3); + effect = true; + } + + } + + return {sfx: "Freeze", effect: effect}; + }, + "ShadowEncase": (_target, _damage, _playerEffect, spell, faction, _bullet, enemy) => { + let effect = false; + let rThresh = enemy.Enemy.RestraintFilter?.powerThresh || (KDDefaultRestraintThresh + (Math.max(0, enemy.Enemy.power - 1) || 0)); + let rest = KDGetRestraintWithVariants( + {tags: KDGetTags(enemy, enemy.usingSpecial)}, KDGetEffLevel() + (enemy.Enemy.RestraintFilter?.levelBonus || enemy.Enemy.power || 0), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + enemy.Enemy.bypass, + enemy.Enemy.useLock ? enemy.Enemy.useLock : "", + false, + false, + !KinkyDungeonStatsChoice.has("TightRestraints"), + KDGetExtraTags(enemy, enemy.usingSpecial, true), + false, + { + //minPower: rThresh, + //onlyLimited: !enemy.Enemy.RestraintFilter?.limitedRestraintsOnly, + looseLimit: true, + require: enemy.Enemy.RestraintFilter?.unlimitedRestraints ? undefined : enemy.items, + }, enemy, undefined, true); + + if (!rest) { + rest = KDGetRestraintWithVariants( + {tags: KDGetTags(enemy, enemy.usingSpecial)}, KDGetEffLevel() + (enemy.Enemy.RestraintFilter?.levelBonus || enemy.Enemy.power || 0), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + enemy.Enemy.bypass, + enemy.Enemy.useLock ? enemy.Enemy.useLock : "", + false, + false, + !KinkyDungeonStatsChoice.has("TightRestraints"), + KDGetExtraTags(enemy, enemy.usingSpecial, true), + false, + { + maxPower: rThresh + 0.01, + looseLimit: true, + onlyUnlimited: true, + ignore: enemy.items, + }, enemy, undefined, true); + } + + + if (!rest) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["shadowBall"]}, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["shadowBall"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_shadowBall"); + KinkyDungeonSendTextMessage(5, TextGet("KDShadowEncase"), "#ff5277", 3); + effect = true; + } + + } + + return {sfx: "Freeze", effect: effect}; + }, + "VineSuspend": (_target, _damage, _playerEffect, spell, faction, _bullet, _entity) => { + let effect = false; + let restraintAdd = KinkyDungeonGetRestraint({tags: ["vineRestraints"]}, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (!restraintAdd) { + restraintAdd = KinkyDungeonGetRestraint({tags: ["vineSuspend"]}, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["vineSuspend"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_vine"); + KinkyDungeonSendTextMessage(5, TextGet("KDVineSuspend"), "#ff5277", 3); + effect = true; + } + + } + + return {sfx: "Freeze", effect: effect}; + }, + "CoronaShock": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 0.5)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let restraintAdd = KinkyDungeonGetRestraint({tags: ["celestialRopes"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["celestialRopes"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + }// else if (KDGameData.PrisonerState != 'jail' && KDGameData.PrisonerState != 'parole') { + //KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + //} + + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, Math.round(playerEffect.time * KinkyDungeonMultiplicativeStat(2*KDEntityBuffedStat(KinkyDungeonPlayerEntity, "holyResist")))); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + //KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonCoronaShock").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + effect = true; + return {sfx: "Shock", effect: effect}; + } + return {sfx: "Shield", effect: effect}; + }, + "RemoveLowLevelRope": (_target, _damage, _playerEffect, spell, _faction, _bullet, _entity) => { + let effect = false; + let restraints = []; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).power < 5 && KDRestraint(inv).shrine && KDRestraint(inv).shrine.includes("Rope")) { + restraints.push(KDRestraint(inv).Group); + } + } + for (let r of restraints) { + if (effect) KDSendStatus('escape', KinkyDungeonGetRestraintItem(r).name, "spell_" + spell.name); + KinkyDungeonRemoveRestraint(r, false); + } + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonRemoveLowLevelRope"), "lightGreen", 2); + return {sfx: "", effect: effect}; + }, + + "MiniSlime": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") < 0.45 && KDRandom() < 0.33) { + KDGameData.MovePoints = Math.min(-1, KDGameData.MovePoints); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonMiniSlime2").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + } else + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonMiniSlime").KDReplaceOrAddDmg( dmg.string), "#ff5277", 1); + effect = true; + } + + return {sfx: "RubberBolt", effect: effect}; + }, + "EnchantRope": (_target, _damage, playerEffect, spell, _faction, _bullet, _entity) => { + let effect = false; + let transmuteLevel = 0; + if (KinkyDungeonPlayerTags.get("RopeSnake")) { + transmuteLevel = 1; + } + if (playerEffect.power > 1 && KinkyDungeonPlayerTags.get("WeakMagicRopes")) { + transmuteLevel = 2; + } + if (playerEffect.power > 2) { + transmuteLevel = 3; + } + if (playerEffect.power > 3) { + transmuteLevel = 4; + } + + if (transmuteLevel > 0) { + if (KDTestSpellHits(spell, 0.0, 1.0)) { + + + if (transmuteLevel > 1) { + for (let inv of KinkyDungeonAllRestraintDynamic()) { + if (KDRestraint(inv.item)?.shrine?.includes("WeakMagicRopes") + && !inv.item.inventoryVariant) { + if (transmuteLevel > 3 || KDRestraint(inv.item)?.Group != "ItemNeck") { + let newRes = KDRestraint(inv.item).name.replace("WeakMagicRope", "StrongMagicRope"); + //if (KDCanAddRestraint(KinkyDungeonGetRestraintByName(newRes), true, "", false, inv.item)) + KDChangeItemName(inv.item, Restraint, newRes); + effect = true; + } + } + } + } + + if (transmuteLevel > 0) { + for (let inv of KinkyDungeonAllRestraintDynamic()) { + if (KDRestraint(inv.item)?.shrine?.includes("RopeSnake") + && !inv.item.inventoryVariant) { + if (transmuteLevel > 2 || KDRestraint(inv.item)?.Group != "ItemNeck") { + let newRes = KDRestraint(inv.item).name.replace("RopeSnake", "WeakMagicRope"); + //if (KDCanAddRestraint(KinkyDungeonGetRestraintByName(newRes), true, "", false, inv.item)) + KDChangeItemName(inv.item, Restraint, newRes); + effect = true; + } + } + } + } + + if (effect && transmuteLevel > 0) { + KinkyDungeonSendTextMessage(7, TextGet("KDEnchantRope" + transmuteLevel), "#ff5277", 1); + + } + } + } + + return {sfx: "MagicSlash", effect: effect}; + }, + + "SlimeBubble": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0.5)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") < 0.45) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["slimeRestraintsRandomLight"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["slimeRestraintsRandomLight"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + effect = true; + } + KDGameData.MovePoints = Math.min(-1, KDGameData.MovePoints); + } + let restraintAdd2 = KinkyDungeonGetRestraint({tags: ["slimebubble"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd2) { + KDPlayerEffectRestrain(spell, 1, ["slimebubble"], faction); + KDSendStatus('bound', restraintAdd2.name, "spell_" + spell.name); + effect = true; + } + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSlimeBubble").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + + effect = true; + } + return {sfx: "RubberBolt", effect: effect}; + }, + "Slime": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0.5)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") < 0.45) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["slimeRestraintsRandomLight"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["slimeRestraintsRandomLight"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + effect = true; + } + KDGameData.MovePoints = Math.min(-1, KDGameData.MovePoints); + } + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSlime").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + + effect = true; + } + return {sfx: "RubberBolt", effect: effect}; + }, + "LiquidMetalPatch": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 1.0, 0.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage, flags: ["EnvDamage"]}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") < 0.45 && (KDGameData.KneelTurns > 0 || KDGameData.SlowMoveTurns || KDGameData.MovePoints < 0 || KinkyDungeonStatWill == 0)) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["liquidMetalRestraints"]}, KDGetEffLevel() + playerEffect?.power || spell?.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["liquidMetalRestraints"], faction); + effect = true; + } + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonLiquidMetalSlowEngulf").KDReplaceOrAddDmg( dmg.string), "#aaaaaa", playerEffect.time || 2); + } else + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonLiquidMetal").KDReplaceOrAddDmg( dmg.string), "#aaaaaa", playerEffect.time || 2); + + effect = true; + } + return {sfx: "RubberBolt", effect: effect}; + }, + "LiquidMetalEngulf": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 1.0, 0.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") < 1) { + let count = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") < 0.45 ? 3 : (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") < 0.75 ? 2 : 1); + for (let i = 0; i < count; i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["liquidMetalRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["liquidMetalRestraints"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + effect = true; + } + } + + + KDGameData.MovePoints = Math.min(-1, KDGameData.MovePoints); + } + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonLiquidMetalEngulf").KDReplaceOrAddDmg( dmg.string), "#aaaaaa", playerEffect.time); + + effect = true; + } + return {sfx: "RubberBolt", effect: effect}; + }, + + "SporesHappy": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSporesHappy").KDReplaceOrAddDmg( dmg.string), "#4fd658", 2); + effect = true; + return {sfx: "Damage", effect: effect}; + }, + "Flummox": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "Flummox", type: "Flummox", duration: 5, power: 1.0, player: true, mushroom: true, tags: ["overlay", "darkness"]}); + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonFlummox").KDReplaceOrAddDmg( dmg.string), "#a583ff", 2); + effect = true; + return {sfx: "MagicSlash", effect: effect}; + } + + return {sfx: "Shield", effect: effect}; + }, + "SporesSick": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonSleepiness += 1.5 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "happygasDamageResist") * 2); + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSporesSick").KDReplaceOrAddDmg( dmg.string), "#4fd658", 2); + effect = true; + return {sfx: "Damage", effect: effect}; + }, + "PoisonDagger": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonSendTextMessage(6, TextGet("KDPoisonDagger").KDReplaceOrAddDmg( dmg.string), "#33ff00", 2); + // TODO make this get more intense over time + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "PoisonDagger", aura: "#22ff44", type: "SleepinessPoison", power: 1, duration: playerEffect.time, player: true, enemies: false, tags: ["sleep"], range: 1.5}); + effect = true; + return {sfx: "Damage", effect: effect}; + } + + return {sfx: "ClangLight", effect: effect}; + }, + "Spores": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonSleepiness = Math.max(KinkyDungeonSleepiness, (playerEffect.amount || 6) + * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "happygasDamageResist") * 2)); + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSpores").KDReplaceOrAddDmg( dmg.string), "#a583ff", 2); + return {sfx: "Damage", effect: effect}; + }, + + "PoisonBreath": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonSendTextMessage(6, TextGet("KDPoisonBreath").KDReplaceOrAddDmg( dmg.string), "#33ff00", 2); + // TODO make this get more intense over time + let currentPoison = KinkyDungeonPlayerBuffs?.PoisonBreath?.power || 0; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "PoisonBreath", aura: "#22ff44", type: "SleepinessPoison", power: currentPoison + playerEffect.amount, + duration: playerEffect.time, player: true, enemies: false, tags: ["sleep", "poison"], range: 1.5}); + + return {sfx: "Damage", effect: effect}; + }, + + "DragonFlowerSpores": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonSendTextMessage(6, TextGet("KDDragonFlowerSpores").KDReplaceOrAddDmg( dmg.string), "#33ff00", 2); + // TODO make this get more intense over time + let currentPoison = KinkyDungeonPlayerBuffs?.PoisonBreath?.power || 0; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "PoisonBreath", aura: "#22ff44", type: "SleepinessPoison", power: currentPoison + playerEffect.amount, + duration: playerEffect.time, player: true, enemies: false, tags: ["sleep", "poison"], range: 1.5}); + + return {sfx: "Damage", effect: effect}; + }, + + "PoisonSlash": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonSendTextMessage(6, TextGet("KDPoisonSlash").KDReplaceOrAddDmg( dmg.string), "#33ff00", 2); + // TODO make this get more intense over time + let currentPoison = KinkyDungeonPlayerBuffs?.PoisonBreath?.power || 0; + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "PoisonBreath", aura: "#22ff44", type: "SleepinessPoison", power: currentPoison + playerEffect.amount, + duration: playerEffect.time, player: true, enemies: false, tags: ["sleep", "poison"], range: 1.5}); + + return {sfx: "Damage", effect: effect}; + }, + + + "SlimeTrap": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + let slimeWalker = false; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).slimeWalk) { + slimeWalker = true; + break; + } + } + if (!slimeWalker && KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") < 0.45) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["slimeRestraintsRandomLight"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["slimeRestraintsRandomLight"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + effect = true; + } + } + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSlime").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + + + effect = true; + } + return {sfx: "RubberBolt", effect: effect}; + }, + "NurseBola": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let restraintAdd = KinkyDungeonGetRestraint({tags: ["nurseCuffRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["nurseCuffRestraints"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonNurseBola").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + effect = true; + } + return {sfx: "Struggle", effect: effect}; + } + + return {sfx: "WoodBlock", effect: effect}; + }, + "BanditBola": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + + let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["ropeRestraints"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleRope").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + effect = true; + } else { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + } + effect = true; + return {sfx: "Struggle", effect: effect}; + } + + return {sfx: "Miss", effect: effect}; + }, + "SingleRope": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + + let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["ropeRestraints"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSingleRope").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + effect = true; + } else { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + } + effect = true; + return {sfx: "Struggle", effect: effect}; + } + + return {sfx: "Miss", effect: effect}; + }, + "RestrainingDevice": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.2, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let added = []; + for (let i = 0; i < playerEffect.count; i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["hitechCables"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["hitechCables"], faction, false, false, false, false); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + added.push(restraintAdd); + effect = true; + } + } + if (added.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonRestrainingDevice").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + effect = true; + } else { + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, playerEffect.time); + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonRestrainingDeviceStun").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + } + effect = true; + return {sfx: "FutureLock", effect: effect}; + } + + return {sfx: "Clang", effect: effect}; + }, + "Glue": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + + if (playerEffect.power) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonGlueSlowDamage").KDReplaceOrAddDmg( dmg.string), "yellow", 2); + } + let effect = false; + let added = []; + let GlueRes = 1; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") >= 0.7) GlueRes = 3; + else if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") >= 0.35) GlueRes = 2; + for (let i = 0; i < Math.ceil((playerEffect.count || 1) / GlueRes); i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["glueRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["glueRestraints"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + added.push(restraintAdd); + effect = true; + } + } + if (added.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonGlue"), "yellow", 2); + effect = true; + } else { + //KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + //KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonGlueSlow"), "yellow", playerEffect.time); + effect = true; + } + return {sfx: "RubberHit", effect: effect}; + }, + "RopeEngulf": (_target, _damage, playerEffect, spell, faction, _bullet, _entity) => { + + + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0.5)) { + let added = []; + for (let i = 0; i < playerEffect.power; i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeRestraints", "ropeAuxiliary", "clothRestraints", "tapeRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["ropeRestraints", "ropeAuxiliary", "clothRestraints", "tapeRestraints"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + added.push(restraintAdd); + effect = true; + } + } + if (added.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonRopeEngulf"), "#ff5277", 2); + effect = true; + } else { + let RopeDresses = ["Leotard", "Bikini", "Lingerie"]; + if (!RopeDresses.includes(KinkyDungeonCurrentDress) && !KinkyDungeonStatsChoice.get("KeepOutfit")) { + KinkyDungeonSetDress(RopeDresses[Math.floor(Math.random() * RopeDresses.length)], ""); + KinkyDungeonDressPlayer(); + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonRopeEngulfDress"), "#ff5277", 3); + effect = true; + } + //KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeRestraintsHogtie"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["ropeRestraintsHogtie"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonRopeEngulf"), "#ff5277", 2); + effect = true; + } else { + let buff1 = {id: "KrakenEngulf", type: "Blindness", duration: 8, power: 1.0, player: true, tags: ["passout"]}; + let buff2 = {id: "KrakenEngulf2", type: "Blindness", duration: 8, power: 2.0, player: true, tags: ["passout"]}; + let buff3 = {id: "KrakenEngulf3", type: "Blindness", duration: 8, power: 4.0, player: true, tags: ["passout"]}; + if (KinkyDungeonPlayerBuffs[buff3.id]) { + let newAdd = KinkyDungeonGetRestraintByName("RopeSnakeCollar"); + if (newAdd) { + KinkyDungeonAddRestraintIfWeaker(newAdd, spell.power, true, undefined, false, false, undefined, faction, true); + } + KinkyDungeonPassOut(); + } else if (KinkyDungeonPlayerBuffs[buff2.id]) { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonRopeEngulfEnd3"), "#ff5277", 5); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff1); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff2); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff3); + } else if (KinkyDungeonPlayerBuffs[buff1.id]) { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonRopeEngulfEnd2"), "#ff5277", 4); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff1); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff2); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonRopeEngulfEnd1"), "#ff5277", 4); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff1); + } + } + + } + return {sfx: "Struggle", effect: effect}; + } + + return {sfx: "Miss", effect: effect}; + }, + "Hogtie": (_target, _damage, playerEffect, spell, faction, _bullet, _entity) => { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeRestraintsHogtie"]}, + KDGetEffLevel() + (playerEffect?.power || spell?.power || 1), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["ropeRestraintsHogtie"], faction); + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonRopeEngulf"), "#ff5277", 2); + return {sfx: "Struggle", effect: true}; + } + return {sfx: "Struggle", effect: false}; + }, + "RopeEngulfWeak": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0.5)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + + let added = []; + for (let i = 0; i < playerEffect.power; i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeRestraints", "ropeRestraints2", "ropeRestraintsWrist"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["ropeRestraints", "ropeRestraints2", "ropeRestraintsWrist"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + added.push(restraintAdd); + effect = true; + } + } + if (added.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonRopeEngulfWeak").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + effect = true; + } else { + let RopeDresses = ["Leotard", "Bikini", "Lingerie"]; + if (!RopeDresses.includes(KinkyDungeonCurrentDress) && !KinkyDungeonStatsChoice.get("KeepOutfit")) { + KinkyDungeonSetDress(RopeDresses[Math.floor(Math.random() * RopeDresses.length)], ""); + KinkyDungeonDressPlayer(); + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonRopeEngulfDress"), "#ff5277", 3); + effect = true; + } + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + + effect = true; + } + return {sfx: "Struggle", effect: effect}; + } + + return {sfx: "Miss", effect: effect}; + }, + "VineEngulf": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0.5)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let added = []; + for (let i = 0; i < playerEffect.power; i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["vineRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["vineRestraints"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + added.push(restraintAdd); + effect = true; + } + } + if (added.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonVineEngulf").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + effect = true; + } else { + let RopeDresses = ["GreenLeotard", "Lingerie"]; + if (!RopeDresses.includes(KinkyDungeonCurrentDress) && KinkyDungeonCurrentDress != "Elven" && !KinkyDungeonStatsChoice.get("KeepOutfit")) { + KinkyDungeonSetDress(RopeDresses[Math.floor(Math.random() * RopeDresses.length)], ""); + KinkyDungeonDressPlayer(); + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonVineEngulfDress"), "#ff5277", 3); + effect = true; + } + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + + KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + effect = true; + } + return {sfx: "Struggle", effect: effect}; + } + + return {sfx: "Miss", effect: effect}; + }, + "ObsidianEngulf": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let added = []; + for (let i = 0; i < playerEffect.count; i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["crystalRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["crystalRestraints"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + added.push(restraintAdd); + effect = true; + } + } + if (added.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonObsidianEngulf").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + effect = true; + } else { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + + } + KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + effect = true; + return {sfx: "Evil", effect: effect}; + }, + "CharmWraps": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0.5)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + + let added = []; + for (let i = 0; i < playerEffect.power; i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["ribbonRestraintsLight"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["ribbonRestraintsLight"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + added.push(restraintAdd); + effect = true; + } + } + if (added.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonCharmWraps").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + effect = true; + } else { + let CharmDresses = ["Leotard", "Bikini", "Lingerie"]; + if (!CharmDresses.includes(KinkyDungeonCurrentDress) && KinkyDungeonCurrentDress != "Prisoner" && !KinkyDungeonStatsChoice.get("KeepOutfit")) { + KinkyDungeonSetDress(CharmDresses[Math.floor(Math.random() * CharmDresses.length)], ""); + KinkyDungeonDressPlayer(); + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonCharmWrapsDress"), "#ff5277", 3); + effect = true; + } + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + + } + KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); + effect = true; + return {sfx: "MagicSlash", effect: effect}; + } + + return {sfx: "Shield", effect: effect}; + }, + "EnchantedArrow": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + + let effect = false; + + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let added = []; + for (let i = 0; i < playerEffect.count; i++) { + let ropeRests = ["mithrilRope"]; + if (KinkyDungeonStatStamina < KinkyDungeonStatStamina * 0.25) { + ropeRests.push("mithrilRopeHogtie"); + } + let restraintAdd = KinkyDungeonGetRestraint({tags: ropeRests}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ropeRests, faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + added.push(restraintAdd); + effect = true; + } + } + if (added.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonEnchantedArrow").KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + effect = true; + } else { + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonSlowedBySpell").KDReplaceOrAddDmg( dmg.string), "yellow", playerEffect.time); + + } + effect = true; + return {sfx: "MagicSlash", effect: effect}; + } + + return {sfx: "Miss", effect: effect}; + }, + "TrapBindings": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + + if (KDTestSpellHits(spell, 0.5, 0.5)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage,}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + let added = []; + for (let i = 0; i < playerEffect.count; i++) { + let restraintAdd = KinkyDungeonGetRestraint({tags: playerEffect.tags}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, playerEffect.tags, faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + added.push(restraintAdd); + effect = true; + } + } + if (added.length > 0) { + KinkyDungeonSendTextMessage(6, TextGet(playerEffect.text).KDReplaceOrAddDmg( dmg.string), "#ff5277", 2); + effect = true; + } else { + let PossibleDresses = ["Leotard", "Bikini", "Lingerie"]; + if (!PossibleDresses.includes(KinkyDungeonCurrentDress) && !KinkyDungeonStatsChoice.get("KeepOutfit")) { + KinkyDungeonSetDress(PossibleDresses[Math.floor(Math.random() * PossibleDresses.length)], ""); + KinkyDungeonDressPlayer(); + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonTrapBindingsDress").KDReplaceOrAddDmg( dmg.string), "#ff5277", 3); + effect = true; + } + // else if (!playerEffect.noGuard && KDGameData.PrisonerState != 'jail' && KDGameData.PrisonerState != 'parole') { + //KinkyDungeonCallGuard(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + //} + + } + return {sfx: "", effect: effect}; + } + + return {sfx: "Miss", effect: effect}; + }, + "NurseSyringe": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg.happened) return{sfx: "Shield", effect: false}; + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonNurseSyringe").KDReplaceOrAddDmg( dmg.string), "#ff5277", 8); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "NurseSyringe", aura: "#22ff44", type: "SleepinessPoison", power: 1, duration: playerEffect.time, player: true, enemies: false, tags: ["sleep"], range: 1.5}); + effect = true; + return {sfx: "Damage", effect: effect}; + } + return {sfx: "Miss", effect: effect}; + }, + "TrapSleepDart": (_target, _damage, _playerEffect, _spell, _faction, _bullet, _entity) => { + let effect = false; + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonTrapSleepDart"), "#ff5277", 8); + KinkyDungeonApplyBuffToEntity(KDPlayer(), KDPoisonSleep); + KinkyDungeonAlert = 5; + effect = true; + return {sfx: "Damage", effect: effect}; + }, + "Drench": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + + let dmg = (spell.power > 0 && spell.damage != 'inert') ? + KinkyDungeonDealDamage({damage: playerEffect.power || spell.power, type: playerEffect.damage || spell.damage}, bullet) + : {happened: 0, string: TextGet("KDNoDamage")}; + if (!dmg.happened) return{sfx: "Shield", effect: false}; + + KinkyDungeonSendTextMessage(4, TextGet("KDEffectDrench").KDReplaceOrAddDmg( dmg.string), "#9999ff", 3); + for (let b of spell.buffs) { + if (b.id.includes("Drenched")) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, b); + } + } + return {sfx: "Damage", effect: effect}; + }, + "LustBomb": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg) return {sfx: "Shield", effect: false}; + + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonLustBomb").KDReplaceOrAddDmg( dmg.string), "pink", 4); + effect = true; + return {sfx: "Damage", effect: effect}; + } + + return {sfx: "Damage", effect: effect}; + }, + "TrapLustCloud": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg) return {sfx: "Shield", effect: false}; + + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonTrapLustCloud").KDReplaceOrAddDmg( dmg.string), "pink", 4); + effect = true; + return {sfx: "Damage", effect: effect}; + } + + return {sfx: "Damage", effect: effect}; + }, + "TrapSPCloud": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg) return {sfx: "Shield", effect: false}; + + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonTrapSPCloud").KDReplaceOrAddDmg( dmg.string), "yellow", 4); + effect = true; + KDGameData.StaminaPause = 10; + return {sfx: "Damage", effect: effect}; + } + + return {sfx: "Damage", effect: effect}; + }, + + + + + "ShadowBind": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0.5)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg) return {sfx: "Shield", effect: false}; + KinkyDungeonStatBind = Math.max(0, playerEffect.time); + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonShadowBind").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + effect = true; + return {sfx: "Evil", effect: effect}; + } + return {sfx: "Miss", effect: effect}; + }, + "DamageIfChill": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + let sfx = ""; + let dmg = {happened: 1, string: TextGet("KDNoDamage")}; + if (playerEffect.power > 0 && KinkyDungeonFlags.get("chill")) { + dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + effect = true; + sfx = "Bones"; + KinkyDungeonSendTextMessage(3, TextGet("KDSleetDmg").KDReplaceOrAddDmg( dmg.string), "#ff5277", 1); + effect = true; + } + return {sfx: sfx, effect: effect}; + }, + "Chill": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + let sfx = ""; + let dmg = {happened: 1, string: TextGet("KDNoDamage")}; + if (playerEffect.power > 0 && !KinkyDungeonFlags.get("chill")) { + dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + } + if (dmg.happened && (KinkyDungeonPlayerBuffs.Drenched || KinkyDungeonPlayerBuffs.Chilled)) { + sfx = "Freeze"; + KinkyDungeonStatFreeze = Math.max(0, playerEffect.time); + KinkyDungeonSleepTime = CommonTime() + KinkyDungeonFreezeTime; + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonFreeze").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + } else { + sfx = "Bones"; + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonChill").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + } + KinkyDungeonSetFlag("chill", 1); + effect = true; + return {sfx: sfx, effect: effect}; + }, + "Freeze": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, (bullet?.vx || bullet?.vy) ? 0 : 0.5, (bullet?.vx || bullet?.vy) ? 1.0 : 0.5)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg) return {sfx: "Shield", effect: false}; + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonFreeze").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + + KinkyDungeonStatFreeze = Math.max(0, playerEffect.time); + KinkyDungeonSleepTime = CommonTime() + KinkyDungeonFreezeTime; + effect = true; + return {sfx: "Freeze", effect: effect}; + } + + return {sfx: "Shield", effect: effect}; + }, + "ShadowStrike": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { + let effect = false; + + + if (KDTestSpellHits(spell, 0.0, 1.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: playerEffect?.damage || spell?.damage || damage}, bullet); + if (!dmg) return {sfx: "Shield", effect: false}; + effect = true; + let restraintAdd = KinkyDungeonGetRestraint({tags: ["shadowRestraints"]}, KDGetEffLevel() + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); + if (restraintAdd) { + KDPlayerEffectRestrain(spell, 1, ["shadowRestraints"], faction); + KDSendStatus('bound', restraintAdd.name, "spell_" + spell.name); + } + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSpellShadowStrike").KDReplaceOrAddDmg( dmg.string), "#ff5277", 1); + return {sfx: "Evil", effect: effect}; + } + return {sfx: "Miss", effect: effect}; + }, + "Shock": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { + let effect = false; + if (KDTestSpellHits(spell, 0.5, 0.0)) { + let dmg = KinkyDungeonDealDamage({damage: playerEffect?.power || spell?.power || 1, type: KinkyDungeonStatsChoice.get("Estim") ? "estim" : "electric"}, bullet); + if (!dmg) return {sfx: "Shield", effect: false}; + if (KinkyDungeonStatsChoice.get("Estim")) { + KDChangeDistraction(_entity ? "enemy" + _entity.id : (spell ? spell.name : (bullet ? bullet.spriteID || "bullet" : "")), + _entity ? "enemy" : (spell ? "spell" : (bullet ? "bullet" : "")), "playerEffect", playerEffect?.power || spell?.power, false, 0.35); + } else { + if (Math.round( + playerEffect.time * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "electricDamageResist")) + ) > 0) + KinkyDungeonStatBlind = Math.max(KinkyDungeonStatBlind, Math.round( + playerEffect.time * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "electricDamageResist")) + )); + } + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "electricDamageResist") < 1) + KDGameData.MovePoints = Math.max(-1, KDGameData.MovePoints-1); // This is to prevent stunlock while slowed heavily + KinkyDungeonSendTextMessage(5, TextGet(KinkyDungeonStatsChoice.get("Estim") ? "KinkyDungeonEstim" : "KinkyDungeonShock").KDReplaceOrAddDmg( dmg.string), "#ff5277", playerEffect.time); + effect = true; + return {sfx: KinkyDungeonStatsChoice.get("Estim") ? "Estim" : "Shock", effect: effect}; + } + return {sfx: "Crackling", effect: effect}; + }, + + +}; + +/** + * @param spell + * @param count + * @param tags + * @param faction + * @param [noDeep] + * @param [bypass] - Bypass inaccessible things + * @param [allowEvade] + * @param [allowBlock] + * @param [allowBondageResist] + * @param [Lock] + * @param [options] + * @param [options.Progressive] + * @param [options.ProgressiveSkip] - Will skip over stuff already equipped + * @param [options.DontPreferWill] + * @param [options.Keep] + * @param [options.RequireWill] + */ +function KDPlayerEffectRestrain ( + spell: any, + count: number, + tags: string[], + faction: string, + _noDeep?: boolean, + bypass?: boolean, + allowEvade: boolean = false, + allowBlock: boolean = false, + allowBondageResist: boolean = true, + Lock?: string, + options?: any +): { r: restraint, v: ApplyVariant, iv: string}[] +{ + let restraintsToAdd = []; + let player = KinkyDungeonPlayerEntity; + /*if (allowBlock || allowBondageResist) { + if ((spell?.power || 0) * 0.5 > KDGameData.Shield) return []; + }*/ + for (let i = 0; i < count; i++) { + let restraintAdd = options?.Progressive ? ( + KDChooseRestraintFromListGroupPriWithVariants( + KDGetRestraintsEligible({tags: tags}, KDGetEffLevel() + (spell?.power || 0), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), bypass, Lock, !options?.DontPreferWill, undefined, false, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true, undefined, { + ApplyVariants: true, + }), + KDGetProgressiveOrderFun(), options.ProgressiveSkip) + ) : ( + KDGetRestraintWithVariants({tags: tags}, KDGetEffLevel() + (spell?.power || 0), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), bypass, Lock, !options?.DontPreferWill) + ); + + if (!restraintAdd && !options?.RequireWill) { + restraintAdd = options?.Progressive ? ( + KDChooseRestraintFromListGroupPriWithVariants( + KDGetRestraintsEligible({tags: tags}, KDGetEffLevel() + (spell?.power || 0), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), bypass, Lock, false, undefined, false, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true, undefined, { + ApplyVariants: true, + }), + KDGetProgressiveOrderFun(), options.ProgressiveSkip) + ) : ( + KDGetRestraintWithVariants({tags: tags}, KDGetEffLevel() + (spell?.power || 0), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), bypass, Lock, false) + ); + } + + if (restraintAdd) { + let playerEvasion = allowEvade ? KinkyDungeonPlayerEvasion() : 0; + let playerBlock = allowBlock ? KinkyDungeonPlayerBlock() : 0; + let missed = allowEvade && KDRandom() * AIData.accuracy < 1 - playerEvasion; + let blockedAtk = allowBlock && KDRandom() * AIData.accuracy < 1 - playerBlock; + if (!missed && !blockedAtk) { + restraintsToAdd.push(restraintAdd); + } else { + if (missed) { + KinkyDungeonSendEvent("missPlayerSpell", {spell: spell, player: player}); + KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonSpellBindMiss").replace("EnemyName", TextGet("KinkyDungeonSpell" + (spell.name || ""))), "lightgreen", 1); + KDDamageQueue.push({floater: TextGet("KDMissed"), Entity: {x: player.x - 0.5, y: player.y - 0.5}, Color: "#88ff88", Time: 2, Delay: 0}); + } else if (blockedAtk) { + KinkyDungeonSendEvent("blockPlayerSpell", {spell: spell, player: player}); + KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonSpellBindBlock").replace("EnemyName", TextGet("KinkyDungeonSpell" + (spell.name || ""))), "lightgreen", 1); + KDDamageQueue.push({floater: TextGet("KDBlocked"), Entity: {x: player.x - 0.5, y: player.y - 0.5}, Color: "#88ff88", Time: 2, Delay: 0}); + } + + } + } + } + if (restraintsToAdd.length > 0) { + if (allowBondageResist) { + let rests = KDRunBondageResist(undefined, faction, restraintsToAdd,(r) => { + KDDamageQueue.push({floater: TextGet("KDBlockedRestraint"), Entity: {x: player.x - 0.5, y: player.y - 0.5}, Color: "#88ff88", Time: 2, Delay: 0}); + + if (!r) + KinkyDungeonSendTextMessage(1, TextGet("KDBondageResistBlockTotal"), "#88ff88", 1, false, false, undefined, "Combat"); + }, undefined, spell, Lock, options?.Keep); + KinkyDungeonSendEvent("boundBySpell", {player: KinkyDungeonPlayerEntity, restraintsAdded: rests}); + return rests; + } + else { + let added = []; + for (let r of restraintsToAdd) { + let bb = 0; + bb = KinkyDungeonAddRestraintIfWeaker(r.r, spell?.power || 0, + KinkyDungeonStatsChoice.has("MagicHands") || spell, Lock || r.r.DefaultLock, + undefined, undefined, undefined, spell?.faction || faction, KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, + undefined, undefined, true, undefined, undefined, undefined, r.v) * 2; + if (bb) { + added.push(r); + KDSendStatus('bound', r.r.name, "spell_" + (spell?.name || "effect")); + } + } + return added; + } + } + return []; +} + + +function KDTestSpellHits(spell: spell, allowEvade: number = 0, allowBlock: number = 1): boolean { + let player = KinkyDungeonPlayerEntity; + let playerEvasion = allowEvade ? KinkyDungeonPlayerEvasion() : 0; + let playerBlock = allowBlock ? KinkyDungeonPlayerBlock() : 0; + let missed = allowEvade && KDRandom() * AIData.accuracy < (1 - playerEvasion) * allowEvade; + let blockedAtk = allowBlock && (KDRandom() * AIData.accuracy < (1 - playerBlock) * allowBlock); + if (!missed && !blockedAtk) { + return true; + } else { + if (missed) { + if (spell) { + KinkyDungeonSendEvent("missPlayerSpell", {spell: spell, player: player}); + KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonSpellBindMiss").replace("EnemyName", TextGet("KinkyDungeonSpell" + (spell.name || ""))), "lightgreen", 1); + } + KDDamageQueue.push({floater: TextGet("KDMissed"), Entity: {x: player.x - 0.5, y: player.y - 0.5}, Color: "#88ff88", Time: 2, Delay: 0}); + } else if (blockedAtk) { + if (spell) { + KinkyDungeonSendEvent("blockPlayerSpell", {spell: spell, player: player}); + KinkyDungeonSendTextMessage(2, TextGet("KinkyDungeonSpellBindBlock").replace("EnemyName", TextGet("KinkyDungeonSpell" + (spell.name || ""))), "lightgreen", 1); + } + KDDamageQueue.push({floater: TextGet("KDBlocked"), Entity: {x: player.x - 0.5, y: player.y - 0.5}, Color: "#88ff88", Time: 2, Delay: 0}); + } + return false; + } +} + +function KinkyDungeonPlayerEffect(target: any, damage: string, playerEffect: any, spell?: spell, faction?: string, bullet?: any, entity?: entity) { + if (!playerEffect.name) return; + if (damage == "inert") return; + let effect = false; + let sfx = spell ? spell.hitsfx : undefined; + if (!sfx) sfx = (playerEffect.power && playerEffect.power < 2) ? "DamageWeak" : "Damage"; + if (playerEffect.hitTag && !KDPlayerHitBy.includes(playerEffect.hitTag)) KDPlayerHitBy.push(playerEffect.hitTag); + else if (playerEffect.hitTag) return; + if (!playerEffect.chance || KDRandom() < playerEffect.chance) { + if (KDPlayerEffects[playerEffect.name]) { + let ret = KDPlayerEffects[playerEffect.name](target, damage, playerEffect, spell, faction, bullet, entity); + if (ret.sfx && ret.sfx != "Null") sfx = ret.sfx; + effect = ret.effect; + } + } + + if (sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + sfx + ".ogg"); + if (effect) KinkyDungeonInterruptSleep(); + + return effect; +} + +/** + * For those 'three strikes you're out' effects + * @param Name + * @param Target + * @param time - Time for the buff to wear off + * @param FinalEffect + * @param buffType - Buff effect + * @param FirstEffect + * @param SecondEffect + * @param ThirdEffect + */ +function KDTripleBuffKill ( + Name: string, + Target: entity, + time: number, + FinalEffect: (target: entity) => void = (_target) => { KinkyDungeonPassOut() }, + buffType: string = "Blindness", + FirstEffect: (target: entity) => void = (_target) => {}, + SecondEffect: (target: entity) => void = (_target) => {}, + ThirdEffect: (target: entity) => void = (_target) => {}, +): void +{ + let buff1 = {id: Name + "1", type: buffType, duration: time + 3, power: 1.0, player: true, tags: ["passout"]}; + let buff2 = {id: Name + "2", type: buffType, duration: time + 3, power: 2.0, player: true, tags: ["passout"]}; + let buff3 = {id: Name + "3", type: buffType, duration: time + 3, power: 4.0, player: true, tags: ["passout"]}; + if (KinkyDungeonPlayerBuffs[buff3.id]) { + FinalEffect(Target); + } else if (KinkyDungeonPlayerBuffs[buff2.id]) { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeon" + Name + "3"), "#ff5277", time + 1); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff1); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff2); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff3); + ThirdEffect(Target); + } else if (KinkyDungeonPlayerBuffs[buff1.id]) { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeon" + Name + "2"), "#ff5277", time); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff1); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff2); + SecondEffect(Target); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeon" + Name + "1"), "#ff5277", time); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, buff1); + FirstEffect(Target); + } +} + +/** + * @param resetSlimeLevel + * @param restraint + */ +function KDAdvanceSlime(resetSlimeLevel: boolean, restraint: string = ""): boolean { + let slimedParts = []; + let potentialSlimeParts = []; + for (let item of KinkyDungeonAllRestraintDynamic()) { + let inv = item.item; + if (KDRestraint(inv).slimeLevel > 0) { + slimedParts.push({ + name: KDRestraint(inv).name, + group: KDRestraint(inv).Group, + level: KDRestraint(inv).slimeLevel + }); + } + } + for (let slime of slimedParts) { + let index = -1; + for (let i = 0; i < KinkyDungeonSlimeParts.length; i++) if (KinkyDungeonSlimeParts[i].group === slime.group) { + index = i; + break; + } + if (index >= 0) { + let slime2 = undefined; + let slime3 = undefined; + if (index > 0) { + for (let s of potentialSlimeParts) if (s.group === KinkyDungeonSlimeParts[index - 1].group && !(s.level > slime.level)) { + slime2 = s; + break; + } + if (!slime2 && (!KinkyDungeonStatsChoice.has("Unmasked") || !KinkyDungeonSlimeParts[index - 1].noUnmasked)) potentialSlimeParts.push({ + group: KinkyDungeonSlimeParts[index - 1].group, + restraint: (restraint ? restraint : "Slime") + KinkyDungeonSlimeParts[index - 1].restraint, + level: slime.level + }); + } + if (index < KinkyDungeonSlimeParts.length - 1) { + for (let s of potentialSlimeParts) if (s.group === KinkyDungeonSlimeParts[index + 1].group && !(s.level > slime.level)) { + slime3 = s; + break; + } + if (!slime3 && (!KinkyDungeonStatsChoice.has("Unmasked") || !KinkyDungeonSlimeParts[index + 1].noUnmasked)) potentialSlimeParts.push({ + group: KinkyDungeonSlimeParts[index + 1].group, + restraint: (restraint ? restraint : "Slime") + KinkyDungeonSlimeParts[index + 1].restraint, + level: slime.level + }); + } + } + } + let slimed = false; + let advance = false; + if (potentialSlimeParts.length === 0) { + advance = true; + } + else while (potentialSlimeParts.length > 0) { + let newSlime = potentialSlimeParts[Math.floor(KDRandom() * potentialSlimeParts.length)]; + if (newSlime) { + let added = KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(newSlime.restraint), 0, true); + if (added) { + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSlimeSpread"), "#ff44ff", 3); + potentialSlimeParts = []; + if (resetSlimeLevel) + KDEventData.SlimeLevel = -100; + slimed = true; + } + } + potentialSlimeParts.splice(potentialSlimeParts.indexOf(newSlime), 1); + } + if (!slimed && potentialSlimeParts.length === 0) { + let slime = slimedParts[Math.floor(KDRandom() * slimedParts.length)]; + if (!slime) return false; + KinkyDungeonRemoveRestraintsWithName(slime.name); + if (KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("Hard" + slime.name), 0, true, undefined, undefined, undefined, undefined, undefined, true)) { + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSlimeHarden"), "#ff44ff", 3); + let slimesuit = (restraint ? restraint : "Slime") + "Suit"; + + if (KinkyDungeonCurrentDress !== slimesuit) { + KinkyDungeonSetDress(slimesuit, ""); + KinkyDungeonDressPlayer(); + KinkyDungeonSendTextMessage(6, TextGet("KinkyDungeonSlimeSpreadSuit"), "#ff44ff", 3); + } + } + if (resetSlimeLevel) + KDEventData.SlimeLevel = -100; + } + return advance; +} + + +// @ts-ignore +if (!String.prototype.KDReplaceOrAddDmg) { + // @ts-ignore + String.prototype.KDReplaceOrAddDmg = function(dmg, replaceString = "DamageTaken", replaceString2 = "DamageDealt") { + if (this.includes(replaceString)) return this.replace(replaceString, dmg); + if (this.includes(replaceString2)) return this.replace(replaceString2, dmg); + return this + ` (${dmg})`; + }; +} + +/** + * @param entity + * @param time + * @param damage + */ +function KDApplyBubble(entity: entity, time: number, damage: number = 0) { + KinkyDungeonApplyBuffToEntity(entity, { + id: "WaterBubble", + aura: "#2789cd", + aurasprite: "WaterBubble", + noAuraColor: true, + buffSprite: true, + type: "Accuracy", + power: -0.5, + duration: time, + tags: ["debuff"], + }); + KinkyDungeonApplyBuffToEntity(entity, { + id: "WaterBubble2", + type: "SlowLevel", + power: 3, + duration: time, + tags: ["debuff", "slow"], + }); + if (damage) { + let bubbleData = { + cancelDamage: false, + dmg: damage, + type: "soap", + }; + KinkyDungeonSendEvent("applyBubble", bubbleData); + if (!bubbleData.cancelDamage) + KinkyDungeonDealDamage({damage: damage, type: bubbleData.type}); + } +} + +let KDSpecialStats: Record = { + Corruption: { + PerFloor: (_player, _amount) => { + return 50; + } + }, + LatexIntegration: { + PerFloor: (_player, amount) => { + return Math.max(0, Math.floor(10 - 0.1 * amount)); // 0 at 100 + }, + BuffEvents: (_player) => { + return [ + {trigger: "beforeStruggleCalc", type: "latexIntegrationDebuff", power: 0.01}, + {trigger: "beforeDressRestraints", type: "LatexIntegration"}, + //{trigger: "postQuest", type: "LatexIntegration"}, + ]; + } + }, +}; + +/** + * @param stat + * @param entity + * @param amount + * @param Msg + * @param [max] + * @param [color] + */ +function KDAddSpecialStat(stat: string, entity: entity, amount: number, Msg: boolean, max: number = 100, color: string = "#722fcc") { + let currentCurse = KDEntityBuffedStat(entity, stat) || 0; + let newCurse = Math.min(max, Math.max(0, currentCurse + amount)); + + let buff = KDEntityGetBuff(entity, stat + "Stat"); + if (!buff) { + buff = KinkyDungeonApplyBuffToEntity(entity, { + id: stat + "Stat", + aura: color, + buffSprite: true, + type: stat, + power: 0, + duration: 9999, + infinite: true, + tags: [stat], + text: "0%", + }); + if (KDSpecialStats[stat]?.BuffEvents) { + buff.events = KDSpecialStats[stat].BuffEvents(entity); + } + } + + buff.power = newCurse; + buff.text = Math.floor(newCurse) + "%"; + if (buff.power <= 0) + KinkyDungeonExpireBuff(entity, stat + "Stat"); + + if (Msg) { + if (amount > 0) { + KinkyDungeonSendTextMessage(10, TextGet("KDAdd" + stat).replace("AMNT", "" + amount), color, 2); + } else if (amount < 0) { + KinkyDungeonSendTextMessage(10, TextGet("KDRemove" + stat).replace("AMNT", "" + -amount), color, 2); + } + } +} diff --git a/Game/src/map/KDContainers.ts b/Game/src/map/KDContainers.ts new file mode 100644 index 000000000..f8ed66d7e --- /dev/null +++ b/Game/src/map/KDContainers.ts @@ -0,0 +1,341 @@ +"use strict"; + +/** Current container being looked in by the UI */ +let KDUI_CurrentContainer: string = ""; +let KDUI_ContainerBackScreen: string = "Game"; +let KDUI_Container_LastSelected = ""; + +interface KDContainer { + name: string, + location?: WorldCoord, + point?: KDPoint, + items: Record, + lock: string, + type: string, + validation?: string, + filters?: string[], +} + +function KDAddContainer(name: string, point?: KDPoint, location?: WorldCoord, appendCoords: boolean = true, filters?: string[]): KDContainer { + let container: KDContainer = { + name: name || "", + location: location, + point: point, + items: {}, + lock: "", + type: name || "", + filters: filters, + }; + if (appendCoords) { + container.name = KDGetContainerName(container.name, point, location); + } + if (!KDGameData.Containers[container.name]) + KDGameData.Containers[container.name] = container; + return KDGameData.Containers[container.name]; +} + +function KDGetContainerName(name: string, point?: KDPoint, location?: WorldCoord): string { + if (point) { + name = name + `_,${point.x},${point.y}`; + } + if (location) { + name = name + `_L,${location.mapX},${location.mapY},${location.room}`; + } + return name; +} + +function KDGetContainer(name: string, point?: KDPoint, location?: WorldCoord, create: boolean = false, filters?: string[]): KDContainer { + let id = KDGetContainerName(name, point, location); + if (create && !KDGameData.Containers[id]) { + KDAddContainer(name, point, location, true, filters); + } + + return KDGameData.Containers[id]; +} + + +function KDDrawContainer(name: string, xOffset = -125, filters = [Restraint, Outfit], invMsg?: string) { + let x = 1225 + xOffset; + let takeItem = (inv: item) => { + if (!invMsg) { + if (container.items[inv?.name] + && (inv.type != Weapon || !KinkyDungeonInventoryGetWeapon(inv.name)) + ) { + let item = KinkyDungeonInventoryGetSafe(inv.name); + if (!item) { + item = JSON.parse(JSON.stringify(container.items[inv.name])); + item.quantity = 1; + KinkyDungeonInventoryAdd(item); + } else item.quantity = (item.quantity || 1) + 1; + if (container.items[inv.name].quantity > 1) { + container.items[inv.name].quantity -= 1; + } else { + delete container.items[inv.name]; + } + } + } + + }; + let transferItem = (inv: item) => { + if (!invMsg) { + let type = KDGetItemType(inv); + if (filters.includes(type)) return; // Cant transfer wrong items + let item = KinkyDungeonInventoryGetSafe(inv?.name); + if (item && KDCanDrop(item)) { + if (!container?.items[inv.name]) { + container.items[inv.name] = JSON.parse(JSON.stringify(item)); + container.items[inv.name].quantity = 0; + } + container.items[inv.name].quantity = (container.items[inv.name].quantity || 0) + 1; + if (item.quantity > 1) { + item.quantity -= 1; + } else { + KinkyDungeonInventoryRemoveSafe(KinkyDungeonInventoryGetSafe(inv.name)); + } + } + } + } + + let filter = KinkyDungeonCurrentFilter; + let container = KDGameData.Containers[name]; + + KDDrawInventoryFilters(xOffset - 70, -20, filters, ["All"]); + + let filteredInventory = KinkyDungeonFilterInventory(filter, undefined, undefined, undefined, undefined, KDInvFilter, + undefined, filters + ); + + DrawTextFitKD(TextGet("KDContainerType_" + container?.type), + xOffset + 1600, 270, 500, "#ffffff", undefined, 28, undefined, 70); + + //DrawTextFitKD("<->", + // xOffset + 1300, 750, 200, "#ffffff", undefined, 48, undefined, 70); + + let YourInv = invMsg ? { + selected: null, + tooltipItem: null, + } : KDDrawInventoryContainer(-900, 100, filteredInventory, filter, filter, + (inv: KDFilteredInventoryItem, x, y, w, h, different) => { + if (!different && !KDUI_Container_LastSelected) { + transferItem(inv.item); + } + KDUI_Container_LastSelected = ""; + }, (inv) => { + return (inv.item.type == Weapon && inv.item.name == KinkyDungeonPlayerWeapon) ? "#e64539" : KDTextGray1; + }, ""); + + if (invMsg) { + DrawTextFitKD(TextGet(invMsg), + xOffset + 850, 550, 500, "#ffffff", undefined, 32, undefined, 70); + + } + + let filteredInventory2 = KinkyDungeonFilterInventory(filter, undefined, undefined, undefined, undefined, KDInvFilter, + KDGameData.Containers[name]?.items + ); + + let ContainerInv = KDDrawInventoryContainer(-165, 100, filteredInventory2, filter, filter, + (inv: KDFilteredInventoryItem, x, y, w, h, different) => { + if (!different && KDUI_Container_LastSelected) { + takeItem(inv.item); + } + KDUI_Container_LastSelected = "Chest"; + }, (inv) => { + return (KinkyDungeonInventoryGetWeapon(inv.item.name)) ? "#e64539" : KDTextGray1; + }, "Chest", true); + + + let selectedItem = KDUI_Container_LastSelected == "Chest" ? + ContainerInv.selected + : YourInv.selected; + + let ii = 0; + let spacing = 70; + if (selectedItem?.item) { + + let item = selectedItem.item; + let XX = 1150; + let YY = -80; + + let data = { + extraLines: [], + extraLineColor: [], + extraLineColorBG: [], + extraLinesPre: [], + extraLineColorPre: [], + extraLineColorBGPre: [], + SelectedItem: item, + item: item, + }; + KinkyDungeonSendEvent("inventoryTooltip", data); + let mult = KDGetFontMult(); + let textSplit = KinkyDungeonWordWrap(TextGet((item.type == LooseRestraint ? "Restraint" : "KinkyDungeonInventoryItem") + + selectedItem.name + "Desc"), + 15*mult, 40*mult).split('\n'); + let textSplit2 = KinkyDungeonWordWrap(TextGet((item.type == LooseRestraint ? "Restraint" : "KinkyDungeonInventoryItem") + + selectedItem.name + "Desc2"), + 15*mult, 40*mult).split('\n'); + let i = 0; + let descSpacing = 20; + let fSize = 16; + const encoder = new TextEncoder(); + DrawTextFitKD(`${KDGetItemName(item)} - ${TextGet("KinkyDungeonRarity" + + (KDRestraint(item) ? Math.max(0, Math.min(Math.floor( + (KDRestraint(item).displayPower || KDRestraint(item).power)/5 + ),10)) + : (KDConsumable(item)?.rarity || KDWeapon(item)?.rarity || 0)) + )}`, + XX, YY + 200 + i * descSpacing, 500, "#ffffff", undefined, fSize + 4, undefined, 70); + i++; + i++; + for (let N = 0; N < textSplit.length; N++) { + DrawTextFitKD(textSplit[N], + XX, YY + 200 + i * descSpacing, 380 * (encoder.encode(textSplit[N]).length / 40), "#ffffff", undefined, fSize, undefined, 70); + i++; + } + i = 0; + for (let N = 0; N < data.extraLinesPre.length; N++) { + DrawTextFitKD(data.extraLinesPre[N], + XX + 400, YY + 200 + i * descSpacing, 380 * (encoder.encode(data.extraLinesPre[N]).length / 40), data.extraLineColorPre[N], data.extraLineColorBGPre[N], fSize, undefined, 70); + i++; + } + for (let N = 0; N < textSplit2.length; N++) { + DrawTextFitKD(textSplit2[N], + XX + 400, YY + 200 + i * descSpacing, 380 * (encoder.encode(textSplit2[N]).length / 40), "#ffffff", undefined, fSize, undefined, 70); + i++; + } + for (let N = 0; N < data.extraLines.length; N++) { + DrawTextFitKD(data.extraLines[N], + XX + 400, YY + 200 + i * descSpacing, 380 * (encoder.encode(data.extraLines[N]).length / 40), data.extraLineColor[N], data.extraLineColorBG[N], fSize, undefined, 70); + i++; + } + + + // Take + // Take all + // Take 5 + + DrawButtonKDEx( + "take1", () => { + if (KDUI_Container_LastSelected == "Chest") { + takeItem(selectedItem.item); + } else transferItem(selectedItem.item); + return true; + }, true, 1070, 600 + ii++*spacing, 200, 60, + TextGet(KDUI_Container_LastSelected == "Chest" ? "KDTake1" : "KDAdd1").replace("ITMN", KDGetItemName(item)), + "#ffffff", undefined, undefined, undefined, true, KDButtonColor, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpell[0]), + hotkeyPress: KinkyDungeonKeySpell[0], + } + ); + DrawButtonKDEx( + "take5", () => { + if (KDUI_Container_LastSelected == "Chest") { + for (let i = 0; i < 5; i++) takeItem(selectedItem.item); + } else for (let i = 0; i < 5; i++) transferItem(selectedItem.item); + return true; + }, true, 1070, 600 + ii++*spacing, 200, 60, + TextGet(KDUI_Container_LastSelected == "Chest" ? "KDTake5" : "KDAdd5").replace("ITMN", KDGetItemName(item)), + "#ffffff", undefined, undefined, undefined, true, KDButtonColor, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpell[1]), + hotkeyPress: KinkyDungeonKeySpell[1], + } + ); + DrawButtonKDEx( + "takeALL", () => { + let q = selectedItem.item.quantity; + if (KDUI_Container_LastSelected == "Chest") { + for (let i = 0; i < (q || 1); i++) takeItem(selectedItem.item); + } else for (let i = 0; i < (q || 1); i++) transferItem(selectedItem.item); + return true; + }, true, 1070, 600 + ii++*spacing, 200, 60, + TextGet(KDUI_Container_LastSelected == "Chest" ? "KDTakeAll" : "KDAddAll").replace("ITMN", KDGetItemName(item)), + "#ffffff", undefined, undefined, undefined, true, KDButtonColor, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpell[2]), + hotkeyPress: KinkyDungeonKeySpell[2], + } + ); + DrawButtonKDEx( + "takeALL1", () => { + let q = selectedItem.item.quantity; + if (KDUI_Container_LastSelected == "Chest") { + for (let i = 1; i < (q || 1); i++) takeItem(selectedItem.item); + } else for (let i = 1; i < (q || 1); i++) transferItem(selectedItem.item); + return true; + }, true, 1070, 600 + ii++*spacing, 200, 60, + TextGet(KDUI_Container_LastSelected == "Chest" ? "KDTakeAll1" : "KDAddAll1").replace("ITMN", KDGetItemName(item)), + "#ffffff", undefined, undefined, undefined, true, KDButtonColor, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpell[3]), + hotkeyPress: KinkyDungeonKeySpell[3], + } + ); + } + + let InvToTransfer = KDUI_Container_LastSelected == "Chest" ? filteredInventory2 : filteredInventory; + + if (InvToTransfer) { + DrawButtonKDEx( + "DepositAll", () => { + if (KDUI_Container_LastSelected == "Chest") { + for (let inv of InvToTransfer) { + let q = inv.item.quantity; + for (let i = 0; i < (q || 1); i++) takeItem(inv.item); + } + } else { + for (let inv of InvToTransfer) { + if (!(KDGameData.ItemPriority[inv.name] > 9)) { + let q = inv.item.quantity; + for (let i = 0; i < (q || 1); i++) transferItem(inv.item); + } + + } + } + + return true; + }, InvToTransfer.length > 0, 1070, 600 + 20 + ii++*spacing, 200, 60, + TextGet(KDUI_Container_LastSelected == "Chest" ? "KDTakeEverything" : "KDDepositEverything"), + InvToTransfer.length > 0 ? "#ffffff" : "#999999", undefined, undefined, undefined, true, + KDButtonColor, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySpell[4]), + hotkeyPress: KinkyDungeonKeySpell[4], + } + ); + } + + + DrawButtonKDEx( + "backbutton", () => { + KinkyDungeonDrawState = KDUI_ContainerBackScreen ? KDUI_ContainerBackScreen : "Game"; + return true; + }, true, 1300, 900, 350, 64, TextGet("KDContainerBack_" + KDUI_ContainerBackScreen), + "#ffffff", undefined + ) + + KDDrawInventoryTabs(xOffset); +} + + + +function KDCanDrop(item: item) { + return (!KDWeapon(item) || !isUnarmed(KDWeapon(item))); +} + +function KDValidateContainer(container: KDContainer): string { + if (KDSpecialContainers[container.name]) { + let val = KDSpecialContainers[container.name](container); + if (val) return val; + } + if (container.validation && KDContainerVal[container.validation]) { + let val = KDContainerVal[container.validation](container); + if (val) return val; + } + return ""; +} + +let KDSpecialContainers = { + WardenChest: (container: KDContainer) => { + return (KDGameData.RoomType == "Summit" || KDGameData.RoomType == "PerkRoom") ? "" : "KDWardenNeedSummit"; + } +}; +let KDContainerVal = { +}; \ No newline at end of file diff --git a/Game/src/map/KDJourney.ts b/Game/src/map/KDJourney.ts new file mode 100644 index 000000000..0de433cfa --- /dev/null +++ b/Game/src/map/KDJourney.ts @@ -0,0 +1,622 @@ +"use strict"; + +let KDJourneyGraphics = new PIXI.Graphics; +KDJourneyGraphics.zIndex = -0.1; +let KDJourneyGraphicsLower = new PIXI.Graphics; +KDJourneyGraphicsLower.zIndex = -10; +let KDJourneyGraphicsUpper = new PIXI.Graphics; +KDJourneyGraphicsUpper.zIndex = 0; +let KDGameBoardAddedJourney = false; + +let KDMapModRefreshList: MapMod[] = [KDMapMods.None]; + +let KDJourneySlotTypes : Record KDJourneySlot> = { + basic: (Predecessor, x, y, forceCheckpoint) => { + let checkpoint : string = forceCheckpoint || Predecessor?.Checkpoint || 'grv'; + if (!forceCheckpoint) + checkpoint = KDGetJourneySuccessorCheckpoint(checkpoint, x - (Predecessor?.x || 0)); + + /*if (!forceCheckpoint && y % KDLevelsPerCheckpoint == 1) { + let succ = Object.values(KinkyDungeonMapIndex)[Math.floor(y/KDLevelsPerCheckpoint)]; + for (let i = 0; i < 10; i++) { + if (succ == Predecessor?.Checkpoint) { + succ = KDGetJourneySuccessorCheckpoint(Object.values(KinkyDungeonMapIndex)[Math.floor(y/KDLevelsPerCheckpoint)], x - (Predecessor?.x || 0)); + } else { + break; + } + } + if (x - (Predecessor?.x || 0) == 0) { + // meh + checkpoint = succ; + } else { + checkpoint = KDGetJourneySuccessorCheckpoint(succ, x - (Predecessor?.x || 0)); + } + }*/ + + let slot: KDJourneySlot = { + type: 'basic', + x: x, + y: y, + Checkpoint: checkpoint, + color: KinkyDungeonMapParams[checkpoint]?.color || "#ffffff", + Connections: [], // Temporarily empty + protected: false, + visited: false, + EscapeMethod: "", + MapMod: "", + RoomType: "", + Faction: "", + SideRooms: [], + HiddenRooms: {}, + }; + + let MapMod = ""; + + if (y > 1 || KinkyDungeonNewGame > 0) { + // We make it so basically map mods cant repeat for the same 3 generated tiles in a row + // Helps shake things up randomly + if (KDMapModRefreshList.length == 0) { + KDMapModRefreshList = KDGetMapGenList(3, KDMapMods, slot); + } + let index = Math.floor(KDRandom() * KDMapModRefreshList.length); + MapMod = KDMapModRefreshList[index]?.name; + KDMapModRefreshList.splice(index, 1); + } + + + + + slot.MapMod = MapMod; + slot.RoomType = KDMapMods[MapMod]?.roomType || ""; + slot.Faction = KDMapMods[MapMod]?.faction + || KinkyDungeonAltFloor(KDMapMods[MapMod]?.roomType)?.faction + || CommonRandomItemFromList( + undefined, + KinkyDungeonMapParams[KinkyDungeonMapIndex[checkpoint]]?.factionList) + || ""; + + if (KDMapMods[MapMod]?.escapeMethod) + slot.EscapeMethod = KDMapMods[MapMod]?.escapeMethod; + else slot.EscapeMethod = KDGetRandomEscapeMethod(slot.RoomType, slot.MapMod, y, slot.Faction); + + if (y > 1) { + let sideTop = KDGetSideRoom(slot, true, slot.SideRooms); + if (sideTop) { + slot.SideRooms.push(sideTop.name); + let side = sideTop; + if (side.hidden) + slot.HiddenRooms[side.name] = true; + } + let sideBot = KDGetSideRoom(slot, false, slot.SideRooms); + if (sideBot) { + slot.SideRooms.push(sideBot.name); + let side = sideBot; + if (side.hidden) + slot.HiddenRooms[side.name] = true; + } + } else if (y == 1) { + let sideTop = KDGetSideRoom(slot, true, slot.SideRooms, "elevatorstart"); + if (!sideTop) sideTop = KDSideRooms.ElevatorEgyptian; + if (sideTop) { + slot.SideRooms.push(sideTop.name); + let side = sideTop; + if (side.hidden) + slot.HiddenRooms[side.name] = true; + } + } + + + return slot; + }, + shop: (Predecessor, x, y, forceCheckpoint) => { + //let checkpoint : string = forceCheckpoint || 'grv'; + return { + type: 'shop', + x: x, + y: y, + Checkpoint: 'shoppe', + color: "#ffffff", + Connections: [], + EscapeMethod: "", + MapMod: "", + RoomType: "ShopStart", + Faction: "", + protected: true, + visited: false, + SideRooms: [], + HiddenRooms: {}, + }; + }, + boss: (Predecessor, x, y, forceCheckpoint) => { + let checkpoint : string = forceCheckpoint + || KinkyDungeonBossFloor(y)?.forceCheckpoint + || Object.values(KinkyDungeonMapIndex)[Math.floor(Math.max(0, y - 1)/KDLevelsPerCheckpoint)] + || Predecessor?.Checkpoint + || 'grv'; + return { + type: 'boss', + x: x, + y: y, + Checkpoint: checkpoint, + color: KinkyDungeonMapParams[checkpoint]?.color || "#ffffff", + Connections: [], + EscapeMethod: "Boss", + MapMod: "", + RoomType: "", + Faction: "", + protected: true, + visited: false, + SideRooms: [], + HiddenRooms: {}, + }; + }, +}; + +/** + * + * @param Width - Length of the JourneyArea being created + * @param PreviousSlot - the JourneySlot preceding this one + */ +function KDCreateJourneyArea(Width: number, PreviousSlot: KDJourneySlot, FinalConnection: KDJourneySlot, continueCheckpoints?: boolean): KDJourneySlot[] { + let slots: KDJourneySlot[] = []; + let currentRow: KDJourneySlot[] = []; + let nextRow: KDJourneySlot[] = [PreviousSlot]; + let createdSlots: Record = {}; + + // Create the web + for (let i = 0; i < Width; i++) { + currentRow = nextRow; + nextRow = []; + + for (let slot of currentRow) { + let forks = [ + {x:+ 0, y: + 1}, + {x:+ 1, y: + 1}, + {x:- 1, y: + 1}, + ]; + for (let f of forks) { + // For each form we create a slot if its not there + let newfork = createdSlots[(slot.x + f.x) + ',' + (slot.y + f.y)]; + if (!newfork) { + // Create the slot + let succ: string = undefined; + if (slot.y % KDLevelsPerCheckpoint == 0 && continueCheckpoints && KDGameData.JourneyMap[(slot.x + f.x) + ',' + (slot.y + f.y - 2)]) { + if (slot.x + f.x != 0) { + succ = KDGameData.JourneyMap[(slot.x + f.x) + ',' + (slot.y + f.y - 2)].Checkpoint; + succ = KDGetJourneySuccessorCheckpoint(succ, slot.x + f.x); + } else { + succ = KDGameData.JourneyProgression[Math.floor(Math.max(0, slot.y)/KDLevelsPerCheckpoint)]; + } + + } + newfork = KDJourneySlotSuccessor(slot, f.x, f.y, succ); + slots.push(newfork); + nextRow.push(newfork); + createdSlots[(slot.x + f.x) + ',' + (slot.y + f.y)] = newfork; + if (i == Width-1 && FinalConnection) { + newfork.Connections.push({x: FinalConnection.x, y: FinalConnection.y}); + } + } + // Add a connection whether created or not + slot.Connections.push({x: newfork.x, y: newfork.y}); + } + } + } + + return slots; +} + +function KDCommitJourneySlots(slots: KDJourneySlot[]) { + for (let slot of slots) { + KDGameData.JourneyMap[slot.x + ',' + slot.y] = slot; + } +} + +function KDJourneySlotSuccessor(Slot: KDJourneySlot, xOffset: number, yOffset: number, forceCheckpoint?: string) : KDJourneySlot { + // Temp function for testing + // TODO add proper weights + let type = "basic"; + return KDJourneySlotTypes[type](Slot, Slot.x + xOffset, Slot.y + yOffset, forceCheckpoint); +} + +/** + * Culls the journey map + * Removes all slots with no connections + * Max of 100 to prevent infinite loops + * Does not affect protected slots + */ +function KDCullJourneyMap() { + let deleted = 0; + for (let i = 0; i < 100; i++) { + let connected: Record = {}; + for (let slot of Object.values(KDGameData.JourneyMap)) { + for (let c of slot.Connections) { + connected[c.x + ',' + c.y] = true; + } + } + let toDelete: Record = {}; + + for (let slot of Object.entries(KDGameData.JourneyMap)) { + if (!connected[slot[0]] && !slot[1].protected && !slot[1].visited) + toDelete[slot[0]] = true; + } + + for (let slot of Object.keys(toDelete)) { + delete KDGameData.JourneyMap[slot]; + deleted++; + } + } + console.log(`Culled ${deleted} journey slots`); +} + +let KDJourneyIndex = -1; + +function KDRenderJourneyMap(X: number, Y: number, Width: number = 5, Height: number = 7, ScaleX: number = 100, + ScaleY: number = 136, xOffset: number = 1450, yOffset: number = 212, spriteSize: number = 72, + TextOffset: number = 1925, allowScroll: boolean = false, allowChoose: boolean = true) { + + + if (allowScroll) { + if (KDJourneyIndex == -1) { + KDJourneyIndex = Y; + } else { + Y = KDJourneyIndex; + } + } + + if (allowChoose) { + DrawButtonKDEx("cancelJourney", (bdata) => { + KinkyDungeonState = "Game"; + KDGameData.JourneyTarget = null; + return true; + }, true, 800, 900, 400, 55, TextGet("KinkyDungeonCancel"), "white", undefined, undefined, undefined, undefined, undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeySkip[0]), + hotkeyPress: KinkyDungeonKeySkip[0], + }); + + if (KDGameData.JourneyTarget && KinkyDungeonStairTiles.includes(KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y))) + DrawButtonKDEx("confirmJourney", (bdata) => { + KinkyDungeonState = "Game"; + KinkyDungeonConfirmStairs = true; + KinkyDungeonMove({x: 0, y: 0}, 1, true); + return true; + }, true, 1300, 900, 400, 55, TextGet("KDNavMapConfirm"), "white", undefined, undefined, undefined, undefined, undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKeyEnter[0]), + hotkeyPress: KinkyDungeonKeyEnter[0], + }); + } + + + + if (!KDGameBoardAddedJourney) { + kdcanvas.addChild(KDJourneyGraphics); + kdcanvas.addChild(KDJourneyGraphicsLower); + kdcanvas.addChild(KDJourneyGraphicsUpper); + + + KDGameBoardAddedJourney = true; + } + + let slots: Record = {}; + let minX = X - Width; + let maxX = X + Width; + let minY = Y; + let maxY = Y + Height; + + let heights : Record = {}; + + // Add all slots to the rendering queue + for (let slot of Object.values(KDGameData.JourneyMap)) { + if (slot.x >= minX && slot.y >= minY && slot.x <= maxX && slot.y <= maxY) { + slots[(slot.x) + ',' + (slot.y)] = slot; + } + } + + let selectedJourney: KDJourneySlot = null; + + // Draw each slot + for (let slot of Object.values(slots)) { + let sprite = "UI/NavMap/" + slot.type; + if (slot.x == KDGameData.JourneyX && slot.y == KDGameData.JourneyY) { + + KDJourneyGraphics.lineStyle(3, 0xffffff); + KDJourneyGraphics.drawCircle( + xOffset + ScaleX*(slot.x - X), + yOffset + ScaleY*(slot.y - Y), + spriteSize * 0.7 + ); + } + KDDraw(kdcanvas, kdpixisprites, "navmap_" + slot.x + ',' + slot.y, + KinkyDungeonRootDirectory + sprite + '.png', + xOffset + ScaleX*(slot.x - X) - spriteSize/2, + yOffset + ScaleY*(slot.y - Y) - spriteSize/2, + spriteSize, spriteSize, undefined, { + tint: string2hex(slot.color) + } + ); + + if (slot.MapMod) { + let sprite = "UI/MapMod/" + slot.MapMod; + KDDraw(kdcanvas, kdpixisprites, "navmapmod_" + slot.x + ',' + slot.y, + KinkyDungeonRootDirectory + sprite + '.png', + xOffset + ScaleX*(slot.x - X) - spriteSize/2, + yOffset + ScaleY*(slot.y - Y) - spriteSize/2, + spriteSize, spriteSize, undefined, { + //tint: string2hex(slot.color), + zIndex: 1, + } + ); + } + if (slot.SideRooms.length > 0) { + let iter = 0; + for (let i = 0; i < slot.SideRooms.length; i++) { + if (!KDSideRooms[slot.SideRooms[i]]) continue; + if (iter >= 4) continue; + let sprite = "UI/SideRoom/" + slot.SideRooms[i]; + if (slot.HiddenRooms && slot.HiddenRooms[KDSideRooms[slot.SideRooms[i]].name]) { + sprite = "UI/SideRoom/Unknown"; + } + KDDraw(kdcanvas, kdpixisprites, "navsideroom" + i + "_" + slot.x + ',' + slot.y, + KinkyDungeonRootDirectory + sprite + '.png', + xOffset + ScaleX*(slot.x - X) - spriteSize/2, + yOffset + ScaleY*(slot.y - Y) - spriteSize/2 + iter * spriteSize*0.25, + spriteSize*0.25, spriteSize*0.25, undefined, { + //tint: string2hex(slot.color), + zIndex: 1, + } + ); + iter++; + } + + } + + if (MouseIn( + xOffset + ScaleX*(slot.x - X) - spriteSize/2, + yOffset + ScaleY*(slot.y - Y) - spriteSize/2, spriteSize, spriteSize) + ) { + if (!selectedJourney) selectedJourney = slot; + if ((mouseDown || MouseClicked)) { + MouseClicked = false; + // Check if there is connection + let conn = false; + let current = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; + if (current && current.Connections.some((c) => {return c.x == slot.x && c.y == slot.y;})) + conn = true; + if (conn || !allowChoose) { + KDGameData.JourneyTarget = { + x: slot.x, + y: slot.y, + }; + } else { + KDGameData.JourneyTarget = null; + } + } + } + + if (!heights["" + slot.y]) { + heights["" + slot.y] = true; + DrawTextFitKD(TextGet("KDNavMap_Floor").replace("NMB", "" + slot.y), TextOffset, yOffset + ScaleY*(slot.y - Y), + 200, "#ffffff", KDTextGray0, 24); + KDJourneyGraphicsLower.lineStyle(spriteSize*2, 0x000000, 0.2); + KDJourneyGraphicsLower.moveTo(xOffset - ScaleX*Width + 150, yOffset + ScaleY*(slot.y - Y)); + KDJourneyGraphicsLower.lineTo(xOffset + ScaleX*Width - 150, yOffset + ScaleY*(slot.y - Y)); + } + if ((slot.x < maxX && slot.x > minX && slot.y < maxY)) + for (let c of slot.Connections) { + let mod = 0; + if ( + KDGameData.JourneyTarget && KDGameData.JourneyMap[KDGameData.JourneyTarget.x + ',' + KDGameData.JourneyTarget.y] != slot + ) mod = -1; + let highlight = (slot.y <= KDGameData.JourneyY + mod) + || (KDGameData.JourneyTarget && KDGameData.JourneyMap[c.x + ',' + c.y] == KDGameData.JourneyMap[KDGameData.JourneyTarget.x + ',' + KDGameData.JourneyTarget.y]); + KDDrawJourneyLine( + xOffset + ScaleX*(slot.x - X), + yOffset + ScaleY*(slot.y - Y) + spriteSize/4, + xOffset + ScaleX*(c.x - X), + yOffset + ScaleY*(c.y - Y) - spriteSize/4, + (highlight) ? 0xffffff : 0x888888, + highlight ? KDJourneyGraphicsUpper : undefined + ) + } + } + + let currentSlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; + + if (allowChoose) { + if (KinkyDungeonKeybindingCurrentKey == KinkyDungeonKeyWait[0]) { + // Down + if (currentSlot?.Connections && currentSlot.Connections[0]) { + KDGameData.JourneyTarget = currentSlot.Connections[0]; + selectedJourney = KDGameData.JourneyMap[KDGameData.JourneyTarget.x + ',' + KDGameData.JourneyTarget.y]; + } + } else + if (KinkyDungeonKeybindingCurrentKey == KinkyDungeonKey[7]) { + // Down Right + if (currentSlot?.Connections && currentSlot.Connections[1]) { + KDGameData.JourneyTarget = currentSlot.Connections[1]; + selectedJourney = KDGameData.JourneyMap[KDGameData.JourneyTarget.x + ',' + KDGameData.JourneyTarget.y]; + } + } else + if (KinkyDungeonKeybindingCurrentKey == KinkyDungeonKey[6]) { + // Down Left + if (currentSlot?.Connections && currentSlot.Connections[2]) { + KDGameData.JourneyTarget = currentSlot.Connections[2]; + selectedJourney = KDGameData.JourneyMap[KDGameData.JourneyTarget.x + ',' + KDGameData.JourneyTarget.y]; + } + } + } + + if (!selectedJourney) { + selectedJourney = KDGameData.JourneyMap[KDGameData.JourneyTarget ? (KDGameData.JourneyTarget.x + ',' + KDGameData.JourneyTarget.y) : (KDGameData.JourneyX + ',' + KDGameData.JourneyY)]; + } + + if (selectedJourney && selectedJourney.y >= Y && selectedJourney.y <= KDLevelsPerCheckpoint + Y) { + KDJourneyGraphics.lineStyle(1, 0xffffff); + KDJourneyGraphics.drawCircle( + xOffset + ScaleX*(selectedJourney.x - X), + yOffset + ScaleY*(selectedJourney.y - Y), + spriteSize * 0.65 + ); + + let x = xOffset - (Width) * ScaleX - 440 + 50; + let y = yOffset - ScaleY/2 - spriteSize/4; + FillRectKD(kdcanvas, kdpixisprites, "collectionselectionbg", { + Left: x, + Top: y, + Width: 440, + Height: 730, + Color: "#000000", + LineWidth: 1, + zIndex: -20, + alpha: 0.5 + }); + DrawRectKD(kdcanvas, kdpixisprites, "collectionselectionbg2", { + Left: x, + Top: y, + Width: 440, + Height: 730, + Color: "#888888", + LineWidth: 1, + zIndex: -19, + alpha: 0.9 + }); + + + DrawTextFitKD(TextGet("DungeonName" + selectedJourney.Checkpoint), x + 220, y + 50, 500, "#ffffff", + (selectedJourney.color && selectedJourney.color != "#ffffff") ? selectedJourney.color : KDTextGray05, 36); + DrawTextFitKD(TextGet("KDNavMap_Floor").replace("NMB", "" + selectedJourney.y), x + 220, y + 15, 500, "#ffffff", KDTextGray05, 18); + + let II = 0; + let spacing = 32; + let off = 100; + let fontsize = 20; + let fontsize2 = 24; + let subspacePercent = 0.35; + DrawTextFitKD(TextGet("KDNavMap_Faction"), x + 220, y + off + spacing*II++, 500, "#ffffff", KDTextGray05, fontsize); + DrawTextFitKD(TextGet("KinkyDungeonFaction" + (selectedJourney.Faction || "")), x + 220, y + off + spacing*II++, 500, "#ffffff", KDTextGray05, fontsize2); + II+= subspacePercent; + DrawTextFitKD(TextGet("KDNavMap_RoomType"), x + 220, y + off + spacing*II++, 500, "#ffffff", KDTextGray05, fontsize); + DrawTextFitKD(TextGet("KDRoomType_" + (selectedJourney.RoomType || "")), x + 220, y + off + spacing*II++, 500, "#ffffff", KDTextGray05, fontsize2); + II+= subspacePercent; + DrawTextFitKD(TextGet("KDNavMap_MapMod"), x + 220, y + off + spacing*II++, 500, "#ffffff", KDTextGray05, fontsize); + DrawTextFitKD(TextGet("KDMapMod_" + (selectedJourney.MapMod || "")), x + 220, y + off + spacing*II++, 500, "#ffffff", KDTextGray05, fontsize2); + II+= subspacePercent; + DrawTextFitKD(TextGet("KDNavMap_EscapeMethod"), x + 220, y + off + spacing*II++, 500, "#ffffff", KDTextGray05, fontsize); + DrawTextFitKD(TextGet("KDEscapeMethod_" + (selectedJourney.EscapeMethod || "")), x + 220, y + off + spacing*II++, 500, "#ffffff", KDTextGray05, fontsize2); + II+= subspacePercent; + if (selectedJourney.SideRooms && selectedJourney.SideRooms.length > 0) { + DrawTextFitKD(TextGet("KDNavMap_SideRooms"), x + 220, y + off + spacing*II++, 500, "#ffffff", KDTextGray05, fontsize); + for (let sr of selectedJourney.SideRooms) { + let str = selectedJourney.HiddenRooms && selectedJourney.HiddenRooms[sr] ? TextGet("KDUnknown") + : TextGet("KDSideRoom_" + (sr || "")); + if (KDPersonalAlt[sr]) { + str = KDGetLairName(sr); + + } + DrawTextFitKD(str, x + 220, y + off + spacing*II++, 500, "#ffffff", KDTextGray05, fontsize2); + + } + II+= subspacePercent; + } + + } + + + if (allowScroll) { + let maxY = Math.floor(Math.max(1, KDGameData.HighestLevelCurrent || 1) / KDLevelsPerCheckpoint) + * KDLevelsPerCheckpoint; + if (KDJourneyIndex > 0) + DrawButtonKDEx("journeyUp", (_b) => { + if (KDJourneyIndex > 0) KDJourneyIndex -= KDLevelsPerCheckpoint; + if (KDJourneyIndex < 0) KDJourneyIndex = 0; + return true; + }, true, xOffset - 45, 95, 90, 40, "", + KDJourneyIndex > 0 ? "white" : "#888888", KinkyDungeonRootDirectory + "Up.png", undefined, undefined, undefined, undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKey[0]), + hotkeyPress: KinkyDungeonKey[0], + }); + if (KDJourneyIndex < maxY) + DrawButtonKDEx("journeyDown", (_b) => { + KDJourneyIndex += KDLevelsPerCheckpoint; + if (KDJourneyIndex > maxY) + KDJourneyIndex = maxY; + return true; + }, true, xOffset - 45, 830, 90, 40, "", + KDJourneyIndex < maxY ? "white" : "#888888", + KinkyDungeonRootDirectory + "Down.png", undefined, undefined, undefined, undefined, undefined, undefined, { + hotkey: KDHotkeyToText(KinkyDungeonKey[2]), + hotkeyPress: KinkyDungeonKey[2], + }); + + } else { + + } + +} + +function KDGetLairName(lair: string) { + let str = ""; + if (KDPersonalAlt[lair].OwnerNPC) { + str = TextGet("KDLairName") + .replace("PTRN", KDGetPersistentNPC(KDPersonalAlt[lair].OwnerNPC)?.Name) + .replace("RMTPE", TextGet("KDRoomType_" + KDPersonalAlt[lair].RoomType)); + } else if (KDPersonalAlt[lair].OwnerFaction) { + str = TextGet("KDOutpostName") + .replace("FCTN", TextGet("KinkyDungeonFaction" + KDPersonalAlt[lair].OwnerFaction)) + .replace("RMTPE", TextGet("KDRoomType_" + KDPersonalAlt[lair].RoomType)); + } else { + str = TextGet("KDRoomType_" + KDPersonalAlt[lair].RoomType); + } + return str; +} + +function KDInitJourneyMap(Level = 0) { + let simpleFirst = true; + let continueCheckpoints = true; + + KDGameData.JourneyMap = {}; + KDGameData.JourneyX = 0; + KDGameData.JourneyY = Level; + + let start = KDJourneySlotTypes.shop(null, 0, 0); + let bosses = []; + for (let i = 0; i + KDLevelsPerCheckpoint < KinkyDungeonMaxLevel; i += KDLevelsPerCheckpoint) { + let boss = KDJourneySlotTypes[KinkyDungeonBossFloor(i + KDLevelsPerCheckpoint) ? 'boss' : 'basic'](null, 0, i + KDLevelsPerCheckpoint); + if (i == 0 && simpleFirst) { + let first = KDJourneySlotTypes.basic(start, 0, i + 1, KDGameData.JourneyProgression[0]); + start.Connections.push({x: 0, y: i + 1}); + KDCommitJourneySlots([start, first, ...KDCreateJourneyArea(KDLevelsPerCheckpoint - 2, first, boss)]); + } else { + KDCommitJourneySlots([start, ...KDCreateJourneyArea(KDLevelsPerCheckpoint - 1, start, boss, continueCheckpoints && i >= KDLevelsPerCheckpoint)]); + } + bosses.push(boss); + start = boss; + if (i + 2*KDLevelsPerCheckpoint > KinkyDungeonMaxLevel) { + KDCommitJourneySlots([boss]); + } + } + + + + +} + +function KDDrawJourneyLine(x1: number, y1: number, x2: number, y2: number, color: number, Canvas = KDJourneyGraphics) { + Canvas.lineStyle(2, color, 1); + Canvas.moveTo(x1, y1); + Canvas.lineTo(x2, y2); + return; +} + +function KDGetJourneySuccessorCheckpoint(previousCheckpoint, x) { + let param: floorParams = KinkyDungeonMapParams[KDGameData.Journey == "Random" ? CommonRandomItemFromList(undefined, [...KDDefaultAlt, ...KDDefaultJourney]) : previousCheckpoint]; + if (param) { + let list = param.successorSame; + if (x > 0) list = param.successorPositive; + else if (x < 0) list = param.successorNegative; + let successor = KDGetByWeight(list); + return successor; + } + return 'grv'; +} + diff --git a/Game/src/map/KDLairEntrances.ts b/Game/src/map/KDLairEntrances.ts new file mode 100644 index 000000000..96d82a131 --- /dev/null +++ b/Game/src/map/KDLairEntrances.ts @@ -0,0 +1,177 @@ +"use strict"; + + +interface LairEntrance { + Type: string, + x: number, + y: number, + Excavate: KDPoint[], + PlaceScript: string, + priority?: number, +} + +/** PlaceScripts for lairs that override the entrance placescript */ +let KDLairTypePlaceScript: Record boolean> = { + DragonLair: (lair, data, entrance, roomTo) => { + // For now... + return KDLairTypePlaceScript["Cave"](lair, data, entrance, roomTo); + }, + Cave: (lair, data, entrance, roomTo) => { + let point = {x: entrance.x, y: entrance.y}; + if ((KinkyDungeonGroundTiles + "4rY").includes( + KinkyDungeonMapGet(point.x, point.y)) + && !KinkyDungeonTilesGet(point.x + ',' + point.y)?.Type) { + + KDMakeShortcutStairs(lair, point, data, roomTo); + + KinkyDungeonSkinArea({skin: "cav"}, point.x, point.y, 1.5); + + if (!KDMapData.SpecialAreas) KDMapData.SpecialAreas = []; + KDMapData.SpecialAreas.push({x: point.x, y: point.y, radius: 2}); + return true; + } + return false; + }, + Wall: (lair, data, entrance, roomTo) => { + let point = {x: entrance.x, y: entrance.y}; + if (("14").includes( + KinkyDungeonMapGet(point.x, point.y)) + && !KinkyDungeonTilesGet(point.x + ',' + point.y)?.Type) { + + KDMakeShortcutStairs(lair, point, data, roomTo); + + //KinkyDungeonSkinArea({skin: "cav"}, point.x, point.y, 1.5); + + if (!KDMapData.SpecialAreas) KDMapData.SpecialAreas = []; + KDMapData.SpecialAreas.push({x: point.x, y: point.y, radius: 2}); + return true; + } + return false; + }, +} + +/** Placescripts for lair entrances */ +let KDLairEntrancePlaceScript: Record boolean> = { + Cave: (lair, data, entrance, roomTo) => { + // Caves specifically must excavate, then they run specific or Cave LairTypePlaceScript + // Excavate + if (entrance.Excavate?.length > 0) { + for (let tile of entrance.Excavate) { + // Clear the tiles, but only if they are cracked or ground + if ((KinkyDungeonGroundTiles + "4").includes( + KinkyDungeonMapGet(tile.x, tile.y)) + && !KinkyDungeonTilesGet(tile.x + ',' + tile.y)?.Type) { + KinkyDungeonMapSet(tile.x, tile.y, 'r'); + KDCreateEffectTile(tile.x, tile.y, { + name: "RubbleNoMend", + duration: 9999, + }, 0); + } + } + KinkyDungeonUpdateLightGrid = true; + KinkyDungeonGenNavMap(); + } + + // Place script + return KDLairTypePlaceScript[lair?.PlaceScriptOverride || "Cave"](lair, data, entrance, roomTo); + }, + Jail: (lair, data, entrance, roomTo) => { + // Caves specifically must excavate, then they run specific or Cave LairTypePlaceScript + // Excavate + if (entrance.Excavate?.length > 0) { + for (let tile of entrance.Excavate) { + // Clear the tiles, but only if they are cracked or ground + if ((KinkyDungeonGroundTiles + "04").includes( + KinkyDungeonMapGet(tile.x, tile.y)) + && !KinkyDungeonTilesGet(tile.x + ',' + tile.y)?.Type) { + KinkyDungeonMapSet(tile.x, tile.y, '2'); + } + } + KinkyDungeonUpdateLightGrid = true; + KinkyDungeonGenNavMap(); + } + + // Place script + return KDLairTypePlaceScript[lair?.PlaceScriptOverride || "Wall"](lair, data, entrance, roomTo); + }, +} + +function KDGenHighSecCondition(force: boolean, enemy: entity) { + if (((force || KinkyDungeonFlags.has("LeashToPrison")) + && !(KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison)) + || ( + KDSelfishLeash(enemy) + )) { + + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + let slot = KDGetWorldMapLocation(KDCoordToPoint(KDGetCurrentLocation())); + return (!altType || altType.placeJailEntrances || slot?.main == KDGameData.RoomType); + } + return false; +} + + + +/** Weighting factor for filterscripts */ +let KDLairEntranceFilterScript: Record number> = { + Cave: (lair, data, entrance, roomTo) => { + let nearestDist = KinkyDungeonGetClosestSpecialAreaDist(entrance.x, entrance.y); + if (nearestDist < 3) return -1000; + + // Place script + return 1; + }, + Jail: (lair, data, entrance, roomTo) => { + let nearestDist = KinkyDungeonGetClosestSpecialAreaDist(entrance.x, entrance.y); + if (nearestDist < 3) return -1000; + + let nearestJail = KinkyDungeonNearestJailPoint(entrance.x, entrance.y, ["jail"]); + if (nearestJail) { + return KDistChebyshev(nearestJail.x - entrance.x, nearestJail.y - entrance.y); + } + return -1000; + }, +} + +function KDMakeShortcutStairs(lair: KDLair, point: KDPoint, data: KDMapDataType, roomTo?: string) { + KinkyDungeonMapSet(point.x, point.y, 'H'); + let tile = KinkyDungeonTilesGet(point.x + ',' + point.y) || {}; + /** EXTREMELY important to add the journeyslot and position!!!! */ + let slot = KDGetWorldMapLocation({x: data.mapX, y: data.mapY}); + let faction: string = lair?.OwnerFaction || ""; + if (slot) { + let jx = slot.jx || 0; + let jy = slot.jy || slot.y; + let journeySlot = KDGameData.JourneyMap[jx + ',' + jy]; + if (journeySlot) { + if (!lair) faction = journeySlot.Faction; + if (!journeySlot.SideRooms.includes(lair ? lair.Name : roomTo)) + journeySlot.SideRooms.push(lair ? lair.Name : roomTo); + if (!journeySlot.HiddenRooms) { + journeySlot.HiddenRooms = {}; + } + if (lair?.Hidden) + journeySlot.HiddenRooms[lair.Name] = true; + } + tile.ShortcutIndex = roomTo != undefined ? roomTo : data.ShortcutPositions.length; + if (data.ShortcutPositions.includes) { + // Convert from previous save + let newObj = {}; + for (let i = 0; i < Object.values(data.ShortcutPositions).length; i++) { + newObj[i] = data.ShortcutPositions[i]; + } + data.ShortcutPositions = newObj; + } + data.ShortcutPositions[tile.ShortcutIndex] = point; + } else { + return false; + } + + tile.MapMod = "None"; + tile.Faction = faction; + tile.EscapeMethod = "None"; + tile.RoomType = lair ? lair.Name : roomTo; + KinkyDungeonTilesSet(point.x + ',' + point.y, tile); + KinkyDungeonMapSet(point.x, point.y, 'H'); + KDRemoveAoEEffectTiles(point.x, point.y, [], 0.5); +} \ No newline at end of file diff --git a/Game/src/map/KDLairs.ts b/Game/src/map/KDLairs.ts new file mode 100644 index 000000000..9b5c60e68 --- /dev/null +++ b/Game/src/map/KDLairs.ts @@ -0,0 +1,446 @@ +"use strict"; + +interface KDLair { + Name: string, + RoomType: string, + OwnerNPC?: number, + OwnerFaction?: string, + /** Required entrance type for each entry room*/ + Entrance: Record, + /** For cases with an entrance that is not main, to a non lair*/ + EntranceTo: Record, + + /** Optional override type */ + PlaceScriptOverride?: string, + Hidden?: boolean, + UpStairsFrom?: string, + data?: any, +} +let KDPersonalAlt: {[_ : string]: KDLair} = {}; + +interface lairType { + /** Entrances from which type of room, otherwise DefaultEntrance*/ + Entrances?: Record, + DefaultEntrance: string + /** Entrances to the other room from this lair, otherwise DefaultEntranceFrom*/ + EntrancesFrom?: Record, + DefaultEntranceFrom: string +} + +let KDLairTypes: Record = { + DragonLair: { + Entrances: {}, + DefaultEntrance: "Cave", + EntrancesFrom: {}, + DefaultEntranceFrom: "Cave", + }, + Jail: { + Entrances: {}, + DefaultEntrance: "Jail", + EntrancesFrom: {}, + DefaultEntranceFrom: "Jail", + }, + DollStorage: { + Entrances: {}, + DefaultEntrance: "Jail", + EntrancesFrom: {}, + DefaultEntranceFrom: "Jail", + }, +} + +function KDGenerateLairNameFromEnemy(RoomType: string, enemy: entity): string { + return TextGet("KDPersonalizedRoom") + //RMNME of CHTRNME the ENMYNME + .replace("RMNME", TextGet("KDSideRoom_" + RoomType)) + .replace("CHTRNME", KDGetPersistentNPC(enemy.id)?.Name) + .replace("ENMYNME", TextGet("Name" + enemy.Enemy.name)); +} + + + +function KDGetLairs(slot: KDWorldSlot, id?: number): [string, string][] { + if (id) { + return slot?.lairs ? Object.entries(slot.lairs).filter((lair) => { + return lair[0].startsWith(id + "_"); + }) : []; + } + return slot?.lairs ? Object.entries(slot.lairs) : []; +} +function KDGetOutposts(slot: KDWorldSlot, faction?: number): [string, string][] { + if (faction) { + return slot?.outposts ? Object.entries(slot.outposts).filter((outpost) => { + return outpost[0].startsWith(faction + "_"); + }) : []; + } + return slot?.outposts ? Object.entries(slot.outposts) : []; +} + +function KDAddLair( + slot: KDWorldSlot, + /** Room to place the lair entrance in */ + room: string, + /** altType of the lair */ + alt: string, + id: number, + hidden: boolean, + /** Entrance of the lair inside room */ + entrance: string, + /** Room that this is from, only relevant if different from room*/ + fromRoom?: string, + /** Entrance of the room in the fromRoom, not the room*/ + fromRoomEntrance?: string, + /** Entrance of the fromRoom from within the lair, only relevant if fromRoom diffs from room*/ + entranceFrom?: string, + alwaysGet?: boolean): string { + let lairid = KDOutpostID(id + "", alt, slot); + + //id + "_" + alt + `,${slot.x},${slot.y}`; + let jx = slot.jx || 0; + let jy = slot.jy || slot.y; + let journeySlot = KDGameData.JourneyMap[jx + ',' + jy]; + if (!slot.lairs) { + slot.lairs = {}; + } + let placed = false; + if (slot.lairs[lairid] == undefined) { + slot.lairs[lairid] = room; + KDPersonalAlt[lairid] = { + Name: lairid, + RoomType: alt, + OwnerNPC: id, + Entrance: {}, + EntranceTo: {}, + Hidden: hidden, + UpStairsFrom: fromRoom != undefined ? fromRoom : room, + }; + KDPersonalAlt[lairid].Entrance[room] = entrance; + + if (journeySlot) { + journeySlot.SideRooms.push(lairid); + if (!journeySlot.HiddenRooms) { + journeySlot.HiddenRooms = {}; + } + if (hidden) + journeySlot.HiddenRooms[lairid] = true; + } + if (slot.data[room]) { + // We have to retroactively place the lair + if (!slot.data[room].LairsToPlace) { + slot.data[room].LairsToPlace = []; + } + slot.data[room].LairsToPlace.push(lairid); + if (slot.data[room] == KDMapData) { + // Build the lair instantly + KDBuildLairs(); + } + placed = true; + } else { + // We have to retroactively place the lair + if (!slot.lairsToPlace) { + slot.lairsToPlace = {}; + } + if (!slot.lairsToPlace[room]) { + slot.lairsToPlace[room] = []; + } + slot.lairsToPlace[room].push(lairid); + placed = true; + } + } + let gen = false; + if (fromRoom != undefined && KDDoLairOutpostConnections( + slot, + lairid, + fromRoom, + fromRoomEntrance, + entranceFrom)) + gen = true; + + if (KDDoLairOutpostConnections( + slot, + lairid, + room, + entrance, + entranceFrom)) + gen = true; + + if (gen) KDBuildLairs(); + return (placed || alwaysGet) ? lairid : undefined; +} + +function KDOutpostID(faction: string, alt: string, slot: KDPoint) { + return faction + "_" + alt + `,${slot.x},${slot.y}`; +} + +function KDAddOutpost( + slot: KDWorldSlot, + /** Room to place the lair entrance in */ + room: string, + /** altType of the lair */ + alt: string, + faction: string, + hidden: boolean, + /** Entrance of the lair inside room */ + entrance: string, + /** Room that this is from, only relevant if different from room*/ + fromRoom?: string, + /** Entrance of the room in the fromRoom, not the room*/ + fromRoomEntrance?: string, + /** Entrance of the fromRoom from within the lair, only relevant if fromRoom diffs from room*/ + entranceFrom?: string, + alwaysGet: boolean = true): string { + let outpostid = KDOutpostID(faction, alt, slot); + let jx = slot.jx || 0; + let jy = slot.jy || slot.y; + let journeySlot = KDGameData.JourneyMap[jx + ',' + jy]; + if (!slot.outposts) { + slot.outposts = {}; + } + let placed = false; + if (slot.outposts[outpostid] == undefined) { + slot.outposts[outpostid] = room; + KDPersonalAlt[outpostid] = { + Name: outpostid, + RoomType: alt, + OwnerFaction: faction, + Entrance: {}, + EntranceTo: {}, + UpStairsFrom: fromRoom != undefined ? fromRoom : room, + }; + KDPersonalAlt[outpostid].Entrance[room] = entrance; + + if (journeySlot) { + journeySlot.SideRooms.push(outpostid); + if (!journeySlot.HiddenRooms) { + journeySlot.HiddenRooms = {}; + } + if (hidden) + journeySlot.HiddenRooms[outpostid] = true; + } + if (slot.data[room]) { + // We have to retroactively place the lair + if (!slot.data[room].LairsToPlace) { + slot.data[room].LairsToPlace = []; + } + slot.data[room].LairsToPlace.push(outpostid); + if (slot.data[room] == KDMapData) { + // Build the lair instantly + KDBuildLairs(); + } + placed = true; + } else { + // We have to retroactively place the lair + if (!slot.lairsToPlace) { + slot.lairsToPlace = {}; + } + if (!slot.lairsToPlace[room]) { + slot.lairsToPlace[room] = []; + } + slot.lairsToPlace[room].push(outpostid); + placed = true; + } + } + let gen = false + + if (fromRoom != undefined && KDDoLairOutpostConnections( + slot, + outpostid, + fromRoom, + fromRoomEntrance, + entranceFrom)) + gen = true; + + if (KDDoLairOutpostConnections( + slot, + outpostid, + room, + entrance, + entranceFrom)) + gen = true; + + + if (gen) KDBuildLairs(); + return (placed || alwaysGet) ? outpostid : undefined; +} + +function KDDoLairOutpostConnections(slot: KDWorldSlot, id: string, + roomFrom: string, + entranceType: string, + entranceTypeFrom: string): boolean { + if (!KDPersonalAlt[id]) return false; + let ret = false; + if (!slot.lairsToPlace) { + slot.lairsToPlace = {}; + } + if ( + // Check target room for entrances + ( + !slot.lairsToPlace[roomFrom]?.includes(id) + && !slot.data[roomFrom]?.LairsToPlace?.includes(id) + && !(slot.data[roomFrom]?.UsedEntrances && slot.data[roomFrom]?.UsedEntrances[id]) + ) && roomFrom != id + ) { + KDPersonalAlt[id].Entrance[roomFrom] = entranceType; + if (slot.data[roomFrom]) { + if (!slot.data[roomFrom].LairsToPlace) { + slot.data[roomFrom].LairsToPlace = []; + } + if (!slot.data[roomFrom].LairsToPlace.includes(id)) + slot.data[roomFrom].LairsToPlace.push(id); + } else { + if (!slot.lairsToPlace[roomFrom]) { + slot.lairsToPlace[roomFrom] = []; + } + if (!slot.lairsToPlace[roomFrom].includes(id)) + slot.lairsToPlace[roomFrom].push(id); + } + ret = true; + } + + // If this lair doesnt have an entrance + if ( + KDPersonalAlt[id].UpStairsFrom != roomFrom + // Check target room for entrances + && ( + !slot.lairsToPlace[id]?.includes(roomFrom) + && !slot.data[id]?.LairsToPlace?.includes(roomFrom) + && !(slot.data[id]?.UsedEntrances && slot.data[id]?.UsedEntrances[roomFrom]) + ) && roomFrom != id + ) { + if (KDPersonalAlt[roomFrom]) + KDPersonalAlt[roomFrom].Entrance[id] = entranceTypeFrom; + else KDPersonalAlt[id].EntranceTo[roomFrom] = entranceTypeFrom; + if (slot.data[id]) { + if (!slot.data[id].LairsToPlace) { + slot.data[id].LairsToPlace = []; + } + if (!slot.data[id].LairsToPlace.includes(roomFrom)) + slot.data[id].LairsToPlace.push(roomFrom); + } else { + if (!slot.lairsToPlace[id]) { + slot.lairsToPlace[id] = []; + } + if (!slot.lairsToPlace[id].includes(roomFrom)) + slot.lairsToPlace[id].push(roomFrom); + } + + ret = true; + } + + return ret; +} + +/** Builds lairs for currently loaded map data */ +function KDBuildLairs() { + let data = KDMapData; + + // Load up the array if theres any that dont actually exist yet + let slot = KDGetWorldMapLocation({x: data.mapX, y: data.mapY}); + if (slot) { + if (!slot.lairsToPlace) { + slot.lairsToPlace = {}; + } + if (slot.lairsToPlace && slot.lairsToPlace[KDMapData.RoomType]?.length > 0) { + if (!data.LairsToPlace) { + data.LairsToPlace = []; + } + data.LairsToPlace.push(...slot.lairsToPlace[KDMapData.RoomType]); + slot.lairsToPlace[KDMapData.RoomType] = undefined; + } + } + + + /** Setup */ + let lairsToPlace = data.LairsToPlace || []; + let lairsNotPlaced: string[] = []; + let lairsPlaced: string[] = []; + + /** Iterate */ + for (let lairName of lairsToPlace) { + let lair = KDPersonalAlt[lairName]; + if (!lair && !KDPersonalAlt[data.RoomType]) { + lairsNotPlaced.push(lairName); + return; + } + let entrance = lair ? KDFindEntrance(lair, data) : KDFindEntranceTo(KDPersonalAlt[data.RoomType], lairName, data); + if (entrance) { + if (KDPlaceLairEntrance(lair, data, entrance, lairName)) { + lairsPlaced.push(lairName); + data.UsedEntrances[lairName] = entrance; + let ind = data.PotentialEntrances.findIndex((ent) => { + return ent.x == entrance.x && ent.y == entrance.y; + }); + if (ind >= 0) + data.PotentialEntrances.splice(ind, 1); + } else { + lairsNotPlaced.push(lairName); + } + } else { + lairsNotPlaced.push(lairName); + } + } + + /** Finalize */ + if (lairsNotPlaced.length == 0) { + data.LairsToPlace = undefined; + } else { + data.LairsToPlace = lairsNotPlaced; + } +} + +/** Filters and gets an entrance for the lair based on global lair data and map type */ +function KDFindEntrance(lair: KDLair, data: KDMapDataType): LairEntrance { + let highestEntrances: LairEntrance[] = []; + let min = -1000000; + let highestEntranceLevel = min; + let potentialEntrances = (data.PotentialEntrances || []).filter((entrance) => { + return lair.Entrance[data.RoomType] == entrance.Type; + }); + for (let entrance of potentialEntrances) { + let value = (entrance.priority || 0) + (!KDLairEntranceFilterScript[lair.Entrance[data.RoomType]] ? min + : KDLairEntranceFilterScript[lair.Entrance[data.RoomType]](lair, data, entrance)); + if (value > highestEntranceLevel) { + highestEntranceLevel = value; + highestEntrances = []; + } + if (value >= highestEntranceLevel) { + highestEntrances.push(entrance); + } + } + if (highestEntrances.length > 0) { + return highestEntrances[Math.floor(KDRandom() * highestEntrances.length)]; + } + return null; +} + +/** Filters and gets an entrance for the lair based on global lair data and map type */ +function KDFindEntranceTo(lairFrom: KDLair, roomTo: string, data: KDMapDataType): LairEntrance { + let highestEntrances: LairEntrance[] = []; + let min = -1000000; + let highestEntranceLevel = min; + let potentialEntrances = (data.PotentialEntrances || []).filter((entrance) => { + return lairFrom.EntranceTo[roomTo] == entrance.Type; + }); + for (let entrance of potentialEntrances) { + let value = (entrance.priority || 0) + (!KDLairEntranceFilterScript[lairFrom.EntranceTo[roomTo]] ? min + : KDLairEntranceFilterScript[lairFrom.EntranceTo[roomTo]](null, data, entrance, roomTo)); + if (value > highestEntranceLevel) { + highestEntranceLevel = value; + highestEntrances = []; + } + if (value >= highestEntranceLevel) { + highestEntrances.push(entrance); + } + } + if (highestEntrances.length > 0) { + return highestEntrances[Math.floor(KDRandom() * highestEntrances.length)]; + } + return null; +} + +/** Runs the associated place script for the lair based on global lair data */ +function KDPlaceLairEntrance(lair: KDLair, data: KDMapDataType, entrance: LairEntrance, roomTo?: string): boolean { + if (KDLairEntrancePlaceScript[entrance.PlaceScript]) { + return KDLairEntrancePlaceScript[entrance.PlaceScript](lair, data, entrance, roomTo); + } + return false; +} \ No newline at end of file diff --git a/Game/src/map/KDMap.ts b/Game/src/map/KDMap.ts new file mode 100644 index 000000000..a05acb350 --- /dev/null +++ b/Game/src/map/KDMap.ts @@ -0,0 +1,146 @@ + +function KDGetMapData(coord: WorldCoord): KDMapDataType { + let slot = KDGetWorldMapLocation({x: coord.mapX, y: coord.mapY}); + if (slot) { + let data = slot.data[coord.room]; + return data; + } + return null; +} + + + +function KDCoordToPoint(coord: {mapX: number, mapY: number}): KDPoint { + return { + x: coord.mapX != undefined ? coord.mapX : 0, + y: coord.mapY != undefined ? coord.mapY : MiniGameKinkyDungeonLevel, + } +} + +function KDGetEntrancePoints(map: WorldCoord, + includeShortcuts: boolean = true, + includeStart: boolean = true, + includeEnd: boolean = true): Record { + let slot = KDGetWorldMapLocation(KDCoordToPoint(map)); + if (slot) { + let data = KDGetMapData(map); + let entrances: Record = {}; + if (data.UsedEntrances) { + for (let entrance of Object.entries(data.UsedEntrances)) { + entrances[entrance[0]] = entrance[1]; + } + } + if (data) { + if (includeShortcuts) { + for (let shortcut of Object.entries(data.ShortcutPositions || [])) { + if (!entrances[shortcut[0]]) { + entrances[shortcut[0]] = shortcut[1]; + } + } + } + if (includeStart) { + let exit = KDGetNearestExit(data.StartPosition.x, data.StartPosition.y, data, false); + if (exit?.x == data.StartPosition.x && exit?.y == data.StartPosition.y) { + let tile = KinkyDungeonTilesGet(exit.x + ',' + exit.y) + if (tile?.RoomType) { + entrances[tile.RoomType] = data.StartPosition; + } else { + // Infer the room + if (data.RoomType == slot.main) { + entrances["PREV"] = data.StartPosition; + } else { + entrances[slot.main || ""] = data.StartPosition; + } + } + } + } + if (includeEnd) { + let exit = KDGetNearestExit(data.EndPosition.x, data.EndPosition.y, data, false); + if (exit?.x == data.EndPosition.x && exit?.y == data.EndPosition.y) { + let tile = KinkyDungeonTilesGet(exit.x + ',' + exit.y) + if (tile?.RoomType) { + entrances[tile.RoomType] = data.EndPosition; + } else { + // Infer the room + if (data.RoomType == slot.main) { + entrances["NEXT"] = data.EndPosition; + } else { + entrances[slot.main || ""] = data.EndPosition; + } + } + } + } + } + + return entrances; + } + + return {}; + } + +function KDGetEntrancesInRoom(map: WorldCoord, + includePotential: boolean = true, + includeShortcuts: boolean = true, + includeStart: boolean = true, + includeEnd: boolean = true): Record { + let slot = KDGetWorldMapLocation(KDCoordToPoint(map)); + if (slot) { + let data = KDGetMapData(map); + let entrances: Record = {}; + if (data.UsedEntrances) { + for (let entrance of Object.keys(data.UsedEntrances)) { + entrances[entrance] = true; + } + } + if (includePotential) { + for (let dataEntrance of ((slot.lairsToPlace || {})[map.room] || [])) { + if (!entrances[dataEntrance]) entrances[dataEntrance] = true; + } + } + if (data) { + if (includeShortcuts) { + for (let shortcut of Object.entries(data.ShortcutPositions || [])) { + if (!entrances[shortcut[0]]) { + entrances[shortcut[0]] = true; + } + } + } + if (includeStart) { + let exit = KDGetNearestExit(data.StartPosition.x, data.StartPosition.y, data, false); + if (exit?.x == data.StartPosition.x && exit?.y == data.StartPosition.y) { + let tile = KinkyDungeonTilesGet(exit.x + ',' + exit.y) + if (tile?.RoomType) { + entrances[tile.RoomType] = true; + } else { + // Infer the room + if (data.RoomType == slot.main) { + entrances["PREV"] = true; + } else { + entrances[slot.main || ""] = true; + } + } + } + } + if (includeEnd) { + let exit = KDGetNearestExit(data.EndPosition.x, data.EndPosition.y, data, false); + if (exit?.x == data.EndPosition.x && exit?.y == data.EndPosition.y) { + let tile = KinkyDungeonTilesGet(exit.x + ',' + exit.y) + if (tile?.RoomType) { + entrances[tile.RoomType] = true; + } else { + // Infer the room + if (data.RoomType == slot.main) { + entrances["NEXT"] = true; + } else { + entrances[slot.main || ""] = true; + } + } + } + } + } + + return entrances; + } + + return {}; +} \ No newline at end of file diff --git a/Game/src/map/KDMinimapLabels.ts b/Game/src/map/KDMinimapLabels.ts new file mode 100644 index 000000000..6f6d194f6 --- /dev/null +++ b/Game/src/map/KDMinimapLabels.ts @@ -0,0 +1,96 @@ + +let KDMinimapIcons: Record string> = { + 'G': (_x, _y) => {return "UI/MiniMap/Ghost.png";}, + 'O': (_x, _y) => {return "UI/MiniMap/Orb.png";}, + 'S': (_x, _y) => {return "UI/MiniMap/Stairs.png";}, + 's': (_x, _y) => {return "UI/MiniMap/StairsDown.png";}, + 'H': (_x, _y) => {return "UI/MiniMap/StairsDown.png";}, + 'A': (x, y) => { + if (KinkyDungeonTilesGet(x + "," + y)?.drunk) { + if (KinkyDungeonTilesGet(x + "," + y)?.Quest) + return "UI/MiniMap/ShrineQuest.png"; + return "UI/MiniMap/ShrineMana.png"; + } + if (KinkyDungeonTilesGet(x + "," + y)?.Quest) + return "UI/MiniMap/ShrineManaQuest.png"; + return "UI/MiniMap/ShrineMana.png";}, + '=': (_x, _y) => {return "UI/MiniMap/ChargerEmpty.png";}, + '+': (_x, _y) => {return "UI/MiniMap/ChargerCrystal.png";}, + 'D': (_x, _y) => {return "UI/MiniMap/DoorClosed.png";}, + 'd': (_x, _y) => {return "UI/MiniMap/DoorOpen.png";}, + 'B': (_x, _y) => {return "UI/MiniMap/Bed.png";}, + 'b': (_x, _y) => {return "UI/MiniMap/Bars.png";}, + 'g': (_x, _y) => {return "UI/MiniMap/Grate.png";}, + 'M': (_x, _y) => {return "UI/MiniMap/Tablet.png";}, + 'C': (_x, _y) => {return "UI/MiniMap/Chest.png";}, +}; + + +let KDMinimapLabels: Record string> = { + 'G': (_x, _y, force) => {if (!force && !KDMMLabels_Shrine) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : (KinkyDungeonTilesGet(_x + "," + _y)?.Msg ? "" : TextGet("KDMinimapLabel_Ghost"));}, + 'O': (_x, _y, force) => {if (!force && !KDMMLabels_Shrine) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : TextGet("KDMinimapLabel_Orb");}, + 'S': (_x, _y, force) => {if (!force && !KDMMLabels_Other) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : TextGet("KDMinimapLabel_S");}, + 's': (_x, _y, force) => {if (!force && !KDMMLabels_Other) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : TextGet("KDMinimapLabel_s");}, + 'H': (_x, _y, force) => {if (!force && !KDMMLabels_Other) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : (KinkyDungeonTilesGet(_x + "," + _y).RoomType ? ">" + KDGetDungeonName({ + mapX: KDGetCurrentLocation().mapX, + mapY: KDGetCurrentLocation().mapY, + room: KinkyDungeonTilesGet(_x + "," + _y).RoomType + }): TextGet("KDMinimapLabel_H"));}, + 'A': (x, y, force) => {if (!force && !KDMMLabels_Shrine) return ""; + if (KinkyDungeonTilesGet(x + "," + y)?.MMLabel) + return TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(x + "," + y).MMLabel); + if (KinkyDungeonTilesGet(x + "," + y)?.Quest) + return TextGet("KDMinimapLabel_ShrineQuest"); + return TextGet("KDMinimapLabel_Shrine");}, + '=': (_x, _y, force) => {if (!force && !KDMMLabels_Other) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : TextGet("KDMinimapLabel_=");}, + '+': (_x, _y, force) => {if (!force && !KDMMLabels_Other) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : TextGet("KDMinimapLabel_+");}, + 'D': (_x, _y, force) => {if (!force && !KDMMLabels_Other) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : "";}, + 'd': (_x, _y, force) => {if (!force && !KDMMLabels_Other) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : "";}, + 'B': (_x, _y, force) => {if (!force && !KDMMLabels_Other) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : TextGet("KDMinimapLabel_Bed" + (KinkyDungeonFlags.get("slept") ? "Fail" : ""));}, + 'b': (_x, _y, force) => {if (!force && !KDMMLabels_Other) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : "";}, + 'g': (_x, _y, force) => {if (!force && !KDMMLabels_Other) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : "";}, + 'M': (_x, _y, force) => {if (!force && !KDMMLabels_Shrine) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : TextGet("KDMinimapLabel_Tablet");}, + 'C': (_x, _y, force) => {if (!force && !KDMMLabels_Chest) return ""; + return KinkyDungeonTilesGet(_x + "," + _y)?.MMLabel ? + TextGet("KDMinimapLabel_" + KinkyDungeonTilesGet(_x + "," + _y).MMLabel) + : TextGet("KDMinimapLabel_C_" + KinkyDungeonTilesGet(_x + "," + _y)?.Loot);}, +} \ No newline at end of file diff --git a/Game/src/map/KDRegiments.ts b/Game/src/map/KDRegiments.ts new file mode 100644 index 000000000..dbb3ef923 --- /dev/null +++ b/Game/src/map/KDRegiments.ts @@ -0,0 +1,208 @@ +"use strict"; + +interface KDRegiment { + id: number, + location: WorldCoord, + room: string, +} + +/** Leave blank to get all regiments */ +function KDGetRegiments(location?: {x: number, y: number}, Room?: string) { + if (!KDGameData.Regiments) KDGameData.Regiments = {}; + + if (!location) { + return Object.values(KDGameData.Regiments); + } +} + +/** + * Updates a map's data to include all the global regiments + */ +function UpdateRegiments(coords: WorldCoord) { + let loc = KDGetWorldMapLocation({x: coords.mapX, y: coords.mapY}); + if (!loc) return; + let Map = loc.data[coords.room] + Map.Regiments = {}; + + for (let reg of KDGetRegiments()) { + if (KDCompareLocation(reg.location, coords)) { + Map.Regiments[reg.id] = reg.id; + } + } +} + + +/** Time between refill ticks */ +let KDMapTickTime = 50; +/** Only tick 2 floors behind or ahead */ +let KDMapTickRange = 2; + +function KDTickMaps(delta: number, + minFloor: number, + maxFloor: number, + onlyMain: false, + updateReg: boolean, + updateChests: boolean, +): boolean { + // Always update repop queue for this map, but do it delayed for others + + if (MiniGameKinkyDungeonLevel >= minFloor && MiniGameKinkyDungeonLevel <= maxFloor) { + KDUpdateRepopQueue( + KDMapData, delta + ); + } + + + if (KinkyDungeonFlags.get("KDMapTick")) return false; + KinkyDungeonSetFlag("KDMapTick", KDMapTickTime); + let mapsToUpdate: WorldCoord[] = []; + let mapsWithUpdateNPCs: WorldCoord[] = []; + + for (let y = minFloor; y <= maxFloor; y++) { + let mapSlot = KDWorldMap[0 + ',' + y]; + if (mapSlot) { + for (let data of Object.values(mapSlot.data)) { + mapsToUpdate.push({ + mapX: 0, + mapY: y, + room: data.RoomType, + }) + } + } + } + + for (let y = 0; y <= KDGameData.HighestLevelCurrent; y++) { + let mapSlot = KDWorldMap[0 + ',' + y]; + if (mapSlot) { + let visitedRooms: Record = {}; + for (let data of Object.values(mapSlot.data)) { + if (KDGetPersistentNPCCache({ + mapX: 0, + mapY: y, + room: data.RoomType, + })?.length > 0) { + mapsWithUpdateNPCs.push({ + mapX: 0, + mapY: y, + room: data.RoomType, + }) + visitedRooms[data.RoomType] = true; + } + } + + let journeySlot = KDGameData.JourneyMap[(mapSlot.jx != undefined ? mapSlot.jx : 0) + ',' + (mapSlot.jy != undefined ? mapSlot.jy : y)]; + if (journeySlot?.SideRooms) { + for (let r of journeySlot.SideRooms) { + if (KDSideRooms[r]?.altRoom && !visitedRooms[KDSideRooms[r].altRoom]) { + if (KDGetPersistentNPCCache({ + mapX: 0, + mapY: y, + room: KDSideRooms[r].altRoom, + })?.length > 0) { + mapsWithUpdateNPCs.push({ + mapX: 0, + mapY: y, + room: KDSideRooms[r].altRoom, + }) + visitedRooms[KDSideRooms[r].altRoom] = true; + } + } + } + } + } + } + + for (let coords of mapsToUpdate) { + let loc = KDGetWorldMapLocation({x: coords.mapX, y: coords.mapY}); + if (!loc) continue; + + let data = loc.data[coords.room] + if (data != KDMapData) { + KDUpdateRepopQueue( + data, KDMapTickTime + ); + } + if (updateReg) + UpdateRegiments(coords); + if (updateChests) + KDRefillChests(data); + } + + for (let coords of mapsWithUpdateNPCs) { + let loc = KDGetWorldMapLocation({x: coords.mapX, y: coords.mapY}); + if (!loc) continue; + + let data = loc.data[coords.room] + + if (data) { + + } + KDSpawnPersistentNPCs(coords, data == KDMapData); + KDWanderPersistentNPCs(coords, data == KDMapData); + KDRunPersistentNPCScripts(coords, data == KDMapData); + + } + + + + + return true; +} + +/** Time between refill ticks */ +let KDRefillChestInterval = 200; +/** Chance for a chest to be refilled during a tick */ +let KDRefillChestChance = 0.5; + +function KDRefillChests(data: KDMapDataType) { + /** + * Only refill when player has been captured--for balance reasons + */ + if (!data.data) data.data = {}; + let lastRefill = data.data.lastChestRefill; + let currentTick = KinkyDungeonCurrentTick; + + if (KDGameData.PrisonerState == 'jail') { + if (lastRefill + KDRefillChestInterval < currentTick) { + lastRefill = currentTick; + for (let x = 0; x < data.GridWidth; x++) { + for (let y = 0; y < data.GridHeight; y++) { + if (data.Tiles[x + ',' + y]?.refill) { + KDRefillTick(x, y, data); + } + } + } + + } + } +} + + +function KDRefillTick(x: number, y: number, data: KDMapDataType) { + let tile = data.Tiles[x + ',' + y]; + if (tile) { + let type = tile.Type; + if (KDRefillTypes[type]) { + KDRefillTypes[type](x, y, tile, data); + } + } +} + +let KDRefillTypes = { + Chest: (x: number, y: number, tile: any, data: KDMapDataType) => { + let empty = KinkyDungeonMapDataGet(data, x, y) == 'c'; + if (empty + && (data != KDMapData + || KDistChebyshev(x - KDPlayer().x, y - KDPlayer().y) > Math.max(GiantMapOptimizations || 0, 10)) + && KDRandom() < KDRefillChestChance) { + let refillTo = tile.origloot; + if (refillTo) { + KinkyDungeonMapDataSet(data, x, y, 'C'); + tile.Loot = refillTo; + tile.Roll = KDRandom(); + tile.Lock = "White"; // After it gets stolen once there is a lock on it :) + } + } + + } +} \ No newline at end of file diff --git a/Game/src/map/KDShop.ts b/Game/src/map/KDShop.ts new file mode 100644 index 000000000..2bc873f52 --- /dev/null +++ b/Game/src/map/KDShop.ts @@ -0,0 +1,8 @@ +"use strict"; + +function KDMurderShopkeeper(count: number) { + if (KDGameData.ShopkeepersMurdered == undefined) { + KDGameData.ShopkeepersMurdered = 0; + } + KDGameData.ShopkeepersMurdered += count; +} \ No newline at end of file diff --git a/Game/src/map/KDSideRooms.ts b/Game/src/map/KDSideRooms.ts new file mode 100644 index 000000000..b8d502d0f --- /dev/null +++ b/Game/src/map/KDSideRooms.ts @@ -0,0 +1,217 @@ +"use strict"; + +let KDSideRooms: Record = { + "DemonTransition": { + name: "DemonTransition", + weight: 150, + chance: 1.0, + filter: (slot, top) => { + // Top reserved for lairs + if (top) return 0; + if (slot.Checkpoint == 'ore') return 1; + if (slot.Checkpoint == 'tmp') return 0.25; + return 0; + }, + altRoom: "DemonTransition", + mapMod: "None", + hidden: true, + escapeMethod: "None", + faction: "Observer", + stairCreation: (tile, x, y) => { + KinkyDungeonSkinArea({skin: "DemonTransition"}, x, y, 1.5); + tile.Skin = "DimensionRift"; + KDCreateEffectTile(x, y, { + name: "Portals/DarkPortal", + duration: 9999, infinite: true, + }, 0); + return true; + }, + wandertags: { + void: 10, + }, + }, + "BanditFort": { + name: "BanditFort", + weight: 150, + chance: 0.5, + hidden: true, + filter: (slot, top) => { + // Top reserved for lairs + if (top) return 0; + if (slot.Checkpoint == 'ore') return 0.25; + if (slot.Checkpoint == 'tmp') return 0.5; + if (slot.Checkpoint == 'cat') return 0.75; + if (slot.Checkpoint == 'tmb') return 0.75; + return 1; + }, + altRoom: "BanditFort", + mapMod: "None", + escapeMethod: "None", + faction: "Bandit", + stairCreation: (_tile, x, y) => { + KinkyDungeonSkinArea({skin: "shoppe"}, x, y, 1.5); + return true; + }, + wandertags: { + bandit: 10, + bounty: 1, + criminal: 5, + }, + worldGenScript: (coord) => { + // Generate the bandit highsec prison and its entrances + KDAddOutpost( + KDGetWorldMapLocation(KDCoordToPoint(coord)), + "BanditFort", + "Jail", + "Bandit", + false, + "Jail", + KDGetWorldMapLocation(KDCoordToPoint(coord))?.main || "", + "Jail", + "Jail" + ); + + }, + }, + "Caldera": { + name: "Caldera", + weight: 250, + chance: 0.15, + filter: (slot, top) => { + if (top) return 0.5; + if (slot.Checkpoint == 'cst') return 0; + return 1; + }, + altRoom: "Caldera", + mapMod: "None", + escapeMethod: "None", + faction: "Elf", + stairCreation: (_tile, x, y) => { + KinkyDungeonSkinArea({skin: "cst"}, x, y, 1.5); + return true; + }, + wandertags: { + nature: 10, + treasure: 1, + generic: 1, + }, + }, + "ElevatorRoom": { + name: "ElevatorRoom", + weight: 400, + chance: 0.4, + tags: ["elevator"], + filter: (slot, top) => { + if (!top) return 0; + return slot.Checkpoint == 'tmb' ? 0 : 1; + }, + altRoom: "ElevatorRoom", + mapMod: "None", + escapeMethod: "None", + faction: "AncientRobot", + stairCreation: (_tile, x, y) => { + KinkyDungeonSkinArea({skin: "bel"}, x, y, 1.5); + return true; + }, + wandertags: { + treasure: 1, + danger: 5, + }, + }, + "ElevatorEgyptian": { + name: "ElevatorEgyptian", + weight: 800, + chance: 0.4, + filter: (slot, top) => { + if (!top) return 0; + return slot.Checkpoint == 'tmb' ? 1 : 0.1; + }, + tags: ["elevator", "elevatorstart"], + altRoom: "ElevatorEgyptian", + mapMod: "None", + escapeMethod: "None", + faction: "Bast", + stairCreation: (_tile, x, y) => { + KinkyDungeonSkinArea({skin: "tmb"}, x, y, 1.5); + return true; + }, + wandertags: { + danger: 1, + }, + }, + "ElevatorEgyptian2": { + name: "ElevatorEgyptian2", + weight: 200, + chance: 0.4, + filter: (slot, top) => { + if (!top) return 0; + return slot.Checkpoint == 'tmb' ? 0.4 : 0.01; + }, + tags: ["elevator", "elevatorstart"], + altRoom: "ElevatorEgyptian2", + mapMod: "None", + escapeMethod: "None", + faction: "Bast", + stairCreation: (_tile, x, y) => { + KinkyDungeonSkinArea({skin: "tmb"}, x, y, 1.5); + return true; + }, + wandertags: { + }, + }, + "GoldVault": { + name: "GoldVault", + weight: 100, + chance: 0.4, + filter: (_slot, top) => { + if (top) return 0; + return 1; + }, + altRoom: "GoldVault", + mapMod: "None", + escapeMethod: "None", + faction: "AncientRobot", + stairCreation: (_tile, x, y) => { + KinkyDungeonSkinArea({skin: "vault"}, x, y, 1.5); + return true; + }, + wandertags: { + danger: 5, + treasure: 5, + tech: 1, + }, + }, +}; + +// KDGetMapGenList(3, KDMapMods); +/** + * @param slot + * @param side + * @param ignore + * @param [requireTag] + */ +function KDGetSideRoom(slot: KDJourneySlot, side: boolean, ignore: string[], requireTag?: string): KDSideRoom { + let genWeightTotal = 0; + let genWeights = []; + let mult = 1.0; + + for (let mod of Object.values(KDSideRooms)) { + if (!ignore.includes(mod.name)) { + mult = mod.filter(slot, side); + if (mult > 0 && (mod.chance*mult >= 1 || KDRandom() < mod.chance*mult) + && (!requireTag || (mod.tags && mod.tags.includes(requireTag)))) { + genWeights.push({mod: mod, weight: genWeightTotal}); + genWeightTotal += mod.weight; + } + } + } + + let selection = KDRandom() * genWeightTotal; + + for (let L = genWeights.length - 1; L >= 0; L--) { + if (selection > genWeights[L].weight) { + return genWeights[L].mod; + } + } + return undefined; +} diff --git a/Game/src/map/KinkyDungeonAlt.ts b/Game/src/map/KinkyDungeonAlt.ts new file mode 100644 index 000000000..b3a41537d --- /dev/null +++ b/Game/src/map/KinkyDungeonAlt.ts @@ -0,0 +1,3244 @@ +"use strict"; + +let KDJourneyMapMod = { + "Random": true, +}; + + +interface KDMapEnemyList { + /** The boss */ + enemy: string, + faction?: string, + minfloor?: number, + maxfloor?: number, + /** Scenery */ + furniture?: Record, + /** Scenery */ + obstacles: Record, + /** Weighted average for close party */ + party?: Record, + /** Uses all as tags in enemy selection */ + partytags?: string[], + /** Chooses one to be filtertag */ + partyrequiretags?: string[], + /** Multiplier for weighted average party */ + weightedpartymult?: number + /** Multiplier for randomly generated party */ + randompartymult?: number +} + +let KDElevatorHallEnemies : KDMapEnemyList[] = [ + { + enemy: "EnforcerBot", + faction: "Virus", + minfloor: 0, + maxfloor: 4, + obstacles: { + "": 1, + OldDrone: 0.5, + RubberTurret: 0.07, + }, + }, + { // With missile silos + enemy: "BotMissile", + faction: "Virus", + minfloor: 4, + obstacles: { + "": 0.4, + OldDrone: 0.3, + OldTapeDrone: 0.5, + RubberTurret: 0.1, + RubberSilo: 0.05, + }, + }, + { // Bandit earlygame + enemy: "BanditChief", + faction: "Bandit", + maxfloor: 8, + obstacles: { + "": 1.5, + Bandit: 0.4, + BanditPet: 0.3, + BanditHunter: 0.2, + }, + }, + { // Bandit later + enemy: "BanditMerchant", + faction: "Bandit", + minfloor: 6, + obstacles: { + "": 1.0, + BanditGuard: 0.5, + BanditPet: 1.0, + BanditGrappler: 0.3, + }, + }, + { // Dollmaker earlygame + enemy: "Dollmaker", + faction: "Dollsmith", + maxfloor: 4, + obstacles: { + "DollsmithDoll": 1.5, + "": 0.4, + OldDrone: .25, + }, + }, + { // Dollmaker mid + enemy: "Dollmaker", + faction: "Dollsmith", + minfloor: 4, + maxfloor: 9, + obstacles: { + "DollsmithDoll": 1.0, + Dollsmith: 0.1, + OldDrone: 0.25, + OldTapeDrone: 0.1, + }, + }, + { // Dollmaker late + enemy: "Dollmaker", + faction: "Dollsmith", + minfloor: 8, + obstacles: { + "DollsmithDoll": 0.75, + Dollsmith: 0.25, + Dollmaker: 0.15, + OldTapeDrone: 0.5, + }, + }, +]; + +let KDDefaultMaxFlags = { + goldchest: 1, + lessergold: 1, + silverchest: 2, + darkchest: 2, + redchest: 6, + bluechest: 2, + forbidden: 1, + artifact: 2, + jail: 2, + playroom: 4, + supplydepot: 1, + barracks: 2, + robotroom: 3, + laboratory: 1, + library: 1, + armory: 1, + workshop: 2, + tinker: 1, + office: 3, + worship: 1, + graveyard: 2, + well: 3, + wildlife: 2, + range: 2, + arena: 1, + arena_boss: 1, + arena_miniboss: 5, + slimespawn: 3, + beastspawn: 3, + magicspawn: 3, + robotspawn: 3, +}; + +interface AltType { + name: string, + /** Room title for display */ + Title?: string, + bossroom?: boolean, + width: number, + height: number, + genType: string, + skiptunnel?: boolean, + spawns: boolean, + chests: boolean, + shrines: boolean, + orbs?: number, + setpieces: Record, + chargers: boolean, + notorches?: boolean, + heart: boolean, + specialtiles: boolean, + shortcut: boolean, + enemies: boolean, + nojail: boolean, + nolore?: boolean, + nokeys: boolean, + faction?: string, + nostairs?: boolean, + notraps?: boolean, + /** You're not supposed to be here */ + restricted?: boolean, + /** Forces the tileset */ + forceCheckpoint?: string, + /** You cant backtrack until you meet the escape condition */ + noLeave?: boolean, + /** Jail never releases player in sub mode */ + noRelease?: boolean, + /** If noRelease is true, will always release player instantly if security is low instead of waiting*/ + releaseOnLowSec?: boolean, + noClutter?: boolean, + noShrineTypes?: string[], + /** Ticks flags with a floor component. Reserved for perk room generally */ + tickFlags?: boolean, + noMusic?: boolean, + /** ???, probably deprecated */ + keepMainPath?: boolean, + /** Uses music from this tileset */ + musicParams?: string, + /** Room is persistent */ + persist?: boolean, + /** Room is NOT persistent and never so */ + alwaysRegen?: boolean, + /** Remove when pruning world map */ + prune?: boolean, + /** Dont lose items */ + keepItems?: boolean, + /** Unused */ + constantX?: boolean, + /** Type of Prison state machine */ + prisonType?: string, + /** Runs BEFORE the gencriteria */ + beforeWorldGenScript?: (coord: WorldCoord) => void, + /** Runs AFTER the worldgenscript */ + worldGenScript?: (coord: WorldCoord) => void, + /** Faction that owns the Jail*/ + jailType?: string, + /** Faction that guards the Jail*/ + guardType?: string, + /** Visual skin */ + skin?: string, + /** Does not use the skin music */ + useDefaultMusic?: boolean, + /** Increased number of enemies */ + enemyMult?: number, + /** Use different gen params for map gen */ + useGenParams?: string, + /** Use different gen params for map gen */ + lightParams?: string, + /** Use different gen params for map gen */ + bonusTags?: Record, + /** Always increases level by 1 */ + alwaysAdvance?: boolean, + /** Dont advance when going to this floor. Not very useful atm */ + noAdvance?: boolean, + /** Rebels go back to collection. Unused I think*/ + keepRebels?: boolean, + /** Defeated NPCs go directly to collection*/ + keepPrisoners?: boolean, + /** Do not run the 'wear' algorithm. Note: No caves will be possible!!! */ + noWear?: boolean, + + /** Allows highsec in here */ + placeJailEntrances?: boolean, + + /** Creates the jail entrances but doesnt let them be used unless this is a destination */ + allowJailEntrances?: boolean, + + nopatrols?: boolean, + /** Dont remove items from floor */ + private?: boolean, + + /** Prevents jailers from taking you out of jail in order to put you into jail */ + isPrison?: boolean, + + /** Even if there are no start stairs (nostartstairs) you still get placed at the start position when you enter the room (e.g. if you have a custom tile instead of stairs)*/ + startatstartpos?: boolean, + /** Does not create the starting stairs. Still defines a start position */ + nostartstairs?: boolean, + /** Does not generate brickwork */ + nobrick?: boolean, + /** Dont generate the boringness matrix */ + noboring?: boolean, + + /** generate torches */ + torches?: boolean, + + /** Wander tags for persistent NPC */ + wanderTags?: Record, + + /** Unlike other alttypes, this one does get bigger with labyrinthine halls, etc */ + sizeBonus?: boolean, + /** Which tileset to get lore notes from */ + loreCheckpoint?: string, + + /** Ambient brightness override */ + brightness?: number, + /** Automatically place extra doors according to door placement algorithm */ + placeDoors?: boolean, + /** places no setpieces */ + noSetpiece?: boolean, + /** This is considered a "main" room, e.g. quests will generate, elemental hunters will follow, etc. **/ + makeMain?: boolean, + + /** Attempting to exit brings up journey target screen */ + requireJourneyTarget?: boolean, + + /** Dont make quests even if this is a main. */ + noQuests?: boolean, + + /** Confusingly, this signals that the room is not safe for NPCs to remain in even if persistent, so all NPCs (including persistent and non allies) will be removed upon leaving */ + removePartyMembers?: boolean, + + /** Custom escape */ + escapeMethod?: string, + /** REQUIRES that spawned npcs be the main faction */ + factionSpawnsRequired?: boolean, + /** Replaces torches of the map with a custom type */ + torchreplace?: { + sprite: string, + unlitsprite: string, + brightness: number, + }, + /** Doesnt generate random bits of furniture */ + noFurniture?: boolean, + /** Doesnt turn tables to food */ + noFood?: string, + /** Archaic code */ + doorPlaceMode?: number, + /** Doesnt spawn prisoners in cages on load */ + noPersistentPrisoners?: boolean, + /** Doesnt spawn persistent NPCs on load */ + noPersistentSpawn?: boolean, + /** NPCs do not restock gear here */ + norestock?: boolean, + + + + events?: KinkyDungeonEvent[], + + data?: any, + /** Condition to approve the map */ + genCriteria?: (iteration: number) => boolean, + /** Condition to unlock the elevator */ + elevatorCondition?: (x: number, y: number) => boolean, + /** runs when you exit */ + onExit?: (data: any) => void, + /** runs every frame*/ + drawscript?: (_delta, CamX: number, CamY: number, CamX_offsetVis: number, CamY_offsetVis: number) => void, + /** runs AFTER you exit and the new map has been created */ + afterExit?: (data: any) => void, + /** runs when the map is loaded or created. Return true to repopulate the map, or false to not.*/ + loadscript?: (firsttime: boolean) => boolean, + /** runs every turn.*/ + updatescript?: (delta: number) => void, + + + + +} + +let alts: Record = { + "Tunnel": { + // DEPRECATED DO NOT USE + name: "Tunnel", + bossroom: false, + width: 8, + height: 8, + //constantX: true, + genType: "Tunnel", + skiptunnel: true, // Increments the floor counter + spawns: false, + chests: false, + shrines: false, + orbs: 0, + setpieces: { + }, + chargers: false, + notorches: false, + heart: false, + specialtiles: true, + shortcut: false, + enemies: false, + nojail: true, + nolore: true, + nokeys: true, + nostairs: true, + notraps: true, + noClutter: true, + noShrineTypes: ["Commerce", "Will"], + tickFlags: true, + noMusic: true, + persist: true, + prune: true, + }, + "PerkRoom": { + tickFlags: true, + name: "PerkRoom", + Title: "PerkRoom", + skin: "shrine", useDefaultMusic: true, + useGenParams: "tmp", + lightParams: "ore", + bossroom: false, + persist: true, + prune: true, + skiptunnel: true, // Increments the floor counter + alwaysAdvance: true, + + keepRebels: true, // NPCs cant run away to collection if they get beaten here + removePartyMembers: true, // Removes party members when you leave + + requireJourneyTarget: true, // Requires a journey target to exit + + events: [ + {trigger: "tick", type: "PerkRoom"}, + ], + + torchreplace: { + sprite: "Lantern", + unlitsprite: "LanternUnlit", + brightness: 6, + }, + + + updatescript: (_delta) => { + for (let en of KDMapData.Entities) { + if (en.hp < en.Enemy.maxhp && KDAllied(en)) { + en.hp = Math.min(en.Enemy.maxhp, en.hp + 0.5); + } + } + }, + + //constantX: true, + width: 9, + height: 8, + genType: "PerkRoom", + setpieces: { + "PearlChest": 100, + }, + spawns: false, + chests: false, + shrines: false, + orbs: 0, + chargers: false, + notorches: false, + heart: false, + specialtiles: true, + shortcut: false, + enemies: false, + nojail: true, + nolore: true, + nokeys: true, + nostairs: true, + notraps: true, + noClutter: true, + noShrineTypes: ["Commerce", "Will"], + noMusic: true, + keepMainPath: true, + }, + "Jail": { + name: "Jail", + persist: true, + bossroom: false, + width: 15, + height: 15, + enemyMult: 0.6, + + allowJailEntrances: true, + //alwaysRegen: false, // Always regenerate this room + setpieces: { + "GuaranteedCell": 100, + "ExtraCell": 20, + "Bedroom": 10, + "QuadCell": 7, + "Storage": 12, + }, + bonusTags: { + "construct": {bonus: 0, mult: 0}, + }, + loadscript: (_firsttime) => { + if (_firsttime) { + for (let en of KDMapData.Entities) { + if (!KDIsImprisoned(en)) { + KDAddLabel({ + assigned: en.id, + name: "Deploy", + type: "Deploy", + x: en.x, + y: en.y, + }); + } + } + } + return true; + }, + genCriteria: (iteration) => { + if (KinkyDungeonNearestJailPoint(10, 10, ["furniture"])) { + return KDCheckMainPath(); + } + return false; + }, + prisonType: "HighSec", + isPrison: true, + factionSpawnsRequired: true, + genType: "NarrowMaze", + spawns: false, + chests: false, + shrines: true, + orbs: 0, + chargers: true, + notorches: false, + heart: false, + specialtiles: true, + shortcut: false, + enemies: true, + nojail: false, + nokeys: true, + nostairs: false, + nostartstairs: true, + notraps: false, + noRelease: true, + releaseOnLowSec: true, + noShrineTypes: ["Commerce"], + }, + "DollRoom": { + name: "DollRoom", + Title: "DollRoom", + noWear: true, // Disables doodad wear + bossroom: false, + width: 15, + height: 10, + nopatrols: true, + alwaysRegen: true, // Always regenerate this room + setpieces: { + }, + data: { + dollroom: true, + }, + genType: "DollRoom", + spawns: false, + chests: false, + shrines: false, + orbs: 0, + chargers: false, + notorches: true, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + nokeys: true, + nostairs: true, + nostartstairs: true, + notraps: false, + noClutter: true, + nobrick: true, + nolore: true, + noboring: true, // Skip generating boringness + }, + "DollStorage": { + name: "DollStorage", + Title: "DollStorage", + noWear: true, // Disables doodad wear + bossroom: false, + width: 30, + height: 15, + nopatrols: true, + alwaysRegen: true, // Always regenerate this room + prisonType: "DollStorage", + isPrison: true, + setpieces: { + }, + data: { + dollstorage: true, + }, + skin: "vault", + musicParams: "DollStorage", + lightParams: "DollStorage", + useGenParams: "DollStorage", + genType: "DollStorage", + spawns: false, + chests: false, + shrines: false, + orbs: 0, + chargers: false, + notorches: true, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + nokeys: true, + nostairs: true, + nostartstairs: true, + notraps: false, + noClutter: true, + nobrick: true, + nolore: true, + noboring: true, // Skip generating boringness + }, + "Summit": { + private: true, // Enables private prison type features (e.g. prisoner display) + keepItems: true, // Prevents items from being swept + keepPrisoners: true, // Spawning prisoners in here does not remove from collection + keepRebels: true, // NPCs cant run away to collection if they get beaten here + name: "Summit", + Title: "Summit", + noWear: true, // Disables doodad wear + bossroom: false, + width: 12, + height: 12, + nopatrols: true, + alwaysRegen: false, // Always regenerate this room + persist: true, + prisonType: "Summit", + setpieces: { + }, + data: { + summit: true, + }, + + + elevatorCondition: (_x, _y) => { + return true; // Always unlocked once you are in + }, + + loadscript: (_firstTime) => { + // Summit loadscript triggers escape for up to 10 NPCs + + KDTriggerNPCEscape(10); + + return true; // Returns whether or not to repopulate this map + }, + drawscript: (_delta, CamX: number, CamY: number, CamX_offsetVis: number, CamY_offsetVis: number) => { + if (KDToggles.Backgrounds) { + let totalScale = 1.5; + let imgwidth = PIXIWidth * totalScale; + let imgheight = imgwidth * 0.5; + + let xx = PIXIWidth/2 + -imgwidth/2 + + imgwidth * (0.5 - (KDPlayer().visual_x / KDMapData.GridWidth)) * (totalScale - 1) / totalScale; + let yy = PIXIHeight/2 + -imgheight/2 + + imgheight * (0.5 - (KDPlayer().visual_y / KDMapData.GridHeight)) * (totalScale - 1) / totalScale; + KDDraw( kdcanvas, kdpixisprites, "summitBG", + "Backgrounds/Mountain.png", + xx, yy, imgwidth, imgheight, + undefined, { + zIndex: -100, + } + + ); + kdBGMask.visible = true; + setTimeout(() => { + kdBGMask.visible = KDGameData.RoomType == "Summit" && KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game"; + }, 20); + + kdBGMask.clear(); + + + // No inverse masks in PIXI.js. I crie + kdBGMask.beginFill(0x000000, 1.0); + + kdBGMask.drawRect( + (-1 - (CamX + CamX_offsetVis)) * KinkyDungeonGridSizeDisplay, + (0 - (CamY + CamY_offsetVis)) * KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay * (1 + KDMapData.GridWidth), + KinkyDungeonGridSizeDisplay * (1 + KDMapData.GridHeight), + ); + + kdBGMask.endFill(); + } + + + }, + norestock: true, + skin: "vault", + musicParams: "Summit", + lightParams: "Summit", + useGenParams: "Summit", + genType: "Summit", + spawns: false, + chests: false, + shrines: false, + orbs: 0, + chargers: false, + notorches: true, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + notraps: true, + nokeys: true, + nostairs: true, + nostartstairs: true, + noClutter: true, + nobrick: true, + nolore: true, + noboring: true, // Skip generating boringness + }, + "DemonTransition": { + name: "DemonTransition", + Title: "DemonTransition", + noWear: false, // Disables doodad wear + bossroom: false, + alwaysRegen: true, + width: 15, + height: 15, + nopatrols: false, + onExit: (data: any) => { + // replaced by altType.noAdvance and altType.alwaysAdvance + }, + afterExit: (_data) => { + // Dump the player in a random place on top of a demon portal + let point = KinkyDungeonGetRandomEnemyPoint(false, false); + if (point) { + /** Create the portal */ + KDCreateEffectTile(point.x, point.y, { + name: "Portals/DarkPortal", + duration: 5, + }, 0); + + KinkyDungeonPlayerEntity.x = point.x; + KinkyDungeonPlayerEntity.y = point.y; + KinkyDungeonPlayerEntity.visual_x = point.x; + KinkyDungeonPlayerEntity.visual_y = point.y; + } + }, + setpieces: { + }, + data: { + DemonTransition: true, + }, + genType: "DemonTransition", + skin: "DemonTransition", + musicParams: "DemonTransition", + lightParams: "DemonTransition", + useGenParams: "DemonTransition", + spawns: false, + chests: true, + shrines: true, + orbs: 0, + chargers: true, + notorches: false, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + nokeys: true, + nostairs: true, + nostartstairs: true, + placeDoors: true, + notraps: false, + noClutter: true, + nobrick: false, + nolore: true, + noboring: false, // Skip generating boringness + }, + "BanditFort": { + name: "BanditFort", + Title: "BanditFort", + noWear: false, // Disables doodad wear + bossroom: false, + width: 15, + height: 15, + sizeBonus: true, + nopatrols: false, + setpieces: { + "Cache": 10000, + "Bedroom": 1, + "Storage": 12, + }, + data: { + BanditFort: true, + }, + placeJailEntrances: true, + genType: "Maze", + skin: "shoppe", + musicParams: "bandit", + lightParams: "bandit", + useGenParams: "bandit", + spawns: true, + chests: true, + shrines: false, + persist: true, + orbs: 0, + chargers: true, + notorches: false, + heart: false, + specialtiles: false, + shortcut: false, + enemies: true, + nojail: true, + nokeys: true, + nostairs: true, + factionSpawnsRequired: true, // make sure only bandits spawn + //nostartstairs: true, + placeDoors: true, + notraps: false, + noClutter: false, + nobrick: false, + nolore: true, + noboring: false, + }, + "Caldera": { + name: "Caldera", + Title: "Caldera", + noWear: false, // Disables doodad wear + bossroom: false, + width: 21, + height: 21, + nopatrols: false, + setpieces: { + GuaranteedCell: 100, + }, + data: { + Caldera: true, + }, + + loreCheckpoint: "cst", + genType: "Caldera", + skin: "cst", + musicParams: "cst", + lightParams: "cst", + useGenParams: "cst", + brightness: 40, + spawns: true, + chests: true, + shrines: true, + persist: true, + orbs: 0, + chargers: true, + notorches: false, + heart: false, + specialtiles: false, + shortcut: false, + enemies: true, + nojail: false, + nokeys: true, + nostairs: true, + //nostartstairs: true, + placeDoors: true, + notraps: false, + noClutter: false, + nobrick: false, + nolore: true, + noboring: false, + }, + "ElevatorRoom": { + name: "ElevatorRoom", + Title: "ElevatorRoom", + noWear: false, // Disables doodad wear + bossroom: false, + width: 14, + height: 16, + nopatrols: false, + setpieces: { + }, + data: { + ElevatorRoom: true, + }, + genType: "ElevatorRoom", + skin: "bel", + musicParams: "bel", + lightParams: "bel", + useGenParams: "bel", + spawns: false, + chests: false, + shrines: false, + persist: true, + orbs: 0, + chargers: false, + notorches: false, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + nokeys: true, + nostairs: true, + placeDoors: false, + notraps: true, + noClutter: false, + nobrick: false, + nolore: true, + noboring: false, + noSetpiece: true, + }, + "ElevatorEgyptian": { + name: "ElevatorEgyptian", + Title: "ElevatorEgyptian", + noWear: false, // Disables doodad wear + bossroom: false, + width: 14, + height: 16, + nopatrols: false, + setpieces: { + }, + data: { + ElevatorRoom: true, + noHostileDoodad: true, + }, + elevatorCondition: (_x, _y) => { + return !KDMapData.Entities.some((enemy) => { + return !enemy.maxlifetime && (KDHostile(enemy) || KinkyDungeonAggressive(enemy) || enemy.Enemy?.name == "MummyElevator") && (!KDHelpless(enemy) || enemy.Enemy?.name == "MummyElevator"); + }); + }, + + + updatescript: (_delta) => { + KinkyDungeonResetFog(); + }, + + genType: "ElevatorEgyptian", + skin: "tmb", + musicParams: "tmb", + lightParams: "tmb", + useGenParams: "tmb", + spawns: false, + chests: false, + shrines: false, + persist: true, + orbs: 0, + chargers: false, + notorches: false, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + nokeys: true, + nostairs: true, + placeDoors: false, + notraps: true, + noClutter: true, + nobrick: false, + nolore: true, + noboring: false, + noSetpiece: true, + }, + "ElevatorEgyptian2": { + name: "ElevatorEgyptian2", + Title: "ElevatorEgyptian", + noWear: false, // Disables doodad wear + bossroom: false, + width: 14, + height: 16, + nopatrols: false, + setpieces: { + }, + data: { + ElevatorRoom: true, + noHostileDoodad: true, + }, + elevatorCondition: (_x, _y) => { + return !KDMapData.Entities.some((enemy) => { + return !enemy.maxlifetime && (KDHostile(enemy) || KinkyDungeonAggressive(enemy) || enemy.Enemy?.name == "MummyElevator") && (!KDHelpless(enemy) || enemy.Enemy?.name == "MummyElevator"); + }); + }, + + updatescript: (_delta) => { + if (KDRandom() < 0.2) { + for (let X = 1; X < KDMapData.GridWidth - 1; X++) { + for (let Y = 1; Y < KDMapData.GridHeight - 1; Y++) { + if (KinkyDungeonMapGet(X, Y) == 'X' + && (KDRandom() < 0.8 + && KinkyDungeonVisionGet(X, Y) < 0.01 + && Y > KDPlayer().y + 1 // spooky!!!! + )) { + + + // Move to another spot + let xMod = KDRandom() < 0.5 ? -1 : 1; + if (KinkyDungeonMapGet(X + xMod, Y) == '0') { + KinkyDungeonMapSet(X, Y, '0'); + KinkyDungeonMapSet(X + xMod, Y, 'X'); + } + //KinkyDungeonMapSet(X, Y, '3'); + //DialogueCreateEnemy(X, Y, "MummyCursed"); + } + } + } + } + KinkyDungeonResetFog(); + }, + + genType: "ElevatorEgyptian2", + skin: "tmb", + musicParams: "tmb", + lightParams: "tmb", + useGenParams: "tmb", + spawns: false, + chests: false, + shrines: false, + persist: true, + orbs: 0, + chargers: false, + notorches: false, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + nokeys: true, + nostairs: true, + placeDoors: false, + notraps: true, + noClutter: true, + nobrick: false, + nolore: true, + noboring: false, + noSetpiece: true, + }, + "GoldVault": { + name: "GoldVault", + Title: "GoldVault", + noWear: false, // Disables doodad wear + bossroom: false, + width: 14, + height: 16, + nopatrols: false, + setpieces: { + }, + data: { + GoldVault: true, + }, + genType: "GoldVault", + skin: "vault", + musicParams: "vault", + lightParams: "vault", + useGenParams: "vault", + spawns: false, + chests: false, + shrines: false, + persist: true, + orbs: 0, + chargers: false, + notorches: false, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + nokeys: true, + nostairs: true, + placeDoors: false, + notraps: false, + noClutter: true, + nobrick: false, + nolore: true, + noboring: false, + noSetpiece: true, + restricted: true, // You cant be here, even if submissive + noPersistentPrisoners: true, + }, + "TestTile": { + name: "TestTile", + noWear: true, // Disables doodad wear + bossroom: false, + width: 40, + height: 40, + alwaysRegen: true, // Always regenerate this room + //nopatrols: true, + setpieces: { + }, + genType: "TestTile", + spawns: false, + chests: false, + shrines: false, + orbs: 0, + chargers: false, + notorches: true, + heart: false, + specialtiles: false, + shortcut: false, + enemies: true, + nojail: true, + nokeys: true, + nostairs: true, + nostartstairs: true, + notraps: false, + noClutter: true, + nobrick: true, + nolore: true, + noboring: true, // Skip generating boringness + }, + "JourneyFloor": { + name: "JourneyFloor", + Title: "JourneyFloor", + bossroom: false, + prune: true, + width: 12, + height: 8, + brightness: 5, + nostartstairs: true, + skin: "shrine", useDefaultMusic: true, + lightParams: "ore", + removePartyMembers: true, // Removes party members when you leave + + keepRebels: true, // NPCs cant run away to collection if they get beaten here + + torchreplace: { + sprite: "Lantern", + unlitsprite: "LanternUnlit", + brightness: 6, + }, + + setpieces: { + }, + genType: "JourneyFloor", + spawns: false, + chests: false, + shrines: false, + orbs: 0, + chargers: false, + notorches: false, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + nokeys: true, + nolore: true, + nostairs: true, + notraps: true, + noClutter: true, + }, + "ShopStart": { + name: "ShopStart", + Title: "ShopStart", + skiptunnel: true, // Skip the ending tunnel + bossroom: false, + persist: true, + width: 10, + height: 8, + + skin: "shoppe", useDefaultMusic: true, + lightParams: "grv", + + noPersistentPrisoners: true, + + keepPrisoners: true, // Spawning prisoners in here does not remove from collection + keepRebels: true, // NPCs cant run away to collection if they get beaten here + + torchreplace: { + sprite: "Lantern", + unlitsprite: "LanternUnlit", + brightness: 6, + }, + + noSetpiece: true, + setpieces: { + }, + alwaysRegen: true, + genType: "ShopStart", + spawns: false, + chests: false, + shrines: false, + orbs: 0, + chargers: false, + notorches: false, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + nokeys: true, + nolore: true, + nostairs: true, + notraps: true, + noClutter: true, + noWear: true, + }, + "Tutorial": { + name: "Tutorial", + bossroom: false, + width: 30, + height: 7, + setpieces: { + }, + brightness: 5, + genType: "Tutorial", + spawns: false, + chests: false, + shrines: false, + orbs: 0, + chargers: false, + notorches: false, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + nokeys: true, + nolore: true, + nostairs: true, + notraps: true, + noClutter: true, + }, +}; + +let KDJourneyList = ["Random", "Harder", "Temple", "Explorer", "Doll"]; +let KDJourneyListSkin = { + Random: 'DemonTransition', + Harder: 'tmb', + Temple: 'tmp', + Explorer: 'jng', + Doll: 'bel', +}; +if (param_test) KDJourneyList.push("Test"); + +function KinkyDungeonAltFloor(Type: string): AltType { + if (KDPersonalAlt[Type]) + return alts[KDPersonalAlt[Type].RoomType]; + return alts[Type]; +} + + +let KinkyDungeonCreateMapGenType: Record void> = { + "Room": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "JourneyFloor": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateJourneyFloor(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "ShopStart": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + let slot = KDGetWorldMapLocation(KDCoordToPoint(KDGetCurrentLocation())); + if (slot?.jx) slot.jx = 0; // Fix for old savegames!!!!! + KinkyDungeonCreateShopStart(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "ElevatorRoom": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateElevatorRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "ElevatorEgyptian": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateElevatorEgyptian(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "ElevatorEgyptian2": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateElevatorEgyptian2(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "GoldVault": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateGoldVault(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "TestTile": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateTestTile(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "Tutorial": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateTutorial(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "Tunnel": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateTunnel(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "PerkRoom": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreatePerkRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "Chamber": (POI, VisitedRooms, width, height, _openness, _density, _hallopenness, data) => { + KinkyDungeonCreateMaze(POI, VisitedRooms, width, height, 2, 1.5, 8, data); + }, + "Maze": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateMaze(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "Caldera": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateCaldera(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "TileMaze": (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KinkyDungeonCreateTileMaze(POI, VisitedRooms, width, height, openness, density, hallopenness, data); + }, + "NarrowMaze": (POI, VisitedRooms, width, height, _openness, _density, _hallopenness, data) => { + KinkyDungeonCreateMaze(POI, VisitedRooms, width, height, 0, 10, 0, data); + }, + "DollRoom": (POI, VisitedRooms, width, height, _openness, _density, _hallopenness, data) => { + KinkyDungeonCreateDollRoom(POI, VisitedRooms, width, height, 0, 10, 0, data); + }, + "DollStorage": (POI, VisitedRooms, width, height, _openness, _density, _hallopenness, data) => { + KinkyDungeonCreateDollStorage(POI, VisitedRooms, width, height, 0, 10, 0, data); + }, + "Summit": (POI, VisitedRooms, width, height, _openness, _density, _hallopenness, data) => { + KinkyDungeonCreateSummit(POI, VisitedRooms, width, height, 0, 10, 0, data); + }, + "DemonTransition": (POI, VisitedRooms, width, height, _openness, _density, _hallopenness, data) => { + KinkyDungeonCreateDemonTransition(POI, VisitedRooms, width, height, 0, 10, 0, data); + }, + "Dollmaker": (POI, VisitedRooms, width, height, _openness, _density, _hallopenness, data) => { + KinkyDungeonCreateDollmaker(POI, VisitedRooms, width, height, 0, 10, 0, data); + }, + "Warden": (POI, VisitedRooms, width, height, _openness, _density, _hallopenness, data) => { + KinkyDungeonCreateWarden(POI, VisitedRooms, width, height, 0, 10, 0, data); + }, +}; + + +function KinkyDungeonCreateMaze(POI: any[], VisitedRooms: any[], width: number, height: number, openness: number, density: number, hallopenness: number, data: any): void { + // Variable setup + + let Walls: GridEntry = {}; + let WallsList: GridEntry = {}; + let VisitedCells: GridEntry = {}; + + // Initialize the first cell in our Visited Cells list + if (KDDebug) console.log("Created maze with dimensions " + width + "x" + height + ", openness: "+ openness + ", density: "+ density); + + VisitedCells[VisitedRooms[0].x + "," + VisitedRooms[0].y] = {x:VisitedRooms[0].x, y:VisitedRooms[0].y}; + + // Walls are basically even/odd pairs. + for (let X = 2; X < width; X += 2) + for (let Y = 1; Y < height; Y += 2) + if (KinkyDungeonMapGet(X, Y) == '1') { + Walls[X + "," + Y] = {x:X, y:Y}; + } + for (let X = 1; X < width; X += 2) + for (let Y = 2; Y < height; Y += 2) + if (KinkyDungeonMapGet(X, Y) == '1') { + Walls[X + "," + Y] = {x:X, y:Y}; + } + + // Setup the wallslist for the first room + KinkyDungeonMazeWalls(VisitedRooms[0], Walls, WallsList); + + // Per a randomized primm algorithm from Wikipedia, we loop through the list of walls until there are no more walls + + let WallKeys = Object.keys(WallsList); + //let CellKeys = Object.keys(VisitedCells); + + while (WallKeys.length > 0) { + let I = Math.floor(KDRandom() * WallKeys.length); + let wall = Walls[WallKeys[I]]; + let unvisitedCell = null; + + // Check if wall is horizontal or vertical and determine if there is a single unvisited cell on the other side of the wall + if (wall.x % 2 == 0) { //horizontal wall + if (!VisitedCells[(wall.x-1) + "," + wall.y]) unvisitedCell = {x:wall.x-1, y:wall.y}; + if (!VisitedCells[(wall.x+1) + "," + wall.y]) { + if (unvisitedCell) unvisitedCell = null; + else unvisitedCell = {x:wall.x+1, y:wall.y}; + } + } else { //vertical wall + if (!VisitedCells[wall.x + "," + (wall.y-1)]) unvisitedCell = {x:wall.x, y:wall.y-1}; + if (!VisitedCells[wall.x + "," + (wall.y+1)]) { + if (unvisitedCell) unvisitedCell = null; + else unvisitedCell = {x:wall.x, y:wall.y+1}; + } + } + + // We only add a new cell if only one of the cells is unvisited + if (unvisitedCell) { + delete Walls[wall.x + "," + wall.y]; + + KinkyDungeonMapSet(wall.x, wall.y, '0'); + KinkyDungeonMapSet(unvisitedCell.x, unvisitedCell.y, '0'); + VisitedCells[unvisitedCell.x + "," + unvisitedCell.y] = unvisitedCell; + + KinkyDungeonMazeWalls(unvisitedCell, Walls, WallsList); + } + + // Either way we remove this wall from consideration + delete WallsList[wall.x + "," + wall.y]; + // Update keys + + WallKeys = Object.keys(WallsList); + //CellKeys = Object.keys(VisitedCells); + } + + for (let X = 1; X < KDMapData.GridWidth; X += 1) + for (let Y = 1; Y < KDMapData.GridWidth; Y += 1) { + if ((X % 2 == 0 && Y % 2 == 1) || (X % 2 == 1 && Y % 2 == 0)) { + let size = 1+Math.ceil(KDRandom() * (openness)); + if (KDRandom() < 0.4 - 0.02*density * size * size) { + + let tile = '0'; + + // We open up the tiles + for (let XX = X; XX < X +size; XX++) + for (let YY = Y; YY < Y+size; YY++) { + if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) + KinkyDungeonMapSet(XX, YY, tile); + VisitedCells[XX + "," + YY] = {x:XX, y:YY}; + KinkyDungeonMazeWalls({x:XX, y:YY}, Walls, WallsList); + delete Walls[XX + "," + YY]; + } + } + } + } + + // We add POI's at dead ends + for (let X = 1; X < KDMapData.GridWidth; X += 1) + for (let Y = 1; Y < KDMapData.GridWidth; Y += 1) { + let nearwalls = 0; + for (let XX = X - 1; XX <= X + 1; XX += 1) + for (let YY = Y - 1; YY <= Y + 1; YY += 1) { + if (KinkyDungeonMapGet(XX, YY) == '1') { + nearwalls += 1; + } + } + if (nearwalls == 7) { + POI.push({x: X*2, y: Y*2, requireTags: ["endpoint"], favor: [], used: false}); + } + } + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + // Constrict hallways randomly in X + for (let Y = 2; Y < KDMapData.GridHeight - 1; Y += 1) { + if (KDRandom() < 0.4 - 0.04*hallopenness) { + let row_top = []; + let row_mid = []; + let row_bot = []; + for (let X = 0; X < KDMapData.GridWidth; X++) { + row_top.push(KinkyDungeonMapGet(X, Y-1)); + row_mid.push(KinkyDungeonMapGet(X, Y)); + row_bot.push(KinkyDungeonMapGet(X, Y+1)); + } + for (let X = 1; X < KDMapData.GridWidth-1; X++) { + if (row_mid[X] == '0') { + if (row_mid[X-1] == '0' || row_mid[X+1] == '0') { + if (row_top[X] == '0' && row_bot[X] == '0' && (row_top[X-1] == '1' || row_bot[X+1] == '1')) { + // Avoid creating diagonals + if (((row_top[X+1] == '0' && row_bot[X+1] == '0') || row_mid[X+1] == '1') + && ((row_top[X-1] == '0' && row_bot[X-1] == '0') || row_mid[X-1] == '1')) { + KinkyDungeonMapSet(X, Y, 'X'); + X++; + } + } + } + } + } + } + } + + // Constrict hallways randomly in Y + for (let X = 2; X < KDMapData.GridWidth - 1; X += 1) { + if (KDRandom() < 0.4 - 0.04*hallopenness) { + let col_top = []; + let col_mid = []; + let col_bot = []; + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + col_top.push(KinkyDungeonMapGet(X-1, Y)); + col_mid.push(KinkyDungeonMapGet(X, Y)); + col_bot.push(KinkyDungeonMapGet(X+1, Y)); + } + for (let Y = 1; Y < KDMapData.GridHeight-1; Y++) { + if (col_mid[Y] == '0') { + if (col_mid[Y-1] == '0' || col_mid[Y+1] == '0') { + if (col_top[Y] == '0' && col_bot[Y] == '0' && (col_top[Y-1] == '1' || col_bot[Y+1] == '1')) { + if (((col_top[Y+1] == '0' && col_bot[Y+1] == '0') || col_mid[Y+1] == '1') + && ((col_top[Y-1] == '0' && col_bot[Y-1] == '0') || col_mid[Y-1] == '1')) { + KinkyDungeonMapSet(X, Y, '1'); + Y++; + } + } + } + } + } + } + } + + for (let X = 2; X < KDMapData.GridWidth; X += 2) + for (let Y = 2; Y < KDMapData.GridWidth; Y += 2) { + let size = 2*Math.ceil(KDRandom() * (openness)); + if (KDRandom() < 0.4 - 0.04*density * size) { + + let tile = '0'; + if (data.params.floodChance > 0 && KDRandom() < data.params.floodChance) tile = 'w'; + + // We open up the tiles + for (let XX = X; XX < X +size; XX++) + for (let YY = Y; YY < Y+size; YY++) { + if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) + KinkyDungeonMapSet(XX, YY, tile); + } + } + } +} + +function KinkyDungeonCreateCaldera(POI: any[], VisitedRooms: any, width: number, height: number, openness: number, density: number, _hallopenness: number, data: any) { + // Variable setup + + let Walls: GridEntry = {}; + let WallsList: GridEntry = {}; + let VisitedCells: GridEntry = {}; + + // Initialize the first cell in our Visited Cells list + if (KDDebug) console.log("Created maze with dimensions " + width + "x" + height + ", openness: "+ openness + ", density: "+ density); + + VisitedCells[VisitedRooms[0].x + "," + VisitedRooms[0].y] = {x:VisitedRooms[0].x, y:VisitedRooms[0].y}; + + // Walls are basically even/odd pairs. + for (let X = 2; X < width; X += 2) + for (let Y = 1; Y < height; Y += 2) + if (KinkyDungeonMapGet(X, Y) == '1') { + Walls[X + "," + Y] = {x:X, y:Y}; + } + for (let X = 1; X < width; X += 2) + for (let Y = 2; Y < height; Y += 2) + if (KinkyDungeonMapGet(X, Y) == '1') { + Walls[X + "," + Y] = {x:X, y:Y}; + } + + // Setup the wallslist for the first room + KinkyDungeonMazeWalls(VisitedRooms[0], Walls, WallsList); + + // Per a randomized primm algorithm from Wikipedia, we loop through the list of walls until there are no more walls + + let WallKeys = Object.keys(WallsList); + //let CellKeys = Object.keys(VisitedCells); + + while (WallKeys.length > 0) { + let I = Math.floor(KDRandom() * WallKeys.length); + let wall = Walls[WallKeys[I]]; + let unvisitedCell = null; + + // Check if wall is horizontal or vertical and determine if there is a single unvisited cell on the other side of the wall + if (wall.x % 2 == 0) { //horizontal wall + if (!VisitedCells[(wall.x-1) + "," + wall.y]) unvisitedCell = {x:wall.x-1, y:wall.y}; + if (!VisitedCells[(wall.x+1) + "," + wall.y]) { + if (unvisitedCell) unvisitedCell = null; + else unvisitedCell = {x:wall.x+1, y:wall.y}; + } + } else { //vertical wall + if (!VisitedCells[wall.x + "," + (wall.y-1)]) unvisitedCell = {x:wall.x, y:wall.y-1}; + if (!VisitedCells[wall.x + "," + (wall.y+1)]) { + if (unvisitedCell) unvisitedCell = null; + else unvisitedCell = {x:wall.x, y:wall.y+1}; + } + } + + // We only add a new cell if only one of the cells is unvisited + if (unvisitedCell) { + delete Walls[wall.x + "," + wall.y]; + + KinkyDungeonMapSet(wall.x, wall.y, '0'); + KinkyDungeonMapSet(unvisitedCell.x, unvisitedCell.y, '0'); + VisitedCells[unvisitedCell.x + "," + unvisitedCell.y] = unvisitedCell; + + KinkyDungeonMazeWalls(unvisitedCell, Walls, WallsList); + } + + // Either way we remove this wall from consideration + delete WallsList[wall.x + "," + wall.y]; + // Update keys + + WallKeys = Object.keys(WallsList); + //CellKeys = Object.keys(VisitedCells); + } + + for (let X = 1; X < KDMapData.GridWidth; X += 1) + for (let Y = 1; Y < KDMapData.GridWidth; Y += 1) { + if ((X % 2 == 0 && Y % 2 == 1) || (X % 2 == 1 && Y % 2 == 0)) { + let size = 1+Math.ceil(KDRandom() * (openness)); + if (KDRandom() < 0.4 - 0.02*density * size * size) { + + let tile = '0'; + + // We open up the tiles + for (let XX = X; XX < X +size; XX++) + for (let YY = Y; YY < Y+size; YY++) { + if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) + KinkyDungeonMapSet(XX, YY, tile); + VisitedCells[XX + "," + YY] = {x:XX, y:YY}; + KinkyDungeonMazeWalls({x:XX, y:YY}, Walls, WallsList); + delete Walls[XX + "," + YY]; + } + } + } + } + + // We add POI's at dead ends + for (let X = 1; X < KDMapData.GridWidth; X += 1) + for (let Y = 1; Y < KDMapData.GridWidth; Y += 1) { + let nearwalls = 0; + for (let XX = X - 1; XX <= X + 1; XX += 1) + for (let YY = Y - 1; YY <= Y + 1; YY += 1) { + if (KinkyDungeonMapGet(XX, YY) == '1') { + nearwalls += 1; + } + } + if (nearwalls == 7) { + POI.push({x: X*2, y: Y*2, requireTags: ["endpoint"], favor: [], used: false}); + } + } + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + // Constrict hallways randomly in X + for (let Y = 2; Y < KDMapData.GridHeight - 1; Y += 1) { + if (KDRandom() < 0.2) { + let row_top = []; + let row_mid = []; + let row_bot = []; + for (let X = 0; X < KDMapData.GridWidth; X++) { + row_top.push(KinkyDungeonMapGet(X, Y-1)); + row_mid.push(KinkyDungeonMapGet(X, Y)); + row_bot.push(KinkyDungeonMapGet(X, Y+1)); + } + for (let X = 1; X < KDMapData.GridWidth-1; X++) { + if (row_mid[X] == '0') { + if (row_mid[X-1] == '0' || row_mid[X+1] == '0') { + if (row_top[X] == '0' && row_bot[X] == '0' && (row_top[X-1] == '1' || row_bot[X+1] == '1')) { + // Avoid creating diagonals + if (((row_top[X+1] == '0' && row_bot[X+1] == '0') || row_mid[X+1] == '1') + && ((row_top[X-1] == '0' && row_bot[X-1] == '0') || row_mid[X-1] == '1')) { + KinkyDungeonMapSet(X, Y, 'X'); + X++; + } + } + } + } + } + } + } + + // Constrict hallways randomly in Y + for (let X = 2; X < KDMapData.GridWidth - 1; X += 1) { + if (KDRandom() < 0.2) { + let col_top = []; + let col_mid = []; + let col_bot = []; + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + col_top.push(KinkyDungeonMapGet(X-1, Y)); + col_mid.push(KinkyDungeonMapGet(X, Y)); + col_bot.push(KinkyDungeonMapGet(X+1, Y)); + } + for (let Y = 1; Y < KDMapData.GridHeight-1; Y++) { + if (col_mid[Y] == '0') { + if (col_mid[Y-1] == '0' || col_mid[Y+1] == '0') { + if (col_top[Y] == '0' && col_bot[Y] == '0' && (col_top[Y-1] == '1' || col_bot[Y+1] == '1')) { + if (((col_top[Y+1] == '0' && col_bot[Y+1] == '0') || col_mid[Y+1] == '1') + && ((col_top[Y-1] == '0' && col_bot[Y-1] == '0') || col_mid[Y-1] == '1')) { + KinkyDungeonMapSet(X, Y, 'X'); + Y++; + } + } + } + } + } + } + } + + for (let X = 2; X < KDMapData.GridWidth; X += 2) + for (let Y = 2; Y < KDMapData.GridWidth; Y += 2) { + let size = 2*Math.ceil(KDRandom() * (openness)); + if (KDRandom() < 0.4 - 0.04*density * size) { + + let tile = '0'; + if (data.params.floodChance > 0 && KDRandom() < data.params.floodChance) tile = 'w'; + + // We open up the tiles + for (let XX = X; XX < X +size; XX++) + for (let YY = Y; YY < Y+size; YY++) { + if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) + KinkyDungeonMapSet(XX, YY, tile); + } + } + } + + + // Water Lake in middle + for (let X = 2; X < KDMapData.GridWidth; X += 1) + for (let Y = 2; Y < KDMapData.GridWidth; Y += 1) { + if (!"14".includes(KinkyDungeonMapGet(X, Y))) { + let dd = KDistEuclidean(X - KDMapData.GridWidth/2, Y - KDMapData.GridHeight/2); + if (dd < 4) { + KinkyDungeonMapSet(X, Y, '0'); + } else if (dd < KDMapData.GridWidth/3) { + KinkyDungeonMapSet(X, Y, (dd < KDMapData.GridWidth/4) ? 'W' : 'w'); + } + } + } + + POI.push({x: KDMapData.GridWidth/2, y: KDMapData.GridHeight/2, requireTags: [], favor: ["GuaranteedCell"], used: false}); + //KinkyDungeonCreateRectangle(KDMapData.GridWidth/2 - 4, KDMapData.GridHeight/2 - 4, 9, 9, false, false, false, false); + +} + + +let usePrimmMaze = false; + +/** + * @param POI + * @param VisitedRooms + * @param width + * @param height + * @param openness + * @param density + * @param hallopenness + * @param data + */ +function KinkyDungeonCreateTileMaze(_POI: any[], VisitedRooms: any[], width: number, height: number, openness: number, density: number, _hallopenness: number, data: any) { + // Variable setup + + // + + VisitedRooms = []; + + let Walls: GridEntry = {}; + let WallsList: GridEntry = {}; + let VisitedCells: GridEntry = {}; + + // Initialize the first cell in our Visited Cells list + //if (KDDebug) + console.log("Created maze with dimensions " + width + "x" + height + ", openness: "+ openness + ", density: "+ density); + + let genPrimmMaze = () => { + + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + '1';//KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + + let genParams = KDGetMazeParams(data.params); + + let maze = KDGenMaze(1, 1, {w: width/KDTE_Scale, h: height/KDTE_Scale}, { + scale: 1, + endchance: genParams.chance_STOP, + newest: genParams.newest, + oldest: genParams.oldest, + branchchance: 0.02 * openness * genParams.opennessMult, + }, undefined); + + + for (let t of maze) { + if (KinkyDungeonMapGet(t.x, t.y) == '1') + KinkyDungeonMapSet(t.x, t.y, '0'); + } + }; + + if (!usePrimmMaze) { + genPrimmMaze(); + } else { + KinkyDungeonMapSet(1, 1, '0', VisitedRooms); + VisitedCells[VisitedRooms[0].x + "," + VisitedRooms[0].y] = {x:VisitedRooms[0].x, y:VisitedRooms[0].y}; + + // Walls are basically even/odd pairs. + for (let X = 2; X < width; X += 2) + for (let Y = 1; Y < height; Y += 2) + if (KinkyDungeonMapGet(X, Y) == '1') { + Walls[X + "," + Y] = {x:X, y:Y}; + } + for (let X = 1; X < width; X += 2) + for (let Y = 2; Y < height; Y += 2) + if (KinkyDungeonMapGet(X, Y) == '1') { + Walls[X + "," + Y] = {x:X, y:Y}; + } + + // Setup the wallslist for the first room + KinkyDungeonMazeWalls(VisitedRooms[0], Walls, WallsList); + + // Per a randomized primm algorithm from Wikipedia, we loop through the list of walls until there are no more walls + + let WallKeys = Object.keys(WallsList); + //let CellKeys = Object.keys(VisitedCells); + + while (WallKeys.length > 0) { + let I = Math.floor(KDRandom() * WallKeys.length); + let wall = Walls[WallKeys[I]]; + let unvisitedCell = null; + + // Check if wall is horizontal or vertical and determine if there is a single unvisited cell on the other side of the wall + if (wall.x % 2 == 0) { //horizontal wall + if (!VisitedCells[(wall.x-1) + "," + wall.y]) unvisitedCell = {x:wall.x-1, y:wall.y}; + if (!VisitedCells[(wall.x+1) + "," + wall.y]) { + if (unvisitedCell) unvisitedCell = null; + else unvisitedCell = {x:wall.x+1, y:wall.y}; + } + } else { //vertical wall + if (!VisitedCells[wall.x + "," + (wall.y-1)]) unvisitedCell = {x:wall.x, y:wall.y-1}; + if (!VisitedCells[wall.x + "," + (wall.y+1)]) { + if (unvisitedCell) unvisitedCell = null; + else unvisitedCell = {x:wall.x, y:wall.y+1}; + } + } + + // We only add a new cell if only one of the cells is unvisited + if (unvisitedCell) { + delete Walls[wall.x + "," + wall.y]; + + KinkyDungeonMapSet(wall.x, wall.y, '0'); + KinkyDungeonMapSet(unvisitedCell.x, unvisitedCell.y, '0'); + VisitedCells[unvisitedCell.x + "," + unvisitedCell.y] = unvisitedCell; + + KinkyDungeonMazeWalls(unvisitedCell, Walls, WallsList); + } + + // Either way we remove this wall from consideration + delete WallsList[wall.x + "," + wall.y]; + // Update keys + + WallKeys = Object.keys(WallsList); + //CellKeys = Object.keys(VisitedCells); + } + + // The maze is complete. Now we open up some tiles + + for (let X = 1; X < KDMapData.GridWidth; X += 1) + for (let Y = 1; Y < KDMapData.GridWidth; Y += 1) { + if ((X % 2 == 0 && Y % 2 == 1) || (X % 2 == 1 && Y % 2 == 0)) { + let size = 1;//+Math.ceil(KDRandom() * (openness)); + if (KDRandom() < 0.4 - 0.02*density * size * size) { + + let tile = '0'; + + // We open up the tiles + for (let XX = X; XX < X +size; XX++) + for (let YY = Y; YY < Y+size; YY++) { + if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) + KinkyDungeonMapSet(XX, YY, tile); + VisitedCells[XX + "," + YY] = {x:XX, y:YY}; + KinkyDungeonMazeWalls({x:XX, y:YY}, Walls, WallsList); + delete Walls[XX + "," + YY]; + } + } + if (KDRandom() < 0.02 * openness) { + + let tile = '0'; + + // We open up the tiles + for (let XX = X-1; XX <= X + 1; XX++) + for (let YY = Y; YY <= Y + 1; YY++) + if (XX == 0 || YY == 0) { + if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) + KinkyDungeonMapSet(XX, YY, tile); + VisitedCells[XX + "," + YY] = {x:XX, y:YY}; + KinkyDungeonMazeWalls({x:XX, y:YY}, Walls, WallsList); + delete Walls[XX + "," + YY]; + } + } + } + } + } + + + + + // Now we create a new map based on the maze + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + + // Determine widths empirically. Only science is allowed here. + let index_w = 0; + let index_h = 0; + for (let x = 1; x*2 < KDMapData.GridWidth; x += 1) { + index_w += 1; + index_h = 0; + for (let y = 1; y*2 < KDMapData.GridHeight; y += 1) { + index_h += 1; + } + } + + // Set points for start and end points on the map... + let starty = 1 + Math.floor(KDRandom() * (index_h - 2)); + let endy = 1 + Math.floor(KDRandom() * (index_h - 2)); + let topx = 1 + Math.floor(KDRandom() * (index_w - 2)); + let botx = 1 + Math.floor(KDRandom() * (index_w - 2)); + + let startx = 0; + let topy = 0; + let endx = index_w - 1; + let boty = index_h - 1; + + if (!usePrimmMaze) { + // non-primm mazes have the potential to need to be regenerated, so we keep doing it to validate + let maxTries = 10000; + let tries = 0; + let test = () => { + if (KinkyDungeonMapGet(1 + startx*2, 1 + starty*2) != '0') return false; + if (KinkyDungeonMapGet(1 + endx*2, 1 + endy*2) != '0') return false; + if (KinkyDungeonMapGet(1 + topx*2, 1 + topy*2) != '0') return false; + if (KinkyDungeonMapGet(1 + botx*2, 1 + boty*2) != '0') return false; + + return true; + }; + while (!test() && tries++ < maxTries) { + genPrimmMaze(); + } + + } + + + /** + * Start, end, top, bot positions + */ + let requiredAccess: Record = {}; + requiredAccess[(startx + 1) + "," + (starty + 1)] = true; + requiredAccess[(topx + 1) + "," + (topy + 1)] = true; + requiredAccess[(endx + 1) + "," + (endy + 1)] = true; + requiredAccess[(botx + 1) + "," + (boty + 1)] = true; + + // Now we convert the maze into an array of indices + let indices: Record = {}; + for (let x = 1; x < KDMapData.GridWidth; x += 2) { + for (let y = 1; y < KDMapData.GridHeight; y += 2) { + let index = ""; + + if (KinkyDungeonMapGet(x, y - 1) == '0' || ((x - 1)/2 == startx && (y - 1)/2 - 1 == starty) || ((y - 1)/2 == topy && (x - 1)/2 == topx) || ((x - 1)/2 == startx && (y - 1)/2 == starty)) index = index + "u"; + if (KinkyDungeonMapGet(x, y + 1) == '0' || ((x - 1)/2 == startx && (y - 1)/2 + 1 == starty) || ((y - 1)/2 == boty && (x - 1)/2 == botx) || ((x - 1)/2 == startx && (y - 1)/2 == starty)) index = index + "d"; + if (KinkyDungeonMapGet(x - 1, y) == '0' || ((x - 1)/2 - 1 == startx && (y - 1)/2 == starty) || ((x - 1)/2 == startx && (y - 1)/2 == starty)) index = index + "l"; + if (KinkyDungeonMapGet(x + 1, y) == '0' || ((x - 1)/2 + 1 == startx && (y - 1)/2 == starty) || ((x - 1)/2 == endx && (y - 1)/2 == endy) || ((x - 1)/2 == startx && (y - 1)/2 == starty)) index = index + "r"; + + + indices[(1 + (x - 1)/2) + "," + (1 + (y - 1)/2)] = index; + } + } + + // TODO remove + console.log(indices); + + // Set the map bounds + KDMapData.GridWidth = Math.floor(index_w * KDTE_Scale) + 2; + KDMapData.GridHeight = Math.floor(index_h * KDTE_Scale) + 2; + + KDMapData.StartPosition = {x: 1 + (startx) * KDTE_Scale, y: 4 + (starty) * KDTE_Scale}; + KDMapData.EndPosition = {x: 7 + (endx) * KDTE_Scale, y: 4 + (endy) * KDTE_Scale}; + KDMapData.ShortcutPositions = {}; + + // Reverse the order 50% of the time + if (KDRandom() < 0.5) { + KDMapData.ShortcutPositions['0'] = {x: 4 + (botx) * KDTE_Scale, y: 7 + (boty) * KDTE_Scale}; + KDMapData.ShortcutPositions['1'] = {x: 4 + (topx) * KDTE_Scale, y: 1 + (topy) * KDTE_Scale}; + } else { + KDMapData.ShortcutPositions['0'] = {x: 4 + (topx) * KDTE_Scale, y: 1 + (topy) * KDTE_Scale}; + KDMapData.ShortcutPositions['1'] = {x: 4 + (botx) * KDTE_Scale, y: 7 + (boty) * KDTE_Scale}; + } + + + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + '1';//KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + let tagModifiers = data.params.tagModifiers ? (data.params as floorParams).tagModifiers : undefined; + + // Now we decide which tiles to use. This is a lengthy process, so it is its own function + // This happens with the loading--future tiles depend on present tiles + let maxTagFlags = Object.assign({ + chest: data.params.chestcount || 0, + shrine: data.params.shrinecount || 0, + charger: data.params.chargercount || 0, + }, KDDefaultMaxFlags); + KDMapTilesPopulate(w, h, indices, data, requiredAccess, maxTagFlags, tagModifiers); + + let floodChance = data.params.floodchance || 0; + + for (let X = 2; X < KDMapData.GridWidth; X += 2) + for (let Y = 2; Y < KDMapData.GridWidth; Y += 2) { + let size = 2*Math.ceil(KDRandom() * (openness)); + if (KDRandom() < 0.4 - 0.04*density * size) { + if (floodChance > 0 && KDRandom() < floodChance) + // We open up the tiles + for (let XX = X; XX < X +size; XX++) + for (let YY = Y; YY < Y+size; YY++) { + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(XX, YY))) + KinkyDungeonMapSet(XX, YY, 'w'); + } + } + } +} + + +function KinkyDungeonCreateRoom(_POI: any, _VisitedRooms: any[], width: number, height: number, _openness: number, _density: number, _hallopenness: number, _data: any) { + // Variable setup + + KinkyDungeonCreateRectangle(0, 0, width, height, true, false, false, false); + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); +} + +function KinkyDungeonCreateDollStorage(_POI: any, VisitedRooms: any[], _width: number, height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + KDMapData.StartPosition = {x: 7 * 4-1, y: 7 * 1+2}; + KDMapData.EndPosition = {x: KDMapData.StartPosition.x, y: KDMapData.StartPosition.y}; + VisitedRooms[0].x = 1; + VisitedRooms[0].y = Math.floor(height/2); + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + + KD_PasteTile(KDMapTilesList.DollRoom, 1, 1, data); + KDMapData.EndPosition = {x: 2, y: 11}; + KinkyDungeonMapSet(2, 11, 's'); + if (MiniGameKinkyDungeonLevel == 0 && !KinkyDungeonFlags.get("fg")) { + KinkyDungeonTilesSet("2,11", {RoomType: "JourneyFloor"}); + KinkyDungeonSetFlag("fg", -1); + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + +} +function KinkyDungeonCreateSummit(_POI: any, VisitedRooms: any[], _width: number, _height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + if (!KinkyDungeonFlags.get("1stSummit")) { + KinkyDungeonSendTextMessage(10, TextGet("KDSummitIntro"), "#ffffff", 12, undefined, undefined, undefined, ""); + KinkyDungeonSetFlag("1stSummit", -1); + } + KDMapData.StartPosition = {x: 11, y: 20}; + KDMapData.EndPosition = {x: KDMapData.StartPosition.x, y: KDMapData.StartPosition.y}; + VisitedRooms[0].x = 1; + VisitedRooms[0].y = 1; + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + + KD_PasteTile(KDMapTilesList.Summit, 1, 1, data); + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + + KinkyDungeonMapSet(KDMapData.StartPosition.x, KDMapData.StartPosition.y + 2, '6'); + KinkyDungeonTilesSet((KDMapData.StartPosition.x) + ',' + (KDMapData.StartPosition.y + 2), { + Type: "Elevator", + Overlay: "Elevator", + }); +} + +function KinkyDungeonCreateDollRoom(_POI: any, _VisitedRooms: any[], width: number, height: number, _openness: number, _density: number, _hallopenness: number, _data: any) { + // Variable setup + + + // Now we STRETCH the map + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + width = KDMapData.GridWidth; + height = KDMapData.GridHeight; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + '1'; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + + // Create the doll cell itself + let CellWidth = 10; + let CellHeight = 12; + let CellX = width / 2 - CellWidth / 2; + let CellY = height / 2 - CellHeight / 2; + let cavityStart = 5; + let cavityEnd = 2; + + // Hollow out a greater cell area + KinkyDungeonCreateRectangle(cavityStart, 0, CellX + CellWidth - cavityEnd, height, false, false, false, false); + + KinkyDungeonCreateRectangle(CellX, CellY, CellWidth, CellHeight, true, false, false, true, true, false, true); + + // Create some protrustions in the walls + let leftPassages = [ + ]; + for (let i = 0; i < 6; i++) { + leftPassages.push(1 + Math.ceil(KDRandom()*2)); + } + let rightPassages = []; + for (let i = 0; i < 6; i++) { + rightPassages.push(2 + Math.ceil(KDRandom()*3)); + } + let ii = 0; + for (let l of leftPassages) { + KinkyDungeonCreateRectangle(cavityStart - l, 1 + 3 * ii, l, 2, false, false, false, false); + + KinkyDungeonMapSet(cavityStart, 3 + 3 * ii, 'X'); + //if (ii < leftPassages.length - 1) { + KinkyDungeonMapSet(cavityStart, 1 + 3 * ii, '2'); + KinkyDungeonMapSet(cavityStart, 2 + 3 * ii, '2'); + //} + ii += 1; + } + ii = 0; + for (let l of rightPassages) { + KinkyDungeonCreateRectangle(cavityStart - cavityEnd + CellX + CellWidth, 1 + 3 * ii, l, 2, false, false, false, false); + KinkyDungeonMapSet(cavityStart - cavityEnd + CellX + CellWidth, 3 + 3 * ii, 'X'); + //if (ii < rightPassages.length - 1) { + KinkyDungeonMapSet(cavityStart - cavityEnd + CellX + CellWidth, 1 + 3 * ii, '2'); + KinkyDungeonMapSet(cavityStart - cavityEnd + CellX + CellWidth, 2 + 3 * ii, '2'); + //} + ii += 1; + } + + // Create grates + KinkyDungeonMapSet(CellX + 2 + Math.floor(KDRandom()*(CellWidth - 5)), KDRandom() < 0.5 ? CellY : (CellY+CellHeight - 1), 'g'); + if (KDRandom() < 0.5) + KinkyDungeonMapSet(CellX + 2 + Math.floor(KDRandom()*(CellWidth - 5)), KDRandom() < 0.5 ? CellY : (CellY+CellHeight - 1), 'g'); + if (KDRandom() < 0.5) + KinkyDungeonMapSet(CellX,CellY + 2 + Math.floor(KDRandom()*(CellHeight - 5)), 'g'); + if (KDRandom() < 0.5) + KinkyDungeonMapSet((CellX+CellWidth - 1),CellY + 2 + Math.floor(KDRandom()*(CellHeight - 5)), 'g'); + // Create light posts + for (let xx = CellX + 2; xx < CellX + CellWidth; xx += 5) { + for (let yy = 2; yy < height; yy += 5) { + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(xx, yy))) { + KinkyDungeonMapSet(xx, yy, '0'); + KinkyDungeonTilesSet((xx) + "," + (yy), Object.assign(KinkyDungeonTilesGet((xx) + "," + (yy)) || {}, {Light: 6, Skin: "LightRaysDoll"})); + } + + } + } + + let dollCount = 10; + // Generate dolls in the inside + for (let i = 0; i < dollCount; i++) { + let XX = CellX + 1 + Math.round(KDRandom() * (CellWidth-3)); + let YY = CellY + 1 + Math.round(KDRandom() * (CellHeight-3)); + let entity = KinkyDungeonEntityAt(XX, YY); + if (entity || (XX == width/2 && YY == height/2)) continue; + let Enemy = KinkyDungeonGetEnemy(["bellowsDoll"], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["doll", "peaceful"]); + if (Enemy) { + let e = DialogueCreateEnemy(XX, YY, Enemy.name); + if (KDRandom() < 0.33) KDTieUpEnemy(e, 15 + Math.floor(45 * KDRandom()), "Tape"); + else if (KDRandom() < 0.32) KDTieUpEnemy(e, 15 + Math.floor(45 * KDRandom()), "Slime"); + else if (KDRandom() < 0.34) KDTieUpEnemy(e, 15 + Math.floor(45 * KDRandom()), "Metal"); + if (e.boundLevel > 0 && KDRandom() < 0.33) e.hp = 0.5; + } + } + + KDMapData.JailPoints.push({x: width/2, y: height/2, type: "dropoff", radius: 1}); + + let takenIndex = 0; + let takenRight = false; + if (KDRandom() < 0.5) { + // Left side + let cavityNum = Math.floor(KDRandom()*leftPassages.length); + takenIndex = cavityNum; + KDMapData.EndPosition = {x: cavityStart - leftPassages[cavityNum], y: 1 + 3 * cavityNum}; + } else { + // Right side + let cavityNum = Math.floor(KDRandom()*rightPassages.length); + takenIndex = cavityNum; + takenRight = true; + KDMapData.EndPosition = {x: cavityStart - cavityEnd + CellX + CellWidth + rightPassages[cavityNum] - 1, y: 1 + 3 * cavityNum}; + } + if (KDRandom() < 0.5) { + // Left side + let cavityNum = Math.floor(KDRandom()*leftPassages.length); + if (!takenRight && takenIndex == cavityNum) { + if (cavityNum > 0) cavityNum -= 1; + else cavityNum += 1; + } + KDMapData.StartPosition = {x: cavityStart - leftPassages[cavityNum], y: 2 + 3 * cavityNum}; + } else { + // Right side + let cavityNum = Math.floor(KDRandom()*rightPassages.length); + if (takenRight && takenIndex == cavityNum) { + if (cavityNum > 0) cavityNum -= 1; + else cavityNum += 1; + } + + KDMapData.StartPosition = {x: cavityStart - cavityEnd + CellX + CellWidth + rightPassages[cavityNum] - 1, y: 2 + 3 * cavityNum}; + } + + let exitGuardTags = ["robot"]; KinkyDungeonAddTags(exitGuardTags, MiniGameKinkyDungeonLevel); + if (KDGameData.DollRoomCount > 0) exitGuardTags.push("open"); // Allow spawning an Enforcer unit + let robotTags = ["robot"]; KinkyDungeonAddTags(robotTags, MiniGameKinkyDungeonLevel); + let eliteTags = ["robot"]; KinkyDungeonAddTags(eliteTags, MiniGameKinkyDungeonLevel); + + let robotCount = 5 + Math.min(10, KinkyDungeonDifficulty/10 + MiniGameKinkyDungeonLevel/3) + 5 * (KDGameData.DollRoomCount || 0); + // Generate robots in the outside + for (let i = 0; i < robotCount; i++) { + let XX = i % 2 == 0 ? + (cavityStart + Math.round(KDRandom() * (CellX - cavityStart - 1))) + : (CellX + CellWidth + 1 + Math.round(KDRandom() * (cavityStart - 2 - cavityEnd))); + let YY = CellY + 1 + Math.round(KDRandom() * (CellHeight-2)); + let entity = KinkyDungeonEntityAt(XX, YY); + if (entity || (XX == width/2 && YY == height/2)) continue; + let Enemy = KinkyDungeonGetEnemy(robotTags, MiniGameKinkyDungeonLevel + 3, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["robot"], undefined, undefined); + if (Enemy) { + let e = DialogueCreateEnemy(XX, YY, Enemy.name); + e.faction = "Enemy"; + } + } + if (KDGameData.DollRoomCount > 1) { // Spawn a group of AIs + for (let i = 0; i < 1 + Math.ceil(robotCount * 0.1); i++) { + let point = KinkyDungeonGetNearbyPoint(KDMapData.EndPosition.x, KDMapData.EndPosition.y); + let Enemy = KinkyDungeonGetEnemy(eliteTags, MiniGameKinkyDungeonLevel + 4, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["robot"], + undefined, undefined, ["minor", "miniboss", "noguard"]); + if (Enemy) { + let e = DialogueCreateEnemy(point.x, point.y, Enemy.name); + e.faction = "Enemy"; + if (KDCanOverrideAI(e)) + e.AI = "looseguard"; + else e.AI = KDGetAIOverride(e, 'looseguard'); + } + } + } + + let ExitGuard = KinkyDungeonGetEnemy(exitGuardTags, MiniGameKinkyDungeonLevel + 10, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["robot", "dollRoomBoss"], + undefined, undefined, ["noguard"]); + if (ExitGuard) { + let e = DialogueCreateEnemy(KDMapData.EndPosition.x, KDMapData.EndPosition.y, ExitGuard.name); + e.faction = "Enemy"; + e.AI = "verylooseguard"; + } + + KDMapData.PatrolPoints.push({x: CellX - 2, y: CellY - 2}); + KDMapData.PatrolPoints.push({x: CellX - 2, y: CellY + 2 + CellHeight}); + KDMapData.PatrolPoints.push({x: CellX + 2 + CellWidth, y: CellY + 2 + CellHeight}); + KDMapData.PatrolPoints.push({x: CellX + 2 + CellWidth, y: CellY - 2}); + + + + KinkyDungeonMapSet(KDMapData.EndPosition.x, KDMapData.EndPosition.y, 's'); + if (KDGameData.DollRoomCount > 0) { + KinkyDungeonMapSet(KDMapData.StartPosition.x, KDMapData.StartPosition.y, 'S'); + } +} + +function KinkyDungeonCreateDemonTransition(POI: any, VisitedRooms: any[], width: number, height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + // Create the map + KinkyDungeonCreateMaze(POI, VisitedRooms, width, height, 0, 10, 0, data); + KinkyDungeonGenNavMap(KDMapData.StartPosition); + + KDMapData.EndPosition = KinkyDungeonGetRandomEnemyPoint(false, false); + + if (!KDMapData.EndPosition) { + KinkyDungeonCreateMaze(POI, VisitedRooms, width, height, 0, 10, 0, data); + KinkyDungeonGenNavMap(KDMapData.StartPosition); + } + if (!KDMapData.EndPosition) { + KDMapData.EndPosition = {x: KDMapData.StartPosition.x, y: KDMapData.StartPosition.x}; + } + KDMapData.StartPosition = KinkyDungeonGetRandomEnemyPointCriteria((x: number, y: number) => {return KDistChebyshev(x - KDMapData.EndPosition.x, y - KDMapData.EndPosition.y) > width/4;},false, false); + //let playerPos = KinkyDungeonGetRandomEnemyPoint(false, false); + + KinkyDungeonPlayerEntity.x = KDMapData.StartPosition.x; + KinkyDungeonPlayerEntity.y = KDMapData.StartPosition.y; + + KinkyDungeonMapSet(KDMapData.EndPosition.x, KDMapData.EndPosition.y, 's'); + + // Create the Shadow on top of the end stairs + DialogueCreateEnemy(KDMapData.EndPosition.x, KDMapData.EndPosition.y, "DemonEye"); + // Create observers + + // Create random stair pairs + let obscount = 20; + for (let i = 0; i < obscount; i++) { + let point1 = KinkyDungeonGetRandomEnemyPoint(true, false, undefined, 10, 10); + if (point1) { + DialogueCreateEnemy(point1.x, point1.y, "Observer"); + } + } + + + // Create random stair pairs + let count = 20; + for (let i = 0; i < count; i++) { + let point1 = KinkyDungeonGetRandomEnemyPointCriteria((x: number, y: number) => {return KinkyDungeonMapGet(x, y) != 's' && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(x, y));},true, false); + if (point1) { + KinkyDungeonMapSet(point1.x, point1.y, 's'); + KinkyDungeonTilesSet(point1.x + "," + point1.y, {AltStairAction: "RandomTeleport"}); + } + } +} + +function KinkyDungeonCreateDollmaker(_POI: any, _VisitedRooms: any[], _width: number, _height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + // Variable setup + KinkyDungeonSetFlag("NoDollRoomBypass", -1, 1); + + KDPlayMusic("UntitledRobot.ogg", undefined, true); + + // Now we STRETCH the map + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + /* Set but never used + width = KDMapData.GridWidth; + height = KDMapData.GridHeight; + */ + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + '1'; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + + // Create the doll cell itself + let cavitywidth = 21; + let cavityheight = 21; + let cavityStart = 2; + + KDMapData.StartPosition = {x: cavityStart, y: 1 + Math.floor(cavityheight/2)}; + + // Hollow out a greater cell area + KinkyDungeonCreateRectangle(cavityStart, 0, cavitywidth, cavityheight, false, false, false, false); + + KD_PasteTile(KDMapTilesList.Arena_Dollmaker, cavityStart, 1, data); + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + DialogueCreateEnemy(KDMapData.StartPosition.x + Math.floor(cavityheight/2), KDMapData.StartPosition.y, "DollmakerBoss1"); + KDStageBossGenerated = true; + + KDMapData.EndPosition = {x: KDMapData.StartPosition.x + cavitywidth, y: KDMapData.StartPosition.y}; + + KinkyDungeonMapSet(KDMapData.EndPosition.x, KDMapData.EndPosition.y, 's'); + KinkyDungeonMapSet(KDMapData.StartPosition.x, KDMapData.StartPosition.y, 'S'); + KinkyDungeonTilesSet(KDMapData.StartPosition.x + ',' + KDMapData.StartPosition.y, { + RoomType: "PerkRoom", + }); // Has to be tunnel +} + +function KinkyDungeonCreateWarden(_POI: any, _VisitedRooms: any[], _width: number, _height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + // Now we STRETCH the map + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + /* Set but never used. + width = KDMapData.GridWidth; + height = KDMapData.GridHeight; + */ + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + '1'; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + + // Create the doll cell itself + let cavitywidth = 21; + let cavityheight = 21; + let cavityStart = 2; + + KDMapData.StartPosition = {x: cavityStart, y: 1 + Math.floor(cavityheight/2)}; + + // Hollow out a greater cell area + KinkyDungeonCreateRectangle(cavityStart, 0, cavitywidth, cavityheight, false, false, false, false); + + KD_PasteTile(KDMapTilesList.Arena_Warden, cavityStart, 1, data); + + DialogueCreateEnemy(KDMapData.StartPosition.x + Math.floor(cavityheight/2), KDMapData.StartPosition.y, "TheWarden1"); + KDStageBossGenerated = true; + let en = DialogueCreateEnemy(KDMapData.StartPosition.x + Math.floor(cavityheight/2) - 6, KDMapData.StartPosition.y - 8, "WardenArcher"); + KinkyDungeonSetEnemyFlag(en, "imprisoned", -1); + en.prisondialogue = "PrisonerJailOther"; + en = DialogueCreateEnemy(KDMapData.StartPosition.x + Math.floor(cavityheight/2), KDMapData.StartPosition.y - 8, "WardenFighter"); + KinkyDungeonSetEnemyFlag(en, "imprisoned", -1); + en.prisondialogue = "PrisonerJailOther"; + en = DialogueCreateEnemy(KDMapData.StartPosition.x + Math.floor(cavityheight/2) + 6, KDMapData.StartPosition.y - 8, "WardenMage"); + KinkyDungeonSetEnemyFlag(en, "imprisoned", -1); + en.prisondialogue = "PrisonerJailOther"; + + KDMapData.EndPosition = {x: KDMapData.StartPosition.x + cavitywidth, y: KDMapData.StartPosition.y}; + + KinkyDungeonMapSet(KDMapData.EndPosition.x, KDMapData.EndPosition.y, 's'); + KinkyDungeonMapSet(KDMapData.StartPosition.x, KDMapData.StartPosition.y, 'S'); + KinkyDungeonTilesSet(KDMapData.StartPosition.x + ',' + KDMapData.StartPosition.y, { + RoomType: "PerkRoom", + }); // Has to be tunnel +} + +function KinkyDungeonCreateTunnel(_POI: any, VisitedRooms: any[], width: number, height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + // Variable setup + + KinkyDungeonCreateRectangle(0, 0, width, height, true, true, false, false); + + // Starting rectangle + KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y - 1, width - 3, 2, false, false, false, false); + // Main passage + KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y, width - 2, 1, false, false, false, false); + + // Create the two branching hallways + let b1 = 3 + Math.floor(KDRandom() * (width-7)); + let b2 = 4 + Math.floor(KDRandom() * (width-6)); + + let y1 = VisitedRooms[0].y > 4 ? 1 : VisitedRooms[0].y; + let h1 = VisitedRooms[0].y > 4 ? Math.abs(y1 - VisitedRooms[0].y) : height - VisitedRooms[0].y - 1; + + let y2 = VisitedRooms[0].y < height - 4 ? VisitedRooms[0].y : 1; + let h2 = VisitedRooms[0].y < height - 4 ? Math.abs(height - 1 - VisitedRooms[0].y) : VisitedRooms[0].y - 1; + + if (Math.abs(b1 - b2) < 2) { + if (b1 < width - 4) b2 = b1 + 2; + else b2 = b1 - 2; + } + + KinkyDungeonCreateRectangle(b1, y1, 1, h1, false, false, false, false); + KinkyDungeonCreateRectangle(b2, y2, 1, h2, false, false, false, false); + + + /* + // Add the prison + let py = (VisitedRooms[0].y < height - 5 ? height - 3 : 3); + POI.push({x: 2*VisitedRooms[0].x + 4, y: 2*py, requireTags: [], favor: ["GuaranteedCell"], used: false}); + KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false); + KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), b2-2, 1, false, false, false, false); + KinkyDungeonCreateRectangle(b2, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false);*/ + + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + // Place a shop and a Leyline Tap + + //KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 + 1, 'A'); + //KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Shrine", Name: "Will"}); + + // Removing shrine and leyline and putting in perk room instead + /* + KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 + 1, 'l'); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 + 1), {Leyline: true, Light: KDLeylineLight, lightColor: KDLeylineLightColor}); + + KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 - 2, 'A'); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 - 2), {Type: "Shrine", Name: "Commerce"}); + + // Place lost items chest + if (KinkyDungeonLostItems.length > 0) + KDChest(VisitedRooms[0].x*2 + 0, VisitedRooms[0].y*2 - 2, "lost_items");*/ + + // Place the exit stairs + KinkyDungeonMapSet(b1*2, VisitedRooms[0].y > 4 ? 2 : height*2 - 3, 's'); + KinkyDungeonMapSet(b1*2 + 1, VisitedRooms[0].y > 4 ? 2 : height*2 - 3, 'G'); + /*let boss = KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel + 1); + let mods = !boss ? KDGetMapGenList(3, KDMapMods) : ["None", "None", "None"]; + if (!boss) { + let exit1 = mods[0].name; + KinkyDungeonMapSet(b1*2, VisitedRooms[0].y > 4 ? 2 : height*2 - 3, 's'); + KinkyDungeonMapSet(b1*2 + 1, VisitedRooms[0].y > 4 ? 2 : height*2 - 3, 'G'); + KinkyDungeonTilesSet("" + (b1*2) + "," + (VisitedRooms[0].y > 4 ? 2 : height*2 - 3), {MapMod: exit1}); + KinkyDungeonTilesSet("" + (b1*2 + 1) + "," + (VisitedRooms[0].y > 4 ? 2 : height*2 - 3), {Type: "Ghost", Msg: "MapMod" + exit1}); + + let exit2 = mods[1].name; + KinkyDungeonMapSet(b2*2 + 1, VisitedRooms[0].y < height - 4 ? height*2 - 3 : 2, 's'); + KinkyDungeonMapSet(b2*2, VisitedRooms[0].y < height - 4 ? height*2 - 3 : 2, 'G'); + KinkyDungeonTilesSet("" + (b2*2 + 1) + "," + (VisitedRooms[0].y < height - 4 ? height*2 - 3 : 2), {MapMod: exit2}); + KinkyDungeonTilesSet("" + (b2*2) + "," + (VisitedRooms[0].y < height - 4 ? height*2 - 3 : 2), {Type: "Ghost", Msg: "MapMod" + exit2}); + } + + let exit3 = boss ? "Boss" : mods[2].name; + KinkyDungeonMapSet(width*2 - 2, VisitedRooms[0].y*2, 's'); + KinkyDungeonMapSet(width*2 - 2, VisitedRooms[0].y*2 + 1, 'G'); + if (!boss) + KinkyDungeonTilesSet("" + (width*2 - 2) + "," + (VisitedRooms[0].y*2), {MapMod: exit3}); + KinkyDungeonTilesSet("" + (width*2 - 2) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "MapMod" + exit3}); + */ + KDMapData.EndPosition = {x: width*2 - 2, y: VisitedRooms[0].y*2}; + + // Place quest NPCs + let quests = KDQuestList(3, KDQuests, "Tunnel", "", data); + for (let q of quests) { + if (q.npc) + KinkyDungeonSummonEnemy(KDMapData.StartPosition.x, KDMapData.StartPosition.y, q.npc, 1, 14, true); + } +} + + +function KinkyDungeonCreatePerkRoom(POI: any, VisitedRooms: any[], width: number, height: number, _openness: number, _density: number, _hallopenness: number, _data: any) { + // Variable setup + + KinkyDungeonCreateRectangle(0, 0, width, height, true, true, false, false); + + KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y - 1, 2, 2, false, false, false, false); + KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y, width - 2, 1, false, false, false, false); + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + // Place a shop and a Leyline Tap + KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 + 1, 'l'); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 + 1), {Leyline: true, Light: KDLeylineLight, lightColor: KDLeylineLightColor}); + + if (KinkyDungeonFlags.get("SpawnMap")) { + if (KinkyDungeonSpells.filter((spell) => {return spell.name == "ManaPoolUp";}).length < Math.ceil(MiniGameKinkyDungeonLevel/KDLevelsPerCheckpoint)) + KDMapData.GroundItems.push({x:VisitedRooms[0].x*2 + 3, y:(VisitedRooms[0].y*2), name: "LeylineMap"}); + KinkyDungeonSetFlag("SpawnMap", 0); + } + + KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 - 2, 'A'); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 - 2), {Type: "Shrine", Name: "Commerce"}); + + // Create the perk altars + let py = VisitedRooms[0].y*2 - 2; + let p1x = VisitedRooms[0].x*2 + 5; + KinkyDungeonCreateRectangle(p1x, py, 5, 2, false, false, false, false); + + POI.push({x: VisitedRooms[0].x*2 + 7, y: VisitedRooms[0].y*2, requireTags: [], favor: ["PearlChest"], used: false}); + + + let perksplaced = 0; + if (!KinkyDungeonStatsChoice.get("noperks")) { + let perkCount = 3; + let perks: Record = {}; + for (let i = 0; i < perkCount; i++) { + let newperks = KinkyDungeonStatsChoice.get("perksdebuff") ? KDGetRandomPerks(perks, true) : KDGetRandomPerks(perks); + let bondage = KDGetPerkShrineBondage(newperks); + //let boss = KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel + 1); + let method = ""; + //if (boss) + //method = //KDGetRandomEscapeMethod(); + //else + //method = "Boss"; + + if (newperks.length > 0) { + KinkyDungeonMapSet(p1x + i * 2, py, 'P'); + KinkyDungeonTilesSet("" + (p1x + i * 2) + "," + (py), {Perks: newperks, + Light: 5, + lightColor: 0xffff88, + Bondage: bondage, Method: method}); + perksplaced += 1; + for (let p of newperks) { + perks[p] = true; + } + } + } + } + + + // Place lost items chest + if (KinkyDungeonLostItems.length > 0 && !KinkyDungeonStatsChoice.get("itemMode")) + KDChest(VisitedRooms[0].x*2 + 0, VisitedRooms[0].y*2 - 2, "lost_items"); + else if (!KinkyDungeonInventoryGet("Default")) { + KDChest(VisitedRooms[0].x*2 + 0, VisitedRooms[0].y*2 - 2, "lost_clothes"); + } + + if (KinkyDungeonFlags.get("1stSummit") && KDFacilityTypes.Warden.prereq() + && KDGameData.FacilitiesData["Servants_Warden"]?.length > 0) { + KinkyDungeonMapSet(VisitedRooms[0].x*2 - 1, VisitedRooms[0].y*2 - 1, '7'); + KinkyDungeonTilesSet((VisitedRooms[0].x*2 - 1) + ',' + (VisitedRooms[0].y*2 - 1), { + Type: "WardenCourier", + Overlay: "TiedCourier", + Light: 2, + lightColor: 0xffffff, + }); + } + + // Place the exit stairs + if (perksplaced > 0 && KinkyDungeonStatsChoice.get("perksmandatory")) + KinkyDungeonMapSet(width*2 - 2, VisitedRooms[0].y*2, 'b'); + else + KinkyDungeonMapSet(width*2 - 2, VisitedRooms[0].y*2, 's'); + //KinkyDungeonTilesSet("" + (width*2 - 2) + "," + (VisitedRooms[0].y*2), {RoomType: "Tunnel"}); + + KDMapData.EndPosition = {x: width*2 - 2, y: VisitedRooms[0].y*2}; +} + + +function KinkyDungeonCreateJourneyFloor(_POI: any, VisitedRooms: any[], width: number, height: number, _openness: number, _density: number, _hallopenness: number, _data: any) { + // Variable setup + + KDMapData.StartPosition = {x: 2, y: height}; + VisitedRooms[0].x = 1; + VisitedRooms[0].y = Math.floor(height/2); + + KinkyDungeonCreateRectangle(0, 0, width, height, true, true, false, false); + + KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y - 1, 2, 2, false, false, false, false); + KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y, 4, 1, false, false, false, false); + + // Create a branching room for journeys + let b1 = 4; + KinkyDungeonCreateRectangle(b1, VisitedRooms[0].y - 3, width - b1, 2, false, false, false, false); + KinkyDungeonCreateRectangle(b1, VisitedRooms[0].y - 3, 1, 3, false, false, false, false); + + /* + // Add the prison + let py = (VisitedRooms[0].y < height - 5 ? height - 3 : 3); + POI.push({x: 2*VisitedRooms[0].x + 4, y: 2*py, requireTags: [], favor: ["GuaranteedCell"], used: false}); + KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false); + KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), b2-2, 1, false, false, false, false); + KinkyDungeonCreateRectangle(b2, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false);*/ + + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + // Normal end stairs + KinkyDungeonMapSet(b1*2 + 2, VisitedRooms[0].y*2, 's'); + KinkyDungeonMapSet(b1*2 + 2, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (b1*2 + 2) + "," + (VisitedRooms[0].y*2), {RoomType: "ShopStart", Skin: "TabletSpent", Journey: ""}); + KinkyDungeonTilesSet("" + (b1*2 + 2) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "JourneyNone"}); + KDCreateEffectTile(b1*2 + 2, VisitedRooms[0].y*2, { + name: "Portals/Portal", + duration: 9999, infinite: true, + }, 0); + + // Tutorial end stairs + KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 - 2, 'H'); + KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 - 1, 'G'); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 - 2), {RoomType: "Tutorial", Journey: "", Skin: "TabletSpent"}); + KDCreateEffectTile(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 - 2, { + name: "Portals/Portal", + duration: 9999, infinite: true, + }, 0); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 - 1), {Type: "Ghost", Msg: "JourneyTutorial"}); + + KinkyDungeonMapSet(VisitedRooms[0].x*2 + 3, VisitedRooms[0].y*2 - 3, 'X'); + KinkyDungeonMapSet(VisitedRooms[0].x*2 + 0, VisitedRooms[0].y*2 - 2, 'X'); + KinkyDungeonMapSet(VisitedRooms[0].x*2 + 0, VisitedRooms[0].y*2 - 3, 'X'); + KinkyDungeonMapSet(VisitedRooms[0].x*2 + 2, VisitedRooms[0].y*2 - 3, '0'); + KinkyDungeonMapSet(VisitedRooms[0].x*2 + 1, VisitedRooms[0].y*2 - 3, '0'); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 0) + "," + (VisitedRooms[0].y*2 - 3), {SkinCode: "Floor", Skin2: "Dummy2"}); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 3) + "," + (VisitedRooms[0].y*2 - 3), {SkinCode: "Floor", Skin2: "Dummy1"}); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x*2 + 0) + "," + (VisitedRooms[0].y*2 - 2), {SkinCode: "Floor", Skin2: "Dummy0"}); + + // Place journey stairs + let x = b1 * 2; + let i = 0; + while (x < width*2-2) { + if (KDJourneyList[i]) { + KinkyDungeonMapSet(x, VisitedRooms[0].y*2 - 6, 's'); + KinkyDungeonMapSet(x, VisitedRooms[0].y*2 - 5, 'G'); + KinkyDungeonTilesSet("" + (x) + "," + (VisitedRooms[0].y*2 - 6), {RoomType: "ShopStart", Skin: "TabletSpent", Journey: KDJourneyList[i]}); + KinkyDungeonTilesSet("" + (x) + "," + (VisitedRooms[0].y*2 - 5), {Type: "Ghost", Msg: "Journey" + KDJourneyList[i]}); + if (KDJourneyListSkin[KDJourneyList[i]]) { + KinkyDungeonSkinArea({skin: KDJourneyListSkin[KDJourneyList[i]]}, x, (VisitedRooms[0].y*2 - 6), 0.5); + KinkyDungeonSkinArea({skin: KDJourneyListSkin[KDJourneyList[i]]}, x + 1, (VisitedRooms[0].y*2 - 6), 0.5); + KinkyDungeonSkinArea({skin: KDJourneyListSkin[KDJourneyList[i]]}, x, (VisitedRooms[0].y*2 - 7), 0.5); + KinkyDungeonSkinArea({skin: KDJourneyListSkin[KDJourneyList[i]]}, x + 1, (VisitedRooms[0].y*2 - 7), 0.5); + KinkyDungeonSkinArea({skin: KDJourneyListSkin[KDJourneyList[i]]}, x, (VisitedRooms[0].y*2 - 5), 0.5); + KinkyDungeonSkinArea({skin: KDJourneyListSkin[KDJourneyList[i]]}, x + 1, (VisitedRooms[0].y*2 - 5), 0.5); + } + KDCreateEffectTile(x, (VisitedRooms[0].y*2 - 6), { + name: "Portals/Portal", + duration: 9999, infinite: true, + }, 0); + } + i++; + x += 2; + } + + KDMapData.EndPosition = {x: b1*2 + 2, y: VisitedRooms[0].y*2}; +} + + +function KinkyDungeonCreateShopStart(_POI: any, VisitedRooms: any[], width: number, height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + // Variable setup + + KDMapData.StartPosition = {x: 2, y: height}; + VisitedRooms[0].x = 1; + VisitedRooms[0].y = Math.floor(height/2); + + KinkyDungeonCreateRectangle(0, 0, width, height, true, true, false, false); + + KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y - 1, 4, 2, false, false, false, false); + KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y, 6, 1, false, false, false, false); + + let b1 = 4; + + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + KD_PasteTile(KDMapTilesList.ShopStart, KDMapData.StartPosition.x, KDMapData.StartPosition.y - 4, data); + + DialogueCreateEnemy(KDMapData.StartPosition.x + 5, KDMapData.StartPosition.y, "ShopkeeperStart"); + DialogueCreateEnemy(KDMapData.StartPosition.x + 1, KDMapData.StartPosition.y - 3, "BlacksmithQuest").AI = "guard"; + KinkyDungeonMapSet(KDMapData.StartPosition.x + 1, KDMapData.StartPosition.y - 3, '2'); + KinkyDungeonTilesSet((KDMapData.StartPosition.x + 1) + ',' + (KDMapData.StartPosition.y - 3), {OL: true}); + + DialogueCreateEnemy(KDMapData.StartPosition.x + 2, KDMapData.StartPosition.y - 3, "ArmorerQuest").AI = "guard"; + KinkyDungeonMapSet(KDMapData.StartPosition.x + 2, KDMapData.StartPosition.y - 3, '2'); + KinkyDungeonTilesSet((KDMapData.StartPosition.x + 2) + ',' + (KDMapData.StartPosition.y - 3), {OL: true}); + + + + DialogueCreateEnemy(KDMapData.StartPosition.x + 3, KDMapData.StartPosition.y - 3, "BowyerQuest").AI = "guard"; + KinkyDungeonMapSet(KDMapData.StartPosition.x + 3, KDMapData.StartPosition.y - 3, '2'); + KinkyDungeonTilesSet((KDMapData.StartPosition.x + 3) + ',' + (KDMapData.StartPosition.y - 3), {OL: true}); + + DialogueCreateEnemy(KDMapData.StartPosition.x + 12, KDMapData.StartPosition.y - 3, "ShadyQuest").AI = "guard"; + KinkyDungeonMapSet(KDMapData.StartPosition.x + 12, KDMapData.StartPosition.y - 3, '2'); + KinkyDungeonTilesSet((KDMapData.StartPosition.x + 12) + ',' + (KDMapData.StartPosition.y - 3), {OL: true}); + + + + DialogueCreateEnemy(KDMapData.StartPosition.x + 4, KDMapData.StartPosition.y - 3, "AntiqueQuest").AI = "guard"; + KinkyDungeonMapSet(KDMapData.StartPosition.x + 4, KDMapData.StartPosition.y - 3, '2'); + KinkyDungeonTilesSet((KDMapData.StartPosition.x + 4) + ',' + (KDMapData.StartPosition.y - 3), {OL: true}); + + if (KDRandom() < 0.1 * KDGameData.HighestLevel) + SetpieceSpawnPrisoner(KDMapData.StartPosition.x + 9, KDMapData.StartPosition.y); + + // Normal end stairs + KinkyDungeonMapSet(b1*2 - 1, VisitedRooms[0].y*2 - 4, 's'); + if (MiniGameKinkyDungeonLevel == 0) + KinkyDungeonTilesSet("" + (b1*2 + 7) + "," + (VisitedRooms[0].y*2), {RoomType: MiniGameKinkyDungeonLevel > 0 ? "" : "JourneyFloor"}); + + KDMapData.EndPosition = {x: b1*2 - 1, y: VisitedRooms[0].y*2 - 4}; + + +} + +function KinkyDungeonCreateGoldVault(_POI: any, VisitedRooms: any[], _width: number, height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + // Variable setups + + KDMapData.StartPosition = {x: 15, y: 2 + 7 * 4}; + KDMapData.EndPosition = {x: KDMapData.StartPosition.x, y: KDMapData.StartPosition.y}; + VisitedRooms[0].x = 1; + VisitedRooms[0].y = Math.floor(height/2); + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + + KD_PasteTile(KDMapTilesList.GoldVault, KDMapData.StartPosition.x - 7 - 3, KDMapData.StartPosition.y - 7 * 3, data); + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + //KinkyDungeonMapSet(KDMapData.StartPosition.x, KDMapData.StartPosition.y - 3, '6'); +} + + +function KinkyDungeonCreateElevatorRoom(_POI: any, VisitedRooms: any[], _width: number, height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + // Variable setup + + KDMapData.StartPosition = {x: 15, y: 2 + 7 * 4}; + KDMapData.EndPosition = {x: KDMapData.StartPosition.x, y: KDMapData.StartPosition.y}; + VisitedRooms[0].x = 1; + VisitedRooms[0].y = Math.floor(height/2); + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + + KD_PasteTile(KDMapTilesList.ElevatorRoom, KDMapData.StartPosition.x - 7 - 3, KDMapData.StartPosition.y - 7 * 4, data); + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + let dlist = KDElevatorHallEnemies.filter((dragon) => { + return (!dragon.minfloor || MiniGameKinkyDungeonLevel >= dragon.minfloor) && (!dragon.maxfloor || MiniGameKinkyDungeonLevel <= dragon.maxfloor); + }); + let def = dlist[Math.floor(KDRandom() * dlist.length)]; + let obstacles: Record = {} + if (def) { + if (!def.enemy) def.enemy = "DragonGirlCrystal"; + let en = DialogueCreateEnemy(15,2 + 7,def.enemy); + if (def.obstacles) + obstacles = def.obstacles; + if (en) { + if (def.faction) en.faction = def.faction; + KinkyDungeonSetEnemyFlag(en, "leader", -1); + KDRunCreationScript(en, KDGetCurrentLocation()); + } + } + + + let obsSlots = []; + for (let xx = 1; xx < KDMapData.GridWidth - 1; xx++) { + for (let yy = 1; yy < KDMapData.GridHeight - 2; yy++) { + if (KinkyDungeonMapGet(xx, yy) == '0' + //&& ((xx % 2 == 0 && yy % 2 == 1) || (xx % 2 == 1 && yy % 2 == 0)) // Enforce checkerboard pattern + && ( + (KinkyDungeonMapGet(xx-1, yy ) == '0' && KinkyDungeonMapGet(xx, yy-1 ) == '0' + && KinkyDungeonMapGet(xx+1, yy ) == '1' && KinkyDungeonMapGet(xx, yy+1 ) == '1') + || + (KinkyDungeonMapGet(xx+1, yy ) == '0' && KinkyDungeonMapGet(xx, yy+1 ) == '0' + && KinkyDungeonMapGet(xx-1, yy ) == '1' && KinkyDungeonMapGet(xx, yy-1 ) == '1') + || + (KinkyDungeonMapGet(xx+1, yy ) == '0' && KinkyDungeonMapGet(xx, yy-1 ) == '0' + && KinkyDungeonMapGet(xx-1, yy ) == '1' && KinkyDungeonMapGet(xx, yy+1 ) == '1') + || + (KinkyDungeonMapGet(xx+1, yy ) == '0' && KinkyDungeonMapGet(xx, yy-1 ) == '0' + && KinkyDungeonMapGet(xx-1, yy ) == '1' && KinkyDungeonMapGet(xx, yy+1 ) == '1') + || + (KinkyDungeonMapGet(xx-1, yy ) == '0' && KinkyDungeonMapGet(xx, yy-1 ) == '0' + && KinkyDungeonMapGet(xx+1, yy ) == '0' && KinkyDungeonMapGet(xx, yy+1 ) == '1') + || + (KinkyDungeonMapGet(xx+1, yy ) == '0' && KinkyDungeonMapGet(xx, yy+1 ) == '0' + && KinkyDungeonMapGet(xx-1, yy ) == '1' && KinkyDungeonMapGet(xx, yy-1 ) == '0') + || + (KinkyDungeonMapGet(xx+1, yy ) == '1' && KinkyDungeonMapGet(xx, yy-1 ) == '0' + && KinkyDungeonMapGet(xx-1, yy ) == '0' && KinkyDungeonMapGet(xx, yy+1 ) == '0') + || + (KinkyDungeonMapGet(xx+1, yy ) == '0' && KinkyDungeonMapGet(xx, yy-1 ) == '1' + && KinkyDungeonMapGet(xx-1, yy ) == '0' && KinkyDungeonMapGet(xx, yy+1 ) == '0') + || + (KinkyDungeonMapGet(xx+1, yy ) == '0' && KinkyDungeonMapGet(xx, yy-1 ) == '0' + && KinkyDungeonMapGet(xx-1, yy ) == '0' && KinkyDungeonMapGet(xx, yy+1 ) == '0') + )) { + obsSlots.push({x: xx, y:yy}); + } + } + } + for (let i = 0; i < obsSlots.length / 8 && obsSlots.length > 0; i++) { + let index = Math.floor(KDRandom() * obsSlots.length); + let slot = obsSlots[index]; + obsSlots.splice(index, 1); + if (!KinkyDungeonEnemyAt(slot.x, slot.y)) { + let o = KDGetByWeight(obstacles); + if (o) { + let en = DialogueCreateEnemy(slot.x, slot.y, o); + + if (def.faction) en.faction = def.faction; + KDRunCreationScript(en, KDGetCurrentLocation()); + } + + } + } + + let faceSlots = []; + for (let xx = 1; xx < KDMapData.GridWidth - 1; xx++) { + for (let yy = 1; yy < KDMapData.GridHeight - 2; yy++) { + if (KinkyDungeonMapGet(xx, yy) == '1' && KinkyDungeonMapGet(xx, yy + 1) == '0') { + faceSlots.push({x: xx, y:yy}); + } + } + } + for (let i = 0; i < 3 && faceSlots.length > 0; i++) { + let index = Math.floor(KDRandom() * faceSlots.length); + let slot = faceSlots[index]; + faceSlots.splice(index, 1); + KinkyDungeonMapSet(slot.x, slot.y, '6'); + KinkyDungeonTilesSet((slot.x) + ',' + (slot.y), { + Type: "Oriel", + Skin: "Viewscreen", + Light: 4, + lightColor: 0x99ff99, + }); + } + + KinkyDungeonMapSet(KDMapData.StartPosition.x, KDMapData.StartPosition.y - 3, '6'); + KinkyDungeonTilesSet((KDMapData.StartPosition.x) + ',' + (KDMapData.StartPosition.y - 3), { + Type: "Elevator", + Overlay: "ElevatorDisabled", + }); + if (!KinkyDungeonFlags.get("tut_elevator")) { + KinkyDungeonSetFlag("tut_elevator", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Elevator"), KDTutorialColor, 10); + } +} + + +function KinkyDungeonCreateElevatorEgyptian(_POI: any, VisitedRooms: any[], _width: number, height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + // Variable setup + + KDMapData.StartPosition = {x: 15, y: 2 + 7 * 4}; + KDMapData.EndPosition = {x: KDMapData.StartPosition.x, y: KDMapData.StartPosition.y}; + VisitedRooms[0].x = 1; + VisitedRooms[0].y = Math.floor(height/2); + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + + KD_PasteTile(KDMapTilesList.ElevatorEgyptian, KDMapData.StartPosition.x - 7 - 3, KDMapData.StartPosition.y - 7 * 4, data); + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + DialogueCreateEnemy(15,3,"MummyElevator"); + + KinkyDungeonMapSet(KDMapData.StartPosition.x, KDMapData.StartPosition.y - 3, '6'); + KinkyDungeonTilesSet((KDMapData.StartPosition.x) + ',' + (KDMapData.StartPosition.y - 3), { + Type: "Elevator", + Overlay: "ElevatorDisabled", + }); + if (!KinkyDungeonFlags.get("tut_elevator")) { + KinkyDungeonSetFlag("tut_elevator", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Elevator"), KDTutorialColor, 10); + } +} + + +function KinkyDungeonCreateElevatorEgyptian2(_POI: any, VisitedRooms: any[], _width: number, height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + // Variable setup + + KDMapData.StartPosition = {x: 15, y: 2 + 7 * 4}; + KDMapData.EndPosition = {x: KDMapData.StartPosition.x, y: KDMapData.StartPosition.y}; + VisitedRooms[0].x = 1; + VisitedRooms[0].y = Math.floor(height/2); + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + + KD_PasteTile(KDMapTilesList.ElevatorEgyptian2, KDMapData.StartPosition.x - 7 - 3, KDMapData.StartPosition.y - 7 * 4, data); + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + DialogueCreateEnemy(15,3,"MummyElevator"); + + KinkyDungeonMapSet(KDMapData.StartPosition.x, KDMapData.StartPosition.y - 3, '6'); + KinkyDungeonTilesSet((KDMapData.StartPosition.x) + ',' + (KDMapData.StartPosition.y - 3), { + Type: "Elevator", + Overlay: "ElevatorDisabled", + }); + if (!KinkyDungeonFlags.get("tut_elevator")) { + KinkyDungeonSetFlag("tut_elevator", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Elevator"), KDTutorialColor, 10); + } +} + +function KinkyDungeonCreateTestTile(_POI: any, VisitedRooms: any[], width: number, height: number, _openness: number, _density: number, _hallopenness: number, data: any) { + // Variable setup + + KDMapData.StartPosition = {x: 2, y: height}; + VisitedRooms[0].x = 1; + VisitedRooms[0].y = Math.floor(height/2); + + KinkyDungeonCreateRectangle(0, 0, width, height, false, false, false, false); + + let b1 = 4; + + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + KD_PasteTile(KDTileToTest, KDMapData.StartPosition.x + 4, 3, data); + + + KDMapData.EndPosition = {x: b1*2 + 5, y: VisitedRooms[0].y*2}; +} + + +function KinkyDungeonCreateTutorial(_POI: any, VisitedRooms: any[], width: number, height: number, _openness: number, _density: number, _hallopenness: number, _data: any) { + // Variable setup + + KDMapData.StartPosition = {x: 2, y: height}; + VisitedRooms[0].x = 1; + VisitedRooms[0].y = Math.floor(height/2); + + KinkyDungeonCreateRectangle(0, 0, width, height, true, true, false, false); + + KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y - 1, 2, 2, false, false, false, false); + KinkyDungeonCreateRectangle(VisitedRooms[0].x, VisitedRooms[0].y, width, 1, false, false, false, false); + + + /* + // Add the prison + let py = (VisitedRooms[0].y < height - 5 ? height - 3 : 3); + POI.push({x: 2*VisitedRooms[0].x + 4, y: 2*py, requireTags: [], favor: ["GuaranteedCell"], used: false}); + KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false); + KinkyDungeonCreateRectangle(VisitedRooms[0].x, Math.min(py, VisitedRooms[0].y), b2-2, 1, false, false, false, false); + KinkyDungeonCreateRectangle(b2, Math.min(py, VisitedRooms[0].y), 1, Math.abs(VisitedRooms[0].y - py), false, false, false, false);*/ + + + // Now we STRETCH the map + let KinkyDungeonOldGrid = KDMapData.Grid; + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + KinkyDungeonOldGrid[Math.floor(X * w / KDMapData.GridWidth) + Math.floor(Y * h / KDMapData.GridHeight)*(w+1)]; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + // Normal end stairs + KinkyDungeonMapSet(width*2 - 2, VisitedRooms[0].y*2, 's'); + KinkyDungeonMapSet(width*2 - 2, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (width*2 - 2) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "TutorialCongrats"}); + + // Tutorial start + KinkyDungeonMapSet(VisitedRooms[0].x + 3, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x + 3) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial0"}); + + // Barrels + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + 7, 3, 2, height*2, false, false, false, false); + KinkyDungeonMapSet(VisitedRooms[0].x + 7, VisitedRooms[0].y*2, 'L'); + KinkyDungeonMapSet(VisitedRooms[0].x + 7, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x + 7) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Dialogue: "Tutorial1"}); + + // Stats + KinkyDungeonMapSet(VisitedRooms[0].x + 11, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x + 11) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2"}); + + // SP + let xx = 13; + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx + 4, 3, 2, 2, false, false, false, false); + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx + 4, 3, 1, 5, false, false, false, false); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx + 4, 5, 'd'); + KinkyDungeonTilesSet((KDMapData.StartPosition.x + xx + 4) + "," + 5, { + Type: "Door", + }); + KDMapData.GroundItems.push({x:KDMapData.StartPosition.x + xx + 4, y:4, name: "PotionWill"}); + + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx, 3, 2, 2, false, false, false, false); + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx, 3, 1, 5, false, false, false, false); + KDMapData.GroundItems.push({x:KDMapData.StartPosition.x + xx, y:4, name: "PotionWill"}); + KinkyDungeonMapSet(VisitedRooms[0].x + xx + 1, 5, 'T'); + KinkyDungeonTilesSet((VisitedRooms[0].x + xx + 1) + "," + 5, { + Type: "Trap", + Trap: "SpecificSpell", + noVary: true, + Spell: "TrapSCloud", + }); + KinkyDungeonMapSet(VisitedRooms[0].x + xx + 3, VisitedRooms[0].y*2, 'T'); + KinkyDungeonTilesSet((VisitedRooms[0].x + xx + 3) + "," + (VisitedRooms[0].y*2), { + Type: "Trap", + Trap: "SpecificSpell", + noVary: true, + Spell: "TrapSCloud", + }); + KinkyDungeonMapSet(VisitedRooms[0].x + xx + 3, VisitedRooms[0].y*2 + 1, 'T'); + KinkyDungeonTilesSet((VisitedRooms[0].x + xx + 3) + "," + (VisitedRooms[0].y*2 + 1), { + Type: "Trap", + Trap: "SpecificSpell", + noVary: true, + Spell: "TrapSCloud", + }); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx - 1, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx - 1) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_sp1"}); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx + 1, 3, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx + 1) + "," + (3), {Type: "Ghost", Msg: "Tutorial2_sp2"}); + KinkyDungeonMapSet(VisitedRooms[0].x + xx + 4, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (VisitedRooms[0].x + xx + 4) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_sp3"}); + + + // MP + xx = 22; + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx, 3, 2, 2, false, false, false, false); + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx, 3, 1, 5, false, false, false, false); + KDMapData.GroundItems.push({x:KDMapData.StartPosition.x + xx, y:4, name: "PotionMana"}); + KinkyDungeonMapSet(VisitedRooms[0].x + xx + 1, 5, 'd'); + KinkyDungeonTilesSet((VisitedRooms[0].x + xx + 1) + "," + 5, { + Type: "Door", + }); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx - 5, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx - 5) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_mp1"}); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx - 3, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx - 3) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_mp2"}); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx - 1, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx - 1) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Dialogue: "Tutorial2_mp3"}); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx + 2, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx + 2) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_mp4"}); + + + // DP + xx = 28; + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx, 3, 7, 2, false, false, false, false); + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx, 3, 1, 5, false, false, false, false); + KDMapData.GroundItems.push({x:KDMapData.StartPosition.x + xx, y:4, name: "PotionFrigid"}); + KinkyDungeonMapSet(VisitedRooms[0].x + xx + 1, 5, 'T'); + KinkyDungeonTilesSet((VisitedRooms[0].x + xx + 1) + "," + 5, { + Type: "Trap", + Trap: "SpecificSpell", + noVary: true, + Spell: "TrapLustCloud", + }); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx - 1, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx - 1) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial2_dp1"}); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx + 1, 3, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx + 1) + "," + (3), {Type: "Ghost", Dialogue: "Tutorial2_dp2"}); + + + // Struggle + xx = 36; + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx, 3, 5, 2, false, false, false, false); + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx, 3, 1, 5, false, false, false, false); + KDMapData.GroundItems.push({x:KDMapData.StartPosition.x + xx + 4, y:4, name: "RedKey"}); + + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx - 1, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx - 1) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial3_1"}); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx + 4, 3, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx + 4) + "," + (3), {Type: "Ghost", Msg: "Tutorial3_2"}); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx + 1, 3, 'C'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx + 1) + "," + (3), {Loot: "tutorial1", Roll: KDRandom()}); + + // Struggle + xx = 43; + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx, 3, 5, 2, false, false, false, false); + KinkyDungeonCreateRectangle(KDMapData.StartPosition.x + xx, 3, 1, 5, false, false, false, false); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx + 4, 4, '?'); + + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx - 1, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx - 1) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial3_3"}); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx + 4, 3, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx + 4) + "," + (3), {Type: "Ghost", Msg: "Tutorial3_4"}); + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx, 3, 'C'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx) + "," + (3), {Loot: "tutorial2", Roll: KDRandom()}); + + // END + + + KinkyDungeonMapSet(KDMapData.StartPosition.x + xx + 4, VisitedRooms[0].y*2 + 1, 'G'); + KinkyDungeonTilesSet("" + (KDMapData.StartPosition.x + xx + 4) + "," + (VisitedRooms[0].y*2 + 1), {Type: "Ghost", Msg: "Tutorial4"}); + + DialogueCreateEnemy(width*2 - 7, VisitedRooms[0].y*2, "FastZombie").AI = "guard"; + DialogueCreateEnemy(width*2 - 5, VisitedRooms[0].y*2 + 1, "FastZombie").AI = "guard"; + DialogueCreateEnemy(width*2 - 3, VisitedRooms[0].y*2, "FastZombie").AI = "guard"; + DialogueCreateEnemy(width*2 - 3, VisitedRooms[0].y*2 + 1, "BlindZombie").AI = "guard"; + + KinkyDungeonMapSet(width*2 - 5, VisitedRooms[0].y*2, 'C'); + KinkyDungeonTilesSet("" + (width*2 - 5) + "," + (VisitedRooms[0].y*2), {Loot: "silver", Roll: KDRandom()}); + KinkyDungeonMapSet(width*2 - 6, VisitedRooms[0].y*2, 'C'); + KinkyDungeonTilesSet("" + (width*2 - 6) + "," + (VisitedRooms[0].y*2), {Loot: "chest", Roll: KDRandom()}); + + KDMapData.EndPosition = {x: width*2 - 2, y: VisitedRooms[0].y*2}; + KinkyDungeonTilesSet("" + (width*2 - 2) + "," + (VisitedRooms[0].y*2), {RoomType: "ShopStart"}); +} diff --git a/Game/src/map/KinkyDungeonBoss.ts b/Game/src/map/KinkyDungeonBoss.ts new file mode 100644 index 000000000..7a09319a8 --- /dev/null +++ b/Game/src/map/KinkyDungeonBoss.ts @@ -0,0 +1,120 @@ +"use strict"; + +interface AltTypeBoss extends AltType { + boss: string, + bossroom: true, +} + +let bosses: Record = { + "Fuuka": { + name: "Fuuka", + boss: "Fuuka", + bossroom: true, + width: 13, + height: 13, + setpieces: { + "GuaranteedCell": 1000, + "FuukaAltar": 1000, + }, + genType: "Chamber", + spawns: false, + chests: false, + shrines: false, + chargers: true, + torches: true, + heart: false, + specialtiles: true, + shortcut: false, + enemies: false, + nokeys: true, + nojail: false, + makeMain: true, + noQuests: true, + escapeMethod: "Boss", + forceCheckpoint: "grv", + noLeave: true, + }, + + "Dollmaker": { + name: "Dollmaker", + boss: "Dollmaker", + bossroom: true, + jailType: "Dollsmith", + guardType: "Dollsmith", + width: 21, + height: 21, + setpieces: { + }, + genType: "Dollmaker", + musicParams: "Dollmaker", + spawns: false, + chests: false, + shrines: false, + noWear: true, + chargers: false, + notorches: true, + heart: false, + specialtiles: true, + shortcut: false, + enemies: false, + nokeys: true, + nojail: true, + noClutter: true, + nostairs: true, + nostartstairs: true, + nobrick: true, + nolore: true, + skin: 'bel', + noboring: true, // Skip generating boringness + makeMain: true, + noQuests: true, + escapeMethod: "Boss", + forceCheckpoint: "bel", + noLeave: true, + }, + "TheWarden": { + name: "TheWarden", + boss: "TheWarden", + bossroom: true, + jailType: "Warden", + guardType: "Warden", + width: 21, + height: 21, + setpieces: { + }, + genType: "Warden", + spawns: false, + chests: false, + shrines: false, + noWear: true, + chargers: false, + notorches: true, + heart: false, + specialtiles: true, + shortcut: false, + enemies: false, + nokeys: true, + nojail: true, + noClutter: true, + nostairs: true, + nostartstairs: true, + nobrick: true, + nolore: true, + skin: 'cat', + noboring: true, // Skip generating boringness + makeMain: true, + noQuests: true, + escapeMethod: "Boss", + forceCheckpoint: "cat", + noLeave: true, + }, +}; + +function KinkyDungeonBossFloor(Floor: number): AltTypeBoss { + if (Floor == 4) return bosses.Fuuka; + if (Floor == 8) return bosses.TheWarden; + //if (Floor == 12) return bosses.SilverWitch; + if (Floor == 20) return bosses.Dollmaker; + //if (Floor == 20) return bosses.Rana; + return null; +} diff --git a/Game/src/map/KinkyDungeonEditor.ts b/Game/src/map/KinkyDungeonEditor.ts new file mode 100644 index 000000000..76b4c3f67 --- /dev/null +++ b/Game/src/map/KinkyDungeonEditor.ts @@ -0,0 +1,1512 @@ +"use strict"; + + +let KDMapTilesListEditor: Record = localStorage.getItem("KDMapTilesListEditor") ? JSON.parse(localStorage.getItem("KDMapTilesListEditor")) : Object.assign({}, KDMapTilesList); + +let KDTileToTest = null; + +// localStorage.setItem("KDMapTilesListEditor", JSON.stringify(KDMapTilesList)) + +function KDInitTileEditor() { + KDTE_Create(1, 1); +} + +let KDEditorTileIndex = 'lr'; +let KDEditorTileFlex = ""; +let KDEditorTileFlexSuper = ""; + +let KDEditorTileIndexQuery = '1,1'; + +let KDEditorTileIndexStore: Record = { + "1,1": 'lr', +}; +let KDEditorTileFlexStore: Record = { +}; +let KDEditorTileFlexSuperStore: Record = { +}; + +let KDEditorCurrentMapTileName = 'test'; +let KDEditorCurrentMapTile = null; + +let KDTileIndices = { + 'udlr': true, + 'u': true, + 'd': true, + 'l': true, + 'r': true, + 'ud': true, + 'lr': true, + 'ul': true, + 'ur': true, + 'dl': true, + 'dr': true, + 'udl': true, + 'udr': true, + 'dlr': true, + 'ulr': true, +}; + +let KDEditorTileIndexHover = ''; +let KDEditorTileNameIndex = 0; + +let KDEditorTileBrush = 'Clear'; +let KDEditorTileBrushIndex = 0; +let KDEditorTileBrushIndex2 = 0; + +let KDTilePalette = { + 'Clear': {type: "clear", tile: '0'}, + 'Wall': {type: "tile", tile: '1'}, + 'WallReinforced': {type: "tile", tile: 'f'}, + '----Spawns----': {type: "none"}, + 'Spawn': {type: "tile", tile: 'G', special: {Type: "Spawn", required: []}}, + 'SpawnGuard': {type: "tile", tile: 'G', special: {Type: "Spawn", required: [], AI: "guard"}}, + 'Prisoner': {type: "tile", tile: 'G', special: {Type: "Prisoner"}}, + 'SpawnLooseGuard': {type: "tile", tile: 'G', special: {Type: "Spawn", required: [], AI: "looseguard"}}, + 'SpawnMiniboss': {type: "tile", tile: 'G', special: {Type: "Spawn", required: ["miniboss"], AI: "guard"}}, + 'SpawnBoss': {type: "tile", tile: 'G', special: {Type: "Spawn", required: ["boss"], AI: "guard"}}, + '----SpecifcSpawns----': {type: "none"}, + 'SpawnStatue': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["statue"], Label: "Statue", tags: ["statue", "open"]}}, + 'SpawnStatueRare': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["statue"], Label: "Statue", tags: ["statue", "open"], Chance: 0.4}}, + 'SpawnObstacleDoor': {type: "tile", tile: 'G', special: {Type: "ForceSpawn", required: ["obstacledoor"], tags: ["obstacletile"], Label: "Door"}}, + 'SpawnSoulCrys': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["soul"], tags: ["soul", "open"], Label: "SoulC"}}, + 'SpawnSoulCrysActive': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["soul", "active"], tags: ["soul", "open"], Label: "SoulC_A"}}, + 'SpawnChaosCrysRare': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["chaos", "inactive"], tags: ["chaos", "open"], Label: "ChaosC", Chance: 0.4}}, + 'SpawnChaosCrys': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["chaos"], tags: ["chaos", "open"], Label: "ChaosC"}}, + 'SpawnChaosCrysActive': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["chaos", "active"], tags: ["chaos", "open"], Label: "ChaosC_A"}}, + 'SpawnMushroom': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["mushroom", "scenery"], tags: ["mushroom"], Label: "Mushroom"}}, + 'SpawnMushroomRare': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["mushroom", "scenery"], tags: ["mushroom"], Label: "Mushroom", Chance: 0.4}}, + 'SpawnCustom': {type: "tile", tile: '3', special: {Type: "Spawn", required: [], Label: "Custom"}, customfields: { + required: {type: "array"}, + tags: {type: "array"}, + filterTags: {type: "array"}, + Label: {type: "string"}, + Chance: {type: "number"}, + AI: {type: "string"}, + force: {type: "boolean"}, + faction: {type: "string"}, + levelBoost: {type: "number"}, + forceIndex: {type: "string"}, + }}, + 'ForceSpawnCustom': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: [], Label: "Custom"}, customfields: { + required: {type: "array"}, + tags: {type: "array"}, + filterTags: {type: "array"}, + Label: {type: "string"}, + Chance: {type: "number"}, + AI: {type: "string"}, + force: {type: "boolean"}, + faction: {type: "string"}, + levelBoost: {type: "number"}, + forceIndex: {type: "string"}, + }}, + '----Tiles----': {type: "none"}, + 'Brick': {type: "tile", tile: '2'}, + 'Doodad': {type: "tile", tile: 'X'}, + 'Grate': {type: "tile", tile: 'g'}, + 'Bars': {type: "tile", tile: 'b'}, + 'Bed': {type: "tile", tile: 'B'}, + 'ClamBed': {type: "tile", tile: 'B', special: {Type: "Skin", Skin: "ClamBed"}}, + 'Crack': {type: "tile", tile: '4'}, + 'LatexPipe': {type: "tile", tile: '1', special: {Type: "Skin", Skin: "LatexPipe"}}, + 'LatexThin': {type: "effect", effectTile: "LatexThin"}, + 'LatexThinBlue': {type: "effect", effectTile: "LatexThinBlue"}, + 'LatexThinGreen': {type: "effect", effectTile: "LatexThinGreen"}, + 'Latex': {type: "effect", effectTile: "Latex"}, + 'LatexBlue': {type: "effect", effectTile: "LatexBlue"}, + 'LatexGreen': {type: "effect", effectTile: "LatexGreen"}, + 'WallHook': {type: "tile", tile: ','}, + 'CeilingHook': {type: "tile", tile: '?'}, + '----Deco----': {type: "none"}, + 'Rubble(mend)': {type: "effect", effectTile: "Rubble"}, + 'Rubble(nomend)': {type: "effect", effectTile: "RubbleNoMend"}, + 'Pipe': {type: "tile", tile: '1', special: {Type: "Skin", Skin: "EmptyPipe"}}, + 'InactiveTablet': {type: "tile", tile: 'm'}, + 'BrokenShrine': {type: "tile", tile: 'a'}, + 'BrokenOrb': {type: "tile", tile: 'o'}, + 'BrokenCharger': {type: "tile", tile: '-'}, + 'Dummy0': {type: "tile", tile: 'X', special: {Type: "SkinCode", SkinCode: "0", Skin2: "Dummy0"}}, + 'Dummy1': {type: "tile", tile: 'X', special: {Type: "SkinCode", SkinCode: "0", Skin2: "Dummy1"}}, + 'Dummy2': {type: "tile", tile: 'X', special: {Type: "SkinCode", SkinCode: "0", Skin2: "Dummy2"}}, + '----Doors----': {type: "none"}, + 'Door': {type: "tile", tile: 'd', special: {Type: "Door"}}, + 'DoorAlways': {type: "tile", tile: 'D', special: {Type: "Door", Priority: true, AlwaysClose: true}}, + 'CyberDoor': {type: "tile", tile: 'D', special: {Type: "Door", Priority: true, AlwaysClose: true, Lock: "Cyber", DoorSkin: "Doors/Cyber"}}, + 'Door_RedLock': {type: "tile", tile: 'D', special: {Type: "Door", Priority: true, AlwaysClose: true, Lock: "Red"}}, + 'Door_PurpleLock': {type: "tile", tile: 'D', special: {Type: "Door", Priority: true, AlwaysClose: true, Lock: "Purple"}}, + 'Door_BlueLock': {type: "tile", tile: 'D', special: {Type: "Door", Priority: true, AlwaysClose: true, Lock: "Blue"}}, + 'AutoDoorToggle': {type: "tile", tile: 'Z', special: {Type: "AutoDoor", wireType: "AutoDoor_Toggle"}}, + 'AutoDoorOpenToggle': {type: "tile", tile: 'z', special: {Type: "AutoDoor", wireType: "AutoDoor_Toggle"}}, + 'AutoDoorHoldOpen': {type: "tile", tile: 'Z', special: {Type: "AutoDoor", wireType: "AutoDoor_HoldOpen", Label: "HoldOpen"}}, + 'AutoDoorHoldClosed': {type: "tile", tile: 'Z', special: {Type: "AutoDoor", wireType: "AutoDoor_HoldClosed", Label: "HoldClosed"}}, + 'AutoDoorOpen': {type: "tile", tile: 'Z', special: {Type: "AutoDoor", wireType: "AutoDoor_Open", Label: "Open"}}, + 'AutoDoorClose': {type: "tile", tile: 'z', special: {Type: "AutoDoor", wireType: "AutoDoor_Close", Label: "Open"}}, + '----Furniture----': {type: "none"}, + 'Table': {type: "tile", tile: 'F', special: {Type: "Table"}}, + 'TableFood': {type: "tile", tile: 'F', special: {Type: "Table", Food: "Plate"}}, + 'Rubble': {type: "tile", tile: 'R', special: {Type: "Rubble"}}, + 'Sharp': {type: "tile", tile: '/', special: {Type: "Debris"}}, + 'SharpAlways': {type: "tile", tile: '/', special: {Type: "Debris", Always: true}}, + 'Barrel': {type: "tile", tile: 'L', special: {Type: "Barrel"}}, + 'BarrelAlways': {type: "tile", tile: 'L', special: {Type: "Barrel", Always: true}}, + 'Cage': {type: "tile", tile: 'L', special: {Type: "Cage", Furniture: "Cage"}, jail: {type: "furniture", radius: 1}}, + 'FutureBox': {type: "tile", tile: 'L', special: {Type: "Furniture", Furniture: "FutureBox", }, jail: {type: "furniture", radius: 1}}, + 'FutureBoxStorage': {type: "tile", tile: 'L', special: {Type: "Furniture", Furniture: "FutureBox", jail: {type: "storage", radius: 1}}, jail: {type: "storage", radius: 1}}, + 'DisplayStand': {type: "tile", tile: 'L', special: {Type: "Furniture", Furniture: "DisplayStand"}, jail: {type: "furniture", radius: 1}}, + 'LatexDisplayStand': {type: "tile", tile: 'L', special: {Type: "Furniture", Furniture: "LatexDisplayStand"}, jail: {type: "furniture", radius: 1}}, + 'DisplayEgyptian': {type: "tile", tile: 'L', special: {Type: "Furniture", Furniture: "DisplayEgyptian"}, jail: {type: "furniture", radius: 1}}, + 'IceBase': {type: "tile", tile: 'L', special: {Type: "Furniture", Furniture: "IceBase"}, jail: {type: "furniture", radius: 1}}, + 'CrystalBase': {type: "tile", tile: 'L', special: {Type: "Furniture", Furniture: "CrystalBase"}, jail: {type: "furniture", radius: 1}}, + 'VineBase': {type: "tile", tile: 'L', special: {Type: "Furniture", Furniture: "VineBase"}, jail: {type: "furniture", radius: 1}}, + 'ShadowBase': {type: "tile", tile: 'L', special: {Type: "Furniture", Furniture: "ShadowBase"}, jail: {type: "furniture", radius: 1}}, + 'Sarco': {type: "tile", tile: 'L', special: {Type: "Furniture", Furniture: "Sarcophagus"}, jail: {type: "furniture", radius: 1}}, + '----Chests----': {type: "none"}, + 'Chest': {type: "tile", tile: 'C', special: {Type: "Chest"}}, + 'ChestRed': {type: "tile", tile: 'C', special: {Type: "Chest", Lock: "Red"}}, + 'ChestBlue': {type: "tile", tile: 'C', special: {Type: "Chest", Lock: "Blue"}}, + 'ChestOrShrine': {type: "tile", tile: 'O', special: {Type: "ChestOrShrine"}}, + 'HighPriorityChest': {type: "tile", tile: 'C', special: {Priority: true}}, + 'SilverChest': {type: "tile", tile: 'C', special: {Type: "Chest", Loot: "silver", Priority: true}}, + 'StorageChest': {type: "tile", tile: 'C', special: {Type: "Chest", Loot: "storage", Chance: 0.8, refill: true,}}, + 'KinkyChest': {type: "tile", tile: 'C', special: {Type: "Chest", Loot: "kinky", Chance: 0.8, refill: true,}}, + 'ChestCustom': {type: "tile", tile: 'C', special: {Type: "Chest", Loot: "storage"}, customfields: { + Loot: {type: "string"}, + Faction: {type: "string"}, + NoTrap: {type: "boolean"}, + lootTrap: {type: "string"}, + Lock: {type: "string"}, + Priority: {type: "boolean"}, + }}, + 'GuardedChest': {type: "tile", tile: 'C', special: {Type: "GuardedChest", Label: "Guarded"}}, + 'GuardedChestLocked': {type: "tile", tile: 'C', special: {Type: "GuardedChest", Lock: "Red", Label: "Guarded"}}, + '----Shrines----': {type: "none"}, + 'Shrine': {type: "tile", tile: 'A', special: {Type: "Shrine", Name: "Metal"}}, + 'HighPriorityShrine': {type: "tile", tile: 'A', special: {Type: "Shrine", Name: "Will", Priority: true}}, + '----Hazards----': {type: "none"}, + 'SpikeTrap': {type: "effect", effectTile: "SpikeTrap"}, + 'Trap': {type: "tile", tile: 'T', special: {Type: "Trap", Always: true,}}, + 'PotentialTrap': {type: "tile", tile: 'T', special: {Type: "Trap"}}, + '----Conveyors----': {type: "none"}, + 'ConveyorUp': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Up", DX: 0, DY: -1,}}, + 'ConveyorDown': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Down", DX: 0, DY: 1,}}, + 'ConveyorLeft': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Left", DX: -1, DY: 0,}}, + 'ConveyorRight': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Right", DX: 1, DY: 0,}}, + 'SafetyConveyorUp': {type: "tile", tile: 'v', special: {Type: "SafetyConveyor", Sprite: "Conveyor/SafetyUp", DX: 0, DY: -1,}}, + 'SafetyConveyorDown': {type: "tile", tile: 'v', special: {Type: "SafetyConveyor", Sprite: "Conveyor/SafetyDown", DX: 0, DY: 1,}}, + 'SafetyConveyorLeft': {type: "tile", tile: 'v', special: {Type: "SafetyConveyor", Sprite: "Conveyor/SafetyLeft", DX: -1, DY: 0,}}, + 'SafetyConveyorRight': {type: "tile", tile: 'v', special: {Type: "SafetyConveyor", Sprite: "Conveyor/SafetyRight", DX: 1, DY: 0,}}, + 'ConveyorUpOn': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Up", DX: 0, DY: -1, wireType: "Conveyor_Toggle", SwitchMode: "On"}}, + 'ConveyorDownOn': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Down", DX: 0, DY: 1, wireType: "Conveyor_Toggle", SwitchMode: "On"}}, + 'ConveyorLeftOn': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Left", DX: -1, DY: 0, wireType: "Conveyor_Toggle", SwitchMode: "On"}}, + 'ConveyorRightOn': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Right", DX: 1, DY: 0, wireType: "Conveyor_Toggle", SwitchMode: "On"}}, + 'ConveyorUpOff': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Up", DX: 0, DY: -1, wireType: "Conveyor_Toggle", SwitchMode: "Off"}}, + 'ConveyorDownOff': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Down", DX: 0, DY: 1, wireType: "Conveyor_Toggle", SwitchMode: "Off"}}, + 'ConveyorLeftOff': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Left", DX: -1, DY: 0, wireType: "Conveyor_Toggle", SwitchMode: "Off"}}, + 'ConveyorRightOff': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Right", DX: 1, DY: 0, wireType: "Conveyor_Toggle", SwitchMode: "Off"}}, + 'ConveyorUpSwitch': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Up", DX: 0, DY: -1, wireType: "Conveyor_Switch", SwitchMode: "Switch"}}, + 'ConveyorDownSwitch': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Down", DX: 0, DY: 1, wireType: "Conveyor_Switch", SwitchMode: "Switch"}}, + 'ConveyorLeftSwitch': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Left", DX: -1, DY: 0, wireType: "Conveyor_Switch", SwitchMode: "Switch"}}, + 'ConveyorRightSwitch': {type: "tile", tile: 'V', special: {Type: "Conveyor", Sprite: "Conveyor/Right", DX: 1, DY: 0, wireType: "Conveyor_Switch", SwitchMode: "Switch"}}, + '----Machines----': {type: "none"}, + 'DollSupply': {type: "tile", tile: 'u', special: {Type: "DollSupply"}}, + 'DollSupplyManual': {type: "tile", tile: 'u', special: {Type: "DollSupply", count: 0, wireType: "increment", rate: 3}}, + 'DollTerminal': {type: "tile", tile: 't', special: {Type: "DollTerminal"}}, + 'BondageMachineLatex': {type: "tile", tile: 'N', special: {Type: "BondageMachine", Binding: "Latex"}}, + 'BondageMachinePlug': {type: "tile", tile: 'N', special: {Type: "BondageMachine", Binding: "Plug"}}, + 'BondageMachineChastity': {type: "tile", tile: 'N', special: {Type: "BondageMachine", Binding: "Chastity"}}, + 'BondageMachineTape': {type: "tile", tile: 'N', special: {Type: "BondageMachine", Binding: "Tape"}}, + 'BondageMachineMetal': {type: "tile", tile: 'N', special: {Type: "BondageMachine", Binding: "Metal"}}, + 'BondageMachineDoll': {type: "tile", tile: 'N', special: {Type: "BondageMachine", Binding: "Doll"}}, + 'DollDropoffU': {type: "tile", tile: '5', special: {Type: "DollDropoff", Sprite: "Floor", Overlay: "DollDropoff", direction: {x: 0, y:-1}}}, + 'DollDropoffD': {type: "tile", tile: '5', special: {Type: "DollDropoff", Sprite: "Floor", Overlay: "DollDropoffD", direction: {x: 0, y:1}}}, + 'DollDropoffR': {type: "tile", tile: '5', special: {Type: "DollDropoff", Sprite: "Floor", Overlay: "DollDropoffR", direction: {x: 1, y:0}}}, + 'DollDropoffL': {type: "tile", tile: '5', special: {Type: "DollDropoff", Sprite: "Floor", Overlay: "DollDropoffL", direction: {x: -1, y:0}}}, + '----Signals----': {type: "none"}, + 'Button': {type: "tile", tile: '@'}, + 'Wire': {type: "effect", effectTile: "Wire"}, + 'WireVert': {type: "effect", effectTile: "WireVert"}, + 'WireHoriz': {type: "effect", effectTile: "WireHoriz"}, + 'PressurePlate': {type: "effect", effectTile: "PressurePlate"}, + 'PressurePlateHold': {type: "effect", effectTile: "PressurePlateHold"}, + 'PressurePlateOneUse': {type: "effect", effectTile: "PressurePlateOneUse"}, + 'ManaPlate': {type: "effect", effectTile: "ManaEmpty"}, + 'TeleportPlate': {type: "effect", effectTile: "TeleportPlate"}, + 'NoTeleportPlate': {type: "effect", effectTile: "NoTeleportPlate"}, + 'TeleportPlateMana': {type: "effect", effectTile: "TeleportPlateMana"}, + '----Lighting----': {type: "none"}, + 'Torch': {type: "effect", effectTile: "Torch"}, + 'PotentialTorch': {type: "effect", effectTile: "TorchUnlit"}, + 'PriorityCharger': {type: "tile", tile: '=', special: {Type: "Charger", Priority: true}}, + 'Charger': {type: "tile", tile: '+', special: {Type: "Charger"}}, + 'UnlockedCharger': {type: "tile", tile: '=', special: {Type: "Charger", NoRemove: false}}, + 'MotionLamp': {type: "effect", effectTile: "MotionLamp"}, + '----Misc----': {type: "none"}, + 'POI': {type: "POI"}, + 'OL': {type: "offlimits"}, + 'NW': {type: "NW"}, + 'Jail': {type: "jail"}, + 'JailPoint': {type: "tile", tile: 'o', special: {Type: "JailPoint"}}, + 'Keyring': {type: "Keyring"}, + 'MazeSeed': {type: "MazeSeed", + customfields: { + newest: {type: "number"}, + oldest: {type: "number"}, + scale: {type: "number"}, + branchchance: {type: "number"}, + hbias: {type: "number"}, + vbias: {type: "number"}, + wobble: {type: "number"}, + pillarToDoodad: {type: "boolean"}, + } + }, + 'MazeBlock': {type: "MazeBlock"}, + 'Label': {type: "Label", + customfields: { + name: {type: "string"}, + type: {type: "string"}, + faction: {type: "string"}, + guard: {type: "boolean"}, + interesting: {type: "boolean"}, + } + }, +}; + +function KDGetTileIndexImg(index: string) { + return { + u: index.includes('u'), + d: index.includes('d'), + l: index.includes('l'), + r: index.includes('r'), + }; +} + +let KDTE_State = ""; + +function KDDrawTileEditor() { + + if (KinkyDungeonCanvas) { + + KinkyDungeonContext.fillStyle = "rgba(0,0,0.0,1.0)"; + KinkyDungeonContext.fillRect(0, 0, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height); + KinkyDungeonContext.fill(); + KinkyDungeonCamXLast = KinkyDungeonCamX; + KinkyDungeonCamYLast = KinkyDungeonCamY; + KinkyDungeonCamX = KinkyDungeonPlayerEntity.x - Math.floor(KinkyDungeonGridWidthDisplay/2); + KinkyDungeonCamY = KinkyDungeonPlayerEntity.y - Math.floor(KinkyDungeonGridHeightDisplay/2); + + KDDrawMap(KinkyDungeonCamX, KinkyDungeonCamY, 0, 0, KinkyDungeonCamX, KinkyDungeonCamY, true); + KDDrawEffectTiles(0, 0, KinkyDungeonCamX, KinkyDungeonCamY); + + KinkyDungeonTargetX = Math.round((MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamX; + KinkyDungeonTargetY = Math.round((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamY; + + if (KinkyDungeonTargetX >= 0 && KinkyDungeonTargetX < KDMapData.GridWidth + && KinkyDungeonTargetY >= 0 && KinkyDungeonTargetY < KDMapData.GridHeight) { + KDDraw(kdgameboard, kdpixisprites, "ui_movereticule", KinkyDungeonRootDirectory + "TargetMove.png", + (KinkyDungeonTargetX - KinkyDungeonCamX)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - KinkyDungeonCamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { + zIndex: 100, + }); + } + + // Cull the sprites that werent rendered or updated this frame + for (let sprite of kdpixisprites.entries()) { + if (!kdSpritesDrawn.has(sprite[0]) && sprite[1] && sprite[1].parent == kdgameboard) { + sprite[1].parent.removeChild(sprite[1]); + if (kdprimitiveparams.has(sprite[0])) kdprimitiveparams.delete(sprite[0]); + kdpixisprites.delete(sprite[0]); + delete sprite[1].filters; + sprite[1].destroy(); + } + } + + if (!StandalonePatched) + MainCanvas.drawImage(KinkyDungeonCanvas, canvasOffsetX, canvasOffsetY); + + KDTE_UpdateUI(false); + + if (!KDTE_State) { + DrawButtonKDEx("ToTags", (_bdata) => { + KDTE_State = "Tags"; + return true; + }, true, 20 , 920, 250, 64, 'Edit Tile Tags', "#ffffff"); + KDDrawEditorUI(); + } else { + DrawButtonKDEx("backToBrushes", (_bdata) => { + KDTE_State = ""; + return true; + }, true, 20 , 920, 250, 64, 'Go Back', "#ffffff"); + if (KDTE_State == "Tags") + KDDrawEditorTagsUI(); + } + + + } + + if (KinkyDungeonKeybindingCurrentKey && KinkyDungeonGameKeyDown()) { + if (KinkyDungeonKeybindingCurrentKey) + KDLastKeyTime[KinkyDungeonKeybindingCurrentKey] = CommonTime(); + KinkyDungeonKeybindingCurrentKey = ''; + } +} + +function KDDrawEditorTagsUI() { + +} + +let KDEditorTileBrushIndexVisual = 0; +let KDEditorTileBrushIndex2Visual = 0; +let KDEditorTileNameIndexVisual = 0; + +function KDDrawEditorUI() { + + if (Math.abs(KDEditorTileBrushIndexVisual - KDEditorTileBrushIndex) > 0.5) + KDEditorTileBrushIndexVisual = (KDEditorTileBrushIndexVisual*4 + KDEditorTileBrushIndex) / 5; + if (Math.abs(KDEditorTileBrushIndex2Visual - KDEditorTileBrushIndex2) > 0.5) + KDEditorTileBrushIndex2Visual = (KDEditorTileBrushIndex2Visual*4 + KDEditorTileBrushIndex2) / 5; + if (Math.abs(KDEditorTileNameIndexVisual - KDEditorTileNameIndex) > 0.5) + KDEditorTileNameIndexVisual = (KDEditorTileNameIndexVisual*4 + KDEditorTileNameIndex) / 5; + + + let indexX = (1 + Math.floor(Math.max(0, Math.min(KDMapData.GridWidth-1, KinkyDungeonPlayerEntity.x)) / KDTE_Scale)); + let indexY = (1 + Math.floor(Math.max(0, Math.min(KDMapData.GridHeight-1,KinkyDungeonPlayerEntity.y)) / KDTE_Scale)); + + let yy = 160; + let xx = 100; + let grid = 10; + DrawTextFitKD("Tile Index", xx + grid * 1.5 , yy - 30, 200, "#ffffff"); + KDEditorTileIndexHover = ''; + KDEditorTileIndex = KDEditorTileIndexStore[KDEditorTileIndexQuery]; + KDEditorTileFlex = KDEditorTileFlexStore[KDEditorTileIndexQuery] || ""; + KDEditorTileFlexSuper = KDEditorTileFlexSuperStore[KDEditorTileIndexQuery] || ""; + for (let index of Object.keys(KDTileIndices)) { + let patt = KDGetTileIndexImg(index); + + if (!patt.u && KDEditorTileIndexStore[(indexX)+","+(indexY-1)]) {yy += grid * 5; continue;} + if (!patt.d && KDEditorTileIndexStore[(indexX)+","+(indexY+1)]) {yy += grid * 5; continue;} + if (!patt.l && KDEditorTileIndexStore[(indexX-1)+","+(indexY)]) {yy += grid * 5; continue;} + if (!patt.r && KDEditorTileIndexStore[(indexX+1)+","+(indexY)]) {yy += grid * 5; continue;} + DrawBoxKD(xx + grid, yy, grid, grid, patt.u ? "#ffffff" : "#000000", patt.u); + DrawBoxKD(xx + grid, yy + 2*grid, grid, grid, patt.d ? "#ffffff" : "#000000", patt.d); + DrawBoxKD(xx, yy + grid, grid, grid, patt.l ? "#ffffff" : "#000000", patt.l); + DrawBoxKD(xx + 2*grid, yy + grid, grid, grid, patt.r ? "#ffffff" : "#000000", patt.r); + + if (MouseIn(xx, yy, grid*3, grid*3) || KDEditorTileIndex == index) { + if (KDEditorTileIndex != index) KDEditorTileIndexHover = index; + DrawRectKD(kdcanvas, kdpixisprites, "tileInd" + index, { + Left: xx - 3, + Top: yy - 3, + Width: grid*3 + 8, + Height: grid*3 + 8, + Color: "#ffffff", + LineWidth: 2, + zIndex: 100, + alpha: 0.5, + }); + } + + yy += grid * 5; + } + + DrawButtonKDEx("flextoggle", (_bdata) => { + KDEditorTileFlex = KDEditorTileFlex ? "" : "y"; + if (KDEditorTileFlexStore[KDEditorTileIndexQuery] && !KDEditorTileFlex) { + delete KDEditorTileFlexStore[KDEditorTileIndexQuery]; + } else if (!KDEditorTileFlexStore[KDEditorTileIndexQuery] && KDEditorTileFlex) { + KDEditorTileFlexStore[KDEditorTileIndexQuery] = KDEditorTileFlex; + } + return true; + }, true, 150 , 160, 140, 45, 'Flex', "#ffffff", KDEditorTileFlex ? (KinkyDungeonRootDirectory + "UI/CheckSmall.png") : undefined); + + DrawButtonKDEx("flexsupertoggle", (_bdata) => { + KDEditorTileFlexSuper = KDEditorTileFlexSuper ? "" : "y"; + if (KDEditorTileFlexSuperStore[KDEditorTileIndexQuery] && !KDEditorTileFlexSuper) { + delete KDEditorTileFlexSuperStore[KDEditorTileIndexQuery]; + } else if (!KDEditorTileFlexSuperStore[KDEditorTileIndexQuery] && KDEditorTileFlexSuper) { + KDEditorTileFlexSuperStore[KDEditorTileIndexQuery] = KDEditorTileFlexSuper; + } + return true; + }, true, 150 , 210, 140, 45, 'OpenBorder', "#ffffff", KDEditorTileFlexSuper ? (KinkyDungeonRootDirectory + "UI/CheckSmall.png") : undefined); + + // For later + let tileKeys = Object.keys(KDMapTilesListEditor); + + yy = 220; + xx = 1790; + grid = 40; + let width = 200; + let brushKeys = Object.keys(KDTilePalette); + + DrawButtonKDEx("tilebrushup", (_bdata) => { + if (KDEditorTileBrushIndex == 0) KDEditorTileBrushIndex = brushKeys.length - 4; + else KDEditorTileBrushIndex = Math.max(0, KDEditorTileBrushIndex - 14); + return true; + }, true, xx , yy, width, grid-5, '^', KDEditorTileBrushIndex > 0 ? "#ffffff" : "#888888"); + KDTE_CullIndex(tileKeys, brushKeys); + yy += grid; + for (let i = 0; i < 670/grid; i++) { + let index = i + Math.round(KDEditorTileBrushIndexVisual); + if (index >= brushKeys.length) break; + + DrawButtonKDExScroll("brush" + i, (amount) => { + + KDEditorTileBrushIndex = Math.min(brushKeys.length - 4, KDEditorTileBrushIndex + 3*Math.round(amount/grid)); + KDEditorTileBrushIndex = Math.max(0, KDEditorTileBrushIndex); + }, + (_bdata) => { + KDEditorTileBrush = brushKeys[index]; + return true; + }, true, xx , yy, width, grid-5, brushKeys[index], brushKeys[index] == KDEditorTileBrush ? "#ffffff" : (brushKeys[index].startsWith('-') ? "#77ff77" : "#888888")); + + yy += grid; + } + DrawButtonKDEx("tilebrushdown", (_bdata) => { + if (KDEditorTileBrushIndex >= brushKeys.length - 6) KDEditorTileBrushIndex = 0; + else KDEditorTileBrushIndex = Math.min(brushKeys.length - 4, KDEditorTileBrushIndex + 14); + return true; + }, true, xx , yy, width, grid-5, 'v', KDEditorTileBrushIndex < brushKeys.length - 4 ? "#ffffff" : "#888888"); + + + // Draw the second palette + yy = 220; + xx = 1590; + grid = 40; + + DrawButtonKDEx("tilebrushup2", (_bdata) => { + if (KDEditorTileBrushIndex2 == 0) KDEditorTileBrushIndex2 = brushKeys.length - 4; + else KDEditorTileBrushIndex2 = Math.max(0, KDEditorTileBrushIndex2 - 8); + return true; + }, true, xx , yy, width, grid-5, '^', KDEditorTileBrushIndex2 > 0 ? "#ffffff" : "#888888"); + KDTE_CullIndex(tileKeys, brushKeys); + yy += grid; + for (let i = 0; i < 420/grid; i++) { + let index = i + Math.round(KDEditorTileBrushIndex2Visual); + if (index >= brushKeys.length) break; + + DrawButtonKDExScroll("brush2_" + i, (amount) => { + KDEditorTileBrushIndex2 = Math.min(brushKeys.length - 4, KDEditorTileBrushIndex2 + 2*Math.round(amount/grid)); + KDEditorTileBrushIndex2 = Math.max(0, KDEditorTileBrushIndex2); + }, + (_bdata) => { + KDEditorTileBrush = brushKeys[index]; + return true; + }, true, xx , yy, width, grid-5, brushKeys[index], brushKeys[index] == KDEditorTileBrush ? "#ffffff" : (brushKeys[index].startsWith('-') ? "#77ff77" : "#888888")); + + yy += grid; + } + DrawButtonKDEx("tilebrushdown2", (_bdata) => { + if (KDEditorTileBrushIndex2 >= brushKeys.length - 6) KDEditorTileBrushIndex2 = 0; + else KDEditorTileBrushIndex2 = Math.min(brushKeys.length - 4, KDEditorTileBrushIndex2 + 8); + return true; + }, true, xx , yy, width, grid-5, 'v', KDEditorTileBrushIndex2 < brushKeys.length - 4 ? "#ffffff" : "#888888"); + + + + yy = 160; + xx = 300; + grid = 45; + width = 200; + DrawTextFitKD("Tile List", xx + width/2 , yy - 30, width, "#ffffff", undefined, 36); + + DrawButtonKDEx("tilenameup", (_bdata) => { + if (KDEditorTileNameIndex == 0) KDEditorTileNameIndex = tileKeys.length - 4; + else KDEditorTileNameIndex = Math.max(0, KDEditorTileNameIndex - 9); + KDTELoadConfirm = false; + return true; + }, true, xx , yy, width, grid-5, '^', KDEditorTileNameIndex > 0 ? "#ffffff" : "#888888"); + yy += grid; + KDTE_CullIndex(tileKeys, brushKeys); + for (let i = 0; i < 700/grid; i++) { + let index = i + Math.round(KDEditorTileNameIndexVisual); + if (index >= tileKeys.length) break; + + DrawButtonKDExScroll("tilename" + i, (amount) => { + + KDEditorTileNameIndex = Math.min(tileKeys.length - 4, KDEditorTileNameIndex + 5*Math.round(amount/grid)); + KDEditorTileNameIndex = Math.max(0, KDEditorTileNameIndex); + }, + (_bdata) => { + if (KDEditorCurrentMapTileName != tileKeys[index] || !KDTELoadConfirm) { + KDEditorCurrentMapTileName = tileKeys[index]; + ElementValue("MapTileTitle", KDEditorCurrentMapTileName); + KDTELoadConfirm = true; + } else if (KDTELoadConfirm) { + KDTE_LoadTile(KDEditorCurrentMapTileName); + KDTELoadConfirm = false; + } + return true; + }, true, xx , yy, width, grid-5, tileKeys[index], tileKeys[index] == KDEditorCurrentMapTileName ? "#ffffff" : "#888888"); + if (KDTELoadConfirm && tileKeys[index] == KDEditorCurrentMapTileName) { + DrawTextFitKD("Double click to LOAD", xx + width * 1.65 , yy + grid/2, width, "#ffffff", undefined); + DrawButtonKDEx("deletetilename" + i, (_bdata) => { + delete KDMapTilesListEditor[KDEditorCurrentMapTileName]; + return true; + }, true, xx - 160, yy, 150, grid-5, "Delete!!!", tileKeys[index] == KDEditorCurrentMapTileName ? "#ffffff" : "#888888"); + } + + yy += grid; + } + DrawButtonKDEx("tilenamedown", (_bdata) => { + if (KDEditorTileNameIndex >= tileKeys.length - 6) KDEditorTileNameIndex = 0; + else KDEditorTileNameIndex = Math.min(tileKeys.length - 4, KDEditorTileNameIndex + 9); + KDTELoadConfirm = false; + return true; + }, true, xx , yy, width, grid-5, 'v', KDEditorTileNameIndex < tileKeys.length - 4 ? "#ffffff" : "#888888"); + + DrawButtonKDEx("tilesave", (_bdata) => { + KDTE_SaveTile(KDEditorCurrentMapTileName); + return true; + }, true, 900 , 150, 200, 60, 'Save Tile', "#ffffff"); + + + DrawButtonKDEx("maptileR", (_bdata) => { + KinkyDungeonPlayerEntity.x = Math.max(0, Math.min(KDMapData.GridWidth - 1, KinkyDungeonPlayerEntity.x + 3)); + KDTELoadConfirm = false; + return true; + }, true, 1000 , 900, 50, 50, '>', "#ffffff"); + DrawButtonKDEx("maptileL", (_bdata) => { + KinkyDungeonPlayerEntity.x = Math.max(0, Math.min(KDMapData.GridWidth - 1, KinkyDungeonPlayerEntity.x - 3)); + KDTELoadConfirm = false; + return true; + }, true, 900 , 900, 50, 50, '<', "#ffffff"); + DrawButtonKDEx("maptileD", (_bdata) => { + KinkyDungeonPlayerEntity.y = Math.max(0, Math.min(KDMapData.GridHeight - 1, KinkyDungeonPlayerEntity.y + 3)); + KDTELoadConfirm = false; + return true; + }, true, 950 , 950, 50, 50, 'v', "#ffffff"); + DrawButtonKDEx("maptileU", (_bdata) => { + KinkyDungeonPlayerEntity.y = Math.max(0, Math.min(KDMapData.GridHeight - 1, KinkyDungeonPlayerEntity.y - 3)); + KDTELoadConfirm = false; + return true; + }, true, 950 , 850, 50, 50, '^', "#ffffff"); + + KDTE_CullIndex(tileKeys, brushKeys); + + DrawButtonKDEx("TileEditorBack", () => { + KinkyDungeonState = "Menu"; + KinkyDungeonSeeAll = false; + KDTE_CloseUI(); + return true; + }, true, 10, 10, 350, 64, "Back to menu", "#ffffff", ""); + DrawButtonKDEx("TileEditorNew", () => { + let x = parseInt(ElementValue("MapTileX")); + let y = parseInt(ElementValue("MapTileY")); + if (x && y && x > 0 && y > 0 && x <= KDTE_MAXDIM && y <= KDTE_MAXDIM) + KDTE_Create(x, y, undefined, false, false); + return true; + }, true, 1600, 130, 110, 64, "New (Open)", "#ffffff", ""); + DrawButtonKDEx("TileEditorNewFloor", () => { + let x = parseInt(ElementValue("MapTileX")); + let y = parseInt(ElementValue("MapTileY")); + if (x && y && x > 0 && y > 0 && x <= KDTE_MAXDIM && y <= KDTE_MAXDIM) + KDTE_Create(x, y, undefined, false, true); + return true; + }, true, 1720, 130, 110, 64, "New (Empty)", "#ffffff", ""); + DrawButtonKDEx("TileEditorNewClosed", () => { + let x = parseInt(ElementValue("MapTileX")); + let y = parseInt(ElementValue("MapTileY")); + if (x && y && x > 0 && y > 0 && x <= KDTE_MAXDIM && y <= KDTE_MAXDIM) + KDTE_Create(x, y, undefined, true); + return true; + }, true, 1840, 130, 110, 64, "New (Closed)", "#ffffff", ""); + + DrawButtonKDEx("TileTest", () => { + KDTE_CloseUI(); + KDTileToTest = KDTE_ExportTile(); + KinkyDungeonStartNewGame(); + return true; + }, true, 1910, 10, 80, 40, "Test Tile", "#ffffff", ""); + + if (!KDClipboardDisabled) + DrawButtonKDEx("CopyClip", () => { + var text = JSON.stringify(KDMapTilesListEditor); + navigator.clipboard.writeText(text).then(function() { + console.log('Async: Copying to clipboard was successful!'); + console.log(KDMapTilesListEditor); + }, function(err) { + console.error('Async: Could not copy text: ', err); + }); + return true; + }, true, 1450, 900, 275, 45, "Copy array to clipboard", "#ffffff", ""); + + if (!KDClipboardDisabled) + DrawButtonKDEx("MergeClip", () => { + let success = false; + navigator.clipboard.readText() + .then(text => { + if (JSON.parse(text)) { + console.log(JSON.parse(text)); + console.log("Parse successful!!!"); + for (let t of Object.values(JSON.parse(text))) { + /* FIXME: workaround type clash */ + const tile: any = t; + if (tile && tile.name) { + if (!KDMapTilesListEditor[tile.name]) { + KDMapTilesListEditor[tile.name] = tile; + console.log(`${tile.name} added successfully`); + success = true; + } else { + console.log(`${tile.name} already present`); + } + } + } + if (success) { + localStorage.setItem("KDMapTilesListEditor", JSON.stringify(KDMapTilesListEditor)); + console.log("Saved new tiles to browser local storage."); + } + } + }) + .catch(err => { + console.error('Failed to read clipboard contents: ', err); + }); + + + + return true; + }, true, 1450, 850, 275, 45, "Merge from clipboard", "#ffffff", ""); + + DrawButtonKDEx("DeleteEditorTiles", () => { + if (KDTE_confirmreset) { + KDTE_confirmreset = false; + KDMapTilesListEditor = JSON.parse(JSON.stringify(KDMapTilesList)); + } else { + KDTE_confirmreset = true; + } + + + return true; + }, true, 1450, 800, 275, 40, "Reset tile database", "#ffffff", ""); + if (KDTE_confirmreset) { + DrawTextFitKD("This is a DESTRUCTIVE operation. Click the button again to do it. Save a tile to commit fully.", 1400, 470, 1000, "#e7cf1a", "#ff5277"); + } + + + + if (!KDClipboardDisabled) + DrawButtonKDEx("PasteTileFromCB", () => { + let success = false; + navigator.clipboard.readText() + .then(text => { + let tile = JSON.parse(text); + if (tile && tile.name) { + console.log(JSON.parse(text)); + console.log("Parse successful!!!"); + KDTE_LoadTile(tile.name, tile); + + if (success) { + localStorage.setItem("KDMapTilesListEditor", JSON.stringify(KDMapTilesListEditor)); + console.log("Saved new tiles to browser local storage."); + } + } + }) + .catch(err => { + console.error('Failed to read clipboard contents: ', err); + }); + return true; + }, true, 1250, 950, 175, 45, "Load tile from Clipboard", "#ffffff", ""); + + if (!KDClipboardDisabled) + DrawButtonKDEx("MakeTileCB", () => { + var text = JSON.stringify(KDTE_ExportTile()); + navigator.clipboard.writeText(text).then(function() { + console.log('Async: Copying to clipboard was successful!'); + }, function(err) { + console.error('Async: Could not copy text: ', err); + }); + return true; + }, true, 1250, 900, 175, 45, "Copy Tile to Clipboard", "#ffffff", ""); + + DrawButtonKDEx("CommitTiles", () => { + if (KDTE_confirmcommit) { + KDTE_confirmcommit = false; + KDMapTilesList = JSON.parse(JSON.stringify(KDMapTilesListEditor)); + } else { + KDTE_confirmcommit = true; + } + return true; + }, true, 1450, 950, 275, 45, "Commit Editor Tiles", "#ffffff", ""); + if (KDTE_confirmcommit) { + DrawTextFitKD("This will temporarily make the game use your editor's tiles. You are responsible for any crashes.", 1400, 470, 1000, "#ffffff", "#ff00aa"); + } + + KDEditorTileIndexQuery = indexX + + "," + + indexY; + + // Enforce entrance/exits + for (let sim_x = 0; sim_x < KDMapData.GridWidth-1; sim_x += KDTE_Scale) { + for (let sim_y = 0; sim_y < KDMapData.GridHeight-1; sim_y += KDTE_Scale) { + let indexXX = (Math.floor(Math.max(0, Math.min(KDMapData.GridWidth-1, sim_x)) / KDTE_Scale)); + let indexYY = (Math.floor(Math.max(0, Math.min(KDMapData.GridHeight-1,sim_y)) / KDTE_Scale)); + let patt = KDGetTileIndexImg(KDEditorTileIndexStore[(indexXX + 1) + "," + (indexYY + 1)]); + if (patt) { + if (patt.u && indexYY == 0) KDTE_Clear(indexXX*KDTE_Scale + Math.floor(KDTE_Scale/2), indexYY*KDTE_Scale); + if (patt.d && indexYY == Math.floor((KDMapData.GridHeight-1)/KDTE_Scale)) KDTE_Clear(indexXX*KDTE_Scale + Math.floor(KDTE_Scale/2), indexYY*KDTE_Scale + KDTE_Scale - 1); + if (patt.l && indexXX == 0) KDTE_Clear(indexXX*KDTE_Scale, indexYY*KDTE_Scale + Math.floor(KDTE_Scale/2)); + if (patt.r && indexXX == Math.floor((KDMapData.GridWidth-1)/KDTE_Scale)) KDTE_Clear(indexXX*KDTE_Scale + KDTE_Scale - 1, indexYY*KDTE_Scale + Math.floor(KDTE_Scale/2)); + } + } + } + + if (mouseDown && !CommonIsMobile) { + if (!KDTE_lastMouse) KDTE_lastMouse = CommonTime(); + if (CommonTime() > KDTE_lastMouse + KDTEHoldDelay) + KDHandleTileEditor(true); + } else KDTE_lastMouse = 0; + + KDTE_CustomUI(); +} + +let customfieldsElements = []; + +function KDTE_CustomUI() { + + let brush = KDTilePalette[KDEditorTileBrush]; + let names = []; + if (brush?.customfields) { + names.push(...Object.keys(brush.customfields)); + } + + for (let element of customfieldsElements) { + if (!names.includes(element)) { + ElementRemove("KDTECustomField" + element); + customfieldsElements.splice(customfieldsElements.indexOf(element), 1); + } + } + let YY = 990 - names.length * 55; + let XX = 650; + for (let name of names) { + if (!customfieldsElements.includes(name)) { + ElementCreateTextArea("KDTECustomField" + name); + document.getElementById("KDTECustomField" + name).setAttribute("placeholder", name); + ElementPosition("KDTECustomField" + name, XX, YY, 300, 45); YY += 55; + customfieldsElements.push(name); + } + } +} + +let KDTE_lastMouse = 0; +let KDTEHoldDelay = 200; + +let KDTEmode = 0; + +let KDTE_Scale = 7; +let KDTE_MAXDIM = 20; + +let KDTELoadConfirm = false; + +function KDTE_Clear(x: number, y: number, force: boolean = false) { + if (force || !KDIsSmartMovable(x, y)) { + KinkyDungeonMapSetForce(x, y, '0'); + KinkyDungeonTilesDelete(x + "," + y); + delete KDMapData.TilesSkin[x + "," + y]; + for (let jail of KDMapData.JailPoints) { + if (jail.x == x && jail.y == y) + KDMapData.JailPoints.splice(KDMapData.JailPoints.indexOf(jail), 1); + } + if (KDMapData.Labels) + for (let k of Object.values(KDMapData.Labels)) { + for (let l of k) + if (l.x == x && l.y == y) + k.splice(k.indexOf(l), 1); + } + //KDMapData.EffectTiles.delete(x + "," + y); + } +} + +let KDTE_Brush: Record void> = { + "clear": (_brush, _curr, _noSwap) => { + KDTE_Clear(KinkyDungeonTargetX, KinkyDungeonTargetY, true); + for (let p of KinkyDungeonPOI) { + if (p.x == KinkyDungeonTargetX && p.y == KinkyDungeonTargetY) { + KinkyDungeonPOI.splice(KinkyDungeonPOI.indexOf(p), 1); + break; + } + } + delete KDMapData.EffectTiles[KinkyDungeonTargetX + "," + KinkyDungeonTargetY]; + }, + "tile": (brush, curr, noSwap) => { + let OL = KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY) ? KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).OL : undefined; + let Jail = KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY) ? KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).Jail : undefined; + let tile = (curr == brush.tile && !noSwap) ? '0' : brush.tile; + if (tile == '0') { + if (!noSwap) { + KDTE_Clear(KinkyDungeonTargetX, KinkyDungeonTargetY, true); + if (OL || Jail) + KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {OL: OL, Jail: Jail}); + } + } else if (curr != tile) { + KinkyDungeonMapSetForce(KinkyDungeonTargetX, KinkyDungeonTargetY, tile); + + if (brush.jail) { + KDMapData.JailPoints.push({x: KinkyDungeonTargetX, y: KinkyDungeonTargetY, type: brush.jail.type, radius: brush.jail.radius}); + } + if (brush.special) { + KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, Object.assign({}, brush.special)); + if (OL) + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).OL = true; + if (Jail) + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).Jail = true; + if (brush.customfields) { + for (let field of Object.entries(brush.customfields)) { + if (KDTE_GetField(field)) + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)[field[0]] = KDTE_GetField(field); + } + } + } else { + if (OL) + KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {OL: true}); + else + KinkyDungeonTilesDelete(KinkyDungeonTargetX + "," + KinkyDungeonTargetY); + } + } + }, + 'offlimits': (_brush, _curr, noSwap) => { + if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { + if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).OL) { + if (!noSwap) + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).OL = false; + } else + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).OL = true; + } else { + KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {OL: true}); + } + }, + 'NW': (_brush, _curr, noSwap) => { + if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { + if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).NW) { + if (!noSwap) + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).NW = false; + } else + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).NW = true; + } else { + KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {NW: true}); + } + }, + 'MazeBlock': (_brush, _curr, noSwap) => { + if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { + if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).MazeBlock) { + if (!noSwap) + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).MazeBlock = false; + } else + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).MazeBlock = true; + } else { + KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {MazeBlock: true}); + } + }, + 'Label': (brush, _curr, _noSwap) => { + if (!KDMapData.Labels) KDMapData.Labels = {}; + + let label: KDLabel = { + name: "null", + type: "null", + assigned: -1, + x: KinkyDungeonTargetX, + y: KinkyDungeonTargetY, + }; + + if (brush.customfields) { + for (let field of Object.entries(brush.customfields)) { + if (KDTE_GetField(field) != undefined) + label[field[0]] = KDTE_GetField(field); + } + } + + if (!KDMapData.Labels[label.type]) KDMapData.Labels[label.type] = []; + + if (KDMapData.Labels[label.type].filter((ll) => {return ll.x == label.x && ll.y == label.y;}).length == 0) { + // Set + KDMapData.Labels[label.type].push(label); + } else { + // Remove + KDMapData.Labels[label.type] = KDMapData.Labels[label.type].filter((ll) => {return ll.x != label.x || ll.y != label.y;}); + } + + }, + 'MazeSeed': (brush, _curr, noSwap) => { + if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { + if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).MazeSeed) { + if (!noSwap) + delete KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).MazeSeed; + } else + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).MazeSeed = {newest: 0.25, oldest: 0.25}; + } else { + KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {MazeSeed: {newest: 0.25, oldest: 0.25}}); + } + + if (brush.customfields && KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)?.MazeSeed) { + for (let field of Object.entries(brush.customfields)) { + if (KDTE_GetField(field) != undefined) + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).MazeSeed[field[0]] = KDTE_GetField(field); + } + } + }, + 'jail': (_brush, _curr, noSwap) => { + if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { + if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).Jail) { + if (!noSwap) + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).Jail = false; + } else + KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).Jail = true; + } else { + KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {Jail: true}); + } + }, + 'Keyring': (_brush, _curr, noSwap) => { + let keyringLength = KDGameData.KeyringLocations.length; + let filtered = KDGameData.KeyringLocations.filter((e) => {return e.x != KinkyDungeonTargetX || e.y != KinkyDungeonTargetY;}); + if (filtered.length != keyringLength) { + if (!noSwap) + KDGameData.KeyringLocations = filtered; + } else { + KDGameData.KeyringLocations.push({x: KinkyDungeonTargetX, y: KinkyDungeonTargetY}); + } + }, + "effect": (brush, curr, noSwap) => { + if ((brush.wall && KinkyDungeonWallTiles.includes(curr)) + || (brush.floor && KinkyDungeonGroundTiles.includes(curr)) + || (!brush.floor && !brush.wall)) { + if (KinkyDungeonEffectTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { + if (!noSwap) + delete KDMapData.EffectTiles[KinkyDungeonTargetX + "," + KinkyDungeonTargetY]; + } else { + // Has to have unlimited duration + KDCreateEffectTile(KinkyDungeonTargetX, KinkyDungeonTargetY, {name: brush.effectTile, duration: 9999}, 0); + } + } + }, + "POI": (_brush, _curr, noSwap) => { + let deleted = false; + for (let p of KinkyDungeonPOI) { + if (p.x == KinkyDungeonTargetX && p.y == KinkyDungeonTargetY) { + if (!noSwap) { + if (!p.requireTags.includes("endpoint")) { + let chanceCycle = [1.0, 0.75, 0.5, 0.25, 0.15, 0.1, 0.05, 0.01]; + let chanceIndex = chanceCycle.indexOf(p.chance || 1.0); + chanceIndex += 1; + if (chanceIndex >= chanceCycle.length) { + p.requireTags.push("endpoint"); + p.chance = 1.0; + } else { + p.chance = chanceCycle[chanceIndex]; + } + } else { + KinkyDungeonPOI.splice(KinkyDungeonPOI.indexOf(p), 1); + } + } + deleted = true; + break; + } + } + if (!deleted) { + let tags = []; + let favor = []; + //let indexXX = (Math.floor(Math.max(0, Math.min(KDMapData.GridWidth-1, KinkyDungeonTargetX)) / KDTE_Scale)); + //let indexYY = (Math.floor(Math.max(0, Math.min(KDMapData.GridHeight-1,KinkyDungeonTargetY)) / KDTE_Scale)); + //let pat = KDEditorTileIndexStore[(indexXX + 1) + "," + (indexYY + 1)]; + //if (pat) { + // if (pat.length == 1) tags.push("endpoint"); + //} + if (ElementValue("MapTileCategory")) + favor.push(ElementValue("MapTileCategory")); + KinkyDungeonPOI.push({x: KinkyDungeonTargetX, y: KinkyDungeonTargetY, requireTags: tags, favor: favor, used: false}); + } + } +}; + +let KDTE_Inaccessible = false; + +let KDTE_confirmreset = false; +let KDTE_confirmcommit = false; + +function KDHandleTileEditor(noSwap?: boolean): void { + + // @ts-ignore + if (document.activeElement && (document.activeElement?.type == "text" || document.activeElement?.type == "textarea" || KDFocusableTextFields.includes(document.activeElement.id))) return; + if (!noSwap && KDTE_lastMouse && CommonTime() > KDTE_lastMouse + KDTEHoldDelay) return; + + KDTE_confirmreset = false; + KDTE_confirmcommit = false; + + if (KDTE_State) return; + + + KDTESetIndexToTile(KDEditorCurrentMapTileName); + + KinkyDungeonTargetX = Math.round((MouseX - KinkyDungeonGridSizeDisplay/2 - canvasOffsetX)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamX; + KinkyDungeonTargetY = Math.round((MouseY - KinkyDungeonGridSizeDisplay/2 - canvasOffsetY)/KinkyDungeonGridSizeDisplay) + KinkyDungeonCamY; + + if (KinkyDungeonTargetX >= 0 && KinkyDungeonTargetX < KDMapData.GridWidth + && KinkyDungeonTargetY >= 0 && KinkyDungeonTargetY < KDMapData.GridHeight) { + KDTELoadConfirm = false; + let curr = KinkyDungeonMapGet(KinkyDungeonTargetX, KinkyDungeonTargetY); + + let brush = KDTilePalette[KDEditorTileBrush]; + if (KDTE_Brush[brush.type]) { + KDTE_Brush[brush.type](brush, curr, noSwap); + } + if (ElementValue("MapTileSkin")) { + KinkyDungeonSkinSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {force: true, skin: ElementValue("MapTileSkin")}); + } else { + KinkyDungeonSkinDelete(KinkyDungeonTargetX + "," + KinkyDungeonTargetY); + } + + if (!noSwap) { + KDVisionUpdate = 1; + KinkyDungeonMakeBrightnessMap(KDMapData.GridWidth, KDMapData.GridHeight, KDMapData.MapBrightness, [], KDVisionUpdate); + KinkyDungeonMakeVisionMap(KDMapData.GridWidth, KDMapData.GridHeight, [], [], KDVisionUpdate, KDMapData.MapBrightness); + KDVisionUpdate = 0; + } + } + if (KDEditorTileIndexHover) { + KDEditorTileIndexStore[KDEditorTileIndexQuery] = KDEditorTileIndexHover; + } + + if (!noSwap) { + let inaccess = KDTEGetInaccessible(); + if (inaccess.length > 0) KDTE_Inaccessible = true; + else KDTE_Inaccessible = false; + } + +} + +function KDTE_UpdateUI(Load: boolean): void { + let tagCount = 17; + if (Load) { + ElementCreateTextArea("MapTileTitle"); + ElementValue("MapTileTitle", KDEditorCurrentMapTileName); + ElementCreateTextArea("MapTileTileset"); + ElementValue("MapTileTileset", ElementValue("MapTileTileset") ? ElementValue("MapTileTileset") : KinkyDungeonMapIndex.grv); + ElementCreateTextArea("MapTileCategory"); + ElementValue("MapTileCategory", "urban"); + ElementCreateTextArea("MapTileWeight"); + ElementValue("MapTileWeight", "10"); + + + ElementCreateTextArea("MapTileX"); + ElementValue("MapTileX", "1"); + ElementCreateTextArea("MapTileY"); + ElementValue("MapTileY", "1"); + + ElementCreateTextArea("MapTags"); + ElementCreateTextArea("MapRequireTags"); + ElementCreateTextArea("MapForbidTags"); + + for (let i = 0; i < tagCount; i++) { + ElementCreateTextArea("MapCountTag" + i); + ElementCreateTextArea("MapCountTagMult" + i); + ElementCreateTextArea("MapCountTagBonus" + i); + ElementCreateTextArea("MapCountTagMax" + i); + ElementCreateTextArea("MapCountTagNot" + i); + ElementValue("MapCountTagMax" + i, "-1"); + ElementValue("MapCountTagBonus" + i, "0"); + ElementValue("MapCountTagMult" + i, "1"); + ElementValue("MapCountTagNot" + i, ""); + } + + } + + if (KDTE_State == "Tags") { + DrawTextFitKD("Tile Tags", 300, 50, 500, "#ffffff"); + ElementPosition("MapTags", 300, 200, 500, 200); + + DrawTextFitKD("Require Tags", 300, 350, 500, "#ffffff"); + ElementPosition("MapRequireTags", 300, 500, 500, 200); + + DrawTextFitKD("Forbid Tags", 300, 650, 500, "#ffffff"); + ElementPosition("MapForbidTags", 300, 800, 500, 200); + + for (let i = 0; i < tagCount; i++) { + DrawTextFitKD("Existing Tag", 1450, 150, 400, "#ffffff"); + DrawTextFitKD("Mult", 1720, 150, 400, "#ffffff"); + DrawTextFitKD("Bonus", 1820, 150, 400, "#ffffff"); + DrawTextFitKD("Max", 1920, 150, 400, "#ffffff"); + ElementPosition("MapCountTag" + i, 1450, 200 + 50 * i, 200, 40); + ElementPosition("MapCountTagMult" + i, 1680, 200 + 50 * i, 150, 40); + ElementPosition("MapCountTagBonus" + i, 1820, 200 + 50 * i, 110, 40); + ElementPosition("MapCountTagMax" + i, 1920, 200 + 50 * i, 110, 40); + + DrawTextFitKD("NOT", 1250, 150, 400, "#ffffff"); + ElementPosition("MapCountTagNot" + i, 1250, 200 + 50 * i, 110, 40); + } + } else { + ElementPosition("MapTags", 300, -1000, 500, 200); + ElementPosition("MapRequireTags", 300, -1000, 500, 200); + ElementPosition("MapForbidTags", 300, -1000, 500, 200); + + for (let i = 0; i < tagCount; i++) { + ElementPosition("MapCountTag" + i, 1700, -1000, 200, 40); + ElementPosition("MapCountTagMult" + i, 1900, -1000, 90, 40); + ElementPosition("MapCountTagBonus" + i, 1900, -1000, 90, 40); + ElementPosition("MapCountTagMax" + i, 1900, -1000, 90, 40); + ElementPosition("MapCountTagNot" + i, 1900, -1000, 90, 40); + } + } + + DrawTextFitKD("X", 1700, 25, 100, "#ffffff"); + ElementPosition("MapTileX", 1800, 25, 150); + DrawTextFitKD("Y", 1700, 75, 100, "#ffffff"); + ElementPosition("MapTileY", 1800, 75, 150); + + + DrawTextFitKD("Name of Tile", 1000, 25, 200, "#ffffff"); + ElementPosition("MapTileTitle", 1000, 70, 400); + let propTile = ElementValue("MapTileTitle"); + KDEditorCurrentMapTileName = propTile; + + DrawTextFitKD("Tileset", 1000 - 400, 25, 200, "#ffffff"); + ElementPosition("MapTileTileset", 1000 - 400, 70, 200); + + DrawTextFitKD("Skin", 1000 - 400, 120, 200, "#ffffff"); + KDTextField("MapTileSkin", 1000 - 400 - 100, 150, 200, 60,); + + let propTileset = ElementValue("MapTileTileset"); + if (KinkyDungeonMapParams[propTileset]) { + KinkyDungeonMapIndex.grv = propTileset; + } + + DrawTextFitKD("Category", 1000 + 350, 25, 200, "#ffffff"); + ElementPosition("MapTileCategory", 1000 + 350, 70, 200); + + DrawTextFitKD("Weight", 1000 + 550, 25, 200, "#ffffff"); + ElementPosition("MapTileWeight", 1000 + 550, 70, 200); + + if (KDTE_Inaccessible) + DrawTextFitKD("Some entrances are inaccessible. This tile will occur more rarely in worldgen", 1000, 800, 1000, "#ff5277"); +} + +function KDTESetIndexToTile(propTile: string): void { + if (KDMapTilesListEditor[propTile]) { + let tileKeys = Object.keys(KDMapTilesListEditor); + let brushKeys = Object.keys(KDTilePalette); + KDEditorTileNameIndex = tileKeys.indexOf(propTile) - 9; + KDTE_CullIndex(tileKeys, brushKeys); + } +} + +function KDTE_CullIndex(tileKeys: string[], brushKeys: string[]): void { + KDEditorTileNameIndex = Math.max(0, Math.min(tileKeys.length - 6, KDEditorTileNameIndex)); + KDEditorTileBrushIndex = Math.max(0, Math.min(brushKeys.length - 6, KDEditorTileBrushIndex)); + KDEditorTileBrushIndex2 = Math.max(0, Math.min(brushKeys.length - 6, KDEditorTileBrushIndex2)); +} + +function KDTE_CloseUI() { + ElementRemove("MapTileTitle"); + ElementRemove("MapTileTileset"); + ElementRemove("MapTileCategory"); + ElementRemove("MapTileWeight"); + + ElementRemove("MapTileX"); + ElementRemove("MapTileY"); + for (let element of customfieldsElements) { + ElementRemove("KDTECustomField" + element); + customfieldsElements.splice(customfieldsElements.indexOf(element), 1); + } +} + + +/** + * @param w + * @param h + * @param [chkpoint] + * @param [closed] - The edges will be closed index + * @param [empty] - All floor + * */ +function KDTE_Create(w: number, h: number, chkpoint: string = 'grv', closed: boolean = false, empty: boolean = false): void { + MiniGameKinkyDungeonCheckpoint = 'grv'; + KinkyDungeonMapIndex = { + 'grv' : chkpoint, + }; + + + KinkyDungeonSeeAll = true; + + + KDMapData.Labels = {}; + KDMapData.Grid = ""; + KDMapData.GridWidth = KDTE_Scale * w; + KDMapData.GridHeight = KDTE_Scale * h; + for (let y = 0; y < KDMapData.GridHeight; y++) { + for (let x = 0; x < KDMapData.GridWidth; x++) { + KDMapData.Grid = KDMapData.Grid + (empty ? "0" : "1"); + } + KDMapData.Grid = KDMapData.Grid + "\n"; + } + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + KDMapData.Tiles = {}; + KDMapData.EffectTiles = {}; + KDMapData.TilesSkin = {}; + KDMapData.Entities = []; + KDCommanderRoles = new Map(); + KDMapData.TilesMemory = {}; + + KinkyDungeonPOI = []; + KDGameData.KeyringLocations = []; + + KDEditorTileIndexStore = {}; + for (let ww = 1; ww <= w; ww++) { + for (let hh = 1; hh <= h; hh++) { + // Closed maps dont have to worry about edge indices + if (closed) { + let index = 'udlr'; + if (ww == 1) { + index = index.replace("l", ""); + } + if (hh == 1) { + index = index.replace("u", ""); + } + if (ww == w) { + index = index.replace("r", ""); + } + if (hh == h) { + index = index.replace("d", ""); + } + KDEditorTileIndexStore[ww + "," + hh] = index; + } else { + KDEditorTileIndexStore[ww + "," + hh] = 'udlr'; + } + + } + } + KDEditorTileFlexStore = {}; + KDEditorTileFlexSuperStore = {}; + + KinkyDungeonPlayerEntity = { + x: Math.floor(KDMapData.GridWidth/2), + y: Math.floor(KDMapData.GridHeight/2), + player: true, + }; + + KDInitCanvas(); + KDVisionUpdate = 1; + KinkyDungeonMakeBrightnessMap(KDMapData.GridWidth, KDMapData.GridHeight, KDMapData.MapBrightness, [], KDVisionUpdate); + KinkyDungeonMakeVisionMap(KDMapData.GridWidth, KDMapData.GridHeight, [], [], KDVisionUpdate, KDMapData.MapBrightness); + KDVisionUpdate = 0; + KDTE_UpdateUI(true); +} + +function KDTE_LoadTile(name: any, loadedTile?: KDMapTile) { + let nt: KDMapTile = loadedTile || KDMapTilesListEditor[name]; + KDTE_Create(nt.w, nt.h); + KDEditorTileIndexStore = nt.index; + KDEditorTileFlexStore = nt.flexEdge || {}; + KDEditorTileFlexSuperStore = nt.flexEdgeSuper || {}; + if (nt.category) + ElementValue("MapTileCategory", nt.category); + if (nt.weight != undefined) + ElementValue("MapTileWeight", "" + nt.weight); + KDMapData.Grid = nt.grid; + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + KinkyDungeonPOI = []; + for (let p of nt.POI) { + KinkyDungeonPOI.push(Object.assign({}, p)); + } + KDGameData.KeyringLocations = []; + if (nt.Keyring) { + for (let k of nt.Keyring) { + KDGameData.KeyringLocations.push({x:k.x, y:k.y}); + } + } + if (nt.Labels) + KDMapData.Labels = JSON.parse(JSON.stringify(nt.Labels)); + KDMapData.Tiles = KDObjFromMapArray(nt.Tiles); + KDMapData.TilesSkin = KDObjFromMapArray(nt.Skin); + KDMapData.JailPoints = []; + for (let j of nt.Jail) { + KDMapData.JailPoints.push(Object.assign({}, j)); + } + let array = KDObjFromMapArray(nt.effectTiles); + for (let tile of Object.entries(array)) { + KinkyDungeonEffectTilesSet(tile[0], KDObjFromMapArray(tile[1])); + } + + KDVisionUpdate = 1; + KinkyDungeonMakeBrightnessMap(KDMapData.GridWidth, KDMapData.GridHeight, KDMapData.MapBrightness, [], KDVisionUpdate); + KinkyDungeonMakeVisionMap(KDMapData.GridWidth, KDMapData.GridHeight, [], [], KDVisionUpdate, KDMapData.MapBrightness); + KDVisionUpdate = 0; + + ElementValue("MapTags", nt.tags.toString()); + ElementValue("MapRequireTags", nt.requireTags.toString()); + ElementValue("MapForbidTags", nt.forbidTags.toString()); + + // JSON recreation to kill all references + KDMapTilesListEditor = JSON.parse(JSON.stringify(KDMapTilesListEditor)); + + KDTESetIndexToTile(nt.name); + + let tagCount = 17; + for (let i = 0; i < tagCount; i++) { + //if (i < nt.indexTags.length) { + ElementValue("MapCountTag" + i, nt.indexTags[i] ? nt.indexTags[i] : ""); + ElementValue("MapCountTagBonus" + i, "" + (nt.indexTags[i] ? nt.bonusTags[i] : 0)); + ElementValue("MapCountTagMult" + i, "" + (nt.indexTags[i] ? nt.multTags[i] : 1)); + ElementValue("MapCountTagMax" + i, "" + (nt.indexTags[i] ? nt.maxTags[i] : -1)); + ElementValue("MapCountTagNot" + i, (nt.indexTags[i] && nt.notTags ? nt.notTags[i] : "")); + //} + + } +} + +function KDTE_ExportTile(): KDMapTile { + /** + */ + let saveTile: KDMapTile = { + name: KDEditorCurrentMapTileName, + Labels: JSON.parse(JSON.stringify(KDMapData.Labels)), + w: KDMapData.GridWidth / KDTE_Scale, + h: KDMapData.GridHeight / KDTE_Scale, + primInd: KDEditorTileIndexStore["1,1"], + index: KDEditorTileIndexStore, + flexEdge: KDEditorTileFlexStore || {}, + flexEdgeSuper: KDEditorTileFlexSuperStore || {}, + scale: KDTE_Scale, + category: ElementValue("MapTileCategory"), + weight: parseInt(ElementValue("MapTileWeight")) ? parseInt(ElementValue("MapTileWeight")) : 0, + grid: KDMapData.Grid, + POI: KinkyDungeonPOI, + Keyring: KDGameData.KeyringLocations, + Jail: KDMapData.JailPoints, + Tiles: KDMapData.Tiles, + effectTiles: KDMapData.EffectTiles, + Skin: KDMapData.TilesSkin, + inaccessible: KDTEGetInaccessible(), + tags: ElementValue("MapTags") ? ElementValue("MapTags").split(',') : [ElementValue("MapTileCategory")], + forbidTags: ElementValue("MapForbidTags") ? ElementValue("MapForbidTags").split(',') : [], + requireTags: ElementValue("MapRequireTags") ? ElementValue("MapRequireTags").split(',') : [], + indexTags: [], + maxTags: [], + bonusTags: [], + multTags: [], + notTags: [], + }; + + let maxTags = 17; + for (let i = 0; i < maxTags; i++) { + if (ElementValue("MapCountTag" + i)) { + saveTile.indexTags.push(ElementValue("MapCountTag" + i)); + saveTile.bonusTags.push(parseInt(ElementValue("MapCountTagBonus" + i))); + saveTile.multTags.push(parseInt(ElementValue("MapCountTagMult" + i))); + saveTile.maxTags.push(parseInt(ElementValue("MapCountTagMax" + i))); + saveTile.notTags.push(ElementValue("MapCountTagNot" + i)); + } + } + return saveTile; +} + +function KDTE_SaveTile(_tile?: string) { + let saveTile = KDTE_ExportTile(); + + // JSON recreation to kill all references + KDMapTilesListEditor[KDEditorCurrentMapTileName] = saveTile; + KDMapTilesListEditor = JSON.parse(JSON.stringify(KDMapTilesListEditor)); + + KDTESetIndexToTile(KDEditorCurrentMapTileName); + + localStorage.setItem("KDMapTilesListEditor", JSON.stringify(KDMapTilesListEditor)); +} + +/* TODO: Promote to KDTypeDefs? */ +type InaccessibleEntry = { + indX1: number; + indY1: number; + dir1: string; + indX2: number; + indY2: number; + dir2: string; +} + +function KDTEGetInaccessible(): InaccessibleEntry[] { + let list: InaccessibleEntry[] = []; + let listEntrances: {indX: number, indY: number, dir: string}[] = []; + + // Figure out the list of entrances we need to compare + for (let ind of Object.entries(KDEditorTileIndexStore)) { + let indX = parseInt(ind[0].split(',')[0]); + let indY = parseInt(ind[0].split(',')[1]); + + if (indX && indY) { + if (indX == 1 && ind[1].includes('l')) + listEntrances.push({indX: indX, indY: indY, dir: 'l'}); + if (indX == 1 + Math.floor((KDMapData.GridWidth-1)/KDTE_Scale) && ind[1].includes('r')) + listEntrances.push({indX: indX, indY: indY, dir: 'r'}); + if (indY == 1 && ind[1].includes('u')) + listEntrances.push({indX: indX, indY: indY, dir: 'u'}); + if (indY == 1 + Math.floor((KDMapData.GridHeight-1)/KDTE_Scale) && ind[1].includes('d')) + listEntrances.push({indX: indX, indY: indY, dir: 'd'}); + } + } + + let pairsTested = {}; + + // Now we attempt to find a path for smart enemies (player can open doors) + for (let entrance1 of listEntrances) { + for (let entrance2 of listEntrances) { + if (entrance1 == entrance2) continue; + let ID = entrance1.indX + "," + entrance1.indY + "," + entrance1.dir + "," + + entrance2.indX + "," + entrance2.indY + "," + entrance2.dir; + if (pairsTested[ID]) continue; + pairsTested[ID] = true; + let x1 = (entrance1.indX - 1)*KDTE_Scale; + if (entrance1.dir == 'r') x1 += KDTE_Scale; + else if (entrance1.dir == 'u' || entrance1.dir == 'd') x1 += Math.floor(KDTE_Scale/2); + let x2 = (entrance2.indX - 1)*KDTE_Scale; + if (entrance2.dir == 'r') x2 += KDTE_Scale; + else if (entrance2.dir == 'u' || entrance2.dir == 'd') x2 += Math.floor(KDTE_Scale/2); + let y1 = (entrance1.indY - 1)*KDTE_Scale; + if (entrance1.dir == 'd') y1 += KDTE_Scale; + else if (entrance1.dir == 'l' || entrance1.dir == 'r') y1 += Math.floor(KDTE_Scale/2); + let y2 = (entrance2.indY - 1)*KDTE_Scale; + if (entrance2.dir == 'd') y2 += KDTE_Scale; + else if (entrance2.dir == 'l' || entrance2.dir == 'r') y2 += Math.floor(KDTE_Scale/2); + + // Clear caches + KDPathCacheIgnoreLocks = new Map(); + KDPathCache = new Map(); + // Find path + let access = KinkyDungeonFindPath( + x1, y1, + x2, y2, + false, false, false, KinkyDungeonMovableTilesSmartEnemy); + + if (!access) { + list.push({ + indX1: entrance1.indX, + indY1: entrance1.indY, + indX2: entrance2.indX, + indY2: entrance2.indY, + dir1: entrance1.dir, + dir2: entrance2.dir, + }); + } + } + } + + return list; +} + +function KDObjFromMapArray(array: any): any { + if (array.length != undefined) { + let map = {}; + for (let entry of array) { + map[entry[0]] = entry[1]; + } + return map; + } else { + return array; + } +} + +function KDReloadAllEditorTiles() { + for (let tile of Object.entries(KDMapTilesList)) { + KDEditorCurrentMapTileName = tile[0]; + KDTE_LoadTile(tile[0]); + KDTE_SaveTile(); + } +} + +function KDTE_GetField(field: any): any { + if (!field[1]) return undefined; + if (ElementValue("KDTECustomField" + field[0]) == "") return undefined; + if (field[1].type == 'array') return ElementValue("KDTECustomField" + field[0])?.split(','); + if (field[1].type == 'number') return parseFloat(ElementValue("KDTECustomField" + field[0])) || 0; + if (field[1].type == 'boolean') return (ElementValue("KDTECustomField" + field[0]) && ElementValue("KDTECustomField" + field[0]) != "false") ? true : false; + return ElementValue("KDTECustomField" + field[0]); +} diff --git a/Game/src/map/KinkyDungeonEditorGen.ts b/Game/src/map/KinkyDungeonEditorGen.ts new file mode 100644 index 000000000..20908bb85 --- /dev/null +++ b/Game/src/map/KinkyDungeonEditorGen.ts @@ -0,0 +1,1176 @@ +"use strict"; + +/** If a tile's weight is higher than this, then any time without this much weight will get culled from the list */ +let KD_GENWEIGHTCUTOFF = 100000; + + +function KDAddLabel(label: KDLabel) { + if (!KDMapData.Labels) KDMapData.Labels = {}; + if (!KDMapData.Labels[label.type]) KDMapData.Labels[label.type] = []; + KDMapData.Labels[label.type].push(label); +} + +/** + * @param w + * @param h + * @param indices + * @param data + * @param requiredAccess + * @param maxTagFlags + */ +function KDMapTilesPopulate ( + _w: number, + _h: number, + indices: Record, + data: any, + requiredAccess: Record, + maxTagFlags: Record, + tagModifiers: Record +): Record +{ + /** + * temp helper var + */ + let tiles_temp: string[] = []; + for (let t of Object.keys(indices)) { + tiles_temp.push(t); + } + /** + * order of which tiles to consider, sampled randomly from indices + */ + let tileOrder: string[] = []; + + + /** + * tiles that are filled in + */ + let tilesFilled: Record = {}; + /** + * indices that are filled in + */ + let indexFilled: Record = {}; + + // Determine order of filling tiles + while (tiles_temp.length > 0) { + let ind = Math.floor(KDRandom() * tiles_temp.length); + if (indices[tiles_temp[ind]]) + tileOrder.push(tiles_temp[ind]); + else { + indexFilled[tiles_temp[ind]] = ''; + + // @ts-ignore + tilesFilled[tiles_temp[ind]] = {}; + } + tiles_temp.splice(ind, 1); + } + + + /** + * Count of each tag in a filled tile + */ + let tagCounts: Record = {}; + + // Next we start filling in tiles! + + let fails = 0; + + let ii = 0; + + let globalTags: Record = Object.assign({}, data.params.globalTags || {}); + + if (KinkyDungeonStatsChoice.get("arousalMode")) globalTags.arousalMode = true; + if (KinkyDungeonStatsChoice.get("hardMode")) globalTags.hardMode = true; + + if (data?.MapData) { + let mapData: KDMapDataType = data.MapData; + if (mapData.JailFaction) { + for (let jf of mapData.JailFaction) { + globalTags["jf_" + jf] = true; + } + } + if (mapData.GuardFaction) { + for (let gf of mapData.GuardFaction) { + globalTags["gf_" + gf] = true; + } + } + if (mapData.MapFaction) { + globalTags["faction_" + mapData.MapFaction] = true; + } + } + + while (tileOrder.length > 0) { + let tileOrderInd = Math.floor(KDRandom() * tileOrder.length); + let tileSpot = tileOrder[tileOrderInd]; + let indX = parseInt(tileSpot.split(',')[0]); + let indY = parseInt(tileSpot.split(',')[1]); + if (indX == undefined || indY == undefined) { + fails += 1; + if (fails > 100) tileOrder = []; // Nuclear meltdown + console.log("Nuclear meltdown. Pls report. Tilespot = " + tileSpot); + continue; + } + + // Only place those adjacent to the first one!!! + if (ii == 0 || ( + (indices[tileSpot].includes('l') && indexFilled[(indX - 1) + ',' + (indY)]) + || (indices[tileSpot].includes('r') && indexFilled[(indX + 1) + ',' + (indY)]) + || (indices[tileSpot].includes('u') && indexFilled[(indX) + ',' + (indY - 1)]) + || (indices[tileSpot].includes('d') && indexFilled[(indX) + ',' + (indY + 1)]) + )) { + // Get location (and entrances) + + let cornerX = (indX - 1)*KDTE_Scale + 1; + let cornerY = (indY - 1)*KDTE_Scale + 1; + + // if already occupied we skip + if (indexFilled[tileSpot]) { + tileOrder.splice(tileOrderInd, 1); + continue; + } + + let index = indices[tileSpot]; + if (!index) { + fails += 1; + if (fails > 100) tileOrder = []; // Nuclear meltdown + console.log("Nuclear meltdown. Pls report. Index = " + index + ", Tilespot = " + tileSpot); + continue; + } + + // Get tile name based on weights (TODO) + let tileName = KD_GetMapTile(index, indX, indY, tilesFilled, indexFilled, tagCounts, requiredAccess, globalTags, indices, tagModifiers); + + // Get tile from array + let tile = KDMapTilesList[tileName]; + + let tags = KD_PasteTile(tile, cornerX, cornerY, data); + if (tags) { + for (let t of tags) { + if (!tagCounts[t]) tagCounts[t] = 1; + else tagCounts[t] += 1; + } + for (let xx = 1; xx <= tile.w; xx++) + for (let yy = 1; yy <= tile.h; yy++) { + tilesFilled[(indX + xx - 1) + "," + (indY + yy - 1)] = tile; + indexFilled[(indX + xx - 1) + "," + (indY + yy - 1)] = tile.index[xx + ',' + yy]; + KDMapData.CategoryIndex[(indX + xx - 1) + "," + (indY + yy - 1)] = { + category: tile.category, + tags: tags, + }; + } + } + + tileOrder.splice(tileOrderInd, 1); + } + + for (let t of Object.entries(maxTagFlags)) { + if (tagCounts[t[0]] >= t[1]) + globalTags["max" + t[0]] = true; + } + + ii += 1; + } + + console.log(tagCounts); + console.log(globalTags); + console.log(tilesFilled); + console.log(indexFilled); + + + + return tilesFilled; +} + +/** + * @param mapTile - Tile to be evaluated for weight + * @param tags - Tags of the INCOMING tile, not the current one + * @param tagCounts - Counts of all tags on the map at present + * @param tagModifiers - Tags of the incoming tile will get a multiplier if the incoming tile has it + */ +function KDGetTileWeight(mapTile: KDMapTile, tags: Record, tagCounts: Record, tagModifiers: Record): number { + let weight = mapTile.weight; + + // Forbid tags are not allowed + if (mapTile.forbidTags) { + for (let tag of mapTile.forbidTags) { + if (tags[tag]) return 0; + } + } + + // Require tags are all required + if (mapTile.requireTags) { + for (let tag of mapTile.requireTags) { + if (!tags[tag]) { + return 0; + } + } + } + + // Indextags are basically the index for tags that have special modifiers + for (let i = 0; i < mapTile.indexTags.length; i++) { + let not = mapTile.notTags && mapTile.notTags[i]; + if ( + (!not && tags[mapTile.indexTags[i]]) + || (not && !tags[mapTile.indexTags[i]])) { + // We abord if we've reached the max of this many tag + if (mapTile.maxTags[i] >= 0) { + let count = tagCounts[mapTile.maxTags[i]]; + if (count && count >= mapTile.maxTags[i]) return 0; + } + // We add weight + if (mapTile.bonusTags[i]) weight += mapTile.bonusTags[i]; + // We multiply weight, in sequence, AFTER bonus from the same tag + if (mapTile.multTags[i] != undefined) weight *= mapTile.multTags[i]; + + } + } + + if (weight > 0 && tagModifiers) { + for (let tag of mapTile.tags) { + if (tagModifiers[tag] != undefined) weight *= tagModifiers[tag]; + if (weight == 0) return 0; + } + } + + return weight; +} + + +/** + * @param index + * @param indX + * @param indY + * @param tilesFilled + * @param indexFilled + * @param tagCounts + * @param requiredAccess + * @param globalTags + * @param indices + * @param tagModifiers + */ +function KD_GetMapTile ( + index: string, + indX: number, + indY: number, + tilesFilled: Record, + indexFilled: Record, + tagCounts: Record, + requiredAccess: Record, + globalTags: Record, + indices: Record, + tagModifiers: Record +): string +{ + let tagList = { + "1,1": KDAggregateTileTags(indX, indY, 1, 1, tilesFilled, globalTags), + }; + + let tile = null; + + let WeightTotal = 0; + let Weights = []; + + + let maxWeight = 0; + + for (let mapTile of Object.values(KDMapTilesList)) { + if (mapTile.primInd == index || + (mapTile.flexEdge + && mapTile.flexEdge['1,1'] + && (mapTile.primInd.includes(index) + || (mapTile.flexEdgeSuper && mapTile.flexEdgeSuper['1,1'])))) { + if (!KDCheckMapTileFilling(mapTile, indX, indY, indices, requiredAccess, indexFilled)) continue; + + if (!KDCheckMapTileAccess(mapTile, indX, indY, indexFilled, requiredAccess)) continue; + + // Aggregate tags for the creation and evaluation of this tile, caching them if needed + let tags = tagList[mapTile.w + ',' + mapTile.h]; + if (!tags) { + tags = KDAggregateTileTags(indX, indY, mapTile.w, mapTile.h, tilesFilled, globalTags); + tagList[mapTile.w + ',' + mapTile.h] = tags; + } + + if (requiredAccess[indX + ',' + indY]) tags.start = true; + + // Determine tile candidate weight and then commit to the array if it's positive + let weight = KDGetTileWeight(mapTile, tags, tagCounts, tagModifiers); + if (weight > 0 && (maxWeight < KD_GENWEIGHTCUTOFF || weight >= KD_GENWEIGHTCUTOFF)) { + maxWeight = weight; + Weights.push({tile: mapTile, weight: WeightTotal}); + WeightTotal += mapTile.weight; + } + } + } + + if (maxWeight >= KD_GENWEIGHTCUTOFF) { + // Cull all tiles under the cutoff + for (let L = Weights.length - 1; L >= 0; L--) { + if (Weights[L].weight < KD_GENWEIGHTCUTOFF) { + Weights[L].weight = 0; + break; + } + } + } + + let selection = KDRandom() * WeightTotal; + + for (let L = Weights.length - 1; L >= 0; L--) { + if (selection > Weights[L].weight) { + tile = Weights[L].tile.name; + break; + } + } + + if (!tile) { + console.log("ERROR AT INDEX " + indX + "," + indY); + } + + return tile; +} + +/** + * @param mapTile + * @param indX + * @param indY + * @param indices + * @param requiredAccess + * @param indexFilled + */ +function KDCheckMapTileFilling(mapTile: KDMapTile, indX: number, indY: number, indices: Record, requiredAccess: Record, indexFilled: Record): boolean { + let passCount = 0; + // Skip over larger tiles that dont fit the tilesFilled map or are already filled + for (let xx = 1; xx <= mapTile.w; xx++) + for (let yy = 1; yy <= mapTile.h; yy++) { + let fail = false; + // The index store of the map tile, we compare to the indices of indexfilled + let ind = mapTile.index[xx + ',' + yy]; + // Skip map tile if out of bounds + if (indices[(xx + indX - 1) + ',' + (yy + indY - 1)] == undefined) return false; + // Skip this mapTile if it doesnt fit + if (ind != indices[(xx + indX - 1) + ',' + (yy + indY - 1)] && KDLooseIndexRankingSuspend(indices[(xx + indX - 1) + ',' + (yy + indY - 1)], ind, mapTile.w, mapTile.h, xx, yy)) { + if (mapTile.flexEdge && mapTile.flexEdge[xx + ',' + yy] && ( + (mapTile.flexEdgeSuper && mapTile.flexEdgeSuper[xx + ',' + yy]) || ( + // 1st condition: tile is inside this one + // 2nd condition: this tile doesn't need it + // 3rd condition: other index is already filled + (yy > 1 + || !indices[(xx + indX - 1) + ',' + (yy + indY - 1)].includes('u') + || indexFilled[(xx + indX - 1) + ',' + (yy + indY - 1 - 1)] != undefined) + && (yy < mapTile.h + || !indices[(xx + indX - 1) + ',' + (yy + indY - 1)].includes('d') + || indexFilled[(xx + indX - 1) + ',' + (yy + indY - 1 + 1)] != undefined) + && (xx < mapTile.w + || !indices[(xx + indX - 1) + ',' + (yy + indY - 1)].includes('l') + || indexFilled[(xx + indX - 1 - 1) + ',' + (yy + indY - 1)] != undefined) + && (xx > 1 + || !indices[(xx + indX - 1) + ',' + (yy + indY - 1)].includes('r') + || indexFilled[(xx + indX - 1 + 1) + ',' + (yy + indY - 1)] != undefined) + ))) fail = true; + else return false; + } + // Skip this mapTile if it's already filled + if (indexFilled[(xx + indX - 1) + ',' + (yy + indY - 1)]) return false; + // Make sure none of the tile overlaps with required access... + if (mapTile.w != 1 || mapTile.h != 1 || (mapTile.inaccessible && mapTile.inaccessible.length > 0)) { + if (requiredAccess[(xx + indX - 1) + ',' + (yy + indY - 1)]) return false; + } + if (!fail) + passCount += 1; + } + return passCount > 0; +} + +/** Suspends the inside of large tiles */ +function KDLooseIndexRankingSuspend(indexCheck: string, indexTile: string, w: number, h: number, xx: number, yy: number): boolean { + if (w == 1 && h == 1) return true; // Tiles that are 1/1 dont get requirements suspended + if (xx > 1 && xx < w && yy > 1 && yy < h) return false; // Suspended tiles in the middle + if (!indexCheck) return true; // This means we hit the border + if (!indexTile) return true; // This is bad but it shouldnt crash the game. We just dont place the tile + if (indexCheck.includes('u') && yy == 1 && !indexTile.includes('u')) return true; // Dont suspend if we dont have the appropriate index entrance + if (indexCheck.includes('d') && yy == h && !indexTile.includes('d')) return true; // Dont suspend if we dont have the appropriate index entrance + if (indexCheck.includes('l') && xx == 1 && !indexTile.includes('l')) return true; // Dont suspend if we dont have the appropriate index entrance + if (indexCheck.includes('r') && xx == w && !indexTile.includes('r')) return true; // Dont suspend if we dont have the appropriate index entrance + return false; +} + +/** + * @param mapTile + * @param indX + * @param indY + * @param indexFilled + * @param requiredAccess + */ +function KDCheckMapTileAccess(mapTile: KDMapTile, indX: number, indY: number, indexFilled: Record, _requiredAccess: Record) { + // If any entrance pairs are inaccessible then BOTH must be filled in... + if (mapTile.inaccessible) { + for (let access of mapTile.inaccessible) { + let XX1 = indX + access.indX1 - 1; + let XX2 = indX + access.indX2 - 1; + let YY1 = indY + access.indY1 - 1; + let YY2 = indY + access.indY2 - 1; + + if ((access.dir1 == "l" && !indexFilled[(XX1 - 1) + ',' + (YY1)]) + || (access.dir1 == "r" && !indexFilled[(XX1 + 1) + ',' + (YY1)]) + || (access.dir1 == "u" && !indexFilled[(XX1) + ',' + (YY1 - 1)]) + || (access.dir1 == "d" && !indexFilled[(XX1) + ',' + (YY1 + 1)]) + ) return false; + + if ((access.dir2 == "l" && !indexFilled[(XX2 - 1) + ',' + (YY2)]) + || (access.dir2 == "r" && !indexFilled[(XX2 + 1) + ',' + (YY2)]) + || (access.dir2 == "u" && !indexFilled[(XX2) + ',' + (YY2 - 1)]) + || (access.dir2 == "d" && !indexFilled[(XX2) + ',' + (YY2 + 1)]) + ) return false; + } + } + return true; +} + +/** + * @param tile + * @param x + * @param y + * @param y + */ +function KD_PasteTile(tile: KDMapTile, x: number, y: number, data: any): string[] { + let tileWidth = KDTE_Scale * tile.w; + let tileHeight = KDTE_Scale * tile.h; + // Avoid errors + tile = JSON.parse(JSON.stringify(tile)); + + let MazeSeeds = []; + let MazeBlock = []; + + for (let xx = 0; xx < tileWidth; xx++) + for (let yy = 0; yy < tileHeight; yy++) { + let tileTile = tile.grid[xx + yy*(tileWidth+1)]; + KinkyDungeonMapSetForce(x + xx, y + yy, tileTile); + if (tileTile == 'B' && !data.notraps && KinkyDungeonStatsChoice.has("Nowhere")) { + if (KDRandom() < 0.5) + KinkyDungeonTilesSet((x + xx) + "," + (y + yy), { + Type: "Trap", + Trap: "BedTrap", + Furniture: "Bed", + }); + } + } + + if (tile.Keyring) { + for (let k of tile.Keyring) { + KDGameData.KeyringLocations.push({x:x + k.x, y:y + k.y}); + } + } + + if (tile.Labels) { + for (let k of Object.values(tile.Labels)) { + for (let l of k) { + l.x += x; + l.y += y; + KDAddLabel(l); + } + } + } + + if (tile.POI) + for (let origPoi of tile.POI) { + let poi = Object.assign({}, origPoi); + KinkyDungeonPOI.push(poi); + poi.x = x + poi.x; + poi.y = y + poi.y; + if (poi.chance && KDRandom() > poi.chance) + poi.used = true; + } + for (let tileLoc of Object.entries(tile.Tiles)) { + let xx = parseInt(tileLoc[0].split(',')[0]); + let yy = parseInt(tileLoc[0].split(',')[1]); + if (xx != undefined && yy != undefined) { + if (tileLoc[1].MazeSeed) { + MazeSeeds.push({x: xx, y: yy, seed: tileLoc[1].MazeSeed}); + } else if (tileLoc[1].MazeBlock) { + MazeBlock.push({x: xx, y: yy}); + } + let gennedTile = KDCreateTile(xx+x, yy+y, Object.assign({}, tileLoc[1]), data); + if (gennedTile) + KinkyDungeonTilesSet((xx + x) + "," + (yy + y), gennedTile); + if (tileLoc[1] && tileLoc[1].OL) { + if (!KinkyDungeonTilesGet((xx + x) + "," + (yy + y))) KinkyDungeonTilesSet((xx + x) + "," + (yy + y), {OL: true}); + else KinkyDungeonTilesGet((xx + x) + "," + (yy + y)).OL = true; + } + } + } + for (let tileLoc of Object.entries(tile.Skin)) { + let xx = parseInt(tileLoc[0].split(',')[0]); + let yy = parseInt(tileLoc[0].split(',')[1]); + if (xx != undefined && yy != undefined) { + KDMapData.TilesSkin[(xx + x) + "," + (yy + y)] = tileLoc[1]; + } + } + /*for (let jail of tile.Jail) { + let newJail = Object.assign({}, jail); + newJail.x += x; + newJail.y += y; + KDMapData.JailPoints.push(newJail); + + }*/ + + for (let tileLoc of Object.entries(tile.effectTiles)) { + let xx = parseInt(tileLoc[0].split(',')[0]); + let yy = parseInt(tileLoc[0].split(',')[1]); + if (xx != undefined && yy != undefined) { + for (let eTile of Object.entries(tileLoc[1])) { + KDCreateEffectTileTile(xx+x, yy+y, eTile[1], data); + } + } + } + + if (MazeSeeds.length > 0) { + for (let seed of MazeSeeds) { + let maze = KDGenMaze(seed.x, seed.y, tile, seed.seed, MazeBlock); + for (let t of maze) { + if (KinkyDungeonMapGet(t.x + x, t.y + y) == '1') + KinkyDungeonMapSet(t.x + x, t.y + y, '0'); + } + let pillarToDoodad = seed.seed?.pillarToDoodad || false; + if (pillarToDoodad) { + for (let xx = 1; xx < tileWidth-1; xx++) + for (let yy = 1; yy < tileHeight-1; yy++) { + let neighbors = 0; + for (let xxx = -1; xxx <= 1; xxx++) + for (let yyy = -1; yyy <= 1; yyy++) { + if (!KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x + xx + xxx, y + yy + yyy))) { + neighbors += 1; + } + } + if (neighbors == 1 && KinkyDungeonMapGet(x + xx, y + yy) == '1') KinkyDungeonMapSet(x + xx, y + yy, 'X'); + } + } + } + + } + + return tile.tags; +} + +/** + * @param startX + * @param startY + * @param tile + * @param seed + * @param MazeBlock + */ +function KDGenMaze(startX: number, startY: number, tile: any, seed: any, _MazeBlock: { x: number, y: number }[]): { x: number, y: number }[] { + let tileWidth = Math.round(KDTE_Scale * tile.w); + let tileHeight = Math.round(KDTE_Scale * tile.h); + let scale = seed?.scale || 1; + let branchchance = seed?.branchchance || 0; + let endchance = seed?.endchance || 0; + let hbias = seed?.hbias || 0; + let vbias = seed?.vbias || 0; + let wobble = seed?.wobble || 0; + + //let getGrid = (x, y) => { + //return tile.grid[x + y*(tileWidth+1)]; + //}; + let isMazeBlock = (x: number, y: number) => { + return tile.Tiles && tile.Tiles[x + ',' + y] && tile.Tiles[x + ',' + y].MazeBlock; + }; + + let ActivatedTiles = {}; + + let isValid = (x: number, y: number, allowActivated: boolean): boolean => { + if (x >= 0 && y >= 0 && x+scale <= tileWidth && y+scale <= tileHeight) { + //if (getGrid(x, y) != '1') return false; + if (isMazeBlock(x, y)) return false; + if (!allowActivated && ActivatedTiles[x + ',' + y]) return false; + return true; + } + return false; + }; + + + // Growing Tree algorithm + let CarvedTiles = []; + let ActiveTiles = []; + let EndPoints = []; + let BacktrackLinks: { [ _: string ] : { x: number; y: number } }[] = []; + let RemoveTiles: Record[] = []; + + let recordBacktrack = endchance > 0; + + let chooseNext = () => { + if (ActiveTiles.length == 0) return null; // We are done + if (seed) { + if (seed.newest && KDRandom() < seed.newest) return ActiveTiles[ActiveTiles.length - 1]; + if (seed.oldest && KDRandom() < seed.oldest) return ActiveTiles[0]; + } + return ActiveTiles[Math.floor(KDRandom() * ActiveTiles.length)]; + }; + + // xe = x_edge, ye = y_edge + let spread = (x: number, y: number, xe: number, ye: number): boolean => { + // Carve a path if its valid + // Chance to merge into an existing path + if (isValid(x, y, KDRandom() < branchchance) && !isMazeBlock(xe, ye)) { + ActiveTiles.push({x: x, y: y}); + ActivatedTiles[(x) + ',' + (y)] = true; + let wob = KDRandom() < wobble; + let wobx = Math.floor(scale*KDRandom()); + let woby = Math.floor(scale*KDRandom()); + for (let xx = 0; xx < scale; xx++) + for (let yy = 0; yy < scale; yy++) + if (!wob || (xx != wobx && yy != woby)) + CarvedTiles.push({x:xx+xe, y:yy+ye}); + return true; + } + return false; + }; + + let operate = (x: number, y: number) => { + for (let xx = 0; xx < scale; xx++) + for (let yy = 0; yy < scale; yy++) + CarvedTiles.push({x:xx+x, y:yy+y}); + + // Make a random adjacent tile valid + let succeed = false; + let options = [ + {x: x + 2*scale, y: y, xe:x+1*scale, ye:y}, + {x: x - 2*scale, y: y, xe:x-1*scale, ye:y}, + {x: x, y: y+2*scale, xe:x, ye:y+1*scale}, + {x: x, y: y-2*scale, xe:x, ye:y-1*scale}, + ]; + while (options.length > 0) { + let i = Math.floor(options.length * KDRandom()); + // Bias + if (hbias && options[i].x == x && options.length > 2 && KDRandom() < hbias) continue; + else if (vbias && options[i].y == y && options.length > 2 && KDRandom() < vbias) continue; + // Try all + if (spread(options[i].x, options[i].y, options[i].xe, options[i].ye)) { + succeed = true; + if (recordBacktrack) { + if (!BacktrackLinks[x + ',' + y]) { + BacktrackLinks[x + ',' + y] = {}; + } + if (!BacktrackLinks[options[i].xe + ',' + options[i].ye]) { + BacktrackLinks[options[i].xe + ',' + options[i].ye] = {}; + } + if (!BacktrackLinks[options[i].x + ',' + options[i].y]) { + BacktrackLinks[options[i].x + ',' + options[i].y] = {}; + } + BacktrackLinks[x + ',' + y][options[i].xe + ',' + options[i].ye] + = {x: options[i].xe, y: options[i].ye}; + BacktrackLinks[options[i].xe + ',' + options[i].ye][options[i].x + ',' + options[i].y] + = {x: options[i].x, y: options[i].y}; + BacktrackLinks[options[i].xe + ',' + options[i].ye][x + ',' + y] + = {x: x, y: y}; + BacktrackLinks[options[i].x + ',' + options[i].y][options[i].xe + ',' + options[i].ye] + = {x: options[i].xe, y: options[i].ye}; + } + break; + } + options.splice(i, 1); + } + + // Remove this from active tiles if no luck + if (!succeed) { + for (let t of ActiveTiles) { + if (t.x == x && t.y == y) { + ActiveTiles.splice(ActiveTiles.indexOf(t), 1); // TODO optimize + if (recordBacktrack && BacktrackLinks[t.x + ',' + t.y] && Object.values(BacktrackLinks[t.x + ',' + t.y]).length == 1) + EndPoints.push({x: t.x, y: t.y}); + } + } + } + + + // Choose the next tile + return chooseNext(); + }; + + + // Start with the seed tile + ActiveTiles.push({x: startX, y: startY}); + let activeTile = operate(startX, startY); + + while (activeTile) { + activeTile = operate(activeTile.x, activeTile.y); + } + + + // optionally we have a chance to remove brances up until a branch + + if (endchance > 0) { + for (let endp of EndPoints) { + let x = endp.x; + let y = endp.y; + if (KDRandom() < endchance && BacktrackLinks[x + ',' + y]) { + // This is a dead end, now lets remove it unless its on the border + let links: any[] = Object.values(BacktrackLinks[x + ',' + y]) + .filter((link: { x: number; y: number}) => {return !RemoveTiles[link.x + ',' + link.y];}); + while (links?.length <= 1) { + // only go until there are branches + for (let xx = 0; xx < scale; xx++) + for (let yy = 0; yy < scale; yy++) + RemoveTiles[(x+xx) + ',' + (y+yy)] = true; + if (links?.length > 0) { + x = links[0].x; + y = links[0].y; + links = (links.length > 0 && BacktrackLinks[x + ',' + y]) ? + Object.values(BacktrackLinks[x + ',' + y]) + .filter((link: { x: number; y: number}) => {return !RemoveTiles[link.x + ',' + link.y];}) : null; + } else { + links = null; + } + + + } + } + } + + let newCarved = []; + + for (let t of CarvedTiles) { + if (!RemoveTiles[t.x + ',' + t.y]) { + newCarved.push(t); + } + } + + CarvedTiles = newCarved; + } + + return CarvedTiles; +} + + +let KDEffectTileGen: Record any> = { + "TorchUnlit": (x, y, tile, tileGenerator, data) => { + let torchlitchance = data.params.torchlitchance || 0.6; + /* + let torchreplace = data.params.torchreplace; + + let spr = torchreplace ? torchreplace.sprite : "Torch"; + if ((!torchreplace || torchreplace.unlitsprite) && KDRandom() > torchlitchance) { + spr = torchreplace ? torchreplace.unlitsprite : "TorchUnlit"; + } + KDCreateEffectTile(x, y, { + name: spr, + duration: 9999, infinite: true, + }, 0);*/ + let mapMod = null; + if (KDGameData.MapMod) { + mapMod = KDMapMods[KDGameData.MapMod]; + } + let altRoom = KDGameData.RoomType; + let altType = altRoom ? KinkyDungeonAltFloor((mapMod && mapMod.altRoom) ? mapMod.altRoom : altRoom) : KinkyDungeonBossFloor(data.Floor); + if (KDRandom() < torchlitchance) + KDTorch(x, y-1, altType, data.params); + else + KDTorchUnlit(x, y-1, altType, data.params); + return null; + }, + "Torch": (x, y, tile, tileGenerator, data) => { + /*let torchlitchance = 1.0; + let torchreplace = data.params.torchreplace; + + let spr = torchreplace ? torchreplace.sprite : "Torch"; + if ((!torchreplace || torchreplace.unlitsprite) && KDRandom() > torchlitchance) { + spr = torchreplace ? torchreplace.unlitsprite : "TorchUnlit"; + } + KDCreateEffectTile(x, y, { + name: spr, + duration: 9999, infinite: true, + }, 0);*/ + + let mapMod = null; + if (KDGameData.MapMod) { + mapMod = KDMapMods[KDGameData.MapMod]; + } + let altRoom = KDGameData.RoomType; + let altType = altRoom ? KinkyDungeonAltFloor((mapMod && mapMod.altRoom) ? mapMod.altRoom : altRoom) : KinkyDungeonBossFloor(data.Floor); + KDTorch(x, y-1, altType, data.params); + return null; + }, + "Wire": (x, y, tile, tileGenerator, data) => { + KDCreateEffectTile(x, y, { + name: "Wire", + duration: 9999, infinite: true, + }, 0); + return null; + }, +}; + +/** + * @type {Record any>} + */ +let KDTileGen = { + "Rubble": (x, y, tile, tileGenerator, data) => { + let rubblechance = data.params.rubblechance || 0.5; + if (KinkyDungeonStatsChoice.get("Pristine")) rubblechance *= 0.3; + if (KDRandom() < rubblechance) + KinkyDungeonMapSet(x, y, 'R'); + else if (KDRandom() < rubblechance * rubblechance - 0.01) + KinkyDungeonMapSet(x, y, '/'); + else + KinkyDungeonMapSet(x, y, 'r'); + return null; + }, + "RubbleNoMend": (x, y, tile, tileGenerator, data) => { + let rubblechance = data.params.rubblechance || 0.5; + if (KinkyDungeonStatsChoice.get("Pristine")) rubblechance *= 0.3; + if (KDRandom() < rubblechance) + KinkyDungeonMapSet(x, y, 'R'); + else if (KDRandom() < rubblechance * rubblechance - 0.01) + KinkyDungeonMapSet(x, y, '/'); + else + KinkyDungeonMapSet(x, y, 'r'); + return null; + }, + "Debris": (x, y, tile, tileGenerator, data) => { + let rubblechance = data.params.rubblechance || 1; + if (tileGenerator.Always || KDRandom() < rubblechance) + KinkyDungeonMapSet(x, y, '/'); + else + KinkyDungeonMapSet(x, y, 'r'); + return null; + }, + "Barrel": (x, y, tile, tileGenerator, data) => { + let barrelChance = data.params.barrelChance || 0.25; + if (tileGenerator.Always || KDRandom() < barrelChance) + KinkyDungeonMapSet(x, y, 'L'); + else + KinkyDungeonMapSet(x, y, 'r'); + return null; + }, + "Spawn": (x, y, tile, tileGenerator, data) => { + data.spawnpoints.push({ + x:x, + y:y, + required: tileGenerator.required, + ftags: tileGenerator.filterTags, + tags: tileGenerator.tags, + AI: tileGenerator.AI,faction: tileGenerator.faction, + levelBoost: tileGenerator.levelBoost, + forceIndex: tileGenerator.forceIndex, + }); + KinkyDungeonMapSet(x, y, '0'); + return null; + }, + "ForceSpawn": (x, y, tile, tileGenerator, data) => { + if (!tileGenerator.Chance || KDRandom() < tileGenerator.Chance) { + let enemy = KinkyDungeonGetEnemy(tileGenerator.tags, + MiniGameKinkyDungeonLevel + (tileGenerator.levelBoost || 0), + tileGenerator.forceIndex || (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + '0', tileGenerator.required, tileGenerator.requireHostile, tileGenerator.bonusTags, tileGenerator.filterTags, tileGenerator.requireSingleTag); + if (enemy) { + let en = DialogueCreateEnemy(x, y, enemy.name); + if (en && tileGenerator.faction) { + en.faction = tileGenerator.faction; + } + KDRunCreationScript(en, KDGetCurrentLocation()); + } + } + KinkyDungeonMapSet(x, y, '0'); + return null; + }, + "Prisoner": (x, y, tile, tileGenerator, data) => { + SetpieceSpawnPrisoner(x, y); + KinkyDungeonMapSet(x, y, '0'); + return null; + }, + "Chest": (x, y, tile, tileGenerator, data) => { + if (tileGenerator.Loot) { + if (tileGenerator.Priority || KDRandom() < (tileGenerator.Chance || 0.5)) { + KinkyDungeonMapSet(x, y, 'C'); + KDGameData.ChestsGenerated.push(tileGenerator.Loot); + return { + NoTrap: tileGenerator.NoTrap, + Type: tileGenerator.Lock ? "Lock" : undefined, Lock: tileGenerator.Lock == "Red" ? KDRandomizeRedLock() : tileGenerator.Lock, + Loot: tileGenerator.Lock == "Blue" ? "blue" : (tileGenerator.Loot ? tileGenerator.Loot : "chest"), + Faction: tileGenerator.Faction, + Roll: KDRandom(), + refill: tileGenerator.refill, + origloot: (tileGenerator.Loot ? tileGenerator.Loot : "storage"), + Special: tileGenerator.Lock == "Blue", + RedSpecial: tileGenerator.Lock?.includes("Red"), + lootTrap: KDGenChestTrap(false, x, y, (tileGenerator.Loot ? tileGenerator.Loot : "chest"), tileGenerator.Lock, tileGenerator.NoTrap), + }; + } else { + KinkyDungeonMapSet(x, y, 'c'); + } + } else { + data.chestlist.push(({x: x, y: y, priority: tileGenerator.Priority, NoTrap: tileGenerator.NoTrap})); + KinkyDungeonMapSet(x, y, '2'); + } + return null; + }, + "GuardedChest": (x, y, tile, tileGenerator, data) => { + KinkyDungeonMapSet(x, y, 'C'); + let faction = KDPlaceChest(x - 1, y - 1, 3, data.chestlist, data.spawnpoints, true); + return { + NoTrap: tileGenerator.NoTrap, + Type: tileGenerator.Lock ? "Lock" : undefined, Lock: tileGenerator.Lock, + Loot: tileGenerator.Lock == "Blue" ? "blue" : (tileGenerator.Loot ? tileGenerator.Loot : "storage"), + Faction: faction, + refill: tileGenerator.refill, + origloot: (tileGenerator.Loot ? tileGenerator.Loot : "storage"), + Roll: KDRandom(), + Special: tileGenerator.Lock == "Blue", + RedSpecial: tileGenerator.Lock?.includes("Red"), + lootTrap: KDGenChestTrap(false, x, y, (tileGenerator.Loot ? tileGenerator.Loot : "chest"), tileGenerator.Lock, tileGenerator.NoTrap), + }; + }, + "ChestOrShrine": (x, y, tile, tileGenerator, data) => { + let chestcount = data.params.chestcount || 1; + let shrinecount = data.params.shrinecount || 1; + if (KDRandom() < (chestcount) / Math.max(1, chestcount + shrinecount)) + data.chestlist.push(({x: x, y: y, NoTrap: tileGenerator.NoTrap})); + else + data.shrinelist.push(({x: x, y: y, NoTrap: tileGenerator.NoTrap})); + KinkyDungeonMapSet(x, y, '2'); + return null; + }, + "Door": (x, y, tile, tileGenerator, data) => { + let doorchance = data.params.doorchance; // Chance door will be closed + let nodoorchance = data.params.nodoorchance || 0; // Chance of there not being a door + + // No doors/grates next to each other unless forced + if ("Ddg".includes(KinkyDungeonMapGet(x - 1, y)) + || "Ddg".includes(KinkyDungeonMapGet(x + 1, y)) + || "Ddg".includes(KinkyDungeonMapGet(x, y - 1)) + || "Ddg".includes(KinkyDungeonMapGet(x, y + 1))) + nodoorchance = 1.0; + else if ( + !(KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 1, y)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x - 1, y))) + && !(KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x, y + 1)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x, y - 1))) + ) { + // No doors if there isn't a straight path + nodoorchance = 1.0; + } + + // The door algorithm has been deprecated + //let doorlockchance = data.params.doorlockchance; // Max treasure chest count + + if (tileGenerator.Priority || KDRandom() > nodoorchance) { + if (tileGenerator.AlwaysClose || KDRandom() < doorchance) { + KinkyDungeonMapSet(x, y, 'D'); + } else { + KinkyDungeonMapSet(x, y, 'd'); + } + return {Type: "Door", Lock: tileGenerator.Lock == "Red" ? KDRandomizeRedLock() : tileGenerator.Lock, OL: tileGenerator.OL, RequiredDoor: tileGenerator.Priority, DoorSkin: tileGenerator.DoorSkin}; + } else { + KinkyDungeonMapSet(x, y, '2'); + if (nodoorchance <= 0.99) { + return {PotentialDoor: true, OL: tileGenerator.OL}; + } + } + return null; + }, + "Shrine": (x, y, tile, tileGenerator, data) => { + data.shrinelist.push(({x: x, y: y, priority: tileGenerator.Priority})); + KinkyDungeonMapSet(x, y, 'a'); + return null; + }, + "DollDropoff": (x, y, tile, tileGenerator, data) => { + if (KinkyDungeonStatsChoice.get("NoDoll")) { + KinkyDungeonMapSet(x, y, '0'); + return null; + } + KinkyDungeonMapSet(x, y, '5'); + KDMapData.JailPoints.push({x: x, y: y, type: "dropoff", direction: tileGenerator.direction || {x: 0, y: -1}, radius: 1, restrainttags: ["dollstand"]}); + //KinkyDungeonTilesSkinSet(x + "," + y, 'Bel'); + return {Sprite: "Floor", Overlay: tileGenerator.Overlay || "DollDropoff", Type: "DollDropoff"}; + }, + "Cage": (x, y, tile, tileGenerator, data) => { + KinkyDungeonMapSet(x, y, 'L'); + KDMapData.JailPoints.push({x: x, y: y, type: "furniture", radius: 1}); + if (KinkyDungeonStatsChoice.get("MoreKinkyFurniture") && KDRandom() < 0.6) { + // Decide which furniture + return {Type: "Furniture", Furniture: "DisplayStand"}; + } + return {Type: "Furniture", Furniture: "Cage"}; + }, + "DisplayStand": (x, y, tile, tileGenerator, data) => { + KinkyDungeonMapSet(x, y, 'L'); + KDMapData.JailPoints.push({x: x, y: y, type: "furniture", radius: 1}); + return {Type: "Furniture", Furniture: "DisplayStand"}; + }, + "JailBed": (x, y, tile, tileGenerator, data) => { + KinkyDungeonMapSet(x, y, 'B'); + KDMapData.JailPoints.push({x: x, y: y, type: "jail", radius: 1}); + return {Jail: true, OL: true}; + }, + "JailPoint": (x, y, tile, tileGenerator, data) => { + KinkyDungeonMapSet(x, y, '0'); + KDMapData.JailPoints.push({x: x, y: y, type: "jail", radius: 1}); + return {Jail: true, OL: true}; + }, + "Furniture": (x, y, tile, tileGenerator, data) => { + //KinkyDungeonMapSet(x, y, tileGenerator.tile); + KDMapData.JailPoints.push({x: x, y: y, type: (tileGenerator.jail?.type) || "furniture", radius: (tileGenerator.jail?.radius) || 1}); + return {Type: "Furniture", Furniture: tileGenerator.Furniture}; + }, + "Table": (x, y, tile, tileGenerator, data) => { + KinkyDungeonMapSet(x, y, 'F'); + let type = ""; + + if (tileGenerator.Food == "Plate") { + let WeightTotal = 0; + let Weights = []; + + for (let obj of Object.values(KDFood)) { + Weights.push({event: obj, weight: WeightTotal}); + WeightTotal += obj.Weight; + } + + let selection = KDRandom() * WeightTotal; + + for (let L = Weights.length - 1; L >= 0; L--) { + if (selection > Weights[L].weight) { + type = Weights[L].event.Food; + break; + } + } + } + return {Food: type, Type: "Food"}; + }, + "Trap": (x, y, tile, tileGenerator, data) => { + let trapchance = data.params.trapchance || 0.1; + if (tileGenerator.Always || KDRandom() < trapchance) + data.traps.push(({x: x, y: y})); + KinkyDungeonMapSet(x, y, '2'); + return null; + }, + "Charger": (x, y, tile, tileGenerator, data) => { + if (tileGenerator.Priority) { + return {Type: "Charger", NoRemove: KinkyDungeonMapGet(x, y) == '=', lightColor: KDChargerColor, Light: (KinkyDungeonMapGet(x, y) == '=' ? KDChargerLight : undefined)}; + } + KinkyDungeonMapSet(x, y, '-'); + data.chargerlist.push(({x: x, y: y})); + return null; + }, + "Conveyor": (x, y, tile, tileGenerator, data) => { + KinkyDungeonMapSet(x, y, 'V'); + return {Type: "Conveyor", DX: tileGenerator.DX, DY: tileGenerator.DY, OL: true, wireType: tileGenerator.wireType, SwitchMode: tileGenerator.SwitchMode}; + }, + "SafetyConveyor": (x, y, tile, tileGenerator, data) => { + KinkyDungeonMapSet(x, y, 'v'); + return {Type: "Conveyor", DX: tileGenerator.DX, DY: tileGenerator.DY, OL: true, wireType: tileGenerator.wireType, SwitchMode: tileGenerator.SwitchMode, Sfty: true}; + }, + "DollSupply": (x, y, tile, tileGenerator, data) => { + KinkyDungeonMapSet(x, y, 'u'); + return {Type: "DollSupply", index: 0, cd: 0, rate: tileGenerator.rate || 10, count: tileGenerator.count, dollType: tileGenerator.dollType, SwitchMode: tileGenerator.SwitchMode, wireType: tileGenerator.wireType}; + }, + "DollTerminal": (x, y, tile, tileGenerator, data) => { + KinkyDungeonMapSet(x, y, 't'); + return {Type: "DollTerminal", OL: true}; + }, + "Skin": (x, y, tile, tileGenerator, data) => { + return {Skin: tileGenerator.Skin, Skin2: tileGenerator.Skin}; + }, + "SkinCode": (x, y, tile, tileGenerator, data) => { + return {SkinCode: tileGenerator.SkinCode, Skin2: tileGenerator.Skin2, Skin: tileGenerator.Skin}; + }, + "BondageMachine": (x, y, tile, tileGenerator, data) => { + KinkyDungeonMapSet(x, y, 'N'); + return {Type: "BondageMachine", OL: true, Binding: tileGenerator.Binding}; + }, + "EffectTile": (x, y, tile, tileGenerator, data) => { + KDCreateEffectTile(x, y, { + name: tileGenerator.Tile, + duration: 9999, + }, 0); + return null; + }, + "AutoDoor": (x, y, tile, tileGenerator, data) => { + return {wireType: tileGenerator.wireType}; + }, +}; + +/** + * Creates a map tile based on a generator tile + * @param x + * @param y + * @param tileGenerator + * @param data + */ +function KDCreateTile(x: number, y: number, tileGenerator: any, data: any): any { + let tile: any = {}; + if (tileGenerator.Type) { + tile = KDTileGen[tileGenerator.Type](x, y, tile, tileGenerator, data); + } else { + tile = Object.assign({}, tileGenerator); + tile.x = x; + tile.y = y; + } + if (tile) + return tile; +} + + +/** + * Creates a map tile based on a generator tile + * @param x + * @param y + * @param tileGenerator + * @param data + */ +function KDCreateEffectTileTile(x: number, y: number, tileGenerator: any, data: any): any { + let tile = {}; + if (tileGenerator.name && KDEffectTileGen[tileGenerator.name]) { + tile = KDEffectTileGen[tileGenerator.name](x, y, tile, tileGenerator, data); + } else { + tile = KDCreateEffectTile(x, y, { + name: tileGenerator.name, + duration: tileGenerator.duration, + }, 0); + } + if (tile) + return tile; +} + +/** + * Aggregates tags from nearby tiles for the specific tile + * @param {number} x - Top left corner + * @param {number} y - Top left corner + * @param {number} w - Tile size + * @param {number} h - Tile size + * @param {Record} tilesFilled + * @param {Record} globalTags + * @return {Record} + */ +function KDAggregateTileTags(x, y, w, h, tilesFilled, globalTags) { + /** + * Record of tag name => tile that has the tag + * @type {Record} + */ + let tags = Object.assign({}, globalTags); + + // Loop over tile's borders and add up tags + for (let indX = x - 1; indX <= x + w; indX++) + for (let indY = y - 1; indY <= y + h; indY++) { + let index = indX < x ? "L_" : (indX >= x + w ? "R_" : ""); + index = (indY < y ? "U" : (indY >= y + h ? "D" : "")) + index; + + if (index) { + let neighbor = tilesFilled[indX + ',' + indY]; + if (neighbor?.tags) { + for (let t of neighbor.tags) { + tags[index + t] = true; + tags[t] = true; + } + } + } + } + + return tags; +} + +/** + * + * @param {number} x + * @param {number} y + * @returns {{category: string, tags: string[]}} + */ +function KDGetCategoryIndex(x, y) { + if (KDMapData.CategoryIndex) { + return KDMapData.CategoryIndex[Math.ceil(x/KDTE_Scale) + ',' + Math.ceil(y/KDTE_Scale)]; + } + return {category: "", tags: []}; +} diff --git a/Game/src/map/KinkyDungeonEditorTiles.ts b/Game/src/map/KinkyDungeonEditorTiles.ts new file mode 100644 index 000000000..bd63a7ba0 --- /dev/null +++ b/Game/src/map/KinkyDungeonEditorTiles.ts @@ -0,0 +1,5 @@ +"use strict"; + +let KDMapTilesList: Record = +{"HallCross":{"name":"HallCross","Labels":{},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1110111\n0000000\n1110111\n1110111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.75}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"5,3":{"TorchUnlit":{"x":5,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"T_Left_Thinvert":{"name":"T_Left_Thinvert","w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n111d111\n1110L00\n1110000\n11100L0\n111d111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[],"Tiles":{"3,1":{"Type":"Door"},"3,5":{"Type":"Door"},"4,2":{"Type":"Barrel"},"5,4":{"Type":"Barrel"}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban"],"forbidTags":["silverchest"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"deadend_d":{"name":"deadend_d","w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11RRL11\n1L00001\n10000L1\n1000001\n1000001\n111d111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["urban"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"3,6":{"Type":"Door"},"5,3":{"Type":"Barrel"},"4,1":{"Type":"Barrel"},"1,2":{"Type":"Barrel"},"2,1":{"Type":"Rubble"},"3,1":{"Type":"Rubble"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"deadend_u":{"name":"deadend_u","Labels":{},"w":1,"h":1,"primInd":"u","index":{"1,1":"u"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n10L0001\n1000001\n1000001\n10000R1\n110LL11\n1111111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["urban"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"2,1":{"Type":"Barrel"},"4,5":{"Type":"Barrel"},"3,5":{"Type":"Barrel"},"5,4":{"Type":"Rubble"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"deadend_l":{"name":"deadend_l","w":1,"h":1,"primInd":"l","index":{"1,1":"l"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1LL00,1\n1L00001\nd000001\n10000R1\n1LL0011\n1111111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["urban"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"0,3":{"Type":"Door"},"1,5":{"Type":"Barrel"},"2,5":{"Type":"Barrel"},"1,1":{"Type":"Barrel"},"1,2":{"Type":"Barrel"},"2,1":{"Type":"Barrel"},"5,4":{"Type":"Rubble"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"deadend_r":{"name":"deadend_r","w":1,"h":1,"primInd":"r","index":{"1,1":"r"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11LL001\n1R00001\n1000000\n1L00001\n11L0001\n1111111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["urban"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"3,1":{"Type":"Barrel"},"2,5":{"Type":"Barrel"},"1,4":{"Type":"Barrel"},"2,1":{"Type":"Barrel"},"1,2":{"Type":"Rubble"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"narrow_noleft":{"name":"narrow_noleft","w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1100001\n1100000\n1100001\n1110111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.75}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_noright":{"name":"narrow_noright","w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1000011\n0000011\n1000011\n1110111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.75}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_noup":{"name":"narrow_noup","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1100001\n1100001\n0000000\n1100001\n1100001\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.75}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_nodown":{"name":"narrow_nodown","w":1,"h":1,"primInd":"ulr","index":{"1,1":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1100001\n1100001\n0000000\n1100001\n1100001\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.75}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_upright":{"name":"narrow_upright","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1100111\n1100000\n1100011\n1111111\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_upleft":{"name":"narrow_upleft","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1110011\n0000011\n1100011\n1111111\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_downleft":{"name":"narrow_downleft","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n,100011\n0000011\n1110011\n1110111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_downright":{"name":"narrow_downright","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n1100011\n1100000\n1100111\n1110111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":[],"effectTiles":{"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_vert":{"name":"narrow_vert","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1100111\n1100111\n11R0111\n1100111\n1100111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,3":{"Type":"Rubble"}},"effectTiles":{"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_horiz":{"name":"narrow_horiz","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n100R001\n0000000\n1111111\n1111111\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"Rubble"}},"effectTiles":{"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"VertChest":{"name":"VertChest","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"111D111\n1120211\n1120211\n112C211\n1120211\n1120211\n111D111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,0":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"3,6":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"}},"effectTiles":{"4,1":{"Torch":{"x":4,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["ignite","hot"]}},"2,1":{"Torch":{"x":2,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["ignite","hot"]}}},"Skin":[],"inaccessible":[{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"u","dir2":"d"},{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"d","dir2":"u"}],"tags":["door","locked","chest","wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"wide_horiz":{"name":"wide_horiz","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n0L0L0L0\n0000000\n00L0L00\n1111111\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"1,2":{"Type":"Barrel"},"2,4":{"Type":"Barrel"},"3,2":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"5,2":{"Type":"Barrel"}},"effectTiles":{"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":["silverchest"],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_vert":{"name":"wide_vert","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"1100011\n11L0011\n1100L11\n11L0011\n1100L11\n11L0011\n1100011\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,3":{"Type":"Barrel"},"4,2":{"Type":"Barrel"},"2,1":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"2,5":{"Type":"Barrel"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":["silverchest"],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"HallCrossWide":{"name":"HallCrossWide","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"urban","weight":10,"grid":"1100011\n1100011\n0000000\n0000000\n0000000\n1100011\n1100011\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[],"Tiles":[],"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"HallCrossWideDoors":{"name":"HallCrossWideDoors","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"urban","weight":10,"grid":"111d111\n1100011\n1000001\nd00000d\n1000001\n1100011\n111d111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[],"Tiles":{"6,3":{"Type":"Door"},"3,0":{"Type":"Door"},"3,6":{"Type":"Door"},"0,3":{"Type":"Door"}},"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"HallCrossWideRoom":{"name":"HallCrossWideRoom","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":3,"guard":true,"interesting":false}]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":15,"grid":"1100011\n1000001\n0010100\n000G000\n0010100\n1000001\n1100011\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,5":{"TorchUnlit":{"x":4,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,5":{"TorchUnlit":{"x":2,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","wide"],"forbidTags":["start"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"wide_upleft":{"name":"wide_upleft","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":1,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":1,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1100R11\n1,0R011\n000/R11\n000LL11\n00RLL11\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"4,3":{"Type":"Barrel"},"3,4":{"Type":"Barrel"},"4,2":{"Type":"Rubble"},"2,4":{"Type":"Rubble"},"3,1":{"Type":"Rubble"},"4,0":{"Type":"Rubble"},"3,2":{"Type":"Debris","Always":true}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","wide"],"forbidTags":["silverchest"],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_upright":{"name":"wide_upright","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":5,"y":3,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":1,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1100011\n1100011\n11RR000\n11LLR00\n11LL/00\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"4,4":{"Type":"Debris"},"3,3":{"Type":"Barrel"},"2,3":{"Type":"Barrel"},"2,4":{"Type":"Barrel"},"3,4":{"Type":"Barrel"},"2,2":{"Type":"Rubble"},"3,2":{"Type":"Rubble"},"4,3":{"Type":"Rubble"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_downleft":{"name":"wide_downleft","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":5,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":1,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n0RLLL11\n00RL/11\n000LL11\n1100R11\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"4,2":{"Type":"Barrel"},"3,2":{"Type":"Barrel"},"2,2":{"Type":"Barrel"},"3,3":{"Type":"Barrel"},"3,4":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"1,2":{"Type":"Rubble"},"2,3":{"Type":"Rubble"},"4,5":{"Type":"Rubble"},"4,3":{"Type":"Debris"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_downright":{"name":"wide_downright","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ulr","index":{"1,1":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1000001\n1000001\n000G000\n10+O+01\n1000001\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,4":{"Type":"Charger"},"4,4":{"Type":"Charger"},"3,4":{"Type":"ChestOrShrine"},"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_RoomNoLeft":{"name":"wide_RoomNoLeft","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1000001\n10+0001\n10OG000\n10+0001\n1000001\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,2":{"Type":"Charger"},"2,4":{"Type":"Charger"},"2,3":{"Type":"ChestOrShrine"},"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_RoomNoRight":{"name":"wide_RoomNoRight","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1000001\n1000+01\n000GO01\n1000+01\n1000001\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"4,3":{"Type":"ChestOrShrine"},"4,2":{"Type":"Charger"},"4,4":{"Type":"Charger"},"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_RoomNoDown":{"name":"wide_RoomNoDown","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ulr","index":{"1,1":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1000001\n1000001\n000G000\n10+O+01\n1000001\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,4":{"Type":"Charger"},"4,4":{"Type":"Charger"},"3,4":{"Type":"ChestOrShrine"},"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_RoomNoUp":{"name":"wide_RoomNoUp","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1000001\n10+O+01\n000G000\n1000001\n1000001\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"ChestOrShrine"},"2,2":{"Type":"Charger"},"4,2":{"Type":"Charger"},"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"T_Right_Thinvert":{"name":"T_Right_Thinvert","w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n111d111\n00L0111\n0000111\n0LL0111\n111d111\n1110111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[],"Tiles":{"3,5":{"Type":"Door"},"3,1":{"Type":"Door"},"2,2":{"Type":"Barrel"},"2,4":{"Type":"Barrel"},"1,4":{"Type":"Barrel"}},"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"wide_horizDoors":{"name":"wide_horizDoors","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n1000001\nd00000d\n1000001\n1111111\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"6,3":{"Type":"Door"},"0,3":{"Type":"Door"}},"effectTiles":{"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"wide_vertDoors":{"name":"wide_vertDoors","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"scale":7,"category":"urban","weight":10,"grid":"111d111\n1100011\n1100011\n1100011\n1100011\n1100011\n111d111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,0":{"Type":"Door"},"3,6":{"Type":"Door"}},"effectTiles":{"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"narrow_noleft_room":{"name":"narrow_noleft_room","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110011\n1111011\n1+01d11\n1O00000\n1+01d11\n1111011\n1110011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"4,4":{"Type":"Door"},"4,2":{"Type":"Door"},"1,3":{"Type":"ChestOrShrine"},"1,2":{"Type":"Charger"},"1,4":{"Type":"Charger"}},"effectTiles":{"5,3":{"TorchUnlit":{"x":5,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"3,3":{"TorchUnlit":{"x":3,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_noright_room":{"name":"narrow_noright_room","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1100111\n1101111\n11d10+1\n00000O1\n11d10+1\n1101111\n1100111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,2":{"Type":"Door"},"2,4":{"Type":"Door"},"5,3":{"Type":"ChestOrShrine"},"5,2":{"Type":"Charger"},"5,4":{"Type":"Charger"}},"effectTiles":{"3,3":{"TorchUnlit":{"x":3,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_noup_room":{"name":"narrow_noup_room","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1100111\n1101111\n11d10+1\n00000O1\n11d10+1\n1101111\n1100111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,2":{"Type":"Door"},"2,4":{"Type":"Door"},"5,3":{"Type":"ChestOrShrine"},"5,2":{"Type":"Charger"},"5,4":{"Type":"Charger"}},"effectTiles":{"3,3":{"TorchUnlit":{"x":3,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_noup_silver":{"name":"narrow_noup_silver","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":2,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11oCo11\n1100011\n0100010\n0d000d0\n111d111\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,1":{"Type":"Chest","Loot":"silver","Priority":true},"5,4":{"Type":"Door"},"1,4":{"Type":"Door"},"3,5":{"Type":"Door"}},"effectTiles":{"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow","silverchest"],"forbidTags":["silverchest"],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[1,1],"notTags":["",""]},"wide_horiz_chestshrine":{"name":"wide_horiz_chestshrine","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":2,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n002O200\n002G200\n0000000\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"ChestOrShrine"},"3,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"}},"effectTiles":{"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"narrow_vert_spawn":{"name":"narrow_vert_spawn","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":4,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1X222X1\n1G000G1\n1X2O2X1\n1G000G1\n1X222X1\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"ChestOrShrine"},"5,2":{"Type":"Spawn","required":[],"AI":"looseguard"},"1,2":{"Type":"Spawn","required":[],"AI":"looseguard"},"1,4":{"Type":"Spawn","required":[],"AI":"looseguard"},"5,4":{"Type":"Spawn","required":[],"AI":"looseguard"}},"effectTiles":{"4,1":{"Torch":{"x":4,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,1":{"Torch":{"x":2,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_horiz_spawn":{"name":"narrow_horiz_spawn","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":3,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1X222X1\n1G000G1\n002O000\n1G000G1\n1X222X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"ChestOrShrine"},"5,2":{"Type":"Spawn","required":[],"AI":"looseguard"},"5,4":{"Type":"Spawn","required":[],"AI":"looseguard"},"1,4":{"Type":"Spawn","required":[],"AI":"looseguard"},"1,2":{"Type":"Spawn","required":[],"AI":"looseguard"}},"effectTiles":{"4,1":{"Torch":{"x":4,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,1":{"Torch":{"x":2,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":["start"],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_uprightOpen":{"name":"narrow_uprightOpen","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":4,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1100111\n1?00000\n1000001\n1XLX111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":2,"y":5,"type":"furniture","radius":1}],"Tiles":{"2,5":{"Type":"Cage","Furniture":"Cage"}},"effectTiles":{"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_upleftOpen":{"name":"narrow_upleftOpen","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n111d111\n1110LL1\n0d00La1\n1120LL1\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"5,2":{"Type":"Barrel"},"5,4":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"4,3":{"Type":"Barrel"},"4,2":{"Type":"Barrel"},"1,3":{"Type":"Door"},"3,1":{"Type":"Door"}},"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_downleftOpen":{"name":"narrow_downleftOpen","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":1,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n112B211\n1120211\n0d00011\n112?211\n1120211\n1110111\n","POI":[],"Keyring":[{"x":3,"y":2}],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"1,3":{"Type":"Door"}},"effectTiles":{"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_downrightOpen":{"name":"narrow_downrightOpen","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":4,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1R1LLL1\n1L1g1d1\n1000100\n10L0111\n1000111\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":2,"y":4,"type":"furniture","radius":1}],"Tiles":{"2,4":{"Type":"Cage","Furniture":"Cage"},"1,2":{"Type":"Barrel","Always":true},"5,2":{"Type":"Door"},"3,1":{"Type":"Barrel"},"4,1":{"Type":"Barrel"},"5,1":{"Type":"Barrel"},"1,1":{"Type":"Rubble"}},"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_vert_dorm":{"name":"narrow_vert_dorm","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1C10CB1\n10D00B1\n1010GB1\n1Rb00B1\n1L10RB1\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"1,1":{"Priority":true},"2,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"4,3":{"Type":"Spawn","required":[],"AI":"looseguard"},"1,4":{"Type":"Rubble"},"1,5":{"Type":"Barrel","Always":true},"4,5":{"Type":"Rubble"},"4,1":{"Type":"Chest","Loot":"storage"}},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"narrow_horiz_cells":{"name":"narrow_horiz_cells","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1BR0GB1\n11bDb11\n0000000\n1R000L1\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"5,4":{"Type":"Barrel"},"1,4":{"Type":"Rubble"},"4,1":{"Type":"Prisoner"},"2,1":{"Type":"Rubble"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"1x2_Cells":{"name":"1x2_Cells","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":11,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":2,"guard":true,"interesting":true}]},"w":1,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":35,"grid":"111,111\n1000001\n10X0L01\n00G0000\n1021b11\n102bGB1\n102DGB1\n10210B1\n102bGB1\n1021b11\nd00000d\n10L0G01\n1000CB1\n1110111\n","POI":[],"Keyring":[{"x":4,"y":11}],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":4,"y":2,"type":"furniture","radius":1},{"x":2,"y":11,"type":"furniture","radius":1}],"Tiles":{"4,5":{"Type":"Prisoner"},"4,6":{"Type":"Prisoner"},"4,8":{"Type":"Prisoner"},"3,6":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"4,12":{"Type":"Chest"},"4,2":{"Type":"Cage","Furniture":"Cage"},"2,11":{"Type":"Cage","Furniture":"Cage"},"0,10":{"Type":"Door"},"6,10":{"Type":"Door"},"4,11":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"2,3":{"Type":"Spawn","required":[],"AI":"looseguard"}},"effectTiles":{"5,5":{"TorchUnlit":{"x":5,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,10":{"Torch":{"x":5,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","cells"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,5],"multTags":[1,1],"notTags":["",""]},"narrow_horizwide":{"name":"narrow_horizwide","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n1111111\n0002000\n000G000\n11g1111\n11000C1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"5,5":{"Type":"Chest"},"3,3":{"Type":"Spawn","required":[],"AI":"guard"}},"effectTiles":{"5,5":{"Torch":{"x":5,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"3,2":{"TorchUnlit":{"x":3,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow","2wide"],"maxTags":[-1,-1,-1],"bonusTags":[0,0,0],"multTags":[0,2,2],"notTags":["","",""]},"narrow_vertWide":{"name":"narrow_vertWide","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1100111\n1X00g01\n1100101\n1AGG1/1\n1100101\n1X00g01\n1100111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,3":{"Type":"Spawn","required":[],"AI":"guard"},"3,3":{"Type":"Spawn","required":[],"AI":"guard"},"5,3":{"Type":"Debris"},"1,3":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow","2wide"],"maxTags":[-1,-1,-1],"bonusTags":[0,0,0],"multTags":[0,2,1],"notTags":["","",""]},"deadend_dChest":{"name":"deadend_dChest","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":2,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11XCX11\n12G2G21\n12X2X21\n1202021\n1102011\n1110111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,1":{"Type":"Chest"},"4,2":{"Type":"Spawn","required":[],"AI":"guard"},"2,2":{"Type":"Spawn","required":[],"AI":"guard"}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"deadend_uChest":{"name":"deadend_uChest","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":2,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"u","index":{"1,1":"u"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1100011\n120G021\n12XCX21\n1200021\n11+A+11\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,5":{"Type":"Charger"},"4,5":{"Type":"Charger"},"3,2":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"3,3":{"Priority":true},"3,5":{"Type":"Shrine","Name":"Will","Priority":true}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"open_upright_OpR":{"name":"open_upright_OpR","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"scale":7,"category":"dungeon","weight":10,"grid":"1110111\n1100011\n1100000\n1000000\n1RLL000\n1111/00\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,4":{"Type":"Barrel"},"3,4":{"Type":"Barrel"},"1,4":{"Type":"Rubble"},"4,5":{"Type":"Debris"}},"effectTiles":{},"Skin":[],"inaccessible":[],"tags":["dungeon","open"],"forbidTags":[],"requireTags":[],"indexTags":["R_open"],"maxTags":[-1],"bonusTags":[0],"multTags":[10],"notTags":[""]},"open_upleft_OpL":{"name":"open_upleft_OpL","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"dungeon","weight":10,"grid":"1110111\n1000111\n0000011\n0X0XGO1\n0000021\n1000111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"5,3":{"Type":"ChestOrShrine"},"4,3":{"Type":"Spawn","required":[],"AI":"looseguard"}},"effectTiles":{"2,1":{"Torch":{"x":2,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["dungeon","open"],"forbidTags":[],"requireTags":[],"indexTags":["L_open"],"maxTags":[-1],"bonusTags":[0],"multTags":[10],"notTags":[""]},"3x1_corridor":{"name":"3x1_corridor","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":6,"y":3,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":16,"y":3,"guard":true,"interesting":true}]},"w":3,"h":1,"primInd":"lr","index":{"1,1":"lr","2,1":"lr","3,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":70,"grid":"111R11111111111111111\n1+101a11000T000100011\n101b1001g11111g10X011\n0000000021XOX12000000\n101b100X210001200X011\n1+1010002G0G0G2000011\n111R11111111111111111\n","POI":[],"Keyring":[{"x":11,"y":5}],"Jail":[{"x":3,"y":34,"type":"furniture","radius":1},{"x":31,"y":5,"type":"furniture","radius":1},{"x":25,"y":25,"type":"jail","radius":1},{"x":30,"y":4,"type":"furniture","radius":1}],"Tiles":{"11,1":{"Type":"Trap","Always":true},"9,5":{"Type":"Spawn","required":[],"AI":"looseguard"},"13,5":{"Type":"Spawn","required":[],"AI":"looseguard"},"11,5":{"Type":"Spawn","required":[],"AI":"guard"},"3,6":{"Type":"Rubble"},"3,0":{"Type":"Rubble"},"1,5":{"Type":"Charger"},"1,1":{"Type":"Charger"},"11,3":{"Type":"ChestOrShrine"}},"effectTiles":{"15,3":{"TorchUnlit":{"x":15,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"7,3":{"TorchUnlit":{"x":7,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"13,5":{"TorchUnlit":{"x":13,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"9,5":{"TorchUnlit":{"x":9,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":["narrow"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"3x1_splitChamber":{"name":"3x1_splitChamber","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":6,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":6,"y":4,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":14,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":14,"y":4,"guard":true,"interesting":true}]},"w":3,"h":1,"primInd":"lr","index":{"1,1":"lr","2,1":"udlr","3,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":70,"grid":"11,1111411D1111114,11\n11000200T222T00R00011\n1G000000X2A2X000020G1\n00L000G0T2C2T0G200L0d\n1G002000X2A2X000020G1\n110000R0T222T02200011\n1111141111D1114111111\n","POI":[],"Keyring":[{"x":6,"y":3},{"x":14,"y":3}],"Jail":[{"x":3,"y":34,"type":"furniture","radius":1},{"x":31,"y":5,"type":"furniture","radius":1},{"x":25,"y":25,"type":"jail","radius":1},{"x":30,"y":4,"type":"furniture","radius":1},{"x":18,"y":3,"type":"furniture","radius":1},{"x":2,"y":3,"type":"furniture","radius":1}],"Tiles":{"10,0":{"Type":"Door","Priority":true,"AlwaysClose":true},"10,6":{"Type":"Door","Priority":true,"AlwaysClose":true},"20,3":{"Type":"Door"},"15,1":{"Type":"Rubble"},"6,5":{"Type":"Rubble"},"10,3":{"Type":"Chest","Loot":"silver","Priority":true},"10,2":{"Type":"Shrine","Name":"Metal"},"10,4":{"Type":"Shrine","Name":"Metal"},"18,3":{"Type":"Cage","Furniture":"Cage"},"2,3":{"Type":"Cage","Furniture":"Cage"},"8,3":{"Type":"Trap","Always":true},"12,3":{"Type":"Trap","Always":true},"12,1":{"Type":"Trap","Always":true},"12,5":{"Type":"Trap","Always":true},"8,5":{"Type":"Trap","Always":true},"8,1":{"Type":"Trap","Always":true},"6,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"14,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"1,2":{"Type":"Spawn","required":[],"AI":"guard"},"1,4":{"Type":"Spawn","required":[],"AI":"guard"},"19,2":{"Type":"Spawn","required":[],"AI":"guard"},"19,4":{"Type":"Spawn","required":[],"AI":"guard"}},"effectTiles":{"11,1":{"Torch":{"x":11,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"9,1":{"Torch":{"x":9,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,2":{"Torch":{"x":1,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"19,2":{"Torch":{"x":19,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","silverchest"],"forbidTags":[],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[4],"notTags":[""]},"GuardedChest":{"name":"GuardedChest","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":4,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":4,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":15,"grid":"1X000X1\nX22222X\n0200020\n020C020\n0200020\nX22222X\n1X000X1\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"GuardedChest"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","chest"],"forbidTags":["maxchest","start"],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[3],"notTags":[""]},"SoulCrystal":{"name":"SoulCrystal","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":5,"grid":"1000001\n0000000\n00+2+00\n0023200\n00+2+00\n0000000\n1000001\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,2":{"Type":"Charger"},"2,4":{"Type":"Charger"},"4,4":{"Type":"Charger"},"4,2":{"Type":"Charger"},"3,3":{"Type":"ForceSpawn","required":["soul"],"tags":["soul"],"Label":"SoulC"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple"],"forbidTags":["start"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Banquet":{"name":"Banquet","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":1,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1100LL1\n10000R1\n10F2F01\n00F1F00\n10F2F01\n1000001\n1100011\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,3":{"Type":"Table","Food":"Plate"},"5,1":{"Type":"Rubble"},"5,0":{"Type":"Barrel"},"4,0":{"Type":"Barrel"},"2,2":{"Type":"Table","Food":"Plate"},"2,4":{"Type":"Table","Food":"Plate"},"2,3":{"Type":"Table","Food":"Plate"},"4,2":{"Type":"Table","Food":"Plate"},"4,4":{"Type":"Table","Food":"Plate"}},"effectTiles":{"3,4":{"TorchUnlit":{"x":3,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","food","wide"],"forbidTags":[],"requireTags":[],"indexTags":["U_wide","D_wide"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,2],"notTags":["",""]},"narrow_vertObst":{"name":"narrow_vertObst","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n10G0001\n1001131\n1G01F01\n1000001\n10000R1\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"1,3":{"Type":"Spawn","required":[],"AI":"guard"},"2,1":{"Type":"Spawn","required":[],"AI":"guard"},"4,3":{"Type":"Table","Food":"Plate"},"5,5":{"Type":"Rubble"},"5,2":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["wide","narrow"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[0,2],"notTags":["",""]},"HallCrossRubble":{"name":"HallCrossRubble","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1110111\n00000R0\n1110111\n1110111\n1110111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"5,3":{"Type":"Rubble"}},"effectTiles":{"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":[],"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"DR_Closet":{"name":"DR_Closet","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11R0C11\n111D111\n1000000\n1000000\n1100011\n1110111\n","POI":[],"Keyring":[{"x":3,"y":1}],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"Door","Priority":true,"AlwaysClose":true},"4,1":{"Type":"Chest","Loot":"storage"},"2,1":{"Type":"Rubble"}},"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":["narrow"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"DL_Closet":{"name":"DL_Closet","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":3,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1111111\n11R0C11\n111D111\n0000001\n0000001\n1100011\n1110111\n","POI":[],"Keyring":[{"x":3,"y":1}],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"Door","Priority":true,"AlwaysClose":true},"4,1":{"Type":"Chest","Loot":"storage"},"2,1":{"Type":"Rubble"}},"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":["narrow"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Corridor_Up_1x2":{"name":"Corridor_Up_1x2","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":9,"guard":true,"interesting":true}]},"w":1,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":60,"grid":"1100111\n1100111\n0000000\n000A000\n1100011\n1120111\n1102111\n1102111\n1100111\n1100111\n1120011\n1120111\n1100111\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{"4,10":{"TorchUnlit":{"x":4,"y":10,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Corridor_UD_1x2":{"name":"Corridor_UD_1x2","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":5,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":9,"guard":true,"interesting":true}]},"w":1,"h":2,"primInd":"ud","index":{"1,1":"ud","1,2":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":40,"grid":"1100111\n1100111\n1102111\n1100111\n1100011\n1120111\n1102111\n1102111\n1100111\n1100111\n1120011\n1120111\n1100111\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"4,4":{"TorchUnlit":{"x":4,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,10":{"TorchUnlit":{"x":4,"y":10,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["U_2wide","D_2wid"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[5,5],"notTags":["",""]},"Corridor_LR_1x2":{"name":"Corridor_LR_1x2","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":3,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":9,"y":3,"guard":true,"interesting":true}]},"w":2,"h":1,"primInd":"lr","index":{"1,1":"lr","2,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":50,"grid":"11111111111111\n11111111111111\n1110+0O0+R1111\n00000TTT000000\n00000000000000\n1111X1X1X11111\n11111111111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,2":{"Type":"Charger"},"6,2":{"Type":"ChestOrShrine"},"8,2":{"Type":"Charger"},"9,2":{"Type":"Rubble"},"6,3":{"Type":"Trap","Always":true},"5,3":{"Type":"Trap","Always":true},"7,3":{"Type":"Trap","Always":true}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["L_2wide","R_2wid"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[4,4],"notTags":["",""]},"HallCrossThicc":{"name":"HallCrossThicc","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":30,"grid":"1100111\n1100111\n1100111\n0000000\n0000000\n1100111\n1100111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["urban"],"used":false,"chance":0.25}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["L_2wide","R_2wide","U_2wid","D_2wid"],"maxTags":[-1,-1,-1,-1],"bonusTags":[0,0,0,0],"multTags":[3,3,3,3],"notTags":["","","",""]},"jng1":{"name":"jng1","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"0000011\n01000R1\n000X130\n0000100\nX000,10\n1X00010\n1000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"5,1":{"Type":"Rubble"},"5,2":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"}},"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng2":{"name":"jng2","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"010000X\n000R10X\n0000R00\n0000000\n0000000\n0100100\nX100000\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["jungle"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"3,1":{"Type":"Rubble"},"4,2":{"Type":"Rubble"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng3":{"name":"jng3","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"XX00000\nX0R0010\n0000000\n00X1000\n0000000\n000-100\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"2,1":{"Type":"Rubble"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_ud_1":{"name":"jng_ud_1","Labels":{},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"0000011\n01000R1\n000X100\n0000100\nX000110\n1X00010\n1000000\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["jungle"],"used":false,"chance":0.5}],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"5,1":{"Type":"Rubble"}},"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_lr_1":{"name":"jng_lr_1","Labels":{},"w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"XXX0X0X\nX0X0X30\n0000000\n0000000\n0300030\nX3000XX\nX0XX0X0\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"5,1":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"1,4":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"1,5":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"5,4":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_ul_1":{"name":"jng_ul_1","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"0000000\n0000000\n00000L0\n0000LL1\n0000111\n00LL111\n0111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["jungle"],"used":false,"chance":0.5}],"Keyring":[{"x":3,"y":4}],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"5,3":{"Type":"Barrel"},"5,2":{"Type":"Barrel"},"4,3":{"Type":"Barrel"},"3,5":{"Type":"Barrel"},"2,5":{"Type":"Barrel"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_ur_1":{"name":"jng_ur_1","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"0000000\n0000000\n0303000\nX0X0000\nXX3XX00\n1XX3000\n11XXXX0\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"2,4":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"3,5":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"1,2":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"3,2":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_dl_1":{"name":"jng_dl_1","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"0001111\n0001C01\n0001101\n00001g1\n0000000\n0000000\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"4,1":{"Type":"Chest","Loot":"silver","Priority":true}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_dr_1":{"name":"jng_dr_1","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"1111100\n11X0300\n11X0X00\n1130000\n1X03000\n1000000\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"4,1":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"2,3":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"3,4":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_noR_1":{"name":"jng_noR_1","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":1,"y":1,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"0000001\n00000X1\n000Xo01\n0X00001\n0000XA1\n00X0XX1\n0000011\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"5,4":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_noL_1":{"name":"jng_noL_1","w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"1000000\n1X0X000\nXR00000\n1XX0000\n4XXX000\n1RX0000\n1100000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"1,5":{"Type":"Rubble"},"1,2":{"Type":"Rubble"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_noU_1":{"name":"jng_noU_1","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"1111111\n111111X\n031X100\n00XR130\n0030000\n0000000\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"Rubble"},"1,2":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"5,3":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"},"2,4":{"Type":"ForceSpawn","required":["mushroom","scenery"],"tags":["mushroom"],"Label":"Mushroom"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng_noD_1":{"name":"jng_noD_1","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":2,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ulr","index":{"1,1":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":100,"grid":"0000000\n0000000\n0000000\n011G110\n0100010\n01RCR11\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door"},"3,5":{"Priority":true},"4,5":{"Type":"Rubble"},"2,5":{"Type":"Rubble"}},"effectTiles":{"4,4":{"TorchUnlit":{"x":4,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,4":{"TorchUnlit":{"x":2,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"HallCrossDisplay":{"name":"HallCrossDisplay","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":5,"y":3,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":1,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":1,"y":3,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":5,"interesting":true}]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":25,"grid":"1110111\n1100011\n1000001\n000L000\n1000001\n1100011\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":3,"y":3,"type":"furniture","radius":1}],"Tiles":{"3,3":{"Type":"DisplayStand","Furniture":"DisplayStand"}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["egyptian"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":[""]},"wide_tombH":{"name":"wide_tombH","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":3,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":4,"y":3,"interesting":true}]},"w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":100,"grid":"1111111\n1L1X1L1\n0000000\n0222220\n0000000\n1X1L1X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"3,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombV":{"name":"wide_tombV","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":2,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":4,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":5,"interesting":true}]},"w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":100,"grid":"1100011\n1L020X1\n1102011\n1X020L1\n1102011\n1L020X1\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1},{"x":5,"y":3,"type":"furniture","radius":1},{"x":1,"y":3,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,3":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"1,3":{"Torch":{"x":1,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,3":{"Torch":{"x":5,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,5":{"Torch":{"x":1,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,5":{"Torch":{"x":5,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombX":{"name":"wide_tombX","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":5,"y":2,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":1,"y":4,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":5,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":4,"y":1,"interesting":true}]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":250,"grid":"1100011\n1X020L1\n0002000\n0222220\n0002000\n1L020X1\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{"5,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombXFull":{"name":"wide_tombXFull","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":4,"y":1,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":5,"interesting":true}]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":100,"grid":"1100011\n1X020X1\n0002000\n0222220\n0002000\n1X020X1\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{},"effectTiles":{"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,0],"notTags":["","1"]},"wide_tombXEmpty":{"name":"wide_tombXEmpty","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":1,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":4,"y":4,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":5,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":4,"y":1,"interesting":true}]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":50,"grid":"1100011\n1L020L1\n0002000\n0222220\n0002000\n1L020L1\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombVMost":{"name":"wide_tombVMost","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":1,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":4,"y":5,"interesting":true}]},"w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":100,"grid":"1100011\n1L020X1\n1102011\n1X020X1\n1102011\n1X020X1\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1},{"x":5,"y":3,"type":"furniture","radius":1},{"x":1,"y":3,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"1,3":{"Torch":{"x":1,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,3":{"Torch":{"x":5,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,5":{"Torch":{"x":1,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,5":{"Torch":{"x":5,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombVEmpty":{"name":"wide_tombVEmpty","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":4,"y":1,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":3,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":4,"y":5,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":4,"y":3,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":5,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":1,"interesting":true}]},"w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":50,"grid":"1100011\n1L020L1\n1102011\n1L020L1\n1102011\n1L020L1\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1},{"x":5,"y":3,"type":"furniture","radius":1},{"x":1,"y":3,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,3":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,3":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"1,3":{"Torch":{"x":1,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,3":{"Torch":{"x":5,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,5":{"Torch":{"x":1,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,5":{"Torch":{"x":5,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombVFull":{"name":"wide_tombVFull","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":1,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":4,"y":3,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":5,"interesting":true}]},"w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":50,"grid":"1100011\n1X020X1\n1102011\n1X020X1\n1102011\n1X020X1\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1},{"x":5,"y":3,"type":"furniture","radius":1},{"x":1,"y":3,"type":"furniture","radius":1}],"Tiles":{},"effectTiles":{"1,3":{"Torch":{"x":1,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,3":{"Torch":{"x":5,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,5":{"Torch":{"x":1,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,5":{"Torch":{"x":5,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombHEmpty":{"name":"wide_tombHEmpty","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":2,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":2,"y":4,"interesting":true}]},"w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":50,"grid":"1111111\n1L1L1L1\n0000000\n0222220\n0000000\n1L1L1L1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"3,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"3,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"1,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombHMost":{"name":"wide_tombHMost","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":5,"y":4,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":2,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":4,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":5,"y":2,"interesting":true}]},"w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":100,"grid":"1111111\n1L1X1X1\n0000000\n0222220\n0000000\n1X1X1X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombHFull":{"name":"wide_tombHFull","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":5,"y":4,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":2,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":4,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":5,"y":2,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":1,"y":2,"interesting":true}]},"w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":100,"grid":"1111111\n1X1X1X1\n0000000\n0222220\n0000000\n1X1X1X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{},"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"test":{"name":"test","Labels":{"Patrol":[{"name":"Interesting","type":"Patrol","assigned":-1,"x":5,"y":4,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":2,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":3,"y":4,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":5,"y":2,"interesting":true},{"name":"Interesting","type":"Patrol","assigned":-1,"x":1,"y":2,"interesting":true}]},"w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":100,"grid":"1111111\n1X1X1X1\n0000000\n0222220\n0000000\n1X1X1X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1}],"Tiles":{},"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"Market":{"name":"Market","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":11,"y":9,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":10,"y":10,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":10,"y":4,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":3,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":9,"guard":true,"interesting":true}]},"w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"2,2":"y","1,2":"y","1,1":"y","2,1":"y"},"flexEdgeSuper":{"1,1":"y","2,1":"y","2,2":"y","1,2":"y"},"scale":7,"category":"urban","weight":2,"grid":"00000000000000\n01101100111010\n01F0F10010L010\n000G000000G000\n01F0F100100F10\n01101100100110\n00000000000000\n0000000G000000\n01F0FF00FFF0F0\n01L00F00F00010\n01LG0000003L10\n01FGF000F00F10\n011111001F0110\n00000000000000\n","POI":[],"Keyring":[],"Jail":[{"x":2,"y":10,"type":"furniture","radius":1},{"x":2,"y":9,"type":"furniture","radius":1},{"x":10,"y":2,"type":"furniture","radius":1},{"x":11,"y":10,"type":"furniture","radius":1}],"Tiles":{"8,8":{"Type":"Table"},"9,8":{"Type":"Table"},"10,8":{"Type":"Table"},"12,8":{"Type":"Table"},"8,11":{"Type":"Table"},"8,9":{"Type":"Table"},"9,12":{"Type":"Table"},"11,11":{"Type":"Table","Food":"Plate"},"11,10":{"Type":"DisplayStand","Furniture":"DisplayStand"},"2,11":{"Type":"Table","Food":"Plate"},"3,11":{"Type":"Prisoner"},"2,8":{"Type":"Table"},"2,9":{"Type":"Cage","Furniture":"Cage"},"2,10":{"Type":"Cage","Furniture":"Cage"},"4,8":{"Type":"Table"},"5,8":{"Type":"Table"},"5,9":{"Type":"Table"},"4,2":{"Type":"Table","Food":"Plate"},"2,2":{"Type":"Table","Food":"Plate"},"2,4":{"Type":"Table","Food":"Plate"},"4,4":{"Type":"Table","Food":"Plate"},"10,2":{"Type":"DisplayStand","Furniture":"DisplayStand"},"11,4":{"Type":"Table"},"4,11":{"Type":"Table","Food":"Plate"},"3,10":{"Type":"Spawn","required":[]},"3,3":{"Type":"Spawn","required":[]},"10,3":{"Type":"Spawn","required":[]},"7,7":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"10,10":{"Type":"Spawn","required":["dressmaker"],"Label":"dressmaker","tags":["dressmaker"],"Chance":1,"AI":"guard","force":"true"}},"effectTiles":{"8,6":{"Torch":{"x":8,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,6":{"Torch":{"x":12,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,6":{"Torch":{"x":1,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,6":{"Torch":{"x":5,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,3":{"Torch":{"x":5,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,3":{"Torch":{"x":12,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,13":{"Torch":{"x":5,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,13":{"Torch":{"x":8,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,13":{"Torch":{"x":12,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,13":{"Torch":{"x":1,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"1,3":{"Torch":{"x":1,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","market"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":[""]},"Shoppe":{"name":"Shoppe","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":0,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":0,"y":4,"guard":true,"interesting":true}]},"w":2,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"udlr"},"flexEdge":{"2,1":"y","1,1":"y"},"flexEdgeSuper":{"2,1":"y","1,1":"y"},"scale":7,"category":"urban","weight":2,"grid":"00000000000000\n0LL11110L11110\n0111FGD00D0L10\n0d00F01D110L10\n01100G10B1LC10\n0L111111111110\n00000000000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,3":{"Type":"Table"},"4,2":{"Type":"Table"},"7,3":{"Type":"Door","Priority":true,"AlwaysClose":true},"6,2":{"Type":"Door","Priority":true,"AlwaysClose":true},"9,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"11,4":{"Type":"Chest","Lock":"Red"},"10,4":{"Type":"Barrel","OL":true},"11,3":{"Type":"Barrel","OL":true},"11,2":{"Type":"Barrel","OL":true},"5,2":{"Type":"Spawn","required":[]},"5,4":{"Type":"Spawn","required":[]},"1,3":{"Type":"Door"},"8,1":{"Type":"Barrel"},"7,4":{"OL":true},"10,2":{"OL":true},"10,3":{"OL":true},"2,1":{"Type":"Barrel"},"1,1":{"Type":"Barrel"},"1,5":{"Type":"Barrel"}},"effectTiles":{"4,2":{"Torch":{"x":4,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,4":{"Torch":{"x":8,"y":4,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Prison":{"name":"Prison","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":10,"y":13,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":8,"y":13,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":13,"y":6,"guard":true,"interesting":true}]},"w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"2,2":"y","2,1":"y","1,1":"y","1,2":"y"},"flexEdgeSuper":{"2,2":"y","2,1":"y","1,1":"y","1,2":"y"},"scale":7,"category":"urban","weight":4,"grid":"00000000000000\n01111b11111110\n01B0D01B01CC10\n01G0b01FG10010\n011b1G11d1bD10\n01B0D0d00000G0\n01G0b0111d1110\n011b1d1FL0LF10\n01CL001G0G0G10\n0100001FF1FF10\n01GF00D0000010\n01111110000010\n0000001b1d1b10\n00000000000000\n","POI":[],"Keyring":[{"x":9,"y":9}],"Jail":[],"Tiles":{"9,12":{"Type":"Door"},"6,10":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"7,9":{"Type":"Table"},"8,9":{"Type":"Table"},"10,9":{"Type":"Table"},"11,9":{"Type":"Table"},"6,5":{"Type":"Door"},"11,4":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Purple","OL":true},"9,6":{"Type":"Door","OL":true},"8,4":{"Type":"Door","OL":true},"3,10":{"Type":"Table"},"7,7":{"Type":"Table","Food":"Plate"},"11,7":{"Type":"Table","Food":"Plate"},"7,3":{"Type":"Table","Food":"Plate"},"4,5":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red","OL":true},"4,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red","OL":true},"2,6":{"Type":"Prisoner","OL":true},"2,3":{"Type":"Prisoner"},"2,8":{"Type":"Chest"},"11,2":{"Type":"Chest","Lock":"Blue"},"7,8":{"Type":"Spawn","required":[],"OL":true},"11,8":{"Type":"Spawn","required":[],"OL":true},"9,8":{"Type":"Spawn","required":[],"OL":true},"8,3":{"Type":"Spawn","required":["miniboss"],"AI":"guard","OL":true},"5,4":{"Type":"Spawn","required":[],"OL":true},"3,8":{"Type":"Barrel"},"8,7":{"Type":"Barrel","OL":true},"10,7":{"Type":"Barrel","OL":true},"5,7":{"Type":"Door","OL":true},"2,10":{"Type":"Spawn","required":[],"OL":true},"7,10":{"OL":false},"7,11":{"OL":false},"5,10":{"OL":true},"5,8":{"OL":true},"5,9":{"OL":true},"4,8":{"OL":true},"4,9":{"OL":true},"4,10":{"OL":true},"3,9":{"OL":true},"2,9":{"OL":true},"3,6":{"OL":true},"3,5":{"OL":true},"5,6":{"OL":true},"5,5":{"OL":true},"3,2":{"OL":true},"3,3":{"OL":true},"5,2":{"OL":true},"5,3":{"OL":true},"7,5":{"OL":true},"8,5":{"OL":true},"9,5":{"OL":true},"4,4":{"OL":false},"10,5":{"OL":true},"11,5":{"OL":true},"8,2":{"OL":true},"10,3":{"OL":true},"11,3":{"OL":true},"7,2":{"OL":true},"2,2":{"OL":true},"2,5":{"OL":true},"9,7":{"OL":true},"8,8":{"OL":true},"10,8":{"OL":true},"4,3":{"OL":false},"10,2":{"Priority":true},"12,5":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door"}},"effectTiles":{"8,7":{"Torch":{"x":8,"y":7,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"10,7":{"Torch":{"x":10,"y":7,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"9,5":{"Torch":{"x":9,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,2":{"Torch":{"x":8,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"11,2":{"Torch":{"x":11,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"3,2":{"Torch":{"x":3,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"3,5":{"Torch":{"x":3,"y":5,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"4,8":{"Torch":{"x":4,"y":8,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,13":{"Torch":{"x":8,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"10,13":{"Torch":{"x":10,"y":13,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","prison"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"cyb_WolfCampS":{"name":"cyb_WolfCampS","Labels":{},"w":3,"h":3,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","1,3":"udlr","2,1":"udlr","2,2":"udlr","2,3":"udlr","3,1":"udlr","3,2":"udlr","3,3":"udlr"},"flexEdge":{"1,3":"y","2,3":"y","3,3":"y","3,2":"y","3,1":"y","2,1":"y","1,1":"y","1,2":"y"},"flexEdgeSuper":{"1,3":"y","2,3":"y","3,3":"y","3,2":"y","3,1":"y","2,1":"y","1,1":"y","1,2":"y"},"scale":7,"category":"urban","weight":5,"grid":"000000000000000000000\n011111111111111111110\n010TTTTTD000LG01L0B10\n01CTTTTT10F000F1B0010\n010TTTTT10GF0FG100B10\n01111111100G0G0d0G010\n01B0B000d000000100B10\n0100000L10?00?01B0010\n01B0B00G1L0000L1L0B10\n01111d11111d111111110\n0b00G0G0b0020000L0L10\n0b000000b0G2G00000010\n0b000000d222000000010\n0b000000b0G2GL0L0L010\n0b000000b002000000010\n0b000000b002000000010\n01bbbbbb1bbDbb1bbbb10\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n","POI":[],"Keyring":[{"x":16,"y":4},{"x":17,"y":4}],"Jail":[{"x":1,"y":7,"type":"furniture","radius":1},{"x":16,"y":10,"type":"furniture","radius":1},{"x":18,"y":10,"type":"furniture","radius":1},{"x":12,"y":2,"type":"furniture","radius":1}],"Tiles":{"11,16":{"Type":"Door","Priority":true,"AlwaysClose":true},"8,12":{"Type":"Door"},"8,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Purple"},"8,6":{"Type":"Door"},"4,2":{"Type":"Trap","OL":true},"5,2":{"Type":"Trap","OL":true},"7,2":{"Type":"Trap","OL":true},"5,3":{"Type":"Trap","OL":true},"6,3":{"Type":"Trap","OL":true},"7,3":{"Type":"Trap","OL":true},"7,7":{"Type":"Barrel"},"15,5":{"Type":"Door"},"11,9":{"Type":"Door"},"14,3":{"Type":"Table","Food":"Plate"},"13,4":{"Type":"Table","Food":"Plate"},"11,4":{"Type":"Table","Food":"Plate"},"10,3":{"Type":"Table","Food":"Plate"},"5,9":{"Type":"Door"},"9,8":{"Type":"Barrel"},"14,8":{"Type":"Barrel"},"16,8":{"Type":"Barrel"},"16,2":{"Type":"Barrel"},"16,10":{"Type":"Cage","Furniture":"Cage"},"18,10":{"Type":"Cage","Furniture":"Cage"},"13,13":{"Type":"Barrel"},"15,13":{"Type":"Barrel"},"17,13":{"Type":"Barrel"},"2,3":{"Type":"Chest","Lock":"Blue","OL":true},"4,4":{"Type":"Trap","OL":true},"6,4":{"Type":"Trap","OL":true},"7,4":{"Type":"Trap","OL":true},"3,4":{"Type":"Trap","OL":true},"10,11":{"Type":"Spawn","required":[],"AI":"guard"},"12,11":{"Type":"Spawn","required":[],"AI":"guard"},"12,13":{"Type":"Spawn","required":[],"AI":"guard"},"10,13":{"Type":"Spawn","required":[],"AI":"guard"},"14,4":{"Type":"Spawn","required":[],"AI":"guard"},"13,5":{"Type":"Spawn","required":[],"AI":"guard"},"11,5":{"Type":"Spawn","required":[],"AI":"guard"},"10,4":{"Type":"Spawn","required":[],"AI":"guard"},"13,2":{"Type":"Prisoner"},"12,2":{"Type":"DisplayStand","Furniture":"DisplayStand"},"17,5":{"Type":"Spawn","required":["miniboss"],"AI":"guard"},"7,8":{"Type":"Prisoner"},"4,10":{"Type":"Prisoner"},"6,10":{"Type":"Prisoner"},"3,2":{"Type":"Trap","OL":true},"4,3":{"Type":"Trap","OL":true},"3,3":{"Type":"Trap","OL":true},"6,2":{"Type":"Trap","OL":true},"5,4":{"Type":"Trap","OL":true},"2,2":{"OL":true},"2,4":{"OL":true}},"effectTiles":{"14,17":{"Torch":{"x":14,"y":17,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,17":{"Torch":{"x":8,"y":17,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"17,2":{"Torch":{"x":17,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"14,2":{"Torch":{"x":14,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"9,2":{"Torch":{"x":9,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"10,10":{"Torch":{"x":10,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,10":{"Torch":{"x":12,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"7,10":{"Torch":{"x":7,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,10":{"Torch":{"x":2,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"5,6":{"Torch":{"x":5,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"17,10":{"Torch":{"x":17,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","wolfgirl"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"cyb_PetTrack":{"name":"cyb_PetTrack","Labels":{},"w":3,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr","3,1":"udlr","3,2":"udlr"},"flexEdge":{"1,1":"y","1,2":"y","2,2":"y","3,2":"y","3,1":"y","2,1":"y"},"flexEdgeSuper":{"1,2":"y","1,1":"y","2,2":"y","3,2":"y","3,1":"y","2,1":"y"},"scale":7,"category":"urban","weight":10,"grid":"100000000000000000001\n100000000000000000001\n1001bbbbbbdbbbbbb1001\n000b2222222222222b000\n100b2222222222222b001\n100b22001bdb10022b001\n100b2200bG0Gb0022b001\n100b22G0b00Gb0G22b001\n100b22001bdb10022b001\n100b2222222222222b001\n000b2222222222222b000\n1001bbbbbbdbbbbbb1001\n100000000000000000001\n100000000000000000001\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"10,8":{"Type":"Door"},"10,11":{"Type":"Door"},"10,2":{"Type":"Door"},"10,5":{"Type":"Door"},"14,7":{"Type":"Spawn","required":[]},"6,7":{"Type":"Spawn","required":[]},"11,7":{"Type":"Spawn","required":[]},"9,6":{"Type":"Prisoner"},"11,6":{"Type":"Prisoner"}},"effectTiles":{"12,9":{"Torch":{"x":12,"y":9,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,9":{"Torch":{"x":8,"y":9,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"8,3":{"Torch":{"x":8,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,3":{"Torch":{"x":12,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"16,3":{"Torch":{"x":16,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"4,3":{"Torch":{"x":4,"y":3,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","pet"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"pyro_ruinedHall":{"name":"pyro_ruinedHall","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":24,"y":0,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":24,"y":6,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":26,"y":3,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":1,"y":3,"guard":true,"interesting":true}]},"w":4,"h":1,"primInd":"udr","index":{"1,1":"udr","2,1":"udlr","3,1":"udlr","4,1":"udl"},"flexEdge":{"4,1":"y","1,1":"y","3,1":"y","2,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":75,"grid":"1100011110001111000111100011\n10000X0000000000000000X00004\n0000022222+222222+2222200000\nC00G02222222222222222220G00C\n0000022222+222222+2222200000\n10000X0000000000000000X00001\n1100011110001111000111100011\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"0,3":{"Type":"Chest"},"27,3":{"Type":"Chest"},"24,3":{"Type":"Spawn","required":[],"AI":"guard"},"3,3":{"Type":"Spawn","required":[],"AI":"guard"},"10,2":{"Type":"Charger"},"10,4":{"Type":"Charger"},"17,2":{"Type":"Charger"},"17,4":{"Type":"Charger"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","long","hall"," chest"],"forbidTags":["maxchest"],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"TempleHall_1x2":{"name":"TempleHall_1x2","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":1,"y":9,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":6,"guard":true,"interesting":true}]},"w":1,"h":2,"primInd":"ud","index":{"1,1":"ud","1,2":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":200,"grid":"0000000\nLL+0+0L\nRL0000L\nLR00111\n/000141\n11401A1\n11100TL\n1A1000L\n0T00111\n00L0411\nL0001A1\nR0000T0\n/R+0+00\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"4,1":{"Type":"Charger"},"2,1":{"Type":"Charger"},"2,12":{"Type":"Charger"},"4,12":{"Type":"Charger"},"5,10":{"Type":"Shrine","Name":"Metal"},"1,7":{"Type":"Shrine","Name":"Metal"},"5,5":{"Type":"Shrine","Name":"Metal"},"5,11":{"Type":"Trap"},"5,6":{"Type":"Trap"},"1,8":{"Type":"Trap"},"1,12":{"Type":"Rubble"},"0,11":{"Type":"Rubble"},"0,12":{"Type":"Debris"},"0,10":{"Type":"Barrel"},"2,9":{"Type":"Barrel"},"0,1":{"Type":"Barrel"},"1,1":{"Type":"Barrel"},"1,2":{"Type":"Barrel"},"0,2":{"Type":"Rubble"},"0,3":{"Type":"Barrel"},"1,3":{"Type":"Rubble"},"0,4":{"Type":"Debris"},"6,6":{"Type":"Barrel"},"6,7":{"Type":"Barrel"},"6,2":{"Type":"Barrel"},"6,1":{"Type":"Barrel"}},"effectTiles":{"4,6":{"TorchUnlit":{"x":4,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,11":{"TorchUnlit":{"x":4,"y":11,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,8":{"TorchUnlit":{"x":2,"y":8,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"TempleHall_2x1":{"name":"TempleHall_2x1","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":4,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":11,"y":4,"guard":true,"interesting":true}]},"w":2,"h":1,"primInd":"dlr","index":{"1,1":"dlr","2,1":"dlr"},"flexEdge":{"1,1":"y","2,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":200,"grid":"11111111111111\n1R1111C=1111R1\n001A102201A100\n0032G0220G2300\n00021111112000\n1000Xo00oX0001\n11000000000011\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"10,2":{"Type":"Shrine","Name":"Metal"},"3,2":{"Type":"Shrine","Name":"Metal"},"6,1":{"Type":"Chest","Loot":"silver","Priority":true},"2,3":{"Type":"ForceSpawn","required":["statue"],"Label":"Statue","tags":["statue"]},"11,3":{"Type":"ForceSpawn","required":["statue"],"Label":"Statue","tags":["statue"]},"9,3":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door","OL":true},"4,3":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door","OL":true},"7,1":{"Type":"Charger","NoRemove":false},"12,1":{"Type":"Rubble"},"1,1":{"Type":"Rubble"},"5,3":{"OL":true},"5,2":{"OL":true},"6,2":{"OL":true},"7,2":{"OL":true},"8,2":{"OL":true},"8,3":{"OL":true},"7,3":{"OL":true},"6,3":{"OL":true}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_End":{"name":"TempleHall_End","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":5,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":2,"y":5,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":70,"grid":"XAX0XAX\nA00000A\nX01b10X\n001C100\nX01310X\nA00000A\nXAX0XAX\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Priority":true},"0,1":{"Type":"Shrine","Name":"Metal"},"1,0":{"Type":"Shrine","Name":"Metal"},"5,0":{"Type":"Shrine","Name":"Metal"},"6,1":{"Type":"Shrine","Name":"Metal"},"6,5":{"Type":"Shrine","Name":"Metal"},"5,6":{"Type":"Shrine","Name":"Metal"},"1,6":{"Type":"Shrine","Name":"Metal"},"0,5":{"Type":"Shrine","Name":"Metal"},"3,4":{"Type":"ForceSpawn","required":["statue"],"Label":"Statue","tags":["statue"]}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide","chest"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_Hub":{"name":"TempleHall_Hub","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":5,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":1,"y":4,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":1,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":5,"y":4,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":70,"grid":"XA101AX\nA22222A\n1200021\n020+020\n1200021\nA22222A\nXA101AX\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"Charger"},"1,0":{"Type":"Shrine","Name":"Metal"},"5,0":{"Type":"Shrine","Name":"Metal"},"6,1":{"Type":"Shrine","Name":"Metal"},"6,5":{"Type":"Shrine","Name":"Metal"},"5,6":{"Type":"Shrine","Name":"Metal"},"1,6":{"Type":"Shrine","Name":"Metal"},"0,5":{"Type":"Shrine","Name":"Metal"},"0,1":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_Field":{"name":"TempleHall_Field","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":70,"grid":"0202020\n2X2X2X2\n0202020\n2X232X2\n0202020\n2X2X2X2\n0202000\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Type":"ForceSpawn","required":["soul"],"Label":"soul","tags":["soul"],"Chance":0.4,"AI":"guard","force":"true"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide","open"],"forbidTags":["start"],"requireTags":[],"indexTags":["temple","open"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[1,0],"notTags":["1","1"]},"TempleHall_UR":{"name":"TempleHall_UR","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":6,"y":3,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":0,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":35,"grid":"1110111\n1222221\n12A0A21\n1200020\n12A0A21\n1222221\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"2,2":{"Type":"Shrine","Name":"Metal"},"4,2":{"Type":"Shrine","Name":"Metal"},"4,4":{"Type":"Shrine","Name":"Metal"},"2,4":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_UL":{"name":"TempleHall_UL","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":0,"y":3,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":0,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":35,"grid":"1110111\n1222221\n12A0A21\n0200021\n12A0A21\n1222221\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"2,2":{"Type":"Shrine","Name":"Metal"},"4,2":{"Type":"Shrine","Name":"Metal"},"4,4":{"Type":"Shrine","Name":"Metal"},"2,4":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_DL":{"name":"TempleHall_DL","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":0,"y":3,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":6,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":35,"grid":"1111111\n1222221\n12A0A21\n0200021\n12A0A21\n1222221\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"2,2":{"Type":"Shrine","Name":"Metal"},"4,2":{"Type":"Shrine","Name":"Metal"},"4,4":{"Type":"Shrine","Name":"Metal"},"2,4":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_DR":{"name":"TempleHall_DR","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":6,"y":3,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":6,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":35,"grid":"1111111\n1222221\n12A0A21\n1200020\n12A0A21\n1222221\n1110111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"2,2":{"Type":"Shrine","Name":"Metal"},"4,2":{"Type":"Shrine","Name":"Metal"},"4,4":{"Type":"Shrine","Name":"Metal"},"2,4":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_MultiShrine":{"name":"TempleHall_MultiShrine","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":1,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":5,"y":2,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":5,"y":4,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":1,"y":4,"guard":true,"interesting":true}]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":20,"grid":"XA101AX\nA22222A\n1200021\n0200020\n1200021\nA22222A\nXA101AX\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"6,1":{"Type":"Shrine","Name":"Metal"},"5,0":{"Type":"Shrine","Name":"Metal"},"1,0":{"Type":"Shrine","Name":"Metal"},"0,1":{"Type":"Shrine","Name":"Metal"},"0,5":{"Type":"Shrine","Name":"Metal"},"1,6":{"Type":"Shrine","Name":"Metal"},"5,6":{"Type":"Shrine","Name":"Metal"},"6,5":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"jng4":{"name":"jng4","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"jungle","weight":50,"grid":"0000110\n01TAT10\n02TFT00\n02TTT12\n0100010\n21R0110\n0000200\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"3,2":{"Type":"Table","Food":"Plate"},"3,1":{"Type":"Shrine","Name":"Metal"},"2,1":{"Type":"Trap"},"2,2":{"Type":"Trap"},"2,3":{"Type":"Trap"},"3,3":{"Type":"Trap"},"4,3":{"Type":"Trap"},"4,2":{"Type":"Trap"},"4,1":{"Type":"Trap"},"2,5":{"Type":"Rubble","Jail":false}},"effectTiles":{"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{"3,4":{"force":true,"skin":"cat"},"2,4":{"force":true,"skin":"cat"},"4,4":{"force":true,"skin":"cat"},"3,5":{"force":true,"skin":"cat"},"2,5":{"force":true,"skin":"cat"},"1,3":{"force":true,"skin":"cat"},"1,2":{"force":true,"skin":"cat"},"5,2":{"force":true,"skin":"cat"},"2,1":{"force":true,"skin":"cat"},"2,2":{"force":true,"skin":"cat"},"2,3":{"force":true,"skin":"cat"},"3,3":{"force":true,"skin":"cat"},"4,3":{"force":true,"skin":"cat"},"4,2":{"force":true,"skin":"cat"},"4,1":{"force":true,"skin":"cat"},"3,2":{"force":true,"skin":"cat"},"3,1":{"force":true,"skin":"cat"},"2,0":{"force":true,"skin":"cat"},"3,0":{"force":true,"skin":"cat"},"1,0":{"force":true,"skin":"cat"}},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng5":{"name":"jng5","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"jungle","weight":70,"grid":"0000000\n0111100\n01C0100\n0100D00\n01B0100\n011g100\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"2,2":{"Priority":true,"OL":true},"4,3":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"3,2":{"OL":true},"3,3":{"OL":true},"3,4":{"OL":true},"2,4":{"OL":true},"2,3":{"OL":true}},"effectTiles":{"3,2":{"TorchUnlit":{"x":3,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{"3,2":{"force":true,"skin":"cat"},"2,2":{"force":true,"skin":"cat"},"2,3":{"force":true,"skin":"cat"},"3,3":{"force":true,"skin":"cat"},"3,4":{"force":true,"skin":"cat"},"2,4":{"force":true,"skin":"cat"}},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"TempleSanctum":{"name":"TempleSanctum","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":10,"y":6,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":10,"y":7,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":6,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":7,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":6,"y":10,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":7,"y":2,"guard":true,"interesting":true}]},"w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"1,2":"y","2,2":"y","2,1":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":1000,"grid":"11000141100011\n1m000222200Rm4\n00000100400000\n0R0X142211X000\n00011A22A11000\n1211A2222A1121\n4202220C222021\n120222G0222021\n1211A2222A1421\n00014A22A11000\n000X112241XR00\n000/0100400000\n1m0002222000m1\n11000141100041\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"5,4":{"Type":"Shrine","Name":"Metal"},"4,5":{"Type":"Shrine","Name":"Metal"},"8,4":{"Type":"Shrine","Name":"Metal"},"9,5":{"Type":"Shrine","Name":"Metal"},"8,9":{"Type":"Shrine","Name":"Metal"},"4,8":{"Type":"Shrine","Name":"Metal"},"5,9":{"Type":"Shrine","Name":"Metal"},"6,7":{"Type":"Spawn","required":["boss"],"AI":"guard"},"9,8":{"Type":"Shrine","Name":"Metal"},"11,1":{"Type":"Rubble"},"1,3":{"Type":"Rubble"},"11,10":{"Type":"Rubble"},"3,11":{"Type":"Debris"},"7,6":{"Priority":true}},"effectTiles":{"11,6":{"TorchUnlit":{"x":11,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,6":{"TorchUnlit":{"x":2,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,9":{"TorchUnlit":{"x":2,"y":9,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"11,9":{"TorchUnlit":{"x":11,"y":9,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,12":{"TorchUnlit":{"x":8,"y":12,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,12":{"TorchUnlit":{"x":5,"y":12,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,1":{"TorchUnlit":{"x":8,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide","chest"],"forbidTags":["maxchest"],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"TempleSanctumGuarded":{"name":"TempleSanctumGuarded","Labels":{},"w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"1,2":"y","2,2":"y","1,1":"y","2,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":1000,"grid":"11000141100011\n1m0002222000m4\n0000L100400000\n000X142211X000\n00011a22A11R00\n1211AG00Ga1121\n420220G0022021\n12022000022021\n1211oG00GC11D1\n00-14+22C11C04\n000X1122410000\n0000R1004L00,0\n1m000222g0G0G0\n11000141400000\n","POI":[],"Keyring":[{"x":10,"y":10}],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"4,5":{"Type":"Shrine","Name":"Metal"},"8,4":{"Type":"Shrine","Name":"Metal"},"8,9":{"Priority":true},"5,9":{"Type":"Charger"},"9,8":{"Type":"Chest","Lock":"Blue"},"11,9":{"Type":"Chest","Loot":"storage"},"9,11":{"Type":"Barrel"},"4,2":{"Type":"Barrel"},"11,4":{"Type":"Rubble"},"4,11":{"Type":"Rubble"},"10,12":{"Type":"Spawn","required":[],"AI":"guard"},"5,5":{"Type":"Spawn","required":[]},"5,8":{"Type":"Spawn","required":[]},"8,8":{"Type":"Spawn","required":[]},"8,5":{"Type":"Spawn","required":[]},"6,6":{"Type":"Spawn","required":[],"AI":"guard"},"12,12":{"Type":"Prisoner"},"12,8":{"Type":"Door","Priority":true,"AlwaysClose":true}},"effectTiles":{"2,6":{"TorchUnlit":{"x":2,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"11,6":{"TorchUnlit":{"x":11,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,12":{"TorchUnlit":{"x":5,"y":12,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,12":{"TorchUnlit":{"x":8,"y":12,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,1":{"TorchUnlit":{"x":8,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"10,10":{"Torch":{"x":10,"y":10,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide","chest"],"forbidTags":["maxchest"],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"TempleChamber":{"name":"TempleChamber","w":1,"h":2,"primInd":"ud","index":{"1,1":"ud","1,2":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":400,"grid":"1110111\n1110111\n1100011\n1100011\n1000001\n1300031\n+00+00+\n+00+00+\n1300031\n1000001\n1100011\n1100011\n1110111\n111D111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"1,5":{"Type":"ForceSpawn","required":["statue"],"Label":"Statue","tags":["statue"]},"5,5":{"Type":"ForceSpawn","required":["statue"],"Label":"Statue","tags":["statue"]},"5,8":{"Type":"ForceSpawn","required":["statue"],"Label":"Statue","tags":["statue"]},"1,8":{"Type":"ForceSpawn","required":["statue"],"Label":"Statue","tags":["statue"]},"6,6":{"Type":"Charger"},"6,7":{"Type":"Charger"},"0,6":{"Type":"Charger"},"0,7":{"Type":"Charger"},"3,6":{"Type":"Charger"},"3,7":{"Type":"Charger"},"3,13":{"Type":"Door","Priority":true,"AlwaysClose":true}},"effectTiles":{"5,4":{"TorchUnlit":{"x":5,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"6,6":{"TorchUnlit":{"x":6,"y":6,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,2":{"TorchUnlit":{"x":4,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,2":{"TorchUnlit":{"x":2,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,4":{"TorchUnlit":{"x":1,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","narrow"],"forbidTags":[],"requireTags":["orrery"],"indexTags":["orrery"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"ShopStart":{"name":"ShopStart","w":2,"h":1,"primInd":"r","index":{"1,1":"r","2,1":"l"},"flexEdge":{"2,1":"y","1,1":"y"},"flexEdgeSuper":{"2,1":"y","1,1":"y"},"scale":7,"category":"unavailable","weight":-100,"grid":"1111111LL,1111\n1L0m001LL/1000\n1L0000D000D000\n1L00F01D111000\n0000F010BL1000\n1LL0FL10001000\n11111111111111\n","POI":[],"Keyring":[],"Jail":[{"x":9,"y":4,"type":"furniture","radius":1}],"Tiles":{"4,3":{"Type":"Table"},"7,3":{"Type":"Door","Priority":true,"AlwaysClose":true},"6,2":{"Type":"Door","Priority":true,"AlwaysClose":true},"8,1":{"Type":"Barrel"},"4,4":{"Type":"Table"},"4,5":{"Type":"Table"},"5,5":{"Type":"Barrel"},"7,1":{"Type":"Barrel"},"7,0":{"Type":"Barrel"},"8,0":{"Type":"Barrel"},"10,2":{"Type":"Door","Priority":true,"AlwaysClose":true},"9,1":{"Type":"Debris","Always":true},"9,4":{"Type":"Cage","Furniture":"Cage"},"2,5":{"Type":"Barrel"},"1,5":{"Type":"Barrel"},"1,1":{"Type":"Barrel"},"1,2":{"Type":"Barrel"},"1,3":{"Type":"Barrel"}},"effectTiles":{"8,4":{"Torch":{"x":8,"y":4,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"2,1":{"Torch":{"x":2,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"4,1":{"Torch":{"x":4,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}},"12,1":{"Torch":{"x":12,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["unavailable"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Conveyor_+":{"name":"Conveyor_+","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":50,"grid":"1111111\n1tVVVVu\n1122211\nd00000d\n1122211\nuVVVVt1\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"6,3":{"Type":"Door"},"0,3":{"Type":"Door"},"1,1":{"Type":"DollTerminal"},"5,5":{"Type":"DollTerminal"},"0,5":{"Type":"DollSupply"},"6,1":{"Type":"DollSupply"},"2,1":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,1":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"4,1":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"5,1":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"1,5":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"2,5":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,5":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"4,5":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0}},"effectTiles":{"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,3":{"TorchUnlit":{"x":5,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":[],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"Conveyor_+2":{"name":"Conveyor_+2","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":50,"grid":"1111111\nuVVVVt1\n1122211\nd00000d\n1122211\n1tVVVVu\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"6,3":{"Type":"Door"},"0,3":{"Type":"Door"},"0,1":{"Type":"DollSupply"},"6,5":{"Type":"DollSupply"},"1,5":{"Type":"DollTerminal"},"5,1":{"Type":"DollTerminal"},"1,1":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"2,1":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,1":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"4,1":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"5,5":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"4,5":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,5":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"2,5":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0}},"effectTiles":{"5,3":{"TorchUnlit":{"x":5,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":[],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"Conveyor_LongLatex":{"name":"Conveyor_LongLatex","w":2,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"udlr"},"flexEdge":{"2,1":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":400,"grid":"11001111110011\n10000000000001\n00uVvNVV110000\n0005000N110000\n0000000VVNVvVV\n1000000000000t\n11001111110011\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,2":{"Type":"DollSupply"},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"6,2":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"9,4":{"Type":"BondageMachine","Binding":"Latex"},"8,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"7,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"7,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"5,2":{"Type":"BondageMachine","Binding":"Latex"},"7,3":{"Type":"BondageMachine","Binding":"Latex"},"13,5":{"Type":"DollTerminal"},"12,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"13,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,3":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoff"},"11,4":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyRight","DX":1,"DY":0},"10,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"4,2":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyRight","DX":1,"DY":0}},"effectTiles":{"8,4":{"TorchUnlit":{"x":8,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":["factory"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"Conveyor_LongLatex2":{"name":"Conveyor_LongLatex2","w":2,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"udlr"},"flexEdge":{"2,1":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":400,"grid":"11001111110011\n10005000000001\n00VVVu0tVVVV00\n00V11101111V00\n00VVVNvNVNVV00\n10000000000000\n11001111110011\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"7,4":{"Type":"BondageMachine","Binding":"Latex"},"5,4":{"Type":"BondageMachine","Binding":"Latex"},"9,4":{"Type":"BondageMachine","Binding":"Latex"},"10,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"11,4":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"11,3":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"11,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"10,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"9,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"8,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"5,2":{"Type":"DollSupply"},"7,2":{"Type":"DollTerminal"},"8,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"6,4":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyRight","DX":1,"DY":0},"4,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"2,4":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"2,3":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"4,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"4,1":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoffD","direction":{"x":0,"y":1}}},"effectTiles":{"3,4":{"TorchUnlit":{"x":3,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"10,4":{"TorchUnlit":{"x":10,"y":4,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":["factory"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"Conveyor_LongMetal":{"name":"Conveyor_LongMetal","w":1,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr"},"flexEdge":{"1,2":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":500,"grid":"1110111\n1100011\n1000001\n0022200\n10VVu01\n10V11g1\n10N1C01\n10V1C01\n10V11g1\n10VVt01\n0022200\n1000001\n1100011\n1110111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,6":{"Type":"Chest","Loot":"storage"},"4,7":{"Type":"Chest","Loot":"storage"},"2,7":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,9":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,9":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"2,5":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,6":{"Type":"BondageMachine","Binding":"Metal"},"2,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,4":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"4,4":{"Type":"DollSupply"},"4,9":{"Type":"DollTerminal"}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"3,9":{"TorchUnlit":{"x":3,"y":9,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":["factory"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"Conveyor_LongChastity":{"name":"Conveyor_LongChastity","w":1,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"ulr"},"flexEdge":{"1,2":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":600,"grid":"1110111\n1100011\n1000001\n002t200\n1R0v001\n1R1N101\n1LLv001\n1LRNG01\n1L0v001\n1R1N101\nd02v20d\n105N001\n1uVV001\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,7":{"Type":"Spawn","required":[],"AI":"guard"},"2,6":{"Type":"Barrel"},"2,7":{"Type":"Rubble"},"1,5":{"Type":"Rubble"},"1,6":{"Type":"Barrel","Always":true},"1,7":{"Type":"Barrel","Always":true},"1,8":{"Type":"Barrel"},"1,4":{"Type":"Rubble"},"1,9":{"Type":"Rubble"},"3,6":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"3,7":{"Type":"BondageMachine","Binding":"Plug"},"3,9":{"Type":"BondageMachine","Binding":"Metal"},"3,10":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"3,3":{"Type":"DollTerminal"},"3,5":{"Type":"BondageMachine","Binding":"Chastity"},"3,4":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"3,11":{"Type":"BondageMachine","Binding":"Metal"},"6,10":{"Type":"Door"},"0,10":{"Type":"Door"},"1,12":{"Type":"DollSupply"},"2,12":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,12":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"2,11":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoffD","direction":{"x":0,"y":1}},"3,8":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1}},"effectTiles":{"5,2":{"TorchUnlit":{"x":5,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,2":{"TorchUnlit":{"x":1,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,6":{"Torch":{"x":4,"y":6,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":["factory","arousalMode"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"Conveyor_TapeFacility":{"name":"Conveyor_TapeFacility","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"2,2":"y","2,1":"y","1,1":"y","1,2":"y"},"flexEdgeSuper":{"1,2":"y","2,1":"y","1,1":"y","2,2":"y"},"scale":7,"category":"factory","weight":500,"grid":"00000000000000\n0220XXuVVVVvu0\n02202200vv5220\n00002200NN0000\n01112200VV01C0\n01Cb2222NN0000\n010b2222VV0000\n010D0000NN0000\n010b0000VV0000\n0111L000NN01C0\n00000000vv0000\n0220tVvNVV0220\n0220tVvNVV0220\n0G000000000000\n","POI":[],"Keyring":[],"Jail":[{"x":4,"y":9,"type":"furniture","radius":1}],"Tiles":{"4,9":{"Type":"DisplayStand","Furniture":"DisplayStand"},"1,13":{"Type":"Spawn","required":[],"AI":"looseguard"},"12,4":{"Type":"Chest","Loot":"storage"},"12,9":{"Type":"Chest","Loot":"storage"},"8,3":{"Type":"BondageMachine","Binding":"Tape"},"8,5":{"Type":"BondageMachine","Binding":"Tape"},"8,7":{"Type":"BondageMachine","Binding":"Tape"},"8,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"8,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"9,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"9,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"8,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"8,9":{"Type":"BondageMachine","Binding":"Tape"},"9,9":{"Type":"BondageMachine","Binding":"Tape"},"9,3":{"Type":"BondageMachine","Binding":"Tape"},"8,2":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"9,2":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"8,1":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"7,1":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"6,1":{"Type":"DollSupply"},"9,5":{"Type":"BondageMachine","Binding":"Tape"},"9,7":{"Type":"BondageMachine","Binding":"Tape"},"9,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"9,10":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"8,11":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"9,12":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"8,12":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"5,11":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"5,12":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"7,11":{"Type":"BondageMachine","Binding":"Latex"},"7,12":{"Type":"BondageMachine","Binding":"Latex"},"9,11":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"8,10":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"4,11":{"Type":"DollTerminal"},"4,12":{"Type":"DollTerminal"},"6,11":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyLeft","DX":-1,"DY":0},"6,12":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyLeft","DX":-1,"DY":0},"3,7":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Purple"},"2,5":{"Type":"Chest","Loot":"silver","Priority":true},"9,1":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"10,1":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"11,1":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyLeft","DX":-1,"DY":0},"12,1":{"Type":"DollSupply"},"10,2":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoff"}},"effectTiles":{"11,5":{"TorchUnlit":{"x":11,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"11,10":{"TorchUnlit":{"x":11,"y":10,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,10":{"TorchUnlit":{"x":2,"y":10,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,5":{"TorchUnlit":{"x":2,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_Shrine1":{"name":"Bellows_Shrine1","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":60,"grid":"1X000X1\n1000001\n00VVV00\n00VAV00\n00t+u00\n1000001\n1X000X1\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"Shrine","Name":"Will","Priority":true},"4,3":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"2,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,3":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"4,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,4":{"Type":"Charger"},"4,4":{"Type":"DollSupply"},"2,4":{"Type":"DollTerminal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":["start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_Shrine2":{"name":"Bellows_Shrine2","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"bellows","weight":50,"grid":"0000000\n0011110\n0110O10\n0b=0010\n01b1D10\n2X2X222\n0000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,2":{"Type":"ChestOrShrine"},"4,4":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"2,3":{"Type":"Charger","NoRemove":false}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":["start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_Shrine3":{"name":"Bellows_Shrine3","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"bellows","weight":50,"grid":"0000000\n0011000\n0022200\n0422210\n002A240\n04040m0\n0000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,4":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{"3,2":{"TorchUnlit":{"x":3,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":["start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_T_noU":{"name":"Bellows_T_noU","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"bellows","weight":70,"grid":"1X111X1\n12g0RC1\n1211111\n0000000\n0000000\n1000001\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"5,1":{"Type":"Chest"},"4,1":{"Type":"Rubble"}},"effectTiles":{"2,3":{"TorchUnlit":{"x":2,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":["start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_LR":{"name":"Bellows_LR","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":120,"grid":"11,1111\n1CRggR1\n1bb1101\n00L0L00\n2222222\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,1":{"Type":"Rubble"},"5,1":{"Type":"Rubble"},"4,3":{"Type":"Barrel"},"2,3":{"Type":"Barrel"},"1,1":{"Type":"Chest"}},"effectTiles":{"3,3":{"TorchUnlit":{"x":3,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_LR_pris":{"name":"Bellows_LR_pris","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":12,"grid":"11,1111\n1G0gg01\n1bb1101\n0000000\n2222222\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"1,1":{"Type":"Prisoner"}},"effectTiles":{"3,3":{"TorchUnlit":{"x":3,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_UR":{"name":"Bellows_UR","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":100,"grid":"1000001\n10TF000\n1011110\n10R0LT0\n1011110\n10TCL00\n1111111\n","POI":[],"Keyring":[{"x":4,"y":1}],"Jail":[],"Tiles":{"2,5":{"Type":"Trap"},"5,3":{"Type":"Trap"},"2,1":{"Type":"Trap"},"3,1":{"Type":"Table"},"3,5":{"Type":"Chest","Lock":"Red"},"4,3":{"Type":"Barrel"},"4,5":{"Type":"Barrel"},"2,3":{"Type":"Rubble"}},"effectTiles":{"6,1":{"TorchUnlit":{"x":6,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_UD":{"name":"Bellows_UD","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":120,"grid":"1000001\n11100R1\n1?400L1\n10100R1\n10100R1\n1000001\n1000001\n","POI":[],"Keyring":[],"Jail":[{"x":5,"y":2,"type":"furniture","radius":1}],"Tiles":{"5,1":{"Type":"Rubble"},"5,4":{"Type":"Rubble"},"5,3":{"Type":"Rubble"},"5,2":{"Type":"Cage","Furniture":"Cage"}},"effectTiles":{"2,5":{"TorchUnlit":{"x":2,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_DR":{"name":"Bellows_DR","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":100,"grid":"1111111\n1CL0LR1\n1TRLRR1\n1000000\n1000000\n1L00RR1\n1100111\n","POI":[],"Keyring":[],"Jail":[{"x":4,"y":1,"type":"furniture","radius":1}],"Tiles":{"4,1":{"Type":"Cage","Furniture":"Cage"},"1,1":{"Type":"Chest"},"2,1":{"Type":"Barrel"},"3,2":{"Type":"Barrel"},"1,5":{"Type":"Barrel"},"5,1":{"Type":"Rubble"},"5,2":{"Type":"Rubble"},"4,2":{"Type":"Rubble"},"5,5":{"Type":"Rubble"},"4,5":{"Type":"Rubble"},"2,2":{"Type":"Rubble"},"1,2":{"Type":"Trap","Always":true}},"effectTiles":{"3,1":{"TorchUnlit":{"x":3,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_UL":{"name":"Bellows_UL","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":120,"grid":"111d111\n0000bX1\n0+00bX1\n0200bC1\n0200b01\n0000GR1\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,0":{"Type":"Door"},"5,3":{"Type":"Chest","Lock":"Blue"},"4,5":{"Type":"ForceSpawn","required":["obstacledoor"],"tags":["obstacletile"],"Label":"Door"},"5,5":{"Type":"Rubble"},"1,2":{"Type":"Charger"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_DL":{"name":"Bellows_DL","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":80,"grid":"1111111\n1FF00C1\n11b10G1\nd00b001\n1001bD1\n10T0001\n111d111\n","POI":[],"Keyring":[{"x":4,"y":1}],"Jail":[],"Tiles":{"2,5":{"Type":"Trap"},"2,1":{"Type":"Table","Food":"Plate"},"1,1":{"Type":"Table"},"5,4":{"Type":"Door","Priority":true,"AlwaysClose":true},"5,2":{"Type":"Spawn","required":[],"AI":"guard"},"5,1":{"Type":"Chest"},"3,6":{"Type":"Door"},"0,3":{"Type":"Door"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_T_noU":{"name":"Factory_T_noU","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":90,"grid":"1111X11\n1000201\n1222221\n0000000\n0000000\n1100111\n1100111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["factory"],"used":false}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_T_noD":{"name":"Factory_T_noD","w":1,"h":1,"primInd":"ulr","index":{"1,1":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":25,"grid":"1100111\n1000201\n1222X21\n0000200\n0000200\n1000201\n1111111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["factory"],"used":false}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_T_noR":{"name":"Factory_T_noR","w":1,"h":1,"primInd":"udl","index":{"1,1":"udl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":10,"grid":"1100111\n1000221\n10G02X1\n0000221\n00G02X1\n1000221\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,2":{"Type":"Spawn","required":[]},"2,4":{"Type":"Spawn","required":[]}},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_T_noL":{"name":"Factory_T_noL","w":1,"h":1,"primInd":"udr","index":{"1,1":"udr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":10,"grid":"1100,11\n1200201\n12G0201\n120020d\n12G0201\n1200201\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,2":{"Type":"Spawn","required":[]},"2,4":{"Type":"Spawn","required":[]},"6,3":{"Type":"Door"}},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Conveyor_LongTape":{"name":"Conveyor_LongTape","w":1,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr"},"flexEdge":{"1,2":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":300,"grid":"1100111\n1000001\n1000t01\n00u0V00\n00V0N00\n10N0V01\n1CV0N11\n11N0VC1\n10V0N01\n10N0V01\nd0V0u0d\n10t0001\n1000001\n111d111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,4":{"Type":"BondageMachine","Binding":"Tape"},"4,6":{"Type":"BondageMachine","Binding":"Tape"},"2,7":{"Type":"BondageMachine","Binding":"Tape"},"2,9":{"Type":"BondageMachine","Binding":"Tape"},"4,8":{"Type":"BondageMachine","Binding":"Tape"},"4,7":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"4,5":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"4,3":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"2,3":{"Type":"DollSupply"},"2,5":{"Type":"BondageMachine","Binding":"Tape"},"2,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,10":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"4,10":{"Type":"DollSupply"},"4,9":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"4,2":{"Type":"DollTerminal"},"2,11":{"Type":"DollTerminal"},"5,7":{"Type":"Chest"},"1,6":{"Type":"Chest"},"6,10":{"Type":"Door"},"0,10":{"Type":"Door"},"3,13":{"Type":"Door"}},"effectTiles":{"1,8":{"TorchUnlit":{"x":1,"y":8,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,7":{"TorchUnlit":{"x":5,"y":7,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","chest","conveyor"],"forbidTags":["start"],"requireTags":["factory"],"indexTags":["bellows"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"IndustrialHallV":{"name":"IndustrialHallV","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"1100111\n11222X1\n1100111\n11222X1\n1100111\n11222X1\n1100111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["industrial"],"used":false}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"4,3":{"TorchUnlit":{"x":4,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,5":{"TorchUnlit":{"x":4,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHallH":{"name":"IndustrialHallH","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"1111111\n11222X1\n1100201\n0000+00\n0000200\n11222X1\n1100111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["industrial"],"used":false}],"Keyring":[],"Jail":[],"Tiles":{"4,3":{"Type":"Charger"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_U":{"name":"IndustrialHall_U","w":1,"h":1,"primInd":"u","index":{"1,1":"u"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":30,"grid":"111D111\n1CL0/C1\n1L00001\n1011101\n100R001\n1/11101\n1000R01\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,0":{"Type":"Door","Priority":true,"AlwaysClose":true},"5,1":{"Type":"Chest","Loot":"storage","Chance":0.8},"1,2":{"Type":"Barrel"},"1,1":{"Type":"Chest"},"2,1":{"Type":"Barrel"},"3,4":{"Type":"Rubble"},"4,6":{"Type":"Rubble"},"4,1":{"Type":"Debris"},"1,5":{"Type":"Debris"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_D":{"name":"IndustrialHall_D","w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":30,"grid":"1111111\n1uu0RR1\n1000OR1\n10G0001\n1X00O01\n1X00001\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,2":{"Type":"ChestOrShrine"},"4,4":{"Type":"ChestOrShrine"},"1,1":{"Type":"DollSupply"},"2,1":{"Type":"DollSupply"},"2,3":{"Type":"Spawn","required":[],"AI":"looseguard"},"5,1":{"Type":"Rubble"},"4,1":{"Type":"Rubble"},"5,2":{"Type":"Rubble"}},"effectTiles":{"3,1":{"Torch":{"x":3,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_L":{"name":"IndustrialHall_L","w":1,"h":1,"primInd":"l","index":{"1,1":"l"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":25,"grid":"1111111\n1RRRRR1\n1000001\n0000L01\n0000LL1\n1X0LLO1\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,5":{"Type":"Barrel"},"5,4":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"3,5":{"Type":"Barrel"},"4,3":{"Type":"Barrel"},"5,5":{"Type":"ChestOrShrine"},"2,1":{"Type":"Rubble"},"3,1":{"Type":"Rubble"},"4,1":{"Type":"Rubble"},"5,1":{"Type":"Rubble"},"1,1":{"Type":"Rubble"}},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_R":{"name":"IndustrialHall_R","w":1,"h":1,"primInd":"r","index":{"1,1":"r"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":50,"grid":"1111111\n1tRLRR1\n1V00001\n1V00000\n1000001\n1ALRLR1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":4,"y":5,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"DollTerminal"},"4,5":{"Type":"DisplayStand","Furniture":"DisplayStand"},"3,1":{"Type":"Cage","Furniture":"Cage"},"5,5":{"Type":"Rubble"},"2,5":{"Type":"Barrel","Always":true},"3,5":{"Type":"Rubble"},"4,1":{"Type":"Rubble"},"5,1":{"Type":"Rubble"},"2,1":{"Type":"Rubble"},"1,2":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"1,3":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"1,5":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial","conveyor","shrine"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_U_poi":{"name":"IndustrialHall_U_poi","w":1,"h":1,"primInd":"u","index":{"1,1":"u"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"111D111\n1000001\n1000001\n1000001\n1000001\n1000001\n1000001\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["industrial"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"3,0":{"Type":"Door","Priority":true,"AlwaysClose":true}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_R_poi":{"name":"IndustrialHall_R_poi","w":1,"h":1,"primInd":"r","index":{"1,1":"r"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"1111111\n1000001\n1000001\n1000000\n1000001\n1000001\n1111111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["industrial"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_L_poi":{"name":"IndustrialHall_L_poi","w":1,"h":1,"primInd":"l","index":{"1,1":"l"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"1111111\n1000001\n1000001\n0000L01\n0000LL1\n100LL01\n1111111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["industrial"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"4,5":{"Type":"Barrel"},"5,4":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"3,5":{"Type":"Barrel"},"4,3":{"Type":"Barrel"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"IndustrialHall_D_poi":{"name":"IndustrialHall_D_poi","w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":80,"grid":"1111111\n1000RR1\n1000001\n1000001\n1000001\n1000001\n1100111\n","POI":[{"x":3,"y":3,"requireTags":["endpoint"],"favor":["industrial"],"used":false,"chance":1}],"Keyring":[],"Jail":[],"Tiles":{"5,1":{"Type":"Rubble"},"4,1":{"Type":"Rubble"}},"effectTiles":{"3,1":{"Torch":{"x":3,"y":1,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Factory_+":{"name":"Factory_+","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":35,"grid":"1100111\n1000001\n1222221\n0000000\n0000000\n1000001\n1100111\n","POI":[{"x":3,"y":3,"requireTags":[],"favor":["factory"],"used":false,"chance":0.75}],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_ButtonTest":{"name":"Factory_ButtonTest","w":1,"h":1,"primInd":"dlr","index":{"1,1":"dlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":10,"grid":"1111111\n1C00001\n1uVVt01\n00T@T00\n00TTT00\n1m000m1\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"EffectTile","Tile":"Wire"},"2,2":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"4,2":{"Type":"DollTerminal"},"1,2":{"Type":"DollSupply","count":0,"wireType":"increment","rate":3},"3,4":{"Type":"Trap"},"4,3":{"Type":"Trap"},"2,3":{"Type":"Trap"},"2,4":{"Type":"Trap"},"4,4":{"Type":"Trap"},"1,1":{"Type":"Chest"}},"effectTiles":{"3,3":{"Wire":{"x":3,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,3":{"Wire":{"x":2,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,3":{"Wire":{"x":1,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,2":{"Wire":{"x":1,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["factory"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Factory_PPDoor":{"name":"Factory_PPDoor","w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"factory","weight":100,"grid":"1111111\n10CCC01\n1000001\n1bbZbb1\n1000001\n1000001\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"AutoDoor","wireType":"AutoDoor_HoldOpen","Label":"HoldOpen"},"2,1":{"Type":"Chest","Loot":"storage","Chance":0.8},"4,1":{"Type":"Chest","Loot":"storage","Chance":0.8},"3,1":{"Priority":true}},"effectTiles":{"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"3,3":{"Wire":{"x":3,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,4":{"PressurePlateHold":{"x":3,"y":4,"name":"PressurePlateHold","duration":9999,"priority":50,"tags":["wire"]}},"3,2":{"PressurePlateHold":{"x":3,"y":2,"name":"PressurePlateHold","duration":9999,"priority":50,"tags":["wire"]}}},"Skin":{},"inaccessible":[],"tags":["factory","chest","signal"],"forbidTags":[],"requireTags":["factory"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"IndustrialPuzzle":{"name":"IndustrialPuzzle","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"1,2":"y","2,2":"y","2,1":"y","1,1":"y"},"flexEdgeSuper":{"1,2":"y","2,2":"y","2,1":"y","1,1":"y"},"scale":7,"category":"industrial","weight":1500,"grid":"00000000000000\n000000001111L0\n0uVV0000ZC1LL0\n005N0+001b1110\n0@0v0000D000D0\n0G0N0000100F10\n000v00001LGF10\n000N0+00100010\n000v0000111110\n000V0000000000\n000v000RLRRL/0\n0tVV0?0RLRRL/0\n00000000000000\n00000000000000\n","POI":[],"Keyring":[{"x":11,"y":7}],"Jail":[{"x":9,"y":6,"type":"furniture","radius":1}],"Tiles":{"11,5":{"Type":"Table"},"11,6":{"Type":"Table"},"10,10":{"Type":"Rubble"},"9,11":{"Type":"Rubble"},"9,10":{"Type":"Rubble"},"10,11":{"Type":"Rubble"},"11,10":{"Type":"Barrel"},"8,11":{"Type":"Barrel"},"8,10":{"Type":"Barrel"},"11,11":{"Type":"Barrel"},"12,11":{"Type":"Debris"},"12,10":{"Type":"Debris"},"7,11":{"Type":"Rubble"},"7,10":{"Type":"Rubble"},"9,2":{"Type":"Chest","Loot":"silver","Priority":true},"11,2":{"Type":"Barrel","Always":true},"12,1":{"Type":"Barrel"},"12,2":{"Type":"Barrel"},"8,2":{"Type":"AutoDoor","wireType":"AutoDoor_HoldOpen","Label":"HoldOpen"},"1,2":{"Type":"DollSupply","count":0,"wireType":"increment","rate":3},"3,4":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"3,6":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"3,7":{"Type":"BondageMachine","Binding":"Latex"},"3,8":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"3,9":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,10":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"2,2":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,11":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"2,11":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"1,11":{"Type":"DollTerminal"},"3,5":{"Type":"BondageMachine","Binding":"Tape"},"3,3":{"Type":"BondageMachine","Binding":"Metal"},"5,7":{"Type":"Charger"},"5,3":{"Type":"Charger"},"12,4":{"Type":"Door","Priority":true,"AlwaysClose":true},"8,4":{"Type":"Door","Priority":true,"AlwaysClose":true},"9,6":{"Type":"Cage","Furniture":"Cage"},"10,6":{"Type":"Spawn","required":[],"AI":"guard"},"1,5":{"Type":"Spawn","required":[],"AI":"guard"},"2,3":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoff"}},"effectTiles":{"7,2":{"Wire":{"x":7,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,2":{"Wire":{"x":8,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,3":{"Wire":{"x":7,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,4":{"Wire":{"x":7,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,5":{"Wire":{"x":7,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,6":{"Wire":{"x":7,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,7":{"Wire":{"x":7,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,8":{"Wire":{"x":7,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,9":{"Wire":{"x":7,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,9":{"Wire":{"x":6,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,9":{"Wire":{"x":5,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,9":{"Wire":{"x":4,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,3":{"Wire":{"x":1,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,4":{"Wire":{"x":1,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,9":{"PressurePlateHold":{"x":3,"y":9,"name":"PressurePlateHold","duration":9999,"priority":50,"tags":["wire"]}},"1,2":{"Wire":{"x":1,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}}},"Skin":{},"inaccessible":[],"tags":["industrial","silverchest","conveyor","signal"],"forbidTags":["silverchest"],"requireTags":["industrial"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"BellowsDollDispenser":{"name":"BellowsDollDispenser","w":2,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"l"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"bellows","weight":500,"grid":"00001111111111\n0@001111111111\n000000000000F1\n0000VVNVNVNVu1\n0C000000000001\n11001111111111\n11001111111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"12,3":{"Type":"DollSupply","count":0,"wireType":"increment","rate":3},"11,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"10,3":{"Type":"BondageMachine","Binding":"Metal"},"9,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"6,3":{"Type":"BondageMachine","Binding":"Chastity"},"7,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"8,3":{"Type":"BondageMachine","Binding":"Plug"},"5,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"4,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"12,2":{"Type":"Table","Food":"Plate"},"1,4":{"Type":"Chest"}},"effectTiles":{"4,5":{"Wire":{"x":4,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,5":{"Wire":{"x":5,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,5":{"Wire":{"x":6,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,5":{"Wire":{"x":7,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,1":{"Wire":{"x":2,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,1":{"Wire":{"x":3,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,1":{"Wire":{"x":4,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,2":{"Wire":{"x":4,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,3":{"Wire":{"x":4,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,4":{"Wire":{"x":4,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,1":{"Wire":{"x":1,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,5":{"Wire":{"x":8,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"9,5":{"Wire":{"x":9,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,5":{"Wire":{"x":10,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"11,5":{"Wire":{"x":11,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"12,5":{"Wire":{"x":12,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"12,4":{"Wire":{"x":12,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"12,3":{"Wire":{"x":12,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,2":{"TorchUnlit":{"x":6,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,2":{"TorchUnlit":{"x":8,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"10,2":{"TorchUnlit":{"x":10,"y":2,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide","chest","conveyor"," signal"],"forbidTags":["start"],"requireTags":["bellows","arousalMode"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"BellowsRobotTrap":{"name":"BellowsRobotTrap","w":1,"h":2,"primInd":"d","index":{"1,1":"d","1,2":"udlr"},"flexEdge":{"1,2":"y"},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":8000,"grid":"1111111\n111C111\n13Z0Z31\n1110111\n13Z0Z31\n1110111\n13Z0Z31\n1110111\n13Z0Z31\n111D111\n0200200\n0200200\n0+00X00\n0000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"1,12":{"Type":"Charger"},"3,9":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"},"3,1":{"Type":"Chest","Loot":"lessergold","Faction":"AncientRobot","NoTrap":"true","Priority":"true"},"4,2":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,2":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,4":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,4":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,6":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,6":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,8":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,8":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"1,8":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"1,6":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"5,6":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"5,8":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"5,4":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"1,4":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"1,2":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"},"5,2":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"RoboAtk","tags":["robot","minor"],"Chance":1,"force":"true","faction":"Ambush"}},"effectTiles":{"2,8":{"Wire":{"x":2,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,8":{"Wire":{"x":3,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,8":{"Wire":{"x":4,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,7":{"Wire":{"x":3,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,6":{"Wire":{"x":3,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,5":{"Wire":{"x":3,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,4":{"Wire":{"x":3,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,3":{"Wire":{"x":3,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,2":{"Wire":{"x":2,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,4":{"Wire":{"x":2,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,4":{"Wire":{"x":4,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,6":{"Wire":{"x":4,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,6":{"Wire":{"x":2,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,2":{"Wire":{"x":4,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,2":{"PressurePlateOneUse":{"x":3,"y":2,"name":"PressurePlateOneUse","duration":9999,"priority":50,"tags":["wire"]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide","lessergold"],"forbidTags":["start","maxlessergold"],"requireTags":["bellows"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Bellows_DR2":{"name":"Bellows_DR2","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":100,"grid":"1111111\n1000000\n1L11110\n1LRRRR0\n1L11110\n1LRRRR0\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,5":{"Type":"Rubble"},"2,5":{"Type":"Rubble"},"3,5":{"Type":"Rubble"},"5,5":{"Type":"Rubble"},"5,3":{"Type":"Rubble"},"4,3":{"Type":"Rubble"},"3,3":{"Type":"Rubble"},"2,3":{"Type":"Rubble"},"1,2":{"Type":"Barrel"},"1,3":{"Type":"Barrel"},"1,4":{"Type":"Barrel"},"1,5":{"Type":"Barrel"}},"effectTiles":{"6,1":{"TorchUnlit":{"x":6,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"BellowsRobotTrap2":{"name":"BellowsRobotTrap2","w":2,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"udlr"},"flexEdge":{"1,1":"y","2,1":"y"},"flexEdgeSuper":{"1,1":"y","2,1":"y"},"scale":7,"category":"bellows","weight":300,"grid":"00000000000000\n0X222XX111Z100\n01111111333110\n01C00001Z11110\n0111110000z010\n01X22111111d10\n00000000000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,3":{"Type":"Chest","Loot":"lessergold","Faction":"AncientRobot","NoTrap":"true","Priority":"true"},"8,3":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"11,5":{"Type":"Door"},"10,4":{"Type":"AutoDoor","wireType":"AutoDoor_Close","Label":"Open"},"10,1":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"8,2":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"Robo","tags":["robot","minor","elite"],"Chance":1,"force":"true","faction":"Ambush"},"9,2":{"Type":"Spawn","required":["robot"],"Label":"Robo","tags":["robot","minor","elite"],"Chance":1,"force":"true","faction":"Ambush"},"10,2":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"Robo","tags":["robot","minor","elite"],"Chance":1,"force":"true","faction":"Ambush"}},"effectTiles":{"7,3":{"Wire":{"x":7,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,3":{"Wire":{"x":6,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,3":{"Wire":{"x":5,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,3":{"Wire":{"x":8,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,3":{"Wire":{"x":4,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,3":{"PressurePlateOneUse":{"x":3,"y":3,"name":"PressurePlateOneUse","duration":9999,"priority":50,"tags":["wire"]}},"9,3":{"Wire":{"x":9,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,3":{"Wire":{"x":10,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,4":{"Wire":{"x":10,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,2":{"Wire":{"x":10,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,1":{"Wire":{"x":10,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,4":{"Wire":{"x":7,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,4":{"Wire":{"x":8,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"9,4":{"Wire":{"x":9,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}}},"Skin":{},"inaccessible":[],"tags":["bellows","wide","lessergold"],"forbidTags":["start","maxlessergold"],"requireTags":["bellows"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Bellows_Silv1":{"name":"Bellows_Silv1","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":600,"grid":"1111111\n13ZCZ31\n1Z101Z1\n001z100\n0000000\n0000000\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,3":{"Type":"AutoDoor","wireType":"AutoDoor_Close","Label":"Open"},"5,2":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"1,2":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,1":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,1":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"3,1":{"Type":"Chest","Loot":"silver","Priority":true},"1,1":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"robo","tags":["robot","minor","elite"],"Chance":1,"force":"true","faction":"Ambush"},"5,1":{"Type":"Spawn","required":["robot"],"filterTags":["turret","oldrobot"],"Label":"robo","tags":["robot","minor","elite"],"Chance":1,"force":"true","faction":"Ambush"}},"effectTiles":{"3,3":{"Wire":{"x":3,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,2":{"Wire":{"x":1,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,2":{"Wire":{"x":2,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,2":{"Wire":{"x":4,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,2":{"Wire":{"x":5,"y":2,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,2":{"PressurePlateOneUse":{"x":3,"y":2,"name":"PressurePlateOneUse","duration":9999,"priority":50,"tags":["wire"]}},"2,1":{"Wire":{"x":2,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,1":{"Wire":{"x":4,"y":1,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}}},"Skin":{},"inaccessible":[],"tags":["bellows","silverchest"],"forbidTags":["maxsilverchest"," start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_Silv2":{"name":"Bellows_Silv2","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":600,"grid":"1100111\n1000001\n11D1221\n1C0b001\n11Z1X01\n1100001\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"1,3":{"Type":"Chest","Loot":"silver","Priority":true},"2,4":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,2":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Red"}},"effectTiles":{"2,4":{"Wire":{"x":2,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,3":{"PressurePlateOneUse":{"x":2,"y":3,"name":"PressurePlateOneUse","duration":9999,"priority":50,"tags":["wire"]}}},"Skin":{},"inaccessible":[],"tags":["bellows","silverchest"],"forbidTags":["maxsilverchest"," start"],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Bellows_Gallery":{"name":"Bellows_Gallery","w":1,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ulr"},"flexEdge":{"1,2":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"bellows","weight":400,"grid":"1LRR2L1\n1000201\n10X2X01\n001D100\n1110111\n11Z0Z11\n13Z0Z31\n13Z0Z31\n13Z0Z31\n1110111\n001D100\n10X2@01\n1020001\n1F200F1\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,5":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,6":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,7":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"4,8":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,5":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,6":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,7":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"2,8":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"3,3":{"Type":"Door","Priority":true,"AlwaysClose":true},"3,10":{"Type":"Door","Priority":true,"AlwaysClose":true},"5,13":{"Type":"Table"},"1,13":{"Type":"Table"},"5,0":{"Type":"Barrel"},"1,0":{"Type":"Barrel"},"2,0":{"Type":"Rubble"},"3,0":{"Type":"Rubble"},"5,6":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor","oldrobotturretspawn"],"Chance":1,"force":"true"},"1,6":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor","oldrobotturretspawn"],"Chance":1,"force":"true"},"1,7":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor","oldrobotturretspawn"],"Chance":1,"force":"true"},"5,7":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor","oldrobotturretspawn"],"Chance":1,"force":"true"},"5,8":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor","oldrobotturretspawn"],"Chance":1,"force":"true"},"1,8":{"Type":"Spawn","required":["basicturret","oldrobot"],"Label":"turret","tags":["robot","minor","oldrobotturretspawn"],"Chance":1,"force":"true"}},"effectTiles":{"4,11":{"Wire":{"x":4,"y":11,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,10":{"Wire":{"x":4,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,9":{"Wire":{"x":4,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,8":{"Wire":{"x":4,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,7":{"Wire":{"x":4,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,5":{"Wire":{"x":4,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,6":{"Wire":{"x":4,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,8":{"Wire":{"x":3,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,8":{"Wire":{"x":2,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,7":{"Wire":{"x":2,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,6":{"Wire":{"x":2,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,5":{"Wire":{"x":2,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,9":{"Wire":{"x":3,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,7":{"Wire":{"x":3,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,6":{"Wire":{"x":3,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,5":{"Wire":{"x":3,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}}},"Skin":{},"inaccessible":[],"tags":["bellows","signal","ambush"],"forbidTags":[],"requireTags":["bellows"],"indexTags":["factory"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"Arena_Dollmaker":{"name":"Arena_Dollmaker","w":3,"h":3,"primInd":"dr","index":{"1,1":"dr","1,2":"udlr","1,3":"ur","2,1":"dlr","2,2":"udlr","2,3":"ulr","3,1":"dl","3,2":"udlr","3,3":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"boss","weight":-1,"grid":"111111111111111111111\n111t1110=0u0=0111t111\n110V000000V000000V011\n110N0VVVVVVVVVVV0N011\n110V0V111111111V0V011\n000N0V100000001V0N000\n000V0V10F000F01V0V000\n000N0V13bbbbb31V0N002\n00=V0V02=0@0=20V0V=00\n000v0v020000020v0v000\n000VVV5200L0025VVV000\n000v0v020000020v0v000\n00=V0V02=0@0=20V0V=00\n000N0V0X22222X0V0N000\n000V0V000000000V0V000\n000N0V000000000V0N000\n110V0V000000000V0V011\n110N0VVVVVVVVVVV0N011\n110V000000V000000V011\n111t1110=0u0=0111t111\n111111111111111111111\n","POI":[],"Keyring":[],"Jail":[{"x":10,"y":10,"type":"furniture","radius":1}],"Tiles":{"8,8":{"Type":"Charger","Priority":true},"12,8":{"Type":"Charger","Priority":true},"8,19":{"Type":"Charger","Priority":true},"12,19":{"Type":"Charger","Priority":true},"12,1":{"Type":"Charger","Priority":true},"2,12":{"Type":"Charger","Priority":true},"2,8":{"Type":"Charger","Priority":true},"18,8":{"Type":"Charger","Priority":true},"18,12":{"Type":"Charger","Priority":true},"8,12":{"Type":"Charger","Priority":true},"8,1":{"Type":"Charger","Priority":true},"12,12":{"Type":"Charger","Priority":true},"3,19":{"Type":"DollTerminal"},"17,19":{"Type":"DollTerminal"},"17,1":{"Type":"DollTerminal"},"3,1":{"Type":"DollTerminal"},"10,19":{"Type":"DollSupply"},"10,1":{"Type":"DollSupply"},"10,18":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"10,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"10,17":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"wireType":"Conveyor_Switch","SwitchMode":"Switch"},"11,17":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"12,17":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"13,17":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"9,17":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"8,17":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"7,17":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"9,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"8,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"7,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"11,3":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"12,3":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"13,3":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"15,3":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"14,3":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"5,3":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"6,3":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"14,17":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"6,17":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"15,17":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,17":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,5":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,7":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"5,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"5,5":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"5,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"5,7":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"5,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,16":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,15":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,14":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,13":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,12":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"15,11":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"5,15":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,14":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,16":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,13":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,12":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"5,11":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"5,10":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"15,10":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"16,10":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"17,9":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"17,6":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"17,7":{"Type":"BondageMachine","Binding":"Metal"},"17,8":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"17,5":{"Type":"BondageMachine","Binding":"Metal"},"17,3":{"Type":"BondageMachine","Binding":"Metal"},"17,2":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"17,11":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"17,13":{"Type":"BondageMachine","Binding":"Latex"},"17,14":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,15":{"Type":"BondageMachine","Binding":"Latex"},"17,16":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,17":{"Type":"BondageMachine","Binding":"Latex"},"17,18":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,10":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1,"wireType":"Conveyor_Switch","SwitchMode":"Switch"},"4,10":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,9":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"3,8":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,7":{"Type":"BondageMachine","Binding":"Metal"},"3,6":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,5":{"Type":"BondageMachine","Binding":"Tape"},"3,4":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,3":{"Type":"BondageMachine","Binding":"Latex"},"3,2":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,11":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"3,12":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,13":{"Type":"BondageMachine","Binding":"Tape"},"3,14":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,15":{"Type":"BondageMachine","Binding":"Tape"},"3,16":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,17":{"Type":"BondageMachine","Binding":"Tape"},"3,18":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"3,10":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"wireType":"Conveyor_Switch","SwitchMode":"Switch"},"17,12":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,4":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"13,7":{"Type":"ForceSpawn","required":["dolldoor"],"Label":"dolldoor","tags":["dolldoor"],"Chance":1,"force":"true"},"7,7":{"Type":"ForceSpawn","required":["dolldoor"],"Label":"dolldoor","tags":["dolldoor"],"Chance":1,"force":"true"},"12,6":{"Type":"Table","Food":"Plate","OL":true},"8,6":{"Type":"Table","Food":"Plate","OL":true},"10,10":{"Type":"DisplayStand","Furniture":"DisplayStand"},"14,10":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoffR","direction":{"x":1,"y":0}},"6,10":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoffL","direction":{"x":-1,"y":0}},"13,5":{"OL":true},"13,6":{"OL":true},"12,5":{"OL":true},"11,6":{"OL":true},"11,5":{"OL":true},"10,5":{"OL":true},"10,6":{"OL":true},"9,6":{"OL":true},"9,5":{"OL":true},"8,5":{"OL":true},"7,6":{"OL":true},"7,5":{"OL":true},"10,3":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"wireType":"Conveyor_Switch","SwitchMode":"Switch"},"15,9":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"5,9":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1}},"effectTiles":{"10,8":{"Wire":{"x":10,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,12":{"Wire":{"x":10,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"13,10":{"Wire":{"x":13,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"14,10":{"Wire":{"x":14,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"15,10":{"Wire":{"x":15,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"17,10":{"Wire":{"x":17,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"16,10":{"Wire":{"x":16,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,17":{"Wire":{"x":10,"y":17,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,16":{"Wire":{"x":10,"y":16,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,15":{"Wire":{"x":10,"y":15,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,14":{"Wire":{"x":10,"y":14,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,10":{"Wire":{"x":8,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,10":{"Wire":{"x":7,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,10":{"Wire":{"x":6,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,10":{"Wire":{"x":5,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,10":{"Wire":{"x":4,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,10":{"Wire":{"x":3,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,7":{"Wire":{"x":10,"y":7,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,6":{"Wire":{"x":10,"y":6,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,5":{"Wire":{"x":10,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,4":{"Wire":{"x":10,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,3":{"Wire":{"x":10,"y":3,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"9,10":{"Wire":{"x":9,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,10":{"Wire":{"x":10,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"12,10":{"Wire":{"x":12,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"11,10":{"Wire":{"x":11,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,12":{"Wire":{"x":8,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,12":{"Wire":{"x":7,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,12":{"Wire":{"x":6,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,12":{"Wire":{"x":5,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,12":{"Wire":{"x":4,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,12":{"Wire":{"x":3,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,12":{"Wire":{"x":2,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,12":{"Wire":{"x":1,"y":12,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,11":{"Wire":{"x":1,"y":11,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,10":{"Wire":{"x":1,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,9":{"Wire":{"x":1,"y":9,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"1,8":{"Wire":{"x":1,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"2,8":{"Wire":{"x":2,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"3,8":{"Wire":{"x":3,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"4,8":{"Wire":{"x":4,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,8":{"Wire":{"x":5,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,8":{"Wire":{"x":6,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,8":{"Wire":{"x":7,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"9,8":{"Wire":{"x":9,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,8":{"Wire":{"x":8,"y":8,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,13":{"Wire":{"x":8,"y":13,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"8,14":{"Wire":{"x":8,"y":14,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"9,14":{"Wire":{"x":9,"y":14,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"10,11":{"Wire":{"x":10,"y":11,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}}},"Skin":{},"inaccessible":[],"tags":["boss"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Arena_Empty":{"name":"Arena_Empty","w":3,"h":3,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","1,3":"udlr","2,1":"udlr","2,2":"udlr","2,3":"udlr","3,1":"udlr","3,2":"udlr","3,3":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":-1,"grid":"000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n000000000000000000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"endHall_U":{"name":"endHall_U","w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":30,"grid":"1111111\n1111111\n11C1111\n11/1111\n110R111\n1100111\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,2":{"Type":"Chest"},"2,3":{"Type":"Debris"},"3,4":{"Type":"Rubble"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"endHall_D":{"name":"endHall_D","w":1,"h":1,"primInd":"u","index":{"1,1":"u"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":30,"grid":"1100111\n1100111\n1100111\n1100111\n11RR111\n11C1111\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"3,4":{"Type":"Rubble"},"2,4":{"Type":"Rubble"},"2,5":{"Type":"Chest"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"endHall_L":{"name":"endHall_L","w":1,"h":1,"primInd":"r","index":{"1,1":"r"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":30,"grid":"1111111\n1111111\n1111111\n1C00000\n11R0000\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"2,4":{"Type":"Rubble"},"1,3":{"Type":"Chest"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"endHall_R":{"name":"endHall_R","w":1,"h":1,"primInd":"l","index":{"1,1":"l"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":30,"grid":"1111111\n1111111\n1111111\n00000C1\n000/R11\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"5,3":{"Type":"Chest"},"4,4":{"Type":"Rubble"},"3,4":{"Type":"Debris"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Hall_UL":{"name":"Hall_UL","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":30,"grid":"1100111\n1100111\n1100111\n0000111\n0000111\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Hall_UR":{"name":"Hall_UR","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":30,"grid":"1100111\n1100111\n1100111\n1100000\n1100000\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Hall_DR":{"name":"Hall_DR","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":30,"grid":"1111111\n1111111\n1111111\n1100000\n1100000\n1100111\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Hall_DL":{"name":"Hall_DL","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":30,"grid":"1111111\n1111111\n1111111\n0000111\n0000111\n1100111\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Hall_DL_temple":{"name":"Hall_DL_temple","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":50,"grid":"1111111\n1111111\n1X12A11\n0002211\n0000111\n1100X11\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,2":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Hall_DR_Temple":{"name":"Hall_DR_Temple","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":50,"grid":"1111111\n1111111\n1A21X11\n1220000\n1100000\n1X00111\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"1,2":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Hall_UL_Temple":{"name":"Hall_UL_Temple","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":50,"grid":"1100111\n1100111\n1100X11\n0000111\n0002211\n1X12A11\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"4,5":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Hall_UR_temple":{"name":"Hall_UR_temple","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":50,"grid":"1100111\n1100111\n1X00111\n1100000\n1220000\n1A21X11\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"1,5":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Cave_UL":{"name":"Cave_UL","w":1,"h":1,"primInd":"ul","index":{"1,1":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"cavern","weight":100,"grid":"1100111\n1100011\n1000011\n0000001\n0000001\n1000011\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["cavern","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["cavern"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"Cave_UR":{"name":"Cave_UR","w":1,"h":1,"primInd":"ur","index":{"1,1":"ur"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"cavern","weight":100,"grid":"1100111\n1100111\n1000001\n1000000\n1000000\n1100011\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["cavern","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["cavern"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"Cave_DR":{"name":"Cave_DR","w":1,"h":1,"primInd":"dr","index":{"1,1":"dr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"cavern","weight":100,"grid":"1111111\n1100111\n1000011\n1000000\n1000000\n1000011\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["cavern","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["cavern"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"Cave_DL":{"name":"Cave_DL","w":1,"h":1,"primInd":"dl","index":{"1,1":"dl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"cavern","weight":100,"grid":"1111111\n1110011\n1100001\n0000001\n0000001\n1100011\n1100111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["cavern","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["cavern"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"office_D":{"name":"office_D","w":1,"h":1,"primInd":"u","index":{"1,1":"u"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":100,"grid":"1100111\n1000011\n1000L11\n1001111\n1F010C1\n1F0d3B1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":4,"y":2,"type":"furniture","radius":1}],"Tiles":{"3,5":{"Type":"Door"},"4,5":{"Type":"ForceSpawn","required":["human"],"Label":"human","tags":["human"],"filterTags":["jail"],"Chance":0.8,"AI":"guard","force":"true","levelBoost":2},"4,2":{"Type":"Cage","Furniture":"Cage"},"1,4":{"Type":"Table","Food":"Plate"},"1,5":{"Type":"Table"},"5,4":{"Type":"Chest"}},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"SecretRoom":{"name":"SecretRoom","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"2,1":"y","1,1":"y","1,2":"y","2,2":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":200,"grid":"11101111110111\n1+0012gg2101A1\n10101g11g10101\n00000201000000\n110X01g111g101\n1A01g12R112101\n110g211111g101\n11g12g001+2001\n1000011g11g101\n1b1221C2112101\n0011g10011g100\n1000211b1+01A1\n1A101112200111\n11101111100111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"7,5":{"Type":"Rubble"},"6,9":{"Type":"Chest","Loot":"silver","Priority":true},"1,12":{"Type":"Shrine","Name":"Metal"},"12,11":{"Type":"Shrine","Name":"Metal"},"12,1":{"Type":"Shrine","Name":"Metal"},"1,5":{"Type":"Shrine","Name":"Metal"},"1,1":{"Type":"Charger"},"9,7":{"Type":"Charger"},"9,11":{"Type":"Charger"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Passthrough1x2":{"name":"Passthrough1x2","w":1,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":5,"grid":"1111111\n1111111\n1111111\n0002000\n0002000\n111g111\n11+2+11\n11O2O11\n11+2+11\n111g111\n0002000\n0002000\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"4,7":{"Type":"ChestOrShrine"},"4,6":{"Type":"Charger"},"4,8":{"Type":"Charger"},"2,6":{"Type":"Charger"},"2,8":{"Type":"Charger"},"2,7":{"Type":"ChestOrShrine"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","hall","2wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Passthrough2x1":{"name":"Passthrough2x1","w":2,"h":1,"primInd":"udr","index":{"1,1":"udr","2,1":"udl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":25,"grid":"11100111110011\n111001R0R10011\n111001g1g10011\n11100g01010011\n1110010g010011\n111001C10g0011\n11100111110011\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"6,1":{"Type":"Rubble"},"8,1":{"Type":"Rubble"},"6,5":{"Type":"Chest"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","hall","2wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"SparseVents":{"name":"SparseVents","w":2,"h":2,"primInd":"dr","index":{"1,1":"dr","1,2":"udr","2,1":"udlr","2,2":"udl"},"flexEdge":{"1,1":"y","2,1":"y","2,2":"y","1,2":"y"},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":350,"grid":"11111111110111\n11111111110111\n11111111110111\n11111111110000\n11111OO1112111\n11111L2ggg2111\n111110?111g111\n11111L0L112111\n1111112L112111\n1112gg2L112111\n1110110m112111\n1110110111g111\n1110112ggg2111\n11101111110111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1},{"x":5,"y":7,"type":"furniture","radius":1},{"x":7,"y":7,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1}],"Tiles":{"7,9":{"Type":"Barrel"},"7,8":{"Type":"Barrel"},"5,7":{"Type":"DisplayStand","Furniture":"DisplayStand"},"7,7":{"Type":"Cage","Furniture":"Cage"},"5,5":{"Type":"Cage","Furniture":"Cage"},"5,4":{"Type":"ChestOrShrine"},"6,4":{"Type":"ChestOrShrine"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","hall","narrow","chest"],"forbidTags":["maxchest"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"SparseVents2":{"name":"SparseVents2","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udr","2,1":"dl","2,2":"udl"},"flexEdge":{"1,1":"y","2,1":"y","2,2":"y","1,2":"y"},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":350,"grid":"11100111111111\n11100000000LO1\n1110+1GL0G1+L1\n00G01111g11101\n0000L111g11001\n11100111g11LT1\n111TL11TT11LL1\n111TL11C011T01\n1110011CG11RT1\n1110T111111001\n11A0T1111110G1\n110G011111+001\n11L00111110001\n11100111110011\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1},{"x":5,"y":7,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1}],"Tiles":{"8,8":{"Type":"Prisoner"},"9,2":{"Type":"Spawn","required":[],"AI":"looseguard"},"6,2":{"Type":"Spawn","required":[],"AI":"looseguard"},"11,8":{"Type":"Rubble"},"12,10":{"Type":"Spawn","required":[]},"2,3":{"Type":"Spawn","required":[]},"8,6":{"Type":"Trap","Always":true},"7,6":{"Type":"Trap","Always":true},"11,7":{"Type":"Trap","Always":true},"12,5":{"Type":"Trap","Always":true},"4,9":{"Type":"Trap","Always":true},"3,6":{"Type":"Trap","Always":true},"4,2":{"Type":"Charger"},"11,2":{"Type":"Charger"},"10,11":{"Type":"Charger"},"2,10":{"Type":"Shrine","Name":"Metal"},"3,11":{"Type":"Spawn","required":[]},"7,7":{"Type":"Chest","Lock":"Red"},"2,12":{"Type":"Barrel"},"7,2":{"Type":"Barrel"},"11,1":{"Type":"Barrel"},"12,2":{"Type":"Barrel"},"12,6":{"Type":"Barrel"},"11,6":{"Type":"Barrel"},"11,5":{"Type":"Barrel"},"4,7":{"Type":"Barrel"},"4,6":{"Type":"Barrel"},"4,4":{"Type":"Barrel"},"4,10":{"Type":"Trap"},"3,7":{"Type":"Trap"},"12,8":{"Type":"Trap"},"7,8":{"Type":"Chest","Lock":"Blue"},"12,1":{"Type":"ChestOrShrine"}},"effectTiles":{"10,1":{"TorchUnlit":{"x":10,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","hall","2wide","chest"],"forbidTags":["maxchest"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Guarded1x2":{"name":"Guarded1x2","w":1,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":75,"grid":"1111111\n1111111\n11+O+11\n00020G0\n0002000\n0111111\n00020O1\n000C001\n00020O1\n0111111\n0002000\n00G2000\n11+O+11\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,7":{"Type":"GuardedChest","Label":"Guarded"},"5,6":{"Type":"ChestOrShrine"},"5,8":{"Type":"ChestOrShrine"},"5,3":{"Type":"Spawn","required":[],"AI":"looseguard"},"2,11":{"Type":"Spawn","required":[],"AI":"looseguard"},"3,12":{"Type":"ChestOrShrine"},"4,12":{"Type":"Charger"},"2,12":{"Type":"Charger"},"2,2":{"Type":"Charger"},"3,2":{"Type":"ChestOrShrine"},"4,2":{"Type":"Charger"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","hall","2wide","chest"],"forbidTags":["maxchest"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Guarded1x2_b":{"name":"Guarded1x2_b","w":1,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":75,"grid":"1111111\n1000O11\n1011111\n0002000\n0002000\n1,11110\n1002000\n1O0C0T0\n1-02000\n1111110\n0002000\n0002000\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,7":{"Type":"GuardedChest","Label":"Guarded"},"5,7":{"Type":"Trap"},"5,2":{"Type":"Skin","Skin":"LatexPipe"},"1,7":{"Type":"ChestOrShrine"},"4,1":{"Type":"ChestOrShrine"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","hall","2wide","chest"],"forbidTags":["maxchest"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Guarded2x1":{"name":"Guarded2x1","w":2,"h":1,"primInd":"udr","index":{"1,1":"udr","2,1":"l"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":75,"grid":"11100111111111\n1110011O00LLL1\n11000111100001\n11F00TT000C0L1\n11F00TT00000L1\n1110011111CC11\n11100111111111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1},{"x":12,"y":4,"type":"furniture","radius":1}],"Tiles":{"10,3":{"Type":"GuardedChest","Lock":"Red","Label":"Guarded"},"12,1":{"Type":"Barrel"},"12,3":{"Type":"Barrel"},"11,1":{"Type":"Barrel"},"10,1":{"Type":"Barrel"},"12,4":{"Type":"Cage","Furniture":"Cage"},"5,3":{"Type":"Trap"},"6,3":{"Type":"Trap"},"6,4":{"Type":"Trap"},"5,4":{"Type":"Trap"},"2,3":{"Type":"Table","Food":"Plate"},"2,4":{"Type":"Table","Food":"Plate"},"7,1":{"Type":"ChestOrShrine"},"11,5":{"Type":"Chest"},"10,5":{"Type":"Chest"}},"effectTiles":{"5,3":{"TorchUnlit":{"x":5,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,3":{"TorchUnlit":{"x":8,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"2,2":{"Torch":{"x":2,"y":2,"name":"Torch","duration":9999,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot"]}}},"Skin":{},"inaccessible":[],"tags":["urban","hall","2wide","chest"],"forbidTags":["maxchest"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Passthrough1x2_b":{"name":"Passthrough1x2_b","w":1,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":40,"grid":"1111111\n1111111\n1111111\n0G02000\n0002000\n111g111\n1112111\n1112111\n1112111\n111g111\n0002G00\n0002000\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"4,10":{"Type":"Spawn","required":[]},"1,3":{"Type":"Spawn","required":[]}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","hall","2wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Guarded_D":{"name":"Guarded_D","w":1,"h":1,"primInd":"u","index":{"1,1":"u"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":100,"grid":"11001,1\n1000001\n1000001\n100C001\n1F00001\n1F000L1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":5,"y":5,"type":"furniture","radius":1}],"Tiles":{"1,4":{"Type":"Table","Food":"Plate"},"1,5":{"Type":"Table"},"3,3":{"Type":"GuardedChest","Label":"Guarded"},"5,5":{"Type":"Cage","Furniture":"Cage"}},"effectTiles":{"1,1":{"TorchUnlit":{"x":1,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"4,1":{"TorchUnlit":{"x":4,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Guarded_U":{"name":"Guarded_U","w":1,"h":1,"primInd":"d","index":{"1,1":"d"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":100,"grid":"11,11,1\n100=001\n1000001\n100C001\n1F00001\n1F000L1\n1100111\n","POI":[],"Keyring":[],"Jail":[{"x":5,"y":5,"type":"furniture","radius":1}],"Tiles":{"1,4":{"Type":"Table","Food":"Plate"},"1,5":{"Type":"Table"},"3,3":{"Type":"GuardedChest","Label":"Guarded"},"5,5":{"Type":"Cage","Furniture":"Cage"},"3,1":{"Type":"Charger","Priority":true}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]},"Guarded_Big":{"name":"Guarded_Big","w":2,"h":1,"primInd":"dr","index":{"1,1":"dr","2,1":"dl"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":200,"grid":"11111111111111\n1CLCC200F0CCC1\n1CLLL200200TG1\n1CL00200F00TG1\n111bb1ZZ1bb111\n1220LG00GLTG@1\n1110000000T111\n","POI":[],"Keyring":[{"x":1,"y":5}],"Jail":[{"x":4,"y":5,"type":"furniture","radius":1},{"x":9,"y":5,"type":"furniture","radius":1}],"Tiles":{"8,5":{"Type":"Spawn","required":[],"AI":"guard"},"5,5":{"Type":"Spawn","required":[],"AI":"guard"},"4,5":{"Type":"Cage","Furniture":"Cage"},"9,5":{"Type":"Cage","Furniture":"Cage"},"12,2":{"Type":"Prisoner"},"12,3":{"Type":"Prisoner"},"1,2":{"Type":"Chest","Loot":"silver","Priority":true},"1,1":{"Priority":true},"1,3":{"Priority":true},"3,1":{"Type":"Chest","Loot":"storage","Chance":0.8},"4,1":{"Type":"Chest","Loot":"storage","Chance":0.8},"12,1":{"Type":"Chest","Loot":"storage","Chance":0.8},"11,1":{"Type":"Chest","Loot":"storage","Chance":0.8},"10,1":{"Type":"Chest","Loot":"storage","Chance":0.8},"6,4":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"7,4":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"10,5":{"Type":"Trap","Always":true},"10,6":{"Type":"Trap","Always":true},"8,1":{"Type":"Table"},"8,3":{"Type":"Table","Food":"Plate"},"11,2":{"Type":"Trap","Always":true},"11,3":{"Type":"Trap","Always":true},"2,1":{"Type":"Barrel"},"2,3":{"Type":"Barrel"},"2,2":{"Type":"Barrel"},"3,2":{"Type":"Barrel"},"4,2":{"Type":"Barrel"},"11,5":{"Type":"Spawn","required":[],"AI":"guard"}},"effectTiles":{"8,5":{"TorchUnlit":{"x":8,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"5,5":{"TorchUnlit":{"x":5,"y":5,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"6,4":{"Wire":{"x":6,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,4":{"Wire":{"x":7,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,4":{"Wire":{"x":8,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"9,4":{"Wire":{"x":9,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"10,4":{"Wire":{"x":10,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"11,4":{"Wire":{"x":11,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"12,4":{"Wire":{"x":12,"y":4,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"12,5":{"Wire":{"x":12,"y":5,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"5,1":{"TorchUnlit":{"x":5,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"8,1":{"TorchUnlit":{"x":8,"y":1,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}}},"Skin":{},"inaccessible":[],"tags":["urban","2wide","chest","silverchest"],"forbidTags":["maxchest","maxsilver","maxsilverchest"],"requireTags":[],"indexTags":["2wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"Passthrough1x2_c":{"name":"Passthrough1x2_c","w":1,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":40,"grid":"1111111\n1111111\n1111111\n0G02000\n0002000\n111g111\n11R2L11\n1102C11\n11R2L11\n111g111\n0002G00\n0002000\n1111111\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"4,10":{"Type":"Spawn","required":[]},"1,3":{"Type":"Spawn","required":[]},"4,7":{"Type":"Chest"},"4,6":{"Type":"Barrel"},"4,8":{"Type":"Barrel"},"2,6":{"Type":"Rubble"},"2,8":{"Type":"Rubble"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","hall","2wide"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"LongHallHorizTemple":{"name":"LongHallHorizTemple","w":2,"h":1,"primInd":"lr","index":{"1,1":"lr","2,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":200,"grid":"11111111111110\n10+00+00+00+01\n12222222222221\n02X11X11X11X20\n02222222222220\n10+00+00+00+01\n11111111111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"2,1":{"Type":"Charger"},"11,1":{"Type":"Charger"},"8,1":{"Type":"Charger"},"5,1":{"Type":"Charger"},"2,5":{"Type":"Charger"},"5,5":{"Type":"Charger"},"8,5":{"Type":"Charger"},"11,5":{"Type":"Charger"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","2wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[1,1],"notTags":["",""]},"BookcaseVert":{"name":"BookcaseVert","w":1,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr"},"flexEdge":{"1,1":"y","1,2":"y"},"flexEdgeSuper":{"1,2":"y","1,1":"y"},"scale":7,"category":"library","weight":1,"grid":"0000000\n0A0A0X0\n0101010\n0111110\n0300000\n0000000\n0111110\n0101X10\n0000030\n01X1110\n0030000\n0111X10\n0000000\n0000000\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"1,1":{"Type":"Shrine","Name":"Metal"},"3,1":{"Type":"Shrine","Name":"Metal"},"1,4":{"Type":"Spawn","required":["book"],"Label":"book","tags":["book"],"Chance":1,"AI":"looseguard","levelBoost":1},"5,8":{"Type":"Spawn","required":["book"],"Label":"book","tags":["book"],"Chance":1,"AI":"looseguard","levelBoost":1},"2,10":{"Type":"Spawn","required":["book"],"Label":"book","tags":["book"],"Chance":1,"AI":"looseguard","levelBoost":1}},"effectTiles":{},"Skin":{"1,3":{"force":true,"skin":"lib"},"2,3":{"force":true,"skin":"lib"},"3,3":{"force":true,"skin":"lib"},"4,3":{"force":true,"skin":"lib"},"5,3":{"force":true,"skin":"lib"},"1,2":{"force":true,"skin":"lib"},"5,2":{"force":true,"skin":"lib"},"4,2":{"force":true,"skin":"lib"},"3,2":{"force":true,"skin":"lib"},"2,2":{"force":true,"skin":"lib"},"1,6":{"force":true,"skin":"lib"},"2,6":{"force":true,"skin":"lib"},"3,6":{"force":true,"skin":"lib"},"4,6":{"force":true,"skin":"lib"},"5,6":{"force":true,"skin":"lib"},"4,7":{"force":true,"skin":"lib"},"3,7":{"force":true,"skin":"lib"},"2,7":{"force":true,"skin":"lib"},"5,7":{"force":true,"skin":"lib"},"1,7":{"force":true,"skin":"lib"},"1,9":{"force":true,"skin":"lib"},"3,9":{"force":true,"skin":"lib"},"4,9":{"force":true,"skin":"lib"},"5,9":{"force":true,"skin":"lib"},"3,11":{"force":true,"skin":"lib"},"2,11":{"force":true,"skin":"lib"},"1,11":{"force":true,"skin":"lib"},"5,11":{"force":true,"skin":"lib"},"4,11":{"force":true,"skin":"lib"},"2,9":{"force":true,"skin":"lib"},"5,1":{"force":true,"skin":"lib"}},"inaccessible":[],"tags":["library"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[1,1],"notTags":["",""]},"BookcaseHoriz":{"name":"BookcaseHoriz","w":2,"h":1,"primInd":"udlr","index":{"1,1":"udlr","2,1":"udlr"},"flexEdge":{"2,1":"y","1,1":"y"},"flexEdgeSuper":{"1,1":"y","2,1":"y"},"scale":7,"category":"library","weight":1,"grid":"00000300000000\n01000000000100\n01111101111100\n00000000000030\n0+011110A11A00\n00000000000000\n00000300000000\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"1,4":{"Type":"Charger"},"8,4":{"Type":"Shrine","Name":"Metal"},"11,4":{"Type":"Shrine","Name":"Metal"},"12,3":{"Type":"Spawn","required":["book"],"Label":"book","tags":["book"],"Chance":1,"AI":"looseguard","levelBoost":1},"5,0":{"Type":"Spawn","required":["book"],"Label":"book","tags":["book"],"Chance":1,"AI":"looseguard","levelBoost":1},"5,6":{"Type":"Spawn","required":["book"],"Label":"book","tags":["book"],"Chance":1,"AI":"looseguard","levelBoost":1}},"effectTiles":{},"Skin":{"10,2":{"force":true,"skin":"lib"},"9,2":{"force":true,"skin":"lib"},"8,2":{"force":true,"skin":"lib"},"7,2":{"force":true,"skin":"lib"},"5,2":{"force":true,"skin":"lib"},"4,2":{"force":true,"skin":"lib"},"3,4":{"force":true,"skin":"lib"},"4,4":{"force":true,"skin":"lib"},"5,4":{"force":true,"skin":"lib"},"6,4":{"force":true,"skin":"lib"},"9,4":{"force":true,"skin":"lib"},"10,4":{"force":true,"skin":"lib"},"3,2":{"force":true,"skin":"lib"},"2,2":{"force":true,"skin":"lib"},"1,2":{"force":true,"skin":"lib"},"11,2":{"force":true,"skin":"lib"},"6,2":{"force":true,"skin":"lib"},"1,1":{"force":true,"skin":"lib"},"11,1":{"force":true,"skin":"lib"},"10,1":{"force":true,"skin":"lib"},"9,1":{"force":true,"skin":"lib"},"8,1":{"force":true,"skin":"lib"},"7,1":{"force":true,"skin":"lib"},"6,1":{"force":true,"skin":"lib"},"5,1":{"force":true,"skin":"lib"},"4,1":{"force":true,"skin":"lib"},"3,1":{"force":true,"skin":"lib"},"2,1":{"force":true,"skin":"lib"},"2,3":{"force":true,"skin":"lib"},"3,3":{"force":true,"skin":"lib"},"4,3":{"force":true,"skin":"lib"},"5,3":{"force":true,"skin":"lib"},"6,3":{"force":true,"skin":"lib"},"7,3":{"force":true,"skin":"lib"},"8,3":{"force":true,"skin":"lib"},"9,3":{"force":true,"skin":"lib"},"10,3":{"force":true,"skin":"lib"},"11,3":{"force":true,"skin":"lib"},"11,4":{"force":true,"skin":"lib"},"11,5":{"force":true,"skin":"lib"},"10,5":{"force":true,"skin":"lib"},"9,5":{"force":true,"skin":"lib"},"8,5":{"force":true,"skin":"lib"},"8,4":{"force":true,"skin":"lib"},"7,4":{"force":true,"skin":"lib"},"7,5":{"force":true,"skin":"lib"},"6,5":{"force":true,"skin":"lib"},"5,5":{"force":true,"skin":"lib"},"4,5":{"force":true,"skin":"lib"},"3,5":{"force":true,"skin":"lib"},"2,5":{"force":true,"skin":"lib"},"2,4":{"force":true,"skin":"lib"},"1,3":{"force":true,"skin":"lib"},"1,4":{"force":true,"skin":"lib"},"1,5":{"force":true,"skin":"lib"}},"inaccessible":[],"tags":["library"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[1,1],"notTags":["",""]},"CavernNarrow1":{"name":"CavernNarrow1","w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"cavern","weight":40,"grid":"0000000\n0111110\n0111110\n0111110\n1111110\n1111110\n1110000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"0,0":{"MazeSeed":{"newest":0.9,"oldest":0.25,"scale":1,"branchchance":0.01}}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["cavern"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"CavernNarrowBig":{"name":"CavernNarrowBig","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"1,1":"y","2,1":"y","2,2":"y","1,2":"y"},"flexEdgeSuper":{},"scale":7,"category":"cavern","weight":200,"grid":"00000111110000\n01110111111110\n01110111111110\n01110111111110\n11110000001110\n11110111101110\n11110111101110\n11110111101110\n00000111100000\n01111111111110\n01111111111110\n01111111111110\n01111111111110\n00001111110000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"0,0":{"MazeSeed":{"newest":0.5,"oldest":0.25,"scale":2,"branchchance":0.01,"wobble":1}}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["cavern"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"UrbanMaze":{"name":"UrbanMaze","Labels":{},"w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"1,1":"y","2,1":"y","2,2":"y","1,2":"y"},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":100,"grid":"11101111110111\n11101111110111\n11101111110111\n01101222110000\n011012A2110111\n01101222110111\n01101111110111\n01101122210111\n0110112A210111\n01101120210111\n00001110110000\n11100000000111\n11101111110111\n11101111110111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"7,8":{"Type":"Shrine","Name":"Will","Priority":true},"6,4":{"Type":"Shrine","Name":"Will","Priority":true},"0,0":{"MazeSeed":{"newest":0.5,"oldest":0.25,"scale":1,"branchchance":0.02,"vbias":0.1,"pillarToDoodad":"true"}},"5,6":{"MazeBlock":true},"6,6":{"MazeBlock":true},"7,6":{"MazeBlock":true},"8,6":{"MazeBlock":true},"9,6":{"MazeBlock":true},"4,6":{"MazeBlock":true},"9,7":{"MazeBlock":true},"9,8":{"MazeBlock":false},"9,9":{"MazeBlock":true},"5,7":{"MazeBlock":true},"5,8":{"MazeBlock":false},"5,9":{"MazeBlock":true},"4,3":{"MazeBlock":true},"4,5":{"MazeBlock":true},"8,3":{"MazeBlock":true},"8,5":{"MazeBlock":true},"5,2":{"MazeBlock":true},"7,2":{"MazeBlock":true},"4,2":{"MazeBlock":true},"8,2":{"MazeBlock":true},"5,10":{"MazeBlock":true},"6,10":{"MazeBlock":true},"8,10":{"MazeBlock":true},"9,10":{"MazeBlock":true},"4,8":{"MazeBlock":false}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"MysteriousCave":{"name":"MysteriousCave","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"1,1":"y","2,1":"y","2,2":"y","1,2":"y"},"flexEdgeSuper":{"2,2":"y","1,2":"y","1,1":"y","2,1":"y"},"scale":7,"category":"cavern","weight":5,"grid":"00000000000000\n00000111100000\n00011111111000\n00111111111100\n00111111111100\n01111111111110\n011111CA111110\n01111100D11110\n01111111111110\n00111111111100\n00111111111100\n00011111111000\n00000111100000\n00000000000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"0,0":{},"6,5":{"MazeBlock":true},"7,5":{"MazeBlock":true},"5,5":{"MazeBlock":true},"8,5":{"MazeBlock":true},"5,6":{"MazeBlock":true},"5,7":{"MazeBlock":true},"5,8":{"MazeBlock":true},"6,8":{"MazeBlock":true},"7,8":{"MazeBlock":true},"8,8":{"MazeBlock":true},"8,6":{"MazeBlock":true},"6,6":{"Type":"Chest","Loot":"lessergold"},"7,6":{"Type":"Shrine","Name":"Metal"},"2,3":{"MazeBlock":true},"2,4":{"MazeBlock":true},"3,2":{"MazeBlock":true},"4,2":{"MazeBlock":true},"5,1":{"MazeBlock":true},"8,1":{"MazeBlock":true},"9,2":{"MazeBlock":true},"10,2":{"MazeBlock":true},"11,3":{"MazeBlock":true},"11,4":{"MazeBlock":true},"12,5":{"MazeBlock":true},"12,6":{"MazeBlock":false},"12,8":{"MazeBlock":true},"1,5":{"MazeBlock":true},"1,8":{"MazeBlock":true},"2,9":{"MazeBlock":true},"2,10":{"MazeBlock":true},"3,11":{"MazeBlock":true},"4,11":{"MazeBlock":true},"5,12":{"MazeBlock":true},"8,12":{"MazeBlock":true},"9,11":{"MazeBlock":true},"10,11":{"MazeBlock":true},"11,10":{"MazeBlock":true},"11,9":{"MazeBlock":true},"10,10":{"MazeBlock":true},"11,8":{"MazeBlock":true},"8,11":{"MazeBlock":true},"3,10":{"MazeBlock":true},"5,11":{"MazeBlock":true},"2,8":{"MazeBlock":true},"2,5":{"MazeBlock":true},"3,3":{"MazeBlock":true},"5,2":{"MazeBlock":true},"8,2":{"MazeBlock":true},"10,3":{"MazeBlock":true},"11,5":{"MazeBlock":true},"8,7":{"Type":"Door","Priority":true,"AlwaysClose":true},"9,7":{"MazeSeed":{"newest":1,"oldest":0.25,"pillarToDoodad":"true"}}},"effectTiles":{},"Skin":{"3,8":{"force":true,"skin":"cry"},"2,8":{"force":true,"skin":"cry"},"2,9":{"force":true,"skin":"cry"},"3,9":{"force":true,"skin":"cry"},"3,10":{"force":true,"skin":"cry"},"2,10":{"force":true,"skin":"cry"},"3,11":{"force":true,"skin":"cry"},"4,11":{"force":true,"skin":"cry"},"5,11":{"force":true,"skin":"cry"},"5,10":{"force":true,"skin":"cry"},"4,10":{"force":true,"skin":"cry"},"4,9":{"force":true,"skin":"cry"},"4,8":{"force":true,"skin":"cry"},"1,8":{"force":true,"skin":"cry"},"1,7":{"force":true,"skin":"cry"},"1,6":{"force":true,"skin":"cry"},"1,5":{"force":true,"skin":"cry"},"2,5":{"force":true,"skin":"cry"},"2,6":{"force":true,"skin":"cry"},"2,7":{"force":true,"skin":"cry"},"3,7":{"force":true,"skin":"cry"},"3,6":{"force":true,"skin":"cry"},"3,5":{"force":true,"skin":"cry"},"3,4":{"force":true,"skin":"cry"},"3,3":{"force":true,"skin":"cry"},"3,2":{"force":true,"skin":"cry"},"4,2":{"force":true,"skin":"cry"},"5,2":{"force":true,"skin":"cry"},"6,2":{"force":true,"skin":"cry"},"5,1":{"force":true,"skin":"cry"},"6,1":{"force":true,"skin":"cry"},"7,1":{"force":true,"skin":"cry"},"8,1":{"force":true,"skin":"cry"},"7,2":{"force":true,"skin":"cry"},"8,2":{"force":true,"skin":"cry"},"9,2":{"force":true,"skin":"cry"},"10,2":{"force":true,"skin":"cry"},"10,3":{"force":true,"skin":"cry"},"9,3":{"force":true,"skin":"cry"},"8,3":{"force":true,"skin":"cry"},"7,3":{"force":true,"skin":"cry"},"6,3":{"force":true,"skin":"cry"},"5,3":{"force":true,"skin":"cry"},"4,3":{"force":true,"skin":"cry"},"4,4":{"force":true,"skin":"cry"},"4,5":{"force":true,"skin":"cry"},"4,6":{"force":true,"skin":"cry"},"5,5":{"force":true,"skin":"jng"},"5,4":{"force":true,"skin":"cry"},"4,7":{"force":true,"skin":"cry"},"5,6":{"force":true,"skin":"jng"},"6,4":{"force":true,"skin":"cry"},"7,4":{"force":true,"skin":"cry"},"5,7":{"force":true,"skin":"jng"},"5,8":{"force":true,"skin":"jng"},"6,8":{"force":true,"skin":"jng"},"6,9":{"force":true,"skin":"cry"},"5,9":{"force":true,"skin":"cry"},"5,12":{"force":true,"skin":"cry"},"6,12":{"force":true,"skin":"cry"},"7,12":{"force":true,"skin":"cry"},"8,12":{"force":true,"skin":"cry"},"8,11":{"force":true,"skin":"cry"},"7,11":{"force":true,"skin":"cry"},"7,10":{"force":true,"skin":"cry"},"6,10":{"force":true,"skin":"cry"},"6,11":{"force":true,"skin":"cry"},"7,9":{"force":true,"skin":"cry"},"7,8":{"force":true,"skin":"jng"},"8,8":{"force":true,"skin":"jng"},"8,9":{"force":true,"skin":"cry"},"8,10":{"force":true,"skin":"cry"},"9,10":{"force":true,"skin":"cry"},"9,11":{"force":true,"skin":"cry"},"10,11":{"force":true,"skin":"cry"},"9,9":{"force":true,"skin":"cry"},"9,8":{"force":true,"skin":"cry"},"9,7":{"force":true,"skin":"cry"},"8,5":{"force":true,"skin":"jng"},"8,4":{"force":true,"skin":"cry"},"9,4":{"force":true,"skin":"cry"},"10,4":{"force":true,"skin":"cry"},"11,3":{"force":true,"skin":"cry"},"11,4":{"force":true,"skin":"cry"},"11,5":{"force":true,"skin":"cry"},"10,5":{"force":true,"skin":"cry"},"9,5":{"force":true,"skin":"cry"},"9,6":{"force":true,"skin":"cry"},"10,6":{"force":true,"skin":"cry"},"10,7":{"force":true,"skin":"cry"},"10,8":{"force":true,"skin":"cry"},"10,9":{"force":true,"skin":"cry"},"11,10":{"force":true,"skin":"cry"},"11,9":{"force":true,"skin":"cry"},"11,8":{"force":true,"skin":"cry"},"11,7":{"force":true,"skin":"cry"},"11,6":{"force":true,"skin":"cry"},"12,5":{"force":true,"skin":"cry"},"12,6":{"force":true,"skin":"cry"},"12,7":{"force":true,"skin":"cry"},"12,8":{"force":true,"skin":"cry"},"6,5":{"force":true,"skin":"jng"},"7,5":{"force":true,"skin":"jng"},"8,6":{"force":true,"skin":"jng"},"7,7":{"force":true,"skin":"jng"},"7,6":{"force":true,"skin":"jng"},"6,6":{"force":true,"skin":"jng"},"6,7":{"force":true,"skin":"jng"},"2,3":{"force":true,"skin":"cry"},"2,4":{"force":true,"skin":"cry"},"10,10":{"force":true,"skin":"cry"},"8,7":{"force":true,"skin":"jng"}},"inaccessible":[],"tags":["cavern","lessergold"],"forbidTags":["maxlessergold"],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"ServerRoom":{"name":"ServerRoom","w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":1,"grid":"00000000000000\n00000000000000\n00111111111100\n001111111111X0\n00131111113110\n00111XCCX11110\n0X131111113110\n01111X11X11100\n01131111113100\n011111001111X0\n001111ZZ111100\n00111222@11100\n00000000000000\n00000000000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"6,10":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open","MazeBlock":true},"7,10":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open","MazeBlock":true},"3,4":{"Type":"ForceSpawn","required":["robot"],"Label":"Robot","tags":["robot"],"filterTags":["turret","oldrobot"],"Chance":0.8,"AI":"looseguard","force":"true","faction":"AncientRobot","levelBoost":2,"MazeBlock":false,"OL":true},"3,6":{"Type":"ForceSpawn","required":["robot"],"Label":"Robot","tags":["robot"],"filterTags":["turret","oldrobot"],"Chance":0.8,"AI":"looseguard","force":"true","faction":"AncientRobot","levelBoost":2,"MazeBlock":false,"OL":true},"3,8":{"Type":"ForceSpawn","required":["robot"],"Label":"Robot","tags":["robot"],"filterTags":["turret","oldrobot"],"Chance":0.8,"AI":"looseguard","force":"true","faction":"AncientRobot","levelBoost":2,"MazeBlock":false,"OL":true},"6,9":{"MazeBlock":false,"OL":true},"7,9":{"MazeBlock":false,"OL":true},"10,8":{"Type":"ForceSpawn","required":["robot"],"Label":"Robot","tags":["robot"],"filterTags":["turret","oldrobot"],"Chance":0.8,"AI":"looseguard","force":"true","faction":"AncientRobot","levelBoost":2,"MazeBlock":false,"OL":true},"10,6":{"Type":"ForceSpawn","required":["robot"],"Label":"Robot","tags":["robot"],"filterTags":["turret","oldrobot"],"Chance":0.8,"AI":"looseguard","force":"true","faction":"AncientRobot","levelBoost":2,"MazeBlock":false,"OL":true},"10,4":{"Type":"ForceSpawn","required":["robot"],"Label":"Robot","tags":["robot"],"filterTags":["turret","oldrobot"],"Chance":0.8,"AI":"looseguard","force":"true","faction":"AncientRobot","levelBoost":2,"MazeBlock":false,"OL":true},"6,6":{"MazeSeed":{"newest":1,"oldest":0.25,"hbias":1,"pillarToDoodad":"true"},"OL":true},"2,2":{"MazeBlock":true},"3,2":{"MazeBlock":true},"4,2":{"MazeBlock":true},"5,2":{"MazeBlock":true},"6,2":{"MazeBlock":true},"7,2":{"MazeBlock":true},"8,2":{"MazeBlock":true},"9,2":{"MazeBlock":true},"10,2":{"MazeBlock":true},"11,2":{"MazeBlock":true},"11,3":{"MazeBlock":true},"11,4":{"MazeBlock":true},"11,6":{"MazeBlock":true},"11,7":{"MazeBlock":true},"11,8":{"MazeBlock":true},"11,9":{"MazeBlock":true},"11,10":{"MazeBlock":true},"11,11":{"MazeBlock":true},"10,11":{"MazeBlock":true},"9,11":{"MazeBlock":true},"9,10":{"MazeBlock":true},"8,10":{"MazeBlock":true},"5,10":{"MazeBlock":true},"4,10":{"MazeBlock":true},"4,11":{"MazeBlock":true},"3,11":{"MazeBlock":true},"2,11":{"MazeBlock":true},"2,10":{"MazeBlock":true},"2,9":{"MazeBlock":true},"2,7":{"MazeBlock":true},"2,6":{"MazeBlock":true},"2,5":{"MazeBlock":true},"2,4":{"MazeBlock":true},"2,3":{"MazeBlock":true},"6,5":{"Type":"Chest","Loot":"robot","Faction":"AncientRobot","NoTrap":"true","Priority":"true","OL":true},"7,5":{"Type":"Chest","Loot":"robot","Faction":"AncientRobot","NoTrap":"true","Priority":"true","OL":true},"6,8":{"MazeBlock":false,"OL":true},"7,8":{"MazeBlock":false,"OL":true},"7,7":{"MazeBlock":true,"OL":true},"6,7":{"MazeBlock":true,"OL":true},"3,3":{"OL":true},"4,3":{"OL":true},"6,3":{"OL":true},"5,3":{"OL":true},"8,3":{"OL":true},"7,3":{"OL":true},"9,3":{"OL":true},"10,3":{"OL":true},"10,5":{"OL":true},"10,9":{"OL":true},"10,10":{"OL":true},"9,9":{"OL":true},"8,9":{"OL":true},"5,9":{"OL":true},"4,9":{"OL":true},"3,9":{"OL":true},"3,10":{"OL":true},"3,7":{"OL":true},"3,5":{"OL":true},"4,4":{"OL":true},"4,5":{"OL":true},"5,4":{"OL":true},"6,4":{"OL":true},"7,4":{"OL":true},"8,4":{"OL":true},"9,5":{"OL":true},"9,4":{"OL":true},"8,5":{"OL":true},"4,6":{"OL":true},"5,6":{"OL":true},"5,7":{"OL":true},"4,7":{"OL":true},"4,8":{"OL":true},"5,8":{"OL":true},"7,6":{"OL":true},"8,8":{"OL":true},"8,6":{"OL":true},"9,6":{"OL":true},"9,7":{"OL":true},"9,8":{"OL":true},"10,7":{"OL":true},"1,7":{"MazeBlock":true},"1,8":{"MazeBlock":true},"1,9":{"MazeBlock":true},"12,6":{"MazeBlock":true},"12,5":{"MazeBlock":true},"12,4":{"MazeBlock":true},"11,5":{"OL":true},"2,8":{"OL":true},"5,5":{"OL":true},"8,7":{"OL":true}},"effectTiles":{"8,11":{"Wire":{"x":8,"y":11,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"8,10":{"Wire":{"x":8,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"7,10":{"Wire":{"x":7,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}},"6,10":{"Wire":{"x":6,"y":10,"name":"Wire","duration":9999,"priority":50,"tags":["hiddenmagic","wire"]}}},"Skin":{"12,3":{"force":true,"skin":"bel"},"1,6":{"force":true,"skin":"bel"},"12,9":{"force":true,"skin":"bel"},"5,11":{"force":true,"skin":"bel"},"6,11":{"force":true,"skin":"bel"},"7,11":{"force":true,"skin":"bel"},"8,11":{"force":true,"skin":"bel"},"10,11":{"force":true,"skin":"bel"},"9,11":{"force":true,"skin":"bel"},"11,11":{"force":true,"skin":"bel"},"11,10":{"force":true,"skin":"bel"},"11,9":{"force":true,"skin":"bel"},"11,8":{"force":true,"skin":"bel"},"11,7":{"force":true,"skin":"bel"},"11,6":{"force":true,"skin":"bel"},"10,10":{"force":true,"skin":"bel"},"9,10":{"force":true,"skin":"bel"},"8,10":{"force":true,"skin":"bel"},"7,10":{"force":true,"skin":"bel"},"6,10":{"force":true,"skin":"bel"},"5,10":{"force":true,"skin":"bel"},"4,10":{"force":true,"skin":"bel"},"3,10":{"force":true,"skin":"bel"},"4,11":{"force":true,"skin":"bel"},"3,11":{"force":true,"skin":"bel"},"2,11":{"force":true,"skin":"bel"},"2,10":{"force":true,"skin":"bel"},"2,9":{"force":true,"skin":"bel"},"2,7":{"force":true,"skin":"bel"},"2,6":{"force":true,"skin":"bel"},"5,8":{"force":true,"skin":"bel"},"6,8":{"force":true,"skin":"bel"},"6,7":{"force":true,"skin":"bel"},"5,7":{"force":true,"skin":"bel"},"4,8":{"force":true,"skin":"bel"},"4,7":{"force":true,"skin":"bel"},"6,6":{"force":true,"skin":"bel"},"7,6":{"force":true,"skin":"bel"},"7,7":{"force":true,"skin":"bel"},"7,8":{"force":true,"skin":"bel"},"9,7":{"force":true,"skin":"bel"},"9,8":{"force":true,"skin":"bel"},"8,8":{"force":true,"skin":"bel"},"4,5":{"force":true,"skin":"bel"},"4,6":{"force":true,"skin":"bel"},"5,6":{"force":true,"skin":"bel"},"6,4":{"force":true,"skin":"bel"},"7,4":{"force":true,"skin":"bel"},"8,4":{"force":true,"skin":"bel"},"8,5":{"force":true,"skin":"bel"},"8,6":{"force":true,"skin":"bel"},"9,4":{"force":true,"skin":"bel"},"9,5":{"force":true,"skin":"bel"},"9,6":{"force":true,"skin":"bel"},"11,4":{"force":true,"skin":"bel"},"11,2":{"force":true,"skin":"bel"},"10,2":{"force":true,"skin":"bel"},"9,2":{"force":true,"skin":"bel"},"8,2":{"force":true,"skin":"bel"},"7,2":{"force":true,"skin":"bel"},"6,2":{"force":true,"skin":"bel"},"5,2":{"force":true,"skin":"bel"},"4,2":{"force":true,"skin":"bel"},"3,2":{"force":true,"skin":"bel"},"2,2":{"force":true,"skin":"bel"},"2,3":{"force":true,"skin":"bel"},"2,4":{"force":true,"skin":"bel"},"2,5":{"force":true,"skin":"bel"},"4,4":{"force":true,"skin":"bel"},"5,4":{"force":true,"skin":"bel"},"11,3":{"force":true,"skin":"bel"},"5,9":{"force":true,"skin":"bel"},"6,9":{"force":true,"skin":"bel"},"7,9":{"force":true,"skin":"bel"},"8,9":{"force":true,"skin":"bel"},"4,9":{"force":true,"skin":"bel"},"3,9":{"force":true,"skin":"bel"},"3,3":{"force":true,"skin":"bel"},"3,4":{"force":true,"skin":"bel"},"3,6":{"force":true,"skin":"bel"},"3,8":{"force":true,"skin":"bel"},"5,3":{"force":true,"skin":"bel"},"6,3":{"force":true,"skin":"bel"},"7,3":{"force":true,"skin":"bel"},"9,3":{"force":true,"skin":"bel"},"10,4":{"force":true,"skin":"bel"},"10,6":{"force":true,"skin":"bel"},"10,8":{"force":true,"skin":"bel"},"10,9":{"force":true,"skin":"bel"},"9,9":{"force":true,"skin":"bel"},"10,3":{"force":true,"skin":"bel"},"6,5":{"force":true,"skin":"bel"},"7,5":{"force":true,"skin":"bel"},"4,3":{"force":true,"skin":"bel"},"8,3":{"force":true,"skin":"bel"},"10,5":{"force":true,"skin":"bel"},"3,5":{"force":true,"skin":"bel"},"3,7":{"force":true,"skin":"bel"},"10,7":{"force":true,"skin":"bel"},"1,7":{"force":true,"skin":"bel"},"1,8":{"force":true,"skin":"bel"},"1,9":{"force":true,"skin":"bel"},"2,8":{"force":true,"skin":"bel"},"1,3":{"force":true,"skin":"bel"},"1,4":{"force":true,"skin":"bel"},"1,5":{"force":true,"skin":"bel"},"12,4":{"force":true,"skin":"bel"},"12,5":{"force":true,"skin":"bel"},"12,6":{"force":true,"skin":"bel"},"12,7":{"force":true,"skin":"bel"},"12,8":{"force":true,"skin":"bel"},"11,5":{"force":true,"skin":"bel"},"5,5":{"force":true,"skin":"bel"},"8,7":{"force":true,"skin":"bel"}},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"wide_tombHChest":{"name":"wide_tombHChest","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":100,"grid":"1111111\n1L1C1L1\n00X0X00\n0222220\n0000000\n1X1L1X1\n1111111\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1},{"x":1,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":5,"y":5,"type":"furniture","radius":1},{"x":3,"y":5,"type":"furniture","radius":1},{"x":1,"y":5,"type":"furniture","radius":1},{"x":4,"y":2,"type":"furniture","radius":1},{"x":2,"y":2,"type":"furniture","radius":1}],"Tiles":{"1,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"5,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"3,5":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"3,1":{"Type":"Chest"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"wide_tombVChest":{"name":"wide_tombVChest","w":1,"h":1,"primInd":"ud","index":{"1,1":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":50,"grid":"1100011\n1102011\n1X020X1\n1C020C1\n1X020X1\n1102011\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":13,"y":32,"type":"jail","radius":1}],"Tiles":{"5,3":{"Type":"Chest"},"1,3":{"Type":"Chest"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","wide","egyptian"],"forbidTags":[],"requireTags":[],"indexTags":["wide","egyptian"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,-1],"notTags":["","1"]},"MysteriousStudy":{"name":"MysteriousStudy","Labels":{},"w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"2,2":"y","1,1":"y","1,2":"y","2,1":"y"},"flexEdgeSuper":{"2,2":"y","2,1":"y","1,1":"y","1,2":"y"},"scale":7,"category":"library","weight":8,"grid":"00000000000000\n01111111111110\n01111111111110\n01111111111110\n01111111111110\n01111111111110\n011111CX111110\n01111100111110\n01111111111110\n01111111111110\n01111111111110\n01111111111110\n01111111111110\n00000000000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"6,6":{"Type":"Chest","Loot":"wizard","Faction":"Apprentice","NoTrap":"true","Priority":"true","MazeBlock":true},"2,2":{"MazeBlock":false},"6,2":{},"6,3":{},"7,5":{"MazeBlock":true},"6,5":{"MazeBlock":true},"5,5":{"MazeBlock":true},"5,6":{"MazeBlock":true},"5,7":{"MazeBlock":true},"5,8":{"MazeBlock":true},"6,8":{"MazeBlock":false},"7,8":{"MazeBlock":true},"8,8":{"MazeBlock":true},"8,7":{"MazeBlock":true},"8,6":{"MazeBlock":true},"8,5":{"MazeBlock":true},"6,10":{"MazeBlock":false},"7,10":{"MazeBlock":false},"8,10":{"MazeBlock":false},"9,10":{"MazeBlock":false},"5,10":{"MazeBlock":false},"4,10":{"MazeBlock":false},"5,11":{"MazeBlock":true},"3,11":{"MazeBlock":false},"6,7":{"MazeBlock":false},"7,7":{"MazeBlock":true},"5,3":{},"0,0":{"MazeSeed":{"newest":0.5,"oldest":0.5,"branchchance":0.01},"MazeBlock":false},"0,11":{"MazeBlock":true},"0,12":{"MazeBlock":true},"4,13":{"MazeBlock":true},"5,13":{"MazeBlock":true},"13,9":{"MazeBlock":true},"13,10":{"MazeBlock":false},"13,4":{"MazeBlock":true},"13,5":{"MazeBlock":true},"13,1":{"MazeBlock":true},"11,0":{"MazeBlock":true},"9,0":{"MazeBlock":true},"7,0":{"MazeBlock":true},"5,0":{"MazeBlock":false},"6,0":{"MazeBlock":true},"7,6":{"MazeBlock":true},"6,11":{"MazeBlock":true},"7,11":{"MazeBlock":true},"8,11":{"MazeBlock":true},"4,11":{"MazeBlock":true},"0,2":{"MazeBlock":false},"0,1":{"MazeBlock":false},"4,1":{"MazeBlock":true},"5,1":{"MazeBlock":true},"6,1":{"MazeBlock":true},"7,1":{"MazeBlock":true},"8,1":{"MazeBlock":true},"10,1":{"MazeBlock":true},"11,11":{"MazeBlock":true},"12,11":{"MazeBlock":false},"1,11":{"MazeBlock":true},"2,3":{"MazeBlock":false},"2,4":{"MazeBlock":false},"2,5":{"MazeBlock":false},"2,7":{"MazeBlock":false},"2,9":{"MazeBlock":false},"2,10":{"MazeBlock":false},"2,6":{"MazeBlock":false},"2,1":{"MazeBlock":false},"12,1":{"MazeBlock":true},"12,5":{"MazeBlock":false},"12,6":{"MazeBlock":false},"12,4":{"MazeBlock":false},"12,8":{"MazeBlock":false},"12,9":{"MazeBlock":false},"12,10":{"MazeBlock":false},"11,4":{"MazeBlock":true},"11,5":{"MazeBlock":true},"11,6":{"MazeBlock":true},"11,8":{"MazeBlock":true},"11,9":{"MazeBlock":true},"11,10":{"MazeBlock":true},"1,1":{"MazeBlock":true},"1,4":{"MazeBlock":true},"1,6":{"MazeBlock":true},"1,7":{"MazeBlock":true},"1,5":{"MazeBlock":true},"1,9":{"MazeBlock":true},"1,10":{"MazeBlock":true},"13,3":{"MazeBlock":false},"11,3":{"MazeBlock":true},"10,4":{"MazeBlock":false},"8,4":{"MazeBlock":false},"7,4":{"MazeBlock":false},"6,4":{"MazeBlock":false},"5,4":{"MazeBlock":false},"4,4":{"MazeBlock":false},"4,3":{"MazeBlock":false},"4,12":{"MazeBlock":true},"5,12":{"MazeBlock":true},"6,12":{"MazeBlock":true},"7,12":{"MazeBlock":true},"8,12":{"MazeBlock":true},"11,12":{"MazeBlock":true},"1,12":{"MazeBlock":true}},"effectTiles":{},"Skin":{"12,1":{"force":true,"skin":"lib"},"12,2":{"force":true,"skin":"lib"},"11,1":{"force":true,"skin":"lib"},"11,2":{"force":true,"skin":"lib"},"9,1":{"force":true,"skin":"lib"},"10,1":{"force":true,"skin":"lib"},"10,2":{"force":true,"skin":"lib"},"9,2":{"force":true,"skin":"lib"},"7,1":{"force":true,"skin":"lib"},"8,1":{"force":true,"skin":"lib"},"8,2":{"force":true,"skin":"lib"},"7,2":{"force":true,"skin":"lib"},"6,2":{"force":true,"skin":"lib"},"5,2":{"force":true,"skin":"lib"},"1,1":{"force":true,"skin":"lib"},"2,1":{"force":true,"skin":"lib"},"3,1":{"force":true,"skin":"lib"},"6,1":{"force":true,"skin":"lib"},"4,2":{"force":true,"skin":"lib"},"1,3":{"force":true,"skin":"lib"},"1,4":{"force":true,"skin":"lib"},"2,3":{"force":true,"skin":"lib"},"2,2":{"force":true,"skin":"lib"},"3,2":{"force":true,"skin":"lib"},"2,4":{"force":true,"skin":"lib"},"3,3":{"force":true,"skin":"lib"},"4,3":{"force":true,"skin":"lib"},"3,4":{"force":true,"skin":"lib"},"4,4":{"force":true,"skin":"lib"},"5,3":{"force":true,"skin":"lib"},"7,3":{"force":true,"skin":"lib"},"6,5":{"force":true,"skin":"lib"},"5,4":{"force":true,"skin":"lib"},"6,4":{"force":true,"skin":"lib"},"8,3":{"force":true,"skin":"lib"},"9,3":{"force":true,"skin":"lib"},"7,4":{"force":true,"skin":"lib"},"8,4":{"force":true,"skin":"lib"},"10,3":{"force":true,"skin":"lib"},"11,3":{"force":true,"skin":"lib"},"12,3":{"force":true,"skin":"lib"},"12,4":{"force":true,"skin":"lib"},"12,5":{"force":true,"skin":"lib"},"12,6":{"force":true,"skin":"lib"},"11,5":{"force":true,"skin":"lib"},"10,4":{"force":true,"skin":"lib"},"10,5":{"force":true,"skin":"lib"},"10,6":{"force":true,"skin":"lib"},"9,4":{"force":true,"skin":"lib"},"9,6":{"force":true,"skin":"lib"},"9,7":{"force":true,"skin":"lib"},"7,5":{"force":true,"skin":"shrine"},"9,5":{"force":true,"skin":"lib"},"8,5":{"force":true,"skin":"lib"},"8,6":{"force":true,"skin":"lib"},"1,5":{"force":true,"skin":"lib"},"2,5":{"force":true,"skin":"lib"},"1,6":{"force":true,"skin":"lib"},"1,7":{"force":true,"skin":"lib"},"2,6":{"force":true,"skin":"lib"},"3,5":{"force":true,"skin":"lib"},"4,5":{"force":true,"skin":"lib"},"5,5":{"force":true,"skin":"lib"},"2,7":{"force":true,"skin":"lib"},"3,7":{"force":true,"skin":"lib"},"3,6":{"force":true,"skin":"lib"},"4,6":{"force":true,"skin":"lib"},"5,6":{"force":true,"skin":"lib"},"5,7":{"force":true,"skin":"lib"},"4,7":{"force":true,"skin":"lib"},"3,8":{"force":true,"skin":"lib"},"2,8":{"force":true,"skin":"lib"},"2,9":{"force":true,"skin":"lib"},"1,8":{"force":true,"skin":"lib"},"1,9":{"force":true,"skin":"lib"},"1,10":{"force":true,"skin":"lib"},"1,11":{"force":true,"skin":"lib"},"1,12":{"force":true,"skin":"lib"},"2,12":{"force":true,"skin":"lib"},"3,12":{"force":true,"skin":"lib"},"6,12":{"force":true,"skin":"lib"},"7,12":{"force":true,"skin":"lib"},"8,12":{"force":true,"skin":"lib"},"12,11":{"force":true,"skin":"lib"},"12,10":{"force":true,"skin":"lib"},"12,7":{"force":true,"skin":"lib"},"11,11":{"force":true,"skin":"lib"},"12,12":{"force":true,"skin":"lib"},"11,12":{"force":true,"skin":"lib"},"10,12":{"force":true,"skin":"lib"},"9,12":{"force":true,"skin":"lib"},"9,11":{"force":true,"skin":"lib"},"12,8":{"force":true,"skin":"lib"},"12,9":{"force":true,"skin":"lib"},"11,10":{"force":true,"skin":"lib"},"10,11":{"force":true,"skin":"lib"},"11,6":{"force":true,"skin":"lib"},"11,8":{"force":true,"skin":"lib"},"11,9":{"force":true,"skin":"lib"},"10,10":{"force":true,"skin":"lib"},"10,7":{"force":true,"skin":"lib"},"11,7":{"force":true,"skin":"lib"},"10,8":{"force":true,"skin":"lib"},"10,9":{"force":true,"skin":"lib"},"8,9":{"force":true,"skin":"lib"},"9,8":{"force":true,"skin":"lib"},"9,9":{"force":true,"skin":"lib"},"7,10":{"force":true,"skin":"lib"},"9,10":{"force":true,"skin":"lib"},"8,10":{"force":true,"skin":"lib"},"8,11":{"force":true,"skin":"lib"},"7,11":{"force":true,"skin":"lib"},"6,11":{"force":true,"skin":"lib"},"5,11":{"force":true,"skin":"lib"},"8,7":{"force":true,"skin":"lib"},"8,8":{"force":true,"skin":"lib"},"6,9":{"force":true,"skin":"lib"},"7,8":{"force":true,"skin":"lib"},"7,9":{"force":true,"skin":"lib"},"4,11":{"force":true,"skin":"lib"},"3,11":{"force":true,"skin":"lib"},"4,8":{"force":true,"skin":"lib"},"5,8":{"force":true,"skin":"lib"},"6,8":{"force":true,"skin":"lib"},"5,9":{"force":true,"skin":"lib"},"4,10":{"force":true,"skin":"lib"},"2,11":{"force":true,"skin":"lib"},"4,9":{"force":true,"skin":"lib"},"3,9":{"force":true,"skin":"lib"},"3,10":{"force":true,"skin":"lib"},"2,10":{"force":true,"skin":"lib"},"7,6":{"force":true,"skin":"lib"},"6,6":{"force":true,"skin":"lib"},"6,7":{"force":true,"skin":"lib"},"7,7":{"force":true,"skin":"lib"},"1,2":{"force":true,"skin":"lib"},"6,3":{"force":true,"skin":"lib"},"5,10":{"force":true,"skin":"lib"},"6,10":{"force":true,"skin":"lib"},"4,1":{"force":true,"skin":"lib"},"5,1":{"force":true,"skin":"lib"},"11,4":{"force":true,"skin":"lib"},"4,12":{"force":true,"skin":"lib"},"5,12":{"force":true,"skin":"lib"}},"inaccessible":[],"tags":["library"],"forbidTags":["start"],"requireTags":[],"indexTags":["wide"],"maxTags":[-1],"bonusTags":[0],"multTags":[3],"notTags":[""]},"Arena_Warden":{"name":"Arena_Warden","Labels":{},"w":3,"h":3,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","1,3":"udlr","2,1":"udlr","2,2":"udlr","2,3":"udlr","3,1":"udlr","3,2":"udlr","3,3":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":-1,"grid":"000000000000000000000\n001bbb101bbb101bbb100\n001B?0101?0X101X0?100\n00100X10100B101B00100\n001bDb101bDb101bDb100\n000000000000000000000\n011000110000011000110\n0,,0L0,,00L00,,0L0,,0\n000000000000000000000\n000000000000000000000\n000000000000000000000\n00,0=0,000000=0000000\n0000000000000000F1100\n0000000000000000F,,00\n001bbb1000000FF000000\n001000b00000011000000\n0010B0D000000,,000L00\n001000b00000000001100\n001bbb10011000000,,00\n000000000,,00=0000000\n000000000000000000000\n","POI":[],"Keyring":[],"Jail":[{"x":18,"y":16,"type":"furniture","radius":1},{"x":16,"y":7,"type":"furniture","radius":1},{"x":10,"y":7,"type":"furniture","radius":1},{"x":4,"y":7,"type":"furniture","radius":1}],"Tiles":{"6,16":{"Type":"Door","Priority":true,"AlwaysClose":true,"OL":true,"Jail":false},"3,15":{"Jail":true,"OL":true},"4,15":{"Jail":true,"OL":true},"5,15":{"Jail":true,"OL":true},"5,16":{"Jail":true,"OL":true},"5,17":{"Jail":true,"OL":true},"4,17":{"Jail":true,"OL":true},"3,17":{"Jail":true,"OL":true},"3,16":{"Jail":true,"OL":true},"4,16":{"OL":true},"16,4":{"Type":"Door","Priority":true,"AlwaysClose":true},"10,4":{"Type":"Door","Priority":true,"AlwaysClose":true},"4,4":{"Type":"Door","Priority":true,"AlwaysClose":true},"16,12":{"Type":"Table"},"16,13":{"Type":"Table"},"13,14":{"Type":"Table"},"14,14":{"Type":"Table"},"18,16":{"Type":"Cage","Furniture":"Cage"},"16,7":{"Type":"DisplayStand","Furniture":"DisplayStand"},"10,7":{"Type":"DisplayStand","Furniture":"DisplayStand"},"4,7":{"Type":"DisplayStand","Furniture":"DisplayStand"},"15,2":{"Type":"SkinCode","SkinCode":"0","Skin2":"Dummy2"},"11,2":{"Type":"SkinCode","SkinCode":"0","Skin2":"Dummy1"},"5,3":{"Type":"SkinCode","SkinCode":"0","Skin2":"Dummy0"},"13,11":{"Type":"Charger","Priority":true},"4,11":{"Type":"Charger","Priority":true},"13,19":{"Type":"Charger","Priority":true}},"effectTiles":{"5,2":{"Torch":{"x":5,"y":2,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"10,2":{"Torch":{"x":10,"y":2,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"16,2":{"Torch":{"x":16,"y":2,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"10,15":{"SpikeTrap":{"x":10,"y":15,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"12,18":{"SpikeTrap":{"x":12,"y":18,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"0,18":{"SpikeTrap":{"x":0,"y":18,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"1,15":{"SpikeTrap":{"x":1,"y":15,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"0,6":{"SpikeTrap":{"x":0,"y":6,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"7,4":{"SpikeTrap":{"x":7,"y":4,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"1,1":{"SpikeTrap":{"x":1,"y":1,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"13,1":{"SpikeTrap":{"x":13,"y":1,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"20,4":{"SpikeTrap":{"x":20,"y":4,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"19,1":{"SpikeTrap":{"x":19,"y":1,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"20,7":{"SpikeTrap":{"x":20,"y":7,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"15,15":{"SpikeTrap":{"x":15,"y":15,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"20,17":{"SpikeTrap":{"x":20,"y":17,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"7,20":{"SpikeTrap":{"x":7,"y":20,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"7,3":{"SpikeTrap":{"x":7,"y":3,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}}},"Skin":{},"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"LightPassage":{"name":"LightPassage","w":1,"h":1,"primInd":"lr","index":{"1,1":"lr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":10,"grid":"1111111\n0000000\n0000000\n0000000\n0000000\n0000000\n1111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"0,2":{"MotionLamp":{"x":0,"y":2,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"0,4":{"MotionLamp":{"x":0,"y":4,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"2,2":{"MotionLamp":{"x":2,"y":2,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"2,4":{"MotionLamp":{"x":2,"y":4,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"4,2":{"MotionLamp":{"x":4,"y":2,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"4,4":{"MotionLamp":{"x":4,"y":4,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"6,2":{"MotionLamp":{"x":6,"y":2,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"6,4":{"MotionLamp":{"x":6,"y":4,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}}},"Skin":{},"inaccessible":[],"tags":["industrial","wide"],"forbidTags":[],"requireTags":[],"indexTags":["wide","industrial"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[2,0],"notTags":["","1"]},"ElevatorRoom":{"name":"ElevatorRoom","w":3,"h":4,"primInd":"dr","index":{"1,1":"dr","1,2":"udr","1,3":"udr","1,4":"ur","2,1":"dlr","2,2":"udlr","2,3":"udlr","2,4":"udlr","3,1":"dl","3,2":"udl","3,3":"udl","3,4":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":-100,"grid":"111111111111111111111\n11111111000C001111111\n111111110000001111111\n111111110000001111111\n111111111100111111111\n111111111100111111111\n111111111111111111111\n111111111111111111111\n111VVVVVVVVVVVVVVV111\n111V1111111111111V111\n111N1111111111111N111\n111V1111111111111V111\n111N11112=0=21111N111\n111V1111200021111V111\n111N1111222221111N111\n111V1111111111111V111\n111N1111111111111N111\n111V1111111111111V111\n111V1111111111111V111\n111VVVVVVVVVVVVVVV111\n111111111111111111111\n111111111111111111111\n111111111111111111111\n111111111111111111111\n110000001111100000001\n110000001101100000001\n111111100000001111111\n111111111101111111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"14,23":{"MazeBlock":false},"14,24":{"MazeBlock":false},"13,24":{"MazeBlock":false},"8,23":{"MazeBlock":true},"9,23":{"MazeBlock":true},"11,23":{"MazeBlock":true},"10,23":{"MazeBlock":true},"8,24":{"MazeBlock":true},"8,25":{"MazeBlock":true},"9,25":{"MazeBlock":true},"10,25":{"MazeBlock":true},"11,25":{"MazeBlock":true},"12,25":{"MazeBlock":true},"12,24":{"MazeBlock":true},"12,23":{"MazeBlock":true},"14,26":{"MazeBlock":true},"15,26":{"MazeBlock":true},"16,26":{"MazeBlock":true},"17,26":{"MazeBlock":true},"18,26":{"MazeBlock":true},"19,26":{"MazeBlock":true},"20,26":{"MazeBlock":true},"20,27":{"MazeBlock":false},"19,27":{"MazeBlock":false},"18,27":{"MazeBlock":false},"17,27":{"MazeBlock":false},"16,27":{"MazeBlock":false},"15,27":{"MazeBlock":false},"14,27":{"MazeBlock":false},"13,27":{"MazeBlock":true},"12,27":{"MazeBlock":true},"11,27":{"MazeBlock":true},"9,27":{"MazeBlock":true},"8,27":{"MazeBlock":true},"7,27":{"MazeBlock":true},"6,26":{"MazeBlock":true},"5,26":{"MazeBlock":true},"0,26":{"MazeBlock":true},"1,26":{"MazeBlock":true},"2,26":{"MazeBlock":true},"3,26":{"MazeBlock":true},"4,26":{"MazeBlock":true},"6,1":{"MazeBlock":false},"6,2":{"MazeBlock":false},"6,0":{"MazeBlock":false},"6,3":{"MazeBlock":false},"6,4":{"MazeBlock":false},"6,5":{"MazeBlock":false},"6,6":{"MazeBlock":false},"7,6":{"MazeBlock":false},"8,6":{"MazeBlock":false},"9,6":{"MazeBlock":false},"11,6":{"MazeBlock":false},"12,6":{"MazeBlock":false},"13,6":{"MazeBlock":false},"14,6":{"MazeBlock":false},"14,4":{"MazeBlock":false},"14,3":{"MazeBlock":false},"14,2":{"MazeBlock":false},"14,1":{"MazeBlock":false},"14,0":{"MazeBlock":false},"8,0":{"MazeBlock":true},"8,1":{"MazeBlock":false},"8,2":{"MazeBlock":false},"8,3":{"MazeBlock":false},"10,4":{"MazeBlock":true},"11,4":{"MazeBlock":true},"12,3":{"MazeBlock":false},"12,2":{"MazeBlock":false},"12,1":{"MazeBlock":false},"12,0":{"MazeBlock":true},"10,5":{},"10,7":{"MazeBlock":true},"10,6":{"MazeSeed":{"newest":0.25,"oldest":0.25,"scale":2,"branchchance":0.04,"hbias":0.5}},"8,10":{"MazeBlock":false},"9,12":{"Type":"Charger","Priority":true},"11,12":{"Type":"Charger","Priority":true},"17,13":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"MazeBlock":true},"17,14":{"Type":"BondageMachine","Binding":"Metal"},"17,15":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,16":{"Type":"BondageMachine","Binding":"Metal"},"17,17":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,18":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,9":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,10":{"Type":"BondageMachine","Binding":"Metal"},"17,11":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,12":{"Type":"BondageMachine","Binding":"Metal","MazeBlock":true},"17,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"13,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"MazeBlock":true},"14,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"15,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"16,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"10,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"MazeBlock":true},"11,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"MazeBlock":true},"12,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"MazeBlock":true},"9,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"MazeBlock":true},"8,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"MazeBlock":true},"7,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"MazeBlock":true},"6,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"5,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"4,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"3,9":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,10":{"Type":"BondageMachine","Binding":"Metal"},"3,8":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"17,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"16,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"15,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"14,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"13,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"MazeBlock":true},"10,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"MazeBlock":true},"11,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"MazeBlock":true},"12,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"MazeBlock":true},"9,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"MazeBlock":true},"8,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"MazeBlock":true},"7,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"MazeBlock":true},"6,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"5,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"4,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"3,11":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,12":{"Type":"BondageMachine","Binding":"Metal"},"3,13":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1,"MazeBlock":true},"3,14":{"Type":"BondageMachine","Binding":"Metal"},"3,15":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,16":{"Type":"BondageMachine","Binding":"Metal"},"3,17":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,18":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"3,19":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"2,13":{"MazeBlock":true},"1,13":{"MazeBlock":true},"0,13":{"MazeBlock":true},"4,13":{"MazeBlock":true},"5,13":{"MazeBlock":true},"6,13":{"MazeBlock":true},"20,13":{"MazeBlock":true},"19,13":{"MazeBlock":true},"18,13":{"MazeBlock":true},"16,13":{"MazeBlock":true},"15,13":{"MazeBlock":true},"14,13":{"MazeBlock":true},"7,5":{"MazeBlock":false},"13,5":{"MazeBlock":false},"9,4":{"MazeBlock":true},"7,1":{"MazeBlock":true},"7,2":{"MazeBlock":true},"7,3":{"MazeBlock":true},"13,4":{"MazeBlock":true},"12,4":{"MazeBlock":true},"8,4":{"MazeBlock":true},"7,4":{"MazeBlock":true},"14,12":{"MazeBlock":true},"15,12":{"MazeBlock":true},"16,12":{"MazeBlock":true},"18,12":{"MazeBlock":true},"19,12":{"MazeBlock":true},"20,12":{"MazeBlock":true},"6,12":{"MazeBlock":true},"5,12":{"MazeBlock":true},"4,12":{"MazeBlock":true},"2,12":{"MazeBlock":true},"1,12":{"MazeBlock":true},"0,12":{"MazeBlock":true},"7,7":{"MazeBlock":true},"8,7":{"MazeBlock":true},"9,7":{"MazeBlock":true},"11,7":{"MazeBlock":true},"12,7":{"MazeBlock":true},"13,7":{"MazeBlock":true},"13,1":{"MazeBlock":true},"13,2":{"MazeBlock":true},"13,3":{"MazeBlock":true},"9,24":{"MazeBlock":true},"10,24":{"MazeBlock":true},"11,24":{"MazeBlock":true},"11,1":{"Type":"Chest","Loot":"robot","Faction":"AncientRobot","NoTrap":"true","Priority":"true"}},"effectTiles":{"11,13":{"MotionLamp":{"x":11,"y":13,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"9,13":{"MotionLamp":{"x":9,"y":13,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"2,2":{"MotionLamp":{"x":2,"y":2,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"18,2":{"MotionLamp":{"x":18,"y":2,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"2,6":{"MotionLamp":{"x":2,"y":6,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"18,6":{"MotionLamp":{"x":18,"y":6,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"6,2":{"MotionLamp":{"x":6,"y":2,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"15,6":{"MotionLamp":{"x":15,"y":6,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"6,6":{"MotionLamp":{"x":6,"y":6,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"15,2":{"MotionLamp":{"x":15,"y":2,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"15,11":{"MotionLamp":{"x":15,"y":11,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"15,14":{"MotionLamp":{"x":15,"y":14,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"15,22":{"MotionLamp":{"x":15,"y":22,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"5,22":{"MotionLamp":{"x":5,"y":22,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"6,14":{"MotionLamp":{"x":6,"y":14,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"6,11":{"MotionLamp":{"x":6,"y":11,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"2,22":{"MotionLamp":{"x":2,"y":22,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"18,22":{"MotionLamp":{"x":18,"y":22,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}}},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"GoldVault":{"name":"GoldVault","w":3,"h":3,"primInd":"dr","index":{"1,1":"dr","1,2":"udr","1,3":"ur","2,1":"dlr","2,2":"udlr","2,3":"udlr","3,1":"dl","3,2":"udl","3,3":"ul"},"flexEdge":{"2,2":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":1,"grid":"131313131CCCCC1313131\n111111111000001111111\n111111131000001311111\n111111111=G0G=1111111\n111111111111111111111\n111111111111111111111\n111111111111111111111\n111111111111111111111\n111111111111111111111\n111111111111111111111\n131311131111131313131\n111111111111111111111\n111111111111111111111\n111111111111111111111\n111111111101111111111\n111111111101111111111\n11111111X000X11111111\n11111111=000=11111111\nXGXGXGXGXL0LXGXGXGXGX\n000000000000000000000\n000000000000000000000\n","POI":[],"Keyring":[],"Jail":[{"x":9,"y":18,"type":"furniture","radius":1},{"x":11,"y":18,"type":"furniture","radius":1}],"Tiles":{"1,18":{"Type":"Prisoner"},"3,18":{"Type":"Prisoner"},"5,18":{"Type":"Prisoner"},"7,18":{"Type":"Prisoner"},"13,18":{"Type":"Prisoner"},"15,18":{"Type":"Prisoner"},"17,18":{"Type":"Prisoner"},"19,18":{"Type":"Prisoner"},"9,18":{"Type":"DisplayStand","Furniture":"DisplayStand"},"11,18":{"Type":"DisplayStand","Furniture":"DisplayStand"},"8,17":{"Type":"Charger","Priority":true},"12,17":{"Type":"Charger","Priority":true},"20,16":{"MazeBlock":true},"19,16":{"MazeBlock":true},"18,16":{"MazeBlock":true},"17,16":{"MazeBlock":true},"16,16":{"MazeBlock":true},"15,16":{"MazeBlock":true},"14,16":{"MazeBlock":true},"13,16":{"MazeBlock":true},"8,16":{"MazeBlock":true},"9,16":{"MazeBlock":true},"10,16":{"MazeBlock":true},"12,16":{"MazeBlock":true},"11,16":{"MazeBlock":true},"6,16":{"MazeBlock":true},"7,16":{"MazeBlock":true},"5,16":{"MazeBlock":true},"4,16":{"MazeBlock":true},"3,16":{"MazeBlock":true},"1,16":{"MazeBlock":true},"2,16":{"MazeBlock":true},"0,16":{"MazeBlock":true},"8,0":{"MazeBlock":true},"8,1":{"MazeBlock":true},"8,2":{"MazeBlock":false},"8,3":{"MazeBlock":true},"14,3":{"MazeBlock":true},"14,2":{"MazeBlock":false},"14,1":{"MazeBlock":true},"14,0":{"MazeBlock":true},"12,3":{"Type":"Prisoner"},"10,3":{"Type":"Prisoner"},"9,3":{"Type":"Charger","Priority":true},"13,3":{"Type":"Charger","Priority":true},"9,0":{"Type":"Chest","Loot":"gold","Faction":"AncientRobot","NoTrap":"true","Priority":"true"},"10,0":{"Type":"Chest","Loot":"gold","Faction":"AncientRobot","NoTrap":"true","Priority":"true"},"11,0":{"Type":"Chest","Loot":"gold","Faction":"AncientRobot","NoTrap":"true","Priority":"true"},"12,0":{"Type":"Chest","Loot":"gold","Faction":"AncientRobot","NoTrap":"true","Priority":"true"},"13,0":{"Type":"Chest","Loot":"gold","Faction":"AncientRobot","NoTrap":"true","Priority":"true"},"5,10":{"MazeSeed":{"newest":0.3,"oldest":0.3,"scale":1,"branchchance":0.04,"hbias":0.2,"pillarToDoodad":"true"}},"9,4":{"MazeBlock":true},"10,4":{"MazeBlock":true},"11,4":{"MazeBlock":true},"12,4":{"MazeBlock":true},"13,4":{"MazeBlock":true},"1,10":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"3,10":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"7,10":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"5,0":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"7,0":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"7,2":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"3,0":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"1,0":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"15,0":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"15,2":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"17,0":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"19,0":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"13,10":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"15,10":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"17,10":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4},"19,10":{"Type":"ForceSpawn","required":["guardian"],"Label":"guardian","tags":["robot"],"filterTags":["turret"],"Chance":0.5,"AI":"looseguard","force":"true","faction":"Enemy","levelBoost":4}},"effectTiles":{"14,19":{"Torch":{"x":14,"y":19,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"12,19":{"Torch":{"x":12,"y":19,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"8,19":{"Torch":{"x":8,"y":19,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"6,19":{"Torch":{"x":6,"y":19,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"0,19":{"Torch":{"x":0,"y":19,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"2,19":{"Torch":{"x":2,"y":19,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"4,19":{"Torch":{"x":4,"y":19,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"16,19":{"Torch":{"x":16,"y":19,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"18,19":{"Torch":{"x":18,"y":19,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"20,19":{"Torch":{"x":20,"y":19,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}}},"Skin":{},"inaccessible":[],"tags":["temple"],"forbidTags":[],"requireTags":["temple"],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"DollRoom":{"name":"DollRoom","Labels":{"null":[],"Patrol":[{"name":"Patrol","type":"Patrol","assigned":-1,"x":24,"y":12,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":20,"y":12,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":37,"y":12,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":33,"y":12,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":52,"y":14,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":21,"y":22,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":16,"y":22,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":16,"y":16,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":16,"y":12,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":16,"y":7,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":21,"y":3,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":32,"y":3,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":34,"y":3,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":44,"y":12,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":36,"y":16,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":5,"y":24,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":9,"y":13,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":7,"y":7,"guard":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":11,"y":2,"guard":true,"interesting":true},{"name":"Patrol","type":"Patrol","assigned":-1,"x":6,"y":2,"guard":true,"interesting":true}],"Training":[{"name":"Training","type":"Training","assigned":-1,"x":49,"y":5}],"TrainingDoor":[{"name":"TrainingDoor","type":"TrainingDoor","assigned":-1,"x":49,"y":10}],"TrainiIntrogDoor":[],"Intro":[{"name":"Intro","type":"Intro","assigned":-1,"x":30,"y":19}],"Deploy":[{"name":"Deploy","type":"Deploy","assigned":-1,"x":16,"y":12,"interesting":true},{"name":"Deploy","type":"Deploy","assigned":-1,"x":24,"y":12,"interesting":true},{"name":"Deploy","type":"Deploy","assigned":-1,"x":33,"y":12,"interesting":true},{"name":"Deploy","type":"Deploy","assigned":-1,"x":30,"y":19,"interesting":true},{"name":"Deploy","type":"Deploy","assigned":-1,"x":52,"y":14,"guard":true,"interesting":true},{"name":"Deploy","type":"Deploy","assigned":-1,"x":37,"y":12,"guard":true,"interesting":true}]},"w":8,"h":4,"primInd":"dr","index":{"1,1":"dr","1,2":"udr","1,3":"udr","1,4":"ur","2,1":"dlr","2,2":"udlr","2,3":"udlr","2,4":"ulr","3,1":"dlr","3,2":"udlr","3,3":"udlr","3,4":"ulr","4,1":"dlr","4,2":"udlr","4,3":"udlr","4,4":"ulr","5,1":"dlr","5,2":"udlr","5,3":"udlr","5,4":"ulr","6,1":"dlr","6,2":"udlr","6,3":"udlr","6,4":"ulr","7,1":"dlr","7,2":"udlr","7,3":"udlr","7,4":"ulr","8,1":"dl","8,2":"udl","8,3":"udl","8,4":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"industrial","weight":-1000,"grid":"11111111111111111111111111111111111111111111111111111111\n11111=00=00=00=111t1111111111111111u11111111122222222211\n111110000000000000V00000b2002000010V01111111120000000211\n111110L1L0L1L00000v000001bb1Z1X0010v010gg0g0120222220211\n111110L1L0L1L000=0V0000002002b00010V01g11g1g120200020211\n111110L1L0L1L00000N011g111111110010N01g11g10020202020211\n111110L1L0L1L00000V0110111111110000V00011011120200020211\n1111=0000000000000v011g11=u@=110000V01111g11120222220211\n1111=0000000000000V011g112V02111110N01111g11120000000211\n111110L1L0L1L00000N011g11XV0X111110V01111g11122222222211\n100110L1L0L1L000=0V0=LLL02V02X111X0V0X111g111111X0X11111\n100110L1L0L1L00000v0000002V020bFC00V00000000000000000011\n100b00L1L0L1L00000v0000002v020Z0000v00000000000000000011\n100D00000000000000v00LLL02V02010000V00000000000000000011\n100b000000000000=0V0=LLL02V0=X1D1X0V0X111111111110000011\n101110L1L0L1L00000N011g112V01110110V01111111111110000011\n101110L1L0L1L00000V0110112V01110110N01110gggg0g010000011\n1g1110L1L0L1L00000v011g112V01110110V0111g1111g1g10V00011\n1g1110L1L0L1L00000v0X1g112VvV222110v0111g1111g1000N10111\n1g11=0000000000000V011g112000000110V010g01111g1111V1Z111\n1g11=00000000000=0N011g112VNVNV0110N01g111111g1111Nb5111\n1g1110L1L0L1L00000V0000112VNVNV5110V000111111g1111VbV111\n1g1110L1L0L1L00000v000011111111111XtX00111111g1111NbV111\n122210L1L0L1L00000V00001111111111111111111111g1111VbV111\n111g10L1L0L1L00111u10000Z5VVNVNVNVNVNVVNVNVNVVNVNVVbV111\n1110000000000001111100011bbbbbbbbbbbbbbbbbbbbbbbbbb1V111\n11111=00=00=00=11111000VVNVNVNVVNVNVNVVNVNVNVVNVNVNVVVu1\n11111111111111111111111111111111111111111111111111111011\n","POI":[],"Keyring":[],"Jail":[{"x":20,"y":10,"type":"furniture","radius":1},{"x":20,"y":14,"type":"furniture","radius":1},{"x":21,"y":10,"type":"furniture","radius":1},{"x":23,"y":10,"type":"furniture","radius":1},{"x":12,"y":21,"type":"storage","radius":1},{"x":12,"y":22,"type":"storage","radius":1},{"x":12,"y":23,"type":"storage","radius":1},{"x":12,"y":24,"type":"storage","radius":1},{"x":10,"y":24,"type":"storage","radius":1},{"x":10,"y":23,"type":"storage","radius":1},{"x":10,"y":22,"type":"storage","radius":1},{"x":8,"y":21,"type":"storage","radius":1},{"x":8,"y":22,"type":"storage","radius":1},{"x":8,"y":23,"type":"storage","radius":1},{"x":8,"y":24,"type":"storage","radius":1},{"x":6,"y":24,"type":"storage","radius":1},{"x":6,"y":23,"type":"storage","radius":1},{"x":6,"y":22,"type":"storage","radius":1},{"x":6,"y":21,"type":"storage","radius":1},{"x":8,"y":18,"type":"storage","radius":1},{"x":8,"y":17,"type":"storage","radius":1},{"x":8,"y":16,"type":"storage","radius":1},{"x":8,"y":15,"type":"storage","radius":1},{"x":10,"y":15,"type":"storage","radius":1},{"x":10,"y":16,"type":"storage","radius":1},{"x":10,"y":17,"type":"storage","radius":1},{"x":10,"y":18,"type":"storage","radius":1},{"x":12,"y":18,"type":"storage","radius":1},{"x":12,"y":17,"type":"storage","radius":1},{"x":12,"y":16,"type":"storage","radius":1},{"x":12,"y":15,"type":"storage","radius":1},{"x":6,"y":15,"type":"storage","radius":1},{"x":6,"y":16,"type":"storage","radius":1},{"x":6,"y":17,"type":"storage","radius":1},{"x":6,"y":18,"type":"storage","radius":1},{"x":6,"y":9,"type":"storage","radius":1},{"x":6,"y":10,"type":"storage","radius":1},{"x":6,"y":11,"type":"storage","radius":1},{"x":6,"y":12,"type":"storage","radius":1},{"x":8,"y":12,"type":"storage","radius":1},{"x":8,"y":11,"type":"storage","radius":1},{"x":8,"y":10,"type":"storage","radius":1},{"x":8,"y":9,"type":"storage","radius":1},{"x":10,"y":9,"type":"storage","radius":1},{"x":10,"y":10,"type":"storage","radius":1},{"x":10,"y":11,"type":"storage","radius":1},{"x":10,"y":12,"type":"storage","radius":1},{"x":12,"y":3,"type":"storage","radius":1},{"x":12,"y":4,"type":"storage","radius":1},{"x":12,"y":5,"type":"storage","radius":1},{"x":12,"y":6,"type":"storage","radius":1},{"x":10,"y":6,"type":"storage","radius":1},{"x":10,"y":5,"type":"storage","radius":1},{"x":10,"y":4,"type":"storage","radius":1},{"x":10,"y":3,"type":"storage","radius":1},{"x":8,"y":3,"type":"storage","radius":1},{"x":8,"y":4,"type":"storage","radius":1},{"x":8,"y":5,"type":"storage","radius":1},{"x":8,"y":6,"type":"storage","radius":1},{"x":6,"y":6,"type":"storage","radius":1},{"x":6,"y":5,"type":"storage","radius":1},{"x":6,"y":4,"type":"storage","radius":1},{"x":6,"y":3,"type":"storage","radius":1},{"x":12,"y":9,"type":"storage","radius":1},{"x":12,"y":10,"type":"storage","radius":1},{"x":12,"y":11,"type":"storage","radius":1},{"x":12,"y":12,"type":"storage","radius":1},{"x":10,"y":21,"type":"storage","radius":1},{"x":6,"y":3,"type":"storage","radius":1},{"x":6,"y":4,"type":"storage","radius":1},{"x":6,"y":5,"type":"storage","radius":1},{"x":6,"y":6,"type":"storage","radius":1},{"x":8,"y":6,"type":"storage","radius":1},{"x":8,"y":5,"type":"storage","radius":1},{"x":8,"y":4,"type":"storage","radius":1},{"x":8,"y":3,"type":"storage","radius":1},{"x":10,"y":3,"type":"storage","radius":1},{"x":10,"y":4,"type":"storage","radius":1},{"x":10,"y":5,"type":"storage","radius":1},{"x":10,"y":6,"type":"storage","radius":1},{"x":12,"y":6,"type":"storage","radius":1},{"x":12,"y":5,"type":"storage","radius":1},{"x":12,"y":4,"type":"storage","radius":1},{"x":12,"y":3,"type":"storage","radius":1},{"x":12,"y":9,"type":"storage","radius":1},{"x":12,"y":10,"type":"storage","radius":1},{"x":12,"y":11,"type":"storage","radius":1},{"x":12,"y":12,"type":"storage","radius":1},{"x":10,"y":9,"type":"storage","radius":1},{"x":10,"y":10,"type":"storage","radius":1},{"x":10,"y":11,"type":"storage","radius":1},{"x":10,"y":12,"type":"storage","radius":1},{"x":8,"y":9,"type":"storage","radius":1},{"x":8,"y":10,"type":"storage","radius":1},{"x":8,"y":11,"type":"storage","radius":1},{"x":8,"y":12,"type":"storage","radius":1},{"x":6,"y":12,"type":"storage","radius":1},{"x":6,"y":11,"type":"storage","radius":1},{"x":6,"y":10,"type":"storage","radius":1},{"x":6,"y":9,"type":"storage","radius":1},{"x":6,"y":15,"type":"storage","radius":1},{"x":6,"y":16,"type":"storage","radius":1},{"x":6,"y":17,"type":"storage","radius":1},{"x":6,"y":18,"type":"storage","radius":1},{"x":8,"y":18,"type":"storage","radius":1},{"x":8,"y":17,"type":"storage","radius":1},{"x":8,"y":16,"type":"storage","radius":1},{"x":8,"y":15,"type":"storage","radius":1},{"x":10,"y":16,"type":"storage","radius":1},{"x":10,"y":17,"type":"storage","radius":1},{"x":10,"y":18,"type":"storage","radius":1},{"x":12,"y":17,"type":"storage","radius":1},{"x":12,"y":16,"type":"storage","radius":1},{"x":12,"y":15,"type":"storage","radius":1},{"x":10,"y":15,"type":"storage","radius":1},{"x":12,"y":18,"type":"storage","radius":1},{"x":12,"y":24,"type":"storage","radius":1},{"x":12,"y":23,"type":"storage","radius":1},{"x":12,"y":22,"type":"storage","radius":1},{"x":12,"y":21,"type":"storage","radius":1},{"x":10,"y":21,"type":"storage","radius":1},{"x":10,"y":22,"type":"storage","radius":1},{"x":10,"y":23,"type":"storage","radius":1},{"x":10,"y":24,"type":"storage","radius":1},{"x":8,"y":24,"type":"storage","radius":1},{"x":8,"y":23,"type":"storage","radius":1},{"x":8,"y":22,"type":"storage","radius":1},{"x":8,"y":21,"type":"storage","radius":1},{"x":6,"y":21,"type":"storage","radius":1},{"x":6,"y":22,"type":"storage","radius":1},{"x":6,"y":23,"type":"storage","radius":1},{"x":6,"y":24,"type":"storage","radius":1}],"Tiles":{"18,1":{"Type":"DollTerminal"},"35,1":{"Type":"DollSupply"},"18,24":{"Type":"DollSupply"},"35,2":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"35,3":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"35,4":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"35,5":{"Type":"BondageMachine","Binding":"Plug"},"35,6":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"35,7":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"35,8":{"Type":"BondageMachine","Binding":"Chastity"},"35,9":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"35,10":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"35,11":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"35,13":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"35,14":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"35,15":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"35,16":{"Type":"BondageMachine","Binding":"Tape"},"35,18":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"35,19":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"35,20":{"Type":"BondageMachine","Binding":"Tape"},"35,21":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"18,23":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"18,22":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"18,20":{"Type":"BondageMachine","Binding":"Latex"},"18,19":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"18,18":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"18,17":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"18,16":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"18,15":{"Type":"BondageMachine","Binding":"Latex"},"18,14":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"18,13":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"18,12":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"18,11":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"18,2":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"18,5":{"Type":"BondageMachine","Binding":"Latex"},"18,6":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"18,7":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"18,8":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"18,9":{"Type":"BondageMachine","Binding":"Latex"},"18,10":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"18,4":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"18,3":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyUp","DX":0,"DY":-1},"35,12":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1},"35,22":{"Type":"DollTerminal"},"18,21":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"26,8":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true},"26,9":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true},"26,10":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true},"26,11":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true},"21,14":{"Type":"Barrel"},"23,14":{"Type":"Barrel"},"20,10":{"Type":"Charger","Priority":true},"20,14":{"Type":"Charger","Priority":true},"21,13":{"Type":"Barrel"},"22,13":{"Type":"Barrel"},"23,13":{"Type":"Barrel"},"31,11":{"Type":"Table","Food":"Plate"},"32,11":{"Type":"Chest","Loot":"storage","Chance":0.8},"28,3":{"Type":"AutoDoor","wireType":"AutoDoor_HoldOpen","Label":"HoldOpen"},"25,7":{"Type":"Charger","Priority":true},"28,7":{"Type":"Charger","Priority":true},"28,14":{"Type":"Charger","Priority":true},"26,12":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyDown","DX":0,"DY":1,"Jail":true},"26,14":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true},"26,15":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true},"26,13":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true},"26,16":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true},"26,7":{"Type":"DollSupply","count":0,"wireType":"increment","rate":3},"16,14":{"Type":"Charger","Priority":true},"16,10":{"Type":"Charger","Priority":true},"16,4":{"Type":"Charger","Priority":true},"16,20":{"Type":"Charger","Priority":true},"35,17":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"52,19":{"Type":"AutoDoor","wireType":"AutoDoor_HoldOpen","Label":"HoldOpen","Jail":true},"24,24":{"Type":"AutoDoor","wireType":"AutoDoor_HoldOpen","Label":"HoldOpen","Jail":true,"NW":true},"23,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"24,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"25,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"26,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"27,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"28,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"31,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"30,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"29,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"32,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"33,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"36,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"39,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"42,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"45,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"48,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"51,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"49,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"46,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"43,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"40,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"37,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"34,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"38,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"41,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"44,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"47,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"50,26":{"Type":"BondageMachine","Binding":"Doll","NW":true},"53,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"35,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"NW":true},"54,26":{"Type":"DollSupply","count":0,"wireType":"increment","rate":3},"52,20":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoffD","direction":{"x":0,"y":1},"Jail":true,"NW":true},"52,21":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true,"NW":true},"52,22":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true,"NW":true},"52,23":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true,"NW":true},"52,24":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true,"NW":true},"52,25":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true,"NW":true},"50,18":{"Type":"BondageMachine","Binding":"Doll","NW":true},"50,19":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1,"NW":true},"50,20":{"Type":"BondageMachine","Binding":"Doll","NW":true},"50,21":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1,"NW":true},"50,22":{"Type":"BondageMachine","Binding":"Doll","NW":true},"50,23":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1,"NW":true},"50,24":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1,"NW":true},"49,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"NW":true},"46,24":{"Type":"BondageMachine","Binding":"Doll","NW":true},"43,24":{"Type":"BondageMachine","Binding":"Doll","NW":true},"40,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"NW":true},"37,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"NW":true},"34,24":{"Type":"BondageMachine","Binding":"Chastity","NW":true},"31,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"NW":true},"28,24":{"Type":"BondageMachine","Binding":"Plug","Jail":true,"NW":true},"25,24":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoffR","direction":{"x":1,"y":0},"Jail":true,"NW":true},"26,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"Jail":true,"NW":true},"29,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"Jail":true,"NW":true},"32,24":{"Type":"BondageMachine","Binding":"Plug","NW":true},"35,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"NW":true},"38,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"NW":true},"41,24":{"Type":"BondageMachine","Binding":"Doll","NW":true},"44,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"NW":true},"47,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"NW":true},"48,24":{"Type":"BondageMachine","Binding":"Doll","NW":true},"45,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"NW":true},"42,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"NW":true},"39,24":{"Type":"BondageMachine","Binding":"Doll","NW":true},"36,24":{"Type":"BondageMachine","Binding":"Chastity","NW":true},"33,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"NW":true},"30,24":{"Type":"BondageMachine","Binding":"Plug","NW":true},"27,24":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"Jail":true,"NW":true},"50,17":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1,"Jail":true},"52,26":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"Jail":true,"NW":true},"5,1":{"Type":"Charger","Priority":true},"8,1":{"Type":"Charger","Priority":true},"11,1":{"Type":"Charger","Priority":true},"14,1":{"Type":"Charger","Priority":true},"5,26":{"Type":"Charger","Priority":true},"8,26":{"Type":"Charger","Priority":true},"11,26":{"Type":"Charger","Priority":true},"14,26":{"Type":"Charger","Priority":true},"4,20":{"Type":"Charger","Priority":true},"4,19":{"Type":"Charger","Priority":true},"4,7":{"Type":"Charger","Priority":true},"4,8":{"Type":"Charger","Priority":true},"26,17":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1,"Jail":true},"30,12":{"Type":"AutoDoor","wireType":"AutoDoor_HoldOpen","Label":"HoldOpen","Jail":false},"22,15":{"OL":true,"Jail":false,"NW":true},"22,16":{"OL":true,"NW":true},"22,17":{"OL":true,"NW":true},"22,18":{"OL":true,"NW":true},"22,19":{"OL":true,"NW":true},"22,20":{"OL":true,"NW":true},"22,9":{"OL":true,"NW":true},"22,8":{"OL":true,"NW":true},"22,7":{"OL":true,"NW":true},"22,6":{"OL":true,"NW":true},"22,5":{"OL":true,"NW":true},"38,3":{"OL":true,"NW":true},"38,4":{"OL":true,"NW":true},"38,5":{"OL":true,"NW":true},"39,3":{"OL":true,"NW":true},"40,3":{"OL":true,"NW":true},"41,3":{"OL":true,"NW":true},"41,4":{"OL":true,"NW":true},"41,5":{"OL":true,"NW":true},"41,7":{"OL":true,"NW":true},"41,6":{"OL":true,"NW":true},"41,8":{"OL":true,"NW":true},"41,9":{"OL":true,"NW":true},"41,10":{"OL":true,"NW":true},"43,5":{"OL":true,"NW":true},"44,5":{"OL":true,"NW":true},"43,4":{"OL":true,"NW":true},"43,3":{"OL":true,"NW":true},"42,3":{"OL":true,"NW":true},"40,16":{"OL":true,"NW":true},"40,17":{"OL":true,"NW":true},"40,18":{"OL":true,"NW":true},"40,19":{"OL":true,"NW":true},"39,19":{"OL":true,"NW":true},"38,19":{"OL":true,"NW":true},"38,20":{"OL":true,"NW":true},"41,16":{"OL":true,"NW":true},"42,16":{"OL":true,"NW":true},"43,16":{"OL":true,"NW":true},"44,16":{"OL":true,"NW":true},"45,16":{"OL":true,"NW":true},"46,16":{"OL":true,"NW":true},"47,16":{"OL":true,"NW":true},"47,17":{"OL":true,"NW":true},"45,17":{"OL":true,"NW":true},"45,18":{"OL":true,"NW":true},"45,19":{"OL":true,"NW":true},"45,20":{"OL":true,"NW":true},"45,22":{"OL":true,"NW":true},"45,23":{"OL":true,"NW":true},"45,21":{"OL":true,"NW":true},"1,17":{"OL":true,"NW":true},"1,18":{"OL":true,"NW":true},"1,19":{"OL":true,"NW":true},"1,20":{"OL":true,"NW":true},"1,21":{"OL":true,"NW":true},"1,22":{"OL":true,"NW":true},"1,23":{"OL":true,"NW":true},"2,23":{"OL":true,"NW":true},"3,23":{"OL":true,"NW":true},"3,24":{"OL":true,"NW":true},"3,25":{"OL":true,"NW":true},"4,25":{"OL":true},"1,15":{"OL":true,"NW":true},"1,16":{"OL":true,"NW":true},"31,13":{"Jail":true},"31,15":{"Jail":true},"31,16":{"Jail":true},"31,17":{"Jail":true},"28,18":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"Jail":true},"29,18":{"Jail":true},"30,18":{"Jail":true},"31,18":{"Jail":true},"31,19":{"Jail":true},"30,20":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"Jail":true},"29,20":{"Type":"BondageMachine","Binding":"Doll","Jail":true},"28,20":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"Jail":true},"27,20":{"Type":"BondageMachine","Binding":"Doll","Jail":true},"26,20":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"Jail":true},"28,19":{"Jail":true},"29,19":{"Jail":true},"30,19":{"Jail":true},"27,15":{"Jail":false},"27,16":{"Jail":false},"27,17":{"Jail":false},"45,1":{"Jail":true,"NW":true},"46,1":{"Jail":true,"OL":true,"NW":true},"47,1":{"Jail":true,"OL":true,"NW":true},"48,1":{"Jail":true,"OL":true,"NW":true},"49,1":{"Jail":true,"OL":true,"NW":true},"50,1":{"Jail":true,"OL":true,"NW":true},"51,1":{"Jail":true,"OL":true,"NW":true},"52,1":{"Jail":true,"OL":true,"NW":true},"53,1":{"Jail":true,"OL":true,"NW":true},"53,2":{"Jail":true,"OL":true,"NW":true},"52,2":{"Jail":true,"OL":true,"NW":true},"51,2":{"Jail":true,"OL":true,"NW":true},"50,2":{"Jail":true,"OL":true,"NW":true},"49,2":{"Jail":true,"OL":true,"NW":true},"48,2":{"Jail":true,"OL":true,"NW":true},"47,2":{"Jail":true,"OL":true,"NW":true},"46,2":{"Jail":true,"OL":true,"NW":true},"45,2":{"Jail":true,"OL":true,"NW":true},"45,3":{"Jail":true,"OL":true,"NW":true},"46,3":{"Jail":true,"OL":true,"NW":true},"47,3":{"Jail":true,"OL":true,"NW":true},"48,3":{"Jail":true,"OL":true,"NW":true},"49,3":{"Jail":true,"OL":true,"NW":true},"50,3":{"Jail":true,"OL":true,"NW":true},"51,3":{"Jail":true,"OL":true,"NW":true},"52,3":{"Jail":true,"OL":true,"NW":true},"53,3":{"Jail":true,"OL":true,"NW":true},"53,4":{"Jail":true,"OL":true,"NW":true},"52,4":{"Jail":true,"OL":true,"NW":true},"51,4":{"Jail":true,"OL":true,"NW":true},"50,4":{"Jail":true,"OL":true,"NW":true},"49,4":{"Jail":true,"OL":true,"NW":true},"48,4":{"Jail":true,"OL":true,"NW":true},"47,4":{"Jail":true,"OL":true},"46,4":{"Jail":true,"OL":true},"45,4":{"Jail":true,"OL":true,"NW":true},"45,5":{"Jail":true,"OL":true,"NW":true},"46,5":{"Jail":true,"OL":true,"NW":true},"47,5":{"Jail":true,"OL":true,"NW":true},"48,5":{"Jail":true,"OL":true,"NW":true},"49,5":{"Jail":true,"OL":true,"NW":true},"50,5":{"Jail":true,"OL":true,"NW":true},"51,5":{"Jail":true,"OL":true,"NW":true},"52,5":{"Jail":true,"OL":true,"NW":true},"53,5":{"Jail":true,"OL":true,"NW":true},"53,6":{"Jail":true,"OL":true,"NW":true},"53,7":{"Jail":true,"OL":true,"NW":true},"53,8":{"Jail":true,"OL":true,"NW":true},"53,9":{"Jail":true,"OL":true,"NW":true},"52,9":{"Jail":true,"OL":true,"NW":true},"51,9":{"Jail":true,"OL":true,"NW":true},"50,9":{"Jail":true,"OL":true,"NW":true},"49,9":{"Jail":true,"OL":true,"NW":true},"48,9":{"Jail":true,"OL":true,"NW":true},"47,9":{"Jail":true,"OL":true,"NW":true},"46,9":{"Jail":true,"OL":true,"NW":true},"45,9":{"Jail":true,"OL":true,"NW":true},"45,8":{"Jail":true,"OL":true,"NW":true},"45,7":{"Jail":true,"OL":true,"NW":true},"45,6":{"Jail":true,"OL":true,"NW":true},"50,6":{"Jail":true,"OL":true,"NW":true},"51,6":{"Jail":true,"OL":true,"NW":true},"52,6":{"Jail":true,"OL":true,"NW":true},"52,7":{"Jail":true,"OL":true,"NW":true},"51,7":{"Jail":true,"OL":true,"NW":true},"50,7":{"Jail":true,"OL":true,"NW":true},"49,7":{"Jail":true,"OL":true,"NW":true},"49,6":{"Jail":true,"OL":true,"NW":true},"48,6":{"Jail":true,"OL":true,"NW":true},"47,6":{"Jail":true,"OL":true,"NW":true},"46,6":{"Jail":true,"OL":true,"NW":true},"46,7":{"Jail":true,"OL":true,"NW":true},"46,8":{"Jail":true,"OL":true,"NW":true},"47,8":{"Jail":true,"OL":true,"NW":true},"48,8":{"Jail":true,"OL":true,"NW":true},"49,8":{"Jail":true,"OL":true,"NW":true},"50,8":{"Jail":true,"OL":true,"NW":true},"51,8":{"Jail":true,"OL":true,"NW":true},"52,8":{"Jail":true,"OL":true,"NW":true},"48,7":{"Jail":true,"OL":true,"NW":true},"47,7":{"Jail":true,"OL":true,"NW":true},"49,11":{"Jail":true},"49,12":{"Jail":true},"49,10":{"Jail":true,"OL":true,"NW":true},"46,12":{"Jail":true},"46,13":{"Jail":true},"47,13":{"Jail":true},"47,12":{"Jail":true},"46,11":{"Jail":true},"47,11":{"Jail":true},"48,11":{"Jail":true},"50,11":{"Jail":true},"51,11":{"Jail":true},"52,11":{"Jail":true},"52,12":{"Jail":true},"53,12":{"Jail":true},"53,13":{"Jail":true},"53,11":{"Jail":true},"51,12":{"Jail":true},"50,12":{"Jail":true},"48,12":{"Jail":true},"48,13":{"Jail":true},"49,13":{"Jail":true},"50,13":{"Jail":true},"51,13":{"Jail":true},"52,13":{"Jail":true},"52,18":{"Jail":true},"52,17":{"Jail":true},"52,16":{"Jail":true},"52,15":{"Jail":true},"52,14":{"Jail":true},"50,14":{"Jail":true},"50,15":{"Jail":true},"50,16":{"Jail":true},"49,16":{"Jail":true},"49,15":{"Jail":true},"49,14":{"Jail":true},"51,14":{"Jail":true},"51,15":{"Jail":true},"51,16":{"Jail":true},"53,16":{"Jail":true},"53,15":{"Jail":true},"53,14":{"Jail":true},"53,17":{"Jail":true},"51,17":{"Jail":true},"49,17":{"Jail":true},"23,24":{"Jail":true,"NW":true},"22,23":{"Jail":false},"21,23":{"Jail":false},"21,24":{"Jail":false},"22,24":{"Jail":false},"22,25":{"Jail":false},"21,25":{"Jail":false},"31,21":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoffL","direction":{"x":-1,"y":0},"Jail":true},"29,21":{"Type":"BondageMachine","Binding":"Doll","Jail":true},"27,21":{"Type":"BondageMachine","Binding":"Doll","Jail":true},"26,19":{"Jail":true},"27,19":{"Jail":true},"26,18":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"Jail":true},"27,18":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyRight","DX":1,"DY":0,"Jail":true},"31,20":{"Jail":true},"30,21":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"Jail":true},"26,21":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1,"Jail":true},"31,14":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Cyber","DoorSkin":"Doors/Cyber","Jail":true},"3,13":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Cyber","DoorSkin":"Doors/Cyber","Jail":true},"28,21":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0,"Jail":true},"25,21":{"Jail":true},"25,20":{"Jail":true},"25,19":{"Jail":true},"25,18":{"Jail":true},"21,10":{"Type":"Furniture","Furniture":"FutureBox"},"23,10":{"Type":"Furniture","Furniture":"FutureBox"},"22,14":{"Type":"Barrel","Always":true},"22,10":{"Type":"Barrel","Always":true},"12,21":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,22":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,23":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,24":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,24":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,23":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,22":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,21":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,22":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,23":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,24":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,24":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,23":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,22":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,21":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,18":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,17":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,16":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,15":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,15":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,16":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,17":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,18":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,18":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,17":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,16":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,15":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,15":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,16":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,17":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,18":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,9":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,10":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,11":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,12":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1}},"8,12":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,11":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,10":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,9":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,9":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,10":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,11":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,12":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,3":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,4":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,5":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,6":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,6":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,5":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,4":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,3":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,3":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,4":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,5":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"8,6":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,6":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,5":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,4":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"6,3":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,9":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,10":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,11":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"12,12":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"10,21":{"Type":"Furniture","Furniture":"FutureBox","jail":{"type":"storage","radius":1},"Jail":true},"44,6":{"OL":true},"44,7":{"OL":true},"52,10":{"OL":true},"51,10":{"OL":true},"50,10":{"OL":true},"48,10":{"OL":true},"54,8":{"OL":true},"54,6":{"OL":true,"NW":true},"54,5":{"OL":true},"54,4":{"OL":true},"54,3":{"OL":true},"54,2":{"OL":true},"54,1":{"OL":true},"38,6":{"NW":true},"37,6":{"NW":true}},"effectTiles":{"30,4":{"PressurePlateHold":{"x":30,"y":4,"name":"PressurePlateHold","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"23,3":{"Wire":{"x":23,"y":3,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"29,4":{"Wire":{"x":29,"y":4,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"28,4":{"Wire":{"x":28,"y":4,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"28,3":{"Wire":{"x":28,"y":3,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"24,3":{"Wire":{"x":24,"y":3,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"25,3":{"Wire":{"x":25,"y":3,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"26,3":{"Wire":{"x":26,"y":3,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"27,3":{"Wire":{"x":27,"y":3,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"23,2":{"PressurePlateHold":{"x":23,"y":2,"name":"PressurePlateHold","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"31,11":{"Torch":{"x":31,"y":11,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"27,7":{"Wire":{"x":27,"y":7,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"26,7":{"Wire":{"x":26,"y":7,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"52,19":{"Wire":{"x":52,"y":19,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"52,18":{"PressurePlateHold":{"x":52,"y":18,"name":"PressurePlateHold","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"24,24":{"Wire":{"x":24,"y":24,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"23,24":{"PressurePlateHold":{"x":23,"y":24,"name":"PressurePlateHold","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"30,18":{"Torch":{"x":30,"y":18,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"30,12":{"Wire":{"x":30,"y":12,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"29,12":{"Wire":{"x":29,"y":12,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"31,12":{"Wire":{"x":31,"y":12,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"32,12":{"Wire":{"x":32,"y":12,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"33,12":{"Wire":{"x":33,"y":12,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"28,12":{"Wire":{"x":28,"y":12,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"28,11":{"Wire":{"x":28,"y":11,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"33,11":{"PressurePlateHold":{"x":33,"y":11,"name":"PressurePlateHold","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"28,10":{"PressurePlateHold":{"x":28,"y":10,"name":"PressurePlateHold","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"28,18":{"Torch":{"x":28,"y":18,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}}},"Skin":{},"inaccessible":[],"tags":["industrial","dollstorage","vault"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"Summit":{"name":"Summit","Labels":{"ServantEntrance":[{"name":"ServantEntrance","type":"ServantEntrance","assigned":-1,"x":0,"y":2,"guard":true}],"LoungeEntrance":[{"name":"LoungeEntrance","type":"LoungeEntrance","assigned":-1,"x":0,"y":10,"guard":true}],"Lounge":[{"name":"Lounge","type":"Lounge","assigned":-1,"x":4,"y":16,"guard":true}]},"w":3,"h":3,"primInd":"dr","index":{"1,1":"dr","1,2":"udlr","1,3":"udlr","2,1":"dlr","2,2":"udlr","2,3":"udlr","3,1":"dl","3,2":"udlr","3,3":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":-1000,"grid":"111111111111111111111\n0L0L0L0L0L0L0L0L0L0L0\n222222222222222222222\n11,111,11222111,1,111\n1=0LBL0=1L0L1L00000L1\n1000000010001L22222L1\n1L00000?1L0L1L00000L1\n1000000010001L22222L1\n1FF000FF1L0L1L00000L1\n1111D111122211b1D1b11\n000000000000000000000\nLL00000000000000000LL\n1111D1111222111111111\nL000000L1L0L1VVVVV=X1\nL0000000122215@VVVVV1\n100FFF000000000N0V0N1\nL00000000000000V0N0V0\nL0000000122210@N0V0N0\n1000000LbL0Lb00V0N0V0\nL0000000b000b00VNVNV0\nLLXLLXLL1C2C100vvvvvu\n","POI":[],"Keyring":[],"Jail":[{"x":21,"y":10,"type":"furniture","radius":1},{"x":23,"y":10,"type":"furniture","radius":1},{"x":12,"y":21,"type":"storage","radius":1},{"x":12,"y":22,"type":"storage","radius":1},{"x":12,"y":23,"type":"storage","radius":1},{"x":12,"y":24,"type":"storage","radius":1},{"x":10,"y":24,"type":"storage","radius":1},{"x":10,"y":23,"type":"storage","radius":1},{"x":10,"y":22,"type":"storage","radius":1},{"x":8,"y":21,"type":"storage","radius":1},{"x":8,"y":22,"type":"storage","radius":1},{"x":8,"y":23,"type":"storage","radius":1},{"x":8,"y":24,"type":"storage","radius":1},{"x":6,"y":24,"type":"storage","radius":1},{"x":6,"y":23,"type":"storage","radius":1},{"x":6,"y":22,"type":"storage","radius":1},{"x":6,"y":21,"type":"storage","radius":1},{"x":8,"y":18,"type":"storage","radius":1},{"x":8,"y":17,"type":"storage","radius":1},{"x":8,"y":16,"type":"storage","radius":1},{"x":8,"y":15,"type":"storage","radius":1},{"x":10,"y":17,"type":"storage","radius":1},{"x":12,"y":18,"type":"storage","radius":1},{"x":12,"y":17,"type":"storage","radius":1},{"x":12,"y":16,"type":"storage","radius":1},{"x":12,"y":15,"type":"storage","radius":1},{"x":6,"y":15,"type":"storage","radius":1},{"x":6,"y":16,"type":"storage","radius":1},{"x":6,"y":17,"type":"storage","radius":1},{"x":6,"y":18,"type":"storage","radius":1},{"x":6,"y":9,"type":"storage","radius":1},{"x":6,"y":12,"type":"storage","radius":1},{"x":8,"y":12,"type":"storage","radius":1},{"x":8,"y":9,"type":"storage","radius":1},{"x":12,"y":3,"type":"storage","radius":1},{"x":12,"y":4,"type":"storage","radius":1},{"x":12,"y":5,"type":"storage","radius":1},{"x":12,"y":6,"type":"storage","radius":1},{"x":8,"y":3,"type":"storage","radius":1},{"x":8,"y":4,"type":"storage","radius":1},{"x":8,"y":5,"type":"storage","radius":1},{"x":6,"y":6,"type":"storage","radius":1},{"x":6,"y":5,"type":"storage","radius":1},{"x":6,"y":3,"type":"storage","radius":1},{"x":12,"y":9,"type":"storage","radius":1},{"x":12,"y":12,"type":"storage","radius":1},{"x":10,"y":21,"type":"storage","radius":1},{"x":6,"y":3,"type":"storage","radius":1},{"x":6,"y":5,"type":"storage","radius":1},{"x":6,"y":6,"type":"storage","radius":1},{"x":8,"y":5,"type":"storage","radius":1},{"x":8,"y":4,"type":"storage","radius":1},{"x":8,"y":3,"type":"storage","radius":1},{"x":12,"y":6,"type":"storage","radius":1},{"x":12,"y":5,"type":"storage","radius":1},{"x":12,"y":4,"type":"storage","radius":1},{"x":12,"y":3,"type":"storage","radius":1},{"x":12,"y":9,"type":"storage","radius":1},{"x":12,"y":12,"type":"storage","radius":1},{"x":8,"y":9,"type":"storage","radius":1},{"x":8,"y":12,"type":"storage","radius":1},{"x":6,"y":12,"type":"storage","radius":1},{"x":6,"y":9,"type":"storage","radius":1},{"x":6,"y":15,"type":"storage","radius":1},{"x":6,"y":16,"type":"storage","radius":1},{"x":6,"y":17,"type":"storage","radius":1},{"x":6,"y":18,"type":"storage","radius":1},{"x":8,"y":18,"type":"storage","radius":1},{"x":8,"y":17,"type":"storage","radius":1},{"x":8,"y":16,"type":"storage","radius":1},{"x":8,"y":15,"type":"storage","radius":1},{"x":10,"y":17,"type":"storage","radius":1},{"x":12,"y":17,"type":"storage","radius":1},{"x":12,"y":16,"type":"storage","radius":1},{"x":12,"y":15,"type":"storage","radius":1},{"x":12,"y":18,"type":"storage","radius":1},{"x":12,"y":24,"type":"storage","radius":1},{"x":12,"y":23,"type":"storage","radius":1},{"x":12,"y":22,"type":"storage","radius":1},{"x":12,"y":21,"type":"storage","radius":1},{"x":10,"y":21,"type":"storage","radius":1},{"x":10,"y":22,"type":"storage","radius":1},{"x":10,"y":23,"type":"storage","radius":1},{"x":10,"y":24,"type":"storage","radius":1},{"x":8,"y":24,"type":"storage","radius":1},{"x":8,"y":23,"type":"storage","radius":1},{"x":8,"y":22,"type":"storage","radius":1},{"x":8,"y":21,"type":"storage","radius":1},{"x":6,"y":21,"type":"storage","radius":1},{"x":6,"y":22,"type":"storage","radius":1},{"x":6,"y":23,"type":"storage","radius":1},{"x":6,"y":24,"type":"storage","radius":1},{"x":13,"y":4,"type":"furniture","radius":1},{"x":13,"y":5,"type":"furniture","radius":1},{"x":13,"y":6,"type":"furniture","radius":1},{"x":13,"y":7,"type":"furniture","radius":1},{"x":13,"y":8,"type":"furniture","radius":1},{"x":13,"y":9,"type":"furniture","radius":1},{"x":19,"y":4,"type":"furniture","radius":1},{"x":19,"y":5,"type":"furniture","radius":1},{"x":19,"y":6,"type":"furniture","radius":1},{"x":19,"y":7,"type":"furniture","radius":1},{"x":19,"y":8,"type":"furniture","radius":1},{"x":3,"y":4,"type":"furniture","radius":1},{"x":5,"y":4,"type":"furniture","radius":1},{"x":1,"y":6,"type":"furniture","radius":1},{"x":11,"y":8,"type":"furniture","radius":1},{"x":9,"y":8,"type":"furniture","radius":1},{"x":9,"y":6,"type":"furniture","radius":1},{"x":11,"y":6,"type":"furniture","radius":1},{"x":11,"y":4,"type":"furniture","radius":1},{"x":9,"y":4,"type":"furniture","radius":1},{"x":9,"y":13,"type":"furniture","radius":1},{"x":11,"y":13,"type":"furniture","radius":1},{"x":9,"y":18,"type":"furniture","radius":1},{"x":11,"y":18,"type":"furniture","radius":1},{"x":7,"y":13,"type":"furniture","radius":1},{"x":7,"y":18,"type":"furniture","radius":1},{"x":6,"y":20,"type":"furniture","radius":1},{"x":7,"y":20,"type":"furniture","radius":1},{"x":0,"y":19,"type":"furniture","radius":1},{"x":0,"y":17,"type":"furniture","radius":1},{"x":0,"y":16,"type":"furniture","radius":1},{"x":0,"y":14,"type":"furniture","radius":1},{"x":0,"y":13,"type":"furniture","radius":1},{"x":1,"y":20,"type":"furniture","radius":1},{"x":0,"y":20,"type":"furniture","radius":1},{"x":19,"y":1,"type":"furniture","radius":1},{"x":17,"y":1,"type":"furniture","radius":1},{"x":15,"y":1,"type":"furniture","radius":1},{"x":13,"y":1,"type":"furniture","radius":1},{"x":11,"y":1,"type":"furniture","radius":1},{"x":9,"y":1,"type":"furniture","radius":1},{"x":7,"y":1,"type":"furniture","radius":1},{"x":5,"y":1,"type":"furniture","radius":1},{"x":3,"y":1,"type":"furniture","radius":1},{"x":1,"y":1,"type":"furniture","radius":1}],"Tiles":{"13,4":{"Type":"Furniture","Furniture":"FutureBox"},"13,5":{"Type":"Furniture","Furniture":"FutureBox"},"13,6":{"Type":"Furniture","Furniture":"FutureBox"},"13,7":{"Type":"Furniture","Furniture":"FutureBox"},"13,8":{"Type":"Furniture","Furniture":"FutureBox"},"16,9":{"Type":"Door","Priority":true,"AlwaysClose":true,"Lock":"Cyber","DoorSkin":"Doors/Cyber"},"19,4":{"Type":"Furniture","Furniture":"FutureBox"},"19,5":{"Type":"Furniture","Furniture":"FutureBox"},"19,6":{"Type":"Furniture","Furniture":"FutureBox"},"19,7":{"Type":"Furniture","Furniture":"FutureBox"},"19,8":{"Type":"Furniture","Furniture":"FutureBox"},"3,15":{"Type":"Table","Food":"Plate"},"4,15":{"Type":"Table","Food":"Plate"},"5,15":{"Type":"Table","Food":"Plate"},"3,4":{"Type":"Cage","Furniture":"Cage"},"5,4":{"Type":"Cage","Furniture":"Cage"},"1,6":{"Type":"Furniture","Furniture":"DisplayStand"},"11,8":{"Type":"Furniture","Furniture":"DisplayStand"},"9,8":{"Type":"Furniture","Furniture":"DisplayStand"},"9,6":{"Type":"Furniture","Furniture":"DisplayStand"},"11,6":{"Type":"Furniture","Furniture":"DisplayStand"},"11,4":{"Type":"Furniture","Furniture":"DisplayStand"},"9,4":{"Type":"Furniture","Furniture":"DisplayStand"},"9,13":{"Type":"Furniture","Furniture":"DisplayStand"},"11,13":{"Type":"Furniture","Furniture":"DisplayStand"},"9,18":{"Type":"Furniture","Furniture":"DisplayStand"},"11,18":{"Type":"Furniture","Furniture":"DisplayStand"},"7,13":{"Type":"Furniture","Furniture":"DisplayStand"},"7,18":{"Type":"Furniture","Furniture":"DisplayStand"},"6,20":{"Type":"Cage","Furniture":"Cage"},"7,20":{"Type":"Cage","Furniture":"Cage"},"0,19":{"Type":"Cage","Furniture":"Cage"},"0,17":{"Type":"Cage","Furniture":"Cage"},"0,16":{"Type":"Cage","Furniture":"Cage"},"0,14":{"Type":"Cage","Furniture":"Cage"},"0,13":{"Type":"Cage","Furniture":"Cage"},"1,20":{"Type":"Cage","Furniture":"Cage"},"0,20":{"Type":"Cage","Furniture":"Cage"},"0,11":{"Type":"Barrel","Always":true},"3,20":{"Type":"Barrel","Always":true},"4,20":{"Type":"Barrel","Always":true},"4,12":{"Type":"Door","Priority":true,"AlwaysClose":true},"13,14":{"Type":"DollDropoff","Sprite":"Floor","Overlay":"DollDropoff","direction":{"x":0,"y":-1}},"13,13":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"14,13":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"15,13":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"16,13":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"17,13":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"17,14":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0,"wireType":"Conveyor_Switch","SwitchMode":"Switch"},"19,15":{"Type":"BondageMachine","Binding":"Doll"},"19,14":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,15":{"Type":"BondageMachine","Binding":"Latex"},"15,16":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,14":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"16,14":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"15,18":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"15,17":{"Type":"BondageMachine","Binding":"Latex"},"17,16":{"Type":"BondageMachine","Binding":"Chastity"},"17,18":{"Type":"BondageMachine","Binding":"Plug"},"16,19":{"Type":"BondageMachine","Binding":"Latex"},"15,19":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"18,19":{"Type":"BondageMachine","Binding":"Doll"},"17,19":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1,"wireType":"Conveyor_Switch","SwitchMode":"Switch"},"17,17":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"17,15":{"Type":"Conveyor","Sprite":"Conveyor/Up","DX":0,"DY":-1},"19,19":{"Type":"Conveyor","Sprite":"Conveyor/Left","DX":-1,"DY":0},"19,18":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"19,16":{"Type":"Conveyor","Sprite":"Conveyor/Down","DX":0,"DY":1},"19,17":{"Type":"BondageMachine","Binding":"Doll"},"18,14":{"Type":"Conveyor","Sprite":"Conveyor/Right","DX":1,"DY":0},"20,11":{"Type":"Barrel","Always":true},"1,11":{"Type":"Barrel","Always":true},"19,11":{"Type":"Barrel","Always":true},"17,12":{"Type":"Skin","Skin":"EmptyPipe"},"6,8":{"Type":"Table","Food":"Plate"},"7,8":{"Type":"Table","Food":"Plate"},"1,8":{"Type":"Table","Food":"Plate"},"2,8":{"Type":"Table","Food":"Plate"},"4,9":{"Type":"Door","Priority":true,"AlwaysClose":true},"19,1":{"Type":"Furniture","Furniture":"DisplayStand"},"17,1":{"Type":"Furniture","Furniture":"DisplayStand"},"15,1":{"Type":"Furniture","Furniture":"DisplayStand"},"13,1":{"Type":"Furniture","Furniture":"DisplayStand"},"11,1":{"Type":"Furniture","Furniture":"DisplayStand"},"9,1":{"Type":"Furniture","Furniture":"DisplayStand"},"7,1":{"Type":"Furniture","Furniture":"DisplayStand"},"5,1":{"Type":"Furniture","Furniture":"DisplayStand"},"3,1":{"Type":"Furniture","Furniture":"DisplayStand"},"1,1":{"Type":"Furniture","Furniture":"DisplayStand"},"15,20":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyLeft","DX":-1,"DY":0},"16,20":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyLeft","DX":-1,"DY":0},"17,20":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyLeft","DX":-1,"DY":0},"18,20":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyLeft","DX":-1,"DY":0},"19,20":{"Type":"SafetyConveyor","Sprite":"Conveyor/SafetyLeft","DX":-1,"DY":0},"20,20":{"Type":"DollSupply","count":0,"wireType":"increment","rate":3},"18,13":{"Type":"Charger","Priority":true},"7,4":{"Type":"Charger","NoRemove":false},"1,4":{"Type":"Charger","NoRemove":false},"9,20":{"Type":"Chest","Loot":"storage","Chance":0.8,"refill":true},"11,20":{"Type":"Chest","Loot":"storage","Chance":0.8,"refill":true}},"effectTiles":{"8,15":{"Torch":{"x":8,"y":15,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"8,10":{"Torch":{"x":8,"y":10,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"12,10":{"Torch":{"x":12,"y":10,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"8,1":{"Torch":{"x":8,"y":1,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"12,1":{"Torch":{"x":12,"y":1,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"16,1":{"Torch":{"x":16,"y":1,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"20,1":{"Torch":{"x":20,"y":1,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"4,1":{"Torch":{"x":4,"y":1,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"0,1":{"Torch":{"x":0,"y":1,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"0,10":{"Torch":{"x":0,"y":10,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"0,13":{"Torch":{"x":0,"y":13,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"0,16":{"Torch":{"x":0,"y":16,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"0,19":{"Torch":{"x":0,"y":19,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"20,10":{"Torch":{"x":20,"y":10,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"16,4":{"Torch":{"x":16,"y":4,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"12,16":{"MotionLamp":{"x":12,"y":16,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"12,15":{"Torch":{"x":12,"y":15,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"8,16":{"MotionLamp":{"x":8,"y":16,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"8,11":{"MotionLamp":{"x":8,"y":11,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"12,11":{"MotionLamp":{"x":12,"y":11,"name":"MotionLamp","duration":9999,"infinite":true,"priority":50,"tags":["floor"]}},"14,17":{"Wire":{"x":14,"y":17,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"14,18":{"Wire":{"x":14,"y":18,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"14,19":{"Wire":{"x":14,"y":19,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"15,19":{"Wire":{"x":15,"y":19,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"16,19":{"Wire":{"x":16,"y":19,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"17,19":{"Wire":{"x":17,"y":19,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"17,14":{"Wire":{"x":17,"y":14,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"16,14":{"Wire":{"x":16,"y":14,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"15,14":{"Wire":{"x":15,"y":14,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"14,14":{"Wire":{"x":14,"y":14,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"18,15":{"LatexBlue":{"x":18,"y":15,"name":"LatexBlue","functionName":"Latex","duration":80,"priority":-2.01,"affinities":["Latex"],"tags":["latex","insulator","terrain"]}},"18,16":{"LatexBlue":{"x":18,"y":16,"name":"LatexBlue","functionName":"Latex","duration":80,"priority":-2.01,"affinities":["Latex"],"tags":["latex","insulator","terrain"]}},"18,17":{"LatexBlue":{"x":18,"y":17,"name":"LatexBlue","functionName":"Latex","duration":80,"priority":-2.01,"affinities":["Latex"],"tags":["latex","insulator","terrain"]}},"18,18":{"LatexBlue":{"x":18,"y":18,"name":"LatexBlue","functionName":"Latex","duration":80,"priority":-2.01,"affinities":["Latex"],"tags":["latex","insulator","terrain"]}},"16,15":{"Latex":{"x":16,"y":15,"name":"Latex","duration":80,"priority":-2,"affinities":["Sticky","Latex"],"tags":["latex","insulator","terrain"]}},"16,16":{"Latex":{"x":16,"y":16,"name":"Latex","duration":80,"priority":-2,"affinities":["Sticky","Latex"],"tags":["latex","insulator","terrain"]}},"16,17":{"Latex":{"x":16,"y":17,"name":"Latex","duration":80,"priority":-2,"affinities":["Sticky","Latex"],"tags":["latex","insulator","terrain"]}},"16,18":{"Latex":{"x":16,"y":18,"name":"Latex","duration":80,"priority":-2,"affinities":["Sticky","Latex"],"tags":["latex","insulator","terrain"]}},"20,16":{"Torch":{"x":20,"y":16,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"18,13":{"Torch":{"x":18,"y":13,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}}},"Skin":{},"inaccessible":[],"tags":["industrial","dollstorage","vault"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"TempleHall_End2":{"name":"TempleHall_End2","Labels":{"Patrol":[]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":20,"grid":"XAX0XAX\nA00000A\nX01410X\n001C100\nX01410X\nA00000A\nXAX0XAX\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Priority":true},"0,1":{"Type":"Shrine","Name":"Metal"},"1,0":{"Type":"Shrine","Name":"Metal"},"5,0":{"Type":"Shrine","Name":"Metal"},"6,1":{"Type":"Shrine","Name":"Metal"},"6,5":{"Type":"Shrine","Name":"Metal"},"5,6":{"Type":"Shrine","Name":"Metal"},"1,6":{"Type":"Shrine","Name":"Metal"},"0,5":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide","chest"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_End3":{"name":"TempleHall_End3","Labels":{"Patrol":[]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{"1,1":"y"},"flexEdgeSuper":{"1,1":"y"},"scale":7,"category":"temple","weight":10,"grid":"XAX0XAX\nA00000A\nX01110X\n004C400\nX01110X\nA00000A\nXAX0XAX\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Priority":true},"0,1":{"Type":"Shrine","Name":"Metal"},"1,0":{"Type":"Shrine","Name":"Metal"},"5,0":{"Type":"Shrine","Name":"Metal"},"6,1":{"Type":"Shrine","Name":"Metal"},"6,5":{"Type":"Shrine","Name":"Metal"},"5,6":{"Type":"Shrine","Name":"Metal"},"1,6":{"Type":"Shrine","Name":"Metal"},"0,5":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide","chest"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"TempleHall_Collapsed":{"name":"TempleHall_Collapsed","Labels":{"Patrol":[]},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":40,"grid":"XmX0XaX\na00020A\nX0141RX\n004C100\nX21442X\na0R020m\nXAX0XoX\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"3,3":{"Priority":true},"6,1":{"Type":"Shrine","Name":"Metal"},"1,6":{"Type":"Shrine","Name":"Metal"},"2,5":{"Type":"Rubble"},"5,2":{"Type":"Rubble"}},"effectTiles":{"1,5":{"RubbleNoMend":{"x":1,"y":5,"name":"RubbleNoMend","duration":9999,"priority":0,"tags":["terrain","ground","rock"]}},"5,1":{"RubbleNoMend":{"x":5,"y":1,"name":"RubbleNoMend","duration":9999,"priority":0,"tags":["terrain","ground","rock"]}},"1,2":{"RubbleNoMend":{"x":1,"y":2,"name":"RubbleNoMend","duration":9999,"priority":0,"tags":["terrain","ground","rock"]}},"2,1":{"RubbleNoMend":{"x":2,"y":1,"name":"RubbleNoMend","duration":9999,"priority":0,"tags":["terrain","ground","rock"]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide","chest"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":["1"]},"ElevatorEgyptian":{"name":"ElevatorEgyptian","Labels":{},"w":3,"h":4,"primInd":"dr","index":{"1,1":"dr","1,2":"udr","1,3":"udr","1,4":"ur","2,1":"dlr","2,2":"udlr","2,3":"udlr","2,4":"ulr","3,1":"dl","3,2":"udl","3,3":"udl","3,4":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"111111111111111111111\n111111100=L=001111111\n111111100000001111111\n111111110000011111111\n11111111X000X11111111\n111111111000111111111\n11111111X000X11111111\n111111111000111111111\n11111111X000X11111111\n111111111000111111111\n1111111=00000=1111111\n111111110000011111111\n1111111=00L00=1111111\n111111110000011111111\n1111111=00000=1111111\n111111111000111111111\n11111111X000X11111111\n111111111000111111111\n11111111X000X11111111\n111111111000111111111\n11111111X000X11111111\n111111111000111111111\n111111X0000000X111111\n111111101111101111111\n111111101111101111111\n111111101101101111111\n111111X0000000X111111\n111111111101111111111\n","POI":[],"Keyring":[],"Jail":[{"x":12,"y":4,"type":"furniture","radius":1},{"x":10,"y":1,"type":"furniture","radius":1},{"x":10,"y":12,"type":"furniture","radius":1}],"Tiles":{"9,1":{"Type":"Charger","Priority":true},"11,1":{"Type":"Charger","Priority":true},"13,12":{"Type":"Charger","Priority":true},"13,10":{"Type":"Charger","Priority":true},"13,14":{"Type":"Charger","Priority":true},"7,14":{"Type":"Charger","Priority":true},"7,12":{"Type":"Charger","Priority":true},"7,10":{"Type":"Charger","Priority":true},"10,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"},"10,12":{"Type":"Furniture","Furniture":"Sarcophagus"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"ElevatorEgyptian2":{"name":"ElevatorEgyptian2","Labels":{},"w":3,"h":4,"primInd":"dr","index":{"1,1":"dr","1,2":"udr","1,3":"udr","1,4":"ur","2,1":"dlr","2,2":"udlr","2,3":"udlr","2,4":"ulr","3,1":"dl","3,2":"udl","3,3":"udl","3,4":"ul"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"111111111111111111111\n111111000=L=000111111\n111111000000000111111\n111111g1000001g111111\n11111101X000X10001111\n111111011000111101111\n11111101X000X11101111\n111111011000111101111\n11111111X000X11101111\n111111111000111101111\n11111111X000X11101111\n111111111000111101111\n11111111X000X11101111\n111111111000111101111\n11111111X000X11101111\n111111111000111101111\n11111111X000X11101111\n111111111000111101111\n11111111X000X11101111\n111111111000111101111\n11111111X000X11101111\n111111111000111101111\n111111X0000000X1g1111\n111111X0111110X001111\n111111X0111110X111111\n111111X0110110X111111\n111111X0000000X111111\n111111111101111111111\n","POI":[],"Keyring":[],"Jail":[{"x":12,"y":4,"type":"furniture","radius":1},{"x":10,"y":1,"type":"furniture","radius":1}],"Tiles":{"9,1":{"Type":"Charger","Priority":true},"11,1":{"Type":"Charger","Priority":true},"10,1":{"Type":"Furniture","Furniture":"DisplayEgyptian"}},"effectTiles":{"6,7":{"RubbleNoMend":{"x":6,"y":7,"name":"RubbleNoMend","duration":9999,"priority":0,"tags":["terrain","ground","rock"]}}},"Skin":{},"inaccessible":[],"tags":["industrial"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"TempleHallB_1x2":{"name":"TempleHallB_1x2","Labels":{"Patrol":[]},"w":1,"h":2,"primInd":"ud","index":{"1,1":"ud","1,2":"ud"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":200,"grid":"1100011\n4000001\n1000001\n=01110=\n001A100\n1022201\nX02220X\nX02220X\n1022201\n=01A10=\n0011100\n1000001\n1000004\n1100011\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"6,9":{"Type":"Charger","Priority":true},"0,9":{"Type":"Charger","Priority":true},"6,3":{"Type":"Charger","Priority":true},"0,3":{"Type":"Charger","Priority":true},"3,4":{"Type":"Shrine","Name":"Metal"},"3,9":{"Type":"Shrine","Name":"Metal"}},"effectTiles":{"2,5":{"Torch":{"x":2,"y":5,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"2,11":{"Torch":{"x":2,"y":11,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"4,11":{"Torch":{"x":4,"y":11,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"4,5":{"Torch":{"x":4,"y":5,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"1,1":{"Torch":{"x":1,"y":1,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"5,1":{"Torch":{"x":5,"y":1,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","wide"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[0],"notTags":["1"]},"TempleHallPuzz_vert":{"name":"TempleHallPuzz_vert","Labels":{},"w":2,"h":2,"primInd":"udr","index":{"1,1":"udr","1,2":"udr","2,1":"dl","2,2":"ul"},"flexEdge":{"2,2":"y","2,1":"y","1,2":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":20000,"grid":"11001111111111\n110011122Z0031\n1100111g110031\n110020021111@1\n11002102111131\n1+0021021111Z1\n11002102100001\n11002002Z000C1\n110020011110C1\n11002101111011\n1+002101000001\n11002101Z100@1\n11002002210031\n11001111111111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"8,7":{"Type":"AutoDoor","wireType":"AutoDoor_HoldOpen","Label":"HoldOpen"},"8,11":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"9,1":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"12,5":{"Type":"AutoDoor","wireType":"AutoDoor_Open","Label":"Open"},"12,8":{"Type":"Chest","Lock":"Blue"},"12,7":{"Type":"Chest","Loot":"lessergold","NoTrap":true,"Priority":true},"1,5":{"Type":"Charger"},"1,10":{"Type":"Charger"},"12,2":{"Type":"ForceSpawn","required":["elemental"],"Label":"EleTrap","tags":["elemental"],"filterTags":["miniboss","boss"],"Chance":1,"AI":"looseguard","force":true,"faction":"Enemy","levelBoost":4},"12,1":{"Type":"ForceSpawn","required":["elemental"],"Label":"EleTrap","tags":["elemental"],"filterTags":["miniboss","boss"],"Chance":1,"AI":"looseguard","force":true,"faction":"Enemy","levelBoost":4},"12,4":{"Type":"ForceSpawn","required":["elemental"],"Label":"EleTrap","tags":["elemental"],"filterTags":["miniboss","boss"],"Chance":1,"AI":"looseguard","force":true,"faction":"Enemy","levelBoost":4},"12,12":{"Type":"ForceSpawn","required":["elemental"],"Label":"EleTrap","tags":["elemental"],"filterTags":["miniboss","boss"],"Chance":1,"AI":"looseguard","force":true,"faction":"Enemy","levelBoost":4}},"effectTiles":{"8,7":{"Wire":{"x":8,"y":7,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"7,7":{"PressurePlateHold":{"x":7,"y":7,"name":"PressurePlateHold","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"9,1":{"Wire":{"x":9,"y":1,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"8,5":{"Wire":{"x":8,"y":5,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"8,6":{"Wire":{"x":8,"y":6,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"8,11":{"Wire":{"x":8,"y":11,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"9,11":{"Wire":{"x":9,"y":11,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"8,10":{"TeleportPlateMana":{"x":8,"y":10,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"9,10":{"TeleportPlateMana":{"x":9,"y":10,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"10,10":{"TeleportPlateMana":{"x":10,"y":10,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"10,12":{"TeleportPlateMana":{"x":10,"y":12,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"10,11":{"TeleportPlateMana":{"x":10,"y":11,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"11,9":{"Wire":{"x":11,"y":9,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"10,9":{"Wire":{"x":10,"y":9,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"8,9":{"Wire":{"x":8,"y":9,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"9,9":{"Wire":{"x":9,"y":9,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"7,9":{"Wire":{"x":7,"y":9,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"7,10":{"Wire":{"x":7,"y":10,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"7,11":{"Wire":{"x":7,"y":11,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"9,7":{"TeleportPlateMana":{"x":9,"y":7,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"9,6":{"TeleportPlateMana":{"x":9,"y":6,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"10,2":{"TeleportPlateMana":{"x":10,"y":2,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"10,1":{"TeleportPlateMana":{"x":10,"y":1,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"11,5":{"Wire":{"x":11,"y":5,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"9,5":{"Wire":{"x":9,"y":5,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"10,5":{"Wire":{"x":10,"y":5,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"9,2":{"Wire":{"x":9,"y":2,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"9,3":{"Wire":{"x":9,"y":3,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"10,3":{"Wire":{"x":10,"y":3,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"11,3":{"Wire":{"x":11,"y":3,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"12,3":{"Wire":{"x":12,"y":3,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"12,5":{"Wire":{"x":12,"y":5,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"12,11":{"Wire":{"x":12,"y":11,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"12,10":{"Wire":{"x":12,"y":10,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"12,9":{"Wire":{"x":12,"y":9,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"11,10":{"TeleportPlateMana":{"x":11,"y":10,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"11,11":{"TeleportPlateMana":{"x":11,"y":11,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"11,12":{"TeleportPlateMana":{"x":11,"y":12,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"10,7":{"TeleportPlateMana":{"x":10,"y":7,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"10,6":{"TeleportPlateMana":{"x":10,"y":6,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"11,1":{"TeleportPlateMana":{"x":11,"y":1,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}},"11,2":{"TeleportPlateMana":{"x":11,"y":2,"name":"TeleportPlateMana","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire","teleportcrystal"]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","2wide","noWear","lessergold"],"forbidTags":["start","maxlessergold"],"requireTags":[],"indexTags":["temple","2wide"],"maxTags":[-1,-1],"bonusTags":[0,0],"multTags":[1,3],"notTags":["",""]},"GrandSanctum":{"name":"GrandSanctum","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":16,"y":10,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":4,"y":10,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":10,"y":16,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":10,"y":4,"guard":true,"interesting":true}]},"w":3,"h":3,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","1,3":"udlr","2,1":"udlr","2,2":"udlr","2,3":"udlr","3,1":"udlr","3,2":"udlr","3,3":"udlr"},"flexEdge":{"3,2":"y","3,1":"y","2,1":"y","1,1":"y","1,2":"y","1,3":"y","2,3":"y","3,3":"y"},"flexEdgeSuper":{"3,2":"y","3,1":"y","2,1":"y","1,1":"y","1,2":"y","1,3":"y","2,3":"y","3,3":"y"},"scale":7,"category":"temple","weight":150,"grid":"111000000000000000111\n112000000X1X000000211\n122222222111222222221\n002X1200022200021X200\n002112000222000211200\n002222211222112222200\n00200200A222A00200200\n002001000222000100200\n002001A0322230A100200\n0X12222222222222221X0\n0112222222C2222222110\n0X12222222222222221X0\n002001A0322230A100200\n002001000222000100200\n00200200A222A00200200\n002222211222112222200\n002112000222000211200\n002X1200022200021X200\n122222222111222222221\n112000000X1X000000211\n111000000000000000111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"12,8":{"Type":"ForceSpawn","required":["soul","active"],"tags":["soul"],"Label":"SoulC_A"},"12,12":{"Type":"ForceSpawn","required":["soul","active"],"tags":["soul"],"Label":"SoulC_A"},"8,12":{"Type":"ForceSpawn","required":["soul","active"],"tags":["soul"],"Label":"SoulC_A"},"8,8":{"Type":"ForceSpawn","required":["soul","active"],"tags":["soul"],"Label":"SoulC_A"},"12,6":{"Type":"Shrine","Name":"Metal"},"14,8":{"Type":"Shrine","Name":"Metal"},"8,6":{"Type":"Shrine","Name":"Metal"},"6,8":{"Type":"Shrine","Name":"Metal"},"6,12":{"Type":"Shrine","Name":"Metal"},"8,14":{"Type":"Shrine","Name":"Metal"},"12,14":{"Type":"Shrine","Name":"Metal"},"14,12":{"Type":"Shrine","Name":"Metal"},"10,10":{"Type":"Chest","Loot":"lessergold","NoTrap":true,"Priority":true}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","maxlessergold"],"forbidTags":["maxlessergold"],"requireTags":["temple"],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]},"wiretest":{"name":"wiretest","Labels":{},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":-1000,"grid":"0000000\n0000000\n0000000\n0000000\n0000000\n0000000\n0000000\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"0,1":{"PressurePlate":{"x":0,"y":1,"name":"PressurePlate","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"0,5":{"PressurePlate":{"x":0,"y":5,"name":"PressurePlate","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"4,6":{"PressurePlate":{"x":4,"y":6,"name":"PressurePlate","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"4,0":{"PressurePlate":{"x":4,"y":0,"name":"PressurePlate","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"6,2":{"PressurePlate":{"x":6,"y":2,"name":"PressurePlate","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"6,4":{"PressurePlate":{"x":6,"y":4,"name":"PressurePlate","duration":9999,"infinite":true,"priority":50,"tags":["wire"]}},"6,3":{"WireHoriz":{"x":6,"y":3,"name":"WireHoriz","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","horiz"]}},"5,3":{"WireHoriz":{"x":5,"y":3,"name":"WireHoriz","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","horiz"]}},"4,3":{"WireHoriz":{"x":4,"y":3,"name":"WireHoriz","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","horiz"]}},"1,1":{"WireHoriz":{"x":1,"y":1,"name":"WireHoriz","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","horiz"]}},"2,1":{"WireHoriz":{"x":2,"y":1,"name":"WireHoriz","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","horiz"]}},"3,2":{"WireVert":{"x":3,"y":2,"name":"WireVert","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","vert"]}},"3,1":{"Wire":{"x":3,"y":1,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"3,3":{"Wire":{"x":3,"y":3,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"3,0":{"WireHoriz":{"x":3,"y":0,"name":"WireHoriz","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","horiz"]}},"2,0":{"WireHoriz":{"x":2,"y":0,"name":"WireHoriz","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","horiz"]}},"0,4":{"WireHoriz":{"x":0,"y":4,"name":"WireHoriz","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","horiz"]}},"1,4":{"WireHoriz":{"x":1,"y":4,"name":"WireHoriz","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","horiz"]}},"3,6":{"WireVert":{"x":3,"y":6,"name":"WireVert","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","vert"]}},"3,5":{"WireVert":{"x":3,"y":5,"name":"WireVert","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","vert"]}},"4,5":{"WireHoriz":{"x":4,"y":5,"name":"WireHoriz","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","horiz"]}},"5,5":{"WireHoriz":{"x":5,"y":5,"name":"WireHoriz","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire","horiz"]}},"6,5":{"Wire":{"x":6,"y":5,"name":"Wire","duration":9999,"infinite":true,"priority":50,"tags":["hiddenmagic","wire"]}},"1,3":{"TeleportPlate":{"x":1,"y":3,"name":"TeleportPlate","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire"]}},"2,4":{"TeleportPlate":{"x":2,"y":4,"name":"TeleportPlate","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire"]}},"3,4":{"TeleportPlate":{"x":3,"y":4,"name":"TeleportPlate","duration":9999,"infinite":true,"priority":10,"tags":["teleportwire"]}},"5,1":{"SpikeTrap":{"x":5,"y":1,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}}},"Skin":{},"inaccessible":[],"tags":["urban"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"temple2x2_A":{"name":"temple2x2_A","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":6,"y":5},{"name":"Guard","type":"Patrol","assigned":-1,"x":9,"y":5},{"name":"Guard","type":"Patrol","assigned":-1,"x":9,"y":8},{"name":"Guard","type":"Patrol","assigned":-1,"x":6,"y":8},{"name":"interesting","type":"Patrol","assigned":-1,"x":11,"y":5,"interesting":true},{"name":"interesting","type":"Patrol","assigned":-1,"x":11,"y":8,"interesting":true},{"name":"interesting","type":"Patrol","assigned":-1,"x":4,"y":8,"interesting":true},{"name":"interesting","type":"Patrol","assigned":-1,"x":4,"y":5,"interesting":true}]},"w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"dl","2,2":"ul"},"flexEdge":{"2,2":"y","2,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":100,"grid":"11100011111111\n1220T0022X1111\n1220000220X111\n0220T00220RX11\n0220000220T0X1\n011A00022000A1\n11122220022221\n11122220022221\n011A00022000A1\n0220000220T0X1\n0220T002200X11\n1220000220X111\n1220T0R22X1111\n11100011111111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{"12,5":{"Type":"Shrine","Name":"Metal"},"12,8":{"Type":"Shrine","Name":"Metal"},"3,5":{"Type":"Shrine","Name":"Metal"},"3,8":{"Type":"Shrine","Name":"Metal"},"10,3":{"Type":"Rubble"},"6,12":{"Type":"Rubble"},"4,12":{"Type":"Trap"},"4,1":{"Type":"Trap"},"10,4":{"Type":"Trap"},"10,9":{"Type":"Trap"},"4,3":{"Type":"Trap"},"4,10":{"Type":"Trap"}},"effectTiles":{"9,1":{"TorchUnlit":{"x":9,"y":1,"name":"TorchUnlit","duration":9999,"infinite":true,"priority":5,"yoffset":-1,"tags":["sackable"]}},"11,3":{"TorchUnlit":{"x":11,"y":3,"name":"TorchUnlit","duration":9999,"infinite":true,"priority":5,"yoffset":-1,"tags":["sackable"]}},"2,9":{"TorchUnlit":{"x":2,"y":9,"name":"TorchUnlit","duration":9999,"infinite":true,"priority":5,"yoffset":-1,"tags":["sackable"]}},"2,1":{"TorchUnlit":{"x":2,"y":1,"name":"TorchUnlit","duration":9999,"infinite":true,"priority":5,"yoffset":-1,"tags":["sackable"]}}},"Skin":{},"inaccessible":[],"tags":["temple","start","wide"],"forbidTags":[],"requireTags":[],"indexTags":["start"],"maxTags":[-1],"bonusTags":[50],"multTags":[1],"notTags":[""]},"Panopticon":{"name":"Panopticon","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":6,"y":6,"guard":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":7,"y":7,"guard":true}]},"w":2,"h":2,"primInd":"dlr","index":{"1,1":"dlr","1,2":"ulr","2,1":"dlr","2,2":"ulr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":100,"grid":"10000000000001\n1gbbb4111bbbg1\n000001LL100000\n00000000000000\n00000000000000\n11100000000111\n11L0000F000L11\n11L000C0000L11\n11100000000111\n00000000000000\n00000000000000\n000001LL100000\n4gbbb1111bbbg1\n10000000000001\n","POI":[],"Keyring":[],"Jail":[{"x":11,"y":6,"type":"furniture","radius":1},{"x":11,"y":7,"type":"furniture","radius":1},{"x":2,"y":6,"type":"furniture","radius":1},{"x":2,"y":7,"type":"furniture","radius":1},{"x":6,"y":11,"type":"furniture","radius":1},{"x":7,"y":11,"type":"furniture","radius":1},{"x":6,"y":2,"type":"furniture","radius":1},{"x":7,"y":2,"type":"furniture","radius":1}],"Tiles":{"11,6":{"Type":"Cage","Furniture":"Cage"},"11,7":{"Type":"Cage","Furniture":"Cage"},"2,6":{"Type":"Cage","Furniture":"Cage"},"2,7":{"Type":"Cage","Furniture":"Cage"},"6,11":{"Type":"Cage","Furniture":"Cage"},"7,11":{"Type":"Cage","Furniture":"Cage"},"6,2":{"Type":"Cage","Furniture":"Cage"},"7,2":{"Type":"Cage","Furniture":"Cage"},"7,6":{"Type":"Table"},"6,7":{"Type":"Chest","Loot":"storage","Chance":0.8}},"effectTiles":{"8,3":{"Torch":{"x":8,"y":3,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"5,3":{"Torch":{"x":5,"y":3,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"0,2":{"Torch":{"x":0,"y":2,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"13,2":{"Torch":{"x":13,"y":2,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"13,9":{"Torch":{"x":13,"y":9,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"0,9":{"Torch":{"x":0,"y":9,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}}},"Skin":{},"inaccessible":[],"tags":["temple","start","wide"],"forbidTags":[],"requireTags":[],"indexTags":["start"],"maxTags":[-1],"bonusTags":[50],"multTags":[1],"notTags":[""]},"SecureJail":{"name":"SecureJail","Labels":{"Patrol":[{"name":"Guard","type":"Patrol","assigned":-1,"x":12,"y":10,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":12,"y":4,"guard":true,"interesting":true},{"name":"Gawk","type":"Patrol","assigned":-1,"x":11,"y":5,"interesting":true},{"name":"Gawk","type":"Patrol","assigned":-1,"x":11,"y":6,"interesting":true},{"name":"Gawk","type":"Patrol","assigned":-1,"x":11,"y":10,"interesting":true},{"name":"Gawk","type":"Patrol","assigned":-1,"x":11,"y":11,"interesting":true}]},"w":2,"h":2,"primInd":"dr","index":{"1,1":"dr","1,2":"ur","2,1":"dlr","2,2":"ulr"},"flexEdge":{"1,2":"y","1,1":"y"},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":100,"grid":"11111111111111\n11000000/40000\n11gfffffffb0?0\n11000LFFFFb000\n1100000000b000\n1100000000b000\n1100000000b000\n11B00000o0D000\n1100000000b000\n1100000000b000\n1100000000b000\n11CCRCFFFFb000\n111111111110L0\n11111111111111\n","POI":[],"Keyring":[],"Jail":[{"x":12,"y":12,"type":"furniture","radius":1}],"Tiles":{"9,2":{"Jail":true},"10,2":{"Jail":true},"10,3":{"Jail":true},"10,4":{"Jail":true},"10,5":{"Jail":true},"10,6":{"Jail":true},"9,6":{"Jail":true},"9,5":{"Jail":true},"9,4":{"Jail":true},"9,3":{"Type":"Table","Jail":true},"8,2":{"Jail":true},"7,2":{"Jail":true},"6,2":{"Jail":true},"5,2":{"Jail":true},"4,2":{"Jail":true},"3,2":{"Jail":true},"1,2":{"Jail":true},"1,3":{"Jail":true},"1,4":{"Jail":true},"2,3":{"Jail":true},"3,3":{"Jail":true},"4,3":{"Jail":true},"5,3":{"Type":"Barrel","Jail":true},"6,3":{"Type":"Table","Jail":true},"7,3":{"Type":"Table","Jail":true},"8,3":{"Type":"Table","Jail":true},"3,4":{"Jail":true},"2,4":{"Jail":true},"4,4":{"Jail":true},"5,4":{"Jail":true},"6,4":{"Jail":true},"7,4":{"Jail":true},"8,4":{"Jail":true},"8,5":{"Jail":true},"7,5":{"Jail":true},"6,5":{"Jail":true},"5,5":{"Jail":true},"4,5":{"Jail":true},"3,5":{"Jail":true},"2,5":{"Jail":true},"1,5":{"Jail":true},"1,6":{"Jail":true},"2,6":{"Jail":true},"3,6":{"Jail":true},"4,6":{"Jail":true},"5,6":{"Jail":true},"6,6":{"Jail":true},"7,6":{"Jail":true},"8,6":{"Jail":true},"1,7":{"Jail":true},"1,8":{"Jail":true},"1,9":{"Jail":true},"1,10":{"Jail":true},"1,11":{"Jail":true},"1,12":{"Jail":true},"4,12":{"Jail":true},"3,12":{"Jail":true},"2,12":{"Jail":true},"2,10":{"Jail":true},"2,8":{"Jail":true},"3,7":{"Jail":true},"3,8":{"Jail":true},"3,9":{"Jail":true},"3,10":{"Jail":true},"5,12":{"Jail":true},"5,10":{"Jail":true},"5,9":{"Jail":true},"4,9":{"Jail":true},"4,10":{"Jail":true},"4,11":{"Type":"Rubble","Jail":true},"4,8":{"Jail":true},"4,7":{"Jail":true},"5,7":{"Jail":true},"5,8":{"Jail":true},"6,9":{"Jail":true},"6,8":{"Jail":true},"6,7":{"Jail":true},"7,7":{"Jail":true},"8,7":{"Type":"JailPoint","Jail":true},"9,7":{"Jail":true},"10,7":{"Type":"Door","Priority":true,"AlwaysClose":true,"Jail":true},"10,8":{"Jail":true},"10,9":{"Jail":true},"10,10":{"Jail":true},"10,11":{"Jail":true},"9,11":{"Type":"Table","Jail":true},"9,12":{"Jail":true},"10,12":{"Jail":true},"8,12":{"Jail":true},"7,12":{"Jail":true},"6,12":{"Jail":true},"6,11":{"Type":"Table","Jail":true},"6,10":{"Jail":true},"7,10":{"Jail":true},"7,9":{"Jail":true},"8,9":{"Jail":true},"8,10":{"Jail":true},"7,11":{"Type":"Table","Jail":true},"8,11":{"Type":"Table","Jail":true},"9,10":{"Jail":true},"9,9":{"Jail":true},"9,8":{"Jail":true},"7,8":{"Jail":true},"8,8":{"Jail":true},"12,12":{"Type":"Cage","Furniture":"Cage"},"2,7":{"Jail":true},"2,1":{"Jail":true},"2,2":{"Jail":true},"3,1":{"Jail":true},"4,1":{"Jail":true},"5,1":{"Jail":true},"6,1":{"Jail":true},"7,1":{"Jail":true},"8,1":{"Type":"Debris","Jail":true},"9,1":{"Jail":true},"5,11":{"Type":"Chest","Loot":"kinky","Chance":0.8,"refill":true,"Jail":true},"3,11":{"Type":"Chest","Loot":"kinky","Chance":0.8,"refill":true,"Jail":true},"2,11":{"Type":"Chest","Loot":"kinky","Chance":0.8,"refill":true,"Jail":true},"2,9":{"Jail":true}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["urban","jail"],"forbidTags":[],"requireTags":[],"indexTags":["start"],"maxTags":[-1],"bonusTags":[50],"multTags":[1],"notTags":[""]},"HallSpikes":{"name":"HallSpikes","Labels":{},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"urban","weight":10,"grid":"1110111\n1110111\n1100011\n0000000\n1100011\n1110111\n1110111\n","POI":[],"Keyring":[],"Jail":[],"Tiles":{},"effectTiles":{"5,3":{"TorchUnlit":{"x":5,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"1,3":{"TorchUnlit":{"x":1,"y":3,"name":"TorchUnlit","duration":9999,"priority":5,"yoffset":-1,"tags":[]}},"3,3":{"SpikeTrap":{"x":3,"y":3,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}}},"Skin":{},"inaccessible":[],"tags":["urban","narrow"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng6":{"name":"jng6","Labels":{},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":33,"grid":"0000000\n01X0000\n0X00X10\n00000X0\n00X0000\n001X000\n00X0000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng6b":{"name":"jng6b","Labels":{},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":33,"grid":"0000000\n01X0000\n0X00X10\n0000RX0\n00X0000\n001X000\n00X0000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"4,3":{"Type":"Rubble"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"jng6c":{"name":"jng6c","Labels":{},"w":1,"h":1,"primInd":"udlr","index":{"1,1":"udlr"},"flexEdge":{},"flexEdgeSuper":{},"scale":7,"category":"jungle","weight":33,"grid":"0000000\n01X0000\n0X00X10\n0000RX0\n00X0000\n001X000\n00X0000\n","POI":[],"Keyring":[],"Jail":[{"x":24,"y":41,"type":"furniture","radius":1},{"x":47,"y":10,"type":"furniture","radius":1},{"x":45,"y":19,"type":"furniture","radius":1},{"x":3,"y":33,"type":"furniture","radius":1},{"x":39,"y":25,"type":"jail","radius":1}],"Tiles":{"4,3":{"Type":"Rubble"}},"effectTiles":{"3,3":{"SpikeTrap":{"x":3,"y":3,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}}},"Skin":{},"inaccessible":[],"tags":["jungle"],"forbidTags":[],"requireTags":[],"indexTags":[],"maxTags":[],"bonusTags":[],"multTags":[],"notTags":[]},"SecretRoomB":{"name":"SecretRoomB","Labels":{},"w":2,"h":2,"primInd":"udlr","index":{"1,1":"udlr","1,2":"udlr","2,1":"udlr","2,2":"udlr"},"flexEdge":{"2,1":"y","1,1":"y","1,2":"y","2,2":"y"},"flexEdgeSuper":{},"scale":7,"category":"temple","weight":125,"grid":"11101111110111\n1000g000400001\n100011g11g1001\n00001001001000\n1011fgfff01001\n10g040gCf01001\n1011f1fbf01001\n10111100f01001\n10000g00001001\n1111211b1g1001\n00000000000000\n10001R100000A1\n1A101112200111\n11101111100111\n","POI":[],"Keyring":[],"Jail":[{"x":28,"y":10,"type":"furniture","radius":1},{"x":29,"y":10,"type":"furniture","radius":1},{"x":17,"y":5,"type":"furniture","radius":1},{"x":18,"y":25,"type":"jail","radius":1}],"Tiles":{"7,5":{"Type":"Chest","Loot":"silver","Priority":true},"1,12":{"Type":"Shrine","Name":"Metal"},"12,11":{"Type":"Shrine","Name":"Metal"},"5,11":{"Type":"Rubble"}},"effectTiles":{"3,5":{"SpikeTrap":{"x":3,"y":5,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"5,1":{"SpikeTrap":{"x":5,"y":1,"name":"SpikeTrap","duration":9999,"infinite":true,"priority":2,"tags":["floor"]}},"8,3":{"Torch":{"x":8,"y":3,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"6,7":{"Torch":{"x":6,"y":7,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"3,8":{"Torch":{"x":3,"y":8,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}},"2,1":{"Torch":{"x":2,"y":1,"name":"Torch","duration":9999,"infinite":true,"priority":5,"brightness":6,"lightColor":16746803,"yoffset":-1,"affinitiesStanding":["Fire","Hot"],"tags":["hot","snuffable"]}}},"Skin":{},"inaccessible":[],"tags":["temple","hall","narrow"],"forbidTags":[],"requireTags":[],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[2],"notTags":[""]}} +; diff --git a/Game/src/map/KinkyDungeonEffectTiles.ts b/Game/src/map/KinkyDungeonEffectTiles.ts new file mode 100644 index 000000000..d4e4a1a22 --- /dev/null +++ b/Game/src/map/KinkyDungeonEffectTiles.ts @@ -0,0 +1,576 @@ +"use strict"; + +let KDLatexDmg = 1; +let KDLatexBind = 2; +let KDBubbleDmg = 3; + +let KDEffectTiles: Record = { + "FateBoundGround": { + name: "FateBoundGround", + duration: 2, + priority: 10, + tags: ["fate"], + }, + "TauntGround": { + name: "TauntGround", + duration: 2, + priority: 10, + tags: ["taunt"], + }, + "Ice": { + name: "Ice", + duration: 1, + priority: 1, + fade: "ice", + tags: ["ice", "slippery", "terrain"], + }, + "Acid": { + name: "Acid", + duration: 4, + priority: 4, + tags: ["conductive"], + }, + "Water": { + name: "Water", + duration: 40, + priority: 1, + tags: ["water", "wet", "freezeover", "conductive", "slippery", "terrain"], + }, + "Cracked": { + name: "Cracked", + duration: 100, + priority: 0, + affinities: ["Edge"], + tags: ["terrain", "ground", "wettable", "freezeover"], + }, + "Rubble": { + name: "Rubble", + duration: 9999, + priority: 0, + tags: ["terrain", "ground", "rock", "seal", "rubble"], + }, + "RubbleNoMend": { + name: "RubbleNoMend", + duration: 9999, + priority: 0, + tags: ["terrain", "ground", "rock", "rubble"], + }, + "Slime": { + name: "Slime", + duration: 10, + priority: 2, + affinities: ["Sticky"], + tags: ["slime", "freezeover", "flammable", "conductive", "terrain", "slimedanger"], + }, + "Glue": { + name: "Glue", + duration: 10, + priority: 1, + affinities: ["Sticky"], + tags: ["glue", "terrain", "slimedanger"], + }, + "Latex": { + name: "Latex", + duration: 80, + priority: -2, + affinities: ["Sticky", "Latex"], + tags: ["latex", "insulator", "terrain", "gluedanger", "nomapgen"], + }, + "LiquidMetal": { + name: "LiquidMetal", + duration: 300, + priority: -2, + affinities: ["Slippery"], + tags: ["slippery", "metal", "conductive", "conductcold", "liquidmetal", "terrain", "gluedanger", "nomapgen"], + }, + "LatexThin": { + name: "LatexThin", + functionName: "Latex", + duration: 30, + priority: -2.01, + affinities: ["Sticky", "Latex"], + tags: ["latex", "insulator", "terrain", "gluedanger", "nomapgen"], + }, + "LatexBlue": { + name: "LatexBlue", + functionName: "Latex", + duration: 80, + priority: -2.01, + affinities: ["Sticky", "Latex"], + tags: ["latex", "insulator", "terrain", "gluedanger", "nomapgen"], + }, + "LatexThinBlue": { + name: "LatexThinBlue", + functionName: "Latex", + duration: 30, + priority: -2.01, + affinities: ["Sticky", "Latex"], + tags: ["latex", "insulator", "terrain", "gluedanger", "nomapgen"], + }, + "LatexGreen": { + name: "LatexBlue", + functionName: "Latex", + duration: 80, + priority: -2.01, + affinities: ["Sticky", "Latex"], + tags: ["latex", "insulator", "terrain", "gluedanger", "nomapgen"], + }, + "LatexThinGreen": { + name: "LatexThinGreen", + functionName: "Latex", + duration: 30, + priority: -2.01, + affinities: ["Sticky", "Latex"], + tags: ["latex", "insulator", "terrain", "gluedanger", "nomapgen"], + }, + "Ropes": { + name: "Ropes", + duration: 30, + priority: 5, + tags: ["bind", "rope", "flammable", "terrain"], + }, + "Gunpowder": { + name: "Gunpowder", + duration: 400, + priority: 2, + tags: ["flammable"], + }, + "Fabric": { + name: "Fabric", + duration: 30, + priority: 5, + tags: ["bind", "fabric", "flammable", "terrain"], + }, + "Portals/DarkPortal": { + name: "Portals/DarkPortal", + duration: 40, + priority: 100, + brightness: 8, + lightColor: 0x8b53e9, + fade: "sine3000", + spin: -0.01, + xoffset: 0.5, + yoffset: 0.25, + tags: ["portal", "demonportal"], + }, + "DistractionMote": { + name: "DistractionMote", + duration: 12, + priority: 120, + brightness: 2, + lightColor: 0xff8ed1, + yfade: "sine1000", + yfadeamount: 0.25, + tags: ["mote", "distractionmote"], + }, + "DistractionMoteContact": { + name: "DistractionMoteContact", + duration: 12, + priority: 120, + brightness: 2, + lightColor: 0xff8ed1, + yfade: "sine1000", + yfadeamount: 0.25, + tags: ["mote", "distractionmote"], + }, + "SealSigil": { + name: "SealSigil", + duration: 9999, + infinite: true, + priority: 500, + brightness: 4.5, + lightColor: 0xb38eff, + tags: ["sigil", "objective"], + }, + "Portals/Portal": { + name: "Portals/Portal", + duration: 40, + priority: 100, + brightness: 8, + lightColor: 0x77aaff, + fade: "sine3000", + spin: -0.25, + xoffset: 0.5, + yoffset: 0.25, + tags: ["portal", "demonportal"], + }, + "FabricGreen": { + name: "FabricGreen", + duration: 30, + priority: 5, + brightness: 3.5, + lightColor: 0x55ff55, + tags: ["bind", "fabric", "terrain"], + }, + "Vines": { + name: "Vines", + duration: 50, + priority: 5, + tags: ["bind", "vine", "flammable", "terrain"], + }, + "Runes": { + name: "Runes", + duration: 9999, infinite: true, + priority: 10, + tags: ["runesummon", "rune", "hiddenmagic"], + }, + "RunesTrap": { + name: "RunesTrap", + duration: 9999, infinite: true, + priority: 10, + tags: ["magic", "runetrap", "rune", "hiddenmagic"], + }, + "BoobyTrap": { + name: "BoobyTrap", + duration: 9999, infinite: true, + priority: 10, + tags: ["trap", "hiddenmagic"], + }, + "BoobyTrapMagic": { + name: "BoobyTrapMagic", + duration: 9999, infinite: true, + priority: 10, + tags: ["magic", "rune", "trap", "hiddenmagic"], + }, + "Belts": { + name: "Belts", + duration: 30, + priority: 5, + tags: ["bind", "belt", "terrain"], + }, + "Chains": { + name: "Chains", + duration: 30, + priority: 5, + tags: ["bind", "chain", "noisy", "conductive", "conductcold", "terrain"], + }, + "SlimeBurning": { + name: "SlimeBurning", + duration: 5, + priority: 3, + affinities: ["Sticky", "Fire", "Hot"], + tags: ["slime", "ignite", "fire", "hot", "conductive"], + }, + "Smoke": { + name: "Smoke", + duration: 2, + priority: 4, + tags: ["smoke", "visionblock", "brightnessblock", "darkarea", "wet"], + }, + "Bubble": { + name: "Bubble", + duration: 2, + priority: 99, + tags: ["wet"], + }, + "Soap": { + name: "Soap", + duration: 14, + priority: 15, + tags: ["slippery"], + }, + "Inferno": { + name: "Inferno", + duration: 5, + priority: 5, + brightness: 6, + lightColor: 0xff8933, + affinities: ["Fire", "Hot"], + tags: ["fire", "ignite", "smoke", "visionblock"], + }, + "Ember": { + name: "Ember", + duration: 1, + priority: 3, + brightness: 3.5, + visionBlockRadius: 2.5, + lightColor: 0xb83716, + affinities: ["Hot"], + tags: ["ignite", "smoke", "visionblock"], + }, + "Sparks": { + name: "Sparks", + duration: 4, + priority: 7, + brightness: 6, + lightColor: 0xaaaaff, + tags: ["ignite", "electric"], + }, + "Chill": { + name: "Chill", + duration: 4, + priority: 7, + brightness: 2, + lightColor: 0x88ffff, + tags: ["ice", "chill"], + }, + "WireSparks": { + name: "WireSparks", + duration: 4, + priority: 51, + brightness: 3, + lightColor: 0xff5555, + tags: ["signal"], + }, + "WireSparksAct": { + name: "WireSparks", + duration: 1, + priority: 1, + tags: ["signalFrame"], + }, + "Wire": { + name: "Wire", + duration: 9999, infinite: true, + priority: 50, + tags: ["hiddenmagic", "wire"], + }, + "WireEnd": { + name: "Wire", + duration: 9999, infinite: true, + priority: 50, + tags: ["hiddenmagic", "wireend"], + }, + "WireVert": { + name: "WireVert", + duration: 9999, infinite: true, + priority: 50, + tags: ["hiddenmagic", "wire", "vert"], + }, + "WireHoriz": { + name: "WireHoriz", + duration: 9999, infinite: true, + priority: 50, + tags: ["hiddenmagic", "wire", "horiz"], + }, + "PressurePlate": { + name: "PressurePlate", + duration: 9999, infinite: true, + priority: 50, + tags: ["wire"], + }, + "PressurePlateOneUse": { + name: "PressurePlateOneUse", + duration: 9999, infinite: true, + priority: 50, + tags: ["wire"], + }, + "PressurePlateActive": { + name: "PressurePlateActive", + duration: 2, + priority: 51, + tags: ["ppactive"], + }, + "PressurePlateHold": { + name: "PressurePlateHold", + duration: 9999, infinite: true, + priority: 50, + tags: ["wire"], + }, + + + "MotionLamp": { + name: "MotionLamp", + duration: 9999, infinite: true, + priority: 50, + tags: ["floor"], + }, + "MotionLampLight": { + name: "MotionLampLight", + duration: 9999, + priority: 50, + brightness: 6.5, + lightColor: 0x7799ff, + tags: ["light"], + }, + + "SpikeTrap": { + name: "SpikeTrap", + duration: 9999, infinite: true, + priority: 2, + tags: ["floor", "trap", "hiddenmagic"], + }, + "SpikeTrapSeen": { + name: "SpikeTrapSeen", + duration: 9999, infinite: true, + priority: 2, + tags: [], + }, + "SpikeTrapActive": { + name: "SpikeTrapActive", + duration: 6, + priority: 50, + tags: ["trapactive"], + }, + "Radiance": { + name: "Radiance", + duration: 2, + priority: 50, + brightness: 3.5, + lightColor: 0xffff00, + tags: ["light", "holy"], + }, + + "TeleportPlate": { + name: "TeleportPlate", + duration: 9999, infinite: true, + priority: 10, + tags: ["wireout", "teleportwire"], + }, + "NoTeleportPlate": { + name: "TeleportPlate", + duration: 9999, infinite: true, + priority: 10, + tags: ["wireout", "blockteleport", "blockteleportwire"], + }, + "TeleportPlateMana": { + name: "TeleportPlateMana", + duration: 9999, infinite: true, + priority: 10, + tags: ["wireout", "teleportwire", "teleportcrystal"], + }, + + + "ManaEmpty": { + name: "ManaEmpty", + duration: 9999, infinite: true, + priority: 50, + tags: [], + }, + "ManaPartial": { + name: "ManaPartial", + duration: 9999, infinite: true, + priority: 50, + tags: ["wire"], + }, + "ManaFull": { + name: "PressurePlateActive", + duration: 2, + priority: 51, + tags: ["ppactive"], + }, + + "Ignition": { + name: "Ignition", + duration: 1, + priority: 0, + brightness: 1.5, + lightColor: 0xff8933, + affinities: ["Fire", "Hot"], + tags: ["ignite", "hot"], + }, + "Sack": { + name: "Sack", + duration: 9999, infinite: true, + priority: 10, + yoffset: -1, + tags: ["unbaggable", "brightnessblock", "darkarea"], + }, + "Torch": { + name: "Torch", + duration: 9999, infinite: true, + priority: 5, + brightness: 6, + lightColor: 0xff8933, + yoffset: -1, + affinitiesStanding: ["Fire", "Hot"], + tags: ["hot", "snuffable"], + }, + "TorchUnlit": { + name: "TorchUnlit", + duration: 9999, infinite: true, + priority: 5, + yoffset: -1, + tags: ["sackable"], + }, + "Lantern": { + name: "Lantern", + duration: 9999, infinite: true, + priority: 5, + brightness: 6.5, + lightColor: 0xffee83, + affinitiesStanding: ["Hook", "Edge", "Fire", "Hot"], + yoffset: -1, + tags: ["hot", "snuffable"], + }, + "LanternUnlit": { + name: "LanternUnlit", + duration: 9999, infinite: true, + priority: 5, + affinitiesStanding: ["Hook", "Edge"], + yoffset: -1, + tags: ["sackable"], + }, + "TorchOrb": { + name: "TorchOrb", + duration: 9999, infinite: true, + priority: 5, + brightness: 6, + lightColor: 0x99aaff, + affinitiesStanding: ["Hook", "Edge", "SmallMagic"], + yoffset: -1, + tags: ["sackable"], + }, + "OrbLantern": { + name: "OrbLantern", + duration: 9999, infinite: true, + priority: 5, + brightness: 6, + lightColor: 0x99aaff, + affinitiesStanding: ["Hook", "Edge", "SmallMagic"], + yoffset: -1, + tags: ["sackable"], + }, + "IllusOrb": { + name: "IllusOrb", + duration: 9999, infinite: true, + priority: 5, + brightness: 4, + lightColor: 0xffffff, + affinitiesStanding: ["Hook", "Edge", "SmallMagic"], + yoffset: -1, + tags: ["sackable"], + }, + "IllusOrbDead": { + name: "IllusOrbDead", + duration: 9999, infinite: true, + priority: 5, + brightness: 2, + lightColor: 0x6700ff, + affinitiesStanding: ["Hook", "Edge"], + yoffset: -1, + tags: [], + }, + "EdgeOrb": { + name: "EdgeOrb", + duration: 9999, infinite: true, + priority: 5, + brightness: 4, + lightColor: 0xffffff, + affinitiesStanding: ["Hook", "Edge", "SmallDark"], + yoffset: -1, + tags: [], + }, + "EdgeOrbDead": { + name: "EdgeOrbDead", + duration: 9999, infinite: true, + priority: 5, + brightness: 2, + lightColor: 0x6700ff, + affinitiesStanding: ["Hook", "Edge"], + yoffset: -1, + tags: [], + }, + "Steam": { + name: "Steam", + duration: 6, + priority: 2, + affinities: ["Hot"], + tags: ["steam", "hot", "visionblock"], + }, + "StarryTrail": { + name: "StarryTrail", + duration: 40, + priority: 10, + tags: [], + }, +}; diff --git a/Game/src/map/KinkyDungeonEscapeList.ts b/Game/src/map/KinkyDungeonEscapeList.ts new file mode 100644 index 000000000..9211e573c --- /dev/null +++ b/Game/src/map/KinkyDungeonEscapeList.ts @@ -0,0 +1,532 @@ +"use strict"; + +interface KinkyDungeonEscapeType { + selectValid: boolean, + requireMaxQuests?: boolean, + filterRandom?: (roomType: string, mapMod: string, level: number, faction: string) => number, + //filter?: (roomType: string, mapMod: string, level: number, faction: string) => number, + check: ()=>boolean, + minimaptext: ()=>string, + doortext: ()=>string, + worldgenstart?: ()=>void, +} + +let KinkyDungeonEscapeTypes: Record = { + "None": { + selectValid: false, + check: () => { + return true; + }, + minimaptext: () => { + let escape = KinkyDungeonEscapeTypes.None.check(); + if (escape) + return TextGet("KDEscapeMinimap_Pass_None"); + else + return TextGet("KDEscapeMinimap_Fail_None"); + }, + doortext: () => { + return TextGet("KDEscapeDoor_None"); + }, + }, + "Key": { + selectValid: true, + worldgenstart: () => { + let quota = 1; + if (KinkyDungeonStatsChoice.get("escapekey")) { + KDMapData.KeyQuota = quota; + } else { + if (KinkyDungeonStatsChoice.get("extremeMode")) quota = 3; + else if (KinkyDungeonStatsChoice.get("hardMode")) quota = 2; + let data = {number: quota}; + KinkyDungeonSendEvent("calcEscapeKeyQuota", data); + KDMapData.KeyQuota = data.number; + } + }, + check: () => { + return KDMapData.KeysHeld >= KDMapData.KeyQuota; + + }, + minimaptext: () => { + let escape = KinkyDungeonEscapeTypes.Key.check(); + if (escape) + return TextGet("KDEscapeMinimap_Pass_Key"); + else + return TextGet("KDEscapeMinimap_Fail_Key").replace("NUMBER", (KDMapData.KeyQuota - KDMapData.KeysHeld).toString()); + }, + doortext: () => { + return TextGet("KDEscapeDoor_Key"); + }, + }, + "Kill": { + selectValid: true, + filterRandom: (r, m, l, f) => { + return l > 2 ? 1 : 0; + }, + worldgenstart: () => { + let enemytype = KinkyDungeonGetEnemy([], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + undefined, undefined, undefined, ["nokillescape"]); + let enemynumber = 3; + if (KinkyDungeonStatsChoice.get("extremeMode")) enemynumber = 5; + else if (KinkyDungeonStatsChoice.get("hardMode")) enemynumber = 4; + + let data = {enemy: enemytype.name, number: enemynumber}; + KinkyDungeonSendEvent("calcEscapeKillTarget", data); + KDMapData.KillTarget = data.enemy; + KDMapData.KillQuota = data.number; + for (let i = 0; i < data.number; i++) { + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let ens = KinkyDungeonSummonEnemy(point.x, point.y, data.enemy, 1, 2.9); + KinkyDungeonSetEnemyFlag(ens[0], "killtarget", -1); + KinkyDungeonSetEnemyFlag(ens[0], "no_pers_wander", -1); + } + } + }, + check: () => { + if (!KDMapData.KillTarget) //if this wasnt the escapemethod when this floor was created, spawn targets now + KinkyDungeonEscapeTypes.Kill.worldgenstart(); + + var count = 0; + for (let enemy of KDMapData.Entities) { + if (KDEnemyHasFlag(enemy, "killtarget")) { + count++; + } + } + KDMapData.KillQuota = count; + return KDMapData.KillQuota <= 0; + }, + minimaptext: () => { + let escape = KinkyDungeonEscapeTypes.Kill.check(); + if (escape) + return TextGet("KDEscapeMinimap_Pass_Kill"); + else + return TextGet("KDEscapeMinimap_Fail_Kill").replace("NUMBER", KDMapData.KillQuota.toString()).replace("TYPE",TextGet("Name" + KDMapData.KillTarget)); + }, + doortext: () => { + return TextGet("KDEscapeDoor_Kill"); + }, + }, + "WolfServer": { + selectValid: true, + + filterRandom: (roomType, mapMod, level, faction) => { + return (level > 2 && faction == "Nevermere") ? 10 : 0; + }, + + worldgenstart: () => { + let enemytype = KinkyDungeonGetEnemy(["wolfServer"], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["wolfServer"], undefined, {"server": {mult: 4, bonus: 10}}, ["nokillescape"]); + let enemynumber = 3; + if (KinkyDungeonStatsChoice.get("extremeMode")) enemynumber = 5; + else if (KinkyDungeonStatsChoice.get("hardMode")) enemynumber = 4; + + let data = {enemy: enemytype.name, number: enemynumber}; + KinkyDungeonSendEvent("calcEscapeWolfServerTarget", data); + KDMapData.KillTarget = data.enemy; + KDMapData.KillQuota = data.number; + + let maxBoringness = Math.max(...KDMapExtraData.Boringness); + for (let i = 0; i < data.number; i++) { + let point = KinkyDungeonGetRandomEnemyPointCriteria((x, y) => { + return KinkyDungeonBoringGet(x, y) > 0.3 * maxBoringness; + }, true, false); + if (!point) point = KinkyDungeonGetRandomEnemyPointCriteria((x, y) => { + return KinkyDungeonBoringGet(x, y) > 0; + }, true, false); + if (!point) point = KinkyDungeonGetRandomEnemyPoint(true) + if (point) { + let ens = KinkyDungeonSummonEnemy(point.x, point.y, data.enemy, 1, 2.9); + KinkyDungeonSetEnemyFlag(ens[0], "killtarget", -1); + KinkyDungeonSetEnemyFlag(ens[0], "no_pers_wander", -1); + ens[0].faction = "Nevermere"; + + // Summon some permanent guards + + for (let i = 0; i < 2; i++) { + let point = KinkyDungeonGetNearbyPoint(ens[0].x, ens[0].y, true); + + if (point) { + let e = KinkyDungeonGetEnemy(["nevermere"], + MiniGameKinkyDungeonLevel + 2, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["nevermere"], undefined, + {"wolfgirl": {mult: 4, bonus: 10}}, ["miniboss", "boss"]); + if (e) { + let ee = DialogueCreateEnemy(point.x, point.y, e.name); + if (ee) { + ee.faction = "Nevermere"; + ee.AI = "looseguard"; + KinkyDungeonSetEnemyFlag(ens[0], "no_pers_wander", -1); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + } + } + }, + check: () => { + if (!KDMapData.KillTarget) //if this wasnt the escapemethod when this floor was created, spawn targets now + KinkyDungeonEscapeTypes.Kill.worldgenstart(); + + if (KDFactionAllied("Player", "Nevermere")) return true; + + var count = 0; + for (let enemy of KDMapData.Entities) { + if (KDEnemyHasFlag(enemy, "killtarget")) { + count++; + } + } + KDMapData.KillQuota = count; + return KDMapData.KillQuota <= 0; + }, + minimaptext: () => { + let escape = KinkyDungeonEscapeTypes.Kill.check(); + if (escape) + return TextGet(KDFactionAllied("Player", "Nevermere") ? "KDEscapeMinimap_Bypass_WolfServer" : "KDEscapeMinimap_Pass_WolfServer"); + else + return TextGet("KDEscapeMinimap_Fail_WolfServer").replace("NUMBER", KDMapData.KillQuota.toString()).replace("TYPE",TextGet("Name" + KDMapData.KillTarget)); + }, + doortext: () => { + return TextGet("KDEscapeDoor_WolfServer"); + }, + }, + "DroneNode": { + selectValid: true, + + filterRandom: (roomType, mapMod, level, faction) => { + if (level < 5) return 0; + return (faction == "AncientRobot" || faction == "Dollsmith" || faction == "Virus") ? 10 : 0; + }, + + worldgenstart: () => { + let faction = KDGetMainFaction(); + let robot = (faction == "AncientRobot" || faction == "Virus") ? "robot" : "oldrobot"; + let filter = (faction == "AncientRobot" || faction == "Virus") ? ["oldrobot"] : []; + let enemytype = KinkyDungeonGetEnemy(["robotServer", robot], KDGetEffLevel(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', + ["robotServer", "drone", robot], undefined, + {"server": {mult: 4, bonus: 10}}, ["nokillescape", ...filter]); + let enemynumber = 3; + if (KinkyDungeonStatsChoice.get("extremeMode")) enemynumber = 5; + else if (KinkyDungeonStatsChoice.get("hardMode")) enemynumber = 4; + + let data = {enemy: enemytype.name, number: enemynumber}; + KinkyDungeonSendEvent("calcEscapeDroneNodeTarget", data); + KDMapData.KillTarget = data.enemy; + KDMapData.KillQuota = data.number; + + let maxBoringness = Math.max(...KDMapExtraData.Boringness); + for (let i = 0; i < data.number; i++) { + let point = KinkyDungeonGetRandomEnemyPointCriteria((x, y) => { + return KinkyDungeonBoringGet(x, y) > 0.3 * maxBoringness; + }, true, false); + if (!point) point = KinkyDungeonGetRandomEnemyPointCriteria((x, y) => { + return KinkyDungeonBoringGet(x, y) > 0; + }, true, false); + if (!point) point = KinkyDungeonGetRandomEnemyPoint(true) + if (point) { + let ens = KinkyDungeonSummonEnemy(point.x, point.y, data.enemy, 1, 2.9); + KinkyDungeonSetEnemyFlag(ens[0], "killtarget", -1); + KinkyDungeonSetEnemyFlag(ens[0], "no_pers_wander", -1); + ens[0].faction = faction; + + // Summon some permanent guards + + for (let i = 0; i < 2; i++) { + let point = KinkyDungeonGetNearbyPoint(ens[0].x, ens[0].y, true); + + if (point) { + let e = KinkyDungeonGetEnemy(["drone", robot], + MiniGameKinkyDungeonLevel + 2, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + '0', + ["drone", robot], undefined, + {"drone": {mult: 4, bonus: 10}, [robot]: {mult: 4, bonus: 1}}, + ["miniboss", "boss", ...filter]); + if (e) { + let ee = DialogueCreateEnemy(point.x, point.y, e.name); + if (ee) { + ee.faction = faction; + ee.AI = "looseguard"; + KinkyDungeonSetEnemyFlag(ens[0], "no_pers_wander", -1); + KinkyDungeonSetEnemyFlag(ens[0], "led", -1); + KDRunCreationScript(ee, KDGetCurrentLocation()); + } + } + } + } + } + } + }, + check: () => { + if (!KDMapData.KillTarget) //if this wasnt the escapemethod when this floor was created, spawn targets now + KinkyDungeonEscapeTypes.Kill.worldgenstart(); + + if (KDFactionAllied("Player", "AncientRobot")) return true; + + var count = 0; + for (let enemy of KDMapData.Entities) { + if (KDEnemyHasFlag(enemy, "killtarget")) { + count++; + } + } + KDMapData.KillQuota = count; + return KDMapData.KillQuota <= 0; + }, + minimaptext: () => { + let escape = KinkyDungeonEscapeTypes.Kill.check(); + if (escape) + return TextGet(KDFactionAllied("Player", "Nevermere") ? + "KDEscapeMinimap_Bypass_DroneNode" + : "KDEscapeMinimap_Pass_DroneNode"); + else + return TextGet("KDEscapeMinimap_Fail_DroneNode").replace("NUMBER", + KDMapData.KillQuota.toString()).replace("TYPE",TextGet("Name" + KDMapData.KillTarget)); + }, + doortext: () => { + return TextGet("KDEscapeDoor_DroneNode"); + }, + }, + "Miniboss": { + selectValid: true, + worldgenstart: () => { + let category = "miniboss"; + if (KinkyDungeonStatsChoice.get("extremeMode")) category = "boss"; + + let enemytype = KinkyDungeonGetEnemy([category], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0',[category]); + if (!enemytype) { //fallback if it cant find a boss + category = "miniboss"; + enemytype = KinkyDungeonGetEnemy([category], KDGetEffLevel()+4,(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', [category]); + } + if (!enemytype) { //fallback if it cant find a miniboss + category = "witch"; + enemytype = KinkyDungeonGetEnemy([category], KDGetEffLevel()+4,(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', [category]); + } + let data = {enemy: enemytype.name}; + KinkyDungeonSendEvent("calcEscapeMinibossTarget", data); + KDMapData.KillTarget = data.enemy; + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (point) { + let ens = KinkyDungeonSummonEnemy(point.x, point.y, data.enemy, 1, 2.9); + KinkyDungeonSetEnemyFlag(ens[0], "killtarget", -1); + if (KinkyDungeonStatsChoice.get("hardMode") || KinkyDungeonStatsChoice.get("extremeMode")) KDMakeHighValue(ens[0]); + } + }, + check: () => { + if (!KDMapData.KillTarget) //if this wasnt the escapemethod when this floor was created, spawn targets now + KinkyDungeonEscapeTypes.Miniboss.worldgenstart(); + + for (let enemy of KDMapData.Entities) { + if (KDEnemyHasFlag(enemy, "killtarget")) { + return false; + } + } + return true; + }, + minimaptext: () => { + let escape = KinkyDungeonEscapeTypes.Miniboss.check(); + if (escape) + return TextGet("KDEscapeMinimap_Pass_Miniboss"); + else + return TextGet("KDEscapeMinimap_Fail_Miniboss").replace("TYPE",TextGet("Name" + KDMapData.KillTarget)); + }, + doortext: () => { + return TextGet("KDEscapeDoor_Miniboss"); + }, + }, + "Chest": { + selectValid: true, + worldgenstart: () => { + let count = 0; + for (let X = 1; X < KDMapData.GridWidth - 1; X++) { + for (let Y = 1; Y < KDMapData.GridHeight - 1; Y++) { + if (KinkyDungeonMapGet(X, Y) == 'C' && KinkyDungeonTilesGet(X+','+Y)?.Lock == undefined) { + if (KinkyDungeonFindPath(KDMapData.StartPosition.x, KDMapData.StartPosition.y, X, Y, false, false, false, KinkyDungeonMovableTilesSmartEnemy) != undefined) { + count++; + } + } + } + } + let quota = 5; + if (KinkyDungeonStatsChoice.get("extremeMode")) { + quota = 9; + } + else if (KinkyDungeonStatsChoice.get("hardMode")){ + quota = 7; + count = Math.floor(count*.75); + } + else { + count = Math.floor(count*.5); + } + + if (quota > count) quota = count; + let data = {number: quota}; + KinkyDungeonSendEvent("calcEscapeChestQuota", data); + KDMapData.ChestQuota = data.number; + }, + check: () => { + if (KDMapData.ChestQuota < 0) + KinkyDungeonEscapeTypes.Chest.worldgenstart(); + return KDMapData.ChestsOpened >= KDMapData.ChestQuota; + }, + minimaptext: () => { + let escape = KinkyDungeonEscapeTypes.Chest.check(); + if (escape) + return TextGet("KDEscapeMinimap_Pass_Chest"); + else + return TextGet("KDEscapeMinimap_Fail_Chest").replace("NUMBER", (KDMapData.ChestQuota - KDMapData.ChestsOpened).toString()); + }, + doortext: () => { + return TextGet("KDEscapeDoor_Chest"); + }, + }, + "Trap": { + selectValid: true, + worldgenstart: () => { + let count = 0; + for (let X = 1; X < KDMapData.GridWidth - 1; X++) { + for (let Y = 1; Y < KDMapData.GridHeight - 1; Y++) { + if (KinkyDungeonTilesGet(X+','+Y)?.Trap != undefined) { + if (KinkyDungeonFindPath(KDMapData.StartPosition.x, KDMapData.StartPosition.y, X, Y, false, false, false, KinkyDungeonMovableTilesSmartEnemy) != undefined) { + count++; + } + } + } + } + let quota = 10; + if (KinkyDungeonStatsChoice.get("extremeMode")) { + quota = 20; + } + else if (KinkyDungeonStatsChoice.get("hardMode")){ + quota = 15; + count = Math.floor(count*.75); + } + else { + count = Math.floor(count*.5); + } + if (quota > count) quota = count; + let data = {number: quota}; + KinkyDungeonSendEvent("calcEscapeTrapQuota", data); + KDMapData.TrapQuota = data.number; + }, + check: () => { + if (KDMapData.TrapQuota < 0) + KinkyDungeonEscapeTypes.Trap.worldgenstart(); + return KDMapData.TrapsTriggered >= KDMapData.TrapQuota; + }, + minimaptext: () => { + let escape = KinkyDungeonEscapeTypes.Trap.check(); + if (escape) + return TextGet("KDEscapeMinimap_Pass_Trap"); + else + return TextGet("KDEscapeMinimap_Fail_Trap").replace("NUMBER", (KDMapData.TrapQuota - KDMapData.TrapsTriggered).toString()); + }, + doortext: () => { + return TextGet("KDEscapeDoor_Trap"); + }, + }, + "Quest": { + selectValid: true, + requireMaxQuests: true, + worldgenstart: () => { + let quota = 1; + if (KinkyDungeonStatsChoice.get("extremeMode")) quota = 3; + else if (KinkyDungeonStatsChoice.get("hardMode")) quota = 2; + let data = {number: quota}; + KinkyDungeonSendEvent("calcEscapeQuestQuota", data); + KDMapData.QuestQuota = data.number; + }, + check: () => { + if (KDMapData.QuestQuota < 0) + KinkyDungeonEscapeTypes.Quest.worldgenstart(); + return KDMapData.QuestsAccepted >= KDMapData.QuestQuota; + }, + minimaptext: () => { + let escape = KinkyDungeonEscapeTypes.Quest.check(); + if (escape) + return TextGet("KDEscapeMinimap_Pass_Quest"); + else + return TextGet("KDEscapeMinimap_Fail_Quest").replace("NUMBER", (KDMapData.QuestQuota - KDMapData.QuestsAccepted).toString()); + }, + doortext: () => { + return TextGet("KDEscapeDoor_Quest"); + }, + }, + "Boss": { + selectValid: false, + check: () => { + return KinkyDungeonFlags.has("BossUnlocked") || (KDMapData.Entities.length == 0 || KDMapData.Entities.filter((en) => {return en.Enemy?.tags?.stageBoss;}).length == 0); + }, + minimaptext: () => { + let escape = KinkyDungeonEscapeTypes.Boss.check(); + if (escape) + return TextGet("KDEscapeMinimap_Pass_Boss"); + else + return TextGet("KDEscapeMinimap_Fail_Boss"); + }, + doortext: () => { + return TextGet("KDEscapeDoor_Boss"); + }, + }, + "SealSigil": { + selectValid: false, + check: () => { + return KDGameData.DragonCaptured || !!KDGameData.Collection[KDGameData.DragonTarget + ""] || KDGameData.SigilsErased >= KDGameData.SealErasedQuota; + }, + minimaptext: () => { + let escape = KinkyDungeonEscapeTypes.SealSigil.check(); + if (escape) + return TextGet(KDGameData.DragonCaptured ? "KDEscapeMinimap_PassKill_SealSigil" + : "KDEscapeMinimap_Pass_SealSigil"); + else + return TextGet("KDEscapeMinimap_Fail_SealSigil").replace("NUMBER", + "" + Math.round(KDGameData.SealErasedQuota - KDGameData.SigilsErased) + ); + }, + doortext: () => { + return TextGet("KDEscapeDoor_SealSigil"); + }, + worldgenstart: () => { + let quota = 1; + if (KinkyDungeonStatsChoice.get("extremeMode")) { + quota = 3; + } + else if (KinkyDungeonStatsChoice.get("hardMode")){ + quota = 2; + } + let data = {number: quota}; + + KinkyDungeonSendEvent("calcEscapeSealSigilQuota", data); + KDGameData.SealErasedQuota = data.number; + KDGameData.SigilsErased = 0; + KDGameData.DragonCaptured = true; + + // Gets all lairs, and if one of them is a persistent dragon we assign it, otherwise fail + for (let outpost of Object.keys(KDGetWorldMapLocation( + KDCoordToPoint( + KDGetCurrentLocation()))?.lairs)) { + if (KDPersonalAlt[outpost]?.OwnerNPC) { + + let NPC = KDGetPersistentNPC(KDPersonalAlt[outpost]?.OwnerNPC); + if (NPC && (NPC.trueEntity || NPC.entity)) { + let enemy = KinkyDungeonGetEnemyByName((NPC.trueEntity || NPC.entity).Enemy); + if (enemy?.tags?.dragongirl || enemy?.tags?.dragonqueen) { + KDGameData.DragonTarget = KDPersonalAlt[outpost].OwnerNPC; + KDGameData.DragonCaptured = false; + return; + } + } + } + } + }, + }, +}; + +function KDEscapeWorldgenStart(method: string) { + if (method) { + if (KinkyDungeonEscapeTypes[method] && KinkyDungeonEscapeTypes[method].worldgenstart) { + KinkyDungeonEscapeTypes[method].worldgenstart(); + } + } +} diff --git a/Game/src/map/KinkyDungeonMapMods.ts b/Game/src/map/KinkyDungeonMapMods.ts new file mode 100644 index 000000000..c6ef30841 --- /dev/null +++ b/Game/src/map/KinkyDungeonMapMods.ts @@ -0,0 +1,254 @@ +"use strict"; + +let KDMapMods: Record = { + "None": { + name: "None", + roomType: "", + weight: 800, + filter: (_slot) => { + return 1.0; + }, + tags: [], + bonusTags: {}, + bonussetpieces: [ + //{Type: "BanditPrison", Weight: 12}, + ], + altRoom: "", + }, + "Mold": { + name: "Mold", + roomType: "", + weight: 50, + filter: (slot) => { + if (slot?.y < 2) return 0; + return 1.0; + }, + tags: ["maid", "mold"], + faction: "Maidforce", + tagsOverride: ["maid", "mold"], + jailType: "Maidforce", + guardType: "Maidforce", + bonusTags: { + "mold": {bonus: 4, mult: 2.5}, + "maid": {bonus: 5, mult: 1.5}, + "construct": {bonus: 0, mult: 0}, + }, + altRoom: "", + spawnBoxes: [ + {requiredTags: ["mold"], tags: [], currentCount: 0, maxCount: 0.5, ignoreAllyCount: true}, + {requiredTags: ["maid"], tags: [], currentCount: 0, maxCount: 0.25, ignoreAllyCount: true}, + ], + }, + "Bandit": { + name: "Bandit", + roomType: "", + weight: 50, + tags: ["bandit", "banditleader", "bountyhunter", "dragon"], + faction: "Bandit", + jailType: "Bandit", + guardType: "Bandit", + filter: (slot) => { + if (slot?.y < 2) return 0; + return 1.0; + }, + bonusTags: { + "bandit": {bonus: 4, mult: 2.5}, + "bountyhunter": {bonus: 1, mult: 2.5}, + "banditleader": {bonus: 40, mult: 0.3}, + }, + altRoom: "", + spawnBoxes: [ + {requiredTags: ["bandit"], tags: [], currentCount: 0, maxCount: 0.4, ignoreAllyCount: true}, + {requiredTags: ["bountyhunter"], tags: [], currentCount: 0, maxCount: 0.2, ignoreAllyCount: true}, + ], + }, + "Dragon": { + name: "Dragon", + roomType: "", + weight: 50, + tags: ["dragon"], + faction: "Dragon", + jailType: "Dragon", + guardType: "Dragon", + escapeMethod: "SealSigil", + filter: (slot) => { + if (slot?.y < 2) return 0; + if (KDNoDragonLairCheckpoints.includes(slot.Checkpoint)) return 0; + return 1.0; + }, + bonusTags: { + "dragon": {bonus: 7, mult: 2}, + "draconic": {bonus: 4, mult: 1.5}, + "dragongirl": {bonus: 4, mult: 0.5}, + }, + bonussetpieces: [ + {Type: "BanditPrison", Weight: 8}, + ], + altRoom: "", + worldGenScript: (coord) => { + // Creates a dragon! + let point = KinkyDungeonGetRandomEnemyPoint(true); + if (!point) return; + let dlist = KDDragonList.filter((dragon) => { + return (!dragon.minfloor || MiniGameKinkyDungeonLevel >= dragon.minfloor) && (!dragon.maxfloor || MiniGameKinkyDungeonLevel <= dragon.maxfloor); + }); + let def = dlist[Math.floor(KDRandom() * dlist.length)]; + if (def) { + if (!def.enemy) def.enemy = "DragonGirlCrystal"; + let en = DialogueCreateEnemy(point.x, point.y,def.enemy); + if (en) { + if (def.faction) en.faction = def.faction; + KinkyDungeonSetEnemyFlag(en, "leader", -1); + KDRunCreationScript(en, KDGetCurrentLocation()); + } + } + }, + spawnBoxes: [ + {requiredTags: ["dragon"], tags: [], currentCount: 0, maxCount: 0.33, ignoreAllyCount: true}, + //{requiredTags: ["elemental"], tags: [], currentCount: 0, maxCount: 0.33, ignoreAllyCount: true}, + ], + }, + "Witch": { + name: "Witch", + roomType: "", + weight: 50, + tags: ["witch", "apprentice", "skeleton"], + faction: "Witch", + jailType: "Witch", + guardType: "Apprentice", + filter: (slot) => { + if (slot?.y < 2) return 0; + return 1.0; + }, + bonusTags: { + "witch": {bonus: 3, mult: 1.5}, + "apprentice": {bonus: 3, mult: 1.4}, + }, + altRoom: "", + spawnBoxes: [ + {requiredTags: ["witch"], tags: [], currentCount: 0, maxCount: 0.25, ignoreAllyCount: true}, + {requiredTags: ["apprentice"], tags: [], currentCount: 0, maxCount: 0.25, ignoreAllyCount: true}, + ], + }, + "Wolf": { + name: "Wolf", + roomType: "", + weight: 70, + tags: ["nevermere"], + faction: "Nevermere", + jailType: "Nevermere", + guardType: "Nevermere", + escapeMethod: "WolfServer", + filter: (slot) => { + if (slot?.y < 3) return 0; + return 1.0; + }, + bonusTags: { + "nevermere": {bonus: 11, mult: 1.5}, + "trainer": {bonus: 11, mult: 0.75}, + }, + altRoom: "", + spawnBoxes: [ + {requiredTags: ["nevermere"], tags: [], currentCount: 0, maxCount: 0.3, ignoreAllyCount: true}, + ], + }, + "Robot": { + name: "Robot", + roomType: "", + weight: 35, + tags: ["robot", "robotturret"], + faction: "AncientRobot", + jailType: "AncientRobot", + guardType: "AncientRobot", + escapeMethod: "DroneNode", + filter: (slot) => { + if (slot?.y < 3) return 0; + return 1.0; + }, + bonusTags: { + "robot": {bonus: 10, mult: 4}, + }, + altRoom: "", + spawnBoxes: [ + {requiredTags: ["robot"], tags: [], currentCount: 0, maxCount: 0.3, ignoreAllyCount: true}, + ], + }, + "Plant": { + name: "Plant", + roomType: "", + weight: 50, + tags: ["plant", "elf"], + jailType: "Elf", + guardType: "Elf", + faction: "Elf", + filter: (slot) => { + if (slot?.y < 2) return 0; + return 1.0; + }, + bonusTags: { + "plant": {bonus: 5, mult: 2}, + "maid": {bonus: 4.5, mult: 1}, + }, + altRoom: "", + spawnBoxes: [ + {requiredTags: ["plant"], tags: [], currentCount: 0, maxCount: 0.35, ignoreAllyCount: true}, + ], + }, + "Slime": { + name: "Slime", + roomType: "", + weight: 50, + tags: ["slime", "alchemist"], + faction: "Alchemist", + jailType: "Alchemist", + guardType: "Alchemist", + filter: (slot) => { + if (slot?.y < 2) return 0; + return 1.0; + }, + bonusTags: { + "slime": {bonus: 1.5, mult: 2}, + "maid": {bonus: 4.5, mult: 1.5}, + "alchemist": {bonus: 1.5, mult: 1.5}, + }, + altRoom: "", + spawnBoxes: [ + {requiredTags: ["slime"], tags: [], currentCount: 0, maxCount: 0.3, ignoreAllyCount: true}, + ], + }, +}; + +// KDGetMapGenList(3, KDMapMods); +/** + * @param count + * @param mods + * @param slot + */ +function KDGetMapGenList(count: number, mods: Record, slot: KDJourneySlot): MapMod[] { + let ret: MapMod[] = []; + for (let i = 0; i < count; i++) { + let genWeightTotal = 0; + let genWeights = []; + let mult = 1.0; + + for (let mod of Object.values(mods)) { + if (!ret.includes(mod)) { + mult = mod.filter(slot); + if (mult > 0) { + genWeights.push({mod: mod, weight: genWeightTotal}); + genWeightTotal += mod.weight * mult; + } + } + } + + let selection = KDRandom() * genWeightTotal; + + for (let L = genWeights.length - 1; L >= 0; L--) { + if (selection > genWeights[L].weight) { + ret.push(genWeights[L].mod); + break; + } + } + } + return ret; +} diff --git a/Game/src/map/KinkyDungeonObject.ts b/Game/src/map/KinkyDungeonObject.ts new file mode 100644 index 000000000..1821841dd --- /dev/null +++ b/Game/src/map/KinkyDungeonObject.ts @@ -0,0 +1,765 @@ +"use strict"; + +/** + * Script happens when you display an object message + */ +let KDObjectMessages: Record void> = { + "Ghost": () => KinkyDungeonGhostMessage(), + "Angel": () => KinkyDungeonAngelMessage(), + "Food": () => KinkyDungeonFoodMessage(), + "Elevator": () => KinkyDungeonElevatorMessage(), +}; +/** + * Script happens when you move to an object + * MUTUALLY exclusive with KDObjectDraw, as this + * overrides the default behavior of clicking on the object and bringing up a modal + */ +let KDObjectClick: Record boolean> = { + "Food": (x, y) => { + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile.Food && KDFood[tile.Food] && !KDFood[tile.Food].inedible && !tile.Eaten) { + KinkyDungeonTargetTileLocation = x + "," + y; + KinkyDungeonTargetTile = tile; + KDStartDialog("TableFood", "", true, ""); + return true; + } else + KinkyDungeonFoodMessage(tile); + return false; + }, + "Elevator": (x, y) => { + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (!KDGameData.ElevatorsUnlocked) KDGameData.ElevatorsUnlocked = {}; + if (!KDGameData.ElevatorsUnlocked[MiniGameKinkyDungeonLevel]) { + if ((!altType?.elevatorCondition && !KDMapData.Entities.some((enemy) => { + return KDEnemyRank(enemy) > 2 && (KDHostile(enemy) || KinkyDungeonAggressive(enemy)) && !KDHelpless(enemy); + })) || (altType?.elevatorCondition && altType.elevatorCondition(x, y))) { + KDGameData.ElevatorsUnlocked[MiniGameKinkyDungeonLevel] = KDGameData.RoomType; // Unlock! + let tile = KinkyDungeonTilesGet(x + ',' + y); + if (tile) { + tile.Overlay = "Elevator"; + } + } + } + if (KDGameData.ElevatorsUnlocked[MiniGameKinkyDungeonLevel]) { + KDStartDialog("Elevator", "", true, ""); + return true; + } else + KinkyDungeonElevatorMessage(); + return false; + }, + "Oriel": (_x, _y) => { + KDStartDialog("Oriel", "", true, ""); + return true; + }, + "WardenCourier": (_x, _y) => { + KDStartDialog("WardenCourier", "", true, ""); + return true; + }, +}; +/** + * Script happens when you interact to an object + */ +let KDObjectInteract: Record boolean> = { + "DollDropoff": (x, y, dist) => { + if ((dist != undefined ? dist : KDistChebyshev(x - KDPlayer().x, y - KDPlayer().y)) < 1.5) { + //if (!KinkyDungeonGetRestraintItem("ItemDevices")) { + KDGameData.InteractTargetX = x; + KDGameData.InteractTargetY = y; + KDStartDialog("DollDropoff", "", true); + return true; + } + return false; + //} + }, + 'Portal': (moveX, moveY) => { + if (KDTile(moveX, moveY) && KDTile(moveX, moveY).Portal) { + KDMovePlayer(moveX, moveY, true, false); + KDStartDialog(KDTile(moveX, moveY).Portal, "", true); + } + return false; + }, + "Furniture": (x, y, dist) => { + if ((dist != undefined ? dist : KDistChebyshev(x - KDPlayer().x, y - KDPlayer().y)) < 1.5) { + //if (!KinkyDungeonGetRestraintItem("ItemDevices")) { + KDGameData.InteractTargetX = x; + KDGameData.InteractTargetY = y; + KDStartDialog("Furniture", "", true); + return true; + } + return false; + //} + }, + "Door": (x, y) => { + if (KinkyDungeonMapGet(x, y) == 'D') { + + if (KinkyDungeonTilesGet(x + ',' + y)?.Lock) { + + KinkyDungeonTilesGet(x + ',' + y).LockSeen = + KinkyDungeonTilesGet(x + ',' + y).Lock; + + KDDelayedActionPrune(["Action", "World"]); + KinkyDungeonTargetTileLocation = "" + x + "," + y; + KinkyDungeonTargetTile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); + KDModalArea = false; + + + KinkyDungeonTargetTileMsg(); + return true; + } else { + if (KinkyDungeonTilesGet(x + ',' + y)) { + KinkyDungeonTilesGet(x + ',' + y).LockSeen = undefined; + } + KDAttemptDoor(x, y); + return true; + } + } else if (!KinkyDungeonEntityAt(x, y, false, undefined, undefined, true)) { + + if (KinkyDungeonTilesGet(x + ',' + y)) { + KinkyDungeonTilesGet(x + ',' + y).LockSeen = undefined; + } + KinkyDungeonCloseDoor(x, y); + return true; + } + return false; + }, +}; +/** + * Script happens when you interact to an tile + */ +let KDTileInteract: Record boolean> = { + 'B': (x, y, dist) => { + if (dist != undefined ? dist : KDistChebyshev(x - KDPlayer().x, y - KDPlayer().y) < 1.5) + if (!KinkyDungeonFlags.get("slept") && !KinkyDungeonFlags.get("nobed") && KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.49) { + KDGameData.InteractTargetX = x; + KDGameData.InteractTargetY = y; + KDStartDialog("Bed", "", true); + return true; + } + return false; + }, + 'c': (x, y, dist) => { + if (dist != undefined ? dist : KDistChebyshev(x - KDPlayer().x, y - KDPlayer().y) < 1.5) + KDGameData.InteractTargetX = x; + KDGameData.InteractTargetY = y; + // Open container + KDUI_CurrentContainer = KDGetContainer("Chest", {x: x, y: y}, KDGetCurrentLocation(), + true)?.name; + if (KDUI_CurrentContainer) { + KDUI_ContainerBackScreen = KinkyDungeonDrawState; + KinkyDungeonDrawState = "Container"; + KinkyDungeonCurrentFilter = "All"; + KDUI_Container_LastSelected = "Chest"; + return true; + } + return false; + }, +}; +/** + * Script to handle click in an object's modal + * tbh should remove this soon + */ +let KDObjectHandle: Record boolean> = { + "Charger": () => KinkyDungeonHandleCharger(), +}; +/** + * Determines if an object has an interface and also if it pauses the game when you click on it + * You dont need an interface (for example the updated food table) but then you need + * an entry in KDObjectClick instead. + */ +let KDObjectDraw: Record void> = { + "Ghost": () => KinkyDungeonDrawGhost(), + "Angel": () => KinkyDungeonDrawAngel(), + "Charger": () => KinkyDungeonDrawCharger(), + "Tablet": () => KinkyDungeonDrawTablet(), + //"Food": () => KinkyDungeonDrawFood(), + "Lock": () => KinkyDungeonDrawLock(), + "Shrine": () => KinkyDungeonDrawShrine(), + "Door": () => KinkyDungeonDrawDoor(), + Orb: () => KDDrawOrb(), +}; + +function KinkyDungeonDrawDoor() { + if (KinkyDungeonTargetTile.Lock) { + KDModalArea_height = 400; + KDModalArea_width = 1000; + let action = false; + //if (KDLocks[KinkyDungeonTargetTile.Lock].pickable + //|| KDLocks[KinkyDungeonTargetTile.Lock].unlockable + //|| KDLocks[KinkyDungeonTargetTile.Lock].commandable) { + action = true; + KDModalArea = true; + KDModalArea_y = 700; + //} + DrawButtonKDEx("ModalDoorPick", () => { + if (KinkyDungeonTargetTile) + if (KinkyDungeonItemCount("Pick") > 0 && (KDLocks[KinkyDungeonTargetTile.Lock].canPick({target: KinkyDungeonTargetTile, location: KinkyDungeonTargetTileLocation}))) { + // Done, converted to input + KDSendInput("pick", {targetTile: KinkyDungeonTargetTileLocation}); + return true; + } + return true; + }, true, KDModalArea_x + 450, KDModalArea_y + 100, 250, 60, TextGet("KinkyDungeonPickDoor"), + (KDLocks[KinkyDungeonTargetTile.Lock].pickable) + ? (KDLocks[KinkyDungeonTargetTile.Lock].canPick({target: KinkyDungeonTargetTile, location: KinkyDungeonTargetTileLocation}) ? "#ffffff" : "#ff5277") + : "#888888", "", ""); + + DrawButtonKDEx("ModalDoorUnlock", () => { + if (KinkyDungeonTargetTile) + if ((KDLocks[KinkyDungeonTargetTile.Lock].canUnlock({target: KinkyDungeonTargetTile, location: KinkyDungeonTargetTileLocation}))) { + // Done, converted to input + KDSendInput("unlock", {targetTile: KinkyDungeonTargetTileLocation}); + return true; + } + return true; + }, true, KDModalArea_x + 175, KDModalArea_y + 100, 250, 60, TextGet("KinkyDungeonUnlockDoor"), + (KDLocks[KinkyDungeonTargetTile.Lock].unlockable) ? + (KDLocks[KinkyDungeonTargetTile.Lock].canUnlock({target: KinkyDungeonTargetTile, location: KinkyDungeonTargetTileLocation}) ? "#ffffff" : "#ff5277") + : "#888888", "", ""); + let spell = KinkyDungeonFindSpell("CommandWord", true); + DrawButtonKDEx("ModalDoorCmd", () => { + if (KinkyDungeonTargetTile) + if (((KinkyDungeonTargetTile.Lock.includes("Purple") && KinkyDungeonStatMana > KinkyDungeonGetManaCost(KinkyDungeonFindSpell("CommandWord", true))))) { + // Done, converted to input + KDSendInput("commandunlock", {targetTile: KinkyDungeonTargetTileLocation}); + return true; + } + return true; + }, true, KDModalArea_x + 725, KDModalArea_y + 100, 250, 60, TextGet("KinkyDungeonUnlockDoorPurple"), + KDLocks[KinkyDungeonTargetTile.Lock].commandable + ? ((KinkyDungeonStatMana >= KinkyDungeonGetManaCost(spell)) ? "#ffffff" : "#ff5277") + : "#888888", + "", ""); + + if (KDLocks[KinkyDungeonTargetTile.Lock].specialActions) { + KDLocks[KinkyDungeonTargetTile.Lock].specialActions(KinkyDungeonTargetTile, KinkyDungeonPlayerEntity); + } + + + if (!action) DrawTextKD(TextGet("KinkyDungeonLockedDoor"), KDModalArea_x + 300, KDModalArea_y + 150, "#ffffff", "#333333"); + + if (KinkyDungeonTargetTile.Lock) + DrawTextKD(TextGet("Kinky" + KinkyDungeonTargetTile.Lock + "Lock"), KDModalArea_x + 25, KDModalArea_y + 150, "#ffffff", "#333333"); + } else { + KDModalArea = true; + DrawButtonVis(KDModalArea_x + 25, KDModalArea_y + 100, 250, 60, TextGet("KinkyDungeonCloseDoor"), "#ffffff"); + } +} + +/** Chest lock */ +function KinkyDungeonDrawLock() { + if (KinkyDungeonTargetTile.Lock) { + KDModalArea_height = 400; + KDModalArea_width = 1000; + let action = false; + if ((KDLocks[KinkyDungeonTargetTile.Lock].pickable)) { + action = true; + KDModalArea = true; + DrawButtonKDEx("ModelLockPick", () => { + if (KinkyDungeonTargetTile) + if (KinkyDungeonItemCount("Pick") > 0 && (KDLocks[KinkyDungeonTargetTile.Lock].canPick({target: KinkyDungeonTargetTile, location: KinkyDungeonTargetTileLocation}))) { + // Done, converted to input + KDSendInput("pick", {targetTile: KinkyDungeonTargetTileLocation}); + return true; + } + return true; + }, true, KDModalArea_x + 313, KDModalArea_y + 25, 112, 60, TextGet("KinkyDungeonPickDoor"), + (KDLocks[KinkyDungeonTargetTile.Lock].canPick({target: KinkyDungeonTargetTile, location: KinkyDungeonTargetTileLocation})) ? "#ffffff" : "#ff5277", "", ""); + } + + if ((KDLocks[KinkyDungeonTargetTile.Lock].unlockable)) { + action = true; + KDModalArea = true; + DrawButtonKDEx("ModalLockUnlock", () => { + if (KinkyDungeonTargetTile) + if ((KDLocks[KinkyDungeonTargetTile.Lock].canUnlock({target: KinkyDungeonTargetTile, location: KinkyDungeonTargetTileLocation}))) { + // Done, converted to input + KDSendInput("unlock", {targetTile: KinkyDungeonTargetTileLocation}); + return true; + } + return true; + }, true, KDModalArea_x + 175, KDModalArea_y + 25, 112, 60, TextGet("KinkyDungeonUnlockDoor"), + (KDLocks[KinkyDungeonTargetTile.Lock].canUnlock({target: KinkyDungeonTargetTile, location: KinkyDungeonTargetTileLocation})) ? "#ffffff" : "#ff5277", "", ""); + } + if ((KinkyDungeonTargetTile.Lock.includes("Purple"))) { + action = true; + KDModalArea = true; + let spell = KinkyDungeonFindSpell("CommandWord", true); + DrawButtonKDEx("ModalLockCmd", () => { + if (KinkyDungeonTargetTile) + if (((KinkyDungeonTargetTile.Lock.includes("Purple") && KinkyDungeonStatMana > KinkyDungeonGetManaCost(KinkyDungeonFindSpell("CommandWord", true))))) { + // Done, converted to input + KDSendInput("commandunlock", {targetTile: KinkyDungeonTargetTileLocation}); + return true; + } + return true; + }, true, KDModalArea_x + 175, KDModalArea_y + 25, 112, 60, TextGet("KinkyDungeonUnlockDoorPurple"), + (KinkyDungeonStatMana >= KinkyDungeonGetManaCost(spell)) ? "#ffffff" : "#ff5277", + "", ""); + } + + if (!action) DrawTextKD(TextGet("KinkyDungeonLockedDoor"), KDModalArea_x + 300, KDModalArea_y + 50, "#ffffff", "#333333"); + + if (KinkyDungeonTargetTile.Lock.includes("Red")) + DrawTextKD(TextGet("KinkyRedLock"), KDModalArea_x + 50, KDModalArea_y + 50, "#ffffff", "#333333"); + else if (KinkyDungeonTargetTile.Lock.includes("Blue")) + DrawTextKD(TextGet("KinkyBlueLock"), KDModalArea_x + 50, KDModalArea_y + 50, "#ffffff", "#333333"); + else if (KinkyDungeonTargetTile.Lock.includes("Purple")) + DrawTextKD(TextGet("KinkyPurpleLock"), KDModalArea_x + 50, KDModalArea_y + 50, "#ffffff", "#333333"); + } +} + +function KinkyDungeonDrawGhost() { + if (KDGameData.CurrentDialog) return; + if (KinkyDungeonTargetTile.GhostDecision == 0) DrawTextKD(TextGet("KinkyDungeonDrawGhostHelpful"), KDModalArea_x + 200, KDModalArea_y + 50, "white", KDTextGray2); + else DrawTextKD(TextGet("KinkyDungeonDrawGhostUnhelpful"), KDModalArea_x + 200, KDModalArea_y + 50, "white", KDTextGray2); +} +function KinkyDungeonDrawAngel() { + DrawTextKD(TextGet("KinkyDungeonDrawAngelHelpful"), KDModalArea_x + 200, KDModalArea_y + 50, "white", KDTextGray2); +} + +function KinkyDungeonElevatorMessage() { + KinkyDungeonSendActionMessage(10, TextGet("KDElevatorBroken"), "white", 3); +} + +function KinkyDungeonGhostMessage() { + + if (KinkyDungeonTargetTile.Dialogue) { + KDStartDialog(KinkyDungeonTargetTile.Dialogue, "Ghost", true, "", undefined); + if (KinkyDungeonTargetTile.Msg && KDGameData.CurrentDialog) { + KDGameData.CurrentDialogMsg = KinkyDungeonTargetTile.Msg; + } + return; + } else if (KinkyDungeonTargetTile.Msg) { + KDStartDialog("GhostInfo", "Ghost", true, "", undefined); + if (KDGameData.CurrentDialog) { + KDGameData.CurrentDialogMsg = KinkyDungeonTargetTile.Msg; + } + return; + } + let restraints = KinkyDungeonAllRestraint(); + let msg = ""; + if (restraints.length == 0) { + msg = TextGet("KinkyDungeonGhostGreet" + KinkyDungeonTargetTile.GhostDecision); + } else { + if (KinkyDungeonTargetTile.GhostDecision <= 1) { + msg = TextGet("KinkyDungeonGhostHelpful" + KinkyDungeonTargetTile.GhostDecision); + } else { + let BoundType = "Generic"; + if (!KinkyDungeonCanTalk() && Math.random() < 0.33) BoundType = "Gag"; + if ((KinkyDungeonIsHandsBound() || KinkyDungeonIsArmsBound()) && Math.random() < 0.33) BoundType = "Arms"; + if (KinkyDungeonSlowLevel > 0 && Math.random() < 0.33) BoundType = "Feet"; + if (KinkyDungeonChastityMult() > 0 && Math.random() < 0.33) BoundType = "Chaste"; + + msg = TextGet("KinkyDungeonGhostUnhelpful" + BoundType + KinkyDungeonTargetTile.GhostDecision); + } + } + if (msg) { + KinkyDungeonSendActionMessage(3, msg, "white", 3); + } +} + +function KinkyDungeonAngelMessage() { + let restraints = KinkyDungeonAllRestraint(); + let msg = ""; + if (restraints.length == 0) { + msg = TextGet("KinkyDungeonAngelGreet"); + } else { + msg = TextGet("KinkyDungeonAngelHelpful"); + } + if (msg) { + KinkyDungeonSendActionMessage(3, msg, "#ffffff", 1, true); + } +} + +function KinkyDungeonFoodMessage(Tile?: any) { + let tile = Tile || KinkyDungeonTargetTile; + if (tile) { + let msg = TextGet("KinkyDungeonFood" + (tile.Food ? tile.Food : "")); + + if (msg) { + KinkyDungeonSendActionMessage(3, msg, "#ffffff", 1, true); + } + } + +} + +function KinkyDungeonMakeGhostDecision() { + for (let tile of Object.values(KDMapData.Tiles)) { + if (tile.Type == "Ghost") { + tile.GhostDecision = 0; + + let rep = KinkyDungeonGoddessRep.Ghost; + + if (rep > 0) tile.GhostDecision += 1; + if (rep != undefined) { + let mult = KinkyDungeonStatsChoice.get("Oppression") ? 1.5 : (KinkyDungeonStatsChoice.has("Dominant") ? 0.5 : 1.0); + if (KDRandom() * 100 * mult > -rep + 75) tile.GhostDecision += 1; + if (KDRandom() * 100 * mult > -rep + 85) tile.GhostDecision += 1; + if (KDRandom() * 100 * mult > -rep + 95) tile.GhostDecision += 1; + } + } + } +} + +function KinkyDungeonDrawCharger() { + KDModalArea = true; + //DrawTextKD(TextGet("KinkyDungeonCharger"), KDModalArea_x + 200, KDModalArea_y + 50, "white", KDTextGray2); + if (KinkyDungeonTargetTile && KinkyDungeonTargetTile.Light == KDChargerLight) { + DrawButtonVis(KDModalArea_x + 25, KDModalArea_y + 25, 400, 60, TextGet("KinkyDungeonChargerRemoveCrystal"), "white", "", ""); + } else { + DrawButtonVis(KDModalArea_x + 250, KDModalArea_y + 25, 200, 60, TextGet("KinkyDungeonChargerCharge"), KinkyDungeonInventoryGet("AncientPowerSourceSpent") ? "white" : "#888888", "", ""); + DrawButtonVis(KDModalArea_x + 25, KDModalArea_y + 25, 200, 60, TextGet("KinkyDungeonChargerPlaceCrystal"), KinkyDungeonInventoryGet("AncientPowerSource") ? "white" : "#888888", "", ""); + } + + +} + +function KinkyDungeonDrawTablet() { + if (!KDModalArea) KDStatChoice = ""; + KDModalArea = true; + //DrawTextKD(TextGet("KinkyDungeonCharger"), KDModalArea_x + 200, KDModalArea_y + 50, "white", KDTextGray2); + if (KinkyDungeonTargetTile) { + if (KinkyDungeonTargetTile.Name == "Heart") { + KDDrawHeartTablet(); + } else { + DrawButtonKDEx("Tablet",(_bdata) => { + KDSendInput("tabletInteract", {action: "read", targetTile: KinkyDungeonTargetTileLocation}); + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + return true; + }, true, KDModalArea_x + 25, KDModalArea_y + 25, 400, 60, TextGet("KinkyDungeonTabletRead"), "white", "", ""); + } + } +} + +function KinkyDungeonDrawFood() { + KDModalArea = true; + if (KinkyDungeonTargetTile && KinkyDungeonTargetTile.Food && KinkyDungeonTargetTile.Food != "Plate") { + DrawButtonKDEx("Food",(_bdata) => { + KDSendInput("foodInteract", {action: "eat", targetTile: KinkyDungeonTargetTileLocation}); + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + return true; + }, true, KDModalArea_x + 25, KDModalArea_y + 25, 400, 60, TextGet("KinkyDungeonFoodEat"), "white", "", ""); + } +} + +let KDChargerLight = 6.5; +let KDChargerColor = 0xffee83; +let KDLeylineLightColor = 0x4477ff; +let KDLeylineLight = 8; + +function KinkyDungeonHandleCharger() { + if (KinkyDungeonTargetTile && KinkyDungeonTargetTile.Light == KDChargerLight) { + if (MouseIn(KDModalArea_x + 25, KDModalArea_y + 25, 400, 60) && KinkyDungeonTargetTile) { + KDSendInput("chargerInteract", {action: "remove", targetTile: KinkyDungeonTargetTileLocation}); + return true; + } + } else { + if (MouseIn(KDModalArea_x + 250, KDModalArea_y + 25, 200, 60)) { + if (KDSendInput("chargerInteract", {action: "charge", targetTile: KinkyDungeonTargetTileLocation})) { + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDModalArea = false; + } + return true; + } else if (MouseIn(KDModalArea_x + 25, KDModalArea_y + 25, 200, 60) && KinkyDungeonTargetTile) { + KDSendInput("chargerInteract", {action: "place", targetTile: KinkyDungeonTargetTileLocation}); + return true; + } + } + + return false; +} + + + + +function KDHandleModalArea() { + if (KinkyDungeonTargetTile.Type && + ((KinkyDungeonTargetTile.Type == "Lock" && KinkyDungeonTargetTile.Lock) || (KinkyDungeonTargetTile.Type == "Door" && KinkyDungeonTargetTile.Lock))) { + // Done, converted to input + } else if (KinkyDungeonTargetTile.Type == "Shrine") { + // Done, converted to input + if (KinkyDungeonHandleShrine()) { + return true; + // if (KinkyDungeonSound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); + } + } else if (KDObjectHandle[KinkyDungeonTargetTile.Type]) { + return KDObjectHandle[KinkyDungeonTargetTile.Type](); + } else if (KinkyDungeonTargetTile.Type == "Door") { + if (MouseIn(KDModalArea_x + 25, KDModalArea_y + 25, 350, 60)) { + // Done, converted to input + KDSendInput("closeDoor", {targetTile: KinkyDungeonTargetTileLocation}); + return true; + } + } + return false; +} + +let KDAlwaysUnlockedElevFloors = { + "Summit": true +}; +let KDElevatorFloorIndex = { + Summit: { + Floor: 0, + RoomType: "Summit", + MapMod: undefined, + Checkpoint: "vault", + MapFaction: "Player", + EscapeMethod: "None", + }, +}; + +/** + * @param num + */ +function KDIsElevatorFloorUnlocked(num: string | number): boolean { + return typeof num === "string" ? (KDGameData.ElevatorsUnlocked[num] || KDAlwaysUnlockedElevFloors[num]) + : num != MiniGameKinkyDungeonLevel && KDGameData.ElevatorsUnlocked[num]; +} + +/** + * @param floor + */ +function KDElevatorToFloor(floor: number, RoomType: string, x: number = 0) { + // Only works if the map has been generated + let slot = KDWorldMap['0,' + floor]; + if (slot) { + if (RoomType) { + let subslot = KDElevatorFloorIndex[RoomType] || (slot.data ? slot.data[RoomType] : null); + if (subslot) { + let params = KinkyDungeonMapParams[subslot.Checkpoint] || (slot.data[slot.main]?.Checkpoint ? KinkyDungeonMapParams[slot.data[slot.main].Checkpoint] : undefined); + KDSetWorldSlot(x, floor); + KinkyDungeonCreateMap(params, + RoomType, + undefined, + floor, + undefined, + undefined, + subslot.MapFaction, + {x: 0, y: floor}, + true, + undefined, + undefined, + subslot.EscapeMethod); + KDMovePlayer(KDMapData.StartPosition.x, KDMapData.StartPosition.y - 2, true); + } + } else { + let subslot = slot.data.ElevatorRoom; + if (subslot) { + let params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[subslot.Checkpoint] || subslot.Checkpoint)]; + KDSetWorldSlot(x, floor); + KinkyDungeonCreateMap(params, + subslot.RoomType, + subslot.MapMod, + floor, + undefined, + undefined, + subslot.MapFaction, + {x: 0, y: floor}, + true, + undefined, + undefined, + subslot.EscapeMethod); + KDMovePlayer(KDMapData.StartPosition.x, KDMapData.StartPosition.y - 2, true); + } + } + } +} + +let KDBuyableStats = [ + "SP", + "MP", + "WP", + "AP", +]; + +let KDStat = { + AP: { + getMax: (_player) => {return KinkyDungeonStatDistractionMax;}, + getCurrent: (_player) => {return KinkyDungeonStatDistraction;}, + }, + SP: { + getMax: (_player) => {return KinkyDungeonStatStaminaMax;}, + getCurrent: (_player) => {return KinkyDungeonStatStamina;}, + }, + MP: { + getMax: (_player) => {return KinkyDungeonStatManaMax;}, + getCurrent: (_player) => {return KinkyDungeonStatMana;}, + }, + WP: { + getMax: (_player) => {return KinkyDungeonStatWillMax;}, + getCurrent: (_player) => {return KinkyDungeonStatWill;}, + getAmnt2: (amnt: number) => {return 0.01*Math.floor(100*amnt*0.02);}, + }, +}; + +let KDStatChoice = ""; + +function KDDrawHeartTablet() { + let modalHeight = 200 + 50 * KDBuyableStats.length; + + KDModalArea_y = 800 - modalHeight; + KDModalArea_height = modalHeight + 100; + KDModalArea_width = 900; + + FillRectKD(kdcanvas, kdpixisprites, "modalbg", { + Left: KDModalArea_x, + Top: KDModalArea_y,// + 25 - modalHeight, + Width: KDModalArea_width, + Height: modalHeight + 25, + Color: KDButtonColor, + LineWidth: 1, + zIndex: 60, + alpha: 0.8, + }); + DrawRectKD(kdcanvas, kdpixisprites, "modalbg2", { + Left: KDModalArea_x, + Top: KDModalArea_y,// + 25 - modalHeight, + Width: KDModalArea_width, + Height: modalHeight + 25, + Color: KDBorderColor, + LineWidth: 1, + zIndex: 60.1, + alpha: 1.0, + }); + + DrawTextFitKD(TextGet("KDStatBuy1"), + KDModalArea_x + 450, KDModalArea_y + 70, 800, "#ffffff", undefined, 28,); + DrawTextFitKD(TextGet("KDStatBuy2"), + KDModalArea_x + 450, KDModalArea_y + 100, 800, "#ffffff", undefined, 28,); + + let II = 0; + for (let stat of KDBuyableStats) { + let statMax = KDStat[stat].getMax(KinkyDungeonPlayerEntity); + let canBuy = statMax < KDMaxStat; + + let amount = 2.5; + if (statMax >= 20) amount -= 0.5; + if (statMax >= 30) amount -= 1; + + DrawButtonKDEx("heartbuy" + stat, (_bdata) => { + //KDSendInput("shrineBuy", {type: type, shopIndex: KinkyDungeonShopIndex}); + if (canBuy) + KDStatChoice = stat; + return true; + }, true, KDModalArea_x + 50, KDModalArea_y + 155 + 60 * II, 200, 45, TextGet("KDStatBuy" + stat), "#ffffff", "", "", false, + !canBuy, KDStatChoice == stat ? KDTextGray3 : KDTextGray2); + DrawTextFitKD(TextGet(canBuy ? "KDStatBuyTemplate" : "KDStatBuyMax") + .replace("AMNT1", "" + Math.floor(10 * statMax)) + .replace("AMNT2", "" + Math.floor(10 * (statMax + amount))), + KDModalArea_x + 50 + 210, KDModalArea_y + 155 + 60 * II + 22, 100, "#ffffff", undefined, 16, "left"); + II++; + } + + if (KDStatChoice) { + let amount = 2.5; + + let statMax = KDStat[KDStatChoice].getMax(KinkyDungeonPlayerEntity); + if (statMax >= 20) amount -= 0.5; + if (statMax >= 30) amount -= 1; + let amnt = Math.floor(amount * 10); + let amnt2 = KDStat[KDStatChoice].getAmnt2 ? KDStat[KDStatChoice].getAmnt2(amnt) : 0; + DrawTextFitKD(TextGet("KDStatBuy" + KDStatChoice + "Desc").replace("AMNT", "" + amnt), + KDModalArea_x + 625, KDModalArea_y + 220, 450, "#ffffff", undefined, 20,); + if (TextGet("KDStatBuy" + KDStatChoice + "Desc2") != "KDStatBuy" + KDStatChoice + "Desc2") + DrawTextFitKD(TextGet("KDStatBuy" + KDStatChoice + "Desc2").replace("AMNT", "" + amnt2), + KDModalArea_x + 625, KDModalArea_y + 220 + 25, 450, "#ffffff", undefined, 20,); + + DrawButtonKDEx("heartbuyconfirm", (_bdata) => { + KDSendInput("heart", {type: KDStatChoice, targetTile: KinkyDungeonTargetTileLocation, amount: amount}); + return true; + }, true, KDModalArea_x + 500, KDModalArea_y + 300, 250, 45, TextGet("KDStatBuyConfirm"), "#ffffff", "", "", false, + false, KDTextGray2); + } + +} + + +function KDDrawOrb() { + KDModalArea = true; + let modalHeight = 150 + 55 * Object.entries(KinkyDungeonShrineBaseCosts).length; + + KDModalArea_y = 800 - modalHeight; + KDModalArea_height = modalHeight + 100; + KDModalArea_width = 900; + + FillRectKD(kdcanvas, kdpixisprites, "modalbg", { + Left: KDModalArea_x, + Top: KDModalArea_y,// + 25 - modalHeight, + Width: KDModalArea_width, + Height: modalHeight + 25, + Color: KDButtonColor, + LineWidth: 1, + zIndex: 60, + alpha: 0.8, + }); + DrawRectKD(kdcanvas, kdpixisprites, "modalbg2", { + Left: KDModalArea_x, + Top: KDModalArea_y,// + 25 - modalHeight, + Width: KDModalArea_width, + Height: modalHeight + 25, + Color: KDBorderColor, + LineWidth: 1, + zIndex: 60.1, + alpha: 1.0, + }); + + + let tile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); + let spell = tile?.Spell ? KinkyDungeonFindSpell(tile.Spell) : null; + + if (tile) { + KDOrbX = parseInt(KinkyDungeonTargetTileLocation.split(',')[0]); + KDOrbY = parseInt(KinkyDungeonTargetTileLocation.split(',')[1]); + } + + DrawTextFitKD(TextGet("KinkyDungeonOrbIntro" + (KinkyDungeonStatsChoice.get("randomMode") ? ( + (!spell || KDHasSpell(spell.name)) ? "KinkyRandom" : "Kinky") : "")) + .replace("SHCL", TextGet("KinkyDungeonSpellsSchool" + spell?.school)) + .replace("SPLNME", TextGet("KinkyDungeonSpell" + spell?.name)), + KDModalArea_x + 450, KDModalArea_y + 70, 800, "#ffffff", undefined, 28,); + DrawTextFitKD(TextGet("KinkyDungeonOrbIntro2"), + KDModalArea_x + 450, KDModalArea_y + 100, 800, "#ffffff", undefined, 28,); + + let i = 0; + let XX = KDModalArea_x + 150; + let spacing = 44; + let yPad = 200; + for (let shrine in KinkyDungeonShrineBaseCosts) { + let value = KinkyDungeonGoddessRep[shrine]; + + if (value != undefined) { + let color = "#e7cf1a"; + if (value < -10) { + if (value < -30) color = "#ff5277"; + else color = "#ff8933"; + } else if (value > 10) { + if (value > 30) color = "#4fd658"; + else color = "#9bd45d"; + } + DrawButtonKDEx("orbspell" + shrine, (_b) => { + KDSendInput("orb", {shrine: shrine, Amount: 1, Rep: 1 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "DivinePrivilege")), x: KDOrbX, y: KDOrbY}); + return true; + }, true, XX, yPad + KDModalArea_y + spacing * i - 27, 250, spacing - 8, TextGet("KinkyDungeonShrine" + shrine), "white", undefined, undefined, undefined, false, KDTextGray2); + DrawProgressBar( 375 + XX, yPad + KDModalArea_y + spacing * i - (spacing-8)/4, 200, spacing/2, 50 + value, color, KDTextGray2); + if (KinkyDungeonShrineBaseCosts[shrine]) + KDDrawRestraintBonus(shrine, 275 + XX + 30, yPad + KDModalArea_y + spacing * i, undefined, 24); + + i++; + } + + } + + DrawButtonKDEx("orbspellrandom", (_b) => { + let shrine = Object.keys(KinkyDungeonShrineBaseCosts)[Math.floor(KDRandom() * Object.keys(KinkyDungeonShrineBaseCosts).length)]; + KDSendInput("orb", {shrine: shrine, Amount: 1, Rep: 0.9 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "DivinePrivilege")), x: KDOrbX, y: KDOrbY}); + KinkyDungeonDrawState = "Game"; + return true; + }, true, XX, yPad + KDModalArea_y + spacing * i - 27 + 30, 250, spacing - 8, TextGet("KinkyDungeonSurpriseMe"), "white", undefined, undefined, undefined, false, KDTextGray2); + i += 2; + +} diff --git a/Game/src/map/KinkyDungeonParams.ts b/Game/src/map/KinkyDungeonParams.ts new file mode 100644 index 000000000..4683f57b4 --- /dev/null +++ b/Game/src/map/KinkyDungeonParams.ts @@ -0,0 +1,2382 @@ +"use strict"; + +const KinkyDungeonMapParams: Record = { + "menu":{ + curseTags: ["trap"], + successorNegative: { + menu: 1.0, + }, + successorPositive: { + menu: 1.0, + }, + successorSame: { + menu: 1.0, + }, + color: "#ffffff", + music: { + "GENERIC-DOLLRACK.ogg": 4, + }, + + "background" : "RainyForstPathNight", + "openness" : 3, // Openness of rooms + "density" : 3, // Density of tunnels (inverse of room spawn chance) + "crackchance" : 0.07, + "barchance" : 0.2, + "brightness" : 7, + "chestcount" : 5, + "shrinecount" : 16, + "shrinechance" : 0.75, + "ghostchance" : 1, + "doorchance" : 0.67, + "nodoorchance" : 0.1, + "doorlockchance" : -0.1, + "trapchance" : 0.5, + "grateChance" : 0.4, + "rubblechance" : 0.4, + "brickchance" : 0.1, + "cacheInterval" : 1, + "forbiddenChance" : 0.7, // If a forbidden gold chance is generated. Otherwise a silver chest will appear + "forbiddenGreaterChance" : 0.33, // Chance after a forbidden area is generated with a restraint, otherwise its a lesser gold chest + "torchchance": 0.35, + "torchchanceboring": 1.0, + + tagModifiers: {}, + enemyTags: [], + + "traps": [], + "min_width" : 4, + "max_width" : 7, + "min_height" : 4, + "max_height" : 6, + "defeat_outfit": "Prisoner", + "shrines": [], + + "setpieces": [], + + + }, + "shoppe":{ + curseTags: ["trap"], + successorNegative: { + menu: 1.0, + }, + successorPositive: { + menu: 1.0, + }, + successorSame: { + menu: 1.0, + }, + color: "#ffffff", + music: { + "GENERIC-DOLLRACK.ogg": 4, + //"Shopping.ogg": 10, + }, + + "background" : "RainyForstPathNight", + "openness" : 3, // Openness of rooms + "density" : 3, // Density of tunnels (inverse of room spawn chance) + "crackchance" : 0.07, + "barchance" : 0.2, + "brightness" : 7, + "chestcount" : 5, + "shrinecount" : 16, + "shrinechance" : 0.75, + "ghostchance" : 1, + "doorchance" : 0.67, + "nodoorchance" : 0.1, + "doorlockchance" : -0.1, + "trapchance" : 0.5, + "grateChance" : 0.4, + "rubblechance" : 0.4, + "brickchance" : 0.1, + "cacheInterval" : 1, + "forbiddenChance" : 0.7, // If a forbidden gold chance is generated. Otherwise a silver chest will appear + "forbiddenGreaterChance" : 0.33, // Chance after a forbidden area is generated with a restraint, otherwise its a lesser gold chest + "torchchance": 0.35, + "torchchanceboring": 1.0, + + tagModifiers: {}, + enemyTags: [], + + "traps": [], + "min_width" : 4, + "max_width" : 7, + "min_height" : 4, + "max_height" : 6, + "defeat_outfit": "Prisoner", + "shrines": [], + + "setpieces": [], + + + }, + "bandit":{ + curseTags: ["trap", "leatherRestraints", "leatherRestraintsHeavy"], + successorNegative: { + bandit: 1.0, + }, + successorPositive: { + bandit: 1.0, + }, + successorSame: { + bandit: 1.0, + }, + color: "#ffffff", + music: { + "Ada18980_SmokingIsBadForYou.ogg": 4, + }, + + "background" : "RainyForstPathNight", + "openness" : 6, // Openness of rooms + "density" : 5, // Density of tunnels (inverse of room spawn chance) + "crackchance" : 0.07, + "barchance" : 0.2, + "brightness" : 7, + "chestcount" : 5, + "shrinecount" : 16, + "shrinechance" : 0.75, + "ghostchance" : 1, + "doorchance" : 0.67, + "nodoorchance" : 0.1, + "doorlockchance" : -0.1, + "trapchance" : 0.5, + "grateChance" : 0.4, + "rubblechance" : 0.4, + "brickchance" : 0.1, + "cacheInterval" : 1, + "forbiddenChance" : 0.7, // If a forbidden gold chance is generated. Otherwise a silver chest will appear + "forbiddenGreaterChance" : 0.33, // Chance after a forbidden area is generated with a restraint, otherwise its a lesser gold chest + "torchchance": 0.35, + "torchchanceboring": 1.0, + + tagModifiers: {}, + enemyTags: ["bandit", "explosiveBarrel"], + + "min_width" : 4, + "max_width" : 7, + "min_height" : 4, + "max_height" : 6, + "defeat_outfit": "Prisoner", + + "setpieces": [ + {Type: "Bedroom", Weight: 3}, + {Type: "Cache", Weight: 10}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + {Type: "Storage", Weight: 14}, + ], + + "shrines": [ + //{Type: "Charms", Weight: 5}, + {Type: "Latex", Weight: 3}, + {Type: "Commerce", Weight: 4}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Leather", Weight: 11}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 8}, + {Type: "Will", Weight: 2}, + ], + + + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapShackleWeak", Level: 0, Power: 1, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 2, Weight: 10}, + ], + + }, + "grv":{//DungeonName0,-Graveyard- + curseTags: ["trap"], + color: "#8cba75", + successorNegative: { + tmb: 1.0, + }, + successorPositive: { + jng: 0.7, + lib: 0.3, + }, + successorSame: { + grv: 0.8, + cat: 0.2, + }, + "background" : "RainyForstPathNight", + "openness" : 3, // Openness of rooms + "density" : 3, // Density of tunnels (inverse of room spawn chance) + "crackchance" : 0.07, + "barchance" : 0.2, + "brightness" : 7, + "chestcount" : 3, + "shrinecount" : 16, + "shrinechance" : 0.75, + "ghostchance" : 1, + "doorchance" : 0.67, + "nodoorchance" : 0.1, + "doorlockchance" : -0.1, + "trapchance" : 0.5, + "grateChance" : 0.4, + "rubblechance" : 0.4, + "brickchance" : 0.1, + "cacheInterval" : 1, + "forbiddenChance" : 0.7, // If a forbidden gold chance is generated. Otherwise a silver chest will appear + "forbiddenGreaterChance" : 0.33, // Chance after a forbidden area is generated with a restraint, otherwise its a lesser gold chest + "torchchance": 0.35, + "torchchanceboring": 1.0, + + music: { + "AREA1-GRAVEYARD.ogg": 10, + "GENERIC-DOLLRACK.ogg": 4, + }, + + tagModifiers: { + "temple": 0.4, + "library": 0.5, + "jungle": 0, + "cavern": 0, + }, + + enemyTags: ["magical", "zombie", "leather", "tape", "ribbon", "explosiveBarrel"], + + "setpieces": [ + {Type: "Bedroom", Weight: 3}, + {Type: "Graveyard", Weight: 6}, + {Type: "Altar", Weight: 3}, + {Type: "SmallAltar", Weight: 18}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + {Type: "QuadCell", Weight: 3}, + {Type: "Storage", Weight: 5}, + ], + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapCharmWeak", Level: 0, Power: 1, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLustCloud", Level: 0, Power: 3, Weight: 30}, + {Name: "SpawnEnemies", Faction: "Enemy", Enemy: "SummonedZombie", strict: true, Level: 0, Power: 4, Weight: 30}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "SummonedZombie"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "SummonedZombie"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "SummonedZombie"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "SummonedZombie"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "SummonedZombie"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "SummonedZombie"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 1, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "SummonedZombie"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "SummonedZombie"}, + //{Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 1, Weight: 10}, + ], + + factionList: ["Bandit", "Witch"], + + "min_width" : 5, + "max_width" : 8, + "min_height" : 5, + "max_height" : 7, + "defeat_outfit": "Prisoner", + "shrines": [ + //{Type: "Charms", Weight: 5}, + {Type: "Latex", Weight: 3}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Leather", Weight: 5}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 2}, + {Type: "Will", Weight: 13},] + + + }, + "cat":{// DungeonName1,-Catacombs- + curseTags: ["trap", "shackleRestraints", "steelbondage"], + successorNegative: { + tmb: 0.5, + cry: 0.1, + cav: 0.4, + }, + successorPositive: { + lib: 1.0, + }, + successorSame: { + cat: 0.8, + lib: 0.2, + }, + color: "#a3a7c2", + "background" : "Dungeon", + "openness" : 0, + "density" : 2, + "crackchance" : 0.09, + "barchance" : 0.2, + "brightness" : 4, + "chestcount" : 7, + "shrinecount" : 15, + "chargerchance": 0.5, + "litchargerchance": 0.5, + "chargercount": 7, + "shrinechance" : 0.6, + "ghostchance" : 0.5, + "doorchance" : 0.8, + "nodoorchance" : 0.05, + "doorlockchance" : -0.05, + "trapchance" : 0.65, + "grateChance" : 0.1, + "rubblechance" : 0.3, + "brickchance" : 0.4, + "cacheInterval" : 1, + "forbiddenChance" : 0.72, + "forbiddenGreaterChance" : 0.33, + cageChance: 0.8, + torchchance: 0.05, + torchchanceboring: 0.7, + + worldGenCode: () => { + KDAddPipes(0.1, 0.05, 0.7, 0.05); + }, + + music: { + "Ada18980_PlayingWithFire.ogg": 10, + "AREA9-BELLOWS.ogg": 2, + }, + + tagModifiers: { + "narrow": 2, + "dungeon": 2, + "open": 0.5, + "jungle": 0, + "cavern": 0, + "library": 0.25, + }, + + "setpieces": [ + {Type: "Bedroom", Weight: 2}, + {Type: "Altar", Weight: 3}, + {Type: "QuadCell", Weight: 8}, + {Type: "Storage", Weight: 5}, + {Type: "SmallAltar", Weight: 18}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + {Type: "ExtraCell", Weight: 10}, + ], + + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapShackleWeak", Level: 0, Power: 1, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "SpikeTrap", Level: 0, Power: 4, Weight: 70}, + {Name: "SpawnEnemies", Enemy: "SummonedSkeleton", strict: true, Level: 0, Power: 4, Weight: 10}, + {Name: "SpawnEnemies", Enemy: "HeavySkeleton", extraTag: "Single", strict: true, Level: 0, Power: 2, Weight: 2}, + {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 2, Weight: 10}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "SummonedSkeleton"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "SummonedSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "SummonedSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "SummonedSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "SummonedSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "SummonedSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "SummonedSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "SummonedSkeleton"}, + ], + + "min_width" : 5, + "max_width" : 8, + "min_height" : 5, + "max_height" : 7, + + factionList: ["Bandit", "Apprentice", "Bountyhunter", "Dragon"], + + enemyTags: ["skeleton", "metal", "rope", "leather", "explosiveBarrel"], + "defeat_outfit": "Dungeon", + "shrines": [ + {Type: "Latex", Weight: 3}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Leather", Weight: 5}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 2}, + {Type: "Will", Weight: 13},] + + }, + "jng":{//DungeonName2,-Underground Jungle- + curseTags: ["trap", "latexRestraints", "mithrilCuffs"], + successorNegative: { + cry: 0.3, + cav: 0.5, + jng: 0.2, + }, + successorPositive: { + lib: 0.1, + cat: 0.1, + jng: 0.5, + cst: 0.1, + }, + successorSame: { + jng: 0.7, + cry: 0.2, + cav: 0.1, + }, + color: "#4d8f5e", + "background" : "DeepForest", + noReplace: "b", + "openness" : 1, + "density" : 1, + "crackchance" : 0.15, + "barchance" : 0.05, + "brightness" : 6, + "chestcount" : 7, + "shrinecount" : 14, + "shrinechance" : 0.4, + "ghostchance" : 0.5, + "doorchance" : 0.2, + "nodoorchance" : 0.4, + "doorlockchance" : -0.05, + "trapchance" : 0.4, + "grateChance" : 0.1, + "rubblechance" : 0.25, + "brickchance" : 0.25, + "cacheInterval" : 1, + "forbiddenChance" : 0.72, + "forbiddenGreaterChance" : 0.33, + torchchance: 0.2, + torchchanceboring: 0.25, + + worldGenCode: () => { + KDAddPipes(0.03, 0.6, 0.8, 0.1); + // List of coordinates that are naturalized + let naturalized = {}; + let cavernized = {}; + // Start nature near plants, mushrooms, etc + for (let x = 0; x < KDMapData.GridWidth-1; x++) + for (let y = 0; y < KDMapData.GridHeight-1; y++) { + let category = KDMapData.CategoryIndex ? KDGetCategoryIndex(x, y)?.category : ""; + /*let enemy = KinkyDungeonEnemyAt(x, y); + let tile = KinkyDungeonMapGet(x, y); + if ((enemy && (enemy.Enemy.faction == "Plant" || enemy.Enemy.faction == "Natural")) + || (tile != '2' && KDRandom() < 0.001) + || (tile == 'X' && KDRandom() < 0.04)) { + naturalized[x + ',' + y] = true; + }*/ + if ((category == "jungle" || category == "natural" || category == "garden") && KDRandom() < 0.1) naturalized[x + ',' + y] = true; + if (category == "cavern" && KDRandom() < 0.1) cavernized[x + ',' + y] = true; + } + // dilate a few times + let wallchance = 0.1; + let wallchanceCav = 0.01; + let cavChance = 0.01; + for (let i = 6 + 4*KDRandom(); i>0; i--) { + for (let x = 0; x < KDMapData.GridWidth-1; x++) + for (let y = 0; y < KDMapData.GridHeight-1; y++) { + + let chance = KinkyDungeonMapGet(x, y) == '1' ? wallchance : 0.3; + if (KinkyDungeonMapGet(x, y) == '4') chance = 0; // no cracks in plants + if (KinkyDungeonMapGet(x, y) == 'X') chance = 1; // plants have guaranteed spread chance if a bordering plant is natural + if (!naturalized[x + ',' + y]) { + if (naturalized[(x+1) + ',' + (y)] && KDRandom() < chance) { + if (KDRandom() < cavChance) cavernized[x + ',' + y] = true; + else naturalized[x + ',' + y] = true; + } else if (naturalized[(x-1) + ',' + (y)] && KDRandom() < chance) { + if (KDRandom() < cavChance) cavernized[x + ',' + y] = true; + else naturalized[x + ',' + y] = true; + } else if (naturalized[(x) + ',' + (y+1)] && KDRandom() < chance) { + if (KDRandom() < cavChance) cavernized[x + ',' + y] = true; + else naturalized[x + ',' + y] = true; + } else if (naturalized[(x) + ',' + (y-1)] && KDRandom() < chance) { + if (KDRandom() < cavChance) cavernized[x + ',' + y] = true; + else naturalized[x + ',' + y] = true; + } + } + } + } + for (let i = 6 + 4*KDRandom(); i>0; i--) { + for (let x = 0; x < KDMapData.GridWidth-1; x++) + for (let y = 0; y < KDMapData.GridHeight-1; y++) { + + let chance = KinkyDungeonMapGet(x, y) == '1' ? wallchanceCav : 0.3; + if (!cavernized[x + ',' + y]) { + if (cavernized[(x+1) + ',' + (y)] && KDRandom() < chance) { + cavernized[x + ',' + y] = true; + } else if (cavernized[(x-1) + ',' + (y)] && KDRandom() < chance) { + cavernized[x + ',' + y] = true; + } else if (cavernized[(x) + ',' + (y+1)] && KDRandom() < chance) { + cavernized[x + ',' + y] = true; + } else if (cavernized[(x) + ',' + (y-1)] && KDRandom() < chance) { + cavernized[x + ',' + y] = true; + } + } + } + } + // now we finalize + for (let x = 0; x < KDMapData.GridWidth-1; x++) + for (let y = 0; y < KDMapData.GridHeight-1; y++) { + if (cavernized[x + ',' + y] && !KDMapData.TilesSkin[x + ',' + y]) { + KDMapData.TilesSkin[x + ',' + y] = {skin: "cav", force: true}; + } else if (naturalized[x + ',' + y] && !KDMapData.TilesSkin[x + ',' + y]) { + KDMapData.TilesSkin[x + ',' + y] = {skin: "jngWild", force: true}; + } + } + }, + + tagModifiers: { + "open": 6, + "door": 0.5, + "jungle": 100, + "cavern": 60, + "temple": 5, + }, + + music: { + "AREA5-UNDERGROUNDJUNGLE.ogg": 10, + }, + + "setpieces": [ + {Type: "Altar", Weight: 6}, + {Type: "SmallAltar", Weight: 20}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + {Type: "JungleLight", Weight: 8}, + {Type: "Fireflies", Weight: 40}, + ], + + "traps": [ + {Name: "CustomVine", Level: 0, Power: 1, Weight: 30}, + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 10}, + {Name: "SpecificSpell", Spell: "TrapSlimeWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 10}, + {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 10}, + {Name: "SpecificSpell", Spell: "TrapLustCloud", Level: 0, Power: 3, Weight: 30}, + {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 3, Weight: 10}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "VinePlant"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "VinePlant"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "VinePlant"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "VinePlant"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "VinePlant"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "VinePlant"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "VinePlant"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 1, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "VinePlant"}, + ], + + "min_width" : 5, + "max_width" : 7, + "min_height" : 5, + "max_height" : 7, + + factionList: ["Bandit", "Elf", "Bast", "Elemental", "Dragon", "Alchemist"], + + enemyTags: ["plant", "jungle", "slime", "earth", "explosiveBarrel"], + "defeat_outfit": "LatexPrisoner", + "shrines": [ + {Type: "Latex", Weight: 5}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Leather", Weight: 5}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 5}, + {Type: "Will", Weight: 13},] + }, + "tmp":{//DungeonName3,-Lost Temple- + curseTags: ["trap", "obsidianRestraints"], + successorNegative: { + ore: 1.0, + }, + successorPositive: { + lib: 0.6, + cry: 0.3, + bel: 0.1, + }, + successorSame: { + tmp: 0.9, + ore: 0.1, + }, + color: "#757575", + "background" : "SpookyForest", + "openness" : 2, + "density" : 2, + "crackchance" : 0.05, + "barchance" : 0.1, + "brightness" : 3, + "chestcount" : 7, + "chargerchance": 0.9, + "litchargerchance": 0.2, + "chargercount": 10, + "shrinecount" : 18, + "shrinechance" : 0.5, + "ghostchance" : 0.5, + "doorchance" : 0.9, + "nodoorchance" : 0.25, + "doorlockchance" : -0.05, + "trapchance" : 0.5, + "grateChance" : 0.8, + "rubblechance" : 0.35, + "brickchance" : 0.1, + "floodchance" : 0.33, + "gaschance" : 0.5, // Chance for gas to appear on the level + "gasdensity" : 0.1, // Chance for a passage to be filled with happy gas + "gastype" : ']', // Gas type + "cacheInterval" : 1, + "forbiddenChance" : 0.8, + "forbiddenGreaterChance" : 0.4, + torchchance: 0.4, + torchchanceboring: -0.4, + torchlitchance: 0.15, + torchreplace: { + sprite: "Lantern", + unlitsprite: "LanternUnlit", + brightness: 6, + }, + + worldGenCode: () => { + KDAddPipes(0.05, 0.1, 0.8, 0.1); + }, + + music: { + "AREA7-LOSTTEMPLE.ogg": 14, + "AREA9-BELLOWS.ogg": 2, + }, + + tagModifiers: { + "jungle": 0, + "cavern": 0, + "temple": 3, + "library": 0.7, + }, + globalTags: { + "temple": true, + }, + + shadowColor: 0x000703, + + "setpieces": [ + {Type: "Bedroom", Weight: 1}, + {Type: "Altar", Weight: 6}, + {Type: "SmallAltar", Weight: 20}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + {Type: "Magicflies", Weight: 12}, + ], + + + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, + {Name: "SpecificSpell", Spell: "TrapSlimeWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 10}, + {Name: "SpecificSpell", Spell: "TrapShackleWeak", Level: 0, Power: 3, Weight: 10}, + {Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "SpikeTrap", Level: 0, Power: 4, Weight: 30}, + {Name: "SpawnEnemies", Enemy: "GreaterSkeleton", strict: true, Level: 0, Power: 3, Weight: 10}, + {Name: "SpawnEnemies", Enemy: "HeavySkeleton", strict: true, Level: 0, Power: 1, Weight: 10}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "GreaterSkeleton"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "GreaterSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "GreaterSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "GreaterSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "GreaterSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "GreaterSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "GreaterSkeleton"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "GreaterSkeleton"}, + ], + + "min_width" : 5, + "max_width" : 8, + "min_height" : 5, + "max_height" : 6, + + factionList: ["Apprentice", "Elemental", "Witch", "AncientRobot"], + + enemyTags: ["skeleton", "temple", "ghost", "soul", "magical"], + + "defeat_outfit": "LatexPrisoner", + "shrines": [ + {Type: "Latex", Weight: 5}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Leather", Weight: 3}, + {Type: "Metal", Weight: 5}, + {Type: "Rope", Weight: 3}, + {Type: "Will", Weight: 13},], + + "lockmult" : 1.5, + }, + "tmb":{//DungeonName11,-Ancient Tombs- + curseTags: ["trap", "kittyRestraints", "leatherRestraints", "leatherRestraintsHeavy"], + successorNegative: { + tmp: 0.4, + lib: 0.6, + }, + successorPositive: { + cat: 0.4, + jng: 0.6, + }, + successorSame: { + tmb: 0.8, + grv: 0.2, + }, + color: "#d16722", + "background" : "EgyptianTomb", + "openness" : 1, + "density" : 3, + "crackchance" : 0.06, + "barchance" : 0.05, + "brightness" : 3, + "chestcount" : 9, + "chargerchance": 0.8, + "litchargerchance": 0.65, + "chargercount": 6, + "shrinecount" : 16, + "shrinechance" : 0.5, + "ghostchance" : 0.5, + "doorchance" : 0.4, + "nodoorchance" : 0.25, + "doorlockchance" : -0.05, + "trapchance" : 0.65, + "grateChance" : 0.3, + "rubblechance" : 0.35, + "brickchance" : 0.4, + "cacheInterval" : 1, + // Side routes have more high-value loot + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + torchchance: 0.1, + torchchanceboring: 0.1, + + specialChests: { + kitty: 3, + }, + + music: { + "AREA2-ANCIENTTOMBS.ogg": 10, + }, + + worldGenCode: () => { + let altType = KDGetAltType(MiniGameKinkyDungeonLevel); + if (!altType || !altType.data?.noHostileDoodad) + for (let X = 1; X < KDMapData.GridWidth - 1; X++) { + for (let Y = 1; Y < KDMapData.GridHeight - 1; Y++) { + if (KinkyDungeonMapGet(X, Y) == 'X' + && (KDRandom() < 0.15 + 0.45 * Math.min(1, KinkyDungeonDifficulty/30) + || KDNearbyTiles(X, Y, 1.5).some((tile) => {return tile.tile == 'C';}))) { + KinkyDungeonMapSet(X, Y, '3'); + let en = DialogueCreateEnemy(X, Y, "MummyCursed"); + KDRunCreationScript(en, KDGetCurrentLocation()); + } + } + } + }, + + "setpieces": [ + {Type: "Altar", Weight: 6}, + {Type: "SmallAltar", Weight: 20}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + {Type: "Storage", Weight: 7}, + ], + + tagModifiers: { + "temple": 2, + "jungle": 0, + "cavern": 0, + "library": 0.1, + "urban": 0.5, + }, + globalTags: { + "egyptian": true, + }, + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, + {Name: "SpecificSpell", Spell: "TrapMummyWeak", Level: 0, Power: 1, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLustCloud", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "SpikeTrap", Level: 0, Power: 4, Weight: 30}, + {Name: "SpawnEnemies", Enemy: "SummonedSkeleton", strict: true, Level: 0, Power: 5, Weight: 10}, + {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 3, Weight: 10}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "MummyCursed"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "MummyCursed"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "MummyCursed"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "MummyCursed"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "MummyCursed"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "MummyCursed"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "MummyCursed"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "MummyCursed"}, + ], + + "min_width" : 5, + "max_width" : 7, + "min_height" : 5, + "max_height" : 8, + + factionList: ["Bast", "Bandit", "Elemental"], + + enemyTags: ["mummy", "ghost"], + "defeat_outfit": "Bast", + "shrines": [ + {Type: "Latex", Weight: 3}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 4}, + {Type: "Leather", Weight: 6}, + {Type: "Will", Weight: 13},] + }, + "lib":{//DungeonName12,-Magic Library- + curseTags: ["trap", "dressRestraints"], + successorNegative: { + bel: 0.4, + ore: 0.6, + }, + successorPositive: { + tmp: 0.4, + ore: 0.6, + }, + successorSame: { + lib: 0.8, + cat: 0.2, + }, + color: "#be52ff", + "background" : "MagicSchoolLaboratory", + noReplace: "Ddb", + "openness" : 5, + "density" : 6, + "crackchance" : 0.0, + "wallRubblechance" : 0.035, + "barchance" : 0.1, + "brightness" : 6, + "chestcount" : 10, + "chargerchance": 0.8, + "litchargerchance": 0.25, + "chargercount": 6, + "shrinecount" : 11, + "shrinechance" : 0.5, + "ghostchance" : 0.5, + "doorchance" : 0.0, + "nodoorchance" : 0.6, + "doorlockchance" : -0.05, + "trapchance" : 0.3, + "grateChance" : 0.7, + "rubblechance" : 0.3, + "brickchance" : 0.01, + "cacheInterval" : 1, + // Side routes have more high-value loot + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + torchchance: 0.6, + torchchanceboring: -0.4, + torchreplace: { + sprite: "TorchOrb", + brightness: 4, + }, + + music: { + "AREA4-MAGICLIBRARY.ogg": 10, + "GENERIC-DOLLRACK.ogg": 4, + }, + + "setpieces": [ + {Type: "SmallAltar", Weight: 20}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + ], + + tagModifiers: { + "urban": 2, + "jungle": 0, + "cavern": 0, + "library": 4, + "temple": 0.5, + }, + + + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, + {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapRopeStrong", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLatexBubble", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLatexBall", Level: 0, Power: 3, Weight: 7}, + {Name: "SpawnEnemies", Enemy: "Dressmaker", strict: true, Level: 0, Power: 2, Weight: 10}, + {Name: "SpawnEnemies", Enemy: "Librarian", strict: true, Level: 4, Power: 1, Weight: 5}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "BookBondage"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "BookBondage"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "BookBondage"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "BookBondage"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "BookBondage"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "BookBondage"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "BookBondage"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "BookBondage"}, + ], + + "min_width" : 6, + "max_width" : 7, + "min_height" : 6, + "max_height" : 7, + deadend: 0.1, + + factionList: ["Elf", "Dressmaker", "Apprentice", "Elemental", "Witch", "Maidforce", "Alchemist"], + + enemyTags: ["book", "witch", "dressmaker", "magical"], + "defeat_outfit": "Prisoner", + "shrines": [ + {Type: "Latex", Weight: 3}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 4}, + {Type: "Leather", Weight: 6}, + {Type: "Will", Weight: 13},] + }, + "cry":{//DungeonName13,-Crystal Cave- + curseTags: ["trap", "crystalRestraints"], + successorNegative: { + jng: 0.5, + tmp: 0.1, + cav: 0.1, + cst: 0.3, + }, + successorPositive: { + tmp: 0.4, + cav: 0.3, + cst: 0.2, + }, + successorSame: { + cry: 0.8, + jng: 0.2, + }, + color: "#4fa4b8", + "background" : "MagicSchoolEscape", + "openness" : 6, + "density" : 2, + "crackchance" : 0.11, + "barchance" : 0.03, + "brightness" : 5, + "chargerchance": 1.0, + "litchargerchance": 1.0, + "chargercount": 4, + "chestcount" : 10, + "shrinecount" : 9, + "shrinechance" : 0.8, + "ghostchance" : 0.5, + "doorchance" : 0.05, + "nodoorchance" : 0.5, + "doorlockchance" : -0.05, + "trapchance" : 0.5, + "grateChance" : 0.7, + "rubblechance" : 0.45, + "brickchance" : 0.2, + torchchance: 0.3, + torchchanceboring: 0.1, + + music: { + "AREA6-CRYSTALCAVE.ogg": 10, + "AREA9-BELLOWS.ogg": 3, + }, + + shadowColor: 0x080311, + + "gaschance" : 0.33, // Chance for gas to appear on the level + "gasdensity" : 0.05, // Chance for a passage to be filled with happy gas + "gastype" : '[', // Gas type + + "floodchance" : 0.25, + "cacheInterval" : 1, + // Side routes have more high-value loot + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + + tagModifiers: { + "open": 4, + "jungle": 20, + "cavern": 80, + "urban": 0.5, + "door": 0.5, + "library": 0.0, + }, + + "setpieces": [ + {Type: "Altar", Weight: 6}, + {Type: "SmallAltar", Weight: 20}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + {Type: "Storage", Weight: 2}, + {Type: "Magicflies", Weight: 40}, + ], + + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, + {Name: "SpecificSpell", Spell: "TrapRopeStrong", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapSCloud", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapSlimeWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapCrystal", Level: 0, Power: 3, Weight: 50}, + {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 3, Weight: 10}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + ], + + "min_width" : 4, + "max_width" : 6, + "min_height" : 4, + "max_height" : 8, + + factionList: ["Nevermere", "Elf", "Bandit", "Bountyhunter", "Elemental", "Dragon"], + + enemyTags: ["mushroom", "slimeBonus", "crystalline", "earth", "slime", "shadow", "explosiveBarrel"], + "defeat_outfit": "Prisoner", + "shrines": [ + {Type: "Latex", Weight: 3}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 4}, + {Type: "Leather", Weight: 6}, + {Type: "Will", Weight: 13},] + }, + "cav":{//Caves + curseTags: ["trap", "steelBondage"], + successorNegative: { + jng: 0.3, + cry: 0.7, + }, + successorPositive: { + jng: 0.4, + cav: 0.4, + cry: 0.4, + }, + successorSame: { + cav: 0.8, + cry: 0.2, + }, + color: "#536a60", + "background" : "MagicSchoolEscape", + "openness" : 6, + "density" : 2, + "crackchance" : 0.11, + "barchance" : 0.03, + "brightness" : 5, + "chargerchance": 1.0, + "litchargerchance": 1.0, + "chargercount": 4, + "chestcount" : 10, + "shrinecount" : 9, + "shrinechance" : 0.8, + "ghostchance" : 0.5, + "doorchance" : 0.05, + "nodoorchance" : 0.5, + "doorlockchance" : -0.05, + "trapchance" : 0.5, + "grateChance" : 0.7, + "rubblechance" : 0.45, + "brickchance" : 0.2, + torchchance: 0.3, + torchchanceboring: 0.1, + + music: { + "AREA7-LOSTTEMPLE-AMBIENT.ogg": 10, + "Elemental_Temple.ogg": 4, + "AREA6-CRYSTALCAVE.ogg": 3, + }, + + shadowColor: 0x080311, + + + "floodchance" : 0.35, + "cacheInterval" : 1, + // Side routes have more high-value loot + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + + tagModifiers: { + "open": 4, + "jungle": 0.5, + "cave": 2.0, + "dragon": 1.5, + "cavern": 7.0, + "urban": 0.5, + "door": 0.5, + "library": 0.0, + }, + + "setpieces": [ + {Type: "Altar", Weight: 6}, + {Type: "SmallAltar", Weight: 20}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + {Type: "Storage", Weight: 2}, + ], + + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, + {Name: "SpecificSpell", Spell: "TrapRopeStrong", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapSCloud", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapSlimeWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 3, Weight: 10}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + ], + + "min_width" : 4, + "max_width" : 6, + "min_height" : 4, + "max_height" : 8, + + factionList: ["Bandit", "Elemental", "Dragon"], + + enemyTags: ["mushroom", "dragon", "earth", "dragonqueen", "dragongirl", "explosiveBarrel"], + "defeat_outfit": "Prisoner", + "shrines": [ + {Type: "Latex", Weight: 6}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 10}, + {Type: "Conjure", Weight: 3}, + {Type: "Illusion", Weight: 3}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 5}, + {Type: "Leather", Weight: 15}, + {Type: "Will", Weight: 13},] + }, + "DragonLair":{//DragonLair (used for music only atm) + curseTags: ["trap", "steelBondage", "mithrilCuffs"], + successorNegative: { + jng: 0.3, + cry: 0.7, + }, + successorPositive: { + jng: 0.4, + cav: 0.4, + cry: 0.4, + }, + successorSame: { + cav: 0.8, + cry: 0.2, + }, + color: "#536a60", + "background" : "MagicSchoolEscape", + "openness" : 6, + "density" : 2, + "crackchance" : 0.11, + "barchance" : 0.03, + "brightness" : 5, + "chargerchance": 1.0, + "litchargerchance": 1.0, + "chargercount": 4, + "chestcount" : 10, + "shrinecount" : 9, + "shrinechance" : 0.8, + "ghostchance" : 0.5, + "doorchance" : 0.05, + "nodoorchance" : 0.5, + "doorlockchance" : -0.05, + "trapchance" : 0.5, + "grateChance" : 0.7, + "rubblechance" : 0.45, + "brickchance" : 0.2, + torchchance: 0.3, + torchchanceboring: 0.1, + + music: { + "Dragon Lair.ogg": 15, + "AREA7-LOSTTEMPLE-AMBIENT.ogg": 10, + }, + + shadowColor: 0x080311, + + + "floodchance" : 0.35, + "cacheInterval" : 1, + // Side routes have more high-value loot + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + + tagModifiers: { + "open": 4, + "jungle": 0.5, + "cave": 2.0, + "dragon": 1.5, + "cavern": 7.0, + "urban": 0.5, + "door": 0.5, + "library": 0.0, + }, + + "setpieces": [ + {Type: "Altar", Weight: 6}, + {Type: "SmallAltar", Weight: 20}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + {Type: "Storage", Weight: 2}, + ], + + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, + {Name: "SpecificSpell", Spell: "TrapRopeStrong", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapSCloud", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapSlimeWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpawnEnemies", Enemy: "Bandit", strict: true, Level: 0, Power: 3, Weight: 10}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "Mushy"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Mushy"}, + ], + + "min_width" : 4, + "max_width" : 6, + "min_height" : 4, + "max_height" : 8, + + factionList: ["Bandit", "Elemental", "Dragon"], + + enemyTags: ["mushroom", "dragon", "earth", "dragonqueen", "dragongirl", "explosiveBarrel"], + "defeat_outfit": "Prisoner", + "shrines": [ + {Type: "Latex", Weight: 6}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 10}, + {Type: "Conjure", Weight: 3}, + {Type: "Illusion", Weight: 3}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 5}, + {Type: "Leather", Weight: 15}, + {Type: "Will", Weight: 13},] + }, + "ore":{//DungeonName8,-Orrery- + curseTags: ["trap", "obsidianRestraints", "shadowLatexRestraints", "shadowLatexRestraintsHeavy", "shadowLatexPetsuit"], + successorNegative: { + jng: 0.6, + lib: 0.4, + }, + successorPositive: { + lib: 0.5, + tmp: 0.9, + bel: 0.1, + }, + successorSame: { + ore: 0.8, + tmp: 0.2, + }, + color: "#524fb8", + "background" : "SpookyForest", + "openness" : 2, + "density" : 2, + "crackchance" : 0.05, + "barchance" : 0.1, + "brightness" : 1, + "chestcount" : 7, + "chargerchance": 0.9, + "litchargerchance": 0.2, + "chargercount": 10, + "shrinecount" : 13, + "shrinechance" : 0.5, + "ghostchance" : 0.7, + "doorchance" : 0.9, + "nodoorchance" : 0.25, + "doorlockchance" : -0.05, + "trapchance" : 0.5, + "grateChance" : 0.8, + "rubblechance" : 0.35, + "brickchance" : 0.1, + "cacheInterval" : 1, + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + torchlitchance: 0.2, + torchchance: 1.0, + torchchanceboring: -0.4, + torchreplace: { + sprite: "IllusOrb", + unlitsprite: "IllusOrbDead", + brightness: 2, + }, + + music: { + "AREA8-ORRERY.ogg": 30, + }, + + factionList: ["Witch", "Elemental", "AncientRobot"], + + tagModifiers: { + "jungle": 0, + "cavern": 0, + "temple": 3, + "urban": 0.4, + "dungeon": 0, + "library": 1, + }, + globalTags: { + "temple": true, + "orrery": true, + }, + + shadowColor: 0x000703, + + "setpieces": [ + {Type: "Bedroom", Weight: 1}, + {Type: "Altar", Weight: 6}, + {Type: "SmallAltar", Weight: 20}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + ], + + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, + {Name: "SpecificSpell", Spell: "TrapRopeHoly", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpawnEnemies", Enemy: "ShadowHand", strict: true, Level: 0, Power: 3, Weight: 10}, + {Name: "SpawnEnemies", Enemy: "TickleTerror", strict: true, Level: 0, Power: 1, Weight: 10}, + {Name: "SpawnEnemies", Enemy: "HugHorror", strict: true, Level: 0, Power: 1, Weight: 10}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "Poltergeist"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Poltergeist"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "Poltergeist"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Poltergeist"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Poltergeist"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "Poltergeist"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "Poltergeist"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Poltergeist"}, + ], + + "min_width" : 5, + "max_width" : 8, + "min_height" : 5, + "max_height" : 8, + + enemyTags: ["shadowcreature", "magical", "shadow", "elemental", "angel"], + "defeat_outfit": "LatexPrisoner", + "shrines": [ + {Type: "Latex", Weight: 5}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 10}, + {Type: "Leather", Weight: 5}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 5}, + {Type: "Will", Weight: 13},], + + "lockmult" : 1.6, + }, + + + + + "DollStorage":{//DungeonName8,-Orrery- + curseTags: ["cyberdollrestraints", "latexRestraints", "latexRestraintsHeavy"], + successorNegative: { + cry: 1.0, + }, + successorPositive: { + bel: 0.5, + tmp: 0.5, + }, + successorSame: { + bel: 1.0, + }, + color: "#ffee83", + "background" : "SpookyForest", + "openness" : 1, + "density" : 9, + "crackchance" : 0.12, + "barchance" : 0.1, + "brightness" : 1, + "chestcount" : 7, + "chargerchance": 0.8, + "litchargerchance": 0.2, + "chargercount": 0, + "shrinecount" : 10, + "shrinechance" : 0.5, + "ghostchance" : 0.7, + "doorchance" : 0.9, + "nodoorchance" : 0.25, + "doorlockchance" : -0.05, + "trapchance" : 0.2, + "grateChance" : 0.8, + "rubblechance" : 0.35, + "brickchance" : 0.0, + "cacheInterval" : 1, + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + torchlitchance: 0.45, + torchchance: 1.0, + torchchanceboring: -0.7, + torchreplace: { + sprite: "OrbLantern", + brightness: 3, + }, + + music: { + "Doll_Sorting_Room.ogg": 20, + }, + + tagModifiers: { + "jungle": 0, + "cavern": 0, + "temple": 0.0, + "urban": 0, + "industrial": 2.0, + "dungeon": 0, + "factory": 0.25, + "bellows": 0.0, + "library": 0.1, + }, + globalTags: { + "factory": true, + "industrial": true, + }, + + shadowColor: 0x000707, + + "setpieces": [ + ], + + + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, + {Name: "SpecificSpell", Spell: "TrapRopeHoly", Level: 0, Power: 3, Weight: 30}, + {Name: "SpawnEnemies", Faction: "Enemy", strict: true, Enemy: "Drone", Level: 0, Power: 3, Weight: 100}, + {Name: "SpawnEnemies", Faction: "Enemy", strict: true, Enemy: "CaptureBot", Level: 0, Power: 2, Weight: 100}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + + ], + + "min_width" : 5, + "max_width" : 8, + "min_height" : 4, + "max_height" : 4, + + worldGenCode: () => { + //KDAddPipes(0.2, 0.35, 0.7, 0.2); + }, + + factionList: ["AncientRobot", "Dollsmith"], + + enemyTags: ["robot", "guardian", "tech", "metal", "electric", "earth", "explosiveBarrel"], + "defeat_outfit": "DollSuit", + "shrines": [ + {Type: "Latex", Weight: 5}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Leather", Weight: 7}, + {Type: "Metal", Weight: 10}, + {Type: "Rope", Weight: 3}, + {Type: "Will", Weight: 13},], + + "lockmult" : 2.0, + }, + + "Summit":{//DungeonName8,-Orrery- + curseTags: ["trap"], + successorNegative: { + cry: 1.0, + }, + successorPositive: { + bel: 0.5, + tmp: 0.5, + }, + successorSame: { + bel: 1.0, + }, + color: "#ffee83", + "background" : "SpookyForest", + "openness" : 1, + "density" : 9, + "crackchance" : 0.12, + "barchance" : 0.1, + "brightness" : 7, + "chestcount" : 7, + "chargerchance": 0.8, + "litchargerchance": 0.2, + "chargercount": 0, + "shrinecount" : 10, + "shrinechance" : 0.5, + "ghostchance" : 0.7, + "doorchance" : 0.9, + "nodoorchance" : 0.25, + "doorlockchance" : -0.05, + "trapchance" : 0.2, + "grateChance" : 0.8, + "rubblechance" : 0.35, + "brickchance" : 0.0, + "cacheInterval" : 1, + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + torchlitchance: 0.45, + torchchance: 1.0, + torchchanceboring: -0.7, + torchreplace: { + sprite: "OrbLantern", + brightness: 3, + }, + + music: { + "Shopping.ogg": 20, + }, + + tagModifiers: { + "jungle": 0, + "cavern": 0, + "temple": 0.0, + "urban": 0, + "industrial": 2.0, + "dungeon": 0, + "factory": 0.25, + "bellows": 0.0, + "library": 0.1, + }, + globalTags: { + "factory": true, + "industrial": true, + }, + + shadowColor: 0x000707, + + "setpieces": [ + ], + + + "traps": [ + ], + + "min_width" : 5, + "max_width" : 8, + "min_height" : 4, + "max_height" : 4, + + worldGenCode: () => { + //KDAddPipes(0.2, 0.35, 0.7, 0.2); + }, + + factionList: ["AncientRobot"], + + enemyTags: ["robot", "guardian", "tech", "metal", "electric", "earth", "explosiveBarrel"], + "defeat_outfit": "DollSuit", + "shrines": [ + {Type: "Latex", Weight: 5}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Leather", Weight: 7}, + {Type: "Metal", Weight: 10}, + {Type: "Rope", Weight: 3}, + {Type: "Will", Weight: 13},], + + "lockmult" : 2.0, + }, + + "vault":{//DungeonName8,-Orrery- + curseTags: ["cyberdollrestraints", "controlHarness"], + successorNegative: { + cry: 1.0, + }, + successorPositive: { + bel: 0.5, + tmp: 0.5, + }, + successorSame: { + bel: 1.0, + }, + color: "#ffee83", + "background" : "SpookyForest", + "openness" : 1, + "density" : 9, + "crackchance" : 0.12, + "barchance" : 0.1, + "brightness" : 1, + "chestcount" : 7, + "chargerchance": 0.8, + "litchargerchance": 0.2, + "chargercount": 0, + "shrinecount" : 10, + "shrinechance" : 0.5, + "ghostchance" : 0.7, + "doorchance" : 0.9, + "nodoorchance" : 0.25, + "doorlockchance" : -0.05, + "trapchance" : 0.2, + "grateChance" : 0.8, + "rubblechance" : 0.35, + "brickchance" : 0.0, + "cacheInterval" : 1, + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + torchlitchance: 0.45, + torchchance: 1.0, + torchchanceboring: -0.7, + torchreplace: { + sprite: "OrbLantern", + brightness: 3, + }, + + music: { + "AAA.ogg": 20, + }, + + tagModifiers: { + "jungle": 0, + "cavern": 0, + "temple": 0.0, + "urban": 0, + "industrial": 2.0, + "dungeon": 0, + "factory": 0.25, + "bellows": 0.0, + "library": 0.1, + }, + globalTags: { + "factory": true, + "industrial": true, + }, + + shadowColor: 0x000707, + + "setpieces": [ + {Type: "Bedroom", Weight: 1}, + {Type: "LargeGuardedChest", Weight: 20}, + ], + + + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, + {Name: "SpecificSpell", Spell: "TrapRopeHoly", Level: 0, Power: 3, Weight: 30}, + {Name: "SpawnEnemies", strict: true, Enemy: "Drone", Level: 0, Power: 3, Weight: 100}, + {Name: "SpawnEnemies", strict: true, Enemy: "CaptureBot", Level: 0, Power: 2, Weight: 100}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + + ], + + "min_width" : 5, + "max_width" : 8, + "min_height" : 4, + "max_height" : 4, + + worldGenCode: () => { + //KDAddPipes(0.2, 0.35, 0.7, 0.2); + }, + + factionList: ["AncientRobot"], + + enemyTags: ["robot", "guardian", "tech", "metal", "electric", "earth", "explosiveBarrel"], + "defeat_outfit": "DollSuit", + "shrines": [ + {Type: "Latex", Weight: 5}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Leather", Weight: 7}, + {Type: "Metal", Weight: 10}, + {Type: "Rope", Weight: 3}, + {Type: "Will", Weight: 13},], + + "lockmult" : 2.0, + }, + "bel":{//DungeonName8,-Orrery- + curseTags: ["blacksteelRestraints", "blacksteelchastity", "blacksteelCuffs"], + successorNegative: { + cav: 0.6, + cry: 0.4, + }, + successorPositive: { + bel: 0.5, + tmp: 0.5, + }, + successorSame: { + bel: 1.0, + }, + color: "#c52f45", + "background" : "SpookyForest", + "openness" : 1, + "density" : 9, + "crackchance" : 0.12, + "barchance" : 0.1, + "brightness" : 1, + "chestcount" : 7, + "chargerchance": 0.8, + "litchargerchance": 0.2, + "chargercount": 0, + "shrinecount" : 10, + "shrinechance" : 0.5, + "ghostchance" : 0.7, + "doorchance" : 0.9, + "nodoorchance" : 0.25, + "doorlockchance" : -0.05, + "trapchance" : 0.2, + "grateChance" : 0.8, + "rubblechance" : 0.35, + "brickchance" : 0.0, + "cacheInterval" : 1, + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + torchlitchance: 0.45, + torchchance: 1.0, + torchchanceboring: -0.7, + torchreplace: { + sprite: "Lantern", + unlitsprite: "LanternUnlit", + brightness: 5, + }, + + music: { + "AREA9-BELLOWS.ogg": 20, + "slimy_science_1.ogg": 9, + }, + + tagModifiers: { + "jungle": 0, + "cavern": 0, + "temple": 0.0, + "urban": 0, + "industrial": 2.0, + "dungeon": 0, + "factory": 2.0, + "bellows": 3.0, + "library": 0.1, + }, + globalTags: { + "factory": true, + "bellows": true, + "industrial": true, + }, + + shadowColor: 0x000703, + + "setpieces": [ + {Type: "Bedroom", Weight: 1}, + {Type: "LargeGuardedChest", Weight: 20}, + ], + + + "traps": [ + {Name: "CustomSleepDart", Level: 0, Power: 1, Weight: 20}, + {Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpawnEnemies", strict: true, Enemy: "Drone", Level: 0, Power: 3, Weight: 100}, + {Name: "SpawnEnemies", strict: true, Enemy: "CaptureBot", Level: 0, Power: 2, Weight: 100}, + {Name: "SpecificSpell", Spell: "TrapSlimeWeak", Level: 0, Power: 3, Weight: 10}, + {Name: "SpecificSpell", Spell: "TrapLatex", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLatexBubble", Level: 0, Power: 3, Weight: 25}, + {Name: "SpecificSpell", Spell: "TrapLatexBall", Level: 0, Power: 3, Weight: 15}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "OldDrone"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "OldDrone"}, + + ], + + "min_width" : 4, + "max_width" : 9, + "min_height" : 4, + "max_height" : 9, + deadend: 0.5, + + worldGenCode: () => { + KDAddPipes(0.2, 0.35, 0.7, 0.2); + }, + + factionList: ["Nevermere", "AncientRobot", "Maidforce", "Alchemist"], + + enemyTags: ["dollsmith", "dollrare", "oldrobot", "oldrobotturret", "tech", "metal", "electric", "fire", "explosiveBarrel"], + "defeat_outfit": "DollSuit", + "shrines": [ + {Type: "Latex", Weight: 5}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Leather", Weight: 7}, + {Type: "Metal", Weight: 10}, + {Type: "Rope", Weight: 3}, + {Type: "Will", Weight: 13},], + + "lockmult" : 2.0, + }, + + + "Dollmaker":{//DungeonName8,-Orrery- + curseTags: ["cyberdollrestraints", "latexRestraints", "latexRestraintsHeavy"], + successorNegative: { + cry: 1.0, + }, + successorPositive: { + bel: 0.5, + tmp: 0.5, + }, + successorSame: { + bel: 1.0, + }, + color: "#c52f45", + "background" : "SpookyForest", + "openness" : 1, + "density" : 9, + "crackchance" : 0.12, + "barchance" : 0.1, + "brightness" : 1, + "chestcount" : 7, + "chargerchance": 0.8, + "litchargerchance": 0.2, + "chargercount": 0, + "shrinecount" : 10, + "shrinechance" : 0.5, + "ghostchance" : 0.7, + "doorchance" : 0.9, + "nodoorchance" : 0.25, + "doorlockchance" : -0.05, + "trapchance" : 0.2, + "grateChance" : 0.8, + "rubblechance" : 0.35, + "brickchance" : 0.0, + "cacheInterval" : 1, + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + torchlitchance: 0.45, + torchchance: 1.0, + torchchanceboring: -0.7, + torchreplace: { + sprite: "Lantern", + unlitsprite: "LanternUnlit", + brightness: 5, + }, + + music: { + "UntitledRobot.ogg": 20, + }, + + tagModifiers: { + "jungle": 0, + "cavern": 0, + "temple": 0.0, + "urban": 0, + "industrial": 2.0, + "dungeon": 0, + "factory": 2.0, + "bellows": 3.0, + "library": 0.1, + }, + globalTags: { + "factory": true, + "bellows": true, + "industrial": true, + }, + + shadowColor: 0x000703, + + "setpieces": [ + {Type: "Bedroom", Weight: 1}, + {Type: "LargeGuardedChest", Weight: 20}, + ], + + + "traps": [ + {Name: "SpecificSpell", Spell: "TrapSlimeWeak", Level: 0, Power: 3, Weight: 10}, + {Name: "SpecificSpell", Spell: "TrapLatex", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLatexBubble", Level: 0, Power: 3, Weight: 30}, + + ], + + "min_width" : 6, + "max_width" : 8, + "min_height" : 4, + "max_height" : 4, + + worldGenCode: () => { + KDAddPipes(0.2, 0.35, 0.7, 0.2); + }, + + factionList: ["Nevermere", "AncientRobot", "Bandit", "Dressmaker", "Bountyhunter", "Maidforce", "Alchemist"], + + enemyTags: ["dollsmith", "dollrare", "oldrobot", "oldrobotturret", "tech", "metal", "electric", "fire", "explosiveBarrel"], + "defeat_outfit": "DollSuit", + "shrines": [ + {Type: "Latex", Weight: 5}, + {Type: "Elements", Weight: 5}, + {Type: "Conjure", Weight: 5}, + {Type: "Illusion", Weight: 5}, + {Type: "Leather", Weight: 7}, + {Type: "Metal", Weight: 10}, + {Type: "Rope", Weight: 3}, + {Type: "Will", Weight: 13}, + ], + + "lockmult" : 2.0, + }, + + + // Extra + "DemonTransition":{// DungeonName1,-Catacombs- + curseTags: ["trap", "obsidianRestraints", "shadowLatexRestraints", "shadowLatexRestraintsHeavy", "mithrilCuffs"], + successorNegative: { + DemonTransition: 1.0, + }, + successorPositive: { + DemonTransition: 1.0, + }, + successorSame: { + DemonTransition: 1.0, + }, + color: "#222222", + shadowColor: 0x000000, + "background" : "Dungeon", + "openness" : 0, + "density" : 2, + "crackchance" : 0.09, + "barchance" : 0.2, + "brightness" : 4, + "chestcount" : 0, + "shrinecount" : 12, + "chargerchance": 0.5, + "litchargerchance": 0.5, + "chargercount": 7, + "shrinechance" : 0.6, + "ghostchance" : 0.5, + "doorchance" : 0.8, + "nodoorchance" : 0.05, + "doorlockchance" : -0.05, + "doorlocktrapchance" : 0, + "trapchance" : 0.65, + "grateChance" : 0.1, + "rubblechance" : 0.3, + "brickchance" : 0.4, + "cacheInterval" : 1, + "forbiddenChance" : 0.72, + "forbiddenGreaterChance" : 0.33, + cageChance: 0.8, + torchlitchance: 0.2, + torchchance: 1.0, + torchchanceboring: -0.4, + torchreplace: { + sprite: "EdgeOrb", + unlitsprite: "EdgeOrbDead", + brightness: 5, + }, + + worldGenCode: () => { + }, + + music: { + "EDGEOFREALITY.ogg": 10, + }, + + tagModifiers: { + "narrow": 2, + "dungeon": 2, + "open": 0.5, + "jungle": 0, + "cavern": 0, + "library": 0, + }, + + "setpieces": [ + ], + + "traps": [ + {Name: "SpawnEnemies", Enemy: "ShadowHand", strict: true, Level: 0, Power: 3, Weight: 10}, + {Name: "SpawnEnemies", Enemy: "TickleTerror", strict: true, Level: 0, Power: 1, Weight: 10}, + {Name: "SpawnEnemies", Enemy: "HugHorror", strict: true, Level: 0, Power: 1, Weight: 10}, + {Name: "SpecificSpell", Spell: "TrapShadowLatex", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapObsidian", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapCrystal", Level: 0, Power: 3, Weight: 25}, + + {Name: "SpawnEnemies", Enemy: "Gag", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemMouthFull", filterBackup: "Observer"}, + {Name: "SpawnEnemies", Enemy: "Cuffs", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Observer"}, + {Name: "SpawnEnemies", Enemy: "AnimBlindfold", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemHeadFull", filterBackup: "Observer"}, + {Name: "SpawnEnemies", Enemy: "AnimYoke", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Observer"}, + {Name: "SpawnEnemies", Enemy: "AnimArmbinder", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Observer"}, + {Name: "SpawnEnemies", Enemy: "AnimHarness", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemTorsoFull", filterBackup: "Observer"}, + {Name: "SpawnEnemies", Enemy: "AnimChastity", strict: true, Level: 0, Power: 2, Weight: 10, arousalMode: true, filterTag: "ItemPelvisFull", filterBackup: "Observer"}, + {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Observer"}, + ], + + "min_width" : 4, + "max_width" : 7, + "min_height" : 4, + "max_height" : 6, + + factionList: ["Demon"], + + enemyTags: ["edgereality"], + "defeat_outfit": "Dungeon", + "shrines": [ + {Type: "Latex", Weight: 3}, + {Type: "Commerce", Weight: 0}, + {Type: "Leather", Weight: 5}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 2}, + {Type: "Will", Weight: 13},] + + }, + + "cst":{// Coast + curseTags: ["trap", "latexRestraints", "latexRestraintsHeavy"], + worldGenCode: () => { + for (let X = 1; X < KDMapData.GridWidth - 1; X++) { + for (let Y = 1; Y < KDMapData.GridHeight - 1; Y++) { + if (KinkyDungeonMapGet(X, Y) == 'X' + && (KDRandom() < 0.15 + 0.45 * Math.min(1, KinkyDungeonDifficulty/30) + || KDNearbyTiles(X, Y, 1.5).some((tile) => {return tile.tile == 'C';}))) { + KinkyDungeonMapSet(X, Y, '3'); + //DialogueCreateEnemy(X, Y, "MummyCursed"); + } + if (KinkyDungeonMapGet(X, Y) == 'B') { + let tile = KinkyDungeonTilesGet(`${X},${Y}`); + if (!tile) tile = KinkyDungeonTilesSet(`${X},${Y}`, {}); + tile.Skin = "ClamBed"; + } + } + } + }, + ceilinghookchance: 0, + successorNegative: { + cry: 0.3, + cav: 0.3, + jng: 0.2, + }, + successorPositive: { + cst: 0.6, + cry: 0.1, + cav: 0.1, + jng: 0.2, + }, + successorSame: { + cst: 1.0, + }, + color: "#e7cf1a", + "background" : "MagicSchoolLaboratory", + noReplace: "b", + "openness" : 10, + "density" : 1, + "crackchance" : 0.14, + "barchance" : 0.1, + + lightColor: 0xaaaaaa, + "brightness" : 8, + + "floodchance" : 0.5, + "chestcount" : 10, + "chargerchance": 0.8, + "litchargerchance": 0.25, + "chargercount": 6, + "shrinecount" : 11, + "shrinechance" : 0.5, + "ghostchance" : 0.5, + "doorchance" : 0.2, + "nodoorchance" : 0.6, + "doorlockchance" : -0.05, + "trapchance" : 0.3, + "grateChance" : 0.7, + "rubblechance" : 0.3, + "brickchance" : 0.01, + "cacheInterval" : 1, + // Side routes have more high-value loot + "forbiddenChance" : 1.0, + "forbiddenGreaterChance" : 0.45, + torchchance: 0.6, + torchchanceboring: -0.4, + + music: { + "AREA10-WEEPINGGARDEN.ogg": 10, + }, + + "setpieces": [ + {Type: "SmallAltar", Weight: 20}, + {Type: "GuardedChest", Weight: 30}, + {Type: "LargeGuardedChest", Weight: 20}, + {Type: "Magicflies", Weight: 40}, + {Type: "JungleLight", Weight: 100}, + ], + + tagModifiers: { + "urban": 0.1, + "jungle": 2, + "cavern": 2, + "library": 0, + "temple": 0.25, + }, + + + "traps": [ + {Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapRopeStrong", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 30}, + {Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 30}, + + {Name: "SpecificSpell", Spell: "TrapLatexBubble", Level: 0, Power: 3, Weight: 200}, + {Name: "SpecificSpell", Spell: "TrapLatexBall", Level: 0, Power: 3, Weight: 50}, + ], + + "min_width" : 5, + "max_width" : 6, + "min_height" : 6, + "max_height" : 7, + deadend: .15, + + factionList: ["Elf", "Bast", "Alchemist", "Apprentice"], + + enemyTags: ["nature", "elf", "bast", "bubble", "water", "aqua"], + "defeat_outfit": "Prisoner", + "shrines": [ + {Type: "Latex", Weight: 6}, + {Type: "Commerce", Weight: 0}, + {Type: "Elements", Weight: 6}, + {Type: "Conjure", Weight: 4}, + {Type: "Illusion", Weight: 4}, + {Type: "Metal", Weight: 3}, + {Type: "Rope", Weight: 4}, + {Type: "Leather", Weight: 6}, + {Type: "Will", Weight: 11},] + }, +}; + + +/*"fun":{//DungeonName4,-Fungal Caverns- + "openness" : 4, + "density" : 4, + "crackchance" : 0.15, + "barchance" : 0.15, + "brightness" : 7, + "chestcount" : 5, + "shrinecount" : 10, + "shrinechance" : 0.8, + "ghostchance" : 0.5, + "doorchance" : 0.05, + "nodoorchance" : 0.5, + "doorlockchance" : -0.05, + "trapchance" : 0.5, + "grateChance" : 0.7, + "rubblechance" : 0.9, + "brickchance" : 0.2, + + "traps": [ + {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, + ], + + "min_width" : 15, + "max_width" : 25, + "min_height" : 15, + "max_height" : 25, + }, + "blw":{//DungeonName5,-The Bellows- + "openness" : 1, + "density" : 1, + "crackchance" : 0.05, + "barchance" : 0.03, + "brightness" : 8, + "chestcount" : 6, + "shrinecount" : 8, + "shrinechance" : 0.75, + "ghostchance" : 0.5, + "doorchance" : 0.67, + "nodoorchance" : 0.1, + "doorlockchance" : -0.05, + "trapchance" : 0.5, + "grateChance" : 0.7, + "rubblechance" : 0.7, + "brickchance" : 0.3, + + "traps": [ + {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, + ], + + "min_width" : 25, + "max_width" : 51, + "min_height" : 13, + "max_height" : 15, + + "lockmult" : 2.0, + }, + "des":{//DungeonName6,-Underground Desert- + "openness" : 4, + "density" : 2, + "crackchance" : 0.13, + "barchance" : 0.03, + "brightness" : 5, + "chestcount" : 4, + "shrinecount" : 12, + "shrinechance" : 0.5, + "ghostchance" : 0.5, + "doorchance" : 0.0, + "nodoorchance" : 0.3, + "doorlockchance" : -0.05, + "trapchance" : 0.5, + "grateChance" : 0.7, + "rubblechance" : 0.3, + "brickchance" : 0.3, + + "traps": [ + {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, + ], + + "min_width" : 25, + "max_width" : 31, + "min_height" : 17, + "max_height" : 25, + }, + "ice":{//DungeonName7,-Kingdom of Ice- + "openness" : 2, + "density" : 1, + "crackchance" : 0.12, + "barchance" : 0.03, + "brightness" : 4, + "chestcount" : 4, + "shrinecount" : 10, + "shrinechance" : 0.8, + "ghostchance" : 0.5, + "doorchance" : 0.8, + "trapchance" : 0.5, + "grateChance" : 0.7, + "nodoorchance" : 0.2, + "rubblechance" : 0.5, + "brickchance" : 0.7, + + "traps": [ + {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, + ], + + "min_width" : 25, + "max_width" : 31, + "min_height" : 13, + "max_height" : 19, + + "lockmult" : 2.0, + }, + "mar":{//DungeonName8,-Marble Halls- + "openness" : 4, + "density" : 1, + "crackchance" : 0.12, + "barchance" : 0.03, + "brightness" : 8, + "chestcount" : 8, + "shrinecount" : 8, + "shrinechance" : 0.75, + "ghostchance" : 0.5, + "doorchance" : 1.0, + "nodoorchance" : 0.0, + "doorlockchance" : -0.05, + "trapchance" : 0.5, + "grateChance" : 0.7, + "rubblechance" : 0.7, + "brickchance" : 0.5, + + "traps": [ + {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, + ], + + "min_width" : 15, + "max_width" : 21, + "min_height" : 25, + "max_height" : 37, + + "lockmult" : 1.5, + }, + "lab":{//DungeonName9,-Ancient Laboratory- + "openness" : 2, + "density" : 1, + "crackchance" : 0.08, + "barchance" : 0.03, + "brightness" : 4, + "chestcount" : 10, + "shrinecount" : 6, + "shrinechance" : 0.75, + "ghostchance" : 0.5, + "doorchance" : 1.0, + "nodoorchance" : 0.0, + "doorlockchance" : -0.05, + "trapchance" : 0.5, + "grateChance" : 0.7, + "rubblechance" : 0.6, + "brickchance" : 0.9, + + "traps": [ + {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, + ], + + "min_width" : 25, + "max_width" : 31, + "min_height" : 13, + "max_height" : 19, + + "lockmult" : 4.0, + }, + "man":{//DungeonName10,-The Mansion- + "openness" : 10, + "density" : 1, + "crackchance" : 0.05, + "barchance" : 0.03, + "brightness" : 100, + "chestcount" : 0, + "shrinecount" : 0, + "shrinechance" : 0.25, + "ghostchance" : 0.5, + "doorchance" : 1.0, + "nodoorchance" : 0.0, + "doorlockchance" : -0.05, + "trapchance" : 0.5, + "grateChance" : 0.7, + "rubblechance" : 1.0, + "brickchance" : 0.7, + + "traps": [ + {Name: "SpawnEnemies", strict: true, Enemy: "SummonedSkeleton", Level: 0, Power: 4, Weight: 100}, + ], + + "min_width" : 31, + "max_width" : 31, + "min_height" : 19, + "max_height" : 19, + + "lockmult" : 0.0, + },*/ diff --git a/Game/src/map/KinkyDungeonSetpiece.ts b/Game/src/map/KinkyDungeonSetpiece.ts new file mode 100644 index 000000000..2cd99c84a --- /dev/null +++ b/Game/src/map/KinkyDungeonSetpiece.ts @@ -0,0 +1,1195 @@ +"use strict"; + +let KDSetpieceAttempts = 10; + +let KDSetPieces = [ + {Name: "Bedroom", tags: ["decorative", "urban"], Radius: 4}, + {Name: "Graveyard", tags: ["decorative", "temple"], Radius: 5}, + {Name: "Altar", tags: ["shrine", "temple"], Radius: 5}, + {Name: "SmallAltar", tags: ["shrine", "temple", "endpoint"], Radius: 3, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, + {Name: "FuukaAltar", tags: ["boss", "temple"], Radius: 7, Max: 1}, + {Name: "Storage", tags: ["loot", "urban", "endpoint"], Radius: 7}, + {Name: "GuardedChest", tags: ["loot", "endpoint"], Radius: 3, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, + {Name: "BanditPrison", tags: ["rep", "endpoint"], Radius: 3, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, + {Name: "QuadCell", tags: ["decorative", "urban"], Radius: 7}, + {Name: "PearlChest", tags: ["loot", "pearl"], Radius: 3, Prereqs: ["PearlEligible"], Max: 1, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, + {Name: "ShadowChest", tags: ["loot", "endpoint", "temple", "urban", "jungle", "cavern", "shadow"], Radius: 5, Max: 2}, + {Name: "GuaranteedCell", tags: ["jail", "urban", "endpoint", "industrial", "temple", "factory", "cavern", "jungle"], Radius: 5, Max: 1, xPad: 2}, + {Name: "ForbiddenChest", tags: ["loot", "temple", "urban", "endpoint"], Radius: 3, Max: 1, xPad: 1}, + //{Name: "ForbiddenHall", tags: ["loot", "temple", "open"], Radius: 7, Max: 1, xPad: 1}, + {Name: "Cache", tags: ["loot", "urban", "endpoint"], Radius: 7, Max: 1, xPad: 2}, + {Name: "ExtraCell", tags: ["jail", "urban", "endpoint"], Radius: 4, xPad: 2, yPad: 1, xPadEnd: 2, yPadEnd: 1}, + {Name: "JungleLight", tags: ["natural", "light"], noPOI: true, Radius: 1, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, + {Name: "Fireflies", tags: ["natural", "light"], noPOI: true, Radius: 1, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, + {Name: "Magicflies", tags: ["temple", "light"], noPOI: true, Radius: 1, xPad: 1, yPad: 1, xPadEnd: 1, yPadEnd: 1}, +]; + +let KDCountSetpiece = new Map(); + +type ChestEntry = { + x: number; + y: number; + priority: boolean; + Faction: string; + NoTrap: boolean; +} + +type ShrineEntry = { + x: number; + y: number; + priority: boolean; +} + +type SpawnEntry = { + x: number; + y: number; + required: string[]; + AI: string; + tags?: string[]; + ftags?: string[]; + faction?: string; + force?: boolean; + keys?: boolean; + priority?: boolean; + noPlay?: boolean; + levelBoost?: number; + forceIndex?: string; +} + +function KinkyDungeonPlaceSetPieces(POI: any, trapLocations: { x: number, y: number }[], chestlist: ChestEntry[], shrinelist: ShrineEntry[], chargerlist: any[], spawnPoints: SpawnEntry[], InJail: boolean, width: number, height: number) { + KDCountSetpiece = new Map(); + let pieces = new Map(); + + let Params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; + let setpieces = []; + let alt = !KDGameData.RoomType ? KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel) : KinkyDungeonAltFloor(KDGameData.RoomType); + let forcePOI = !alt || !alt.genType;//Params.forcePOI ? true : false; + if (!alt) { + Object.assign(setpieces, Params.setpieces); + setpieces.push({Type: "GuaranteedCell", Weight: 100000}); + + for (let i of KDGameData.ChestsGenerated) { + console.log(i); + } + + //if (!KDGameData.ChestsGenerated.includes("cache")) + //setpieces.push({Type: "Cache", Weight: 100000}); + //setpieces.push({Type: "PearlChest", Weight: 100}); + let forbiddenChance = Params.forbiddenChance != undefined ? Params.forbiddenChance : 1; + //let greaterChance = Params.forbiddenGreaterChance != undefined ? Params.forbiddenGreaterChance : 0.5; + if (KinkyDungeonStatsChoice.get("hardMode")) { + setpieces.push({Type: "ShadowChest", Weight: 10000}); + forbiddenChance = 1; + //greaterChance = Math.max(greaterChance, 1.0); + } + if (KDRandom() < forbiddenChance) { + if (!KDGameData.ChestsGenerated.includes("lessergold")) + setpieces.push({Type: "ForbiddenChest", Weight: 100000}); + } + } else { + for (let s of Object.entries(alt.setpieces)) { + setpieces.push({Type: s[0], Weight: s[1]}); + } + } + + if (KDGameData.MapMod) { + let mapmod = KDMapMods[KDGameData.MapMod]; + if (mapmod && mapmod.bonussetpieces) { + for (let s of mapmod.bonussetpieces) { + setpieces.push(s); + } + } + } + + // Populate the map + for (let p of KDSetPieces) { + let prereqs = true; + if (prereqs && p.Prereqs) { + if (prereqs && p.Prereqs.includes("PearlEligible")) { + let has = KDPearlRequirement(); + if (!has) prereqs = false; + } + } + if (prereqs) + pieces.set(p.Name, p); + } + + let pieceCount = width * height / 25; + let count = 0; + let fails = 0; + while (count < pieceCount && fails < KDSetpieceAttempts) { + let Piece = KinkyDungeonGetSetPiece(POI, setpieces, pieces); + if (Piece && pieces.get(Piece) && KinkyDungeonGenerateSetpiece(POI, pieces.get(Piece), InJail, + trapLocations, chestlist, shrinelist, chargerlist, spawnPoints, + forcePOI && !pieces.get(Piece).noPOI, alt, Params).Pass) { + count += 1; + KDCountSetpiece.set(Piece, KDCountSetpiece.get(Piece) ? (KDCountSetpiece.get(Piece) + 1) : 1); + } else fails += 1; + } + +} + +function KDGetFavoredSetpieces(POI: any, setpieces: any[]) { + let pieces = []; + for (let p of POI) { + if (p.used) continue; + for (let f of p.favor) { + if (!pieces.includes(f)) { + pieces.push(f); + } + } + } + return setpieces.filter((p) => {return pieces.includes(p.Name);}); +} +function KDGetFavoringSetpieces(Name: string, tags: string[], POI: any, POIBlacklist?: Map) { + let pois = []; + for (let p of POI) { + if (POIBlacklist && POIBlacklist.get(p)) continue; + if (p.used) continue; + if (p.favor.includes(Name)) { + pois.push(p); + } + } + // Always favor by name first + if (pois.length == 0) + for (let p of POI) { + if (POIBlacklist && POIBlacklist.get(p)) continue; + if (p.used) continue; + if (p.requireTags.length == 0 || p.requireTags.some((tag: string) => {return tags.includes(tag);})) { + pois.push(p); + } + } + + return pois[Math.floor(KDRandom() * pois.length)]; +} + +function KinkyDungeonGetSetPiece(POI: any, setpieces: any[], pieces: Map) { + let setpieces2 = KDGetFavoredSetpieces(POI, setpieces); + if (setpieces2.length < 1 || KDRandom() < 0.1) setpieces2 = setpieces; + + if (setpieces2) { + + let pieceWeightTotal = 0; + let pieceWeights = []; + + for (let piece of setpieces2) { + if (pieces.has(piece.Type) && (!pieces.get(piece.Type).Max || !(KDCountSetpiece.get(piece.Type) >= pieces.get(piece.Type).Max))) { + pieceWeights.push({piece: piece, weight: pieceWeightTotal}); + pieceWeightTotal += piece.Weight; + } + } + + let selection = KDRandom() * pieceWeightTotal; + + for (let L = pieceWeights.length - 1; L >= 0; L--) { + if (selection > pieceWeights[L].weight) { + return pieceWeights[L].piece.Type; + } + } + } +} + +function KinkyDungeonGenerateSetpiece ( + POI: any, + Piece: any, + InJail: boolean, + trapLocations: { x: number, y: number }[], + chestlist: ChestEntry[], + shrinelist: ShrineEntry[], + _chargerlist: any[], + spawnPoints: SpawnEntry[], + forcePOI: boolean, + altType: any, + MapParams: floorParams +) +{ + let radius = Piece.Radius; + let xPadStart = Piece.xPad || 5; + let yPadStart = Piece.yPad || 2; + let xPadEnd = Piece.xPadEnd || 2; + let yPadEnd = Piece.yPadEnd || 2; + if (InJail) { + xPadStart = Math.max(xPadStart, KinkyDungeonJailLeashX + 2); + } + let cornerX = Math.ceil(xPadStart) + Math.floor(KDRandom() * (KDMapData.GridWidth - xPadStart - xPadEnd - radius - 1)); + let cornerY = Math.ceil(yPadStart) + Math.floor(KDRandom() * (KDMapData.GridHeight - yPadStart - yPadEnd - radius - 1)); + + let favoringPOI = KDGetFavoringSetpieces(Piece.Name, Piece.tags ? Piece.tags : ["decorative"], POI); + if (favoringPOI) { + cornerX = favoringPOI.x - Math.floor(Piece.Radius / 2); + cornerY = favoringPOI.y - Math.floor(Piece.Radius / 2); + } + + let i = 0; + let POIBlacklist = new Map(); + for (i = 0; i < 1000; i++) { + let specialDist = KinkyDungeonGetClosestSpecialAreaDist(cornerX + Math.floor(radius/2) - 1, cornerY + Math.floor(radius/2)); + if (specialDist <= (forcePOI ? 0 : 1) + Math.ceil(radius/2) || !(cornerX > Math.ceil(xPadStart) && cornerX < KDMapData.GridWidth - radius - xPadEnd && cornerY > Math.ceil(yPadStart) && cornerY < KDMapData.GridHeight - radius - yPadEnd)) { + cornerY = Math.ceil(yPadStart) + Math.floor(KDRandom() * (KDMapData.GridHeight - yPadStart - yPadEnd - radius - 1)); + cornerX = Math.ceil(xPadStart) + Math.floor(KDRandom() * (KDMapData.GridWidth - xPadStart - radius - 1)); + + if (i < 100 || i % 3 == 0 || forcePOI) { + favoringPOI = KDGetFavoringSetpieces(Piece.Name, Piece.tags ? Piece.tags : ["decorative"], POI, POIBlacklist); + if (favoringPOI) { + cornerX = favoringPOI.x - Math.floor(Piece.Radius / 2); + cornerY = favoringPOI.y - Math.floor(Piece.Radius / 2); + POIBlacklist.set(favoringPOI, true); + } + } + } else break; + } + if (i > 990) { + console.log("Could not place " + Piece.Name); + return {Pass: false, Traps: trapLocations}; + } + + if (favoringPOI) + favoringPOI.used = true; + let skip = false; + if (forcePOI && !favoringPOI) { + skip = true; + } + + if (!skip) + switch (Piece.Name) { + case "Bedroom": + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, true, false, 1, true); + if (KDRandom() < 0.25) { + KinkyDungeonMapSet(cornerX + 2, cornerY + 3, 'D'); + KinkyDungeonMapSet(cornerX + 2, cornerY + 1, 'c'); + KinkyDungeonTilesSet("" + (cornerX + 2) + "," + (cornerY + 3), {Type: "Door", NoTrap: true, OL: true}); + } else if (KDRandom() < 0.33) { + KinkyDungeonMapSet(cornerX + 2, cornerY, 'D'); + KinkyDungeonMapSet(cornerX + 1, cornerY + 2, 'c'); + KinkyDungeonTilesSet("" + (cornerX + 2) + "," + (cornerY), {Type: "Door", NoTrap: true, OL: true}); + } else if (KDRandom() < 0.5) { + KinkyDungeonMapSet(cornerX + 3, cornerY + 2, 'D'); + KinkyDungeonMapSet(cornerX + 2, cornerY + 1, 'c'); + KinkyDungeonTilesSet("" + (cornerX + 3) + "," + (cornerY + 2), {Type: "Door", NoTrap: true, OL: true}); + } else { + KinkyDungeonMapSet(cornerX, cornerY + 2, 'D'); + KinkyDungeonMapSet(cornerX + 2, cornerY + 1, 'c'); + KinkyDungeonTilesSet("" + (cornerX) + "," + (cornerY + 2), {Type: "Door", NoTrap: true, OL: true}); + } + KinkyDungeonMapSet(cornerX + 1, cornerY + 1, 'B'); + if (KinkyDungeonStatsChoice.has("Nowhere") && !altType?.notraps) { + if (KDRandom() < 0.5) + KinkyDungeonTilesSet((cornerX + 1) + "," + (cornerY + 1), { + Type: "Trap", + Trap: "BedTrap", + Furniture: "Bed", + }); + } + if (KDRandom() < 0.15) spawnPoints.push({x:cornerX + 1, y:cornerY + 1, required: ["human"], AI: "guard"}); + break; + case "Graveyard": { + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 1, true); + // Place doors around pairs + KDCreateDoors(cornerX - 1, cornerY - 1, radius + 2, radius + 2); + let ghost = false; + for (let X = cornerX; X <= cornerX + radius - 1; X += 2) { + for (let Y = cornerY; Y < cornerY + radius; Y += 2) { + if (KDRandom() < 0.5) KinkyDungeonMapSet(X, Y, 'X'); + else if (KDRandom() < 0.33) KinkyDungeonMapSet(X, Y, 'a'); + else KinkyDungeonMapSet(X, Y, '2'); + if (!ghost && KDRandom() < 0.14) { + spawnPoints.push({x:X, y:Y, required: ["ghost"], tags: ["ghost"], AI: "guard"}); + ghost = true; + } + } + } + } + break; + case "Altar": + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 1, false); + // Place doors around pairs + KDCreateDoors(cornerX - 1, cornerY - 1, radius + 2, radius + 2); + KinkyDungeonMapSet(cornerX, cornerY , 'X'); + KinkyDungeonMapSet(cornerX + radius - 1, cornerY, 'X'); + KinkyDungeonMapSet(cornerX, cornerY + radius - 1, 'X'); + KinkyDungeonMapSet(cornerX + radius - 1, cornerY + radius - 1, 'X'); + shrinelist.push({x: cornerX + 2, y: cornerY + 2, priority: true}); + break; + case "SmallAltar": + if (!favoringPOI || KinkyDungeonBoringGet(cornerX + 1, cornerY + 1) < 3) skip = true; + else { + KinkyDungeonCreateRectangle(cornerX, cornerY, 2, 2, false, false, 0, false); + let xx = 1; + //if (KDRandom() < 0.5) { + // xx = 0; + //} + KinkyDungeonMapSet(cornerX + xx, cornerY + 1, 'a'); + shrinelist.push({x: cornerX + xx, y: cornerY + 1, priority: true}); + if (KinkyDungeonMapGet(cornerX + xx, cornerY) == '1') KinkyDungeonMapSet(cornerX + xx, cornerY, 'm'); + if (KinkyDungeonMapGet(cornerX + xx, cornerY + 2) == '1') KinkyDungeonMapSet(cornerX + xx, cornerY + 2, 'm'); + + if (KinkyDungeonMapGet(cornerX + xx - 1, cornerY) == '1') KinkyDungeonMapSet(cornerX + xx - 1, cornerY, 'X'); + if (KinkyDungeonMapGet(cornerX + xx - 1, cornerY + 1) == '1') KinkyDungeonMapSet(cornerX + xx - 1, cornerY + 1, 'm'); + if (KinkyDungeonMapGet(cornerX + xx - 1, cornerY + 2) == '1') KinkyDungeonMapSet(cornerX + xx - 1, cornerY + 2, 'X'); + + if (KinkyDungeonMapGet(cornerX + xx + 1, cornerY) == '1') KinkyDungeonMapSet(cornerX + xx + 1, cornerY, 'X'); + if (KinkyDungeonMapGet(cornerX + xx + 1, cornerY + 1) == '1') KinkyDungeonMapSet(cornerX + xx + 1, cornerY + 1, 'm'); + if (KinkyDungeonMapGet(cornerX + xx + 1, cornerY + 2) == '1') KinkyDungeonMapSet(cornerX + xx + 1, cornerY + 2, 'X'); + + // Place doors around pairs + KDCreateDoors(cornerX - 2 + xx, cornerY - 1, radius + 2, radius + 2); + } + break; + case "FuukaAltar": { + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 1, false); + KinkyDungeonMapSet(cornerX + 1, cornerY + 1 , 'o'); + KinkyDungeonMapSet(cornerX + radius - 2, cornerY + 1, 'o'); + KinkyDungeonMapSet(cornerX + 1, cornerY + radius - 2, 'o'); + KinkyDungeonMapSet(cornerX + radius - 2, cornerY + radius - 2, 'o'); + + KinkyDungeonMapSet(cornerX, cornerY + 3 , 'o'); + KinkyDungeonMapSet(cornerX + 3, cornerY , 'o'); + KinkyDungeonMapSet(cornerX + 3, cornerY + radius - 1 , 'o'); + KinkyDungeonMapSet(cornerX + radius - 1, cornerY + 3 , 'o'); + + let Enemy = KinkyDungeonGetEnemyByName("Fuuka1"); + let e = {tracking: true, Enemy: Enemy, id: KinkyDungeonGetEnemyID(), x:cornerX + 3, y:cornerY + 3, shield: Enemy.shield, hp: (Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, movePoints: 0, attackPoints: 0}; + KDAddEntity(e); + KDStageBossGenerated = true; + break; + } + case "PearlChest": + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, true); + /*if (KDRandom() < 0.6) KinkyDungeonMapSet(cornerX, cornerY , 'a'); + else shrinelist.push({x: cornerX, y: cornerY, priority: true}); + if (KDRandom() < 0.6) KinkyDungeonMapSet(cornerX + radius - 1, cornerY, 'a'); + else shrinelist.push({x: cornerX + radius - 1, y: cornerY, priority: true}); + if (KDRandom() < 0.6) KinkyDungeonMapSet(cornerX, cornerY + radius - 1, 'a'); + else shrinelist.push({x: cornerX, y: cornerY + radius - 1, priority: true}); + if (KDRandom() < 0.6) KinkyDungeonMapSet(cornerX + radius - 1, cornerY + radius - 1, 'a'); + else shrinelist.push({x: cornerX + radius - 1, y: cornerY + radius - 1, priority: true});*/ + KinkyDungeonMapSet(cornerX, cornerY + 1, 'a'); + KinkyDungeonMapSet(cornerX + radius - 1, cornerY + 1, 'a'); + KinkyDungeonMapSet(cornerX + 1, cornerY + 1, 'C'); + KinkyDungeonTilesSet((cornerX + 1) + "," + (cornerY + 1), {Loot: "pearl", Roll: KDRandom()}); + break; + case "ShadowChest": + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, false); + // Place doors around pairs + KDCreateDoors(cornerX - 1, cornerY - 1, radius + 2, radius + 2); + KinkyDungeonMapSet(cornerX, cornerY , 'o'); + KinkyDungeonMapSet(cornerX + radius - 1, cornerY, 'o'); + KinkyDungeonMapSet(cornerX, cornerY + radius - 1, 'o'); + KinkyDungeonMapSet(cornerX + radius - 1, cornerY + radius - 1, 'o'); + + if (!Piece.Chance || KDRandom() < Piece.Chance) { + KinkyDungeonMapSet(cornerX + 2, cornerY + 2, 'C'); + KinkyDungeonTilesSet((cornerX + 2) + "," + (cornerY + 2), { + Loot: "shadow", Roll: KDRandom(), + lootTrap: KDGenChestTrap(true, cornerX + 2, cornerY + 2, "shadow", undefined, false)} + ); + let chance = 0.75; + let chance2 = 0.25; + if (KDRandom() < chance) trapLocations.push({x: cornerX + 3, y: cornerY + 1}); + if (KDRandom() < chance) trapLocations.push({x: cornerX + 3, y: cornerY + 2}); + if (KDRandom() < chance) trapLocations.push({x: cornerX + 3, y: cornerY + 3}); + if (KDRandom() < chance) trapLocations.push({x: cornerX + 1, y: cornerY + 1}); + if (KDRandom() < chance) trapLocations.push({x: cornerX + 1, y: cornerY + 2}); + if (KDRandom() < chance) trapLocations.push({x: cornerX + 1, y: cornerY + 3}); + if (KDRandom() < chance) trapLocations.push({x: cornerX + 2, y: cornerY + 1}); + if (KDRandom() < chance) trapLocations.push({x: cornerX + 2, y: cornerY + 3}); + + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 1, y: cornerY}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 2, y: cornerY}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 3, y: cornerY}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 1, y: cornerY + radius - 1}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 2, y: cornerY + radius - 1}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 3, y: cornerY + radius - 1}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 1}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 2}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 3}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 1}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 2}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 3}); + } else { + shrinelist.push({x: cornerX+2, y: cornerY+2, priority: true}); + + let chance2 = 0.1; + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 1, y: cornerY}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 2, y: cornerY}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 3, y: cornerY}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 1, y: cornerY + radius - 1}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 2, y: cornerY + radius - 1}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + 3, y: cornerY + radius - 1}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 1}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 2}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX, y: cornerY + 3}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 1}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 2}); + if (KDRandom() < chance2) trapLocations.push({x: cornerX + radius - 1, y: cornerY + 3}); + } + + break; + case "GuaranteedCell": { + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, true, false, 1, true, true, true); + KinkyDungeonMapSet(cornerX+4, cornerY+2, 'D'); + KinkyDungeonTilesSet("" + (cornerX+4) + "," + (cornerY+2), {Type: "Door", Lock: "Red", NoTrap: true, Jail: true, ReLock: true, OL: true}); + KDMapData.PatrolPoints.push({x: cornerX + 5, y: cornerY + 2}); + + let sidestyle = Math.floor(KDRandom() * 3); + if (sidestyle == 0) { + // Porthole + //KinkyDungeonMapSet(cornerX+1, cornerY, 'b'); + KinkyDungeonMapSet(cornerX+1 + Math.floor(KDRandom() * 3), cornerY, 'b'); + //KinkyDungeonMapSet(cornerX+3, cornerY, 'b'); + } else if (sidestyle == 1) { + KinkyDungeonMapSet(cornerX, cornerY+1, 'b'); + KinkyDungeonMapSet(cornerX, cornerY+2, 'b'); + KinkyDungeonMapSet(cornerX, cornerY+3, 'b'); + } else { + KinkyDungeonMapSet(cornerX+1, cornerY+4, 'b'); + KinkyDungeonMapSet(cornerX+2, cornerY+4, 'b'); + KinkyDungeonMapSet(cornerX+3, cornerY+4, 'b'); + } + KinkyDungeonMapSet(cornerX+4, cornerY+1, 'b'); + KinkyDungeonMapSet(cornerX+4, cornerY+3, 'b'); + KinkyDungeonMapSet(cornerX+4, cornerY+1, 'b'); + + KinkyDungeonMapSet(cornerX+2, cornerY+2, 'B'); + if (KDRandom() < 0.0 + ((KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison) ? 1.0 : 0)) { + SetpieceSpawnPrisoner(cornerX+1, cornerY+1); + } + if (KDRandom() < 0.5 + ((KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison) ? 0.25 : 0)) { + SetpieceSpawnPrisoner(cornerX+1, cornerY+2); + } + if (KDRandom() < 0.5 + ((KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison) ? 0.25 : 0)) { + SetpieceSpawnPrisoner(cornerX+1, cornerY+3); + } + KDMapData.JailPoints.push({x: cornerX+2, y: cornerY+2, type: "jail", radius: 1}); + let t = []; + let jt = KDMapData.JailFaction?.length > 0 ? KinkyDungeonFactionTag[KDMapData.JailFaction[Math.floor(KDRandom() * KDMapData.JailFaction.length)]] : "jailer"; + t.push(jt); + spawnPoints.push({x:cornerX+5, y:cornerY + 1, required: ["jail", ...t], tags: t, AI: "guard", force: true, noPlay: true, keys: true, faction: KDGetMainFaction() || "Enemy"}); + spawnPoints.push({x:cornerX+5, y:cornerY + 3, required: ["jail", ...t], tags: t, AI: "guard", force: true, noPlay: true, keys: true, faction: KDGetMainFaction() || "Enemy"}); + KDTorch(cornerX + 2, cornerY, altType, MapParams); + break; + } + case "ExtraCell": { + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, true, false, 1, true, true); + KinkyDungeonMapSet(cornerX+3, cornerY+1, 'D'); + KinkyDungeonTilesSet("" + (cornerX+3) + "," + (cornerY+1), {Type: "Door", NoTrap: true, Jail: true, + Lock: "Red", + ReLock: true, OL: true}); + + + let t = []; + let jt = KDMapData.JailFaction?.length > 0 ? KinkyDungeonFactionTag[KDMapData.JailFaction[Math.floor(KDRandom() * KDMapData.JailFaction.length)]] : "jailer"; + t.push(jt); + spawnPoints.push({x:cornerX+4, y:cornerY + 2, required: ["jail", ...t], tags: t, AI: "guard", force: true, keys: true, faction: KDGetMainFaction() || "Enemy"}); + + KinkyDungeonMapSet(cornerX+3, cornerY+2, 'b'); + + // Chance for seethru + if (KDRandom() < 0.5) { + KinkyDungeonMapSet(cornerX, cornerY+1, 'b'); + KinkyDungeonMapSet(cornerX, cornerY+2, 'b'); + } + if (KDRandom() < 0.5) { + KinkyDungeonMapSet(cornerX+1, cornerY, 'b'); + KinkyDungeonMapSet(cornerX+2, cornerY, 'b'); + } + if (KDRandom() < 0.5) { + KinkyDungeonMapSet(cornerX+1, cornerY+3, 'b'); + KinkyDungeonMapSet(cornerX+2, cornerY+3, 'b'); + } + + if (KDRandom() < 0.6 + ((KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison) ? 0.35 : 0)) { + SetpieceSpawnPrisoner(cornerX+1, cornerY+2); + } + + KinkyDungeonMapSet(cornerX+1, cornerY+1, 'B'); + KDTorch(cornerX + 1, cornerY, altType, MapParams); + KDMapData.JailPoints.push({x: cornerX+1, y: cornerY+1, type: "jail", radius: 1}); + break; + } + case "JungleLight": { + if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(cornerX, cornerY))) skip = true; + else { + KinkyDungeonMapSet(cornerX, cornerY, '2'); + KinkyDungeonTilesSet((cornerX) + "," + (cornerY), {Light: 6, Skin: "LightRays"}); + } + break; + } + case "Fireflies": { + if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(cornerX, cornerY))) skip = true; + else + KinkyDungeonTilesSet((cornerX) + "," + (cornerY), {Light: 2, Skin: "Fireflies"}); + break; + } + case "Magicflies": { + if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(cornerX, cornerY))) skip = true; + else + KinkyDungeonTilesSet((cornerX) + "," + (cornerY), {Light: 2, Skin: "Magicflies"}); + break; + } + case "Storage": { + let rad = radius - 2; + KinkyDungeonCreateRectangle(cornerX + 1, cornerY + 1, rad, rad, true, false, 1, false); + KDMapData.PatrolPoints.push({x: cornerX + 1 + 2, y: cornerY + 1 + 2}); + KinkyDungeonMapSet(cornerX + 1+2, cornerY + 1 , KDRandom() < 0.5 ? 'D' : (KDRandom() < 0.5 ? 'g' : 'd')); + KinkyDungeonTilesSet("" + (cornerX + 1+2) + "," + (cornerY + 1), {Type: "Door"}); + KinkyDungeonMapSet(cornerX + 1+2, cornerY + 1+4 , KDRandom() < 0.5 ? 'D' : (KDRandom() < 0.5 ? 'g' : 'd')); + KinkyDungeonTilesSet("" + (cornerX + 1+2) + "," + (cornerY + 1+4), {Type: "Door"}); + + KinkyDungeonMapSet(cornerX + 1+1, cornerY + 1+1 , KDRandom() < 0.6 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); + if (KinkyDungeonMapGet(cornerX + 1+1, cornerY + 1+1) == 'C') + KinkyDungeonTilesSet((cornerX + 1 + 1) + "," + (cornerY + 1 + 1), {Loot: "storage", Roll: KDRandom()}); + KinkyDungeonMapSet(cornerX + 1+1, cornerY + 1+2 , KDRandom() < 0.5 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); + if (KinkyDungeonMapGet(cornerX + 1+1, cornerY + 1+2) == 'C') + KinkyDungeonTilesSet((cornerX + 1 + 1) + "," + (cornerY + 1 + 2), {Loot: "storage", Roll: KDRandom()}); + KinkyDungeonMapSet(cornerX + 1+1, cornerY + 1+3 , KDRandom() < 0.7 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); + if (KinkyDungeonMapGet(cornerX + 1+1, cornerY + 1+3) == 'C') + KinkyDungeonTilesSet((cornerX + 1 + 1) + "," + (cornerY + 1 + 3), {Loot: "storage", Roll: KDRandom()}); + KinkyDungeonMapSet(cornerX + 1+3, cornerY + 1+1 , KDRandom() < 0.5 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); + if (KinkyDungeonMapGet(cornerX + 1+3, cornerY + 1+1) == 'C') + KinkyDungeonTilesSet((cornerX + 1 + 3) + "," + (cornerY + 1 + 1), {Loot: "storage", Roll: KDRandom()}); + KinkyDungeonMapSet(cornerX + 1+3, cornerY + 1+2 , KDRandom() < 0.75 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); + if (KinkyDungeonMapGet(cornerX + 1+3, cornerY + 1+2) == 'C') + KinkyDungeonTilesSet((cornerX + 1 + 3) + "," + (cornerY + 1 + 2), {Loot: "storage", Roll: KDRandom()}); + KinkyDungeonMapSet(cornerX + 1+3, cornerY + 1+3 , KDRandom() < 0.5 ? 'L' : (KDRandom() < 0.5 ? 'c' : 'C')); + if (KinkyDungeonMapGet(cornerX + 1+3, cornerY + 1+3) == 'C') + KinkyDungeonTilesSet((cornerX + 1 + 3) + "," + (cornerY + 1 + 3), {Loot: "storage", Roll: KDRandom()}); + if (KDRandom() < 0.5) { + if (KDRandom() < 0.75) + spawnPoints.push({x:cornerX + 1+2, y:cornerY + 1+3, required:["beast"], AI: "guard"}); + else if (KDRandom() < 0.5) + spawnPoints.push({x:cornerX + 1+2, y:cornerY + 1+3, required:["human"], AI: "guard"}); + else + spawnPoints.push({x:cornerX + 1+2, y:cornerY + 1+3, required:["mold", "spawner"], tags: ["mold"], AI: "guard"}); + } + break; + } + case "GuardedChest": { + let chests = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)].chestcount ? KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)].chestcount : 6; + if ((!favoringPOI && KDRandom() < 0.7) || KinkyDungeonBoringGet(cornerX + 1, cornerY + 1) < 3 || chestlist.length >= chests) skip = true; + else { + // Hollow out a 3x3 area for the chest + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, false); + // Place doors around pairs + KDCreateDoors(cornerX - 1, cornerY - 1, radius + 2, radius + 2); + KDPlaceChest(cornerX, cornerY, radius, chestlist, spawnPoints); + } + break; + } + case "LargeGuardedChest": { + let chests = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)].chestcount ? KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)].chestcount : 6; + if ((!favoringPOI && KDRandom() < 0.7) || KinkyDungeonBoringGet(cornerX + 1, cornerY + 1) < 3 || chestlist.length >= chests) skip = true; + else { + // Hollow out a big area + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, false); + KinkyDungeonCreateRectangle(cornerX, cornerY - 1, radius, 1, false, false, 0, false); + KinkyDungeonCreateRectangle(cornerX, cornerY + radius, radius, 1, false, false, 0, false); + KinkyDungeonCreateRectangle(cornerX - 1, cornerY, 1, radius, false, false, 0, false); + KinkyDungeonCreateRectangle(cornerX + radius, cornerY, 1, radius, false, false, 0, false); + // Place doors around pairs + KDCreateDoors(cornerX - 2, cornerY - 2, radius + 4, radius + 4); + KDPlaceChest(cornerX, cornerY, radius, chestlist, spawnPoints); + } + break; + } + case "BanditPrison": { + if (KinkyDungeonBoringGet(cornerX + 1, cornerY + 1) < 3 + || !(KDGetMainFaction() && KDFactionRelation("Bandit", KDGetMainFaction()) < 0.2)) skip = true; + else { + // Hollow out a 2x2 area for the chest + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, false); + // Place the chest + DialogueCreateEnemy(cornerX+1, cornerY+1, "PrisonerBandit"); + //spawnPoints.push({x:cornerX, y:cornerY, required:["prisoner"], tags: ["bandit"], priority: true}); + // Place the guards + spawnPoints.push({x:cornerX, y:cornerY, required:["bountyhunter"], tags: ["human"], AI: "guard"}); + spawnPoints.push({x:cornerX+2, y:cornerY, required:["bountyhunter"], tags: ["human"], AI: "guard"}); + spawnPoints.push({x:cornerX, y:cornerY+2, required:["bountyhunter"], tags: ["human"], AI: "guard"}); + spawnPoints.push({x:cornerX+2, y:cornerY+2, required:["bountyhunter"], tags: ["human"], AI: "guard"}); + } + break; + } + case "QuadCell": { + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 1, true); + KDMapData.PatrolPoints.push({x: cornerX + 3, y: cornerY + 3}); + for (let X = cornerX; X < cornerX + radius; X++) { + KinkyDungeonMapSet(X, cornerY , '1'); + KinkyDungeonMapSet(X, cornerY+2 , '1'); + KinkyDungeonMapSet(X, cornerY+4 , '1'); + KinkyDungeonMapSet(X, cornerY+6, '1'); + } + KinkyDungeonMapSet(cornerX, cornerY+1, '1'); + KinkyDungeonMapSet(cornerX+3, cornerY+1, '1'); + KinkyDungeonMapSet(cornerX+6, cornerY+1, '1'); + KinkyDungeonMapSet(cornerX, cornerY+5, '1'); + KinkyDungeonMapSet(cornerX+3, cornerY+5, '1'); + KinkyDungeonMapSet(cornerX+6, cornerY+5, '1'); + KinkyDungeonMapSet(cornerX+2, cornerY+2, 'b'); + KinkyDungeonMapSet(cornerX+4, cornerY+2, 'b'); + KinkyDungeonMapSet(cornerX+2, cornerY+4, 'b'); + KinkyDungeonMapSet(cornerX+4, cornerY+4, 'b'); + + KinkyDungeonMapSet(cornerX + 2, cornerY + 1, 'B'); + KinkyDungeonMapSet(cornerX + 4, cornerY + 1, 'B'); + KinkyDungeonMapSet(cornerX + 2, cornerY + 5, 'B'); + KinkyDungeonMapSet(cornerX + 4, cornerY + 5, 'B'); + if (KinkyDungeonStatsChoice.has("Nowhere") && !altType?.notraps) { + if (KDRandom() < 0.5) + KinkyDungeonTilesSet((cornerX + 2) + "," + (cornerY + 1), { + Type: "Trap", + Trap: "BedTrap", + Furniture: "Bed", + }); + if (KDRandom() < 0.5) + KinkyDungeonTilesSet((cornerX + 4) + "," + (cornerY + 1), { + Type: "Trap", + Trap: "BedTrap", + Furniture: "Bed", + }); + if (KDRandom() < 0.5) + KinkyDungeonTilesSet((cornerX + 2) + "," + (cornerY + 5), { + Type: "Trap", + Trap: "BedTrap", + Furniture: "Bed", + }); + if (KDRandom() < 0.5) + KinkyDungeonTilesSet((cornerX + 4) + "," + (cornerY + 5), { + Type: "Trap", + Trap: "BedTrap", + Furniture: "Bed", + }); + } + + let closed = KinkyDungeonMapGet(cornerX+1, cornerY+2) == 'D'; + let l = "Red"; + KinkyDungeonMapSet(cornerX+1, cornerY+2, KDRandom() < 0.75 ? 'D' : 'd'); KinkyDungeonTilesSet("" + (cornerX+1) + "," + (cornerY + 2), {Type: "Door", NoTrap: true, OL: true, ReLock: true, Lock: closed ? l : undefined, OGLock: closed ? undefined : l}); + if (closed && KDRandom() < 0.5) + spawnPoints.push({x:cornerX + 2, y:cornerY + 1, required: ["human"], AI: "guard"}); + else if (closed && KDRandom() < 0.6 + ((KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison) ? 0.35 : 0)) { + SetpieceSpawnPrisoner(cornerX+2, cornerY+1); + } + + closed = KinkyDungeonMapGet(cornerX+5, cornerY+2) == 'D'; + KinkyDungeonMapSet(cornerX+5, cornerY+2, KDRandom() < 0.75 ? 'D' : 'd'); KinkyDungeonTilesSet("" + (cornerX+5) + "," + (cornerY + 2), {Type: "Door", NoTrap: true, OL: true, ReLock: true, Lock: closed ? l : undefined, OGLock: closed ? undefined : l}); + if (closed && KDRandom() < 0.5) + spawnPoints.push({x:cornerX + 4, y:cornerY + 1, required: ["human"], AI: "guard"}); + else if (closed && KDRandom() < 0.6 + ((KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison) ? 0.35 : 0)) { + SetpieceSpawnPrisoner(cornerX+4, cornerY+1); + } + + closed = KinkyDungeonMapGet(cornerX+1, cornerY+4) == 'D'; + KinkyDungeonMapSet(cornerX+1, cornerY+4, KDRandom() < 0.75 ? 'D' : 'd'); KinkyDungeonTilesSet("" + (cornerX+1) + "," + (cornerY + 4), {Type: "Door", NoTrap: true, OL: true, ReLock: true, Lock: closed ? l : undefined, OGLock: closed ? undefined : l}); + if (closed && KDRandom() < 0.5) + spawnPoints.push({x:cornerX + 2, y:cornerY + 5, required: ["human"], AI: "guard"}); + else if (closed && KDRandom() < 0.6 + ((KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison) ? 0.35 : 0)) { + SetpieceSpawnPrisoner(cornerX+2, cornerY+5); + } + + closed = KinkyDungeonMapGet(cornerX+5, cornerY+4) == 'D'; + KinkyDungeonMapSet(cornerX+5, cornerY+4, KDRandom() < 0.75 ? 'D' : 'd'); KinkyDungeonTilesSet("" + (cornerX+5) + "," + (cornerY + 4), {Type: "Door", NoTrap: true, OL: true, ReLock: true, Lock: closed ? l : undefined, OGLock: closed ? undefined : l}); + if (closed && KDRandom() < 0.5) + spawnPoints.push({x:cornerX + 4, y:cornerY + 5, required: ["human"], AI: "guard"}); + else if (closed && KDRandom() < 0.6 + ((KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison) ? 0.35 : 0)) { + SetpieceSpawnPrisoner(cornerX+4, cornerY+5); + } + + break; + } + case "Cache": { + let rad = radius - 2; + KinkyDungeonCreateRectangle(cornerX + 1, cornerY + 1, rad, rad, true, false, 1, true); + KDMapData.PatrolPoints.push({x: cornerX, y: cornerY + 3}); + KinkyDungeonMapSet(cornerX + 1 + Math.floor(rad/2), cornerY + 1 + Math.floor(rad/2), 'C'); + KinkyDungeonTilesSet((cornerX + 1 + Math.floor(rad/2)) + "," + (cornerY + 1 + Math.floor(rad/2)), {Loot: "cache", Faction: "Bandit", Roll: KDRandom()}); + KDTorch(cornerX + 1 + Math.floor(rad/2), cornerY + 1, altType, MapParams); + KinkyDungeonMapSet(cornerX + 1, cornerY + 1 + Math.floor(rad/2) - 1, 'b'); + KinkyDungeonMapSet(cornerX + 1, cornerY + 1 + Math.floor(rad/2) + 1, 'b'); + KinkyDungeonMapSet(cornerX + 1, cornerY + 1 + Math.floor(rad/2), 'D'); + spawnPoints.push({x:cornerX, y:cornerY + 1 + Math.floor(rad/2)-1, required: ["cacheguard"], tags: ["bandit"], AI: "guard", force: true}); + spawnPoints.push({x:cornerX, y:cornerY + 1 + Math.floor(rad/2)+1, required: ["cacheguard"], tags: ["bandit"], AI: "guard", force: true}); + KinkyDungeonTilesSet((cornerX + 1) + "," + (cornerY + 1 + Math.floor(rad/2)), {Type: "Door", Lock: "Red", OL: true, ReLock: true}); + break; + } + case "ForbiddenHall": { + //KinkyDungeonCreateRectangle(cornerX + 1, cornerY, radius, radius, false, false, 1, false); + KinkyDungeonCreateRectangle(cornerX+1, cornerY, radius-2, radius, true, false, 1, true); + + for (let X = cornerX + Math.floor(radius/2) - 1; X <= cornerX + Math.floor(radius/2) + 1; X++) { + for (let Y = cornerY + 1; Y < cornerY + radius - 1; Y++) { + if (!(X == cornerX + Math.floor(radius/2) && Y == cornerY + 1) && !(X == cornerX + Math.floor(radius/2) && Y == cornerY + radius - 2)) { + if (KDRandom() < 0.65) { + trapLocations.push({x: X, y: Y}); + } else if (X != cornerX + Math.floor(radius/2) && Y >= cornerY + 1) { + KinkyDungeonMapSet(X, Y, '2'); + } + } + } + } + + KinkyDungeonMapSet(cornerX + Math.floor(radius/2), cornerY + 1, 'C'); + KinkyDungeonMapSet(cornerX + Math.floor(radius/2) + 1, cornerY + radius - 1, '1'); + KinkyDungeonMapSet(cornerX + Math.floor(radius/2) - 1, cornerY + radius - 1, '1'); + KinkyDungeonMapSet(cornerX + Math.floor(radius/2), cornerY + radius - 1, '2'); + + KinkyDungeonTilesSet((cornerX + Math.floor(radius/2)) + "," + (cornerY + 1), {Loot: "gold", Faction: "AncientRobot", Roll: KDRandom()}); + + // Trapped Door + KinkyDungeonMapSet(cornerX + Math.floor(radius/2), cornerY + radius - 1, 'd'); + KinkyDungeonTilesSet((cornerX + Math.floor(radius/2)) + "," + (cornerY + radius - 1), { + Type: "Door", + StepOffTrap: "DoorLock", + SpawnMult: 0.5, + Lifetime: 12, + StepOffTiles: [ + (cornerX + Math.floor(radius/2) - 1) + "," + (cornerY + radius - 2), + (cornerX + Math.floor(radius/2)) + "," + (cornerY + radius - 2), + (cornerX + Math.floor(radius/2)) + 1 + "," + (cornerY + radius - 2) + ]}); + console.log("Created forbidden hall"); + break; + } + case "ForbiddenChest": { + KinkyDungeonCreateRectangle(cornerX, cornerY, radius, radius, false, false, 0, true); + KinkyDungeonCreateRectangle(cornerX, cornerY - 1, radius, 1, false, false, 0, false); + KinkyDungeonCreateRectangle(cornerX, cornerY + radius, radius, 1, false, false, 0, false); + KinkyDungeonCreateRectangle(cornerX - 1, cornerY, 1, radius, false, false, 0, false); + KinkyDungeonCreateRectangle(cornerX + radius, cornerY, 1, radius, false, false, 0, false); + // Place doors around pairs + KDCreateDoors(cornerX - 2, cornerY - 2, radius + 4, radius + 4); + KDMapData.PatrolPoints.push({x: cornerX + 2, y: cornerY + 2}); + + for (let X = cornerX; X < cornerX + radius; X++) { + for (let Y = cornerY; Y < cornerY + radius; Y++) { + if (!(X == cornerX + 1 && Y == cornerY + 1)) { + trapLocations.push({x: X, y: Y}); + } + } + } + + KinkyDungeonMapSet(cornerX + Math.floor(radius/2), cornerY + Math.floor(radius/2), 'C'); + + KinkyDungeonTilesSet((cornerX + Math.floor(radius/2)) + "," + (cornerY + Math.floor(radius/2)), {Loot: "lessergold", Roll: KDRandom()}); + console.log("Created lesser gold chest"); + break; + } + } + + if (!KDMapData.SpecialAreas) KDMapData.SpecialAreas = []; + if (!skip) + KDMapData.SpecialAreas.push({x: cornerX + Math.floor(radius/2), y: cornerY + Math.floor(radius/2), radius: Math.ceil(radius/2)}); + else if (favoringPOI) + favoringPOI.used = false; + + if ( TestMode) { + console.log("Created " + Piece.Name); + } + return {Pass: true, Traps: trapLocations}; +} + +/** + * This function unblocks movement to ensure a map is pathable + * @param x + * @param y + * @returns - whether it's possible + */ +function KDUnblock(x: number, y: number): boolean { + let blocked = false; + let blockTiles = "1X"; + let t = KinkyDungeonMapGet(x, y-1); + let tr = KinkyDungeonMapGet(x+1, y-1); + let tl = KinkyDungeonMapGet(x-1, y-1); + let r = KinkyDungeonMapGet(x+1, y); + let l = KinkyDungeonMapGet(x-1, y); + let b = KinkyDungeonMapGet(x, y-1); + let br = KinkyDungeonMapGet(x+1, y+1); + let bl = KinkyDungeonMapGet(x-1, y+1); + + let m_t = KinkyDungeonMovableTilesSmartEnemy.includes(t); + let m_tr = KinkyDungeonMovableTilesSmartEnemy.includes(tr); + let m_tl = KinkyDungeonMovableTilesSmartEnemy.includes(tl); + let m_r = KinkyDungeonMovableTilesSmartEnemy.includes(r); + let m_l = KinkyDungeonMovableTilesSmartEnemy.includes(l); + let m_b = KinkyDungeonMovableTilesSmartEnemy.includes(b); + let m_br = KinkyDungeonMovableTilesSmartEnemy.includes(br); + let m_bl = KinkyDungeonMovableTilesSmartEnemy.includes(bl); + + if (!blocked && m_t && m_b && !m_r && !m_l) { + if (KDRandom() < 0.5 && blockTiles.includes(r)) { + m_r = true; + KinkyDungeonMapSet(x + 1, y, '2'); // Set to brickwork + } else if (blockTiles.includes(l)) { + m_l = true; + KinkyDungeonMapSet(x - 1, y, '2'); // Set to brickwork + } else blocked = true; // Cancel + } + if (!blocked && m_r && m_l && !m_t && !m_b) { + if (KDRandom() < 0.5 && blockTiles.includes(b)) { + m_b = true; + KinkyDungeonMapSet(x, y + 1, '2'); // Set to brickwork + } else if (blockTiles.includes(t)) { + m_t = true; + KinkyDungeonMapSet(x, y - 1, '2'); // Set to brickwork + } else blocked = true; // Cancel + } + if (!blocked && m_tr && m_br && !m_r) { + if (blockTiles.includes(r)) { + m_r = true; + KinkyDungeonMapSet(x + 1, y, '2'); // Set to brickwork + } else if (!m_t && !m_l && !m_b) { + blocked = true; + } + } + if (!blocked && m_tl && m_bl && !m_l) { + if (blockTiles.includes(l)) { + m_l = true; + KinkyDungeonMapSet(x - 1, y, '2'); // Set to brickwork + } else if (!m_t && !m_r && !m_b) { + blocked = true; + } + } + if (!blocked && m_tl && m_tr && !m_t) { + if (blockTiles.includes(t)) { + m_t = true; + KinkyDungeonMapSet(x, y - 1, '2'); // Set to brickwork + } else if (!m_l && !m_b && !m_r) { + blocked = true; + } + } + if (!blocked && m_bl && m_br && !m_b) { + if (blockTiles.includes(b)) { + m_b = true; + KinkyDungeonMapSet(x, y + 1, '2'); // Set to brickwork + } else if (!m_l && !m_t && !m_r) { + blocked = true; + } + } + return !blocked; +} + +function SetpieceSpawnPrisoner(x: number, y: number, persistentOnly?: boolean, lock = "White", faction?: string) { + let Enemy = null; + let noJam = false; + let noPersistent = false; + let altRoom = KDGetAltType(MiniGameKinkyDungeonLevel); + if (altRoom?.noPersistentPrisoners) noPersistent = true; + let capturedPersistent = KDGetCapturedPersistent( + MiniGameKinkyDungeonLevel, + KDGameData.RoomType, + KDGameData.MapMod, + KDMapData.MapFaction).filter( + (en) => { + return !en.entity?.Enemy?.tags?.noPrisoner; + } + ); + let persistentAvailable = + KDGameData.CapturedParty?.length > 0 + || capturedPersistent.length > 0; + + + let tile = KinkyDungeonTilesGet(x + ',' + y); + let furn = KDFurniture[tile?.Furniture]; + let rest: restraint = furn ? KinkyDungeonGetRestraint( + {tags: [furn.restraintTag]}, MiniGameKinkyDungeonLevel, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, + "", + true, + false, + false, undefined, true) : null; + + if (!noPersistent && persistentAvailable) { + /** + */ + let e: entity = null; + if (KDGameData.CapturedParty?.length > 0) { + let index = Math.floor(KDRandom() * KDGameData.CapturedParty.length); + if (!KDGameData.SpawnedPartyPrisoners) KDGameData.SpawnedPartyPrisoners = {}; + e = KDGameData.CapturedParty[index]; + KDGameData.SpawnedPartyPrisoners[e.id + ""] = Math.max(MiniGameKinkyDungeonLevel, 1); + KDGameData.CapturedParty.splice(index, 1); + } else if (capturedPersistent.length > 0) { + let index = Math.floor(KDRandom() * capturedPersistent.length); + let npc = capturedPersistent[index]; + e = npc.entity; + KDMovePersistentNPC(npc.id, KDGetCurrentLocation()); + if (!altRoom || (!altRoom?.alwaysRegen && (altRoom?.makeMain || altRoom?.persist))) { + npc.jailed = true; + } + } + + Enemy = e.Enemy; + noJam = true; + e.x = x; + e.y = y; + e = KDAddEntity(e); + + e.faction = "Prisoner"; + e.boundLevel = e.hp * 11; + e.items = []; + + KDImprisonEnemy(e, noJam, "auto", rest ? { + name: rest.name, + lock: lock, + id: KinkyDungeonGetItemID(), + faction: KDGetMainFaction() || "Jail", + } : undefined, furn?.restraintSetTags, faction || furn?.forceFaction || KDGetMainFaction()); + + } else if (!persistentOnly) { + Enemy = KinkyDungeonGetEnemy(["imprisonable", + "ropeAnger", "ropeRage", + "metalAnger", "metalRage", + "latexAnger", "latexRage", + "conjureAnger", "conjureRage", + "elementsAnger", "elementsRage", + "illusionAnger", "illusionRage", + "leatherAnger", "leatherRage", + "willAnger", "willRage"], MiniGameKinkyDungeonLevel * 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), KinkyDungeonMapGet(x, y), ["imprisonable"]); + if (Enemy) { + let e = DialogueCreateEnemy(x, y, Enemy.name); + if ( + KDImprisonEnemy(e, noJam, "auto", rest ? { + name: rest.name, + lock: lock, + id: KinkyDungeonGetItemID(), + faction: KDGetMainFaction() || "Jail", + } : undefined, furn?.restraintSetTags, faction || furn?.forceFaction || KDGetMainFaction(), true)) { + e.faction = "Prisoner"; + e.boundLevel = e.hp * 11; + //e.prisondialogue = "PrisonerJail"; + e.items = []; + } else { + // Just spawn them with no items + e.playerdmg = undefined; + if (e.hp <= 0.5) e.hp = 0.51; + e.items = []; + } + } + } + +} + + +function KDTorch(X: number, Y: number, altType: any, MapParams: any) { + let torchreplace = (altType && altType.torchreplace) ? altType.torchreplace : (MapParams.torchreplace ? MapParams.torchreplace : null); + KDCreateEffectTile(X, Y + 1, { + name: torchreplace?.sprite ? torchreplace.sprite : "Torch", + duration: 9999, infinite: true, + }, 0); + // Create dummy tile to prevent replace at worldgen + if (!KinkyDungeonTilesGet(X + "," + Y)) + KinkyDungeonTilesSet(X + "," + Y, {}); +} + +function KDTorchUnlit(X: number, Y: number, altType: any, MapParams: any) { + let torchreplace = (altType && altType.torchreplace) ? altType.torchreplace : (MapParams.torchreplace ? MapParams.torchreplace : null); + KDCreateEffectTile(X, Y + 1, { + name: torchreplace?.unlitsprite ? torchreplace.unlitsprite : "TorchUnlit", + duration: 9999, infinite: true, + }, 0); + // Create dummy tile to prevent replace at worldgen + if (!KinkyDungeonTilesGet(X + "," + Y)) + KinkyDungeonTilesSet(X + "," + Y, {}); +} + +function KDChest(X: number, Y: number, loot: string = "chest", faction: string = "") { + KinkyDungeonMapSet(X, Y, 'C'); + KinkyDungeonTilesSet((X) + "," + (Y), {Loot: loot, Faction: faction, Roll: KDRandom()}); +} + +function KDCreateDoors(Left: number, Top: number, Width: number, Height: number, openChance: number = 0, convertDoodads: boolean = true) { + let doors: Record = {}; + + // Create double doors + let rows = [Top, Top + Height - 1]; + for (let r of rows) { + // Ignore rows that are out of bounds + if (r > 0 && r < KDMapData.GridHeight - 1) { + for (let x = Left; x < Left + Width - 3; x++) { + if (x > 0 && x < KDMapData.GridWidth - 4 + && (KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(x, r)) || (convertDoodads && KinkyDungeonMapGet(x, r) == 'X')) + && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(x+1, r)) + && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(x+2, r)) + && (KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(x+3, r)) || (convertDoodads && KinkyDungeonMapGet(x+3, r) == 'X'))) { + if ((KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 1, r - 1)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 1, r + 1))) + || (KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 2, r - 1)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(x + 2, r + 1)))) { + doors[(x + 1) + "," + r] = {x: x + 1, y: r}; + doors[(x + 2) + "," + r] = {x: x + 2, y: r}; + } + } + } + } + } + let cols = [Left, Left + Width - 1]; + for (let c of cols) { + // Ignore rows that are out of bounds + if (c > 0 && c < KDMapData.GridWidth - 1) { + for (let y = Top; y < Top + Height - 3; y++) { + if (y > 0 && y < KDMapData.GridHeight - 4 + && (KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(c, y)) || (convertDoodads && KinkyDungeonMapGet(c, y) == 'X')) + && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(c, y + 1)) + && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(c, y + 2)) + && (KinkyDungeonWallTiles.includes(KinkyDungeonMapGet(c, y + 3)) || (convertDoodads && KinkyDungeonMapGet(c, y + 3) == 'X'))) { + if ((KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(c - 1, y + 1)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(c + 1, y + 1))) + || (KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(c - 1, y + 2)) && KinkyDungeonMovableTiles.includes(KinkyDungeonMapGet(c + 1, y + 2)))) { + doors[c + "," + (y + 1)] = {x: c, y: y + 1}; + doors[c + "," + (y + 2)] = {x: c, y: y + 2}; + } + } + } + } + } + + // Create singleton doors + + + // Place the doors + for (let d of Object.values(doors)) { + let tile = KDRandom() < openChance ? 'd' : 'D'; + KinkyDungeonMapSet(d.x, d.y, tile); + KinkyDungeonTilesSet(d.x + "," + d.y, {Type: "Door", NoTrap: true}); + } + +} + +function KDPlaceChest(cornerX: number, cornerY: number, _radius: number, chestlist: ChestEntry[], spawnPoints: SpawnEntry[], NoAddToChestList?: boolean): string { + // Determine faction + let bandit = [ + {faction: "Bandit", tags: ["bandit"], rtags: ["bandit"], ftags: ["miniboss", "boss"]}, + ]; + let factionList = [ + ...bandit, + {faction: "Dragon", tags: ["dragon"], rtags: ["dragon"], ftags: ["miniboss", "boss"]}, + {faction: "AncientRobot", tags: ["robot"], rtags: ["robot"], ftags: ["miniboss", "boss", "oldrobot"]}, + {faction: "Maidforce", tags: ["maid"], rtags: ["maid"], ftags: ["miniboss", "boss"]}, + {faction: "Bountyhunter", tags: ["bountyhunter"], rtags: ["bountyhunter"], ftags: ["miniboss", "boss"]}, + {faction: "Dressmaker", tags: ["dressmaker"], rtags: ["dressmaker"], ftags: ["miniboss", "boss"]}, + {faction: "Witch", tags: ["witch", "apprentice", "skeleton"], rtags: ["witch", "apprentice", "skeleton"], ftags: ["miniboss", "boss"]}, + {faction: "Apprentice", tags: ["apprentice"], rtags: ["apprentice"], ftags: ["miniboss", "boss"]}, + //{faction: "Mushy", tags: ["mushroom"], rtags: ["mushy"], ftags: ["miniboss", "boss"]}, + {faction: "Nevermere", tags: ["nevermere"], rtags: ["nevermere"], ftags: ["miniboss", "boss"]}, + {faction: "Bast", tags: ["mummy"], rtags: ["mummy"], ftags: ["miniboss", "boss"]}, + {faction: "Elf", tags: ["elf"], rtags: ["elf"], ftags: ["miniboss", "boss"]}, + {faction: "Elemental", tags: ["elemental", "witch"], rtags: ["elemental", "witch"], ftags: ["miniboss", "boss"]}, + {faction: "Alchemist", tags: ["alchemist"], rtags: ["alchemist"], ftags: ["miniboss", "boss"]}, + ]; + let factions = []; + if (KDMapData.MapFaction) { + factions.push(KDMapData.MapFaction); + } + if (KDMapData.JailFaction) { + factions.push(...KDMapData.JailFaction); + } + if (KDMapData.GuardFaction) { + factions.push(...KDMapData.GuardFaction); + } + factions = factions.filter((faction) => { + return factionList.some((element) => {return element.faction == faction;}); + }); + if (factions.length > 0) { + let fl = factions; + let checkpoint = (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint); + let chosenFaction = KDGetByWeight(KDGetFactionProps(fl, MiniGameKinkyDungeonLevel, checkpoint, + KinkyDungeonMapParams[checkpoint].enemyTags || [], {})); + factionList = factionList.filter((entry) => { + return chosenFaction == entry.faction || KDFactionRelation(chosenFaction, entry.faction) > .35; + }); + } + let factionSelected = factionList[Math.floor(KDRandom() * factionList.length)]; + if (!factionSelected) { + factionSelected = bandit[0]; + } + // Place the chest + if (!NoAddToChestList) { + chestlist.push({x: cornerX + 1, y: cornerY + 1, priority: true, Faction: factionSelected.faction, NoTrap: true}); + } + // Place the guards + spawnPoints.push({priority: true, x:cornerX, y:cornerY, required:[factionSelected.rtags[Math.floor(KDRandom()*factionSelected.rtags.length)]], ftags: factionSelected.ftags, tags: factionSelected.tags, AI: "guard"}); + spawnPoints.push({priority: true, x:cornerX+2, y:cornerY, required:[factionSelected.rtags[Math.floor(KDRandom()*factionSelected.rtags.length)]], ftags: factionSelected.ftags, tags: factionSelected.tags, AI: "guard"}); + spawnPoints.push({priority: true, x:cornerX, y:cornerY+2, required:[factionSelected.rtags[Math.floor(KDRandom()*factionSelected.rtags.length)]], ftags: factionSelected.ftags, tags: factionSelected.tags, AI: "guard"}); + spawnPoints.push({priority: true, x:cornerX+2, y:cornerY+2, required:[factionSelected.rtags[Math.floor(KDRandom()*factionSelected.rtags.length)]], ftags: factionSelected.ftags, tags: factionSelected.tags, AI: "guard"}); + + return factionSelected.faction; +} + +function KDAddPipes(pipechance: number, pipelatexchance: number, thinlatexchance: number, heavylatexspreadchance: number): void { + for (let x = 1; x < KDMapData.GridWidth - 2; x++) + for (let y = 1; y < KDMapData.GridHeight - 2; y++) { + if ( + KinkyDungeonMapGet(x, y) == '1' + && KinkyDungeonMapGet(x, y+1) == '0' + && !KinkyDungeonTilesGet(x + "," + y) + && !KinkyDungeonEnemyAt(x, y+1) + && !(Object.entries(KDGetEffectTiles(x, y+1)).length > 0) + && KDRandom() < pipechance) { + KinkyDungeonTilesSet(x + "," + y, {Skin: "EmptyPipe"}); + if (KDRandom() < pipelatexchance) { + KinkyDungeonTilesSet(x + "," + y, {Skin: "LatexPipe"}); + let name = "LatexThin"; + if (KDRandom() > thinlatexchance) { + let rad = 2; + for (let XX = Math.max(1, x - rad); XX < Math.min(KDMapData.GridWidth - 2, x + rad); XX++) + for (let YY = Math.max(1, y - rad); YY < Math.min(KDMapData.GridHeight - 2, y + rad); YY++) { + if (KinkyDungeonMapGet(XX, YY) == '0' && KDRandom() < heavylatexspreadchance) { + KDCreateEffectTile(x, y + 1, { + name: "LatexThin", + duration: 9999, infinite: true, + }, 0); + } + } + } + KDCreateEffectTile(x, y + 1, { + name: name, + duration: 9999, infinite: true, + }, 0); + } + } + } +} + +function KDGetNPCRestraintJailDialogueType(restraint: NPCRestraint) { + let r = KDRestraint(restraint); + if (r.shrine?.includes("Latex")) { + return "PrisonerLatex"; + } + return "PrisonerJail"; +} + +/** + * @param e + * @param noJam + * @param [dialogue] + * @param [restraint] + */ +function KDImprisonEnemy(e: entity, noJam: boolean, dialogue: string = "auto", + restraint?: NPCRestraint, restraintSet?: Record, faction: string = "", force?: boolean): boolean { + if (!e || (!force && !KDCapturable(e))) return false; + if (dialogue == 'auto') { + if (restraint) { + dialogue = KDGetNPCRestraintJailDialogueType(restraint); + } else if (KDGetNPCRestraints(e.id)?.Device) { + dialogue = KDGetNPCRestraintJailDialogueType(KDGetNPCRestraints(e.id).Device); + } else if (KDGetNPCRestraints(e.id)?.ArmEncase) { + dialogue = KDGetNPCRestraintJailDialogueType(KDGetNPCRestraints(e.id).ArmEncase); + } else if (KDGetNPCRestraints(e.id)?.HeavyBondage) { + dialogue = KDGetNPCRestraintJailDialogueType(KDGetNPCRestraints(e.id).HeavyBondage); + } else dialogue = "PrisonerJail"; + } + if (noJam) + KinkyDungeonSetEnemyFlag(e, "nojam", -1); + e.prisondialogue = dialogue; + KinkyDungeonSetEnemyFlag(e, "noswap", -1); + KinkyDungeonSetEnemyFlag(e, "imprisoned", -1); + if (restraint) { + KDSetNPCRestraint(e.id, "Device", restraint); + // Add the tieup value + KDNPCRestraintTieUp(e.id, restraint, 1); + } + if (restraintSet) { + KDAddFurnitureRestraintSet(e, restraintSet, faction); + } + e.playerdmg = undefined; + if (e.hp <= 0.5) e.hp = 0.51; + KDSetToExpectedBondage(e, 1); + if (KDIsNPCPersistent(e.id)) KDUpdatePersistentNPC(e.id); + return true; +} diff --git a/Game/src/map/KinkyDungeonShrine.ts b/Game/src/map/KinkyDungeonShrine.ts new file mode 100644 index 000000000..5c9186b43 --- /dev/null +++ b/Game/src/map/KinkyDungeonShrine.ts @@ -0,0 +1,958 @@ +"use strict"; + +/** + * Base costs for all the shrines. Starts at this value, increases thereafter + */ +let KinkyDungeonShrineBaseCosts: Record = { + //"Charms": 25, + "Leather": 40, + "Latex": 40, + "Rope": 20, + "Metal": 60, + "Will": 20, + "Elements": 200, + "Conjure": 200, + "Illusion": 200, +}; + +let KDRewardProgramScaling = 500; +let KDRewardProgramBase = 500; + +let KDWillShrineWill = 0.25; +let KinkyDungeonOrbAmount = 0; +let KDShrineRemoveCount = 30; +let KDMaxGoddessBonus = 0.2; +let KDMinGoddessBonus = 0.15; + +/** + * Cost growth, overrides the default amount + */ +let KinkyDungeonShrineBaseCostGrowth: Record = { + "Elements": 2, + "Conjure": 2, + "Illusion": 2, +}; + +let KinkyDungeonShopIndex = 0; + +let KinkyDungeonShrinePoolChancePerUse = 0.2; + +/** + * Current costs multipliers for shrines + */ +let KinkyDungeonShrineCosts: Record = {}; + +let KinkyDungeonShrineTypeRemove = ["Charms", "Leather", "Metal", "Rope", "Latex", "Gags", "Blindfolds", "Boots"]; // These shrines will always remove restraints associated with their shrine + +function KinkyDungeonShrineInit() { + KinkyDungeonShrineCosts = {}; + KDMapData.PoolUsesGrace = 3; + + KinkyDungeonInitReputation(); + +} + + +/** + * @param Name + */ +function KDGoddessColor(Name: string): string { + let color = "#ffffff"; + if (Name == "Illusion") color = "#8154FF"; + else if (Name == "Conjure") color = "#D4AAFF"; + else if (Name == "Elements") color = "#ff5277"; + else if (Name == "Latex") color = "#2667FF"; + else if (Name == "Leather") color = "#442E1E"; + else if (Name == "Metal") color = "#222222"; + else if (Name == "Rope") color = "#7C4926"; + else if (Name == "Will") color = "#23FF44"; + return color; +} + +function KinkyDungeonShrineAvailable(type: string): boolean { + if (type == "Commerce") { + if (KDMapData.ShopItems.length > 0) return true; + else return false; + } + if (KinkyDungeonShrineTypeRemove.includes(type) && KinkyDungeonGetRestraintsWithShrine(type, undefined, undefined, undefined, + KinkyDungeonStatsChoice.get("ExclusionsApply")).length > 0) return true; + else if ((type == "Elements" || type == "Illusion" || type == "Conjure")) return true; + else if (type == "Will" && (KinkyDungeonStatMana < KinkyDungeonStatManaMax || KinkyDungeonStatManaPool < KinkyDungeonStatManaPoolMax || KinkyDungeonStatWill < KinkyDungeonStatWillMax)) return true; + + return false; +} + +let KDLevelsPerCheckpoint = 4; + +/** + * @param Level + */ +function KinkyDungeonGenerateShop(Level: number): any[] { + let ShopItems = []; + let items_mid = 0; + let items_high = 0; + let itemCount = 8 + Math.floor(KDRandom() * 3); + if (KinkyDungeonStatsChoice.has("Supermarket")) { + items_mid = -1; + items_high = -1; + itemCount += 2; + } + let uniqueTags: Record = {}; + for (let I = itemCount; I > 0; I--) { + let Rarity = Math.floor(KDRandom() * 0.4 * KDMaxRarity/KinkyDungeonMaxLevel*Level); + if (items_high < 3) { + Rarity = 2 + Math.floor(KDMaxRarity/KinkyDungeonMaxLevel*Level); + items_high += 1;} + else if (items_mid < 5) { + Rarity = Math.floor(KDRandom() + (0.4+KDRandom() * 0.35) * KDMaxRarity/KinkyDungeonMaxLevel*Level); + items_mid += 1;} + + let item = KinkyDungeonGetShopItem(Level, Rarity, true, ShopItems, uniqueTags); + if (item) { + if (item.uniqueTags) { + for (let t of item.uniqueTags) { + uniqueTags[t] = true; + } + } + ShopItems.push({name: item.name, countItem: item.countItem, shoptype: item.shoptype, consumable: item.consumable, quantity: item.quantity, rarity: item.rarity, cost: item.cost}); + } + + } + ShopItems.sort(function(a, b){return a.rarity-b.rarity;}); + return ShopItems; +} + +/** + * @param item - needs to be an item or a shopItem + * @param [noScale] + * @param [sell] + */ +function KinkyDungeonItemCost(item: any, noScale?: boolean, sell?: boolean): number { + if (!item) return 0; + if (item.cost != null) return item.cost; + + if (KDRestraint(item)) { + let restraint = KDRestraint(item); + let power = restraint.displayPower || restraint.power; + if (!power || power < 0.1) power = 0.1; + if (restraint.armor) power += 3; + if (restraint.protection) power += 3*restraint.protection; + if (KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]) { + let enchants: Record = {}; + for (let ev of KinkyDungeonRestraintVariants[item.inventoryVariant || item.name].events) { + if (ev.original && KDEventEnchantmentModular[ev.original]) enchants[ev.original] = KDEventEnchantmentModular[ev.original].types[KDModifierEnum[item.type || 'restraint']].level; + } + let sum = 0; + for (let amt of Object.values(enchants)) { + sum += amt; + } + power += sum; + } + let costt = KDRestraint(item).value || ( + //Math.ceil((1 + MiniGameKinkyDungeonLevel/KDLevelsPerCheckpoint/2.5 * (noScale ? 0 : 1))*( + //sell ? (40 * (-0.5*power-0.6+1.25**(2.38*power))) + //: (50 * 1.25**(2.38*power)) + //)) + Math.round(((1 - 3.67*power + 3.54*(power**0.5) + 2 * Math.pow(power, 1.6)))) + //b=((1-3.67\cdot x\ +3.54\cdot\ x^{0.5}+2\cdot x^{1.6})) + ); + + + //(5 * Math.round(((10 + 2 * Math.pow(power, 1.5)))/5)); + if (KinkyDungeonStatsChoice.has("PriceGouging") && !sell) { + costt *= 5; + } + return costt; + } + let rarity = item.rarity || KDWeapon(item)?.rarity || KDConsumable(item)?.rarity || KDOutfit(item)?.rarity || 0; + if (rarity != undefined) { + let costMod = item.costMod || KDWeapon(item)?.costMod || KDConsumable(item)?.costMod || KDOutfit(item)?.costMod || 0; + if (KDWeapon(item)) costMod += 1; + + if (costMod) rarity += costMod; + if (KinkyDungeonConsumableVariants[item.name] || KinkyDungeonWeaponVariants[item.name]) { + let enchants: Record = {}; + for (let ev of KinkyDungeonConsumableVariants[item.name] ? KinkyDungeonConsumableVariants[item.name].events : KinkyDungeonWeaponVariants[item.name].events) { + if (ev.original && KDEventEnchantmentModular[ev.original]) enchants[ev.original] = KDEventEnchantmentModular[ev.original].types[KDModifierEnum[item.type || 'restraint']].level; + } + let sum = 0; + for (let amt of Object.values(enchants)) { + sum += amt; + } + rarity += 0.1*sum; + } + + + let costt = 5 * Math.round((1 + Math.min(KDGetEffLevel(),KinkyDungeonMaxLevel)/KDLevelsPerCheckpoint/2.5 * (noScale ? 0 : 1))*( + sell ? (40 * (-0.5*rarity-0.6+1.25**(2.38*rarity))) + : (50 * 1.25**(2.38*rarity)) + )/5); + if (costt > 100) costt = 10 * Math.round(costt / 10); + if (KinkyDungeonStatsChoice.has("PriceGouging") && !sell) { + costt *= 5; + } + return costt; + } + let costs = 50; + if (KinkyDungeonStatsChoice.has("PriceGouging") && !sell) { + costs *= 5; + } + return costs; +} + +function KinkyDungeonShrineCost(type: string): number { + let mult = 1.0; + let growth = 1.0; + let noMult = false; + + if (type == "Commerce" && KinkyDungeonShopIndex < KDMapData.ShopItems.length) { + if (!KDMapData.ShopItems) KDMapData.ShopItems = []; + let item = KDMapData.ShopItems[KinkyDungeonShopIndex]; + return Math.round(KinkyDungeonItemCost(item)); + } else if (KinkyDungeonShrineTypeRemove.includes(type)) { + let rest = KinkyDungeonGetRestraintsWithShrine(type, undefined, undefined, undefined, + KinkyDungeonStatsChoice.get("ExclusionsApply"), true); + let maxPower = 1; + for (let r of rest) { + if (KDRestraint(r).power > maxPower) maxPower = KDRestraint(r).power; + } + mult = Math.sqrt(Math.max(1, Math.min(KDShrineRemoveCount, rest.length))); + mult *= Math.pow(Math.max(1, maxPower), 0.75); + noMult = true; + } else if (type == "Will") { + let value = 0; + value += 120 * (1 - KinkyDungeonStatWill/KinkyDungeonStatWillMax); + value += 70 * (1 - KinkyDungeonStatMana/KinkyDungeonStatManaMax); + return Math.round(Math.round(value/10)*10 * (1 + 0.01 * KinkyDungeonDifficulty)); + } + if (KinkyDungeonShrineBaseCostGrowth[type]) growth = KinkyDungeonShrineBaseCostGrowth[type]; + if (KinkyDungeonShrineCosts[type] > 0 && !noMult) mult = Math.pow(growth, KinkyDungeonShrineCosts[type]); + + if (type == "Conjure" || type == "Illusion" || type == "Elements") + return Math.round(150 * (1 + 0.01 * KinkyDungeonDifficulty)); + + return Math.round(Math.round(KinkyDungeonShrineBaseCosts[type] * mult/10)*10 * (1 + 0.01 * KinkyDungeonDifficulty)); +} + +function KDAddBasic(item: item | shopItem) { + if (item.name == "RedKey") { + KDAddConsumable("RedKey", 1); + } else if (item.name == "BlueKey") { + KDAddConsumable("BlueKey", 1); + } else if (item.name == "Lockpick") { + KDAddConsumable("Pick", 1); + } else if (item.name == "2Lockpick") { + KDAddConsumable("Pick", 2); + } else if (item.name == "4Lockpick") { + KDAddConsumable("Pick", 4); + } else if (item.name == "MaidUniform") { + KinkyDungeonInventoryAddOutfit("Maid"); + } if (KinkyDungneonBasic[item.name]?.outfit) { + KinkyDungeonInventoryAddOutfit(KinkyDungneonBasic[item.name].outfit); + } else if (KinkyDungneonBasic[item.name]?.consumable) { + KinkyDungeonChangeConsumable(KinkyDungeonConsumables[KinkyDungneonBasic[item.name].consumable], KinkyDungneonBasic[item.name].quantity || item.quantity); + } +} + +function KinkyDungeonPayShrine(type: string, mult: number = 1) { + let cost = KinkyDungeonShrineCost(type); + KinkyDungeonGold -= cost * mult; + let ShrineMsg = ""; + let rep = 0; + + // TODO shrine effects + if (KinkyDungeonShrineTypeRemove.includes(type)) { + rep = Math.min(2, KinkyDungeonRemoveRestraintsWithShrine(type, KDShrineRemoveCount, true, undefined, undefined, undefined, undefined, + KinkyDungeonStatsChoice.get("ExclusionsApply")) * 0.5); + KinkyDungeonChangeRep("Ghost", -rep); + + ShrineMsg = TextGet("KinkyDungeonPayShrineRemoveRestraints"); + KDSendStatus('goddess', type, 'shrineRemove'); + } else if (type == "Elements" || type == "Illusion" || type == "Conjure") { + ShrineMsg = TextGet("KinkyDungeonPayShrineBuff" + type).replace("SCHOOL", TextGet("KinkyDungeonSpellsSchool" + type)); + if (type == "Elements") { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "ShrineElements", type: "event", maxCount: 10, tags: ["offense", "shrineElements"], aura: "#f1641f", power: 1.5, duration: 9999, infinite: true, events: [ + {trigger: "afterDamageEnemy", type: "ShrineElements", spell: "ArcaneStrike"}, + ]}); + } else if (type == "Conjure") { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "ShrineConjure", type: "bondageImmune", maxCount: 3, tags: ["defense", "shrineConjure", "bondageResist"], aura: "#4572e3", power: 1.5, duration: 9999, infinite: true, events: [ + //{trigger: "beforeAttack", type: "CounterattackSpell", spell: "ArcaneStrike", requiredTag: "shrineConjure", prereq: "hit-hostile"}, + ]}); + //KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "ShrineConjure2", type: "SpellResist", maxCount: 10, tags: ["defense", "shrineConjure", "bondageResist"], power: 5, duration: 9999}); + //KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "ShrineConjure3", type: "Armor", maxCount: 10, tags: ["defense", "shrineConjure", "bondageResist"], power: 5, duration: 9999}); + } else if (type == "Illusion") { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "ShrineIllusion", type: "event", maxCount: 10, tags: ["defense", "shrineIllusion"], aura: "#9052bc", power: 1.5, duration: 9999, infinite: true, events: [ + {trigger: "playerAttack", type: "ShadowStep", time: 6, requiredTag: "shrineIllusion"}, + ]}); + } + KDSendStatus('goddess', type, 'shrineDonate'); + rep = 2; + } else if (type == "Will") { + rep = Math.min(2, Math.ceil(5 - KinkyDungeonStatMana * 1.5 / KinkyDungeonStatManaMax - KinkyDungeonStatWill * 3.5 / KinkyDungeonStatWillMax)); + KDChangeMana("Will", "goddess", "interact", KinkyDungeonStatManaMax, false, 0, false, true); + KDChangeWill("Will", "goddess", "interact", KDWillShrineWill * KinkyDungeonStatWillMax); + KinkyDungeonNextDataSendStatsTime = 0; + + ShrineMsg = TextGet("KinkyDungeonPayShrineHeal"); + KDSendStatus('goddess', type, 'shrineHeal'); + } else if (type == "Commerce") { + let item = KDMapData.ShopItems[KinkyDungeonShopIndex]; + if (item) { + if (item.shoptype == Consumable) + KinkyDungeonChangeConsumable(KinkyDungeonConsumables[item.name], 1); + else if (item.shoptype == Weapon) + KinkyDungeonInventoryAddWeapon(item.name); + else if (item.shoptype == LooseRestraint) { + let restraint = KDRestraint(item); + if (!KinkyDungeonInventoryGetLoose(item.name)) { + KinkyDungeonInventoryAdd({name: item.name, type: LooseRestraint, events:restraint.events, quantity: 1, id: KinkyDungeonGetItemID()}); + } else { + if (!KinkyDungeonInventoryGetLoose(item.name).quantity) KinkyDungeonInventoryGetLoose(item.name).quantity = 0; + KinkyDungeonInventoryGetLoose(item.name).quantity += 1; + } + //KinkyDungeonInventoryAdd({name: item.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:restraint.events}); + } + else if (item.shoptype == "basic") { + KDAddBasic(item); + } + ShrineMsg = TextGet("KinkyDungeonPayShrineCommerce").replace("ItemBought", KDGetItemNameString(item.name)); + KDMapData.ShopItems.splice(KinkyDungeonShopIndex, 1); + if (KinkyDungeonShopIndex > 0) KinkyDungeonShopIndex -= 1; + + KDGameData.ShopRewardProgram += cost*mult; + let point = KinkyDungeonGetNearbyPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, + true, undefined, undefined, + true, (x, y) => { + return KinkyDungeonMapGet(x, y) == '0' && !KinkyDungeonTilesGet(x + ',' + y)?.Type; + }); + if (!KDGameData.ShopRewardProgramThreshold) KDGameData.ShopRewardProgramThreshold = KDRewardProgramBase; + if (!KDGameData.ShopRewardProgram) KDGameData.ShopRewardProgram = 0; + if (point && "02".includes(KinkyDungeonMapGet(point.x, point.y)) + && KDGameData.ShopRewardProgram > KDGameData.ShopRewardProgramThreshold) { + KDGameData.ShopRewardProgram = 0; + KDGameData.ShopRewardProgramThreshold += KDRewardProgramScaling; + KinkyDungeonMapSet(point.x, point.y, ';'); + KinkyDungeonTilesSet("" + (point.x) + "," + (point.y), {Portal: "CommercePortal", Light: 5, lightColor: 0xffff88}); + } + + rep = item.rarity + 1; + KDSendStatus('goddess', type, 'shrineBuy'); + } + } + + if (ShrineMsg) KinkyDungeonSendActionMessage(10, ShrineMsg, "lightblue", 1); + + if (KinkyDungeonShrineCosts[type] > 0) KinkyDungeonShrineCosts[type] = KinkyDungeonShrineCosts[type] + 1; + else KinkyDungeonShrineCosts[type] = 1; + + if (rep != 0) { + KinkyDungeonChangeRep(type, rep); + } +} + +function KinkyDungeonHandleShrine() { + let cost = 0; + let type = KinkyDungeonTargetTile.Name; + + if (KinkyDungeonShrineAvailable(type)) cost = KinkyDungeonShrineCost(type); + + if (type == "Commerce") { + if (cost > 0) { + //if (MouseIn(KDModalArea_x + 410, KDModalArea_y + 25, 112-15, 60) && cost <= KinkyDungeonGold) { + //return true; + //} + //else if (MouseIn(KDModalArea_x + 613, KDModalArea_y + 25, 112, 60)) { + //KinkyDungeonShopIndex = (KinkyDungeonShopIndex + 1) % KDMapData.ShopItems.length; + // + + //return true; + //} + + } + } + return KDMouseInModalArea(); +} + +function KinkyDungeonDrawShrine() { + let cost = 0; + let type = KinkyDungeonTargetTile.Name; + KDModalArea = true; + let discount = 1; + if (KinkyDungeonTargetTile.mult != undefined) discount = KinkyDungeonTargetTile.mult; + + if (KinkyDungeonShrineAvailable(type)) cost = KinkyDungeonShrineCost(type); + + if (type == "Commerce") { + if (cost == 0) { + DrawTextKD(TextGet("KinkyDungeonLockedShrine"), KDModalArea_x, KDModalArea_y, "#ffffff", KDTextGray2); + } else { + let shopHeight = Math.max(8, KDMapData.ShopItems.length) * 50; + + let YY = 700; + KDModalArea_y = YY - shopHeight + 80; + KDModalArea_height = shopHeight + 100; + KDModalArea_width = 900; + + FillRectKD(kdcanvas, kdpixisprites, "shopbg", { + Left: KDModalArea_x - 25, + Top: KDModalArea_y,// + 80 - shopHeight, + Width: KDModalArea_width + 25, + Height: shopHeight + 20, + Color: KDButtonColor, + LineWidth: 1, + zIndex: 60, + alpha: 0.8, + }); + DrawRectKD(kdcanvas, kdpixisprites, "shopbg2", { + Left: KDModalArea_x - 25, + Top: KDModalArea_y,// + 80 - shopHeight, + Width: KDModalArea_width + 25, + Height: shopHeight + 20, + Color: KDBorderColor, + LineWidth: 1, + zIndex: 60.1, + alpha: 1.0, + }); + // Wrap around shop index to prevent errors + if (KinkyDungeonShopIndex > KDMapData.ShopItems.length) { + KinkyDungeonShopIndex = 0; + } else if (KDMapData.ShopItems.length > 0 && KDMapData.ShopItems[KinkyDungeonShopIndex]) { + // Draw the item and cost + } + + DrawButtonKDEx("shrinebuy", (_bdata) => { + KDSendInput("shrineBuy", {type: type, shopIndex: KinkyDungeonShopIndex}); + return true; + }, cost <= KinkyDungeonGold, KDModalArea_x + 550, YY + 25, 200, 60, TextGet("KinkyDungeonCommercePurchase").replace("ItemCost", "" + cost*discount), (cost*discount <= KinkyDungeonGold) ? "#ffffff" : "#ff5277", "", ""); + + if (KDShopBuyConfirm) { + DrawTextFitKD(TextGet("KDShopConfirm"), + KDModalArea_x + 650, YY + 25 - 25, 250, "#88ff88", undefined, 20,); + } + // Draw the list of shop items + let ii = 0; + for (let l of KDMapData.ShopItems) { + if (KDMapData.ShopItems[ii]) { + let index = ii; + let itemsmall = KDGetItemPreview({name: KDMapData.ShopItems[ii].name, type: KDMapData.ShopItems[ii].shoptype}); + if (itemsmall?.preview) + KDDraw(kdcanvas, kdpixisprites, "preview" + ii, + itemsmall.preview, KDModalArea_x - 25, YY + 40 - ii * 50 - 3, 50, 50, undefined, + { + zIndex: 69, + }); + DrawButtonKDEx("l.name" + ii, (_bdata) => { + KinkyDungeonShopIndex = index; + return true; + }, true, + KDModalArea_x - 20, YY + 40 - ii * 50, 400 + 20 + 20, 45, "", "#444444", "", undefined, false, true, "#000000", undefined, undefined, { + alpha: 0.4, + zIndex: 65, + } + ); + } + //175/2 + DrawTextFitKD(TextGet("KinkyDungeonInventoryItem" + l.name), KDModalArea_x + 25, YY + 65 - ii * 50, 200, KinkyDungeonShopIndex == ii ? "white" : KDTextGray3, KDTextGray2, 20, "left", 70); + DrawTextFitKD(TextGet("KinkyDungeonCommerceCost").replace("ItemCost", "" + KinkyDungeonItemCost(l)), KDModalArea_x + 300 + 50, YY + 58 - ii * 50, 130, KDMapData.ShopItems[KinkyDungeonShopIndex].name == l.name ? "#ffffff" : KDTextGray3, KDTextGray2, 20, undefined, 70); + DrawTextFitKD(TextGet("KinkyDungeonCommerceOwned").replace("AMNT", "" + ( + KinkyDungeonInventoryGetSafe(l.countItem || l.consumable || l.name) ? (KinkyDungeonInventoryGetSafe(l.consumable || l.name).quantity || 1) + (KinkyDungeonInventoryGetWorn(l.name) ? 1 : 0) : 0 + )), KDModalArea_x + 300 + 50, YY + 76 - ii * 50, 130, KDMapData.ShopItems[KinkyDungeonShopIndex].name == l.name ? "#ffffff" : KDTextGray3, KDTextGray2, 14, undefined, 70); + ii++; + } + let item = KDGetItemPreview({name: KDMapData.ShopItems[KinkyDungeonShopIndex].name, type: KDMapData.ShopItems[KinkyDungeonShopIndex].shoptype}); + if (item?.preview) + KDDraw(kdcanvas, kdpixisprites, "preview", + item.preview, KDModalArea_x+650 - 50, YY + 80 - shopHeight, 100, 100, undefined, + { + zIndex: 129, + }); + + let data = { + extraLines: [], + extraLineColor: [], + extraLineColorBG: [], + extraLinesPre: [], + extraLineColorPre: [], + extraLineColorBGPre: [], + SelectedItem: item?.item, + item: item?.item, + }; + KinkyDungeonSendEvent("inventoryTooltip", data); + let mult = KDGetFontMult(); + let textSplit = KinkyDungeonWordWrap(TextGet("KinkyDungeonInventoryItem" + KDMapData.ShopItems[KinkyDungeonShopIndex].name + "Desc"), + 15*mult, 40*mult).split('\n'); + let textSplit2 = KinkyDungeonWordWrap(TextGet("KinkyDungeonInventoryItem" + KDMapData.ShopItems[KinkyDungeonShopIndex].name + "Desc2"), + 15*mult, 40*mult).split('\n'); + let i = 0; + let descSpacing = 24; + const encoder = new TextEncoder(); + for (let N = 0; N < textSplit.length; N++) { + DrawTextFitKD(textSplit[N], + KDModalArea_x+650, YY + 200 - shopHeight + i * descSpacing, 380 * (encoder.encode(textSplit[N]).length / 40), "#ffffff", undefined, 20, undefined, 70); + i++; + } + i += 1; + for (let N = 0; N < data.extraLinesPre.length; N++) { + DrawTextFitKD(data.extraLinesPre[N], + KDModalArea_x+650, YY + 200 - shopHeight + i * descSpacing, 380 * (encoder.encode(data.extraLinesPre[N]).length / 40), data.extraLineColorPre[N], data.extraLineColorBGPre[N], 20, undefined, 70); + i++; + } + for (let N = 0; N < textSplit2.length; N++) { + DrawTextFitKD(textSplit2[N], + KDModalArea_x+650, YY + 200 - shopHeight + i * descSpacing, 380 * (encoder.encode(textSplit2[N]).length / 40), "#ffffff", undefined, 20, undefined, 70); + i++; + } + for (let N = 0; N < data.extraLines.length; N++) { + DrawTextFitKD(data.extraLines[N], + KDModalArea_x+650, YY + 200 - shopHeight + i * descSpacing, 380 * (encoder.encode(data.extraLines[N]).length / 40), data.extraLineColor[N], data.extraLineColorBG[N], 20, undefined, 70); + i++; + } + // Next button + //DrawButtonVis(KDModalArea_x + 613, KDModalArea_y + 25, 112, 60, TextGet("KinkyDungeonCommerceNext"), "White", "", ""); + + } + } else { + let YY = 700; + + let II = 0; + let shrineActionSpacing = 80; + if (DrawButtonKDEx("shrineUse", (_bdata) => { + KDSendInput("shrineUse", {type: type, cost: cost*discount, targetTile: KinkyDungeonTargetTileLocation}); + KinkyDungeonTargetTileLocation = ""; + KinkyDungeonTargetTile = null; + KDModalArea = false; + return true; + }, cost > 0, KDModalArea_x, YY + 25 - II*shrineActionSpacing, 325, 60, + TextGet(cost > 0 ? "KinkyDungeonPayShrine" : "KinkyDungeonPayShrineCant").replace("XXX", "" + cost*discount), cost > 0 ? "#ffffff" : KDTextGray2, "", "", + false, false, KDTextGray2)) + DrawTextFitKD(TextGet("KDShrineActionDescOffer"), + KDModalArea_x+400, YY + 55 - II*shrineActionSpacing, 600, "#ffffff", KDTextGray0, 20, "left", 70); + II++; + let tiles = KinkyDungeonRescueTiles(); + let rescueAvailable = tiles.length > 0; + if (DrawButtonKDEx("shrinePray", (_bdata) => { + if (rescueAvailable) { + KDSendInput("shrinePray", {type: type, cost: cost, targetTile: KinkyDungeonTargetTileLocation}); + KinkyDungeonTargetTileLocation = ""; + KinkyDungeonTargetTile = null; + KDModalArea = false; + } + return true; + }, !KinkyDungeonTargetTile.Rescue, KDModalArea_x, YY + 25 - II*shrineActionSpacing, 325, 60, + TextGet("KDShrineActionPray"), KinkyDungeonTargetTile?.Rescue ? KDTextGray2 : "#ffffff", "", "", + false, false, rescueAvailable ? KDTextGray2 : "#ff5277")) + DrawTextFitKD(TextGet(KinkyDungeonTargetTile?.Rescue ? "KDShrineActionDescPrayFail" : "KDShrineActionDescPray"), + KDModalArea_x+400, YY + 55 - II*shrineActionSpacing, 600, "#ffffff", KDTextGray0, 20, "left", 70); + II++; + + if (DrawButtonKDEx("drinkShrine", (_bdata) => { + KDSendInput("shrineDrink", {type: type, targetTile: KinkyDungeonTargetTileLocation}); + return true; + }, true,KDModalArea_x, YY + 25 - II*shrineActionSpacing, 325, 60, + TextGet("KinkyDungeonDrinkShrine"), (KDCanDrinkShrine(false)) ? "#AAFFFF" : KDTextGray2, "", "", + false, false, KDTextGray2)) + DrawTextFitKD(TextGet("KDShrineActionDescDrink"), + KDModalArea_x+400, YY + 55 - II*shrineActionSpacing, 600, "#ffffff", KDTextGray0, 20, "left", 70); + + II++; + if (DrawButtonKDEx("bottleShrine", (_bdata) => { + KDSendInput("shrineBottle", {type: type, targetTile: KinkyDungeonTargetTileLocation}); + return true; + }, true, KDModalArea_x, YY + 25 - II*shrineActionSpacing, 325, 60, + TextGet("KinkyDungeonBottleShrine"), (KDCanDrinkShrine(true)) ? "#AAFFFF" : KDTextGray2, "", "", + false, false, KDTextGray2)) + DrawTextFitKD(TextGet("KDShrineActionDescBottle"), + KDModalArea_x+400, YY + 55 - II*shrineActionSpacing, 600, "#ffffff", KDTextGray0, 20, "left", 70); + + II++; + + if (KDGameData.Champion == type) { + if (DrawButtonKDEx("shrineDevote", (_bdata) => { + KDSendInput("shrineDevote", {type: "", cost: cost, targetTile: KinkyDungeonTargetTileLocation}); + KinkyDungeonTargetTileLocation = ""; + KinkyDungeonTargetTile = null; + KDModalArea = false; + return true; + }, !KinkyDungeonTargetTile.Rescue, KDModalArea_x, YY + 25 - II*shrineActionSpacing, 325, 60, + TextGet("KDShrineActionChampionRemove"), KinkyDungeonTargetTile?.Rescue ? KDTextGray2 : "#ffffff", "", "", + false, false, KDTextGray2)) + DrawTextFitKD(TextGet(KDGameData.Champion != type ? "KDShrineActionDescChampionRemoveFail" : "KDShrineActionDescChampionRemove"), + KDModalArea_x+400, YY + 55 - II*shrineActionSpacing, 600, "#ffffff", KDTextGray0, 20, "left", 70); + } else { + if (DrawButtonKDEx("shrineDevote", (_bdata) => { + KDSendInput("shrineDevote", {type: type, cost: cost, targetTile: KinkyDungeonTargetTileLocation}); + KinkyDungeonTargetTileLocation = ""; + KinkyDungeonTargetTile = null; + KDModalArea = false; + return true; + }, !KinkyDungeonTargetTile.Rescue, KDModalArea_x, YY + 25 - II*shrineActionSpacing, 325, 60, + TextGet("KDShrineActionChampion"), KinkyDungeonTargetTile?.Rescue ? KDTextGray2 : "#ffffff", "", "", + false, false, KDTextGray2)) + DrawTextFitKD(TextGet(KDGameData.Champion == type ? "KDShrineActionDescChampionFail" : "KDShrineActionDescChampion"), + KDModalArea_x+400, YY + 55 - II*shrineActionSpacing, 600, "#ffffff", KDTextGray0, 20, "left", 70); + } + II++; + + if (KinkyDungeonTargetTile?.Quest) { + if (DrawButtonKDEx("shrineQuest", (_bdata) => { + KDSendInput("shrineQuest", {type: type, cost: cost, targetTile: KinkyDungeonTargetTileLocation}); + KinkyDungeonTargetTileLocation = ""; + KinkyDungeonTargetTile = null; + KDModalArea = false; + return true; + }, true, KDModalArea_x, YY + 25 - II*shrineActionSpacing, 325, 60, + TextGet("KDShrineActionQuestAccept"), "#ffffff", "", "", + false, false, KDTextGray2)) + DrawTextFitKD(TextGet("KDShrineActionDescQuestAccept"), + KDModalArea_x+400, YY + 55 - II*shrineActionSpacing, 600, "#ffffff", KDTextGray0, 20, "left", 70); + II++; + DrawTextFitKD(TextGet("KDShrineActionQuest"), + KDModalArea_x+450, YY - II*shrineActionSpacing, 600, "#ffffff", KDTextGray0, 24, "center", 70); + DrawTextFitKD(TextGet("KDQuest_" + KinkyDungeonTargetTile.Quest), + KDModalArea_x+450, YY + 50 - II*shrineActionSpacing, 600, "#cc2f7b", KDTextGray0, 32, "center", 70); + + II++; + } + + + let shrineHeight = II*shrineActionSpacing + 40 + (KinkyDungeonTargetTile?.Quest ? 20 : 0); + + KDModalArea_y = YY - shrineHeight + 115; + KDModalArea_width = 1000; + KDModalArea_height = shrineHeight; + + FillRectKD(kdcanvas, kdpixisprites, "shrinebg", { + Left: KDModalArea_x - 25, + Top: KDModalArea_y,// + 110 - shrineHeight, + Width: KDModalArea_width + 25, + Height: shrineHeight, + Color: KDButtonColor, + LineWidth: 1, + zIndex: 60, + alpha: 0.8, + }); + DrawRectKD(kdcanvas, kdpixisprites, "shrinebg2", { + Left: KDModalArea_x - 25, + Top: KDModalArea_y,// + 110 - shrineHeight, + Width: KDModalArea_width + 25, + Height: shrineHeight, + Color: KDBorderColor, + LineWidth: 1, + zIndex: 60.1, + alpha: 1.0, + }); + } +} + +let KDGoddessRevengeMobTypes: Record = { + Rope: {require: undefined, requireSingle: ["ropeTrap", "rope"], filter: ["human", "immobile"]}, + Latex: {require: undefined, requireSingle: ["slime", "latexTrap", "latex"], filter: ["human", "immobile"]}, + Metal: {require: undefined, requireSingle: ["metalTrap", "metal"], filter: ["human", "immobile"]}, + Leather: {require: undefined, requireSingle: ["leatherTrap", "leather"], filter: ["human", "immobile"]}, + Elements: {require: ["elemental"], requireSingle: ["fire", "water", "earth", "air"], filter: ["human", "immobile"]}, + Will: {requireSingle: ["nature", "beast"], require: undefined, filter: ["human", "immobile"]}, + Conjure: {require: [], requireSingle: ["book", "ribbon", "familiar"], filter: ["human", "immobile"]}, + Illusion: {require: undefined, requireSingle: ["illusionTrap"], filter: ["immobile"]}, +}; + +/** + * @param x + * @param y + * @param Goddess + * @param [mult] + * @param [LevelBoost] + */ +function KDSummonRevengeMobs(_x: number, _y: number, Goddess: string, mult: number = 1.0, LevelBoost: number = 2): number { + let spawned = 0; + let maxspawn = 2 + Math.round(Math.min(3 + KDRandom() * 2, KinkyDungeonDifficulty/10) + Math.min(3 + KDRandom() * 2, 1*MiniGameKinkyDungeonLevel/KDLevelsPerCheckpoint)); + if (mult) maxspawn *= mult; + + let types = KDGoddessRevengeMobTypes[Goddess]; + + let requireTags = types ? types.require : undefined; + let requireSingleTag = types ? types.requireSingle : undefined; + let filter = types ? types.filter : undefined; + + let tags = ["revenge"]; + KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); + + for (let i = 0; i < 30 + maxspawn; i++) { + if (spawned < maxspawn) { + let Enemy = KinkyDungeonGetEnemy( + tags, MiniGameKinkyDungeonLevel + LevelBoost, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + '0', requireTags, undefined, undefined, filter, requireSingleTag); + if (Enemy) { + let pass = KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, Enemy.name, 1, 10, false, undefined, i < 24, false, "Ambush", true, 1.5, true, undefined, true, true); + + if (pass.length > 0) { + pass[0].teleporting = 5; + pass[0].teleportingmax = 5; + if (Enemy.tags.minor) spawned += 0.4; + else spawned += 1; + } + } + } + } + return spawned; +} + +/** + * @param Bottle - Is this bottling or drinking? + */ +function KDCanDrinkShrine(Bottle: boolean): boolean { + if (Bottle && KinkyDungeonIsHandsBound(true, true, 0.9)) return false; + return !KinkyDungeonTargetTile.drunk && (Bottle || KinkyDungeonStatMana < KinkyDungeonStatManaMax || KinkyDungeonStatManaPool < KinkyDungeonStatManaPoolMax || KinkyDungeonPlayerTags.get("slime")); +} + +function KinkyDungeonGetSetPieces(Dict: any) { + let ret = []; + for (let sh of Dict) { + if (sh.Type) { + ret.push(sh.Type); + } + } + return ret; +} + +function KinkyDungeonGetMapShrines(Dict: any) { + let ret = []; + for (let sh of Dict) { + if (sh.Type) { + ret.push(sh.Type); + } + } + return ret; +} + +function KinkyDungeonTakeOrb(Amount: number, X: number, Y: number) { + KinkyDungeonSetFlag("NoDialogue", 3); + KinkyDungeonDrawState = "Orb"; + KinkyDungeonOrbAmount = Amount; + KDOrbX = X; + KDOrbY = Y; +} +function KinkyDungeonDrawOrb() { + let tile = KinkyDungeonTilesGet(KDOrbX + "," + KDOrbY); + let spell = tile?.Spell ? KinkyDungeonFindSpell(tile.Spell) : null; + DrawTextKD(TextGet("KinkyDungeonOrbIntro" + (KinkyDungeonStatsChoice.get("randomMode") ? ( + (!spell || KDHasSpell(spell.name)) ? "KinkyRandom" : "Kinky") : "")) + .replace("SHCL", TextGet("KinkyDungeonSpellsSchool" + spell?.school)) + .replace("SPLNME", TextGet("KinkyDungeonSpell" + spell?.name)) + , 1250, 150, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonOrbIntro2"), 1250, 200, "#ffffff", KDTextGray2); + let i = 0; + let maxY = 560; + let XX = 500; + let spacing = 60; + let yPad = 150; + for (let shrine in KinkyDungeonShrineBaseCosts) { + let value = KinkyDungeonGoddessRep[shrine]; + + if (value != undefined) { + if (spacing * i > maxY) { + if (XX == 0) i = 0; + XX = 600; + } + let color = "#e7cf1a"; + if (value < -10) { + if (value < -30) color = "#ff5277"; + else color = "#ff8933"; + } else if (value > 10) { + if (value > 30) color = "#4fd658"; + else color = "#9bd45d"; + } + DrawButtonKDEx("orbspell" + shrine, (_b) => { + KDSendInput("orb", {shrine: shrine, Amount: 1, Rep: 1 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "DivinePrivilege")), x: KDOrbX, y: KDOrbY}); + KinkyDungeonDrawState = "Game"; + return true; + }, true, canvasOffsetX_ui + XX - 100, yPad + canvasOffsetY_ui + spacing * i - 27, 250, 55, TextGet("KinkyDungeonShrine" + shrine), "white"); + DrawProgressBar(canvasOffsetX_ui + 275 + XX, yPad + canvasOffsetY_ui + spacing * i - spacing/4, 200, spacing/2, 50 + value, color, KDTextGray2); + if (KinkyDungeonShrineBaseCosts[shrine]) + KDDrawRestraintBonus(shrine, canvasOffsetX_ui + 275 + XX - 70, yPad + canvasOffsetY_ui + spacing * i, undefined, 24); + + i++; + } + + } + + DrawButtonKDEx("orbspellrandom", (_b) => { + let shrine = Object.keys(KinkyDungeonShrineBaseCosts)[Math.floor(KDRandom() * Object.keys(KinkyDungeonShrineBaseCosts).length)]; + KDSendInput("orb", {shrine: shrine, Amount: 1, Rep: 0.9 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "DivinePrivilege")), x: KDOrbX, y: KDOrbY}); + KinkyDungeonDrawState = "Game"; + return true; + }, true, canvasOffsetX_ui + XX - 100, yPad + canvasOffsetY_ui + spacing * i - 27, 250, 55, TextGet("KinkyDungeonSurpriseMe"), "white"); + i += 2; + DrawButtonKDEx("cancelorb", (_bdata) => { + KinkyDungeonDrawState = "Game"; + return true; + }, true, canvasOffsetX_ui + 525, yPad + canvasOffsetY_ui + spacing * i, 425, 55, TextGet("KinkyDungeonCancel"), "white"); + +} + +let KDOrbX = 0; +let KDOrbY = 0; + +function KinkyDungeonHandleOrb() { + + return true; +} + +let KDPerkConfirm = false; +let KDPerkOrbPerks = []; +let KDPerkOrbBondage = []; +let KDPerkOrbMethod = "Default"; +function KinkyDungeonTakePerk(Amount: number, X: number, Y: number) { + KinkyDungeonSetFlag("NoDialogue", 3); + + KDPerkOrbPerks = KinkyDungeonTilesGet(X + "," + Y).Perks; + KDPerkOrbBondage = KinkyDungeonTilesGet(X + "," + Y).Bondage; + KDPerkOrbMethod = KinkyDungeonTilesGet(X + "," + Y).Method; + KinkyDungeonDrawState = "PerkOrb"; + KinkyDungeonOrbAmount = Amount; + KDOrbX = X; + KDOrbY = Y; +} +function KinkyDungeonDrawPerkOrb() { + let bwidth = 350; + let bheight = 64; + let Twidth = 1250; + + if (!StandalonePatched) + MainCanvas.textAlign = "center"; + DrawTextKD(TextGet("KinkyDungeonPerkIntro"), 1250, 50, "#ffffff", KDTextGray2); + DrawTextKD(TextGet("KinkyDungeonPerkIntro2"), 1250, 100, "#ffffff", KDTextGray2); + + let count = 0; + let pspacing = 120; + for (let p of KDPerkOrbPerks) { + DrawTextFitKD(TextGet("KinkyDungeonStat" + KinkyDungeonStatsPresets[p].id), 1250, 200 + count * pspacing, Twidth, "#ffffff", KDTextGray2, 30); + DrawTextFitKD(TextGet("KinkyDungeonStatDesc" + KinkyDungeonStatsPresets[p].id), 1250, 235 + count * pspacing, Twidth, "#ffffff", KDTextGray2, 22); + FillRectKD(kdcanvas, kdpixisprites, "bg_" + KinkyDungeonStatsPresets[p].id, { + Left: 1250-Twidth/2 - 10, + Top: 200 + count * pspacing - 30, + Width: Twidth + 20, + Height: 70 + 20, + Color: KinkyDungeonStatsPresets[p].cost < 0 ? KDTextRed1 : KDTextGray0, + LineWidth: 1, + zIndex: 60, + alpha: 0.7, + }); + count += 1; + } + if (KDPerkOrbBondage?.length > 0 && !KinkyDungeonStatsChoice.get("hideperkbondage")) { + let str = ""; + for (let b of KDPerkOrbBondage) { + if (str) str = str + ', '; + str = str + TextGet("Restraint" + b); + } + if (KinkyDungeonStatsChoice.get("partialhideperkbondage")) { + DrawTextFitKD(TextGet("KDBondageOptionPerkHidden"), 1250, 210 + count * pspacing, Twidth, "#ffffff", KDTextGray2, 30); + } else { + DrawTextFitKD(TextGet("KDBondageOptionPerk"), 1250, 200 + count * pspacing, Twidth, "#ffffff", KDTextGray2, 24); + DrawTextFitKD(str, 1250, 235 + count * pspacing, Twidth, "#ffffff", KDTextGray2, 22); + } + + FillRectKD(kdcanvas, kdpixisprites, "bg_bndg", { + Left: 1250-Twidth/2 - 10, + Top: 200 + count * pspacing - 30, + Width: Twidth + 20, + Height: 70 + 20, + Color: KDTextRed1, + LineWidth: 1, + zIndex: 60, + alpha: 0.7, + }); + count += 1; + } + + if (KinkyDungeonStatsChoice.get("escapeselect")) { + DrawTextFitKD(TextGet("KDEscapeMethod_" + KDPerkOrbMethod), 1250, 200 + count * pspacing, Twidth, "#ffffff", KDTextGray2, 30); + DrawTextFitKD(TextGet("KDEscapeMethodDesc_" + KDPerkOrbMethod), 1250, 235 + count * pspacing, Twidth, "#ffffff", KDTextGray2, 22); + + FillRectKD(kdcanvas, kdpixisprites, "bg_method", { + Left: 1250-Twidth/2 - 10, + Top: 200 + count * pspacing - 30, + Width: Twidth + 20, + Height: 70 + 20, + Color: KDTextGreen1, + LineWidth: 1, + zIndex: 60, + alpha: 0.7, + }); + count += 1; + } + + + if (KDPerkConfirm) { + DrawTextFitKD(TextGet("KinkyDungeonPerkConfirm"), 1250, 800, 1300, "#ffffff", KDTextGray2, 30); + } + + DrawButtonKDEx("reject", (_bdata) => { + KinkyDungeonDrawState = "Game"; + return true; + }, true, 1250-1300, 850 + 120 - 1000, 2600, 2000, TextGet("KinkyDungeonPerkReject"), "#ffffff", undefined, undefined, undefined, true, undefined, undefined, undefined, + { + zIndex: 1, + alpha: 0, + }); + + DrawButtonKDEx("accept", (_bdata) => { + if (KDPerkConfirm) { + KDSendInput("perkorb", {shrine: "perk", perks: KDPerkOrbPerks, bondage: KDPerkOrbBondage, method: KDPerkOrbMethod, Amount: 1, x: KDOrbX, y: KDOrbY}); + KinkyDungeonDrawState = "Game"; + } + KDPerkConfirm = true; + return true; + }, true, 1250 - bwidth/2, 850, bwidth, bheight, TextGet("KinkyDungeonPerkAccept" + (KDPerkConfirm ? "Confirm" : "")), "#ffffff", + undefined, undefined, undefined, undefined, undefined, undefined, undefined, { + zIndex: 70, + }); + + +} + +function KDGetPosNegColor(value: number): string { + return (value ? (value > 0 ? KDGoodColor : KDCurseColor) : "#dddddd"); +} + +function KDGetGoddessBonus(shrine: string): number { + if (KinkyDungeonGoddessRep[shrine]) { + return KinkyDungeonGoddessRep[shrine] / 50 * (KinkyDungeonGoddessRep[shrine] > 0 ? KDMaxGoddessBonus : KDMinGoddessBonus); + } + return 0; +} + +function KDDrawRestraintBonus(shrine: string, x: number, y: number, width: number = 100, FontSize?: number, align?: string, zIndex?: number, alpha?: number, forceColor?: string) { + let bonus = KDGetGoddessBonus(shrine); + let color = forceColor ? forceColor : KDGetPosNegColor(bonus); + let str = (bonus >= 0 ? "+" : "") + Math.round(bonus * 100) + "%"; + DrawTextFitKD(str, x, y, width, color, "#000000", FontSize, align, zIndex, alpha); +} + +/** + * @param map + * @param tile + */ +function KDGetShrineQuest(map: KDMapDataType, tile: any): string { + if (!tile) return ""; + let eligibleQuests: Record = {}; + for (let q of Object.values(KDQuests)) { + if (q.tags?.includes(tile.Name) && !KDGameData.Quests?.includes(q.name) && !map.flags?.includes(q.name)) { + eligibleQuests[q.name] = q.weight(KDMapData.RoomType, KDMapData.MapMod, {}); + } + } + + let quest = KDGetByWeight(eligibleQuests); + return quest; +} + +/** + * @param map + * @param tile + */ +function KDSetShrineQuest(map: KDMapDataType, tile: any, quest: string) { + if (!tile) return; + tile.Quest = quest; + KDSetMapFlag(map, quest); +} diff --git a/Game/src/map/KinkyDungeonTiles.ts b/Game/src/map/KinkyDungeonTiles.ts new file mode 100644 index 000000000..6561ae50e --- /dev/null +++ b/Game/src/map/KinkyDungeonTiles.ts @@ -0,0 +1,1174 @@ +"use strict"; + + +let KDCancelEvents = { + JourneyChoice: (_x, _y, _tile, data) => { + if (data.force) return ""; + KinkyDungeonState = "JourneyMap"; + KDGameData.JourneyTarget = null; + KDGameData.UseJourneyTarget = true; + }, +}; +let KDCancelFilters = { + JourneyChoice: (_x, _y, _tile, data: any) => { + // This one is set by event + if (data.force) return ""; + if (!KDGameData.JourneyTarget && data.AdvanceAmount > 0) { + if (KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]?.Connections.length > 0) { + return "JourneyChoice"; + } + } + return ""; + }, + ProtectOldSaves: (_x, _y, _tile, data: any) => { + // This one is set by event + if (!KDMapData.RoomType && (KDMapData.mapX == undefined || !(KDGetWorldMapLocation(KDCoordToPoint(KDGetCurrentLocation()))?.jx !== undefined))) { + return "NoJourneyTarget"; + } + return ""; + }, +}; + +/** + * @param entity + */ +function KDWettable(entity: entity): boolean { + return entity.player || (!entity.Enemy.tags.acidimmune && !entity.Enemy.tags.acidresist && !entity.Enemy.tags.nowet); +} + +/** + * @param entity + */ +function KDConducting(entity: entity): boolean { + return entity.player || (!entity.Enemy.tags.electricimmune && !entity.Enemy.tags.electric && !entity.Enemy.tags.noconduct); +} + +function KinkyDungeonHandleTilesEnemy(enemy: entity, _delta: number): void { + let tile = KinkyDungeonMapGet(enemy.x, enemy.y); + if (tile == 'w') { + if (KDWettable(enemy) && !KDIsFlying(enemy)) { + if (!enemy.buffs) enemy.buffs = {}; + let b1 = Object.assign({}, KDDrenched); + b1.duration = 6; + let b2 = Object.assign({}, KDDrenched2); + b2.duration = 6; + let b3 = Object.assign({}, KDDrenched3); + b3.duration = 6; + + KinkyDungeonApplyBuffToEntity(enemy, b1); + KinkyDungeonApplyBuffToEntity(enemy, b2); + KinkyDungeonApplyBuffToEntity(enemy, b3); + KinkyDungeonApplyBuffToEntity(enemy, KDSlowedSlightly); + + + } + } +} + +/** + * Applies effects based on nearby tiles. Affects only the player + * @param delta + */ +function KDPeripheralTileEffects(_delta: number) { + let tileUp = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y - 1); + let tileL = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x - 1, KinkyDungeonPlayerEntity.y); + let tileR = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x + 1, KinkyDungeonPlayerEntity.y); + let tileD = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y + 1); + if (tileUp == ",") { + // Low hook + KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonHookLow"), "lightgreen", 1, true); + } else if (tileUp == "4" || tileL == '4' || tileR == '4' || tileD == '4') { + // Crack + KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonCrack"), "lightgreen", 1, true); + } +} + +/** + * Applies effects based on the tile you are standing on. Affects only the player + * @param delta + */ +function KinkyDungeonUpdateTileEffects(delta: number) { + let tile = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (KDTileUpdateFunctions[tile] && KDTileUpdateFunctions[tile](delta)) { + // Boop + } else { + KDPeripheralTileEffects(delta); + } + for (let X = 1; X < KDMapData.GridWidth-1; X++) { + for (let Y = 1; Y < KDMapData.GridHeight-1; Y++) { + let tt = KinkyDungeonMapGet(X, Y); + if (KDTileUpdateFunctionsLocal[tt]) KDTileUpdateFunctionsLocal[tt](delta, X, Y); + + } + } +} + + +let KinkyDungeonChestConfirm = false; + +function KinkyDungeonHandleMoveToTile(toTile: string): void { + if (toTile == 's' || toTile == 'H' || (toTile == 'S' && ( + MiniGameKinkyDungeonLevel > 0 + //|| (MiniGameKinkyDungeonLevel == 1 && KDGameData.RoomType) + //|| KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)?.AltStairAction + //|| KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)?.RoomType + ))) { // Go down the next stairs + if (KinkyDungeonConfirmStairs && KinkyDungeonLastAction == "Wait") { + KinkyDungeonConfirmStairs = false; + KinkyDungeonHandleStairs(toTile); + } else if (!(KDGameData.SleepTurns > 0)) { + if (KinkyDungeonLastAction == "Move" || KinkyDungeonLastAction == "Wait") + KinkyDungeonConfirmStairs = true; + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonConfirmStairs"), "white", 1, true); + } + } +} + +function KDCanEscape(method: string): boolean { + return KinkyDungeonEscapeTypes[method].check(); +} + +function KDGetEscapeMinimapText(method: string): string { + return KinkyDungeonEscapeTypes[method].minimaptext(); +} + +function KDGetEscapeDoorText(method: string): string { + return KinkyDungeonEscapeTypes[method].doortext(); +} + +function KDGetEscapeMethod(_level: number) { + let alt = KDGetAltType(MiniGameKinkyDungeonLevel); + if (alt?.escapeMethod) + return alt.escapeMethod; + if (alt?.nokeys) + return "None"; + let data = {altType: alt, escapeMethod: KDMapData.EscapeMethod}; + KinkyDungeonSendEvent("calcEscapeMethod", data); + + if (KinkyDungeonEscapeTypes[data.escapeMethod]) { + KDMapData.EscapeMethod = data.escapeMethod; + return data.escapeMethod; + } else return "None"; +} + +function KDGetRandomEscapeMethod(RoomType: string, MapMod: string, Level: number, Faction: string) { + let choices: Record = {}; + for (let method of Object.keys(KinkyDungeonEscapeTypes)) { + let weight = KinkyDungeonEscapeTypes[method].filterRandom ? + KinkyDungeonEscapeTypes[method].filterRandom(RoomType, MapMod, Level, Faction) + : 1; + if (KinkyDungeonEscapeTypes[method].selectValid + && (weight >= 1 || KDRandom() < weight) + ) { + choices[method] = weight; + } + } + return KDGetByWeight(choices); +} + +/** + * Creates combined record of tags + * @param x + * @param y + */ +function KDEffectTileTags(x: number, y: number, mapData?: KDMapDataType): Record { + let ret: Record = {}; + let tiles = KDGetEffectTiles(x, y, mapData); + if (tiles) { + for (let t of Object.values(tiles)) { + if (t.tags) { + for (let tag of t.tags) { + ret[tag] = true; + } + } + } + } + + return ret; +} + + + +function KinkyDungeonHandleStairs(toTile: string, suppressCheckPoint?: boolean) { + if (KinkyDungeonFlags.get("stairslocked")) { + KinkyDungeonSendActionMessage(10, TextGet("KDStairsLocked").replace("NMB", "" + KinkyDungeonFlags.get("stairslocked")), "#ffffff", 1); + } else + + if ((toTile == 's' || (toTile == 'S' && KDGetAltType(MiniGameKinkyDungeonLevel)?.noLeave)) && !KDCanEscape(KDGetEscapeMethod(MiniGameKinkyDungeonLevel))) { + KinkyDungeonSendActionMessage(10, KDGetEscapeDoorText(KDGetEscapeMethod(MiniGameKinkyDungeonLevel)), "#ffffff", 1); + } + else if (KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)?.AltStairAction) { + KDStairsAltAction[KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).AltStairAction](toTile, suppressCheckPoint); + } + else { + if (!KDPlayer().leash) { + KDGoThruTile(KDPlayer().x, KDPlayer().y, suppressCheckPoint, false, true); + } else { + KinkyDungeonSendActionMessage(10, TextGet("ClimbDownFail"), "#ffffff", 1); + } + } +} + +function KDGoThruTile(x: number, y: number, suppressCheckPoint: boolean, force: boolean, willing: boolean) { + + // Prune inventory + KDPruneInventoryVariants(true, true, true); + + KDTickAutorelease(); + + KDExploreStairs(x, y); + let toTile = KinkyDungeonMapGet(x, y); + if (!KDAdvanceAmount[toTile]) toTile = 'H'; + let tile = KinkyDungeonTilesGet(x + "," + y); + let altRoom = KDGameData.RoomType ? KinkyDungeonAltFloor(KDGameData.RoomType) : KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel); + let altRoomTarget = (tile && tile.RoomType) ? KinkyDungeonAltFloor(tile.RoomType) : null; + let currentAdvanceAmount = KDAdvanceAmount[toTile](altRoom, null); + let journeyTile = KDGameData.JourneyTarget ? KDGameData.JourneyMap[KDGameData.JourneyTarget.x + ',' + KDGameData.JourneyTarget.y] + : KDGameData.JourneyMap[KDGameData.JourneyX + ',' + (KDGameData.JourneyY + currentAdvanceAmount)]; + + + if (!altRoomTarget && !(tile && tile.RoomType)) { + altRoomTarget = (KinkyDungeonAltFloor(journeyTile?.RoomType)); + } + let roomType = ""; + //let currCheckpoint = MiniGameKinkyDungeonCheckpoint; + let originalRoom = KDGameData.RoomType; + let AdvanceAmount = KDAdvanceAmount[toTile](altRoom, altRoomTarget); + + let data = { + CurrentJourneyTile: KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY], + JourneyTile: journeyTile, + altRoom: altRoom, + altRoomTarget: altRoomTarget, + tile: tile, + AdvanceAmount: AdvanceAmount, + Xdelta: toTile != 'H' ? (tile?.Xdelta || 0) : (tile?.Xdelta || 0), // TODO allow maneuvering around the world map + toTile: toTile, + overrideRoomType: false, + overrideProgression: false, + overrideJourney: false, + mapMod: KinkyDungeonTilesGet(x + "," + y)?.MapMod || journeyTile?.MapMod, + faction: KinkyDungeonTilesGet(x + "," + y)?.Faction || journeyTile?.Faction, + escapeMethod: KinkyDungeonTilesGet(x + "," + y)?.EscapeMethod || journeyTile?.EscapeMethod, + cancelevent: "", + cancelfilter: tile?.CancelFilter, + SideRoom: tile?.SideRoom, + ShortcutIndex: tile?.ShortcutIndex, + force: force, + willing: willing, + }; + KinkyDungeonSendEvent("beforeStairCancelFilter", data); + if (data.cancelfilter) { + if (data.cancelfilter && KDCancelFilters[data.cancelfilter]) { + data.cancelevent = KDCancelFilters[data.cancelfilter](x, y, tile, data); + } + } + KinkyDungeonSendEvent("beforeStairCancel", data); + if (data.cancelevent) { + if (KDCancelEvents[data.cancelevent]) { + KDCancelEvents[data.cancelevent](x, y, tile, data); + } + } else { + + let newLocation = KDAdvanceLevel(data, MiniGameKinkyDungeonLevel + data.AdvanceAmount > KDGameData.HighestLevelCurrent, + true + ); + let location = KDWorldMap[newLocation.x + "," + newLocation.y]; + + KDGenMapCallback = () => { + if (data.toTile == 's') { + if (!altRoom?.noAdvance + && !tile?.RoomType + && ( + // By default only the main advances + !KDGameData.RoomType // '' is always advance, just for save compat + || data.CurrentJourneyTile?.RoomType == (originalRoom || "") + || altRoom?.alwaysAdvance)) { + // advance by default + if (MiniGameKinkyDungeonLevel == KDGameData.HighestLevelCurrent + && data.AdvanceAmount == 0 + ) { + data.overrideRoomType = true; + KDGameData.RoomType = "PerkRoom"; + data.mapMod = ""; + } else data.AdvanceAmount = 1; + //data.AdvanceAmount = 0; + } else { + // Return to the normal map + if (!tile?.RoomType) { + data.overrideRoomType = true; + let journeySlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; + if (journeySlot) { + KDGameData.RoomType = journeySlot.RoomType; + } else { + KDGameData.RoomType = ""; + } + } + + data.AdvanceAmount = 0; + } + } + + + if (altRoom?.onExit) altRoom.onExit(data); // Handle any special contitions + KinkyDungeonSendEvent("beforeHandleStairs", data); + + if (MiniGameKinkyDungeonLevel > Math.max(KinkyDungeonRep, ReputationGet("Gaming")) || Math.max(KinkyDungeonRep, ReputationGet("Gaming")) > KinkyDungeonMaxLevel) { + KinkyDungeonRep = Math.max(KinkyDungeonRep, MiniGameKinkyDungeonLevel); + DialogSetReputation("Gaming", KinkyDungeonRep); + } + MiniGameVictory = false; + + if (altRoom?.alwaysRegen + || altRoom?.removePartyMembers + || (altRoom && !(altRoom?.makeMain || altRoom?.persist))) { + // Clear all enemies and remove them so that we pick up allies + for (let en of [...KDMapData.Entities]) { + if (!KDIsInParty(en) || !KDCanBringAlly(en)) + KDRemoveEntity(en, false, true, true); + } + } + + newLocation = KDAdvanceLevel(data, MiniGameKinkyDungeonLevel + data.AdvanceAmount > KDGameData.HighestLevelCurrent); // Advance anyway + + + // We increment the save, etc, after the tunnel + if (MiniGameKinkyDungeonLevel > KDGameData.HighestLevelCurrent) { + if (!data.overrideProgression) { + if (KDGameData.PriorJailbreaks > 0) KDGameData.PriorJailbreaksDecay = (KDGameData.PriorJailbreaksDecay + 1) || 1; + + if (MiniGameKinkyDungeonLevel > 1) { + KDAdvanceTraining(); + // Reduce security level when entering a new area + KinkyDungeonChangeRep("Prisoner", -5); + + if (KinkyDungeonStatsChoice.get("Trespasser")) { + KinkyDungeonChangeRep("Rope", -1); + KinkyDungeonChangeRep("Metal", -1); + KinkyDungeonChangeRep("Leather", -1); + KinkyDungeonChangeRep("Latex", -1); + KinkyDungeonChangeRep("Will", -1); + KinkyDungeonChangeRep("Elements", -1); + KinkyDungeonChangeRep("Conjure", -1); + KinkyDungeonChangeRep("Illusion", -1); + } + } + + if (MiniGameKinkyDungeonLevel >= KinkyDungeonMaxLevel) { + KDSetWorldSlot(0, 0); + KinkyDungeonState = "End"; + MiniGameVictory = true; + suppressCheckPoint = true; + } + } + if (!data.overrideRoomType) { + roomType = ""; + } + } else { + if (tile?.RoomType != undefined) { + roomType = tile.RoomType; + KDGameData.MapMod = ""; // Reset the map mod + } else if (!data.overrideRoomType) { + // If its an exit stair in the main, we override to the main of next floor + // The player can never backtrack to old perk rooms + + roomType = data.JourneyTile?.RoomType || ""; + altRoomTarget = KinkyDungeonAltFloor(roomType); + KDGameData.MapMod = ""; // Reset the map mod + } + } + KDGameData.HighestLevelCurrent = Math.max(KDGameData.HighestLevelCurrent || 1, MiniGameKinkyDungeonLevel); + KDGameData.HighestLevel = Math.max(KDGameData.HighestLevel || 1, MiniGameKinkyDungeonLevel); + + + if (!data.overrideRoomType) { + KDGameData.RoomType = roomType; + } + //if (KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)) { + let MapMod = data.mapMod; + if (MapMod) { + KDGameData.MapMod = MapMod; + KDMapData.MapFaction = KDMapMods[KDGameData.MapMod].faction || ""; + } else { + KDGameData.MapMod = ""; + KDMapData.MapFaction = ""; + } + + if (!data.overrideJourney) { + let Journey = KinkyDungeonTilesGet(x + "," + y)?.Journey; + if (Journey != undefined) { + KDGameData.Journey = Journey; + KDInitializeJourney(KDGameData.Journey, MiniGameKinkyDungeonLevel); + } + } + + + if (!data.overrideRoomType) { + let RoomType = KinkyDungeonTilesGet(x + "," + y)?.RoomType + || data.JourneyTile?.RoomType; + if (RoomType) { + KDGameData.RoomType = RoomType; + } + } + //} + + + KinkyDungeonSendActionMessage(10, TextGet("ClimbDown" + toTile), "#ffffff", 1); + if (toTile == 's') { + KinkyDungeonSetCheckPoint((KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]?.Checkpoint || 'grv'), true, suppressCheckPoint); + } + + + + if (KinkyDungeonState != "End") { + KinkyDungeonSendEvent("afterHandleStairs", { + toTile: toTile, + }); + KDGameData.HeartTaken = false; + + KinkyDungeonCreateMap(KinkyDungeonMapParams[altRoomTarget?.useGenParams ? altRoomTarget.useGenParams : (KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]?.Checkpoint || 'grv')], KDGameData.RoomType, KDGameData.MapMod, MiniGameKinkyDungeonLevel, undefined, undefined, + data.faction, newLocation, + !altRoomTarget || !altRoomTarget.alwaysRegen, + // If this is a sideroom, its actually the main that is the upstairs + (data.JourneyTile?.SideRooms?.includes(KDGameData.RoomType)) ? + KDGetWorldMapLocation(newLocation)?.main || "" + : (altRoom?.persist ? + originalRoom : + (KDGetWorldMapLocation(newLocation)?.main || data.JourneyTile?.RoomType || "")), + AdvanceAmount > 0 + ? (0) + : (toTile == 'S' ? 1 : ( + altRoomTarget?.nostartstairs && !altRoomTarget?.startatstartpos ? 1 : 0 + )), + data.escapeMethod); + + if (data.ShortcutIndex >= 0) { + KDGameData.ShortcutIndex = data.ShortcutIndex; + } else { + KDGameData.ShortcutIndex = KDGameData.RoomType; + } + if (altRoom?.afterExit) altRoom.afterExit(data); // Handle any special contitions + KinkyDungeonSendEvent("AfterAdvance", data); + let saveData = LZString.compressToBase64(JSON.stringify(KinkyDungeonSaveGame(true))); + if (KDGameData.RoomType == "PerkRoom" && MiniGameKinkyDungeonLevel >= 1 && MiniGameKinkyDungeonLevel == KDGameData.HighestLevelCurrent) { // && Math.floor(MiniGameKinkyDungeonLevel / 3) == MiniGameKinkyDungeonLevel / 3 + if ((!KinkyDungeonStatsChoice.get("saveMode")) && !suppressCheckPoint) { + KinkyDungeonState = "Save"; + KDTextArea("saveDataField", 750, 100, 1000, 230); + ElementValue("saveDataField", saveData); + } + } + KinkyDungeonSaveGame(); + KDSendStatus('nextLevel'); + } else { + KDSendStatus('end'); + } + return "Game"; + }; + + + + + if (MiniGameKinkyDungeonLevel < KinkyDungeonMaxLevel - 1 + && !((!altRoomTarget || !altRoomTarget.alwaysRegen) + && (location?.data[KDGameData.RoomType]))) + KinkyDungeonState = "GenMap"; + else { + KDGenMapCallback(); + KDGenMapCallback = null; + } + } +} + + +let KinkyDungeonConfirmStairs = false; + +function KinkyDungeonHandleMoveObject(moveX: number, moveY: number, moveObject: string): boolean { + if (KDMapData.GroundItems.some((item) => {return item.x == moveX && item.y == moveY;})) { + // We can pick up items inside walls, in case an enemy drops it into bars + KinkyDungeonItemCheck(moveX, moveY, MiniGameKinkyDungeonLevel); + } + if (KDMoveObjectFunctions[moveObject]) { + return KDMoveObjectFunctions[moveObject](moveX, moveY); + } + return false; +} + +/** + * @param x + * @param y + */ +function KDHasEffectTile(x: number, y: number): boolean { + return KinkyDungeonEffectTilesGet(x + "," + y) != undefined; +} + +/** + * @param x + * @param y + */ +function KDGetEffectTiles(x: number, y: number, mapData?: KDMapDataType): Record { + let str = x + "," + y; + + if (!mapData) mapData = KDMapData; + return KinkyDungeonEffectTilesGet(str, mapData) ? KinkyDungeonEffectTilesGet(str, mapData) : {}; +} + +function KDGetSpecificEffectTile(x: number, y: number, tile?: string) { + return KDGetEffectTiles(x, y)[tile]; +} + +/** + * @param x + * @param y + * @param tile + * @param durationMod + * @returns {effectTile} + */ +function KDCreateEffectTile(x: number, y: number, tile: effectTileRef, durationMod: number): effectTile { + if (x < 0 || y < 0 || x >= KDMapData.GridWidth || y >= KDMapData.GridHeight) return null; + let existingTile = KDGetSpecificEffectTile(x, y); + let duration = (tile.duration ? tile.duration : KDEffectTiles[tile.name].duration) + KDRandom() * (durationMod ? durationMod : 0); + let createdTile = existingTile; + if (existingTile && existingTile.duration < tile.duration) { + existingTile.duration = duration; + } else { + let tt = Object.assign({x: x, y: y}, KDEffectTiles[tile.name]); + Object.assign(tt, tile); + tt.duration = duration; + if (!KinkyDungeonEffectTilesGet(x + "," + y)) { + KinkyDungeonEffectTilesSet(x + "," + y, {}); + } + KDGetEffectTiles(x, y)[tt.name] = tt; + createdTile = tt; + } + if (createdTile) { + KDInteractNewTile(createdTile); + return createdTile; + } + return null; +} + +function KDInteractNewTile(newTile: effectTile) { + let Creator = KDEffectTileCreateFunctionsCreator[newTile.functionName || newTile.name]; + let Existing = null; + for (let tile of Object.values(KDGetEffectTiles(newTile.x, newTile.y))) { + if (tile != newTile) { + if (Creator) Creator(newTile, tile); + if (tile.duration > 0) { + Existing = KDEffectTileCreateFunctionsExisting[tile.functionName || tile.name]; + if (Existing) Existing(newTile, tile); + } + } + } +} + +/** + * @param x + * @param y + * @param tile + * @param [durationMod] + * @param [rad] + * @param [avoidPoint] + * @param [density] + * @param mod - explosion modifier + */ +function KDCreateAoEEffectTiles(x: number, y: number, tile: effectTileRef, durationMod?: number, rad?: number, avoidPoint?: { x: number, y: number }, density?: number, mod: string = "") { + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if ( KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x + X, Y + y)) + && AOECondition(x, y, x+X, y+Y, rad, mod) + && (!avoidPoint || avoidPoint.x != X + x || avoidPoint.y != Y + y) + && (density == undefined || KDRandom() < density)) + { + KDCreateEffectTile(x + X, y + Y, tile, durationMod); + } + } +} + +/** + * @param x + * @param y + * @param tagsToRemove + * @param [rad] + * @param [avoidPoint] + * @param [density] + * @param mod - explosion modifier + */ +function KDRemoveAoEEffectTiles(x: number, y: number, tagsToRemove: string[], rad: number, avoidPoint?: { x: number, y: number }, density?: number, mod: string = "") { + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (AOECondition(x, y, x+X, y+Y, rad, mod) && (!avoidPoint || avoidPoint.x != X + x || avoidPoint.y != Y + y) && (density == undefined || KDRandom() < density)) { + let tiles = KDGetEffectTiles(x + X, y + Y); + for (let tile of Object.values(tiles)) { + if (tagsToRemove.length == 0) { + tile.duration = 0; + } else { + for (let tag of tagsToRemove) { + if (tile.tags && tile.tags.includes(tag)) { + tile.duration = 0; + break; + } + } + } + } + } + } +} + +/** + * Current alpha vs fade type + * @param id + * @param alpha + * @param fade + * @param delta + */ +function KDApplyAlpha(id: string, alpha: number, fade: string, delta: number) { + if (!fade) return 1.0; + switch (fade) { + case "random": { + if (alpha >= 1 || alpha <= 0) KDTileModes[id] = !KDTileModes[id]; + return Math.max(0, Math.min(1, alpha + (KDTileModes[id] ? -delta*0.001 : delta*0.001))); + } + case "sine3000": { + return Math.max(0, Math.min(1, .5 + 0.25 * Math.sin(CommonTime()/3000))); + } + case "sine1000": { + return Math.max(0, Math.min(1, .5 + 0.25 * Math.sin(CommonTime()/1000))); + } + case "ice": { + return Math.max(0, Math.min(1, .5 + 0.25 * Math.sin(CommonTime()/2500))); + } + } +} + +let KDTileModes: Record = {}; + + +/** + * Current alpha vs fade type + * @param id + * @param x + * @param y + * @param tx + * @param ty + * @param ease + * @param delta + */ +function KDEasePosition(x: number, y: number, tx: number, ty: number, speed: number, delta: number, ease: string): KDPoint { + switch (ease) { + default: { + let dd = KDistEuclidean(tx - x, ty - y); + if (dd > 0) { + let dx = speed * delta * (tx - x) / dd; + let dy = speed * delta * (ty - y) / dd; + if (tx > x) + x = Math.min(tx, x + dx); + else if (tx < x) + x = Math.max(tx, x + dx); + + if (ty > y) + y = Math.min(ty, y + dy); + else if (ty < y) + y = Math.max(ty, y + dy); + } + return {x: x, y: y}; + } + } +} + + + +let KDLastEffTileUpdate = 0; +function KDDrawEffectTiles(_canvasOffsetX: number, _canvasOffsetY: number, CamX: number, CamY: number) { + let delta = CommonTime() - KDLastEffTileUpdate; + KDLastEffTileUpdate = CommonTime(); + for (let tileLocation of Object.values(KDMapData.EffectTiles)) { + for (let tile of Object.values(tileLocation)) { + let sprite = (tile.pauseDuration > 0 && tile.pauseSprite) ? tile.pauseSprite : (tile.skin ? tile.skin : tile.name); + if (tile.x >= CamX && tile.y >= CamY && tile.x < CamX + KinkyDungeonGridWidthDisplay && tile.y < CamY + KinkyDungeonGridHeightDisplay && KinkyDungeonVisionGet(tile.x, tile.y) > 0) { + if (!KDCanSeeEffectTile(tile)) continue; + let tileid = tile.x + "," + tile.y + "_" + sprite; + let color = undefined; + if (tile.tags?.includes("terrain")) { + color = KDGetLightColor(tile.x, tile.y); + } + let op = { + zIndex: -0.1 + 0.01 * tile.priority, + alpha: KDApplyAlpha(tileid, kdpixisprites.get(tileid)?.alpha, tile.fade, delta), + }; + + if (tile.spin) { + op['anchorx'] = 0.5; + op['anchory'] = 0.5; + if (tile.spinAngle == undefined) + tile.spinAngle = 0; + tile.spinAngle += tile.spin * KDTimescale*delta; + if (tile.spinAngle > Math.PI * 2) tile.spinAngle -= Math.PI*2; + else if (tile.spinAngle < 0) tile.spinAngle += Math.PI*2; + } + if (KDBulletTransparency) { + if (tile.duration < 9000) { + op.alpha *= 0.7; + } + } + if (tile.yfade) { + if (!TileYFade[tileid]) TileYFade[tileid] = KDRandom(); + TileYFade[tileid] = KDApplyAlpha(tileid, TileYFade[tileid], tile.yfade, delta); + } + if (color != undefined) op['tint'] = color; + KDDraw(kdeffecttileboard, kdpixisprites, tileid, KinkyDungeonRootDirectory + "EffectTiles/" + sprite + ".png", + (tile.x + (tile.xoffset ? tile.xoffset : 0) - CamX)*KinkyDungeonGridSizeDisplay, + (tile.y - CamY + (tile.yoffset ? tile.yoffset : 0) + (tile.yfadeamount ? tile.yfadeamount*TileYFade[tileid] : 0))*KinkyDungeonGridSizeDisplay, + KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KDAnimQuantize(Math.PI/4 * (tile.spin || 1), tile.spinAngle), op); + } + } + } +} + +let TileYFade: Record = {}; + +/** + * @param tile + */ +function KDCanSeeEffectTile(tile: effectTile): boolean { + if (KinkyDungeonState != "TileEditor" && tile.tags?.includes("hiddenmagic")) { + let rad = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "MagicalSight"); + if (rad <= 0 || KDistEuclidean(tile.x - KinkyDungeonPlayerEntity.x, tile.y - KinkyDungeonPlayerEntity.y) > rad) return false; + } + return true; +} + + +function KDUpdateEffectTiles(delta: number): void { + // Update enemies and the player + for (let examinedTile of Object.values(KDGetEffectTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y))) { + if (examinedTile) KinkyDungeonUpdateSingleEffectTile(delta, KinkyDungeonPlayerEntity, examinedTile); + } + + for (let enemy of KDMapData.Entities) { + for (let examinedTile of Object.values(KDGetEffectTiles(enemy.x, enemy.y))) { + if (examinedTile) if (examinedTile) KinkyDungeonUpdateSingleEffectTile(delta, enemy, examinedTile); + } + } + + // Tick them down + for (let loc of Object.entries(KDMapData.EffectTiles)) { + let location = loc[1]; + for (let t of Object.entries(location)) { + if (t[1].pauseDuration > 0) { + t[1].pauseDuration -= delta; + } else if (!t[1].infinite) { + if (t[1].duration > 0 && t[1].duration < 9000) t[1].duration -= delta; + } + if (t[1].pauseDuration <= 0.001) t[1].pauseSprite = undefined; + if (t[1].duration <= 0.001) delete location[t[0]]; + else { + KinkyDungeonUpdateSingleEffectTileStandalone(delta, t[1]); + } + } + if (Object.values(loc[1]).length < 1) { + delete KDMapData.EffectTiles[loc[0]]; + } + } +} + +/** + * @param delta + * @param entity + * @param tile + */ +function KinkyDungeonUpdateSingleEffectTile(delta: number, entity: entity, tile: effectTile): void { + if (tile.duration > 0 && KDEffectTileFunctions[tile.functionName || tile.name]) { + KDEffectTileFunctions[tile.functionName || tile.name](delta, entity, tile); + } +} +/** + * @param delta + * @param tile + */ +function KinkyDungeonUpdateSingleEffectTileStandalone(delta: number, tile: effectTile): void { + if (tile.noWalls && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(tile.x, tile.y))) { + tile.duration = 0; + } + if (tile.duration > 0 && KDEffectTileFunctionsStandalone[tile.functionName || tile.name]) { + KDEffectTileFunctionsStandalone[tile.functionName || tile.name](delta, tile); + } +} + + + +/** + * @param b + * @param tile + * @param d + */ +function KinkyDungeonBulletInteractionSingleEffectTile(b: any, tile: effectTile, d: number): void { + if (tile.duration > 0 && KDEffectTileBulletFunctions[tile.functionName || tile.name]) { + KDEffectTileBulletFunctions[tile.functionName || tile.name](b, tile, d); + } +} + + +function KDEffectTileInteractions(x: number, y: number, b: any, d: number): void { + for (let examinedTile of Object.values(KDGetEffectTiles(x, y))) { + if (examinedTile) KinkyDungeonBulletInteractionSingleEffectTile(b, examinedTile, d); + } +} + +/** + * Moves an entity + * @param enemy + * @param x + * @param y + * @param willing + * @param [dash] + * @param [ignoreBlocked] - Ignore if the target is blocked--important if swapping + * @param [forceHitBullets] - Forces the target to hit stationary bullets if in the way + */ +function KDMoveEntity(enemy: entity, x: number, y: number, willing: boolean, dash?: boolean, forceHitBullets?: boolean, ignoreBlocked?: boolean, noEvent?: boolean, mapData?: KDMapDataType) { + if (!mapData) mapData = KDMapData; + if (noEvent) { + enemy.x = x; + enemy.y = y; + if (mapData == KDMapData && (enemy.x != enemy.lastx || enemy.y != enemy.lasty)) KDUpdateEnemyCache = true; + enemy.lastx = enemy.x; + enemy.lasty = enemy.y; + enemy.lastmove = KinkyDungeonCurrentTick; + return false; + } + enemy.lastx = enemy.x; + enemy.lasty = enemy.y; + let cancel = {cancelmove: false, returnvalue: false}; + if (mapData == KDMapData) + for (let newTile of Object.values(KDGetEffectTiles(x, y))) { + if (newTile.duration > 0 && KDEffectTileMoveOnFunctions[newTile.name]) { + cancel = KDEffectTileMoveOnFunctions[newTile.name](enemy, newTile, willing, {x: x - enemy.x, y: y - enemy.y}, dash); + } + } + if (!ignoreBlocked && KinkyDungeonEntityAt(x, y, undefined, undefined, undefined, undefined, + mapData)) cancel.cancelmove = true; + if (!cancel.cancelmove) { + enemy.x = x; + enemy.y = y; + + if (mapData == KDMapData) { + KinkyDungeonSendEvent("enemyMove", { + cancelmove: cancel.cancelmove, + returnvalue: cancel.returnvalue, + willing: willing, + sprint: dash, + lastX: enemy.lastx, + lastY: enemy.lasty, + moveX: x, + moveY: y, + enemy: enemy, + }); + KDCheckCollideableBullets(enemy, forceHitBullets); + } + + enemy.fx = undefined; + enemy.fy = undefined; + if (enemy.x != enemy.lastx || enemy.y != enemy.lasty) KDUpdateEnemyCache = true; + } + return cancel.returnvalue; +} + +/** + * @param enemy + */ +function KDStaggerEnemy(enemy: entity) { + enemy.fx = undefined; + enemy.fy = undefined; + enemy.movePoints = 0; + KinkyDungeonSetEnemyFlag(enemy, "stagger", 2); +} + + +function KDMovePlayer(moveX: number, moveY: number, willing: boolean, sprint?: boolean, forceHitBullets?: boolean, suppressNoise?: boolean, noEvent?: boolean): boolean { + KinkyDungeonPlayerEntity.lastx = KinkyDungeonPlayerEntity.x; + KinkyDungeonPlayerEntity.lasty = KinkyDungeonPlayerEntity.y; + KinkyDungeonPlayerEntity.lastmove = KinkyDungeonCurrentTick; + let cancel = {cancelmove: false, returnvalue: false}; + for (let newTile of Object.values(KDGetEffectTiles(moveX, moveY))) { + if (newTile.duration > 0 && KDEffectTileMoveOnFunctions[newTile.name]) { + cancel = KDEffectTileMoveOnFunctions[newTile.name](KinkyDungeonPlayerEntity, newTile, willing, {x: moveX - KinkyDungeonPlayerEntity.x, y: moveY - KinkyDungeonPlayerEntity.y}, sprint); + } + } + if (!cancel.cancelmove) { + if (willing) { + if (moveX > KinkyDungeonPlayerEntity.x) { + KDFlipPlayer = true; + } else if (moveX < KinkyDungeonPlayerEntity.x) { + KDFlipPlayer = false; + } + } else { + KinkyDungeonSetFlag("forceMoved", 1); + } + KinkyDungeonPlayerEntity.x = moveX; + KinkyDungeonPlayerEntity.y = moveY; + + } + let data = { + cancelmove: cancel.cancelmove, // If true, cancels the move + returnvalue: cancel.returnvalue, // Returns this + willing: willing, // True if the player triggers it, false if yoinked by tether + sprint: sprint, // True if faster than usual + lastX: KinkyDungeonPlayerEntity.lastx, + lastY: KinkyDungeonPlayerEntity.lasty, + moveX: moveX, + moveY: moveY, + sound: (sprint && !suppressNoise) ? (4): 0, + dist: KDistChebyshev(KinkyDungeonPlayerEntity.lastx - moveX, KinkyDungeonPlayerEntity.lasty - moveY), + }; + if (!noEvent) + KinkyDungeonSendEvent("playerMove", data); + if (data.sound > 0) { + KinkyDungeonMakeNoise(data.sound, data.moveX, data.moveY); + } + if (!cancel.cancelmove) { + KDCheckCollideableBullets(KinkyDungeonPlayerEntity, forceHitBullets); + KinkyDungeonHandleTraps(KinkyDungeonPlayerEntity, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonTrapMoved); + } + return cancel.returnvalue; +} + +function KDSlip(dir: { x: number, y: number }): boolean { + KinkyDungeonFastMovePath = []; + let maxSlip = 2; + let maxReached = 0; + for (let i = 0; i < maxSlip; i++) { + let newTiles = KDGetEffectTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + let oldTiles = KDGetEffectTiles(KinkyDungeonPlayerEntity.x + dir.x, KinkyDungeonPlayerEntity.y + dir.y); + if ((Object.values(newTiles).some((tile) => {return tile.tags?.includes("slippery") + || ((tile.statuses?.frozen || tile.name.includes("Frozen")) && tile.tags?.includes("slipperywhenfrozen"));}) + || Object.values(oldTiles).some((tile) => {return tile.tags?.includes("slippery") + || ((tile.statuses?.frozen || tile.name.includes("Frozen")) && tile.tags?.includes("slipperywhenfrozen"));})) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x + dir.x, KinkyDungeonPlayerEntity.y + dir.y)) + && !KinkyDungeonEnemyAt(KinkyDungeonPlayerEntity.x + dir.x, KinkyDungeonPlayerEntity.y + dir.y)) { + KDMovePlayer(KinkyDungeonPlayerEntity.x + dir.x, KinkyDungeonPlayerEntity.y + dir.y, false, true, false, true); + KinkyDungeonHandleStepOffTraps(KinkyDungeonPlayerEntity, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonPlayerEntity.x + dir.x, KinkyDungeonPlayerEntity.y + dir.y); + KinkyDungeonHandleTraps(KinkyDungeonPlayerEntity, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true); + maxReached = i; + } else { + i = maxSlip; + } + + } + if (maxReached) { + KinkyDungeonSendActionMessage(10, TextGet("KDSlipIce"), "yellow", maxReached + 1); + KDGameData.SlowMoveTurns = Math.max(KDGameData.SlowMoveTurns, 1); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "Slipping", type: "none", power: 1.0, duration: 1,}); + return true; + } + return false; +} + +/** + * Helper function for flammable tiles + */ +function KDInferno(existingTile: effectTile, newTile: effectTile, duration: number): boolean { + if (newTile.tags.includes("fire") || newTile.tags.includes("ignite")) { + existingTile.duration = 0; + KDCreateEffectTile(existingTile.x, existingTile.y, { + name: "Inferno", + duration: duration, + }, 2); + return true; + } + return false; +} +/** + * + * @param tile + * @param type + * @param [duration] + * @param [chance] + * @param [refreshDuration] + */ +function KDGrow(tile: effectTile, type: string, duration: number = 20, chance: number = 0.1, refreshDuration: number = 20): boolean { + if (KDEffectTileTags(tile.x, tile.y).wet && KDRandom() < chance) { + tile.duration = Math.max(tile.duration, refreshDuration); + let xx = Math.floor(KDRandom() * 3) - 1; + let yy = Math.floor(KDRandom() * 3) - 1; + if (xx == 0 && yy == 0) xx = KDRandom() > 0.5 ? 1 : -1; + KDCreateEffectTile(tile.x + xx, tile.y + yy, { + name: type, + duration: duration, + }, 2); + return true; + } + return false; +} + +/** + * Helper function for flammables + * @param b + * @param tile + * @param d + */ +function KDIgnition(b: any, tile: effectTile, _d: any) { + if (b.bullet.damage) { + let type = b.bullet.damage.type; + if ((KDIgnitionSources.includes(type)) && b.bullet.damage.damage > 0) { + KDCreateEffectTile(tile.x, tile.y, { + name: "Ember", + duration: 2, + }, 1); + } + } +} + +/** + * Code for a conveyor tile. DY and DX enable this functionality + * @param delta + * @param X + * @param Y + * @param [unwilling] + */ +function KDConveyor(_delta: number, X: number, Y: number, unwilling?: boolean) { + let tile = KinkyDungeonTilesGet(X + "," + Y); + if (!tile || tile.SwitchMode == "Off") return; + let entity = KinkyDungeonEntityAt(X, Y); + let tiletype = KinkyDungeonMapGet(X + (tile.DX || 0), Y + (tile.DY || 0)); + if (entity?.Enemy?.tags.prisoner) { + KDStaggerEnemy(entity); + } + if (entity && KinkyDungeonMovableTilesEnemy.includes(tiletype) && !KinkyDungeonEntityAt(X + (tile.DX || 0), Y + (tile.DY || 0))) { + if (entity.player) { + if (!KinkyDungeonFlags.get("conveyed") && (!tile.Sfty || KDPlayerIsStunned() || unwilling || KinkyDungeonFlags.get("conveyed_rec"))) { + KinkyDungeonSetFlag("conveyed", 2); + KinkyDungeonSetFlag("conveyed_rec", 3); + KDMovePlayer(X + (tile.DX || 0), Y + (tile.DY || 0), false, false, true); + KinkyDungeonSendTextMessage(4, TextGet("KDConveyorPush"), "#ffff44", 2); + } + } else if (!KDIsImmobile(entity) && !KDIsFlying(entity) && !entity.Enemy.tags.ignoreconveyor && !entity.Enemy.ethereal + && !((entity.Enemy.tags.unstoppable && (!KinkyDungeonIsDisabled(entity) || !KinkyDungeonIsSlowed(entity))) + || (entity.Enemy.tags.unflinching && !KinkyDungeonIsDisabled(entity)))) { + if (!KDEnemyHasFlag(entity, "conveyed") && (!tile.Sfty || KinkyDungeonIsDisabled(entity) || unwilling || KDEnemyHasFlag(entity, "conveyed_rec") || KDEnemyHasFlag(entity, "stagger"))) { + KinkyDungeonSetEnemyFlag(entity, "conveyed", 2); + KinkyDungeonSetEnemyFlag(entity, "conveyed_rec", 4); + KDMoveEntity(entity, X + (tile.DX || 0), Y + (tile.DY || 0), false, false, true); + } + } + } +} + +function KDTickSpecialStats() { + let player = KDPlayer(); + for (let stat of Object.entries(KDSpecialStats)) { + let buff = KDEntityGetBuff(player, stat[0] + "Stat"); + if (buff?.power > 0) + KDAddSpecialStat(stat[0], KDPlayer(), -Math.min(buff.power, stat[1].PerFloor(player, buff?.power || 0)), true, 100); + } + KDGameData.LockoutChance = 0; +} + +function KDAdvanceLevel(data: any, closeConnections: boolean = true, query: boolean = false): { x: number, y: number } { + if (!query) { + MiniGameKinkyDungeonLevel += data.AdvanceAmount; + let currentSlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; + + if (KDGameData.JourneyTarget && KDGameData.UseJourneyTarget) { + KDGameData.JourneyX = KDGameData.JourneyTarget.x; + KDGameData.JourneyY = KDGameData.JourneyTarget.y; + KDGameData.JourneyTarget = null; + KDGameData.UseJourneyTarget = false; + } else { + // TODO When adding open world feature, have this track better... + KDGameData.JourneyX = KDGetWorldMapLocation({x: KDCurrentWorldSlot.x, y: MiniGameKinkyDungeonLevel})?.jx || 0; + KDGameData.JourneyY = MiniGameKinkyDungeonLevel; + KDGameData.JourneyTarget = null; + } + if (currentSlot && closeConnections) { + for (let c of (currentSlot.Connections)) { + if (c.x == KDGameData.JourneyX && c.y == KDGameData.JourneyY) { + currentSlot.Connections = [c]; + break; + } + } + KDCullJourneyMap(); + } + } + + return { + x: KDCurrentWorldSlot.x + data.Xdelta, + y: KDCurrentWorldSlot.y + data.AdvanceAmount, + }; +} + + + +let KDAdvanceAmount: Record number> = { + 'S': (_altRoom, altRoomNext) => { // Stairs up + return (altRoomNext?.skiptunnel ? -1 : 0); + }, + 's': (altRoom, altRoomNext) => { // Stairs down + return (altRoom?.skiptunnel ? 1 : 0); + }, + 'H': (_altRoom, altRoomNext) => { // Stairs down + return 0; + }, +}; + +type KDTileType = any; + +function KDShouldLock(x: number, y: number, tile: KDTileType): boolean { + if (tile.OGLock && tile.Jail && KDGameData.PrisonerState == 'parole') { + let nearestJail = KinkyDungeonNearestJailPoint(x, y); + if (nearestJail) { + if (KinkyDungeonPointInCell(KDPlayer().x, KDPlayer().y)) { + return false; + } + } + } + + return tile.OGLock != undefined; +} +function KDShouldUnLock(x: number, y: number, tile: KDTileType): boolean { + return true; +} + + + +let KDDangerousTiles = "V[]"; + +function KDIsTileDangerous(entity: entity, x: number, y: number, mapData: KDMapDataType): boolean { + let tile = KinkyDungeonMapDataGet(mapData, x, y); + if (KDDangerousTiles.includes(tile)) return true; + let tags = KDEffectTileTags(x, y, mapData); + + if (tags.dangerous) return true; + if (entity) { + if (tags.slimedanger && !KDSlimeWalker(entity)) return true; + if (tags.soapdanger && !KDSoapWalker(entity)) return true; + } + + for (let pd of Object.values(KDPotentialDangers)) { + if (pd(entity, x, y, mapData, tags)) return true; + } + + return false; +} + +let KDPotentialDangers: Record) => boolean> = { + firedanger: (entity, x, y, mapData, tags) => { + return tags.firedanger && !KinkyDungeonGetImmunity(entity.Enemy?.tags, entity.Enemy?.Resistance?.profile, "fire", "immune", 1) + }, + icedanger: (entity, x, y, mapData, tags) => { + return tags.icedanger && !KinkyDungeonGetImmunity(entity.Enemy?.tags, entity.Enemy?.Resistance?.profile, "ice", "immune", 1) + }, + chaindanger: (entity, x, y, mapData, tags) => { + return tags.chaindanger && !KinkyDungeonGetImmunity(entity.Enemy?.tags, entity.Enemy?.Resistance?.profile, "chain", "immune", 1) + }, + gluedanger: (entity, x, y, mapData, tags) => { + return tags.gluedanger && !KinkyDungeonGetImmunity(entity.Enemy?.tags, entity.Enemy?.Resistance?.profile, "glue", "immune", 1) + }, + gasdanger: (entity, x, y, mapData, tags) => { + return tags.gasdanger && !KinkyDungeonGetImmunity(entity.Enemy?.tags, entity.Enemy?.Resistance?.profile, "poisongas", "immune", 1) + }, + bullet: (entity, x, y, mapData, tags) => { + return false; // TODO + }, + rune: (entity, x, y, mapData, tags) => { + return false; // TODO + }, +} \ No newline at end of file diff --git a/Game/src/map/KinkyDungeonTilesList.ts b/Game/src/map/KinkyDungeonTilesList.ts new file mode 100644 index 000000000..a0506f40e --- /dev/null +++ b/Game/src/map/KinkyDungeonTilesList.ts @@ -0,0 +1,1805 @@ +"use strict"; + +let KDHandsfreeChestTypes = ["shadow", "lessershadow", "gold", "robot", "kitty"]; + +let KDCornerTiles = { + 'A': true, + 'a': true, + 'c': true, + 'o': true, + 'O': true, + '-': true, + '=': true, + '+': true, + 'B': true, + 'M': true, + 'm': true, + 'F': true, +}; + +/** + * Updates local tiles such as conveyors + */ +let KDTileUpdateFunctionsLocal: Record void> = { + "]": (delta, X, Y) => {// Happy Gas! + if (delta > 0) + KDDealEnvironmentalDamage(X, Y, 0.5, { + type: "happygas", + damage: 0.0, + time: 0, + bind: 0, + distract: 2.5, + }); + }, + "[": (delta, X, Y) => {// Sleepy Gas! + if (delta > 0) + KDDealEnvironmentalDamage(X, Y, 0.5, { + type: "poison", + damage: 0.0, + time: 4, + bind: 0, + }); + }, + 'z': (_delta, X, Y) => { + let entity = KinkyDungeonEntityAt(X, Y); + if (entity) return; + let mapTile = KinkyDungeonTilesGet(X + "," + Y); + if (mapTile?.wireType == "AutoDoor_HoldOpen" || mapTile?.wireType == "AutoDoor_HoldClosed") { + let tags = KDEffectTileTags(X, Y); + if ((!tags.signal && mapTile.wireType == "AutoDoor_HoldOpen") + || (tags.signal && mapTile.wireType == "AutoDoor_HoldClosed")) { + KinkyDungeonMapSet(X, Y, 'Z'); + } + } + }, + 'Z': (_delta, X, Y) => { + let mapTile = KinkyDungeonTilesGet(X + "," + Y); + if (mapTile?.wireType == "AutoDoor_HoldOpen" || mapTile?.wireType == "AutoDoor_HoldClosed") { + let tags = KDEffectTileTags(X, Y); + if ((tags.signal && mapTile.wireType == "AutoDoor_HoldOpen") + || (!tags.signal && mapTile.wireType == "AutoDoor_HoldClosed")) { + KinkyDungeonMapSet(X, Y, 'z'); + } + } + }, + "w": (_delta, X, Y) => { + KDCreateEffectTile(X, Y, { + name: "Water", + duration: 2, + }, 0); + }, + "W": (_delta, X, Y) => { + KDCreateEffectTile(X, Y, { + name: "Water", + duration: 2, + }, 0); + }, + "V": (delta, X, Y) => { + KDConveyor(delta, X, Y); + }, + "v": (delta, X, Y) => { + KDConveyor(delta, X, Y); + }, + "N": (delta, X, Y) => { + let tile = KinkyDungeonTilesGet(X + "," + Y); + let tU = KinkyDungeonTilesGet(X + "," + (Y - 1)); + let tD = KinkyDungeonTilesGet(X + "," + (Y + 1)); + let tR = KinkyDungeonTilesGet((X + 1) + "," + Y); + let tL = KinkyDungeonTilesGet((X - 1) + "," + Y); + + if (tU?.DY == 1) tile.DY = 1; + else if (tD?.DY == -1) tile.DY = -1; + else if (tL?.DX == 1) tile.DX = 1; + else if (tR?.DX == -1) tile.DX = -1; + + let entity = KinkyDungeonEntityAt(X, Y); + let BMType = KDBondageMachineFunctions[tile.Binding]; + + if (entity) { + let eligible = false; + if (entity.player) { + if (!KinkyDungeonFlags.get("processed")) { + eligible = BMType.eligible_player(tile, X, Y, entity); + if (eligible) { + if (BMType.function_player(tile, delta, X, Y, entity)) return; + } + } + } else if (entity.Enemy?.bound) { + if (entity.Enemy.tags.prisoner) KDStaggerEnemy(entity); + if (!KDEnemyHasFlag(entity, "processed")) { + eligible = BMType.eligible_enemy(tile, X, Y, entity); + if (eligible) { + if (BMType.function_enemy(tile, delta, X, Y, entity)) return; + } + } + } + } + + KDConveyor(delta, X, Y); + }, + "u": (delta, X, Y) => { + let tile = KinkyDungeonTilesGet(X + "," + Y); + + if (!tile.cd) tile.cd = 0; + if (tile.cd <= 0) { + if (tile.count == undefined || tile.count > 0) { + // Too many dolls!!! + if (KDGameData.DollCount > 30) return; + let nearbyEnemyCount = KDNearbyEnemies(X, Y, 4.5); + if (nearbyEnemyCount.length > 6) return; + let start = true; + let ind = tile.index; + // Loop through and cycle if needed + while (start || ind != tile.index) { + start = false; + let tx = ind == 0 ? -1 : (ind == 2 ? 1 : 0); + let ty = ind == 1 ? -1 : (ind == 3 ? 1 : 0); + + // Create a doll on a conveyor if needed + let entity = KinkyDungeonEntityAt(X + tx, Y + ty); + let tiletype = KinkyDungeonMapGet(X + tx, Y + ty); + let tiledest = KinkyDungeonTilesGet((X + tx) + ',' + (Y + ty)); + if ((tiletype == 'V' || tiletype == 'v') && tiledest?.SwitchMode != "Off" && !entity) { + tile.cd = tile.rate; + let e = DialogueCreateEnemy(X + tx, Y + ty, tile.dollType || "FactoryDoll"); + KinkyDungeonSetEnemyFlag(e, "conveyed", 1); + if (tile.count != undefined) tile.count -= 1; + break; + } + ind += 1; + ind = ind % 4; + } + tile.index = ind; + } + } else { + tile.cd -= delta; + } + }, + "t": (_delta, X, Y) => { + // Consume prisoners on the tile + let entity = KinkyDungeonEntityAt(X, Y); + if (entity && !entity.player) { + if (entity.Enemy?.tags.prisoner || KDHelpless(entity)) { + KDStaggerEnemy(entity); + if (!KDEnemyHasFlag(entity, "conveyed")) { + KDClearItems(entity); + entity.hp = 0; + } + } else { + // kick them out... + KDKickEnemyLocal(entity); + } + + } else if (entity?.player && !KinkyDungeonFlags.get("nodollterm")) { + if (KinkyDungeonFlags.get("conveyed")) { + KDStartDialog("DollTerminal_Forced", "", true, ""); + } else { + KDStartDialog("DollTerminal_Step", "", true, ""); + } + } + }, +}; + +/** + * Return value: whether or not to continue to allow peripheral tile updates + */ +let KDBondageMachineFunctions: Record = { + "Latex": { + eligible_player: (_tile, _x, _y, _entity) => { + return KDGetRestraintsEligible({tags: ['latexEncase', 'latexCatsuits']}, 10, 'grv', false, undefined, undefined, undefined, false).length > 0; + }, + function_player: (_tile, _delta, _x, _y, _entity) => { + KDBasicRestraintsMachine_Player(['latexEncase', 'latexCatsuits'], 2, "KDEncasement"); + return false; + }, + eligible_enemy: (_tile, _x, _y, _entity) => { + return true; + }, + function_enemy: (_tile, _delta, _x, _y, entity) => { + KDTieUpEnemy(entity, 4.0, "Latex", "glue"); + if (KDBoundEffects(entity) > 2 ) { + KDTieUpEnemy(entity, 4.0, "Latex", "glue"); + KinkyDungeonApplyBuffToEntity(entity, KDEncasedDoll); + } + if (KDBoundEffects(entity) < 1 ) { + KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); + KinkyDungeonSetEnemyFlag(entity, "processed", 1); + return true; + } + return false; + }, + }, + "Metal": { + eligible_player: (_tile, _x, _y, _entity) => { + return KDGetRestraintsEligible({tags: ["hitechCables", "cableGag", "controlHarness"]}, 10, 'grv', false, undefined, undefined, undefined, false).length > 0; + }, + function_player: (_tile, _delta, _x, _y, _entity) => { + KDBasicRestraintsMachine_Player(["hitechCables", "cableGag", "controlHarness"], 2, "KDMetalMachine"); + return false; + }, + eligible_enemy: (_tile, _x, _y, _entity) => { + return true; + }, + function_enemy: (_tile, _delta, _x, _y, entity) => { + KDTieUpEnemy(entity, 4.0, "Metal", "chain"); + if (KDBoundEffects(entity) < 1 ) { + KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); + KinkyDungeonSetEnemyFlag(entity, "processed", 1); + return true; + } + return false; + }, + }, + "Doll": { + eligible_player: (_tile, _x, _y, _entity) => { + return KDGetRestraintsEligible({tags: ["cyberdollrestraints"]}, 10, 'grv', false, undefined, undefined, undefined, false).length > 0; + }, + function_player: (_tile, _delta, _x, _y, _entity) => { + KDBasicRestraintsMachine_Player(["cyberdollrestraints"], 2, "KDDollMachine"); + return false; + }, + eligible_enemy: (_tile, _x, _y, _entity) => { + return true; + }, + function_enemy: (_tile, _delta, _x, _y, entity) => { + KDTieUpEnemy(entity, 4.0, "Metal", "chain"); + if (KDBoundEffects(entity) < 1 ) { + KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); + KinkyDungeonSetEnemyFlag(entity, "processed", 1); + return true; + } + return false; + }, + }, + "Tape": { + eligible_player: (_tile, _x, _y, _entity) => { + return KDGetRestraintsEligible({tags: ["autoTape"]}, 10, 'grv', false, undefined, undefined, undefined, false).length > 0; + }, + function_player: (_tile, _delta, _x, _y, _entity) => { + KDBasicRestraintsMachine_Player(["autoTape"], 2, "KDTapeMachine"); + return false; + }, + eligible_enemy: (_tile, _x, _y, _entity) => { + return true; + }, + function_enemy: (_tile, _delta, _x, _y, entity) => { + KDTieUpEnemy(entity, 4.0, "Tape", "glue"); + if (KDBoundEffects(entity) < 1 ) { + KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); + KinkyDungeonSetEnemyFlag(entity, "processed", 1); + return true; + } + return false; + }, + }, + "Plug": { + eligible_player: (_tile, _x, _y, _entity) => { + return KDGetRestraintsEligible({tags: ['machinePlug']}, 10, 'grv', false, undefined, undefined, undefined, false).length > 0; + }, + function_player: (_tile, _delta, _x, _y, _entity) => { + return KDBasicRestraintsMachine_Player(['machinePlug'], 1, "KDPlugMachine") != 0; + }, + eligible_enemy: (_tile, _x, _y, entity) => { + return (entity.boundLevel > 0 || KDEntityGetBuff(entity, "Chastity")) && !(entity.buffs && KinkyDungeonGetBuffedStat(entity.buffs, "Plug") >= 2); + }, + function_enemy: (_tile, _delta, _x, _y, entity) => { + if (!KinkyDungeonGetBuffedStat(entity.buffs, "Plug")) { + KDPlugEnemy(entity); + if (KinkyDungeonGetBuffedStat(entity.buffs, "Plug") > 0) { + KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); + KinkyDungeonSetEnemyFlag(entity, "processed", 1); + return true; + } + } + return false; + }, + }, + "Chastity": { + eligible_player: (_tile, _x, _y, _entity) => { + return KDGetRestraintsEligible({tags: ['machineChastity', 'cyberdollchastity']}, 10, 'grv', false, undefined, undefined, undefined, false).length > 0; + }, + function_player: (_tile, _delta, _x, _y, _entity) => { + return KDBasicRestraintsMachine_Player(['machineChastity', 'cyberdollchastity'], 1, "KDChastityMachine") != 0; + }, + eligible_enemy: (_tile, _x, _y, entity) => { + return entity.boundLevel > 0 && !KDEntityGetBuff(entity, "Chastity"); + }, + function_enemy: (_tile, _delta, _x, _y, entity) => { + KDTieUpEnemy(entity, 2.0, "Metal", "chain"); + if (!KDEntityGetBuff(entity, "Chastity")) { + KinkyDungeonApplyBuffToEntity(entity, KDChastity); + if (KDEntityGetBuff(entity, "Chastity")) { + KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); + KinkyDungeonSetEnemyFlag(entity, "processed", 1); + return true; + } + } + return false; + }, + }, +}; + +/** + * @param tags + * @param count + * @param msg + */ +function KDBasicRestraintsMachine_Player(tags: string[], count: number, msg: string) { + let succ = 0; + for (let i = 0; i < count; i++) { + let restraint = KinkyDungeonGetRestraint({tags: tags}, 10, 'grv', false, undefined, undefined, undefined, false, + undefined, undefined, undefined, undefined, undefined, undefined, undefined, { + allowLowPower: true, + } + ); + if (restraint) { + succ = KinkyDungeonAddRestraintIfWeaker(restraint, KDGetEffLevel(),false, undefined, undefined, undefined, undefined, "AncientRobot", true) || succ; + } + } + if (succ) { + KinkyDungeonSetFlag("conveyed", 2); + KinkyDungeonSetFlag("processed", 3); + KinkyDungeonSendTextMessage(8, TextGet(msg), "#ffff44", 2); + } + return succ; +} + +/** + * Return value: whether or not to continue to allow peripheral tile updates + */ +let KDTileUpdateFunctions: Record boolean> = { + "W": (_delta) => { // Happy Gas! + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, KDWaterSlow); + KinkyDungeonSendTextMessage(5, TextGet("KDWaterIsWet"), "#4fa4b8", 1); + return true; + }, + "]": (delta) => { // Happy Gas! + /*KDDealEnvironmentalDamage(KDPlayer().x, KDPlayer().x, 0.5, { + type: "happygas", + damage: 0.0, + time: 0, + bind: 0, + distract: 2.5, + });*/ + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonHappyGas"), "pink", 1); + return true; + }, + "[": (_delta) => { // Happy Gas! + KinkyDungeonSleepiness = Math.max(KinkyDungeonSleepiness + (2) * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "happygasDamageResist") * 2), 5); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSporeGas"), "pink", 1); + return true; + }, + "L" : (delta) => { // Barrel + if (KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y) + && KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture) { + let furn = KDFurniture[KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture]; + if (furn) { + furn.tickFunction(delta); + } + } else { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "barrel", type: "SlowDetection", duration: 1, power: 9.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "barrel3", type: "Sneak", duration: 1, power: 1.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "darkness", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "barrel2", type: "SlowLevel", duration: 1, power: 1, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Slow", "move", "cast"]}); + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonBarrel"), "lightgreen", 1, true); + } + return true; + }, + "c" : (delta) => { // Unopened chest + if (KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y) + && KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture) { + let furn = KDFurniture[KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).Furniture]; + if (furn) { + furn.tickFunction(delta); + } + } else { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "barrel", type: "SlowDetection", duration: 1, power: 9.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "barrel3", type: "Sneak", duration: 1, power: 1.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "darkness", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "barrel2", type: "SlowLevel", duration: 1, power: 1, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Slow", "move", "cast"]}); + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonBarrelChest"), "lightgreen", 1, true); + } + return true; + }, + "?": (_delta) => { // High hook + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonHookHigh"), "lightgreen", 1, true); + return true; + }, + "/": (_delta) => { // Low hook + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonScrap"), "lightgreen", 1, true); + return true; + }, +}; + +/** + * Return true if movement is stopped + */ +let KDMoveObjectFunctions: Record boolean> = { + 'B': (_moveX, _moveY) => { + /*if (!KinkyDungeonFlags.get("slept") && !KinkyDungeonFlags.get("nobed") && KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.49) { + KDGameData.InteractTargetX = moveX; + KDGameData.InteractTargetY = moveY; + KDStartDialog("Bed", "", true); + }*/ + + if (!KinkyDungeonFlags.get("1stBed")) { + KinkyDungeonSendTextMessage(10, TextGet("KDBedHelp"), "#ffffff", 12, undefined, undefined, undefined, ""); + KinkyDungeonSetFlag("1stBed", -1); + } + return false; + }, + '@': (_moveX, _moveY) => { + if (!KinkyDungeonFlags.get("nobutton")) { + KDStartDialog("Button", "", true); + } + return false; + }, + 'l': (moveX, moveY) => { + if (!KinkyDungeonFlags.get("noleyline") && KinkyDungeonStatManaPool < KinkyDungeonStatManaPoolMax && KDTile(moveX, moveY) && KDTile(moveX, moveY).Leyline) { + KDMovePlayer(moveX, moveY, true, false); + KDStartDialog("Leyline", "", true); + } + return false; + }, + ';': (moveX, moveY) => { + if (!KinkyDungeonFlags.get("noportal") && KDTile(moveX, moveY) && KDTile(moveX, moveY).Portal) { + KDMovePlayer(moveX, moveY, true, false); + KDStartDialog(KDTile(moveX, moveY).Portal, "", true); + } + return false; + }, + 'D': (moveX, moveY) => { // Open the door + KDAttemptDoor(moveX, moveY); + + return true; + }, + 'R': (moveX, moveY) => { + let allowManip = KDAllowUseItems(true); + if (allowManip) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Coins.ogg"); + KinkyDungeonLoot(MiniGameKinkyDungeonLevel, MiniGameKinkyDungeonCheckpoint, "rubble"); + + KinkyDungeonMapSet(moveX, moveY, 'r'); + KinkyDungeonAggroAction('rubble', {}); + } else { + KinkyDungeonSendActionMessage(6, TextGet("KDCantTouchThat"), "#ff8933",1, false, true); + return false; + } + + return true; + }, + 'C': (moveX, moveY) => { // Open the chest + let chestType = KinkyDungeonTilesGet(moveX + "," +moveY) && KinkyDungeonTilesGet(moveX + "," +moveY).Loot ? KinkyDungeonTilesGet(moveX + "," +moveY).Loot : "chest"; + let allowManip = KDHandsfreeChestTypes.includes(chestType) || KDAllowUseItems(true); + if (allowManip) { + + let faction = KinkyDungeonTilesGet(moveX + "," +moveY) && KinkyDungeonTilesGet(moveX + "," +moveY).Faction ? KinkyDungeonTilesGet(moveX + "," +moveY).Faction : undefined; + let noTrap = KinkyDungeonTilesGet(moveX + "," +moveY) && KinkyDungeonTilesGet(moveX + "," +moveY).NoTrap ? KinkyDungeonTilesGet(moveX + "," +moveY).NoTrap : false; + let lootTrap = KinkyDungeonTilesGet(moveX + "," +moveY) && KinkyDungeonTilesGet(moveX + "," +moveY).lootTrap ? KinkyDungeonTilesGet(moveX + "," +moveY).lootTrap : undefined; + let roll = KinkyDungeonTilesGet(moveX + "," +moveY) ? KinkyDungeonTilesGet(moveX + "," +moveY).Roll : KDRandom(); + if (faction && !KinkyDungeonChestConfirm) { + KinkyDungeonChestConfirm = true; + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChestFaction").replace("FACTION", TextGet("KinkyDungeonFaction" + faction)), "#ff5277", 2, true); + return true; + } else { + if (KDHandsfreeChestTypes.includes(chestType)) { + KinkyDungeonSendTextMessage(7, TextGet("KDAutoChest"), "#ffffff",1, false, true); + } + let data = { + chestType: chestType, + roll: roll, + x: moveX, + y: moveY, + tile: KinkyDungeonTilesGet(moveX + "," +moveY), + noTrap: noTrap, + level: MiniGameKinkyDungeonLevel, + index: (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + lootTrap: lootTrap, + aggro: true, + }; + KinkyDungeonSendEvent("beforeChest", data); + if (data.aggro) + KinkyDungeonAggroAction('chest', {faction: faction, x: moveX, y: moveY}); + chestType = data.chestType; + roll = data.roll; + noTrap = data.noTrap; + lootTrap = data.lootTrap; + KDMapData.ChestsOpened++; + // Open container + KDUI_CurrentContainer = KDGetContainer("Chest", {x: moveX, y: moveY}, KDGetCurrentLocation(), + true)?.name; + + KinkyDungeonLoot(data.level, data.index, chestType, roll, data.tile, undefined, noTrap, undefined, undefined, KDGameData.Containers[KDUI_CurrentContainer]); + if (KDUI_CurrentContainer) { + KDGenerateMinorLoot(chestType, KDGetCurrentLocation(), data.tile, moveX, moveY, KDGameData.Containers[KDUI_CurrentContainer]); + } + if (KDUI_CurrentContainer && KDGameData.Containers[KDUI_CurrentContainer] + && Object.values(KDGameData.Containers[KDUI_CurrentContainer].items).length > 0) { + if (KDToggles.Autoloot) { + let container = KDGameData.Containers[KDUI_CurrentContainer]; + for (let inv of Object.values(container.items)) { + let q = inv.quantity || 1; + let suff = ""; + if ((inv.type != Weapon || !KinkyDungeonInventoryGetWeapon(inv.name))) { + for (let i = 0; i < (q || 1); i++) { + if (container.items[inv?.name] + && (inv.type != Weapon || !KinkyDungeonInventoryGetWeapon(inv.name)) + ) { + let item = KinkyDungeonInventoryGetSafe(inv.name); + if (!item) { + item = JSON.parse(JSON.stringify(container.items[inv.name])); + item.quantity = 1; + KinkyDungeonInventoryAdd(item); + } else item.quantity = (item.quantity || 1) + 1; + if (container.items[inv.name].quantity > 1) { + container.items[inv.name].quantity -= 1; + } else { + delete container.items[inv.name]; + } + + } + } + } else if (inv.type == Weapon && KinkyDungeonInventoryGetWeapon(inv.name)) { + suff = TextGet("KDNotPickedUp"); + } + + KinkyDungeonSendTextMessage(2, + TextGet("KDAutoLoot") + `${KDGetItemName(inv)} x${q}` + suff, + "#88ff88", 2) + } + } else { + KDUI_ContainerBackScreen = KinkyDungeonDrawState; + KinkyDungeonDrawState = "Container"; + KinkyDungeonCurrentFilter = "All"; + KDUI_Container_LastSelected = "Chest"; + } + } + if (lootTrap) { + KDMapData.TrapsTriggered++; + KDTrigPanic(true); + KDSpawnLootTrap(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, lootTrap.trap, lootTrap.mult, lootTrap.duration); + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/ChestOpen.ogg"); + KinkyDungeonMapSet(moveX, moveY, 'c'); + KDGameData.AlreadyOpened.push({x: moveX, y: moveY}); + } + } else { + KinkyDungeonSendActionMessage(6, TextGet("KDCantTouchThat"), "#ff8933",1, false, true); + } + + + return true; + }, + 'Y': (moveX, moveY) => { // Open the chest + let allowManip = KDAllowUseItems(true); + if (allowManip) { + let chestType = (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint) == "lib" ? "shelf" : "rubble"; + KinkyDungeonLoot(MiniGameKinkyDungeonLevel, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), chestType); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Coins.ogg"); + KinkyDungeonMapSet(moveX, moveY, 'X'); + KDGameData.AlreadyOpened.push({x: moveX, y: moveY}); + } else { + KinkyDungeonSendActionMessage(6, TextGet("KDCantTouchThat"), "#ff8933",1, false, true); + } + return true; + }, + 'O': (moveX, moveY) => { // Open the chest + if (KinkyDungeonIsPlayer()) + KinkyDungeonTakeOrb(1, moveX, moveY); // 1 spell point + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + KDGameData.AlreadyOpened.push({x: moveX, y: moveY}); + return true; + }, + 'P': (moveX, moveY) => { // Open the chest + if (KinkyDungeonIsPlayer()) { + KDPerkConfirm = false; + KinkyDungeonTakePerk(1, moveX, moveY); // 1 perk choice + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + return true; + }, + '-': (_moveX, _moveY) => { // Open the chest + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonObjectChargerDestroyed"), "#999999", 1, true); + return true; + }, +}; + + +/** + * Return is whether or not something the player should know about happened + */ +let KDEffectTileFunctionsStandalone: Record boolean> = { + "Inferno": (_delta, tile) => { + if (tile.duration > 4 && KDRandom() < 0.3 && !(tile.pauseDuration > 0)) { + KDCreateAoEEffectTiles(tile.x, tile.y, { + name: "Ember", + duration: 1, + }, 4, 1.5, undefined, 0.5); + } + return true; + }, + "Vines": (_delta, tile) => { + KDGrow(tile, "Vines"); + return false; + }, + "Soap": (_delta, tile) => { + if (!KDEffectTileTags(tile.x, tile.y).wet) { + tile.duration = 0; + } + return false; + }, + "SlimeBurning": (_delta, tile) => { + if (tile.duration > 0 && !(tile.pauseDuration > 0)) { + KDCreateEffectTile(tile.x, tile.y, { + name: "Inferno", + duration: 2, + }, 1); // Create blaze + if (KDRandom() < 0.3) { + KDCreateAoEEffectTiles(tile.x, tile.y, { + name: "Ember", + duration: 1, + }, 4, 1.5, undefined, 0.5); + } + } + return true; + }, + "Torch": (_delta, tile) => { + if (tile.duration > 9000) { + tile.duration = 9999; + } + return true; + }, + "TorchUnlit": (_delta, tile) => { + if (tile.duration > 9000) { + tile.duration = 9999; + } + return true; + }, + "Lantern": (_delta, tile) => { + if (tile.duration > 9000) { + tile.duration = 9999; + } + return true; + }, + "LanternUnlit": (_delta, tile) => { + if (tile.duration > 9000) { + tile.duration = 9999; + } + return true; + }, + "TorchOrb": (_delta, tile) => { + if (tile.duration > 9000) { + tile.duration = 9999; + } + return true; + }, + "ManaFull": (_delta, tile) => { + KDCreateEffectTile(tile.x, tile.y, { + name: "WireSparks", + duration: 2, + }, 0); + return false; + }, +}; + +function KDSlimeImmuneEntity(entity: entity) { + if (entity.player) { + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") >= 0.45) return true; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).slimeWalk) { + return true; + } + } + } else return KDSlimeImmune(entity); +} + +function KDSoapImmuneEntity(entity: entity) { + if (entity.player) { + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "soapDamageResist") >= 0.45) return true; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).soapWalk) { + return true; + } + } + } else return KDSoapImmune(entity); +} + +function KDSlimeWalker(entity: entity) { + if (KDSlimeImmuneEntity(entity)) return true; + else if (!entity.player && KDIsFlying(entity)) return true; + return false; +} + +function KDSoapWalker(entity: entity) { + if (KDSoapImmuneEntity(entity)) return true; + else if (!entity.player && KDIsFlying(entity)) return true; + return false; +} + +/** + * @param enemy + */ +function KDSlimeImmune(enemy: entity): boolean { + return enemy.Enemy?.tags.slime + //|| KinkyDungeonGetImmunity(enemy.Enemy?.tags, enemy.Enemy?.Resistance?.profile, "glue", "resist") + || KinkyDungeonGetImmunity(enemy.Enemy?.tags, enemy.Enemy?.Resistance?.profile, "glue", "immune") + || enemy.Enemy?.tags.slimewalk + || KDEntityBuffedStat(enemy, "glueDamageResist") >= 0.45; +} +/** + * @param enemy + */ +function KDSoapImmune(enemy: entity): boolean { + return enemy.Enemy?.tags.slime + //|| KinkyDungeonGetImmunity(enemy.Enemy?.tags, enemy.Enemy?.Resistance?.profile, "glue", "resist") + || KinkyDungeonGetImmunity(enemy.Enemy?.tags, enemy.Enemy?.Resistance?.profile, "soap", "immune") + || enemy.Enemy?.tags.soapwalk + || KDEntityBuffedStat(enemy, "soapDamageResist") >= 0.45; +} +/** + * These happen when stepped on + * Return is whether or not something the player should know about happened + */ +let KDEffectTileFunctions: Record boolean> = { + "PressurePlateHold": (_delta, _entity, tile) => { + KDCreateEffectTile(tile.x, tile.y, { + name: "WireSparks", + duration: 2, + }, 0); + return false; + }, + + "SealSigil": (_delta, _entity, tile) => { + if (_entity?.player) { + tile.duration = 0; + KDEventData.shockwaves.push({ + x: tile.x, + y: tile.y,// - .167, + radius: 1, + sprite: "Particles/SealSigil.png", + }); + + if (MiniGameKinkyDungeonLevel == KDGameData.HighestLevelCurrent) { + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); + KinkyDungeonSendActionMessage(3, TextGet("KDSealSigilContact"), + "#88AAFF", 2); + KDGameData.SigilsErased = (KDGameData.SigilsErased || 0) + 1; + } + + + + + } + return false; + }, + "DistractionMoteContact": (_delta, _entity, tile) => { + if (_entity?.player) { + tile.duration = 0; + KDEventData.shockwaves.push({ + x: tile.x, + y: tile.y,// - .167, + radius: 1, + sprite: "Particles/PinkGlow.png", + }); + KinkyDungeonApplyBuffToEntity(_entity, { + id: "DistractionCast", type: "MiscastChance", power: -1, duration: KDEssenceMoteDuration(), + aura: "#ff8888", aurasprite: "Heart", buffsprite: true, + events: [{type: "EssenceMote", trigger: "tick", mult: -1/KDEssenceMoteDuration()}], + }); + KDAddEssenceMoteDP(); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/PowerMagic.ogg"); + KinkyDungeonSendActionMessage(3, TextGet("KDEssenceMoteContact"), + "#88AAFF", 2); + + } + return false; + }, + "DistractionMote": (_delta, _entity, tile) => { + if (_entity?.player) { + tile.duration = 0; + KDEventData.shockwaves.push({ + x: tile.x, + y: tile.y,// - .167, + radius: 1, + sprite: "Particles/PinkGlow.png", + }); + KinkyDungeonApplyBuffToEntity(_entity, { + id: "DistractionCast", type: "MiscastChance", power: -1, duration: KDEssenceMoteDuration(), + aura: "#ff8888", aurasprite: "Heart", buffsprite: true, + events: [{type: "EssenceMote", trigger: "tick", mult: -1/KDEssenceMoteDuration()}], + }); + KDAddEssenceMoteDP(); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/PowerMagic.ogg"); + KinkyDungeonSendActionMessage(3, TextGet("KDEssenceMoteContact"), + "#88AAFF", 2); + + } + return false; + }, + + "MotionLamp": (_delta, _entity, tile) => { + KDCreateEffectTile(tile.x, tile.y, { + name: "MotionLampLight", + duration: 5, + }, 0); + return false; + }, + "ManaFull": (_delta, _entity, _tile) => { + KinkyDungeonSendTextMessage(8, TextGet("KDManaStationCharged"), "#7799ff"); + return false; + }, + "ManaEmpty": (_delta, entity, tile) => { + if (entity.player) { + if (KinkyDungeonStatMana + KinkyDungeonStatManaPool >= 5) { + KDChangeMana(tile.x + "," + tile.y, "trap", "trap", -5, false, 0, true, true); + tile.duration = 0; + KDCreateEffectTile(tile.x, tile.y, { + name: "ManaPartial", + duration: 9999, infinite: true, + }, 0); + KinkyDungeonSendTextMessage(9, TextGet("KDManaStationDrain1"), "#7799ff"); + return true; + } else { + KinkyDungeonSendTextMessage(9, TextGet("KDManaStationFail"), "#7799ff"); + } + } + return false; + }, + "ManaPartial": (_delta, entity, tile) => { + if (entity.player) { + if (KinkyDungeonStatMana + KinkyDungeonStatManaPool >= 5) { + KDChangeMana(tile.x + "," + tile.y, "trap", "trap", -5, false, 0, true, true); + tile.duration = 0; + KDCreateEffectTile(tile.x, tile.y, { + name: "ManaFull", + duration: 9999, infinite: true, + }, 0); + KinkyDungeonSendTextMessage(9, TextGet("KDManaStationDrain2"), "#7799ff"); + return true; + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDManaStationFail"), "#7799ff"); + } + } + + return false; + }, + + "PressurePlate": (_delta, _entity, tile) => { + let tags = KDEffectTileTags(tile.x, tile.y); + if (!tags.ppactive) { + KDCreateEffectTile(tile.x, tile.y, { + name: "WireSparks", + duration: 2, + }, 0); + } + KDCreateEffectTile(tile.x, tile.y, { + name: "PressurePlateActive", + duration: 2, + }, 0); + return false; + }, + "PressurePlateOneUse": (_delta, _entity, tile) => { + KDCreateEffectTile(tile.x, tile.y, { + name: "WireSparks", + duration: 2, + }, 0); + tile.duration = 0; + return false; + }, + "SlimeBurning": (_delta, entity, tile) => { + if (!KDEntityHasBuff(entity, "Drenched")) { + let slimeWalker = KDSlimeWalker(entity); + if (!slimeWalker) { + if (KinkyDungeonVisionGet(tile.x, tile.y) > 0.5 && !KinkyDungeonFlags.get("1stLatex")) { + KinkyDungeonSendTextMessage(10, TextGet("KDLatexHelp2"), "#ffffff", 12, undefined, undefined, undefined, ""); + KinkyDungeonSendTextMessage(10, TextGet("KDLatexHelp1"), "#ffffff", 12, undefined, undefined, undefined, ""); + KinkyDungeonSetFlag("1stLatex", -1); + } + KinkyDungeonApplyBuffToEntity(entity, KDSlimed); + return true; + } + } + return false; + }, + "Slime": (_delta, entity, tile) => { + if (tile.pauseDuration > 0) { + // Meep + } else if (!KDEntityHasBuff(entity, "Drenched")) { + let slimeWalker = KDSlimeWalker(entity); + if (!slimeWalker) { + if (KinkyDungeonVisionGet(tile.x, tile.y) > 0.5 && !KinkyDungeonFlags.get("1stLatex")) { + KinkyDungeonSendTextMessage(10, TextGet("KDLatexHelp2"), "#ffffff", 12, undefined, undefined, undefined, ""); + KinkyDungeonSendTextMessage(10, TextGet("KDLatexHelp1"), "#ffffff", 12, undefined, undefined, undefined, ""); + KinkyDungeonSetFlag("1stLatex", -1); + } + KinkyDungeonApplyBuffToEntity(entity, KDSlimed); + return true; + } + } + return false; + }, + "Glue": (_delta, entity, tile) => { + if (tile.pauseDuration > 0) { + // Meep + } else if (!KDEntityHasBuff(entity, "Drenched")) { + let slimeWalker = KDSlimeWalker(entity); + if (!slimeWalker) { + KinkyDungeonApplyBuffToEntity(entity, KDSlimed, { + aurasprite: "Glued", + }); + return true; + } + } + return false; + }, + "Latex": (_delta, entity, tile) => { + if (tile.pauseDuration > 0) { + // Meep + } else { + let result = false; + // Latex slimes entities that are on it + let slimeWalker = KDSlimeWalker(entity); + if (!slimeWalker) { + if (!KDEntityHasBuff(entity, "Drenched")) { + if (KinkyDungeonVisionGet(tile.x, tile.y) > 0.5 && !KinkyDungeonFlags.get("1stLatex")) { + KinkyDungeonSendTextMessage(10, TextGet("KDLatexHelp2"), "#ffffff", 12, undefined, undefined, undefined, ""); + KinkyDungeonSendTextMessage(10, TextGet("KDLatexHelp1"), "#ffffff", 12, undefined, undefined, undefined, ""); + KinkyDungeonSetFlag("1stLatex", -1); + } + KinkyDungeonApplyBuffToEntity(entity, KDSlimed); + result = true; + } + } + // Latex also constantly applies binding + if (result) { // || KDEntityBuffedStat(entity, "SlimeProgress") + if (entity.player) { + let latexData = { + cancelDamage: false, + dmg: KDLatexDmg*KDGetEnvironmentalDmg(), + type: "glue", + }; + KinkyDungeonSendEvent("tickLatexPlayer", latexData); + if (!latexData.cancelDamage) + KinkyDungeonDealDamage({damage: latexData.dmg*KDGetEnvironmentalDmg(), type: latexData.type}); + } else if (KDCanBind(entity)) { + let latexData = { + cancelDamage: entity.boundLevel > entity.Enemy.maxhp + KDLatexBind, + enemy: entity, + dmg: 0, + bind: KDLatexBind*KDGetEnvironmentalDmg()* (entity == KinkyDungeonLeashingEnemy() ? 0.1 : 1), + type: "glue", + }; + KinkyDungeonSendEvent("tickLatex", latexData); + if (!latexData.cancelDamage) { + KinkyDungeonDamageEnemy(entity, { + type: "glue", + damage: 0, + bind: KDLatexBind*KDGetEnvironmentalDmg()* (entity == KinkyDungeonLeashingEnemy() ? 0.1 : 1), + flags: ["DoT"] + }, false, true, undefined, undefined, undefined, "Rage"); + if (entity.boundLevel >= entity.Enemy.maxhp) { + KinkyDungeonApplyBuffToEntity(entity, KDEncased); + } + } + } + return true; + } + } + return false; + }, + "Bubble": (_delta, entity, tile) => { + if (tile.pauseDuration > 0) { + // Meep + } else { + // Latex slimes entities that are on it + let slimeWalker = KDSoapImmuneEntity(entity); + if (!slimeWalker) { + if (!KDEntityHasBuff(entity, "WaterBubble")) { + KDApplyBubble(entity, 4, KDGetEnvironmentalDmg() * KDBubbleDmg); + return true; + } + } + } + return false; + }, + "LiquidMetal": (_delta, entity, tile) => { + if (tile.pauseDuration > 0) { + // Meep + } else { + let result = (entity.player && !(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") >= 0.75)) + || (!entity.player && !entity.Enemy.tags?.metal); + let slimeWalker = entity.player && KDSlimeWalker(entity); + if (!slimeWalker) { + result = true; + } + // Liquid Metal also constantly applies binding + if (result || KDEntityBuffedStat(entity, "SlimeProgress")) { + if (entity.player) { + let latexData = { + cancelDamage: false, + dmg: 1.25*KDLatexDmg*KDGetEnvironmentalDmg(), + type: "glue", + bindType: "Metal", + }; + KinkyDungeonSendEvent("tickLatexPlayer", latexData); + if (!latexData.cancelDamage) + KinkyDungeonPlayerEffect(entity, "glue", {name: "LiquidMetalPatch", power: 2, count: 1, damage: "glue"}, undefined, undefined, undefined, undefined); + } else if (KDCanBind(entity)) { + let latexData = { + cancelDamage: entity.boundLevel > entity.Enemy.maxhp + KDLatexBind, + enemy: entity, + dmg: 0, + bind: 1.25*KDLatexBind*KDGetEnvironmentalDmg(), + type: "glue", + bindType: "Metal", + }; + KinkyDungeonSendEvent("tickLatex", latexData); + if (!latexData.cancelDamage) { + KinkyDungeonDamageEnemy(entity, { + type: "glue", + damage: 0, + bindType: "Metal", + bind: 1.25*KDLatexBind*KDGetEnvironmentalDmg(), + flags: ["DoT"] + }, false, true, undefined, undefined, undefined, "Rage"); + if (entity.boundLevel >= entity.Enemy.maxhp) { + KinkyDungeonApplyBuffToEntity(entity, KDEncasedMetal); + } + } + } + return true; + } + } + + if (entity.player && KinkyDungeonPlayerBuffs.Slipping && !KinkyDungeonFlags.get("slipped")) { + KDSlip({x: KinkyDungeonPlayerEntity.x - KinkyDungeonPlayerEntity.lastx, y: KinkyDungeonPlayerEntity.y - KinkyDungeonPlayerEntity.lasty}); + KinkyDungeonSetFlag("slipped", 1); + } + return true; + }, + "Ice": (_delta, entity, _tile) => { + if ((!entity.player && !entity.Enemy.tags.ice && !entity.Enemy.tags.nofreeze) || (entity.player && !KDChillWalk(entity))) + KinkyDungeonApplyBuffToEntity(entity, KDChilled); + if (entity.player && KinkyDungeonPlayerBuffs.Slipping && !KinkyDungeonFlags.get("slipped")) { + KDSlip({x: KinkyDungeonPlayerEntity.x - KinkyDungeonPlayerEntity.lastx, y: KinkyDungeonPlayerEntity.y - KinkyDungeonPlayerEntity.lasty}); + KinkyDungeonSetFlag("slipped", 1); + } + return true; + }, + "Soap": (_delta, entity, _tile) => { + if (entity.player && KinkyDungeonPlayerBuffs.Slipping && !KinkyDungeonFlags.get("slipped")) { + KDSlip({x: KinkyDungeonPlayerEntity.x - KinkyDungeonPlayerEntity.lastx, y: KinkyDungeonPlayerEntity.y - KinkyDungeonPlayerEntity.lasty}); + KinkyDungeonSetFlag("slipped", 1); + } + return true; + }, + "Water": (_delta, entity, tile) => { + if (tile.pauseSprite == tile.name + "Frozen") { + if (entity.player && KinkyDungeonPlayerBuffs.Slipping && !KinkyDungeonFlags.get("slipped")) { + KDSlip({x: KinkyDungeonPlayerEntity.x - KinkyDungeonPlayerEntity.lastx, y: KinkyDungeonPlayerEntity.y - KinkyDungeonPlayerEntity.lasty}); + KinkyDungeonSetFlag("slipped", 1); + } + } else if (KDWettable(entity)) { + KinkyDungeonApplyBuffToEntity(entity, KDDrenched); + KinkyDungeonApplyBuffToEntity(entity, KDDrenched2); + KinkyDungeonApplyBuffToEntity(entity, KDDrenched3); + } + return true; + }, + "Inferno": (delta, entity, _tile) => { + if (entity.player) { + KinkyDungeonDealDamage({ + type: "fire", + damage: 1*KDGetEnvironmentalDmg(), + time: 0, + bind: 0, + flags: ["BurningDamage"] + }); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonInfernoBurn"), "#ff5277", 2); + } else { + KinkyDungeonDamageEnemy(entity, { + type: "fire", + damage: 1*KDGetEnvironmentalDmg(), + time: 0, + bind: 0, + flags: ["BurningDamage"] + }, false, true, undefined, undefined, undefined); + } + if (KDEntityHasBuff(entity, "Drenched")) { + KDEntityGetBuff(entity, "Drenched").duration = Math.max(0, KDEntityGetBuff(entity, "Drenched").duration - 4 * delta); + } + return true; + }, +}; + +/** + * Return is whether or not something the player should know about happened + */ +let KDEffectTileCreateFunctionsCreator: Record boolean> = { + "Ropes": (newTile, existingTile) => { + KDInferno(newTile, existingTile, 4); + return true; + }, + "Gunpowder": (newTile, existingTile) => { + KDInferno(newTile, existingTile, 20); + return true; + }, + "Vines": (newTile, existingTile) => { + KDInferno(newTile, existingTile, 6); + return true; + }, + "Ice": (newTile, existingTile) => { + if (existingTile.tags.includes("freezeover")) { + existingTile.pauseDuration = newTile.duration; + existingTile.pauseSprite = existingTile.name + "Frozen"; + } else if (existingTile.tags.includes("hot")) { + newTile.duration = 0; + } else if (existingTile.tags.includes("conductcold")) { + KDCreateEffectTile(existingTile.x + 1, existingTile.y, { + name: "Chill", + duration: 2, + }, 2); + } + return true; + }, + "Slime": (newTile, existingTile) => { + if (existingTile.tags.includes("ice")) { + newTile.pauseDuration = newTile.duration; + newTile.pauseSprite = newTile.name + "Frozen"; + } else if (existingTile.tags.includes("ignite")) { + newTile.duration = 0; + KDCreateEffectTile(newTile.x, newTile.y, { + name: "SlimeBurning", + duration: existingTile.duration/2, + }, 0); + } + return true; + }, + "Latex": (_newTile, existingTile) => { + if (existingTile.tags.includes("slime")) { + existingTile.duration = 0; + } + return true; + }, + "LiquidMetal": (_newTile, existingTile) => { + if (existingTile.tags.includes("slime") || existingTile.tags.includes("latex")) { + existingTile.duration = 0; + } + return true; + }, + "Water": (newTile, existingTile) => { + if (existingTile.tags.includes("ice")) { + newTile.pauseDuration = newTile.duration; + newTile.pauseSprite = newTile.name + "Frozen"; + } + return true; + }, + "Ember": (newTile, existingTile) => { + if (existingTile.tags.includes("fire")) { + newTile.pauseDuration = existingTile.duration; + newTile.pauseSprite = newTile.name; + } + return true; + }, + "Sparks": (_newTile, existingTile) => { + if (existingTile.tags.includes("conductive")) { + let rt = KDEffectTileTags(existingTile.x + 1, existingTile.y); + let lt = KDEffectTileTags(existingTile.x - 1, existingTile.y); + let ut = KDEffectTileTags(existingTile.x, existingTile.y - 1); + let dt = KDEffectTileTags(existingTile.x, existingTile.y + 1); + let dmg = { + type: "electric", + damage: 2.0, + time: 0, + bind: 0, + flags: ["EchoDamage"], + }; + if (!rt.electric && rt.conductive) { + KDCreateEffectTile(existingTile.x + 1, existingTile.y, { + name: "Sparks", + duration: 2, + }, 2); + KDDealEnvironmentalDamage(existingTile.x + 1, existingTile.y, 0.5, dmg, undefined); + } + if (!lt.electric && lt.conductive) { + KDCreateEffectTile(existingTile.x - 1, existingTile.y, { + name: "Sparks", + duration: 2, + }, 2); + KDDealEnvironmentalDamage(existingTile.x - 1, existingTile.y, 0.5, dmg, undefined); + } + if (!dt.electric && dt.conductive) { + KDCreateEffectTile(existingTile.x, existingTile.y + 1, { + name: "Sparks", + duration: 2, + }, 2); + KDDealEnvironmentalDamage(existingTile.x, existingTile.y + 1, 0.5, dmg, undefined); + } + if (!ut.electric && ut.conductive) { + KDCreateEffectTile(existingTile.x, existingTile.y - 1, { + name: "Sparks", + duration: 2, + }, 2); + KDDealEnvironmentalDamage(existingTile.x, existingTile.y - 1, 0.5, dmg, undefined); + } + } + return true; + }, + "Chill": (_newTile, existingTile) => { + if (existingTile.tags.includes("conductcold")) { + let rt = KDEffectTileTags(existingTile.x + 1, existingTile.y); + let lt = KDEffectTileTags(existingTile.x - 1, existingTile.y); + let ut = KDEffectTileTags(existingTile.x, existingTile.y - 1); + let dt = KDEffectTileTags(existingTile.x, existingTile.y + 1); + let dmg = { + type: "frost", + damage: 0.5, + time: 4, + bind: 0, + flags: ["EchoDamage"], + }; + if (!rt.chill && rt.conductcold) { + KDCreateEffectTile(existingTile.x + 1, existingTile.y, { + name: "Chill", + duration: 2, + }, 2); + KDDealEnvironmentalDamage(existingTile.x + 1, existingTile.y, 0.5, dmg, undefined); + } + if (!lt.chill && lt.conductcold) { + KDCreateEffectTile(existingTile.x - 1, existingTile.y, { + name: "Chill", + duration: 2, + }, 2); + KDDealEnvironmentalDamage(existingTile.x - 1, existingTile.y, 0.5, dmg, undefined); + } + if (!dt.chill && dt.conductcold) { + KDCreateEffectTile(existingTile.x, existingTile.y + 1, { + name: "Chill", + duration: 2, + }, 2); + KDDealEnvironmentalDamage(existingTile.x, existingTile.y + 1, 0.5, dmg, undefined); + } + if (!ut.chill && ut.conductcold) { + KDCreateEffectTile(existingTile.x, existingTile.y - 1, { + name: "Chill", + duration: 2, + }, 2); + KDDealEnvironmentalDamage(existingTile.x, existingTile.y - 1, 0.5, dmg, undefined); + } + } + return true; + }, + "WireSparks": (newTile, existingTile) => { + // Wire => takes both input and output + // Wireout => only outputs signal, does not conduct + if (existingTile.tags.includes("wire") + || existingTile.tags.includes("wireout") || newTile.data?.force) { + let mapTile = KinkyDungeonTilesGet(newTile.x + ',' + newTile.y); + if (mapTile?.wireType) { + if (KDActivateMapTile[mapTile.wireType](mapTile, newTile.x, newTile.y)) { + return true; + } + } + + let rt = KDEffectTileTags(existingTile.x + 1, existingTile.y); + let lt = KDEffectTileTags(existingTile.x - 1, existingTile.y); + let ut = KDEffectTileTags(existingTile.x, existingTile.y - 1); + let dt = KDEffectTileTags(existingTile.x, existingTile.y + 1); + if (!rt.signalFrame && (rt.wire || rt.wireend) && !rt.vert && !existingTile.tags?.includes("vert")) { + KDCreateEffectTile(existingTile.x + 1, existingTile.y, { + name: "WireSparksAct", + duration: 1, + }, 0); + KDCreateEffectTile(existingTile.x + 1, existingTile.y, { + name: "WireSparks", + duration: 2, + }, 0); + } + if (!lt.signalFrame && (lt.wire || lt.wireend) && !lt.vert && !existingTile.tags?.includes("vert")) { + KDCreateEffectTile(existingTile.x - 1, existingTile.y, { + name: "WireSparksAct", + duration: 1, + }, 0); + KDCreateEffectTile(existingTile.x - 1, existingTile.y, { + name: "WireSparks", + duration: 2, + }, 0); + } + if (!dt.signalFrame && (dt.wire || dt.wireend) && !dt.horiz && !existingTile.tags?.includes("horiz")) { + KDCreateEffectTile(existingTile.x, existingTile.y + 1, { + name: "WireSparksAct", + duration: 1, + }, 0); + KDCreateEffectTile(existingTile.x, existingTile.y + 1, { + name: "WireSparks", + duration: 2, + }, 0); + } + if (!ut.signalFrame && (ut.wire || ut.wireend) && !ut.horiz && !existingTile.tags?.includes("horiz")) { + KDCreateEffectTile(existingTile.x, existingTile.y - 1, { + name: "WireSparksAct", + duration: 1, + }, 0); + KDCreateEffectTile(existingTile.x, existingTile.y - 1, { + name: "WireSparks", + duration: 2, + }, 0); + } + } + return true; + + }, +}; + +/** + * Return is whether or not something the player should know about happened + * Return type is whether or not the signal should stop (true) or pass (false) + */ +let KDActivateMapTile: Record boolean> = { + "increment": (tile, _x, _y) => { + if (!tile.count) tile.count = 0; + tile.count += 1; + return false; + }, + "AutoDoor_Toggle": (_tile, x, y) => { + let entity = KinkyDungeonEntityAt(x, y); + if (entity) return true; + + if (KinkyDungeonMapGet(x, y) == 'Z') + KinkyDungeonMapSet(x, y, 'z'); + else + KinkyDungeonMapSet(x, y, 'Z'); + return false; + }, + "Conveyor_Toggle": (tile, _x, _y) => { + if (tile.SwitchMode == "Off") tile.SwitchMode = "On"; + else tile.SwitchMode = "Off"; + return false; + }, + "Conveyor_Switch": (tile, _x, _y) => { + if (tile.DX) tile.DX *= -1; + else if (tile.DY) tile.DY *= -1; + return false; + }, + "AutoDoor_HoldOpen": (_tile, x, y) => { + KinkyDungeonMapSet(x, y, 'z'); + return false; + }, + "AutoDoor_HoldClosed": (_tile, x, y) => { + let entity = KinkyDungeonEntityAt(x, y); + if (entity) return false; + + KinkyDungeonMapSet(x, y, 'Z'); + return false; + }, + "AutoDoor_Open": (_tile, x, y) => { + KinkyDungeonMapSet(x, y, 'z'); + return false; + }, + "AutoDoor_Close": (_tile, x, y) => { + let entity = KinkyDungeonEntityAt(x, y); + if (entity) return false; + + KinkyDungeonMapSet(x, y, 'Z'); + return false; + }, + +}; + +/** + * Return is whether or not something the player should know about happened + */ +let KDEffectTileCreateFunctionsExisting: Record boolean> = { + "Ropes": (newTile, existingTile) => { + KDInferno(existingTile, newTile, 4); + return true; + }, + "Gunpowder": (newTile, existingTile) => { + KDInferno(existingTile, newTile, 20); + return true; + }, + "Vines": (newTile, existingTile) => { + KDInferno(existingTile, newTile, 6); + return true; + }, + "TorchUnlit": (newTile, existingTile) => { + if (newTile.tags.includes("fire") || newTile.tags.includes("ignite")) { + existingTile.duration = 0; + KDCreateEffectTile(existingTile.x, existingTile.y, { + name: "Torch", + duration: 9999, infinite: true, + }, 0); + } + return true; + }, + "Sack": (newTile, existingTile) => { + if (newTile?.tags?.includes("snuffable")) { + newTile.duration = 0; + KDCreateEffectTile(existingTile.x, existingTile.y, { + name: newTile.name + "Unlit", + duration: 9999, infinite: true, + }, 0); + } else if (newTile?.tags?.includes("fire") || newTile?.tags?.includes("ignite")) { + existingTile.duration = 0; + } + return true; + }, + "Torch": (newTile, existingTile) => { + if (newTile.tags.includes("freeze")) { + existingTile.duration = 0; + KDCreateEffectTile(existingTile.x, existingTile.y, { + name: "TorchUnlit", + duration: 9999, infinite: true, + }, 0); + } + return true; + }, + "Latex": (newTile, _existingTile) => { + if (newTile.tags.includes("slime")) { + newTile.duration = 0; + } + return true; + }, + "LiquidMetal": (newTile, _existingTile) => { + if (newTile.tags.includes("slime") || newTile.tags.includes("latex")) { + newTile.duration = 0; + } + return true; + }, + "LanternUnlit": (newTile, existingTile) => { + if (newTile.tags.includes("fire") || newTile.tags.includes("ignite")) { + existingTile.duration = 0; + KDCreateEffectTile(existingTile.x, existingTile.y, { + name: "Lantern", + duration: 9999, infinite: true, + }, 0); + } + return true; + }, + "SlimeBurning": (newTile, existingTile) => { + if (newTile.tags.includes("ice") || newTile.tags.includes("water")) { + existingTile.duration = 0; + KDCreateEffectTile(existingTile.x, existingTile.y, { + name: "Slime", + duration: existingTile.duration*2, + }, 0); + } + return true; + }, +}; + +/** + * Return is whether or not the move should be interrupted + */ +let KDEffectTileMoveOnFunctions: Record {cancelmove: boolean, returnvalue: boolean}> = { + "Cracked": (entity, tile, _willing, _dir, _sprint) => { + if (tile.pauseDuration > 0) { + // Meep + } else if (!entity.Enemy || (!entity.Enemy.tags.earth && !entity.Enemy.tags.unstoppable)) { + KinkyDungeonApplyBuffToEntity(entity, KDUnsteady); + if (entity.player) { + KinkyDungeonApplyBuffToEntity(entity, KDUnsteady2); + KinkyDungeonApplyBuffToEntity(entity, KDUnsteady3); + } else if (!entity.Enemy || !entity.Enemy.tags.unflinching) { + if (!entity.vulnerable) entity.vulnerable = 1; + else entity.vulnerable = Math.max(entity.vulnerable, 1); + } + } + return {cancelmove: false, returnvalue: false}; + }, + "SpikeTrap": (entity, tile, _willing, _dir, _sprint) => { + if (!KDEffectTileTags(tile.x, tile.y).trapactive) { + KDCreateEffectTile(tile.x, tile.y, { + name: "SpikeTrapActive", + duration: 5, + }, 0); + KDCreateEffectTile(tile.x, tile.y, { + name: "SpikeTrapSeen", + duration: 300, + }, 0); + let spell = KinkyDungeonFindSpell("SpikeTrap", true); + if (spell) + KinkyDungeonCastSpell(tile.x, tile.y, spell, + undefined, undefined, undefined, "Trap"); + + } + return {cancelmove: false, returnvalue: false}; + }, + "Rubble": (entity, tile, _willing, _dir, _sprint) => { + if (tile.pauseDuration > 0) { + // Meep + } else if (!entity.Enemy || (!entity.Enemy.tags.earth && !entity.Enemy.tags.unstoppable)) { + KinkyDungeonApplyBuffToEntity(entity, KDUnsteady); + if (entity.player) { + KinkyDungeonApplyBuffToEntity(entity, KDUnsteady2); + KinkyDungeonApplyBuffToEntity(entity, KDUnsteady3); + } else if (!entity.Enemy || !entity.Enemy.tags.unflinching) { + if (!entity.vulnerable) entity.vulnerable = 1; + else entity.vulnerable = Math.max(entity.vulnerable, 1); + } + } + return {cancelmove: false, returnvalue: false}; + }, + "LiquidMetal": (entity, _tile, willing, dir, sprint) => { + if (sprint && entity.player && willing && (dir.x || dir.y) && !KinkyDungeonFlags.get("slipped")) { + KDSlip(dir); + KinkyDungeonSetFlag("slipped", 1); + return {cancelmove: true, returnvalue: true}; + } + return {cancelmove: false, returnvalue: false}; + }, + "Ice": (entity, _tile, willing, dir, sprint) => { + if (sprint && entity.player && willing && (dir.x || dir.y) && !KinkyDungeonFlags.get("slipped")) { + KDSlip(dir); + KinkyDungeonSetFlag("slipped", 1); + return {cancelmove: true, returnvalue: true}; + } + return {cancelmove: false, returnvalue: false}; + }, + "Soap": (entity, _tile, willing, dir, sprint) => { + if (sprint && entity.player && willing && (dir.x || dir.y) && !KinkyDungeonFlags.get("slipped")) { + KDSlip(dir); + KinkyDungeonSetFlag("slipped", 1); + return {cancelmove: true, returnvalue: true}; + } + return {cancelmove: false, returnvalue: false}; + }, + "Water": (entity, tile, willing, dir, sprint) => { + if (tile.pauseSprite == tile.name + "Frozen") { + if (sprint && entity.player && willing && (dir.x || dir.y) && !KinkyDungeonFlags.get("slipped")) { + KDSlip(dir); + KinkyDungeonSetFlag("slipped", 1); + return {cancelmove: true, returnvalue: true}; + } + } + return {cancelmove: false, returnvalue: false}; + }, +}; + + +/** + * Return is idk + */ +let KDEffectTileBulletFunctions: Record boolean> = { + "Ropes": (b, tile, d) => { + KDIgnition(b, tile, d); + return true; + }, + "Gunpowder": (b, tile, d) => { + KDIgnition(b, tile, d); + return true; + }, + "Vines": (b, tile, d) => { + KDIgnition(b, tile, d); + return true; + }, + "SlimeBurning": (b, tile, _d) => { + if (b.bullet.damage) { + let type = b.bullet.damage.type; + if (type == "soap") { + tile.duration = 0; + KDCreateEffectTile(tile.x, tile.y, { + name: "Bubble", + duration: 2, + }, 3); + } else + if (KDSlimeExtinguishTypes.includes(type)) { + KDCreateEffectTile(tile.x, tile.y, { + name: "Slime", + duration: tile.duration*2, + }, 0); // Put out fire + tile.duration = 0; + } + } + return true; + }, + "Slime": (b, tile, _d) => { + if (b.bullet.damage) { + let type = b.bullet.damage.type; + if (type == "soap") { + tile.duration = 0; + KDCreateEffectTile(tile.x, tile.y, { + name: "Bubble", + duration: 2, + }, 3); + } else + if ((KDIgnitionSources.includes(type)) && b.bullet.damage.damage > 0) { + KDCreateEffectTile(tile.x, tile.y, { + name: "SlimeBurning", + duration: tile.duration*0.5, + }, 0); // Put out lantern + tile.duration = 0; + } + } + return true; + }, + "Ember": (b, tile, _d) => { + if (b.bullet.damage) { + let type = b.bullet.damage.type; + if (type == "stun" && b.bullet.damage.damage > 1) { + let newT = KDCreateEffectTile(tile.x, tile.y, { + name: "Inferno", + duration: 5, + }, 5); // Create blaze + if (newT) + tile.pauseDuration = newT.duration; + } else if ((type == "ice" || type == "frost" || type == "soap")) { + tile.duration = 0; + KDSmokePuff(tile.x, tile.y, 1.5, 0.1, true); + } + } + return true; + }, + "Glue": (b, tile, _d) => { + if (b.bullet.damage) { + let type = b.bullet.damage.type; + if (type == "soap" || type == "acid") { + tile.duration = 0; + //KDSmokePuff(tile.x, tile.y, 1.5, 0.1, true); + } + } + return true; + }, + "Torch": (b, tile, _d) => { + if (b.bullet.damage) { + let type = b.bullet.damage.type; + if (KDTorchExtinguishTypes.includes(type)) { + tile.duration = 0; + KDCreateEffectTile(tile.x, tile.y, { + name: "TorchUnlit", + duration: 9999, infinite: true, + }, 0); // Put out lantern + } + } + return true; + }, + "TorchUnlit": (b, tile, _d) => { + if (b.bullet.damage) { + let type = b.bullet.damage.type; + if ((KDIgnitionSources.includes(type))) { + tile.duration = 0; + KDCreateEffectTile(tile.x, tile.y, { + name: "Torch", + duration: 9999, infinite: true, + }, 0); // Put out lantern + } + } + return true; + }, + "Lantern": (b, tile, _d) => { + if (b.bullet.damage) { + let type = b.bullet.damage.type; + if (KDTorchExtinguishTypes.includes(type)) { + tile.duration = 0; + KDCreateEffectTile(tile.x, tile.y, { + name: "LanternUnlit", + duration: 9999, infinite: true, + }, 0); // Put out lantern + } + } + return true; + }, + "LanternUnlit": (b, tile, _d) => { + if (b.bullet.damage) { + let type = b.bullet.damage.type; + if ((KDIgnitionSources.includes(type))) { + tile.duration = 0; + KDCreateEffectTile(tile.x, tile.y, { + name: "Lantern", + duration: 9999, infinite: true, + }, 0); // Put out lantern + } + } + return true; + }, + "Ice": (b, tile, _d) => { + if (b.bullet.damage) { + let type = b.bullet.damage.type; + if ((KDIgnitionSources.includes(type)) && b.bullet.damage.damage > 0) { + tile.duration = 0; + KDCreateEffectTile(tile.x, tile.y, { + name: "Water", + duration: 2, + }, 5); // Create water + } else if ((type == "ice" || type == "frost") && tile.duration < 4 && tile.duration > 0) { + tile.duration = 4; + } + } + return true; + }, + "Water": (b, tile, _d) => { + if (b.bullet.damage) { + let type = b.bullet.damage.type; + if ((type == "ice" || type == "frost")) { + KDCreateEffectTile(tile.x, tile.y, { + name: "Ice", + duration: 3, + }, 1); // Create ice + } else { + if (type == "fire" && b.bullet.damage.damage > 0) { + tile.duration = 0; + KDSmokePuff(tile.x, tile.y, 1.5, 0.1, true); + KDCreateAoEEffectTiles(tile.x, tile.y, { + name: "Steam", + duration: 6, + }, 2, 2.5, undefined, 0.75); + } + if (type == "electric" && b.bullet.damage.damage > 0) { + KDCreateEffectTile(tile.x, tile.y, { + name: "Sparks", + duration: 3, + }, 1); // Create sparks + } + } + } + return true; + }, +}; + + +let KDStairsAltAction = { + "RandomTeleport": (_toTile, _suppressCheckPoint) => { + // Delete the stairs and teleport the player to a random location on another set of stairs + KinkyDungeonMapSet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, '2'); + delete KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).AltStairAction; + let point = KinkyDungeonGetRandomEnemyPointCriteria((x: number, y: number) => { + return KinkyDungeonMapGet(x, y) == 's' + && KinkyDungeonTilesGet(x + "," + y)?.AltStairAction == "RandomTeleport"; + }, false, false, undefined, undefined, undefined, true); + if (point) { + KDMovePlayer(point.x, point.y, false); + KinkyDungeonMapSet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, '2'); + delete KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y).AltStairAction; + + KinkyDungeonSendTextMessage(10, TextGet("KDRandomStairTeleport"), "#ff5277", 5); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Teleport.ogg"); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDRandomStairTeleportFail"), "#ff5277", 5); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Teleport.ogg"); + } + }, + "Null": (_toTile, _suppressCheckPoint) => { + // Beep + } +}; + +function KDAttemptDoor(moveX: number, moveY: number) { + KinkyDungeonAdvanceTime(1, true); + let open = !KinkyDungeonStatsChoice.get("Doorknobs") + || !KinkyDungeonIsHandsBound(true, true, 0.45); + if (!open) { + if (KinkyDungeonCanUseFeet(false)) { + KinkyDungeonSendActionMessage(10, TextGet("KDDoorknobFeet"), "#88ff88", 2); + open = true; + } else { + let grace = 0; + if (KinkyDungeonFlags.get("failUnfairFirst") && !KinkyDungeonFlags.get("failUnfair")) grace = 0.4; + let armsbound = KinkyDungeonIsArmsBound(true, true); + if (KDRandom() - grace < (armsbound ? KDDoorKnobChance : KDDoorKnobChanceArms)) { + KinkyDungeonSendActionMessage(10, TextGet("KDDoorknobSuccess" + ((armsbound) ? "" : "Arms")), "#88ff88", 2); + open = true; + } else if (KDRandom() - grace < (armsbound ? KDDoorAttractChance : KDDoorAttractChanceArms) && DialogueBringNearbyEnemy(moveX, moveY, 10, true)) { + KinkyDungeonSendActionMessage(10, TextGet("KDDoorknobAttract" + ((armsbound) ? "" : "Arms")), "#ff5277", 2); + KinkyDungeonMakeNoise(armsbound ? 6 : 3, moveX, moveY); + open = true; + } else { + KinkyDungeonSendActionMessage(10, TextGet("KDDoorknobFail" + (armsbound ? "" : "Arms")), "#ff5277", 2); + KinkyDungeonMakeNoise(armsbound ? 6 : 3, moveX, moveY); + if (!KinkyDungeonFlags.get("failUnfairFirst")) { + KinkyDungeonSetFlag("failUnfair", 5); + KinkyDungeonSetFlag("failUnfairFirst", 10); + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Locked.ogg"); + } + } + } + if (open) { + KinkyDungeonMapSet(moveX, moveY, 'd'); + + // For private doors, aggro the faction + let faction = KinkyDungeonTilesGet(moveX + "," +moveY) && KinkyDungeonTilesGet(moveX + "," +moveY).Faction ? KinkyDungeonTilesGet(moveX + "," +moveY).Faction : undefined; + if (faction) { + KinkyDungeonAggroFaction(faction, true); + } + + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/DoorOpen.ogg"); + } +} diff --git a/Game/src/map/KinkyDungeonTraps.ts b/Game/src/map/KinkyDungeonTraps.ts new file mode 100644 index 000000000..6f3b0b111 --- /dev/null +++ b/Game/src/map/KinkyDungeonTraps.ts @@ -0,0 +1,483 @@ +"use strict"; + + +let KDTrapTypes: Record = { + CustomSleepDart: (_tile, entity, x, y) => { + let spell = KinkyDungeonFindSpell("TrapSleepDart", true); + if (spell) { + // Search any tile 4 tiles up or down that have Line of Sight to the player + let startX = x; + let startY = y; + let possible_coords = [ + {x: -4, y: 0}, {x: 4, y: 0}, {x: 0, y: -4}, {x: 0, y: 4}, + {x: -3, y: 0}, {x: 3, y: 0}, {x: 0, y: -3}, {x: 0, y: 3}, + {x: -2, y: 0}, {x: 2, y: 0}, {x: 0, y: -2}, {x: 0, y: 2}, + ]; + let success = false; + for (let coord of possible_coords) { + if (KinkyDungeonCheckProjectileClearance(startX + coord.x, startY + coord.y, startX, startY)) { + startX += coord.x; + startY += coord.y; + success = true; + break; + } + } + if (success) { + // We fire the dart + let player = KinkyDungeonEnemyAt(x, y) ? KinkyDungeonEnemyAt(x, y) : KinkyDungeonPlayerEntity; + KinkyDungeonCastSpell(x, y, spell, { x: startX, y: startY }, player, undefined); + if (KDSoundEnabled() && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); + delete KinkyDungeonTilesGet(x + "," + y).Trap; + return { + triggered: true, + msg: "", + }; + } else { + // We do sleep gas instead + spell = KinkyDungeonFindSpell("SleepGas", true); + if (spell) { + KinkyDungeonCastSpell(x, y, spell, undefined, undefined, undefined); + if (KDSoundEnabled() && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); + delete KinkyDungeonTilesGet(x + "," + y).Trap; + return { + triggered: true, + msg: TextGet("KinkyDungeonSpellCast" + spell.name), + }; + } + } + } + return { + triggered: false, + msg: "", + }; + }, + BedTrap: (tile, entity, x, y) => { + if (entity.player) + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BedTrap"), 0, true); + if (KDSoundEnabled() && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); + tile.Trap = undefined; + tile.Type = undefined; + KinkyDungeonMakeNoise(10, x, y); + return { + triggered: true, + msg: TextGet("KDBedTrap"), + }; + }, + CageTrap: (tile, entity, _x, _y) => { + if (entity.player) + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("CageTrap"), 0, true); + if (KDSoundEnabled() && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); + tile.Trap = undefined; + tile.Type = "Furniture"; + return { + triggered: true, + msg: TextGet("KDCageTrap"), + }; + }, + DisplayTrap: (tile, entity, _x, _y) => { + if (entity.player) + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DisplayTrap"), 0, true); + if (KDSoundEnabled() && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); + tile.Trap = undefined; + tile.Type = "Furniture"; + return { + triggered: true, + msg: TextGet("KDDisplayTrap"), + }; + }, + DisplayStandTrap: (tile, entity, _x, _y) => { + if (entity.player) + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DisplayTrap"), 0, true); + if (KDSoundEnabled() && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); + tile.Trap = undefined; + tile.Type = "Furniture"; + return { + triggered: true, + msg: TextGet("KDDisplayTrap"), + }; + }, + BarrelTrap: (tile, entity, _x, _y) => { + if (entity.player) + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BarrelTrap"), 0, true); + if (KDSoundEnabled() && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); + tile.Trap = undefined; + tile.Type = undefined; + return { + triggered: true, + msg: TextGet("KDBarrelTrap"), + }; + }, + CustomVine: (tile, entity, x, y) => { + let restraint = KinkyDungeonGetRestraintByName("VinePlantFeet"); + if (restraint) { + KDSendStatus('bound', tile.Trap, "trap"); + + if (entity.player) + KinkyDungeonAddRestraintIfWeaker(restraint, tile.Power, false); + } + let created = KinkyDungeonSummonEnemy(x, y, "VinePlant", tile.Power, 1); + for (let en of created) { + en.stun = 1; + } + if (created.length > 0) { + if (KDSoundEnabled() && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); + delete KinkyDungeonTilesGet(x + "," + y).Trap; + } + return { + triggered: true, + msg: created.length > 0 ? TextGet("KinkyDungeonTrapCustomVine") : "Default", + }; + }, + SpawnEnemies: (tile, entity, x, y) => { + /*if (!entity.player) { + return { + triggered: false, + msg: "", + }; + }*/ + let radius = tile.Power > 4 ? 4 : 2; + let Enemy = (tile.FilterBackup && tile.FilterTag && KinkyDungeonPlayerTags.get(tile.FilterTag)) ? tile.FilterBackup : tile.Enemy; + let created = KinkyDungeonSummonEnemy( + x, y, Enemy, tile.Power, radius, true, undefined, undefined, true, tile.Faction || "Ambush", (!tile.Faction || tile.Hostile) && true, 1.5, true); + for (let en of created) { + if (tile.teleportTime) { + en.teleporting = 1+tile.teleportTime; + en.teleportingmax = 1+tile.teleportTime; + } else { + en.stun = 2; + } + } + if (created.length > 0) { + if (KDSoundEnabled() && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); + delete KinkyDungeonTilesGet(x + "," + y).Trap; + } + return { + triggered: created.length > 0, + msg: created.length > 0 ? TextGet("KinkyDungeonTrapSpawn" + Enemy) : "", + }; + }, + SpecificSpell: (tile, entity, x, y) => { + let spell = KinkyDungeonFindSpell(tile.Spell, true); + if (spell) { + let xx = 0; + let yy = 0; + if (!tile.noVary) { + for (let i = 0; i < 10; i++) { + xx = Math.floor(KDRandom() * 3 - 1); + yy = Math.floor(KDRandom() * 3 - 1); + if (xx != 0 || yy != 0) i = 1000; + } + } + KinkyDungeonCastSpell(x + xx, y + yy, spell, undefined, undefined, undefined, "Trap"); + if (KDSoundEnabled() && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); + delete KinkyDungeonTilesGet(x + "," + y).Trap; + let etiles = Object.values(KDGetEffectTiles(x, y)).filter((etile) => { + return etile.tags && etile.tags.includes("runetrap"); + }); + if (etiles?.length > 0) { + for (let et of etiles) { + et.duration = 0; + } + } + } + return { + triggered: spell != undefined, + msg: TextGet("KinkyDungeonSpellCast" + tile.Spell), + }; + }, + + +}; + +let KDTrapTypesStepOff = { + DoorLock: (tile: any, entity: entity, x: number, y: number) => { + let created = 0; + if (KinkyDungeonNoEnemy(x, y)) { + let lifetime = tile.Lifetime ? tile.Lifetime : undefined; + KinkyDungeonMapSet(x, y, 'D'); + let spawned = 0; + let maxspawn = 1 + Math.round(Math.min(2 + KDRandom() * 2, KinkyDungeonDifficulty/25) + Math.min(2 + KDRandom() * 2, 0.5*MiniGameKinkyDungeonLevel/KDLevelsPerCheckpoint)); + if (tile.SpawnMult) maxspawn *= tile.SpawnMult; + let requireTags = ["doortrap"]; + + let tags = ["doortrap"]; + KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); + + for (let i = 0; i < 30; i++) { + if (spawned < maxspawn) { + let Enemy = KinkyDungeonGetEnemy( + tags, MiniGameKinkyDungeonLevel, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + '0', requireTags, {requireHostile: "Player"}, undefined, undefined, undefined, undefined, undefined, true); + if (Enemy) { + if (KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, Enemy.name, 1, 7, false, Enemy.tags.construct ? 23 : undefined, true, true, "Ambush", true, 1.5, true, undefined, true).length == 0) { + KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, Enemy.name, 1, 7, true, Enemy.tags.construct ? 23 : undefined, false, true, "Ambush", true, 1.5, true, undefined, true); + } + if (Enemy.tags.minor) spawned += 0.4; + else spawned += 1; + } + } + } + if (spawned > 0) { + KinkyDungeonMapSet(x, y, 'd'); + created = KinkyDungeonSummonEnemy(x, y, "DoorLock", 1, 0, false, lifetime).length; + if (created > 0) { + if (KDSoundEnabled() && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/MagicSlash.ogg"); + KinkyDungeonMakeNoise(12, x, y); + delete KinkyDungeonTilesGet(x + "," + y).StepOffTrap; + KinkyDungeonMapSet(x, y, 'D'); + } + } else + KinkyDungeonMapSet(x, y, 'd'); + + return { + msg: "Default", + triggered: true, + }; + } + return { + msg: "Default", + triggered: false, + }; + } +}; + +let KinkyDungeonTrapMoved = false; + +function KinkyDungeonHandleStepOffTraps(entity: entity, x: number, y: number, moveX: number, moveY: number) { + let flags = { + AllowTraps: true, + }; + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile && tile.StepOffTrap && !KinkyDungeonFlags.has("nojailbreak")) { + if (!tile.StepOffTiles || tile.StepOffTiles.includes(moveX + "," + moveY)) { + KinkyDungeonSendEvent("beforeStepOffTrap", {x:x, y:y, tile: tile, flags: flags}); + let msg = ""; + let color = "#ff5277"; + let trap = tile.StepOffTrap; + + if (KDTrapTypesStepOff[tile.StepOffTrap]) { + let res = KDTrapTypesStepOff[tile.StepOffTrap](tile, entity, x, y); + msg = res.msg; + if (res.triggered) { + KDMapData.TrapsTriggered++; + } + } + + if (msg) { + KDTrigPanic(); + + if (msg == "Default") + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonTrap" + (trap) + (tile.extraTag || "")), color, 2); + else + KinkyDungeonSendTextMessage(10, msg, color, 2); + } + } + } + +} + +function KinkyDungeonHandleTraps(entity: entity, x: number, y: number, Moved: boolean) { + let flags = { + AllowTraps: true, + }; + let tile = KinkyDungeonTilesGet(x + "," + y); + if (tile && tile.Type == "Trap" && !KinkyDungeonFlags.has("nojailbreak")) { + KinkyDungeonSendEvent("beforeTrap", {x:x, y:y, tile: tile, flags: flags}); + if (flags.AllowTraps && Moved) { + let msg = ""; + let triggered = false; + let color = "#ff5277"; + let trap = tile.Trap; + + if (entity == KinkyDungeonPlayerEntity && KinkyDungeonStatsChoice.has("Rusted") && KDRandom() < 0.25) { + msg = TextGet("KDTrapMisfire"); + } else { + if (KDTrapTypes[tile.Trap]) { + let res = KDTrapTypes[tile.Trap](tile, entity, x, y); + msg = res.msg; + triggered = res.triggered; + } + } + if (triggered) { + KDMapData.TrapsTriggered++; + } + if (entity == KinkyDungeonPlayerEntity && (msg || triggered)) { + KDTrigPanic(); + } + if (msg && entity == KinkyDungeonPlayerEntity) { + if (msg == "Default") + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonTrap" + (trap) + (tile.extraTag || "")), color, 2 + KDGameData.SlowMoveTurns); + else + KinkyDungeonSendTextMessage(10, msg, color, 2 + KDGameData.SlowMoveTurns); + } + } + } + + KinkyDungeonTrapMoved = false; +} + +function KDTrigPanic(chest?: boolean) { + if ((!chest && KinkyDungeonStatsChoice.has("Panic2")) || (chest && KinkyDungeonStatsChoice.has("Panic"))) { + KinkyDungeonSendActionMessage(10, TextGet("KDPanic"), "#ff5277", 4); + KDGameData.SlowMoveTurns = Math.max(KDGameData.SlowMoveTurns, 2); + } +} + +type TrapTypeGoddess = { + Name: string; + Enemy?: string; + Spell?: string; + Level: number; + Power: number; + Weight: number; + strict?: true; + teleportTime?: number; +} + +function KinkyDungeonGetGoddessTrapTypes(): TrapTypeGoddess[] { + let trapTypes: TrapTypeGoddess[] = []; + + if (KinkyDungeonGoddessRep.Rope < KDANGER) { + trapTypes.push({ Name: "SpecificSpell", Spell: "TrapRopeWeak", Level: 0, Power: 3, Weight: 15 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Ninja", Level: 0, Power: 3, Weight: 10 }); + } + if (KinkyDungeonGoddessRep.Rope < KDRAGE) { + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "RopeKraken", Level: 0, Power: 1, Weight: 10 }); + trapTypes.push({ Name: "SpecificSpell", Spell: "TrapRopeStrong", Level: 0, Power: 3, Weight: 40 }); + } + if (KinkyDungeonGoddessRep.Leather < KDANGER) { + trapTypes.push({ Name: "SpecificSpell", Spell: "TrapLeatherWeak", Level: 0, Power: 3, Weight: 15 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Dragon", Level: 0, Power: 3, Weight: 10 }); + } + if (KinkyDungeonGoddessRep.Leather < KDRAGE) { + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "DragonLeader", Level: 0, Power: 1, Weight: 50 }); + } + if (KinkyDungeonGoddessRep.Metal < KDANGER) { + trapTypes.push({ Name: "SpecificSpell", Spell: "TrapCableWeak", Level: 0, Power: 3, Weight: 15 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Drone", Level: 0, Power: 3, Weight: 10 }); + } + if (KinkyDungeonGoddessRep.Metal < KDRAGE) { + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Wolfgirl", Level: 0, Power: 3, Weight: 50 }); + } + if (KinkyDungeonGoddessRep.Latex < KDANGER) { + trapTypes.push({ Name: "SpecificSpell", Spell: "TrapSlimeWeak", Level: 0, Power: 3, Weight: 10 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Alkahestor", Level: 0, Power: 1, Weight: 5 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "SmallSlime", Level: 0, Power: 6, Weight: 10 }); + } + if (KinkyDungeonGoddessRep.Latex < KDRAGE) { + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "SlimeEnthusiast", Level: 0, Power: 2, Weight: 20 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "BigSlime", Level: 0, Power: 3, Weight: 10 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalRubber", Level: 0, Power: 2, Weight: 20 }); + } + if (KinkyDungeonGoddessRep.Elements < KDANGER) { + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalFire", Level: 0, Power: 2, Weight: 5 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalIce", Level: 0, Power: 2, Weight: 5 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalWater", Level: 0, Power: 2, Weight: 5 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalEarth", Level: 0, Power: 2, Weight: 5 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ElementalAir", Level: 0, Power: 2, Weight: 5 }); + } + if (KinkyDungeonGoddessRep.Elements < KDRAGE) { + trapTypes.push({ Name: "SpawnEnemies", strict: true, teleportTime: 3, Enemy: "ElementalFire", Level: 0, Power: 4, Weight: 10 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,teleportTime: 3, Enemy: "ElementalIce", Level: 0, Power: 4, Weight: 10 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,teleportTime: 3, Enemy: "ElementalWater", Level: 0, Power: 4, Weight: 10 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,teleportTime: 3, Enemy: "ElementalEarth", Level: 0, Power: 4, Weight: 10 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,teleportTime: 3, Enemy: "ElementalAir", Level: 0, Power: 4, Weight: 10 }); + } + if (KinkyDungeonGoddessRep.Conjure < KDANGER) { + trapTypes.push({ Name: "SpecificSpell", Spell: "TrapMagicChainsWeak", Level: 0, Power: 3, Weight: 15 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true, teleportTime: 3, Enemy: "TickleHand", Level: 0, Power: 6, Weight: 10 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Dressmaker", Level: 0, Power: 2, Weight: 5 }); + } + if (KinkyDungeonGoddessRep.Conjure < KDRAGE) { + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Conjurer", Level: 0, Power: 1, Weight: 15 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Dressmaker", Level: 0, Power: 2, Weight: 25 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "ConjurerTickler", Level: 0, Power: 1, Weight: 25 }); + } + if (KinkyDungeonGoddessRep.Illusion < KDANGER) { + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Maidforce", Level: 0, Power: 3, Weight: 15 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "MaidforcePara", Level: 0, Power: 2, Weight: 10 }); + trapTypes.push({ Name: "SpecificSpell", Spell: "TrapRopeHoly", Level: 2, Power: 3, Weight: 30 }); + } + if (KinkyDungeonGoddessRep.Illusion < KDRAGE) { + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "Maidforce", Level: 0, Power: 4, Weight: 15 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "MaidforcePara", Level: 0, Power: 3, Weight: 15 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "MaidforceMafia", Level: 0, Power: 3, Weight: 10 }); + trapTypes.push({ Name: "SpawnEnemies", strict: true,Enemy: "MaidforceHead", Level: 0, Power: 1, Weight: 10 }); + } + + return trapTypes; +} + +function KinkyDungeonGetTrap(trapTypes: any[], Level: number, tags: string[]) { + + let trapWeightTotal = 0; + let trapWeights = []; + + for (let trap of trapTypes) { + let effLevel = Level; + let weightMulti = 1.0; + let weightBonus = 0; + + if (effLevel >= trap.Level && (!trap.arousalMode || KinkyDungeonStatsChoice.get("arousalMode"))) { + trapWeights.push({trap: trap, weight: trapWeightTotal}); + let weight: number = trap.Weight + weightBonus; + if (trap.terrainTags) + for (let tag of tags) + if (trap.terrainTags[tag]) weight += trap.terrainTags[tag]; + + trapWeightTotal += Math.max(0, weight*weightMulti); + + } + } + + let selection = KDRandom() * trapWeightTotal; + + for (let L = trapWeights.length - 1; L >= 0; L--) { + if (selection > trapWeights[L].weight) { + return { + StepOffTrap: trapWeights[L].trap.StepOffTrap, + Name: trapWeights[L].trap.Name, + Restraint: trapWeights[L].trap.Restraint, + Enemy: trapWeights[L].trap.Enemy, + FilterTag: trapWeights[L].trap.filterTag, + FilterBackup: trapWeights[L].trap.filterBackup, + Spell: trapWeights[L].trap.Spell, + Power: trapWeights[L].trap.Power, + extraTag: trapWeights[L].trap.extraTag, + Hostile: undefined, + Faction: undefined, + }; + } + } + +} + + +function KDSmokePuff(x: number, y: number, radius: number, density: number, nomsg?: boolean) { + if (!nomsg) + KinkyDungeonSendTextMessage(2, TextGet("KDSmokePuff"), "white", 2); + for (let X = x - Math.floor(radius); X <= x + Math.floor(radius); X++) + for (let Y = y - Math.floor(radius); Y <= y + Math.floor(radius); Y++) { + if ((!density || KDRandom() < density || (X == x && Y == Y)) && KDistEuclidean(X - x, Y - y) <= radius) { + let spell = KinkyDungeonFindSpell("SmokePuff", true); + if (spell) { + KinkyDungeonCastSpell(X, Y, spell, undefined, undefined, undefined); + } + } + } +} + +function KDSteamPuff(x: number, y: number, radius: number, density: number, nomsg?: boolean) { + if (!nomsg) + KinkyDungeonSendTextMessage(2, TextGet("KDSteamPuff"), "white", 2); + for (let X = x - Math.floor(radius); X <= x + Math.floor(radius); X++) + for (let Y = y - Math.floor(radius); Y <= y + Math.floor(radius); Y++) { + if ((!density || KDRandom() < density || (X == x && Y == Y)) && KDistEuclidean(X - x, Y - y) <= radius) { + let spell = KinkyDungeonFindSpell("SteamPuff", true); + if (spell) { + KinkyDungeonCastSpell(X, Y, spell, undefined, undefined, undefined); + } + } + } +} diff --git a/Game/src/map/Lair/DragonLair.ts b/Game/src/map/Lair/DragonLair.ts new file mode 100644 index 000000000..d24c5b721 --- /dev/null +++ b/Game/src/map/Lair/DragonLair.ts @@ -0,0 +1,449 @@ +alts.DragonLair = { + name: "DragonLair", + Title: "DragonLair", + noWear: false, // Disables doodad wear + bossroom: false, + width: 20, + height: 20, + nopatrols: false, + setpieces: { + }, + data: { + ElevatorRoom: true, + }, + genType: "DragonLair", + skin: "cav", + musicParams: "DragonLair", + lightParams: "cav", + useGenParams: "cav", + spawns: false, + chests: false, + shrines: false, + persist: true, + orbs: 0, + chargers: false, + notorches: false, + heart: false, + specialtiles: false, + shortcut: false, + enemies: false, + nojail: true, + nokeys: true, + nostairs: true, + placeDoors: false, + notraps: true, + noClutter: false, + nobrick: false, + noFurniture: true, + nolore: true, + noboring: false, + noSetpiece: true, + + /** hehe */ + keepItems: true, + + beforeWorldGenScript: (coord) => { + let dtype = KDGetDragonType(); + if (dtype?.furniture) { + // Place furniture + let furnitureSlots = KDGetDragonLairFurnitureZones(3.5, 3.5, 4, + KDMapData.GridWidth/2, + KDMapData.GridHeight/2 + ); + for (let fs of furnitureSlots) { + let Ftype = KDGetByWeight(dtype.furniture); + if (Ftype) { + KinkyDungeonMapSetForce(fs.x, fs.y, 'L'); + KinkyDungeonTilesSet((fs.x) + "," + (fs.y), { + Type: "Furniture", + Furniture: Ftype, + }); + KDMapData.JailPoints.push({x: fs.x, y: fs.y, type: "furniture", radius: 1}); + } else { + if (KDRandom() < 0.33) KinkyDungeonMapSetForce(fs.x, fs.y, 'R'); + } + } + + + } + }, + + loadscript: (firsttime) => { + // Place sigils + if (!KDMapData.data) KDMapData.data = {}; + + if (!KDMapData.data.sigilsSpawned) { + let dragonid = KDPersonalAlt[KDMapData.RoomType]?.OwnerNPC; + if (dragonid) { + for (let i = 0; i < KDGameData.SealErasedQuota; i++) { + let point = KinkyDungeonGetRandomEnemyPointCriteria((x, y) => { + return KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(x, y)) + && !(KDEffectTileTags(x, y)["sigil"]) + }, false, false); + if (point) { + KDCreateEffectTile(point.x, point.y, { + name: "SealSigil", + duration: 9999 + }, 0); + } + } + KDGameData.DragonTarget = dragonid; + } + } + KDMapData.data.sigilsSpawned = true; + return true; + }, + genCriteria: (iteration) => { + let dtype = KDGetDragonType(); + if (dtype?.furniture) { + return KDMapData.JailPoints.length > 0 && KDCheckMainPath(); + } + return KDCheckMainPath(); + }, +}; + +let KDNoDragonLairCheckpoints = ['lib']; + +let KDDragonList: KDMapEnemyList[] = [ + { + enemy: "DragonQueenCrystal", + faction: "DragonQueen", + minfloor: 7, + obstacles: { + ChaoticCrystal: 1.0, + ChaoticCrystalActive: 0.25, + SoulCrystal: 0.05, + SoulCrystalActive: 0.01, + CuffedGirl: 0.1, + }, + furniture: { + "": 0.25, + CrystalBase: 0.5, + }, + }, + { + enemy: "DragonQueenPoison", + minfloor: 6, + faction: "DragonQueen", + obstacles: { + BarricadeVine: 1.0, + GiantMushroom: 0.25, + VinePlant: 0.1, + }, + furniture: { + "": 0.25, + VineBase: 0.5, + }, + }, + { + enemy: "DragonQueenIce", + minfloor: 5, + faction: "DragonQueen", + obstacles: { + BarricadeIce: 1.0, + }, + furniture: { + "": 0.25, + IceBase: 0.5, + }, + }, + { + enemy: "DragonQueenShadow", + minfloor: 8, + faction: "DragonQueen", + obstacles: { + ShadowHand: 0.1, + BarricadeShadow: 1.0, + BarricadeShadowMetal: 0.25, + }, + furniture: { + "": 0.25, + ShadowBase: 0.5, + }, + }, + { + enemy: "DragonGirlCrystal", + maxfloor: 5, + faction: "DragonQueen", + obstacles: { + ChaoticCrystal: 1.0, + ChaoticCrystalActive: 0.25, + }, + furniture: { + "": 0.5, + Cage: 0.05, + DisplayStand: 0.05, + CrystalBase: 0.25, + }, + }, + { + enemy: "DragonGirlPoison", + maxfloor: 6, + faction: "DragonQueen", + obstacles: { + BarricadeVine: 0.5, + GiantMushroom: 0.5, + }, + furniture: { + "": 0.5, + Cage: 0.05, + DisplayStand: 0.05, + VineBase: 0.25, + }, + }, + { + enemy: "DragonGirlIce", + maxfloor: 7, + faction: "DragonQueen", + obstacles: { + BarricadeIce: 0.75, + }, + furniture: { + "": 0.5, + Cage: 0.05, + DisplayStand: 0.05, + IceBase: 0.25, + }, + }, + { + enemy: "DragonGirlShadow", + maxfloor: 8, + faction: "DragonQueen", + obstacles: { + BarricadeShadow: 0.75, + BarricadeShadowMetal: 0.25, + }, + furniture: { + "": 0.5, + Cage: 0.05, + DisplayStand: 0.05, + ShadowBase: 0.25, + }, + }, + + +]; + + +KinkyDungeonCreateMapGenType.DragonLair = (POI, VisitedRooms, width, height, openness, density, hallopenness, data) => { + KDMapgenCreateCave(POI, VisitedRooms, width, height, openness, density, hallopenness, data); +}; + +function KDMapgenCreateCave(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { + // Boilerplate + VisitedRooms[0].x = Math.floor(width/2); + VisitedRooms[0].y = Math.floor(height/2); + + let w = KDMapData.GridWidth; + let h = KDMapData.GridHeight; + KDMapData.GridWidth = Math.floor(KDMapData.GridWidth*2); + KDMapData.GridHeight = Math.floor(KDMapData.GridHeight*2); + KDMapData.Grid = ""; + + // Generate the grid + for (let Y = 0; Y < KDMapData.GridHeight; Y++) { + for (let X = 0; X < KDMapData.GridWidth; X++) + KDMapData.Grid = KDMapData.Grid + "1"; + KDMapData.Grid = KDMapData.Grid + '\n'; + } + + // End of boilerplate + + // Generate central cavity + + let dist = 0; + let distcav = 5.5 + 0.25 * openness; + for (let X = 1; X < KDMapData.GridWidth; X += 1) + for (let Y = 1; Y < KDMapData.GridWidth; Y += 1) { + dist = KDistEuclidean(X - KDMapData.GridWidth/2, Y - KDMapData.GridWidth/2); + if (dist < distcav) { + KinkyDungeonMapSet(X, Y, (dist > distcav * 0.67 && KDRandom() < 0.4) ? 'X' : '0'); + } + } + + // Generate branching tunnels + let potEntrances: KDPoint[] = []; + let paths = 5 + Math.floor(density); + let pathMaxLength = 40; + let pathMaxDist = KDMapData.GridWidth/2.5; + + for (let i = 0; i < paths; i++) { + let already: Record = {}; + let curr = {x: (KDMapData.GridWidth/2), y: (KDMapData.GridHeight/2)}; + let last = curr; + for (let ii = 0; + ii < pathMaxLength + && curr + && KDistEuclidean(curr.x - KDMapData.GridWidth/2, + curr.y - KDMapData.GridHeight/2) < pathMaxDist; + ii++) { + KinkyDungeonMapSet(curr.x, curr.y, '0'); + last = curr; + already[curr.x + ',' + curr.y] = curr; + let options = KDNearbyMapTiles(curr.x, curr.y, 1.5).filter((t) => { + return !already[t.x + ',' + t.y] + && KDistEuclidean(t.x - KDMapData.GridWidth/2, + t.y - KDMapData.GridHeight/2) > -0.5 + KDistEuclidean(curr.x - KDMapData.GridWidth/2, + curr.y - KDMapData.GridHeight/2); + }) + if (options.length > 0) { + curr = options[Math.floor(KDRandom() * options.length)]; + } else { + curr = null; + } + } + if (last) { + potEntrances.push(last); + } + + } + + // Open up the map a bit + + // nah + + + + // Create entrances + + for (let i = 0; i < potEntrances.length; i++) { + if (i == 0) { + // Main entrance + KDMapData.StartPosition = {x: potEntrances[i].x, y: potEntrances[i].y}; + KDMapData.EndPosition = KDMapData.StartPosition; + } else { + KDMapData.PotentialEntrances.push({ + Excavate: [], + PlaceScript: "Cave", + Type: "Cave", + x: potEntrances[i].x, + y: potEntrances[i].y, + priority: 100, + }) + } + } + + // End of map gen + + // Boilerplate again + + KinkyDungeonMapSet(KDMapData.StartPosition.x, KDMapData.StartPosition.y, 'S'); + + KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); + + // end of boilerplate again + + // Scatter a healthy amount of cursed items around + + let CurseList = "Dragon"; + let HexList = "Dragon"; + let EnchantList = "Dragon"; + let idist = 5; + + for (let i = 0; i < 10; i++) { + + let ang = KDRandom() * 2 * Math.PI; + let point = (KDRandom() < 0.7 ? null : KinkyDungeonGetNearbyPoint( + KDMapData.GridWidth/2 + Math.round(2*idist * Math.cos(ang)), + KDMapData.GridHeight/2 + Math.round(2*idist * Math.sin(ang)), + true, undefined, undefined, true)) || KinkyDungeonGetNearbyPoint( + KDMapData.GridWidth/2 + Math.round(idist * Math.cos(ang)), + KDMapData.GridHeight/2 + Math.round(idist * Math.sin(ang)), + true, undefined, undefined, true) + if (!point) point = KinkyDungeonGetNearbyPoint(KDMapData.GridWidth/2, KDMapData.GridHeight/2, + true, undefined, undefined, true + ); + if (point) { + let curse: string = undefined; + let Lock = "Gold"; + if (CurseList && KDRandom() < 0.3) { + curse = KDGetByWeight( + KinkyDungeonGetCurseByListWeighted( + [CurseList], + undefined, + false, + 0, + 5 + KDGetEffLevel())); + + } + let tags = ["bindingDress", "latexRestraints", "latexRestraintsHeavy", "kiguRestraints", "trap", "dragonRestraints", "steelbondage"]; + let restraint = KinkyDungeonGetRestraint({tags: tags}, + KDGetEffLevel() + 3, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), undefined, + curse ? undefined : Lock, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + curse, + undefined, + undefined, + { + allowLowPower: true + }); + let item = DialogueAddCursedEnchantedHexed( + restraint, undefined, curse, HexList, EnchantList, + 0, 5 + KDGetEffLevel(), + 0, 8 + KDGetEffLevel(), + true, undefined, Lock + ); + let inv = {x:point.x, y:point.y, name: item.inventoryVariant || item.name}; + (KDMapData).GroundItems.push(inv); + } + } + + +} + +function KDGetDragonLairFurnitureZones(spacingX: number, spacingY: number, minDist: number, xCenter: number, yCenter: number) : KDPoint[] { + let points: Record = {}; + let doF = (x, y) => { + if (minDist && KDistEuclidean(x - xCenter, y - yCenter) <= minDist) return; + let succ = true; + for (let p of [{x: -1, y: 0},{x: 1, y: 0},{x: 0, y: -1},{x: 0, y: 1},]) { + if (!KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(x + p.x, y + p.y)) + || points[(x + p.x) + ',' + (y + p.y)]) { + succ = false; + break; + } + } + if (succ) { + points[(x) + ',' + (y)] = {x: x, y: y}; + } + }; + for (let x = 1; x < KDMapData.GridWidth - 1; x = Math.ceil(x + KDRandom() * spacingX)) { + for (let y = 1; y < KDMapData.GridHeight - 1; y++) { + doF(x, y); + } + } + for (let x = 1; x < KDMapData.GridWidth - 1; x++) { + for (let y = 1; y < KDMapData.GridHeight - 1; y = Math.ceil(y + KDRandom() * spacingY)) { + doF(x, y); + } + } + + return Object.values(points); +} + +function KDGetDragonType(): KDMapEnemyList { + // Get the dragon type + let lair = KDPersonalAlt[KDGameData.RoomType]; + if (lair?.OwnerNPC) { + let NPC = KDGetPersistentNPC(lair.OwnerNPC); + if (NPC?.entity) { + let type = (NPC?.trueEntity ? KinkyDungeonGetEnemyByName(NPC.trueEntity?.Enemy) + : undefined) || KinkyDungeonGetEnemyByName(NPC.entity?.Enemy) + if (type?.name) { + let dtype = KDDragonList.find((d) => { + return d.enemy == type?.name; + }); + return dtype; + } + } + + } + return null; +} \ No newline at end of file diff --git a/Game/src/player/KDAutoStruggle.ts b/Game/src/player/KDAutoStruggle.ts new file mode 100644 index 000000000..8afbb226e --- /dev/null +++ b/Game/src/player/KDAutoStruggle.ts @@ -0,0 +1,392 @@ +'use strict'; + +type KDAS_Result = { + action: string; + id: string; + result: string; + favorability: number; + delay: number; +} + +type KDAS_Action = { + action: string; + id: string; + group: string; + index: number; +} + +type KDAutoStruggleDataType = { + lastTick: number; + lastActionQueue: KDAS_Result[]; + decidedAction: string + + /** State params for PC focus */ + possibleActions: { action: KDAS_Action, weight: number }[]; + /** Measure of despair accumulated with each item, downgrades the item in terms of weight */ + totalDespair: Record; + + currentFocusGroup: string; + currentFocusIndex: number; + /** Despair is the PCs measure of whether to give up and try something else*/ + currentFocusDespair: number; + /** DespairTarget is the PC's value decided for how much effort she is willing to put in */ + currentFocusDespairTarget: number; + + /** Overalldespair determines how much individual hope the protag has for restraints working */ + overallDespair: number; + /** Lengthens the duration of waiting between inputs */ + lastDelay: number; + + /** For the Wiggle action, only moves within this point and only cuts when at the center*/ + wigglePoint: KDPoint; + wiggleDist: number; +} + +let KDAutoStruggleData: KDAutoStruggleDataType = { + lastTick: 0, + lastActionQueue: [], + decidedAction: "", + + possibleActions: [], + totalDespair: {}, + + currentFocusGroup: "", + currentFocusIndex: 0, + currentFocusDespair: 0, + currentFocusDespairTarget: 0, + + overallDespair: 0, + lastDelay: 0, + + wigglePoint: null, + wiggleDist: 2.99, +}; + +let KDAutoStruggleActions: Record number, playerweight?: (player: entity) => number, action: (player: entity) => KDAS_Result}> = { + "Struggle": { + itemweight: (_player, item) => { + if (KDGetCurse(item) || KDRestraint(item).good || KDRestraint(item).armor) return 0; + return 10 / Math.max(1, KDRestraint(item).power); + }, + action: (player) => { + let action = "Struggle"; + let result = KDSendInput("struggle", {group: KDAutoStruggleData.currentFocusGroup, index: KDAutoStruggleData.currentFocusIndex, type: action}); + let favor = KDAS_SwitchFavor(result); + let delay = KDAS_SwitchDelay(result); + return { + action: action, + favorability: favor, + delay: delay, + id: KDAutoWaitIndexID(player, KDAutoStruggleData.currentFocusGroup, KDAutoStruggleData.currentFocusIndex, action), + result: result, + }; + }, + }, + "Remove": { + itemweight: (_player, item) => { + if (item.lock) return 0; + if (KDGetCurse(item) || KDRestraint(item).good || KDRestraint(item).armor) return 0; + if (!KDRestraint(item).alwaysStruggleable && KDGroupBlocked(KDRestraint(item).Group)) return 0; + return 10 / Math.max(1, KDRestraint(item).power); + }, + action: (player) => { + let action = "Remove"; + let result = KDSendInput("struggle", {group: KDAutoStruggleData.currentFocusGroup, index: KDAutoStruggleData.currentFocusIndex, type: action}); + let favor = KDAS_SwitchFavor(result); + let delay = KDAS_SwitchDelay(result); + return { + action: action, + favorability: favor, + delay: delay, + id: KDAutoWaitIndexID(player, KDAutoStruggleData.currentFocusGroup, KDAutoStruggleData.currentFocusIndex, action), + result: result, + }; + }, + }, + "Cut": { + itemweight: (player, item) => { + if (!KDAS_InWigglePoint(player) && !KinkyDungeonWallCrackAndKnife(false)) return 0; + if (KDGetCurse(item) || KDRestraint(item).good || KDRestraint(item).armor) return 0; + if (!KDRestraint(item).alwaysStruggleable && KDGroupBlocked(KDRestraint(item).Group)) return 0; + if (!((KinkyDungeonAllWeapon().some((inv) => {return KDWeapon(inv).light && KDWeapon(inv).cutBonus != undefined;}) || KinkyDungeonGetAffinity(false, "Sharp")) + && !(KDRestraint(item) && KDRestraint(item).escapeChance && KDRestraint(item).escapeChance.Cut == undefined))) return 0; + return 10 / Math.max(1, KDRestraint(item).power); + }, + action: (player) => { + let action = "Cut"; + let result = KDSendInput("struggle", {group: KDAutoStruggleData.currentFocusGroup, index: KDAutoStruggleData.currentFocusIndex, type: action}); + let favor = KDAS_SwitchFavor(result); + let delay = KDAS_SwitchDelay(result); + if (result == "Drop") KDAS_UpdateWigglePoint(player, true); + return { + action: action, + favorability: favor, + delay: delay, + id: KDAutoWaitIndexID(player, KDAutoStruggleData.currentFocusGroup, KDAutoStruggleData.currentFocusIndex, action), + result: result, + }; + }, + }, + "Wait": { + playerweight: (_player) => { + return 20*Math.max(0, - KinkyDungeonStatStamina - KinkyDungeonStatStaminaCostStruggle * 2); + }, + action: (_player) => { + KDSendInput("move", {dir: {x:0, y: 0, delta: 0}, delta: 1, AllowInteract: true, AutoDoor: false, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, true); + return {action: "wait", id: "", result: "fail", delay: 0, favorability: KinkyDungeonStatStamina > (Math.max(KinkyDungeonStatStaminaCostStruggle * 2, KinkyDungeonStatStaminaMax * 0.7)) ? -10 + : (KinkyDungeonStatStamina > KinkyDungeonStatStaminaCostStruggle * 2 ? -4 : -1)}; + }, + }, + "Wiggle": { + playerweight: (_player) => { + return KDAutoStruggleData.lastActionQueue.some((action) => {return action.result == "Drop" || action.result == "NeedEdge";}) ? + ((KDAffinityList.some((affinity) => {return KinkyDungeonGetAffinity(false, affinity);})) ? 5 : 50) + : ((KDAffinityList.some((affinity) => {return KinkyDungeonGetAffinity(false, affinity);})) ? 0.5 : (2 + Math.min(8, KDAutoStruggleData.overallDespair/10))); + }, + action: (player) => { + let wigglePoints = KDAS_GetMovableWigglePoint(player, Math.random() < 0.5); + let point = wigglePoints[Math.floor(Math.random() * wigglePoints.length)] || {x: 0, y: 0}; + KDSendInput("move", {dir: {x:point.x - player.x, y: point.y-player.y, delta: 0}, delta: 1, AllowInteract: true, AutoDoor: false, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, true); + KinkyDungeonSendActionMessage(6, TextGet("KDWiggle"), "#aaaaaa", 1); + if (KDAffinityList.some((affinity) => {return KinkyDungeonGetAffinity(false, affinity);})) { + KDAutoStruggleData.decidedAction = ""; + } + return {action: "wiggle", id: "", result: "fail", delay: 1, favorability: KinkyDungeonStatStamina > (Math.max(KinkyDungeonStatStaminaCostStruggle * 2, KinkyDungeonStatStaminaMax * 0.7)) ? -3 + : (KinkyDungeonStatStamina > KinkyDungeonStatStaminaCostStruggle * 2 ? -2 : -1)}; + }, + }, +}; + +/** + * Function to reset certain state variables of auto struggle + */ +function KDInitAutoStruggle() { + KDAutoStruggleData.possibleActions = []; + KDAutoStruggleData.lastActionQueue = []; + KDAutoStruggleData.decidedAction = ""; + + KDAutoStruggleData.currentFocusGroup = ""; + KDAutoStruggleData.currentFocusIndex = 0; + KDAutoStruggleData.currentFocusDespair = 0; + KDAutoStruggleData.currentFocusDespairTarget = 0; + + + KDAutoStruggleData.overallDespair = 0; + KDAutoStruggleData.totalDespair = {}; + + KDAutoStruggleData.wigglePoint = null; + + KDAutoStruggleData.lastTick = KinkyDungeonCurrentTick; +} + +/** + * Updates the wiggle point + * @param player + * @param [force] + */ +function KDAS_UpdateWigglePoint(player: entity, force?: boolean) { + let wpx = KDAutoStruggleData.wigglePoint?.x; + let wpy = KDAutoStruggleData.wigglePoint?.y; + if (force || (!KDAutoStruggleData.wigglePoint || KDistChebyshev(player.x - wpx, player.y - wpy) > 1.5)) { + KDAutoStruggleData.wigglePoint = {x: player.x, y: player.y}; + } +} + +/** + * Returns if the player is on the wiggle point or not + * @param player + */ +function KDAS_InWigglePoint(player: entity): boolean { + KDAS_UpdateWigglePoint(player); + return (player.x == KDAutoStruggleData.wigglePoint.x && player.y == KDAutoStruggleData.wigglePoint.y); +} +/** + * Returns an array of tiles the player can move near the wiggle points + * @param player + * @param goCloser - If the player has to move closer to the wiggle point + */ +function KDAS_GetMovableWigglePoint(player: entity, goCloser: boolean): KDPoint[] { + KDAS_UpdateWigglePoint(player); + let list: KDPoint[] = []; + let dist = KDAutoStruggleData.wiggleDist; + let wpx = KDAutoStruggleData.wigglePoint.x; + let wpy = KDAutoStruggleData.wigglePoint.y; + let currentPdist = KDistEuclidean(player.x - wpx, player.y - wpy); + for (let XX = Math.floor(player.x - dist); XX <= Math.ceil(player.x + dist); XX++) { + for (let YY = Math.floor(player.y - dist); YY <= Math.ceil(player.y + dist); YY++) { + let pdist = KDistEuclidean(XX - wpx, YY - wpy); + if (KDIsSmartMovable(XX, YY) + && pdist <= dist + && (!goCloser || pdist < currentPdist) + && KDistChebyshev(player.x - XX, player.y - YY) < 1.5) { + list.push({x:XX, y:YY}); + } + } + } + + return list; +} + +/** + * @param result + */ +function KDAS_SwitchFavor(result: string): number { + switch(result) { + case "Success": return 5; + case "Fail": return -1; + case "Impossible": return -10; + case "NeedEdge": return -5; + case "Drop": return -10; + case "Limit": return -6; + case "Strict": return -6; + } + return -1; +} + +/** + * @param result + */ +function KDAS_SwitchDelay(result: string): number { + switch(result) { + case "Success": return 12; + case "Fail": return 1; + case "Impossible": return 4; + case "NeedEdge": return 3; + case "Drop": return 9; + case "Limit": return 6; + case "Strict": return 3; + } + return -1; +} + +/** + * Master function for handling the Auto Struggle state machine + * @param player + */ +function KDHandleAutoStruggle(player: entity) { + if (KinkyDungeonCurrentTick > KDAutoStruggleData.lastTick + 10) { + // Reset the data if it's stale + KDInitAutoStruggle(); + } + KDAutoStruggleData.lastTick = KinkyDungeonCurrentTick; + + // Examine the state of things + KDAutoStruggleEvaluate(player); + // Actually do something + KDAutoStruggleMakeDecision(player); + // Run the decision that was made + let result = KDAutoStruggleRunDecision(player); + + console.log(result); +} + +/** + * Updates the KDAutoStruggleData state data to accurately reflect the player + * @param player + */ +function KDAutoStruggleEvaluate(player: entity) { + KDAutoStruggleData.possibleActions = []; + + // First get actions with an itemweight + for (let inv of KinkyDungeonAllRestraint()) { + let items = KDDynamicLinkListSurface(inv); + let link = items[0]; + let index = 0; + let group = KDRestraint(inv).Group; + while (link) { + for (let action of Object.entries(KDAutoStruggleActions)) { + if (action[1].itemweight) { + KDAutoStruggleData.possibleActions.push({ + action: { + action: action[0], + group: group, + index: index, + id: KDAutoWaitIndexID(player, group, index, action[0]), + }, + weight: action[1].itemweight(player, link), + }); + } + } + + index += 1; + link = items[index]; + } + } + + // Now to get other actions that dont have an itemweight + for (let action of Object.entries(KDAutoStruggleActions)) { + if (action[1].playerweight) { + KDAutoStruggleData.possibleActions.push({ + action: { + action: action[0], + group: "", + index: 0, + id: KDAutoWaitIndexID(player, "", 0, action[0]), + }, + weight: action[1].playerweight(player), + }); + } + } +} + + +/** + * Updates the KDAutoStruggleData decidedAction variable + * @param player + */ +function KDAutoStruggleMakeDecision(_player: entity) { + if (KDAutoStruggleData.decidedAction && KDAutoStruggleData.currentFocusDespair < KDAutoStruggleData.currentFocusDespairTarget + && (!KDAutoStruggleData.currentFocusGroup || (KinkyDungeonGetRestraintItem(KDAutoStruggleData.currentFocusGroup, KDAutoStruggleData.currentFocusIndex)))) { + // Keep doing what you doing + } else { + let totalWeight = 0; + let currentWeights = []; + for (let action of KDAutoStruggleData.possibleActions) { + totalWeight += action.weight * (1 / (1 + 0.01 * (KDAutoStruggleData.totalDespair[action.action.id]||0))); + currentWeights.push({action: action.action, weight: totalWeight}); + } + let selection = Math.random() * totalWeight; + for (let action of currentWeights) { + if (action.weight > selection) { + KDAutoStruggleData.decidedAction = action.action.action; + KDAutoStruggleData.currentFocusGroup = action.action.group; + KDAutoStruggleData.currentFocusIndex = action.action.index; + KDAutoStruggleData.currentFocusDespair = 0; + KDAutoStruggleData.currentFocusDespairTarget = 10; + break; + } + } + } +} + +/** + * Executes the run decision + * @param player + */ +function KDAutoStruggleRunDecision(player: entity): KDAS_Result { + let result: KDAS_Result = null; + if (KDAutoStruggleActions[KDAutoStruggleData.decidedAction]) { + result = KDAutoStruggleActions[KDAutoStruggleData.decidedAction].action(player); + KDAutoStruggleData.currentFocusDespair = Math.max(0, (KDAutoStruggleData.currentFocusDespair || 0) - result.favorability); + KDAutoStruggleData.totalDespair[result.id] = Math.max(0, (KDAutoStruggleData.totalDespair[result.id] || 0) - result.favorability); + KDAutoStruggleData.overallDespair += Math.max(0, - result.favorability); + KDAutoStruggleData.lastDelay = Math.max(0, result.delay); + } else { + // Wait + KDSendInput("move", {dir: {x:0, y: 0, delta: 0}, delta: 1, AllowInteract: true, AutoDoor: false, AutoPass: KinkyDungeonToggleAutoPass, sprint: KinkyDungeonToggleAutoSprint, SuppressSprint: KinkyDungeonSuppressSprint}, false, true); + result = {action: "wait", id: "", result: "fail", favorability: -1, delay: 0}; + } + if (result) + KDAutoStruggleData.lastActionQueue.unshift(result); + + KDAutoStruggleData.lastActionQueue = KDAutoStruggleData.lastActionQueue.slice(0, 15); + + return result; +} + + + + +function KDAutoWaitIndexID(_player: entity, group: string, index: number, action: string) { + return `${group}_${KinkyDungeonGetRestraintItem(group)?.name}_${index}_${action}`; +} diff --git a/Game/src/player/KDClasses.ts b/Game/src/player/KDClasses.ts new file mode 100644 index 000000000..a32fe4488 --- /dev/null +++ b/Game/src/player/KDClasses.ts @@ -0,0 +1,114 @@ +'use strict'; + +let KDClassReqs: Record boolean> = { + "Trainee": () => {return KinkyDungeonSexyMode;} +}; + +let KDClassStart: Record void> = { + "Fighter": () => { // Fighter + KinkyDungeonInventoryAddWeapon("Shield"); + KinkyDungeonInventoryAddWeapon("Sword"); + if (!KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("Breastplate"), 0, true, "")) + KinkyDungeonInventoryAddLoose("Breastplate"); + KDGameData.PreviousWeapon = ["Sword", "Shield", "Unarmed", "Unarmed"]; + KDSetWeapon("Sword"); + KDGameData.Offhand = "Shield"; + KDPushSpell(KinkyDungeonFindSpell("BattleRhythm")); + KinkyDungeonSpellChoicesToggle.push(true); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDPushSpell(KinkyDungeonFindSpell("Offhand")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDPushSpell(KinkyDungeonFindSpell("Bondage")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDPushSpell(KinkyDungeonFindSpell("CommandWord")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDGameData.StatMaxBonus.WP += 5; + KDPushSpell(KinkyDungeonFindSpell("IronWill")); + KDPushSpell(KinkyDungeonFindSpell("FighterOffhand")); + KinkyDungeonSpellPoints = 3; + KDAddConsumable("RedKey", 1); + KDAddConsumable("Pick", 2); + KinkyDungeonGold = 100; + + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 1); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionStamina, 1); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionFrigid, 1); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, 2); + KinkyDungeonInventoryAddLoose("RopeSnakeRaw", undefined, undefined, 10); + KinkyDungeonInventoryAddLoose("TrapCuffs", undefined, undefined, 3); + }, + "Rogue": () => { // Rogue + KinkyDungeonInventoryAddWeapon("Dirk"); + KinkyDungeonInventoryAddWeapon("Bow"); + KDGameData.PreviousWeapon = ["Bow", "Dirk", "Unarmed", "Unarmed"]; + KDSetWeapon("Dirk"); + KDPushSpell(KinkyDungeonFindSpell("RogueTargets")); + KDPushSpell(KinkyDungeonFindSpell("Bondage")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDPushSpell(KinkyDungeonFindSpell("CommandWord")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDGameData.StatMaxBonus.SP += 5; + KDPushSpell(KinkyDungeonFindSpell("Sneaky")); + KinkyDungeonSpellPoints = 3; + KDAddConsumable("Pick", 3); + KinkyDungeonGold = 100; + + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 1); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionStamina, 2); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionFrigid, 1); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, 1); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); + KinkyDungeonInventoryAddLoose("RopeSnakeRaw", undefined, undefined, 10); + KinkyDungeonInventoryAddLoose("TrapGag", undefined, undefined, 3); + }, + "Mage": () => { // Mage + KinkyDungeonInventoryAddWeapon("Knife"); + KinkyDungeonInventoryAddWeapon("ArcaneTome"); + KDGameData.PreviousWeapon = ["ArcaneTome", "Knife", "Unarmed", "Unarmed"]; + KDSetWeapon("ArcaneTome"); + + KDPushSpell(KinkyDungeonFindSpell("ManaRegen")); + KDPushSpell(KinkyDungeonFindSpell("Bondage")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDPushSpell(KinkyDungeonFindSpell("CommandWord")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDPushSpell(KinkyDungeonFindSpell("Analyze")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDGameData.StatMaxBonus.MP += 5; + KinkyDungeonSpellPoints = 3; + KDAddConsumable("RedKey", 2); + KinkyDungeonGold = 100; + + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 3); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionFrigid, 1); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionWill, 1); + KinkyDungeonInventoryAddLoose("StrongMagicRopeRaw", undefined, undefined, 10); + }, + "Peasant": () => { // Peasant + KDPushSpell(KinkyDungeonFindSpell("Peasant")); + KDPushSpell(KinkyDungeonFindSpell("Bondage")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KinkyDungeonSpellPoints = 3; + KinkyDungeonInventoryAddLoose("RopeSnakeRaw", undefined, undefined, 3); + }, + "Trainee": () => { // Trainee + KDPushSpell(KinkyDungeonFindSpell("Bondage")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDPushSpell(KinkyDungeonFindSpell("DistractionCast")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KinkyDungeonSpellPoints = 3; + KinkyDungeonGold = 100; + //KDPushSpell(KinkyDungeonFindSpell("DistractionCast")); + KDGameData.StatMaxBonus.AP += 2.5; + KDGameData.StatMaxBonus.MP += 2.5; + KinkyDungeonInventoryAddWeapon("Knife"); + KDGameData.PreviousWeapon = ["Knife", "Unarmed", "Unarmed", "Unarmed"]; + KDSetWeapon("Knife"); + KinkyDungeonChangeConsumable(KinkyDungeonConsumables.PotionMana, 3); + KinkyDungeonChangeFactionRep("Apprentice", .2); + + KinkyDungeonInventoryAddLoose("WeakMagicRopeRaw", undefined, undefined, 10); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapPlug2"), 0, true, ""); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("TrapBelt"), 10, true, "Gold"); + }, +}; diff --git a/Game/src/player/KDDelayedActions.ts b/Game/src/player/KDDelayedActions.ts new file mode 100644 index 000000000..8def051b8 --- /dev/null +++ b/Game/src/player/KDDelayedActions.ts @@ -0,0 +1,101 @@ +'use strict'; + +/** + * Prunes delayed actions with tags + * @param tags + */ +function KDDelayedActionPrune(tags: string[]) { + KDGameData.DelayedActions = KDGameData.DelayedActions ? KDGameData.DelayedActions.filter((action) => { + for (let t of tags) { + if (action.tags.includes(t)) return false; + } + return true; + }) : []; + +} + +/** + * Adds a delayed action + * @param action + */ +function KDAddDelayedAction(action: KDDelayedAction) { + if (!action.maxtime) action.maxtime = action.time; + KDGameData.DelayedActions.push(Object.assign({}, action)); +} + +/** + * This is processed for delayed actions + */ +let KDDelayedActionUpdate: Record void> = { + "RequireWill": (action) => { + if (!(KinkyDungeonStatWill > 0)) action.time = 0; + }, +}; + +/** + * This is processed for delayed actions + */ +let KDDelayedActionCommit: Record void> = { + "Consumable": (action) => { + if (KinkyDungeonGetInventoryItem(action.data.Name)) + KinkyDungeonUseConsumable(action.data.Name, action.data.Quantity); + }, + "Armor": (action) => { + if (KinkyDungeonGetInventoryItem(action.data.Name)) + KinkyDungeonUseConsumable(action.data.Name, action.data.Quantity); + }, + "EquipRestraint": (action) => { + KDDoEquipDelayed(action.data, + action.data.player ? KDGetGlobalEntity(action.data.player) : KDPlayer()) + }, + "Struggle": (action) => { + /** + * Data format: + * group: string + * index: number + * amount: number + * escapeData: escape data + */ + let dynamic = KDGetDynamicItem(action.data.group, action.data.index); + let restraint = dynamic.restraint; + let host = dynamic.host; + if (restraint) { + KinkyDungeonSetFlag(action.data.escapeData.struggleType, 1); + KinkyDungeonSetFlag("escaping", 2); + let lockType = restraint.lock && KDLocks[restraint.lock] ? KDLocks[restraint.lock] : null; + let struggleType = action.data.escapeData.struggleType; + if (struggleType == "Struggle" || struggleType == "Remove" || struggleType == "Cut") { + if (struggleType == "Cut" || (struggleType == "Struggle" && KDRestraint(restraint)?.struggleBreak)) + restraint.cutProgress += action.data.amount; + else restraint.struggleProgress += action.data.amount; + let progress = (restraint.struggleProgress || 0) + (restraint.cutProgress || 0); + if (progress > 1) { + KinkyDungeonSetFlag("escaped", 2); + KDSuccessRemove(struggleType, restraint, lockType, action.data.index, action.data.escapeData, host); + } else if (action.data?.delta > 0) { + KDStunTurns(action.data?.delta, true); + } + + } else if (struggleType == "Unlock") { + KinkyDungeonSetFlag("unlocking", 2); + restraint.unlockProgress += action.data.amount; + if (restraint.unlockProgress > 1) { + KinkyDungeonSetFlag("escaped", 2); + KinkyDungeonRemoveKeysUnlock(restraint.lock); + KinkyDungeonLock(restraint, ""); + } else if (action.data?.delta > 0) { + KDStunTurns(action.data?.delta, true); + } + } else if (struggleType == "Pick") { + KinkyDungeonSetFlag("picking", 2); + restraint.pickProgress += action.data.amount; + if (restraint.pickProgress > 1) { + KinkyDungeonSetFlag("escaped", 2); + KinkyDungeonLock(restraint, ""); + } else if (action.data?.delta > 0) { + KDStunTurns(action.data?.delta, true); + } + } + } + }, +}; diff --git a/Game/src/player/KDExpressions.ts b/Game/src/player/KDExpressions.ts new file mode 100644 index 000000000..0e0304ad4 --- /dev/null +++ b/Game/src/player/KDExpressions.ts @@ -0,0 +1,993 @@ + +let KDCustomExp : Record= { +}; + +let KDExpressionPoses = [ + "EyesPose", + "Eyes2Pose", + "BrowsPose", + "Brows2Pose", + "BlushPose", + "MouthPose", + "FearPose", +]; + +let KDExpressions: Record = { + "Custom": { + priority: 10000, + criteria: (C, flags) => { + if (KDNPCChar_ID.get(C) && KDCustomExp[KDNPCChar_ID.get(C)]) { + return true; + } + return false; + }, + expression: (C, flags) => { + if (KDNPCChar_ID.get(C) && KDCustomExp[KDNPCChar_ID.get(C)]) { + return KDCustomExp[KDNPCChar_ID.get(C)]; + } + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "", + MouthPose: "", + FearPose: "", + }; + }, + }, + "RestrainedImmediate": { + priority: 7, + criteria: (C, flags) => { + if (flags.get("restrained")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "Eyes2Closed", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "BlushHigh", + MouthPose: "MouthSurprised", + }; + }, + }, + "Collared": { + priority: 9, + criteria: (C, flags) => { + if (flags.get("collared")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > -25) ? "BlushHigh" : "", + MouthPose: (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > 0) ? "MouthSmile" : "", + FearPose: (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > 25) ? "" : "FearPose", + }; + }, + }, + "Defeat": { + priority: 20, + criteria: (C, flags) => { + if (flags.get("defeat")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > -25) ? "BlushHigh" : "", + MouthPose: (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > 0) ? "MouthSmile" : "", + FearPose: (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > 25) ? "" : "FearPose", + }; + }, + }, + + "RestrainedRecent": { + priority: 1.5, + criteria: (C, flags) => { + if (flags.get("restrained_recently")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "BlushMedium", + MouthPose: "MouthPout", + }; + }, + }, + "Slimed": { + priority: 1.7, + criteria: (C, flags) => { + if (flags.get("slimed")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesDazed", + Eyes2Pose: "Eyes2Dazed", + BrowsPose: "BrowsAnnoyed", + Brows2Pose: "Brows2Annoyed", + BlushPose: "", + MouthPose: "MouthDazed", + }; + }, + }, + + "OrgAfterglow": { + priority: 10, + criteria: (C, flags) => { + if (flags.get("OrgAfterglow")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: (C == KinkyDungeonPlayer && KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax * 0.5) ? "EyesSly" : "EyesHeart", + Eyes2Pose: (C == KinkyDungeonPlayer && KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax * 0.5) ? "Eyes2Sly" : "Eyes2Heart", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "BlushHigh", + MouthPose: C == KinkyDungeonPlayer ? + (KinkyDungeonGoddessRep.Passion - KinkyDungeonGoddessRep.Frustration > 25 ? "MouthSmile" : (KinkyDungeonGoddessRep.Passion - KinkyDungeonGoddessRep.Frustration > -25 ? "MouthEmbarrassed" : "MouthPout")) + : "MouthEmbarrassed", + }; + }, + }, + "OrgSuccess": { + priority: 14, + criteria: (C, flags) => { + if (flags.get("OrgSuccess")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesHeart", + Eyes2Pose: "Eyes2Heart", + BrowsPose: "BrowsSurprised", + Brows2Pose: "Brows2Surprised", + BlushPose: "BlushExtreme", + MouthPose: "MouthDazed", + }; + }, + }, + "OrgEdged": { + priority: 8, + criteria: (C, flags) => { + if (flags.get("OrgEdged")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > 15) ? "EyesHeart" : "EyesAngry", + Eyes2Pose: (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > 15) ? "Eyes2Heart" : "Eyes2Angry", + BrowsPose: "BrowsAnnoyed", + Brows2Pose: "Brows2Annoyed", + BlushPose: "BlushExtreme", + MouthPose: "MouthDazed", + }; + }, + }, + "HeadpatSub": { + priority: 13, + criteria: (C, flags) => { + if ( + ( + ((C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > 15) + || (KDNPCChar_ID.get(C) + && KinkyDungeonFindID(KDNPCChar_ID.get(C)) + && KDLoosePersonalities.includes(KinkyDungeonFindID(KDNPCChar_ID.get(C)).personality))) + && flags.get("headpat")) + || flags.get("soft")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesClosed", + Eyes2Pose: "Eyes2Closed", + BrowsPose: "BrowsAngry", + Brows2Pose: "Brows2Angry", + BlushPose: "BlushExtreme", + MouthPose: "MouthSmile", + }; + }, + }, + "Psychic": { + priority: 3, + criteria: (C, flags) => { + if (flags.get("psychic")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesDazed", + Eyes2Pose: "Eyes2Dazed", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "", + MouthPose: "MouthDazed", + }; + }, + }, + "HeadpatDom": { + priority: 12, + criteria: (C, flags) => { + if ( + ((C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost < -30) + || (KDNPCChar_ID.get(C) + && KinkyDungeonFindID(KDNPCChar_ID.get(C)) + && KDStrictPersonalities.includes(KinkyDungeonFindID(KDNPCChar_ID.get(C)).personality))) + && flags.get("headpat")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesAngry", + Eyes2Pose: "Eyes2Angry", + BrowsPose: "BrowsAngry", + Brows2Pose: "Brows2Angry", + BlushPose: "", + MouthPose: "MouthFrown", + }; + }, + }, + "Headpat": { + priority: 12, + criteria: (C, flags) => { + if ( + ((C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost <= 15 && KinkyDungeonGoddessRep.Ghost >= -30) + || (KDNPCChar_ID.get(C) + && KinkyDungeonFindID(KDNPCChar_ID.get(C)) + && !KDStrictPersonalities.includes(KinkyDungeonFindID(KDNPCChar_ID.get(C)).personality))) + && flags.get("headpat") ) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "Eyes2Closed", + BrowsPose: "", + Brows2Pose: "Brows2Angry", + BlushPose: "BlushHigh", + MouthPose: "MouthPout", + }; + }, + }, + "Spank": { + priority: 14, + criteria: (C, flags) => { + if (flags.get("spank")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesSurprised", + Eyes2Pose: "Eyes2Surprised", + BrowsPose: "BrowsSurprised", + Brows2Pose: "Brows2Surprised", + BlushPose: "", + MouthPose: "MouthSurprised", + }; + }, + }, + "Grope": { + priority: 4, + criteria: (C, flags) => { + if (flags.get("grope")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesSurprised", + Eyes2Pose: "Eyes2Closed", + BrowsPose: "BrowsSurprised", + Brows2Pose: "Brows2Surprised", + BlushPose: "BlushMedium", + MouthPose: "", + }; + }, + }, + "Insert": { + priority: 17, + criteria: (C, flags) => { + if (flags.get("insert")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesSurprised", + Eyes2Pose: "Eyes2Surprised", + BrowsPose: "", + Brows2Pose: "Brows2Surprised", + BlushPose: "BlushExtreme", + MouthPose: "MouthEmbarrassed", + }; + }, + }, + "Stuffed": { + priority: 10, + criteria: (C, flags) => { + if (flags.get("stuff")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesClosed", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "Brows2Surprised", + BlushPose: "BlushHigh", + MouthPose: "MouthSurprised", + }; + }, + }, + "Tickle": { + priority: 9, + criteria: (C, flags) => { + if (flags.get("tickle")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesClosed", + Eyes2Pose: "Eyes2Surprised", + BrowsPose: "BrowsAnnoyed", + Brows2Pose: "Brows2Surprised", + BlushPose: "", + MouthPose: "MouthEmbarrassed", + }; + }, + }, + "Pain": { + priority: 4, + criteria: (C, flags) => { + if (flags.get("pain")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesAngry", + Eyes2Pose: "Eyes2Angry", + BrowsPose: "BrowsAnnoyed", + Brows2Pose: "Brows2Annoyed", + BlushPose: "", + MouthPose: "MouthDazed", + }; + }, + }, + + + "OrgDenied": { + priority: 8, + criteria: (C, flags) => { + if (flags.get("OrgDenied")) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesDazed", + Eyes2Pose: "Eyes2Closed", + BrowsPose: "BrowsAngry", + Brows2Pose: "Brows2Angry", + BlushPose: "BlushExtreme", + MouthPose: "MouthEmbarrassed", + }; + }, + }, + "DenialPassion": { + priority: 9, + criteria: (C, flags) => { + if ((flags.get("OrgDenied") || flags.get("OrgEdged")) && + (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Passion > 10)) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesSurprised", + Eyes2Pose: "Eyes2Closed", + BrowsPose: "BrowsSad", + Brows2Pose: "Brows2Sad", + BlushPose: "BlushExtreme", + MouthPose: KinkyDungeonGoddessRep.Ghost > 0 ? "MouthSmile" : "MouthEmbarrassed", + }; + }, + }, + "PlayWithSelf": { + priority: 12, + criteria: (C, flags) => { + if ((flags.get("PlayWithSelf"))) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: flags.get("VibeContinued") ? "EyesDazed" : "EyesSly", + Eyes2Pose: (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > 15) ? "Eyes2Sly" : "Eyes2Closed", + BrowsPose: "BrowsNeutral", + Brows2Pose: "Brows2Neutral", + BlushPose: "BlushHigh", + MouthPose: KinkyDungeonGoddessRep.Ghost > 0 ? "MouthSmile" : "MouthPout", + }; + }, + }, + "VibeStart": { + priority: 6, + criteria: (C, flags) => { + if ((flags.get("VibeStarted") || flags.get("VibeContinued"))) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: flags.get("VibeContinued") ? + ((C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > 15) ? "EyesSly" : "EyesDazed") : "EyesNeutral", + Eyes2Pose: "Eyes2Closed", + BrowsPose: "BrowsSad", + Brows2Pose: "Brows2Sad", + BlushPose: "BlushHigh", + MouthPose: "MouthDazed", + }; + }, + }, + "Grabbed": { + priority: 27, + criteria: (C, flags) => { + let entity = KDGetCharacterEntity(C); + if (entity && !entity.player) return KinkyDungeonIsDisabled(entity); + if ((flags.get("grabbed"))) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesSurprised", + Eyes2Pose: "Eyes2Surprised", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "", + MouthPose: "", + }; + }, + }, + "Vibing": { + stackable: true, + priority: 2, + criteria: (C, flags) => { + let entity = KDGetCharacterEntity(C); + if (entity && !entity.player) return KDEntityBuffedStat(entity, "Vibration") > 0; + if (C == KinkyDungeonPlayer && KinkyDungeonVibeLevel > 0) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.5) ? "EyesAngry" : "", + Eyes2Pose: (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.5) ? "Eyes2Angry" : "", + BrowsPose: "BrowsNeutral", + Brows2Pose: "Brows2Neutral", + BlushPose: (KinkyDungeonVibeLevel > 2 || KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.5) ? "BlushMedium" : "BlushHigh", + MouthPose: "MouthDazed", + }; + }, + }, + "Distracted": { + stackable: true, + priority: 1, + criteria: (C, flags) => { + if (flags.get("blush")) return true; + let entity = KDGetCharacterEntity(C); + if (entity && !entity.player) return entity.distraction > 0.0 * entity.Enemy.maxhp && entity.distraction < 0.9 * entity.Enemy.maxhp; + if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.1) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax*0.4) ? "BlushLow" : "BlushMedium", + MouthPose: "", + }; + }, + }, + "Tired": { + stackable: true, + priority: 1, + criteria: (C, flags) => { + let entity = KDGetCharacterEntity(C); + if (entity && !entity.player) return entity.hp > 0.5 * entity.Enemy.maxhp; + if (KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax * 0.5) { + return true; + } + return false; + }, + expression: (C, flags) => { + return { + EyesPose: (C == KinkyDungeonPlayer && KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax * 0.25) ? "EyesClosed" : "EyesDazed", + Eyes2Pose: (C == KinkyDungeonPlayer && KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax * 0.25) ? "Eyes2Closed" : "Eyes2Dazed", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "", + MouthPose: "", + }; + }, + }, + "Edged": { + stackable: true, + priority: 6, + criteria: (C, flags) => { + let entity = KDGetCharacterEntity(C); + if (entity && !entity.player) return entity.distraction > 0.9 * entity.Enemy.maxhp; + return (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Frustration > 0 && KDIsEdged(C)); + }, + expression: (C, flags) => { + return { + EyesPose: (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > 15) ? "EyesSly" : "EyesDazed", + Eyes2Pose: (C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Ghost > 15) ? "Eyes2Sly" : "Eyes2Dazed", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "", + MouthPose: "", + }; + }, + }, + "Tormented": { + stackable: true, + priority: 7, + criteria: (C, flags) => { + return (C == KinkyDungeonPlayer && KDIsEdged(C) && KinkyDungeonVibeLevel > 2); + }, + expression: (C, flags) => { + return { + EyesPose: "EyesDazed", + Eyes2Pose: "Eyes2Dazed", + BrowsPose: "BrowsSad", + Brows2Pose: "Brows2Sad", + BlushPose: "BlushExtreme", + MouthPose: "", + }; + }, + }, + "Frustrated": { + stackable: true, + priority: 2.25, + criteria: (C, flags) => { + return C == KinkyDungeonPlayer && (KinkyDungeonGoddessRep.Frustration > -20 && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.25) || flags.get("escapeimpossible") > 0; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: KinkyDungeonGoddessRep.Frustration > 0 ? "BrowsAngry" : "BrowsSad", + Brows2Pose: KinkyDungeonGoddessRep.Frustration > 0 ? "Brows2Angry" : "Brows2Sad", + BlushPose: "", + MouthPose: "", + }; + }, + }, + "Struggling": { + stackable: true, + priority: 14, + criteria: (C, flags) => { + let entity = KDGetCharacterEntity(C); + if (entity && !entity.player) return KDBoundEffects(entity) > 0; + return flags.get("escaping") > 0; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "Eyes2Closed", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "BlushHigh", + MouthPose: "MouthPout", + }; + }, + }, + "StrugglingLight": { + stackable: true, + priority: 6, + criteria: (C, flags) => { + let entity = KDGetCharacterEntity(C); + if (entity && !entity.player) return entity.boundLevel > 0 && KDBoundEffects(entity) < 1; + return flags.get("tryescaping") > 0; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "Eyes2Closed", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "", + MouthPose: "MouthPout", + }; + }, + }, + "Picking": { + stackable: true, + priority: 13, + criteria: (C, flags) => { + return flags.get("picking") > 0; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesClosed", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "", + MouthPose: "MouthPout", + }; + }, + }, + "Unlocking": { + stackable: true, + priority: 12, + criteria: (C, flags) => { + return flags.get("unlocking") > 0; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesClosed", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "", + MouthPose: "MouthEmbarrassed", + }; + }, + }, + "Escaped": { + stackable: true, + priority: 20, + criteria: (C, flags) => { + return flags.get("escaped") > 0; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesNeutral", + Eyes2Pose: "Eyes2Neutral", + BrowsPose: "BrowsAngry", + Brows2Pose: "Brows2Angry", + BlushPose: "", + MouthPose: "MouthSmile", + }; + }, + }, + "FrustratedMouth": { + stackable: true, + priority: 0.25, + criteria: (C, flags) => { + return C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Frustration - KinkyDungeonGoddessRep.Passion > -25 && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.25; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "", + MouthPose: "MouthFrown", + }; + }, + }, + "Passionate": { + stackable: true, + priority: 2.2, + criteria: (C, flags) => { + return C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Passion - KinkyDungeonGoddessRep.Frustration > -5 && KinkyDungeonGoddessRep.Passion > -30 && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.25; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "", + MouthPose: KinkyDungeonGoddessRep.Passion - KinkyDungeonGoddessRep.Frustration > 25 ? "MouthSmile" : (KinkyDungeonGoddessRep.Passion - KinkyDungeonGoddessRep.Frustration > -25 ? "MouthEmbarrassed" : "MouthPout"), + }; + }, + }, + + + "PassionateBlush1": { + stackable: true, + priority: 2.3, + criteria: (C, flags) => { + return C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Passion > -40 && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.25; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "BlushLow", + MouthPose: "", + }; + }, + }, + "PassionateBlush2": { + stackable: true, + priority: 4, + criteria: (C, flags) => { + return C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Passion > -10 && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.5; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "BlushMedium", + MouthPose: "", + }; + }, + }, + "PassionateBlush3": { + stackable: true, + priority: 7, + criteria: (C, flags) => { + return C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Passion > 20 && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.75; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "BlushHigh", + MouthPose: "MouthDistracted", + }; + }, + }, + "PassionateBlush4": { + stackable: true, + priority: 10, + criteria: (C, flags) => { + return C == KinkyDungeonPlayer && KinkyDungeonGoddessRep.Passion > 40 && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.5; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "BlushExtreme", + MouthPose: "MouthDistracted", + }; + }, + }, + "Angis": { + stackable: true, + priority: 0.2, + criteria: (C, flags) => { + if (C != KinkyDungeonPlayer) { + let id = KDNPCChar_ID.get(C); + if (id) { + let opinion = KDGetModifiedOpinionID(id); + if (opinion >= -45 && opinion < -15) + return true; + } + } + return (KDGameData.PrisonerState == "jail" || KDGameData.PrisonerState == "parole") + && KinkyDungeonGoddessRep.Ghost >= -45 && KinkyDungeonGoddessRep.Ghost < -25; + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "BrowsAngry", + Brows2Pose: "Brows2Angry", + BlushPose: "", + MouthPose: "MouthFrown", + FearPose: "", + }; + }, + }, + "VAngis": { + stackable: true, + priority: 0.2, + criteria: (C, flags) => { + if (C != KinkyDungeonPlayer) { + let id = KDNPCChar_ID.get(C); + if (id) { + let opinion = KDGetModifiedOpinionID(id); + if (opinion < -45) + return true; + } + } + return (KDGameData.PrisonerState == "jail" || KDGameData.PrisonerState == "parole") + && KinkyDungeonGoddessRep.Ghost < -45; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesAngry", + Eyes2Pose: "Eyes2Angry", + BrowsPose: "BrowsAngry", + Brows2Pose: "Brows2Angry", + BlushPose: "BlushLow", + MouthPose: "MouthDazed", + FearPose: "", + }; + }, + }, + "Embar": { + stackable: true, + priority: 0.2, + criteria: (C, flags) => { + if (C != KinkyDungeonPlayer) { + let id = KDNPCChar_ID.get(C); + if (id) { + let opinion = KDGetModifiedOpinionID(id); + if (opinion >= -15 && opinion <= 15) + return true; + } + } + return (KDGameData.PrisonerState == "jail" || KDGameData.PrisonerState == "parole" + || KinkyDungeonFlags.get("embarrassed") + ) + && ((KinkyDungeonGoddessRep.Ghost >= -25 && KinkyDungeonGoddessRep.Ghost < 25) + || !KinkyDungeonHasWill(0.1)); + }, + expression: (C, flags) => { + return { + EyesPose: "", + Eyes2Pose: "", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "BlushMedium", + MouthPose: "MouthEmbarrassed", + FearPose: "", + }; + }, + }, + "Frust": { + stackable: true, + priority: 0.2, + criteria: (C, flags) => { + if (C != KinkyDungeonPlayer) { + let id = KDNPCChar_ID.get(C); + if (id) { + let opinion = KDGetModifiedOpinionID(id); + if (opinion >= -15 && opinion <= 15) + return true; + } + } + return (KinkyDungeonFlags.get("embarrassed") + ) + && (KinkyDungeonGoddessRep.Ghost < -25 + && KinkyDungeonHasWill(0.1)); + }, + expression: (C, flags) => { + return { + EyesPose: "EyesSly", + Eyes2Pose: "Eyes2Sly", + BrowsPose: "BrowsAngry", + Brows2Pose: "Brows2Angry", + BlushPose: "BlushMedium", + MouthPose: "", + FearPose: "", + }; + }, + }, + "Happy": { + stackable: true, + priority: 0.2, + criteria: (C, flags) => { + if (C != KinkyDungeonPlayer) { + let id = KDNPCChar_ID.get(C); + if (id) { + let opinion = KDGetModifiedOpinionID(id); + if (opinion > 15) + return true; + } + } + return (KDGameData.PrisonerState == "jail" || KDGameData.PrisonerState == "parole") + && KinkyDungeonGoddessRep.Ghost > 25; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesNeutral", + Eyes2Pose: "Eyes2Neutral", + BrowsPose: "BrowsNeutral", + Brows2Pose: "Brows2Neutral", + BlushPose: "", + MouthPose: "MouthSmile", + FearPose: "", + }; + }, + }, + "Neutral": { + stackable: true, + priority: 0.1, + criteria: (C, flags) => { + return true; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesNeutral", + Eyes2Pose: "Eyes2Neutral", + BrowsPose: "BrowsNeutral", + Brows2Pose: "Brows2Neutral", + BlushPose: "BlushNone", + MouthPose: "MouthNeutral", + FearPose: "NoFearPose", + }; + }, + }, + "Sleepy": { + stackable: true, + priority: 11, + criteria: (C, flags) => { + return C == KinkyDungeonPlayer && KinkyDungeonSleepiness > 3.99; + }, + expression: (C, flags) => { + return { + EyesPose: "EyesClosed", + Eyes2Pose: "Eyes2Closed", + BrowsPose: "", + Brows2Pose: "", + BlushPose: "", + MouthPose: "", + }; + }, + }, +}; \ No newline at end of file diff --git a/Game/src/player/KDTraining.ts b/Game/src/player/KDTraining.ts new file mode 100644 index 000000000..6e54494d1 --- /dev/null +++ b/Game/src/player/KDTraining.ts @@ -0,0 +1,88 @@ +'use strict'; + +let KDTrainingTypes = [ + "Heels", +]; + +function KDGetHeelTraining(): number { + if (!KDGameData.Training) KDGameData.Training = {}; + return (KDGameData.Training?.Heels?.training_stage || 0) + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "HeelTraining"); +} + +function KDTrip(delta: number) { + KinkyDungeonSendTextMessage(10, TextGet("KDTrip"), "#ff5277", 5); + KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns + delta, delta + KDTripDuration()); + KDGameData.Balance = KDGetRecoverBalance(); + KinkyDungeonMakeNoise(4, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); +} + +function KDGetRecoverBalance(): number { + return (0.1 + 0.4 * KinkyDungeonStatStamina/KinkyDungeonStatStaminaMax) * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "TripBalanceRecovery")); +} + +function KDGetBalanceRate(): number { + return (0.15 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "RegenBalance")) * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "RegenBalanceMult")); +} +function KDTripDuration(): number { + let mult = 4 / (4 + KDGetHeelTraining()); + return Math.max(2, Math.round(5 * mult)); +} + +function KDGetBalanceCost(): number { + let mult = 1;//KinkyDungeonStatsChoice.has("HeelWalker") ? 0.5 : 1; + if (KinkyDungeonStatsChoice.get("PoorBalance")) mult *= 1.7; + if (!KinkyDungeonIsArmsBound()) mult *= 0.5; + + let training = KDGetHeelTraining(); + return KDGameData.HeelPower * (0.01*mult*5/(5+training) - (0.001)); +} + +/** + * Goes thru all training categories and advances them by an amount, and resets the turns + */ +function KDAdvanceTraining(): void { + if (!KDGameData.Training) KDGameData.Training = {}; + for (let entry of Object.entries(KDGameData.Training)) { + //let training = entry[0]; + let data = entry[1]; + if (data.turns_total == 0) continue; // No advance + let trainingPercentage = Math.min(1, data.turns_total/KDTrainingSoftScale) + * (Math.max(0, data.turns_trained * 1.11 - data.turns_skipped)/data.turns_total); + if (KinkyDungeonStatsChoice.get("Mastery" + entry[0])) trainingPercentage *= 0.4; + data.training_points += 1 * trainingPercentage; + data.turns_total = 0; + data.turns_skipped = 0; + data.turns_trained = 0; + + while (data.training_points > data.training_stage + 1) { + data.training_stage += 1; + data.training_points -= data.training_stage; + } + } +} + +/** + * @param Name + * @param trained + * @param skipped + * @param total + * @param bonus - Multiplier for turns trained or skipped + */ +function KDTickTraining(Name: string, trained: boolean, skipped: boolean, total: number, bonus: number = 1): void { + if (!KDGameData.Training) KDGameData.Training = {}; + if (!KDGameData.Training[Name]) { + KDGameData.Training[Name] = { + training_points: 0, + training_stage: 0, + turns_skipped: 0, + turns_total: 0, + turns_trained: 0, + }; + } + KDGameData.Training[Name].turns_trained += trained ? total * bonus : 0; + KDGameData.Training[Name].turns_skipped += skipped ? total * bonus : 0; + KDGameData.Training[Name].turns_total += total; +} + +/** This many training turns are requred, any less is scaled down by this amount */ +let KDTrainingSoftScale = 10; diff --git a/Game/src/player/KDWardrobe.ts b/Game/src/player/KDWardrobe.ts new file mode 100644 index 000000000..f10c3f5a4 --- /dev/null +++ b/Game/src/player/KDWardrobe.ts @@ -0,0 +1,2554 @@ +'use strict'; + + +let KDConfirmType = ""; +let KinkyDungeonReplaceConfirm = 0; + +let KDCanRevertFlag = false; + +let ColorPickerFilterCode = ""; +let ColorPickerFilter = new PIXI.filters.AdjustmentFilter({ + brightness: 1, + saturation: 1, + gamma: 1, + alpha: 1, + red: 1, + blue: 1, + green: 1, + contrast: 1, +}); + +let KDCurrentColorFilterCode = {}; +let KDCurrentColorFilter = {}; + +let KDCurrentOutfit = 0; +let KDMaxOutfits = 99; +let KDMaxOutfitsDisplay = 10; +let KDMaxOutfitsIndex = 0; +let KDOutfitInfo = []; +let KDOutfitStore = {}; +let KDOutfitOriginalStore = {}; + +let lastFilterUpdate = 0; +let FilterUpdateInterval = 90; + +let KDModelListMax = 14; +let KDModelListViewSkip = 7; + +let KDShowCharacterPalette = false; + + +let KDModelList_Categories_index = 0; +let KDModelList_Categories_viewindex = {index: 0}; +let KDModelList_Categories = []; +let KDModelList_Toplevel_index = 0; +let KDModelList_Toplevel_viewindex = {index: 0}; +let KDModelList_Toplevel = []; +let KDModelList_Sublevel_index = 0; +let KDModelList_Sublevel_viewindex = {index: 0}; +let KDModelList_Sublevel = []; + +let KDModelListFilter = ""; + +let KDRefreshProps = false; + +let KDCategoryFilterSpecial: Record boolean> = { + Worn: (C: Character, m: Model, stage: number) => { + return !!KDCurrentModels.get(C)?.Models?.get(m.Name) && ( + m.TopLevel || stage > 1 + ); + } +} + +let KDWardrobeCategories = [ + "Worn", + "Hairstyles", + "Cosplay", + "Face", + "Eyes", + "Mouth", + "Uniforms", + "Suits", + "Armor", + "Bodysuits", + "Bras", + "Underwear", + "Socks", + "Shoes", + "Tops", + "Gloves", + "Sleeves", + "Corsets", + "Skirts", + "Pants", + "Accessories", + "Hats", + "FashionRestraints", + "Toys", + "Body", + "Weapon", +]; + +if (TestMode) KDWardrobeCategories.push("Restraints"); + +let KDSelectedModel: Model = null; +let KDColorSliders: LayerFilter = { + gamma: 1, + saturation: 1, + contrast: 1, + brightness: 1, + red: 1, + green: 1, + blue: 1, + alpha: 1, +}; +let KDProps: LayerPropertiesType = { +}; +let KDColorSliderColor = { + red: "#ff5277", + green: "#55ff55", + blue: "#5555ff", +}; +let KDCurrentLayer = ""; +let KDCurrentLayerOrig = ""; + +let KDSavedColorCount = 18; +let KDSavedColorPerRow = 9; +let KDSavedColors = [ + +]; +if (localStorage.getItem("kdcolorfilters")) KDSavedColors = JSON.parse(localStorage.getItem("kdcolorfilters")); +for (let i = 0; i < KDSavedColorCount; i++) { + KDSavedColors.push(Object.assign({}, KDColorSliders)); +} + +//KDTextField("MapTileSkin", 1000 - 400 - 100, 150, 200, 60,); + +let KDWardrobe_PoseArms = ["Free", "Crossed", "Front", "Yoked", "Boxtie", "Wristtie", "Up"]; +let KDWardrobe_PoseLegs = ["Spread", "Closed", "Kneel", "KneelClosed", "Hogtie",]; +let KDWardrobe_PoseEyes = EYEPOSES; +let KDWardrobe_PoseEyes2 = EYE2POSES; +let KDWardrobe_PoseBrows = BROWPOSES; +let KDWardrobe_PoseBrows2 = BROW2POSES; +let KDWardrobe_PoseMouth = MOUTHPOSES; +let KDWardrobe_PoseBlush = ["BlushNeutral", ...BLUSHPOSES]; +let KDWardrobe_PoseFear = FEARPOSES; + +interface NPCPoseStruct { + CurrentPoseArms?: string, + CurrentPoseLegs?: string, + CurrentPoseEyes?: string, + CurrentPoseBrows?: string, + CurrentPoseBlush?: string, + CurrentPoseMouth?: string, + CurrentPoseEyes2?: string, + CurrentPoseBrows2?: string, + CurrentPoseFear?: string, +} + +let KDNPCPoses: Map = new Map(); +let NPCDesiredPoses: Map = new Map(); + +/* +KDNPCPoses.set(KinkyDungeonPlayer, { + +}); + +KDNPCPoses.get(KinkyDungeonPlayer).CurrentPoseArms = KDWardrobe_PoseArms[0]; +KDNPCPoses.get(KinkyDungeonPlayer).CurrentPoseLegs = KDWardrobe_PoseLegs[0]; +KDNPCPoses.get(KinkyDungeonPlayer).CurrentPoseEyes = KDWardrobe_PoseEyes[0]; +KDNPCPoses.get(KinkyDungeonPlayer).CurrentPoseEyes2 = KDWardrobe_PoseEyes2[0]; +KDNPCPoses.get(KinkyDungeonPlayer).CurrentPoseBrows = KDWardrobe_PoseBrows[0]; +KDNPCPoses.get(KinkyDungeonPlayer).CurrentPoseBrows2 = KDWardrobe_PoseBrows2[0]; +KDNPCPoses.get(KinkyDungeonPlayer).CurrentPoseMouth = KDWardrobe_PoseMouth[0]; +KDNPCPoses.get(KinkyDungeonPlayer).CurrentPoseBlush = KDWardrobe_PoseBlush[0];*/ + +function KDInitCurrentPose(blank?: boolean, C?: Character) { + if (!C) C = KinkyDungeonPlayer; + if (KDNPCPoses.has(C)) + KDNPCPoses.delete(C); + KDNPCPoses.set(C, { + + }); + + + KDNPCPoses.get(C).CurrentPoseArms = blank ? "" : KDWardrobe_PoseArms[0]; + KDNPCPoses.get(C).CurrentPoseLegs = blank ? "" : KDWardrobe_PoseLegs[0]; + KDNPCPoses.get(C).CurrentPoseEyes = blank ? "" : KDWardrobe_PoseEyes[0]; + KDNPCPoses.get(C).CurrentPoseEyes2 = blank ? "" : KDWardrobe_PoseEyes2[0]; + KDNPCPoses.get(C).CurrentPoseBrows = blank ? "" : KDWardrobe_PoseBrows[0]; + KDNPCPoses.get(C).CurrentPoseBrows2 = blank ? "" : KDWardrobe_PoseBrows2[0]; + KDNPCPoses.get(C).CurrentPoseMouth = blank ? "" : KDWardrobe_PoseMouth[0]; + KDNPCPoses.get(C).CurrentPoseBlush = blank ? "" : KDWardrobe_PoseBlush[0]; + KDNPCPoses.get(C).CurrentPoseFear = blank ? "" : KDWardrobe_PoseFear[0]; +} + + +function KDDrawSavedColors(X: number, y: number, max: number, C: Character): void { + let spacing = 100; + let vspacing = 120; + let filters = (KDSelectedModel?.Filters ? KDSelectedModel.Filters[KDCurrentLayer] : undefined) || KDColorSliders; + + + for (let ii = 0; ii < max && ii < KDSavedColors.length; ii++) { + let i = ii; + let Y = y; + while (i >= KDSavedColorPerRow) { + i -= KDSavedColorPerRow; + Y += vspacing; + } + if (KDSavedColors[ii]) { + if (KDCurrentColorFilterCode[ii] != JSON.stringify(KDSavedColors[ii])) { + KDCurrentColorFilterCode[ii] = JSON.stringify(KDSavedColors[ii]); + if (KDCurrentColorFilter[ii]) + KDCurrentColorFilter[ii].destroy(); + KDCurrentColorFilter[ii] = new PIXI.filters.AdjustmentFilter(KDSavedColors[ii]); + } + } else if (KDCurrentColorFilterCode[ii] != undefined) { + KDCurrentColorFilterCode[ii] = undefined; + if (KDCurrentColorFilter[ii]) + KDCurrentColorFilter[ii].destroy(); + KDCurrentColorFilter[ii] = new PIXI.filters.AdjustmentFilter({ + brightness: 1, + saturation: 1, + gamma: 1, + alpha: 1, + red: 1, + blue: 1, + green: 1, + contrast: 1, + }); + } + if (!KDCurrentColorFilter[ii]) KDCurrentColorFilter[ii] = new PIXI.filters.AdjustmentFilter({ + brightness: 1, + saturation: 1, + gamma: 1, + alpha: 1, + red: 1, + blue: 1, + green: 1, + contrast: 1, + }); + + KDDraw(kdcanvas, kdpixisprites, "SavedColor" + ii, KinkyDungeonRootDirectory + "UI/greyColor.png", X + spacing * i, Y, 64, 64, undefined, { + filters: [ + KDCurrentColorFilter[ii], + ] + }); + DrawButtonKDEx("SavedColorCopy" + ii, (_bdata) => { + if (filters && KDSelectedModel) { + KDSavedColors[ii] = Object.assign({}, filters); + localStorage.setItem("kdcolorfilters", JSON.stringify(KDSavedColors)); + } + return true; + }, true, X + spacing * i + 32 - 48, Y + 64, 48, 48, "", "#ffffff", KinkyDungeonRootDirectory + "UI/savedColor_copy.png", undefined, false, true); + DrawButtonKDEx("SavedColorPaste" + ii, (_bdata) => { + if (filters && KDSelectedModel) { + Object.assign(filters, KDSavedColors[ii]); + KDChangeWardrobe(C); + if (!KDSelectedModel.Filters) KDSelectedModel.Filters = {}; + KDSelectedModel.Filters[KDCurrentLayer] = Object.assign({}, filters); + KDCurrentModels.get(C).Models.set(KDSelectedModel.Name, JSON.parse(JSON.stringify(KDSelectedModel))); + } + return true; + }, true, X + spacing * i + 32 + 0, Y + 64, 48, 48, "", "#ffffff", KinkyDungeonRootDirectory + "UI/savedColor_paste.png", undefined, false, true); + } +} + +let KDPropsSlider = false; + +/** + * @param X + * @param Y + * @param C + * @param Model + */ +function KDDrawColorSliders(X: number, Y: number, C: Character, Model: Model): void { + DrawTextFitKD(TextGet("KDFilters"), X - 5 - 245 + 300, 25, 500, "#ffffff", KDTextGray0, undefined, "center"); + + DrawBoxKD(X, 50, 310, 600, KDButtonColor, true, 0.5, -10); + DrawBoxKD(X - 5 - 245, 5, 600, 700, KDButtonColor, false, 0.5, -10); + DrawTextFitKD(TextGet("KDLayers"), X - 120, 80, 300, "#ffffff", KDTextGray0, 22, "center"); + + let YY = Y; + let width = 300; + let layers = KDGetColorableLayers(Model, KDPropsSlider); + if (!KDCurrentLayer) { + KDCurrentLayer = layers[0].name || ""; + KDCurrentLayerOrig = layers[0].layer || ""; + } + + if (KDPropsSlider) { + let Properties = (Model.Properties ? Model.Properties[KDCurrentLayer] : undefined) || KDProps; + + DrawButtonKDEx("ResetCurrentLayer", (_bdata) => { + if (Model.Properties && Model.Properties[KDCurrentLayer]) { + KDChangeWardrobe(C); + delete Model.Properties[KDCurrentLayer]; + KDCurrentModels.get(C).Models.set(Model.Name, Model); + } + KDRefreshProps = true; + lastGlobalRefresh = CommonTime() - GlobalRefreshInterval + 10; + ForceRefreshModels(C); + return true; + }, true, X + width/2 + 10, YY, width/2 - 10, 30, TextGet("KDResetLayerProps"), "#ffffff"); + + + if (!KDClipboardDisabled) { + if (TestMode) + DrawButtonKDEx("ExportAllProps", (_bdata) => { + if (Model.Properties) { + navigator.clipboard.writeText(JSON.stringify(Model.Properties)); + } + return true; + }, true, X + width/2 + 10, YY - 40, width/2 - 10, 30, TextGet("KDExportAllProps"), "#88ff88"); + + DrawButtonKDEx("KDCopyProps", (_bdata) => { + navigator.clipboard.writeText(JSON.stringify(Properties)); + return true; + }, true, X, YY, width/2 - 10, 30, TextGet("KDCopyLayer"), "#ffffff"); + DrawButtonKDEx("KDPasteProps", (_bdata) => { + navigator.clipboard.readText() + .then(text => { + let parsed: LayerPropertiesType = JSON.parse(text); + if (parsed) { + console.log(Object.assign({}, parsed)); + KDChangeWardrobe(C); + if (!Model.Properties) Model.Properties = {}; + Model.Properties[KDCurrentLayer] = Object.assign({}, parsed); + KDCurrentModels.get(C).Models.set(Model.Name, JSON.parse(JSON.stringify(Model))); + KDRefreshProps = true; + lastGlobalRefresh = CommonTime() - GlobalRefreshInterval + 10; + ForceRefreshModels(C); + } + }); + return true; + }, true, X, YY - 40, width/2 - 10, 30, TextGet("KDPasteLayer"), "#ffffff"); + } else { + let CF = KDTextField("KDCopyProperties", X, YY - 50, + width, 30, undefined, undefined, "300", 12); + if (CF.Created) { + CF.Element.oninput = (_event: any) => { + let value = ElementValue("KDCopyProperties"); + try { + let parsed = JSON.parse(value); + if (value) { + KDChangeWardrobe(C); + if (!Model.Properties) Model.Filters = {}; + if (!Model.Properties[KDCurrentLayer]) + Model.Properties[KDCurrentLayer] = Object.assign({}, KDProps); + Model.Properties[KDCurrentLayer].LayerBonus = parsed.LayerBonus; + Model.Properties[KDCurrentLayer].Rotation = parsed.Rotation; + Model.Properties[KDCurrentLayer].XOffset = parsed.XOffset; + Model.Properties[KDCurrentLayer].YOffset = parsed.YOffset; + Model.Properties[KDCurrentLayer].XPivot = parsed.XPivot; + Model.Properties[KDCurrentLayer].YPivot = parsed.YPivot; + Model.Properties[KDCurrentLayer].XScale = parsed.XScale; + Model.Properties[KDCurrentLayer].Protected = parsed.Protected; + Model.Properties[KDCurrentLayer].NoOverride = parsed.NoOverride; + Model.Properties[KDCurrentLayer].HideOverridden = parsed.HideOverridden; + Model.Properties[KDCurrentLayer].YScale = parsed.YScale; + KDCurrentModels.get(C).Models.set(Model.Name, JSON.parse(JSON.stringify(Model))); + KDRefreshProps = true; + } + } catch (err) { + console.log("Invalid Properties"); + } + + }; + } + } + YY += 60; + + /** Property fields */ + let fields: Record = KDGetLayerPropFields(); + + let XXOff = 0; + let dXXOff = width/2; + + if (KDRefreshProps) { + KDRefreshProps = false; + YY += 400; + } else { + let YYold = YY; + YY -= 24; + let start = true; + let lastlong = false; + for (let field0 of Object.entries(fields)) { + + let field = field0[0]; + let deff = field0[1]; + let long = deff.includes(','); + + if (!start) { + if (!long && !lastlong && XXOff < dXXOff) XXOff += dXXOff; + else { + XXOff = 0; + YY += 30; + } + } else { + start = false; + } + + + + DrawTextFitKD(TextGet("KDPropField_" + field), + X + (long ? width/2 : width/4) + 10 + XXOff, + YY + 10, long ? width : width/2, "#ffffff", "#000000", 20); + + + let FF = KDTextField("KDPropField" + field, X + XXOff, YY, + long ? width : width/2, 20, + undefined, undefined, "100", 18); + if (FF.Created) { + if (Model.Properties && Model.Properties[KDCurrentLayer]) + ElementValue("KDPropField" + field, Model.Properties[KDCurrentLayer][field]); + else + ElementValue("KDPropField" + field, "" + deff); + FF.Element.oninput = (_event: any) => { + let value = ElementValue("KDPropField" + field); + try { + let parsed: string | string[] | number = value; + if (deff == "") { + // Nothing! + parsed = ""; + } else if (deff.includes(',')) { + parsed = parsed.split(',').filter((str) => { + return str != ""; + }); + } else parsed = parseFloat(value) || parseFloat(value + "0") || value; + if (value || value === "") { + KDChangeWardrobe(C); + if (!Model.Properties) Model.Properties = {}; + if (!Model.Properties[KDCurrentLayer]) + Model.Properties[KDCurrentLayer] = Object.assign({}, KDProps); + Model.Properties[KDCurrentLayer][field] = parsed; + KDCurrentModels.get(C).Models.set(Model.Name, JSON.parse(JSON.stringify(Model))); + lastGlobalRefresh = CommonTime() - GlobalRefreshInterval + 10; + ForceRefreshModels(C); + } + } catch (err) { + console.log("Must be a float"); + } + }; + } + + + if (long) lastlong = true; + else lastlong = false; + + //YY += 30; + } + YY = YYold + 400; + } + YY += 70; + + } else { + let filters = (Model.Filters ? Model.Filters[KDCurrentLayer] : undefined) || KDColorSliders; + + DrawButtonKDEx("ResetCurrentLayer", (_bdata) => { + if (Model.Filters && Model.Filters[KDCurrentLayer]) { + KDChangeWardrobe(C); + delete Model.Filters[KDCurrentLayer]; + KDCurrentModels.get(C).Models.set(Model.Name, Model); + } + // Set the rgb value to empty when color is reset + ElementValue("KDSelectedColor", ""); + KDRefreshProps = true; + lastGlobalRefresh = CommonTime() - GlobalRefreshInterval + 10; + ForceRefreshModels(C); + return true; + }, true, X + width/2 + 10, YY, width/2 - 10, 30, TextGet("KDResetLayer"), "#ffffff"); + + + + if (!KDClipboardDisabled) { + if (TestMode) + DrawButtonKDEx("ExportAllLayers", (_bdata) => { + if (Model.Filters) { + navigator.clipboard.writeText(JSON.stringify(Model.Filters)); + } + return true; + }, true, X + width/2 + 10, YY - 40, width/2 - 10, 30, TextGet("KDExportAllLayers"), "#88ff88"); + + DrawButtonKDEx("KDCopyLayer", (_bdata) => { + navigator.clipboard.writeText(JSON.stringify(filters)); + return true; + }, true, X, YY, width/2 - 10, 30, TextGet("KDCopyLayer"), "#ffffff"); + DrawButtonKDEx("KDPasteLayer", (_bdata) => { + navigator.clipboard.readText() + .then(text => { + let parsed = JSON.parse(text); + if (parsed?.red != undefined && parsed.green != undefined && parsed.blue != undefined) { + console.log(Object.assign({}, parsed)); + KDChangeWardrobe(C); + if (!Model.Filters) Model.Filters = {}; + Model.Filters[KDCurrentLayer] = Object.assign({}, parsed); + KDCurrentModels.get(C).Models.set(Model.Name, JSON.parse(JSON.stringify(Model))); + } + }); + return true; + }, true, X, YY - 40, width/2 - 10, 30, TextGet("KDPasteLayer"), "#ffffff"); + } else { + let CF = KDTextField("KDCopyFilter", X, YY - 50, width, 30, undefined, undefined, "300"); + if (CF.Created) { + CF.Element.oninput = (_event: any) => { + let value = ElementValue("KDCopyFilter"); + try { + let parsed = JSON.parse(value); + if (value) { + KDChangeWardrobe(C); + if (!Model.Filters) Model.Filters = {}; + if (!Model.Filters[KDCurrentLayer]) + Model.Filters[KDCurrentLayer] = Object.assign({}, KDColorSliders); + if (Model.Filters[KDCurrentLayer].alpha < 0.001) Model.Filters[KDCurrentLayer].alpha = 0.001; + Model.Filters[KDCurrentLayer].red = parsed.red; + Model.Filters[KDCurrentLayer].green = parsed.green; + Model.Filters[KDCurrentLayer].blue = parsed.blue; + Model.Filters[KDCurrentLayer].gamma = parsed.gamma; + Model.Filters[KDCurrentLayer].brightness = parsed.brightness; + Model.Filters[KDCurrentLayer].alpha = parsed.alpha; + Model.Filters[KDCurrentLayer].contrast = parsed.contrast; + Model.Filters[KDCurrentLayer].saturation = parsed.saturation; + KDCurrentModels.get(C).Models.set(Model.Name, JSON.parse(JSON.stringify(Model))); + } + } catch (err) { + console.log("Invalid filter"); + } + + }; + } + } + + + YY += 60; + + // get the visualbrightness from the color so that the visualbrightness value matches + // the actual brightness value which should be shown on the slider. + KDVisualBrightness = rgbToHsl(filters.red/5, filters.green/5, filters.blue/5)[2]; + + if (KDToggles.SimpleColorPicker) { + let force = false; + for (let key of ["brightness", "contrast"]) { + DrawTextFitKD(TextGet("KDColorSlider" + key) + ": " + (Math.round((key == "brightness" ? KDVisualBrightness : (0.2 * filters[key]))*100)/100), X + width/2, YY, width, "#ffffff", "#000000", 20); + KinkyDungeonBar(X, YY - 15, width, 30, Math.min(100, (key == "brightness" ? KDVisualBrightness : (filters[key]/3))*100), KDColorSliderColor[key] || "#ffffff", "#000000"); + if ((mouseDown) && MouseIn(X, YY - 15, width, 30)) { + MouseClicked = false; + if (CommonTime() > lastFilterUpdate + FilterUpdateInterval) { + lastFilterUpdate = CommonTime(); + KDChangeWardrobe(C); + if (!Model.Filters) Model.Filters = {}; + if (!Model.Filters[KDCurrentLayer]) + Model.Filters[KDCurrentLayer] = Object.assign({}, KDColorSliders); + if (key == 'brightness') { + KDVisualBrightness = ((MouseX - X) / width); + + force = true; + + } else { + Model.Filters[KDCurrentLayer][key] = ((MouseX - X) / width) * 3; + } + + KDCurrentModels.get(C).Models.set(Model.Name, JSON.parse(JSON.stringify(Model))); + let rr = Math.round(Model.Filters[KDCurrentLayer].red /5 * 255).toString(16); + if (rr.length == 1) rr = '0' + rr; + let gg = Math.round(Model.Filters[KDCurrentLayer].green /5 * 255).toString(16); + if (gg.length == 1) gg = '0' + gg; + let bb = Math.round(Model.Filters[KDCurrentLayer].blue /5 * 255).toString(16); + if (bb.length == 1) bb = '0' + bb; + ElementValue("KDSelectedColor", `#${ + rr}${ + gg}${ + bb}`); + ElementValue("KDCopyFilter", JSON.stringify(Model.Filters[KDCurrentLayer])); + lastGlobalRefresh = CommonTime() - GlobalRefreshInterval + 10; + ForceRefreshModels(C); + } + + } + YY += 50; + } + + let radius = 150; + if (ElementValue("KDSelectedColor") && Model?.Filters && Model.Filters[KDCurrentLayer]) { + let hsl = rgbToHsl( + Math.max(0, Math.min(1, Model.Filters[KDCurrentLayer].red/5 || 0)), + Math.max(0, Math.min(1, Model.Filters[KDCurrentLayer].green/5 || 0)), + Math.max(0, Math.min(1, Model.Filters[KDCurrentLayer].blue/5 || 0)), + ); + let x = radius * hsl[1] * Math.cos(hsl[0] * 2*Math.PI); + let y = radius * hsl[1] * Math.sin(hsl[0] * 2*Math.PI); + + + if (ColorPickerFilterCode != (1 - hsl[2]) + "," + hsl[2]) { + ColorPickerFilterCode = (1 - hsl[2]) + "," + hsl[2]; + ColorPickerFilter.destroy(); + let lumi = + Math.min(1, 5 * hsl[2]); + ColorPickerFilter = new PIXI.filters.AdjustmentFilter({ + brightness: 1, + saturation: Math.max(0, Math.min(1, 1.5 - 1.5*hsl[2])), + gamma: 1, + alpha: 1, + red: lumi, + blue: lumi, + green: lumi, + contrast: 1, + }); + } + + let value = ElementValue("KDSelectedColor"); + let RegExp = /^#[0-9A-Fa-f]{6}$/i; + + KDDraw(kdcanvas, kdpixisprites, "colorpickercolor", KinkyDungeonRootDirectory + "Color.png", X - 12 + x + radius, YY - 12 + y + radius, 23, 23, 0, + { + tint: RegExp.test(value) ? + new PIXI.Color(ElementValue("KDSelectedColor")).toNumber() : 0xffffff, + }); + } else { + if (ColorPickerFilterCode) { + ColorPickerFilterCode = ""; + ColorPickerFilter.destroy(); + ColorPickerFilter = new PIXI.filters.AdjustmentFilter({ + brightness: 1, + saturation: 1, + gamma: 1, + alpha: 1, + red: 1, + blue: 1, + green: 1, + contrast: 1, + }); + } + } + + KDDraw(kdcanvas, kdpixisprites, "colorpicker", + KinkyDungeonRootDirectory + "ColorPicker.png", X, YY, 300, 300, + undefined, { + filters: [ColorPickerFilter], + }); + + + let dist = KDistEuclidean(MouseX - (X + radius), MouseY - (YY + radius)); + if ((mouseDown && dist * 0.8 < radius) || force) { + let hue = Math.max(0, 0.5 + 0.5 * Math.min(1, Math.atan2( + -MouseY + (YY + radius), + -MouseX + (X + radius)) / Math.PI)); + let sat = Math.min(1, dist/radius); + + if (force) { + let hsl = rgbToHsl( + Math.max(0, Math.min(1, Model.Filters[KDCurrentLayer].red/5 || 0)), + Math.max(0, Math.min(1, Model.Filters[KDCurrentLayer].green/5 || 0)), + Math.max(0, Math.min(1, Model.Filters[KDCurrentLayer].blue/5 || 0)), + ); + hue = hsl[0]; + sat = hsl[1]; + } + + let arr = hslToRgb(hue, sat, Math.max(0, Math.min(1, KDVisualBrightness))); + let r = arr[0]; + let g = arr[1]; + let b = arr[2]; + + MouseClicked = false; + if (force || CommonTime() > lastFilterUpdate + FilterUpdateInterval) { + lastFilterUpdate = CommonTime(); + KDChangeWardrobe(C); + if (!Model.Filters) Model.Filters = {}; + if (!Model.Filters[KDCurrentLayer]) + Model.Filters[KDCurrentLayer] = Object.assign({}, KDColorSliders); + Model.Filters[KDCurrentLayer].red = 5*r/255.0; + Model.Filters[KDCurrentLayer].green = 5*g/255.0; + Model.Filters[KDCurrentLayer].blue = 5*b/255.0; + Model.Filters[KDCurrentLayer].brightness = 1; + if (Model.Filters[KDCurrentLayer].saturation == 1 || !Model.Filters[KDCurrentLayer].saturation) + Model.Filters[KDCurrentLayer].saturation = 0; + KDCurrentModels.get(C).Models.set(Model.Name, JSON.parse(JSON.stringify(Model))); + let rr = Math.round(Model.Filters[KDCurrentLayer].red/5 * 255).toString(16); + if (rr.length == 1) rr = '0' + rr; + let gg = Math.round(Model.Filters[KDCurrentLayer].green/5 * 255).toString(16); + if (gg.length == 1) gg = '0' + gg; + let bb = Math.round(Model.Filters[KDCurrentLayer].blue/5 * 255).toString(16); + if (bb.length == 1) bb = '0' + bb; + ElementValue("KDSelectedColor", `#${ + rr}${ + gg}${ + bb}`); + ElementValue("KDCopyFilter", JSON.stringify(Model.Filters[KDCurrentLayer])); + lastGlobalRefresh = CommonTime() - GlobalRefreshInterval + 10; + ForceRefreshModels(C); + } + } + + YY += 300; + } else { + for (let key of Object.keys(KDColorSliders)) { + DrawTextFitKD(TextGet("KDColorSlider" + key) + ": " + (Math.round(filters[key]*100)/100), X + width/2, YY, width, "#ffffff", "#000000", 20); + KinkyDungeonBar(X, YY - 15, width, 30, filters[key]/5*100, KDColorSliderColor[key] || "#ffffff", "#000000"); + if ((mouseDown) && MouseIn(X, YY - 15, width, 30)) { + MouseClicked = false; + if (CommonTime() > lastFilterUpdate + FilterUpdateInterval) { + lastFilterUpdate = CommonTime(); + KDChangeWardrobe(C); + if (!Model.Filters) Model.Filters = {}; + if (!Model.Filters[KDCurrentLayer]) + Model.Filters[KDCurrentLayer] = Object.assign({}, KDColorSliders); + Model.Filters[KDCurrentLayer][key] = ((MouseX - X) / width) * 5; + KDCurrentModels.get(C).Models.set(Model.Name, JSON.parse(JSON.stringify(Model))); + let rr = Math.round(Model.Filters[KDCurrentLayer].red /5 * 255).toString(16); + if (rr.length == 1) rr = '0' + rr; + let gg = Math.round(Model.Filters[KDCurrentLayer].green /5 * 255).toString(16); + if (gg.length == 1) gg = '0' + gg; + let bb = Math.round(Model.Filters[KDCurrentLayer].blue /5 * 255).toString(16); + if (bb.length == 1) bb = '0' + bb; + ElementValue("KDSelectedColor", `#${ + rr}${ + gg}${ + bb}`); + ElementValue("KDCopyFilter", JSON.stringify(Model.Filters[KDCurrentLayer])); + lastGlobalRefresh = CommonTime() - GlobalRefreshInterval + 10; + ForceRefreshModels(C); + } + + } + YY += 50; + } + } + + + + YY += 70; + DrawTextFitKD(TextGet("KDColorHex"),X + width/2, YY - 40, 300, "#ffffff", KDTextGray0, undefined, "center"); + let TF = KDTextField("KDSelectedColor", X - 10, YY - 20, width, 30); + if (TF.Created) { + TF.Element.oninput = (_event: any) => { + let value = ElementValue("KDSelectedColor"); + let RegExp = /^#[0-9A-Fa-f]{6}$/i; + + if (RegExp.test(value)) { + let hex = KDhexToRGB(value); + if (hex) { + let r = 5.0 * (parseInt(hex.r, 16) / 255.0); + let g = 5.0 * (parseInt(hex.g, 16) / 255.0); + let b = 5.0 * (parseInt(hex.b, 16) / 255.0); + KDChangeWardrobe(C); + if (!Model.Filters) Model.Filters = {}; + if (!Model.Filters[KDCurrentLayer]) + Model.Filters[KDCurrentLayer] = Object.assign({}, KDColorSliders); + if (Model.Filters[KDCurrentLayer].alpha < 0.001) Model.Filters[KDCurrentLayer].alpha = 0.001; + if (KDToggles.SimpleColorPicker) { + Model.Filters[KDCurrentLayer].brightness = 1; + if (Model.Filters[KDCurrentLayer].saturation == 1 || !Model.Filters[KDCurrentLayer].saturation) + Model.Filters[KDCurrentLayer].saturation = 0; + } + Model.Filters[KDCurrentLayer].red = r; + Model.Filters[KDCurrentLayer].green = g; + Model.Filters[KDCurrentLayer].blue = b; + KDCurrentModels.get(C).Models.set(Model.Name, JSON.parse(JSON.stringify(Model))); + } + } + }; + } + } + + KDDrawWardrobeToolsButtons(X, Y, C, Model); + + + DrawButtonKDEx("tab_ColorPickerSimple", (_b) => { + KDToggles.SimpleColorPicker = true; + KDPropsSlider = false; + return true; + }, true, X - 240, YY + 40, 190, 30, TextGet("KDColorPickerSimple"), "#ffffff", undefined, undefined, undefined, + KDPropsSlider || !KDToggles.SimpleColorPicker, KDButtonColor); + DrawButtonKDEx("tab_ColorPickerAdvanced", (_b) => { + KDToggles.SimpleColorPicker = false; + KDPropsSlider = false; + return true; + }, true, X - 240 + 200, YY + 40, 190, 30, TextGet("KDColorPickerAdvanced"), "#ffffff", undefined, undefined, undefined, + KDPropsSlider || KDToggles.SimpleColorPicker, KDButtonColor); + DrawButtonKDEx("tab_ColorPickerProperties", (_b) => { + KDPropsSlider = true; + return true; + }, true, X - 240 + 400, YY + 40, 190, 30, TextGet("KDColorPickerProperties"), "#ffffff", undefined, undefined, undefined, + !KDPropsSlider, KDButtonColor); + + + YY += 60; + YY = Y + 35; + + let ii = 0; + let buttonSpacing = 30; + while (YY < 590) { + if (ii >= KDLayerIndex) { + let ll = layers[ii]; + let l = ll?.name || ""; + let str = ""; + if (l) { + if (!KDPropsSlider || KDWToolsLayerAbbrMode == "Full") { + str = TextGet(`l_${Model.Name}_${l}`); + } else { + str = TextGet(`l_${Model.Name}_${l}`) == `l_${Model.Name}_${l}` ? KDAbbreviate(l) + : KDAbbreviate(TextGet(`l_${Model.Name}_${l}`)); + } + } + + DrawButtonKDExScroll("SelectLayer" + YY, + (amount) => { + KDLayerIndex += Math.min(5, Math.abs(amount)/35) * Math.sign(amount); + KDLayerIndex = Math.min(KDLayerIndex, layers.length - 10); + KDLayerIndex = Math.max(0, KDLayerIndex); + }, + (_bdata) => { + if (l) { + KDCurrentLayer = l; + KDCurrentLayerOrig = ll.layer; + } + KDRefreshProps = true; + return true; + }, true, X - 220, YY, 200, buttonSpacing - 1, + l ? str : "", + "#ffffff", undefined, undefined, undefined, KDCurrentLayer != l, KDButtonColor); + YY += buttonSpacing; + } + ii += 1; + } + DrawButtonKDEx("SelectLayer_V", (_bdata) => { + KDLayerIndex += 5; + KDLayerIndex = Math.min(KDLayerIndex, layers.length - 10); + KDLayerIndex = Math.max(0, KDLayerIndex); + return true; + }, true, X-220, 620, 200, buttonSpacing - 1, + "", + KDModelList_Toplevel_viewindex.index + KDModelListMax < KDModelList_Toplevel_viewindex.index ? "#ffffff" : "#888888", KinkyDungeonRootDirectory + "Down.png", undefined, undefined, undefined, undefined, + undefined, undefined, { + centered: true, + }); + + DrawButtonKDEx("SelectLayer_^", (_bdata) => { + KDLayerIndex -= 5; + KDLayerIndex = Math.min(KDLayerIndex, layers.length - 10); + KDLayerIndex = Math.max(0, KDLayerIndex); + return true; + }, true, X-220, 100, 200, buttonSpacing - 1, + "", + KDModelList_Toplevel_viewindex.index > 0 ? "#ffffff" : "#888888", KinkyDungeonRootDirectory + "Up.png", undefined, undefined, undefined, undefined, + undefined, undefined, { + centered: true, + }); + + if (KDLayerIndex > layers.length - 10) KDLayerIndex = Math.max(0, layers.length - 10); +} + +function KDUpdateChar(C: Character) { + KDCurrentModels.get(C).Poses = KDGeneratePoseArray( + KDNPCPoses.get(C)?.CurrentPoseArms, + KDNPCPoses.get(C)?.CurrentPoseLegs, + KDNPCPoses.get(C)?.CurrentPoseEyes, + KDNPCPoses.get(C)?.CurrentPoseBrows, + KDNPCPoses.get(C)?.CurrentPoseBlush, + KDNPCPoses.get(C)?.CurrentPoseMouth, + KDNPCPoses.get(C)?.CurrentPoseEyes2, + KDNPCPoses.get(C)?.CurrentPoseBrows2, + undefined, + KDNPCPoses.get(C)?.CurrentPoseFear, + //KDGetPoseOfType(C, "Eyes"), + //KDGetPoseOfType(C, "Brows"), + //KDGetPoseOfType(C, "Blush"), + //KDGetPoseOfType(C, "Mouth"), + ); + KDUpdateTempPoses(C); + UpdateModels(C); +} + +let KDLayerIndex = 0; + +function KDDrawPoseButtons(C: Character, X: number = 960, Y: number = 750, allowRemove: boolean = false, dress: boolean = false, updateDesired: boolean = false) { + if (!KDNPCPoses.get(C)) KDNPCPoses.set(C, {}); + let buttonClick = ( + arms: string, + legs: string, + eyes: string, + eyes2?: string, + brows?: string, + brows2?: string, + blush?: string, + mouth?: string, + update: boolean = true, + fear?: string, + ) => { + return (_bdata: any) => { + if (allowRemove && arms == KDNPCPoses.get(C).CurrentPoseArms) KDNPCPoses.get(C).CurrentPoseArms = ""; + else KDNPCPoses.get(C).CurrentPoseArms = arms || KDNPCPoses.get(C).CurrentPoseArms; + if (allowRemove && legs == KDNPCPoses.get(C).CurrentPoseLegs) KDNPCPoses.get(C).CurrentPoseLegs = ""; + else KDNPCPoses.get(C).CurrentPoseLegs = legs || KDNPCPoses.get(C).CurrentPoseLegs; + + + if (allowRemove && eyes == KDNPCPoses.get(C).CurrentPoseEyes) KDNPCPoses.get(C).CurrentPoseEyes = ""; + else KDNPCPoses.get(C).CurrentPoseEyes = eyes || KDNPCPoses.get(C).CurrentPoseEyes; + if (allowRemove && eyes2 == KDNPCPoses.get(C).CurrentPoseEyes2) KDNPCPoses.get(C).CurrentPoseEyes2 = ""; + else KDNPCPoses.get(C).CurrentPoseEyes2 = eyes2 || KDNPCPoses.get(C).CurrentPoseEyes2; + if (allowRemove && brows == KDNPCPoses.get(C).CurrentPoseBrows) KDNPCPoses.get(C).CurrentPoseBrows = ""; + else KDNPCPoses.get(C).CurrentPoseBrows = brows || KDNPCPoses.get(C).CurrentPoseBrows; + if (allowRemove && brows2 == KDNPCPoses.get(C).CurrentPoseBrows2) KDNPCPoses.get(C).CurrentPoseBrows2 = ""; + else KDNPCPoses.get(C).CurrentPoseBrows2 = brows2 || KDNPCPoses.get(C).CurrentPoseBrows2; + if (allowRemove && blush == KDNPCPoses.get(C).CurrentPoseBlush) KDNPCPoses.get(C).CurrentPoseBlush = ""; + else KDNPCPoses.get(C).CurrentPoseBlush = blush || KDNPCPoses.get(C).CurrentPoseBlush; + if (allowRemove && mouth == KDNPCPoses.get(C).CurrentPoseMouth) KDNPCPoses.get(C).CurrentPoseMouth = ""; + else KDNPCPoses.get(C).CurrentPoseMouth = mouth || KDNPCPoses.get(C).CurrentPoseMouth; + if (allowRemove && fear == KDNPCPoses.get(C).CurrentPoseFear) KDNPCPoses.get(C).CurrentPoseFear = ""; + else KDNPCPoses.get(C).CurrentPoseFear = fear || KDNPCPoses.get(C).CurrentPoseFear; + + if (updateDesired) { + NPCDesiredPoses.set(C, { + Arms: KDNPCPoses.get(C).CurrentPoseArms, + Legs: KDNPCPoses.get(C).CurrentPoseLegs, + Eyes: KDNPCPoses.get(C).CurrentPoseEyes, + Eyes2: KDNPCPoses.get(C).CurrentPoseEyes2, + Brows: KDNPCPoses.get(C).CurrentPoseBrows, + Brows2: KDNPCPoses.get(C).CurrentPoseBrows2, + Blush: KDNPCPoses.get(C).CurrentPoseBlush, + Mouth: KDNPCPoses.get(C).CurrentPoseMouth, + Fear: KDNPCPoses.get(C).CurrentPoseFear, + }); + } + + if (update) { + KDUpdateChar(C); + } + if (dress) { + + KDRefreshCharacter.set(C, true); + KinkyDungeonDressPlayer(C); + } + + return true; + }; + }; + + let AvailableArms = KDGetAvailablePosesArms(C); + let AvailableLegs = KDGetAvailablePosesLegs(C); + + let buttonWidth = 52; + let buttonSpacing = 55; + let xoff = KDWardrobe_PoseLegs.length % 2 != KDWardrobe_PoseArms.length % 2 ? buttonWidth/2 : 0; + for (let i = 0; i < KDWardrobe_PoseArms.length; i++) { + DrawButtonKDEx("PoseArms" + i, + buttonClick(KDWardrobe_PoseArms[i], "", "", "", "", "", "", "", AvailableArms.includes(KDWardrobe_PoseArms[i])), + true, + X + i*buttonSpacing, Y + 120, buttonWidth, buttonWidth, + "", + "#ffffff", KinkyDungeonRootDirectory + "Poses/"+KDWardrobe_PoseArms[i] + ".png", + undefined, false, KDNPCPoses.get(C).CurrentPoseArms != KDWardrobe_PoseArms[i], !AvailableArms.includes(KDWardrobe_PoseArms[i]) ? "#ff5277" : KDButtonColor); + } + for (let i = 0; i < KDWardrobe_PoseLegs.length; i++) { + DrawButtonKDEx("PoseLegs" + i, + buttonClick("", KDWardrobe_PoseLegs[i], "", "", "", "", "", "", AvailableLegs.includes(KDWardrobe_PoseLegs[i])), + true, + X + xoff + i*buttonSpacing, Y + 180, buttonWidth, buttonWidth, + "", + "#ffffff", KinkyDungeonRootDirectory + "Poses/"+KDWardrobe_PoseLegs[i] + ".png", + undefined, false, KDNPCPoses.get(C).CurrentPoseLegs != KDWardrobe_PoseLegs[i], !AvailableLegs.includes(KDWardrobe_PoseLegs[i]) ? "#ff5277" : KDButtonColor); + } + for (let i = 0; i < KDWardrobe_PoseEyes.length; i++) { + DrawButtonKDEx("PoseEyes" + i, buttonClick("", "", KDWardrobe_PoseEyes[i]), true, X + i*buttonSpacing, Y, buttonWidth, buttonWidth, + "", + "#ffffff", KinkyDungeonRootDirectory + "Poses/"+KDWardrobe_PoseEyes[i] + ".png", + undefined, undefined, KDNPCPoses.get(C).CurrentPoseEyes != KDWardrobe_PoseEyes[i], KDButtonColor); + } + for (let i = 0; i < KDWardrobe_PoseEyes.length; i++) { + DrawButtonKDEx("PoseEyes2" + i, buttonClick("", "", "", KDWardrobe_PoseEyes2[i]), true, X + i*buttonSpacing, Y + 60, buttonWidth, buttonWidth, + "", + "#ffffff", KinkyDungeonRootDirectory + "Poses/"+KDWardrobe_PoseEyes2[i] + ".png", + undefined, undefined, KDNPCPoses.get(C).CurrentPoseEyes2 != KDWardrobe_PoseEyes2[i], KDButtonColor); + } + for (let i = 0; i < KDWardrobe_PoseBrows.length; i++) { + DrawButtonKDEx("PoseBrows" + i, buttonClick("", "", "", "", KDWardrobe_PoseBrows[i]), true, X + 400 + i*buttonSpacing, Y, buttonWidth, buttonWidth, + "", + "#ffffff", KinkyDungeonRootDirectory + "Poses/"+KDWardrobe_PoseBrows[i] + ".png", + undefined, undefined, KDNPCPoses.get(C).CurrentPoseBrows != KDWardrobe_PoseBrows[i], KDButtonColor); + } + for (let i = 0; i < KDWardrobe_PoseBrows2.length; i++) { + DrawButtonKDEx("PoseBrows2" + i, buttonClick("", "", "", "", "", KDWardrobe_PoseBrows2[i]), true, X + 400 + i*buttonSpacing, Y + 60, buttonWidth, buttonWidth, + "", + "#ffffff", KinkyDungeonRootDirectory + "Poses/"+KDWardrobe_PoseBrows2[i] + ".png", + undefined, undefined, KDNPCPoses.get(C).CurrentPoseBrows2 != KDWardrobe_PoseBrows2[i], KDButtonColor); + } + for (let i = 0; i < KDWardrobe_PoseBlush.length; i++) { + DrawButtonKDEx("PoseBlush" + i, buttonClick("", "", "", "", "", "", KDWardrobe_PoseBlush[i]), true, X + 400 + i*buttonSpacing, Y + 120, buttonWidth, buttonWidth, + "", + "#ffffff", KinkyDungeonRootDirectory + "Poses/"+KDWardrobe_PoseBlush[i] + ".png", + undefined, undefined, KDNPCPoses.get(C).CurrentPoseBlush != KDWardrobe_PoseBlush[i], KDButtonColor); + } + for (let i = 0; i < KDWardrobe_PoseMouth.length; i++) { + DrawButtonKDEx("PoseMouth" + i, buttonClick("", "", "", "", "", "", "", KDWardrobe_PoseMouth[i]), true, X + 400 + i*buttonSpacing, Y + 180, buttonWidth, buttonWidth, + "", + "#ffffff", KinkyDungeonRootDirectory + "Poses/"+KDWardrobe_PoseMouth[i] + ".png", + undefined, undefined, KDNPCPoses.get(C).CurrentPoseMouth != KDWardrobe_PoseMouth[i], KDButtonColor); + } + for (let i = 0; i < KDWardrobe_PoseFear.length; i++) { + DrawButtonKDEx("PoseFear" + i, + buttonClick("", "", "", "", "", "", "", "", undefined, KDWardrobe_PoseFear[i]), + true, + X + 400 + (6 + i)*buttonSpacing, + Y + 60, + buttonWidth, buttonWidth, + "", + "#ffffff", KinkyDungeonRootDirectory + "Poses/"+KDWardrobe_PoseFear[i] + ".png", + undefined, undefined, + KDNPCPoses.get(C).CurrentPoseFear != KDWardrobe_PoseFear[i], + KDButtonColor); + } +} + +/** + * Updates the mopel list, only altering a level if the specified altered level is that low + * @param level + */ +function KDUpdateModelList(level: number = 0, C?: Character): void { + if (!C) C = KinkyDungeonPlayer; + if (level <= 0) { + KDModelList_Categories = []; + KDModelList_Categories_index = 0; + KDModelList_Categories_viewindex.index = 0; + for (let cat of KDWardrobeCategories) { + KDModelList_Categories.push(cat); + } + } + let category = KDModelList_Categories[KDModelList_Categories_index]; + + if (level <= 1 && category) { + KDModelList_Toplevel = []; + KDModelList_Toplevel_index = 0; + KDModelList_Toplevel_viewindex.index = 0; + for (let model of Object.entries(ModelDefs)) { + if (model[1].TopLevel && (KDModelListFilter || + (KDCategoryFilterSpecial[category] ? KDCategoryFilterSpecial[category](C, model[1], level) + : model[1].Categories?.includes(category))) && (TestMode || !model[1].Restraint)) { + if (!KDModelListFilter + || TextGet(model[0]).toLowerCase().includes(KDModelListFilter.toLowerCase())) + KDModelList_Toplevel.push(model[0]); + } + } + + } + let toplevel: string = KDModelList_Toplevel[KDModelList_Toplevel_index]; + + if (level <= 2) { + KDModelList_Sublevel = []; + KDModelList_Sublevel_index = 0; + KDModelList_Sublevel_viewindex.index = 0; + if (toplevel) { + let already = {}; + // Put these at the top of the list + for (let model of Object.entries(ModelDefs)) { + if (already[model[0]]) continue; + if ((model[1].Parent != toplevel + && (!model[1].Parent2 || !model[1].Parent2.some((p) => { + return toplevel == p; + })) + ) + && model[0] == toplevel && (TestMode || !model[1].Restraint)) { + if (!KDModelListFilter || TextGet(model[1].Parent).toLowerCase().includes(KDModelListFilter.toLowerCase())) + {already[model[0]] = true; KDModelList_Sublevel.push(model[0]);} + } + } + for (let model of Object.entries(ModelDefs)) { + if (already[model[0]]) continue; + if (((model[1].Parent == toplevel + || (model[1].Parent2 && model[1].Parent2.some((p) => { + return toplevel == p; + }))) || KDModelListFilter) && (TestMode || !model[1].Restraint)) { + if (!KDModelListFilter || TextGet(model[1].Name).toLowerCase().includes(KDModelListFilter.toLowerCase())) + {already[model[0]] = true; KDModelList_Sublevel.push(model[0]);} + } + } + if (KDCategoryFilterSpecial[category]) { + for (let model of Object.entries(ModelDefs)) { + if (already[model[0]]) continue; + if ( + KDCategoryFilterSpecial[category](C, model[1], level)) + {already[model[0]] = true; KDModelList_Sublevel.push(model[0]);} + } + } + } + } +} + +/** Call BEFORE making any changes */ +function KDChangeWardrobe(C: Character) { + if (C == KinkyDungeonPlayer) + try { + if (!KDOriginalValue) + KDOriginalValue = AppearanceItemStringify(C.Appearance); + } catch (e) { + // Fail + } + UpdateModels(C); +} + +/** + * @param X + * @param C + */ +function KDDrawModelList(X: number, C: Character) { + + + let clickCategory = (en: any, index: number) => { + return (_bdata: any) => { + if (!en) return false; + KDModelList_Categories_index = index; + if (KDModelListFilter) { + KDModelListFilter = ""; + KDUpdateModelList(0, C); + KDUpdateModelList(2, C); + } + KDUpdateModelList(1, C); + return true; + }; + }; + let clickToplevel = (en: any, index: number) => { + return (_bdata: any) => { + if (!en) return false; + KDModelList_Toplevel_index = index; + if (KDModelListFilter) { + KDModelListFilter = ""; + KDUpdateModelList(0, C); + KDUpdateModelList(1, C); + } + KDUpdateModelList(2, C); + let name = KDModelList_Sublevel[KDModelList_Sublevel_index] || ""; + if (name) { + KDCurrentLayer = Object.keys(ModelDefs[name]?.Layers || {})[0] || ""; + KDCurrentLayerOrig = Object.keys(ModelDefs[name]?.Layers || {})[0] || ""; + } else { + KDCurrentLayer = ""; + KDCurrentLayerOrig = ""; + } + KDRefreshProps = true; + return true; + }; + }; + let clickSublevel = (en: any, index: number, name: string) => { + return (_bdata: any) => { + if (!en) return false; + + let removed = false; + for (let appIndex = 0; appIndex < C.Appearance.length; appIndex++) { + if (C.Appearance[appIndex]?.Model?.Name == name) { + if (KDModelList_Sublevel_index == index) { + KDChangeWardrobe(C); + C.Appearance.splice(appIndex, 1); + KDUpdateChar(C); + } + removed = true; + break; + } + } + if (!removed) { + let M = ModelDefs[name]; + if (M) { + KDChangeWardrobe(C); + KDAddModel(C, M.Group || M.Name, M, "Default", undefined); + KDUpdateChar(C); + } + + + } + + + KDModelList_Sublevel_index = index; + KDCurrentLayer = Object.keys(ModelDefs[name]?.Layers || {})[0] || ""; + KDCurrentLayerOrig = Object.keys(ModelDefs[name]?.Layers || {})[0] || ""; + KDRefreshProps = true; + KDUpdateModelList(3, C); + return true; + }; + }; + + let buttonHeight = 38; + let buttonSpacing = 40; + + DrawTextFitKD(TextGet("KDItemMenu"), X + 10, 25, 220, "#ffffff", KDTextGray0, undefined, "left"); + DrawBoxKD(X - 5, 5, 650, 700, KDButtonColor, false, 0.5, -10); + + let MF = KDTextField("KDModelListFilter", X+220, 10, 400, buttonHeight, undefined, undefined, "30"); + if (MF.Created) { + MF.Element.oninput = (_event: any) => { + KDModelListFilter = ElementValue("KDModelListFilter"); + + //KDUpdateModelList(1); + KDUpdateModelList(2, C); + KDUpdateModelList(3, C); + }; + } + + + let hasCategories = {}; + let hasTopLevel = {}; + let models = KDCurrentModels.get(C).Models.values(); + for (let m of models) { + if (m.Categories) { + for (let cat of m.Categories) { + hasCategories[cat] = true; + } + } + if (m.Parent) { + hasTopLevel[m.Parent] = true; + } + } + + let faded = "#888888"; + KDSelectedModel = null; + // Draw each row + for (let i = 0; i < KDModelListMax; i++) { + + let index_cat = i + KDModelList_Categories_viewindex.index; + let category = KDModelList_Categories[index_cat]; + //if (category) + DrawButtonKDExScroll("ClickCategory" + i, (amount) => {KDModelList_Categories_viewindex.index += Math.min(5, Math.abs(amount)/buttonHeight) * Math.sign(amount); cullIndex();}, + clickCategory(category, index_cat), true, X+0, 100 + buttonSpacing * i, 190, buttonHeight, + !category ? "" : TextGet("cat_" + category), + hasCategories[category] ? "#ffffff" : faded, "", + undefined, undefined, index_cat != KDModelList_Categories_index, KDButtonColor); + + + let index_top = i + KDModelList_Toplevel_viewindex.index; + let toplevel = KDModelList_Toplevel[index_top]; + //if (toplevel) + DrawButtonKDExScroll("ClickToplevel" + i, (amount) => {KDModelList_Toplevel_viewindex.index += Math.min(5, Math.abs(amount)/buttonHeight) * Math.sign(amount); cullIndex();}, + clickToplevel(toplevel, index_top), true, X+220, 100 + buttonSpacing * i, 190, buttonHeight, + !toplevel ? "" : TextGet("m_" + toplevel), + (KDCurrentModels.get(C).Models.has(toplevel) || hasTopLevel[toplevel]) ? "#ffffff" : faded, "", + undefined, undefined, index_top != KDModelList_Toplevel_index, KDButtonColor); + + + + let index_sub = i + KDModelList_Sublevel_viewindex.index; + let sublevel = KDModelList_Sublevel[index_sub]; + //if (sublevel) { + DrawButtonKDExScroll("ClickSublevel" + i, (amount) => {KDModelList_Sublevel_viewindex.index += Math.min(5, Math.abs(amount)/buttonHeight) * Math.sign(amount); cullIndex();}, + clickSublevel(sublevel, index_sub, sublevel), true, X+440, 100 + buttonSpacing * i, 190, buttonHeight, + !sublevel ? "" : TextGet("m_" + sublevel), + KDCurrentModels.get(C).Models.has(sublevel) ? "#ffffff" : faded, "", + undefined, undefined, index_sub != KDModelList_Sublevel_index, KDButtonColor); + if (sublevel) { + if (index_sub == KDModelList_Sublevel_index && KDCurrentModels.get(C).Models.has(sublevel)) { + KDSelectedModel = C.Appearance.find((value) => { + return value.Model.Name == sublevel; + })?.Model; + } + } + + // KDCurrentModels.get(KinkyDungeonPlayer).Models.has(model) ? "#ffffff" : "#888888", ""); + } + + let cullIndex = () => { + KDModelList_Toplevel_viewindex.index = Math.round(Math.max(0, Math.min(KDModelList_Toplevel.length - 5, KDModelList_Toplevel_viewindex.index))); + KDModelList_Sublevel_viewindex.index = Math.round(Math.max(0, Math.min(KDModelList_Sublevel.length - 5, KDModelList_Sublevel_viewindex.index))); + KDModelList_Categories_viewindex.index = Math.round(Math.max(0, Math.min(KDModelList_Categories.length - 5, KDModelList_Categories_viewindex.index))); + }; + + DrawButtonKDEx("KDModelList_Toplevel_V", (_bdata) => { + KDModelList_Toplevel_viewindex.index += 5; + cullIndex(); + return true; + }, true, X+220, 100 + buttonSpacing * KDModelListMax, 200, buttonHeight, + "", + KDModelList_Toplevel_viewindex.index + KDModelListMax < KDModelList_Toplevel_viewindex.index ? "#ffffff" : "#888888", KinkyDungeonRootDirectory + "Down.png", undefined, undefined, undefined, undefined, + undefined, undefined, { + centered: true, + }); + + DrawButtonKDEx("KDModelList_Toplevel_^", (_bdata) => { + KDModelList_Toplevel_viewindex.index -= 5; + cullIndex(); + return true; + }, true, X+220, 100 + buttonSpacing * -1, 200, buttonHeight, + "", + KDModelList_Toplevel_viewindex.index > 0 ? "#ffffff" : "#888888", KinkyDungeonRootDirectory + "Up.png", undefined, undefined, undefined, undefined, + undefined, undefined, { + centered: true, + }); + + DrawButtonKDEx("KDModelList_Sublevel_V", (_bdata) => { + KDModelList_Sublevel_viewindex.index += 5; + cullIndex(); + return true; + }, true, X+440, 100 + buttonSpacing * KDModelListMax, 200, buttonHeight, + "", + KDModelList_Sublevel_viewindex.index + KDModelListMax < KDModelList_Sublevel_viewindex.index ? "#ffffff" : "#888888", KinkyDungeonRootDirectory + "Down.png", undefined, undefined, undefined, undefined, + undefined, undefined, { + centered: true, + }); + DrawButtonKDEx("KDModelList_Sublevel_^", (_bdata) => { + KDModelList_Sublevel_viewindex.index -= 5; + cullIndex(); + return true; + }, true, X+440, 100 + buttonSpacing * -1, 200, buttonHeight, + "", + KDModelList_Sublevel_viewindex.index > 0 ? "#ffffff" : "#888888", KinkyDungeonRootDirectory + "Up.png", undefined, undefined, undefined, undefined, + undefined, undefined, { + centered: true, + }); + + + + DrawButtonKDEx("KDModelList_Categories_V", (_bdata) => { + KDModelList_Categories_viewindex.index += 5; + cullIndex(); + return true; + }, true, X+0, 100 + buttonSpacing * KDModelListMax, 200, buttonHeight, + "", + (KDModelList_Categories_viewindex.index + KDModelListMax < KDModelList_Categories_viewindex.index) ? "#ffffff" : "#888888", KinkyDungeonRootDirectory + "Down.png", undefined, undefined, undefined, undefined, + undefined, undefined, { + centered: true, + }); + DrawButtonKDEx("KDModelList_Categories_^", (_bdata) => { + KDModelList_Categories_viewindex.index -= 5; + cullIndex(); + return true; + }, true, X+0, 100 + buttonSpacing * -1, 200, buttonHeight, + "", + KDModelList_Categories_viewindex.index > 0 ? "#ffffff" : "#888888", KinkyDungeonRootDirectory + "Up.png", undefined, undefined, undefined, undefined, + undefined, undefined, { + centered: true, + }); + + + cullIndex(); + +} + +function KDCanForcePose(C: Character): boolean { + return C != KinkyDungeonPlayer; +} + +function KDDrawWardrobe(_screen: string, Character: Character) { + if (KDOutfitInfo.length == 0) KDRefreshOutfitInfo(); + + let C = Character || KinkyDungeonPlayer; + if (KDBGColor) { + FillRectKD(kdcanvas, kdpixisprites, "playerbg", { + Left: 0, + Top: 0, + Width: 500, + Height: 1000, + Color: KDBGColor, + zIndex: -1, + alpha: StandalonePatched ? KDUIAlpha : 0.01, + }); + } + DrawCharacter(C, 0, 0, 1, undefined, undefined, undefined, undefined, undefined, C == KinkyDungeonPlayer ? KDToggles.FlipPlayer : false); + + KDTextField("KDOutfitName", 25, 5, 450, 30); + if (!ElementValue("KDOutfitName")) { + ElementValue("KDOutfitName", KDOutfitInfo[KDCurrentOutfit]); + } + if (KDShowCharacterPalette) { + DrawCheckboxKDEx("", () => { + KDToggles.HideArmorWardrobe = !KDToggles.HideArmorWardrobe; + KDSaveToggles(); + KinkyDungeonDressPlayer(C); + return true; + }, true, 800, 250, 64, 64, + TextGet("KDVisualOpt_HideArmorWardrobe"), KDToggles.HideArmorWardrobe, false, "#ffffff", undefined, { + maxWidth: 350, + fontSize: 24, + scaleImage: true, + }); + + KDDrawPalettes(1300, 250, KDPaletteWidth, 72, C.Palette || "", (pal) => { + C.Palette = pal; + + }, "KDSetCharacterPalette"); + } else { + KDDrawModelList(720, C); + } + + DrawBoxKD(1025, 710, 950, 285, KDButtonColor, false, 0.5, -10); + if (KDPlayerSetPose) { + KDDrawPoseButtons(C, 1050, undefined, undefined, undefined, KDCanForcePose(C)); + } else { + DrawTextFitKD(TextGet("KDQuickColor"), 1050, 735, 250, "#ffffff", KDTextGray0, undefined, "left"); + KDDrawSavedColors(1060, 760, KDSavedColorCount, C); + } + DrawButtonKDEx("SetPose", (_bdata) => { + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDPlayerSetPose = !KDPlayerSetPose; + KDModalArea = false; + return true; + }, true, 715, 765, 240, 50, TextGet("KDChangePose"), "#ffffff", + KinkyDungeonRootDirectory + "Poses/SetPose.png", "", false, false, + KDPlayerSetPose ? KDTextGray3 : KDButtonColor, undefined, true); + + + DrawButtonKDEx("ToggleXray", (_bdata) => { + KDToggleXRay += 1; + if (KDToggleXRay > (StandalonePatched ? 2 : 1)) KDToggleXRay = 0; + + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(KinkyDungeonPlayer, false, true); + return true; + }, true, 715, 820, 240, 50, TextGet("KDXRay"), "#ffffff", + KinkyDungeonRootDirectory + "UI/XRay" + KDToggleXRay + ".png", "", false, false, + KDToggleXRay ? KDTextGray3 : KDButtonColor, undefined, true); + + + + let palette = C.Palette; + let o = { + }; + + if (palette && KinkyDungeonFactionFilters[palette]) { + o['filters'] = [ + new PIXI.filters.AdjustmentFilter(KinkyDungeonFactionFilters[palette].Highlight), + ]; + } + + + DrawButtonKDEx("SetPalette", (_bdata) => { + KDShowCharacterPalette = !KDShowCharacterPalette; + return true; + }, true, 715, 875, 240, 50, TextGet("KDSetPalette"), "#ffffff", + KinkyDungeonRootDirectory + "UI/SetPalette.png", "", false, false, + undefined, undefined, true, o); + + + DrawButtonKDEx("BackupOutfit", (_bdata) => { + downloadFile((ElementValue("savename") || KDOutfitInfo[KDCurrentOutfit] || "Outfit") + KDOUTFITBACKUP, + LZString.compressToBase64(CharacterAppearanceStringify(C || KinkyDungeonPlayer, + KDGetCharMetadata(C || KinkyDungeonPlayer) + ))); + return true; + }, true, 715, 930, 115, 50, TextGet("KDBackupOutfits"), "#ffffff", + KinkyDungeonRootDirectory + "UI/Safe.png", "", false, false, + undefined, undefined, true); + + DrawButtonKDEx("RestoreOutfit", (_bdata) => { + getFileInput(KDLoadOutfitDirect, C); + return true; + }, true, 835, 930, 115, 50, TextGet("KDLoadOutfits"), "#ffffff", + KinkyDungeonRootDirectory + "UI/Restore.png", "", false, false, + undefined, undefined, true); + + if (KDShowCharacterPalette) { + // nyet + } else { + if (KDSelectedModel) { + KDDrawColorSliders(1625, 100, C, KDSelectedModel); + } else { + KDCurrentLayer = ""; + KDCurrentLayerOrig = ""; + KDRefreshProps = true; + } + } + + // Return anon function anonymously + let clickButton = (index: number) => { + return (_bdata: any) => { + if (C == KinkyDungeonPlayer) { + KDOutfitStore[KDCurrentOutfit] = LZString.compressToBase64(CharacterAppearanceStringify(C || KinkyDungeonPlayer, + KDGetCharMetadata(C || KinkyDungeonPlayer) + )); + KDOutfitOriginalStore[KDCurrentOutfit] = KDOriginalValue; + ElementValue("KDOutfitName", ""); + } + KDCurrentOutfit = index; + if (C == KinkyDungeonPlayer) + localStorage.setItem("kdcurrentoutfit", KDCurrentOutfit + ""); + + let NewOutfit = KDOutfitStore[KDCurrentOutfit] || localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit); + + if (NewOutfit) { + KDOriginalValue = KDOutfitOriginalStore[KDCurrentOutfit] || ""; + KinkyDungeonSetDress("None", "None", C, true); + KDRefreshCharacter.set(C, true); + KinkyDungeonDressPlayer(C, true, false, undefined, undefined, undefined, undefined, undefined, true); + let newOut = DecompressB64(NewOutfit); + CharacterAppearanceRestore(C, newOut, C != KinkyDungeonPlayer, false); + let newParsed = JSON.parse(newOut); + if (newParsed?.metadata) { + C.Palette = newParsed.metadata.palette; + } else C.Palette = ""; + CharacterRefresh(C); + KDInitProtectedGroups(C); + KDRefreshCharacter.set(C, true); + KinkyDungeonDressPlayer(C, true, undefined, undefined, undefined, + undefined, undefined, true + ); + } else if (C == KinkyDungeonPlayer) { + KDGetDressList().Default = KinkyDungeonDefaultDefaultDress; + CharacterAppearanceRestore(KinkyDungeonPlayer, + CharacterAppearanceStringify(DefaultPlayer, + KDGetCharMetadata(DefaultPlayer) + ), false, true); + CharacterReleaseTotal(KinkyDungeonPlayer); + KinkyDungeonSetDress("Default", "Default", C, true); + C.Palette = ""; + KDRefreshCharacter.set(C, true); + KinkyDungeonDressPlayer(); + KDInitProtectedGroups(KinkyDungeonPlayer); + } + return true; + }; + }; + + DrawTextFitKD(TextGet("KDLabelSaved"), 575, 75, 220, "#ffffff", KDTextGray0); + + + DrawButtonKDEx("KDOutfitSaved_V", (_bdata) => { + KDMaxOutfitsIndex += 3; + if (KDMaxOutfitsIndex > KDMaxOutfits-9) KDMaxOutfitsIndex = Math.floor(KDMaxOutfits-9); + return true; + }, true, 475, 110 + 50 * (1 + KDMaxOutfitsDisplay), 200, 45, + "", + KDModelList_Toplevel_viewindex.index + KDModelListMax < KDModelList_Toplevel_viewindex.index ? "#ffffff" : "#888888", KinkyDungeonRootDirectory + "Down.png", undefined, undefined, undefined, undefined, + undefined, undefined, { + centered: true, + }); + + DrawButtonKDEx("KDOutfitSaved_^^", (_bdata) => { + KDMaxOutfitsIndex -= 3; + if (KDMaxOutfitsIndex < 0) KDMaxOutfitsIndex = 0; + return true; + }, true, 475, 90, 200, 45, + "", + KDModelList_Toplevel_viewindex.index > 0 ? "#ffffff" : "#888888", KinkyDungeonRootDirectory + "Up.png", undefined, undefined, undefined, undefined, + undefined, undefined, { + centered: true, + }); + + for (let i = 0; i < KDOutfitInfo.length && i < KDMaxOutfitsDisplay; i++) { + let index = i + KDMaxOutfitsIndex; + + if (KDOutfitInfo[index]) + DrawButtonKDExScroll("ClickOutfit" + i, (amount) => { + if (amount > 0) { + KDMaxOutfitsIndex += 3; + if (KDMaxOutfitsIndex > KDMaxOutfits-9) KDMaxOutfitsIndex = Math.floor(KDMaxOutfits-9); + } else if (amount < 0) { + KDMaxOutfitsIndex -= 3; + if (KDMaxOutfitsIndex < 0) KDMaxOutfitsIndex = 0; + } + }, + clickButton(index), true, 475, 140 + 50 * i, 200, 45, + KDOutfitInfo[index] + (((index == KDCurrentOutfit && KDOriginalValue) || KDOutfitOriginalStore[index]) ? "(*)" : ""), + index == KDCurrentOutfit ? "#ffffff" : "#888888", "", undefined, undefined, index != KDCurrentOutfit); + + } + DrawBoxKD(450, 55, 250, 56 + (2+KDMaxOutfitsDisplay) * 50, KDButtonColor, + false, 0.5, -10); + + + DrawTextFitKD(TextGet("KDManageOutfits"), 445 + 520/2, 740, 260, "#ffffff", KDTextGray0); + DrawBoxKD(450, 710, 520, 285, KDButtonColor, false, 0.5, -10); + + + + DrawButtonKDEx("StripOutfit", (_bdata) => { + if (KDConfirmType == "strip" && KinkyDungeonReplaceConfirm > 0) { + KDChangeWardrobe(C); + CharacterReleaseTotal(C); + CharacterNaked(C); + KDRefreshCharacter.set(C, true); + if (KDCharacterDress.get(C) != "Bikini") { + KinkyDungeonSetDress("Bikini", "Bikini", C, true); + } else + KinkyDungeonSetDress("None", "None", C, true); + KinkyDungeonDressPlayer(C, true, false, undefined, undefined, undefined, undefined, undefined, true); + if (C == KinkyDungeonPlayer) { + KDInitProtectedGroups(C); + KinkyDungeonConfigAppearance = true; + } + + KinkyDungeonReplaceConfirm = 0; + return true; + } else { + KDConfirmType = "strip"; + KinkyDungeonReplaceConfirm = 2; + return true; + } + }, true, 465, 765, 240, 50, + TextGet((KinkyDungeonReplaceConfirm > 0 && KDConfirmType == 'strip') ? + "KDConfirmStrip" : + "KDDressStrip"), + "#ffffff", KinkyDungeonRootDirectory + "UI/X.png", undefined, undefined, undefined, + undefined, undefined, true); + DrawButtonKDEx("LoadFromCode", (_bdata) => { + KinkyDungeonState = "LoadOutfit"; + + + CharacterReleaseTotal(C || KinkyDungeonPlayer); + ElementCreateTextArea("saveInputField"); + ElementValue("saveInputField", LZString.compressToBase64( + AppearanceItemStringify((C || KinkyDungeonPlayer).Appearance) + )); + return true; + }, true,465, 875, 240, 50, TextGet("KinkyDungeonDressPlayerImport"), + "#ffffff", KinkyDungeonRootDirectory + "UI/Load.png", undefined, undefined, undefined, + undefined, undefined, true); + + DrawButtonKDEx("KDWardrobeCancel", (_bdata) => { + if (KDConfirmType == "revert" && KinkyDungeonReplaceConfirm > 0) { + KinkyDungeonReplaceConfirm = 0; + + if (KDWardrobeRevertCallback) KDWardrobeRevertCallback(); + else + KDRestoreOutfit(); + KDOriginalValue = ""; + return true; + } else { + KDConfirmType = "revert"; + KinkyDungeonReplaceConfirm = 2; + return true; + } + }, true, 465, 820, 240, 50, + TextGet((KinkyDungeonReplaceConfirm > 0 && KDConfirmType == 'revert') ? + "KDWardrobeCancelConfirm" : + "KDWardrobeCancel"), ((C == KinkyDungeonPlayer && KDOriginalValue) || (KDCanRevertFlag)) ? "#ffffff" : "#888888", + KinkyDungeonRootDirectory + "UI/Revert.png", undefined, undefined, undefined, + undefined, undefined, true); + if (C == KinkyDungeonPlayer) { + DrawButtonKDEx("KDWardrobeSaveOutfit", (_bdata) => { + if (KDConfirmType == "save" && KinkyDungeonReplaceConfirm > 0) { + if (ElementValue("KDOutfitName").length < 50) { + KDOutfitInfo[KDCurrentOutfit] = ElementValue("KDOutfitName"); + KDSaveOutfitInfo(); + } + KinkyDungeonReplaceConfirm = 0; + localStorage.setItem("kinkydungeonappearance" + KDCurrentOutfit, + LZString.compressToBase64( + CharacterAppearanceStringify(C || KinkyDungeonPlayer, + KDGetCharMetadata(C || KinkyDungeonPlayer) + ) + )); + //localStorage.setItem("kdcurrentoutfit", KDCurrentOutfit + ""); + KinkyDungeonDressSet(); + KDOriginalValue = ""; + KDRefreshOutfitInfo(); + return true; + } else { + KDConfirmType = "save"; + KinkyDungeonReplaceConfirm = 2; + return true; + } + }, true, 465, 930, 240, 50, + TextGet((KinkyDungeonReplaceConfirm > 0 && KDConfirmType == 'save') ? + "KDWardrobeSaveOutfitConfirm" : + "KDWardrobeSaveOutfit"), KDOriginalValue ? "#ffffff" : "#888888", + KinkyDungeonRootDirectory + "UI/Floppy.png", undefined, undefined, undefined, + undefined, undefined, true); + } else { + DrawButtonKDEx("ResetOutfit", (_bdata) => { + if (KDConfirmType == "reset" && KinkyDungeonReplaceConfirm > 0) { + if (C == KinkyDungeonPlayer) { + KDChangeWardrobe(C); + KDGetDressList().Default = KinkyDungeonDefaultDefaultDress; + CharacterAppearanceRestore(KinkyDungeonPlayer, + CharacterAppearanceStringify(DefaultPlayer, + KDGetCharMetadata(KinkyDungeonPlayer) + ), false, false + ); + CharacterReleaseTotal(KinkyDungeonPlayer); + KinkyDungeonSetDress("Default", "Default", C, true); + KinkyDungeonDressPlayer(); + KDInitProtectedGroups(KinkyDungeonPlayer); + UpdateModels(KinkyDungeonPlayer); + KinkyDungeonConfigAppearance = true; + KinkyDungeonReplaceConfirm = 0; + } else if (C == KDSpeakerNPC) { + let value = KDNPCStyle.get(KDSpeakerNPC); + if (!value) return false; + KDSpeakerNPC.Appearance = []; + delete value.customOutfit; + + let enemyType = value.Enemy || KinkyDungeonGetEnemyByName(value.type); + if (!value.bodystyle && !value.facestyle && !value.hairstyle) { + if (enemyType?.style || KinkyDungeonGetEnemyByName(value.type)?.style) { + if (KDModelStyles[enemyType?.style || KinkyDungeonGetEnemyByName(value.type)?.style]) { + let style = KDModelStyles[enemyType?.style || KinkyDungeonGetEnemyByName(value.type)?.style]; + if (!value.bodystyle && style.Bodystyle) { + value.bodystyle = style.Bodystyle[Math.floor(Math.random() * style.Bodystyle.length)]; + } + if (!value.hairstyle && style.Hairstyle) { + value.hairstyle = style.Hairstyle[Math.floor(Math.random() * style.Hairstyle.length)]; + } + if (!value.facestyle && style.Facestyle) { + value.facestyle = style.Facestyle[Math.floor(Math.random() * style.Facestyle.length)]; + } + if (!value.cosplaystyle && style.Cosplay) { + value.cosplaystyle = style.Cosplay[Math.floor(Math.random() * style.Cosplay.length)]; + } + + } + } + } + if (enemyType?.outfit || KinkyDungeonGetEnemyByName(value.type)?.outfit) { + KinkyDungeonSetDress( + value.outfit || enemyType?.outfit || KinkyDungeonGetEnemyByName(value.type)?.outfit, + value.outfit || enemyType?.outfit || KinkyDungeonGetEnemyByName(value.type)?.outfit, KDSpeakerNPC, true); + } + KDRefreshCharacter.set(KDSpeakerNPC, true); + KinkyDungeonDressPlayer(KDSpeakerNPC, true); + } + return true; + } else { + KDConfirmType = "reset"; + KinkyDungeonReplaceConfirm = 2; + return true; + } + }, true, 465, 930, 240, 50, + TextGet((KinkyDungeonReplaceConfirm > 0 && KDConfirmType == 'reset') ? + "KinkyDungeonConfirm" : + "KinkyDungeonDressPlayerReset"), + "#ffffff", + KinkyDungeonRootDirectory + "UI/Reset.png", undefined, undefined, undefined, + undefined, undefined, true); + } + + if (!Character || Character == KinkyDungeonPlayer) { + DrawButtonKDEx("KDWardrobeSave", (_bdata) => { + KinkyDungeonState = "Menu"; + KDPlayerSetPose = false; + KinkyDungeonDressSet(); + return true; + }, true, 20, 940, 400, 50, TextGet("KDWardrobeSave"), "#ffffff", ""); + } else { + DrawButtonKDEx("KDBackToGame", (_bdata) => { + KinkyDungeonState = "Game"; + KDPlayerSetPose = false; + ForceRefreshModelsAsync(C); + if (KDWardrobeCallback) KDWardrobeCallback(); + KinkyDungeonDressSet(C); + return true; + }, true, 20, 942, 400, 50, TextGet("KDBackToGame"), "#ffffff", ""); + + } + + + if (TestMode && !KDClipboardDisabled && C == KinkyDungeonPlayer) { + DrawButtonKDEx("KDCreateOutfit", (_bdata) => { + let exportData = []; + if (C?.Appearance) + for (let a of C.Appearance) { + // FIXME: Cosplay is not defined in Model + if (a.Model && !(KDModelIsProtected(a.Model)) && !a.Model.Restraint && !a.Model['Cosplay']) { + exportData.push({ + Item: a.Model.Name, + Group: a.Model.Group || a.Model.Name, + Color: "#ffffff", + Lost: false, + Filters: a.Model.Filters, + Properties: a.Model.Properties, + },); + } + } + navigator.clipboard.writeText(JSON.stringify(exportData)); + return true; + }, true, 945, 950, 100, 60, + TextGet("KDCreateOutfit"), "#99ff99", ""); + DrawButtonKDEx("KDCreateAlwaysDress", (_bdata) => { + let exportData: alwaysDressModel[] = []; + if (C?.Appearance) + for (let a of C.Appearance) { + // FIXME: Cosplay is not defined in Model + if (a.Model && !KDModelIsProtected(a.Model) && !a.Model.Restraint && !a.Model['Cosplay']) { + exportData.push({ + Model: a.Model.Name, + Group: a.Model.Group || a.Model.Name, + override: true, + Filters: a.Model.Filters, + Properties: a.Model.Properties, + factionFilters: {}, + inheritFilters: false, + },); + } + } + navigator.clipboard.writeText(JSON.stringify(exportData)); + return true; + }, true, 945, 890, 100, 60, + TextGet("KDCreateAlwaysDress"), "#99ff99", ""); + + + DrawButtonKDEx("KDCreateFace", (_bdata) => { + let exportData = []; + if (C?.Appearance) + for (let a of C.Appearance) { + if (a.Model && KDModelIsProtected(a.Model) && (a.Model.Categories?.includes("Face") && !a.Model.Categories?.includes("Hair") && !a.Model.Categories?.includes("Cosplay"))) { + exportData.push({ + Item: a.Model.Name, + Group: a.Model.Group || a.Model.Name, + Color: "#ffffff", + Lost: false, + Filters: a.Model.Filters, + Properties: a.Model.Properties, + },); + } + } + navigator.clipboard.writeText(JSON.stringify(exportData)); + return true; + }, true, 945, 710, 100, 60, + TextGet("KDCreateFace"), "#99ff99", ""); + DrawButtonKDEx("KDCreateHair", (_bdata) => { + let exportData = []; + if (C?.Appearance) + for (let a of C.Appearance) { + if (a.Model && KDModelIsProtected(a.Model) && (a.Model.Categories?.includes("Hairstyles") && !a.Model.Categories?.includes("Cosplay"))) { + exportData.push({ + Item: a.Model.Name, + Group: a.Model.Group || a.Model.Name, + Color: "#ffffff", + Lost: false, + Filters: a.Model.Filters, + Properties: a.Model.Properties, + },); + } + } + navigator.clipboard.writeText(JSON.stringify(exportData)); + return true; + }, true, 945, 830, 100, 60, + TextGet("KDCreateHair"), "#99ff99", ""); + DrawButtonKDEx("KDCreateCosplay", (_bdata) => { + let exportData = []; + if (C?.Appearance) + for (let a of C.Appearance) { + if (a.Model && KDModelIsProtected(a.Model) && (a.Model.Categories?.includes("Cosplay"))) { + exportData.push({ + Item: a.Model.Name, + Group: a.Model.Group || a.Model.Name, + Color: "#ffffff", + Lost: false, + Filters: a.Model.Filters, + Properties: a.Model.Properties, + },); + } + } + navigator.clipboard.writeText(JSON.stringify(exportData)); + return true; + }, true, 945, 770, 100, 60, + TextGet("KDCreateCosplay"), "#99ff99", ""); + } + + KDWardrobeToolsDraw(Character); + +} + +let KDToolsDisplayPoses = false; + + +let KDWardrobeCallback = null; +let KDWardrobeRevertCallback = null; +let KDWardrobeResetCallback = null; + +function KDSaveCodeOutfit(C: Character, clothesOnly: boolean = false): void { + if (!C) C = KinkyDungeonPlayer; + // Save outfit + KDChangeWardrobe(C); + let decompressed = DecompressB64(ElementValue("saveInputField")); + if (decompressed) { + + // Strips first + KDChangeWardrobe(C); + CharacterReleaseTotal(C); + CharacterNaked(C); + KDRefreshCharacter.set(C, true); + KinkyDungeonSetDress("None", "None", C, true); + KinkyDungeonDressPlayer(C, true); + KDInitProtectedGroups(C); + KinkyDungeonConfigAppearance = true; + KinkyDungeonReplaceConfirm = 0; + + // Then decompresses + CharacterAppearanceRestore(C, decompressed, clothesOnly, !clothesOnly); + CharacterRefresh(C); + KDInitProtectedGroups(C); + } + + KDRefreshCharacter.set(C, true); + KinkyDungeonDressPlayer(C, true, undefined, undefined, undefined, undefined, undefined, true); + + + //KinkyDungeonNewDress = true; +} + +function KDRestoreOutfit() { + // Restore the original outfit + if (KDOriginalValue) { + CharacterAppearanceRestore(KinkyDungeonPlayer, DecompressB64(KDOriginalValue) || KDOriginalValue, false, true); + CharacterRefresh(KinkyDungeonPlayer); + KDInitProtectedGroups(KinkyDungeonPlayer); + KinkyDungeonDressPlayer(); + } +} + +function KDSaveOutfitInfo() { + localStorage.setItem("kdOutfitMeta", JSON.stringify(KDOutfitInfo)); +} + +function KDRefreshOutfitInfo() { + let loaded = JSON.parse(localStorage.getItem("kdOutfitMeta")); + if (!(loaded?.length) || typeof loaded === 'string') { + loaded = []; + } + if (loaded?.length != undefined) { + KDOutfitInfo = loaded; + if (loaded.length < KDMaxOutfits) { + for (let i = 1; i <= KDMaxOutfits; i++) { + if (i > loaded.length) { + KDOutfitInfo.push("Outfit" + i); + } + } + } + } +} + + +/** + * Converts an HSL color value to RGB. Conversion formula + * adapted from https://en.wikipedia.org/wiki/HSL_color_space. + * Assumes h, s, and l are contained in the set [0, 1] and + * returns r, g, and b in the set [0, 255]. + * + * @param h The hue + * @param s The saturation + * @param l The lightness + * @return The RGB representation + */ +function hslToRgb(h: number, s: number, l: number): number[] { + let r: number, g: number, b: number; + + if (s === 0) { + r = g = b = l; // achromatic + } else { + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + r = hueToRgb(p, q, h + 1/3); + g = hueToRgb(p, q, h); + b = hueToRgb(p, q, h - 1/3); + } + + return [ + Math.round(r * 255), + Math.round(g * 255), + Math.round(b * 255) + ]; +} + +function hueToRgb(p: number, q: number, t: number): number { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1/6) return p + (q - p) * 6 * t; + if (t < 1/2) return q; + if (t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; +} + +/** + * Converts an RGB color value to HSL. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes r, g, and b are contained in the set [0, 1] and + * returns h, s, and l in the set [0, 1]. + * + * @param r The red color value + * @param g The green color value + * @param b The blue color value + * @return The HSL representation + */ +function rgbToHsl(r: number, g: number, b: number): number[] { + const vmax = Math.max(r, g, b), + vmin = Math.min(r, g, b); + let h: number, s: number, l: number = (vmax + vmin) / 2; + + if (vmax === vmin) { + return [0, 0, l]; // achromatic + } + + const d = vmax - vmin; + s = l > 0.5 ? d / (2 - vmax - vmin) : d / (vmax + vmin); + if (vmax === r) h = (g - b) / d + (g < b ? 6 : 0); + if (vmax === g) h = (b - r) / d + 2; + if (vmax === b) h = (r - g) / d + 4; + h /= 6; + + return [h, s, l]; +} + +let KDVisualBrightness = 0.5; + + + +function KDLoadOutfit(files: File[]) { + for (let f of files) { + if (f && f.name) { + if (f.name.endsWith(KDOUTFITEXTENSION) || f.name.endsWith(KDOUTFITBACKUP) || f.name.endsWith('.txt')) { + let str = ""; + KDSaveName = f.name; + try { + const reader = new FileReader(); + reader.addEventListener('load', (event) => { + str = event.target.result.toString(); + ElementValue("saveInputField", + str + ); + }); + reader.readAsText(f); + } catch (err) { + console.log (err); + } + return; + } + } + } +} +function KDLoadOutfitDirect(files: File[], Char: Character) { + for (let f of files) { + if (f && f.name) { + if (f.name.endsWith(KDOUTFITEXTENSION) || f.name.endsWith(KDOUTFITBACKUP) || f.name.endsWith('.txt')) { + let str = ""; + KDSaveName = f.name; + try { + const reader = new FileReader(); + reader.addEventListener('load', (event) => { + str = event.target.result.toString(); + + let decompressed = DecompressB64(str); + if (decompressed) { + let origAppearance = Char.Appearance; + try { + CharacterAppearanceRestore(Char, decompressed, Char == KDSpeakerNPC, Char != KDSpeakerNPC); + let newParsed = JSON.parse(decompressed); + if (newParsed && newParsed.metadata) { + Char.Palette = newParsed.metadata.palette; + } + CharacterRefresh(Char); + KDOldValue = str; + KDInitProtectedGroups(Char); + KinkyDungeonDressPlayer(Char, true, undefined, undefined, undefined, undefined, undefined, true); + + if (Char.Appearance.length == 0) + throw new DOMException(); + } catch (e) { + Char.Appearance = origAppearance; + } + } + }); + reader.readAsText(f); + } catch (err) { + console.log (err); + } + return; + } + } + } +} + +/** + * @param C + */ +function KDGetCharMetadata(C: Character): KDOutfitMetadata { + return { + name: C.Name, + palette: C.Palette, + }; +} + + + + +function KDDrawWardrobeToolsButtons(X, Y, C, Model) { + //Hardocded numbers, check if they've been changed in the future updates in KDDrawColorSliders(); + let YY = Y; + let yOff = KDDebugMode ? -80 : -40; + let width = 300; + if (Model && KDPropsSlider) { + //Pivot-to-Mouse button + DrawButtonKDEx("KDWToolsButton1", (bdata) => { + KDWToolsPivotAimEnabled = !KDWToolsPivotAimEnabled; + KDWToolsPivotAim2 = false; + return true; + }, true, X + width/2 + 10, YY + yOff, 30, 30, undefined, "#ffffff", "Game/UI/Aim.png", + undefined, false, false, KDWToolsPivotAimEnabled ? KDBorderColor : KDButtonColor, + undefined, undefined, {hotkeyPress: KDHotkeyToText('ControlLeft')}); + //Grab toggle button + DrawButtonKDEx("KDWToolsButton2", (bdata) => { + KDWToolsDraggingEnabled = !KDWToolsDraggingEnabled; + return true; + }, true, X + 3*width/4 - 10, YY + yOff, 30, 30, undefined, "#ffffff", + "Game/UI/Grab" + (KDWToolsDraggingEnabled ? "Closed" : "Open") + ".png", + undefined, false, false, KDWToolsDraggingEnabled ? KDBorderColor : KDButtonColor); + //Reserved button + DrawButtonKDEx("KDWToolsButton3", (bdata) => { + KDWToolsDrawSettingsMenuEnabled = !KDWToolsDrawSettingsMenuEnabled; + return true; + }, true, X + width - 30, YY + yOff, 30, 30, undefined, "#ffffff", "Game/UI/Wrench.png", + undefined, false, false, KDWToolsDrawSettingsMenuEnabled ? KDBorderColor : KDButtonColor); + + //Tooltips + for (let i = 1; i <= 3; i++) + if (MouseInKD("KDWToolsButton" + i)) + DrawTextFitKD(TextGet("KDWToolsButton" + i), X + 3*width/4 + 5, + YY + yOff - 15, width/2 + 50, "#ffffff", KDTextGray0); + + //Settings menu + if(KDWToolsDrawSettingsMenuEnabled) + KDWToolsDrawSettingsMenu(X, Y, C, Model, width); + } +} + + +function KDWardrobeToolsDraw(C: Character) { + let Zoom = 1; + if (!C) C = KinkyDungeonPlayer; + + if (KDSelectedModel) { + if (!KDSelectedModel.Properties) KDSelectedModel.Properties = {}; + if (!KDSelectedModel.Properties[KDCurrentLayer]) + KDSelectedModel.Properties[KDCurrentLayer] = Object.assign({}, KDProps); + let CurrentLayer = KDSelectedModel.Properties[KDCurrentLayer] + if (CurrentLayer && KDSelectedModel.Layers[KDCurrentLayerOrig]) { + if (KDWToolsPivotAimRefresh) { + let parent = ""; + let l = LayerLayer(KDCurrentModels.get(C), + KDSelectedModel.Layers[KDCurrentLayerOrig], + KDSelectedModel, + []); + if (LayerProperties[l]) parent = LayerProperties[l].Parent; + else parent = "Torso"; + CenterPivotToMouse(C, CurrentLayer, parent); + } + if (KDWToolsDraggingRefresh) + ApplyDragDisplacement(C, CurrentLayer); + let parent = ""; + let l = LayerLayer(KDCurrentModels.get(C), + KDSelectedModel.Layers[KDCurrentLayerOrig], + KDSelectedModel, + []); + if (LayerProperties[l]) parent = LayerProperties[l].Parent; + else parent = "Torso"; + KDWToolsDrawPivotPoint(C, CurrentLayer, Zoom, parent); + return true; + } + } + KDWToolsPivotAimRefresh = false; +} + + +//Pivot positioning +//Two flags are required because the first one is caught by the button itself. +let KDWToolsPivotAimEnabled = false; +let KDWToolsPivotAim2 = false; +let KDWToolsPivotAimRefresh = false; + + +//Set pivot location to the mouse pointer +function CenterPivotToMouse(C: Character, CurrentLayer: LayerPropertiesType, Parent?: string) { + let Zoom = 1; + //Translate Mouse coordinates to canvas coordinates + let X_Pivot = MouseX; + let Y_Pivot = MouseY; + + //if (KDToggles.FlipPlayer) X_Pivot = MODELWIDTH - X_Pivot; + + //Consider offsets from poses (like hogtie) + /*let {X_Offset, Y_Offset} = ModelGetPoseOffsets(KDCurrentModels.get(C).Poses, KDToggles.FlipPlayer); +*/ + + let {x, y, angle} = GetModelLocInverse(C, 0, 0, Zoom, { + Angle: 0, + Parent: Parent || "Torso", + X: X_Pivot, + Y: Y_Pivot, + }, KDToggles.FlipPlayer); + let XX_Pivot = x; + let YY_Pivot = y; + + // Rotation mod from poses + //let {rotation, X_Anchor, Y_Anchor} = ModelGetPoseRotation(KDCurrentModels.get(C).Poses); + // let angle = rotation * Math.PI / 180; + // if (KDToggles.FlipPlayer) angle = -angle; + // let XX_Pivot = X_OFFSET_POSE * Math.cos(angle) - Y_OFFSET_POSE * Math.sin(angle); + // let YY_Pivot = Y_OFFSET_POSE * Math.cos(angle) + X_OFFSET_POSE * Math.sin(angle); + + + //Round to two decimal places + let XOffset = Math.round((parseFloat('' + CurrentLayer.XOffset) || 0)*100)/100; + let YOffset = Math.round((parseFloat('' + CurrentLayer.YOffset) || 0)*100)/100; + let XPivot = Math.round((parseFloat('' + CurrentLayer.XPivot) || 0)*100)/100; + let YPivot = Math.round((parseFloat('' + CurrentLayer.YPivot) || 0)*100)/100; + let XScale = Math.round((parseFloat('' + CurrentLayer.XScale) || 1)*100)/100; + let YScale = Math.round((parseFloat('' + CurrentLayer.YScale) || 1)*100)/100; + let Rotation = Math.round((parseFloat('' + CurrentLayer.Rotation) || 0)*100)/100; + + KDChangeWardrobe(C); + + //Keep relative offsets + CurrentLayer.XOffset = Math.round((XOffset + XX_Pivot - XPivot)*100)/100; + CurrentLayer.YOffset = Math.round((YOffset + YY_Pivot - YPivot)*100)/100; + CurrentLayer.XPivot = Math.round((XX_Pivot)*100)/100;; + CurrentLayer.YPivot = Math.round((YY_Pivot)*100)/100;; + + KDCurrentModels.get(C).Models.set(KDSelectedModel.Name, JSON.parse(JSON.stringify(KDSelectedModel))); + KDRefreshProps = true; + lastGlobalRefresh = CommonTime() - GlobalRefreshInterval + 10; + ForceRefreshModels(C); + KDWToolsPivotAimRefresh = false; +} + +//Draw red circle at the pivot location +function KDWToolsDrawPivotPoint(C: Character, CurrentLayer: LayerPropertiesType, Zoom: number, Parent: string) { + //Transform model coordiantes to screen coordinates + if (!CurrentLayer.XPivot || !CurrentLayer.YPivot) return; + let X_Pivot = CurrentLayer.XPivot || 0; + let Y_Pivot = CurrentLayer.YPivot || 0; + let X_Offset = CurrentLayer.XOffset || 0; + let Y_Offset = CurrentLayer.YOffset || 0; + + //if (KDToggles.FlipPlayer) X_Pivot = (MODELWIDTH + MODEL_XOFFSET * 2 - X_Pivot); + + //Consider offsets from poses (like hogtie) + let {x, y, angle} = GetModelLoc(C, 0, 0, Zoom, { + Angle: 0, + Parent: Parent || "Torso", + X: X_Offset, + Y: Y_Offset, + }, KDToggles.FlipPlayer); + + + //let {X_Offset, Y_Offset} = ModelGetPoseOffsets(KDCurrentModels.get(KinkyDungeonPlayer).Poses, KDToggles.FlipPlayer); + + //let XX_Pivot = X_Pivot + MODELWIDTH * X_Offset * MODEL_SCALE * Zoom; + //let YY_Pivot = Y_Pivot + MODELHEIGHT * Y_Offset * MODEL_SCALE * Zoom; + let XX_Pivot = x; + let YY_Pivot = y; + + //console.log("WardrobeTools.ks - X_Offset: " + X_Offset); + //console.log("WardrobeTools.ks - Y_Offset: " + Y_Offset); + + // Rotation mod from poses + // let {rotation, X_Anchor, Y_Anchor} = ModelGetPoseRotation(KDCurrentModels.get(KinkyDungeonPlayer).Poses); + // let angle = -rotation * Math.PI / 180; + // XX_Pivot = X_Pivot * Math.cos(angle) + Y_Pivot * Math.sin(angle); + // YY_Pivot = Y_Pivot * Math.cos(angle) + X_Pivot * Math.sin(angle); + + //Draw pivot point for the current model layer + let Radius = 4; + FillCircleKD(kdcanvas, kdpixisprites, "pivotpoint", { + Left: XX_Pivot, + Top: YY_Pivot, + Radius: Radius, + Color: "red", + zIndex: 10, + alpha: 0.8, + }); + FillCircleKD(kdcanvas, kdpixisprites, "pivotpointbg", { + Left: XX_Pivot, + Top: YY_Pivot, + Radius: Radius + 2, + Color: "white", + zIndex: 9, + alpha: 0.8, + }); +} + +//Grabbable layers +let KDWToolsDraggingEnabled = false; +let KDWToolsIsDraggingNow = false; +let KDWToolsDraggingDelta = {x: 0, y: 0, Scroll: 0, zIndex: 0}; +let KDWToolsDraggingRefresh = false; +let KDWToolsDraggingScrollRefresh = false; +let KDWToolsDraggingShiftKey = false; +let KDWToolsDraggingCtrlKey = false; + + +window.addEventListener('click', function(event) { + if (KinkyDungeonState != 'Wardrobe') return; + if (KDWToolsPivotAimEnabled) { + if (KDWToolsPivotAim2) { + KDWToolsPivotAimRefresh = true; + KDWToolsPivotAimEnabled = false; + KDWToolsPivotAim2 = false; + KDRefreshProps = true; + } else KDWToolsPivotAim2 = true; + } +}); + +window.addEventListener('mousedown', function(event) { + if (KinkyDungeonState != 'Wardrobe') return; + //console.log("WardrobeTools.ks - KDWToolsDraggingEnabled: "+KDWToolsDraggingEnabled); + if (KDWToolsDraggingEnabled && MouseIn(0, 0, 500, 1000) && KDCurrentLayer) { + KDWToolsIsDraggingNow = true; + KDWToolsDraggingDelta.zIndex = 0; + } +}); + +window.addEventListener('mousemove', function(event) { + if (KinkyDungeonState != 'Wardrobe') return; + //console.log("WardrobeTools.ks - KDWToolsIsDraggingNow: "+KDWToolsIsDraggingNow); + //console.log("WardrobeTools.ks - KDWToolsDraggingDelta: "+KDWToolsDraggingDelta); + if (KDWToolsDraggingEnabled && KDWToolsIsDraggingNow) { + //scaled to the window size + KDWToolsDraggingDelta.x += event.movementX * CanvasWidth / PIXICanvas.clientWidth; + KDWToolsDraggingDelta.y += event.movementY * CanvasHeight / PIXICanvas.clientHeight; + KDWToolsDraggingRefresh = true; + } +}); + +window.addEventListener('mouseup', function(event) { + if (KinkyDungeonState != 'Wardrobe') return; + //console.log("WardrobeTools.ks - KDWToolsDraggingDelta: "+KDWToolsDraggingDelta); + if (KDWToolsDraggingEnabled && KDWToolsIsDraggingNow) { + KDWToolsIsDraggingNow = false; + KDWToolsDraggingDelta.x = 0; + KDWToolsDraggingDelta.y = 0; + KDWToolsDraggingLazyRefresh = 0; + KDRefreshProps = true; + } +}); + + +window.addEventListener('wheel', function(event) { + if (KinkyDungeonState != 'Wardrobe') return; + if ((MouseOverChar())) { + KDWToolsDraggingDelta.Scroll += event.deltaY > 0 ? -1 : event.deltaY < 0 ? 1 : 0; + KDWToolsDraggingShiftKey = event.shiftKey; + KDWToolsDraggingCtrlKey = event.ctrlKey; + KDWToolsDraggingRefresh = true; + KDWToolsDraggingScrollRefresh = true; + } +}); + +let KDWToolsDraggingLazyRefresh = 0; + +//Calculations of properties while drag-moving +function ApplyDragDisplacement(C, CurrentLayer) { + let Zoom = 1; + let Flip = KDToggles.FlipPlayer ? -1 : 1; + let X_OFFSET = Flip * (KDWToolsDraggingDelta.x / (MODEL_SCALE * Zoom)); + let Y_OFFSET = KDWToolsDraggingDelta.y / (MODEL_SCALE * Zoom); + //console.log("WardrobeTools.ks - ApplyDragDisplacement"); + + //Consider rotation from poses (like hogtie) + let {rotation} = ModelGetPoseRotation(KDCurrentModels.get(C).Poses); + let angle = -rotation * Math.PI / 180; + //0 = x=x, y=y + //90 = x=-y,y=x + //180= x=-x,y=-y + //270= x=y, y=-x + let XX_OFFSET = X_OFFSET * Math.cos(angle) - Y_OFFSET * Math.sin(angle); + let YY_OFFSET = Y_OFFSET * Math.cos(angle) + X_OFFSET * Math.sin(angle); + + //Round to two decimal places + let XOffset = Math.round((parseFloat(CurrentLayer.XOffset) || 0)*100)/100; + let YOffset = Math.round((parseFloat(CurrentLayer.YOffset) || 0)*100)/100; + let XPivot = Math.round((parseFloat(CurrentLayer.XPivot) || 0)*100)/100; + let YPivot = Math.round((parseFloat(CurrentLayer.YPivot) || 0)*100)/100; + let XScale = Math.round((parseFloat(CurrentLayer.XScale) || 1)*100)/100; + let YScale = Math.round((parseFloat(CurrentLayer.YScale) || 1)*100)/100; + let Rotation = Math.round((parseFloat(CurrentLayer.Rotation) || 0)*100)/100; + let LayerBonus = Math.round((parseFloat(CurrentLayer.LayerBonus) || 0)*100)/100; + + KDChangeWardrobe(C); + CurrentLayer.XOffset = Math.round((XOffset + XX_OFFSET)*100)/100; + CurrentLayer.YOffset = Math.round((YOffset + YY_OFFSET)*100)/100; + //CurrentLayer.XPivot = XPivot + X_OFFSET; + //CurrentLayer.YPivot = YPivot + Y_OFFSET; + + //console.log("WardrobeTools.ks - KinkyDungeonKeybindingCurrentKey: " + KinkyDungeonKeybindingCurrentKey); + //console.log("WardrobeTools.ks - KDWToolsDraggingShiftKey: " + KDWToolsDraggingShiftKey); + //console.log("WardrobeTools.ks - KDWToolsDraggingCtrlKey: " + KDWToolsDraggingCtrlKey); + if (KDWToolsDraggingDelta.Scroll) + { + if (KDWToolsToggleScrollMode == "Layer Bonus") + { + //fine adjustment with Shift + if (KDWToolsDraggingShiftKey) + CurrentLayer.LayerBonus = LayerBonus + KDWToolsDraggingDelta.Scroll + else { + //Increment in powers of 10 while keeping the smaller part + //10501 + // let t = (LayerBonus != 0) ? Math.trunc(Math.sign(LayerBonus) * Math.log10(Math.abs(LayerBonus))) : 0; // 4 + // let tt = (t != 0) ? Math.sign(t) * 10 ** Math.abs(t) : 0 ; // 10000 + // let buf = (tt != 0) ? LayerBonus % tt : 0; // 501 + // t = t + KDWToolsDraggingDelta.Scroll; //5 + // t = (t != 0) ? Math.sign(t) * 10 ** Math.abs(t) : 0 ; // 100000 + let t = ((LayerBonus != 0) ? (Math.trunc(Math.sign(LayerBonus) * Math.log10(Math.abs(LayerBonus)))) : 0); + // In case current LayerBonus is like 9999 we don't skip a 1000. + if (Math.abs(LayerBonus) >= 2 * (10 ** Math.abs(t))) t = Math.sign(t) * (Math.abs(t) + 1); + t = KDWToolsDraggingDelta.Scroll + t; + CurrentLayer.LayerBonus = (t != 0) ? Math.sign(t) * 10 ** Math.abs(t) : 0; // 501 + 100000 = 100501 + } + } + else if (KDWToolsToggleScrollMode == "Rotation") + { + //fine adjustment with Shift and Ctrl + let RotationScale = KDWToolsDraggingCtrlKey ? 0.1 : (KDWToolsDraggingShiftKey ? 1 : 5); + CurrentLayer.Rotation = Math.round((Rotation + KDWToolsDraggingDelta.Scroll*RotationScale)*100)/100; + } + else if (KDWToolsToggleScrollMode == "Scale") + { + let tempXScale; + let tempYScale; + if (KDWToolsDraggingShiftKey) { //floating point hurr durr + tempXScale = Math.round((XScale + Math.sign(XScale)*KDWToolsDraggingDelta.Scroll/100)*100)/100; + tempYScale = YScale; + } + else if (KDWToolsDraggingCtrlKey) { + tempXScale = XScale; + tempYScale = Math.round((YScale + Math.sign(YScale)*KDWToolsDraggingDelta.Scroll/100)*100)/100; + } + else { + tempXScale = Math.round((XScale + Math.sign(XScale)*KDWToolsDraggingDelta.Scroll/100)*100)/100; + tempYScale = Math.round((YScale + Math.sign(YScale)*KDWToolsDraggingDelta.Scroll/100)*100)/100; + } + //Jump over 0 to avoid reset to 1; + if (tempXScale == 0) tempXScale = -XScale; + if (tempYScale == 0) tempYScale = -YScale; + CurrentLayer.XScale = tempXScale; + CurrentLayer.YScale = tempYScale; + } + } + KDWToolsDraggingDelta.x = 0; + KDWToolsDraggingDelta.y = 0; + KDWToolsDraggingDelta.Scroll = 0; + + if (KDWToolsDraggingLazyRefresh++ >= 10 || KDWToolsDraggingScrollRefresh) { + KDRefreshProps = true; + KDWToolsDraggingLazyRefresh = 0; + } + lastGlobalRefresh = CommonTime() - GlobalRefreshInterval + 10; + KDCurrentModels.get(C).Models.set(KDSelectedModel.Name, JSON.parse(JSON.stringify(KDSelectedModel))); + ForceRefreshModels(C); + KDWToolsDraggingRefresh = false; + KDWToolsDraggingScrollRefresh = false; +} + +let KDWToolsDrawSettingsMenuEnabled = false; + +function KDWToolsDrawSettingsMenu(X, Y, C, Model, Width) { + Y += 35; + let zIndex = 150 + + DrawBoxKD(X, Y, Width, 520, "rgba(10, 10, 10, 0.5)", + false, 1, zIndex - 10); + + let fields = KDGetLayerPropFields(); + //Hide property fields + for (let field in fields) { + let f = document.getElementById("KDPropField"+field); + // sudo + //@ts-ignore + if (f) f.style = "display: none"; + KDDrawnElements.delete("KDPropField"+field); + } + let II = 0; + KDWToolsDrawOptionEntry(X+5, Y+5 + 45*II++, Width-10, 40, TextGet("KDWToolsToggleScrollModeText") + KDWToolsToggleScrollMode, + () => { KDWToolsToggleScrollModeIndex = (KDWToolsToggleScrollModes.length + KDWToolsToggleScrollModeIndex - 1) % KDWToolsToggleScrollModes.length; + KDWToolsToggleScrollMode = KDWToolsToggleScrollModes[KDWToolsToggleScrollModeIndex]; + localStorage.setItem("WToolsScrollMode", KDWToolsToggleScrollModeIndex + ''); + //console.log("WardrobeTools.ks - KDWToolsToggleScrollMode: " + KDWToolsToggleScrollMode) + return true; + }, + () => { KDWToolsToggleScrollModeIndex = (KDWToolsToggleScrollModeIndex + 1) % KDWToolsToggleScrollModes.length, + KDWToolsToggleScrollMode = KDWToolsToggleScrollModes[KDWToolsToggleScrollModeIndex] + localStorage.setItem("WToolsScrollMode", KDWToolsToggleScrollModeIndex + ''); + return true; + //console.log("WardrobeTools.ks - KDWToolsToggleScrollMode: " + KDWToolsToggleScrollMode) + }, + zIndex, 0.5); + KDWToolsDrawOptionEntry(X+5, Y+5 + 45*II++, Width-10, 40, TextGet("KDWToolsToggleScrollModeText") + KDWToolsToggleScrollMode, + () => { KDWToolsLayerAbbrModeIndex = (KDWToolsLayerAbbrModes.length + KDWToolsLayerAbbrModeIndex - 1) % KDWToolsLayerAbbrModes.length; + KDWToolsLayerAbbrMode = KDWToolsLayerAbbrModes[KDWToolsLayerAbbrModeIndex]; + localStorage.setItem("WToolsLayerAbbr", KDWToolsLayerAbbrModeIndex + ''); + //console.log("WardrobeTools.ks - KDWToolsLayerAbbrMode: " + KDWToolsLayerAbbrMode) + return true; + }, + () => { KDWToolsLayerAbbrModeIndex = (KDWToolsLayerAbbrModeIndex + 1) % KDWToolsLayerAbbrModes.length, + KDWToolsLayerAbbrMode = KDWToolsLayerAbbrModes[KDWToolsLayerAbbrModeIndex] + localStorage.setItem("WToolsLayerAbbr", KDWToolsLayerAbbrModeIndex + ''); + return true; + //console.log("WardrobeTools.ks - KDWToolsLayerAbbrMode: " + KDWToolsLayerAbbrMode) + }, + zIndex, 0.5); +} + +//Draw a horizontal selectable option in the format of "< Label >" +function KDWToolsDrawOptionEntry(X, Y, Width, Height, Label, funcPrev, funcNext, zIndex = undefined, alpha = 0.5) { + let ArrowWidth = Width*0.1; //in % of Width + + DrawBoxKD(X, Y, Width, Height, KDButtonColor, false, undefined, zIndex - 10); + + //DrawButtonKDEx(name, func, enabled, Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, options) { + DrawButtonKDEx("KDWTools_"+Label+"<", funcPrev, true, X, Y, ArrowWidth, Height, "<", "#ffffff", + undefined, undefined, undefined, undefined, undefined, undefined, undefined, {zIndex: zIndex}); + + DrawTextFitKD(Label, X + Width/2, Y + Height/2, Width - ArrowWidth*2, "#ffffff", "#000000", 30, "center", zIndex); + + DrawButtonKDEx("KDWTools_"+Label+">", funcNext, true, X + Width - ArrowWidth, Y, ArrowWidth, Height, ">", "#ffffff", + undefined, undefined, undefined, undefined, undefined, undefined, undefined, {zIndex: zIndex}); +} + + +function KDGetLayerPropFields(): Record { + return { + "XOffset": "0", + "YOffset": "0", + "XPivot": "0", + "YPivot": "0", + "XScale": "1", + "YScale": "1", + "Rotation": "0", + "LayerBonus": "0", + "Protected": "0", + "SuppressDynamic": "0", + "HideOverridden": "0", + "NoOverride": "0", + "ExtraHidePoses": ",", + "ExtraRequirePoses": ",", + ExtraHidePrefixPose: ",", + ExtraHidePrefixPoseSuffix: ",", + AddPose: ",", + DisplaceAmount: "1", + EraseAmount: "1", + }; +} + +/** TODO */ +function KDGetAbbreviations(context?: string) { + return { + Right: "R", + Left: "L", + Dress: "Drs.", + Spread: "_Sprd", + Closed: "_Closed", + Hogtie: "_HogT", + Kneel: "_Knl", + KneelClosed: "_KnlCl", + Yoked: "_Yoke", + Free: "_Free", + Boxtie: "_Box", + Wristtie: "_Wrst", + Up: "_Up", + Crossed: "_Cross", + Front: "_Front", + } +} + +function KDAbbreviate(str: string, context?: string) { + let abbreviations = KDGetAbbreviations(context); + + for (let i = 0; i < 1; i++) { + let found = false; + + for (let entry of Object.entries(abbreviations)) { + if (str.includes(entry[0])) { + found = true; + str = str.replace(entry[0], entry[1]); + } + } + + if (!found) break; + } + return str; +} \ No newline at end of file diff --git a/Game/src/player/KinkyDungeonDress.ts b/Game/src/player/KinkyDungeonDress.ts new file mode 100644 index 000000000..2568d3e51 --- /dev/null +++ b/Game/src/player/KinkyDungeonDress.ts @@ -0,0 +1,1033 @@ +"use strict"; + +let KDNaughtySetting = false; + +// For cacheing +let KinkyDungeonOutfitCache = new Map(); + +/** Contains protected zones */ +let KDProtectedCosplay: string[] = []; + +/** + * @param item + */ +function KDOutfit(item: Named): outfit { + return KinkyDungeonOutfitCache.get(item.name); +} + +function KinkyDungeonRefreshOutfitCache() { + KinkyDungeonOutfitCache = new Map(); + for (let r of KinkyDungeonOutfitsBase) { + KinkyDungeonOutfitCache.set(r.name, r); + } +} + +/** + * These priorities override the default BC + */ +let KDClothOverrides: Record> = { + "Cloth": { + "SleevelessTop": 24.9, + }, +}; + +// Default dress (witch hat and skirt and corset) +let KinkyDungeonDefaultDefaultDress: KinkyDungeonDress = [ + {Item: "WitchHat1", Group: "Hat", Color: "Default", Lost: false}, + {Item: "LeatherCorsetTop1", Group: "Cloth", Color: "Default", Lost: false}, + {Item: "LatexSkirt1", Group: "ClothLower", Color: "Default", OverridePriority: 17, Lost: false, Skirt: true}, + {Item: "Socks4", Group: "Socks", Color: "#444444", Lost: false}, + {Item: "Heels3", Group: "Shoes", Color: "#222222", Lost: false}, + {Item: "KittyPanties1", Group: "Panties", Color: "#222222", Lost: false}, + {Item: "FullLatexBra", Group: "Bra", Color: "Default", Lost: false}, + {Item: "LatexElbowGloves", Group: "Gloves", Color: "Default", Lost: false}, + {Item: "Necklace4", Group: "Necklace", Color: "#222222", Lost: false}, +]; + +// This is a flag that checks if the script should check for clothes loss +let KinkyDungeonCheckClothesLoss = false; + +function KDGetDressList() { + if (StandalonePatched) return KDModelDresses; + return KinkyDungeonDresses; +} + +// Return all dresses so theres no longer any Lost items +function KinkyDungeonInitializeDresses() { + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonUndress = 0; + if (Object.values(KDGetDressList()).length > 0) { + for (let d of Object.values(KDGetDressList())) { + for (let dd of d) { + if (dd.Lost) dd.Lost = false; + } + } + } + +} + +let KinkyDungeonNewDress = false; + +// Sets the player's dress to whatever she is wearing +function KinkyDungeonDressSet(C?: Character) { + if (KinkyDungeonNewDress) { + KDGetDressList().Default = []; + if (!C) C = KinkyDungeonPlayer; + + for (let A = 0; A < C.Appearance.length; A++) { + let save = false; + if (StandalonePatched) { + if (C.Appearance[A].Model && KDModelIsProtected(C.Appearance[A].Model)) save = true; + if (!C.Appearance[A].Model?.Restraint) save = true; + if (save) { + KDGetDressList().Default.push({ + Item: C.Appearance[A].Model?.Name || C.Appearance[A].Asset?.Name, + Group: C.Appearance[A].Model?.Group, + Filters: C.Appearance[A].Model?.Filters, + Properties: C.Appearance[A].Model?.Properties, + Property: C.Appearance[A].Property, + Color: (C.Appearance[A].Color) ? C.Appearance[A].Color : (C.Appearance[A].Model?.DefaultColor ? C.Appearance[A].Model?.DefaultColor : "Default"), + Lost: false, + Skirt: C.Appearance[A].Model?.Group == "Skirt" || C.Appearance[A].Model?.Categories?.includes("Skirts"), + },); + } + } else { + if (C.Appearance[A].Asset.Group.BodyCosplay || C.Appearance[A].Asset.BodyCosplay) save = true; + else if (C.Appearance[A].Asset.Group.Underwear) save = true; + else if (C.Appearance[A].Asset.Group.Clothing) save = true; + if (save) { + KDGetDressList().Default.push({ + Item: C.Appearance[A].Asset.Name, + Group: C.Appearance[A].Asset.Group.Name, + Property: C.Appearance[A].Property, + Color: (C.Appearance[A].Color) ? C.Appearance[A].Color : (C.Appearance[A].Asset.DefaultColor ? C.Appearance[A].Asset.DefaultColor : "Default"), + Lost: false, + },); + } + } + } + } + KinkyDungeonNewDress = false; +} + +let KDCharacterDress = new Map(); + +function KinkyDungeonSetDress(Dress: string, Outfit?: string, Character?: Character, NoRestraints?: boolean) { + if (!Character || Character == KinkyDungeonPlayer) { + if (Outfit) KDGameData.Outfit = Outfit; + KinkyDungeonCurrentDress = Dress; + } + KDCharacterDress.set(Character, Dress); + if (KDGetDressList()) { + if (!Character || Character == KinkyDungeonPlayer) { + for (let clothes of KDGetDressList()[KinkyDungeonCurrentDress]) { + clothes.Lost = false; + } + } + //KinkyDungeonCheckClothesLoss = true; + KDCharacterNaked(Character); + KDRefreshCharacter.set(Character || KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(Character, NoRestraints, false, undefined, undefined, undefined, undefined, undefined, true); + KDRefresh = true; + } +} + +let KDNaked = false; +let KDRefresh = false; +let KDLastForceRefresh = 0; +let KDLastForceRefreshInterval = 100; + +/** + * It sets the player's appearance based on their stats. + * + * @param [Character] + * @param [NoRestraints] + * @param [Force] + * @param [npcRestraints] + * @param [customInventory] + * @param [customPlayerTags] + * @param [customFaction] + * @param [noDressOutfit] + */ +function KinkyDungeonDressPlayer ( + Character?: Character, + NoRestraints?: boolean, + Force?: boolean, + npcRestraints?: Record, + customInventory?: item[], + customPlayerTags?: Map, + customFaction?: string, + noDressOutfit?: boolean, + forceUseOutfit?: boolean +) +{ + if (!Character) Character = KinkyDungeonPlayer; + + let _CharacterRefresh = CharacterRefresh; + let _CharacterAppearanceBuildCanvas = CharacterAppearanceBuildCanvas; + CharacterRefresh = () => {KDRefresh = true;}; + CharacterAppearanceBuildCanvas = () => {}; + let restraints: item[] = []; + + if (StandalonePatched) { + AppearanceCleanup(Character); + } + + let restraintModels = {}; + + let CurrentDress = Character == KinkyDungeonPlayer ? KinkyDungeonCurrentDress + : (Character == KDPreviewModel ? KinkyDungeonCurrentDress : (KDCharacterDress.get(Character) || "Bandit")); + let DressList = noDressOutfit ? [] : KDGetDressList()[CurrentDress]; + + if (!noDressOutfit && !forceUseOutfit && KDNPCStyle.get(Character)?.customOutfit) { + DressList = []; + for (let a of JSON.parse(DecompressB64(KDNPCStyle.get(Character)?.customOutfit))) { + if (a.Model && !KDModelIsProtected(a.Model) && !a.Model.Restraint && !a.Model.Cosplay) { + DressList.push({ + Item: a.Model.Name || a.Model, + Group: a.Model.Group || a.Model.Name || a.Model, + Color: "#ffffff", + Lost: false, + Filters: a.Model.Filters || a.Filters, + Properties: a.Model.Properties || a.Properties, + },); + } + } + } + + try { + + if (!KDGameData.NPCRestraints) KDGameData.NPCRestraints = {}; + let data = { + updateRestraints: false, + updateDress: false, + updateExpression: false, + Character: Character, + extraForceDress: undefined, + Wornitems: KDGetCharacterID(Character) && KDGameData.NPCRestraints[KDGetCharacterID(Character)] ? + Object.values(KDGameData.NPCRestraints[KDGetCharacterID(Character)]) + .filter((rest) => {return rest.events}) + .map((rest) => {return rest.id;}) + : [], + NPCRestraintEvents: KDGetCharacterID(Character) ? + KDGameData.NPCRestraints[KDGetCharacterID(Character)] + : undefined, + }; + + if (KinkyDungeonCheckClothesLoss) KDRefreshCharacter.set(Character, true); + + // if true, nakeds the player, then reclothes + if (KDRefreshCharacter.get(Character)) { + + + if (!KDNaked) KDCharacterNaked(Character); + // We refresh all the restraints + /*=if (StandalonePatched && CommonTime() > KDLastForceRefresh + KDLastForceRefreshInterval) { + // Force refresh the model + ForceRefreshModels(Character); + KDLastForceRefresh = CommonTime(); + }*/ + + // First we remove all restraints and clothes + let clothGroups = {}; + for (let cloth of Object.values(DressList)) { + clothGroups[cloth.Group || cloth.Item] = true; + } + let newAppearance = {}; + for (let A = 0; A < Character.Appearance.length; A++) { + if (StandalonePatched) { + let model = Character.Appearance[A]?.Model; + if (model && ((!model.Restraint && !model.Group?.startsWith("Item") && !clothGroups[model.Group || model.Name]) + || KDModelIsProtected(model) || model.SuperProtected)) { + //Character.Appearance.splice(A, 1); + //A -= 1; + newAppearance[model.Group || model.Name] = Character.Appearance[A]; + } + } else { + // BC support + let asset = Character.Appearance[A].Asset; + if (!asset.Group.Name.startsWith("Item") && !clothGroups[asset.Group.Name]) { + //Character.Appearance.splice(A, 1); + //A -= 1; + newAppearance[asset.Group.Name] = Character.Appearance[A]; + } + } + + } + + Character.Appearance = Object.values(newAppearance); + + //Character.Appearance = []; + + let tags = Character == KinkyDungeonPlayer ? customPlayerTags || KinkyDungeonPlayerTags : new Map(); + + // Next we revisit all the player's restraints + if (!NoRestraints) { + if (Character == KinkyDungeonPlayer || customInventory) { + for (let inv of (customInventory || KinkyDungeonAllRestraint())) { + // Skip invalid restraints!!! + let renderTypes = KDRestraint(inv).shrine; + if (!(!KDRestraint(inv) || (KDRestraint(inv).armor && !KDToggles.DrawArmor))) { + if (!KDRestraint(inv).hideTags || KDRestraint(inv).hideTags.some((tag) => {return tags.get(tag) == true;})) { + KDApplyItem(Character, inv, customPlayerTags || KinkyDungeonPlayerTags, customFaction); + if (KDRestraint(inv).Model) { + + restraintModels[KDRestraint(inv).Model] = true; + restraintModels["Fashion" + KDRestraint(inv).Model] = true; + } + } + restraints.push(inv); + } else renderTypes = []; + if (inv.dynamicLink) { + let accessible = KDRestraint(inv)?.accessible || KDRestraint(inv)?.UnderlinkedAlwaysRender; + let link = inv.dynamicLink; + for (let I = 0; I < 30; I++) { + if (accessible || KDRestraint(link).alwaysRender || (KDRestraint(link).renderWhenLinked && KDRestraint(link).renderWhenLinked.some((element) => {return renderTypes.includes(element);}))) { + if (!KDRestraint(inv).hideTags || KDRestraint(inv).hideTags.some((tag) => {return tags.get(tag) == true;})) { + KDApplyItem(Character, link, customPlayerTags || KinkyDungeonPlayerTags, customFaction); + + if (KDRestraint(link).Model) { + restraintModels[KDRestraint(link).Model] = true; + restraintModels["Fashion" + KDRestraint(link).Model] = true; + } + + } + restraints.push(link); + } + if (link.dynamicLink) { + renderTypes = KDRestraint(link).shrine; + link = link.dynamicLink; + } else I = 1000; + } + } + } + } else if (npcRestraints) { + let ids = {}; + for (let inv of Object.values(npcRestraints)) { + if (!KDRestraint(inv)) continue; // Skip invalid restraints!!! + if (ids[inv.id]) continue; + ids[inv.id] = true; // No dupe + + if (!KDRestraint(inv).hideTags || KDRestraint(inv).hideTags.some((tag) => {return tags.get(tag) == true;})) { + KDApplyItem(Character, inv, NPCTags.get(Character) || new Map(), customFaction); + if (KDRestraint(inv).Model) { + + restraintModels[KDRestraint(inv).Model] = true; + restraintModels["Fashion" + KDRestraint(inv).Model] = true; + } + } + restraints.push({ + name: inv.name, + id: -1, + type: Restraint + }); + } + } + + } + + data.updateRestraints = true; + KDNaked = true; + KinkyDungeonUndress = 0; + } + + let alreadyClothed = {}; + + for (let A = 0; A < Character.Appearance.length; A++) { + let asset = Character.Appearance[A].Asset; + if (StandalonePatched) { + if (Character.Appearance[A].Model?.Group) + alreadyClothed[Character.Appearance[A].Model?.Group] = true; + } else + alreadyClothed[asset.Group.Name] = true; + } + + // Only track these for player + if (Character == KinkyDungeonPlayer) { + for (let clothes of DressList) { + if (!clothes) continue; + if (StandalonePatched && !clothes.Lost && KDRefreshCharacter.get(Character)) { + if (clothes.Item && (restraintModels[clothes.Item] || restraintModels[clothes.Item + "Restraint"])) { + clothes.Lost = true; + } else if (IsModelLost(Character, clothes.Item)) + clothes.Lost = true; + } + if (alreadyClothed[clothes.Group || clothes.Item]) continue; + data.updateDress = true; + if (!clothes.Lost && KDRefreshCharacter.get(Character)) { + + + + if (clothes.Group == "Necklace") { + if (KinkyDungeonGetRestraintItem("ItemTorso") && KDRestraint(KinkyDungeonGetRestraintItem("ItemTorso"))?.harness) clothes.Lost = true; + if (KinkyDungeonGetRestraintItem("ItemArms") && KDGroupBlocked("ItemBreast")) clothes.Lost = true; + } + //if (clothes.Group == "Bra" && !clothes.NoLose) { + //if (KinkyDungeonGetRestraintItem("ItemBreast")) clothes.Lost = true; + //} + if (clothes.Group == "Panties" && !clothes.NoLose) { + + if (KinkyDungeonGetRestraintItem("ItemPelvis") + && KDRestraint(KinkyDungeonGetRestraintItem("ItemPelvis"))?.chastity) clothes.Lost = true; + } + if (ModelDefs[clothes.Item]?.Categories?.includes("Skirts") + && !ModelDefs[clothes.Item]?.Categories?.includes("NanoSkirts")) { + if (CheckPoseOrTags(Character, "Petsuits")) clothes.Lost = true; + } + if (clothes.Group == "Shoes" || ( + StandalonePatched && ModelDefs[clothes.Item]?.Categories?.includes("Shoes") + )) { + let inv = KinkyDungeonGetRestraintItem("ItemBoots"); + if (inv && (!KDRestraint(inv).armor || KDToggles.DrawArmor)) clothes.Lost = true; + if (KinkyDungeonFlags.get("stripShoes")) clothes.Lost = true; + } + if (!NoRestraints) { + if (Character == KinkyDungeonPlayer) { + for (let entry of KinkyDungeonAllRestraintDynamic()) { + let inv = entry.item; + if (KDRestraint(inv)?.remove && (!KDRestraint(inv).armor || KDToggles.DrawArmor)) { + for (let remove of KDRestraint(inv).remove) { + if (remove == clothes.Group) clothes.Lost = true; + if (StandalonePatched && ModelDefs[clothes.Item]?.Categories?.includes(remove)) clothes.Lost = true; + } + } + } + } + } + + if (clothes.Lost) KinkyDungeonUndress += 1/DressList.length; + } + + if (!clothes.Lost) { + if (KDRefreshCharacter.get(Character)) { + let item = KDInventoryWear(Character, clothes.Item, clothes.Group, undefined, clothes.Color, clothes.Filters, clothes.Properties); + alreadyClothed[clothes.Group || clothes.Item] = true; + if (item) { + if (clothes.OverridePriority) { + if (item) { + if (!item.Property) item.Property = {OverridePriority: clothes.OverridePriority}; + else item.Property.OverridePriority = clothes.OverridePriority; + } + } else if (KDClothOverrides[clothes.Group || clothes.Item] && KDClothOverrides[clothes.Group || clothes.Item][clothes.Item] != undefined) { + if (!item.Property) item.Property = {OverridePriority: KDClothOverrides[clothes.Group || clothes.Item][clothes.Item]}; + else item.Property.OverridePriority = KDClothOverrides[clothes.Group || clothes.Item][clothes.Item]; + } + if (clothes.Property) item.Property = clothes.Property; + // Ignored because BC uses string[] as a type! + //KDCharacterAppearanceSetColorForGroup(Character, clothes.Color, clothes.Group); + } + } + } + + if (!KDNaughtySetting) { + if (clothes.Group == "Panties" && !KinkyDungeonGetRestraintItem("ItemPelvis")) clothes.Lost = false; // A girl's best friend never leaves her + if (clothes.Group == "Bra" && !KinkyDungeonGetRestraintItem("ItemBreast")) clothes.Lost = false; // A girl's best friend never leaves her + } + } + } else { + for (let clothes of DressList) { + if (alreadyClothed[clothes.Group || clothes.Item]) continue; + data.updateDress = true; + + //if (!clothes.Lost) { + if (KDRefreshCharacter.get(Character)) { + KDInventoryWear(Character, clothes.Item, clothes.Group, undefined, clothes.Color, clothes.Filters, clothes.Properties); + alreadyClothed[clothes.Group || clothes.Item] = true; + } + //} + + } + } + + if (!NoRestraints) { + if (KDRefreshCharacter.get(Character)) { + data.extraForceDress = []; + KinkyDungeonSendEvent("beforeDressRestraints", data); + KinkyDungeonWearForcedClothes(Character, restraints, data.extraForceDress); + KinkyDungeonSendEvent("dressRestraints", data); + } + } + + // Apply poses from restraints + if (StandalonePatched && KDCurrentModels.get(Character)) { + RefreshTempPoses(Character, true); + KDRefreshPoseOptions(Character); + } + + + + let AllowedArmPoses = StandalonePatched ? KDGetAvailablePosesArms(Character, customPlayerTags) : []; + let AllowedLegPoses = StandalonePatched ? KDGetAvailablePosesLegs(Character, customPlayerTags) : []; + + if (Character == KinkyDungeonPlayer) { + if (KDGameData.KneelTurns > 0 || KDGameData.SleepTurns > 0) { + if (StandalonePatched) { + // Force player into being on the ground + let newLegPoses = AllowedLegPoses.filter((element) => {return !STANDPOSES.includes(element);}); + if (newLegPoses.length > 0) AllowedLegPoses = newLegPoses; + } + } + } + + if (StandalonePatched) { + // Pose set routine + /*let ArmPose = KDGetPoseOfType(Character, "Arms"); + let LegPose = KDGetPoseOfType(Character, "Legs"); + let EyesPose = KDGetPoseOfType(Character, "Eyes"); + let Eyes2Pose = KDGetPoseOfType(Character, "Eyes2"); + let BrowsPose = KDGetPoseOfType(Character, "Brows"); + let Brows2Pose = KDGetPoseOfType(Character, "Brows2"); + let BlushPose = KDGetPoseOfType(Character, "Blush"); + let MouthPose = KDGetPoseOfType(Character, "Mouth"); + let FearPose = KDGetPoseOfType(Character, "Fear");*/ + + let CurrentExpression: Record = {}; + CurrentExpression.ArmPose = KDGetPoseOfType(Character, "Arms"); + CurrentExpression.LegPose = KDGetPoseOfType(Character, "Legs"); + for (let pose of KDExpressionPoses) { + CurrentExpression[pose] = KDGetPoseOfType(Character, pose.replace("Pose", "")); + } + + + let DefaultBound = "Front"; // Default bondage for arms + let DefaultHobbled = "Closed"; // Default bondage for legs + if (!AllowedLegPoses.includes(DefaultHobbled)) { + DefaultHobbled = "Kneel"; // Get up from hogtie + } + if (!AllowedLegPoses.includes(DefaultHobbled)) { + DefaultHobbled = "KneelClosed"; // Get up from hogtie + } + + // Hold to player's preferred pose + let PreferredArm = NPCDesiredPoses.get(Character)?.Arms || "Free"; + let PreferredLeg = NPCDesiredPoses.get(Character)?.Legs || "Spread"; + + if (!AllowedLegPoses.includes(PreferredLeg)) { + PreferredLeg = "Closed"; // Get up from hogtie + if (!AllowedLegPoses.includes(PreferredLeg)) { + DefaultHobbled = "Kneel"; // Get up from hogtie + if (!AllowedLegPoses.includes(PreferredLeg)) { + DefaultHobbled = "KneelClosed"; // Get up from hogtie + } + } + } + + if (!AllowedArmPoses.includes(CurrentExpression.ArmPose)) { + CurrentExpression.ArmPose = (AllowedArmPoses.includes(DefaultBound) && KinkyDungeonIsArmsBound(false, false)) ? DefaultBound : AllowedArmPoses[0]; + } + if (!AllowedLegPoses.includes(CurrentExpression.LegPose)) { + CurrentExpression.LegPose = (AllowedLegPoses.includes(DefaultHobbled)) ? DefaultHobbled : AllowedLegPoses[0]; + } + if (CurrentExpression.ArmPose != PreferredArm && AllowedArmPoses.includes(PreferredArm)) { + CurrentExpression.ArmPose = PreferredArm; + } + if (CurrentExpression.LegPose != PreferredLeg && AllowedLegPoses.includes(PreferredLeg)) { + CurrentExpression.LegPose = PreferredLeg; + } + + + // Expressions for standalone + + + let expression: KDExpression = null; + let stackedPriorities: Record = {}; + let flags = KDGetEntityFlags(Character); + for (let e of Object.entries(KDExpressions)) { + if (!expression || e[1].priority > expression.priority) { + if (e[1].criteria(Character, flags)) { + expression = e[1]; + } + } + if (e[1].stackable) { + if (!e[1].criteria(Character, flags)) continue; + let result = null; + + for (let poseType of KDExpressionPoses) { + if (e[1].priority > (stackedPriorities[poseType] || 0)) { + result = result || e[1].expression(Character, flags); + if (result[poseType]) { + stackedPriorities[poseType] = e[1].priority; + if (!(KDNPCPoses.get(Character) && KDNPCPoses.get(Character)["Current" + poseType])) + CurrentExpression[poseType] = result[poseType]; + } + } + } + } + } + if (expression) { + let result = expression.expression(Character, flags); + for (let pose of KDExpressionPoses) { + if (!(KDNPCPoses.get(Character) + && KDNPCPoses.get(Character)["CurrentPose" + pose.replace( + "Pose", "") + ]) + && result[pose]) + CurrentExpression[pose] = result[pose]; + else if (KDNPCPoses.get(Character) + && KDNPCPoses.get(Character)["CurrentPose" + pose.replace( + "Pose", "") + ]) + CurrentExpression[pose] = KDNPCPoses.get(Character)["CurrentPose" + pose.replace( + "Pose", "") + ] || ""; + } + /*if (!KDNPCPoses.get(Character)?.CurrentPoseEyes && result.EyesPose) CurrentExpression.EyesPose = result.EyesPose; + if (!KDNPCPoses.get(Character)?.CurrentPoseEyes2 && result.Eyes2Pose) CurrentExpression.Eyes2Pose = result.Eyes2Pose; + if (!KDNPCPoses.get(Character)?.CurrentPoseBrows && result.BrowsPose) CurrentExpression.BrowsPose = result.BrowsPose; + if (!KDNPCPoses.get(Character)?.CurrentPoseBrows2 && result.Brows2Pose) CurrentExpression.Brows2Pose = result.Brows2Pose; + if (!KDNPCPoses.get(Character)?.CurrentPoseBlush && result.BlushPose) CurrentExpression.BlushPose = result.BlushPose; + if (!KDNPCPoses.get(Character)?.CurrentPoseMouth && result.MouthPose) CurrentExpression.MouthPose = result.MouthPose; + if (!KDNPCPoses.get(Character)?.CurrentPoseFear && result.FearPose) FearPose = result.FearPose || "";*/ + } + + if (KDCurrentModels.get(Character)) { + KDCurrentModels.get(Character).Poses = KDGeneratePoseArray( + CurrentExpression.ArmPose, + CurrentExpression.LegPose, + CurrentExpression.EyesPose, + CurrentExpression.BrowsPose, + CurrentExpression.BlushPose, + CurrentExpression.MouthPose, + CurrentExpression.Eyes2Pose, + CurrentExpression.Brows2Pose, + undefined, + CurrentExpression.FearPose + ); + KDUpdateTempPoses(Character); + + } + } + + KinkyDungeonSendEvent("afterDress", data); + } finally { + CharacterRefresh = _CharacterRefresh; + CharacterAppearanceBuildCanvas = _CharacterAppearanceBuildCanvas; + } + + if (StandalonePatched && KDCurrentModels.get(Character)) { + + KDRefreshPoseOptions(Character); + + let Xray = []; + if (KDToggleXRay > 0) { + Xray = ["Xray"]; + if (KDToggleXRay > 1 && Character?.Appearance?.some((A) => { + return A.Model?.Layers && Object.values(A.Model?.Layers).some((L) => {return Object.keys(LayerGroups.XrayFace).some((L2) => {return L2 == L.Layer;});}); + })) { + Xray.push("XrayFace"); + } + if (Character?.Appearance?.some((A) => { + return A.Model?.Layers && A.Model?.Categories && Object.values(A.Model.Categories).some((C) => {return C == "ChastityBelt";}); + })) { + Xray.push("XrayPanties"); + } + if (Character?.Appearance?.some((A) => { + return A.Model?.Layers && A.Model?.Categories && Object.values(A.Model.Categories).some((C) => {return C == "ChastityBra";}); + })) { + Xray.push("XrayBra"); + } + } + if (KDRefreshCharacter.get(Character) + || Character == KinkyDungeonPlayer + || Character == KDSpeakerNPC + || Character == KDPreviewModel + || Math.random() < 0.05) + UpdateModels(Character, Xray); + let ReUpdate = false; + + let hairstyle = KDNPCStyle.get(Character)?.hairstyle || "Default"; + let bodystyle = KDNPCStyle.get(Character)?.bodystyle || "Default"; + let facestyle = KDNPCStyle.get(Character)?.facestyle || "Default"; + let cosplaystyle = KDNPCStyle.get(Character)?.cosplaystyle || "Default"; + + + if (!KDCurrentModels.get(Character)?.Poses?.Hair && KDModelHair[hairstyle]) { + for (let hair of Object.values(KDModelHair[hairstyle])) { + KDInventoryWear(Character, hair.Item, undefined, undefined, undefined, hair.Filters, hair.Properties); + ReUpdate = true; + } + } + if (!KDCurrentModels.get(Character)?.Poses?.Body && KDModelBody[bodystyle]) { + for (let body of Object.values(KDModelBody[bodystyle])) { + KDInventoryWear(Character, body.Item, undefined, undefined, undefined, body.Filters, body.Properties); + ReUpdate = true; + } + } + if (!KDCurrentModels.get(Character)?.Poses?.Eyes && KDModelFace[facestyle]) { + for (let face of Object.values(KDModelFace[facestyle])) { + KDInventoryWear(Character, face.Item, undefined, undefined, undefined, face.Filters, face.Properties); + ReUpdate = true; + } + } + if (!KDCurrentModels.get(Character)?.Poses?.Fear && KDModelFace[facestyle]) { + KDInventoryWear(Character, "Fear", + undefined, undefined, undefined, + undefined, undefined); + ReUpdate = true; + } + if (!KDCurrentModels.get(Character)?.Poses?.Cosplay && KDModelCosplay[cosplaystyle]) { + for (let cosplay of Object.values(KDModelCosplay[cosplaystyle])) { + KDInventoryWear(Character, cosplay.Item, undefined, undefined, undefined, cosplay.Filters, cosplay.Properties); + ReUpdate = true; + } + } + + if (KDRefreshCharacter.get(Character) || Character == KinkyDungeonPlayer || Character == KDSpeakerNPC) + if (ReUpdate) UpdateModels(Character, Xray); + if (Force) { + ForceRefreshModels(Character); + } + + KinkyDungeonCheckClothesLoss = false; + KDRefreshCharacter.delete(Character); + } +} + +let KDRefreshCharacter = new Map(); + +/** + * Initializes protected groups like ears and tail + * @param C + */ +function KDInitProtectedGroups(C: Character) { + if (!C) C = KinkyDungeonPlayer; + if (C == KinkyDungeonPlayer) { + KDProtectedCosplay = []; + // init protected slots + for (let a of C.Appearance) { + if (a.Asset?.Group?.BodyCosplay || (a.Model?.SuperProtected && a.Model.Group)){ + KDProtectedCosplay.push(a.Asset.Group?.Name || a.Model.Group); + } + } + } + +} + + + +/** + * If the player is wearing a restraint that has a `alwaysDress` property, and the player is not wearing the item specified + * in the `alwaysDress` property, the player will be forced to wear the items. + * @param C + * @param [restraints] + * @param [extraForceDress] + */ +function KinkyDungeonWearForcedClothes(C: Character, restraints?: item[], extraForceDress?: alwaysDressModel[]) { + if (!C) C = KinkyDungeonPlayer; + + for (let dress of extraForceDress) { + let canReplace = (dress.override!==null && dress.override===true) ? true : !InventoryGet(C,dress.Group); + + if (dress.Group && !canReplace) {return;} + if (dress.Group && C == KinkyDungeonPlayer && KDProtectedCosplay.includes(dress.Group)){return;} + let filters = dress.Filters ? JSON.parse(JSON.stringify(dress.Filters)) : {}; + let Properties = dress.Properties ? JSON.parse(JSON.stringify(dress.Properties)) : {}; + let faction = dress.faction; + if (dress.faction) { + if (StandalonePatched) { + if (dress.factionFilters && faction && KDGetFactionFilters(faction)) { + for (let f of Object.entries(dress.factionFilters)) { + if (KDGetFactionFilters(faction)[f[1].color]) + filters[f[0]] = KDGetFactionFilters(faction)[f[1].color]; // 0 is the primary color + } + } + } + } + KDInventoryWear(C, dress.Model, undefined, undefined, undefined, filters, Properties); + } + + + if (!restraints) restraints = C == KinkyDungeonPlayer ? KinkyDungeonAllRestraint() : []; + for (let i = restraints.length - 1; i >= 0; i--) { + let inv = restraints[i]; + + if (StandalonePatched && KDRestraint(inv)?.alwaysDressModel) { + KDRestraint(inv).alwaysDressModel.forEach(dress=>{ // for .. of loop has issues with iterations + let canReplace = (dress.override!==null && dress.override===true) ? true : !InventoryGet(C,dress.Group); + + if (dress.Group && !canReplace) {return;} + if (dress.Group && C == KinkyDungeonPlayer && KDProtectedCosplay.includes(dress.Group)){return;} + let filters = dress.Filters ? JSON.parse(JSON.stringify(dress.Filters)) : {}; + let Properties = dress.Properties ? JSON.parse(JSON.stringify(dress.Properties)) : {}; + let faction = inv.forceFaction || inv.faction || dress.faction; + if (faction) { + if (dress.factionFilters && faction && KDGetFactionFilters(faction)) { + for (let f of Object.entries(dress.factionFilters)) { + if (KDGetFactionFilters(faction)[f[1].color]) + filters[f[0]] = KDGetFactionFilters(faction)[f[1].color]; // 0 is the primary color + } + } + } + KDInventoryWear(C, dress.Model, undefined, undefined, undefined, dress.inheritFilters ? KDRestraint(inv).Filters : (filters), Properties); + }); + } + } +} +function KDCharacterAppearanceSetColorForGroup(Player: Character, Color: ItemColor, Group: string) { + let item = InventoryGet(Player, Group); + if (item) { + item.Color = Color; + } +} + +function KinkyDungeonGetOutfit(Name: string): any { + if (KinkyDungeonOutfitCache && KinkyDungeonOutfitCache.get(Name)) { + let outfit = {}; + Object.assign(outfit, KinkyDungeonOutfitCache.get(Name)); + return outfit; + } + return null; +} + + +/** + * Makes the KinkyDungeonPlayer wear an item on a body area + * @param Character + * @param AssetName - The name of the asset to wear + * @param AssetGroup - The name of the asset group to wear + * @param [par] - parent item + * @param [color] - parent item + * @param [filters] - parent item + * @param [Properties] - parent item + */ +function KDInventoryWear(Character: Character, AssetName: string, AssetGroup: string, _par?: string, color?: ItemColor, filters?: Record, Properties?: Record): Item { + const M = StandalonePatched ? ModelDefs[AssetName] : undefined; + if (!M) return; + let item = KDAddModel(Character, AssetGroup, M, color || "Default", filters, undefined, Properties); + //CharacterAppearanceSetItem(KinkyDungeonPlayer, AssetGroup, A, color || A.DefaultColor,0,-1, false); + CharacterRefresh(Character, true); + return item; +} + +function KDCharacterNaked(Character: Character) { + if (!Character) Character = KinkyDungeonPlayer; + KDCharacterAppearanceNaked(Character); + CharacterRefresh(Character); +} + +/** + * Removes all items that can be removed, making the player naked. Checks for a blocking of CosPlayItem removal. + * @param C + */ +function KDCharacterAppearanceNaked(C: Character): void { + // For each item group (non default items only show at a 20% rate) + for (let A = C.Appearance.length - 1; A >= 0; A--) { + if (StandalonePatched) { + if (!C.Appearance[A].Model.Restraint){ + // conditional filter + let f = !(C.Appearance[A]?.Model + && ((C == KinkyDungeonPlayer && + KDProtectedCosplay.includes(C.Appearance[A].Model.Group)) + || KDModelIsProtected(C.Appearance[A].Model) + || C.Appearance[A].Model.SuperProtected)); + if (!f){continue;} + C.Appearance.splice(A, 1); + } + } else { + if (C.Appearance[A].Asset.Group.AllowNone && + (C.Appearance[A].Asset.Group.Category === "Appearance")){ + // conditional filter + let f = !(C.Appearance[A]?.Asset.Group.BodyCosplay + && C == KinkyDungeonPlayer && (KDProtectedCosplay.includes(C.Appearance[A].Asset.Group.Name))); + if (!f){continue;} + C.Appearance.splice(A, 1); + } + } + } + +} + +/** + * @param C + * @param inv + * @param tags + * @param customFaction + */ +function KDApplyItem(C: Character, inv: item, tags: any, customFaction: string = undefined): void { + if (StandalonePatched) { + let restraint = KDRestraint(inv); + let AssetGroup = restraint.AssetGroup ? restraint.AssetGroup : restraint.Group; + let faction = customFaction ? customFaction : ((inv.forceFaction) ? inv.forceFaction : (inv.faction ? inv.faction : "")); + + // faction color system + let filters = (restraint.Filters || (ModelDefs[restraint.Model || restraint.Asset])?.Filters) ? + JSON.parse(JSON.stringify(restraint.Filters || (ModelDefs[restraint.Model || restraint.Asset])?.Filters)) + : {}; + let Properties = (restraint.Properties || (ModelDefs[restraint.Model || restraint.Asset])?.Properties) ? + JSON.parse(JSON.stringify(restraint.Properties || (ModelDefs[restraint.Model || restraint.Asset])?.Properties)) + : {}; + + + if (restraint.factionFilters && faction && KDGetFactionFilters(faction)) { + for (let f of Object.entries(restraint.factionFilters)) { + if (KDGetFactionFilters(faction)[f[1].color]) { + if (f[1].override) { + filters[f[0]] = KDGetFactionFilters(faction)[f[1].color]; + } else { + let origFilters = filters[f[0]]; + if (!filters[f[0]]) filters[f[0]] = {}; + filters[f[0]].saturation = 0; + filters[f[0]].constrast = (origFilters) + ? origFilters.contrast : 1; + filters[f[0]].gamma = (origFilters) + ? origFilters.gamma : 1; + filters[f[0]].brightness = (origFilters) + ? origFilters.brightness : 1; + filters[f[0]].red = KDGetFactionFilters(faction)[f[1].color].red; + filters[f[0]].blue = KDGetFactionFilters(faction)[f[1].color].blue; + filters[f[0]].green = KDGetFactionFilters(faction)[f[1].color].green; + } + if (f[1].desaturate) { + filters[f[0]].saturation = 0; + } + } + } + } + + let data = { + Filters: filters, + Properties: Properties, + faction: faction, + Character: C, + item: inv, + Wornitems: KDGetCharacterID(C) && KDGameData.NPCRestraints[KDGetCharacterID(C)] ? + Object.values(KDGameData.NPCRestraints[KDGetCharacterID(C)]) + .filter((rest) => {return rest.events}) + .map((rest) => {return rest.id;}) + : [], + NPCRestraintEvents: KDGetCharacterID(C) ? + KDGameData.NPCRestraints[KDGetCharacterID(C)] + : undefined, + }; + KinkyDungeonSendEvent("apply", data); + + //let already = InventoryGet(C, AssetGroup); + //let difficulty = already?.Property?.Difficulty || 0; + + let placed: Item = null; + + if (!restraint.armor || KDToggles.DrawArmor) { + placed = KDAddModel(C, AssetGroup, ModelDefs[restraint.Model || restraint.Asset], "", data.Filters, inv, data.Properties); + } + + if (placed) { + let type = restraint.Type; + if (restraint.changeRenderType && Object.keys(restraint.changeRenderType).some((k) => {return tags.has(k);})) { + let key = Object.keys(restraint.changeRenderType).filter((k) => {return tags.has(k);})[0]; + if (key) { + type = restraint.changeRenderType[key]; + } + } + placed.Property = {Type: type, Modules: restraint.Modules, Difficulty: restraint.power, LockedBy: inv.lock || (KDGetCurse(inv) && KDCurses[KDGetCurse(inv)].lock) ? "MetalPadlock" : undefined}; + + /*if ((!already) && type) { + C.FocusGroup = AssetGroupGet("Female3DCG", AssetGroup); + let options = window["Inventory" + ((AssetGroup.includes("ItemMouth")) ? "ItemMouth" : AssetGroup) + restraint.Asset + "Options"]; + if (!options) options = TypedItemDataLookup[`${AssetGroup}${restraint.Asset}`].options; // Try again + const option = options.find(o => o.Name === type); + ExtendedItemSetType(C, options, option); + C.FocusGroup = null; + }*/ + + if (restraint.OverridePriority) { + placed.Property.OverridePriority = restraint.OverridePriority; + } + } + return; + } +} + + +function KinkyDungeonSendOutfitEvent(Event: string, data: any) { + if (!KDMapHasEvent(KDEventMapOutfit, Event)) return; + let outfit = KDOutfit({name: data.CurrentDress || KinkyDungeonCurrentDress}); + if (outfit && outfit.events) { + for (let e of outfit.events) { + if (e.trigger == Event) { + KinkyDungeonHandleOutfitEvent(Event, e, outfit, data); + } + } + } +} + +/** + * @param C + */ +function KDGetExtraPoses(C: Character): string[] { + let poses = []; + if (C == KinkyDungeonPlayer) { + // For player + if (KinkyDungeonPlayerTags.get("LinkFeet")) { + poses.push("FeetLinked"); + } + if (KinkyDungeonIsHandsBound()) { + poses.push("HandsBound"); + } + if (KDIsPlayerTethered(KDPlayer()) && KinkyDungeonLeashingEnemy()) { + poses.push("Pulled"); + } + } else { + // For NPC + // ??? + } + return poses; +} + + +/** + * @param C + */ +function KDGetEntityFlags(C: Character): Map { + let flags: Map = new Map(); + + if (C == KinkyDungeonPlayer) { + for (let flag of KinkyDungeonFlags.entries()) { + flags.set(flag[0], flag[1]); + } + } else { + let flgs: Record = {}; + let id = KDGetCharacterID(C); + if (id) { + let entity = KinkyDungeonFindID(id); + if (!entity && KDGameData.Collection["" + id]) { + flgs = KDGameData.Collection["" + id].flags; + } else if (entity) flgs = entity.flags || {}; + } + if (flgs) + for (let flag of Object.entries(flgs)) { + flags.set(flag[0], flag[1]); + } + } + + return flags; +} + +/** + * @param Character + */ +function KDUpdateTempPoses(Character: Character) { + KDRefreshPoseOptions(Character); + // Append temp poses + for (let pose of Object.keys(KDCurrentModels.get(Character).TempPoses)) { + if (KDCurrentModels.get(Character).Poses[pose]) + delete KDCurrentModels.get(Character).TempPoses[pose]; + else + KDCurrentModels.get(Character).Poses[pose] = true; + } + + let extraPose = KDGetExtraPoses(Character); + if (extraPose) { + for (let pose of extraPose) { + KDCurrentModels.get(Character).Poses[pose] = true; + } + } +} + + +function KDGetFactionFilters(faction: string): Record { + if (KinkyDungeonFactionFilters[faction]) + return KinkyDungeonFactionFilters[faction]; + if (KDFactionProperties[faction]?.jailAlliedFaction && KinkyDungeonFactionFilters[KDFactionProperties[faction]?.jailAlliedFaction]) + return KinkyDungeonFactionFilters[KDFactionProperties[faction]?.jailAlliedFaction]; + return undefined; +} diff --git a/Game/src/player/KinkyDungeonDressList.ts b/Game/src/player/KinkyDungeonDressList.ts new file mode 100644 index 000000000..52aba3db2 --- /dev/null +++ b/Game/src/player/KinkyDungeonDressList.ts @@ -0,0 +1,269 @@ +"use strict"; + +/** Outfit resource, uncached */ +let KinkyDungeonOutfitsBase: outfit[] = [ + {name: "OutfitDefault", dress: "Default", shop: false, rarity: 1,},// To avoid breaking saves + {name: "Default", dress: "Default", shop: false, rarity: 1}, + {name: "LatexPrisoner", dress: "LatexPrisoner", shop: false, rarity: 1}, + {name: "Dungeon", dress: "Dungeon", shop: false, rarity: 1}, + {name: "Prisoner", dress: "Prisoner", shop: false, rarity: 1}, + {name: "Lingerie", dress: "Lingerie", shop: true, rarity: 0}, + {name: "JailUniform", dress: "JailUniform", shop: false, rarity: 1, + palette: "Jail", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', mult: 1.2}, + {type: "damageResist", trigger: 'tick', damage: "tickle", power: -0.1}, + {type: "damageResist", trigger: 'tick', damage: "grope", power: -0.1}, + ], + }, + {name: "Bast", dress: "Bast", shop: false, rarity: 1, + palette: "Bast", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "Bast"}, + {type: "damageResist", trigger: 'tick', damage: "tickle", power: -0.2}, + {type: "damageResist", trigger: 'tick', damage: "grope", power: -0.2}, + ], + }, + {name: "Bountyhunter", dress: "Bountyhunter", shop: false, rarity: 1, + palette: "Bountyhunter", + events: [ + {trigger: "tick", type: "sneakBuff", power: 0.1}, + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "Bountyhunter"}, + {type: "damageResist", trigger: 'tick', damage: "electric", power: 0.2}, + {type: "damageResist", trigger: 'tick', damage: "ice", power: -0.2}, + ],}, + {name: "Bikini", dress: "Bikini", shop: true, rarity: 0, + events: [ + {type: "damageResist", trigger: 'tick', damage: "ice", power: -0.2}, + {type: "damageResist", trigger: 'tick', damage: "tickle", power: -0.2}, + {type: "damageResist", trigger: 'tick', damage: "grope", power: -0.2}, + {type: "damageResist", trigger: 'tick', damage: "acid", power: 0.3}, + {type: "damageResist", trigger: 'tick', damage: "soap", power: 0.3}, + ],}, + {name: "Maid", dress: "Maid", shop: false, rarity: 2, + palette: "Maidforce", + events: [ + {trigger: "calcEvasion", type: "AccuracyBuff", requiredTag: "mold", power: 10.0}, + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "Maidforce"}, + ],}, + {name: "Dragon", dress: "Dragon", shop: false, rarity: 2, + palette: "Dragon", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "Dragon"}, + {type: "damageResist", trigger: 'tick', damage: "fire", power: 0.2}, + {type: "armorBuff", trigger: 'tick', power: 0.5}, + + ],}, + {name: "Elven", dress: "Elven", shop: false, rarity: 2, + palette: "Elf", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "Elf"}, + {type: "damageResist", trigger: 'tick', damage: "tickle", power: -0.2}, + {type: "damageResist", trigger: 'tick', damage: "grope", power: -0.2}, + {type: "buff", kind: "Accuracy", trigger: 'tick', power: 0.1}, + {type: "buff", kind: "Evasion", trigger: 'tick', power: 0.1}, + ],}, + {name: "Wolfgirl", dress: "Wolfgirl", shop: false, rarity: 2, + palette: "Nevermere", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "Nevermere"}, + {type: "damageResist", trigger: 'tick', damage: "electric", power: 0.2}, + ],}, + {name: "CyberDoll", dress: "CyberDoll", shop: false, rarity: 3, + palette: "AncientRobot", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "AncientRobot"}, + {type: "damageResist", trigger: 'tick', damage: "electric", power: 0.2}, + ],}, + {name: "BlueSuitPrison", dress: "BlueSuitPrison", shop: false, rarity: 2, + palette: "Alchemist", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "Alchemist"}, + {type: "damageResist", trigger: 'tick', damage: "electric", power: 0.2}, + ],}, + {name: "DollSuit", dress: "DollSuit", shop: false, rarity: 2, + palette: "Dollsmith", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "Dollsmith"}, + {type: "damageResist", trigger: 'tick', damage: "electric", power: 0.2}, + ],}, + {name: "BlueSuit", dress: "BlueSuit", shop: false, rarity: 2, + palette: "Rubber", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "Alchemist"}, + {type: "damageResist", trigger: 'tick', damage: "electric", power: 0.2}, + {type: "damageResist", trigger: 'tick', damage: "glue", power: 0.5}, + {type: "damageResist", trigger: 'tick', damage: "acid", power: 0.8}, + ],}, + {name: "Obsidian", dress: "Obsidian", shop: false, rarity: 2, + palette: "Curse", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "Elemental"}, + {type: "damageResist", trigger: 'tick', damage: "soul", power: -0.3}, + {type: "damageResist", trigger: 'tick', damage: "fire", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "ice", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "acid", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "soap", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "crush", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "electric", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "stun", power: .1}, + ],}, + {name: "ElementalDress", dress: "ElementalDress", shop: false, rarity: 2, + palette: "Elemental", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', mult: 0.9, kind: "Elemental"}, + {type: "damageResist", trigger: 'tick', damage: "soul", power: -0.3}, + {type: "damageResist", trigger: 'tick', damage: "fire", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "ice", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "acid", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "soap", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "crush", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "electric", power: .1}, + {type: "damageResist", trigger: 'tick', damage: "stun", power: .1}, + ],}, +]; + +/** + * List off all dresses items + */ +let KinkyDungeonDresses: Record = { + "Default" : KinkyDungeonDefaultDefaultDress, + "Prisoner" : [ + {Item: "SleevelessCatsuit", Group: "Suit", Color: "#8A120C", Lost: false}, + {Item: "CatsuitPanties", Group: "SuitLower", Color: "#8A120C", Lost: false}, + {Item: "Heels1", Group: "Shoes", Color: "#8A120C", Lost: false}, + {Item: "Socks4", Group: "Socks", Color: "#222222", Lost: false}, + ], + "GreenLeotard" : [ + {Item: "SleevelessCatsuit", Group: "Suit", Color: "#267237", Lost: false}, + {Item: "CatsuitPanties", Group: "SuitLower", Color: "#267237", Lost: false}, + ], + "Leotard" : [ + {Item: "SleevelessCatsuit", Group: "Suit", Color: "#53428D", Lost: false}, + {Item: "CatsuitPanties", Group: "SuitLower", Color: "#53428D", Lost: false}, + ], + "Bikini" : [ + {Item: "KittyPanties1", Group: "Panties", Color: "#050505", Lost: false}, + {Item: "FullLatexBra", Group: "Bra", Color: "Default", Lost: false}, + ], + "Lingerie" : [ + {Item: "LaceBabydoll", Group: "Cloth", Color: "Default", Lost: false}, + {Item: "Bandeau1", Group: "Bra", Color: "Default", Lost: false}, + {Item: "FloralPanties2", Group: "Panties", Color: ['#303030', '#F0F0F0'], Lost: false}, + ], + "LatexPrisoner" : [ + {Item: "LatexPanties2", Group: "Panties", Color: "Default", Lost: false}, + {Item: "LatexCorset1", Group: "Corset", Color: "Default", Lost: false}, + {Item: "FullLatexBra", Group: "Bra", Color: "Default", Lost: false}, + {Item: "Heels1", Group: "Shoes", Color: "#222222", Lost: false}, + {Item: "LatexSocks1", Group: "Socks", Color: "Default", Lost: false}, + ], + "Dungeon" : [ + {Item: "Bandeau1", Group: "Bra", Color: "Default", Lost: false}, + {Item: "Pantyhose1", Group: "SuitLower", Color: "Default", Lost: false}, + {Item: "Corset5", Group: "Corset", Color: "#777777", Lost: false}, + {Item: "AnkleStrapShoes", Group: "Shoes", Color: "#2D2D2D", Lost: false}, + {Item: "FloralPanties2", Group: "Panties", Color: ['#303030', '#F0F0F0'], Lost: false}, + ], + "Bast" : [ + {Item: "Sarashi1", Group: "Bra", Color: "Default", Lost: false}, + {Item: "Panties7", Group: "Panties", Color: "#ffffff", Lost: false}, + {Item: "Sandals", Group: "Shoes", Color: "Default", Lost: false}, + {Item: "FaceVeil", Group: "Mask", Color: "#ffffff", Lost: false}, + {Item: "HaremPants", Group: "ClothLower", Color: "Default", OverridePriority: 28, Lost: false}, + ], + "Dragon" : [ + {Item: "Sarashi1", Group: "Bra", Color: "#444444", Lost: false}, + {Item: "SunstripePanties1", Group: "Panties", Color: "#EC1515", Lost: false}, + {Item: "LatexAnkleShoes", Group: "Shoes", Color: "#AC1818", Lost: false}, + {Item: "Corset4", Group: "Corset", Color: "#AC1818", Lost: false}, + {Item: "LatexTop", Group: "Cloth", Color: "#AC1818", Lost: false}, + {Item: "GarterBelt2", Group: "Garters", Color: "Default", Lost: false}, + ], + "SlimeSuit" : [ + {Item: "SeamlessCatsuit", Group: "Suit", Color: "#7F3C9B", Lost: false}, + {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#7F3C9B", Lost: false}, + {Item: "Catsuit", Group: "Gloves", Color: "#7F3C9B", Lost: false}, + ], + "ProtoSlimeSuit" : [ + {Item: "SeamlessCatsuit", Group: "Suit", Color: "#404973", Lost: false}, + {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#404973", Lost: false}, + {Item: "Catsuit", Group: "Gloves", Color: "#404973", Lost: false}, + ], + "CaptureFoamSuit" : [ + {Item: "SeamlessCatsuit", Group: "Suit", Color: "#404973", Lost: false}, + {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#404973", Lost: false}, + {Item: "Catsuit", Group: "Gloves", Color: "#404973", Lost: false}, + ], + "BlueSuit" : [ + {Item: "SeamlessCatsuit", Group: "Suit", Color: "#3873C3", Lost: false}, + {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#3873C3", Lost: false}, + {Item: "Catsuit", Group: "Gloves", Color: "#3873C3", Lost: false}, + ], + "DollSuit" : [ + {Item: "SeamlessCatsuit", Group: "Suit", Color: "#840d26", Lost: false}, + {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#840d26", Lost: false}, + {Item: "Catsuit", Group: "Gloves", Color: "#840d26", Lost: false}, + ], + "Bountyhunter" : [ + {Item: "SeamlessCatsuit", Group: "Suit", Color: "#222222", Lost: false}, + {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#222222", Lost: false}, + {Item: "Catsuit", Group: "Gloves", Color: "#222222", Lost: false}, + ], + "BlueSuitPrison" : [ + {Item: "SeamlessCatsuit", Group: "Suit", Color: "#3873C3", Lost: false}, + {Item: "SeamlessCatsuit", Group: "SuitLower", Color: "#3873C3", Lost: false}, + {Item: "Catsuit", Group: "Gloves", Color: "#3873C3", Lost: false}, + {Item: "FaceVeil", Group: "Mask", Color: "#ffffff", Lost: false}, + ], + "Wolfgirl" : [ + {Item: "PilotSuit", Group: "Suit", Color: ['#828FA2', '#323332', '#223525', '#383838', 'Default'], Lost: false}, + {Item: "PilotPanties", Group: "SuitLower", Color: ['#828FA2', '#323332', '#223525'], Lost: false}, + {Item: "LatexSocks1", Group: "Socks", Color: "#AAAAAA", Lost: false}, + ], + "CyberDoll" : [ + {Item: "PilotSuit", Group: "Suit", Color: ['#7e1972', '#222222', '#555555', '#222222', 'Default'], Lost: false}, + {Item: "PilotSuit", Group: "SuitLower", Color: ['#7e1972', '#222222', '#555555'], Lost: false}, + {Item: "PilotSuitGloves", Group: "Gloves", Color: ['#7e1972', '#222222', '#555555'], Lost: false}, + ], + "Maid" : [ + {Item: "SleevelessCatsuit", Group: "Suit", Color: "#aaaaaa", Lost: false}, + {Item: "MaidApron2", Group: "Cloth", Color: "Default", Lost: false}, + {Item: "FullLatexBra2", Group: "Bra", Color: ["#333333", "#aaaaaa"], Lost: false}, + {Item: "Pantyhose2", Group: "SuitLower", Color: "#939393", Lost: false}, + {Item: "LaceBands", Group: "Bracelet", Color: ['Default', '#151515'], Lost: false}, + {Item: "MageSkirt", Group: "ClothLower", Color: ["#676767", "#2E2E2E"], Lost: false}, + {Item: "Corset4", Group: "Corset", Color: "#4B4B4B", Lost: false}, + {Item: "Band1", Group: "Hat", Color: "#767676", Lost: false}, + {Item: "Shoes5", Group: "Shoes", Color: "#575757", Lost: false}, + {Item: "Socks6", Group: "Socks", Color: ['#080808', 'Default'], Lost: false}, + {Item: "FloralPanties2", Group: "Panties", Color: ['#303030', '#F0F0F0'], Lost: false}, + ], + "Elven" : [ + {Item: "Swimsuit1", Group: "Bra", Color: ['#E2E2E2'], Lost: false, NoLose: true}, + {Item: "Corset4", Group: "Corset", Color: ['#FFFFFF'], Lost: false}, + {Item: "Stockings4", Group: "Socks", Color: "#000000", Lost: false}, + {Item: "FaceVeil", Group: "Mask", Color: "Default", Lost: false}, + {Item: "HairFlower1", Group: "HairAccessory3", Color: 'Default', Lost: false}, + {Item: "NecklaceKey", Group: "Necklace", Color: "Default", Lost: false}, + {Item: "MageSkirt", Group: "ClothLower", Color: ['#40824F', '#AF9225'], OverridePriority: 27, Lost: false}, + {Item: "Heels1", Group: "Shoes", Color: "#aaaaaa", Lost: false}, + ], + "Obsidian" : [ + {Item: "SleevelessSlimLatexLeotard", Group: "Suit", Color: ['#4964A5'], Lost: false, NoLose: true}, + {Item: "LatexCorset1", Group: "Corset", Color: ['#4869BD'], Lost: false}, + {Item: "Stockings3", Group: "Socks", Color: "Default", Lost: false}, + {Item: "LatexTop", Group: "Cloth", Color: "#1F175F", Lost: false}, + {Item: "CatsuitPanties", Group: "Panties", Color: '#4964A5', Lost: false}, + {Item: "FuturisticHeels2", Group: "Shoes", Color: ['#1F175F', '#FFFFFF', '#333333', '#333333', '#7A7979', '#aaaaaa'], Lost: false}, + {Item: "LatexSkirt2", Group: "ClothLower", Color: ['#2C4A95'], OverridePriority: 27, Lost: false}, + ], +}; + + + + +if (StandalonePatched) { + KinkyDungeonDefaultDefaultDress = [{"Item":"BanditBoots","Group":"BanditBoots","Color":"#ffffff","Lost":false,"Filters":{"ShoeLeft":{"gamma":1.4000000000000001,"saturation":0.03333333333333333,"contrast":1.5833333333333333,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1},"ShoeRight":{"gamma":1.4000000000000001,"saturation":0.03333333333333333,"contrast":1.5833333333333333,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"WitchBlouse","Group":"WitchBlouse","Color":"#ffffff","Lost":false},{"Item":"WitchCorset","Group":"WitchCorset","Color":"#ffffff","Lost":false,"Filters":{"Corset":{"gamma":1.45,"saturation":0.4666666666666667,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"MaidSkirt","Group":"MaidSkirt","Color":"#ffffff","Lost":false,"Filters":{"Skirt":{"gamma":1,"saturation":0.23333333333333334,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.55,"alpha":1.0166666666666666}}},{"Item":"MaidSocks","Group":"MaidSocks","Color":"#ffffff","Lost":false,"Filters":{"SockRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"SockLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}},{"Item":"StrappyBikini","Group":"StrappyBikini","Color":"#ffffff","Lost":false},{"Item":"LatexBra","Group":"LatexBra","Color":"#ffffff","Lost":false}]; + +} diff --git a/Game/src/player/KinkyDungeonNeeds.ts b/Game/src/player/KinkyDungeonNeeds.ts new file mode 100644 index 000000000..080b3af60 --- /dev/null +++ b/Game/src/player/KinkyDungeonNeeds.ts @@ -0,0 +1,78 @@ +"use strict"; + +let KDNeedsParams = { + FrustrationPerTurn: 0.05, + FrustrationPerDesire: 0.03, + FrustrationPerOrgasm: -10, + FrustrationPerVibeLevel: -0.1, + PassionPerTurn: -0.1, + PassionPerDesire: 0.1, + PassionPerOrgasm: 5, + PassionPerVibeLevel: 0.1, + PassionPerPlay: 10, +}; + +/** Runs upon loading in case old save */ +function KDFixNeeds() { + if (KinkyDungeonGoddessRep.Passion == undefined) KinkyDungeonGoddessRep.Passion = -50; + if (KinkyDungeonGoddessRep.Frustration == undefined) KinkyDungeonGoddessRep.Frustration = -50; +} + + +function KDTickNeeds(delta: number) { + KinkyDungeonGoddessRep.Passion = Math.max(-50, Math.min(50, + KinkyDungeonGoddessRep.Passion + delta* + ( + KDNeedsParams.PassionPerTurn + + KDNeedsParams.PassionPerDesire * KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax + + KDNeedsParams.PassionPerVibeLevel * KinkyDungeonVibeLevel + ))); + KinkyDungeonGoddessRep.Frustration = Math.max(-50, + Math.min(50, KinkyDungeonGoddessRep.Frustration + delta* + ( + (KDGameData.OrgasmTurns / KinkyDungeonOrgasmTurnsMax) + * (KDNeedsParams.FrustrationPerTurn + KDNeedsParams.FrustrationPerVibeLevel * KinkyDungeonVibeLevel) + ))); +} + +/** + * @param data + * @param mult + */ +function KDNeedsPlaySelf(_data: any, _mult: number = 1) { + KinkyDungeonChangeRep("Passion", (KDNeedsParams.PassionPerPlay + - 0.01*(0.1 + 0.4 * KDRandom())*KDNeedsParams.PassionPerPlay*(KinkyDungeonGoddessRep.Passion + 50) + - 0.01*(0.1 + 0.3 * KDRandom())*KDNeedsParams.PassionPerPlay*(KinkyDungeonGoddessRep.Frustration + 50))); + //KinkyDungeonChangeRep("Frustration", -(KDNeedsParams.FrustrationPerOrgasm + 3*KDNeedsParams.FrustrationPerOrgasm*(KinkyDungeonGoddessRep.Frustration + 50))); +} + + +/** + * @param data + * @param mult + */ +function KDNeedsOrgasm(_data: any, _mult: number = 1) { + KinkyDungeonChangeRep("Passion", (KDNeedsParams.PassionPerOrgasm + 0.01*(1 + 2 * KDRandom())*KDNeedsParams.PassionPerOrgasm*(50 - KinkyDungeonGoddessRep.Passion))); + KinkyDungeonChangeRep("Frustration", (KDNeedsParams.FrustrationPerOrgasm + 0.01*(1 + 2 * KDRandom())*KDNeedsParams.FrustrationPerOrgasm*(KinkyDungeonGoddessRep.Frustration + 50))); +} + +/** + * @param data + * @param mult + */ +function KDNeedsEdge(_data: any, _mult: number = 1) { + if (KDGameData.OrgasmTurns > KinkyDungeonOrgasmTurnsMax * 0.5) { + KinkyDungeonChangeRep("Passion", -(1 + (2 + 4 * KDRandom()) * 0.01*(50 - KinkyDungeonGoddessRep.Frustration))); + KinkyDungeonChangeRep("Frustration", (5 + (3 + 3 * KDRandom()) * 0.01*(KinkyDungeonGoddessRep.Passion + 50))); + } + +} + +/** + * @param data + * @param mult + */ +function KDNeedsDeny(_data: any, _mult: number = 1) { + KinkyDungeonChangeRep("Passion", -(2 + (8 + 12 * KDRandom()) * 0.01*(50 - KinkyDungeonGoddessRep.Frustration))); + KinkyDungeonChangeRep("Frustration", (10 + (15 * KDRandom()) * 0.01*(KinkyDungeonGoddessRep.Passion + 50))); +} diff --git a/Game/src/player/KinkyDungeonPerks.ts b/Game/src/player/KinkyDungeonPerks.ts new file mode 100644 index 000000000..de75aae77 --- /dev/null +++ b/Game/src/player/KinkyDungeonPerks.ts @@ -0,0 +1,1261 @@ +"use strict"; + +let KDDoorKnobChance = 0.1; // Chance to open door with mitts and arms bound +let KDDoorKnobChanceArms = 0.5; // Chance to open door with mitts but no arm bindings +let KDDoorAttractChance = 0.25; // Chance to attract someone by banging +let KDDoorAttractChanceArms = 0.1; // Chance to attract someone by rattling + +let KDPERKCOSTMULT = 2; + +/** These weapons can get removed if you start the game with them*/ +let kdStartWeapons = ["Knife", "Dirk", "Sword", "Shield"]; + +let KDPerkParams = { + KDEnemyDamageMult: 2.5, // Increase in enemy damage effect + KDEnemyResistBuff: 0.85, // Buff to tease damage + KDEnemyArmorBoost: 2.0, // Extra armor enemies get +}; + +let KDCategoriesStart = [ + {name: "Toggles", buffs: [], debuffs: [],}, + {name: "Toggles2", buffs: [], debuffs: [],}, + {name: "Multiclass", buffs: [], debuffs: [],}, + {name: "Major", buffs: [], debuffs: [],}, + {name: "Restraints", buffs: [], debuffs: [],}, + {name: "Restriction", buffs: [], debuffs: [],}, + {name: "Senses", buffs: [], debuffs: [],}, + {name: "Training", buffs: [], debuffs: [],}, + {name: "Kinky", buffs: [], debuffs: [],}, + {name: "Damage", buffs: [], debuffs: [],}, + {name: "Combat", buffs: [], debuffs: [],}, + {name: "Magic", buffs: [], debuffs: [],}, + //{name: "Components", buffs: [], debuffs: [],}, + {name: "Enemies", buffs: [], debuffs: [],}, + {name: "Common", buffs: [], debuffs: [],}, + {name: "Map", buffs: [], debuffs: [],}, + {name: "Start", buffs: [], debuffs: [],}, + {name: "Boss", buffs: [], debuffs: [],}, +]; + +let KDKinkyPerks = [ + "Doorknobs", + "Grounded", + "CantTouchThat", + "Nowhere", + "TightRestraints", + "MagicHands", + "HighSecurity", + "MoreKinkyFurniture", + "NoHelp", + "ExclusionsApply", + "Blackout", + "SelfBondage", + "Rigger", + "NovicePet", + "EnemyResist", + "CommonToyPleasure", + "CommonToyEdge", + "CommonToyDeny", + "CommonToyTease", + "BondageLover", + "Flexible", +]; + +let KDPerkIcons = { + "Pacifist" : () => {return true;}, + "BerserkerRage" : () => {return true;}, + "BoundPower" : () => {return true;}, + "UnstableMagic" : () => {return true;}, + "BurningDesire" : () => {return true;}, + "FrigidPersonality" : () => {return true;}, + "ImmovableObject" : () => {return KinkyDungeonStatWill >= KinkyDungeonStatWillMax * 0.90;}, + "GroundedInReality" : () => {return KinkyDungeonPlayerDamage && KinkyDungeonStatMana >= KinkyDungeonStatManaMax * 0.999;}, + "LikeTheWind" : () => {return KinkyDungeonStatStamina >= KinkyDungeonStatStaminaMax * 0.95;}, + "LeastResistance" : () => {return KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.01;}, + //"DistractionCast" : () => {return KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.99;}, +}; + +let KDPerkUpdateStats = { + "Rigger": () => { + /*KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "Rigger1", + type: "glueDamageBuff", + power: KDRiggerDmgBoost, + duration: 2 + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "Rigger2", + type: "chainDamageBuff", + power: KDRiggerDmgBoost, + duration: 2 + });*/ + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "Rigger3", + type: "BindAmp", + power: KDRiggerBindBoost, + duration: 2 + }); + }, + "Ticklish": () => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "Ticklish", type: "tickleDamageResist", power: -0.5, duration: 2 + }); + }, + "Stoic": () => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "Stoic", type: "tickleDamageResist", power: 0.82, duration: 2 + }); + }, + "Lascivious": () => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "Lascivious", type: "gropeDamageResist", power: -0.5, duration: 2 + }); + }, + "Unperturbed": () => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "Unperturbed", type: "gropeDamageResist", power: 0.82, duration: 2 + }); + }, + "PainTolerance": () => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "PainTolerance", type: "painDamageResist", power: 2.0, duration: 2 + }); + }, + "Sticky": () => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "StickySituation", type: "glueDamageResist", power: -0.4, duration: 2 + }); + }, + "EnemyResist": () => { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "EnemyResist", type: "TeaseBuff", power: KDPerkParams.KDEnemyResistBuff, duration: 2 + }); + /*KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "EnemyResist1", type: "soulDamageBuff", power: KDEnemyResistBuff, duration: 2 + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "EnemyResist2", type: "tickleDamageBuff", power: KDEnemyResistBuff, duration: 2 + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "EnemyResist3", type: "painDamageBuff", power: KDEnemyResistBuff, duration: 2 + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "EnemyResist4", type: "gropeDamageBuff", power: KDEnemyResistBuff, duration: 2 + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "EnemyResist5", type: "charmDamageBuff", power: KDEnemyResistBuff, duration: 2 + });*/ + }, + "BoundPower": () => { + KDDamageAmpPerks += KDBoundPowerLevel * KDBoundPowerMult; + }, + "BerserkerRage": () => { + KDDamageAmpPerksMelee += KDBerserkerAmp * KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax; + }, + "Dodge": () => { + if (KinkyDungeonMiscastChance < 0.001) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "FocusedDodge", type: "Evasion", power: 0.4, duration: 1, sfxApply: "Fwoosh" + }); + } + }, + "StartShadow": () =>{ + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, + { + id: "Cursed", type: "Cursed", power: 10, duration: 9999, infinite: true,aura: "#4488ff",aurasprite: "Null", + events: [ + {type: "Cursed", trigger: "tick", count: 1}, + ]}); + }, + "UnstableMagic": () => { + KDDamageAmpPerksSpell += KDUnstableAmp * Math.min(1, Math.max(KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax, KinkyDungeonMiscastChance)); + }, + + "CommonLatex": () => { + KDExtraEnemyTags.latexRestraints = 0; + KDExtraEnemyTags.latexRestraintsHeavy = 5; + }, + "CommonLeather": () => { + KDExtraEnemyTags.leatherRestraints = 0; + KDExtraEnemyTags.leatherRestraintsHeavy = 5; + }, + "CommonMaid": () => { + KDExtraEnemyTags.maidRestraints = 0; + KDExtraEnemyTags.maidVibeRestraintsLimited = 0; + }, + "CommonWolf": () => { + KDExtraEnemyTags.wolfRestraints = 0; + KDExtraEnemyTags.wolfCuffs = 3; + KDExtraEnemyTags.wolfGear = 0; + }, + "CommonDress": () => { + KDExtraEnemyTags.dressRestraints = 0; + }, + "CommonFuuka": () => { + KDExtraEnemyTags.mikoRestraints = 0; + }, + "CommonWarden": () => { + KDExtraEnemyTags.wardenCuffs = 0; + }, + "CommonCyber": () => { + KDExtraEnemyTags.cyberdollrestraints = 0; + KDExtraEnemyTags.cyberdollchastity = 5; + KDExtraEnemyTags.cyberdollheavy = 10; + }, + "CommonExp": () => { + KDExtraEnemyTags.expRestraints = 0; + }, + "CommonKitty": () => { + KDExtraEnemyTags.kittyRestraints = 0; + }, + "CommonToyPleasure": () => { + KDExtraEnemyTags.toyPleasure = 0; + KDExtraEnemyTags.toyPleasureMid = 5; + KDExtraEnemyTags.toyPleasureIntense = 10; + }, + "CommonToyEdge": () => { + KDExtraEnemyTags.toyEdge = 0; + KDExtraEnemyTags.toyEdgeMid = 5; + KDExtraEnemyTags.toyEdgeIntense = 10; + }, + "CommonToyDeny": () => { + KDExtraEnemyTags.toyDeny = 0; + KDExtraEnemyTags.toyDenyMid = 5; + KDExtraEnemyTags.toyDenyIntense = 10; + }, + "CommonToyTease": () => { + KDExtraEnemyTags.toyTease = 0; + KDExtraEnemyTags.toyTeaseMid = 5; + KDExtraEnemyTags.toyTeaseIntense = 10; + }, +}; + +let KDPerkCount: Record string> = { + "BerserkerRage": () => { + return " " + + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.25 ? "! " : "") + + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.5 ? "! " : "") + + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.75 ? "! " : ""); + }, + "UnstableMagic": () => { + return " " + + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.25 ? "! " : "") + + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.5 ? "! " : "") + + (KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > 0.75 ? "! " : ""); + }, + "BoundPower": () => { + return KDBoundPowerLevel > 0 ? Math.round(KDBoundPowerLevel * 100) + "%" : ""; + }, +}; + +let KinkyDungeonStatsPresets: Record = { + "MC_Fighter": {category: "Multiclass", id: "MC_Fighter", debuff: true, cost: 2, blockclass: ["Fighter"], tags: ["start", "mc"]}, + "MC_Rogue": {category: "Multiclass", id: "MC_Rogue", cost: 2, blockclass: ["Rogue"], tags: ["start", "mc"]}, + "MC_Wizard": {category: "Multiclass", id: "MC_Wizard", debuff: true, cost: 2, blockclass: ["Mage"], tags: ["start", "mc"]}, + "MC_Peasant": {category: "Multiclass", id: "MC_Peasant", debuff: true, cost: 1, blockclass: ["Peasant"], tags: ["start", "mc"]}, + "MC_Trainee": {category: "Multiclass", id: "MC_Trainee", cost: 2, requireArousal: true, blockclass: ["Trainee"], tags: ["start", "mc"]}, + + + "More_Armbinders": {category: "Toggles", id: "More_Armbinders", cost: 0, block: ["Less_Armbinders"]}, + "More_Jackets": {category: "Toggles", id: "More_Jackets", cost: 0, block: ["Less_Jackets"]}, + "More_Boxbinders": {category: "Toggles", id: "More_Boxbinders", cost: 0, block: ["Less_Boxbinders"]}, + "More_Yokes": {category: "Toggles", id: "More_Yokes", cost: 0, block: ["Less_Yokes"]}, + + "Less_Armbinders": {category: "Toggles", id: "Less_Armbinders", cost: 0, block: ["More_Armbinders"], debuff: true,}, + "Less_Jackets": {category: "Toggles", id: "Less_Jackets", cost: 0, block: ["More_Jackets"], debuff: true,}, + "Less_Boxbinders": {category: "Toggles", id: "Less_Boxbinders", cost: 0, block: ["More_Boxbinders"], debuff: true,}, + "Less_Yokes": {category: "Toggles", id: "Less_Yokes", cost: 0, block: ["More_Yokes"], debuff: true,}, + + "NovicePet": {category: "Major", id: "NovicePet", cost: 1}, + "Fortify_Barricade": {category: "Major", id: "Fortify_Barricade", cost: -1.5}, + "Fortify_Trap": {category: "Enemies", id: "Fortify_Trap", cost: -1}, + "CurseSeeker": {category: "Major", id: "CurseSeeker", cost: -3}, + "DirectionVision": {category: "Major", id: "DirectionVision", cost: -1.5}, + "DirectionSlow": {category: "Major", id: "DirectionSlow", cost: -1, block: ["DirectionSlow2"]}, + "DirectionSlow2": {category: "Major", id: "DirectionSlow2", cost: -2.5, block: ["DirectionSlow"]}, + "FutileStruggles": {category: "Restraints", id: "FutileStruggles", cost: -1}, + + "Forgetful": {category: "Major", id: "Forgetful", cost: -2}, + //"SecondWind": {category: "Restraints", id: "SecondWind", cost: 1}, + + "Stranger": {startPriority: 1000, category: "Enemies", id: "Stranger", cost: 0, block: ["Bandit", "WrongNeighborhood"], tags: ["start"]}, + "Bandit": {startPriority: 1000, category: "Enemies", id: "Bandit", cost: 0, block: ["Stranger", "WrongNeighborhood"], tags: ["start"]}, + "WrongNeighborhood": {startPriority: 1000, category: "Major", id: "WrongNeighborhood", cost: -1, block: ["Bandit", "Stranger"], tags: ["start"]}, + + "Strong": {category: "Restraints", id: 0, cost: 2, block: ["Weak"]}, + "Weak": {category: "Restraints", id: 1, cost: -1, block: ["Strong"]}, + "Flexible": {category: "Restraints", id: 2, cost: 1.5, block: ["Inflexible"]}, + "Inflexible": {category: "Restraints", id: 3, cost: -1, block: ["Flexible"]}, + "Locksmith": {category: "Restraints", id: 4, cost: 2, block: ["Clueless"]}, + "Clueless": {category: "Restraints", id: 5, cost: -1, block: ["Locksmith"]}, + "HighSecurity": {category: "Restraints", id: 48, cost: -1}, + //"SearchParty": {category: "Enemies", id: 51, cost: -1}, + "NoWayOut": {category: "Restraints", id: 52, cost: -1}, + "TightRestraints": {category: "Restraints", id: 54, cost: -0.5}, + "KinkyPrison": {category: "Restraints", id: "KinkyPrison", cost: -0.5}, + "MagicHands": {category: "Restraints", id: "MagicHands", cost: -1.5}, + "KeepOutfit": {category: "Restraints", id: "KeepOutfit", cost: 0}, + "CursedLocks": {category: "Restraints", id: "CursedLocks", cost: -1.5}, + "FranticStruggle": {category: "Restraints", id: "FranticStruggle", cost: 1.5}, + "UnidentifiedWear": {category: "Restraints", id: "UnidentifiedWear", cost: -1.5}, + "Unchained": {category: "Kinky", id: 26, cost: 2.5, block: ["Damsel"]}, + "Damsel": {category: "Kinky", id: 27, cost: -1, block: ["Unchained"]}, + "Artist": {category: "Kinky", id: 28, cost: 2.5, block: ["Bunny"]}, + "Bunny": {category: "Kinky", id: 29, cost: -1, block: ["Artist"]}, + "Slippery": {category: "Kinky", id: 30, cost: 2.5, block: ["Doll"]}, + "Doll": {category: "Kinky", id: 31, cost: -1, block: ["Slippery"]}, + "Escapee": {category: "Kinky", id: 32, cost: 2.5, block: ["Dragon"]}, + "Dragon": {category: "Kinky", id: 33, cost: -1, block: ["Escapee"]}, + "Dodge": {category: "Combat", id: 18, cost: 2.5, block: ["Distracted"]}, + "Distracted": {category: "Combat", id: 19, cost: -1.5, block: ["Dodge"]}, + "Submissive": {startPriority: 0, category: "Kinky", id: 10, cost: 0}, + "Wanted": {category: "Kinky", id: 11, cost: -0.5}, + "QuickDraw": {category: "Combat", id: 55, cost: 2.5, block: ["Disorganized"]}, + "Disorganized": {category: "Combat", id: 57, cost: -2, block: ["QuickDraw", "QuickScribe"]}, + "Brawler": {category: "Combat", id: 20, cost: 1.5, block: ["UnarmedSuck"]}, + "UnarmedSuck": {category: "Combat", id: "UnarmedSuck", cost: -1, block: ["Brawler"]}, + "UnarmedGrope": {category: "Combat", id: "UnarmedGrope", cost: 0, tags: ["unarmedreplace"], blocktags: ["unarmedreplace"]}, + "UnarmedPain": {category: "Combat", id: "UnarmedPain", cost: 0, tags: ["unarmedreplace"], blocktags: ["unarmedreplace"]}, + "UnarmedTickle": {category: "Combat", id: "UnarmedTickle", cost: 0, tags: ["unarmedreplace"], blocktags: ["unarmedreplace"]}, + "Clumsy": {category: "Combat", id: 21, cost: -1}, + + //"Slayer": {category: "Magic", id: 34, cost: 3}, + //"Magician": {category: "Magic", id: 36, cost: 3}, + //"Conjurer": {category: "Magic", id: 35, cost: 3}, + + "Focused": {category: "Combat", id: "Focused", cost: 2}, + "FocusedStaff": {category: "Combat", id: "FocusedStaff", cost: 1}, + "BondageLover": {category: "Kinky", id: 15, cost: -1}, + "Undeniable": {category: "Kinky", id: "Undeniable", cost: -1}, + "Needs": {category: "Kinky", id: "Needs", cost: -1}, + "BoundPower": {category: "Combat", id: 40, cost: 3}, + "SavourTheTaste": {category: "Combat", id: "SavourTheTaste", cost: -1}, + "ResilientFoes": {category: "Enemies", id: "ResilientFoes", cost: -1}, + "KillSquad": {category: "Major", id: 41, cost: -3.5, block: ["Conspicuous"]}, + "Stealthy": {category: "Major", id: 38, cost: 0}, + "HighProfile": {category: "Major", id: "HighProfile", cost: 0.5}, + "Conspicuous": {category: "Enemies", id: 39, cost: -1, block: ["KillSquad"]}, + "Dominant": {category: "Map", id: "Dominant", cost: 1.5, block: ["Oppression"]}, + "Oppression": {category: "Map", id: 50, cost: -1.5, block: ["Dominant"]}, + "Supermarket": {category: "Map", id: 42, cost: 1.5}, + "PriceGouging": {category: "Map", id: 43, cost: -2}, + "Psychic": {category: "Restraints", id: 6, cost: 4}, + + "Pristine": {category: "Map", id: 22, cost: -1}, + "LostTechnology": {category: "Major", buff: true, id: 23, cost: -0.5}, + //"Blessed": {category: "Map", id: 8, cost: 1}, + "Cursed": {category: "Major", id: 9, cost: -3.5}, + "Studious": {category: "Magic", id: 12, cost: 2, tags: ["start"]}, + //"Novice": {category: "Magic", id: 7, cost: -1}, + //"Meditation": {category: "Magic", id: 13, cost: 2}, + //"DistractionCast": {category: "Magic", id: "DistractionCast", cost: 2}, + "Clearheaded": {category: "Magic", id: "Clearheaded", cost: 1, block: ["ArousingMagic"]}, + "ArousingMagic": {category: "Magic", id: "ArousingMagic", cost: -1.5, block: ["Clearheaded"]}, + //"QuickScribe": {category: "Magic", id: 56, cost: 1, block: ["Disorganized"]}, + "BerserkerRage": {category: "Combat", id: "BerserkerRage", cost: 3}, + "UnstableMagic": {category: "Magic", id: "UnstableMagic", cost: 2}, + "Vengeance": {category: "Enemies", id: "Vengeance", cost: -1}, + "AbsoluteFocus": {category: "Magic", id: "AbsoluteFocus", cost: -1}, + + "SelfBondage": {category: "Start", id: "SelfBondage", cost: 0, tags: ["start"]}, + "HeelTraining": {category: "Start", id: "HeelTraining", cost: 0, tags: ["start"]}, + "ClassicHeels": {category: "Toggles", id: "ClassicHeels", cost: 0, tags: ["start"], blocktags: ["heels"]}, + + "MasteryHeels": {category: "Training", id: "MasteryHeels", cost: -1, tags: ["heels"], block: ["ClassicHeels"]}, + "PoorBalance": {category: "Combat", id: "PoorBalance", cost: -1, tags: ["heels"], block: ["ClassicHeels"]}, + "HeadStartHeels": {category: "Training", id: "HeadStartHeels", cost: 1, tags: ["start", "heels"], block: ["ClassicHeels"]}, + + "Hogtied": {startPriority: 50, category: "Start", id: "Hogtied", cost: -0.5, tags: ["start"]}, + "StartObsidian": {startPriority: 5, category: "Start", id: "StartObsidian", cost: -2.0, outfit: "Obsidian", tags: ["start"]}, + "StartWolfgirl": {startPriority: 10, category: "Start", id: "StartWolfgirl", cost: -2.0, outfit: "Wolfgirl", tags: ["start"]}, + "StartMaid": {startPriority: 20, category: "Start", id: "StartMaid", cost: -2.0, outfit: "Maid", tags: ["start"]}, + "StartLatex": {startPriority: 15, category: "Start", id: "StartLatex", cost: -1.5, tags: ["start"]}, + "StartShadow": {startPriority: 1, category: "Start", id: "StartShadow", cost: -1.5, tags: ["start"]}, + + "StartLatexIntegration": {startPriority: 1000, category: "Boss", id: "StartLatexIntegration", cost: -0.5, locked: true, buff: true, tags: ["start"]}, + + "StartCyberDollStorage": {startPriority: 1000, category: "Boss", id: "StartCyberDollStorage", cost: -0.5, locked: true, buff: true, tags: ["start"]}, + "StartCyberDoll": {startPriority: 7, category: "Boss", id: "StartCyberDoll", cost: -2.5, locked: true, tags: ["start"]}, + + "DollmakerVisor": {startPriority: 31, category: "Boss", id: "DollmakerVisor", cost: -1, block: ["DollmakerMask"], locked: true, tags: ["start"]}, + "DollmakerMask": {startPriority: 31, category: "Boss", id: "DollmakerMask", cost: -1, block: ["DollmakerVisor"], locked: true, tags: ["start"]}, + "FuukaCollar": {startPriority: 40, category: "Boss", buff: true, id: "FuukaCollar", cost: -2, locked: true, tags: ["start"]}, + "WardenBelt": {startPriority: 42, category: "Boss", buff: true, id: "WardenBelt", cost: -2, locked: true, tags: ["start"]}, + "QuakeCollar": {startPriority: -100, category: "Boss", buff: true, id: "QuakeCollar", cost: 2, locked: true, tags: ["start"]}, + + + "CommonCyber": {category: "Boss", id: "CommonCyber", cost: -1, locked: true}, + "CommonFuuka": {category: "Boss", id: "CommonFuuka", buff: true, cost: -1, locked: true}, + "CommonWarden": {category: "Boss", id: "CommonWarden", buff: true, cost: -1, locked: true}, + + "BulletHell": {category: "Enemies", id: "BulletHell", cost: -2, block: ["BulletHell2"]}, + "BulletHell2": {category: "Enemies", id: "BulletHell2", cost: -3, block: ["BulletHell"]}, + + + + "Nowhere": {category: "Enemies", id: "Nowhere", cost: -1}, + "LivingCollars": {category: "Enemies", id: "LivingCollars", cost: -2.5}, + "StunBondage": {category: "Enemies", id: "StunBondage", cost: -2.5}, + "Prisoner": {category: "Start", id: "Prisoner", cost: 0}, + + "Panic": {category: "Map", id: "Panic", cost: -1}, + "Panic2": {category: "Map", id: "Panic2", cost: -1}, + + "Rusted": {category: "Map", id: "Rusted", cost: 0.5}, + + + "OnlyBrats": {category: "Toggles", id: "OnlyBrats", cost: 0, tags: ["start"], block: ["NoBrats"]}, + "NoPolice": {category: "Toggles", id: "NoPolice", cost: 0, tags: ["start"], debuff: true}, + "MoreKinkyFurniture": {category: "Toggles", id: "MoreKinkyFurniture", cost: 0, tags: ["start"]}, + "NoBrats": {category: "Toggles", id: "NoBrats", cost: 0, tags: ["start"], debuff: true, block: ["OnlyBrats"]}, + "NoNurse": {category: "Toggles", id: "NoNurse", cost: 0, tags: ["start"], debuff: true}, + "TapePref": {category: "Toggles", id: "TapePref", cost: 0, tags: ["start"], block: ["TapeOptout"]}, + "TapeOptout": {category: "Toggles", id: "TapeOptout", cost: 0, tags: ["start"], debuff: true, block: ["TapePref"]}, + "SlimePref": {category: "Toggles", id: "SlimePref", cost: 0, tags: ["start"], block: ["SlimeOptout"]}, + "SlimeOptout": {category: "Toggles", id: "SlimeOptout", cost: 0, tags: ["start"], debuff: true, block: ["SlimePref"]}, + "BubblePref": {category: "Toggles", id: "BubblePref", cost: 0, tags: ["start"], block: ["BubbleOptout"]}, + "BubbleOptout": {category: "Toggles", id: "BubbleOptout", cost: 0, tags: ["start"], debuff: true, block: ["BubblePref"]}, + + "NoBlindfolds": {category: "Toggles", id: "NoBlindfolds", cost: 1, tags: ["start"], block: ["Blackout", "TotalBlackout"]}, + "Unmasked": {category: "Toggles", id: "Unmasked", cost: 0, tags: ["start"]}, + "NoHood": {category: "Toggles2", id: "NoHood", cost: 0, tags: ["start"]}, + "NoSenseDep": {category: "Toggles2", id: "NoSenseDep", cost: 0, tags: ["start"], debuff: true}, + "NoKigu": {category: "Toggles", id: "NoKigu", cost: 0, tags: ["start"], debuff: true}, + + "NoDoll": {category: "Toggles", id: "NoDoll", cost: 0, tags: ["start"], debuff: true}, + "NoPet": {category: "Toggles", id: "NoPet", cost: 0, tags: ["start"], debuff: true}, + "NoHelp": {category: "Toggles", id: "NoHelp", cost: 0, tags: ["start"]}, + + "Estim": {category: "Toggles", id: "Estim", cost: 0, tags: ["start"]}, + + + + "Quickness": {category: "Combat", id: "Quickness", cost: 2}, + + "BoundCrusader": {category: "Kinky", id: "BoundCrusader", cost: -1.5}, + "FreeBoob1": {category: "Restraints", id: "FreeBoob1", cost: 1.0, block: ["FreeBoob2"], requireArousal: true}, + "FreeBoob2": {category: "Restraints", id: "FreeBoob2", cost: 1.5, block: ["FreeBoob1"], requireArousal: true}, + + "Trespasser": {category: "Map", id: "Trespasser", cost: -1.5}, + + + "Butterfingers": {category: "Restriction", id: "Butterfingers", cost: -1.5}, + "WeakGrip": {category: "Restriction", id: "WeakGrip", cost: -1}, + + + + + + "Blackout": {category: "Senses", id: "Blackout", cost: -1, block: ["TotalBlackout", "NoBlindfolds"]}, + "TotalBlackout": {category: "Senses", id: "TotalBlackout", cost: -2.5, block: ["Blackout", "NoBlindfolds"]}, + "NightOwl": {category: "Senses", id: "NightOwl", cost: 2, block: ["NightBlindness", "MutualDarkness"]}, + //"MutualDarkness": {category: "Senses", id: "NightOwl", cost: 2, block: ["NightBlindness", "NightOwl"]}, + "Stalker": {category: "Senses", id: "Stalker", cost: 2,}, + "NightBlindness": {category: "Senses", id: "NightBlindness", cost: -1, block: ["NightOwl", "MutualDarkness"]}, + "Nearsighted": {category: "Senses", id: "Nearsighted", cost: -1.5, block: ["ArchersEye"]}, + "KeenHearing": {category: "Senses", id: "KeenHearing", cost: 1}, + "ArchersEye": {category: "Senses", id: "ArchersEye", cost: 1, block: ["Nearsighted"]}, + + "Stoic": {category: "Damage", id: "Stoic", cost: 0.5, block: ["Ticklish"]}, + "Ticklish": {category: "Damage", id: "Ticklish", cost: -0.5, block: ["Stoic"]}, + "Unperturbed": {category: "Damage", id: "Unperturbed", cost: 0.5, block: ["Lascivious"]}, + "Lascivious": {category: "Damage", id: "Lascivious", cost: -0.5, block: ["Unperturbed"]}, + "Masochist": {category: "Damage", id: "Masochist", cost: -0.5}, + "PainTolerance": {category: "Damage", id: "PainTolerance", cost: 0.5}, + + "Rigger": {category: "Damage", id: 24, cost: 2}, + "ExclusionsApply": {category: "Major", id: "ExclusionsApply", cost: -3, buff: true,}, + "Pacifist": {category: "Major", buff: true, id: 25, cost: -2.5}, + "EnemyResist": {category: "Enemies", id: "EnemyResist", cost: 0}, + "EnemyArmor": {category: "Enemies", id: "EnemyArmor", cost: -1.5}, + "EnemyDamage": {category: "Enemies", id: "EnemyDamage", cost: -1}, + "BurningDesire": {category: "Damage", id: "BurningDesire", cost: 1}, + "FrigidPersonality": {category: "Damage", id: "FrigidPersonality", cost: 2}, + "GroundedInReality": {category: "Damage", id: "GroundedInReality", cost: 1.5}, + "LikeTheWind": {category: "Damage", id: "LikeTheWind", cost: 1.5}, + "ImmovableObject": {category: "Damage", id: "ImmovableObject", cost: 1.5}, + "LeastResistance": {category: "Damage", id: "LeastResistance", cost: 1}, + + "Sticky": {category: "Damage", id: "Sticky", cost: -0.5}, + "Breathless": {category: "Damage", id: "Breathless", cost: -1}, + + "CommonMaid": {category: "Common", id: "CommonMaid", cost: -1, costGroup: "common"}, + "CommonLatex": {category: "Common", id: "CommonLatex", cost: -1, costGroup: "common"}, + "CommonLeather": {category: "Common", id: "CommonLeather", cost: -1, costGroup: "common"}, + "CommonExp": {category: "Common", id: "CommonExp", cost: -1, costGroup: "common"}, + "CommonDress": {category: "Common", id: "CommonDress", cost: -1, costGroup: "common"}, + "CommonWolf": {category: "Common", id: "CommonWolf", cost: -1, costGroup: "common"}, + "CommonKitty": {category: "Common", id: "CommonKitty", cost: -1, costGroup: "common"}, + "CommonToyPleasure": {category: "Common", id: "CommonToyPleasure", cost: 0, requireArousal: true}, + "CommonToyEdge": {category: "Common", id: "CommonToyEdge", cost: 0, requireArousal: true}, + "CommonToyDeny": {category: "Common", id: "CommonToyDeny", cost: 0, requireArousal: true}, + "CommonToyTease": {category: "Common", id: "CommonToyTease", cost: 0, requireArousal: true}, + "BiggerGags": {category: "Common", id: "BiggerGags", cost: -0.5}, + + "Incantation": {category: "Restriction", id: "Incantation", cost: -1, block: ["SmoothTalker"]}, + "SmoothTalker": {category: "Restriction", id: "SmoothTalker", cost: 2, block: ["Incantation"]}, + "SomaticPlus": {category: "Restriction", id: "SomaticPlus", cost: 2, block: ["SomaticMinus"]}, + "SomaticMinus": {category: "Restriction", id: "SomaticMinus", cost: -1, block: ["SomaticPlus"]}, + "HeelWalker": {category: "Restriction", id: 53, cost: 2.5, block: ["PoorForm"]}, + "PoorForm": {category: "Restriction", id: "PoorForm", cost: -1.5, block: ["HeelWalker"]}, + + "Doorknobs": {category: "Restriction", id: "Doorknobs", cost: -1.5}, + "CantTouchThat": {category: "Restriction", id: "CantTouchThat", cost: -2.5}, + "Grounded": {category: "Restriction", id: "Grounded", cost: -1}, + + + "MapLarge": {category: "Map", id: "MapLarge", cost: 0, tags: ["start", "mapsize"], blocktags: ["mapsize"]}, + "MapHuge": {category: "Map", id: "MapHuge", cost: 0, tags: ["start", "mapsize"], blocktags: ["mapsize"]}, + "MapGigantic": {category: "Map", id: "MapGigantic", cost: 0, tags: ["start", "mapsize"], blocktags: ["mapsize"]}, + "MapAbsurd": {category: "Map", id: "MapAbsurd", cost: 0, tags: ["start", "mapsize"], blocktags: ["mapsize"]}, + + "TrustFall": {category: "Restriction", id: "TrustFall", cost: -1, tags: ["heels"], block: ["ClassicHeels"]}, +}; + + + +function KDGetPerkCost(perk: KDPerk): number { + if (!perk) return 0; + if (!perk.costGroup) return perk.cost; + let costGroups = {}; + let first = false; + // Only the first one has a cost + for (let p of KinkyDungeonStatsChoice.keys()) { + if (KinkyDungeonStatsPresets[p] && KinkyDungeonStatsPresets[p].costGroup) { + if (!first) { + first = true; + if (KinkyDungeonStatsPresets[p].id == perk.id) { + return KinkyDungeonStatsPresets[p].cost; + } + } + costGroups[KinkyDungeonStatsPresets[p].costGroup] = KinkyDungeonStatsPresets[p].cost; + } + } + if (costGroups[perk.costGroup] != undefined && perk.cost >= costGroups[perk.costGroup]) return 0; + else return perk.cost; +} + +function KinkyDungeonGetStatPoints(Stats: Map): number { + let total = KinkyDungeonStatsChoice.get("vhardperksMode") ? -25 + : (KinkyDungeonStatsChoice.get("hardperksMode") ? -10 + : (KinkyDungeonStatsChoice.get("perksMode") ? 10 + : 0)); + for (let k of Stats.keys()) { + if (Stats.get(k)) { + if (KinkyDungeonStatsPresets[k]) { + total -= KDGetPerkCost(KinkyDungeonStatsPresets[k]); + } + } + } + return total; +} + +/** + * Determine if a perk can be picked with a certain number of points remaining + * @param Stat + * @param [points] + */ +function KinkyDungeonCanPickStat(Stat: string, points?: number): boolean { + let stat = KinkyDungeonStatsPresets[Stat]; + if (!stat) return false; + if (KDGetPerkCost(stat) > 0 && (points != undefined ? points : KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice)) < KDGetPerkCost(stat)) return false; + if (!KDValidatePerk(stat)) return false; + for (let k of KinkyDungeonStatsChoice.keys()) { + if (KinkyDungeonStatsChoice.get(k)) { + if (KinkyDungeonStatsPresets[k] && KinkyDungeonStatsPresets[k].block && KinkyDungeonStatsPresets[k].block.includes(Stat)) { + return false; + } + if (KinkyDungeonStatsPresets[k] && stat.tags && KinkyDungeonStatsPresets[k].blocktags) { + for (let t of KinkyDungeonStatsPresets[k].blocktags) + if (stat.tags.includes(t)) return false; + } + } + } + return true; +} + +/** + * General validation for a perk + * @param stat + */ +function KDValidatePerk(stat: KDPerk): boolean { + if (stat.requireArousal && !KinkyDungeonStatsChoice.get("arousalMode")) return false; + if (stat.blockclass) { + for (let t of stat.blockclass) + if (KinkyDungeonClassMode == t) return false; + } + return true; +} + +/** + * Determines if perk1 is blocked by another perk or in general + * @param perk1 + * @param perk2 + */ +function KDPerkBlocked(perk1: string, perk2: string): boolean { + if (KinkyDungeonStatsPresets[perk2] && KinkyDungeonStatsPresets[perk1]) { + if (!KDValidatePerk(KinkyDungeonStatsPresets[perk1])) return false; + if (KinkyDungeonStatsPresets[perk2].block && KinkyDungeonStatsPresets[perk2].block.includes(perk1)) { + return true; + } + if (KinkyDungeonStatsPresets[perk2] && KinkyDungeonStatsPresets[perk1].tags && KinkyDungeonStatsPresets[perk2].blocktags) { + for (let t of KinkyDungeonStatsPresets[perk2].blocktags) + if (KinkyDungeonStatsPresets[perk1].tags.includes(t)) return true; + } + } + return false; +} + +function KinkyDungeonCanUnPickStat(Stat: string): boolean { + let stat = KinkyDungeonStatsPresets[Stat]; + if (!stat) return false; + if (KDGetPerkCost(stat) < 0 && KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice) < -KDGetPerkCost(stat)) return false; + for (let k of KinkyDungeonStatsChoice.keys()) { + if (KinkyDungeonStatsChoice.get(k)) { + if (KinkyDungeonStatsPresets[k] && KinkyDungeonStatsPresets[k].require == Stat) { + return false; + } + } + } + return true; +} + + +function KDInitPerks() { + let magicHands = KinkyDungeonStatsChoice.has("MagicHands"); + if (!magicHands) { + // We use magichands for the start scenarios + KinkyDungeonStatsChoice.set("MagicHands", true); + } + KinkyDungeonPlayerTags = KinkyDungeonUpdateRestraints(); + for (let perk of [...KinkyDungeonStatsChoice.keys()].filter((e) => {return KDPerkStart[e] != undefined;}) + .sort((a, b) => { + return ((KinkyDungeonStatsPresets[a] && KinkyDungeonStatsPresets[a].startPriority) || -1) - ((KinkyDungeonStatsPresets[b] && KinkyDungeonStatsPresets[b].startPriority) || -1); + })) { + if (KinkyDungeonStatsChoice.get(perk) && KDPerkStart[perk]) { + KDPerkStart[perk](); + console.log("started with perk " + perk); + } + } + if (!magicHands) + KinkyDungeonStatsChoice.delete("MagicHands"); +} + +let KDPerkStart = { + Studious: () => { + KinkyDungeonSpellPoints += 1; + }, + + Submissive: () => { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BasicCollar"), 0, true, "Red", false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BasicLeash"), 0, true, "", false, undefined, undefined, undefined, true); + }, + Pacifist: () =>{ + KinkyDungeonInventoryAddWeapon("Rope"); + }, + Rigger: () =>{ + KinkyDungeonInventoryAddWeapon("Rope"); + KinkyDungeonInventoryAddWeapon("Scissors"); + }, + Unchained: () =>{ + KDAddConsumable("RedKey", 1); + }, + + FuukaCollar: () =>{ + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar2"), 0, true, undefined, false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoDress"), 0, true, undefined, false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoGag"), 0, true, undefined, false, undefined, undefined, undefined, true); + + KDFixPlayerClothes("Fuuka"); + if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + }, + QuakeCollar: () =>{ + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("QuakeCollar"), 0, true, undefined, false, undefined, undefined, undefined, true); + }, + WardenBelt: () =>{ + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true, undefined, false, undefined, undefined, undefined, true); + if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + }, + Prisoner: () =>{ + KDGameData.PrisonerState = 'parole'; + if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + }, + Slayer: () =>{ + KDPushSpell(KinkyDungeonFindSpell("Firebolt")); + KinkyDungeonSpellChoices[0] = KinkyDungeonSpells.length - 1; + }, + Conjurer: () =>{ + KDPushSpell(KinkyDungeonFindSpell("ChainBolt")); + KinkyDungeonSpellChoices[0] = KinkyDungeonSpells.length - 1; + }, + Magician: () =>{ + KDPushSpell(KinkyDungeonFindSpell("Dagger")); + KinkyDungeonSpellChoices[0] = KinkyDungeonSpells.length - 1; + }, + + Brawler: () =>{ + KinkyDungeonInventoryAddWeapon("Knife"); + KDSetWeapon("Knife"); + KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon()); + }, + NovicePet: () =>{ + KinkyDungeonInventoryAddLoose("MagicPetsuit"); + }, + SelfBondage: () =>{ + if (KinkyDungeonStatsChoice.get("arousalMode")) { + KinkyDungeonInventoryAddLoose("TrapBelt"); + KinkyDungeonInventoryAddLoose("TrapVibe"); + if (!KinkyDungeonStatsChoice.get("arousalModePlugNoFront")) { + KinkyDungeonInventoryAddLoose("TrapPlug"); + } + } + if (KinkyDungeonStatsChoice.get("arousalModePlug")) { + KinkyDungeonInventoryAddLoose("RearVibe1"); + } + KinkyDungeonInventoryAddLoose("TrapMittens"); + KinkyDungeonInventoryAddLoose("TrapCuffs"); + KinkyDungeonInventoryAddLoose("TrapGag"); + KinkyDungeonInventoryAddLoose("TrapBlindfold"); + KinkyDungeonInventoryAddLoose("TrapArmbinder"); + KinkyDungeonInventoryAddLoose("RopeSnakeArmsBoxtie"); + KinkyDungeonInventoryAddLoose("RopeSnakeArmsWrist"); + KinkyDungeonInventoryAddLoose("RopeSnakeLegs"); + KinkyDungeonInventoryAddLoose("RopeSnakeFeet"); + KinkyDungeonInventoryAddLoose("SturdyLeatherBeltsArms"); + KinkyDungeonInventoryAddLoose("SturdyLeatherBeltsLegs"); + KinkyDungeonInventoryAddLoose("SturdyLeatherBeltsFeet"); + }, + HeelTraining: () =>{ + KDGameData.Training.Heels = { + training_points: 0, + training_stage: 0, + turns_skipped: 0, + turns_total: 0, + turns_trained: 0, + }; + KinkyDungeonAddRestraintIfWeaker("TrainingHeels", 20, true, "HiSec", false, undefined, undefined, undefined, true); + }, + HeadStartHeels: () =>{ + KDGameData.Training.Heels = { + training_points: 0, + training_stage: 5, + turns_skipped: 0, + turns_total: 0, + turns_trained: 0, + }; + KinkyDungeonInventoryAddLoose("TrainingHeels"); + + }, + StartLatex: () =>{ + KDAddQuest("LatexDoll"); + KinkyDungeonChangeRep("Latex", 10); + KDCustomDefeatUniforms.DollShoppe(); + KDFixPlayerClothes("Dressmaker"); + if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + }, + DollmakerVisor: () =>{ + KinkyDungeonAddRestraintIfWeaker("DollmakerVisor", 5, true, "Gold", false, undefined, undefined, undefined, true); + KDFixPlayerClothes("Dollsmith"); + }, + DollmakerMask: () =>{ + KinkyDungeonAddRestraintIfWeaker("DollmakerMask", 5, true, "Gold", false, undefined, undefined, undefined, true); + KDFixPlayerClothes("Dollsmith"); + }, + StartCyberDollStorage: () =>{ + KinkyDungeonChangeRep("Metal", -25); + + KDFixPlayerClothes("AncientRobot"); + KDEnterDollTerminal(false); + if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + }, + StartLatexIntegration: () =>{ + KDFixPlayerClothes("AncientRobot"); + KDAddSpecialStat("LatexIntegration", KDPlayer(), 100, true); + + if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + }, + StartCyberDoll: () =>{ + KDAddQuest("EscapedDoll"); + KinkyDungeonChangeRep("Metal", 10); + + KDCustomDefeatUniforms.CyberDoll(); + KDFixPlayerClothes((KinkyDungeonStatsChoice.get("DollmakerVisor") || KinkyDungeonStatsChoice.get("DollmakerMask") || KinkyDungeonStatsChoice.get("CommonCyber")) ? "Dollsmith" : "AncientRobot"); + if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + KDAddConsumable("RedKey", -1000); + KDAddConsumable("Pick", -1000); + }, + StartMaid: () =>{ + KDAddQuest("MaidSweeper"); + KDChangeFactionRelation("Player", "Maidforce", 0.2 - KDFactionRelation("Player", "Maidforce"), true); + KDCustomDefeatUniforms.MaidSweeper(); + + KinkyDungeonInventoryAddLoose("DusterGag"); + KDFixPlayerClothes("Maidforce"); + if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + KDAddConsumable("RedKey", -1000); + KDAddConsumable("Pick", -1000); + }, + StartWolfgirl: () =>{ + KDChangeFactionRelation("Player", "Nevermere", 0.2 - KDFactionRelation("Player", "Nevermere"), true); + KDCustomDefeatUniforms.WolfgirlHunters(); + KDAddQuest("WolfgirlHunters"); + KDFixPlayerClothes("Nevermere"); + if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + KDAddConsumable("RedKey", -1000); + KDAddConsumable("Pick", -1000); + }, + StartObsidian: () =>{ + KDChangeFactionRelation("Player", "Elemental", 0.2 - KDFactionRelation("Player", "Elemental"), true); + + KDAddQuest("ElementalSlave"); + KDCustomDefeatUniforms.ElementalSlave(); + + KDFixPlayerClothes("Elemental"); + if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + KDAddConsumable("RedKey", -1000); + KDAddConsumable("Pick", -1000); + }, + Hogtied: () =>{ + KDAddQuest("Nawashi"); + KDCustomDefeatUniforms.RopeDojo(); + + for (let w of kdStartWeapons) { + if (KinkyDungeonInventoryGet(w)) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet(w)); + } + KDFixPlayerClothes("Jail"); + if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + KDAddConsumable("RedKey", -1000); + KDAddConsumable("Pick", -1000); + }, + Bandit: () =>{ + for (let key of Object.keys(KinkyDungeonFactionTag)) { + KDSetFactionRelation("Player", key, -0.55); + } + KDChangeFactionRelation("Player", "Bandit", 0.1 - KDFactionRelation("Player", "Bandit"), true); + KDChangeFactionRelation("Player", "Nevermere", 0.1 - KDFactionRelation("Player", "Nevermere"), true); + }, + + Stranger: () => { + for (let key of Object.keys(KinkyDungeonFactionTag)) { + if (!KinkyDungeonHiddenFactions.has(key)) + KDSetFactionRelation("Player", key, -1 + 0.45 * KDRandom() + 0.45 * KDRandom() + 0.45 * KDRandom()); + } + }, + WrongNeighborhood: () => { + for (let key of Object.keys(KinkyDungeonFactionTag)) { + if (!KinkyDungeonHiddenFactions.has(key)) { + KDSetFactionRelation("Player", key, -1); + for (let key2 of Object.keys(KinkyDungeonFactionTag)) { + KDSetFactionRelation(key, key2, 0.5); + } + } + } + }, + Cursed: () => { + KinkyDungeonChangeFactionRep("Angel", -100); + for (let rep of Object.keys(KinkyDungeonShrineBaseCosts)) { + KinkyDungeonChangeRep(rep, 0); + } + }, + MC_Trainee: () => { + KDPushSpell(KinkyDungeonFindSpell("DistractionCast")); + }, + MC_Wizard: () => { + KDPushSpell(KinkyDungeonFindSpell("ManaRegen")); + }, + MC_Rogue: () => { + KDPushSpell(KinkyDungeonFindSpell("RogueTargets")); + }, + MC_Peasant: () => { + KDPushSpell(KinkyDungeonFindSpell("Peasant")); + }, + MC_Fighter: () => { + KDPushSpell(KinkyDungeonFindSpell("BattleRhythm")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDPushSpell(KinkyDungeonFindSpell("Offhand")); + KinkyDungeonSpellChoices.push(KinkyDungeonSpells.length - 1); + KDPushSpell(KinkyDungeonFindSpell("FighterOffhand")); + + }, +}; + + +let KDPerksFilter = ""; + +let KDPerksButtonWidth = 298; +let KDPerksButtonWidthPad = 2; +let KDPerksButtonHeight = 44; +let KDPerksButtonHeightPad = 2; +let KDPerksXPad = 50; +let KDPerksYPad = 50; +let KDPerksYStart = 220; +let KDPerksXStart = 50; +let KDPerksMaxY = 900; +let KDPerksScroll = KDPerksButtonWidth * 2 + KDPerksButtonWidthPad * 2 + KDPerksXPad; +let KDPerksIndex = 0; +let KDPerksIndexUI = 0; +let KDPerksIndexUIWeight = 4; + +let KDCategories = [ + +]; + +function KinkyDungeonDrawPerks(NonSelectable: boolean): boolean { + let fadeColor = NonSelectable ? "#808080" : "#999999"; + let X = Math.round(KDPerksXStart - KDPerksScroll * KDPerksIndexUI); + let Y = KDPerksYStart; + let Y_alt = KDPerksYStart; + if (CommonIsMobile) KDPerksIndexUIWeight = 1; + KDPerksIndexUI = (KDPerksIndex + (KDPerksIndexUIWeight - 1) * KDPerksIndexUI) / KDPerksIndexUIWeight; + + /*MainCanvas.beginPath(); + MainCanvas.lineWidth = 3; + MainCanvas.strokeStyle = KDBorderColor; + MainCanvas.moveTo(50, 120); + MainCanvas.lineTo(1950, 120); + MainCanvas.stroke(); + MainCanvas.closePath();*/ + + let tooltip = false; + let catsdrawn = 0; + let catsdrawnStrict = 0; + + function inView() { + return X > -2 * KDPerksButtonWidth - KDPerksButtonWidthPad && X < 2000 - KDPerksButtonWidth; + } + function inViewStrict() { + return X > 0 && X < 2000 - KDPerksButtonWidth; + } + + let indexX = 0; + let indexList = {}; + + let firstDrawn = ""; + + let filled_x = { + + }; + + let perksdrawn = 0; + + for (let c of KDCategories) { + Y = Math.max(Y, Y_alt); + let height = KDPerksYPad + KDPerksButtonHeight*Math.max(c.buffs.length, c.debuffs.length); + if (Y + height > KDPerksMaxY) { + X += (KDPerksButtonWidth + KDPerksButtonWidthPad)*2 + KDPerksXPad; + indexX += 1; + Y = KDPerksYStart; + } + + let oldY = Y; + let oldYAlt = Y_alt; + Y += KDPerksYPad; + Y_alt = Y; + + let drawn = 0; + for (let stat of c.buffs.concat(c.debuffs)) { + if ((!stat[1].locked || KDUnlockedPerks.includes(stat[0])) + && (NonSelectable || !KDPerksFilter || TextGet("KinkyDungeonStat" + ("" + stat[1].id)).toLocaleLowerCase().includes(KDPerksFilter.toLocaleLowerCase()))) { + let YY = (!stat[1].buff && (stat[1].cost < 0 || stat[1].debuff)) ? Y_alt : Y; + let XX = (!stat[1].buff && (stat[1].cost < 0 || stat[1].debuff)) ? X + KDPerksButtonWidth + KDPerksButtonWidthPad : X; + + drawn++; + perksdrawn++; + if (inView()) { + let colorAvailable = NonSelectable ? + fadeColor : + KDGetPerkCost(stat[1]) > 0 ? + "#aaaacc" : + KDGetPerkCost(stat[1]) < 0 ? + "#ccaaaa" : + "#aaaacc"; + let colorSelected = KDGetPerkCost(stat[1]) > 0 ? "#eeeeff" : KDGetPerkCost(stat[1]) < 0 ? "#ffeeee" : "#eeeeff"; + let colorExpensive = KDGetPerkCost(stat[1]) > 0 ? "#555588" : KDGetPerkCost(stat[1]) < 0 ? "#885555" : "#555588"; + + //perksdrawn++;x + DrawButtonKDExTo(kdUItext, stat[0], (_bdata) => { + if (!KinkyDungeonStatsChoice.get(stat[0]) && KinkyDungeonCanPickStat(stat[0])) { + KinkyDungeonStatsChoice.set(stat[0], true); + localStorage.setItem('KinkyDungeonStatsChoice' + KinkyDungeonPerksConfig, JSON.stringify(Array.from(KinkyDungeonStatsChoice.keys()))); + } else if (KinkyDungeonStatsChoice.get(stat[0])) { + KinkyDungeonStatsChoice.delete(stat[0]); + localStorage.setItem('KinkyDungeonStatsChoice' + KinkyDungeonPerksConfig, JSON.stringify(Array.from(KinkyDungeonStatsChoice.keys()))); + } + if (KDClipboardDisabled) { + let txt = ""; + for (let k of KinkyDungeonStatsChoice.keys()) { + if (!k.startsWith("arousal") && !k.endsWith("Mode")) txt += (txt ? "|" : "") + k; + } + ElementValue("KDCopyPerks", txt); + } + return true; + }, !NonSelectable && (KinkyDungeonState == "Stats" || (KinkyDungeonDrawState == "Perks2" && KDDebugPerks)), XX, YY, KDPerksButtonWidth, KDPerksButtonHeight, + TextGet("KinkyDungeonStat" + (stat[1].id)) + ` (${Math.round(KDPERKCOSTMULT*KDGetPerkCost(stat[1]))})`, + (!KinkyDungeonStatsChoice.get(stat[0]) && KinkyDungeonCanPickStat(stat[0])) ? colorAvailable : (KinkyDungeonStatsChoice.get(stat[0]) ? colorSelected : (NonSelectable ? colorAvailable : colorExpensive)), + KinkyDungeonStatsChoice.get(stat[0]) ? (KinkyDungeonRootDirectory + "UI/TickPerk.png") : "", + undefined, false, true, + KinkyDungeonStatsChoice.get(stat[0]) ? "rgba(140, 140, 140, 0.5)" : KDButtonColor, + undefined, undefined, { + noTextBG: true, + unique: true, + }); + if (MouseIn(XX, YY, KDPerksButtonWidth, KDPerksButtonHeight)) { + DrawTextFitKD(TextGet("KinkyDungeonStatDesc" + (stat[1].id)), 1000, 150, 1500, KDTextWhite, KDTextGray1); + DrawTextFitKD(TextGet("KinkyDungeonStatCost").replace("AMOUNT", + Math.round(KDPERKCOSTMULT*KDGetPerkCost(stat[1])) + ""), 1000, 190, 1400, KDTextWhite, KDTextGray1); + tooltip = true; + } + } + if (!filled_x[X]) { + FillRectKD(kdUItext, kdpixisprites, c.name, { + Left: X - KDPerksButtonWidthPad, + Top: KDPerksYStart, + Width: 2 * KDPerksButtonWidth + 3 * KDPerksButtonWidthPad, + Height: KDPerksMaxY - KDPerksYStart, + Color: KDTextGray0, + LineWidth: 1, + zIndex: 60, + alpha: 0.4, + }); + filled_x[X] = X; + } + if (!stat[1].buff && (stat[1].cost < 0 || stat[1].debuff)) Y_alt += KDPerksButtonHeight + KDPerksButtonHeightPad; + else Y += KDPerksButtonHeight + KDPerksButtonHeightPad; + } + } + + if (drawn > 0) { + DrawTextFitKDTo(kdUItext, TextGet("KDCategory" + c.name), X + KDPerksButtonWidth + KDPerksButtonWidthPad/2, oldY + KDPerksYPad - KDPerksButtonHeight/2 - 5, KDPerksButtonWidth*2, "#ffffff", + undefined, undefined, undefined, undefined, undefined, undefined, true); + //MainCanvas.textAlign = "left"; + //MainCanvas.textAlign = "center"; + if (inView()) { + catsdrawn += 1; + } + if (inViewStrict()) { + catsdrawnStrict += 1; + if (!firstDrawn) firstDrawn = c.name; + } + } else { + Y = oldY; + Y_alt = oldYAlt; + } + indexList[c.name] = indexX; + } + + + DrawButtonKDEx("perks>", (_bdata) => { + if (catsdrawn > 2 && !(document.activeElement?.id == 'PerksFilter')) { + KDPerksIndex += 1; + } + return true; + }, true, 1750, 50, 100, 50, ">>", KDTextWhite); + + DrawButtonKDEx("perks<", (_bdata) => { + if (KDPerksIndex > 0 && !(document.activeElement?.id == 'PerksFilter')) { + KDPerksIndex -= 1; + } + return true; + }, true, 150, 50, 100, 50, "<<", KDTextWhite); + + let procList = KDCategoriesStart.map((e) => {return e.name;}); + let adjLists = GetAdjacentList(procList, procList.indexOf(firstDrawn), catsdrawnStrict); + let left = adjLists.left; + let right = adjLists.right; + + drawVertList(left.reverse(), 380, tooltip ? 85 : 190, 250, 25, tooltip ? 4 : 8, 18, (data: any) => { + return (_bdata: any) => { + KDPerksIndex = indexList[data.name]; + return true; + }; + }, "KDCategory"); + drawVertList(right, 1620, tooltip ? 85 : 190, 250, 25, tooltip ? 4 : 8, 18, (data: any) => { + return (_bdata: any) => { + KDPerksIndex = Math.max(0, indexList[data.name] - 2); + return true; + }; + }, "KDCategory"); + + if ((catsdrawn < 3 || perksdrawn == 0) && KDPerksIndex > 0) KDPerksIndex -= 1; + + + return tooltip; +} + +/** + * @param list + * @param x + * @param y + * @param w + * @param h + * @param max + * @param fontSize + * @param clickfnc + * @param prefix + */ +function drawVertList(list: any[], x: number, y: number, w: number, h: number, max: number, fontSize: number, clickfnc: (a: any) => ((a: any) => boolean), prefix: string) { + for (let i = 0; i < list.length && i < max; i++) { + let name = list[i]; + DrawButtonKDEx(name + x + "," + y, clickfnc({name: name}), true, x - w/2, y - (h+1) * i, w, h, TextGet(prefix + name), KDTextWhite, undefined, undefined, undefined, true, undefined, fontSize); + } +} + + +/** + * @param list + * @param x + * @param y + * @param w + * @param h + * @param max + * @param fontSize + * @param clickfnc + * @param prefix + * @param reverse + */ +function drawHorizList(list: any[], x: number, y: number, w: number, h: number, max: number, fontSize: number, clickfnc: (a: any) => ((a: any) => boolean), prefix: string, reverse: boolean) { + for (let i = 0; i < list.length && i < max; i++) { + let name = list[i]; + DrawButtonKDEx(name + x + "," + y, clickfnc({name: name}), true, x + (reverse ? -1 : 1) * (w+1) * i - w/2, y, w, h, + TextGet(prefix + name), KDTextWhite, undefined, undefined, undefined, true, KDButtonColor, fontSize); + } +} + +/** + * @param existing + * @param [debuff] + */ +function KDGetRandomPerks(existing: Record, debuff?: boolean, threshold: number = 1.6): string[] { + let poscandidate = null; + let poscandidates = []; + let singlepointcandidates = []; + let negcandidates = []; + if (!debuff) { + for (let p of Object.entries(KinkyDungeonStatsPresets)) { + if (!existing[p[0]] && !KinkyDungeonStatsChoice.get(p[0]) && KinkyDungeonCanPickStat(p[0], 999)) { // No dupes + if ((!p[1].tags || !p[1].tags.includes("start"))) { + if (!p[1].locked || KDUnlockedPerks.includes(p[0])) { + if (KDGetPerkCost(p[1]) > 0) { + poscandidates.push(p); + if (KDGetPerkCost(p[1]) <= 1) + singlepointcandidates.push(p); + } else if (KDGetPerkCost(p[1]) < 0) { + negcandidates.push(p); + } + } + } + } + } + + poscandidate = poscandidates[Math.floor(poscandidates.length * KDRandom())]; + if (!poscandidate) return []; + } else { + for (let p of Object.entries(KinkyDungeonStatsPresets)) { + if (!existing[p[0]] && !KinkyDungeonStatsChoice.get(p[0]) && KinkyDungeonCanPickStat(p[0], 999)) { // No dupes + if ((!p[1].tags || !p[1].tags.includes("start"))) { + if (!p[1].locked || KDUnlockedPerks.includes(p[0])) { + if (KDGetPerkCost(p[1]) < 0) { + negcandidates.push(p); + } + } + } + } + } + } + + + let netcost = debuff ? 0 : KDGetPerkCost(poscandidate[1]); + let perks = poscandidate ? [poscandidate[0]] : []; + if (debuff || KDGetPerkCost(poscandidate[1]) > threshold) { + negcandidates = negcandidates.filter((p) => { + return (KinkyDungeonCanPickStat(p[0], 999)) + && (debuff || !KDPerkBlocked(p[0], poscandidate[0])) + && (-KDGetPerkCost(p[1]) >= (debuff ? 0 : (KDGetPerkCost(poscandidate[1]) - 1))); + }); + let negperk = null; + if (negcandidates.length > 0) { + negperk = negcandidates[Math.floor(negcandidates.length * KDRandom())]; + perks.push(negperk[0]); + netcost += KDGetPerkCost(negperk[1]); + } + + if (!debuff && netcost < 0 && negperk) { + singlepointcandidates = negcandidates.filter((p) => { + return (KinkyDungeonCanPickStat(p[0], 999) + && p[0] != poscandidate[0] + && p[0] != negperk[0] + && !KDPerkBlocked(p[0], poscandidate[0]) + && !KDPerkBlocked(p[0], negperk[0])); + }); + let newperk = singlepointcandidates[Math.floor(singlepointcandidates.length * KDRandom())]; + perks = [perks[0], newperk[0], perks[1]]; + } + } + return perks; +} + +/** + * @param perks + */ +function KDGetPerkShrineBondage(perks: string[]): string[] { + let ret = []; + if (!KinkyDungeonStatsChoice.get("perkNoBondage")) { + let cost = 0; + + for (let p of perks) { + if (KinkyDungeonStatsPresets[p]) { + cost += KDGetPerkCost(KinkyDungeonStatsPresets[p]); + } + } + + let chancePos = KinkyDungeonStatsChoice.get("perkBondage") ? 1.0 : 0.5; + let chanceNeg = KinkyDungeonStatsChoice.get("perkBondage") ? 1.0 : 0.25; + let prev = ""; + let theme = ""; + let randTheme = () => { + prev = theme; + return CommonRandomItemFromList(prev, [ + "leatherRestraints", + "latexRestraints", + "mithrilRestraints", + "obsidianRestraints", + "cyberdollrestraints", + "controlHarness", + "dragonRestraints", + "expRestraints", + "dressRestraints", + "maidRestraints", + ]); + }; + theme = randTheme(); + + let getRestraints = () => { + let restraints = []; + for (let i = 0; i < 11; i++) { + if (restraints.length == 0) { + if (i > 0) + randTheme(); + restraints = KDGetRestraintsEligible({tags: [theme, theme+"Heavy", theme+"Chastity"]}, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + true, "Gold"); + restraints = restraints.filter((r) => { + return !ret.includes(r.restraint.name); + }); + } else break; + } + return restraints; + }; + + for (let i = 0; i < (Math.abs(cost) || 1); i++) { + if (cost > 0 && KDRandom() < chancePos) { + let rests = getRestraints(); + if (rests?.length > 0) ret.push(rests[Math.floor(KDRandom() * rests.length)].restraint.name); + } else if (cost <= 0 && KDRandom() < chanceNeg) { + let rests = getRestraints(); + if (rests?.length > 0) ret.push(rests[Math.floor(KDRandom() * rests.length)].restraint.name); + } + } + + } + + return ret; +} diff --git a/Game/src/player/KinkyDungeonStats.ts b/Game/src/player/KinkyDungeonStats.ts new file mode 100644 index 000000000..f745629e3 --- /dev/null +++ b/Game/src/player/KinkyDungeonStats.ts @@ -0,0 +1,2316 @@ +"use strict"; +/** Player entity */ +let KinkyDungeonPlayerEntity: any = {id: -1, Enemy: undefined, hp: 10, x: 0, y:0, player:true}; // The current player entity + + +let KDBaseBalanceDmgLevel = 5; // Decides how much heels affect balance loss from attacks. higher = less loss +let KDShadowThreshold = 1.5; + +let KDSleepWillFraction = 0.5; +let KDSleepWillFractionJail = 0.5; + +let KDOrgAfterglowTime = 10; + +// Ratio of max shield to willpower max +let KDShieldRatio = 1; + +function KDGetSleepWillFraction() { + if (KDGameData.PrisonerState == 'jail') return KDSleepWillFractionJail; + return KDSleepWillFraction; +} + +// Distraction -- It lowers your stamina regen +let KDMaxStat = 40; // Maximum any stat can get boosted to +let KDMaxStatStart = 10; // Start of stats +let KDMaxStatStartPool = 40; // Start of stats + +let KDStamDamageThresh = 0.3; +let KDStamDamageThreshBonus = 0.01; + +let KDSleepRegenWill = KDSleepWillFractionJail * KDMaxStatStart/40; + +let KinkyDungeonStatDistractionMax = KDMaxStatStart; +let KDDistractionLowerPercMult = 0.1; +let KinkyDungeonStatDistractionLower = 0; +let KinkyDungeonStatDistractionLowerCap = 0.9; +let KinkyDungeonStatArousalLowerRegenSleep = 0; // Decrease lower distraction in sleep? +let KinkyDungeonDistractionUnlockSuccessMod = 0.5; // Determines how much harder it is to insert a key while aroused. 1.0 is half success chance, 2.0 is one-third, etc. +let KinkyDungeonStatDistraction = 0; +let KinkyDungeonCrotchRopeDistraction = 0.4; +let KinkyDungeonStatDistractionRegen = -1.0; +let KinkyDungeonStatDistractionRegenPerUpgrade = KinkyDungeonStatDistractionRegen*0.1; +let KDNoUnchasteBraMult = 0.9; +let KDNoUnchasteMult = 0.8; +let KDDistractionDecayMultDistractionMode = 0.25; +let KDDistractedAmount = 0.15; +let KinkyDungeonStatDistractionMiscastChance = 0.7; // Miscast chance at max distraction +let KinkyDungeonMiscastChance = 0; +let KinkyDungeonVibeLevel = 0; +let KinkyDungeonTeaseLevel = 0; +/** This is super powerful teasing that bypasses chastity */ +let KinkyDungeonTeaseLevelBypass = 0; +let KinkyDungeonOrgasmVibeLevel = 0; +let KinkyDungeonDistractionPerVibe = 0.2; // How much distraction per turn per vibe energy cost +let KinkyDungeonDistractionPerPlug = 0.1; // How much distraction per move per plug level +let KinkyDungeonVibeCostPerIntensity = 0.15; + +let KinkyDungeonStatWillpowerExhaustion = 0; +let KinkyDungeonSleepTurnsMax = 41; +// Note that things which increase max distraction (aphrodiasic) also increase the max stamina drain. This can end up being very dangerous as being edged at extremely high distraction will drain all your energy completely, forcing you to wait until the torment is over or the drugs wear off + +// Stamina -- your MP. Used to cast spells and also struggle +let KinkyDungeonStatStaminaMax = KDMaxStatStart; +let KinkyDungeonStatStamina = KinkyDungeonStatStaminaMax; +let KinkyDungeonStatStaminaRegen = 0.5; +let KinkyDungeonStatStaminaRegenPerUpgrade = 0.0; +let KinkyDungeonStatStaminaRegenPerUpgradeWill = 0.02; +let KDNarcolepticRegen = -0.06; +let KinkyDungeonStatStaminaRegenJail = 0.125; +let KinkyDungeonStatStaminaRegenSleep = KinkyDungeonStatStaminaMax/40; +let KinkyDungeonStatStaminaRegenSleepBedMultiplier = 1.5; +let KinkyDungeonStatStaminaRegenWait = 0.5; +let KinkyDungeoNStatStaminaLow = 4; +let KDSprintCostBase = 1.5; // Cost of sprinting +let KDSprintCostSlowLevel = [0.5, 1.0, 0.0, 0.5, 1.0]; // Extra cost per slow level +let KinkyDungeonStatWillMax = KDMaxStatStart; +let KinkyDungeonStatWill = KinkyDungeonStatWillMax; +let KinkyDungeonStatWillRate = 0; +let KinkyDungeonStatManaMax = KDMaxStatStart; +let KinkyDungeonStatMana = KinkyDungeonStatManaMax; +let KinkyDungeonStatManaPool = KinkyDungeonStatManaMax; +let KinkyDungeonStatManaPoolMax = KDMaxStatStartPool; +let KDManaPoolRatio = 1.0; // 1 point of mana costs 1 points of pool mana +let KinkyDungeonStatManaRate = 0; +let KinkyDungeonStatManaRegen = 0; // How fast stamina that is converted to mana regenerates +let KinkyDungeonStatManaLowRegen = 0; // How fast stamina that is converted to mana regenerates when low +let KDMeditationRegen = 0.1; +let KinkyDungeonStatManaRegenLowThreshold = 5; // Threshold for fast mana regen +let KinkyDungeonStatManaPoolRegen = 0.01; // Threshold for pool mana regen, % of max mana +let KinkyDungeonStatStaminaRegenPerSlowLevel = -0.03; // It costs stamina to move while bound +let KinkyDungeonStatStaminaCostStruggle = -3.0; // It costs stamina to struggle +let KinkyDungeonStatStaminaCostRemove = -0.5; // It costs stamina to struggle +let KinkyDungeonStatStaminaCostTool = -0.2; // It costs stamina to cut, but much less +let KinkyDungeonStatStaminaCostPick = -0.1; // It costs stamina to pick, but much less + + +let KinkyDungeonStatWillCostStruggle = 0; // It costs will to struggle +let KinkyDungeonStatWillCostRemove = 0; // It costs will to struggle +let KinkyDungeonStatWillCostTool = 0; // It costs will to cut, but much less +let KinkyDungeonStatWillCostPick = 0; // It costs stamina to pick, but much less +let KinkyDungeonStatWillCostUnlock = 0; // It costs stamina to pick, but much less + +let KinkyDungeonStatWillCostEscape = -0.2; // It costs will to struggle out of an item +let KinkyDungeonStatWillBonusEscape = 0.2; // Bonus for Second Wind + +let KinkyDungeonStaminaRate = KinkyDungeonStatStaminaRegen; + +// Current Status +let KinkyDungeonStatBeltLevel = 0; // Chastity bra does not add belt level +let KinkyDungeonStatPlugLevel = 0; // Cumulative with front and rear plugs +let KinkyDungeonPlugCount = 0; +let KinkyDungeonStatVibeLevel = 0; // Cumulative with diminishing returns for multiple items +let KinkyDungeonStatEdged = false; // If all vibrating effects are edging, then this will be true + +let KinkyDungeonStatDistractionGainChaste = -0.1; // Cumulative w/ groin and bra + + +// Restraint stats + +let KinkyDungeonSlowLevel = 0; // Adds to the number of move points you need before you move + +let KinkyDungeonBlindLevelBase = 0; // Base, increased by buffs and such, set to 0 after consumed in UpdateStats +let KinkyDungeonBlindLevel = 0; // Blind level 1: -33% vision, blind level 2: -67% vision, Blind level 3: Vision radius = 1 +let KinkyDungeonStatBlind = 0; // Used for temporary blindness +let KinkyDungeonStatFreeze = 0; // Used for temporary freeze +let KinkyDungeonStatBind = 0; // Used for temporary bind +let KinkyDungeonDeaf = false; // Deafness reduces your vision radius to 0 if you are fully blind (blind level 3) +let KinkyDungeonSleepiness = 0; // Sleepiness +let KinkyDungeonSleepinessMax = 10; + +// Other stats +let KinkyDungeonGold = 0; + +let KinkyDungeonHasCrotchRope = false; + +// Combat +let KinkyDungeonTorsoGrabChance = 0.4; +let KinkyDungeonTorsoGrabChanceBonus = 0.2; +let KinkyDungeonWeaponGrabChance = 1.0; + +/** + * Your inventory contains items that are on you + */ +let KinkyDungeonInventory: Map> = new Map(); +function KDInitInventory() { + KinkyDungeonInventory = new Map(); + for (const c of [Consumable, Restraint, LooseRestraint, Weapon, Outfit]) { + KinkyDungeonInventory.set(c, new Map()); + } +} + +let KinkyDungeonPlayerTags = new Map(); +let NPCTags: Map> = new Map(); + +let KinkyDungeonCurrentDress = "Default"; +let KinkyDungeonUndress = 0; // Level of undressedness + +/** Current list of spells */ +let KinkyDungeonSpells: spell[] = []; +// FIXME: This object should be formally specified as some point. +let KinkyDungeonPlayerBuffs: Record = {}; + +// Temp - for multiplayer in future +let KinkyDungeonPlayers = []; + +// For items like the cursed collar which make more enemies appear +let KinkyDungeonDifficulty = 0; + +let KinkyDungeonSubmissiveMult = 0; + +let KinkyDungeonSpellPoints = 3; + +function KinkyDungeonDefaultStats(_Load?: any) { + KinkyDungeonPenanceCosts = {}; + KinkyDungeonLostItems = []; + KinkyDungeonFastMove = true; + KinkyDungeonResetEventVariables(); + KinkyDungeonSetDress("Default", "Default"); + KDGameData.KinkyDungeonSpawnJailers = 0; + KDGameData.KinkyDungeonSpawnJailersMax = 0; + KinkyDungeonGold = 0; + + KDGameData.Balance = 1; + + + KinkyDungeonHasCrotchRope = false; + + KinkyDungeonSubmissiveMult = 0; + + KDGameData.HeartTaken = false; + + KDSetWeapon(null); + KinkyDungeonSpellPoints = 0; + + KinkyDungeonStatDistractionMax = KDMaxStatStart; + KinkyDungeonStatStaminaMax = KDMaxStatStart; + KinkyDungeonStatManaMax = KDMaxStatStart; + KinkyDungeonStatManaPoolMax = KinkyDungeonStatManaPool; + KinkyDungeonStatWillMax = KDMaxStatStart; + KinkyDungeonStaminaRate = KinkyDungeonStatStaminaRegen; + + KinkyDungeonStatBlind = 0; + KDGameData.SlowMoveTurns = 0; + KDGameData.SleepTurns = 0; + KinkyDungeonStatBind = 0; + KinkyDungeonStatFreeze = 0; + + + KinkyDungeonPlayerBuffs = {}; + + KDGameData.MovePoints = 0; + KDInitInventory(); + KinkyDungeonInventoryAdd({name: "Default", type: Outfit, id: KinkyDungeonGetItemID()}); + KinkyDungeonInventoryAddWeapon("Unarmed"); + KDSetWeapon("Unarmed"); + KinkyDungeonPlayerTags = new Map(); + NPCTags = new Map(); + + KinkyDungeonPlayerDamage = KinkyDungeonPlayerDamageDefault; + + // Initialize all the other systems + KinkyDungeonResetMagic(); + KinkyDungeonInitializeDresses(); + KinkyDungeonShrineInit(); + + if (KDClassStart[KinkyDungeonClassMode]) KDClassStart[KinkyDungeonClassMode](); + KDGameData.Class = KinkyDungeonClassMode; + + KinkyDungeonSetMaxStats(); + + KinkyDungeonStatDistraction = 0; + KinkyDungeonStatDistractionLower = 0; + KinkyDungeonStatStamina = KinkyDungeonStatStaminaMax; + KinkyDungeonStatMana = KinkyDungeonStatManaMax; + KinkyDungeonStatManaPool = KinkyDungeonStatManaPoolMax; + KinkyDungeonStatWill = KinkyDungeonStatWillMax; + + KDOrigStamina = KinkyDungeonStatStaminaMax * 10; + KDOrigMana = KinkyDungeonStatManaMax * 10; + KDOrigWill = KinkyDungeonStatWillMax * 10; + KDOrigDistraction = 0; + + if (param_test == 'godmode') { + KinkyDungeonSeeAll = true; + KinkyDungeonSpellPoints = 9001; + } + + + KinkyDungeonDressPlayer(); + CharacterRefresh(KinkyDungeonPlayer); +} + + +function KinkyDungeonGetVisionRadius() { + let data = { + brightness: KDMapData.MapBrightness, + blindlevel: KinkyDungeonBlindLevel, + blindlevelBonus: 0, + noperipheral: KinkyDungeonDeaf || KinkyDungeonStatBlind > 0, + blindMult: (KinkyDungeonStatsChoice.get("Blackout") || KinkyDungeonStatsChoice.get("TotalBlackout")) ? 2 : 1, + visionMult: 1.0, + max: 8, + min: KinkyDungeonStatsChoice.get("TotalBlackout") ? 0.5 : (KinkyDungeonStatsChoice.get("Blackout") ? 1.5 : 2.9), + nightVision: 1.0, + blindRadius: KDGameData.visionBlind || 0, + }; + if (KinkyDungeonStatsChoice.get("NightBlindness") && KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) < KDShadowThreshold) { + data.min = Math.min(data.min, KDGameData.visionAdjust < -0.1 ? 1.5 : 0.5); + } + KinkyDungeonSendEvent("calcVision", data); + if (data.blindRadius > 0) { + data.blindlevelBonus += KDGameData.MaxVisionDist * data.blindRadius; + } + KDGameData.MaxVisionDist = data.max; + KDGameData.MinVisionDist = data.min; + KDGameData.NightVision = data.nightVision; + return (KDGameData.SleepTurns > 2) ? 1 : (Math.max((data.noperipheral) ? 1 : 2, Math.round(data.visionMult*(KDGameData.MaxVisionDist-data.blindlevelBonus-data.blindlevel * data.blindMult)))); +} + + +/** + * @param entity + */ +function KDEntitySenses(entity: entity): {radius: number, mult: number, vision: number, visionmult: number, blindsight: number} { + let data = { + noise: 0, + base: entity.Enemy.Awareness?.hearingRadius ? entity.Enemy.Awareness.hearingRadius : entity.Enemy.visionRadius, + deaflevel: 0, + hearingMult: entity.Enemy.Awareness?.hearingMult ? entity.Enemy.Awareness.hearingMult : 1.0, + vision: entity.Enemy.visionRadius, + visionMult: entity.Enemy.Awareness?.vision ? entity.Enemy.Awareness.vision : 1.0, + blindsight: entity.Enemy.blindSight, + }; + KinkyDungeonSendEvent("calcEntityHearing", data); + return { + radius: Math.round((data.base-data.deaflevel) * data.hearingMult), + mult: data.hearingMult, + vision: data.vision, + visionmult: data.visionMult, + blindsight: data.blindsight, + }; +} + +function KDDeafLevel(): number { + let data = { + deaflevel: 0, + deafMaxWeight: 0.75, + deafTotalWeight: 0.25, + maxDeaf: 0, + totalDeaf: 0, + restraints: KinkyDungeonAllRestraintDynamic().filter((inv) => {return KDRestraint(inv.item)?.deaf;}) + }; + + + for (let inv of data.restraints) { + let deaf = KDRestraint(inv.item).deaf; + data.maxDeaf = Math.max(deaf, data.maxDeaf); + data.totalDeaf += deaf; + } + + KinkyDungeonSendEvent("calcDeaf", data); + + data.deaflevel = data.deafMaxWeight * data.maxDeaf + data.deafTotalWeight * data.totalDeaf; + + return data.deaflevel; +} + +/** + * @param [entity] + */ +function KinkyDungeonGetHearingRadius(entity?: entity): {radius: number, mult: number} { + if (!entity) entity = KDPlayer(); + if (entity.player) { + let data = { + entity: entity, + noise: 0, + base: 8, + deaflevel: KDDeafLevel(), + hearingMult: 1.0, + }; + KinkyDungeonSendEvent("calcHearing", data); + return { + radius: Math.round((data.base * 5 / (5 + data.deaflevel)) * data.hearingMult), + mult: data.hearingMult, + }; + } else { + let data = { + entity: entity, + noise: 0, + base: 8, + deaflevel: 0,//KinkyDungeonDeaf ? 4 : 0, + hearingMult: 1.0, + }; + KinkyDungeonSendEvent("calcEnemyHearing", data); + return { + radius: Math.round((data.base-data.deaflevel) * data.hearingMult), + mult: data.hearingMult, + }; + } +} + +/** + * Returns if the player is automatically doing stuff + */ +function KDIsAutoAction(): boolean { + return KinkyDungeonAutoWait || KinkyDungeonAutoWaitStruggle || KDAutoWaitDelayed + || (KDGameData.SlowMoveTurns && KDGameData.DelayedActions?.length > 0); +} + +/** + * Disables all automatic actions + */ +function KDDisableAutoWait() { + KinkyDungeonAutoWait = false; + KinkyDungeonAutoWaitStruggle = false; + KDAutoWaitDelayed = false; + KDSendInput("autoprune", {force: true}); +} + +function KinkyDungeonInterruptSleep() { + KDGameData.SleepTurns = 0; + KDGameData.PlaySelfTurns = 0; + if (KinkyDungeonTempWait && !KDGameData.KinkyDungeonLeashedPlayer && !KinkyDungeonGetRestraintItem("ItemDevices") && !KinkyDungeonFlags.get("ZeroResistance")) { + KDAutoWaitDelayed = false; + KinkyDungeonAutoWait = false; + } + if (KinkyDungeonInDanger()) KinkyDungeonAutoWaitStruggle = false; +} + +let KDBaseDamageTypes = { + knockbackTypes: ["fire", "electric", "shock", "tickle", "cold", "slash", "grope", "pierce", "soul", "plush", "charm"], + knockbackTypesStrong: ["blast", "stun", "crush", "soap", "poison", "pain", "arcane"], + arouseTypes: ["grope", "plush", "charm", "happygas"], + bypassTeaseTypes: ["charm", "happygas"], + distractionTypesWeakNeg: ["pain", "acid"], + distractionTypesWeak:["soul", "plush"], + distractionTypesStrong:["tickle", "grope", "charm", "souldrain", "happygas", "estim"], + teaseTypes: ["grope", "charm", "plush"], + staminaTypesWeak:["drain", "stun", "fire", "glue", "chain", "tickle", "electric", "shock"], + staminaTypesStrong:["ice", "frost", "poison", "crush", "souldrain"], + manaTypesWeak:["electric", "estim", "drain"], + manaTypesStrong:[], + willTypesVeryWeak:["tickle", "souldrain"], + willTypesWeak:["ice", "frost", "poison", "stun", "electric", "estim", "acid", "soap", "grope", "pierce", "slash", "crush", "unarmed", "glue", "chain"], + willTypesStrong:["cold", "fire", "charm", "soul", "pain", "shock", "plush", "arcane"], +}; + +function KDGetStamDamageThresh() { + let data = { + thresh: KDStamDamageThresh, + bonus: 0, + }; + + if (KDGameData.StatMaxBonus) { + data.bonus += KDStamDamageThreshBonus * KDGameData.StatMaxBonus.AP; + } + + KinkyDungeonSendEvent("calcStamDamageThresh", data); + + data.thresh += data.bonus; + return data.thresh; +} + +/** + * @param bullet + * @param entity + * @param [suppressAdd] + */ +function KDBulletAlreadyHit(bullet: any, entity: entity, suppressAdd?: boolean): boolean { + if (bullet) { + let name = entity.player ? "player" : entity.id; + if (!bullet.alreadyHit) bullet.alreadyHit = []; + // A bullet can only damage an enemy once per turn + if (bullet.alreadyHit.includes(name)) return true; + if (!suppressAdd) + bullet.alreadyHit.push(name); + } + return false; +} + + +interface damageInfoMinor { + damage: number; + type: string; + time?: number, + flags?: string[], + + src?: string, + srctype?: string, + srctrig?: string, + + distract?: number, + + crit?: number, + addBind?: boolean, + bindcrit?: number, + bind?: number, + bindType?: string, +} + + +interface damageInfo extends damageInfoMinor { + name?: string; + flags?: string[]; + time?: number; + bind?: number; + bindEff?: number, + sfx?: string, + crit?: number; + bindcrit?: number; + bindType?: string; + distract?: number; + distractEff?: number, + desireMult?: number, + addBind?: boolean; + realBind?: boolean, + + nodisarm?: boolean, + nocrit?: boolean, + noblock?: boolean, + evadeable?: boolean, + nokill?: boolean, + + ignoreshield?: boolean, + + boundBonus?: number, + novulnerable?: boolean, + tease?: boolean, + + shield_crit?: boolean, // Crit thru shield + shield_stun?: boolean, // stun thru shield + shield_freeze?: boolean, // freeze thru shield + shield_bind?: boolean, // bind thru shield + shield_snare?: boolean, // snare thru shield + shield_slow?: boolean, // slow thru shield + shield_distract?: boolean, // Distract thru shield + shield_vuln?: boolean, // Vuln thru shield +} + +function KinkyDungeonDealDamage(Damage: damageInfoMinor, bullet?: any, noAlreadyHit?: boolean, noInterrupt?: boolean, noMsg?: boolean) { + if (bullet && !noAlreadyHit) { + if (KDBulletAlreadyHit(bullet, KinkyDungeonPlayerEntity)) return {happened: 0, string: ""}; + } + + let data = { + dmgOrig: Damage.damage, + dmg: Damage.damage, + type: Damage.type, + flags: Damage.flags, + time: Damage.time, + armor: KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Armor"), + armorbreak: KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ArmorBreak"), + spellResist: KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellResist"), + buffresist: KDBuffResist(KinkyDungeonPlayerBuffs, Damage.type), + arouseAmount: 0, + arouseMod: 1, + knockbackTypesStrong: Object.assign([], KDBaseDamageTypes.knockbackTypesStrong), + knockbackTypes: Object.assign([], KDBaseDamageTypes.knockbackTypes), + arouseTypes: Object.assign([], KDBaseDamageTypes.arouseTypes), + bypassTeaseTypes: Object.assign([], KDBaseDamageTypes.bypassTeaseTypes), + distractionTypesWeakNeg: Object.assign([], KDBaseDamageTypes.distractionTypesWeakNeg), + teaseTypes: Object.assign([], KDBaseDamageTypes.teaseTypes), + distractionTypesWeak: Object.assign([], KDBaseDamageTypes.distractionTypesWeak), + distractionTypesStrong: Object.assign([], KDBaseDamageTypes.distractionTypesStrong), + staminaTypesWeak: Object.assign([], KDBaseDamageTypes.staminaTypesWeak), + staminaTypesStrong: Object.assign([], KDBaseDamageTypes.staminaTypesStrong), + manaTypesWeak: Object.assign([], KDBaseDamageTypes.manaTypesWeak), + manaTypesStrong: Object.assign([], KDBaseDamageTypes.manaTypesStrong), + willTypesVeryWeak: Object.assign([], KDBaseDamageTypes.willTypesVeryWeak), + willTypesWeak: Object.assign([], KDBaseDamageTypes.willTypesWeak), + willTypesStrong: Object.assign([], KDBaseDamageTypes.willTypesStrong), + stats: [], + newstats: [], + damaged: false, + dmgShield: 0, + }; + + if (KinkyDungeonStatsChoice.get("Estim")) { + data.distractionTypesStrong.push("electric"); + data.arouseTypes.push("electric"); + if (data.staminaTypesWeak.includes("electric")) + data.staminaTypesWeak = data.staminaTypesWeak.splice(data.staminaTypesWeak.indexOf("pain"), 1); + if (data.type == "electric" || data.type == "estim") { + KinkyDungeonSetFlag("tickle", 3); + } + } + let types = ["pain", "electric", "slash", "pierce", "crush", "fire", "ice", "frost", "acid", "arcane", "stun", "blast"]; + + if (data.type == "chain" || data.type == "glue") { + KinkyDungeonSetFlag("restrained", 1); + if (data.type == "glue") + KinkyDungeonSetFlag("slimed", 5); + else KinkyDungeonSetFlag("restrained_recently", 4); + } + + if (types.includes(data.type)) { + if (data.type == "pain") { + KinkyDungeonSetFlag("spank", 2); + } + KinkyDungeonSetFlag("pain", 4); + } + if (KinkyDungeonStatsChoice.get("Masochist")) { + + data.distractionTypesStrong.push(...types); + data.arouseMod = Math.max(data.arouseMod, 2.0); + data.arouseTypes.push(...types); + if (data.distractionTypesWeakNeg.includes("pain")) + data.distractionTypesWeakNeg = data.distractionTypesWeakNeg.splice(data.distractionTypesWeakNeg.indexOf("pain"), 1); + if (data.distractionTypesWeakNeg.includes("acid")) + data.distractionTypesWeakNeg = data.distractionTypesWeakNeg.splice(data.distractionTypesWeakNeg.indexOf("acid"), 1); + + } + if (data.type == "tickle") { + KinkyDungeonSetFlag("tickle", 3); + } + if (data.arouseTypes.includes(data.type) && !data.arouseAmount) { + data.arouseAmount = 0.2; + if (data.type == "charm") { + KinkyDungeonSetFlag("headpat", 2); + } else if (data.type == "psychic") { + KinkyDungeonSetFlag("psychic", 2); + } else if (data.type == "plush") { + KinkyDungeonSetFlag("soft", 2); + } else { + KinkyDungeonSetFlag("grope", 3); + } + } else if (data.type == "pierce") { + KinkyDungeonSetFlag("insert", 3); + } + + + if (data.arouseAmount < 0) data.arouseAmount = 0; + + KinkyDungeonSendEvent("beforePlayerDamage", data); + + data.dmg *= data.buffresist; + + + if (data.armorbreak > 0) data.armor -= Math.min(Math.max(0, data.armor), data.armorbreak); + + if (data.armor && KinkyDungeonMeleeDamageTypes.includes(data.type)) data.dmg = Math.max(0, data.dmg * KDArmorFormula(data.dmg, data.armor)); + else if (data.spellResist && !KinkyDungeonMeleeDamageTypes.includes(data.type)) data.dmg = Math.max(0, data.dmg * KDArmorFormula(data.dmg, data.spellResist)); + + if (data.dmg > 0) { + let buffreduction = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "DamageReduction"); + if (buffreduction && data.dmg > 0) { + data.dmg = Math.max(data.dmg - buffreduction, 0); + KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, "damageTaken", 1); + KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Shield.ogg"); + } + } + + + let str = ""; + + if (data.dmg > 0) + data.stats = [ + KinkyDungeonStatDistraction, + KinkyDungeonStatDistractionLower, + KinkyDungeonStatMana, + KinkyDungeonStatWill, + KinkyDungeonStatStamina, + ]; + + if (KinkyDungeonStatsChoice.get("EnemyDamage")) { + data.dmg *= KDPerkParams.KDEnemyDamageMult; + } + + + KinkyDungeonSendEvent("duringPlayerDamage", data); + + if (data.dmg > 0 && KDGameData.KneelTurns <= 0 && ( + data.knockbackTypesStrong.includes(data.type) + || data.knockbackTypes.includes(data.type) + )) { + if ((KDGameData.HeelPower > 0 || data.type == "plush") && data.knockbackTypes.includes(data.type)) { + let amt = data.dmg; + KDChangeBalanceSrc(data.type, "knockback", "dmg", (KDBaseBalanceDmgLevel + KDGameData.HeelPower) / KDBaseBalanceDmgLevel * 0.5*-KDBalanceDmgMult() * amt*KDFitnessMult(), true); + } else if (data.knockbackTypesStrong.includes(data.type)) { + let amt = data.dmg; + KDChangeBalanceSrc(data.type, "knockback", "dmg", (KDBaseBalanceDmgLevel + KDGameData.HeelPower) / KDBaseBalanceDmgLevel * -KDBalanceDmgMult() * amt*KDFitnessMult(), true); + } + } + + if (!KinkyDungeonIgnoreShieldTypes.includes(data.type) && KDGameData.Shield && data.dmg > 0) { + let amt = data.dmg; + + data.dmg -= KDGameData.Shield; + if (!noMsg) { + KinkyDungeonSendTextMessage(6, TextGet("KDShieldAbsorb").replace("AMNT", "" + Math.round(10 * (amt - Math.max(0, data.dmg)))), "#92e8c0", 1); + KDDamageQueue.push({floater: Math.round((amt - Math.max(0, data.dmg))*10) + ` ${TextGet("KinkyDungeonDamageType" + KinkyDungeonDamageTypes[data.type].name)} ${TextGet("KDdmg")}`, + Entity: KinkyDungeonPlayerEntity, Color: "#92e8c0", Delay: 0, size: 12 + Math.floor(Math.min(24, Math.round((amt - Math.max(0, data.dmg))*3)))}); + } + + let shieldDmg = Math.max(0, Math.min(KDGameData.Shield, amt - Math.max(0, data.dmg))); + KDDamagePlayerShield(shieldDmg, KDPlayer()); + if (data.dmg < 0) data.dmg = 0; + data.dmgShield += shieldDmg; + } + + + + + + + if (data.dmg > 0) { + + if (data.teaseTypes.includes(data.type) || ( + KinkyDungeonStatsChoice.get("Masochist") && data.distractionTypesStrong.includes(data.type) + )) { + let amt = data.dmg; + if (data.bypassTeaseTypes.includes(data.type) || KinkyDungeonStatsChoice.get("Masochist")) { + KinkyDungeonTeaseLevelBypass += amt * (1 + (0.01 * (KinkyDungeonGoddessRep.Passion + 50) || 0)); + } else { + KinkyDungeonTeaseLevel += amt * (1 + (0.01 * (KinkyDungeonGoddessRep.Passion + 50) || 0)); + } + } + + if (data.distractionTypesWeak.includes(data.type)) { + let amt = data.dmg/2 * data.arouseMod; + if (str) str = str + ", "; + str = str + `${Math.round(amt*10)}dp`; + KDChangeDistraction(data.type, data.arouseAmount > 0 ? "tease" : "dmg", "playerDmg", amt, true, data.arouseAmount); + } + if (data.distractionTypesWeakNeg.includes(data.type)) { + let amt = -data.dmg/2 * data.arouseMod; + if (str) str = str + ", "; + str = str + `${Math.round(amt*10)}dp`; + KDChangeDistraction(data.type, data.arouseAmount > 0 ? "tease" : "dmg", "playerDmg", amt, true); + } + if (data.distractionTypesStrong.includes(data.type)) { + let amt = data.dmg * data.arouseMod; + if (str) str = str + ", "; + str = str + `${Math.round(amt*10)}dp`; + KDChangeDistraction(data.type, data.arouseAmount > 0 ? "tease" : "dmg", "playerDmg", amt, true, data.arouseAmount); + } + if (data.staminaTypesStrong.includes(data.type)) { + let amt = -data.dmg; + if (str) str = str + ", "; + str = str + `${Math.round(amt*10)}sp`; + KDChangeStamina(data.type, data.arouseAmount > 0 ? "tease" : "dmg", "playerDmg", amt, false, 0, false, KDGetStamDamageThresh()); + } else if (data.staminaTypesWeak.includes(data.type)) { + let amt = -data.dmg/2; + if (str) str = str + ", "; + str = str + `${Math.round(amt*10)}sp`; + KDChangeStamina(data.type, data.arouseAmount > 0 ? "tease" : "dmg", "playerDmg", amt, false, 0, false, KDGetStamDamageThresh()); + } + if (data.manaTypesStrong.includes(data.type)) { + let amt = -data.dmg; + if (str) str = str + ", "; + str = str + `${Math.round(amt*10)}mp`; + KDChangeMana(data.type, data.arouseAmount > 0 ? "tease" : "dmg", "playerDmg", amt); + } else if (data.manaTypesWeak.includes(data.type)) { + let amt = -data.dmg/2; + if (str) str = str + ", "; + str = str + `${Math.round(amt*10)}mp`; + KDChangeMana(data.type, data.arouseAmount > 0 ? "tease" : "dmg", "playerDmg", amt); + } + if (data.willTypesStrong.includes(data.type)) { + let amt = -data.dmg; + if (str) str = str + ", "; + str = str + `${Math.round(amt*10)}wp`; + KDChangeWill(data.type, data.arouseAmount > 0 ? "tease" : "dmg", "playerDmg", amt, true); + } else if (data.willTypesWeak.includes(data.type)) { + let amt = -data.dmg/2; + if (str) str = str + ", "; + str = str + `${Math.round(amt*10)}wp`; + KDChangeWill(data.type, data.arouseAmount > 0 ? "tease" : "dmg", "playerDmg", amt, true); + } else if (data.willTypesVeryWeak.includes(data.type)) { + let amt = -data.dmg/4; + if (str) str = str + ", "; + str = str + `${Math.round(amt*10)}wp`; + KDChangeWill(data.type, data.arouseAmount > 0 ? "tease" : "dmg", "playerDmg", amt, true); + } + if (!noInterrupt) + KinkyDungeonInterruptSleep(); + + if (data.dmg > 0 && KinkyDungeonStatsChoice.get("Breathless")) { + let sleepAmount = data.dmg > 3 ? 6 : (data.dmg > 1 ? 4 : 2); + if (["chain", "poison", "crush"].includes(data.type)) + KinkyDungeonSleepiness = Math.max(KinkyDungeonSleepiness, KinkyDungeonSleepiness + sleepAmount); + } + + if (KinkyDungeonStatFreeze > 0 && KinkyDungeonMeleeDamageTypes.includes(data.type)) { + KDChangeWill(data.type, "freeze", "playerDmg", -data.dmg, true); + KinkyDungeonStatFreeze = 0; + } + KDOrigWill = Math.floor(KinkyDungeonStatWill * 10); + + + data.newstats = [ + KinkyDungeonStatDistraction, + KinkyDungeonStatDistractionLower, + KinkyDungeonStatMana, + KinkyDungeonStatWill, + KinkyDungeonStatStamina, + ]; + + let changed = false; + for (let i = 0; i < data.stats.length; i++) { + if (data.stats[i] != data.newstats[i]) { + changed = true; + break; + } + } + if (changed && KinkyDungeonDamageTypes[data.type]) { + data.damaged = true; + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(data.dmg * 10), KinkyDungeonDamageTypes[data.type].color, 5, undefined, + ` ${TextGet("KinkyDungeonDamageType" + KinkyDungeonDamageTypes[data.type].name)} ${TextGet("KDdmg")}`, + 16 + Math.floor(Math.min(32, data.dmg*3)), TextGet("KDTook")); + } + } + + KinkyDungeonSendEvent("afterPlayerDamage", data); + + return {happened: data.dmg, string: str}; +} + +function KinkyDungeonUpdateDialogue(entity: entity, delta: number) { + if (KDGameData.SlowMoveTurns < 1 && !KinkyDungeonStatFreeze && !KDGameData.PlaySelfTurns) + if (entity.dialogue) { + if (entity.dialogueDuration > delta) { + entity.dialogueDuration = Math.max(0, entity.dialogueDuration - delta); + } else { + entity.dialogue = null; + } + } +} + +/** + * @param entity + * @param dialogue + * @param color + * @param duration + * @param priority + * @param [force] + * @param [nooverride] + */ +function KinkyDungeonSendDialogue(entity: entity, dialogue: string, color: string, duration: number, priority: number, force?: boolean, nooverride?: boolean): void { + if (!force && !KDEnemyCanTalk(entity) && !entity.player) { + if (!entity.Enemy.nonHumanoid && entity.Enemy.bound) { + let suff = ""; + if (KDIsBrattyPersonality(entity)) suff = "Brat"; + else if (KDIsSubbyPersonality(entity)) suff = "Sub"; + entity.dialogue = TextGet("KinkyDungeonRemindJailPlay" + suff + "Gagged" + Math.floor(KDRandom() * 3)); + entity.dialogueColor = color; + entity.dialogueDuration = 4; + entity.dialoguePriority = 1; + if (dialogue && KDCanHearEnemy(KDPlayer(), entity) || KDCanSeeEnemy(entity)) { + KinkyDungeonSendTextMessage(0, `${TextGet("Name" + entity.Enemy.name)}: ${entity.dialogue}`, color, 0, false, false, entity, "Dialogue"); + } + KDEnemyAddSound(entity, 7); + if (KDRandom() < 0.5) + KDSendGagParticles(entity); + } + return; + } + if (!entity.dialogue || !entity.dialoguePriority || entity.dialoguePriority <= priority + (nooverride ? 1 : 0)) { + entity.dialogue = dialogue; + entity.dialogueColor = color; + entity.dialogueDuration = duration; + entity.dialoguePriority = priority; + if (!entity.player) { + KDEnemyAddSound(entity, 12); + if (dialogue && KDCanHearEnemy(KDPlayer(), entity) || KDCanSeeEnemy(entity)) { + KinkyDungeonSendTextMessage(0, `${TextGet("Name" + entity.Enemy.name)}: ${entity.dialogue}`, color, 0, false, false, entity, "Dialogue"); + } + KDAllowDialogue = false; + } + } +} + +let KDOrigStamina = KDMaxStatStart*10; +let KDOrigMana = KDMaxStatStart*10; +let KDOrigWill = KDMaxStatStart*10; +let KDOrigCharge = 1000; +let KDOrigBalance = 100; +let KDOrigDistraction = 0; +let KDOrigDesire = 0; + +function KDChangeDistraction(src: string, type: string, trig: string, Amount: number, NoFloater?: boolean, lowerPerc?: number, minimum: number = 0, noEvent?: boolean): number { + + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + let data = { + src: src, + type: type, + trig: type, + Amount: Amount, + NoFloater: NoFloater, + lowerPerc: lowerPerc, + minimum: minimum, + amountChanged: 0, + mult: Math.max(0, + Amount > 0 ? (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatGainDistraction")) + : (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatLossDistraction")) + ), + }; + if (!noEvent) + KinkyDungeonSendEvent("changeDistraction", data); + Amount = data.Amount * data.mult; + lowerPerc = data.lowerPerc; + minimum = data.minimum; + NoFloater = data.NoFloater; + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + let minLevel = Math.min(KinkyDungeonStatDistractionMax * minimum, KinkyDungeonStatDistraction); // Cannot go below this or current + if (Amount > 0) { + KDNoRegenFlag = true; + } + + if (!noEvent) + KinkyDungeonSendEvent("duringChangeDistraction", data); + let amountChanged = KinkyDungeonStatDistraction; + KinkyDungeonStatDistraction += Amount; + KinkyDungeonStatDistraction = Math.min(Math.max(minLevel, KinkyDungeonStatDistraction), KinkyDungeonStatDistractionMax); + + amountChanged = KinkyDungeonStatDistraction - amountChanged; + if (!KDGameData.DistractionCooldown) { + KDGameData.DistractionCooldown = 0; + } + if (Amount > 0) { + let cdBonus = KinkyDungeonStatDistraction >= KinkyDungeonStatDistractionMax ? Math.min(4, Math.max(1, Math.ceil(Amount/1.5))) : 0; + KDGameData.DistractionCooldown = Math.max(KDGameData.DistractionCooldown, 3 + cdBonus, KDGameData.SlowMoveTurns + 1 + cdBonus); + + if (KDToggles.ArousalHearts) + for (let i = 0; i < Amount * 10 && i < 100; i++) { + KDCreateArousalParticle(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax, 0); + } + } + + if (lowerPerc) { + if (Amount * lowerPerc > 0) { + KDDistractionFlashLastTime = CommonTime(); + KDDistractionFlashStrength = Math.max(Amount * lowerPerc * 0.15, KDDistractionFlashStrength); + } + + + KDChangeDesire(src, type, trig, Amount * lowerPerc, NoFloater); + //KinkyDungeonStatDistractionLower += Amount * lowerPerc; + //KinkyDungeonStatDistractionLower = Math.min(Math.max(0, KinkyDungeonStatDistractionLower), KinkyDungeonStatDistractionMax * KinkyDungeonStatDistractionLowerCap); + } + if (!NoFloater && Math.abs(KDOrigDistraction - Math.floor(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * 100)) >= 0.99) { + //KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * 100) - KDOrigDistraction, "#ff00ff", undefined, undefined, "% distraction"); + let amount = Math.min(1, Math.max(0, (Math.floor(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * 100) - KDOrigDistraction) / 100)); + amount *= amount; + amount = Math.max(amount, amount * 0.5 + 0.5 * KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax); + amount = Math.round(10 * amount); + + KinkyDungeonSendDialogue(KinkyDungeonPlayerEntity, TextGet("KinkyDungeonChangeDistraction" + (KinkyDungeonCanTalk() ? "" : "Gag") + amount), "#ff00ff", 2, 1); + KDOrigDistraction = Math.max(0, Math.floor(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * 100)); + } + + + if (isNaN(KinkyDungeonStatDistraction)) { + console.trace(); + KinkyDungeonStatDistraction = 0; + } + + data.amountChanged = amountChanged; + if (!noEvent) + KinkyDungeonSendEvent("afterChangeDistraction", data); + + return amountChanged; +} + + + +function KDChangeDesire(src: string, type: string, trig: string, Amount: number, NoFloater: boolean): number { + + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + let data = { + src: src, + type: type, + trig: type, + Amount: Amount, + NoFloater: NoFloater, + mult: Math.max(0, + Amount > 0 ? (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatGainDesire")) + : (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatLossDesire")) + ), + }; + KinkyDungeonSendEvent("changeDesire", data); + Amount = data.Amount * data.mult; + NoFloater = data.NoFloater; + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + let amountChanged = KinkyDungeonStatDistractionLower; + KinkyDungeonStatDistractionLower += Amount; + KinkyDungeonStatDistractionLower = Math.min(Math.max(0, KinkyDungeonStatDistractionLower), KinkyDungeonStatDistractionMax); + amountChanged = KinkyDungeonStatDistractionLower - amountChanged; + if (!KDGameData.DistractionCooldown) { + KDGameData.DistractionCooldown = 0; + } + if (Amount > 0) { + if (KDToggles.ArousalHearts) + for (let i = 0; i < Amount * 10 && i < 100; i++) { + KDCreateArousalParticle(KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax, 0); + } + } + + if (!NoFloater && Math.abs(KDOrigDesire - Math.floor(KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax * 100)) >= 0.99) { + //KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax * 100) - KDOrigDistraction, "#ff00ff", undefined, undefined, "% distraction"); + let amount = Math.min(1, Math.max(0, (Math.floor(KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax * 100) - KDOrigDesire) / 100)); + amount *= amount; + amount = Math.max(amount, amount * 0.5 + 0.5 * KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax * KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax); + amount = Math.round(10 * amount); + + KinkyDungeonSendDialogue(KinkyDungeonPlayerEntity, TextGet("KinkyDungeonChangeDistraction" + (KinkyDungeonCanTalk() ? "" : "Gag") + amount), "#ff00ff", 2, 1); + + KDOrigDesire = Math.max(0, Math.floor(KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax * 100)); + } + + + if (isNaN(KinkyDungeonStatDistractionLower)) { + console.trace(); + KinkyDungeonStatDistractionLower = 0; + } + + return amountChanged; +} + +function KDChangeStamina(src: string, type: string, trig: string, Amount: number, NoFloater?: boolean, Pause?: number, NoSlow?: boolean, minimum: number = 0, slowFloor: number = 5, Regen: boolean = false) { + + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + + let data = { + src: src, + type: type, + trig: type, + NoFloater: NoFloater, + Amount: Amount, + NoSlow: NoSlow, + minimum: minimum, + Pause: Pause, + slowFloor: slowFloor, + regen: Regen, + Cap: KinkyDungeonStatStaminaMax, + mult: Math.max(0, + Amount > 0 ? Math.max(0, 1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatGainStamina")) + : Math.max(0, 1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatLossStamina")) + ), + }; + KinkyDungeonSendEvent("changeStamina", data); + NoFloater = data.NoFloater; + Amount = data.Amount*data.mult; + + + NoSlow = data.NoSlow; + minimum = data.minimum; + slowFloor = data.slowFloor; + Pause = data.Pause; + + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + let minLevel = Math.min(KinkyDungeonStatStaminaMax * minimum, KinkyDungeonStatStamina); // Cannot go below this or current + let stamPre = KinkyDungeonStatStamina; + KinkyDungeonStatStamina += Amount; + KinkyDungeonStatStamina = Math.min( + Math.max(minLevel, KinkyDungeonStatStamina), + Amount > 0 ? Math.max(stamPre, data.Cap) : KinkyDungeonStatStamina); + if (!NoFloater && Math.abs(KDOrigStamina - Math.floor(KinkyDungeonStatStamina * 10)) >= 0.99) { + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KinkyDungeonStatStamina * 10) - KDOrigStamina, + "#44ff66", undefined, undefined, " sp", undefined, Amount > 0 ? "+" : undefined); + KDOrigStamina = Math.floor(KinkyDungeonStatStamina * 10); + } + if (Pause) { + if (!(KDGameData.StaminaPause > Pause)) + KDGameData.StaminaPause = Pause; + if (!(KDGameData.StaminaSlow > 5) && !NoSlow) + KDGameData.StaminaSlow = Math.min(5, (KDGameData.StaminaSlow || 0) + 1.5); + } + + if (isNaN(KinkyDungeonStatStamina)) { + console.trace(); + KinkyDungeonStatStamina = 0; + } +} +/** + * @param Amount + * @param [NoFloater] + * @param [PoolAmount] + * @param [Pause] + * @param [spill] + */ +function KDChangeMana(src: string, type: string, trig: string, Amount: number, NoFloater?: boolean, PoolAmount?: number, Pause?: boolean, spill?: boolean, minimum: number = 0) { + + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + + let data = { + src: src, + type: type, + trig: type, + NoFloater: NoFloater, + Amount: Amount, + PoolAmount: PoolAmount, + minimum: minimum, + Pause: Pause, + spill: spill, + mult: Math.max(0, + Amount > 0 ? (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatGainMana")) + : (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatLossMana")) + ), + }; + KinkyDungeonSendEvent("changeMana", data); + NoFloater = data.NoFloater; + Amount = data.Amount * data.mult; + PoolAmount = data.PoolAmount; + minimum = data.minimum; + Pause = data.Pause; + spill = data.spill; + + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + + let minLevel = Math.min(KinkyDungeonStatManaMax * minimum, KinkyDungeonStatMana); // Cannot go below this or current + let manaAmt = KinkyDungeonStatMana; + KinkyDungeonStatMana += Amount; + KinkyDungeonStatMana = Math.min(Math.max(minLevel, KinkyDungeonStatMana), KinkyDungeonStatManaMax); + manaAmt = KinkyDungeonStatMana - manaAmt; + if (!PoolAmount) PoolAmount = 0; + if (spill && manaAmt != Amount) PoolAmount += (Amount - manaAmt) * KDManaPoolRatio; + if (PoolAmount) { + KinkyDungeonStatManaPool += PoolAmount; + KinkyDungeonStatManaPool = Math.min(Math.max(0, KinkyDungeonStatManaPool), KinkyDungeonStatManaPoolMax); + } + if (!NoFloater && Math.abs(KDOrigMana - Math.floor(KinkyDungeonStatMana * 10)) >= 0.99) { + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KinkyDungeonStatMana * 10) - KDOrigMana, + "#4499ff", undefined, undefined, " mp", undefined, Amount > 0 ? "+" : undefined); + KDOrigMana = Math.floor(KinkyDungeonStatMana * 10); + } + if (Pause) { + if (!(KDGameData.ManaSlow > 10)) + KDGameData.ManaSlow = 10; + } + + if (isNaN(KinkyDungeonStatMana)) { + console.trace(); + KinkyDungeonStatMana = 0; + } +} +function KDChangeWill(src: string, type: string, trig: string, Amount: number, NoFloater?: boolean, minimum: number = 0): number { + + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + + let data = { + src: src, + type: type, + trig: type, + NoFloater: NoFloater, + Amount: Amount, + minimum: minimum, + mult: Math.max(0, + Amount > 0 ? (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatGainWill")) + : (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatLossWill")) + ), + amountChanged: 0, + }; + let amountChanged = KinkyDungeonStatWill; + KinkyDungeonSendEvent("changeWill", data); + NoFloater = data.NoFloater; + Amount = data.Amount * data.mult; + minimum = data.minimum; + + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + let minLevel = Math.min(KinkyDungeonStatWillMax * minimum, KinkyDungeonStatWill); // Cannot go below this or current + KinkyDungeonStatWill += Amount; + KinkyDungeonStatWill = Math.min(Math.max(minLevel, KinkyDungeonStatWill), KinkyDungeonStatWillMax); + if (!NoFloater && Math.abs(KDOrigWill - Math.floor(KinkyDungeonStatWill * 10)) >= 0.99) { + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KinkyDungeonStatWill * 10) - KDOrigWill, + "#ff4444", Amount > 0 ? 5 : undefined, undefined, " wp", undefined, Amount > 0 ? "+" : undefined); + KDOrigWill = Math.floor(KinkyDungeonStatWill * 10); + } + + if (isNaN(KinkyDungeonStatWill)) { + console.trace(); + KinkyDungeonStatWill = 0; + } + + amountChanged = KinkyDungeonStatWill - amountChanged; + + data.amountChanged = amountChanged; + KinkyDungeonSendEvent("afterChangeWill", data); + return amountChanged; +} + + +function KDChangeBalanceSrc(src: string, type: string, trig: string, Amount: number, NoFloater: boolean) { + if (KinkyDungeonStatsChoice.get("ClassicHeels")) return 0; + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + + let data = { + src: src, + type: type, + trig: type, + NoFloater: NoFloater, + Amount: Amount, + mult: Math.max(0, + Amount > 0 ? (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatGainBalance")) + : (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatLossBalance")) + ), + amountChanged: 0, + }; + KinkyDungeonSendEvent("changeBalance", data); + NoFloater = data.NoFloater; + Amount = data.Amount * data.mult; + + if (!KDGameData.Balance) KDGameData.Balance = 0; + let orig = KDGameData.Balance; + KDGameData.Balance = Math.min(1, Math.max(0, KDGameData.Balance + Amount)); + if (Amount < 0) KDGameData.BalancePause = true; + + data.amountChanged = KDGameData.Balance - orig; + KinkyDungeonSendEvent("afterChangeBalance", data); + if (!NoFloater && Math.abs(KDOrigBalance - Math.floor(KDGameData.Balance * 100)) >= 0.99) { + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KDGameData.Balance * 100) - KDOrigBalance, + "#ffff44", undefined, undefined, " balance", undefined, Amount > 0 ? "+" : undefined); + KDOrigBalance = Math.floor(KDGameData.Balance * 100); + } + + + if (isNaN(KDGameData.Balance)) { + console.trace(); + KDGameData.Balance = 0; + } +} + +function KDChangeCharge(src: string, type: string, trig: string, Amount: number, NoFloater?: boolean) { + if (isNaN(Amount)) { + console.trace(); + Amount = 0; + } + + let data = { + src: src, + type: type, + trig: type, + NoFloater: NoFloater, + Amount: Amount, + mult: Math.max(0, + Amount > 0 ? (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatGainCharge")) + : (1 + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StatLossCharge")) + ), + amountChanged: undefined, + }; + KinkyDungeonSendEvent("changeCharge", data); + NoFloater = data.NoFloater; + Amount = data.Amount * data.mult; + + if (!KDGameData.AncientEnergyLevel) KDGameData.AncientEnergyLevel = 0; + let orig = KDGameData.AncientEnergyLevel; + KDGameData.AncientEnergyLevel = Math.min(1, Math.max(0, KDGameData.AncientEnergyLevel + Amount)); + + data.amountChanged = KDGameData.AncientEnergyLevel - orig; + KinkyDungeonSendEvent("afterChangeCharge", data); + if (!NoFloater && Math.abs(KDOrigCharge - Math.floor(KDGameData.AncientEnergyLevel * 1000)) >= 0.99) { + KinkyDungeonSendFloater(KinkyDungeonPlayerEntity, Math.floor(KDGameData.AncientEnergyLevel * 1000) - KDOrigCharge, + "#ffff44", undefined, undefined, " charge", undefined, Amount > 0 ? "+" : undefined); + KDOrigCharge = Math.floor(KDGameData.AncientEnergyLevel * 1000); + } + + + if (isNaN(KDGameData.AncientEnergyLevel)) { + console.trace(); + KDGameData.AncientEnergyLevel = 0; + } +} + +function KinkyDungeonHasStamina(Cost: number, AddRate?: boolean): boolean { + let s = KinkyDungeonStatStamina; + if (AddRate) s += KinkyDungeonStaminaRate; + + return s >= Cost; +} +function KinkyDungeonHasWill(Cost: number, AddRate?: boolean): boolean { + let s = KinkyDungeonStatWill; + if (AddRate) s += KinkyDungeonStatWillRate; + + return s >= Cost; +} +/** + * @param Cost + * @param [AddRate] + */ +function KinkyDungeonHasMana(Cost: number, AddRate?: boolean): boolean { + let s = KinkyDungeonStatMana; + if (AddRate) s += KinkyDungeonStatManaRate; + + return s >= Cost; +} + +function KinkyDungeonSetMaxStats(delta?: any) { + // Upgradeable stats + KinkyDungeonStatStaminaMax = KDMaxStatStart; + KinkyDungeonStatDistractionMax = KDMaxStatStart; + KinkyDungeonStatManaMax = KDMaxStatStart; + KinkyDungeonStatManaPoolMax = KDMaxStatStartPool; + KinkyDungeonStatWillMax = KDMaxStatStart; + //KinkyDungeonSpellChoiceCount = 30; + KinkyDungeonSummonCount = 2; + let data = { + distractionRate: 0, + staminaRate: KinkyDungeonStatStaminaRegen, + delta: delta, + }; + + let initStats = !KDGameData.StatMaxBonus; + if (initStats) { + KDGameData.StatMaxBonus = { + AP: 0, + MP: 0, + SP: 0, + WP: 0, + }; + } + for (let s of KinkyDungeonSpells) { + if (initStats) { + if (s.name == "SPUp1") { + KDGameData.StatMaxBonus.SP += 5; + } + if (s.name == "APUp1") { + KDGameData.StatMaxBonus.AP += 5; + } + if (s.name == "WPUp1") { + KDGameData.StatMaxBonus.WP += 5; + } + if (s.name == "MPUp1") { + KDGameData.StatMaxBonus.MP += 5; + } + + } + + + + //if (s.name == "SpellChoiceUp1" || s.name == "SpellChoiceUp2" || s.name == "SpellChoiceUp3") KinkyDungeonSpellChoiceCount += 1; + if (s.name == "SummonUp1" || s.name == "SummonUp2") KinkyDungeonSummonCount += 2; + } + + + KinkyDungeonStatStaminaMax += KDGameData.StatMaxBonus.SP; + data.staminaRate += KinkyDungeonStatStaminaRegenPerUpgrade * KDGameData.StatMaxBonus.SP; + + KinkyDungeonStatDistractionMax += KDGameData.StatMaxBonus.AP; + if (KinkyDungeonVibeLevel == 0 && !(KDGameData.DistractionCooldown > 0)) + data.distractionRate += KDGameData.StatMaxBonus.AP * KinkyDungeonStatDistractionRegenPerUpgrade; + + KinkyDungeonStatWillMax += KDGameData.StatMaxBonus.WP; + data.staminaRate += KDGameData.StatMaxBonus.WP * KinkyDungeonStatStaminaRegenPerUpgradeWill; + + KinkyDungeonStatManaMax += KDGameData.StatMaxBonus.MP; + + KinkyDungeonSendEvent("calcMaxStats", data); + + return {distractionRate: data.distractionRate, staminaRate: data.staminaRate}; +} + +/** + * @param [NoOverride] + * @param [e] + * @param [weapon] + */ +function KinkyDungeonCanUseWeapon(NoOverride?: boolean, e?: boolean, weapon?: weapon): boolean { + let flags = { + HandsFree: false, + clumsy: weapon?.clumsy, + weapon: weapon, + }; + if (!NoOverride) + KinkyDungeonSendEvent("getWeapon", {event: e, flags: flags}); + return flags.HandsFree + || weapon?.noHands + || (!KinkyDungeonIsHandsBound(false, true) + && ((!KinkyDungeonStatsChoice.get("WeakGrip") && !flags.clumsy) || !KinkyDungeonIsArmsBound(false, true))); +} + +let KDBlindnessCap = 0; +let KDBoundPowerLevel = 0; +let KDNoRegenFlag = false; + +function KDGetDistractionRate(delta: number): number { + let mult = KDNoRegenFlag ? 0 : 1; + KDNoRegenFlag = false; + let VibeDistractionRate = 0; + let VibeTargetLevel = 0; + // Vibrators are less effective the more aroused you are + if (KinkyDungeonVibeLevel > 0) { + VibeTargetLevel = 0.3 + 0.2 * KinkyDungeonVibeLevel + 0.5 * 0.01 * (KinkyDungeonGoddessRep.Passion + 50); + VibeTargetLevel = KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax + (1 - KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionMax) * VibeTargetLevel; + VibeDistractionRate = Math.max(0, (VibeTargetLevel - KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax) * KinkyDungeonDistractionPerVibe * KinkyDungeonVibeLevel); + mult = Math.min(Math.max(0, (-VibeTargetLevel + KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax)), 1); + } + + let distractionRate = (VibeDistractionRate == 0 && !(KDGameData.DistractionCooldown > 0)) ? (!KinkyDungeonStatsChoice.get("arousalMode") ? + KinkyDungeonStatDistractionRegen * KDDistractionDecayMultDistractionMode * mult : (KDGameData.PlaySelfTurns < 1 ? mult * KinkyDungeonStatDistractionRegen*( + (KinkyDungeonChastityMult() > 0.9 ? KDNoUnchasteMult : (KinkyDungeonChastityMult() > 0 ? KDNoUnchasteBraMult : 1.0))) : 0)) : + VibeDistractionRate; + + let distractionBonus = KinkyDungeonSetMaxStats(delta).distractionRate; + if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionLower) { + distractionRate = Math.max(0, distractionRate); + } else if (KDGameData.PlaySelfTurns < 1) distractionRate += distractionBonus; + + if (distractionRate < 0 && KinkyDungeonStatDistraction >= KinkyDungeonStatDistractionLower && KinkyDungeonStatDistraction + distractionRate < KinkyDungeonStatDistractionLower) { + distractionRate = Math.max(distractionRate, (KinkyDungeonStatDistractionLower - KinkyDungeonStatDistraction) * ( + KinkyDungeonStatDistractionLower > 0 ? 0.25 : 1 + )); + } + + if (KDGameData.OrgasmStamina > 0 && delta > 0) { + let amount = (KDGameData.OrgasmStamina || 0)/24; + KDGameData.OrgasmStamina = Math.max(0, KDGameData.OrgasmStamina*0.98 - delta/70); + distractionRate += -amount; + } + + if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionLower) { + distractionRate += + Math.min( + Math.max(0, 0.1*(KinkyDungeonStatDistractionLower - KinkyDungeonStatDistraction)), + KDGetDistractionDesireRate()); + } + if (!KDGameData.DistractionCooldown) KDGameData.DistractionCooldown = 0; + if (KDGameData.DistractionCooldown > 0) KDGameData.DistractionCooldown = Math.max(0, KDGameData.DistractionCooldown - delta); + + + + return distractionRate; +} + +function KDGetDistractionDesireRate() { + let data = { + amount: KDDistractionLowerPercMult * KinkyDungeonStatDistractionMax, + mult: 1, + bonus: 0, + }; + + KinkyDungeonSendEvent("desireRate", data); + return data.amount * data.mult + data.bonus; +} + + +/** + * @param delta + */ +function KinkyDungeonUpdateStats(delta: number): void { + KDBoundPowerLevel = 0; + KDBoundPowerLevel += 0.1 * Math.max(0, Math.min(1, KinkyDungeonBlindLevel / 3)); + if (KinkyDungeonIsArmsBound(false, false)) KDBoundPowerLevel += 0.2; + if (KinkyDungeonIsHandsBound(false, false, 0.65)) KDBoundPowerLevel += 0.075; + if (KinkyDungeonIsHandsBound(false, false, 0.99)) KDBoundPowerLevel += 0.075; + KDBoundPowerLevel += 0.1 * KinkyDungeonChastityMult(); + KDBoundPowerLevel += 0.2 * KinkyDungeonGagTotal(); + if (KDGameData.KneelTurns > 0) { + if (KinkyDungeonSlowLevel > 2) KDBoundPowerLevel += 0.15; + } else KDBoundPowerLevel += 0.15 * Math.max(0, Math.min(1, KinkyDungeonSlowLevel / 2)); + KDBoundPowerLevel += 0.1 * Math.max(0, Math.min(1, KDGameData.HeelPower / 4)); + if (KDBoundPowerLevel > 1) KDBoundPowerLevel = 1; + if (KinkyDungeonStatsChoice.get("BoundPower")) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id:"BoundPower", + type: "Evasion", + duration: 1, + power: KDBoundPowerLevel * KDBoundPowerMult, + }); + } + + KDGameData.Restriction = KDGetRestriction(); + + KinkyDungeonPlayers = [KinkyDungeonPlayerEntity]; + + KDBlindnessCap = 7; + KinkyDungeonSendEvent("calcStats", {}); + // Initialize + KinkyDungeonCalculateVibeLevel(delta); + if (KinkyDungeonVibeLevel > 0 && KinkyDungeonCanPlayWithSelf() && KDGameData.SleepTurns > 0 && KDGameData.SleepTurns < 5) { + //KinkyDungeonInterruptSleep(); + //KinkyDungeonSendActionMessage(5, TextGet("KinkyDungeonSleepDeprivation"), "pink", 3); + } + KinkyDungeonDifficulty = KinkyDungeonNewGame * 20; + //if (KinkyDungeonStatsChoice.get("hardMode")) KinkyDungeonDifficulty += 10; + KinkyDungeonTeaseLevel = Math.max(KinkyDungeonTeaseLevel * (1 - KinkyDungeonChastityMult()) + (delta > 0 ? KinkyDungeonTeaseLevelBypass : 0), 0); + if (delta > 0 && KinkyDungeonTeaseLevel) { + KDDistractionFlashLastTime = CommonTime(); + KDDistractionFlashStrength = Math.max(KinkyDungeonTeaseLevel, KDDistractionFlashStrength); + } + if (KinkyDungeonVibeLevel > 0 || KinkyDungeonTeaseLevel > 0) { + KDGameData.OrgasmNextStageTimer = Math.min(KDOrgasmStageTimerMax, KDGameData.OrgasmNextStageTimer + delta); + let data = { + invol_chance: (KDGameData.OrgasmStage >= KinkyDungeonMaxOrgasmStage) ? + 1.0 : + (KDInvolChanceBase + KDWillpowerInvolChanceMult * (1 - KinkyDungeonStatWill/KinkyDungeonStatWillMax) + KDPassionInvolChanceMult * (0.01 * (KinkyDungeonGoddessRep.Passion + 50) || 0)), + invol_satisfied_threshold: KinkyDungeonStatDistractionMax * 0.75, + }; + KinkyDungeonSendEvent("calcInvolOrgasmChance", data); + if ((KinkyDungeonTeaseLevel > 0 || KDGameData.OrgasmNextStageTimer >= KDOrgasmStageTimerMax) && (KDRandom() < data.invol_chance && KinkyDungeonControlsEnabled())) { + if (KDGameData.OrgasmStage < KinkyDungeonMaxOrgasmStage) { + if (KinkyDungeonCanPlayWithSelf() && KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax > KDGetPlaySelfThreshold() && !KinkyDungeonInDanger()) { + KinkyDungeonDoPlayWithSelf(KinkyDungeonTeaseLevel); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonPlaySelfAutomatic" + (KinkyDungeonIsArmsBound() ? "Bound" : "")), "#FF5BE9", 5); + } else { + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonPlaySelfTease"), "#FF5BE9", 2); + } + KDGameData.OrgasmStage += 1; + KDGameData.OrgasmNextStageTimer = 1; + } else { + if (KinkyDungeonCanOrgasm() && (KDGameData.OrgasmStamina < 0.5 || KinkyDungeonStatDistraction >= data.invol_satisfied_threshold) && KDGameData.PlaySelfTurns < 1) { + KinkyDungeonDoTryOrgasm(KinkyDungeonTeaseLevel, KinkyDungeonTeaseLevel > 0 ? 1 : 2); + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonOrgasmAutomatic"), "#FF5BE9", KinkyDungeonOrgasmStunTime + 1, true); + KDGameData.OrgasmNextStageTimer = 1; + } + } + } + } else if (KDGameData.OrgasmNextStageTimer > 0) { + KDGameData.OrgasmNextStageTimer = Math.max(0, KDGameData.OrgasmNextStageTimer - delta); + } + + let distractionRate = KDGetDistractionRate(delta); + + if (delta > 0 && KinkyDungeonVibeLevel > 0) { + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonVibing" + Math.max(0, Math.min(5, Math.round(KinkyDungeonVibeLevel)))), "#ff88ff", 2, true, true); + } + let arousalPercent = distractionRate > 0 && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionLower ? 0.01 : 0; + + if (KDGameData.OrgasmStage > 0 && !KinkyDungeonFlags.get("orgasmStageTimer") && KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax * 0.75) { + KDGameData.OrgasmStage = Math.max(0, KDGameData.OrgasmStage - delta); + KinkyDungeonSetFlag("orgasmStageTimer", 20 + Math.round(KDRandom() * 20)); + } + if (KinkyDungeonStatDistraction >= KinkyDungeonStatDistractionMax * 0.99) KDGameData.OrgasmTurns = Math.min(KDGameData.OrgasmTurns + delta, KinkyDungeonOrgasmTurnsMax); + else KDGameData.OrgasmTurns = Math.max(KDGameData.OrgasmTurns - delta, 0); + + + let sleepRegen = KinkyDungeonStatStaminaRegenSleep * KinkyDungeonStatStaminaMax / KDMaxStatStart; + let sleepRegenDistraction = KinkyDungeonStatArousalLowerRegenSleep * KinkyDungeonStatDistractionMax / KDMaxStatStart; + if (KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y) == 'B') sleepRegen *= 2; + let stamMult = KDGameData.StaminaSlow > 0 ? Math.max(0.5, (KDForcedToGround() ? 0.5 : 1.0) - 0.1 * KDGameData.StaminaSlow) : 1.0; + let stamRegen = KDGameData.StaminaPause > 0 ? 0 : KinkyDungeonSetMaxStats().staminaRate * stamMult; + + // Process wait equation + if (delta > 0 && KDGameData.StaminaPause > 0) KDGameData.StaminaPause -= delta; + if (delta > 0 && KDGameData.StaminaSlow > 0) KDGameData.StaminaSlow -= delta; + if (delta > 0 && KDGameData.ManaSlow > 0) KDGameData.ManaSlow -= delta; + + let baseRate = KinkyDungeonStatsChoice.get("PoorBalance") ? 0.5 : 1; + let kneelRate = baseRate * (KinkyDungeonIsArmsBound() ? 0.85 : 1); + if (KinkyDungeonSlowLevel > 2) kneelRate *= 0.85; + let restriction = KDGameData.Restriction || 0; + if (restriction) { + kneelRate *= 10 / (10 + restriction); + } + + let minKneel = 0; + if (KinkyDungeonStatsChoice.get("Grounded") && (KinkyDungeonIsArmsBound() && KinkyDungeonLegsBlocked())) { + minKneel = 1; + } + + if (KDGameData.KneelTurns > 0 && !KDForcedToGround() && !KDGameData.Crouch && (kneelRate < baseRate || minKneel > 0)) { + if (KinkyDungeonHasHelp()) { + kneelRate = baseRate; + if (minKneel > 0) { + minKneel = 0; + } + KinkyDungeonSendTextMessage(4, TextGet("KDGetUpAlly"), "#ffffff",1, !(KDGameData.KneelTurns <= delta*kneelRate)); + + } else if (KinkyDungeonStatsChoice.get("Grounded") && KinkyDungeonGetAffinity(false, "Corner", undefined, undefined)) { + minKneel = 0; + kneelRate = Math.min(baseRate * 1.4, kneelRate + 0.2); + KinkyDungeonSendTextMessage(4, TextGet("KDGetUpCorner"), "#ffffff",1, !(KDGameData.KneelTurns <= delta*kneelRate)); + } else if (KinkyDungeonStatsChoice.get("Grounded") && KinkyDungeonGetAffinity(false, "Wall", undefined, undefined)) { + minKneel = 0; + kneelRate *= 0.65; + //if (KDGameData.KneelTurns <= kneelRate) { + KinkyDungeonSendTextMessage(4, TextGet("KDGetUpWall"), "#ffffff",1, !(KDGameData.KneelTurns <= delta*kneelRate)); + //} + } + + if (minKneel > 0) { + KinkyDungeonSendActionMessage(1, TextGet("KDKneelCannot"), "#ff8933",1, true); + } else if (kneelRate < 1) { + KinkyDungeonSendTextMessage(4, TextGet("KDKneelSlow"), "#ffffff",1, true); + } + } + + + if (delta > 0 && KDGameData.KneelTurns > minKneel) KDGameData.KneelTurns -= delta*kneelRate; + if (KDGameData.Crouch) KDGameData.KneelTurns = Math.max(1, KDGameData.KneelTurns || 0); + if (KDGameData.Wait > 0) { + if (delta > 0) { + KDGameData.Wait -= delta; + if (delta > 0 && KDGameData.StaminaPause > 0) KDGameData.StaminaPause -= delta; + if (delta > 0 && KDGameData.StaminaSlow > 0) KDGameData.StaminaSlow -= delta; + } + + stamRegen *= 2; + } + + if (KDGameData.AncientEnergyLevel > 0.01) { + if (!KinkyDungeonFlags.get("tut_charge")) { + KinkyDungeonSetFlag("tut_charge", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Charge2"), KDTutorialColor, 10); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Charge"), KDTutorialColor, 10); + } + } + + KinkyDungeonStaminaRate = KDGameData.SleepTurns > 0 && KDGameData.SleepTurns < KinkyDungeonSleepTurnsMax - 1? sleepRegen : stamRegen; + + let statData = { + manaPoolRegen: KinkyDungeonStatManaPoolRegen, + player: KinkyDungeonPlayerEntity, + }; + KinkyDungeonSendEvent("calcManaPool", statData); + KinkyDungeonSendEvent("afterCalcManaPool", statData); + KinkyDungeonStatManaRate = (KinkyDungeonStatMana < KinkyDungeonStatManaRegenLowThreshold && KinkyDungeonStatsChoice.get("Meditation")) ? + Math.max(KinkyDungeonStatManaPool > 0 ? (statData.manaPoolRegen * KinkyDungeonStatManaMax) : 0, KDMeditationRegen) + : 0; + let ManaPoolDrain = 0; + if (KinkyDungeonStatManaRate == 0 && KinkyDungeonStatManaPool > 0) { + KinkyDungeonStatManaRate = KinkyDungeonStatManaPool - Math.max(0, KinkyDungeonStatManaPool - statData.manaPoolRegen * KinkyDungeonStatManaMax); + if (KDGameData.ManaSlow > 0) { + KinkyDungeonStatManaRate *= Math.max(0.1, 1 - 0.1 * KDGameData.ManaSlow); + } + KinkyDungeonStatManaRate = Math.min(KinkyDungeonStatManaRate, KinkyDungeonStatManaMax - KinkyDungeonStatMana); + ManaPoolDrain = KinkyDungeonStatManaRate * KDManaPoolRatio; + } + + // Update the player tags based on the player's groups + KinkyDungeonPlayerTags = KinkyDungeonUpdateRestraints(KinkyDungeonPlayer, -1, delta); + + let blind = Math.max(KinkyDungeonBlindLevelBase, KinkyDungeonGetBlindLevel()); + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Blindness")) blind = Math.max(0, blind + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Blindness")); + KinkyDungeonBlindLevel = Math.min(KDBlindnessCap, blind); + if (KinkyDungeonBlindLevel > 0 && KinkyDungeonStatsChoice.has("Unmasked")) KinkyDungeonBlindLevel += 1; + if (KinkyDungeonStatBlind > 0) KinkyDungeonBlindLevel = Math.max(KinkyDungeonBlindLevel, 6); + //if (KinkyDungeonStatStamina < 2) KinkyDungeonBlindLevel = Math.max(KinkyDungeonBlindLevel, Math.round(6 - 3*KinkyDungeonStatStamina)); + KinkyDungeonDeaf = false;//KinkyDungeonPlayer.IsDeaf(); + + // Unarmed damage calc + if (KinkyDungeonPlayerWeapon && !KinkyDungeonInventoryGet(KinkyDungeonPlayerWeapon)) + KDSetWeapon(null); + KinkyDungeonPlayerDamage = KinkyDungeonGetPlayerWeaponDamage(KinkyDungeonCanUseWeapon(undefined, undefined, KinkyDungeonPlayerDamage)); + + KinkyDungeonUpdateStruggleGroups(); + // Slowness calculation + KinkyDungeonCalculateSlowLevel(delta); + KinkyDungeonCalculateHeelLevel(delta); + let sleepRate = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Sleepiness") + + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SleepinessGas") * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "happygasDamageResist") * 2) + + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SleepinessPoison") * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "poisonDamageResist")); + if ((sleepRate && sleepRate > 0) || KinkyDungeonSleepiness > 0) { + KinkyDungeonSleepiness = Math.min(KinkyDungeonSleepinessMax, KinkyDungeonSleepiness + sleepRate * delta); + if (KinkyDungeonSleepiness > 2.99) { + KinkyDungeonSlowLevel = Math.max(KinkyDungeonSlowLevel, 2); + //KinkyDungeonBlindLevel = Math.max(KinkyDungeonBlindLevel + Math.floor(KinkyDungeonSleepiness/2), 5); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "Sleepy", aura: "#222222", type: "AttackStamina", duration: 3, power: -1, player: true, enemies: false, tags: ["attack", "stamina"]}); + } + if (KinkyDungeonSleepiness > 0) { + KinkyDungeonBlindLevel = Math.max(KinkyDungeonBlindLevel + Math.floor(KinkyDungeonSleepiness*0.5), Math.min(Math.round(KinkyDungeonSleepiness*0.7), 6)); + } + if (KinkyDungeonSleepiness > 0) { + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonSleepy"), "#ff5277", 1, true); + } + if (KinkyDungeonSleepiness > 4.99) { + KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns || 0, 2); + } + } + if ((!sleepRate || sleepRate <= 0) && KinkyDungeonSleepiness > 0) KinkyDungeonSleepiness = Math.max(0, KinkyDungeonSleepiness - delta); + + // Cap off the values between 0 and maximum + KDChangeDistraction("player", "regen", "tick", distractionRate*delta, true, distractionRate > 0 ? arousalPercent: 0); + if (sleepRegenDistraction > 0 && KDGameData.SleepTurns > 0) { + KinkyDungeonStatDistractionLower -= sleepRegenDistraction*delta; + } else { + //KinkyDungeonStatDistractionLower += distractionRate*delta * arousalPercent; + } + + KDChangeStamina("player", "regen", "tick", KinkyDungeonStaminaRate*delta, true, undefined, true, undefined, undefined, true); + KDGameData.Wait = Math.max(0, KDGameData.Wait); + + KinkyDungeonStatMana += KinkyDungeonStatManaRate; + KinkyDungeonStatManaPool -= ManaPoolDrain; + + if (KDIsEdged(KinkyDungeonPlayerEntity)) { + let data = { + delta: delta, + edgeDrain: KinkyDungeonStatDistractionLower < KinkyDungeonStatDistractionLowerCap ? KinkyDungeonOrgasmExhaustionAmountWillful : KinkyDungeonOrgasmExhaustionAmount, + }; + KinkyDungeonSendEvent("calcEdgeDrain", data); + KDChangeWill("player", "edge", "tick", data.edgeDrain); + let vibe = KinkyDungeonVibeLevel > 0 ? "Vibe" : ""; + let suff = KDGameData.OrgasmStage < KinkyDungeonMaxOrgasmStage ? (KDGameData.OrgasmStage < KinkyDungeonMaxOrgasmStage / 2 ? "0" : "1") : "2"; + KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonOrgasmExhaustion" + vibe + suff), "#ff5277", 2, true); + } + + if (!KinkyDungeonHasWill(0.1)) { + // Add Surrender debuff + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "NoWP", + duration: 1, + buffSprite: true, + aura: "#ff5277", + aurasprite: "NoWP", + type: "EvasionPenalty", + power: 1, + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "NoWP2", + duration: 1, + type: "BlockPenalty", + power: 1, + }); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { + id: "NoWP3", + duration: 1, + type: "RestraintBlockPenalty", + power: 1, + }); + } + + KinkyDungeonStatBlind = Math.max(0, KinkyDungeonStatBlind - delta); + KinkyDungeonStatFreeze = Math.max(0, KinkyDungeonStatFreeze - delta); + KinkyDungeonStatBind = Math.max(0, KinkyDungeonStatBind - delta); + + if (delta > 0) { + if (!KDGameData.BalancePause) + KDChangeBalanceSrc("player", "balance", "tick", (KDGameData.KneelTurns > 0 ? 1.5 : 1.0) * KDGetBalanceRate()*delta, true); + KDGameData.BalancePause = false; + } + + KinkyDungeonCapStats(); + + KDOrigDistraction = Math.floor(KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax * 100); + KDOrigStamina = Math.floor(KinkyDungeonStatStamina * 10); + KDOrigMana = Math.floor(KinkyDungeonStatMana * 10); + + KinkyDungeonCalculateMiscastChance(); + + KinkyDungeonHasCrotchRope = false; + let drains = []; + + + for (let item of KinkyDungeonFullInventory()) { + if (item.type == Restraint) { + if (KDRestraint(item).difficultyBonus) { + KinkyDungeonDifficulty += KDRestraint(item).difficultyBonus; + } + if (KDRestraint(item).crotchrope) KinkyDungeonHasCrotchRope = true; + if (KDRestraint(item).enchantedDrain) { + if (KDGameData.AncientEnergyLevel > 0) { + //maxDrain = Math.max(maxDrain, KDRestraint(item).enchantedDrain); + drains.push(KDRestraint(item).enchantedDrain); + } + //KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - KDRestraint(item).enchantedDrain * delta); + } + } + } + if (drains.length > 0 && delta > 0) { + drains = drains.sort().reverse(); + for (let i = 0; i < drains.length; i++) { + KDGameData.AncientEnergyLevel = Math.max(0, KDGameData.AncientEnergyLevel - ( + drains[i]/(i + 1) + ) * delta); + } + } + + KinkyDungeonSubmissiveMult = KinkyDungeonCalculateSubmissiveMult(); + + if (!KDGameData.TimeSinceLastVibeEnd) KDGameData.TimeSinceLastVibeEnd = {}; + if (!KDGameData.TimeSinceLastVibeStart) KDGameData.TimeSinceLastVibeStart = {}; + + for (let type of Object.entries(KDGameData.TimeSinceLastVibeStart)) { + if (!KDGameData.TimeSinceLastVibeStart[type[0]]) KDGameData.TimeSinceLastVibeStart[type[0]] = 1; + else KDGameData.TimeSinceLastVibeStart[type[0]] += delta; + } + for (let type of Object.entries(KDGameData.TimeSinceLastVibeEnd)) { + if (!KDGameData.TimeSinceLastVibeEnd[type[0]]) KDGameData.TimeSinceLastVibeEnd[type[0]] = 1; + else KDGameData.TimeSinceLastVibeEnd[type[0]] += delta; + } + + KDUpdatePerksBonus(); + + if (delta > 0) { + KinkyDungeonTeaseLevel = 0; + KinkyDungeonTeaseLevelBypass = 0; + } + + if (KinkyDungeonSlowLevel > 9) KDGameData.CagedTime = (KDGameData.CagedTime || 0) + delta; + else KDGameData.CagedTime = 0; +} + +let KDDamageAmpPerks = 0; +let KDDamageAmpPerksMelee = 0; +let KDDamageAmpPerksMagic = 0; +let KDDamageAmpPerksSpell = 0; +let KDDamageAmpEnvironmental = 0; +let KDExtraEnemyTags: Record = {}; + +function KDGetEnvironmentalDmg() { + return KinkyDungeonMultiplicativeStat(-KDDamageAmpEnvironmental); +} + +function KDUpdatePerksBonus() { + KDDamageAmpPerks = 0; + KDDamageAmpPerksMagic = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "magicDamageBuff"); + KDDamageAmpPerksMelee = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "meleeDamageBuff"); + KDDamageAmpPerksSpell = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "spellDamageBuff"); + KDDamageAmpEnvironmental = 0; + KDExtraEnemyTags = {}; + for (let perk of KinkyDungeonStatsChoice.keys()) { + if (KDPerkUpdateStats[perk]) KDPerkUpdateStats[perk](); + } + KinkyDungeonSendEvent("perksBonus", {}); +} + +function KinkyDungeonCalculateMiscastChance() { + let flags = { + miscastChance: Math.max(0, KinkyDungeonStatDistractionMiscastChance * Math.min(1, KinkyDungeonStatDistraction / (KinkyDungeonStatDistractionMax||1))), + satisfiedAmount: 0.3, + }; + if (KinkyDungeonStatsChoice.has("AbsoluteFocus")) { + flags.miscastChance = Math.min(flags.miscastChance * 2, 1); + } + if (KinkyDungeonStatsChoice.get("Distracted")) flags.miscastChance += KDDistractedAmount; + if (KDEntityBuffedStat(KDPlayer(), "MiscastChance")) flags.miscastChance += KDEntityBuffedStat(KDPlayer(), "MiscastChance"); + KinkyDungeonSendEvent("calcMiscast", flags); + if (flags.satisfiedAmount && KDGameData.OrgasmStamina > 0.5) flags.miscastChance = Math.max(0, flags.miscastChance - flags.satisfiedAmount); + KinkyDungeonMiscastChance = Math.max(0, flags.miscastChance || 0); +} + +function KinkyDungeonGetBlindLevel() { + let blindness = 0; + for (let inv2 of KinkyDungeonAllRestraintDynamic()) { + let inv = inv2.item; + if (KDRestraint(inv).blindfold) blindness = Math.max(Math.min(8, blindness + 1), KDRestraint(inv).blindfold); + } + let data = { + player: KinkyDungeonPlayerEntity, + blindness: blindness ? blindness*1.5 : 0, + }; + KinkyDungeonSendEvent("calcBlind", data); + return data.blindness; +} + +function KinkyDungeonCapStats() { + KinkyDungeonStatDistractionLower = Math.max(0, Math.min(KinkyDungeonStatDistractionLower, KinkyDungeonStatDistractionMax * KinkyDungeonStatDistractionLowerCap)); + KinkyDungeonStatDistraction = Math.max(0, Math.min(KinkyDungeonStatDistraction, KinkyDungeonStatDistractionMax)); + KinkyDungeonStatStamina = Math.max(0, Math.min(KinkyDungeonStatStamina, KinkyDungeonStatStaminaMax)); + KinkyDungeonStatMana = Math.max(0, Math.min(KinkyDungeonStatMana, KinkyDungeonStatManaMax)); + KinkyDungeonStatManaPool = Math.max(0, Math.min(KinkyDungeonStatManaPool, KinkyDungeonStatManaPoolMax)); + + // Negate floating point err... + if (KinkyDungeonStatMana > KinkyDungeonStatManaMax - 0.001) KinkyDungeonStatMana = KinkyDungeonStatManaMax; + if (KinkyDungeonStatWill > KinkyDungeonStatWillMax - 0.001) KinkyDungeonStatWill = KinkyDungeonStatWillMax; +} + +function KDIsHogtied(C?: Character): boolean { + if (!C) C = KinkyDungeonPlayer; + return KDCurrentModels.get(C)?.Poses.Hogtie; +} +function KDIsKneeling(C?: any): boolean { + if (!C) C = KinkyDungeonPlayer; + return KDCurrentModels.get(C)?.Poses.Kneel || KDCurrentModels.get(C)?.Poses.KneelClosed; +} + +function KinkyDungeonLegsBlocked() { + if (KDIsHogtied()) return true; + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv) && KDRestraint(inv).blockfeet) return true; + } + return false; +} + +function KinkyDungeonCanStand() { + return !KDIsKneeling() && !KDIsHogtied() && !(KDGameData.KneelTurns > 0); +} +function KinkyDungeonCanKneel() { + return true; +} + +function KinkyDungeonCalculateHeelLevel(_delta: number, overrideKneel?: boolean) { + let heelpower = 0; + if (overrideKneel || (!KDForcedToGround() && KinkyDungeonCanStand())) + for (let inv2 of KinkyDungeonAllRestraintDynamic()) { + let inv = inv2.item; + if ((KDRestraint(inv)?.heelpower)) { + let power = KDRestraint(inv).power * KDRestraint(inv).heelpower; + heelpower = Math.max(heelpower, power); + } + } + if (heelpower && heelpower < 2) heelpower = 2; + KDGameData.HeelPower = Math.max(0, + Math.pow(heelpower, 0.75) + + KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "HeelPower") + + Math.max(0, KinkyDungeonSleepiness)); +} + +function KinkyDungeonCalculateSlowLevel(delta?: number) { + KinkyDungeonSlowLevel = 0; + if (KinkyDungeonAllRestraint().some((r) => {return KDRestraint(r).immobile;})) {KinkyDungeonSlowLevel += 100;} + else { + for (let inv2 of KinkyDungeonAllRestraintDynamic()) { + let inv = inv2.item; + if ((KDRestraint(inv).blockfeet || KDRestraint(inv).hobble || (KinkyDungeonStatsChoice.get("ClassicHeels") && KDRestraint(inv).heelpower))) { + let hobbleAmount = KDRestraint(inv).hobble || (KinkyDungeonStatsChoice.get("ClassicHeels") ? Math.round(KDRestraint(inv).heelpower + 0.1) : 1) || 1; + KinkyDungeonSlowLevel = Math.min(Math.max(3, hobbleAmount), KinkyDungeonSlowLevel + hobbleAmount); + } + } + for (let inv2 of KinkyDungeonAllRestraintDynamic()) { + let inv = inv2.item; + if (KDRestraint(inv).blockfeet) { + KinkyDungeonSlowLevel = Math.max(KinkyDungeonSlowLevel, 2); + break; + } + } + // If your hands are free you are faster + if (!KinkyDungeonCanStand() || KDForcedToGround()) { + KinkyDungeonSlowLevel = Math.max(KinkyDungeonIsArmsBound() ? 3 : 2, KinkyDungeonSlowLevel + 1); + if (delta > 0 && KDForcedToGround()) + KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns, delta); + } + if (KDIsHogtied()) KinkyDungeonSlowLevel = Math.max(KinkyDungeonIsArmsBound() ? 4 : 3, KinkyDungeonSlowLevel + 1); + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).freeze) KinkyDungeonSlowLevel = Math.max(2, KinkyDungeonSlowLevel); + } + if (!KinkyDungeonHasStamina(0.01)) KinkyDungeonSlowLevel = Math.max(1, KinkyDungeonSlowLevel); + } + if (KinkyDungeonStatsChoice.get("PoorForm") && KinkyDungeonSlowLevel > 0) KinkyDungeonSlowLevel += 1; + let origSlowLevel = KinkyDungeonSlowLevel; + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowLevel")) KinkyDungeonSlowLevel += KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowLevel"); + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "MoveSpeed")) KinkyDungeonSlowLevel = Math.max(0, KinkyDungeonSlowLevel - KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "MoveSpeed")); + KinkyDungeonSlowLevel = Math.max(0, KinkyDungeonSlowLevel); + if (KinkyDungeonStatsChoice.get("PoorForm") && KinkyDungeonSlowLevel > 0) KinkyDungeonSlowLevel = Math.max(2, KinkyDungeonSlowLevel); + + if (KDGameData.Crouch) { + // Force slowness when crouching + if (KinkyDungeonSlowLevel < 2 && delta > 0 && KinkyDungeonLastAction == "Move") { + KinkyDungeonSendActionMessage(9, TextGet("KDPetsuitCrawl"), "#ffffff", 1, true); + } + KinkyDungeonSlowLevel = Math.max(2, KinkyDungeonSlowLevel); + } + if (delta > 0 && KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowLevelEnergyDrain")) KDGameData.AncientEnergyLevel = + Math.max(0, KDGameData.AncientEnergyLevel - Math.max(0, origSlowLevel - KinkyDungeonSlowLevel) * KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SlowLevelEnergyDrain")); + + if (KinkyDungeonSlowLevel > 9) { + KDGameData.MovePoints = Math.min(-1, KDGameData.MovePoints); + } +} +/** + * Returns the total level of gagging, 1.0 or higher meaning "fully gagged" and 0.0 being able to speak. + * @param [AllowFlags] - Whether or not flags such as allowPotions and blockPotions should override the final result + * @return - The gag level, sum of all gag properties of worn restraints + */ +function KinkyDungeonGagTotal(AllowFlags?: boolean, gagMult: number = 1): number { + if (KinkyDungeonStatsChoice.get("SmoothTalker")) gagMult = 0.8; + let total = 0; + let allow = false; + let prevent = false; + for (let rest of KinkyDungeonAllRestraintDynamic()) { + let inv = rest.item; + if (KDRestraint(inv).gag) total += gagMult * KDRestraint(inv).gag; + if (KDRestraint(inv).allowPotions) allow = true; + } + if (AllowFlags) { + if (prevent) return 1.00; + else if (allow) return 0.0; + } + return total; +} +/** + * Returns the total level of gagging, 1.0 or higher meaning "fully gagged" and 0.0 being able to speak. + * @param [AllowFlags] - Whether or not flags such as allowPotions and blockPotions should override the final result + * @return - The gag level, sum of all gag properties of worn restraints + */ +function KDIsGaggedFast(): boolean { + return !!KinkyDungeonPlayerTags.get("Gagged"); +} + +function KinkyDungeonCanTalk(Loose?: boolean): boolean { + for (let inv of KinkyDungeonAllRestraint()) { + if ((Loose ? KinkyDungeonGagTotal() >= 0.99 : KDRestraint(inv).gag)) return false; + } + return true; +} + +function KinkyDungeonCalculateSubmissiveMult() { + let base = 0; + for (let item of KinkyDungeonAllRestraint()) { + if (item.type == Restraint) { + let power = Math.sqrt(Math.max(0, KinkyDungeonGetLockMult(item.lock, item) * KDRestraint(item).power)); + base = Math.max(power, base + power/5); + } + } + + base *= 0.28; + + let mult = Math.max(0, 0.2 + 0.8 * (KinkyDungeonGoddessRep.Ghost + 50)/100); + let amount = Math.max(0, base * mult); + //console.log(amount); + return amount; +} + +function KinkyDungeonCanPlayWithSelf() { + if (!KinkyDungeonStatsChoice.get("arousalMode")) return false; + return (KinkyDungeonStatDistraction > KinkyDungeonDistractionSleepDeprivationThreshold * KinkyDungeonStatDistractionMax || KDGameData.OrgasmStamina > 0.5) && KinkyDungeonHasStamina(-KDGetOrgasmCost()); +} + +function KinkyDungeonCanTryOrgasm() { + if (!KinkyDungeonStatsChoice.get("arousalMode")) return false; + let data = { + player: KinkyDungeonPlayerEntity, + threshold: KinkyDungeonStatDistractionMax - 0.01, + satisfiedthreshold: KinkyDungeonStatDistractionMax * 0.5, + }; + KinkyDungeonSendEvent("calcOrgThresh", data); + return KinkyDungeonStatDistraction >= data.threshold && (KinkyDungeonHasStamina(-KDGetOrgasmCost()) || KDGameData.OrgasmStage > 3) && (KDGameData.OrgasmStamina < 1 || KinkyDungeonStatDistraction > data.satisfiedthreshold); +} + +function KDGetOrgasmCost() { + return Math.max(KinkyDungeonOrgasmCost, -KinkyDungeonOrgasmCostPercent * KinkyDungeonStatStamina); +} + +/** + * @param [tease] - The teasing power + */ +function KDGetPlaySelfPower(tease?: number): {orig: number, final: number} { + let OrigAmount = Math.max( + tease ? Math.min(KinkyDungeonPlayWithSelfPowerMax, tease) : 0, + KinkyDungeonPlayWithSelfPowerMin + (KinkyDungeonPlayWithSelfPowerMax - KinkyDungeonPlayWithSelfPowerMin)*KDRandom()); + let amount = Math.max(0, OrigAmount - KinkyDungeonChastityMult() * KinkyDungeonPlayWithSelfChastityPenalty); + + return {orig: OrigAmount, final: amount}; +} + +function KinkyDungeonDoPlayWithSelf(tease?: number): number { + let affinity = KinkyDungeonGetAffinity(false, "Edge"); + let power = KDGetPlaySelfPower(tease); + let OrigAmount = power.orig; + let amount = power.final; + let bound = KinkyDungeonIsArmsBound(); + if (bound && !affinity) amount = Math.max(0, Math.min(amount, OrigAmount - KinkyDungeonPlayWithSelfBoundPenalty)); + if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.playSelfBonus) amount += KinkyDungeonPlayerDamage.playSelfBonus; + if (affinity) amount += 1; + + let data = { + player: KinkyDungeonPlayerEntity, + amount: amount, + cost: KinkyDungeonPlayCost, + bound: bound, + playTime: 3, + playSound: true, + playMsg: true, + affinity: affinity, + OrigAmount: OrigAmount, + power: power, + alertRadius: 4.5 - 4*Math.min(1, KinkyDungeonGagTotal()), + distractionCooldown: Math.max(KDGameData.DistractionCooldown, 13), + }; + + KinkyDungeonSendEvent("playSelf", data); + + //KinkyDungeonAlert = Math.max(KinkyDungeonAlert || 0, data.alertRadius); // Alerts nearby enemies because of your moaning~ + + KinkyDungeonMakeNoise(data.alertRadius, KDPlayer().x, KDPlayer().y); + + KDChangeDistraction("player", "playSelf", "playSelf", Math.sqrt(Math.max(0, data.amount * KinkyDungeonPlayWithSelfMult)) * KinkyDungeonStatDistractionMax/KDMaxStatStart, false, 0.12); + KDChangeStamina("player", "playSelf", "playSelf", data.cost, true, 3); + if (data.playSound) { + if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.playSelfSound) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + KinkyDungeonPlayerDamage.playSelfSound + ".ogg"); + } + if (data.playMsg) { + if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.playSelfMsg) { + KinkyDungeonSendActionMessage(10, TextGet(KinkyDungeonPlayerDamage.playSelfMsg), "#FF5BE9", 4); + } else if (KinkyDungeonIsArmsBound()) { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonPlaySelfBound"), "#FF5BE9", 4); + } else if (KinkyDungeonChastityMult() > 0.9) { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonChastityDeny"), "#FF5BE9", 4); + } else KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonPlaySelf"), "#FF5BE9", 4); + if (affinity) + KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonPlayCorner"), "#9bd45d", 4); + } + KDGameData.PlaySelfTurns = data.playTime; + KinkyDungeonSetFlag("PlayWithSelf", KDGameData.PlaySelfTurns + 3); + KDGameData.DistractionCooldown = data.distractionCooldown; + + return amount; +} + +/** Percentage of vibe level that is turned into playSelfPower to try to have an orgasm*/ +let KinkyDungeonOrgasmVibeLevelPlayPowerMult = 1.0; +let KinkyDungeonOrgasmChanceBase = -0.1; +let KinkyDungeonOrgasmChanceScaling = 1.35; +//let KinkyDungeonOrgasmChanceScalingDesire = 0.5; +let KinkyDungeonMaxOrgasmStage = 7; +let KinkyDungeonOrgasmStageVariation = 4; // determines the text message variation + +/** Threshold at which the player can play with herself */ +let KinkyDungeonDistractionSleepDeprivationThreshold = 0.001; +/** Threshold at which the player will automatically play with herself if able*/ +let KinkyDungeonDistractionPlaySelfThreshold = 0.9; +let KinkyDungeonPlaySelfOrgasmThreshold = 3; // Note that it is impossible if you have a belt on, but possible if you only have a bra on + +let KinkyDungeonOrgasmTurnsMax = 10; +let KinkyDungeonOrgasmTurnsCrave = 8; +let KinkyDungeonPlayWithSelfPowerMin = 4.5; +let KinkyDungeonPlayWithSelfPowerMax = 5.5; +let KDDesireScalingOrgasmPower = 0.5; +let KinkyDungeonPlayWithSelfPowerVibeWand = 4; +let KinkyDungeonPlayWithSelfChastityPenalty = 4.5; +let KinkyDungeonPlayWithSelfBoundPenalty = 2.0; +let KinkyDungeonOrgasmExhaustionAmount = -0.02; +let KinkyDungeonOrgasmExhaustionAmountWillful = -0.005; + +let KDOrgasmStageTimerMax = 10; // Turns for orgasm stage timer to progress naturally +let KDWillpowerInvolChanceMult = 0.1; // Chance for the event to happen +let KDInvolChanceBase = -0.2; +let KDPassionInvolChanceMult = 0.6; + + +let KDWillpowerMultiplier = 0.5; + +let KinkyDungeonOrgasmCost = -8; +let KinkyDungeonOrgasmCostPercent = 0.7; +let KinkyDungeonOrgasmWillpowerCost = -2.5; +let KinkyDungeonEdgeCost = -1; +let KinkyDungeonEdgeWillpowerCost = -0.1; +let KinkyDungeonPlayCost = -0.1; + +let KinkyDungeonOrgasmStunTime = 4; +let KinkyDungeonPlayWithSelfMult = 0.5; + +function KDGetPlaySelfThreshold() { + return KinkyDungeonDistractionPlaySelfThreshold - 0.01 * ( + 0.4 * (KinkyDungeonGoddessRep.Passion + 50) + 0.9*(KinkyDungeonGoddessRep.Frustration + 50) + ); +} + +/** + * Try to let go... + * @param [Bonus] + * @param [Auto] - whether this was automatically triggered or not. 0 = manual, 1 = forced by enemy/vibe, 2 - player character can't resist + */ +function KinkyDungeonDoTryOrgasm(Bonus?: number, Auto?: number) { + let chance = KinkyDungeonOrgasmChanceBase + + KinkyDungeonOrgasmVibeLevel * 0.1 + + KinkyDungeonOrgasmChanceScaling*(KDGameData.OrgasmTurns/KinkyDungeonOrgasmTurnsMax) + * (KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionLowerCap / KinkyDungeonStatDistractionMax); + let denied = KinkyDungeonVibratorsDeny(chance); + + let amount = denied ? 0 : KinkyDungeonOrgasmVibeLevel * KinkyDungeonOrgasmVibeLevelPlayPowerMult; + amount += KDDesireScalingOrgasmPower*(KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionLowerCap / KinkyDungeonStatDistractionMax); + let playSelfAmount = Bonus != undefined ? Bonus : KinkyDungeonDoPlayWithSelf(); + //if (playSelfAmount > KinkyDungeonOrgasmVibeLevel) { + //console.log(`${playSelfAmount} + ${amount}`); + amount += playSelfAmount; + //} + let msg = "KinkyDungeonOrgasm"; + let msgTime = KinkyDungeonOrgasmStunTime+10; + + + let data = { + auto: Auto, + player: KinkyDungeonPlayerEntity, + playSelfAmount: Bonus != undefined ? 0 : playSelfAmount, + bonus: Bonus || 0, + eventBonus: 0, + eventMult: 1, + amount: amount, + chance: chance, + denied: denied, + Bonus: Bonus, + edgespcost: KinkyDungeonEdgeCost, + edgewpcost: KinkyDungeonEdgeWillpowerCost * (1 + KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionLowerCap / KinkyDungeonStatDistractionMax), + spcost: KDGetOrgasmCost(), + wpcost: KinkyDungeonOrgasmWillpowerCost * (1 + KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionLowerCap / KinkyDungeonStatDistractionMax), + stunTime: Math.round(KinkyDungeonOrgasmStunTime * (1 + KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionLowerCap / KinkyDungeonStatDistractionMax)), + playSound: true, + playMsg: true, + alertRadius: Math.round(4 * (1 + 1.5*KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionLowerCap / KinkyDungeonStatDistractionMax)), + satisfaction: Math.max(0.1, KinkyDungeonStatDistractionLower * 1.75), + distractionCooldown: Math.max(KDGameData.DistractionCooldown, 13), + cancelOrgasm: false, + lowerFloorTo: Math.max(0, + KinkyDungeonStatDistractionLower + * (1 + - 0.75 * Math.max(0.01, KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionLowerCap / KinkyDungeonStatDistractionMax)**2 + - 0.2 * KDGameData.OrgasmStage/KinkyDungeonMaxOrgasmStage) + - KinkyDungeonStatDistractionMax*0.2 * Math.max(0.01, KinkyDungeonStatDistractionLower/KinkyDungeonStatDistractionLowerCap / KinkyDungeonStatDistractionMax))**1.5, + }; + + KinkyDungeonSendEvent("tryOrgasm", data); + + data.amount += data.eventBonus; + data.amount *= data.eventMult; + + if (data.cancelOrgasm) return; + if (data.amount > KinkyDungeonPlaySelfOrgasmThreshold && KDRandom() < data.chance && !KinkyDungeonFlags.get("nogasm")) { + // You finally shudder and tremble as a wave of pleasure washes over you... + KinkyDungeonStatBlind = data.stunTime + 2; + //KinkyDungeonOrgasmStunTime = 4; + KinkyDungeonSetFlag("OrgSuccess", data.stunTime + 3); + KinkyDungeonSetFlag("OrgAfterglow", data.stunTime + 3 + KDOrgAfterglowTime); + + KinkyDungeonSetFlag("PlayerOrgasm", data.stunTime); + KinkyDungeonSetFlag("nogasm", data.stunTime + Math.floor(KDRandom() * 3)); + KinkyDungeonSetFlag("PlayerOrgasmFilter", data.stunTime + 1); + KDGameData.OrgasmStamina = data.satisfaction; + KDChangeStamina(data.auto ? "auto" : "player", "orgasm", "tryOrgasm", data.spcost); + KDChangeWill(data.auto ? "auto" : "player", "orgasm", "tryOrgasm", data.wpcost); + KinkyDungeonStatDistractionLower = data.lowerFloorTo; + KinkyDungeonAlert = Math.max(KinkyDungeonAlert || 0, data.alertRadius); // Alerts nearby enemies because of your moaning~ + KDGameData.PlaySelfTurns = data.stunTime; + // Balance + KDChangeBalanceSrc(data.auto ? "auto" : "player", "orgasm", "tryOrgasm", (KDBaseBalanceDmgLevel + KDGameData.HeelPower) / KDBaseBalanceDmgLevel * 0.5*-KDBalanceDmgMult() * 4*KDFitnessMult(), true); + KinkyDungeonSendEvent("orgasm", data); + } else { + KDChangeStamina(data.auto ? "auto" : "player", "edge", "tryOrgasm", data.edgespcost); + KDChangeWill(data.auto ? "auto" : "player", "edge", "tryOrgasm", data.edgewpcost); + // You close your eyes and breath rapidly in anticipation... + // You feel frustrated as the stimulation isn't quite enough... + // You groan with pleasure as you keep close to the edge... + // You whimper as you rub your legs together furiously... + // You tilt your head back and moan as your heart beats faster... + // Your whole body shakes, but you don't quite go over the edge... + // This is starting to feel like torture... + // You let out a frustrated scream as the torment continues... + // You simmer just under the edge, heart racing, breathing quickly... + // You let out an anguished moan as release dances just out of reach... + // You squirm helplessly as your futile struggles simply arouse you more... + KDGameData.OrgasmTurns = Math.min(KDGameData.OrgasmTurns + amount, KinkyDungeonOrgasmTurnsMax); // Progress the meter if you're not ready yet... + KDGameData.OrgasmStage = Math.min(KinkyDungeonMaxOrgasmStage, KDGameData.OrgasmStage + 1); // Stage of denial + if (KDGameData.CurrentVibration) { + if (KDGameData.CurrentVibration.denialsLeft > 0 || KDGameData.CurrentVibration.denialsLeft == undefined) { + KDGameData.CurrentVibration.denyTimeLeft = KDGameData.CurrentVibration.denyTime; + if (KDGameData.CurrentVibration.denialsLeft > 0) KDGameData.CurrentVibration.denialsLeft -= 1; + } + } + if (denied && KinkyDungeonVibeLevel > 0) { + msg = "KinkyDungeonDeny"; + KinkyDungeonSetFlag("OrgDenied", KDGameData.PlaySelfTurns + 3); + KDChangeDistraction(data.auto ? "auto" : "player", "deny", "tryOrgasm", -KinkyDungeonStatDistraction); + KinkyDungeonSendEvent("deny", data); + } else { + msg = "KinkyDungeonEdge"; + KinkyDungeonSetFlag("OrgEdged", KDGameData.PlaySelfTurns + 3); + KinkyDungeonSendEvent("edge", data); + } + } + + if (data.playMsg) { + let msgIndex = Math.min(KinkyDungeonMaxOrgasmStage, KDGameData.OrgasmStage) + Math.floor(Math.random() * KinkyDungeonOrgasmStageVariation); + KinkyDungeonSendActionMessage(10, TextGet(msg + ("" + msgIndex)), "#FF5BE9", msgTime); + } + +} + +function KinkyDungeonIsChaste(Breast: boolean): boolean { + for (let inv of KinkyDungeonAllRestraintDynamic()) { + if ((!Breast && KDRestraint(inv.item).chastity) || (Breast && KDRestraint(inv.item).chastitybra)) return true; + } +} + +function KinkyDungeonChastityMult(): number { + let chaste = 0.0; + for (let inv of KinkyDungeonAllRestraintDynamic()) { + if (KDRestraint(inv.item).chastity) chaste += 1; + else if (KDRestraint(inv.item).chastitybra) chaste += 0.2; + } + return chaste; +} + +/** + * @param buffs + * @param type + */ +function KDBuffResist(buffs: any, type: string): number { + if (KDDamageEquivalencies[type]) type = KDDamageEquivalencies[type]; + return KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(buffs, type + "DamageResist")) + * (KinkyDungeonMeleeDamageTypes.includes(type) ? + KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(buffs, "meleeDamageResist")) + : KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(buffs, "magicDamageResist"))); +} + +/** + * @param player + */ +function KDIsEdged(_player: entity): boolean { + return KDGameData.OrgasmTurns > KinkyDungeonOrgasmTurnsCrave && !(KDGameData.OrgasmStamina > 0); +} + + +function KDForcedToGround() { + return (KinkyDungeonPlayerTags.get("ForceKneel") || KinkyDungeonPlayerTags.get("ForceHogtie") || KinkyDungeonPlayerTags.get("Hogties")); +} +function KDBalanceDmgMult() { + let mult = KinkyDungeonStatsChoice.get("PoorBalance") ? 1.5 : 1; + return mult * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BalanceDamageMult")); +} +function KDFitnessMult(_player?: any): number { + let mult = 0.5/KinkyDungeonStatWillMax + 0.5/KinkyDungeonStatStaminaMax; + return mult * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "FitnessMult")); +} +function KDMentalMult(_player: entity) { + let mult = 0.5/KinkyDungeonStatDistractionMax + 0.5/KinkyDungeonStatManaMax; + return mult * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "MentalMult")); +} +function KDEnduranceMult(_player: entity) { + let mult = 0.5/KinkyDungeonStatWillMax + 0.5/KinkyDungeonStatDistractionMax; + return mult * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "EnduranceMult")); +} +function KDReflexMult(_player: entity) { + let mult = 0.5/KinkyDungeonStatStaminaMax + 0.5/KinkyDungeonStatDistractionMax; + return mult * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ReflexMult")); +} +function KDPowerMult(_player: entity) { + let mult = 0.5/KinkyDungeonStatWillMax + 0.5/KinkyDungeonStatManaMax; + return mult * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "PowerMult")); +} + +/** + * @param player + */ +function KDIsBlindfolded(_player: entity): boolean { + return (KinkyDungeonPlayerTags.get("Blindfolds") || KinkyDungeonPlayerTags.get("Masks") || KinkyDungeonPlayerTags.get("Hoods") || KinkyDungeonPlayerTags.get("BlockEyes")); +} + + +/** + * @param player + */ +function KDCanHack(_player: entity): boolean { + return (KinkyDungeonPlayerTags.get("Cyberjack")); +} diff --git a/Game/src/player/KinkyDungeonVibe.ts b/Game/src/player/KinkyDungeonVibe.ts new file mode 100644 index 000000000..ab18414b9 --- /dev/null +++ b/Game/src/player/KinkyDungeonVibe.ts @@ -0,0 +1,549 @@ +"use strict"; + + +/* +KinkyDungeonPlayerVibratedLocationItemNipplesPiercings,Nipples +KinkyDungeonPlayerVibratedLocationItemNipples,Nipples +KinkyDungeonPlayerVibratedLocationItemBreast,Breasts +KinkyDungeonPlayerVibratedLocationItemPelvis,Panties +KinkyDungeonPlayerVibratedLocationItemVulvaPiercings,Piercing +KinkyDungeonPlayerVibratedLocationItemVulva,Front +KinkyDungeonPlayerVibratedLocationItemButt,Rear +KinkyDungeonPlayerVibratedLocationItemBoots,Feet*/ + +let KDVibeSounds = { + "ItemVulva": {sound: "", Audio: null, update: false}, + "ItemButt": {sound: "", Audio: null, update: false}, + "ItemNipples": {sound: "", Audio: null, update: false, vol: 0.5}, +}; + +let KDVibeSoundRedirect = { + "ItemVulva": "ItemVulva", + "ItemVulvaPiercings": "ItemNipples", // TODO add softer piercings sound + "ItemButt": "ItemButt", + "ItemNipplesPiercings": "ItemNipples", + "ItemNipples": "ItemNipples", + "ItemPelvis": "ItemNipples", + "ItemBreast": "ItemNipples", // TODO add massager sound + "ItemBoots": "ItemNipples", // TODO add foot tickler sound +}; + +let KDVibeSound = { + "ItemVulva": "Vibe1", + //"ItemVulvaPiercings": "ItemNipples", // TODO add softer piercings sound + "ItemButt": "Vibe2", + //"ItemNipplesPiercings": "ItemNipples", + "ItemNipples": "Vibe3", + //"ItemBreast": "ItemNipples", // TODO add massager sound + //"ItemBoots": "ItemNipples", // TODO add foot tickler sound +}; + + +let KDResolutionConfirm = false; +let KDResolution = 2; +let KDResolutionList = [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0]; +let KDResolutionListIndex = KDResolutionList.length-1; + +let KDVibeVolume = 1; +let KDVibeVolumeListIndex = 0; +let KDVibeVolumeList = [1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]; + +let KDMusicVolumeMult = 0.25; // Global mult +let KDMusicVolume = 1; +let KDMusicVolumeListIndex = 0; +let KDMusicVolumeList = [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 0, 0.1, 0.2]; + +let KDSfxVolume = 1; +let KDSfxVolumeListIndex = 0; +let KDSfxVolumeList = [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 0, 0.1, 0.2]; + +let KDAnimSpeed = 1; +let KDAnimSpeedListIndex = 0; +let KDAnimSpeedList = [1, 1.25, 1.5, 2.0, 0, 0.25, 0.5, 0.75,]; + +let KDGamma = 1; +let KDGammaListIndex = 0; +let KDGammaList = [1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, .6, .7, .8, .9]; + +let KDWToolsToggleScrollModes = ["Layer Bonus", "Rotation", "Scale"]; +let KDWToolsToggleScrollMode = "Layer Bonus"; +let KDWToolsToggleScrollModeIndex = 0; +let KDWToolsLayerAbbrModes = ["Short", "Full"]; +let KDWToolsLayerAbbrMode = "Short"; +let KDWToolsLayerAbbrModeIndex = 0; + +function KDStopAllVibeSounds(Exceptions?: string[]) { + let EE = []; + if (Exceptions) + for (let e of Exceptions) { + EE.push(KDVibeSoundRedirect[e] ? KDVibeSoundRedirect[e] : e); + } + for (let loc of Object.entries(KDVibeSounds)) { + if (!Exceptions || !EE.includes(loc[0])) { + if (!loc[1].update) { + let audio = loc[1]; + if (audio.sound) audio.sound = ""; + if (audio.Audio) { + audio.Audio.pause(); + audio.Audio.currentTime = 0; + } + loc[1].update = true; + } + } + } +} + +function KDUpdateVibeSound(Location: string, Sound: string, Volume: number) { + let prev = ""; + if (KDVibeSounds[Location]) { + prev = KDVibeSounds[Location].sound; + } + if (KDVibeSounds[Location]) + KDVibeSounds[Location].sound = Sound; + else return; + + if (prev != Sound) { + if (prev && KDVibeSounds[Location].Audio && !KDVibeSounds[Location].update) { + // Stop the previous sound + KDVibeSounds[Location].Audio.pause(); + KDVibeSounds[Location].Audio.currentTime = 0; + //KDVibeSounds[Location].update = true; + } + if (Sound && !KDVibeSounds[Location].update) { + // Start the new sound + let audio = new Audio(); + let vol = (Volume != undefined ? Volume : 1.0); + if (KDVibeSounds[Location].vol) vol *= KDVibeSounds[Location].vol; + KDVibeSounds[Location].Audio = audio; + KDVibeSounds[Location].update = true; + if (KDPatched) { + audio.crossOrigin = "Anonymous"; + audio.src = Sound; + } else + audio.src = KDModFiles[Sound] || Sound; + audio.volume = Math.min(vol, 1); + audio.loop = true; + audio.play(); + } + } + if (!Sound && KDVibeSounds[Location].Audio && !KDVibeSounds[Location].update) { + // Stop the previous sound + KDVibeSounds[Location].Audio.pause(); + KDVibeSounds[Location].Audio.currentTime = 0; + KDVibeSounds[Location].update = true; + } + if (Volume != undefined && KDVibeSounds[Location] && KDVibeSounds[Location].Audio) { + KDVibeSounds[Location].Audio.volume = Math.min(Volume * (KDVibeSounds[Location].vol ? KDVibeSounds[Location].vol : 1.0), 1); + } +} + +function KDUpdateVibeSounds() { + for (let v of Object.entries(KDVibeSounds)) { + v[1].update = false; + } + let vibe = KDGameData.CurrentVibration; + let sound = KDGameData.CurrentVibration?.sound || "Vibe1"; + if (vibe && KinkyDungeonState == "Game" && KDSoundEnabled()) { + let globalVolume = KDToggles.VibeSounds ? KDVibeVolume * (KinkyDungeonDrawState == "Game" ? 1 : 0.5) : 0; + let locations = KDSumVibeLocations(); + KDStopAllVibeSounds(locations); + + let vibeModSoundWeight = 0; + + if (vibe.VibeModifiers) { + for (let mod of vibe.VibeModifiers) { + if (mod.intensityMod > vibeModSoundWeight || mod.intensitySetpoint > vibeModSoundWeight) { + vibeModSoundWeight = Math.max(mod.intensityMod, mod.intensitySetpoint); + sound = mod.sound || "Vibe1"; + } + } + } + + for (let location of locations) { + let power = "Weak"; + if (vibe.location && vibe.location.includes(location)) { + if (vibe.intensity >= 3) power = "Strong"; + else if (vibe.intensity >= 2) power = "Medium"; + } else if (vibe.VibeModifiers) { + for (let mod of vibe.VibeModifiers) { + if (mod.location == location) { + if (mod.intensityMod >= 3 || mod.intensitySetpoint >= 3) power = "Strong"; + else if (mod.intensityMod >= 2 || mod.intensitySetpoint >= 2) power = "Medium"; + } + } + } + if (KinkyDungeonVibeLevel <= 0) { + power = "Off"; + } + if (power != "Off") { + if (vibe.location.length > 0 && vibe.location[0] == location) { + //let finalSound = sound;//(KDVibeSoundRedirect[location] && KDVibeSound[KDVibeSoundRedirect[location]]) ? KDVibeSound[KDVibeSoundRedirect[location]] : "Vibe1"; + KDUpdateVibeSound(KDVibeSoundRedirect[location] ? KDVibeSoundRedirect[location] : "ItemVulva", KinkyDungeonRootDirectory + `Audio/${sound}_${power}.ogg`, globalVolume); + } + } else + KDUpdateVibeSound(KDVibeSoundRedirect[location] ? KDVibeSoundRedirect[location] : "ItemVulva", "", globalVolume); + } + + } else { + KDStopAllVibeSounds(); + } +} + +function KDSumVibeLocations(): string[] { + if (KDGameData.CurrentVibration) { + let groups: string[] = []; + for (let g of KDGameData.CurrentVibration.location) { + groups.push(g); + } + for (let mod of KDGameData.CurrentVibration.VibeModifiers) { + if (!groups.includes(mod.location)) + groups.push(mod.location); + } + return groups; + } + return []; +} + +/** + * Gets a list of the groups that should be vibrating here. It is the item's group, plus any 'linked' vibrators + * @param item + */ +function KDGetVibeLocation(item: item): string[] { + let restraint = KDRestraint(item); + let groups = [restraint.vibeLocation ? restraint.vibeLocation : restraint.Group]; + if (restraint.linkedVibeTags) { + for (let tag of restraint.linkedVibeTags) { + for (let inv of KinkyDungeonAllRestraintDynamic()) { + let res = KDRestraint(inv.item); + if (res.linkedVibeTags && res.linkedVibeTags.includes(tag) && !groups.includes(res.vibeLocation ? res.vibeLocation : res.Group)) { + groups.push(res.vibeLocation ? res.vibeLocation : res.Group); + } + } + } + } + + return groups; +} + +function KDRandomizeVibeSound() { + let data = { + lastVibeSound: KDGameData.CurrentVibration?.sound || "Vibe1", + currentVibeSound: "Vibe" + Math.ceil(KDRandom() * 3), + }; + KinkyDungeonSendEvent("vibeSound", data); + return data.currentVibeSound; +} + + +/** + * Starts a vibration, overriding + * @param source + * @param name + * @param locations + * @param intensity + * @param duration + * @param [numLoops] + * @param [denyTime ] + * @param [denialsLeft ] + * @param [edgeTime ] + * @param [edgeOnly ] + * @param [alwaysDeny ] + * @param [denialChance ] + * @param [denialChanceLikely ] + * @param [tickEdgeAtMaxArousal ] + * @param [vibeMods ] + */ +function KinkyDungeonStartVibration ( + source: string, + name: string, + locations: string[], + intensity: number, + duration: number, + numLoops?: number, + denyTime?: number, + denialsLeft?: number, + edgeTime?: number, + edgeOnly?: boolean, + alwaysDeny?: boolean, + denialChance?: number, + denialChanceLikely?: number, + tickEdgeAtMaxArousal?: boolean, + vibeMods?: VibeMod[] +) +{ + if (KDGameData.CurrentVibration) { + KinkyDungeonSetFlag("VibeContinued", 3); + if (!KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonStartVibeContinue"), "#FFaadd", 2)) KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonStartVibeContinue"), "#FFaadd", 2, true, true); + } else { + KinkyDungeonSetFlag("VibeStarted", 8); + } + KDGameData.CurrentVibration = { + sound: KDRandomizeVibeSound(), + source: source, + name: name, + location: locations, + intensity: intensity, + duration: duration, + durationLeft: duration, + loopsLeft: numLoops, + denyTime: denyTime, + denyTimeLeft: 0, + edgeTime: edgeTime, + edgeTimeLeft: edgeTime, + edgeOnly: edgeOnly, + alwaysDeny: alwaysDeny, + tickEdgeAtMaxArousal: tickEdgeAtMaxArousal, + denialChance: denialChance, + denialChanceLikely: denialChanceLikely, + denialsLeft: denialsLeft, + VibeModifiers: vibeMods ? vibeMods : [], + }; + + if (!KDGameData.TimeSinceLastVibeStart) KDGameData.TimeSinceLastVibeStart = {}; + KDGameData.TimeSinceLastVibeStart[name] = 0; +} + +/** + * @param cooldown + */ +function KDIsVibeCD(cooldown: Record): boolean { + if (!KDGameData.TimeSinceLastVibeStart) KDGameData.TimeSinceLastVibeStart = {}; + if (!KDGameData.TimeSinceLastVibeEnd) KDGameData.TimeSinceLastVibeEnd = {}; + let pass = true; + for (let cd of Object.entries(cooldown)) { + if (KDGameData.TimeSinceLastVibeStart[cd[0]] && KDGameData.TimeSinceLastVibeStart[cd[0]] < cd[1] && KDGameData.TimeSinceLastVibeEnd[cd[0]] && KDGameData.TimeSinceLastVibeEnd[cd[0]] < cd[1]) { + pass = false; + break; + } + } + return pass; +} + +/** + * @param source + * @param name + * @param location + * @param intensityMod + * @param [duration] + * @param [intensitySetpoint] + * @param [edgeOnly] + * @param [forceDeny] + * @param [bypassDeny] + * @param [bypassEdge] + * @param [extendDuration] + * @param [denyChanceMod] + * @param [denyChanceLikelyMod] + */ +function KinkyDungeonAddVibeModifier ( + source: string, + name: string, + location: string, + intensityMod: number, + duration?: number, + intensitySetpoint?: number, + edgeOnly?: boolean, + forceDeny?: boolean, + bypassDeny?: boolean, + bypassEdge?: boolean, + extendDuration?: boolean, + denyChanceMod?: number, + denyChanceLikelyMod?: number +) +{ + if (KDGameData.CurrentVibration) { + for (let mod of KDGameData.CurrentVibration.VibeModifiers) { + if (mod.name == name && mod.source == source) { + KDGameData.CurrentVibration.VibeModifiers.splice(KDGameData.CurrentVibration.VibeModifiers.indexOf(mod)); + break; + } + } + KDGameData.CurrentVibration.VibeModifiers.push({ + source: source, + sound: KDRandomizeVibeSound(), + name: name, + location: location, + intensityMod: intensityMod, + duration: duration, + durationLeft: duration, + + intensitySetpoint: intensitySetpoint, + edgeOnly: edgeOnly, + forceDeny: forceDeny, + bypassDeny: bypassDeny, + bypassEdge: bypassEdge, + extendDuration: extendDuration, + denyChanceMod: denyChanceMod, + denyChanceLikelyMod: denyChanceLikelyMod, + }); + } +} + +/* + * Gets the average deny chance of restraints + */ +function KinkyDungeonGetDenyChance(chance: number): number { + if (!KDGameData.CurrentVibration) return 0; + let data = { + denyChance: KDGameData.CurrentVibration.denialChance ? KDGameData.CurrentVibration.denialChance : 0.0, + denyChanceLikelyMod: 0, + orgasmChance: chance, + }; + if (chance > 0) { + if (KDGameData.CurrentVibration.denialChanceLikely) data.denyChance = KDGameData.CurrentVibration.denialChanceLikely; + } + let forceDeny = false; + if (KDGameData.CurrentVibration.VibeModifiers) { + for (let mod of KDGameData.CurrentVibration.VibeModifiers) { + if (chance > 0 && mod.denyChanceLikelyMod) data.denyChanceLikelyMod += mod.denyChanceMod; + else if (mod.denyChanceMod) data.denyChance += mod.denyChanceMod; + if (mod.forceDeny) forceDeny = true; + } + } + + if (!forceDeny && KDGameData.CurrentVibration.denialsLeft != undefined && KDGameData.CurrentVibration.denialsLeft <= 0) { + data.denyChance = 0; + } + KinkyDungeonSendEvent("getDenyChance", data); + return data.denyChance; +} + +function KinkyDungeonVibratorsDeny(chance: number): boolean { + let data = {toDeny: false}; + let allowDeny = KDRandom() < KinkyDungeonGetDenyChance(chance); + if (allowDeny) { + data.toDeny = true; + KinkyDungeonSendEvent("getDeny", data); + } + return data.toDeny; +} + +function KinkyDungeonCalculateVibeLevel(delta: number) { + let oldVibe = KinkyDungeonVibeLevel; + KinkyDungeonVibeLevel = 0; + KinkyDungeonOrgasmVibeLevel = 0; + KinkyDungeonStatPlugLevel = 0; + KinkyDungeonPlugCount = 0; + let sumplug = 0; + for (let item of KinkyDungeonAllRestraintDynamic()) { + if (item && KDRestraint(item.item)) { + if (KDRestraint(item.item).plugSize) { + let size = KDRestraint(item.item).plugSize; + sumplug += size/2; + KinkyDungeonStatPlugLevel = Math.max(KinkyDungeonStatPlugLevel, size); + KinkyDungeonPlugCount += 1; + } + } + } + sumplug += KinkyDungeonStatPlugLevel/2; + if (sumplug > KinkyDungeonStatPlugLevel) KinkyDungeonStatPlugLevel = sumplug; + + KDGameData.Edged = false; + let cease = true; + + if (KDGameData.CurrentVibration) { + + for (let r of KinkyDungeonAllRestraintDynamic()) { + if (KDGameData.CurrentVibration.source == r.item.name) { + cease = false; + break; + } + } + + if (cease) { + if (!KDGameData.TimeSinceLastVibeEnd) KDGameData.TimeSinceLastVibeEnd = {}; + KDGameData.TimeSinceLastVibeEnd[KDGameData.CurrentVibration.name] = 0; + KDGameData.CurrentVibration = null; + } + } + + if (KDGameData.CurrentVibration) { + let vibration = KDGameData.CurrentVibration; + + if (vibration.durationLeft > 0) { + let edge = false; + let bypassDeny = false; + let bypassEdge = false; + let extendDuration = false; + KinkyDungeonVibeLevel = vibration.intensity; + + if (vibration.VibeModifiers) { + let intensityMod = 0; + let intensityModMax = 0; + let intensityModMin = 0; + for (let mod of vibration.VibeModifiers) { + if (mod.durationLeft > 0) { + mod.durationLeft -= delta; + if (mod.edgeOnly) { + edge = true; + } + if (mod.bypassDeny) { + bypassDeny = true; + } + if (mod.bypassEdge) { + bypassEdge = true; + } + if (mod.extendDuration) { + extendDuration = true; + } + if (mod.intensityMod > intensityModMax) intensityModMax = mod.intensityMod; + if (mod.intensityMod < intensityModMin) intensityModMin = mod.intensityMod; + intensityMod += mod.intensityMod; + } else { + vibration.VibeModifiers.splice(vibration.VibeModifiers.indexOf(mod)); + } + } + if (intensityMod > intensityModMax) intensityMod = intensityModMax; + if (intensityMod < intensityModMin) intensityMod = intensityModMin; + if (intensityMod) { + KinkyDungeonVibeLevel = Math.max(1, KinkyDungeonVibeLevel + intensityMod); + } + } + + if (!extendDuration) + vibration.durationLeft -= delta; + if (vibration.denyTimeLeft > 0) { + vibration.denyTimeLeft -= delta; + if (!bypassDeny) { + KinkyDungeonVibeLevel = 0; + } + } else if (vibration.edgeTimeLeft > 0 && (!vibration.tickEdgeAtMaxArousal || KinkyDungeonStatDistraction >= KinkyDungeonStatDistractionMax * 0.99)) { + vibration.edgeTimeLeft -= delta; + edge = true; + } + + if (edge && !bypassEdge) { + KDGameData.Edged = true; + } else { + KinkyDungeonOrgasmVibeLevel = Math.max(KinkyDungeonOrgasmVibeLevel || 0, vibration.intensity); + } + } else { + KinkyDungeonEndVibration(); + } + } + + if (oldVibe > 0 && KinkyDungeonVibeLevel == 0) { + if (cease) if (!KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonEndVibeCease"), "#FFaadd", 2)) KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonEndVibeCease"), "#FFaadd", 2, true, true); + if (!KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonEndVibe"), "#FFaadd", 2)) KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonEndVibe"), "#FFaadd", 2, true, true); + } else if (oldVibe == 0 && KinkyDungeonVibeLevel > 0) { + if (!KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonStartVibe"), "#FFaadd", 2)) KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonStartVibe"), "#FFaadd", 2, true, true); + } +} + +function KinkyDungeonEndVibration() { + if (KDGameData.CurrentVibration) { + let vibe = KDGameData.CurrentVibration; + + if (vibe.loopsLeft > 0) { + vibe.loopsLeft -= 1; + vibe.durationLeft = vibe.duration; + } else { + if (!KDGameData.TimeSinceLastVibeEnd) KDGameData.TimeSinceLastVibeEnd = {}; + KDGameData.TimeSinceLastVibeEnd[KDGameData.CurrentVibration.name] = 0; + KDGameData.CurrentVibration = null; + } + } +} + +function KinkyDungeonCanOrgasm() { + return !KDGameData.Edged || KinkyDungeonChastityMult() < 0.9; +} diff --git a/Game/src/prison/KDPrison.ts b/Game/src/prison/KDPrison.ts new file mode 100644 index 000000000..3b7502b55 --- /dev/null +++ b/Game/src/prison/KDPrison.ts @@ -0,0 +1,268 @@ +'use strict'; + +/** + * @param x + * @param y + */ +function KDGetNearestFactionGuard(x: number, y: number): entity { + let condition = (en: entity) => { + return (KDEnemyHasFlag(en, "mapguard") + || ( + KDGetFaction(en) == KDGetMainFaction() + && en.Enemy?.tags.jailer + )) && !KDHelpless(en) && !KinkyDungeonIsDisabled(en); + }; + + if (KinkyDungeonJailGuard()?.aware && condition(KinkyDungeonJailGuard())) return KinkyDungeonJailGuard(); + + let dist = KDMapData.GridWidth*KDMapData.GridWidth + KDMapData.GridHeight*KDMapData.GridHeight; + let cand = null; + let dd = dist; + let entities = KDNearbyEnemies(x, y, 10).filter((en) => {return condition(en);}); + if (entities.length == 0) entities = KDMapData.Entities; + for (let en of entities) { + if (condition(en)) { + dd = KDistEuclidean(x-en.x, y-en.y); + if (dd < dist) { + dist = dd; + cand = en; + } + } + } + return cand || KinkyDungeonJailGuard(); +} + +/** + * @param player + */ +function KDPrisonCommonGuard(player: entity, _call: boolean = false, suppressCall: boolean = true): entity { + // Suppress standard guard call behavior + KinkyDungeonSetFlag("SuppressGuardCall", 10); + let guard = KDGetNearestFactionGuard(player.x, player.y); + if (guard) + KDGameData.JailGuard = guard.id; + + return KinkyDungeonJailGuard(); +} + + +/** + * Gets the groups and restraints to add based on a set of jail tags + * @param player + * @param jailLists + * @param lock + * @param maxPower + */ +function KDPrisonGetGroups(_player: entity, jailLists: string[], lock: string, maxPower: number): KDJailGetGroupsReturn { + let groupsToStrip: string[] = []; + let itemsToApply: {item: string; variant: string}[] = []; + let itemsApplied = {}; + let itemsToKeep: Record = {}; + let itemsToStrip: Record = {}; + + // First populate the items + let jailList = KDGetJailRestraints(jailLists, false, false); + + // Next we go over the prison groups and figure out if there is anything in that group + for (let prisonGroup of KDPRISONGROUPS) { + let strip = false; + for (let g of prisonGroup) { + let restraints = KinkyDungeonGetJailRestraintsForGroup(g, jailList, false, lock); + let restraints2 = KinkyDungeonGetJailRestraintsForGroup(g, jailList, true, lock, true, true); + if (restraints2.length > 0) { + for (let r of restraints2) { + itemsToKeep[r.restraint.name] = true; + } + let restraintStack = KDDynamicLinkList(KinkyDungeonGetRestraintItem(g), true); + if (restraintStack.length > 0) { + for (let r of restraintStack) { + if (KinkyDungeonRestraintPower(r, true) < maxPower) { + strip = true; + itemsToStrip[r?.id] = true; + } + } + } + } + if (restraints.length > 0) { + restraints.sort( + (a, b) => { + return b.def.Level - a.def.Level; + } + ); + for (let r of restraints) { + if (!itemsApplied[r.restraint.name + "--" + r.variant]) { + itemsApplied[r.restraint.name + "--" + r.variant] = true; + itemsToApply.push({item: r.restraint.name, variant: r.variant}); + } + } + } + } + // Add the whole prison group if there is one item to apply + if (strip) { + groupsToStrip.push(...prisonGroup); + } + } + + return { + groupsToStrip: groupsToStrip, + itemsToApply: itemsToApply, + itemsToKeep: itemsToKeep, + itemsToStrip: itemsToStrip, + }; +} + +/** + * Throttles prison checks + * @param player + */ +function KDPrisonTick(_player: entity): boolean { + if (!KinkyDungeonFlags.get("prisonCheck")) { + KinkyDungeonSetFlag("prisonCheck", 3 + Math.floor(KDRandom() * 3)); + return true; + } + return false; +} + +/** + * @param player + */ +function KDPrisonIsInFurniture(player: entity): boolean { + if (KinkyDungeonPlayerTags.get("Furniture")) { + let tile = KinkyDungeonTilesGet(player.x + "," + player.y); + if (tile?.Furniture) { + return true; + } + } + return false; +} + +/** + * @param player + * @param state + */ +function KDGoToSubState(_player: entity, state: string): string { + KDMapData.PrisonStateStack.unshift(KDMapData.PrisonState); + return state; +} + +/** + * @param player + */ +function KDPopSubstate(_player: entity): string { + let state = KDMapData.PrisonStateStack[0]; + if (state) { + KDMapData.PrisonStateStack.splice(0, 1); + return state; + } + return KDPrisonTypes[KDMapData.PrisonType]?.default_state || ""; +} + + +/** + * Resets the prison state stack + * @param player + * @param state + */ +function KDSetPrisonState(_player: entity, state: string): string { + if (KDMapData.PrisonStateStack?.length > 0) { + for (let s of KDMapData.PrisonStateStack) { + if (KDPrisonTypes[KDMapData.PrisonType].states[s].finally) KDPrisonTypes[KDMapData.PrisonType].states[s].finally(0, state, true); + } + } + + KDMapData.PrisonStateStack = []; + return state; +} + +/** + * @param player + */ +function KDCurrentPrisonState(_player: entity): string { + return KDMapData.PrisonState; +} + + +function KDDoUniformRemove(player: entity, guard: entity, jailGroups: string[], lockType: string, power: number) { + let uniformCheck = KDPrisonGetGroups(player, undefined, lockType, power); + if (uniformCheck.groupsToStrip.length == 0) { + return KDPopSubstate(player); + } + // if we have a future crate we use its own features + if (KinkyDungeonPlayerTags.get("SpecialDress")) + KinkyDungeonSetFlag("specialDressRemove", 2); + else { + let succeedAny = false; + for (let grp of uniformCheck.groupsToStrip) { + if (succeedAny) break; + let rr = KinkyDungeonGetRestraintItem(grp); + if (rr) { + let restraintStack = KDDynamicLinkList(rr, true); + if (restraintStack.length > 0) { + let succeed = false; + for (let r of restraintStack) { + if (!uniformCheck.itemsToKeep[KDRestraint(r)?.name] && KinkyDungeonRestraintPower(r, true) < power) { + succeed = KinkyDungeonRemoveRestraintSpecific(r, false, false, false).length > 0; + if (succeed) { + let msg = TextGet("KinkyDungeonRemoveRestraints") + .replace("EnemyName", TextGet("Name" + guard.Enemy.name)); + //let msg = TextGet("Attack" + guard.Enemy.name + "RemoveRestraints"); + if (r) msg = msg.replace("OldRestraintName", KDGetItemName(r)); + KinkyDungeonSendTextMessage(5, msg, "yellow", 1); + break; + } + } + } + + // If we only fail... + if (!succeed) { + // nothing yet + } else { + succeedAny = true; + break; + } + } + } + } + + // If we REALLY only fail... + if (!succeedAny) { + KinkyDungeonSetFlag("failStrip", 100); + return KDPopSubstate(player); + } + } + // Stay in the current state + return KDCurrentPrisonState(player); +} + +function KDDoUniformApply(player: entity, guard: entity, jailGroups: string[], lockType: string, power: number) { + // Add one per turn + let uniformCheck = KDPrisonGetGroups(player, jailGroups, lockType, power); + if (uniformCheck.itemsToApply.length == 0) { + return KDPopSubstate(player); + } + // if we have a future crate we use its own features + if (KinkyDungeonPlayerTags.get("SpecialDress")) + KinkyDungeonSetFlag("specialDressAdd", 2); + else { + let restraint = uniformCheck.itemsToApply[0]; + if (restraint) { + if (KinkyDungeonAddRestraintIfWeaker( + KinkyDungeonGetRestraintByName(restraint.item), + 2, KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, + lockType, false, false, undefined, KDGetMainFaction(), + KinkyDungeonStatsChoice.has("TightRestraints") ? true : undefined, + undefined, KinkyDungeonJailGuard(), + false, undefined, undefined, undefined, + restraint.variant ? KDApplyVariants[restraint.variant] : undefined, + )) { + let msg = TextGet("KinkyDungeonAddRestraints") + .replace("EnemyName", TextGet("Name" + guard.Enemy.name)); + //let msg = TextGet("Attack" + guard.Enemy.name + "RemoveRestraints"); + msg = msg.replace("NewRestraintName", KDGetItemNameString(restraint.item)); + KinkyDungeonSendTextMessage(9, msg, "yellow", 1); + } + } + } + // Stay in the current state + return KDCurrentPrisonState(player); +} \ No newline at end of file diff --git a/Game/src/prison/KDPrisonList.ts b/Game/src/prison/KDPrisonList.ts new file mode 100644 index 000000000..a465300b2 --- /dev/null +++ b/Game/src/prison/KDPrisonList.ts @@ -0,0 +1,185 @@ +'use strict'; + +let KDCYBERPOWER = 19; +let KDJAILPOWER = 12; +let KDPRISONGROUPS = [ + [ + "ItemHead", + "ItemEars", + ], + [ + "ItemMouth", + ], + [ + "ItemNeck", + ], + [ + "ItemArms", + "ItemHands", + ], + [ + "ItemTorso", + "ItemBreast", + "ItemPelvis", + ], + [ + "ItemNipples", + "ItemVulva", + "ItemButt", + "ItemVulvaPiercings", + ], + [ + "ItemLegs", + "ItemFeet", + "ItemBoots", + ], + [ + "ItemDevices", + ], +]; + +/** + */ +let KDPrisonTypes: Record = { + Summit: { + name: "Summit", + default_state: "BusinessAsUsual", + starting_state: "BusinessAsUsual", + update: (delta) => { + KinkyDungeonSetFlag("noPlay", 12); + let player = KDPlayer(); + + if (player.x == 18 && player.y == 20 && KinkyDungeonGetRestraintItem("ItemDevices")) { + if (KDRandom() < 0.2 && !KinkyDungeonEntityAt(18, 21)) { + KinkyDungeonSendTextMessage(10, TextGet("KDSummitSafeguard"), "#88ff88", 10); + KDMovePlayer(18, 21, false); + } + } + + // Escapees + for (let entity of KDMapData.Entities) { + if (!KDHelpless(entity) && !KDIsHopeless(entity) + && KDGameData.Collection[entity.id + ""]?.escaped) { + if (KDistChebyshev(entity.x - 11, entity.y - 21) > 0.5) { + entity.gx = 11; + entity.gy = 21; + entity.gxx = 11; + entity.gyy = 21; + } else { + // Despawn and remove from collection + KDNPCEscape(entity); + } + } + } + }, + states: { + BusinessAsUsual: {name: "BusinessAsUsual", + init: (params) => { + + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + return "BusinessAsUsual"; + }, + }, + Rebel: {name: "Rebel", + init: (params) => { + return ""; + }, + update: (delta) => { + return "BusinessAsUsual"; + }, + updateStack: (delta) => { + KinkyDungeonSetFlag("noPlay", 10); + }, + }, + + }, + }, +}; + +/** + * + * @param {entity} player + * @returns {boolean} + */ +function KDLostJailTrack(player) { + let label = KDMapData.Labels?.Training ? KDMapData.Labels.Training[0] : null; + let rad = 4; + if (label && KDistChebyshev(player.x - label.x, player.y - label.y) < rad) return "InTraining"; + if (KinkyDungeonPlayerTags.get("Furniture")) return "Furniture"; + if (!KinkyDungeonLeashingEnemy()) { + let unaware = true; + for (let en of KDMapData.Entities) { + if (en.aware && KDGetFaction(en) == "Enemy" && !(en.Enemy?.tags?.prisoner || en.Enemy?.tags?.formerprisoner) ) { + unaware = false; + } + } + if (unaware) { + // We dont do anything + return "Unaware"; + } + } + return ""; +} + +/** + * + * @param {entity} player + * @returns {boolean} + */ +function KDLostJailTrackCell(player) { + let label = KDMapData.Labels?.Training ? KDMapData.Labels.Training[0] : null; + let rad = 4; + if (label && KDistChebyshev(player.x - label.x, player.y - label.y) < rad) return "InTraining"; + if (KinkyDungeonInJail(KDJailFilters)) return "InCell"; + if (KinkyDungeonPlayerTags.get("Furniture")) return "Furniture"; + if (!KinkyDungeonLeashingEnemy()) { + let unaware = true; + for (let en of KDMapData.Entities) { + if (en.aware && KDGetFaction(en) == "Enemy" && !(en.Enemy?.tags?.prisoner || en.Enemy?.tags?.formerprisoner) ) { + unaware = false; + } + } + if (unaware) { + // We dont do anything + return "Unaware"; + } + } + return ""; +} + + + + +function KDGetJailEnemy() { + // Jail tag + let jt = KDMapData.JailFaction?.length > 0 + ? KinkyDungeonFactionJailTag[ + KDMapData.JailFaction[Math.floor(KDRandom() * KDMapData.JailFaction.length)] + ] : "jailer"; + let Enemy = KinkyDungeonGetEnemy(["jailGuard", jt], + KDGetEffLevel(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + '0', [jt, "jailer"], undefined, undefined, + ["gagged"]); + if (!Enemy) { + jt = KDMapData.JailFaction?.length > 0 + ? KinkyDungeonFactionTag[ + KDMapData.JailFaction[Math.floor(KDRandom() * KDMapData.JailFaction.length)] + ] : "jailer"; + Enemy = KinkyDungeonGetEnemy(["jailGuard", jt], + KDGetEffLevel(), + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + '0', [jt, "jailer"], undefined, undefined, + ["gagged"]); + if (!Enemy) { + jt = "genericJailer"; + Enemy = KinkyDungeonGetEnemy(["jailGuard", jt], + KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + '0', [jt, "jailer"]); + } + } + return Enemy; +} \ No newline at end of file diff --git a/Game/src/prison/KinkyDungeonJail.ts b/Game/src/prison/KinkyDungeonJail.ts new file mode 100644 index 000000000..c15e2c700 --- /dev/null +++ b/Game/src/prison/KinkyDungeonJail.ts @@ -0,0 +1,2467 @@ +"use strict"; + +/** Affects security level based on owning faction */ +let KDMainFactionSecurityMod = 35; + +/** Time spent in cage before guards start getting teleported */ +let KDMaxCageTime = 100; + +/** max keys on the map at once **/ +let KDMaxKeys = 2; + +/** Only these have jail events */ +let KDJailFilters = ['jail']; + +function KDAssignGuardAction(guard: entity, xx: number, yy: number): void { + let eventWeightTotal = 0; + let eventWeights = []; + + for (let event of Object.values(KDGuardActions)) { + eventWeights.push({event: event, weight: eventWeightTotal}); + eventWeightTotal += event.weight(guard, xx, yy); + } + + let selection = KDRandom() * eventWeightTotal; + + for (let L = eventWeights.length - 1; L >= 0; L--) { + if (selection > eventWeights[L].weight) { + eventWeights[L].event.assign(guard, xx, yy); + return; + } + } +} + +function KDGetJailEvent(guard: entity, xx: number, yy: number): (g: entity, x: number, y: number) => void { + let eventWeightTotal = 0; + let eventWeights = []; + + for (let event of Object.values(KDJailEvents)) { + eventWeights.push({event: event, weight: eventWeightTotal}); + eventWeightTotal += event.weight(guard, xx, yy); + } + + let selection = KDRandom() * eventWeightTotal; + + for (let L = eventWeights.length - 1; L >= 0; L--) { + if (selection > eventWeights[L].weight) { + return eventWeights[L].event.trigger; + } + } + return (_g, _x, _y) => {}; +} + + +function KinkyDungeonLoseJailKeys(Taken?: boolean, boss?: boolean, enemy?: entity): void { + // KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail' || KDGameData.PrisonerState == 'chase' + if (KinkyDungeonFlags.has("BossUnlocked")) return; + if (KDMapData.KeysHeld > 0) { + if (Taken) { + KinkyDungeonSendActionMessage(7, TextGet("KinkyDungeonRemoveJailKey"), "#ff5277", 3); + if (enemy) { + if (!enemy.items) enemy.items = []; + if (!enemy.items.includes("Keyring")) + enemy.items.push("Keyring"); + } + } + KDMapData.KeysHeld--; + } + if (boss) { + KDMapData.KeysHeld--; + KDMapData.GroundItems = KDMapData.GroundItems.filter((item) => {return item.name != "Keyring";}); + } +} + +function KinkyDungeonUpdateJailKeys() { + if (KDMapData.EscapeMethod != "Key") return; + if (KDMapData.KeysHeld < 3) { + let altRoom = KinkyDungeonAltFloor(KDGameData.RoomType); + if ((!altRoom || !altRoom.nokeys) && (!KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel) || !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel).nokeys)) { + KinkyDungeonPlaceJailKeys(); + } + } +} + +function KinkyDungeonAggroFaction(faction: string, noAllyRepPenalty?: boolean, securityPenalty: number = 0): boolean { + if (faction == "Player") return false; + let list = []; + let list2 = []; + for (let enemy of KDMapData.Entities) { + if (enemy.Enemy.tags.peaceful) continue; + let enemyfaction = KDGetFaction(enemy); + if (enemyfaction == "Player") continue; + if ((enemyfaction == faction || KDFactionRelation(enemyfaction, faction) > 0.4)) { + let dist = KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y); + if (KinkyDungeonCheckLOS(enemy, KinkyDungeonPlayerEntity, dist, enemy.Enemy.visionRadius, false, true)) { + list.push(enemy); + } + } else if (enemyfaction == "Player" && KDGetFactionOriginal(enemy) == faction) { + let dist = KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y); + if (KinkyDungeonCheckLOS(enemy, KinkyDungeonPlayerEntity, dist, enemy.Enemy.visionRadius, false, true)) { + list2.push(enemy); + } + } + } + if (faction) { + let amount = 0.04; + if (list.length > 0) { + for (let e of list) { + if (!KDAllied(e)) { + KDMakeHostile(e); + } + } + + KinkyDungeonChangeFactionRep(faction, -amount); + return true; + } else if (list2.length > 0 && !noAllyRepPenalty) { + KinkyDungeonChangeFactionRep(faction, -amount); + return false; + } else if (securityPenalty) KinkyDungeonChangeRep("Prisoner", securityPenalty); + } + + return false; +} + +function KinkyDungeonPlayerIsVisibleToJailers() { + let list = []; + for (let enemy of KDMapData.Entities) { + if (KDHostile(enemy) && !(enemy.rage > 0) && (enemy.Enemy.tags.leashing || enemy.Enemy.tags.jail || enemy.Enemy.tags.jailer || KDGetEnemyPlayLine(enemy))) { + if (KinkyDungeonTrackSneak(enemy, 0, KinkyDungeonPlayerEntity) > 0.9 && KinkyDungeonCheckLOS( + enemy, + KinkyDungeonPlayerEntity, + KDistChebyshev(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y), + enemy.Enemy.visionRadius, + false, + true, + 1)) { + list.push(enemy); + } + } + } + if (list.length > 0) return list[Math.floor(Math.random() * list.length)]; + return null; +} + +/** + * @param playChance + * @param enemy + */ +function KDCalcPlayChance(playChance: number, enemy: entity): number { + // Reduce chance of play in combat + if (KinkyDungeonFlags.get("PlayerCombat")) playChance *= 0.2; + if (!KinkyDungeonFlags.get("wander")) playChance *= 0.75; + if (enemy.path?.length > 2) playChance *= 0.1; + if (KDGameData.otherPlaying > 0) playChance *= Math.max(0.05, 1 - 0.35 * KDGameData.otherPlaying); + + if (KinkyDungeonFlags.get("playLikely")) playChance += 0.5; + + if (KDEnemyHasFlag(enemy, "Shop") || KDEnemyHasFlag(enemy, "HelpMe")) playChance = 0; + + if (KinkyDungeonStatsChoice.get("Undeniable")) { + if (playChance < 0.1) playChance = 0.1; + else playChance = 0.9; + } + + if (KinkyDungeonFlags.get("noPlay") || KDEnemyHasFlag(enemy, "noPlay")) playChance = 0; + + return playChance; +} + +/** + * @param enemy + */ +function KinkyDungeonCanPlay(enemy: entity): boolean { + + return (KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail' || (!KDHostile(enemy) + && !(KDAllied(enemy) && !KDEnemyHasFlag(enemy, "allyPlay")))) + && (enemy.ambushtrigger || !KDAIType[KDGetAI(enemy)] || !KDAIType[KDGetAI(enemy)].ambush) + && !enemy.Enemy.Behavior?.noPlay + && enemy.hp > 0.52; +} + +function KinkyDungeonCheckRelease() { + if (KDMapData.JailFaction?.length > 0 && KDFactionRelation("Jail", KDMapData.JailFaction[0]) < -0.15) return -1; + if (KDGameData.RoomType) { + let altRoom = KinkyDungeonAltFloor(KDGameData.RoomType); + if (altRoom && altRoom.noRelease) return altRoom.releaseOnLowSec ? (KDGetEffSecurityLevel() >= KDSecurityLevelHiSec ? -1 : 1) : -1; + } + let sub = KinkyDungeonGoddessRep.Ghost + 50; + let security = KDGetEffSecurityLevel() + 50; + if (sub == undefined || isNaN(sub)) sub = 0; + if (security == undefined || isNaN(security)) security = 0; + let turns = KDGameData.JailTurns - security; + for (let i = 0; i < KDJailReleaseTurns.length; i++) { + let condition = KDJailReleaseTurns[i]; + if (sub >= condition.minSub && turns >= condition.releaseTurns) return i; + } + return -1; +} + +/** Max turns for the alert timer until the whole map becomes hostile */ +let KDMaxAlertTimer = 14; +let KDMaxAlertTimerAggro = 300; + +/** + * @param action + * @param data + */ +function KinkyDungeonAggroAction(action: string, data: {enemy?: entity, x?: number, y?: number, faction?: string, force?: boolean}): void { + if (data?.faction == "Player") return; + let e = null; + switch (action) { + // Attacking ALWAYS makes the enemy angry + case 'attack': + KinkyDungeonStartChase(data.enemy, "Attack"); + break; + + // Magic ALWAYS makes the enemy angry + case 'magic': + e = KinkyDungeonPlayerIsVisibleToJailers(); + if (e) { + KinkyDungeonStartChase(e, "Spell"); + } + break; + // Magic ALWAYS makes the enemy angry + case 'item': + e = KinkyDungeonPlayerIsVisibleToJailers(); + if (e) { + KinkyDungeonStartChase(e, "SpellItem"); + } + break; + + // Having a guard called ALWAYS makes the enemy angry + case 'call': + KinkyDungeonStartChase(data.enemy, ""); + break; + + // Chests ALWAYS make the enemy angry + case 'chest': + e = KinkyDungeonPlayerIsVisibleToJailers(); + if (e) { + KinkyDungeonStartChase(e, "Chest"); + } + if (data.faction) { + KinkyDungeonAggroFaction(data.faction, false, KDChestSecurity(data)); + + } + break; + + // Chests ALWAYS make the enemy angry + case 'rubble': + e = KinkyDungeonPlayerIsVisibleToJailers(); + if (e) { + KinkyDungeonPlayExcuse(e, "Loot"); + } + break; + + // Altars ALWAYS make the enemy angry + case 'shrine': + e = KinkyDungeonPlayerIsVisibleToJailers(); + if (e) { + KinkyDungeonStartChase(e, "Shrine"); + } + break; + + // Chests ALWAYS make the enemy angry + case 'orb': + e = KinkyDungeonPlayerIsVisibleToJailers(); + if (e) { + KinkyDungeonStartChase(e, "Orb"); + } + break; + + case 'struggle': + if (data.enemy) // KDGameData.PrisonerState == "parole" && + KinkyDungeonPlayExcuse(data.enemy, "Struggle"); + break; + + case 'unrestrained': + if (KDGameData.PrisonerState == "parole" && data.enemy) + KinkyDungeonPlayExcuse(data.enemy, "Free"); + break; + + // Roaming free only makes them angry if you are a prisoner + case 'jailbreak': + if (KDGameData.PrisonerState == "jail" || data.force){ + KinkyDungeonStartChase(data.enemy, "Jailbreak"); + } + break; + + // Roaming free only makes them angry if you are a prisoner + case 'key': + e = KinkyDungeonPlayerIsVisibleToJailers(); + if (e) { + KinkyDungeonPlayExcuse(e, "Key"); + } + break; + } +} + +let KDLocalChaseTypes: string[] = ["Refusal", "Attack", "Spell", "SpellItem", "Shrine", "Orb", "Chest"]; +let KDSevereTypes: string[] = ["Attack"]; + +let KDMaxGuiltPerAggro = 200; +let KDGuiltMult = 0.1; + +/** + * @param enemy + * @param Type + * @param [faction] + * @param [force] + */ +function KinkyDungeonStartChase(enemy: entity, Type: string, faction?: string, force?: boolean) { + if (!force && enemy && (!enemy.aware && !(enemy.vp > 0.5))) return; + if (KDGetFaction(enemy) == "Player") return; + if ((!enemy && !KDLocalChaseTypes.includes(Type))) { + if (KDGameData.PrisonerState == 'jail' || KDGameData.PrisonerState == 'parole') { + + let GuiltAmount = Math.max(0, + Math.min(KDGameData.Guilt || 0, KDMaxGuiltPerAggro)); + let repMult = 0.25; + if (KinkyDungeonFlags.has("PlayerCombat") + || (KinkyDungeonPlayerDamage && !isUnarmed(KinkyDungeonPlayerDamage))) + repMult = 1; + GuiltAmount *= repMult; + + if (KinkyDungeonFlags.has("PlayerCombat")) + KinkyDungeonChangeRep("Ghost", -5 * repMult - GuiltAmount*KDGuiltMult); + KinkyDungeonChangeRep("Prisoner", 10 * repMult + GuiltAmount*KDGuiltMult); + + KDGameData.Guilt = Math.max(0, (KDGameData.Guilt || 0) - GuiltAmount); + KDGameData.PrisonerState = "chase"; + KinkyDungeonInterruptSleep(); + } + if (KDGameData.PrisonerState == 'jail' || KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'chase') + KDGameData.PrisonerState = "chase"; + } else if (KDLocalChaseTypes.includes(Type) && (enemy || faction)) { + for (let e of KDMapData.Entities) { + let cansignal = KDEnemyCanSignalOthers(enemy); + if ((KDHostile(e, undefined) + || (KDSevereTypes.includes(Type) + && (e == enemy + || (KDFactionAllied(faction ? faction : KDGetFaction(enemy), + e, undefined, + -KDOpinionRepMod(e, KDPlayer())) // We lower the strength of faction alliances based on opinion + && KDGetHonor( + KDGetFaction(e), + faction ? faction : KDGetFaction(enemy)) < 0.1)))) + && (!enemy || !enemy.Enemy.tags.peaceful) + && (e == enemy || KinkyDungeonCheckLOS(e, KinkyDungeonPlayerEntity, 7, 8, false, false))) { + if (!enemy || e == enemy || cansignal) { + if (!(e.hostile > 0) && + (e.Enemy.tags.jail || e.Enemy.tags.jailer || KDGetEnemyPlayLine(e))) { + let h = KDGetFaction(e) == (faction ? faction : KDGetFaction(enemy)) ? "Defend" : "DefendHonor"; + let suff = KDGetEnemyPlayLine(e) ? KDGetEnemyPlayLine(e) + h : h; + let index = ("" + Math.floor(Math.random() * 3)); + + if (!e.dialogue || !e.dialogueDuration) + KinkyDungeonSendDialogue(e, TextGet("KinkyDungeonRemindJailChase" + suff + index).replace("EnemyName", TextGet("Name" + e.Enemy.name)), KDGetColor(e), 7, (!KDGameData.PrisonerState) ? 3 : 5); + } + if (!e.hostile) e.hostile = KDMaxAlertTimerAggro; + else KDMakeHostile(e);//e.hostile = Math.max(KDMaxAlertTimerAggro, e.hostile); + e.ceasefire = undefined; + } + } + } + } + + if (enemy && KDFactionRelation(KDGetFaction(enemy), "Jail") > -0.1 && !enemy.Enemy.tags.peaceful) { + if (!enemy.hostile) KDMakeHostile(enemy);//enemy.hostile = KDMaxAlertTimerAggro; + else KDMakeHostile(enemy);//Math.max(KDMaxAlertTimerAggro, enemy.hostile); + enemy.ceasefire = undefined; + } + if (Type && enemy?.hostile && (enemy.Enemy.tags.jail || enemy.Enemy.tags.jailer || KDGetEnemyPlayLine(enemy))) { + let suff = KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) + Type : Type; + let index = (Type == "Attack" || Type == "Spell") ? ("" + Math.floor(Math.random() * 3)) : ""; + + if (!enemy.dialogue || !enemy.dialogueDuration) + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailChase" + suff + index).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, (!KDGameData.PrisonerState) ? 3 : 5); + } +} + +/** + * @param enemy + * @param Type + */ +function KinkyDungeonPlayExcuse(enemy: entity, Type: string): void { + if (Type == "Free" && enemy && enemy.Enemy.noChaseUnrestrained) { + return; + } + let playChance = KDCalcPlayChance(1.0, enemy); + if (KinkyDungeonCanPlay(enemy) && !(enemy.playWithPlayer > 0) && enemy.aware && !(enemy.playWithPlayerCD > 0) && (enemy.Enemy.tags.jail || enemy.Enemy.tags.jailer || KDGetEnemyPlayLine(enemy)) && KDRandom() < playChance) { + enemy.playWithPlayer = 17; + KinkyDungeonSetEnemyFlag(enemy, "playstart", 3); + if (Type == "Key") { + enemy.playWithPlayer = 30; + enemy.playWithPlayerCD = enemy.playWithPlayer; + } + KDSetPlayCD(enemy, 2.5); + let suff = KDGetEnemyPlayLine(enemy) ? KDGetEnemyPlayLine(enemy) + Type : Type; + KinkyDungeonSendDialogue(enemy, TextGet("KinkyDungeonRemindJailPlay" + suff).replace("EnemyName", TextGet("Name" + enemy.Enemy.name)), KDGetColor(enemy), 4, 4); + } +} + +/** + * @param enemy + * @param mult + * @param base + */ +function KDSetPlayCD(enemy: entity, mult: number, base: number = 10): void { + enemy.playWithPlayerCD = Math.max(enemy.playWithPlayerCD || 0, base * mult + (enemy.playWithPlayer || 0) * mult); +} + +/** + * @param Group + * @param [jailRestraintList] + * @param [lock] + */ +function KinkyDungeonGetJailRestraintForGroup(Group: string, jailRestraintList?: KDJailRestraint[], lock?: string): {restraint: restraint, variant: string} { + if (!jailRestraintList) { + jailRestraintList = KDGetJailRestraints(); + } + + /** + */ + let cand: restraint = null; + let variant = ""; + let candLevel = 0; + let currentItem = KinkyDungeonGetRestraintItem(Group); + // Try first with ones that are linkable + if (currentItem) { + // Go for priority candidates first + for (let r of jailRestraintList) { + let level = 0; + if (KDGetEffSecurityLevel()) level = Math.max(0, KDGetEffSecurityLevel() + 50); + if (!r.Level || level >= r.Level) { + let candidate = KinkyDungeonGetRestraintByName(r.Name); + if (candidate.Group == Group && (!candidate.nonbinding || cand == null)) { + if ((candLevel == 0 || r.Level > candLevel) && (KDJailCondition(r)) && KDPriorityCondition(r)) { + if (KinkyDungeonLinkableAndStricter(KDRestraint(currentItem), candidate, undefined, lock)) { + cand = candidate; + variant = r.Variant; + candLevel = candidate.nonbinding ? 0 : r.Level; + } + + } + } + } + } + if (!cand) { + for (let r of jailRestraintList) { + let level = 0; + if (KDGetEffSecurityLevel()) level = Math.max(0, KDGetEffSecurityLevel() + 50); + if (!r.Level || level >= r.Level) { + let candidate = KinkyDungeonGetRestraintByName(r.Name); + if (candidate.Group == Group && (!candidate.nonbinding || cand == null)) { + if ((candLevel == 0 || r.Level > candLevel) && (KDJailCondition(r))) { + if (KinkyDungeonLinkableAndStricter(KDRestraint(currentItem), candidate, undefined, lock)) { + cand = candidate; + variant = r.Variant; + candLevel = candidate.nonbinding ? 0 : r.Level; + } + + } + } + } + } + } + } + // Otherwise go for the regular candidate + if (!cand) { + for (let r of jailRestraintList) { + let level = 0; + if (KDGetEffSecurityLevel()) level = Math.max(0, KDGetEffSecurityLevel() + 50); + if (!r.Level || level >= r.Level) { + let candidate = KinkyDungeonGetRestraintByName(r.Name); + if (candidate.Group == Group && (!candidate.nonbinding || cand == null)) { + + if ((candLevel == 0 || r.Level > candLevel) && KDIsEligible(KDRestraint({name: r.Name})) && (KDJailCondition(r)) && KDPriorityCondition(r)) { + cand = candidate; + variant = r.Variant; + candLevel = candidate.nonbinding ? 0 : r.Level; + } + } + } + } + if (!cand) + for (let r of jailRestraintList) { + let level = 0; + if (KDGetEffSecurityLevel()) level = Math.max(0, KDGetEffSecurityLevel() + 50); + if (!r.Level || level >= r.Level) { + let candidate = KinkyDungeonGetRestraintByName(r.Name); + if (candidate.Group == Group && (!candidate.nonbinding || cand == null)) { + if ((candLevel == 0 || r.Level > candLevel) && KDIsEligible(KDRestraint({name: r.Name})) && (KDJailCondition(r))) { + cand = candidate; + variant = r.Variant; + candLevel = candidate.nonbinding ? 0 : r.Level; + } + } + } + } + } + return {restraint: cand, variant: variant}; +} + + +/** + * @param Group + * @param [jailRestraintList] + * @param [agnostic] - Dont care about whether it can be put on or not + * @param [lock] + * @param [ignoreLevel] + * @param [ignoreWarn] + */ +function KinkyDungeonGetJailRestraintsForGroup(Group: string, jailRestraintList?: KDJailRestraint[], agnostic: boolean = false, lock?: string, ignoreLevel: boolean = false, _ignoreWorn: boolean = false): {restraint: restraint, variant: string, def: KDJailRestraint}[] { + if (!jailRestraintList) { + jailRestraintList = KDGetJailRestraints(); + } + + let cands: {restraint: restraint, variant: string, def: KDJailRestraint}[] = []; + for (let pri of [true, false]) { + for (let r of jailRestraintList) { + let level = 0; + if (ignoreLevel) level = 1000; + else if (KDGetEffSecurityLevel()) level = Math.max(0, KDGetEffSecurityLevel() + 50); + if (!r.Level || level >= r.Level) { + let candidate = KinkyDungeonGetRestraintByName(r.Name); + if (candidate.Group == Group) { + if ( + (KDJailCondition(r) && (!pri || KDPriorityCondition(r))) + && (agnostic || + KDCanAddRestraint(KinkyDungeonGetRestraintByName(r.Name), + KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, + lock, + !KinkyDungeonStatsChoice.has("TightRestraints") ? true : undefined, + undefined, + KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, + KinkyDungeonJailGuard(), false, undefined, undefined, + (r.Variant && KDApplyVariants[r.Variant]?.powerBonus) ? KDApplyVariants[r.Variant].powerBonus : 0) + ) + ) { + cands.push({restraint: candidate, variant: r.Variant, def: r}); + } + } + } + } + } + + return cands; +} + +/** + * @param r + */ +function KDJailCondition(r: KDJailRestraint): boolean { + if (r.Condition && KDJailConditions[r.Condition]) { + return KDJailConditions[r.Condition](r); + } + return true; +} + +/** + * @param r + */ +function KDPriorityCondition(r: KDJailRestraint): boolean { + if (r.Priority && KDJailConditions[r.Priority]) { + return KDJailConditions[r.Priority](r); + } + return false; +} + + +function KinkyDungeonGetJailRestraintLevelFor(Name: string): number { + for (let r of KDGetJailRestraints()) { + if (r.Name === Name) { + return r.Level; + } + } + return -1; +} + +/** + * @param [filter] - Have to be in a jail, not a dropoff + */ +function KinkyDungeonInJail(filter: string[]): boolean { + return KinkyDungeonPlayerInCell(false, false, filter);//KDGameData.KinkyDungeonSpawnJailers > 0 && KDGameData.KinkyDungeonSpawnJailers + 1 >= KDGameData.KinkyDungeonSpawnJailersMax; +} + + +function KinkyDungeonPlaceJailKeys() { + let jailKeyList = []; + + // Populate the key + for (let X = 1; X < KDMapData.GridWidth; X += 1) + for (let Y = 1; Y < KDMapData.GridHeight; Y += 1) + if (KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(X, Y)) + && KDMapData.RandomPathablePoints[(X) + ',' + (Y)] + && KDistChebyshev(X - KinkyDungeonPlayerEntity.x, Y - KinkyDungeonPlayerEntity.y) > 15 + && KDistChebyshev(X - KDMapData.EndPosition.x, Y - KDMapData.EndPosition.y) > 15 + && (!KinkyDungeonTilesGet(X + "," + Y) || !KinkyDungeonTilesGet(X + "," + Y).OL)) + jailKeyList.push({x:X, y:Y}); + + let keyCount = Math.max(0, KDMaxKeys - KDMapData.GroundItems.filter((item) => {return item.name == "Keyring";}).length); + let placed = 0; + let i = 0; + + while (jailKeyList.length > 0 && placed < keyCount) { + let N = Math.floor(KDRandom()*jailKeyList.length); + let slot = jailKeyList[N]; + if (KDGameData.KeyringLocations && i < KDGameData.KeyringLocations.length) { + slot = KDGameData.KeyringLocations[Math.floor(KDRandom() * KDGameData.KeyringLocations.length)]; + i++; + } + if ( + !KDMapData.GroundItems.some((item) => {return item.name == "Keyring" && KDistChebyshev(item.x - slot.x, item.y - slot.y) < KDMapData.GridHeight / 3;})) { + KDMapData.GroundItems.push({x:slot.x, y:slot.y, name: "Keyring"}); + placed += 1; + } + jailKeyList.splice(N, 1); + } +} + +function KinkyDungeonHandleJailSpawns(delta: number, useExistingGuard: boolean = false): void { + if (KDGameData.JailTurns) KDGameData.JailTurns += delta; + else KDGameData.JailTurns = 1; + if (KinkyDungeonInJail(KDJailFilters)) KDGameData.JailRemoveRestraintsTimer += delta; + + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, ["jail"]); + + if (!nearestJail) return; + + let xx = nearestJail.x + KinkyDungeonJailLeashX; + let yy = nearestJail.y; + let playerInCell = (Math.abs(KinkyDungeonPlayerEntity.x - nearestJail.x) < KinkyDungeonJailLeashX - 1 && Math.abs(KinkyDungeonPlayerEntity.y - nearestJail.y) <= KinkyDungeonJailLeash); + + // This is an important piece to make it so guards don't clog up the jail space + for (let enemy of KDMapData.Entities) { + if (enemy.gxx == xx && enemy.gyy == yy && enemy != KinkyDungeonJailGuard()) { + enemy.AI = KDGetAIOverride(enemy, "hunt") || "hunt"; + } + } + + // Start jail event, like spawning a guard, spawning rescues, etc + if (KinkyDungeonInJail(KDJailFilters) + && KDGameData.PrisonerState == "jail" + && (KDGameData.GuardSpawnTimer <= 1) + && ((KDGameData.GuardTimer == 0 && useExistingGuard) || !KinkyDungeonJailGuard()) + && playerInCell) { + KDGetJailEvent(KinkyDungeonJailGuard(), xx, yy)(KinkyDungeonJailGuard(), xx, yy); + } else if (KDGameData.GuardSpawnTimer > 0 && KDGameData.SleepTurns < 1 && !KinkyDungeonAngel()) KDGameData.GuardSpawnTimer -= delta; + + // Assign and handle the current jail action if there is a guard + if (KinkyDungeonJailGuard() && KDGameData.GuardTimer > 0 && KDGameData.GuardTimerMax - KDGameData.GuardTimer > 6 && KDGameData.PrisonerState == 'jail') { + if (KDGuardActions[KinkyDungeonJailGuard().CurrentAction] + && KDGuardActions[KinkyDungeonJailGuard().CurrentAction].assignable + && KDGuardActions[KinkyDungeonJailGuard().CurrentAction].assignable(KinkyDungeonJailGuard(), xx, yy)) { + KDAssignGuardAction(KinkyDungeonJailGuard(), xx, yy); + } + } + + if (KinkyDungeonJailGuard() && !KinkyDungeonJailGuard().IntentAction && !KinkyDungeonJailGuard().action) { + if (KDGuardActions[KinkyDungeonJailGuard().CurrentAction] && KDGuardActions[KinkyDungeonJailGuard().CurrentAction].handle) { + KDGuardActions[KinkyDungeonJailGuard().CurrentAction].handle(KinkyDungeonJailGuard(), xx, yy, delta); + } + + // Return guard to wandering if the jail is over + if (KDGameData.PrisonerState != 'jail') { + KinkyDungeonJailGuard().CurrentAction = "jailWander"; + } + + if (KinkyDungeonJailGuard().temporary) { + KinkyDungeonJailGuard().gxx = KDGameData.PrisonerState == 'jail' && KDGameData.GuardTimer > 0 ? KinkyDungeonJailGuard().gx : xx; + KinkyDungeonJailGuard().gyy = KDGameData.PrisonerState == 'jail' && KDGameData.GuardTimer > 0 ? KinkyDungeonJailGuard().gy : yy; + } + if (KDGameData.GuardTimer > 0 && KinkyDungeonJailGuard()) { + // Decrease timer when not on a tour + if (!KinkyDungeonFlags.has("notickguardtimer") && !KinkyDungeonAngel()) { + KDGameData.GuardTimer -= delta; + if (KDGameData.GuardTimer <= 0) { + KinkyDungeonJailGuard().gx = xx; + KinkyDungeonJailGuard().gy = yy; + } + } + } else { + + // Leave the cell and lock the door + // Despawn jailer if not using existing + if (KinkyDungeonJailGuard() + && ((KinkyDungeonJailGuard().x == xx + && KinkyDungeonJailGuard().y == yy) || !KinkyDungeonJailGuard().temporary) + && (!KinkyDungeonJailGuard().IntentAction || KinkyDungeonJailGuard().IntentAction.startsWith('jail')) + && KDGameData.PrisonerState + && !KinkyDungeonJailGuard().hostile + && !KinkyDungeonFlags.has("notickguardtimer") + && !KinkyDungeonFlags.has("nojailbreak")) { + + let g = KinkyDungeonJailGuard(); + g.CurrentAction = undefined; + + if (g.temporary) { + console.log("Despawned guard"); + KDClearItems(g); + KDRemoveEntity(KinkyDungeonJailGuard()); + let doorOff = 1; + //KDSpliceIndex(KDMapData.Entities.indexOf(KinkyDungeonJailGuard()), 1); + // Close the door + if (KinkyDungeonTilesGet((xx-doorOff) + "," + yy) && 'dD'.includes(KinkyDungeonMapGet(xx-doorOff, yy))) { + KinkyDungeonMapSet(xx-doorOff, yy, 'D'); + if (KDGameData.PrisonerState == 'jail') { + KinkyDungeonTilesGet((xx-doorOff) + "," + yy).Type = "Door"; + KinkyDungeonTilesGet((xx-doorOff) + "," + yy).Lock = KinkyDungeonGenerateLock(true, KDGetEffLevel(), false, "Door", {x: (xx-doorOff), y: yy, tile: KinkyDungeonTilesGet((xx-doorOff) + "," + yy)}); + } + if (KDGameData.PrisonerState == 'jail' && KinkyDungeonVisionGet(g.x, g.y)) + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonGuardDisappear").replace("EnemyName", TextGet("Name" + g.Enemy.name)), "#ff5277", 6); + + } + } else { + // She is no longer the guard + KDGameData.JailGuard = 0; + } + + } else if (!KinkyDungeonJailGuard().IntentAction || KinkyDungeonJailGuard().IntentAction.startsWith('jail')) { + if (!KinkyDungeonFlags.has("notickguardtimer") + && !KinkyDungeonFlags.has("nojailbreak")) { + if (KinkyDungeonJailGuard()?.temporary) { + + // Return so that they can despawn + KinkyDungeonJailGuard().gx = xx; + KinkyDungeonJailGuard().gy = yy; + } + } + } + } + } else { + if (KDGameData.GuardTimer > 0) { + KDGameData.GuardTimer -= delta; + } + } + + // Unlock all jail doors when chasing + if (!KDGameData.PrisonerState || KDGameData.PrisonerState == 'chase') { + for (let T of Object.values(KDMapData.Tiles)) { + if (T.Lock && T.Type == "Door" && T.Jail) { + T.OGLock = T.Lock; + //T.LockSeen = T.Lock; + T.Lock = undefined; + } + } + } + + if (!KinkyDungeonJailGuard()) { + KDGameData.GuardTimer = 0; + if (KinkyDungeonLeashingEnemy()?.Enemy?.tags?.jailer || KinkyDungeonLeashingEnemy()?.Enemy?.tags?.jail) { + if (KinkyDungeonLeashingEnemy().CurrentAction) + KDGameData.JailGuard = KinkyDungeonLeashingEnemy().id; + } + if (!KinkyDungeonJailGuard()) { + // In case enemy got interrupted + for (let en of KDMapData.Entities) { + if (!KDHelpless(en) && en.CurrentAction) { + KDGameData.JailGuard = en.id; + } + } + } + } else { + if (KDHelpless(KinkyDungeonJailGuard())) { + KDGameData.JailGuard = 0; + } + if (KinkyDungeonJailGuard() && KDistChebyshev(KinkyDungeonJailGuard().x - KinkyDungeonPlayerEntity.x, KinkyDungeonJailGuard().y - KinkyDungeonPlayerEntity.y) > 10 && KDGameData.GuardTimer < 4) { + KDGameData.JailGuard = 0; + } + } + if (!KDMapData.Entities.includes(KinkyDungeonJailGuard())) { + if (KDGameData.GuardSpawnTimer == 0 || KinkyDungeonJailGuard()) + KDGameData.GuardSpawnTimer = 14 + Math.floor(KDRandom() * (KDGameData.GuardSpawnTimerMax - KDGameData.GuardSpawnTimerMin)); + KDGameData.JailGuard = 0; + } + if (KDGameData.GuardSpawnTimerMax == undefined) { + // Fix the save file + + KDGameData.JailGuard = 0; + KDGameData.GuardSpawnTimer = 0; + KDGameData.GuardSpawnTimerMax = 125; + KDGameData.GuardSpawnTimerMin = 75; + KDGameData.GuardTimer = 0; + KDGameData.GuardTimerMax = 55; + } +} + +function KinkyDungeonLockableItems() { + let LockableGroups = []; + for (let g of KinkyDungeonStruggleGroupsBase) { + let currentItem = KinkyDungeonGetRestraintItem(g); + if (currentItem && !currentItem.lock && KinkyDungeonIsLockable(KDRestraint(currentItem))) { + LockableGroups.push(g); + } + } + return LockableGroups; +} + +function KinkyDungeonMissingJailUniform() { + let MissingGroups = []; + for (let g of KinkyDungeonStruggleGroupsBase) { + + let jrest = KinkyDungeonGetJailRestraintForGroup(g); + let rest = jrest.restraint; + let currentItem = KinkyDungeonGetRestraintItem(g); + if (rest + && (!currentItem || ( + KDCanAddRestraint(rest, + KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, + undefined, + !KinkyDungeonStatsChoice.has("TightRestraints") ? true : undefined, + undefined, + KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, KinkyDungeonJailGuard(), false, undefined, undefined, (jrest.variant && KDApplyVariants[jrest.variant]?.powerBonus) ? KDApplyVariants[jrest.variant].powerBonus : 0) + && (!currentItem.dynamicLink || !KDDynamicLinkList(currentItem, true).some((item) => {return rest.name == item.name;}))) + ) + && (KinkyDungeonStatsChoice.get("arousalMode") || !rest.arousalMode) + && (!KinkyDungeonStatsChoice.get("arousalModePlugNoFront") || !(rest.shrine.includes("Plugs") && rest.Group == "ItemVulva")) + && (KinkyDungeonStatsChoice.get("arousalModePlug") || rest.Group != "ItemButt") + && (KinkyDungeonStatsChoice.get("arousalModePiercing") || !rest.piercing)) { + MissingGroups.push(g); + } + } + return MissingGroups; +} + +function KinkyDungeonTooMuchRestraint() { + let Groups = ["ItemArms", "ItemHands", "ItemHead", "ItemMouth", "ItemMouth2", "ItemMouth3", "ItemHood", "ItemLegs", "ItemFeet", "ItemHands"]; + + for (let g of KinkyDungeonStruggleGroupsBase) { + let rest = KinkyDungeonGetJailRestraintForGroup(g); + if (rest && !Groups.includes(g)) Groups.push(g); + } + let allowedRestraints = {}; + KDGetJailRestraints().forEach((rest) => { + allowedRestraints[rest.Name] = true; + }); + let RemoveGroups = []; + for (let g of Groups) { + let jrest = KinkyDungeonGetJailRestraintForGroup(g); + let rest = jrest.restraint; + let currentItem = KinkyDungeonGetRestraintItem(g); + let cutoffpower = KinkyDungeonStatsChoice.get("KinkyPrison") ? -50 : 4; + let lockMult = currentItem ? Math.max(1, KinkyDungeonGetLockMult(currentItem.lock, currentItem) - 0.5) : (currentItem && KinkyDungeonIsLockable(KDRestraint(currentItem)) ? 0.4 : 1); + if ( + ((!rest && currentItem && KinkyDungeonRestraintPower(currentItem, false) + 0.01 <= Math.max(cutoffpower + 0.1, rest ? rest.power : cutoffpower)) // There shouldnt be one here + || (rest && currentItem && currentItem && rest.name != currentItem.name && !allowedRestraints[currentItem.name] + && (KinkyDungeonRestraintPower(currentItem, false) + 0.01 < rest.power || KDRestraint(currentItem).power * lockMult <= Math.max(cutoffpower + 0.1, rest ? rest.power : cutoffpower)))) // Wrong item equipped + ) { + if (!currentItem || (!currentItem.curse && !KDRestraint(currentItem).curse && !KDRestraint(currentItem).enchanted)) + RemoveGroups.push(g); + } + } + return RemoveGroups; +} + +/** + * @param player + * @param enemy + * @param point + */ +function KDPutInJail(player: entity, enemy: entity, point: { x: number, y: number }): boolean { + let entity = enemy ? enemy : player; + let nearestJail = KinkyDungeonNearestJailPoint(entity.x, entity.y); + let jailRadius = (nearestJail && nearestJail.radius) ? nearestJail.radius : 1.5; + let playerInCell = nearestJail ? (Math.abs(player.x - nearestJail.x) < jailRadius - 1 && Math.abs(player.y - nearestJail.y) <= jailRadius) + : null; + if (!playerInCell) { + //let point = {x: nearestJail.x, y: nearestJail.y};//KinkyDungeonGetNearbyPoint(nearestJail.x, nearestJail.y, true, undefined, true); + if (!point) point = KinkyDungeonNearestJailPoint((enemy || player).x, (enemy || player).y, ["jail"]); + if (point) { + KDBreakTether(player); + if (player.player) { + KDMovePlayer(point.x, point.y, false); + if (KinkyDungeonPlayerInCell(true)) + KinkyDungeonChangeRep("Ghost", 1 + KDGameData.KinkyDungeonPrisonExtraGhostRep); + KDGameData.KinkyDungeonPrisonExtraGhostRep = 0; + return true; + } else { + KDMoveEntity(player, point.x, point.y, false); + return true; + } + } + return false; + } + return false; +} + +/** + * @param xx + * @param yy + * @param type + */ +function KinkyDungeonHandleLeashTour(xx: number, yy: number, type: string): void { + let player = KDPlayer(); + // Remove the leash when we are done + if (KDIsPlayerTetheredToEntity(KDPlayer(), KinkyDungeonJailGuard()) && !KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints) { + + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y); + if (KDistChebyshev(KinkyDungeonJailGuard().x - nearestJail.x, KinkyDungeonJailGuard().y - nearestJail.y) < 1.5) { + let leashItemToRemove = KinkyDungeonGetRestraintItem("ItemNeckRestraints"); + if (leashItemToRemove) { + KinkyDungeonRemoveRestraint("ItemNeckRestraints", false); + let msg = TextGet("KinkyDungeonRemoveRestraints").replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)); + msg = msg.replace("OldRestraintName", TextGet("Restraint"+leashItemToRemove.name)); + KinkyDungeonSendTextMessage(5, msg, "yellow", 1); + } + KDGameData.KinkyDungeonPrisonExtraGhostRep += 2; + + KDPutInJail(KinkyDungeonPlayerEntity, KinkyDungeonJailGuard(), null); + + if (KinkyDungeonJailGuard()?.KinkyDungeonJailTourInfractions < 1) { + let item = "CookieJailer"; + KinkyDungeonSendDialogue(KinkyDungeonJailGuard(), TextGet("KinkyDungeonJailerReleaseGoodGirl").replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)), "#e7cf1a", 4, 9); + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonJailerReleaseGoodGirlMsg") + .replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)) + .replace("ItemName", KDGetItemNameString(item)), + "#88ff88", 1); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable(item), 1); + } + + + let enemy = KinkyDungeonEnemyAt(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (enemy) enemy.x += 1; + KinkyDungeonJailGuard().CurrentAction = "jailWander"; + KDGameData.KinkyDungeonJailTourTimer = KDGameData.KinkyDungeonJailTourTimerMin + Math.floor((KDGameData.KinkyDungeonJailTourTimerMax - KDGameData.KinkyDungeonJailTourTimerMin) * KDRandom()); + KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().x; + KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().y; + } else { + KinkyDungeonJailGuard().gx = nearestJail.x; + KinkyDungeonJailGuard().gy = nearestJail.y; + } + + } else { + // Run the leash + let playerDist = KDistChebyshev(KinkyDungeonJailGuard().x - KinkyDungeonPlayerEntity.x, KinkyDungeonJailGuard().y - KinkyDungeonPlayerEntity.y);//Math.sqrt((KinkyDungeonJailGuard().x - KinkyDungeonPlayerEntity.x)*(KinkyDungeonJailGuard().x - KinkyDungeonPlayerEntity.x) + (KinkyDungeonJailGuard().y - KinkyDungeonPlayerEntity.y)*(KinkyDungeonJailGuard().y - KinkyDungeonPlayerEntity.y)); + let wearingLeash = KinkyDungeonIsWearingLeash(); + if (!wearingLeash) { + let touchesPlayer = KinkyDungeonCheckLOS(KinkyDungeonJailGuard(), KinkyDungeonPlayerEntity, playerDist, 1.5, false, false); + if (touchesPlayer) { + if (!KinkyDungeonPlayerTags.get("Collars")) { + let collar = KinkyDungeonGetRestraintByName("BasicCollar"); + KinkyDungeonAddRestraintIfWeaker(collar, KinkyDungeonJailGuard().Enemy.power, true, "", undefined, undefined, undefined, KDGetFaction(KinkyDungeonJailGuard()), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, KinkyDungeonJailGuard(), false); + let msg = TextGet("KinkyDungeonAddRestraints").replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)); + msg = msg.replace("NewRestraintName", TextGet("Restraint"+collar.name)); + KinkyDungeonSendTextMessage(5, msg, "yellow", 1); + if (type == "transfer") { + let guard = KinkyDungeonJailGuard(); + let nearestJail = KinkyDungeonRandomJailPoint(["jail"], [KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)]); + if (nearestJail) { + guard.NextJailLeashTourWaypointX = nearestJail.x; + guard.NextJailLeashTourWaypointY = nearestJail.y; + guard.gx = guard.NextJailLeashTourWaypointX; + guard.gy = guard.NextJailLeashTourWaypointY; + } + } else { + + KinkyDungeonJailGuard().NextJailLeashTourWaypointX = KinkyDungeonJailGuard().x; + KinkyDungeonJailGuard().NextJailLeashTourWaypointY = KinkyDungeonJailGuard().y; + } + KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().x; + KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().y; + } else { + let leash = KinkyDungeonGetRestraintByName("BasicLeash"); + KinkyDungeonAddRestraintIfWeaker(leash, KinkyDungeonJailGuard().Enemy.power, true, "", undefined, undefined, undefined, KDGetFaction(KinkyDungeonJailGuard()), KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, KinkyDungeonJailGuard(), false); + let msg = TextGet("KinkyDungeonAddRestraints").replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)); + msg = msg.replace("NewRestraintName", TextGet("Restraint"+leash.name)); + KinkyDungeonSendTextMessage(5, msg, "yellow", 1); + KinkyDungeonJailGuard().NextJailLeashTourWaypointX = KinkyDungeonJailGuard().x; + KinkyDungeonJailGuard().NextJailLeashTourWaypointY = KinkyDungeonJailGuard().y; + if (type == "transfer") { + let guard = KinkyDungeonJailGuard(); + let nearestJail = KinkyDungeonRandomJailPoint(["jail"], [KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)]); + if (nearestJail) { + guard.NextJailLeashTourWaypointX = nearestJail.x; + guard.NextJailLeashTourWaypointY = nearestJail.y; + guard.gx = guard.NextJailLeashTourWaypointX; + guard.gy = guard.NextJailLeashTourWaypointY; + } + } else { + + KinkyDungeonJailGuard().NextJailLeashTourWaypointX = KinkyDungeonJailGuard().x; + KinkyDungeonJailGuard().NextJailLeashTourWaypointY = KinkyDungeonJailGuard().y; + } + KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().x; + KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().y; + } + KinkyDungeonAttachTetherToEntity(2, KinkyDungeonJailGuard(), player); + } else { + KinkyDungeonJailGuard().gx = KinkyDungeonPlayerEntity.x; + KinkyDungeonJailGuard().gy = KinkyDungeonPlayerEntity.y; + } + } else if (!KDGetTetherLength(KinkyDungeonPlayerEntity)) { + KinkyDungeonJailGuard().gx = KinkyDungeonPlayerEntity.x; + KinkyDungeonJailGuard().gy = KinkyDungeonPlayerEntity.y; + if (playerDist < 1.5) { + KinkyDungeonAttachTetherToEntity(2, KinkyDungeonJailGuard(), player); + } + } else if (KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints > 0 + && (KDistChebyshev( + KinkyDungeonJailGuard().x - KinkyDungeonJailGuard().NextJailLeashTourWaypointX, + KinkyDungeonJailGuard().y - KinkyDungeonJailGuard().NextJailLeashTourWaypointY) < 2 + || (KDRandom() < 0.05 && KDistChebyshev( + KinkyDungeonJailGuard().x - KinkyDungeonJailGuard().NextJailLeashTourWaypointX, + KinkyDungeonJailGuard().y - KinkyDungeonJailGuard().NextJailLeashTourWaypointY) < 5) + || KDRandom() < 0.01)) { + KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints--; + if (KinkyDungeonJailGuard().NextJailLeashTourWaypointX > KinkyDungeonJailLeashX + 2) { + if (KinkyDungeonLastAction == "Move") { + if (KDRandom() < 0.5) { + let index = "0"; + if (KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions < 1) { + index = "" + Math.floor(KDRandom() * 6); + //KinkyDungeonChangeRep("Ghost", 8); + } + KinkyDungeonSendDialogue(KinkyDungeonJailGuard(), TextGet("KinkyDungeonJailerGoodGirl" + index).replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)), "#e7cf1a", 4, 9); + } + KDTickTraining("Heels", KDGameData.HeelPower > 0 && !(KDGameData.KneelTurns > 0), + KDGameData.HeelPower <= 0, 2, 20); + } + } + KinkyDungeonJailGuardGetLeashWaypoint(xx, yy, type); + } else { + let enemy = KinkyDungeonJailGuard(); + let pullDist = (KinkyDungeonLastAction == "Move" + && KDistEuclidean(KinkyDungeonPlayerEntity.x - enemy.x, KinkyDungeonPlayerEntity.y - enemy.y) + > KDistEuclidean(KinkyDungeonPlayerEntity.lastx - enemy.x, KinkyDungeonPlayerEntity.lasty - enemy.y) + ) ? 1.5 : 3.5; + if (playerDist < 1.5) { + KinkyDungeonAttachTetherToEntity(2, KinkyDungeonJailGuard(), player); + } + if (playerDist > pullDist && KinkyDungeonSlowLevel < 2 && KinkyDungeonCheckProjectileClearance(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y)) { + // Guard goes back towards the player and reminds them + let msg = TextGet("KinkyDungeonRemindJailTour" + KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions).replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)); + let msgPrev = TextGet("KinkyDungeonRemindJailTour" + Math.max(0, KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions-1)).replace("EnemyName", TextGet("Name" + KinkyDungeonJailGuard().Enemy.name)); + if (KinkyDungeonLastAction == "Move") { + + KinkyDungeonSendDialogue(KinkyDungeonJailGuard(), msg, "#e7cf1a", 6, 7 + KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions); + if (KinkyDungeonJailGuard().gx != KinkyDungeonPlayerEntity.x || KinkyDungeonJailGuard().gy != KinkyDungeonPlayerEntity.y && KinkyDungeonTextMessage != msgPrev) { + KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions = Math.min(3, KinkyDungeonJailGuard().KinkyDungeonJailTourInfractions + 1); + } + } + if (KinkyDungeonJailGuard()?.KinkyDungeonJailTourInfractions == 3 && KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints > 1) KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints = 1; + KinkyDungeonJailGuard().gx = KinkyDungeonPlayerEntity.x; + KinkyDungeonJailGuard().gy = KinkyDungeonPlayerEntity.y; + KinkyDungeonUpdateTether(true, KinkyDungeonPlayerEntity); + } else { + + KDGameData.KinkyDungeonLeashedPlayer = 2; + KDGameData.KinkyDungeonLeashingEnemy = KinkyDungeonJailGuard().id; + KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().NextJailLeashTourWaypointX; + KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().NextJailLeashTourWaypointY; + let guardPath = KinkyDungeonFindPath(KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y, KinkyDungeonJailGuard().gx, KinkyDungeonJailGuard().gy, false, false, true, KinkyDungeonMovableTilesEnemy); + if (guardPath && guardPath.length > 0 && KDistChebyshev(guardPath[0].x - KinkyDungeonJailGuard().x, guardPath[0].y - KinkyDungeonJailGuard().y) < 1.5) { + + /*if (guardPath[0].x === KinkyDungeonPlayerEntity.x && guardPath[0].y === KinkyDungeonPlayerEntity.y) { + // Swap the player and the guard + KinkyDungeonTargetTile = null; + KinkyDungeonTargetTileLocation = ""; + KDMovePlayer(KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y, false); + if (KinkyDungeonJailGuard()) { + KinkyDungeonJailGuard().x = guardPath[0].x; + KinkyDungeonJailGuard().y = guardPath[0].y; + } + } + let en = KinkyDungeonEnemyAt(guardPath[0].x, guardPath[0].y); + if (en) { + KDMoveEntity(en, KinkyDungeonJailGuard().x, KinkyDungeonJailGuard().y, true, undefined, undefined, true); + if (KinkyDungeonJailGuard()) { + KinkyDungeonJailGuard().x = guardPath[0].x; + KinkyDungeonJailGuard().y = guardPath[0].y; + } + }*/ + } else KinkyDungeonJailGuardGetLeashWaypoint(xx, yy, type); + KinkyDungeonUpdateTether(true, KinkyDungeonPlayerEntity); + } + } + } +} + +function KDGetEffSecurityLevel(faction?: string, Cap?: boolean): number { + if (!faction) faction = KDGetMainFaction(); + let basemod = + (KinkyDungeonStatsChoice.get("NoWayOut") ? 10 : 0) + + (KinkyDungeonStatsChoice.get("KinkyPrison") ? 10 : 0) + + (KinkyDungeonStatsChoice.get("TightRestraints") ? 10 : 0); + + if (faction) { + let mod = basemod-KDFactionRelation("Player", faction) * KDMainFactionSecurityMod; + if (!Cap) return mod + KinkyDungeonGoddessRep.Prisoner; + return Math.max(-50, Math.min(50, mod + KinkyDungeonGoddessRep.Prisoner)); + } + return basemod+KinkyDungeonGoddessRep.Prisoner; +} + +/** + * @param xx + * @param yy + * @param type + */ +function KinkyDungeonJailGuardGetLeashWaypoint(xx: number, yy: number, type: string): void { + if (type == "transfer") { + // Go back to a random mcell + let nearestJail = KinkyDungeonRandomJailPoint(["jail"], [KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)]); + if (nearestJail) { + KinkyDungeonJailGuard().NextJailLeashTourWaypointX = nearestJail.x; + KinkyDungeonJailGuard().NextJailLeashTourWaypointY = nearestJail.y; + KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().NextJailLeashTourWaypointX; + KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().NextJailLeashTourWaypointY; + } + } else { + if (KinkyDungeonJailGuard().RemainingJailLeashTourWaypoints === 0) { + // Go back to the cell's bed + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + KinkyDungeonJailGuard().NextJailLeashTourWaypointX = nearestJail.x; + KinkyDungeonJailGuard().NextJailLeashTourWaypointY = nearestJail.y; + KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().NextJailLeashTourWaypointX; + KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().NextJailLeashTourWaypointY; + } else { + // Get a random next waypoint in an acceptable range outside of the cell + let randomPoint = KinkyDungeonJailGetLeashPoint(xx, yy, KinkyDungeonJailGuard()); + KinkyDungeonJailGuard().NextJailLeashTourWaypointX = randomPoint.x; + KinkyDungeonJailGuard().NextJailLeashTourWaypointY = randomPoint.y; + KinkyDungeonJailGuard().gx = KinkyDungeonJailGuard().NextJailLeashTourWaypointX; + KinkyDungeonJailGuard().gy = KinkyDungeonJailGuard().NextJailLeashTourWaypointY; + } + } +} + +function KinkyDungeonJailGetLeashPoint(xx: number, yy: number, enemy: entity): { x: number, y: number } { + let randomPoint = { x: xx, y: yy }; + for(let i = 0; i < 40; ++i) { + let candidatePoint = KinkyDungeonGetRandomEnemyPoint(true, false, enemy); + if (candidatePoint && !(KinkyDungeonEnemyAt(candidatePoint.x, candidatePoint.y)?.Enemy?.immobile)) { + let distanceFromCell = Math.sqrt((xx - candidatePoint.x) * (xx - candidatePoint.x) + (yy - candidatePoint.y) * (yy - candidatePoint.y)); + if (distanceFromCell > KinkyDungeonJailLeash * 2 && distanceFromCell < KinkyDungeonJailLeash * 6) { + randomPoint = candidatePoint; + break; + } + } + } + return randomPoint; +} + +/** + * @param [any] + * @param [qualified] - Makes sure the player is qualified + * @param [filter] + * @returns - Returns if the player is inside the nearest jail cell + */ +function KinkyDungeonPlayerInCell(any?: boolean, qualified?: boolean, filter?: string[]): boolean { + if (!filter && KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)?.Jail) { + return true; + } + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, filter, any, qualified); + if (!nearestJail || nearestJail.type != "jail") return false; + return KDistChebyshev(KinkyDungeonPlayerEntity.x - nearestJail.x, KinkyDungeonPlayerEntity.y - nearestJail.y) < 2; + //return (Math.abs(KinkyDungeonPlayerEntity.x - KDMapData.StartPosition.x) < KinkyDungeonJailLeashX - 1 && Math.abs(KinkyDungeonPlayerEntity.y - KDMapData.StartPosition.y) <= KinkyDungeonJailLeash); +} + +function KinkyDungeonPointInCell(x: number, y: number, radius: number = 2): boolean { + let nearestJail = KinkyDungeonNearestJailPoint(x, y); + if (!nearestJail) return false; + return KDistChebyshev(x - nearestJail.x, y - nearestJail.y) < radius; + //return (Math.abs(x - KDMapData.StartPosition.x) < KinkyDungeonJailLeashX - 1 && Math.abs(y - KDMapData.StartPosition.y) <= KinkyDungeonJailLeash); +} + +function KinkyDungeonPassOut(noteleport?: boolean) { + KDDefeatedPlayerTick(); + KDBreakTether(KinkyDungeonPlayerEntity); + KDGameData.KinkyDungeonLeashedPlayer = 0; + KinkyDungeonBlindLevel = 6; + KinkyDungeonStatBlind = 10; + KinkyDungeonUpdateLightGrid = true; + KDGameData.AlertTimer = 0; + KinkyDungeonRemoveBuffsWithTag(KinkyDungeonPlayerEntity, ["passout"]); + KinkyDungeonSendEvent("passout", {}); + + KDApplyLivingCollars(); + + KinkyDungeonStripInventory(); + + if (KinkyDungeonCurrentDress == "Default") + KinkyDungeonSetDress("Bikini", "Bikini"); + KinkyDungeonDressPlayer(); + + KDChangeStamina("", "passout", "defeat", -100); + KDChangeMana("", "passout", "defeat", -100); + KDChangeDistraction("", "passout", "defeat", -100); + + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonPassOut"), "#ff5277", 5); + if (!noteleport) + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonPassOut2"), "#ff5277", 5); + + + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/StoneDoor_Close.ogg"); + + KDMapData.KeysHeld = 0; + KDResetAllAggro(); + KinkyDungeonSaveGame(); + + if (!noteleport) { + let point = KinkyDungeonGetRandomEnemyPoint(true, false, undefined); + if (point) { + KDMovePlayer(point.x, point.y, false); + } + } + + + for (let e of KDMapData.Entities) { + if (e.hostile < 9000) e.hostile = 0; + if (e.vp > 0) e.vp = 0; + if (e.aware) e.aware = false; + if (e.maxlifetime && e.maxlifetime < 9000) e.lifetime = 0; + KDExpireFlags(e); + } + + KinkyDungeonLoseJailKeys(); + KDGameData.SlowMoveTurns = 10; +} + +function KDGetJailDoor(x: number, y: number): { tile: any; x: number; y: number } { + let point = KinkyDungeonNearestJailPoint(x, y); + if (point) { + x = point.x; + y = point.y; + } + x += KinkyDungeonJailLeashX - 1; + return {tile: KinkyDungeonTilesGet((x) + "," + y), x: x, y: y}; +} + +function KDGetSawFlag(flag: string, faction: string) { + if (!KDGameData.SawFlags) { + KDGameData.SawFlags = {}; + } + if (KDGameData.SawFlags[faction] && KDGameData.SawFlags[faction][flag]) + return KDGameData.SawFlags[faction][flag]; + return 0; +} + +function KDDefeatedPlayerTick(nodefeat?: boolean) { + // Go thru all enemies on map and commit their sawFlags to faction dir + let seenFlags: Record> = {}; + for (let en of KDMapData.Entities) { + let faction = KDGetFaction(en); + if (!seenFlags[faction]) seenFlags[faction] = {}; + + if (en.flags) + for (let f of Object.keys(en.flags)) { + if (f.startsWith("saw_")) { + seenFlags[faction][f] = KDGetSawFlag(f, faction) + 1; + } + } + } + + KinkyDungeonSetFlag("refusedShopkeeperRescue", 5); // To prevent spawning instantly + KinkyDungeonRemoveBuffsWithTag(KinkyDungeonPlayerEntity, ["removeDefeat"]); + KDGameData.JailGuard = 0; + KDGameData.KinkyDungeonLeashingEnemy = 0; + KDBreakTether(KinkyDungeonPlayerEntity); + if (!nodefeat) + KinkyDungeonSetFlag("playerDefeated", 1); +} + + +function KDEnterDemonTransition() { + KDDefeatedPlayerTick(); + //KDGameData.RoomType = "DemonTransition"; // We do a tunnel every other room + //KDGameData.MapMod = ""; // Reset the map mod + KDGameData.CurrentDialog = ""; + let params = KinkyDungeonMapParams.DemonTransition; + KinkyDungeonCreateMap(params, "DemonTransition", "", MiniGameKinkyDungeonLevel, undefined, undefined, undefined, undefined, undefined, "", ); + + KDRemovePrisonRestraints(); + + KinkyDungeonDressPlayer(); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Evil.ogg"); + + KDMapData.KeysHeld = 0; + + KDMovePlayer(KDMapData.StartPosition.x, KDMapData.StartPosition.y, false); + + KinkyDungeonLoseJailKeys(); + KDResetAllAggro(); + + KinkyDungeonSaveGame(); +} + + +function KDCreateDragonLair(dragon: entity, lairType: string, slot: KDWorldSlot): string { + let main = dragon.homeCoord?.room || slot.main || ""; + let outpost = KDAddLair( + slot, + main, + lairType, + dragon.id, + false, + "Cave", + (KDGameData.RoomType != main) ? main : undefined, + (KDGameData.RoomType != main) ? "Cave" : undefined, + (KDGameData.RoomType != main) ? "Cave" : undefined, + true + ); + return outpost != undefined ? outpost : lairType; +} + +function KDAddDefeatRestraints(enemy: entity, allowFurniture: boolean) { + let packed = KDUnPackEnemy(enemy); + + if (enemy.Enemy?.Defeat?.specificRestraints) { + for (let tagGroup of enemy.Enemy.Defeat.specificRestraints) { + if (tagGroup.minlevel && KDGetEffLevel() < tagGroup.minlevel) { + continue; + } + if (tagGroup.maxlevel && KDGetEffLevel() >= tagGroup.maxlevel) { + continue; + } + let restraint = KDRestraint(tagGroup); + let variant = tagGroup.applyVariant; + let lock = restraint?.DefaultLock || enemy.Enemy.useLock || enemy.Enemy.attackLock; + if (KDCanAddRestraint( + restraint, KinkyDungeonStatsChoice.get("MagicHands"), + lock, false, undefined, true, false, enemy, true, + undefined, undefined, variant ? KDApplyVariants[variant]?.powerBonus : undefined + )) + KinkyDungeonAddRestraintIfWeaker(restraint, + 10, KinkyDungeonStatsChoice.get("MagicHands"), + lock, + false, false, undefined, + KDGetFaction(enemy), true, undefined, + enemy, true, undefined, + undefined, undefined, + variant ? KDApplyVariants[variant] : undefined + ) + } + } + if (enemy.Enemy?.Defeat?.furnitureTags) { + for (let tagGroup of enemy.Enemy.Defeat.furnitureTags) { + for (let i = 0; i < tagGroup.count; i++) { + let restraintAdd = KDGetRestraintWithVariants({tags: tagGroup.tags}, + KDGetEffLevel(), + (KinkyDungeonMapIndex[KDMapData.Checkpoint] || KDMapData.Checkpoint), + KinkyDungeonStatsChoice.get("MagicHands"), + undefined, false, false, false, undefined, + false, allowFurniture ? { + filterGroups: ["ItemFurniture"] + } : undefined, enemy, undefined, true + ); + if (restraintAdd) { + + let lock = restraintAdd.r.DefaultLock || enemy.Enemy.useLock || enemy.Enemy.attackLock; + KinkyDungeonAddRestraintIfWeaker(restraintAdd.r, + 10, KinkyDungeonStatsChoice.get("MagicHands"), lock, + false, false, undefined, KDGetFaction(enemy), true, undefined, + enemy, true, undefined, undefined, undefined, + restraintAdd.v + ) + } + } + } + } + if (packed) KDPackEnemy(enemy); +} + +function KDEnterDragonLair(dragon: entity, lairType: string = "DragonLair") { + KDDefeatedPlayerTick(); + //KDGameData.RoomType = "DemonTransition"; // We do a tunnel every other room + //KDGameData.MapMod = ""; // Reset the map mod + KDGameData.CurrentDialog = ""; + + + + let altRoom = KDGetAltType(MiniGameKinkyDungeonLevel, "", lairType); + let params = altRoom?.useGenParams ? KinkyDungeonMapParams[altRoom.useGenParams] : KinkyDungeonMapParams.cav; + + let slot = KDGetWorldMapLocation(KDCoordToPoint(dragon.homeCoord || KDGetCurrentLocation())); + let room = KDCreateDragonLair(dragon, lairType, slot); + + KinkyDungeonCreateMap(params, room, "", + MiniGameKinkyDungeonLevel, undefined, undefined, + KDGetFaction(dragon) || "DragonQueen", undefined, true, + dragon.homeCoord?.room || slot.main || ""); + KDRemovePrisonRestraints(); + + // Now we add the encasement + + + KinkyDungeonDressPlayer(); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/StoneDoor_Close.ogg"); + + KDMapData.KeysHeld = 0; + + let furnitureApplied = false; + if (KDMapData.JailPoints.length > 0) { + let nearestjail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, + ["furniture"]); + if (nearestjail) { + KDMovePlayer(nearestjail.x, nearestjail.y, false); + furnitureApplied = KDApplyFurnitureRestraint(nearestjail.x, nearestjail.y, KDPlayer()); + } else { + let p = KinkyDungeonGetNearbyPoint(KDMapData.GridWidth/2, KDMapData.GridHeight/2, true); + KDMovePlayer(p.x || KDMapData.GridWidth/2, p.y || KDMapData.GridHeight/2, false); + } + } + + + KinkyDungeonLoseJailKeys(); + KDResetAllAggro(); + + KDAddDefeatRestraints(dragon, !furnitureApplied); + + KinkyDungeonSaveGame(); +} + + +function KDEnterDollTerminal(willing: boolean, cancelDialogue: boolean = true, forceOutfit: boolean = true): void { + let dollStand = KinkyDungeonPlayerTags.get("Dollstand"); + + KDDefeatedPlayerTick(!willing); + KDGameData.PrisonerState = 'jail'; + if (cancelDialogue) KDGameData.CurrentDialog = ""; + let faction = KDGetMainFaction() == "Dollsmith" ? "Dollsmith" : "AncientRobot"; + let params = KinkyDungeonMapParams[alts.DollStorage?.genType || (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; + KDGameData.DollRoomCount = 0; + KinkyDungeonCreateMap(params, "DollStorage", "", MiniGameKinkyDungeonLevel, undefined, undefined, faction, undefined, undefined, ""); + + KDRemovePrisonRestraints(); + + if (forceOutfit && !willing) { + let defeat_outfit = "CyberDoll"; + if (KDGetMainFaction() == "Dollsmith") defeat_outfit = "DollSuit"; + if (KinkyDungeonStatsChoice.has("KeepOutfit")) defeat_outfit = "Default"; + + KinkyDungeonSetDress(defeat_outfit, defeat_outfit); + } + + KDFixPlayerClothes("Dollsmith"); + KinkyDungeonDressPlayer(); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/StoneDoor_Close.ogg"); + + KDMapData.KeysHeld = 0; + + //KDMovePlayer(Math.floor(KDMapData.GridWidth/2), Math.floor(KDMapData.GridHeight/2), false); + + KinkyDungeonLoseJailKeys(); + KDResetAllAggro(); + + if (dollStand && !KinkyDungeonPlayerTags.get("dollStand")) { + KDPlayerEffectRestrain(undefined, 1, ["dollstand"], KDGetMainFaction(), false, true, false, false, false); + } + + KinkyDungeonSaveGame(); +} + +function KDApplyLivingCollars() { + let options = {ApplyVariants: true, allowLowPower: true}; + let collars = KDGetRestraintsEligible({tags: ["livingCollar"]}, 24, "grv", true, undefined, undefined, undefined, undefined, undefined, true, undefined, undefined, undefined, undefined, undefined, undefined, undefined, options); + let eligible = []; + for (let item of collars) { + let collar = item.restraint; + let events = collar.events; + for (let e of events) { + if (e.type == "livingRestraints") { + let newtags = []; + if (!collar.cloneTag) { + newtags = e.tags; + } else { + newtags.push(collar.cloneTag); + for (let tag of e.cloneTags) { + newtags.push(collar.cloneTag + tag); + } + } + let count = 0; + for (let inv of KinkyDungeonAllRestraintDynamic()) { + let found = false; + for (let tag of newtags) { + if (KDRestraint(inv.item).enemyTags[tag] != undefined) { + found = true; + break; + } + } + if (found) { + count++; + } + } + if (count >= e.count) { + eligible.push(collar); + } + } + } + } + if (eligible.length == 0) + return; + + if (KinkyDungeonStatsChoice.has("TightRestraints")) { + for (let item of eligible) { + if (KinkyDungeonAddRestraintIfWeaker(item, 8, true, undefined, false, undefined, undefined, undefined, true)) { + KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonLivingAppear").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightblue", 2); + } + } + } else { + let item = eligible[Math.floor(KDRandom() * eligible.length)]; + if (KinkyDungeonAddRestraintIfWeaker(item, 8, true, undefined, false, undefined, undefined, undefined, true)) { + KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonLivingAppear").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightblue", 2); + } + } +} + +/** Removes restraints with removePrison tags */ +function KDRemovePrisonRestraints() { + for (let inv of KinkyDungeonAllRestraintDynamic()) { + if ((KDRestraint(inv.item).removePrison || KDRestraint(inv.item).forceRemovePrison) + && (!KinkyDungeonStatsChoice.get("KinkyPrison") + || KDRestraint(inv.item).forceRemovePrison + || KDRestraint(inv.item).removeOnLeash || KDRestraint(inv.item).freeze || KDRestraint(inv.item).immobile)) { + KinkyDungeonRemoveRestraintSpecific(inv.item, false); + } + } +} + +function KinkyDungeonDefeat(PutInJail?: boolean, leashEnemy?: entity) { + KDCustomDefeat = ""; + KDCustomDefeatEnemy = null; + KinkyDungeonInterruptSleep(); + + + let forceFaction = KDGetLeashFaction(leashEnemy); + let jailroom = KDGetLeashJailRoom(leashEnemy); + let slot = KDGetWorldMapLocation(KDCurrentWorldSlot); + + if (PutInJail && jailroom == KDMapData.RoomType && forceFaction == KDMapData.MapFaction) { + PutInJail = false; + // Cancel if we are already in the target room! + } + if (PutInJail && leashEnemy && !KDSelfishLeash(leashEnemy) && + (KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison)) { + PutInJail = false; + // Cancel if we are already in a prison + } + + let leasher = KinkyDungeonLeashingEnemy(); + let oldLeash: KDLeashData = null; + if (leasher && KDPlayer().leash) { + oldLeash = KDPlayer().leash; + } + + KDBreakAllLeashedTo(KinkyDungeonPlayerEntity); + + if (KinkyDungeonTempWait) + KDDisableAutoWait(); + + KDBreakTether(KinkyDungeonPlayerEntity); + KDGameData.CurrentDialog = ""; + KDGameData.CurrentDialogStage = ""; + KDGameData.KinkyDungeonLeashedPlayer = 0; + if (!PutInJail) { + KDDefeatedPlayerTick(); + if (KinkyDungeonFlags.get("JailIntro")) + KinkyDungeonSetFlag("JailRepeat", -1); + KinkyDungeonBlindLevel = 3; + KinkyDungeonStatBlind = 3; + } + KinkyDungeonUpdateLightGrid = true; + if (!KDGameData.TimesJailed) KDGameData.TimesJailed = 1; + else KDGameData.TimesJailed += 1; + KDGameData.JailTurns = 0; + //if (PutInJail) + // KDGameData.PriorJailbreaks = 0; + KDGameData.PrisonerState = "jail"; + KDGameData.AlertTimer = 0; + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (!nearestJail) { + nearestJail = Object.assign({type: "jail", radius: 1}, KDMapData.StartPosition); + } + KDSendStatus('jailed'); + KDSendEvent('jail'); + KDGameData.WarningLevel = 0; + KDGameData.AncientEnergyLevel = 0; + KDGameData.JailRemoveRestraintsTimer = 0; + if (!PutInJail) { + KinkyDungeonSetFlag("defeat", 25); + KinkyDungeonSendEvent("defeat", {}); + + if (KinkyDungeonStatsChoice.get("LivingCollars")) + KDApplyLivingCollars(); + + KDRemovePrisonRestraints(); + } + + KDGameData.KinkyDungeonPrisonReduction = 0; + //let firstTime = KDGameData.KinkyDungeonSpawnJailersMax == 0; + KDResetGuardSpawnTimer(); + KDGameData.KinkyDungeonSpawnJailersMax = 2; + KDGameData.KinkyDungeonSpawnJailersMax += Math.round(6 * (KDGetEffSecurityLevel(undefined, true) + 50)/100); + //let securityBoost = (firstTime) ? 0 : Math.max(2, Math.ceil(4 * (KDGameData.KinkyDungeonSpawnJailersMax - KDGameData.KinkyDungeonSpawnJailers + 1)/KDGameData.KinkyDungeonSpawnJailersMax)); + + KinkyDungeonStatBlind = 3; + + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonLeashed"), "#ff5277", 3); + if (!KinkyDungeonJailedOnce) { + KinkyDungeonJailedOnce = true; + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonLeashed2"), "#ff5277", 3); + } + let params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; + KDGameData.KinkyDungeonSpawnJailers = KDGameData.KinkyDungeonSpawnJailersMax; + + //KinkyDungeonChangeRep("Ghost", 1 + Math.round(KinkyDungeonSpawnJailers/2)); + //KinkyDungeonChangeRep("Prisoner", securityBoost); // Each time you get caught, security increases... + + KinkyDungeonDressPlayer(); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/StoneDoor_Close.ogg"); + + KDMapData.KeysHeld = 0; + + if (PutInJail) { + //KDGameData.RoomType = "Jail"; // We do a tunnel every other room + //KDGameData.MapMod = ""; // Reset the map mod + + let slot = KDGetWorldMapLocation(KDCurrentWorldSlot); + let altRoom = KDGetAltType(MiniGameKinkyDungeonLevel); + let fromHere = true; + if (((slot.main || "") == KDGameData.RoomType) && (altRoom && altRoom.placeJailEntrances)) + fromHere = false; + let outpost = KDAddOutpost( + slot, + fromHere ? KDGameData.RoomType : slot.main || "", + jailroom, + forceFaction || "Jail", + false, + "Jail", + fromHere ? slot.main || "" : undefined, + fromHere ? "Jail" : undefined, + fromHere ? "Jail" : undefined, + true + ); + let room = outpost != undefined ? outpost : jailroom; + + + if (leasher) { + if (!leasher.homeCoord) { + leasher.homeCoord = KDGetCurrentLocation(); + } + } + + let currentMapData = KDMapData; + + KinkyDungeonCreateMap(params, room, "", + MiniGameKinkyDungeonLevel, undefined, undefined, + forceFaction, undefined, true, slot.main || ""); + + // The above condition is the condition to start in jail + // We move the player to the jail after generating one + /*nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (nearestJail) { + + KDMovePlayer(nearestJail.x, nearestJail.y, false); + KDLockNearbyJailDoors(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + }*/ + let entrance = KDGetNearestExitTo(currentMapData.RoomType, currentMapData.mapX, currentMapData.mapY, + 1, 1, KDMapData, true + ); + + if (!entrance || (altRoom?.nostartstairs && entrance.x == KDMapData.StartPosition.x + && entrance.y == KDMapData.StartPosition.y) + ) { + entrance = KDMapData.EndPosition; + } + + KDMovePlayer(entrance.x, entrance.y, false); + + if (leasher) { + if (!leasher.homeCoord) leasher.homeCoord = { + mapX: currentMapData.mapX, + mapY: currentMapData.mapY, + room: currentMapData.RoomType, + }; + KDDespawnEnemy(leasher, undefined, currentMapData, KDMapData.RoomType); + let nextExit = KDGetNearestExitTo( + currentMapData.RoomType, currentMapData.mapX, currentMapData.mapY, + leasher.x, + leasher.y, + KDMapData, true + ); + if (nextExit) { + leasher.despawnX = nextExit.x; + leasher.despawnY = nextExit.y; + } else { + leasher.despawnX = KDMapData.EndPosition.x; + leasher.despawnY = KDMapData.EndPosition.y; + } + KDPlayer().leash = oldLeash; + } else { + // Grab the nearest guard and attach leash + KDPrisonCommonGuard(KDPlayer()); + if (KinkyDungeonJailGuard()) { + let pp = KinkyDungeonGetNearbyPoint( + KDPlayer().x, KDPlayer().y, true + ); + if (pp) { + // Move guard nearby and leash + KDMoveEntity(KinkyDungeonJailGuard(), pp.x, pp.y, true, false, false, false, true); + + leasher = KinkyDungeonJailGuard(); + } + } + } + + + if (leasher) KDGameData.JailGuard = leasher.id; + if (leasher && KinkyDungeonJailGuard()) { + KDAttachLeashOrCollar(KinkyDungeonJailGuard(), KDPlayer(), 1, true); + if (!KDPlayer().leash) + KinkyDungeonAttachTetherToEntity( + 2.5, KinkyDungeonJailGuard(), KDPlayer() + ); + else { + KDPlayer().leash.x = leasher.x; + KDPlayer().leash.y = leasher.y; + } + let guard = KinkyDungeonJailGuard(); + guard.aware = true; + guard.gx = guard.x; + guard.gy = guard.y; + let action = "leashCell"; + if (guard.IntentAction != action) { + KDIntentEvents[action].trigger(guard, {}); + } + } + + + let en = KinkyDungeonEntityAt(entrance.x, entrance.y); + if (en) { + let pp = KinkyDungeonGetNearbyPoint( + en.x, en.y, true + ); + if (pp) { + KDMoveEntity(en, pp.x, pp.y, true, false, + false, false, true); + } + } + + KinkyDungeonSetFlag("LeashToPrison", 0); + + //nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + + } else { + KDMovePlayer(nearestJail.x + (nearestJail.direction?.x || 0), nearestJail.y + (nearestJail.direction?.y || 0), false); + + if (leasher) + KDAddDefeatRestraints(leasher, true); + + if (nearestJail.direction) { + KinkyDungeonSetFlag("conveyed", 1); + } else { + if (leasher && KDIsHumanoid(leasher) && KDEnemyCanTalk(leasher) + && KDShouldStripSearchPlayer(KDPlayer())) { + if (!KDGameData.CurrentDialog) { + KinkyDungeonSetFlag("jailStripSearched", KDJailStripSearchTempTime); + KDStartDialog("StripSearch", + leasher.Enemy.name, + true, + KDGetPersonality(leasher), + leasher) + } + } + } + if (nearestJail.restraint) { + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(nearestJail.restraint), KDGetEffLevel(),false, undefined); + } + if (nearestJail.restrainttags) { + let restraint = KinkyDungeonGetRestraint({tags: nearestJail.restrainttags}, KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), false, undefined); + if (restraint) + KinkyDungeonAddRestraintIfWeaker(restraint, KDGetEffLevel(),false, undefined); + } + } + + + let outfit = KDOutfit({name: KinkyDungeonCurrentDress}); + KDFixPlayerClothes( + (KDToggles.NoOutfitPalette ? undefined : outfit?.palette) + || KinkyDungeonPlayer.Palette || KDGetMainFaction() || (KDToggles.ForcePalette ? KDDefaultPalette : "Jail")); + KinkyDungeonDressPlayer(); + + KinkyDungeonLoseJailKeys(); + + KDGameData.KinkyDungeonSpawnJailers = KDGameData.KinkyDungeonSpawnJailersMax - 1; + + // Lock all jail doors + for (let X = 1; X < KDMapData.GridWidth - 1; X++) + for (let Y = 1; Y < KDMapData.GridHeight - 1; Y++) { + let tile = KinkyDungeonTilesGet(X + "," + Y); + if (tile && ((tile.Jail && tile.ReLock) || tile.OGLock) && (KinkyDungeonMapGet(X, Y) == 'd' || KinkyDungeonMapGet(X, Y) == 'D')) { + KinkyDungeonMapSet(X, Y, 'D'); + if (tile && !tile.Lock + && (!tile.Jail || (KDGameData.PrisonerState == 'jail' || KDistChebyshev(KDPlayer().x - X, KDPlayer().y - Y) > 2.5))) { + tile.Lock = tile.OGLock || "Red"; + tile.Type = "Door"; + KDUpdateDoorNavMap(); + } + } + } + + KDKickEnemies(nearestJail, PutInJail, MiniGameKinkyDungeonLevel); + KDResetAllAggro(); + + KDRepairRubble(true); + + + KinkyDungeonSaveGame(); +} + +/** + * @param JailBorderOnly + */ +function KDRepairRubble(JailBorderOnly: boolean) { + let tile = null; + for (let X = 0; X < KDMapData.GridWidth - 1; X++) { + for (let Y = 0; Y < KDMapData.GridHeight - 1; Y++) { + let yes = !JailBorderOnly; + let effectTags = KDEffectTileTags(X, Y); + if (effectTags.seal) { + if (!yes) { + for (let XX = -1; XX <= 1; XX++) + for (let YY = -1; YY <= 1; YY++) + if (!yes) { + tile = KinkyDungeonTilesGet((X + XX) + ',' + (Y + YY)); + if (tile && (tile.Jail || tile.OL || tile.NW)) { + yes = true; + } + } + } + if (yes) { + let effectTiles = KDGetEffectTiles(X, Y); + + for (let et of Object.values(effectTiles)) { + if (et.duration < 9000 || et.tags?.includes("seal")) { + et.duration = 0; + } + } + KinkyDungeonMapSet(X, Y, '4'); + } + } + } + } +} + +/** + * @param enemy + */ +function KDEnemyIsTemporary(enemy: entity): boolean { + return enemy.Enemy.tags.temporary || (enemy.lifetime > 0) || enemy.temporary; +} + +/** + * Kicks enemies away, and also out of offlimits zones if they are aware + * @param nearestJail + * @param ignoreAware + * @param Level + * @param [noCull] + */ +function KDKickEnemies(nearestJail: any, ignoreAware: boolean, Level: number, noCull?: boolean): boolean { + + let altRoom = KDMapData.RoomType; + let mapMod = KDMapData.MapMod ? KDMapMods[KDMapData.MapMod] : null; + let altType = altRoom ? KinkyDungeonAltFloor((mapMod && mapMod.altRoom) ? mapMod.altRoom : altRoom) : KinkyDungeonBossFloor(Level); + + let canCull = !noCull && (altType?.alwaysRegen + || altType?.removePartyMembers + || (altType && !(altType?.makeMain || altType?.persist))); + let atLeastOneAware = false; + let enemies = []; + let already = new Map(); + if (!altType?.removePartyMembers) + for (let e of KDMapData.Entities) { + if (!e.Enemy?.tags.temporary && !KDIsImmobile(e) && e.spawnX && e.spawnY + && (!e.homeCoord || KDCompareLocation(e.homeCoord, KDGetCurrentLocation()))) { + if (e.aware && KDHostile(e) && KinkyDungeonCheckLOS(e, KinkyDungeonPlayerEntity, KDistEuclidean(e.x - KinkyDungeonPlayerEntity.x, e.y - KinkyDungeonPlayerEntity.y), + 10, true, false)) { + atLeastOneAware = true; + } else e.aware = false; + if (!e.leash && (!ignoreAware || !e.aware)) + if (!nearestJail || (e.x == nearestJail.x && e.y == nearestJail.y) || (!e.Enemy.tags?.prisoner && !e.Enemy.tags?.peaceful && !KDEnemyHasFlag(e, "imprisoned"))) { + if (!nearestJail || KDistChebyshev(e.x - nearestJail.x, e.y - nearestJail.y) <= 4 || (e.aware || e.vp > 0.01 || e.aggro > 0)) { + e.x = e.spawnX; + e.y = e.spawnY; + e.path = undefined; + e.gx = e.x; + e.gy = e.y; + already.set(e, true); + KDUpdateEnemyCache = true; + } + } + } + } + for (let e of KDMapData.Entities) { + if (!e.Enemy.tags.temporary) { + if (e.aware && !KDIsImmobile(e) && KDHostile(e) && KinkyDungeonCheckLOS(e, KinkyDungeonPlayerEntity, KDistEuclidean(e.x - KinkyDungeonPlayerEntity.x, e.y - KinkyDungeonPlayerEntity.y), + 10, true, false)) { + atLeastOneAware = true; + } else if (e.id != KDGameData.JailGuard && e.id != KDGameData.KinkyDungeonLeashingEnemy) e.aware = false; + if (!ignoreAware || !e.aware) { + if (!nearestJail || (e.x == nearestJail.x && e.y == nearestJail.y) || (!e.Enemy.tags.prisoner && !e.Enemy.tags.peaceful && !KDEnemyHasFlag(e, "imprisoned"))) { + if (!e.leash && !KDIsImmobile(e)) + if (!already.get(e) && (!nearestJail || KDistChebyshev(e.x - nearestJail.x, e.y - nearestJail.y) <= 4 || (e.aware || e.vp > 0.01 || e.aggro > 0))) { + let p = KinkyDungeonGetRandomEnemyPoint(true); + if (p) { + e.x = p.x; + e.y = p.y; + e.path = undefined; + e.gx = e.x; + e.gy = e.y; + KDUpdateEnemyCache = true; + } + } + + if (!KDEnemyHasFlag(e, "imprisoned") && e.boundLevel && !KDHelpless(e)) { + KDSetToExpectedBondage(e, -1); + } + } + if (e.hostile < 9000) e.hostile = 0; + if (e.playWithPlayer > 0) { + e.playWithPlayer = 0; + e.playWithPlayerCD = 10; + } + KDExpireFlags(e); + KDResetIntent(e, {}); + } + if (altType?.removePartyMembers) { + KDRemoveEntity(e, false, true, true); + } else { + if (e.boundLevel && !KDIsImprisoned(e)) { + if (canCull && KDHelpless(e)) { + KDRemoveEntity(e, false, true, true); + } else { + enemies.push(e); + } + if (KDGetFaction(e) != "Player" + && KDFactionRelation(KDGetFaction(e), KDMapData.MapFaction) > 0.5) { + KDRunNPCEscapeTick(e.id, 12 + Math.floor(24 * KDRandom())); + } + } else { + enemies.push(e); + } + } + + } + } + KDMapData.Entities = enemies; + KDCommanderRoles = new Map(); + KDUpdateEnemyCache = true; + return atLeastOneAware; +} + +function KDResetAllIntents(nonHostileOnly?: boolean, endPlay: number = 30, _player?: void) { + for (let e of KDMapData.Entities) { + if (!nonHostileOnly || !KinkyDungeonAggressive(e)) { + if (endPlay) { + KDSetPlayCD(e, 2, 10); + e.playWithPlayer = 0; + e.dialogue = ""; + } + if (e.IntentAction && !KDIntentEvents[e.IntentAction].noMassReset) + KDResetIntent(e); + } + + } +} +function KDResetAllAggro(_player?: void): void { + KDGameData.HostileFactions = []; + for (let e of KDMapData.Entities) { + if (e.hostile && !KDIntentEvents[e.IntentAction]?.noMassReset) + e.hostile = 0; + } +} +function KDForceWanderFar(player: any, radius: number = 10) { + let enemies = KDNearbyEnemies(player.x, player.y, radius); + for (let en of enemies) { + if (en.gx == player.x && en.gy == player.y) { + KDWanderEnemy(en); + } + } + +} + +/** + * @param en + */ +function KDWanderEnemy(en: entity) { + en.gx = en.x; + en.gy = en.y; + KinkyDungeonSetEnemyFlag(en, "forceWFar", 5); + KinkyDungeonSetEnemyFlag(en, "wander", 0); +} + +/** + * Moves an enemy to a random position on the map + * @param e + */ +function KDKickEnemy(e: entity, minDist: number = 10, force: boolean = false) { + if (!e.Enemy.tags.temporary || force) { + if (!e.Enemy.tags.prisoner && !KDEnemyHasFlag(e, "imprisoned")) { + let p = (e.spawnX != undefined && e.spawnY != undefined + && (!e.homeCoord || (KDCompareLocation(e.homeCoord, KDGetCurrentLocation()))) + ) ? {x: e.spawnX, y: e.spawnY} : undefined; + if (!p || KDistEuclidean (e.x - (e.spawnX != undefined ? e.spawnX : e.x), + e.y - (e.spawnY != undefined ? e.spawnY : e.y)) < minDist) + { + p = KinkyDungeonGetRandomEnemyPoint(true); + } + if (p) { + e.x = p.x; + e.y = p.y; + e.path = undefined; + e.gx = e.x; + e.gy = e.y; + } + + + if (e.boundLevel) KDSetToExpectedBondage(e, -1); + } + if (e.hostile < 9000) e.hostile = 0; + KDExpireFlags(e); + KDResetIntent(e, {}); + } + KDClearItems(e); +} + +/** + * Moves an enemy to a random position nearby + * @param e + */ +function KDKickEnemyLocal(e: entity) { + let point = KinkyDungeonGetNearbyPoint(e.x, e.y, true, undefined, true, true); + if (point) { + KDMoveEntity(e, point.x, point.y, false); + } +} + +function KinkyDungeonStripInventory(KeepPicks?: boolean) { + let oldPicks = KinkyDungeonItemCount("Pick"); + let newInv = KinkyDungeonInventory.get(Restraint); + let HasBound = false; + let boundWeapons = []; + if (HasBound) { + // TODO add bound weapons here + } + KinkyDungeonAddLostItems(KinkyDungeonFullInventory(), HasBound); + KDInitInventory(); + KinkyDungeonInventory.set(Restraint, newInv); + KinkyDungeonInventoryAddWeapon("Unarmed"); + KDSetWeapon(null, true); + for (let b of boundWeapons) { + KinkyDungeonInventoryAddWeapon(b); + } + if (oldPicks > 0) { + KDAddConsumable("Pick", 1); + } +} + +function KDExpireFlags(enemy: entity) { + if (enemy.flags) { + for (let f of Object.entries(enemy.flags)) { + if (f[1] > 0 && f[1] < 9000) enemy.flags[f[0]] = 0; + } + } +} + +/** + * Gets the jail outfit of the guard, or using overrideTags instead of the guard's taggs + * @param [overrideTags] + * @param [requireJail] + * @param [requireParole] + */ +function KDGetJailRestraints(overrideTags?: string[], requireJail?: boolean, requireParole?: boolean): KDJailRestraint[] { + let restraints = []; + //let pris = {}; + let guard = KinkyDungeonJailGuard(); + let tags = overrideTags ? overrideTags : []; + if (!overrideTags) { + if (!guard) tags.push("jailer"); + else { + for (let t of Object.keys(KinkyDungeonJailGuard().Enemy.tags)) { + if (KDJailOutfits[t] && (!requireJail || KDJailOutfits[t].jail) && (!requireParole || KDJailOutfits[t].parole)) tags.push(t); + } + } + } + + let newtags = []; + + for (let t of tags) { + newtags.push(t); + } + + for (let t of tags) { + let tag = KDJailOutfits[t]; + if (tag?.overridelowerpriority) { + // Go over all tags and remove those with lower priority + let pri = tag.priority; + for (let tt of newtags) { + let tag2 = KDJailOutfits[tt]; + if (tag2.priority < pri) newtags.splice(newtags.indexOf(tt), 1); + } + } + } + + tags = newtags; + + for (let t of tags) { + for (let r of KDJailOutfits[t].restraints) { + //let restraint = KinkyDungeonRestraintsCache.get(r.Name); + //if (restraint && (!pris[restraint.Group] || r.priority > pris[restraint.Group])) { + restraints.push(r); + //pris[restraint.Group] = r.priority; + //} + } + } + + return restraints; +} + +function KDSetWorldSlot(x: number, y: number) { + MiniGameKinkyDungeonLevel = y; + KDCurrentWorldSlot = {x: x, y: y}; +} + +/** + */ +let KDCustomDefeats: Record void> = { + "DemonTransition": (_enemy) => { + KDEnterDemonTransition(); + }, + "DragonLair": (_enemy) => { + KDEnterDragonLair(_enemy, "DragonLair"); + }, + "ShopkeeperRescue": (enemy) => { + KDRemoveEntity(enemy); + KinkyDungeonSendTextMessage(10, TextGet("KDShopkeeperTeleportToStart"), "#ffffff", 4); + KDSetWorldSlot(0, 0); + let params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; + KinkyDungeonCreateMap(params, "ShopStart", "", MiniGameKinkyDungeonLevel, + undefined, undefined, undefined, {x: 0, y: 0}, + false, undefined); + KDStartDialog("ShopkeeperTeleport", enemy.Enemy.name, true, "", enemy); + + }, + + + WolfgirlHunters: (enemy) => { + if (KDRunRegularJailDefeatAttempt(enemy)) { + KinkyDungeonDefeat(true, enemy); + } + KDCustomDefeatUniforms.WolfgirlHunters(); + }, + MaidSweeper: (enemy) => { + if (KDRunRegularJailDefeatAttempt(enemy)) { + /** She puts on a happy face */ + enemy.faction = "Maidforce"; + KinkyDungeonDefeat(true, enemy); + } + KDCustomDefeatUniforms.MaidSweeper(); + }, + DollShoppe: (enemy) => { + if (KDRunRegularJailDefeatAttempt(enemy)) { + KinkyDungeonDefeat(true, enemy); + } + KDCustomDefeatUniforms.DollShoppe(); + }, + CyberDoll: (enemy) => { + if (KDRunRegularJailDefeatAttempt(enemy)) { + KinkyDungeonDefeat(true, enemy); + } + KDCustomDefeatUniforms.CyberDoll(); + }, + ElementalSlave: (enemy) => { + if (KDRunRegularJailDefeatAttempt(enemy)) { + KinkyDungeonDefeat(true, enemy); + } + KDCustomDefeatUniforms.ElementalSlave(); + }, + DollStorage: (enemy) => { + if (KinkyDungeonFlags.has("LeashToPrison")) + KDEnterDollTerminal(false, false, false); + else + KinkyDungeonDefeat(false, enemy); + }, + + + RopeDojo: (_enemy) => { + KinkyDungeonPassOut(false); + KDCustomDefeatUniforms.RopeDojo(); + }, + Adventurer: (_enemy) => { + KinkyDungeonPassOut(false); + KDCustomDefeatUniforms.Adventurer(); + KDAddDefeatRestraints(_enemy, false); + }, +}; + +let KDCustomDefeatUniforms = { + WolfgirlHunters: () => { + for (let i = 0; i < 30; i++) { + let r = KinkyDungeonGetRestraint({tags: (i < (KinkyDungeonStatsChoice.has("NoWayOut") ? 3 : 1) ? ["wolfCuffs"] : ["wolfGear", "wolfRestraints", "linkRegular"])}, 12, "grv", true, "Red"); + if (r) { + KinkyDungeonAddRestraintIfWeaker(r, 0, true, r.Group == "ItemNeck" ? "Blue" : "Red", undefined, undefined, undefined, undefined, true); + if (r.Link) { + let newRestraint = KinkyDungeonGetRestraintByName(r.Link); + KinkyDungeonAddRestraintIfWeaker(newRestraint, 0, true, "Red", undefined, undefined, undefined, undefined, true); + } + } + } + let outfit = {name: "Wolfgirl", id: KinkyDungeonGetItemID(), type: Outfit}; + if (!KinkyDungeonInventoryGet("Wolfgirl")) KinkyDungeonInventoryAdd(outfit); + //if (KinkyDungeonInventoryGet("Default")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Default")); + KinkyDungeonSetDress("Wolfgirl", "Wolfgirl"); + }, + MaidSweeper: () => { + for (let i = 0; i < 30; i++) { + let r = KinkyDungeonGetRestraint({tags: ["maidRestraints", "maidVibeRestraints", "noMaidJacket", "handcuffer", "linkRegular"]}, 12, "grv", true, "Purple"); + if (r) + KinkyDungeonAddRestraintIfWeaker(r, 0, true, r.Group == "ItemNeck" ? "Blue" : "Purple", undefined, undefined, undefined, undefined, true); + } + let outfit = {name: "Maid", id: KinkyDungeonGetItemID(), type: Outfit}; + if (!KinkyDungeonInventoryGet("Maid")) KinkyDungeonInventoryAdd(outfit); + //if (KinkyDungeonInventoryGet("Default")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Default")); + KinkyDungeonSetDress("Maid", "Maid"); + }, + DollShoppe: () => { + KinkyDungeonAddRestraintIfWeaker("LatexCatsuit", 5, true, "Red", false, undefined, undefined, "Jail", true); + for (let i = 0; i < 30; i++) { + let r = KinkyDungeonGetRestraint({tags: ["latexRestraints", "latexStart", "latexCollar", "latexRestraintsForced"]}, 12, "grv", true, "Purple", false, false, false); + if (r) + KinkyDungeonAddRestraintIfWeaker(r, 0, true, r.Group == "ItemNeck" ? "Blue" : "Purple", undefined, undefined, undefined, "Jail", true); + } + if (!KinkyDungeonStatsChoice.get("NoKigu")) + KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(KDRandom() ? "KiguMask" : "KiguMaskSmile"), 0, true, "Purple"); + }, + + CyberDoll: () => { + KinkyDungeonAddRestraintIfWeaker("ControlHarness", 5, true, "Cyber3", false, undefined, undefined, "Dollsmith", true); + KinkyDungeonAddRestraintIfWeaker("TrackingCollar", 5, true, "Cyber3", false, undefined, undefined, "Dollsmith", true); + KinkyDungeonAddRestraintIfWeaker("TrackingModule", 5, true, "Cyber", false, undefined, undefined, "Dollsmith", true); + + + KinkyDungeonAddRestraintIfWeaker("CyberBelt", 5, true, "Cyber3", false, undefined, undefined, "Dollsmith", true); + KinkyDungeonAddRestraintIfWeaker("CyberBra", 5, true, "Cyber3", false, undefined, undefined, "Dollsmith", true); + + KinkyDungeonAddRestraintIfWeaker("CyberHeels", 5, true, "Cyber", false, undefined, undefined, "Dollsmith", true); + //KinkyDungeonAddRestraintIfWeaker("CyberBallGag", 5, true, "Red", false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker("CyberPlugGag", 5, true, "Cyber2", false, undefined, undefined, "Dollsmith", true); + KinkyDungeonAddRestraintIfWeaker("CyberMuzzle", 5, true, "Cyber", false, undefined, undefined, "Dollsmith", true); + //KinkyDungeonAddRestraintIfWeaker("DollmakerVisor", 5, true, "Gold", false, undefined, undefined, undefined, true); + + KinkyDungeonAddRestraintIfWeaker("CyberMittens", 5, true, "Cyber2", false, undefined, undefined, "Dollsmith", true); + + KinkyDungeonAddRestraintIfWeaker("CyberArmCuffs", 5, true, "Cyber2", false, undefined, undefined, "Dollsmith", true); + KinkyDungeonAddRestraintIfWeaker("CyberLegCuffs", 5, true, "Cyber2", false, undefined, undefined, "Dollsmith", true); + KinkyDungeonAddRestraintIfWeaker("CyberAnkleCuffs", 5, true, "Cyber2", false, undefined, undefined, "Dollsmith", true); + + //KinkyDungeonAddRestraintIfWeaker("CyberDollJacket", 5, true, "Red", false, undefined, undefined, undefined, true); + + KinkyDungeonSetDress("CyberDoll", "CyberDoll"); + }, + + RopeDojo: () => { + KinkyDungeonAddRestraintIfWeaker("RopeSnakeArmsWrist", 8, true, undefined, false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker("TrapMittens", 5, true, undefined, false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker("Stuffing", 5, true, undefined, false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker("HarnessPanelGag", 5, true, undefined, false, undefined, undefined, undefined, true); + if (!KinkyDungeonStatsChoice.get("NoBlindfolds")) + KinkyDungeonAddRestraintIfWeaker("TrapBlindfold", 5, true, undefined, false, undefined, undefined, undefined, true); + for (let i = 0; i < 30; i++) { + let r = KinkyDungeonGetRestraint({tags: ["ropeRestraints", "ropeRestraints2", "ropeRestraintsHogtie", "ropeRestraintsWrist", "tapeRestraints", "genericToys"]}, 24, "grv", true, undefined); + if (r) { + KinkyDungeonAddRestraintIfWeaker(r, 8, true, undefined, false, undefined, undefined, undefined, true); + let item = r; + for (let j = 0; j < 2; j++) { + if (item && item.Link) { + let newRestraint = KinkyDungeonGetRestraintByName(item.Link); + KinkyDungeonAddRestraintIfWeaker(newRestraint, 8, true, undefined, undefined, undefined, undefined, undefined, true); + item = newRestraint; + } + } + } + } + }, + + + Adventurer: () => { + KinkyDungeonAddRestraintIfWeaker("SturdyLeatherBeltsArms", 8, true, undefined, false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker("SturdyLeatherBeltsLegs", 8, true, undefined, false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker("SturdyLeatherBeltsFeet", 8, true, undefined, false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker("TrapMittens", 5, true, undefined, false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker("Stuffing", 5, true, undefined, false, undefined, undefined, undefined, true); + KinkyDungeonAddRestraintIfWeaker("HarnessPanelGag", 5, true, undefined, false, undefined, undefined, undefined, true); + if (!KinkyDungeonStatsChoice.get("NoBlindfolds")) + KinkyDungeonAddRestraintIfWeaker("TrapBlindfold", 5, true, undefined, false, undefined, undefined, undefined, true); + }, + + ElementalSlave: () => { + for (let i = 0; i < 30; i++) { + let r = KinkyDungeonGetRestraint({tags: ["obsidianRestraints", "ornateChastity", "genericToys", "linkRegular"]}, 12, "grv", true, "Red"); + if (r) { + KinkyDungeonAddRestraintIfWeaker(r, 0, true, r.Group == "ItemNeck" ? "Blue" : "Purple", false, undefined, undefined, undefined, true); + let item = r; + for (let j = 0; j < 2; j++) { + if (item && item.Link) { + let newRestraint = KinkyDungeonGetRestraintByName(item.Link); + KinkyDungeonAddRestraintIfWeaker(newRestraint, 0, true, "Purple", undefined, undefined, undefined, undefined, true); + item = newRestraint; + } + } + } + } + let outfit = {name: "ElementalDress", id: KinkyDungeonGetItemID(), type: Outfit}; + if (!KinkyDungeonInventoryGet("ElementalDress")) KinkyDungeonInventoryAdd(outfit); + //if (KinkyDungeonInventoryGet("Default")) KinkyDungeonInventoryRemove(KinkyDungeonInventoryGet("Default")); + KinkyDungeonSetDress("ElementalDress", "ElementalDress"); + }, +}; + +function KDFixPlayerClothes(faction: string) { + for (let inv of KinkyDungeonAllRestraintDynamic()) { + inv.item.faction = faction; + } +} + +function KDResetGuardSpawnTimer() { + KDGameData.GuardSpawnTimer = 4 + Math.floor(KDRandom() * (KDGameData.GuardSpawnTimerMax - KDGameData.GuardSpawnTimerMin)); +} + +let KDChestRank = { + "gold": 3, + "lessergold": 3, + "silver": 2, + "storage": 0, +}; +let KDChestPenalty = { + "gold": 0, + "lessergold": 3, + "silver": 2, + "storage": 0, +}; + +/** + * @param data + */ +function KDChestSecurity(data: {enemy?: entity, x?: number, y?: number, faction?: string}): number { + if (data.x) { + let tile = KinkyDungeonTilesGet(data.x + "," + data.y); + if (tile) { + if (KDChestPenalty[tile.Loot] != undefined) return KDChestPenalty[tile.Loot]; + return 1; + } + } + + + return 0.25; +} + +function KDGetHiSecDialogue(enemy: entity): string { + if (enemy) { + let faction = KDGetFaction(enemy); + if (KDFactionProperties[faction]?.customHiSecDialogue) { + return KDFactionProperties[faction].customHiSecDialogue(enemy); + } + } + return "JailerHiSec"; +} + + +function KDGetLeashFaction(leashEnemy: entity): string { + let forceFaction = undefined; + if (leashEnemy && (KDFactionProperties[KDGetFaction(leashEnemy)] + || KDFactionProperties[KDGetFactionOriginal(leashEnemy)])) { + if (KDFactionProperties[KDGetFaction(leashEnemy)]) + forceFaction = KDFactionProperties[KDGetFaction(leashEnemy)].jailFaction + || KDGetFaction(leashEnemy); + else { + if (KDFactionProperties[KDGetFactionOriginal(leashEnemy)]) { + forceFaction = KDFactionProperties[KDGetFactionOriginal(leashEnemy)].jailFaction + || KDGetFactionOriginal(leashEnemy); + } else { + forceFaction = KDGetFactionOriginal(leashEnemy); + } + + } + } + if (!forceFaction) forceFaction = KDGetMainFaction(); + if (leashEnemy && KDFactionProperties[KDGetFactionOriginal(leashEnemy)]?.jailFaction) { + forceFaction = KDFactionProperties[KDGetFactionOriginal(leashEnemy)]?.jailFaction; + } + return forceFaction; +} + +function KDGetLeashJailRoom(leashEnemy: entity): string { + let jailRoom = undefined; + if (leashEnemy + && (KDFactionProperties[KDGetFaction(leashEnemy)]?.lairType + || (!KDFactionProperties[KDGetFaction(leashEnemy)] + && KDFactionProperties[KDGetFactionOriginal(leashEnemy)]?.lairType))) { + if (KDFactionProperties[KDGetFaction(leashEnemy)]?.lairType) + jailRoom = KDFactionProperties[KDGetFaction(leashEnemy)].lairType; + else + jailRoom = KDFactionProperties[KDGetFactionOriginal(leashEnemy)].lairType + } else if (leashEnemy + && (KDFactionProperties[KDGetFaction(leashEnemy)] + || KDFactionProperties[KDGetFactionOriginal(leashEnemy)])) { + if (KDFactionProperties[KDGetFaction(leashEnemy)]) + jailRoom = KDFactionProperties[KDGetFaction(leashEnemy)].jailRoom; + else + jailRoom = KDFactionProperties[KDGetFactionOriginal(leashEnemy)].jailRoom + } + if (!jailRoom) jailRoom = "Jail"; + return jailRoom; +} + + +function KDHasEntranceToJailRoom(jailRoom: string, map: WorldCoord, allowMainInstead: boolean): boolean { + let slot = KDGetWorldMapLocation(KDCoordToPoint(map)); + if (!slot) return false; + if (allowMainInstead) { + // We assume highsec will appear in main + if (map.room == slot.main) { + return true; + } + } + let entrances = KDGetEntrancesInRoom(map, true, true, true, true); + if (entrances[jailRoom]) return true; + return false; +} +function KDGetEntranceToJailRoom(jailRoom: string, map: WorldCoord,): KDPoint { + let slot = KDGetWorldMapLocation(KDCoordToPoint(map)); + if (!slot) return null; + let entrances = KDGetEntrancePoints(map, true, true, true); + return entrances[jailRoom]; +} + +function KDApplyJailOutfit() { + let params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; + + let defeat_outfit = params.defeat_outfit; + // Handle special cases + let collar = KinkyDungeonGetRestraintItem("ItemNeck"); + if (collar && KDRestraint(collar) && KinkyDungeonPlayerTags.get("Collars")) { + if (KDRestraint(collar).name == "DragonCollar") defeat_outfit = "Dragon"; + if (KDRestraint(collar).name == "MaidCollar") defeat_outfit = "Maid"; + if (KDRestraint(collar).name == "ExpCollar") defeat_outfit = "BlueSuitPrison"; + if (KDRestraint(collar).name == "WolfCollar") defeat_outfit = "Wolfgirl"; + if (KDRestraint(collar).name == "MithrilCollar") defeat_outfit = "Elven"; + if (KDRestraint(collar).name == "ObsidianCollar") defeat_outfit = "Obsidian"; + } + if (KDGetMainFaction() && KDFactionProperties[KDGetMainFaction()]?.jailOutfit) defeat_outfit = KDFactionProperties[KDGetMainFaction()]?.jailOutfit; + if (KinkyDungeonStatsChoice.has("KeepOutfit")) defeat_outfit = "Default"; + + KinkyDungeonSetDress(defeat_outfit, "JailUniform"); + KinkyDungeonStripInventory(true); + + if (defeat_outfit != params.defeat_outfit) { + if (!KinkyDungeonInventoryGet(defeat_outfit)) KinkyDungeonInventoryAdd({name: defeat_outfit, type: Outfit, id: KinkyDungeonGetItemID()}); + } else if (!KinkyDungeonInventoryGet("JailUniform")) KinkyDungeonInventoryAdd({name: "JailUniform", type: Outfit, id: KinkyDungeonGetItemID()}); + + + + let outfit = KDOutfit({name: KinkyDungeonCurrentDress}); + KDFixPlayerClothes((KDToggles.NoOutfitPalette ? undefined : outfit?.palette) + || KinkyDungeonPlayer.Palette || KDGetMainFaction() || (KDToggles.ForcePalette ? KDDefaultPalette : "Jail")); + KinkyDungeonDressPlayer(); +} \ No newline at end of file diff --git a/Game/src/prison/KinkyDungeonJailList.ts b/Game/src/prison/KinkyDungeonJailList.ts new file mode 100644 index 000000000..0e684e92c --- /dev/null +++ b/Game/src/prison/KinkyDungeonJailList.ts @@ -0,0 +1,1004 @@ +"use strict"; + +let KDBaseJailTickSub = 0.5; + +let KDJailEvents: Record number, trigger: (guard: any, xx: any, yy: any) => void}> = { + "spawnGuard": { + // Determines the weight + weight: (_guard, _xx, _yy) => { + return 70; + }, + // Occurs when the jail event triggers + trigger: (_g, xx, yy) => { + // Allow the player to sleep 150 turns after the guard shows up + if (KinkyDungeonFlags.get("slept") == -1) { + KinkyDungeonSetFlag("slept", 0); + KinkyDungeonSetFlag("slept", 50); + } + let mainFaction = KDGetMainFaction(); + // Jail tag + let jt = KDMapData.JailFaction?.length > 0 ? KinkyDungeonFactionTag[KDMapData.JailFaction[Math.floor(KDRandom() * KDMapData.JailFaction.length)]] : "jailer"; + let Enemy = KinkyDungeonGetEnemy(["jailGuard", jt], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', [jt, "jailer"], undefined, undefined, ["gagged"]); + if (!Enemy) { + Enemy = KinkyDungeonGetEnemy(["jailGuard", jt], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', [jt, "jailer"], undefined, undefined, ["gagged"]); + if (!Enemy) { + jt = "genericJailer"; + Enemy = KinkyDungeonGetEnemy(["jailGuard", jt], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', [jt, "jailer"]); + } + } + let guard: entity = { + summoned: true, + temporary: true, + Enemy: Enemy, + id: KinkyDungeonGetEnemyID(), + x:xx, + y:yy, + gx: xx - 2, + gy: yy, + CurrentAction: "jailWander", + keys: true, + AI: KDGetAITypeOverride(Enemy, "guard") || "guard", + hp: (Enemy && Enemy.startinghp) ? Enemy.startinghp : Enemy.maxhp, + movePoints: 0, + attackPoints: 0 + }; + if (mainFaction) guard['faction'] = mainFaction; + if (!KinkyDungeonFlags.get("JailIntro")) { + KinkyDungeonSetFlag("JailIntro", -1); + KDStartDialog("PrisonIntro", guard.Enemy.name, true, ""); + } else if (KinkyDungeonFlags.get("JailRepeat")) { + KinkyDungeonSetFlag("JailRepeat", 0); + KDStartDialog("PrisonRepeat", guard.Enemy.name, true, ""); + } + + if (KinkyDungeonPlayerInCell(true)) + KinkyDungeonChangeRep("Ghost", KDBaseJailTickSub + KDGameData.KinkyDungeonPrisonExtraGhostRep); + KDGameData.KinkyDungeonPrisonExtraGhostRep = 0; + + if (KinkyDungeonTilesGet((xx-1) + "," + yy)?.Lock && KinkyDungeonTilesGet((xx-1) + "," + yy).Type == "Door") { + + KinkyDungeonTilesGet((xx-1) + "," + yy).OGLock = KinkyDungeonTilesGet((xx-1) + "," + yy).Lock; + KinkyDungeonTilesGet((xx-1) + "," + yy).Lock = undefined; + } + KDGameData.JailGuard = guard.id; + if (KinkyDungeonEnemyAt(guard.x, guard.y)) KDKickEnemy(KinkyDungeonEnemyAt(guard.x, guard.y)); + guard = KDAddEntity(guard); + if (KinkyDungeonVisionGet(guard.x, guard.y)) + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonGuardAppear").replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "white", 6); + KDGameData.GuardTimer = KDGameData.GuardTimerMax; + KDGameData.GuardSpawnTimer = KDGameData.GuardSpawnTimerMin + Math.floor(KDRandom() * (KDGameData.GuardSpawnTimerMax - KDGameData.GuardSpawnTimerMin)); + }, + }, + "useCurrentGuard": { + // Determines the weight + weight: (_guard, _xx, _yy) => { + return !!_guard ? 70 : 0; + }, + // Occurs when the jail event triggers + trigger: (guard, xx, yy) => { + if (KinkyDungeonPlayerInCell()) { + // Allow the player to sleep 150 turns after the guard shows up + if (KinkyDungeonFlags.get("slept") == -1) { + KinkyDungeonSetFlag("slept", 0); + KinkyDungeonSetFlag("slept", 50); + } + + if (!KinkyDungeonFlags.get("JailIntro")) { + KinkyDungeonSetFlag("JailIntro", -1); + KDStartDialog("PrisonIntro", guard.Enemy.name, true, ""); + } else if (KinkyDungeonFlags.get("JailRepeat")) { + KinkyDungeonSetFlag("JailRepeat", 0); + KDStartDialog("PrisonRepeat", guard.Enemy.name, true, ""); + } + + if (KinkyDungeonTilesGet((xx-1) + "," + yy)?.Lock && KinkyDungeonTilesGet((xx-1) + "," + yy).Type == "Door") { + KinkyDungeonTilesGet((xx-1) + "," + yy).OGLock = KinkyDungeonTilesGet((xx-1) + "," + yy).Lock; + KinkyDungeonTilesGet((xx-1) + "," + yy).Lock = undefined; + } + + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonGuardApproach").replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "white", 6); + + if (KinkyDungeonPlayerInCell(true)) + KinkyDungeonChangeRep("Ghost", KDBaseJailTickSub + KDGameData.KinkyDungeonPrisonExtraGhostRep); + KDGameData.KinkyDungeonPrisonExtraGhostRep = 0; + + + } + + KDGameData.JailGuard = guard.id; + + + guard.CurrentAction = "jailWander"; + + //if (KinkyDungeonVisionGet(guard.x, guard.y)) + KDGameData.GuardTimer = KDGameData.GuardTimerMax; + KDGameData.GuardSpawnTimer = KDGameData.GuardSpawnTimerMin + Math.floor(KDRandom() * (KDGameData.GuardSpawnTimerMax - KDGameData.GuardSpawnTimerMin)); + }, + }, + "spawnRescue": { + // Determines the weight + weight: (_guard, _xx, _yy) => { + return KDCanSpawnShopkeeper() ? 100 : 0; + }, + // Occurs when the jail event triggers + trigger: (_g, _xx, _yy) => { + KDStartDialog("ShopkeeperRescue", "ShopkeeperRescue", true, "", undefined); + }, + }, +}; + + +for (let rescue of Object.entries(KDPrisonRescues)) { + KDJailEvents[rescue[0]] = { + // Determines the weight + weight: (guard: entity, _xx: number, _yy: number) => { + if (guard?.CurrentAction) return 0; + if (KinkyDungeonStatsChoice.get("norescueMode")) return 0; + if (KDGameData.JailTurns <= 70 || KDFactionRelation("Player", rescue[1].faction) < 0.09) return 0; + return 100 * Math.min(0.05, Math.max(0.1, 0.35 * KDFactionRelation("Player", rescue[1].faction)) - 0.005 * (KDGameData.PriorJailbreaks ? (KDGameData.PriorJailbreaks - (KDGameData.PriorJailbreaksDecay || 0)) : 0)); + }, + // Occurs when the jail event triggers + trigger: (_guard: entity, _xx: number, _yy: number) => { + KDStartDialog(rescue[0], rescue[1].speaker, true, "", undefined); + }, + }; +} + +/** + * @param [override] - Override jailing requirement + */ +function KDCanSpawnShopkeeper(override?: boolean): boolean { + return (KinkyDungeonStatsChoice.get("easyMode") && (override || (KinkyDungeonFlags.get("JailIntro") && !KinkyDungeonFlags.get("JailRepeat"))) && !KinkyDungeonFlags.get("refusedShopkeeperRescue") && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)); +} + + +type guardAction_num = (guard: entity, xx: number, yy: number) => number; +type guardAction_bool = (guard: entity, xx: number, yy: number) => boolean; +type guardAction_void = (guard: entity, xx: number, yy: number, delta?: number) => void; + +type guardActionEntry = { + weight: guardAction_num; + assignable?: guardAction_bool; + assign: guardAction_void; + handle: guardAction_void; +} + +let KDGuardActions: Record = { + "jailWander": { + weight: (_guard, _xx, _yy) => { + return 100; + }, + assignable: (guard, _xx, _yy) => { // Can assign a new behavior on top of this one + return KDistChebyshev(guard.gx - guard.x, guard.gy - guard.y) < 1.5; + }, + assign: (_guard, _xx, _yy) => { + + }, + handle: (guard, xx, yy) => { + // Random meandering about the cell, sometimes stopping near the player + if (KDRandom() < 0.2 && guard.idle) { + guard.gx = xx - 2; + if (KDRandom() < 0.5) { + guard.gx = xx; + guard.gy = yy + Math.round(KDRandom() * 2 - 1); + } else + guard.gy = KinkyDungeonPlayerEntity.y; + } + KDGameData.GuardApplyTime = 0; + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 10); + KinkyDungeonSetEnemyFlag(guard, "wander", 10); + }, + }, + "release": { + weight: (_guard, _xx, _yy) => { + let missingJailUniform = KinkyDungeonMissingJailUniform(); + return (KinkyDungeonCheckRelease() >= 0 && KinkyDungeonLockableItems().length == 0 && missingJailUniform.length < 1) ? 1000 : 0; + }, + assign: (guard, _xx, _yy) => { + KinkyDungeonInterruptSleep(); + if (KDGetEffSecurityLevel() >= KDSecurityLevelHiSec + && !(KinkyDungeonAltFloor(KDGameData.RoomType)?.isPrison) + && (!(KDMapData.JailFaction?.length > 0) + || KDFactionRelation("Player", KDMapData.JailFaction[0]) < 0.4)) { + let dd = KDGetHiSecDialogue(guard); + if (dd) + KDStartDialog(dd, guard.Enemy.name, true, "", guard); + } else { + KinkyDungeonSendDialogue(guard, TextGet("KinkyDungeonRemindJailRelease" + KinkyDungeonCheckRelease()).replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "#e7cf1a", 4, 8); + KDGameData.PrisonerState = 'parole'; + guard.CurrentAction = "jailWander"; + KinkyDungeonSetEnemyFlag(guard, "noReLock", 10); + // Unlock all jail doors + for (let T of Object.values(KDMapData.Tiles)) { + if (T.Type == "Door") { + if (T.Lock && T.Jail) { + T.OGLock = T.Lock; + T.Lock = undefined; + T.Type = undefined; + } + } + } + } + }, + handle: (guard, _xx, _yy) => { + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + }, + }, + "jailTease": { + weight: (_guard, _xx, _yy) => { + return 10 + (KinkyDungeonGoddessRep.Ghost + 50); + }, + assign: (guard, _xx, _yy) => { + // Always a random chance to tease + guard.CurrentAction = "jailTease"; + }, + handle: (guard, xx, yy, _delta) => { + let playerHasVibrator = !KDGameData.CurrentVibration && + Array.from(KinkyDungeonAllRestraint()).some(i => KDRestraint(i).allowRemote); + guard.gx = xx - 2; + guard.gy = yy; + if (playerHasVibrator) { + let extraCharge = Math.round(2 + (KinkyDungeonGoddessRep.Ghost + 50) * KDRandom() * 0.15); + KinkyDungeonSendEvent("remoteVibe", {enemy: guard.Enemy.name, power: extraCharge, overcharge: true, noSound: false}); + } else { + let touchesPlayer = KinkyDungeonCheckLOS(KinkyDungeonJailGuard(), KinkyDungeonPlayerEntity, KDistChebyshev(guard.x - KinkyDungeonPlayerEntity.x, guard.y - KinkyDungeonPlayerEntity.y), 1.5, false, false); + if (touchesPlayer) { + KDEnemyTurnToFace(guard, KDPlayer().x, KDPlayer().y); + KDGameData.GuardTimer = Math.max(KDGameData.GuardTimer - 5, 0); + let dmg = KinkyDungeonDealDamage({damage: guard.Enemy.power * 1, type: guard.Enemy.dmgType}, undefined, undefined, true); + if (dmg && dmg.string) + KinkyDungeonSendTextMessage(5, TextGet("Attack" + guard.Enemy.name).replace("DamageTaken", dmg.string), "yellow", 3); + } else { + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + } + + } + if (KDRandom() < 0.02 || (KinkyDungeonStatStamina < 10 && KDRandom() < 0.1)) + guard.CurrentAction = "jailWander"; + } + }, + "bindings": { + weight: (_guard, _xx, _yy) => { + let missingJailUniform = KinkyDungeonMissingJailUniform(); + let tooMuchRestraint = KinkyDungeonTooMuchRestraint(); + let lockableRestraint = KinkyDungeonLockableItems(); + + return ( + lockableRestraint.length > 0 + || missingJailUniform.length > 0 + || (tooMuchRestraint.length > 0 && KDGameData.JailRemoveRestraintsTimer > KinkyDungeonJailRemoveRestraintsTimerMin)) ? (100 + (missingJailUniform.length > 0 ? 100 : 0)) : 0; + }, + assign: (guard, _xx, _yy) => { + let missingJailUniform = KinkyDungeonMissingJailUniform(); + let tooMuchRestraint = KinkyDungeonTooMuchRestraint(); + let lockableRestraint = KinkyDungeonLockableItems(); + + if (missingJailUniform.length > 0 || KDRandom() < 0.2) { + if (tooMuchRestraint.length > 0 && (KDRandom() < 0.5 || missingJailUniform.length < 1) && KDGameData.JailRemoveRestraintsTimer > KinkyDungeonJailRemoveRestraintsTimerMin) { + let group = ""; + if (tooMuchRestraint.includes("ItemMouth3")) group = "ItemMouth3"; + else if (tooMuchRestraint.includes("ItemMouth2")) group = "ItemMouth2"; + else if (tooMuchRestraint.includes("ItemMouth")) group = "ItemMouth"; + else group = tooMuchRestraint[Math.floor(tooMuchRestraint.length * KDRandom())]; + if (group) { + guard.CurrentAction = "jailRemoveRestraints"; + guard.CurrentRestraintSwapGroup = group; + KDGameData.GuardTimer = Math.max(0, KDGameData.GuardTimer - 20); + } + + KinkyDungeonSendDialogue(guard, TextGet("KinkyDungeonJailerRemove").replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "#e7cf1a", 4, 3); + } else if (missingJailUniform.length > 0) { + let group = ""; + if (missingJailUniform.includes("ItemMouth3")) group = "ItemMouth3"; + else if (missingJailUniform.includes("ItemMouth2")) group = "ItemMouth2"; + else if (missingJailUniform.includes("ItemMouth")) group = "ItemMouth"; + else group = missingJailUniform[Math.floor(missingJailUniform.length * KDRandom())]; + if (group) { + guard.CurrentAction = "jailAddRestraints"; + guard.CurrentRestraintSwapGroup = group; + KDGameData.GuardTimer = Math.max(0, KDGameData.GuardTimer - 20); + } + + KinkyDungeonSendDialogue(guard, TextGet("KinkyDungeonJailerAdd").replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "#e7cf1a", 4, 3); + } + } else if (lockableRestraint.length > 0) { + let group = ""; + if (lockableRestraint.includes("ItemMouth3")) group = "ItemMouth3"; + else if (lockableRestraint.includes("ItemMouth2")) group = "ItemMouth2"; + else if (lockableRestraint.includes("ItemMouth")) group = "ItemMouth"; + else group = lockableRestraint[Math.floor(lockableRestraint.length * KDRandom())]; + if (group) { + guard.CurrentAction = "jailLockRestraints"; + guard.CurrentRestraintSwapGroup = group; + KDGameData.GuardTimer = Math.max(0, KDGameData.GuardTimer - 10); + } + + KinkyDungeonSendDialogue(guard, TextGet("KinkyDungeonJailerLock").replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "#e7cf1a", 4, 3); + } + }, + handle: (_guard, _xx, _yy, _delta) => { + // Dummy, this one assigns to a different style + }, + }, + "jailRemoveRestraints": { + weight: (_guard, _xx, _yy) => { + return 0; // Assigned by JailBindings + }, + assign: (_guard, _xx, _yy) => { + // Assigned by JailBindings + }, + handle: (guard, _xx, _yy, delta) => { + let applyTime = 2; + let playerDist = Math.sqrt((guard.x - KinkyDungeonPlayerEntity.x)*(guard.x - KinkyDungeonPlayerEntity.x) + (guard.y - KinkyDungeonPlayerEntity.y)*(guard.y - KinkyDungeonPlayerEntity.y)); + let touchesPlayer = KinkyDungeonCheckLOS(guard, KinkyDungeonPlayerEntity, playerDist, 1.5, false, false); + if (touchesPlayer) { + KDGameData.GuardTimer = Math.max(KDGameData.GuardTimer, 2); + let oldRestraintItem = KinkyDungeonGetRestraintItem(guard.CurrentRestraintSwapGroup); + if (KDGameData.GuardApplyTime > applyTime) { + if (oldRestraintItem && KDRestraint(oldRestraintItem) && !KDRestraint(oldRestraintItem).noJailRemove) { + KinkyDungeonRemoveRestraint(KDRestraint(oldRestraintItem).Group, false, false, false); + let msg = TextGet("KinkyDungeonRemoveRestraints") + .replace("EnemyName", TextGet("Name" + guard.Enemy.name)); + //let msg = TextGet("Attack" + guard.Enemy.name + "RemoveRestraints"); + KinkyDungeonSetFlag("suspendJailTick", 2); + if (oldRestraintItem) msg = msg.replace("OldRestraintName", TextGet("Restraint"+oldRestraintItem.name)); + KinkyDungeonSendTextMessage(5, msg, "yellow", 1); + } + guard.CurrentAction = "jailWander"; + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + KDGameData.GuardApplyTime = 0; + } else if (oldRestraintItem) { + KinkyDungeonSetFlag("suspendJailTick", 2); + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonJailerStartRemoving") + .replace("EnemyName", TextGet("Name" + guard.Enemy.name)) + .replace("RestraintName", TextGet("Restraint" + oldRestraintItem.name)), "yellow", 2, true); + KDGameData.GuardApplyTime += delta; + } else { + guard.CurrentAction = "jailWander"; + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + KDGameData.GuardApplyTime = 0; + } + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + } else { + KDGameData.GuardTimer = Math.max(KDGameData.GuardTimer, 2); + KDGameData.GuardApplyTime = 0; + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + } + }, + }, + "jailAddRestraints": { + weight: (_guard, _xx, _yy) => { + return 0; // Assigned by JailBindings + }, + assign: (_guard, _xx, _yy) => { + // Assigned by JailBindings + }, + handle: (guard, _xx, _yy, delta) => { + let applyTime = 2; + let playerDist = Math.sqrt((guard.x - KinkyDungeonPlayerEntity.x)*(guard.x - KinkyDungeonPlayerEntity.x) + (guard.y - KinkyDungeonPlayerEntity.y)*(guard.y - KinkyDungeonPlayerEntity.y)); + let touchesPlayer = KinkyDungeonCheckLOS(guard, KinkyDungeonPlayerEntity, playerDist, 1.5, false, false); + if (touchesPlayer) { + KDGameData.GuardTimer = Math.max(KDGameData.GuardTimer, 7); + let jrest = KinkyDungeonGetJailRestraintForGroup(guard.CurrentRestraintSwapGroup); + let newRestraint = jrest.restraint; + if (KDGameData.GuardApplyTime > applyTime) { + if (newRestraint) { + KinkyDungeonSetFlag("suspendJailTick", 2); + let oldRestraintItem = KinkyDungeonGetRestraintItem(guard.CurrentRestraintSwapGroup); + let added = KinkyDungeonAddRestraintIfWeaker(newRestraint, Math.floor(KDGetEffLevel() * 0.5), + true, undefined, undefined, undefined, undefined, KDGetFaction(KinkyDungeonJailGuard()), + KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, KinkyDungeonJailGuard(), false, undefined, undefined, undefined, (jrest.variant && KDApplyVariants[jrest.variant]) ? KDApplyVariants[jrest.variant] : undefined); + if (added) { + let restraintModification = oldRestraintItem ? "ChangeRestraints" : "AddRestraints"; + let msg = TextGet("KinkyDungeon" + restraintModification).replace("EnemyName", TextGet("Name" + guard.Enemy.name)); + if (oldRestraintItem) msg = msg.replace("OldRestraintName", TextGet("Restraint"+oldRestraintItem.name)); + msg = msg.replace("NewRestraintName", TextGet("Restraint"+newRestraint.name)); + KinkyDungeonSendTextMessage(5, msg, "yellow", 1); + } else + KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonJailerCheck"), "yellow", 3, true); + } + guard.CurrentAction = "jailWander"; + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + KDGameData.GuardApplyTime = 0; + } else if (newRestraint) { + KinkyDungeonSetFlag("suspendJailTick", 2); + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonJailerStartAdding") + .replace("RestraintName", TextGet("Restraint" + newRestraint.name)) + .replace("EnemyName", TextGet("Name" + guard.Enemy.name)), + "yellow", 2, true); + + KDGameData.GuardApplyTime += delta; + } + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + } else { + KDGameData.GuardTimer = Math.max(KDGameData.GuardTimer, 7); + KDGameData.GuardApplyTime = 0; + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + } + }, + }, + "jailLockRestraints": { + weight: (_guard, _xx, _yy) => { + return 0; // Assigned by JailBindings + }, + assign: (_guard, _xx, _yy) => { + // Assigned by JailBindings + }, + handle: (guard, _xx, _yy, delta) => { + let applyTime = 2; + let playerDist = Math.sqrt((guard.x - KinkyDungeonPlayerEntity.x)*(guard.x - KinkyDungeonPlayerEntity.x) + (guard.y - KinkyDungeonPlayerEntity.y)*(guard.y - KinkyDungeonPlayerEntity.y)); + let touchesPlayer = KinkyDungeonCheckLOS(guard, KinkyDungeonPlayerEntity, playerDist, 1.5, false, false); + if (touchesPlayer) { + + KDGameData.GuardTimer = Math.max(KDGameData.GuardTimer, 2); + let oldRestraintItem = KinkyDungeonGetRestraintItem(guard.CurrentRestraintSwapGroup); + if (KDGameData.GuardApplyTime > applyTime) { + if (oldRestraintItem && !oldRestraintItem.lock && KinkyDungeonIsLockable(KDRestraint(oldRestraintItem))) { + let lock = KinkyDungeonGenerateLock(true, KDGetEffLevel(),false, undefined, {enemy: KinkyDungeonJailGuard()}); + KinkyDungeonLock(oldRestraintItem, lock); + KinkyDungeonSetFlag("suspendJailTick", 2); + let msg = TextGet("KinkyDungeonJailerFinishLocking") + .replace("EnemyName", TextGet("Name" + guard.Enemy.name)) + .replace("RestraintName", TextGet("Restraint"+oldRestraintItem.name)) + .replace("LockType", TextGet("Kinky" + lock + "Lock")); + KinkyDungeonSendTextMessage(5, msg, "yellow", 1); + } + guard.CurrentAction = "jailWander"; + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + KDGameData.GuardApplyTime = 0; + } else if (oldRestraintItem) { + KinkyDungeonSetFlag("suspendJailTick", 2); + KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonJailerStartLocking") + .replace("EnemyName", TextGet("Name" + guard.Enemy.name)) + .replace("RestraintName", TextGet("Restraint" + oldRestraintItem.name)), "yellow", 2, true); + KDGameData.GuardApplyTime += delta; + } else { + guard.CurrentAction = "jailWander"; + guard.gx = guard.x; + guard.gy = guard.y; + KDGameData.GuardApplyTime = 0; + } + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + } else { + KDGameData.GuardTimer = Math.max(KDGameData.GuardTimer, 2); + KDGameData.GuardApplyTime = 0; + guard.gx = KinkyDungeonPlayerEntity.x; + guard.gy = KinkyDungeonPlayerEntity.y; + } + }, + }, + "jailLeashTour": { + weight: (_guard, _xx, _yy) => { + KDGameData.KinkyDungeonJailTourTimer = 0; + return (KDGameData.SleepTurns < 1 && KDGameData.KinkyDungeonJailTourTimer < 1 && KinkyDungeonGoddessRep.Ghost >= -45) ? (5 + Math.max(0, (50 + KinkyDungeonGoddessRep.Ghost)/5)) : 0; + }, + assign: (guard, _xx, _yy) => { + guard.RemainingJailLeashTourWaypoints = 2 + Math.ceil(KDRandom() * 4); + guard.CurrentAction = "jailLeashTour"; + guard.KinkyDungeonJailTourInfractions = 0; + KinkyDungeonInterruptSleep(); + let msg = TextGet("KinkyDungeonRemindJailTourStart").replace("EnemyName", TextGet("Name" + guard.Enemy.name)); + + KinkyDungeonSendDialogue(guard, msg, "#e7cf1a", 4, 9); + }, + handle: (_guard, xx, yy, delta) => { + if (KDGameData.KinkyDungeonJailTourTimer > 0) { + KDGameData.KinkyDungeonJailTourTimer = Math.max(0, KDGameData.KinkyDungeonJailTourTimer - delta); + } + KinkyDungeonSetFlag("nojailbreak", 2); + KinkyDungeonSetFlag("noclosedoors", 2); + KinkyDungeonSetFlag("notickguardtimer", 7); + KinkyDungeonHandleLeashTour(xx, yy, "tour"); + }, + }, + "jailLeashTransfer": { + weight: (_guard, _xx, _yy) => { + KDGameData.KinkyDungeonJailTourTimer = 0; + return (KDGameData.JailTurns > 30 && KinkyDungeonRandomJailPoint(["jail"], [KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)])) ? 5 : 0; + }, + assign: (guard, _xx, _yy) => { + guard.RemainingJailLeashTourWaypoints = 1; + guard.CurrentAction = "jailLeashTransfer"; + guard.KinkyDungeonJailTourInfractions = 0; + let nearestJail = KinkyDungeonRandomJailPoint(["jail"], [KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)]); + if (nearestJail) { + guard.NextJailLeashTourWaypointX = nearestJail.x; + guard.NextJailLeashTourWaypointY = nearestJail.y; + guard.gx = guard.NextJailLeashTourWaypointX; + guard.gy = guard.NextJailLeashTourWaypointY; + } + KinkyDungeonInterruptSleep(); + let msg = TextGet("KinkyDungeonRemindJailTourStartCell").replace("EnemyName", TextGet("Name" + guard.Enemy.name)); + + KinkyDungeonSendDialogue(guard, msg, "#e7cf1a", 4, 9); + }, + handle: (_guard, xx, yy, delta) => { + if (KDGameData.KinkyDungeonJailTourTimer > 0) { + KDGameData.KinkyDungeonJailTourTimer = Math.max(0, KDGameData.KinkyDungeonJailTourTimer - delta); + } + KinkyDungeonSetFlag("nojailbreak", 2); + KinkyDungeonSetFlag("noclosedoors", 2); + KinkyDungeonSetFlag("notickguardtimer", 7); + KinkyDungeonHandleLeashTour(xx, yy, "transfer"); + }, + }, +}; + + +let KinkyDungeonJailRemoveRestraintsTimerMin = 90; +let KinkyDungeonJailedOnce = false; +let KDJailReleaseTurns = [ + {minSub: 0, releaseTurns: 250}, + {minSub: 5, releaseTurns: 140}, + {minSub: 40, releaseTurns: 80}, + {minSub: 90, releaseTurns: 40}, +]; + +let KDSecurityLevelHiSec = 0; + +let KDJailOutfits: Record = { + "jailer": { + overridelowerpriority: false, + priority: -1, + jail: true, + parole: false, + restraints: [ + {Name: "WristShackles", Level: 0}, + {Name: "TrapGag", Level: 15}, + {Name: "Stuffing", Level: 25}, + {Name: "FeetShackles", Level: 25}, + {Name: "PrisonBelt", Level: 30}, + {Name: "TrapPlug", Level: 30, Condition: "Plug"}, + {Name: "LegShackles", Level: 35}, + {Name: "HighsecLegbinder", Level: 35}, + {Name: "TrapBlindfold", Level: 35, Condition: "NoBlindfolds"}, + {Name: "HighsecBallGag", Level: 40}, + {Name: "HighsecShackles", Level: 40}, + {Name: "TrapArmbinder", Level: 40, Condition: "LessArmbinders", Priority: "MoreArmbinders"}, + {Name: "TrapBoxbinder", Level: 40, Condition: "LessBoxbinders", Priority: "MoreBoxbinders"}, + {Name: "TrapPlug2", Level: 45, Condition: "Plug"}, + {Name: "TrapYoke", Level: 50, Condition: "LessYokes", Priority: "MoreYokes"}, + {Name: "HighsecBallGag", Level: 50, Variant: "AntiMagic", Condition: "Mage"}, + {Name: "TrapFiddle", Level: 60, Condition: "LessYokes", Priority: "MoreYokes"}, + {Name: "TrapPlug3", Level: 60, Condition: "Plug"}, + {Name: "TrapBoots", Level: 60}, + {Name: "HighsecMuzzle", Level: 70}, + {Name: "HighsecArmbinder", Level: 70, Condition: "LessArmbinders", Priority: "MoreArmbinders"}, + {Name: "HighsecBoxbinder", Level: 70, Condition: "LessBoxbinders", Priority: "MoreBoxbinders"}, + {Name: "HighsecStraitjacket", Level: 70, Condition: "LessJackets", Priority: "MoreJackets"}, + {Name: "TrapPlug4", Level: 75, Condition: "Plug"}, + {Name: "HighsecLegbinder", Level: 95}, + {Name: "TrapPlug5", Level: 100, Condition: "Plug"}, + + {Name: "WristLink", Level: 0}, + {Name: "AnkleLink", Level: 35}, + {Name: "ThighLink", Level: 10}, + {Name: "ElbowLink", Level: 60}, + ], + }, + "ropeRestraints": { + overridelowerpriority: false, + priority: 1, + jail: true, + parole: true, + restraints: [ + {Name: "RopeSnakeCuffs", Level: 0}, + {Name: "RopeSnakeCuffsAdv", Level: 5}, + {Name: "RopeSnakeCrotch", Level: 10}, + {Name: "RopeSnakeArmsWrist", Level: 20}, + {Name: "RopeSnakeArmsBoxtie", Level: 20}, + {Name: "RopeSnakeFeet", Level: 20}, + {Name: "RopeSnakeLegs", Level: 30}, + {Name: "RopeSnakeCuffsAdv2", Level: 35}, + {Name: "RopeSnakeFeet2", Level: 40}, + {Name: "RopeSnakeLegs2", Level: 50}, + {Name: "RopeSnakeFeet3", Level: 60}, + {Name: "RopeSnakeLegs3", Level: 70}, + {Name: "RopeSnakeHogtieLink", Level: 80}, + ], + }, + "ropeMagicWeak": { + overridelowerpriority: false, + priority: 1, + jail: true, + parole: true, + restraints: [ + {Name: "WeakMagicRopeCuffs", Level: 0}, + {Name: "WeakMagicRopeCuffsAdv", Level: 5}, + {Name: "WeakMagicRopeCrotch", Level: 10}, + {Name: "WeakMagicRopeArmsWrist", Level: 20}, + {Name: "WeakMagicRopeArmsBoxtie", Level: 20}, + {Name: "WeakMagicRopeFeet", Level: 20}, + {Name: "WeakMagicRopeLegs", Level: 30}, + {Name: "WeakMagicRopeCuffsAdv2", Level: 35}, + {Name: "WeakMagicRopeFeet2", Level: 40}, + {Name: "WeakMagicRopeLegs2", Level: 50}, + {Name: "WeakMagicRopeFeet3", Level: 60}, + {Name: "WeakMagicRopeLegs3", Level: 70}, + {Name: "WeakMagicRopeHogtieLink", Level: 90}, + ], + }, + "ropeMagicStrong": { + overridelowerpriority: false, + priority: 1, + jail: true, + parole: true, + restraints: [ + {Name: "StrongMagicRopeCuffs", Level: 0}, + {Name: "StrongMagicRopeCuffsAdv", Level: 5}, + {Name: "StrongMagicRopeCrotch", Level: 10}, + {Name: "StrongMagicRopeFeet", Level: 20}, + {Name: "StrongMagicRopeArmsWrist", Level: 20}, + {Name: "StrongMagicRopeArmsBoxtie", Level: 20}, + {Name: "StrongMagicRopeLegs", Level: 30}, + {Name: "StrongMagicRopeCuffsAdv2", Level: 35}, + {Name: "StrongMagicRopeFeet2", Level: 40}, + {Name: "StrongMagicRopeLegs2", Level: 50}, + {Name: "StrongMagicRopeFeet3", Level: 60}, + {Name: "StrongMagicRopeLegs3", Level: 70}, + {Name: "StrongMagicRopeHogtieLink", Level: 100}, + ], + }, + "mithrilRope": { + overridelowerpriority: false, + priority: 1, + jail: true, + parole: true, + restraints: [ + {Name: "MithrilRopeCuffs", Level: 0}, + {Name: "MithrilRopeCuffsAdv", Level: 5}, + {Name: "MithrilRopeCrotch", Level: 10}, + {Name: "MithrilRopeArmsWrist", Level: 20}, + {Name: "MithrilRopeArmsBoxtie", Level: 20}, + {Name: "MithrilRopeFeet", Level: 20}, + {Name: "MithrilRopeLegs", Level: 30}, + {Name: "MithrilRopeCuffsAdv2", Level: 35}, + {Name: "MithrilRopeFeet2", Level: 40}, + {Name: "MithrilRopeLegs2", Level: 50}, + {Name: "MithrilRopeFeet3", Level: 60}, + {Name: "MithrilRopeLegs3", Level: 70}, + {Name: "MithrilRopeHogtieLink", Level: 100}, + ], + }, + "celestialRopes": { + overridelowerpriority: false, + priority: 1, + jail: true, + parole: true, + restraints: [ + {Name: "CelestialRopeCuffs", Level: 0}, + {Name: "CelestialRopeCuffsAdv", Level: 5}, + {Name: "CelestialRopeCrotch", Level: 10}, + {Name: "CelestialRopeFeet", Level: 20}, + {Name: "CelestialRopeArmsWrist", Level: 20}, + {Name: "CelestialRopeArmsBoxtie", Level: 20}, + {Name: "CelestialRopeLegs", Level: 30}, + {Name: "CelestialRopeCuffsAdv2", Level: 35}, + {Name: "CelestialRopeFeet2", Level: 40}, + {Name: "CelestialRopeLegs2", Level: 50}, + {Name: "CelestialRopeFeet3", Level: 60}, + {Name: "CelestialRopeLegs3", Level: 70}, + {Name: "CelestialRopeHogtieLink", Level: 100}, + ], + }, + + + "maid": { + overridelowerpriority: false, + priority: 1, + jail: true, + parole: false, + restraints: [ + {Name: "TrapMittens", Level: 0}, + {Name: "MaidCBelt", Level: 0}, + {Name: "TrapGag", Level: 15}, + {Name: "Stuffing", Level: 20}, + {Name: "MaidGag", Level: 30}, + {Name: "TrapArmbinder", Level: 30, Condition: "LessArmbinders", Priority: "MoreArmbinders"}, + {Name: "TrapBoxbinder", Level: 30, Condition: "LessBoxbinders", Priority: "MoreBoxbinders"}, + {Name: "TrapYoke", Level: 35, Condition: "LessYokes", Priority: "MoreYokes"}, + {Name: "TrapFiddle", Level: 35, Condition: "LessYokes", Priority: "MoreYokes"}, + {Name: "MaidMuzzle", Level: 40}, + {Name: "MaidAnkleCuffs", Level: 40}, + {Name: "MaidJacket", Level: 60, Condition: "LessJackets", Priority: "MoreJackets"}, + {Name: "HeavyYoke", Level: 75, Condition: "LessYokes", Priority: "MoreYokes"}, + {Name: "MaidDress", Level: 100}, + {Name: "MaidTransportJacket", Level: 120, Condition: "LessJackets", Priority: "MoreJackets"}, + {Name: "MaidBelt", Level: 120}, + ], + }, + + "latexRestraints": { + overridelowerpriority: false, + priority: 1, + jail: true, + parole: false, + restraints: [ + {Name: "LatexBallGag", Level: 0}, + {Name: "LatexBallGag", Level: 10, Variant: "AntiMagic", Condition: "Mage"}, + {Name: "PVCHarness", Level: 30}, + {Name: "LatexArmbinder", Level: 30, Condition: "LessArmbinders", Priority: "MoreArmbinders"}, + {Name: "LatexBoxbinder", Level: 30, Condition: "LessBoxbinders", Priority: "MoreBoxbinders"}, + {Name: "LatexBoots", Level: 40}, + {Name: "LatexCatsuit", Level: 40}, + {Name: "LatexStraitjacket", Level: 60, Condition: "LessJackets", Priority: "MoreJackets"}, + {Name: "LatexOTNGagHeavy", Level: 60}, + {Name: "LatexCorset", Level: 65}, + {Name: "LatexLegbinder", Level: 80}, + {Name: "KiguMaskSmile", Level: 100, Condition: "NoKigu"}, + {Name: "ExpCollar", Level: 120}, + {Name: "LatexTransportJacket", Level: 120, Condition: "LessJackets", Priority: "MoreJackets"}, + ], + }, + "wolfRestraints": { + overridelowerpriority: true, + priority: 2, + jail: true, + parole: false, + restraints: [ + {Name: "WolfCuffs", Level: 0}, + {Name: "WolfCollar", Level: 0}, + {Name: "WolfAnkleCuffs", Level: 10}, + {Name: "WolfHarness", Level: 20}, + {Name: "WolfMittens", Level: 20}, + {Name: "WolfArmbinder", Level: 30, Condition: "LessBoxbinders", Priority: "MoreBoxbinders"}, + {Name: "WolfBallGag", Level: 30}, + {Name: "WolfBallGag", Level: 45, Variant: "AntiMagic", Condition: "Mage"}, + {Name: "WolfPanties", Level: 60}, + {Name: "ControlHarness", Level: 80}, + {Name: "WolfStrongArmbinder", Level: 90, Condition: "LessArmbinders", Priority: "MoreArmbinders"}, + {Name: "WolfPetsuit", Level: 120, Condition: "NoPetsuit"}, + ], + }, + "expRestraints": { + overridelowerpriority: true, + priority: 2, + jail: true, + parole: false, + restraints: [ + {Name: "ExpArmbinder", Level: 0, Condition: "LessBoxbinders", Priority: "MoreBoxbinders"}, + {Name: "LatexCatsuit", Level: 0}, + {Name: "LatexBallGag", Level: 5}, + {Name: "LatexBallGag", Level: 25, Variant: "AntiMagic", Condition: "Mage"}, + {Name: "BlacksteelAnkleCuffs", Level: 30}, + {Name: "ExpBoots", Level: 50}, + {Name: "ExpArmbinderHarness", Level: 60}, + {Name: "ExpCollar", Level: 80}, + ], + }, + "dragonRestraints": { + overridelowerpriority: true, + priority: 2, + jail: true, + parole: false, + restraints: [ + {Name: "DragonCollar", Level: 0}, + {Name: "ScaleArmCuffs", Level: 0}, + {Name: "ScaleAnkleCuffs", Level: 10}, + {Name: "DragonStraps", Level: 20}, + {Name: "DragonBallGag", Level: 30}, + {Name: "DragonBallGag", Level: 45, Variant: "AntiMagic", Condition: "Mage"}, + {Name: "DragonArmbinder", Level: 50, Condition: "LessBoxbinders", Priority: "MoreBoxbinders"}, + {Name: "DragonMuzzleGag", Level: 60}, + {Name: "ScaleLegCuffs", Level: 60}, + {Name: "DragonBoots", Level: 90}, + {Name: "DragonStrongStraps", Level: 100, Condition: "LessBoxbinders", Priority: "MoreBoxbinders"}, + ], + }, + "dollsmith": { + overridelowerpriority: true, + priority: 7, + jail: true, + parole: true, + restraints: [ + {Name: "ControlHarness", Level: 0}, + {Name: "CyberBelt", Level: 0}, + {Name: "CyberBra", Level: 0}, + {Name: "CyberArmCuffs", Level: 0}, + {Name: "CyberMittens", Level: 0}, + {Name: "LatexCatsuit", Level: 0}, + {Name: "TrackingCollar", Level: 20}, + {Name: "CyberBallGag", Level: 20}, + {Name: "CyberLegCuffs", Level: 30}, + {Name: "CyberPlugGag", Level: 40}, + {Name: "CyberAnkleCuffs", Level: 40}, + {Name: "CyberBallGag", Level: 45, Variant: "AntiMagic", Condition: "Mage"}, + {Name: "CyberHeels", Level: 49}, + {Name: "CyberDollJacket", Level: 60, Condition: "LessJackets", Priority: "MoreJackets"}, + {Name: "CyberMuzzle", Level: 75}, + ], + }, + "kittyRestraints": { + overridelowerpriority: false, + priority: 2, + jail: true, + parole: true, + restraints: [ + {Name: "KittyPaws", Level: 0}, + {Name: "KittyGag", Level: 10}, + {Name: "KittyGag", Level: 25, Variant: "AntiMagic", Condition: "Mage"}, + {Name: "KittyMuzzle", Level: 45}, + {Name: "KittyBlindfold", Level: 60, Condition: "NoBlindfolds"}, + {Name: "KittySuit", Level: 80}, + {Name: "KittySuit", Level: 100}, + {Name: "KittyPetSuit", Level: 120, Condition: "NoPetsuit"}, + ], + }, + "obsidianRestraints": { + overridelowerpriority: false, + priority: 2, + jail: true, + parole: true, + restraints: [ + {Name: "ObsidianCollar", Level: 0}, + {Name: "ObsidianArmCuffs", Level: 0}, + {Name: "ObsidianAnkleCuffs", Level: 10}, + {Name: "ObsidianGag", Level: 30}, + {Name: "ObsidianGag", Level: 55, Variant: "AntiMagic", Condition: "Mage"}, + {Name: "ObsidianLegCuffs", Level: 60}, + {Name: "ShadowLatexArmbinder", Level: 70, Condition: "LessArmbinders", Priority: "MoreArmbinders"}, + {Name: "ShadowLatexBoxbinder", Level: 70, Condition: "LessBoxbinders", Priority: "MoreBoxbinders"}, + {Name: "ShadowLatexStraitjacket", Level: 75, Condition: "LessJackets", Priority: "MoreJackets"}, + {Name: "ShadowLatexHeels", Level: 85}, + {Name: "ShadowLatexLegbinder", Level: 100}, + {Name: "ShadowLatexStrongArmbinder", Level: 120, Condition: "LessArmbinders", Priority: "MoreArmbinders"}, + {Name: "ShadowLatexStrongBoxbinder", Level: 120, Condition: "LessBoxbinders", Priority: "MoreBoxbinders"}, + {Name: "ShadowLatexStrongJacket", Level: 120, Condition: "LessJackets", Priority: "MoreJackets"}, + + ], + }, + "mithrilRestraints": { + overridelowerpriority: false, + priority: 1.5, + jail: true, + parole: true, + restraints: [ + {Name: "MithrilArmCuffs", Level: 0}, + {Name: "MithrilCollar", Level: 0}, + {Name: "MithrilAnkleCuffs", Level: 10}, + {Name: "MithrilLegCuffs", Level: 60}, + ], + }, + "leatherRestraints": { + overridelowerpriority: false, + priority: 1, + jail: true, + parole: true, + restraints: [ + {Name: "LeatherArmCuffs", Level: 5}, + {Name: "TrapGag", Level: 10}, + {Name: "TrapMittens", Level: 20}, + {Name: "PanelGag", Level: 20}, + {Name: "PanelGag", Level: 35, Variant: "AntiMagic", Condition: "Mage"}, + {Name: "SturdyLeatherBeltsArms", Level: 40}, + {Name: "TrapHarness", Level: 45}, + {Name: "TrapArmbinder", Level: 50, Condition: "LessArmbinders", Priority: "MoreArmbinders"}, + {Name: "TrapBoxbinder", Level: 50, Condition: "LessBoxbinders", Priority: "MoreBoxbinders"}, + {Name: "TrapLegbinder", Level: 60}, + {Name: "SturdyLeatherBeltsFeet", Level: 70}, + {Name: "SturdyLeatherBeltsLegs", Level: 80}, + {Name: "LeatherHood", Level: 110, Condition: "SenseDepHood"}, + {Name: "LeatherMask", Level: 110, Condition: "SenseDepMask"}, + ], + }, + "dressRestraints": { + overridelowerpriority: false, + priority: 1, + jail: true, + parole: true, + restraints: [ + {Name: "BindingDress", Level: 0}, + {Name: "DressGag", Level: 40}, + {Name: "NippleClamps", Level: 40}, + {Name: "DressBra", Level: 60}, + {Name: "DressCorset", Level: 60}, + {Name: "DressMuzzle", Level: 60}, + {Name: "MagicBelt", Level: 80}, + {Name: "KiguMaskSmile", Level: 100, Condition: "NoKigu"}, + ], + }, +}; + +KDJailOutfits.alchemist = JSON.parse(JSON.stringify(KDJailOutfits.latexRestraints)); +KDJailOutfits.apprentice = JSON.parse(JSON.stringify(KDJailOutfits.ropeMagicWeak)); +KDJailOutfits.witch = JSON.parse(JSON.stringify(KDJailOutfits.ropeMagicStrong)); +KDJailOutfits.elf = JSON.parse(JSON.stringify(KDJailOutfits.mithrilRope)); +KDJailOutfits.fuuka = JSON.parse(JSON.stringify(KDJailOutfits.celestialRopes)); +KDJailOutfits.angel = JSON.parse(JSON.stringify(KDJailOutfits.celestialRopes)); +KDJailOutfits.robot = JSON.parse(JSON.stringify(KDJailOutfits.dollsmith)); +KDJailOutfits.cyborg = JSON.parse(JSON.stringify(KDJailOutfits.dollsmith)); + +let KDJailConditions: Record boolean> = { + Mage: (_r) => { + return KinkyDungeonStatManaMax > 17; + }, + Warrior: (_r) => { + return KinkyDungeonStatWillMax > 17; + }, + Rogue: (_r) => { + return KinkyDungeonStatStaminaMax > 17; + }, + Kinky: (_r) => { + return KinkyDungeonStatDistractionMax > 17; + }, + NoUnmasked: (_r) => { + return !KinkyDungeonStatsChoice.get("Unmasked"); + }, + Hood: (_r) => { + return !KinkyDungeonStatsChoice.get("NoHood"); + }, + Plug: (_r) => { + return !KinkyDungeonPlayerTags.get("SupremeBelt"); + }, + Clamp: (_r) => { + return !KinkyDungeonPlayerTags.get("SupremeBra"); + }, + SenseDep: (_r) => { + return !KinkyDungeonStatsChoice.get("NoSenseDep"); + }, + SenseDepMask: (_r) => { + return !KinkyDungeonStatsChoice.get("NoSenseDep") && !KinkyDungeonStatsChoice.get("Unmasked"); + }, + SenseDepHood: (_r) => { + return !KinkyDungeonStatsChoice.get("NoSenseDep") && !KinkyDungeonStatsChoice.get("NoHood"); + }, + ChastityBra: (_r) => { + return !KinkyDungeonStatsChoice.get("FreeBoob2") && (KinkyDungeonPlayerTags.get("ItemNipples") || !KinkyDungeonStatsChoice.get("FreeBoob1")); + }, + NoPetsuit: (_r) => { + return !KinkyDungeonStatsChoice.get("NoPet"); + }, + NoKigu: (_r) => { + return !KinkyDungeonStatsChoice.get("NoKigu"); + }, + NoBlindfolds: (_r) => { + return !KinkyDungeonStatsChoice.get("NoBlindfolds"); + }, + LessArmbinders: (_r) => { + return !KinkyDungeonStatsChoice.get("Less_Armbinders") + || (KinkyDungeonStatsChoice.get("Less_Jackets") + && KinkyDungeonStatsChoice.get("Less_Boxbinders") + && KinkyDungeonStatsChoice.get("Less_Yokes")); + }, + LessBoxbinders: (_r) => { + return !KinkyDungeonStatsChoice.get("Less_Boxbinders") + || (KinkyDungeonStatsChoice.get("Less_Jackets") + && KinkyDungeonStatsChoice.get("Less_Armbinders") + && KinkyDungeonStatsChoice.get("Less_Yokes")); + }, + LessJackets: (_r) => { + return !KinkyDungeonStatsChoice.get("Less_Jackets") + || (KinkyDungeonStatsChoice.get("Less_Armbinders") + && KinkyDungeonStatsChoice.get("Less_Boxbinders") + && KinkyDungeonStatsChoice.get("Less_Yokes")); + }, + LessYokes: (_r) => { + return !KinkyDungeonStatsChoice.get("Less_Yokes") + || (KinkyDungeonStatsChoice.get("Less_Jackets") + && KinkyDungeonStatsChoice.get("Less_Boxbinders") + && KinkyDungeonStatsChoice.get("Less_Armbinders")); + }, + MoreArmbinders: (_r) => { + return KinkyDungeonStatsChoice.get("More_Armbinders") || KinkyDungeonFlags.get("prefer_armbinder"); + }, + MoreYokes: (_r) => { + return KinkyDungeonStatsChoice.get("More_Yokes") || KinkyDungeonFlags.get("prefer_yoke"); + }, + MoreBoxbinders: (_r) => { + return KinkyDungeonStatsChoice.get("More_Boxbinders") || KinkyDungeonFlags.get("prefer_boxbinder"); + }, + MoreJackets: (_r) => { + return KinkyDungeonStatsChoice.get("More_Jackets") || KinkyDungeonFlags.get("prefer_jacket"); + }, +}; diff --git a/Game/src/prison/prisontypes/DollStorage.ts b/Game/src/prison/prisontypes/DollStorage.ts new file mode 100644 index 000000000..d7e3c5a61 --- /dev/null +++ b/Game/src/prison/prisontypes/DollStorage.ts @@ -0,0 +1,642 @@ +KDPrisonTypes.DollStorage = { + name: "DollStorage", + default_state: "Jail", + starting_state: "Intro", + update: (delta) => { + if (KDGameData.PrisonerState != 'parole') { + KinkyDungeonSetFlag("noPlay", 12); + } + + // Assign guards to deal with idle dolls + let idleDoll: entity[] = []; + let punishDoll: entity[] = []; + let idleGuard: entity[] = []; + for (let en of KDMapData.Entities) { + if ((en.Enemy?.tags?.prisoner || en.Enemy?.tags?.formerprisoner) && !KDEnemyHasFlag(en, "conveyed_rec")) { + if ((KDEnemyHasFlag(en, "punishdoll") || KDRandom() < 0.15) && !KDEnemyHasFlag(en, "punished")) { + punishDoll.push(en); + KinkyDungeonSetEnemyFlag(en, "punishdoll", 300); + } else + idleDoll.push(en); + } else if (en.faction == "Enemy" && en.Enemy?.tags.jailer && en != KinkyDungeonJailGuard() && en != KinkyDungeonLeashingEnemy() && (en.idle || KDEnemyHasFlag(en, "idleg"))) { + idleGuard.push(en); + KinkyDungeonSetEnemyFlag(en, "idleg", 2); + } + } + // For each idle doll, pick a guard to pull + for (let doll of idleDoll) { + let gg: entity = null; + let dist = 11; + for (let guard of idleGuard) { + if (!KDEnemyHasFlag(guard, "idlegselect") && KDistChebyshev(guard.x - doll.x, guard.y - doll.y) < dist) { + gg = guard; + dist = KDistChebyshev(guard.x - doll.x, guard.y - doll.y); + } + } + if (gg) { + if (dist < 1.5) { + // Set the doll as a punishment doll or delete it if there are too many + if (punishDoll.length < 20 && !KDEnemyHasFlag(doll, "punished")) { + KinkyDungeonSetEnemyFlag(doll, "punishdoll", 300); + KinkyDungeonSetEnemyFlag(doll, "punished", 9999); + KinkyDungeonSetEnemyFlag(doll, "tryNotToSwap", 9999); + punishDoll.push(doll); + } else { + doll.hp = 0; + } + } else { + KinkyDungeonSetEnemyFlag(gg, "idlegselect", 2); + KinkyDungeonSetEnemyFlag(gg, "overrideMove", 10); + gg.gx = doll.x; + gg.gy = doll.y; + } + } + } + + // For each punishment doll, pick a guard to pull + for (let doll of punishDoll) { + let gg: entity = null; + let storage = KinkyDungeonNearestJailPoint(doll.x, doll.y, ["storage"], undefined, undefined); + if (doll.x == storage?.x && doll.y == storage?.y) continue; + let dist = 11; + let canLeash = (guard: entity, dd: number) => { + return guard?.Enemy && !KDEnemyHasFlag(guard, "idlegselect") && KDistChebyshev(guard.x - doll.x, guard.y - doll.y) < dd; + } + if (doll.leash?.entity && KDLookupID(doll.leash.entity)?.Enemy && idleGuard.some((entity) => {return entity.id == doll.leash.entity;})) { + gg = KDLookupID(doll.leash.entity); + dist = KDistChebyshev(gg.x - doll.x, gg.y - doll.y); + } else { + if (doll.leash?.reason == "DollLeash") { + KDBreakTether(doll); + } + for (let guard of idleGuard) { + if (canLeash(guard, dist)) { + gg = guard; + dist = KDistChebyshev(guard.x - doll.x, guard.y - doll.y); + } + } + } + + if (gg) { + if (dist < 2.5 || doll.leash?.entity == gg.id) { + // Move the doll toward the nearest storage + let storage = KinkyDungeonNearestJailPoint(gg.x, gg.y, ["storage"], undefined, undefined, true); + if (storage) { + if (dist < 1.5 && KDistChebyshev(gg.x - storage.x, gg.y - storage.y) < 1.5) { + KDMoveEntity(doll, storage.x, storage.y, false, false, false, false); + KDTieUpEnemy(doll, 100, "Latex", undefined, false, 0); + } else { + KinkyDungeonSetEnemyFlag(gg, "idlegselect", 2); + KinkyDungeonSetEnemyFlag(gg, "overrideMove", 10); + KinkyDungeonSetEnemyFlag(gg, "leashPrisoner", 3); + KinkyDungeonAttachTetherToEntity(1.5, gg, doll, "DollLeash", "#00ffff", 6); + gg.gx = storage.x; + gg.gy = storage.y; + if (dist > 1.5) { + let path = KinkyDungeonFindPath(doll.x, doll.y, gg.x, gg.y, true, true, false, KinkyDungeonMovableTilesEnemy, + false, false, false + ); + if (path && path.length > 0) { + //KDMoveEntity(doll, path[0].x, path[0].y, false, false, false, false); + KDStaggerEnemy(doll); + } + } + } + } + } else { + KinkyDungeonSetEnemyFlag(gg, "idlegselect", 2); + KinkyDungeonSetEnemyFlag(gg, "overrideMove", 10); + gg.gx = doll.x; + gg.gy = doll.y; + } + } + } + + // If there are any guards still idle we move them to exit to despawn + let idleGuards: entity[] = []; + let guardCount = 0; + for (let en of KDMapData.Entities) { + if (en.faction == "Enemy" && !(en.Enemy?.tags?.prisoner || en.Enemy?.tags?.formerprisoner) ) { + if (en != KinkyDungeonJailGuard() && en != KinkyDungeonLeashingEnemy() && (en.idle && !KDEnemyHasFlag(en, "idlegselect"))) + idleGuards.push(en); + if (en.Enemy.tags.jailer) guardCount += 1; + } + } + if (guardCount > 8) { + for (let en of idleGuards) { + KinkyDungeonSetEnemyFlag(en, "despawn", 300); + KinkyDungeonSetEnemyFlag(en, "wander", 300); + en.gx = KDMapData.EndPosition.x; + en.gy = KDMapData.EndPosition.y; + } + } else if (!KinkyDungeonFlags.get("guardspawn")) { + // TODO replace with map flags + // spawn a new one + KinkyDungeonSetFlag("guardspawn", 10); + + + if (KDMapData.Labels && KDMapData.Labels.Deploy?.length > 0) { + let l = KDMapData.Labels.Deploy[Math.floor(KDRandom() * KDMapData.Labels.Deploy.length)]; + let tag = KDGetMainFaction() == "Dollsmith" ? "dollsmith" : "cyborg"; + let Enemy = KinkyDungeonGetEnemy([tag, "robot"], MiniGameKinkyDungeonLevel + 4, 'bel', '0', [tag], undefined, {[tag]: {mult: 4, bonus: 10}}, ["boss"]); + if (Enemy && !KinkyDungeonEnemyAt(KDMapData.EndPosition.x, KDMapData.EndPosition.y) + && KDistChebyshev(KDPlayer().x - KDMapData.EndPosition.x, KDPlayer().y - KDMapData.EndPosition.y) + > 7) { + let en = DialogueCreateEnemy(KDMapData.EndPosition.x, KDMapData.EndPosition.y, Enemy.name); + //KDProcessCustomPatron(Enemy, en, 0.5, false); + en.AI = "looseguard"; + en.faction = "Enemy"; + en.keys = true; + en.gxx = l.x; + en.gyy = l.y; + en.gx = l.x; + en.gy = l.y; + KinkyDungeonSetEnemyFlag(en, "mapguard", -1); + KinkyDungeonSetEnemyFlag(en, "cyberaccess", -1); + } + } + } + }, + states: { + Intro: {name: "Intro", + init: (params) => { + if (KDGameData.PrisonerState == "parole") + KDGameData.PrisonerState = "jail"; + if (KDMapData.Labels && KDMapData.Labels.Deploy) { + for (let l of KDMapData.Labels.Deploy) { + let tag = KDGetMainFaction() == "Dollsmith" ? "dollsmith" : "cyborg"; + let Enemy = KinkyDungeonGetEnemy([tag, "robot"], MiniGameKinkyDungeonLevel + 4, 'bel', '0', [tag], undefined, {[tag]: {mult: 4, bonus: 10}}, ["boss"]); + if (Enemy && !KinkyDungeonEnemyAt(l.x, l.y)) { + let en = DialogueCreateEnemy(l.x, l.y, Enemy.name); + //KDProcessCustomPatron(Enemy, en, 0.5, false); + en.AI = "looseguard"; + en.faction = "Enemy"; + en.keys = true; + KinkyDungeonSetEnemyFlag(en, "mapguard", -1); + KinkyDungeonSetEnemyFlag(en, "cyberaccess", -1); + } + + } + } + if (KDMapData.Labels && KDMapData.Labels.Patrol) { + for (let l of KDMapData.Labels.Patrol) { + let tag = "robot"; + let Enemy = KinkyDungeonGetEnemy([tag], MiniGameKinkyDungeonLevel + 4, 'bel', '0', [tag], undefined, {[tag]: {mult: 4, bonus: 10}}, ["boss", "oldrobot", "miniboss", "elite"]); + if (Enemy && !KinkyDungeonEnemyAt(l.x, l.y)) { + let en = DialogueCreateEnemy(l.x, l.y, Enemy.name); + //KDProcessCustomPatron(Enemy, en, 0.1, false); + en.AI = "hunt"; + en.faction = "Enemy"; + en.keys = true; + KinkyDungeonSetEnemyFlag(en, "mapguard", -1); + KinkyDungeonSetEnemyFlag(en, "cyberaccess", -1); + } + + } + } + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + KDPrisonCommonGuard(player); + return "Jail"; + }, + }, + Jail: {name: "Jail", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + KDPrisonCommonGuard(player); + + + let lostTrack = KDLostJailTrack(player); + if (lostTrack == "Unaware") { + return KDSetPrisonState(player, "Jail"); + } + + if (KDPrisonTick(player)) { + + let uniformCheck = KDPrisonGetGroups(player, ["cyborg"], "Cyber", KDCYBERPOWER); + if ((uniformCheck.groupsToStrip.length > 0 && !KinkyDungeonFlags.get("failStrip")) || uniformCheck.itemsToApply.length > 0) { + return "Uniform"; + } + + if (!KinkyDungeonFlags.get("trainingCD")) { + return "Training"; + } + + return "Storage"; + } + return "Jail"; + }, + updateStack: (delta) => { + KinkyDungeonSetFlag("noPlay", 10); + + }, + }, + FurnitureTravel: {name: "FurnitureTravel", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + + + let lostTrack = KDLostJailTrack(player); + if (lostTrack == "Unaware") { + return KDSetPrisonState(player, "Jail"); + } + + // End when the player is settled + if (KDPrisonIsInFurniture(player)) { + return KDPopSubstate(player); + } + // We are not in a furniture, so we conscript the guard + let guard = KDPrisonCommonGuard(player); + if (guard) { + // Assign the guard to a furniture intentaction + let action = (KDGameData.PrisonerState == 'jail' && !KinkyDungeonAggressive(guard, player)) ? "leashFurniture" : "leashFurnitureAggressive"; + if (guard.IntentAction != action) + KDIntentEvents[action].trigger(guard, {}); + if (lostTrack) { + // Any qualifying factors means they know where you should be + guard.gx = player.x; + guard.gy = player.y; + KinkyDungeonSetEnemyFlag(guard, "wander", 30) + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 10); + } + if (KDGameData.PrisonerState == 'jail') { + KinkyDungeonSetEnemyFlag(guard, "notouchie", 2); + } + } else { + // forbidden state + return KDPopSubstate(player); + } + + // Stay in the current state + return KDCurrentPrisonState(player); + }, + }, + Uniform: {name: "Uniform", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + KDPrisonCommonGuard(player); + + if (KDPrisonIsInFurniture(player)) { + let uniformCheck = KDPrisonGetGroups(player, ["cyborg"], "Cyber", KDCYBERPOWER); + if (uniformCheck.groupsToStrip.length > 0 && !KinkyDungeonFlags.get("failStrip")) { + // Create a queue + KDGoToSubState(player, "UniformApply"); + return KDGoToSubState(player, "UniformRemoveExtra"); + } else if (uniformCheck.itemsToApply.length > 0) { + return KDGoToSubState(player, "UniformApply"); + } + + // If we are in uniform we go to the Storage state + return KDPopSubstate(player); + } + // Otherwise go to travel state + return KDGoToSubState(player, "FurnitureTravel"); + }, + }, + UniformRemoveExtra: {name: "UniformRemoveExtra", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + let guard = KDPrisonCommonGuard(player); + + if (guard && KDPrisonIsInFurniture(player)) { + guard.gx = player.x; + guard.gy = player.y; + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 2); + if (KDistChebyshev(guard.x - player.x, guard.y - player.y) < 1.5) { + if (KDPrisonIsInFurniture(player)) { + // Remove one per turn + let lockType = "Cyber"; + return KDDoUniformRemove(player, guard, ["cyborg"], lockType, KDCYBERPOWER); + + + } + } else { + // Stay in the current state + return KDCurrentPrisonState(player); + } + } + + // Otherwise go to travel state + return KDGoToSubState(player, "FurnitureTravel"); + }, + }, + UniformApply: {name: "UniformApply", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + let guard = KDPrisonCommonGuard(player); + + if (KDPrisonIsInFurniture(player)) { + if (guard) { + guard.gx = player.x; + guard.gy = player.y; + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 2); + if (KDistChebyshev(guard.x - player.x, guard.y - player.y) < 1.5) { + + let lockType = "Cyber"; + return KDDoUniformApply(player, guard, ["cyborg"], lockType, KDCYBERPOWER); + } + } else { + // Stay in the current state + return KDCurrentPrisonState(player); + } + } + // Otherwise go to travel state + return KDGoToSubState(player, "FurnitureTravel"); + }, + }, + Storage: {name: "Storage", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + KDPrisonCommonGuard(player); + let jailPoint = KinkyDungeonNearestJailPoint(player.x, player.y, ["storage"]); + if (!jailPoint || jailPoint.x != player.x || jailPoint.y != player.y) { + // Move the player to the storage + return KDGoToSubState(player, "StorageTravel"); + } + + if (KDPrisonIsInFurniture(player)) { + let uniformCheck = KDPrisonGetGroups(player, ["cyborg"], "Cyber", KDCYBERPOWER); + if (uniformCheck.itemsToApply.length > 0) { + return KDGoToSubState(player, "Uniform"); + } + + // Stay in the current state, but increment the storage timer, return to jail state if too much + KinkyDungeonFlags.set("PrisonStorageTimer", (KinkyDungeonFlags.get("PrisonStorageTimer") || 0) + delta * 2); + if (KinkyDungeonFlags.get("PrisonStorageTimer") > 300) { + // Go to jail state for training + KinkyDungeonSetFlag("PrisonCyberTrainingFlag", 10); + return KDSetPrisonState(player, "Jail"); + } + return KDCurrentPrisonState(player); + } + // Go to jail state for further processing + return KDSetPrisonState(player, "Jail"); + }, + }, + /** + * Training state, assigns the player to one of various trainings + */ + Training: {name: "Training", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + + let label = KDMapData.Labels?.Training ? KDMapData.Labels.Training[0] : null; + let rad = 3; + if (label && (KDistEuclidean(label.x - player.x, label.y - player.y) > rad)) { + return KDGoToSubState(player, "TrainingTravel"); + } + + if (!KinkyDungeonFlags.get("trainingCD")) { + KinkyDungeonSetFlag("trainingCD", 300); + + return KDGoToSubState(player, "LatexTraining"); + } + + // Go to jail state for further processing + return KDSetPrisonState(player, "Jail"); + }, + updateStack: (delta) => { + // Always reveals the thing + let label = KDMapData.Labels?.Training ? KDMapData.Labels.Training[0] : null; + let rad = 5; + if (label) { + for (let x = label.x - rad; x <= label.x + rad; x++) + for (let y = label.y - rad; y <= label.y + rad; y++) + KDRevealTile(x, y, 8); + } + }, + finally: (delta, currentState, stackPop) => { + // Remove all training doors + let labels = KDMapData.Labels?.TrainingDoor; + if (labels?.length > 0) { + for (let td of labels) { + if ("dD".includes(KinkyDungeonMapGet(td.x, td.y))) { + KinkyDungeonMapSet(td.x, td.y, '2'); + let door = KinkyDungeonTilesGet(td.x + ',' + td.y); + if (door) { + delete door.Type; + delete door.Lock; + delete door.ReLock; + } + } + } + } + }, + }, + + LatexTraining: {name: "LatexTraining", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + + // End when training ends + if (!KinkyDungeonFlags.get("trainingStart")) { + // End the latex training flags too + KinkyDungeonSetFlag("latexTrainingStart", 0); + return KDPopSubstate(player); + } + + // Only progress the training if player is inside + let guard = KDPrisonCommonGuard(player); + + let label = KDMapData.Labels?.Training ? KDMapData.Labels.Training[0] : null; + let rad = 5; + if (label && (KDistChebyshev(label.x - player.x, label.y - player.y) < rad)) { + // Start the training and initialize the field + if (!KinkyDungeonFlags.get("latexTraining") && !KinkyDungeonFlags.get("latexTrainingStart")) { + KinkyDungeonSetFlag("latexTraining", 30); + KinkyDungeonSetFlag("latexTrainingStart", KinkyDungeonFlags.get("trainingStart")); + if (guard) { + guard.path = undefined; + KinkyDungeonSetEnemyFlag(guard, "wander", 0); + } + + KDBreakTether(player); + KDForceWanderFar(player, 13); + KDResetAllAggro(player); + KDResetAllIntents(false, 30, player); + KDGameData.PrisonerState = 'jail'; + + + for (let xx of [label.x + 3, label.x - 3]) { + let e = DialogueCreateEnemy(xx, label.y, "LatexSprayer"); + e.faction = "Ambush"; + e.vp = 2; + e.aware = true; + e.hostile = KinkyDungeonFlags.get("latexTraining"); + e.summoned = false; // They can drop loot + KinkyDungeonSetEnemyFlag(e, "noignore", KinkyDungeonFlags.get("latexTraining")); + KinkyDungeonApplyBuffToEntity(e, KDTrainingUnit); // Training unit + } + + //Create training doors + let labels = KDMapData.Labels?.TrainingDoor; + if (labels?.length > 0) { + for (let td of labels) { + KinkyDungeonMapSet(td.x, td.y, "D"); + let door = KinkyDungeonTilesGet(td.x + ',' + td.y); + if (!door) door = KinkyDungeonTilesSet(td.x + ',' + td.y, {}); + door.Type = "Door"; + door.Lock = "Cyber"; + door.ReLock = true; + door.Jail = true; + } + } + } + + // TODO progress training + let enemiesNear = KDNearbyEnemies(label.x, label.y, rad+2); + for (let en of enemiesNear) { + if (en.faction != "Ambush" && KDGetFaction(en) != "Player") { + if (!KDEnemyHasFlag(en, "trainingLeave")) { + KDWanderEnemy(en); + KinkyDungeonSetEnemyFlag(en, "trainingLeave", 10); + } + } + } + // Remove training started flag to finish off the training + if (!KinkyDungeonFlags.get("latexTraining")) + KinkyDungeonSetFlag("trainingStart", 0); + + // Stay in training state + return KDCurrentPrisonState(player); + } + + return KDPopSubstate(player); + }, + }, + StorageTravel: {name: "StorageTravel", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + + let lostTrack = KDLostJailTrack(player); + if (lostTrack == "Unaware") { + return KDSetPrisonState(player, "Jail"); + } + + let jailPointNearest = KinkyDungeonNearestJailPoint(player.x, player.y, ["storage"], undefined, undefined); + if (!(jailPointNearest && jailPointNearest.x == player.x && jailPointNearest.y == player.y)) + { + // We are not in a furniture, so we conscript the guard + let guard = KDPrisonCommonGuard(player); + if (guard) { + // Assign the guard to a furniture intentaction + let action = "leashStorage"; + if (guard.IntentAction != action) { + KDIntentEvents[action].trigger(guard, {}); + } + + if (lostTrack) { + // Any qualifying factors means they know where you should be + guard.gx = player.x; + guard.gy = player.y; + KinkyDungeonSetEnemyFlag(guard, "wander", 30) + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 10); + } + + if (KinkyDungeonLeashingEnemy() == guard) { + // Make the guard focus on leashing more strongly, not attacking or pickpocketing + KinkyDungeonSetEnemyFlag(guard, "focusLeash", 2); + } + KinkyDungeonSetEnemyFlag(guard, "notouchie", 2); + } else { + // forbidden state + return KDPopSubstate(player); + } + + // Stay in the current state for travel + return KDCurrentPrisonState(player); + } + + // End when the player is settled + if (KDPrisonIsInFurniture(player)) { + return KDPopSubstate(player); + } + + // Stay in the current state + return KDCurrentPrisonState(player); + }, + }, + TrainingTravel: {name: "TrainingTravel", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + + let label = KDMapData.Labels?.Training ? KDMapData.Labels.Training[0] : null; + let rad = 3; + + let lostTrack = KDLostJailTrack(player); + if (lostTrack == "Unaware") { + return KDSetPrisonState(player, "Jail"); + } + + if (label && (KDistEuclidean(label.x - player.x, label.y - player.y) > rad) && KDPlayerLeashable(player)) { + // We are not in a furniture, so we conscript the guard + let guard = KDPrisonCommonGuard(player); + if (guard) { + // Assign the guard to a furniture intentaction + let action = "leashToPoint"; + if (guard.IntentAction != action) { + guard.gx = player.x; + guard.gy = player.y; + KDIntentEvents[action].trigger(guard, {point: label, radius: 1, target: player}); + } + + if (lostTrack) { + // Any qualifying factors means they know where you should be + guard.gx = player.x; + guard.gy = player.y; + KinkyDungeonSetEnemyFlag(guard, "wander", 30) + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 10); + } + if (KinkyDungeonLeashingEnemy() == guard) { + // Make the guard focus on leashing more strongly, not attacking or pickpocketing + KinkyDungeonSetEnemyFlag(guard, "focusLeash", 2); + } + KinkyDungeonSetEnemyFlag(guard, "notouchie", 2); + } else { + // forbidden state + return KDPopSubstate(player); + } + + // Stay in the current state for travel + return KDCurrentPrisonState(player); + } + + // End + KinkyDungeonSetFlag("trainingStart", 300); + return KDPopSubstate(player); + }, + }, + }, +}; \ No newline at end of file diff --git a/Game/src/prison/prisontypes/HighSec.ts b/Game/src/prison/prisontypes/HighSec.ts new file mode 100644 index 000000000..3be89df8b --- /dev/null +++ b/Game/src/prison/prisontypes/HighSec.ts @@ -0,0 +1,567 @@ +let KDJailStripSearchTime = 300; +let KDJailStripSearchTempTime = 50; + +function KDShouldStripSearchPlayer(player: entity, allowFlag: boolean = false): boolean { + if (!player.player) return false; + if (KinkyDungeonCheckRelease() >= 0) return false; + if (allowFlag && KinkyDungeonFlags.get("jailStripSearched")) return false; + // TODO check if player has more than a few items in inventory + /** Max consumables */ + let maxItemsCheck = 1 + 3 * (1 - KinkyDungeonCalcVisibility(player, 1)); + /** Max non unarmed weapons */ + let maxWeaponsCheck = 1; + + let currentItems = 0; + for (let c of KinkyDungeonAllConsumable()) { + if (KDConsumable(c)?.sub) continue; // Subby items allowed + let inc = 1; + if (KDConsumable(c)?.sneakChance) inc = KDConsumable(c)?.sneakChance; + if (c.quantity == undefined) currentItems += inc; + else currentItems += inc * c.quantity; + } + let currentWeapons = KinkyDungeonAllWeapon().filter((w) => { + return !KDWeapon(w)?.unarmed; + }).length; + + return currentItems > maxItemsCheck || currentWeapons > maxWeaponsCheck; +} +function KDDoStripSearchRemove(player: entity, guard: entity): string { + // TODO: add the strip search station + + if (!KDGameData.CurrentDialog) { + KDStartDialog("StripSearch", + guard.Enemy.name, + true, + KDGetPersonality(guard), + guard) + } + + //if (KDShouldStripSearchPlayer(player)) return KDCurrentPrisonState(player); + return KDPopSubstate(player); +} + + + +KDPrisonTypes.HighSec = { + name: "HighSec", + default_state: "Jail", + starting_state: "Intro", + update: (delta) => { + if (KDGameData.PrisonerState != 'parole') { + KinkyDungeonSetFlag("noPlay", 12); + } + + let mainFaction = KDGetMainFaction(); + + // Assign guards to deal with idle dolls + let idleGuard: entity[] = []; + for (let en of KDMapData.Entities) { + if ((en.Enemy?.tags?.prisoner || en.Enemy?.tags?.formerprisoner) + && !KDEnemyHasFlag(en, "conveyed_rec")) { + // Is a prisoner, dont do anything (for now) + } else if (en.faction == (mainFaction || "Enemy") + && en.Enemy?.tags.jailer + && en != KinkyDungeonJailGuard() + && en != KinkyDungeonLeashingEnemy() + && (en.idle || KDEnemyHasFlag(en, "idleg")) + && !en.goToDespawn) { + idleGuard.push(en); + KinkyDungeonSetEnemyFlag(en, "idleg", 2); + } + } + + // If there are any guards still idle we move them to exit to despawn + let idleGuards: entity[] = []; + let guardCount = 0; + for (let en of KDMapData.Entities) { + if (en.faction == (mainFaction || "Enemy") + && !en.goToDespawn + && !(en.Enemy?.tags?.prisoner || en.Enemy?.tags?.formerprisoner) ) { + if (en != KinkyDungeonJailGuard() && en != KinkyDungeonLeashingEnemy() && (en.idle && !KDEnemyHasFlag(en, "idlegselect"))) + idleGuards.push(en); + if (en.Enemy.tags.jailer) guardCount += 1; + } + } + if (guardCount > 8) { + let max = guardCount * 0.2; + let despawning = 0; + for (let en of idleGuards) { + if (KDEntityHasFlag(en, "despawn")) { + despawning++; + continue; + } + if (KDEntityHasFlag(en, "spawned")) { + continue; + } + if ((!en.homeCoord) || !KDCompareLocation(en.homeCoord, KDGetCurrentLocation())) { + despawning += 1; + KinkyDungeonSetEnemyFlag(en, "despawn", 300); + KinkyDungeonSetEnemyFlag(en, "wander", 300); + en.gx = KDMapData.EndPosition.x; + en.gy = KDMapData.EndPosition.y; + en.goToDespawn = true; + if (despawning > max) break; + } + } + } else if (!KinkyDungeonFlags.get("guardspawn")) { + // TODO replace with map flags + // spawn a new one + KinkyDungeonSetFlag("guardspawn", 20); + + + if (KDMapData.Labels && KDMapData.Labels.Deploy?.length > 0) { + let l = KDMapData.Labels.Deploy[Math.floor(KDRandom() * KDMapData.Labels.Deploy.length)]; + + let Enemy = KDGetJailEnemy(); + + if (Enemy && !KinkyDungeonEnemyAt(KDMapData.EndPosition.x, KDMapData.EndPosition.y) + && KDistChebyshev(KDPlayer().x - KDMapData.EndPosition.x, KDPlayer().y - KDMapData.EndPosition.y) + > 7) { + let en = DialogueCreateEnemy(KDMapData.EndPosition.x, KDMapData.EndPosition.y, Enemy.name); + //KDProcessCustomPatron(Enemy, en, 0.5, false); + en.AI = "looseguard"; + en.faction = mainFaction || "Enemy"; + en.keys = true; + en.gxx = l.x; + en.gyy = l.y; + en.gx = l.x; + en.gy = l.y; + KinkyDungeonSetEnemyFlag(en, "mapguard", -1); + KinkyDungeonSetEnemyFlag(en, "spawned", 300); + //KinkyDungeonSetEnemyFlag(en, "cyberaccess", -1); + } + } + } + }, + states: { + Intro: {name: "Intro", + init: (params) => { + let mainFaction = KDGetMainFaction(); + if (KDGameData.PrisonerState == "parole" && KDGetEffSecurityLevel() >= 0) + KDGameData.PrisonerState = "jail"; + if (KDMapData.Labels && KDMapData.Labels.Deploy) { + for (let l of KDMapData.Labels.Deploy) { + + let Enemy = KDGetJailEnemy(); + + if (Enemy && !KinkyDungeonEnemyAt(l.x, l.y)) { + let en = DialogueCreateEnemy(l.x, l.y, Enemy.name); + //KDProcessCustomPatron(Enemy, en, 0.5, false); + en.AI = "looseguard"; + en.faction = mainFaction || "Enemy"; + en.keys = true; + KinkyDungeonSetEnemyFlag(en, "mapguard", -1); + //KinkyDungeonSetEnemyFlag(en, "cyberaccess", -1); + } + + } + } + if (KDMapData.Labels && KDMapData.Labels.Patrol) { + for (let l of KDMapData.Labels.Patrol) { + + let Enemy = KDGetJailEnemy(); + + if (Enemy && !KinkyDungeonEnemyAt(l.x, l.y)) { + let en = DialogueCreateEnemy(l.x, l.y, Enemy.name); + //KDProcessCustomPatron(Enemy, en, 0.1, false); + en.AI = "hunt"; + en.faction = mainFaction || "Enemy"; + en.keys = true; + KinkyDungeonSetEnemyFlag(en, "mapguard", -1); + //KinkyDungeonSetEnemyFlag(en, "cyberaccess", -1); + } + + } + } + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + KDPrisonCommonGuard(player, undefined, false); + return "Jail"; + }, + }, + Jail: {name: "Jail", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + let TheChosenOne = false; + if (!KinkyDungeonJailGuard()) TheChosenOne = true; + if (!(KDGameData.GuardTimer > 0) && KDGameData.GuardSpawnTimer <= 1) + KDPrisonCommonGuard(player, undefined, false); + + if (TheChosenOne && KinkyDungeonJailGuard()) { + let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, ["jail"]); + + if (nearestJail) { + + let xx = nearestJail.x + KinkyDungeonJailLeashX; + let yy = nearestJail.y; + KDJailEvents.useCurrentGuard.trigger( + KinkyDungeonJailGuard(), + xx, yy + ); + } + + } + KinkyDungeonHandleJailSpawns(delta, KDRandom() < 0.9); + + + let lostTrack = KDLostJailTrackCell(player); + if (lostTrack == "Unaware") { + return KDSetPrisonState(player, "Jail"); + } + + + if (KDPrisonIsInFurniture(player)) { + let lockType = "Red"; + let uniformCheck = KDPrisonGetGroups(player, undefined, lockType, KDJAILPOWER); + if (uniformCheck.itemsToApply.length > 0) { + return KDGoToSubState(player, "Uniform"); + } + + // Stay in the current state, but increment the storage timer, return to jail state if too much + KinkyDungeonFlags.set("PrisonStorageTimer", (KinkyDungeonFlags.get("PrisonStorageTimer") || 0) + delta * 2); + if (!(KinkyDungeonFlags.get("PrisonStorageTimer") > 50)) { + // Stay a little while + return KDCurrentPrisonState(player); + //return KDSetPrisonState(player, "Jail"); + } + } + + + + + if (KDPrisonTick(player) && !KinkyDungeonFlags.get("suspendJailTick")) { + if (KDShouldStripSearchPlayer(player, true)) { + return "Strip"; + } + if (KDIsPlayerTethered(KDPlayer())) { + return "Jail"; + } + if (!KinkyDungeonPlayerInCell()) { + let lockType = "Red"; + let uniformCheck = KDPrisonGetGroups(player, undefined, lockType, KDJAILPOWER); + if ((uniformCheck.groupsToStrip.length > 0 && !KinkyDungeonFlags.get("failStrip")) || uniformCheck.itemsToApply.length > 0) { + return "Uniform"; + } + } + return "Cell"; + } + return "Jail"; + }, + updateStack: (delta) => { + KinkyDungeonSetFlag("noPlay", 10); + + }, + }, + + Uniform: {name: "Uniform", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + KDPrisonCommonGuard(player); + + if (KDPrisonIsInFurniture(player)) { + let lockType = "Red"; + let uniformCheck = KDPrisonGetGroups(player, undefined, lockType, KDJAILPOWER); + if (uniformCheck.groupsToStrip.length > 0 && !KinkyDungeonFlags.get("failStrip")) { + // Create a queue + KDGoToSubState(player, "UniformApply"); + return KDGoToSubState(player, "UniformRemoveExtra"); + } else if (uniformCheck.itemsToApply.length > 0) { + return KDGoToSubState(player, "UniformApply"); + } + + // If we are in uniform we go to the Storage state + return KDPopSubstate(player); + } + // Otherwise go to travel state + return KDGoToSubState(player, "UniformTravel"); + }, + }, + UniformRemoveExtra: {name: "UniformRemoveExtra", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + let guard = KDPrisonCommonGuard(player); + + if (guard && KDPrisonIsInFurniture(player)) { + guard.gx = player.x; + guard.gy = player.y; + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 2); + if (KDistChebyshev(guard.x - player.x, guard.y - player.y) < 1.5) { + if (KDPrisonIsInFurniture(player)) { + // Remove one per turn + let lockType = "Red"; + return KDDoUniformRemove(player, guard, undefined, lockType, KDJAILPOWER); + + } + } else { + // Stay in the current state + return KDCurrentPrisonState(player); + } + } + + // Otherwise go to travel state + return KDGoToSubState(player, "UniformTravel"); + }, + }, + UniformApply: {name: "UniformApply", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + let guard = KDPrisonCommonGuard(player); + + if (KDPrisonIsInFurniture(player)) { + if (guard) { + guard.gx = player.x; + guard.gy = player.y; + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 2); + if (KDistChebyshev(guard.x - player.x, guard.y - player.y) < 1.5) { + let lockType = "Red"; + return KDDoUniformApply(player, guard, undefined, lockType, KDJAILPOWER); + } + } else { + // Stay in the current state + return KDCurrentPrisonState(player); + } + } + // Otherwise go to travel state + return KDGoToSubState(player, "UniformTravel"); + }, + }, + UniformTravel: {name: "UniformTravel", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + + + let lostTrack = KDLostJailTrack(player); + if (lostTrack == "Unaware") { + return KDSetPrisonState(player, "Jail"); + } + + // End when the player is settled + if (KDPrisonIsInFurniture(player)) { + return KDPopSubstate(player); + } + // We are not in a furniture, so we conscript the guard + let guard = KDPrisonCommonGuard(player); + if (guard) { + // Assign the guard to a furniture intentaction + let action = (KDGameData.PrisonerState == 'jail' && !KinkyDungeonAggressive(guard, player)) ? "leashFurniture" : "leashFurnitureAggressive"; + if (guard.IntentAction != action) + KDIntentEvents[action].trigger(guard, {}); + if (lostTrack) { + // Any qualifying factors means they know where you should be + guard.gx = player.x; + guard.gy = player.y; + KinkyDungeonSetEnemyFlag(guard, "wander", 30) + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 10); + } + if (KDGameData.PrisonerState == 'jail') { + KinkyDungeonSetEnemyFlag(guard, "notouchie", 2); + } + } else { + // forbidden state + return KDPopSubstate(player); + } + + // Stay in the current state + return KDCurrentPrisonState(player); + }, + }, + + + Strip: {name: "Strip", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + KDPrisonCommonGuard(player); + KinkyDungeonSetFlag("noWeaponStop", 10); + if (KDPrisonIsInFurniture(player) && !KinkyDungeonFlags.get("jailStripSearched")) { + KinkyDungeonSetFlag("jailStripSearched", KDJailStripSearchTempTime); + return KDGoToSubState(player, "StripRemove"); + } + // Otherwise go to travel state + if (KDShouldStripSearchPlayer(player)) + return KDGoToSubState(player, "StripTravel"); + if (!KinkyDungeonPlayerInCell()) { + return KDGoToSubState(player, "CellTravel"); + } + return KDPopSubstate(player); + }, + }, + StripRemove: {name: "StripRemove", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + let guard = KDPrisonCommonGuard(player); + KinkyDungeonSetFlag("noWeaponStop", 10); + + if (guard && KDPrisonIsInFurniture(player)) { + guard.gx = player.x; + guard.gy = player.y; + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 2); + if (KDistChebyshev(guard.x - player.x, guard.y - player.y) < 1.5) { + if (KDPrisonIsInFurniture(player)) { + KinkyDungeonSetFlag("jailStripSearched", KDJailStripSearchTime); + return KDDoStripSearchRemove(player, guard); + } + } else { + // Stay in the current state + return KDCurrentPrisonState(player); + } + } + + return KDPopSubstate(player); + }, + }, + StripTravel: {name: "StripTravel", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + KinkyDungeonSetFlag("noWeaponStop", 10); + + let lostTrack = KDLostJailTrack(player); + if (lostTrack == "Unaware") { + return KDSetPrisonState(player, "Jail"); + } + + // End when the player is settled + if (KDPrisonIsInFurniture(player)) { + return KDPopSubstate(player); + } + // We are not in a furniture, so we conscript the guard + let guard = KDPrisonCommonGuard(player); + if (guard) { + // Assign the guard to a furniture intentaction + let action = (KDGameData.PrisonerState == 'jail' + && !KinkyDungeonAggressive(guard, player)) + ? "leashFurniture" : "leashFurnitureAggressive"; + if (guard.IntentAction != action) + KDIntentEvents[action].trigger(guard, {}); + if (lostTrack) { + // Any qualifying factors means they know where you should be + guard.gx = player.x; + guard.gy = player.y; + KinkyDungeonSetEnemyFlag(guard, "wander", 30) + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 10); + } + if (KDGameData.PrisonerState == 'jail') { + KinkyDungeonSetEnemyFlag(guard, "notouchie", 2); + } + } else { + // forbidden state + return KDPopSubstate(player); + } + + // Stay in the current state + return KDCurrentPrisonState(player); + }, + }, + + Cell: {name: "Cell", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + KDPrisonCommonGuard(player, undefined, false); + + + if (KDPrisonIsInFurniture(player)) { + // Stay in the current state, but increment the Cell timer, return to jail state if too much + KinkyDungeonFlags.set("PrisonCellTimer", (KinkyDungeonFlags.get("PrisonCellTimer") || 0) + delta * 2); + if (KinkyDungeonFlags.get("PrisonCellTimer") > 300) { + // Go to jail state for training + KinkyDungeonSetFlag("PrisonCyberTrainingFlag", 10); + return KDSetPrisonState(player, "Jail"); + } + return KDCurrentPrisonState(player); + } + + if (!KinkyDungeonPlayerInCell()) { + // Move the player to the storage + return KDGoToSubState(player, "CellTravel"); + } + + // Go to jail state for further processing + return KDSetPrisonState(player, "Jail"); + }, + }, + + CellTravel: {name: "CellTravel", + init: (params) => { + return ""; + }, + update: (delta) => { + let player = KinkyDungeonPlayerEntity; + + let lostTrack = KDLostJailTrack(player); + if (lostTrack == "Unaware") { + return KDSetPrisonState(player, "Jail"); + } + + let jailPointNearest = KinkyDungeonNearestJailPoint(player.x, player.y, ["jail"], undefined, undefined); + if (!(jailPointNearest && jailPointNearest.x == player.x && jailPointNearest.y == player.y)) + { + // We are not in a furniture, so we conscript the guard + let guard = KDPrisonCommonGuard(player); + if (guard) { + // Assign the guard to a furniture intentaction + let action = "leashCell"; + if (guard.IntentAction != action) { + KDIntentEvents[action].trigger(guard, {}); + } + if (lostTrack) { + // Any qualifying factors means they know where you should be + guard.gx = player.x; + guard.gy = player.y; + KinkyDungeonSetEnemyFlag(guard, "wander", 30) + KinkyDungeonSetEnemyFlag(guard, "overrideMove", 10); + } + + if (KinkyDungeonLeashingEnemy() == guard) { + // Make the guard focus on leashing more strongly, not attacking or pickpocketing + KinkyDungeonSetEnemyFlag(guard, "focusLeash", 2); + } + KinkyDungeonSetEnemyFlag(guard, "notouchie", 2); + + } else { + // forbidden state + return KDPopSubstate(player); + } + + // Stay in the current state for travel + return KDCurrentPrisonState(player); + } + + // End when the player is settled + if (KDPrisonIsInFurniture(player)) { + return KDPopSubstate(player); + } + + // Stay in the current state + return KDCurrentPrisonState(player); + }, + }, + }, +}; \ No newline at end of file diff --git a/Game/src/restraint/KDApplyVariants.ts b/Game/src/restraint/KDApplyVariants.ts new file mode 100644 index 000000000..68b5f0341 --- /dev/null +++ b/Game/src/restraint/KDApplyVariants.ts @@ -0,0 +1,13 @@ +"use strict"; + +let KDApplyVariants: Record = { + "AntiMagic": { + minfloor: 0, + //maxfloor: 0, + prefix: "AntiMagic", + level: 1, + powerBonus: 1, + hexes: ["AntiMagic"], + enchants: [], + }, +}; diff --git a/Game/src/restraint/KDBindTypeTagLookupList.ts b/Game/src/restraint/KDBindTypeTagLookupList.ts new file mode 100644 index 000000000..47490efee --- /dev/null +++ b/Game/src/restraint/KDBindTypeTagLookupList.ts @@ -0,0 +1,13 @@ +let KDBindTypeTagLookup: Record = { + Leather: ["beltRestraints", "leathersuffsSpell"], + Latex: ["latexRestraints"], + Rope: ["ropeRestraints"], + Metal: ["chainRestraints", "shackleRestraints", "handcuffer"], + MagicRope: ["ropeMagicStrong"], + Slime: ["slimeRestraintsRandom"], + Ice: ["iceRestraints"], + Tape: ["vinylTape"], + Vine: ["vineRestraints"], + Energy: ["cyberLink"], + Magic: ["ribbonRestraints", "ribbonRestraintsLight"], +} \ No newline at end of file diff --git a/Game/src/restraint/KDGenRestraintUniform.ts b/Game/src/restraint/KDGenRestraintUniform.ts new file mode 100644 index 000000000..499133984 --- /dev/null +++ b/Game/src/restraint/KDGenRestraintUniform.ts @@ -0,0 +1,229 @@ +// This file contains functions that help create a set of /NPCRestraints/ objects to apply to NPCs based on the following parameter options: +// - A set of restraint tags + optionally list of allowed restraint items +// - A standalone list of allowed restraint items +// - A standalone list of raw materials +// - A list of /item/ objects +// - Any combination of the above, prioritizing equipping stuff from item lists, then specific items, then tags, then raw materials +// There are also 'lockrules' which are params that can be applied to establish rules for the types of locks added to restraints, and conjuration status + +// Also included is a function to generate the above based on an array of SpecialBondageTypes in order to dynamically generate bondage + +interface EligibleRestraintEntry { + restraint: restraint, + applyVariant: ApplyVariant, + lock: string, + forceConjure: boolean, + + /** eligible row */ + row: NPCBindingGroup, + /** Eligible slot */ + slot: NPCBindingSubgroup, + faction?: string, +} + +function KDGetNPCBindingSlotForItem(restraint: restraint, id: number, treatAsEmpty: boolean = false, power?: number): {row: NPCBindingGroup, sgroup: NPCBindingSubgroup} { + let restraints = KDGetNPCRestraints(id); + for (let row of NPCBindingGroups) { + for (let sgroup of [row.encaseGroup, ...row.layers]) { + if (KDRowItemIsValid( + restraint, sgroup, row, restraints, treatAsEmpty, power + )) return {row: row, sgroup: sgroup}; + } + + } + return null; +} + +/** + * + * @param bindType - bind type, used for lookup + * @param playerEffect - checks if it has a tag, overrides if true, otherwise uses bindtype + * @param merge - merge bindType and playerEffect + */ +function KDGetBulletBindingTags(bindType: string, playerEffect: any, merge: boolean): string[] { + let ret: string[] = []; + if (bindType && KDBindTypeTagLookup[bindType]) ret = [...KDBindTypeTagLookup[bindType]]; + if (!merge && ret.length > 0) return ret; + if (playerEffect?.tag) { + ret.push(playerEffect.tag); + } + if (playerEffect?.tags) { + ret.push(...playerEffect.tags); + } + return ret; +} + +function KDGetNPCRestraintPower(restraint: NPCRestraint): number { + let power = KDRestraint(restraint)?.power || 0; + if (restraint.inventoryVariant) { + if (KinkyDungeonRestraintVariants[restraint.inventoryVariant]?.power) + power += KinkyDungeonRestraintVariants[restraint.inventoryVariant]?.power; + } else if (restraint.powerbonus) power += restraint.powerbonus; + + return power; +} + +function KDGetNPCEligibleRestraints_fromTags(id: number, tags: string[], options: { + forceEffLevel?: number, + allowedRestraints?: restraint[], + allowedRestraintNames?: string[], + noOverride?: boolean, + allowVariants?: boolean, + forceLock?: string, // If it does have defaultlock it forces this still + fallbackLock?: string, // If it doesnt have defaultLock + forceCurse?: string, + forceConjure?: boolean, + currentWill?: number, +}): EligibleRestraintEntry[] { + let ret: EligibleRestraintEntry[] = []; + let effLevel = 4 + (options?.forceEffLevel != undefined ? options.forceEffLevel : undefined) || KDGetEffLevel(); + + let arousalMode = KinkyDungeonStatsChoice.get("arousalMode"); + + let cache: {r: restraint, w: number, v?: ApplyVariant}[] = []; + + // Build the cache + for (let restraint of options?.allowedRestraints || KinkyDungeonRestraints) { + + if (( + effLevel >= restraint.minLevel + || KinkyDungeonNewGame > 0 + || (restraint.ignoreMinLevelTags?.some((t) => {return tags.includes(t);})) + || options?.allowedRestraintNames?.includes(restraint.name) + ) && ( + !restraint.maxLevel + || effLevel < restraint.maxLevel + || (restraint.ignoreMaxLevelTags?.some((t) => {return tags.includes(t);})) + ) && ( + restraint.allFloors + || restraint.floors[KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint] + || (restraint.ignoreFloorTags?.some((t) => {return tags.includes(t);})) + + + )) { + if (options?.currentWill != undefined + && (restraint.maxwill != undefined || restraint.maxwillEnemy) + && (restraint.maxwillEnemy != undefined ? restraint.maxwillEnemy : restraint.maxwill) < options.currentWill) continue; + if (KDCanEquipItemOnNPC(restraint, id, false)) continue; + + if (!restraint.arousalMode || arousalMode) { + let enabled = false; + let weight = restraint.weight; + for (let t of tags) { + if (restraint.enemyTags[t] != undefined) { + weight += restraint.enemyTags[t]; + enabled = true; + } + } + + if (restraint.enemyTagsMult) + for (let t of tags) { + if (restraint.enemyTagsMult[t] != undefined) { + weight *= restraint.enemyTagsMult[t]; + } + } + if (enabled && weight > 0) { + cache.push({r: restraint, w:weight}); + } + + + if (enabled && options?.allowVariants && restraint.ApplyVariants) { + for (let variant of Object.entries(restraint.ApplyVariants)) { + + if (effLevel >= KDApplyVariants[variant[0]].minfloor && !(effLevel >= KDApplyVariants[variant[0]].maxfloor) + && (!variant[1].enemyTags || Object.keys(variant[1].enemyTags).some( + (tag) => {return tags.includes(tag);}))) { + + let w = weight * (variant[1].weightMult || 1) + (variant[1].weightMod || 0); + + if (variant[1].enemyTags) + for (let tag in variant[1].enemyTags) + if (tags[tag]) w += variant[1].enemyTags[tag]; + + if (variant[1].enemyTagsMult) + for (let tag in variant[1].enemyTagsMult) + if (tags[tag]) w *= variant[1].enemyTagsMult[tag]; + + + if (w) { + cache.push({ + r: restraint, + v: KDApplyVariants[variant[0]], + w: w, + }); + } + } + } + } + } + } + } + + // Filter by what we can apply + let cachePossible: {r: restraint, w: number, v?: ApplyVariant, row: NPCBindingGroup, sgroup: NPCBindingSubgroup}[] = []; + + if (options?.noOverride) { + // Simple function + for (let c of cache) { + /*if (c.r.ApplyVariants) { + for (let variant of Object.entries(c.r.ApplyVariants)) { + if (effLevel >= KDApplyVariants[variant[0]].minfloor && !(effLevel >= KDApplyVariants[variant[0]].maxfloor) + && (!variant[1].enemyTags || Object.keys(variant[1].enemyTags).some((tag) => { + return tags.includes(tag) != undefined; + }))) { + variants.push(KDApplyVariants[variant[0]]); + } + } + }*/ + //for (let v of variants) { + let slot = KDGetNPCBindingSlotForItem(c.r, id, false, -1000); + if (slot) cachePossible.push({r: c.r, w: c.w, v: c.v, row: slot.row, sgroup: slot.sgroup}); + //} + } + } else { + // Complex function + // We dont do variants atm, TODO + for (let c of cache) { + /*let variants: ApplyVariant[] = [undefined]; + if (c.r.ApplyVariants) { + for (let variant of Object.entries(c.r.ApplyVariants)) { + if (effLevel >= KDApplyVariants[variant[0]].minfloor && !(effLevel >= KDApplyVariants[variant[0]].maxfloor) + && (!variant[1].enemyTags || Object.keys(variant[1].enemyTags).some((tag) => { + return tags.includes(tag) != undefined; + }))) { + variants.push(KDApplyVariants[variant[0]]); + } + } + }*/ + //for (let v of variants) { + let power = KDGetNPCRestraintPower( + { + name: c.r.name, + powerbonus: c.v?.powerBonus, + id: -1, + lock: "", + } + ); + let slot = KDGetNPCBindingSlotForItem(c.r, id, false, power); + if (slot) cachePossible.push({r: c.r, w: c.w, v: c.v, row: slot.row, sgroup: slot.sgroup}); + //} + + } + } + + for (let cp of cachePossible) { + ret.push({ + applyVariant: cp.v, + forceConjure: cp.r.forceConjure || options?.forceConjure, + lock: KinkyDungeonIsLockable(cp.r) ? + (options?.forceLock != undefined ? options.forceLock : cp.r.DefaultLock) || options?.fallbackLock + : undefined, + restraint: cp.r, + row: cp.row, + slot: cp.sgroup + }); + } + + + return ret; +} \ No newline at end of file diff --git a/Game/src/restraint/KDLocks.ts b/Game/src/restraint/KDLocks.ts new file mode 100644 index 000000000..e688036fe --- /dev/null +++ b/Game/src/restraint/KDLocks.ts @@ -0,0 +1,1298 @@ +"use strict"; + + + +let KDLocks: Record = { + "Rubber": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return Enemy?.Enemy?.tags.rubber || Enemy?.Enemy?.tags.slime || Enemy?.Enemy?.tags.latex; + }, + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return false; + }, + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return 0; + }, + + consume_key: false, + lockmult: 1.1, + // Picking + pickable: true, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 1.5, // Multiplies the picking rate + pick_diff: -0.1, // Added to the item's pick difficulty + + canPick: (_data) => { + return false; + }, + doPick: (_data) => { + return false; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return false; + }, + + // Key + unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock + key: "Knife", + canUnlock: (_data) => { + return KinkyDungeonGetAffinity(false, "Sharp"); + }, + doUnlock: (_data) => { + return true; + }, + removeKeys: (_data) => { + + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: true, + }, + "Crystal": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return Enemy?.Enemy?.tags.crystal || Enemy?.Enemy?.tags.chaos || Enemy?.Enemy?.tags.elemental; + }, + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return false; + }, + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return 0; + }, + + consume_key: false, + lockmult: 2.0, + // Picking + pickable: true, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 1.5, // Multiplies the picking rate + pick_diff: -0.1, // Added to the item's pick difficulty + + canPick: (_data) => { + return false; + }, + doPick: (_data) => { + return false; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return false; + }, + + // Key + unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock + key: "Knife", + canUnlock: (_data) => { + return KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax * 0.25; + }, + doUnlock: (data) => { + KinkyDungeonSendTextMessage(10, TextGet("KDCrystalUnlock"), "#ffff00", 2); + KinkyDungeonLock(data.item, "ExCrystal"); + KDChangeDistraction("crystal", "lock", "unlock", -1); + return false; + }, + removeKeys: (_data) => { + + }, + failUnlock: (_data) => { + return "Fail"; + }, + penalty: { + "Struggle": 0.05, + "Cut": 0.1, + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: true, + }, + "ExCrystal": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 0 || Enemy?.Enemy?.tags.crystal || Enemy?.Enemy?.tags.chaos || Enemy?.Enemy?.tags.elemental; + }, + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return false; + }, + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return 0; + }, + + consume_key: false, + lockmult: 1.5, + // Picking + pickable: true, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 1.5, // Multiplies the picking rate + pick_diff: -0.1, // Added to the item's pick difficulty + + canPick: (_data) => { + return true; + }, + doPick: (_data) => { + return true; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return KDRandom()*1.5 < KinkyDungeonKeyGetPickBreakChance(); + }, + + // Key + unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock + key: "Red", + canUnlock: (_data) => { + return KinkyDungeonItemCount("RedKey") > 0 || KinkyDungeonInventoryGet("CuffKeys") != undefined; + }, + doUnlock: (data) => { + if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.25) { + KinkyDungeonSendTextMessage(10, TextGet("KDCrystalLock"), "#ffff00", 2); + KinkyDungeonLock(data.item, "Crystal"); + return false; + } + return true; + }, + removeKeys: (data) => { + if (data?.unlock && !KinkyDungeonInventoryGet("CuffKeys") && KinkyDungeonItemCount("RedKey") > 0) { + KDAddConsumable("RedKey", -1); + KinkyDungeonSendTextMessage(4, TextGet("KDConvertToHandcuffsKey"), "lightgreen", 2); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("CuffKeys"), 1); + } else if (!data?.unlock) { + if (KinkyDungeonItemCount("RedKey") > 0) { + KDAddConsumable("RedKey", -1); + KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); + } else if (KinkyDungeonInventoryGet("CuffKeys")) { + KinkyDungeonDropItem({name: "CuffKeys"}, KinkyDungeonPlayerEntity, true, true); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("CuffKeys"), -1); + } + } + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: true, + }, + "Cyber": { + specialActions: (tile, player) => { + KDCyberActions(tile, player, 20); + }, + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return Enemy?.Enemy?.tags.robot || Enemy?.Enemy?.tags.cyborg || Enemy?.Enemy?.tags.dollsmith || Enemy?.Enemy?.tags.cyberaccess || KDEnemyHasFlag(Enemy, "cyberaccess"); + }, + + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return false; + }, + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return 0; + }, + + consume_key: false, + lockmult: 2.9, + // Picking + pickable: false, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 1.5, // Multiplies the picking rate + pick_diff: -0.1, // Added to the item's pick difficulty + + hackPick: true, + + canPick: (_data) => { + return false; + }, + doPick: (_data) => { + return false; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return false; + }, + + // Key + unlockable: false, // rather than calling the function (which could vary) this is for classifying the lock + key: "KeyCard", + canUnlock: (_data) => { + return KinkyDungeonInventoryGet("KeyCard") != undefined; + }, + unlock_diff: -1.0, + doUnlock: (data) => { + //if (!data.NoEvent) + // KDCyberUnlock(data, 20); + return true; + }, + removeKeys: (_data) => { + if (!_data?.unlock) { + KDAddConsumable("KeyCard", -1); + KinkyDungeonDropItem({name: "KeyCard"}, KinkyDungeonPlayerEntity, true); + } else { + KDCyberUnlock(_data, 20); + } + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: false, + }, + "Cyber2": { + specialActions: (tile, player) => { + KDCyberActions(tile, player, 50); + }, + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return Enemy?.Enemy?.tags.robot || Enemy?.Enemy?.tags.cyborg || Enemy?.Enemy?.tags.dollsmith || Enemy?.Enemy?.tags.cyberaccess || KDEnemyHasFlag(Enemy, "cyberaccess"); + }, + + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return false; + }, + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return 0; + }, + + consume_key: false, + lockmult: 3.15, + // Picking + pickable: false, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 1.5, // Multiplies the picking rate + pick_diff: -0.1, // Added to the item's pick difficulty + + hackPick: true, + + penalty: { + "Struggle": 0.25, + "Cut": 0.2, + }, + + canPick: (_data) => { + return false; + }, + doPick: (_data) => { + return false; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return false; + }, + + // Key + unlockable: false, // rather than calling the function (which could vary) this is for classifying the lock + key: "KeyCard", + canUnlock: (_data) => { + return KinkyDungeonInventoryGet("KeyCard") != undefined; + }, + unlock_diff: -1.0, + doUnlock: (data) => { + //if (!data.NoEvent) + // KDCyberUnlock(data, 50); + return true; + }, + removeKeys: (_data) => { + if (!_data?.unlock) { + KDAddConsumable("KeyCard", -1); + KinkyDungeonDropItem({name: "KeyCard"}, KinkyDungeonPlayerEntity, true); + } else { + KDCyberUnlock(_data, 50); + } + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: false, + }, + "Cyber3": { + specialActions: (tile, player) => { + KDCyberActions(tile, player, 150); + }, + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return Enemy?.Enemy?.tags.robot || Enemy?.Enemy?.tags.cyborg || Enemy?.Enemy?.tags.dollsmith || Enemy?.Enemy?.tags.cyberaccess || KDEnemyHasFlag(Enemy, "cyberaccess"); + }, + + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return false; + }, + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return 0; + }, + + penalty: { + "Struggle": 0.35, + "Cut": 0.35, + }, + + consume_key: false, + lockmult: 3.5, + // Picking + pickable: false, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 1.5, // Multiplies the picking rate + pick_diff: -0.1, // Added to the item's pick difficulty + + hackPick: true, + + canPick: (_data) => { + return false; + }, + doPick: (_data) => { + return false; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return false; + }, + + // Key + unlockable: false, // rather than calling the function (which could vary) this is for classifying the lock + key: "KeyCard", + canUnlock: (_data) => { + return KinkyDungeonInventoryGet("KeyCard") != undefined; + }, + unlock_diff: -1.0, + doUnlock: (data) => { + //if (!data.NoEvent) + // KDCyberUnlock(data, 150); + return true; + }, + removeKeys: (_data) => { + if (!_data?.unlock) { + KDAddConsumable("KeyCard", -1); + KinkyDungeonDropItem({name: "KeyCard"}, KinkyDungeonPlayerEntity, true); + } else { + KDCyberUnlock(_data, 150); + } + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: false, + }, + "White": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 0; + }, + filter: (_Guaranteed, Floor, _AllowGold, _Type) => { + return Floor < 11; + }, + weight: (_Guaranteed, Floor, _AllowGold, _Type) => { + return Math.max(10, 100 - Floor * 10); + }, + + consume_key: false, + lockmult: 1.4, + // Picking + pickable: true, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 1.5, // Multiplies the picking rate + pick_diff: -0.1, // Added to the item's pick difficulty + + canPick: (_data) => { + return true; + }, + doPick: (_data) => { + return true; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return KDRandom()*1.5 < KinkyDungeonKeyGetPickBreakChance(); + }, + + // Key + unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock + key: "Red", + canUnlock: (_data) => { + return KinkyDungeonItemCount("RedKey") > 0 || KinkyDungeonInventoryGet("CuffKeys") != undefined; + }, + doUnlock: (_data) => { + return true; + }, + removeKeys: (data) => { + if (data?.unlock && !KinkyDungeonInventoryGet("CuffKeys") && KinkyDungeonItemCount("RedKey") > 0) { + KDAddConsumable("RedKey", -1); + KinkyDungeonSendTextMessage(4, TextGet("KDConvertToHandcuffsKey"), "lightgreen", 2); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("CuffKeys"), 1); + } else if (!data?.unlock) { + if (KinkyDungeonItemCount("RedKey") > 0) { + KDAddConsumable("RedKey", -1); + KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); + } else if (KinkyDungeonInventoryGet("CuffKeys")) { + KinkyDungeonDropItem({name: "CuffKeys"}, KinkyDungeonPlayerEntity, true, true); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("CuffKeys"), -1); + } + } + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: true, + }, + "Red": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 1; + }, + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return true; + }, + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return 50; + }, + + consume_key: true, + lockmult: 1.7, + // Picking + pickable: true, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 1.0, // Multiplies the picking rate + pick_diff: 0.0, // Added to the item's pick difficulty + + canPick: (_data) => { + return true; + }, + doPick: (_data) => { + return true; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return KDRandom() < KinkyDungeonKeyGetPickBreakChance(); + }, + + // Key + unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock + key: "Red", + canUnlock: (_data) => { + return KinkyDungeonItemCount("RedKey") > 0; + }, + doUnlock: (_data) => { + + return true; + }, + removeKeys: (data) => { + KDAddConsumable("RedKey", -1); + if (!data?.unlock) { + KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); + } + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: true, + }, + "Red_Med": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 1; + }, + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return true; + }, + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { + return 15 + Floor * 3; + }, + + consume_key: true, + lockmult: 1.8, + // Picking + pickable: true, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 1.0, // Multiplies the picking rate + pick_diff: 0.0, // Added to the item's pick difficulty + pick_lim: 0.15, // Added to the item's pick limitchance + + canPick: (_data) => { + return true; + }, + doPick: (_data) => { + return true; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return KDRandom() < KinkyDungeonKeyGetPickBreakChance(); + }, + + // Key + unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock + key: "Red", + canUnlock: (_data) => { + return KinkyDungeonItemCount("RedKey") > 0; + }, + doUnlock: (_data) => { + + return true; + }, + removeKeys: (data) => { + KDAddConsumable("RedKey", -1); + if (!data?.unlock) { + KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); + } + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: true, + }, + "Red_Hi": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 1; + }, + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return true; + }, + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { + return 15 + Floor * 3; + }, + + consume_key: true, + lockmult: 1.9, + // Picking + pickable: true, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 1.0, // Multiplies the picking rate + pick_diff: 0.0, // Added to the item's pick difficulty + pick_lim: 0.3, // Added to the item's pick limitchance + + canPick: (_data) => { + return true; + }, + doPick: (_data) => { + return true; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return KDRandom() < KinkyDungeonKeyGetPickBreakChance(); + }, + + // Key + unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock + key: "Red", + canUnlock: (_data) => { + return KinkyDungeonItemCount("RedKey") > 0; + }, + doUnlock: (_data) => { + + return true; + }, + removeKeys: (data) => { + KDAddConsumable("RedKey", -1); + if (!data?.unlock) { + KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); + } + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: true, + }, + "HiSec": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 2; + }, + filter: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { + return Floor > 2; + }, + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { + return 16 + Floor * 4; + }, + + consume_key: true, + lockmult: 2.2, + // Picking + pickable: true, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 0.5, // Multiplies the picking rate + pick_diff: -1.0, // Added to the item's pick difficulty + pick_lim: 1.0, // Added to the item's pick limitchance + + canPick: (_data) => { + return true; + }, + doPick: (_data) => { + return true; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return KDRandom() < KinkyDungeonKeyGetPickBreakChance(); + }, + + // Key + unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock + key: "Red", + canUnlock: (_data) => { + return KinkyDungeonItemCount("RedKey") > 0; + }, + doUnlock: (_data) => { + + return true; + }, + removeKeys: (data) => { + KDAddConsumable("RedKey", -1); + if (!data?.unlock) { + KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); + } + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: true, + }, + "Disc": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 2; + }, + filter: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { + return Floor > 1; + }, + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { + return 20 + Floor * 5; + }, + + consume_key: true, + lockmult: 2, + // Picking + pickable: true, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 0.5, // Multiplies the picking rate + pick_diff: -0.25, // Added to the item's pick difficulty + pick_lim: 0.3, // Added to the item's pick limitchance + + canPick: (_data) => { + let pick = KinkyDungeonInventoryGet("DiscPick"); + //if (!data.noMsg) KinkyDungeonSendTextMessage(10, TextGet("KDNeedDiscPick"), "#ffffff", 2, true); + return pick != undefined; + }, + doPick: (_data) => { + return true; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return KDRandom() < KinkyDungeonKeyGetPickBreakChance(); + }, + + // Key + unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock + key: "Red", + canUnlock: (_data) => { + return KinkyDungeonItemCount("RedKey") > 0; + }, + doUnlock: (_data) => { + + return true; + }, + removeKeys: (data) => { + KDAddConsumable("RedKey", -1); + if (!data?.unlock) { + KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); + } + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: false, + loot_locked: true, + }, + "Blue": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 3 || (Enemy?.Enemy?.unlockCommandLevel > 1 && KDEnemyCanTalk(Enemy)); + }, + filter: (_Guaranteed, Floor, _AllowGold, Type, _Data) => { + return Type != "Door" && Floor > 4; + }, + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { + return 8 * Floor - 30; + }, + + consume_key: true, + lockmult: 3.0, + penalty: { + "Struggle": 0.1, + "Cut": 0.15, + }, + + // Picking + pickable: false, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 0.0, // Multiplies the picking rate + pick_diff: 0.0, // Added to the item's pick difficulty + + canPick: (_data) => { + return false; + }, + doPick: (_data) => { + return false; + }, + failPick: (_data) => { + return "Break"; + }, + breakChance: (_data) => { + return true; + }, + + // Key + unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock + key: "Blue", + canUnlock: (_data) => { + return KinkyDungeonItemCount("BlueKey") > 0; + }, + doUnlock: (_data) => { + return true; + }, + removeKeys: (data) => { + KDAddConsumable("BlueKey", -1); + if (!data?.unlock) { + KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); + } + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: true, + loot_locked: false, + }, + "Gold": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 3 || Enemy?.Enemy?.tags.robot || Enemy?.Enemy?.tags.cyborg || (Enemy?.Enemy?.unlockCommandLevel > 2 && KDEnemyCanTalk(Enemy)); + }, + filter: (_Guaranteed, Floor, AllowGold, _Type, _Data) => { + return AllowGold && Floor > 10; + }, + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { + return 2 * Floor - 15; + }, + + consume_key: true, + lockmult: 3.3, + penalty: { + "Struggle": 0.2, + "Cut": 0.3, + }, + + // Picking + pickable: false, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 0.0, // Multiplies the picking rate + pick_diff: 0.0, // Added to the item's pick difficulty + + canPick: (_data) => { + return false; + }, + doPick: (_data) => { + return false; + }, + failPick: (_data) => { + return "Break"; + }, + breakChance: (_data) => { + return true; + }, + + // Key + unlockable: true, // rather than calling the function (which could vary) this is for classifying the lock + key: "Mistress", + canUnlock: (_data) => { + return KinkyDungeonItemCount("MistressKey") > 0; + }, + doUnlock: (_data) => { + return true; + }, + removeKeys: (data) => { + if (!data?.unlock && KinkyDungeonItemCount("MistressKey") > 0) { + KinkyDungeonDropItem({name: "MistressKey"}, KinkyDungeonPlayerEntity, true); + } + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("MistressKey"), -1); + }, + failUnlock: (_data) => { + return "Fail"; + }, + + doLock: (data) => { + if (data.item && !data.link) { + if (!data.item.data) data.item.data = {}; + data.item.data.lockTimer = MiniGameKinkyDungeonLevel + 2; + } + }, + // Start of level -- for gold locks and others + levelStart: (item) => { + if ((MiniGameKinkyDungeonLevel >= item.data?.lockTimer || !item.data?.lockTimer || item.data?.lockTimer >= KinkyDungeonMaxLevel)) { + KinkyDungeonLock(item, "Blue"); + KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonGoldLockRemove"), "yellow", 2); + } + }, + shrineImmune: true, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: true, + loot_locked: false, + }, + "Divine": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 4 || Enemy?.Enemy?.tags.angel || Enemy?.Enemy?.tags.holy; + }, + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return false; + }, + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return 0; + }, + + consume_key: false, + lockmult: 5, + penalty: { + "Struggle": 50, + "Cut": 50, + }, + + // Picking + pickable: false, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 0.0, // Multiplies the picking rate + pick_diff: 0.0, // Added to the item's pick difficulty + + canPick: (_data) => { + return false; + }, + doPick: (_data) => { + return false; + }, + failPick: (_data) => { + return "Break"; + }, + breakChance: (_data) => { + return true; + }, + + // Key + unlockable: false, // rather than calling the function (which could vary) this is for classifying the lock + key: "Blue", + canUnlock: (_data) => { + return false; + }, + doUnlock: (_data) => { + return true; + }, + removeKeys: (_data) => { + // + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks and others + levelStart: (_item) => { + KinkyDungeonSendTextMessage(8, TextGet("KDDivineLockReminder"), "#ffff44", 2, false, true); + }, + shrineImmune: true, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: true, + loot_locked: false, + }, + "Divine2": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 4 || Enemy?.Enemy?.tags.angel || Enemy?.Enemy?.tags.holy; + }, + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return false; + }, + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return 0; + }, + + consume_key: false, + lockmult: 5, + penalty: { + "Struggle": 50, + "Cut": 50, + }, + + // Picking + pickable: false, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 0.0, // Multiplies the picking rate + pick_diff: 0.0, // Added to the item's pick difficulty + + canPick: (_data) => { + return false; + }, + doPick: (_data) => { + return false; + }, + failPick: (_data) => { + return "Break"; + }, + breakChance: (_data) => { + return true; + }, + + // Key + unlockable: false, // rather than calling the function (which could vary) this is for classifying the lock + key: "Blue", + canUnlock: (_data) => { + return false; + }, + doUnlock: (_data) => { + return true; + }, + removeKeys: (_data) => { + // + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks and others + levelStart: (_item) => { + }, + shrineImmune: true, + + // Command word + commandlevel: 0, // rather than calling the function (which could vary) this is for classifying the lock + commandable: false, + command_lesser: () => {return 0.0 ;}, + command_greater: () => {return 0.0;}, + command_supreme: () => {return 0.0;}, + + loot_special: true, + loot_locked: false, + }, + "Purple": { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { + return KDEnemyRank(Enemy) > 3 || (Enemy?.Enemy?.unlockCommandLevel > 0 &&KDEnemyCanTalk(Enemy)); + }, + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { + return true; + }, + weight: (_Guaranteed, _Floor, _AllowGold, _Type, Data) => { + return 30 + 30 * (Data?.enemy?.Enemy.unlockCommandLevel > 0 ? Data?.enemy?.Enemy.unlockCommandLevel : (Data?.enemy ? -1 : 0)); + }, + + consume_key: false, + lockmult: 2.2, + + // Picking + pickable: false, // rather than calling the function (which could vary) this is for classifying the lock + pick_speed: 0.0, // Multiplies the picking rate + pick_diff: 0.0, // Added to the item's pick difficulty + + canPick: (_data) => { + return false; + }, + doPick: (_data) => { + return false; + }, + failPick: (_data) => { + return "Fail"; + }, + breakChance: (_data) => { + return false; + }, + + // Key + unlockable: false, // rather than calling the function (which could vary) this is for classifying the lock + key: "Blue", + canUnlock: (_data) => { + return false; + }, + doUnlock: (_data) => { + return true; + }, + removeKeys: (_data) => { + // + }, + failUnlock: (_data) => { + return "Fail"; + }, + + // Start of level -- for gold locks + levelStart: (_item) => { + }, + shrineImmune: false, + + // Command word + commandlevel: 1, // rather than calling the function (which could vary) this is for classifying the lock + commandable: true, + command_lesser: () => {return 1.0 ;}, + command_greater: () => {return 3.0;}, + command_supreme: () => {return 10.0;}, + + loot_special: false, + loot_locked: true, + }, +}; + +/** + * @returns {boolean} + */ +function KDCyberHostile(player: entity): boolean { + let faction = player.player ? "Player" : KDGetFaction(player); + if (faction == "Player") { + return KDGameData.HostileFactions.includes("AncientRobot") || ( + KDGameData.PrisonerState == 'chase' && KDFactionRelation(KDGetMainFaction(), "AncientRobot") > 0.11 + ); + } + return KDFactionRelation(faction, "AncientRobot") < -0.45; +} + +/** + * @param player + */ +function KDCyberAccess(player: entity): boolean { + let faction = player.player ? "Player" : KDGetFaction(player); + if (faction == "Player") { + return !KDGameData.HostileFactions.includes("AncientRobot") + && !(KDGameData.PrisonerState == 'chase' && KDFactionRelation(KDGetMainFaction(), "AncientRobot") > 0.11) + && KDFactionRelation(faction, "AncientRobot") > 0.25 + ; + } + return KDFactionRelation(faction, "AncientRobot") > 0.25; +} + +/** + * @param player + */ +function KDCyberLink(player: entity): boolean { + if (player.player) { + return KinkyDungeonPlayerTags.get("CyberLink") || KinkyDungeonFlags.get("CyberLink"); + } + return player.Enemy?.tags.cyberlink; +} +/** + * @param player + */ +function KDTryHack(player: entity): boolean { + return KDRandom() < (KDCyberLink(player) ? 0.5 : 0); +} + +function KDCyberUnlock(data: any, base: number = 20): boolean { + KDLockoutGain(KinkyDungeonPlayerEntity, data, base); + KDGameData.LockoutChance = Math.min((KDGameData.LockoutChance || 0) + data.lockoutgain, 1); + if (KDLockoutChance(KinkyDungeonPlayerEntity) >= 0.99) { + data.lockout = true; + KinkyDungeonSendEvent("beforelockout", data); + if (data.lockout) { + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("KeyCard"), -1); + KinkyDungeonSendTextMessage(10, TextGet("KDLockoutTickEnd").replace("AMNT", "" + Math.round(KDGameData.LockoutChance * 100)), "#ff5277", 2); + KinkyDungeonSendTextMessage(10, TextGet("KDLockout"), "#ff5277", 2); + KinkyDungeonSendEvent("lockout", data); + } + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDLockoutTick").replace("AMNT", "" + Math.round(KDGameData.LockoutChance * 100)), "#ff5277", 2); + } + return true; +} + +function KDCyberActions(_data: any, player: entity, base: number) { + DrawButtonKDEx("ModalDoorSwipe", () => { + if (KinkyDungeonTargetTile) + KDSendInput("swipe", {targetTile: KinkyDungeonTargetTileLocation, base: base}); + return true; + }, true, KDModalArea_x + 175, KDModalArea_y + 25, 250, 60, TextGet("KinkyDungeonSwipeDoor"), + (KinkyDungeonInventoryGet("KeyCard")) ? "#ffffff" : "#ff5277", "", ""); + + DrawButtonKDEx("ModalDoorScan", () => { + if (KinkyDungeonTargetTile) + KDSendInput("scan", {targetTile: KinkyDungeonTargetTileLocation, base: base}); + return true; + }, true, KDModalArea_x + 450, KDModalArea_y + 25, 250, 60, TextGet("KinkyDungeonScanDoor"), + !KDIsBlindfolded(player) + ? "#ffffff" : "#ff5277", "", ""); + + DrawButtonKDEx("ModalDoorHack", () => { + if (KinkyDungeonTargetTile) + KDSendInput("hack", {targetTile: KinkyDungeonTargetTileLocation, base: base}); + return true; + }, true, KDModalArea_x + 725, KDModalArea_y + 25, 250, 60, TextGet("KinkyDungeonHackDoor"), + KDCanHack(player) + ? "#ffffff" : "#ff5277", "", ""); +} diff --git a/Game/src/restraint/KDTethers.ts b/Game/src/restraint/KDTethers.ts new file mode 100644 index 000000000..e68d58143 --- /dev/null +++ b/Game/src/restraint/KDTethers.ts @@ -0,0 +1,423 @@ + +let KDLeashPullCost = 0.5; +let KDLeashPullKneelTime = 5; + +let KDLeashablePersonalities = { + "": (entity: entity, leasher: entity) => { + // Switches refuse unless you are friendly to them. + return (!KDHostile(entity, leasher) && KDFactionRelation(KDGetFaction(entity), KDGetFaction(leasher)) > 0.5) || KDBoundEffects(entity) > 1; + }, + "Dom": (entity: entity, leasher: entity) => { + // Doms always refuse. You need to tie them. + return KDBoundEffects(entity) > 1; + }, + "Sub": (entity: entity, leasher: entity) => { + // Subs will always let you leash them unless you are hostile + return !KDHostile(entity, leasher) || KDBoundEffects(entity) > 1; + }, + "Brat": (entity: entity, leasher: entity) => { + // Brats must be distracted to start leashing, or already leashed + return (!KDHostile(entity, leasher) && entity.leash) || entity.distraction > entity.Enemy.maxhp*0.25 || KDBoundEffects(entity) > 1; + }, +}; + +let KDLeashReason : {[_: string]: (entity: entity) => boolean} = { + ShadowTether: (entity) => { + if (!(entity.leash.entity && KinkyDungeonFindID(entity.leash.entity)?.Enemy?.tags?.shadow)) + return false; + if (entity.leash.entity && KinkyDungeonFindID(entity.leash.entity) + && KinkyDungeonIsDisabled(KinkyDungeonFindID(entity.leash.entity))) return false; + if (entity.player) { + return KinkyDungeonPlayerTags.get("Shadow"); + } else { + return KDBoundEffects(entity) > 1 && !KDIsImprisoned(entity); + } + }, + PlayerLeash: (entity) => { + //if (!KinkyDungeonInventoryGetConsumable("LeashItem") && !KDHasSpell("LeashSkill")) return false; + if (entity + // Condition 1: the target is willing + && !(KDWillingLeash(entity)) + // Condition 1.5: the target is made willing + && !(KDCanApplyBondage(entity, KDPlayer())) + // Condition 2: the player has the Brat Handler skill and target is wearing a leash item + && !(KDHasSpell("LeashSkill") && KDGetNPCRestraints(entity.id) && Object.values(KDGetNPCRestraints(entity.id)) + .some((rest) => {return KDRestraint(rest)?.leash;})) + ) + return false; + if (KDPlayerIsDisabled() || KinkyDungeonIsHandsBound(true, true, 0.5)) return false; + return !KDIsImprisoned(entity); + }, + Default: (entity) => { + if (entity.leash && entity.leash.reason == "Default") { + if (entity.leash.entity) { + let leasher = KDLookupID(entity.leash.entity); + if (!leasher) return false; + if (!leasher.player) { + if (KinkyDungeonIsDisabled(leasher)) return false; + } + } + } + if (entity.player) { + if (KinkyDungeonPlayerTags.get("Leashable")) + return !KDIsImprisoned(entity); + else return false; + } + return !KDIsImprisoned(entity); + }, + WolfgirlLeash: (entity) => { + if (entity.leash && entity.leash.reason == "WolfgirlLeash") { + if (entity.leash.entity) { + let leasher = KDLookupID(entity.leash.entity); + if (!leasher || KDEntityHasFlag(leasher, "aggression")) { + return false; + } + } + } + // Careful about recursion + return KDLeashReason.Default(entity); + }, + DollLeash: (entity) => { + if (entity.leash && entity.leash.reason == "DollLeash") { + if (entity.leash.entity) { + let leasher = KDLookupID(entity.leash.entity); + if (!leasher || KDEntityHasFlag(leasher, "aggression") || !KDEntityHasFlag(leasher, "leashPrisoner")) { + return false; + } + } + } + // Careful about recursion + return KDLeashReason.Default(entity); + }, +}; + +function KDGetLeashedToCount(entity: entity): number { + let n = 0; + for (let en of KDMapData.Entities.filter((en) => {return en.leash?.entity;})) { + if (en.leash.entity == entity.id) n++; + } + if (KDPlayer().leash?.entity == entity.id) n++; + return n; +} + +function KDGetLeashedTo(entity: entity): entity[] { + let ret: entity[] = []; + for (let en of KDMapData.Entities.filter((en) => {return en.leash?.entity;})) { + if (en.leash.entity == entity.id) ret.push(en); + } + if (KDPlayer().leash?.entity == entity.id) ret.push(KDPlayer()); + return ret; +} + +function KDGetTetherLength(entity: entity): number { + if (!entity) entity = KDPlayer(); + if (entity.leash) { + return entity.leash.length || 2.5; + } + return 0; +} + +function KDIsPlayerTethered(entity: entity): boolean { + if (!entity) entity = KDPlayer(); + if (entity.leash) { + KDUpdateLeashCondition(entity); + return entity.leash != undefined; + } + if (entity.player) { + let found = KinkyDungeonFindID(KDGameData.KinkyDungeonLeashingEnemy); + if (!found) KDGameData.KinkyDungeonLeashingEnemy = 0; + return KDGameData.KinkyDungeonLeashedPlayer > 0; + } + return false; +} + +/** Updates the leash and returns true if the leash survives or false if removed */ +function KDUpdateLeashCondition(entity: entity, noDelete: boolean = false) : boolean { + if (entity.leash?.reason) { + if (!KDLeashReason[entity.leash.reason] || !KDLeashReason[entity.leash.reason](entity)) { + if (!noDelete) + delete entity.leash; + return false; + } + } + return true; +} + +function KinkyDungeonAttachTetherToEntity(dist: number, entity: entity, player: entity, reason: string = "Default", color?: string, priority: number = 5, item: item = null): KDLeashData { + if (!player) player = KDPlayer(); + + if (!player.leash || priority > player.leash.priority) { + player.leash = { + x: entity.x, + y: entity.y, + entity: entity.player ? -1 : entity.id, + reason: reason, + color: color, + length: dist || 2, + priority: priority, + restraintID: item?.id, + }; + return player.leash; + } + return undefined; +} + +function KDIsPlayerTetheredToLocation(player: entity, x: number, y: number, entity?: entity): boolean { + if (!player.player) return false; + if (player.leash) { + if (entity && KDIsPlayerTetheredToEntity(player, KDLookupID(entity.id))) { + return true; + } else if (player.leash.x == x && player.leash.y == y) return true; + else if (entity && player.leash.x == entity.x && player.leash.y == entity.y) return true; + } + return false; +} + +function KDIsPlayerTetheredToEntity(player: entity, entity: entity) { + if (!player.player) return false; + + if (player.leash) { + let host = KDLookupID(player.leash.entity); + if (host?.id == entity?.id) { + return true; + } + } + return false; +} + + + +function KDBreakTether(player: entity): boolean { + if (player?.leash) { + delete player.leash; + return true; + } + return false; +} + + +function KinkyDungeonDrawTethers(CamX: number, CamY: number) { + KDTetherGraphics.clear(); + if (!KDGameBoardAddedTethers) { + kdgameboard.addChild(KDTetherGraphics); + KDGameBoardAddedTethers = true; + } + + let drawTether = (entity: entity) => { + if (entity.leash && (KinkyDungeonVisionGet(entity.x, entity.y) > 0.5 || KinkyDungeonVisionGet(entity.leash.x, entity.leash.y) > 0.5)) { + let xx = canvasOffsetX + (entity.visual_x - CamX)*KinkyDungeonGridSizeDisplay; + let yy = canvasOffsetY + (entity.visual_y - CamY)*KinkyDungeonGridSizeDisplay; + let txx = canvasOffsetX + (entity.leash.x - CamX)*KinkyDungeonGridSizeDisplay; + let tyy = canvasOffsetY + (entity.leash.y - CamY)*KinkyDungeonGridSizeDisplay; + let leasher = entity.leash.entity ? KDLookupID(entity.leash.entity) : undefined; + if (leasher) { + txx = canvasOffsetX + (leasher.visual_x - CamX)*KinkyDungeonGridSizeDisplay; + tyy = canvasOffsetY + (leasher.visual_y - CamY)*KinkyDungeonGridSizeDisplay; + txx += KinkyDungeonGridSizeDisplay * (leasher.flip ? 0.2 : -0.2); + } + let dx = (txx - xx); + let dy = (tyy - yy); + let dd = 0.1; // Increments + let color = entity.leash.color; + if (!color || color == "Default") color = "#aaaaaa"; + if (Array.isArray(color)) color = color[0]; + KDTetherGraphics.lineStyle(entity.player ? 3 : 2, string2hex(color), 1); + for (let d = dd; d < 1 - dd; d += dd) { + let yOffset = 30 * Math.sin(Math.PI * d); + let yOffset2 = 30 * Math.sin(Math.PI * (d + dd)); + KDTetherGraphics.moveTo(KinkyDungeonGridSizeDisplay/2 + xx + dx*d, KinkyDungeonGridSizeDisplay*0.5 + yOffset + yy + dy*d); + KDTetherGraphics.lineTo(KinkyDungeonGridSizeDisplay/2 + xx + dx*(d+dd), KinkyDungeonGridSizeDisplay*0.5 + yOffset2 + yy + dy*(d+dd)); + } + } + + }; + + drawTether(KDPlayer()); + for (let enemy of KDMapData.Entities) { + drawTether(enemy); + } +} + +function KDBreakAllLeashedTo(entity: entity, reason?: string) { + for (let en of KDMapData.Entities) { + if (en.leash && en.leash.entity == entity.id && (!reason || en.leash.reason == reason)) { + KDBreakTether(en); + } + } +} + +function KinkyDungeonUpdateTether(Msg: boolean, Entity: entity, xTo?: number, yTo?: number): boolean { + + if (Entity.player && KinkyDungeonFlags.get("pulled")) return false; + else if (KDEnemyHasFlag(Entity, "pulled")) return false; + + KDUpdateLeashCondition(Entity, false); + + if (Entity.leash) { + let exceeded = false; + let leash = Entity.leash; + let tether = leash.length; + + if (leash.entity) { + let target = KDLookupID(leash.entity); + if (!target) { + KDBreakTether(Entity); + return false; + } else { + leash.x = target.x; + leash.y = target.y; + } + } + + let restraint = (Entity.player && leash.restraintID) ? KinkyDungeonAllRestraintDynamic().find((inv) => {return inv.item.id == leash.restraintID;}) : undefined; + + if (!restraint && (Entity.player && leash.restraintID)) { + KDBreakTether(Entity); + } + + if (Entity.player) { + KDGameData.KinkyDungeonLeashedPlayer = Math.max(KDGameData.KinkyDungeonLeashedPlayer, 5); + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).removeOnLeash) { + KinkyDungeonRemoveRestraint(KDRestraint(inv).Group, false); + if (KDRestraint(inv).Group == "ItemDevices") { + KinkyDungeonSetFlag("Released", 15); + KinkyDungeonSetFlag("nojailbreak", 15); + } + } + } + } + + if (xTo || yTo) {// This means we are trying to move + let pathToTether = KinkyDungeonFindPath(xTo, yTo, leash.x, leash.y, false, !Entity.player, false, KinkyDungeonMovableTilesSmartEnemy); + let playerDist = Math.max(pathToTether?.length || 0, KDistChebyshev(xTo-leash.x, yTo-leash.y)); + // Fallback + if (playerDist > tether && KDistEuclidean(xTo-leash.x, yTo-leash.y) > KDistEuclidean(Entity.x-leash.x, Entity.y-leash.y)) { + if (Msg && leash.restraintID) { + if (restraint) { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonTetherTooShort").replace("TETHER", KDGetItemName(restraint.item)), "#ff5277", 2, true); + } + } + if (Entity.player) { + if (KinkyDungeonCanStand() && !KDForcedToGround()) { + KDGameData.KneelTurns = Math.max(KDGameData.KneelTurns, KDLeashPullKneelTime + KDGameData.SlowMoveTurns); + KDChangeWill("leashtug", "restraint", "move", -KDLeashPullCost, false); + } + } else { + Entity.stun = Math.max(Entity.stun || 0, 2); + } + + //return true; + if (Entity.player) KinkyDungeonSetFlag("leashtug", 3); + else KinkyDungeonSetEnemyFlag(Entity, "leashtug", 3); + exceeded = true; + } + } + for (let i = 0; i < 10; i++) { + // Distance is in pathing units + let pathToTether = KinkyDungeonFindPath(Entity.x, Entity.y, leash.x, leash.y, KDIDHasFlag(Entity.id, "blocked"), !Entity.player, false, KinkyDungeonMovableTilesSmartEnemy); + let playerDist = pathToTether?.length; + // Fallback + if (!pathToTether) playerDist = KDistChebyshev(Entity.x-leash.x, Entity.y-leash.y); + if (playerDist > tether) { + let slot = null; + if (pathToTether + && pathToTether?.length > 0 + && ( + KDistEuclidean(pathToTether[0].x - leash.x, pathToTether[0].y - leash.y) > -0.01 + KDistEuclidean(Entity.x - leash.x, Entity.y - leash.y) + || KinkyDungeonFindPath(pathToTether[0].x, pathToTether[0].y, leash.x, leash.y, false, !Entity.player, false, KinkyDungeonMovableTilesSmartEnemy)?.length < pathToTether.length + ) && KDistChebyshev(pathToTether[0].x - Entity.x, pathToTether[0].y - Entity.y) < 1.5) { + slot = pathToTether[0]; + if (slot && KinkyDungeonEntityAt(slot.x, slot.y) && KDIsImmobile(KinkyDungeonEntityAt(slot.x, slot.y), true)) { + slot = null; + KDSetIDFlag(Entity.id, "blocked", 3); + } + } + + if (!slot) { + let mindist = playerDist; + for (let X = Entity.x-1; X <= Entity.x+1; X++) { + for (let Y = Entity.y-1; Y <= Entity.y+1; Y++) { + if ((X != Entity.x || Y != Entity.y) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y)) + && KDistEuclidean(X-leash.x, Y-leash.y) < mindist + && !(KinkyDungeonEntityAt(X-leash.x, Y-leash.y) + && KDIsImmobile(KinkyDungeonEntityAt(X-leash.x, Y-leash.y), true))) { + mindist = KDistEuclidean(X-leash.x, Y-leash.y); + slot = {x:X, y:Y}; + } + } + } + } + if (!slot) { //Fallback + slot = {x:leash.x, y:leash.y}; + } + if (slot && KinkyDungeonEntityAt(slot.x, slot.y) && KDIsImmobile(KinkyDungeonEntityAt(slot.x, slot.y), true)) { + slot = null; + } + if (slot) { + let enemy = KinkyDungeonEntityAt(slot.x, slot.y); + if (enemy && !enemy.player) { // && !KDHostile(Entity, enemy) + let slot2 = null; + let mindist2 = playerDist; + for (let X = enemy.x-1; X <= enemy.x+1; X++) { + for (let Y = enemy.y-1; Y <= enemy.y+1; Y++) { + if ((X != enemy.x || Y != enemy.y) + && !KinkyDungeonEntityAt(X, Y) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(X, Y)) + && KDistEuclidean(X-Entity.x, Y-Entity.y) < mindist2) { + mindist2 = KDistEuclidean(X-Entity.x, Y-Entity.y); + slot2 = {x:X, y:Y}; + } + } + } + if (slot2) { + KDMoveEntity(enemy, slot2.x, slot2.y, false); + } else { + let pointSwap = KinkyDungeonGetNearbyPoint(slot.x, slot.y, true, undefined, true, true); + if (pointSwap) + KDMoveEntity(enemy, pointSwap.x, pointSwap.y, false, undefined, undefined, true); + else + KDMoveEntity(enemy, Entity.x, Entity.y, false,undefined, undefined, true); + } + } + exceeded = true; + if (enemy?.player) continue; + // Force open door + if (KinkyDungeonMapGet(slot.x, slot.y) == 'D') KinkyDungeonMapSet(slot.x, slot.y, 'd'); + + if (Entity.player) { + KDMovePlayer(slot.x, slot.y, false, undefined, undefined); + } else { + KDMoveEntity(Entity, slot.x, slot.y, false, undefined, undefined); + } + if (Entity.player) KinkyDungeonSetFlag("pulled", 1); + else KinkyDungeonSetEnemyFlag(Entity, "pulled", 1); + if (Entity.player) KinkyDungeonSetFlag("leashtug", 3); + else KinkyDungeonSetEnemyFlag(Entity, "leashtug", 3); + if (Entity.player) { + KinkyDungeonInterruptSleep(); + KinkyDungeonSendEvent("leashTug", {Entity: Entity, slot: slot, item: restraint}); + if (KinkyDungeonLeashingEnemy()) { + KinkyDungeonSetEnemyFlag(KinkyDungeonLeashingEnemy(), "harshpull", 5); + } + if (Msg && restraint) KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonTetherPull").replace("TETHER", KDGetItemName(restraint.item)), "#ff5277", 2, true); + + } + } + } + } + return exceeded; + } + return false; + + +} + + + +function KDWillingLeash(entity: entity): boolean { + return entity?.personality != undefined + && KDLeashablePersonalities[entity.personality] + && KDLeashablePersonalities[entity.personality](entity, KDPlayer()); +} \ No newline at end of file diff --git a/Game/src/restraint/KinkyDungeonFurniture.ts b/Game/src/restraint/KinkyDungeonFurniture.ts new file mode 100644 index 000000000..f91e6b636 --- /dev/null +++ b/Game/src/restraint/KinkyDungeonFurniture.ts @@ -0,0 +1,178 @@ +'use strict'; + + +let KDFurniture = { + "Cage": { + floor: "Floor", + sprite: "Cage", + restraintTag: "cage", + restraintSetTags: { + // fiddle or yoke + "steelbondage": 1, + // leash and collar + "leashing": 2, + }, + tickFunction: (_delta) => { + if (!KDGameData.PrisonerState) { + let power = 0; + if (KDBoundPowerLevel >= 0.35) power = 2; + else if (KDBoundPowerLevel >= 0.1) power = 1; + if (power >= 2) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage2", type: "Sneak", duration: 1, power: 9.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "move", "cast"]}); + } else if (power >= 1) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage2", type: "Sneak", duration: 1, power: 2.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "move", "cast"]}); + } + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonCage" + power), "lightgreen", 1, true); + } + } + }, + "DisplayStand": { + floor: "Floor", + sprite: "DisplayStand", + restraintTag: "displaystand", + restraintSetTags: { + "trap": 5, + }, + tickFunction: (_delta) => { + if (!KDGameData.PrisonerState) { + let power = 0; + if (KDBoundPowerLevel >= 0.35) power = 2; + else if (KDBoundPowerLevel >= 0.1) power = 1; + if (power >= 2) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage2", type: "Sneak", duration: 1, power: 9.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "move", "cast"]}); + } else if (power >= 1) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage2", type: "Sneak", duration: 1, power: 2.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "move", "cast"]}); + } + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonCage" + power), "lightgreen", 1, true); + } + } + }, + "LatexDisplayStand": { + floor: "Floor", + sprite: "LatexDisplayStand", + restraintTag: "latexdollstand", + restraintSetTags: { + "latexRestraints": 5, + "latexRestraintsHeavy": 2, + }, + forceFaction: "Rubber", + tickFunction: (_delta) => { + if (!KDGameData.PrisonerState) { + let power = 0; + if (KDBoundPowerLevel >= 0.35) power = 2; + else if (KDBoundPowerLevel >= 0.1) power = 1; + if (power >= 2) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage2", type: "Sneak", duration: 1, power: 9.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "move", "cast"]}); + } else if (power >= 1) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage2", type: "Sneak", duration: 1, power: 2.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "move", "cast"]}); + } + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonCage" + power), "lightgreen", 1, true); + } + } + }, + "FutureBox": { + floor: "Floor", + sprite: "FutureBox", + restraintTag: "futurebox", + restraintSetTags: { + "cyberDollRestraints": 8, + }, + tickFunction: (_delta) => { + // Nothing yet TODO add special features like dressing the player + } + }, + "Sarcophagus": { + floor: "Brickwork", + sprite: "Sarcophagus", + restraintTag: "sarcophagus", + restraintSetTags: { + "mummyRestraints": 8, + }, + tickFunction: (_delta) => { + // Nothing yet TODO add special features like dressing the player + } + }, + "IceBase": { + floor: "Brickwork", + sprite: "IceBase", + restraintTag: "iceEncase", + restraintSetTags: { + "iceCuffs": 4, + "iceRestraints": 4, + }, + tickFunction: (_delta) => { + // Nothing + } + }, + "VineBase": { + floor: "RubbleLooted", + sprite: "VineBase", + restraintTag: "vineSuspend", + restraintSetTags: { + "vineRestraints": 10, + }, + tickFunction: (_delta) => { + // Nothing yet TODO add special features like dressing the player + } + }, + "ShadowBase": { + floor: "Brickwork", + sprite: "ShadowBase", + restraintTag: "shadowBall", + restraintSetTags: { + "shadowLatexRestraints": 5, + }, + tickFunction: (_delta) => { + // Nothing yet + } + }, + "CrystalBase": { + floor: "RubbleLooted", + sprite: "CrystalBase", + restraintTag: "crystalEncase", + restraintSetTags: { + "crystalRestraints": 5, + }, + tickFunction: (_delta) => { + // Nothing yet + } + }, + "Bed": { + floor: "Floor", + sprite: "Bed", + restraintTag: "bed", + tickFunction: (_delta) => { + // Small stamina regen :) + KDChangeStamina("bed", "sleep", "tick", 0.1, true, 0, false); + } + }, + "DisplayEgyptian": { + floor: "Floor", + sprite: "DisplayEgyptian", + restraintTag: "displaystand", + restraintSetTags: { + "mummyRestraints": 8, + }, + tickFunction: (_delta) => { + if (!KDGameData.PrisonerState) { + let power = 0; + if (KDBoundPowerLevel >= 0.35) power = 2; + else if (KDBoundPowerLevel >= 0.1) power = 1; + if (power >= 2) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage2", type: "Sneak", duration: 1, power: 9.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "darkness", "move", "cast"]}); + } else if (power >= 1) { + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage", type: "SlowDetection", duration: 1, power: 4.0, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["SlowDetection", "move", "cast"]}); + KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "cage2", type: "Sneak", duration: 1, power: 2.95, player: true, enemies: true, endSleep: true, maxCount: 1, tags: ["Sneak", "darkness", "move", "cast"]}); + } + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonCage" + power), "lightgreen", 1, true); + } + } + }, +}; diff --git a/Game/src/restraint/KinkyDungeonRestraints.ts b/Game/src/restraint/KinkyDungeonRestraints.ts new file mode 100644 index 000000000..5bb033496 --- /dev/null +++ b/Game/src/restraint/KinkyDungeonRestraints.ts @@ -0,0 +1,6469 @@ +"use strict"; +// Escape chances +// Struggle : How difficult it is to struggle out of the item. Shouldn't be below 0.1 as that would be too tedious. Negative values help protect against spells. +// Cut : How difficult it is to cut with a knife. Metal items should have 0, rope and leather should be low but possible, and stuff like tape should be high +// Remove : How difficult it is to get it off by unbuckling. Most items should have a high chance if they have buckles, medium chance if they have knots, and low chance if they have a difficult mechanism. +// Pick : How hard it is to pick the lock on the item. Higher level items have more powerful locks. The general formula is 0.33 for easy items, 0.1 for medium items, 0.05 for hard items, and 0.01 for super punishing items +// Unlock : How hard it is to reach the lock. Should be higher than the pick chance, and based on accessibility. Items like the + +// Note that there is a complex formula for how the chances are manipulated based on whether your arms are bound. Items that bind the arms are generally unaffected, and items that bind the hands are unaffected, but they do affect each other + +// Power is a scale of how powerful the restraint is supposed to be. It should roughly match the difficulty of the item, but can be higher for special items. Power 10 or higher might be totally impossible to struggle out of. + + +let KDWillEscapePenalty = 0.15; +let KDWillEscapePenaltyArms = 0.1; +let KDWillEscapePenaltyStart = 0.25; +let KDWillEscapePenaltyStartArms = 0.1; +let KDWillEscapePenaltyEnd = 0.05; + +let KDMinEscapeRate = 0.4; +let KDMinPickRate = 0.2; +let KDStruggleTime = 3; +let KDBaseEscapeSpeed = 2.0; + +let KDUpfrontWill = true; + +/** Thresholds for hand bondage */ +let StruggleTypeHandThresh = { + Struggle: 0.01, // Any hand bondage will affect struggling + Unlock: 0.7, // Unlocking requires a bit of dexterity + Pick: 0.45, // Picking requires dexterity + Cut: 0.7, // Cutting requires a bit of dexterity + Remove: 0.8, // Removing only requires a solid corner +}; + + +let KDRestraintArchetypes = ["Rope", "Latex", "Ribbon", "Leather", "Cyber", "Metal", "Armbinders", "Boxbinders", "Straitjackets", "Legbinders"]; + + +let KDCustomAffinity: Record boolean> = { + Wall: (data) => { + // Intentionally only a + shape + if (KDNearbyMapTiles(data.entity.x, data.entity.y, 1.1)?.some((tile) => {return KinkyDungeonBlockTiles.includes(tile.tile);})) return true; + return KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp(); + }, + HookOrFoot: (data) => { + if (KinkyDungeonCanUseFeetLoose(false)) { + if (data.Message) { + KinkyDungeonSendTextMessage(7, TextGet("KDUseFootAffinity"), "lightgreen", 2, + false, false, undefined, "Struggle"); + } + return true; + } + return KinkyDungeonGetAffinity(data.Message, "Hook", data.group); + }, + Tug: (data) => { + if (KinkyDungeonFlags.get("leashtug")) { + if (data.Message) { + KinkyDungeonSendTextMessage(7, TextGet("KDUseTugAffinity"), "lightgreen", 2, + false, false, undefined, "Struggle"); + } + return true; + } + return false; + }, + SharpHookOrFoot: (data) => { + if (!KinkyDungeonGetAffinity(data.Message, "Sharp", data.group)) return false; + if (KinkyDungeonCanUseFeetLoose(false)) { + if (data.Message) { + KinkyDungeonSendTextMessage(7, TextGet("KDUseFootAffinity"), "lightgreen", 2, + false, false, undefined, "Struggle"); + } + return true; + } + return KinkyDungeonGetAffinity(data.Message, "Hook", data.group); + }, + SharpTug: (data) => { + if (!KinkyDungeonGetAffinity(data.Message, "Sharp", data.group)) return false; + if (KinkyDungeonFlags.get("leashtug")) { + if (data.Message) { + KinkyDungeonSendTextMessage(7, TextGet("KDUseTugAffinity"), "lightgreen", 2, + false, false, undefined, "Struggle"); + } + return true; + } + return false; + }, +}; + +function KDGetTightnessEffect(escapeChance: number, struggleType: string, T: number = 0) { + let mult = (struggleType == "Cut" || struggleType == "Remove") ? 0.5 : 1.0; + let x1 = 1 - 0.1 * mult; + let x2 = escapeChance > 0 ? (escapeChance - 0.03 * mult) / escapeChance : 0; + let val = Math.max(x1, Math.min(x2, 1 - 0.05 * mult)); + val = 1 - (1 - val) * (100/(100 + T)); + return val; +} + +/** + * Returns the multiplier of a restraint based on the player's current restraint counts + * @param player + * @param restraint + * @param augmentedInventory + * @returns {number} - multiplier for apparent power + */ +function KDRestraintPowerMult(player: entity, restraint: restraint, augmentedInventory: string[]): number { + if (player != KinkyDungeonPlayerEntity) return 1; + if (!restraint) return 1; + let keyProperties = restraint.shrine.filter((element) => {return KDRestraintArchetypes.includes(element);}); + let relatedRestraints = []; + let opposedRestraints = []; + let mult = 1.0; + for (let rr of KinkyDungeonAllRestraintDynamic()) { + let r = rr.item; + if (keyProperties.some((element) => { + return KDRestraint(r).shrine.includes(element); + })) { + relatedRestraints.push(r); + } else { + opposedRestraints.push(r); + } + } + if (augmentedInventory) { + for (let name of augmentedInventory) { + let r = {name: name}; + if (KDRestraint(r)) { + if (keyProperties.some((element) => { + return KDRestraint(r).shrine.includes(element); + })) { + relatedRestraints.push(r); + } else { + opposedRestraints.push(r); + } + } + } + } + let maxMult = 2; + for (let r of relatedRestraints) { + // Increase up to 10x restraint power + mult += Math.max(0,(maxMult - mult) * (Math.max(1, KDRestraint(r).power) + Math.max(1, restraint.power)) / Math.max(1, restraint.power)); + } + for (let r of opposedRestraints) { + // Increase up to 10x restraint power + mult *= 1 - Math.min(0.15, Math.max(1, restraint.power) / (Math.max(1, KDRestraint(r).power) + Math.max(1, restraint.power))); + } + + return Math.min(2, Math.max(0.5, mult || 0)); +} + +function KDGetWillPenalty(StruggleType: string): number { + let perc = KinkyDungeonStatWill/KinkyDungeonStatWillMax; + let scale = 0; + let scalestart = KDWillEscapePenaltyStart; + let max = KDWillEscapePenalty; + if (!KinkyDungeonIsArmsBound(true)) { + scalestart = KDWillEscapePenaltyStartArms; + max = KDWillEscapePenaltyArms; + } + if (perc < scalestart) { + if (scalestart - KDWillEscapePenaltyEnd > 0) + scale = Math.min(1.0, (scalestart - perc) / (scalestart - KDWillEscapePenaltyEnd)); + else if (perc <= 0) scale = 1.0; + } + return scale * max * ((StruggleType == "Cut") ? 0.5 : (StruggleType == "Struggle" ? 1.0 : 0.1)); +} + +let KinkyDungeonCurrentEscapingItem = null; +let KinkyDungeonCurrentEscapingMethod = null; +let KinkyDungeonStruggleTime = 0; + +let KinkyDungeonMultiplayerInventoryFlag = false; +let KinkyDungeonItemDropChanceArmsBound = 0.2; // Chance to drop item with just bound arms and not bound hands. + +//let KinkyDungeonKnifeBreakChance = 0.15; +let KinkyDungeonKeyJamChance = 0.33; +let KinkyDungeonKeyPickBreakAmount = 12; // Number of tries per pick on average 5-11 +let KinkyDungeonKeyPickBreakAmountBase = 12; // Number of tries per pick on average 5-11 +let KinkyDungeonPickBreakProgress = 0; +let KinkyDungeonKnifeBreakAmount = 10; // Number of tries per knife on average 6-12 +let KinkyDungeonKnifeBreakAmountBase = 10; // Number of tries per knife on average 6-12 +let KinkyDungeonKnifeBreakProgress = 0; +let KinkyDungeonEnchKnifeBreakAmount = 24; // Number of tries per knife on average +let KinkyDungeonEnchKnifeBreakAmountBase = 24; // Number of tries per knife on average +let KinkyDungeonEnchKnifeBreakProgress = 0; + +let KinkyDungeonMaxImpossibleAttempts = 3; // base, more if the item is close to being impossible + +let KinkyDungeonEnchantedKnifeBonus = 0.1; // Bonus whenever you have an enchanted knife + +let KDLocksmithPickBonus = 0.15; // Locksmith bonus to pick effectiveness +let KDLocksmithBonus = 0.15; // Locksmith bonus to base escape chance +let KDLocksmithSpeedBonus = 2.0; +let KDCluelessPickBonus = -0.2; // Clueless background +let KDCluelessBonus = -0.25; // Clueless background +let KDCluelessSpeedBonus = 0.5; + +let KDFlexibleBonus = 0.1; +let KDFlexibleSpeedBonus = 1.5; +let KDInflexibleMult = 1.25; +let KDInflexibleSpeedBonus = 0.75; + +let KDUnchainedBonus = 0.1; +let KDDamselBonus = 1.3; +let KDDamselPickAmount = 6; +let KDArtistBonus = 0.1; +let KDBunnyBonus = 1.3; +let KDBunnyKnifeAmount = 5; +let KDBunnyEnchKnifeAmount = 12; +let KDSlipperyBonus = 0.1; +let KDDollBonus = 1.3; +let KDEscapeeBonus = 0.1; +let KDDragonBonus = 1.3; + +let KDStrongBonus = 0.075; +let KDWeakBonus = -0.1; + +let KDBondageLoverAmount = 1; + +/** + */ +let KinkyDungeonRestraintsCache: Map = new Map(); + +/** + * gets a restraint + * @param item + */ +function KDRestraint(item: Named): restraint { + if (KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]) return KinkyDungeonRestraintsCache.get(KinkyDungeonRestraintVariants[item.inventoryVariant || item.name].template); + return KinkyDungeonRestraintsCache.get(item.name); +} + + + + +/** + * gets a restraint + * @param item + * @param target + */ +function KDRestraintBondageMult(item: Named, target: entity): number { + let r = KDRestraint(item); + if (r) { + let data = { + item: item, + target: target, + restraint: r, + type: KDRestraintBondageType(item), + override: undefined, + overridePriority: 0, + mult: r.npcBondageMult || 2, + }; + + if (r.quickBindMult && target && !KinkyDungeonIsDisabled(target)) { + data.mult *= r.quickBindMult; + data['quickBind'] = true; + } + + KinkyDungeonSendEvent("calcBondageMult", data); + return data.mult * ((KDSpecialBondage[data.type]) ? (KDSpecialBondage[data.type].enemyBondageMult || 1) : 1); + } + return 1; +} +/** + * gets a restraint + * @param item + */ +function KDRestraintBondageType(item: Named): string { + let r = KDRestraint(item); + if (r) { + let data = { + item: item, + restraint: r, + type: "", + override: r.npcBondageType, + overridePriority: 0, + }; + // Stock methodology + if (r.shrine) { + for (let s of r.shrine) { + switch (s) { + case "Metal": + data.type = s; + data.overridePriority = 4; + break; + case "Latex": + data.type = "Slime"; + data.overridePriority = 3; + break; + case "Rope": + data.type = s; + data.overridePriority = 1; + break; + case "Leather": + data.type = s; + data.overridePriority = 2; + break; + case "Vine": + data.type = s; + data.overridePriority = 5; + break; + case "Ice": + data.type = s; + data.overridePriority = 5; + break; + } + } + if (r.magic && data.overridePriority < 4) { + data.type = "Magic"; + data.overridePriority = 4; + } + } + + KinkyDungeonSendEvent("calcBondageType", data); + return data.override || data.type; + } + return "Vine"; +} + +/** + * gets a restraint's conditions + * @param item + */ +function KDRestraintBondageConditions(item: Named): string[] { + let r = KDRestraint(item); + if (r) { + let data = { + item: item, + restraint: r, + conditions: [], + override: undefined, + overridePriority: 0, + }; + // Stock methodology + if (r.shrine.includes("Armbinders") + || r.shrine.includes("Boxbinders") + || r.shrine.includes("Yokes") + || r.shrine.includes("Fiddles") + || r.shrine.includes("BindingDress") + || r.shrine.includes("Straitjackets") + || r.shrine.includes("Petsuits")) { + data.conditions.push("HeavyBondage"); + } + + if (r.requireAllTagsToEquip || r.requireSingleTagToEquip) { + data.conditions.push("Extra"); + } + + KinkyDungeonSendEvent("calcBondageConditions", data); + + + return data.conditions.length > 0 ? data.conditions : null; + } + return null; +} + +/** + * gets a restraint + * @param item + */ +function KDRestraintBondageStatus(item: Named): KDBondageStatus { + let r = KDRestraint(item); + if (r) { + let data = { + item: item, + restraint: r, + /** @type {KDBondageStatus} */ + status: { + silence: 0, + bind: 0, + slow: 0, + blind: 0, + disarm: 0, + reduceaccuracy: 0, + toy: 0, + plug: 0, + belt: 0, + immobile: 0, + }, + override: undefined, + overridePriority: 0, + }; + // Stock methodology + let powerMult = Math.max(0.2, 0.2 * Math.max(r.power)); + if (r.gag) { + data.status.silence = Math.ceil(powerMult * r.gag * 1.3); + } + if (r.blindfold) { + data.status.blind = Math.ceil(powerMult * r.blindfold * 1.7); + } + if (r.freeze) { + data.status.bind = Math.ceil(powerMult); + } + if (r.hobble || r.blockfeet) { + data.status.slow = Math.ceil(powerMult * 4); + } + if (r.bindhands) { + data.status.disarm = Math.ceil(powerMult * Math.max(r.bindarms ? 0.3 : 0, r.bindhands || 0.1)); + } else if (r.bindarms) { + data.status.reduceaccuracy = powerMult * 3; + } + + if (r.chastity || r.chastitybra) { + data.status.belt = r.chastity ? 2 : 1; + } + if (r.plugSize) { + data.status.plug = r.plugSize; + } + if (r.vibeLocation) { + data.status.toy = 1; + } + + KinkyDungeonSendEvent("calcBondageStatus", data); + return data.override || data.status; + } + return { + silence: 0, + bind: 0, + slow: 0, + blind: 0, + disarm: 0, + reduceaccuracy: 0, + toy: 0, + plug: 0, + belt: 0, + immobile: 0, + }; +} + +/** + * gets a restraint + * @param item + */ +function KDItemIsMagic(item: item): boolean { + let res = KinkyDungeonRestraintsCache.get(item.name); + if (!res.magic) return false; + let disenchlevel = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Disenchant"); + return !(disenchlevel > res.power); +} + + +// Format: strict group => [list of groups the strictness applies to] +const KinkyDungeonStrictnessTable = new Map([ + ["ItemHood", ["ItemHead", "ItemEars","ItemMouth","ItemMouth2","ItemMouth3"]], + ["ItemHead", ["ItemEars","ItemMouth"]], + ["ItemMouth", ["ItemMouth"]], + ["ItemNeck", ["ItemMouth", "ItemArms"]], + ["ItemArms", ["ItemHands"]], + ["ItemHands", ["ItemHands"]], + ["ItemTorso", ["ItemArms", "ItemLegs", "ItemPelvis", "ItemBreast"]], + ["ItemLegs", ["ItemFeet", "ItemBoots"]], + ["ItemFeet", ["ItemBoots"]], +]); + +let KDProgressiveOrder = { + +}; + + +/** Enforces a sort of progression of restraining loosely based on strictness, useful for progressive stuff like applying curses to zones */ +KDProgressiveOrder['Strict'] = [ + "ItemTorso", // Usually just makes other restraints harder + "ItemBreast", // Goes well with belts + "ItemPelvis", // Chastity is for good girls! + "ItemBoots", // Typically doesnt hobble completely + "ItemEars", // Sensory + "ItemHead", // Blind, but does not stop from wielding anything + "ItemLegs", // Typically doesnt hobble completely, but sometimes does (hobbleskirts) + "ItemHands", // Blocks weapons but no spells + "ItemMouth", // Blocks spells and potions + "ItemFeet", // Makes you very slow + "ItemArms", // Blocks spells and escaping +]; + +/** A funner restraining order, starting with non-impactful then locking down spells and finally sealing in helplessness */ +KDProgressiveOrder['Fun1'] = [ + "ItemTorso", // Usually just makes other restraints harder + "ItemVulva", // Chastity is for good girls! + "ItemPelvis", // Chastity is for good girls! + "ItemMouth", // Blocks spells and potions + "ItemHands", // Blocks weapons but no spells + "ItemLegs", // Typically doesnt hobble completely, but sometimes does (hobbleskirts) + "ItemNipples", // Chastity is for good girls! + "ItemBreast", // Goes well with belts + "ItemHead", // Blind, but does not stop from wielding anything + "ItemEars", // Sensory + "ItemBoots", // Typically doesnt hobble completely + "ItemArms", // Blocks spells and escaping + "ItemFeet", // Makes you very slow +]; + + +/** A funner restraining order, starting with non-impactful then locking down spells and finally sealing in helplessness */ +KDProgressiveOrder['Fun2'] = [ + "ItemVulva", // Chastity is for good girls! + "ItemButt", // Chastity is for good girls! + "ItemVulvaPiercings", // Chastity is for good girls! + "ItemNipples", // Chastity is for good girls! + "ItemTorso", // Usually just makes other restraints harder + "ItemPelvis", // Chastity is for good girls! + "ItemMouth", // Blocks spells and potions + "ItemHands", // Blocks weapons but no spells + "ItemBoots", // Typically doesnt hobble completely + "ItemArms", // Blocks spells and escaping + "ItemBreast", // Goes well with belts + "ItemLegs", // Typically doesnt hobble completely, but sometimes does (hobbleskirts) + "ItemHead", // Blind, but does not stop from wielding anything + "ItemFeet", // Makes you very slow + "ItemEars", // Sensory +]; + +/** A funner restraining order, starting with non-impactful then locking down spells and finally sealing in helplessness */ +KDProgressiveOrder['Fun3'] = [ + "ItemPelvis", // Chastity is for good girls! + "ItemBreast", // Goes well with belts + "ItemMouth", // Blocks spells and potions + "ItemHands", // Blocks weapons but no spells + "ItemArms", // Blocks spells and escaping + "ItemLegs", // Typically doesnt hobble completely, but sometimes does (hobbleskirts) + "ItemBoots", // Typically doesnt hobble completely + "ItemHead", // Blind, but does not stop from wielding anything + "ItemFeet", // Makes you very slow + "ItemTorso", // Usually just makes other restraints harder + "ItemEars", // Sensory + "ItemVulva", // Chastity is for good girls! + "ItemButt", // Chastity is for good girls! + "ItemVulvaPiercings", // Chastity is for good girls! + "ItemNipples", // Chastity is for good girls! +]; + +function KDGetProgressiveOrderFun() { + return KDProgressiveOrder["Fun" + Math.floor(3 * KDRandom() + 1)]; +} + +let KDRestraintsCache: Map = new Map(); + +let KDTetherGraphics = new PIXI.Graphics; +KDTetherGraphics.zIndex = 2; +let KDGameBoardAddedTethers = false; + +/** + * @param [modifier] + */ +function KinkyDungeonKeyGetPickBreakChance(modifier?: number): number { + let mult = (modifier) ? modifier : 1.0; + let chance = 0; + + KinkyDungeonPickBreakProgress += mult; + + if (KinkyDungeonPickBreakProgress > KinkyDungeonKeyPickBreakAmount/1.5) chance = (KinkyDungeonPickBreakProgress - KinkyDungeonKeyPickBreakAmount/1.5) / (KinkyDungeonKeyPickBreakAmount + 1); + + return chance; +} + +/** + * @param [modifier] + */ +function KinkyDungeonGetKnifeBreakChance(modifier?: number): number { + let mult = (modifier) ? modifier : 1.0; + let chance = 0; + + KinkyDungeonKnifeBreakProgress += mult; + + if (KinkyDungeonKnifeBreakProgress > KinkyDungeonKnifeBreakAmount/1.5) chance = (KinkyDungeonKnifeBreakProgress - KinkyDungeonKnifeBreakAmount/1.5) / (KinkyDungeonKnifeBreakAmount + 1); + + return chance; +} + +/** + * @param [modifier] + */ +function KinkyDungeonGetEnchKnifeBreakChance(modifier: number): number { + let mult = (modifier) ? modifier : 1.0; + let chance = 0; + + KinkyDungeonEnchKnifeBreakProgress += mult; + + if (KinkyDungeonEnchKnifeBreakProgress > KinkyDungeonEnchKnifeBreakAmount/1.5) chance = (KinkyDungeonEnchKnifeBreakProgress - KinkyDungeonEnchKnifeBreakAmount/1.5) / (KinkyDungeonEnchKnifeBreakAmount + 1); + + return chance; +} + +/** + * @param restraint + */ +function KinkyDungeonIsLockable(restraint: restraint): boolean { + if (restraint && restraint.escapeChance && (restraint.escapeChance.Pick != undefined || restraint.escapeChance.Unlock != undefined)) return true; + return false; +} + +/** + * @param item + * @param lock + * @param [NoEvent] + * @param [Link] + * @param [pick] + */ +function KinkyDungeonLock(item: item, lock: string, NoEvent: boolean = false, Link: boolean = false, pick: boolean = false): void { + KDUpdateItemEventCache = true; + if (lock != "") { + if (KinkyDungeonIsLockable(KDRestraint(item))) { + if (KDLocks[lock] && KDLocks[lock].doLock) KDLocks[lock].doLock({item: item, link: Link}); + item.lock = lock; + + item.pickProgress = 0; + } + } else { + let cancel = false; + if (KDLocks[item.lock] && KDLocks[item.lock].doUnlock) + cancel = !KDLocks[item.lock].doUnlock({item: item, link: Link, unlock: !pick, pick: pick, NoEvent: NoEvent}); + if (!cancel) { + item.lock = lock; + if (!NoEvent) { + if (item.events) { + for (let e of item.events) { + if (e.trigger == "postUnlock" && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + KinkyDungeonHandleInventoryEvent("postUnlock", e, item, {item: item, id: KinkyDungeonGetItemID()}); + } + } + } + KinkyDungeonSendEvent("postUnlock", {item: item}); + } + } + + + } + +} + +/** + * Gets the curse of an item, ither intrinsic or applied + * @param item + */ +function KDGetCurse(item: item): string { + return item?.curse || KDRestraint(item)?.curse; +} + +/** + * Returns whether or not an item is 'binding,' e.g. binds arms, blindfold, etc + * @param item + */ +function KDIsBinding(item: item): boolean { + let r = KDRestraint(item); + if (r) { + return !(!(!r.nonbinding && ( + r.bindarms + || r.bindhands + || r.blindfold > 1 + || r.gag > 0.25 + || r.blockfeet + || r.freeze + || r.immobile + || r.hobble > 1 + || r.enclose + || r.binding + ))); + } + return false; +} + +/** + * Whether a single item shall be matched by a shrine + * @param item + * @param shrine + * @param ignoreGold Gold locks don't prevent shrine matching + * even if they are shrineImmune + * @param ignoreShrine Curses and noShrine flag on items don't + * prevent shrine matching. + * @param forceIgnoreNonBinding - for "Exclusions Apply" perk + */ +function KinkyDungeonSingleRestraintMatchesShrine( + item: item, + shrine: string, + ignoreGold: boolean, + ignoreShrine: boolean, + forceIgnoreNonBinding: boolean, +): boolean +{ + return KinkyDungeonAllowTagMatch(item, ignoreGold, ignoreShrine, forceIgnoreNonBinding) && + KDRestraint(item).shrine && + KDRestraint(item).shrine.includes(shrine); +} + +/** + * @param item + * @param ignoreGold + * @param ignoreShrine + * @param forceIgnoreNonBinding + */ +function KinkyDungeonAllowTagMatch(item: item, ignoreGold: boolean, ignoreShrine: boolean, forceIgnoreNonBinding: boolean): boolean { + return ( + (!forceIgnoreNonBinding || KDIsBinding(item)) + && KinkyDungeonCurseOrItemAllowMatch(item, ignoreShrine) + && KinkyDungeonLockAllowMatch(item, ignoreGold) + ); +} + +/** + * @param item + * @param ignoreShrine + */ +function KinkyDungeonCurseOrItemAllowMatch(item: item, ignoreShrine: boolean): boolean { + return (!KDRestraint(item).noShrine && + (!KDGetCurse(item) || !KDCurses[KDGetCurse(item)].noShrine)) || + ignoreShrine; +} + +/** + * @param item + * @param ignoreGold + */ +function KinkyDungeonLockAllowMatch(item: item, ignoreGold: boolean): boolean { + return ignoreGold || !KDLocks[item.lock]?.shrineImmune; +} + +/** + * @param shrine + * @param [ignoreGold] + * @param [recursive] + * @param [ignoreShrine] + * @param [forceIgnoreNonBinding] - for "Exclusions Apply" perk + */ +function KinkyDungeonGetRestraintsWithShrine(shrine: string, ignoreGold?: boolean, recursive?: boolean, ignoreShrine?: boolean, + forceIgnoreNonBinding?: boolean, ignoreFavorite?: boolean): item[] { + let ret: item[] = []; + + for (let item of KinkyDungeonAllRestraint()) { + if (KinkyDungeonSingleRestraintMatchesShrine(item, shrine, ignoreGold, ignoreShrine, forceIgnoreNonBinding)) { + if (!ignoreFavorite || !(KDGameData.ItemPriority[item.inventoryVariant || item.name] > 9)) + ret.push(item); + } + if (recursive) { + let link = item.dynamicLink; + while (link) { + if (KinkyDungeonSingleRestraintMatchesShrine(link, shrine, ignoreGold, ignoreShrine, forceIgnoreNonBinding)) { + if (!ignoreFavorite || !(KDGameData.ItemPriority[link.inventoryVariant || link.name] > 9)) + ret.push(link); + } + link = link.dynamicLink; + } + } + } + + return ret; +} + +/** + * @param shrine + * @param [forceIgnoreNonBinding] - for "Exclusions Apply" perk + * @returns {number} + */ +function KinkyDungeonRemoveRestraintsWithShrine(shrine: string, maxCount?: number, recursive?: boolean, noPlayer?: boolean, ignoreGold?: boolean, ignoreShrine?: boolean, Keep?: boolean, forceIgnoreNonBinding?: boolean, forceFavorite?: boolean): number { + let count = 0; + + for (let i = 0; i < (maxCount ? maxCount : 100); i++) { + let items: item[] = KinkyDungeonAllRestraint().filter((r) => { + return (forceFavorite || !(KDGameData.ItemPriority[r.inventoryVariant || r.name] > 9)) + && KinkyDungeonSingleRestraintMatchesShrine(r, shrine, ignoreGold, ignoreShrine, forceIgnoreNonBinding); + }); + // Get the most powerful item + let item = items.length > 0 ? items.reduce((prev, current) => (KinkyDungeonRestraintPower(prev, true) > KinkyDungeonRestraintPower(current, true)) ? prev : current) : null; + if (item) { + if (item.curse && KDCurses[item.curse]) { + KDCurses[item.curse].remove(item, KDGetRestraintHost(item), true); + } + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonRemoveRestraint(KDRestraint(item).Group, Keep, false, false, true, undefined, !noPlayer ? KinkyDungeonPlayerEntity : undefined); + KDSendStatus('escape', item.name, "shrine_" + shrine); + count++; + } + + if (recursive) { + // Get all items, including dynamically linked ones + items = KinkyDungeonGetRestraintsWithShrine(shrine, ignoreGold, true, ignoreShrine, forceIgnoreNonBinding); + items = items.filter((r) => { + return (forceFavorite || !(KDGameData.ItemPriority[r.inventoryVariant || r.name] > 9)); + }); + // Get the most powerful item + item = items.length > 0 ? items.reduce((prev, current) => { + return (( + (KinkyDungeonRestraintPower(prev, true) > KinkyDungeonRestraintPower(current, true))) + ? prev : current) + }) : null; + if (item) { + let groupItem = KinkyDungeonGetRestraintItem(KDRestraint(item).Group); + if (groupItem == item) { + if (item.curse && KDCurses[item.curse]) { + KDCurses[item.curse].remove(item, KDGetRestraintHost(item), true); + } + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonRemoveRestraint(KDRestraint(item).Group, Keep, false, false, true, undefined, !noPlayer ? KinkyDungeonPlayerEntity : undefined); + KDSendStatus('escape', item.name, "shrine_" + shrine); + count++; + } else { + let host = groupItem; + let link = host.dynamicLink; + while (link) { + if (link == item) { + if (item.curse && KDCurses[item.curse]) { + KDCurses[item.curse].remove(item, KDGetRestraintHost(item), true); + } + let inventoryAs = item.inventoryVariant || item.name || (KDRestraint(item).inventoryAs); + item.curse = undefined; + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + KinkyDungeonRemoveDynamicRestraint(host, Keep, false, !noPlayer ? KinkyDungeonPlayerEntity : undefined); + KDSendStatus('escape', item.name, "shrine_" + shrine); + count++; + link = null; + } else { + host = link; + link = link.dynamicLink; + } + } + } + } + } + } + + + return count; +} + + +/** + * @param item + */ +function KDRemoveThisItem(item: item, Keep?: boolean, NoEvent?: boolean, Shrine?: boolean, Remover?: entity, ForceRemove: boolean = false): void { + let r = KinkyDungeonGetRestraintItem(KDRestraint(item).Group); + if (r == item) { + KinkyDungeonRemoveRestraint(KDRestraint(item).Group, Keep, false, NoEvent, Shrine, false, Remover, true); + } else { + let host = r; + r = r.dynamicLink; + while (r) { + if (r == item) { + KinkyDungeonRemoveDynamicRestraint(host, Keep, NoEvent, Remover, true); + } + host = r; + r = r.dynamicLink; + } + + } +} + +/** + * @param name + */ +function KinkyDungeonRemoveRestraintsWithName(name: string): number { + let count = 0; + + for (let inv of KinkyDungeonAllRestraintDynamic()) { + if (inv.item.name == name) { + if (inv.host) + KinkyDungeonRemoveDynamicRestraint(inv.host, false, false, undefined); + else + KinkyDungeonRemoveRestraint(KDRestraint(inv.item).Group, false, false); + KDSendStatus('escape', inv.item.name, "special"); + count++; + } + } + + return count; +} + +/** + * @param shrine + */ +function KinkyDungeonUnlockRestraintsWithShrine(shrine: string): number { + let count = 0; + + for (let item of KinkyDungeonAllRestraint()) { + if (item.lock && !KDRestraint(item).noShrine && (!KDGetCurse(item) || !KDCurses[KDGetCurse(item)].noShrine) && KDRestraint(item).shrine && KDRestraint(item).shrine.includes(shrine) && KDLocks[item.lock] && !KDLocks[item.lock]?.shrineImmune) { + + KinkyDungeonLock(item, "", true); + count++; + } + } + + return count; +} + +function KinkyDungeonPlayerGetLockableRestraints(): item[] { + let ret: item[] = []; + + for (let item of KinkyDungeonAllRestraint()) { + if (!item.lock && !KDGetCurse(item) && KDRestraint(item).escapeChance && KDRestraint(item).escapeChance.Pick != undefined) { + ret.push(item); + } + } + + return ret; +} + +/** + * @param Locks + */ +function KinkyDungeonPlayerGetRestraintsWithLocks(Locks: string[], recursive?: boolean): item[] { + let ret: item[] = []; + + for (let itemhost of (recursive ? KinkyDungeonAllRestraintDynamic() : KinkyDungeonAllRestraint())) { + // @ts-ignore + let item = itemhost.item ? itemhost.item : itemhost; + if (item && item.lock && Locks.includes(item.lock)) { + ret.push(item); + } + } + + return ret; +} + +/** + * @param lock + */ +function KinkyDungeonRemoveKeysUnlock(lock: string) { + if (KDLocks[lock]) KDLocks[lock].removeKeys({unlock: true}); +} + +/** + * @param lock + * @param keytype + */ +function KinkyDungeonRemoveKeysDropped(lock: string, keytype: string) { + if (KDLocks[lock]) KDLocks[lock].removeKeys({dropped: true, keytype: keytype}); +} + + +/** + * @param lock + * @returns {string} + */ +function KinkyDungeonGetKey(lock: string): string { + if (KDLocks[lock]) return KDLocks[lock].key; + return ""; +} + +function KinkyDungeonHasGhostHelp(): boolean { + return ((KinkyDungeonTargetTile && ((KinkyDungeonTargetTile.Type == "Ghost" && KinkyDungeonTargetTile.GhostDecision <= 0) || KinkyDungeonTargetTile.Type == "Angel"))); +} + +function KinkyDungeonHasHelp(): boolean { + return KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp() || KinkyDungeonHasAngelHelp(); +} + + +function KinkyDungeonHasAllyHelp(): boolean { + return (KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some( + (enemy) => { + return (KDEnemyHasFlag(enemy, "HelpMe") || enemy.Enemy.tags.alwayshelp) + && enemy.Enemy.bound + && !enemy.Enemy.tags.nohelp + && !KDHelpless(enemy) + && KDBoundEffects(enemy) < 4; + }) + || (!KinkyDungeonStatsChoice.get("NoHelp") && KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some((enemy) => { + return enemy.Enemy.bound + && !enemy.Enemy.tags.nohelp + && KDAllied(enemy) + && !KDHelpless(enemy) + && KDBoundEffects(enemy) < 4; + })) + ); +} + +KinkyDungeonSetFlag("HelpMeFlag", 20); + +function KinkyDungeonHasAngelHelp(): boolean { + return (KinkyDungeonTargetTile && KinkyDungeonTargetTile.Type == "Angel"); +} + +function KinkyDungeonIsWearingLeash(): boolean { + for (let restraint of KinkyDungeonAllRestraint()) { + if (KDRestraint(restraint) && KDRestraint(restraint).leash) { + return true; + } + } + return false; +} + +let KDAffinityList = ["Hook", "Edge", "Sticky", "Sharp"]; + +/** + * @param Message - Show a message? + * @param affinity + * @param [group] + * @param [entity] + */ +function KinkyDungeonGetAffinity(Message: boolean, affinity: string, group?: string, entity?: entity): boolean { + if (!entity) entity = KinkyDungeonPlayerEntity; + let data: KDEventData_affinity = { + forceTrue: 0, + forceFalse: 0, + affinity: affinity, + group: group, + Message: Message, + entity: entity, + msgedstand: false, + canStand: KinkyDungeonCanStand() && !KDForcedToGround(), + groupIsHigh: !group || ( + group.startsWith("ItemM") + || group == "ItemArms" + || (group == "ItemHands" || !KinkyDungeonIsArmsBound()) + || group == "ItemEars" + || group == "ItemHood" + || group == "ItemHead" + || group == "ItemNeck" + || group == "ItemNeckAccessories" + || group == "ItemNeckRestraints" + ), + }; + KinkyDungeonSendEvent("affinity", data); + if (data.forceFalse > 0 && data.forceFalse >= data.forceTrue) { + if (Message) + KinkyDungeonSetFlag("embarrassed", 8); + return false; + } + if (data.forceTrue > 0) return true; + + let effectTiles = KDGetEffectTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (effectTiles) + for (let t of Object.values(effectTiles)) { + if (t.affinities && t.affinities.includes(affinity)) return true; + else if (data.canStand && data.groupIsHigh && t.affinitiesStanding && t.affinitiesStanding.includes(affinity)) return true; + else if (Message && !data.msgedstand && (!data.canStand || !data.groupIsHigh) && t.affinitiesStanding && t.affinitiesStanding.includes(affinity)) { + data.msgedstand = true; + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonHookHighFail"), "#ff5277", 2, + false, false, undefined, "Struggle"); + } + } + if (KDCustomAffinity[data.affinity]) { + return KDCustomAffinity[data.affinity](data); + } if (affinity == "Hook") { + let tile = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (tile == '?') { + if (data.canStand && data.groupIsHigh) return true; + else if (!data.msgedstand && Message) KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonHookHighFail"), "#ff5277", 2, + false, false, undefined, "Struggle"); + } else if (KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y - 1) == ',') return true; + return KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp(); + } else if (affinity == "Edge") { + for (let X = KinkyDungeonPlayerEntity.x - 1; X <= KinkyDungeonPlayerEntity.x + 1; X++) { + for (let Y = KinkyDungeonPlayerEntity.y - 1; Y <= KinkyDungeonPlayerEntity.y + 1; Y++) { + let tile = KinkyDungeonMapGet(X, Y); + if (KDCornerTiles[tile]) { + return true; + } else if (tile == 'C' && Message) { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonNeedOpenChest"), "#ff5277", 2, true, + false, undefined, "Struggle"); + } + } + } + return KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp(); + } else if (affinity == "Sticky") { + return KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp(); + } else if (affinity == "Sharp") { + if (((KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && KinkyDungeonAllWeapon().some((inv) => {return KDWeapon(inv).light && KDWeapon(inv).cutBonus != undefined;})) || KinkyDungeonWeaponCanCut(false)) return true; + if (KinkyDungeonAllWeapon().some((inv) => {return KDWeapon(inv).light && KDWeapon(inv).cutBonus != undefined;}) && (!KinkyDungeonIsArmsBound() || KinkyDungeonStatsChoice.has("Psychic") || KinkyDungeonWallCrackAndKnife(false))) return true; + let tile = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + if (tile == '/') { + if (Message) + KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonScrapUse"), "lightgreen", 2, + false, false, undefined, "Struggle"); + return true; + } + for (let X = KinkyDungeonPlayerEntity.x - 1; X <= KinkyDungeonPlayerEntity.x + 1; X++) { + for (let Y = KinkyDungeonPlayerEntity.y - 1; Y <= KinkyDungeonPlayerEntity.y + 1; Y++) { + let tile2 = KinkyDungeonMapGet(X, Y); + if (tile2 == '-' + || tile == 'a') { + if (Message) + KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonScrapObjectUse"), "lightgreen", 2, + false, false, undefined, "Struggle"); + return true; + } + } + } + + if (Message) + KinkyDungeonSetFlag("embarrassed", 8); + return false; + } + let ret = KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp(); + if (Message && !ret) + KinkyDungeonSetFlag("embarrassed", 3); + return ret; +} + +function KinkyDungeonWallCrackAndKnife(Message: boolean): boolean { + for (let X = KinkyDungeonPlayerEntity.x - 1; X <= KinkyDungeonPlayerEntity.x + 1; X++) { + for (let Y = KinkyDungeonPlayerEntity.y - 1; Y <= KinkyDungeonPlayerEntity.y + 1; Y++) { + if (X == KinkyDungeonPlayerEntity.x || Y == KinkyDungeonPlayerEntity.y) { + let tile = KinkyDungeonMapGet(X, Y); + if (tile == '4' || tile == '\\') { + if (!KinkyDungeonIsArmsBound(true) || (KinkyDungeonCanStand() && !KDForcedToGround())) { + if (Message) { + if (!KinkyDungeonIsArmsBound(true)) + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonUseCrack"), "lightgreen", 2, true); + else KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonUseCrackLegs"), "lightgreen", 2, true); + } + return true; + } else { + if (Message) { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonNeedCrack"), "#ff5277", 2, true); + } + return false; + } + } + } + } + } + return false; +} + +/** + * Determines if the entire dynamic item tree has at least one inaccessable item + * @param item + */ +function KDIsTreeAccessible(item: item): boolean { + let link = item; + while (link && KDRestraint(link)) { + if (KDRestraint(link).inaccessible) return false; + link = link.dynamicLink; + } + return true; +} + +/** + * Determines if the entire dynamic item tree has at least one chastity item + * @param item + */ +function KDIsTreeChastity(item: item): boolean { + let link = item; + while (link && KDRestraint(link)) { + if (KDRestraint(link).chastity) return false; + link = link.dynamicLink; + } + return true; +} + +/** + * Determines if the entire dynamic item tree has at least one chastity bra item + * @param item + */ +function KDIsTreeChastityBra(item: item): boolean { + let link = item; + while (link && KDRestraint(link)) { + if (KDRestraint(link).chastitybra) return false; + link = link.dynamicLink; + } + return true; +} + +/** + * @param Group - Group + * @param [External] - By enemies or by player? + */ +function KDGroupBlocked(Group: string, _External?: boolean): boolean { + if (KinkyDungeonPlayerTags.get("ChastityLower") && ["ItemVulva", "ItemVulvaPiercings", "ItemButt"].includes(Group)) return true; + if (KinkyDungeonPlayerTags.get("ChastityUpper") && ["ItemNipples", "ItemNipplesPiercings"].includes(Group)) return true; + if (KinkyDungeonPlayerTags.get("Block_" + Group)) return true; + + /*if (Group.includes("ItemHands")) { + let arms = KinkyDungeonGetRestraintItem("ItemArms"); + if (arms && !KDIsTreeAccessible(arms)) return true; + }*/ + + return false; + //let device = null; + + //if (device && KDRestraint(device) && KDRestraint(device).enclose) return true; + +} + +/** + * Gets a list of restraints blocking this group + * @param Group + * @param External + */ +function KDGetBlockingRestraints(Group: string, _External?: boolean): item[] { + // Create the storage system + let map: Map = new Map(); + let all = KinkyDungeonAllRestraintDynamic(); + // For this section we just create a set of items that block this one + if (KinkyDungeonPlayerTags.get("ChastityLower") && ["ItemVulva", "ItemVulvaPiercings", "ItemButt"].includes(Group)) { + for (let item of all) { + if (!map.get(item.item) && (KDRestraint(item.item)?.chastity)) { + map.set(item.item, true); + } + } + } + if (KinkyDungeonPlayerTags.get("ChastityUpper") && ["ItemNipples", "ItemNipplesPiercings"].includes(Group)) { + for (let item of all) { + if (!map.get(item.item) && (KDRestraint(item.item)?.chastitybra)) { + map.set(item.item, true); + } + } + } + if (KinkyDungeonPlayerTags.get("Block_" + Group)) { + for (let item of all) { + if (!map.get(item.item) && KDRestraint(item.item)?.shrine?.includes("Block_" + Group)) { + map.set(item.item, true); + } + } + } + + if (Group.includes("ItemHands")) { + let arms = KinkyDungeonGetRestraintItem("ItemArms"); + if (arms) { + let link = arms; + while (link && KDRestraint(link)) { + if (KDRestraint(link).inaccessible && !map.get(link)) { + map.set(link, true); + } + link = link.dynamicLink; + } + } + } + + // Return restraints still in the list + return [...map.keys()]; +} + +/** + * Gets a list of restraints with Security that block this + * @param Group + * @param External + */ +function KDGetBlockingSecurity(Group: string, External: boolean): item[] { + let items = KDGetBlockingRestraints(Group, External); + items = items.filter((item) => { + return KDRestraint(item)?.Security != undefined; + }); + return items; +} + +/** + * @param Other - false = self, true = other prisoner door etc + * @returns - Can you use keys on target + */ +function KinkyDungeonCanUseKey(Other: boolean = true): boolean { + return !KinkyDungeonIsHandsBound(true, Other, 0.7) || KinkyDungeonStatsChoice.has("Psychic"); +} + +/** + * @param [ApplyGhost] - Can you receive help in this context? + * @param [Other] - Is this on yourself or another? + * @param Threshold - Threshold + */ +function KinkyDungeonIsHandsBound(ApplyGhost?: boolean, Other?: boolean, Threshold: number = 0.99): boolean { + /*let blocked = InventoryItemHasEffect(InventoryGet(KinkyDungeonPlayer, "ItemHands"), "Block", true) || KDGroupBlocked("ItemHands"); + for (let inv of KinkyDungeonAllRestraint()) { + if (KDRestraint(inv).bindhands) { + blocked = true; + break; + } + }*/ + let blocked = KDHandBondageTotal(Other) > Threshold; + let help = ApplyGhost && (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()); + if (!Other && (!ApplyGhost || !(help)) && KinkyDungeonStatsChoice.get("Butterfingers") && KinkyDungeonIsArmsBound(ApplyGhost, Other)) return true; + return (!ApplyGhost || !(help)) && + blocked; +} + +/** + * @param [ApplyGhost] - Can you receive help in this context? + * @param [Other] - Is this on yourself or another? + * @param Threshold - Threshold + */ +function KinkyDungeonIsHandsBoundFast(ApplyGhost?: boolean, Other?: boolean): boolean { + let blocked = !!KinkyDungeonPlayerTags.get("BoundHands"); + let help = ApplyGhost && (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()); + if (!Other && (!ApplyGhost || !(help)) && KinkyDungeonStatsChoice.get("Butterfingers") + && KinkyDungeonIsArmsBoundFast(ApplyGhost, Other)) return true; + return (!ApplyGhost || !(help)) && + blocked; +} + +/** + * Returns the total level of hands bondage, 1.0 or higher meaning unable to use hands + * @param Other - on other or self + * @return - The bindhands level, sum of all bindhands properties of worn restraints + */ +function KDHandBondageTotal(Other: boolean = false): number { + let total = 0; + for (let rest of KinkyDungeonAllRestraintDynamic()) { + let inv = rest.item; + if (KDRestraint(inv).bindhands) total += KDRestraint(inv).bindhands; + if (!Other && KDRestraint(inv).restricthands) total += KDRestraint(inv).restricthands; + } + if (KinkyDungeonStatsChoice.get("SomaticMinus")) total *= 2; + else if (KinkyDungeonStatsChoice.get("SomaticPlus") && total < 0.99) total *= 0.75; + return total; +} + +function KinkyDungeonCanUseFeet(bootsPrevent: boolean = true): boolean { + return KinkyDungeonStatsChoice.get("Flexible") && KinkyDungeonSlowLevel < 1 + && (!bootsPrevent || + (!KinkyDungeonPlayerTags.get("HinderFeet") + && !KinkyDungeonPlayerTags.get("BoundFeet") + && !KinkyDungeonPlayerTags.get("Boots") + && !KinkyDungeonPlayerTags.get("BootsArmor"))); +} + +function KinkyDungeonCanUseFeetLoose(bootsPrevent: boolean = true): boolean { + return KinkyDungeonCanUseFeet(bootsPrevent) || ( + !KDForcedToGround() + ); +} + +/** + * @param [ApplyGhost] + * @param [Other] - Is this on yourself or another? + */ +function KinkyDungeonIsArmsBound(ApplyGhost?: boolean, _Other?: boolean): boolean { + let blocked = KDGroupBlocked("ItemArms"); + if (!blocked) + for (let inv of KinkyDungeonAllRestraintDynamic()) { + if (KDRestraint(inv.item).bindarms) { + blocked = true; + break; + } + } + return (!ApplyGhost || !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp())) && + blocked; +} +/** + * @param [ApplyGhost] + * @param [Other] - Is this on yourself or another? + */ +function KinkyDungeonIsArmsBoundFast(ApplyGhost?: boolean, _Other?: boolean): boolean { + let blocked = KDGroupBlocked("ItemArms"); + if (!blocked) + if (KinkyDungeonPlayerTags.get("BoundArms")) + return (!ApplyGhost || !(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp())) && + blocked; +} +/** + * @param C + * @param [ApplyGhost] + * @param [Other] - Is this on yourself or another? + */ +function KinkyDungeonIsArmsBoundC(C: Character, ApplyGhost?: boolean, Other?: boolean): boolean { + if (C == KinkyDungeonPlayer) { + return KinkyDungeonIsArmsBound(ApplyGhost, Other); + } else { + for (let inv of KDGetRestraintsForCharacter(C)) { + if (KDRestraint(inv)?.bindarms) { + return true; + } + } + return false; + } +} + + + +/** + * @param ApplyGhost + * @param Group + * @param [excludeItem] + */ +function KinkyDungeonStrictness(ApplyGhost: boolean, Group: string, excludeItem?: item): number { + if (ApplyGhost && (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp())) return 0; + let strictness = 0; + for (let invItem of KinkyDungeonAllRestraintDynamic()) { + let inv = invItem.item; + while (inv && (!excludeItem || KDRestraint(inv).Group != Group)) { + if (inv != excludeItem && ((KDRestraint(inv).strictness && KDRestraint(inv).strictness > strictness))) { + let strictGroups = KDRestraint(inv).strictnessZones || KinkyDungeonStrictnessTable.get(KDRestraint(inv).Group); + if (strictGroups) { + for (let s of strictGroups) { + if (s == Group) { + if (KDRestraint(inv).strictness > strictness) + strictness = KDRestraint(inv).strictness; + break; + } + } + } + } + inv = inv.dynamicLink; + } + } + // Slightly different behavior with layering, go from bottom up + if (excludeItem) { + let inv = KinkyDungeonGetRestraintItem(Group); + let i = 0; + let stack = []; + while (inv) { + stack.push(inv); + inv = inv.dynamicLink; + } + i = stack.length - 1; + inv = stack[i]; + + while (i >= 0) { + if (inv == excludeItem) { + break; + } else { + if (inv != excludeItem && ((KDRestraint(inv).strictness && KDRestraint(inv).strictness > strictness))) { + let strictGroups = KDRestraint(inv).strictnessZones || KinkyDungeonStrictnessTable.get(KDRestraint(inv).Group); + if (strictGroups) { + for (let s of strictGroups) { + if (s == Group) { + if (KDRestraint(inv).strictness > strictness) + strictness = KDRestraint(inv).strictness; + break; + } + } + } + } + } + i--; + inv = i >= 0 ? stack[i] : undefined; + } + } + + return strictness; +} + +/** + * Gets the list of restraint nammes affecting the Group + * @param Group + * @param excludeItem + */ +function KinkyDungeonGetStrictnessItems(Group: string, excludeItem: item): string[] { + let list = []; + for (let inv of KinkyDungeonAllRestraint()) { + while (inv) { + if (inv != excludeItem && KDRestraint(inv).strictness) { + let strictGroups = KDRestraint(inv).strictnessZones || KinkyDungeonStrictnessTable.get(KDRestraint(inv).Group); + if (strictGroups) { + for (let s of strictGroups) { + if (s == Group) { + // Add the top item + if (KDRestraint(inv).strictness) + list.push(KDRestraint(inv).name); + // Add the items underneath it!! + break; + } + } + } + } + inv = inv.dynamicLink; + } + } + return list; +} + + +function KinkyDungeonGetPickBaseChance(): number { + let bonus = 0; + if (KinkyDungeonStatsChoice.get("Locksmith")) bonus += KDLocksmithPickBonus; + if (KinkyDungeonStatsChoice.get("Clueless")) bonus += KDCluelessPickBonus; + if (KinkyDungeonStatsChoice.get("LocksmithMaster")) bonus += 0.15; + return 0.33 / (1.0 + 0.02 * MiniGameKinkyDungeonLevel) + bonus; +} + +function KinkyDungeonGetPickBonus(): number { + let bonus = 0; + if (KinkyDungeonStatsChoice.get("Locksmith")) bonus += KDLocksmithBonus; + if (KinkyDungeonStatsChoice.get("Clueless")) bonus += KDCluelessBonus; + if (KinkyDungeonStatsChoice.get("LocksmithMaster")) bonus += 0.15; + return bonus; +} + +function KinkyDungeonPickAttempt(): boolean { + let Pass = "Fail"; + let escapeChance = KinkyDungeonGetPickBaseChance(); + let cost = KinkyDungeonStatStaminaCostPick; + let wcost = KinkyDungeonStatWillCostPick; + let lock = KinkyDungeonTargetTile.Lock; + if (!KinkyDungeonTargetTile.pickProgress) KinkyDungeonTargetTile.pickProgress = 0; + + if (!lock) return; + + KinkyDungeonInterruptSleep(); + + if (KDLocks[lock] && !KDLocks[lock].canPick({target: KinkyDungeonTargetTile, location: KinkyDungeonTargetTileLocation})) { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggleCantPick" + lock + "Lock"), "orange", 2, true); + Pass = "Fail"; + } + + let handsBound = KinkyDungeonIsHandsBound(false, true, 0.55) && !KinkyDungeonCanUseFeet(); + let armsBound = KinkyDungeonIsArmsBound(); + let strict = KinkyDungeonStrictness(false, "ItemHands"); + if (!strict) strict = 0; + if (armsBound) escapeChance = Math.max(0.0, escapeChance - 0.25); + if (handsBound && strict < 0.5) escapeChance = Math.max(0, escapeChance - 0.5); + else if (strict) escapeChance = Math.max(0, escapeChance - strict); + + escapeChance /= 1.0 + KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax*KinkyDungeonDistractionUnlockSuccessMod; + + let chargecosts = true; + if (wcost > 0 && !KinkyDungeonHasWill(-wcost, false)) { + chargecosts = false; + KinkyDungeonSendActionMessage(10, TextGet("KDWillStruggle"), "#ff5277", 2, true); + } else if (!KinkyDungeonHasStamina(-cost, true)) { + chargecosts = false; + KinkyDungeonWaitMessage(true, 0); + } else if (KinkyDungeonTargetTile && KinkyDungeonTargetTile.pickProgress >= 1){//KDRandom() < escapeChance + Pass = "Success"; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Unlock.ogg"); + } else if (KDLocks[lock] && KDLocks[lock].breakChance({})) { // Blue locks cannot be picked or cut! + Pass = "Break"; + KDAddConsumable("Pick", -1); + KinkyDungeonPickBreakProgress = 0; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/PickBreak.ogg"); + } else if (!KinkyDungeonStatsChoice.get("Psychic") && (handsBound || (armsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound))) { + KinkyDungeonDropItem({name: "Pick"}, KinkyDungeonPlayerEntity, true); + KDAddConsumable("Pick", -1); + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Miss.ogg"); + } else { + KinkyDungeonTargetTile.pickProgress += escapeChance; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Pick.ogg"); + } + KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonAttemptPick" + Pass).replace("TargetRestraint", TextGet("KinkyDungeonObject")), (Pass == "Success") ? "lightgreen" : "#ff5277", 1); + if (chargecosts) { + KDChangeStamina(KinkyDungeonTargetTileLocation, "map", "pick", cost, true); + KDChangeWill(KinkyDungeonTargetTileLocation, "map", "pick", wcost); + } + KinkyDungeonSetFlag("tryescaping", 3); + return Pass == "Success"; +} + +/** + * @param lock + */ +function KinkyDungeonUnlockAttempt(lock: string): boolean { + let Pass = "Fail"; + let escapeChance = 1.0; + + KinkyDungeonInterruptSleep(); + + let handsBound = KinkyDungeonIsHandsBound(false, true, 0.85) && !KinkyDungeonCanUseFeet(); + let armsBound = KinkyDungeonIsArmsBound(); + let strict = KinkyDungeonStrictness(false, "ItemHands"); + if (!strict) strict = 0; + if (armsBound) escapeChance = Math.max(0.1, escapeChance - 0.25); + if (handsBound && strict < 0.5) escapeChance = Math.max(0, escapeChance - 0.5); + else if (strict) escapeChance = Math.max(0, escapeChance - strict); + + if (KinkyDungeonStatsChoice.get("Psychic")) escapeChance = Math.max(escapeChance, 0.33); + if (KDRandom() < escapeChance) + Pass = "Success"; + KinkyDungeonSendActionMessage(2, TextGet("KinkyDungeonStruggleUnlock" + Pass).replace("TargetRestraint", TextGet("KinkyDungeonObject")), (Pass == "Success") ? "lightgreen" : "#ff5277", 1); + if (Pass == "Success") { + KinkyDungeonRemoveKeysUnlock(lock); + if (KDLocks[lock] && KDLocks[lock].loot_special && KinkyDungeonTargetTile && KinkyDungeonTargetTile.Loot == "normal") KinkyDungeonSpecialLoot = true; + else if (KDLocks[lock] && KDLocks[lock].loot_locked && KinkyDungeonTargetTile && KinkyDungeonTargetTile.Loot == "normal") KinkyDungeonLockedLoot = true; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Unlock.ogg"); + return true; + } else if (!KinkyDungeonStatsChoice.get("Psychic") && (handsBound || (armsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound))) { + let keytype = KinkyDungeonGetKey(lock); + if (keytype) { + KinkyDungeonRemoveKeysDropped(lock, keytype); + } + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Miss.ogg"); + } else { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Pick.ogg"); + } + KinkyDungeonSetFlag("tryescaping", 3); + return false; +} + +/** Gets the affinity of a restraint */ +function KDGetRestraintAffinity(item: item, data: any): string { + data.item = item; + data.affinity = ""; + data.overrideAffinity = false; + if (KDRestraint(item) && KDRestraint(item).affinity) { + if (KDRestraint(item).affinity[data.StruggleType]) { + for (let a of KDRestraint(item).affinity[data.StruggleType]) { + data.affinity = a; + if (KinkyDungeonGetAffinity(false, a, data.StruggleGroup)) break; + } + } + } + KinkyDungeonSendEvent("beforeAffinityCalc", data); + if (!data.overrideAffinity && data.affinity == "") { + switch (data.StruggleType) { + case "Struggle": data.affinity = "Hook"; break; + case "Remove": data.affinity = "Edge"; break; + case "Cut": data.affinity = "Sharp"; break; + case "Pick": data.affinity = ""; break; + case "Unlock": data.affinity = "Sticky"; break; + } + } + return data.affinity; +} + +function KDGetEscapeChance(restraint: item, StruggleType: string, escapeChancePre: number, limitChancePre: number, ApplyGhost: boolean, ApplyPlayerBonus: boolean, Msg?: boolean) { + let escapeChance = escapeChancePre != undefined ? escapeChancePre : KDRestraint(restraint).escapeChance[StruggleType] != undefined ? KDRestraint(restraint).escapeChance[StruggleType] : 1.0; + if (KDGetCurse(restraint)) escapeChance = -100; + let lockType = (restraint.lock && KDLocks[restraint.lock]) ? KDLocks[restraint.lock] : null; + if (lockType) { + let extraChance = (StruggleType == "Pick" && lockType.pick_diff) ? lockType.pick_diff : 0; + if (extraChance) escapeChance += extraChance; + if (StruggleType == "Unlock" && lockType.unlock_diff) { + escapeChance -= lockType.unlock_diff; + } + + } + + let limitChance = limitChancePre != undefined ? limitChancePre : (KDRestraint(restraint).limitChance != undefined && KDRestraint(restraint).limitChance[StruggleType] != undefined) ? KDRestraint(restraint).limitChance[StruggleType] : + ((StruggleType == "Unlock" || StruggleType == "Pick") ? 0 : 0.12); + + if (ApplyPlayerBonus) { + if (StruggleType == "Pick") { + if (KinkyDungeonStatsChoice.get("Locksmith")) {escapeChance += KDLocksmithBonus;} + if (KinkyDungeonStatsChoice.get("Clueless")) limitChance -= KDCluelessBonus; + } else if (StruggleType == "Remove" || StruggleType == "Unlock") { + if (KinkyDungeonStatsChoice.get("Flexible")) {escapeChance += KDFlexibleBonus;} + if (KinkyDungeonStatsChoice.get("Inflexible")) limitChance *= KDInflexibleMult; + } else if (StruggleType == "Struggle") { + if (KinkyDungeonStatsChoice.get("Strong")) {escapeChance += KDStrongBonus;} + if (KinkyDungeonStatsChoice.get("Weak")) limitChance -= KDWeakBonus; + } + } + + //if (!KinkyDungeonHasHelp()) { + //limitChance += 0.05; // Small penalty for not having help + //} + + if (StruggleType != "Unlock") { + if (KinkyDungeonStatsChoice.get("HighSecurity")) { + KinkyDungeonKeyPickBreakAmount = KDDamselPickAmount; + } else { + KinkyDungeonKeyPickBreakAmount = KinkyDungeonKeyPickBreakAmountBase; + } + + if (KinkyDungeonStatsChoice.get("ShoddyKnives")) { + KinkyDungeonKnifeBreakAmount = KDBunnyKnifeAmount; + KinkyDungeonEnchKnifeBreakAmount = KDBunnyEnchKnifeAmount; + } else { + KinkyDungeonKnifeBreakAmount = KinkyDungeonKnifeBreakAmountBase; + KinkyDungeonEnchKnifeBreakAmount = KinkyDungeonEnchKnifeBreakAmountBase; + } + if (KinkyDungeonStatsChoice.get("FreeSpirit") && (KDRestraint(restraint).chastity || KDRestraint(restraint).chastitybra)) escapeChance += 0.5; + + + if (KinkyDungeonStatsChoice.get("Unchained") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Metal")) { + escapeChance += (StruggleType == "Cut" ? 0.5 : 1) * KDUnchainedBonus; + } else + if (KinkyDungeonStatsChoice.get("Artist") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Rope")) { + escapeChance += (StruggleType == "Cut" ? 0.5 : 1) * KDArtistBonus; + } else + if (KinkyDungeonStatsChoice.get("Slippery") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Latex")) { + escapeChance += (StruggleType == "Cut" ? 0.5 : 1) * KDSlipperyBonus; + } else + if (KinkyDungeonStatsChoice.get("Escapee") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Leather")) { + escapeChance += (StruggleType == "Cut" ? 0.5 : 1) * KDEscapeeBonus; + } + + + if (KinkyDungeonStatsChoice.get("Damsel") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Metal")) { + if (escapeChance > 0) + limitChance += escapeChance * 0.2; + if (StruggleType != "Pick" && StruggleType != "Unlock" && limitChance > 0 && limitChance < -KDDamselBonus) + limitChance *= KDDamselBonus; + } + else if (KinkyDungeonStatsChoice.get("Bunny") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Rope")) { + if (escapeChance > 0) + limitChance += escapeChance * 0.2; + if (StruggleType != "Pick" && StruggleType != "Unlock" && limitChance > 0 && limitChance < -KDBunnyBonus) + limitChance *= KDBunnyBonus; + } + else if (KinkyDungeonStatsChoice.get("Doll") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Latex")) { + if (escapeChance > 0) + limitChance += escapeChance * 0.2; + if (StruggleType != "Pick" && StruggleType != "Unlock" && limitChance > 0 && limitChance < -KDDollBonus) + limitChance *= KDDollBonus; + } + else if (KinkyDungeonStatsChoice.get("Dragon") && KDRestraint(restraint).shrine && KDRestraint(restraint).shrine.includes("Leather")) { + if (escapeChance > 0) + limitChance += escapeChance * 0.2; + if (StruggleType != "Pick" && StruggleType != "Unlock" && limitChance > 0 && limitChance < -KDDragonBonus) + limitChance *= KDDragonBonus; + } + } + + + let data = { + restraint: restraint, + escapeChance: escapeChance, + limitChance: limitChance, + struggleType: StruggleType, + escapeChancePre: escapeChancePre, + limitChancePre: limitChancePre, + ApplyGhost: ApplyGhost, + ApplyPlayerBonus: ApplyPlayerBonus, + GoddessBonus: 0, + Msg: Msg, + + }; + + let GoddessBonus = KDGetItemGoddessBonus(restraint, data); + //if (data.escapeChance > 0) + //data.escapeChance *= Math.max(0, 1 + GoddessBonus); + //else + //data.escapeChance /= Math.max(0.1, 1 + GoddessBonus); + //data.escapeChance += GoddessBonus; + if (GoddessBonus > 0) { + data.escapeChance += GoddessBonus; + } else { + data.limitChance -= GoddessBonus; + } + data.GoddessBonus = GoddessBonus; + + KinkyDungeonSendEvent("perksStruggleCalc", data); + + return { + escapeChance: data.escapeChance, + limitChance: data.limitChance, + escapeChanceData: data, + }; + +} + +let KDUnboundAffinityOverride = { + "Sticky": true, + "Edge": true, + "Hook": true, +}; + +function KDGetDynamicItem(group: string, index: number) { + let restraint = KinkyDungeonGetRestraintItem(group); + let host = restraint; + if (index) { + let surfaceItems = KDDynamicLinkListSurface(restraint); + let dynamicItems = KDDynamicLinkList(restraint, true); + if (surfaceItems[index]) { + restraint = surfaceItems[index]; + for (let h_item of dynamicItems) { + if (h_item.dynamicLink == restraint) { + host = h_item; + break; + } + } + //host = surfaceItems[index - 1]; + } + else console.log("Error! Please report the item combination and screenshot to Ada!"); + } + return {restraint: restraint, host: host}; +} + + +/** + * Mutates the GetStruggleData array + * @param data + */ +function KDGetStruggleData(data: KDStruggleData): string { + if (data.struggleType == "Cut") data.cost = KinkyDungeonStatStaminaCostTool; + else if (data.struggleType == "Pick") data.cost = KinkyDungeonStatStaminaCostPick; + else if (data.struggleType == "Remove") data.cost = KinkyDungeonStatStaminaCostRemove; + else if (data.struggleType == "Unlock") data.cost = KinkyDungeonStatStaminaCostPick; + if (data.struggleType == "Cut") data.wcost = KinkyDungeonStatWillCostTool; + else if (data.struggleType == "Pick") data.wcost = KinkyDungeonStatWillCostPick; + else if (data.struggleType == "Remove") data.wcost = KinkyDungeonStatWillCostRemove; + else if (data.struggleType == "Unlock") data.wcost = KinkyDungeonStatWillCostUnlock; + if (data.struggleType == "Unlock") data.cost = 0; + KinkyDungeonSendEvent("beforeStruggleCalc", data); + if (!data.restraint.pickProgress) data.restraint.pickProgress = 0; + if (!data.restraint.struggleProgress) data.restraint.struggleProgress = 0; + if (!data.restraint.unlockProgress) data.restraint.unlockProgress = 0; + if (!data.restraint.cutProgress) data.restraint.cutProgress = 0; + let EC = KDGetEscapeChance(data.restraint, data.struggleType, data.escapeChance, data.limitChance, true, true, !data.query); + data.escapeChance = EC.escapeChance; + data.limitChance = EC.limitChance; + + // Experimental ==> all escape chance increased by 1-progress%, all limit chance increased by the same amount + + + if (KDGroupBlocked(data.struggleGroup) && !KDRestraint(data.restraint).alwaysStruggleable) { + data.escapeChance = 0; + if (!data.query) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(data.restraint) && KDGetEscapeSFX(data.restraint).Blocked) ? + KDGetEscapeSFX(data.restraint).Blocked : "Struggle") + + ".ogg"); + KinkyDungeonSendActionMessage(10, TextGet("KDStruggleBlocked") + .replace("TargetRestraint", TextGet("Restraint" + data.restraint.name)), + "#ff5277", 2, true); + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: data.restraint, + group: data.struggleGroup, + struggleType: data.struggleType, + result: "Blocked", + }); + return "Blocked"; + } + + } + + + let toolMult = Math.max(0, 1 + data.toolBonus) * data.toolMult; + let buffMult = Math.max(0, 1 + data.buffBonus) * data.buffMult; + + + + + if (data.struggleType == "Pick" || data.struggleType == "Unlock") data.escapeChance += KinkyDungeonGetPickBonus()*toolMult; + data.origEscapeChance = data.escapeChance; + + + + let increasedAttempts = false; + + data.handsBound = KinkyDungeonIsHandsBound(true, false, StruggleTypeHandThresh[data.struggleType]) && !KinkyDungeonCanUseFeet(); + data.handBondage = data.handsBound ? 1.0 : Math.min(1, Math.max(0, KDHandBondageTotal(false))); + //let cancut = false; + + // Bonuses go here. Buffs dont get added to orig escape chance, but + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostStruggle")) data.escapePenalty -= KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostStruggle"); + + + // Finger extensions will help if your hands are unbound. Some items cant be removed without them! + // Mouth counts as a finger extension on your hands if your arms aren't tied + let armsBound = KinkyDungeonIsArmsBound(true); + let armsBoundOverride = false; + let handsBoundOverride = false; + + + if (data.struggleType == "Cut") { + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostCutting")) data.escapePenalty -= KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostCutting"); + if (data.hasAffinity) { + if (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp() || !KinkyDungeonPlayerDamage) { + let maxBonus = 0; + let weaponsToTest = KinkyDungeonAllWeapon();//KinkyDungeonCanUseWeapon() ? KinkyDungeonAllWeapon() : [KinkyDungeonPlayerDamage]; + for (let inv of weaponsToTest) { + if (KDWeapon(inv).cutBonus > maxBonus) maxBonus = KDWeapon(inv).cutBonus; + if (KDWeapon(inv).cutBonus != undefined && KDWeaponIsMagic(inv)) data.canCutMagic = true; + } + data.cutBonus = maxBonus*toolMult; + data.escapeChance += data.cutBonus; + data.origEscapeChance += data.cutBonus; + //if (maxBonus > 0) cancut = true; + } else if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.cutBonus) { + data.cutBonus = KinkyDungeonPlayerDamage.cutBonus*toolMult; + data.escapeChance += data.cutBonus; + data.origEscapeChance += data.cutBonus; + //cancut = true; + } + } + if (!data.query && (!data.hasAffinity || + (!data.canCutMagic && KDRestraint(data.restraint)?.magic) + )) { + if (!KinkyDungeonPlayerDamage || !KinkyDungeonPlayerDamage.cutBonus) { + if (!KinkyDungeonFlags.get("tut_cut")) { + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Cut"), KDTutorialColor, 10); + } + } else if (data.handsBound || data.armsBound || (!data.canCutMagic && KDRestraint(data.restraint)?.magic)) { + if (!KinkyDungeonFlags.get("tut_cutcrack") || !KinkyDungeonFlags.get("tut_cutmagic")) { + let maxBonus = 0; + let canCutMagic = false; + let weaponsToTest = KinkyDungeonAllWeapon();//KinkyDungeonCanUseWeapon() ? KinkyDungeonAllWeapon() : [KinkyDungeonPlayerDamage]; + for (let inv of weaponsToTest) { + if (KDWeapon(inv).cutBonus > maxBonus) maxBonus = KDWeapon(inv).cutBonus; + if (KDWeapon(inv).cutBonus != undefined && KDWeaponIsMagic(inv)) canCutMagic = true; + } + if (!KinkyDungeonFlags.get("tut_cutmagic") && !data.canCutMagic && KDRestraint(data.restraint)?.magic) { + if (!canCutMagic) { + KinkyDungeonSendTextMessage(10, TextGet("KDTut_CutMagic"), KDTutorialColor, 10); + KinkyDungeonSetFlag("tut_cutmagic", -1); + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDTut_CutMagicHas"), KDTutorialColor, 10); + KinkyDungeonSetFlag("tut_cutmagic", -1); + } + } else if (!KinkyDungeonFlags.get("tut_cutcrack") && maxBonus && !(!data.canCutMagic && KDRestraint(data.restraint)?.magic)) { + KinkyDungeonSetFlag("tut_cutcrack", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_CutCrack2"), KDTutorialColor, 10); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_CutCrack"), KDTutorialColor, 10); + } + } + } + + } + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostCuttingMinimum")) data.escapeChance = Math.max(data.escapeChance, KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BoostCuttingMinimum")); + } + if (data.struggleType == "Cut" && !KDRestraint(data.restraint).magic && KinkyDungeonWeaponCanCut(false, true)) { + data.escapeChance += KinkyDungeonEnchantedKnifeBonus*toolMult; + data.origEscapeChance += KinkyDungeonEnchantedKnifeBonus*toolMult; + } + + if (KDUnboundAffinityOverride[data.affinity] && (!data.handsBound || handsBoundOverride) && (!armsBound || armsBoundOverride)) data.hasAffinity = true; + + // Bonus for using lockpick or knife + if (data.struggleType == "Remove" && + (!data.handsBound && (KinkyDungeonWeaponCanCut(true) || KinkyDungeonItemCount("Pick")) + || (data.struggleGroup == "ItemHands" && KinkyDungeonCanTalk() && !armsBound))) { + data.escapeChance = Math.max(data.escapeChance, Math.min(1, data.escapeChance + 0.15*toolMult)); + data.origEscapeChance = Math.max(data.origEscapeChance, Math.min(1, data.origEscapeChance + 0.15*toolMult)); + } + + // Psychic doesnt modify original chance, so that you understand its the perk helping you + if (data.struggleType == "Unlock" && KinkyDungeonStatsChoice.get("Psychic")) data.escapeChance = Math.max(data.escapeChance, 0.25); + + + // Restriction penalties AFTER bonuses + if (data.restriction > 0 && !KinkyDungeonHasHelp()) { + let restrictionMult = 1 - 10 / (10 + data.restriction); + + if (data.escapeChance > 0) { + let penalty = 0; + switch (data.struggleType) { + case "Struggle": { + penalty = 0.3; + break; + } + case "Cut": { + penalty = 0.6; + break; + } + case "Unlock": { + penalty = 0.3; + break; + } + case "Pick": { + penalty = 0.4; + break; + } + case "Remove": { + penalty = 0.4; + break; + } + } + + data.escapePenalty += data.escapeChance * penalty * restrictionMult; + } + } + + + let edgeBonus = 0.12*toolMult; + // Easier to struggle if your legs are free, due to leverage + // Slight boost to remove as well, but not as much due to the smaller movements required + if ((data.struggleType == "Struggle" || data.struggleType == "Cut") && data.hasAffinity) + data.escapeChance += edgeBonus * (0.4 + 0.2*Math.max(2 - KinkyDungeonSlowLevel, 0)); + else if ((data.struggleType == "Remove") && data.hasAffinity) + data.escapeChance += edgeBonus * (0.2 + 0.15*Math.max(2 - KinkyDungeonSlowLevel, 0)); + + + if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Lockdown")) { + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonBuffLockdownTry") + .replace("TargetRestraint", TextGet("Restraint" + data.restraint.name)), "#ff5277", 1); + data.escapeChance -= KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Lockdown") * 0.1; + } + + + if (data.escapePenalty < 0) data.escapePenalty *= buffMult; + + + // Struggling is unaffected by having arms bound + let minAmount = 0.1 - Math.max(0, 0.01*KDRestraint(data.restraint).power); + if (data.struggleType == "Remove" && !data.hasAffinity) minAmount = 0; + + + if (data.upfrontWill && !KinkyDungeonHasWill(0.01, false)) { + data.escapePenalty += data.willEscapePenalty; + if (data.escapeChance - data.escapePenalty + data.willEscapePenalty > 0 + && data.escapeChance - data.escapePenalty < 0) { + if (!data.query) { + if (data.escapePenalty) { + data.escapeChance -= data.escapePenalty; + } + + // Replace with frustrated moan later~ + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(data.restraint) && KDGetEscapeSFX(data.restraint).NoWill) ? KDGetEscapeSFX(data.restraint).NoWill : "Struggle") + + ".ogg"); + KinkyDungeonSendActionMessage(10, TextGet("KDWillStruggle") + .replace("TargetRestraint", TextGet("Restraint" + data.restraint.name)), "#ff5277", 2, true); + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: data.restraint, + group: data.struggleGroup, + struggleType: data.struggleType, + result: "Will", + }); + return "Will"; + } + } + } + + if (data.escapePenalty) { + data.escapeChance -= data.escapePenalty; + } + + if ((data.struggleType == "Struggle") && !data.hasAffinity && data.escapeChance <= 0 && data.escapeChance >= -edgeBonus && (!KDRestraint(data.restraint).alwaysEscapable || !KDRestraint(data.restraint).alwaysEscapable.includes(data.struggleType))) { + let typesuff = ""; + if (!data.query) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(data.restraint) && KDGetEscapeSFX(data.restraint).Struggle) ? KDGetEscapeSFX(data.restraint).Struggle : "Struggle") + + ".ogg"); + if (data.affinity && !KinkyDungeonGetAffinity(false, data.affinity, data.struggleGroup)) typesuff = "Wrong" + data.affinity; + if (typesuff == "" && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) typesuff = typesuff + "Aroused"; + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggle" + data.struggleType + "NeedEdge" + typesuff) + .replace("TargetRestraint", TextGet("Restraint" + data.restraint.name)), "#ff5277", 2, true); + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: data.restraint, + group: data.struggleGroup, + struggleType: data.struggleType, + result: "NeedEdge", + }); + return "NeedEdge"; + } + } + + let removeFail = ((data.struggleType == "Unlock" && !KinkyDungeonStatsChoice.get("Psychic")) || data.struggleType == "Pick") && !(KinkyDungeonHasHelp()) && KDGetEscapeChance(data.restraint, "Remove", undefined, undefined, false, false).escapeChance <= 0; + + if (removeFail) data.escapeChance = 0; + + if (data.escapeChance <= 0 + && (!KDRestraint(data.restraint).alwaysEscapable + || !KDRestraint(data.restraint).alwaysEscapable.includes(data.struggleType))) { + if (!data.restraint.attempts) data.restraint.attempts = 0; + if (!data.query && data.restraint.attempts < KinkyDungeonMaxImpossibleAttempts) { + increasedAttempts = true; + data.restraint.attempts += 1; + if (data.escapeChance <= -0.5) data.restraint.attempts += 1; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(data.restraint) && KDGetEscapeSFX(data.restraint)[data.struggleType]) ? KDGetEscapeSFX(data.restraint)[data.struggleType] : "Struggle") + + ".ogg"); + return "Fail"; + } else { + if (!data.query) { + let typesuff = ""; + if (removeFail || (data.origEscapeChance <= 0 && data.helpChance)) typesuff = "3"; + else if (KDRestraint(data.restraint).specStruggleTypes && KDRestraint(data.restraint).specStruggleTypes.includes(data.struggleType)) typesuff = "2"; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(data.restraint) && KDGetEscapeSFX(data.restraint)[data.struggleType]) ? KDGetEscapeSFX(data.restraint)[data.struggleType] : "Struggle") + + ".ogg"); + if (typesuff == "" && data.failSuffix) typesuff = data.failSuffix; + if (typesuff == "" && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) typesuff = typesuff + "Aroused"; + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggle" + data.struggleType + "Impossible" + typesuff) + .replace("TargetRestraint", TextGet("Restraint" + data.restraint.name)), "#ff5277", 2, true); + if (EC.escapeChanceData.GoddessBonus < 0 && EC.escapeChanceData.escapeChance < 0 && EC.escapeChance - EC.escapeChanceData.GoddessBonus > 0) { + KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonStruggle" + data.struggleType + "ImpossibleGoddess") + .replace("TargetRestraint", TextGet("Restraint" + data.restraint.name)), "#ff5277", 2, true); + } + + if (KinkyDungeonHasStamina(-data.cost)) { + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: data.restraint, + group: data.struggleGroup, + struggleType: data.struggleType, + result: "Impossible", + }); + if (!KinkyDungeonFlags.get("tut_shrinebondage")) { + KinkyDungeonSetFlag("tut_shrinebondage", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Bondage"), KDTutorialColor, 10); + } + + KDChangeStamina(data.struggleGroup, data.struggleType, "struggle", data.cost, true, 1); + KDChangeWill(data.struggleGroup, data.struggleType, "struggle", data.wcost); + if (KinkyDungeonStatsChoice.get("BondageLover")) KDChangeDistraction( + "BondageLover", "perk", "struggle", KDBondageLoverAmount, false, 0.1); + } + KinkyDungeonAdvanceTime(1); + KinkyDungeonSetFlag("escapeimpossible", 2); + KinkyDungeonSetFlag("embarrassed", 8); + } + return "Impossible"; + } + } + + // Bound arms make fine motor skill escaping more difficult in general + if (!(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && data.struggleType != "Struggle" && armsBound) { + if (data.struggleGroup == "ItemArms") + data.escapeChance *= 0.8; + else if (data.struggleGroup != "ItemHands") + data.escapeChance *= 0.7; + else + data.escapeChance *= 0.6; + } + + // Bound arms make escaping more difficult, and impossible if the chance is already slim + if (data.struggleType != "Struggle" && armsBound) data.escapeChance = Math.max(minAmount, data.escapeChance - (data.struggleGroup != "ItemArms" ? 0.18 : 0.09)); + else if (data.struggleType == "Remove" && !armsBound && !data.handsBound) data.escapeChance = Math.max(minAmount, data.escapeChance + 0.07 * (1 - KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax)); + + // Covered hands makes it harder to unlock. If you have the right removal type it makes it harder but wont make it go to 0 + if (((data.struggleType == "Unlock" && !KinkyDungeonStatsChoice.get("Psychic")) || data.struggleType == "Pick" || data.struggleType == "Remove") && data.handsBound) + data.escapeChance = (data.struggleGroup != "ItemHands" ? 0.6 : 0.8) * Math.max((data.struggleType == "Remove" && data.hasAffinity) ? + Math.max(0, data.escapeChance * 0.8) : 0, data.escapeChance - 0.07 - 0.1 * data.handBondage); + + if (data.struggleType == "Unlock" && KinkyDungeonStatsChoice.get("Psychic")) data.escapeChance = Math.max(data.escapeChance, 0.2); + + if ((data.struggleType == "Remove") && !data.hasAffinity && data.escapeChance == 0 && (!KDRestraint(data.restraint).alwaysEscapable || !KDRestraint(data.restraint).alwaysEscapable.includes(data.struggleType))) { + let typesuff = ""; + if (!data.query) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(data.restraint) && KDGetEscapeSFX(data.restraint)[data.struggleType]) ? KDGetEscapeSFX(data.restraint)[data.struggleType] : "Struggle") + + ".ogg"); + if (data.affinity && !KinkyDungeonGetAffinity(false, data.affinity, data.struggleGroup)) typesuff = "Wrong" + data.affinity; + if (typesuff == "" && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) typesuff = typesuff + "Aroused"; + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggle" + data.struggleType + "NeedEdge" + typesuff) + .replace("TargetRestraint", TextGet("Restraint" + data.restraint.name)), "#ff5277", 2, true); + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: data.restraint, + group: data.struggleGroup, + struggleType: data.struggleType, + result: "NeedEdge", + }); + return "NeedEdge"; + } + } + + let possible = data.escapeChance > 0; + // Strict bindings make it harder to escape unless you have help or are cutting with affinity + if (data.strict && data.struggleType == "Struggle") + data.escapeChance = Math.max(0, data.escapeChance - data.strict * 0.9); + + if (data.struggleType == "Unlock" && KinkyDungeonStatsChoice.get("Psychic")) data.escapeChance = Math.max(data.escapeChance, 0.2); + + if (possible && data.escapeChance == 0 && (!KDRestraint(data.restraint).alwaysEscapable || !KDRestraint(data.restraint).alwaysEscapable.includes(data.struggleType))) { + let typesuff = ""; + if (!data.query) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(data.restraint) && KDGetEscapeSFX(data.restraint)[data.struggleType]) ? KDGetEscapeSFX(data.restraint)[data.struggleType] : "Struggle") + + ".ogg"); + if (typesuff == "" && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) typesuff = typesuff + "Aroused"; + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggle" + data.struggleType + "Strict" + typesuff) + .replace("TargetRestraint", TextGet("Restraint" + data.restraint.name)), "#ff5277", 2, true); + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: data.restraint, + group: data.struggleGroup, + struggleType: data.struggleType, + result: "Strict", + }); + if (!KinkyDungeonFlags.get("tut_shrinebondage")) { + KinkyDungeonSetFlag("tut_shrinebondage", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Bondage"), KDTutorialColor, 10); + } + return "Strict"; + } + } + + // Reduce cutting power if you dont have hands + if (data.struggleType == "Cut" && KinkyDungeonIsHandsBound(true)) { + if (KinkyDungeonAllWeapon().some((inv) => {return KDWeapon(inv).light && KDWeapon(inv).cutBonus != undefined;})) { + if (KinkyDungeonWallCrackAndKnife(true)) { + data.escapeChance *= 0.92; + data.limitChance *= 0.9; // Compensate by reducing limit chance a little + } else if (!KinkyDungeonIsArmsBound(true)) { + data.escapeChance *= 0.7; + data.limitChance *= 0.8; // Compensate by reducing limit chance a little + } else if (KinkyDungeonStatsChoice.get("Psychic")) { + data.escapeChance *= 0.7; // Compensate by reducing limit chance a little + data.limitChance *= 0.8; // Compensate by reducing limit chance a little + } else if (data.hasAffinity) { + data.escapeChance *= 0.5; + data.limitChance *= 0.6; // Compensate by reducing limit chance a little + } else { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonNeedGrip"), "#ff5277", 2, true); + data.escapeChance *= 0.0; + } + } else if (data.hasAffinity) data.escapeChance *= 0.5; + else data.escapeChance = 0; + + // 5.2.6 - removed because limitchance already accounts for this + //data.escapeChance = Math.max(0, data.escapeChance - 0.05); + + } + + if (!(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && (data.struggleType == "Pick" || data.struggleType == "Unlock" || data.struggleType == "Remove")) data.escapeChance /= 1.0 + KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax*KinkyDungeonDistractionUnlockSuccessMod; + + // Blue locks make it harder to escape an item + + if (data.lockType && data.lockType.penalty && data.lockType.penalty[data.struggleType]) data.escapeChance = Math.max(0, data.escapeChance - data.lockType.penalty[data.struggleType]); + + + if (data.struggleType == "Unlock" && KinkyDungeonStatsChoice.get("Psychic")) data.escapeChance = Math.max(data.escapeChance, 0.15); + + let belt = null; + let bra = null; + + if (data.struggleGroup == "ItemVulva" || data.struggleGroup == "ItemVulvaPiercings" || data.struggleGroup == "ItemButt") belt = KinkyDungeonGetRestraintItem("ItemPelvis"); + if (belt && KDRestraint(belt) && KDRestraint(belt).chastity) data.escapeChance = 0.0; + + if (data.struggleGroup == "ItemNipples" || data.struggleGroup == "ItemNipplesPiercings") bra = KinkyDungeonGetRestraintItem("ItemBreast"); + if (bra && KDRestraint(bra) && KDRestraint(bra).chastitybra) data.escapeChance = 0.0; + + if (!data.query) { + KinkyDungeonSetFlag(data.struggleType, 1); + KinkyDungeonSetFlag("escaping", 1); + } + + if (data.escapeChance <= 0 + && (!KDRestraint(data.restraint).alwaysEscapable || !KDRestraint(data.restraint).alwaysEscapable.includes(data.struggleType))) { + if (!data.restraint.attempts) data.restraint.attempts = 0; + if (data.restraint.attempts < KinkyDungeonMaxImpossibleAttempts || increasedAttempts) { + if (!increasedAttempts) { + data.restraint.attempts += 0.5; + if (data.escapeChance <= -0.5) data.restraint.attempts += 0.5; + } + return "Fail"; + } else { + if (!data.query) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(data.restraint) && KDGetEscapeSFX(data.restraint)[data.struggleType]) ? KDGetEscapeSFX(data.restraint)[data.struggleType] : "Struggle") + + ".ogg"); + let suff = ""; + if (suff == "" && data.failSuffix) suff = data.failSuffix; + if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) suff = suff + "Aroused"; + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggle" + data.struggleType + "ImpossibleBound" + suff) + .replace("TargetRestraint", TextGet("Restraint" + data.restraint.name)), "#ff5277", 2, true); + + + if (KinkyDungeonHasStamina(-data.cost)) { + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: data.restraint, + group: data.struggleGroup, + struggleType: data.struggleType, + result: "Impossible", + }); + if (!KinkyDungeonFlags.get("tut_shrinebondage")) { + KinkyDungeonSetFlag("tut_shrinebondage", -1); + KinkyDungeonSendTextMessage(10, TextGet("KDTut_Bondage"), KDTutorialColor, 10); + } + KDChangeStamina(data.struggleGroup, data.struggleType, "struggle", data.cost, true, 1); + KDChangeWill(data.struggleGroup, data.struggleType, "struggle", data.wcost); + if (KinkyDungeonStatsChoice.get("BondageLover")) + KDChangeDistraction("BondageLover", "perk", "struggle", KDBondageLoverAmount, false, 0.1); + } + KinkyDungeonAdvanceTime(1); + KinkyDungeonSetFlag("escapeimpossible", 2); + KinkyDungeonSetFlag("embarrassed", 8); + return "Impossible"; + } + } + } + + if (KDRestraint(data.restraint) && KDRestraint(data.restraint).escapeMult != undefined) data.escapeChance *= KDRestraint(data.restraint).escapeMult; + + if (KDRestraint(data.restraint) && KDRestraint(data.restraint).struggleMult && KDRestraint(data.restraint).struggleMult[data.struggleType] != undefined) + data.escapeChance *= KDRestraint(data.restraint).struggleMult[data.struggleType]; + if (KDRestraint(data.restraint) && KDRestraint(data.restraint).limitMult && KDRestraint(data.restraint).limitMult[data.struggleType] != undefined) + data.limitChance *= KDRestraint(data.restraint).limitMult[data.struggleType]; + + + if (!data.upfrontWill && !KinkyDungeonHasWill(0.01, false)) { + data.limitChance += data.willEscapePenalty; + if (data.escapeChance - data.limitChance + data.willEscapePenalty > 0 + && data.escapeChance - data.limitChance < 0) { + if (!data.query) { + // Replace with frustrated moan later~ + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(data.restraint) && KDGetEscapeSFX(data.restraint).NoWill) ? KDGetEscapeSFX(data.restraint).NoWill : "Struggle") + + ".ogg"); + KinkyDungeonSendActionMessage(10, TextGet("KDWillStruggle") + .replace("TargetRestraint", TextGet("Restraint" + data.restraint.name)), "#ff5277", 2, true); + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: data.restraint, + group: data.struggleGroup, + struggleType: data.struggleType, + result: "Will", + }); + return "Will"; + } + } + } + + + if (data.escapeChance > Math.max(0, data.limitChance, data.extraLim) + || (KDRestraint(data.restraint).alwaysEscapable + && KDRestraint(data.restraint).alwaysEscapable.includes(data.struggleType))) { + // Min struggle speed is always 0.05 = 20 struggle attempts + data.minSpeed = (KDRestraint(data.restraint).struggleMinSpeed && KDRestraint(data.restraint).struggleMinSpeed[data.struggleType]) ? KDRestraint(data.restraint).struggleMinSpeed[data.struggleType] : data.minSpeed; + data.escapeChance = Math.max(data.escapeChance, data.minSpeed); + } + + + // Struggling is affected by tightness + if (data.escapeChance > 0 && data.struggleType != "Unlock") {// && StruggleType == "Struggle") { + for (let T = 0; T < data.restraint.tightness; T++) { + data.escapeChance *= KDGetTightnessEffect(data.escapeChance, data.struggleType, T); // Tougher for each tightness, however struggling will reduce the tightness + } + } + + if (KDRestraint(data.restraint) && KDRestraint(data.restraint).struggleMaxSpeed && KDRestraint(data.restraint).struggleMaxSpeed[data.struggleType] != undefined) + data.escapeChance = Math.min(data.escapeChance, KDRestraint(data.restraint).struggleMaxSpeed[data.struggleType]); + + if (data.escapeChance < data.limitChance && (KDRestraint(data.restraint).alwaysEscapable + && KDRestraint(data.restraint).alwaysEscapable.includes(data.struggleType))) { + data.escapeChance = Math.max((data.minSpeed) || 0, data.limitChance + 0.01); + } + + return ""; +} + +/** + * Lockpick = use tool or cut + * Otherwise, just a normal struggle + * @param struggleGroup + * @param StruggleType + * @param index + * @param [query] + * @param [retData] + */ +function KinkyDungeonStruggle(struggleGroup: string, StruggleType: string, index: number, query: boolean = false, retData?: KDStruggleData): string { + + if (!query && KinkyDungeonPlayerEntity && !KinkyDungeonCanTalk() && KDRandom() < KinkyDungeonGagMumbleChanceRestraint) { + let msg = "KinkyDungeonGagStruggle" + (StruggleType != "Struggle" ? "Quiet" : ""); + let gagMsg = Math.floor(KDRandom() * 3); + + msg = msg + gagMsg; + + KinkyDungeonSendDialogue(KinkyDungeonPlayerEntity, TextGet(msg), "#ffffff", 5, 3); + } + + if (!query) + KinkyDungeonSetFlag("tryescaping", 3); + let restraint = KinkyDungeonGetRestraintItem(struggleGroup); + let host = restraint; + if (index) { + let surfaceItems = KDDynamicLinkListSurface(restraint); + let dynamicItems = KDDynamicLinkList(restraint, true); + if (surfaceItems[index]) { + restraint = surfaceItems[index]; + for (let h_item of dynamicItems) { + if (h_item.dynamicLink == restraint) { + host = h_item; + break; + } + } + //host = surfaceItems[index - 1]; + } + else console.log("Error! Please report the item combination and screenshot to Ada!"); + } + let failSuffix = ""; + if (restraint && KDRestraint(restraint).failSuffix && KDRestraint(restraint).failSuffix[StruggleType]) { + failSuffix = KDRestraint(restraint).failSuffix[StruggleType]; + } + if (!restraint) return "Fail"; + KinkyDungeonCurrentEscapingItem = restraint; + KinkyDungeonCurrentEscapingMethod = StruggleType; + KinkyDungeonStruggleTime = CommonTime() + 750; + let Pass = "Fail"; + let restraintEscapeChancePre = KDRestraint(restraint).escapeChance[StruggleType] != undefined ? KDRestraint(restraint).escapeChance[StruggleType] : 1.0; + let restraintLimitChancePre = (KDRestraint(restraint).limitChance && KDRestraint(restraint).limitChance[StruggleType] != undefined) ? KDRestraint(restraint).limitChance[StruggleType] : 0.12; + let helpChance = (KDRestraint(restraint).helpChance != undefined && KDRestraint(restraint).helpChance[StruggleType] != undefined) ? KDRestraint(restraint).helpChance[StruggleType] : 0.0; + let limitChance = (KDRestraint(restraint).limitChance != undefined && KDRestraint(restraint).limitChance[StruggleType] != undefined) ? KDRestraint(restraint).limitChance[StruggleType] : + ((StruggleType == "Unlock" || StruggleType == "Pick") ? 0 : 0.05); + let speedmult = (KDRestraint(restraint).speedMult != undefined && KDRestraint(restraint).speedMult[StruggleType] != undefined) ? KDRestraint(restraint).speedMult[StruggleType] : + 1; + if (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) { + if (!query) + KinkyDungeonSetFlag("HelpMeFlag", 8); + if (helpChance) + restraintEscapeChancePre = helpChance; + limitChance = 0; + } + if (KinkyDungeonHasAngelHelp()) { + restraintEscapeChancePre += 0.1; + } + + KinkyDungeonInterruptSleep(); + + let affinity = KDGetRestraintAffinity(restraint, {StruggleType: StruggleType}); + + /** + */ + let data: KDStruggleData = { + minSpeed: KDMinEscapeRate, + handBondage: 0, + handsBound: false, + armsBound: false, + query: query, + cutBonus: 0, + restraint: restraint, + struggleType: StruggleType, + struggleGroup: struggleGroup, + escapeChance: restraintEscapeChancePre, + origEscapeChance: restraintEscapeChancePre, + origLimitChance: restraintLimitChancePre, + limitChance: limitChance, + helpChance: helpChance, + cutSpeed: 0.25, + affinity: affinity, + noise: StruggleType == "Struggle" ? 4 : 0, + strict: KinkyDungeonStrictness(true, struggleGroup, restraint), + hasAffinity: KinkyDungeonGetAffinity(!query, affinity, struggleGroup), + restraintEscapeChance: KDRestraint(restraint).escapeChance[StruggleType], + cost: KinkyDungeonStatStaminaCostStruggle, + wcost: KinkyDungeonStatWillCostStruggle, + escapePenalty: -KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StrugglePower"), + willEscapePenalty: KDGetWillPenalty(StruggleType), + canCut: KinkyDungeonWeaponCanCut(false, false), + canCutMagic: KinkyDungeonWeaponCanCut(false, true), + toolBonus: 0.0, + toolMult: 1.0, + buffBonus: 0.0, + failSuffix: "", + buffMult: 1.0, + struggleTime: 1.0, + restriction: KDGameData.Restriction || 0, + speedMult: (speedmult || 1) * (KinkyDungeonHasHelp() ? 2.0 : 1.0), + escapeSpeed: 0, + maxLimit: 1, + result: "", + lockType: (restraint.lock && KDLocks[restraint.lock]) ? KDLocks[restraint.lock] : null, + + extraLim: 0, + extraLimPenalty: 0, + extraLimThreshold: 0, + + upfrontWill: KDUpfrontWill, + }; + + // Prevent crashes due to weirdness + if ((data.struggleType == "Pick" || data.struggleType == "Unlock") && !data.lockType) return "Fail"; + + data.escapeSpeed = KDBaseEscapeSpeed * data.speedMult; + data.extraLim = (data.struggleType == "Pick" && data.lockType?.pick_lim) ? Math.max(0, data.lockType.pick_lim) : 0; + data.extraLimPenalty = (data.struggleType == "Pick") ? data.extraLim * data.restraint.pickProgress : 0; + data.extraLimThreshold = Math.min(1, (data.escapeChance / data.extraLim)); + + let result = KDGetStruggleData(data); + + if (retData) + Object.assign(retData, data); + + if (!query) { + + // Handle cases where you can't even attempt to unlock or pick + if (data.lockType && (StruggleType == "Unlock" && !data.lockType.canUnlock(data)) + || (StruggleType == "Pick" && data.lockType && !data.lockType.canPick(data))) { + KinkyDungeonSetFlag("embarrassed", 3); + if (StruggleType == "Unlock") + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggleUnlockNo" + restraint.lock + "Key") + .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "orange", 2, true); + else + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeonStruggleCantPick" + restraint.lock + "Lock") + .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "orange", 2, true); + } else if (result != "Impossible") { + + // Limit of what you can struggle to given current limit chance + let maxLimit = 100; + + + // Main struggling block + /*if ((data.wcost > 0 && !KinkyDungeonHasWill(-data.wcost, false)) && (data.escapeChance*0.5 <= data.willEscapePenalty && !KinkyDungeonHasWill(0.01, false))) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).NoWill) ? KDGetEscapeSFX(restraint).NoWill : "Struggle") + + ".ogg"); + KinkyDungeonSendActionMessage(10, TextGet("KDWillStruggle") + .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff5277", 2, true); + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: restraint, + group: struggleGroup, + struggleType: StruggleType, + result: "Will", + }); + return "Will"; + } else */ + if (!KinkyDungeonHasStamina(-data.cost, true)) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).NoStamina) ? KDGetEscapeSFX(restraint).NoStamina : "Struggle") + + ".ogg"); + KinkyDungeonWaitMessage(true, 0); + } else if (data.escapeChance > 0) { + + let cutStruggleProgress = Math.min(1, (data.restraint.struggleProgress || 0) + (data.restraint.cutProgress || 0)); + + // One last check: check limits + if ((data.limitChance > 0 || data.extraLim > 0) && data.escapeChance > 0) { + let threshold = 0.75; + if (data.limitChance > data.escapeChance) { + threshold = Math.min(threshold, 0.9*(data.escapeChance / data.limitChance)); + } + let limitProgress = 0; + let maxPossible = 1; + + switch(StruggleType) { + case "Struggle": + limitProgress = (KDRestraint(restraint).struggleBreak ? cutStruggleProgress : data.restraint.struggleProgress) ? ( + (KDRestraint(restraint).struggleBreak ? cutStruggleProgress : data.restraint.struggleProgress) < threshold ? + threshold * (KDRestraint(restraint).struggleBreak ? cutStruggleProgress : data.restraint.struggleProgress) + : 1.0) + : 0; + if (data.limitChance > 0 && data.limitChance > data.escapeChance) { + // Find the intercept + maxPossible = threshold; + } + break; + case "Cut": + threshold = KDMaxCutDepth(threshold, data.cutBonus, data.origEscapeChance, data.origLimitChance); + + limitProgress = (data.restraint.cutProgress || 0) ? ( + (data.restraint.cutProgress || 0) < threshold ? threshold * (data.restraint.cutProgress || 0) : 1.0) + : 0; + if (data.limitChance > 0) { + // Find the intercept + maxPossible = threshold; + } + break; + default: + limitProgress = cutStruggleProgress ? + Math.min(1, 1.15 - 1.15 * cutStruggleProgress) + : 1; + break; + } + + /*cutStruggleProgress ? (StruggleType == "Struggle" ? + (cutStruggleProgress < threshold ? threshold * cutStruggleProgress : 1.0) : + Math.min(1, 1.15 - 1.15 * cutStruggleProgress)) + : (StruggleType == "Struggle" ? 0 : 1);*/ + let limitPenalty = Math.max(0, Math.min(1, limitProgress) * data.limitChance, data.extraLimPenalty); + + if (data.extraLim > data.escapeChance) { + // Find the intercept + maxPossible = Math.min(data.extraLimThreshold, maxPossible); + } + + + // Prevent struggling past this + if (maxPossible < 1) maxLimit = maxPossible; + + if (data.extraLimPenalty > 0 && data.extraLimPenalty > limitPenalty) { + data.escapeChance -= data.extraLimPenalty; + if (data.escapeChance <= 0) { + // Replace with frustrated moan later~ + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint)[data.struggleType]) ? KDGetEscapeSFX(restraint)[data.struggleType] : "Struggle") + + ".ogg"); + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeon" + StruggleType + "Limit") + .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff5277", 2, true); + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: restraint, + group: struggleGroup, + struggleType: StruggleType, + result: "LimitExtra", + }); + return "LimitExtra"; + } + } else if (limitPenalty > 0) { + data.escapeChance -= limitPenalty; + if (data.escapeChance <= 0) { + // Replace with frustrated moan later~ + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint)[data.struggleType]) ? KDGetEscapeSFX(restraint)[data.struggleType] : "Struggle") + + ".ogg"); + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeon" + StruggleType + "Limit") + .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff5277", 2, true); + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: restraint, + group: struggleGroup, + struggleType: StruggleType, + result: "Limit", + }); + return "Limit"; + } + } + } + + + if (data.escapeChance <= 0) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint)[data.struggleType]) ? KDGetEscapeSFX(restraint)[data.struggleType] : "Struggle") + + ".ogg"); + // Replace with frustrated moan later~ + KinkyDungeonSendActionMessage(10, TextGet("KinkyDungeon" + StruggleType + "Barely") + .replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff5277", 2, true); + KinkyDungeonLastAction = "Struggle"; + KinkyDungeonSendEvent("struggle", { + restraint: restraint, + group: struggleGroup, + struggleType: StruggleType, + result: "Barely", + }); + return "Barely"; + } + + + // Pass block + let progress = restraint.cutProgress ? restraint.cutProgress : 0; + data.struggleTime *= KinkyDungeonStatsChoice.get("FranticStruggle") ? 1 : Math.max(1, KDStruggleTime - KinkyDungeonGetBuffedStat(KinkyDungeonPlayerEntity, "FastStruggle")); + if (KinkyDungeonStatsChoice.get("FranticStruggle")) data.cost *= 1.5; + + if (((StruggleType == "Cut" && progress >= 1 - data.escapeChance) + || (StruggleType == "Pick" && restraint.pickProgress >= 1 - data.escapeChance) + || (StruggleType == "Unlock" && restraint.unlockProgress >= 1 - data.escapeChance) + || (StruggleType == "Remove" && progress >= 1 - data.escapeChance) + || (progress >= 1 - data.escapeChance)) + && !(StruggleType == "Pick" && data.lockType && !data.lockType.canPick(data))) { + Pass = "Success"; + if (StruggleType == "Unlock") { + KinkyDungeonRemoveKeysUnlock(restraint.lock); + KinkyDungeonLock(restraint, ""); + } else + KDSuccessRemove(StruggleType, restraint, data.lockType, index, data, host); + } else { + // Failure block for the different failure types + if (StruggleType == "Cut") { + if (((data.handsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound) || (data.armsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound)) && KinkyDungeonWeaponCanCut(false) && KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.name) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).KnifeDrop) ? KDGetEscapeSFX(restraint).KnifeDrop : "Miss") + + ".ogg"); + Pass = "Drop"; + KinkyDungeonDisarm(KinkyDungeonPlayerEntity, "Cut"); + } else { + if (KDItemIsMagic(restraint) && !data.canCutMagic) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).NoMagic) ? KDGetEscapeSFX(restraint).NoMagic : "SoftShield") + + ".ogg"); + Pass = "Fail"; + } else { + if (KDSoundEnabled()) { + if (KDItemIsMagic(restraint)) + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).MagicCut) ? KDGetEscapeSFX(restraint).MagicCut : "Cut") + + ".ogg"); + else AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).Cut) ? KDGetEscapeSFX(restraint).Cut : "Cut") + + ".ogg"); + } + let mult = 1.0 - 0.9 * Math.min(1.0, progress); + if (KinkyDungeonStatsChoice.get("Flexible")) mult *= KDFlexibleSpeedBonus; + if (KinkyDungeonStatsChoice.get("Inflexible")) mult *= KDInflexibleSpeedBonus; + // Speed = minimum for cutting + let speed = data.cutSpeed * mult + Math.max(0, data.escapeChance) * 0.5; + mult *= 0.75 + 0.25 * (KinkyDungeonStatWill / KinkyDungeonStatWillMax); + KDAddDelayedStruggle( + data.escapeSpeed * speed * (0.3 + 0.2 * KDRandom() + 0.6 * Math.max(0, (KinkyDungeonStatStamina)/KinkyDungeonStatStaminaMax)), + data.struggleTime, StruggleType, struggleGroup, index, data, + restraint.cutProgress, maxLimit + ); + if (speed > 0) { + let debris = ""; + let debrisFlag = KDRestraint(restraint).Group + "deb"; + if (!KinkyDungeonFlags.get(debrisFlag)) { + if (KDRestraint(restraint)?.debris && KDRandom() < KDRestraint(restraint)?.debrisChance ? KDRestraint(restraint)?.debrisChance : 1.0) debris = KDRestraint(restraint)?.debris; + } + + if (debris) { + KinkyDungeonSetFlag(debrisFlag, 4); + KDCreateDebris(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, { + aoe: 1.5, + dist: 0.5, + kind: debris, + number: 1, + }); + } + } + } + } + } else if (StruggleType == "Pick") { + if (data.lockType && data.lockType.breakChance(data)) { // Chance to break pick + Pass = "Break"; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).PickBreak) ? KDGetEscapeSFX(restraint).PickBreak : "PickBreak") + + ".ogg"); + KDAddConsumable("Pick", -1); + KinkyDungeonPickBreakProgress = 0; + } else if (!KinkyDungeonStatsChoice.get("Psychic") && (data.handsBound || (data.armsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound))) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).PickDrop) ? KDGetEscapeSFX(restraint).PickDrop : "Miss") + + ".ogg"); + Pass = "Drop"; + KinkyDungeonDropItem({name: "Pick"}, KinkyDungeonPlayerEntity, true); + KDAddConsumable("Pick", -1); + } else { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).Pick) ? KDGetEscapeSFX(restraint).Pick : "Pick") + + ".ogg"); + if (!restraint.pickProgress) restraint.pickProgress = 0; + let mult = 0.5 + 0.6 * (progress); + if (data.lockType?.pick_speed) mult /= data.lockType.pick_speed; + if (KinkyDungeonStatsChoice.get("Locksmith")) mult *= KDLocksmithSpeedBonus; + if (KinkyDungeonStatsChoice.get("Clueless")) mult *= KDCluelessSpeedBonus; + mult *= 0.5 + 0.5 * (KinkyDungeonStatWill / KinkyDungeonStatWillMax); + KDAddDelayedStruggle( + data.escapeSpeed * mult * (data.escapeChance > 0 ? (KDMinPickRate * (data.escapeChance > 0.5 ? 2 : 1)) : 0) * (0.8 + 0.4 * KDRandom() - 0.4 * Math.max(0, (KinkyDungeonStatDistraction)/KinkyDungeonStatDistractionMax)), + data.struggleTime, StruggleType, struggleGroup, index, data, + restraint.pickProgress, maxLimit + ); + } + } else if (StruggleType == "Unlock") { + if (!KinkyDungeonStatsChoice.get("Psychic") && (data.handsBound || (data.armsBound && KDRandom() < KinkyDungeonItemDropChanceArmsBound))) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).KeyDrop) ? KDGetEscapeSFX(restraint).KeyDrop : "Miss") + + ".ogg"); + Pass = "Drop"; + let keytype = KinkyDungeonGetKey(restraint.lock); + if (keytype) { + //KinkyDungeonDropItem({name: keytype+"Key"}, KinkyDungeonPlayerEntity, true); + KinkyDungeonRemoveKeysDropped(restraint.lock, keytype); + } + } else { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).Pick) ? KDGetEscapeSFX(restraint).Pick : "Pick") + + ".ogg"); + let mult = 0.2 + 1.8 * (progress); + if (KinkyDungeonStatsChoice.get("Flexible")) mult *= KDFlexibleSpeedBonus; + if (KinkyDungeonStatsChoice.get("Inflexible")) mult *= KDInflexibleSpeedBonus; + if (KinkyDungeonStatsChoice.get("Locksmith")) mult *= KDLocksmithSpeedBonus; + mult *= 0.5 + 0.5 * (KinkyDungeonStatWill / KinkyDungeonStatWillMax); + KDAddDelayedStruggle( + data.escapeSpeed * mult * Math.max(data.escapeChance > 0 ? data.minSpeed : 0, data.escapeChance) * (0.8 + 0.4 * KDRandom() - 0.4 * Math.max(0, (KinkyDungeonStatDistraction)/KinkyDungeonStatDistractionMax)), + data.struggleTime, StruggleType, struggleGroup, index, data, + restraint.unlockProgress, maxLimit + ); + } + } else if (StruggleType == "Remove") { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).Remove) ? KDGetEscapeSFX(restraint).Remove : "Struggle") + + ".ogg"); + let mult = 0.3 + 1.7 * (progress * progress); + if (KinkyDungeonStatsChoice.get("Flexible")) mult *= KDFlexibleSpeedBonus; + if (KinkyDungeonStatsChoice.get("Inflexible")) mult *= KDInflexibleSpeedBonus; + mult *= 0.75 + 0.25 * (KinkyDungeonStatWill / KinkyDungeonStatWillMax); + KDAddDelayedStruggle( + data.escapeSpeed * mult * Math.max(data.escapeChance > 0 ? data.minSpeed : 0, data.escapeChance) * (0.8 + 0.4 * KDRandom() - 0.3 * Math.max(0, (KinkyDungeonStatDistraction)/KinkyDungeonStatDistractionMax)), + data.struggleTime, StruggleType, struggleGroup, index, data, + restraint.struggleProgress, maxLimit + ); + } else if (StruggleType == "Struggle") { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).Struggle) ? KDGetEscapeSFX(restraint).Struggle : "Struggle") + + ".ogg"); + let mult = 1.25 - 0.75 * (progress); + if (KinkyDungeonStatsChoice.get("Flexible")) mult *= KDFlexibleSpeedBonus; + if (KinkyDungeonStatsChoice.get("Inflexible")) mult *= KDInflexibleSpeedBonus; + mult *= 0.5 + 0.5 * (KinkyDungeonStatWill / KinkyDungeonStatWillMax); + KDAddDelayedStruggle( + data.escapeSpeed * mult * Math.max(data.escapeChance > 0 ? data.minSpeed : 0, data.escapeChance) * (0.5 + 0.4 * KDRandom() + 0.3 * Math.max(0, (KinkyDungeonStatStamina)/KinkyDungeonStatStaminaMax)), + data.struggleTime, StruggleType, struggleGroup, index, data, + KDRestraint(restraint)?.struggleBreak ? restraint.cutProgress : restraint.struggleProgress, maxLimit + ); + } + } + } + + // Aftermath + let suff = ""; + if (Pass == "Fail" && data.escapeChance > 0 && data.origEscapeChance <= 0) { + if ((KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && data.helpChance) suff = "3"; + else suff = "2"; + } else if (Pass == "Fail") { + if (suff == "" && failSuffix) suff = failSuffix; + } + if ((suff == "" || (Pass == "Fail" && suff == failSuffix)) && (Pass == "Fail" || Pass == "Success") && KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) suff = suff + "Aroused"; + + if (Pass != "Success") + KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonStruggle" + StruggleType + Pass + suff).replace("TargetRestraint", TextGet("Restraint" + KDRestraint(restraint).name)), (Pass == "Success") ? "lightgreen" : "#ff5277", 2); + + if (KinkyDungeonHasStamina(-data.cost)) { + KDChangeStamina(data.struggleGroup, data.struggleType, "struggle", data.cost, true, 1); + KDChangeWill(data.struggleGroup, data.struggleType, "struggle", data.wcost); + if (KinkyDungeonStatsChoice.get("BondageLover")) + KDChangeDistraction("BondageLover", "perk", "struggle", KDBondageLoverAmount, false, 0.1); + + if (Pass != "Success") { + // Reduce the progress + if (StruggleType == "Struggle") { + restraint.pickProgress = Math.max(0, restraint.pickProgress * 0.5 - 0.01); + restraint.unlockProgress = Math.max(0, restraint.unlockProgress * 0.5 - 0.01); + } else if (StruggleType == "Pick") { + restraint.unlockProgress = Math.max(0, restraint.unlockProgress * 0.5 - 0.01); + } else if (StruggleType == "Unlock") { + restraint.pickProgress = Math.max(0, restraint.pickProgress* 0.5 - 0.01); + } if (StruggleType == "Remove") { + restraint.pickProgress = Math.max(0, restraint.pickProgress* 0.5 - 0.01); + restraint.unlockProgress = Math.max(0, restraint.unlockProgress * 0.5 - 0.01); + } + + } else if (KinkyDungeonGoddessRep.Ghost < 0 && (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp())) + KinkyDungeonChangeRep("Ghost", 1); + + + KinkyDungeonSendEvent("struggle", { + restraint: restraint, + group: struggleGroup, + struggleType: StruggleType, + result: Pass, + }); + KinkyDungeonLastAction = "Struggle"; + if (data.noise) { + KinkyDungeonMakeNoise(data.noise, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); + } + } + + KinkyDungeonAdvanceTime(1); + if (Pass == "Success") KinkyDungeonCurrentEscapingItem = null; + return Pass; + } + KinkyDungeonSetFlag("escapeimpossible", 2); + KinkyDungeonSetFlag("embarrassed", 8); + return "Impossible"; + } else { + return result || ((data.escapeChance - Math.max(0, data.limitChance, data.extraLim) > 0) ? "Success" : "Impossible"); + } + +} + +/** + * "Return the first restraint item in the game that belongs to the given group." + * @param group - The group of the restraint item you want to get. + * @param [index] - The index of the restraint item you want to get. + * @returns The item that matches the group. + */ +function KinkyDungeonGetRestraintItem(group: string, index?: number): item { + for (let item of KinkyDungeonAllRestraint()) { + if (item.type == Restraint && KDRestraint(item).Group == group) { + if (index) { + let link = item; + let count = 0; + while (count < index && link) { + count += 1; + link = link.dynamicLink; + } + if (count == index) return link; + return null; + } + return item; + } + } + return null; +} + +/** + * Refreshes the restraints map + */ +function KinkyDungeonRefreshRestraintsCache() { + KinkyDungeonRestraintsCache = new Map(); + for (let r of KinkyDungeonRestraints) { + KinkyDungeonRestraintsCache.set(r.name, r); + } +} + + +/** + * @param Name + */ +function KinkyDungeonGetRestraintByName(Name: string): restraint { + if (KinkyDungeonRestraintsCache.size > 0) { + // Nothing + } else { + KinkyDungeonRefreshRestraintsCache(); + } + if (KinkyDungeonRestraintVariants[Name]) Name = KinkyDungeonRestraintVariants[Name].template; + + return KinkyDungeonRestraintsCache.get(Name); +} + +/** + * @param Lock + * @param [item] - Factoring in curse + * @param [curse] - Curse to add + * @param [restraint] - restraint to add, checks to make sure its lockable + */ +function KinkyDungeonGetLockMult(Lock: string, item?: item, curse?: string, restraint?: restraint): number { + if (restraint && !KinkyDungeonIsLockable(restraint)) return 1; + let mult = 1; + if (Lock && KDLocks[Lock]) mult = KDLocks[Lock].lockmult; + if (item && KDGetCurse(item)) mult = KDCurseMult(KDGetCurse(item)); + if (curse) mult = KDCurseMult(curse); + + return mult; +} + +let KDHeavyRestraintPrefs = [ + "More_Armbinders", + "More_Boxbinders", + "More_Jackets", + "More_Yokes", + "Less_Armbinders", + "Less_Boxbinders", + "Less_Jackets", + "Less_Yokes", +]; + + +/** Tags which the 'agnostic' option on KinkyDungeonGetRestraint does not override */ +let KDNoOverrideTags = [ + "NoVibes", + "Unmasked", + "NoSenseDep", + "NoHood", + "FreeBoob", + "Unchained", + "Damsel", + "NoPet", + "NoKigu", + "NoBlindfolds", + "arousalMode", + "arousalModePlug", + "arousalModePlugNoFront", + "arousalModePiercing", + ...KDHeavyRestraintPrefs, +]; + +type eligibleRestraintOptions = { + dontAugmentWeight?: boolean; + ApplyVariants?: boolean; + dontPreferVariant?: boolean; + allowLowPower?: boolean; + ForceDeep?: boolean; + /** Only use with KDGetRestraintWithVariants */ + extraOptions?: string[]; + inventoryWeight?: number; + /** For optimization purposes */ + QuitOnFirst?: boolean; +} + +/** + * Not to be confused with EligibleRestraintEntry + */ +type eligibleRestraintItem = { + restraint: restraint; + variant?: ApplyVariant; + weight: number; + inventoryVariant?: string, +} + +/** + * @param enemy + * @param Level + * @param Index + * @param Bypass + * @param Lock + * @param [RequireWill] + * @param [LeashingOnly] + * @param [NoStack] + * @param [extraTags] + * @param [agnostic] - Determines if playertags and current bondage are ignored + * @param [filter] - Filters for items + * @param [securityEnemy] - Bypass is treated separately for these groups + * @param [curse] - Going to add this curse + * @param [filterEps] - Anything under this is filtered unless nothing is above it + * @param [minWeightFallback] + * @param [useAugmented] - useAugmented + * @param [augmentedInventory] + * @param [options] + * @param [options.dontAugmentWeight] + * @param [options.ApplyVariants] + * @param [options.dontPreferVariant] + * @param [options.allowLowPower] + * @param [options.ForceDeep] + * @param [options.QuitOnFirst] For optimization purposes + */ +function KDGetRestraintsEligible ( + enemy: KDHasTags, + Level: number, + Index: string, + Bypass: boolean, + Lock: string, + RequireWill?: boolean, + LeashingOnly?: boolean, + NoStack?: boolean, + extraTags?: Record, + agnostic?: boolean, + filter?: {filterGroups?: string[], minPower?: number, maxPower?: number, onlyLimited?: boolean, noUnlimited?: boolean, noLimited?: boolean, onlyUnlimited?: boolean, ignore?: string[], require?: string[], looseLimit?: boolean, ignoreTags?: string[], allowedGroups?: string[], currentWill?: number}, + securityEnemy?: entity, + curse?: string, + filterEps: number = 0.9, + minWeightFallback: boolean = true, + useAugmented: boolean = false, + augmentedInventory: string[] = undefined, + options?: eligibleRestraintOptions +): eligibleRestraintItem[] +{ + let RestraintsList: eligibleRestraintItem[] = []; + let effLevel = Level; + if (KinkyDungeonStatsChoice.has("TightRestraints")) { + effLevel *= KDTightRestraintsMult; + effLevel += KDTightRestraintsMod; + } + + if (KinkyDungeonStatsChoice.has("NoWayOut")) RequireWill = false; + let willPercent = (KinkyDungeonStatWill / KinkyDungeonStatWillMax - 0.15 * KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax) + /(1 + (KinkyDungeonGoddessRep.Ghost + 50)/100); + + if (KinkyDungeonSlowLevel > 0) willPercent = willPercent * (0.6 + 0.4 * Math.min(1, Math.max(0, 1 - KinkyDungeonSlowLevel/3))); + + let tags = new Map(); + if (enemy.tags.length) { + for (let t of enemy.tags) { + tags.set(t, true); + } + } else { + for (let t of Object.keys(enemy.tags)) { + tags.set(t, true); + } + } + if (extraTags) + for (let t of Object.entries(extraTags)) { + if (effLevel >= +t[1]) + tags.set(t[0], true); + } + + if (filter?.ignoreTags) { + for (let ft of filter.ignoreTags) { + tags.delete(ft); + } + } + + let arousalMode = KinkyDungeonStatsChoice.get("arousalMode"); + let cache: { r : restraint; w : number, inventory?: boolean, name?: string}[] = []; + for (let restraint of KinkyDungeonRestraints) { + + if (( + effLevel >= restraint.minLevel + || KinkyDungeonNewGame > 0 + || (restraint.ignoreMinLevelTags?.some((t) => {return tags.get(t);})) + || filter?.require?.includes(restraint.name) + ) && ( + !restraint.maxLevel + || effLevel < restraint.maxLevel + || (restraint.ignoreMaxLevelTags?.some((t) => {return tags.get(t);})) + ) && ( + restraint.allFloors + || restraint.floors[Index] + || (restraint.ignoreFloorTags?.some((t) => {return tags.get(t);})) + + )) { + if (!restraint.arousalMode || arousalMode) { + if (filter?.filterGroups?.some((fg) => { + return fg == restraint.Group; + })) { + // nope + } else { + let enabled = false; + let weight = restraint.weight; + for (let t of tags.keys()) { + if (restraint.enemyTags[t] != undefined) { + weight += restraint.enemyTags[t]; + enabled = true; + } + } + + if (restraint.enemyTagsMult) + for (let t of tags.keys()) { + if (restraint.enemyTagsMult[t] != undefined) { + weight *= restraint.enemyTagsMult[t]; + } + } + if (enabled) { + cache.push({r: restraint, w:weight}); + } + } + + } + } + } + + if (options?.extraOptions) { + for (let opt of options.extraOptions) { + if (KDRestraint({name: opt})) + cache.push({r: KDRestraint({name: opt}), w:options?.inventoryWeight || 100, name: opt, inventory: true}) + } + } + + let add = false; + let addedVar = false; + for (let r of cache) { + let restraint = r.r; + if (filter && !r.inventory) { + if (filter.currentWill != undefined && r.r.maxwill != undefined && filter.currentWill > r.r.maxwill) continue; + if (filter.allowedGroups && !filter.allowedGroups.includes(r.r.Group)) continue; + if (filter.maxPower && r.r.power > filter.maxPower && (!filter.looseLimit || !r.r.unlimited)) continue; + if (filter.minPower && r.r.power < filter.minPower && (!filter.looseLimit || !r.r.limited) && !r.r.unlimited) continue; + if (filter.onlyUnlimited && r.r.limited) continue; + if (filter.noUnlimited && r.r.unlimited) continue; + if (filter.noLimited && r.r.limited) continue; + if (filter.onlyLimited && !r.r.limited && !r.r.unlimited) continue; + if (filter.ignore && filter.ignore.includes(r.r.name)) continue; + if (filter.require && !filter.require.includes(r.r.name)) continue; + } + if ((!LeashingOnly || (restraint.Group == "ItemNeck" || restraint.Group == "ItemNeckRestraints")) + && (!RequireWill || !restraint.maxwill || willPercent <= restraint.maxwill || (LeashingOnly && (restraint.Group == "ItemNeck" || restraint.Group == "ItemNeckRestraints")))) { + + add = false; + addedVar = false; + if (agnostic || KDCanAddRestraint(restraint, Bypass, Lock, NoStack, undefined, options?.ForceDeep || KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, securityEnemy, useAugmented, curse, augmentedInventory)) { + if (restraint.playerTags) + for (let tag in restraint.playerTags) + if ((!agnostic || KDNoOverrideTags.includes(tag)) && KinkyDungeonPlayerTags.get(tag)) r.w += restraint.playerTags[tag]; + if (restraint.playerTagsMult) + for (let tag in restraint.playerTagsMult) + if ((!agnostic || KDNoOverrideTags.includes(tag)) && KinkyDungeonPlayerTags.get(tag)) r.w *= restraint.playerTagsMult[tag]; + if (restraint.playerTagsMissing) + for (let tag in restraint.playerTagsMissing) + if ((!agnostic || KDNoOverrideTags.includes(tag)) && !KinkyDungeonPlayerTags.get(tag)) r.w += restraint.playerTagsMissing[tag]; + if (restraint.playerTagsMissingMult) + for (let tag in restraint.playerTagsMissingMult) + if ((!agnostic || KDNoOverrideTags.includes(tag)) && !KinkyDungeonPlayerTags.get(tag)) r.w *= restraint.playerTagsMissingMult[tag]; + + + if (!(options?.dontAugmentWeight === false)) { + let mult = KDRestraintPowerMult(KinkyDungeonPlayerEntity, restraint, augmentedInventory); + if (Math.sign(mult) != Math.sign(r.w)) mult = 1; + r.w *= mult; + } + + if (r.w > 0 && (r.w > filterEps)) { + add = true; + } + } + + if (options?.ApplyVariants && restraint.ApplyVariants && !r.inventory) { + for (let variant of Object.entries(restraint.ApplyVariants)) { + if (Level >= KDApplyVariants[variant[0]].minfloor && !(Level >= KDApplyVariants[variant[0]].maxfloor) + && (!variant[1].enemyTags || Object.keys(variant[1].enemyTags).some((tag) => {return tags.get(tag) != undefined;})) + && (agnostic || KDCanAddRestraint(restraint, Bypass, Lock, NoStack, undefined, KinkyDungeonStatsChoice.has("MagicHands") ? true : undefined, undefined, securityEnemy, useAugmented, curse, augmentedInventory, + KDApplyVariants[variant[0]].powerBonus))) { + + let w = r.w * (variant[1].weightMult || 1) + (variant[1].weightMod || 0); + + if (variant[1].enemyTags) + for (let tag in variant[1].enemyTags) + if (tags.get(tag)) w += variant[1].enemyTags[tag]; + + if (variant[1].enemyTagsMult) + for (let tag in variant[1].enemyTagsMult) + if (tags.get(tag)) w *= variant[1].enemyTagsMult[tag]; + + if (variant[1].playerTags) + for (let tag in variant[1].playerTags) + if ((!agnostic || KDNoOverrideTags.includes(tag)) && KinkyDungeonPlayerTags.get(tag)) w += variant[1].playerTags[tag]; + if (variant[1].playerTagsMult) + for (let tag in variant[1].playerTagsMult) + if ((!agnostic || KDNoOverrideTags.includes(tag)) && KinkyDungeonPlayerTags.get(tag)) w *= variant[1].playerTagsMult[tag]; + if (variant[1].playerTagsMissing) + for (let tag in variant[1].playerTagsMissing) + if ((!agnostic || KDNoOverrideTags.includes(tag)) && !KinkyDungeonPlayerTags.get(tag)) w += variant[1].playerTagsMissing[tag]; + if (variant[1].playerTagsMissingMult) + for (let tag in variant[1].playerTagsMissingMult) + if ((!agnostic || KDNoOverrideTags.includes(tag)) && !KinkyDungeonPlayerTags.get(tag)) w *= variant[1].playerTagsMissingMult[tag]; + + if (r.w > 0 && (r.w > filterEps)) { + addedVar = true; + RestraintsList.push({ + restraint: restraint, + variant: KDApplyVariants[variant[0]], + weight: w, + }); + if (options?.QuitOnFirst) return RestraintsList; + } + } + } + } + + if (add && (!addedVar || options?.dontPreferVariant)) { + RestraintsList.push({ + restraint: restraint, + weight: r.w, + inventoryVariant: (r.name && KinkyDungeonRestraintVariants[r.name]) ? r.name : undefined, + }); + if (options?.QuitOnFirst) return RestraintsList; + } + } + } + + let RestraintsList2: eligibleRestraintItem[] = []; + if (!options?.allowLowPower) { + // Only does strictest for that group + let groupPower: Record = {}; + for (let r of RestraintsList) { + if (!groupPower[r.restraint.Group] || r.restraint.power >= groupPower[r.restraint.Group][0].restraint.power) { + if (!groupPower[r.restraint.Group]) groupPower[r.restraint.Group] = [r]; + else { + if (r.restraint.power > groupPower[r.restraint.Group][0].restraint.power) groupPower[r.restraint.Group] = [r]; + else groupPower[r.restraint.Group].push(r); + } + } + } + for (let value of Object.values(groupPower)) { + RestraintsList2.push(...value); + } + } + + + if (minWeightFallback && RestraintsList.length == 0) { + return KDGetRestraintsEligible( + enemy, Level, Index, Bypass, Lock, RequireWill, LeashingOnly, NoStack, + extraTags, agnostic, filter, securityEnemy, curse, (filterEps || 0.05) > 0.1 ? filterEps * 0.1 : 0, filterEps > 0.1, useAugmented, augmentedInventory, options); + } + if (!options?.allowLowPower){ + return RestraintsList2; + } + else return RestraintsList; +} + +/** + * @param enemy + * @param Level + * @param Index + * @param [Bypass] + * @param [Lock] + * @param [RequireWill] + * @param [LeashingOnly] + * @param [NoStack] + * @param [extraTags] + * @param [agnostic] - Determines if playertags and current bondage are ignored + * @param [filter] - Filters for items + * @param [securityEnemy] - Bypass is treated separately for these groups + * @param [curse] - Planning to add this curse + * @param [useAugmented] - useAugmented + * @param [augmentedInventory] - + * @param [options] + * @param [options.dontAugmentWeight] + * @param [options.ApplyVariants] + * @param [options.dontPreferVariant] + * @param [options.allowLowPower] + * @param [options.ForceDeep] + */ +function KinkyDungeonGetRestraint ( + enemy: KDHasTags, + Level: number, + Index: string, + Bypass?: boolean, + Lock?: string, + RequireWill?: boolean, + LeashingOnly?: boolean, + NoStack?: boolean, + extraTags?: Record, + agnostic?: boolean, + filter?: {filterGroups?: string[], minPower?: number, maxPower?: number, onlyLimited?: boolean, noUnlimited?: boolean, noLimited?: boolean, onlyUnlimited?: boolean, ignore?: string[], require?: string[], looseLimit?: boolean, ignoreTags?: string[], allowedGroups?: string[], currentWill?: number}, + securityEnemy?: entity, + curse?: string, + useAugmented?: boolean, + augmentedInventory?: string[], + options?: eligibleRestraintOptions +) +{ + let restraintWeightTotal = 0; + let restraintWeights = []; + + let Restraints = KDGetRestraintsEligible(enemy, Level, Index, Bypass, Lock, RequireWill, LeashingOnly, NoStack, extraTags, agnostic, filter, securityEnemy, curse, undefined, undefined, useAugmented, augmentedInventory, options); + + for (let rest of Restraints) { + let restraint = rest.restraint; + let weight = rest.weight; + restraintWeights.push({restraint: restraint, weight: restraintWeightTotal, inventoryVariant: rest.inventoryVariant}); + weight += rest.weight; + restraintWeightTotal += Math.max(0, weight); + } + + let selection = KDRandom() * restraintWeightTotal; + + for (let L = restraintWeights.length - 1; L >= 0; L--) { + if (selection > restraintWeights[L].weight) { + return restraintWeights[L].restraint; + } + } +} + +/** + * @param enemy + * @param Level + * @param Index + * @param Bypass + * @param Lock + * @param RequireWill + * @param [LeashingOnly] + * @param [NoStack] + * @param [extraTags] + * @param [agnostic] - Determines if playertags and current bondage are ignored + * @param [filter] - Filters for items + * @param [securityEnemy] - Bypass is treated separately for these groups + * @param [curse] - Planning to add this curse + * @param [useAugmented] - useAugmented + * @param [augmentedInventory] - + * @param [options] + * @param [options.dontAugmentWeight] + * @param [options.ApplyVariants] + * @param [options.dontPreferVariant] + * @param [options.allowLowPower] + * @param [options.ForceDeep] + * @param [options.extraOptions] + * @returns {{r: restraint, v: ApplyVariant}} + */ +function KDGetRestraintWithVariants ( + enemy: KDHasTags, + Level: number, + Index: string, + Bypass: boolean, + Lock: string, + RequireWill: boolean, + LeashingOnly?: boolean, + NoStack?: boolean, + extraTags?: Record, + agnostic?: boolean, + filter?: {filterGroups?: string[], minPower?: number, maxPower?: number, onlyLimited?: boolean, noUnlimited?: boolean, noLimited?: boolean, onlyUnlimited?: boolean, ignore?: string[], require?: string[], looseLimit?: boolean, ignoreTags?: string[], allowedGroups?: string[]}, + securityEnemy?: entity, + curse?: string, + useAugmented?: boolean, + augmentedInventory?: string[], + options?: eligibleRestraintOptions +): {r: restraint, v: ApplyVariant, iv: string} +{ + let restraintWeightTotal = 0; + let restraintWeights = []; + + if (!options) options = {ApplyVariants: true,}; + else options.ApplyVariants = true; + let Restraints = KDGetRestraintsEligible(enemy, Level, Index, Bypass, Lock, RequireWill, LeashingOnly, NoStack, extraTags, agnostic, filter, securityEnemy, curse, undefined, undefined, useAugmented, augmentedInventory, options); + + for (let rest of Restraints) { + let restraint = rest.restraint; + let weight = rest.weight; + restraintWeights.push({restraint: restraint, variant: rest.variant, weight: restraintWeightTotal, inventoryVariant: rest.inventoryVariant}); + weight += rest.weight; + restraintWeightTotal += Math.max(0, weight); + } + + let selection = KDRandom() * restraintWeightTotal; + + for (let L = restraintWeights.length - 1; L >= 0; L--) { + if (selection > restraintWeights[L].weight) { + return {r: restraintWeights[L].restraint, v: restraintWeights[L].variant, iv: restraintWeights[L].inventoryVariant}; + } + } +} + +function KinkyDungeonUpdateRestraints(C?: Character, id?: number, _delta?: number, customRestraints?: item[], extraTags?: string[]) { + if (!C && !id) C = KinkyDungeonPlayer; + if (C == KinkyDungeonPlayer && !customRestraints) { + let playerTags = new Map(); + for (let inv of KinkyDungeonAllRestraintDynamic()) { + if (inv.item.inventoryVariant) { + if (!KDGameData.IdentifiedObj) KDGameData.IdentifiedObj = {}; + KDGameData.IdentifiedObj[inv.item.inventoryVariant] = 2; + } + let group = KDRestraint(inv.item).Group; + if (group) { + if (KDGroupBlocked(group)) playerTags.set(group + "Blocked", true); + playerTags.set(group + "Full", true); + playerTags.set(inv.item.name + "Worn", true); + } + } + for (let sg of KinkyDungeonStruggleGroupsBase) { + let group = sg; + if (!KinkyDungeonGetRestraintItem(group)) playerTags.set(group + "Empty", true); + } + let outfit = KDOutfit({name: KinkyDungeonCurrentDress}); + for (let inv2 of KinkyDungeonAllRestraintDynamic()) { + let inv = inv2.item; + playerTags.set("Item_"+inv.name, true); + + if ((!inv.faction || KDToggles.ForcePalette || outfit?.palette || KinkyDungeonPlayer.Palette) + && (KDToggles.ApplyPaletteRestraint && (outfit?.palette || KinkyDungeonPlayer.Palette || !KDDefaultPalette || KinkyDungeonFactionFilters[KDDefaultPalette]))) { + inv.faction = (KDToggles.NoOutfitPalette ? undefined : outfit?.palette) + || KinkyDungeonPlayer.Palette || KDDefaultPalette; + } + + if (KDRestraint(inv).Link) + playerTags.set("LinkTo_"+KDRestraint(inv).Link, true); + if (KDRestraint(inv).UnLink) + playerTags.set("UnLinkTo_"+KDRestraint(inv).UnLink, true); + if (KDRestraint(inv).addTag) + for (let tag of KDRestraint(inv).addTag) { + if (!playerTags.get(tag)) playerTags.set(tag, true); + } + if (KDRestraint(inv).chastity) + playerTags.set("ChastityLower", true); + if (KDRestraint(inv).chastitybra) + playerTags.set("ChastityUpper", true); + if (KDRestraint(inv).hobble) + playerTags.set("Hobble", true); + if (KDRestraint(inv).blockfeet) + playerTags.set("BoundFeet", true); + if (KDRestraint(inv).bindarms) + playerTags.set("BoundArms", true); + if (KDRestraint(inv).gag) + playerTags.set("Gagged", true); + if (KDRestraint(inv).bindhands) + playerTags.set("BoundHands", true); + if (KDRestraint(inv).blindfold) + playerTags.set("Blindfolded", true); + if (KDRestraint(inv).shrine) { + for (let tag of KDRestraint(inv).shrine) { + if (!playerTags.get(tag)) playerTags.set(tag, true); + } + // The following is redundant + /*let link = inv.dynamicLink; + while (link) { + for (let tag of KDRestraint(link).shrine) { + if (!playerTags.get(tag)) playerTags.set(tag, true); + } + link = link.dynamicLink; + }*/ + } + + } + + for (let t of KDHeavyRestraintPrefs) { + if (KinkyDungeonStatsChoice.get(t)) playerTags.set(t, true); + } + if (KinkyDungeonStatsChoice.get("Deprived")) playerTags.set("NoVibes", true); + if (KinkyDungeonStatsChoice.get("Unmasked")) playerTags.set("Unmasked", true); + if (KinkyDungeonStatsChoice.get("NoSenseDep")) playerTags.set("NoSenseDep", true); + if (KinkyDungeonStatsChoice.get("NoHood")) playerTags.set("NoHood", true); + if (KinkyDungeonStatsChoice.get("FreeBoob2")) playerTags.set("FreeBoob", true); + if (KinkyDungeonStatsChoice.get("FreeBoob1") && !KinkyDungeonPlayerTags.get("ItemNipples")) playerTags.set("FreeBoob", true); + if (KinkyDungeonStatsChoice.get("NoKigu")) playerTags.set("NoKigu", true); + if (KinkyDungeonStatsChoice.get("NoBlindfolds")) playerTags.set("NoBlindfolds", true); + if (KinkyDungeonStatsChoice.get("NoPet")) playerTags.set("NoPet", true); + if (KinkyDungeonStatsChoice.get("Unchained")) playerTags.set("Unchained", true); + if (KinkyDungeonStatsChoice.get("Damsel")) playerTags.set("Damsel", true); + if (KinkyDungeonStatsChoice.get("arousalMode")) playerTags.set("arousalMode", true); + if (KinkyDungeonStatsChoice.get("arousalModePlug")) playerTags.set("arousalModePlug", true); + if (KinkyDungeonStatsChoice.get("arousalModePlugNoFront")) playerTags.set("arousalModePlugNoFront", true); + if (KinkyDungeonStatsChoice.get("arousalModePiercing")) playerTags.set("arousalModePiercing", true); + + let tags = extraTags || []; + KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); + for (let t of tags) { + playerTags.set(t, true); + } + + KinkyDungeonSendEvent("updatePlayerTags", {tags: playerTags, player:KinkyDungeonPlayerEntity}); + return playerTags; + } else if (customRestraints) { + let playerTags = new Map(); + for (let inv of customRestraints) { + let group = KDRestraint(inv)?.Group; + + if (inv.inventoryVariant) { + if (!KDGameData.IdentifiedObj) KDGameData.IdentifiedObj = {}; + KDGameData.IdentifiedObj[inv.inventoryVariant] = KDGameData.IdentifiedObj[inv.inventoryVariant] || 1; + } + if (group) { + if (KDGroupBlocked(group)) playerTags.set(group + "Blocked", true); + playerTags.set(group + "Full", true); + playerTags.set(inv.name + "Worn", true); + } + } + for (let sg of KinkyDungeonStruggleGroupsBase) { + let group = sg; + if (!customRestraints.some((rest) => { + return KDRestraint(rest)?.Group == group; + })) playerTags.set(group + "Empty", true); + } + for (let inv of customRestraints) { + if (!KDRestraint(inv)) continue; + playerTags.set("Item_"+inv.name, true); + + if (KDRestraint(inv).Link) + playerTags.set("LinkTo_"+KDRestraint(inv).Link, true); + if (KDRestraint(inv).UnLink) + playerTags.set("UnLinkTo_"+KDRestraint(inv).UnLink, true); + if (KDRestraint(inv).addTag) + for (let tag of KDRestraint(inv).addTag) { + if (!playerTags.get(tag)) playerTags.set(tag, true); + } + if (KDRestraint(inv).chastity) + playerTags.set("ChastityLower", true); + if (KDRestraint(inv).chastitybra) + playerTags.set("ChastityUpper", true); + if (KDRestraint(inv).hobble) + playerTags.set("Hobble", true); + if (KDRestraint(inv).blockfeet) + playerTags.set("BoundFeet", true); + if (KDRestraint(inv).bindarms) + playerTags.set("BoundArms", true); + if (KDRestraint(inv).gag) + playerTags.set("Gagged", true); + if (KDRestraint(inv).bindhands) + playerTags.set("BoundHands", true); + if (KDRestraint(inv).blindfold) + playerTags.set("Blindfolded", true); + if (KDRestraint(inv).shrine) { + for (let tag of KDRestraint(inv).shrine) { + if (!playerTags.get(tag)) playerTags.set(tag, true); + } + } + + } + if (extraTags) + for (let t of extraTags) { + playerTags.set(t, true); + } + + KinkyDungeonSendEvent("updateCustomTags", {tags: playerTags, npc:id}); + return playerTags; + } else if (KDGameData.NPCRestraints && KDGameData.NPCRestraints[id + ""]) { + + let playerTags = new Map(); + for (let inv of Object.values(KDGameData.NPCRestraints[id + ""])) { + let group = KDRestraint(inv)?.Group; + if (group) { + if (KDGroupBlocked(group)) playerTags.set(group + "Blocked", true); + playerTags.set(group + "Full", true); + playerTags.set(inv.name + "Worn", true); + } + } + for (let sg of KinkyDungeonStruggleGroupsBase) { + let group = sg; + if (!Object.values(KDGameData.NPCRestraints[id + ""]).some((rest) => { + return KDRestraint(rest)?.Group == group; + })) playerTags.set(group + "Empty", true); + } + for (let inv of Object.values(KDGameData.NPCRestraints[id + ""])) { + if (!KDRestraint(inv)) continue; + playerTags.set("Item_"+inv.name, true); + + if (KDRestraint(inv).Link) + playerTags.set("LinkTo_"+KDRestraint(inv).Link, true); + if (KDRestraint(inv).UnLink) + playerTags.set("UnLinkTo_"+KDRestraint(inv).UnLink, true); + if (KDRestraint(inv).addTag) + for (let tag of KDRestraint(inv).addTag) { + if (!playerTags.get(tag)) playerTags.set(tag, true); + } + if (KDRestraint(inv).chastity) + playerTags.set("ChastityLower", true); + if (KDRestraint(inv).chastitybra) + playerTags.set("ChastityUpper", true); + if (KDRestraint(inv).hobble) + playerTags.set("Hobble", true); + if (KDRestraint(inv).blockfeet) + playerTags.set("BoundFeet", true); + if (KDRestraint(inv).bindarms) + playerTags.set("BoundArms", true); + if (KDRestraint(inv).bindhands) + playerTags.set("BoundHands", true); + if (KDRestraint(inv).blindfold) + playerTags.set("Blindfolded", true); + if (KDRestraint(inv).shrine) { + for (let tag of KDRestraint(inv).shrine) { + if (!playerTags.get(tag)) playerTags.set(tag, true); + } + } + + } + + let tags = extraTags || []; + KinkyDungeonAddTags(tags, MiniGameKinkyDungeonLevel); + for (let t of tags) { + playerTags.set(t, true); + } + + KinkyDungeonSendEvent("updateNPCTags", {tags: playerTags, npc:id}); + return playerTags; + } + + return new Map(); + +} + + +function KDGetCursePower(item: item): number { + if (!item || !KDGetCurse(item)) return 0; + return KDCursePower(KDGetCurse(item)); +} + +/** + * @param item + */ +function KDGetVariantPower(item: item): number { + if (item && KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]) { + return KinkyDungeonRestraintVariants[item.inventoryVariant || item.name].power || 0; + } + return 0; +} + +/** + * @param item + * @param [NoLink] + * @param [toLink] + * @param [newLock] - If we are trying to add a new item + * @param [newCurse] - If we are trying to add a new item + */ +function KinkyDungeonRestraintPower(item: item, NoLink?: boolean, toLink?: restraint, newLock?: string, newCurse?: string): number { + if (item && item.type == Restraint) { + let lockMult = item ? KinkyDungeonGetLockMult(item.lock, item) : 1; + let power = KDRestraint(item).power * lockMult + KDGetCursePower(item) + KDGetVariantPower(item); + + if (item.dynamicLink && !NoLink) { + let link = item.dynamicLink; + if (!toLink || !(KinkyDungeonIsLinkable( + { + oldRestraint: KinkyDungeonGetRestraintByName(link.name), + newRestraint: toLink, + item: link, + props: { + newLock: newLock, + newCurse: newCurse, + }, + }) && KDCheckLinkSize(link, toLink, true, false, undefined, undefined, + { + newLock: newLock, + newCurse: newCurse, + }))) { + let lock = link.lock; + let mult = KinkyDungeonGetLockMult(lock, link); + let pp = link ? (KDRestraint({name: link.name}).power) : 0; + power = Math.max(power, pp * mult + KDGetCursePower(link)); + } + } + return power; + } + return 0; +} + +/** + * @param oldRestraint + * @param newRestraint + * @param [item] + * @param [Lock] + * @param [Curse] + * @param [ignoreItem] + * @param [power] + */ +function KinkyDungeonLinkableAndStricter(oldRestraint: restraint, newRestraint: restraint, item?: item, Lock?: string, Curse?: string, ignoreItem?: item, power?: number): boolean { + if (oldRestraint && newRestraint) { + if (!KDIsEligible(newRestraint)) return false; + return KinkyDungeonIsLinkable({oldRestraint: oldRestraint, newRestraint: newRestraint, power: power, item: item, ignoreItem: ignoreItem, props: {newLock: Lock, newCurse: Curse}}); + //} + } + return false; +} + +/** + * Blanket function for stuff needed to select a restraint + * @param {restraint} restraint + */ +function KDIsEligible(restraint: restraint): boolean { + if (restraint.requireSingleTagToEquip && !restraint.requireSingleTagToEquip.some((tag) => {return KinkyDungeonPlayerTags.get(tag);})) return false; + if (restraint.requireAllTagsToEquip && restraint.requireAllTagsToEquip.some((tag) => {return !KinkyDungeonPlayerTags.get(tag);})) return false; + return true; +} + +function KinkyDungeonGenerateRestraintTrap(): string { + let enemy = KinkyDungeonGetEnemy(["chestTrap"], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["chestTrap"]); + if (enemy) return enemy.name; + return "GreedyGhast"; +} + +function KDGetLockVisual(item: item): string { + //if (KinkyDungeonBlindLevel > 0) return `Locks/Blind.png`; + return `Locks/${item.lock}.png`; +} + +/** + * @param restraint + * @param Bypass + * @param Lock + * @param NoStack + * @param [r] + * @param [Deep] - allow linking under + * @param [noOverpower] - not allowed to replace items that currently exist + * @param [securityEnemy] - Bypass is treated separately for these groups + * @param [useAugmentedPower] - Bypass is treated separately for these groups + * @param [curse] - Bypass is treated separately for these groups + * @param [augmentedInventory] + * @param [powerBonus] + */ +function KDCanAddRestraint ( + restraint: restraint, + Bypass: boolean, + Lock: string, + NoStack: boolean, + r?: item, + Deep?: boolean, + noOverpower?: boolean, + securityEnemy?: entity, + useAugmentedPower?: boolean, + curse?: string, + augmentedInventory?: string[], + powerBonus: number = 0 +): boolean +{ + if (!restraint) { + console.log("Warning: Requested restraint was empty!"); + return false; + } + if (!KinkyDungeonIsLockable(restraint)) Lock = ""; + if (!curse && restraint.curse) curse = restraint.curse; + if (restraint.bypass) Bypass = true; + // Limits + if (restraint.shrine && restraint.shrine.includes("Vibes") && KinkyDungeonPlayerTags.get("NoVibes")) return false; + if (restraint.arousalMode && !KinkyDungeonStatsChoice.get("arousalMode")) return false; + if (restraint.Group == "ItemButt" && !KinkyDungeonStatsChoice.get("arousalModePlug")) return false; + if (restraint.Group == "ItemVulva" && restraint.shrine.includes("Plugs") && KinkyDungeonStatsChoice.get("arousalModePlugNoFront")) return false; + if (restraint.requireSingleTagToEquip && !restraint.requireSingleTagToEquip.some((tag) => {return KinkyDungeonPlayerTags.get(tag);})) return false; + if (restraint.requireAllTagsToEquip && restraint.requireAllTagsToEquip.some((tag) => {return !KinkyDungeonPlayerTags.get(tag);})) return false; + //if (restraint.AssetGroup == "ItemNipplesPiercings" && !KinkyDungeonStatsChoice.get("arousalModePiercing")) return false; + + if (restraint.shrine.includes("Raw")) return false; + + function bypasses() { + return ( + ( + !((KinkyDungeonPlayerTags.get("SupremeBra") && (restraint.Group == "ItemNipples" || restraint.Group == "ItemNipplesPiercings")) + || (KinkyDungeonPlayerTags.get("SupremeBelt") && (restraint.Group == "ItemVulva" || restraint.Group == "ItemVulvaPiercings" || restraint.Group == "ItemButt"))) + && (Bypass || restraint.bypass || !KDGroupBlocked(restraint.Group, true)) + ) + || KDEnemyPassesSecurity(restraint.Group, securityEnemy) + ); + } + + /*if (restraint.requireSingleTagToEquip) { + let pass = false; + for (let tag of restraint.requireSingleTagToEquip) { + if (KinkyDungeonPlayerTags.has(tag)) { + pass = true; + break; + } + } + if (!pass) return false; + }*/ + if (!r) r = KinkyDungeonGetRestraintItem(restraint.Group); + // NoLink here because we do it later with augment + let power = (KinkyDungeonRestraintPower(r, true, restraint, Lock, curse) * (r && useAugmentedPower ? Math.max(0.9, KDRestraintPowerMult(KinkyDungeonPlayerEntity, KDRestraint(r), augmentedInventory)) : 1)); + let linkUnder = KDGetLinkUnder(r, restraint, Bypass, NoStack, Deep, securityEnemy, Lock, curse, powerBonus, !noOverpower); + + let linkableCurrent = r && KDRestraint(r) && KinkyDungeonLinkableAndStricter(KDRestraint(r), restraint, r); + + if (linkUnder && bypasses()) return true; + + // We raise the power if the current item cannot be linked, but the item underneath also cannot be linked + let link = r?.dynamicLink; + while (link && !linkableCurrent) { + let linkableUnder = KinkyDungeonLinkableAndStricter(KDRestraint(link), restraint, link, Lock, curse); + if (!linkableUnder) { + power = Math.max(power, + KinkyDungeonRestraintPower(link, true, restraint, Lock, curse) + * (useAugmentedPower ? Math.max(0.9, KDRestraintPowerMult(KinkyDungeonPlayerEntity, KDRestraint(link), augmentedInventory)) : 1)); + link = link.dynamicLink; + } else { + link = null; + } + } + + let newLock = (Lock && KinkyDungeonIsLockable(restraint)) ? Lock : restraint.DefaultLock; + let allowOverpower = r && !linkableCurrent && !noOverpower && !KDRestraint(r).enchanted; + if ( + // Nothing to overwrite so we good + !r + // We can link + || linkableCurrent + // We are weak enough to override + || allowOverpower + ) { + let augMult = allowOverpower ? + (useAugmentedPower ? + KDRestraintPowerMult(KinkyDungeonPlayerEntity, restraint, augmentedInventory) + : 1) + : 1; + let compPower = + allowOverpower ? ( + -0.01 + + (curse ? (KDCursePower(curse)) : 0) + + (restraint.power + powerBonus) + * augMult + * KinkyDungeonGetLockMult(newLock, undefined, curse, restraint) + ) : 0; + if (!allowOverpower || (Math.max(0.99, power * 1.1) < compPower)) { + if (bypasses()) + return true; // Recursion!! + } + } + return false; +} + +/** + * @param Group + * @param enemy + */ +function KDEnemyPassesSecurity(Group: string, enemy: entity): boolean { + if (!enemy) return false; + let blockers = KDGetBlockingRestraints(Group, true); + for (let blocker of blockers) { + if (!KDRestraint(blocker)?.Security) return false; + for (let secure of Object.entries(KDRestraint(blocker).Security)) { + if (KDGetSecurity(enemy, secure[0]) >= secure[1]) return true; + } + } + return false; +} + +/** + * Returns the first restraint in the stack that can link the given restraint + * @param currentRestraint + * @param restraint + * @param [bypass] + * @param [NoStack] + * @param [Deep] - Whether or not it can look deeper into the stack + * @param [securityEnemy] - Bypass is treated separately for these groups + * @param [Lock] + * @param [Curse] + * @param [powerBonus] + * @param [allowOverride] + */ +function KDGetLinkUnder(currentRestraint: item, restraint: restraint, bypass?: boolean, NoStack?: boolean, Deep?: boolean, securityEnemy?: entity, Lock?: string, Curse?: string, powerBonus?: number, allowOverride?: boolean): item { + let link = currentRestraint; + if (restraint.bypass) bypass = true; + while (link) { + if (KDCanLinkUnder(link, restraint, bypass, NoStack, securityEnemy, Lock, Curse, undefined , powerBonus, allowOverride)) { + return link; + } + if (Deep) + link = link.dynamicLink; + else link = null; + } + return null; +} + +/** + * Returns whether or not the restraint can go under the currentRestraint + * @param currentRestraint + * @param restraint + * @param [bypass] + * @param [NoStack] + * @param [securityEnemy] - Bypass is treated separately for these groups + * @param [Lock] + * @param [Curse] + * @param [ignoreItem] + * @param [powerBonus] + * @param [allowOverride] + */ +function KDCanLinkUnder(currentRestraint: item, restraint: restraint, bypass?: boolean, NoStack?: boolean, securityEnemy?: entity, Lock?: string, Curse?: string, ignoreItem?: item, powerBonus?: number, allowOverride?: boolean): boolean { + if (restraint.bypass) bypass = true; + let linkUnder = currentRestraint + && (bypass || (KDRestraint(currentRestraint).accessible) || (KDRestraint(currentRestraint).deepAccessible) || KDEnemyPassesSecurity(KDRestraint(currentRestraint).Group, securityEnemy)) + && KinkyDungeonIsLinkable({ + oldRestraint: restraint, + newRestraint: KDRestraint(currentRestraint), + item: ignoreItem || {name: restraint.name, id: -1}, + ignoreItem: currentRestraint, + linkUnderItem: currentRestraint, + }); + let power = (allowOverride && !NoStack) ? ( + -0.01 + + (Curse ? (KDCursePower(Curse)) : 0) + + (restraint.power + powerBonus) + * KinkyDungeonGetLockMult(Lock, undefined, Curse, restraint) + ) : 0; + let linkUnderOver = (!currentRestraint.dynamicLink || KinkyDungeonIsLinkable({ + oldRestraint: KDRestraint(currentRestraint.dynamicLink), + newRestraint: restraint, + item: currentRestraint.dynamicLink, + ignoreItem: ignoreItem || {name: restraint.name, id: -1}, + power: power, + props: { + newLock: Lock, + newCurse: Curse, + } + })); + + if (!linkUnder || !linkUnderOver) return false; + if ( + KDCheckLinkSize(currentRestraint, restraint, bypass, NoStack, securityEnemy, ignoreItem, + { + newLock: Lock, + newCurse: Curse, + }, power) + ) { + return true; + } +} + +/** + * @param currentItem + * @param newItem + */ +function KDCurrentItemLinkable(currentItem: item, newItem: restraint): boolean { + return (KinkyDungeonLinkableAndStricter(KDRestraint(currentItem), newItem, currentItem) && + ( + (newItem.linkCategory && !newItem.linkCategories && KDLinkCategorySize(currentItem, newItem.linkCategory) + KDLinkSize(newItem) <= 1.0) + || (newItem.linkCategories && newItem.linkCategories.every( + (lc, index) => + {return KDLinkCategorySize(currentItem, lc) + KDLinkSize(newItem, index) <= 1.0;})) + || (!newItem.linkCategory && !newItem.linkCategories && !KDDynamicLinkList(currentItem, true).some((inv) => {return newItem.name == inv.name;}))) + ); +} + +/** + * @param currentRestraint + * @param restraint + * @param [bypass] + * @param [NoStack] + * @param [securityEnemy] - Bypass is treated separately for these groups + * @param [ignoreItem] - Item to ignore + * @param [props] - Curse and lock properties + * @param [props.newLock] + * @param [props.newCurse] + * @param [power] - Item that can overpower other linked items + */ +function KDCheckLinkSize(currentRestraint: item, restraint: restraint, bypass?: boolean, NoStack?: boolean, _securityEnemy?: entity, ignoreItem?: item, props?: any, power?: number): boolean { + + if (restraint.bypass) bypass = true; + let linkCategories = restraint.linkCategories || (restraint.linkCategory ? [restraint.linkCategory] : []); + return (linkCategories.length == 0 || linkCategories.every((lc, index) => {return KDLinkCategorySize(KinkyDungeonGetRestraintItem(KDRestraint(currentRestraint).Group), + lc, ignoreItem, power) + KDLinkSize(restraint, index) <= (NoStack ? 0.01 : 1.0);}) + ) + && ((linkCategories.length > 0 && !restraint.noDupe) + || !KDDynamicLinkList(KinkyDungeonGetRestraintItem(KDRestraint(currentRestraint).Group), true).some((item) => { + if (restraint.name == KDRestraint(item).name && (!ignoreItem || ignoreItem?.id != item.id)) { + // Note: return false means succeed + // true means interupt + //if (restraint.noDupe) return true; + if (!props) return true; + + if ((!KDGetCurse(item) && props.newCurse) + || (!props.newCurse && props.newLock && !KDGetCurse(item) && !item.lock) + || (props.newCurse && KDCurses[props.newCurse].level > KDCurses[KDGetCurse(item)]?.level + 0.01) + || (props.newLock && KDLocks[props.newLock].lockmult > (KDLocks[item.lock]?.lockmult) + 0.01)) return false; + + /*if (!KDGetCurse(currentRestraint)) { + if (props.newCurse) return false; // Curse always overrides lock + if (!currentRestraint.lock && (props.newCurse || props.newLock)) return false; + if (props.newLock && KDLocks[currentRestraint.lock]?.lockmult + 0.01 < KDLocks[props.newLock]?.lockmult) return false; + } else { + if (props.newCurse && KDCurses[KDGetCurse(currentRestraint)]?.level + 0.01 < KDCurses[props.newCurse]?.level) return false; + }*/ + return true; + } + return false; + })); +} + +/** + * @param restraint + * @param variant + */ +function KDApplyVarToInvVar(restraint: restraint, variant: ApplyVariant): KDRestraintVariant { + let events = []; + let restvar = { + template: restraint.name, + events: events, + curse: variant.curse, + noKeep: variant.noKeep, + }; + for (let e of variant.hexes) { + events.push(...JSON.parse(JSON.stringify(KDEventHexModular[e].events({variant: restvar})))); + } + for (let e of variant.enchants) { + /* + * TODO: Figure out the proper typing for the final "variant" + * argument. It's typed as a KDHexEnchantEventsData, but + * that's not what's being passed. + */ + events.push(...JSON.parse(JSON.stringify( + KDEventEnchantmentModular[e].types[KDModifierEnum.restraint].events( + restraint.name, undefined, undefined, variant.enchants[0], variant.enchants.slice(1) /* , {variant: variant} */)))); + } + return restvar; +} + + +/** + * @param restraint + * @param [Tightness] + * @param [Bypass] + * @param [Lock] + * @param [Keep] + * @param [Trapped] + * @param [events] + * @param [faction] + * @param [Deep] - whether or not it can go deeply in the stack + * @param [Curse] - Curse to apply + * @param [securityEnemy] - Bypass is treated separately for these groups + * @param [reserved] - Reserved do not use + * @param [inventoryAs] - inventoryAs for the item + * @param [data] - data for the item + */ +function KDLinkUnder ( + restraint: restraint, + Tightness?: number, + Bypass?: boolean, + Lock?: string, + Keep?: boolean, + _Trapped?: boolean, + events?: KinkyDungeonEvent[], + faction?: string, + Deep?: boolean, + Curse?: string, + securityEnemy?: entity, + _reserved?: boolean, + inventoryAs?: string, + data?: Record, + powerBonus: number = 0, + noOverpower: boolean = false, +): number +{ + KDRestraintDebugLog.push("LKUndering " + restraint.name); + + let r = KinkyDungeonGetRestraintItem(restraint.Group); + + if (r) { + // Then we remove the lowest power item if we are over the size + let compPower = ( + -0.01 + + (Curse ? (KDCursePower(Curse)) : 0) + + (restraint.power + powerBonus) + * KinkyDungeonGetLockMult(Lock, undefined, Curse, restraint) + ); + if (!KDCheckLinkSize(r, restraint, true, false, undefined, undefined, undefined)) { + // go thru and remove the lowest power accessible one + let dynamicList = []; + let iii = 0; + do { + iii++; + if (!KDCheckLinkSize(r, restraint, true, false, undefined, undefined, undefined)) + dynamicList = KDDynamicLinkList(r, true).filter( + (inv) => { + if ((KDRestraint(inv).linkCategories ? KDRestraint(inv).linkCategories : (KDRestraint(inv).linkCategory ? [KDRestraint(inv).linkCategory] : [])).some( + (category) => { + return (restraint.linkCategories || [restraint.linkCategory]).includes(category); + } + )) + return true; + return false; + } + ); + else dynamicList = []; + let cand = null; + let candPower = -100; + for (let inv of dynamicList) { + let pwr = KinkyDungeonRestraintPower(inv, true); + if (pwr > candPower) { + cand = inv; + candPower = pwr; + } + } + if (cand && compPower > candPower) { + // Turn off 'Add' here because we need to preserve dynamiclink + KinkyDungeonRemoveRestraintSpecific(cand, Keep, false); + r = KinkyDungeonGetRestraintItem(restraint.Group); + if (!r) dynamicList = []; + } + } while (dynamicList.length > 0 && iii < 100); + } + } + + + + let linkUnder = null; + linkUnder = KDGetLinkUnder(r, restraint, Bypass, undefined, Deep, securityEnemy, Lock, Curse, powerBonus, !noOverpower); + let linkableCurrent = r + && KDRestraint(r) + && KinkyDungeonLinkableAndStricter(KDRestraint(r), restraint, r); + + let ret = 0; + let alwaysLinkUnder = false; + if (!linkableCurrent && linkUnder && (!linkableCurrent || !restraint.inaccessible || alwaysLinkUnder)) { + // Insert the item underneath + ret = Math.max(1, Tightness); + KDRestraintDebugLog.push("Linking " + restraint.name + " under " + linkUnder.name); + let safeLink = KDGetLinkUnder(r, restraint, Bypass, undefined, Deep, securityEnemy, undefined, undefined, undefined); + linkUnder.dynamicLink = {name: restraint.name, id: KinkyDungeonGetItemID(), type: Restraint, events:events ? events : KDGetEventsForRestraint(inventoryAs || restraint.name), + data: data, + tightness: Tightness, curse: Curse, faction: faction, dynamicLink: linkUnder.dynamicLink }; + + KDUpdateItemEventCache = true; + let lk = linkUnder.dynamicLink; + if (!Curse && (Lock)) KinkyDungeonLock(linkUnder.dynamicLink, Lock); + else if (restraint.DefaultLock) KinkyDungeonLock(linkUnder.dynamicLink, restraint.DefaultLock); + if (inventoryAs) linkUnder.dynamicLink.inventoryVariant = inventoryAs; + if (!safeLink) { + // Remove the original by iterating down and identifying one we can delete + //let lastlink = null; + let link = KinkyDungeonGetRestraintItem(restraint.Group); + + /* + if (!KDGetCurse(currentRestraint) && props.newCurse) return false; + if (!currentRestraint.lock && (props.newCurse || props.newLock)) return false; + if (props.newCurse && KDCurses[KDGetCurse(currentRestraint)]?.level < KDCurses[props.newCurse]?.level) return false; + if (props.newLock && KDLocks[currentRestraint.lock]?.lockmult < KDLocks[props.newLock]?.lockmult) return false; + */ + if (lk.name == restraint.name && ((KDGetCurse(lk) || '') == (Curse || '') && ((lk.lock || '') == (Lock || '')))) { + let end = false; + while (link) { + if (lk.name == link.name && ( + (!KDGetCurse(link) && Curse) + || (!Curse && Lock && !KDGetCurse(link) && !link.lock) + || (Curse && KDCurses[Curse].level > KDCurses[KDGetCurse(link)]?.level + 0.01) + || (Lock && KDLocks[Lock].lockmult > (KDLocks[link.lock]?.lockmult) + 0.01) + ) + ) { + // Add is false here because we are removing AFTER adding the item + KinkyDungeonRemoveRestraintSpecific(link, true, false, false, false, false, undefined, false); + r = KinkyDungeonGetRestraintItem(restraint.Group); + KDUpdateItemEventCache = true; + link = null; + end = true; + } else { + //lastlink = link; + link = link.dynamicLink; + } + } + if (!end) { + console.log("There was an error! Duplicated restraint"); + KinkyDungeonSendTextMessage(10, `Error adding ${lk.name}, ${lk.curse}. Please report.`, "#ffffff", 12); + } + } + + } + + linkUnder = KinkyDungeonAllRestraint().find((inv) => {return inv.dynamicLink == lk;}); + if (Curse && KDCurses[Curse] && KDCurses[Curse].onApply) { + KDCurses[Curse].onApply(lk, linkUnder); + } + + + + if (r) KDUpdateLinkCaches(r); + KinkyDungeonSendEvent("postApply", {player: KinkyDungeonPlayerEntity, item: lk, host: linkUnder, keep: Keep, Link: true, UnLink: false}); + + } + return ret; +} + +/** + * @param restraint + * @param [Tightness] + * @param [Bypass] + * @param [Lock] + * @param [Keep] + * @param [Trapped] - Deprecated do not use + * @param [events] + * @param [faction] + * @param [Deep] - whether or not it can go deeply in the stack + * @param [Curse] - Curse to apply + * @param [securityEnemy] - Bypass is treated separately for these groups + * @param [useAugmentedPower] - Augment power to keep consistency + * @param [inventoryAs] - inventoryAs for the item + * @param [data] - data for the item + * @param [augmentedInventory] + * @param [variant] - variant for the item + * @param [powerBonus] - 0 without variant + */ +function KinkyDungeonAddRestraintIfWeaker ( + restraint: restraint | string, + Tightness?: number, + Bypass?: boolean, + Lock?: string, + Keep?: boolean, + Trapped?: boolean, + events?: KinkyDungeonEvent[], + faction?: string, + Deep?: boolean, + Curse?: string, + securityEnemy?: entity, + useAugmentedPower?: boolean, + inventoryAs?: string, + data?: Record, + augmentedInventory?: string[], + variant?: ApplyVariant, + powerBonus: number = 0, + NoActionPrune: boolean = false, +): number +{ + let player = KDPlayer(); + if (typeof restraint === "string") { + KDRestraintDebugLog.push("Lookup" + restraint); + restraint = KinkyDungeonGetRestraintByName(restraint); + } else { + KDRestraintDebugLog.push("AddWeaker" + restraint.name); + } + if (!KinkyDungeonIsLockable(restraint)) Lock = ""; + + if (variant) { + return KDEquipInventoryVariant(KDApplyVarToInvVar(restraint, variant), + variant.prefix, Tightness, Bypass, Lock, Keep, Trapped, faction, Deep, Curse, securityEnemy, useAugmentedPower, inventoryAs, variant.nonstackable ? "" : variant.prefix, + undefined, powerBonus + variant.powerBonus, NoActionPrune); + } + + if (restraint.bypass) Bypass = true; + if (KDCanAddRestraint(restraint, Bypass, Lock, false, undefined, Deep, false, securityEnemy, useAugmentedPower, Curse, augmentedInventory)) { + let r = KinkyDungeonGetRestraintItem(restraint.Group); + let linkableCurrent = r + && KDRestraint(r) + && KinkyDungeonLinkableAndStricter(KDRestraint(r), restraint, r); + + let ret = 0; + + let preserve_tether = restraint.Group == "ItemNeckAccessories" && KDIsPlayerTethered(KinkyDungeonPlayerEntity) && KinkyDungeonLeashingEnemy(); + let tether_len = preserve_tether ? KDGetTetherLength(KinkyDungeonPlayerEntity) : 0; + + if (!restraint.good && !restraint.armor) { + KinkyDungeonSetFlag("restrained", 2); + KinkyDungeonSetFlag("restrained_recently", 5); + } + if (restraint.Group == "ItemNeck" + && !KinkyDungeonPlayerTags.get("Collars") + && restraint.shrine.includes("Collars") + && KinkyDungeonInDanger()) { + KinkyDungeonSetFlag("collared", 5); + } + + ret = KinkyDungeonAddRestraint(restraint, Tightness + Math.round(0.1 * KinkyDungeonDifficulty), Bypass, Lock, Keep, false, !linkableCurrent, events, faction, undefined, undefined, Curse, undefined, securityEnemy, inventoryAs, data, + undefined, undefined, undefined, NoActionPrune); + if (preserve_tether && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)) KinkyDungeonAttachTetherToEntity(tether_len, KinkyDungeonLeashingEnemy(), player); + + if (KinkyDungeonPlayerEntity && !KinkyDungeonCanTalk() && KDRandom() < KinkyDungeonGagMumbleChanceRestraint) { + let msg = "KinkyDungeonGagRestraint"; + let gagMsg = Math.floor(KDRandom() * 3); + + if (restraint.power > 8 && KDRandom() < .8) gagMsg = 2; + else if (restraint.power > 4 && KDRandom() < .5) gagMsg = 2; + + msg = msg + gagMsg; + + KinkyDungeonSendDialogue(KinkyDungeonPlayerEntity, TextGet(msg), "#ffffff", 5, 3); + KDSendGagParticles(KDPlayer()); + } + return ret; + } + return 0; +} + +/** + * @param {object} data + * @param {restraint} data.oldRestraint - Restraint on bottom + * @param {restraint} data.newRestraint - Restraint on top + * @param {item} [data.item] - Current Item + * @param {boolean} [data.useAugmentedPower] + * @param {string[]} [data.augmentedInventory] + * @param {item} [data.ignoreItem] - Item to ignore for purpose of calculating size + * @param {item} [data.linkUnderItem] - Item to ignore for total link chain calculation + * @param {object} [data.props] - Curse and lock properties + * @param {string} [data.props.newLock] + * @param {string} [data.props.newCurse] + * @param {number} [data.power] + */ +function KinkyDungeonIsLinkable(data: any): boolean { + if (data.newRestraint.NoLinkOver) return false; + //if (!oldRestraint.nonbinding && newRestraint.nonbinding) return false; + if (data.item && !KDCheckLinkSize(data.item, data.newRestraint, false, false, undefined, data.ignoreItem, data.props, + data.power || 0)) return false; + if (data.oldRestraint && data.newRestraint && data.oldRestraint && data.oldRestraint.Link) { + if (data.newRestraint.name == data.oldRestraint.Link) return true; + } + if (data.item && !KDCheckLinkTotal(data.item, data.newRestraint, data.linkUnderItem, data.props?.newLock, data.props?.newCurse, data.useAugmentedPower, data.augmentedInventory)) return false; + if (data.oldRestraint && data.newRestraint && data.oldRestraint && (data.newRestraint.AlwaysLinkable || data.oldRestraint.LinkableBy || data.oldRestraint.LinkAll) && data.newRestraint.shrine) { + if (data.oldRestraint.LinkAll) return true; + if (data.newRestraint.AlwaysLinkable) return true; + for (let l of data.oldRestraint.LinkableBy) { + for (let s of data.newRestraint.shrine) { + if (l == s) { + return true; + } + } + } + } + return false; +} + +/** + * Checks if all the items linked under allow this item + * @param oldRestraint + * @param newRestraint + * @param [ignoreItem] + */ +function KDCheckLinkTotal(oldRestraint: item, newRestraint: restraint, ignoreItem?: item, _lock: string = "", _curse: string = "", _useAugmentedPower: boolean = false, _augmentedInventory: any = undefined): boolean { + if (KDRestraint(oldRestraint).Link && KDRestraint(oldRestraint).Link == newRestraint.name) { + return true; + } + if (newRestraint.UnLink && oldRestraint.name == newRestraint.UnLink) { + return true; + } + let link = oldRestraint; + if (oldRestraint.linkCache) { + for (let s of newRestraint.shrine) { + if (oldRestraint.linkCache.includes(s)) return true; + } + } + while (link) { + let pass = false; + let r = KDRestraint(link); + if (link != ignoreItem) { + if (r.LinkAll + // 5.2.5: Added ability to override weaker items when linking under + //|| KinkyDungeonRestraintPower(link, true, newRestraint, link.lock, KDGetCurse(link)) + //< -0.01 + (curse ? (KDCursePower(curse)) : 0) + newRestraint.power * (useAugmentedPower ? KDRestraintPowerMult(KinkyDungeonPlayerEntity, newRestraint, augmentedInventory) : 1) * KinkyDungeonGetLockMult(lock, undefined, curse) + ) { + pass = true; + } else if (newRestraint.AlwaysLinkable) { + pass = true; + } else if (r.LinkableBy && newRestraint.shrine) { + for (let l of r.LinkableBy) { + if (!pass) + for (let s of newRestraint.shrine) { + if (l == s) { + pass = true; + } + } + } + } + if (!pass) return false; + } + link = link.dynamicLink; + } + return true; +} + +/** + * Gets the linkability cache + * @param restraint + */ +function KDUpdateLinkCaches(restraint: item) { + let link = restraint; + while (link) { + link.linkCache = KDGetLinkCache(link); + link = link.dynamicLink; + } +} + +/** + * Gets the linkability cache + * @param restraint + */ +function KDGetLinkCache(restraint: item): string[] { + let cache = Object.assign([], KDRestraint(restraint).LinkableBy || []); + let link = restraint.dynamicLink; + while (link) { + let r = KDRestraint(link); + if (r.LinkableBy) { + for (let l of cache) { + if (!r.LinkableBy.includes(l)) cache.splice(cache.indexOf(l), 1); + } + } else if (!r.LinkAll) return []; + link = link.dynamicLink; + } + return cache; +} + +let KinkyDungeonRestraintAdded = false; +let KinkyDungeonCancelFlag = false; + +/** + * @param restraint + * @param Tightness + * @param [Bypass] + * @param [Lock] + * @param [Keep] + * @param [Link] + * @param [SwitchItems] + * @param [events] + * @param [faction] + * @param [Unlink] + * @param [dynamicLink] + * @param [Curse] - Curse to apply + * @param [autoMessage] - Whether or not to automatically dispatch messages + * @param [securityEnemy] - Whether or not to automatically dispatch messages + * @param [inventoryAs] - InventoryAs for the item + * @param [data] - data for the item + * @param [powerBonus] - bonus power + * @param [NoEvent] + */ +function KinkyDungeonAddRestraint ( + restraint: restraint, + Tightness: number, + Bypass?: boolean, + Lock?: string, + Keep?: boolean, + Link?: boolean, + SwitchItems?: boolean, + events?: KinkyDungeonEvent[], + faction?: string, + Unlink?: boolean, + dynamicLink?: item, + Curse?: string, + autoMessage: boolean = true, + securityEnemy: entity = undefined, + inventoryAs: string = undefined, + data?: Record, + powerBonus: number = 0, + NoEvent: boolean = false, + ForceRemove: boolean = false, + NoActionPrune: boolean = false, +): number +{ + if (!NoActionPrune) + KDDelayedActionPrune(["Restrain"]); + if (restraint.bypass) Bypass = true; + KDStruggleGroupLinkIndex = {}; + let start = performance.now(); + let tight = (Tightness) ? Tightness : 0; + if (restraint) { + if (restraint.Group == "ItemButt" && !KinkyDungeonStatsChoice.get("arousalModePlug")) return 0; + if (restraint.Group == "ItemVulva" && restraint.shrine.includes("Plugs") && KinkyDungeonStatsChoice.get("arousalModePlugNoFront")) return 0; + + // First we try linking under + if (!Unlink) { + let ret = KDLinkUnder(restraint, Tightness, Bypass, Lock, Keep, false, events, faction, true, Curse, securityEnemy, true, inventoryAs, data, powerBonus); + if (ret) return ret; + } + + let r = KinkyDungeonGetRestraintItem(restraint.Group); + + KDRestraintDebugLog.push("StartAdd " + restraint.name); + if (!KDGroupBlocked(restraint.Group, true) || Bypass || KDEnemyPassesSecurity(restraint.Group, securityEnemy)) { + KinkyDungeonEvasionPityModifier = 0; + KinkyDungeonMiscastPityModifier = 0; + let linkable = !Unlink && (!Link && r && KinkyDungeonIsLinkable({ + oldRestraint: KDRestraint(r), + newRestraint: restraint, + item: r,})); + let linked = false; + if (linkable) { + linked = true; + //let remAfter = false; + // We replace if we cant link + + let lk = KinkyDungeonLinkItem(restraint, r, Tightness, Lock, Keep, faction, Curse, autoMessage, inventoryAs, events, data); + if (lk) { + KinkyDungeonCancelFlag = true; + } + } + + let eventsAdd = false; + let oldevents = null; + let prevR = null; + + // Some confusing stuff here to prevent recursion. If Link = true this means we are in the middle of linking, we dont want to do that + if (!KinkyDungeonCancelFlag) { + // Note that this only happens when removing TOP LEVEL item, keep in mind for forceRemove + KinkyDungeonRemoveRestraint(restraint.Group, Keep && !Link, Link || Unlink, undefined, undefined, Unlink, undefined, ForceRemove); // r && r.dynamicLink && restraint.name == r.dynamicLink.name + + let newR = KinkyDungeonGetRestraintItem(restraint.Group); + // Run events AFTER + if (r && r.events) { + oldevents = r.events; + eventsAdd = newR != undefined; + prevR = r; + } + + r = newR; + KinkyDungeonCancelFlag = r != undefined; + + } + + + + // If we did not link an item (or unlink one) then we proceed as normal + if (!KinkyDungeonCancelFlag) { + KinkyDungeonRemoveRestraint(restraint.Group, Keep, false, undefined, undefined, r && r.dynamicLink&& restraint.name == r.dynamicLink.name); + if (restraint.remove) + for (let remove of restraint.remove) { + InventoryRemove(KinkyDungeonPlayer, remove); + } + if (restraint.removeShrine) + for (let remove of restraint.removeShrine) { + for (let removeR of KinkyDungeonAllRestraint()) { + let host = removeR; + let link = removeR.dynamicLink; + let iter = 0; + while (link && iter < 100) { + if (KDRestraint(link).shrine && KDRestraint(link).shrine.includes(remove)) { + KinkyDungeonRemoveDynamicRestraint(host, Keep, false); + host = removeR; + link = removeR.dynamicLink; + } else { + host = link; + link = link.dynamicLink; + } + iter += 1; + } + + if (KDRestraint(removeR).shrine && KDRestraint(removeR).shrine.includes(remove)) { + KinkyDungeonRemoveRestraint(KDRestraint(removeR).Group, Keep, false, false, false, false); + } + } + } + + KinkyDungeonSendFloater({x: 1100, y: 600 - KDRecentRepIndex * 40}, `+${TextGet("Restraint" + restraint.name)}!`, "pink", 5, true); + KDRecentRepIndex += 1; + + let item: item = { + name: restraint.name, + id: KinkyDungeonGetItemID(), + type: Restraint, + curse: Curse, + events: events ? events : KDGetEventsForRestraint(inventoryAs || restraint.name), + tightness: tight, + lock: "", + faction: faction, + dynamicLink: dynamicLink, + data: data, + }; + if (inventoryAs) item.inventoryVariant = inventoryAs; + KDRestraintDebugLog.push("Adding " + item.name); + KinkyDungeonInventoryAdd(item); + KDUpdateItemEventCache = true; + if (!NoEvent) + KinkyDungeonSendEvent("postApply", {player: KinkyDungeonPlayerEntity, item: item, host: undefined, keep: Keep, Link: Link, UnLink: Unlink}); + + KDUpdateItemEventCache = true; + if (Curse && KDCurses[Curse] && KDCurses[Curse].onApply) { + KDCurses[Curse].onApply(item, undefined); + } + + if (Lock) KinkyDungeonLock(item, Lock, false, Unlink); + else if (restraint.DefaultLock && !Unlink) KinkyDungeonLock(item, KDProcessLock(restraint.DefaultLock)); + + KDUpdateLinkCaches(item); + KDUpdateItemEventCache = true; + } else if ((!Link && !linked) || SwitchItems) { + KinkyDungeonCancelFlag = false; + // Otherwise, if we did unlink an item, and we are not in the process of linking (very important to prevent loops) + // Then we link the new item to the unlinked item if possible + r = KinkyDungeonGetRestraintItem(restraint.Group); + if (SwitchItems) { + KDUpdateItemEventCache = true; + KinkyDungeonAddRestraintIfWeaker(restraint, Tightness, Bypass, Lock, Keep, false, undefined, faction, undefined, Curse, securityEnemy, undefined, inventoryAs, data); + } else if (r && KDRestraint(r) && KinkyDungeonIsLinkable({ + oldRestraint: KDRestraint(r), + newRestraint: restraint, + item: r, + })) { + KinkyDungeonLinkItem(restraint, r, Tightness, Lock, Keep, faction, Curse, undefined, inventoryAs, events, data); + } + } + // Run events AFTER the swappen + if (oldevents) { + if (prevR.events) { + for (let e of oldevents) { + if (e.trigger == "postRemoval" && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + KinkyDungeonHandleInventoryEvent("postRemoval", e, prevR, {item: prevR, Character: KinkyDungeonPlayer, add: eventsAdd, keep: Keep, Link: Link, shrine: undefined}); + } + } + } + KinkyDungeonSendEvent("postRemoval", {item: prevR, Character: KinkyDungeonPlayer, add: eventsAdd, keep: Keep, Link: Link, shrine: undefined}); + } + KDUpdateItemEventCache = true; + KinkyDungeonCancelFlag = false; + } + + //KinkyDungeonWearForcedClothes(); + + KinkyDungeonPlayerTags = KinkyDungeonUpdateRestraints(); // We update the restraints but no time drain on batteries, etc + + KinkyDungeonCalculateSlowLevel(); + KDRefreshCharacter.set(KinkyDungeonPlayer, true); // We signal it is OK to check whether the player should get undressed due to restraints + + KinkyDungeonDressPlayer(); + KinkyDungeonMultiplayerInventoryFlag = true; // Signal that we can send the inventory now + KinkyDungeonSleepTime = 0; + KinkyDungeonUpdateStruggleGroups(); + if (!KinkyDungeonRestraintAdded) { + KinkyDungeonRestraintAdded = true; + let sfx = (restraint && KDGetRestraintSFX(restraint)) ? KDGetRestraintSFX(restraint) : "Struggle"; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + sfx + ".ogg"); + } + let end = performance.now(); + if (KDDebug) + console.log(`Took ${end - start} milliseconds to add restraint ${restraint.name}`); + return Math.max(1, restraint.power); + } + return 0; +} + +/** + * It removes a restraint from the player + * @param item - The item to remove. + * @param [Keep] - If true, the item will be kept in the player's inventory. + * @param [Add] - If true, this is part of the process of adding another item and should not trigger infinite recursion + * @param [NoEvent] - If true, the item will not trigger any events. + * @param [Shrine] - If the item is being removed from a shrine, this is true. + * @param [UnLink] - If the item is being removed as part of an unlinking process + * @param [Remover] - Who removes this + * @param [ForceRemove] - Ignore AlwaysKeep, for example if armor gets confiscated + * @returns removed items + */ +function KinkyDungeonRemoveRestraintSpecific(item: item, Keep?: boolean, Add?: boolean, + NoEvent?: boolean, Shrine?: boolean, UnLink?: boolean, Remover?: entity, ForceRemove?: boolean): item[] { + KDUpdateItemEventCache = true; + + let rest = KinkyDungeonGetRestraintItem(KDRestraint(item)?.Group); + if (rest == item) { + return KinkyDungeonRemoveRestraint(KDRestraint(item).Group, Keep, Add, NoEvent, Shrine, UnLink, Remover, ForceRemove); + } else if (KDRestraint(item)) { + let list = KDDynamicLinkList(rest, true); + for (let i = 1; i < list.length; i++) { + if (list[i] == item) { + return KinkyDungeonRemoveDynamicRestraint(list[i-1], Keep, NoEvent, Remover, ForceRemove); + } + } + } + return []; +} + +/** + * It removes a restraint from the player + * @param Group - The group of the item to remove. + * @param [Keep] - If true, the item will be kept in the player's inventory. + * @param [Add] - If true, this is part of the process of adding another item and should not trigger infinite recursion + * @param [NoEvent] - If true, the item will not trigger any events. + * @param [Shrine] - If the item is being removed from a shrine, this is true. + * @param [UnLink] - If the item is being removed as part of an unlinking process + * @param [Remover] - Who removes this + * @param [ForceRemove] - Ignore AlwaysKeep, for example if armor gets confiscated + * @returns items removed + */ +function KinkyDungeonRemoveRestraint(Group: string, Keep?: boolean, Add?: boolean, NoEvent?: boolean, Shrine?: boolean, UnLink?: boolean, Remover?: entity, ForceRemove?: boolean): item[] { + let rem = []; + KDRestraintDebugLog.push("Removing " + Group); + KDDelayedActionPrune(["Remove"]); + KDStruggleGroupLinkIndex = {}; + for (let item of KinkyDungeonAllRestraint()) { + const rest = KinkyDungeonRestraintsCache.get(item.name); + if (rest.Group == Group) { + let AssetGroup = rest && rest.AssetGroup ? rest.AssetGroup : Group; + if (!NoEvent) + KinkyDungeonSendEvent("remove", {item: rest, add: Add, keep: Keep, shrine: Shrine}); + + if (!KinkyDungeonCancelFlag && !Add && !UnLink) { + KDRestraintDebugLog.push("Unlinking " + item.name); + let rr = KinkyDungeonUnLinkItem(item, Keep, undefined, ForceRemove); + if (rr.length > 0) { + KinkyDungeonCancelFlag = true; + rem.push(...rr); + } + } + + if (!KinkyDungeonCancelFlag) { + InventoryRemove(KinkyDungeonPlayer, AssetGroup); + + let removed: item[] = []; + for (let _item of KinkyDungeonInventory.get(Restraint).values()) { + if (_item && KDRestraint(_item).Group == Group) { + KDRestraintDebugLog.push("Deleting " + _item.name); + KinkyDungeonInventoryRemove(_item); + removed.push(_item); + break; + } + } + + + // Add the item to inventory + // Cases: + // No add = normal remove, proceed as normal + // yes Add and yes unlink: pulling the item off to link over it + // add and no unlink: removing to put a top level item + // no add and yes unlink: forbidden case + if (removed.length > 0 && ((!Add && !UnLink) || (Add && UnLink))) + for (let invitem of (!Add && !UnLink) ? KDDynamicLinkList(item, true) : removed) { + let invrest = KDRestraint(invitem); + + rem.push(JSON.parse(JSON.stringify(invitem))); + // @ts-ignore + let inventoryAs = invitem.inventoryVariant || invitem.inventoryAs || (Remover?.player ? invrest.inventoryAsSelf : invrest.inventoryAs); + if (invitem.conjured) { + KinkyDungeonSendTextMessage(1, TextGet("KDConjuredItemVanish") + .replace("ITMN", KDGetItemName(invitem)), "#ffffff", 1); + } + if (invrest.inventory && !ForceRemove && !invitem.conjured + && (Keep + || (( + invrest.enchanted + || (invrest.alwaysKeep) + || (invrest.armor) + || (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs] && !KinkyDungeonRestraintVariants[inventoryAs].noKeep) + )))) { + if (inventoryAs) { + let origRestraint = KinkyDungeonGetRestraintByName(inventoryAs); + if (origRestraint && invrest.shrine?.includes("Cursed") && !origRestraint.shrine?.includes("Cursed")) { + KinkyDungeonSendTextMessage(10, TextGet("KDCursedArmorUncurse").replace("RestraintName", TextGet("Restraint" + invrest.name)), "#aaffaa", 1, + false, false, undefined, "Struggle"); + } + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + + if (!KinkyDungeonInventoryGetLoose(inventoryAs)) { + let loose: item = {name: inventoryAs, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:invitem.events || origRestraint.events, quantity: 1}; + if (invitem.inventoryVariant) loose.inventoryVariant = invitem.inventoryVariant; + if (KinkyDungeonRestraintVariants[inventoryAs]) loose.showInQuickInv = true; + KinkyDungeonInventoryAdd(loose); + KDUpdateItemEventCache = true; + } else { + if (!KinkyDungeonInventoryGetLoose(inventoryAs).quantity) KinkyDungeonInventoryGetLoose(inventoryAs).quantity = 0; + KinkyDungeonInventoryGetLoose(inventoryAs).quantity += 1; + } + } else { + if (!KinkyDungeonInventoryGetLoose(invrest.name)) { + KinkyDungeonInventoryAdd({name: invrest.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:invrest.events, quantity: 1}); + KDUpdateItemEventCache = true; + } else { + if (!KinkyDungeonInventoryGetLoose(invrest.name).quantity) KinkyDungeonInventoryGetLoose(invrest.name).quantity = 0; + KinkyDungeonInventoryGetLoose(invrest.name).quantity += 1; + } + + } + } else if (Keep && rest.disassembleAs) { + let dropped = {x:KDPlayer().x, y:KDPlayer().y, + name: rest.disassembleAs, + amount: rest.disassembleCount || 1}; + let newPoint = KinkyDungeonGetNearbyPoint(KDPlayer().x, KDPlayer().y, false, undefined, true); + if (newPoint) { + dropped.x = newPoint.x; + dropped.y = newPoint.y; + } + KDMapData.GroundItems.push(dropped); + } + + + if (!NoEvent) { + if (invrest.events) { + for (let e of invrest.events) { + if (e.trigger == "postRemoval" && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + KinkyDungeonHandleInventoryEvent("postRemoval", e, invitem, {item: invitem, Character: KinkyDungeonPlayer, id: KinkyDungeonGetItemID(), add: Add, keep: Keep, shrine: Shrine}); + } + } + } + KinkyDungeonSendEvent("postRemoval", {item: invrest, Character: KinkyDungeonPlayer, add: Add, keep: Keep, shrine: Shrine}); + } + } + + + + + + if (rest.Group == "ItemNeck" && !Add && !KinkyDungeonPlayerTags.get("Collars")) + rem.push(...KinkyDungeonRemoveRestraint("ItemNeckRestraints", true, undefined, undefined, Shrine, undefined, Remover, ForceRemove)); + + let sfx = (rest && KDGetRemoveSFX(rest)) ? KDGetRemoveSFX(rest) : "Struggle"; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + sfx + ".ogg"); + + KinkyDungeonCalculateSlowLevel(); + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + + KinkyDungeonMultiplayerInventoryFlag = true; + KinkyDungeonUpdateStruggleGroups(); + + } + KinkyDungeonCancelFlag = false; + if (KinkyDungeonPlayerWeapon != KinkyDungeonPlayerWeaponLastEquipped && KinkyDungeonInventoryGet(KinkyDungeonPlayerWeaponLastEquipped)) { + KDSetWeapon(KinkyDungeonPlayerWeaponLastEquipped); + } + // Reequip offhand if able + if (KDGameData.OffhandOld && !KDGameData.Offhand + && KinkyDungeonInventoryGetWeapon(KDGameData.OffhandOld) + && KinkyDungeonCanUseWeapon(false, undefined, KDWeapon(KinkyDungeonInventoryGetWeapon(KDGameData.OffhandOld))) + && KDCanOffhand(KinkyDungeonInventoryGetWeapon(KDGameData.OffhandOld))) { + KDGameData.Offhand = KDGameData.OffhandOld; + } + return rem; + } + } + return rem; +} + +function KDIInsertRestraintUnderneath(_restraint: restraint) { + + return false; +} + +/** + * It removes the item's dynamic link + * @param hostItem - The group of the item to remove. + * @param [Keep] - If true, the item will be kept in the player's inventory. + * @param [NoEvent] - If true, the item will not trigger any events. + * @param [Remover] - Who removes this + * @param [ForceRemove] - Ignore AlwaysKeep, for example if armor gets confiscated + * @returns removed items + */ +function KinkyDungeonRemoveDynamicRestraint(hostItem: item, Keep?: boolean, NoEvent?: boolean, Remover?: entity, ForceRemove?: boolean): item[] { + let item = hostItem.dynamicLink; + let rem = []; + if (item) { + const rest = KDRestraint(item); + if (!NoEvent) + KinkyDungeonSendEvent("remove", {item: rest, keep: Keep, shrine: false, dynamic: true}); + + if (!KinkyDungeonCancelFlag) { + // @ts-ignore + let inventoryAs = item.inventoryVariant || item.inventoryAs || (Remover?.player ? rest.inventoryAsSelf : rest.inventoryAs); + if (item.conjured) { + KinkyDungeonSendTextMessage(1, TextGet("KDConjuredItemVanish") + .replace("ITMN", KDGetItemName(item)), "#ffffff", 1); + } + if (rest.inventory && !ForceRemove && !item.conjured + && (Keep + || rest.enchanted + || rest.armor + || rest.alwaysKeep + || (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs] && !KinkyDungeonRestraintVariants[inventoryAs].noKeep) + )) { + if (inventoryAs) { + let origRestraint = KinkyDungeonGetRestraintByName(inventoryAs); + if (origRestraint && rest.shrine?.includes("Cursed") && !origRestraint.shrine?.includes("Cursed")) { + KinkyDungeonSendTextMessage(10, TextGet("KDCursedArmorUncurse").replace("RestraintName", TextGet("Restraint" + rest.name)), "#aaffaa", 1, + false, false, undefined, "Struggle"); + if (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs]) { + KinkyDungeonRestraintVariants[inventoryAs].curse = undefined; + } + } + if (!KinkyDungeonInventoryGetLoose(inventoryAs)) { + let loose: item = {name: inventoryAs, id: KinkyDungeonGetItemID(), type: LooseRestraint, events: item.events || KDGetEventsForRestraint(inventoryAs), quantity: 1}; + if (item.inventoryVariant) loose.inventoryVariant = item.inventoryVariant; + if (KinkyDungeonRestraintVariants[inventoryAs]) loose.showInQuickInv = true; + KinkyDungeonInventoryAdd(loose); + KDUpdateItemEventCache = true; + } else { + if (!KinkyDungeonInventoryGetLoose(inventoryAs).quantity) KinkyDungeonInventoryGetLoose(inventoryAs).quantity = 0; + KinkyDungeonInventoryGetLoose(inventoryAs).quantity += 1; + } + } else { + if (!KinkyDungeonInventoryGetLoose(rest.name)) { + KinkyDungeonInventoryAdd({name: rest.name, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:rest.events, quantity: 1}); + KDUpdateItemEventCache = true; + } else { + if (!KinkyDungeonInventoryGetLoose(rest.name).quantity) KinkyDungeonInventoryGetLoose(rest.name).quantity = 0; + KinkyDungeonInventoryGetLoose(rest.name).quantity += 1; + } + } + } else if (Keep && rest.disassembleAs) { + let dropped = {x:KDPlayer().x, y:KDPlayer().y, + name: rest.disassembleAs, + amount: rest.disassembleCount || 1}; + let newPoint = KinkyDungeonGetNearbyPoint(KDPlayer().x, KDPlayer().y, false, undefined, true); + if (newPoint) { + dropped.x = newPoint.x; + dropped.y = newPoint.y; + } + KDMapData.GroundItems.push(dropped); + } + + + // Remove the item itself by unlinking it from the chain + KDRestraintDebugLog.push("Removing Dynamic " + item.name); + hostItem.dynamicLink = item.dynamicLink; + item.dynamicLink = undefined; + rem.push(JSON.parse(JSON.stringify(item))); + KDUpdateItemEventCache = true; + let r = KinkyDungeonGetRestraintItem(KDRestraint(hostItem).Group); + if (r) KDUpdateLinkCaches(r); + + if (!NoEvent) { + if (rest.events) { + for (let e of rest.events) { + if (e.trigger == "postRemoval" && (!e.requireEnergy || ((!e.energyCost && KDGameData.AncientEnergyLevel > 0) || (e.energyCost && KDGameData.AncientEnergyLevel > e.energyCost)))) { + KinkyDungeonHandleInventoryEvent("postRemoval", e, item, {item: item, id: KinkyDungeonGetItemID(), Character: KinkyDungeonPlayer, keep: Keep, shrine: false, dynamic: true}); + } + } + } + KinkyDungeonSendEvent("postRemoval", {item: rest, keep: Keep, shrine: false, dynamic: true, Character: KinkyDungeonPlayer}); + } + + let sfx = (rest && KDGetRemoveSFX(rest)) ? KDGetRemoveSFX(rest) : "Struggle"; + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + sfx + ".ogg"); + + KinkyDungeonCalculateSlowLevel(); + KDRefreshCharacter.set(KinkyDungeonPlayer, true); + KinkyDungeonDressPlayer(); + + KinkyDungeonMultiplayerInventoryFlag = true; + KinkyDungeonUpdateStruggleGroups(); + } + KinkyDungeonCancelFlag = false; + } + return rem; +} + +/** + * "Returns an array of all the shrine types that have at least one restraint item." + * + * The function takes one argument, `ShrineFilter`, which is an array of shrine types. If the argument is not provided, the + * function will return all shrine types. If the argument is provided, the function will only return shrine types that are + * in the argument + * @param ShrineFilter - An array of strings, each string being the name of a shrine. + * @returns An array of all the restraint types that can be used in the shrine. + */ +function KinkyDungeonRestraintTypes(ShrineFilter: string[]): string[] { + let ret: string[] = []; + + for (let invItem of KinkyDungeonAllRestraintDynamic()) { + let inv = invItem.item; + if (KDRestraint(inv).shrine) { + for (let shrine of KDRestraint(inv).shrine) { + if (ShrineFilter.includes(shrine) && !ret.includes(shrine)) ret.push(shrine); + } + } + } + + return ret; +} + + +/** + * @param newRestraint + * @param oldItem + * @param tightness + * @param [Lock] + * @param [Keep] + * @param [faction] + * @param [Curse] + * @param [autoMessage] - Whether or not to automatically dispatch a message + * @param [inventoryAs] - inventoryAs for the item + * @param [events] - inventoryAs for the item + * @param [data] - data for the item + * @returns {item} - The new item + */ +function KinkyDungeonLinkItem ( + newRestraint: restraint, + oldItem: item, + tightness: number, + Lock?: string, + Keep?: boolean, + faction?: string, + Curse?: string, + autoMessage: boolean = true, + inventoryAs: string = null, + events: KinkyDungeonEvent[] = undefined, + data?: Record +): item +{ + if (newRestraint && oldItem && oldItem.type == Restraint) { + if (newRestraint) { + KDRestraintDebugLog.push("Adding Linking " + newRestraint.name); + KinkyDungeonAddRestraint(newRestraint, tightness, true, Lock, Keep, true, undefined, events, faction, undefined, oldItem, Curse, undefined, undefined, inventoryAs, data); + let newItem = KinkyDungeonGetRestraintItem(newRestraint.Group); + if (newItem) + newItem.dynamicLink = oldItem; + if (newRestraint.UnLink && KDRestraint(oldItem).Link == newRestraint.name) { + if (oldItem.name != newRestraint.UnLink) { + oldItem.name = newRestraint.UnLink; + oldItem.events = Object.assign([], KDRestraint(oldItem).events); + } + } + KDUpdateItemEventCache = true; + KDUpdateLinkCaches(newItem); + if (autoMessage && KDRestraint(oldItem).Link) + KinkyDungeonSendTextMessage(7, TextGet("KinkyDungeonLink" + oldItem.name), "#ff5277", 2, + false, false, undefined, "Struggle"); + + + KinkyDungeonSendEvent("postApply", {player: KinkyDungeonPlayerEntity, item: newItem, host: undefined, keep: Keep, Link: true, UnLink: false}); + KDUpdateItemEventCache = true; + return newItem; + } + } + return null; +} + +/** + * + * @param {item} item + * @param {boolean} Keep + * @returns {item[]} + */ +function KinkyDungeonUnLinkItem(item: item, Keep: boolean, _dynamic?: any, ForceRemove?: boolean): item[] { + //if (!data.add && !data.shrine) + // Note: this function is only called on a top level item, remember that for ForceRemove + + let rem = []; + if (item.type == Restraint) { + let UnLink: item = null; + if (item.dynamicLink) { + UnLink = item.dynamicLink; + } + if (UnLink) { + let newRestraint = KinkyDungeonGetRestraintByName(UnLink.name); + if (newRestraint) { + + KDRestraintDebugLog.push("Adding Unlinked " + newRestraint.name); + KinkyDungeonAddRestraint(newRestraint, UnLink.tightness, true, UnLink.lock, Keep, undefined, undefined, UnLink?.events, UnLink.faction, true, UnLink.dynamicLink, UnLink.curse, undefined, undefined, UnLink.inventoryVariant, UnLink.data, undefined, undefined, ForceRemove); + + KinkyDungeonSendEvent("postRemoval", {item: null, keep: Keep, shrine: false, Link: false, dynamic: true, Character: KinkyDungeonPlayer}); + if (KDRestraint(item).UnLink) { + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonUnLink" + item.name), "lightgreen", 2, + false, false, undefined, "Struggle"); + } else + KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonUnLink"), "lightgreen", 2, + false, false, undefined, "Struggle"); + return [item]; + } + } + } + return rem; +} + +/** + * @param x + * @param y + * @param options + */ +function KDCreateDebris ( + x: number, + y: number, + options: {aoe: number, number: number, dist: number, kind: string, duration?: number, durationExtra?: number} +) +{ + let count = options.number ? options.number : 1; + let rad = options.aoe ? options.aoe : 1.5; + let minrad = options.dist; + for (let i = 0; i < count; i++) { + let slots = []; + for (let X = -Math.ceil(rad); X <= Math.ceil(rad); X++) + for (let Y = -Math.ceil(rad); Y <= Math.ceil(rad); Y++) { + if (Math.sqrt(X*X+Y*Y) <= rad && (!minrad || Math.sqrt(X*X+Y*Y) >= minrad)) { + if ((x + X > 0 && y + Y > 0 && x + X < KDMapData.GridWidth && y + Y < KDMapData.GridHeight) + && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(x + X, y + Y))) + slots.push({x:X, y:Y}); + } + } + + if (slots.length > 0) { + let slot = slots[Math.floor(KDRandom() * slots.length)]; + if (slot) { + KDCreateEffectTile(x + slot.x, y + slot.y, { + name: options.kind, + duration: options.duration + }, options.durationExtra || 0); + } + } + + } +} + +/** + * @param StruggleType + * @param restraint + * @param lockType + * @param index + * @param data + * @param host + */ +function KDSuccessRemove(StruggleType: string, restraint: item, lockType: KDLockType, index: number, data: any, host: item): boolean { + let progress = restraint.cutProgress ? restraint.cutProgress : 0; + data.destroyChance = (StruggleType == "Cut" || restraint.cutProgress) ? 1.0 : 0; + if (KDRestraint(restraint)?.struggleBreak && StruggleType == "Struggle") data.destroyChance = 1.0; + if (restraint.struggleProgress && restraint.struggleProgress > 0) { + progress += restraint.struggleProgress; + data.destroyChance = restraint.cutProgress / progress; + } + let destroy = false; + + KinkyDungeonFastStruggleType = ""; + KinkyDungeonFastStruggleGroup = ""; + + KinkyDungeonSendEvent("beforeSuccessRemove", data); + + if (StruggleType == "Pick" || StruggleType == "Unlock") { + if (StruggleType == "Unlock") { + if (lockType && lockType.canUnlock(data)) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetFinishEscapeSFX(restraint) && KDGetFinishEscapeSFX(restraint).Unlock) ? KDGetFinishEscapeSFX(restraint).Unlock : "Unlock") + + ".ogg"); + KinkyDungeonRemoveKeysUnlock(restraint.lock); + KinkyDungeonLock(restraint, ""); + } + } else { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetFinishEscapeSFX(restraint) && KDGetFinishEscapeSFX(restraint).Unlock) ? KDGetFinishEscapeSFX(restraint).Unlock : "Unlock") + + ".ogg"); + KinkyDungeonLock(restraint, ""); + } + } else { + if (KDSoundEnabled()) { + if (StruggleType == "Cut") AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetFinishEscapeSFX(restraint) && KDGetFinishEscapeSFX(restraint).Cut) ? KDGetFinishEscapeSFX(restraint).Cut : "Cut") + + ".ogg"); + else if (StruggleType == "Remove") AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetFinishEscapeSFX(restraint) && KDGetFinishEscapeSFX(restraint).Remove) ? KDGetFinishEscapeSFX(restraint).Remove : "Unbuckle") + + ".ogg"); + else AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + ((KDGetFinishEscapeSFX(restraint) && KDGetFinishEscapeSFX(restraint).Struggle) ? KDGetFinishEscapeSFX(restraint).Struggle : "Struggle") + + ".ogg"); + } + if (KDRandom() < data.destroyChance) { + if (KDAlwaysKeep({name: restraint.name, id: 0}, KinkyDungeonPlayerEntity)) { + KinkyDungeonSendTextMessage(9, TextGet("KinkyDungeonStruggleCutDestroyFail").replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff5277", 2, + false, false, undefined, "Struggle"); + } else { + KinkyDungeonSendTextMessage(9, TextGet("KinkyDungeonStruggleCutDestroy").replace("TargetRestraint", TextGet("Restraint" + restraint.name)), "#ff5277", 2, + false, false, undefined, "Struggle"); + } + destroy = true; + } + let trap = restraint.trap; + KDSendStatus('escape', restraint.name, StruggleType); + if (KDSoundEnabled() && destroy) { + if (KDGetFinishEscapeSFX(restraint) && KDGetFinishEscapeSFX(restraint).Destroy) { + AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + + (KDGetFinishEscapeSFX(restraint).Destroy) + + ".ogg"); + } + } + if (index) { + //if (KDStruggleGroupLinkIndex[KDRestraint(restraint).Group]) KDStruggleGroupLinkIndex[KDRestraint(restraint).Group] = 0; + KinkyDungeonRemoveDynamicRestraint(host, !destroy, false, KinkyDungeonPlayerEntity); + } else { + KinkyDungeonRemoveRestraint(KDRestraint(restraint).Group, !destroy, undefined, undefined, undefined, undefined, KinkyDungeonPlayerEntity); + } + if (KinkyDungeonStatsChoice.get("FutileStruggles") && data.escapeChance < 0.25) + KDChangeWill("FutileStruggles", "perk", "struggle", KinkyDungeonStatWillCostEscape); + if (trap) { + let summon = KinkyDungeonSummonEnemy(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, trap, 1, 2.5).length; + if (summon) { + KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonSummonTrapMonster"), "#ff5277", 2, + false, false, undefined, "Struggle"); + } + } + } + let suff = ""; + if (KDRestraint(restraint)?.customEscapeSucc) suff = KDRestraint(restraint)?.customEscapeSucc; + else if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) suff = "Aroused"; + KinkyDungeonSendActionMessage(9, TextGet("KinkyDungeonStruggle" + StruggleType + "Success" + suff).replace("TargetRestraint", TextGet("Restraint" + KDRestraint(restraint).name)), "lightgreen", 2); + + KinkyDungeonSendEvent("afterSuccessRemove", data); + + KDSortInventory(KDPlayer()); + + return destroy; +} + +function KDAddDelayedStruggle(amount: number, time: number, _StruggleType: string, struggleGroup: string, index: number, data: KDStruggleData, progress: number = 0, limit: number = 100): void { + let cur = progress || 0; + for (let t = 1; t <= time; t++) { + let plus = Math.min(amount/time, Math.max(0, (limit > 0 ? (limit - cur) : 1))); + if (plus > 0 && plus < 0.04) plus = 0.04; + cur += plus; + KDAddDelayedAction({ + commit: "Struggle", + data: { + group: struggleGroup, + index: index, + amount: plus, + escapeData: data, + delta: time == 1 ? 0 : 1, + }, + time: t, + tick: t - 1, + maxtime: time, + tags: ["Action", "Remove", "Restrain", "Hit", "Auto"], + }); + } +} + +/** + * @param bonus + * @param penalty + * @param threshold + * @param bonusscale + * @param penaltyscale + */ +function KDGetManaBonus(bonus: number, penalty: number, threshold: number, bonusscale: number, penaltyscale: number): number { + if (KinkyDungeonStatMana > threshold) return bonus * (KinkyDungeonStatMana - threshold)/bonusscale; + else if (KinkyDungeonStatMana < threshold) return penalty * (KinkyDungeonStatMana - threshold)/penaltyscale; + return 0; +} + +/** + * Gets the goddess bonus for this item + * @param item + * @param [data] - Escape chance data + */ +function KDGetItemGoddessBonus(item: item, data?: any): number { + if (!item) return 0; + if (data) { + if (data.struggleType == "Unlock") return 0; + } + let bonus = 0; + let avg = 0; + for (let s of KDRestraint(item)?.shrine) { + if (KinkyDungeonGoddessRep[s] != undefined) { + bonus += KDGetGoddessBonus(s); + avg += 1; + } + } + if (avg > 0) + bonus = bonus/avg; + return bonus; +} + +/** + * Gets a restraint from a list of eligible restraints and a group prioritization order + * @param RestraintList + * @param GroupOrder + * @param [skip] + */ +function KDChooseRestraintFromListGroupPri(RestraintList: {restraint: restraint, weight: number}[], GroupOrder: string[], skip: boolean = true): restraint { + + let cycled = false; + for (let i = 0; i < GroupOrder.length; i++) { + let group = GroupOrder[i]; + if (skip && (!cycled || + (KinkyDungeonGetRestraintItem(group) + && !KDRestraint(KinkyDungeonGetRestraintItem(group))?.armor + && !KDRestraint(KinkyDungeonGetRestraintItem(group))?.good))) { + + if (i == GroupOrder.length - 1 && !cycled) { + i = 0; + cycled = true; + } + continue; + } + let Restraints = RestraintList.filter((rest) => { + return rest.restraint.Group == group; + }); + + if (Restraints.length > 0) { + let restraintWeightTotal = 0; + let restraintWeights = []; + + + for (let rest of Restraints) { + let restraint = rest.restraint; + let weight = rest.weight; + restraintWeights.push({restraint: restraint, weight: restraintWeightTotal}); + weight += restraint.weight; + restraintWeightTotal += Math.max(0, weight); + } + + let selection = KDRandom() * restraintWeightTotal; + + for (let L = restraintWeights.length - 1; L >= 0; L--) { + if (selection > restraintWeights[L].weight) { + return restraintWeights[L].restraint; + } + } + } + if (i == GroupOrder.length - 1 && !cycled) { + i = 0; + cycled = true; + } + } + return null; +} + + +/** + * Gets a restraint from a list of eligible restraints and a group prioritization order + * @param RestraintList + * @param GroupOrder + * @param [skip] + */ +function KDChooseRestraintFromListGroupPriWithVariants ( + RestraintList: eligibleRestraintItem[], + GroupOrder: string[], + skip: boolean = true +): { r: restraint, v: ApplyVariant, iv: string} +{ + let cycled = false; + for (let i = 0; i < GroupOrder.length; i++) { + let group = GroupOrder[i]; + if (skip && (!cycled && i < GroupOrder.length - 1 && + (KinkyDungeonGetRestraintItem(group) + && !KDRestraint(KinkyDungeonGetRestraintItem(group))?.armor + && !KDRestraint(KinkyDungeonGetRestraintItem(group))?.good))) continue; + let Restraints = RestraintList.filter((rest) => { + return rest.restraint.Group == group; + }); + + if (Restraints.length > 0) { + let restraintWeightTotal = 0; + let restraintWeights = []; + + + for (let rest of Restraints) { + let restraint = rest.restraint; + let weight = rest.weight; + restraintWeights.push({restraint: restraint, variant: rest.variant, weight: restraintWeightTotal, iv: rest.inventoryVariant}); + weight += restraint.weight; + restraintWeightTotal += Math.max(0, weight); + } + + let selection = KDRandom() * restraintWeightTotal; + + for (let L = restraintWeights.length - 1; L >= 0; L--) { + if (selection > restraintWeights[L].weight) { + return {r: restraintWeights[L].restraint, v: restraintWeights[L].variant, iv: restraintWeights[L].iv}; + } + } + } + + if (i == GroupOrder.length - 1 && !cycled) { + i = 0; + cycled = true; + } + } + return null; +} + + +type kdRopeSlimePart = { + enemyTagSuffix?: string; + enemyTagSuffix2?: string; + enemyTagExtra?: Record, +} + +let KDSlimeParts: Record = { + "Collar": {enemyTagSuffix: "Collar",enemyTagExtra: {"livingCollar":10}}, + "Boots": {}, + "Feet": {}, + "Legs": {}, + "Arms": {}, + "Head": {}, + "Mouth": {}, + "Hands": {}, + "Raw": {}, +}; + +let KDRopeParts: Record = { + "Collar": {enemyTagSuffix: "Collar", enemyTagExtra: {"livingCollar":10}}, + "ArmsBoxtie": {}, + "ArmsWrist": {}, + "Cuffs": {}, + "CuffsAdv": {}, + "CuffsAdv2": {enemyTagSuffix2: "Nonbind"}, + //"Hogtie": {enemyTagSuffix: "Hogtie"}, + //"HogtieWrist": {enemyTagSuffix: "Hogtie"}, + "HogtieLink": {enemyTagSuffix: "Hogtie"}, + "Feet": {}, + "Feet2": {}, + "Feet3": {}, + "Legs": {}, + "Legs2": {}, + "Legs3": {}, + "Belt": {}, + "Harness": {enemyTagSuffix2: "Nonbind"}, + "Crotch": {enemyTagSuffix2: "Nonbind"}, + "Toes": {}, + "Raw": {}, +}; + +type kdCuffPart = { + base: boolean; + enemyTagSuffix?: string; + enemyTagOverride?: Record; + Link?: string; + UnLink?: string; + ModelSuffix?: string; +} + +let KDCuffParts: Record = { + "LivingCollar": {base: true, enemyTagSuffix: "LivingCollar", enemyTagOverride: {"livingCollar":10}}, + "AnkleCuffs": {base: true,},// Link: "AnkleCuffs2"}, + //"AnkleCuffs2": {Link: "AnkleCuffs3", UnLink: "AnkleCuffs"}, //, ModelSuffix: "Chained" + //"AnkleCuffs3": {UnLink: "AnkleCuffs2"}, + "LegCuffs": {base: true,},// Link: "LegCuffs2"}, + //"LegCuffs2": {UnLink: "LegCuffs"}, //, ModelSuffix: "Chained" + "ArmCuffs": {base: true,},// Link: "ArmCuffs2"}, + //"ArmCuffs2": {Link: "ArmCuffs3", UnLink: "ArmCuffs"}, //, ModelSuffix: "Chained" + //"ArmCuffs3": {UnLink: "ArmCuffs4"}, + //"ArmCuffs4": {UnLink: "ArmCuffs", Link: "ArmCuffs3"}, +}; + +/** + * @param CopyOf - The cuff family to copy + * @param idSuffix - The suffix to add to the cuff family + * @param ModelSuffix - The suffix for the cuff model to use + * @param tagBase - The base for the enemy tags + * @param extraTags - extra enemy tags + * @param allTag - adds a tag to all of the cuffs if specified + * @param removeTag + * @param addPower - Base opower level + * @param properties - Restraint properties to override + * @param extraEvents - Extra events to add on to the base cuffs + * @param addStruggle - Increase to base struggle amounts + * @param premultStruggle - Multiplier to base struggle amounts, AFTER baseStruggle + * @param addStruggleLink + * @param premultStruggleLink + * @param [Filters] - Multiplier to base struggle amounts, AFTER baseStruggle + * @param baseWeight + * @param [noGeneric] - does not add this to tagBaseRestraints, only tagBaseCuffs + * @param [CuffAssets] - mapping of Group to Assets + * @param [CuffModels] - mapping of Group to Models + * @param [noLockBase] - Removes Pick and Unlock methods of escape + * @param [noLockLink] - Removes Pick and Unlock methods of escape + * @param [Properties] + * param {{name: string, description: string}} strings - Generic strings for the cuff type + */ +function KDAddCuffVariants ( + CopyOf: string, + idSuffix: string, + ModelSuffix: string, + tagBase: string, + extraTags: Record, + allTag: string[], + removeTag: string[], + addPower: number, + properties: KDRestraintPropsBase, + extraEvents: KinkyDungeonEvent[] = [], + addStruggle?: KDEscapeChanceList, + premultStruggle?: KDEscapeChanceList, + addStruggleLink?: KDEscapeChanceList, + premultStruggleLink?: KDEscapeChanceList, + Filters?: Record, + baseWeight: number = 10, + noGeneric?: boolean, + CuffAssets: Record = {}, + CuffModels: Record = {}, + noLockBase?: boolean, + noLockLink?: boolean, + Properties?: Record +) +{ + for (let part of Object.entries(KDCuffParts)) { + let cuffPart = part[0]; + let cuffInfo = part[1]; + // Only if we have something to copy + let origRestraint = KinkyDungeonGetRestraintByName(CopyOf + cuffPart); + if (origRestraint) { + // For each category of rope items we dupe the original item and apply modifications based on the category parameters + let enemyTags: Record = {}; + if (cuffInfo.base) { + enemyTags[tagBase + (cuffInfo.enemyTagSuffix || "Cuffs")] = baseWeight; + if (cuffInfo.enemyTagOverride) { + for (let tag in cuffInfo.enemyTagOverride) { + enemyTags[tag] = cuffInfo.enemyTagOverride[tag]; + } + } else { + if (!noGeneric) { + enemyTags[tagBase + ("Restraints")] = baseWeight; + enemyTags[tagBase + ("LessCuffs")] = 0.1 - baseWeight; + enemyTags[tagBase + ("NoCuffs")] = -1000; + } + if (extraTags) { + for (let t of Object.entries(extraTags)) { + enemyTags[t[0]] = t[1]; + } + } + } + } + + let enemyTagsMult: Record = {}; + if (cuffInfo.base) + enemyTagsMult[tagBase + (cuffInfo.enemyTagSuffix || "")] = 1; + let shrine = [...allTag, ...KDGetRestraintTags(origRestraint)]; + for (let t of removeTag) { + if (shrine.includes(t)) shrine.splice(shrine.indexOf(t), 1); + } + let props: KDRestraintPropsBase = { + Model: CuffModels[cuffPart] || (origRestraint.Model + ModelSuffix + (cuffInfo.ModelSuffix || "")), + Asset: CuffAssets[cuffPart] || (origRestraint.Asset), + power: origRestraint.power + addPower, + shrine: shrine, + enemyTags: enemyTags, + enemyTagsMult: enemyTagsMult, + events: cuffInfo.base ? [...extraEvents, ...(origRestraint.events || [])] : [...(origRestraint.events || [])], + escapeChance: Object.assign({}, origRestraint.escapeChance), + Filters: origRestraint.Filters ? Object.assign({}, origRestraint.Filters) : {}, + Properties: origRestraint.Properties ? Object.assign({}, origRestraint.Properties) : {}, + cloneTag: tagBase + "Restraints", + }; + if (cuffInfo.Link) props.Link = idSuffix + cuffInfo.Link; + if (cuffInfo.UnLink) props.UnLink = idSuffix + cuffInfo.UnLink; + if (Filters && props.Filters) { + for (let layer of Object.keys(Filters)) { + props.Filters[layer] = Object.assign({}, Filters[layer]); + } + } + if (origRestraint.disassembleAs) props.disassembleAs = idSuffix + "Raw"; + if (Properties && props.Properties) { + for (let layer of Object.keys(Properties)) { + props.Properties[layer] = Object.assign({}, Properties[layer]); + } + } + if (cuffInfo.base) { + if (premultStruggle) { + for (let type of Object.entries(premultStruggle)) { + props.escapeChance[type[0]] = Math.round(10000*((props.escapeChance[type[0]] || 0) * type[1]))/10000; + } + } + if (addStruggle) { + for (let type of Object.entries(addStruggle)) { + props.escapeChance[type[0]] = Math.round(10000*((props.escapeChance[type[0]] || 0) + type[1]))/10000; + } + } + if (noLockBase) { + delete props.escapeChance.Pick; + delete props.escapeChance.Unlock; + } + } else { + if (premultStruggleLink) { + for (let type of Object.entries(premultStruggleLink)) { + props.escapeChance[type[0]] = Math.round(10000*((props.escapeChance[type[0]] || 0) * type[1]))/10000; + } + } + if (addStruggleLink) { + for (let type of Object.entries(addStruggleLink)) { + props.escapeChance[type[0]] = Math.round(10000*((props.escapeChance[type[0]] || 0) + type[1]))/10000; + } + } + if (noLockLink) { + delete props.escapeChance.Pick; + delete props.escapeChance.Unlock; + } + } + KinkyDungeonCloneRestraint(CopyOf + cuffPart, idSuffix + cuffPart, Object.assign(props, properties)); + } + } +} + + +/** + * + * @param {string} CopyOf - The rope family to copy + * @param {string} idSuffix - The suffix to add to the rope family + * @param {string} ModelSuffix - The suffix for the rope model to use + * @param {string} tagBase - The base for the enemy tags + * @param {string[]} allTag - adds a tag to all of the ropes if specified + * @param {string[]} removeTag + * @param {number} basePower - Base opower level + * @param {KDRestraintPropsBase} properties - Restraint properties to override + * @param {KinkyDungeonEvent[]} extraEvents - Extra events to add on + * @param {KDEscapeChanceList} addStruggle - Increase to base struggle amounts + * @param {KDEscapeChanceList} premultStruggle - Multiplier to base struggle amounts, AFTER baseStruggle + * @param {Record} [Filters] - Multiplier to base struggle amounts, AFTER baseStruggle + * @param {number} baseWeight + * @param {boolean} Enchantable - Do NOT delete enchantable rope categories + * @param {Record} [Properties] + * param {{name: string, description: string}} strings - Generic strings for the rope type + */ +function KDAddRopeVariants ( + CopyOf: string, + idSuffix: string, + ModelSuffix: string, + tagBase: string, + allTag: string[], + removeTag: string[], + basePower: number, + properties: KDRestraintPropsBase, + extraEvents: KinkyDungeonEvent[] = [], + addStruggle: KDEscapeChanceList, + premultStruggle: KDEscapeChanceList, + Filters: Record, + baseWeight: number = 10, + Enchantable: boolean = false, + Properties?: Record +) +{ + for (let part of Object.entries(KDRopeParts)) { + let ropePart = part[0]; + // Only if we have something to copy + let origRestraint = KinkyDungeonGetRestraintByName(CopyOf + ropePart); + if (origRestraint) { + // For each category of rope items we dupe the original item and apply modifications based on the category parameters + let enemyTags: Record = {}; + enemyTags[tagBase + (part[1].enemyTagSuffix || "")] = baseWeight; + if (part[1].enemyTagSuffix2) + enemyTags[tagBase + (part[1].enemyTagSuffix2 || "")] = baseWeight; + if (part[1].enemyTagExtra) { + for (let tag in part[1].enemyTagExtra) { + enemyTags[tag] = part[1].enemyTagExtra[tag]; + } + } + + + + let enemyTagsMult: Record = {}; + enemyTagsMult[tagBase + (part[1].enemyTagSuffix || "")] = 1; + if (part[1].enemyTagSuffix2) + enemyTagsMult[tagBase + (part[1].enemyTagSuffix2 || "")] = 1; + let shrine = [...allTag, ...KDGetRestraintTags(origRestraint)]; + for (let t of removeTag) { + if (shrine.includes(t)) shrine.splice(shrine.indexOf(t), 1); + } + let props: KDRestraintPropsBase = { + Model: origRestraint.Model + ModelSuffix, + power: origRestraint.power + basePower, + shrine: shrine, + enemyTags: enemyTags, + enemyTagsMult: enemyTagsMult, + events: [...extraEvents, ...(origRestraint.events || [])], + escapeChance: Object.assign({}, origRestraint.escapeChance), + Filters: origRestraint.Filters ? Object.assign({}, origRestraint.Filters) : {}, + Properties: origRestraint.Properties ? Object.assign({}, origRestraint.Properties) : {}, + cloneTag: tagBase, + linkCategories: origRestraint.linkCategories ? JSON.parse(JSON.stringify(origRestraint.linkCategories)) : undefined, + linkSize: origRestraint.linkSizes ? JSON.parse(JSON.stringify(origRestraint.linkSizes)) : undefined, + }; + + if (origRestraint.disassembleAs) props.disassembleAs = idSuffix + "Raw"; + if (!Enchantable && props.linkCategories) { + for (let i = 0; i < props.linkCategories.length; i++) { + if (props.linkCategories[i].includes("Enchantable")) { + props.linkCategories.splice(i, 1); + if (props.linkSizes && props.linkSizes[i]) + props.linkSizes.splice(i, 1); + break; + } + } + } + if (Filters && props.Filters) { + for (let layer of Object.keys(Filters)) { + props.Filters[layer] = Object.assign({}, Filters[layer]); + } + } + if (Properties && props.Properties) { + for (let layer of Object.keys(Properties)) { + props.Properties[layer] = Object.assign({}, Properties[layer]); + } + } + if (premultStruggle) { + for (let type of Object.entries(premultStruggle)) { + props.escapeChance[type[0]] = Math.round(10000*((props.escapeChance[type[0]] || 0) * type[1]))/10000; + } + } + if (addStruggle) { + for (let type of Object.entries(addStruggle)) { + props.escapeChance[type[0]] = Math.round(10000*((props.escapeChance[type[0]] || 0) + type[1]))/10000; + } + } + KinkyDungeonCloneRestraint(CopyOf + ropePart, idSuffix + ropePart, Object.assign(props, properties)); + } + } +} + + +/** + * @param CopyOf - The rope family to copy + * @param idSuffix - The suffix to add to the rope family + * @param ModelSuffix - The suffix for the rope model to use + * @param tagBase - The base for the enemy tags + * @param allTag - adds a tag to all of the ropes if specified + * @param removeTag + * @param basePower - Base opower level + * @param properties - Restraint properties to override + * @param extraEvents - Extra events to add on + * @param addStruggle - Increase to base struggle amounts + * @param premultStruggle - Multiplier to base struggle amounts, AFTER baseStruggle + * @param [Filters] - Multiplier to base struggle amounts, AFTER baseStruggle + * @param baseWeight + * @param [restraintType] - Restrainttype for slime spread event + * @param [Properties] + * param {{name: string, description: string}} strings - Generic strings for the rope type + */ +function KDAddHardSlimeVariants ( + CopyOf: string, + idSuffix: string, + ModelSuffix: string, + tagBase: string, + allTag: string[], + removeTag: string[], + basePower: number, + properties: KDRestraintPropsBase, + extraEvents: KinkyDungeonEvent[] = [], + addStruggle?: KDEscapeChanceList, + premultStruggle?: KDEscapeChanceList, + Filters?: Record, + baseWeight: number = 100, + restraintType?: string, + Properties?: Record +) +{ + for (let part of Object.entries(KDSlimeParts)) { + let restraintPart = part[0]; + // Only if we have something to copy + let origRestraint = KinkyDungeonGetRestraintByName(CopyOf + restraintPart); + if (origRestraint) { + // For each category of rope items we dupe the original item and apply modifications based on the category parameters + let enemyTags: Record = {}; + enemyTags[tagBase + (part[1].enemyTagSuffix || "")] = baseWeight; + if (part[1].enemyTagSuffix2) + enemyTags[tagBase + (part[1].enemyTagSuffix2 || "")] = baseWeight; + enemyTags[tagBase + (part[1].enemyTagSuffix || "") + "Random"] = baseWeight + 3; + if (part[1].enemyTagExtra) { + for (let tag in part[1].enemyTagExtra) { + enemyTags[tag] = part[1].enemyTagExtra[tag]; + } + } + + let shrine = [ ...allTag,...KDGetRestraintTags(origRestraint)]; + for (let t of removeTag) { + if (shrine.includes(t)) shrine.splice(shrine.indexOf(t), 1); + } + let props: KDRestraintPropsBase = { + Model: origRestraint.Model + ModelSuffix, + power: origRestraint.power + basePower, + shrine: shrine, + enemyTags: enemyTags, + events: JSON.parse(JSON.stringify([...extraEvents, ...(origRestraint.events || [])])), + escapeChance: Object.assign({}, origRestraint.escapeChance), + Filters: origRestraint.Filters ? Object.assign({}, origRestraint.Filters) : {}, + Properties: origRestraint.Properties ? Object.assign({}, origRestraint.Properties) : {}, + cloneTag: tagBase, + }; + if (Filters && props.Filters) { + for (let layer of Object.keys(Filters)) { + props.Filters[layer] = Object.assign({}, Filters[layer]); + } + } + if (origRestraint.disassembleAs) props.disassembleAs = idSuffix + "Raw"; + if (Properties && props.Properties) { + for (let layer of Object.keys(Properties)) { + props.Properties[layer] = Object.assign({}, Properties[layer]); + } + } + if (premultStruggle) { + for (let type of Object.entries(premultStruggle)) { + props.escapeChance[type[0]] = Math.round(10000*((props.escapeChance[type[0]] || 0) * type[1]))/10000; + } + } + if (addStruggle) { + for (let type of Object.entries(addStruggle)) { + props.escapeChance[type[0]] = Math.round(10000*((props.escapeChance[type[0]] || 0) + type[1]))/10000; + } + } + if (restraintType) { + for (let ev of props.events) { + if (ev.type == "slimeSpread") ev.restraint = restraintType; + } + } + KinkyDungeonCloneRestraint(CopyOf + restraintPart, idSuffix + restraintPart, Object.assign(props, properties)); + } + } +} + +/** + * Converts restraint tags to a copy that is also a list (in case data structure changes) + * @param restraint + * @returns {string[]} + */ +function KDGetRestraintTags(restraint: restraint): string[] { + return [...restraint.shrine]; +} + +/** + * @param item + * @param name + */ +function KDItemDataQuery(item: item, name: string): any { + if (item?.data) { + return item.data[name]; + } + return undefined; +} +/** + * @param item + * @param name + * @param value + */ +function KDItemDataSet(item: item, name: string, value: number | string): void { + if (!item.data) { + item.data = {}; + } + item.data[name] = value; +} + +/** + * Changes a restraint item's name + * @param item + * @param type - Restraint or LooseRestraint + * @param name + */ +function KDChangeItemName(item: item, type: string, name: string) { + if (item.name == name) return; + if (KinkyDungeonInventory.get(type).get(item.name)) { + KinkyDungeonInventory.get(type).set(name, item); + KinkyDungeonInventory.get(type).delete(item.name); + } + item.name = name; + KDUpdateItemEventCache = true; +} + + +/** + * Changes a restraint item's name + * @param item + * @param type - Restraint or LooseRestraint + * @param name + */ +function KDChangeRestraintType(item: item, type: string, name: string) { + if (KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]) { + KinkyDungeonRestraintVariants[item.inventoryVariant || item.name].template = name; + } + if ((item.inventoryVariant || !KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]) + && item.inventoryVariant != item.name) + KDChangeItemName(item, type, name); +} + + + +function KDChangeNPCRestraint(inv: NPCRestraint, newRes: string): NPCRestraint { + let rrr: NPCRestraint = { + lock: inv.lock, + name: newRes, + id: inv.id, + faction: inv.faction, + + inventoryVariant: inv.inventoryVariant, + powerbonus: inv.inventoryVariant ? KinkyDungeonRestraintVariants[inv.inventoryVariant]?.power : inv.powerbonus, + }; + if (inv.inventoryVariant && KinkyDungeonRestraintVariants[inv.inventoryVariant]) { + KinkyDungeonRestraintVariants[inv.inventoryVariant].template = newRes; + } + + if (inv.inventoryVariant) { + rrr.events = KDGetEventsForRestraint(newRes); + if (rrr.events && KinkyDungeonRestraintVariants[inv.inventoryVariant]?.events) + Object.assign(rrr.events, + JSON.parse(JSON.stringify(KinkyDungeonRestraintVariants[inv.inventoryVariant]?.events))); + } else if (inv.events) { + rrr.events = JSON.parse(JSON.stringify(inv.events)); + } + + Object.assign(inv, rrr); + return rrr; +} +/** + * Gets the total curse power rating of the player + * @param {boolean} activatedOnly + */ +function KDCurseCount(activatedOnly: boolean): number { + let restraints = KinkyDungeonAllRestraintDynamic(); + let data: KDEventData_CurseCount = { + restraints: restraints, + activatedOnly: activatedOnly, + count: 0, + }; + KinkyDungeonSendEvent("curseCount", data); + + return data.count; +} + +/** + * @param player + * @param requireSingleTag + * @param requireAllTags + * @param ignoregold + * @param ignoreShrine + * @param [forceIgnoreNonBinding] + */ +function KDGetTotalRestraintPower(_player: entity, requireSingleTag: string[], requireAllTags: string[], ignoregold: boolean, ignoreShrine: boolean, forceIgnoreNonBinding?: boolean): number { + let power = 0; + for (let inv of KinkyDungeonAllRestraintDynamic()) { + let item = inv.item; + let restraint = KDRestraint(item); + if (requireSingleTag.length > 0) { + if (!restraint.shrine || !requireSingleTag.some((tag) => {return restraint.shrine.includes(tag);})) { + continue; + } + } + if (requireAllTags.length > 0) { + if (!restraint.shrine || requireAllTags.some((tag) => {return !restraint.shrine.includes(tag);})) { + continue; + } + } + if (!KinkyDungeonAllowTagMatch(item, ignoregold, ignoreShrine, forceIgnoreNonBinding)) { + continue; + } + power += KinkyDungeonRestraintPower(item); + } + return power; +} + +function KDGetEscapeSFX(restraint: Named) { + if (KDRestraint(restraint).sfxEscape) return KDRestraint(restraint).sfxEscape; + if (KDRestraint(restraint).sfxGroup && KDSFXGroups[KDRestraint(restraint).sfxGroup]) { + return KDSFXGroups[KDRestraint(restraint).sfxGroup].sfxEscape; + } + return null; +} + +function KDGetRestraintSFX(restraint: Named) { + if (KDRestraint(restraint).sfx) return KDRestraint(restraint).sfx; + if (KDRestraint(restraint).sfxGroup && KDSFXGroups[KDRestraint(restraint).sfxGroup]) { + return KDSFXGroups[KDRestraint(restraint).sfxGroup].sfx; + } + return null; +} + +function KDGetFinishEscapeSFX(restraint: Named) { + if (KDRestraint(restraint).sfxFinishEscape) return KDRestraint(restraint).sfxFinishEscape; + if (KDRestraint(restraint).sfxGroup && KDSFXGroups[KDRestraint(restraint).sfxGroup]) { + return KDSFXGroups[KDRestraint(restraint).sfxGroup].sfxFinishEscape; + } + return null; +} +function KDGetRemoveSFX(restraint: Named) { + if (KDRestraint(restraint).sfxRemove) return KDRestraint(restraint).sfxRemove; + if (KDRestraint(restraint).sfxGroup && KDSFXGroups[KDRestraint(restraint).sfxGroup]) { + return KDSFXGroups[KDRestraint(restraint).sfxGroup].sfxRemove; + } + return null; +} + +/** + * @param item + * @param level + */ +function KDHasRemovableCurse(item: item, level: number): boolean { + if (item.curse && KDCurses[item.curse] && KDCurses[item.curse].level <= level) { + return true; + } + return false; +} + +/** + * @param item + * @param level + */ +function KDHasRemovableHex(item: item, level: number): boolean { + if (item.events && item.events.some((event) => { + return event.trigger == "CurseTransform" && KDEventHexModular[event.original] && KDEventHexModular[event.original].level <= level; + })) { + return true; + } + return false; +} + +/** + * @param item + * @param level + * @returns {KinkyDungeonEvent[]} + */ +function KDGetRemovableHex(item: item, level: number): KinkyDungeonEvent[] { + if (item.events) { + return item.events.filter((event) => { + return KDEventHexModular[event.original] && KDEventHexModular[event.original].level <= level; // event.trigger == "CurseTransform" && + }); + } + return []; +} + + +let KDRestraintDebugLog = []; + +/** + * The name of an item, includes TextGet call + * @param item + */ +function KDGetItemName(item: item, type?: string, variant?: any): string { + let base = TextGet("KinkyDungeonInventoryItem" + item.name); + switch(type || item.type) { + case Restraint: + case LooseRestraint: + base = TextGet("Restraint" + KDRestraint(item).name); + if (variant == undefined) + variant = KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]; + break; + case Consumable: + base = TextGet("KinkyDungeonInventoryItem" + KDConsumable(item).name); + if (variant == undefined) + variant = KinkyDungeonConsumableVariants[item.inventoryVariant || item.name]; + break; + case Weapon: + base = TextGet("KinkyDungeonInventoryItem" + KDWeapon(item).name); + if (variant == undefined) + variant = KinkyDungeonWeaponVariants[item.inventoryVariant || item.name]; + break; + } + let unidentified = KinkyDungeonStatsChoice.get("UnidentifiedWear") && KDIsUnidentified(item); + if (unidentified + && (item.type == LooseRestraint || item.type == Weapon || item.type == Consumable)) { + return TextGet("KDUnidentified") + base; + } + if (variant?.suffix) return base + " " + TextGet("KDVarSuff" + variant.suffix); + if (variant?.prefix) return TextGet("KDVarPref" + variant.prefix) + " " + base; + return base; +} + +/** + * @param restraint + * @param [variant] + */ +function KDGetRestraintName(restraint: restraint, variant?: ApplyVariant): string { + let base = TextGet("Restraint" + restraint.name); + if (variant?.suffix) return base + " " + TextGet("KDVarSuff" + variant.suffix); + if (variant?.prefix) return TextGet("KDVarPref" + variant.prefix) + " " + base; + return base; +} +/** + * @param consumable + * @param [variant] + */ +function KDGetConsumableName(consumable: consumable, variant?: ApplyVariant): string { + let base = TextGet("KinkyDungeonInventoryItem" + consumable.name); + if (variant?.suffix) return base + " " + TextGet("KDVarSuff" + variant.suffix); + if (variant?.prefix) return TextGet("KDVarPref" + variant.prefix) + " " + base; + return base; +} +/** + * @param weapon + * @param [variant] + */ +function KDGetWeaponName(weapon: weapon, variant?: ApplyVariant): string { + let base = TextGet("KinkyDungeonInventoryItem" + weapon.name); + if (variant?.suffix) return base + " " + TextGet("KDVarSuff" + variant.suffix); + if (variant?.prefix) return TextGet("KDVarPref" + variant.prefix) + " " + base; + return base; +} + +/** + * @param name + */ +function KDGetItemNameString(name: string): string { + let base = TextGet((KinkyDungeonGetRestraintByName(name) ? "Restraint" : "KinkyDungeonInventoryItem") + name); + let variant = KinkyDungeonRestraintVariants[name] || KinkyDungeonWeaponVariants[name] || KinkyDungeonConsumableVariants[name]; + if (variant) { + base = TextGet((KinkyDungeonGetRestraintByName(variant.template) ? "Restraint" : "KinkyDungeonInventoryItem") + variant.template); + } + if (variant?.suffix) return base + " " + TextGet("KDVarSuff" + variant.suffix); + if (variant?.prefix) return TextGet("KDVarPref" + variant.prefix) + " " + base; + return base; +} + + + +function KDGetEventsForRestraint(name: string): KinkyDungeonEvent[] { + if (!KDRestraint({name: name})) return []; + if (KinkyDungeonRestraintVariants[name]) return Object.assign([], KinkyDungeonRestraintVariants[name].events); + return Object.assign([], KDRestraint({name: name}).events || []); +} + + +/** + * @param item + * @param [includeItem] - Include 'item' + */ +function KDDynamicLinkList(item: item, includeItem?: boolean): item[] { + let ret = []; + if (includeItem) ret.push(item); + if (item && item.dynamicLink) { + let link = item.dynamicLink; + while (link) { + ret.push(link); + link = link.dynamicLink; + } + } + return ret; +} + +/** + * Returns a list of items on the 'surface' of a dynamic link, i.e items that can be accessed + * @param item + */ +function KDDynamicLinkListSurface(item: item): item[] { + // First we get the whole stack + let stack = []; + if (item && item.dynamicLink) { + let last = item; + let link = item.dynamicLink; + while (link) { + stack.push({item: link, host: last}); + last = link; + link = link.dynamicLink; + } + } + let ret = [item]; + let inaccess = false; + // Now that we have the stack we sum things up + for (let i = 0; i < stack.length; i++) { + let tuple = stack[i]; + let inv = tuple.item; + let host = tuple.host; + if (!inaccess && KDRestraint(host).inaccessible) inaccess = true; + if (!inaccess && KDRestraint(inv).alwaysInaccessible) inaccess = true; + + if ( KDRestraint(inv).alwaysAccessible || ( + !inaccess + && + ( + KDRestraint(host).UnderlinkedAlwaysRender || KDRestraint(host).accessible || KDRestraint(inv).alwaysRender || (KDRestraint(inv).renderWhenLinked && KDRestraint(host).shrine && KDRestraint(inv).renderWhenLinked.some((link) => {return KDRestraint(host).shrine.includes(link);})) + ) + ) + ) { + ret.push(inv); + } + } + return ret; +} + +/** + * @param restraint + * @param [index] + */ +function KDLinkSize(restraint: restraint, index?: number): number { + if (index != undefined && restraint.linkSizes) { + return restraint.linkSizes[index]; + } + return restraint.linkSize ? restraint.linkSize : 1; +} + +/** + * @param item + * @param linkCategory + * @param [ignoreItem] + * @param [power] - Ignore items with less power + */ +function KDLinkCategorySize(item: item, linkCategory: string, ignoreItem?: item, power?: number): number { + let total = 0; + // First we get the whole stack + let stack = [item]; + if (item && item.dynamicLink) { + let link = item.dynamicLink; + while (link) { + stack.push(link); + link = link.dynamicLink; + } + } + // Now that we have the stack we sum things up + for (let inv of stack) { + if (ignoreItem?.id != inv.id) { + if (KDRestraint(inv).linkCategory == linkCategory) { + if (!power || KinkyDungeonRestraintPower(inv, true, undefined) >= power) + total += KDLinkSize(KDRestraint(inv)); + } else if (KDRestraint(inv).linkCategories && KDRestraint(inv).linkCategories.includes(linkCategory)) { + if (!power || KinkyDungeonRestraintPower(inv, true, undefined) >= power) + total += KDLinkSize(KDRestraint(inv), KDRestraint(inv).linkCategories.indexOf(linkCategory)); + } + } + + } + return total; +} + +/** + * @param item + */ +function KDGetRestraintHost(item: item): item { + let host = KinkyDungeonGetRestraintItem(KDRestraint(item)?.Group); + let link = item.dynamicLink; + + while (link) { + if (link.id == item.id) return host; + host = link; + link = link.dynamicLink; + } + + + return host; +} + + +/** + * @param e + * @param item + */ +function KDLinkItemEvent(e: KinkyDungeonEvent, item: item, data: any): void { + let added = false; + if (data.restraintsAdded) { + for (let r of data.restraintsAdded) { + if (r.r.name === item.name) { + added = true; + break; + } + } + } + if (!added && (KDCanAddRestraint(KinkyDungeonGetRestraintByName(KDRestraint(item)?.Link), true, undefined, false, undefined, true, true))) { + let subMult = 1; + let chance = e.chance ? e.chance : 1.0; + if (e.subMult !== undefined) { + let rep = (KinkyDungeonGoddessRep.Ghost + 50) / 100; + subMult = 1.0 + e.subMult * rep; + } + if (e.tags?.includes("lowwill") && KinkyDungeonStatWill < 0.1) chance = 1.0; + if (item && KDRestraint(item).Link && (KDRandom() < chance * subMult) && (!e.noLeash || KDGameData.KinkyDungeonLeashedPlayer < 1)) { + let newRestraint = KinkyDungeonGetRestraintByName(KDRestraint(item).Link); + //KinkyDungeonLinkItem(newRestraint, item, item.tightness, ""); + if (KinkyDungeonAddRestraintIfWeaker(newRestraint, item.tightness, true, "", false, undefined, undefined, item.faction, true)) { + if (KDSoundEnabled() && e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); + } + } + } +} + +function KDGetRestriction(): number { + let data = { + restriction: 0 + }; + for (let inv of KinkyDungeonAllRestraintDynamic()) { + let restraint = KDRestraint(inv.item); + if (restraint) { + if (restraint.restriction) data.restriction += restraint.restriction; + if (restraint.blockfeet + || restraint.bindarms + || restraint.hobble + || restraint.freeze + ) data.restriction += 2; + else if ( + restraint.bindhands + || restraint.blindfold + || restraint.gag + || restraint.restricthands + ) data.restriction += 1; + } + } + + KinkyDungeonSendEvent("restriction", data); + + return data.restriction; +} + +/** + * @param item + * @param [Remover] + */ +function KDAlwaysKeep(item: item, Remover: entity): boolean { + let rest = KDRestraint(item); + let inventoryAs = item.inventoryVariant || (Remover?.player ? rest.inventoryAsSelf : rest.inventoryAs); + return rest.enchanted + || rest.armor + || rest.alwaysKeep + || (inventoryAs && KinkyDungeonRestraintVariants[inventoryAs] && !KinkyDungeonRestraintVariants[inventoryAs].noKeep); +} + + +/** + * Re-sorts the restraint stack so that items are in LinkPriority order + * @param Group + * @param [addedItem] + * @param [bypass] + * @param [securityEnemy] + */ +function KDResortRestraints(Group: string, addedItem: item, bypass: boolean, securityEnemy: entity) { + let item = KinkyDungeonGetRestraintItem(Group); + if (item) { + let pri = (inv: item) => { + return ((KDRestraint(inv).linkPriority*1000) || KinkyDungeonRestraintPower(inv, true) || 0); + }; + if (!addedItem) { + // Simplest case, just sort the tree + // Bubble sort is the best sorting algorithm + let tree = KDDynamicLinkList(item, true); + + let host = tree[0]; + let temp = null; + let n = tree.length; + let swapped = false; + for (let i = 0; i < n - 1; i++) { + for (let j = 0; j < n - i - 1; j++) { + tree[j+1].linkCache = undefined; + if (pri(tree[j]) < pri(tree[j+1])) { + if (KDCanLinkUnder(tree[j+1], KDRestraint(tree[j]), + bypass, false, securityEnemy, tree[j].lock, KDGetCurse(tree[j]), tree[j])) { + // Swap + tree[j].dynamicLink = tree[j+1].dynamicLink; + tree[j+1].dynamicLink = tree[j]; + temp = tree[j]; + tree[j] = tree[j+1]; + tree[j+1] = temp; + swapped = true; + } + } + + } + if (!swapped) { + break; + } + } + + + // Fix the links + host = tree[0]; + for (let iii = 0; iii < n; iii++) { + if (iii + 1 < n) + tree[iii].dynamicLink = tree[iii + 1]; + else tree[iii].dynamicLink = undefined; + } + KinkyDungeonInventoryRemove(item); + KinkyDungeonInventoryAdd(host); + } else if (addedItem) { + // Next simplest case, we move the added item in the position that makes the most sense + if (bypass) { + // Case where the security enemy had access + } else { + // Case where the security enemy did not have ability to do it + } + } else { + // Complex case, do a 'bubble sort' logic which is slow, but takes into account accessibility + } + } + // No item, no sort +} + +/** + * @param player + */ +function KDLockoutChance(player: entity): number { + let data = { + chance: 0, + bonus: 0, + player: player, + }; + if (player.player) { + data.chance = KDGameData.LockoutChance || 0; + KinkyDungeonSendEvent("calcLockout", data); + data.chance += data.bonus; + return data.chance; + } + return 1.0; +} + + + +/** + * @param player + * @param data + * @param [base] + */ +function KDLockoutGain(player: entity, data: any, base: number = 20): void { + data.lockoutgain = 0.75 * base * 0.01 + 0.01 * Math.round(KDRandom() * 0.5 * base); + if (player.player) { + KinkyDungeonSendEvent("calcLockoutGain", data); + } +} + + +function KDMaxCutDepth(threshold: number, cutBonus: number, origEscapeChance: number, origLimitChance: number): number { + return Math.min(1.4 * threshold, Math.max(0, Math.min( + 1.1, + 2.0 * (0.25 + cutBonus + origEscapeChance - + Math.max(0, origLimitChance) + )))); +} + + +function KDGetNecklaceGagType(player: entity) { + if (player.player) { + if (KinkyDungeonGetRestraintItem("ItemNeck")) { + let list = KDDynamicLinkList(KinkyDungeonGetRestraintItem("ItemNeck"), true); + for (let item of list) { + if (KDRestraint(item)?.necklaceGagType) return KDRestraint(item)?.necklaceGagType; + } + } + } else if (KDGameData.NPCRestraints[player.id + ""]) { + let items = KDGetNPCRestraints(player.id); + for (let slot of NPCBindingNeckSlots) { + if (items[slot]) { + if (KDRestraint(items[slot])?.necklaceGagType) return KDRestraint(items[slot])?.necklaceGagType; + } + } + } + + return ""; +} + +function KDAddFurnitureRestraintSet(entity: entity, restraintSet: Record, faction?: string, power: number = 5) { + let count = 0; + if (entity.player) { + for (let r of Object.entries(restraintSet)) { + for (let i = 0; i < r[1]; i++) { + let rest = KDGetRestraintWithVariants( + {tags: [r[0]]}, + KDGetEffLevel() + power, + (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), + !!KinkyDungeonStatsChoice.has("MagicHands"), + undefined, + false, + false, + !KinkyDungeonStatsChoice.has("TightRestraints"), + undefined, + false, + undefined, undefined, undefined, true); + if (rest) { + if (KinkyDungeonAddRestraintIfWeaker( + rest.r, power, !!KinkyDungeonStatsChoice.has("MagicHands"), + undefined, false, false, undefined, faction, true, + undefined, undefined, true, undefined, undefined, + undefined, rest.v + )) count++; + } + + } + } + } else { + for (let r of Object.entries(restraintSet)) { + for (let i = 0; i < r[1]; i++) + count += KDBindEnemyWithTags(entity.id, [r[0]], 30, power, true, undefined, undefined, undefined, undefined, faction).length; + } + } + return count; +} + + +function KDGetEquipDuration(restraint: string, player: entity) { + let bonus = 0; + if (KinkyDungeonIsHandsBound(true, !player.player)) bonus += 2; + if (KinkyDungeonIsArmsBound(true, !player.player)) bonus += 2; + return bonus + (KinkyDungeonGetRestraintByName(restraint)?.protection ? 4 : 1); +} + +function KDDoEquipDelayed(data: any, player: entity): string { + if (!player?.player) return ""; + let success = KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(data.name), 0, + true, "", + KinkyDungeonGetRestraintItem(data.Group) && !KinkyDungeonLinkableAndStricter(KinkyDungeonGetRestraintByName(data.currentItem), + KinkyDungeonGetRestraintByName(data.name)), false, data.events, data.faction, KDDebugLink, + data.curse, undefined, undefined, data.inventoryVariant, undefined, undefined, + undefined, undefined, true); + if (success) { + if (KDSoundEnabled()) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Unlock.ogg"); + let loose = KinkyDungeonInventoryGetLoose(data.name); + if (loose) { + if (!(loose.quantity > 1)) { + KinkyDungeonInventoryRemove(loose); + } else { + loose.quantity -= 1; + } + } + + let customEq = KDRestraint(loose).customEquip || ""; + let msg = "KinkyDungeonSelfBondage" + customEq; + if (!customEq) { + if (KDRestraint(loose).Group == "ItemVulvaPiercings" || KDRestraint(loose).Group == "ItemVulva" || KDRestraint(loose).Group == "ItemButt") { + if (KinkyDungeonIsChaste(false)) { + msg = "KinkyDungeonSelfBondagePlug"; + } + } else if (KDRestraint(loose).Group == "Item") { + if (KinkyDungeonIsChaste(true)) { + msg = "KinkyDungeonSelfBondageNipple"; + } + } else if (KDRestraint(loose).enchanted) { + msg = "KinkyDungeonSelfBondageEnchanted"; + } + } + + KinkyDungeonSendTextMessage(10, TextGet(msg).replace("RestraintName", TextGet("Restraint" + KDRestraint(loose).name)), "yellow", 1); + + return msg; + } else { + KinkyDungeonSendTextMessage(10, TextGet("KDCantEquip").replace("RestraintName", KDGetItemNameString(data.name)), "yellow", 1); + + return "KDCantEquip"; + } + +} + + +function KDResetPreferenceFlags() { + KinkyDungeonFlags.set("prefer_armbinder", 0); + KinkyDungeonFlags.set("prefer_boxbinder", 0); + KinkyDungeonFlags.set("prefer_jacket", 0); + KinkyDungeonFlags.set("prefer_yoke", 0); +} + +function KDGetPreferenceFlags(): string[] { + let select: string[] = []; + // remove if we have the no perk + if (!KinkyDungeonStatsChoice.get("Less_Armbinders")) + select.push("prefer_armbinder"); + if (!KinkyDungeonStatsChoice.get("Less_Boxbinders")) + select.push("prefer_boxbinder"); + if (!KinkyDungeonStatsChoice.get("Less_Jackets")) + select.push("prefer_jacket"); + if (!KinkyDungeonStatsChoice.get("Less_Yokes")) + select.push("prefer_yoke"); + + // Double up if we have the yes perk + if (KinkyDungeonStatsChoice.get("More_Armbinders")) + select.push("prefer_armbinder"); + if (KinkyDungeonStatsChoice.get("More_Boxbinders")) + select.push("prefer_boxbinder"); + if (KinkyDungeonStatsChoice.get("More_Jackets")) + select.push("prefer_jacket"); + if (KinkyDungeonStatsChoice.get("More_Yokes")) + select.push("prefer_yoke"); + + return select; +} + +function KDUpdatePreferenceFlags() { + KDResetPreferenceFlags(); + + let select: string[] = KDGetPreferenceFlags(); + + let selected = select.length > 0 ? select[Math.floor(KDRandom() * select.length)] : ""; + if (selected) { + KinkyDungeonFlags.set(selected, 0); + } +} \ No newline at end of file diff --git a/Game/src/restraint/KinkyDungeonRestraintsList.ts b/Game/src/restraint/KinkyDungeonRestraintsList.ts new file mode 100644 index 000000000..320c57fb8 --- /dev/null +++ b/Game/src/restraint/KinkyDungeonRestraintsList.ts @@ -0,0 +1,8549 @@ +"use strict"; + +let KDMagicLocks = ["Purple"]; // Magical locks +let KDKeyedLocks = ["Red", "White", "Blue"]; + +// LinkableBy array templates +let KDFeetRopeLink = ["Ties", "Hogties", "Wrapping", "Encase", "Belts"]; +let KDFormFitting = ["Socks", "Gloves"]; +let KDHarnessLink = ["Wrapping", "Encase", "HeavyCorsets", "Corsets", "ArmbinderHarness", "Ties", "Hogties", "Link", "Belts", "Belt", "Harnesses"]; +let KDCorsetLink = ["Wrapping", "Encase", "Harnesses", "ArmbinderHarness", "Ties", "Link", "Belts", "Belt"]; +let KDBindable = ["Wrapping", "Encase", "Harnesses", "Belts", "Belt", "Tape", "Ties", "Hogties", "Link", "Cuffs", "Boxties", "Wristties", "Crossties"]; // Things that can be wrapped in various restraints +let KDBindableMinusCuffs = KDBindable.filter((b) => {return b != "Cuffs";}); +let KDDevices = ["Armbinders", "Straitjackets", "Legbinders", "BindingDress", "Boxbinders", "Petsuits"]; // More complex devices +let KDElbowBind = ["Armbinders", "BindingDress", "Hogties"]; // More complex devices +let KDBoxBind = ["Boxbinders", "Hogties"]; // More complex devices +let KDWrappable = ["Wrapping", "Encase", "Belts", "Tape"]; // Things that can be wrapped in various restraints but not tied due to covering +let KDArmbinderLink = ["Armbinders", "Wrapping", "Encase", "Belts", "BindingDress", "Hogties", "Ties"]; // Standard link for an armbinder +let KDBoxbinderLink = ["Boxbinders", "Wrapping", "Encase", "Belts", "BindingDress", "Hogties", "Ties"]; // Standard link for a boxbinder +let KDDressLink = ["Armbinders", "Ties", "Link", "Wrapping", "Encase", "Belts", "BindingDress", "Hogties", "Straitjackets"]; +let KDJacketLink = ["Wrapping", "Encase", "Belts", "Hogties", "TransportJackets"]; // Standard link for an armbinder +let KDJacketRender = ["Wrapping", "Encase", "Belts", "BindingDress"]; // Standard link for an armbinder +let KDTransportLink = ["Wrapping", "Encase", "Belts", "Hogties"]; +let KDLegbinderLink = ["Belts", "Tape", "Wrapping", "Encase", "Hobbleskirts", "Socks"]; +let KDLegbinderRender = ["Belts", "Tape", "Wrapping", "Encase",]; +let KDLegRopesBind = ["Ties", "Link", "Legbinders", "Hobbleskirts", "Tape", "Belts", "Wrapping", "Encase", "HeavyCorsets", "Corsets"]; +let KDLegRopesRender = ["Belts", "Ties", "Link", "HeavyCorsets", "Corsets", "Legbinders", "Hobbleskirts"]; +let KDArmRopesRender = ["Armbinders", "Boxbinders", "Straitjackets", "Belts", "Ties", "Link", "Cuffs"]; +let KDBeltsBind = ["Wrapping", "Encase", "Ties", "Hogties", "Link", "Legbinders", "Hobbleskirts", "HeavyCorsets", "Corsets"]; +let KDBeltsRender = ["Ties", "Link", "Legbinders", "Hobbleskirts", "HeavyCorsets", "Corsets"]; // "Wrapping", "Encase", +let KDTapeLink = ["Wrapping", "Encase", "Belts", "Masks", "Mittens", "FlatGags"]; // Standard link for tape style items +let KDTapeRender = ["Wrapping", "Encase", "Tape", "Belts", "Masks", "Mittens", "FlatGags", "Ties", "Hogties", "Link", "Harnesses", "Corsets"]; // Standard link for tape style items +let KDRubberLink = ["Wrapping", "Encase", "Tape", "Belts", "Masks", "Mittens"]; // Standard link for rubber style items +let KDBlindfoldLink = ["Wrapping", "Encase", "Masks", "Tape"]; +let KDVisorLink = ["Wrapping", "Encase", "Masks", "Tape"]; +let KDWrappingLink = ["Masks", "Wrapping", "Encase",]; +let KDMaskLink = []; +let KDStuffingLink = ["BallGags", "FlatGags", "Stuffing", "Tape", "Wrapping", "Encase",]; +let KDBallGagLink = ["FlatGags", "Tape", "Wrapping", "Encase",]; +let KDFlatGagLink = ["FlatGags", "Tape", "Wrapping", "Encase",]; +let KDPlugGagLink = ["FlatGags", "Tape", "Wrapping", "Encase",]; +let KDCollarLink = ["HighCollars", "Collars", "Modules"]; +let KDCollarRender = ["Modules"]; +let KDHighCollarRender = ["Collars", "Modules"]; +let KDCollarModuleLink = ["Modules"]; +let KDGlovesLink = [...KDBindable, ...KDDevices, "Mittens"]; +let KDSocksLink = [...KDBindable, ...KDDevices, "Boots", "Heels"]; +let KDBeltLink = [...KDBindable, ...KDDevices]; // For ACTUAL belt, not chastity +//let KDCorsetRender = ["Harnesses", "ArmbinderHarness", "Ties", "Belts"]; + + + +/** + */ +const KinkyDungeonRestraints: restraint[] = [ + // region Scarf + {name: "ScarfArms", unlimited: true, accessible: true, debris: "Fabric", Asset: "DuctTape", Color: "#880022", Group: "ItemArms", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], bindarms: true, power: 0, weight: 0, escapeChance: {"Struggle": 0.5, "Cut": 0.9, "Remove": 0.2}, + affinity: {Remove: ["Hook"],}, + Filters: { + Tape: {"gamma":1.35,"saturation":1,"contrast":0.6,"brightness":0.6666666666666666,"red":1.9,"green":0.8333333333333333,"blue":1,"alpha":1}, + }, + sfxGroup: "Ropes", + factionFilters: { + Tape: {color: "LightNeutral", override: false}, + }, + Model: "TapeArms", + addTag: ["HandsBehind"], + enemyTags: {"scarfRestraints":2}, playerTags: {"ItemArmsFull":2}, minLevel: 0, allFloors: true, shrine: ["Rope", "Tape", "Boxties", ]}, + {name: "ScarfLegs", unlimited: true, accessible: true, debris: "Fabric", OverridePriority: 25.1, Asset: "DuctTape", Color: "#880022", Group: "ItemLegs", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], hobble: 1, addTag: ["FeetLinked"], power: 0, weight: 0, escapeChance: {"Struggle": 0.5, "Cut": 0.9, "Remove": 0.2}, + affinity: {Remove: ["Hook"],}, + Filters: { + Tape: {"gamma":1.35,"saturation":1,"contrast":0.6,"brightness":0.6666666666666666,"red":1.9,"green":0.8333333333333333,"blue":1,"alpha":1}, + }, + sfxGroup: "Ropes", + factionFilters: { + Tape: {color: "LightNeutral", override: false}, + }, + Model: "TapeLegs", + maxwill: 0.4, + enemyTags: {"scarfRestraints":2}, playerTags: {"ItemLegsFull":2}, minLevel: 0, allFloors: true, shrine: ["Rope", "Tape"]}, + {name: "ScarfFeet", unlimited: true, accessible: true, debris: "Fabric", Asset: "DuctTape", Color: "#880022", Group: "ItemFeet", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], blockfeet: true, addTag: ["FeetLinked"],power: 0, weight: 0, escapeChance: {"Struggle": 0.5, "Cut": 0.9, "Remove": 0.2}, + affinity: {Remove: ["Hook"],}, + Filters: { + Tape: {"gamma":1.35,"saturation":1,"contrast":0.6,"brightness":0.6666666666666666,"red":1.9,"green":0.8333333333333333,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "LightNeutral", override: false}, + }, + sfxGroup: "Ropes", + Model: "TapeAnkles", + maxwill: 0.1, + enemyTags: {"scarfRestraints":2}, playerTags: {"ItemFeetFull":2}, minLevel: 0, allFloors: true, shrine: ["Rope", "Tape"]}, + // Simple cloth stuff + {name: "ScarfGag", unlimited: true, Asset: "ScarfGag", debris: "Fabric", accessible: true, gag: 0.3, Type: "OTN", Color: "#880022", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, + affinity: {Remove: ["Hook"],}, + Filters: { + Cloth: {"gamma":1,"saturation":1,"contrast":1,"brightness":0.3833333333333333,"red":2.3666666666666667,"green":1,"blue":1,"alpha":1}, + }, + sfxGroup: "Ropes", + factionFilters: { + Cloth: {color: "LightNeutral", override: false}, + }, + Model: "ClothOTM", + enemyTags: {"scarfRestraints":8, "ropeAuxiliary": 1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Gags", "Tape"]}, + {name: "ScarfBlindfold", unlimited: true, Asset: "ScarfBlindfold", debris: "Fabric", accessible: true, Color: "#880022", Group: "ItemHead", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, + affinity: {Struggle: ["Sticky", "Hook"], Remove: ["Hook"],}, + Filters: { + Cloth: {"gamma":1,"saturation":1,"contrast":0.8333333333333333,"brightness":0.48333333333333334,"red":2.3666666666666667,"green":1,"blue":1,"alpha":1}, + }, + sfxGroup: "Ropes", + factionFilters: { + Cloth: {color: "LightNeutral", override: false}, + }, + Model: "ClothBlindfold", + blindfold: 2, enemyTags: {"scarfRestraints":8, "ropeAuxiliary": 1, "blindfoldSpell": 0.1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Rope", "Blindfolds", "Tape"]}, + // endregion + + // region Kigu + {inventory: true, name: "KiguMask", inaccessible: true, Asset: "KirugumiMask", Color: ["Default", "Default"], AssetGroup: "ItemHood", Group: "ItemHead", LinkableBy: [...KDMaskLink], gag: 0.3, blindfold: 1, power: 7, weight: 0, + Model: "KiguMask", + sfxGroup: "Rubber", + escapeChance: {"Struggle": -0.2, "Cut": -0.1, "Remove": 0.33, "Pick": 0.15, "Unlock": 0.6}, + enemyTags: {"kiguRestraints":1}, playerTags: {"ItemMouth1Full":2, "ItemMouth2Full":1, "NoKigu": -1000}, minLevel: 0, allFloors: true, shrine: ["Latex", "Masks", "Block_ItemMouth"], events: [ + //{trigger: "onWear", type: "setSkinColor"}, + ]}, + + {inventory: true, name: "KiguMaskSmile", inaccessible: true, Asset: "KirugumiMask", Color: ["Default", "Default"], AssetGroup: "ItemHood", Group: "ItemHead", LinkableBy: [...KDMaskLink], gag: 0.3, blindfold: 1, power: 7, weight: 0, + Model: "KiguMaskSmile", + sfxGroup: "Rubber", + escapeChance: {"Struggle": -0.2, "Cut": -0.1, "Remove": 0.33, "Pick": 0.15, "Unlock": 0.6}, + enemyTags: {"kiguRestraints":1}, playerTags: {"ItemMouth1Full":2, "ItemMouth2Full":1, "NoKigu": -1000}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Masks", "Block_ItemMouth"], events: [ + //{trigger: "onWear", type: "setSkinColor"}, + ]}, + // endregion + + // region Hood + {inventory: true, name: "LeatherHood", inaccessible: true, Color: ["Default", "Default"], + Group: "ItemHead", LinkableBy: [...KDMaskLink], gag: 0.7, blindfold: 3, power: 5, weight: 0, + Model: "LeatherHood", + sfxGroup: "Leather", + escapeChance: {"Struggle": -0.35, "Cut": -0.15, "Remove": 0.12, "Pick": 0.11, "Unlock": 0.7}, + enemyTags: {"sensedep":10}, + maxwill: 0.1, + playerTags: {"ItemMouth1Full":2, "ItemMouth2Full":1, "NoHood": -1000, NoSenseDep: -1000}, + minLevel: 0, allFloors: true, shrine: ["Leather", "Hoods", "Block_ItemMouth"], + deaf: 4, + }, + {inventory: true, name: "LeatherMask", inaccessible: true, Color: ["Default", "Default"], + Group: "ItemHead", LinkableBy: [...KDMaskLink], gag: 0.7, blindfold: 3, power: 5, weight: 0, + Model: "LeatherMask", + sfxGroup: "Leather", + escapeChance: {"Struggle": -0.35, "Cut": -0.15, "Remove": 0.12, "Pick": 0.11, "Unlock": 0.7}, + enemyTags: {"sensedep":10}, + maxwill: 0.1, + playerTags: {"ItemMouth1Full":2, "ItemMouth2Full":1, "Unmasked": -1000, NoSenseDep: -1000}, + minLevel: 0, allFloors: true, shrine: ["Leather", "Masks", "Block_ItemMouth"], + deaf: 4, + }, + // endregion + + //region Charms + // Not super punishing but would be hard to apply IRL + {inventory: true, name: "CharmRaw", + noRecycle: true, + requireSingleTagToEquip: ["Impossible"], + Asset: "", Color: "", + Group: "ItemDevices", power: 1, weight: -1000, + escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.05}, + enemyTags: {}, playerTags: {}, + recycleresource: { + Rope: 2, + }, + minLevel: 0, allFloors: true, shrine: ["Charms", "Tape", "Raw"]}, + {inventory: true, name: "DuctTapeRaw", + noRecycle: true, + requireSingleTagToEquip: ["Impossible"], + Asset: "", Color: "", + recycleresource: { + Rope: 1, + Latex: 1, + }, + Group: "ItemDevices", power: 1, weight: -1000, + escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.05}, + enemyTags: {}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["Tape", "Raw"]}, + {inventory: true, name: "DuctTapeCollar", debris: "Fabric", Asset: "LatexCollar2", factionColor: [[], [0]], Color: "Default", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: 4, DefaultLock: "Blue", + Model: "ElfCollarRestraint", + struggleBreak: true, + sfxGroup: "Rubber", + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + maxwill: 0.25, enemyTags: {"livingCollar":10}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["Collars","Tape"], + events: [{trigger: "tick", type: "livingRestraints", tags: ["ribbonRestraints"], cloneTags: [], inheritLinked: true, frequencyMax: 60, frequencyMin: 10, frequencyStep: 0.8, count: 4}] + }, + {inventory: true, name: "DuctTapeHands", unlimited: true, inaccessible: true, Asset: "DuctTape", Color: "Default", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHands", + factionColor: [[], [0]], + Model: "TapeHeavyHands", + disassembleAs: "DuctTapeRaw", + sfxGroup: "Rubber", + bindhands: 0.9, power: 1, weight: 0, escapeChance: {"Struggle": -0.1, "Cut": 0.4, "Remove": 0.4}, struggleMaxSpeed: {"Remove": 0.1}, + strictness: 0.05, strictnessZones: ["ItemHands"], failSuffix: {"Remove": "Tape"}, + maxwill: 0.6, enemyTags: {"tapeRestraints":8, "ropeAuxiliary": 4}, playerTags: {"ItemHandsFull": -4}, minLevel: 0, allFloors: true, shrine: ["Tape", "Wrapping"]}, + + {removePrison: true, name: "DuctTapeArms", unlimited: true, debris: "Fabric", accessible: true, Asset: "DuctTape", Color: "#AA2222", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemArms", bindarms: true, power: -2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeArms", + addTag: ["HandsBehind"], + disassembleAs: "CharmRaw", + sfxGroup: "Ropes", + Filters: { + Tape: {"gamma":0.18333333333333335,"saturation":1,"contrast":0.8333333333333333,"brightness":1.2166666666666668,"red":5,"green":1.607843137254902,"blue":2.3333333333333335,"alpha":1}, + }, + enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {"ItemArmsFull":8}, minLevel: 0, allFloors: true, shrine: ["Charms", "Tape", "Will"]}, + {removePrison: true, name: "DuctTapeFeet", unlimited: true, debris: "Fabric", accessible: true, Asset: "DuctTape", Color: "#AA2222", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: -2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeAnkles", + maxwill: 0.1, + disassembleAs: "CharmRaw", + sfxGroup: "Ropes", + Filters: { + Tape: {"gamma":0.18333333333333335,"saturation":1,"contrast":0.8333333333333333,"brightness":1.2166666666666668,"red":5,"green":1.607843137254902,"blue":2.3333333333333335,"alpha":1}, + }, + enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {"ItemLegsFull":8}, minLevel: 0, allFloors: true, shrine: ["Charms", "Tape", "Will"]}, + {removePrison: true, name: "DuctTapeBoots", unlimited: true, debris: "Fabric", inaccessible: true, Asset: "ToeTape", Type: "Full", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Color: "#AA2222", Group: "ItemBoots", blockfeet: true, addTag: ["FeetLinked"],power: -2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeHeavyBoots", + disassembleAs: "CharmRaw", + sfxGroup: "Ropes", + maxwill: 0.05, + Filters: { + Tape: {"gamma":0.18333333333333335,"saturation":1,"contrast":0.8333333333333333,"brightness":1.2166666666666668,"red":5,"green":1.607843137254902,"blue":2.3333333333333335,"alpha":1}, + }, + enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {"ItemFeetFull":8}, minLevel: 0, allFloors: true, shrine: ["Charms", "Wrapping", "Will"]}, + {removePrison: true, name: "DuctTapeLegs", OverridePriority: 25.1, unlimited: true, debris: "Fabric", accessible: true, Asset: "DuctTape", Color: "#AA2222", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: -2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeLegs", + maxwill: 0.4, + disassembleAs: "CharmRaw", + sfxGroup: "Ropes", + Filters: { + Tape: {"gamma":0.18333333333333335,"saturation":1,"contrast":0.8333333333333333,"brightness":1.2166666666666668,"red":5,"green":1.607843137254902,"blue":2.3333333333333335,"alpha":1}, + }, + enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {"ItemFeetFull":8}, minLevel: 0, allFloors: true, shrine: ["Charms", "Tape", "Will"]}, + {removePrison: true, name: "DuctTapeHead", unlimited: true, debris: "Fabric", inaccessible: true, Type: "Wrap", Asset: "DuctTape", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Color: "#AA2222", Group: "ItemHead", power: -2, blindfold: 3, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "BlindfoldTape", + disassembleAs: "CharmRaw", + sfxGroup: "Ropes", + quickBindCondition: "TapeBlindfold", + Filters: { + Tape: {"gamma":0.18333333333333335,"saturation":1,"contrast":0.8333333333333333,"brightness":1.2166666666666668,"red":5,"green":1.607843137254902,"blue":2.3333333333333335,"alpha":1}, + }, + enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {NoBlindfolds: -1000}, minLevel: 0, allFloors: true, shrine: ["Charms", "Tape", "Will"]}, + {removePrison: true, name: "DuctTapeMouth", unlimited: true, debris: "Fabric", Asset: "DuctTape", Color: "#AA2222", Group: "ItemMouth", AssetGroup: "ItemMouth2", gag: 0.5, power: -2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeWrapOver", + disassembleAs: "CharmRaw", + sfxGroup: "Ropes", + quickBindCondition: "TapeGag", + Filters: { + Tape: {"gamma":0.18333333333333335,"saturation":1,"contrast":0.8333333333333333,"brightness":1.2166666666666668,"red":5,"green":1.607843137254902,"blue":2.3333333333333335,"alpha":1}, + }, + LinkableBy: [...KDTapeLink], + renderWhenLinked: [...KDTapeRender], + enemyTags: {"ribbonRestraints":5, "ribbonRestraintsLight":5}, playerTags: {"ItemMouth1Full":8}, minLevel: 0, allFloors: true, shrine: ["Charms", "Gags", "Tape", "Will"]}, + + {removePrison: true, name: "DuctTapeHeadMummy", unlimited: true, debris: "Fabric", inaccessible: true, Asset: "LeatherSlimMask", LinkableBy: [...KDWrappingLink], renderWhenLinked: [...KDWrappingLink], Color: "#AA2222", Group: "ItemHead", gag: 0.5, blindfold: 4, power: 2, weight: 0, escapeChance: {"Struggle": 0.15, "Cut": 0.8, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeFace", + disassembleAs: "CharmRaw", + sfxGroup: "Ropes", + disassembleCount: 2, + Filters: { + Tape: {"gamma":0.18333333333333335,"saturation":1,"contrast":0.8333333333333333,"brightness":1.2166666666666668,"red":5,"green":1.607843137254902,"blue":2.3333333333333335,"alpha":1}, + }, + enemyTags: {"ribbonRestraints":1}, playerTags: {"ItemMouth1Full":2, "ItemMouth2Full":1, "Unmasked": -1000}, minLevel: 2, allFloors: true, shrine: ["Charms", "Wrapping", "Block_ItemMouth", "Will"]}, + {removePrison: true, name: "DuctTapeArmsMummy", unlimited: true, debris: "Fabric", inaccessible: true, Type: "Complete", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], + remove: ["Cloth", "ClothLower", "Tops"], + addTag: ["HandsBehind"], + disassembleAs: "CharmRaw", + sfxGroup: "Ropes", + disassembleCount: 2, + Asset: "DuctTape", Color: "#AA2222", Group: "ItemArms", bindarms: true, power: 2, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.8, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeHeavyArmsFull", + Filters: { + Tape: {"gamma":0.18333333333333335,"saturation":1,"contrast":0.8333333333333333,"brightness":1.2166666666666668,"red":5,"green":1.607843137254902,"blue":2.3333333333333335,"alpha":1}, + }, + enemyTags: {"ribbonRestraints":1}, playerTags: {"ItemArmsFull":3}, minLevel: 0, allFloors: true, shrine: ["Charms", "Wrapping", "Will"]}, + {removePrison: true, name: "DuctTapeLegsMummy", OverridePriority: 25.1, unlimited: true, debris: "Fabric", inaccessible: true, Type: "CompleteLegs", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], + remove: ["ClothLower", "Skirts"], Asset: "DuctTape", Color: "#AA2222", Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 2, weight: 0, escapeChance: {"Struggle": 0.15, "Cut": 0.8, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeHeavyBottomFull", + maxwill: 0.3, + disassembleAs: "CharmRaw", + sfxGroup: "Ropes", + disassembleCount: 2, + Filters: { + Tape: {"gamma":0.18333333333333335,"saturation":1,"contrast":0.8333333333333333,"brightness":1.2166666666666668,"red":5,"green":1.607843137254902,"blue":2.3333333333333335,"alpha":1}, + }, + enemyTags: {"ribbonRestraints":1}, playerTags: {"ItemLegsFull":3}, minLevel: 0, allFloors: true, shrine: ["Charms", "Hobbleskirts", "Wrapping", "Will"]}, + {removePrison: true, name: "DuctTapeFeetMummy", unlimited: true, debris: "Fabric", inaccessible: true, Type: "CompleteFeet", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Asset: "DuctTape", Color: "#AA2222", Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 2, weight: 0, escapeChance: {"Struggle": 0.15, "Cut": 0.8, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeHeavyAnkles", + maxwill: 0.1, + disassembleAs: "CharmRaw", + sfxGroup: "Ropes", + disassembleCount: 2, + Filters: { + Tape: {"gamma":0.18333333333333335,"saturation":1,"contrast":0.8333333333333333,"brightness":1.2166666666666668,"red":5,"green":1.607843137254902,"blue":2.3333333333333335,"alpha":1}, + }, + enemyTags: {"ribbonRestraints":1}, playerTags: {"ItemFeetFull":3}, minLevel: 0, allFloors: true, shrine: ["Charms", "Wrapping", "Will"]}, + //endregion + + // region Bubbles + {removePrison: true, name: "BubbleHead", unlimited: true, debris: "Water", inaccessible: true, Asset: "DuctTape", + Color: "#2277ee", Group: "ItemHead", power: 2, blindfold: 3, weight: 0, + escapeChance: {"Struggle": -0.1, "Cut": 1.0, "Remove": -0.5}, + Model: "BubbleHead", + tightType: "Thick", + events: [ + {trigger: "postApply", type: "BubbleCombine", count: 3, inheritLinked: true}, + ], + enemyTags: {"aquaRestraints":50}, playerTags: {"Furniture": -100}, minLevel: 0, allFloors: true, shrine: ["CombineBubble1", "Elements", "Encase", "Bubble", "Block_ItemMouth", "Block_ItemEars"]}, + {removePrison: true, name: "BubbleArms", unlimited: true, debris: "Water", inaccessible: true, Asset: "DuctTape", + Color: "#2277ee", Group: "ItemArms", power: 2, bindarms: true, weight: 0, + escapeChance: {"Struggle": -0.1, "Cut": 1.0, "Remove": -0.5}, + Model: "BubbleArms", + tightType: "Thick", + events: [ + {trigger: "postApply", type: "BubbleCombine", count: 3, inheritLinked: true}, + ], + enemyTags: {"aquaRestraints":1}, playerTags: {"Furniture": -100}, minLevel: 0, allFloors: true, shrine: ["CombineBubble2", "Elements", "Encase", "Bubble", "Block_ItemHands", "Block_ItemBreast", "Block_ItemNipples"]}, + + {removePrison: true, name: "BubbleLegs", unlimited: true, debris: "Water", inaccessible: true, Asset: "DuctTape", + Color: "#2277ee", Group: "ItemLegs", power: 2, weight: 0, hobble: 2, heelpower: 10, + maxwill: 0.5, + escapeChance: {"Struggle": -0.1, "Cut": 1.0, "Remove": -0.5}, + Model: "BubbleLegs", + tightType: "Thick", + events: [ + {trigger: "postApply", type: "BubbleCombine", count: 3, inheritLinked: true}, + ], + enemyTags: {"aquaRestraints":25}, playerTags: {"Furniture": -100}, minLevel: 0, allFloors: true, shrine: ["CombineBubble3", "Elements", "DiscourageKneel", "Encase", "Bubble", "Block_ItemFeet", "Block_ItemBoots", "Block_ItemPelvis", "Block_ItemVulva", "Block_ItemVulvaPiercings"]}, + + //endregion + + //region BlessedWrappings + {inventory: true, name: "MysticDuctTapeCollar", debris: "FabricGreen", Asset: "LatexCollar2", factionColor: [[], [0]], Color: "Default", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: 4, DefaultLock: "Blue", + Model: "ElfCollarRestraint", + struggleBreak: true, + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + tightType: "Secure", + maxwill: 0.25, enemyTags: {"livingCollar":10}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["MysticDuctTape", "Collars","Will"], + events: [{trigger: "tick", type: "livingRestraints", tags: ["mummyRestraints"], cloneTags: [], inheritLinked: true, frequencyMax: 60, frequencyMin: 10, frequencyStep: 0.8, count: 4}] + }, + {inventory: true, name: "MysticDuctTapeRaw", + noRecycle: true, + requireSingleTagToEquip: ["Impossible"], + Asset: "", Color: "", + Group: "ItemDevices", power: 1, weight: -1000, + escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.05}, + enemyTags: {}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["MysticDuctTape", "Charms", "Tape", "Raw"]}, + {removePrison: true, name: "MysticDuctTapeHead", unlimited: true, debris: "FabricGreen", inaccessible: true, Type: "Wrap", Asset: "DuctTape", Color: "#55AA22", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHead", blindfold: 4, power: 1, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": 0.6, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeFace", + disassembleAs: "MysticDuctTapeRaw", + sfxGroup: "Rubber", + quickBindCondition: "TapeBlindfold", + recycleresource: { + Rope: 2, + Latex: 1, + }, + Filters: { + Tape: {"gamma":1,"saturation":1,"contrast":1.2666666666666668,"brightness":0.6666666666666666,"red":1,"green":1.6833333333333333,"blue":0.6666666666666666,"alpha":1}, + }, + enemyTags: {"mummyRestraints":-499}, playerTags: {"ItemHeadFull":99, "ItemMouthFull":99, "ItemArmsFull":99, "ItemLegsFull":99, "ItemFeetFull":99, "ItemBootsFull":99, NoBlindfolds: 99, Unmasked: -1000}, minLevel: 0, allFloors: true, shrine: ["MysticDuctTape", "Charms", "Wrapping", "Block_ItemMouth", "Will"]}, + {removePrison: true, name: "MysticDuctTapeEyes", unlimited: true, debris: "FabricGreen", inaccessible: true, Type: "Wrap", Asset: "DuctTape", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Color: "#AA2222", Group: "ItemHead", power: 3, blindfold: 3, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.9, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "BlindfoldTape", + disassembleAs: "MysticDuctTapeRaw", + sfxGroup: "Rubber", + Filters: { + Tape: {"gamma":1,"saturation":1,"contrast":1.2666666666666668,"brightness":0.6666666666666666,"red":1,"green":1.6833333333333333,"blue":0.6666666666666666,"alpha":1}, + }, + enemyTags: {"mummyRestraints":-399}, playerTags: {"ItemMouthFull":99, "ItemArmsFull":99, "ItemLegsFull":99, "ItemFeetFull":99, "ItemBootsFull":99, NoBlindfolds: -1000}, minLevel: 0, allFloors: true, shrine: ["MysticDuctTape", "Charms", "Tape", "Will"]}, + {removePrison: true, name: "MysticDuctTapeMouth", unlimited: true, debris: "FabricGreen", inaccessible: true, Asset: "DuctTape", Color: "#55AA22", Group: "ItemMouth", AssetGroup: "ItemMouth2", gag: 0.5, power: 1, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": 0.6, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeFull", + LinkableBy: [...KDTapeLink], + disassembleAs: "MysticDuctTapeRaw", + sfxGroup: "Rubber", + renderWhenLinked: [...KDTapeRender], + quickBindCondition: "TapeGag", + Filters: { + Tape: {"gamma":1,"saturation":1,"contrast":1.2666666666666668,"brightness":0.6666666666666666,"red":1,"green":1.6833333333333333,"blue":0.6666666666666666,"alpha":1}, + }, + enemyTags: {"mummyRestraints":-299}, playerTags: {"ItemArmsFull":99, "ItemLegsFull":99, "ItemFeetFull":99, "ItemBootsFull":99}, minLevel: 0, allFloors: true, shrine: ["MysticDuctTape", "Charms", "Gags", "Wrapping", "Will"]}, + {removePrison: true, name: "MysticDuctTapeArmsMummy", unlimited: true, debris: "FabricGreen", inaccessible: true, Type: "Complete", remove: ["Cloth", "ClothLower", "Tops"], LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Asset: "DuctTape", Color: "#55AA22", Group: "ItemArms", bindarms: true, power: 3, weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.5, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeHeavyArmsFull", + addTag: ["HandsBehind"], + disassembleAs: "MysticDuctTapeRaw", + sfxGroup: "Rubber", + disassembleCount: 2, + Filters: { + Tape: {"gamma":1,"saturation":1,"contrast":1.2666666666666668,"brightness":0.6666666666666666,"red":1,"green":1.6833333333333333,"blue":0.6666666666666666,"alpha":1}, + }, + enemyTags: {"mummyRestraints":-199}, playerTags: {"ItemLegsFull":99, "ItemFeetFull":99, "ItemBootsFull":99}, minLevel: 0, allFloors: true, shrine: ["MysticDuctTape", "Charms", "Wrapping", "Will"]}, + {removePrison: true, name: "MysticDuctTapeLegsMummy", unlimited: true, OverridePriority: 25.1, debris: "FabricGreen", inaccessible: true, Type: "CompleteLegs", remove: ["ClothLower", "Skirts"], LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Asset: "DuctTape", Color: "#55AA22", Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 3, weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.5, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeHeavyBottomFull", + maxwill: 0.3, + disassembleAs: "MysticDuctTapeRaw", + sfxGroup: "Rubber", + disassembleCount: 2, + Filters: { + Tape: {"gamma":1,"saturation":1,"contrast":1.2666666666666668,"brightness":0.6666666666666666,"red":1,"green":1.6833333333333333,"blue":0.6666666666666666,"alpha":1}, + }, + enemyTags: {"mummyRestraints":-99}, playerTags: {"ItemFeetFull":99, "ItemBootsFull":99}, minLevel: 0, allFloors: true, shrine: ["MysticDuctTape", "Charms", "Hobbleskirts", "Will", "Wrapping", "Encase",]}, + {removePrison: true, name: "MysticDuctTapeFeetMummy", unlimited: true, debris: "FabricGreen", inaccessible: true, Type: "CompleteFeet", Asset: "DuctTape", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Color: "#55AA22", Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 3, weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.5, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeHeavyAnkles", + maxwill: 0.1, + disassembleAs: "MysticDuctTapeRaw", + sfxGroup: "Rubber", + disassembleCount: 2, + Filters: { + Tape: {"gamma":1,"saturation":1,"contrast":1.2666666666666668,"brightness":0.6666666666666666,"red":1,"green":1.6833333333333333,"blue":0.6666666666666666,"alpha":1}, + }, + enemyTags: {"mummyRestraints":-1}, playerTags: {"ItemBootsFull":99}, minLevel: 0, allFloors: true, shrine: ["MysticDuctTape", "Charms", "Wrapping", "Will"]}, + {removePrison: true, name: "MysticDuctTapeBoots", unlimited: true, debris: "FabricGreen", inaccessible: true, Asset: "ToeTape", Type: "Full", Color: "#55AA22", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemBoots", blockfeet: true, addTag: ["FeetLinked"],power: 3, weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.5, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeHeavyBoots", + maxwill: 0.05, + disassembleAs: "MysticDuctTapeRaw", + sfxGroup: "Rubber", + disassembleCount: 2, + Filters: { + Tape: {"gamma":1,"saturation":1,"contrast":1.2666666666666668,"brightness":0.6666666666666666,"red":1,"green":1.6833333333333333,"blue":0.6666666666666666,"alpha":1}, + }, + enemyTags: {"mummyRestraints":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["MysticDuctTape", "Charms", "Wrapping", "Will"]}, + {inventory: true, name: "MysticDuctTapeHands", unlimited: true, inaccessible: true, Asset: "DuctTape", Color: "Default", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHands", + Filters: { + Tape: {"gamma":1,"saturation":1,"contrast":1.2666666666666668,"brightness":0.6666666666666666,"red":1,"green":1.6833333333333333,"blue":0.6666666666666666,"alpha":1}, + }, + Model: "TapeHeavyHands", + disassembleAs: "MysticDuctTapeRaw", + sfxGroup: "Rubber", + bindhands: 0.9, power: 3, weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.5, "Remove": 0}, + strictness: 0.05, strictnessZones: ["ItemHands"], failSuffix: {"Remove": "Tape"}, + maxwill: 0.6, enemyTags: {"mummyRestraints":100}, playerTags: {"ItemHandsFull": -4}, minLevel: 0, allFloors: true, shrine: ["MysticDuctTape", "Charms", "Wrapping", "Will"]}, + + + //endregion + + //region AutoTape + {inventory: true, name: "AutoTapeCollar", Asset: "LatexCollar2", factionColor: [[], [0]], Color: "Default", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: 4, DefaultLock: "Blue", + Model: "ElfCollarRestraint", + struggleBreak: true, + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + tightType: "Secure", + maxwill: 0.25, enemyTags: {"livingCollar":10}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["AutoTape", "Collars","Tape"], + events: [{trigger: "tick", type: "livingRestraints", tags: ["autoTape"], cloneTags: [], inheritLinked: true, frequencyMax: 60, frequencyMin: 10, frequencyStep: 0.8, count: 4}] + }, + {inventory: true, name: "AutoTapeRaw", + noRecycle: true, + requireSingleTagToEquip: ["Impossible"], + Asset: "", Color: "", + recycleresource: { + Rope: 1, + Latex: 2, + }, + Group: "ItemDevices", power: 1, weight: -1000, + escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.05}, + enemyTags: {}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["AutoTape", "Tape", "Raw"]}, + + {inventory: true, name: "AutoTapeHands", unlimited: true, inaccessible: true, Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHands", + Model: "TapeHeavyHands", + disassembleAs: "AutoTapeRaw", + sfxGroup: "Rubber", + Filters: { + Tape: {"gamma":0.8333333333333333,"saturation":0.9833333333333333,"contrast":1.4166666666666665,"brightness":0.7833333333333334,"red":1,"green":1.4333333333333333,"blue":3.216666666666667,"alpha":1}, + }, + bindhands: 1.0, power: 6, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0.}, struggleMaxSpeed: {"Remove": 0.1}, failSuffix: {"Remove": "Tape"}, + strictness: 0.1, strictnessZones: ["ItemHands"], limitChance: {Struggle: 0.12}, + maxwill: 0.6, enemyTags: {"autoTape":8}, playerTags: {"ItemHandsFull": -4}, minLevel: 8, allFloors: true, shrine: ["AutoTape", "Tape"]}, + {removePrison: true, name: "AutoTapeArms", unlimited: true, accessible: true, Type: "Top", Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemArms", + Model: "TapeStrappedArms", + addTag: ["HandsBehind"], + disassembleAs: "AutoTapeRaw", + sfxGroup: "Rubber", + Filters: { + Tape: {"gamma":0.8333333333333333,"saturation":0.9833333333333333,"contrast":1.4166666666666665,"brightness":0.7833333333333334,"red":1,"green":1.4333333333333333,"blue":3.216666666666667,"alpha":1}, + }, + bindarms: true, power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + enemyTags: {"autoTape":10}, playerTags: {"ItemArmsFull":8}, minLevel: 0, allFloors: true, shrine: ["AutoTape", "Tape"]}, + {removePrison: true, name: "AutoTapeFeet", unlimited: true, accessible: true, Asset: "DuctTape", Color: "#6E9FA3", Group: "ItemFeet", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], blockfeet: true, addTag: ["FeetLinked"],power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeMedAnkles", + Filters: { + Tape: {"gamma":0.8333333333333333,"saturation":0.9833333333333333,"contrast":1.4166666666666665,"brightness":0.7833333333333334,"red":1,"green":1.4333333333333333,"blue":3.216666666666667,"alpha":1}, + }, + disassembleAs: "AutoTapeRaw", + enemyTags: {"autoTape":10}, playerTags: {"ItemLegsFull":8}, minLevel: 0, allFloors: true, shrine: ["AutoTape", "Tape"]}, + {removePrison: true, name: "AutoTapeBoots", unlimited: true, accessible: true, Asset: "ToeTape", Type: "Full", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemBoots", blockfeet: true, addTag: ["FeetLinked"],power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeMedBoots", + disassembleAs: "AutoTapeRaw", + sfxGroup: "Rubber", + Filters: { + Tape: {"gamma":0.8333333333333333,"saturation":0.9833333333333333,"contrast":1.4166666666666665,"brightness":0.7833333333333334,"red":1,"green":1.4333333333333333,"blue":3.216666666666667,"alpha":1}, + }, + enemyTags: {"autoTape":10}, playerTags: {"ItemFeetFull":8}, minLevel: 0, allFloors: true, shrine: ["AutoTape", "Tape", "Wrapping", "Encase",]}, + {removePrison: true, name: "AutoTapeLegs", unlimited: true, accessible: true, Type: "MostLegs", Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeMedLegs", + disassembleAs: "AutoTapeRaw", + sfxGroup: "Rubber", + Filters: { + Tape: {"gamma":0.8333333333333333,"saturation":0.9833333333333333,"contrast":1.4166666666666665,"brightness":0.7833333333333334,"red":1,"green":1.4333333333333333,"blue":3.216666666666667,"alpha":1}, + }, + enemyTags: {"autoTape":10}, playerTags: {"ItemFeetFull":8}, minLevel: 0, allFloors: true, shrine: ["AutoTape", "Tape"]}, + {removePrison: true, name: "AutoTapeHead", unlimited: true, inaccessible: true, Type: "Wrap", Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHead", power: 5, blindfold: 4, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "BlindfoldTape", + disassembleAs: "AutoTapeRaw", + sfxGroup: "Rubber", + quickBindCondition: "TapeBlindfold", + Filters: { + Tape: {"gamma":0.8333333333333333,"saturation":0.9833333333333333,"contrast":1.4166666666666665,"brightness":0.7833333333333334,"red":1,"green":1.4333333333333333,"blue":3.216666666666667,"alpha":1}, + }, + enemyTags: {}, playerTags: {NoBlindfolds: -1000}, minLevel: 0, allFloors: true, shrine: ["AutoTape", "Tape"]}, + {removePrison: true, name: "AutoTapeMouth", unlimited: true, accessible: true, Asset: "DuctTape", Type: "Double", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemMouth", AssetGroup: "ItemMouth2", gag: 0.5, power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeWrapOver", + disassembleAs: "AutoTapeRaw", + sfxGroup: "Rubber", + quickBindCondition: "TapeGag", + Filters: { + Tape: {"gamma":0.8333333333333333,"saturation":0.9833333333333333,"contrast":1.4166666666666665,"brightness":0.7833333333333334,"red":1,"green":1.4333333333333333,"blue":3.216666666666667,"alpha":1}, + }, + enemyTags: {"autoTape":10}, playerTags: {"ItemMouth1Full":8}, minLevel: 0, allFloors: true, shrine: ["AutoTape", "Gags", "Tape"]}, + {removePrison: true, name: "AutoTapeMouthFull", unlimited: true, accessible: true, Asset: "DuctTape", Type: "Double", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemMouth", AssetGroup: "ItemMouth2", gag: 0.5, power: 5, weight: 0, + escapeChance: {"Struggle": 0.0, "Cut": 0.2, "Remove": -.1}, failSuffix: {"Remove": "Tape"}, + Model: "TapeFullOver", + disassembleAs: "AutoTapeRaw", + sfxGroup: "Rubber", + Filters: { + Tape: {"gamma":0.8333333333333333,"saturation":0.9833333333333333,"contrast":1.4166666666666665,"brightness":0.7833333333333334,"red":1,"green":1.4333333333333333,"blue":3.216666666666667,"alpha":1}, + }, + enemyTags: {"autoTape":10}, playerTags: {"ItemMouth1Full":8}, minLevel: 0, allFloors: true, shrine: ["AutoTape", "Gags", "Tape", "Wrapping", "Encase"]}, + //endregion + + + //region VinylTape + {inventory: true, name: "VinylTapeCollar", Asset: "LatexCollar2", factionColor: [[], [0]], Color: "Default", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: 4, DefaultLock: "Blue", + Model: "ElfCollarRestraint", + struggleBreak: true, + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + tightType: "Secure", + sfxGroup: "Rubber", + maxwill: 0.25, enemyTags: {"livingCollar":10}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["VinylTape", "Collars","Tape"], + events: [{trigger: "tick", type: "livingRestraints", tags: ["vinylTape"], cloneTags: [], inheritLinked: true, frequencyMax: 60, frequencyMin: 10, frequencyStep: 0.8, count: 4}] + }, + {inventory: true, name: "VinylTapeRaw", + noRecycle: true, + requireSingleTagToEquip: ["Impossible"], + Asset: "", Color: "", + recycleresource: { + Latex: 2, + }, + Group: "ItemDevices", power: 1, weight: -1000, + escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.05}, + enemyTags: {}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["VinylTape", "Tape", "Raw"]}, + + {inventory: true, name: "VinylTapeHands", unlimited: true, inaccessible: true, Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHands", + Model: "TapeHeavyHands", + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + bindhands: 1.0, power: 6, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0.}, struggleMaxSpeed: {"Remove": 0.1}, failSuffix: {"Remove": "Tape"}, + strictness: 0.1, strictnessZones: ["ItemHands"], limitChance: {Struggle: 0.12}, + maxwill: 0.6, enemyTags: {"vinylTape":8}, playerTags: {"ItemHandsFull": -4}, minLevel: 8, allFloors: true, shrine: ["VinylTape", "Tape", "Latex"]}, + {removePrison: true, name: "VinylTapeArms", unlimited: true, accessible: true, Type: "Top", Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemArms", + Model: "TapeStrappedArms", + addTag: ["HandsBehind"], + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + bindarms: true, power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + enemyTags: {"vinylTape":10}, playerTags: {"ItemArmsFull":8}, minLevel: 0, allFloors: true, shrine: ["VinylTape", "Tape", "Latex"]}, + {removePrison: true, name: "VinylTapeFeet", unlimited: true, accessible: true, Asset: "DuctTape", Color: "#6E9FA3", Group: "ItemFeet", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], blockfeet: true, addTag: ["FeetLinked"],power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeMedAnkles", + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + enemyTags: {"vinylTape":10}, playerTags: {"ItemLegsFull":8}, minLevel: 0, allFloors: true, shrine: ["VinylTape", "Tape", "Latex"]}, + {removePrison: true, name: "VinylTapeBoots", unlimited: true, accessible: true, Asset: "ToeTape", Type: "Full", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemBoots", blockfeet: true, addTag: ["FeetLinked"],power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeMedBoots", + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + enemyTags: {"vinylTape":10}, playerTags: {"ItemFeetFull":8}, minLevel: 0, allFloors: true, shrine: ["VinylTape", "Tape", "Wrapping", "Encase", "Latex"]}, + {removePrison: true, name: "VinylTapeLegs", unlimited: true, accessible: true, Type: "MostLegs", Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 5, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeMedLegs", + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + enemyTags: {"vinylTape":10}, playerTags: {"ItemFeetFull":8}, minLevel: 0, allFloors: true, shrine: ["VinylTape", "Tape", "Latex"]}, + {removePrison: true, name: "VinylTapeHead", unlimited: true, inaccessible: true, Type: "Wrap", Asset: "DuctTape", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHead", power: 5, blindfold: 4, weight: 0, escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "BlindfoldTape", + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + quickBindCondition: "TapeBlindfold", + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + enemyTags: {}, playerTags: {NoBlindfolds: -1000}, minLevel: 0, allFloors: true, shrine: ["VinylTape", "Tape", "Latex"]}, + {removePrison: true, name: "VinylTapeMouth", unlimited: true, accessible: true, Asset: "DuctTape", Type: "Double", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemMouth", AssetGroup: "ItemMouth2", gag: 0.5, power: 5, weight: 0, + escapeChance: {"Struggle": 0.1, "Cut": 0.2, "Remove": 0}, failSuffix: {"Remove": "Tape"}, + Model: "TapeWrapOver", + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + quickBindCondition: "TapeGag", + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + enemyTags: {"vinylTape":10}, playerTags: {"ItemMouth1Full":8}, minLevel: 0, allFloors: true, shrine: ["VinylTape", "Gags", "Tape", "Latex"]}, + {removePrison: true, name: "VinylTapeMouthFull", unlimited: true, accessible: true, Asset: "DuctTape", Type: "Double", Color: "#6E9FA3", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemMouth", AssetGroup: "ItemMouth2", gag: 0.5, power: 5, weight: 0, + escapeChance: {"Struggle": 0.0, "Cut": 0.2, "Remove": -.1}, failSuffix: {"Remove": "Tape"}, + Model: "TapeFullOver", + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + enemyTags: {"vinylTape":10}, playerTags: {"ItemMouth1Full":8}, minLevel: 0, allFloors: true, shrine: ["VinylTape", "Gags", "Tape", "Latex", "Wrapping", "Encase"]}, + + + {removePrison: true, name: "VinylTapeHeadMummy", unlimited: true, debris: "Fabric", inaccessible: true, Asset: "LeatherSlimMask", LinkableBy: [...KDWrappingLink], renderWhenLinked: [...KDWrappingLink], Color: "#AA2222", Group: "ItemHead", gag: 0.5, blindfold: 4, power: 2, weight: 0, + escapeChance: {"Struggle": 0.0, "Cut": 0.2, "Remove": -.1}, failSuffix: {"Remove": "Tape"}, + Model: "TapeFace", + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + disassembleCount: 2, + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + enemyTags: {"vinylTapeMummyHead":1}, playerTags: {"ItemMouth1Full":2, "ItemMouth2Full":1, "Unmasked": -1000}, minLevel: 2, allFloors: true, shrine: ["VinylTape", "Wrapping", "Block_ItemMouth", "Latex"]}, + {removePrison: true, name: "VinylTapeArmsMummy", unlimited: true, debris: "Fabric", inaccessible: true, Type: "Complete", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], + remove: ["Cloth", "ClothLower", "Tops"], + addTag: ["HandsBehind"], + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + disassembleCount: 2, + Asset: "VinylTape", Color: "#AA2222", Group: "ItemArms", bindarms: true, power: 2, weight: 0, + escapeChance: {"Struggle": 0.0, "Cut": 0.2, "Remove": -.1}, failSuffix: {"Remove": "Tape"}, + Model: "TapeHeavyArmsFull", + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + enemyTags: {"vinylTapeMummy":1}, playerTags: {"ItemArmsFull":3}, minLevel: 0, allFloors: true, shrine: ["VinylTape", "Wrapping", "Latex"]}, + {removePrison: true, name: "VinylTapeLegsMummy", OverridePriority: 25.1, unlimited: true, debris: "Fabric", inaccessible: true, Type: "CompleteLegs", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], + remove: ["ClothLower", "Skirts"], Asset: "VinylTape", Color: "#AA2222", Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 2, weight: 0, + escapeChance: {"Struggle": 0.0, "Cut": 0.2, "Remove": -.1}, failSuffix: {"Remove": "Tape"}, + Model: "TapeHeavyBottomFull", + maxwill: 0.3, + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + disassembleCount: 2, + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + enemyTags: {"vinylTapeMummy":1}, playerTags: {"ItemLegsFull":3}, minLevel: 0, allFloors: true, shrine: ["VinylTape", "Hobbleskirts", "Wrapping", "Latex"]}, + {removePrison: true, name: "VinylTapeFeetMummy", unlimited: true, debris: "Fabric", inaccessible: true, Type: "CompleteFeet", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Asset: "VinylTape", Color: "#AA2222", Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 2, weight: 0, + escapeChance: {"Struggle": 0.0, "Cut": 0.2, "Remove": -.1}, failSuffix: {"Remove": "Tape"}, + Model: "TapeHeavyAnkles", + maxwill: 0.1, + disassembleAs: "VinylTapeRaw", + sfxGroup: "Rubber", + disassembleCount: 2, + Filters: { + Tape: {"gamma":0.21666666666666667,"saturation":1,"contrast":1.0166666666666666,"brightness":1.6833333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Tape: {color: "Highlight", override: false}, + }, + enemyTags: {"vinylTapeMummy":1}, playerTags: {"ItemFeetFull":3}, minLevel: 0, allFloors: true, shrine: ["VinylTape", "Wrapping", "Latex"]}, + + + //endregion + + + + {forceRemovePrison: true, name: "ShadowHandMouth", unlimited: true, alwaysAccessible: true, tether: 1.5, Asset: "DuctTape", Type: "Double", Color: ["#3c115c"], Group: "ItemMouth", AssetGroup: "ItemMouth3", gag: 0.5, + Model: "ShadowHandsMouth", + power: 4, weight: 0, escapeChance: {"Struggle": 0.5, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, + enemyTags: {"shadowHands":10, "shadowBolt": 10}, playerTags: {"ItemMouth1Full":-9}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Wrapping", "Shadow", "Illusion"], + events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, + + {forceRemovePrison: true, name: "ShadowHandEyes", unlimited: true, alwaysAccessible: true, tether: 1.5, Asset: "DuctTape", Color: ["#3c115c"], Group: "ItemHead", blindfold: 3, + Model: "ShadowHandsEyes", + power: 4, weight: 0, escapeChance: {"Struggle": 0.5, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, + enemyTags: {"shadowHands":10, "shadowBolt": 10}, playerTags: {"ItemEyesFull":-9, NoBlindfolds: -1000}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Wrapping", "Shadow", "Illusion"], + events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, + + {forceRemovePrison: true, name: "ShadowHandArms", alwaysAccessible: true, unlimited: true, LinkableBy: ["Shadow"], accessible: true, tether: 1.5, Asset: "DuctTape", Color: ["#3c115c"], Group: "ItemArms", bindarms: true, + Model: "ShadowHandsArms2", + addTag: ["HandsBehind"], + maxwill: 0.9, + power: 4, weight: 0, escapeChance: {"Struggle": 0.35, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, + enemyTags: {"shadowHands":10, "shadowBolt": 6}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Tape", "Shadow", "Illusion"], + events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, + + {forceRemovePrison: true, name: "ShadowHandArmsHeavy", alwaysAccessible: true, unlimited: true, accessible: true, tether: 1.5, Asset: "DuctTape", Type: "Top", Color: ["#3c115c"], Group: "ItemArms", bindarms: true, bindhands: 0.5, + Model: "ShadowHandsArmsAll", + maxwill: 0.5, + addTag: ["HandsBehind"], + power: 5, weight: -9, escapeChance: {"Struggle": 0.1, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, + enemyTags: {"shadowHands":1, "shadowBolt": 1}, playerTags: {"ItemArmsFull":9}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Wrapping", "Shadow", "Illusion"], + events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, + + {forceRemovePrison: true, name: "ShadowHandLegs", alwaysAccessible: true, unlimited: true, LinkableBy: ["Shadow"], accessible: true, tether: 1.5, Asset: "DuctTape", Color: ["#3c115c"], Group: "ItemLegs", hobble: 1, + Model: "ShadowHandsLegs2", + addTag: ["FeetLinked"], + power: 4, weight: 0, escapeChance: {"Struggle": 0.5, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, + enemyTags: {"shadowHands":10, "shadowBolt": 1}, playerTags: {"ItemArmsEmpty": -1}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Tape", "Shadow", "Illusion"], + events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, + {forceRemovePrison: true, name: "ShadowHandLegsHeavy", alwaysAccessible: true, unlimited: true, tether: 1.5, Asset: "DuctTape", Color: ["#3c115c"], Group: "ItemLegs", Type: "MostLegs", hobble: 1, addTag: ["FeetLinked"], + Model: "ShadowHandsLegsAll", + blockfeet: true, maxwill: 0.5, + power: 5, weight: -5, escapeChance: {"Struggle": 0.1, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, + enemyTags: {"shadowHands":1, "shadowBolt": 1}, playerTags: {"ItemLegsFull": 5, "ItemFeetFull": 3}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Wrapping", "Shadow", "Illusion"], + events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, + + + {forceRemovePrison: true, name: "ShadowHandCrotch", unlimited: true, alwaysAccessible: true, accessible: true, tether: 1.5, Asset: "Ribbons", Color: ["#3c115c"], Group: "ItemPelvis", crotchrope: true, strictness: 0.15, + Model: "ShadowHandsCrotch", + power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, + enemyTags: {"shadowHands":10, "shadowBolt": 2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Wrapping", "Shadow", "Illusion"], + events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, + + {forceRemovePrison: true, name: "ShadowHandFeet", unlimited: true, alwaysAccessible: true, accessible: true, tether: 1.5, Asset: "DuctTape", Color: ["#3c115c"], Group: "ItemFeet", blockfeet: true, + maxwill: 0.4, + addTag: ["FeetLinked"], + Model: "ShadowHandsFeet", + power: 4, weight: 0, escapeChance: {"Struggle": 0.4, "Remove": -100}, failSuffix: {"Struggle": "ShadowHand", "Remove": "ShadowHand"}, + enemyTags: {"shadowHands":10, "shadowBolt": 2}, playerTags: {"ItemLegsEmpty": -2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Rope", "Leather", "Metal", "Wrapping", "Encase", "Shadow", "Illusion"], + events: [{trigger: "tick", type: "ShadowHandTether", requiredTag: "shadowHandEnemy", chance: 1.0, dist: 1.5},{trigger: "beforeStruggleCalc", type: "shadowBuff", inheritLinked: true}]}, + + //region Slime + {inventory: true, name: "SlimeCollar", debris: "Slime", Asset: "LatexCollar2", factionColor: [[], [0]], + Color: "Default", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender], + power: 9, weight: 4, DefaultLock: "Blue", + Model: "ElfCollarRestraint", + sfxGroup: "Rubber", + struggleBreak: true, + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + tightType: "Secure", + maxwill: 0.25, enemyTags: {"livingCollar":10}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["Collars","Latex","Slime"], + events: [{trigger: "tick", type: "livingRestraints", tags: ["slimeRestraints"], cloneTags: [], inheritLinked: true, frequencyMax: 60, frequencyMin: 10, frequencyStep: 0.8, count: 4}] + }, + + {removePrison: true, name: "SlimeBoots", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "SlimeBoots", linkSize: 0.6, Asset: "ToeTape", Type: "Full", Color: "#9B49BD", Group: "ItemBoots", blockfeet: true,power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0, "Remove": 0}, + LinkableBy: [...KDRubberLink, ], renderWhenLinked: [...KDRubberLink], + events: [{trigger: "tick", type: "slimeSpread", power: 0.04, inheritLinked: true}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1, inheritLinked: true}], slimeLevel: 1, + Model: "SlimeBoots", + tightType: "Thick", + sfxGroup: "Rubber", + addPoseIfTopLevel: ["ItemBootsRubberOver"], + failSuffix: {"Remove": "Slime"}, + affinity: {Struggle: ["Edge"], Remove: ["Edge"],}, + factionColor: [[], [0]], + disassembleAs: "SlimeRaw", + maxwill: 0.1, + enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 2, "slimeRestraintsRandomLight": 2}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Encase", "Slime"], addTag: ["slime", "FeetLinked"]}, + {removePrison: true, name: "SlimeFeet", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "SlimeFeet", linkSize: 0.6, Asset: "DuctTape", Type: "CompleteFeet", OverridePriority: 24, Color: "#9B49BD", Group: "ItemFeet", blockfeet: true,power: 4, weight: -100, escapeChance: {"Struggle": 0.3, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.05, inheritLinked: true}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1, inheritLinked: true}], slimeLevel: 1, + LinkableBy: [...KDRubberLink, ], renderWhenLinked: [...KDRubberLink], + Model: "SlimeFeet", + tightType: "Thick", + sfxGroup: "Rubber", + addPoseIfTopLevel: ["ItemFeetRubberOver"], + failSuffix: {"Remove": "Slime"}, + affinity: {Struggle: ["Edge"], Remove: ["Edge"],}, + factionColor: [[], [0]], + disassembleAs: "SlimeRaw", + maxwill: 0.4, + enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 101, "slimeRestraintsRandomLight": 101}, playerTags: {"ItemBootsFull":15}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Encase", "Slime"], addTag: ["slime", "FeetLinked"]}, + {removePrison: true, name: "SlimeLegs", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "SlimeLegs", linkSize: 0.6, remove: ["ClothLower", "Skirts", "Pants"], Asset: "SeamlessHobbleSkirt", Color: "#9B49BD", Group: "ItemLegs", hobble: 1, power: 4, weight: -102, escapeChance: {"Struggle": 0.22, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.07, inheritLinked: true}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1, inheritLinked: true}], slimeLevel: 1, + LinkableBy: [...KDRubberLink, ], renderWhenLinked: [...KDRubberLink], + Model: "SlimeLegs", + tightType: "Thick", + sfxGroup: "Rubber", + addPoseIfTopLevel: ["ItemLegsRubberOver"], + failSuffix: {"Remove": "Slime"}, + affinity: {Struggle: ["Edge"], Remove: ["Edge"],}, + factionColor: [[], [0]], + disassembleAs: "SlimeRaw", + maxwill: 0.7, + enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 103, "slimeRestraintsRandomLight": 103}, playerTags: {"ItemFeetFull":2, "ItemBootsFull":2}, + minLevel: 0, allFloors: true, shrine: ["Slime", "Latex", "Encase", "Hobbleskirts", ], addTag: ["slime", "FeetLinked"]}, + {removePrison: true, name: "SlimeArms", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "SlimeArms", linkSize: 0.6, remove: ["Bra", "Cloth", "Bras", "Tops"], Asset: "StraitLeotard", Modules: [0, 0, 0, 0], Color: ["#9B49BD", "#9B49BD", "#9B49BD"], Group: "ItemArms", bindarms: true, bindhands: 0.25, power: 6, weight: -102, escapeChance: {"Struggle": 0.2, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.1, inheritLinked: true}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1}], slimeLevel: 1, + LinkableBy: [...KDRubberLink, ], renderWhenLinked: [...KDRubberLink], + Model: "SlimeArms", + tightType: "Thick", + sfxGroup: "Rubber", + addPoseIfTopLevel: ["ItemArmsRubberOver"], + failSuffix: {"Remove": "Slime"}, + affinity: {Struggle: ["Edge"], Remove: ["Edge"],}, + factionColor: [[], [0, 1, 2]], + disassembleAs: "SlimeRaw", + maxwillEnemy: 0.2, + enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 103}, playerTags: {"ItemFeetFull":2, "ItemBootsFull":2, "ItemLegsFull":2}, + minLevel: 0, allFloors: true, shrine: ["Slime", "Latex", "Encase", "HandsBehind"], addTag: ["slime"]}, + {removePrison: true, name: "SlimeHands", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "SlimeHands", linkSize: 0.6, Asset: "DuctTape", Color: "#9B49BD", Group: "ItemHands", bindhands: 0.5, power: 4.5, weight: -102, escapeChance: {"Struggle": 0.4, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.05, inheritLinked: true}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1, inheritLinked: true}], slimeLevel: 1, + LinkableBy: [...KDRubberLink, ], renderWhenLinked: [...KDRubberLink], + Model: "SlimeHands", + tightType: "Thick", + sfxGroup: "Rubber", + failSuffix: {"Remove": "Slime"}, + addPoseIfTopLevel: ["ItemHandsRubberOver"], + affinity: {Struggle: ["Edge"], Remove: ["Edge"],}, + factionColor: [[], [0]], + maxwillEnemy: 0.5, + disassembleAs: "SlimeRaw", + enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 103, "slimeRestraintsRandomLight": 103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHeadFull":1}, + minLevel: 0, allFloors: true, shrine: ["Slime", "Latex", "Encase",], addTag: ["slime"]}, + {removePrison: true, name: "SlimeMouth", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "SlimeMouth", linkSize: 0.6, Asset: "LatexBallMuzzleGag", Color: "#9B49BD", Group: "ItemMouth", AssetGroup: "ItemMouth3", gag: 0.75, power: 4, weight: -102, escapeChance: {"Struggle": 0.22, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.05, inheritLinked: true}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1, inheritLinked: true}], slimeLevel: 1, + LinkableBy: [...KDRubberLink, ], renderWhenLinked: [...KDRubberLink], + Model: "SlimeMouth", + tightType: "Thick", + failSuffix: {"Remove": "Slime"}, + sfxGroup: "Rubber", + addPoseIfTopLevel: ["ItemSlimeRubberOver"], + affinity: {Struggle: ["Edge"], Remove: ["Edge"],}, + factionColor: [[], [0, 1, 2]], + disassembleAs: "SlimeRaw", + maxwillEnemy: 0.6, + enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHandsFull":1, "ItemArmsFull":1}, + minLevel: 0, allFloors: true, shrine: ["Slime", "Latex", "Encase", "Gags", "FlatGag"], addTag: ["slime"]}, + {removePrison: true, name: "SlimeHead", unlimited: true, debris: "Slime", inaccessible: true, linkCategory: "SlimeHead", linkSize: 0.6, Asset: "LeatherSlimMask", Color: "#9B49BD", Group: "ItemHead", gag: 0.5, blindfold: 4, power: 4, weight: -103, escapeChance: {"Struggle": 0.22, "Cut": 0, "Remove": 0}, events: [{trigger: "tick", type: "slimeSpread", power: 0.05, inheritLinked: true}, {trigger: "remove", type: "slimeStop"}, {trigger: "beforeStruggleCalc", type: "boostWater", power: 0.1, inheritLinked: true}], slimeLevel: 1, + LinkableBy: [...KDRubberLink, ], renderWhenLinked: [...KDRubberLink], + Model: "SlimeHead", + tightType: "Thick", + sfxGroup: "Rubber", + failSuffix: {"Remove": "Slime"}, + addPoseIfTopLevel: ["ItemHeadRubberOver"], + affinity: {Struggle: ["Edge"], Remove: ["Edge"],}, + factionColor: [[], [0]], + disassembleAs: "SlimeRaw", + enemyTags: {"slimeRestraints":100, "slimeRestraintsRandom": 100}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHandsFull":1, "ItemArmsFull":1, "ItemMouth3Full":1, "Unmasked": -1000}, + minLevel: 0, allFloors: true, shrine: ["Slime", "Latex", "Encase", "Block_ItemMouth"], addTag: ["slime"]}, + //endregion + + //region HardSlime + {inventory: true, name: "HardSlimeCollar", debris: "Slime", Asset: "LatexCollar2", factionColor: [[], [0]], Color: "Default", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: 4, DefaultLock: "Blue", + Model: "ElfCollarRestraint", + sfxGroup: "Rubber", + struggleBreak: true, + Filters: { + Collar: {"gamma":1.05,"saturation":0.016666666666666666,"contrast":0.8,"brightness":1.5,"red":0.8999999999999999,"green":1.1833333333333333,"blue":1.75,"alpha":1}, + }, + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + tightType: "Secure", + maxwill: 0.25, enemyTags: {"livingCollar":10}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["Collars","Latex","Rubber"], + events: [{trigger: "tick", type: "livingRestraints", tags: ["latexEncase"], kind: "Rubber", cloneTags: [], inheritLinked: true, frequencyMax: 60, frequencyMin: 10, frequencyStep: 0.8, count: 4}] + }, + {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeBoots", debris: "Slime", linkCategory: "SlimeBoots", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "ToeTape", Type: "Full", Color: "#9B49BD", Group: "ItemBoots", blockfeet: true, addTag: ["FeetLinked"],power: 5, weight: 0, + escapeChance: {"Struggle": 0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, + affinity: {Struggle: ["Sharp",], Remove: ["Hook"],}, + factionColor: [[], [0]], + sfxGroup: "Rubber", + factionFilters: { + Rubber: {color: "DarkNeutral", override: true}, + }, + disassembleAs: "HardSlimeRaw", + maxwill: 0.1, + Model: "RubberBoots", + tightType: "Thick", + addPoseIfTopLevel: ["ItemBootsRubberOver"], + enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Encase", "SlimeHard", "Rubber"]}, + {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeFeet", debris: "Slime", linkCategory: "SlimeFeet", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "DuctTape", Type: "CompleteFeet", OverridePriority: 24, Color: "#9B49BD", Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 6, weight: -100, + escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, + affinity: {Struggle: ["Sharp",], Remove: ["Hook"],}, + factionColor: [[], [0]], + Model: "RubberFeet", + tightType: "Thick", + sfxGroup: "Rubber", + factionFilters: { + Rubber: {color: "DarkNeutral", override: true}, + }, + disassembleAs: "HardSlimeRaw", + maxwill: 0.4, + addPoseIfTopLevel: ["ItemFeetRubberOver"], + enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemBootsFull":15}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Encase", "SlimeHard", "Rubber"]}, + {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeLegs", debris: "Slime", linkCategory: "SlimeLegs", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], + inaccessible: true, remove: ["ClothLower", "Skirts"], Asset: "SeamlessHobbleSkirt", Color: "#9B49BD", Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 6, weight: -102, + escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, + affinity: {Struggle: ["Sharp",], Remove: ["Hook"],}, + factionColor: [[], [0]], + Model: "RubberLegs", + tightType: "Thick", + sfxGroup: "Rubber", + factionFilters: { + Rubber: {color: "DarkNeutral", override: true}, + }, + disassembleAs: "HardSlimeRaw", + maxwill: 0.7, + addPoseIfTopLevel: ["ItemLegsRubberOver"], + enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemFeetFull":2, "ItemBootsFull":2}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Hobbleskirts", "Encase", "SlimeHard", "Rubber"]}, + {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeArms", debris: "Slime", linkCategory: "SlimeArms", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, + remove: ["Bra", "Cloth", "Tops"], Asset: "StraitLeotard", Modules: [0, 0, 0, 0], Color: ["#9B49BD", "#9B49BD", "#9B49BD"], Group: "ItemArms", bindarms: true, bindhands: 0.35, power: 8, weight: -102, + escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, + affinity: {Struggle: ["Sharp",], Remove: ["Hook"],}, + factionColor: [[], [0, 1, 2]], + Model: "RubberArms", + tightType: "Thick", + sfxGroup: "Rubber", + factionFilters: { + Rubber: {color: "DarkNeutral", override: true}, + }, + maxwillEnemy: 0.2, + disassembleAs: "HardSlimeRaw", + addPoseIfTopLevel: ["ItemArmsRubberOver"], + enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemFeetFull":2, "ItemBootsFull":2, "ItemLegsFull":2}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Encase", "SlimeHard", "Rubber", "Encase",]}, + {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeHands", debris: "Slime", linkCategory: "SlimeHands", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "DuctTape", Color: "#9B49BD", Group: "ItemHands", bindhands: 0.65, power: 5, weight: -102, + escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, + affinity: {Struggle: ["Sharp",], Remove: ["Hook"],}, + factionColor: [[], [0]], + Model: "RubberHands", + tightType: "Thick", + sfxGroup: "Rubber", + factionFilters: { + Rubber: {color: "DarkNeutral", override: true}, + }, + maxwillEnemy: 0.5, + disassembleAs: "HardSlimeRaw", + addPoseIfTopLevel: ["ItemHandsRubberOver"], + enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHeadFull":1}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Encase", "SlimeHard", "Rubber"]}, + {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeMouth", debris: "Slime", linkCategory: "SlimeMouth", linkSize: 0.6, inaccessible: true, Asset: "KittyGag", LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], Color: ["#9B49BD", "#9B49BD", "#9B49BD"], Group: "ItemMouth", AssetGroup: "ItemMouth3", gag: 0.75, power: 6, weight: -102, + escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, + affinity: {Struggle: ["Sharp",], Remove: ["Hook"],}, + factionColor: [[], [0, 1, 2]], + Model: "RubberMouth", + tightType: "Thick", + sfxGroup: "Rubber", + factionFilters: { + Rubber: {color: "DarkNeutral", override: true}, + }, + maxwillEnemy: 0.6, + disassembleAs: "HardSlimeRaw", + addPoseIfTopLevel: ["ItemMouthRubberOver"], + enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHandsFull":1, "ItemArmsFull":1}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Encase", "SlimeHard", "Rubber", "Gags", "FlatGag"]}, + {inventory: true, unlimited: true, removePrison: true, name: "HardSlimeHead", debris: "Slime", linkCategory: "SlimeHead", linkSize: 0.6, LinkableBy: [...KDRubberLink], renderWhenLinked: [...KDRubberLink], inaccessible: true, Asset: "LeatherSlimMask", Color: "#9B49BD", Group: "ItemHead", gag: 0.5, blindfold: 5, power: 6, weight: -102, + escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0}, failSuffix: {"Remove": "SlimeHard"}, + affinity: {Struggle: ["Sharp",], Remove: ["Hook"],}, + factionColor: [[], [0]], + Model: "RubberHead", + tightType: "Thick", + sfxGroup: "Rubber", + factionFilters: { + Rubber: {color: "DarkNeutral", override: true}, + }, + disassembleAs: "HardSlimeRaw", + addPoseIfTopLevel: ["ItemHeadRubberOver"], + enemyTags: {"latexEncase":100, "latexEncaseRandom":103}, playerTags: {"ItemFeetFull":1, "ItemBootsFull":1, "ItemLegsFull":1, "ItemHandsFull":1, "ItemArmsFull":1, "ItemMouth3Full":1, "Unmasked": -1000}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Encase", "Block_ItemMouth", "Encase", "SlimeHard", "Rubber"]}, + + {inventory: true, name: "HardSlimeRaw", + noRecycle: true, + requireSingleTagToEquip: ["Impossible"], + Asset: "", Color: "", + recycleresource: { + Latex: 3, + }, + Group: "ItemDevices", power: 1, weight: -1000, + escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.05}, + enemyTags: {}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["Rubber", "Latex", "Raw"]}, + {inventory: true, name: "SlimeRaw", + noRecycle: true, + requireSingleTagToEquip: ["Impossible"], + Asset: "", Color: "", + recycleresource: { + Latex: 3, + }, + Group: "ItemDevices", power: 1, weight: -1000, + escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.05}, + enemyTags: {}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["Slime", "Latex", "Raw"]}, + + + + //region Glue + {removePrison: true, name: "GlueBoots", unlimited: true, debris: "Slime", linkCategory: "SlimeBoots", linkSize: 0.3, inaccessible: true, Asset: "ToeTape", Type: "Full", Color: "#e7cf1a", Group: "ItemBoots", blockfeet: true, addTag: ["FeetLinked"],power: 1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.0, "Remove": 0.05}, + Model: "SlimeBoots", + tightType: "Thick", + sfxGroup: "Rubber", + Filters: { + Slime: {"gamma":1.45,"saturation":0.016666666666666666,"contrast":1.6833333333333333,"brightness":0.9166666666666666,"red":2.3666666666666667,"green":1.6166666666666665,"blue":0.8666666666666667,"alpha":1}, + }, + enemyTags: {"glueRestraints":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Glue", "Latex", "Slime"]}, + {removePrison: true, name: "GlueFeet", unlimited: true, debris: "Slime", linkCategory: "SlimeFeet", linkSize: 0.3, inaccessible: true, Asset: "DuctTape", Type: "CompleteFeet", OverridePriority: 24, Color: "#e7cf1a", Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 1, weight: -100, escapeChance: {"Struggle": 0.25, "Cut": 0.0, "Remove": 0.05}, + Model: "SlimeFeet", + tightType: "Thick", + sfxGroup: "Rubber", + remove: ["Pants"], // They rip off b/c of glue :) + Filters: { + Slime: {"gamma":1.45,"saturation":0.016666666666666666,"contrast":1.6833333333333333,"brightness":0.9166666666666666,"red":2.3666666666666667,"green":1.6166666666666665,"blue":0.8666666666666667,"alpha":1}, + }, + enemyTags: {"glueRestraints":100}, playerTags: {"ItemBootsFull":15}, minLevel: 0, allFloors: true, shrine: ["Glue", "Latex", "Slime"]}, + {removePrison: true, name: "GlueLegs", unlimited: true, debris: "Slime", linkCategory: "SlimeLegs", linkSize: 0.3, inaccessible: true, remove: ["ClothLower", "Skirts", "Pants"], Asset: "SeamlessHobbleSkirt", Color: "#e7cf1a", Group: "ItemLegs", blockfeet: true, addTag: ["FeetLinked"],power: 1, weight: -102, escapeChance: {"Struggle": 0.2, "Cut": 0.0, "Remove": 0.05}, + Model: "SlimeLegs", + tightType: "Thick", + sfxGroup: "Rubber", + Filters: { + Slime: {"gamma":1.45,"saturation":0.016666666666666666,"contrast":1.6833333333333333,"brightness":0.9166666666666666,"red":2.3666666666666667,"green":1.6166666666666665,"blue":0.8666666666666667,"alpha":1}, + }, + enemyTags: {"glueRestraints":100}, playerTags: {"ItemBootsFull":2, "ItemFeetFull":2}, minLevel: 0, allFloors: true, shrine: ["Glue", "Latex", "Hobbleskirts", "Slime"]}, + //endregion + + + //region CyberDoll + {inventory: true, arousalMode: true, name: "CyberBelt", Asset: "FuturisticChastityBelt", Modules: [3, 1, 1, 1, 1], OverridePriority: 26, + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + Color: ['#222222', '#499ed6', '#555555', '#000000', '#555555', '#b927a8', '#3868E8', '#555555', '#222222'], + // Body, Display, Panel, Lock, band, trim, band, underplug, plug, strap + factionColor: [[0], [5], [1]], + Group: "ItemPelvis", chastity: true, power: 20, weight: 0, + DefaultLock: "Cyber3", + tightType: "Secure", + Security: { + level_tech: 2, + }, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + ], + Model: "CyberBelt", + factionFilters: { + Lining: {color: "LightNeutral", override: true}, + Metal: {color: "DarkNeutral", override: true}, + Display: {color: "Highlight", override: false}, + Plug: {color: "Highlight", override: true}, + }, + maxwill: 0.4, + LinkableBy: ["Wrapping"], + escapeChance: {"Struggle": -1.3, "Cut": -0.8, "Remove": 1.0, "Pick": -0.35}, + enemyTags: {"cyberdollchastity" : 1000}, + playerTags: {"ItemVulvaEmpty" : -5, "ItemVulvaPiercingsEmpty" : -5}, + minLevel: 7, allFloors: true, shrine: ["Chastity", "Metal", "ChastityBelts", "Cyber", "CyberChastityL"]}, + {inventory: true, arousalMode: true, trappable: true, name: "CyberBra", Asset: "FuturisticBra2", OverridePriority: 26, + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + Color: ['#499ed6', '#555555', '#222222', '#ffffff', '#555555', '#000000', "#000000"], Group: "ItemBreast", + factionColor: [[2, 5], [2], [0]], + tightType: "Secure", + chastitybra: true, power: 15, weight: 0, + Model: "BraCyber", + factionFilters: { + Display: {color: "Highlight", override: false}, + Lining: {color: "LightNeutral", override: true}, + Metal: {color: "DarkNeutral", override: true}, + }, + Security: { + level_tech: 2, + }, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + ], + DefaultLock: "Cyber3", + maxwill: 0.6, + escapeChance: {"Struggle": -1.1, "Cut": -0.8, "Remove": 1.0, "Pick": -0.35}, + enemyTags: {"cyberdollchastity" : 1000}, + playerTags: {"FreeBoob": -1000}, + minLevel: 4, allFloors: true, shrine: ["ChastityBras", "Chastity", "Metal", "Cyber", "CyberChastityU"]}, + + + {alwaysRender: true, inventory: true, name: "ControlHarness", debris: "Chains", accessible: true, Asset: "FuturisticHarness", LinkableBy: [...KDHarnessLink], strictness: 0.1, + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + Model: "FutureHarness", + tightType: "Secure", + harness: true, + unlimited: true, + factionFilters: { + Display: {color: "Highlight", override: false}, + Straps: {color: "LightNeutral", override: true}, + Metal: {color: "DarkNeutral", override: true}, + }, + Color: ['#499ed6', '#555555', '#555555', '#000000'], + factionColor: [[], [], [0]], + restriction: 3, + Group: "ItemTorso", power: 10, weight: 0, + escapeChance: {"Struggle": -0.4, "Cut": -0.2, "Remove": 0.4, "Pick": 0.1}, + DefaultLock: "Cyber3", + maxwill: 0.5, + enemyTags: {"controlHarness" : 20, "roboPrisoner" : 10, "cyberdollrestraints" : 100}, + playerTags: {}, + minLevel: 7, allFloors: true, shrine: ["Metal", "Harnesses", "Cyber"], + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postApply", type: "ControlHarness", power: 1, inheritLinked: true}, + {trigger: "remotePunish", type: "RemoteControlHarness", kind: "RemoteLink", noLeash: false, enemyDialogue: "KDDialogueRemoteLinkTether", msg: "KDMsgRemoteLinkCHTether"}, + ]}, + + {inventory: true, name: "CyberLongMittens", + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + Model: "CyberLongMittens", + tightType: "Secure", + factionFilters: { + Mitten: {color: "Catsuit", override: false}, + Straps: {color: "DarkNeutral", override: true}, + Cap: {color: "LightNeutral", override: false}, + Glow: {color: "Highlight", override: false}, + Display: {color: "Highlight", override: false}, + Lock: {color: "DarkNeutral", override: true}, + Cuff: {color: "DarkNeutral", override: true}, + UpperGlow: {color: "Highlight", override: false}, + UpperDisplay: {color: "Highlight", override: false}, + UpperLock: {color: "DarkNeutral", override: true}, + UpperCuff: {color: "DarkNeutral", override: true}, + }, + DefaultLock: "Cyber3", + factionColor: [[], [], [0]], + Asset: "LatexElbowGloves", Color: "#ff5277", LinkableBy: [...KDGlovesLink], renderWhenLinked: ["Mittens"], Group: "ItemHands", + bindhands: 1.4, power: 10, weight: 0, + escapeChance: {"Struggle": -0.4, "Cut": -0.2, "Remove": 0.04, "Pick": -0.25}, + limitChance: {"Struggle": 0.3, "Cut": 0.2,}, + struggleMaxSpeed: {Remove: 0.1}, + maxwill: 0.2, enemyTags: {"cyberdollrestraints": 6}, playerTags: {"ItemHandsFull":-2}, minLevel: 7, allFloors: true, shrine: ["CyberMittens","LongMittens","Mittens", "Metal", "Cyber"]}, + + {inventory: true, name: "CyberMittens", + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + Model: "CyberMittens", + tightType: "Secure", + factionFilters: { + Mitten: {color: "LightNeutral", override: true}, + Straps: {color: "DarkNeutral", override: true}, + Cap: {color: "LightNeutral", override: false}, + Glow: {color: "Highlight", override: false}, + Display: {color: "Highlight", override: false}, + Lock: {color: "DarkNeutral", override: true}, + Cuff: {color: "DarkNeutral", override: true}, + }, + DefaultLock: "Cyber2", + factionColor: [[], [], [0]], + Asset: "LatexElbowGloves", Color: "#ff5277", LinkableBy: [...KDGlovesLink], renderWhenLinked: ["Mittens"], Group: "ItemHands", + bindhands: 1.0, power: 9, weight: 0, + escapeChance: {"Struggle": -0.25, "Cut": -0.15, "Remove": 0.15, "Pick": -0.1}, + maxwill: 0.4, enemyTags: {"cyberdollrestraints": 10}, playerTags: {"ItemHandsFull":-2}, minLevel: 0, allFloors: true, shrine: ["CyberMittens","Mittens", "Metal", "Cyber"]}, + + {inventory: true, name: "TrackingCollar", debris: "Chains", accessible: true, Asset: "FuturisticCollar", + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + Model: "FutureCollar", + tightType: "Secure", + factionFilters: { + Display: {color: "Highlight", override: false}, + Base: {color: "DarkNeutral", override: true}, + Rim: {color: "LightNeutral", override: true}, + Band: {color: "LightNeutral", override: true}, + }, + linkCategories: ["CyberCollar", "BasicCollar"], linkSizes: [0.7, 0.45], + Color: ['#499ed6', '#555555', '#b927a8', '#000000'], + factionColor: [[], [2], [0]], + DefaultLock: "Cyber2", + Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: 0, + escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": 0.33, "Pick": -0.15}, + maxwill: 0.5, + enemyTags: {"controlHarness":5, "roboPrisoner" : 100, "cyberdollrestraints" : 10}, + playerTags: {"ItemNeckEmpty":10}, + minLevel: 0, allFloors: true, shrine: ["Metal", "Collars", "Cyber"], + }, + + {inventory: true, name: "CyberLinkCollar", debris: "Chains", accessible: true, Asset: "FuturisticCollar", + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + Model: "CyberLinkCollar", + tightType: "Secure", + factionFilters: { + Display: {color: "Highlight", override: false}, + Base: {color: "DarkNeutral", override: true}, + Rim: {color: "LightNeutral", override: true}, + Band: {color: "LightNeutral", override: true}, + }, + linkCategories: ["CyberCollar", "BasicCollar"], linkSizes: [0.7, 0.45], + Color: ['#499ed6', '#555555', '#b927a8', '#000000'], + factionColor: [[], [2], [0]], + DefaultLock: "Cyber3", + Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender], power: 20, weight: 0, + escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": 0.33, "Pick": -0.15}, + maxwill: 0.5, + enemyTags: {}, + playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["Metal", "Collars", "Cyber", "CyberLink", "CyberLinkDirect"], + }, + + + { + inventory: true, name: "DollmakerVisor", accessible: true, Asset: "InteractiveVisor", + UnderlinkedAlwaysRender: true, + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + Model: "Goggles", + curse: "DollLock", + special: true, + Color: ['#91023a'], + Group: "ItemHead", LinkableBy: [...KDVisorLink], + power: 40, weight: 0, escapeChance: {"Struggle": -0.6, "Cut": -1.0, "Remove": 0.5, "Pick": -0.5}, + maxwill: 0.1, + enemyTags: {}, + playerTags: {}, + events: [ + /*{trigger: "tick", type: "DollmakerMask", inheritLinked: true}, + {trigger: "calcBlind", type: "DollmakerMask", inheritLinked: true}, + {trigger: "kill", type: "DollmakerMask", inheritLinked: true}, + {trigger: "draw", type: "DollmakerMask", inheritLinked: true},*/ + {trigger: "calcEscapeKillTarget", type: "DollmakerMask", inheritLinked: true}, + {trigger: "calcEscapeMethod", type: "DollmakerMask", inheritLinked: true}, + ], + minLevel: 0, allFloors: true, shrine: ["Visors", "Cyber"], + }, + { + inventory: true, name: "DollmakerMask", inaccessible: true, + UnderlinkedAlwaysRender: true, + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + Model: "FullVisorRim", + curse: "DollLock", + factionColor: [[2]], Color: ["#ff5277"], Group: "ItemHead", Asset: "DroneMask", LinkableBy: [...KDMaskLink], + power: 39, weight: 0, escapeChance: {"Struggle": -0.6, "Cut": -1.0, "Remove": 0.5, "Pick": -0.5}, + maxwill: 0.1, + special: true, + enemyTags: {}, + playerTags: {}, + events: [ + /*{trigger: "tick", type: "DollmakerMask", inheritLinked: true}, + {trigger: "calcBlind", type: "DollmakerMask", inheritLinked: true}, + {trigger: "kill", type: "DollmakerMask", inheritLinked: true}, + {trigger: "draw", type: "DollmakerMask", inheritLinked: true},*/ + {trigger: "calcEscapeKillTarget", type: "DollmakerMask", inheritLinked: true}, + {trigger: "calcEscapeMethod", type: "DollmakerMask", inheritLinked: true}, + ], + minLevel: 0, allFloors: true, shrine: ["Masks", "Block_ItemMouth", "Cyber"], + }, + + {inventory: true, name: "CyberBallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], + sfx: "HydraulicLock", + sfxRemove: "SciFiPump", + factionFilters: { + Display: {color: "Highlight", override: false}, + Harness: {color: "DarkNeutral", override: true}, + Strap: {color: "LightNeutral", override: true}, + SideStrap: {color: "LightNeutral", override: true}, + HarnessMask: {color: "DarkNeutral", override: true}, + Mask: {color: "DarkNeutral", override: true}, + HarnessDisplay: {color: "Highlight", override: false}, + Ball: {color: "Highlight", override: false}, + HarnessRim: {color: "LightNeutral", override: true}, + Muzzle: {color: "LightNeutral", override: true}, + }, + Model: "AdvancedSciFiBallGag", + Filters: { + Ball: {"gamma":0.26666666666666666,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":0.2833333333333333,"green":0.8999999999999999,"blue":1.9166666666666667,"alpha":1}, + Display: {"gamma":0.26666666666666666,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":0.2833333333333333,"green":0.8999999999999999,"blue":1.9166666666666667,"alpha":1}, + }, + Asset: "FuturisticHarnessBallGag", strictness: 0.35, gag: 0.65, + Color: ['#499ed6', '#b927a8', '#222222', '#FFFFFF', '#000000'], Group: "ItemMouth", power: 12, weight: 0, + factionColor: [[2], [1], [0]], + DefaultLock: "Cyber2", + maxwill: 0.75, escapeChance: {"Struggle": -0.4, "Cut": -0.2, "Remove": 0.05, "Pick": -0.1}, + enemyTags: {"cyberdollrestraints" : 10, forceAntiMagic: -100}, + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.35, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.25, requiredTag: "Blindfolds"}, + ], + playerTags: {}, minLevel: 0, allFloors: true, shrine: ["BallGags", "Gags", "Metal", "Cyber"]}, + {inventory: true, name: "CyberPlugGag", debris: "Belts", LinkableBy: [...KDPlugGagLink], renderWhenLinked: [...KDPlugGagLink], + sfx: "HydraulicLock", + sfxRemove: "SciFiPump", + Model: "AdvancedSciFiPlugGag", + DefaultLock: "Cyber2", + factionFilters: { + Display: {color: "Highlight", override: false}, + Harness: {color: "DarkNeutral", override: true}, + Strap: {color: "LightNeutral", override: true}, + SideStrap: {color: "LightNeutral", override: true}, + HarnessMask: {color: "DarkNeutral", override: true}, + Mask: {color: "DarkNeutral", override: true}, + HarnessDisplay: {color: "Highlight", override: false}, + HarnessRim: {color: "LightNeutral", override: true}, + Muzzle: {color: "LightNeutral", override: true}, + }, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.35, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.25, requiredTag: "Blindfolds"}, + ], + Filters: { + HarnessDisplay: {"gamma":0.26666666666666666,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":0.2833333333333333,"green":0.8999999999999999,"blue":1.9166666666666667,"alpha":1}, + Display: {"gamma":0.26666666666666666,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":0.2833333333333333,"green":0.8999999999999999,"blue":1.9166666666666667,"alpha":1}, + }, + Asset: "FuturisticHarnessPanelGag", strictness: 0.35, gag: 1.0, + Color: ['#499ed6', '#222222', '#555555', '#FFFFFF', '#000000'], Group: "ItemMouth", power: 15, weight: 0, + factionColor: [[], [], [0]], + maxwill: 0.75, escapeChance: {"Struggle": -0.4, "Cut": -0.2, "Remove": 0.05, "Pick": -0.1}, + enemyTags: {"cyberdollrestraints" : 10}, + playerTags: {}, minLevel: 15, allFloors: true, shrine: ["PlugGags", "Gags", "Cyber", "Metal", ]}, + + {inventory: true, name: "CyberMuzzle", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + Model: "AdvancedSciFiMuzzle2", + factionFilters: { + Display: {color: "Highlight", override: false}, + Harness: {color: "DarkNeutral", override: true}, + Strap: {color: "LightNeutral", override: true}, + SideStrap: {color: "LightNeutral", override: true}, + HarnessMask: {color: "DarkNeutral", override: true}, + Mask: {color: "DarkNeutral", override: true}, + HarnessDisplay: {color: "Highlight", override: false}, + HarnessRim: {color: "LightNeutral", override: true}, + Muzzle: {color: "LightNeutral", override: true}, + }, + Filters: { + HarnessDisplay: {"gamma":0.26666666666666666,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":0.2833333333333333,"green":0.8999999999999999,"blue":1.9166666666666667,"alpha":1}, + Display: {"gamma":0.26666666666666666,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":0.2833333333333333,"green":0.8999999999999999,"blue":1.9166666666666667,"alpha":1}, + }, + DefaultLock: "Cyber", + inaccessible: true, + Asset: "FuturisticMuzzle", strictness: 0.35, gag: 0.5, + Color: ['#499ed6', '#222222', '#555555', '#FFFFFF', '#000000'], Group: "ItemMouth", power: 12, weight: 0, + factionColor: [[], [], [0]], + maxwill: 0.25, escapeChance: {"Struggle": -0.25, "Cut": -0.8, "Remove": 0.05, "Pick": -0.25}, + enemyTags: {"cyberdollheavy": 1}, events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + ], + playerTags: {}, minLevel: 9, allFloors: true, shrine: ["FlatGags", "Gags", "Cyber", "Metal", "ControlHMouth"]}, + + {inventory: true, name: "CyberDollJacket", inaccessible: true, remove: ["Bra", "Tops"], Asset: "FuturisticStraitjacket", + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + + DefaultLock: "Cyber", + LinkableBy: [...KDJacketLink], + renderWhenLinked: [...KDJacketRender], + Model: "JacketBolero", + Filters: { + Display: {"gamma":0.26666666666666666,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":0.2833333333333333,"green":0.8999999999999999,"blue":1.9166666666666667,"alpha":1}, + "BeltsLower":{"gamma":1,"saturation":0,"contrast":1.2,"brightness":1.6166666666666665,"red":1.9333333333333333,"green":1,"blue":2.183333333333333,"alpha":1}, + "BeltsChest":{"gamma":1,"saturation":0,"contrast":1.2,"brightness":1.6166666666666665,"red":1.9333333333333333,"green":1,"blue":2.183333333333333,"alpha":1}, + "BeltsArms":{"gamma":1,"saturation":0,"contrast":1.2,"brightness":1.6166666666666665,"red":1.9333333333333333,"green":1,"blue":2.183333333333333,"alpha":1}, + "Arms":{"gamma":1,"saturation":1,"contrast":1.3666666666666667,"brightness":0.8500000000000001,"red":1,"green":1,"blue":1,"alpha":1}, + "Chest":{"gamma":1,"saturation":1,"contrast":1.3666666666666667,"brightness":0.8500000000000001,"red":1,"green":1,"blue":1,"alpha":1}, + "Lower":{"gamma":1,"saturation":1,"contrast":1.3666666666666667,"brightness":0.8500000000000001,"red":1,"green":1,"blue":1,"alpha":1} + }, + + factionFilters: { + BeltsLower: {color: "LightNeutral", override: false}, + BeltsArms: {color: "LightNeutral", override: false}, + BeltsChest: {color: "LightNeutral", override: false}, + Arms: {color: "DarkNeutral", override: false}, + Chest: {color: "DarkNeutral", override: false}, + Lower: {color: "DarkNeutral", override: false}, + }, + Modules: [1, 1, 1, 1], + factionColor: [[0], [1], [3]], + Color: ["#222222", "#b927a8", "#000000", "#499ed6", "#222222", "#000000"], + Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 15, weight: 0, strictness: 0.2, + escapeChance: {"Struggle": -0.2, "Cut": -.3, "Remove": -0.3, "Pick": -0.1}, + limitChance: {"Struggle": 0.3, "Cut": 0.3, "Remove": 0.1, "Unlock": 0.75}, // Hard to escape the arms box by struggling + maxwill: 0.1, + enemyTags: {"cyberdollheavy": 1}, events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + ], + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Cyber", "Metal", "Latex", "Straitjackets", "Block_ItemHands"]}, + + {inventory: true, name: "CyberHeels", inaccessible: true, Asset: "FuturisticHeels2", remove: ["Shoes"], + sfx: "FutureLock", + sfxRemove: "SciFiConfigure", + Model: "CyberBalletHeels", + factionFilters: { + Glow: {color: "Highlight", override: true}, + Shoe: {color: "LightNeutral", override: true}, + }, + Filters: { + Glow: {"gamma":0.26666666666666666,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":0.2833333333333333,"green":0.8999999999999999,"blue":1.9166666666666667,"alpha":1}, + }, + DefaultLock: "Cyber", + factionColor: [[0], [4], [1]], + Color: ["#222222", "#499ed6", "#ffffff", "Default", "#b927a8", "#222222", "#000000"], + Group: "ItemBoots", heelpower: 2, power: 10, weight: 0, + escapeChance: {"Struggle": -0.4, "Cut": -0.35, "Remove": 0.2, "Pick": -0.25}, + maxwill: 0.25, enemyTags: {"cyberdollrestraints" : 10}, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + ], + playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Cyber", "Heels", "Metal", "Boots"]}, + + + {inventory: true, name: "CyberAnkleCuffs", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", LinkableBy: [...KDBindable, ...KDDevices], + sfx: "HydraulicLock", + sfxRemove: "HydraulicUnlock", + Model: "CyberCuffsAnkles", + factionFilters: { + Display: {color: "Highlight", override: false}, + Screen: {color: "LightNeutral", override: true}, + BaseMetal: {color: "DarkNeutral", override: true}, + Lock: {color: "DarkNeutral", override: true}, + }, + alwaysRender: true, + struggleBreak: true, + DefaultLock: "Cyber2", + linkCategory: "AnkleCuffs", linkSize: 0.4, noDupe: true, + Color: ["#499ed6", "#499ed6", "#b927a8", "#000000"], + factionColor: [[], [2], [0,1]], + Group: "ItemFeet", power: 12, weight: 0, + escapeChance: {"Struggle": -0.8, "Cut": -0.65, "Remove": 0.6, "Pick": -0.15}, + enemyTags: {"cyberdollcuffs":6, "cyberdollrestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 4, allFloors: true, shrine: ["Cyber", "CyberCuffs", "Cuffs", "Metal", "AnkleCuffsBase", "HogtieLower", "CyberAnkleCuffs"], + }, + {inventory: true, name: "CyberLegCuffs", debris: "Chains", accessible: true, Asset: "FuturisticLegCuffs", LinkableBy: [...KDBindable, ...KDDevices], + sfx: "HydraulicLock", + sfxRemove: "HydraulicUnlock", + Model: "CyberCuffsThigh", + factionFilters: { + Display: {color: "Highlight", override: false}, + Screen: {color: "LightNeutral", override: true}, + BaseMetal: {color: "DarkNeutral", override: true}, + Lock: {color: "DarkNeutral", override: true}, + }, + alwaysRender: true, + DefaultLock: "Cyber2", + Color: ["#499ed6", "#499ed6", "#b927a8", "#000000"], + struggleBreak: true, + factionColor: [[], [2], [0,1]], + Group: "ItemLegs", power: 12, weight: 0, + escapeChance: {"Struggle": -0.8, "Cut": -0.65, "Remove": 0.6, "Pick": -0.15}, + enemyTags: {"cyberdollcuffs":6, "cyberdollrestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 4, allFloors: true, shrine: ["Cyber", "CyberCuffs", "Metal", "Cuffs", "LegCuffsBase", "CyberLegCuffs"], + }, + {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "CyberArmCuffs", debris: "Chains", accessible: true, + sfx: "HydraulicLock", + sfxRemove: "HydraulicUnlock", + Model: "CyberCuffsArms", + factionFilters: { + Display: {color: "Highlight", override: false}, + Screen: {color: "LightNeutral", override: true}, + BaseMetal: {color: "DarkNeutral", override: true}, + Lock: {color: "DarkNeutral", override: true}, + }, + alwaysRender: true, + struggleBreak: true, + DefaultLock: "Cyber2", + Asset: "FuturisticCuffs", linkCategory: "Cuffs", linkSize: 0.55, LinkableBy: [...KDDevices, ...KDBindable], + Color: ["#499ed6", "#b927a8", "#000000"], + factionColor: [[], [1], [0]], + unlimited: true, + Group: "ItemArms", bindarms: false, power: 12, weight: 0, + escapeChance: {"Struggle": -0.8, "Cut": -0.65, "Remove": 0.25, "Pick": -0.15}, + enemyTags: {"cyberdollcuffs":20, "cyberdollrestraints":6}, playerTags: {"ItemArmsFull":-2}, + minLevel: 4, allFloors: true, shrine: ["Cyber", "CyberCuffs", "Cuffs", "Metal", "ArmCuffsBase", "CyberWristCuffs"], + maxwill: 0.8 + }, + //endregion + + //region Latex + {inventory: true, name: "LatexStraitjacket", inaccessible: true, factionColor: [[0, 1, 2]], remove: ["Bra", "Tops"], Asset: "StraitLeotard", Modules: [1, 1, 1, 1], Color: ["#499ed6", "#499ed6", "#499ed6"], + Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7, weight: 0, strictness: 0.2, + LinkableBy: [...KDJacketLink], + renderWhenLinked: [...KDJacketRender], + Model: "Jacket", + sfxGroup: "Rubber", + Filters: { + BeltsChest: {"gamma":1,"saturation":0.08333333333333333,"contrast":1.3166666666666664,"brightness":2.8666666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":0.08333333333333333,"contrast":1.3166666666666664,"brightness":2.8666666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + Chest: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":0.7833333333333334,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + Arms: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":0.7833333333333334,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + LatexLower: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":2.2666666666666666,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + LatexUpper: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":2.2666666666666666,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + factionFilters: { + Chest: {color: "DarkNeutral", override: true}, + Arms: {color: "DarkNeutral", override: true}, + LatexLower: {color: "DarkNeutral", override: false}, + LatexUpper: {color: "DarkNeutral", override: false}, + }, + escapeChance: {"Struggle": 0.1, "Cut": 0.15, "Remove": 0.1, "Pick": 0.35}, + limitChance: {"Struggle": 0.25, "Cut": 0.14, "Remove": 0.08, "Unlock": 0.75}, + maxwill: 0.25, enemyTags: {"latexRestraintsHeavy" : 3, "latexjacketSpell": 10, "jailRestraints": 1}, playerTags: {"posLatex": -1, "latexRage": 4}, minLevel: 0, allFloors: true, shrine: ["Latex", "Straitjackets", "Block_ItemHands"]}, + + {inventory: true, name: "LatexTransportJacket", inaccessible: true, factionColor: [[0, 1, 2]], remove: ["Bra", "Tops"], Asset: "StraitLeotard", Modules: [1, 1, 1, 1], Color: ["#499ed6", "#499ed6", "#499ed6"], + Group: "ItemArms", bindarms: true, bindhands: 1.33, power: 10, weight: 0, strictness: 0.3, + LinkableBy: [...KDTransportLink], + renderWhenLinked: [...KDJacketRender], + Model: "JacketHeavy", + sfxGroup: "Rubber", + Filters: { + BeltsChest: {"gamma":1,"saturation":0.08333333333333333,"contrast":1.3166666666666664,"brightness":2.8666666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":0.08333333333333333,"contrast":1.3166666666666664,"brightness":2.8666666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsLower: {"gamma":1,"saturation":0.08333333333333333,"contrast":1.3166666666666664,"brightness":2.8666666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + Chest: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":0.7833333333333334,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + Arms: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":0.7833333333333334,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + Lower: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":0.7833333333333334,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + LatexLower: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":2.2666666666666666,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + LatexUpper: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":2.2666666666666666,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + factionFilters: { + Chest: {color: "DarkNeutral", override: true}, + Lower: {color: "DarkNeutral", override: true}, + Arms: {color: "DarkNeutral", override: true}, + LatexLower: {color: "DarkNeutral", override: false}, + LatexUpper: {color: "DarkNeutral", override: false}, + }, + escapeChance: {"Struggle": -0.275, "Cut": 0.1, "Remove": 0.1, "Pick": 0.15}, + limitChance: {"Struggle": 0.12, "Cut": 0.16, "Remove": 0.15, "Unlock": 0.75}, + maxwill: 0.1, enemyTags: {"latexRestraintsHeavy" : -1, transportJacket: 1}, playerTags: {"LatexStraitjacketWorn": 20, "posLatex": -1, "latexRage": 4}, minLevel: 12, allFloors: true, shrine: ["Latex", "Straitjackets", "TransportJackets","Block_ItemHands"]}, + + + {inventory: true, name: "LatexArmbinder", inaccessible: true, factionColor: [[0]], Asset: "SeamlessLatexArmbinder", strictness: 0.1, + LinkableBy: [...KDArmbinderLink], Color: ["#499ed6"], Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7, weight: 0, + renderWhenLinked: [...KDArmbinderLink], + Model: "SmoothArmbinderGwen", + sfxGroup: "Rubber", + Filters: { + Straps: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1.5333333333333332,"blue":4.116666666666667,"alpha":1}, + BinderStraps: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1.5333333333333332,"blue":4.116666666666667,"alpha":1}, + Binder: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":2.4166666666666665,"blue":4.116666666666667,"alpha":1}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Armbinders": 3.5, + "Less_Armbinders": 0.1, + }, + factionFilters: { + Binder: {color: "DarkNeutral", override: true}, + Straps: {color: "LightNeutral", override: true}, + BinderStraps: {color: "LightNeutral", override: true}, + }, + escapeChance: {"Struggle": 0.15, "Cut": 0.15, "Remove": 0.1, "Pick": 0.35}, + limitChance: {"Struggle": 0.2, "Cut": 0.14, "Remove": 0.45, "Unlock": 0.2}, + maxwill: 0.35, enemyTags: {"latexRestraints" : 5, "latexarmbinderSpell": 100, "latexRestraintsForced" : 15, "jailRestraints": 5}, playerTags: {"posLatex": -1, "latexAnger": 1, "latexRage": 1}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Armbinders", "Block_ItemHands"]}, + {inventory: true, name: "LatexBoxbinder", debris: "Belts", inaccessible: true, Asset: "BoxTieArmbinder", strictness: 0.08, + Model: "SmoothArmbinderGwen", + sfxGroup: "Rubber", + Filters: { + Straps: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1.5333333333333332,"blue":4.116666666666667,"alpha":1}, + BinderStraps: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1.5333333333333332,"blue":4.116666666666667,"alpha":1}, + Binder: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":2.4166666666666665,"blue":4.116666666666667,"alpha":1}, + }, + factionFilters: { + Binder: {color: "DarkNeutral", override: true}, + BinderStraps: {color: "LightNeutral", override: true}, + Straps: {color: "LightNeutral", override: true}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Boxbinders": 3.5, + "Less_Boxbinders": 0.1, + }, + LinkableBy: [...KDBoxbinderLink], Color: ["#499ed6", "#ffffff"], Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7, weight: 0, factionColor: [[0]], + escapeChance: {"Struggle": 0.1, "Cut": 0.13, "Remove": 0.2, "Pick": 0.25}, + limitChance: {"Struggle": 0.2, "Cut": 0.14, "Remove": 0.45, "Unlock": 0.2}, + maxwill: 0.35, enemyTags: {"latexRestraints" : 5, "latexarmbinderspell": 10, "latexRestraintsForced" : 15, "jailRestraints": 5}, playerTags: {"posLatex": -1, "latexAnger": 1, "latexRage": 1}, + minLevel: 0, allFloors: true, shrine: ["Latex", "Boxbinders", "Block_ItemHands"]}, + {renderWhenLinked: [...KDLegbinderRender], inventory: true, name: "LatexLegbinder", inaccessible: true, factionColor: [[0]], Asset: "SeamlessLegBinder", LinkableBy: [...KDLegbinderLink], Color: ["#499ed6"], Group: "ItemLegs", hobble: 1, blockfeet: true, addTag: ["FeetLinked"], power: 7, weight: 0, escapeChance: {"Struggle": -0.05, "Cut": 0.15, "Remove": 0.1, "Pick": 0.35}, + Model: "Legbinder", + sfxGroup: "Rubber", + Filters: { + Binder: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1.6833333333333333,"blue":3.1,"alpha":1}, + }, + factionFilters: { + Binder: {color: "DarkNeutral", override: true}, + }, + struggleMult: {Struggle: 0.4}, + affinity: {Remove: ["Hook"], Struggle: ["Hook"],}, + maxwill: 0.25, enemyTags: {"latexRestraintsHeavy" : 6, "latexlegbinderSpell": 10, "jailRestraints": 1, "latexStart": 10}, playerTags: {"posLatex": -1, "latexAnger": 1, "latexRage": 2}, minLevel: 0, allFloors: true, shrine: ["Latex", "Legbinders"]}, + {inventory: true, name: "LatexBoots", inaccessible: true, factionColor: [[0]], Asset: "HighThighBoots", Color: ["#3873C3"], Group: "ItemBoots", power: 6, weight: 0, escapeChance: {"Struggle": -0.15, "Cut": 0.12, "Remove": 0.07, "Pick": 0.25}, + Model: "TallHeelsRestraint", + sfxGroup: "Rubber", + Filters: { + Shoe: {"gamma":0.75,"saturation":1,"contrast":0.7333333333333334,"brightness":0.6166666666666667,"red":1,"green":2.0833333333333335,"blue":2.8499999999999996,"alpha":1}, + }, + factionFilters: { + Shoe: {color: "LightNeutral", override: false, desaturate: true}, + }, + heelpower: 0.5, + enemyTags: {"latexRestraints" : 8, "latexBoots" : 3, "jailRestraints": 1, "latexheelSpell": 10, "latexUniform": 12}, playerTags: {"posLatex": -1, "latexAnger": 2, "latexRage": 2}, minLevel: 0, allFloors: true, shrine: ["Heels", "Latex", "Boots"]}, + {alwaysRender: true, inventory: true, name: "LatexCorset", linkCategory: "Corset", linkSize: 0.55, inaccessible: true, deepAccessible: true, factionColor: [[0]], + OverridePriority: 25.9, Asset: "HeavyLatexCorset", LinkableBy: KDCorsetLink, strictness: 0.1, Color: ["#5196EF"], Group: "ItemTorso", power: 8, weight: 0, + Model: "LatexCorsetCrossRestraint", + sfxGroup: "Rubber", + factionFilters: { + Corset: {color: "Catsuit", override: false}, + }, + Filters: {"HeavyCorset":{"gamma":1,"saturation":1,"contrast":1,"brightness":1.35,"red":1,"green":1,"blue":1,"alpha":1},"Corset":{"gamma":1.3,"saturation":0.9333333333333333,"contrast":1.2166666666666668,"brightness":2.2333333333333334,"red":1,"green":1,"blue":1,"alpha":1}}, + restriction: 10, + escapeChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": 0.15, "Pick": 0.3}, + limitChance: {"Struggle": 0.1, "Cut": 0.04, "Remove": 0.0, "Pick": 0.0}, + struggleMinSpeed: {"Remove": 0.05}, struggleMaxSpeed: {"Remove": 0.1}, + affinity: {Remove: ["Hook"], Struggle: ["Hook"],}, + failSuffix: {"Remove": "Corset"}, + enemyTags: {"latexRestraints" : 7, "latexcorsetSpell": 10, "jailRestraints": 1, "latexUniform": 12}, + playerTags: {"ItemTorsoFull": -5, "posLatex": -1, "latexAnger": 2, "latexRage": 2}, + minLevel: 0, allFloors: true, shrine: ["Corsets", "Latex", "HeavyCorsets"]}, + + {inventory: true, name: "LatexBallGag", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], Asset: "BallGag", gag: 0.75, Color: ["#4EA1FF", "Default"], Type: "Tight", Group: "ItemMouth", power: 7, weight: 0, escapeChance: {"Struggle": -0.05, "Cut": 0.04, "Remove": 0.4, "Pick": 0.25}, + Model: "SmoothBallGag", + sfxGroup: "Rubber", + biggerVersion: "LatexBallGagLarge", + quickBindCondition: "BallGag", quickBindMult: 0.5, + Filters: { + Ball: {"gamma":1,"saturation":0.16666666666666666,"contrast":1.25,"brightness":1.8166666666666667,"red":0.3166666666666667,"green":1.3333333333333333,"blue":2.8499999999999996,"alpha":1}, + }, + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + factionFilters: { + Straps: {color: "LightNeutral", override: true}, + Ball: {color: "Highlight", override: false}, + }, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], keepLock: true, power: 1, msg: "KDGagNecklaceOn"}], + maxwill: 0.8, enemyTags: {"latexRestraints" : 3, "latexGag" : 10, "latexgagSpell": 10, "jailRestraints": 1, forceAntiMagic: -100}, playerTags: {"posLatex": -1, "latexAnger": 2, "latexRage": 2}, minLevel: 0, maxLevel: 5, allFloors: true, shrine: ["BallGags", "Latex" , "Gags"]}, + {inventory: true, name: "LatexBallGagLarge", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], Asset: "BallGag", gag: 0.75, Color: ["#4EA1FF", "Default"], Type: "Tight", Group: "ItemMouth", power: 7, weight: 0, escapeChance: {"Struggle": -0.05, "Cut": 0.04, "Remove": 0.4, "Pick": 0.25}, + Model: "SmoothLargeBallGag", + sfxGroup: "Rubber", + quickBindCondition: "BallGag", quickBindMult: 0.5, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], keepLock: true, power: 1, msg: "KDGagNecklaceOn"}], + Filters: { + Ball: {"gamma":1,"saturation":0.16666666666666666,"contrast":1.25,"brightness":1.8166666666666667,"red":0.3166666666666667,"green":1.3333333333333333,"blue":2.8499999999999996,"alpha":1}, + }, + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + factionFilters: { + Straps: {color: "LightNeutral", override: true}, + Ball: {color: "Highlight", override: false}, + }, + maxwill: 0.8, enemyTags: {"latexRestraints" : 5, "latexRestraintsHeavy" : 5, "latexgagSpell": 10, forceAntiMagic: -100, "latexGag" : 10, "jailRestraints": 3}, ignoreMinLevelTags: ["latexRestraintsHeavy"], playerTags: {"posLatex": -1, "latexAnger": 2, "latexRage": 4}, minLevel: 4, allFloors: true, shrine: ["BallGags", "Latex" , "Gags"]}, + + + {inventory: true, name: "LatexOTNGag", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], factionColor: [[0], [0], [0]], Asset: "KittyGag", gag: 0.5, Color: ["#4EA1FF", "#4EA1FF", "#4EA1FF"], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 4, weight: -6, escapeChance: {"Struggle": 0.05, "Cut": 0.18, "Remove": 0.1}, + Model: "GagLatex", + sfxGroup: "Rubber", + Filters: { + Latex: {"gamma":1,"saturation":0.16666666666666666,"contrast":1.25,"brightness":1.8166666666666667,"red":0.3166666666666667,"green":0.48333333333333334,"blue":2.8499999999999996,"alpha":1}, + }, + + factionFilters: { + Latex: {color: "Highlight", override: true}, + }, + maxwill: 0.5, enemyTags: {"latexRestraints":6, "latexgagSpell": 10}, playerTags: {"ItemMouthFull": 6}, minLevel: 0, allFloors: true, shrine: ["FlatGags", "Latex", "Gags"]}, + {inventory: true, name: "LatexOTNGagHeavy", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], factionColor: [[0], [0], [0]], + Asset: "KittyGag", gag: 0.5, Color: ["#4EA1FF", "#4EA1FF", "#4EA1FF"], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 6, weight: -6, + escapeChance: {"Struggle": -0.1, "Cut": 0.04, "Remove": 0.1, Pick: 0.0}, + Model: "ShinyLatexMuzzle", //Model: "GagLatexMute", + sfxGroup: "Rubber", + Filters: { + Gag: {"gamma":1,"saturation":1,"contrast":1.4166666666666665,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Rim: {"gamma":1,"saturation":0.16666666666666666,"contrast":1.25,"brightness":1.8166666666666667,"red":0.3166666666666667,"green":0.48333333333333334,"blue":2.8499999999999996,"alpha":1}, + }, + factionFilters: { + Gag: {color: "LightNeutral", override: false}, + Rim: {color: "Highlight", override: true}, + }, + maxwill: 0.5, enemyTags: {"latexRestraints":6, "latexgagSpell": 10}, playerTags: {"ItemMouthFull": 6}, minLevel: 0, allFloors: true, shrine: ["FlatGags", "Latex", "Gags"]}, + + {inventory: true, unlimited: true, name: "LatexMittens", + Model: "LatexMittens", + sfxGroup: "Rubber", + Filters: { + Mitten: {"gamma":1,"saturation":0.16666666666666666,"contrast":1.25,"brightness":1.8166666666666667,"red":0.3166666666666667,"green":0.48333333333333334,"blue":2.8499999999999996,"alpha":1}, + }, + factionFilters: { + Mitten: {color: "DarkNeutral", override: true}, + }, + Asset: "LatexElbowGloves", Color: "#ff5277", LinkableBy: [...KDGlovesLink], renderWhenLinked: ["Mittens"], Group: "ItemHands", + bindhands: 1.0, power: 7, weight: 0, + escapeChance: {"Struggle": -0.05, "Cut": 0.09, "Remove": 0.4, "Pick": 0.25}, + maxwill: 0.4, enemyTags: {"latexRestraints":6,"mittensSpell": 10}, playerTags: {"ItemHandsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Mittens", "Latex"]}, + + + {renderWhenLinked: ["Corsets", "Harnesses", ...KDBindable, "Latex", "Leather", "Metal", "Rope"], inventory: true, + name: "LatexCatsuit", inaccessible: true, + factionColor: [[0]], Asset: "SeamlessCatsuit", AssetGroup: "Suit", Color: ["#3873C3"], + alwaysAccessible: true, + sfxGroup: "Rubber", + Model: "Catsuit", + Filters: { + TorsoLower: {"gamma":2.7666666666666666,"saturation":1.6833333333333333,"contrast":0.8,"brightness":1.5,"red":0.6333333333333334,"green":1.1833333333333333,"blue":2.033333333333333,"alpha":1}, + TorsoUpper: {"gamma":2.7666666666666666,"saturation":1.6833333333333333,"contrast":0.8,"brightness":1.5,"red":0.6333333333333334,"green":1.1833333333333333,"blue":2.033333333333333,"alpha":1}, + }, + factionFilters: { + TorsoLower: {color: "Catsuit", override: true}, + TorsoUpper: {color: "Catsuit", override: true}, + }, + LinkAll: true, noDupe: true, + linkCategory: "Catsuits", linkSize: 0.45, + restriction: 1, + Group: "ItemTorso", power: 6, weight: 0, escapeChance: {"Struggle": -0.8, "Cut": 0.1, "Remove": 0.05}, + enemyTags: {"latexRestraintsHeavy" : 6, "latexRestraints" : 2, "latexCatsuits": 12, "latexUniform": 12, "latexStart": 10, 'shopCatsuit': 10, "latexcatsuitSpell": 10}, playerTags: {"posLatex": -1, "latexAnger": 2, "latexRage": 2}, minLevel: 0, maxLevel: 10, allFloors: true, shrine: ["Catsuits", "Latex", "Suits"], + alwaysDress: [ + {Item: "SeamlessCatsuit", Group: "Suit", Color: ['#3873C3'], override: true, factionColor: [[0]]}, + {Item: "SeamlessCatsuit", Group: "SuitLower", Color: ['#3873C3'], override: true, factionColor: [[0]]}, + {Item: "Catsuit", Group: "Gloves", Color: ['#3873C3'], override: true, factionColor: [[0]]}], + events: [ + {trigger: "beforeStruggleCalc", type: "latexDebuff", power: 0.15, inheritLinked: true} + ] + }, + + + {renderWhenLinked: ["Corsets", "Harnesses", ...KDBindable, "Latex", "Leather", "Metal", "Rope"], inventory: true, + name: "HeavyLatexCatsuit", inaccessible: true, + factionColor: [[0]], Asset: "SeamlessCatsuit", AssetGroup: "Suit", Color: ["#3873C3"], + sfxGroup: "Rubber", + alwaysAccessible: true, + Model: "Catsuit", + Filters: { + TorsoLower: {"gamma":2.7666666666666666,"saturation":1.6833333333333333,"contrast":0.8,"brightness":1.5,"red":0.6333333333333334,"green":1.1833333333333333,"blue":2.033333333333333,"alpha":1}, + TorsoUpper: {"gamma":2.7666666666666666,"saturation":1.6833333333333333,"contrast":0.8,"brightness":1.5,"red":0.6333333333333334,"green":1.1833333333333333,"blue":2.033333333333333,"alpha":1}, + }, + factionFilters: { + TorsoLower: {color: "Catsuit", override: true}, + TorsoUpper: {color: "Catsuit", override: true}, + }, + LinkAll: true, noDupe: true, + linkCategory: "Catsuits", linkSize: 0.75, + restriction: 3, + Group: "ItemTorso", power: 8.5, weight: 0, escapeChance: {"Struggle": -1.4, "Cut": -0.1, "Remove": 0.025}, + enemyTags: {"latexRestraintsHeavy" : 1.4, "latexRestraints" : 2, "latexCatsuits": 3, "latexUniform": 3, "latexStart": 10, 'shopCatsuit': 5, "latexcatsuitSpell": 5}, playerTags: {"posLatex": -1, "latexAnger": 2, "latexRage": 2}, minLevel: 7, allFloors: true, shrine: ["Catsuits", "Latex", "Suits"], + alwaysDress: [ + {Item: "SeamlessCatsuit", Group: "Suit", Color: ['#3873C3'], override: true, factionColor: [[0]]}, + {Item: "SeamlessCatsuit", Group: "SuitLower", Color: ['#3873C3'], override: true, factionColor: [[0]]}, + {Item: "Catsuit", Group: "Gloves", Color: ['#3873C3'], override: true, factionColor: [[0]]}], + events: [ + {trigger: "beforeStruggleCalc", type: "latexDebuff", power: 0.25, inheritLinked: true} + ] + }, + //endregion + + //region crystal + + {inventory: true, unlimited: true, name: "CrystalBallGag", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], Asset: "BallGag", gag: 0.75, Color: ["#ff5277", "#882222"], + Model: "CrystalBallGag", + quickBindCondition: "BallGag", quickBindMult: 0.5, + events: [ + {trigger: "tick", type: "crystalDrain", power: -0.025, inheritLinked: true}, + {trigger: "struggle", type: "crystalPunish"}, + {trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["CrystalGagNecklace"], keepLock: true, power: 1, msg: "KDGagNecklaceOn"} + ], + factionFilters: { + Ball: {color: "Highlight", override: true}, + }, + Group: "ItemMouth", power: 7, weight: 0, + + escapeChance: {"Struggle": 0.15, "Cut": 0.1, "Remove": 0.1, "Pick": 0.35}, + limitChance: {"Struggle": 0.2, "Cut": 0.12}, + DefaultLock: "Crystal", + maxwill: 0.6, enemyTags: {"crystalRestraints" : 5, crystalGag: 100}, + playerTags: {"posElements": -1, "elementsAnger": 1, "elementsRage": 1}, + minLevel: 4, allFloors: true, + shrine: ["Crystal", "Elements", "BallGags", "Gags"]}, + + + {inventory: true, name: "CrystalArmbinder", inaccessible: true, factionColor: [[0]], Asset: "SeamlessLatexArmbinder", strictness: 0.1, + LinkableBy: [...KDArmbinderLink], Color: ["#499ed6"], Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7, weight: 0, + renderWhenLinked: [...KDArmbinderLink], + Model: "SmoothArmbinder", + Filters: { + Binder: {"gamma":0.95,"saturation":1,"contrast":0.95,"brightness":1.4166666666666665,"red":2.0166666666666666,"green":0.9833333333333333,"blue":2.5333333333333337,"alpha":0.6666666666666666}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Armbinders": 3.5, + "Less_Armbinders": 0.1, + }, + factionFilters: { + Binder: {color: "DarkNeutral", override: true}, + }, + events: [ + {trigger: "tick", type: "crystalDrain", power: -0.025, inheritLinked: true}, + {trigger: "struggle", type: "crystalPunish"}, + ], + escapeChance: {"Struggle": 0.15, "Cut": 0.15, "Remove": 0.1, "Pick": 0.35}, + limitChance: {"Struggle": 0.2, "Cut": 0.1, "Remove": 0.45, "Unlock": 0.2}, + maxwill: 0.35, enemyTags: {"crystalRestraints" : 5, "crystalBinder": 100}, + playerTags: {"posElements": -1, "elementsAnger": 1, "elementsRage": 1}, + minLevel: 0, allFloors: true, shrine: ["Crystal", "Leather", "Elements", "Armbinders", "Block_ItemHands"]}, + + + {renderWhenLinked: ["Corsets", "Harnesses", ...KDBindable, "Latex", "Leather", "Metal", "Rope"], name: "Crystal", + inaccessible: true, factionColor: [[0]], Asset: "TransparentCatsuit", AssetGroup: "Suit", Color: ["#3873C3"], + Group: "ItemDevices", power: 10, weight: 0, escapeChance: {"Struggle": -0.4, "Cut": -0.8, "Remove": -100}, + enemyTags: {crystalEncase: 100}, + bindhands: 1.0, + bindarms: true, + playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Container", "CrystalEncase", "BlockKneel", "FeetLinked", "HandsBehind"], ignoreSpells: true, removeOnLeash: true, immobile: true, + alwaysEscapable: ["Struggle"], + struggleMinSpeed: { + Struggle: 0.06, + }, + struggleMaxSpeed: { + Struggle: 0.4, + }, + limitChance: { + Struggle: -0.01, + }, + Model: "CrystalEncase", + Filters:{ + TorsoUpper: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1.9666666666666666,"blue":1,"alpha":0.48333333333333334}, + Torso: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1.9666666666666666,"blue":1,"alpha":0.48333333333333334}, + TorsoLower: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1.9666666666666666,"blue":1,"alpha":0.48333333333333334}, + }, + events: [ + //{trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, + {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}, + {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, + //{trigger: "beforeStruggleCalc", type: "latexDebuff", power: 0.15, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "shatter", mult: 1.5, subMult: 0.5, count: 9, inheritLinked: true}, + ] + }, + //endregion + + //region resin + {renderWhenLinked: ["Corsets", "Harnesses", ...KDBindable, "Latex", "Leather", "Metal", "Rope"], inventory: true, name: "Resin", + inaccessible: true, factionColor: [[0]], Asset: "TransparentCatsuit", AssetGroup: "Suit", Color: ["#3873C3"], + Group: "ItemDevices", power: 10, weight: 0, escapeChance: {"Struggle": -0.4, "Cut": -0.3, "Remove": -100}, + enemyTags: {"resinRestraints" : 10, 'resin': 10,}, + bindhands: 1.0, + bindarms: true, + playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Container"], ignoreSpells: true, removeOnLeash: true, immobile: true, + + Model: "TransparentCatsuit", + Filters:{ + TorsoUpper: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1.9666666666666666,"blue":1,"alpha":0.48333333333333334}, + Torso: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1.9666666666666666,"blue":1,"alpha":0.48333333333333334}, + TorsoLower: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1.9666666666666666,"blue":1,"alpha":0.48333333333333334}, + }, + alwaysDress: [ + {Item: "SeethroughSuit", Group: "Suit", Color: ['#63ab3f'], override: true, factionColor: [[0]]}, + {Item: "SeethroughSuit", Group: "SuitLower", Color: ['#63ab3f'], override: true, factionColor: [[0]]}, + {Item: "SeethroughSuit", Group: "Gloves", Color: ['#63ab3f'], override: true, factionColor: [[0]]}], + events: [ + {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, + {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}, + {trigger: "beforeStruggleCalc", type: "latexDebuff", power: 0.15, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "shatter", mult: 1.5, subMult: 0.5, count: 9, inheritLinked: true}, + ] + }, + //endregion + + //region redLatex + + {inventory: true, unlimited: true, name: "RedLatexOTNGag", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], + factionColor: [[2], [2], [2]], Asset: "KittyGag", gag: 0.5, Color: ["#ff5277", "#ff5277", "#ff5277"], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 7, weight: -6, + escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1}, + Model: "GagLatexMute", + sfxGroup: "Rubber", + Filters: { + Latex: {"gamma":0.35000000000000003,"saturation":0.16666666666666666,"contrast":1.25,"brightness":0.7333333333333334,"red":2.5166666666666666,"green":0.48333333333333334,"blue":0.41666666666666663,"alpha":1}, + }, + factionFilters: { + Latex: {color: "Highlight", override: false}, + }, + maxwill: 0.8, enemyTags: {"redLatexBasic":6}, playerTags: {"ItemMouthFull": 6}, minLevel: 0, allFloors: true, shrine: ["Latex", "RedLatex", "FlatGags", "Gags"]}, + {inventory: true, unlimited: true, name: "RedLatexBallGag", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], Asset: "BallGag", gag: 0.75, Color: ["#ff5277", "#882222"], + Model: "BallGag", + sfxGroup: "Rubber", + quickBindCondition: "BallGag", quickBindMult: 0.5, + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], keepLock: true, power: 1, msg: "KDGagNecklaceOn"}], + factionFilters: { + Strap: {color: "DarkNeutral", override: false}, + Ball: {color: "Highlight", override: false}, + }, + Type: "Tight", Group: "ItemMouth", power: 6, weight: 0, escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1}, + maxwill: 0.8, enemyTags: {"redLatexBasic" : 5, forceAntiMagic: -100}, playerTags: {"latexAnger": 2, "latexRage": 2}, minLevel: 0, allFloors: true, shrine: ["Latex", "RedLatex", "BallGags", "Gags"]}, + + {inventory: true, unlimited: true, name: "RedLatexMask", LinkableBy: [...KDMaskLink], + Filters: { + Rubber: {"gamma":0.35000000000000003,"saturation":0.16666666666666666,"contrast":1.25,"brightness":0.7333333333333334,"red":2.5166666666666666,"green":0.48333333333333334,"blue":0.41666666666666663,"alpha":1}, + }, + factionFilters: { + Rubber: {color: "Highlight", override: false}, + }, + Model: "RubberHead", + sfxGroup: "Rubber", + gag: 0.3, blindfold: 6, power: 7, weight: -6, + factionColor: [[2]], Color: ["#ff5277"], Group: "ItemHead", Asset: "DroneMask", + escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1}, + maxwill: 0.8, enemyTags: {"redLatexBasic":6}, playerTags: {"ItemMouthFull": 6, "Unmasked": -1000}, minLevel: 0, allFloors: true, shrine: ["Latex", "RedLatex", "Masks", "Block_ItemMouth"]}, + + {inventory: true, unlimited: true, name: "RedLatexHands", + Model: "BunnyGlovesRestraint", + Filters: {"GloveLeft":{"gamma":1,"saturation":0.23333333333333334,"contrast":2.966666666666667,"brightness":0.21666666666666667,"red":2.4833333333333334,"green":0.6666666666666666,"blue":0.6,"alpha":1},"GloveRight":{"gamma":1,"saturation":0.23333333333333334,"contrast":2.966666666666667,"brightness":0.21666666666666667,"red":2.4833333333333334,"green":0.6666666666666666,"blue":0.6,"alpha":1}}, + + sfxGroup: "Rubber", + factionFilters: { + GloveRight: {color: "Highlight", override: false}, + GloveLeft: {color: "Highlight", override: false}, + }, + Asset: "LatexElbowGloves", Color: "#ff5277", LinkableBy: [...KDGlovesLink], Group: "ItemHands", AssetGroup: "Gloves", + bindhands: 0.5, power: 10, weight: 0, + affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, + escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1}, + maxwill: 0.4, enemyTags: {"redLatexBasic":2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "RedLatex", "Gloves"]}, + + {inventory: true, unlimited: true, name: "RedLatexBoots", + LinkableBy: [...KDSocksLink], renderWhenLinked: ["Boots"], deepAccessible: true, alwaysAccessible: true, + heelpower: 0.5, + sfxGroup: "Rubber", + Model: "BunnySocksRestraint", + Filters: {"SockLeft":{"gamma":1,"saturation":0.23333333333333334,"contrast":2.966666666666667,"brightness":0.21666666666666667,"red":2.4833333333333334,"green":0.6666666666666666,"blue":0.6,"alpha":1},"SockRight":{"gamma":1,"saturation":0.23333333333333334,"contrast":2.966666666666667,"brightness":0.21666666666666667,"red":2.4833333333333334,"green":0.6666666666666666,"blue":0.6,"alpha":1}}, + + factionFilters: { + SockRight: {color: "Highlight", override: false}, + SockLeft: {color: "Highlight", override: false}, + }, + power: 5, weight: 0, + factionColor: [[2]], Color: ["#ff5277"], Group: "ItemBoots", AssetGroup: "Socks", Asset: "LatexSocks1", + escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1}, + maxwill: 0.8, enemyTags: {"redLatexBasic":5}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "RedLatex", "Socks"]}, + + //endregion + + //region Wolf + {inventory: true, name: "WolfArmbinder", debris: "Belts", inaccessible: true, Asset: "SeamlessLatexArmbinder", strictness: 0.1, LinkableBy: [...KDArmbinderLink], Color: "#2E2E2E", Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7.5, weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.15, "Remove": 0.07, "Pick": 0.2}, + Model: "WolfArmbinder", + sfxGroup: "Rubber", + Filters: { + BinderStraps: {"gamma":1.1,"saturation":2.4333333333333336,"contrast":1.1333333333333333,"brightness":2.15,"red":1.4666666666666668,"green":4.25,"blue":1,"alpha":1}, + }, + renderWhenLinked: [...KDArmbinderLink], + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Armbinders": 3.5, + "Less_Armbinders": 0.1, + }, + factionFilters: { + Binder: {color: "DarkNeutral", override: true}, + Straps: {color: "Highlight", override: true}, + BinderStraps: {color: "Highlight", override: true}, + }, + limitChance: {"Cut": 0.1, "Remove": 0.04, "Unlock": 0.2}, + maxwill: 0.35, enemyTags: {"wolfRestraints" : 5}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Metal", "Armbinders", "Block_ItemHands"]}, + {inventory: true, name: "WolfStrongArmbinder", debris: "Belts", inaccessible: true, Asset: "SeamlessLatexArmbinder", strictness: 0.2, LinkableBy: [...KDArmbinderLink], Color: "#2E2E2E", Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 9, weight: 0, escapeChance: {"Struggle": -0.25, "Cut": -0.15, "Remove": -0.07, "Pick": -0.2}, + Model: "JacketHeavyArmbinder", + sfxGroup: "Rubber", + Filters: { + BeltsArms: {"gamma":1.3,"saturation":0,"contrast":2.216666666666667,"brightness":1.2,"red":1.85,"green":3.333333333333333,"blue":1,"alpha":1}, + BeltsChest: {"gamma":1.3,"saturation":0,"contrast":2.216666666666667,"brightness":1.2,"red":1.85,"green":3.333333333333333,"blue":1,"alpha":1}, + BeltsLower: {"gamma":1.3,"saturation":0,"contrast":2.216666666666667,"brightness":1.2,"red":1.85,"green":3.333333333333333,"blue":1,"alpha":1}, + }, + renderWhenLinked: [...KDArmbinderLink], + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Armbinders": 3.5, + "Less_Armbinders": 0.1, + }, + factionFilters: { + Arms: {color: "DarkNeutral", override: true}, + BeltsArms: {color: "Highlight", override: true}, + BeltsChest: {color: "Highlight", override: true}, + BeltsLower: {color: "Highlight", override: true}, + }, + limitChance: {"Cut": 0.1, "Remove": 0.04, "Unlock": 0.2}, + maxwill: 0.2, enemyTags: {"wolfRestraintsHeavy" : 1}, playerTags: {}, minLevel: 12, allFloors: true, shrine: ["Latex", "Metal", "Armbinders", "Block_ItemHands"]}, + {inventory: true, name: "WolfAnkleCuffs", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", LinkableBy: [...KDBindable], Type: "Chained", Color: ['#4F91DE', '#4F91DE', '#3F6945', '#000000'], Group: "ItemFeet", power: 8, weight: 0, + Model: "WolfCuffsAnkles", + sfxGroup: "Handcuffs", + linkCategory: "AnkleCuffs", linkSize: 0.51, noDupe: true, + escapeChance: {"Struggle": -0.5, "Cut": -0.4, "Remove": 0.4, "Pick": 0.15}, + maxwill: 1.0, enemyTags: {"wolfRestraints":7}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Cuffs", "Metal", "AnkleCuffsBase", "HogtieLower"], + events: [ + {trigger: "remotePunish", type: "RemoteLinkItem", restraint: "AnkleLinkShort", sfx: "LightJingle", noLeash: true, enemyDialogue: "KDDialogueRemoteLinkCuffs", msg: "KDMsgRemoteLinkCuffs"}, + ] + }, + {alwaysRender: true, inventory: true, name: "WolfHarness", debris: "Belts", accessible: true, remove: ["Cloth"], Asset: "FuturisticHarness", LinkableBy: [...KDHarnessLink], + strictness: 0.05, harness: true, Color: ['#4F91DE', '#346942', '#889FA7', "#000000"], Group: "ItemTorso", power: 4, weight: 0, + + sfxGroup: "Ropes", + restriction: 3, + Model: "WolfHarnessRestraint", + factionFilters: { + Lining: {color: "DarkNeutral", override: true}, + Band: {color: "Highlight", override: true}, + Hardware: {color: "LightNeutral", override: true}, + }, + escapeChance: {"Struggle": -0.15, "Cut": 0.12, "Remove": 0.1, "Pick": 0.35}, + maxwill: 1.0, enemyTags: {"wolfRestraints" : 6, "wolfGear":6}, playerTags: {"ItemTorsoFull": -5}, minLevel: 0, allFloors: true, shrine: ["Latex", "Harnesses"]}, + {inventory: true, unlimited: true, name: "WolfMittens", + Model: "LongMittens", + sfxGroup: "Rubber", + factionFilters: { + Mitten: {color: "DarkNeutral", override: true}, + Band: {color: "Highlight", override: true}, + Lock: {color: "LightNeutral", override: true}, + }, + Asset: "LatexElbowGloves", Color: "#ff5277", LinkableBy: [...KDGlovesLink], renderWhenLinked: ["Mittens"], Group: "ItemHands", + bindhands: 1.0, power: 10, weight: 0, + escapeChance: {"Struggle": -0.1, "Cut": -0.1, "Remove": -0.1, "Pick": 1.0}, + maxwill: 0.4, enemyTags: {"wolfRestraints" : 6, "wolfGear":6}, playerTags: {"ItemHandsFull":-2}, minLevel: 0, allFloors: true, shrine: ["LongMittens", "Mittens", "Latex"]}, + + {inventory: true, name: "WolfBallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], + Model: "SegmentedLargeBallGagHarnessSecure", + sfxGroup: "Rubber", + Asset: "FuturisticHarnessBallGag", strictness: 0.35, gag: 0.65, + events: [ + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.35, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.25, requiredTag: "Blindfolds"}, + ], + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + Color: ['#5edc73', '#428E4F', '#6E6E6E', '#FFFFFF', '#000000'], Group: "ItemMouth", power: 9, weight: 0, + maxwill: 0.75, escapeChance: {"Struggle": -0.3, "Cut": 0.0, "Remove": 0.05, "Pick": 0.2}, + enemyTags: {"wolfRestraints" : 8, forceAntiMagic: -100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["BallGags", "Latex" , "Gags", "Metal"]}, + {inventory: true, name: "WolfCollar", debris: "Belts", accessible: true, Asset: "AutoShockCollar", Color: ['#6EAF81', '#6EAF81'], Group: "ItemNeck", + LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDHighCollarRender],power: 6, weight: 0, escapeChance: {"Struggle": 0.0, "Cut": 0.1, "Remove": 0.1, "Pick": -0.05}, + Model: "WolfCollarTag", + sfxGroup: "Leather", + factionFilters: { + Lining: {color: "DarkNeutral", override: true}, + Band: {color: "Highlight", override: true}, + Hardware: {color: "LightNeutral", override: true}, + }, + linkCategory: "BasicCollar", linkSize: 0.51, + struggleBreak: true, + maxwill: 0.5, enemyTags: {"wolfRestraints":3, "wolfGear":3, "wolfLeash": 1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "HighCollars", "Collars"], + }, + {inventory: true, name: "ShockModule", debris: "Belts", accessible: true, Asset: "AutoShockCollar", Color: ['#6EAF81', '#6EAF81'], + Group: "ItemNeck", LinkableBy: [...KDCollarModuleLink], power: 10, weight: 0, escapeChance: {"Struggle": -0.05, "Cut": 0, "Remove": 0.1, "Pick": -0.15}, + Model: "ShockModule", + factionFilters: { + Module: {color: "LightNeutral", override: true}, + ModuleDisplay: {color: "Highlight", override: false}, + }, + DefaultLock: "Red_Hi", + struggleBreak: true, + maxwill: 0.35, enemyTags: {"wolfRestraints":3, "wolfGear":3, "wolfLeash": 1, "shockmodule": 10}, + playerTags: {}, playerTagsMissing: {Collars: -1000}, minLevel: 2, allFloors: true, shrine: ["Modules", "Metal", "ModulePunish"], + requireSingleTagToEquip: ["Collars"], + linkCategory: "ModulePunish", linkSize: 0.6, + events: [ + {trigger: "afterPlayerDamage", type: "moduleDamage", mult: 1.5, subMult: 0.5, count: 7, inheritLinked: true}, + {trigger: "postRemoval", type: "collarModule"}, + {trigger: "playerAttack", type: "PunishPlayer", count: 4, chance: 0.25, stun: 2, warningchance: 1.0, damage: "electric", power: 2, sfx: "Shock", inheritLinked: true,}, + {trigger: "beforeStruggleCalc", type: "ShockForStruggle", count: 4, chance: 0.5, stun: 2, warningchance: 0.85, damage: "electric", power: 2, sfx: "Shock", bind: 0.2, inheritLinked: true,}, + {trigger: "playerCast", type: "PunishPlayer", count: 4, chance: 0.35, warningchance: 0.85, punishComponent: "Verbal", damage: "electric", power: 2, sfx: "Shock", inheritLinked: true,}, + {trigger: "remotePunish", type: "RemoteActivatedShock", count: 4, chance: 0.1, stun: 2, damage: "electric", power: 1, sfx: "Shock", noLeash: true, inheritLinked: true,} + ]}, + {inventory: true, name: "TrackingModule", debris: "Belts", accessible: true, Asset: "AutoShockCollar", Color: ['#6EAF81', '#6EAF81'], + Group: "ItemNeck", LinkableBy: [...KDCollarModuleLink], power: 6, weight: 0, escapeChance: {"Struggle": -0.05, "Cut": 0, "Remove": 0.1, "Pick": -0.15}, + Model: "TrackingModule", + DefaultLock: "Red_Hi", + factionFilters: { + Module: {color: "LightNeutral", override: true}, + ModuleDisplay: {color: "Highlight", override: false}, + }, + struggleBreak: true, + maxwill: 0.35, enemyTags: {"controlHarness":5, "roboPrisoner" : 100, "cyberdollrestraints" : 10, "trackingmodule": 10}, + playerTags: {}, playerTagsMissing: {Collars: -1000}, minLevel: 2, allFloors: true, shrine: ["Modules", "Metal", "ModuleUtility"], + linkCategory: "ModuleUtility", linkSize: 0.6, + requireSingleTagToEquip: ["Collars"], + events: [ + {trigger: "afterPlayerDamage", type: "moduleDamage", mult: 1.5, subMult: 0.5, count: 9, inheritLinked: true}, + {trigger: "postRemoval", type: "collarModule"}, + {trigger: "playerAttack", type: "AlertEnemies", chance: 1.0, power: 10, sfx: "RobotBeep", inheritLinked: true}, + ]}, + + {inventory: true, removePrison: true, name: "WolfLeash", debris: "Belts", tether: 2.9, Asset: "CollarLeash", Color: "#44fF76", Group: "ItemNeckRestraints", leash: true, power: 1, weight: -99, harness: true, + Model: "Leash", + sfxGroup: "Ropes", + struggleBreak: true, + affinity: { + Cut: ["SharpHookOrFoot"], + Struggle: ["HookOrFoot"], + }, + Filters: { + Leash: {"gamma":1,"saturation":1,"contrast":1.6,"brightness":0.6666666666666666,"red":1,"green":2.0833333333333335,"blue":1,"alpha":1}, + }, + factionFilters: { + Leash: {color: "Highlight", override: false}, + Hardware: {color: "DarkNeutral", override: true}, + }, + unlimited: true, + requireAllTagsToEquip: ["Collars"], + events: [ + {trigger: "postRemoval", type: "RequireCollar"}, + ], + limitChance: {Struggle: 0.2}, + escapeChance: {"Struggle": -0.14, "Cut": -0.2, "Remove": 0.4, "Pick": 0.35}, enemyTags: {"wolfRestraints":9, "wolfLeash": 10}, playerTags: {"ItemNeckRestraintsFull":-2, "ItemNeckFull":999}, minLevel: 0, allFloors: true, shrine: ["Leashes", "Leashable"]}, + + //endregion + + //region Cosplay + {inventory: true, name: "BindingDress", debris: "Fabric", inaccessible: true, remove: ["Cloth", "Bra", "Tops", "Bras"], Type: "Strap", Asset: "LeatherArmbinder", strictness: 0.25, Color: ['#473488'], Group: "ItemArms", + Model: "ArmbinderGwen", + Filters: { + "Straps":{"gamma":1,"saturation":0.08333333333333333,"contrast":0.7333333333333334,"brightness":1.25,"red":1.25,"green":0.6666666666666666,"blue":2.0833333333333335,"alpha":1}, + "BinderStraps":{"gamma":1,"saturation":1,"contrast":0.6666666666666666,"brightness":2.5166666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + "Binder":{"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.43333333333333335,"red":1.25,"green":0.6666666666666666,"blue":2.0833333333333335,"alpha":1}, + }, + factionFilters: { + Binder: {color: "Highlight", override: true,}, + BinderStraps: {color: "DarkNeutral", override: true,}, + Straps: {color: "DarkNeutral", override: true,}, + }, + + events: [ + {type: "FactionStealth", trigger: 'calcSneak', kind: "Dressmaker", mult: 0.8, power: 2,}, + ], + LinkableBy: [...KDDressLink], alwaysRender: true, bindarms: true, bindhands: 1.0, power: 8, weight: 0, + escapeChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": -0.2, "Pick": 0.15}, helpChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": 0.075}, + limitChance: {"Struggle": 0.125, "Cut": 0.125, "Remove": 0.1, "Unlock": 0.5}, + alwaysDress: [ + {Item: "PleatedSkirt", Group: "ClothLower", Color: ['#6B48E0'], override: true}, + {Item: "SleevelessCatsuit", Group: "Suit", Color: ['#473488'], override: true}, + {Item: "CatsuitPanties", Group: "SuitLower", Color: ['#473488'], override: true}], + forceOutfit: "Lingerie", + forceOutfitPriority: 1, + alwaysDressModel: [ + { + Model: "BindingDress", + Filters: { + "Skirt":{"gamma":1,"saturation":0.05,"contrast":1,"brightness":1.7166666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + SkirtBack: {"gamma":1,"saturation":0,"contrast":0.5700000000000001,"brightness":1,"red":0.5294117647058824,"green":0.35294117647058826,"blue":0.6470588235294118,"alpha":1} + }, + factionFilters: { + Base: {override: true, color: "DarkNeutral"}, + Hardware: {override: true, color: "Highlight"}, + Stripes: {override: true, color: "LightNeutral"}, + BraBase: {override: true, color: "DarkNeutral"}, + BraStripes: {override: true, color: "DarkNeutral"}, + BaseMetal: {override: false, color: "DarkNeutral"}, + Crystal: {override: false, color: "Highlight"}, + Skirt: {override: true, color: "LightNeutral"}, + SkirtBack: {override: false, color: "DarkNeutral"}, + Trim: {override: false, color: "Highlight"}, + Lace: {override: false, color: "Highlight"}, + Tie: {override: false, color: "Highlight"}, + Panties: {override: false, color: "DarkNeutral"}, + }, + } + ], + addPose: ["PreferWristtie"], + maxwill: 0.5, enemyTags: {"dressRestraints" : 10, "bindingDress": 10}, playerTagsMult: {"ItemArmsEmpty": 0.05}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["BindingDress", "Rope", "Block_ItemHands", "HandsBehind"]}, + {inventory: true, trappable: true, name: "DressGag", debris: "Fabric", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], Asset: "HarnessBallGag", + Model: "SmoothBallGagHarnessSecure", + Filters: { + Ball: {"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.43333333333333335,"red":1.25,"green":0.6666666666666666,"blue":2.0833333333333335,"alpha":1}, + }, + events: [ + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.35, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.25, requiredTag: "Blindfolds"}, + ], + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + gag: 0.65, Type: "Tight", Color: ["#8762c7", "Default"], Group: "ItemMouth", power: 8, strictness: 0.2, weight: 5, magic: true, + escapeChance: {"Struggle": -0.2, "Cut": 0.2, "Remove": 0.2, "Pick": 0.2}, + maxwill: 0.6, enemyTags: {"dressRestraints":3, forceAntiMagic: -100}, playerTags: {}, minLevel: 2, allFloors: true, shrine: ["Rope", "BallGags", "Gags"]}, + {inventory: true, trappable: true, name: "DressMuzzle", debris: "Fabric", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Asset: "MuzzleGag", gag: 0.3, Color: ["#6B48E0", "#39339c"], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 9, strictness: 0.3, weight: 1, magic: true, + Model: "GagFabric", + Filters: { + Fabric: {"gamma":1.8833333333333333,"saturation":1,"contrast":0.9833333333333333,"brightness":0.7166666666666667,"red":1.4333333333333333,"green":1.0166666666666666,"blue":2.183333333333333,"alpha":1}, + }, + escapeChance: {"Struggle": -0.4, "Cut": 0.15, "Remove": 0.2, "Pick": 0.1}, DefaultLock: "Blue", + maxwill: 0.1, enemyTags: {"dressRestraints":3, "dressGags": 3}, playerTags: {"ItemMouthEmpty": -10}, minLevel: 6, allFloors: true, shrine: ["FlatGags", "Rope", "Gags"]}, + + + + {alwaysRender: true, inventory: true, name: "DressCorset", debris: "Fabric", linkCategory: "Corset", linkSize: 0.55, inaccessible: true, factionColor: [[0]], OverridePriority: 26, Asset: "HeavyLatexCorset", + Model: "LaceCorsetRestraint", + factionFilters: { + Base: {color: "DarkNeutral", override: true}, + Stripes: {color: "LightNeutral", override: true}, + Crystal: {color: "Highlight", override: true}, + }, + restriction: 7, + LinkableBy: KDCorsetLink, strictness: 0.1, Color: ["#473488"], Group: "ItemTorso", power: 8, weight: 0, + escapeChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": -0.2, "Pick": 0.15}, helpChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": 0.025}, struggleMinSpeed: {"Remove": 0.05}, struggleMaxSpeed: {"Remove": 0.1}, + failSuffix: {"Remove": "Corset"}, enemyTags: {"dressRestraints": 1, "dressUniform": 12}, playerTags: {"ItemTorsoFull": -5, "conjureAnger": 2, "conjureRage": 2}, minLevel: 0, allFloors: true, shrine: ["Corsets", "Latex", "HeavyCorsets"], + alwaysDress: [ + {Item: "AsymmetricSkirt", Group: "ClothLower", Color: ['#6B48E0'], override: true}, + {Item: "SleevelessCatsuit", Group: "Suit", Color: ['#473488'], override: true}, + {Item: "CatsuitPanties", Group: "SuitLower", Color: ['#F8BD01'], override: true}], + }, + + {inventory: true, name: "DressBra", debris: "Fabric", inaccessible: true, Asset: "FuturisticBra2", Color: ['#6B48E0', '#F8BD01', '#6B48E0', '#6B48E0', '#F8BD01', '#6B48E0'], Group: "ItemBreast", LinkableBy: ["Ornate"], chastitybra: true, power: 8, weight: -2, + Model: "LaceBraDeco", + factionFilters: { + BraCups: {color: "DarkNeutral", override: true}, + BraBase: {color: "LightNeutral", override: true}, + BraStripes: {color: "Highlight", override: true}, + DecoBase: {color: "LightNeutral", override: true}, + DecoCrystal: {color: "Highlight", override: true}, + }, + Security: { + level_key: 2, + level_magic: 2, + }, + escapeChance: {"Struggle": -0.5, "Cut": -0.05, "Remove": 0.4, "Pick": 0.15}, bypass: true, + maxwill: 0.9, enemyTags: {"dressRestraints" : 10, "dressUniform" : 10}, playerTags: {"ItemNipplesFull": 2, "FreeBoob": -1000}, minLevel: 0, allFloors: true, shrine: ["ChastityBras", "Rope"]}, + + {inventory: true, name: "AsylumJacket", debris: "Belts", Asset: "HighSecurityStraitJacket", Modules: [1, 2, 3], Color: ["#333333", "#333333", '#808080', '#808080'], + LinkableBy: [...KDJacketLink], + sfxGroup: "Leather", + renderWhenLinked: [...KDJacketLink], Group: "ItemArms", power: 8, weight: 0, bindarms: true, bindhands: 1.0,strictness: 0.2, + + Model: "Jacket", + Filters: { + Chest: {"gamma":1.5333333333333332,"saturation":1,"contrast":0.8999999999999999,"brightness":2.15,"red":1,"green":1,"blue":1,"alpha":1}, + Arms: {"gamma":1.5333333333333332,"saturation":1,"contrast":0.8999999999999999,"brightness":2.15,"red":1,"green":1,"blue":1,"alpha":1}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + limitChance: {"Struggle": 0.12, "Cut": 0.03, "Remove": 0.1, "Unlock": 0.75}, + escapeChance: {"Struggle": -0.175, "Cut": 0.15, "Remove": 0.1, "Pick": 0.15}, + enemyTags: {"nurseRestraints": 5, "jacketSpell": 50}, playerTags: {"ItemArmsFull":-2}, minLevel: 0, maxwill: 0.35, allFloors: true, shrine: ["Straitjackets", "Block_ItemHands", "Leather"]}, + + {inventory: true, name: "TransportJacket", debris: "Belts", Asset: "TransportJacket", events: [{type: "PrisonerJacket", trigger: "afterDress"}], Color: ["#808080", "#202020", "#808080", "#EEEEEE", "#202020", "#808080"], + Model: "JacketHeavy", + sfxGroup: "Leather", + LinkableBy: [...KDTransportLink], + renderWhenLinked: [...KDJacketRender], + Filters: { + Chest: {"gamma":1.5333333333333332,"saturation":1,"contrast":0.8999999999999999,"brightness":2.15,"red":1,"green":1,"blue":1,"alpha":1}, + Arms: {"gamma":1.5333333333333332,"saturation":1,"contrast":0.8999999999999999,"brightness":2.15,"red":1,"green":1,"blue":1,"alpha":1}, + Lower: {"gamma":1.5333333333333332,"saturation":1,"contrast":0.8999999999999999,"brightness":2.15,"red":1,"green":1,"blue":1,"alpha":1}, + }, + harness: true, + Group: "ItemArms", power: 10, weight: -1, bindarms: true, bindhands: 1.0, strictness: 0.3, + unlimited: true, + limitChance: {"Struggle": 0.12, "Cut": 0.1, "Remove": 0.15, "Unlock": 0.75}, + escapeChance: {"Struggle": -0.175, "Cut": 0.1, "Remove": 0.1, "Pick": 0.15}, + enemyTags: {"nurseRestraints": 1, "transportJacket": 1}, playerTagsMult: {"ItemArmsEmpty": 0.02}, playerTags: {"AsylumJacketWorn": 20}, minLevel: 0, maxwill: 0.1, allFloors: true, shrine: ["Straitjackets", "Block_ItemHands", "TransportJackets", "Leather"]}, + + {renderWhenLinked: [...KDLegbinderRender], inventory: true, name: "AsylumLegbinder", debris: "Belts", inaccessible: true, Asset: "LegBinder", LinkableBy: [...KDLegbinderLink], Color: "Default", Group: "ItemLegs", blockfeet: true, + Model: "Legbinder", + sfxGroup: "Leather", + Filters: { + Binder: {"gamma":0.6333333333333334,"saturation":1,"contrast":0.6833333333333333,"brightness":0.6,"red":1.7999999999999998,"green":1.2333333333333334,"blue":1,"alpha":1}, + }, + factionFilters: { + Laces: {color: "DarkNeutral", override: true}, + }, + hobble: 1, + affinity: {Remove: ["Hook"], Struggle: ["Hook"],}, + maxwill: 0.1, + struggleMult: {Struggle: 0.4}, + power: 6, weight: 2, escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": 0.3, "Pick": 0.25}, enemyTags: {"nurseRestraints": 1}, playerTags: {"ItemArmsFull":3}, + struggleMaxSpeed: {"Remove": 0.1}, // Easy to remove but takes a while + minLevel: 0, allFloors: true, shrine: ["Leather", "Legbinders"]}, + + {inventory: true, name: "AsylumMuzzle", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.4, Asset: "FuturisticMuzzle", Modules: [1, 1, 0], Group: "ItemMouth", AssetGroup: "ItemMouth3", Color: ["#814F21","#814F21","#814F21","#814F21"], power: 8, weight: 2, + Model: "GagFabric", + sfxGroup: "Leather", + Filters: { + Fabric: {"gamma":0.6333333333333334,"saturation":1,"contrast":0.6833333333333333,"brightness":0.6,"red":1.7999999999999998,"green":1.2333333333333334,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": -0.14, "Cut": 0.18, "Remove": 0.25, "Pick": 0.2}, maxwill: 0.9, + enemyTags: {"nurseRestraints":3}, playerTags: {"ItemMouthFull":1}, minLevel: 0, allFloors: true, shrine: ["FlatGags", "Leather", "Gags"]}, + + //endregion + + //region Fuuka's stuff + {inventory: true, curse: "GhostLock", name: "MikoCollar", Asset: "HighCollar", Color: ["#ffffff", "#AA2222"],Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDHighCollarRender],magic: true, power: 40, weight: 0, difficultyBonus: 10, + Model: "MikoCollar", + struggleBreak: true, + special: true, + factionFilters: { + Rim: {color: "Highlight", override: true,}, + Neck: {color: "DarkNeutral", override: true,}, + Collar: {color: "Highlight", override: true,}, + }, + escapeChance: {"Struggle": -100, "Cut": -0.8, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["HighCollars", "Collars"], + unlimited: true, + events: [{trigger: "kill", type: "MikoGhost", inheritLinked: true}], + }, + {inventory: true, curse: "GhostLock", name: "MikoCollar2", Asset: "HighCollar", Color: ["#ffffff", "#AA2222"],Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDHighCollarRender],magic: true, power: 40, weight: 0, difficultyBonus: 10, + Model: "MikoCollar", + struggleBreak: true, + special: true, + linkCategory: "SpecialCollar", + factionFilters: { + Rim: {color: "Highlight", override: true,}, + Neck: {color: "DarkNeutral", override: true,}, + Collar: {color: "Highlight", override: true,}, + }, + linkSize: 0.99, + escapeChance: {"Struggle": -100, "Cut": -0.8, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["HighCollars", "Collars"], + unlimited: true, + events: [{trigger: "kill", type: "MikoGhost2", inheritLinked: true}], + }, + // Generic stronger gag + {inventory: true, name: "MikoGag", Asset: "OTNPlugGag", debris: "Belts", LinkableBy: [...KDPlugGagLink], renderWhenLinked: [...KDPlugGagLink], Type: "Plug", gag: 1.0, Color: ["#ffffff", "#AA2222", "#ffffff"], + Group: "ItemMouth", power: 9, weight: 2, DefaultLock: "Blue", + magic: true, + /*Model: "PlugMuzzleGagHarnessSecure", + Filters: { + Plug: {"gamma":1,"saturation":1,"contrast":3.1,"brightness":0.5666666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + Strap: {"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1,"red":2.816666666666667,"green":1,"blue":1,"alpha":1}, + Harness: {"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1,"red":2.816666666666667,"green":1,"blue":1,"alpha":1}, + SideStrap: {"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1,"red":2.816666666666667,"green":1,"blue":1,"alpha":1}, + Muzzle: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":3.7,"red":1,"green":1,"blue":1,"alpha":1}, + },*/ + factionFilters: { + Plug: {color: "Highlight", override: true,}, + Strap: {color: "DarkNeutral", override: true,}, + SideStrap: {color: "DarkNeutral", override: true,}, + Harness: {color: "DarkNeutral", override: true,}, + Latex: {color: "LightNeutral", override: true,}, + }, + Model: "GagLatexPlugHarnessSecure", + Filters: {"Plug":{"gamma":1,"saturation":0.03333333333333333,"contrast":0.6666666666666666,"brightness":1.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1},"Harness":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1},"Latex":{"gamma":1,"saturation":0.05,"contrast":1.2,"brightness":0.6,"red":2.166666666666667,"green":0.43333333333333335,"blue":0.6,"alpha":1}}, + value: 150, + escapeChance: {"Struggle": -0.25, "Cut": 0.05, "Remove": -0.2, "Pick": 0.09}, helpChance: {"Struggle": -0.2, "Cut": 0.05, "Remove": 0.125}, + limitChance: {"Struggle": 0.125, "Cut": 0.125, "Remove": 0.1, "Unlock": 0.5}, + maxwill: 0.6, enemyTags: {"mikoRestraints" : 10}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["PlugGags", "Will", "Rope", "Gags"]}, + {inventory: true, name: "MikoDress", debris: "Fabric", inaccessible: true, remove: ["Cloth", "Bra", "Tops", "Bras"], Type: "Strap", Asset: "LeatherArmbinder", strictness: 0.25, Color: ['#ffffff'], Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 8, weight: 0, DefaultLock: "Blue", + Model: "SmoothArmbinderSecure", + LinkableBy: [...KDDressLink], alwaysRender: true, + Filters: { + BinderStraps: {"gamma":1,"saturation":1,"contrast":1,"brightness":3.2666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + Binder: {"gamma":1,"saturation":0.06666666666666667,"contrast":1,"brightness":1,"red":2.816666666666667,"green":1,"blue":1,"alpha":1}, + Straps: {"gamma":1,"saturation":1,"contrast":1,"brightness":3.2666666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Binder: {color: "Highlight", override: true,}, + BinderStraps: {color: "DarkNeutral", override: true,}, + Straps: {color: "DarkNeutral", override: true,}, + }, + + forceOutfit: "Lingerie", + forceOutfitPriority: 1, + alwaysDressModel: [ + { + Model: "BindingDress", + Filters: {SkirtBack: {"gamma":1,"saturation":0,"contrast":0.5700000000000001,"brightness":1,"red":0.5294117647058824,"green":0.35294117647058826,"blue":0.3570588235294118,"alpha":1}, + "Skirt":{"gamma":1,"saturation":0.05,"contrast":1.2,"brightness":0.6,"red":2.166666666666667,"green":0.43333333333333335,"blue":0.6,"alpha":1}, + "Stripes":{"gamma":1,"saturation":1,"contrast":0.6666666666666666,"brightness":2.5166666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + "BraStripes":{"gamma":1,"saturation":1,"contrast":0.6666666666666666,"brightness":2.5166666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + "Crystal":{"gamma":1,"saturation":1,"contrast":0.6666666666666666,"brightness":0.7166666666666667,"red":3.433333333333333,"green":1,"blue":1,"alpha":1}, + "Base":{"gamma":1,"saturation":0.05,"contrast":1.2,"brightness":1.6833333333333333,"red":2.166666666666667,"green":0.43333333333333335,"blue":0.6,"alpha":1}, + "BraBase":{"gamma":1,"saturation":0.05,"contrast":1.2,"brightness":1.6833333333333333,"red":2.166666666666667,"green":0.43333333333333335,"blue":0.6,"alpha":1}, + "Panties":{"gamma":1,"saturation":0.05,"contrast":1.2,"brightness":1.7999999999999998,"red":2.166666666666667,"green":0.43333333333333335,"blue":0.6,"alpha":1}, + "Trim":{"gamma":1,"saturation":0.05,"contrast":1.2,"brightness":2.0833333333333335,"red":2.166666666666667,"green":0.43333333333333335,"blue":0.6,"alpha":1},"Lace":{"gamma":1,"saturation":0.03333333333333333,"contrast":0.6666666666666666,"brightness":2.5166666666666666,"red":1,"green":1,"blue":1,"alpha":1}}, + factionFilters: { + Base: {override: true, color: "DarkNeutral"}, + Hardware: {override: true, color: "Highlight"}, + Stripes: {override: true, color: "LightNeutral"}, + BraBase: {override: true, color: "DarkNeutral"}, + BraStripes: {override: true, color: "DarkNeutral"}, + BaseMetal: {override: false, color: "DarkNeutral"}, + Crystal: {override: false, color: "Highlight"}, + Skirt: {override: true, color: "LightNeutral"}, + SkirtBack: {override: false, color: "DarkNeutral"}, + Trim: {override: false, color: "Highlight"}, + Lace: {override: false, color: "Highlight"}, + Tie: {override: false, color: "Highlight"}, + Panties: {override: false, color: "DarkNeutral"}, + }, + } + ], + value: 200, + magic: true, + escapeChance: {"Struggle": -0.25, "Cut": 0.05, "Remove": -0.2, "Pick": 0.15}, helpChance: {"Struggle": -0.2, "Cut": 0.05, "Remove": 0.125}, + limitChance: {"Struggle": 0.125, "Cut": 0.125, "Remove": 0.1, "Unlock": 0.5}, + addPose: ["PreferWristtie"], + alwaysDress: [ + {Item: "PleatedSkirt", Group: "ClothLower", Color: ['#AA2222'], override: true}, + {Item: "SleevelessCatsuit", Group: "Suit", Color: ['#AA2222'], override: true}, + {Item: "LatexCorset1", Group: "Corset", Color: ['#ffffff'], override: true}, + {Item: "CatsuitPanties", Group: "SuitLower", Color: ['#AA2222'], override: true}], + maxwill: 0.5, enemyTags: {"mikoRestraints" : 10}, playerTagsMult: {"ItemArmsEmpty": 0.05}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["BindingDress", "Will", "Rope", "Block_ItemHands", "HandsBehind"]}, + //endregion + + + + + // collar #6EAF81 + + //region Exp + {inventory: true, name: "ExpArmbinder", debris: "Belts", inaccessible: true, Asset: "BoxTieArmbinder", strictness: 0.12, + Model: "JacketArmbinderSecure", + Filters: { + Arms: {"gamma":1,"saturation":1,"contrast":0.8833333333333333,"brightness":1.3,"red":1,"green":1.3,"blue":2.8499999999999996,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":3.4499999999999997,"blue":1,"alpha":1}, + BeltsChest: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":3.4499999999999997,"blue":1,"alpha":1}, + }, + factionFilters: { + Arms: {color: "DarkNeutral", override: true}, + BeltsArms: {color: "Highlight", override: true}, + BeltsChest: {color: "Highlight", override: true}, + BeltsLower: {color: "Highlight", override: true}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.1, + "More_Armbinders": 3.5, + "Less_Armbinders": 0.1, + }, + LinkableBy: [...KDBoxbinderLink], Color: ["#415690", "#ffffff"], Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 8, weight: 0, + limitChance: {"Struggle": 0.05, "Cut": 0.05, "Remove": 0.035, "Unlock": 0.3}, // Hard to escape the arms box by struggling + escapeChance: {"Struggle": 0.1, "Cut": 0.15, "Remove": 0.1, "Pick": 0.35}, + maxwill: 0.25, enemyTags: {"expRestraints" : 5}, playerTags: {}, minLevel: 7, allFloors: true, shrine: ["Boxbinders", "Latex", "Block_ItemHands"]}, + {alwaysRender: true, inventory: true, name: "ExpArmbinderHarness", debris: "Belts", accessible: true, Asset: "Corset4", Color: "#383E4D", Group: "ItemTorso", strictness: 0.1, power: 9, weight: -10, OverridePriority: 26, + LinkableBy: [...KDHarnessLink], + + restriction: 2, + Model: "JacketStraps", + Filters: { + BeltsArms: {"gamma":1,"saturation":0,"contrast":1.45,"brightness":2.05,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsChest: {"gamma":1,"saturation":0,"contrast":1.45,"brightness":2.05,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + BeltsArms: {color: "Highlight", override: true}, + BeltsChest: {color: "Highlight", override: true}, + BeltsLower: {color: "Highlight", override: true}, + }, + escapeChance: {"Struggle": -0.3, "Cut": -0.05, "Remove": 0.08}, + enemyTagsMult: {"backup_harness": 0.05}, + maxwill: 0.6, enemyTags: {"expRestraints" : 20}, playerTags: {"ItemArmsEmpty": -1000, "Armbinders": 25, "Boxbinders": 25}, playerTagsMissing: {"Armbinders": -25, "Boxbinders": -25},minLevel: 7, allFloors: true, shrine: ["ArmbinderHarness", "Latex"], + events: [{trigger: "postRemoval", type: "armbinderHarness"}], requireSingleTagToEquip: ["Armbinders", "Boxbinders"]}, + {inventory: true, name: "ExpCollar", debris: "Belts", inaccessible: true, Asset: "LatexPostureCollar", gag: 0.3, Color: "#4E7DFF", + Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDHighCollarRender],factionColor: [[0]], power: 8, weight: -2, + strictness: 0.05, escapeChance: {"Struggle": -0.05, "Cut": 0.05, "Remove": 0.2, "Pick": 0.2}, + Model: "NeckCorsetGag", + factionFilters: { + Neck: {color: "LightNeutral", override: false}, + Latex: {color: "LightNeutral", override: false}, + Rim: {color: "Highlight", override: true}, + }, + maxwill: 0.25, enemyTags: {"expRestraints" : 3, "latexCollar": 7}, playerTags: {"ItemMouthFull": 2, "ItemMouth2Full": 2, "ItemMouth3Full": 2}, + minLevel: 0, allFloors: true, shrine: ["Posture", "HighCollars", "Collars", "Latex"]}, + {inventory: true, name: "ExpBoots", debris: "Belts", remove: ["Shoes"], inaccessible: true, Asset: "BalletWedges", Color: "#748395", Group: "ItemBoots", LinkableBy: ["Wrapping", "Encase",], + power: 8, weight: 0, escapeChance: {"Struggle": -0.25, "Cut": 0.0, "Remove": 0.07, "Pick": 0.25}, + Model: "ShinyBalletHeelsRestraint", + heelpower: 1.25, + maxwill: 0.9, enemyTags: {"expRestraints" : 6, "latexBoots" : 3, "blacksteelRestraints":10}, playerTags: {}, minLevel: 2, allFloors: true, shrine: ["Heels", "Latex"]}, + //endregion + + // TODO AlwaysDebris + {inventory: true, name: "Stuffing", unlimited: true, debris: "Fabric", Asset: "ClothStuffing", LinkableBy: [...KDStuffingLink], Color: "Default", Group: "ItemMouth", power: -20, weight: 0, gag: 0.4, + Model: "Stuffing", + alwaysRender: true, + quickBindCondition: "Stuffing", + alwaysInaccessible: true, + escapeChance: {"Struggle": 1, "Cut": 1, "Remove": 1}, enemyTags: {"stuffedGag": 100, "clothRestraints":12, "ribbonRestraints":6, "ropeAuxiliary": 4,}, playerTags: {}, minLevel: 0, + allFloors: true, shrine: ["Stuffing"]}, + + + + + //#region Mithril + {inventory: true, name: "MithrilCollar", Asset: "ShinySteelCollar", Color: ['#C9B883', '#C9B883'], Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: -2, + Model: "ElfCollarRestraint", + Filters: { + Collar: {"gamma":1,"saturation":0,"contrast":1,"brightness":1.5,"red":1,"green":1,"blue":1,"alpha":1}, + }, + struggleBreak: true, + linkCategory: "BasicCollar", linkSize: 0.51, + unlimited: true, escapeChance: {"Struggle": -0.1, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, + maxwill: 0.25, enemyTags: {"mithrilRestraints":4, 'shopCollar': 10}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Collars"]}, + //endregion + + {removePrison: true, name: "LatexCube", Asset: "VacCube", Color: ["#ff77ff"], Group: "ItemDevices", power: 5, weight: 1, immobile: true, alwaysStruggleable: true, + Model: "LatexCube", + addTag: ["ForceKneel", "NoHogtie"], + tightType: "Thick", + escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": -.2}, + helpChance: {"Remove": 0.5, "Pick": 0.5, "Unlock": 1.0}, + enemyTags: {"latexcube":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Container", "Latex"], ignoreSpells: true, removeOnLeash: true, + events: [{trigger: "tick", type: "cageDebuff", inheritLinked: true}, {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}]}, + {removePrison: true, name: "Bubble", Asset: "VacCube", Color: ["#ff77ff"], Group: "ItemDevices", power: 3, weight: 1, alwaysStruggleable: true, + Model: "Bubble", LinkableBy: ["Container"],renderWhenLinked: ["Container"], + addTag: ["ForceKneel", "NoHogtie"], + hobble: 3, + heelpower: 10, + tightType: "Thick", + failSuffix: {Remove: "Bubble", Struggle: "Bubble", Cut: "Bubble"}, + limitChance: { + Cut: 0, + Struggle: 0.4, + Remove: 0.8, + }, + affinity: { + Struggle: ["Sharp"], + Remove: ["Sharp"], + }, + escapeChance: {"Struggle": 0, "Cut": 0.8, "Remove": 0.3}, + helpChance: {"Struggle": 0.2, "Pick": 1.0, "Remove": .2}, + events: [ + {trigger: "afterPlayerDamage", type: "bubblePop", mult: 1.5, subMult: 0.5, count: 13, inheritLinked: true}, + {trigger: "beforePlayerDamage", type: "bounce", chance: 0.2, sfx: "RubberBolt", inheritLinked: true}, + ], + enemyTags: {"bubble":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Container", "Elements"], removeOnLeash: true, + }, + {removePrison: true, name: "SlimeBubble", Asset: "VacCube", Color: ["#ff77ff"], Group: "ItemDevices", power: 5, weight: 1, alwaysStruggleable: true, + Model: "SlimeBubble", LinkableBy: ["Container"],renderWhenLinked: ["Container"], + hobble: 3, + heelpower: 10, + tightType: "Thick", + addTag: ["ForceKneel", "NoHogtie"], + failSuffix: {Remove: "Bubble", Struggle: "Bubble", Cut: "Bubble"}, + affinity: { + Struggle: ["Sharp"], + Remove: ["Sharp"], + }, + limitChance: { + Cut: 0.3, + Struggle: 0.4, + Remove: 0.8, + }, + escapeChance: {"Struggle": 0, "Cut": 0.4, "Remove": .3}, + helpChance: {"Struggle": 0.2, "Pick": 1.0, "Remove": .2}, + events: [ + {trigger: "afterPlayerDamage", type: "bubblePop", mult: 1.5, subMult: 0.5, count: 13, inheritLinked: true}, + {trigger: "beforePlayerDamage", type: "bounce", chance: 0.2, sfx: "RubberBolt", inheritLinked: true}, + ], + enemyTags: {"slimebubble":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Container", "Latex"], removeOnLeash: true, + }, + + + {removePrison: true, name: "BallSuit", Asset: "VacCube", Color: ["#88aaff"], Group: "ItemDevices", power: 4, weight: 1, alwaysStruggleable: true, + Model: "BallSuit", LinkableBy: ["Container"],renderWhenLinked: ["Container"], + bindarms: true, + restriction: 15, + tightType: "Thick", + addTag: ["ForceKneel", "NoHogtie"], + failSuffix: {Remove: "Bubble", Struggle: "Bubble", Cut: "Bubble"}, + escapeChance: {"Struggle": -0.3, "Cut": 0.5, "Remove": -.5}, + helpChance: {"Struggle": -0.3, "Pick": 1.0, "Remove": -.5}, + affinity: { + Struggle: ["Sharp"], + Remove: ["Sharp"], + }, + factionFilters: { + BallSuit: {color: "Highlight", override: false}, + }, + events: [ + //{trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, + {trigger: "beforePlayerDamage", type: "bounce", chance: 0.4, sfx: "RubberBolt", inheritLinked: true}, + {trigger: "playerMove", type: "tipBallsuit", inheritLinked: true}, + ], + enemyTags: {"ballSuit":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Container", "Latex", "BallSuit"], removeOnLeash: true, + }, + + {removePrison: true, name: "LatexSphere", Asset: "VacCube", Color: ["#88aaff"], Group: "ItemDevices", power: 5, weight: 1, immobile: true, alwaysStruggleable: true, blindfold: 6, enclose: true, + Model: "LatexSphere", + bindarms: true, + restriction: 30, + tightType: "Thick", + addTag: ["ForceKneel", "NoHogtie"], + failSuffix: {Remove: "Bubble", Struggle: "Bubble", Cut: "Bubble"}, + escapeChance: {"Struggle": -0.3, "Cut": 0.5, "Remove": -.5}, + helpChance: {"Struggle": -0.3, "Pick": 1.0, "Remove": -.5}, + affinity: { + Struggle: ["Sharp"], + Remove: ["Sharp"], + }, + factionFilters: { + LatexSphere: {color: "Highlight", override: false}, + LatexSphereCutaway: {color: "Highlight", override: false}, + LatexSphereCutawayBack: {color: "Highlight", override: false}, + }, + events: [ + {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "bubblePop", mult: 1.5, subMult: 0.5, count: 13, inheritLinked: true}, + {trigger: "beforePlayerDamage", type: "bounce", chance: 0.2, sfx: "RubberBolt", inheritLinked: true}, + ], + enemyTags: {"latexSphere":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Container", "Latex"], removeOnLeash: true, + }, + // Future Box + {removePrison: true, name: "FutureBox", Asset: "Cage", Color: ['Default', 'Default', '#000000'], Group: "ItemDevices", power: 8, weight: 1, + Model: "FutureBox", + DefaultLock: "Red", + addTag: ["NoHogtie"], + tightType: "Secure", + factionFilters: { + Display: {color: "Highlight", override: false}, + DoorNumeral: {color: "Highlight", override: false}, + BackFade: {color: "Highlight", override: false}, + }, + escapeChance: {"Struggle": -10, "Cut": -0.7, "Remove": 10, "Pick": -10, "Unlock": -10}, + helpChance: {"Remove": 0.5, "Pick": -0.1, "Unlock": 1.0}, + enemyTags: {"futurebox":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Container", "CyberBox"], ignoreSpells: true, removeOnLeash: true, immobile: true, enclose: true, + events: [{trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}]}, + // Barrel trap, always possible to struggle out but takes time + {removePrison: true, name: "BarrelTrap", Asset: "SmallWoodenBox", Color: "Default", Group: "ItemDevices", power: 2, weight: 1, immobile: true, alwaysStruggleable: true, blindfold: 6, enclose: true, + Model: "Barrel", + tightType: "Secure", + escapeChance: {"Struggle": 0.1, "Cut": 0.025, "Remove": 0.025, "Pick": -1.0, "Unlock": -1.0}, + struggleMinSpeed: {"Struggle": 0.07, "Cut": 0.03, "Remove": 0.05}, alwaysEscapable: ["Struggle"], + struggleMaxSpeed: {"Struggle": 0.15, "Cut": 0.15, "Remove": 0.15}, + addTag: ["ForceKneel", "NoHogtie"], + helpChance: {"Remove": 0.4, "Pick": 0.2, "Unlock": 1.0}, + limitChance: {"Struggle": 0.01, "Cut": 0, "Remove": 0.01, "Pick": 0, "Unlock": 0}, + enemyTags: {"barrel":100}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Furniture", "Container"], ignoreSpells: true, removeOnLeash: true, ignoreIfNotLeash: true, + events: [{trigger: "tick", type: "barrelDebuff", inheritLinked: true}, {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}]}, + // Cage trap + {removePrison: true, name: "CageTrap", Asset: "Cage", Color: ['Default', 'Default', '#000000'], Group: "ItemDevices", power: 3, weight: 1, alwaysStruggleable: true, + Model: "Cage", + DefaultLock: "Red", + addTag: ["NoHogtie"], + tightType: "Secure", + escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": 0.35, "Pick": 0.33, "Unlock": 0.7}, + helpChance: {"Remove": 0.5, "Pick": 0.5, "Unlock": 1.0}, + enemyTags: {"cage":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Container", "Cages"], ignoreSpells: true, removeOnLeash: true, immobile: true, + events: [{trigger: "tick", type: "cageDebuff", inheritLinked: true}, {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}]}, + // Sarcophagus + {removePrison: true, name: "Sarcophagus", Asset: "DisplayCase", Color: ['Default'], Group: "ItemDevices", power: 10, weight: 1, immobile: true, alwaysStruggleable: true, + DefaultLock: "Blue", + Model: "Sarcophagus", + Filters: { + SarcoBack: {"gamma":1,"saturation":1,"contrast":1,"brightness":0.06666666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + }, + addTag: ["ForceStand"], + tightType: "Secure", + escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": 0.35, "Pick": -0.5, "Unlock": 0.7}, + helpChance: {"Remove": 0.5, "Pick": 0.5, "Unlock": 1.0}, + enemyTags: {"sarcophagus":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Container", "Sarcophagus"], ignoreSpells: true, removeOnLeash: true, + events: [{trigger: "tick", type: "cageDebuff", inheritLinked: true}, {trigger: "tick", type: "callGuardFurniture", inheritLinked: true, chance: 0.04}, {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}]}, + // Display trap + {removePrison: true, name: "DisplayTrap", Asset: "TheDisplayFrame", Color: ['Default'], Group: "ItemDevices", power: 5, weight: 1, immobile: true, alwaysStruggleable: true, + DefaultLock: "Red", + bindarms: true, + Model: "DisplayStand", + restriction: 20, + tightType: "Secure", + escapeChance: {"Struggle": -0.1, "Cut": -0.8, "Remove": 0.15, "Pick": -0.1, "Unlock": -0.1}, + helpChance: {"Remove": 0.35, "Pick": 0.25, "Unlock": 0.5}, + //removeShrine: ["Hogties"], + addTag: ["ForceStand"], + blockfeet: true, + enemyTags: {"displaySpell":100, "display": 100, "displaystand": 100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "FeetLinked", "BlockKneel", "DiscourageHogtie"], ignoreSpells: true, removeOnLeash: true, + events: [{trigger: "tick", type: "cageDebuff", inheritLinked: true}, {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}]}, + {removePrison: true, name: "DollStand", arousalMode: true, Asset: "OneBarPrison", Color: ['Default'], Group: "ItemDevices", power: 5, weight: 1, immobile: true, alwaysStruggleable: true, + DefaultLock: "Red", + Model: "OneBarPrison", + addTag: ["ForceStand"], + tightType: "Secure", + escapeChance: {"Struggle": -0.1, "Cut": -0.6, "Remove": 0.5, "Pick": 0.1, "Unlock": -0.05}, + helpChance: {"Remove": 0.8, "Pick": 0.35, "Unlock": 0.8}, + removeShrine: ["Hogties"], + events: [{trigger: "tick", type: "callGuardFurniture", time: 300, inheritLinked: true}], + enemyTags: {"dollstandSpell":100, "dollstand": 100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Dollstand"], ignoreSpells: true, removeOnLeash: true, + }, + {removePrison: true, name: "LatexDollStand", Asset: "OneBarPrison", Color: ['Default'], Group: "ItemDevices", power: 5, weight: 1, immobile: true, alwaysStruggleable: true, + DefaultLock: "Red", + Model: "OneBarPrisonLatex", + addTag: ["ForceStand"], + tightType: "Secure", + escapeChance: {"Struggle": -0.1, "Cut": -0.6, "Remove": 0.5, "Pick": 0.1, "Unlock": -0.05}, + helpChance: {"Remove": 0.8, "Pick": 0.35, "Unlock": 0.8}, + removeShrine: ["Hogties"], + events: [{trigger: "tick", type: "callGuardFurniture", time: 300, inheritLinked: true}], + enemyTags: {"dollstandSpell":100, "latexdollstand": 100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Latex", "Dollstand"], ignoreSpells: true, removeOnLeash: true, + }, + + {removePrison: true, name: "OneBar", arousalMode: true, Asset: "OneBarPrison", + Color: ['Default'], Group: "ItemDevices", power: 3, weight: 1, immobile: true, alwaysStruggleable: true, + Model: "OneBarPrison", + addTag: ["ForceStand"], + alwaysEscapable: ["Struggle"], + tightType: "Secure", + escapeChance: {"Struggle": 0.3, "Cut": -0.6, "Remove": 0.5, "Pick": 0.1, "Unlock": -0.05}, + struggleMinSpeed: {Struggle: .5, Remove: 4, Unlock: 5, Pick: 2}, + helpChance: {"Remove": 0.8, "Pick": 0.35, "Unlock": 0.8}, + removeShrine: ["Hogties"], + DefaultLock: "White", + events: [{trigger: "tick", type: "callGuardFurniture", time: 300, inheritLinked: true}], + enemyTags: {"onebar":1000}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["OneBar"], + removeOnLeash: true, + }, + {removePrison: true, name: "OneBarStand", Asset: "OneBarPrison", Color: ['Default'], + Group: "ItemDevices", power: 3, weight: 1, immobile: true, alwaysStruggleable: true, + Model: "DisplayStand", + addTag: ["ForceStand"], + alwaysEscapable: ["Struggle"], + tightType: "Secure", + restriction: 10, + blockfeet: true, + escapeChance: {"Struggle": 0.3, "Cut": -0.6, "Remove": 0.5, "Pick": 0.1, "Unlock": -0.05}, + struggleMinSpeed: {Struggle: .5, Remove: 4, Unlock: 5, Pick: 2}, + helpChance: {"Remove": 0.8, "Pick": 0.35, "Unlock": 0.8}, + removeShrine: ["Hogties"], + DefaultLock: "White", + events: [{trigger: "tick", type: "callGuardFurniture", time: 300, inheritLinked: true}], + enemyTags: {"onebar":1000}, playerTags: {"arousalMode": -1000}, minLevel: 0, allFloors: true, + shrine: ["OneBar"], removeOnLeash: true, + }, + + {removePrison: true, name: "DollStandSFW", Asset: "TheDisplayFrame", Color: ['Default'], Group: "ItemDevices", power: 5, weight: 1, immobile: true, alwaysStruggleable: true, + DefaultLock: "Red", + blockfeet: true, + Model: "DisplayStand", + restriction: 20, + tightType: "Secure", + escapeChance: {"Struggle": -0.1, "Cut": -0.6, "Remove": 0.5, "Pick": 0.1, "Unlock": -0.05}, + helpChance: {"Remove": 0.8, "Pick": 0.35, "Unlock": 0.8}, + //removeShrine: ["Hogties"], + events: [{trigger: "tick", type: "callGuardFurniture", time: 300, inheritLinked: true}], + enemyTags: {"dollstandSpell":100, "dollstand": 100}, playerTags: {"arousalMode": -1000}, minLevel: 0, allFloors: true, shrine: ["Furniture", "FeetLinked", "BlockKneel", "DiscourageHogtie", "Dollstand"], ignoreSpells: true, removeOnLeash: true, + }, + // Bed trap, always possible to struggle out but takes time + {removePrison: true, name: "BedTrap", debris: "Belts", Asset: "Bed", Color: ["#523629", "#4c6885", "#808284"], Group: "ItemDevices", power: 2, weight: 1, immobile: true, alwaysStruggleable: true, + Model: "BondageBed", + restriction: 10, + bindarms: true, + tightType: "Secure", + escapeChance: {"Struggle": 0.0, "Cut": 0.05, "Remove": 0.05, "Pick": -0.3, "Unlock": -0.3}, + struggleMinSpeed: {"Struggle": 0.025}, + struggleMaxSpeed: {"Struggle": 0.2, "Cut": 0.05, "Remove": 0.2}, helpChance: {"Remove": 0.4, "Pick": 0.5, "Unlock": 1.0}, + limitChance: {"Struggle": 0.01, "Cut": 0, "Remove": 0.01, "Pick": 0, "Unlock": 0}, + alwaysDress: [ + {Item: "BedStraps", Group: "ItemAddon", Color: ['Default'], override: false}, + ], + addTag: ["HandsBehind"], + enemyTags: {"bed":100}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Furniture", "HandsBehind"], ignoreSpells: true, removeOnLeash: true, + events: [ + {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, + {trigger: "playerMove", type: "removeOnMove", inheritLinked: true} + ]}, + //region High security prison restraints + {inventory: true, name: "HighsecArmbinder", debris: "Belts", strictness: 0.1, Asset: "LeatherArmbinder", inaccessible: true, LinkableBy: [...KDArmbinderLink], renderWhenLinked: [...KDArmbinderLink], Type: "Strap", Group: "ItemArms", bindarms: true, bindhands: 1.0, Color: "#333333", + limitChance: {"Unlock": 0.2}, power: 7, weight: 2, + sfxGroup: "Leather", + Model: "Jacket", + factionFilters: { + BeltsArms: {color: "DarkNeutral", override: true}, + BeltsChest: {color: "DarkNeutral", override: true}, + BeltsLower: {color: "DarkNeutral", override: true}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Armbinders": 3.5, + "Less_Armbinders": 0.1, + }, + struggleMaxSpeed: {"Remove": 0.5, "Pick": 0.1}, + escapeChance: {"Struggle": -0.25, "Cut": 0.1, "Remove": 0.15, "Pick": 0.1}, enemyTags: {"highsecRestraints": 10, "leatherRestraintsHeavy":4, "armbinderSpell": 100}, playerTags: {}, minLevel: 8, allFloors: true, shrine: ["Leather", "Armbinders", "Block_ItemHands"]}, + {inventory: true, name: "HighsecBoxbinder", debris: "Belts", strictness: 0.1, Asset: "BoxTieArmbinder", inaccessible: true, LinkableBy: [...KDBoxbinderLink], renderWhenLinked: [...KDBoxbinderLink], Group: "ItemArms", bindarms: true, bindhands: 1.0, Color: "#333333", + Model: "Jacket", + sfxGroup: "Leather", + factionFilters: { + BeltsArms: {color: "DarkNeutral", override: true}, + BeltsChest: {color: "DarkNeutral", override: true}, + BeltsLower: {color: "DarkNeutral", override: true}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Boxbinders": 3.5, + "Less_Boxbinders": 0.1, + }, + limitChance: {"Unlock": 0.2}, power: 7, weight: 2, + escapeChance: {"Struggle": -0.28, "Cut": 0.13, "Remove": 0.10, "Pick": 0.1}, enemyTags: {"highsecRestraints": 10, "leatherRestraintsHeavy":4, "armbinderSpell": 10}, playerTags: {}, + struggleMaxSpeed: {"Remove": 0.25, "Pick": 0.08}, + minLevel: 8, allFloors: true, shrine: ["Boxbinders", "Leather", "Block_ItemHands"]}, + {inventory: true, name: "HighsecStraitjacket", debris: "Belts", strictness: 0.2, + Model: "Jacket", + sfxGroup: "Leather", + factionFilters: { + BeltsArms: {color: "DarkNeutral", override: true}, + BeltsChest: {color: "DarkNeutral", override: true}, + BeltsLower: {color: "DarkNeutral", override: true}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + Asset: "HighSecurityStraitJacket", Modules: [1, 2, 3], Color: ["#333333", "#333333", '#808080', '#808080'], + inaccessible: true, LinkableBy: [...KDJacketLink], renderWhenLinked: [...KDJacketLink], Group: "ItemArms", bindarms: true, bindhands: 1.33, + limitChance: {"Unlock": 0.2}, power: 7, weight: 2, + struggleMaxSpeed: {"Remove": 0.07, "Pick": 0.04}, + escapeChance: {"Struggle": -0.35, "Cut": 0.09, "Remove": 0.05, "Pick": 0.1}, enemyTags: {"highsecRestraints": 10, "leatherRestraintsHeavy":4, "jacketSpell": 100}, playerTags: {}, + minLevel: 8, allFloors: true, shrine: ["Leather", "Straitjackets", "Block_ItemHands"]}, + + {inventory: true, name: "HighsecTransportJacket", debris: "Belts", Asset: "TransportJacket", Color: ["#808080", "#202020", "#808080", "#EEEEEE", "#202020", "#808080"], + Model: "JacketHeavy", + sfxGroup: "Leather", + LinkableBy: [...KDTransportLink], + renderWhenLinked: [...KDJacketRender], + factionFilters: { + BeltsArms: {color: "DarkNeutral", override: true}, + BeltsChest: {color: "DarkNeutral", override: true}, + BeltsLower: {color: "DarkNeutral", override: true}, + }, + harness: true, + Group: "ItemArms", power: 10, weight: -1, bindarms: true, bindhands: 1.5, strictness: 0.3, + unlimited: true, + limitChance: {"Unlock": 0.1}, + escapeChance: {"Struggle": -0.5, "Cut": 0, "Remove": 0, "Pick": 0}, + enemyTags: {"highsecRestraints": 100, "leatherRestraintsHeavy": 1, transportJacket: 1}, playerTagsMult: {"ItemArmsEmpty": 0.02}, playerTags: {"HighsecStraitjacketWorn": 20}, minLevel: 12, maxwill: 0.1, allFloors: true, shrine: ["Straitjackets", "Block_ItemHands", "TransportJackets", "Leather"]}, + + + {inventory: true, name: "HighsecShackles", debris: "Chains", Asset: "SteelAnkleCuffs", Type: "Chained", LinkableBy: [...KDBindable, ...KDDevices], Group: "ItemFeet", hobble: 1, Color: ["Default", "Default"], power: 6, weight: 2, + Model: "Legirons", + sfxGroup: "Chains", + alwaysDressModel: [ + {Model: "AnkleLink"} + ], + linkCategory: "AnkleCuffs", linkSize: 0.4, noDupe: true, + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 1.1, "Pick": 0.3}, enemyTags: {}, playerTags: {}, minLevel: 7, allFloors: true, shrine: ["Legirons", "Metal", "Cuffs"]}, + {inventory: true, name: "HighsecBallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], Asset: "HarnessBallGag", + Model: "LargeBallGagHarness", + events: [ + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.35, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.25, requiredTag: "Blindfolds"}, + ], + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + factionFilters: { + Ball: {color: "Highlight", override: false}, + }, + strictness: 0.2, gag: 0.65, Type: "Tight", Color: ["Default", "Default"], Group: "ItemMouth", power: 8, weight: 2, + escapeChance: {"Struggle": -0.25, "Cut": -0.05, "Remove": 0.18, "Pick": 0.25}, enemyTags: {"highsecRestraints": 10, forceAntiMagic: -100, "ballGagRestraints" : 4, "gagSpell": 100}, playerTags: {}, minLevel: 5, allFloors: true, shrine: ["BallGags", "Leather", "Gags"]}, + {inventory: true, name: "HighsecMuzzle", debris: "Belts", inaccessible: true, LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], factionColor: [[], [0]], Asset: "MuzzleGag", + Model: "MuzzleGagHarnessSecure", + sfxGroup: "Leather", + events: [ + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.35, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.25, requiredTag: "Blindfolds"}, + ], + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + strictness: 0.2, gag: 0.6, Color: ["Default", "Default"], Group: "ItemMouth", power: 8, weight: 2, + escapeChance: {"Struggle": -0.35, "Cut": -0.1, "Remove": 0.22, "Pick": 0.2}, enemyTags: {"highsecRestraints": 1, forceAntiMagic: -100, "leatherRestraintsHeavy" : 4}, playerTags: {}, minLevel: 7, allFloors: true, shrine: ["FlatGags", "Leather", "Gags"]}, + + {renderWhenLinked: [...KDLegbinderRender], inventory: true, name: "HighsecLegbinder", debris: "Belts", Asset: "LegBinder", inaccessible: true, + LinkableBy: [...KDLegbinderLink], Color: "Default", Group: "ItemLegs", blockfeet: true, + Model: "Legbinder", + sfxGroup: "Leather", + Filters: { + Laces: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":3.35,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Binder: {color: "DarkNeutral", override: true}, + Laces: {color: "Highlight", override: true}, + }, + affinity: {Remove: ["Hook"], Struggle: ["Hook"],}, + maxwill: 0.1, + struggleMult: {Struggle: 0.4}, + struggleMaxSpeed: {Struggle: 0.15}, + power: 8, weight: 2, escapeChance: {"Struggle": -0.1, "Cut": 0.1, "Remove": 0.35, "Pick": 0.25}, enemyTags: {"highsecRestraints": 10, "legbinderSpell": 1, "leatherRestraintsHeavy" : 1}, playerTags: {}, minLevel: 0, allFloors: true, + shrine: ["Leather", "Legbinders"]}, + + + {inventory: true, arousalMode: true, name: "PrisonBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "#444444", Group: "ItemPelvis", chastity: true, + Security: { + level_key: 2, + level_tech: 1, + }, + Model: "SteelChastityBelt_Padlock", + LinkableBy: ["Wrapping", "Ornate"], + factionFilters: { + Lock: {color: "Highlight", override: true}, + BaseMetal: {color: "DarkNeutral", override: false}, + }, + Filters: { + BaseMetal: {"gamma":0.8999999999999999,"saturation":0.0,"contrast":3.1666666666666665,"brightness":0.6166666666666667,"red":1.0166666666666666,"green":1,"blue":1,"alpha":1}, + }, + power: 8, weight: 2, escapeChance: {"Struggle": -0.5, "Cut": -0.30, "Remove": 100.0, "Pick": 0.25}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Chastity", "Metal", "ChastityBelts"]}, + {inventory: true, arousalMode: true, name: "PrisonBelt2", Asset: "OrnateChastityBelt", OverridePriority: 26, Color: ["#272727", "#AA0000"], Group: "ItemPelvis", chastity: true, + Security: { + level_key: 3, + level_magic: 2, + }, + Model: "SteelChastityBelt_Segu", + LinkableBy: ["Wrapping"], + factionFilters: { + Lock: {color: "Highlight", override: true}, + BaseMetal: {color: "DarkNeutral", override: true}, + }, + Filters: { + Lock: {"gamma":1,"saturation":0.06666666666666667,"contrast":2.1333333333333333,"brightness":1.6500000000000001,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + Lining: {"gamma":1,"saturation":0.06666666666666667,"contrast":2.1333333333333333,"brightness":1.6500000000000001,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + BaseMetal: {"gamma":1,"saturation":0.06666666666666667,"contrast":0.7833333333333334,"brightness":0.48333333333333334,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + }, + power: 9, weight: 2, escapeChance: {"Struggle": -0.5, "Cut": -0.30, "Remove": 100.0, "Pick": 0.22}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Chastity", "Metal", "ChastityBelts", "Ornate"]}, + //endregion + + //region Trap items. Note that traps do not respect stamina, so its okay for these to have reasonable maxwill + {alwaysRender: true, inventory: true, name: "TrapArmbinderHarness", debris: "Belts", Asset: "LeatherHarness", accessible: true, Color: "Default", Group: "ItemTorso", OverridePriority: 26, LinkableBy: [...KDHarnessLink], power: 3, strictness: 0.1, + weight: 0, + restriction: 2, + Model: "JacketStraps", + factionFilters: { + BeltsArms: {color: "Highlight", override: true}, + BeltsChest: {color: "Highlight", override: true}, + BeltsLower: {color: "Highlight", override: true}, + }, + harness: true, + sfxGroup: "Leather", + escapeChance: {"Struggle": -0.15, "Cut": 0.15, "Remove": 0.15, "Pick": 0.15}, + enemyTags: {"leatherRestraintsHeavy":2, "armbinderSpell": 100, "harnessSpell": 1, "binderharnessSpell": 10}, playerTags: {"ItemArmsEmpty": -1000, "Armbinders": 8, "Boxbinders": 8}, playerTagsMissing: {"Armbinders": -8, "Boxbinders": -8}, + enemyTagsMult: {"backup_harness": 0.05}, + minLevel: 4, allFloors: true, shrine: ["ArmbinderHarness", "Leather"], + maxwill: 0.6, events: [{trigger: "postRemoval", type: "armbinderHarness"}], requireSingleTagToEquip: ["Armbinders", "Boxbinders"]}, + {renderWhenLinked: [...KDArmbinderLink], inventory: true, trappable: true, name: "TrapArmbinder", debris: "Belts", inaccessible: true, strictness: 0.1, Asset: "LeatherArmbinder", LinkableBy: [...KDArmbinderLink], Type: "WrapStrap", Group: "ItemArms", Color: "Default", bindarms: true, bindhands: 1.0, power: 6, weight: 2, + Model: "ArmbinderCross", + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Armbinders": 3.5, + "Less_Armbinders": 0.1, + }, + sfxGroup: "Leather", + limitChance: {"Struggle": 0.15, "Cut": 0.1, "Unlock": 0.2}, + maxwill: 0.25, escapeChance: {"Struggle": 0.11, "Cut": 0.4, "Remove": 0.3, "Pick": 0.5}, enemyTags: {"trap":100, "leatherRestraintsHeavy":6, "armbinderSpell": 100}, playerTags: {}, minLevel: 4, allFloors: true, shrine: ["Leather", "Armbinders", "Block_ItemHands"]}, + + {renderWhenLinked: [...KDLegbinderRender], inventory: true, name: "TrapLegbinder", debris: "Belts", Asset: "LegBinder", inaccessible: true, + LinkableBy: [...KDLegbinderLink], Color: "Default", Group: "ItemLegs", blockfeet: true, + Model: "Legbinder", + sfxGroup: "Leather", + factionFilters: { + Binder: {color: "DarkNeutral", override: true}, + Laces: {color: "Highlight", override: true}, + }, + maxwill: 0.1, + affinity: {Remove: ["Hook"], Struggle: ["Hook"],}, + struggleMaxSpeed: {Struggle: 0.1, Cut: 0.3, Remove: 0.1}, + struggleMult: {Struggle: 0.34}, + speedMult: {Struggle: 0.25}, + power: 6, weight: 2, escapeChance: {"Struggle": .11, "Cut": 0.3, "Remove": 0.25, "Pick": 0.5}, enemyTags: {"trap":100, "leatherRestraintsHeavy":6, "legbinderSpell": 10}, playerTags: {}, minLevel: 6, allFloors: true, + shrine: ["Leather", "Legbinders"]}, + + {renderWhenLinked: ["Belts"], inventory: true, trappable: true, name: "TrapBoxbinder", debris: "Belts", inaccessible: true, strictness: 0.075, Asset: "BoxTieArmbinder", + Model: "ArmbinderCross", + sfxGroup: "Leather", + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Boxbinders": 3.5, + "Less_Boxbinders": 0.1, + }, + LinkableBy: [...KDBoxbinderLink], Group: "ItemArms", Color: ["Default", "Default"], + bindarms: true, bindhands: 1.0, power: 6, weight: 2, + limitChance: {"Struggle": 0.15, "Cut": 0.1, "Unlock": 0.2}, + maxwill: 0.25, + escapeChance: {"Struggle": -0.05, "Cut": 0.4, "Remove": 0.4, "Pick": 0.45}, + enemyTags: {"trap":100, "leatherRestraintsHeavy":6, "armbinderSpell": 10}, + playerTags: {}, minLevel: 4, allFloors: true, shrine: ["Boxbinders", "Leather", "Block_ItemHands"]}, + {inventory: true, trappable: true, name: "TrapYoke", Asset: "Yoke", accessible: true, Group: "ItemArms", + Model: "SteelYoke", + playerTagsMult: { + "More_Yokes": 3.5, + "Less_Yokes": 0.1, + }, + restriction: 10, + Color: "Default", bindarms: true, restricthands: 0.85, power: 6, weight: 0, DefaultLock: "Red", + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 10, "Pick": -0.15, "Unlock": -0.15}, + helpChance: {"Pick": 0.5, "Unlock": 1.0}, enemyTags: {"trap":9, "yokeSpell": 10, "Unchained": -9, "steelbondage": 10}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Yokes", "Yoked"]}, + {inventory: true, trappable: true, name: "HeavyYoke", Asset: "Yoke", accessible: true, Group: "ItemArms", + Model: "HeavyYoke", + playerTagsMult: { + "More_Yokes": 3.5, + "Less_Yokes": 0.1, + }, + restriction: 10, + Color: "Default", bindarms: true, restricthands: 0.85, power: 9, weight: 0, DefaultLock: "Disc", + escapeChance: {"Struggle": -1, "Cut": -0.8, "Remove": 0.4, "Pick": -0.25, "Unlock": -0.25}, + helpChance: {"Pick": 0.25, "Unlock": 0.33}, enemyTags: {"trap":14, "yokeSpell": 50, "Unchained": -25, "steelbondage": 10}, playerTags: {}, minLevel: 7, allFloors: true, shrine: ["Metal", "Yokes", "Yoked"]}, + {inventory: true, trappable: true, name: "TrapFiddle", Asset: "Yoke", accessible: true, Group: "ItemArms", + Model: "HeavyFiddle", + playerTagsMult: { + "More_Yokes": 3.5, + "Less_Yokes": 0.1, + }, + restriction: 10, + Color: "Default", bindarms: true, restricthands: 0.75, power: 6, weight: 0, DefaultLock: "Red", + escapeChance: {"Struggle": -0.6, "Cut": -0.55, "Remove": 4, "Pick": -0.13, "Unlock": -0.09}, + helpChance: {"Pick": 0.4, "Unlock": 1.0}, enemyTags: {"trap":9, "yokeSpell": 4, "fiddle": 14, "Unchained": -9, "steelbondage": 10}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Metal", "Fiddles"]}, + {alwaysRender: true, inventory: true, trappable: true, name: "TrapHarness", debris: "Belts", strictness: 0.05, Asset: "LeatherStrapHarness", accessible: true, + Model: "Harness", + sfxGroup: "Leather", + harness: true, + restriction: 2, + Filters: { + Straps: {"gamma":1,"saturation":1,"contrast":1,"brightness":3,"red":0.33,"green":0.33, "blue":0.33,"alpha":1}, + }, + factionFilters: { + Straps: { + color: "DarkNeutral", + override: false, + } + }, + LinkableBy: [...KDHarnessLink], OverridePriority: 26, Color: "#222222", Group: "ItemTorso", power: 2, weight: 2, + escapeChance: {"Struggle": -0.15, "Cut": 0.3, "Remove": 0.8, "Pick": 0.4}, enemyTags: {"trap":100, "leatherRestraints":6, "harnessSpell": 10}, + enemyTagsMult: {"backup_harness": 0.05}, + playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Harnesses"]}, + {alwaysRender: true, inventory: true, trappable: true, name: "PVCHarness", debris: "Belts", strictness: 0.07, Asset: "LeatherStrapHarness", accessible: true, + Model: "Harness", + sfxGroup: "Leather", + harness: true, + factionFilters: { + Straps: {color: "Catsuit", override: false}, + }, + restriction: 2, + Filters: { + Straps: {"gamma":1,"saturation":1,"contrast":1.5,"brightness":3,"red":0.33,"green":0.33, "blue":0.33,"alpha":1}, + Hardware: {"gamma":0.11666666666666667,"saturation":1,"contrast":1.6166666666666665,"brightness":2.45,"red":1,"green":1,"blue":1,"alpha":1}, + }, + LinkableBy: [...KDHarnessLink], OverridePriority: 26, Color: "#222222", Group: "ItemTorso", power: 2, weight: 2, + escapeChance: {"Struggle": -0.1, "Cut": 0.35, "Remove": 0.8, "Pick": 0.25}, enemyTags: {"latexRestraints":6, "harnessSpell": 1}, + enemyTagsMult: {"backup_harness": 0.05}, + playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Latex", "Harnesses"]}, + {inventory: true, trappable: true, name: "TrapGag", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], Asset: "BallGag", + Model: "BallGag", + sfxGroup: "Rubber", + biggerVersion: "TrapGagLarge", + quickBindCondition: "BallGag", quickBindMult: 0.5, + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], keepLock: true, power: 1, msg: "KDGagNecklaceOn"}], + factionFilters: { + Ball: {color: "Highlight", override: false}, + }, + factionColor: [[], [0]], gag: 0.35, Type: "Tight", Color: ["Default", "Default"], Group: "ItemMouth", power: 3, weight: 2, + maxwill: 0.6, escapeChance: {"Struggle": 0.25, "Cut": 0.45, "Remove": 0.3, "Pick": 0.4}, enemyTags: {"trap":100, "leatherRestraintsHeavy":6, "gagSpell": 8, forceAntiMagic: -100}, playerTags: {}, minLevel: 0, maxLevel: 5, allFloors: true, + shrine: ["BallGags", "Leather", "Gags"]}, + {inventory: true, trappable: true, name: "TrapGagLarge", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], Asset: "BallGag", + Model: "LargeBallGag", + sfxGroup: "Rubber", + quickBindCondition: "BallGag", quickBindMult: 0.5, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], keepLock: true, power: 1, msg: "KDGagNecklaceOn"}], + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + factionColor: [[], [0]], gag: 0.35, Type: "Tight", Color: ["Default", "Default"], Group: "ItemMouth", power: 4.5, weight: 2, + maxwill: 0.6, escapeChance: {"Struggle": 0.25, "Cut": 0.45, "Remove": 0.3, "Pick": 0.4}, enemyTags: {"trap":100, forceAntiMagic: -100, "leatherRestraintsHeavy":8, "gagSpell": 12}, playerTags: {}, minLevel: 3, allFloors: true, + shrine: ["BallGags", "Leather", "Gags"]}, + + {inventory: true, trappable: true, name: "TrapBlindfold", debris: "Belts", Asset: "LeatherBlindfold", LinkableBy: [...KDBlindfoldLink], renderWhenLinked: [...KDBlindfoldLink], Color: "Default", Group: "ItemHead", + power: 3, weight: 2, + sfxGroup: "Leather", + Model: "BlindfoldLeather", + /*Filters: { + Blindfold: {"gamma":1,"saturation":1,"contrast":1.8833333333333333,"brightness":0.48333333333333334,"red":1,"green":1,"blue":1,"alpha":1}, + Rim: {"gamma":1,"saturation":1,"contrast":0.8333333333333333,"brightness":3.1333333333333337,"red":2.5166666666666666,"green":1.1166666666666667,"blue":1.9666666666666666,"alpha":1}, + },*/ + factionFilters: { + Blindfold: {color: "DarkNeutral", override: true}, + Rim: {color: "Highlight", override: true}, + }, + maxwill: 0.5, blindfold: 3, escapeChance: {"Struggle": 0.4, "Cut": 0.6, "Remove": 0.3, "Pick": 0.4}, + enemyTags: {"trap":100, "leatherRestraints":6, "blindfoldSpell": 10}, + playerTags: {NoBlindfolds: -1000}, minLevel: 4, allFloors: true, shrine: ["Leather", "Blindfolds"]}, + {inventory: true, trappable: true, name: "TrapBoots", debris: "Belts", Asset: "BalletHeels", Color: "Default", Group: "ItemBoots", heelpower: 1, power: 3, weight: 2, + remove: ["Shoes"], + sfxGroup: "Leather", + Model: "BalletHeelsRestraint", + maxwill: 0.9, escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.4, "Pick": 0.4}, enemyTags: {"trap":100, "leatherHeels": 8}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Heels", "Leather", "Boots", "Heels"]}, + {inventory: true, trappable: true, name: "TrainingHeels", debris: "Belts", Asset: "BalletHeels", Color: "Default", Group: "ItemBoots", heelpower: 1, power: 5, weight: 0, + alwaysKeep: true, + DefaultLock: "HiSec", + sfxGroup: "Leather", + remove: ["Shoes"], + Model: "BalletHeelsRestraint", + escapeChance: {"Struggle": -0.5, "Cut": 0.1, "Remove": 10, "Pick": 0.0}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Heels", "Boots"]}, + + {inventory: true, trappable: true, name: "TrapLegirons", debris: "Chains", Asset: "Irish8Cuffs", LinkableBy: ["Wrapping", "Encase", "Belts"], Color: "Default", Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"], + power: 4, weight: 2, + struggleBreak: true, + Model: "Legirons", + linkCategory: "AnkleCuffs", linkSize: 0.51, noDupe: true, playerTagsMissingMult: {"ItemLegsFull":0.05}, + sfxGroup: "Handcuffs", + escapeChance: {"Struggle": -0.5, "Cut": -0.4, "Remove": 10, "Pick": 0.5}, enemyTags: {"trap":100, "cuffsSpell": 7}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Legirons", "Metal", "Cuffs"]}, + + {inventory: true, arousalMode: true, trappable: true, name: "TrapBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "Default", Group: "ItemPelvis", chastity: true, + power: 5, weight: 0, DefaultLock: "Red", + Security: { + level_key: 2, + }, + Model: "HeartBelt", + LinkableBy: ["Wrapping", "Ornate"], + factionFilters: { + Lining: {color: "Highlight", override: true}, + Lock: {color: "Highlight", override: true}, + }, + Filters: { + Lining: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, + maxwill: 0.75, escapeChance: {"Struggle": -0.5, "Cut": -0.10, "Remove": 10.0, "Pick": 0.35}, enemyTags: {"trap":10, 'machineChastity': 2, "maidRestraints": 6, "maidRestraintsLight": 6, "genericChastity": 12, "chastitySpell": 10,}, playerTags: {"ItemVulvaEmpty" : -4, "ItemVulvaPiercingsEmpty" : -4}, minLevel: 0, allFloors: true, shrine: ["Chastity", "Metal", "ChastityBelts"]}, + {inventory: true, arousalMode: true, trappable: true, name: "BlacksteelBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "#333333", Group: "ItemPelvis", chastity: true, + power: 10, weight: 0, DefaultLock: "Blue", + Security: { + level_key: 2, + }, + Model: "SteelChastityBelt_Padlock", + LinkableBy: ["Wrapping", "Ornate"], + factionFilters: { + Lock: {color: "Highlight", override: true}, + BaseMetal: {color: "DarkNeutral", override: false}, + }, + Filters: { + Lock: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Lining: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BaseMetal: {"gamma":1,"saturation":0.8500000000000001,"contrast":3.3833333333333333,"brightness":0.43333333333333335,"red":1,"green":1,"blue":1,"alpha":1}, + }, + maxwill: 0.75, escapeChance: {"Struggle": -0.6, "Cut": -0.50, "Remove": 10.0, "Pick": 0.2}, enemyTags: {"trap":10, 'machineChastity': 2, "maidRestraints": 9, "maidRestraintsLight": 6, "genericChastity": 32, "blacksteelRestraints": 12, "blacksteelchastity": 50, "chastitySpell": 30,}, playerTags: {"ItemVulvaEmpty" : -4, "ItemVulvaPiercingsEmpty" : -4}, minLevel: 9, allFloors: true, shrine: ["Chastity", "Metal", "ChastityBelts"]}, + {inventory: true, arousalMode: true, trappable: true, name: "BlacksteelBra", Asset: "FuturisticBra2", OverridePriority: 26, Color: ['#333333', '#999999', '#333333', '#333333', '#999999', '#333333'], Group: "ItemBreast", + Model: "SteelChastityBra_Padlock", + factionFilters: { + Lock: {color: "Highlight", override: true}, + BaseMetal: {color: "DarkNeutral", override: true}, + + }, + Filters: { + Lock: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Lining: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Steel: {"gamma":1,"saturation":0.8500000000000001,"contrast":3.3833333333333333,"brightness":0.43333333333333335,"red":1,"green":1,"blue":1,"alpha":1}, + }, + chastitybra: true, power: 7, weight: 0, DefaultLock: "Blue", + Security: { + level_tech: 1, + level_key: 2, + }, + escapeChance: {"Struggle": -0.6, "Cut": -0.5, "Remove": 10.0, "Pick": 0.1}, enemyTags: {"genericChastity": 8, "blacksteelRestraints": 4, "blacksteelBra": 8, "blacksteelchastity": 25, "roboAngry": 6}, + playerTags: {"FreeBoob": -1000}, minLevel: 9, allFloors: true, shrine: ["ChastityBras", "Chastity", "Metal", "Ornate"]}, + + + {inventory: true, arousalMode: true, trappable: true, name: "MagicBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "#8f60b1", Group: "ItemPelvis", chastity: true, + power: 7, weight: 0, + Security: { + level_magic: 1, + }, + npcBondageMult: 4, + npcBondageType: "Magic", + Model: "HeartBelt", + LinkableBy: ["Wrapping", "Ornate"], + factionFilters: { + Lining: {color: "Highlight", override: true}, + Lock: {color: "Highlight", override: true}, + }, + Filters: { + Lock: {"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1,"red":1.5666666666666669,"green":1,"blue":2.5333333333333337,"alpha":1}, + Lining: {"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":1,"red":1.5666666666666669,"green":1,"blue":2.5333333333333337,"alpha":1}, + Steel: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":2.5333333333333337,"alpha":1}, + }, + maxwill: 0.75, escapeChance: {"Struggle": -1.0, "Cut": -0.10, "Remove": 10.0, "Pick": 0.5}, magic: true, DefaultLock: "Purple", + enemyTags: {"magicBelt": 4, "magicBeltForced": 10, "chastitySpell": 5,}, playerTags: {"ItemVulvaEmpty" : -4, "ItemVulvaPiercingsEmpty" : -4}, minLevel: 12, allFloors: true, shrine: ["Chastity", "Metal", "ChastityBelts"]}, + {inventory: true, arousalMode: true, name: "TrapBeltProto", Asset: "FuturisticChastityBelt", Modules: [3, 1, 1, 1, 1], OverridePriority: 26, Color: ['#5E5E6B', '#4A5FC1', '#CD9F0E', '#43B2BA', '#A68009', '#F8BD01', '#3868E8', '#A68009', '#FFC81D'], + Group: "ItemPelvis", chastity: true, power: 15, weight: 0, DefaultLock: "Red", + Security: { + level_tech: 1, + level_key: 3, + }, + npcBondageMult: 3, + Model: "ProtoBelt", + factionFilters: { + Lining: {color: "DarkNeutral", override: true}, + Metal: {color: "LightNeutral", override: true}, + Display: {color: "Highlight", override: false}, + Plug: {color: "Highlight", override: true}, + }, + LinkableBy: ["Wrapping", "Ornate"], + Filters: { + Lock: {"gamma":1,"saturation":0.06666666666666667,"contrast":2.1333333333333333,"brightness":1.6500000000000001,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + Lining: {"gamma":1,"saturation":0.06666666666666667,"contrast":1.7833333333333334,"brightness":1,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + Steel: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":3.1666666666666665,"brightness":0.6166666666666667,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + }, + maxwill: 0.75, escapeChance: {"Struggle": -0.8, "Cut": -0.50, "Remove": 1.0, "Pick": -0.1}, enemyTags: {"protoRestraints": 10, 'machineChastity': 8, "roboAngry": 10}, playerTags: {"ItemVulvaEmpty" : -5, "ItemVulvaPiercingsEmpty" : -5}, minLevel: 7, allFloors: true, shrine: ["Chastity", "Metal", "ChastityBelts"]}, + {inventory: true, arousalMode: true, trappable: true, name: "TrapBra", Asset: "PolishedChastityBra", debris: "Chains", OverridePriority: 26, Color: "Default", Group: "ItemBreast", LinkableBy: ["Ornate"], chastitybra: true, + Model: "ChastityBra", + factionFilters: { + Lining: {color: "Highlight", override: true}, + }, + Filters: { + Lining: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, + power: 4, weight: 0, DefaultLock: "Red", + Security: { + level_key: 2, + }, + maxwill: 0.75, escapeChance: {"Struggle": -0.5, "Cut": -0.10, "Remove": 10.0, "Pick": 0.35}, enemyTags: {"trap":10, "maidRestraints": 6, "maidRestraintsLight": 6, "genericChastity": 10}, + playerTags: {"ItemNipplesEmpty" : -5, "FreeBoob": -1000}, minLevel: 0, allFloors: true, shrine: ["ChastityBras", "Chastity", "Metal"]}, + + + + {inventory: true, trappable: true, name: "TrapMittens", debris: "Belts", inaccessible: true, Asset: "LeatherMittens", Color: "Default", Group: "ItemHands", bindhands: 1.0, power: 4, weight: 0, LinkableBy: [...KDGlovesLink], + Model: "LeatherMittens", + sfxGroup: "Leather", + Filters: { + Lock: {"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Band: {"gamma":0.43333333333333335,"saturation":1,"contrast":1.1833333333333333,"brightness":0.5166666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + Mitten: {"gamma":0.9166666666666666,"saturation":1,"contrast":3,"brightness":0.06666666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + }, + maxwill: 0.5, escapeChance: {"Struggle": 0.05, "Cut": 0.4, "Remove": 0.15, "Pick": 1.0}, enemyTags: {"leatherRestraints":6, "trap": 2, "mittensSpell": 10}, playerTags: {"ItemHandsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Mittens", "Leather"]}, + // These ones are tougher + {inventory: true, arousalMode: true, trappable: true, name: "TrapBelt2", Asset: "OrnateChastityBelt", OverridePriority: 26, Color: ["#272727", "#D3B24B"], Group: "ItemPelvis", chastity: true, + power: 9, weight: 0, DefaultLock: "Gold", + Security: { + level_magic: 2, + level_key: 3, + }, + Model: "SteelChastityBelt_Radial", + LinkableBy: ["Wrapping", "Ornate"], + factionFilters: { + Lock: {color: "Highlight", override: true}, + Lining: {color: "Highlight", override: true}, + BaseMetal: {color: "LightNeutral", override: false}, + }, + Filters: { + Lock: {"gamma":1,"saturation":0.06666666666666667,"contrast":1.6833333333333333,"brightness":0.6666666666666666,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + Lining: {"gamma":1,"saturation":0.06666666666666667,"contrast":2.1333333333333333,"brightness":1.6500000000000001,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + BaseMetal: {"gamma":1,"saturation":0.06666666666666667,"contrast":0.7833333333333334,"brightness":0.48333333333333334,"red":2.15,"green":1.7166666666666666,"blue":1.0166666666666666,"alpha":1}, + }, + escapeChance: {"Struggle": -0.5, "Cut": -0.125, "Remove": 10.0, "Pick": 0.1}, enemyTags: {"genericChastity": 8, "ornateChastity": 8}, playerTags: {}, minLevel: 4, allFloors: true, shrine: ["Chastity", "Metal", "ChastityBelts", "Ornate"]}, + {inventory: true, arousalMode: true, trappable: true, name: "TrapBra2", Asset: "FuturisticBra2", OverridePriority: 26, Color: ['#5E5E6B', '#F8BD01', '#5E5E6B', '#5E5E6B', '#F8BD01', '#5E5E6B'], Group: "ItemBreast", + chastitybra: true, power: 9, weight: 0, DefaultLock: "Gold", + Security: { + level_magic: 2, + level_key: 3, + }, + Model: "SteelChastityBra_Radial", + factionFilters: { + Display: {color: "Highlight", override: false}, + Lining: {color: "Highlight", override: true}, + BaseMetal: {color: "LightNeutral", override: true}, + Cups: {color: "DarkNeutral", override: true}, + }, + /*Filters: { + Lining: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":1,"red":2.5333333333333337,"green":1.9,"blue":1,"alpha":1}, + Chain: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":1,"red":2.5333333333333337,"green":1.9,"blue":1,"alpha":1}, + Lock: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":1,"red":2.5333333333333337,"green":1.9,"blue":1,"alpha":1}, + Steel: {"gamma":1,"saturation":0.8500000000000001,"contrast":3.3833333333333333,"brightness":0.43333333333333335,"red":1,"green":1,"blue":1,"alpha":1}, + },*/ + escapeChance: {"Struggle": -0.5, "Cut": -0.125, "Remove": 10.0, "Pick": 0.1}, enemyTags: {"genericChastity": 8, "ornateChastity": 8, "roboAngry": 10}, + playerTags: {"FreeBoob": -1000}, minLevel: 4, allFloors: true, shrine: ["ChastityBras", "Chastity", "Metal", "Ornate"]}, + //endregion + + // Toys + + {renderWhenLinked: ["Chastity"], inventory: true, arousalMode: true, name: "WolfPanties", debris: "Belts", inaccessible: true, Asset: "SciFiPleasurePanties", strictness: 0.05, Color: ["#4F91DE", "#2E2E2E", "#3b7d4f", "#2f5753", "#4F91DE", "#4F91DE", "#000000"] ,Group: "ItemPelvis", LinkableBy: ["Chastity"], power: 4, + Model: "WolfPantiesRestraint", + sfxGroup: "Rubber", + limited: true, + Filters: { + Panties: {"gamma":1,"saturation":2.3000000000000003,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, + weight: 0, escapeChance: {"Struggle": 0.05, "Cut": 0.3, "Remove": 0.05, "Pick": 0.35}, escapeMult: 3.0, vibeLocation: "ItemVulva", + linkedVibeTags: ["teaser"], allowRemote: true, events: [ + {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 20, edgeOnly: true}, + {trigger:"tick", type: "PeriodicTeasing", power: 1, time: 48, edgeOnly: true, cooldown: {"normal": 120, "tease": 20}, chance: 0.02}, + {trigger:"tick", type: "PeriodicDenial", power: 2, time: 42, edgeOnly: true, cooldown: {"normal": 100, "tease": 20}, chance: 0.03}, + {trigger:"tick", type: "PeriodicTeasing", power: 3, time: 14, edgeOnly: false, cooldown: {"normal": 140, "tease": 20}, chance: 0.01}, + ], + maxwill: 0.5, enemyTags: {"wolfRestraints" : 6, "wolfGear":6}, playerTags: {"ItemPelvisFull": -5, "NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Latex", "Panties", "Vibes", "Toys"]}, + + + // Nipple vibes - these generally trigger on attack + {inventory: true, arousalMode: true, name: "NippleClamps", Asset: "HeartPasties", Color: "Default", Group: "ItemNipples", power: 3, weight: 0, + vibeLocation: "ItemNipples", + Model: "NippleClamps", + limited: true, + escapeChance: {"Struggle": -10, "Cut": -0.05, "Remove": 0.5, "Pick": 0.25}, failSuffix: {"Struggle": "Clamps"}, + maxwill: 1.0, enemyTags: {"dressRestraints" : 5, "toyTease": 2, "genericToys": 5, "maidRestraints": 3, "maidRestraintsLight": 1, "roboAngry": 10, "teasetoys": 3}, playerTags: {"NoVibes": -1000}, minLevel: 0, maxLevel: 8, allFloors: true, shrine: ["Vibes", "Toys"], linkedVibeTags: ["teaser", "piercings"], + events: [ + {trigger:"playerAttack", type: "MotionSensitive", chance: 0.5, msg: "KDPunishAttack", inheritLinked: true}, + {trigger:"punish", type: "PunishSelf", power: 1, time: 24, edgeOnly: true, inheritLinked: true}, + ]}, + {inventory: true, arousalMode: true, name: "NippleClamps2", Asset: "HeartPasties", Color: "Default", Group: "ItemNipples", power: 4, weight: 0, + vibeLocation: "ItemNipples", + Model: "VibePiercings", + limited: true, + escapeChance: {"Struggle": -10, "Cut": -0.05, "Remove": 0.5, "Pick": 0.25}, failSuffix: {"Struggle": "Clamps"}, + maxwill: 0.25, enemyTags: {"dressRestraints" : 3, "genericToys": 3, "maidRestraints": 2, "maidRestraintsLight": 1, "roboAngry": 10, "toyTeaseMid": 2, "teasetoys": 2}, playerTags: {"NoVibes": -1000}, minLevel: 4, allFloors: true, shrine: ["Vibes", "Toys", "Piercings"], linkedVibeTags: ["teaser", "piercings"], + events: [ + {trigger:"playerAttack", type: "MotionSensitive", chance: 0.5, msg: "KDPunishAttack", inheritLinked: true}, + {trigger:"struggle", type: "VibeOnStruggle", chance: 0.5, msg: "KDPunishStruggle", inheritLinked: true}, + {trigger:"punish", type: "PunishSelf", power: 1, time: 24, edgeOnly: true, inheritLinked: true}, + ]}, + {inventory: true, arousalMode: true, name: "NippleWeights", Asset: "HeartPasties", Color: "Default", Group: "ItemNipples", power: 4, weight: 0, + Model: "NippleWeights", + limited: true, + escapeChance: {"Struggle": -10, "Cut": -0.05, "Remove": 0.5, "Pick": 0.25}, failSuffix: {"Struggle": "Clamps"}, + maxwill: 1.0, enemyTags: {"obsidianRestraints" : 3, "bandit": 0.1, "genericToys": 1, "toyTease": 2}, playerTags: {"NoVibes": -1000}, minLevel: 3, allFloors: true, shrine: ["Weights", "Toys"], + events: [ + {trigger:"sprint", type: "NippleWeights", chance: 0.5, mult: 0.25, msg: "KDNippleWeights", inheritLinked: true}, + {trigger:"playerAttack", type: "NippleWeights", chance: 0.25, msg: "KDNippleWeights", mult: 0.25, power: 2.0, inheritLinked: true}, + {trigger:"playerCast", type: "NippleWeights", chance: 1.0, msg: "KDNippleWeights", power: 1.5, inheritLinked: true}, + ]}, + {inventory: true, arousalMode: true, name: "NippleClamps3", Asset: "HeartPasties", Color: "Default", Group: "ItemNipples", power: 5, weight: 0, + LinkableBy: ["Weights"], + vibeLocation: "ItemNipples", + Model: "RingVibes", + limited: true, + escapeChance: {"Struggle": -10, "Cut": -0.05, "Remove": 0.5, "Pick": 0.25}, failSuffix: {"Struggle": "Clamps"}, + maxwill: 0.25, enemyTags: {"dressRestraints" : 1, "genericToys": 1, "maidRestraints": 1, "roboAngry": 10, "teasetoys": 1, "toyTeaseIntense": 2}, playerTags: {"NoVibes": -1000}, minLevel: 8, allFloors: true, shrine: ["Vibes", "Toys"], linkedVibeTags: ["teaser", "piercings"], + events: [ + {trigger:"playerAttack", type: "MotionSensitive", chance: 1.0, msg: "KDPunishAttack", inheritLinked: true}, + {trigger:"struggle", type: "VibeOnStruggle", chance: 1.0, msg: "KDPunishStruggle", inheritLinked: true}, + {trigger:"sprint", type: "MotionSensitive", chance: 0.5, msg: "KDPunishSprint", inheritLinked: true}, + {trigger:"punish", type: "PunishSelf", power: 1, time: 24, edgeOnly: true, inheritLinked: true}, + ]}, + + // Vibrators - These generally trigger on magic + {inventory: true, arousalMode: true, name: "TrapVibe", Asset: "TapedClitEgg", Color: "Default", Group: "ItemVulvaPiercings", power: 1, weight: 2, + failSuffix: {"Struggle": "Egg"}, + limited: true, + escapeChance: {"Struggle": 0.15}, enemyTags: {"trap":100, "maidRestraintsLight": 5, "genericToys": 2, "teasetoys": 2, "toyTease": 2}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes", "Toys"], linkedVibeTags: ["teaser"], vibeLocation: "ItemVulvaPiercings", + events: [ + {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, // Harder to remove by crotch rope + {trigger:"playerCast", type: "MagicallySensitive"}, + {trigger:"punish", type: "PunishSelf", power: 1, time: 24, edgeOnly: true}, + ]}, + {inventory: true, arousalMode: true, name: "TrapVibeProto", Asset: "TapedClitEgg", Color: "Default", Group: "ItemVulvaPiercings", power: 1, weight: 2, + failSuffix: {"Struggle": "Egg"}, + limited: true, + escapeChance: {"Struggle": 0.25, Remove: 0.5}, enemyTags: {"protoToys": 2, "roboAngry": 10, "toyTeaseIntense": 2}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes", "Toys"], linkedVibeTags: ["teaser", "piercings"], vibeLocation: "ItemVulvaPiercings", + allowRemote: true, events: [ + {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, // Harder to remove by crotch rope + {trigger:"playerCast", type: "MagicallySensitive"}, + {trigger:"punish", type: "PunishSelf", power: 3, time: 12, edgeOnly: true}, + {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 1, time: 48, edgeOnly: true}, + {trigger:"tick", type: "PeriodicTeasing", power: 2, time: 20, edgeOnly: true, cooldown: {"normal": 90, "tease": 20}, chance: 0.02}, + {trigger:"tick", type: "PeriodicTeasing", power: 3, time: 15, edgeOnly: false, cooldown: {"normal": 90, "tease": 20}, chance: 0.02}, + ]}, + {inventory: true, arousalMode: true, name: "MaidVibe", Asset: "TapedClitEgg", Color: "Default", Group: "ItemVulvaPiercings", power: 4, weight: 2, escapeChance: {"Struggle": 0.15}, + failSuffix: {"Struggle": "Egg"}, + limited: true, + enemyTags: {"maidVibeRestraints": 1000, "maidVibeRestraintsLimited": 100, "toyTeaseMid": 1}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Vibes", "Toys"], linkedVibeTags: ["teaser"], vibeLocation: "ItemVulva", + events: [ + {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, // Harder to remove by crotch rope + {trigger:"playerCast", type: "MagicallySensitive", chance: 0.5}, + {trigger:"punish", type: "PunishSelf", power: 2, time: 12, edgeOnly: true}, + {trigger:"tick", type: "PeriodicTeasing", power: 2, time: 32, edgeOnly: true, cooldown: {"normal": 90, "tease": 20}, chance: 0.015}, + ]}, + + {inventory: true, arousalMode: true, name: "TrapPlug", Asset: "VibratingDildo", Color: "Default", Group: "ItemVulva", plugSize: 1.0, power: 3, weight: 2, + failSuffix: {"Struggle": "Plug"}, + limited: true, + escapeChance: {"Struggle": 0.25, Remove: 0.5}, enemyTags: {"trap":10, "maidRestraintsLight": 2, "genericToys": 2, 'machinePlug': 5, "toyPleasure": 2}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Plugs", "Vibes", "Toys"], linkedVibeTags: ["plugs"], + allowRemote: true, events: [ + {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, + {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: true}, + {trigger:"tick", type: "PeriodicTeasing", power: 1, time: 12, edgeOnly: false, cooldown: {"normal": 60, "tease": 20}, chance: 0.02}, + {trigger:"tick", type: "PeriodicDenial", power: 1, time: 36, edgeOnly: false, cooldown: {"normal": 60, "tease": 20}, chance: 0.02}, + {trigger:"tick", type: "PeriodicTeasing", power: 3, time: 16, edgeOnly: false, cooldown: {"normal": 60, "tease": 20}, chance: 0.02}, + ]}, + {inventory: true, arousalMode: true, name: "TrapPlug2", Asset: "VibratingDildo", Color: "Default", Group: "ItemVulva", plugSize: 1.0, power: 4, weight: 2, + failSuffix: {"Struggle": "Plug"}, + limited: true, + escapeChance: {"Struggle": 0.25, Remove: 0.5}, enemyTags: {"trap":0, 'machinePlug': 5, "teasetoys": 2, "toyEdge": 2, "toyDeny": 2}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Plugs", "Vibes", "Toys"], linkedVibeTags: ["plugs"], + allowRemote: true, events: [ + {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, + {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: true}, + {trigger:"tick", type: "PeriodicDenial", power: 1, time: 60, edgeOnly: false, cooldown: {"normal": 50, "tease": 10}, chance: 0.05}, + ]}, + {inventory: true, arousalMode: true, name: "TrapPlug3", Asset: "VibratingDildo", Color: "Default", Group: "ItemVulva", plugSize: 1.0, power: 5, weight: 2, + failSuffix: {"Struggle": "Plug"}, + limited: true, + escapeChance: {"Struggle": 0.25, Remove: 0.5}, enemyTags: {"trap":0, 'machinePlug': 5, "teasetoys": 2, "toyDenyMid": 2}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Plugs", "Vibes", "Toys"], linkedVibeTags: ["plugs"], + allowRemote: true, events: [ + {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, + {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: false}, + {trigger:"tick", type: "PeriodicDenial", power: 2, time: 36, cooldown: {"normal": 150, "tease": 40}, chance: 0.05}, + ]}, + {inventory: true, arousalMode: true, name: "TrapPlug4", Asset: "VibratingDildo", Color: "Default", Group: "ItemVulva", plugSize: 1.0, power: 5, weight: 1, + failSuffix: {"Struggle": "Plug"}, + limited: true, + escapeChance: {"Struggle": 0.25, Remove: 0.5}, enemyTags: {"trap":0, 'machinePlug': 2, "toyPleasureMid": 2, "toyEdgeMid": 2}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Plugs", "Vibes", "Toys"], linkedVibeTags: ["plugs"], + allowRemote: true, events: [ + {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, + {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: false}, + {trigger:"tick", type: "PeriodicTeasing", power: 3, time: 20, edgeOnly: false, cooldown: {"normal": 40, "tease": 20}, chance: 0.01}, + {trigger:"tick", type: "PeriodicDenial", power: 2, time: 30, edgeOnly: true, cooldown: {"normal": 70, "tease": 20}, chance: 0.02}, + {trigger:"tick", type: "PeriodicTeasing", power: 4, time: 10, edgeOnly: false, cooldown: {"normal": 90, "tease": 5}, chance: 0.03}, + {trigger:"tryOrgasm", type: "ForcedOrgasmPower", power: 1}, + {trigger:"tryOrgasm", type: "ForcedOrgasmMin", power: 3}, + ]}, + + {inventory: true, arousalMode: true, name: "TrapPlug5", Asset: "VibratingDildo", Color: "Default", Group: "ItemVulva", plugSize: 1.0, power: 5, weight: 1, + failSuffix: {"Struggle": "Plug"}, + limited: true, + escapeChance: {"Struggle": 0.25, Remove: 0.5}, enemyTags: {"trap":0, 'machinePlug': 2, "intensetoys": 2, "toyPleasureIntense": 4}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Plugs", "Vibes", "Toys"], linkedVibeTags: ["plugs"], + allowRemote: true, events: [ + {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, + {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: false}, + {trigger:"tick", type: "PeriodicTeasing", power: 2, time: 36, edgeOnly: false, cooldown: {"normal": 60, "tease": 30}, chance: 0.05}, + {trigger:"tick", type: "PeriodicTeasing", power: 4, time: 24, edgeOnly: false, cooldown: {"normal": 90, "tease": 15}, chance: 0.03}, + {trigger:"tryOrgasm", type: "ForcedOrgasmPower", power: 3}, + {trigger:"tryOrgasm", type: "ForcedOrgasmMin", power: 6}, + ]}, + + + {inventory: true, arousalMode: true, name: "SteelPlugF", Asset: "VibratingDildo", Color: "#ffffff", Group: "ItemVulva", plugSize: 1.5, power: 1, weight: 2, + limited: true, + escapeChance: {"Struggle": 0.35, Remove: 0.7}, enemyTags: {"plugSpell":1, "toyTease": 2, "onebar": 8}, playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Plugs", "Toys"], + events: [ + {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, + ], + failSuffix: {"Struggle": "Plug"}, + }, + {inventory: true, arousalMode: true, name: "SteelPlugR", Asset: "VibratingDildoPlug", Color: "#ffffff", Group: "ItemButt", plugSize: 1.5, power: 1, weight: 2, + limited: true, + escapeChance: {"Struggle": 0.35, Remove: 0.7}, + enemyTags: {"plugSpell":1, 'machinePlug': 4, "toyTease": 2, "onebar": 8}, + playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Plugs", "Toys"], + events: [ + {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, + ], + failSuffix: {"Struggle": "Plug"}, + }, + {inventory: true, arousalMode: true, name: "RearVibe1", Asset: "VibratingDildoPlug", Color: "Default", Group: "ItemButt", plugSize: 1.0, power: 5, weight: 1, escapeChance: {"Struggle": 0.25, Remove: 0.5}, + enemyTags: {"genericToys": 1, "rearToys": 10, "toyEdgeMid": 2}, + limited: true, + playerTags: {"NoVibes": -1000}, minLevel: 0, allFloors: true, shrine: ["Plugs", "Vibes", "Toys"], + failSuffix: {"Struggle": "Plug"}, + linkedVibeTags: ["plugs"], allowRemote: true, events: [ + {trigger: "beforeStruggleCalc", type: "vibeStruggle", inheritLinked: true}, + {trigger:"remoteVibe", type: "RemoteActivatedVibe", power: 2, time: 12, edgeOnly: true}, + {trigger:"tick", type: "PeriodicTeasing", power: 1, time: 30, edgeOnly: true, cooldown: {"normal": 120, "tease": 20}, chance: 0.02}, + ]}, + + // Generic ball gag thats stronger than the trap one + {inventory: true, name: "MagicGag", Asset: "BallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], gag: 0.35, + Model: "BallGag", + sfxGroup: "Leather", + biggerVersion: "MagicGagLarge", + quickBindCondition: "BallGag", quickBindMult: 0.5, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], keepLock: true, power: 1, msg: "KDGagNecklaceOn"}], + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 20, ballGagRestraintsMagic: 12}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + Type: "Tight", Color: ["Default", "Default"], Group: "ItemMouth", DefaultLock: "Red", power: 4, weight: 2, + escapeChance: {"Struggle": 0.0, "Cut": 0.45, "Remove": 0.65, "Pick": 0.3}, + maxwill: 0.9, enemyTags: {"ballGagRestraints" : 4, "gagSpell": 10, forceAntiMagic: -100}, playerTags: {}, minLevel: 0, maxLevel: 7, allFloors: true, shrine: ["BallGags", "Leather", "Gags"]}, + {inventory: true, name: "MagicGagLarge", Asset: "BallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], gag: 0.35, + Model: "LargeBallGag", + sfxGroup: "Leather", + quickBindCondition: "BallGag", quickBindMult: 0.5, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], keepLock: true, power: 1, msg: "KDGagNecklaceOn"}], + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 20, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + Type: "Tight", Color: ["Default", "Default"], Group: "ItemMouth", DefaultLock: "Red_Hi", power: 5, weight: 2, + escapeChance: {"Struggle": 0.0, "Cut": 0.45, "Remove": 0.65, "Pick": 0.3}, + maxwill: 0.9, enemyTags: {"ballGagRestraints" : 4, "gagSpell": 10, forceAntiMagic: -100}, playerTags: {}, minLevel: 7, allFloors: true, shrine: ["BallGags", "Leather", "Gags"]}, + + {inventory: true, name: "MagicGag2", Asset: "BallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], + Model: "LargeBallGag", + sfxGroup: "Leather", + quickBindCondition: "BallGag", quickBindMult: 0.5, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], keepLock: true, power: 1, msg: "KDGagNecklaceOn"}], + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 20, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + gag: 0.45, Type: "Tight", Color: ["Default", "#ff00ff"], Group: "ItemMouth", DefaultLock: "Purple", magic: true, power: 5.5, weight: 2, + escapeChance: {"Struggle": -0.1, "Cut": 0.12, "Remove": 0.45, "Pick": 0.25}, + enemyTags: {"ballGagRestraintsMagic" : 4, "gagSpellStrong": 10, forceAntiMagic: -100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["BallGags", "Leather", "Gags", "Conjure"]}, + {inventory: true, name: "AntiMagicGag", Asset: "BallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], + Model: "BallGag", + sfxGroup: "Leather", + quickBindCondition: "BallGag", quickBindMult: 0.5, + Filters: { + "Ball": {"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":3.016666666666667,"blue":3.95,"alpha":1}, + }, + gag: 0.15, Type: "Tight", Color: ["Default", "#92e8c0"], Group: "ItemMouth", DefaultLock: "Purple", magic: true, power: 6, weight: 2, + escapeChance: {"Struggle": -0.3, "Cut": 0.04, "Remove": 0.45, "Pick": 0.15}, + events: [ + {trigger: "tick", type: "AntiMagicGag", inheritLinked: true, count: 8, power: 0.4}, + {trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], keepLock: true, power: 1, msg: "KDGagNecklaceOn"} + ], + //"ballGagRestraintsMagic" : 2, "antiMagic": 6 + enemyTags: {}, playerTags: {}, minLevel: 3, maxLevel: 7, allFloors: true, shrine: ["Illusion", "BallGags", "Leather" , "Gags", "Conjure"]}, + {inventory: true, name: "AntiMagicGag2", Asset: "BallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], + Model: "BallGag", + sfxGroup: "Leather", + quickBindCondition: "BallGag", quickBindMult: 0.5, + Filters: { + "Ball": {"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":3.016666666666667,"blue":3.95,"alpha":1}, + }, + gag: 0.45, Type: "Tight", Color: ["Default", "#92e8c0"], Group: "ItemMouth", DefaultLock: "Purple", magic: true, power: 7, weight: 2, + escapeChance: {"Struggle": -0.4, "Cut": -0.02, "Remove": 0.4, "Pick": 0.12}, + events: [ + {trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], keepLock: true, power: 1, msg: "KDGagNecklaceOn"}, + {trigger: "tick", type: "AntiMagicGag", inheritLinked: true, count: 30, power: 0.4}, + ], + //"ballGagRestraintsMagic" : 0.3, "antiMagic": 2 + enemyTags: {}, playerTags: {}, minLevel: 7, allFloors: true, shrine: ["Illusion", "BallGags", "Latex" , "Gags", "Conjure"]}, + + // Generic stronger gag + {inventory: true, trappable: true, name: "PanelGag", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Asset: "DeepthroatGag", gag: 0.7, + Model: "PanelGag", + sfxGroup: "Leather", + Color: "#888888", Group: "ItemMouth", power: 4, weight: 5, + escapeChance: {"Struggle": 0.1, "Cut": 0.3, "Remove": 0.4, "Pick": 0.3}, + maxwill: 0.6, enemyTags: {"leatherRestraints":8, "leatherGags": 10}, playerTags: {}, minLevel: 0, maxLevel: 7, allFloors: true, shrine: ["FlatGags", "Leather", "Gags"]}, + {inventory: true, trappable: true, name: "HarnessPanelGag", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Asset: "HarnessPanelGag", gag: 0.7, + Model: "PanelGagHarness", + sfxGroup: "Leather", + events: [ + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.35, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.25, requiredTag: "Blindfolds"}, + ], + Color: "#888888", Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 5, strictness: 0.2, weight: 2, + escapeChance: {"Struggle": -0.1, "Cut": 0.25, "Remove": 0.15, "Pick": 0.15}, + maxwill: 0.6, enemyTags: {"leatherRestraintsHeavy":8, "leatherGags": 10}, playerTags: {}, minLevel: 3, allFloors: true, shrine: ["FlatGags", "Leather", "Gags"]}, + {inventory: true, trappable: true, name: "HarnessGag", debris: "Belts", Asset: "HarnessBallGag", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], + Model: "BallGagHarness", + sfxGroup: "Leather", + events: [ + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.15, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.1, requiredTag: "Blindfolds"}, + ], + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + factionFilters: { + Ball: {color: "Highlight", override: false}, + }, + gag: 0.65, Type: "Tight", Color: ["Default", "Default"], Group: "ItemMouth", power: 4, strictness: 0.2, weight: 3, + escapeChance: {"Struggle": -0.1, "Cut": 0.25, "Remove": 0.15, "Pick": 0.2}, + maxwill: 0.6, enemyTags: {"leatherRestraints":1, "leatherRestraintsHeavy": 1, "leatherGags": 10, forceAntiMagic: -100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["BallGags", "Leather" , "Gags"]}, + {inventory: true, name: "PanelPlugGagHarness", Asset: "OTNPlugGag", debris: "Belts", LinkableBy: [...KDPlugGagLink], renderWhenLinked: [...KDPlugGagLink], Type: "Plug", gag: 1.0, + Model: "PlugMuzzleGagHarness", + sfxGroup: "Leather", + events: [ + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.35, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.25, requiredTag: "Blindfolds"}, + ], + Color: ["#888888", "#444444", "#aaaaaa"], Group: "ItemMouth", strictness: 0.4, power: 7, weight: 1, + escapeChance: {"Struggle": -0.2, "Cut": 0.2, "Remove": 0.12, "Pick": 0.07}, + ignoreMinLevelTags: ["miniboss", "boss", "stageboss"], + maxwill: 0.2, enemyTags: {"leatherRestraintsHeavy" : 4, "leatherGags": 5}, playerTags: {}, minLevel: 8, allFloors: true, shrine: ["PlugGags", "Leather", "Gags"]}, + {inventory: true, name: "PanelPlugGag", Asset: "DildoPlugGag", debris: "Belts", LinkableBy: [...KDPlugGagLink], renderWhenLinked: [...KDPlugGagLink], gag: 0.9, + Model: "PlugMuzzleGag", + sfxGroup: "Leather", + Color: ["#888888", "#444444", "#aaaaaa"], Group: "ItemMouth", power: 6, weight: 1, + escapeChance: {"Struggle": -0.05, "Cut": 0.2, "Remove": 0.15, "Pick": 0.1}, + maxwill: 0.2, enemyTags: {"leatherRestraintsHeavy" : 10, "leatherGags": 5}, playerTags: {}, minLevel: 5, maxLevel: 10, allFloors: true, shrine: ["PlugGags", "Leather", "Gags"]}, + + // Simple cloth stuff + {inventory: true, name: "ClothGag", LinkableBy: [...KDBallGagLink], debris: "Fabric", renderWhenLinked: [...KDBallGagLink], Asset: "ClothGag", gag: 0.35, Type: "Knotted", Color: "#959595", Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, + Model: "ClothCleave", + sfxGroup: "Ropes", + removePrison: true, + maxwill: 0.75, enemyTags: {"clothRestraints":8, "ropeAuxiliary": 3}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["ClothGag", "Rope", "BallGags", "Gags"]}, + {inventory: true, name: "ClothGag2", LinkableBy: [...KDBallGagLink], debris: "Fabric", renderWhenLinked: [...KDBallGagLink], Asset: "ClothGag", gag: 0.45, Type: "Knotted", Color: "#959595", Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, + Model: "ClothCleaveThick", + sfxGroup: "Ropes", + removePrison: true, + maxwill: 0.6, enemyTags: {"clothRestraints":6, "ropeAuxiliary": 2}, playerTags: {}, minLevel: 2, allFloors: true, shrine: ["ClothGag", "Rope", "BallGags", "Gags"]}, + {inventory: true, name: "ClothGag3", LinkableBy: [...KDBallGagLink], debris: "Fabric", renderWhenLinked: [...KDBallGagLink], Asset: "ClothGag", gag: 0.65, Type: "Knotted", Color: "#959595", Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, + Model: "ClothKnot", + sfxGroup: "Ropes", + maxwill: 0.35, enemyTags: {"clothRestraints":4, "ropeAuxiliary": 1}, playerTags: {}, minLevel: 3, allFloors: true, shrine: ["ClothGag", "Rope", "BallGags", "Gags"]}, + {inventory: true, name: "ClothGagOver", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Asset: "ClothGag", gag: 0.35, Type: "OTN", Color: "#959595", Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, + Model: "ClothOTN", + sfxGroup: "Ropes", + removePrison: true, + maxwill: 0.75, enemyTags: {"clothRestraints":4, "ropeAuxiliary": 1}, debris: "Fabric", playerTags: {"ItemMouthEmpty": -4, "ItemMouth2Empty": -4}, minLevel: 0, allFloors: true, shrine: ["ClothGag", "FlatGags", "Rope", "Gags"]}, + {inventory: true, name: "ClothBlindfold", Asset: "ClothBlindfold", debris: "Fabric", Color: "#959595", LinkableBy: [...KDTapeLink], renderWhenLinked: [...KDTapeRender], Group: "ItemHead", power: 0.1, weight: 2, escapeChance: {"Struggle": 0.5, "Cut": 1.0, "Remove": 0.8}, + Model: "ClothBlindfold", + removePrison: true, + sfxGroup: "Ropes", + affinity: {Struggle: ["Sticky", "Hook"], Remove: ["Hook"],}, + maxwill: 0.85, blindfold: 2, enemyTags: {"clothRestraints":8, "ropeAuxiliary": 1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["ClothBlindfold", "Rope", "Blindfolds"]}, + + //region Baast warriors only apply two things so its okay that these have a high maxwill + {inventory: true, name: "KittyGag", Asset: "KittyHarnessPanelGag", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.6, + Model: "KittyHarnessPanelGag", + sfxGroup: "Leather", + events: [ + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.35, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.25, requiredTag: "Blindfolds"}, + ], + Color: ["#FFFFFF", "#FFFFFF", "#000000", "#E496E7"], Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 5, weight: 2, escapeChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": 0.25, "Pick": 0.2}, + enemyTags: {"kittyRestraints":8}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["FlatGags", "Leather", "Gags", "Will"]}, + {inventory: true, name: "KittyMuzzle", debris: "Belts", Asset: "KittyGag", gag: 0.4, Color: ["#FFFFFF", "#000000", "#E496E7"], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 7, weight: -6, escapeChance: {"Struggle": -0.04, "Cut": 0.04, "Remove": 0.4, "Pick": 0.2}, + Model: "KittyMuzzle", + sfxGroup: "Leather", + maxwill: 0.9, enemyTags: {"kittyRestraints":6}, playerTags: {"ItemMouth2Full": 4, "ItemMouthFull": 4}, minLevel: 3, allFloors: true, shrine: ["FlatGags", "Leather", "Gags", "Will"]}, + {inventory: true, name: "KittyBlindfold", debris: "Belts", Asset: "KittyBlindfold", blindfold: 3, + Model: "KittyBlindfold", + sfxGroup: "Leather", + LinkableBy: [...KDBlindfoldLink], renderWhenLinked: [...KDBlindfoldLink], Color: ["#FFFFFF","#000000","#E48FE9"], Group: "ItemHead", + power: 5, weight: 2, escapeChance: {"Struggle": 0.1, "Cut": 0.3, "Remove": 0.25, "Pick": 0.2}, + enemyTags: {"kittyRestraints":8}, playerTags: {NoBlindfolds: -1000}, minLevel: 0, allFloors: true, shrine: ["Leather", "Blindfolds", "Will"]}, + {inventory: true, name: "KittyPaws", debris: "Belts", Asset: "PawMittens", Color: ["#FFFFFF","#FFFFFF","#FFFFFF","#B38295"], Group: "ItemHands", + LinkableBy: [...KDGlovesLink], bindhands: 1.0, power: 5, weight: 2, + escapeChance: {"Struggle": 0.0, "Cut": 0.3, "Remove": 0.15, "Pick": 0.4}, + Model: "LeatherPawMittens", + sfxGroup: "Leather", + maxwill: 0.9, enemyTags: {"kittyRestraints":8}, playerTags: {}, minLevel: 4, allFloors: true, shrine: ["Mittens", "Leather", "Will"]}, + {inventory: true, name: "KittySuit", debris: "Belts", Asset: "BitchSuit", Color: "Default", Group: "ItemArms", DefaultLock: "Red", + Model: "ElitePetsuit", + sfxGroup: "Leather", + Filters: { + Suit: {"gamma":1.65,"saturation":1,"contrast":1,"brightness":1.23,"red":1,"green":1,"blue":1,"alpha":1} + }, + factionFilters: { + Suit: { + color: "LightNeutral", override: false, + }, + Straps: { + color: "DarkNeutral", override: true, + }, + Hardware: { + color: "Highlight", override: true, + }, + Laces: { + color: "Highlight", override: true, + }, + }, + bindarms: true, bindhands: 1.0, addTag: ["ForceKneel"], + hobble: 2, + power: 11, weight: 0, escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": -0.1, "Pick": 0.15}, + events:[ + {trigger:"defeat", type:"Kittify"}, + ], + helpChance: {"Remove": 0.1}, maxwill: 0.15, enemyTags: {"kittyRestraints":3}, playerTags: {"NoPet": -1000}, minLevel: 7, allFloors: true, shrine: ["Petsuits", "Latex", "Will", "HinderFeet"]}, + {inventory: true, name: "MagicPetsuit", inaccessible: true, debris: "Belts", Asset: "StrictLeatherPetCrawler", magic: true, Color: "Default", Group: "ItemArms", + Model: "Petsuit", + sfxGroup: "Leather", + bindarms: true, bindhands: 1.0, addTag: ["ForceKneel"], power: 12, weight: 0, + hobble: 2, + factionFilters: { + Arms: { + color: "DarkNeutral", override: true, + }, + ArmsBelts: { + color: "LightNeutral", override: true, + }, + Legs: { + color: "DarkNeutral", override: true, + }, + LegsBelts: { + color: "LightNeutral", override: true, + }, + }, + escapeChance: {"Struggle": -0.15, "Cut": 0.12, "Remove": -0.05, "Pick": 0.15}, + helpChance: {"Remove": 0.2}, maxwill: 0.15, enemyTags: {"petsuitSpell": 1}, + playerTags: {"NoPet": -1000}, minLevel: 0, allFloors: true, + shrine: ["Petsuits", "Leather", "Conjure", "HinderFeet"]}, + {inventory: true, name: "LatexPetsuit", inaccessible: true, debris: "Slime", Color: "Default", Group: "ItemArms", + Model: "LatexPetsuit", + sfxGroup: "Leather", + bindarms: true, bindhands: 1.0, addTag: ["ForceKneel"], power: 9, weight: 0, + hobble: 2, + factionFilters: { + Arms: { + color: "Catsuit", override: true, + }, + Legs: { + color: "Catsuit", override: true, + }, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.005, // Impossible to put on without binding arms first + }, + Filters: { + Legs: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":2.2666666666666666,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + Arms: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":2.2666666666666666,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + }, + alwaysDressModel: [ + { + Model: "Catsuit", + Filters: { + TorsoUpper: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":2.2666666666666666,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + TorsoLower: {"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":2.2666666666666666,"red":1,"green":1.8333333333333333,"blue":2.7666666666666666,"alpha":1}, + }, + factionFilters: { + TorsoUpper: {color: "Catsuit", override: true}, + TorsoLower: {color: "Catsuit", override: true}, + }, + }, + ], + remove: ["Bras", "Panties", "Skirts", "Socks", "Shirts", "Boots"], + escapeChance: {"Struggle": -0.25, "Cut": 0.05, "Remove": -0.2, "Pick": 0.15}, + helpChance: {"Remove": 0.15}, maxwill: 0.15, enemyTags: {"petsuitSpell": 1, "latexpetsuit": 3}, + playerTags: {"NoPet": -1000}, minLevel: 0, allFloors: true, shrine: ["Petsuits", "Latex", "Conjure", "HinderFeet"]}, + {inventory: true, name: "WolfPetsuit", inaccessible: true, debris: "Belts", Asset: "StrictLeatherPetCrawler", Color: "Default", Group: "ItemArms", + DefaultLock: "Blue", + sfxGroup: "Rubber", + remove: ["Bras", "Panties"], + alwaysDressModel: [ + { + Model: "WolfTorsoLower", + factionFilters: { + Band: {color: "Highlight", override: true}, + Rim: {color: "LightNeutral", override: true}, + Cloth: {color: "DarkNeutral", override: true}, + }, + }, + { + Model: "WolfTorsoUpper", + factionFilters: { + Band: {color: "Highlight", override: true}, + Rim: {color: "LightNeutral", override: true}, + Cups: {color: "LightNeutral", override: true}, + Cloth: {color: "DarkNeutral", override: true}, + }, + }, + ], + + bindarms: true, bindhands: 1.0, addTag: ["ForceKneel"], power: 14, weight: 0, + hobble: 2, + Model: "CyberPetsuit", + factionFilters: { + Suit: { + color: "LightNeutral", override: true, + }, + Straps: { + color: "DarkNeutral", override: true, + }, + Display: { + color: "Highlight", override: true, + }, + }, + events: [ + {type: "FactionStealth", trigger: 'calcSneak', kind: "Nevermere", mult: 0.8, power: 2,}, + ], + escapeChance: {"Struggle": -0.45, "Cut": -0.1, "Remove": -0.3, "Pick": 0.15}, + helpChance: {"Remove": 0.01}, maxwill: 0.15, enemyTags: {"wolfPetsuit": 1}, playerTags: {"NoPet": -1000}, minLevel: 0, allFloors: true, shrine: ["Petsuits", "Latex", "HinderFeet"]}, + // Only apply if already wearing KittySuit + {inventory: true, name: "KittyPetSuit", inaccessible: true, debris: "Belts", Asset: "BitchSuit", Color: "Default", Group: "ItemArms", + DefaultLock: "Blue", + sfxGroup: "Leather", + Model: "ElitePetsuit", + remove: ["Bras", "Panties"], + alwaysDressModel: [ + { + Model: "LeatherLeotard", + factionFilters: { + Leather: { + color: "LightNeutral", override: true, + }, + Corset: { + color: "DarkNeutral", override: true, + }, + Laces: { + color: "Highlight", override: true, + }, + }, + }, + { + Model: "LeatherLeotardStrapsLower", + factionFilters: { + Straps: { + color: "Highlight", override: true, + }, + Hardware: { + color: "Highlight", override: true, + }, + }, + }, + { + Model: "LeatherLeotardStrapsUpper", + factionFilters: { + Straps: { + color: "Highlight", override: true, + }, + }, + }, + ], + + factionFilters: { + Suit: { + color: "LightNeutral", override: true, + }, + Straps: { + color: "Highlight", override: false, + }, + Hardware: { + color: "LightNeutral", override: true, + }, + Laces: { + color: "Highlight", override: true, + }, + }, + bindarms: true, bindhands: 1.0, addTag: ["ForceKneel"],power: 14, weight: 0, + hobble: 2, + escapeChance: {"Struggle": -0.3, "Cut": 0.0, "Remove": -0.3, "Pick": 0.15}, + alwaysDress: [ + {Item: "KittenEars2", Group: "HairAccessory2", Color: ['Default'], override: false, useHairColor: true,}, + {Item: "TailStrap", Group: "TailStraps", Color: ['Default'], override: false, useHairColor: true,}, + ], + events: [ + {type: "FactionStealth", trigger: 'calcSneak', kind: "Bast", mult: 0.8, power: 2,}, + ], + helpChance: {"Remove": 0.01}, maxwill: 0.15, enemyTags: {"kittyRestraints":0}, playerTags: {"NoPet": -1000}, minLevel: 7, allFloors: true, shrine: ["Petsuits", "Latex", "Will", "HinderFeet"]}, + //endregion + + //region These restraints are easy, so they dont have maxwill + {inventory: true, name: "WristShackles", debris: "Chains", Asset: "WristShackles", linkCategory: "Cuffs", linkSize: 0.33, LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], + sfxGroup: "Handcuffs", + struggleBreak: true, + Model: "ShacklesWrists", + quickBindCondition: "Handcuffs", + noDupe: true, + Group: "ItemArms", Color: "Default", bindarms: true, Type: "Behind", power: 1, escapeChance: {"Struggle": -0.05, "Cut": -0.25, "Remove": 10, "Pick": 5}, + DefaultLock: "White", + // Cuffs playertags + weight: 2, + playerTags: {"ItemArmsFull":-2, "ItemArmsEmpty": 5}, + playerTagsMult: {Metal: 2}, + playerTagsMissing: {Metal: -4}, + playerTagsMissingMult: {Metal: 0.2}, + events: [{trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}], + enemyTags: {"shackleRestraints":7, "handcuffer": 2, "Unchained": -8}, enemyTagsMult: {handcuffer: 0.2, Unchained: 0.1}, minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs"]}, + {inventory: true, trappable: true, name: "TrapCuffs", debris: "Chains", Asset: "MetalCuffs", accessible: true, linkCategory: "Cuffs", linkSize: 0.33, LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Group: "ItemArms", + sfxGroup: "Handcuffs", + struggleBreak: true, + quickBindCondition: "Handcuffs", + Model: "HandCuffs", + noDupe: true, + Color: "Default", bindarms: true, power: 2, DefaultLock: "White", + events: [{trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}], + // Cuffs playertags + weight: 4, + playerTags: {"ItemArmsFull":-2, "ItemArmsEmpty": 5}, + playerTagsMult: {Metal: 2}, + playerTagsMissing: {Metal: -8}, + playerTagsMissingMult: {Metal: 0.2}, + escapeChance: {"Struggle": -0.25, "Cut": -0.1, "Remove": 10, "Pick": 0.5}, enemyTagsMult: {handcuffer: 0.2, Unchained: 0.1}, enemyTags: {"trap":100, "handcuffer": 4, "cuffsSpell": 10}, minLevel: 0, allFloors: true, shrine: ["Handcuffs", "HandsFrontAllowed", "Metal", "Cuffs"]}, + + {inventory: true, trappable: true, name: "HingedCuffs", debris: "Chains", Asset: "MetalCuffs", accessible: true, + sfxGroup: "Handcuffs", + struggleBreak: true, + Model: "HingedCuffs", + quickBindCondition: "Handcuffs", + noDupe: true, + linkCategory: "Cuffs", linkSize: 0.4, LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Group: "ItemArms", + Color: "Default", bindarms: true, power: 5, DefaultLock: "White", + events: [{trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}], + helpChance: {"Remove": 0.4, "Pick": 0.4, "Unlock": 1.0}, + escapeChance: {"Struggle": -0.3, "Cut": -0.2, "Remove": -0.2, "Pick": -0.25, "Unlock": -0.25}, + // Cuffs playertags + weight: 10, + restriction: 2, + playerTags: {"ItemArmsFull":-2, "ItemArmsEmpty": 5}, + playerTagsMult: {Metal: 2}, + playerTagsMissing: {Metal: -15}, + playerTagsMissingMult: {Metal: 0.2}, + enemyTags: {"trap":100, "handcuffer": 6, "cuffsSpell": 10}, enemyTagsMult: {handcuffer: 0.2, Unchained: 0.1}, minLevel: 5, allFloors: true, shrine: ["Handcuffs", "HandsFrontAllowed", "Metal", "Cuffs"]}, + {inventory: true, trappable: true, name: "Irish8Cuffs", debris: "Chains", Asset: "MetalCuffs", accessible: true, + sfxGroup: "Handcuffs", + struggleBreak: true, + Model: "Irish8Cuffs", + quickBindCondition: "Handcuffs", + linkCategory: "Cuffs", linkSize: 0.51, LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Group: "ItemArms", + Color: "Default", bindarms: true, power: 6, DefaultLock: "White", + events: [{trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}], + helpChance: {"Remove": 0.5, "Pick": 0.4, "Unlock": 1.0}, + escapeChance: {"Struggle": -0.5, "Cut": -0.4, "Remove": -0.2, "Pick": -0.2, "Unlock": -0.25}, + // Cuffs playertags + weight: 4, + noDupe: true, + restriction: 3, + playerTags: {"ItemArmsFull":-2, "ItemArmsEmpty": 5}, + playerTagsMult: {Metal: 2}, + playerTagsMissing: {Metal: -4}, + playerTagsMissingMult: {Metal: 0.2}, + enemyTags: {"trap":10, "handcuffer": 4, "cuffsSpell": 7}, enemyTagsMult: {handcuffer: 0.2, Unchained: 0.1}, minLevel: 8, allFloors: true, shrine: ["Handcuffs", "HandsFrontAllowed", "Metal", "Cuffs"]}, + + {inventory: true, trappable: true, name: "AnkleIrish8Cuffs", debris: "Chains", Asset: "Irish8Cuffs", LinkableBy: ["Wrapping", "Encase", "Belts"], Color: "Default", Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"], + power: 6, + Model: "Irish8Ankle", + struggleBreak: true, + linkCategory: "AnkleCuffs", linkSize: 0.51, noDupe: true, + maxwill: 0.5, + sfxGroup: "Handcuffs", + // Shackles playertags + weight: 4, + restriction: 2, + playerTags: {"ItemFeetFull":-2, "ItemFeetEmpty": 5}, + playerTagsMult: {Metal: 2}, + playerTagsMissing: {Metal: -8}, + playerTagsMissingMult: {Metal: 0.2}, + escapeChance: {"Struggle": -0.6, "Cut": -0.4, "Remove": 0.1, "Pick": 0.4}, enemyTags: {"handcuffer":4, "shackleRestraints": 1, "cuffsSpell": 7}, enemyTagsMult: {handcuffer: 0.2, Unchained: 0.1}, minLevel: 7, allFloors: true, shrine: ["Legirons", "Metal", "Cuffs"]}, + + + {inventory: true, trappable: true, name: "ThumbCuffsNew", debris: "Chains", Asset: "MetalCuffs", accessible: true, + Model: "Thumbcuffs", + struggleBreak: true, + hideTags: ["Armbinders", "Boxbinders", "Boxties", "Wristies", "BoundArms"], + AssetGroup: "ItemArms", + sfxGroup: "Handcuffs", + linkCategory: "Thumbs", linkSize: 0.51, LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Group: "ItemArms", + Color: "Default", bindarms: true, power: 6, DefaultLock: "White", + bindhands: 0.4, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postApply", type: "NoYoke", inheritLinked: true}, + ], + restriction: 3, + helpChance: {"Pick": 0.4, "Unlock": 1.0}, + escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": -0.2, "Pick": -0.12, "Unlock": -0.05}, + enemyTags: {"trap":1, "handcuffer": 1, "cuffsSpell": 1, "thumbcuffs": 10}, + enemyTagsMult: {handcuffer: 0.3, Unchained: 0.2}, + weight: 15, + noDupe: true, + playerTags: {"ItemHandsFull":-2, "ItemArmsEmpty": -13, "Yokes": -100}, + playerTagsMult: {Metal: 2}, + playerTagsMissing: {Metal: -13}, + playerTagsMissingMult: {Metal: 0.2}, + minLevel: 8, allFloors: true, shrine: ["Thumbcuffs", "Cuffs", "Metal", "HandsFrontAllowed"]}, + + + {inventory: true, name: "WolfCuffs", debris: "Chains", Asset: "MetalCuffs", accessible: true, linkCategory: "SmartCuffs", linkSize: 0.55, LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], + quickBindCondition: "Handcuffs", + sfxGroup: "Handcuffs", + struggleBreak: true, + Model: "WolfCuffs", + Color: "Default", Group: "ItemArms", bindarms: true, power: 5, DefaultLock: "Red", + // Cuffs playertags + weight: 2, + playerTags: {"ItemArmsFull":-2, "ItemArmsEmpty": 5}, + playerTagsMult: {Metal: 2}, + noDupe: true, + playerTagsMissing: {Metal: -10}, + playerTagsMissingMult: {Metal: 0.2}, + events: [{trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}], + maxwill: 0.8, escapeChance: {"Struggle": -0.4, "Cut": -0.15, "Remove": 10, "Pick": 0.0}, + enemyTags: {"wolfCuffs": 6, "cuffsSpell": 100}, minLevel: 5, allFloors: true, shrine: ["Handcuffs", "HandsFrontAllowed", "Metal", "Cuffs"]}, + + + + {inventory: true, name: "LegShackles", debris: "Chains", Asset: "LeatherLegCuffs", LinkableBy: [...KDBindable, ...KDDevices], + sfxGroup: "Handcuffs", + struggleBreak: true, + Model: "ShacklesThigh", + alwaysDressModel: [ + {Model: "ThighLink", inheritFilters: true} + ], + Group: "ItemLegs", hobble: 1, Type: "Chained", Color: ["Default", "#888888", "#AAAAAA"], power: 3, + escapeChance: {"Struggle": -0.1, "Cut": -0.3, "Remove": 10, "Pick": 5}, + enemyTags: {"shackleRestraints":2}, + enemyTagsMult: {handcuffer: 0.2, Unchained: 0.1}, + weight: 2, + playerTags: {"ItemLegsFull":-2, "ItemLegsEmpty": 5}, + playerTagsMult: {Metal: 2}, + playerTagsMissing: {Metal: -5}, + playerTagsMissingMult: {Metal: 0.2}, + minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "LegCuffsBase"]}, + + {inventory: true, name: "FeetShackles", debris: "Chains", Asset: "SteelAnkleCuffs", LinkableBy: [...KDBindable, ...KDDevices], + Model: "ShacklesAnkles", + struggleBreak: true, + alwaysDressModel: [ + {Model: "AnkleLink", inheritFilters: true} + ], + Filters: { + BaseMetal: {"gamma":1,"saturation":1,"contrast":1.4833333333333334,"brightness":2.0166666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + }, + linkCategory: "AnkleCuffs", linkSize: 0.4, noDupe: true, + sfxGroup: "Handcuffs", + Group: "ItemFeet", hobble: 1, Type: "Chained", Color: ["Default", "Default"], power: 5, escapeChance: {"Struggle": -0.1, "Cut": -0.3, "Remove": 10, "Pick": 5}, + enemyTags: {"shackleRestraints":2}, + enemyTagsMult: {handcuffer: 0.2, Unchained: 0.1}, + minLevel: 0, allFloors: true, shrine: ["Metal", "Cuffs", "AnkleCuffsBase", "HogtieLower"], + // Shackles playertags + weight: 2, + playerTags: {"ItemFeetFull":-2, "ItemFeetEmpty": 5}, + playerTagsMult: {Metal: 2}, + playerTagsMissing: {Metal: -5}, + playerTagsMissingMult: {Metal: 0.2}, + }, + {inventory: true, name: "SteelMuzzleGag", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.3, Asset: "MuzzleGag", Group: "ItemMouth", AssetGroup: "ItemMouth3", Color: "#999999", + Model: "GagMetalRiveted", + struggleBreak: true, + power: 3, weight: 2, escapeChance: {"Struggle": -0.3, "Cut": -0.25, "Remove": 10, "Pick": 5}, enemyTags: {"shackleGag":1}, playerTags: {"ItemMouthFull":1}, minLevel: 0, allFloors: true, shrine: ["FlatGags", "Metal", "Gags"]}, + + {inventory: true, name: "BlacksteelMuzzleGag", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.3, Asset: "MuzzleGag", Group: "ItemMouth", AssetGroup: "ItemMouth3", Color: "#999999", + Model: "GagMetalRivetedStrap", + struggleBreak: true, + Filters: { + Metal: {"gamma":0.6166666666666667,"saturation":1,"contrast":1.3,"brightness":2.4166666666666665,"red":1,"green":1,"blue":1,"alpha":1}, + Strap: {"gamma":0.6166666666666667,"saturation":1,"contrast":1.3,"brightness":2.4166666666666665,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Metal: {override: false, color: "DarkNeutral"}, + Rivets: {override: true, color: "LightNeutral"}, + }, + power: 8, weight: 2, escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 10, "Pick": 0.2}, + enemyTags: {"blacksteelRestraints":1}, playerTags: {"ItemMouthFull":1}, + minLevel: 7, allFloors: true, shrine: ["Blacksteel", "FlatGags", "Metal", "Gags"]}, + //endregion + + //region Invisible + {inventory: true, name: "InvisibleGag", gag: 0.5, Asset: "BallGag", Group: "ItemMouth", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], + AssetGroup: "ItemMouth3", Color: "#cccccc", power: 4, weight: 4, escapeChance: {"Struggle": -0.1, "Cut": 0.1, "Remove": 0.25, Pick: 0.2, Unlock: 0.7}, maxwill: 0.9, + Model: "GhostGag", + enemyTags: {"invisRestraints":4, invisGag: 10}, playerTags: {"ItemMouthFull":-3.8}, minLevel: 0, allFloors: true, shrine: ["Gags", "Invisible", "BallGags", "Illusion"]}, + + {inventory: true, trappable: true, name: "InvisibleBlindfold", Asset: "LeatherBlindfold", LinkableBy: [...KDBlindfoldLink], renderWhenLinked: [...KDBlindfoldLink], Color: "Default", Group: "ItemHead", + power: 3, weight: 2, + Model: "BlindfoldLeather", + events: [ + {trigger: "tick", type: "InvisibleGhosts"}, + ], + Filters: { + Blindfold: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.01}, + Rim: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.01}, + }, + maxwill: 1.0, escapeChance: {"Struggle": 0.4, "Cut": 0.6, "Remove": 0.3, "Pick": 0.4}, + enemyTags: {"invisRestraints":1, }, + playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Illusion", "Blindfolds"]}, + + {renderWhenLinked: [...KDArmbinderLink], inventory: true, trappable: true, name: "InvisibleArmbinder", debris: "Belts", + inaccessible: true, strictness: 0.1, Asset: "LeatherArmbinder", LinkableBy: [...KDArmbinderLink], + Type: "WrapStrap", Group: "ItemArms", Color: "Default", bindarms: true, bindhands: 1.0, power: 6, weight: 2, + Model: "SmoothArmbinder", + + Filters: { + Binder: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.01}, + }, + limitChance: {"Struggle": 0.15, "Cut": 0.1, "Unlock": 0.2}, + playerTagsMult: { + "More_Armbinders": 3.5, + "Less_Armbinders": 0.1, + }, + maxwill: 0.35, escapeChance: {"Struggle": 0.11, "Cut": 0.4, "Remove": 0.3, "Pick": 0.5}, enemyTags: {"invisRestraints":10, }, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Illusion", "Armbinders", "Block_ItemHands"]}, + + {renderWhenLinked: [...KDLegbinderRender], inventory: true, name: "InvisibleLegbinder", debris: "Belts", Asset: "LegBinder", inaccessible: true, + LinkableBy: [...KDLegbinderLink], Color: "Default", Group: "ItemLegs", blockfeet: true, + Model: "Legbinder", + Filters: { + Binder: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.01}, + Laces: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.01}, + }, + affinity: {Remove: ["Hook"], Struggle: ["Hook"],}, + struggleMaxSpeed: {Cut: 0.3, Remove: 0.1}, + maxwill: 0.1, + struggleMult: {Struggle: 0.4}, + power: 6, weight: 2, escapeChance: {"Struggle": .06, "Cut": 0.35, "Remove": 0.25, "Pick": 0.35}, enemyTags: {"invisRestraints":3, }, playerTags: {}, minLevel: 7, allFloors: true, + shrine: ["Illusion", "Legbinders"]}, + + //Endregion invisible + + //region Comfy + {inventory: true, name: "ComfyGag", gag: 0.5, Asset: "MuzzleGag", Group: "ItemMouth", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], AssetGroup: "ItemMouth3", Color: "#cccccc", power: 1, weight: 4, escapeChance: {"Struggle": 0.2, "Cut": 0.2, "Remove": 0.4, "Pick": 5}, maxwill: 0.9, + Model: "GagComfy", + sfxGroup: "Leather", + Filters: { + Fabric: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.5166666666666666}, + }, + enemyTags: {"comfyRestraints":1}, playerTags: {"ItemMouthFull":1}, minLevel: 0, allFloors: true, shrine: ["FlatGags", "Gags", "Illusion"]}, + {inventory: true, name: "ComfyStraitjacket", Asset: "HighSecurityStraitJacket", Modules: [0, 2, 1], Color: ['#cccccc', '#cccccc', '#cccccc'], Group: "ItemArms", power: 3, weight: 1, bindarms: true, bindhands: 0.9, + + sfxGroup: "Leather", + LinkableBy: [...KDJacketLink], + renderWhenLinked: [...KDJacketRender], + Model: "JacketHeavy", + Filters: { + Arms: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.44999999999999996}, + Chest: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.44999999999999996}, + Lower: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.44999999999999996}, + BeltsArms: {"gamma":1,"saturation":0.2,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.7166666666666667}, + BeltsChest: {"gamma":1,"saturation":0.2,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.7166666666666667}, + BeltsLower: {"gamma":1,"saturation":0.2,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0.7166666666666667}, + }, + playerTagsMult: { + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + limitChance: {"Struggle": 0.2, "Cut": 0.07, "Remove": 0.35, "Unlock": 0.75}, // Hard to escape the arms box by struggling + escapeChance: {"Struggle": 0.2, "Cut": 0.2, "Remove": 0.4, "Pick": 5}, enemyTags: {"comfyRestraints": 1}, playerTags: {}, minLevel: 0, maxwill: 0.35, + allFloors: true, shrine: ["Straitjackets", "Block_ItemHands", "Illusion"]}, + + //endregion + + {curse: "5Keys", name: "GhostCollar", Asset: "OrnateCollar", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],magic: true, Color: ["#555555", "#AAAAAA"], power: 20, weight: 0, difficultyBonus: 30, + Model: "WolfCollarRestraint", + Filters: { + Band: {"gamma":1,"saturation":0.0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Lining: {"gamma":1,"saturation":1,"contrast":1,"brightness":0.78333333333333334,"red":1,"green":1,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": -100, "Cut": -0.8, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: []}, + + {renderWhenLinked: [...KDBeltsRender], inventory: true, name: "SturdyLeatherBeltsArms", debris: "Belts", accessible: true, Asset: "SturdyLeatherBelts", LinkableBy: [...KDBeltsBind], Type: "Three", Color: "Default", Group: "ItemArms", bindarms: true, power: 2.5, weight: 0, + Model: "BeltsArmsAll", + addTag: ["HandsBehind"], + Filters: { + Belt: {"gamma":1,"saturation":1,"contrast":1,"brightness":3,"red":0.33,"green":0.33, "blue":0.33,"alpha":1}, + }, + factionFilters: { + Belt: { + color: "DarkNeutral", + override: false, + } + }, + escapeChance: {"Struggle": -0.1, "Cut": 0.5, "Remove": 0.22}, + maxwill: 0.9, enemyTags: {"leatherRestraints":6, "beltRestraints": 10, "noBelt": -100}, playerTags: {"ItemArmsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Leather", "Belts", "ArmBind", "HogtieUpper"]}, + {renderWhenLinked: [...KDBeltsRender], inventory: true, name: "SturdyLeatherBeltsFeet", debris: "Belts", accessible: true, Asset: "SturdyLeatherBelts", LinkableBy: [...KDBeltsBind], Type: "Three", Color: "Default", Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"] ,power: 2, weight: 0, + Model: "BeltsFeetAll", + Filters: { + Belt: {"gamma":1,"saturation":1,"contrast":1,"brightness":3,"red":0.33,"green":0.33, "blue":0.33,"alpha":1}, + }, + factionFilters: { + Belt: { + color: "DarkNeutral", + override: false, + } + }, + escapeChance: {"Struggle": -0.1, "Cut": 0.5, "Remove": 0.5}, + maxwill: 1.0, enemyTags: {"leatherRestraints":6, "beltRestraints": 10, "noBelt": -100}, playerTagsMissingMult: {"ItemLegsFull": 0.05}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Belts", "LegBind"]}, + {LinkableBy: [...KDBeltsBind], renderWhenLinked: [...KDBeltsRender], accessible: true, inventory: true, name: "SturdyLeatherBeltsLegs", debris: "Belts", Asset: "SturdyLeatherBelts", Type: "Two", Color: "Default", Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 2, weight: 0, + Model: "BeltsLegsAll", + Filters: { + Belt: {"gamma":1,"saturation":1,"contrast":1,"brightness":3,"red":0.33,"green":0.33, "blue":0.33,"alpha":1}, + }, + factionFilters: { + Belt: { + color: "DarkNeutral", + override: false, + } + }, + escapeChance: {"Struggle": -0.1, "Cut": 0.5, "Remove": 0.5}, + maxwill: 0.8, enemyTags: {"leatherRestraints":6, "beltRestraints": 10, "noBelt": -100}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Leather", "Belts", "LegBind", "HogtieLower"]}, + + + {renderWhenLinked: [...KDBeltsRender], inventory: true, name: "MagicBeltArms", debris: "Belts", accessible: true, Asset: "SturdyLeatherBelts", LinkableBy: [...KDBeltsBind], Type: "Three", Color: "Default", Group: "ItemArms", bindarms: true, power: 5, weight: 0, + Model: "BeltsArmsAll", + addTag: ["HandsBehind"], + magic: true, DefaultLock: "Purple", + + factionFilters: { + Belt: { + color: "Highlight", override: false, + } + }, + Filters: {"Belt":{"gamma":1,"saturation":0,"contrast":0.85,"brightness":2.966666666666667,"red":0.7000000000000001,"green":0.44999999999999996,"blue":0.9666666666666667,"alpha":1}}, + + escapeChance: {"Struggle": -0.12, "Cut": 0.5, "Remove": 0.22}, + maxwill: 0.9, enemyTags: {"leatherRestraintsMagic":6, "beltRestraintsMagic": 10}, playerTags: {"ItemArmsFull":-2}, minLevel: 0, allFloors: true, shrine: ["MagicBelts", "Belts", "Leather", "ArmBind", "HogtieUpper"]}, + {renderWhenLinked: [...KDBeltsRender], inventory: true, name: "MagicBeltFeet", debris: "Belts", accessible: true, Asset: "SturdyLeatherBelts", LinkableBy: [...KDBeltsBind], Type: "Three", Color: "Default", Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"] ,power: 5, weight: 0, + Model: "BeltsFeetAll", + magic: true, DefaultLock: "Purple", + factionFilters: { + Belt: { + color: "Highlight", override: false, + } + }, + Filters: {"Belt":{"gamma":1,"saturation":0,"contrast":0.85,"brightness":2.966666666666667,"red":0.7000000000000001,"green":0.44999999999999996,"blue":0.9666666666666667,"alpha":1}}, + + escapeChance: {"Struggle": -0.12, "Cut": 0.5, "Remove": 0.5}, + maxwill: 1.0, enemyTags: {"leatherRestraintsMagic":6, "beltRestraintsMagic": 10}, playerTagsMissingMult: {"ItemLegsFull": 0.05}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["MagicBelts", "Belts", "Leather", "LegBind", "HogtieLower"]}, + {LinkableBy: [...KDBeltsBind], renderWhenLinked: [...KDBeltsRender], accessible: true, inventory: true, name: "MagicBeltLegs", debris: "Belts", Asset: "SturdyLeatherBelts", Type: "Two", Color: "Default", Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 5, weight: 0, + Model: "BeltsLegsAll", + factionFilters: { + Belt: { + color: "Highlight", override: false, + } + }, + Filters: {"Belt":{"gamma":1,"saturation":0,"contrast":0.85,"brightness":2.966666666666667,"red":0.7000000000000001,"green":0.44999999999999996,"blue":0.9666666666666667,"alpha":1}}, + + magic: true, DefaultLock: "Purple", + escapeChance: {"Struggle": -0.12, "Cut": 0.5, "Remove": 0.5}, + maxwill: 0.8, enemyTags: {"leatherRestraintsMagic":6, "beltRestraintsMagic": 10}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["MagicBelts", "Belts", "Leather", "LegBind"]}, + + + {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "SteelArmCuffs", debris: "Chains", accessible: true, + Model: "ShacklesWrists", + Filters: { + BaseMetal: {"gamma":1,"saturation":1,"contrast":1.4833333333333334,"brightness":2.0166666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + }, + LinkAll: true, + Asset: "SteelCuffs", linkCategory: "Cuffs", linkSize: 0.55, Color: ['Default', 'Default'], Group: "ItemArms", bindarms: false, power: 4, weight: 0, + escapeChance: {"Struggle": -0.1, "Cut": -0.5, "Remove": 0.15, "Pick": 0.25}, enemyTags: {"steelCuffs":4, "handcuffer": 1}, playerTags: {"ItemArmsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Cuffs", "Metal", "ArmCuffsBase"], + maxwill: 0.9 + }, + + + // Magnetic cuffs + {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "MagneticArmCuffs", debris: "Chains", accessible: true, Asset: "SteelCuffs", linkCategory: "Cuffs", linkSize: 0.55, + Model: "ShacklesWrists", + struggleBreak: true, + Filters: { + BaseMetal: {"gamma":1,"saturation":1,"contrast":1.4833333333333334,"brightness":2.0166666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + }, + LinkAll: true, Color: ['#444444', '#444444'], Group: "ItemArms", bindarms: false, power: 5, weight: 0, + escapeChance: {"Struggle": -0.2, "Cut": -0.5, "Remove": 0.15, "Pick": 0.15}, enemyTags: {"magnetCuffs":10}, playerTags: {"ItemArmsFull":-4}, + minLevel: 0, allFloors: true, shrine: ["Cuffs", "Metal", "ArmCuffsBase", "Elements"], + maxwill: 0.9, events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "beforePlayerDamage", type: "linkItemOnDamageType", restraint: "WristLink", sfx: "LightJingle", damage: "electric", chance: 1.0, requiredTag: "locked"}, + {trigger: "beforePlayerDamage", type: "lockItemOnDamageType", restraint: "WristLink", sfx: "LightJingle", damage: "electric", chance: 1.0, lock: "Blue"}, + ]}, + + {inventory: true, nonbinding: true, name: "MagneticAnkleCuffs", Asset: "SteelAnkleCuffs", debris: "Chains", + LinkAll: true, Color: "#444444", + Model: "ShacklesAnkles", + Filters: { + BaseMetal: {"gamma":1.4166666666666665,"saturation":1,"contrast":1.4833333333333334,"brightness":2.0166666666666666,"red":1,"green":1.8833333333333333,"blue":1.9166666666666667,"alpha":1}, + }, + Group: "ItemFeet", power: 5, weight: 0, + linkCategory: "AnkleCuffs", linkSize: 0.51, noDupe: true, + escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": 0.1, "Pick": 0.15}, + enemyTags: {"magnetCuffs": 5}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Cuffs", "Metal", "AnkleCuffsBase", "HogtieLower", "Elements"], + maxwill: 0.8, events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "beforePlayerDamage", type: "linkItemOnDamageType", restraint: "AnkleLinkShort", sfx: "LightJingle", damage: "electric", chance: 1.0, requiredTag: "locked"}, + {trigger: "beforePlayerDamage", type: "lockItemOnDamageType", restraint: "AnkleLinkShort", sfx: "LightJingle", damage: "electric", chance: 1.0, lock: "Blue"}, + ]}, + + // End magnetic cuffs + + //region Maid + {inventory: true, name: "MaidJacket", debris: "Belts", Asset: "Bolero", Color: ["#191919", "#A3A3A3"], + Model: "JacketBolero", + Filters: { + Arms: {"gamma":1,"saturation":1,"contrast":1.0333333333333332,"brightness":3.05,"red":1,"green":1,"blue":1,"alpha":1}, + Chest: {"gamma":1,"saturation":1,"contrast":1.0333333333333332,"brightness":3.05,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":0.05,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsChest: {"gamma":1,"saturation":0.05,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7.5, weight: 0, strictness: 0.2, + LinkableBy: [...KDJacketLink], renderWhenLinked: [...KDJacketRender], + limitChance: {"Struggle": 0.12, "Cut": 0.03, "Remove": 0.1, "Unlock": 0.75}, // Hard to escape the arms box by struggling + escapeChance: {"Struggle": -0.175, "Cut": 0.1, "Remove": 0.15, "Pick": 0.15}, + maxwill: 0.3, enemyTags: {"maidRestraints":5, "maidRestraintsHeavy":14, "maidRestraintsNonChastity": 10, "noMaidJacket":-5}, playerTags: {}, + minLevel: 7, allFloors: true, shrine: ["Latex", "Straitjackets", "Block_ItemHands", "Illusion"]}, + + {inventory: true, name: "MaidTransportJacket", debris: "Belts", Asset: "Bolero", Color: ["#191919", "#A3A3A3"], + Model: "JacketHeavyBolero", + Filters: { + Arms: {"gamma":1,"saturation":1,"contrast":1.0333333333333332,"brightness":3.05,"red":1,"green":1,"blue":1,"alpha":1}, + Chest: {"gamma":1,"saturation":1,"contrast":1.0333333333333332,"brightness":3.05,"red":1,"green":1,"blue":1,"alpha":1}, + Lower: {"gamma":1,"saturation":1,"contrast":1.0333333333333332,"brightness":3.05,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":0.05,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsChest: {"gamma":1,"saturation":0.05,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsLower: {"gamma":1,"saturation":0.05,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 10, weight: 0, strictness: 0.3, + LinkableBy: [...KDTransportLink], renderWhenLinked: [...KDJacketRender], + limitChance: {"Struggle": 0.08, "Cut": 0.02, "Remove": 0.05, "Unlock": 0.5}, // Hard to escape the arms box by struggling + escapeChance: {"Struggle": -0.375, "Cut": -0.1, "Remove": -0.15, "Pick": 0.10}, + + maxwill: 0.1, enemyTags: {"maidRestraintsHeavy":1, "noMaidJacket":-5, transportJacket: 1}, playerTags: {"MaidJacketWorn":10}, + minLevel: 12, allFloors: true, shrine: ["Latex", "Straitjackets", "Block_ItemHands", "Illusion", "TransportJackets"]}, + + {inventory: true, name: "MaidDress", debris: "Fabric", inaccessible: true, Type: "Strap", Asset: "LeatherArmbinder", strictness: 0.25, Color: ['#191919'], + Model: "Jacket", + events: [ + {type: "FactionStealth", trigger: 'calcSneak', kind: "Maidforce", mult: 0.8, power: 2,}, + ], + Filters: { + Arms: {"gamma":1,"saturation":1,"contrast":1.0333333333333332,"brightness":3.05,"red":1,"green":1,"blue":1,"alpha":1}, + Chest: {"gamma":1,"saturation":1,"contrast":1.0333333333333332,"brightness":3.05,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":0.05,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsChest: {"gamma":1,"saturation":0.05,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, + forceOutfit: "Lingerie", + forceOutfitPriority: 1, + Group: "ItemArms", LinkableBy: [...KDDressLink], alwaysRender: true, bindarms: true, bindhands: 1.0, power: 8.5, weight: 0, + escapeChance: {"Struggle": -0.175, "Cut": 0.1, "Remove": -0.2, "Pick": 0.15}, + helpChance: {"Remove": 0.075}, + limitChance: {"Struggle": 0.12, "Cut": 0.03, "Remove": 0.1, "Unlock": 0.75}, // Hard to escape the arms box by struggling + alwaysDress: [ + {Item: "SleevelessCatsuit", Group: "Suit", Color: "#aaaaaa", override: true}, + {Item: "MaidApron2", Group: "Cloth", Color: "Default", override: true}, + {Item: "FullLatexBra2", Group: "Bra", Color: ["#333333", "#aaaaaa"], override: true}, + {Item: "Pantyhose2", Group: "SuitLower", Color: "#939393", override: true}, + {Item: "LaceBands", Group: "Bracelet", Color: ['Default', '#151515'], override: true}, + {Item: "MageSkirt", Group: "ClothLower", Color: ["#676767", "#2E2E2E"], override: true}, + {Item: "Corset4", Group: "Corset", Color: "#4B4B4B", override: true}, + {Item: "Band1", Group: "Hat", Color: "#767676", override: true}, + {Item: "Shoes5", Group: "Shoes", Color: "#575757", override: true}, + {Item: "Socks6", Group: "Socks", Color: ['#080808', 'Default'], override: true} + ], + alwaysDressModel: [ + {"Model":"MaidShoes","Group":"MaidShoes","override":true, + "Filters":{ + "ShoeLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}, + "ShoeRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}}, + "factionFilters": + { + ShoeLeft: {color: "DarkNeutral", override: true}, + ShoeRight: {color: "DarkNeutral", override: true}, + }, + "inheritFilters":false},{"Model":"LaceBra","Group":"LaceBra","override":true,"Filters": + { + "BraBase":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + "BraCups":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + "BraStripes":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1} + },"factionFilters": + { + BraBase: {color: "DarkNeutral", override: true}, + BraCups: {color: "DarkNeutral", override: true}, + BraStripes: {color: "LightNeutral", override: true}, + }, + "inheritFilters":false},{"Model":"LacePanties","Group":"LacePanties","override":true,"Filters": + { + "LaceCrotchPanel":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + "Panties":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + "Trim":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + "Lace":{"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1} + }, "factionFilters": + + { + LaceCrotchPanel: {color: "LightNeutral", override: true}, + Panties: {color: "DarkNeutral", override: true}, + Trim: {color: "LightNeutral", override: true}, + Lace: {color: "LightNeutral", override: true}, + }, + "inheritFilters":false},{"Model":"BunnySocks","Group":"BunnySocks","override":true,"Filters": + { + "SockRight":{"gamma":1.2,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.0980392156862746,"alpha":1}, + "SockLeft":{"gamma":1.2,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.0980392156862746,"alpha":1} + },"factionFilters": + + { + SockRight: {color: "LightNeutral", override: true}, + SockLeft: {color: "LightNeutral", override: true}, + }, + "inheritFilters":false},{"Model":"LeatherGloves","Group":"LeatherGloves","override":true,"Filters": + { + "GloveLeft":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}, + "BandRight":{"gamma":1,"saturation":0,"contrast":0.9833333333333333,"brightness":0.5,"red":1.05,"green":1,"blue":1,"alpha":1}, + "GloveRight":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":0}, + "RimRight":{"gamma":2,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + "RimLeft":{"gamma":2,"saturation":0,"contrast":1,"brightness":1.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + "BandLeft":{"gamma":1,"saturation":0,"contrast":0.9833333333333333,"brightness":0.5,"red":1.05,"green":1,"blue":1,"alpha":1} + },"factionFilters": + + { + GloveLeft: {color: "DarkNeutral", override: true}, + GloveRight: {color: "DarkNeutral", override: true}, + RimRight: {color: "LightNeutral", override: true}, + RimLeft: {color: "LightNeutral", override: true}, + BandRight: {color: "Highlight", override: true}, + BandLeft: {color: "Highlight", override: true}, + }, + "inheritFilters":false},{"Model":"BowCorsetLongOverbust","Group":"BowCorsetLongOverbust","override":true,"Filters": + { + "CorsetBust":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1}, + "RuffleBust":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1}, + "Corset":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1.2,"red":1,"green":1,"blue":1.1,"alpha":1}, + "Ruffle":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1.2,"red":1,"green":1,"blue":1.1,"alpha":1} + },"factionFilters": + + { + CorsetBust: {color: "LightNeutral", override: true}, + RuffleBust: {color: "Highlight", override: true}, + Corset: {color: "Highlight", override: true}, + Ruffle: {color: "Highlight", override: true}, + }, + "inheritFilters":false},{"Model":"DressBlouseBustCropped","Group":"DressBlouseBust","override":true,"Filters": + { + "Neck":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}, + "Collar":{"gamma":1.9,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1}, + "Blouse":{"gamma":1.9,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1} + },"factionFilters": + + { + Blouse: {color: "DarkNeutral", override: true}, + Collar: {color: "LightNeutral", override: true}, + Neck: {color: "DarkNeutral", override: true}, + }, + "inheritFilters":false},{"Model":"BlouseSkirt","Group":"DressBlouseBust","override":true,"Filters": + { + "BlouseSkirt":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}, + },"factionFilters": + + { + BlouseSkirt: {color: "DarkNeutral", override: true}, + }, + "inheritFilters":false},{"Model":"WitchBlouse","Group":"WitchBlouse","override":true,"Filters": + { + "BlouseLeft":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}, + "BlouseRight":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}, + "BlouseLiner":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1}, + "Blouse":{"gamma":1,"saturation":0,"contrast":1,"brightness":0.18333333333333335,"red":1.2,"green":1,"blue":1,"alpha":1} + },"factionFilters": + + { + BlouseLeft: {color: "DarkNeutral", override: true}, + BlouseLiner: {color: "DarkNeutral", override: true}, + Blouse: {color: "DarkNeutral", override: true}, + BlouseRight: {color: "DarkNeutral", override: true}, + }, + "inheritFilters":false},{"Model":"BowCorsetBow","Group":"BowCorsetBow","override":true,"Filters": + {"Bow":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1.1,"alpha":1}},"factionFilters": + {Bow: {color: "Highlight", override: true},}, + "inheritFilters":false},{"Model":"Ribbon","Group":"Ribbon","override":true,"Filters": + { + "RibbonBelt":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1.5666666666666669,"red":1,"green":1,"blue":1.1,"alpha":1}, + "RibbonBack":{"gamma":1.9,"saturation":0,"contrast":1,"brightness":1.5666666666666669,"red":1,"green":1,"blue":1.1,"alpha":1} + },"factionFilters": + { + RibbonBelt: {color: "Highlight", override: true}, + RibbonBack: {color: "Highlight", override: true}, + }, + "inheritFilters":false}], + maxwill: 0.3, enemyTags: {"maidRestraints":3, "maidRestraintsHeavy":14, "maidRestraintsNonChastity": 5}, + playerTagsMult: {"ItemArmsEmpty": 0.05}, playerTags: {}, minLevel: 7, allFloors: true, + addPose: ["PreferWristtie"], + shrine: ["BindingDress", "Rope", "HandsBehind", "Block_ItemHands", "Illusion"]}, + {inventory: true, name: "MaidBelt", debris: "Belts", Asset: "LeatherBelt", Color: "#DBDBDB", Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 9, weight: 0, + LinkableBy: [...KDBeltsBind], renderWhenLinked: [...KDBeltsRender], + accessible: true, + Model: "BeltsLegs1", + Filters: { + Belt: {"gamma":1,"saturation":0,"contrast":0.9666666666666667,"brightness":4.016666666666667,"red":1,"green":1,"blue":1.1,"alpha":1}, + }, + escapeChance: {"Struggle": -0.5, "Cut": 0.05, "Remove": 0.1, "Pick": 0.25}, + maxwill: 1.0, enemyTags: {"maidRestraints":10, "maidRestraintsNonChastity": 10, "maidRestraintsLight":1}, playerTags: {"ItemLegsFull":-2}, minLevel: 3, allFloors: true, shrine: ["Leather", "Belts"]}, + {inventory: true, name: "MaidAnkleCuffs", debris: "Chains", Asset: "SteelAnkleCuffs", LinkableBy: [...KDBindable, ...KDDevices], Type: "Chained", Color: "Default", Group: "ItemFeet", + alwaysDressModel: [ + {Model: "AnkleLink", inheritFilters: true} + ], + Model: "ShacklesAnkles", + Filters: { + BaseMetal: {"gamma":1,"saturation":1,"contrast":1,"brightness":1.9500000000000002,"red":1,"green":1,"blue":1,"alpha":1}, + }, + hobble: 1, power: 9, weight: 0, + linkCategory: "AnkleCuffs", linkSize: 0.4, noDupe: true, + escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": 0.1, "Pick": 0.15}, + enemyTags: {"maidRestraints":7, "maidRestraintsNonChastity": 10, "steelCuffs": 5}, playerTags: {"ItemFeetFull":-2}, minLevel: 4, allFloors: true, shrine: ["Cuffs", "Metal", "AnkleCuffsBase", "HogtieLower", "Illusion"], + maxwill: 0.8,}, + {inventory: true, name: "MaidCollar", debris: "Belts", Asset: "HighCollar", Color: ["#C9C9C9", "#FFFFFF"], Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDHighCollarRender],power: 11, weight: 0, + Model: "LeatherCollarBow", + struggleBreak: true, + Filters: { + Cuff: {"gamma":2.2333333333333334,"saturation":1,"contrast":1.0833333333333335,"brightness":2.283333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + Band: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": -0.3, "Cut": -0.25, "Remove": 0.4, "Pick": -0.1}, + unlimited: true, + linkCategory: "BasicCollar", linkSize: 0.51, + maxwill: 0.25, enemyTags: {"maidRestraints":3, "maidRestraintsNonChastity": 10, "maidCollar":1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["HighCollars", "Collars", "Illusion"]}, + {inventory: true, name: "MaidGag", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.75, + Model: "MaidGag", + Filters: { + Straps: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Panel: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Asset: "MuzzleGag", Color: "Default", Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 8, weight: 0, + limitChance: {"Struggle": 0.12}, + escapeChance: {"Struggle": -0.18, "Cut": 0.05, "Remove": 0.33, "Pick": 0.15}, + maxwill: 0.75, enemyTags: {"maidRestraints":7, "maidRestraintsNonChastity": 10, }, playerTags: {}, minLevel: 4, allFloors: true, shrine: ["FlatGags", "Leather", "Gags", "Illusion"]}, + {inventory: true, name: "MaidMuzzle", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.75, + inaccessible: true, + Model: "PlugMuzzleGag", + Asset: "MuzzleGag", Color: "Default", Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 9, weight: 0, + limitChance: {"Struggle": 0.18}, + escapeChance: {"Struggle": -0.18, "Cut": -0.03, "Remove": 0.5, "Pick": -0.1}, DefaultLock: "Disc", + maxwill: 0.5, enemyTags: {"maidRestraints":4, "maidRestraintsHeavy":14, "maidRestraintsNonChastity": 6, }, playerTags: {"ItemMouthEmpty": -30}, minLevel: 7, allFloors: true, shrine: ["FlatGags", "Leather", "Gags", "Illusion"]}, + + {inventory: true, name: "DusterGag", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 1.0, + Model: "DusterGag", + Filters: { + Straps: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Panel: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, + events: [ + {trigger: "playerAttack", type: "ElementalEffect", power: 0.5, distract: 3.0, damage: "tickle", sfx: "Tickle"}, + {trigger: "playerAttack", type: "DestroyDirt", power: 5, damage: "plush"}, + {trigger: "playerAttack", type: "DestroyMold", power: 2, damage: "plush"}, + ], + value: 100, + Asset: "MuzzleGag", Color: "Default", Group: "ItemMouth", AssetGroup: "ItemMouth2", power: 8, weight: 0, DefaultLock: "Blue", + limitChance: {"Struggle": 0.15}, + escapeChance: {"Struggle": -0.18, "Cut": 0.05, "Remove": 0.33, "Pick": 0.1}, + good: true, alwaysKeep: true, showInQuickInv: true, + maxwill: 0, enemyTags: {}, playerTags: {"dustergag": 100}, minLevel: 0, allFloors: true, shrine: ["FlatGags", "Gags"]}, + // Maid chastity. + {inventory: true, arousalMode: true, name: "MaidCBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "Default", Group: "ItemPelvis", chastity: true, power: 9, weight: 0, + Security: { + level_key: 3, + }, + Model: "HeartBelt", + LinkableBy: ["Wrapping", "Ornate"], + factionFilters: { + Lining: {color: "Highlight", override: true}, + Lock: {color: "Highlight", override: true}, + }, + Filters: { + Lock: {"gamma":1,"saturation":0,"contrast":2.183333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Lining: {"gamma":1,"saturation":0.05,"contrast":0.6333333333333334,"brightness":0.23333333333333334,"red":1,"green":1,"blue":1,"alpha":1}, + Steel: {"gamma":1,"saturation":0.6333333333333334,"contrast":0.9833333333333333,"brightness":1.4166666666666665,"red":1,"green":1,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": 0.5, "Pick": 0.12}, + maxwill: 0.75, enemyTags: {"maidVibeRestraints": 200, "maidVibeRestraintsLimited": 100, "maidChastityBelt": 200}, playerTags: {"ItemVulvaEmpty" : -50, "ItemVulvaPiercingsEmpty" : -50}, minLevel: 0, allFloors: true, shrine: ["Chastity", "Metal", "ChastityBelts", "Illusion"]}, + + //endregion + + //region Dragon + {inventory: true, name: "DragonArmbinder", debris: "Belts", inaccessible: true, Asset: "BoxTieArmbinder", strictness: 0.08, + LinkableBy: [...KDBoxbinderLink], renderWhenLinked: [...KDBoxbinderLink], + Color: ["#9B1818", "#ffffff"], Group: "ItemArms", bindarms: true, bindhands: 1.0, power: 7, weight: 0, + Model: "Jacket", + Filters: { + BeltsArms: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.1333333333333333,"green":1,"blue":1,"alpha":1}, + BeltsChest: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.1333333333333333,"green":1,"blue":1,"alpha":1}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Armbinders": 3.5, + "Less_Armbinders": 0.1, + }, + escapeChance: {"Struggle": 0.0, "Cut": -0.05, "Remove": 0.1, "Pick": 0.25}, // Hard to escape the arms box by struggling + limitChance: {"Struggle": 0.1, "Remove": 0.1, "Pick": 0.05, "Unlock": 0.5}, + maxwill: 0.25, enemyTags: {"dragonRestraints" : 2}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Leather", "Boxbinders", "Block_ItemHands"]}, + {inventory: true, name: "DragonStraps", debris: "Belts", Asset: "ThinLeatherStraps", LinkableBy: ["Boxbinders"], Color: "#9B1818", Group: "ItemArms", bindarms: true, power: 8, weight: 0, + Model: "JacketStraps", + addPose: ["HandsBehind"], + accessible: true, + Filters: { + BeltsArms: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.1333333333333333,"green":1,"blue":1,"alpha":1}, + BeltsChest: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.1333333333333333,"green":1,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": -0.175, "Cut": -0.05, "Remove": 0.1, "Pick": 0.25}, + maxwill: 0.7, enemyTags: {"dragonRestraints":6}, playerTags: {"ItemArmsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Leather", "Belts"]}, + {inventory: true, name: "DragonStrongStraps", debris: "Belts", Asset: "ThinLeatherStraps", LinkableBy: ["Boxbinders"], Color: "#9B1818", Group: "ItemArms", bindarms: true, power: 10, weight: 0, + Model: "JacketHeavyStraps", + addPose: ["HandsBehind"], + accessible: true, + Filters: { + BeltsArms: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.1333333333333333,"green":1,"blue":1,"alpha":1}, + BeltsChest: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.1333333333333333,"green":1,"blue":1,"alpha":1}, + BeltsLower: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":2.1333333333333333,"green":1,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": -0.375, "Cut": -0.25, "Remove": -0.1, "Pick": 0}, + limitChance: {"Struggle": 0.25, "Cut": 0.14, "Remove": 0.12}, + maxwill: 0.3, enemyTags: {"dragonRestraints":1}, playerTags: {"ItemArmsFull":2}, minLevel: 12, allFloors: true, shrine: ["Boxbinders", "Leather", "Belts"]}, + {inventory: true, name: "DragonBoots", debris: "Belts", Asset: "BalletWedges", Color: "#424242", Group: "ItemBoots", heelpower: 1, power: 7, weight: 0, remove: ["Shoes"], + Model: "BalletHeelsRestraint", + Filters: { + Laces: {"gamma":1,"saturation":1,"contrast":1.7999999999999998,"brightness":1.0833333333333335,"red":1.0333333333333332,"green":1,"blue":1,"alpha":1}, + Sole: {"gamma":1,"saturation":1,"contrast":1,"brightness":1.7166666666666666,"red":1,"green":1,"blue":1,"alpha":1}, + Shoe: {"gamma":1,"saturation":0.08333333333333333,"contrast":1,"brightness":0.55,"red":2.816666666666667,"green":1,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": 0.025, "Cut": -0.05, "Remove": 0.1, "Pick": 0.25}, + enemyTags: {"dragonRestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 2, allFloors: true, shrine: ["Heels", "Leather", "Boots"]}, + {inventory: true, name: "DragonBallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], gag: 0.65, Asset: "FuturisticHarnessBallGag", + Model: "BallGagHarnessSecure", + Filters: { + Strap: {"gamma":1,"saturation":1,"contrast":1.9500000000000002,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Harness: {"gamma":1,"saturation":1,"contrast":1.9500000000000002,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Ball: {"gamma":0.5166666666666666,"saturation":0.7166666666666667,"contrast":1.9333333333333333,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, + events: [ + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.35, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.25, requiredTag: "Blindfolds"}, + ], + ApplyVariants: { + "AntiMagic": { + weightMod: -10, + weightMult: 0.3, + enemyTags: {forceAntiMagic: 100, antiMagic: 16, ballGagRestraintsMagic: 10}, + playerTagsMult: {"ItemMouthFull": 0.1}, + }, + }, + strictness: 0.3, Color: ['#680000', '#680000', '#680000', '#680000', '#680000'], Group: "ItemMouth", power: 7, weight: 0, + escapeChance: {"Struggle": -0.5, "Cut": -0.05, "Remove": 0.1, "Pick": 0.25}, + maxwill: 0.6, enemyTags: {"dragonRestraints":6, forceAntiMagic: -100}, playerTags: {"ItemFeetFull":-2}, minLevel: 7, allFloors: true, shrine: ["BallGags", "Leather", "Latex" , "Gags"]}, + {inventory: true, name: "DragonMuzzleGag", debris: "Belts", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], gag: 0.3, Asset: "StitchedMuzzleGag", Color: "#9B1818", Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 7, weight: -6, + Model: "ShinyLatexMuzzle", + Filters: { + Gag: {"gamma":1,"saturation":1,"contrast":1.4166666666666665,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Rim: {"gamma":0.6166666666666667,"saturation":1.0166666666666666,"contrast":0.3333333333333333,"brightness":1.7999999999999998,"red":0.8666666666666667,"green":0.23333333333333334,"blue":0.43333333333333335,"alpha":1}, + }, + factionFilters: { + Gag: {color: "DarkNeutral", override: false}, + Rim: {color: "Highlight", override: true}, + }, + escapeChance: {"Struggle": 0.05, "Cut": 0.0, "Remove": 0.1}, + maxwill: 0.75, enemyTags: {"dragonRestraints":6}, playerTags: {"ItemMouthFull":4, "ItemMouth2Full":4}, minLevel: 0, allFloors: true, shrine: ["FlatGags", "Leather", "Gags"]}, + {inventory: true, name: "DragonCollar", debris: "Belts", Asset: "LatexCollar2", Color: "#9B1818", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: 4, + Model: "StardustCollar", + Filters: { + Collar: {"gamma":0.5666666666666667,"saturation":0.06666666666666667,"contrast":2.633333333333333,"brightness":1,"red":3.05,"green":1,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": -0.2, "Cut": -0.1, "Remove": 0.1}, + unlimited: true, + tightType: "Secure", + maxwill: 0.25, enemyTags: {"dragonRestraints":6, "dragonCollar": 4}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["Collars"]}, + //endregion + + //region ShadowLatex + + {removePrison: true, name: "ShadowBallSuit", Asset: "VacCube", Color: ["#88aaff"], Group: "ItemDevices", power: 8, weight: 1, alwaysStruggleable: true, + Model: "BallSuit", LinkableBy: ["Container"],renderWhenLinked: ["Container"], + bindarms: true, + restriction: 30, + tightType: "Thick", + addTag: ["ForceKneel", "NoHogtie"], + failSuffix: {Remove: "Bubble", Struggle: "Bubble", Cut: "Bubble"}, + escapeChance: {"Struggle": -0.4, "Cut": -0.5, "Remove": -10}, + helpChance: {"Struggle": -0.3, "Cut": -0.1, "Remove": -10}, + affinity: { + Struggle: ["Sharp"], + Remove: ["Sharp"], + }, + Filters: {"BallSuit":{"gamma":0.5,"saturation":1.2166666666666668,"contrast":0.7166666666666667,"brightness":1.0833333333333335,"red":0.6333333333333334,"green":0.16666666666666666,"blue":0.65,"alpha":0.9333333333333333}}, + events: [ + //{trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, + {trigger: "beforePlayerDamage", type: "bounce", chance: 0.4, sfx: "RubberBolt", inheritLinked: true}, + {trigger: "playerMove", type: "tipBallsuit", inheritLinked: true}, + {trigger: "tick", type: "shadowDrain", power: -0.1, inheritLinked: true}, + ], + enemyTags: {"shadowBall":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "ShadowLatex", "Latex", "BallSuit", "ShadowEncase"], removeOnLeash: true, + }, + + {inventory: true, name: "ShadowLatexPetsuit", inaccessible: true, debris: "Slime", Color: "Default", Group: "ItemArms", + Model: "LatexPetsuitGlow", + bindarms: true, bindhands: 1.0, addTag: ["ForceKneel"], power: 9, weight: 0, + hobble: 2, + Filters: { + Arms: {"gamma":1.3333333333333333,"saturation":0,"contrast":1.45,"brightness":1,"red":0.6078431372549019,"green":0.6078431372549019,"blue":1.196078431372549,"alpha":1}, + Legs: {"gamma":1.3333333333333333,"saturation":0,"contrast":1.45,"brightness":1,"red":0.6078431372549019,"green":0.6078431372549019,"blue":1.196078431372549,"alpha":1}, + Glow: {"gamma":1.3333333333333333,"saturation":0,"contrast":1.45,"brightness":1,"red":0.6078431372549019,"green":0.6078431372549019,"blue":1.196078431372549,"alpha":.25}, + GlowTorso: {"gamma":1.3333333333333333,"saturation":0,"contrast":1.45,"brightness":1,"red":0.6078431372549019,"green":0.6078431372549019,"blue":1.196078431372549,"alpha":.04}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + }, + alwaysDressModel: [ + { + Model: "TransparentCatsuit", + Filters: { + TorsoUpper: {"gamma":1.3333333333333333,"saturation":0,"contrast":1.45,"brightness":1,"red":0.6078431372549019,"green":0.6078431372549019,"blue":1.196078431372549,"alpha":1}, + TorsoLower: {"gamma":1.3333333333333333,"saturation":0,"contrast":1.45,"brightness":1,"red":0.6078431372549019,"green":0.6078431372549019,"blue":1.196078431372549,"alpha":1}, + }, + }, + ], + remove: ["Bras", "Panties", "Skirts", "Socks", "Shirts", "Boots"], + escapeChance: {"Struggle": -0.45, "Cut": -0.05, "Remove": -0.35, "Pick": 0.15}, + helpChance: {"Remove": 0.1}, maxwill: 0.15, enemyTags: {"shadowLatexPetsuit": 3}, + playerTags: {"NoPet": -1000}, minLevel: 9, allFloors: true, shrine: ["ShadowLatex", "Petsuits", "Latex", "Illusion", "HinderFeet"]}, + + + {inventory: true, name: "ShadowLatexGagCollar", debris: "Belts", inaccessible: true, Asset: "LatexPostureCollar", gag: 0.4, Color: "#4E7DFF", + Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDHighCollarRender],factionColor: [[0]], power: 9, weight: -2, + strictness: 0.05, escapeChance: {"Struggle": -0.15, "Cut": -0.05, "Remove": 0.1, "Pick": 0.2}, + Model: "LatexNeckCorsetGagRestraint", + factionFilters: { + Rim: {color: "Highlight", override: true}, + }, + Filters: { + Neck: {"gamma":1,"saturation":0,"contrast":1.0666666666666667,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + Latex: {"gamma":1,"saturation":0,"contrast":1.0666666666666667,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + Rim: {"gamma":1,"saturation":0,"contrast":1.0666666666666667,"brightness":0.9166666666666666,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + }, + maxwill: 0.25, enemyTags: {"shadowLatexGag" : 3, "shadowLatexRestraints": 7}, playerTags: {"ItemMouthFull": 2, "ItemMouth2Full": 2, "ItemMouth3Full": 2}, + minLevel: 3, allFloors: true, shrine: ["ShadowLatex", "Latex", "Posture", "HighCollars", "Collars"]}, + + {inventory: true, sfx: "Fwoosh", name: "ShadowLatexHeels", inaccessible: true, Asset: "FuturisticHeels2", remove: ["Shoes"], + Model: "BalletHeelsRestraint", + Filters: { + Sole: {"gamma":1.25,"saturation":1,"contrast":1.5333333333333332,"brightness":1,"red":1,"green":1,"blue":2.8666666666666667,"alpha":1}, + Shoe: {"gamma":1.6,"saturation":0.3833333333333333,"contrast":1.6833333333333333,"brightness":0.43333333333333335,"red":1,"green":1,"blue":1.1166666666666667,"alpha":1}, + }, + + Color: ["#222222", "#4e2a70", "#ffffff", "Default", "#b927a8", "#222222", "#000000"], + Group: "ItemBoots", heelpower: 1, power: 8, weight: 0, + escapeChance: {"Struggle": -0.3, "Cut": -0.05, "Remove": 0.15, "Pick": 0.24}, + limitChance: {"Struggle": 0.25, "Cut": 0.14, "Remove": 0.12}, // Hard to escape the arms box by struggling + maxwill: 0.8, enemyTags: {"shadowLatexRestraints" : 10}, + playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Heels", "Latex", "Boots", "ShadowLatex", "Obsidian", ]}, + {inventory: true, sfx: "Fwoosh", name: "ShadowLatexStraitjacket", inaccessible: true, remove: ["Bra", "Tops"], Asset: "StraitLeotard", Modules: [1, 1, 1, 1], Color: ["#4e2a70", "#4e2a70", "#4e2a70"], Group: "ItemArms", + + LinkableBy: [...KDJacketLink], + renderWhenLinked: [...KDJacketRender], + Model: "JacketLeotard", + Filters: { + BeltsChest: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Chest: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + Arms: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + LatexLower: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + LatexUpper: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + }, + bindarms: true, bindhands: 1.0, power: 9, weight: 0, strictness: 0.2, + escapeChance: {"Struggle": -0.3, "Cut": -0.05, "Remove": 0.1, "Pick": 0.2}, + limitChance: {"Struggle": 0.25, "Cut": 0.14, "Remove": 0.08, "Unlock": 0.75}, // Hard to escape the arms box by struggling + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + maxwill: 0.25, enemyTags: {"shadowLatexRestraintsHeavy" : 3}, playerTags: {"posLatex": -1}, minLevel: 7, allFloors: true, + shrine: ["Latex", "ShadowLatex", "Obsidian", "Straitjackets", "Block_ItemHands"]}, + + {inventory: true, sfx: "Fwoosh", name: "ShadowLatexStrongJacket", inaccessible: true, remove: ["Bra", "Tops"], Asset: "StraitLeotard", Modules: [1, 1, 1, 1], Color: ["#4e2a70", "#4e2a70", "#4e2a70"], Group: "ItemArms", + events: [ + {trigger: "tick", type: "shadowDrain", power: -0.1, inheritLinked: true}, + ], + LinkableBy: [...KDJacketLink], + renderWhenLinked: [...KDJacketRender], + Model: "JacketExtraLeotard", + Filters: { + BeltsChest: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsLower: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Chest: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + Arms: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + Lower: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + LatexLower: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + LatexUpper: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + bindarms: true, bindhands: 1.33, power: 11, weight: 0, strictness: 0.4, DefaultLock: "Purple", + escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": -0.1, "Pick": -0.1}, + limitChance: {"Struggle": 0.15, "Cut": 0.05, "Remove": 0.04, "Unlock": 0.5}, // Hard to escape the arms box by struggling + maxwill: 0.25, enemyTags: {"shadowLatexRestraintsHeavy" : -5}, playerTags: {"posLatex": -1, "ShadowLatexStraitjacketWorn": 10}, minLevel: 12, allFloors: true, + shrine: ["Latex", "ShadowLatex", "Obsidian", "Straitjackets", "Block_ItemHands", "TransportJackets"]}, + + {inventory: true, sfx: "Fwoosh", name: "ShadowLatexArmbinder", inaccessible: true, Asset: "SeamlessLatexArmbinder", + + Model: "JacketLeotard", + Filters: { + BeltsChest: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Chest: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + Arms: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + LatexLower: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + LatexUpper: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + }, + strictness: 0.2, LinkableBy: [...KDArmbinderLink], Color: ["#4e2a70"], Group: "ItemArms", + renderWhenLinked: [...KDArmbinderLink], + bindarms: true, bindhands: 1.0, power: 9, weight: 0, + escapeChance: {"Struggle": -0.3, "Cut": -0.05, "Remove": 0.1, "Pick": 0.2}, + limitChance: {"Struggle": 0.2, "Cut": 0.1, "Remove": 0.85, "Unlock": 0.2}, + + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Armbinders": 3.5, + "Less_Armbinders": 0.1, + }, + maxwill: 0.35, enemyTags: {"shadowLatexRestraints" : 5, "shadowLatexRestraintsForced" : 15}, playerTags: {"posLatex": -1}, minLevel: 0, allFloors: true, + shrine: ["Latex", "ShadowLatex", "Obsidian", "Armbinders", "Block_ItemHands"]}, + + {inventory: true, sfx: "Fwoosh", name: "ShadowLatexStrongArmbinder", inaccessible: true, remove: ["Bra", "Tops"], Asset: "StraitLeotard", Modules: [1, 1, 1, 1], Color: ["#4e2a70", "#4e2a70", "#4e2a70"], Group: "ItemArms", + events: [ + {trigger: "tick", type: "shadowDrain", power: -0.1, inheritLinked: true}, + ], + LinkableBy: [...KDDressLink], + renderWhenLinked: [...KDArmbinderLink], + Model: "JacketExtraLeotard", + Filters: { + BeltsChest: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsLower: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Chest: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + Arms: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + Lower: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + LatexLower: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + LatexUpper: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + bindarms: true, bindhands: 1.33, power: 11, weight: 0, strictness: 0.4, DefaultLock: "Purple", + escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": -0.1, "Pick": -0.1}, + limitChance: {"Struggle": 0.15, "Cut": 0.05, "Remove": 0.5, "Unlock": 0.05}, // Hard to escape the arms box by struggling + maxwill: 0.25, enemyTags: {"shadowLatexRestraintsHeavy" : -5}, playerTags: {"posLatex": -1, "ShadowLatexArmbinderWorn": 10}, minLevel: 12, allFloors: true, + shrine: ["Latex", "ShadowLatex", "Obsidian", "Armbinders", "Block_ItemHands"]}, + + {inventory: true, sfx: "Fwoosh", name: "ShadowLatexBoxbinder", inaccessible: true, Asset: "BoxTieArmbinder", + Model: "JacketLeotard", + Filters: { + BeltsChest: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Chest: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + Arms: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + LatexLower: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + LatexUpper: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Boxbinders": 3.5, + "Less_Boxbinders": 0.1, + }, + strictness: 0.2, LinkableBy: [...KDBoxbinderLink], Color: ["#4e2a70"], Group: "ItemArms", + bindarms: true, bindhands: 1.0, power: 9, weight: 0, + escapeChance: {"Struggle": -0.3, "Cut": -0.05, "Remove": 0.1, "Pick": 0.2}, + limitChance: {"Struggle": 0.2, "Cut": 0.1, "Remove": 0.85, "Unlock": 0.2}, + maxwill: 0.35, enemyTags: {"shadowLatexRestraints" : 5, "shadowLatexRestraintsForced" : 15}, playerTags: {"posLatex": -1}, minLevel: 0, allFloors: true, + shrine: ["Latex", "ShadowLatex", "Obsidian", "Boxbinders", "Block_ItemHands"]}, + {renderWhenLinked: [...KDLegbinderRender], inventory: true, sfx: "Fwoosh", name: "ShadowLatexLegbinder", inaccessible: true, Asset: "SeamlessLegBinder", LinkableBy: [...KDLegbinderLink], Color: ["#4e2a70"], Group: "ItemLegs", + Model: "Hobbleskirt", + Filters: { + Rubber: {"gamma":1.3333333333333333,"saturation":0,"contrast":1.45,"brightness":1,"red":0.6078431372549019,"green":0.6078431372549019,"blue":1.196078431372549,"alpha":0.8333333333333333}, + }, + hobble: 1, addTag: ["FeetLinked"], power: 9, weight: 0, blockfeet: true, + escapeChance: {"Struggle": -0.25, "Cut": -0.05, "Remove": 0.1, "Pick": 0.25}, + maxwill: 0.2, + enemyTags: {"shadowLatexRestraintsHeavy" : 6}, playerTags: {"posLatex": -1, "ItemFeetEmpty": -4, "ItemLegsEmpty": -4}, + minLevel: 4, allFloors: true, shrine: ["Latex", "ShadowLatex", "Obsidian", "Legbinders"]}, + + {inventory: true, sfx: "Fwoosh", name: "ShadowLatexStrongBoxbinder", inaccessible: true, remove: ["Bra", "Tops"], Asset: "StraitLeotard", Modules: [1, 1, 1, 1], Color: ["#4e2a70", "#4e2a70", "#4e2a70"], Group: "ItemArms", + events: [ + {trigger: "tick", type: "shadowDrain", power: -0.1, inheritLinked: true}, + ], + LinkableBy: [...KDBoxbinderLink], + renderWhenLinked: [...KDBoxbinderLink], + Model: "JacketExtraLeotard", + Filters: { + BeltsChest: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsArms: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + BeltsLower: {"gamma":1,"saturation":0,"contrast":1.7166666666666666,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Chest: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + //Arms: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + Lower: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":1.3666666666666667,"red":1,"green":1,"blue":1.9,"alpha":0.8333333333333333}, + LatexLower: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + LatexUpper: {"gamma":1,"saturation":1,"contrast":0.8666666666666667,"brightness":2.0833333333333335,"red":1,"green":1,"blue":1.9,"alpha":0.9166666666666666}, + }, + playerTagsMult: { + "ItemArmsEmpty": 0.05, + "More_Jackets": 3.5, + "Less_Jackets": 0.1, + }, + bindarms: true, bindhands: 1.33, power: 11, weight: 0, strictness: 0.4, DefaultLock: "Purple", + escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": -0.1, "Pick": -0.1}, + limitChance: {"Struggle": 0.15, "Cut": 0.05, "Remove": 0.5, "Unlock": 0.05}, // Hard to escape the arms box by struggling + maxwill: 0.25, enemyTags: {"shadowLatexRestraintsHeavy" : -5}, playerTags: {"posLatex": -1, "ShadowLatexBoxbinderWorn": 10}, minLevel: 12, allFloors: true, + shrine: ["Latex", "ShadowLatex", "Obsidian", "Boxbinders", "Block_ItemHands"]}, + + //endregion + + //region Obsidian + {inventory: true, removePrison: true, name: "ObsidianLeash", + debris: "Belts", tether: 2.9, Asset: "CollarLeash", + Color: "#44fF76", Group: "ItemNeckRestraints", leash: true, power: 3, weight: 10, harness: true, + Model: "Leash", + struggleBreak: true, + magic: true, + affinity: { + Cut: ["SharpHookOrFoot"], + Struggle: ["HookOrFoot"], + }, + Filters: { + Leash: {"gamma":1,"saturation":0,"contrast":0.8166666666666667,"brightness":1.7166666666666666,"red":1.3833333333333333,"green":1,"blue":3.2666666666666666,"alpha":0.6833333333333333}, + }, + unlimited: true, + events: [ + {trigger: "postRemoval", type: "RequireCollar"}, + ], + requireAllTagsToEquip: ["Collars"], + limitChance: {Struggle: 0.1, Cut: 0.1}, + DefaultLock: "Purple", + escapeChance: {"Struggle": -0.35, "Cut": 0.05, "Remove": 0.4, "Pick": 0.35}, + enemyTags: {"obsidianLeash":9, "obsidianRestraints": 10}, + playerTags: {"ItemNeckRestraintsFull":-2, "ItemNeckFull":999}, + minLevel: 0, allFloors: true, shrine: ["Leashes", "Leashable"]}, + + {inventory: true, name: "ObsidianGag", debris: "Chains", gag: 0.75, Asset: "MuzzleGag", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Color: ["#1C1847", "#1C1847"], Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 9, weight: -4, escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, + Model: "GagMetalRiveted", + Filters: { + Metal: {"gamma":0.55,"saturation":1,"contrast":1.6500000000000001,"brightness":0.9833333333333333,"red":1.1333333333333333,"green":0.95,"blue":2.833333333333333,"alpha":1}, + Rivets: {"gamma":0.18333333333333335,"saturation":1,"contrast":3.7666666666666666,"brightness":0.4,"red":1.6666666666666665,"green":1.4166666666666665,"blue":0.6,"alpha":1}, + }, + factionFilters: { + Rivets: {color: "Highlight", override: true}, + Metal: {color: "DarkNeutral", override: true}, + }, + maxwill: 0.7, enemyTags: {"obsidianRestraints":8}, playerTags: {"ItemMouth3Full":-2, "ItemMouth2Full":2, "ItemMouth1Full":2}, minLevel: 4, allFloors: true, shrine: ["Metal", "Gags", "Obsidian", "Elements", "FlatGags"]}, + {inventory: true, name: "ObsidianCollar", debris: "Chains", Asset: "OrnateCollar", Color: ["#171222", "#9B63C5"], Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDHighCollarRender],power: 9, weight: -2, escapeChance: {"Struggle": -0.2, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, + maxwill: 0.25, enemyTags: {"obsidianRestraints":4, "obsidianCollar": 4, "obsidianNoCuffs": -1000, "obsidianLessCuffs": -3.9, "obsidianCuffs":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Collars", "Obsidian", "Elements", "HighCollars"], + Model: "SteelCollarRunes", + struggleBreak: true, + tightType: "Secure", + Filters: { + Runes: {"gamma":1,"saturation":1,"contrast":0.3833333333333333,"brightness":0.48333333333333334,"red":1,"green":2.8499999999999996,"blue":3.3000000000000003,"alpha":3.7666666666666666}, + BaseMetal: {"gamma":0.95,"saturation":1,"contrast":1.6166666666666665,"brightness":1.7999999999999998,"red":1.0166666666666666,"green":0.9833333333333333,"blue":2.5333333333333337,"alpha":1}, + }, + factionFilters: { + Runes: {color: "Highlight", override: true}, + BaseMetal: {color: "DarkNeutral", override: true}, + }, + unlimited: true, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true},{trigger: "beforeStruggleCalc", type: "obsidianDebuff", power: 0.15, inheritLinked: true} + ]}, + //endregion + + + //region BanditCuffs + {inventory: true, name: "BanditLivingCollar", debris: "Fabric", Asset: "LatexCollar2", factionColor: [[], [0]], Color: "Default", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: 4, DefaultLock: "Blue", + Model: "ElfCollarRestraint", + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + struggleBreak: true, + tightType: "Secure", + maxwill: 0.25, enemyTags: {"livingCollar":10}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["Collars", "Metal"], + events: [{trigger: "tick", type: "livingRestraints", tags: ["banditMagicRestraints"], cloneTags: [], inheritLinked: true, frequencyMax: 60, frequencyMin: 10, frequencyStep: 0.8, count: 4}] + }, + {inventory: true, name: "BanditLegCuffs", debris: "Chains", accessible: true, Asset: "OrnateLegCuffs", LinkableBy: ["Legbinders", "Hobbleskirts", "Belts", "Ties"], Type: "Chained", Color: ["#aaaaaa", "#e7cf1a", "#ff5277"], Group: "ItemLegs", hobble: 1, power: 7, weight: 0, + Model: "ShacklesThigh", + struggleBreak: true, + Filters: { + BaseMetal: {"gamma":1.4166666666666665,"saturation":1,"contrast":1.4833333333333334,"brightness":1.1833333333333333,"red":2.3499999999999996,"green":1.9666666666666666,"blue":1.1333333333333333,"alpha":1}, + }, + alwaysDressModel: [ + {Model: "ThighLink", inheritFilters: true} + ], + escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": 0.2, "Pick": 0.35}, + maxwill: 0.8, enemyTags: {"banditMagicRestraints":6}, playerTags: {"ItemLegsFull":-2}, minLevel: 7, + allFloors: true, shrine: ["Metal", "Cuffs"], + events: [ + {trigger: "struggle", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, + {trigger: "playerAttack", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, + ]}, + {inventory: true, name: "BanditAnkleCuffs", debris: "Chains", accessible: true, Asset: "OrnateAnkleCuffs", LinkableBy: [...KDBindable], Type: "Chained", Color: ["#675F50", "#e7cf1a", "#ff5277"], Group: "ItemFeet", hobble: 1, power: 7, weight: 0, + Model: "ShacklesAnkles", + struggleBreak: true, + Filters: { + BaseMetal: {"gamma":1.4166666666666665,"saturation":1,"contrast":1.4833333333333334,"brightness":1.1833333333333333,"red":2.3499999999999996,"green":1.9666666666666666,"blue":1.1333333333333333,"alpha":1}, + }, + linkCategory: "AnkleCuffs", linkSize: 0.51, noDupe: true, + escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": 0.2, "Pick": 0.35}, enemyTags: {"banditMagicRestraints":6}, playerTags: {"ItemFeetFull":-2}, minLevel: 2, allFloors: true, shrine: ["Cuffs", "Metal", "AnkleCuffsBase", "HogtieLower"], + maxwill: 1.0, events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "struggle", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, + {trigger: "playerAttack", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, + ]}, + + {renderWhenLinked: ["Ties"], nonbinding: true, inventory: true, name: "BanditArmCuffs", debris: "Chains", accessible: true, Asset: "OrnateCuffs", linkCategory: "Cuffs", linkSize: 0.55, + LinkAll: true, Color: ["#e7cf1a", "#ff5277"], Group: "ItemArms", bindarms: false, power: 7, weight: 0, + Model: "ShacklesArms", + struggleBreak: true, + Filters: { + BaseMetal: {"gamma":1.4166666666666665,"saturation":1,"contrast":1.4833333333333334,"brightness":1.1833333333333333,"red":2.3499999999999996,"green":1.9666666666666666,"blue":1.1333333333333333,"alpha":1}, + }, + escapeChance: {"Struggle": -0.2, "Cut": 0.1, "Remove": 0.25, "Pick": 0.45}, enemyTags: {"banditMagicRestraints":24}, playerTags: {"ItemArmsFull":-2}, minLevel: 2, allFloors: true, shrine: ["Cuffs", "Metal", "ArmCuffsBase"], + maxwill: 0.6, events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "struggle", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, + {trigger: "playerAttack", type: "PunishPlayer", chance: 0.33, stun: 2, warningchance: 1.0, damage: "crush", power: 3, sfx: "SoftShield", msg: "KinkyDungeonPunishPlayerBandit", inheritLinked: true}, + ]}, + + //endregion + + {renderWhenLinked: ["Corsets", "Harnesses", ...KDBindable, "Latex", "Leather", "Metal", "Rope"], name: "IceCrystal", + inaccessible: true, factionColor: [[0]], Asset: "TransparentCatsuit", AssetGroup: "Suit", Color: ["#3873C3"], + Group: "ItemDevices", power: 10, weight: 0, escapeChance: {"Struggle": -0.4, "Cut": -0.8, "Remove": -100}, + enemyTags: {iceEncase: 100}, + bindhands: 1.0, + bindarms: true, + playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "Container", "IceEncase", "BlockKneel", "FeetLinked", "HandsBehind"], ignoreSpells: true, removeOnLeash: true, immobile: true, + alwaysEscapable: ["Struggle"], + struggleMinSpeed: { + Struggle: 0.06, + }, + struggleMaxSpeed: { + Struggle: 0.2, + }, + limitChance: { + Struggle: -0.01, + }, + Model: "LatexCube", + Filters:{"LatexCube":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":2.4333333333333336,"alpha":1},"LatexCubeBack":{"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":0.41666666666666663,"green":3.25,"blue":2.2333333333333334,"alpha":1}}, + events: [ + //{trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, + {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}, + {trigger: "tick", type: "callGuardFurniture", inheritLinked: true}, + {trigger: "tick", type: "iceDrain", power: -0.025, inheritLinked: true}, + {trigger: "tick", type: "iceMelt", power: 0.1, count: 13, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "iceMelt", mult: 1.5, subMult: 0.5, count: 13, inheritLinked: true}, + ] + }, + + + + {unlimited: true, removePrison: true, name: "IceArms", debris: "Ice", sfx: "Freeze", Asset: "Ribbons", LinkableBy: ["Armbinders", "Wrapping", "Encase",], Type: "Heavy", Color: "#5DA9E5", Group: "ItemArms", bindarms: true, power: 4, weight: 0, magic: true, escapeChance: {"Struggle": 0.15, "Cut": 0.05, "Remove": 0}, enemyTags: {"iceRestraints":4}, playerTags: {"ItemArmsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Ties", "Ice", "Elements"], + Model: "RibbonBoxtie2", + Filters: { + Ribbon: {"gamma":0.2833333333333333,"saturation":0.05,"contrast":1.0166666666666666,"brightness":1.1833333333333333,"red":1,"green":2.2333333333333334,"blue":3.3833333333333333,"alpha":1}, + }, + maxwill: 0.8, events: [ + {trigger: "tick", type: "iceDrain", power: -0.025, inheritLinked: true}, + {trigger: "tick", type: "iceMelt", power: 0.1, count: 13, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "iceMelt", mult: 1.5, subMult: 0.5, count: 13, inheritLinked: true}, + ]}, + {unlimited: true, removePrison: true, name: "IceLegs", debris: "Ice", sfx: "Freeze", Asset: "Ribbons", LinkableBy: ["Legbinders", "Hobbleskirts", "Wrapping", "Encase",], Type: "MessyWrap", Color: "#5DA9E5", Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 4, weight: 0, magic: true, escapeChance: {"Struggle": 0.15, "Cut": 0.05, "Remove": 0}, enemyTags: {"iceRestraints":4}, playerTags: {"ItemLegsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Ties", "Ice", "Elements"], + Model: "RibbonLegs3", + Filters: { + Ribbon: {"gamma":0.2833333333333333,"saturation":0.05,"contrast":1.0166666666666666,"brightness":1.1833333333333333,"red":1,"green":2.2333333333333334,"blue":3.3833333333333333,"alpha":1}, + }, + events: [ + {trigger: "tick", type: "iceDrain", power: -0.025, inheritLinked: true}, + {trigger: "tick", type: "iceMelt", power: 0.1, count: 15, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "iceMelt", mult: 1.5, subMult: 0.5, count: 15, inheritLinked: true}, + ]}, + {unlimited: true, removePrison: true, name: "IceHarness", debris: "Ice", sfx: "Freeze", Asset: "Ribbons", Type: "Harness2", Color: "#5DA9E5", Group: "ItemTorso", power: 1, weight: 0, magic: true, escapeChance: {"Struggle": 0.15, "Cut": 0.05, "Remove": 0}, enemyTags: {"iceRestraints":4}, playerTags: {"ItemTorsoFull":-2}, minLevel: 0, allFloors: true, shrine: ["Ties", "Ice", "Elements"], + Model: "RibbonHarness", + harness: true, + restriction: 5, + Filters: { + Ribbon: {"gamma":0.2833333333333333,"saturation":0.05,"contrast":1.0166666666666666,"brightness":1.1833333333333333,"red":1,"green":2.2333333333333334,"blue":3.3833333333333333,"alpha":1}, + }, + events: [ + {trigger: "tick", type: "iceDrain", power: -0.025, inheritLinked: true}, + {trigger: "tick", type: "iceMelt", power: 0.1, count: 11, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "iceMelt", mult: 1.5, subMult: 0.5, count: 11, inheritLinked: true}, + ]}, + {unlimited: true, removePrison: true, name: "IceGag", debris: "Ice", gag: 0.35, sfx: "Freeze", Asset: "Ribbons", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Color: "#5DA9E5", Group: "ItemMouth", power: 4, weight: 0, magic: true, escapeChance: {"Struggle": 0.15, "Cut": 0.05, "Remove": 0}, enemyTags: {"iceRestraints":4}, playerTags: {"ItemMouthFull":-2}, minLevel: 0, allFloors: true, shrine: ["Wrapping", "Encase", "Ice", "Elements"], + Model: "TapeWrapOver", + Filters: { + Tape: {"gamma":0.2833333333333333,"saturation":0.05,"contrast":1.0166666666666666,"brightness":1.1833333333333333,"red":1,"green":2.2333333333333334,"blue":3.3833333333333333,"alpha":1}, + }, + maxwill: 0.7, events: [ + {trigger: "tick", type: "iceDrain", power: -0.025, inheritLinked: true}, + {trigger: "tick", type: "iceMelt", power: 0.1, count: 8, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "iceMelt", mult: 1.2, subMult: 0.5, count: 8, inheritLinked: true}, + ]}, + + {unlimited: true, removePrison: true, name: "IceBallGag", debris: "Ice", gag: 0.35, sfx: "Freeze", Asset: "Ribbons", + LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], + Color: "#5DA9E5", Group: "ItemMouth", power: 6, weight: 0, magic: true, + escapeChance: {"Struggle": -0.05, "Cut": -0.05, "Remove": 0}, + enemyTags: {"iceRestraints":4}, playerTags: {"ItemMouthFull":-2}, minLevel: 4, allFloors: true, + Model: "CrystalBallGagSmooth", + quickBindCondition: "BallGag", quickBindMult: 0.5, + Filters: { + Ball: {"gamma":1,"saturation":0.0,"contrast":1.7833333333333334,"brightness":1.8166666666666667,"red":0.3166666666666667,"green":0.6833333333333333,"blue":2.8499999999999996,"alpha":1}, + Strap: {"gamma":1.6666666666666665,"saturation":0.16666666666666666,"contrast":1.7833333333333334,"brightness":3.016666666666667,"red":0.3166666666666667,"green":0.6833333333333333,"blue":2.8499999999999996,"alpha":1}, + }, + shrine: ["BallGags", "Elements", "Ice", "Gags"], + maxwill: 0.6, events: [ + {trigger: "tick", type: "iceDrain", power: -0.015, inheritLinked: true}, + {trigger: "tick", type: "iceMelt", power: 0.1, count: 35, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "iceMelt", mult: 1.2, subMult: 0.5, count: 35, inheritLinked: true}, + ]}, + + {renderWhenLinked: [...KDBeltsRender], removePrison: true, name: "CableArms", debris: "Chains", sfx: "FutureLock", Asset: "NylonRope", changeRenderType: {"ArmBind": "WristElbowHarnessTie"}, + Model: "RibbonWristtie2", + UnderlinkedAlwaysRender: true, + Filters: { + Ribbon: {"gamma":0.2833333333333333,"saturation":0.05,"contrast":3.4499999999999997,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Color: ["#333333"], Group: "ItemArms", bindarms: true, power: 6, weight: 0, magic: false, + escapeChance: {"Struggle": 0.1, "Cut": 0.00, "Remove": 0.25, "Pick": 0.3}, + maxwill: 0.8, enemyTags: {"hitechCables":4}, playerTags: {"ItemArmsFull":-2}, minLevel: 6, allFloors: true, shrine: ["Metal", "Belts", "HogtieUpper"]}, + {renderWhenLinked: [...KDBeltsRender], removePrison: true, name: "CableLegs", debris: "Chains", sfx: "FutureLock", Asset: "NylonRope", Type: "KneesThighs", + LinkableBy: [...KDBeltsBind], Color: ["#333333", "#333333"], Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 6, weight: 0, magic: false, + Model: "RibbonLegs2", + UnderlinkedAlwaysRender: true, + Filters: { + Ribbon: {"gamma":0.2833333333333333,"saturation":0.05,"contrast":3.4499999999999997,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": 0.1, "Cut": 0.0, "Remove": 0.25, "Pick": 0.3}, enemyTags: {"hitechCables":4}, playerTags: {"ItemLegsFull":-2}, minLevel: 6, allFloors: true, shrine: ["Metal", "Belts"]}, + {renderWhenLinked: [...KDBeltsRender], removePrison: true, name: "CableHarness", sfx: "FutureLock", Asset: "NylonRopeHarness", OverridePriority: 27, Color: ["#333333", "#333333"], Type: "Harness", Group: "ItemTorso", power: 2, strictness: 0.05, weight: 0, magic: false, + LinkableBy: [...KDBeltsBind], + Model: "RibbonHarness", + UnderlinkedAlwaysRender: true, + restriction: 4, + harness: true, + Filters: { + Ribbon: {"gamma":0.2833333333333333,"saturation":0.05,"contrast":3.4499999999999997,"brightness":0.8,"red":1,"green":1,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": 0.1, "Cut": 0.0, "Remove": 0.25, "Pick": 0.3}, enemyTags: {"hitechCables":4}, playerTags: {"ItemTorsoFull":-2}, minLevel: 6, allFloors: true, shrine: ["Metal", "Belts"]}, + + {renderWhenLinked: [...KDBeltsRender], removePrison: true, name: "NylonCableArms", debris: "Chains", sfx: "FutureLock", Asset: "NylonRope", changeRenderType: {"ArmBind": "WristElbowHarnessTie"}, maxLevel: 6, + Model: "RibbonWristtie2", + UnderlinkedAlwaysRender: true, + Filters: { + Ribbon: {"gamma":1,"saturation":0.05,"contrast":1.6,"brightness":0.35000000000000003,"red":1,"green":1,"blue":1,"alpha":1}, + }, + LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindable], Color: ["#222222"], Group: "ItemArms", bindarms: true, power: 6, weight: 0, magic: false, + escapeChance: {"Struggle": 0.12, "Cut": 0.2, "Remove": 0.3, "Pick": 0.35}, + maxwill: 0.8, enemyTags: {"hitechCables":4}, playerTags: {"ItemArmsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Belts", "HogtieUpper"]}, + {renderWhenLinked: [...KDBeltsRender], removePrison: true, name: "NylonCableLegs", debris: "Chains", sfx: "FutureLock", Asset: "NylonRope", Type: "KneesThighs", maxLevel: 6, + LinkableBy: [...KDBeltsBind], + Model: "RibbonLegs2", + UnderlinkedAlwaysRender: true, + Filters: { + Ribbon: {"gamma":1,"saturation":0.05,"contrast":1.6,"brightness":0.35000000000000003,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Color: ["#222222", "#222222"], Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 6, weight: 0, magic: false, + escapeChance: {"Struggle": 0.12, "Cut": 0.2, "Remove": 0.3, "Pick": 0.35}, enemyTags: {"hitechCables":4}, playerTags: {"ItemLegsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Belts"]}, + {renderWhenLinked: [...KDBeltsRender], removePrison: true, name: "NylonCableHarness", sfx: "FutureLock", Asset: "NylonRopeHarness", OverridePriority: 27, maxLevel: 6, + LinkableBy: [...KDBeltsBind], + Model: "RibbonHarness", + harness: true, + UnderlinkedAlwaysRender: true, + restriction: 2, + Filters: { + Ribbon: {"gamma":1,"saturation":0.05,"contrast":1.6,"brightness":0.35000000000000003,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Color: ["#222222", "#222222"], Type: "Harness", Group: "ItemTorso", power: 2, strictness: 0.05, weight: 0, magic: false, + escapeChance: {"Struggle": 0.12, "Cut": 0.2, "Remove": 0.3, "Pick": 0.35}, enemyTags: {"hitechCables":4}, playerTags: {"ItemTorsoFull":-2}, minLevel: 0, allFloors: true, shrine: ["Metal", "Belts"]}, + + //region Ribbon + + {inventory: true, name: "RibbonCollar", debris: "Fabric", Asset: "LatexCollar2", factionColor: [[], [0]], Color: "Default", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: 4, DefaultLock: "Blue", + Model: "ElfCollarRestraint", + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + struggleBreak: true, + UnderlinkedAlwaysRender: true, + tightType: "Secure", + maxwill: 0.25, enemyTags: {"livingCollar":10}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["Collars","Rope","Ribbons"], + events: [{trigger: "tick", type: "livingRestraints", tags: ["magicRibbons","magicRibbonsHarsh"], cloneTags: [], inheritLinked: true, frequencyMax: 60, frequencyMin: 10, frequencyStep: 0.8, count: 4}] + }, + + {inventory: true, name: "RibbonRaw", + noRecycle: true, + requireSingleTagToEquip: ["Impossible"], + Asset: "", Color: "", + recycleresource: { + Rope: 3, + }, + Group: "ItemDevices", power: 1, weight: -1000, + escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.05}, + enemyTags: {}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["Ribbons", "Raw"]}, + + + {unlimited: true, inventory: true, removePrison: true, name: "RibbonArms", debris: "Fabric", sfx: "MagicSlash", Asset: "Ribbons", Color: "#a583ff", Group: "ItemArms", bindarms: true, power: 6, weight: 0, magic: true, + escapeChance: {"Struggle": 0.15, "Cut": 0.3, "Remove": 0.2,}, struggleMaxSpeed: {"Remove": 0.15}, struggleMinSpeed: {"Struggle": 0.1}, + affinity: {Remove: ["Hook"],}, + Model: "RibbonBoxtie2", + UnderlinkedAlwaysRender: true, + Filters: { + Ribbon: {"gamma":0.6,"saturation":0,"contrast":1,"brightness":1,"red":1.1333333333333333,"green":0.6666666666666666,"blue":2.4166666666666665,"alpha":1}, + }, + disassembleAs: "RibbonRaw", + maxwill: 0.8, enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, playerTags: {"ItemArmsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Ribbons", "Rope", "Ties", "Conjure", "Wristties"]}, + {unlimited: true, inventory: true, removePrison: true, name: "RibbonLegs", debris: "Fabric", sfx: "MagicSlash", Asset: "DuctTape", Color: "#a583ff", Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 7, weight: 0, magic: true, + affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, + + Model: "RibbonLegs2", + UnderlinkedAlwaysRender: true, + Filters: { + Ribbon: {"gamma":0.6,"saturation":0,"contrast":1,"brightness":1,"red":1.1333333333333333,"green":0.6666666666666666,"blue":2.4166666666666665,"alpha":1}, + }, + disassembleAs: "RibbonRaw", + escapeChance: {"Struggle": 0.07, "Cut": 0.3, "Remove": 0.15}, enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, struggleMaxSpeed: {"Remove": 0.15}, playerTags: {"ItemLegsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Ribbons", "Rope", "Ties", "Conjure"]}, + {unlimited: true, inventory: true, removePrison: true, name: "RibbonFeet", debris: "Fabric", sfx: "MagicSlash", Asset: "DuctTape", Color: "#a583ff", Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 7, weight: 0, magic: true, + + Model: "RibbonAnkles1", + UnderlinkedAlwaysRender: true, + Filters: { + Ribbon: {"gamma":0.6,"saturation":0,"contrast":1,"brightness":1,"red":1.1333333333333333,"green":0.6666666666666666,"blue":2.4166666666666665,"alpha":1}, + }, + disassembleAs: "RibbonRaw", + affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, playerTagsMissingMult: {"ItemLegsFull":0.05}, + escapeChance: {"Struggle": 0.07, "Cut": 0.3, "Remove": 0.15}, enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, struggleMaxSpeed: {"Remove": 0.15}, playerTags: {"ItemLegsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Ribbons", "Rope", "Ties", "Conjure"]}, + {unlimited: true, inventory: true, removePrison: true, name: "RibbonHarness", debris: "Fabric", sfx: "MagicSlash", Asset: "Ribbons", Type: "Harness2", Color: "#a583ff", Group: "ItemTorso", power: 6, strictness: 0.05, weight: 0, magic: true, + Model: "RibbonHarness", + + restriction: 4, + harness: true, + UnderlinkedAlwaysRender: true, + Filters: { + Ribbon: {"gamma":0.6,"saturation":0,"contrast":1,"brightness":1,"red":1.1333333333333333,"green":0.6666666666666666,"blue":2.4166666666666665,"alpha":1}, + }, + disassembleAs: "RibbonRaw", + affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, + escapeChance: {"Struggle": 0.07, "Cut": 0.3, "Remove": 0.15}, struggleMaxSpeed: {"Remove": 0.15}, enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, playerTags: {"ItemTorsoFull":-2}, minLevel: 0, allFloors: true, shrine: ["Ribbons", "Rope", "Ties", "Conjure"]}, + {unlimited: true, inventory: true, removePrison: true, name: "RibbonCrotch", debris: "Fabric", sfx: "MagicSlash", Asset: "Ribbons", Color: "#a583ff", Group: "ItemPelvis", power: 5, crotchrope: true, strictness: 0.15, weight: 0, magic: true, + Model: "RibbonCrotch", + Filters: { + Ribbon: {"gamma":0.6,"saturation":0,"contrast":1,"brightness":1,"red":1.1333333333333333,"green":0.6666666666666666,"blue":2.4166666666666665,"alpha":1}, + }, + disassembleAs: "RibbonRaw", + UnderlinkedAlwaysRender: true, + affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, + escapeChance: {"Struggle": 0.15, "Cut": 0.35, "Remove": 0.25}, struggleMaxSpeed: {"Remove": 0.2}, enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, playerTags: {"ItemTorsoFull":-2}, minLevel: 0, + allFloors: true, shrine: ["RopeCrotch", "Rope", "Ties", "Conjure", "Ribbons",], events: [{trigger: "struggle", type: "crotchrope"}]}, + {unlimited: true, inventory: true, name: "RibbonHands", Asset: "DuctTape", debris: "Fabric", Color: "#a583ff", LinkableBy: ["Mittens"], Group: "ItemHands", bindhands: 0.7, power: 5, weight: 0, magic: true, + Model: "TapeHeavyHands", + Filters: { + Tape: {"gamma":0.6,"saturation":0,"contrast":1.0666666666666667,"brightness":1.25,"red":1.1333333333333333,"green":0.6666666666666666,"blue":2.4166666666666665,"alpha":1}, + }, + disassembleAs: "RibbonRaw", + affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, + escapeChance: {"Struggle": 0, "Cut": 0.4, "Remove": 0.5}, struggleMaxSpeed: {"Remove": 0.1}, + maxwill: 0.3, enemyTags: {"magicRibbonsHarsh":1}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Ribbons", "Rope", "Ties", "Conjure"]}, + {unlimited: true, inventory: true, name: "RibbonMouth", Asset: "DuctTape", debris: "Fabric", Color: "#9573ef", Type: "Cover", LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], Group: "ItemMouth", AssetGroup: "ItemMouth2", gag: 0.5, power: 5, weight: 0, magic: true, escapeChance: {"Struggle": 0.0, "Cut": 0.4, "Remove": 0.4}, struggleMaxSpeed: {"Remove": 0.15}, + Model: "TapeWrapOver", + Filters: { + Tape: {"gamma":0.6,"saturation":0,"contrast":1.0666666666666667,"brightness":1.25,"red":1.1333333333333333,"green":0.6666666666666666,"blue":2.4166666666666665,"alpha":1}, + }, + disassembleAs: "RibbonRaw", + affinity: {Remove: ["Hook"],}, struggleMinSpeed: {"Struggle": 0.1}, + enemyTags: {"magicRibbons":4, "lowWeightRibbons":1}, playerTags: {"ItemMouth1Full":8}, minLevel: 0, allFloors: true, shrine: ["Ribbons", "Rope", "Wrapping", "Conjure"]}, + //endregion + + {inventory: true, name: "CableGag", Asset: "DeepthroatGag", debris: "Belts", gag: 1.0, sfx: "FutureLock", Color: "Default", LinkableBy: [...KDPlugGagLink], renderWhenLinked: [...KDPlugGagLink], + Model: "PlugPanelGag", + UnderlinkedAlwaysRender: true, + Group: "ItemMouth", power: 5, weight: 2, escapeChance: {"Struggle": -0.12, "Cut": 0.0, "Remove": 0.5, "Pick": 0.3}, + maxwill: 0.6, enemyTags: {"cableGag":3}, playerTags: {}, minLevel: 6, allFloors: true, shrine: ["Metal", "PlugGags", "Gags"]}, + {inventory: true, name: "NylonCableGag", Asset: "DeepthroatGag", debris: "Belts", gag: 0.8, sfx: "FutureLock", Color: "#222222", LinkableBy: [...KDPlugGagLink], renderWhenLinked: [...KDPlugGagLink], Group: "ItemMouth", power: 5, weight: 2, escapeChance: {"Struggle": -0.07, "Cut": 0.2, "Remove": 0.5, "Pick": 0.35}, + Model: "PlugPanelGag", + UnderlinkedAlwaysRender: true, + maxwill: 0.6, enemyTags: {"cableGag":3}, playerTags: {}, minLevel: 0, maxLevel: 6, allFloors: true, shrine: ["Metal", "PlugGags", "Gags"]}, + + //region RopeSnake + {inventory: true, name: "RopeSnakeCollar", debris: "Ropes", Asset: "LatexCollar2", factionColor: [[], [0]], Color: "Default", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: 4, DefaultLock: "Blue", + Model: "ElfCollarRestraint", + linkPriority: 100, + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + struggleBreak: true, + tightType: "Secure", + + sfxGroup: "Ropes", + linkCategories: ["EnchantableCollar"], linkSizes: [0.51], + maxwill: 0.25, enemyTags: {"livingCollar":10}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["Collars","Rope", "RopeSnake"], + events: [{trigger: "tick", type: "livingRestraints", tags: ["ropeRestraints", "ropeRestraints2", "ropeRestraintsWrist"], cloneTags: [], inheritLinked: true, frequencyMax: 60, frequencyMin: 10, frequencyStep: 0.9, count: 8}] + }, + {inventory: true, name: "RopeSnakeRaw", + noRecycle: true, + requireSingleTagToEquip: ["Impossible"], + Asset: "", Color: "", + recycleresource: { + Rope: 1, + }, + Group: "ItemDevices", power: 1, weight: -1000, + escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.05}, + enemyTags: {}, playerTags: {}, + sfxGroup: "Ropes", + minLevel: 0, allFloors: true, shrine: ["RopeSnake", "Rope", "Raw"]}, + {unlimited: true, changeRenderType: {"ArmBind": "WristElbowHarnessTie"}, inventory: true, name: "RopeSnakeArmsBoxtie", debris: "Ropes", accessible: true, factionColor: [[], [0]], + Model: "RopeBoxtie1", + linkPriority: 10, + linkCategories: ["RopeArms", "EnchantableArms"], linkSizes: [0.51, 0.51], + //renderWhenLinked: [...KDArmRopesRender], + alwaysRender: true, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + Asset: "HempRope", Color: "Default", LinkableBy: ["Boxbinders", "Boxties", "RopeReinforce", "Wrapping", "Encase",...KDBindable], Group: "ItemArms", bindarms: true, power: 1.5, weight: 0, escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.05}, + struggleMult: {"Struggle": 0.35, "Remove": 0.3}, + affinity: {Remove: ["Hook"],}, + UnderlinkedAlwaysRender: true, + maxwill: 0.7, enemyTags: {"ropeRestraints":4}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "Boxties", "HogtieUpper"]}, + {unlimited: true, inventory: true, name: "RopeSnakeCuffs", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "RopeCuffs", Color: "Default", + noDupe: true, + linkPriority: -1, + linkCategories: ["Cuffs", "EnchantableCuffs"], linkSizes: [0.33, 0.51], + Model: "RopeCuffs", + events: [ + {trigger: "beforeStruggleCalc", type: "ropeDebuff", power: 0.05, inheritLinked: true, requireTags: ["RopeReinforce", "IntricateRopeArms"]} + ], + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + alwaysRender: true, + struggleMult: {"Struggle": 0.45, "Remove": 0.45}, + LinkableBy: ["Boxbinders", "Armbinders", "BindingDress", ...KDBindable, "Cuffs", "Ties"], Group: "ItemArms", bindarms: true, power: 1, weight: 0, escapeChance: {"Struggle": 0.4, "Cut": 0.67, "Remove": 0.3}, + affinity: {Remove: ["Hook"],}, + UnderlinkedAlwaysRender: true, + maxwill: 1.0, enemyTags: {"ropeRestraints":8}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["RopeSnake", "Rope", "Cuffs", "HandsFrontAllowed", "HandsCrossedAllowed", "HandsUpAllowed", "HogtieUpper"]}, + {unlimited: true, inventory: true, name: "RopeSnakeCuffsAdv", debris: "Ropes", + accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "RopeCuffs", Color: "Default", + + linkPriority: 11, + linkCategories: ["Ropework", "EnchantableRopework"], linkSizes: [0.33, 0.51], + Model: "RopeChestStraps1", + events: [ + {trigger: "beforeStruggleCalc", type: "ropeDebuff", power: 0.05, inheritLinked: true, requireTags: ["Wristties", "Boxties", "Crossties"]} + ], + //renderWhenLinked: [...KDArmRopesRender], + alwaysRender: true, + struggleMult: {"Struggle": 0.2, "Remove": 0.22}, + UnderlinkedAlwaysRender: true, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + LinkableBy: ["Boxbinders", "Armbinders", ...KDBindable, "Cuffs", "RopeReinforce"], Group: "ItemArms", bindarms: true, power: 2, weight: 0, escapeChance: {"Struggle": 0.25, "Cut": 0.67, "Remove": 0.2}, + affinity: {Remove: ["Hook"],}, strictness: 0.05, strictnessZones: ["ItemHands", "HandsFrontAllowed", "HandsCrossedAllowed", "HandsUpAllowed"], + maxwill: 1.0, enemyTags: {"ropeRestraints":8}, playerTags: {"ItemArmsFull":-1}, minLevel: 2, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "RopeReinforce", "IntricateRopeArms", "HogtieUpper"]}, + {unlimited: true, inventory: true, name: "RopeSnakeCuffsAdv2", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "RopeCuffs", Color: "Default", + linkCategories: ["Ropework2", "EnchantableRopework2"], linkSizes: [0.33, 0.51], noDupe: true, + linkPriority: 12, + Model: "RopeChestStraps2", + events: [ + {trigger: "beforeStruggleCalc", type: "ropeDebuff", power: 0.05, inheritLinked: true, requireTags: ["Wristties", "Boxties", "Crossties"]} + ], + //renderWhenLinked: [...KDArmRopesRender], + alwaysRender: true, + playerTagsMissingMult: {"IntricateRopeArms": 0.1}, + UnderlinkedAlwaysRender: true, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + struggleMult: {"Struggle": 0.1, "Remove": 0.1}, + LinkableBy: ["Boxbinders", "Armbinders", ...KDBindable, "Cuffs", "RopeReinforce"], Group: "ItemArms", bindarms: true, power: 3, weight: 0, escapeChance: {"Struggle": 0.25, "Cut": 0.67, "Remove": 0.2}, + affinity: {Remove: ["Hook"],}, strictness: 0.1, strictnessZones: ["ItemHands", "HandsFrontAllowed", "HandsCrossedAllowed", "HandsUpAllowed"], + maxwill: 1.0, enemyTags: {"ropeRestraints":8, "ropeRestraintsNonbind": 10}, playerTags: {"ItemArmsFull":-1}, minLevel: 3, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "RopeReinforce", "ChestHarnesses", "HogtieUpper"]}, + {unlimited: true, inventory: true, name: "RopeSnakeArmsWrist", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "WristElbowHarnessTie", + Model: "RopeWristtie1", + linkPriority: 10, + struggleMult: {"Struggle": 0.6, "Remove": 0.3}, + linkCategories: ["RopeArms", "EnchantableArms"], linkSizes: [0.51, 0.51], + //renderWhenLinked: [...KDArmRopesRender], + alwaysRender: true, + UnderlinkedAlwaysRender: true, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + LinkableBy: ["Armbinders", "Wristties", "RopeReinforce", "Wrapping", "Encase", "Belts", "HogtieUpper"], + Color: "Default", Group: "ItemArms", bindarms: true, power: 1.5, weight: 0, escapeChance: {"Struggle": 0.185, "Cut": 0.45, "Remove": 0}, + affinity: {Remove: ["Hook"],}, + maxwill: 0.7, enemyTags: {"ropeRestraintsWrist":4}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "Wristties"]}, + + {name: "RopeSnakeHogtieLink", + debris: "Ropes", accessible: true, + linkPriority: 100, + Asset: "HempRope", Type: "Hogtied", Color: "Default", + Group: "ItemFeet", power: 4, weight: 0, + struggleMult: {"Struggle": 0.4, "Remove": 0.3, "Cut": 10}, + escapeChance: {"Struggle": 0.0, "Cut": 0.35, "Remove": 0}, + affinity: {Remove: ["Hook"],}, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + minLevel: 0, allFloors: true, shrine: ["RopeSnake", "Link", "Rope", "Hogties"], + + linkCategories: ["Hogtie", "EnchantableHogtie"], linkSizes: [0.4, 0.51], + LinkAll: true, + noDupe: true, + addPose: ["HandsBehind"], + UnderlinkedAlwaysRender: true, + struggleBreak: true, + requireAllTagsToEquip: ["HogtieLower", "HogtieUpper"], + enemyTags: {"ropeRestraintsHogtie":4}, playerTags: {}, + maxwill: 0.1, + DefaultLock: "White", + events: [ + {trigger: "postRemoval", type: "RequireHogtie"} + ] + }, + /*{unlimited: true, inventory: true, name: "RopeSnakeHogtie", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "Hogtied", Color: "Default", Group: "ItemArms", + bindarms: true, power: 6, weight: 0, + Model: "RopeBoxtie1", + alwaysDressModel: [ + {Model: "RopeChestStraps2", inheritFilters: true,} + ], + linkCategory: "Hogtie", linkSize: 0.51, + //renderWhenLinked: [...KDArmRopesRender], + alwaysRender: true, + LinkableBy: [...KDWrappable], + struggleMult: {"Struggle": 0.4, "Remove": 0.3}, + escapeChance: {"Struggle": 0.0, "Cut": 0.15, "Remove": 0}, affinity: {Remove: ["Hook"],}, + maxwill: 0.25, enemyTags: {"ropeRestraintsHogtie":12}, playerTags: {}, minLevel: 2, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "Hogties", "Boxties"], + //events: [{trigger: "postRemoval", type: "replaceItem", list: ["RopeSnakeArmsBoxtie"], power: 6}] + }, + {unlimited: true, inventory: true, name: "RopeSnakeHogtieWrist", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "Hogtied", Color: "Default", Group: "ItemArms", bindarms: true, power: 6, weight: 0, + Model: "RopeWristtie1", + alwaysDressModel: [ + {Model: "RopeChestStraps2", inheritFilters: true} + ], + linkCategory: "Hogtie", linkSize: 0.51, + LinkableBy: [...KDWrappable], + //renderWhenLinked: [...KDArmRopesRender], + alwaysRender: true, + struggleMult: {"Struggle": 0.4, "Remove": 0.3}, + escapeChance: {"Struggle": 0.1, "Cut": 0.15, "Remove": -0.05}, affinity: {Remove: ["Hook"],}, + maxwill: 0.25, enemyTags: {"ropeRestraintsHogtie":12}, playerTags: {}, minLevel: 2, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "Hogties", "Wristties"], + //events: [{trigger: "postRemoval", type: "replaceItem", list: ["RopeSnakeArmsWrist"], power: 6}] + },*/ + {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "RopeSnakeFeet", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Color: "Default", LinkableBy: [...KDFeetRopeLink], Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.5, "Remove": 0.15}, + Model: "RopeAnkles1", + linkPriority: 10, + restriction: 2, + struggleMult: {"Struggle": 0.5, "Remove": 0.25}, + affinity: {Remove: ["Hook"],}, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + linkCategories: ["RopeFeet1", "EnchantableRopeFeet1"], linkSizes: [0.7, 0.7], + UnderlinkedAlwaysRender: true, + events: [ + {trigger: "beforeStruggleCalc", type: "ropeDebuff", power: 0.05, inheritLinked: true, requireTags: ["RopeFeet2", "RopeLegs3"]} + ], + maxwill: 1.0, enemyTags: {"ropeRestraints":4}, playerTags: {"ItemLegsFull":-1}, playerTagsMissingMult: {"ItemLegsFull":0.05}, minLevel: 0, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "RopeFeet1", "HogtieLower"]}, + {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "RopeSnakeFeet2", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Color: "Default", LinkableBy: [...KDFeetRopeLink], Group: "ItemFeet", blockfeet: true, hobble: 0.25, addTag: ["FeetLinked"],power: 1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.5, "Remove": 0.15}, + Model: "RopeAnkles2", + linkPriority: 10, + restriction: 2, + struggleMult: {"Struggle": 0.6, "Remove": 0.3}, + affinity: {Remove: ["Hook"],}, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + linkCategories: ["RopeFeet2", "EnchantableRopeFeet2"], linkSizes: [0.7, 0.7], + UnderlinkedAlwaysRender: true, + events: [ + {trigger: "beforeStruggleCalc", type: "ropeDebuff", power: 0.05, inheritLinked: true, requireTags: ["RopeFeet1", "RopeFeet3"]} + ], + aggroLevel: 2.0, + maxwill: 1.0, enemyTags: {"ropeRestraints":4}, playerTags: {"ItemLegsFull":-1}, playerTagsMissing: {"RopeFeet1": -100}, playerTagsMissingMult: {"ItemLegsFull":0.05}, minLevel: 3, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "RopeFeet2"]}, + {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "RopeSnakeFeet3", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Color: "Default", LinkableBy: [...KDFeetRopeLink], Group: "ItemFeet", blockfeet: true, hobble: 0.25, addTag: ["FeetLinked"],power: 1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.5, "Remove": 0.15}, + Model: "RopeAnkles3", + restriction: 2, + struggleMult: {"Struggle": 0.6, "Remove": 0.3}, + affinity: {Remove: ["Hook"],}, + linkCategories: ["RopeFeet3", "EnchantableRopeFeet3"], linkSizes: [0.7, 0.7], + UnderlinkedAlwaysRender: true, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + linkPriority: 10, + events: [ + {trigger: "beforeStruggleCalc", type: "ropeDebuff", power: 0.05, inheritLinked: true, requireTags: ["RopeFeet2", "ToeRope"]} + ], + aggroLevel: 3.0, + maxwill: 1.0, enemyTags: {"ropeRestraints":4}, playerTags: {"ItemLegsFull":-1}, playerTagsMissing: {"RopeFeet1": -100, "RopeFeet2": -100}, playerTagsMissingMult: {"ItemLegsFull":0.05}, minLevel: 5, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "RopeFeet3"]}, + {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "RopeSnakeToes", accessible: true, Asset: "ToeTie", OverridePriority: 26, LinkableBy: ["Wrapping", "Encase",], + Color: "Default", Group: "ItemBoots", blockfeet: true, addTag: ["FeetLinked"], power: 1, weight: 1, + affinity: {Remove: ["Hook"],}, + restriction: 2, + debris: "Ropes", factionColor: [[], [0]], + escapeChance: {"Struggle": 0.1, "Cut": 0.5, "Remove": 0.15}, + UnderlinkedAlwaysRender: true, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + Model: "RopeToes", + linkPriority: 10, + heelpower: 0.5, + linkCategories: ["RopeToes", "EnchantableRopeToes"], linkSizes: [0.34, 0.51], noDupe: true, + maxwill: 1.0, enemyTags: {"ropeRestraints":4}, playerTags: {"ItemLegsFull":-1}, playerTagsMissingMult: {"ItemAnklesFull":0.05}, minLevel: 0, allFloors: true, shrine: ["RopeSnake", "ToeRope", "Rope", "Ties"]}, + {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "RopeSnakeLegs", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "FullBinding", LinkableBy: [...KDLegRopesBind], Color: "Default", Group: "ItemLegs", hobble: 0.5, addTag: ["FeetLinked"], power: 1, weight: 0, escapeChance: {"Struggle": 0.25, "Cut": 0.45, "Remove": 0.15}, + Model: "RopeLegs1", + linkPriority: 10, + restriction: 2, + struggleMult: {"Struggle": 0.6, "Remove": 0.3}, + affinity: {Remove: ["Hook"],}, + linkCategories: ["RopeLegs1", "EnchantableRopeLegs1"], linkSizes: [0.7, 0.7], + UnderlinkedAlwaysRender: true, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + events: [ + {trigger: "beforeStruggleCalc", type: "ropeDebuff", power: 0.05, inheritLinked: true, requireTags: ["RopeLegs2", "RopeHarness", "RopeCrotch"]} + ], + maxwill: 0.6, enemyTags: {"ropeRestraints":4}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "RopeLegs1"]}, + {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "RopeSnakeLegs2", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "FullBinding", LinkableBy: [...KDLegRopesBind], Color: "Default", Group: "ItemLegs", hobble: 0.5, addTag: ["FeetLinked"], power: 1, weight: 0, escapeChance: {"Struggle": 0.25, "Cut": 0.45, "Remove": 0.15}, + Model: "RopeLegs2", + restriction: 2, + linkPriority: 10, + struggleMult: {"Struggle": 0.6, "Remove": 0.3}, + affinity: {Remove: ["Hook"],}, + linkCategories: ["RopeLegs2", "EnchantableRopeLegs2"], linkSizes: [0.7, 0.7], + UnderlinkedAlwaysRender: true, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + events: [ + {trigger: "beforeStruggleCalc", type: "ropeDebuff", power: 0.05, inheritLinked: true, requireTags: ["RopeLegs3", "RopeLegs1"]} + ], + aggroLevel: 4.0, + maxwill: 0.6, enemyTags: {"ropeRestraints":4}, playerTags: {"ItemFeetFull":-1}, playerTagsMissing: {"RopeLegs1": -100}, minLevel: 7, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "RopeLegs2"]}, + {unlimited: true, renderWhenLinked: [...KDLegRopesRender], inventory: true, name: "RopeSnakeLegs3", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRope", Type: "FullBinding", LinkableBy: [...KDLegRopesBind], Color: "Default", Group: "ItemLegs", hobble: 0.5, addTag: ["FeetLinked"], power: 1, weight: 0, escapeChance: {"Struggle": 0.25, "Cut": 0.45, "Remove": 0.15}, + Model: "RopeLegs3", + linkPriority: 10, + restriction: 2, + struggleMult: {"Struggle": 0.6, "Remove": 0.3}, + affinity: {Remove: ["Hook"],}, + linkCategories: ["RopeLegs3", "EnchantableRopeLegs3"], linkSizes: [0.7, 0.7], + UnderlinkedAlwaysRender: true, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + events: [ + {trigger: "beforeStruggleCalc", type: "ropeDebuff", power: 0.05, inheritLinked: true, requireTags: ["RopeFeet3", "RopeLegs2"]} + ], + aggroLevel: 6.0, + maxwill: 0.6, enemyTags: {"ropeRestraints":4}, playerTags: {"ItemFeetFull":-1}, playerTagsMissing: {"RopeLegs2": -100, "RopeLegs1": -100}, minLevel: 9, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "RopeLegs3"]}, + {unlimited: true, renderWhenLinked: ["Harnesses", "HeavyCorsets", "Corsets"], inventory: true, name: "RopeSnakeBelt", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRopeHarness", Type: "Waist", Color: "Default", Group: "ItemTorso", power: 1, weight: 0, harness: true, escapeChance: {"Struggle": 0.1, "Cut": 0.67, "Remove": 0.3}, + Model: "RopeBelt", + restriction: 2, + linkPriority: 10, + affinity: {Remove: ["Hook"],}, + linkCategories: ["RopeHarness", "EnchantableRopeHarness"], linkSizes: [0.33, 0.51], + UnderlinkedAlwaysRender: true, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + maxwill: 0.9, enemyTags: {"ropeRestraints2":4}, playerTags: {"ItemTorsoFull":-3}, minLevel: 0, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties"]}, + {unlimited: true, renderWhenLinked: ["Harnesses", "HeavyCorsets", "Corsets"], inventory: true, name: "RopeSnakeHarness", debris: "Ropes", accessible: true, factionColor: [[], [0]], Asset: "HempRopeHarness", Type: "Star", strictness: 0.1, OverridePriority: 26, Color: "Default", Group: "ItemTorso", power: 2, weight: 0, harness: true, escapeChance: {"Struggle": 0.1, "Cut": 0.67, "Remove": 0.3}, + Model: "RopeHarness", + restriction: 4, + linkPriority: 10, + struggleMult: {"Struggle": 0.3, "Remove": 0.15}, + linkCategories: ["RopeHarness", "EnchantableRopeHarness"], linkSizes: [0.51, 0.51], + UnderlinkedAlwaysRender: true, + affinity: {Remove: ["Hook"],}, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + aggroLevel: 2.0, + maxwill: 0.75, enemyTags: {"ropeRestraints2":1, "ropeRestraintsNonbind": 10}, playerTags: {"ItemTorsoFull":5}, minLevel: 3, allFloors: true, shrine: ["RopeSnake", "Rope", "Ties", "Harnesses", "RopeHarness"]}, + {unlimited: true, inventory: true, name: "RopeSnakeCrotch", debris: "Ropes", accessible: true, factionColor: [[], [0]], crotchrope: true, strictness: 0.15, Asset: "HempRope", Type: "OverPanties", LinkableBy: ["ChastityBelts"], OverridePriority: 26, Color: "Default", Group: "ItemPelvis", power: 1, weight: 0, + Model: "RopeCrotch", + harness: true, + linkPriority: 10, + linkCategories: ["RopeCrotch", "EnchantableRopeCrotch"], linkSizes: [0.34, 0.51], noDupe: true, + UnderlinkedAlwaysRender: true, + struggleMult: {"Struggle": 0.6, "Remove": 0.5}, + affinity: {Remove: ["Hook"],}, + disassembleAs: "RopeSnakeRaw", + sfxGroup: "Ropes", + aggroLevel: 1.0, + maxwill: 0.75, escapeChance: {"Struggle": 0.1, "Cut": 0.67, "Remove": 0.15}, enemyTags: {"ropeRestraints2":4, "ropeRestraintsNonbind": 10}, playerTags: {"ItemPelvisFull":-3}, minLevel: 0, allFloors: true, shrine: ["RopeCrotch", "RopeSnake", "Rope", "Ties"], + events: [{trigger: "struggle", type: "crotchrope"}]}, + //endregion + + // regiuon Links + {name: "ThighLink", accessible: true, Asset: "FuturisticLegCuffs", debris: "Chains", LinkableBy: [...KDBindable, ...KDDevices], + sfx: "Chain", + sfxGroup: "Chains", + binding: true, + Model: "ThighLink", alwaysRender: true, + linkSize: 0.35, linkCategory: "LegLink", noDupe: true, + Type: "Chained", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], + Group: "ItemLegs", hobble: 1, power: 3, weight: 0, + minLevel: 0, allFloors: true, shrine: ["ThighLink", "Link", "Metal", "Cuffs"], + escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, + enemyTags: {jailer: 0.1, linkRegular: 40, handcuffer: 40, shackleRestraints: 40, chainRestraints: 40, "legLink": 1}, playerTags: {}, + DefaultLock: "White", + requireSingleTagToEquip: ["LegCuffsBase"], + unlimited: true, + UnderlinkedAlwaysRender: true, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseLegCuffs", inheritLinked: true} + ]}, + + + {name: "ChainHogtieLink", + sfx: "Chain", + sfxGroup: "Chains", + binding: true, + UnderlinkedAlwaysRender: true, + debris: "Chains", accessible: true, + Asset: "HempRope", Type: "Hogtied", Color: "Default", + Group: "ItemFeet", power: 6, weight: 0, + struggleMult: {"Struggle": 0.4, "Remove": 0.3, "Cut": 10}, + escapeChance: {"Struggle": -0.2, "Cut": -0.1, "Remove": 0.3, "Pick": 0.8}, + limitChance: {"Struggle": 0.8}, + affinity: {Remove: ["Hook"],}, + minLevel: 0, allFloors: true, shrine: ["Chains", "Link", "Metal", "Hogties"], + linkCategory: "Hogtie", linkSize: 0.51, + LinkAll: true, + noDupe: true, + addPose: ["HandsBehind"], + struggleBreak: true, + requireAllTagsToEquip: ["HogtieLower", "HogtieUpper"], + // handcuffers will only do this if you are fighting back + unlimited: true, + enemyTags: {"chainRestraints":1, "handcuffer":0.1, "hogtieLink": 1}, playerTags: {}, playerTagsMissing: {PlayerCombat: -0.1}, + maxwill: 0.1, + DefaultLock: "White", + events: [ + {trigger: "postRemoval", type: "RequireHogtie"} + ] + }, + + {name: "AnkleLink", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", LinkableBy: [...KDBindableMinusCuffs], + sfx: "Chain", + sfxGroup: "Chains", + binding: true, + Model: "AnkleLink", alwaysRender: true, + UnderlinkedAlwaysRender: true, + struggleBreak: true, + linkSize: 0.6, linkCategory: "AnkleLink", + requireSingleTagToEquip: ["AnkleCuffsBase"], + Type: "Chained", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], + Group: "ItemFeet", hobble: 1, power: 2, weight: 0, + escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, + enemyTags: {jailer: 0.1, leashing: 0.1, linkRegular: 40, handcuffer: 40, shackleRestraints: 40, chainRestraints: 40, "feetLink": 10}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["AnkleLink", "Link", "Metal"], + DefaultLock: "White", + unlimited: true, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseAnkleCuffs", inheritLinked: true} + ]}, + {name: "AnkleLinkShort", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", LinkableBy: [...KDBindableMinusCuffs], + sfx: "Chain", + sfxGroup: "Chains", + binding: true, + Type: "Closed", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], + UnderlinkedAlwaysRender: true, + Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 3, weight: 0, + escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, + minLevel: 0, allFloors: true, shrine: ["AnkleLink", "Link", "Metal",], + linkSize: 0.6, linkCategory: "AnkleLink", + struggleBreak: true, + requireSingleTagToEquip: ["AnkleCuffsBase"], + enemyTags: {jailer: 0.1, linkTight: 40, handcuffer: 20, shackleRestraints: 20, chainRestraints: 20, "feetLink": 1}, playerTags: {}, + maxwill: 0.2, + DefaultLock: "White", + unlimited: true, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"} + ]}, + + + {name: "WristLink", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", + sfx: "Chain", + sfxGroup: "Chains", + binding: true, + Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindableMinusCuffs], + UnderlinkedAlwaysRender: true, + Color: ['#FFFFFF', '#CFBE88', '#000000'], + Group: "ItemArms", bindarms: true, power: 3, weight: 0, + escapeChance: {"Struggle": -0.1, "Cut": -0.3, "Remove": 0.2, "Pick": 0.25}, + helpChance: {"Remove": 0.4}, + minLevel: 0, floors: KDMapInit([]), shrine: ["WristLink", "Link", "Metal", "HogtieUpper"], + linkSize: 0.6, linkCategory: "ArmLink", + struggleBreak: true, + requireSingleTagToEquip: ["ArmCuffsBase"], + enemyTags: {jailer: 0.1, leashing: 0.1, linkRegular: 40, handcuffer: 40, shackleRestraints: 40, chainRestraints: 40, armLink: 10}, playerTags: {}, + maxwill: 0.7, + allFloors: true, + DefaultLock: "White", + unlimited: true, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseArmCuffs", inheritLinked: true}, + {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true} + ]}, + {name: "ElbowLink", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", + sfx: "Chain", + sfxGroup: "Chains", + binding: true, + Type: "Both", LinkableBy: [...KDElbowBind, ...KDBindableMinusCuffs], + UnderlinkedAlwaysRender: true, + Color: ['#FFFFFF', '#CFBE88', '#000000'], + Group: "ItemArms", bindarms: true, power: 4, weight: 0, strictness: 0.1, + addPose: ["HandsBehind"], + alwaysRender: true, + linkSize: 0.6, linkCategory: "ElbowLink", + struggleBreak: true, + requireSingleTagToEquip: ["ArmCuffsBase"], + escapeChance: {"Struggle": -0.175, "Cut": -0.3, "Remove": -0.1, "Pick": 0.25}, + helpChance: {"Remove": 0.4}, + enemyTags: {jailer: 0.1, linkTight: 40, handcuffer: 10, shackleRestraints: 10, chainRestraints: 10, "armLink": 1}, playerTags: {}, + minLevel: 0, floors: KDMapInit([]), shrine: ["ElbowLink", "Link", "Metal", "ElbowTied"], + maxwill: 0.5, + allFloors: true, + DefaultLock: "White", + unlimited: true, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseArmCuffs", inheritLinked: true}, + {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true} + ]}, + + + + //endregion + + + + // regiuon CyberLinks + {name: "CyberThighLink", accessible: true, Asset: "FuturisticLegCuffs", debris: "Chains", LinkableBy: [...KDBindable, ...KDDevices], + binding: true, + sfx: "BeepEngage", + sfxRemove: "Crackling", + Model: "CyberThighLink", alwaysRender: true, + linkSize: 0.55, linkCategory: "LegLink", noDupe: true, + Type: "Chained", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], + Group: "ItemLegs", hobble: 1, power: 6, weight: 0, + minLevel: 7, allFloors: true, shrine: ["ThighLink", "CyberLink", "Link", "Metal", "Cuffs", "ControlHLeg"], + escapeChance: {"Struggle": -1.05, "Cut": -0.4, "Remove": 0.2, "Pick": 0.05}, + enemyTags: {"cyberLink": 10, "controlHarness" : 20, "roboPrisoner" : 10}, playerTags: {}, + DefaultLock: "Cyber", + requireAllTagsToEquip: ["CyberLegCuffs", "LegCuffsBase"], + unlimited: true, + UnderlinkedAlwaysRender: true, + factionFilters: { + Tether: {color: "Highlight", override: true}, + Glow: {color: "Highlight", override: false}, + }, + events: [ + {trigger: "tick", type: "tetherRegen", power: 0.1, count: 3, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "tetherDamage", mult: 1.0, subMult: 2.1, count: 5, inheritLinked: true}, + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseLegCuffs", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireTag", requiredTag: "CyberLegCuffs", inheritLinked: true}, + ]}, + + + {name: "CyberHogtieLink", + sfx: "BeepEngage", + sfxRemove: "Crackling", + binding: true, + UnderlinkedAlwaysRender: true, + debris: "Chains", accessible: true, + Asset: "HempRope", Type: "Hogtied", Color: "Default", + Group: "ItemFeet", power: 9, weight: 0, + struggleMult: {"Struggle": 0.4, "Remove": 0.3, "Cut": 7}, + escapeChance: {"Struggle": -1.0, "Cut": -0.3, "Remove": 0.3, "Pick": 0.25}, + limitChance: {"Struggle": 0.8}, + affinity: {Remove: ["Hook"],}, + minLevel: 12, allFloors: true, shrine: ["CyberLink", "Chains", "Link", "Metal", "Hogties"], + linkCategory: "Hogtie", linkSize: 0.51, + LinkAll: true, + noDupe: true, + addPose: ["HandsBehind"], + struggleBreak: true, + requireAllTagsToEquip: ["CyberAnkleCuffs", "CyberWristCuffs", "HogtieLower", "HogtieUpper"], + // handcuffers will only do this if you are fighting back + unlimited: true, + enemyTags: {"cyberhogtie" : 1}, playerTags: {}, playerTagsMissing: {PlayerCombat: -0.1}, + maxwill: 0.1, + DefaultLock: "Cyber", + events: [ + {trigger: "tick", type: "tetherRegen", power: 0.1, count: 5, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "tetherDamage", mult: 1.0, subMult: 2.1, count: 7.5, inheritLinked: true}, + {trigger: "postRemoval", type: "RequireHogtie"}, + {trigger: "postRemoval", type: "RequireTag", requiredTag: "CyberWristCuffs", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireTag", requiredTag: "CyberAnkleCuffs", inheritLinked: true}, + ] + }, + + {name: "CyberAnkleLink", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", LinkableBy: [...KDBindableMinusCuffs], + sfx: "BeepEngage", + sfxRemove: "Crackling", + binding: true, + Model: "CyberAnkleLink", alwaysRender: true, + UnderlinkedAlwaysRender: true, + struggleBreak: true, + factionFilters: { + Tether: {color: "Highlight", override: true}, + Glow: {color: "Highlight", override: false}, + }, + linkSize: 0.6, linkCategory: "AnkleLink", + requireAllTagsToEquip: ["CyberAnkleCuffs", "AnkleCuffsBase"], + Type: "Chained", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], + Group: "ItemFeet", hobble: 1, power: 6, weight: 0, + escapeChance: {"Struggle": -1.1, "Cut": -0.4, "Remove": 0.2, "Pick": 0}, + enemyTags: {"cyberLink": 10, "controlHarness" : 20, "roboPrisoner" : 10}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["CyberLink", "AnkleLink", "Link", "Metal", "ControlHAnkle"], + DefaultLock: "Cyber", + unlimited: true, + events: [ + {trigger: "tick", type: "tetherRegen", power: 0.1, count: 10, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "tetherDamage", mult: 1.0, subMult: 2.1, count: 15, inheritLinked: true}, + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseAnkleCuffs", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireTag", requiredTag: "CyberAnkleCuffs", inheritLinked: true}, + ]}, + {name: "CyberAnkleLinkShort", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", LinkableBy: [...KDBindableMinusCuffs], + sfx: "BeepEngage", + sfxRemove: "Crackling", + binding: true, + Type: "Closed", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], + UnderlinkedAlwaysRender: true, + Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"], power: 7, weight: 0, strictness: 0.05, + escapeChance: {"Struggle": -1.5, "Cut": -0.37, "Remove": -0.1, "Pick": 0}, + minLevel: 0, allFloors: true, shrine: ["CyberLink", "AnkleLink", "Link", "Metal", "ControlHAnkle"], + linkSize: 0.6, linkCategory: "AnkleLink", + struggleBreak: true, + requireAllTagsToEquip: ["CyberAnkleCuffs", "AnkleCuffsBase"], + enemyTags: {}, playerTags: {}, + maxwill: 0.2, + DefaultLock: "Cyber", + unlimited: true, + events: [ + {trigger: "tick", type: "tetherRegen", power: 0.1, count: 2.5, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "tetherDamage", mult: 1.0, subMult: 2.1, count: 3.5, inheritLinked: true}, + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireTag", requiredTag: "CyberAnkleCuffs", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseAnkleCuffs"} + ]}, + + + {name: "CyberWristLink", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", + sfx: "BeepEngage", + sfxRemove: "Crackling", + binding: true, + Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindableMinusCuffs], + UnderlinkedAlwaysRender: true, + Color: ['#FFFFFF', '#CFBE88', '#000000'], + Group: "ItemArms", bindarms: true, power: 6, weight: 0, + escapeChance: {"Struggle": -0.9, "Cut": -0.4, "Remove": -0.1, "Pick": 0.05}, + helpChance: {"Remove": 0.4}, + minLevel: 0, floors: KDMapInit([]), shrine: ["CyberLink", "WristLink", "Link", "Metal", "HogtieUpper", "ControlHArm"], + linkSize: 0.6, linkCategory: "ArmLink", + struggleBreak: true, + requireAllTagsToEquip: ["CyberWristCuffs", "ArmCuffsBase"], + enemyTags: {"cyberLink": 10, "controlHarness" : 20, "roboPrisoner" : 10}, playerTags: {}, + maxwill: 0.7, + allFloors: true, + DefaultLock: "Cyber", + unlimited: true, + events: [ + {trigger: "tick", type: "tetherRegen", power: 0.1, count: 5, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "tetherDamage", mult: 1.0, subMult: 2.1, count: 7, inheritLinked: true}, + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseArmCuffs", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireTag", requiredTag: "CyberWristCuffs", inheritLinked: true}, + {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true} + ]}, + {name: "CyberElbowLink", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", + sfx: "BeepEngage", + sfxRemove: "Crackling", + binding: true, + Type: "Both", LinkableBy: [...KDElbowBind, ...KDBindableMinusCuffs], + UnderlinkedAlwaysRender: true, + Color: ['#FFFFFF', '#CFBE88', '#000000'], + Group: "ItemArms", bindarms: true, power: 7, weight: 0, strictness: 0.125, + addPose: ["HandsBehind"], + alwaysRender: true, + linkSize: 0.6, linkCategory: "ElbowLink", + struggleBreak: true, + requireAllTagsToEquip: ["CyberWristCuffs", "ArmCuffsBase"], + escapeChance: {"Struggle": -1.1, "Cut": -0.37, "Remove": -0.2, "Pick": 0.25}, + helpChance: {"Remove": 0.4}, + enemyTags: {"cyberLink": 1, "controlHarness" : 2, "roboPrisoner" : 1}, playerTags: {}, + minLevel: 0, floors: KDMapInit([]), shrine: ["CyberLink", "ElbowLink", "Link", "Metal", "ElbowTied", "ControlHArm"], + maxwill: 0.5, + allFloors: true, + DefaultLock: "Cyber", + unlimited: true, + events: [ + {trigger: "tick", type: "tetherRegen", power: 0.1, count: 3, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "tetherDamage", mult: 1.0, subMult: 2.1, count: 5, inheritLinked: true}, + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseArmCuffs", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireTag", requiredTag: "CyberWristCuffs", inheritLinked: true}, + {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true} + ]}, + + + + //endregion + + //region Warden + + {inventory: true, name: "WardenBelt", Asset: "Default", Color: "Default", + Model: "IronBelt", + UnderlinkedAlwaysRender: true, + Filters: { + BaseMetal: {"gamma":1.2833333333333334,"saturation":1,"contrast":1.45,"brightness":1,"red":2,"green":1.5,"blue":1,"alpha":1}, + }, + + accessible: true, + cloneTag: "wardenCuffs", + special: true, + + debris: "Chains", + Group: "ItemTorso", + LinkableBy: [...KDBeltLink], renderWhenLinked: [...KDBeltLink], + + curse: "SpellLock8", + power: 26, weight: 100, DefaultLock: "Gold", + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + struggleBreak: true, + tightType: "Secure", + + maxwill: 0.6, enemyTags: {"wardenBelt":10}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Belt", "Warden"], + events: [ + {trigger: "tick", type: "livingRestraints", tags: [], cloneTags: [], inheritLinked: true, frequencyMax: 60, frequencyMin: 10, frequencyStep: 0.9, count: 4} + ] + }, + {inventory: true, name: "WardenBelt2", Asset: "Default", Color: "Default", + Model: "IronBelt", + UnderlinkedAlwaysRender: true, + Filters: { + BaseMetal: {"gamma":1.2833333333333334,"saturation":1,"contrast":1.45,"brightness":1,"red":2,"green":1.5,"blue":1,"alpha":1}, + }, + + cloneTag: "wardenCuffs", + accessible: true, + special: true, + + debris: "Chains", + Group: "ItemTorso", + LinkableBy: [...KDBeltLink], renderWhenLinked: [...KDBeltLink], + AlwaysLinkable: true, + + curse: "SpellLock8", + power: 26, weight: 100, DefaultLock: "Gold", + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + struggleBreak: true, + tightType: "Secure", + + enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Belt", "Warden"], + events: [ + {type: "Buff", trigger: "tick", power: 1, buffType: "DivinePrivilege", inheritLinked: true,}, + ], + }, + + + + {name: "WardenThighLink", accessible: true, Asset: "FuturisticLegCuffs", debris: "Chains", LinkableBy: [...KDBindable, ...KDDevices], + Model: "ThighLink", alwaysRender: true, + binding: true, + UnderlinkedAlwaysRender: true, + noDupe: true, + Type: "Chained", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], + Group: "ItemLegs", hobble: 1, power: 1, weight: 0, + minLevel: 0, allFloors: true, shrine: ["ThighLink", "Link", "Metal", "Cuffs"], + escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, + enemyTags: {wardenLink: 10}, playerTags: {}, + + + curse: "SpellLock1", + DefaultLock: "White", + requireSingleTagToEquip: ["LegCuffsBase"], + Filters: { + ThighLink: {"gamma":1.2833333333333334,"saturation":1,"contrast":1.45,"brightness":1,"red":2,"green":1.5,"blue":1,"alpha":1}, + }, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseLegCuffs", inheritLinked: true}, + {trigger: "tick", type: "wardenMelt", power: 0.1, count: 8, inheritLinked: true}, + ]}, + + {name: "WardenAnkleLink", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", LinkableBy: [...KDBindableMinusCuffs], + Model: "AnkleLink", alwaysRender: true, + binding: true, + struggleBreak: true, + UnderlinkedAlwaysRender: true, + noDupe: true, + requireSingleTagToEquip: ["AnkleCuffsBase"], + Type: "Chained", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], + Group: "ItemFeet", hobble: 1, power: 1, weight: 0, + escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, + enemyTags: {wardenLink: 10}, playerTags: {}, + minLevel: 0, allFloors: true, shrine: ["AnkleLink", "Link", "Metal"], + DefaultLock: "White", + curse: "SpellLock1", + Filters: { + ThighLink: {"gamma":1.2833333333333334,"saturation":1,"contrast":1.45,"brightness":1,"red":2,"green":1.5,"blue":1,"alpha":1}, + }, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseAnkleCuffs", inheritLinked: true}, + ]}, + {name: "WardenAnkleLinkShort", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", LinkableBy: [...KDBindableMinusCuffs], + Type: "Closed", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], + UnderlinkedAlwaysRender: true, + binding: true, + Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 2, weight: 0, + escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, + minLevel: 0, allFloors: true, shrine: ["AnkleLink", "Link", "Metal",], + noDupe: true, + struggleBreak: true, + requireSingleTagToEquip: ["AnkleCuffsBase"], + enemyTags: {wardenLink: 10}, playerTags: {}, + maxwill: 0.2, + DefaultLock: "White", + Filters: { + ThighLink: {"gamma":1.2833333333333334,"saturation":1,"contrast":1.45,"brightness":1,"red":2,"green":1.5,"blue":1,"alpha":1}, + }, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseAnkleCuffs", inheritLinked: true}, + {trigger: "tick", type: "wardenMelt", power: 0.1, count: 8, inheritLinked: true}, + ]}, + + {name: "WardenWristLink", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", + Type: "Wrist", LinkableBy: [...KDElbowBind, ...KDBoxBind, ...KDBindableMinusCuffs], + Color: ['#FFFFFF', '#CFBE88', '#000000'], + binding: true, + UnderlinkedAlwaysRender: true, + Group: "ItemArms", bindarms: true, power: 1, weight: 0, + escapeChance: {"Struggle": -0.1, "Cut": -0.3, "Remove": 0.2, "Pick": 0.25}, + helpChance: {"Remove": 0.4}, + minLevel: 0, floors: KDMapInit([]), shrine: ["WristLink", "Link", "Metal", "HogtieUpper"], + noDupe: true, + allFloors: true, + struggleBreak: true, + requireSingleTagToEquip: ["ArmCuffsBase"], + enemyTags: {wardenLink: 10}, playerTags: {}, + maxwill: 0.7, + DefaultLock: "White", + Filters: { + ThighLink: {"gamma":1.2833333333333334,"saturation":1,"contrast":1.45,"brightness":1,"red":2,"green":1.5,"blue":1,"alpha":1}, + }, + curse: "SpellLock1", + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseArmCuffs", inheritLinked: true}, + {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.08, inheritLinked: true}, + {trigger: "tick", type: "wardenMelt", power: 0.1, count: 8, inheritLinked: true}, + ]}, + {name: "WardenElbowLink", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", + Type: "Both", LinkableBy: [...KDElbowBind, ...KDBindableMinusCuffs], + UnderlinkedAlwaysRender: true, + binding: true, + Color: ['#FFFFFF', '#CFBE88', '#000000'], + Group: "ItemArms", bindarms: true, power: 2, weight: 0, strictness: 0.1, + addPose: ["HandsBehind"], + alwaysRender: true, + noDupe: true, + allFloors: true, + struggleBreak: true, + requireSingleTagToEquip: ["ArmCuffsBase"], + escapeChance: {"Struggle": -0.175, "Cut": -0.3, "Remove": -0.1, "Pick": 0.25}, + helpChance: {"Remove": 0.4}, + enemyTags: {wardenLink: 10}, playerTags: {}, + minLevel: 0, floors: KDMapInit([]), shrine: ["ElbowLink", "Link", "Metal", "ElbowTied"], + maxwill: 0.5, + DefaultLock: "White", + Filters: { + ThighLink: {"gamma":1.2833333333333334,"saturation":1,"contrast":1.45,"brightness":1,"red":2,"green":1.5,"blue":1,"alpha":1}, + }, + events: [ + {trigger: "postUnlock", type: "RequireLocked", inheritLinked: true}, + {trigger: "postRemoval", type: "RequireBaseArmCuffs", inheritLinked: true}, + {trigger: "beforeStruggleCalc", type: "wristCuffsBlock", power: 0.12, inheritLinked: true}, + ]}, + + + // endregion + + //region TemplateCuffs + {inventory: true, name: "TemplateLivingCollar", debris: "Fabric", Asset: "LatexCollar2", factionColor: [[], [0]], Color: "Default", Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 9, weight: 4, DefaultLock: "Blue", + Model: "ElfCollarRestraint", + escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, + unlimited: true, + struggleBreak: true, + UnderlinkedAlwaysRender: true, + tightType: "Secure", + maxwill: 0.25, enemyTags: {"livingCollar":10}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["Collars"], + events: [{trigger: "tick", type: "livingRestraints", tags: [], cloneTags: [], inheritLinked: true, frequencyMax: 60, frequencyMin: 10, frequencyStep: 0.9, count: 4}] + }, + {inventory: true, name: "TemplateLegCuffs", debris: "Chains", accessible: true, Asset: "FuturisticLegCuffs", + LinkAll: true, + struggleBreak: true, + UnderlinkedAlwaysRender: true, + linkCategory: "LegCuffs", linkSize: 0.4, noDupe: true, + Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], Group: "ItemLegs", power: 9, weight: 0, + escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, + renderWhenLinked: [...KDBindable], + maxwill: 0.6, enemyTags: {}, playerTags: {"ItemLegsFull":-2}, minLevel: 4, allFloors: true, shrine: ["Cuffs", "Metal", "LegCuffsBase"]}, + + {inventory: true, name: "TemplateAnkleCuffs", debris: "Chains", accessible: true, Asset: "FuturisticAnkleCuffs", Type: "Chained", Color: ['#888888', '#FFFFFF', '#CFBE88', '#000000'], Group: "ItemFeet", power: 9, weight: 0, + LinkAll: true, + struggleBreak: true, + UnderlinkedAlwaysRender: true, + linkCategory: "AnkleCuffs", linkSize: 0.4, noDupe: true, + renderWhenLinked: [...KDBindable], + escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.2, "Pick": 0.25}, enemyTags: {}, playerTags: {"ItemFeetFull":-2}, minLevel: 0, allFloors: true, shrine: ["Cuffs", "Metal", "AnkleCuffsBase", "HogtieLower"], + maxwill: 0.5}, + {nonbinding: true, inventory: true, name: "TemplateArmCuffs", debris: "Chains", accessible: true, Asset: "FuturisticCuffs", linkCategory: "Cuffs", linkSize: 0.55, + unlimited: true, + recycleresource: { + Leather: 10, + Metal: 4, + }, + renderWhenLinked: [...KDBindable], + UnderlinkedAlwaysRender: true, + struggleBreak: true, + LinkAll: true, Color: ['#FFFFFF', '#CFBE88', '#000000'], Group: "ItemArms", bindarms: false, power: 9, weight: 0, + escapeChance: {"Struggle": -0.5, "Cut": -0.2, "Remove": 0.25, "Pick": 0.35}, enemyTags: {}, playerTags: {"ItemArmsFull":-2}, minLevel: 0, allFloors: true, shrine: ["Cuffs", "Metal", "ArmCuffsBase"], + maxwill: 0.4}, + + //endregion + + //region VinePlant + + + {renderWhenLinked: ["Corsets", "Harnesses", ...KDBindable, "Latex", "Leather", "Metal", "Rope"], name: "VineSuspension", + inaccessible: true, + factionColor: [[0]], Asset: "TransparentCatsuit", AssetGroup: "Suit", Color: ["#3873C3"], + Group: "ItemDevices", power: 10, weight: 0, escapeChance: {"Struggle": -0.1, "Cut": 1.0, "Remove": -0.3}, + enemyTags: {vineSuspend: 100}, + playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Furniture", "VineSuspend", "BlockKneel"], ignoreSpells: true, removeOnLeash: true, immobile: true, + alwaysEscapable: ["Struggle"], + struggleMinSpeed: { + Struggle: 0.06, + }, + struggleMaxSpeed: { + Struggle: 0.4, + }, + limitChance: { + Struggle: -0.01, + }, + Model: "RopeSuspension", + Filters: { + Rope: {"gamma":1,"saturation":1,"contrast":1.85,"brightness":1,"red":1,"green":2.8833333333333333,"blue":1.6833333333333333,"alpha":1}, + }, + events: [ + {trigger: "playerMove", type: "removeOnMove", inheritLinked: true}, + ] + }, + + {unlimited: true, removePrison: true, name: "VinePlantArms", accessible: true, Asset: "NylonRope", Color: ["#006722", "#006722"], Group: "ItemArms", debris: "Vines", + affinity: {Remove: ["Hook"],}, + Model: "RopeBoxtie3", + struggleBreak: true, + Filters: { + Rope: {"gamma":1,"saturation":1,"contrast":1.85,"brightness":1,"red":1,"green":2.8833333333333333,"blue":1.6833333333333333,"alpha":1}, + }, + bindarms: true, power: 0.1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.8, "Remove": 0.2}, enemyTags: {"vineRestraints":4}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Vines", "Will"]}, + {unlimited: true, removePrison: true, name: "VinePlantFeet", accessible: true, Asset: "NylonRope", Color: ["#006722", "#006722"], Group: "ItemFeet", debris: "Vines", + Model: "RopeAnkles3", + struggleBreak: true, + Filters: { + Rope: {"gamma":1,"saturation":1,"contrast":1.85,"brightness":1,"red":1,"green":2.8833333333333333,"blue":1.6833333333333333,"alpha":1}, + }, + affinity: {Remove: ["Hook"],}, + blockfeet: true, addTag: ["FeetLinked"],power: 0.1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.8, "Remove": 0.2}, enemyTags: {"vineRestraints":4}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Vines", "Will"]}, + {unlimited: true, removePrison: true, name: "VinePlantLegs", accessible: true, Asset: "NylonRope", Color: ["#006722", "#006722"], Group: "ItemLegs", debris: "Vines", + Model: "RopeLegs3", + struggleBreak: true, + Filters: { + Rope: {"gamma":1,"saturation":1,"contrast":1.85,"brightness":1,"red":1,"green":2.8833333333333333,"blue":1.6833333333333333,"alpha":1}, + }, + affinity: {Remove: ["Hook"],}, + hobble: 1, addTag: ["FeetLinked"], power: 0.1, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.8, "Remove": 0.2}, enemyTags: {"vineRestraints":4}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Vines", "Will"]}, + {unlimited: true, removePrison: true, name: "VinePlantTorso", accessible: true, Asset: "NylonRopeHarness", Type: "Diamond", OverridePriority: 26, Color: ["#006722", "#006722"], Group: "ItemTorso", debris: "Vines", + Model: "RopeHarness", + struggleBreak: true, + restriction: 4, + Filters: { + Rope: {"gamma":1,"saturation":1,"contrast":1.85,"brightness":1,"red":1,"green":2.8833333333333333,"blue":1.6833333333333333,"alpha":1}, + }, + affinity: {Remove: ["Hook"],}, + harness: true, power: 0.1, weight: 0, strictness: 0.05, escapeChance: {"Struggle": 0.3, "Cut": 0.8, "Remove": 0.2}, enemyTags: {"vineRestraints":4}, playerTags: {"ItemTorsoFull":-3}, minLevel: 0, allFloors: true, shrine: ["Rope", "Ties", "Vines", "Will"]}, + //endregion + + //region Chain + {inventory: true, name: "ChainArms", debris: "Chains", + accessible: true, sfx: "Chain", Asset: "Chains", Type: "WristElbowHarnessTie", LinkableBy: ["Armbinders", "Wrapping", "Encase",], + Color: "Default", Group: "ItemArms", bindarms: true, power: 5, weight: 0, + escapeChance: {"Struggle": 0.1, "Cut": -0.1, "Remove": 0.3, "Pick": 1.5}, + Model: "RopeBoxtie2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":2.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + maxwill: 0.8, enemyTags: {"chainRestraints":2}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Wristties"]}, + {inventory: true, name: "ChainLegs", debris: "Chains", accessible: true, sfx: "Chain", Asset: "Chains", Type: "Strict", Color: "Default", LinkableBy: ["Legbinders", "Hobbleskirts"], + Model: "RopeLegs2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":2.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 5, weight: 0, escapeChance: {"Struggle": 0.15, "Cut": -0.1, "Remove": 0.3, "Pick": 1.5}, enemyTags: {"chainRestraints":2}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal"]}, + {inventory: true, name: "ChainFeet", debris: "Chains", accessible: true, sfx: "Chain", Asset: "Chains", Color: "Default", LinkableBy: ["Wrapping", "Hogties", "Encase", "Belts"], + Model: "RopeAnkles2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":2.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 5, weight: 0, escapeChance: {"Struggle": 0.03, "Cut": -0.1, "Remove": 0.3, "Pick": 1.5}, enemyTags: {"chainRestraints":2}, playerTags: {"ItemFeetFull":-1}, playerTagsMissingMult: {"ItemLegsFull":0.05}, minLevel: 0, allFloors: true, + shrine: ["Chains", "Ties","Metal", "HogtieLower"]}, + {inventory: true, name: "ChainCrotch", debris: "Chains", accessible: true, sfx: "Chain", Asset: "CrotchChain", crotchrope: true, strictness: 0.15, + Model: "RopeCrotch", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":1,"saturation":0,"contrast":2.033333333333333,"brightness":2.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + strictnessZones: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], OverridePriority: 26, Color: "Default", Group: "ItemTorso", power: 3, weight: 0, harness: true, escapeChance: {"Struggle": 0.03, "Cut": -0.1, "Remove": 0.3, "Pick": 1.5}, enemyTags: {"chainRestraints":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal"]}, + //endregion + + //region MagicChain + {unlimited: true, inventory: true, removePrison: true, sfx: "Chain", name: "MagicChainArms", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Armbinders", "Wrapping", "Encase",], Type: "WristElbowHarnessTie", Color: "#aa00aa", Group: "ItemArms", bindarms: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": -0.1, "Remove": -0.05}, + Model: "RopeBoxtie2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":0.7333333333333334,"saturation":0,"contrast":1.4166666666666665,"brightness":2.1333333333333333,"red":1.3333333333333333,"green":1,"blue":3.416666666666667,"alpha":1}, + }, + failSuffix: {"Remove": "MagicChain"}, maxwill: 0.9, enemyTags: {"chainRestraintsMagic":2}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Conjure", "Wristties"]}, + {unlimited: true, inventory: true, removePrison: true, sfx: "Chain", name: "MagicChainLegs", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Legbinders", "Hobbleskirts"], + Model: "RopeLegs2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":0.7333333333333334,"saturation":0,"contrast":1.4166666666666665,"brightness":2.1333333333333333,"red":1.3333333333333333,"green":1,"blue":3.416666666666667,"alpha":1}, + }, + Type: "Strict", Color: "#aa00aa", Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 4, weight: 0, + failSuffix: {"Remove": "MagicChain"}, escapeChance: {"Struggle": 0.3, "Cut": -0.1, "Remove": -0.05}, enemyTags: {"chainRestraintsMagic":2}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Conjure"]}, + {unlimited: true, inventory: true, removePrison: true, sfx: "Chain", name: "MagicChainFeet", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Wrapping", "Hogties", "Encase",], Color: "#aa00aa", + Model: "RopeAnkles2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":0.7333333333333334,"saturation":0,"contrast":1.4166666666666665,"brightness":2.1333333333333333,"red":1.3333333333333333,"green":1,"blue":3.416666666666667,"alpha":1}, + }, + Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 4, weight: 0, playerTagsMissingMult: {"ItemLegsFull":0.05}, + failSuffix: {"Remove": "MagicChain"}, escapeChance: {"Struggle": 0.2, "Cut": -0.1, "Remove": -0.05}, enemyTags: {"chainRestraintsMagic":2}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, + shrine: ["Chains", "Ties","Metal", "Conjure", "HogtieLower"]}, + {unlimited: true, inventory: true, removePrison: true, sfx: "Chain", name: "MagicChainCrotch", debris: "Chains", accessible: true, crotchrope: true, strictness: 0.15, strictnessZones: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Asset: "CrotchChain", OverridePriority: 26, Color: "#aa00aa", Group: "ItemTorso", power: 2, weight: 0, + Model: "RopeCrotch", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":0.7333333333333334,"saturation":0,"contrast":1.4166666666666665,"brightness":2.1333333333333333,"red":1.3333333333333333,"green":1,"blue":3.416666666666667,"alpha":1}, + }, + failSuffix: {"Remove": "MagicChain"}, escapeChance: {"Struggle": 0.2, "Cut": -0.1, "Remove": -0.05}, enemyTags: {"chainRestraintsMagic":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 0, allFloors: true, shrine: ["RopeCrotch", "Chains", "Ties","Metal", "Conjure"], + events: [{trigger: "struggle", type: "crotchrope"}]}, + //endregion + + //region ShadowChain + {unlimited: true, removePrison: true, sfx: "Chain", name: "ShadowChainArms", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Boxbinders", "Wrapping", "Encase",], Type: "BoxTie", Color: "#000000", Group: "ItemArms", bindarms: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": -0.1, "Remove": -0.1}, + Model: "RopeBoxtie2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":0.7333333333333334,"saturation":0,"contrast":1.4166666666666665,"brightness":2.1333333333333333,"red":0.6333333333333334,"green":0.15,"blue":3.0833333333333335,"alpha":1}, + }, + maxwill: 0.9, enemyTags: {"shadowRestraints":2}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion", "HogtieUpper"]}, + {unlimited: true, removePrison: true, sfx: "Chain", name: "ShadowChainLegs", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Legbinders", "Hobbleskirts"], + Model: "RopeLegs2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":0.7333333333333334,"saturation":0,"contrast":1.4166666666666665,"brightness":2.1333333333333333,"red":0.6333333333333334,"green":0.15,"blue":3.0833333333333335,"alpha":1}, + }, + Type: "Strict", Color: "#000000", Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": -0.1, "Remove": -0.1}, enemyTags: {"shadowRestraints":2}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion"]}, + {unlimited: true, removePrison: true, sfx: "Chain", name: "ShadowChainFeet", debris: "Chains", accessible: true, Asset: "Chains", LinkableBy: ["Wrapping", "Encase", "Hogties"], Color: "#000000", + Model: "RopeAnkles2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":0.7333333333333334,"saturation":0,"contrast":1.4166666666666665,"brightness":2.1333333333333333,"red":0.6333333333333334,"green":0.15,"blue":3.0833333333333335,"alpha":1}, + }, + Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 4, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": -0.1, "Remove": -0.1}, enemyTags: {"shadowRestraints":2}, playerTags: {"ItemFeetFull":-1}, playerTagsMissingMult: {"ItemLegsFull":0.05}, minLevel: 0, allFloors: true, + shrine: ["Chains", "Ties","Metal", "Illusion", "HogtieLower"]}, + {unlimited: true, removePrison: true, sfx: "Chain", name: "ShadowChainCrotch", debris: "Chains", accessible: true, crotchrope: true, strictness: 0.15, + Model: "RopeCrotch", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":0.7333333333333334,"saturation":0,"contrast":1.4166666666666665,"brightness":2.1333333333333333,"red":0.6333333333333334,"green":0.15,"blue":3.0833333333333335,"alpha":1}, + }, + strictnessZones: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Asset: "CrotchChain", OverridePriority: 26, Color: "#000000", Group: "ItemTorso", power: 2, weight: 0, escapeChance: {"Struggle": 0.2, "Cut": -0.1, "Remove": -0.1}, enemyTags: {"shadowRestraints":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 0, allFloors: true, shrine: ["RopeCrotch", "Chains", "Ties","Metal", "Illusion"], + events: [{trigger: "struggle", type: "crotchrope"}]}, + //endregion + + //region GhostChain + {unlimited: true, removePrison: true, sfx: "Chain", name: "GhostChainArms", accessible: true, Asset: "Chains", LinkableBy: ["Boxbinders", "Wrapping", "Encase",], Type: "BoxTie", Color: "#cccccc", Group: "ItemArms", bindarms: true, power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.2, "Remove": 0.1}, + Model: "RopeBoxtie2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":1.6500000000000001,"saturation":0,"contrast":2.033333333333333,"brightness":2.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + maxwill: 0.9, enemyTags: {"ghostRestraints":2}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion", "HogtieUpper"]}, + {unlimited: true, removePrison: true, sfx: "Chain", name: "GhostChainLegs", accessible: true, Asset: "Chains", LinkableBy: ["Legbinders", "Hobbleskirts"], Type: "Strict", Color: "#cccccc", + Model: "RopeLegs2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":1.6500000000000001,"saturation":0,"contrast":2.033333333333333,"brightness":2.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Group: "ItemLegs", hobble: 1, addTag: ["FeetLinked"], power: 4, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.2, "Remove": 0.1}, enemyTags: {"ghostRestraints":2}, playerTags: {"ItemLegsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Chains", "Ties","Metal", "Illusion"]}, + {unlimited: true, removePrison: true, sfx: "Chain", name: "GhostChainFeet", accessible: true, Asset: "Chains", LinkableBy: ["Wrapping", "Encase", "Hogties"], Color: "#cccccc", + Model: "RopeAnkles2", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":1.6500000000000001,"saturation":0,"contrast":2.033333333333333,"brightness":2.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Group: "ItemFeet", blockfeet: true, addTag: ["FeetLinked"],power: 4, weight: 0, playerTagsMissingMult: {"ItemLegsFull":0.05}, escapeChance: {"Struggle": 0.3, "Cut": 0.2, "Remove": 0.1}, enemyTags: {"ghostRestraints":2}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, + shrine: ["Chains", "Ties","Metal", "Illusion", "HogtieLower"]}, + {unlimited: true, removePrison: true, sfx: "Chain", name: "GhostChainCrotch", accessible: true, crotchrope: true, strictness: 0.15, + Model: "RopeCrotch", + struggleBreak: true, + sfxGroup: "Chains", + Filters: { + Rope: {"gamma":1.6500000000000001,"saturation":0,"contrast":2.033333333333333,"brightness":2.1333333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + }, + strictnessZones: ["ItemVulva", "ItemVulvaPiercings", "ItemButt"], Asset: "CrotchChain", OverridePriority: 26, Color: "#cccccc", Group: "ItemTorso", power: 2, weight: 0, escapeChance: {"Struggle": 0.3, "Cut": 0.2, "Remove": 0.1}, enemyTags: {"ghostRestraints":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 0, allFloors: true, shrine: ["RopeCrotch", "Chains", "Ties","Metal", "Illusion"], + events: [{trigger: "struggle", type: "crotchrope"}]}, + //endregion + + {removePrison: true, divine: true, name: "DivineCuffs", accessible: true, Asset: "FuturisticCuffs", + LinkableBy: ["Boxbinders", "Armbinders", ...KDBindable], + DefaultLock: "Divine2", Type: "Wrist", Color: ['#6AB0ED', '#AE915C', '#FFFFFF'], Group: "ItemArms", bindarms: true, power: 49, weight: 0, + Model: "DivineCuffsArms", + specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": 1, Pick: -100}, enemyTags: {"divineRestraints":2}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Metal", "Latex", "Leather", "HogtieLower"]}, + + {inventory: true, arousalMode: true, name: "DivineBelt", Asset: "OrnateChastityBelt", OverridePriority: 26, Color: ["#272727", "#D3B24B"], Group: "ItemPelvis", chastity: true, + power: 49, weight: 0, + special: true, + alwaysKeep: true, + Security: { + level_key: 4, + level_magic: 4, + level_tech: 4, + }, + Model: "DivineBelt", + factionFilters: { + Lining: {color: "Highlight", override: true}, + }, + Filters: { + Lock: {"gamma":1,"saturation":0.06666666666666667,"contrast":1.6833333333333333,"brightness":0.8666666666666666,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + Lining: {"gamma":1,"saturation":0.06666666666666667,"contrast":2.1333333333333333,"brightness":1.6500000000000001,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + Steel: {"gamma":1,"saturation":0.06666666666666667,"contrast":0.7833333333333334,"brightness":0.68333333333333334,"red":2.15,"green":1.7166666666666666,"blue":1.0166666666666666,"alpha":1}, + }, + value: 500, + events: [ + {trigger:"tryOrgasm", type: "DivineBelt"}, + ], + specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": 1, Pick: -100}, + DefaultLock: "Divine2", + enemyTags: {"divinebelt": 10}, playerTags: {}, minLevel: 0, allFloors: true, + shrine: ["Chastity", "Metal", "Latex", "Rope", "Leather", "ChastityBelts", "SupremeBelt"]}, + {inventory: true, arousalMode: true, name: "DivineBelt2", Asset: "OrnateChastityBelt", OverridePriority: 26, Color: ["#272727", "#D3B24B"], Group: "ItemPelvis", chastity: true, + power: 49, weight: 0, + special: true, + Security: { + level_key: 4, + level_magic: 4, + level_tech: 4, + }, + alwaysKeep: true, + Model: "DivineBeltRunic", + factionFilters: { + Lining: {color: "Highlight", override: true}, + }, + Filters: { + Lock: {"gamma":1,"saturation":0.06666666666666667,"contrast":1.6833333333333333,"brightness":0.8666666666666666,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + Lining: {"gamma":1,"saturation":0.06666666666666667,"contrast":2.1333333333333333,"brightness":1.6500000000000001,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + Steel: {"gamma":1,"saturation":0.06666666666666667,"contrast":0.7833333333333334,"brightness":0.68333333333333334,"red":2.15,"green":1.7166666666666666,"blue":1.0166666666666666,"alpha":1}, + }, + value: 500, + events: [ + {trigger:"tryOrgasm", type: "DivineBelt2"}, + ], + DefaultLock: "Divine2", + specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": 1, Pick: -100}, + enemyTags: {"divinebelt": 10}, playerTags: {}, minLevel: 0, allFloors: true, + shrine: ["Divine", "Chastity", "Metal", "Latex", "Rope", "Leather", "ChastityBelts", "SupremeBelt"]}, + + {inventory: true, arousalMode: true, name: "DivineBra", Asset: "FuturisticBra2", OverridePriority: 26, Color: ['#5E5E6B', '#F8BD01', '#5E5E6B', '#5E5E6B', '#F8BD01', '#5E5E6B'], Group: "ItemBreast", + Security: { + level_key: 4, + level_magic: 4, + level_tech: 4, + }, + special: true, + alwaysKeep: true, + chastitybra: true, + power: 49, + weight: 0, + Model: "DivineBra", + DefaultLock: "Divine2", + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": 1, Pick: -100}, enemyTags: {"divinebra": 10}, + playerTags: {"FreeBoob": -1000}, minLevel: 0, allFloors: true, shrine: ["Divine", "Chastity", "Metal", "Latex", "Rope", "Leather", "ChastityBras", "SupremeBra"], + //LinkableBy: ["Ornate"], + events: [ + {trigger:"playSelf", type: "DivineBra"}, + ], + }, + {inventory: true, arousalMode: true, name: "DivineBra2", Asset: "FuturisticBra2", OverridePriority: 26, Color: ['#5E5E6B', '#F8BD01', '#5E5E6B', '#5E5E6B', '#F8BD01', '#5E5E6B'], Group: "ItemBreast", + Security: { + level_key: 4, + level_magic: 4, + level_tech: 4, + }, + special: true, + alwaysKeep: true, + chastitybra: true, + power: 49, + weight: 0, + Model: "DivineBraRunic", + DefaultLock: "Divine2", + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": 1, Pick: -100}, enemyTags: {"divinebra": 10}, + playerTags: {"FreeBoob": -1000}, minLevel: 0, allFloors: true, shrine: ["Divine", "Chastity", "Metal", "Latex", "Rope", "Leather", "ChastityBras", "SupremeBra"], + //LinkableBy: ["Ornate"], + events: [ + {trigger:"playSelf", type: "DivineBra2"}, + ], + }, + + {removePrison: true, divine: true, name: "DivineAnkleCuffs", accessible: true, Asset: "FuturisticAnkleCuffs", + LinkableBy: [...KDBindable], DefaultLock: "Divine2", Color: ['#AE915C', '#71D2EE', '#AE915C', '#000000'], + Group: "ItemFeet", Type: "Closed", blockfeet: true, addTag: ["FeetLinked"],power: 49, weight: 0, + Model: "DivineCuffsAnkles", + specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": 1, Pick: -100}, enemyTags: {"divineRestraints":2}, playerTags: {"ItemFeetFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Metal", "Latex", "Leather"]}, + {removePrison: true, divine: true, name: "DivineGag", accessible: true, gag: 0.9, Asset: "FuturisticMuzzle", + Modules: [0, 1, 1], LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], + Color: ['#AE915C', '#AE915C', '#CAA562', '#5FBEE8'], DefaultLock: "Divine2", Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 30, weight: 0, + Model: "DivineGag", Link: "DivineMuzzle", + specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": 1, Pick: -100}, enemyTags: {"divineRestraints":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Metal", "Latex", "Leather"]}, + {removePrison: true, divine: true, name: "DivineMuzzle", accessible: true, gag: 0.6, Asset: "FuturisticMuzzle", + Modules: [0, 1, 1], LinkableBy: [...KDFlatGagLink], renderWhenLinked: [...KDFlatGagLink], + Color: ['#AE915C', '#AE915C', '#CAA562', '#5FBEE8'], DefaultLock: "Divine2", Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 30, weight: 0, + Model: "DivineMuzzle", + Filters: {"Muzzle":{"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":0.7333333333333334,"red":2.283333333333333,"green":1.7333333333333334,"blue":1,"alpha":2.8000000000000003},"Harness":{"gamma":1,"saturation":1,"contrast":0.8999999999999999,"brightness":3.233333333333333,"red":1,"green":1,"blue":1,"alpha":1},"Collar":{"gamma":1,"saturation":1,"contrast":0.8166666666666667,"brightness":2.8666666666666667,"red":1,"green":1,"blue":1,"alpha":1},"Rim":{"gamma":1.8666666666666667,"saturation":1,"contrast":1,"brightness":3.1666666666666665,"red":1,"green":1,"blue":1,"alpha":1}}, + specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": 1, Pick: -100}, enemyTags: {"divineRestraints":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 12, allFloors: true, shrine: ["Rope", "Metal", "Latex", "Leather"]}, + + {inventory: true, name: "BasicCollar", debris: "Belts", accessible: true, Asset: "LeatherCollar", Color: ["#000000", "Default"], Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 1, weight: 0, escapeChance: {"Struggle": -0.2, "Cut": 0.15, "Remove": 0.5, "Pick": 0.1}, + Model: "LeatherCollar", + maxwill: 0.25, + struggleBreak: true, + linkCategory: "BasicCollar", linkSize: 0.51, + factionFilters: { + Band: {color: "LightNeutral", override: true}, + Cuff: {color: "DarkNeutral", override: true}, + }, + unlimited: true, enemyTags: {"leashing":0.001, "maidCollar":-1, "dragonRestraints":-1, "mithrilRestraints": -1}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, maxLevel: 3, allFloors: true, shrine: ["Collars", "Will"]}, + {inventory: true, name: "SteelCollar", accessible: true, Asset: "SlenderSteelCollar", Color: ["Default"], Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 3, weight: 0, escapeChance: {"Struggle": -0.5, "Cut": -0.4, "Remove": 0.5, "Pick": 0.05}, + Model: "WolfCollarRestraint", + struggleBreak: true, + linkCategory: "BasicCollar", linkSize: 0.51, + tightType: "Secure", + Filters: { + Band: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Lining: {"gamma":1,"saturation":1,"contrast":1,"brightness":0.48333333333333334,"red":1,"green":1,"blue":1,"alpha":1}, + }, + maxwill: 0.25, + unlimited: true, enemyTags: {"leashing":0.001, "maidCollar":-1, "dragonRestraints":-1, "mithrilRestraints": -1, 'shopCollar': 10}, playerTags: {"ItemNeckFull":-2, "Unchained": -1, "Damsel": 1}, minLevel: 2, allFloors: true, shrine: ["Collars", "Elements"]}, + {inventory: true, name: "MagicCollar", debris: "Belts", accessible: true, Asset: "LeatherCollar", Color: ["#000000", "#6E5B38"], Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 2, weight: 0, magic: true, escapeChance: {"Struggle": -0.5, "Cut": -0.1, "Remove": 0.25, "Pick": 0.05}, + Model: "SteelCollarRunes", + struggleBreak: true, + tightType: "Secure", + linkCategory: "BasicCollar", linkSize: 0.51, + Filters: { + Runes: {"gamma":1,"saturation":1,"contrast":0.3833333333333333,"brightness":0.48333333333333334,"red":1,"green":2.8499999999999996,"blue":3.3000000000000003,"alpha":3.7666666666666666}, + BaseMetal: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":2.5333333333333337,"alpha":1}, + }, + + factionFilters: { + Runes: {color: "Highlight", override: true}, + BaseMetal: {color: "DarkNeutral", override: true}, + }, + maxwill: 0.25, + unlimited: true, enemyTags: {"leashing":0.001, "maidCollar":-1, "dragonRestraints":-1, "mithrilRestraints": -1, 'shopCollar': 10}, playerTags: {"ItemNeckFull":-2, "Damsel": -1}, minLevel: 2, allFloors: true, shrine: ["Collars", "Conjure"]}, + {inventory: true, name: "KittyCollar", debris: "Belts", accessible: true, Asset: "LeatherCollarBell", Color: ["Default"], Group: "ItemNeck", LinkableBy: [...KDCollarLink],renderWhenLinked: [...KDCollarRender],power: 5, weight: 0, magic: true, escapeChance: {"Struggle": -0.5, "Cut": -0.25, "Remove": 0.25, "Pick": 0.05}, + Model: "LeatherCollarBell", + struggleBreak: true, + linkCategory: "BasicCollar", linkSize: 0.51, + Filters: { + Cuff: {"gamma":2.2333333333333334,"saturation":1,"contrast":1.0833333333333335,"brightness":2.283333333333333,"red":1,"green":1,"blue":1,"alpha":1}, + Band: {"gamma":1,"saturation":0.05,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, + factionFilters: { + Band: {color: "Highlight", override: true}, + Cuff: {color: "DarkNeutral", override: true}, + }, + maxwill: 0.25, + unlimited: true, enemyTags: {"kittyRestraints":0.001, "kittyCollar": 10, "maidCollar":-1, "dragonRestraints":-1, "mithrilRestraints": -1, 'shopCollar': 10}, playerTags: {"ItemNeckFull":-2}, minLevel: 0, allFloors: true, shrine: ["Collars", "Will"], + + }, + + {inventory: true, removePrison: true, alwaysKeep: true, showInQuickInv: true, good: true, name: "QuakeCollar", accessible: true, Asset: "SlenderSteelCollar", Color: ["#6E5B38"], + Group: "ItemNeck", power: 55, weight: 0, escapeChance: {"Struggle": -10, "Cut": -10, "Remove": 0.5, "Pick": 0.1}, + Model: "QuakeCollar", + struggleBreak: true, + curse: "MistressKey", + enchanted: true, + value: 1000, + tightType: "Secure", + LinkableBy: [...KDCollarLink], + alwaysRender: true, + alwaysStruggleable: true, + events: [ + {trigger:"playSelf", type: "QuakeCollar"}, + ], + enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Collars", "HighCollars"]}, + {inventory: true, removePrison: true, alwaysKeep: true, showInQuickInv: true, good: true, + name: "PotionCollar", accessible: true, Asset: "SlenderSteelCollar", Color: ["#6E5B38"], + Group: "ItemNeck", power: 1, weight: 0, displayPower: 5, + escapeChance: {"Struggle": -0.2, "Cut": -0.1, "Remove": 0.5, "Pick": 0.15}, + potionCollar: true, allowPotions: true, + Model: "MageCollar", + struggleBreak: true, + value: 500, + tightType: "Secure", + LinkAll: true, + noDupe: true, + linkCategory: "NeckBand", + linkSize: 0.3, + + factionFilters: { + BaseMetal: {color: "DarkNeutral", override: true}, + Crystal: {color: "Highlight", override: true}, + Hardware: {color: "LightNeutral", override: true}, + }, + Filters: {"Hardware":{"gamma":1,"saturation":0,"contrast":1.24,"brightness":1,"red":1.8431372549019607,"green":1.0980392156862746,"blue":0.29411764705882354,"alpha":1}}, + enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Collars"]}, + {inventory: true, removePrison: true, alwaysKeep: true, showInQuickInv: true, good: true, + name: "EssenceNecklace", accessible: true, + Group: "ItemNeck", power: 1, weight: 0, displayPower: 10, + escapeChance: {"Struggle": 0.2, "Cut": 0.05, "Remove": 0.8}, + Model: "RubyNecklaceRestraint", + value: 500, + tightType: "Secure", + AlwaysLinkable: true, + noDupe: true, + linkCategory: "Necklace", + linkSize: 0.55, + factionFilters: { + Ruby: {color: "Highlight", override: true}, + Hardware: {color: "DarkNeutral", override: true}, + Ring: {color: "LightNeutral", override: true}, + Chain: {color: "DarkNeutral", override: true}, + }, + events: [ + {type: "EssenceMote", trigger: "miscast", dist: 1.5, chance: 0.5}, + ], + enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Necklaces"]}, + { + name: "GagNecklace", accessible: true, harness: true, + Group: "ItemNeck", + power: 1, weight: 0, + escapeChance: {"Struggle": -0.08, "Cut": 0.1, "Remove": 0.2, "Pick": 0.5}, + Model: "GagNecklace", + value: 20, + tightType: "Secure", + LinkAll: true, AlwaysLinkable: true, noDupe: true, + factionFilters: { + Ball: {color: "Highlight", override: false}, + Strap: {color: "DarkNeutral", override: true}, + }, + events: [ + {trigger: "postApply", type: "requireNoGags"}, + ], + enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Collars", "GagNecklace"]}, + { + name: "CrystalGagNecklace", accessible: true, harness: true, + Group: "ItemNeck", + power: 1, weight: 0, + escapeChance: {"Struggle": -0.08, "Cut": 0.1, "Remove": 0.2, "Pick": 0.5}, + limitChance: {"Struggle": 0.1, "Cut": 0.12}, + Model: "CrystalGagNecklace", + necklaceGagType: "CrystalBallGag", + value: 20, + tightType: "Secure", + LinkAll: true, AlwaysLinkable: true, noDupe: true, + factionFilters: { + Ball: {color: "Highlight", override: false}, + Strap: {color: "DarkNeutral", override: true}, + }, + events: [ + {trigger: "tick", type: "crystalDrain", power: -0.005, inheritLinked: true}, + {trigger: "postApply", type: "requireNoGags"}, + ], + enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Collars", "GagNecklace"]}, + {inventory: true, name: "SarielPanties", unlimited: true, debris: "Fabric", Asset: "ClothStuffing", LinkableBy: [...KDStuffingLink], Color: "Default", Group: "ItemMouth", power: -1, weight: 0, gag: 0.1, + value: 1000, + alwaysKeep: true, showInQuickInv: true, good: true, + Model: "Stuffing", + alwaysRender: true, + Filters: { + Stuffing: {"gamma":0.3833333333333333,"saturation":1,"contrast":1.3,"brightness":0.2,"red":1,"green":1,"blue":1,"alpha":1}, + }, + events: [ + {trigger: "perksBonus", type: "spellDamage", power: 0.1, inheritLinked: true,}, + {type: "ReduceMiscastVerbal", trigger: "beforeCast", power: 0.5, inheritLinked: true}, + ], + alwaysInaccessible: true, + escapeChance: {"Struggle": 1, "Cut": 1, "Remove": 1}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: ["Stuffing"]}, + {inventory: true, removePrison: true, alwaysKeep: true, showInQuickInv: true, good: true, name: "SlimeWalkers", debris: "Belts", inaccessible: true, Asset: "BalletHeels", Color: "#ff00ff", Group: "ItemBoots", power: 1, weight: 0, slimeWalk: true, + value: 250, + heelpower: 0.5, + Model: "BalletHeelsRestraint", + Filters: { + Shoe: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.9666666666666666,"green":1,"blue":3.616666666666667,"alpha":1}, + Sole: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":2.15,"alpha":1}, + Laces: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":3.9000000000000004,"red":1,"green":1,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": 0.15, "Cut": 0.45, "Remove": 0.4, "Pick": 0.9}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: []}, + {inventory: true, removePrison: true, alwaysKeep: true, showInQuickInv: true, good: true, name: "ElvenPanties", debris: "Fabric", inaccessible: true, + Asset: "ElfPanties", Color: "#ff00ff", Group: "ItemPelvis", power: 1, weight: 0, + value: 250, + + armor: true, bypass: true, + Model: "ElfPanties", + LinkAll: true, + AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + events: [ + {type: "Buff", trigger: "tick", power: 0.11, buffType: "SprintEfficiency"}, + ], + escapeChance: {"Struggle": 1, "Cut": 1, "Remove": 1, "Pick": 1}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: []}, + {inventory: true, removePrison: true, alwaysKeep: true, showInQuickInv: true, good: true, + name: "GasMask", debris: "Belts", accessible: true, + Asset: "GasMask", Color: "#ff00ff", Group: "ItemMouth", gag: 0.4, power: 1, weight: 0, + value: 300, + displayPower: 3, + Model: "GasMask", + events: [ + {type: "Buff", trigger: "tick", power: 2.0, buffType: "happygasDamageResist"}, + {type: "Buff", trigger: "tick", power: 2.0, buffType: "poisongasDamageResist"}, + {type: "Buff", trigger: "tick", power: 0.5, buffType: "poisonDamageResist"}, + ], + escapeChance: {"Struggle": 0.15, "Cut": -0.3, "Remove": 10, "Pick": 0.9}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: []}, + {inventory: true, removePrison: true, alwaysKeep: true, showInQuickInv: true, good: true, + name: "Sunglasses", accessible: true, + Asset: "Sunglasses", Color: "#ffffff", Group: "ItemHead", power: 1, weight: 0, + + armor: true, bypass: true, + displayPower: 2, + value: 150, + Model: "Glasses", + Filters: { + Glasses: {"gamma":1,"saturation":0.18333333333333335,"contrast":0.5,"brightness":0.9666666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + Lens: {"gamma":1,"saturation":1,"contrast":1,"brightness":0.08333333333333333,"red":1,"green":1,"blue":1,"alpha":1.2666666666666668}, + }, + factionFilters: { + Glasses: {color: "DarkNeutral", override: false}, + }, + events: [ + {type: "Buff", trigger: "tick", power: .25, buffType: "holyDamageResist"}, + {type: "Buff", trigger: "tick", power: 1.5, buffType: "blindResist"}, + ], + escapeChance: {"Struggle": 0.25, "Cut": -0.25, "Remove": 10, "Pick": 0.9}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: []}, + {inventory: true, removePrison: true, alwaysKeep: true, showInQuickInv: true, good: true, + name: "Sunglasses2", accessible: true, + Asset: "Sunglasses", Color: "#ffffff", Group: "ItemHead", power: 1, weight: 0, + displayPower: 2, + value: 150, + Model: "Sunglasses", + + armor: true, bypass: true, + Filters: { + Glasses: {"gamma":1,"saturation":0.18333333333333335,"contrast":0.5,"brightness":0.9666666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + Lens: {"gamma":1,"saturation":1,"contrast":1,"brightness":0.08333333333333333,"red":1,"green":1,"blue":1,"alpha":1.2666666666666668}, + }, + factionFilters: { + Glasses: {color: "DarkNeutral", override: false}, + }, + events: [ + {type: "Buff", trigger: "tick", power: .25, buffType: "holyDamageResist"}, + {type: "Buff", trigger: "tick", power: 1.5, buffType: "blindResist"}, + ], + escapeChance: {"Struggle": 0.25, "Cut": -0.25, "Remove": 10, "Pick": 0.9}, enemyTags: {}, playerTags: {}, minLevel: 0, floors: KDMapInit([]), shrine: []}, + {inventory: true, removePrison: true, name: "BasicLeash", tether: 2.9, Asset: "CollarLeash", Color: "Default", Group: "ItemNeckRestraints", leash: true, power: 1, weight: -99, harness: true, + Model: "Leash", + unlimited: true, + sfxGroup: "Ropes", + struggleBreak: true, + affinity: { + Cut: ["SharpTug", "SharpHookOrFoot"], + Struggle: ["Tug", "HookOrFoot"], + }, + + factionFilters: { + Leash: {color: "DarkNeutral", override: true}, + Hardware: {color: "LightNeutral", override: true}, + }, + requireAllTagsToEquip: ["Collars"], + events: [ + {trigger: "postRemoval", type: "RequireCollar"} + ], + struggleMinSpeed: { + Cut: 0.05, + }, + limitChance: {Struggle: 0.2}, + escapeChance: {"Struggle": -0.1, "Cut": 0.2, "Remove": 0.5, "Pick": 1.25}, enemyTags: {"leashing":1}, playerTags: {"ItemNeckRestraintsFull":-2, "ItemNeckFull":99}, minLevel: 0, allFloors: true, shrine: ["Leashes", "Leashable"]}, + + //region Cursed Set - Flames of Desire + //endregion + + //region Cursed Set - Grace of the Clouds + //endregion + + //region Cursed Set - Deluge of Passion + //endregion + + //region Cursed Set - Iron Discipline + //endregion + + //region Cursed Set - Stardust Curse + {inventory: true, name: "CursedCollar", alwaysKeep: true, debris: "Chains", Asset: "SlenderSteelCollar", Color: ["#7842ad"], Group: "ItemNeck", LinkableBy: [...KDCollarLink], + special: true, + struggleBreak: true, + Model: "StardustCollar", + tightType: "Secure", + Filters: { + "Collar": {"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":0.3,"red":1.4,"green":1,"blue":3.95,"alpha":1}, + }, + power: 49, weight: -100, escapeChance: {"Struggle": -50, "Cut": -50, "Remove": -50, "Pick": -50}, + curse: "CursedCollar", + enemyTags: {"cursedCollar": 1000, "ChestCollar": 1000}, playerTags: {}, minLevel: 0, allFloors: true, + shrine: ["Collars", "Cursed", "CursedSet", "Stardust"], + events: [ + {trigger: "drawSGTooltip", type: "curseInfo", msg: "CursedTransformation", color: "#9074ab", inheritLinked: true}, + {trigger: "postApply", type: "EngageCurse", inheritLinked: true}, + {trigger: "EngageCurse", type: "CursedCollar", inheritLinked: true, trim: true, curse: true, tags: ["obsidianRestraints", "shadowLatexRestraints", "shadowLatexRestraintsHeavy", "shadowLatexRestraintsForced",], msg: "KDCursedTransformation"}, + {trigger: "tick", type: "TriggerCurseTransform", chance: 0.25, inheritLinked: true, trim: true, curse: true, tags: ["obsidianRestraints", "shadowLatexRestraints", "shadowLatexRestraintsHeavy",], msg: "KDCursedTransformation"}, + ]}, + {inventory: true, name: "CursedCollar2", alwaysKeep: true, debris: "Chains", Asset: "SlenderSteelCollar", Color: ["#8E72AA"], Group: "ItemNeck", LinkableBy: [...KDCollarLink], + special: true, + struggleBreak: true, + Model: "StardustCollar", + tightType: "Secure", + Filters: { + "Collar": {"gamma":1,"saturation":0.03333333333333333,"contrast":1,"brightness":1.0,"red":1.4,"green":1,"blue":1.9, "alpha":1}, + }, + power: 49, weight: -100, escapeChance: {"Struggle": -50, "Cut": -50, "Remove": -50, "Pick": -50}, + curse: "CursedCollar", + enemyTags: {"cursedCollar2": 1000, "ChestCollar": 1000}, playerTags: {}, minLevel: 0, allFloors: true, + shrine: ["Collars", "Cursed", "CursedSet", "Stardust"], + events: [ + {trigger: "drawSGTooltip", type: "curseInfo", msg: "CursedTransformation", color: "#9074ab", inheritLinked: true}, + {trigger: "postApply", type: "EngageCurse", inheritLinked: true}, + {trigger: "EngageCurse", type: "CursedCollar", inheritLinked: true, trim: true, curse: true, tags: ["mithrilRestraints", "liquidMetalRestraintsRandom"], msg: "KDCursedTransformation"}, + {trigger: "tick", type: "TriggerCurseTransform", chance: 0.25, inheritLinked: true, trim: true, curse: true, tags: ["mithrilRestraints", "liquidMetalRestraintsRandom"], msg: "KDCursedTransformation"}, + ]}, + //endregion + + + + + //region Enchanted + {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, arousalMode: true, enchanted: true, name: "EnchantedBelt", Asset: "PolishedChastityBelt", OverridePriority: 26, Color: "#AE915C", Group: "ItemPelvis", chastity: true, power: 44, weight: 0, + Security: { + level_key: 4, + level_magic: 4, + level_tech: 4, + }, + Model: "SteelChastityBelt_Segu", + factionFilters: { + Lining: {color: "Highlight", override: true}, + }, + Filters: { + Lock: {"gamma":1,"saturation":0.06666666666666667,"contrast":2.1333333333333333,"brightness":1.6500000000000001,"red":1,"green":1.0166666666666666,"blue":1.0166666666666666,"alpha":1}, + Lining: {"gamma":1,"saturation":0.06666666666666667,"contrast":2,"brightness":1.25,"red":1,"green":3.7,"blue":4.566666666666666,"alpha":1}, + BaseMetal: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":3.1666666666666665,"brightness":0.6166666666666667,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Ancient", "SupremeBelt"], + //renderWhenLinked: ["Ornate], + LinkableBy: ["Ornate"], + events: [ + {trigger: "calcMiscast", type: "ReduceMiscastFlat", power: 0.3, requireEnergy: true}, + {trigger: "tick", type: "RegenStamina", power: 1, requireEnergy: true, energyCost: 0.0005}, + ]}, + {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, arousalMode: true, enchanted: true, name: "EnchantedBra", Asset: "PolishedChastityBra", OverridePriority: 26, Color: "#AE915C", Group: "ItemBreast", chastitybra: true, power: 44, weight: 0, + Security: { + level_key: 4, + level_magic: 4, + level_tech: 4, + }, + + Model: "SteelChastityBra_Segu", + Filters: { + Lock: {"gamma":1,"saturation":0.06666666666666667,"contrast":2,"brightness":1.25,"red":1,"green":3.7,"blue":4.566666666666666,"alpha":1}, + Lining: {"gamma":1,"saturation":0.06666666666666667,"contrast":2,"brightness":1.25,"red":1,"green":3.7,"blue":4.566666666666666,"alpha":1}, + BaseMetal: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":2.183333333333333,"brightness":0.6166666666666667,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + Chain: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":2.183333333333333,"brightness":0.6166666666666667,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {"FreeBoob": -1000}, minLevel: 0, allFloors: true, shrine: ["Ancient", "SupremeBra"], + //renderWhenLinked: ["Ornate], + LinkableBy: ["Ornate"], + events: [ + {trigger: "beforeDamage", type: "ModifyDamageFlat", power: -2, requireEnergy: true, energyCost: 0.01, inheritLinked: true} + ]}, + {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedHeels", Asset: "BalletWedges", Color: "#AE915C", Group: "ItemBoots", power: 44, weight: 0, + + heelpower: 0.8, + Model: "BalletHeelsRestraint", + Filters: { + Shoe: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1.9666666666666666,"green":1.1500000000000001,"blue":0.5666666666666667,"alpha":1}, + Laces: {"gamma":1,"saturation":1,"contrast":1.1333333333333333,"brightness":3.9000000000000004,"red":1,"green":1,"blue":1,"alpha":0}, + }, + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Ancient"], + events: [ + {trigger: "tick", type: "ApplySlowLevelBuff", power: -2, requireEnergy: true, energyCost: 0.0005, inheritLinked: true}, + {type: "ShadowHeel", trigger: "playerAttack", requireEnergy: true, energyCost: 0.00225, inheritLinked: true}, + //{trigger: "beforePlayerAttack", type: "BoostDamage", power: 1, requireEnergy: true, energyCost: 0.001125} + ]}, + {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedBlindfold", Asset: "PaddedBlindfold", Color: ["#AE915C", "#262626"], Group: "ItemHead", blindfold: 6, power: 44, weight: 0, + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Ancient"], + LinkableBy: [...KDBlindfoldLink], + Model: "BlindfoldBasic", + Filters: { + Rim: {"gamma":1,"saturation":1,"contrast":1,"brightness":1.9166666666666667,"red":0.6,"green":1.9166666666666667,"blue":2.916666666666667,"alpha":1}, + Blindfold: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":2.4166666666666665,"brightness":1.2166666666666668,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + }, + events: [ + {trigger: "calcEvasion", type: "BlindFighting", requireEnergy: true, inheritLinked: true}, + {trigger: "tick", type: "AccuracyBuff", power: 1.0, requireEnergy: true, inheritLinked: true}, + {trigger: "beforePlayerAttack", type: "BoostDamage", power: 1, requireEnergy: true, energyCost: 0.001125, inheritLinked: true}, + ]}, + {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedAnkleCuffs", Asset: "SteelAnkleCuffs", Type: "Chained", Color: ["#AE915C", "#B0B0B0"], Group: "ItemFeet", power: 44, weight: 0, + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Ancient"], + LinkableBy: [...KDBindable, ...KDDevices], renderWhenLinked: [...KDBindable], + Model: "ShacklesAnkles", + alwaysDressModel: [ + {Model: "AnkleLink", inheritFilters: true}, + ], + Filters: { + BaseMetal: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":1.7166666666666666,"brightness":1.4833333333333334,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + }, + events: [ + {trigger: "tick", type: "EnchantedAnkleCuffs"}, + {trigger: "tick", type: "AllyHealingAura", aoe: 3.9, power: 1.5, energyCost: 0.0025, inheritLinked: true}, + {trigger: "tick", type: "EvasionBuff", power: 0.25, requireEnergy: true, inheritLinked: true}, + {trigger: "missPlayer", type: "EnergyCost", requireEnergy: true, energyCost: 0.0075, inheritLinked: true} + ]}, + {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, inventoryAs: "EnchantedAnkleCuffs", name: "EnchantedAnkleCuffs2", Asset: "SteelAnkleCuffs", Type: "Closed", blockfeet: true, addTag: ["FeetLinked"],Color: ["#AE915C", "#B0B0B0"], Group: "ItemFeet", power: 44, weight: 0, + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Ancient"], + LinkableBy: [...KDBindable, ...KDDevices], renderWhenLinked: [...KDBindable], + Model: "ShacklesAnkles", + Filters: { + BaseMetal: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":1.7166666666666666,"brightness":1.4833333333333334,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + }, + events: [ + // These wont unlink if they're under something else + {trigger: "tick", type: "EnchantedAnkleCuffs2", requireEnergy: true, inheritLinked: true} + ]}, + {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedMuzzle", gag: 1.0, Asset: "FuturisticMuzzle", Modules: [1, 1, 2], Color: ['#AE915C', '#AE915C', '#CAA562', '#000000'], + Group: "ItemMouth", power: 44, weight: 0, + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["AncientMuzzle", "FlatGags"], + Model: "PlugMuzzleGag", + Filters: { + Muzzle: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":1.25,"brightness":0.7666666666666666,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + Strap: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":1.25,"brightness":0.7666666666666666,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + Plug: {"gamma":0.6333333333333334,"saturation":0.2,"contrast":3.7,"brightness":0.8666666666666667,"red":1.1333333333333333,"green":2.05,"blue":2.5,"alpha":1}, + }, + events: [ + {trigger: "tick", type: "SneakBuff", power: 1.15, requireEnergy: true, inheritLinked: true}, + {trigger: "tick", type: "RegenMana", power: 1.0, requireEnergy: true, energyCost: 0.0025, inheritLinked: true}, + {trigger: "beforeDamageEnemy", type: "AddDamageStealth", power: 7.0, requireEnergy: true, energyCost: 0.0015, inheritLinked: true}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.25, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.2, requiredTag: "Blindfolds"}, + ]}, + {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedBallGag", gag: 0.6, Asset: "FuturisticHarnessBallGag", Color: ['#AE915C', '#AE915C', '#424242', "#CAA562", '#000000'], + Group: "ItemMouth", power: 44, weight: 0, + Model: "PlugMuzzleGag", + Filters: { + Harness: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":1.25,"brightness":0.7666666666666666,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + SideStrap: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":1.25,"brightness":0.7666666666666666,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + Strap: {"gamma":0.8999999999999999,"saturation":0.2,"contrast":1.25,"brightness":0.7666666666666666,"red":2.816666666666667,"green":1.9333333333333333,"blue":1,"alpha":1}, + Ball: {"gamma":0.8666666666666667,"saturation":0,"contrast":1.3,"brightness":1.3333333333333333,"red":1,"green":2.816666666666667,"blue":3.05,"alpha":1}, + }, + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Flat"], + LinkableBy: [...KDBallGagLink, "AncientMuzzle"], renderWhenLinked: [...KDBallGagLink], + events: [ + {trigger: "calcMiscast", type: "ReduceMiscastFlat", power: 0.3, requireEnergy: true, inheritLinked: true}, + {trigger: "tick", type: "RegenMana", power: 1.0, requireEnergy: true, energyCost: 0.0025, inheritLinked: true}, + {trigger: "beforeDamageEnemy", type: "MultiplyDamageStatus", power: 1.3, requireEnergy: true, energyCost: 0.0025, inheritLinked: true}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagRemoveBlindfold", inheritLinked: true,StruggleType: "Remove", power: 0.25, requiredTag: "Blindfolds"}, + {trigger: "beforeStruggleCalc", type: "struggleDebuff", msg: "KDHarnessGagStruggleBlindfold", inheritLinked: true,StruggleType: "Struggle", power: 0.2, requiredTag: "Blindfolds"}, + ]}, + {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedArmbinder", inaccessible: true, Asset: "FuturisticArmbinder", Type: "Tight", Color: ['#AE915C', '#AE915C', '#424242', "#424242", '#000000'], + Group: "ItemArms", power: 44, weight: 0, + bindarms: true, + bindhands: 1.0, + Model: "Jacket", + Filters: { + BeltsArms: {"gamma":1.1833333333333333,"saturation":0.2,"contrast":1.4333333333333333,"brightness":0.7666666666666666,"red":3.1666666666666665,"green":2.5166666666666666,"blue":1,"alpha":1}, + BeltsChest: {"gamma":1.1833333333333333,"saturation":0.2,"contrast":1.4333333333333333,"brightness":0.7666666666666666,"red":3.1666666666666665,"green":2.5166666666666666,"blue":1,"alpha":1}, + Chest: {"gamma":1.4166666666666665,"saturation":1.0833333333333335,"contrast":2.5333333333333337,"brightness":0.6166666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + Arms: {"gamma":1.4166666666666665,"saturation":1.0833333333333335,"contrast":2.5333333333333337,"brightness":1.6166666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + }, + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Ancient", "Armbinders", "Block_ItemHands"], + LinkableBy: [...KDArmbinderLink], renderWhenLinked: [...KDArmbinderLink], + events: [ + {trigger: "tick", type: "spellRange", power: 0.5, requireEnergy: true}, + {trigger: "beforeDamageEnemy", type: "MultiplyDamageMagic", power: 1.4, requireEnergy: true, energyCost: 0.00002, inheritLinked: true} + ]}, + {curse: "MistressKey", enchantedDrain: 0.00001, inventory: true, enchanted: true, name: "EnchantedMittens", Asset: "FuturisticMittens", bindhands: 1.0, + Model: "LeatherMittens", + Filters: { + Band: {"gamma":0.43333333333333335,"saturation":1,"contrast":1.1833333333333333,"brightness":0.5166666666666666,"red":2.8666666666666667,"green":1.9500000000000002,"blue":0.3,"alpha":1}, + Mitten: {"gamma":0.9166666666666666,"saturation":1,"contrast":3,"brightness":0.06666666666666667,"red":1,"green":1,"blue":1,"alpha":1}, + }, + Color: ['#B6A262', '#B6A262', '#424242', '#000000'], Group: "ItemHands", power: 44, weight: 0, + escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Ancient"], + LinkableBy: ["Tape", "Mittens"], + events: [ + {trigger: "beforeDamageEnemy", type: "MultiplyDamageMagic", power: 1.4, requireEnergy: true, energyCost: 0.000025, inheritLinked: true} // Energy cost per point o' extra damage + ]}, + //endregion +]; + + +KDAddRopeVariants( + "RopeSnake", + "WeakMagicRope", + "", + "ropeMagicWeak", + ["WeakMagicRopes"], + ["RopeSnake"], + 2, + { + magic: true, + Color: "#bb3cd7", + minLevel: 2, + }, + [ + {trigger: "drawSGTooltip", type: "StruggleManaBonus", inheritLinked: true, power: 0.2, mult: 0.1, threshold: 10}, + {trigger: "beforeStruggleCalc", type: "StruggleManaBonus", inheritLinked: true, power: 0.2, mult: 0.1, threshold: 10}, + ], + { + Struggle: -0.1, + Cut: -0.1, + Remove: -0.05, + }, + { + }, + { + Rope: {"gamma":2.55,"saturation":0.9666666666666667,"contrast":2,"brightness":0.5,"red":1.6833333333333333,"green":1,"blue":2.6500000000000004,"alpha":1}, + }, + undefined, true +); +KDAddRopeVariants( + "RopeSnake", + "CelestialRope", + "", + "celestialRopes", + ["HolyRope", "Holy"], + ["RopeSnake"], + 4, + { + magic: true, + Color: "#ffff44", + }, + [{trigger: "struggle", type: "celestialRopePunish"}], + { + Struggle: -0.15, + Cut: 0, + Remove: -0.1, + }, + { + }, + { + Rope: {"gamma":1.6166666666666665,"saturation":1,"contrast":1.6,"brightness":2.45,"red":2.2,"green":2.4166666666666665,"blue":1,"alpha":1}, + }, +); + +KDAddRopeVariants( + "RopeSnake", + "StrongMagicRope", + "", + "ropeMagicStrong", + ["StrongMagicRopes"], + ["RopeSnake"], + 4, + { + magic: true, + Color: "#4fa4b8", + minLevel: 5, + }, + [ + {trigger: "drawSGTooltip", type: "StruggleManaBonus", inheritLinked: true, power: 0.3, mult: 0.1, threshold: 10}, + {trigger: "beforeStruggleCalc", type: "StruggleManaBonus", inheritLinked: true, power: 0.3, mult: 0.1, threshold: 10}, + ], + { + Struggle: -0.25, + Cut: 0, + Remove: -0.15, + }, + { + }, + { + Rope: {"gamma":1.7333333333333334,"saturation":2.1,"contrast":1.4000000000000001,"brightness":0.9666666666666667,"red":0.44999999999999996,"green":1.4000000000000001,"blue":2.6166666666666667,"alpha":1}, + }, + undefined, true +); +KDAddRopeVariants( + "RopeSnake", + "MithrilRope", + "", + "mithrilRope", + ["Mithril"], + ["RopeSnake"], + 4, + { + Color: "#ffffff", + }, + [], + { + Struggle: -0.15, + Cut: -0.45, + Remove: -0.05, + }, + { + }, + { + Rope: {"gamma":1.7833333333333334,"saturation":0,"contrast":2.45,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, +); + + + +KDAddCuffVariants( + "Template", + "Blacksteel", + "", + "blacksteel", + {"blacksteelRestraints": 4, "expRestraints": 7}, + ["Blacksteel"], + [], + 0, + { + Color: ["#92e8c0", "#171222", "#333333"], + sfxGroup: "Chains", + }, + [], + { + Struggle: -0.05, + Cut: 0.05, + Remove: 0.0, + Pick: 0.00, + }, + { + },{ + Struggle: -0.15, + Cut: 0.05, + Remove: 0.0, + Pick: 0.00, + }, + { + }, { + BaseMetal: {"gamma":0.6166666666666667,"saturation":1,"contrast":1.3,"brightness":2.4166666666666665,"red":1,"green":1,"blue":1,"alpha":1}, + }, 6, false, + { + "ArmCuffs": "FuturisticCuffs", + "LegCuffs": "FuturisticLegCuffs", + "AnkleCuffs": "FuturisticAnkleCuffs", + }, + { + "ArmCuffs": "SteelCuffsArms", + "LegCuffs": "SteelCuffsThigh", + "AnkleCuffs": "SteelCuffsAnkles", + }, +); + +KDAddCuffVariants( + "Template", + "Mithril", + "", + "mithril", + {}, + ["Mithril"], + [], + 0, + { + Color: "#ffffff", + sfxGroup: "Chains", + }, + [], + { + Struggle: 0.0, + Cut: 0.0, + Remove: 0.0, + Pick: 0.00, + }, + { + },{ + Struggle: -0.1, + Cut: 0.0, + Remove: 0.0, + Pick: 0.00, + }, + { + }, { + BaseMetal: {"gamma":1.7833333333333334,"saturation":1,"contrast":2.45,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + Rim: {"gamma":1.2833333333333334,"saturation":1,"contrast":2.45,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, 6, false, + { + "ArmCuffs": "FuturisticCuffs", + "LegCuffs": "FuturisticLegCuffs", + "AnkleCuffs": "FuturisticAnkleCuffs", + }, + { + "ArmCuffs": "SteelCuffsArms", + "LegCuffs": "SteelCuffsThigh", + "AnkleCuffs": "SteelCuffsAnkles", + }, +); +KDAddCuffVariants( + "Template", + "Warden", + "", + "warden", + {}, + ["Warden", "WardenCuffs"], + [], + 0, + { + Color: "#ffffff", + sfxGroup: "Chains", + }, + [ + {trigger: "spellOrb", type: "wardenPunish", dynamic: true, inheritLinked: true}, + {trigger: "afterShrineDrink", type: "wardenPunish", dynamic: true, inheritLinked: true}, + {trigger: "afterShrineBottle", type: "wardenPunish", dynamic: true, inheritLinked: true}, + {trigger: "afterFailGoddessQuest", type: "wardenPunish", dynamic: true}, + ], + { + Struggle: 0.0, + Cut: 0.0, + Remove: 0.0, + Pick: 0.00, + }, + { + },{ + Struggle: -0.1, + Cut: 0.0, + Remove: 0.0, + Pick: 0.00, + }, + { + }, { + BaseMetal: {"gamma":1.2833333333333334,"saturation":1,"contrast":1.45,"brightness":1,"red":2,"green":1.5,"blue":1,"alpha":1}, + }, 6, false, + { + "ArmCuffs": "FuturisticCuffs", + "LegCuffs": "FuturisticLegCuffs", + "AnkleCuffs": "FuturisticAnkleCuffs", + }, + { + "ArmCuffs": "SteelCuffsArms", + "LegCuffs": "SteelCuffsThigh", + "AnkleCuffs": "SteelCuffsAnkles", + }, +); + +KDAddCuffVariants( + "Template", + "Leather", + "", + "leather", + { + "leatherRestraintsHeavy":4, "dragonRestraints":6, "handcuffer": 10, "leathercuffsSpell": 8 + }, + ["LeatherCuffs", "Leather"], + ["Metal"], + -5, + { + Color: "#999999", + factionFilters: { + Band: {color: "Highlight", override: true}, + }, + sfxGroup: "Leather", + }, + [], + { + Struggle: 0.6, + Cut: 0.3, + Remove: 0.05, + Pick: 0.05, + }, + { + },{ + Struggle: 0.25, + Cut: 0.3, + Remove: 0.05, + Pick: 0.05, + }, + { + }, { + + }, 6, false, + { + "ArmCuffs": "LeatherCuffs", + "LegCuffs": "LeatherLegCuffs", + "AnkleCuffs": "LeatherAnkleCuffs", + }, + { + "ArmCuffs": "CuffsArms", + "LegCuffs": "CuffsThigh", + "AnkleCuffs": "CuffsAnkles", + }, +); + +KDAddCuffVariants( + "Template", + "Asylum", + "", + "nurse", + { + "nurseCuffRestraints": 5, "leathercuffsSpell": 3 + }, + ["Asylum", "LeatherCuffs", "Leather"], + ["Metal"], + -3, + { + Color: "#554033", + factionFilters: { + Band: {color: "Highlight", override: true}, + }, + sfxGroup: "Leather", + }, + [], + { + Struggle: 0.35, + Cut: 0.2, + Remove: -0.05, + Pick: -0.05, + }, + { + }, + { + Struggle: 0.15, + Cut: 0.15, + Remove: 0.00, + Pick: -0.05, + }, + { + }, { + Cuff: {"gamma":1.3,"saturation":1,"contrast":1.2166666666666668,"brightness":0.4666666666666667,"red":1.6666666666666665,"green":1.25,"blue":1,"alpha":1}, + }, 6, false, + { + "ArmCuffs": "LeatherCuffs", + "LegCuffs": "LeatherLegCuffs", + "AnkleCuffs": "LeatherAnkleCuffs", + }, + { + "ArmCuffs": "CuffsArms", + "LegCuffs": "CuffsThigh", + "AnkleCuffs": "CuffsAnkles", + }, +); + +KDAddCuffVariants( + "Template", + "Scale", + "", + "scale", + { + "dragonRestraints":4 + }, + ["ScaleCuffs", "Scale", "LeatherCuffs", "Leather"], + ["Metal"], + -2, + { + Color: ["#92e8c0", "#171222", "#ff5277"], + factionFilters: { + Band: {color: "Highlight", override: true}, + }, + sfxGroup: "Leather", + }, + [], + { + Struggle: 0.3, + Cut: 0.15, + Remove: 0.00, + Pick: 0.00, + }, + { + }, + { + Struggle: 0.12, + Cut: 0.2, + Remove: 0.00, + Pick: 0.00, + }, + { + }, { + Cuff: {"gamma":1,"saturation":1,"contrast":1.6166666666666665,"brightness":1,"red":1.7999999999999998,"green":0.8666666666666667,"blue":0.8666666666666667,"alpha":1}, + Band: {"gamma":1,"saturation":0,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}, + }, 6, false, + { + "ArmCuffs": "LeatherCuffs", + "LegCuffs": "LeatherLegCuffs", + "AnkleCuffs": "LeatherAnkleCuffs", + }, + { + "ArmCuffs": "CuffsArms", + "LegCuffs": "CuffsThigh", + "AnkleCuffs": "CuffsAnkles", + }, +); + + + +KDAddCuffVariants( + "Template", + "Crystal", + "", + "crystal", + {}, + ["CrystalCuffs", "Crystal", "Elements", "Leather"], + ["Metal"], + 0, + { + Color: ["#a694cb", "#ff5277"], + DefaultLock: "Crystal", + sfxGroup: "Chains", + }, + [ + {trigger: "tick", type: "crystalDrain", power: -0.025, inheritLinked: true}, + {trigger: "struggle", type: "crystalPunish"}, + ], + { + Struggle: 0.25, + Cut: 0.05, + Remove: 0.05, + Pick: 0.05, + }, + { + }, + { + Struggle: 0, + Cut: 0.05, + Remove: 0.0, + Pick: 0.0, + }, + { + }, { + //BaseMetal: {"gamma":0.95,"saturation":1,"contrast":1.6166666666666665,"brightness":2.29999999999998,"red":2.0166666666666666,"green":0.9833333333333333,"blue":2.5333333333333337,"alpha":0.6666666666666666}, + }, 6, false, + { + "ArmCuffs": "OrnateCuffs", + "LegCuffs": "OrnateLegCuffs", + "AnkleCuffs": "OrnateAnkleCuffs", + }, + { + "ArmCuffs": "CrystalCuffsArms", + "LegCuffs": "CrystalCuffsThigh", + "AnkleCuffs": "CrystalCuffsAnkles", + }, + +); + + + +KDAddCuffVariants( + "Template", + "Ice", + "", + "ice", + {}, + ["Ice"], + [], + -4, + { + Color: ["#9999ff", "#ff5277"], + failSuffix: {"Remove": "Ice"}, + }, + [ + {trigger: "tick", type: "iceDrain", power: -0.02, inheritLinked: true}, + {trigger: "afterPlayerDamage", type: "iceMelt", mult: 1.5, subMult: 0.5, count: 13, inheritLinked: true}, + ], + { + Struggle: 0.3, + Cut: 0.12, + Remove: -1, + }, + { + }, + { + Struggle: 0.2, + Cut: 0.12, + Remove: 0.0, + }, + { + }, {"BaseMetal":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.9333333333333333,"red":1,"green":1,"blue":1,"alpha":1},"Rim":{"gamma":1,"saturation":1,"contrast":1,"brightness":0.65,"red":1,"green":1,"blue":1,"alpha":1}}, 6, false, + { + "ArmCuffs": "OrnateCuffs", + "LegCuffs": "OrnateLegCuffs", + "AnkleCuffs": "OrnateAnkleCuffs", + }, + { + "ArmCuffs": "CrystalCuffsArms", + "LegCuffs": "CrystalCuffsThigh", + "AnkleCuffs": "CrystalCuffsAnkles", + }, + true, false +); + +KDAddCuffVariants( + "Template", + "Obsidian", + "", + "obsidian", + {}, + ["Obsidian"], + [], + -1, + { + Color: "#ffffff", + }, + [], + { + Struggle: 0.1, + Cut: -0.05, + Remove: 0.05, + Pick: 0.05, + }, + { + }, + { + Struggle: -0.05, + Cut: -0.05, + Remove: 0.0, + Pick: 0.0, + }, + { + }, { + BaseMetal: {"gamma":1.2166666666666668,"saturation":0,"contrast":4.5,"brightness":0.3333333333333333,"red":1.0166666666666666,"green":0.9833333333333333,"blue":2.5333333333333337,"alpha":1}, + }, 6, false, + { + "ArmCuffs": "OrnateCuffs", + "LegCuffs": "OrnateLegCuffs", + "AnkleCuffs": "OrnateAnkleCuffs", + }, + { + "ArmCuffs": "CrystalCuffsArms", + "LegCuffs": "CrystalCuffsThigh", + "AnkleCuffs": "CrystalCuffsAnkles", + }, +); + + +KDAddHardSlimeVariants( + "HardSlime", + "LiquidMetal", + "", + "liquidMetalRestraints", + ["liquidMetal", "Metal"], + ["Latex", "Rubber", "SlimeHard"], + 6, + { + Color: ["#aaaaaa", "#aaaaaa", "#aaaaaa"], + Filters: { + Rubber: {"gamma":0.8666666666666667,"saturation":0,"contrast":0.8,"brightness":1,"red":1.5098039215686274,"green":1.5098039215686274,"blue":1.5098039215686274,"alpha":1}, + }, + factionColor: [], + factionFilters: { + Rubber: {color: "Catsuit", override: true}, + }, + }, + [ + {trigger: "tick", type: "ApplyConduction", duration: 2}, + {type: "Buff", trigger: "tick", power: -0.1, buffType: "electricDamageResist"}, + ], + { + Struggle: -0.1, + Cut: -0.2, + Remove: -1, + }, + { + }, +); + +KDAddHardSlimeVariants( + "Slime", + "ProtoSlime", + "", + "moldRestraints", + ["ProtoSlime"], + [], + -2, + { + Color: ["#404973", "#404973", "#404973"], + Filters: { + Slime: {"gamma":1.2833333333333332,"saturation":0.016666666666666666,"contrast":2.96,"brightness":0.5,"red":0.97058823529411764,"green":0.97058823529411764,"blue":0.97058823529411764,"alpha":1}, + }, + factionColor: [], + factionFilters: { + Slime: {color: "DarkNeutral", override: false}, + }, + }, + [ + ], + { + Struggle: .1, + Cut: 0, + Remove: 0.1, + }, + { + }, undefined, undefined, "ProtoSlime" +); +KDAddHardSlimeVariants( + "HardSlime", + "HardProtoSlime", + "", + "hardMoldRestraints", + ["ProtoSlime"], + [], + -1, + { + Color: ["#404973", "#404973", "#404973"], + Filters: { + Rubber: {"gamma":1.2833333333333332,"saturation":0.016666666666666666,"contrast":2.96,"brightness":0.5,"red":0.97058823529411764,"green":0.97058823529411764,"blue":0.97058823529411764,"alpha":1}, + }, + factionColor: [], + factionFilters: { + Rubber: {color: "DarkNeutral", override: false}, + }, + }, + [ + ], + { + Struggle: .1, + Cut: 0, + Remove: 0.1, + }, + { + } +); + + +KDAddHardSlimeVariants( + "Slime", + "CaptureFoam", + "", + "captureFoam", + ["CaptureFoam"], + [], + 2, + { + Color: ["#404973", "#404973", "#404973"], + Filters: { + Slime: {"gamma":1.2833333333333332,"saturation":0.016666666666666666,"contrast":2.96,"brightness":0.5,"red":0.97058823529411764,"green":0.97058823529411764,"blue":0.97058823529411764,"alpha":1}, + }, + factionColor: [], + factionFilters: { + Slime: {color: "DarkNeutral", override: false}, + }, + }, + [ + ], + { + Struggle: -0.1, + Cut: -0.1, + Remove: 0, + }, + { + }, undefined, undefined, "CaptureFoam" +); +KDAddHardSlimeVariants( + "HardSlime", + "HardCaptureFoam", + "", + "hardCaptureFoam", + ["CaptureFoam"], + [], + 2, + { + Color: ["#404973", "#404973", "#404973"], + Filters: { + Rubber: {"gamma":1.2833333333333332,"saturation":0.016666666666666666,"contrast":2.96,"brightness":0.5,"red":0.97058823529411764,"green":0.97058823529411764,"blue":0.97058823529411764,"alpha":1}, + }, + factionColor: [], + factionFilters: { + Rubber: {color: "DarkNeutral", override: false}, + }, + }, + [ + ], + { + Struggle: -0.1, + Cut: -.075, + Remove: -0.05, + }, + { + } +); + + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "Breastplate", + Group: "ItemBreast", + Asset: "PolishedChastityBra", + OverridePriority: 27, + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + debris: "Belts", + Model: "Breastplate", + escapeChance: { + "Struggle": 10, + "Cut": -0.5, + "Remove": 10 + }, + shrine: ["Armor", "ChestArmor", "MetalArmor", "Heavy"], + addPose: ["ChestArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + protection: 1, + displayPower: 4, + noRecover: true, + inventory: true, + removePrison: true, + events: [ + {trigger: "tick", type: "ApplyConduction", duration: 2}, + {trigger: "tick", type: "RestraintBlock", power: 2.5, inheritLinked: true}, + {trigger: "tick", type: "sneakBuff", power: -0.15, inheritLinked: true}, + ], +}, "Breastplate", "Rock-solid and form-fitting.", "Provides minor protection against enemy attacks. Decreases stealth.") +, [...KDHexVariantList.BaseWithShibari]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "Bustier", + Group: "ItemTorso", + Asset: "LeatherCorsetTop1", + AssetGroup: "Corset", + Model: "WarriorBustier", + debris: "Belts", + OverridePriority: 27, + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": 0.1, + "Cut": 0.1, + "Remove": 0.4, + }, + shrine: ["Armor", "TorsoArmor", "Light"], + addPose: ["TorsoArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + protection: 1, + displayPower: 3, + strictness: 0.05, + restriction: 1, + protectionCursed: true, + inventory: true, + noRecover: true, + removePrison: true, + events: [ + {trigger: "tick", type: "RestraintBlock", power: 1, inheritLinked: true}, + ], +}, "Adventuring Corset", "Protects your organs and your sense of style.", "Provides minor protection against enemy attacks at the cost of flexibility.") +, [...KDHexVariantList.BaseWithShibari]); + + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "Swimsuit", + Group: "ItemTorso", + Model: "Swimsuit", + remove: ["Cloth", "ClothLower", "Tops", "Skirts", "Shirts", "Pants"], + debris: "Belts", + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + inventory: true, + escapeChance: { + "Struggle": 0.2, + "Cut": 0.2, + "Remove": 0.5, + "Pick": 0.15, + }, + shrine: ["Armor", "TorsoArmor", "Cloth", "Swimsuits"], + addPose: ["TorsoArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategories: ["Armor", "Swimsuit"], linkSizes: [0.3, 0.6], + protection: 1, + displayPower: 2, + protectionCursed: true, + events: [ + {type: "Buff", trigger: "tick", power: 0.2, buffType: "glueDamageResist", inheritLinked: true}, + {type: "Buff", trigger: "tick", power: 0.2, buffType: "soapDamageResist", inheritLinked: true}, + {type: "Buff", trigger: "tick", power: 1.0, buffType: "DrySpeed", inheritLinked: true}, + {trigger: "tick", type: "evasionBuff", power: 0.1, inheritLinked: true}, + ], +}, "Swimsuit", "The best uniform. Has a (lockable) zipper in the back for convenience!", "Removes excess clothing and adds +10 Evasion. +20 Soap and Glue resist, and being drenched dries faster.") +, [...KDHexVariantList.Base]); + + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "RobeOfChastity", + Group: "ItemTorso", + Model: "TheRobeOfChastityRestraint", + remove: ["Cloth", "ClothLower", "Tops", "Skirts", "Shirts", "Pants", "Corsets"], + debris: "Belts", + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + inventory: true, + escapeChance: { + "Struggle": -50, + "Cut": -50, + "Remove": 0.25, + "Pick": -0.3, + }, + factionFilters: { + Fabric: {color: "DarkNeutral", override: true}, + Cape: {color: "DarkNeutral", override: true}, + Gold: {color: "Highlight", override: true}, + Pauldrons: {color: "Highlight", override: false}, + GoldBase: {color: "Highlight", override: false}, + Plate: {color: "LightNeutral", override: false}, + ChestPlate: {color: "LightNeutral", override: false}, + Frill: {color: "LightNeutral", override: true}, + }, + DefaultLock: "Divine", + shrine: ["Armor", "TorsoArmor", "Cloth"], + addPose: ["TorsoArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategories: ["Armor", "Swimsuit"], linkSizes: [0.3, 0.6], + protection: 3, + displayPower: 30, + protectionCursed: true, + events: [ + {type: "RobeOfChastity", trigger: "orgasm", count: 3, time: 50, inheritLinked: true}, + {type: "RobeOfChastity", trigger: "playerCast", count: 3, mult: 0.08, inheritLinked: true}, + {type: "RobeOfChastity", trigger: "tickAfter", power: 0.2, mult: 0.03, damage: "holy", dist: 3.5, inheritLinked: true}, + {type: "Buff", trigger: "tick", power: 0.5, buffType: "StatGainDistraction", inheritLinked: true}, + + ], +}, "Robe of Chastity", +"A magical leotard whose power stems directly from the divine. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it.", +"It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire.") +, [...KDHexVariantList.Base]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "ChainTunic", + Group: "ItemTorso", + Asset: "Bodice1", + Model: "ChainShirt", + AssetGroup: "Cloth", + Color: ["#808080", "#808080", "#808080"], + OverridePriority: 27, + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + debris: "Chains", + escapeChance: { + "Struggle": -0.1, + "Cut": -0.35, + "Remove": 0.35, + }, + protection: 2, + displayPower: 7, + protectionCursed: true, + inventory: true, + strictness: 0.08, + shrine: ["Armor", "TorsoArmor", "MetalArmor", "Heavy"], + addPose: ["TorsoArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + noRecover: true, + removePrison: true, + events: [ + {trigger: "tick", type: "ApplyConduction", duration: 2}, + {trigger: "tick", type: "armorBuff", power: 1.0, inheritLinked: true}, + {trigger: "tick", type: "RestraintBlock", power: 5, inheritLinked: true}, + {trigger: "tick", type: "evasionBuff", power: -0.5, inheritLinked: true}, + {trigger: "tick", type: "sneakBuff", power: -0.5, inheritLinked: true}, + ], +}, "Chainmail Tank Top", "Cumbersome, but effective!", "Provides +10 armor and protection against enemy attacks. Decreases stealth/evasion and makes struggling harder.") +, [...KDHexVariantList.BaseWithSkimpyShibari]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "ChainBikini", + Group: "ItemTorso", + Asset: "Bodice1", + Model: "ChainBikini", + AssetGroup: "Cloth", + Color: ["#808080", "#808080", "#808080"], + OverridePriority: 27, + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + debris: "Chains", + displayPower: 5, + escapeChance: { + "Struggle": 0.5, + "Cut": -0.35, + "Remove": 1, + }, + protection: 1, + protectionCursed: true, + inventory: true, + strictness: 0.08, + shrine: ["Armor", "TorsoArmor", "MetalArmor", "Light"], + addPose: ["TorsoArmor"], + + armor: true, bypass: true, + noRecover: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + removePrison: true, + events: [ + {trigger: "tick", type: "ApplyConduction", duration: 2}, + {trigger: "tick", type: "RestraintBlock", power: 2.0, inheritLinked: true}, + ], +}, "Chainmail Bikini", "Covers the important bits, anyway.", "+20 Bondage Resist. Conducts electricity.") +, [...KDHexVariantList.BaseWithShibari]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "SteelArmor", + Group: "ItemTorso", + Asset: "MistressTop", + Model: "ChainShirt", + AssetGroup: "Cloth", + restriction: 2, + Color: ["Default"], + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": -0.5, + "Cut": -0.5, + "Remove": 0.15, + }, + shrine: ["Armor", "TorsoArmor", "MetalArmor", "Heavy"], + addPose: ["TorsoArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + debris: "Belts", + protection: 3, + protectionCursed: true, + inventory: true, + strictness: 0.15, + displayPower: 10, + removePrison: true, + events: [ + {trigger: "tick", type: "ApplyConduction", duration: 2}, + {trigger: "tick", type: "armorBuff", power: 0.5, inheritLinked: true}, + {trigger: "tick", type: "RestraintBlock", power: 8, inheritLinked: true}, + ], +}, "Light Plate Armor", "Knight in shining rest-err, armor!", "Provides +5 armor and high protection. No impact to stealth or evasion") +, [...KDHexVariantList.BaseWithShibari]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "MageArmor", + Group: "ItemTorso", + Model: "RobeSleeves", + Asset: "GrandMage", + AssetGroup: "Cloth", + Color: ["#5555ff"], + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": 0, + "Cut": -0.5, + "Remove": 0.25, + }, + shrine: ["Armor", "Robe", "Mage"], + addPose: ["TorsoRobe"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + debris: "Belts", + protection: 1, + displayPower: 10, + removePrison: true, + inventory: true, + events: [ + {trigger: "perksBonus", type: "spellDamage", power: 0.3, inheritLinked: true}, + {trigger: "tick", type: "spellWardBuff", power: 1, inheritLinked: true}, + ], +}, "Wizard's Robe", "I have the power!", "+30% spell damage and +10 spell ward") +, [...KDHexVariantList.BaseWithShibari]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "SteelSkirt2", + Group: "ItemLegs", + Asset: "LatexSkirt2", + Model: "ChainSkirt2", + AssetGroup: "ClothLower", + Color: ["#ffffff"], + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": -0.5, + "Cut": -0.5, + "Remove": 0.35, + }, + shrine: ["Armor", "PelvisArmor", "MetalArmor", "Heavy"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + protection: 1, + debris: "Belts", + protectionCursed: true, + addPose: ["PelvisArmor"], + inventory: true, + displayPower: 5, + removePrison: true, + events: [ + {trigger: "tick", type: "ApplyConduction", duration: 2}, + {trigger: "tick", type: "RestraintBlock", power: 3.5, inheritLinked: true}, + ], +}, "Chain Skirt", "A defensive garment providing optimal coverage to the lower torso.", "Provides medium protection. No impact to stealth or evasion") +, [...KDHexVariantList.BaseWithSkimpyShibari]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "SteelSkirt", + Group: "ItemLegs", + Asset: "LatexSkirt2", + Model: "ChainSkirt", + AssetGroup: "ClothLower", + Color: ["#ffffff"], + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": -0.5, + "Cut": -0.5, + "Remove": 0.35, + }, + shrine: ["Armor", "PelvisArmor", "MetalArmor", "Heavy"], + addPose: ["PelvisArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + protection: 2, + debris: "Belts", + protectionCursed: true, + inventory: true, + displayPower: 8, + removePrison: true, + events: [ + {trigger: "tick", type: "ApplyConduction", duration: 2}, + {trigger: "tick", type: "armorBuff", power: 0.5, inheritLinked: true}, + {trigger: "tick", type: "RestraintBlock", power: 5, inheritLinked: true}, + ], +}, "Armored Skirt", "Knight in shining rest-err, armor!", "Provides +5 armor and high protection. No impact to stealth or evasion") +, [...KDHexVariantList.BaseWithSkimpyShibari]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "Gauntlets", + Group: "ItemHands", + Asset: "FingerlessGloves", + AssetGroup: "Gloves", + Model: "Gauntlets", + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": 10, + "Cut": -0.5, + "Remove": 10 + }, + shrine: ["Armor", "GlovesArmor", "MetalArmor", "Heavy"], + addPose: ["GlovesArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + debris: "Belts", + protection: 1, + displayPower: 5, + noRecover: true, + inventory: true, + removePrison: true, + events: [ + {trigger: "tick", type: "ApplyConduction", duration: 2}, + {trigger: "tick", type: "armorBuff", power: 0.5, inheritLinked: true}, + {trigger: "tick", type: "RestraintBlock", power: 2.5, inheritLinked: true}, + {trigger: "playerAttack", type: "armorNoise", chance: 0.4, dist: 8, vol: 0.15, sfx: "Chain", msg: "KinkyDungeonPunishPlayerArmor", inheritLinked: true}, + {trigger: "playerCast", type: "armorNoise", chance: 0.4, dist: 11, punishComponent: "Arms", vol: 0.15, sfx: "Chain", msg: "KinkyDungeonPunishPlayerArmor", inheritLinked: true}, + ], +}, "Gauntlets", "Gloves with an iron grip.", "Provides +5 armor and minor protection against enemy attacks. Makes noise when attacking.") +, [...KDHexVariantList.Base]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "LeatherGloves", + Group: "ItemHands", + Model: "LeatherGloves", + Asset: "BikerGloves", + AssetGroup: "Gloves", + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": 10, + "Cut": 0.1, + "Remove": 10 + }, + shrine: ["Armor", "GlovesArmor", "Light"], + addPose: ["GlovesArmor"], + + armor: true, bypass: true, + displayPower: 2, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + debris: "Belts", + protection: 1, + inventory: true, + removePrison: true, + events: [ + {trigger: "tick", type: "RestraintBlock", power: 1, inheritLinked: true}, + ], + noRecover: true, +}, "Leather Gloves", "Protecting you in style.", "Provides minor protection against enemy attacks.") +, [...KDHexVariantList.Base]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "Bracers", + Group: "ItemArms", + Asset: "FurBolero", + Model: "Pauldrons", + AssetGroup: "ClothAccessory", + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": 10, + "Cut": -0.5, + "Remove": 10 + }, + shrine: ["Armor", "ArmArmor", "Heavy"], + addPose: ["ArmArmor"], + + armor: true, bypass: true, + displayPower: 3, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + debris: "Belts", + inventory: true, + protection: 1, + removePrison: true, + events: [ + {trigger: "tick", type: "RestraintBlock", power: 1, inheritLinked: true}, + ], + noRecover: true, +}, "Steel Pauldrons", "Dependable protection for the average adventurer.", "Provides minor protection against enemy attacks.") +, [...KDHexVariantList.BaseWithShibari]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "Cape", + Group: "ItemArms", + Model: "Cape", + Filters: { + Front: {"gamma":1,"saturation":1,"contrast":1.1833333333333333,"brightness":0.48333333333333334,"red":0.95,"green":1.5333333333333332,"blue":1,"alpha":1}, + Back: {"gamma":1,"saturation":1,"contrast":1.1833333333333333,"brightness":0.21666666666666667,"red":0.95,"green":1.5333333333333332,"blue":1,"alpha":1}, + }, + Asset: "Cape", + AssetGroup: "ClothAccessory", + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": 10, + "Cut": -0.5, + "Remove": 10 + }, + shrine: ["Armor", "ArmArmor", "Light"], + addPose: ["ArmArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + debris: "Belts", + protection: 1, + displayPower: 6, + removePrison: true, + inventory: true, + events: [ + {trigger: "tick", type: "evasionBuff", power: .25, inheritLinked: true}, + {trigger: "tick", type: "sneakBuff", power: .15, inheritLinked: true}, + ], +}, "Ranger's Cape", "Inbued with the powers of moss and ferns and stuff.", "+25 Evasion. Increases stealth slightly.") +, [...KDHexVariantList.BaseWithShibari]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "MagicArmbands", + Group: "ItemArms", + Asset: "OrnateCuffs", + Model: "DragonArmband", + Color: ["#888888", "#9B63C5"], + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": 10, + "Cut": -0.5, + "Remove": 10 + }, + shrine: ["Armor", "ArmArmor", "MagicArmor", "Mage"], + addPose: ["ArmArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + debris: "Chains", + protection: 1, + displayPower: 5, + removePrison: true, + inventory: true, + events: [ + {trigger: "perksBonus", type: "spellDamage", power: 0.05, inheritLinked: true}, + {trigger: "tick", type: "spellWardBuff", power: 0.5, inheritLinked: true}, + ], +}, "Oracle's Armbands", "Armbands made of a slightly magical material.", "+5% spell damage. +5 Magic Armor.") +, [...KDHexVariantList.BaseWithShibari]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "SteelBoots", + Group: "ItemBoots", + Asset: "Boots1", + Model: "PlateBoots", + AssetGroup: "Shoes", + Color: ["#444444", "#222222"], + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": 10, + "Cut": -0.5, + "Remove": 10 + }, + shrine: ["Armor", "BootsArmor", "MetalArmor", "Heavy"], + addPose: ["BootsArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + protection: 1, + displayPower: 4, + debris: "Belts", + noRecover: true, + removePrison: true, + inventory: true, + events: [ + {trigger: "tick", type: "ApplyConduction", duration: 2}, + {trigger: "tick", type: "armorBuff", power: 0.5, inheritLinked: true}, + {trigger: "tick", type: "RestraintBlock", power: 2.5, inheritLinked: true}, + {trigger: "tick", type: "sneakBuff", power: -0.35, inheritLinked: true}, + ], +}, "Armored Boots", "Noisy, but fashionable!", "Provides +5 armor and protection against enemy attacks. Decreases stealth.") +, [...KDHexVariantList.Base]); + +KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ + name: "LeatherBoots", + Group: "ItemBoots", + Asset: "WoollyBootsTall", + AssetGroup: "Shoes", + Color: ["#808080"], + Model: "WarriorBoots", + showInQuickInv: true, good: true, + alwaysKeep: true, + alwaysRender: true, + UnderlinkedAlwaysRender: true, + escapeChance: { + "Struggle": 10, + "Cut": 0.1, + "Remove": 10 + }, + shrine: ["Armor", "BootsArmor", "Light"], + addPose: ["BootsArmor"], + + armor: true, bypass: true, + LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, + debris: "Belts", + displayPower: 2, + protection: 1, + removePrison: true, + inventory: true, + events: [ + {trigger: "tick", type: "RestraintBlock", power: 1.0, inheritLinked: true}, + ], + noRecover: true, +}, "Hide Boots", "For stepping into all kinds of trouble!", "Provides minor protection against enemy attacks.") +, [...KDHexVariantList.Base]); + +(() => { + let afterload = KDModsAfterLoad; + KDModsAfterLoad = () => { + // This is where you would add restraint variants in a mod + afterload(); + }; +})(); + + +let KDControlHarnessCategories = { + "Cuffs": { + activateCount: 3, + activateTags: ["CyberWristCuffs", "CyberAnkleCuffs", "CyberLegCuffs"], + activateFunction: (_e: KinkyDungeonEvent, item: item, _data: any, _invItems: item[]) => { + //if (!KinkyDungeonFlags.get("ControlHarnessCuffs")) { + + // If there are any cuffs to upgrade + let upgradedTags = ["ControlHArm", "ControlHAnkle", "ControlHLeg"]; + let addedGroup = {}; + if (upgradedTags.some((tag) => {return KinkyDungeonPlayerTags.get(tag) != true;})) { + let succ = false; + for (let rName of ["CyberHeels", "CyberMittens"]) { + if (KinkyDungeonPlayerTags.get("Item_"+rName)) continue; + let newRestraint = KinkyDungeonGetRestraintByName(rName); + if (addedGroup[newRestraint.Group]) continue; + addedGroup[newRestraint.Group] = true; + //KinkyDungeonLinkItem(newRestraint, item, item.tightness, ""); + if ( + KinkyDungeonAddRestraintIfWeaker(newRestraint, item.tightness, true, "", false, undefined, undefined, item.faction, true)) { + if (KDSoundEnabled()) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/RobotEngage.ogg"); + succ = true; + } + + } + if (succ) { + KinkyDungeonSendTextMessage(4, + TextGet("KDControlHarnessCuffsActivate"), + "#ffffff", + 1, + ); + } + + } + //KinkyDungeonSetFlag("ControlHarnessCuffs", 1); + //} + }, + updateFunction: (_e: KinkyDungeonEvent, _item: item, data: any, invItems: item[]) => { + let upgradedTags = ["ControlHArm", "ControlHAnkle", "ControlHLeg"]; + if (upgradedTags.some((tag) => {return KinkyDungeonPlayerTags.get(tag) != true;})) { + KinkyDungeonSendTextMessage(4, + TextGet("KDControlHarnessCuffsUpdate") + .replace("RESTRAINTNAME", TextGet("Restraint" + data.item.name)) + .replace("PERCENT", "" + Math.round(100 * invItems.length / 3)), + "#ffffff", + 1, + ); + } + }, + }, + "RemoteLink": { + activateCount: 0, + activateTags: [], + activateFunction: (_e: KinkyDungeonEvent, item: item, _data: any, _invItems: item[]) => { + //if (!KinkyDungeonFlags.get("ControlHarnessCuffs")) { + + // If there are any cuffs to upgrade + let upgradedTags = ["ControlHArm", "ControlHAnkle", "ControlHLeg"]; + let addedGroup = {}; + if (upgradedTags.some((tag) => {return KinkyDungeonPlayerTags.get(tag) != true;})) { + let succ = false; + for (let rName of ["CyberWristLink", "CyberElbowLink", "CyberThighLink", "CyberAnkleLink", "CyberAnkleLinkShort"]) { + if (KinkyDungeonPlayerTags.get("Item_"+rName)) continue; + let newRestraint = KinkyDungeonGetRestraintByName(rName); + if (addedGroup[newRestraint.Group]) continue; + addedGroup[newRestraint.Group] = true; + //KinkyDungeonLinkItem(newRestraint, item, item.tightness, ""); + if ( + KinkyDungeonAddRestraintIfWeaker(newRestraint, item.tightness, true, "", false, undefined, undefined, item.faction, true)) { + if (KDSoundEnabled()) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/RobotEngage.ogg"); + succ = true; + } + + } + if (succ) { + KinkyDungeonSendTextMessage(4, + TextGet("KDControlHarnessCuffsLink"), + "#ffffff", + 1, + ); + } + + } + //KinkyDungeonSetFlag("ControlHarnessCuffs", 1); + //} + }, + updateFunction: (_e: KinkyDungeonEvent, _item: item, _data: any, _invItems: item[]) => { + + }, + }, + "Chastity": { + activateCount: 2, + activateTags: ["CyberChastityL", "CyberChastityU"], + activateFunction: (_e: KinkyDungeonEvent, item: item, _data: any, _invItems: item[]) => { + if (!KinkyDungeonStatsChoice.get("arousalMode")) return; + //if (!KinkyDungeonFlags.get("ControlHarnessCuffs")) { + + // If there are any cuffs to upgrade + let fillGroups = ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemNipples"]; + if (fillGroups.some((group) => {return !KinkyDungeonGetRestraintItem(group);})) { + let Mode = CommonRandomItemFromList("", ["Edge", "Deny", "Fullpower"]); + if (KinkyDungeonGetRestraintItem("ItemVulva")) Mode = "Extra"; + KinkyDungeonSendTextMessage(4, + TextGet("KDControlHarnessChastityActivate") + .replace("CHASTITYMODE", TextGet("KDControlHarnessChastityMode_" + Mode)), + "#ffffff", + 1, + ); + let addList = ["RearVibe1", "TrapVibeProto", "NippleClamps"]; + if (Mode == "Edge") addList.push("TrapPlug2"); + else if (Mode == "Deny") addList.push("TrapPlug3"); + else if (Mode == "Fullpower") addList.push("TrapPlug5"); + for (let rName of addList) { + let newRestraint = KinkyDungeonGetRestraintByName(rName); + if (KinkyDungeonGetRestraintItem(KDRestraint(newRestraint).Group)) continue; + if ( + KinkyDungeonAddRestraintIfWeaker(newRestraint, item.tightness, true, "", false, undefined, undefined, item.faction, true)) { + if (KDSoundEnabled()) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/RobotEngage.ogg"); + } + } + + } + //KinkyDungeonSetFlag("ControlHarnessCuffs", 1); + //} + }, + updateFunction: (_e: KinkyDungeonEvent, _item: item, data: any, invItems: item[]) => { + if (!KinkyDungeonStatsChoice.get("arousalMode")) return; + + let fillGroups = ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemNipples"]; + if (fillGroups.some((group) => {return !KinkyDungeonGetRestraintItem(group);})) { + KinkyDungeonSendTextMessage(4, + TextGet("KDControlHarnessChastityUpdate") + .replace("RESTRAINTNAME", TextGet("Restraint" + data.item.name)) + .replace("PERCENT", "" + Math.round(100 * invItems.length / 2)), + "#ffffff", + 1, + ); + } + }, + }, +}; + +/** + */ +let KDSFXGroups: Record = { + "Handcuffs": { + sfx: "LockHeavy", + sfxEscape: { + Struggle: "LockLight", + Cut: "ClangLight", + Remove: "LockLight", + Pick: "Pick", + Unlock: "Unlock", + NoWill: "LockLight", + NoStamina: "LockLight", + NoMagic: "Shield", + }, + sfxFinishEscape: { + Struggle: "Clang", + Cut: "Clang", + Remove: "Unlock", + Pick: "Unlock", + Unlock: "Unlock", + Destroy: "ClangHeavy", + }, + sfxRemove: "Unlock", + }, + "Ropes": { + sfx: "Rope1", + sfxEscape: { + Struggle: "Rope2", + Cut: "Rope3", + Remove: "Rope2", + Pick: "Pick", + Unlock: "Unlock", + NoWill: "Rope4", + NoStamina: "Rope4", + NoMagic: "Rope4", + }, + sfxFinishEscape: { + Struggle: "Rope2", + Cut: "Rope2", + Remove: "Unlock", + Pick: "Unlock", + Unlock: "Rope2", + Destroy: "Rope2", + }, + sfxRemove: "Rope2", + }, + "Rubber": { + sfx: "Rubber2", + sfxEscape: { + Struggle: "Rubber3", + Cut: "Rubber4", + Remove: "Rubber3", + Pick: "Pick", + Unlock: "Unlock", + NoWill: "Rubber2", + NoStamina: "Rubber2", + NoMagic: "Rubber2", + }, + sfxFinishEscape: { + Struggle: "Rubber1", + Cut: "Rubber4", + Remove: "Rubber1", + Pick: "Pick", + Unlock: "Unlock", + Destroy: "Rubber4", + }, + sfxRemove: "Rubber1", + }, + "Leather": { + sfx: "ZipUp", + sfxEscape: { + Struggle: "Leather3", + Cut: "Leather1", + Remove: "Leather1", + Pick: "Pick", + Unlock: "Unlock", + NoWill: "Leather2", + NoStamina: "Leather2", + NoMagic: "Leather2", + }, + sfxFinishEscape: { + Struggle: "Leather4", + Cut: "Leather4", + Remove: "Leather4", + Pick: "Pick", + Unlock: "Unlock", + Destroy: "Leather4", + }, + sfxRemove: "Leather4", + }, + "Chains": { + sfx: "Chain", + sfxEscape: { + Struggle: "Chain2", + Cut: "Chain2", + Remove: "Chain4", + Pick: "Pick", + Unlock: "Unlock", + NoWill: "Chain3", + NoStamina: "Chain3", + NoMagic: "Chain3", + }, + sfxFinishEscape: { + Struggle: "Chain4", + Cut: "Chain4", + Remove: "Chain4", + Pick: "Pick", + Unlock: "Unlock", + Destroy: "Chain4", + }, + sfxRemove: "Chain4", + }, +}; + diff --git a/Game/src/restraint/KinkyDungeonSeals.ts b/Game/src/restraint/KinkyDungeonSeals.ts new file mode 100644 index 000000000..8a4cf15e8 --- /dev/null +++ b/Game/src/restraint/KinkyDungeonSeals.ts @@ -0,0 +1,19 @@ +"use strict"; + +// Seals are semi-permanent debuffs that afflict the player +// They come in groups, which are used to offer the player a choice between seals +// Seals come in two forms: Greater Seals, and Lesser Seals. +// Lesser Seals require a restoration shrine to remove. You may remove one Lesser Seal per restoration shrine. +// You can also use a Restoration Crystal to remove one. These are dropped by powerful minibosses. +// Greater Seals are safeguarded by powerful magic. To remove one you must use a Restoration Crystal. +// While you possess a Greater Seal, minibosses that drop Restoration Crystals will spawn on every floor with normal enemies. + +let KDSealGroups: Record = { + "LettingGo": { + arousalMode: true, + level: 1, + seals: [ + + ], + } +}; diff --git a/Icons/Accept.png b/Icons/Accept.png deleted file mode 100644 index e14081632..000000000 Binary files a/Icons/Accept.png and /dev/null differ diff --git a/Icons/Activity.png b/Icons/Activity.png deleted file mode 100644 index 69c6bf49c..000000000 Binary files a/Icons/Activity.png and /dev/null differ diff --git a/Icons/Arcade.png b/Icons/Arcade.png deleted file mode 100644 index ed271fdc1..000000000 Binary files a/Icons/Arcade.png and /dev/null differ diff --git a/Icons/Arousal.png b/Icons/Arousal.png deleted file mode 100644 index 69c6bf49c..000000000 Binary files a/Icons/Arousal.png and /dev/null differ diff --git a/Icons/Asylum.png b/Icons/Asylum.png deleted file mode 100644 index 5b1cc5fd4..000000000 Binary files a/Icons/Asylum.png and /dev/null differ diff --git a/Icons/Audio.png b/Icons/Audio.png deleted file mode 100644 index 5e4a7d66e..000000000 Binary files a/Icons/Audio.png and /dev/null differ diff --git a/Icons/Audio0.png b/Icons/Audio0.png deleted file mode 100644 index d4b63e010..000000000 Binary files a/Icons/Audio0.png and /dev/null differ diff --git a/Icons/Audio1.png b/Icons/Audio1.png deleted file mode 100644 index 03b916e33..000000000 Binary files a/Icons/Audio1.png and /dev/null differ diff --git a/Icons/Audio2.png b/Icons/Audio2.png deleted file mode 100644 index 1a6422f3a..000000000 Binary files a/Icons/Audio2.png and /dev/null differ diff --git a/Icons/Battle.png b/Icons/Battle.png deleted file mode 100644 index 5d5f2a8c9..000000000 Binary files a/Icons/Battle.png and /dev/null differ diff --git a/Icons/Bedroom.png b/Icons/Bedroom.png deleted file mode 100644 index 528d6ad3d..000000000 Binary files a/Icons/Bedroom.png and /dev/null differ diff --git a/Icons/BedroomBackground.png b/Icons/BedroomBackground.png deleted file mode 100644 index e7264a11e..000000000 Binary files a/Icons/BedroomBackground.png and /dev/null differ diff --git a/Icons/BlindToggle1.png b/Icons/BlindToggle1.png deleted file mode 100644 index df1243afc..000000000 Binary files a/Icons/BlindToggle1.png and /dev/null differ diff --git a/Icons/BlindToggle2.png b/Icons/BlindToggle2.png deleted file mode 100644 index 806f64209..000000000 Binary files a/Icons/BlindToggle2.png and /dev/null differ diff --git a/Icons/BlindToggle3.png b/Icons/BlindToggle3.png deleted file mode 100644 index ecf1c6aa8..000000000 Binary files a/Icons/BlindToggle3.png and /dev/null differ diff --git a/Icons/Cage.png b/Icons/Cage.png deleted file mode 100644 index 82f9d1bb9..000000000 Binary files a/Icons/Cage.png and /dev/null differ diff --git a/Icons/Camera.png b/Icons/Camera.png deleted file mode 100644 index cdd234e5f..000000000 Binary files a/Icons/Camera.png and /dev/null differ diff --git a/Icons/Cancel.png b/Icons/Cancel.png deleted file mode 100644 index 845514eab..000000000 Binary files a/Icons/Cancel.png and /dev/null differ diff --git a/Icons/Cell.png b/Icons/Cell.png deleted file mode 100644 index d7e94ec70..000000000 Binary files a/Icons/Cell.png and /dev/null differ diff --git a/Icons/ChangeLayersMouth.png b/Icons/ChangeLayersMouth.png deleted file mode 100644 index 72f8e2b26..000000000 Binary files a/Icons/ChangeLayersMouth.png and /dev/null differ diff --git a/Icons/Character.png b/Icons/Character.png deleted file mode 100644 index 56f8c5c98..000000000 Binary files a/Icons/Character.png and /dev/null differ diff --git a/Icons/CharacterOff.png b/Icons/CharacterOff.png deleted file mode 100644 index e585e8aba..000000000 Binary files a/Icons/CharacterOff.png and /dev/null differ diff --git a/Icons/Chat.png b/Icons/Chat.png deleted file mode 100644 index 55dcf71b3..000000000 Binary files a/Icons/Chat.png and /dev/null differ diff --git a/Icons/CheckLocked.png b/Icons/CheckLocked.png deleted file mode 100644 index 7f042ed63..000000000 Binary files a/Icons/CheckLocked.png and /dev/null differ diff --git a/Icons/CheckUnlocked.png b/Icons/CheckUnlocked.png deleted file mode 100644 index 76847c89d..000000000 Binary files a/Icons/CheckUnlocked.png and /dev/null differ diff --git a/Icons/Checked.png b/Icons/Checked.png deleted file mode 100644 index dad88fa50..000000000 Binary files a/Icons/Checked.png and /dev/null differ diff --git a/Icons/Chess.png b/Icons/Chess.png deleted file mode 100644 index 690fc08d3..000000000 Binary files a/Icons/Chess.png and /dev/null differ diff --git a/Icons/Chest.png b/Icons/Chest.png deleted file mode 100644 index 923fb7066..000000000 Binary files a/Icons/Chest.png and /dev/null differ diff --git a/Icons/Coffee.png b/Icons/Coffee.png deleted file mode 100644 index 1fde11ef3..000000000 Binary files a/Icons/Coffee.png and /dev/null differ diff --git a/Icons/College.png b/Icons/College.png deleted file mode 100644 index 5179fae23..000000000 Binary files a/Icons/College.png and /dev/null differ diff --git a/Icons/CollegeBackground.png b/Icons/CollegeBackground.png deleted file mode 100644 index e303559a8..000000000 Binary files a/Icons/CollegeBackground.png and /dev/null differ diff --git a/Icons/Color.png b/Icons/Color.png deleted file mode 100644 index d482b3751..000000000 Binary files a/Icons/Color.png and /dev/null differ diff --git a/Icons/ColorBlocked.png b/Icons/ColorBlocked.png deleted file mode 100644 index 148501b08..000000000 Binary files a/Icons/ColorBlocked.png and /dev/null differ diff --git a/Icons/ColorCancel.png b/Icons/ColorCancel.png deleted file mode 100644 index 845514eab..000000000 Binary files a/Icons/ColorCancel.png and /dev/null differ diff --git a/Icons/ColorPick.png b/Icons/ColorPick.png deleted file mode 100644 index 25993fed7..000000000 Binary files a/Icons/ColorPick.png and /dev/null differ diff --git a/Icons/ColorSelect.png b/Icons/ColorSelect.png deleted file mode 100644 index e14081632..000000000 Binary files a/Icons/ColorSelect.png and /dev/null differ diff --git a/Icons/Controller.png b/Icons/Controller.png deleted file mode 100644 index 8ae10ede2..000000000 Binary files a/Icons/Controller.png and /dev/null differ diff --git a/Icons/Couch.png b/Icons/Couch.png deleted file mode 100644 index f88b55b39..000000000 Binary files a/Icons/Couch.png and /dev/null differ diff --git a/Icons/Crafting.png b/Icons/Crafting.png deleted file mode 100644 index 1c8380063..000000000 Binary files a/Icons/Crafting.png and /dev/null differ diff --git a/Icons/CraftingCancel.png b/Icons/CraftingCancel.png deleted file mode 100644 index 845514eab..000000000 Binary files a/Icons/CraftingCancel.png and /dev/null differ diff --git a/Icons/Crying.png b/Icons/Crying.png deleted file mode 100644 index b3713f147..000000000 Binary files a/Icons/Crying.png and /dev/null differ diff --git a/Icons/DialogNormalMode.png b/Icons/DialogNormalMode.png deleted file mode 100644 index 5e2d84869..000000000 Binary files a/Icons/DialogNormalMode.png and /dev/null differ diff --git a/Icons/DialogPermissionMode.png b/Icons/DialogPermissionMode.png deleted file mode 100644 index 04e4f22ee..000000000 Binary files a/Icons/DialogPermissionMode.png and /dev/null differ diff --git a/Icons/Diaper.png b/Icons/Diaper.png deleted file mode 100644 index dc720cbe9..000000000 Binary files a/Icons/Diaper.png and /dev/null differ diff --git a/Icons/DiceHide.png b/Icons/DiceHide.png deleted file mode 100644 index 811441f71..000000000 Binary files a/Icons/DiceHide.png and /dev/null differ diff --git a/Icons/DiceTheft.png b/Icons/DiceTheft.png deleted file mode 100644 index 98087b410..000000000 Binary files a/Icons/DiceTheft.png and /dev/null differ diff --git a/Icons/Difficulty.png b/Icons/Difficulty.png deleted file mode 100644 index 79c099065..000000000 Binary files a/Icons/Difficulty.png and /dev/null differ diff --git a/Icons/Dismount.png b/Icons/Dismount.png deleted file mode 100644 index b4e1bbe1c..000000000 Binary files a/Icons/Dismount.png and /dev/null differ diff --git a/Icons/Dojo.png b/Icons/Dojo.png deleted file mode 100644 index 77e3233a0..000000000 Binary files a/Icons/Dojo.png and /dev/null differ diff --git a/Icons/Down.png b/Icons/Down.png deleted file mode 100644 index 90c27d053..000000000 Binary files a/Icons/Down.png and /dev/null differ diff --git a/Icons/Dress.png b/Icons/Dress.png deleted file mode 100644 index 8508d434e..000000000 Binary files a/Icons/Dress.png and /dev/null differ diff --git a/Icons/DressReset.png b/Icons/DressReset.png deleted file mode 100644 index 5e0ef9197..000000000 Binary files a/Icons/DressReset.png and /dev/null differ diff --git a/Icons/Dropdown.png b/Icons/Dropdown.png deleted file mode 100644 index 5f17c8a78..000000000 Binary files a/Icons/Dropdown.png and /dev/null differ diff --git a/Icons/East.png b/Icons/East.png deleted file mode 100644 index 570b88742..000000000 Binary files a/Icons/East.png and /dev/null differ diff --git a/Icons/Escape.png b/Icons/Escape.png deleted file mode 100644 index 6f8003f9c..000000000 Binary files a/Icons/Escape.png and /dev/null differ diff --git a/Icons/Exit.png b/Icons/Exit.png deleted file mode 100644 index 3550def44..000000000 Binary files a/Icons/Exit.png and /dev/null differ diff --git a/Icons/Explore.png b/Icons/Explore.png deleted file mode 100644 index a5b32a7fb..000000000 Binary files a/Icons/Explore.png and /dev/null differ diff --git a/Icons/Export.png b/Icons/Export.png deleted file mode 100644 index afb1cd36e..000000000 Binary files a/Icons/Export.png and /dev/null differ diff --git a/Icons/Foto.png b/Icons/Foto.png deleted file mode 100644 index 3532ed982..000000000 Binary files a/Icons/Foto.png and /dev/null differ diff --git a/Icons/FriendList.png b/Icons/FriendList.png deleted file mode 100644 index 3c7499b25..000000000 Binary files a/Icons/FriendList.png and /dev/null differ diff --git a/Icons/GGTS.png b/Icons/GGTS.png deleted file mode 100644 index 75992d638..000000000 Binary files a/Icons/GGTS.png and /dev/null differ diff --git a/Icons/GGTSControl.png b/Icons/GGTSControl.png deleted file mode 100644 index 75992d638..000000000 Binary files a/Icons/GGTSControl.png and /dev/null differ diff --git a/Icons/Gavel.png b/Icons/Gavel.png deleted file mode 100644 index a28b6abac..000000000 Binary files a/Icons/Gavel.png and /dev/null differ diff --git a/Icons/General.png b/Icons/General.png deleted file mode 100644 index d7551eaa1..000000000 Binary files a/Icons/General.png and /dev/null differ diff --git a/Icons/GhostList.png b/Icons/GhostList.png deleted file mode 100644 index 72ac80fb5..000000000 Binary files a/Icons/GhostList.png and /dev/null differ diff --git a/Icons/Graphics.png b/Icons/Graphics.png deleted file mode 100644 index eea3c8b58..000000000 Binary files a/Icons/Graphics.png and /dev/null differ diff --git a/Icons/Here.png b/Icons/Here.png deleted file mode 100644 index dc5171013..000000000 Binary files a/Icons/Here.png and /dev/null differ diff --git a/Icons/HiddenItem.png b/Icons/HiddenItem.png deleted file mode 100644 index e8a7b2e22..000000000 Binary files a/Icons/HiddenItem.png and /dev/null differ diff --git a/Icons/Horse.png b/Icons/Horse.png deleted file mode 100644 index ad4bb23d0..000000000 Binary files a/Icons/Horse.png and /dev/null differ diff --git a/Icons/Immersion.png b/Icons/Immersion.png deleted file mode 100644 index 56a07442c..000000000 Binary files a/Icons/Immersion.png and /dev/null differ diff --git a/Icons/Import.png b/Icons/Import.png deleted file mode 100644 index c9c7d5e7d..000000000 Binary files a/Icons/Import.png and /dev/null differ diff --git a/Icons/Infiltration.png b/Icons/Infiltration.png deleted file mode 100644 index 718eb9ad1..000000000 Binary files a/Icons/Infiltration.png and /dev/null differ diff --git a/Icons/Information.svg b/Icons/Information.svg deleted file mode 100644 index 759ce520e..000000000 --- a/Icons/Information.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Icons/InspectLock.png b/Icons/InspectLock.png deleted file mode 100644 index 5fdb1fd9b..000000000 Binary files a/Icons/InspectLock.png and /dev/null differ diff --git a/Icons/Introduction.png b/Icons/Introduction.png deleted file mode 100644 index a71e6eb39..000000000 Binary files a/Icons/Introduction.png and /dev/null differ diff --git a/Icons/Kidnap.png b/Icons/Kidnap.png deleted file mode 100644 index 8368a4640..000000000 Binary files a/Icons/Kidnap.png and /dev/null differ diff --git a/Icons/KinkyDungeon.png b/Icons/KinkyDungeon.png deleted file mode 100644 index 41f727f17..000000000 Binary files a/Icons/KinkyDungeon.png and /dev/null differ diff --git a/Icons/Kneel.png b/Icons/Kneel.png deleted file mode 100644 index 9e019347d..000000000 Binary files a/Icons/Kneel.png and /dev/null differ diff --git a/Icons/LARP/ArtistBlack.png b/Icons/LARP/ArtistBlack.png deleted file mode 100644 index 6c8013b73..000000000 Binary files a/Icons/LARP/ArtistBlack.png and /dev/null differ diff --git a/Icons/LARP/ArtistBlue.png b/Icons/LARP/ArtistBlue.png deleted file mode 100644 index a7c52d3b4..000000000 Binary files a/Icons/LARP/ArtistBlue.png and /dev/null differ diff --git a/Icons/LARP/ArtistCyan.png b/Icons/LARP/ArtistCyan.png deleted file mode 100644 index 6cfad52e9..000000000 Binary files a/Icons/LARP/ArtistCyan.png and /dev/null differ diff --git a/Icons/LARP/ArtistGray.png b/Icons/LARP/ArtistGray.png deleted file mode 100644 index 76bc7f3d2..000000000 Binary files a/Icons/LARP/ArtistGray.png and /dev/null differ diff --git a/Icons/LARP/ArtistGreen.png b/Icons/LARP/ArtistGreen.png deleted file mode 100644 index 4f5f24a35..000000000 Binary files a/Icons/LARP/ArtistGreen.png and /dev/null differ diff --git a/Icons/LARP/ArtistOrange.png b/Icons/LARP/ArtistOrange.png deleted file mode 100644 index f78f176c6..000000000 Binary files a/Icons/LARP/ArtistOrange.png and /dev/null differ diff --git a/Icons/LARP/ArtistPurple.png b/Icons/LARP/ArtistPurple.png deleted file mode 100644 index ce17ed7cf..000000000 Binary files a/Icons/LARP/ArtistPurple.png and /dev/null differ diff --git a/Icons/LARP/ArtistRed.png b/Icons/LARP/ArtistRed.png deleted file mode 100644 index 9c6db7d70..000000000 Binary files a/Icons/LARP/ArtistRed.png and /dev/null differ diff --git a/Icons/LARP/ArtistWhite.png b/Icons/LARP/ArtistWhite.png deleted file mode 100644 index 44acc2e11..000000000 Binary files a/Icons/LARP/ArtistWhite.png and /dev/null differ diff --git a/Icons/LARP/ArtistYellow.png b/Icons/LARP/ArtistYellow.png deleted file mode 100644 index 71580ab0d..000000000 Binary files a/Icons/LARP/ArtistYellow.png and /dev/null differ diff --git a/Icons/LARP/MatronBlack.png b/Icons/LARP/MatronBlack.png deleted file mode 100644 index 3eae16a89..000000000 Binary files a/Icons/LARP/MatronBlack.png and /dev/null differ diff --git a/Icons/LARP/MatronBlue.png b/Icons/LARP/MatronBlue.png deleted file mode 100644 index 09cd3000d..000000000 Binary files a/Icons/LARP/MatronBlue.png and /dev/null differ diff --git a/Icons/LARP/MatronCyan.png b/Icons/LARP/MatronCyan.png deleted file mode 100644 index 92f334a59..000000000 Binary files a/Icons/LARP/MatronCyan.png and /dev/null differ diff --git a/Icons/LARP/MatronGray.png b/Icons/LARP/MatronGray.png deleted file mode 100644 index de05259d6..000000000 Binary files a/Icons/LARP/MatronGray.png and /dev/null differ diff --git a/Icons/LARP/MatronGreen.png b/Icons/LARP/MatronGreen.png deleted file mode 100644 index 408e0ace9..000000000 Binary files a/Icons/LARP/MatronGreen.png and /dev/null differ diff --git a/Icons/LARP/MatronOrange.png b/Icons/LARP/MatronOrange.png deleted file mode 100644 index 72db0478a..000000000 Binary files a/Icons/LARP/MatronOrange.png and /dev/null differ diff --git a/Icons/LARP/MatronPurple.png b/Icons/LARP/MatronPurple.png deleted file mode 100644 index c3f66cac8..000000000 Binary files a/Icons/LARP/MatronPurple.png and /dev/null differ diff --git a/Icons/LARP/MatronRed.png b/Icons/LARP/MatronRed.png deleted file mode 100644 index bb96fa1a0..000000000 Binary files a/Icons/LARP/MatronRed.png and /dev/null differ diff --git a/Icons/LARP/MatronWhite.png b/Icons/LARP/MatronWhite.png deleted file mode 100644 index 516b78d3b..000000000 Binary files a/Icons/LARP/MatronWhite.png and /dev/null differ diff --git a/Icons/LARP/MatronYellow.png b/Icons/LARP/MatronYellow.png deleted file mode 100644 index 7c1e493be..000000000 Binary files a/Icons/LARP/MatronYellow.png and /dev/null differ diff --git a/Icons/LARP/ProtectorBlack.png b/Icons/LARP/ProtectorBlack.png deleted file mode 100644 index 784f0a8be..000000000 Binary files a/Icons/LARP/ProtectorBlack.png and /dev/null differ diff --git a/Icons/LARP/ProtectorBlue.png b/Icons/LARP/ProtectorBlue.png deleted file mode 100644 index b1960072f..000000000 Binary files a/Icons/LARP/ProtectorBlue.png and /dev/null differ diff --git a/Icons/LARP/ProtectorCyan.png b/Icons/LARP/ProtectorCyan.png deleted file mode 100644 index 6314d9130..000000000 Binary files a/Icons/LARP/ProtectorCyan.png and /dev/null differ diff --git a/Icons/LARP/ProtectorGray.png b/Icons/LARP/ProtectorGray.png deleted file mode 100644 index 24b0ed96c..000000000 Binary files a/Icons/LARP/ProtectorGray.png and /dev/null differ diff --git a/Icons/LARP/ProtectorGreen.png b/Icons/LARP/ProtectorGreen.png deleted file mode 100644 index cc72c9e66..000000000 Binary files a/Icons/LARP/ProtectorGreen.png and /dev/null differ diff --git a/Icons/LARP/ProtectorOrange.png b/Icons/LARP/ProtectorOrange.png deleted file mode 100644 index 93d0b127b..000000000 Binary files a/Icons/LARP/ProtectorOrange.png and /dev/null differ diff --git a/Icons/LARP/ProtectorPurple.png b/Icons/LARP/ProtectorPurple.png deleted file mode 100644 index 3a3f726bf..000000000 Binary files a/Icons/LARP/ProtectorPurple.png and /dev/null differ diff --git a/Icons/LARP/ProtectorRed.png b/Icons/LARP/ProtectorRed.png deleted file mode 100644 index 0494c0f7c..000000000 Binary files a/Icons/LARP/ProtectorRed.png and /dev/null differ diff --git a/Icons/LARP/ProtectorWhite.png b/Icons/LARP/ProtectorWhite.png deleted file mode 100644 index a6fadea31..000000000 Binary files a/Icons/LARP/ProtectorWhite.png and /dev/null differ diff --git a/Icons/LARP/ProtectorYellow.png b/Icons/LARP/ProtectorYellow.png deleted file mode 100644 index 237b6abff..000000000 Binary files a/Icons/LARP/ProtectorYellow.png and /dev/null differ diff --git a/Icons/LARP/SeducerBlack.png b/Icons/LARP/SeducerBlack.png deleted file mode 100644 index 7b31bb6ff..000000000 Binary files a/Icons/LARP/SeducerBlack.png and /dev/null differ diff --git a/Icons/LARP/SeducerBlue.png b/Icons/LARP/SeducerBlue.png deleted file mode 100644 index 873ccc3a2..000000000 Binary files a/Icons/LARP/SeducerBlue.png and /dev/null differ diff --git a/Icons/LARP/SeducerCyan.png b/Icons/LARP/SeducerCyan.png deleted file mode 100644 index 608c43d3b..000000000 Binary files a/Icons/LARP/SeducerCyan.png and /dev/null differ diff --git a/Icons/LARP/SeducerGray.png b/Icons/LARP/SeducerGray.png deleted file mode 100644 index bf4fe03c9..000000000 Binary files a/Icons/LARP/SeducerGray.png and /dev/null differ diff --git a/Icons/LARP/SeducerGreen.png b/Icons/LARP/SeducerGreen.png deleted file mode 100644 index 79a24476f..000000000 Binary files a/Icons/LARP/SeducerGreen.png and /dev/null differ diff --git a/Icons/LARP/SeducerOrange.png b/Icons/LARP/SeducerOrange.png deleted file mode 100644 index c8eef1da8..000000000 Binary files a/Icons/LARP/SeducerOrange.png and /dev/null differ diff --git a/Icons/LARP/SeducerPurple.png b/Icons/LARP/SeducerPurple.png deleted file mode 100644 index 6a0661037..000000000 Binary files a/Icons/LARP/SeducerPurple.png and /dev/null differ diff --git a/Icons/LARP/SeducerRed.png b/Icons/LARP/SeducerRed.png deleted file mode 100644 index 64da45796..000000000 Binary files a/Icons/LARP/SeducerRed.png and /dev/null differ diff --git a/Icons/LARP/SeducerWhite.png b/Icons/LARP/SeducerWhite.png deleted file mode 100644 index bc7e123f5..000000000 Binary files a/Icons/LARP/SeducerWhite.png and /dev/null differ diff --git a/Icons/LARP/SeducerYellow.png b/Icons/LARP/SeducerYellow.png deleted file mode 100644 index a87f5d434..000000000 Binary files a/Icons/LARP/SeducerYellow.png and /dev/null differ diff --git a/Icons/LARP/ServantBlack.png b/Icons/LARP/ServantBlack.png deleted file mode 100644 index ac34bc0f4..000000000 Binary files a/Icons/LARP/ServantBlack.png and /dev/null differ diff --git a/Icons/LARP/ServantBlue.png b/Icons/LARP/ServantBlue.png deleted file mode 100644 index 8c3024640..000000000 Binary files a/Icons/LARP/ServantBlue.png and /dev/null differ diff --git a/Icons/LARP/ServantCyan.png b/Icons/LARP/ServantCyan.png deleted file mode 100644 index 41ad0de50..000000000 Binary files a/Icons/LARP/ServantCyan.png and /dev/null differ diff --git a/Icons/LARP/ServantGray.png b/Icons/LARP/ServantGray.png deleted file mode 100644 index 31563cb8b..000000000 Binary files a/Icons/LARP/ServantGray.png and /dev/null differ diff --git a/Icons/LARP/ServantGreen.png b/Icons/LARP/ServantGreen.png deleted file mode 100644 index 6d88bbb13..000000000 Binary files a/Icons/LARP/ServantGreen.png and /dev/null differ diff --git a/Icons/LARP/ServantOrange.png b/Icons/LARP/ServantOrange.png deleted file mode 100644 index 0fbcb55e2..000000000 Binary files a/Icons/LARP/ServantOrange.png and /dev/null differ diff --git a/Icons/LARP/ServantPurple.png b/Icons/LARP/ServantPurple.png deleted file mode 100644 index 32298b4db..000000000 Binary files a/Icons/LARP/ServantPurple.png and /dev/null differ diff --git a/Icons/LARP/ServantRed.png b/Icons/LARP/ServantRed.png deleted file mode 100644 index 7475e5669..000000000 Binary files a/Icons/LARP/ServantRed.png and /dev/null differ diff --git a/Icons/LARP/ServantWhite.png b/Icons/LARP/ServantWhite.png deleted file mode 100644 index 657d85f34..000000000 Binary files a/Icons/LARP/ServantWhite.png and /dev/null differ diff --git a/Icons/LARP/ServantYellow.png b/Icons/LARP/ServantYellow.png deleted file mode 100644 index 77eb1ad6a..000000000 Binary files a/Icons/LARP/ServantYellow.png and /dev/null differ diff --git a/Icons/LARP/TricksterBlack.png b/Icons/LARP/TricksterBlack.png deleted file mode 100644 index c4094fd62..000000000 Binary files a/Icons/LARP/TricksterBlack.png and /dev/null differ diff --git a/Icons/LARP/TricksterBlue.png b/Icons/LARP/TricksterBlue.png deleted file mode 100644 index 2d5e6b8e0..000000000 Binary files a/Icons/LARP/TricksterBlue.png and /dev/null differ diff --git a/Icons/LARP/TricksterCyan.png b/Icons/LARP/TricksterCyan.png deleted file mode 100644 index a0a0595e6..000000000 Binary files a/Icons/LARP/TricksterCyan.png and /dev/null differ diff --git a/Icons/LARP/TricksterGray.png b/Icons/LARP/TricksterGray.png deleted file mode 100644 index 67ad97137..000000000 Binary files a/Icons/LARP/TricksterGray.png and /dev/null differ diff --git a/Icons/LARP/TricksterGreen.png b/Icons/LARP/TricksterGreen.png deleted file mode 100644 index 08a914aa6..000000000 Binary files a/Icons/LARP/TricksterGreen.png and /dev/null differ diff --git a/Icons/LARP/TricksterOrange.png b/Icons/LARP/TricksterOrange.png deleted file mode 100644 index bcaaa697b..000000000 Binary files a/Icons/LARP/TricksterOrange.png and /dev/null differ diff --git a/Icons/LARP/TricksterPurple.png b/Icons/LARP/TricksterPurple.png deleted file mode 100644 index 6de33734f..000000000 Binary files a/Icons/LARP/TricksterPurple.png and /dev/null differ diff --git a/Icons/LARP/TricksterRed.png b/Icons/LARP/TricksterRed.png deleted file mode 100644 index c270f1471..000000000 Binary files a/Icons/LARP/TricksterRed.png and /dev/null differ diff --git a/Icons/LARP/TricksterWhite.png b/Icons/LARP/TricksterWhite.png deleted file mode 100644 index d7ae722d2..000000000 Binary files a/Icons/LARP/TricksterWhite.png and /dev/null differ diff --git a/Icons/LARP/TricksterYellow.png b/Icons/LARP/TricksterYellow.png deleted file mode 100644 index 85c71635d..000000000 Binary files a/Icons/LARP/TricksterYellow.png and /dev/null differ diff --git a/Icons/Lightbulb.png b/Icons/Lightbulb.png deleted file mode 100644 index 0a1f98f86..000000000 Binary files a/Icons/Lightbulb.png and /dev/null differ diff --git a/Icons/Lock.png b/Icons/Lock.png deleted file mode 100644 index e57e6a8fd..000000000 Binary files a/Icons/Lock.png and /dev/null differ diff --git a/Icons/LockCancel.png b/Icons/LockCancel.png deleted file mode 100644 index 845514eab..000000000 Binary files a/Icons/LockCancel.png and /dev/null differ diff --git a/Icons/LockMenu.png b/Icons/LockMenu.png deleted file mode 100644 index 2420734a4..000000000 Binary files a/Icons/LockMenu.png and /dev/null differ diff --git a/Icons/Locked.png b/Icons/Locked.png deleted file mode 100644 index 57f84af23..000000000 Binary files a/Icons/Locked.png and /dev/null differ diff --git a/Icons/Logo.png b/Icons/Logo.png deleted file mode 100644 index b878f7408..000000000 Binary files a/Icons/Logo.png and /dev/null differ diff --git a/Icons/Magic.png b/Icons/Magic.png deleted file mode 100644 index 7a252b522..000000000 Binary files a/Icons/Magic.png and /dev/null differ diff --git a/Icons/MagicBattle/HouseAmplector.png b/Icons/MagicBattle/HouseAmplector.png deleted file mode 100644 index fbb9aacce..000000000 Binary files a/Icons/MagicBattle/HouseAmplector.png and /dev/null differ diff --git a/Icons/MagicBattle/HouseCorporis.png b/Icons/MagicBattle/HouseCorporis.png deleted file mode 100644 index 44e8e92ee..000000000 Binary files a/Icons/MagicBattle/HouseCorporis.png and /dev/null differ diff --git a/Icons/MagicBattle/HouseMaiestas.png b/Icons/MagicBattle/HouseMaiestas.png deleted file mode 100644 index 83fe31d7e..000000000 Binary files a/Icons/MagicBattle/HouseMaiestas.png and /dev/null differ diff --git a/Icons/MagicBattle/HouseVincula.png b/Icons/MagicBattle/HouseVincula.png deleted file mode 100644 index b8809c1a4..000000000 Binary files a/Icons/MagicBattle/HouseVincula.png and /dev/null differ diff --git a/Icons/MagicBattle/Independent.png b/Icons/MagicBattle/Independent.png deleted file mode 100644 index 3021a1167..000000000 Binary files a/Icons/MagicBattle/Independent.png and /dev/null differ diff --git a/Icons/MagicSchool.png b/Icons/MagicSchool.png deleted file mode 100644 index 18d9d6245..000000000 Binary files a/Icons/MagicSchool.png and /dev/null differ diff --git a/Icons/Maid.png b/Icons/Maid.png deleted file mode 100644 index 7822de6ed..000000000 Binary files a/Icons/Maid.png and /dev/null differ diff --git a/Icons/Management.png b/Icons/Management.png deleted file mode 100644 index 8aae7a48e..000000000 Binary files a/Icons/Management.png and /dev/null differ diff --git a/Icons/Minus.png b/Icons/Minus.png deleted file mode 100644 index 919852c72..000000000 Binary files a/Icons/Minus.png and /dev/null differ diff --git a/Icons/MovieStudio.png b/Icons/MovieStudio.png deleted file mode 100644 index ed2292135..000000000 Binary files a/Icons/MovieStudio.png and /dev/null differ diff --git a/Icons/MultiColor.png b/Icons/MultiColor.png deleted file mode 100644 index ceab61c82..000000000 Binary files a/Icons/MultiColor.png and /dev/null differ diff --git a/Icons/MultiColorPick.png b/Icons/MultiColorPick.png deleted file mode 100644 index 61cfa5ceb..000000000 Binary files a/Icons/MultiColorPick.png and /dev/null differ diff --git a/Icons/Naked.png b/Icons/Naked.png deleted file mode 100644 index 9ce9fe5e8..000000000 Binary files a/Icons/Naked.png and /dev/null differ diff --git a/Icons/Next.png b/Icons/Next.png deleted file mode 100644 index 1364a3b98..000000000 Binary files a/Icons/Next.png and /dev/null differ diff --git a/Icons/North.png b/Icons/North.png deleted file mode 100644 index 5a8bfbce9..000000000 Binary files a/Icons/North.png and /dev/null differ diff --git a/Icons/Notifications.png b/Icons/Notifications.png deleted file mode 100644 index 6f0fb9b17..000000000 Binary files a/Icons/Notifications.png and /dev/null differ diff --git a/Icons/Online.png b/Icons/Online.png deleted file mode 100644 index 6b09ba057..000000000 Binary files a/Icons/Online.png and /dev/null differ diff --git a/Icons/Paint.png b/Icons/Paint.png deleted file mode 100644 index 60110a966..000000000 Binary files a/Icons/Paint.png and /dev/null differ diff --git a/Icons/PickLock.png b/Icons/PickLock.png deleted file mode 100644 index e4982fa7b..000000000 Binary files a/Icons/PickLock.png and /dev/null differ diff --git a/Icons/PickLockJammed.png b/Icons/PickLockJammed.png deleted file mode 100644 index 805d82cca..000000000 Binary files a/Icons/PickLockJammed.png and /dev/null differ diff --git a/Icons/Platform.png b/Icons/Platform.png deleted file mode 100644 index fae7b40ac..000000000 Binary files a/Icons/Platform.png and /dev/null differ diff --git a/Icons/Player.png b/Icons/Player.png deleted file mode 100644 index 940920047..000000000 Binary files a/Icons/Player.png and /dev/null differ diff --git a/Icons/Plus.png b/Icons/Plus.png deleted file mode 100644 index f2326a995..000000000 Binary files a/Icons/Plus.png and /dev/null differ diff --git a/Icons/Poker.png b/Icons/Poker.png deleted file mode 100644 index 9098ef3a2..000000000 Binary files a/Icons/Poker.png and /dev/null differ diff --git a/Icons/Poses/AllFours.png b/Icons/Poses/AllFours.png deleted file mode 100644 index fc578089e..000000000 Binary files a/Icons/Poses/AllFours.png and /dev/null differ diff --git a/Icons/Poses/BackBoxTie.png b/Icons/Poses/BackBoxTie.png deleted file mode 100644 index e4244f688..000000000 Binary files a/Icons/Poses/BackBoxTie.png and /dev/null differ diff --git a/Icons/Poses/BackCuffs.png b/Icons/Poses/BackCuffs.png deleted file mode 100644 index cc16551a4..000000000 Binary files a/Icons/Poses/BackCuffs.png and /dev/null differ diff --git a/Icons/Poses/BackElbowTouch.png b/Icons/Poses/BackElbowTouch.png deleted file mode 100644 index 00952d41e..000000000 Binary files a/Icons/Poses/BackElbowTouch.png and /dev/null differ diff --git a/Icons/Poses/BaseLower.png b/Icons/Poses/BaseLower.png deleted file mode 100644 index ad29adc6b..000000000 Binary files a/Icons/Poses/BaseLower.png and /dev/null differ diff --git a/Icons/Poses/BaseUpper.png b/Icons/Poses/BaseUpper.png deleted file mode 100644 index bf16cbf22..000000000 Binary files a/Icons/Poses/BaseUpper.png and /dev/null differ diff --git a/Icons/Poses/Kneel.png b/Icons/Poses/Kneel.png deleted file mode 100644 index a674703c7..000000000 Binary files a/Icons/Poses/Kneel.png and /dev/null differ diff --git a/Icons/Poses/KneelingSpread.png b/Icons/Poses/KneelingSpread.png deleted file mode 100644 index 2a7432617..000000000 Binary files a/Icons/Poses/KneelingSpread.png and /dev/null differ diff --git a/Icons/Poses/LegsClosed.png b/Icons/Poses/LegsClosed.png deleted file mode 100644 index d65d58c0b..000000000 Binary files a/Icons/Poses/LegsClosed.png and /dev/null differ diff --git a/Icons/Poses/OverTheHead.png b/Icons/Poses/OverTheHead.png deleted file mode 100644 index d11b8764d..000000000 Binary files a/Icons/Poses/OverTheHead.png and /dev/null differ diff --git a/Icons/Poses/Yoked.png b/Icons/Poses/Yoked.png deleted file mode 100644 index e8aac7218..000000000 Binary files a/Icons/Poses/Yoked.png and /dev/null differ diff --git a/Icons/Preference.png b/Icons/Preference.png deleted file mode 100644 index 04e4f22ee..000000000 Binary files a/Icons/Preference.png and /dev/null differ diff --git a/Icons/Prev.png b/Icons/Prev.png deleted file mode 100644 index dff65e094..000000000 Binary files a/Icons/Prev.png and /dev/null differ diff --git a/Icons/Previews/AllowedLimited.png b/Icons/Previews/AllowedLimited.png deleted file mode 100644 index 37296bb7a..000000000 Binary files a/Icons/Previews/AllowedLimited.png and /dev/null differ diff --git a/Icons/Previews/Favorite.png b/Icons/Previews/Favorite.png deleted file mode 100644 index 6641d1e05..000000000 Binary files a/Icons/Previews/Favorite.png and /dev/null differ diff --git a/Icons/Previews/FavoriteBoth.png b/Icons/Previews/FavoriteBoth.png deleted file mode 100644 index dbc7535bd..000000000 Binary files a/Icons/Previews/FavoriteBoth.png and /dev/null differ diff --git a/Icons/Previews/FavoritePlayer.png b/Icons/Previews/FavoritePlayer.png deleted file mode 100644 index ffcb9426b..000000000 Binary files a/Icons/Previews/FavoritePlayer.png and /dev/null differ diff --git a/Icons/Previews/Handheld.png b/Icons/Previews/Handheld.png deleted file mode 100644 index 2547970a9..000000000 Binary files a/Icons/Previews/Handheld.png and /dev/null differ diff --git a/Icons/Previews/Locked.png b/Icons/Previews/Locked.png deleted file mode 100644 index f31e2b29d..000000000 Binary files a/Icons/Previews/Locked.png and /dev/null differ diff --git a/Icons/Previews/LoverOnly.png b/Icons/Previews/LoverOnly.png deleted file mode 100644 index 183754a9a..000000000 Binary files a/Icons/Previews/LoverOnly.png and /dev/null differ diff --git a/Icons/Previews/OwnerOnly.png b/Icons/Previews/OwnerOnly.png deleted file mode 100644 index 1da9732f2..000000000 Binary files a/Icons/Previews/OwnerOnly.png and /dev/null differ diff --git a/Icons/Previews/Unlocked.png b/Icons/Previews/Unlocked.png deleted file mode 100644 index 68ced4ec0..000000000 Binary files a/Icons/Previews/Unlocked.png and /dev/null differ diff --git a/Icons/Private.png b/Icons/Private.png deleted file mode 100644 index 5beee4ade..000000000 Binary files a/Icons/Private.png and /dev/null differ diff --git a/Icons/Public.png b/Icons/Public.png deleted file mode 100644 index 897fcd650..000000000 Binary files a/Icons/Public.png and /dev/null differ diff --git a/Icons/Question.png b/Icons/Question.png deleted file mode 100644 index 4df03073a..000000000 Binary files a/Icons/Question.png and /dev/null differ diff --git a/Icons/Random.png b/Icons/Random.png deleted file mode 100644 index 6a07b6ea1..000000000 Binary files a/Icons/Random.png and /dev/null differ diff --git a/Icons/Rectangle/Admin.png b/Icons/Rectangle/Admin.png deleted file mode 100644 index 215e8887e..000000000 Binary files a/Icons/Rectangle/Admin.png and /dev/null differ diff --git a/Icons/Rectangle/Camera.png b/Icons/Rectangle/Camera.png deleted file mode 100644 index 8a3cf2dce..000000000 Binary files a/Icons/Rectangle/Camera.png and /dev/null differ diff --git a/Icons/Rectangle/Cancel.png b/Icons/Rectangle/Cancel.png deleted file mode 100644 index 66b7175f6..000000000 Binary files a/Icons/Rectangle/Cancel.png and /dev/null differ diff --git a/Icons/Rectangle/Cut.png b/Icons/Rectangle/Cut.png deleted file mode 100644 index c99509cb3..000000000 Binary files a/Icons/Rectangle/Cut.png and /dev/null differ diff --git a/Icons/Rectangle/Dress.png b/Icons/Rectangle/Dress.png deleted file mode 100644 index 69ea72b6d..000000000 Binary files a/Icons/Rectangle/Dress.png and /dev/null differ diff --git a/Icons/Rectangle/Exit.png b/Icons/Rectangle/Exit.png deleted file mode 100644 index ddc587469..000000000 Binary files a/Icons/Rectangle/Exit.png and /dev/null differ diff --git a/Icons/Rectangle/GameOption.png b/Icons/Rectangle/GameOption.png deleted file mode 100644 index db707eef7..000000000 Binary files a/Icons/Rectangle/GameOption.png and /dev/null differ diff --git a/Icons/Rectangle/Icons0.png b/Icons/Rectangle/Icons0.png deleted file mode 100644 index 8caa34649..000000000 Binary files a/Icons/Rectangle/Icons0.png and /dev/null differ diff --git a/Icons/Rectangle/Icons1.png b/Icons/Rectangle/Icons1.png deleted file mode 100644 index 4eba2200b..000000000 Binary files a/Icons/Rectangle/Icons1.png and /dev/null differ diff --git a/Icons/Rectangle/Icons2.png b/Icons/Rectangle/Icons2.png deleted file mode 100644 index 7cc939616..000000000 Binary files a/Icons/Rectangle/Icons2.png and /dev/null differ diff --git a/Icons/Rectangle/Icons3.png b/Icons/Rectangle/Icons3.png deleted file mode 100644 index 85470d6a6..000000000 Binary files a/Icons/Rectangle/Icons3.png and /dev/null differ diff --git a/Icons/Rectangle/Kneel.png b/Icons/Rectangle/Kneel.png deleted file mode 100644 index b7cc8d680..000000000 Binary files a/Icons/Rectangle/Kneel.png and /dev/null differ diff --git a/Icons/Rectangle/Profile.png b/Icons/Rectangle/Profile.png deleted file mode 100644 index aa7f61613..000000000 Binary files a/Icons/Rectangle/Profile.png and /dev/null differ diff --git a/Icons/Refreshsments.png b/Icons/Refreshsments.png deleted file mode 100644 index e26a45f51..000000000 Binary files a/Icons/Refreshsments.png and /dev/null differ diff --git a/Icons/Remote.png b/Icons/Remote.png deleted file mode 100644 index 12b8b29d8..000000000 Binary files a/Icons/Remote.png and /dev/null differ diff --git a/Icons/Remove.png b/Icons/Remove.png deleted file mode 100644 index 543c87c4b..000000000 Binary files a/Icons/Remove.png and /dev/null differ diff --git a/Icons/Reset.png b/Icons/Reset.png deleted file mode 100644 index 5e2d84869..000000000 Binary files a/Icons/Reset.png and /dev/null differ diff --git a/Icons/Rest.png b/Icons/Rest.png deleted file mode 100644 index 34642f72a..000000000 Binary files a/Icons/Rest.png and /dev/null differ diff --git a/Icons/Restriction.png b/Icons/Restriction.png deleted file mode 100644 index 8368a4640..000000000 Binary files a/Icons/Restriction.png and /dev/null differ diff --git a/Icons/Rope.png b/Icons/Rope.png deleted file mode 100644 index b878f7408..000000000 Binary files a/Icons/Rope.png and /dev/null differ diff --git a/Icons/Save.png b/Icons/Save.png deleted file mode 100644 index 00ec28e33..000000000 Binary files a/Icons/Save.png and /dev/null differ diff --git a/Icons/Search.png b/Icons/Search.png deleted file mode 100644 index a5b32a7fb..000000000 Binary files a/Icons/Search.png and /dev/null differ diff --git a/Icons/Security.png b/Icons/Security.png deleted file mode 100644 index e57e6a8fd..000000000 Binary files a/Icons/Security.png and /dev/null differ diff --git a/Icons/ServiceBell.png b/Icons/ServiceBell.png deleted file mode 100644 index 47ed05e67..000000000 Binary files a/Icons/ServiceBell.png and /dev/null differ diff --git a/Icons/Shop.png b/Icons/Shop.png deleted file mode 100644 index f3f662a0f..000000000 Binary files a/Icons/Shop.png and /dev/null differ diff --git a/Icons/Small/Admin.png b/Icons/Small/Admin.png deleted file mode 100644 index d736e0db1..000000000 Binary files a/Icons/Small/Admin.png and /dev/null differ diff --git a/Icons/Small/BlackList.png b/Icons/Small/BlackList.png deleted file mode 100644 index 1b2b32a27..000000000 Binary files a/Icons/Small/BlackList.png and /dev/null differ diff --git a/Icons/Small/Character.png b/Icons/Small/Character.png deleted file mode 100644 index 0aa801323..000000000 Binary files a/Icons/Small/Character.png and /dev/null differ diff --git a/Icons/Small/Chat.png b/Icons/Small/Chat.png deleted file mode 100644 index d12667d82..000000000 Binary files a/Icons/Small/Chat.png and /dev/null differ diff --git a/Icons/Small/Dress.png b/Icons/Small/Dress.png deleted file mode 100644 index fadede33f..000000000 Binary files a/Icons/Small/Dress.png and /dev/null differ diff --git a/Icons/Small/Exit.png b/Icons/Small/Exit.png deleted file mode 100644 index 0014362fa..000000000 Binary files a/Icons/Small/Exit.png and /dev/null differ diff --git a/Icons/Small/ExitToRoom.png b/Icons/Small/ExitToRoom.png deleted file mode 100644 index 85d72e421..000000000 Binary files a/Icons/Small/ExitToRoom.png and /dev/null differ diff --git a/Icons/Small/FriendList.png b/Icons/Small/FriendList.png deleted file mode 100644 index 433435ba8..000000000 Binary files a/Icons/Small/FriendList.png and /dev/null differ diff --git a/Icons/Small/GhostList.png b/Icons/Small/GhostList.png deleted file mode 100644 index 96666f307..000000000 Binary files a/Icons/Small/GhostList.png and /dev/null differ diff --git a/Icons/Small/Kneel.png b/Icons/Small/Kneel.png deleted file mode 100644 index df752a86a..000000000 Binary files a/Icons/Small/Kneel.png and /dev/null differ diff --git a/Icons/Small/Money.png b/Icons/Small/Money.png deleted file mode 100644 index d99fa45d8..000000000 Binary files a/Icons/Small/Money.png and /dev/null differ diff --git a/Icons/Small/Naked.png b/Icons/Small/Naked.png deleted file mode 100644 index ec9e13771..000000000 Binary files a/Icons/Small/Naked.png and /dev/null differ diff --git a/Icons/Small/Next.png b/Icons/Small/Next.png deleted file mode 100644 index fc135db1f..000000000 Binary files a/Icons/Small/Next.png and /dev/null differ diff --git a/Icons/Small/Preference.png b/Icons/Small/Preference.png deleted file mode 100644 index 30f35e210..000000000 Binary files a/Icons/Small/Preference.png and /dev/null differ diff --git a/Icons/Small/Prev.png b/Icons/Small/Prev.png deleted file mode 100644 index 8a7e3e393..000000000 Binary files a/Icons/Small/Prev.png and /dev/null differ diff --git a/Icons/Small/Remove.png b/Icons/Small/Remove.png deleted file mode 100644 index 0520d7270..000000000 Binary files a/Icons/Small/Remove.png and /dev/null differ diff --git a/Icons/Small/Reset.png b/Icons/Small/Reset.png deleted file mode 100644 index 4dc1ce7d0..000000000 Binary files a/Icons/Small/Reset.png and /dev/null differ diff --git a/Icons/Small/Room.png b/Icons/Small/Room.png deleted file mode 100644 index f0d28df95..000000000 Binary files a/Icons/Small/Room.png and /dev/null differ diff --git a/Icons/Small/Warning.png b/Icons/Small/Warning.png deleted file mode 100644 index ef774efc9..000000000 Binary files a/Icons/Small/Warning.png and /dev/null differ diff --git a/Icons/Small/Whisper.png b/Icons/Small/Whisper.png deleted file mode 100644 index 6882b3bb0..000000000 Binary files a/Icons/Small/Whisper.png and /dev/null differ diff --git a/Icons/Small/WhiteList.png b/Icons/Small/WhiteList.png deleted file mode 100644 index 7dc630427..000000000 Binary files a/Icons/Small/WhiteList.png and /dev/null differ diff --git a/Icons/South.png b/Icons/South.png deleted file mode 100644 index c439c44f3..000000000 Binary files a/Icons/South.png and /dev/null differ diff --git a/Icons/SpitOutPacifier.png b/Icons/SpitOutPacifier.png deleted file mode 100644 index 89fa45d92..000000000 Binary files a/Icons/SpitOutPacifier.png and /dev/null differ diff --git a/Icons/StairsDown.png b/Icons/StairsDown.png deleted file mode 100644 index fe7e3feb1..000000000 Binary files a/Icons/StairsDown.png and /dev/null differ diff --git a/Icons/StairsUp.png b/Icons/StairsUp.png deleted file mode 100644 index e864f315f..000000000 Binary files a/Icons/StairsUp.png and /dev/null differ diff --git a/Icons/Start.png b/Icons/Start.png deleted file mode 100644 index 1bdb439d4..000000000 Binary files a/Icons/Start.png and /dev/null differ diff --git a/Icons/Status/Crawl0.png b/Icons/Status/Crawl0.png deleted file mode 100644 index 774f27e69..000000000 Binary files a/Icons/Status/Crawl0.png and /dev/null differ diff --git a/Icons/Status/Crawl1.png b/Icons/Status/Crawl1.png deleted file mode 100644 index 6819187a7..000000000 Binary files a/Icons/Status/Crawl1.png and /dev/null differ diff --git a/Icons/Status/Crawl2.png b/Icons/Status/Crawl2.png deleted file mode 100644 index 78d1034bd..000000000 Binary files a/Icons/Status/Crawl2.png and /dev/null differ diff --git a/Icons/Status/Orgasm0.png b/Icons/Status/Orgasm0.png deleted file mode 100644 index 8e6c4e7b1..000000000 Binary files a/Icons/Status/Orgasm0.png and /dev/null differ diff --git a/Icons/Status/Orgasm1.png b/Icons/Status/Orgasm1.png deleted file mode 100644 index 90a2fba92..000000000 Binary files a/Icons/Status/Orgasm1.png and /dev/null differ diff --git a/Icons/Status/Orgasm2.png b/Icons/Status/Orgasm2.png deleted file mode 100644 index 17580498c..000000000 Binary files a/Icons/Status/Orgasm2.png and /dev/null differ diff --git a/Icons/Status/Preference0.png b/Icons/Status/Preference0.png deleted file mode 100644 index 3d270d7bd..000000000 Binary files a/Icons/Status/Preference0.png and /dev/null differ diff --git a/Icons/Status/Preference1.png b/Icons/Status/Preference1.png deleted file mode 100644 index 1587f8ba8..000000000 Binary files a/Icons/Status/Preference1.png and /dev/null differ diff --git a/Icons/Status/Preference2.png b/Icons/Status/Preference2.png deleted file mode 100644 index 478c1d1b6..000000000 Binary files a/Icons/Status/Preference2.png and /dev/null differ diff --git a/Icons/Status/Struggle0.png b/Icons/Status/Struggle0.png deleted file mode 100644 index 7f72eb142..000000000 Binary files a/Icons/Status/Struggle0.png and /dev/null differ diff --git a/Icons/Status/Struggle1.png b/Icons/Status/Struggle1.png deleted file mode 100644 index 9952b34fe..000000000 Binary files a/Icons/Status/Struggle1.png and /dev/null differ diff --git a/Icons/Status/Struggle2.png b/Icons/Status/Struggle2.png deleted file mode 100644 index 98f6c4a27..000000000 Binary files a/Icons/Status/Struggle2.png and /dev/null differ diff --git a/Icons/Status/Talk0.png b/Icons/Status/Talk0.png deleted file mode 100644 index 9f66339f7..000000000 Binary files a/Icons/Status/Talk0.png and /dev/null differ diff --git a/Icons/Status/Talk1.png b/Icons/Status/Talk1.png deleted file mode 100644 index 762089fd7..000000000 Binary files a/Icons/Status/Talk1.png and /dev/null differ diff --git a/Icons/Status/Talk2.png b/Icons/Status/Talk2.png deleted file mode 100644 index 75732d750..000000000 Binary files a/Icons/Status/Talk2.png and /dev/null differ diff --git a/Icons/Status/Wardrobe0.png b/Icons/Status/Wardrobe0.png deleted file mode 100644 index c84e847ae..000000000 Binary files a/Icons/Status/Wardrobe0.png and /dev/null differ diff --git a/Icons/Status/Wardrobe1.png b/Icons/Status/Wardrobe1.png deleted file mode 100644 index f60c7fb17..000000000 Binary files a/Icons/Status/Wardrobe1.png and /dev/null differ diff --git a/Icons/Status/Wardrobe2.png b/Icons/Status/Wardrobe2.png deleted file mode 100644 index 13fc71c84..000000000 Binary files a/Icons/Status/Wardrobe2.png and /dev/null differ diff --git a/Icons/Struggle.png b/Icons/Struggle.png deleted file mode 100644 index 8368a4640..000000000 Binary files a/Icons/Struggle.png and /dev/null differ diff --git a/Icons/Struggle/Buckle.png b/Icons/Struggle/Buckle.png deleted file mode 100644 index 7304e6342..000000000 Binary files a/Icons/Struggle/Buckle.png and /dev/null differ diff --git a/Icons/Struggle/Dexterity.png b/Icons/Struggle/Dexterity.png deleted file mode 100644 index 1fcde6ef5..000000000 Binary files a/Icons/Struggle/Dexterity.png and /dev/null differ diff --git a/Icons/Struggle/Flexibility.png b/Icons/Struggle/Flexibility.png deleted file mode 100644 index 7af630ba4..000000000 Binary files a/Icons/Struggle/Flexibility.png and /dev/null differ diff --git a/Icons/Struggle/Player.png b/Icons/Struggle/Player.png deleted file mode 100644 index 893d0812b..000000000 Binary files a/Icons/Struggle/Player.png and /dev/null differ diff --git a/Icons/Struggle/Rope.png b/Icons/Struggle/Rope.png deleted file mode 100644 index d3d1ca944..000000000 Binary files a/Icons/Struggle/Rope.png and /dev/null differ diff --git a/Icons/Struggle/Strength.png b/Icons/Struggle/Strength.png deleted file mode 100644 index 98d859ba4..000000000 Binary files a/Icons/Struggle/Strength.png and /dev/null differ diff --git a/Icons/Swap.png b/Icons/Swap.png deleted file mode 100644 index dfe2dd448..000000000 Binary files a/Icons/Swap.png and /dev/null differ diff --git a/Icons/Tennis.png b/Icons/Tennis.png deleted file mode 100644 index 321c17caa..000000000 Binary files a/Icons/Tennis.png and /dev/null differ diff --git a/Icons/Theater.png b/Icons/Theater.png deleted file mode 100644 index c4097e6b2..000000000 Binary files a/Icons/Theater.png and /dev/null differ diff --git a/Icons/Therapy.png b/Icons/Therapy.png deleted file mode 100644 index 9f3bd73cc..000000000 Binary files a/Icons/Therapy.png and /dev/null differ diff --git a/Icons/Title.png b/Icons/Title.png deleted file mode 100644 index 5561062dc..000000000 Binary files a/Icons/Title.png and /dev/null differ diff --git a/Icons/Trash.png b/Icons/Trash.png deleted file mode 100644 index 932d36a52..000000000 Binary files a/Icons/Trash.png and /dev/null differ diff --git a/Icons/Unlock.png b/Icons/Unlock.png deleted file mode 100644 index f5c8d6263..000000000 Binary files a/Icons/Unlock.png and /dev/null differ diff --git a/Icons/Unlocked.png b/Icons/Unlocked.png deleted file mode 100644 index a8b14eaab..000000000 Binary files a/Icons/Unlocked.png and /dev/null differ diff --git a/Icons/Up.png b/Icons/Up.png deleted file mode 100644 index d37a8c80e..000000000 Binary files a/Icons/Up.png and /dev/null differ diff --git a/Icons/Use.png b/Icons/Use.png deleted file mode 100644 index a74132e34..000000000 Binary files a/Icons/Use.png and /dev/null differ diff --git a/Icons/Visibility.png b/Icons/Visibility.png deleted file mode 100644 index 5beee4ade..000000000 Binary files a/Icons/Visibility.png and /dev/null differ diff --git a/Icons/Wait.png b/Icons/Wait.png deleted file mode 100644 index 227d08a2a..000000000 Binary files a/Icons/Wait.png and /dev/null differ diff --git a/Icons/Wardrobe.png b/Icons/Wardrobe.png deleted file mode 100644 index 81f84d00a..000000000 Binary files a/Icons/Wardrobe.png and /dev/null differ diff --git a/Icons/Warning.svg b/Icons/Warning.svg deleted file mode 100644 index 8fd9101ed..000000000 --- a/Icons/Warning.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Icons/WearRandom.png b/Icons/WearRandom.png deleted file mode 100644 index 23aade7fc..000000000 Binary files a/Icons/WearRandom.png and /dev/null differ diff --git a/Icons/West.png b/Icons/West.png deleted file mode 100644 index 45fb879f0..000000000 Binary files a/Icons/West.png and /dev/null differ diff --git a/Icons/WinkBoth.png b/Icons/WinkBoth.png deleted file mode 100644 index 0669a3cb2..000000000 Binary files a/Icons/WinkBoth.png and /dev/null differ diff --git a/Icons/WinkL.png b/Icons/WinkL.png deleted file mode 100644 index 253f42522..000000000 Binary files a/Icons/WinkL.png and /dev/null differ diff --git a/Icons/WinkNone.png b/Icons/WinkNone.png deleted file mode 100644 index cb4038d80..000000000 Binary files a/Icons/WinkNone.png and /dev/null differ diff --git a/Icons/WinkR.png b/Icons/WinkR.png deleted file mode 100644 index 1c3d7b3a6..000000000 Binary files a/Icons/WinkR.png and /dev/null differ diff --git a/Models/Armbinder/BinderLeftBoxtie.png b/Models/Armbinder/BinderLeftBoxtie.png new file mode 100644 index 000000000..ae815da08 Binary files /dev/null and b/Models/Armbinder/BinderLeftBoxtie.png differ diff --git a/Models/Armbinder/BinderLeftWristtie.png b/Models/Armbinder/BinderLeftWristtie.png new file mode 100644 index 000000000..4ebd21919 Binary files /dev/null and b/Models/Armbinder/BinderLeftWristtie.png differ diff --git a/Models/Armbinder/BinderRightBoxtie.png b/Models/Armbinder/BinderRightBoxtie.png new file mode 100644 index 000000000..e72806295 Binary files /dev/null and b/Models/Armbinder/BinderRightBoxtie.png differ diff --git a/Models/Armbinder/BinderRightWristtie.png b/Models/Armbinder/BinderRightWristtie.png new file mode 100644 index 000000000..45fea715d Binary files /dev/null and b/Models/Armbinder/BinderRightWristtie.png differ diff --git a/Models/Armbinder/CrossBoxtie.png b/Models/Armbinder/CrossBoxtie.png new file mode 100644 index 000000000..b06bf4e99 Binary files /dev/null and b/Models/Armbinder/CrossBoxtie.png differ diff --git a/Models/Armbinder/CrossWristtie.png b/Models/Armbinder/CrossWristtie.png new file mode 100644 index 000000000..42a6f88cd Binary files /dev/null and b/Models/Armbinder/CrossWristtie.png differ diff --git a/Models/Armbinder/GwenBoxtie.png b/Models/Armbinder/GwenBoxtie.png new file mode 100644 index 000000000..a0590a481 Binary files /dev/null and b/Models/Armbinder/GwenBoxtie.png differ diff --git a/Models/Armbinder/GwenWristtie.png b/Models/Armbinder/GwenWristtie.png new file mode 100644 index 000000000..a0590a481 Binary files /dev/null and b/Models/Armbinder/GwenWristtie.png differ diff --git a/Models/Armbinder/SecureBoxtie.png b/Models/Armbinder/SecureBoxtie.png new file mode 100644 index 000000000..892b2f0cd Binary files /dev/null and b/Models/Armbinder/SecureBoxtie.png differ diff --git a/Models/Armbinder/SecureWristtie.png b/Models/Armbinder/SecureWristtie.png new file mode 100644 index 000000000..892b2f0cd Binary files /dev/null and b/Models/Armbinder/SecureWristtie.png differ diff --git a/Models/Armbinder/StrapsLeftBoxtie.png b/Models/Armbinder/StrapsLeftBoxtie.png new file mode 100644 index 000000000..a4284a45b Binary files /dev/null and b/Models/Armbinder/StrapsLeftBoxtie.png differ diff --git a/Models/Armbinder/StrapsLeftWristtie.png b/Models/Armbinder/StrapsLeftWristtie.png new file mode 100644 index 000000000..2a78d75f7 Binary files /dev/null and b/Models/Armbinder/StrapsLeftWristtie.png differ diff --git a/Models/Armbinder/StrapsRightBoxtie.png b/Models/Armbinder/StrapsRightBoxtie.png new file mode 100644 index 000000000..47aa42f6e Binary files /dev/null and b/Models/Armbinder/StrapsRightBoxtie.png differ diff --git a/Models/Armbinder/StrapsRightWristtie.png b/Models/Armbinder/StrapsRightWristtie.png new file mode 100644 index 000000000..e1d54f898 Binary files /dev/null and b/Models/Armbinder/StrapsRightWristtie.png differ diff --git a/Models/Armbinder/WolfHarness.png b/Models/Armbinder/WolfHarness.png new file mode 100644 index 000000000..bb7b441ab Binary files /dev/null and b/Models/Armbinder/WolfHarness.png differ diff --git a/Models/ArmorChain/Panties.png b/Models/ArmorChain/Panties.png new file mode 100644 index 000000000..f68bc02cb Binary files /dev/null and b/Models/ArmorChain/Panties.png differ diff --git a/Models/ArmorChain/PantiesChain.png b/Models/ArmorChain/PantiesChain.png new file mode 100644 index 000000000..92b99c64f Binary files /dev/null and b/Models/ArmorChain/PantiesChain.png differ diff --git a/Models/ArmorChain/PantiesChainClosed.png b/Models/ArmorChain/PantiesChainClosed.png new file mode 100644 index 000000000..e211a3fe9 Binary files /dev/null and b/Models/ArmorChain/PantiesChainClosed.png differ diff --git a/Models/ArmorChain/PantiesChainKneel.png b/Models/ArmorChain/PantiesChainKneel.png new file mode 100644 index 000000000..e211a3fe9 Binary files /dev/null and b/Models/ArmorChain/PantiesChainKneel.png differ diff --git a/Models/ArmorChain/PantiesClosed.png b/Models/ArmorChain/PantiesClosed.png new file mode 100644 index 000000000..ad4ec3d08 Binary files /dev/null and b/Models/ArmorChain/PantiesClosed.png differ diff --git a/Models/ArmorChain/PantiesKneel.png b/Models/ArmorChain/PantiesKneel.png new file mode 100644 index 000000000..3b19fadad Binary files /dev/null and b/Models/ArmorChain/PantiesKneel.png differ diff --git a/Models/ArmorChain/Shirt.png b/Models/ArmorChain/Shirt.png new file mode 100644 index 000000000..f12554772 Binary files /dev/null and b/Models/ArmorChain/Shirt.png differ diff --git a/Models/ArmorChain/ShirtChest.png b/Models/ArmorChain/ShirtChest.png new file mode 100644 index 000000000..794e9eb91 Binary files /dev/null and b/Models/ArmorChain/ShirtChest.png differ diff --git a/Models/ArmorChain/ShirtChestFree.png b/Models/ArmorChain/ShirtChestFree.png new file mode 100644 index 000000000..e1ba6ced2 Binary files /dev/null and b/Models/ArmorChain/ShirtChestFree.png differ diff --git a/Models/ArmorChain/ShirtChestHogtie.png b/Models/ArmorChain/ShirtChestHogtie.png new file mode 100644 index 000000000..df588ce00 Binary files /dev/null and b/Models/ArmorChain/ShirtChestHogtie.png differ diff --git a/Models/ArmorChain/ShirtChestUp.png b/Models/ArmorChain/ShirtChestUp.png new file mode 100644 index 000000000..d097250a6 Binary files /dev/null and b/Models/ArmorChain/ShirtChestUp.png differ diff --git a/Models/ArmorChain/ShirtHogtie.png b/Models/ArmorChain/ShirtHogtie.png new file mode 100644 index 000000000..7dee45d70 Binary files /dev/null and b/Models/ArmorChain/ShirtHogtie.png differ diff --git a/Models/ArmorChain/ShirtUp.png b/Models/ArmorChain/ShirtUp.png new file mode 100644 index 000000000..1d52e2562 Binary files /dev/null and b/Models/ArmorChain/ShirtUp.png differ diff --git a/Models/ArmorChain/Skirt.png b/Models/ArmorChain/Skirt.png new file mode 100644 index 000000000..26d643bb4 Binary files /dev/null and b/Models/ArmorChain/Skirt.png differ diff --git a/Models/ArmorChain/Skirt2.png b/Models/ArmorChain/Skirt2.png new file mode 100644 index 000000000..c333bf259 Binary files /dev/null and b/Models/ArmorChain/Skirt2.png differ diff --git a/Models/ArmorChain/Skirt2CrotchStrap.png b/Models/ArmorChain/Skirt2CrotchStrap.png new file mode 100644 index 000000000..90ab825b1 Binary files /dev/null and b/Models/ArmorChain/Skirt2CrotchStrap.png differ diff --git a/Models/ArmorChain/Skirt2Hogtie.png b/Models/ArmorChain/Skirt2Hogtie.png new file mode 100644 index 000000000..120550671 Binary files /dev/null and b/Models/ArmorChain/Skirt2Hogtie.png differ diff --git a/Models/ArmorChain/Skirt2HogtieCrotchStrap.png b/Models/ArmorChain/Skirt2HogtieCrotchStrap.png new file mode 100644 index 000000000..9d2378af4 Binary files /dev/null and b/Models/ArmorChain/Skirt2HogtieCrotchStrap.png differ diff --git a/Models/ArmorChain/Skirt2Kneel.png b/Models/ArmorChain/Skirt2Kneel.png new file mode 100644 index 000000000..550301b1c Binary files /dev/null and b/Models/ArmorChain/Skirt2Kneel.png differ diff --git a/Models/ArmorChain/Skirt2KneelCrotchStrap.png b/Models/ArmorChain/Skirt2KneelCrotchStrap.png new file mode 100644 index 000000000..d9094e3ef Binary files /dev/null and b/Models/ArmorChain/Skirt2KneelCrotchStrap.png differ diff --git a/Models/ArmorChain/SkirtBelt.png b/Models/ArmorChain/SkirtBelt.png new file mode 100644 index 000000000..230bb9399 Binary files /dev/null and b/Models/ArmorChain/SkirtBelt.png differ diff --git a/Models/ArmorChain/SkirtBeltDeco.png b/Models/ArmorChain/SkirtBeltDeco.png new file mode 100644 index 000000000..8043d1a26 Binary files /dev/null and b/Models/ArmorChain/SkirtBeltDeco.png differ diff --git a/Models/ArmorChain/SkirtBeltDecoKneel.png b/Models/ArmorChain/SkirtBeltDecoKneel.png new file mode 100644 index 000000000..ea5ba4aec Binary files /dev/null and b/Models/ArmorChain/SkirtBeltDecoKneel.png differ diff --git a/Models/ArmorChain/SkirtBeltKneel.png b/Models/ArmorChain/SkirtBeltKneel.png new file mode 100644 index 000000000..a7b24e1b2 Binary files /dev/null and b/Models/ArmorChain/SkirtBeltKneel.png differ diff --git a/Models/ArmorChain/SkirtBeltRivets.png b/Models/ArmorChain/SkirtBeltRivets.png new file mode 100644 index 000000000..4eec36506 Binary files /dev/null and b/Models/ArmorChain/SkirtBeltRivets.png differ diff --git a/Models/ArmorChain/SkirtBeltRivetsKneel.png b/Models/ArmorChain/SkirtBeltRivetsKneel.png new file mode 100644 index 000000000..a5bcf018f Binary files /dev/null and b/Models/ArmorChain/SkirtBeltRivetsKneel.png differ diff --git a/Models/ArmorChain/SkirtCrotchStrap.png b/Models/ArmorChain/SkirtCrotchStrap.png new file mode 100644 index 000000000..26d643bb4 Binary files /dev/null and b/Models/ArmorChain/SkirtCrotchStrap.png differ diff --git a/Models/ArmorChain/SkirtHogtie.png b/Models/ArmorChain/SkirtHogtie.png new file mode 100644 index 000000000..0d58a4605 Binary files /dev/null and b/Models/ArmorChain/SkirtHogtie.png differ diff --git a/Models/ArmorChain/SkirtHogtieCrotchStrap.png b/Models/ArmorChain/SkirtHogtieCrotchStrap.png new file mode 100644 index 000000000..0d58a4605 Binary files /dev/null and b/Models/ArmorChain/SkirtHogtieCrotchStrap.png differ diff --git a/Models/ArmorChain/SkirtKneel.png b/Models/ArmorChain/SkirtKneel.png new file mode 100644 index 000000000..7c11f852a Binary files /dev/null and b/Models/ArmorChain/SkirtKneel.png differ diff --git a/Models/ArmorChain/SkirtKneelCrotchStrap.png b/Models/ArmorChain/SkirtKneelCrotchStrap.png new file mode 100644 index 000000000..7c11f852a Binary files /dev/null and b/Models/ArmorChain/SkirtKneelCrotchStrap.png differ diff --git a/Models/ArmorPlate/BootLeftClosed.png b/Models/ArmorPlate/BootLeftClosed.png new file mode 100644 index 000000000..0b849beec Binary files /dev/null and b/Models/ArmorPlate/BootLeftClosed.png differ diff --git a/Models/ArmorPlate/BootLeftHogtie.png b/Models/ArmorPlate/BootLeftHogtie.png new file mode 100644 index 000000000..31ef45865 Binary files /dev/null and b/Models/ArmorPlate/BootLeftHogtie.png differ diff --git a/Models/ArmorPlate/BootLeftKneel.png b/Models/ArmorPlate/BootLeftKneel.png new file mode 100644 index 000000000..538cc281d Binary files /dev/null and b/Models/ArmorPlate/BootLeftKneel.png differ diff --git a/Models/ArmorPlate/BootLeftKneelClosed.png b/Models/ArmorPlate/BootLeftKneelClosed.png new file mode 100644 index 000000000..08f6ab86b Binary files /dev/null and b/Models/ArmorPlate/BootLeftKneelClosed.png differ diff --git a/Models/ArmorPlate/BootLeftSpread.png b/Models/ArmorPlate/BootLeftSpread.png new file mode 100644 index 000000000..a9adf723b Binary files /dev/null and b/Models/ArmorPlate/BootLeftSpread.png differ diff --git a/Models/ArmorPlate/BootRightClosed.png b/Models/ArmorPlate/BootRightClosed.png new file mode 100644 index 000000000..ccf6a7d61 Binary files /dev/null and b/Models/ArmorPlate/BootRightClosed.png differ diff --git a/Models/ArmorPlate/BootRightKneel.png b/Models/ArmorPlate/BootRightKneel.png new file mode 100644 index 000000000..2fd38ebbb Binary files /dev/null and b/Models/ArmorPlate/BootRightKneel.png differ diff --git a/Models/ArmorPlate/BootRightSpread.png b/Models/ArmorPlate/BootRightSpread.png new file mode 100644 index 000000000..d5963bac8 Binary files /dev/null and b/Models/ArmorPlate/BootRightSpread.png differ diff --git a/Models/ArmorPlate/Breastplate.png b/Models/ArmorPlate/Breastplate.png new file mode 100644 index 000000000..4822ac534 Binary files /dev/null and b/Models/ArmorPlate/Breastplate.png differ diff --git a/Models/ArmorPlate/BreastplateHogtie.png b/Models/ArmorPlate/BreastplateHogtie.png new file mode 100644 index 000000000..9d650658a Binary files /dev/null and b/Models/ArmorPlate/BreastplateHogtie.png differ diff --git a/Models/ArmorPlate/FootBootLeftHogtie.png b/Models/ArmorPlate/FootBootLeftHogtie.png new file mode 100644 index 000000000..93778a209 Binary files /dev/null and b/Models/ArmorPlate/FootBootLeftHogtie.png differ diff --git a/Models/ArmorPlate/GauntletLeftCrossed.png b/Models/ArmorPlate/GauntletLeftCrossed.png new file mode 100644 index 000000000..a5c8fe84d Binary files /dev/null and b/Models/ArmorPlate/GauntletLeftCrossed.png differ diff --git a/Models/ArmorPlate/GauntletLeftFree.png b/Models/ArmorPlate/GauntletLeftFree.png new file mode 100644 index 000000000..e8198d23c Binary files /dev/null and b/Models/ArmorPlate/GauntletLeftFree.png differ diff --git a/Models/ArmorPlate/GauntletLeftFront.png b/Models/ArmorPlate/GauntletLeftFront.png new file mode 100644 index 000000000..cc4612e66 Binary files /dev/null and b/Models/ArmorPlate/GauntletLeftFront.png differ diff --git a/Models/ArmorPlate/GauntletLeftYoked.png b/Models/ArmorPlate/GauntletLeftYoked.png new file mode 100644 index 000000000..f8eb38387 Binary files /dev/null and b/Models/ArmorPlate/GauntletLeftYoked.png differ diff --git a/Models/ArmorPlate/GauntletRightBoxtie.png b/Models/ArmorPlate/GauntletRightBoxtie.png new file mode 100644 index 000000000..930aeca37 Binary files /dev/null and b/Models/ArmorPlate/GauntletRightBoxtie.png differ diff --git a/Models/ArmorPlate/GauntletRightCrossed.png b/Models/ArmorPlate/GauntletRightCrossed.png new file mode 100644 index 000000000..26e8ad919 Binary files /dev/null and b/Models/ArmorPlate/GauntletRightCrossed.png differ diff --git a/Models/ArmorPlate/GauntletRightFree.png b/Models/ArmorPlate/GauntletRightFree.png new file mode 100644 index 000000000..6371f99ae Binary files /dev/null and b/Models/ArmorPlate/GauntletRightFree.png differ diff --git a/Models/ArmorPlate/GauntletRightFront.png b/Models/ArmorPlate/GauntletRightFront.png new file mode 100644 index 000000000..33dc72868 Binary files /dev/null and b/Models/ArmorPlate/GauntletRightFront.png differ diff --git a/Models/ArmorPlate/GauntletRightYoked.png b/Models/ArmorPlate/GauntletRightYoked.png new file mode 100644 index 000000000..c1372177a Binary files /dev/null and b/Models/ArmorPlate/GauntletRightYoked.png differ diff --git a/Models/ArmorPlate/PauldronsFree.png b/Models/ArmorPlate/PauldronsFree.png new file mode 100644 index 000000000..57e423301 Binary files /dev/null and b/Models/ArmorPlate/PauldronsFree.png differ diff --git a/Models/ArmorPlate/PauldronsHogtie.png b/Models/ArmorPlate/PauldronsHogtie.png new file mode 100644 index 000000000..989b87004 Binary files /dev/null and b/Models/ArmorPlate/PauldronsHogtie.png differ diff --git a/Models/ArmorPlate/PauldronsYoked.png b/Models/ArmorPlate/PauldronsYoked.png new file mode 100644 index 000000000..8e6962129 Binary files /dev/null and b/Models/ArmorPlate/PauldronsYoked.png differ diff --git a/Models/Bandit/Breastplate.png b/Models/Bandit/Breastplate.png new file mode 100644 index 000000000..a6d0b6461 Binary files /dev/null and b/Models/Bandit/Breastplate.png differ diff --git a/Models/Bandit/BreastplateHogtie.png b/Models/Bandit/BreastplateHogtie.png new file mode 100644 index 000000000..c7960d125 Binary files /dev/null and b/Models/Bandit/BreastplateHogtie.png differ diff --git a/Models/Bandit/Choker.png b/Models/Bandit/Choker.png new file mode 100644 index 000000000..f465be573 Binary files /dev/null and b/Models/Bandit/Choker.png differ diff --git a/Models/Bandit/ChokerHogtie.png b/Models/Bandit/ChokerHogtie.png new file mode 100644 index 000000000..996648a5e Binary files /dev/null and b/Models/Bandit/ChokerHogtie.png differ diff --git a/Models/Bandit/KneeClosed.png b/Models/Bandit/KneeClosed.png new file mode 100644 index 000000000..200a41124 Binary files /dev/null and b/Models/Bandit/KneeClosed.png differ diff --git a/Models/Bandit/KneeKneel.png b/Models/Bandit/KneeKneel.png new file mode 100644 index 000000000..e6fe4d609 Binary files /dev/null and b/Models/Bandit/KneeKneel.png differ diff --git a/Models/Bandit/KneeSpread.png b/Models/Bandit/KneeSpread.png new file mode 100644 index 000000000..29d07be10 Binary files /dev/null and b/Models/Bandit/KneeSpread.png differ diff --git a/Models/Bandit/PouchClosed.png b/Models/Bandit/PouchClosed.png new file mode 100644 index 000000000..10e0e4c17 Binary files /dev/null and b/Models/Bandit/PouchClosed.png differ diff --git a/Models/Bandit/PouchKneel.png b/Models/Bandit/PouchKneel.png new file mode 100644 index 000000000..dac582285 Binary files /dev/null and b/Models/Bandit/PouchKneel.png differ diff --git a/Models/Bandit/PouchSpread.png b/Models/Bandit/PouchSpread.png new file mode 100644 index 000000000..0ca8a7c0b Binary files /dev/null and b/Models/Bandit/PouchSpread.png differ diff --git a/Models/Bandit/ShoeLeftClosed.png b/Models/Bandit/ShoeLeftClosed.png new file mode 100644 index 000000000..36b55192e Binary files /dev/null and b/Models/Bandit/ShoeLeftClosed.png differ diff --git a/Models/Bandit/ShoeLeftHogtie.png b/Models/Bandit/ShoeLeftHogtie.png new file mode 100644 index 000000000..0b9d9d742 Binary files /dev/null and b/Models/Bandit/ShoeLeftHogtie.png differ diff --git a/Models/Bandit/ShoeLeftKneel.png b/Models/Bandit/ShoeLeftKneel.png new file mode 100644 index 000000000..be00b272c Binary files /dev/null and b/Models/Bandit/ShoeLeftKneel.png differ diff --git a/Models/Bandit/ShoeLeftKneelClosed.png b/Models/Bandit/ShoeLeftKneelClosed.png new file mode 100644 index 000000000..9446df844 Binary files /dev/null and b/Models/Bandit/ShoeLeftKneelClosed.png differ diff --git a/Models/Bandit/ShoeLeftSpread.png b/Models/Bandit/ShoeLeftSpread.png new file mode 100644 index 000000000..c610d1cfd Binary files /dev/null and b/Models/Bandit/ShoeLeftSpread.png differ diff --git a/Models/Bandit/ShoeRightClosed.png b/Models/Bandit/ShoeRightClosed.png new file mode 100644 index 000000000..2b26fc190 Binary files /dev/null and b/Models/Bandit/ShoeRightClosed.png differ diff --git a/Models/Bandit/ShoeRightKneel.png b/Models/Bandit/ShoeRightKneel.png new file mode 100644 index 000000000..a1ff99ed5 Binary files /dev/null and b/Models/Bandit/ShoeRightKneel.png differ diff --git a/Models/Bandit/ShoeRightSpread.png b/Models/Bandit/ShoeRightSpread.png new file mode 100644 index 000000000..3bc73626f Binary files /dev/null and b/Models/Bandit/ShoeRightSpread.png differ diff --git a/Models/Bandit/ShortsClosed.png b/Models/Bandit/ShortsClosed.png new file mode 100644 index 000000000..1e5f82100 Binary files /dev/null and b/Models/Bandit/ShortsClosed.png differ diff --git a/Models/Bandit/ShortsKneel.png b/Models/Bandit/ShortsKneel.png new file mode 100644 index 000000000..6591013f2 Binary files /dev/null and b/Models/Bandit/ShortsKneel.png differ diff --git a/Models/Bandit/ShortsKneelClosed.png b/Models/Bandit/ShortsKneelClosed.png new file mode 100644 index 000000000..6591013f2 Binary files /dev/null and b/Models/Bandit/ShortsKneelClosed.png differ diff --git a/Models/Bandit/ShortsLeftClosed.png b/Models/Bandit/ShortsLeftClosed.png new file mode 100644 index 000000000..4156f80ad Binary files /dev/null and b/Models/Bandit/ShortsLeftClosed.png differ diff --git a/Models/Bandit/ShortsLeftKneel.png b/Models/Bandit/ShortsLeftKneel.png new file mode 100644 index 000000000..5977cee50 Binary files /dev/null and b/Models/Bandit/ShortsLeftKneel.png differ diff --git a/Models/Bandit/ShortsLeftKneelClosed.png b/Models/Bandit/ShortsLeftKneelClosed.png new file mode 100644 index 000000000..018a81cf8 Binary files /dev/null and b/Models/Bandit/ShortsLeftKneelClosed.png differ diff --git a/Models/Bandit/ShortsLeftSpread.png b/Models/Bandit/ShortsLeftSpread.png new file mode 100644 index 000000000..6b8613861 Binary files /dev/null and b/Models/Bandit/ShortsLeftSpread.png differ diff --git a/Models/Bandit/ShortsSpread.png b/Models/Bandit/ShortsSpread.png new file mode 100644 index 000000000..617a89693 Binary files /dev/null and b/Models/Bandit/ShortsSpread.png differ diff --git a/Models/Bandit/ShoulderPad.png b/Models/Bandit/ShoulderPad.png new file mode 100644 index 000000000..598c02038 Binary files /dev/null and b/Models/Bandit/ShoulderPad.png differ diff --git a/Models/Bandit/ShoulderPadHogtie.png b/Models/Bandit/ShoulderPadHogtie.png new file mode 100644 index 000000000..f82de87f4 Binary files /dev/null and b/Models/Bandit/ShoulderPadHogtie.png differ diff --git a/Models/Bandit/WristLeftFree.png b/Models/Bandit/WristLeftFree.png new file mode 100644 index 000000000..65d1add52 Binary files /dev/null and b/Models/Bandit/WristLeftFree.png differ diff --git a/Models/Bandit/WristLeftFront.png b/Models/Bandit/WristLeftFront.png new file mode 100644 index 000000000..e6681dc18 Binary files /dev/null and b/Models/Bandit/WristLeftFront.png differ diff --git a/Models/Bandit/WristLeftYoked.png b/Models/Bandit/WristLeftYoked.png new file mode 100644 index 000000000..3c37e7760 Binary files /dev/null and b/Models/Bandit/WristLeftYoked.png differ diff --git a/Models/Bandit/WristRightFree.png b/Models/Bandit/WristRightFree.png new file mode 100644 index 000000000..f41594541 Binary files /dev/null and b/Models/Bandit/WristRightFree.png differ diff --git a/Models/Bandit/WristRightFront.png b/Models/Bandit/WristRightFront.png new file mode 100644 index 000000000..690215525 Binary files /dev/null and b/Models/Bandit/WristRightFront.png differ diff --git a/Models/Bandit/WristRightYoked.png b/Models/Bandit/WristRightYoked.png new file mode 100644 index 000000000..31337ab0e Binary files /dev/null and b/Models/Bandit/WristRightYoked.png differ diff --git a/Models/Belts/Arms1.png b/Models/Belts/Arms1.png new file mode 100644 index 000000000..9b4b7a5ab Binary files /dev/null and b/Models/Belts/Arms1.png differ diff --git a/Models/Belts/Arms2.png b/Models/Belts/Arms2.png new file mode 100644 index 000000000..ca4830dcf Binary files /dev/null and b/Models/Belts/Arms2.png differ diff --git a/Models/Belts/Belt.png b/Models/Belts/Belt.png new file mode 100644 index 000000000..8e5312584 Binary files /dev/null and b/Models/Belts/Belt.png differ diff --git a/Models/Belts/Feet1Closed.png b/Models/Belts/Feet1Closed.png new file mode 100644 index 000000000..6e6a9fffd Binary files /dev/null and b/Models/Belts/Feet1Closed.png differ diff --git a/Models/Belts/Feet1Kneel.png b/Models/Belts/Feet1Kneel.png new file mode 100644 index 000000000..86948bd83 Binary files /dev/null and b/Models/Belts/Feet1Kneel.png differ diff --git a/Models/Belts/Feet1KneelClosed.png b/Models/Belts/Feet1KneelClosed.png new file mode 100644 index 000000000..3144693f3 Binary files /dev/null and b/Models/Belts/Feet1KneelClosed.png differ diff --git a/Models/Belts/Feet2Closed.png b/Models/Belts/Feet2Closed.png new file mode 100644 index 000000000..7f88ff121 Binary files /dev/null and b/Models/Belts/Feet2Closed.png differ diff --git a/Models/Belts/Feet2Kneel.png b/Models/Belts/Feet2Kneel.png new file mode 100644 index 000000000..2e2507896 Binary files /dev/null and b/Models/Belts/Feet2Kneel.png differ diff --git a/Models/Belts/Feet2KneelClosed.png b/Models/Belts/Feet2KneelClosed.png new file mode 100644 index 000000000..4813097e7 Binary files /dev/null and b/Models/Belts/Feet2KneelClosed.png differ diff --git a/Models/Belts/LeftArm1Boxtie.png b/Models/Belts/LeftArm1Boxtie.png new file mode 100644 index 000000000..e156c7c55 Binary files /dev/null and b/Models/Belts/LeftArm1Boxtie.png differ diff --git a/Models/Belts/LeftArm1Wristtie.png b/Models/Belts/LeftArm1Wristtie.png new file mode 100644 index 000000000..8ce32bc1c Binary files /dev/null and b/Models/Belts/LeftArm1Wristtie.png differ diff --git a/Models/Belts/LeftArm2Boxtie.png b/Models/Belts/LeftArm2Boxtie.png new file mode 100644 index 000000000..295af98e8 Binary files /dev/null and b/Models/Belts/LeftArm2Boxtie.png differ diff --git a/Models/Belts/LeftArm2Wristtie.png b/Models/Belts/LeftArm2Wristtie.png new file mode 100644 index 000000000..acf88a8a8 Binary files /dev/null and b/Models/Belts/LeftArm2Wristtie.png differ diff --git a/Models/Belts/Legs1Closed.png b/Models/Belts/Legs1Closed.png new file mode 100644 index 000000000..69f3ab62f Binary files /dev/null and b/Models/Belts/Legs1Closed.png differ diff --git a/Models/Belts/Legs1Kneel.png b/Models/Belts/Legs1Kneel.png new file mode 100644 index 000000000..338032558 Binary files /dev/null and b/Models/Belts/Legs1Kneel.png differ diff --git a/Models/Belts/Legs1KneelClosed.png b/Models/Belts/Legs1KneelClosed.png new file mode 100644 index 000000000..fa7c2004d Binary files /dev/null and b/Models/Belts/Legs1KneelClosed.png differ diff --git a/Models/Belts/Legs2Closed.png b/Models/Belts/Legs2Closed.png new file mode 100644 index 000000000..b40dd0bea Binary files /dev/null and b/Models/Belts/Legs2Closed.png differ diff --git a/Models/Belts/Legs2Kneel.png b/Models/Belts/Legs2Kneel.png new file mode 100644 index 000000000..3a73a52b6 Binary files /dev/null and b/Models/Belts/Legs2Kneel.png differ diff --git a/Models/Belts/Legs2KneelClosed.png b/Models/Belts/Legs2KneelClosed.png new file mode 100644 index 000000000..2efa34183 Binary files /dev/null and b/Models/Belts/Legs2KneelClosed.png differ diff --git a/Models/Belts/RightArm1Boxtie.png b/Models/Belts/RightArm1Boxtie.png new file mode 100644 index 000000000..b5d3d5512 Binary files /dev/null and b/Models/Belts/RightArm1Boxtie.png differ diff --git a/Models/Belts/RightArm1Wristtie.png b/Models/Belts/RightArm1Wristtie.png new file mode 100644 index 000000000..b5d3d5512 Binary files /dev/null and b/Models/Belts/RightArm1Wristtie.png differ diff --git a/Models/Belts/RightArm2Boxtie.png b/Models/Belts/RightArm2Boxtie.png new file mode 100644 index 000000000..343bf5ae8 Binary files /dev/null and b/Models/Belts/RightArm2Boxtie.png differ diff --git a/Models/Belts/RightArm2Wristtie.png b/Models/Belts/RightArm2Wristtie.png new file mode 100644 index 000000000..1fda76ba7 Binary files /dev/null and b/Models/Belts/RightArm2Wristtie.png differ diff --git a/Models/Belts/RightLegs1Kneel.png b/Models/Belts/RightLegs1Kneel.png new file mode 100644 index 000000000..3d7c54853 Binary files /dev/null and b/Models/Belts/RightLegs1Kneel.png differ diff --git a/Models/Belts/RightLegs1KneelClosed.png b/Models/Belts/RightLegs1KneelClosed.png new file mode 100644 index 000000000..3d7c54853 Binary files /dev/null and b/Models/Belts/RightLegs1KneelClosed.png differ diff --git a/Models/Belts/RightLegs2Kneel.png b/Models/Belts/RightLegs2Kneel.png new file mode 100644 index 000000000..6b8fd868a Binary files /dev/null and b/Models/Belts/RightLegs2Kneel.png differ diff --git a/Models/Belts/RightLegs2KneelClosed.png b/Models/Belts/RightLegs2KneelClosed.png new file mode 100644 index 000000000..6b8fd868a Binary files /dev/null and b/Models/Belts/RightLegs2KneelClosed.png differ diff --git a/Models/Blindfold/Basic.png b/Models/Blindfold/Basic.png new file mode 100644 index 000000000..26b4991a9 Binary files /dev/null and b/Models/Blindfold/Basic.png differ diff --git a/Models/Blindfold/BasicRim.png b/Models/Blindfold/BasicRim.png new file mode 100644 index 000000000..e683e3ee5 Binary files /dev/null and b/Models/Blindfold/BasicRim.png differ diff --git a/Models/Blindfold/Cloth.png b/Models/Blindfold/Cloth.png new file mode 100644 index 000000000..3b0217889 Binary files /dev/null and b/Models/Blindfold/Cloth.png differ diff --git a/Models/Blindfold/KittyEyes.png b/Models/Blindfold/KittyEyes.png new file mode 100644 index 000000000..de548f8db Binary files /dev/null and b/Models/Blindfold/KittyEyes.png differ diff --git a/Models/Blindfold/LeatherBase.png b/Models/Blindfold/LeatherBase.png new file mode 100644 index 000000000..bad29cd5e Binary files /dev/null and b/Models/Blindfold/LeatherBase.png differ diff --git a/Models/Blindfold/LeatherRim.png b/Models/Blindfold/LeatherRim.png new file mode 100644 index 000000000..a13f65c67 Binary files /dev/null and b/Models/Blindfold/LeatherRim.png differ diff --git a/Models/Blindfold/Tape.png b/Models/Blindfold/Tape.png new file mode 100644 index 000000000..8007844fe Binary files /dev/null and b/Models/Blindfold/Tape.png differ diff --git a/Models/Body/ArmLeftBoxtie.png b/Models/Body/ArmLeftBoxtie.png new file mode 100644 index 000000000..2de76d8e4 Binary files /dev/null and b/Models/Body/ArmLeftBoxtie.png differ diff --git a/Models/Body/ArmLeftCrossed.png b/Models/Body/ArmLeftCrossed.png new file mode 100644 index 000000000..cdfa39f73 Binary files /dev/null and b/Models/Body/ArmLeftCrossed.png differ diff --git a/Models/Body/ArmLeftFree.png b/Models/Body/ArmLeftFree.png new file mode 100644 index 000000000..c6acfa9e1 Binary files /dev/null and b/Models/Body/ArmLeftFree.png differ diff --git a/Models/Body/ArmLeftFront.png b/Models/Body/ArmLeftFront.png new file mode 100644 index 000000000..1e355f0cf Binary files /dev/null and b/Models/Body/ArmLeftFront.png differ diff --git a/Models/Body/ArmLeftUp.png b/Models/Body/ArmLeftUp.png new file mode 100644 index 000000000..123dd1851 Binary files /dev/null and b/Models/Body/ArmLeftUp.png differ diff --git a/Models/Body/ArmLeftWristtie.png b/Models/Body/ArmLeftWristtie.png new file mode 100644 index 000000000..14a83c0c9 Binary files /dev/null and b/Models/Body/ArmLeftWristtie.png differ diff --git a/Models/Body/ArmLeftYoked.png b/Models/Body/ArmLeftYoked.png new file mode 100644 index 000000000..10346d110 Binary files /dev/null and b/Models/Body/ArmLeftYoked.png differ diff --git a/Models/Body/ArmRightBoxtie.png b/Models/Body/ArmRightBoxtie.png new file mode 100644 index 000000000..e995e78c7 Binary files /dev/null and b/Models/Body/ArmRightBoxtie.png differ diff --git a/Models/Body/ArmRightCrossed.png b/Models/Body/ArmRightCrossed.png new file mode 100644 index 000000000..09c430523 Binary files /dev/null and b/Models/Body/ArmRightCrossed.png differ diff --git a/Models/Body/ArmRightFree.png b/Models/Body/ArmRightFree.png new file mode 100644 index 000000000..2f0dd4132 Binary files /dev/null and b/Models/Body/ArmRightFree.png differ diff --git a/Models/Body/ArmRightFront.png b/Models/Body/ArmRightFront.png new file mode 100644 index 000000000..18bf49b7f Binary files /dev/null and b/Models/Body/ArmRightFront.png differ diff --git a/Models/Body/ArmRightUp.png b/Models/Body/ArmRightUp.png new file mode 100644 index 000000000..1ab39afaf Binary files /dev/null and b/Models/Body/ArmRightUp.png differ diff --git a/Models/Body/ArmRightWristtie.png b/Models/Body/ArmRightWristtie.png new file mode 100644 index 000000000..c40c2dd5e Binary files /dev/null and b/Models/Body/ArmRightWristtie.png differ diff --git a/Models/Body/ArmRightYoked.png b/Models/Body/ArmRightYoked.png new file mode 100644 index 000000000..de9360152 Binary files /dev/null and b/Models/Body/ArmRightYoked.png differ diff --git a/Models/Body/Butt2.png b/Models/Body/Butt2.png new file mode 100644 index 000000000..45fea715d Binary files /dev/null and b/Models/Body/Butt2.png differ diff --git a/Models/Body/ButtKneel.png b/Models/Body/ButtKneel.png new file mode 100644 index 000000000..ba0e32b97 Binary files /dev/null and b/Models/Body/ButtKneel.png differ diff --git a/Models/Body/CalfLeftHogtie.png b/Models/Body/CalfLeftHogtie.png new file mode 100644 index 000000000..831e19fbb Binary files /dev/null and b/Models/Body/CalfLeftHogtie.png differ diff --git a/Models/Body/Chest.png b/Models/Body/Chest.png new file mode 100644 index 000000000..24f3a528e Binary files /dev/null and b/Models/Body/Chest.png differ diff --git a/Models/Body/Eyes.png b/Models/Body/Eyes.png new file mode 100644 index 000000000..8bd09b052 Binary files /dev/null and b/Models/Body/Eyes.png differ diff --git a/Models/Body/FootLeftHogtie.png b/Models/Body/FootLeftHogtie.png new file mode 100644 index 000000000..7e4e10634 Binary files /dev/null and b/Models/Body/FootLeftHogtie.png differ diff --git a/Models/Body/FootRightHogtie.png b/Models/Body/FootRightHogtie.png new file mode 100644 index 000000000..542983e50 Binary files /dev/null and b/Models/Body/FootRightHogtie.png differ diff --git a/Models/Body/FootRightKneel.png b/Models/Body/FootRightKneel.png new file mode 100644 index 000000000..8bd9ba755 Binary files /dev/null and b/Models/Body/FootRightKneel.png differ diff --git a/Models/Body/ForeArmLeftCrossed.png b/Models/Body/ForeArmLeftCrossed.png new file mode 100644 index 000000000..e55646869 Binary files /dev/null and b/Models/Body/ForeArmLeftCrossed.png differ diff --git a/Models/Body/ForeArmLeftFront.png b/Models/Body/ForeArmLeftFront.png new file mode 100644 index 000000000..7fede4bab Binary files /dev/null and b/Models/Body/ForeArmLeftFront.png differ diff --git a/Models/Body/ForeArmRightCrossed.png b/Models/Body/ForeArmRightCrossed.png new file mode 100644 index 000000000..dfd88207e Binary files /dev/null and b/Models/Body/ForeArmRightCrossed.png differ diff --git a/Models/Body/ForeArmRightFront.png b/Models/Body/ForeArmRightFront.png new file mode 100644 index 000000000..0abef1e5d Binary files /dev/null and b/Models/Body/ForeArmRightFront.png differ diff --git a/Models/Body/HandLeftFree.png b/Models/Body/HandLeftFree.png new file mode 100644 index 000000000..608590872 Binary files /dev/null and b/Models/Body/HandLeftFree.png differ diff --git a/Models/Body/HandLeftFront.png b/Models/Body/HandLeftFront.png new file mode 100644 index 000000000..ce5dbb279 Binary files /dev/null and b/Models/Body/HandLeftFront.png differ diff --git a/Models/Body/HandLeftYoked.png b/Models/Body/HandLeftYoked.png new file mode 100644 index 000000000..d5fdb4ae1 Binary files /dev/null and b/Models/Body/HandLeftYoked.png differ diff --git a/Models/Body/HandRightBoxtie.png b/Models/Body/HandRightBoxtie.png new file mode 100644 index 000000000..79ecea25d Binary files /dev/null and b/Models/Body/HandRightBoxtie.png differ diff --git a/Models/Body/HandRightFree.png b/Models/Body/HandRightFree.png new file mode 100644 index 000000000..7a85e1e85 Binary files /dev/null and b/Models/Body/HandRightFree.png differ diff --git a/Models/Body/HandRightFront.png b/Models/Body/HandRightFront.png new file mode 100644 index 000000000..31bed0e7c Binary files /dev/null and b/Models/Body/HandRightFront.png differ diff --git a/Models/Body/HandRightYoked.png b/Models/Body/HandRightYoked.png new file mode 100644 index 000000000..070adbbe4 Binary files /dev/null and b/Models/Body/HandRightYoked.png differ diff --git a/Models/Body/Head.png b/Models/Body/Head.png new file mode 100644 index 000000000..c31b6325e Binary files /dev/null and b/Models/Body/Head.png differ diff --git a/Models/Body/HeadBigGag.png b/Models/Body/HeadBigGag.png new file mode 100644 index 000000000..f8b09df80 Binary files /dev/null and b/Models/Body/HeadBigGag.png differ diff --git a/Models/Body/HeadGag.png b/Models/Body/HeadGag.png new file mode 100644 index 000000000..4996693e3 Binary files /dev/null and b/Models/Body/HeadGag.png differ diff --git a/Models/Body/HeadNoEar.png b/Models/Body/HeadNoEar.png new file mode 100644 index 000000000..804570cc1 Binary files /dev/null and b/Models/Body/HeadNoEar.png differ diff --git a/Models/Body/HeadNoEarBigGag.png b/Models/Body/HeadNoEarBigGag.png new file mode 100644 index 000000000..ad4bde94c Binary files /dev/null and b/Models/Body/HeadNoEarBigGag.png differ diff --git a/Models/Body/HeadNoEarGag.png b/Models/Body/HeadNoEarGag.png new file mode 100644 index 000000000..9854b3021 Binary files /dev/null and b/Models/Body/HeadNoEarGag.png differ diff --git a/Models/Body/LegLeftClosed.png b/Models/Body/LegLeftClosed.png new file mode 100644 index 000000000..70c5f354f Binary files /dev/null and b/Models/Body/LegLeftClosed.png differ diff --git a/Models/Body/LegLeftHogtie.png b/Models/Body/LegLeftHogtie.png new file mode 100644 index 000000000..1aa73ea42 Binary files /dev/null and b/Models/Body/LegLeftHogtie.png differ diff --git a/Models/Body/LegLeftKneel.png b/Models/Body/LegLeftKneel.png new file mode 100644 index 000000000..1c89a4027 Binary files /dev/null and b/Models/Body/LegLeftKneel.png differ diff --git a/Models/Body/LegLeftKneelClosed.png b/Models/Body/LegLeftKneelClosed.png new file mode 100644 index 000000000..93f1364fe Binary files /dev/null and b/Models/Body/LegLeftKneelClosed.png differ diff --git a/Models/Body/LegLeftSpread.png b/Models/Body/LegLeftSpread.png new file mode 100644 index 000000000..792d1d608 Binary files /dev/null and b/Models/Body/LegLeftSpread.png differ diff --git a/Models/Body/LegRightClosed.png b/Models/Body/LegRightClosed.png new file mode 100644 index 000000000..a9238f60b Binary files /dev/null and b/Models/Body/LegRightClosed.png differ diff --git a/Models/Body/LegRightHogtie.png b/Models/Body/LegRightHogtie.png new file mode 100644 index 000000000..a48b9ac24 Binary files /dev/null and b/Models/Body/LegRightHogtie.png differ diff --git a/Models/Body/LegRightKneel.png b/Models/Body/LegRightKneel.png new file mode 100644 index 000000000..09665c32b Binary files /dev/null and b/Models/Body/LegRightKneel.png differ diff --git a/Models/Body/LegRightKneelClosed.png b/Models/Body/LegRightKneelClosed.png new file mode 100644 index 000000000..1cb568bd7 Binary files /dev/null and b/Models/Body/LegRightKneelClosed.png differ diff --git a/Models/Body/LegRightSpread.png b/Models/Body/LegRightSpread.png new file mode 100644 index 000000000..e1af61498 Binary files /dev/null and b/Models/Body/LegRightSpread.png differ diff --git a/Models/Body/Nipples.png b/Models/Body/Nipples.png new file mode 100644 index 000000000..1eda58750 Binary files /dev/null and b/Models/Body/Nipples.png differ diff --git a/Models/Body/ShoulderLeftUp.png b/Models/Body/ShoulderLeftUp.png new file mode 100644 index 000000000..8667b82f4 Binary files /dev/null and b/Models/Body/ShoulderLeftUp.png differ diff --git a/Models/Body/ShoulderRightUp.png b/Models/Body/ShoulderRightUp.png new file mode 100644 index 000000000..d0f934828 Binary files /dev/null and b/Models/Body/ShoulderRightUp.png differ diff --git a/Models/Body/Torso.png b/Models/Body/Torso.png new file mode 100644 index 000000000..3d05e60dc Binary files /dev/null and b/Models/Body/Torso.png differ diff --git a/Models/Body/TorsoChastity.png b/Models/Body/TorsoChastity.png new file mode 100644 index 000000000..4e5680992 Binary files /dev/null and b/Models/Body/TorsoChastity.png differ diff --git a/Models/Body/TorsoClosed.png b/Models/Body/TorsoClosed.png new file mode 100644 index 000000000..12a901387 Binary files /dev/null and b/Models/Body/TorsoClosed.png differ diff --git a/Models/Body/TorsoClosedChastity.png b/Models/Body/TorsoClosedChastity.png new file mode 100644 index 000000000..673791935 Binary files /dev/null and b/Models/Body/TorsoClosedChastity.png differ diff --git a/Models/Body/TorsoSpread.png b/Models/Body/TorsoSpread.png new file mode 100644 index 000000000..ce28bbdb0 Binary files /dev/null and b/Models/Body/TorsoSpread.png differ diff --git a/Models/Body/TorsoSpreadChastity.png b/Models/Body/TorsoSpreadChastity.png new file mode 100644 index 000000000..79abaa3c5 Binary files /dev/null and b/Models/Body/TorsoSpreadChastity.png differ diff --git a/Models/Bra/Bra.png b/Models/Bra/Bra.png new file mode 100644 index 000000000..e8c3e7bd7 Binary files /dev/null and b/Models/Bra/Bra.png differ diff --git a/Models/Bra/BraRim.png b/Models/Bra/BraRim.png new file mode 100644 index 000000000..4c6ad1e96 Binary files /dev/null and b/Models/Bra/BraRim.png differ diff --git a/Models/Bra/BraUnder.png b/Models/Bra/BraUnder.png new file mode 100644 index 000000000..ed1bffd76 Binary files /dev/null and b/Models/Bra/BraUnder.png differ diff --git a/Models/Bra/BraUnderRim.png b/Models/Bra/BraUnderRim.png new file mode 100644 index 000000000..f18955558 Binary files /dev/null and b/Models/Bra/BraUnderRim.png differ diff --git a/Models/Bra/Cherry.png b/Models/Bra/Cherry.png new file mode 100644 index 000000000..8fe0350f1 Binary files /dev/null and b/Models/Bra/Cherry.png differ diff --git a/Models/Bra/InnerLines.png b/Models/Bra/InnerLines.png new file mode 100644 index 000000000..2b4abbfb4 Binary files /dev/null and b/Models/Bra/InnerLines.png differ diff --git a/Models/Bra/InvertedRose.png b/Models/Bra/InvertedRose.png new file mode 100644 index 000000000..cb8400187 Binary files /dev/null and b/Models/Bra/InvertedRose.png differ diff --git a/Models/Bra/Rose.png b/Models/Bra/Rose.png new file mode 100644 index 000000000..fde481b5d Binary files /dev/null and b/Models/Bra/Rose.png differ diff --git a/Models/Bra/Straps.png b/Models/Bra/Straps.png new file mode 100644 index 000000000..97504fcf9 Binary files /dev/null and b/Models/Bra/Straps.png differ diff --git a/Models/Bra/StrapsTied.png b/Models/Bra/StrapsTied.png new file mode 100644 index 000000000..57ba4f076 Binary files /dev/null and b/Models/Bra/StrapsTied.png differ diff --git a/Models/Bra/StrapsUp.png b/Models/Bra/StrapsUp.png new file mode 100644 index 000000000..8c656a197 Binary files /dev/null and b/Models/Bra/StrapsUp.png differ diff --git a/Models/Bra/Stripes.png b/Models/Bra/Stripes.png new file mode 100644 index 000000000..64cc87a18 Binary files /dev/null and b/Models/Bra/Stripes.png differ diff --git a/Models/Bubble/Arms.png b/Models/Bubble/Arms.png new file mode 100644 index 000000000..65402af4d Binary files /dev/null and b/Models/Bubble/Arms.png differ diff --git a/Models/Bubble/BallSuit.png b/Models/Bubble/BallSuit.png new file mode 100644 index 000000000..150881bab Binary files /dev/null and b/Models/Bubble/BallSuit.png differ diff --git a/Models/Bubble/BallSuitSeam.png b/Models/Bubble/BallSuitSeam.png new file mode 100644 index 000000000..40b581be1 Binary files /dev/null and b/Models/Bubble/BallSuitSeam.png differ diff --git a/Models/Bubble/Bubble.png b/Models/Bubble/Bubble.png new file mode 100644 index 000000000..f8121459f Binary files /dev/null and b/Models/Bubble/Bubble.png differ diff --git a/Models/Bubble/BubbleSquishy.png b/Models/Bubble/BubbleSquishy.png new file mode 100644 index 000000000..c8de205fd Binary files /dev/null and b/Models/Bubble/BubbleSquishy.png differ diff --git a/Models/Bubble/BubbleSquishyBack.png b/Models/Bubble/BubbleSquishyBack.png new file mode 100644 index 000000000..2ce1fccf2 Binary files /dev/null and b/Models/Bubble/BubbleSquishyBack.png differ diff --git a/Models/Bubble/Collar.png b/Models/Bubble/Collar.png new file mode 100644 index 000000000..8e3c80f33 Binary files /dev/null and b/Models/Bubble/Collar.png differ diff --git a/Models/Bubble/CuffsArms.png b/Models/Bubble/CuffsArms.png new file mode 100644 index 000000000..4d300218d Binary files /dev/null and b/Models/Bubble/CuffsArms.png differ diff --git a/Models/Bubble/Gag.png b/Models/Bubble/Gag.png new file mode 100644 index 000000000..55f3c776f Binary files /dev/null and b/Models/Bubble/Gag.png differ diff --git a/Models/Bubble/Head.png b/Models/Bubble/Head.png new file mode 100644 index 000000000..76a881844 Binary files /dev/null and b/Models/Bubble/Head.png differ diff --git a/Models/Bubble/LatexSphere.png b/Models/Bubble/LatexSphere.png new file mode 100644 index 000000000..99d66432a Binary files /dev/null and b/Models/Bubble/LatexSphere.png differ diff --git a/Models/Bubble/LatexSphereCutaway.png b/Models/Bubble/LatexSphereCutaway.png new file mode 100644 index 000000000..719f0627b Binary files /dev/null and b/Models/Bubble/LatexSphereCutaway.png differ diff --git a/Models/Bubble/LatexSphereCutawayBack.png b/Models/Bubble/LatexSphereCutawayBack.png new file mode 100644 index 000000000..d20ec1f67 Binary files /dev/null and b/Models/Bubble/LatexSphereCutawayBack.png differ diff --git a/Models/Bubble/Legs.png b/Models/Bubble/Legs.png new file mode 100644 index 000000000..e9dfbd7eb Binary files /dev/null and b/Models/Bubble/Legs.png differ diff --git a/Models/Bunny/Ears.png b/Models/Bunny/Ears.png new file mode 100644 index 000000000..e7077fe51 Binary files /dev/null and b/Models/Bunny/Ears.png differ diff --git a/Models/Bunny/EarsFront.png b/Models/Bunny/EarsFront.png new file mode 100644 index 000000000..5531267b8 Binary files /dev/null and b/Models/Bunny/EarsFront.png differ diff --git a/Models/Bunny/EarsInner.png b/Models/Bunny/EarsInner.png new file mode 100644 index 000000000..947fca787 Binary files /dev/null and b/Models/Bunny/EarsInner.png differ diff --git a/Models/Bunny/FootSockLeftHogtie.png b/Models/Bunny/FootSockLeftHogtie.png new file mode 100644 index 000000000..4b7bbeb49 Binary files /dev/null and b/Models/Bunny/FootSockLeftHogtie.png differ diff --git a/Models/Bunny/FootSockRightKneel.png b/Models/Bunny/FootSockRightKneel.png new file mode 100644 index 000000000..9fad9e355 Binary files /dev/null and b/Models/Bunny/FootSockRightKneel.png differ diff --git a/Models/Bunny/ForeGloveLeftCrossed.png b/Models/Bunny/ForeGloveLeftCrossed.png new file mode 100644 index 000000000..dfd0131d5 Binary files /dev/null and b/Models/Bunny/ForeGloveLeftCrossed.png differ diff --git a/Models/Bunny/ForeGloveLeftFront.png b/Models/Bunny/ForeGloveLeftFront.png new file mode 100644 index 000000000..9776b3a5d Binary files /dev/null and b/Models/Bunny/ForeGloveLeftFront.png differ diff --git a/Models/Bunny/ForeGloveRightCrossed.png b/Models/Bunny/ForeGloveRightCrossed.png new file mode 100644 index 000000000..1cc901959 Binary files /dev/null and b/Models/Bunny/ForeGloveRightCrossed.png differ diff --git a/Models/Bunny/ForeGloveRightFront.png b/Models/Bunny/ForeGloveRightFront.png new file mode 100644 index 000000000..155e48b9b Binary files /dev/null and b/Models/Bunny/ForeGloveRightFront.png differ diff --git a/Models/Bunny/GloveLeftBoxtie.png b/Models/Bunny/GloveLeftBoxtie.png new file mode 100644 index 000000000..417dd0f58 Binary files /dev/null and b/Models/Bunny/GloveLeftBoxtie.png differ diff --git a/Models/Bunny/GloveLeftCrossed.png b/Models/Bunny/GloveLeftCrossed.png new file mode 100644 index 000000000..b90a48cf4 Binary files /dev/null and b/Models/Bunny/GloveLeftCrossed.png differ diff --git a/Models/Bunny/GloveLeftFree.png b/Models/Bunny/GloveLeftFree.png new file mode 100644 index 000000000..96a0aef64 Binary files /dev/null and b/Models/Bunny/GloveLeftFree.png differ diff --git a/Models/Bunny/GloveLeftFront.png b/Models/Bunny/GloveLeftFront.png new file mode 100644 index 000000000..0dc10c0d4 Binary files /dev/null and b/Models/Bunny/GloveLeftFront.png differ diff --git a/Models/Bunny/GloveLeftUp.png b/Models/Bunny/GloveLeftUp.png new file mode 100644 index 000000000..bdb4a8361 Binary files /dev/null and b/Models/Bunny/GloveLeftUp.png differ diff --git a/Models/Bunny/GloveLeftWristtie.png b/Models/Bunny/GloveLeftWristtie.png new file mode 100644 index 000000000..6fc578c17 Binary files /dev/null and b/Models/Bunny/GloveLeftWristtie.png differ diff --git a/Models/Bunny/GloveLeftYoked.png b/Models/Bunny/GloveLeftYoked.png new file mode 100644 index 000000000..3e2ee61c2 Binary files /dev/null and b/Models/Bunny/GloveLeftYoked.png differ diff --git a/Models/Bunny/GloveRightBoxtie.png b/Models/Bunny/GloveRightBoxtie.png new file mode 100644 index 000000000..20b91344e Binary files /dev/null and b/Models/Bunny/GloveRightBoxtie.png differ diff --git a/Models/Bunny/GloveRightCrossed.png b/Models/Bunny/GloveRightCrossed.png new file mode 100644 index 000000000..f78070c81 Binary files /dev/null and b/Models/Bunny/GloveRightCrossed.png differ diff --git a/Models/Bunny/GloveRightFree.png b/Models/Bunny/GloveRightFree.png new file mode 100644 index 000000000..bd8ba1820 Binary files /dev/null and b/Models/Bunny/GloveRightFree.png differ diff --git a/Models/Bunny/GloveRightFront.png b/Models/Bunny/GloveRightFront.png new file mode 100644 index 000000000..3899a9e3f Binary files /dev/null and b/Models/Bunny/GloveRightFront.png differ diff --git a/Models/Bunny/GloveRightUp.png b/Models/Bunny/GloveRightUp.png new file mode 100644 index 000000000..26ec61d6f Binary files /dev/null and b/Models/Bunny/GloveRightUp.png differ diff --git a/Models/Bunny/GloveRightWristtie.png b/Models/Bunny/GloveRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Bunny/GloveRightWristtie.png differ diff --git a/Models/Bunny/GloveRightYoked.png b/Models/Bunny/GloveRightYoked.png new file mode 100644 index 000000000..b09026194 Binary files /dev/null and b/Models/Bunny/GloveRightYoked.png differ diff --git a/Models/Bunny/HighLeotard.png b/Models/Bunny/HighLeotard.png new file mode 100644 index 000000000..37eea8071 Binary files /dev/null and b/Models/Bunny/HighLeotard.png differ diff --git a/Models/Bunny/HighLeotardClosed.png b/Models/Bunny/HighLeotardClosed.png new file mode 100644 index 000000000..d9f4c7339 Binary files /dev/null and b/Models/Bunny/HighLeotardClosed.png differ diff --git a/Models/Bunny/HighLeotardKneel.png b/Models/Bunny/HighLeotardKneel.png new file mode 100644 index 000000000..3c68b066f Binary files /dev/null and b/Models/Bunny/HighLeotardKneel.png differ diff --git a/Models/Bunny/LegSockLeftClosed.png b/Models/Bunny/LegSockLeftClosed.png new file mode 100644 index 000000000..e548442d3 Binary files /dev/null and b/Models/Bunny/LegSockLeftClosed.png differ diff --git a/Models/Bunny/LegSockLeftHogtie.png b/Models/Bunny/LegSockLeftHogtie.png new file mode 100644 index 000000000..e548442d3 Binary files /dev/null and b/Models/Bunny/LegSockLeftHogtie.png differ diff --git a/Models/Bunny/LegSockLeftSpread.png b/Models/Bunny/LegSockLeftSpread.png new file mode 100644 index 000000000..9771a1de4 Binary files /dev/null and b/Models/Bunny/LegSockLeftSpread.png differ diff --git a/Models/Bunny/LegSockRightClosed.png b/Models/Bunny/LegSockRightClosed.png new file mode 100644 index 000000000..9274d8aad Binary files /dev/null and b/Models/Bunny/LegSockRightClosed.png differ diff --git a/Models/Bunny/LegSockRightHogtie.png b/Models/Bunny/LegSockRightHogtie.png new file mode 100644 index 000000000..570f19292 Binary files /dev/null and b/Models/Bunny/LegSockRightHogtie.png differ diff --git a/Models/Bunny/LegSockRightSpread.png b/Models/Bunny/LegSockRightSpread.png new file mode 100644 index 000000000..e098f2fb4 Binary files /dev/null and b/Models/Bunny/LegSockRightSpread.png differ diff --git a/Models/Bunny/Leotard.png b/Models/Bunny/Leotard.png new file mode 100644 index 000000000..583921f29 Binary files /dev/null and b/Models/Bunny/Leotard.png differ diff --git a/Models/Bunny/LeotardChest.png b/Models/Bunny/LeotardChest.png new file mode 100644 index 000000000..bbd9dbf8b Binary files /dev/null and b/Models/Bunny/LeotardChest.png differ diff --git a/Models/Bunny/LeotardClosed.png b/Models/Bunny/LeotardClosed.png new file mode 100644 index 000000000..b0eeb7005 Binary files /dev/null and b/Models/Bunny/LeotardClosed.png differ diff --git a/Models/Bunny/LeotardKneel.png b/Models/Bunny/LeotardKneel.png new file mode 100644 index 000000000..3c68b066f Binary files /dev/null and b/Models/Bunny/LeotardKneel.png differ diff --git a/Models/Bunny/SockLeftClosed.png b/Models/Bunny/SockLeftClosed.png new file mode 100644 index 000000000..0b371fcd6 Binary files /dev/null and b/Models/Bunny/SockLeftClosed.png differ diff --git a/Models/Bunny/SockLeftHogtie.png b/Models/Bunny/SockLeftHogtie.png new file mode 100644 index 000000000..dca88b187 Binary files /dev/null and b/Models/Bunny/SockLeftHogtie.png differ diff --git a/Models/Bunny/SockLeftKneel.png b/Models/Bunny/SockLeftKneel.png new file mode 100644 index 000000000..7624186b0 Binary files /dev/null and b/Models/Bunny/SockLeftKneel.png differ diff --git a/Models/Bunny/SockLeftKneelClosed.png b/Models/Bunny/SockLeftKneelClosed.png new file mode 100644 index 000000000..369eed7e0 Binary files /dev/null and b/Models/Bunny/SockLeftKneelClosed.png differ diff --git a/Models/Bunny/SockLeftSpread.png b/Models/Bunny/SockLeftSpread.png new file mode 100644 index 000000000..e11c02c1b Binary files /dev/null and b/Models/Bunny/SockLeftSpread.png differ diff --git a/Models/Bunny/SockRightClosed.png b/Models/Bunny/SockRightClosed.png new file mode 100644 index 000000000..15b0a2016 Binary files /dev/null and b/Models/Bunny/SockRightClosed.png differ diff --git a/Models/Bunny/SockRightHogtie.png b/Models/Bunny/SockRightHogtie.png new file mode 100644 index 000000000..ce08b68b8 Binary files /dev/null and b/Models/Bunny/SockRightHogtie.png differ diff --git a/Models/Bunny/SockRightKneel.png b/Models/Bunny/SockRightKneel.png new file mode 100644 index 000000000..349763e94 Binary files /dev/null and b/Models/Bunny/SockRightKneel.png differ diff --git a/Models/Bunny/SockRightKneelClosed.png b/Models/Bunny/SockRightKneelClosed.png new file mode 100644 index 000000000..bc2cd8dfd Binary files /dev/null and b/Models/Bunny/SockRightKneelClosed.png differ diff --git a/Models/Bunny/SockRightSpread.png b/Models/Bunny/SockRightSpread.png new file mode 100644 index 000000000..70d87e765 Binary files /dev/null and b/Models/Bunny/SockRightSpread.png differ diff --git a/Models/Cape/CapeHogtie.png b/Models/Cape/CapeHogtie.png new file mode 100644 index 000000000..dcd8e3767 Binary files /dev/null and b/Models/Cape/CapeHogtie.png differ diff --git a/Models/Cape/CapeKneel.png b/Models/Cape/CapeKneel.png new file mode 100644 index 000000000..65b4dbe96 Binary files /dev/null and b/Models/Cape/CapeKneel.png differ diff --git a/Models/Cape/CapeSpread.png b/Models/Cape/CapeSpread.png new file mode 100644 index 000000000..d1137eebc Binary files /dev/null and b/Models/Cape/CapeSpread.png differ diff --git a/Models/Cape/CapeYoked.png b/Models/Cape/CapeYoked.png new file mode 100644 index 000000000..a04ee8fcc Binary files /dev/null and b/Models/Cape/CapeYoked.png differ diff --git a/Models/Cape/CoatHogtieFree.png b/Models/Cape/CoatHogtieFree.png new file mode 100644 index 000000000..05d97c81f Binary files /dev/null and b/Models/Cape/CoatHogtieFree.png differ diff --git a/Models/Cape/ShouldersHogtie.png b/Models/Cape/ShouldersHogtie.png new file mode 100644 index 000000000..47ee354cf Binary files /dev/null and b/Models/Cape/ShouldersHogtie.png differ diff --git a/Models/Cape/ShouldersHogtieFree.png b/Models/Cape/ShouldersHogtieFree.png new file mode 100644 index 000000000..73f82617f Binary files /dev/null and b/Models/Cape/ShouldersHogtieFree.png differ diff --git a/Models/Cape/ShouldersKneel.png b/Models/Cape/ShouldersKneel.png new file mode 100644 index 000000000..73f82617f Binary files /dev/null and b/Models/Cape/ShouldersKneel.png differ diff --git a/Models/Cape/ShouldersSpread.png b/Models/Cape/ShouldersSpread.png new file mode 100644 index 000000000..73f82617f Binary files /dev/null and b/Models/Cape/ShouldersSpread.png differ diff --git a/Models/Cape/ShouldersUp.png b/Models/Cape/ShouldersUp.png new file mode 100644 index 000000000..8341f39b3 Binary files /dev/null and b/Models/Cape/ShouldersUp.png differ diff --git a/Models/Cape/ShouldersYoked.png b/Models/Cape/ShouldersYoked.png new file mode 100644 index 000000000..33704e56b Binary files /dev/null and b/Models/Cape/ShouldersYoked.png differ diff --git a/Models/Catsuit/ArmLeftBoxtie.png b/Models/Catsuit/ArmLeftBoxtie.png new file mode 100644 index 000000000..760591b31 Binary files /dev/null and b/Models/Catsuit/ArmLeftBoxtie.png differ diff --git a/Models/Catsuit/ArmLeftCrossed.png b/Models/Catsuit/ArmLeftCrossed.png new file mode 100644 index 000000000..1beceeb5b Binary files /dev/null and b/Models/Catsuit/ArmLeftCrossed.png differ diff --git a/Models/Catsuit/ArmLeftFree.png b/Models/Catsuit/ArmLeftFree.png new file mode 100644 index 000000000..931b09f09 Binary files /dev/null and b/Models/Catsuit/ArmLeftFree.png differ diff --git a/Models/Catsuit/ArmLeftFront.png b/Models/Catsuit/ArmLeftFront.png new file mode 100644 index 000000000..0f796ca23 Binary files /dev/null and b/Models/Catsuit/ArmLeftFront.png differ diff --git a/Models/Catsuit/ArmLeftHogtie.png b/Models/Catsuit/ArmLeftHogtie.png new file mode 100644 index 000000000..1fb5b0830 Binary files /dev/null and b/Models/Catsuit/ArmLeftHogtie.png differ diff --git a/Models/Catsuit/ArmLeftUp.png b/Models/Catsuit/ArmLeftUp.png new file mode 100644 index 000000000..d8d1e6fc4 Binary files /dev/null and b/Models/Catsuit/ArmLeftUp.png differ diff --git a/Models/Catsuit/ArmLeftWristtie.png b/Models/Catsuit/ArmLeftWristtie.png new file mode 100644 index 000000000..861fe861a Binary files /dev/null and b/Models/Catsuit/ArmLeftWristtie.png differ diff --git a/Models/Catsuit/ArmLeftYoked.png b/Models/Catsuit/ArmLeftYoked.png new file mode 100644 index 000000000..d8187501a Binary files /dev/null and b/Models/Catsuit/ArmLeftYoked.png differ diff --git a/Models/Catsuit/ArmRightBoxtie.png b/Models/Catsuit/ArmRightBoxtie.png new file mode 100644 index 000000000..8868359cf Binary files /dev/null and b/Models/Catsuit/ArmRightBoxtie.png differ diff --git a/Models/Catsuit/ArmRightCrossed.png b/Models/Catsuit/ArmRightCrossed.png new file mode 100644 index 000000000..bce8d2c52 Binary files /dev/null and b/Models/Catsuit/ArmRightCrossed.png differ diff --git a/Models/Catsuit/ArmRightFree.png b/Models/Catsuit/ArmRightFree.png new file mode 100644 index 000000000..d3ba420c6 Binary files /dev/null and b/Models/Catsuit/ArmRightFree.png differ diff --git a/Models/Catsuit/ArmRightFront.png b/Models/Catsuit/ArmRightFront.png new file mode 100644 index 000000000..6928c126f Binary files /dev/null and b/Models/Catsuit/ArmRightFront.png differ diff --git a/Models/Catsuit/ArmRightHogtie.png b/Models/Catsuit/ArmRightHogtie.png new file mode 100644 index 000000000..d45f8d9d4 Binary files /dev/null and b/Models/Catsuit/ArmRightHogtie.png differ diff --git a/Models/Catsuit/ArmRightUp.png b/Models/Catsuit/ArmRightUp.png new file mode 100644 index 000000000..b03d57e21 Binary files /dev/null and b/Models/Catsuit/ArmRightUp.png differ diff --git a/Models/Catsuit/ArmRightWristtie.png b/Models/Catsuit/ArmRightWristtie.png new file mode 100644 index 000000000..c5833adb0 Binary files /dev/null and b/Models/Catsuit/ArmRightWristtie.png differ diff --git a/Models/Catsuit/ArmRightYoked.png b/Models/Catsuit/ArmRightYoked.png new file mode 100644 index 000000000..2fc74d862 Binary files /dev/null and b/Models/Catsuit/ArmRightYoked.png differ diff --git a/Models/Catsuit/ButtHogtie.png b/Models/Catsuit/ButtHogtie.png new file mode 100644 index 000000000..145c8a561 Binary files /dev/null and b/Models/Catsuit/ButtHogtie.png differ diff --git a/Models/Catsuit/ButtKneel.png b/Models/Catsuit/ButtKneel.png new file mode 100644 index 000000000..f76648619 Binary files /dev/null and b/Models/Catsuit/ButtKneel.png differ diff --git a/Models/Catsuit/Chest.png b/Models/Catsuit/Chest.png new file mode 100644 index 000000000..391628344 Binary files /dev/null and b/Models/Catsuit/Chest.png differ diff --git a/Models/Catsuit/ChestHogtie.png b/Models/Catsuit/ChestHogtie.png new file mode 100644 index 000000000..3a58d2fa8 Binary files /dev/null and b/Models/Catsuit/ChestHogtie.png differ diff --git a/Models/Catsuit/FootLeftClosed.png b/Models/Catsuit/FootLeftClosed.png new file mode 100644 index 000000000..f4ab972d4 Binary files /dev/null and b/Models/Catsuit/FootLeftClosed.png differ diff --git a/Models/Catsuit/FootLeftHogtie.png b/Models/Catsuit/FootLeftHogtie.png new file mode 100644 index 000000000..784a8a493 Binary files /dev/null and b/Models/Catsuit/FootLeftHogtie.png differ diff --git a/Models/Catsuit/FootLeftKneel.png b/Models/Catsuit/FootLeftKneel.png new file mode 100644 index 000000000..1c00e989c Binary files /dev/null and b/Models/Catsuit/FootLeftKneel.png differ diff --git a/Models/Catsuit/FootLeftKneelClosed.png b/Models/Catsuit/FootLeftKneelClosed.png new file mode 100644 index 000000000..cdf6ab595 Binary files /dev/null and b/Models/Catsuit/FootLeftKneelClosed.png differ diff --git a/Models/Catsuit/FootLeftSpread.png b/Models/Catsuit/FootLeftSpread.png new file mode 100644 index 000000000..df1aab30e Binary files /dev/null and b/Models/Catsuit/FootLeftSpread.png differ diff --git a/Models/Catsuit/FootRightClosed.png b/Models/Catsuit/FootRightClosed.png new file mode 100644 index 000000000..7209f2c06 Binary files /dev/null and b/Models/Catsuit/FootRightClosed.png differ diff --git a/Models/Catsuit/FootRightKneel.png b/Models/Catsuit/FootRightKneel.png new file mode 100644 index 000000000..3160a913f Binary files /dev/null and b/Models/Catsuit/FootRightKneel.png differ diff --git a/Models/Catsuit/FootRightSpread.png b/Models/Catsuit/FootRightSpread.png new file mode 100644 index 000000000..33e056c0c Binary files /dev/null and b/Models/Catsuit/FootRightSpread.png differ diff --git a/Models/Catsuit/ForeArmLeftCrossed.png b/Models/Catsuit/ForeArmLeftCrossed.png new file mode 100644 index 000000000..50698fc75 Binary files /dev/null and b/Models/Catsuit/ForeArmLeftCrossed.png differ diff --git a/Models/Catsuit/ForeArmLeftFront.png b/Models/Catsuit/ForeArmLeftFront.png new file mode 100644 index 000000000..147e6555f Binary files /dev/null and b/Models/Catsuit/ForeArmLeftFront.png differ diff --git a/Models/Catsuit/ForeArmRightCrossed.png b/Models/Catsuit/ForeArmRightCrossed.png new file mode 100644 index 000000000..0cc8d3a03 Binary files /dev/null and b/Models/Catsuit/ForeArmRightCrossed.png differ diff --git a/Models/Catsuit/ForeArmRightFront.png b/Models/Catsuit/ForeArmRightFront.png new file mode 100644 index 000000000..fa9ccc9a1 Binary files /dev/null and b/Models/Catsuit/ForeArmRightFront.png differ diff --git a/Models/Catsuit/HandLeftFree.png b/Models/Catsuit/HandLeftFree.png new file mode 100644 index 000000000..9bcb65922 Binary files /dev/null and b/Models/Catsuit/HandLeftFree.png differ diff --git a/Models/Catsuit/HandLeftFront.png b/Models/Catsuit/HandLeftFront.png new file mode 100644 index 000000000..86006a485 Binary files /dev/null and b/Models/Catsuit/HandLeftFront.png differ diff --git a/Models/Catsuit/HandLeftYoked.png b/Models/Catsuit/HandLeftYoked.png new file mode 100644 index 000000000..49cbc37cf Binary files /dev/null and b/Models/Catsuit/HandLeftYoked.png differ diff --git a/Models/Catsuit/HandRightBoxtie.png b/Models/Catsuit/HandRightBoxtie.png new file mode 100644 index 000000000..d2829e5b7 Binary files /dev/null and b/Models/Catsuit/HandRightBoxtie.png differ diff --git a/Models/Catsuit/HandRightFree.png b/Models/Catsuit/HandRightFree.png new file mode 100644 index 000000000..720cb300c Binary files /dev/null and b/Models/Catsuit/HandRightFree.png differ diff --git a/Models/Catsuit/HandRightFront.png b/Models/Catsuit/HandRightFront.png new file mode 100644 index 000000000..8670c9e36 Binary files /dev/null and b/Models/Catsuit/HandRightFront.png differ diff --git a/Models/Catsuit/HandRightYoked.png b/Models/Catsuit/HandRightYoked.png new file mode 100644 index 000000000..5319b557d Binary files /dev/null and b/Models/Catsuit/HandRightYoked.png differ diff --git a/Models/Catsuit/LegLeftClosed.png b/Models/Catsuit/LegLeftClosed.png new file mode 100644 index 000000000..daa70ac5a Binary files /dev/null and b/Models/Catsuit/LegLeftClosed.png differ diff --git a/Models/Catsuit/LegLeftHogtie.png b/Models/Catsuit/LegLeftHogtie.png new file mode 100644 index 000000000..4f4e6b329 Binary files /dev/null and b/Models/Catsuit/LegLeftHogtie.png differ diff --git a/Models/Catsuit/LegLeftKneel.png b/Models/Catsuit/LegLeftKneel.png new file mode 100644 index 000000000..ddf98062f Binary files /dev/null and b/Models/Catsuit/LegLeftKneel.png differ diff --git a/Models/Catsuit/LegLeftKneelClosed.png b/Models/Catsuit/LegLeftKneelClosed.png new file mode 100644 index 000000000..f0f4ef24a Binary files /dev/null and b/Models/Catsuit/LegLeftKneelClosed.png differ diff --git a/Models/Catsuit/LegLeftSpread.png b/Models/Catsuit/LegLeftSpread.png new file mode 100644 index 000000000..75c74c5ac Binary files /dev/null and b/Models/Catsuit/LegLeftSpread.png differ diff --git a/Models/Catsuit/LegRightClosed.png b/Models/Catsuit/LegRightClosed.png new file mode 100644 index 000000000..4e21827e3 Binary files /dev/null and b/Models/Catsuit/LegRightClosed.png differ diff --git a/Models/Catsuit/LegRightHogtie.png b/Models/Catsuit/LegRightHogtie.png new file mode 100644 index 000000000..3b171f639 Binary files /dev/null and b/Models/Catsuit/LegRightHogtie.png differ diff --git a/Models/Catsuit/LegRightKneel.png b/Models/Catsuit/LegRightKneel.png new file mode 100644 index 000000000..31463d1f0 Binary files /dev/null and b/Models/Catsuit/LegRightKneel.png differ diff --git a/Models/Catsuit/LegRightKneelClosed.png b/Models/Catsuit/LegRightKneelClosed.png new file mode 100644 index 000000000..f7b3d0889 Binary files /dev/null and b/Models/Catsuit/LegRightKneelClosed.png differ diff --git a/Models/Catsuit/LegRightSpread.png b/Models/Catsuit/LegRightSpread.png new file mode 100644 index 000000000..cbc67fc66 Binary files /dev/null and b/Models/Catsuit/LegRightSpread.png differ diff --git a/Models/Catsuit/ShoulderLeftUp.png b/Models/Catsuit/ShoulderLeftUp.png new file mode 100644 index 000000000..6644a84ef Binary files /dev/null and b/Models/Catsuit/ShoulderLeftUp.png differ diff --git a/Models/Catsuit/ShoulderRightUp.png b/Models/Catsuit/ShoulderRightUp.png new file mode 100644 index 000000000..36212b771 Binary files /dev/null and b/Models/Catsuit/ShoulderRightUp.png differ diff --git a/Models/Catsuit/SleevelessTop.png b/Models/Catsuit/SleevelessTop.png new file mode 100644 index 000000000..4839035d5 Binary files /dev/null and b/Models/Catsuit/SleevelessTop.png differ diff --git a/Models/Catsuit/SleevelessTopChest.png b/Models/Catsuit/SleevelessTopChest.png new file mode 100644 index 000000000..ae4abad23 Binary files /dev/null and b/Models/Catsuit/SleevelessTopChest.png differ diff --git a/Models/Catsuit/SleevelessTopV.png b/Models/Catsuit/SleevelessTopV.png new file mode 100644 index 000000000..bc0501684 Binary files /dev/null and b/Models/Catsuit/SleevelessTopV.png differ diff --git a/Models/Catsuit/SleevelessTopVChest.png b/Models/Catsuit/SleevelessTopVChest.png new file mode 100644 index 000000000..486e8b507 Binary files /dev/null and b/Models/Catsuit/SleevelessTopVChest.png differ diff --git a/Models/Catsuit/SleevelessTorsoUpper.png b/Models/Catsuit/SleevelessTorsoUpper.png new file mode 100644 index 000000000..299bc79b3 Binary files /dev/null and b/Models/Catsuit/SleevelessTorsoUpper.png differ diff --git a/Models/Catsuit/SleevelessTorsoUpperHogtie.png b/Models/Catsuit/SleevelessTorsoUpperHogtie.png new file mode 100644 index 000000000..583a5d0d7 Binary files /dev/null and b/Models/Catsuit/SleevelessTorsoUpperHogtie.png differ diff --git a/Models/Catsuit/TorsoBand.png b/Models/Catsuit/TorsoBand.png new file mode 100644 index 000000000..17dded2bd Binary files /dev/null and b/Models/Catsuit/TorsoBand.png differ diff --git a/Models/Catsuit/TorsoLower.png b/Models/Catsuit/TorsoLower.png new file mode 100644 index 000000000..f4b0bf869 Binary files /dev/null and b/Models/Catsuit/TorsoLower.png differ diff --git a/Models/Catsuit/TorsoLowerClosed.png b/Models/Catsuit/TorsoLowerClosed.png new file mode 100644 index 000000000..0f865727f Binary files /dev/null and b/Models/Catsuit/TorsoLowerClosed.png differ diff --git a/Models/Catsuit/TorsoLowerHogtie.png b/Models/Catsuit/TorsoLowerHogtie.png new file mode 100644 index 000000000..6e0b54773 Binary files /dev/null and b/Models/Catsuit/TorsoLowerHogtie.png differ diff --git a/Models/Catsuit/TorsoLowerLeotard.png b/Models/Catsuit/TorsoLowerLeotard.png new file mode 100644 index 000000000..acb13f838 Binary files /dev/null and b/Models/Catsuit/TorsoLowerLeotard.png differ diff --git a/Models/Catsuit/TorsoLowerLowRise.png b/Models/Catsuit/TorsoLowerLowRise.png new file mode 100644 index 000000000..bfa495d3b Binary files /dev/null and b/Models/Catsuit/TorsoLowerLowRise.png differ diff --git a/Models/Catsuit/TorsoLowerLowRiseClosed.png b/Models/Catsuit/TorsoLowerLowRiseClosed.png new file mode 100644 index 000000000..b07228da1 Binary files /dev/null and b/Models/Catsuit/TorsoLowerLowRiseClosed.png differ diff --git a/Models/Catsuit/TorsoLowerLowRiseSpread.png b/Models/Catsuit/TorsoLowerLowRiseSpread.png new file mode 100644 index 000000000..496b90dd5 Binary files /dev/null and b/Models/Catsuit/TorsoLowerLowRiseSpread.png differ diff --git a/Models/Catsuit/TorsoLowerPanties.png b/Models/Catsuit/TorsoLowerPanties.png new file mode 100644 index 000000000..907564d9c Binary files /dev/null and b/Models/Catsuit/TorsoLowerPanties.png differ diff --git a/Models/Catsuit/TorsoLowerSpread.png b/Models/Catsuit/TorsoLowerSpread.png new file mode 100644 index 000000000..2490ee9f6 Binary files /dev/null and b/Models/Catsuit/TorsoLowerSpread.png differ diff --git a/Models/Catsuit/TorsoUpper.png b/Models/Catsuit/TorsoUpper.png new file mode 100644 index 000000000..86e97c847 Binary files /dev/null and b/Models/Catsuit/TorsoUpper.png differ diff --git a/Models/Catsuit/TorsoUpperCrop.png b/Models/Catsuit/TorsoUpperCrop.png new file mode 100644 index 000000000..ddb362063 Binary files /dev/null and b/Models/Catsuit/TorsoUpperCrop.png differ diff --git a/Models/Catsuit/TorsoUpperHogtie.png b/Models/Catsuit/TorsoUpperHogtie.png new file mode 100644 index 000000000..dd156ed58 Binary files /dev/null and b/Models/Catsuit/TorsoUpperHogtie.png differ diff --git a/Models/Chastity/Belt.png b/Models/Chastity/Belt.png new file mode 100644 index 000000000..4933bc78a Binary files /dev/null and b/Models/Chastity/Belt.png differ diff --git a/Models/Chastity/BeltLining.png b/Models/Chastity/BeltLining.png new file mode 100644 index 000000000..24020d25f Binary files /dev/null and b/Models/Chastity/BeltLining.png differ diff --git a/Models/Chastity/BeltLock.png b/Models/Chastity/BeltLock.png new file mode 100644 index 000000000..2cb090685 Binary files /dev/null and b/Models/Chastity/BeltLock.png differ diff --git a/Models/Chastity/BeltStrap.png b/Models/Chastity/BeltStrap.png new file mode 100644 index 000000000..216c47eb6 Binary files /dev/null and b/Models/Chastity/BeltStrap.png differ diff --git a/Models/Chastity/BeltStrapLining.png b/Models/Chastity/BeltStrapLining.png new file mode 100644 index 000000000..16addb46b Binary files /dev/null and b/Models/Chastity/BeltStrapLining.png differ diff --git a/Models/Chastity/BraChain.png b/Models/Chastity/BraChain.png new file mode 100644 index 000000000..48e8e993b Binary files /dev/null and b/Models/Chastity/BraChain.png differ diff --git a/Models/Chastity/BraCups.png b/Models/Chastity/BraCups.png new file mode 100644 index 000000000..d67b1b6d1 Binary files /dev/null and b/Models/Chastity/BraCups.png differ diff --git a/Models/Chastity/BraCyber.png b/Models/Chastity/BraCyber.png new file mode 100644 index 000000000..1eed42e02 Binary files /dev/null and b/Models/Chastity/BraCyber.png differ diff --git a/Models/Chastity/BraCyberDisplay.png b/Models/Chastity/BraCyberDisplay.png new file mode 100644 index 000000000..4654c45bd Binary files /dev/null and b/Models/Chastity/BraCyberDisplay.png differ diff --git a/Models/Chastity/BraCyberLining.png b/Models/Chastity/BraCyberLining.png new file mode 100644 index 000000000..57c10bdd4 Binary files /dev/null and b/Models/Chastity/BraCyberLining.png differ diff --git a/Models/Chastity/BraCyberLock.png b/Models/Chastity/BraCyberLock.png new file mode 100644 index 000000000..6b5901947 Binary files /dev/null and b/Models/Chastity/BraCyberLock.png differ diff --git a/Models/Chastity/BraLining.png b/Models/Chastity/BraLining.png new file mode 100644 index 000000000..04492636e Binary files /dev/null and b/Models/Chastity/BraLining.png differ diff --git a/Models/Chastity/BraLock.png b/Models/Chastity/BraLock.png new file mode 100644 index 000000000..099bb4ae1 Binary files /dev/null and b/Models/Chastity/BraLock.png differ diff --git a/Models/Chastity/BraProto.png b/Models/Chastity/BraProto.png new file mode 100644 index 000000000..a56383339 Binary files /dev/null and b/Models/Chastity/BraProto.png differ diff --git a/Models/Chastity/BraProtoCups.png b/Models/Chastity/BraProtoCups.png new file mode 100644 index 000000000..40dd8559e Binary files /dev/null and b/Models/Chastity/BraProtoCups.png differ diff --git a/Models/Chastity/BraProtoDisplay.png b/Models/Chastity/BraProtoDisplay.png new file mode 100644 index 000000000..b311c37e7 Binary files /dev/null and b/Models/Chastity/BraProtoDisplay.png differ diff --git a/Models/Chastity/BraProtoLining.png b/Models/Chastity/BraProtoLining.png new file mode 100644 index 000000000..576f399bf Binary files /dev/null and b/Models/Chastity/BraProtoLining.png differ diff --git a/Models/Chastity/BraProtoLiningMid.png b/Models/Chastity/BraProtoLiningMid.png new file mode 100644 index 000000000..682471ba0 Binary files /dev/null and b/Models/Chastity/BraProtoLiningMid.png differ diff --git a/Models/Chastity/BraProtoLiningMidRim.png b/Models/Chastity/BraProtoLiningMidRim.png new file mode 100644 index 000000000..3fa8c9a67 Binary files /dev/null and b/Models/Chastity/BraProtoLiningMidRim.png differ diff --git a/Models/Chastity/BraProtoLiningMidZip.png b/Models/Chastity/BraProtoLiningMidZip.png new file mode 100644 index 000000000..017b861a3 Binary files /dev/null and b/Models/Chastity/BraProtoLiningMidZip.png differ diff --git a/Models/Chastity/BraProtoLiningMidZipRim.png b/Models/Chastity/BraProtoLiningMidZipRim.png new file mode 100644 index 000000000..a746acc01 Binary files /dev/null and b/Models/Chastity/BraProtoLiningMidZipRim.png differ diff --git a/Models/Chastity/BraProtoLiningRim.png b/Models/Chastity/BraProtoLiningRim.png new file mode 100644 index 000000000..a5681ea52 Binary files /dev/null and b/Models/Chastity/BraProtoLiningRim.png differ diff --git a/Models/Chastity/BraProtoLiningZip.png b/Models/Chastity/BraProtoLiningZip.png new file mode 100644 index 000000000..f69b647bc Binary files /dev/null and b/Models/Chastity/BraProtoLiningZip.png differ diff --git a/Models/Chastity/BraProtoLiningZipRim.png b/Models/Chastity/BraProtoLiningZipRim.png new file mode 100644 index 000000000..3481e15c2 Binary files /dev/null and b/Models/Chastity/BraProtoLiningZipRim.png differ diff --git a/Models/Chastity/BraProtoLock.png b/Models/Chastity/BraProtoLock.png new file mode 100644 index 000000000..8f08f8904 Binary files /dev/null and b/Models/Chastity/BraProtoLock.png differ diff --git a/Models/Chastity/Cyber.png b/Models/Chastity/Cyber.png new file mode 100644 index 000000000..68a6dc931 Binary files /dev/null and b/Models/Chastity/Cyber.png differ diff --git a/Models/Chastity/CyberDisplay.png b/Models/Chastity/CyberDisplay.png new file mode 100644 index 000000000..286c9e083 Binary files /dev/null and b/Models/Chastity/CyberDisplay.png differ diff --git a/Models/Chastity/CyberLining.png b/Models/Chastity/CyberLining.png new file mode 100644 index 000000000..fbf9cdece Binary files /dev/null and b/Models/Chastity/CyberLining.png differ diff --git a/Models/Chastity/CyberLock.png b/Models/Chastity/CyberLock.png new file mode 100644 index 000000000..48f2410dd Binary files /dev/null and b/Models/Chastity/CyberLock.png differ diff --git a/Models/Chastity/CyberPanties.png b/Models/Chastity/CyberPanties.png new file mode 100644 index 000000000..524391486 Binary files /dev/null and b/Models/Chastity/CyberPanties.png differ diff --git a/Models/Chastity/CyberPantiesClosed.png b/Models/Chastity/CyberPantiesClosed.png new file mode 100644 index 000000000..3b07190e3 Binary files /dev/null and b/Models/Chastity/CyberPantiesClosed.png differ diff --git a/Models/Chastity/CyberPantiesLining.png b/Models/Chastity/CyberPantiesLining.png new file mode 100644 index 000000000..395eefbb5 Binary files /dev/null and b/Models/Chastity/CyberPantiesLining.png differ diff --git a/Models/Chastity/CyberPantiesLiningClosed.png b/Models/Chastity/CyberPantiesLiningClosed.png new file mode 100644 index 000000000..13256cbb3 Binary files /dev/null and b/Models/Chastity/CyberPantiesLiningClosed.png differ diff --git a/Models/Chastity/CyberPlug.png b/Models/Chastity/CyberPlug.png new file mode 100644 index 000000000..9932d84da Binary files /dev/null and b/Models/Chastity/CyberPlug.png differ diff --git a/Models/Chastity/Proto.png b/Models/Chastity/Proto.png new file mode 100644 index 000000000..99f1c7600 Binary files /dev/null and b/Models/Chastity/Proto.png differ diff --git a/Models/Chastity/ProtoDisplay.png b/Models/Chastity/ProtoDisplay.png new file mode 100644 index 000000000..3ba8cb9a5 Binary files /dev/null and b/Models/Chastity/ProtoDisplay.png differ diff --git a/Models/Chastity/ProtoLining.png b/Models/Chastity/ProtoLining.png new file mode 100644 index 000000000..3501a7887 Binary files /dev/null and b/Models/Chastity/ProtoLining.png differ diff --git a/Models/Chastity/ProtoLock.png b/Models/Chastity/ProtoLock.png new file mode 100644 index 000000000..0ba296eb5 Binary files /dev/null and b/Models/Chastity/ProtoLock.png differ diff --git a/Models/Chastity/ProtoPlug.png b/Models/Chastity/ProtoPlug.png new file mode 100644 index 000000000..db00aa4f4 Binary files /dev/null and b/Models/Chastity/ProtoPlug.png differ diff --git a/Models/China/Bra.png b/Models/China/Bra.png new file mode 100644 index 000000000..e4c83aa93 Binary files /dev/null and b/Models/China/Bra.png differ diff --git a/Models/China/Dress.png b/Models/China/Dress.png new file mode 100644 index 000000000..c1c948d20 Binary files /dev/null and b/Models/China/Dress.png differ diff --git a/Models/China/DressSkirt.png b/Models/China/DressSkirt.png new file mode 100644 index 000000000..eee954f2e Binary files /dev/null and b/Models/China/DressSkirt.png differ diff --git a/Models/China/DressSkirtClosed.png b/Models/China/DressSkirtClosed.png new file mode 100644 index 000000000..c5a0ef2a6 Binary files /dev/null and b/Models/China/DressSkirtClosed.png differ diff --git a/Models/China/DressSkirtClosedCrotchStrap.png b/Models/China/DressSkirtClosedCrotchStrap.png new file mode 100644 index 000000000..ef7fa982c Binary files /dev/null and b/Models/China/DressSkirtClosedCrotchStrap.png differ diff --git a/Models/China/DressSkirtCrotchStrap.png b/Models/China/DressSkirtCrotchStrap.png new file mode 100644 index 000000000..26efa135e Binary files /dev/null and b/Models/China/DressSkirtCrotchStrap.png differ diff --git a/Models/China/DressSkirtKneel.png b/Models/China/DressSkirtKneel.png new file mode 100644 index 000000000..4e7eac95c Binary files /dev/null and b/Models/China/DressSkirtKneel.png differ diff --git a/Models/China/DressSkirtKneelCrotchStrap.png b/Models/China/DressSkirtKneelCrotchStrap.png new file mode 100644 index 000000000..1a01aaf1e Binary files /dev/null and b/Models/China/DressSkirtKneelCrotchStrap.png differ diff --git a/Models/China/DressSkirtOverKneel.png b/Models/China/DressSkirtOverKneel.png new file mode 100644 index 000000000..da13b7496 Binary files /dev/null and b/Models/China/DressSkirtOverKneel.png differ diff --git a/Models/China/Highlights.png b/Models/China/Highlights.png new file mode 100644 index 000000000..7299e593e Binary files /dev/null and b/Models/China/Highlights.png differ diff --git a/Models/Collars/Choker.png b/Models/Collars/Choker.png new file mode 100644 index 000000000..f465be573 Binary files /dev/null and b/Models/Collars/Choker.png differ diff --git a/Models/Collars/DragonCollar.png b/Models/Collars/DragonCollar.png new file mode 100644 index 000000000..a53ed35c5 Binary files /dev/null and b/Models/Collars/DragonCollar.png differ diff --git a/Models/Collars/Future.png b/Models/Collars/Future.png new file mode 100644 index 000000000..96e843e17 Binary files /dev/null and b/Models/Collars/Future.png differ diff --git a/Models/Collars/FutureBand.png b/Models/Collars/FutureBand.png new file mode 100644 index 000000000..d1c06d275 Binary files /dev/null and b/Models/Collars/FutureBand.png differ diff --git a/Models/Collars/FutureDisplay.png b/Models/Collars/FutureDisplay.png new file mode 100644 index 000000000..3c3beee01 Binary files /dev/null and b/Models/Collars/FutureDisplay.png differ diff --git a/Models/Collars/FutureLock.png b/Models/Collars/FutureLock.png new file mode 100644 index 000000000..4d7bcbb2e Binary files /dev/null and b/Models/Collars/FutureLock.png differ diff --git a/Models/Collars/FutureRim.png b/Models/Collars/FutureRim.png new file mode 100644 index 000000000..2092de802 Binary files /dev/null and b/Models/Collars/FutureRim.png differ diff --git a/Models/Collars/Leash.png b/Models/Collars/Leash.png new file mode 100644 index 000000000..6ef66fba6 Binary files /dev/null and b/Models/Collars/Leash.png differ diff --git a/Models/Collars/NeckCorset.png b/Models/Collars/NeckCorset.png new file mode 100644 index 000000000..f63ad7055 Binary files /dev/null and b/Models/Collars/NeckCorset.png differ diff --git a/Models/Collars/NeckCorsetRim.png b/Models/Collars/NeckCorsetRim.png new file mode 100644 index 000000000..6a744a789 Binary files /dev/null and b/Models/Collars/NeckCorsetRim.png differ diff --git a/Models/Collars/Quake.png b/Models/Collars/Quake.png new file mode 100644 index 000000000..eb13cdd65 Binary files /dev/null and b/Models/Collars/Quake.png differ diff --git a/Models/Collars/QuakeHogtie.png b/Models/Collars/QuakeHogtie.png new file mode 100644 index 000000000..001054e37 Binary files /dev/null and b/Models/Collars/QuakeHogtie.png differ diff --git a/Models/Collars/Simple.png b/Models/Collars/Simple.png new file mode 100644 index 000000000..0a0c4456e Binary files /dev/null and b/Models/Collars/Simple.png differ diff --git a/Models/Collars/TrackingModule.pdn b/Models/Collars/TrackingModule.pdn new file mode 100644 index 000000000..36c7fbc9e Binary files /dev/null and b/Models/Collars/TrackingModule.pdn differ diff --git a/Models/Collars/TrackingModule.png b/Models/Collars/TrackingModule.png new file mode 100644 index 000000000..6898e5255 Binary files /dev/null and b/Models/Collars/TrackingModule.png differ diff --git a/Models/Collars/TrackingModuleDisplay.png b/Models/Collars/TrackingModuleDisplay.png new file mode 100644 index 000000000..cb9a6fd7f Binary files /dev/null and b/Models/Collars/TrackingModuleDisplay.png differ diff --git a/Models/Corsets/BuckleCorset.png b/Models/Corsets/BuckleCorset.png new file mode 100644 index 000000000..20aa9b2fc Binary files /dev/null and b/Models/Corsets/BuckleCorset.png differ diff --git a/Models/Corsets/BuckleCorsetBuckles.png b/Models/Corsets/BuckleCorsetBuckles.png new file mode 100644 index 000000000..ef7388032 Binary files /dev/null and b/Models/Corsets/BuckleCorsetBuckles.png differ diff --git a/Models/Corsets/BuckleCorsetHardware.png b/Models/Corsets/BuckleCorsetHardware.png new file mode 100644 index 000000000..1b70ff214 Binary files /dev/null and b/Models/Corsets/BuckleCorsetHardware.png differ diff --git a/Models/Corsets/ChestHeavyCorset.png b/Models/Corsets/ChestHeavyCorset.png new file mode 100644 index 000000000..7146dd95f Binary files /dev/null and b/Models/Corsets/ChestHeavyCorset.png differ diff --git a/Models/Corsets/CrossHeavyCorset.png b/Models/Corsets/CrossHeavyCorset.png new file mode 100644 index 000000000..42a6f88cd Binary files /dev/null and b/Models/Corsets/CrossHeavyCorset.png differ diff --git a/Models/Corsets/HeavyCorset.png b/Models/Corsets/HeavyCorset.png new file mode 100644 index 000000000..c2cc33ee0 Binary files /dev/null and b/Models/Corsets/HeavyCorset.png differ diff --git a/Models/Corsets/HeavyCorsetKneel.png b/Models/Corsets/HeavyCorsetKneel.png new file mode 100644 index 000000000..ba7bbfb86 Binary files /dev/null and b/Models/Corsets/HeavyCorsetKneel.png differ diff --git a/Models/Corsets/StrapsHeavyCorset.png b/Models/Corsets/StrapsHeavyCorset.png new file mode 100644 index 000000000..7b6a177d1 Binary files /dev/null and b/Models/Corsets/StrapsHeavyCorset.png differ diff --git a/Models/Crystal/EncaseOver.png b/Models/Crystal/EncaseOver.png new file mode 100644 index 000000000..263015f17 Binary files /dev/null and b/Models/Crystal/EncaseOver.png differ diff --git a/Models/Crystal/EncaseUnder.png b/Models/Crystal/EncaseUnder.png new file mode 100644 index 000000000..17c398744 Binary files /dev/null and b/Models/Crystal/EncaseUnder.png differ diff --git a/Models/CrystalCuffs/AnkleLeftClosed.png b/Models/CrystalCuffs/AnkleLeftClosed.png new file mode 100644 index 000000000..a198ac2c8 Binary files /dev/null and b/Models/CrystalCuffs/AnkleLeftClosed.png differ diff --git a/Models/CrystalCuffs/AnkleLeftKneel.png b/Models/CrystalCuffs/AnkleLeftKneel.png new file mode 100644 index 000000000..540d919b3 Binary files /dev/null and b/Models/CrystalCuffs/AnkleLeftKneel.png differ diff --git a/Models/CrystalCuffs/AnkleLeftKneelClosed.png b/Models/CrystalCuffs/AnkleLeftKneelClosed.png new file mode 100644 index 000000000..cc23292d3 Binary files /dev/null and b/Models/CrystalCuffs/AnkleLeftKneelClosed.png differ diff --git a/Models/CrystalCuffs/AnkleLeftSpread.png b/Models/CrystalCuffs/AnkleLeftSpread.png new file mode 100644 index 000000000..c435c6fa1 Binary files /dev/null and b/Models/CrystalCuffs/AnkleLeftSpread.png differ diff --git a/Models/CrystalCuffs/AnkleLinkSpread.png b/Models/CrystalCuffs/AnkleLinkSpread.png new file mode 100644 index 000000000..0f9008c53 Binary files /dev/null and b/Models/CrystalCuffs/AnkleLinkSpread.png differ diff --git a/Models/CrystalCuffs/AnkleRightClosed.png b/Models/CrystalCuffs/AnkleRightClosed.png new file mode 100644 index 000000000..662d5b868 Binary files /dev/null and b/Models/CrystalCuffs/AnkleRightClosed.png differ diff --git a/Models/CrystalCuffs/AnkleRightSpread.png b/Models/CrystalCuffs/AnkleRightSpread.png new file mode 100644 index 000000000..8bc209340 Binary files /dev/null and b/Models/CrystalCuffs/AnkleRightSpread.png differ diff --git a/Models/CrystalCuffs/Belt.png b/Models/CrystalCuffs/Belt.png new file mode 100644 index 000000000..c9817e861 Binary files /dev/null and b/Models/CrystalCuffs/Belt.png differ diff --git a/Models/CrystalCuffs/Collar.png b/Models/CrystalCuffs/Collar.png new file mode 100644 index 000000000..21373a2db Binary files /dev/null and b/Models/CrystalCuffs/Collar.png differ diff --git a/Models/CrystalCuffs/CollarHardware.png b/Models/CrystalCuffs/CollarHardware.png new file mode 100644 index 000000000..919e15597 Binary files /dev/null and b/Models/CrystalCuffs/CollarHardware.png differ diff --git a/Models/CrystalCuffs/ElbowLeftBoxtie.png b/Models/CrystalCuffs/ElbowLeftBoxtie.png new file mode 100644 index 000000000..57fb2de55 Binary files /dev/null and b/Models/CrystalCuffs/ElbowLeftBoxtie.png differ diff --git a/Models/CrystalCuffs/ElbowLeftFree.png b/Models/CrystalCuffs/ElbowLeftFree.png new file mode 100644 index 000000000..78a061344 Binary files /dev/null and b/Models/CrystalCuffs/ElbowLeftFree.png differ diff --git a/Models/CrystalCuffs/ElbowLeftFront.png b/Models/CrystalCuffs/ElbowLeftFront.png new file mode 100644 index 000000000..b389580e8 Binary files /dev/null and b/Models/CrystalCuffs/ElbowLeftFront.png differ diff --git a/Models/CrystalCuffs/ElbowLeftUp.png b/Models/CrystalCuffs/ElbowLeftUp.png new file mode 100644 index 000000000..a7853b451 Binary files /dev/null and b/Models/CrystalCuffs/ElbowLeftUp.png differ diff --git a/Models/CrystalCuffs/ElbowLeftWristtie.png b/Models/CrystalCuffs/ElbowLeftWristtie.png new file mode 100644 index 000000000..b103d8e46 Binary files /dev/null and b/Models/CrystalCuffs/ElbowLeftWristtie.png differ diff --git a/Models/CrystalCuffs/ElbowLeftYoked.png b/Models/CrystalCuffs/ElbowLeftYoked.png new file mode 100644 index 000000000..c6e4008d8 Binary files /dev/null and b/Models/CrystalCuffs/ElbowLeftYoked.png differ diff --git a/Models/CrystalCuffs/ElbowRightBoxtie.png b/Models/CrystalCuffs/ElbowRightBoxtie.png new file mode 100644 index 000000000..defdc9b75 Binary files /dev/null and b/Models/CrystalCuffs/ElbowRightBoxtie.png differ diff --git a/Models/CrystalCuffs/ElbowRightFront.png b/Models/CrystalCuffs/ElbowRightFront.png new file mode 100644 index 000000000..c6b1f1bf5 Binary files /dev/null and b/Models/CrystalCuffs/ElbowRightFront.png differ diff --git a/Models/CrystalCuffs/ElbowRightUp.png b/Models/CrystalCuffs/ElbowRightUp.png new file mode 100644 index 000000000..43849e399 Binary files /dev/null and b/Models/CrystalCuffs/ElbowRightUp.png differ diff --git a/Models/CrystalCuffs/ElbowRightWristtie.png b/Models/CrystalCuffs/ElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CrystalCuffs/ElbowRightWristtie.png differ diff --git a/Models/CrystalCuffs/ElbowRightYoked.png b/Models/CrystalCuffs/ElbowRightYoked.png new file mode 100644 index 000000000..b5c18287e Binary files /dev/null and b/Models/CrystalCuffs/ElbowRightYoked.png differ diff --git a/Models/CrystalCuffs/SteelCollar.png b/Models/CrystalCuffs/SteelCollar.png new file mode 100644 index 000000000..214bdd95e Binary files /dev/null and b/Models/CrystalCuffs/SteelCollar.png differ diff --git a/Models/CrystalCuffs/SteelCollarRunes.png b/Models/CrystalCuffs/SteelCollarRunes.png new file mode 100644 index 000000000..da19d8908 Binary files /dev/null and b/Models/CrystalCuffs/SteelCollarRunes.png differ diff --git a/Models/CrystalCuffs/ThighLeftClosed.png b/Models/CrystalCuffs/ThighLeftClosed.png new file mode 100644 index 000000000..4dcd0bd22 Binary files /dev/null and b/Models/CrystalCuffs/ThighLeftClosed.png differ diff --git a/Models/CrystalCuffs/ThighLeftKneel.png b/Models/CrystalCuffs/ThighLeftKneel.png new file mode 100644 index 000000000..15174746c Binary files /dev/null and b/Models/CrystalCuffs/ThighLeftKneel.png differ diff --git a/Models/CrystalCuffs/ThighLeftKneelClosed.png b/Models/CrystalCuffs/ThighLeftKneelClosed.png new file mode 100644 index 000000000..530fdf238 Binary files /dev/null and b/Models/CrystalCuffs/ThighLeftKneelClosed.png differ diff --git a/Models/CrystalCuffs/ThighLeftSpread.png b/Models/CrystalCuffs/ThighLeftSpread.png new file mode 100644 index 000000000..d493a82da Binary files /dev/null and b/Models/CrystalCuffs/ThighLeftSpread.png differ diff --git a/Models/CrystalCuffs/ThighLinkSpread.png b/Models/CrystalCuffs/ThighLinkSpread.png new file mode 100644 index 000000000..2e0833887 Binary files /dev/null and b/Models/CrystalCuffs/ThighLinkSpread.png differ diff --git a/Models/CrystalCuffs/ThighRightClosed.png b/Models/CrystalCuffs/ThighRightClosed.png new file mode 100644 index 000000000..a2db70e58 Binary files /dev/null and b/Models/CrystalCuffs/ThighRightClosed.png differ diff --git a/Models/CrystalCuffs/ThighRightKneel.png b/Models/CrystalCuffs/ThighRightKneel.png new file mode 100644 index 000000000..8d0808654 Binary files /dev/null and b/Models/CrystalCuffs/ThighRightKneel.png differ diff --git a/Models/CrystalCuffs/ThighRightKneelClosed.png b/Models/CrystalCuffs/ThighRightKneelClosed.png new file mode 100644 index 000000000..8d0808654 Binary files /dev/null and b/Models/CrystalCuffs/ThighRightKneelClosed.png differ diff --git a/Models/CrystalCuffs/ThighRightSpread.png b/Models/CrystalCuffs/ThighRightSpread.png new file mode 100644 index 000000000..5bf324232 Binary files /dev/null and b/Models/CrystalCuffs/ThighRightSpread.png differ diff --git a/Models/CrystalCuffs/WristLeftFree.png b/Models/CrystalCuffs/WristLeftFree.png new file mode 100644 index 000000000..7e7bb1423 Binary files /dev/null and b/Models/CrystalCuffs/WristLeftFree.png differ diff --git a/Models/CrystalCuffs/WristLeftFront.png b/Models/CrystalCuffs/WristLeftFront.png new file mode 100644 index 000000000..f20bdf56f Binary files /dev/null and b/Models/CrystalCuffs/WristLeftFront.png differ diff --git a/Models/CrystalCuffs/WristLeftYoked.png b/Models/CrystalCuffs/WristLeftYoked.png new file mode 100644 index 000000000..6d3df7539 Binary files /dev/null and b/Models/CrystalCuffs/WristLeftYoked.png differ diff --git a/Models/CrystalCuffs/WristRightCrossed.png b/Models/CrystalCuffs/WristRightCrossed.png new file mode 100644 index 000000000..512ee438b Binary files /dev/null and b/Models/CrystalCuffs/WristRightCrossed.png differ diff --git a/Models/CrystalCuffs/WristRightFree.png b/Models/CrystalCuffs/WristRightFree.png new file mode 100644 index 000000000..384a1e22b Binary files /dev/null and b/Models/CrystalCuffs/WristRightFree.png differ diff --git a/Models/CrystalCuffs/WristRightFront.png b/Models/CrystalCuffs/WristRightFront.png new file mode 100644 index 000000000..b2e041fa0 Binary files /dev/null and b/Models/CrystalCuffs/WristRightFront.png differ diff --git a/Models/CrystalCuffs/WristRightYoked.png b/Models/CrystalCuffs/WristRightYoked.png new file mode 100644 index 000000000..37fdf3710 Binary files /dev/null and b/Models/CrystalCuffs/WristRightYoked.png differ diff --git a/Models/Cuffs/AnkleLeftClosed.png b/Models/Cuffs/AnkleLeftClosed.png new file mode 100644 index 000000000..66c0ff435 Binary files /dev/null and b/Models/Cuffs/AnkleLeftClosed.png differ diff --git a/Models/Cuffs/AnkleLeftKneel.png b/Models/Cuffs/AnkleLeftKneel.png new file mode 100644 index 000000000..72136b395 Binary files /dev/null and b/Models/Cuffs/AnkleLeftKneel.png differ diff --git a/Models/Cuffs/AnkleLeftKneelClosed.png b/Models/Cuffs/AnkleLeftKneelClosed.png new file mode 100644 index 000000000..c18b9db7f Binary files /dev/null and b/Models/Cuffs/AnkleLeftKneelClosed.png differ diff --git a/Models/Cuffs/AnkleLeftSpread.png b/Models/Cuffs/AnkleLeftSpread.png new file mode 100644 index 000000000..700657633 Binary files /dev/null and b/Models/Cuffs/AnkleLeftSpread.png differ diff --git a/Models/Cuffs/AnkleLinkSpread.png b/Models/Cuffs/AnkleLinkSpread.png new file mode 100644 index 000000000..098a9e07b Binary files /dev/null and b/Models/Cuffs/AnkleLinkSpread.png differ diff --git a/Models/Cuffs/AnkleRightClosed.png b/Models/Cuffs/AnkleRightClosed.png new file mode 100644 index 000000000..ec45118a6 Binary files /dev/null and b/Models/Cuffs/AnkleRightClosed.png differ diff --git a/Models/Cuffs/AnkleRightSpread.png b/Models/Cuffs/AnkleRightSpread.png new file mode 100644 index 000000000..26091bbac Binary files /dev/null and b/Models/Cuffs/AnkleRightSpread.png differ diff --git a/Models/Cuffs/Belt.png b/Models/Cuffs/Belt.png new file mode 100644 index 000000000..ac17589e1 Binary files /dev/null and b/Models/Cuffs/Belt.png differ diff --git a/Models/Cuffs/Collar.png b/Models/Cuffs/Collar.png new file mode 100644 index 000000000..180a451ee Binary files /dev/null and b/Models/Cuffs/Collar.png differ diff --git a/Models/Cuffs/CollarHardware.png b/Models/Cuffs/CollarHardware.png new file mode 100644 index 000000000..919e15597 Binary files /dev/null and b/Models/Cuffs/CollarHardware.png differ diff --git a/Models/Cuffs/ElbowLeftBoxtie.png b/Models/Cuffs/ElbowLeftBoxtie.png new file mode 100644 index 000000000..fd059c199 Binary files /dev/null and b/Models/Cuffs/ElbowLeftBoxtie.png differ diff --git a/Models/Cuffs/ElbowLeftFree.png b/Models/Cuffs/ElbowLeftFree.png new file mode 100644 index 000000000..68e4a028a Binary files /dev/null and b/Models/Cuffs/ElbowLeftFree.png differ diff --git a/Models/Cuffs/ElbowLeftFront.png b/Models/Cuffs/ElbowLeftFront.png new file mode 100644 index 000000000..752ddbe71 Binary files /dev/null and b/Models/Cuffs/ElbowLeftFront.png differ diff --git a/Models/Cuffs/ElbowLeftUp.png b/Models/Cuffs/ElbowLeftUp.png new file mode 100644 index 000000000..69d0a0abb Binary files /dev/null and b/Models/Cuffs/ElbowLeftUp.png differ diff --git a/Models/Cuffs/ElbowLeftWristtie.png b/Models/Cuffs/ElbowLeftWristtie.png new file mode 100644 index 000000000..2f6610207 Binary files /dev/null and b/Models/Cuffs/ElbowLeftWristtie.png differ diff --git a/Models/Cuffs/ElbowLeftYoked.png b/Models/Cuffs/ElbowLeftYoked.png new file mode 100644 index 000000000..32f1b9ea5 Binary files /dev/null and b/Models/Cuffs/ElbowLeftYoked.png differ diff --git a/Models/Cuffs/ElbowRightBoxtie.png b/Models/Cuffs/ElbowRightBoxtie.png new file mode 100644 index 000000000..782e1d0ad Binary files /dev/null and b/Models/Cuffs/ElbowRightBoxtie.png differ diff --git a/Models/Cuffs/ElbowRightFront.png b/Models/Cuffs/ElbowRightFront.png new file mode 100644 index 000000000..a3ef50a28 Binary files /dev/null and b/Models/Cuffs/ElbowRightFront.png differ diff --git a/Models/Cuffs/ElbowRightUp.png b/Models/Cuffs/ElbowRightUp.png new file mode 100644 index 000000000..a9f215d6f Binary files /dev/null and b/Models/Cuffs/ElbowRightUp.png differ diff --git a/Models/Cuffs/ElbowRightWristtie.png b/Models/Cuffs/ElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Cuffs/ElbowRightWristtie.png differ diff --git a/Models/Cuffs/ElbowRightYoked.png b/Models/Cuffs/ElbowRightYoked.png new file mode 100644 index 000000000..e1d6469a3 Binary files /dev/null and b/Models/Cuffs/ElbowRightYoked.png differ diff --git a/Models/Cuffs/SteelCollar.png b/Models/Cuffs/SteelCollar.png new file mode 100644 index 000000000..214bdd95e Binary files /dev/null and b/Models/Cuffs/SteelCollar.png differ diff --git a/Models/Cuffs/SteelCollarRunes.png b/Models/Cuffs/SteelCollarRunes.png new file mode 100644 index 000000000..da19d8908 Binary files /dev/null and b/Models/Cuffs/SteelCollarRunes.png differ diff --git a/Models/Cuffs/ThighLeftClosed.png b/Models/Cuffs/ThighLeftClosed.png new file mode 100644 index 000000000..b7310789c Binary files /dev/null and b/Models/Cuffs/ThighLeftClosed.png differ diff --git a/Models/Cuffs/ThighLeftKneel.png b/Models/Cuffs/ThighLeftKneel.png new file mode 100644 index 000000000..cca5ec40d Binary files /dev/null and b/Models/Cuffs/ThighLeftKneel.png differ diff --git a/Models/Cuffs/ThighLeftKneelClosed.png b/Models/Cuffs/ThighLeftKneelClosed.png new file mode 100644 index 000000000..19f2cd429 Binary files /dev/null and b/Models/Cuffs/ThighLeftKneelClosed.png differ diff --git a/Models/Cuffs/ThighLeftSpread.png b/Models/Cuffs/ThighLeftSpread.png new file mode 100644 index 000000000..f06fa381c Binary files /dev/null and b/Models/Cuffs/ThighLeftSpread.png differ diff --git a/Models/Cuffs/ThighLinkSpread.png b/Models/Cuffs/ThighLinkSpread.png new file mode 100644 index 000000000..c3258b624 Binary files /dev/null and b/Models/Cuffs/ThighLinkSpread.png differ diff --git a/Models/Cuffs/ThighLinkSpreadHigh.png b/Models/Cuffs/ThighLinkSpreadHigh.png new file mode 100644 index 000000000..0d1a538d5 Binary files /dev/null and b/Models/Cuffs/ThighLinkSpreadHigh.png differ diff --git a/Models/Cuffs/ThighRightClosed.png b/Models/Cuffs/ThighRightClosed.png new file mode 100644 index 000000000..f75faa090 Binary files /dev/null and b/Models/Cuffs/ThighRightClosed.png differ diff --git a/Models/Cuffs/ThighRightKneel.png b/Models/Cuffs/ThighRightKneel.png new file mode 100644 index 000000000..887dbb486 Binary files /dev/null and b/Models/Cuffs/ThighRightKneel.png differ diff --git a/Models/Cuffs/ThighRightKneelClosed.png b/Models/Cuffs/ThighRightKneelClosed.png new file mode 100644 index 000000000..887dbb486 Binary files /dev/null and b/Models/Cuffs/ThighRightKneelClosed.png differ diff --git a/Models/Cuffs/ThighRightSpread.png b/Models/Cuffs/ThighRightSpread.png new file mode 100644 index 000000000..1fabfd8a2 Binary files /dev/null and b/Models/Cuffs/ThighRightSpread.png differ diff --git a/Models/Cuffs/WristLeftFree.png b/Models/Cuffs/WristLeftFree.png new file mode 100644 index 000000000..88c9f43ca Binary files /dev/null and b/Models/Cuffs/WristLeftFree.png differ diff --git a/Models/Cuffs/WristLeftFront.png b/Models/Cuffs/WristLeftFront.png new file mode 100644 index 000000000..ec515e609 Binary files /dev/null and b/Models/Cuffs/WristLeftFront.png differ diff --git a/Models/Cuffs/WristLeftYoked.png b/Models/Cuffs/WristLeftYoked.png new file mode 100644 index 000000000..3b3ea5cf7 Binary files /dev/null and b/Models/Cuffs/WristLeftYoked.png differ diff --git a/Models/Cuffs/WristRightCrossed.png b/Models/Cuffs/WristRightCrossed.png new file mode 100644 index 000000000..8440afdf7 Binary files /dev/null and b/Models/Cuffs/WristRightCrossed.png differ diff --git a/Models/Cuffs/WristRightFree.png b/Models/Cuffs/WristRightFree.png new file mode 100644 index 000000000..c9b3aad76 Binary files /dev/null and b/Models/Cuffs/WristRightFree.png differ diff --git a/Models/Cuffs/WristRightFront.png b/Models/Cuffs/WristRightFront.png new file mode 100644 index 000000000..0d681bbf2 Binary files /dev/null and b/Models/Cuffs/WristRightFront.png differ diff --git a/Models/Cuffs/WristRightYoked.png b/Models/Cuffs/WristRightYoked.png new file mode 100644 index 000000000..a377e7bb3 Binary files /dev/null and b/Models/Cuffs/WristRightYoked.png differ diff --git a/Models/CyberArms/CuffForeLongMittenLeftCrossed.png b/Models/CyberArms/CuffForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..494859aee Binary files /dev/null and b/Models/CyberArms/CuffForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/CuffForeLongMittenLeftFront.png b/Models/CyberArms/CuffForeLongMittenLeftFront.png new file mode 100644 index 000000000..23a60446a Binary files /dev/null and b/Models/CyberArms/CuffForeLongMittenLeftFront.png differ diff --git a/Models/CyberArms/CuffForeLongMittenRightCrossed.png b/Models/CyberArms/CuffForeLongMittenRightCrossed.png new file mode 100644 index 000000000..870abce60 Binary files /dev/null and b/Models/CyberArms/CuffForeLongMittenRightCrossed.png differ diff --git a/Models/CyberArms/CuffForeLongMittenRightFront.png b/Models/CyberArms/CuffForeLongMittenRightFront.png new file mode 100644 index 000000000..1bcd91016 Binary files /dev/null and b/Models/CyberArms/CuffForeLongMittenRightFront.png differ diff --git a/Models/CyberArms/CuffLongMittenLeftBoxtie.png b/Models/CyberArms/CuffLongMittenLeftBoxtie.png new file mode 100644 index 000000000..31e8f550a Binary files /dev/null and b/Models/CyberArms/CuffLongMittenLeftBoxtie.png differ diff --git a/Models/CyberArms/CuffLongMittenLeftCrossed.png b/Models/CyberArms/CuffLongMittenLeftCrossed.png new file mode 100644 index 000000000..387d503d2 Binary files /dev/null and b/Models/CyberArms/CuffLongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/CuffLongMittenLeftFree.png b/Models/CyberArms/CuffLongMittenLeftFree.png new file mode 100644 index 000000000..0d3b1fe2f Binary files /dev/null and b/Models/CyberArms/CuffLongMittenLeftFree.png differ diff --git a/Models/CyberArms/CuffLongMittenLeftFront.png b/Models/CyberArms/CuffLongMittenLeftFront.png new file mode 100644 index 000000000..427fb896b Binary files /dev/null and b/Models/CyberArms/CuffLongMittenLeftFront.png differ diff --git a/Models/CyberArms/CuffLongMittenLeftUp.png b/Models/CyberArms/CuffLongMittenLeftUp.png new file mode 100644 index 000000000..00db4f54f Binary files /dev/null and b/Models/CyberArms/CuffLongMittenLeftUp.png differ diff --git a/Models/CyberArms/CuffLongMittenLeftWristtie.png b/Models/CyberArms/CuffLongMittenLeftWristtie.png new file mode 100644 index 000000000..88b27c305 Binary files /dev/null and b/Models/CyberArms/CuffLongMittenLeftWristtie.png differ diff --git a/Models/CyberArms/CuffLongMittenLeftYoked.png b/Models/CyberArms/CuffLongMittenLeftYoked.png new file mode 100644 index 000000000..da0329471 Binary files /dev/null and b/Models/CyberArms/CuffLongMittenLeftYoked.png differ diff --git a/Models/CyberArms/CuffLongMittenRightBoxtie.png b/Models/CyberArms/CuffLongMittenRightBoxtie.png new file mode 100644 index 000000000..6aebc520a Binary files /dev/null and b/Models/CyberArms/CuffLongMittenRightBoxtie.png differ diff --git a/Models/CyberArms/CuffLongMittenRightCrossed.png b/Models/CyberArms/CuffLongMittenRightCrossed.png new file mode 100644 index 000000000..7c528a7d1 Binary files /dev/null and b/Models/CyberArms/CuffLongMittenRightCrossed.png differ diff --git a/Models/CyberArms/CuffLongMittenRightFree.png b/Models/CyberArms/CuffLongMittenRightFree.png new file mode 100644 index 000000000..c1025fde0 Binary files /dev/null and b/Models/CyberArms/CuffLongMittenRightFree.png differ diff --git a/Models/CyberArms/CuffLongMittenRightFront.png b/Models/CyberArms/CuffLongMittenRightFront.png new file mode 100644 index 000000000..b6dd81790 Binary files /dev/null and b/Models/CyberArms/CuffLongMittenRightFront.png differ diff --git a/Models/CyberArms/CuffLongMittenRightUp.png b/Models/CyberArms/CuffLongMittenRightUp.png new file mode 100644 index 000000000..be19eb992 Binary files /dev/null and b/Models/CyberArms/CuffLongMittenRightUp.png differ diff --git a/Models/CyberArms/CuffLongMittenRightWristtie.png b/Models/CyberArms/CuffLongMittenRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberArms/CuffLongMittenRightWristtie.png differ diff --git a/Models/CyberArms/CuffLongMittenRightYoked.png b/Models/CyberArms/CuffLongMittenRightYoked.png new file mode 100644 index 000000000..dce3da1fe Binary files /dev/null and b/Models/CyberArms/CuffLongMittenRightYoked.png differ diff --git a/Models/CyberArms/DisplayForeLongMittenLeftCrossed.png b/Models/CyberArms/DisplayForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberArms/DisplayForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/DisplayForeLongMittenLeftFront.png b/Models/CyberArms/DisplayForeLongMittenLeftFront.png new file mode 100644 index 000000000..0a09fd0ae Binary files /dev/null and b/Models/CyberArms/DisplayForeLongMittenLeftFront.png differ diff --git a/Models/CyberArms/DisplayForeLongMittenRightCrossed.png b/Models/CyberArms/DisplayForeLongMittenRightCrossed.png new file mode 100644 index 000000000..ebd676384 Binary files /dev/null and b/Models/CyberArms/DisplayForeLongMittenRightCrossed.png differ diff --git a/Models/CyberArms/DisplayForeLongMittenRightFront.png b/Models/CyberArms/DisplayForeLongMittenRightFront.png new file mode 100644 index 000000000..4fd42bcf2 Binary files /dev/null and b/Models/CyberArms/DisplayForeLongMittenRightFront.png differ diff --git a/Models/CyberArms/DisplayLongMittenLeftBoxtie.png b/Models/CyberArms/DisplayLongMittenLeftBoxtie.png new file mode 100644 index 000000000..6d6d75519 Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenLeftBoxtie.png differ diff --git a/Models/CyberArms/DisplayLongMittenLeftCrossed.png b/Models/CyberArms/DisplayLongMittenLeftCrossed.png new file mode 100644 index 000000000..a6d481524 Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/DisplayLongMittenLeftFree.png b/Models/CyberArms/DisplayLongMittenLeftFree.png new file mode 100644 index 000000000..b801fd9c2 Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenLeftFree.png differ diff --git a/Models/CyberArms/DisplayLongMittenLeftFront.png b/Models/CyberArms/DisplayLongMittenLeftFront.png new file mode 100644 index 000000000..b42442c54 Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenLeftFront.png differ diff --git a/Models/CyberArms/DisplayLongMittenLeftUp.png b/Models/CyberArms/DisplayLongMittenLeftUp.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenLeftUp.png differ diff --git a/Models/CyberArms/DisplayLongMittenLeftWristtie.png b/Models/CyberArms/DisplayLongMittenLeftWristtie.png new file mode 100644 index 000000000..3466a13fd Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenLeftWristtie.png differ diff --git a/Models/CyberArms/DisplayLongMittenLeftYoked.png b/Models/CyberArms/DisplayLongMittenLeftYoked.png new file mode 100644 index 000000000..2eb05894e Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenLeftYoked.png differ diff --git a/Models/CyberArms/DisplayLongMittenRightBoxtie.png b/Models/CyberArms/DisplayLongMittenRightBoxtie.png new file mode 100644 index 000000000..9872232cf Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenRightBoxtie.png differ diff --git a/Models/CyberArms/DisplayLongMittenRightCrossed.png b/Models/CyberArms/DisplayLongMittenRightCrossed.png new file mode 100644 index 000000000..1f15ef235 Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenRightCrossed.png differ diff --git a/Models/CyberArms/DisplayLongMittenRightFree.png b/Models/CyberArms/DisplayLongMittenRightFree.png new file mode 100644 index 000000000..d8921da19 Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenRightFree.png differ diff --git a/Models/CyberArms/DisplayLongMittenRightFront.png b/Models/CyberArms/DisplayLongMittenRightFront.png new file mode 100644 index 000000000..6adff3a45 Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenRightFront.png differ diff --git a/Models/CyberArms/DisplayLongMittenRightUp.png b/Models/CyberArms/DisplayLongMittenRightUp.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenRightUp.png differ diff --git a/Models/CyberArms/DisplayLongMittenRightWristtie.png b/Models/CyberArms/DisplayLongMittenRightWristtie.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenRightWristtie.png differ diff --git a/Models/CyberArms/DisplayLongMittenRightYoked.png b/Models/CyberArms/DisplayLongMittenRightYoked.png new file mode 100644 index 000000000..db4743de7 Binary files /dev/null and b/Models/CyberArms/DisplayLongMittenRightYoked.png differ diff --git a/Models/CyberArms/ForeLongMittenLeftCrossed.png b/Models/CyberArms/ForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..119a3e192 Binary files /dev/null and b/Models/CyberArms/ForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/ForeLongMittenLeftFront.png b/Models/CyberArms/ForeLongMittenLeftFront.png new file mode 100644 index 000000000..7eabaafd2 Binary files /dev/null and b/Models/CyberArms/ForeLongMittenLeftFront.png differ diff --git a/Models/CyberArms/ForeLongMittenRightCrossed.png b/Models/CyberArms/ForeLongMittenRightCrossed.png new file mode 100644 index 000000000..ec4b6f4d0 Binary files /dev/null and b/Models/CyberArms/ForeLongMittenRightCrossed.png differ diff --git a/Models/CyberArms/ForeLongMittenRightFront.png b/Models/CyberArms/ForeLongMittenRightFront.png new file mode 100644 index 000000000..9d8f4d0f5 Binary files /dev/null and b/Models/CyberArms/ForeLongMittenRightFront.png differ diff --git a/Models/CyberArms/GlowForeLongMittenLeftCrossed.png b/Models/CyberArms/GlowForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..494859aee Binary files /dev/null and b/Models/CyberArms/GlowForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/GlowForeLongMittenLeftFront.png b/Models/CyberArms/GlowForeLongMittenLeftFront.png new file mode 100644 index 000000000..da461c0a3 Binary files /dev/null and b/Models/CyberArms/GlowForeLongMittenLeftFront.png differ diff --git a/Models/CyberArms/GlowForeLongMittenRightCrossed.png b/Models/CyberArms/GlowForeLongMittenRightCrossed.png new file mode 100644 index 000000000..280446ad1 Binary files /dev/null and b/Models/CyberArms/GlowForeLongMittenRightCrossed.png differ diff --git a/Models/CyberArms/GlowForeLongMittenRightFront.png b/Models/CyberArms/GlowForeLongMittenRightFront.png new file mode 100644 index 000000000..6d2d4b8e4 Binary files /dev/null and b/Models/CyberArms/GlowForeLongMittenRightFront.png differ diff --git a/Models/CyberArms/GlowLongMittenLeftBoxtie.png b/Models/CyberArms/GlowLongMittenLeftBoxtie.png new file mode 100644 index 000000000..5241cba96 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenLeftBoxtie.png differ diff --git a/Models/CyberArms/GlowLongMittenLeftCrossed.png b/Models/CyberArms/GlowLongMittenLeftCrossed.png new file mode 100644 index 000000000..03fdde0a8 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/GlowLongMittenLeftFree.png b/Models/CyberArms/GlowLongMittenLeftFree.png new file mode 100644 index 000000000..71b95eae3 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenLeftFree.png differ diff --git a/Models/CyberArms/GlowLongMittenLeftFront.png b/Models/CyberArms/GlowLongMittenLeftFront.png new file mode 100644 index 000000000..f07207b96 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenLeftFront.png differ diff --git a/Models/CyberArms/GlowLongMittenLeftUp.png b/Models/CyberArms/GlowLongMittenLeftUp.png new file mode 100644 index 000000000..9f23b9e1c Binary files /dev/null and b/Models/CyberArms/GlowLongMittenLeftUp.png differ diff --git a/Models/CyberArms/GlowLongMittenLeftWristtie.png b/Models/CyberArms/GlowLongMittenLeftWristtie.png new file mode 100644 index 000000000..e3ca2fca9 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenLeftWristtie.png differ diff --git a/Models/CyberArms/GlowLongMittenLeftYoked.png b/Models/CyberArms/GlowLongMittenLeftYoked.png new file mode 100644 index 000000000..10feb898e Binary files /dev/null and b/Models/CyberArms/GlowLongMittenLeftYoked.png differ diff --git a/Models/CyberArms/GlowLongMittenRightBoxtie.png b/Models/CyberArms/GlowLongMittenRightBoxtie.png new file mode 100644 index 000000000..7fa92adf0 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenRightBoxtie.png differ diff --git a/Models/CyberArms/GlowLongMittenRightCrossed.png b/Models/CyberArms/GlowLongMittenRightCrossed.png new file mode 100644 index 000000000..6fa97ee91 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenRightCrossed.png differ diff --git a/Models/CyberArms/GlowLongMittenRightFree.png b/Models/CyberArms/GlowLongMittenRightFree.png new file mode 100644 index 000000000..e1592eed9 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenRightFree.png differ diff --git a/Models/CyberArms/GlowLongMittenRightFront.png b/Models/CyberArms/GlowLongMittenRightFront.png new file mode 100644 index 000000000..c38965d49 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenRightFront.png differ diff --git a/Models/CyberArms/GlowLongMittenRightUp.png b/Models/CyberArms/GlowLongMittenRightUp.png new file mode 100644 index 000000000..782f04632 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenRightUp.png differ diff --git a/Models/CyberArms/GlowLongMittenRightWristtie.png b/Models/CyberArms/GlowLongMittenRightWristtie.png new file mode 100644 index 000000000..2488b9c99 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenRightWristtie.png differ diff --git a/Models/CyberArms/GlowLongMittenRightYoked.png b/Models/CyberArms/GlowLongMittenRightYoked.png new file mode 100644 index 000000000..68021f0c4 Binary files /dev/null and b/Models/CyberArms/GlowLongMittenRightYoked.png differ diff --git a/Models/CyberArms/LockForeLongMittenLeftCrossed.png b/Models/CyberArms/LockForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..494859aee Binary files /dev/null and b/Models/CyberArms/LockForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/LockForeLongMittenLeftFront.png b/Models/CyberArms/LockForeLongMittenLeftFront.png new file mode 100644 index 000000000..9a75ffd96 Binary files /dev/null and b/Models/CyberArms/LockForeLongMittenLeftFront.png differ diff --git a/Models/CyberArms/LockForeLongMittenRightCrossed.png b/Models/CyberArms/LockForeLongMittenRightCrossed.png new file mode 100644 index 000000000..64ae200c5 Binary files /dev/null and b/Models/CyberArms/LockForeLongMittenRightCrossed.png differ diff --git a/Models/CyberArms/LockForeLongMittenRightFront.png b/Models/CyberArms/LockForeLongMittenRightFront.png new file mode 100644 index 000000000..9d8ce7671 Binary files /dev/null and b/Models/CyberArms/LockForeLongMittenRightFront.png differ diff --git a/Models/CyberArms/LockLongMittenLeftBoxtie.png b/Models/CyberArms/LockLongMittenLeftBoxtie.png new file mode 100644 index 000000000..ee3bd6c6e Binary files /dev/null and b/Models/CyberArms/LockLongMittenLeftBoxtie.png differ diff --git a/Models/CyberArms/LockLongMittenLeftCrossed.png b/Models/CyberArms/LockLongMittenLeftCrossed.png new file mode 100644 index 000000000..e95ff3f9f Binary files /dev/null and b/Models/CyberArms/LockLongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/LockLongMittenLeftFree.png b/Models/CyberArms/LockLongMittenLeftFree.png new file mode 100644 index 000000000..2d34f639c Binary files /dev/null and b/Models/CyberArms/LockLongMittenLeftFree.png differ diff --git a/Models/CyberArms/LockLongMittenLeftFront.png b/Models/CyberArms/LockLongMittenLeftFront.png new file mode 100644 index 000000000..0b8cf2ccb Binary files /dev/null and b/Models/CyberArms/LockLongMittenLeftFront.png differ diff --git a/Models/CyberArms/LockLongMittenLeftUp.png b/Models/CyberArms/LockLongMittenLeftUp.png new file mode 100644 index 000000000..690f7f15c Binary files /dev/null and b/Models/CyberArms/LockLongMittenLeftUp.png differ diff --git a/Models/CyberArms/LockLongMittenLeftWristtie.png b/Models/CyberArms/LockLongMittenLeftWristtie.png new file mode 100644 index 000000000..e173424ba Binary files /dev/null and b/Models/CyberArms/LockLongMittenLeftWristtie.png differ diff --git a/Models/CyberArms/LockLongMittenLeftYoked.png b/Models/CyberArms/LockLongMittenLeftYoked.png new file mode 100644 index 000000000..2578cb65d Binary files /dev/null and b/Models/CyberArms/LockLongMittenLeftYoked.png differ diff --git a/Models/CyberArms/LockLongMittenRightBoxtie.png b/Models/CyberArms/LockLongMittenRightBoxtie.png new file mode 100644 index 000000000..fac752889 Binary files /dev/null and b/Models/CyberArms/LockLongMittenRightBoxtie.png differ diff --git a/Models/CyberArms/LockLongMittenRightCrossed.png b/Models/CyberArms/LockLongMittenRightCrossed.png new file mode 100644 index 000000000..1d829011a Binary files /dev/null and b/Models/CyberArms/LockLongMittenRightCrossed.png differ diff --git a/Models/CyberArms/LockLongMittenRightFree.png b/Models/CyberArms/LockLongMittenRightFree.png new file mode 100644 index 000000000..abe066330 Binary files /dev/null and b/Models/CyberArms/LockLongMittenRightFree.png differ diff --git a/Models/CyberArms/LockLongMittenRightFront.png b/Models/CyberArms/LockLongMittenRightFront.png new file mode 100644 index 000000000..525f02b4c Binary files /dev/null and b/Models/CyberArms/LockLongMittenRightFront.png differ diff --git a/Models/CyberArms/LockLongMittenRightUp.png b/Models/CyberArms/LockLongMittenRightUp.png new file mode 100644 index 000000000..690f7f15c Binary files /dev/null and b/Models/CyberArms/LockLongMittenRightUp.png differ diff --git a/Models/CyberArms/LockLongMittenRightWristtie.png b/Models/CyberArms/LockLongMittenRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberArms/LockLongMittenRightWristtie.png differ diff --git a/Models/CyberArms/LockLongMittenRightYoked.png b/Models/CyberArms/LockLongMittenRightYoked.png new file mode 100644 index 000000000..ebb0920d4 Binary files /dev/null and b/Models/CyberArms/LockLongMittenRightYoked.png differ diff --git a/Models/CyberArms/LongMittenLeftBoxtie.png b/Models/CyberArms/LongMittenLeftBoxtie.png new file mode 100644 index 000000000..393e27007 Binary files /dev/null and b/Models/CyberArms/LongMittenLeftBoxtie.png differ diff --git a/Models/CyberArms/LongMittenLeftCrossed.png b/Models/CyberArms/LongMittenLeftCrossed.png new file mode 100644 index 000000000..8ce58decf Binary files /dev/null and b/Models/CyberArms/LongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/LongMittenLeftFree.png b/Models/CyberArms/LongMittenLeftFree.png new file mode 100644 index 000000000..1e9cdf311 Binary files /dev/null and b/Models/CyberArms/LongMittenLeftFree.png differ diff --git a/Models/CyberArms/LongMittenLeftFront.png b/Models/CyberArms/LongMittenLeftFront.png new file mode 100644 index 000000000..0c724850b Binary files /dev/null and b/Models/CyberArms/LongMittenLeftFront.png differ diff --git a/Models/CyberArms/LongMittenLeftUp.png b/Models/CyberArms/LongMittenLeftUp.png new file mode 100644 index 000000000..2900d78a4 Binary files /dev/null and b/Models/CyberArms/LongMittenLeftUp.png differ diff --git a/Models/CyberArms/LongMittenLeftWristtie.png b/Models/CyberArms/LongMittenLeftWristtie.png new file mode 100644 index 000000000..1908fa51d Binary files /dev/null and b/Models/CyberArms/LongMittenLeftWristtie.png differ diff --git a/Models/CyberArms/LongMittenLeftYoked.png b/Models/CyberArms/LongMittenLeftYoked.png new file mode 100644 index 000000000..67cc36ee1 Binary files /dev/null and b/Models/CyberArms/LongMittenLeftYoked.png differ diff --git a/Models/CyberArms/LongMittenRightBoxtie.png b/Models/CyberArms/LongMittenRightBoxtie.png new file mode 100644 index 000000000..df949077d Binary files /dev/null and b/Models/CyberArms/LongMittenRightBoxtie.png differ diff --git a/Models/CyberArms/LongMittenRightCrossed.png b/Models/CyberArms/LongMittenRightCrossed.png new file mode 100644 index 000000000..9fb245db3 Binary files /dev/null and b/Models/CyberArms/LongMittenRightCrossed.png differ diff --git a/Models/CyberArms/LongMittenRightFree.png b/Models/CyberArms/LongMittenRightFree.png new file mode 100644 index 000000000..d9adba63e Binary files /dev/null and b/Models/CyberArms/LongMittenRightFree.png differ diff --git a/Models/CyberArms/LongMittenRightFront.png b/Models/CyberArms/LongMittenRightFront.png new file mode 100644 index 000000000..21beea4c0 Binary files /dev/null and b/Models/CyberArms/LongMittenRightFront.png differ diff --git a/Models/CyberArms/LongMittenRightUp.png b/Models/CyberArms/LongMittenRightUp.png new file mode 100644 index 000000000..e23db4e62 Binary files /dev/null and b/Models/CyberArms/LongMittenRightUp.png differ diff --git a/Models/CyberArms/LongMittenRightWristtie.png b/Models/CyberArms/LongMittenRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberArms/LongMittenRightWristtie.png differ diff --git a/Models/CyberArms/LongMittenRightYoked.png b/Models/CyberArms/LongMittenRightYoked.png new file mode 100644 index 000000000..42f555f80 Binary files /dev/null and b/Models/CyberArms/LongMittenRightYoked.png differ diff --git a/Models/CyberArms/StrapsForeLongMittenLeftCrossed.png b/Models/CyberArms/StrapsForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..b465b883a Binary files /dev/null and b/Models/CyberArms/StrapsForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/StrapsForeLongMittenLeftFront.png b/Models/CyberArms/StrapsForeLongMittenLeftFront.png new file mode 100644 index 000000000..a906c96f7 Binary files /dev/null and b/Models/CyberArms/StrapsForeLongMittenLeftFront.png differ diff --git a/Models/CyberArms/StrapsForeLongMittenRightCrossed.png b/Models/CyberArms/StrapsForeLongMittenRightCrossed.png new file mode 100644 index 000000000..2ca3b8009 Binary files /dev/null and b/Models/CyberArms/StrapsForeLongMittenRightCrossed.png differ diff --git a/Models/CyberArms/StrapsForeLongMittenRightFront.png b/Models/CyberArms/StrapsForeLongMittenRightFront.png new file mode 100644 index 000000000..9000b6b6b Binary files /dev/null and b/Models/CyberArms/StrapsForeLongMittenRightFront.png differ diff --git a/Models/CyberArms/StrapsLongMittenLeftBoxtie.png b/Models/CyberArms/StrapsLongMittenLeftBoxtie.png new file mode 100644 index 000000000..c830987d4 Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenLeftBoxtie.png differ diff --git a/Models/CyberArms/StrapsLongMittenLeftCrossed.png b/Models/CyberArms/StrapsLongMittenLeftCrossed.png new file mode 100644 index 000000000..f031e015b Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenLeftCrossed.png differ diff --git a/Models/CyberArms/StrapsLongMittenLeftFree.png b/Models/CyberArms/StrapsLongMittenLeftFree.png new file mode 100644 index 000000000..0b7cf3bd2 Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenLeftFree.png differ diff --git a/Models/CyberArms/StrapsLongMittenLeftFront.png b/Models/CyberArms/StrapsLongMittenLeftFront.png new file mode 100644 index 000000000..ce3bc8ebe Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenLeftFront.png differ diff --git a/Models/CyberArms/StrapsLongMittenLeftUp.png b/Models/CyberArms/StrapsLongMittenLeftUp.png new file mode 100644 index 000000000..0ab06cf80 Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenLeftUp.png differ diff --git a/Models/CyberArms/StrapsLongMittenLeftWristtie.png b/Models/CyberArms/StrapsLongMittenLeftWristtie.png new file mode 100644 index 000000000..4464177d0 Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenLeftWristtie.png differ diff --git a/Models/CyberArms/StrapsLongMittenLeftYoked.png b/Models/CyberArms/StrapsLongMittenLeftYoked.png new file mode 100644 index 000000000..44e42eef7 Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenLeftYoked.png differ diff --git a/Models/CyberArms/StrapsLongMittenRightBoxtie.png b/Models/CyberArms/StrapsLongMittenRightBoxtie.png new file mode 100644 index 000000000..fb6fbdbc4 Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenRightBoxtie.png differ diff --git a/Models/CyberArms/StrapsLongMittenRightCrossed.png b/Models/CyberArms/StrapsLongMittenRightCrossed.png new file mode 100644 index 000000000..be94ee6ff Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenRightCrossed.png differ diff --git a/Models/CyberArms/StrapsLongMittenRightFree.png b/Models/CyberArms/StrapsLongMittenRightFree.png new file mode 100644 index 000000000..b9ac17e2a Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenRightFree.png differ diff --git a/Models/CyberArms/StrapsLongMittenRightFront.png b/Models/CyberArms/StrapsLongMittenRightFront.png new file mode 100644 index 000000000..41a123fa1 Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenRightFront.png differ diff --git a/Models/CyberArms/StrapsLongMittenRightUp.png b/Models/CyberArms/StrapsLongMittenRightUp.png new file mode 100644 index 000000000..bafc64407 Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenRightUp.png differ diff --git a/Models/CyberArms/StrapsLongMittenRightWristtie.png b/Models/CyberArms/StrapsLongMittenRightWristtie.png new file mode 100644 index 000000000..35964f3e0 Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenRightWristtie.png differ diff --git a/Models/CyberArms/StrapsLongMittenRightYoked.png b/Models/CyberArms/StrapsLongMittenRightYoked.png new file mode 100644 index 000000000..7b7560e24 Binary files /dev/null and b/Models/CyberArms/StrapsLongMittenRightYoked.png differ diff --git a/Models/CyberCuffs/AnkleLeftClosed.png b/Models/CyberCuffs/AnkleLeftClosed.png new file mode 100644 index 000000000..415d4c581 Binary files /dev/null and b/Models/CyberCuffs/AnkleLeftClosed.png differ diff --git a/Models/CyberCuffs/AnkleLeftKneel.png b/Models/CyberCuffs/AnkleLeftKneel.png new file mode 100644 index 000000000..8afb32ca1 Binary files /dev/null and b/Models/CyberCuffs/AnkleLeftKneel.png differ diff --git a/Models/CyberCuffs/AnkleLeftKneelClosed.png b/Models/CyberCuffs/AnkleLeftKneelClosed.png new file mode 100644 index 000000000..dc167d6b3 Binary files /dev/null and b/Models/CyberCuffs/AnkleLeftKneelClosed.png differ diff --git a/Models/CyberCuffs/AnkleLeftSpread.png b/Models/CyberCuffs/AnkleLeftSpread.png new file mode 100644 index 000000000..93d14d93e Binary files /dev/null and b/Models/CyberCuffs/AnkleLeftSpread.png differ diff --git a/Models/CyberCuffs/AnkleRightClosed.png b/Models/CyberCuffs/AnkleRightClosed.png new file mode 100644 index 000000000..c7594fbe3 Binary files /dev/null and b/Models/CyberCuffs/AnkleRightClosed.png differ diff --git a/Models/CyberCuffs/AnkleRightSpread.png b/Models/CyberCuffs/AnkleRightSpread.png new file mode 100644 index 000000000..3b81ac63f Binary files /dev/null and b/Models/CyberCuffs/AnkleRightSpread.png differ diff --git a/Models/CyberCuffs/Belt.png b/Models/CyberCuffs/Belt.png new file mode 100644 index 000000000..3bb82a24c Binary files /dev/null and b/Models/CyberCuffs/Belt.png differ diff --git a/Models/CyberCuffs/Collar.png b/Models/CyberCuffs/Collar.png new file mode 100644 index 000000000..574830364 Binary files /dev/null and b/Models/CyberCuffs/Collar.png differ diff --git a/Models/CyberCuffs/DisplayAnkleLeftClosed.png b/Models/CyberCuffs/DisplayAnkleLeftClosed.png new file mode 100644 index 000000000..af4bca58a Binary files /dev/null and b/Models/CyberCuffs/DisplayAnkleLeftClosed.png differ diff --git a/Models/CyberCuffs/DisplayAnkleLeftKneel.png b/Models/CyberCuffs/DisplayAnkleLeftKneel.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberCuffs/DisplayAnkleLeftKneel.png differ diff --git a/Models/CyberCuffs/DisplayAnkleLeftKneelClosed.png b/Models/CyberCuffs/DisplayAnkleLeftKneelClosed.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberCuffs/DisplayAnkleLeftKneelClosed.png differ diff --git a/Models/CyberCuffs/DisplayAnkleLeftSpread.png b/Models/CyberCuffs/DisplayAnkleLeftSpread.png new file mode 100644 index 000000000..97e50e9ef Binary files /dev/null and b/Models/CyberCuffs/DisplayAnkleLeftSpread.png differ diff --git a/Models/CyberCuffs/DisplayAnkleRightClosed.png b/Models/CyberCuffs/DisplayAnkleRightClosed.png new file mode 100644 index 000000000..82528dea8 Binary files /dev/null and b/Models/CyberCuffs/DisplayAnkleRightClosed.png differ diff --git a/Models/CyberCuffs/DisplayAnkleRightSpread.png b/Models/CyberCuffs/DisplayAnkleRightSpread.png new file mode 100644 index 000000000..f560669b1 Binary files /dev/null and b/Models/CyberCuffs/DisplayAnkleRightSpread.png differ diff --git a/Models/CyberCuffs/DisplayBelt.png b/Models/CyberCuffs/DisplayBelt.png new file mode 100644 index 000000000..1c64f613b Binary files /dev/null and b/Models/CyberCuffs/DisplayBelt.png differ diff --git a/Models/CyberCuffs/DisplayCollar.png b/Models/CyberCuffs/DisplayCollar.png new file mode 100644 index 000000000..fa1fee96a Binary files /dev/null and b/Models/CyberCuffs/DisplayCollar.png differ diff --git a/Models/CyberCuffs/DisplayElbowLeftBoxtie.png b/Models/CyberCuffs/DisplayElbowLeftBoxtie.png new file mode 100644 index 000000000..ddcb41cf5 Binary files /dev/null and b/Models/CyberCuffs/DisplayElbowLeftBoxtie.png differ diff --git a/Models/CyberCuffs/DisplayElbowLeftFree.png b/Models/CyberCuffs/DisplayElbowLeftFree.png new file mode 100644 index 000000000..e755db6de Binary files /dev/null and b/Models/CyberCuffs/DisplayElbowLeftFree.png differ diff --git a/Models/CyberCuffs/DisplayElbowLeftFront.png b/Models/CyberCuffs/DisplayElbowLeftFront.png new file mode 100644 index 000000000..fc91e16f7 Binary files /dev/null and b/Models/CyberCuffs/DisplayElbowLeftFront.png differ diff --git a/Models/CyberCuffs/DisplayElbowLeftUp.png b/Models/CyberCuffs/DisplayElbowLeftUp.png new file mode 100644 index 000000000..a6c95f080 Binary files /dev/null and b/Models/CyberCuffs/DisplayElbowLeftUp.png differ diff --git a/Models/CyberCuffs/DisplayElbowLeftWristtie.png b/Models/CyberCuffs/DisplayElbowLeftWristtie.png new file mode 100644 index 000000000..f4563c503 Binary files /dev/null and b/Models/CyberCuffs/DisplayElbowLeftWristtie.png differ diff --git a/Models/CyberCuffs/DisplayElbowLeftYoked.png b/Models/CyberCuffs/DisplayElbowLeftYoked.png new file mode 100644 index 000000000..63c283a36 Binary files /dev/null and b/Models/CyberCuffs/DisplayElbowLeftYoked.png differ diff --git a/Models/CyberCuffs/DisplayElbowRightBoxtie.png b/Models/CyberCuffs/DisplayElbowRightBoxtie.png new file mode 100644 index 000000000..efda47ec5 Binary files /dev/null and b/Models/CyberCuffs/DisplayElbowRightBoxtie.png differ diff --git a/Models/CyberCuffs/DisplayElbowRightFront.png b/Models/CyberCuffs/DisplayElbowRightFront.png new file mode 100644 index 000000000..9a0285902 Binary files /dev/null and b/Models/CyberCuffs/DisplayElbowRightFront.png differ diff --git a/Models/CyberCuffs/DisplayElbowRightUp.png b/Models/CyberCuffs/DisplayElbowRightUp.png new file mode 100644 index 000000000..0747e53b4 Binary files /dev/null and b/Models/CyberCuffs/DisplayElbowRightUp.png differ diff --git a/Models/CyberCuffs/DisplayElbowRightWristtie.png b/Models/CyberCuffs/DisplayElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberCuffs/DisplayElbowRightWristtie.png differ diff --git a/Models/CyberCuffs/DisplayElbowRightYoked.png b/Models/CyberCuffs/DisplayElbowRightYoked.png new file mode 100644 index 000000000..171b41840 Binary files /dev/null and b/Models/CyberCuffs/DisplayElbowRightYoked.png differ diff --git a/Models/CyberCuffs/DisplayLinkCollar.png b/Models/CyberCuffs/DisplayLinkCollar.png new file mode 100644 index 000000000..046ddec9c Binary files /dev/null and b/Models/CyberCuffs/DisplayLinkCollar.png differ diff --git a/Models/CyberCuffs/DisplayThighLeftClosed.png b/Models/CyberCuffs/DisplayThighLeftClosed.png new file mode 100644 index 000000000..998c646f1 Binary files /dev/null and b/Models/CyberCuffs/DisplayThighLeftClosed.png differ diff --git a/Models/CyberCuffs/DisplayThighLeftKneel.png b/Models/CyberCuffs/DisplayThighLeftKneel.png new file mode 100644 index 000000000..f85d6403d Binary files /dev/null and b/Models/CyberCuffs/DisplayThighLeftKneel.png differ diff --git a/Models/CyberCuffs/DisplayThighLeftKneelClosed.png b/Models/CyberCuffs/DisplayThighLeftKneelClosed.png new file mode 100644 index 000000000..308e65f41 Binary files /dev/null and b/Models/CyberCuffs/DisplayThighLeftKneelClosed.png differ diff --git a/Models/CyberCuffs/DisplayThighLeftSpread.png b/Models/CyberCuffs/DisplayThighLeftSpread.png new file mode 100644 index 000000000..2fca6f3b0 Binary files /dev/null and b/Models/CyberCuffs/DisplayThighLeftSpread.png differ diff --git a/Models/CyberCuffs/DisplayThighRightClosed.png b/Models/CyberCuffs/DisplayThighRightClosed.png new file mode 100644 index 000000000..12ec69cd6 Binary files /dev/null and b/Models/CyberCuffs/DisplayThighRightClosed.png differ diff --git a/Models/CyberCuffs/DisplayThighRightKneel.png b/Models/CyberCuffs/DisplayThighRightKneel.png new file mode 100644 index 000000000..53cfa85a1 Binary files /dev/null and b/Models/CyberCuffs/DisplayThighRightKneel.png differ diff --git a/Models/CyberCuffs/DisplayThighRightKneelClosed.png b/Models/CyberCuffs/DisplayThighRightKneelClosed.png new file mode 100644 index 000000000..5a5dc7dd1 Binary files /dev/null and b/Models/CyberCuffs/DisplayThighRightKneelClosed.png differ diff --git a/Models/CyberCuffs/DisplayThighRightSpread.png b/Models/CyberCuffs/DisplayThighRightSpread.png new file mode 100644 index 000000000..68c446144 Binary files /dev/null and b/Models/CyberCuffs/DisplayThighRightSpread.png differ diff --git a/Models/CyberCuffs/DisplayWristLeftFree.png b/Models/CyberCuffs/DisplayWristLeftFree.png new file mode 100644 index 000000000..9be35e136 Binary files /dev/null and b/Models/CyberCuffs/DisplayWristLeftFree.png differ diff --git a/Models/CyberCuffs/DisplayWristLeftFront.png b/Models/CyberCuffs/DisplayWristLeftFront.png new file mode 100644 index 000000000..3f809dc46 Binary files /dev/null and b/Models/CyberCuffs/DisplayWristLeftFront.png differ diff --git a/Models/CyberCuffs/DisplayWristLeftYoked.png b/Models/CyberCuffs/DisplayWristLeftYoked.png new file mode 100644 index 000000000..865154e52 Binary files /dev/null and b/Models/CyberCuffs/DisplayWristLeftYoked.png differ diff --git a/Models/CyberCuffs/DisplayWristRightCrossed.png b/Models/CyberCuffs/DisplayWristRightCrossed.png new file mode 100644 index 000000000..54d54a060 Binary files /dev/null and b/Models/CyberCuffs/DisplayWristRightCrossed.png differ diff --git a/Models/CyberCuffs/DisplayWristRightFree.png b/Models/CyberCuffs/DisplayWristRightFree.png new file mode 100644 index 000000000..cdad26b4d Binary files /dev/null and b/Models/CyberCuffs/DisplayWristRightFree.png differ diff --git a/Models/CyberCuffs/DisplayWristRightFront.png b/Models/CyberCuffs/DisplayWristRightFront.png new file mode 100644 index 000000000..df3d8838e Binary files /dev/null and b/Models/CyberCuffs/DisplayWristRightFront.png differ diff --git a/Models/CyberCuffs/DisplayWristRightYoked.png b/Models/CyberCuffs/DisplayWristRightYoked.png new file mode 100644 index 000000000..fe8dcfa9c Binary files /dev/null and b/Models/CyberCuffs/DisplayWristRightYoked.png differ diff --git a/Models/CyberCuffs/ElbowLeftBoxtie.png b/Models/CyberCuffs/ElbowLeftBoxtie.png new file mode 100644 index 000000000..31a6c50c6 Binary files /dev/null and b/Models/CyberCuffs/ElbowLeftBoxtie.png differ diff --git a/Models/CyberCuffs/ElbowLeftFree.png b/Models/CyberCuffs/ElbowLeftFree.png new file mode 100644 index 000000000..2b46ec54a Binary files /dev/null and b/Models/CyberCuffs/ElbowLeftFree.png differ diff --git a/Models/CyberCuffs/ElbowLeftFront.png b/Models/CyberCuffs/ElbowLeftFront.png new file mode 100644 index 000000000..978c1ccaa Binary files /dev/null and b/Models/CyberCuffs/ElbowLeftFront.png differ diff --git a/Models/CyberCuffs/ElbowLeftUp.png b/Models/CyberCuffs/ElbowLeftUp.png new file mode 100644 index 000000000..86edefba8 Binary files /dev/null and b/Models/CyberCuffs/ElbowLeftUp.png differ diff --git a/Models/CyberCuffs/ElbowLeftWristtie.png b/Models/CyberCuffs/ElbowLeftWristtie.png new file mode 100644 index 000000000..22b8a97e5 Binary files /dev/null and b/Models/CyberCuffs/ElbowLeftWristtie.png differ diff --git a/Models/CyberCuffs/ElbowLeftYoked.png b/Models/CyberCuffs/ElbowLeftYoked.png new file mode 100644 index 000000000..d2ed9fe62 Binary files /dev/null and b/Models/CyberCuffs/ElbowLeftYoked.png differ diff --git a/Models/CyberCuffs/ElbowRightBoxtie.png b/Models/CyberCuffs/ElbowRightBoxtie.png new file mode 100644 index 000000000..8fc7384a8 Binary files /dev/null and b/Models/CyberCuffs/ElbowRightBoxtie.png differ diff --git a/Models/CyberCuffs/ElbowRightFront.png b/Models/CyberCuffs/ElbowRightFront.png new file mode 100644 index 000000000..e4ad3ff44 Binary files /dev/null and b/Models/CyberCuffs/ElbowRightFront.png differ diff --git a/Models/CyberCuffs/ElbowRightUp.png b/Models/CyberCuffs/ElbowRightUp.png new file mode 100644 index 000000000..e1e2c7711 Binary files /dev/null and b/Models/CyberCuffs/ElbowRightUp.png differ diff --git a/Models/CyberCuffs/ElbowRightWristtie.png b/Models/CyberCuffs/ElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberCuffs/ElbowRightWristtie.png differ diff --git a/Models/CyberCuffs/ElbowRightYoked.png b/Models/CyberCuffs/ElbowRightYoked.png new file mode 100644 index 000000000..bcd37026e Binary files /dev/null and b/Models/CyberCuffs/ElbowRightYoked.png differ diff --git a/Models/CyberCuffs/LinkCollar.png b/Models/CyberCuffs/LinkCollar.png new file mode 100644 index 000000000..0012fab06 Binary files /dev/null and b/Models/CyberCuffs/LinkCollar.png differ diff --git a/Models/CyberCuffs/LockAnkleLeftClosed.png b/Models/CyberCuffs/LockAnkleLeftClosed.png new file mode 100644 index 000000000..1c10d2620 Binary files /dev/null and b/Models/CyberCuffs/LockAnkleLeftClosed.png differ diff --git a/Models/CyberCuffs/LockAnkleLeftKneel.png b/Models/CyberCuffs/LockAnkleLeftKneel.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberCuffs/LockAnkleLeftKneel.png differ diff --git a/Models/CyberCuffs/LockAnkleLeftKneelClosed.png b/Models/CyberCuffs/LockAnkleLeftKneelClosed.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberCuffs/LockAnkleLeftKneelClosed.png differ diff --git a/Models/CyberCuffs/LockAnkleLeftSpread.png b/Models/CyberCuffs/LockAnkleLeftSpread.png new file mode 100644 index 000000000..10d18e53c Binary files /dev/null and b/Models/CyberCuffs/LockAnkleLeftSpread.png differ diff --git a/Models/CyberCuffs/LockAnkleRightClosed.png b/Models/CyberCuffs/LockAnkleRightClosed.png new file mode 100644 index 000000000..3dbbaff45 Binary files /dev/null and b/Models/CyberCuffs/LockAnkleRightClosed.png differ diff --git a/Models/CyberCuffs/LockAnkleRightSpread.png b/Models/CyberCuffs/LockAnkleRightSpread.png new file mode 100644 index 000000000..b963ece6c Binary files /dev/null and b/Models/CyberCuffs/LockAnkleRightSpread.png differ diff --git a/Models/CyberCuffs/LockBelt.png b/Models/CyberCuffs/LockBelt.png new file mode 100644 index 000000000..9ec218e3a Binary files /dev/null and b/Models/CyberCuffs/LockBelt.png differ diff --git a/Models/CyberCuffs/LockCollar.png b/Models/CyberCuffs/LockCollar.png new file mode 100644 index 000000000..b90de9263 Binary files /dev/null and b/Models/CyberCuffs/LockCollar.png differ diff --git a/Models/CyberCuffs/LockElbowLeftBoxtie.png b/Models/CyberCuffs/LockElbowLeftBoxtie.png new file mode 100644 index 000000000..1d94fa82a Binary files /dev/null and b/Models/CyberCuffs/LockElbowLeftBoxtie.png differ diff --git a/Models/CyberCuffs/LockElbowLeftFree.png b/Models/CyberCuffs/LockElbowLeftFree.png new file mode 100644 index 000000000..ad882b5b2 Binary files /dev/null and b/Models/CyberCuffs/LockElbowLeftFree.png differ diff --git a/Models/CyberCuffs/LockElbowLeftFront.png b/Models/CyberCuffs/LockElbowLeftFront.png new file mode 100644 index 000000000..3f8f9b7c3 Binary files /dev/null and b/Models/CyberCuffs/LockElbowLeftFront.png differ diff --git a/Models/CyberCuffs/LockElbowLeftUp.png b/Models/CyberCuffs/LockElbowLeftUp.png new file mode 100644 index 000000000..c3984925e Binary files /dev/null and b/Models/CyberCuffs/LockElbowLeftUp.png differ diff --git a/Models/CyberCuffs/LockElbowLeftWristtie.png b/Models/CyberCuffs/LockElbowLeftWristtie.png new file mode 100644 index 000000000..aa3d3cf64 Binary files /dev/null and b/Models/CyberCuffs/LockElbowLeftWristtie.png differ diff --git a/Models/CyberCuffs/LockElbowLeftYoked.png b/Models/CyberCuffs/LockElbowLeftYoked.png new file mode 100644 index 000000000..15df609a0 Binary files /dev/null and b/Models/CyberCuffs/LockElbowLeftYoked.png differ diff --git a/Models/CyberCuffs/LockElbowRightBoxtie.png b/Models/CyberCuffs/LockElbowRightBoxtie.png new file mode 100644 index 000000000..eb44e99e6 Binary files /dev/null and b/Models/CyberCuffs/LockElbowRightBoxtie.png differ diff --git a/Models/CyberCuffs/LockElbowRightFront.png b/Models/CyberCuffs/LockElbowRightFront.png new file mode 100644 index 000000000..5dd7a67fd Binary files /dev/null and b/Models/CyberCuffs/LockElbowRightFront.png differ diff --git a/Models/CyberCuffs/LockElbowRightUp.png b/Models/CyberCuffs/LockElbowRightUp.png new file mode 100644 index 000000000..ad6043350 Binary files /dev/null and b/Models/CyberCuffs/LockElbowRightUp.png differ diff --git a/Models/CyberCuffs/LockElbowRightWristtie.png b/Models/CyberCuffs/LockElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberCuffs/LockElbowRightWristtie.png differ diff --git a/Models/CyberCuffs/LockElbowRightYoked.png b/Models/CyberCuffs/LockElbowRightYoked.png new file mode 100644 index 000000000..a87d04092 Binary files /dev/null and b/Models/CyberCuffs/LockElbowRightYoked.png differ diff --git a/Models/CyberCuffs/LockLinkCollar.png b/Models/CyberCuffs/LockLinkCollar.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberCuffs/LockLinkCollar.png differ diff --git a/Models/CyberCuffs/LockThighLeftClosed.png b/Models/CyberCuffs/LockThighLeftClosed.png new file mode 100644 index 000000000..6fa14ae57 Binary files /dev/null and b/Models/CyberCuffs/LockThighLeftClosed.png differ diff --git a/Models/CyberCuffs/LockThighLeftKneel.png b/Models/CyberCuffs/LockThighLeftKneel.png new file mode 100644 index 000000000..7fee61de3 Binary files /dev/null and b/Models/CyberCuffs/LockThighLeftKneel.png differ diff --git a/Models/CyberCuffs/LockThighLeftKneelClosed.png b/Models/CyberCuffs/LockThighLeftKneelClosed.png new file mode 100644 index 000000000..7fee61de3 Binary files /dev/null and b/Models/CyberCuffs/LockThighLeftKneelClosed.png differ diff --git a/Models/CyberCuffs/LockThighLeftSpread.png b/Models/CyberCuffs/LockThighLeftSpread.png new file mode 100644 index 000000000..3e877aa05 Binary files /dev/null and b/Models/CyberCuffs/LockThighLeftSpread.png differ diff --git a/Models/CyberCuffs/LockThighRightClosed.png b/Models/CyberCuffs/LockThighRightClosed.png new file mode 100644 index 000000000..45ec0e9fd Binary files /dev/null and b/Models/CyberCuffs/LockThighRightClosed.png differ diff --git a/Models/CyberCuffs/LockThighRightKneel.png b/Models/CyberCuffs/LockThighRightKneel.png new file mode 100644 index 000000000..4aa9454ae Binary files /dev/null and b/Models/CyberCuffs/LockThighRightKneel.png differ diff --git a/Models/CyberCuffs/LockThighRightKneelClosed.png b/Models/CyberCuffs/LockThighRightKneelClosed.png new file mode 100644 index 000000000..4aa9454ae Binary files /dev/null and b/Models/CyberCuffs/LockThighRightKneelClosed.png differ diff --git a/Models/CyberCuffs/LockThighRightSpread.png b/Models/CyberCuffs/LockThighRightSpread.png new file mode 100644 index 000000000..0fc99db2c Binary files /dev/null and b/Models/CyberCuffs/LockThighRightSpread.png differ diff --git a/Models/CyberCuffs/LockWristLeftFree.png b/Models/CyberCuffs/LockWristLeftFree.png new file mode 100644 index 000000000..ee8fa22d4 Binary files /dev/null and b/Models/CyberCuffs/LockWristLeftFree.png differ diff --git a/Models/CyberCuffs/LockWristLeftFront.png b/Models/CyberCuffs/LockWristLeftFront.png new file mode 100644 index 000000000..1ff56e53c Binary files /dev/null and b/Models/CyberCuffs/LockWristLeftFront.png differ diff --git a/Models/CyberCuffs/LockWristLeftYoked.png b/Models/CyberCuffs/LockWristLeftYoked.png new file mode 100644 index 000000000..a49bc1357 Binary files /dev/null and b/Models/CyberCuffs/LockWristLeftYoked.png differ diff --git a/Models/CyberCuffs/LockWristRightCrossed.png b/Models/CyberCuffs/LockWristRightCrossed.png new file mode 100644 index 000000000..80c861a68 Binary files /dev/null and b/Models/CyberCuffs/LockWristRightCrossed.png differ diff --git a/Models/CyberCuffs/LockWristRightFree.png b/Models/CyberCuffs/LockWristRightFree.png new file mode 100644 index 000000000..98c4747b6 Binary files /dev/null and b/Models/CyberCuffs/LockWristRightFree.png differ diff --git a/Models/CyberCuffs/LockWristRightFront.png b/Models/CyberCuffs/LockWristRightFront.png new file mode 100644 index 000000000..fa796cabe Binary files /dev/null and b/Models/CyberCuffs/LockWristRightFront.png differ diff --git a/Models/CyberCuffs/LockWristRightYoked.png b/Models/CyberCuffs/LockWristRightYoked.png new file mode 100644 index 000000000..b2c760d17 Binary files /dev/null and b/Models/CyberCuffs/LockWristRightYoked.png differ diff --git a/Models/CyberCuffs/ScreenAnkleLeftClosed.png b/Models/CyberCuffs/ScreenAnkleLeftClosed.png new file mode 100644 index 000000000..13c867ad3 Binary files /dev/null and b/Models/CyberCuffs/ScreenAnkleLeftClosed.png differ diff --git a/Models/CyberCuffs/ScreenAnkleLeftKneel.png b/Models/CyberCuffs/ScreenAnkleLeftKneel.png new file mode 100644 index 000000000..c200045f9 Binary files /dev/null and b/Models/CyberCuffs/ScreenAnkleLeftKneel.png differ diff --git a/Models/CyberCuffs/ScreenAnkleLeftKneelClosed.png b/Models/CyberCuffs/ScreenAnkleLeftKneelClosed.png new file mode 100644 index 000000000..bce83bef0 Binary files /dev/null and b/Models/CyberCuffs/ScreenAnkleLeftKneelClosed.png differ diff --git a/Models/CyberCuffs/ScreenAnkleLeftSpread.png b/Models/CyberCuffs/ScreenAnkleLeftSpread.png new file mode 100644 index 000000000..c2b9f60cd Binary files /dev/null and b/Models/CyberCuffs/ScreenAnkleLeftSpread.png differ diff --git a/Models/CyberCuffs/ScreenAnkleRightClosed.png b/Models/CyberCuffs/ScreenAnkleRightClosed.png new file mode 100644 index 000000000..74cd87cc1 Binary files /dev/null and b/Models/CyberCuffs/ScreenAnkleRightClosed.png differ diff --git a/Models/CyberCuffs/ScreenAnkleRightSpread.png b/Models/CyberCuffs/ScreenAnkleRightSpread.png new file mode 100644 index 000000000..91d55859d Binary files /dev/null and b/Models/CyberCuffs/ScreenAnkleRightSpread.png differ diff --git a/Models/CyberCuffs/ScreenBelt.png b/Models/CyberCuffs/ScreenBelt.png new file mode 100644 index 000000000..031d6f58a Binary files /dev/null and b/Models/CyberCuffs/ScreenBelt.png differ diff --git a/Models/CyberCuffs/ScreenCollar.png b/Models/CyberCuffs/ScreenCollar.png new file mode 100644 index 000000000..9ad6fc6a9 Binary files /dev/null and b/Models/CyberCuffs/ScreenCollar.png differ diff --git a/Models/CyberCuffs/ScreenElbowLeftBoxtie.png b/Models/CyberCuffs/ScreenElbowLeftBoxtie.png new file mode 100644 index 000000000..be52ea3bc Binary files /dev/null and b/Models/CyberCuffs/ScreenElbowLeftBoxtie.png differ diff --git a/Models/CyberCuffs/ScreenElbowLeftFree.png b/Models/CyberCuffs/ScreenElbowLeftFree.png new file mode 100644 index 000000000..dc13a9e17 Binary files /dev/null and b/Models/CyberCuffs/ScreenElbowLeftFree.png differ diff --git a/Models/CyberCuffs/ScreenElbowLeftFront.png b/Models/CyberCuffs/ScreenElbowLeftFront.png new file mode 100644 index 000000000..933084c6b Binary files /dev/null and b/Models/CyberCuffs/ScreenElbowLeftFront.png differ diff --git a/Models/CyberCuffs/ScreenElbowLeftUp.png b/Models/CyberCuffs/ScreenElbowLeftUp.png new file mode 100644 index 000000000..eaff83da9 Binary files /dev/null and b/Models/CyberCuffs/ScreenElbowLeftUp.png differ diff --git a/Models/CyberCuffs/ScreenElbowLeftWristtie.png b/Models/CyberCuffs/ScreenElbowLeftWristtie.png new file mode 100644 index 000000000..22525316c Binary files /dev/null and b/Models/CyberCuffs/ScreenElbowLeftWristtie.png differ diff --git a/Models/CyberCuffs/ScreenElbowLeftYoked.png b/Models/CyberCuffs/ScreenElbowLeftYoked.png new file mode 100644 index 000000000..098f19659 Binary files /dev/null and b/Models/CyberCuffs/ScreenElbowLeftYoked.png differ diff --git a/Models/CyberCuffs/ScreenElbowRightBoxtie.png b/Models/CyberCuffs/ScreenElbowRightBoxtie.png new file mode 100644 index 000000000..3668b7e30 Binary files /dev/null and b/Models/CyberCuffs/ScreenElbowRightBoxtie.png differ diff --git a/Models/CyberCuffs/ScreenElbowRightFront.png b/Models/CyberCuffs/ScreenElbowRightFront.png new file mode 100644 index 000000000..e4992a024 Binary files /dev/null and b/Models/CyberCuffs/ScreenElbowRightFront.png differ diff --git a/Models/CyberCuffs/ScreenElbowRightUp.png b/Models/CyberCuffs/ScreenElbowRightUp.png new file mode 100644 index 000000000..93dd5749d Binary files /dev/null and b/Models/CyberCuffs/ScreenElbowRightUp.png differ diff --git a/Models/CyberCuffs/ScreenElbowRightWristtie.png b/Models/CyberCuffs/ScreenElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberCuffs/ScreenElbowRightWristtie.png differ diff --git a/Models/CyberCuffs/ScreenElbowRightYoked.png b/Models/CyberCuffs/ScreenElbowRightYoked.png new file mode 100644 index 000000000..f6c8659f1 Binary files /dev/null and b/Models/CyberCuffs/ScreenElbowRightYoked.png differ diff --git a/Models/CyberCuffs/ScreenLinkCollar.png b/Models/CyberCuffs/ScreenLinkCollar.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberCuffs/ScreenLinkCollar.png differ diff --git a/Models/CyberCuffs/ScreenThighLeftClosed.png b/Models/CyberCuffs/ScreenThighLeftClosed.png new file mode 100644 index 000000000..6e1cb4bd3 Binary files /dev/null and b/Models/CyberCuffs/ScreenThighLeftClosed.png differ diff --git a/Models/CyberCuffs/ScreenThighLeftKneel.png b/Models/CyberCuffs/ScreenThighLeftKneel.png new file mode 100644 index 000000000..180d1a066 Binary files /dev/null and b/Models/CyberCuffs/ScreenThighLeftKneel.png differ diff --git a/Models/CyberCuffs/ScreenThighLeftKneelClosed.png b/Models/CyberCuffs/ScreenThighLeftKneelClosed.png new file mode 100644 index 000000000..61f28c5db Binary files /dev/null and b/Models/CyberCuffs/ScreenThighLeftKneelClosed.png differ diff --git a/Models/CyberCuffs/ScreenThighLeftSpread.png b/Models/CyberCuffs/ScreenThighLeftSpread.png new file mode 100644 index 000000000..dbf77f2cb Binary files /dev/null and b/Models/CyberCuffs/ScreenThighLeftSpread.png differ diff --git a/Models/CyberCuffs/ScreenThighRightClosed.png b/Models/CyberCuffs/ScreenThighRightClosed.png new file mode 100644 index 000000000..d22e763d1 Binary files /dev/null and b/Models/CyberCuffs/ScreenThighRightClosed.png differ diff --git a/Models/CyberCuffs/ScreenThighRightKneel.png b/Models/CyberCuffs/ScreenThighRightKneel.png new file mode 100644 index 000000000..cb1f3f28b Binary files /dev/null and b/Models/CyberCuffs/ScreenThighRightKneel.png differ diff --git a/Models/CyberCuffs/ScreenThighRightKneelClosed.png b/Models/CyberCuffs/ScreenThighRightKneelClosed.png new file mode 100644 index 000000000..cb1f3f28b Binary files /dev/null and b/Models/CyberCuffs/ScreenThighRightKneelClosed.png differ diff --git a/Models/CyberCuffs/ScreenThighRightSpread.png b/Models/CyberCuffs/ScreenThighRightSpread.png new file mode 100644 index 000000000..86dcc97d2 Binary files /dev/null and b/Models/CyberCuffs/ScreenThighRightSpread.png differ diff --git a/Models/CyberCuffs/ScreenWristLeftFree.png b/Models/CyberCuffs/ScreenWristLeftFree.png new file mode 100644 index 000000000..e6c39a88b Binary files /dev/null and b/Models/CyberCuffs/ScreenWristLeftFree.png differ diff --git a/Models/CyberCuffs/ScreenWristLeftFront.png b/Models/CyberCuffs/ScreenWristLeftFront.png new file mode 100644 index 000000000..a26897aa8 Binary files /dev/null and b/Models/CyberCuffs/ScreenWristLeftFront.png differ diff --git a/Models/CyberCuffs/ScreenWristLeftYoked.png b/Models/CyberCuffs/ScreenWristLeftYoked.png new file mode 100644 index 000000000..ba9113c5e Binary files /dev/null and b/Models/CyberCuffs/ScreenWristLeftYoked.png differ diff --git a/Models/CyberCuffs/ScreenWristRightCrossed.png b/Models/CyberCuffs/ScreenWristRightCrossed.png new file mode 100644 index 000000000..c879d77ea Binary files /dev/null and b/Models/CyberCuffs/ScreenWristRightCrossed.png differ diff --git a/Models/CyberCuffs/ScreenWristRightFree.png b/Models/CyberCuffs/ScreenWristRightFree.png new file mode 100644 index 000000000..e116cdc6e Binary files /dev/null and b/Models/CyberCuffs/ScreenWristRightFree.png differ diff --git a/Models/CyberCuffs/ScreenWristRightFront.png b/Models/CyberCuffs/ScreenWristRightFront.png new file mode 100644 index 000000000..a3b3002f2 Binary files /dev/null and b/Models/CyberCuffs/ScreenWristRightFront.png differ diff --git a/Models/CyberCuffs/ScreenWristRightYoked.png b/Models/CyberCuffs/ScreenWristRightYoked.png new file mode 100644 index 000000000..2cea184fb Binary files /dev/null and b/Models/CyberCuffs/ScreenWristRightYoked.png differ diff --git a/Models/CyberCuffs/ThighLeftClosed.png b/Models/CyberCuffs/ThighLeftClosed.png new file mode 100644 index 000000000..2c746cd06 Binary files /dev/null and b/Models/CyberCuffs/ThighLeftClosed.png differ diff --git a/Models/CyberCuffs/ThighLeftKneel.png b/Models/CyberCuffs/ThighLeftKneel.png new file mode 100644 index 000000000..b3761b5e0 Binary files /dev/null and b/Models/CyberCuffs/ThighLeftKneel.png differ diff --git a/Models/CyberCuffs/ThighLeftKneelClosed.png b/Models/CyberCuffs/ThighLeftKneelClosed.png new file mode 100644 index 000000000..acb0b61bc Binary files /dev/null and b/Models/CyberCuffs/ThighLeftKneelClosed.png differ diff --git a/Models/CyberCuffs/ThighLeftSpread.png b/Models/CyberCuffs/ThighLeftSpread.png new file mode 100644 index 000000000..1ca586cd3 Binary files /dev/null and b/Models/CyberCuffs/ThighLeftSpread.png differ diff --git a/Models/CyberCuffs/ThighRightClosed.png b/Models/CyberCuffs/ThighRightClosed.png new file mode 100644 index 000000000..503564040 Binary files /dev/null and b/Models/CyberCuffs/ThighRightClosed.png differ diff --git a/Models/CyberCuffs/ThighRightKneel.png b/Models/CyberCuffs/ThighRightKneel.png new file mode 100644 index 000000000..662020fca Binary files /dev/null and b/Models/CyberCuffs/ThighRightKneel.png differ diff --git a/Models/CyberCuffs/ThighRightKneelClosed.png b/Models/CyberCuffs/ThighRightKneelClosed.png new file mode 100644 index 000000000..662020fca Binary files /dev/null and b/Models/CyberCuffs/ThighRightKneelClosed.png differ diff --git a/Models/CyberCuffs/ThighRightSpread.png b/Models/CyberCuffs/ThighRightSpread.png new file mode 100644 index 000000000..68572dbb3 Binary files /dev/null and b/Models/CyberCuffs/ThighRightSpread.png differ diff --git a/Models/CyberCuffs/WristLeftFree.png b/Models/CyberCuffs/WristLeftFree.png new file mode 100644 index 000000000..5de685b1a Binary files /dev/null and b/Models/CyberCuffs/WristLeftFree.png differ diff --git a/Models/CyberCuffs/WristLeftFront.png b/Models/CyberCuffs/WristLeftFront.png new file mode 100644 index 000000000..bbb383ac2 Binary files /dev/null and b/Models/CyberCuffs/WristLeftFront.png differ diff --git a/Models/CyberCuffs/WristLeftYoked.png b/Models/CyberCuffs/WristLeftYoked.png new file mode 100644 index 000000000..1d7654e2c Binary files /dev/null and b/Models/CyberCuffs/WristLeftYoked.png differ diff --git a/Models/CyberCuffs/WristRightCrossed.png b/Models/CyberCuffs/WristRightCrossed.png new file mode 100644 index 000000000..b7787babf Binary files /dev/null and b/Models/CyberCuffs/WristRightCrossed.png differ diff --git a/Models/CyberCuffs/WristRightFree.png b/Models/CyberCuffs/WristRightFree.png new file mode 100644 index 000000000..3a9802170 Binary files /dev/null and b/Models/CyberCuffs/WristRightFree.png differ diff --git a/Models/CyberCuffs/WristRightFront.png b/Models/CyberCuffs/WristRightFront.png new file mode 100644 index 000000000..048abe586 Binary files /dev/null and b/Models/CyberCuffs/WristRightFront.png differ diff --git a/Models/CyberCuffs/WristRightYoked.png b/Models/CyberCuffs/WristRightYoked.png new file mode 100644 index 000000000..7de20c97f Binary files /dev/null and b/Models/CyberCuffs/WristRightYoked.png differ diff --git a/Models/CyberHeels/GlowBalletLeftClosed.png b/Models/CyberHeels/GlowBalletLeftClosed.png new file mode 100644 index 000000000..fa0b0ac8a Binary files /dev/null and b/Models/CyberHeels/GlowBalletLeftClosed.png differ diff --git a/Models/CyberHeels/GlowBalletLeftHogtie.png b/Models/CyberHeels/GlowBalletLeftHogtie.png new file mode 100644 index 000000000..61a49eec2 Binary files /dev/null and b/Models/CyberHeels/GlowBalletLeftHogtie.png differ diff --git a/Models/CyberHeels/GlowBalletLeftKneel.png b/Models/CyberHeels/GlowBalletLeftKneel.png new file mode 100644 index 000000000..f45b5a94a Binary files /dev/null and b/Models/CyberHeels/GlowBalletLeftKneel.png differ diff --git a/Models/CyberHeels/GlowBalletLeftKneelClosed.png b/Models/CyberHeels/GlowBalletLeftKneelClosed.png new file mode 100644 index 000000000..8519bd2fc Binary files /dev/null and b/Models/CyberHeels/GlowBalletLeftKneelClosed.png differ diff --git a/Models/CyberHeels/GlowBalletLeftSpread.png b/Models/CyberHeels/GlowBalletLeftSpread.png new file mode 100644 index 000000000..28571f805 Binary files /dev/null and b/Models/CyberHeels/GlowBalletLeftSpread.png differ diff --git a/Models/CyberHeels/GlowBalletRightClosed.png b/Models/CyberHeels/GlowBalletRightClosed.png new file mode 100644 index 000000000..1365f96ad Binary files /dev/null and b/Models/CyberHeels/GlowBalletRightClosed.png differ diff --git a/Models/CyberHeels/GlowBalletRightKneel.png b/Models/CyberHeels/GlowBalletRightKneel.png new file mode 100644 index 000000000..6eb6d92c1 Binary files /dev/null and b/Models/CyberHeels/GlowBalletRightKneel.png differ diff --git a/Models/CyberHeels/GlowBalletRightSpread.png b/Models/CyberHeels/GlowBalletRightSpread.png new file mode 100644 index 000000000..3e78f53f8 Binary files /dev/null and b/Models/CyberHeels/GlowBalletRightSpread.png differ diff --git a/Models/CyberHeels/ShinyBalletLeftClosed.png b/Models/CyberHeels/ShinyBalletLeftClosed.png new file mode 100644 index 000000000..285536c8b Binary files /dev/null and b/Models/CyberHeels/ShinyBalletLeftClosed.png differ diff --git a/Models/CyberHeels/ShinyBalletLeftHogtie.png b/Models/CyberHeels/ShinyBalletLeftHogtie.png new file mode 100644 index 000000000..43501ec1c Binary files /dev/null and b/Models/CyberHeels/ShinyBalletLeftHogtie.png differ diff --git a/Models/CyberHeels/ShinyBalletLeftKneel.png b/Models/CyberHeels/ShinyBalletLeftKneel.png new file mode 100644 index 000000000..ca103c493 Binary files /dev/null and b/Models/CyberHeels/ShinyBalletLeftKneel.png differ diff --git a/Models/CyberHeels/ShinyBalletLeftKneelClosed.png b/Models/CyberHeels/ShinyBalletLeftKneelClosed.png new file mode 100644 index 000000000..8d6de64ab Binary files /dev/null and b/Models/CyberHeels/ShinyBalletLeftKneelClosed.png differ diff --git a/Models/CyberHeels/ShinyBalletLeftSpread.png b/Models/CyberHeels/ShinyBalletLeftSpread.png new file mode 100644 index 000000000..cc3d1658a Binary files /dev/null and b/Models/CyberHeels/ShinyBalletLeftSpread.png differ diff --git a/Models/CyberHeels/ShinyBalletRightClosed.png b/Models/CyberHeels/ShinyBalletRightClosed.png new file mode 100644 index 000000000..d48e9f230 Binary files /dev/null and b/Models/CyberHeels/ShinyBalletRightClosed.png differ diff --git a/Models/CyberHeels/ShinyBalletRightKneel.png b/Models/CyberHeels/ShinyBalletRightKneel.png new file mode 100644 index 000000000..9ec81855a Binary files /dev/null and b/Models/CyberHeels/ShinyBalletRightKneel.png differ diff --git a/Models/CyberHeels/ShinyBalletRightSpread.png b/Models/CyberHeels/ShinyBalletRightSpread.png new file mode 100644 index 000000000..c5f407d78 Binary files /dev/null and b/Models/CyberHeels/ShinyBalletRightSpread.png differ diff --git a/Models/CyberLink/AnkleLinkSpread.png b/Models/CyberLink/AnkleLinkSpread.png new file mode 100644 index 000000000..3a24d494b Binary files /dev/null and b/Models/CyberLink/AnkleLinkSpread.png differ diff --git a/Models/CyberLink/GlowAnkleLinkSpread.png b/Models/CyberLink/GlowAnkleLinkSpread.png new file mode 100644 index 000000000..1d2b664ff Binary files /dev/null and b/Models/CyberLink/GlowAnkleLinkSpread.png differ diff --git a/Models/CyberLink/GlowThighLinkSpread.png b/Models/CyberLink/GlowThighLinkSpread.png new file mode 100644 index 000000000..778fc02d7 Binary files /dev/null and b/Models/CyberLink/GlowThighLinkSpread.png differ diff --git a/Models/CyberLink/GlowThighLinkSpreadHigh.png b/Models/CyberLink/GlowThighLinkSpreadHigh.png new file mode 100644 index 000000000..582a24188 Binary files /dev/null and b/Models/CyberLink/GlowThighLinkSpreadHigh.png differ diff --git a/Models/CyberLink/ThighLinkSpread.png b/Models/CyberLink/ThighLinkSpread.png new file mode 100644 index 000000000..5109e33c4 Binary files /dev/null and b/Models/CyberLink/ThighLinkSpread.png differ diff --git a/Models/CyberLink/ThighLinkSpreadHigh.png b/Models/CyberLink/ThighLinkSpreadHigh.png new file mode 100644 index 000000000..21fa70ccc Binary files /dev/null and b/Models/CyberLink/ThighLinkSpreadHigh.png differ diff --git a/Models/CyberMitts/ArmLongMittenLeftBoxtie.png b/Models/CyberMitts/ArmLongMittenLeftBoxtie.png new file mode 100644 index 000000000..393e27007 Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/ArmLongMittenLeftCrossed.png b/Models/CyberMitts/ArmLongMittenLeftCrossed.png new file mode 100644 index 000000000..8ce58decf Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/ArmLongMittenLeftFree.png b/Models/CyberMitts/ArmLongMittenLeftFree.png new file mode 100644 index 000000000..902db402c Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenLeftFree.png differ diff --git a/Models/CyberMitts/ArmLongMittenLeftFront.png b/Models/CyberMitts/ArmLongMittenLeftFront.png new file mode 100644 index 000000000..0c724850b Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/ArmLongMittenLeftUp.png b/Models/CyberMitts/ArmLongMittenLeftUp.png new file mode 100644 index 000000000..2900d78a4 Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenLeftUp.png differ diff --git a/Models/CyberMitts/ArmLongMittenLeftWristtie.png b/Models/CyberMitts/ArmLongMittenLeftWristtie.png new file mode 100644 index 000000000..1908fa51d Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/ArmLongMittenLeftYoked.png b/Models/CyberMitts/ArmLongMittenLeftYoked.png new file mode 100644 index 000000000..a51af2cb9 Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/ArmLongMittenRightBoxtie.png b/Models/CyberMitts/ArmLongMittenRightBoxtie.png new file mode 100644 index 000000000..f50a3eb4e Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/ArmLongMittenRightCrossed.png b/Models/CyberMitts/ArmLongMittenRightCrossed.png new file mode 100644 index 000000000..9fb245db3 Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/ArmLongMittenRightFree.png b/Models/CyberMitts/ArmLongMittenRightFree.png new file mode 100644 index 000000000..797832973 Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenRightFree.png differ diff --git a/Models/CyberMitts/ArmLongMittenRightFront.png b/Models/CyberMitts/ArmLongMittenRightFront.png new file mode 100644 index 000000000..21beea4c0 Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenRightFront.png differ diff --git a/Models/CyberMitts/ArmLongMittenRightUp.png b/Models/CyberMitts/ArmLongMittenRightUp.png new file mode 100644 index 000000000..e23db4e62 Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenRightUp.png differ diff --git a/Models/CyberMitts/ArmLongMittenRightWristtie.png b/Models/CyberMitts/ArmLongMittenRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/ArmLongMittenRightYoked.png b/Models/CyberMitts/ArmLongMittenRightYoked.png new file mode 100644 index 000000000..2b6a64efb Binary files /dev/null and b/Models/CyberMitts/ArmLongMittenRightYoked.png differ diff --git a/Models/CyberMitts/CapForeLongMittenLeftCrossed.png b/Models/CyberMitts/CapForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..54a90011e Binary files /dev/null and b/Models/CyberMitts/CapForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/CapForeLongMittenLeftFront.png b/Models/CyberMitts/CapForeLongMittenLeftFront.png new file mode 100644 index 000000000..bc1f68330 Binary files /dev/null and b/Models/CyberMitts/CapForeLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/CapForeLongMittenRightCrossed.png b/Models/CyberMitts/CapForeLongMittenRightCrossed.png new file mode 100644 index 000000000..9d608a060 Binary files /dev/null and b/Models/CyberMitts/CapForeLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/CapForeLongMittenRightFront.png b/Models/CyberMitts/CapForeLongMittenRightFront.png new file mode 100644 index 000000000..4fd48a424 Binary files /dev/null and b/Models/CyberMitts/CapForeLongMittenRightFront.png differ diff --git a/Models/CyberMitts/CapLongMittenLeftBoxtie.png b/Models/CyberMitts/CapLongMittenLeftBoxtie.png new file mode 100644 index 000000000..6e4e66d19 Binary files /dev/null and b/Models/CyberMitts/CapLongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/CapLongMittenLeftCrossed.png b/Models/CyberMitts/CapLongMittenLeftCrossed.png new file mode 100644 index 000000000..1d844697c Binary files /dev/null and b/Models/CyberMitts/CapLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/CapLongMittenLeftFree.png b/Models/CyberMitts/CapLongMittenLeftFree.png new file mode 100644 index 000000000..54ba4545a Binary files /dev/null and b/Models/CyberMitts/CapLongMittenLeftFree.png differ diff --git a/Models/CyberMitts/CapLongMittenLeftFront.png b/Models/CyberMitts/CapLongMittenLeftFront.png new file mode 100644 index 000000000..058b5cdfd Binary files /dev/null and b/Models/CyberMitts/CapLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/CapLongMittenLeftUp.png b/Models/CyberMitts/CapLongMittenLeftUp.png new file mode 100644 index 000000000..387d503d2 Binary files /dev/null and b/Models/CyberMitts/CapLongMittenLeftUp.png differ diff --git a/Models/CyberMitts/CapLongMittenLeftWristtie.png b/Models/CyberMitts/CapLongMittenLeftWristtie.png new file mode 100644 index 000000000..387d503d2 Binary files /dev/null and b/Models/CyberMitts/CapLongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/CapLongMittenLeftYoked.png b/Models/CyberMitts/CapLongMittenLeftYoked.png new file mode 100644 index 000000000..42d988693 Binary files /dev/null and b/Models/CyberMitts/CapLongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/CapLongMittenRightBoxtie.png b/Models/CyberMitts/CapLongMittenRightBoxtie.png new file mode 100644 index 000000000..7dfb80ba7 Binary files /dev/null and b/Models/CyberMitts/CapLongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/CapLongMittenRightCrossed.png b/Models/CyberMitts/CapLongMittenRightCrossed.png new file mode 100644 index 000000000..a76518872 Binary files /dev/null and b/Models/CyberMitts/CapLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/CapLongMittenRightFree.png b/Models/CyberMitts/CapLongMittenRightFree.png new file mode 100644 index 000000000..79e2bda94 Binary files /dev/null and b/Models/CyberMitts/CapLongMittenRightFree.png differ diff --git a/Models/CyberMitts/CapLongMittenRightFront.png b/Models/CyberMitts/CapLongMittenRightFront.png new file mode 100644 index 000000000..80722d826 Binary files /dev/null and b/Models/CyberMitts/CapLongMittenRightFront.png differ diff --git a/Models/CyberMitts/CapLongMittenRightUp.png b/Models/CyberMitts/CapLongMittenRightUp.png new file mode 100644 index 000000000..387d503d2 Binary files /dev/null and b/Models/CyberMitts/CapLongMittenRightUp.png differ diff --git a/Models/CyberMitts/CapLongMittenRightWristtie.png b/Models/CyberMitts/CapLongMittenRightWristtie.png new file mode 100644 index 000000000..a1796bf33 Binary files /dev/null and b/Models/CyberMitts/CapLongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/CapLongMittenRightYoked.png b/Models/CyberMitts/CapLongMittenRightYoked.png new file mode 100644 index 000000000..c42a3fc1b Binary files /dev/null and b/Models/CyberMitts/CapLongMittenRightYoked.png differ diff --git a/Models/CyberMitts/CuffForeLongMittenLeftCrossed.png b/Models/CyberMitts/CuffForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..494859aee Binary files /dev/null and b/Models/CyberMitts/CuffForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/CuffForeLongMittenLeftFront.png b/Models/CyberMitts/CuffForeLongMittenLeftFront.png new file mode 100644 index 000000000..23a60446a Binary files /dev/null and b/Models/CyberMitts/CuffForeLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/CuffForeLongMittenRightCrossed.png b/Models/CyberMitts/CuffForeLongMittenRightCrossed.png new file mode 100644 index 000000000..870abce60 Binary files /dev/null and b/Models/CyberMitts/CuffForeLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/CuffForeLongMittenRightFront.png b/Models/CyberMitts/CuffForeLongMittenRightFront.png new file mode 100644 index 000000000..1bcd91016 Binary files /dev/null and b/Models/CyberMitts/CuffForeLongMittenRightFront.png differ diff --git a/Models/CyberMitts/CuffLongMittenLeftBoxtie.png b/Models/CyberMitts/CuffLongMittenLeftBoxtie.png new file mode 100644 index 000000000..31e8f550a Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/CuffLongMittenLeftCrossed.png b/Models/CyberMitts/CuffLongMittenLeftCrossed.png new file mode 100644 index 000000000..387d503d2 Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/CuffLongMittenLeftFree.png b/Models/CyberMitts/CuffLongMittenLeftFree.png new file mode 100644 index 000000000..44c6f18fa Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenLeftFree.png differ diff --git a/Models/CyberMitts/CuffLongMittenLeftFront.png b/Models/CyberMitts/CuffLongMittenLeftFront.png new file mode 100644 index 000000000..eda1b6b86 Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/CuffLongMittenLeftUp.png b/Models/CyberMitts/CuffLongMittenLeftUp.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenLeftUp.png differ diff --git a/Models/CyberMitts/CuffLongMittenLeftWristtie.png b/Models/CyberMitts/CuffLongMittenLeftWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/CuffLongMittenLeftYoked.png b/Models/CyberMitts/CuffLongMittenLeftYoked.png new file mode 100644 index 000000000..de0730959 Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/CuffLongMittenRightBoxtie.png b/Models/CyberMitts/CuffLongMittenRightBoxtie.png new file mode 100644 index 000000000..a625efde9 Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/CuffLongMittenRightCrossed.png b/Models/CyberMitts/CuffLongMittenRightCrossed.png new file mode 100644 index 000000000..155559cdd Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/CuffLongMittenRightFree.png b/Models/CyberMitts/CuffLongMittenRightFree.png new file mode 100644 index 000000000..c1025fde0 Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenRightFree.png differ diff --git a/Models/CyberMitts/CuffLongMittenRightFront.png b/Models/CyberMitts/CuffLongMittenRightFront.png new file mode 100644 index 000000000..945775a58 Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenRightFront.png differ diff --git a/Models/CyberMitts/CuffLongMittenRightUp.png b/Models/CyberMitts/CuffLongMittenRightUp.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenRightUp.png differ diff --git a/Models/CyberMitts/CuffLongMittenRightWristtie.png b/Models/CyberMitts/CuffLongMittenRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/CuffLongMittenRightYoked.png b/Models/CyberMitts/CuffLongMittenRightYoked.png new file mode 100644 index 000000000..e0cccf348 Binary files /dev/null and b/Models/CyberMitts/CuffLongMittenRightYoked.png differ diff --git a/Models/CyberMitts/DisplayForeLongMittenLeftCrossed.png b/Models/CyberMitts/DisplayForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberMitts/DisplayForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/DisplayForeLongMittenLeftFront.png b/Models/CyberMitts/DisplayForeLongMittenLeftFront.png new file mode 100644 index 000000000..0a09fd0ae Binary files /dev/null and b/Models/CyberMitts/DisplayForeLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/DisplayForeLongMittenRightCrossed.png b/Models/CyberMitts/DisplayForeLongMittenRightCrossed.png new file mode 100644 index 000000000..ebd676384 Binary files /dev/null and b/Models/CyberMitts/DisplayForeLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/DisplayForeLongMittenRightFront.png b/Models/CyberMitts/DisplayForeLongMittenRightFront.png new file mode 100644 index 000000000..4fd42bcf2 Binary files /dev/null and b/Models/CyberMitts/DisplayForeLongMittenRightFront.png differ diff --git a/Models/CyberMitts/DisplayLongMittenLeftBoxtie.png b/Models/CyberMitts/DisplayLongMittenLeftBoxtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/DisplayLongMittenLeftCrossed.png b/Models/CyberMitts/DisplayLongMittenLeftCrossed.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/DisplayLongMittenLeftFree.png b/Models/CyberMitts/DisplayLongMittenLeftFree.png new file mode 100644 index 000000000..0c2d8c402 Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenLeftFree.png differ diff --git a/Models/CyberMitts/DisplayLongMittenLeftFront.png b/Models/CyberMitts/DisplayLongMittenLeftFront.png new file mode 100644 index 000000000..eda1b6b86 Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/DisplayLongMittenLeftUp.png b/Models/CyberMitts/DisplayLongMittenLeftUp.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenLeftUp.png differ diff --git a/Models/CyberMitts/DisplayLongMittenLeftWristtie.png b/Models/CyberMitts/DisplayLongMittenLeftWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/DisplayLongMittenLeftYoked.png b/Models/CyberMitts/DisplayLongMittenLeftYoked.png new file mode 100644 index 000000000..4b4c9809a Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/DisplayLongMittenRightBoxtie.png b/Models/CyberMitts/DisplayLongMittenRightBoxtie.png new file mode 100644 index 000000000..9872232cf Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/DisplayLongMittenRightCrossed.png b/Models/CyberMitts/DisplayLongMittenRightCrossed.png new file mode 100644 index 000000000..1f15ef235 Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/DisplayLongMittenRightFree.png b/Models/CyberMitts/DisplayLongMittenRightFree.png new file mode 100644 index 000000000..d8921da19 Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenRightFree.png differ diff --git a/Models/CyberMitts/DisplayLongMittenRightFront.png b/Models/CyberMitts/DisplayLongMittenRightFront.png new file mode 100644 index 000000000..6adff3a45 Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenRightFront.png differ diff --git a/Models/CyberMitts/DisplayLongMittenRightUp.png b/Models/CyberMitts/DisplayLongMittenRightUp.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenRightUp.png differ diff --git a/Models/CyberMitts/DisplayLongMittenRightWristtie.png b/Models/CyberMitts/DisplayLongMittenRightWristtie.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/DisplayLongMittenRightYoked.png b/Models/CyberMitts/DisplayLongMittenRightYoked.png new file mode 100644 index 000000000..6e77b79ff Binary files /dev/null and b/Models/CyberMitts/DisplayLongMittenRightYoked.png differ diff --git a/Models/CyberMitts/ForeLongMittenLeftCrossed.png b/Models/CyberMitts/ForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..119a3e192 Binary files /dev/null and b/Models/CyberMitts/ForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/ForeLongMittenLeftFront.png b/Models/CyberMitts/ForeLongMittenLeftFront.png new file mode 100644 index 000000000..be1aa2a51 Binary files /dev/null and b/Models/CyberMitts/ForeLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/ForeLongMittenRightCrossed.png b/Models/CyberMitts/ForeLongMittenRightCrossed.png new file mode 100644 index 000000000..ec4b6f4d0 Binary files /dev/null and b/Models/CyberMitts/ForeLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/ForeLongMittenRightFront.png b/Models/CyberMitts/ForeLongMittenRightFront.png new file mode 100644 index 000000000..643812707 Binary files /dev/null and b/Models/CyberMitts/ForeLongMittenRightFront.png differ diff --git a/Models/CyberMitts/ForeMittenLeftCrossed.png b/Models/CyberMitts/ForeMittenLeftCrossed.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/ForeMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/ForeMittenLeftFront.png b/Models/CyberMitts/ForeMittenLeftFront.png new file mode 100644 index 000000000..39136c502 Binary files /dev/null and b/Models/CyberMitts/ForeMittenLeftFront.png differ diff --git a/Models/CyberMitts/ForeMittenRightCrossed.png b/Models/CyberMitts/ForeMittenRightCrossed.png new file mode 100644 index 000000000..fdcd1718c Binary files /dev/null and b/Models/CyberMitts/ForeMittenRightCrossed.png differ diff --git a/Models/CyberMitts/ForeMittenRightFront.png b/Models/CyberMitts/ForeMittenRightFront.png new file mode 100644 index 000000000..8ef5dc26d Binary files /dev/null and b/Models/CyberMitts/ForeMittenRightFront.png differ diff --git a/Models/CyberMitts/GlowForeLongMittenLeftCrossed.png b/Models/CyberMitts/GlowForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..494859aee Binary files /dev/null and b/Models/CyberMitts/GlowForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/GlowForeLongMittenLeftFront.png b/Models/CyberMitts/GlowForeLongMittenLeftFront.png new file mode 100644 index 000000000..da461c0a3 Binary files /dev/null and b/Models/CyberMitts/GlowForeLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/GlowForeLongMittenRightCrossed.png b/Models/CyberMitts/GlowForeLongMittenRightCrossed.png new file mode 100644 index 000000000..280446ad1 Binary files /dev/null and b/Models/CyberMitts/GlowForeLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/GlowForeLongMittenRightFront.png b/Models/CyberMitts/GlowForeLongMittenRightFront.png new file mode 100644 index 000000000..6d2d4b8e4 Binary files /dev/null and b/Models/CyberMitts/GlowForeLongMittenRightFront.png differ diff --git a/Models/CyberMitts/GlowLongMittenLeftBoxtie.png b/Models/CyberMitts/GlowLongMittenLeftBoxtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/GlowLongMittenLeftCrossed.png b/Models/CyberMitts/GlowLongMittenLeftCrossed.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/GlowLongMittenLeftFree.png b/Models/CyberMitts/GlowLongMittenLeftFree.png new file mode 100644 index 000000000..17677225e Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenLeftFree.png differ diff --git a/Models/CyberMitts/GlowLongMittenLeftFront.png b/Models/CyberMitts/GlowLongMittenLeftFront.png new file mode 100644 index 000000000..eda1b6b86 Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/GlowLongMittenLeftUp.png b/Models/CyberMitts/GlowLongMittenLeftUp.png new file mode 100644 index 000000000..9f23b9e1c Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenLeftUp.png differ diff --git a/Models/CyberMitts/GlowLongMittenLeftWristtie.png b/Models/CyberMitts/GlowLongMittenLeftWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/GlowLongMittenLeftYoked.png b/Models/CyberMitts/GlowLongMittenLeftYoked.png new file mode 100644 index 000000000..a58133a7f Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/GlowLongMittenRightBoxtie.png b/Models/CyberMitts/GlowLongMittenRightBoxtie.png new file mode 100644 index 000000000..a625efde9 Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/GlowLongMittenRightCrossed.png b/Models/CyberMitts/GlowLongMittenRightCrossed.png new file mode 100644 index 000000000..155559cdd Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/GlowLongMittenRightFree.png b/Models/CyberMitts/GlowLongMittenRightFree.png new file mode 100644 index 000000000..e1592eed9 Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenRightFree.png differ diff --git a/Models/CyberMitts/GlowLongMittenRightFront.png b/Models/CyberMitts/GlowLongMittenRightFront.png new file mode 100644 index 000000000..945775a58 Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenRightFront.png differ diff --git a/Models/CyberMitts/GlowLongMittenRightUp.png b/Models/CyberMitts/GlowLongMittenRightUp.png new file mode 100644 index 000000000..782f04632 Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenRightUp.png differ diff --git a/Models/CyberMitts/GlowLongMittenRightWristtie.png b/Models/CyberMitts/GlowLongMittenRightWristtie.png new file mode 100644 index 000000000..2488b9c99 Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/GlowLongMittenRightYoked.png b/Models/CyberMitts/GlowLongMittenRightYoked.png new file mode 100644 index 000000000..836dec0e0 Binary files /dev/null and b/Models/CyberMitts/GlowLongMittenRightYoked.png differ diff --git a/Models/CyberMitts/LockForeLongMittenLeftCrossed.png b/Models/CyberMitts/LockForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..494859aee Binary files /dev/null and b/Models/CyberMitts/LockForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/LockForeLongMittenLeftFront.png b/Models/CyberMitts/LockForeLongMittenLeftFront.png new file mode 100644 index 000000000..9a75ffd96 Binary files /dev/null and b/Models/CyberMitts/LockForeLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/LockForeLongMittenRightCrossed.png b/Models/CyberMitts/LockForeLongMittenRightCrossed.png new file mode 100644 index 000000000..64ae200c5 Binary files /dev/null and b/Models/CyberMitts/LockForeLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/LockForeLongMittenRightFront.png b/Models/CyberMitts/LockForeLongMittenRightFront.png new file mode 100644 index 000000000..9d8ce7671 Binary files /dev/null and b/Models/CyberMitts/LockForeLongMittenRightFront.png differ diff --git a/Models/CyberMitts/LockLongMittenLeftBoxtie.png b/Models/CyberMitts/LockLongMittenLeftBoxtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/LockLongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/LockLongMittenLeftCrossed.png b/Models/CyberMitts/LockLongMittenLeftCrossed.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/LockLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/LockLongMittenLeftFree.png b/Models/CyberMitts/LockLongMittenLeftFree.png new file mode 100644 index 000000000..095d0a42f Binary files /dev/null and b/Models/CyberMitts/LockLongMittenLeftFree.png differ diff --git a/Models/CyberMitts/LockLongMittenLeftFront.png b/Models/CyberMitts/LockLongMittenLeftFront.png new file mode 100644 index 000000000..eda1b6b86 Binary files /dev/null and b/Models/CyberMitts/LockLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/LockLongMittenLeftUp.png b/Models/CyberMitts/LockLongMittenLeftUp.png new file mode 100644 index 000000000..690f7f15c Binary files /dev/null and b/Models/CyberMitts/LockLongMittenLeftUp.png differ diff --git a/Models/CyberMitts/LockLongMittenLeftWristtie.png b/Models/CyberMitts/LockLongMittenLeftWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/LockLongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/LockLongMittenLeftYoked.png b/Models/CyberMitts/LockLongMittenLeftYoked.png new file mode 100644 index 000000000..4b4c9809a Binary files /dev/null and b/Models/CyberMitts/LockLongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/LockLongMittenRightBoxtie.png b/Models/CyberMitts/LockLongMittenRightBoxtie.png new file mode 100644 index 000000000..fac752889 Binary files /dev/null and b/Models/CyberMitts/LockLongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/LockLongMittenRightCrossed.png b/Models/CyberMitts/LockLongMittenRightCrossed.png new file mode 100644 index 000000000..1d829011a Binary files /dev/null and b/Models/CyberMitts/LockLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/LockLongMittenRightFree.png b/Models/CyberMitts/LockLongMittenRightFree.png new file mode 100644 index 000000000..abe066330 Binary files /dev/null and b/Models/CyberMitts/LockLongMittenRightFree.png differ diff --git a/Models/CyberMitts/LockLongMittenRightFront.png b/Models/CyberMitts/LockLongMittenRightFront.png new file mode 100644 index 000000000..525f02b4c Binary files /dev/null and b/Models/CyberMitts/LockLongMittenRightFront.png differ diff --git a/Models/CyberMitts/LockLongMittenRightUp.png b/Models/CyberMitts/LockLongMittenRightUp.png new file mode 100644 index 000000000..690f7f15c Binary files /dev/null and b/Models/CyberMitts/LockLongMittenRightUp.png differ diff --git a/Models/CyberMitts/LockLongMittenRightWristtie.png b/Models/CyberMitts/LockLongMittenRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/LockLongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/LockLongMittenRightYoked.png b/Models/CyberMitts/LockLongMittenRightYoked.png new file mode 100644 index 000000000..6e77b79ff Binary files /dev/null and b/Models/CyberMitts/LockLongMittenRightYoked.png differ diff --git a/Models/CyberMitts/LongMittenLeftBoxtie.png b/Models/CyberMitts/LongMittenLeftBoxtie.png new file mode 100644 index 000000000..393e27007 Binary files /dev/null and b/Models/CyberMitts/LongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/LongMittenLeftCrossed.png b/Models/CyberMitts/LongMittenLeftCrossed.png new file mode 100644 index 000000000..8ce58decf Binary files /dev/null and b/Models/CyberMitts/LongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/LongMittenLeftFree.png b/Models/CyberMitts/LongMittenLeftFree.png new file mode 100644 index 000000000..7ef91bc29 Binary files /dev/null and b/Models/CyberMitts/LongMittenLeftFree.png differ diff --git a/Models/CyberMitts/LongMittenLeftFront.png b/Models/CyberMitts/LongMittenLeftFront.png new file mode 100644 index 000000000..0c724850b Binary files /dev/null and b/Models/CyberMitts/LongMittenLeftFront.png differ diff --git a/Models/CyberMitts/LongMittenLeftUp.png b/Models/CyberMitts/LongMittenLeftUp.png new file mode 100644 index 000000000..2900d78a4 Binary files /dev/null and b/Models/CyberMitts/LongMittenLeftUp.png differ diff --git a/Models/CyberMitts/LongMittenLeftWristtie.png b/Models/CyberMitts/LongMittenLeftWristtie.png new file mode 100644 index 000000000..1908fa51d Binary files /dev/null and b/Models/CyberMitts/LongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/LongMittenLeftYoked.png b/Models/CyberMitts/LongMittenLeftYoked.png new file mode 100644 index 000000000..a14455a6a Binary files /dev/null and b/Models/CyberMitts/LongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/LongMittenRightBoxtie.png b/Models/CyberMitts/LongMittenRightBoxtie.png new file mode 100644 index 000000000..df949077d Binary files /dev/null and b/Models/CyberMitts/LongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/LongMittenRightCrossed.png b/Models/CyberMitts/LongMittenRightCrossed.png new file mode 100644 index 000000000..9fb245db3 Binary files /dev/null and b/Models/CyberMitts/LongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/LongMittenRightFree.png b/Models/CyberMitts/LongMittenRightFree.png new file mode 100644 index 000000000..443649c82 Binary files /dev/null and b/Models/CyberMitts/LongMittenRightFree.png differ diff --git a/Models/CyberMitts/LongMittenRightFront.png b/Models/CyberMitts/LongMittenRightFront.png new file mode 100644 index 000000000..21beea4c0 Binary files /dev/null and b/Models/CyberMitts/LongMittenRightFront.png differ diff --git a/Models/CyberMitts/LongMittenRightUp.png b/Models/CyberMitts/LongMittenRightUp.png new file mode 100644 index 000000000..e23db4e62 Binary files /dev/null and b/Models/CyberMitts/LongMittenRightUp.png differ diff --git a/Models/CyberMitts/LongMittenRightWristtie.png b/Models/CyberMitts/LongMittenRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/LongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/LongMittenRightYoked.png b/Models/CyberMitts/LongMittenRightYoked.png new file mode 100644 index 000000000..76bc09f1e Binary files /dev/null and b/Models/CyberMitts/LongMittenRightYoked.png differ diff --git a/Models/CyberMitts/MittenLeftBoxtie.png b/Models/CyberMitts/MittenLeftBoxtie.png new file mode 100644 index 000000000..6af9ea011 Binary files /dev/null and b/Models/CyberMitts/MittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/MittenLeftCrossed.png b/Models/CyberMitts/MittenLeftCrossed.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/MittenLeftCrossed.png differ diff --git a/Models/CyberMitts/MittenLeftFree.png b/Models/CyberMitts/MittenLeftFree.png new file mode 100644 index 000000000..af51cac44 Binary files /dev/null and b/Models/CyberMitts/MittenLeftFree.png differ diff --git a/Models/CyberMitts/MittenLeftFront.png b/Models/CyberMitts/MittenLeftFront.png new file mode 100644 index 000000000..eda1b6b86 Binary files /dev/null and b/Models/CyberMitts/MittenLeftFront.png differ diff --git a/Models/CyberMitts/MittenLeftUp.png b/Models/CyberMitts/MittenLeftUp.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/MittenLeftUp.png differ diff --git a/Models/CyberMitts/MittenLeftWristtie.png b/Models/CyberMitts/MittenLeftWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/MittenLeftWristtie.png differ diff --git a/Models/CyberMitts/MittenLeftYoked.png b/Models/CyberMitts/MittenLeftYoked.png new file mode 100644 index 000000000..a450910bd Binary files /dev/null and b/Models/CyberMitts/MittenLeftYoked.png differ diff --git a/Models/CyberMitts/MittenRightBoxtie.png b/Models/CyberMitts/MittenRightBoxtie.png new file mode 100644 index 000000000..293197629 Binary files /dev/null and b/Models/CyberMitts/MittenRightBoxtie.png differ diff --git a/Models/CyberMitts/MittenRightCrossed.png b/Models/CyberMitts/MittenRightCrossed.png new file mode 100644 index 000000000..155559cdd Binary files /dev/null and b/Models/CyberMitts/MittenRightCrossed.png differ diff --git a/Models/CyberMitts/MittenRightFree.png b/Models/CyberMitts/MittenRightFree.png new file mode 100644 index 000000000..a3fead26d Binary files /dev/null and b/Models/CyberMitts/MittenRightFree.png differ diff --git a/Models/CyberMitts/MittenRightFront.png b/Models/CyberMitts/MittenRightFront.png new file mode 100644 index 000000000..945775a58 Binary files /dev/null and b/Models/CyberMitts/MittenRightFront.png differ diff --git a/Models/CyberMitts/MittenRightUp.png b/Models/CyberMitts/MittenRightUp.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/MittenRightUp.png differ diff --git a/Models/CyberMitts/MittenRightWristtie.png b/Models/CyberMitts/MittenRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/MittenRightWristtie.png differ diff --git a/Models/CyberMitts/MittenRightYoked.png b/Models/CyberMitts/MittenRightYoked.png new file mode 100644 index 000000000..f132a9555 Binary files /dev/null and b/Models/CyberMitts/MittenRightYoked.png differ diff --git a/Models/CyberMitts/StrapsForeLongMittenLeftCrossed.png b/Models/CyberMitts/StrapsForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..b465b883a Binary files /dev/null and b/Models/CyberMitts/StrapsForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/StrapsForeLongMittenLeftFront.png b/Models/CyberMitts/StrapsForeLongMittenLeftFront.png new file mode 100644 index 000000000..a906c96f7 Binary files /dev/null and b/Models/CyberMitts/StrapsForeLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/StrapsForeLongMittenRightCrossed.png b/Models/CyberMitts/StrapsForeLongMittenRightCrossed.png new file mode 100644 index 000000000..2ca3b8009 Binary files /dev/null and b/Models/CyberMitts/StrapsForeLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/StrapsForeLongMittenRightFront.png b/Models/CyberMitts/StrapsForeLongMittenRightFront.png new file mode 100644 index 000000000..9000b6b6b Binary files /dev/null and b/Models/CyberMitts/StrapsForeLongMittenRightFront.png differ diff --git a/Models/CyberMitts/StrapsLongMittenLeftBoxtie.png b/Models/CyberMitts/StrapsLongMittenLeftBoxtie.png new file mode 100644 index 000000000..c830987d4 Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/StrapsLongMittenLeftCrossed.png b/Models/CyberMitts/StrapsLongMittenLeftCrossed.png new file mode 100644 index 000000000..f031e015b Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/StrapsLongMittenLeftFree.png b/Models/CyberMitts/StrapsLongMittenLeftFree.png new file mode 100644 index 000000000..0b7cf3bd2 Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenLeftFree.png differ diff --git a/Models/CyberMitts/StrapsLongMittenLeftFront.png b/Models/CyberMitts/StrapsLongMittenLeftFront.png new file mode 100644 index 000000000..ce3bc8ebe Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/StrapsLongMittenLeftUp.png b/Models/CyberMitts/StrapsLongMittenLeftUp.png new file mode 100644 index 000000000..0ab06cf80 Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenLeftUp.png differ diff --git a/Models/CyberMitts/StrapsLongMittenLeftWristtie.png b/Models/CyberMitts/StrapsLongMittenLeftWristtie.png new file mode 100644 index 000000000..4464177d0 Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/StrapsLongMittenLeftYoked.png b/Models/CyberMitts/StrapsLongMittenLeftYoked.png new file mode 100644 index 000000000..44e42eef7 Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/StrapsLongMittenRightBoxtie.png b/Models/CyberMitts/StrapsLongMittenRightBoxtie.png new file mode 100644 index 000000000..fb6fbdbc4 Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/StrapsLongMittenRightCrossed.png b/Models/CyberMitts/StrapsLongMittenRightCrossed.png new file mode 100644 index 000000000..be94ee6ff Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/StrapsLongMittenRightFree.png b/Models/CyberMitts/StrapsLongMittenRightFree.png new file mode 100644 index 000000000..b9ac17e2a Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenRightFree.png differ diff --git a/Models/CyberMitts/StrapsLongMittenRightFront.png b/Models/CyberMitts/StrapsLongMittenRightFront.png new file mode 100644 index 000000000..41a123fa1 Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenRightFront.png differ diff --git a/Models/CyberMitts/StrapsLongMittenRightUp.png b/Models/CyberMitts/StrapsLongMittenRightUp.png new file mode 100644 index 000000000..bafc64407 Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenRightUp.png differ diff --git a/Models/CyberMitts/StrapsLongMittenRightWristtie.png b/Models/CyberMitts/StrapsLongMittenRightWristtie.png new file mode 100644 index 000000000..35964f3e0 Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/StrapsLongMittenRightYoked.png b/Models/CyberMitts/StrapsLongMittenRightYoked.png new file mode 100644 index 000000000..7b7560e24 Binary files /dev/null and b/Models/CyberMitts/StrapsLongMittenRightYoked.png differ diff --git a/Models/CyberMitts/UpperCuffForeLongMittenLeftCrossed.png b/Models/CyberMitts/UpperCuffForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..494859aee Binary files /dev/null and b/Models/CyberMitts/UpperCuffForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/UpperCuffForeLongMittenLeftFront.png b/Models/CyberMitts/UpperCuffForeLongMittenLeftFront.png new file mode 100644 index 000000000..4503562e7 Binary files /dev/null and b/Models/CyberMitts/UpperCuffForeLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/UpperCuffForeLongMittenRightCrossed.png b/Models/CyberMitts/UpperCuffForeLongMittenRightCrossed.png new file mode 100644 index 000000000..bbf99a8b3 Binary files /dev/null and b/Models/CyberMitts/UpperCuffForeLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/UpperCuffForeLongMittenRightFront.png b/Models/CyberMitts/UpperCuffForeLongMittenRightFront.png new file mode 100644 index 000000000..edaee2c8e Binary files /dev/null and b/Models/CyberMitts/UpperCuffForeLongMittenRightFront.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenLeftBoxtie.png b/Models/CyberMitts/UpperCuffLongMittenLeftBoxtie.png new file mode 100644 index 000000000..31e8f550a Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenLeftCrossed.png b/Models/CyberMitts/UpperCuffLongMittenLeftCrossed.png new file mode 100644 index 000000000..46cebb85b Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenLeftFree.png b/Models/CyberMitts/UpperCuffLongMittenLeftFree.png new file mode 100644 index 000000000..fbb87ae36 Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenLeftFree.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenLeftFront.png b/Models/CyberMitts/UpperCuffLongMittenLeftFront.png new file mode 100644 index 000000000..427fb896b Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenLeftUp.png b/Models/CyberMitts/UpperCuffLongMittenLeftUp.png new file mode 100644 index 000000000..00db4f54f Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenLeftUp.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenLeftWristtie.png b/Models/CyberMitts/UpperCuffLongMittenLeftWristtie.png new file mode 100644 index 000000000..88b27c305 Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenLeftYoked.png b/Models/CyberMitts/UpperCuffLongMittenLeftYoked.png new file mode 100644 index 000000000..645f2bd55 Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenRightBoxtie.png b/Models/CyberMitts/UpperCuffLongMittenRightBoxtie.png new file mode 100644 index 000000000..6aebc520a Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenRightCrossed.png b/Models/CyberMitts/UpperCuffLongMittenRightCrossed.png new file mode 100644 index 000000000..7c528a7d1 Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenRightFree.png b/Models/CyberMitts/UpperCuffLongMittenRightFree.png new file mode 100644 index 000000000..2a299a754 Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenRightFree.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenRightFront.png b/Models/CyberMitts/UpperCuffLongMittenRightFront.png new file mode 100644 index 000000000..b6dd81790 Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenRightFront.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenRightUp.png b/Models/CyberMitts/UpperCuffLongMittenRightUp.png new file mode 100644 index 000000000..be19eb992 Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenRightUp.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenRightWristtie.png b/Models/CyberMitts/UpperCuffLongMittenRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/UpperCuffLongMittenRightYoked.png b/Models/CyberMitts/UpperCuffLongMittenRightYoked.png new file mode 100644 index 000000000..05b191a56 Binary files /dev/null and b/Models/CyberMitts/UpperCuffLongMittenRightYoked.png differ diff --git a/Models/CyberMitts/UpperDisplayForeLongMittenLeftCrossed.png b/Models/CyberMitts/UpperDisplayForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/UpperDisplayForeLongMittenLeftFront.png b/Models/CyberMitts/UpperDisplayForeLongMittenLeftFront.png new file mode 100644 index 000000000..0a09fd0ae Binary files /dev/null and b/Models/CyberMitts/UpperDisplayForeLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/UpperDisplayForeLongMittenRightCrossed.png b/Models/CyberMitts/UpperDisplayForeLongMittenRightCrossed.png new file mode 100644 index 000000000..ebd676384 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayForeLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/UpperDisplayForeLongMittenRightFront.png b/Models/CyberMitts/UpperDisplayForeLongMittenRightFront.png new file mode 100644 index 000000000..4fd42bcf2 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayForeLongMittenRightFront.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenLeftBoxtie.png b/Models/CyberMitts/UpperDisplayLongMittenLeftBoxtie.png new file mode 100644 index 000000000..6d6d75519 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenLeftCrossed.png b/Models/CyberMitts/UpperDisplayLongMittenLeftCrossed.png new file mode 100644 index 000000000..a6d481524 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenLeftFree.png b/Models/CyberMitts/UpperDisplayLongMittenLeftFree.png new file mode 100644 index 000000000..f1af72b4c Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenLeftFree.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenLeftFront.png b/Models/CyberMitts/UpperDisplayLongMittenLeftFront.png new file mode 100644 index 000000000..b42442c54 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenLeftUp.png b/Models/CyberMitts/UpperDisplayLongMittenLeftUp.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenLeftUp.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenLeftWristtie.png b/Models/CyberMitts/UpperDisplayLongMittenLeftWristtie.png new file mode 100644 index 000000000..3466a13fd Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenLeftYoked.png b/Models/CyberMitts/UpperDisplayLongMittenLeftYoked.png new file mode 100644 index 000000000..2eb05894e Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenRightBoxtie.png b/Models/CyberMitts/UpperDisplayLongMittenRightBoxtie.png new file mode 100644 index 000000000..9872232cf Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenRightCrossed.png b/Models/CyberMitts/UpperDisplayLongMittenRightCrossed.png new file mode 100644 index 000000000..1f15ef235 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenRightFree.png b/Models/CyberMitts/UpperDisplayLongMittenRightFree.png new file mode 100644 index 000000000..d8921da19 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenRightFree.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenRightFront.png b/Models/CyberMitts/UpperDisplayLongMittenRightFront.png new file mode 100644 index 000000000..6adff3a45 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenRightFront.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenRightUp.png b/Models/CyberMitts/UpperDisplayLongMittenRightUp.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenRightUp.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenRightWristtie.png b/Models/CyberMitts/UpperDisplayLongMittenRightWristtie.png new file mode 100644 index 000000000..12d5369a6 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/UpperDisplayLongMittenRightYoked.png b/Models/CyberMitts/UpperDisplayLongMittenRightYoked.png new file mode 100644 index 000000000..db4743de7 Binary files /dev/null and b/Models/CyberMitts/UpperDisplayLongMittenRightYoked.png differ diff --git a/Models/CyberMitts/UpperGlowForeLongMittenLeftCrossed.png b/Models/CyberMitts/UpperGlowForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..494859aee Binary files /dev/null and b/Models/CyberMitts/UpperGlowForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/UpperGlowForeLongMittenLeftFront.png b/Models/CyberMitts/UpperGlowForeLongMittenLeftFront.png new file mode 100644 index 000000000..4503562e7 Binary files /dev/null and b/Models/CyberMitts/UpperGlowForeLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/UpperGlowForeLongMittenRightCrossed.png b/Models/CyberMitts/UpperGlowForeLongMittenRightCrossed.png new file mode 100644 index 000000000..280446ad1 Binary files /dev/null and b/Models/CyberMitts/UpperGlowForeLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/UpperGlowForeLongMittenRightFront.png b/Models/CyberMitts/UpperGlowForeLongMittenRightFront.png new file mode 100644 index 000000000..edaee2c8e Binary files /dev/null and b/Models/CyberMitts/UpperGlowForeLongMittenRightFront.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenLeftBoxtie.png b/Models/CyberMitts/UpperGlowLongMittenLeftBoxtie.png new file mode 100644 index 000000000..5241cba96 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenLeftCrossed.png b/Models/CyberMitts/UpperGlowLongMittenLeftCrossed.png new file mode 100644 index 000000000..03fdde0a8 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenLeftFree.png b/Models/CyberMitts/UpperGlowLongMittenLeftFree.png new file mode 100644 index 000000000..93b493082 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenLeftFree.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenLeftFront.png b/Models/CyberMitts/UpperGlowLongMittenLeftFront.png new file mode 100644 index 000000000..f07207b96 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenLeftUp.png b/Models/CyberMitts/UpperGlowLongMittenLeftUp.png new file mode 100644 index 000000000..9f23b9e1c Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenLeftUp.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenLeftWristtie.png b/Models/CyberMitts/UpperGlowLongMittenLeftWristtie.png new file mode 100644 index 000000000..e3ca2fca9 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenLeftYoked.png b/Models/CyberMitts/UpperGlowLongMittenLeftYoked.png new file mode 100644 index 000000000..7ae204d74 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenRightBoxtie.png b/Models/CyberMitts/UpperGlowLongMittenRightBoxtie.png new file mode 100644 index 000000000..7fa92adf0 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenRightCrossed.png b/Models/CyberMitts/UpperGlowLongMittenRightCrossed.png new file mode 100644 index 000000000..6fa97ee91 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenRightFree.png b/Models/CyberMitts/UpperGlowLongMittenRightFree.png new file mode 100644 index 000000000..2a299a754 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenRightFree.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenRightFront.png b/Models/CyberMitts/UpperGlowLongMittenRightFront.png new file mode 100644 index 000000000..c38965d49 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenRightFront.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenRightUp.png b/Models/CyberMitts/UpperGlowLongMittenRightUp.png new file mode 100644 index 000000000..782f04632 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenRightUp.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenRightWristtie.png b/Models/CyberMitts/UpperGlowLongMittenRightWristtie.png new file mode 100644 index 000000000..2488b9c99 Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/UpperGlowLongMittenRightYoked.png b/Models/CyberMitts/UpperGlowLongMittenRightYoked.png new file mode 100644 index 000000000..f6787110b Binary files /dev/null and b/Models/CyberMitts/UpperGlowLongMittenRightYoked.png differ diff --git a/Models/CyberMitts/UpperLockForeLongMittenLeftCrossed.png b/Models/CyberMitts/UpperLockForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..494859aee Binary files /dev/null and b/Models/CyberMitts/UpperLockForeLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/UpperLockForeLongMittenLeftFront.png b/Models/CyberMitts/UpperLockForeLongMittenLeftFront.png new file mode 100644 index 000000000..9a75ffd96 Binary files /dev/null and b/Models/CyberMitts/UpperLockForeLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/UpperLockForeLongMittenRightCrossed.png b/Models/CyberMitts/UpperLockForeLongMittenRightCrossed.png new file mode 100644 index 000000000..64ae200c5 Binary files /dev/null and b/Models/CyberMitts/UpperLockForeLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/UpperLockForeLongMittenRightFront.png b/Models/CyberMitts/UpperLockForeLongMittenRightFront.png new file mode 100644 index 000000000..9d8ce7671 Binary files /dev/null and b/Models/CyberMitts/UpperLockForeLongMittenRightFront.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenLeftBoxtie.png b/Models/CyberMitts/UpperLockLongMittenLeftBoxtie.png new file mode 100644 index 000000000..ee3bd6c6e Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenLeftBoxtie.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenLeftCrossed.png b/Models/CyberMitts/UpperLockLongMittenLeftCrossed.png new file mode 100644 index 000000000..e95ff3f9f Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenLeftCrossed.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenLeftFree.png b/Models/CyberMitts/UpperLockLongMittenLeftFree.png new file mode 100644 index 000000000..4206c373e Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenLeftFree.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenLeftFront.png b/Models/CyberMitts/UpperLockLongMittenLeftFront.png new file mode 100644 index 000000000..0b8cf2ccb Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenLeftFront.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenLeftUp.png b/Models/CyberMitts/UpperLockLongMittenLeftUp.png new file mode 100644 index 000000000..690f7f15c Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenLeftUp.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenLeftWristtie.png b/Models/CyberMitts/UpperLockLongMittenLeftWristtie.png new file mode 100644 index 000000000..e173424ba Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenLeftWristtie.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenLeftYoked.png b/Models/CyberMitts/UpperLockLongMittenLeftYoked.png new file mode 100644 index 000000000..2578cb65d Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenLeftYoked.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenRightBoxtie.png b/Models/CyberMitts/UpperLockLongMittenRightBoxtie.png new file mode 100644 index 000000000..fac752889 Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenRightBoxtie.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenRightCrossed.png b/Models/CyberMitts/UpperLockLongMittenRightCrossed.png new file mode 100644 index 000000000..1d829011a Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenRightCrossed.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenRightFree.png b/Models/CyberMitts/UpperLockLongMittenRightFree.png new file mode 100644 index 000000000..abe066330 Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenRightFree.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenRightFront.png b/Models/CyberMitts/UpperLockLongMittenRightFront.png new file mode 100644 index 000000000..525f02b4c Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenRightFront.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenRightUp.png b/Models/CyberMitts/UpperLockLongMittenRightUp.png new file mode 100644 index 000000000..690f7f15c Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenRightUp.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenRightWristtie.png b/Models/CyberMitts/UpperLockLongMittenRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenRightWristtie.png differ diff --git a/Models/CyberMitts/UpperLockLongMittenRightYoked.png b/Models/CyberMitts/UpperLockLongMittenRightYoked.png new file mode 100644 index 000000000..ebb0920d4 Binary files /dev/null and b/Models/CyberMitts/UpperLockLongMittenRightYoked.png differ diff --git a/Models/CyberPetsuit/Arms.png b/Models/CyberPetsuit/Arms.png new file mode 100644 index 000000000..38d8325c8 Binary files /dev/null and b/Models/CyberPetsuit/Arms.png differ diff --git a/Models/CyberPetsuit/ArmsBelts.png b/Models/CyberPetsuit/ArmsBelts.png new file mode 100644 index 000000000..30c96cc9a Binary files /dev/null and b/Models/CyberPetsuit/ArmsBelts.png differ diff --git a/Models/CyberPetsuit/DisplayArms.png b/Models/CyberPetsuit/DisplayArms.png new file mode 100644 index 000000000..2abd97312 Binary files /dev/null and b/Models/CyberPetsuit/DisplayArms.png differ diff --git a/Models/CyberPetsuit/DisplayLeftLegsKneel.png b/Models/CyberPetsuit/DisplayLeftLegsKneel.png new file mode 100644 index 000000000..29e1daa9f Binary files /dev/null and b/Models/CyberPetsuit/DisplayLeftLegsKneel.png differ diff --git a/Models/CyberPetsuit/DisplayLeftLegsKneelClosed.png b/Models/CyberPetsuit/DisplayLeftLegsKneelClosed.png new file mode 100644 index 000000000..29e1daa9f Binary files /dev/null and b/Models/CyberPetsuit/DisplayLeftLegsKneelClosed.png differ diff --git a/Models/CyberPetsuit/DisplayLegsHogtie.png b/Models/CyberPetsuit/DisplayLegsHogtie.png new file mode 100644 index 000000000..446b5e9e3 Binary files /dev/null and b/Models/CyberPetsuit/DisplayLegsHogtie.png differ diff --git a/Models/CyberPetsuit/DisplayLegsKneel.png b/Models/CyberPetsuit/DisplayLegsKneel.png new file mode 100644 index 000000000..7f3b9523a Binary files /dev/null and b/Models/CyberPetsuit/DisplayLegsKneel.png differ diff --git a/Models/CyberPetsuit/DisplayLegsKneelClosed.png b/Models/CyberPetsuit/DisplayLegsKneelClosed.png new file mode 100644 index 000000000..7f3b9523a Binary files /dev/null and b/Models/CyberPetsuit/DisplayLegsKneelClosed.png differ diff --git a/Models/CyberPetsuit/LeftLegsBeltsKneel.png b/Models/CyberPetsuit/LeftLegsBeltsKneel.png new file mode 100644 index 000000000..9120d578e Binary files /dev/null and b/Models/CyberPetsuit/LeftLegsBeltsKneel.png differ diff --git a/Models/CyberPetsuit/LeftLegsBeltsKneelClosed.png b/Models/CyberPetsuit/LeftLegsBeltsKneelClosed.png new file mode 100644 index 000000000..6c55c86b3 Binary files /dev/null and b/Models/CyberPetsuit/LeftLegsBeltsKneelClosed.png differ diff --git a/Models/CyberPetsuit/LeftLegsKneel.png b/Models/CyberPetsuit/LeftLegsKneel.png new file mode 100644 index 000000000..02923d362 Binary files /dev/null and b/Models/CyberPetsuit/LeftLegsKneel.png differ diff --git a/Models/CyberPetsuit/LeftLegsKneelClosed.png b/Models/CyberPetsuit/LeftLegsKneelClosed.png new file mode 100644 index 000000000..a81e7a072 Binary files /dev/null and b/Models/CyberPetsuit/LeftLegsKneelClosed.png differ diff --git a/Models/CyberPetsuit/LegsBeltsHogtie.png b/Models/CyberPetsuit/LegsBeltsHogtie.png new file mode 100644 index 000000000..69f7ed682 Binary files /dev/null and b/Models/CyberPetsuit/LegsBeltsHogtie.png differ diff --git a/Models/CyberPetsuit/LegsBeltsKneel.png b/Models/CyberPetsuit/LegsBeltsKneel.png new file mode 100644 index 000000000..adc54d49b Binary files /dev/null and b/Models/CyberPetsuit/LegsBeltsKneel.png differ diff --git a/Models/CyberPetsuit/LegsBeltsKneelClosed.png b/Models/CyberPetsuit/LegsBeltsKneelClosed.png new file mode 100644 index 000000000..adc54d49b Binary files /dev/null and b/Models/CyberPetsuit/LegsBeltsKneelClosed.png differ diff --git a/Models/CyberPetsuit/LegsHogtie.png b/Models/CyberPetsuit/LegsHogtie.png new file mode 100644 index 000000000..8c75675b0 Binary files /dev/null and b/Models/CyberPetsuit/LegsHogtie.png differ diff --git a/Models/CyberPetsuit/LegsKneel.png b/Models/CyberPetsuit/LegsKneel.png new file mode 100644 index 000000000..1f5df168c Binary files /dev/null and b/Models/CyberPetsuit/LegsKneel.png differ diff --git a/Models/CyberPetsuit/LegsKneelClosed.png b/Models/CyberPetsuit/LegsKneelClosed.png new file mode 100644 index 000000000..0d283cc35 Binary files /dev/null and b/Models/CyberPetsuit/LegsKneelClosed.png differ diff --git a/Models/CyberPetsuit/Petsuit.png b/Models/CyberPetsuit/Petsuit.png new file mode 100644 index 000000000..69f7ed682 Binary files /dev/null and b/Models/CyberPetsuit/Petsuit.png differ diff --git a/Models/CyberPetsuit/StrapsArms.png b/Models/CyberPetsuit/StrapsArms.png new file mode 100644 index 000000000..30c96cc9a Binary files /dev/null and b/Models/CyberPetsuit/StrapsArms.png differ diff --git a/Models/DivineBelt/BeltBase.png b/Models/DivineBelt/BeltBase.png new file mode 100644 index 000000000..6f9c3bbe2 Binary files /dev/null and b/Models/DivineBelt/BeltBase.png differ diff --git a/Models/DivineBelt/BeltBaseNoLock.png b/Models/DivineBelt/BeltBaseNoLock.png new file mode 100644 index 000000000..9961b1fa7 Binary files /dev/null and b/Models/DivineBelt/BeltBaseNoLock.png differ diff --git a/Models/DivineBelt/BeltLines.png b/Models/DivineBelt/BeltLines.png new file mode 100644 index 000000000..6ea5ac086 Binary files /dev/null and b/Models/DivineBelt/BeltLines.png differ diff --git a/Models/DivineBelt/BeltMetal1.png b/Models/DivineBelt/BeltMetal1.png new file mode 100644 index 000000000..9c8fc8e20 Binary files /dev/null and b/Models/DivineBelt/BeltMetal1.png differ diff --git a/Models/DivineBelt/BeltMetal2.png b/Models/DivineBelt/BeltMetal2.png new file mode 100644 index 000000000..6c36e45ee Binary files /dev/null and b/Models/DivineBelt/BeltMetal2.png differ diff --git a/Models/DivineBelt/BeltMetalRunic1.png b/Models/DivineBelt/BeltMetalRunic1.png new file mode 100644 index 000000000..1884e6082 Binary files /dev/null and b/Models/DivineBelt/BeltMetalRunic1.png differ diff --git a/Models/DivineBelt/BeltMetalRunic2.png b/Models/DivineBelt/BeltMetalRunic2.png new file mode 100644 index 000000000..bdbf33c6d Binary files /dev/null and b/Models/DivineBelt/BeltMetalRunic2.png differ diff --git a/Models/DivineBelt/BeltPin.png b/Models/DivineBelt/BeltPin.png new file mode 100644 index 000000000..9ab504ab5 Binary files /dev/null and b/Models/DivineBelt/BeltPin.png differ diff --git a/Models/DivineBelt/BraBase1.png b/Models/DivineBelt/BraBase1.png new file mode 100644 index 000000000..0c73797b9 Binary files /dev/null and b/Models/DivineBelt/BraBase1.png differ diff --git a/Models/DivineBelt/BraBase2.png b/Models/DivineBelt/BraBase2.png new file mode 100644 index 000000000..fc237e045 Binary files /dev/null and b/Models/DivineBelt/BraBase2.png differ diff --git a/Models/DivineBelt/BraLines.png b/Models/DivineBelt/BraLines.png new file mode 100644 index 000000000..7615d1f48 Binary files /dev/null and b/Models/DivineBelt/BraLines.png differ diff --git a/Models/DivineBelt/BraMetal1.png b/Models/DivineBelt/BraMetal1.png new file mode 100644 index 000000000..bc599f083 Binary files /dev/null and b/Models/DivineBelt/BraMetal1.png differ diff --git a/Models/DivineBelt/BraMetal2.png b/Models/DivineBelt/BraMetal2.png new file mode 100644 index 000000000..a8e5eb453 Binary files /dev/null and b/Models/DivineBelt/BraMetal2.png differ diff --git a/Models/DivineBelt/BraMetalRunic1.png b/Models/DivineBelt/BraMetalRunic1.png new file mode 100644 index 000000000..8080279a8 Binary files /dev/null and b/Models/DivineBelt/BraMetalRunic1.png differ diff --git a/Models/DivineBelt/BraMetalRunic2.png b/Models/DivineBelt/BraMetalRunic2.png new file mode 100644 index 000000000..a8e5eb453 Binary files /dev/null and b/Models/DivineBelt/BraMetalRunic2.png differ diff --git a/Models/DivineBelt/BraPins.png b/Models/DivineBelt/BraPins.png new file mode 100644 index 000000000..3f846120c Binary files /dev/null and b/Models/DivineBelt/BraPins.png differ diff --git a/Models/DivineBelt/BraStraps.png b/Models/DivineBelt/BraStraps.png new file mode 100644 index 000000000..e97d98fcb Binary files /dev/null and b/Models/DivineBelt/BraStraps.png differ diff --git a/Models/DivineBelt/BraStrapsRunic.png b/Models/DivineBelt/BraStrapsRunic.png new file mode 100644 index 000000000..846b8084d Binary files /dev/null and b/Models/DivineBelt/BraStrapsRunic.png differ diff --git a/Models/DivineBelt/LockBeltHighlight.png b/Models/DivineBelt/LockBeltHighlight.png new file mode 100644 index 000000000..7b573713b Binary files /dev/null and b/Models/DivineBelt/LockBeltHighlight.png differ diff --git a/Models/DivineBelt/LockBeltLines.png b/Models/DivineBelt/LockBeltLines.png new file mode 100644 index 000000000..d06821a13 Binary files /dev/null and b/Models/DivineBelt/LockBeltLines.png differ diff --git a/Models/DivineBelt/LockBeltPlate.png b/Models/DivineBelt/LockBeltPlate.png new file mode 100644 index 000000000..6e15c8f3d Binary files /dev/null and b/Models/DivineBelt/LockBeltPlate.png differ diff --git a/Models/DivineBelt/LockBeltShackle.png b/Models/DivineBelt/LockBeltShackle.png new file mode 100644 index 000000000..87363b7cd Binary files /dev/null and b/Models/DivineBelt/LockBeltShackle.png differ diff --git a/Models/DivineBelt/LockBraHighlight.png b/Models/DivineBelt/LockBraHighlight.png new file mode 100644 index 000000000..1215025f5 Binary files /dev/null and b/Models/DivineBelt/LockBraHighlight.png differ diff --git a/Models/DivineBelt/LockBraLines.png b/Models/DivineBelt/LockBraLines.png new file mode 100644 index 000000000..e5f514ca3 Binary files /dev/null and b/Models/DivineBelt/LockBraLines.png differ diff --git a/Models/DivineBelt/LockBraPlate.png b/Models/DivineBelt/LockBraPlate.png new file mode 100644 index 000000000..7dc82ae7d Binary files /dev/null and b/Models/DivineBelt/LockBraPlate.png differ diff --git a/Models/DivineBelt/LockBraShackle.png b/Models/DivineBelt/LockBraShackle.png new file mode 100644 index 000000000..fe230def6 Binary files /dev/null and b/Models/DivineBelt/LockBraShackle.png differ diff --git a/Models/DivineCuffs/AnkleLeftClosed.png b/Models/DivineCuffs/AnkleLeftClosed.png new file mode 100644 index 000000000..607eefbf4 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftClosed.png differ diff --git a/Models/DivineCuffs/AnkleLeftClosed.png.0.pdnBak b/Models/DivineCuffs/AnkleLeftClosed.png.0.pdnBak new file mode 100644 index 000000000..e8fb015e4 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftClosed.png.0.pdnBak differ diff --git a/Models/DivineCuffs/AnkleLeftDecoCleanClosed.png b/Models/DivineCuffs/AnkleLeftDecoCleanClosed.png new file mode 100644 index 000000000..e8b7dc786 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftDecoCleanClosed.png differ diff --git a/Models/DivineCuffs/AnkleLeftDecoCleanKneel.png b/Models/DivineCuffs/AnkleLeftDecoCleanKneel.png new file mode 100644 index 000000000..f6c670287 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftDecoCleanKneel.png differ diff --git a/Models/DivineCuffs/AnkleLeftDecoCleanSpread.png b/Models/DivineCuffs/AnkleLeftDecoCleanSpread.png new file mode 100644 index 000000000..b103c3ef4 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftDecoCleanSpread.png differ diff --git a/Models/DivineCuffs/AnkleLeftDecoClosed.png b/Models/DivineCuffs/AnkleLeftDecoClosed.png new file mode 100644 index 000000000..cae4cc34a Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftDecoClosed.png differ diff --git a/Models/DivineCuffs/AnkleLeftDecoClosed.png.0.pdnBak b/Models/DivineCuffs/AnkleLeftDecoClosed.png.0.pdnBak new file mode 100644 index 000000000..b85905caa Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftDecoClosed.png.0.pdnBak differ diff --git a/Models/DivineCuffs/AnkleLeftDecoClosed.png.0.pdnSave b/Models/DivineCuffs/AnkleLeftDecoClosed.png.0.pdnSave new file mode 100644 index 000000000..cae4cc34a Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftDecoClosed.png.0.pdnSave differ diff --git a/Models/DivineCuffs/AnkleLeftDecoKneel.png b/Models/DivineCuffs/AnkleLeftDecoKneel.png new file mode 100644 index 000000000..023fa067f Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftDecoKneel.png differ diff --git a/Models/DivineCuffs/AnkleLeftDecoSpread.png b/Models/DivineCuffs/AnkleLeftDecoSpread.png new file mode 100644 index 000000000..5ccfd73c7 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftDecoSpread.png differ diff --git a/Models/DivineCuffs/AnkleLeftKneel.png b/Models/DivineCuffs/AnkleLeftKneel.png new file mode 100644 index 000000000..8b1f88d83 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftKneel.png differ diff --git a/Models/DivineCuffs/AnkleLeftKneelClosed.png b/Models/DivineCuffs/AnkleLeftKneelClosed.png new file mode 100644 index 000000000..1343fb347 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftKneelClosed.png differ diff --git a/Models/DivineCuffs/AnkleLeftLockBandClosed.png b/Models/DivineCuffs/AnkleLeftLockBandClosed.png new file mode 100644 index 000000000..6b7eda116 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftLockBandClosed.png differ diff --git a/Models/DivineCuffs/AnkleLeftLockBandSpread.png b/Models/DivineCuffs/AnkleLeftLockBandSpread.png new file mode 100644 index 000000000..02b9e4d09 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftLockBandSpread.png differ diff --git a/Models/DivineCuffs/AnkleLeftLockClosed.png b/Models/DivineCuffs/AnkleLeftLockClosed.png new file mode 100644 index 000000000..d15ef8ec0 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftLockClosed.png differ diff --git a/Models/DivineCuffs/AnkleLeftLockKneel.png b/Models/DivineCuffs/AnkleLeftLockKneel.png new file mode 100644 index 000000000..1530cd37d Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftLockKneel.png differ diff --git a/Models/DivineCuffs/AnkleLeftLockPlateClosed.png b/Models/DivineCuffs/AnkleLeftLockPlateClosed.png new file mode 100644 index 000000000..8ae58e2a6 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftLockPlateClosed.png differ diff --git a/Models/DivineCuffs/AnkleLeftLockPlateKneel.png b/Models/DivineCuffs/AnkleLeftLockPlateKneel.png new file mode 100644 index 000000000..3f29389db Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftLockPlateKneel.png differ diff --git a/Models/DivineCuffs/AnkleLeftLockPlateSpread.png b/Models/DivineCuffs/AnkleLeftLockPlateSpread.png new file mode 100644 index 000000000..081c6a66f Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftLockPlateSpread.png differ diff --git a/Models/DivineCuffs/AnkleLeftLockSpread.png b/Models/DivineCuffs/AnkleLeftLockSpread.png new file mode 100644 index 000000000..2fd23d0d3 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftLockSpread.png differ diff --git a/Models/DivineCuffs/AnkleLeftSpread.png b/Models/DivineCuffs/AnkleLeftSpread.png new file mode 100644 index 000000000..714430dc6 Binary files /dev/null and b/Models/DivineCuffs/AnkleLeftSpread.png differ diff --git a/Models/DivineCuffs/AnkleLinkSpread.png b/Models/DivineCuffs/AnkleLinkSpread.png new file mode 100644 index 000000000..098a9e07b Binary files /dev/null and b/Models/DivineCuffs/AnkleLinkSpread.png differ diff --git a/Models/DivineCuffs/AnkleRightClosed.png b/Models/DivineCuffs/AnkleRightClosed.png new file mode 100644 index 000000000..ca7753788 Binary files /dev/null and b/Models/DivineCuffs/AnkleRightClosed.png differ diff --git a/Models/DivineCuffs/AnkleRightDecoCleanClosed.png b/Models/DivineCuffs/AnkleRightDecoCleanClosed.png new file mode 100644 index 000000000..c3af4a217 Binary files /dev/null and b/Models/DivineCuffs/AnkleRightDecoCleanClosed.png differ diff --git a/Models/DivineCuffs/AnkleRightDecoCleanSpread.png b/Models/DivineCuffs/AnkleRightDecoCleanSpread.png new file mode 100644 index 000000000..4bf3c2f55 Binary files /dev/null and b/Models/DivineCuffs/AnkleRightDecoCleanSpread.png differ diff --git a/Models/DivineCuffs/AnkleRightDecoClosed.png b/Models/DivineCuffs/AnkleRightDecoClosed.png new file mode 100644 index 000000000..2ec7e0260 Binary files /dev/null and b/Models/DivineCuffs/AnkleRightDecoClosed.png differ diff --git a/Models/DivineCuffs/AnkleRightDecoSpread.png b/Models/DivineCuffs/AnkleRightDecoSpread.png new file mode 100644 index 000000000..f5b5cc4e4 Binary files /dev/null and b/Models/DivineCuffs/AnkleRightDecoSpread.png differ diff --git a/Models/DivineCuffs/AnkleRightLockBandClosed.png b/Models/DivineCuffs/AnkleRightLockBandClosed.png new file mode 100644 index 000000000..9f683f3f6 Binary files /dev/null and b/Models/DivineCuffs/AnkleRightLockBandClosed.png differ diff --git a/Models/DivineCuffs/AnkleRightLockBandSpread.png b/Models/DivineCuffs/AnkleRightLockBandSpread.png new file mode 100644 index 000000000..e92fe4540 Binary files /dev/null and b/Models/DivineCuffs/AnkleRightLockBandSpread.png differ diff --git a/Models/DivineCuffs/AnkleRightLockClosed.png b/Models/DivineCuffs/AnkleRightLockClosed.png new file mode 100644 index 000000000..cb65b6ad6 Binary files /dev/null and b/Models/DivineCuffs/AnkleRightLockClosed.png differ diff --git a/Models/DivineCuffs/AnkleRightLockPlateClosed.png b/Models/DivineCuffs/AnkleRightLockPlateClosed.png new file mode 100644 index 000000000..2f7f0d0a1 Binary files /dev/null and b/Models/DivineCuffs/AnkleRightLockPlateClosed.png differ diff --git a/Models/DivineCuffs/AnkleRightLockPlateSpread.png b/Models/DivineCuffs/AnkleRightLockPlateSpread.png new file mode 100644 index 000000000..6e4c9acb9 Binary files /dev/null and b/Models/DivineCuffs/AnkleRightLockPlateSpread.png differ diff --git a/Models/DivineCuffs/AnkleRightLockSpread.png b/Models/DivineCuffs/AnkleRightLockSpread.png new file mode 100644 index 000000000..7063f1be4 Binary files /dev/null and b/Models/DivineCuffs/AnkleRightLockSpread.png differ diff --git a/Models/DivineCuffs/AnkleRightSpread.png b/Models/DivineCuffs/AnkleRightSpread.png new file mode 100644 index 000000000..39cadf90c Binary files /dev/null and b/Models/DivineCuffs/AnkleRightSpread.png differ diff --git a/Models/DivineCuffs/Belt.png b/Models/DivineCuffs/Belt.png new file mode 100644 index 000000000..2a41a382e Binary files /dev/null and b/Models/DivineCuffs/Belt.png differ diff --git a/Models/DivineCuffs/BeltDeco.png b/Models/DivineCuffs/BeltDeco.png new file mode 100644 index 000000000..f458e77cb Binary files /dev/null and b/Models/DivineCuffs/BeltDeco.png differ diff --git a/Models/DivineCuffs/BeltDecoClean.png b/Models/DivineCuffs/BeltDecoClean.png new file mode 100644 index 000000000..1889212aa Binary files /dev/null and b/Models/DivineCuffs/BeltDecoClean.png differ diff --git a/Models/DivineCuffs/BeltLock.png b/Models/DivineCuffs/BeltLock.png new file mode 100644 index 000000000..bd8a16b8c Binary files /dev/null and b/Models/DivineCuffs/BeltLock.png differ diff --git a/Models/DivineCuffs/BeltLockBand.png b/Models/DivineCuffs/BeltLockBand.png new file mode 100644 index 000000000..e34a8ed54 Binary files /dev/null and b/Models/DivineCuffs/BeltLockBand.png differ diff --git a/Models/DivineCuffs/BeltLockPlate.png b/Models/DivineCuffs/BeltLockPlate.png new file mode 100644 index 000000000..b0d83debd Binary files /dev/null and b/Models/DivineCuffs/BeltLockPlate.png differ diff --git a/Models/DivineCuffs/Collar.png b/Models/DivineCuffs/Collar.png new file mode 100644 index 000000000..71ccfa8a6 Binary files /dev/null and b/Models/DivineCuffs/Collar.png differ diff --git a/Models/DivineCuffs/CollarDeco.png b/Models/DivineCuffs/CollarDeco.png new file mode 100644 index 000000000..bd85bef01 Binary files /dev/null and b/Models/DivineCuffs/CollarDeco.png differ diff --git a/Models/DivineCuffs/CollarDecoClean.png b/Models/DivineCuffs/CollarDecoClean.png new file mode 100644 index 000000000..e2ef34319 Binary files /dev/null and b/Models/DivineCuffs/CollarDecoClean.png differ diff --git a/Models/DivineCuffs/CollarLock.png b/Models/DivineCuffs/CollarLock.png new file mode 100644 index 000000000..210b56457 Binary files /dev/null and b/Models/DivineCuffs/CollarLock.png differ diff --git a/Models/DivineCuffs/CollarLockBand.png b/Models/DivineCuffs/CollarLockBand.png new file mode 100644 index 000000000..f69019a53 Binary files /dev/null and b/Models/DivineCuffs/CollarLockBand.png differ diff --git a/Models/DivineCuffs/CollarLockPlate.png b/Models/DivineCuffs/CollarLockPlate.png new file mode 100644 index 000000000..0d31a1cfc Binary files /dev/null and b/Models/DivineCuffs/CollarLockPlate.png differ diff --git a/Models/DivineCuffs/ElbowLeftBoxtie.png b/Models/DivineCuffs/ElbowLeftBoxtie.png new file mode 100644 index 000000000..e1d89bd6c Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoBoxtie.png b/Models/DivineCuffs/ElbowLeftDecoBoxtie.png new file mode 100644 index 000000000..5806b5206 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoCleanBoxtie.png b/Models/DivineCuffs/ElbowLeftDecoCleanBoxtie.png new file mode 100644 index 000000000..0cd74ea0f Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoCleanBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoCleanFree.png b/Models/DivineCuffs/ElbowLeftDecoCleanFree.png new file mode 100644 index 000000000..a2c2b1c86 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoCleanFree.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoCleanFront.png b/Models/DivineCuffs/ElbowLeftDecoCleanFront.png new file mode 100644 index 000000000..df58c55c1 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoCleanFront.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoCleanUp.png b/Models/DivineCuffs/ElbowLeftDecoCleanUp.png new file mode 100644 index 000000000..d290813ae Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoCleanUp.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoCleanWristtie.png b/Models/DivineCuffs/ElbowLeftDecoCleanWristtie.png new file mode 100644 index 000000000..121aa6f82 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoCleanWristtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoCleanYoked.png b/Models/DivineCuffs/ElbowLeftDecoCleanYoked.png new file mode 100644 index 000000000..8ae8124a5 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoCleanYoked.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoFree.png b/Models/DivineCuffs/ElbowLeftDecoFree.png new file mode 100644 index 000000000..4f517485f Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoFree.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoFront.png b/Models/DivineCuffs/ElbowLeftDecoFront.png new file mode 100644 index 000000000..750fba428 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoFront.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoUp.png b/Models/DivineCuffs/ElbowLeftDecoUp.png new file mode 100644 index 000000000..5220fe17c Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoUp.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoWristtie.png b/Models/DivineCuffs/ElbowLeftDecoWristtie.png new file mode 100644 index 000000000..85028fa81 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoWristtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftDecoYoked.png b/Models/DivineCuffs/ElbowLeftDecoYoked.png new file mode 100644 index 000000000..80b0e371c Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftDecoYoked.png differ diff --git a/Models/DivineCuffs/ElbowLeftFree.png b/Models/DivineCuffs/ElbowLeftFree.png new file mode 100644 index 000000000..ee5464bdc Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftFree.png differ diff --git a/Models/DivineCuffs/ElbowLeftFront.png b/Models/DivineCuffs/ElbowLeftFront.png new file mode 100644 index 000000000..10cd36f18 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftFront.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockBandBoxtie.png b/Models/DivineCuffs/ElbowLeftLockBandBoxtie.png new file mode 100644 index 000000000..5bd751887 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockBandBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockBandFree.png b/Models/DivineCuffs/ElbowLeftLockBandFree.png new file mode 100644 index 000000000..659c6defd Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockBandFree.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockBandFront.png b/Models/DivineCuffs/ElbowLeftLockBandFront.png new file mode 100644 index 000000000..89515d88e Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockBandFront.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockBandUp.png b/Models/DivineCuffs/ElbowLeftLockBandUp.png new file mode 100644 index 000000000..e173f49ef Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockBandUp.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockBandWristtie.png b/Models/DivineCuffs/ElbowLeftLockBandWristtie.png new file mode 100644 index 000000000..b13c1ff9c Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockBandWristtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockBoxtie.png b/Models/DivineCuffs/ElbowLeftLockBoxtie.png new file mode 100644 index 000000000..3bc28fdf2 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockFree.png b/Models/DivineCuffs/ElbowLeftLockFree.png new file mode 100644 index 000000000..3947c6219 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockFree.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockFront.png b/Models/DivineCuffs/ElbowLeftLockFront.png new file mode 100644 index 000000000..6e38b44fb Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockFront.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockPlateBoxtie.png b/Models/DivineCuffs/ElbowLeftLockPlateBoxtie.png new file mode 100644 index 000000000..11b2bf187 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockPlateBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockPlateFree.png b/Models/DivineCuffs/ElbowLeftLockPlateFree.png new file mode 100644 index 000000000..60a6d49ff Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockPlateFree.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockPlateFront.png b/Models/DivineCuffs/ElbowLeftLockPlateFront.png new file mode 100644 index 000000000..84ec86c09 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockPlateFront.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockPlateUp.png b/Models/DivineCuffs/ElbowLeftLockPlateUp.png new file mode 100644 index 000000000..bd6edd42e Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockPlateUp.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockPlateWristtie.png b/Models/DivineCuffs/ElbowLeftLockPlateWristtie.png new file mode 100644 index 000000000..2a14dd682 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockPlateWristtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockUp.png b/Models/DivineCuffs/ElbowLeftLockUp.png new file mode 100644 index 000000000..42795d208 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockUp.png differ diff --git a/Models/DivineCuffs/ElbowLeftLockWristtie.png b/Models/DivineCuffs/ElbowLeftLockWristtie.png new file mode 100644 index 000000000..36ceafa98 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftLockWristtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftUp.png b/Models/DivineCuffs/ElbowLeftUp.png new file mode 100644 index 000000000..2aed1a894 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftUp.png differ diff --git a/Models/DivineCuffs/ElbowLeftWristtie.png b/Models/DivineCuffs/ElbowLeftWristtie.png new file mode 100644 index 000000000..28c1706b0 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftWristtie.png differ diff --git a/Models/DivineCuffs/ElbowLeftYoked.png b/Models/DivineCuffs/ElbowLeftYoked.png new file mode 100644 index 000000000..5efdd4000 Binary files /dev/null and b/Models/DivineCuffs/ElbowLeftYoked.png differ diff --git a/Models/DivineCuffs/ElbowRightBoxtie.png b/Models/DivineCuffs/ElbowRightBoxtie.png new file mode 100644 index 000000000..1d4f76046 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowRightDecoBoxtie.png b/Models/DivineCuffs/ElbowRightDecoBoxtie.png new file mode 100644 index 000000000..7c884af66 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightDecoBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowRightDecoCleanBoxtie.png b/Models/DivineCuffs/ElbowRightDecoCleanBoxtie.png new file mode 100644 index 000000000..46628076c Binary files /dev/null and b/Models/DivineCuffs/ElbowRightDecoCleanBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowRightDecoCleanFront.png b/Models/DivineCuffs/ElbowRightDecoCleanFront.png new file mode 100644 index 000000000..36d2fdf9d Binary files /dev/null and b/Models/DivineCuffs/ElbowRightDecoCleanFront.png differ diff --git a/Models/DivineCuffs/ElbowRightDecoCleanUp.png b/Models/DivineCuffs/ElbowRightDecoCleanUp.png new file mode 100644 index 000000000..59ff350ab Binary files /dev/null and b/Models/DivineCuffs/ElbowRightDecoCleanUp.png differ diff --git a/Models/DivineCuffs/ElbowRightDecoCleanYoked.png b/Models/DivineCuffs/ElbowRightDecoCleanYoked.png new file mode 100644 index 000000000..ef13440cd Binary files /dev/null and b/Models/DivineCuffs/ElbowRightDecoCleanYoked.png differ diff --git a/Models/DivineCuffs/ElbowRightDecoFront.png b/Models/DivineCuffs/ElbowRightDecoFront.png new file mode 100644 index 000000000..60ccee4b5 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightDecoFront.png differ diff --git a/Models/DivineCuffs/ElbowRightDecoFront.png.0.pdnBak b/Models/DivineCuffs/ElbowRightDecoFront.png.0.pdnBak new file mode 100644 index 000000000..5cf84f335 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightDecoFront.png.0.pdnBak differ diff --git a/Models/DivineCuffs/ElbowRightDecoFront.png.0.pdnSave b/Models/DivineCuffs/ElbowRightDecoFront.png.0.pdnSave new file mode 100644 index 000000000..60ccee4b5 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightDecoFront.png.0.pdnSave differ diff --git a/Models/DivineCuffs/ElbowRightDecoUp.png b/Models/DivineCuffs/ElbowRightDecoUp.png new file mode 100644 index 000000000..71ee31aec Binary files /dev/null and b/Models/DivineCuffs/ElbowRightDecoUp.png differ diff --git a/Models/DivineCuffs/ElbowRightDecoYoked.png b/Models/DivineCuffs/ElbowRightDecoYoked.png new file mode 100644 index 000000000..8a8ada619 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightDecoYoked.png differ diff --git a/Models/DivineCuffs/ElbowRightFront.png b/Models/DivineCuffs/ElbowRightFront.png new file mode 100644 index 000000000..62b35c203 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightFront.png differ diff --git a/Models/DivineCuffs/ElbowRightLockBandBoxtie.png b/Models/DivineCuffs/ElbowRightLockBandBoxtie.png new file mode 100644 index 000000000..ef7f53101 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightLockBandBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowRightLockBandFront.png b/Models/DivineCuffs/ElbowRightLockBandFront.png new file mode 100644 index 000000000..9845ef8dd Binary files /dev/null and b/Models/DivineCuffs/ElbowRightLockBandFront.png differ diff --git a/Models/DivineCuffs/ElbowRightLockBandUp.png b/Models/DivineCuffs/ElbowRightLockBandUp.png new file mode 100644 index 000000000..7e23d6852 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightLockBandUp.png differ diff --git a/Models/DivineCuffs/ElbowRightLockBoxtie.png b/Models/DivineCuffs/ElbowRightLockBoxtie.png new file mode 100644 index 000000000..70208f07b Binary files /dev/null and b/Models/DivineCuffs/ElbowRightLockBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowRightLockFront.png b/Models/DivineCuffs/ElbowRightLockFront.png new file mode 100644 index 000000000..5aeff62d6 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightLockFront.png differ diff --git a/Models/DivineCuffs/ElbowRightLockPlateBoxtie.png b/Models/DivineCuffs/ElbowRightLockPlateBoxtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightLockPlateBoxtie.png differ diff --git a/Models/DivineCuffs/ElbowRightLockPlateFront.png b/Models/DivineCuffs/ElbowRightLockPlateFront.png new file mode 100644 index 000000000..9ca2d0370 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightLockPlateFront.png differ diff --git a/Models/DivineCuffs/ElbowRightLockPlateUp.png b/Models/DivineCuffs/ElbowRightLockPlateUp.png new file mode 100644 index 000000000..fedcc6715 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightLockPlateUp.png differ diff --git a/Models/DivineCuffs/ElbowRightLockUp.png b/Models/DivineCuffs/ElbowRightLockUp.png new file mode 100644 index 000000000..1ea72a300 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightLockUp.png differ diff --git a/Models/DivineCuffs/ElbowRightUp.png b/Models/DivineCuffs/ElbowRightUp.png new file mode 100644 index 000000000..f0ef586b6 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightUp.png differ diff --git a/Models/DivineCuffs/ElbowRightWristtie.png b/Models/DivineCuffs/ElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightWristtie.png differ diff --git a/Models/DivineCuffs/ElbowRightYoked.png b/Models/DivineCuffs/ElbowRightYoked.png new file mode 100644 index 000000000..9a66a8c64 Binary files /dev/null and b/Models/DivineCuffs/ElbowRightYoked.png differ diff --git a/Models/DivineCuffs/SteelCollar.png b/Models/DivineCuffs/SteelCollar.png new file mode 100644 index 000000000..214bdd95e Binary files /dev/null and b/Models/DivineCuffs/SteelCollar.png differ diff --git a/Models/DivineCuffs/SteelCollarRunes.png b/Models/DivineCuffs/SteelCollarRunes.png new file mode 100644 index 000000000..da19d8908 Binary files /dev/null and b/Models/DivineCuffs/SteelCollarRunes.png differ diff --git a/Models/DivineCuffs/ThighLeftClosed.png b/Models/DivineCuffs/ThighLeftClosed.png new file mode 100644 index 000000000..bb51428cc Binary files /dev/null and b/Models/DivineCuffs/ThighLeftClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftDecoCleanClosed.png b/Models/DivineCuffs/ThighLeftDecoCleanClosed.png new file mode 100644 index 000000000..2115da401 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftDecoCleanClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftDecoCleanKneel.png b/Models/DivineCuffs/ThighLeftDecoCleanKneel.png new file mode 100644 index 000000000..af2bfcdfa Binary files /dev/null and b/Models/DivineCuffs/ThighLeftDecoCleanKneel.png differ diff --git a/Models/DivineCuffs/ThighLeftDecoCleanKneelClosed.png b/Models/DivineCuffs/ThighLeftDecoCleanKneelClosed.png new file mode 100644 index 000000000..af2bfcdfa Binary files /dev/null and b/Models/DivineCuffs/ThighLeftDecoCleanKneelClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftDecoCleanSpread.png b/Models/DivineCuffs/ThighLeftDecoCleanSpread.png new file mode 100644 index 000000000..6a0c69c22 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftDecoCleanSpread.png differ diff --git a/Models/DivineCuffs/ThighLeftDecoClosed.png b/Models/DivineCuffs/ThighLeftDecoClosed.png new file mode 100644 index 000000000..c2e396ed9 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftDecoClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftDecoKneel.png b/Models/DivineCuffs/ThighLeftDecoKneel.png new file mode 100644 index 000000000..d100c7a0d Binary files /dev/null and b/Models/DivineCuffs/ThighLeftDecoKneel.png differ diff --git a/Models/DivineCuffs/ThighLeftDecoKneelClosed.png b/Models/DivineCuffs/ThighLeftDecoKneelClosed.png new file mode 100644 index 000000000..d100c7a0d Binary files /dev/null and b/Models/DivineCuffs/ThighLeftDecoKneelClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftDecoSpread.png b/Models/DivineCuffs/ThighLeftDecoSpread.png new file mode 100644 index 000000000..b5c58d63d Binary files /dev/null and b/Models/DivineCuffs/ThighLeftDecoSpread.png differ diff --git a/Models/DivineCuffs/ThighLeftKneel.png b/Models/DivineCuffs/ThighLeftKneel.png new file mode 100644 index 000000000..9e3a093b1 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftKneel.png differ diff --git a/Models/DivineCuffs/ThighLeftKneelClosed.png b/Models/DivineCuffs/ThighLeftKneelClosed.png new file mode 100644 index 000000000..9e3a093b1 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftKneelClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftLockBandClosed.png b/Models/DivineCuffs/ThighLeftLockBandClosed.png new file mode 100644 index 000000000..92772f901 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockBandClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftLockBandKneel.png b/Models/DivineCuffs/ThighLeftLockBandKneel.png new file mode 100644 index 000000000..384d77d08 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockBandKneel.png differ diff --git a/Models/DivineCuffs/ThighLeftLockBandKneelClosed.png b/Models/DivineCuffs/ThighLeftLockBandKneelClosed.png new file mode 100644 index 000000000..384d77d08 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockBandKneelClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftLockBandSpread.png b/Models/DivineCuffs/ThighLeftLockBandSpread.png new file mode 100644 index 000000000..015795485 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockBandSpread.png differ diff --git a/Models/DivineCuffs/ThighLeftLockClosed.png b/Models/DivineCuffs/ThighLeftLockClosed.png new file mode 100644 index 000000000..3def7a474 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftLockKneel.png b/Models/DivineCuffs/ThighLeftLockKneel.png new file mode 100644 index 000000000..efcbddc50 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockKneel.png differ diff --git a/Models/DivineCuffs/ThighLeftLockKneelClosed.png b/Models/DivineCuffs/ThighLeftLockKneelClosed.png new file mode 100644 index 000000000..efcbddc50 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockKneelClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftLockPlateClosed.png b/Models/DivineCuffs/ThighLeftLockPlateClosed.png new file mode 100644 index 000000000..625700a3c Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockPlateClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftLockPlateKneel.png b/Models/DivineCuffs/ThighLeftLockPlateKneel.png new file mode 100644 index 000000000..b3a44d27a Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockPlateKneel.png differ diff --git a/Models/DivineCuffs/ThighLeftLockPlateKneelClosed.png b/Models/DivineCuffs/ThighLeftLockPlateKneelClosed.png new file mode 100644 index 000000000..b3a44d27a Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockPlateKneelClosed.png differ diff --git a/Models/DivineCuffs/ThighLeftLockPlateSpread.png b/Models/DivineCuffs/ThighLeftLockPlateSpread.png new file mode 100644 index 000000000..cc13b539a Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockPlateSpread.png differ diff --git a/Models/DivineCuffs/ThighLeftLockSpread.png b/Models/DivineCuffs/ThighLeftLockSpread.png new file mode 100644 index 000000000..302f946d0 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftLockSpread.png differ diff --git a/Models/DivineCuffs/ThighLeftSpread.png b/Models/DivineCuffs/ThighLeftSpread.png new file mode 100644 index 000000000..4dbeccea1 Binary files /dev/null and b/Models/DivineCuffs/ThighLeftSpread.png differ diff --git a/Models/DivineCuffs/ThighLinkSpread.png b/Models/DivineCuffs/ThighLinkSpread.png new file mode 100644 index 000000000..b5b8345ea Binary files /dev/null and b/Models/DivineCuffs/ThighLinkSpread.png differ diff --git a/Models/DivineCuffs/ThighRightClosed.png b/Models/DivineCuffs/ThighRightClosed.png new file mode 100644 index 000000000..e0125b607 Binary files /dev/null and b/Models/DivineCuffs/ThighRightClosed.png differ diff --git a/Models/DivineCuffs/ThighRightDecoCleanClosed.png b/Models/DivineCuffs/ThighRightDecoCleanClosed.png new file mode 100644 index 000000000..088c72a5d Binary files /dev/null and b/Models/DivineCuffs/ThighRightDecoCleanClosed.png differ diff --git a/Models/DivineCuffs/ThighRightDecoCleanKneel.png b/Models/DivineCuffs/ThighRightDecoCleanKneel.png new file mode 100644 index 000000000..a6cc05cc4 Binary files /dev/null and b/Models/DivineCuffs/ThighRightDecoCleanKneel.png differ diff --git a/Models/DivineCuffs/ThighRightDecoCleanKneelClosed.png b/Models/DivineCuffs/ThighRightDecoCleanKneelClosed.png new file mode 100644 index 000000000..a6cc05cc4 Binary files /dev/null and b/Models/DivineCuffs/ThighRightDecoCleanKneelClosed.png differ diff --git a/Models/DivineCuffs/ThighRightDecoCleanSpread.png b/Models/DivineCuffs/ThighRightDecoCleanSpread.png new file mode 100644 index 000000000..f09e265b6 Binary files /dev/null and b/Models/DivineCuffs/ThighRightDecoCleanSpread.png differ diff --git a/Models/DivineCuffs/ThighRightDecoClosed.png b/Models/DivineCuffs/ThighRightDecoClosed.png new file mode 100644 index 000000000..3030c5e0b Binary files /dev/null and b/Models/DivineCuffs/ThighRightDecoClosed.png differ diff --git a/Models/DivineCuffs/ThighRightDecoKneel.png b/Models/DivineCuffs/ThighRightDecoKneel.png new file mode 100644 index 000000000..16fb18b0a Binary files /dev/null and b/Models/DivineCuffs/ThighRightDecoKneel.png differ diff --git a/Models/DivineCuffs/ThighRightDecoKneelClosed.png b/Models/DivineCuffs/ThighRightDecoKneelClosed.png new file mode 100644 index 000000000..16fb18b0a Binary files /dev/null and b/Models/DivineCuffs/ThighRightDecoKneelClosed.png differ diff --git a/Models/DivineCuffs/ThighRightDecoSpread.png b/Models/DivineCuffs/ThighRightDecoSpread.png new file mode 100644 index 000000000..f586798eb Binary files /dev/null and b/Models/DivineCuffs/ThighRightDecoSpread.png differ diff --git a/Models/DivineCuffs/ThighRightKneel.png b/Models/DivineCuffs/ThighRightKneel.png new file mode 100644 index 000000000..f61c3c10d Binary files /dev/null and b/Models/DivineCuffs/ThighRightKneel.png differ diff --git a/Models/DivineCuffs/ThighRightKneelClosed.png b/Models/DivineCuffs/ThighRightKneelClosed.png new file mode 100644 index 000000000..f61c3c10d Binary files /dev/null and b/Models/DivineCuffs/ThighRightKneelClosed.png differ diff --git a/Models/DivineCuffs/ThighRightLockBandClosed.png b/Models/DivineCuffs/ThighRightLockBandClosed.png new file mode 100644 index 000000000..64b799841 Binary files /dev/null and b/Models/DivineCuffs/ThighRightLockBandClosed.png differ diff --git a/Models/DivineCuffs/ThighRightLockBandKneel.png b/Models/DivineCuffs/ThighRightLockBandKneel.png new file mode 100644 index 000000000..8ede59d27 Binary files /dev/null and b/Models/DivineCuffs/ThighRightLockBandKneel.png differ diff --git a/Models/DivineCuffs/ThighRightLockBandSpread.png b/Models/DivineCuffs/ThighRightLockBandSpread.png new file mode 100644 index 000000000..6d0165543 Binary files /dev/null and b/Models/DivineCuffs/ThighRightLockBandSpread.png differ diff --git a/Models/DivineCuffs/ThighRightLockClosed.png b/Models/DivineCuffs/ThighRightLockClosed.png new file mode 100644 index 000000000..24493a485 Binary files /dev/null and b/Models/DivineCuffs/ThighRightLockClosed.png differ diff --git a/Models/DivineCuffs/ThighRightLockKneel.png b/Models/DivineCuffs/ThighRightLockKneel.png new file mode 100644 index 000000000..0c4e0b4c4 Binary files /dev/null and b/Models/DivineCuffs/ThighRightLockKneel.png differ diff --git a/Models/DivineCuffs/ThighRightLockPlateClosed.png b/Models/DivineCuffs/ThighRightLockPlateClosed.png new file mode 100644 index 000000000..4aa7edbef Binary files /dev/null and b/Models/DivineCuffs/ThighRightLockPlateClosed.png differ diff --git a/Models/DivineCuffs/ThighRightLockPlateClosed.png.0.pdnBak b/Models/DivineCuffs/ThighRightLockPlateClosed.png.0.pdnBak new file mode 100644 index 000000000..bfedae635 Binary files /dev/null and b/Models/DivineCuffs/ThighRightLockPlateClosed.png.0.pdnBak differ diff --git a/Models/DivineCuffs/ThighRightLockPlateClosed.png.0.pdnSave b/Models/DivineCuffs/ThighRightLockPlateClosed.png.0.pdnSave new file mode 100644 index 000000000..4aa7edbef Binary files /dev/null and b/Models/DivineCuffs/ThighRightLockPlateClosed.png.0.pdnSave differ diff --git a/Models/DivineCuffs/ThighRightLockPlateKneel.png b/Models/DivineCuffs/ThighRightLockPlateKneel.png new file mode 100644 index 000000000..54d482e5f Binary files /dev/null and b/Models/DivineCuffs/ThighRightLockPlateKneel.png differ diff --git a/Models/DivineCuffs/ThighRightLockPlateSpread.png b/Models/DivineCuffs/ThighRightLockPlateSpread.png new file mode 100644 index 000000000..725d5bad1 Binary files /dev/null and b/Models/DivineCuffs/ThighRightLockPlateSpread.png differ diff --git a/Models/DivineCuffs/ThighRightLockSpread.png b/Models/DivineCuffs/ThighRightLockSpread.png new file mode 100644 index 000000000..776164bb4 Binary files /dev/null and b/Models/DivineCuffs/ThighRightLockSpread.png differ diff --git a/Models/DivineCuffs/ThighRightSpread.png b/Models/DivineCuffs/ThighRightSpread.png new file mode 100644 index 000000000..5c6ef010c Binary files /dev/null and b/Models/DivineCuffs/ThighRightSpread.png differ diff --git a/Models/DivineCuffs/WristLeftDecoCleanFree.png b/Models/DivineCuffs/WristLeftDecoCleanFree.png new file mode 100644 index 000000000..916c9d0a8 Binary files /dev/null and b/Models/DivineCuffs/WristLeftDecoCleanFree.png differ diff --git a/Models/DivineCuffs/WristLeftDecoCleanFront.png b/Models/DivineCuffs/WristLeftDecoCleanFront.png new file mode 100644 index 000000000..812acb2da Binary files /dev/null and b/Models/DivineCuffs/WristLeftDecoCleanFront.png differ diff --git a/Models/DivineCuffs/WristLeftDecoCleanYoked.png b/Models/DivineCuffs/WristLeftDecoCleanYoked.png new file mode 100644 index 000000000..ab66c6bec Binary files /dev/null and b/Models/DivineCuffs/WristLeftDecoCleanYoked.png differ diff --git a/Models/DivineCuffs/WristLeftDecoFree.png b/Models/DivineCuffs/WristLeftDecoFree.png new file mode 100644 index 000000000..2d4c1845a Binary files /dev/null and b/Models/DivineCuffs/WristLeftDecoFree.png differ diff --git a/Models/DivineCuffs/WristLeftDecoFront.png b/Models/DivineCuffs/WristLeftDecoFront.png new file mode 100644 index 000000000..16677c51e Binary files /dev/null and b/Models/DivineCuffs/WristLeftDecoFront.png differ diff --git a/Models/DivineCuffs/WristLeftDecoYoked.png b/Models/DivineCuffs/WristLeftDecoYoked.png new file mode 100644 index 000000000..f2f211872 Binary files /dev/null and b/Models/DivineCuffs/WristLeftDecoYoked.png differ diff --git a/Models/DivineCuffs/WristLeftFree.png b/Models/DivineCuffs/WristLeftFree.png new file mode 100644 index 000000000..fd44b1a2e Binary files /dev/null and b/Models/DivineCuffs/WristLeftFree.png differ diff --git a/Models/DivineCuffs/WristLeftFront.png b/Models/DivineCuffs/WristLeftFront.png new file mode 100644 index 000000000..48206717a Binary files /dev/null and b/Models/DivineCuffs/WristLeftFront.png differ diff --git a/Models/DivineCuffs/WristLeftLockBandFree.png b/Models/DivineCuffs/WristLeftLockBandFree.png new file mode 100644 index 000000000..f9feb19b1 Binary files /dev/null and b/Models/DivineCuffs/WristLeftLockBandFree.png differ diff --git a/Models/DivineCuffs/WristLeftLockBandKneel.png b/Models/DivineCuffs/WristLeftLockBandKneel.png new file mode 100644 index 000000000..c39ee14dc Binary files /dev/null and b/Models/DivineCuffs/WristLeftLockBandKneel.png differ diff --git a/Models/DivineCuffs/WristLeftLockFree.png b/Models/DivineCuffs/WristLeftLockFree.png new file mode 100644 index 000000000..24b5f5ad9 Binary files /dev/null and b/Models/DivineCuffs/WristLeftLockFree.png differ diff --git a/Models/DivineCuffs/WristLeftLockPlateFree.png b/Models/DivineCuffs/WristLeftLockPlateFree.png new file mode 100644 index 000000000..f302a08c7 Binary files /dev/null and b/Models/DivineCuffs/WristLeftLockPlateFree.png differ diff --git a/Models/DivineCuffs/WristLeftYoked.png b/Models/DivineCuffs/WristLeftYoked.png new file mode 100644 index 000000000..f12b34a99 Binary files /dev/null and b/Models/DivineCuffs/WristLeftYoked.png differ diff --git a/Models/DivineCuffs/WristRightCrossed.png b/Models/DivineCuffs/WristRightCrossed.png new file mode 100644 index 000000000..e2952af35 Binary files /dev/null and b/Models/DivineCuffs/WristRightCrossed.png differ diff --git a/Models/DivineCuffs/WristRightDecoCleanCrossed.png b/Models/DivineCuffs/WristRightDecoCleanCrossed.png new file mode 100644 index 000000000..67f050a95 Binary files /dev/null and b/Models/DivineCuffs/WristRightDecoCleanCrossed.png differ diff --git a/Models/DivineCuffs/WristRightDecoCleanFree.png b/Models/DivineCuffs/WristRightDecoCleanFree.png new file mode 100644 index 000000000..91b850cd1 Binary files /dev/null and b/Models/DivineCuffs/WristRightDecoCleanFree.png differ diff --git a/Models/DivineCuffs/WristRightDecoCleanFront.png b/Models/DivineCuffs/WristRightDecoCleanFront.png new file mode 100644 index 000000000..b1d4bb30b Binary files /dev/null and b/Models/DivineCuffs/WristRightDecoCleanFront.png differ diff --git a/Models/DivineCuffs/WristRightDecoCleanYoked.png b/Models/DivineCuffs/WristRightDecoCleanYoked.png new file mode 100644 index 000000000..fa0ec0038 Binary files /dev/null and b/Models/DivineCuffs/WristRightDecoCleanYoked.png differ diff --git a/Models/DivineCuffs/WristRightDecoCrossed.png b/Models/DivineCuffs/WristRightDecoCrossed.png new file mode 100644 index 000000000..7ce453ce3 Binary files /dev/null and b/Models/DivineCuffs/WristRightDecoCrossed.png differ diff --git a/Models/DivineCuffs/WristRightDecoFree.png b/Models/DivineCuffs/WristRightDecoFree.png new file mode 100644 index 000000000..ddd39d7cd Binary files /dev/null and b/Models/DivineCuffs/WristRightDecoFree.png differ diff --git a/Models/DivineCuffs/WristRightDecoFront.png b/Models/DivineCuffs/WristRightDecoFront.png new file mode 100644 index 000000000..8c17b0c90 Binary files /dev/null and b/Models/DivineCuffs/WristRightDecoFront.png differ diff --git a/Models/DivineCuffs/WristRightDecoYoked.png b/Models/DivineCuffs/WristRightDecoYoked.png new file mode 100644 index 000000000..4ee61554a Binary files /dev/null and b/Models/DivineCuffs/WristRightDecoYoked.png differ diff --git a/Models/DivineCuffs/WristRightFree.png b/Models/DivineCuffs/WristRightFree.png new file mode 100644 index 000000000..2db38cabf Binary files /dev/null and b/Models/DivineCuffs/WristRightFree.png differ diff --git a/Models/DivineCuffs/WristRightFront.png b/Models/DivineCuffs/WristRightFront.png new file mode 100644 index 000000000..946089e34 Binary files /dev/null and b/Models/DivineCuffs/WristRightFront.png differ diff --git a/Models/DivineCuffs/WristRightLockBandCrossed.png b/Models/DivineCuffs/WristRightLockBandCrossed.png new file mode 100644 index 000000000..d15c0208f Binary files /dev/null and b/Models/DivineCuffs/WristRightLockBandCrossed.png differ diff --git a/Models/DivineCuffs/WristRightLockCrossed.png b/Models/DivineCuffs/WristRightLockCrossed.png new file mode 100644 index 000000000..5b60cd3e6 Binary files /dev/null and b/Models/DivineCuffs/WristRightLockCrossed.png differ diff --git a/Models/DivineCuffs/WristRightLockPlateCrossed.png b/Models/DivineCuffs/WristRightLockPlateCrossed.png new file mode 100644 index 000000000..fc0b18399 Binary files /dev/null and b/Models/DivineCuffs/WristRightLockPlateCrossed.png differ diff --git a/Models/DivineCuffs/WristRightYoked.png b/Models/DivineCuffs/WristRightYoked.png new file mode 100644 index 000000000..b53cd09e0 Binary files /dev/null and b/Models/DivineCuffs/WristRightYoked.png differ diff --git a/Models/DivineGag/Ball.png b/Models/DivineGag/Ball.png new file mode 100644 index 000000000..27a9a8a79 Binary files /dev/null and b/Models/DivineGag/Ball.png differ diff --git a/Models/DivineGag/Gold.png b/Models/DivineGag/Gold.png new file mode 100644 index 000000000..e184233a2 Binary files /dev/null and b/Models/DivineGag/Gold.png differ diff --git a/Models/DivineGag/GoldClean.png b/Models/DivineGag/GoldClean.png new file mode 100644 index 000000000..aa6fbd51c Binary files /dev/null and b/Models/DivineGag/GoldClean.png differ diff --git a/Models/DivineGag/Harness.png b/Models/DivineGag/Harness.png new file mode 100644 index 000000000..a0a1b4640 Binary files /dev/null and b/Models/DivineGag/Harness.png differ diff --git a/Models/DivineGag/Metallic.png b/Models/DivineGag/Metallic.png new file mode 100644 index 000000000..804ff35f8 Binary files /dev/null and b/Models/DivineGag/Metallic.png differ diff --git a/Models/DivineGag/Muzzle.png b/Models/DivineGag/Muzzle.png new file mode 100644 index 000000000..39e1bb0c3 Binary files /dev/null and b/Models/DivineGag/Muzzle.png differ diff --git a/Models/DivineGag/MuzzleCollar.png b/Models/DivineGag/MuzzleCollar.png new file mode 100644 index 000000000..56977efdb Binary files /dev/null and b/Models/DivineGag/MuzzleCollar.png differ diff --git a/Models/DivineGag/MuzzleGold.png b/Models/DivineGag/MuzzleGold.png new file mode 100644 index 000000000..d3ce4a8cf Binary files /dev/null and b/Models/DivineGag/MuzzleGold.png differ diff --git a/Models/DivineGag/MuzzleGoldClean.png b/Models/DivineGag/MuzzleGoldClean.png new file mode 100644 index 000000000..3164fbfc2 Binary files /dev/null and b/Models/DivineGag/MuzzleGoldClean.png differ diff --git a/Models/DivineGag/MuzzleHarness.png b/Models/DivineGag/MuzzleHarness.png new file mode 100644 index 000000000..e7914ebc2 Binary files /dev/null and b/Models/DivineGag/MuzzleHarness.png differ diff --git a/Models/DivineGag/MuzzleRim.png b/Models/DivineGag/MuzzleRim.png new file mode 100644 index 000000000..d5705d211 Binary files /dev/null and b/Models/DivineGag/MuzzleRim.png differ diff --git a/Models/DivineGag/Teeth.png b/Models/DivineGag/Teeth.png new file mode 100644 index 000000000..0dd841728 Binary files /dev/null and b/Models/DivineGag/Teeth.png differ diff --git a/Models/Dress/Band.png b/Models/Dress/Band.png new file mode 100644 index 000000000..cb3dc1292 Binary files /dev/null and b/Models/Dress/Band.png differ diff --git a/Models/Dress/BandCrotchStrap.png b/Models/Dress/BandCrotchStrap.png new file mode 100644 index 000000000..4ff4f1500 Binary files /dev/null and b/Models/Dress/BandCrotchStrap.png differ diff --git a/Models/Dress/BandKneel.png b/Models/Dress/BandKneel.png new file mode 100644 index 000000000..5b29324a8 Binary files /dev/null and b/Models/Dress/BandKneel.png differ diff --git a/Models/Dress/BandKneelCrotchStrap.png b/Models/Dress/BandKneelCrotchStrap.png new file mode 100644 index 000000000..5b29324a8 Binary files /dev/null and b/Models/Dress/BandKneelCrotchStrap.png differ diff --git a/Models/Dress/BlouseArmLeftBoxtie.png b/Models/Dress/BlouseArmLeftBoxtie.png new file mode 100644 index 000000000..2857814d8 Binary files /dev/null and b/Models/Dress/BlouseArmLeftBoxtie.png differ diff --git a/Models/Dress/BlouseArmLeftCrossed.png b/Models/Dress/BlouseArmLeftCrossed.png new file mode 100644 index 000000000..0fa2c6ccd Binary files /dev/null and b/Models/Dress/BlouseArmLeftCrossed.png differ diff --git a/Models/Dress/BlouseArmLeftFree.png b/Models/Dress/BlouseArmLeftFree.png new file mode 100644 index 000000000..a095e691d Binary files /dev/null and b/Models/Dress/BlouseArmLeftFree.png differ diff --git a/Models/Dress/BlouseArmLeftFront.png b/Models/Dress/BlouseArmLeftFront.png new file mode 100644 index 000000000..41646aa78 Binary files /dev/null and b/Models/Dress/BlouseArmLeftFront.png differ diff --git a/Models/Dress/BlouseArmLeftUp.png b/Models/Dress/BlouseArmLeftUp.png new file mode 100644 index 000000000..33fb4a0d8 Binary files /dev/null and b/Models/Dress/BlouseArmLeftUp.png differ diff --git a/Models/Dress/BlouseArmLeftWristtie.png b/Models/Dress/BlouseArmLeftWristtie.png new file mode 100644 index 000000000..d4664ca53 Binary files /dev/null and b/Models/Dress/BlouseArmLeftWristtie.png differ diff --git a/Models/Dress/BlouseArmLeftYoked.png b/Models/Dress/BlouseArmLeftYoked.png new file mode 100644 index 000000000..aba2edd19 Binary files /dev/null and b/Models/Dress/BlouseArmLeftYoked.png differ diff --git a/Models/Dress/BlouseArmRightBoxtie.png b/Models/Dress/BlouseArmRightBoxtie.png new file mode 100644 index 000000000..778726e00 Binary files /dev/null and b/Models/Dress/BlouseArmRightBoxtie.png differ diff --git a/Models/Dress/BlouseArmRightCrossed.png b/Models/Dress/BlouseArmRightCrossed.png new file mode 100644 index 000000000..515c9ea65 Binary files /dev/null and b/Models/Dress/BlouseArmRightCrossed.png differ diff --git a/Models/Dress/BlouseArmRightFree.png b/Models/Dress/BlouseArmRightFree.png new file mode 100644 index 000000000..7cdc01800 Binary files /dev/null and b/Models/Dress/BlouseArmRightFree.png differ diff --git a/Models/Dress/BlouseArmRightFront.png b/Models/Dress/BlouseArmRightFront.png new file mode 100644 index 000000000..1261074aa Binary files /dev/null and b/Models/Dress/BlouseArmRightFront.png differ diff --git a/Models/Dress/BlouseArmRightUp.png b/Models/Dress/BlouseArmRightUp.png new file mode 100644 index 000000000..b23ea95bf Binary files /dev/null and b/Models/Dress/BlouseArmRightUp.png differ diff --git a/Models/Dress/BlouseArmRightWristtie.png b/Models/Dress/BlouseArmRightWristtie.png new file mode 100644 index 000000000..8db9a8c2e Binary files /dev/null and b/Models/Dress/BlouseArmRightWristtie.png differ diff --git a/Models/Dress/BlouseArmRightYoked.png b/Models/Dress/BlouseArmRightYoked.png new file mode 100644 index 000000000..d2cc677b2 Binary files /dev/null and b/Models/Dress/BlouseArmRightYoked.png differ diff --git a/Models/Dress/BlouseBust.png b/Models/Dress/BlouseBust.png new file mode 100644 index 000000000..b8da6a5f5 Binary files /dev/null and b/Models/Dress/BlouseBust.png differ diff --git a/Models/Dress/BlouseBustBoxtie.png b/Models/Dress/BlouseBustBoxtie.png new file mode 100644 index 000000000..1edf8dc05 Binary files /dev/null and b/Models/Dress/BlouseBustBoxtie.png differ diff --git a/Models/Dress/BlouseBustBoxtieChesttied.png b/Models/Dress/BlouseBustBoxtieChesttied.png new file mode 100644 index 000000000..c919e10f3 Binary files /dev/null and b/Models/Dress/BlouseBustBoxtieChesttied.png differ diff --git a/Models/Dress/BlouseBustChesttied.png b/Models/Dress/BlouseBustChesttied.png new file mode 100644 index 000000000..397a2ed06 Binary files /dev/null and b/Models/Dress/BlouseBustChesttied.png differ diff --git a/Models/Dress/BlouseBustUp.png b/Models/Dress/BlouseBustUp.png new file mode 100644 index 000000000..f852673b6 Binary files /dev/null and b/Models/Dress/BlouseBustUp.png differ diff --git a/Models/Dress/BlouseBustUpChesttied.png b/Models/Dress/BlouseBustUpChesttied.png new file mode 100644 index 000000000..4a43b1968 Binary files /dev/null and b/Models/Dress/BlouseBustUpChesttied.png differ diff --git a/Models/Dress/BlouseCollar.png b/Models/Dress/BlouseCollar.png new file mode 100644 index 000000000..8c8c8e131 Binary files /dev/null and b/Models/Dress/BlouseCollar.png differ diff --git a/Models/Dress/BlouseCollarBoxtie.png b/Models/Dress/BlouseCollarBoxtie.png new file mode 100644 index 000000000..df595a400 Binary files /dev/null and b/Models/Dress/BlouseCollarBoxtie.png differ diff --git a/Models/Dress/BlouseCollarUp.png b/Models/Dress/BlouseCollarUp.png new file mode 100644 index 000000000..330bf80b1 Binary files /dev/null and b/Models/Dress/BlouseCollarUp.png differ diff --git a/Models/Dress/BlouseForeArmLeftCrossed.png b/Models/Dress/BlouseForeArmLeftCrossed.png new file mode 100644 index 000000000..36a48645e Binary files /dev/null and b/Models/Dress/BlouseForeArmLeftCrossed.png differ diff --git a/Models/Dress/BlouseForeArmLeftFront.png b/Models/Dress/BlouseForeArmLeftFront.png new file mode 100644 index 000000000..ced3bae04 Binary files /dev/null and b/Models/Dress/BlouseForeArmLeftFront.png differ diff --git a/Models/Dress/BlouseForeArmRightCrossed.png b/Models/Dress/BlouseForeArmRightCrossed.png new file mode 100644 index 000000000..4e01925c3 Binary files /dev/null and b/Models/Dress/BlouseForeArmRightCrossed.png differ diff --git a/Models/Dress/BlouseForeArmRightFront.png b/Models/Dress/BlouseForeArmRightFront.png new file mode 100644 index 000000000..b812aaf39 Binary files /dev/null and b/Models/Dress/BlouseForeArmRightFront.png differ diff --git a/Models/Dress/BlouseNeck.png b/Models/Dress/BlouseNeck.png new file mode 100644 index 000000000..b3ca6bd32 Binary files /dev/null and b/Models/Dress/BlouseNeck.png differ diff --git a/Models/Dress/BlouseNeckBoxtie.png b/Models/Dress/BlouseNeckBoxtie.png new file mode 100644 index 000000000..a43cf53fc Binary files /dev/null and b/Models/Dress/BlouseNeckBoxtie.png differ diff --git a/Models/Dress/BlouseNeckUp.png b/Models/Dress/BlouseNeckUp.png new file mode 100644 index 000000000..8031bf20e Binary files /dev/null and b/Models/Dress/BlouseNeckUp.png differ diff --git a/Models/Dress/BlouseShoulderRightUp.png b/Models/Dress/BlouseShoulderRightUp.png new file mode 100644 index 000000000..bd278a29a Binary files /dev/null and b/Models/Dress/BlouseShoulderRightUp.png differ diff --git a/Models/Dress/BlouseSkirt.png b/Models/Dress/BlouseSkirt.png new file mode 100644 index 000000000..73aacf232 Binary files /dev/null and b/Models/Dress/BlouseSkirt.png differ diff --git a/Models/Dress/BlouseSkirtKneel.png b/Models/Dress/BlouseSkirtKneel.png new file mode 100644 index 000000000..06faf2a4c Binary files /dev/null and b/Models/Dress/BlouseSkirtKneel.png differ diff --git a/Models/Dress/BlouseSkirtLone.png b/Models/Dress/BlouseSkirtLone.png new file mode 100644 index 000000000..250e4b551 Binary files /dev/null and b/Models/Dress/BlouseSkirtLone.png differ diff --git a/Models/Dress/BlouseSkirtLoneKneel.png b/Models/Dress/BlouseSkirtLoneKneel.png new file mode 100644 index 000000000..108ad3853 Binary files /dev/null and b/Models/Dress/BlouseSkirtLoneKneel.png differ diff --git a/Models/Dress/BlouseSkirtOverKneel.png b/Models/Dress/BlouseSkirtOverKneel.png new file mode 100644 index 000000000..ac0dac80c Binary files /dev/null and b/Models/Dress/BlouseSkirtOverKneel.png differ diff --git a/Models/Dress/BlouseSkirtUnder.png b/Models/Dress/BlouseSkirtUnder.png new file mode 100644 index 000000000..93e23a805 Binary files /dev/null and b/Models/Dress/BlouseSkirtUnder.png differ diff --git a/Models/Dress/BlouseTorso.png b/Models/Dress/BlouseTorso.png new file mode 100644 index 000000000..3bdbd1bfa Binary files /dev/null and b/Models/Dress/BlouseTorso.png differ diff --git a/Models/Dress/BlouseTorsoKneel.png b/Models/Dress/BlouseTorsoKneel.png new file mode 100644 index 000000000..df1e4d23a Binary files /dev/null and b/Models/Dress/BlouseTorsoKneel.png differ diff --git a/Models/Dress/BowCorset.png b/Models/Dress/BowCorset.png new file mode 100644 index 000000000..9723210fa Binary files /dev/null and b/Models/Dress/BowCorset.png differ diff --git a/Models/Dress/BowCorsetBow.png b/Models/Dress/BowCorsetBow.png new file mode 100644 index 000000000..fb19742b3 Binary files /dev/null and b/Models/Dress/BowCorsetBow.png differ diff --git a/Models/Dress/BowCorsetBust.png b/Models/Dress/BowCorsetBust.png new file mode 100644 index 000000000..771c05e5e Binary files /dev/null and b/Models/Dress/BowCorsetBust.png differ diff --git a/Models/Dress/BowCorsetBustRuffle.png b/Models/Dress/BowCorsetBustRuffle.png new file mode 100644 index 000000000..df1bb664f Binary files /dev/null and b/Models/Dress/BowCorsetBustRuffle.png differ diff --git a/Models/Dress/BowCorsetLong.png b/Models/Dress/BowCorsetLong.png new file mode 100644 index 000000000..2e71f7341 Binary files /dev/null and b/Models/Dress/BowCorsetLong.png differ diff --git a/Models/Dress/BowCorsetLongRuffle.png b/Models/Dress/BowCorsetLongRuffle.png new file mode 100644 index 000000000..3ca42994e Binary files /dev/null and b/Models/Dress/BowCorsetLongRuffle.png differ diff --git a/Models/Dress/BowCorsetRuffle.png b/Models/Dress/BowCorsetRuffle.png new file mode 100644 index 000000000..704c879d7 Binary files /dev/null and b/Models/Dress/BowCorsetRuffle.png differ diff --git a/Models/Dress/CroppedBlouseTorso.png b/Models/Dress/CroppedBlouseTorso.png new file mode 100644 index 000000000..b6de1b8ae Binary files /dev/null and b/Models/Dress/CroppedBlouseTorso.png differ diff --git a/Models/Dress/CroppedBlouseTorsoKneel.png b/Models/Dress/CroppedBlouseTorsoKneel.png new file mode 100644 index 000000000..fefce7b86 Binary files /dev/null and b/Models/Dress/CroppedBlouseTorsoKneel.png differ diff --git a/Models/Dress/Glasses.png b/Models/Dress/Glasses.png new file mode 100644 index 000000000..b15f0b10c Binary files /dev/null and b/Models/Dress/Glasses.png differ diff --git a/Models/Dress/GlassesLens.png b/Models/Dress/GlassesLens.png new file mode 100644 index 000000000..bf11f0b17 Binary files /dev/null and b/Models/Dress/GlassesLens.png differ diff --git a/Models/Dress/LaceChest.png b/Models/Dress/LaceChest.png new file mode 100644 index 000000000..807fa45cd Binary files /dev/null and b/Models/Dress/LaceChest.png differ diff --git a/Models/Dress/LaceChestCups.png b/Models/Dress/LaceChestCups.png new file mode 100644 index 000000000..4d5c5f320 Binary files /dev/null and b/Models/Dress/LaceChestCups.png differ diff --git a/Models/Dress/LaceChestDeco.png b/Models/Dress/LaceChestDeco.png new file mode 100644 index 000000000..814bbe8c1 Binary files /dev/null and b/Models/Dress/LaceChestDeco.png differ diff --git a/Models/Dress/LaceChestDecoCrystal.png b/Models/Dress/LaceChestDecoCrystal.png new file mode 100644 index 000000000..a2d079802 Binary files /dev/null and b/Models/Dress/LaceChestDecoCrystal.png differ diff --git a/Models/Dress/LaceChestDecoHardware.png b/Models/Dress/LaceChestDecoHardware.png new file mode 100644 index 000000000..5c9f5f9f7 Binary files /dev/null and b/Models/Dress/LaceChestDecoHardware.png differ diff --git a/Models/Dress/LaceChestStripes.png b/Models/Dress/LaceChestStripes.png new file mode 100644 index 000000000..5d6d49a03 Binary files /dev/null and b/Models/Dress/LaceChestStripes.png differ diff --git a/Models/Dress/LaceCorset.png b/Models/Dress/LaceCorset.png new file mode 100644 index 000000000..351d98438 Binary files /dev/null and b/Models/Dress/LaceCorset.png differ diff --git a/Models/Dress/LaceCorsetCrystal.png b/Models/Dress/LaceCorsetCrystal.png new file mode 100644 index 000000000..6e22b4303 Binary files /dev/null and b/Models/Dress/LaceCorsetCrystal.png differ diff --git a/Models/Dress/LaceCorsetHardware.png b/Models/Dress/LaceCorsetHardware.png new file mode 100644 index 000000000..d53ae7c9f Binary files /dev/null and b/Models/Dress/LaceCorsetHardware.png differ diff --git a/Models/Dress/LaceCorsetStripes.png b/Models/Dress/LaceCorsetStripes.png new file mode 100644 index 000000000..9830d2128 Binary files /dev/null and b/Models/Dress/LaceCorsetStripes.png differ diff --git a/Models/Dress/LaceCrotchPanel.pdn b/Models/Dress/LaceCrotchPanel.pdn new file mode 100644 index 000000000..96ec84cc6 Binary files /dev/null and b/Models/Dress/LaceCrotchPanel.pdn differ diff --git a/Models/Dress/LaceCrotchPanel.png b/Models/Dress/LaceCrotchPanel.png new file mode 100644 index 000000000..8aa191f0c Binary files /dev/null and b/Models/Dress/LaceCrotchPanel.png differ diff --git a/Models/Dress/LaceCrotchPanelLace.pdn b/Models/Dress/LaceCrotchPanelLace.pdn new file mode 100644 index 000000000..0e834b02e Binary files /dev/null and b/Models/Dress/LaceCrotchPanelLace.pdn differ diff --git a/Models/Dress/LaceCrotchPanelLace.png b/Models/Dress/LaceCrotchPanelLace.png new file mode 100644 index 000000000..13d892422 Binary files /dev/null and b/Models/Dress/LaceCrotchPanelLace.png differ diff --git a/Models/Dress/LaceCrotchPanelTrim.png b/Models/Dress/LaceCrotchPanelTrim.png new file mode 100644 index 000000000..1375c8a3c Binary files /dev/null and b/Models/Dress/LaceCrotchPanelTrim.png differ diff --git a/Models/Dress/MageBra.png b/Models/Dress/MageBra.png new file mode 100644 index 000000000..b01683923 Binary files /dev/null and b/Models/Dress/MageBra.png differ diff --git a/Models/Dress/MageBraStripes.png b/Models/Dress/MageBraStripes.png new file mode 100644 index 000000000..954947eeb Binary files /dev/null and b/Models/Dress/MageBraStripes.png differ diff --git a/Models/Dress/MageCollar.png b/Models/Dress/MageCollar.png new file mode 100644 index 000000000..46c02c162 Binary files /dev/null and b/Models/Dress/MageCollar.png differ diff --git a/Models/Dress/MageCollarCrystal.png b/Models/Dress/MageCollarCrystal.png new file mode 100644 index 000000000..31ae1a438 Binary files /dev/null and b/Models/Dress/MageCollarCrystal.png differ diff --git a/Models/Dress/MageCollarHardware.png b/Models/Dress/MageCollarHardware.png new file mode 100644 index 000000000..bb3b24e0c Binary files /dev/null and b/Models/Dress/MageCollarHardware.png differ diff --git a/Models/Dress/MageCollarTie.png b/Models/Dress/MageCollarTie.png new file mode 100644 index 000000000..768fbef1d Binary files /dev/null and b/Models/Dress/MageCollarTie.png differ diff --git a/Models/Dress/MageCorset.png b/Models/Dress/MageCorset.png new file mode 100644 index 000000000..66235d67f Binary files /dev/null and b/Models/Dress/MageCorset.png differ diff --git a/Models/Dress/MageCorsetStripes.png b/Models/Dress/MageCorsetStripes.png new file mode 100644 index 000000000..22e7c3103 Binary files /dev/null and b/Models/Dress/MageCorsetStripes.png differ diff --git a/Models/Dress/MageSkirt.png b/Models/Dress/MageSkirt.png new file mode 100644 index 000000000..0d100b7aa Binary files /dev/null and b/Models/Dress/MageSkirt.png differ diff --git a/Models/Dress/MageSkirtCrotchStrap.png b/Models/Dress/MageSkirtCrotchStrap.png new file mode 100644 index 000000000..1680365ff Binary files /dev/null and b/Models/Dress/MageSkirtCrotchStrap.png differ diff --git a/Models/Dress/MageSkirtKneel.png b/Models/Dress/MageSkirtKneel.png new file mode 100644 index 000000000..fb1ca29a9 Binary files /dev/null and b/Models/Dress/MageSkirtKneel.png differ diff --git a/Models/Dress/MageSkirtKneelCrotchStrap.png b/Models/Dress/MageSkirtKneelCrotchStrap.png new file mode 100644 index 000000000..8a1207a7b Binary files /dev/null and b/Models/Dress/MageSkirtKneelCrotchStrap.png differ diff --git a/Models/Dress/MageSkirtOverKneel.png b/Models/Dress/MageSkirtOverKneel.png new file mode 100644 index 000000000..5cbf714ac Binary files /dev/null and b/Models/Dress/MageSkirtOverKneel.png differ diff --git a/Models/Dress/MageSkirtOverKneelCrotchStrap.png b/Models/Dress/MageSkirtOverKneelCrotchStrap.png new file mode 100644 index 000000000..81bb88168 Binary files /dev/null and b/Models/Dress/MageSkirtOverKneelCrotchStrap.png differ diff --git a/Models/Dress/MonocleLeft.png b/Models/Dress/MonocleLeft.png new file mode 100644 index 000000000..9982ed4ca Binary files /dev/null and b/Models/Dress/MonocleLeft.png differ diff --git a/Models/Dress/MonocleLensLeft.png b/Models/Dress/MonocleLensLeft.png new file mode 100644 index 000000000..fe892048a Binary files /dev/null and b/Models/Dress/MonocleLensLeft.png differ diff --git a/Models/Dress/MonocleLensRight.png b/Models/Dress/MonocleLensRight.png new file mode 100644 index 000000000..a94c6fb10 Binary files /dev/null and b/Models/Dress/MonocleLensRight.png differ diff --git a/Models/Dress/MonocleRight.png b/Models/Dress/MonocleRight.png new file mode 100644 index 000000000..0edb6ec8f Binary files /dev/null and b/Models/Dress/MonocleRight.png differ diff --git a/Models/Dress/ShoeLeftClosed.png b/Models/Dress/ShoeLeftClosed.png new file mode 100644 index 000000000..7a289a6e8 Binary files /dev/null and b/Models/Dress/ShoeLeftClosed.png differ diff --git a/Models/Dress/ShoeLeftHogtie.png b/Models/Dress/ShoeLeftHogtie.png new file mode 100644 index 000000000..4f7551674 Binary files /dev/null and b/Models/Dress/ShoeLeftHogtie.png differ diff --git a/Models/Dress/ShoeLeftKneel.png b/Models/Dress/ShoeLeftKneel.png new file mode 100644 index 000000000..e4fb12340 Binary files /dev/null and b/Models/Dress/ShoeLeftKneel.png differ diff --git a/Models/Dress/ShoeLeftKneelClosed.png b/Models/Dress/ShoeLeftKneelClosed.png new file mode 100644 index 000000000..eb4a4f09c Binary files /dev/null and b/Models/Dress/ShoeLeftKneelClosed.png differ diff --git a/Models/Dress/ShoeLeftSpread.png b/Models/Dress/ShoeLeftSpread.png new file mode 100644 index 000000000..eafaecc17 Binary files /dev/null and b/Models/Dress/ShoeLeftSpread.png differ diff --git a/Models/Dress/ShoeRightClosed.png b/Models/Dress/ShoeRightClosed.png new file mode 100644 index 000000000..97875e3f3 Binary files /dev/null and b/Models/Dress/ShoeRightClosed.png differ diff --git a/Models/Dress/ShoeRightKneel.png b/Models/Dress/ShoeRightKneel.png new file mode 100644 index 000000000..4f0a975d7 Binary files /dev/null and b/Models/Dress/ShoeRightKneel.png differ diff --git a/Models/Dress/ShoeRightSpread.png b/Models/Dress/ShoeRightSpread.png new file mode 100644 index 000000000..07588315d Binary files /dev/null and b/Models/Dress/ShoeRightSpread.png differ diff --git a/Models/Dress/Skirt.png b/Models/Dress/Skirt.png new file mode 100644 index 000000000..8976c3c3a Binary files /dev/null and b/Models/Dress/Skirt.png differ diff --git a/Models/Dress/SkirtClosed.png b/Models/Dress/SkirtClosed.png new file mode 100644 index 000000000..8976c3c3a Binary files /dev/null and b/Models/Dress/SkirtClosed.png differ diff --git a/Models/Dress/SkirtClosedCrotchStrap.png b/Models/Dress/SkirtClosedCrotchStrap.png new file mode 100644 index 000000000..697ef2877 Binary files /dev/null and b/Models/Dress/SkirtClosedCrotchStrap.png differ diff --git a/Models/Dress/SkirtCrotchStrap.png b/Models/Dress/SkirtCrotchStrap.png new file mode 100644 index 000000000..697ef2877 Binary files /dev/null and b/Models/Dress/SkirtCrotchStrap.png differ diff --git a/Models/Dress/SkirtKneel.png b/Models/Dress/SkirtKneel.png new file mode 100644 index 000000000..66e038ab7 Binary files /dev/null and b/Models/Dress/SkirtKneel.png differ diff --git a/Models/Dress/SkirtKneelCrotchStrap.png b/Models/Dress/SkirtKneelCrotchStrap.png new file mode 100644 index 000000000..1845ca8ed Binary files /dev/null and b/Models/Dress/SkirtKneelCrotchStrap.png differ diff --git a/Models/Dress/SkirtOverKneel.png b/Models/Dress/SkirtOverKneel.png new file mode 100644 index 000000000..144114e4d Binary files /dev/null and b/Models/Dress/SkirtOverKneel.png differ diff --git a/Models/Dress/SkirtOverKneelCrotchStrap.png b/Models/Dress/SkirtOverKneelCrotchStrap.png new file mode 100644 index 000000000..6b65ebe04 Binary files /dev/null and b/Models/Dress/SkirtOverKneelCrotchStrap.png differ diff --git a/Models/Dress/SkirtSplit.png b/Models/Dress/SkirtSplit.png new file mode 100644 index 000000000..01b532628 Binary files /dev/null and b/Models/Dress/SkirtSplit.png differ diff --git a/Models/Dress/SkirtSplitBelt.png b/Models/Dress/SkirtSplitBelt.png new file mode 100644 index 000000000..7e15e9e6d Binary files /dev/null and b/Models/Dress/SkirtSplitBelt.png differ diff --git a/Models/Dress/SkirtSplitClosed.png b/Models/Dress/SkirtSplitClosed.png new file mode 100644 index 000000000..01b532628 Binary files /dev/null and b/Models/Dress/SkirtSplitClosed.png differ diff --git a/Models/Dress/SkirtSplitKneel.png b/Models/Dress/SkirtSplitKneel.png new file mode 100644 index 000000000..15cbe1cad Binary files /dev/null and b/Models/Dress/SkirtSplitKneel.png differ diff --git a/Models/Dress/SkirtSplitOverKneel.png b/Models/Dress/SkirtSplitOverKneel.png new file mode 100644 index 000000000..b7f0b0e25 Binary files /dev/null and b/Models/Dress/SkirtSplitOverKneel.png differ diff --git a/Models/Ears/Earrings.png b/Models/Ears/Earrings.png new file mode 100644 index 000000000..1fa446f7f Binary files /dev/null and b/Models/Ears/Earrings.png differ diff --git a/Models/Ears/EarringsBack.png b/Models/Ears/EarringsBack.png new file mode 100644 index 000000000..baf3ecb7f Binary files /dev/null and b/Models/Ears/EarringsBack.png differ diff --git a/Models/Ears/ElfBack.pdn b/Models/Ears/ElfBack.pdn new file mode 100644 index 000000000..25d289666 Binary files /dev/null and b/Models/Ears/ElfBack.pdn differ diff --git a/Models/Ears/ElfBack.png b/Models/Ears/ElfBack.png new file mode 100644 index 000000000..a46e8958a Binary files /dev/null and b/Models/Ears/ElfBack.png differ diff --git a/Models/Ears/ElfEarringsBack.png b/Models/Ears/ElfEarringsBack.png new file mode 100644 index 000000000..a514fa12e Binary files /dev/null and b/Models/Ears/ElfEarringsBack.png differ diff --git a/Models/Ears/ElfEarringsFront.png b/Models/Ears/ElfEarringsFront.png new file mode 100644 index 000000000..e992a9de0 Binary files /dev/null and b/Models/Ears/ElfEarringsFront.png differ diff --git a/Models/Ears/ElfFloppyBack.png b/Models/Ears/ElfFloppyBack.png new file mode 100644 index 000000000..53a9e790c Binary files /dev/null and b/Models/Ears/ElfFloppyBack.png differ diff --git a/Models/Ears/ElfFloppyFront.png b/Models/Ears/ElfFloppyFront.png new file mode 100644 index 000000000..804dd8a1f Binary files /dev/null and b/Models/Ears/ElfFloppyFront.png differ diff --git a/Models/Ears/ElfFront.png b/Models/Ears/ElfFront.png new file mode 100644 index 000000000..595dd9ed4 Binary files /dev/null and b/Models/Ears/ElfFront.png differ diff --git a/Models/Ears/ElfLongBack.png b/Models/Ears/ElfLongBack.png new file mode 100644 index 000000000..8a6ebada1 Binary files /dev/null and b/Models/Ears/ElfLongBack.png differ diff --git a/Models/Ears/ElfLongFront.png b/Models/Ears/ElfLongFront.png new file mode 100644 index 000000000..79478223e Binary files /dev/null and b/Models/Ears/ElfLongFront.png differ diff --git a/Models/Ears/Fox.png b/Models/Ears/Fox.png new file mode 100644 index 000000000..aa13705e6 Binary files /dev/null and b/Models/Ears/Fox.png differ diff --git a/Models/Ears/FoxInner.png b/Models/Ears/FoxInner.png new file mode 100644 index 000000000..9c3a5b712 Binary files /dev/null and b/Models/Ears/FoxInner.png differ diff --git a/Models/Ears/Kitty.png b/Models/Ears/Kitty.png new file mode 100644 index 000000000..e01204e1c Binary files /dev/null and b/Models/Ears/Kitty.png differ diff --git a/Models/Ears/KittyInner.png b/Models/Ears/KittyInner.png new file mode 100644 index 000000000..8d129c0dc Binary files /dev/null and b/Models/Ears/KittyInner.png differ diff --git a/Models/Ears/Wolf.png b/Models/Ears/Wolf.png new file mode 100644 index 000000000..6f55a8333 Binary files /dev/null and b/Models/Ears/Wolf.png differ diff --git a/Models/Ears/WolfInner.png b/Models/Ears/WolfInner.png new file mode 100644 index 000000000..6291d36ce Binary files /dev/null and b/Models/Ears/WolfInner.png differ diff --git a/Models/Elf/BandLeftBoxtie.png b/Models/Elf/BandLeftBoxtie.png new file mode 100644 index 000000000..ff2c1f61f Binary files /dev/null and b/Models/Elf/BandLeftBoxtie.png differ diff --git a/Models/Elf/BandLeftFree.png b/Models/Elf/BandLeftFree.png new file mode 100644 index 000000000..d9e6820fe Binary files /dev/null and b/Models/Elf/BandLeftFree.png differ diff --git a/Models/Elf/BandLeftUp.png b/Models/Elf/BandLeftUp.png new file mode 100644 index 000000000..9923a5089 Binary files /dev/null and b/Models/Elf/BandLeftUp.png differ diff --git a/Models/Elf/BandLeftWristtie.png b/Models/Elf/BandLeftWristtie.png new file mode 100644 index 000000000..7a486a16a Binary files /dev/null and b/Models/Elf/BandLeftWristtie.png differ diff --git a/Models/Elf/BandLeftYoked.png b/Models/Elf/BandLeftYoked.png new file mode 100644 index 000000000..59211e32b Binary files /dev/null and b/Models/Elf/BandLeftYoked.png differ diff --git a/Models/Elf/BandRightBoxtie.png b/Models/Elf/BandRightBoxtie.png new file mode 100644 index 000000000..43aa4a5e5 Binary files /dev/null and b/Models/Elf/BandRightBoxtie.png differ diff --git a/Models/Elf/BandRightFree.png b/Models/Elf/BandRightFree.png new file mode 100644 index 000000000..049e7339a Binary files /dev/null and b/Models/Elf/BandRightFree.png differ diff --git a/Models/Elf/BandRightFront.png b/Models/Elf/BandRightFront.png new file mode 100644 index 000000000..4facb9665 Binary files /dev/null and b/Models/Elf/BandRightFront.png differ diff --git a/Models/Elf/BandRightUp.png b/Models/Elf/BandRightUp.png new file mode 100644 index 000000000..d9424d299 Binary files /dev/null and b/Models/Elf/BandRightUp.png differ diff --git a/Models/Elf/BandRightWristtie.png b/Models/Elf/BandRightWristtie.png new file mode 100644 index 000000000..abe8c7169 Binary files /dev/null and b/Models/Elf/BandRightWristtie.png differ diff --git a/Models/Elf/BandRightYoked.png b/Models/Elf/BandRightYoked.png new file mode 100644 index 000000000..4ab891c66 Binary files /dev/null and b/Models/Elf/BandRightYoked.png differ diff --git a/Models/Elf/Bra.png b/Models/Elf/Bra.png new file mode 100644 index 000000000..d18e52924 Binary files /dev/null and b/Models/Elf/Bra.png differ diff --git a/Models/Elf/Chest.png b/Models/Elf/Chest.png new file mode 100644 index 000000000..df617fd6e Binary files /dev/null and b/Models/Elf/Chest.png differ diff --git a/Models/Elf/Circlet.png b/Models/Elf/Circlet.png new file mode 100644 index 000000000..22fec81cb Binary files /dev/null and b/Models/Elf/Circlet.png differ diff --git a/Models/Elf/CircletGem.png b/Models/Elf/CircletGem.png new file mode 100644 index 000000000..24525c1e9 Binary files /dev/null and b/Models/Elf/CircletGem.png differ diff --git a/Models/Elf/Collar.png b/Models/Elf/Collar.png new file mode 100644 index 000000000..2de4b662d Binary files /dev/null and b/Models/Elf/Collar.png differ diff --git a/Models/Elf/CollarHardware.png b/Models/Elf/CollarHardware.png new file mode 100644 index 000000000..919e15597 Binary files /dev/null and b/Models/Elf/CollarHardware.png differ diff --git a/Models/Elf/CrystalShoeLeftClosed.png b/Models/Elf/CrystalShoeLeftClosed.png new file mode 100644 index 000000000..96f83a34c Binary files /dev/null and b/Models/Elf/CrystalShoeLeftClosed.png differ diff --git a/Models/Elf/CrystalShoeLeftSpread.png b/Models/Elf/CrystalShoeLeftSpread.png new file mode 100644 index 000000000..4c96f294d Binary files /dev/null and b/Models/Elf/CrystalShoeLeftSpread.png differ diff --git a/Models/Elf/CrystalShoeRightClosed.png b/Models/Elf/CrystalShoeRightClosed.png new file mode 100644 index 000000000..f44c38cc7 Binary files /dev/null and b/Models/Elf/CrystalShoeRightClosed.png differ diff --git a/Models/Elf/CrystalShoeRightSpread.png b/Models/Elf/CrystalShoeRightSpread.png new file mode 100644 index 000000000..cd452a805 Binary files /dev/null and b/Models/Elf/CrystalShoeRightSpread.png differ diff --git a/Models/Elf/Panties.png b/Models/Elf/Panties.png new file mode 100644 index 000000000..dc11b9541 Binary files /dev/null and b/Models/Elf/Panties.png differ diff --git a/Models/Elf/ShoeLeftClosed.png b/Models/Elf/ShoeLeftClosed.png new file mode 100644 index 000000000..d61a303a5 Binary files /dev/null and b/Models/Elf/ShoeLeftClosed.png differ diff --git a/Models/Elf/ShoeLeftHogtie.png b/Models/Elf/ShoeLeftHogtie.png new file mode 100644 index 000000000..195f3fc40 Binary files /dev/null and b/Models/Elf/ShoeLeftHogtie.png differ diff --git a/Models/Elf/ShoeLeftKneel.png b/Models/Elf/ShoeLeftKneel.png new file mode 100644 index 000000000..5d6080b53 Binary files /dev/null and b/Models/Elf/ShoeLeftKneel.png differ diff --git a/Models/Elf/ShoeLeftSpread.png b/Models/Elf/ShoeLeftSpread.png new file mode 100644 index 000000000..888b4cf3a Binary files /dev/null and b/Models/Elf/ShoeLeftSpread.png differ diff --git a/Models/Elf/ShoeRightClosed.png b/Models/Elf/ShoeRightClosed.png new file mode 100644 index 000000000..a629a4725 Binary files /dev/null and b/Models/Elf/ShoeRightClosed.png differ diff --git a/Models/Elf/ShoeRightKneel.png b/Models/Elf/ShoeRightKneel.png new file mode 100644 index 000000000..e8d9e2bca Binary files /dev/null and b/Models/Elf/ShoeRightKneel.png differ diff --git a/Models/Elf/ShoeRightSpread.png b/Models/Elf/ShoeRightSpread.png new file mode 100644 index 000000000..38184ec84 Binary files /dev/null and b/Models/Elf/ShoeRightSpread.png differ diff --git a/Models/Elf/Skirt.png b/Models/Elf/Skirt.png new file mode 100644 index 000000000..5ac33c63b Binary files /dev/null and b/Models/Elf/Skirt.png differ diff --git a/Models/Elf/SkirtBack.png b/Models/Elf/SkirtBack.png new file mode 100644 index 000000000..c655fbf75 Binary files /dev/null and b/Models/Elf/SkirtBack.png differ diff --git a/Models/Elf/SkirtBackKneel.png b/Models/Elf/SkirtBackKneel.png new file mode 100644 index 000000000..2c6e6284c Binary files /dev/null and b/Models/Elf/SkirtBackKneel.png differ diff --git a/Models/Elf/SkirtBand.png b/Models/Elf/SkirtBand.png new file mode 100644 index 000000000..da421d90c Binary files /dev/null and b/Models/Elf/SkirtBand.png differ diff --git a/Models/Elf/SkirtBandKneel.png b/Models/Elf/SkirtBandKneel.png new file mode 100644 index 000000000..7a474b6b2 Binary files /dev/null and b/Models/Elf/SkirtBandKneel.png differ diff --git a/Models/Elf/SkirtCrotchStrap.png b/Models/Elf/SkirtCrotchStrap.png new file mode 100644 index 000000000..63bbcd9b7 Binary files /dev/null and b/Models/Elf/SkirtCrotchStrap.png differ diff --git a/Models/Elf/SkirtKneel.png b/Models/Elf/SkirtKneel.png new file mode 100644 index 000000000..740d928d1 Binary files /dev/null and b/Models/Elf/SkirtKneel.png differ diff --git a/Models/Elf/SkirtKneelCrotchStrap.png b/Models/Elf/SkirtKneelCrotchStrap.png new file mode 100644 index 000000000..20dc30eeb Binary files /dev/null and b/Models/Elf/SkirtKneelCrotchStrap.png differ diff --git a/Models/Expressions/Fear.png b/Models/Expressions/Fear.png new file mode 100644 index 000000000..3a454151b Binary files /dev/null and b/Models/Expressions/Fear.png differ diff --git a/Models/Expressions/Tears_Light.png b/Models/Expressions/Tears_Light.png new file mode 100644 index 000000000..98563c359 Binary files /dev/null and b/Models/Expressions/Tears_Light.png differ diff --git a/Models/EyesDai1/Brows2Angry.png b/Models/EyesDai1/Brows2Angry.png new file mode 100644 index 000000000..35f3f5220 Binary files /dev/null and b/Models/EyesDai1/Brows2Angry.png differ diff --git a/Models/EyesDai1/Brows2Annoyed.png b/Models/EyesDai1/Brows2Annoyed.png new file mode 100644 index 000000000..81a29fbd9 Binary files /dev/null and b/Models/EyesDai1/Brows2Annoyed.png differ diff --git a/Models/EyesDai1/Brows2Neutral.png b/Models/EyesDai1/Brows2Neutral.png new file mode 100644 index 000000000..0d18d3c15 Binary files /dev/null and b/Models/EyesDai1/Brows2Neutral.png differ diff --git a/Models/EyesDai1/Brows2Sad.png b/Models/EyesDai1/Brows2Sad.png new file mode 100644 index 000000000..595ce1da8 Binary files /dev/null and b/Models/EyesDai1/Brows2Sad.png differ diff --git a/Models/EyesDai1/Brows2Surprised.png b/Models/EyesDai1/Brows2Surprised.png new file mode 100644 index 000000000..b4b230a55 Binary files /dev/null and b/Models/EyesDai1/Brows2Surprised.png differ diff --git a/Models/EyesDai1/BrowsAngry.png b/Models/EyesDai1/BrowsAngry.png new file mode 100644 index 000000000..26da06b94 Binary files /dev/null and b/Models/EyesDai1/BrowsAngry.png differ diff --git a/Models/EyesDai1/BrowsAnnoyed.png b/Models/EyesDai1/BrowsAnnoyed.png new file mode 100644 index 000000000..0e1769b82 Binary files /dev/null and b/Models/EyesDai1/BrowsAnnoyed.png differ diff --git a/Models/EyesDai1/BrowsNeutral.png b/Models/EyesDai1/BrowsNeutral.png new file mode 100644 index 000000000..e1d065517 Binary files /dev/null and b/Models/EyesDai1/BrowsNeutral.png differ diff --git a/Models/EyesDai1/BrowsSad.png b/Models/EyesDai1/BrowsSad.png new file mode 100644 index 000000000..8ecb302d6 Binary files /dev/null and b/Models/EyesDai1/BrowsSad.png differ diff --git a/Models/EyesDai1/BrowsSurprised.png b/Models/EyesDai1/BrowsSurprised.png new file mode 100644 index 000000000..0da0e95a4 Binary files /dev/null and b/Models/EyesDai1/BrowsSurprised.png differ diff --git a/Models/EyesDai1/RidgeAngry.png b/Models/EyesDai1/RidgeAngry.png new file mode 100644 index 000000000..033d53f74 Binary files /dev/null and b/Models/EyesDai1/RidgeAngry.png differ diff --git a/Models/EyesDai1/RidgeSad.png b/Models/EyesDai1/RidgeSad.png new file mode 100644 index 000000000..72be5ce9a Binary files /dev/null and b/Models/EyesDai1/RidgeSad.png differ diff --git a/Models/EyesDai2/Brows2Angry.png b/Models/EyesDai2/Brows2Angry.png new file mode 100644 index 000000000..b9268eb7a Binary files /dev/null and b/Models/EyesDai2/Brows2Angry.png differ diff --git a/Models/EyesDai2/Brows2Annoyed.png b/Models/EyesDai2/Brows2Annoyed.png new file mode 100644 index 000000000..119477b8e Binary files /dev/null and b/Models/EyesDai2/Brows2Annoyed.png differ diff --git a/Models/EyesDai2/Brows2Neutral.png b/Models/EyesDai2/Brows2Neutral.png new file mode 100644 index 000000000..ef6214205 Binary files /dev/null and b/Models/EyesDai2/Brows2Neutral.png differ diff --git a/Models/EyesDai2/Brows2Sad.png b/Models/EyesDai2/Brows2Sad.png new file mode 100644 index 000000000..7730cb9f6 Binary files /dev/null and b/Models/EyesDai2/Brows2Sad.png differ diff --git a/Models/EyesDai2/Brows2Surprised.png b/Models/EyesDai2/Brows2Surprised.png new file mode 100644 index 000000000..107a7e880 Binary files /dev/null and b/Models/EyesDai2/Brows2Surprised.png differ diff --git a/Models/EyesDai2/BrowsAngry.png b/Models/EyesDai2/BrowsAngry.png new file mode 100644 index 000000000..4da0839fd Binary files /dev/null and b/Models/EyesDai2/BrowsAngry.png differ diff --git a/Models/EyesDai2/BrowsAnnoyed.png b/Models/EyesDai2/BrowsAnnoyed.png new file mode 100644 index 000000000..eade61456 Binary files /dev/null and b/Models/EyesDai2/BrowsAnnoyed.png differ diff --git a/Models/EyesDai2/BrowsNeutral.png b/Models/EyesDai2/BrowsNeutral.png new file mode 100644 index 000000000..e39b0ca3c Binary files /dev/null and b/Models/EyesDai2/BrowsNeutral.png differ diff --git a/Models/EyesDai2/BrowsSad.png b/Models/EyesDai2/BrowsSad.png new file mode 100644 index 000000000..98ee7a46b Binary files /dev/null and b/Models/EyesDai2/BrowsSad.png differ diff --git a/Models/EyesDai2/BrowsSurprised.png b/Models/EyesDai2/BrowsSurprised.png new file mode 100644 index 000000000..c757d3ad0 Binary files /dev/null and b/Models/EyesDai2/BrowsSurprised.png differ diff --git a/Models/EyesK2/Eyes2Angry.png b/Models/EyesK2/Eyes2Angry.png new file mode 100644 index 000000000..203d19884 Binary files /dev/null and b/Models/EyesK2/Eyes2Angry.png differ diff --git a/Models/EyesK2/Eyes2Closed.png b/Models/EyesK2/Eyes2Closed.png new file mode 100644 index 000000000..d46815397 Binary files /dev/null and b/Models/EyesK2/Eyes2Closed.png differ diff --git a/Models/EyesK2/Eyes2Dazed.png b/Models/EyesK2/Eyes2Dazed.png new file mode 100644 index 000000000..219374d8d Binary files /dev/null and b/Models/EyesK2/Eyes2Dazed.png differ diff --git a/Models/EyesK2/Eyes2Heart.png b/Models/EyesK2/Eyes2Heart.png new file mode 100644 index 000000000..4c0cd6e66 Binary files /dev/null and b/Models/EyesK2/Eyes2Heart.png differ diff --git a/Models/EyesK2/Eyes2Neutral.png b/Models/EyesK2/Eyes2Neutral.png new file mode 100644 index 000000000..8512e297b Binary files /dev/null and b/Models/EyesK2/Eyes2Neutral.png differ diff --git a/Models/EyesK2/Eyes2Sly.png b/Models/EyesK2/Eyes2Sly.png new file mode 100644 index 000000000..dab5acfd8 Binary files /dev/null and b/Models/EyesK2/Eyes2Sly.png differ diff --git a/Models/EyesK2/Eyes2Surprised.png b/Models/EyesK2/Eyes2Surprised.png new file mode 100644 index 000000000..53e168e61 Binary files /dev/null and b/Models/EyesK2/Eyes2Surprised.png differ diff --git a/Models/EyesK2/EyesAngry.png b/Models/EyesK2/EyesAngry.png new file mode 100644 index 000000000..e64b7ab62 Binary files /dev/null and b/Models/EyesK2/EyesAngry.png differ diff --git a/Models/EyesK2/EyesClosed.png b/Models/EyesK2/EyesClosed.png new file mode 100644 index 000000000..1b89b113e Binary files /dev/null and b/Models/EyesK2/EyesClosed.png differ diff --git a/Models/EyesK2/EyesDazed.png b/Models/EyesK2/EyesDazed.png new file mode 100644 index 000000000..c33bd567b Binary files /dev/null and b/Models/EyesK2/EyesDazed.png differ diff --git a/Models/EyesK2/EyesHeart.png b/Models/EyesK2/EyesHeart.png new file mode 100644 index 000000000..a67e2f4e7 Binary files /dev/null and b/Models/EyesK2/EyesHeart.png differ diff --git a/Models/EyesK2/EyesNeutral.png b/Models/EyesK2/EyesNeutral.png new file mode 100644 index 000000000..3d747679b Binary files /dev/null and b/Models/EyesK2/EyesNeutral.png differ diff --git a/Models/EyesK2/EyesSly.png b/Models/EyesK2/EyesSly.png new file mode 100644 index 000000000..8dc2adba2 Binary files /dev/null and b/Models/EyesK2/EyesSly.png differ diff --git a/Models/EyesK2/EyesSurprised.png b/Models/EyesK2/EyesSurprised.png new file mode 100644 index 000000000..38e4a4fc3 Binary files /dev/null and b/Models/EyesK2/EyesSurprised.png differ diff --git a/Models/EyesK2/WhitesEyes2Angry.png b/Models/EyesK2/WhitesEyes2Angry.png new file mode 100644 index 000000000..d59edee45 Binary files /dev/null and b/Models/EyesK2/WhitesEyes2Angry.png differ diff --git a/Models/EyesK2/WhitesEyes2Closed.png b/Models/EyesK2/WhitesEyes2Closed.png new file mode 100644 index 000000000..c68d828dc Binary files /dev/null and b/Models/EyesK2/WhitesEyes2Closed.png differ diff --git a/Models/EyesK2/WhitesEyes2Dazed.png b/Models/EyesK2/WhitesEyes2Dazed.png new file mode 100644 index 000000000..8de556854 Binary files /dev/null and b/Models/EyesK2/WhitesEyes2Dazed.png differ diff --git a/Models/EyesK2/WhitesEyes2Heart.png b/Models/EyesK2/WhitesEyes2Heart.png new file mode 100644 index 000000000..11a8edc77 Binary files /dev/null and b/Models/EyesK2/WhitesEyes2Heart.png differ diff --git a/Models/EyesK2/WhitesEyes2Neutral.png b/Models/EyesK2/WhitesEyes2Neutral.png new file mode 100644 index 000000000..aadc87c71 Binary files /dev/null and b/Models/EyesK2/WhitesEyes2Neutral.png differ diff --git a/Models/EyesK2/WhitesEyes2Sly.png b/Models/EyesK2/WhitesEyes2Sly.png new file mode 100644 index 000000000..4e2fabd5a Binary files /dev/null and b/Models/EyesK2/WhitesEyes2Sly.png differ diff --git a/Models/EyesK2/WhitesEyes2Surprised.png b/Models/EyesK2/WhitesEyes2Surprised.png new file mode 100644 index 000000000..0b67e8c9b Binary files /dev/null and b/Models/EyesK2/WhitesEyes2Surprised.png differ diff --git a/Models/EyesK2/WhitesEyesAngry.png b/Models/EyesK2/WhitesEyesAngry.png new file mode 100644 index 000000000..23f50eab5 Binary files /dev/null and b/Models/EyesK2/WhitesEyesAngry.png differ diff --git a/Models/EyesK2/WhitesEyesClosed.png b/Models/EyesK2/WhitesEyesClosed.png new file mode 100644 index 000000000..881eba640 Binary files /dev/null and b/Models/EyesK2/WhitesEyesClosed.png differ diff --git a/Models/EyesK2/WhitesEyesDazed.png b/Models/EyesK2/WhitesEyesDazed.png new file mode 100644 index 000000000..bc2a6a96a Binary files /dev/null and b/Models/EyesK2/WhitesEyesDazed.png differ diff --git a/Models/EyesK2/WhitesEyesHeart.png b/Models/EyesK2/WhitesEyesHeart.png new file mode 100644 index 000000000..63630fb0c Binary files /dev/null and b/Models/EyesK2/WhitesEyesHeart.png differ diff --git a/Models/EyesK2/WhitesEyesNeutral.png b/Models/EyesK2/WhitesEyesNeutral.png new file mode 100644 index 000000000..1b095f5d1 Binary files /dev/null and b/Models/EyesK2/WhitesEyesNeutral.png differ diff --git a/Models/EyesK2/WhitesEyesSly.png b/Models/EyesK2/WhitesEyesSly.png new file mode 100644 index 000000000..5d5e102f8 Binary files /dev/null and b/Models/EyesK2/WhitesEyesSly.png differ diff --git a/Models/EyesK2/WhitesEyesSurprised.png b/Models/EyesK2/WhitesEyesSurprised.png new file mode 100644 index 000000000..ad932ed91 Binary files /dev/null and b/Models/EyesK2/WhitesEyesSurprised.png differ diff --git a/Models/EyesK3/Eyes2Angry.png b/Models/EyesK3/Eyes2Angry.png new file mode 100644 index 000000000..a58cc5d97 Binary files /dev/null and b/Models/EyesK3/Eyes2Angry.png differ diff --git a/Models/EyesK3/Eyes2Closed.png b/Models/EyesK3/Eyes2Closed.png new file mode 100644 index 000000000..0adefd78e Binary files /dev/null and b/Models/EyesK3/Eyes2Closed.png differ diff --git a/Models/EyesK3/Eyes2Dazed.png b/Models/EyesK3/Eyes2Dazed.png new file mode 100644 index 000000000..88eff6dc6 Binary files /dev/null and b/Models/EyesK3/Eyes2Dazed.png differ diff --git a/Models/EyesK3/Eyes2Heart.png b/Models/EyesK3/Eyes2Heart.png new file mode 100644 index 000000000..98e88c082 Binary files /dev/null and b/Models/EyesK3/Eyes2Heart.png differ diff --git a/Models/EyesK3/Eyes2Neutral.png b/Models/EyesK3/Eyes2Neutral.png new file mode 100644 index 000000000..f62b79737 Binary files /dev/null and b/Models/EyesK3/Eyes2Neutral.png differ diff --git a/Models/EyesK3/Eyes2Sly.png b/Models/EyesK3/Eyes2Sly.png new file mode 100644 index 000000000..28269d225 Binary files /dev/null and b/Models/EyesK3/Eyes2Sly.png differ diff --git a/Models/EyesK3/Eyes2Surprised.png b/Models/EyesK3/Eyes2Surprised.png new file mode 100644 index 000000000..736a7aa76 Binary files /dev/null and b/Models/EyesK3/Eyes2Surprised.png differ diff --git a/Models/EyesK3/EyesAngry.png b/Models/EyesK3/EyesAngry.png new file mode 100644 index 000000000..582d15225 Binary files /dev/null and b/Models/EyesK3/EyesAngry.png differ diff --git a/Models/EyesK3/EyesClosed.png b/Models/EyesK3/EyesClosed.png new file mode 100644 index 000000000..7d46b1ad7 Binary files /dev/null and b/Models/EyesK3/EyesClosed.png differ diff --git a/Models/EyesK3/EyesDazed.png b/Models/EyesK3/EyesDazed.png new file mode 100644 index 000000000..58f0c48c2 Binary files /dev/null and b/Models/EyesK3/EyesDazed.png differ diff --git a/Models/EyesK3/EyesHeart.png b/Models/EyesK3/EyesHeart.png new file mode 100644 index 000000000..0fdcda2b6 Binary files /dev/null and b/Models/EyesK3/EyesHeart.png differ diff --git a/Models/EyesK3/EyesNeutral.png b/Models/EyesK3/EyesNeutral.png new file mode 100644 index 000000000..122ad752d Binary files /dev/null and b/Models/EyesK3/EyesNeutral.png differ diff --git a/Models/EyesK3/EyesSly.png b/Models/EyesK3/EyesSly.png new file mode 100644 index 000000000..17ad5b887 Binary files /dev/null and b/Models/EyesK3/EyesSly.png differ diff --git a/Models/EyesK3/EyesSurprised.png b/Models/EyesK3/EyesSurprised.png new file mode 100644 index 000000000..f70c1a591 Binary files /dev/null and b/Models/EyesK3/EyesSurprised.png differ diff --git a/Models/EyesK3/WhitesEyes2Angry.png b/Models/EyesK3/WhitesEyes2Angry.png new file mode 100644 index 000000000..cb317be07 Binary files /dev/null and b/Models/EyesK3/WhitesEyes2Angry.png differ diff --git a/Models/EyesK3/WhitesEyes2Closed.png b/Models/EyesK3/WhitesEyes2Closed.png new file mode 100644 index 000000000..ee309cdf1 Binary files /dev/null and b/Models/EyesK3/WhitesEyes2Closed.png differ diff --git a/Models/EyesK3/WhitesEyes2Dazed.png b/Models/EyesK3/WhitesEyes2Dazed.png new file mode 100644 index 000000000..0b63a78be Binary files /dev/null and b/Models/EyesK3/WhitesEyes2Dazed.png differ diff --git a/Models/EyesK3/WhitesEyes2Heart.png b/Models/EyesK3/WhitesEyes2Heart.png new file mode 100644 index 000000000..2a4a78080 Binary files /dev/null and b/Models/EyesK3/WhitesEyes2Heart.png differ diff --git a/Models/EyesK3/WhitesEyes2Neutral.png b/Models/EyesK3/WhitesEyes2Neutral.png new file mode 100644 index 000000000..237c2dbad Binary files /dev/null and b/Models/EyesK3/WhitesEyes2Neutral.png differ diff --git a/Models/EyesK3/WhitesEyes2Sly.png b/Models/EyesK3/WhitesEyes2Sly.png new file mode 100644 index 000000000..46531e285 Binary files /dev/null and b/Models/EyesK3/WhitesEyes2Sly.png differ diff --git a/Models/EyesK3/WhitesEyes2Surprised.png b/Models/EyesK3/WhitesEyes2Surprised.png new file mode 100644 index 000000000..8f0cd770e Binary files /dev/null and b/Models/EyesK3/WhitesEyes2Surprised.png differ diff --git a/Models/EyesK3/WhitesEyesAngry.png b/Models/EyesK3/WhitesEyesAngry.png new file mode 100644 index 000000000..fb0727ca9 Binary files /dev/null and b/Models/EyesK3/WhitesEyesAngry.png differ diff --git a/Models/EyesK3/WhitesEyesClosed.png b/Models/EyesK3/WhitesEyesClosed.png new file mode 100644 index 000000000..e5c35e707 Binary files /dev/null and b/Models/EyesK3/WhitesEyesClosed.png differ diff --git a/Models/EyesK3/WhitesEyesDazed.png b/Models/EyesK3/WhitesEyesDazed.png new file mode 100644 index 000000000..2714bf030 Binary files /dev/null and b/Models/EyesK3/WhitesEyesDazed.png differ diff --git a/Models/EyesK3/WhitesEyesHeart.png b/Models/EyesK3/WhitesEyesHeart.png new file mode 100644 index 000000000..0f43e96ce Binary files /dev/null and b/Models/EyesK3/WhitesEyesHeart.png differ diff --git a/Models/EyesK3/WhitesEyesNeutral.png b/Models/EyesK3/WhitesEyesNeutral.png new file mode 100644 index 000000000..a6d157e6b Binary files /dev/null and b/Models/EyesK3/WhitesEyesNeutral.png differ diff --git a/Models/EyesK3/WhitesEyesSly.png b/Models/EyesK3/WhitesEyesSly.png new file mode 100644 index 000000000..3e67de965 Binary files /dev/null and b/Models/EyesK3/WhitesEyesSly.png differ diff --git a/Models/EyesK3/WhitesEyesSurprised.png b/Models/EyesK3/WhitesEyesSurprised.png new file mode 100644 index 000000000..27daa112c Binary files /dev/null and b/Models/EyesK3/WhitesEyesSurprised.png differ diff --git a/Models/EyesK4/Eyes2Angry.png b/Models/EyesK4/Eyes2Angry.png new file mode 100644 index 000000000..fa8fa950f Binary files /dev/null and b/Models/EyesK4/Eyes2Angry.png differ diff --git a/Models/EyesK4/Eyes2Closed.png b/Models/EyesK4/Eyes2Closed.png new file mode 100644 index 000000000..25d23d73d Binary files /dev/null and b/Models/EyesK4/Eyes2Closed.png differ diff --git a/Models/EyesK4/Eyes2Dazed.png b/Models/EyesK4/Eyes2Dazed.png new file mode 100644 index 000000000..437e9747a Binary files /dev/null and b/Models/EyesK4/Eyes2Dazed.png differ diff --git a/Models/EyesK4/Eyes2Heart.png b/Models/EyesK4/Eyes2Heart.png new file mode 100644 index 000000000..63355e709 Binary files /dev/null and b/Models/EyesK4/Eyes2Heart.png differ diff --git a/Models/EyesK4/Eyes2Neutral.png b/Models/EyesK4/Eyes2Neutral.png new file mode 100644 index 000000000..c34706989 Binary files /dev/null and b/Models/EyesK4/Eyes2Neutral.png differ diff --git a/Models/EyesK4/Eyes2Sly.png b/Models/EyesK4/Eyes2Sly.png new file mode 100644 index 000000000..d0a1a4959 Binary files /dev/null and b/Models/EyesK4/Eyes2Sly.png differ diff --git a/Models/EyesK4/Eyes2Surprised.png b/Models/EyesK4/Eyes2Surprised.png new file mode 100644 index 000000000..7a7cb175e Binary files /dev/null and b/Models/EyesK4/Eyes2Surprised.png differ diff --git a/Models/EyesK4/EyesAngry.png b/Models/EyesK4/EyesAngry.png new file mode 100644 index 000000000..dfb76ae4f Binary files /dev/null and b/Models/EyesK4/EyesAngry.png differ diff --git a/Models/EyesK4/EyesClosed.png b/Models/EyesK4/EyesClosed.png new file mode 100644 index 000000000..adf7c4753 Binary files /dev/null and b/Models/EyesK4/EyesClosed.png differ diff --git a/Models/EyesK4/EyesDazed.png b/Models/EyesK4/EyesDazed.png new file mode 100644 index 000000000..f1d697333 Binary files /dev/null and b/Models/EyesK4/EyesDazed.png differ diff --git a/Models/EyesK4/EyesHeart.png b/Models/EyesK4/EyesHeart.png new file mode 100644 index 000000000..4b861734c Binary files /dev/null and b/Models/EyesK4/EyesHeart.png differ diff --git a/Models/EyesK4/EyesNeutral.png b/Models/EyesK4/EyesNeutral.png new file mode 100644 index 000000000..3a0a757ab Binary files /dev/null and b/Models/EyesK4/EyesNeutral.png differ diff --git a/Models/EyesK4/EyesSly.png b/Models/EyesK4/EyesSly.png new file mode 100644 index 000000000..fffd04670 Binary files /dev/null and b/Models/EyesK4/EyesSly.png differ diff --git a/Models/EyesK4/EyesSurprised.png b/Models/EyesK4/EyesSurprised.png new file mode 100644 index 000000000..eca2a4019 Binary files /dev/null and b/Models/EyesK4/EyesSurprised.png differ diff --git a/Models/EyesK4/WhitesEyes2Angry.png b/Models/EyesK4/WhitesEyes2Angry.png new file mode 100644 index 000000000..f8f76708f Binary files /dev/null and b/Models/EyesK4/WhitesEyes2Angry.png differ diff --git a/Models/EyesK4/WhitesEyes2Closed.png b/Models/EyesK4/WhitesEyes2Closed.png new file mode 100644 index 000000000..f0f7f2b29 Binary files /dev/null and b/Models/EyesK4/WhitesEyes2Closed.png differ diff --git a/Models/EyesK4/WhitesEyes2Dazed.png b/Models/EyesK4/WhitesEyes2Dazed.png new file mode 100644 index 000000000..84b7c263b Binary files /dev/null and b/Models/EyesK4/WhitesEyes2Dazed.png differ diff --git a/Models/EyesK4/WhitesEyes2Heart.png b/Models/EyesK4/WhitesEyes2Heart.png new file mode 100644 index 000000000..4bb9bbeaf Binary files /dev/null and b/Models/EyesK4/WhitesEyes2Heart.png differ diff --git a/Models/EyesK4/WhitesEyes2Neutral.png b/Models/EyesK4/WhitesEyes2Neutral.png new file mode 100644 index 000000000..560421022 Binary files /dev/null and b/Models/EyesK4/WhitesEyes2Neutral.png differ diff --git a/Models/EyesK4/WhitesEyes2Sly.png b/Models/EyesK4/WhitesEyes2Sly.png new file mode 100644 index 000000000..b02a80478 Binary files /dev/null and b/Models/EyesK4/WhitesEyes2Sly.png differ diff --git a/Models/EyesK4/WhitesEyes2Surprised.png b/Models/EyesK4/WhitesEyes2Surprised.png new file mode 100644 index 000000000..2e8f7f44f Binary files /dev/null and b/Models/EyesK4/WhitesEyes2Surprised.png differ diff --git a/Models/EyesK4/WhitesEyesAngry.png b/Models/EyesK4/WhitesEyesAngry.png new file mode 100644 index 000000000..87ab40bd6 Binary files /dev/null and b/Models/EyesK4/WhitesEyesAngry.png differ diff --git a/Models/EyesK4/WhitesEyesClosed.png b/Models/EyesK4/WhitesEyesClosed.png new file mode 100644 index 000000000..fa518eff5 Binary files /dev/null and b/Models/EyesK4/WhitesEyesClosed.png differ diff --git a/Models/EyesK4/WhitesEyesDazed.png b/Models/EyesK4/WhitesEyesDazed.png new file mode 100644 index 000000000..32c95e019 Binary files /dev/null and b/Models/EyesK4/WhitesEyesDazed.png differ diff --git a/Models/EyesK4/WhitesEyesHeart.png b/Models/EyesK4/WhitesEyesHeart.png new file mode 100644 index 000000000..7e735f033 Binary files /dev/null and b/Models/EyesK4/WhitesEyesHeart.png differ diff --git a/Models/EyesK4/WhitesEyesNeutral.png b/Models/EyesK4/WhitesEyesNeutral.png new file mode 100644 index 000000000..bdc74b79f Binary files /dev/null and b/Models/EyesK4/WhitesEyesNeutral.png differ diff --git a/Models/EyesK4/WhitesEyesSly.png b/Models/EyesK4/WhitesEyesSly.png new file mode 100644 index 000000000..3b3f15090 Binary files /dev/null and b/Models/EyesK4/WhitesEyesSly.png differ diff --git a/Models/EyesK4/WhitesEyesSurprised.png b/Models/EyesK4/WhitesEyesSurprised.png new file mode 100644 index 000000000..c4083cb8a Binary files /dev/null and b/Models/EyesK4/WhitesEyesSurprised.png differ diff --git a/Models/EyesKertasu/EyesWhitesAngry.png b/Models/EyesKertasu/EyesWhitesAngry.png new file mode 100644 index 000000000..8bd09b052 Binary files /dev/null and b/Models/EyesKertasu/EyesWhitesAngry.png differ diff --git a/Models/EyesKertasu/EyesWhitesBase.png b/Models/EyesKertasu/EyesWhitesBase.png new file mode 100644 index 000000000..366b330d4 Binary files /dev/null and b/Models/EyesKertasu/EyesWhitesBase.png differ diff --git a/Models/EyesKertasu/EyesWhitesClosed.png b/Models/EyesKertasu/EyesWhitesClosed.png new file mode 100644 index 000000000..8bd09b052 Binary files /dev/null and b/Models/EyesKertasu/EyesWhitesClosed.png differ diff --git a/Models/EyesKertasu/EyesWhitesDazed.png b/Models/EyesKertasu/EyesWhitesDazed.png new file mode 100644 index 000000000..8bd09b052 Binary files /dev/null and b/Models/EyesKertasu/EyesWhitesDazed.png differ diff --git a/Models/EyesKertasu/EyesWhitesNeutral.png b/Models/EyesKertasu/EyesWhitesNeutral.png new file mode 100644 index 000000000..8bd09b052 Binary files /dev/null and b/Models/EyesKertasu/EyesWhitesNeutral.png differ diff --git a/Models/EyesKertasu/EyesWhitesSurprised.png b/Models/EyesKertasu/EyesWhitesSurprised.png new file mode 100644 index 000000000..8bd09b052 Binary files /dev/null and b/Models/EyesKertasu/EyesWhitesSurprised.png differ diff --git a/Models/FaceDask/Brows2Angry.png b/Models/FaceDask/Brows2Angry.png new file mode 100644 index 000000000..e7a7e4ea1 Binary files /dev/null and b/Models/FaceDask/Brows2Angry.png differ diff --git a/Models/FaceDask/Brows2Annoyed.png b/Models/FaceDask/Brows2Annoyed.png new file mode 100644 index 000000000..5332dbf58 Binary files /dev/null and b/Models/FaceDask/Brows2Annoyed.png differ diff --git a/Models/FaceDask/Brows2Neutral.png b/Models/FaceDask/Brows2Neutral.png new file mode 100644 index 000000000..3f0ea37be Binary files /dev/null and b/Models/FaceDask/Brows2Neutral.png differ diff --git a/Models/FaceDask/Brows2Sad.png b/Models/FaceDask/Brows2Sad.png new file mode 100644 index 000000000..014ed65a4 Binary files /dev/null and b/Models/FaceDask/Brows2Sad.png differ diff --git a/Models/FaceDask/Brows2Surprised.png b/Models/FaceDask/Brows2Surprised.png new file mode 100644 index 000000000..96d94e762 Binary files /dev/null and b/Models/FaceDask/Brows2Surprised.png differ diff --git a/Models/FaceDask/BrowsAngry.png b/Models/FaceDask/BrowsAngry.png new file mode 100644 index 000000000..7b4fbb72a Binary files /dev/null and b/Models/FaceDask/BrowsAngry.png differ diff --git a/Models/FaceDask/BrowsAnnoyed.png b/Models/FaceDask/BrowsAnnoyed.png new file mode 100644 index 000000000..720cbf9b8 Binary files /dev/null and b/Models/FaceDask/BrowsAnnoyed.png differ diff --git a/Models/FaceDask/BrowsNeutral.png b/Models/FaceDask/BrowsNeutral.png new file mode 100644 index 000000000..8521fb8ec Binary files /dev/null and b/Models/FaceDask/BrowsNeutral.png differ diff --git a/Models/FaceDask/BrowsSad.png b/Models/FaceDask/BrowsSad.png new file mode 100644 index 000000000..8f82e3507 Binary files /dev/null and b/Models/FaceDask/BrowsSad.png differ diff --git a/Models/FaceDask/BrowsSurprised.png b/Models/FaceDask/BrowsSurprised.png new file mode 100644 index 000000000..49fd907d9 Binary files /dev/null and b/Models/FaceDask/BrowsSurprised.png differ diff --git a/Models/FaceDask/Eyes2Angry.png b/Models/FaceDask/Eyes2Angry.png new file mode 100644 index 000000000..1ed3b3002 Binary files /dev/null and b/Models/FaceDask/Eyes2Angry.png differ diff --git a/Models/FaceDask/Eyes2Closed.png b/Models/FaceDask/Eyes2Closed.png new file mode 100644 index 000000000..1371ce5a9 Binary files /dev/null and b/Models/FaceDask/Eyes2Closed.png differ diff --git a/Models/FaceDask/Eyes2Dazed.png b/Models/FaceDask/Eyes2Dazed.png new file mode 100644 index 000000000..38004c8c1 Binary files /dev/null and b/Models/FaceDask/Eyes2Dazed.png differ diff --git a/Models/FaceDask/Eyes2Heart.png b/Models/FaceDask/Eyes2Heart.png new file mode 100644 index 000000000..9c00283b1 Binary files /dev/null and b/Models/FaceDask/Eyes2Heart.png differ diff --git a/Models/FaceDask/Eyes2Neutral.png b/Models/FaceDask/Eyes2Neutral.png new file mode 100644 index 000000000..24ee28b70 Binary files /dev/null and b/Models/FaceDask/Eyes2Neutral.png differ diff --git a/Models/FaceDask/Eyes2Sly.png b/Models/FaceDask/Eyes2Sly.png new file mode 100644 index 000000000..9418bbf50 Binary files /dev/null and b/Models/FaceDask/Eyes2Sly.png differ diff --git a/Models/FaceDask/Eyes2Surprised.png b/Models/FaceDask/Eyes2Surprised.png new file mode 100644 index 000000000..d8e08a76a Binary files /dev/null and b/Models/FaceDask/Eyes2Surprised.png differ diff --git a/Models/FaceDask/EyesAngry.png b/Models/FaceDask/EyesAngry.png new file mode 100644 index 000000000..dd30a80a5 Binary files /dev/null and b/Models/FaceDask/EyesAngry.png differ diff --git a/Models/FaceDask/EyesClosed.png b/Models/FaceDask/EyesClosed.png new file mode 100644 index 000000000..55935d904 Binary files /dev/null and b/Models/FaceDask/EyesClosed.png differ diff --git a/Models/FaceDask/EyesDazed.png b/Models/FaceDask/EyesDazed.png new file mode 100644 index 000000000..1fc3c255d Binary files /dev/null and b/Models/FaceDask/EyesDazed.png differ diff --git a/Models/FaceDask/EyesHeart.png b/Models/FaceDask/EyesHeart.png new file mode 100644 index 000000000..8fecb8510 Binary files /dev/null and b/Models/FaceDask/EyesHeart.png differ diff --git a/Models/FaceDask/EyesNeutral.png b/Models/FaceDask/EyesNeutral.png new file mode 100644 index 000000000..e92f5192c Binary files /dev/null and b/Models/FaceDask/EyesNeutral.png differ diff --git a/Models/FaceDask/EyesSly.png b/Models/FaceDask/EyesSly.png new file mode 100644 index 000000000..f2f68f983 Binary files /dev/null and b/Models/FaceDask/EyesSly.png differ diff --git a/Models/FaceDask/EyesSurprised.png b/Models/FaceDask/EyesSurprised.png new file mode 100644 index 000000000..ba67bf038 Binary files /dev/null and b/Models/FaceDask/EyesSurprised.png differ diff --git a/Models/FaceDask/WhitesEyes2Angry.png b/Models/FaceDask/WhitesEyes2Angry.png new file mode 100644 index 000000000..44531cc24 Binary files /dev/null and b/Models/FaceDask/WhitesEyes2Angry.png differ diff --git a/Models/FaceDask/WhitesEyes2Closed.png b/Models/FaceDask/WhitesEyes2Closed.png new file mode 100644 index 000000000..1907bef63 Binary files /dev/null and b/Models/FaceDask/WhitesEyes2Closed.png differ diff --git a/Models/FaceDask/WhitesEyes2Dazed.png b/Models/FaceDask/WhitesEyes2Dazed.png new file mode 100644 index 000000000..530352c91 Binary files /dev/null and b/Models/FaceDask/WhitesEyes2Dazed.png differ diff --git a/Models/FaceDask/WhitesEyes2Heart.png b/Models/FaceDask/WhitesEyes2Heart.png new file mode 100644 index 000000000..9801180e9 Binary files /dev/null and b/Models/FaceDask/WhitesEyes2Heart.png differ diff --git a/Models/FaceDask/WhitesEyes2Neutral.png b/Models/FaceDask/WhitesEyes2Neutral.png new file mode 100644 index 000000000..4ae16b00d Binary files /dev/null and b/Models/FaceDask/WhitesEyes2Neutral.png differ diff --git a/Models/FaceDask/WhitesEyes2Sly.png b/Models/FaceDask/WhitesEyes2Sly.png new file mode 100644 index 000000000..9d291517a Binary files /dev/null and b/Models/FaceDask/WhitesEyes2Sly.png differ diff --git a/Models/FaceDask/WhitesEyes2Surprised.png b/Models/FaceDask/WhitesEyes2Surprised.png new file mode 100644 index 000000000..fa72bb526 Binary files /dev/null and b/Models/FaceDask/WhitesEyes2Surprised.png differ diff --git a/Models/FaceDask/WhitesEyesAngry.png b/Models/FaceDask/WhitesEyesAngry.png new file mode 100644 index 000000000..b78642ddd Binary files /dev/null and b/Models/FaceDask/WhitesEyesAngry.png differ diff --git a/Models/FaceDask/WhitesEyesClosed.png b/Models/FaceDask/WhitesEyesClosed.png new file mode 100644 index 000000000..0115ae22f Binary files /dev/null and b/Models/FaceDask/WhitesEyesClosed.png differ diff --git a/Models/FaceDask/WhitesEyesDazed.png b/Models/FaceDask/WhitesEyesDazed.png new file mode 100644 index 000000000..47a966867 Binary files /dev/null and b/Models/FaceDask/WhitesEyesDazed.png differ diff --git a/Models/FaceDask/WhitesEyesHeart.png b/Models/FaceDask/WhitesEyesHeart.png new file mode 100644 index 000000000..d3648364c Binary files /dev/null and b/Models/FaceDask/WhitesEyesHeart.png differ diff --git a/Models/FaceDask/WhitesEyesNeutral.png b/Models/FaceDask/WhitesEyesNeutral.png new file mode 100644 index 000000000..3f3d2146b Binary files /dev/null and b/Models/FaceDask/WhitesEyesNeutral.png differ diff --git a/Models/FaceDask/WhitesEyesSly.png b/Models/FaceDask/WhitesEyesSly.png new file mode 100644 index 000000000..f895c8875 Binary files /dev/null and b/Models/FaceDask/WhitesEyesSly.png differ diff --git a/Models/FaceDask/WhitesEyesSurprised.png b/Models/FaceDask/WhitesEyesSurprised.png new file mode 100644 index 000000000..4081ebf35 Binary files /dev/null and b/Models/FaceDask/WhitesEyesSurprised.png differ diff --git a/Models/FaceFang/MouthDazed.png b/Models/FaceFang/MouthDazed.png new file mode 100644 index 000000000..f91a92515 Binary files /dev/null and b/Models/FaceFang/MouthDazed.png differ diff --git a/Models/FaceFang/MouthDistracted.png b/Models/FaceFang/MouthDistracted.png new file mode 100644 index 000000000..a3e1fcdc2 Binary files /dev/null and b/Models/FaceFang/MouthDistracted.png differ diff --git a/Models/FaceFang/MouthEmbarrassed.png b/Models/FaceFang/MouthEmbarrassed.png new file mode 100644 index 000000000..737d29677 Binary files /dev/null and b/Models/FaceFang/MouthEmbarrassed.png differ diff --git a/Models/FaceFang/MouthFrown.png b/Models/FaceFang/MouthFrown.png new file mode 100644 index 000000000..b2bcef471 Binary files /dev/null and b/Models/FaceFang/MouthFrown.png differ diff --git a/Models/FaceFang/MouthNeutral.png b/Models/FaceFang/MouthNeutral.png new file mode 100644 index 000000000..04dc890f4 Binary files /dev/null and b/Models/FaceFang/MouthNeutral.png differ diff --git a/Models/FaceFang/MouthPout.png b/Models/FaceFang/MouthPout.png new file mode 100644 index 000000000..59417b2a6 Binary files /dev/null and b/Models/FaceFang/MouthPout.png differ diff --git a/Models/FaceFang/MouthSmile.png b/Models/FaceFang/MouthSmile.png new file mode 100644 index 000000000..6e5e788f3 Binary files /dev/null and b/Models/FaceFang/MouthSmile.png differ diff --git a/Models/FaceFang/MouthSurprised.png b/Models/FaceFang/MouthSurprised.png new file mode 100644 index 000000000..f442a3030 Binary files /dev/null and b/Models/FaceFang/MouthSurprised.png differ diff --git a/Models/FaceFang2/MouthDazed.png b/Models/FaceFang2/MouthDazed.png new file mode 100644 index 000000000..b7cb40956 Binary files /dev/null and b/Models/FaceFang2/MouthDazed.png differ diff --git a/Models/FaceFang2/MouthDistracted.png b/Models/FaceFang2/MouthDistracted.png new file mode 100644 index 000000000..62ed4f6a0 Binary files /dev/null and b/Models/FaceFang2/MouthDistracted.png differ diff --git a/Models/FaceFang2/MouthEmbarrassed.png b/Models/FaceFang2/MouthEmbarrassed.png new file mode 100644 index 000000000..6e9673a10 Binary files /dev/null and b/Models/FaceFang2/MouthEmbarrassed.png differ diff --git a/Models/FaceFang2/MouthFrown.png b/Models/FaceFang2/MouthFrown.png new file mode 100644 index 000000000..5e0e6e6ac Binary files /dev/null and b/Models/FaceFang2/MouthFrown.png differ diff --git a/Models/FaceFang2/MouthNeutral.png b/Models/FaceFang2/MouthNeutral.png new file mode 100644 index 000000000..d9e2ba278 Binary files /dev/null and b/Models/FaceFang2/MouthNeutral.png differ diff --git a/Models/FaceFang2/MouthPout.png b/Models/FaceFang2/MouthPout.png new file mode 100644 index 000000000..8ab609399 Binary files /dev/null and b/Models/FaceFang2/MouthPout.png differ diff --git a/Models/FaceFang2/MouthSmile.png b/Models/FaceFang2/MouthSmile.png new file mode 100644 index 000000000..46836ebfd Binary files /dev/null and b/Models/FaceFang2/MouthSmile.png differ diff --git a/Models/FaceFang2/MouthSurprised.png b/Models/FaceFang2/MouthSurprised.png new file mode 100644 index 000000000..edc6dbad7 Binary files /dev/null and b/Models/FaceFang2/MouthSurprised.png differ diff --git a/Models/FaceFangless/MouthDazed.png b/Models/FaceFangless/MouthDazed.png new file mode 100644 index 000000000..d7c01e926 Binary files /dev/null and b/Models/FaceFangless/MouthDazed.png differ diff --git a/Models/FaceFangless/MouthDistracted.png b/Models/FaceFangless/MouthDistracted.png new file mode 100644 index 000000000..962185329 Binary files /dev/null and b/Models/FaceFangless/MouthDistracted.png differ diff --git a/Models/FaceFangless/MouthEmbarrassed.png b/Models/FaceFangless/MouthEmbarrassed.png new file mode 100644 index 000000000..79d7f6886 Binary files /dev/null and b/Models/FaceFangless/MouthEmbarrassed.png differ diff --git a/Models/FaceFangless/MouthFrown.png b/Models/FaceFangless/MouthFrown.png new file mode 100644 index 000000000..d41aebe87 Binary files /dev/null and b/Models/FaceFangless/MouthFrown.png differ diff --git a/Models/FaceFangless/MouthNeutral.png b/Models/FaceFangless/MouthNeutral.png new file mode 100644 index 000000000..6d7e520fb Binary files /dev/null and b/Models/FaceFangless/MouthNeutral.png differ diff --git a/Models/FaceFangless/MouthPout.png b/Models/FaceFangless/MouthPout.png new file mode 100644 index 000000000..d2f115fe0 Binary files /dev/null and b/Models/FaceFangless/MouthPout.png differ diff --git a/Models/FaceFangless/MouthSmile.png b/Models/FaceFangless/MouthSmile.png new file mode 100644 index 000000000..4697aeead Binary files /dev/null and b/Models/FaceFangless/MouthSmile.png differ diff --git a/Models/FaceFangless/MouthSurprised.png b/Models/FaceFangless/MouthSurprised.png new file mode 100644 index 000000000..20cfa9d93 Binary files /dev/null and b/Models/FaceFangless/MouthSurprised.png differ diff --git a/Models/FaceKjus/BlushExtreme.png b/Models/FaceKjus/BlushExtreme.png new file mode 100644 index 000000000..315b695b3 Binary files /dev/null and b/Models/FaceKjus/BlushExtreme.png differ diff --git a/Models/FaceKjus/BlushHigh.png b/Models/FaceKjus/BlushHigh.png new file mode 100644 index 000000000..471df9669 Binary files /dev/null and b/Models/FaceKjus/BlushHigh.png differ diff --git a/Models/FaceKjus/BlushLow.png b/Models/FaceKjus/BlushLow.png new file mode 100644 index 000000000..791a1f7c4 Binary files /dev/null and b/Models/FaceKjus/BlushLow.png differ diff --git a/Models/FaceKjus/BlushMedium.png b/Models/FaceKjus/BlushMedium.png new file mode 100644 index 000000000..a5879a9d6 Binary files /dev/null and b/Models/FaceKjus/BlushMedium.png differ diff --git a/Models/FaceKjus/Brows2Angry.png b/Models/FaceKjus/Brows2Angry.png new file mode 100644 index 000000000..8d6ae2a9e Binary files /dev/null and b/Models/FaceKjus/Brows2Angry.png differ diff --git a/Models/FaceKjus/Brows2Annoyed.png b/Models/FaceKjus/Brows2Annoyed.png new file mode 100644 index 000000000..b7081e7c5 Binary files /dev/null and b/Models/FaceKjus/Brows2Annoyed.png differ diff --git a/Models/FaceKjus/Brows2Neutral.png b/Models/FaceKjus/Brows2Neutral.png new file mode 100644 index 000000000..da122b1b4 Binary files /dev/null and b/Models/FaceKjus/Brows2Neutral.png differ diff --git a/Models/FaceKjus/Brows2Sad.png b/Models/FaceKjus/Brows2Sad.png new file mode 100644 index 000000000..1aaade20e Binary files /dev/null and b/Models/FaceKjus/Brows2Sad.png differ diff --git a/Models/FaceKjus/Brows2Surprised.png b/Models/FaceKjus/Brows2Surprised.png new file mode 100644 index 000000000..d4ec141e9 Binary files /dev/null and b/Models/FaceKjus/Brows2Surprised.png differ diff --git a/Models/FaceKjus/BrowsAngry.png b/Models/FaceKjus/BrowsAngry.png new file mode 100644 index 000000000..5799e91ac Binary files /dev/null and b/Models/FaceKjus/BrowsAngry.png differ diff --git a/Models/FaceKjus/BrowsAnnoyed.png b/Models/FaceKjus/BrowsAnnoyed.png new file mode 100644 index 000000000..b9587bfde Binary files /dev/null and b/Models/FaceKjus/BrowsAnnoyed.png differ diff --git a/Models/FaceKjus/BrowsNeutral.png b/Models/FaceKjus/BrowsNeutral.png new file mode 100644 index 000000000..c9d3f0e74 Binary files /dev/null and b/Models/FaceKjus/BrowsNeutral.png differ diff --git a/Models/FaceKjus/BrowsSad.png b/Models/FaceKjus/BrowsSad.png new file mode 100644 index 000000000..fd39d6838 Binary files /dev/null and b/Models/FaceKjus/BrowsSad.png differ diff --git a/Models/FaceKjus/BrowsSurprised.png b/Models/FaceKjus/BrowsSurprised.png new file mode 100644 index 000000000..a017882f7 Binary files /dev/null and b/Models/FaceKjus/BrowsSurprised.png differ diff --git a/Models/FaceKjus/Eyes2Angry.png b/Models/FaceKjus/Eyes2Angry.png new file mode 100644 index 000000000..1a0f84c5f Binary files /dev/null and b/Models/FaceKjus/Eyes2Angry.png differ diff --git a/Models/FaceKjus/Eyes2Closed.png b/Models/FaceKjus/Eyes2Closed.png new file mode 100644 index 000000000..4fcf5e7b2 Binary files /dev/null and b/Models/FaceKjus/Eyes2Closed.png differ diff --git a/Models/FaceKjus/Eyes2Dazed.png b/Models/FaceKjus/Eyes2Dazed.png new file mode 100644 index 000000000..fbcedc4c1 Binary files /dev/null and b/Models/FaceKjus/Eyes2Dazed.png differ diff --git a/Models/FaceKjus/Eyes2Heart.png b/Models/FaceKjus/Eyes2Heart.png new file mode 100644 index 000000000..f4cc00a31 Binary files /dev/null and b/Models/FaceKjus/Eyes2Heart.png differ diff --git a/Models/FaceKjus/Eyes2Neutral.png b/Models/FaceKjus/Eyes2Neutral.png new file mode 100644 index 000000000..7f5d1d753 Binary files /dev/null and b/Models/FaceKjus/Eyes2Neutral.png differ diff --git a/Models/FaceKjus/Eyes2Sly.png b/Models/FaceKjus/Eyes2Sly.png new file mode 100644 index 000000000..44d56e763 Binary files /dev/null and b/Models/FaceKjus/Eyes2Sly.png differ diff --git a/Models/FaceKjus/Eyes2Surprised.png b/Models/FaceKjus/Eyes2Surprised.png new file mode 100644 index 000000000..12bd54bfd Binary files /dev/null and b/Models/FaceKjus/Eyes2Surprised.png differ diff --git a/Models/FaceKjus/EyesAngry.png b/Models/FaceKjus/EyesAngry.png new file mode 100644 index 000000000..5542faefa Binary files /dev/null and b/Models/FaceKjus/EyesAngry.png differ diff --git a/Models/FaceKjus/EyesClosed.png b/Models/FaceKjus/EyesClosed.png new file mode 100644 index 000000000..0c1744a8b Binary files /dev/null and b/Models/FaceKjus/EyesClosed.png differ diff --git a/Models/FaceKjus/EyesDazed.png b/Models/FaceKjus/EyesDazed.png new file mode 100644 index 000000000..22a2f478d Binary files /dev/null and b/Models/FaceKjus/EyesDazed.png differ diff --git a/Models/FaceKjus/EyesHeart.png b/Models/FaceKjus/EyesHeart.png new file mode 100644 index 000000000..e297259c0 Binary files /dev/null and b/Models/FaceKjus/EyesHeart.png differ diff --git a/Models/FaceKjus/EyesNeutral.png b/Models/FaceKjus/EyesNeutral.png new file mode 100644 index 000000000..0746f94d4 Binary files /dev/null and b/Models/FaceKjus/EyesNeutral.png differ diff --git a/Models/FaceKjus/EyesSly.png b/Models/FaceKjus/EyesSly.png new file mode 100644 index 000000000..62826a2f1 Binary files /dev/null and b/Models/FaceKjus/EyesSly.png differ diff --git a/Models/FaceKjus/EyesSurprised.png b/Models/FaceKjus/EyesSurprised.png new file mode 100644 index 000000000..9885f91bc Binary files /dev/null and b/Models/FaceKjus/EyesSurprised.png differ diff --git a/Models/FaceKjus/MouthDazed.png b/Models/FaceKjus/MouthDazed.png new file mode 100644 index 000000000..e821d2bd0 Binary files /dev/null and b/Models/FaceKjus/MouthDazed.png differ diff --git a/Models/FaceKjus/MouthDistracted.png b/Models/FaceKjus/MouthDistracted.png new file mode 100644 index 000000000..1887d0512 Binary files /dev/null and b/Models/FaceKjus/MouthDistracted.png differ diff --git a/Models/FaceKjus/MouthEmbarrassed.png b/Models/FaceKjus/MouthEmbarrassed.png new file mode 100644 index 000000000..02d993364 Binary files /dev/null and b/Models/FaceKjus/MouthEmbarrassed.png differ diff --git a/Models/FaceKjus/MouthFrown.png b/Models/FaceKjus/MouthFrown.png new file mode 100644 index 000000000..e9b875e39 Binary files /dev/null and b/Models/FaceKjus/MouthFrown.png differ diff --git a/Models/FaceKjus/MouthNeutral.png b/Models/FaceKjus/MouthNeutral.png new file mode 100644 index 000000000..81b881578 Binary files /dev/null and b/Models/FaceKjus/MouthNeutral.png differ diff --git a/Models/FaceKjus/MouthPout.png b/Models/FaceKjus/MouthPout.png new file mode 100644 index 000000000..86baee437 Binary files /dev/null and b/Models/FaceKjus/MouthPout.png differ diff --git a/Models/FaceKjus/MouthSmile.png b/Models/FaceKjus/MouthSmile.png new file mode 100644 index 000000000..88868834f Binary files /dev/null and b/Models/FaceKjus/MouthSmile.png differ diff --git a/Models/FaceKjus/MouthSurprised.png b/Models/FaceKjus/MouthSurprised.png new file mode 100644 index 000000000..01e647607 Binary files /dev/null and b/Models/FaceKjus/MouthSurprised.png differ diff --git a/Models/FaceKjus/WhitesEyes2Angry.png b/Models/FaceKjus/WhitesEyes2Angry.png new file mode 100644 index 000000000..e61bc0cef Binary files /dev/null and b/Models/FaceKjus/WhitesEyes2Angry.png differ diff --git a/Models/FaceKjus/WhitesEyes2Closed.png b/Models/FaceKjus/WhitesEyes2Closed.png new file mode 100644 index 000000000..4fcf5e7b2 Binary files /dev/null and b/Models/FaceKjus/WhitesEyes2Closed.png differ diff --git a/Models/FaceKjus/WhitesEyes2Dazed.png b/Models/FaceKjus/WhitesEyes2Dazed.png new file mode 100644 index 000000000..42dd4361b Binary files /dev/null and b/Models/FaceKjus/WhitesEyes2Dazed.png differ diff --git a/Models/FaceKjus/WhitesEyes2Heart.png b/Models/FaceKjus/WhitesEyes2Heart.png new file mode 100644 index 000000000..a18bff157 Binary files /dev/null and b/Models/FaceKjus/WhitesEyes2Heart.png differ diff --git a/Models/FaceKjus/WhitesEyes2Neutral.png b/Models/FaceKjus/WhitesEyes2Neutral.png new file mode 100644 index 000000000..7b13e88f8 Binary files /dev/null and b/Models/FaceKjus/WhitesEyes2Neutral.png differ diff --git a/Models/FaceKjus/WhitesEyes2Sly.png b/Models/FaceKjus/WhitesEyes2Sly.png new file mode 100644 index 000000000..85d5ee215 Binary files /dev/null and b/Models/FaceKjus/WhitesEyes2Sly.png differ diff --git a/Models/FaceKjus/WhitesEyes2Surprised.png b/Models/FaceKjus/WhitesEyes2Surprised.png new file mode 100644 index 000000000..6a8c677ff Binary files /dev/null and b/Models/FaceKjus/WhitesEyes2Surprised.png differ diff --git a/Models/FaceKjus/WhitesEyesAngry.png b/Models/FaceKjus/WhitesEyesAngry.png new file mode 100644 index 000000000..3ce6f7b7f Binary files /dev/null and b/Models/FaceKjus/WhitesEyesAngry.png differ diff --git a/Models/FaceKjus/WhitesEyesClosed.png b/Models/FaceKjus/WhitesEyesClosed.png new file mode 100644 index 000000000..07d459c7c Binary files /dev/null and b/Models/FaceKjus/WhitesEyesClosed.png differ diff --git a/Models/FaceKjus/WhitesEyesDazed.png b/Models/FaceKjus/WhitesEyesDazed.png new file mode 100644 index 000000000..814e0bb9b Binary files /dev/null and b/Models/FaceKjus/WhitesEyesDazed.png differ diff --git a/Models/FaceKjus/WhitesEyesHeart.png b/Models/FaceKjus/WhitesEyesHeart.png new file mode 100644 index 000000000..685711985 Binary files /dev/null and b/Models/FaceKjus/WhitesEyesHeart.png differ diff --git a/Models/FaceKjus/WhitesEyesNeutral.png b/Models/FaceKjus/WhitesEyesNeutral.png new file mode 100644 index 000000000..2ad67a1ca Binary files /dev/null and b/Models/FaceKjus/WhitesEyesNeutral.png differ diff --git a/Models/FaceKjus/WhitesEyesSly.png b/Models/FaceKjus/WhitesEyesSly.png new file mode 100644 index 000000000..0b3b7b36a Binary files /dev/null and b/Models/FaceKjus/WhitesEyesSly.png differ diff --git a/Models/FaceKjus/WhitesEyesSurprised.png b/Models/FaceKjus/WhitesEyesSurprised.png new file mode 100644 index 000000000..1826c4b63 Binary files /dev/null and b/Models/FaceKjus/WhitesEyesSurprised.png differ diff --git a/Models/FaceKoi/BlushExtreme.png b/Models/FaceKoi/BlushExtreme.png new file mode 100644 index 000000000..5c87ec184 Binary files /dev/null and b/Models/FaceKoi/BlushExtreme.png differ diff --git a/Models/FaceKoi/BlushHigh.png b/Models/FaceKoi/BlushHigh.png new file mode 100644 index 000000000..6a32015cd Binary files /dev/null and b/Models/FaceKoi/BlushHigh.png differ diff --git a/Models/FaceKoi/BlushLow.png b/Models/FaceKoi/BlushLow.png new file mode 100644 index 000000000..adabf50c8 Binary files /dev/null and b/Models/FaceKoi/BlushLow.png differ diff --git a/Models/FaceKoi/BlushMedium.png b/Models/FaceKoi/BlushMedium.png new file mode 100644 index 000000000..cb03478d7 Binary files /dev/null and b/Models/FaceKoi/BlushMedium.png differ diff --git a/Models/FaceKoi/Brows2Angry.png b/Models/FaceKoi/Brows2Angry.png new file mode 100644 index 000000000..0b65a9960 Binary files /dev/null and b/Models/FaceKoi/Brows2Angry.png differ diff --git a/Models/FaceKoi/Brows2Annoyed.png b/Models/FaceKoi/Brows2Annoyed.png new file mode 100644 index 000000000..2a96daee3 Binary files /dev/null and b/Models/FaceKoi/Brows2Annoyed.png differ diff --git a/Models/FaceKoi/Brows2Neutral.png b/Models/FaceKoi/Brows2Neutral.png new file mode 100644 index 000000000..7c2b70ee1 Binary files /dev/null and b/Models/FaceKoi/Brows2Neutral.png differ diff --git a/Models/FaceKoi/Brows2Sad.png b/Models/FaceKoi/Brows2Sad.png new file mode 100644 index 000000000..d4370cba8 Binary files /dev/null and b/Models/FaceKoi/Brows2Sad.png differ diff --git a/Models/FaceKoi/Brows2Surprised.png b/Models/FaceKoi/Brows2Surprised.png new file mode 100644 index 000000000..adb3d9760 Binary files /dev/null and b/Models/FaceKoi/Brows2Surprised.png differ diff --git a/Models/FaceKoi/BrowsAngry.png b/Models/FaceKoi/BrowsAngry.png new file mode 100644 index 000000000..f031612b9 Binary files /dev/null and b/Models/FaceKoi/BrowsAngry.png differ diff --git a/Models/FaceKoi/BrowsAnnoyed.png b/Models/FaceKoi/BrowsAnnoyed.png new file mode 100644 index 000000000..0e6364ac3 Binary files /dev/null and b/Models/FaceKoi/BrowsAnnoyed.png differ diff --git a/Models/FaceKoi/BrowsNeutral.png b/Models/FaceKoi/BrowsNeutral.png new file mode 100644 index 000000000..14c38b457 Binary files /dev/null and b/Models/FaceKoi/BrowsNeutral.png differ diff --git a/Models/FaceKoi/BrowsSad.png b/Models/FaceKoi/BrowsSad.png new file mode 100644 index 000000000..84d014011 Binary files /dev/null and b/Models/FaceKoi/BrowsSad.png differ diff --git a/Models/FaceKoi/BrowsSurprised.png b/Models/FaceKoi/BrowsSurprised.png new file mode 100644 index 000000000..deafa1d9c Binary files /dev/null and b/Models/FaceKoi/BrowsSurprised.png differ diff --git a/Models/FaceKoi/Eyes2Angry.png b/Models/FaceKoi/Eyes2Angry.png new file mode 100644 index 000000000..c5eb7eccd Binary files /dev/null and b/Models/FaceKoi/Eyes2Angry.png differ diff --git a/Models/FaceKoi/Eyes2Closed.png b/Models/FaceKoi/Eyes2Closed.png new file mode 100644 index 000000000..27e484b21 Binary files /dev/null and b/Models/FaceKoi/Eyes2Closed.png differ diff --git a/Models/FaceKoi/Eyes2Dazed.png b/Models/FaceKoi/Eyes2Dazed.png new file mode 100644 index 000000000..0f31d3d9f Binary files /dev/null and b/Models/FaceKoi/Eyes2Dazed.png differ diff --git a/Models/FaceKoi/Eyes2Heart.png b/Models/FaceKoi/Eyes2Heart.png new file mode 100644 index 000000000..7c739bf75 Binary files /dev/null and b/Models/FaceKoi/Eyes2Heart.png differ diff --git a/Models/FaceKoi/Eyes2Neutral.png b/Models/FaceKoi/Eyes2Neutral.png new file mode 100644 index 000000000..6a45246cf Binary files /dev/null and b/Models/FaceKoi/Eyes2Neutral.png differ diff --git a/Models/FaceKoi/Eyes2Sly.png b/Models/FaceKoi/Eyes2Sly.png new file mode 100644 index 000000000..2645c4f59 Binary files /dev/null and b/Models/FaceKoi/Eyes2Sly.png differ diff --git a/Models/FaceKoi/Eyes2Surprised.png b/Models/FaceKoi/Eyes2Surprised.png new file mode 100644 index 000000000..78cf82b43 Binary files /dev/null and b/Models/FaceKoi/Eyes2Surprised.png differ diff --git a/Models/FaceKoi/EyesAngry.png b/Models/FaceKoi/EyesAngry.png new file mode 100644 index 000000000..0693454bb Binary files /dev/null and b/Models/FaceKoi/EyesAngry.png differ diff --git a/Models/FaceKoi/EyesClosed.png b/Models/FaceKoi/EyesClosed.png new file mode 100644 index 000000000..81cb9ff80 Binary files /dev/null and b/Models/FaceKoi/EyesClosed.png differ diff --git a/Models/FaceKoi/EyesDazed.png b/Models/FaceKoi/EyesDazed.png new file mode 100644 index 000000000..6ab07eefd Binary files /dev/null and b/Models/FaceKoi/EyesDazed.png differ diff --git a/Models/FaceKoi/EyesHeart.png b/Models/FaceKoi/EyesHeart.png new file mode 100644 index 000000000..01731d083 Binary files /dev/null and b/Models/FaceKoi/EyesHeart.png differ diff --git a/Models/FaceKoi/EyesNeutral.png b/Models/FaceKoi/EyesNeutral.png new file mode 100644 index 000000000..c666fa6b6 Binary files /dev/null and b/Models/FaceKoi/EyesNeutral.png differ diff --git a/Models/FaceKoi/EyesSly.png b/Models/FaceKoi/EyesSly.png new file mode 100644 index 000000000..e527f6a8d Binary files /dev/null and b/Models/FaceKoi/EyesSly.png differ diff --git a/Models/FaceKoi/EyesSurprised.png b/Models/FaceKoi/EyesSurprised.png new file mode 100644 index 000000000..214659889 Binary files /dev/null and b/Models/FaceKoi/EyesSurprised.png differ diff --git a/Models/FaceKoi/HumanEyes2Angry.png b/Models/FaceKoi/HumanEyes2Angry.png new file mode 100644 index 000000000..d48116d57 Binary files /dev/null and b/Models/FaceKoi/HumanEyes2Angry.png differ diff --git a/Models/FaceKoi/HumanEyes2Closed.png b/Models/FaceKoi/HumanEyes2Closed.png new file mode 100644 index 000000000..ab34a804b Binary files /dev/null and b/Models/FaceKoi/HumanEyes2Closed.png differ diff --git a/Models/FaceKoi/HumanEyes2Dazed.png b/Models/FaceKoi/HumanEyes2Dazed.png new file mode 100644 index 000000000..2be477603 Binary files /dev/null and b/Models/FaceKoi/HumanEyes2Dazed.png differ diff --git a/Models/FaceKoi/HumanEyes2Heart.png b/Models/FaceKoi/HumanEyes2Heart.png new file mode 100644 index 000000000..7c739bf75 Binary files /dev/null and b/Models/FaceKoi/HumanEyes2Heart.png differ diff --git a/Models/FaceKoi/HumanEyes2Neutral.png b/Models/FaceKoi/HumanEyes2Neutral.png new file mode 100644 index 000000000..9bb0a642c Binary files /dev/null and b/Models/FaceKoi/HumanEyes2Neutral.png differ diff --git a/Models/FaceKoi/HumanEyes2Sly.png b/Models/FaceKoi/HumanEyes2Sly.png new file mode 100644 index 000000000..3aa77235c Binary files /dev/null and b/Models/FaceKoi/HumanEyes2Sly.png differ diff --git a/Models/FaceKoi/HumanEyes2Surprised.png b/Models/FaceKoi/HumanEyes2Surprised.png new file mode 100644 index 000000000..9fb293174 Binary files /dev/null and b/Models/FaceKoi/HumanEyes2Surprised.png differ diff --git a/Models/FaceKoi/HumanEyesAngry.png b/Models/FaceKoi/HumanEyesAngry.png new file mode 100644 index 000000000..f085f0c6a Binary files /dev/null and b/Models/FaceKoi/HumanEyesAngry.png differ diff --git a/Models/FaceKoi/HumanEyesClosed.png b/Models/FaceKoi/HumanEyesClosed.png new file mode 100644 index 000000000..81cb9ff80 Binary files /dev/null and b/Models/FaceKoi/HumanEyesClosed.png differ diff --git a/Models/FaceKoi/HumanEyesDazed.png b/Models/FaceKoi/HumanEyesDazed.png new file mode 100644 index 000000000..307c3af88 Binary files /dev/null and b/Models/FaceKoi/HumanEyesDazed.png differ diff --git a/Models/FaceKoi/HumanEyesHeart.png b/Models/FaceKoi/HumanEyesHeart.png new file mode 100644 index 000000000..5a54cba88 Binary files /dev/null and b/Models/FaceKoi/HumanEyesHeart.png differ diff --git a/Models/FaceKoi/HumanEyesNeutral.png b/Models/FaceKoi/HumanEyesNeutral.png new file mode 100644 index 000000000..3ad2eb791 Binary files /dev/null and b/Models/FaceKoi/HumanEyesNeutral.png differ diff --git a/Models/FaceKoi/HumanEyesSly.png b/Models/FaceKoi/HumanEyesSly.png new file mode 100644 index 000000000..937d48ab1 Binary files /dev/null and b/Models/FaceKoi/HumanEyesSly.png differ diff --git a/Models/FaceKoi/HumanEyesSurprised.png b/Models/FaceKoi/HumanEyesSurprised.png new file mode 100644 index 000000000..7050798c8 Binary files /dev/null and b/Models/FaceKoi/HumanEyesSurprised.png differ diff --git a/Models/FaceKoi/MouthDazed.png b/Models/FaceKoi/MouthDazed.png new file mode 100644 index 000000000..59e6117e3 Binary files /dev/null and b/Models/FaceKoi/MouthDazed.png differ diff --git a/Models/FaceKoi/MouthDistracted.png b/Models/FaceKoi/MouthDistracted.png new file mode 100644 index 000000000..ab58d8288 Binary files /dev/null and b/Models/FaceKoi/MouthDistracted.png differ diff --git a/Models/FaceKoi/MouthEmbarrassed.png b/Models/FaceKoi/MouthEmbarrassed.png new file mode 100644 index 000000000..99d3a9159 Binary files /dev/null and b/Models/FaceKoi/MouthEmbarrassed.png differ diff --git a/Models/FaceKoi/MouthFrown.png b/Models/FaceKoi/MouthFrown.png new file mode 100644 index 000000000..f6dcbfa13 Binary files /dev/null and b/Models/FaceKoi/MouthFrown.png differ diff --git a/Models/FaceKoi/MouthNeutral.png b/Models/FaceKoi/MouthNeutral.png new file mode 100644 index 000000000..f097f5b92 Binary files /dev/null and b/Models/FaceKoi/MouthNeutral.png differ diff --git a/Models/FaceKoi/MouthPout.png b/Models/FaceKoi/MouthPout.png new file mode 100644 index 000000000..e485b4a46 Binary files /dev/null and b/Models/FaceKoi/MouthPout.png differ diff --git a/Models/FaceKoi/MouthSmile.png b/Models/FaceKoi/MouthSmile.png new file mode 100644 index 000000000..9915ad38f Binary files /dev/null and b/Models/FaceKoi/MouthSmile.png differ diff --git a/Models/FaceKoi/MouthSurprised.png b/Models/FaceKoi/MouthSurprised.png new file mode 100644 index 000000000..e7ad97988 Binary files /dev/null and b/Models/FaceKoi/MouthSurprised.png differ diff --git a/Models/FaceKoi/WhitesEyes2Angry.png b/Models/FaceKoi/WhitesEyes2Angry.png new file mode 100644 index 000000000..aa6d6340a Binary files /dev/null and b/Models/FaceKoi/WhitesEyes2Angry.png differ diff --git a/Models/FaceKoi/WhitesEyes2Closed.png b/Models/FaceKoi/WhitesEyes2Closed.png new file mode 100644 index 000000000..a3a7f6e3d Binary files /dev/null and b/Models/FaceKoi/WhitesEyes2Closed.png differ diff --git a/Models/FaceKoi/WhitesEyes2Dazed.png b/Models/FaceKoi/WhitesEyes2Dazed.png new file mode 100644 index 000000000..a812d3edc Binary files /dev/null and b/Models/FaceKoi/WhitesEyes2Dazed.png differ diff --git a/Models/FaceKoi/WhitesEyes2Heart.png b/Models/FaceKoi/WhitesEyes2Heart.png new file mode 100644 index 000000000..5df9776bb Binary files /dev/null and b/Models/FaceKoi/WhitesEyes2Heart.png differ diff --git a/Models/FaceKoi/WhitesEyes2Neutral.png b/Models/FaceKoi/WhitesEyes2Neutral.png new file mode 100644 index 000000000..2a5840b7a Binary files /dev/null and b/Models/FaceKoi/WhitesEyes2Neutral.png differ diff --git a/Models/FaceKoi/WhitesEyes2Sly.png b/Models/FaceKoi/WhitesEyes2Sly.png new file mode 100644 index 000000000..f9759c010 Binary files /dev/null and b/Models/FaceKoi/WhitesEyes2Sly.png differ diff --git a/Models/FaceKoi/WhitesEyes2Surprised.png b/Models/FaceKoi/WhitesEyes2Surprised.png new file mode 100644 index 000000000..5df9776bb Binary files /dev/null and b/Models/FaceKoi/WhitesEyes2Surprised.png differ diff --git a/Models/FaceKoi/WhitesEyesAngry.png b/Models/FaceKoi/WhitesEyesAngry.png new file mode 100644 index 000000000..7d1f35d1f Binary files /dev/null and b/Models/FaceKoi/WhitesEyesAngry.png differ diff --git a/Models/FaceKoi/WhitesEyesClosed.png b/Models/FaceKoi/WhitesEyesClosed.png new file mode 100644 index 000000000..81cb9ff80 Binary files /dev/null and b/Models/FaceKoi/WhitesEyesClosed.png differ diff --git a/Models/FaceKoi/WhitesEyesDazed.png b/Models/FaceKoi/WhitesEyesDazed.png new file mode 100644 index 000000000..c72bf14dc Binary files /dev/null and b/Models/FaceKoi/WhitesEyesDazed.png differ diff --git a/Models/FaceKoi/WhitesEyesHeart.png b/Models/FaceKoi/WhitesEyesHeart.png new file mode 100644 index 000000000..0e48c6ba3 Binary files /dev/null and b/Models/FaceKoi/WhitesEyesHeart.png differ diff --git a/Models/FaceKoi/WhitesEyesNeutral.png b/Models/FaceKoi/WhitesEyesNeutral.png new file mode 100644 index 000000000..14d669432 Binary files /dev/null and b/Models/FaceKoi/WhitesEyesNeutral.png differ diff --git a/Models/FaceKoi/WhitesEyesSly.png b/Models/FaceKoi/WhitesEyesSly.png new file mode 100644 index 000000000..329f06a88 Binary files /dev/null and b/Models/FaceKoi/WhitesEyesSly.png differ diff --git a/Models/FaceKoi/WhitesEyesSurprised.png b/Models/FaceKoi/WhitesEyesSurprised.png new file mode 100644 index 000000000..0e48c6ba3 Binary files /dev/null and b/Models/FaceKoi/WhitesEyesSurprised.png differ diff --git a/Models/FaceKoiBlank/Eyes2Angry.png b/Models/FaceKoiBlank/Eyes2Angry.png new file mode 100644 index 000000000..fe59d43a5 Binary files /dev/null and b/Models/FaceKoiBlank/Eyes2Angry.png differ diff --git a/Models/FaceKoiBlank/Eyes2Closed.png b/Models/FaceKoiBlank/Eyes2Closed.png new file mode 100644 index 000000000..04a2c7818 Binary files /dev/null and b/Models/FaceKoiBlank/Eyes2Closed.png differ diff --git a/Models/FaceKoiBlank/Eyes2Dazed.png b/Models/FaceKoiBlank/Eyes2Dazed.png new file mode 100644 index 000000000..6b89f229a Binary files /dev/null and b/Models/FaceKoiBlank/Eyes2Dazed.png differ diff --git a/Models/FaceKoiBlank/Eyes2Heart.png b/Models/FaceKoiBlank/Eyes2Heart.png new file mode 100644 index 000000000..7c739bf75 Binary files /dev/null and b/Models/FaceKoiBlank/Eyes2Heart.png differ diff --git a/Models/FaceKoiBlank/Eyes2Neutral.png b/Models/FaceKoiBlank/Eyes2Neutral.png new file mode 100644 index 000000000..f289c2d18 Binary files /dev/null and b/Models/FaceKoiBlank/Eyes2Neutral.png differ diff --git a/Models/FaceKoiBlank/Eyes2Sly.png b/Models/FaceKoiBlank/Eyes2Sly.png new file mode 100644 index 000000000..5c66a9141 Binary files /dev/null and b/Models/FaceKoiBlank/Eyes2Sly.png differ diff --git a/Models/FaceKoiBlank/Eyes2Surprised.png b/Models/FaceKoiBlank/Eyes2Surprised.png new file mode 100644 index 000000000..64eb6326c Binary files /dev/null and b/Models/FaceKoiBlank/Eyes2Surprised.png differ diff --git a/Models/FaceKoiBlank/EyesAngry.png b/Models/FaceKoiBlank/EyesAngry.png new file mode 100644 index 000000000..953aeb374 Binary files /dev/null and b/Models/FaceKoiBlank/EyesAngry.png differ diff --git a/Models/FaceKoiBlank/EyesClosed.png b/Models/FaceKoiBlank/EyesClosed.png new file mode 100644 index 000000000..81cb9ff80 Binary files /dev/null and b/Models/FaceKoiBlank/EyesClosed.png differ diff --git a/Models/FaceKoiBlank/EyesDazed.png b/Models/FaceKoiBlank/EyesDazed.png new file mode 100644 index 000000000..69dde913b Binary files /dev/null and b/Models/FaceKoiBlank/EyesDazed.png differ diff --git a/Models/FaceKoiBlank/EyesHeart.png b/Models/FaceKoiBlank/EyesHeart.png new file mode 100644 index 000000000..eb1b5b0c6 Binary files /dev/null and b/Models/FaceKoiBlank/EyesHeart.png differ diff --git a/Models/FaceKoiBlank/EyesNeutral.png b/Models/FaceKoiBlank/EyesNeutral.png new file mode 100644 index 000000000..1f32e99b7 Binary files /dev/null and b/Models/FaceKoiBlank/EyesNeutral.png differ diff --git a/Models/FaceKoiBlank/EyesSly.png b/Models/FaceKoiBlank/EyesSly.png new file mode 100644 index 000000000..97dc8f0ca Binary files /dev/null and b/Models/FaceKoiBlank/EyesSly.png differ diff --git a/Models/FaceKoiBlank/EyesSurprised.png b/Models/FaceKoiBlank/EyesSurprised.png new file mode 100644 index 000000000..6b87cb38b Binary files /dev/null and b/Models/FaceKoiBlank/EyesSurprised.png differ diff --git a/Models/FaceKoiBlank/WhitesEyes2Angry.png b/Models/FaceKoiBlank/WhitesEyes2Angry.png new file mode 100644 index 000000000..aa6d6340a Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyes2Angry.png differ diff --git a/Models/FaceKoiBlank/WhitesEyes2Closed.png b/Models/FaceKoiBlank/WhitesEyes2Closed.png new file mode 100644 index 000000000..a3a7f6e3d Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyes2Closed.png differ diff --git a/Models/FaceKoiBlank/WhitesEyes2Dazed.png b/Models/FaceKoiBlank/WhitesEyes2Dazed.png new file mode 100644 index 000000000..a812d3edc Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyes2Dazed.png differ diff --git a/Models/FaceKoiBlank/WhitesEyes2Heart.png b/Models/FaceKoiBlank/WhitesEyes2Heart.png new file mode 100644 index 000000000..5df9776bb Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyes2Heart.png differ diff --git a/Models/FaceKoiBlank/WhitesEyes2Neutral.png b/Models/FaceKoiBlank/WhitesEyes2Neutral.png new file mode 100644 index 000000000..2a5840b7a Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyes2Neutral.png differ diff --git a/Models/FaceKoiBlank/WhitesEyes2Sly.png b/Models/FaceKoiBlank/WhitesEyes2Sly.png new file mode 100644 index 000000000..974508f88 Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyes2Sly.png differ diff --git a/Models/FaceKoiBlank/WhitesEyes2Surprised.png b/Models/FaceKoiBlank/WhitesEyes2Surprised.png new file mode 100644 index 000000000..5df9776bb Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyes2Surprised.png differ diff --git a/Models/FaceKoiBlank/WhitesEyesAngry.png b/Models/FaceKoiBlank/WhitesEyesAngry.png new file mode 100644 index 000000000..7d1f35d1f Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyesAngry.png differ diff --git a/Models/FaceKoiBlank/WhitesEyesClosed.png b/Models/FaceKoiBlank/WhitesEyesClosed.png new file mode 100644 index 000000000..81cb9ff80 Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyesClosed.png differ diff --git a/Models/FaceKoiBlank/WhitesEyesDazed.png b/Models/FaceKoiBlank/WhitesEyesDazed.png new file mode 100644 index 000000000..c72bf14dc Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyesDazed.png differ diff --git a/Models/FaceKoiBlank/WhitesEyesHeart.png b/Models/FaceKoiBlank/WhitesEyesHeart.png new file mode 100644 index 000000000..0e48c6ba3 Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyesHeart.png differ diff --git a/Models/FaceKoiBlank/WhitesEyesNeutral.png b/Models/FaceKoiBlank/WhitesEyesNeutral.png new file mode 100644 index 000000000..14d669432 Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyesNeutral.png differ diff --git a/Models/FaceKoiBlank/WhitesEyesSly.png b/Models/FaceKoiBlank/WhitesEyesSly.png new file mode 100644 index 000000000..9e8de8c7b Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyesSly.png differ diff --git a/Models/FaceKoiBlank/WhitesEyesSurprised.png b/Models/FaceKoiBlank/WhitesEyesSurprised.png new file mode 100644 index 000000000..0e48c6ba3 Binary files /dev/null and b/Models/FaceKoiBlank/WhitesEyesSurprised.png differ diff --git a/Models/Festive/BinderFluffLeftBoxtie.png b/Models/Festive/BinderFluffLeftBoxtie.png new file mode 100644 index 000000000..5a619346b Binary files /dev/null and b/Models/Festive/BinderFluffLeftBoxtie.png differ diff --git a/Models/Festive/BinderFluffLeftWristtie.png b/Models/Festive/BinderFluffLeftWristtie.png new file mode 100644 index 000000000..97a6591c2 Binary files /dev/null and b/Models/Festive/BinderFluffLeftWristtie.png differ diff --git a/Models/Festive/BinderLeftBoxtie.png b/Models/Festive/BinderLeftBoxtie.png new file mode 100644 index 000000000..5d1076b41 Binary files /dev/null and b/Models/Festive/BinderLeftBoxtie.png differ diff --git a/Models/Festive/BinderLeftWristtie.png b/Models/Festive/BinderLeftWristtie.png new file mode 100644 index 000000000..4f5847d50 Binary files /dev/null and b/Models/Festive/BinderLeftWristtie.png differ diff --git a/Models/Festive/BinderRightBoxtie.png b/Models/Festive/BinderRightBoxtie.png new file mode 100644 index 000000000..4abb87768 Binary files /dev/null and b/Models/Festive/BinderRightBoxtie.png differ diff --git a/Models/Festive/BinderRightWristtie.png b/Models/Festive/BinderRightWristtie.png new file mode 100644 index 000000000..45fea715d Binary files /dev/null and b/Models/Festive/BinderRightWristtie.png differ diff --git a/Models/Festive/BinderStrapLeftBoxtie.png b/Models/Festive/BinderStrapLeftBoxtie.png new file mode 100644 index 000000000..f491ae34a Binary files /dev/null and b/Models/Festive/BinderStrapLeftBoxtie.png differ diff --git a/Models/Festive/BinderStrapLeftWristtie.png b/Models/Festive/BinderStrapLeftWristtie.png new file mode 100644 index 000000000..9f0c98536 Binary files /dev/null and b/Models/Festive/BinderStrapLeftWristtie.png differ diff --git a/Models/Festive/ButtonsBot.png b/Models/Festive/ButtonsBot.png new file mode 100644 index 000000000..0ce002de2 Binary files /dev/null and b/Models/Festive/ButtonsBot.png differ diff --git a/Models/Festive/ButtonsMid.png b/Models/Festive/ButtonsMid.png new file mode 100644 index 000000000..867b5e874 Binary files /dev/null and b/Models/Festive/ButtonsMid.png differ diff --git a/Models/Festive/ButtonsTop.png b/Models/Festive/ButtonsTop.png new file mode 100644 index 000000000..423b0b856 Binary files /dev/null and b/Models/Festive/ButtonsTop.png differ diff --git a/Models/Festive/ButtonsTopTied.png b/Models/Festive/ButtonsTopTied.png new file mode 100644 index 000000000..35d1a51e6 Binary files /dev/null and b/Models/Festive/ButtonsTopTied.png differ diff --git a/Models/Festive/ButtonsTopUp.png b/Models/Festive/ButtonsTopUp.png new file mode 100644 index 000000000..3c87de59d Binary files /dev/null and b/Models/Festive/ButtonsTopUp.png differ diff --git a/Models/Festive/ButtonsUnderbust.png b/Models/Festive/ButtonsUnderbust.png new file mode 100644 index 000000000..90e8a330f Binary files /dev/null and b/Models/Festive/ButtonsUnderbust.png differ diff --git a/Models/Festive/ButtonsUnderbustOver.png b/Models/Festive/ButtonsUnderbustOver.png new file mode 100644 index 000000000..d44042ba3 Binary files /dev/null and b/Models/Festive/ButtonsUnderbustOver.png differ diff --git a/Models/Festive/Fluff.png b/Models/Festive/Fluff.png new file mode 100644 index 000000000..7ad7fdfd9 Binary files /dev/null and b/Models/Festive/Fluff.png differ diff --git a/Models/Festive/FluffHogtie.png b/Models/Festive/FluffHogtie.png new file mode 100644 index 000000000..3f478463f Binary files /dev/null and b/Models/Festive/FluffHogtie.png differ diff --git a/Models/Festive/FuzzBot.png b/Models/Festive/FuzzBot.png new file mode 100644 index 000000000..42a9e48d0 Binary files /dev/null and b/Models/Festive/FuzzBot.png differ diff --git a/Models/Festive/FuzzBotClosed.png b/Models/Festive/FuzzBotClosed.png new file mode 100644 index 000000000..42887737f Binary files /dev/null and b/Models/Festive/FuzzBotClosed.png differ diff --git a/Models/Festive/FuzzMid.png b/Models/Festive/FuzzMid.png new file mode 100644 index 000000000..1f800024c Binary files /dev/null and b/Models/Festive/FuzzMid.png differ diff --git a/Models/Festive/FuzzTop.png b/Models/Festive/FuzzTop.png new file mode 100644 index 000000000..b732e75f7 Binary files /dev/null and b/Models/Festive/FuzzTop.png differ diff --git a/Models/Festive/FuzzTopTied.png b/Models/Festive/FuzzTopTied.png new file mode 100644 index 000000000..ab26f326a Binary files /dev/null and b/Models/Festive/FuzzTopTied.png differ diff --git a/Models/Festive/FuzzTopUp.png b/Models/Festive/FuzzTopUp.png new file mode 100644 index 000000000..f52731d32 Binary files /dev/null and b/Models/Festive/FuzzTopUp.png differ diff --git a/Models/Festive/FuzzUnderbust.png b/Models/Festive/FuzzUnderbust.png new file mode 100644 index 000000000..64de98c9c Binary files /dev/null and b/Models/Festive/FuzzUnderbust.png differ diff --git a/Models/Festive/FuzzUnderbustOver.png b/Models/Festive/FuzzUnderbustOver.png new file mode 100644 index 000000000..0d36bf339 Binary files /dev/null and b/Models/Festive/FuzzUnderbustOver.png differ diff --git a/Models/Festive/HardwareUnderbust.png b/Models/Festive/HardwareUnderbust.png new file mode 100644 index 000000000..8bb96715c Binary files /dev/null and b/Models/Festive/HardwareUnderbust.png differ diff --git a/Models/Festive/Hat.png b/Models/Festive/Hat.png new file mode 100644 index 000000000..da2cb9d57 Binary files /dev/null and b/Models/Festive/Hat.png differ diff --git a/Models/Festive/HatBackHogtie.png b/Models/Festive/HatBackHogtie.png new file mode 100644 index 000000000..aae6c0d69 Binary files /dev/null and b/Models/Festive/HatBackHogtie.png differ diff --git a/Models/Festive/HatHogtie.png b/Models/Festive/HatHogtie.png new file mode 100644 index 000000000..c3d28f7f1 Binary files /dev/null and b/Models/Festive/HatHogtie.png differ diff --git a/Models/Festive/Orb.png b/Models/Festive/Orb.png new file mode 100644 index 000000000..f963fae1f Binary files /dev/null and b/Models/Festive/Orb.png differ diff --git a/Models/Festive/OrbHogtie.png b/Models/Festive/OrbHogtie.png new file mode 100644 index 000000000..bad07d012 Binary files /dev/null and b/Models/Festive/OrbHogtie.png differ diff --git a/Models/Festive/StrapBot.png b/Models/Festive/StrapBot.png new file mode 100644 index 000000000..7a3949e04 Binary files /dev/null and b/Models/Festive/StrapBot.png differ diff --git a/Models/Festive/StrapBotClosed.png b/Models/Festive/StrapBotClosed.png new file mode 100644 index 000000000..3065ec8b1 Binary files /dev/null and b/Models/Festive/StrapBotClosed.png differ diff --git a/Models/Festive/StrapMid.png b/Models/Festive/StrapMid.png new file mode 100644 index 000000000..85988cf14 Binary files /dev/null and b/Models/Festive/StrapMid.png differ diff --git a/Models/Festive/StrapOverbust.png b/Models/Festive/StrapOverbust.png new file mode 100644 index 000000000..3d1559a59 Binary files /dev/null and b/Models/Festive/StrapOverbust.png differ diff --git a/Models/Festive/StrapTop.png b/Models/Festive/StrapTop.png new file mode 100644 index 000000000..b3f1d17fe Binary files /dev/null and b/Models/Festive/StrapTop.png differ diff --git a/Models/Festive/StrapTopTied.png b/Models/Festive/StrapTopTied.png new file mode 100644 index 000000000..9b5248f83 Binary files /dev/null and b/Models/Festive/StrapTopTied.png differ diff --git a/Models/Festive/StrapTopUp.png b/Models/Festive/StrapTopUp.png new file mode 100644 index 000000000..24d9199a0 Binary files /dev/null and b/Models/Festive/StrapTopUp.png differ diff --git a/Models/Festive/StrapUnderbust.png b/Models/Festive/StrapUnderbust.png new file mode 100644 index 000000000..4e1c5b32f Binary files /dev/null and b/Models/Festive/StrapUnderbust.png differ diff --git a/Models/Fiddle/BackFiddleBody.png b/Models/Fiddle/BackFiddleBody.png new file mode 100644 index 000000000..3e90956c4 Binary files /dev/null and b/Models/Fiddle/BackFiddleBody.png differ diff --git a/Models/Fiddle/BackFiddleLines.png b/Models/Fiddle/BackFiddleLines.png new file mode 100644 index 000000000..4a5cc33ec Binary files /dev/null and b/Models/Fiddle/BackFiddleLines.png differ diff --git a/Models/Fiddle/FiddleBody.png b/Models/Fiddle/FiddleBody.png new file mode 100644 index 000000000..0c4b552c8 Binary files /dev/null and b/Models/Fiddle/FiddleBody.png differ diff --git a/Models/Fiddle/FiddleLines.png b/Models/Fiddle/FiddleLines.png new file mode 100644 index 000000000..db8b10bd1 Binary files /dev/null and b/Models/Fiddle/FiddleLines.png differ diff --git a/Models/Fiddle/FiddleLock.png b/Models/Fiddle/FiddleLock.png new file mode 100644 index 000000000..f05e6a298 Binary files /dev/null and b/Models/Fiddle/FiddleLock.png differ diff --git a/Models/Furniture/Barrel.png b/Models/Furniture/Barrel.png new file mode 100644 index 000000000..ed0ee267a Binary files /dev/null and b/Models/Furniture/Barrel.png differ diff --git a/Models/Furniture/Bed.png b/Models/Furniture/Bed.png new file mode 100644 index 000000000..e7c0daef8 Binary files /dev/null and b/Models/Furniture/Bed.png differ diff --git a/Models/Furniture/BedHogtie.png b/Models/Furniture/BedHogtie.png new file mode 100644 index 000000000..3c36d3859 Binary files /dev/null and b/Models/Furniture/BedHogtie.png differ diff --git a/Models/Furniture/BedStraps.png b/Models/Furniture/BedStraps.png new file mode 100644 index 000000000..41e4a627d Binary files /dev/null and b/Models/Furniture/BedStraps.png differ diff --git a/Models/Furniture/BedStrapsHogtie.png b/Models/Furniture/BedStrapsHogtie.png new file mode 100644 index 000000000..edb5a5d2e Binary files /dev/null and b/Models/Furniture/BedStrapsHogtie.png differ diff --git a/Models/Furniture/BedStrapsHogtieBoxtie.png b/Models/Furniture/BedStrapsHogtieBoxtie.png new file mode 100644 index 000000000..3c4d7ecab Binary files /dev/null and b/Models/Furniture/BedStrapsHogtieBoxtie.png differ diff --git a/Models/Furniture/CageBack.png b/Models/Furniture/CageBack.png new file mode 100644 index 000000000..88a5e2823 Binary files /dev/null and b/Models/Furniture/CageBack.png differ diff --git a/Models/Furniture/CageFront.png b/Models/Furniture/CageFront.png new file mode 100644 index 000000000..675da2a70 Binary files /dev/null and b/Models/Furniture/CageFront.png differ diff --git a/Models/Furniture/DisplayFront.png b/Models/Furniture/DisplayFront.png new file mode 100644 index 000000000..95576d440 Binary files /dev/null and b/Models/Furniture/DisplayFront.png differ diff --git a/Models/Furniture/DisplayFrontHogtie.png b/Models/Furniture/DisplayFrontHogtie.png new file mode 100644 index 000000000..129a3f79c Binary files /dev/null and b/Models/Furniture/DisplayFrontHogtie.png differ diff --git a/Models/Furniture/LatexCube.pdn b/Models/Furniture/LatexCube.pdn new file mode 100644 index 000000000..11b999aad Binary files /dev/null and b/Models/Furniture/LatexCube.pdn differ diff --git a/Models/Furniture/LatexCube.png b/Models/Furniture/LatexCube.png new file mode 100644 index 000000000..66de4d46f Binary files /dev/null and b/Models/Furniture/LatexCube.png differ diff --git a/Models/Furniture/LatexCubeBack.png b/Models/Furniture/LatexCubeBack.png new file mode 100644 index 000000000..c3260609a Binary files /dev/null and b/Models/Furniture/LatexCubeBack.png differ diff --git a/Models/Furniture/OneBarBackClosed.png b/Models/Furniture/OneBarBackClosed.png new file mode 100644 index 000000000..e4eb75117 Binary files /dev/null and b/Models/Furniture/OneBarBackClosed.png differ diff --git a/Models/Furniture/OneBarBackClosedHeels.png b/Models/Furniture/OneBarBackClosedHeels.png new file mode 100644 index 000000000..069f85fa3 Binary files /dev/null and b/Models/Furniture/OneBarBackClosedHeels.png differ diff --git a/Models/Furniture/OneBarBackSpread.png b/Models/Furniture/OneBarBackSpread.png new file mode 100644 index 000000000..98000dedd Binary files /dev/null and b/Models/Furniture/OneBarBackSpread.png differ diff --git a/Models/Furniture/OneBarBackSpreadHeels.png b/Models/Furniture/OneBarBackSpreadHeels.png new file mode 100644 index 000000000..8c017b4a3 Binary files /dev/null and b/Models/Furniture/OneBarBackSpreadHeels.png differ diff --git a/Models/Furniture/OneBarFrontClosed.png b/Models/Furniture/OneBarFrontClosed.png new file mode 100644 index 000000000..606ce4ecf Binary files /dev/null and b/Models/Furniture/OneBarFrontClosed.png differ diff --git a/Models/Furniture/OneBarFrontClosedHeels.png b/Models/Furniture/OneBarFrontClosedHeels.png new file mode 100644 index 000000000..2d7030276 Binary files /dev/null and b/Models/Furniture/OneBarFrontClosedHeels.png differ diff --git a/Models/Furniture/OneBarFrontSpread.png b/Models/Furniture/OneBarFrontSpread.png new file mode 100644 index 000000000..1efaaeb93 Binary files /dev/null and b/Models/Furniture/OneBarFrontSpread.png differ diff --git a/Models/Furniture/OneBarFrontSpreadHeels.png b/Models/Furniture/OneBarFrontSpreadHeels.png new file mode 100644 index 000000000..6627e2daf Binary files /dev/null and b/Models/Furniture/OneBarFrontSpreadHeels.png differ diff --git a/Models/Furniture/OneBarTopClosed.png b/Models/Furniture/OneBarTopClosed.png new file mode 100644 index 000000000..0c22dff74 Binary files /dev/null and b/Models/Furniture/OneBarTopClosed.png differ diff --git a/Models/Furniture/OneBarTopClosedHeels.png b/Models/Furniture/OneBarTopClosedHeels.png new file mode 100644 index 000000000..0c22dff74 Binary files /dev/null and b/Models/Furniture/OneBarTopClosedHeels.png differ diff --git a/Models/Furniture/OneBarTopSpread.png b/Models/Furniture/OneBarTopSpread.png new file mode 100644 index 000000000..119d2d3b4 Binary files /dev/null and b/Models/Furniture/OneBarTopSpread.png differ diff --git a/Models/Furniture/OneBarTopSpreadHeels.png b/Models/Furniture/OneBarTopSpreadHeels.png new file mode 100644 index 000000000..119d2d3b4 Binary files /dev/null and b/Models/Furniture/OneBarTopSpreadHeels.png differ diff --git a/Models/Furniture/SarcoBack.png b/Models/Furniture/SarcoBack.png new file mode 100644 index 000000000..49690fdb6 Binary files /dev/null and b/Models/Furniture/SarcoBack.png differ diff --git a/Models/Furniture/SarcoFront.png b/Models/Furniture/SarcoFront.png new file mode 100644 index 000000000..5d2d4846b Binary files /dev/null and b/Models/Furniture/SarcoFront.png differ diff --git a/Models/Furniture/SarcoWebs.png b/Models/Furniture/SarcoWebs.png new file mode 100644 index 000000000..84bb8ebe9 Binary files /dev/null and b/Models/Furniture/SarcoWebs.png differ diff --git a/Models/FutureBox/Back.png b/Models/FutureBox/Back.png new file mode 100644 index 000000000..22cb1b2ac Binary files /dev/null and b/Models/FutureBox/Back.png differ diff --git a/Models/FutureBox/BackFade.png b/Models/FutureBox/BackFade.png new file mode 100644 index 000000000..fcf9d582b Binary files /dev/null and b/Models/FutureBox/BackFade.png differ diff --git a/Models/FutureBox/Display.png b/Models/FutureBox/Display.png new file mode 100644 index 000000000..423af1fcc Binary files /dev/null and b/Models/FutureBox/Display.png differ diff --git a/Models/FutureBox/Door.png b/Models/FutureBox/Door.png new file mode 100644 index 000000000..672264e4c Binary files /dev/null and b/Models/FutureBox/Door.png differ diff --git a/Models/FutureBox/DoorNumeral.png b/Models/FutureBox/DoorNumeral.png new file mode 100644 index 000000000..79387f561 Binary files /dev/null and b/Models/FutureBox/DoorNumeral.png differ diff --git a/Models/FutureBox/DoorWindow.png b/Models/FutureBox/DoorWindow.png new file mode 100644 index 000000000..2ac9058e9 Binary files /dev/null and b/Models/FutureBox/DoorWindow.png differ diff --git a/Models/FutureBox/Lock.png b/Models/FutureBox/Lock.png new file mode 100644 index 000000000..6f18daf69 Binary files /dev/null and b/Models/FutureBox/Lock.png differ diff --git a/Models/FutureBox/Rim.png b/Models/FutureBox/Rim.png new file mode 100644 index 000000000..fe2c99f9d Binary files /dev/null and b/Models/FutureBox/Rim.png differ diff --git a/Models/FutureHarness/DisplayChest.png b/Models/FutureHarness/DisplayChest.png new file mode 100644 index 000000000..b1d0b2ea2 Binary files /dev/null and b/Models/FutureHarness/DisplayChest.png differ diff --git a/Models/FutureHarness/DisplayLower.png b/Models/FutureHarness/DisplayLower.png new file mode 100644 index 000000000..028e3ae45 Binary files /dev/null and b/Models/FutureHarness/DisplayLower.png differ diff --git a/Models/FutureHarness/DisplayMid.png b/Models/FutureHarness/DisplayMid.png new file mode 100644 index 000000000..3b026e26a Binary files /dev/null and b/Models/FutureHarness/DisplayMid.png differ diff --git a/Models/FutureHarness/LockChest.png b/Models/FutureHarness/LockChest.png new file mode 100644 index 000000000..9ca79fa59 Binary files /dev/null and b/Models/FutureHarness/LockChest.png differ diff --git a/Models/FutureHarness/LockLower.png b/Models/FutureHarness/LockLower.png new file mode 100644 index 000000000..3e070e24e Binary files /dev/null and b/Models/FutureHarness/LockLower.png differ diff --git a/Models/FutureHarness/LockMid.png b/Models/FutureHarness/LockMid.png new file mode 100644 index 000000000..604142bf5 Binary files /dev/null and b/Models/FutureHarness/LockMid.png differ diff --git a/Models/FutureHarness/MetalChest.png b/Models/FutureHarness/MetalChest.png new file mode 100644 index 000000000..de5fc8eec Binary files /dev/null and b/Models/FutureHarness/MetalChest.png differ diff --git a/Models/FutureHarness/MetalLower.png b/Models/FutureHarness/MetalLower.png new file mode 100644 index 000000000..c54fafc14 Binary files /dev/null and b/Models/FutureHarness/MetalLower.png differ diff --git a/Models/FutureHarness/MetalMid.png b/Models/FutureHarness/MetalMid.png new file mode 100644 index 000000000..e132989ec Binary files /dev/null and b/Models/FutureHarness/MetalMid.png differ diff --git a/Models/FutureHarness/StrapsChest.png b/Models/FutureHarness/StrapsChest.png new file mode 100644 index 000000000..83cf82b32 Binary files /dev/null and b/Models/FutureHarness/StrapsChest.png differ diff --git a/Models/FutureHarness/StrapsLower.png b/Models/FutureHarness/StrapsLower.png new file mode 100644 index 000000000..1ec20c0f1 Binary files /dev/null and b/Models/FutureHarness/StrapsLower.png differ diff --git a/Models/FutureHarness/StrapsLowerSpread.png b/Models/FutureHarness/StrapsLowerSpread.png new file mode 100644 index 000000000..9fb255d72 Binary files /dev/null and b/Models/FutureHarness/StrapsLowerSpread.png differ diff --git a/Models/FutureHarness/StrapsMid.png b/Models/FutureHarness/StrapsMid.png new file mode 100644 index 000000000..138cc7285 Binary files /dev/null and b/Models/FutureHarness/StrapsMid.png differ diff --git a/Models/GagCloth/Cleave.png b/Models/GagCloth/Cleave.png new file mode 100644 index 000000000..9c36576dc Binary files /dev/null and b/Models/GagCloth/Cleave.png differ diff --git a/Models/GagCloth/CleaveThick.png b/Models/GagCloth/CleaveThick.png new file mode 100644 index 000000000..07afe07aa Binary files /dev/null and b/Models/GagCloth/CleaveThick.png differ diff --git a/Models/GagCloth/Knot.png b/Models/GagCloth/Knot.png new file mode 100644 index 000000000..97df0c55d Binary files /dev/null and b/Models/GagCloth/Knot.png differ diff --git a/Models/GagCloth/OTM.png b/Models/GagCloth/OTM.png new file mode 100644 index 000000000..933a883c7 Binary files /dev/null and b/Models/GagCloth/OTM.png differ diff --git a/Models/GagCloth/OTN.png b/Models/GagCloth/OTN.png new file mode 100644 index 000000000..c0ac19d4f Binary files /dev/null and b/Models/GagCloth/OTN.png differ diff --git a/Models/GagFrilly/Duster.png b/Models/GagFrilly/Duster.png new file mode 100644 index 000000000..706fb69b3 Binary files /dev/null and b/Models/GagFrilly/Duster.png differ diff --git a/Models/GagFrilly/FrillyHardware.png b/Models/GagFrilly/FrillyHardware.png new file mode 100644 index 000000000..bfc05ced8 Binary files /dev/null and b/Models/GagFrilly/FrillyHardware.png differ diff --git a/Models/GagFrilly/FrillyHighlights.png b/Models/GagFrilly/FrillyHighlights.png new file mode 100644 index 000000000..75ac6ed1d Binary files /dev/null and b/Models/GagFrilly/FrillyHighlights.png differ diff --git a/Models/GagFrilly/FrillyPanel.png b/Models/GagFrilly/FrillyPanel.png new file mode 100644 index 000000000..390129ab1 Binary files /dev/null and b/Models/GagFrilly/FrillyPanel.png differ diff --git a/Models/GagFrilly/FrillyStraps.png b/Models/GagFrilly/FrillyStraps.png new file mode 100644 index 000000000..68d6b482d Binary files /dev/null and b/Models/GagFrilly/FrillyStraps.png differ diff --git a/Models/GagFrilly/FrillyStrapsOld.png b/Models/GagFrilly/FrillyStrapsOld.png new file mode 100644 index 000000000..bc563dffb Binary files /dev/null and b/Models/GagFrilly/FrillyStrapsOld.png differ diff --git a/Models/GagLatex/Harness.png b/Models/GagLatex/Harness.png new file mode 100644 index 000000000..902911f55 Binary files /dev/null and b/Models/GagLatex/Harness.png differ diff --git a/Models/GagLatex/LatexPlug.png b/Models/GagLatex/LatexPlug.png new file mode 100644 index 000000000..c610e443d Binary files /dev/null and b/Models/GagLatex/LatexPlug.png differ diff --git a/Models/GagLatex/MuteLogo.png b/Models/GagLatex/MuteLogo.png new file mode 100644 index 000000000..c2f8b1072 Binary files /dev/null and b/Models/GagLatex/MuteLogo.png differ diff --git a/Models/GagLatex/NeckCorset.png b/Models/GagLatex/NeckCorset.png new file mode 100644 index 000000000..f63ad7055 Binary files /dev/null and b/Models/GagLatex/NeckCorset.png differ diff --git a/Models/GagLatex/NeckCorset2.png b/Models/GagLatex/NeckCorset2.png new file mode 100644 index 000000000..b111282a0 Binary files /dev/null and b/Models/GagLatex/NeckCorset2.png differ diff --git a/Models/GagLatex/NeckCorsetGag2.png b/Models/GagLatex/NeckCorsetGag2.png new file mode 100644 index 000000000..5b4a9d4e5 Binary files /dev/null and b/Models/GagLatex/NeckCorsetGag2.png differ diff --git a/Models/GagLatex/NeckCorsetGagRim2.png b/Models/GagLatex/NeckCorsetGagRim2.png new file mode 100644 index 000000000..13125fe63 Binary files /dev/null and b/Models/GagLatex/NeckCorsetGagRim2.png differ diff --git a/Models/GagLatex/NeckCorsetRim.png b/Models/GagLatex/NeckCorsetRim.png new file mode 100644 index 000000000..6a744a789 Binary files /dev/null and b/Models/GagLatex/NeckCorsetRim.png differ diff --git a/Models/GagLatex/NeckCorsetRim2.png b/Models/GagLatex/NeckCorsetRim2.png new file mode 100644 index 000000000..c2fc56565 Binary files /dev/null and b/Models/GagLatex/NeckCorsetRim2.png differ diff --git a/Models/GagLatex/OTN.png b/Models/GagLatex/OTN.png new file mode 100644 index 000000000..c6ba2b383 Binary files /dev/null and b/Models/GagLatex/OTN.png differ diff --git a/Models/GagLatex/OTNFlat.png b/Models/GagLatex/OTNFlat.png new file mode 100644 index 000000000..1f6ec6272 Binary files /dev/null and b/Models/GagLatex/OTNFlat.png differ diff --git a/Models/GagLatex/SideStrap.png b/Models/GagLatex/SideStrap.png new file mode 100644 index 000000000..020949f6a Binary files /dev/null and b/Models/GagLatex/SideStrap.png differ diff --git a/Models/GagLeather/Ball.png b/Models/GagLeather/Ball.png new file mode 100644 index 000000000..8b5725a7e Binary files /dev/null and b/Models/GagLeather/Ball.png differ diff --git a/Models/GagLeather/Ball2Fang.png b/Models/GagLeather/Ball2Fang.png new file mode 100644 index 000000000..8b5725a7e Binary files /dev/null and b/Models/GagLeather/Ball2Fang.png differ diff --git a/Models/GagLeather/BallFang.png b/Models/GagLeather/BallFang.png new file mode 100644 index 000000000..8b5725a7e Binary files /dev/null and b/Models/GagLeather/BallFang.png differ diff --git a/Models/GagLeather/BallHarness.png b/Models/GagLeather/BallHarness.png new file mode 100644 index 000000000..670288c2a Binary files /dev/null and b/Models/GagLeather/BallHarness.png differ diff --git a/Models/GagLeather/BallHarnessLarge.png b/Models/GagLeather/BallHarnessLarge.png new file mode 100644 index 000000000..f5cc418af Binary files /dev/null and b/Models/GagLeather/BallHarnessLarge.png differ diff --git a/Models/GagLeather/BallSideStrap.png b/Models/GagLeather/BallSideStrap.png new file mode 100644 index 000000000..5b7cea928 Binary files /dev/null and b/Models/GagLeather/BallSideStrap.png differ diff --git a/Models/GagLeather/BallStrap.png b/Models/GagLeather/BallStrap.png new file mode 100644 index 000000000..e261b0108 Binary files /dev/null and b/Models/GagLeather/BallStrap.png differ diff --git a/Models/GagLeather/BallTeeth_Teeth.png b/Models/GagLeather/BallTeeth_Teeth.png new file mode 100644 index 000000000..6d904d25b Binary files /dev/null and b/Models/GagLeather/BallTeeth_Teeth.png differ diff --git a/Models/GagLeather/BallTeeth_Teeth2Fang.png b/Models/GagLeather/BallTeeth_Teeth2Fang.png new file mode 100644 index 000000000..a66e0bc1d Binary files /dev/null and b/Models/GagLeather/BallTeeth_Teeth2Fang.png differ diff --git a/Models/GagLeather/BallTeeth_TeethDeep.png b/Models/GagLeather/BallTeeth_TeethDeep.png new file mode 100644 index 000000000..dde86bd69 Binary files /dev/null and b/Models/GagLeather/BallTeeth_TeethDeep.png differ diff --git a/Models/GagLeather/BallTeeth_TeethDeep2Fang.png b/Models/GagLeather/BallTeeth_TeethDeep2Fang.png new file mode 100644 index 000000000..aa3bd761f Binary files /dev/null and b/Models/GagLeather/BallTeeth_TeethDeep2Fang.png differ diff --git a/Models/GagLeather/BallTeeth_TeethDeepFang.png b/Models/GagLeather/BallTeeth_TeethDeepFang.png new file mode 100644 index 000000000..7e8efff0f Binary files /dev/null and b/Models/GagLeather/BallTeeth_TeethDeepFang.png differ diff --git a/Models/GagLeather/BallTeeth_TeethFang.png b/Models/GagLeather/BallTeeth_TeethFang.png new file mode 100644 index 000000000..d191ab3f3 Binary files /dev/null and b/Models/GagLeather/BallTeeth_TeethFang.png differ diff --git a/Models/GagLeather/Ball_Teeth.png b/Models/GagLeather/Ball_Teeth.png new file mode 100644 index 000000000..7d7bd4598 Binary files /dev/null and b/Models/GagLeather/Ball_Teeth.png differ diff --git a/Models/GagLeather/Ball_Teeth2Fang.png b/Models/GagLeather/Ball_Teeth2Fang.png new file mode 100644 index 000000000..670a30fcc Binary files /dev/null and b/Models/GagLeather/Ball_Teeth2Fang.png differ diff --git a/Models/GagLeather/Ball_TeethDeep.png b/Models/GagLeather/Ball_TeethDeep.png new file mode 100644 index 000000000..6be8d1702 Binary files /dev/null and b/Models/GagLeather/Ball_TeethDeep.png differ diff --git a/Models/GagLeather/Ball_TeethDeep2Fang.png b/Models/GagLeather/Ball_TeethDeep2Fang.png new file mode 100644 index 000000000..2869d9e27 Binary files /dev/null and b/Models/GagLeather/Ball_TeethDeep2Fang.png differ diff --git a/Models/GagLeather/Ball_TeethDeepFang.png b/Models/GagLeather/Ball_TeethDeepFang.png new file mode 100644 index 000000000..ccf0dd8ea Binary files /dev/null and b/Models/GagLeather/Ball_TeethDeepFang.png differ diff --git a/Models/GagLeather/Ball_TeethFang.png b/Models/GagLeather/Ball_TeethFang.png new file mode 100644 index 000000000..20b41821a Binary files /dev/null and b/Models/GagLeather/Ball_TeethFang.png differ diff --git a/Models/GagLeather/BigBall.png b/Models/GagLeather/BigBall.png new file mode 100644 index 000000000..faf38b5f1 Binary files /dev/null and b/Models/GagLeather/BigBall.png differ diff --git a/Models/GagLeather/BigBall2Fang.png b/Models/GagLeather/BigBall2Fang.png new file mode 100644 index 000000000..72f64e49b Binary files /dev/null and b/Models/GagLeather/BigBall2Fang.png differ diff --git a/Models/GagLeather/BigBallFang.png b/Models/GagLeather/BigBallFang.png new file mode 100644 index 000000000..44cf21497 Binary files /dev/null and b/Models/GagLeather/BigBallFang.png differ diff --git a/Models/GagLeather/BigBallStrap.png b/Models/GagLeather/BigBallStrap.png new file mode 100644 index 000000000..82d774f52 Binary files /dev/null and b/Models/GagLeather/BigBallStrap.png differ diff --git a/Models/GagLeather/BigBallTeethFang.png b/Models/GagLeather/BigBallTeethFang.png new file mode 100644 index 000000000..48f3ce2a4 Binary files /dev/null and b/Models/GagLeather/BigBallTeethFang.png differ diff --git a/Models/GagLeather/BigBallTeethFang2.png b/Models/GagLeather/BigBallTeethFang2.png new file mode 100644 index 000000000..1c0208ebf Binary files /dev/null and b/Models/GagLeather/BigBallTeethFang2.png differ diff --git a/Models/GagLeather/CrystalBall.png b/Models/GagLeather/CrystalBall.png new file mode 100644 index 000000000..a800fbacc Binary files /dev/null and b/Models/GagLeather/CrystalBall.png differ diff --git a/Models/GagLeather/CrystalGagNecklaceBall.png b/Models/GagLeather/CrystalGagNecklaceBall.png new file mode 100644 index 000000000..434b9974f Binary files /dev/null and b/Models/GagLeather/CrystalGagNecklaceBall.png differ diff --git a/Models/GagLeather/FabricMuzzle.png b/Models/GagLeather/FabricMuzzle.png new file mode 100644 index 000000000..d61315756 Binary files /dev/null and b/Models/GagLeather/FabricMuzzle.png differ diff --git a/Models/GagLeather/GagNecklace.png b/Models/GagLeather/GagNecklace.png new file mode 100644 index 000000000..1e16c9758 Binary files /dev/null and b/Models/GagLeather/GagNecklace.png differ diff --git a/Models/GagLeather/GagNecklaceBall.png b/Models/GagLeather/GagNecklaceBall.png new file mode 100644 index 000000000..5003ae372 Binary files /dev/null and b/Models/GagLeather/GagNecklaceBall.png differ diff --git a/Models/GagLeather/GhostBall.png b/Models/GagLeather/GhostBall.png new file mode 100644 index 000000000..b2cdee39a Binary files /dev/null and b/Models/GagLeather/GhostBall.png differ diff --git a/Models/GagLeather/GhostBall2Fang.png b/Models/GagLeather/GhostBall2Fang.png new file mode 100644 index 000000000..8ce3fdc4c Binary files /dev/null and b/Models/GagLeather/GhostBall2Fang.png differ diff --git a/Models/GagLeather/GhostBallFang.png b/Models/GagLeather/GhostBallFang.png new file mode 100644 index 000000000..73bdd5335 Binary files /dev/null and b/Models/GagLeather/GhostBallFang.png differ diff --git a/Models/GagLeather/GhostBallStrap.png b/Models/GagLeather/GhostBallStrap.png new file mode 100644 index 000000000..5adff12e4 Binary files /dev/null and b/Models/GagLeather/GhostBallStrap.png differ diff --git a/Models/GagLeather/KittyMouth.png b/Models/GagLeather/KittyMouth.png new file mode 100644 index 000000000..baf12572a Binary files /dev/null and b/Models/GagLeather/KittyMouth.png differ diff --git a/Models/GagLeather/LargeBallHarness.png b/Models/GagLeather/LargeBallHarness.png new file mode 100644 index 000000000..6f514524a Binary files /dev/null and b/Models/GagLeather/LargeBallHarness.png differ diff --git a/Models/GagLeather/Muzzle.png b/Models/GagLeather/Muzzle.png new file mode 100644 index 000000000..913d3f23c Binary files /dev/null and b/Models/GagLeather/Muzzle.png differ diff --git a/Models/GagLeather/MuzzleHarness.png b/Models/GagLeather/MuzzleHarness.png new file mode 100644 index 000000000..2405f6ff0 Binary files /dev/null and b/Models/GagLeather/MuzzleHarness.png differ diff --git a/Models/GagLeather/MuzzleSideStrap.png b/Models/GagLeather/MuzzleSideStrap.png new file mode 100644 index 000000000..8bec388f0 Binary files /dev/null and b/Models/GagLeather/MuzzleSideStrap.png differ diff --git a/Models/GagLeather/MuzzleStrap.png b/Models/GagLeather/MuzzleStrap.png new file mode 100644 index 000000000..e51383a29 Binary files /dev/null and b/Models/GagLeather/MuzzleStrap.png differ diff --git a/Models/GagLeather/Panel.png b/Models/GagLeather/Panel.png new file mode 100644 index 000000000..7428e730e Binary files /dev/null and b/Models/GagLeather/Panel.png differ diff --git a/Models/GagLeather/PanelHarness.png b/Models/GagLeather/PanelHarness.png new file mode 100644 index 000000000..a4bcc742f Binary files /dev/null and b/Models/GagLeather/PanelHarness.png differ diff --git a/Models/GagLeather/PanelSideStrap.png b/Models/GagLeather/PanelSideStrap.png new file mode 100644 index 000000000..5b7cea928 Binary files /dev/null and b/Models/GagLeather/PanelSideStrap.png differ diff --git a/Models/GagLeather/PanelStrap.png b/Models/GagLeather/PanelStrap.png new file mode 100644 index 000000000..8630f4490 Binary files /dev/null and b/Models/GagLeather/PanelStrap.png differ diff --git a/Models/GagLeather/Plug.png b/Models/GagLeather/Plug.png new file mode 100644 index 000000000..80e7fd0de Binary files /dev/null and b/Models/GagLeather/Plug.png differ diff --git a/Models/GagLeather/Whiskers.png b/Models/GagLeather/Whiskers.png new file mode 100644 index 000000000..de108713c Binary files /dev/null and b/Models/GagLeather/Whiskers.png differ diff --git a/Models/GagMetal/Ball.png b/Models/GagMetal/Ball.png new file mode 100644 index 000000000..c7b2f38f5 Binary files /dev/null and b/Models/GagMetal/Ball.png differ diff --git a/Models/GagMetal/Ball2Fang.png b/Models/GagMetal/Ball2Fang.png new file mode 100644 index 000000000..c7b2f38f5 Binary files /dev/null and b/Models/GagMetal/Ball2Fang.png differ diff --git a/Models/GagMetal/BallFang.png b/Models/GagMetal/BallFang.png new file mode 100644 index 000000000..c7b2f38f5 Binary files /dev/null and b/Models/GagMetal/BallFang.png differ diff --git a/Models/GagMetal/BallHarness.png b/Models/GagMetal/BallHarness.png new file mode 100644 index 000000000..a63e6b335 Binary files /dev/null and b/Models/GagMetal/BallHarness.png differ diff --git a/Models/GagMetal/BallHarnessLarge.png b/Models/GagMetal/BallHarnessLarge.png new file mode 100644 index 000000000..eef5d96be Binary files /dev/null and b/Models/GagMetal/BallHarnessLarge.png differ diff --git a/Models/GagMetal/BallHarnessSegmented.png b/Models/GagMetal/BallHarnessSegmented.png new file mode 100644 index 000000000..f5eeadb04 Binary files /dev/null and b/Models/GagMetal/BallHarnessSegmented.png differ diff --git a/Models/GagMetal/BallHarnessSegmentedLarge.png b/Models/GagMetal/BallHarnessSegmentedLarge.png new file mode 100644 index 000000000..36cb2676c Binary files /dev/null and b/Models/GagMetal/BallHarnessSegmentedLarge.png differ diff --git a/Models/GagMetal/BallSideStrap.png b/Models/GagMetal/BallSideStrap.png new file mode 100644 index 000000000..53df90da7 Binary files /dev/null and b/Models/GagMetal/BallSideStrap.png differ diff --git a/Models/GagMetal/BallStrap.png b/Models/GagMetal/BallStrap.png new file mode 100644 index 000000000..2d0828778 Binary files /dev/null and b/Models/GagMetal/BallStrap.png differ diff --git a/Models/GagMetal/BallTeeth_Teeth.png b/Models/GagMetal/BallTeeth_Teeth.png new file mode 100644 index 000000000..bd1c65833 Binary files /dev/null and b/Models/GagMetal/BallTeeth_Teeth.png differ diff --git a/Models/GagMetal/BallTeeth_Teeth2Fang.png b/Models/GagMetal/BallTeeth_Teeth2Fang.png new file mode 100644 index 000000000..a66e0bc1d Binary files /dev/null and b/Models/GagMetal/BallTeeth_Teeth2Fang.png differ diff --git a/Models/GagMetal/BallTeeth_TeethDeep.png b/Models/GagMetal/BallTeeth_TeethDeep.png new file mode 100644 index 000000000..77714c313 Binary files /dev/null and b/Models/GagMetal/BallTeeth_TeethDeep.png differ diff --git a/Models/GagMetal/BallTeeth_TeethDeep2Fang.png b/Models/GagMetal/BallTeeth_TeethDeep2Fang.png new file mode 100644 index 000000000..aa3bd761f Binary files /dev/null and b/Models/GagMetal/BallTeeth_TeethDeep2Fang.png differ diff --git a/Models/GagMetal/BallTeeth_TeethDeepFang.png b/Models/GagMetal/BallTeeth_TeethDeepFang.png new file mode 100644 index 000000000..6ef9a5671 Binary files /dev/null and b/Models/GagMetal/BallTeeth_TeethDeepFang.png differ diff --git a/Models/GagMetal/BallTeeth_TeethFang.png b/Models/GagMetal/BallTeeth_TeethFang.png new file mode 100644 index 000000000..ec97985e6 Binary files /dev/null and b/Models/GagMetal/BallTeeth_TeethFang.png differ diff --git a/Models/GagMetal/Ball_Teeth.png b/Models/GagMetal/Ball_Teeth.png new file mode 100644 index 000000000..a93ff20aa Binary files /dev/null and b/Models/GagMetal/Ball_Teeth.png differ diff --git a/Models/GagMetal/Ball_Teeth2Fang.png b/Models/GagMetal/Ball_Teeth2Fang.png new file mode 100644 index 000000000..31cf70a8d Binary files /dev/null and b/Models/GagMetal/Ball_Teeth2Fang.png differ diff --git a/Models/GagMetal/Ball_TeethDeep.png b/Models/GagMetal/Ball_TeethDeep.png new file mode 100644 index 000000000..8ed6397f5 Binary files /dev/null and b/Models/GagMetal/Ball_TeethDeep.png differ diff --git a/Models/GagMetal/Ball_TeethDeep2Fang.png b/Models/GagMetal/Ball_TeethDeep2Fang.png new file mode 100644 index 000000000..172a7634e Binary files /dev/null and b/Models/GagMetal/Ball_TeethDeep2Fang.png differ diff --git a/Models/GagMetal/Ball_TeethDeepFang.png b/Models/GagMetal/Ball_TeethDeepFang.png new file mode 100644 index 000000000..6bba52378 Binary files /dev/null and b/Models/GagMetal/Ball_TeethDeepFang.png differ diff --git a/Models/GagMetal/Ball_TeethFang.png b/Models/GagMetal/Ball_TeethFang.png new file mode 100644 index 000000000..429168541 Binary files /dev/null and b/Models/GagMetal/Ball_TeethFang.png differ diff --git a/Models/GagMetal/BigBall.png b/Models/GagMetal/BigBall.png new file mode 100644 index 000000000..d846b10d1 Binary files /dev/null and b/Models/GagMetal/BigBall.png differ diff --git a/Models/GagMetal/BigBall2Fang.png b/Models/GagMetal/BigBall2Fang.png new file mode 100644 index 000000000..aa565bf0d Binary files /dev/null and b/Models/GagMetal/BigBall2Fang.png differ diff --git a/Models/GagMetal/BigBallFang.png b/Models/GagMetal/BigBallFang.png new file mode 100644 index 000000000..f067ed5b9 Binary files /dev/null and b/Models/GagMetal/BigBallFang.png differ diff --git a/Models/GagMetal/BigBallStrap.png b/Models/GagMetal/BigBallStrap.png new file mode 100644 index 000000000..dba247b43 Binary files /dev/null and b/Models/GagMetal/BigBallStrap.png differ diff --git a/Models/GagMetal/BigBallStrapSegmented.png b/Models/GagMetal/BigBallStrapSegmented.png new file mode 100644 index 000000000..0b2bd984b Binary files /dev/null and b/Models/GagMetal/BigBallStrapSegmented.png differ diff --git a/Models/GagMetal/BigBallTeethFang.png b/Models/GagMetal/BigBallTeethFang.png new file mode 100644 index 000000000..50ed2cdaf Binary files /dev/null and b/Models/GagMetal/BigBallTeethFang.png differ diff --git a/Models/GagMetal/BigBallTeethFang2.png b/Models/GagMetal/BigBallTeethFang2.png new file mode 100644 index 000000000..1c0208ebf Binary files /dev/null and b/Models/GagMetal/BigBallTeethFang2.png differ diff --git a/Models/GagMetal/Display.png b/Models/GagMetal/Display.png new file mode 100644 index 000000000..4e16837dc Binary files /dev/null and b/Models/GagMetal/Display.png differ diff --git a/Models/GagMetal/HarnessDisplay.png b/Models/GagMetal/HarnessDisplay.png new file mode 100644 index 000000000..2ade85efe Binary files /dev/null and b/Models/GagMetal/HarnessDisplay.png differ diff --git a/Models/GagMetal/HarnessMask.png b/Models/GagMetal/HarnessMask.png new file mode 100644 index 000000000..fb2879620 Binary files /dev/null and b/Models/GagMetal/HarnessMask.png differ diff --git a/Models/GagMetal/HarnessMaskDisplay.png b/Models/GagMetal/HarnessMaskDisplay.png new file mode 100644 index 000000000..43a49da75 Binary files /dev/null and b/Models/GagMetal/HarnessMaskDisplay.png differ diff --git a/Models/GagMetal/HarnessRim.png b/Models/GagMetal/HarnessRim.png new file mode 100644 index 000000000..b29229e1a Binary files /dev/null and b/Models/GagMetal/HarnessRim.png differ diff --git a/Models/GagMetal/OTN.png b/Models/GagMetal/OTN.png new file mode 100644 index 000000000..a928abbf3 Binary files /dev/null and b/Models/GagMetal/OTN.png differ diff --git a/Models/GagMetal/OTNRivets.png b/Models/GagMetal/OTNRivets.png new file mode 100644 index 000000000..5bdaa9ac5 Binary files /dev/null and b/Models/GagMetal/OTNRivets.png differ diff --git a/Models/GagMetal/OTNStrap.png b/Models/GagMetal/OTNStrap.png new file mode 100644 index 000000000..310541854 Binary files /dev/null and b/Models/GagMetal/OTNStrap.png differ diff --git a/Models/GagMetal/OTNStrapRivets.png b/Models/GagMetal/OTNStrapRivets.png new file mode 100644 index 000000000..03f164bc3 Binary files /dev/null and b/Models/GagMetal/OTNStrapRivets.png differ diff --git a/Models/GagMetal/Rim.png b/Models/GagMetal/Rim.png new file mode 100644 index 000000000..75bcb1516 Binary files /dev/null and b/Models/GagMetal/Rim.png differ diff --git a/Models/GagMetal/SciFiMuzzle.png b/Models/GagMetal/SciFiMuzzle.png new file mode 100644 index 000000000..a928abbf3 Binary files /dev/null and b/Models/GagMetal/SciFiMuzzle.png differ diff --git a/Models/GagMetal/SciFiMuzzle2.png b/Models/GagMetal/SciFiMuzzle2.png new file mode 100644 index 000000000..f9d3be4e3 Binary files /dev/null and b/Models/GagMetal/SciFiMuzzle2.png differ diff --git a/Models/GagMetal/SciFiPanel.png b/Models/GagMetal/SciFiPanel.png new file mode 100644 index 000000000..33623d598 Binary files /dev/null and b/Models/GagMetal/SciFiPanel.png differ diff --git a/Models/GagMetal/SciFiPlug.png b/Models/GagMetal/SciFiPlug.png new file mode 100644 index 000000000..337756014 Binary files /dev/null and b/Models/GagMetal/SciFiPlug.png differ diff --git a/Models/GagTape/Cleave.png b/Models/GagTape/Cleave.png new file mode 100644 index 000000000..2ae951dd1 Binary files /dev/null and b/Models/GagTape/Cleave.png differ diff --git a/Models/GagTape/Face.png b/Models/GagTape/Face.png new file mode 100644 index 000000000..fe787cfd0 Binary files /dev/null and b/Models/GagTape/Face.png differ diff --git a/Models/GagTape/Full.png b/Models/GagTape/Full.png new file mode 100644 index 000000000..61fe6ac42 Binary files /dev/null and b/Models/GagTape/Full.png differ diff --git a/Models/GagTape/Stuffing.png b/Models/GagTape/Stuffing.png new file mode 100644 index 000000000..e03e6ecb9 Binary files /dev/null and b/Models/GagTape/Stuffing.png differ diff --git a/Models/GagTape/Wrap.png b/Models/GagTape/Wrap.png new file mode 100644 index 000000000..10c248176 Binary files /dev/null and b/Models/GagTape/Wrap.png differ diff --git a/Models/Gasmask/Center.png b/Models/Gasmask/Center.png new file mode 100644 index 000000000..413d56ee3 Binary files /dev/null and b/Models/Gasmask/Center.png differ diff --git a/Models/Gasmask/Mask.png b/Models/Gasmask/Mask.png new file mode 100644 index 000000000..5191edef6 Binary files /dev/null and b/Models/Gasmask/Mask.png differ diff --git a/Models/Gasmask/Nose.png b/Models/Gasmask/Nose.png new file mode 100644 index 000000000..bdc35a2c6 Binary files /dev/null and b/Models/Gasmask/Nose.png differ diff --git a/Models/Gasmask/Plugs.png b/Models/Gasmask/Plugs.png new file mode 100644 index 000000000..50135e037 Binary files /dev/null and b/Models/Gasmask/Plugs.png differ diff --git a/Models/Gasmask/Respirator.pdn b/Models/Gasmask/Respirator.pdn new file mode 100644 index 000000000..06bb0cdc8 Binary files /dev/null and b/Models/Gasmask/Respirator.pdn differ diff --git a/Models/Gasmask/Valves.png b/Models/Gasmask/Valves.png new file mode 100644 index 000000000..f698dc767 Binary files /dev/null and b/Models/Gasmask/Valves.png differ diff --git a/Models/Gothic/Buttons.png b/Models/Gothic/Buttons.png new file mode 100644 index 000000000..8ee3c5183 Binary files /dev/null and b/Models/Gothic/Buttons.png differ diff --git a/Models/Gothic/HemLower.png b/Models/Gothic/HemLower.png new file mode 100644 index 000000000..38f627e63 Binary files /dev/null and b/Models/Gothic/HemLower.png differ diff --git a/Models/Gothic/HemLowerBackCrotchStrap.png b/Models/Gothic/HemLowerBackCrotchStrap.png new file mode 100644 index 000000000..2df396611 Binary files /dev/null and b/Models/Gothic/HemLowerBackCrotchStrap.png differ diff --git a/Models/Gothic/HemLowerCrotchStrap.png b/Models/Gothic/HemLowerCrotchStrap.png new file mode 100644 index 000000000..8e1a878d3 Binary files /dev/null and b/Models/Gothic/HemLowerCrotchStrap.png differ diff --git a/Models/Gothic/HemLowerKneel.png b/Models/Gothic/HemLowerKneel.png new file mode 100644 index 000000000..98481a676 Binary files /dev/null and b/Models/Gothic/HemLowerKneel.png differ diff --git a/Models/Gothic/HemLowerKneelCrotchStrap.png b/Models/Gothic/HemLowerKneelCrotchStrap.png new file mode 100644 index 000000000..ff1a5be37 Binary files /dev/null and b/Models/Gothic/HemLowerKneelCrotchStrap.png differ diff --git a/Models/Gothic/HemUpper.png b/Models/Gothic/HemUpper.png new file mode 100644 index 000000000..92eb1266b Binary files /dev/null and b/Models/Gothic/HemUpper.png differ diff --git a/Models/Gothic/HemUpperCrotchStrap.png b/Models/Gothic/HemUpperCrotchStrap.png new file mode 100644 index 000000000..38aa5e0a8 Binary files /dev/null and b/Models/Gothic/HemUpperCrotchStrap.png differ diff --git a/Models/Gothic/HemUpperKneel.png b/Models/Gothic/HemUpperKneel.png new file mode 100644 index 000000000..9cc857034 Binary files /dev/null and b/Models/Gothic/HemUpperKneel.png differ diff --git a/Models/Gothic/HemUpperKneelCrotchStrap..png b/Models/Gothic/HemUpperKneelCrotchStrap..png new file mode 100644 index 000000000..02b210db2 Binary files /dev/null and b/Models/Gothic/HemUpperKneelCrotchStrap..png differ diff --git a/Models/Gothic/LaceLower.png b/Models/Gothic/LaceLower.png new file mode 100644 index 000000000..ba82670df Binary files /dev/null and b/Models/Gothic/LaceLower.png differ diff --git a/Models/Gothic/LaceLowerCrotchStrap.png b/Models/Gothic/LaceLowerCrotchStrap.png new file mode 100644 index 000000000..a5779100d Binary files /dev/null and b/Models/Gothic/LaceLowerCrotchStrap.png differ diff --git a/Models/Gothic/LaceLowerKneel.png b/Models/Gothic/LaceLowerKneel.png new file mode 100644 index 000000000..0dacdc644 Binary files /dev/null and b/Models/Gothic/LaceLowerKneel.png differ diff --git a/Models/Gothic/LaceLowerKneelCrotchStrap..png b/Models/Gothic/LaceLowerKneelCrotchStrap..png new file mode 100644 index 000000000..2206421fe Binary files /dev/null and b/Models/Gothic/LaceLowerKneelCrotchStrap..png differ diff --git a/Models/Gothic/LaceUpper.png b/Models/Gothic/LaceUpper.png new file mode 100644 index 000000000..80d285849 Binary files /dev/null and b/Models/Gothic/LaceUpper.png differ diff --git a/Models/Gothic/LaceUpperCrotchStrap.png b/Models/Gothic/LaceUpperCrotchStrap.png new file mode 100644 index 000000000..cfb6fca08 Binary files /dev/null and b/Models/Gothic/LaceUpperCrotchStrap.png differ diff --git a/Models/Gothic/LaceUpperKneel.png b/Models/Gothic/LaceUpperKneel.png new file mode 100644 index 000000000..0d76aa221 Binary files /dev/null and b/Models/Gothic/LaceUpperKneel.png differ diff --git a/Models/Gothic/LaceUpperKneelCrotchStrap..png b/Models/Gothic/LaceUpperKneelCrotchStrap..png new file mode 100644 index 000000000..326390c6e Binary files /dev/null and b/Models/Gothic/LaceUpperKneelCrotchStrap..png differ diff --git a/Models/Gothic/Lines.png b/Models/Gothic/Lines.png new file mode 100644 index 000000000..9cbf84c8a Binary files /dev/null and b/Models/Gothic/Lines.png differ diff --git a/Models/Gothic/LinesCrotchStrap.png b/Models/Gothic/LinesCrotchStrap.png new file mode 100644 index 000000000..097420a64 Binary files /dev/null and b/Models/Gothic/LinesCrotchStrap.png differ diff --git a/Models/Gothic/LinesKneel.png b/Models/Gothic/LinesKneel.png new file mode 100644 index 000000000..7b1583608 Binary files /dev/null and b/Models/Gothic/LinesKneel.png differ diff --git a/Models/Gothic/LinesKneelCrotchStrap..png b/Models/Gothic/LinesKneelCrotchStrap..png new file mode 100644 index 000000000..555fd9120 Binary files /dev/null and b/Models/Gothic/LinesKneelCrotchStrap..png differ diff --git a/Models/Gothic/Skirt.png b/Models/Gothic/Skirt.png new file mode 100644 index 000000000..cc653636d Binary files /dev/null and b/Models/Gothic/Skirt.png differ diff --git a/Models/Gothic/SkirtCrotchStrap.png b/Models/Gothic/SkirtCrotchStrap.png new file mode 100644 index 000000000..dd1346409 Binary files /dev/null and b/Models/Gothic/SkirtCrotchStrap.png differ diff --git a/Models/Gothic/SkirtKneel.png b/Models/Gothic/SkirtKneel.png new file mode 100644 index 000000000..16e1f112a Binary files /dev/null and b/Models/Gothic/SkirtKneel.png differ diff --git a/Models/Gothic/SkirtKneelCrotchStrap.png b/Models/Gothic/SkirtKneelCrotchStrap.png new file mode 100644 index 000000000..603eaab4b Binary files /dev/null and b/Models/Gothic/SkirtKneelCrotchStrap.png differ diff --git a/Models/Gothic/WaistbandClips.png b/Models/Gothic/WaistbandClips.png new file mode 100644 index 000000000..0521f6734 Binary files /dev/null and b/Models/Gothic/WaistbandClips.png differ diff --git a/Models/Hair/Ahoge.png b/Models/Hair/Ahoge.png new file mode 100644 index 000000000..c173a94e4 Binary files /dev/null and b/Models/Hair/Ahoge.png differ diff --git a/Models/Hair/BackFlat.png b/Models/Hair/BackFlat.png new file mode 100644 index 000000000..f9ae0495c Binary files /dev/null and b/Models/Hair/BackFlat.png differ diff --git a/Models/Hair/BackShort.png b/Models/Hair/BackShort.png new file mode 100644 index 000000000..2fee1622d Binary files /dev/null and b/Models/Hair/BackShort.png differ diff --git a/Models/Hair/BackShortCurly.png b/Models/Hair/BackShortCurly.png new file mode 100644 index 000000000..758ca396c Binary files /dev/null and b/Models/Hair/BackShortCurly.png differ diff --git a/Models/Hair/BackShortCurlyUnderlight.png b/Models/Hair/BackShortCurlyUnderlight.png new file mode 100644 index 000000000..3e8c96143 Binary files /dev/null and b/Models/Hair/BackShortCurlyUnderlight.png differ diff --git a/Models/Hair/BackShortMessy.png b/Models/Hair/BackShortMessy.png new file mode 100644 index 000000000..e253d5ecb Binary files /dev/null and b/Models/Hair/BackShortMessy.png differ diff --git a/Models/Hair/BackShortMessyUnderlight.png b/Models/Hair/BackShortMessyUnderlight.png new file mode 100644 index 000000000..86e22253c Binary files /dev/null and b/Models/Hair/BackShortMessyUnderlight.png differ diff --git a/Models/Hair/BackStraight.png b/Models/Hair/BackStraight.png new file mode 100644 index 000000000..004fc5c0b Binary files /dev/null and b/Models/Hair/BackStraight.png differ diff --git a/Models/Hair/BigBraidBack.png b/Models/Hair/BigBraidBack.png new file mode 100644 index 000000000..c4b58627a Binary files /dev/null and b/Models/Hair/BigBraidBack.png differ diff --git a/Models/Hair/Bob.png b/Models/Hair/Bob.png new file mode 100644 index 000000000..5d6aaa151 Binary files /dev/null and b/Models/Hair/Bob.png differ diff --git a/Models/Hair/BobFront.png b/Models/Hair/BobFront.png new file mode 100644 index 000000000..0a1288b64 Binary files /dev/null and b/Models/Hair/BobFront.png differ diff --git a/Models/Hair/Bow.png b/Models/Hair/Bow.png new file mode 100644 index 000000000..8c5215b13 Binary files /dev/null and b/Models/Hair/Bow.png differ diff --git a/Models/Hair/BowFrills.png b/Models/Hair/BowFrills.png new file mode 100644 index 000000000..edd965393 Binary files /dev/null and b/Models/Hair/BowFrills.png differ diff --git a/Models/Hair/Braid.png b/Models/Hair/Braid.png new file mode 100644 index 000000000..58613fc39 Binary files /dev/null and b/Models/Hair/Braid.png differ diff --git a/Models/Hair/BraidBack.png b/Models/Hair/BraidBack.png new file mode 100644 index 000000000..0444e5d40 Binary files /dev/null and b/Models/Hair/BraidBack.png differ diff --git a/Models/Hair/BraidCustom.png b/Models/Hair/BraidCustom.png new file mode 100644 index 000000000..628582446 Binary files /dev/null and b/Models/Hair/BraidCustom.png differ diff --git a/Models/Hair/BraidCustomBack.png b/Models/Hair/BraidCustomBack.png new file mode 100644 index 000000000..04bf7a4a1 Binary files /dev/null and b/Models/Hair/BraidCustomBack.png differ diff --git a/Models/Hair/BraidCustomBraid.png b/Models/Hair/BraidCustomBraid.png new file mode 100644 index 000000000..7c0f65eab Binary files /dev/null and b/Models/Hair/BraidCustomBraid.png differ diff --git a/Models/Hair/BraidCustom_Overstrap.png b/Models/Hair/BraidCustom_Overstrap.png new file mode 100644 index 000000000..9d0b5f2ea Binary files /dev/null and b/Models/Hair/BraidCustom_Overstrap.png differ diff --git a/Models/Hair/Braid_Overstrap.png b/Models/Hair/Braid_Overstrap.png new file mode 100644 index 000000000..9a9557a45 Binary files /dev/null and b/Models/Hair/Braid_Overstrap.png differ diff --git a/Models/Hair/Curly.png b/Models/Hair/Curly.png new file mode 100644 index 000000000..42c2cae67 Binary files /dev/null and b/Models/Hair/Curly.png differ diff --git a/Models/Hair/CurlyPonytail.png b/Models/Hair/CurlyPonytail.png new file mode 100644 index 000000000..8e75b14e6 Binary files /dev/null and b/Models/Hair/CurlyPonytail.png differ diff --git a/Models/Hair/Curly_Overstrap.png b/Models/Hair/Curly_Overstrap.png new file mode 100644 index 000000000..03640beab Binary files /dev/null and b/Models/Hair/Curly_Overstrap.png differ diff --git a/Models/Hair/DrillLeft.png b/Models/Hair/DrillLeft.png new file mode 100644 index 000000000..59e57171e Binary files /dev/null and b/Models/Hair/DrillLeft.png differ diff --git a/Models/Hair/DrillRight.png b/Models/Hair/DrillRight.png new file mode 100644 index 000000000..d32897ab1 Binary files /dev/null and b/Models/Hair/DrillRight.png differ diff --git a/Models/Hair/FrontLongBang.png b/Models/Hair/FrontLongBang.png new file mode 100644 index 000000000..33ff384eb Binary files /dev/null and b/Models/Hair/FrontLongBang.png differ diff --git a/Models/Hair/FrontStraight.png b/Models/Hair/FrontStraight.png new file mode 100644 index 000000000..ac489da94 Binary files /dev/null and b/Models/Hair/FrontStraight.png differ diff --git a/Models/Hair/FrontStraight2.png b/Models/Hair/FrontStraight2.png new file mode 100644 index 000000000..5d547394d Binary files /dev/null and b/Models/Hair/FrontStraight2.png differ diff --git a/Models/Hair/FrontStraight2_Front.png b/Models/Hair/FrontStraight2_Front.png new file mode 100644 index 000000000..93b978b83 Binary files /dev/null and b/Models/Hair/FrontStraight2_Front.png differ diff --git a/Models/Hair/FrontStraight2_Overstrap.png b/Models/Hair/FrontStraight2_Overstrap.png new file mode 100644 index 000000000..e5decd9ce Binary files /dev/null and b/Models/Hair/FrontStraight2_Overstrap.png differ diff --git a/Models/Hair/FrontStraight_Overstrap.png b/Models/Hair/FrontStraight_Overstrap.png new file mode 100644 index 000000000..eda2348a9 Binary files /dev/null and b/Models/Hair/FrontStraight_Overstrap.png differ diff --git a/Models/Hair/FrontSwept.png b/Models/Hair/FrontSwept.png new file mode 100644 index 000000000..18679e08b Binary files /dev/null and b/Models/Hair/FrontSwept.png differ diff --git a/Models/Hair/FrontSweptSide.png b/Models/Hair/FrontSweptSide.png new file mode 100644 index 000000000..26050fd85 Binary files /dev/null and b/Models/Hair/FrontSweptSide.png differ diff --git a/Models/Hair/Fuzzy.png b/Models/Hair/Fuzzy.png new file mode 100644 index 000000000..ecc31d5a3 Binary files /dev/null and b/Models/Hair/Fuzzy.png differ diff --git a/Models/Hair/Fuzzy_Overstrap.png b/Models/Hair/Fuzzy_Overstrap.png new file mode 100644 index 000000000..43a768e39 Binary files /dev/null and b/Models/Hair/Fuzzy_Overstrap.png differ diff --git a/Models/Hair/Hairband.png b/Models/Hair/Hairband.png new file mode 100644 index 000000000..7442c9ded Binary files /dev/null and b/Models/Hair/Hairband.png differ diff --git a/Models/Hair/HimeBack.png b/Models/Hair/HimeBack.png new file mode 100644 index 000000000..713f6d8da Binary files /dev/null and b/Models/Hair/HimeBack.png differ diff --git a/Models/Hair/MaidFrill.png b/Models/Hair/MaidFrill.png new file mode 100644 index 000000000..1f20af8f1 Binary files /dev/null and b/Models/Hair/MaidFrill.png differ diff --git a/Models/Hair/MaidHairband.pdn b/Models/Hair/MaidHairband.pdn new file mode 100644 index 000000000..8cb5dc68c Binary files /dev/null and b/Models/Hair/MaidHairband.pdn differ diff --git a/Models/Hair/MaidHairband.png b/Models/Hair/MaidHairband.png new file mode 100644 index 000000000..33392f601 Binary files /dev/null and b/Models/Hair/MaidHairband.png differ diff --git a/Models/Hair/Messy.png b/Models/Hair/Messy.png new file mode 100644 index 000000000..79cdcdfec Binary files /dev/null and b/Models/Hair/Messy.png differ diff --git a/Models/Hair/Ponytail.png b/Models/Hair/Ponytail.png new file mode 100644 index 000000000..c32a01427 Binary files /dev/null and b/Models/Hair/Ponytail.png differ diff --git a/Models/Hair/Ponytail2.png b/Models/Hair/Ponytail2.png new file mode 100644 index 000000000..00ff820ab Binary files /dev/null and b/Models/Hair/Ponytail2.png differ diff --git a/Models/Hair/Straight.png b/Models/Hair/Straight.png new file mode 100644 index 000000000..650467860 Binary files /dev/null and b/Models/Hair/Straight.png differ diff --git a/Models/Hair/StraightBangs.png b/Models/Hair/StraightBangs.png new file mode 100644 index 000000000..113c1f511 Binary files /dev/null and b/Models/Hair/StraightBangs.png differ diff --git a/Models/Hair/StraightBangs_Overstrap.png b/Models/Hair/StraightBangs_Overstrap.png new file mode 100644 index 000000000..2953d1632 Binary files /dev/null and b/Models/Hair/StraightBangs_Overstrap.png differ diff --git a/Models/Hair/Straight_Overstrap.png b/Models/Hair/Straight_Overstrap.png new file mode 100644 index 000000000..112b5470d Binary files /dev/null and b/Models/Hair/Straight_Overstrap.png differ diff --git a/Models/Hair/TwintailLeft.png b/Models/Hair/TwintailLeft.png new file mode 100644 index 000000000..4c890ab11 Binary files /dev/null and b/Models/Hair/TwintailLeft.png differ diff --git a/Models/Hair/TwintailRight.png b/Models/Hair/TwintailRight.png new file mode 100644 index 000000000..aade5aeb5 Binary files /dev/null and b/Models/Hair/TwintailRight.png differ diff --git a/Models/Hair/VentL.png b/Models/Hair/VentL.png new file mode 100644 index 000000000..48be37bef Binary files /dev/null and b/Models/Hair/VentL.png differ diff --git a/Models/Hair/VentR.png b/Models/Hair/VentR.png new file mode 100644 index 000000000..2ef4fd964 Binary files /dev/null and b/Models/Hair/VentR.png differ diff --git a/Models/Hair/Vents.png b/Models/Hair/Vents.png new file mode 100644 index 000000000..4ec79df49 Binary files /dev/null and b/Models/Hair/Vents.png differ diff --git a/Models/Hair/VentsFront.png b/Models/Hair/VentsFront.png new file mode 100644 index 000000000..b63d8e4db Binary files /dev/null and b/Models/Hair/VentsFront.png differ diff --git a/Models/Hair/VentsInnerL.png b/Models/Hair/VentsInnerL.png new file mode 100644 index 000000000..14ee93798 Binary files /dev/null and b/Models/Hair/VentsInnerL.png differ diff --git a/Models/Hair/VentsInnerR.png b/Models/Hair/VentsInnerR.png new file mode 100644 index 000000000..8cf5e0af2 Binary files /dev/null and b/Models/Hair/VentsInnerR.png differ diff --git a/Models/Hair2/BlondeBack.png b/Models/Hair2/BlondeBack.png new file mode 100644 index 000000000..3b9849278 Binary files /dev/null and b/Models/Hair2/BlondeBack.png differ diff --git a/Models/Hair2/BlondeBackM.png b/Models/Hair2/BlondeBackM.png new file mode 100644 index 000000000..4d9fc0ae0 Binary files /dev/null and b/Models/Hair2/BlondeBackM.png differ diff --git a/Models/Hair2/BlondeBangs.png b/Models/Hair2/BlondeBangs.png new file mode 100644 index 000000000..1f6ad32f0 Binary files /dev/null and b/Models/Hair2/BlondeBangs.png differ diff --git a/Models/Hair2/BlondeBangsM.png b/Models/Hair2/BlondeBangsM.png new file mode 100644 index 000000000..4811aef84 Binary files /dev/null and b/Models/Hair2/BlondeBangsM.png differ diff --git a/Models/Hair2/BlondeFront.png b/Models/Hair2/BlondeFront.png new file mode 100644 index 000000000..759e2f1ac Binary files /dev/null and b/Models/Hair2/BlondeFront.png differ diff --git a/Models/Hair2/BlondeFrontM.png b/Models/Hair2/BlondeFrontM.png new file mode 100644 index 000000000..5727bb6d7 Binary files /dev/null and b/Models/Hair2/BlondeFrontM.png differ diff --git a/Models/Hair2/Hair2_Front.png b/Models/Hair2/Hair2_Front.png new file mode 100644 index 000000000..02396858e Binary files /dev/null and b/Models/Hair2/Hair2_Front.png differ diff --git a/Models/Hair2/Hair2_FrontB.png b/Models/Hair2/Hair2_FrontB.png new file mode 100644 index 000000000..2db322e6e Binary files /dev/null and b/Models/Hair2/Hair2_FrontB.png differ diff --git a/Models/Hair2/Hair2_FrontC.png b/Models/Hair2/Hair2_FrontC.png new file mode 100644 index 000000000..05b331bf6 Binary files /dev/null and b/Models/Hair2/Hair2_FrontC.png differ diff --git a/Models/Hair2/Hair2_Left.png b/Models/Hair2/Hair2_Left.png new file mode 100644 index 000000000..b79588d20 Binary files /dev/null and b/Models/Hair2/Hair2_Left.png differ diff --git a/Models/Hair2/Hair2_Right.png b/Models/Hair2/Hair2_Right.png new file mode 100644 index 000000000..17e121c72 Binary files /dev/null and b/Models/Hair2/Hair2_Right.png differ diff --git a/Models/Hair2/Hair3_Back.png b/Models/Hair2/Hair3_Back.png new file mode 100644 index 000000000..8ed689e44 Binary files /dev/null and b/Models/Hair2/Hair3_Back.png differ diff --git a/Models/Hair2/Hair3_FrontA.png b/Models/Hair2/Hair3_FrontA.png new file mode 100644 index 000000000..cc16030a5 Binary files /dev/null and b/Models/Hair2/Hair3_FrontA.png differ diff --git a/Models/Hair2/Hair3_FrontB.png b/Models/Hair2/Hair3_FrontB.png new file mode 100644 index 000000000..56ed99d00 Binary files /dev/null and b/Models/Hair2/Hair3_FrontB.png differ diff --git a/Models/Hair2/Hair3_FrontC.png b/Models/Hair2/Hair3_FrontC.png new file mode 100644 index 000000000..915a18070 Binary files /dev/null and b/Models/Hair2/Hair3_FrontC.png differ diff --git a/Models/Hair2/Hair3_FrontD.png b/Models/Hair2/Hair3_FrontD.png new file mode 100644 index 000000000..54cf44236 Binary files /dev/null and b/Models/Hair2/Hair3_FrontD.png differ diff --git a/Models/Hair2/Hair3_FrontE.png b/Models/Hair2/Hair3_FrontE.png new file mode 100644 index 000000000..2b6bc758a Binary files /dev/null and b/Models/Hair2/Hair3_FrontE.png differ diff --git a/Models/Hair2/Hair4_Front.png b/Models/Hair2/Hair4_Front.png new file mode 100644 index 000000000..aaca23694 Binary files /dev/null and b/Models/Hair2/Hair4_Front.png differ diff --git a/Models/Hair2/Hair4_FrontB.png b/Models/Hair2/Hair4_FrontB.png new file mode 100644 index 000000000..0d0fa9036 Binary files /dev/null and b/Models/Hair2/Hair4_FrontB.png differ diff --git a/Models/Hair2/Hair4_Left.png b/Models/Hair2/Hair4_Left.png new file mode 100644 index 000000000..8bc0a76be Binary files /dev/null and b/Models/Hair2/Hair4_Left.png differ diff --git a/Models/Hair2/Hair4_LeftB.png b/Models/Hair2/Hair4_LeftB.png new file mode 100644 index 000000000..e6fe05018 Binary files /dev/null and b/Models/Hair2/Hair4_LeftB.png differ diff --git a/Models/Hair2/Hair4_Right.png b/Models/Hair2/Hair4_Right.png new file mode 100644 index 000000000..f8fea69ae Binary files /dev/null and b/Models/Hair2/Hair4_Right.png differ diff --git a/Models/Hair2/Hair4_RightB.png b/Models/Hair2/Hair4_RightB.png new file mode 100644 index 000000000..59c6e21ec Binary files /dev/null and b/Models/Hair2/Hair4_RightB.png differ diff --git a/Models/Hair2/Hair5_Front.png b/Models/Hair2/Hair5_Front.png new file mode 100644 index 000000000..c1cdc04f1 Binary files /dev/null and b/Models/Hair2/Hair5_Front.png differ diff --git a/Models/Hair2/Hair5_FrontB.png b/Models/Hair2/Hair5_FrontB.png new file mode 100644 index 000000000..94d9130fd Binary files /dev/null and b/Models/Hair2/Hair5_FrontB.png differ diff --git a/Models/Hair2/Hair5_FrontC.png b/Models/Hair2/Hair5_FrontC.png new file mode 100644 index 000000000..11b8401c2 Binary files /dev/null and b/Models/Hair2/Hair5_FrontC.png differ diff --git a/Models/Hair2/Hair5_FrontD.png b/Models/Hair2/Hair5_FrontD.png new file mode 100644 index 000000000..c290440c4 Binary files /dev/null and b/Models/Hair2/Hair5_FrontD.png differ diff --git a/Models/Hair2/Hair5_FrontE.png b/Models/Hair2/Hair5_FrontE.png new file mode 100644 index 000000000..707f734f8 Binary files /dev/null and b/Models/Hair2/Hair5_FrontE.png differ diff --git a/Models/Hair2/Hair5_Left.png b/Models/Hair2/Hair5_Left.png new file mode 100644 index 000000000..d38dd90d5 Binary files /dev/null and b/Models/Hair2/Hair5_Left.png differ diff --git a/Models/Hair2/Hair5_Right.png b/Models/Hair2/Hair5_Right.png new file mode 100644 index 000000000..12d84632d Binary files /dev/null and b/Models/Hair2/Hair5_Right.png differ diff --git a/Models/Hair2/Hair6_Front.png b/Models/Hair2/Hair6_Front.png new file mode 100644 index 000000000..0336cae4d Binary files /dev/null and b/Models/Hair2/Hair6_Front.png differ diff --git a/Models/Hair2/Hair6_FrontB.png b/Models/Hair2/Hair6_FrontB.png new file mode 100644 index 000000000..292d5ae7c Binary files /dev/null and b/Models/Hair2/Hair6_FrontB.png differ diff --git a/Models/Hair2/Hair6_Left.png b/Models/Hair2/Hair6_Left.png new file mode 100644 index 000000000..ac9e91b4e Binary files /dev/null and b/Models/Hair2/Hair6_Left.png differ diff --git a/Models/Hair2/Hair6_Right.png b/Models/Hair2/Hair6_Right.png new file mode 100644 index 000000000..5774695a0 Binary files /dev/null and b/Models/Hair2/Hair6_Right.png differ diff --git a/Models/Hair2/HairAura.png b/Models/Hair2/HairAura.png new file mode 100644 index 000000000..f7cdaf85c Binary files /dev/null and b/Models/Hair2/HairAura.png differ diff --git a/Models/Hair2/HairAura_Front.png b/Models/Hair2/HairAura_Front.png new file mode 100644 index 000000000..643e263db Binary files /dev/null and b/Models/Hair2/HairAura_Front.png differ diff --git a/Models/Hair2/HairAura_Left.png b/Models/Hair2/HairAura_Left.png new file mode 100644 index 000000000..67bb5326e Binary files /dev/null and b/Models/Hair2/HairAura_Left.png differ diff --git a/Models/Hair2/HairAura_LeftB.png b/Models/Hair2/HairAura_LeftB.png new file mode 100644 index 000000000..0b2218858 Binary files /dev/null and b/Models/Hair2/HairAura_LeftB.png differ diff --git a/Models/Hair2/HairAura_Right.png b/Models/Hair2/HairAura_Right.png new file mode 100644 index 000000000..0c14132e9 Binary files /dev/null and b/Models/Hair2/HairAura_Right.png differ diff --git a/Models/Hair2/HairAura_RightB.png b/Models/Hair2/HairAura_RightB.png new file mode 100644 index 000000000..b1871bd0d Binary files /dev/null and b/Models/Hair2/HairAura_RightB.png differ diff --git a/Models/Handcuffs/CuffsLockFront.png b/Models/Handcuffs/CuffsLockFront.png new file mode 100644 index 000000000..cd750e5ad Binary files /dev/null and b/Models/Handcuffs/CuffsLockFront.png differ diff --git a/Models/Handcuffs/HandCuffsFront.png b/Models/Handcuffs/HandCuffsFront.png new file mode 100644 index 000000000..eac4e1a50 Binary files /dev/null and b/Models/Handcuffs/HandCuffsFront.png differ diff --git a/Models/Handcuffs/HingedCuffsFront.png b/Models/Handcuffs/HingedCuffsFront.png new file mode 100644 index 000000000..2c775b398 Binary files /dev/null and b/Models/Handcuffs/HingedCuffsFront.png differ diff --git a/Models/Handcuffs/Irish8AnkleLeftClosed.png b/Models/Handcuffs/Irish8AnkleLeftClosed.png new file mode 100644 index 000000000..4ffa85541 Binary files /dev/null and b/Models/Handcuffs/Irish8AnkleLeftClosed.png differ diff --git a/Models/Handcuffs/Irish8AnkleLeftKneelClosed.png b/Models/Handcuffs/Irish8AnkleLeftKneelClosed.png new file mode 100644 index 000000000..dc5b587fd Binary files /dev/null and b/Models/Handcuffs/Irish8AnkleLeftKneelClosed.png differ diff --git a/Models/Handcuffs/Irish8AnkleRightClosed.png b/Models/Handcuffs/Irish8AnkleRightClosed.png new file mode 100644 index 000000000..ffb0385a9 Binary files /dev/null and b/Models/Handcuffs/Irish8AnkleRightClosed.png differ diff --git a/Models/Handcuffs/Irish8CuffsFront.png b/Models/Handcuffs/Irish8CuffsFront.png new file mode 100644 index 000000000..64fb3251b Binary files /dev/null and b/Models/Handcuffs/Irish8CuffsFront.png differ diff --git a/Models/Handcuffs/LegironsLeftClosed.png b/Models/Handcuffs/LegironsLeftClosed.png new file mode 100644 index 000000000..859dd3ef5 Binary files /dev/null and b/Models/Handcuffs/LegironsLeftClosed.png differ diff --git a/Models/Handcuffs/LegironsLeftKneel.png b/Models/Handcuffs/LegironsLeftKneel.png new file mode 100644 index 000000000..1740f2c15 Binary files /dev/null and b/Models/Handcuffs/LegironsLeftKneel.png differ diff --git a/Models/Handcuffs/LegironsLeftKneelClosed.png b/Models/Handcuffs/LegironsLeftKneelClosed.png new file mode 100644 index 000000000..dc5b587fd Binary files /dev/null and b/Models/Handcuffs/LegironsLeftKneelClosed.png differ diff --git a/Models/Handcuffs/LegironsLeftSpread.png b/Models/Handcuffs/LegironsLeftSpread.png new file mode 100644 index 000000000..5b5c1bc1c Binary files /dev/null and b/Models/Handcuffs/LegironsLeftSpread.png differ diff --git a/Models/Handcuffs/LegironsRightClosed.png b/Models/Handcuffs/LegironsRightClosed.png new file mode 100644 index 000000000..085b1cd7b Binary files /dev/null and b/Models/Handcuffs/LegironsRightClosed.png differ diff --git a/Models/Handcuffs/LegironsRightSpread.png b/Models/Handcuffs/LegironsRightSpread.png new file mode 100644 index 000000000..b5dcea50d Binary files /dev/null and b/Models/Handcuffs/LegironsRightSpread.png differ diff --git a/Models/Handcuffs/ThumbcuffsFront.png b/Models/Handcuffs/ThumbcuffsFront.png new file mode 100644 index 000000000..c7d10e071 Binary files /dev/null and b/Models/Handcuffs/ThumbcuffsFront.png differ diff --git a/Models/Handcuffs/WolfCuffsChainFront.png b/Models/Handcuffs/WolfCuffsChainFront.png new file mode 100644 index 000000000..da2dd5b52 Binary files /dev/null and b/Models/Handcuffs/WolfCuffsChainFront.png differ diff --git a/Models/Handcuffs/WolfCuffsFront.png b/Models/Handcuffs/WolfCuffsFront.png new file mode 100644 index 000000000..631a61e46 Binary files /dev/null and b/Models/Handcuffs/WolfCuffsFront.png differ diff --git a/Models/Harness/BeltsMid.png b/Models/Harness/BeltsMid.png new file mode 100644 index 000000000..b0d84879e Binary files /dev/null and b/Models/Harness/BeltsMid.png differ diff --git a/Models/Harness/BeltsOverbust.png b/Models/Harness/BeltsOverbust.png new file mode 100644 index 000000000..10b7024ae Binary files /dev/null and b/Models/Harness/BeltsOverbust.png differ diff --git a/Models/Harness/BeltsStrap.png b/Models/Harness/BeltsStrap.png new file mode 100644 index 000000000..da2281f63 Binary files /dev/null and b/Models/Harness/BeltsStrap.png differ diff --git a/Models/Harness/BeltsStrapClosed.png b/Models/Harness/BeltsStrapClosed.png new file mode 100644 index 000000000..04cdc4ec1 Binary files /dev/null and b/Models/Harness/BeltsStrapClosed.png differ diff --git a/Models/Harness/BeltsTopBoxtie.png b/Models/Harness/BeltsTopBoxtie.png new file mode 100644 index 000000000..2c9c4bccf Binary files /dev/null and b/Models/Harness/BeltsTopBoxtie.png differ diff --git a/Models/Harness/BeltsTopFree.png b/Models/Harness/BeltsTopFree.png new file mode 100644 index 000000000..2c9c4bccf Binary files /dev/null and b/Models/Harness/BeltsTopFree.png differ diff --git a/Models/Harness/BeltsTopUp.png b/Models/Harness/BeltsTopUp.png new file mode 100644 index 000000000..b3777afea Binary files /dev/null and b/Models/Harness/BeltsTopUp.png differ diff --git a/Models/Harness/BeltsTopWristtie.png b/Models/Harness/BeltsTopWristtie.png new file mode 100644 index 000000000..9d25999eb Binary files /dev/null and b/Models/Harness/BeltsTopWristtie.png differ diff --git a/Models/Harness/BeltsTopYoked.png b/Models/Harness/BeltsTopYoked.png new file mode 100644 index 000000000..485dd9d6f Binary files /dev/null and b/Models/Harness/BeltsTopYoked.png differ diff --git a/Models/Harness/BeltsUnderbust.png b/Models/Harness/BeltsUnderbust.png new file mode 100644 index 000000000..b65729fd6 Binary files /dev/null and b/Models/Harness/BeltsUnderbust.png differ diff --git a/Models/Harness/HardwareMid.png b/Models/Harness/HardwareMid.png new file mode 100644 index 000000000..76653b829 Binary files /dev/null and b/Models/Harness/HardwareMid.png differ diff --git a/Models/Harness/HardwareStrap.png b/Models/Harness/HardwareStrap.png new file mode 100644 index 000000000..9ef68a6f0 Binary files /dev/null and b/Models/Harness/HardwareStrap.png differ diff --git a/Models/Harness/HardwareTop.png b/Models/Harness/HardwareTop.png new file mode 100644 index 000000000..651980f9c Binary files /dev/null and b/Models/Harness/HardwareTop.png differ diff --git a/Models/Harness/HardwareUnderbust.png b/Models/Harness/HardwareUnderbust.png new file mode 100644 index 000000000..36acae3de Binary files /dev/null and b/Models/Harness/HardwareUnderbust.png differ diff --git a/Models/Harness/HardwareUnderbustOver.png b/Models/Harness/HardwareUnderbustOver.png new file mode 100644 index 000000000..6172dec11 Binary files /dev/null and b/Models/Harness/HardwareUnderbustOver.png differ diff --git a/Models/Hat/BowHeadband.png b/Models/Hat/BowHeadband.png new file mode 100644 index 000000000..404c199a4 Binary files /dev/null and b/Models/Hat/BowHeadband.png differ diff --git a/Models/Hat/BowHeadbandFrill.png b/Models/Hat/BowHeadbandFrill.png new file mode 100644 index 000000000..89fdc5126 Binary files /dev/null and b/Models/Hat/BowHeadbandFrill.png differ diff --git a/Models/Hat/Hat.png b/Models/Hat/Hat.png new file mode 100644 index 000000000..b45e7a7dd Binary files /dev/null and b/Models/Hat/Hat.png differ diff --git a/Models/Hat/HatBack.png b/Models/Hat/HatBack.png new file mode 100644 index 000000000..03b7ccd1e Binary files /dev/null and b/Models/Hat/HatBack.png differ diff --git a/Models/Hat/HatTop.png b/Models/Hat/HatTop.png new file mode 100644 index 000000000..510c7238a Binary files /dev/null and b/Models/Hat/HatTop.png differ diff --git a/Models/Hat/Headband.png b/Models/Hat/Headband.png new file mode 100644 index 000000000..0b2a07f71 Binary files /dev/null and b/Models/Hat/Headband.png differ diff --git a/Models/Hat/HeadbandBand.png b/Models/Hat/HeadbandBand.png new file mode 100644 index 000000000..527daab53 Binary files /dev/null and b/Models/Hat/HeadbandBand.png differ diff --git a/Models/Hat/HeadbandBow.png b/Models/Hat/HeadbandBow.png new file mode 100644 index 000000000..e5c61c0ba Binary files /dev/null and b/Models/Hat/HeadbandBow.png differ diff --git a/Models/Hat/HeadbandFrill.png b/Models/Hat/HeadbandFrill.png new file mode 100644 index 000000000..e60d3f114 Binary files /dev/null and b/Models/Hat/HeadbandFrill.png differ diff --git a/Models/Hat/Ribbon.png b/Models/Hat/Ribbon.png new file mode 100644 index 000000000..af4ce1b72 Binary files /dev/null and b/Models/Hat/Ribbon.png differ diff --git a/Models/Hat/TopHatSmall.png b/Models/Hat/TopHatSmall.png new file mode 100644 index 000000000..7d729ed8d Binary files /dev/null and b/Models/Hat/TopHatSmall.png differ diff --git a/Models/Hat/TopHatSmallBow.png b/Models/Hat/TopHatSmallBow.png new file mode 100644 index 000000000..0edc562b9 Binary files /dev/null and b/Models/Hat/TopHatSmallBow.png differ diff --git a/Models/Heels/BalletLaceLeftClosed.png b/Models/Heels/BalletLaceLeftClosed.png new file mode 100644 index 000000000..7dc3b0804 Binary files /dev/null and b/Models/Heels/BalletLaceLeftClosed.png differ diff --git a/Models/Heels/BalletLaceLeftSpread.png b/Models/Heels/BalletLaceLeftSpread.png new file mode 100644 index 000000000..0223705c8 Binary files /dev/null and b/Models/Heels/BalletLaceLeftSpread.png differ diff --git a/Models/Heels/BalletLaceRightClosed.png b/Models/Heels/BalletLaceRightClosed.png new file mode 100644 index 000000000..be6a9d8cb Binary files /dev/null and b/Models/Heels/BalletLaceRightClosed.png differ diff --git a/Models/Heels/BalletLaceRightSpread.png b/Models/Heels/BalletLaceRightSpread.png new file mode 100644 index 000000000..d18162d3b Binary files /dev/null and b/Models/Heels/BalletLaceRightSpread.png differ diff --git a/Models/Heels/BalletLeftClosed.png b/Models/Heels/BalletLeftClosed.png new file mode 100644 index 000000000..2a3f3e6be Binary files /dev/null and b/Models/Heels/BalletLeftClosed.png differ diff --git a/Models/Heels/BalletLeftHogtie.png b/Models/Heels/BalletLeftHogtie.png new file mode 100644 index 000000000..279992358 Binary files /dev/null and b/Models/Heels/BalletLeftHogtie.png differ diff --git a/Models/Heels/BalletLeftKneel.png b/Models/Heels/BalletLeftKneel.png new file mode 100644 index 000000000..ccb597e7f Binary files /dev/null and b/Models/Heels/BalletLeftKneel.png differ diff --git a/Models/Heels/BalletLeftKneelClosed.png b/Models/Heels/BalletLeftKneelClosed.png new file mode 100644 index 000000000..e3d22f23d Binary files /dev/null and b/Models/Heels/BalletLeftKneelClosed.png differ diff --git a/Models/Heels/BalletLeftSpread.png b/Models/Heels/BalletLeftSpread.png new file mode 100644 index 000000000..696ccbf1b Binary files /dev/null and b/Models/Heels/BalletLeftSpread.png differ diff --git a/Models/Heels/BalletRightClosed.png b/Models/Heels/BalletRightClosed.png new file mode 100644 index 000000000..d2fba1945 Binary files /dev/null and b/Models/Heels/BalletRightClosed.png differ diff --git a/Models/Heels/BalletRightKneel.png b/Models/Heels/BalletRightKneel.png new file mode 100644 index 000000000..ed3472420 Binary files /dev/null and b/Models/Heels/BalletRightKneel.png differ diff --git a/Models/Heels/BalletRightSpread.png b/Models/Heels/BalletRightSpread.png new file mode 100644 index 000000000..f1f66c168 Binary files /dev/null and b/Models/Heels/BalletRightSpread.png differ diff --git a/Models/Heels/BalletSoleLeftClosed.png b/Models/Heels/BalletSoleLeftClosed.png new file mode 100644 index 000000000..27a14df59 Binary files /dev/null and b/Models/Heels/BalletSoleLeftClosed.png differ diff --git a/Models/Heels/BalletSoleLeftHogtie.png b/Models/Heels/BalletSoleLeftHogtie.png new file mode 100644 index 000000000..50136978d Binary files /dev/null and b/Models/Heels/BalletSoleLeftHogtie.png differ diff --git a/Models/Heels/BalletSoleLeftKneel.png b/Models/Heels/BalletSoleLeftKneel.png new file mode 100644 index 000000000..2d55deab4 Binary files /dev/null and b/Models/Heels/BalletSoleLeftKneel.png differ diff --git a/Models/Heels/BalletSoleLeftKneelClosed.png b/Models/Heels/BalletSoleLeftKneelClosed.png new file mode 100644 index 000000000..6f395dd05 Binary files /dev/null and b/Models/Heels/BalletSoleLeftKneelClosed.png differ diff --git a/Models/Heels/BalletSoleLeftSpread.png b/Models/Heels/BalletSoleLeftSpread.png new file mode 100644 index 000000000..773375878 Binary files /dev/null and b/Models/Heels/BalletSoleLeftSpread.png differ diff --git a/Models/Heels/BalletSoleRightClosed.png b/Models/Heels/BalletSoleRightClosed.png new file mode 100644 index 000000000..c41f398b9 Binary files /dev/null and b/Models/Heels/BalletSoleRightClosed.png differ diff --git a/Models/Heels/BalletSoleRightKneel.png b/Models/Heels/BalletSoleRightKneel.png new file mode 100644 index 000000000..f8714f980 Binary files /dev/null and b/Models/Heels/BalletSoleRightKneel.png differ diff --git a/Models/Heels/BalletSoleRightSpread.png b/Models/Heels/BalletSoleRightSpread.png new file mode 100644 index 000000000..1b980340b Binary files /dev/null and b/Models/Heels/BalletSoleRightSpread.png differ diff --git a/Models/Heels/FlatBalletLeftClosed.png b/Models/Heels/FlatBalletLeftClosed.png new file mode 100644 index 000000000..51f574b12 Binary files /dev/null and b/Models/Heels/FlatBalletLeftClosed.png differ diff --git a/Models/Heels/FlatBalletLeftHogtie.png b/Models/Heels/FlatBalletLeftHogtie.png new file mode 100644 index 000000000..279992358 Binary files /dev/null and b/Models/Heels/FlatBalletLeftHogtie.png differ diff --git a/Models/Heels/FlatBalletLeftKneel.png b/Models/Heels/FlatBalletLeftKneel.png new file mode 100644 index 000000000..ccb597e7f Binary files /dev/null and b/Models/Heels/FlatBalletLeftKneel.png differ diff --git a/Models/Heels/FlatBalletLeftKneelClosed.png b/Models/Heels/FlatBalletLeftKneelClosed.png new file mode 100644 index 000000000..e3d22f23d Binary files /dev/null and b/Models/Heels/FlatBalletLeftKneelClosed.png differ diff --git a/Models/Heels/FlatBalletLeftSpread.png b/Models/Heels/FlatBalletLeftSpread.png new file mode 100644 index 000000000..e580607f5 Binary files /dev/null and b/Models/Heels/FlatBalletLeftSpread.png differ diff --git a/Models/Heels/FlatBalletRightClosed.png b/Models/Heels/FlatBalletRightClosed.png new file mode 100644 index 000000000..c1b361291 Binary files /dev/null and b/Models/Heels/FlatBalletRightClosed.png differ diff --git a/Models/Heels/FlatBalletRightKneel.png b/Models/Heels/FlatBalletRightKneel.png new file mode 100644 index 000000000..ed3472420 Binary files /dev/null and b/Models/Heels/FlatBalletRightKneel.png differ diff --git a/Models/Heels/FlatBalletRightSpread.png b/Models/Heels/FlatBalletRightSpread.png new file mode 100644 index 000000000..10e100cae Binary files /dev/null and b/Models/Heels/FlatBalletRightSpread.png differ diff --git a/Models/Heels/LeatherLeftClosed.png b/Models/Heels/LeatherLeftClosed.png new file mode 100644 index 000000000..07d6ed339 Binary files /dev/null and b/Models/Heels/LeatherLeftClosed.png differ diff --git a/Models/Heels/LeatherLeftHogtie.png b/Models/Heels/LeatherLeftHogtie.png new file mode 100644 index 000000000..fc1327e51 Binary files /dev/null and b/Models/Heels/LeatherLeftHogtie.png differ diff --git a/Models/Heels/LeatherLeftKneel.png b/Models/Heels/LeatherLeftKneel.png new file mode 100644 index 000000000..d99987e4f Binary files /dev/null and b/Models/Heels/LeatherLeftKneel.png differ diff --git a/Models/Heels/LeatherLeftKneelClosed.png b/Models/Heels/LeatherLeftKneelClosed.png new file mode 100644 index 000000000..a5486d31f Binary files /dev/null and b/Models/Heels/LeatherLeftKneelClosed.png differ diff --git a/Models/Heels/LeatherLeftSpread.png b/Models/Heels/LeatherLeftSpread.png new file mode 100644 index 000000000..e22e3eb03 Binary files /dev/null and b/Models/Heels/LeatherLeftSpread.png differ diff --git a/Models/Heels/LeatherLegLeftHogtie.png b/Models/Heels/LeatherLegLeftHogtie.png new file mode 100644 index 000000000..3a68fef99 Binary files /dev/null and b/Models/Heels/LeatherLegLeftHogtie.png differ diff --git a/Models/Heels/LeatherLegRightHogtie.png b/Models/Heels/LeatherLegRightHogtie.png new file mode 100644 index 000000000..b4559e9af Binary files /dev/null and b/Models/Heels/LeatherLegRightHogtie.png differ diff --git a/Models/Heels/LeatherLegRightKneel.png b/Models/Heels/LeatherLegRightKneel.png new file mode 100644 index 000000000..2f75e20a5 Binary files /dev/null and b/Models/Heels/LeatherLegRightKneel.png differ diff --git a/Models/Heels/LeatherLegRightKneelClosed.png b/Models/Heels/LeatherLegRightKneelClosed.png new file mode 100644 index 000000000..298d7f961 Binary files /dev/null and b/Models/Heels/LeatherLegRightKneelClosed.png differ diff --git a/Models/Heels/LeatherRightClosed.png b/Models/Heels/LeatherRightClosed.png new file mode 100644 index 000000000..76e0eee2c Binary files /dev/null and b/Models/Heels/LeatherRightClosed.png differ diff --git a/Models/Heels/LeatherRightHogtie.png b/Models/Heels/LeatherRightHogtie.png new file mode 100644 index 000000000..b4559e9af Binary files /dev/null and b/Models/Heels/LeatherRightHogtie.png differ diff --git a/Models/Heels/LeatherRightKneel.png b/Models/Heels/LeatherRightKneel.png new file mode 100644 index 000000000..2d95892f7 Binary files /dev/null and b/Models/Heels/LeatherRightKneel.png differ diff --git a/Models/Heels/LeatherRightSpread.png b/Models/Heels/LeatherRightSpread.png new file mode 100644 index 000000000..f1ac550bf Binary files /dev/null and b/Models/Heels/LeatherRightSpread.png differ diff --git a/Models/Heels/ShinyBalletLeftClosed.pdn b/Models/Heels/ShinyBalletLeftClosed.pdn new file mode 100644 index 000000000..3d07f24a4 Binary files /dev/null and b/Models/Heels/ShinyBalletLeftClosed.pdn differ diff --git a/Models/Heels/ShinyBalletLeftClosed.png b/Models/Heels/ShinyBalletLeftClosed.png new file mode 100644 index 000000000..977934190 Binary files /dev/null and b/Models/Heels/ShinyBalletLeftClosed.png differ diff --git a/Models/Heels/ShinyBalletLeftHogtie.png b/Models/Heels/ShinyBalletLeftHogtie.png new file mode 100644 index 000000000..744890693 Binary files /dev/null and b/Models/Heels/ShinyBalletLeftHogtie.png differ diff --git a/Models/Heels/ShinyBalletLeftKneel.png b/Models/Heels/ShinyBalletLeftKneel.png new file mode 100644 index 000000000..bbf8840fe Binary files /dev/null and b/Models/Heels/ShinyBalletLeftKneel.png differ diff --git a/Models/Heels/ShinyBalletLeftKneelClosed.png b/Models/Heels/ShinyBalletLeftKneelClosed.png new file mode 100644 index 000000000..8a6d06169 Binary files /dev/null and b/Models/Heels/ShinyBalletLeftKneelClosed.png differ diff --git a/Models/Heels/ShinyBalletLeftSpread.png b/Models/Heels/ShinyBalletLeftSpread.png new file mode 100644 index 000000000..87770b09a Binary files /dev/null and b/Models/Heels/ShinyBalletLeftSpread.png differ diff --git a/Models/Heels/ShinyBalletRightClosed.png b/Models/Heels/ShinyBalletRightClosed.png new file mode 100644 index 000000000..0b099b193 Binary files /dev/null and b/Models/Heels/ShinyBalletRightClosed.png differ diff --git a/Models/Heels/ShinyBalletRightKneel.png b/Models/Heels/ShinyBalletRightKneel.png new file mode 100644 index 000000000..ed3472420 Binary files /dev/null and b/Models/Heels/ShinyBalletRightKneel.png differ diff --git a/Models/Heels/ShinyBalletRightSpread.png b/Models/Heels/ShinyBalletRightSpread.png new file mode 100644 index 000000000..75429e158 Binary files /dev/null and b/Models/Heels/ShinyBalletRightSpread.png differ diff --git a/Models/Heels/TallLeftClosed.png b/Models/Heels/TallLeftClosed.png new file mode 100644 index 000000000..a3e717b4a Binary files /dev/null and b/Models/Heels/TallLeftClosed.png differ diff --git a/Models/Heels/TallLeftHogtie.png b/Models/Heels/TallLeftHogtie.png new file mode 100644 index 000000000..fc3687b94 Binary files /dev/null and b/Models/Heels/TallLeftHogtie.png differ diff --git a/Models/Heels/TallLeftKneel.png b/Models/Heels/TallLeftKneel.png new file mode 100644 index 000000000..964f21433 Binary files /dev/null and b/Models/Heels/TallLeftKneel.png differ diff --git a/Models/Heels/TallLeftKneelClosed.png b/Models/Heels/TallLeftKneelClosed.png new file mode 100644 index 000000000..d63e14173 Binary files /dev/null and b/Models/Heels/TallLeftKneelClosed.png differ diff --git a/Models/Heels/TallLeftSpread.png b/Models/Heels/TallLeftSpread.png new file mode 100644 index 000000000..937bc7dbd Binary files /dev/null and b/Models/Heels/TallLeftSpread.png differ diff --git a/Models/Heels/TallLegLeftHogtie.png b/Models/Heels/TallLegLeftHogtie.png new file mode 100644 index 000000000..24e084365 Binary files /dev/null and b/Models/Heels/TallLegLeftHogtie.png differ diff --git a/Models/Heels/TallLegLeftKneel.png b/Models/Heels/TallLegLeftKneel.png new file mode 100644 index 000000000..088f801c6 Binary files /dev/null and b/Models/Heels/TallLegLeftKneel.png differ diff --git a/Models/Heels/TallLegLeftKneelClosed.png b/Models/Heels/TallLegLeftKneelClosed.png new file mode 100644 index 000000000..6aa8c6ab3 Binary files /dev/null and b/Models/Heels/TallLegLeftKneelClosed.png differ diff --git a/Models/Heels/TallLegRightHogtie.png b/Models/Heels/TallLegRightHogtie.png new file mode 100644 index 000000000..3c385de9d Binary files /dev/null and b/Models/Heels/TallLegRightHogtie.png differ diff --git a/Models/Heels/TallLegRightKneel.png b/Models/Heels/TallLegRightKneel.png new file mode 100644 index 000000000..ba323e47e Binary files /dev/null and b/Models/Heels/TallLegRightKneel.png differ diff --git a/Models/Heels/TallLegRightKneelClosed.png b/Models/Heels/TallLegRightKneelClosed.png new file mode 100644 index 000000000..9c2aa05fa Binary files /dev/null and b/Models/Heels/TallLegRightKneelClosed.png differ diff --git a/Models/Heels/TallRightClosed.png b/Models/Heels/TallRightClosed.png new file mode 100644 index 000000000..2e6147418 Binary files /dev/null and b/Models/Heels/TallRightClosed.png differ diff --git a/Models/Heels/TallRightHogtie.png b/Models/Heels/TallRightHogtie.png new file mode 100644 index 000000000..b4559e9af Binary files /dev/null and b/Models/Heels/TallRightHogtie.png differ diff --git a/Models/Heels/TallRightKneel.png b/Models/Heels/TallRightKneel.png new file mode 100644 index 000000000..af91d38ab Binary files /dev/null and b/Models/Heels/TallRightKneel.png differ diff --git a/Models/Heels/TallRightSpread.png b/Models/Heels/TallRightSpread.png new file mode 100644 index 000000000..2b8a8c2cd Binary files /dev/null and b/Models/Heels/TallRightSpread.png differ diff --git a/Models/Hood/Blindfold.png b/Models/Hood/Blindfold.png new file mode 100644 index 000000000..32b60a429 Binary files /dev/null and b/Models/Hood/Blindfold.png differ diff --git a/Models/Hood/BunnyEars.png b/Models/Hood/BunnyEars.png new file mode 100644 index 000000000..d84ae6e72 Binary files /dev/null and b/Models/Hood/BunnyEars.png differ diff --git a/Models/Hood/Gag.png b/Models/Hood/Gag.png new file mode 100644 index 000000000..e2cdaaf7e Binary files /dev/null and b/Models/Hood/Gag.png differ diff --git a/Models/Hood/Hood.png b/Models/Hood/Hood.png new file mode 100644 index 000000000..23bed0b2b Binary files /dev/null and b/Models/Hood/Hood.png differ diff --git a/Models/Hood/HoodCollar.png b/Models/Hood/HoodCollar.png new file mode 100644 index 000000000..2fe8ae3c6 Binary files /dev/null and b/Models/Hood/HoodCollar.png differ diff --git a/Models/Hood/KittyEars.png b/Models/Hood/KittyEars.png new file mode 100644 index 000000000..e13d90ba3 Binary files /dev/null and b/Models/Hood/KittyEars.png differ diff --git a/Models/Hood/WolfEars.png b/Models/Hood/WolfEars.png new file mode 100644 index 000000000..55079eeba Binary files /dev/null and b/Models/Hood/WolfEars.png differ diff --git a/Models/Jacket/ArmsBoxtie.png b/Models/Jacket/ArmsBoxtie.png new file mode 100644 index 000000000..e0a3805f7 Binary files /dev/null and b/Models/Jacket/ArmsBoxtie.png differ diff --git a/Models/Jacket/ArmsCrossed.png b/Models/Jacket/ArmsCrossed.png new file mode 100644 index 000000000..b9eb667a8 Binary files /dev/null and b/Models/Jacket/ArmsCrossed.png differ diff --git a/Models/Jacket/ArmsWristtie.png b/Models/Jacket/ArmsWristtie.png new file mode 100644 index 000000000..41d005a4f Binary files /dev/null and b/Models/Jacket/ArmsWristtie.png differ diff --git a/Models/Jacket/BeltsArmsBoxtie.png b/Models/Jacket/BeltsArmsBoxtie.png new file mode 100644 index 000000000..b7df56ff1 Binary files /dev/null and b/Models/Jacket/BeltsArmsBoxtie.png differ diff --git a/Models/Jacket/BeltsArmsCrossed.png b/Models/Jacket/BeltsArmsCrossed.png new file mode 100644 index 000000000..399e3452f Binary files /dev/null and b/Models/Jacket/BeltsArmsCrossed.png differ diff --git a/Models/Jacket/BeltsArmsWristtie.png b/Models/Jacket/BeltsArmsWristtie.png new file mode 100644 index 000000000..b432def7c Binary files /dev/null and b/Models/Jacket/BeltsArmsWristtie.png differ diff --git a/Models/Jacket/BeltsChestBoxtie.png b/Models/Jacket/BeltsChestBoxtie.png new file mode 100644 index 000000000..0d8f4eeb7 Binary files /dev/null and b/Models/Jacket/BeltsChestBoxtie.png differ diff --git a/Models/Jacket/BeltsChestCrossed.png b/Models/Jacket/BeltsChestCrossed.png new file mode 100644 index 000000000..231d2864e Binary files /dev/null and b/Models/Jacket/BeltsChestCrossed.png differ diff --git a/Models/Jacket/BeltsChestWristtie.png b/Models/Jacket/BeltsChestWristtie.png new file mode 100644 index 000000000..ef88c694a Binary files /dev/null and b/Models/Jacket/BeltsChestWristtie.png differ diff --git a/Models/Jacket/BeltsTorsoLower.png b/Models/Jacket/BeltsTorsoLower.png new file mode 100644 index 000000000..b518810c2 Binary files /dev/null and b/Models/Jacket/BeltsTorsoLower.png differ diff --git a/Models/Jacket/BeltsTorsoLowerBoxtie.png b/Models/Jacket/BeltsTorsoLowerBoxtie.png new file mode 100644 index 000000000..bd798abb8 Binary files /dev/null and b/Models/Jacket/BeltsTorsoLowerBoxtie.png differ diff --git a/Models/Jacket/BeltsTorsoLowerCrossed.png b/Models/Jacket/BeltsTorsoLowerCrossed.png new file mode 100644 index 000000000..77402c038 Binary files /dev/null and b/Models/Jacket/BeltsTorsoLowerCrossed.png differ diff --git a/Models/Jacket/BeltsTorsoLowerWristtie.png b/Models/Jacket/BeltsTorsoLowerWristtie.png new file mode 100644 index 000000000..66df90afb Binary files /dev/null and b/Models/Jacket/BeltsTorsoLowerWristtie.png differ diff --git a/Models/Jacket/BinderTorsoLower.png b/Models/Jacket/BinderTorsoLower.png new file mode 100644 index 000000000..10b203599 Binary files /dev/null and b/Models/Jacket/BinderTorsoLower.png differ diff --git a/Models/Jacket/ChestBoleroBoxtie.png b/Models/Jacket/ChestBoleroBoxtie.png new file mode 100644 index 000000000..900fe634a Binary files /dev/null and b/Models/Jacket/ChestBoleroBoxtie.png differ diff --git a/Models/Jacket/ChestBoleroCrossed.png b/Models/Jacket/ChestBoleroCrossed.png new file mode 100644 index 000000000..3a085cf35 Binary files /dev/null and b/Models/Jacket/ChestBoleroCrossed.png differ diff --git a/Models/Jacket/ChestBoleroWristtie.png b/Models/Jacket/ChestBoleroWristtie.png new file mode 100644 index 000000000..a2b19965e Binary files /dev/null and b/Models/Jacket/ChestBoleroWristtie.png differ diff --git a/Models/Jacket/ChestBoxtie.png b/Models/Jacket/ChestBoxtie.png new file mode 100644 index 000000000..5e0a2fdd0 Binary files /dev/null and b/Models/Jacket/ChestBoxtie.png differ diff --git a/Models/Jacket/ChestCrossed.png b/Models/Jacket/ChestCrossed.png new file mode 100644 index 000000000..0db4cd9a3 Binary files /dev/null and b/Models/Jacket/ChestCrossed.png differ diff --git a/Models/Jacket/ChestWristtie.png b/Models/Jacket/ChestWristtie.png new file mode 100644 index 000000000..bce6bc5b4 Binary files /dev/null and b/Models/Jacket/ChestWristtie.png differ diff --git a/Models/Jacket/Crotch.png b/Models/Jacket/Crotch.png new file mode 100644 index 000000000..f65a6726c Binary files /dev/null and b/Models/Jacket/Crotch.png differ diff --git a/Models/Jacket/CrotchBeltExtra.png b/Models/Jacket/CrotchBeltExtra.png new file mode 100644 index 000000000..ab35c710e Binary files /dev/null and b/Models/Jacket/CrotchBeltExtra.png differ diff --git a/Models/Jacket/CrotchBelts.png b/Models/Jacket/CrotchBelts.png new file mode 100644 index 000000000..285bbebfc Binary files /dev/null and b/Models/Jacket/CrotchBelts.png differ diff --git a/Models/Jacket/CrotchlessBinderTorsoLower.png b/Models/Jacket/CrotchlessBinderTorsoLower.png new file mode 100644 index 000000000..785a954a5 Binary files /dev/null and b/Models/Jacket/CrotchlessBinderTorsoLower.png differ diff --git a/Models/Jacket/LatexBand.png b/Models/Jacket/LatexBand.png new file mode 100644 index 000000000..17dded2bd Binary files /dev/null and b/Models/Jacket/LatexBand.png differ diff --git a/Models/Jacket/LatexChest.png b/Models/Jacket/LatexChest.png new file mode 100644 index 000000000..17a0b927b Binary files /dev/null and b/Models/Jacket/LatexChest.png differ diff --git a/Models/Jacket/LatexLower.png b/Models/Jacket/LatexLower.png new file mode 100644 index 000000000..e58379421 Binary files /dev/null and b/Models/Jacket/LatexLower.png differ diff --git a/Models/Jacket/LatexUpper.png b/Models/Jacket/LatexUpper.png new file mode 100644 index 000000000..c2cc433ec Binary files /dev/null and b/Models/Jacket/LatexUpper.png differ diff --git a/Models/Jacket/StrapsArmsBoxtie.png b/Models/Jacket/StrapsArmsBoxtie.png new file mode 100644 index 000000000..6877ab9cd Binary files /dev/null and b/Models/Jacket/StrapsArmsBoxtie.png differ diff --git a/Models/Jacket/StrapsArmsCrossed.png b/Models/Jacket/StrapsArmsCrossed.png new file mode 100644 index 000000000..60bca117a Binary files /dev/null and b/Models/Jacket/StrapsArmsCrossed.png differ diff --git a/Models/Jacket/StrapsArmsWristtie.png b/Models/Jacket/StrapsArmsWristtie.png new file mode 100644 index 000000000..5768e222d Binary files /dev/null and b/Models/Jacket/StrapsArmsWristtie.png differ diff --git a/Models/Jacket/StrapsChestBoxtie.png b/Models/Jacket/StrapsChestBoxtie.png new file mode 100644 index 000000000..61e52b742 Binary files /dev/null and b/Models/Jacket/StrapsChestBoxtie.png differ diff --git a/Models/Jacket/StrapsChestCrossed.png b/Models/Jacket/StrapsChestCrossed.png new file mode 100644 index 000000000..904674cf6 Binary files /dev/null and b/Models/Jacket/StrapsChestCrossed.png differ diff --git a/Models/Jacket/StrapsChestExtra.png b/Models/Jacket/StrapsChestExtra.png new file mode 100644 index 000000000..d8e1ceae0 Binary files /dev/null and b/Models/Jacket/StrapsChestExtra.png differ diff --git a/Models/Jacket/StrapsChestWristtie.png b/Models/Jacket/StrapsChestWristtie.png new file mode 100644 index 000000000..66d11248d Binary files /dev/null and b/Models/Jacket/StrapsChestWristtie.png differ diff --git a/Models/Jacket/StrapsTorsoLowerBoxtie.png b/Models/Jacket/StrapsTorsoLowerBoxtie.png new file mode 100644 index 000000000..5eb07428e Binary files /dev/null and b/Models/Jacket/StrapsTorsoLowerBoxtie.png differ diff --git a/Models/Jacket/StrapsTorsoLowerCrossed.png b/Models/Jacket/StrapsTorsoLowerCrossed.png new file mode 100644 index 000000000..23bee42da Binary files /dev/null and b/Models/Jacket/StrapsTorsoLowerCrossed.png differ diff --git a/Models/Jacket/StrapsTorsoLowerExtra.png b/Models/Jacket/StrapsTorsoLowerExtra.png new file mode 100644 index 000000000..d3205a00a Binary files /dev/null and b/Models/Jacket/StrapsTorsoLowerExtra.png differ diff --git a/Models/Jacket/StrapsTorsoLowerWristtie.png b/Models/Jacket/StrapsTorsoLowerWristtie.png new file mode 100644 index 000000000..6d8a8eae5 Binary files /dev/null and b/Models/Jacket/StrapsTorsoLowerWristtie.png differ diff --git a/Models/Jacket/StrapsUnderbust.png b/Models/Jacket/StrapsUnderbust.png new file mode 100644 index 000000000..04f9f4b1f Binary files /dev/null and b/Models/Jacket/StrapsUnderbust.png differ diff --git a/Models/Jacket/TorsoLower.png b/Models/Jacket/TorsoLower.png new file mode 100644 index 000000000..abd689ab5 Binary files /dev/null and b/Models/Jacket/TorsoLower.png differ diff --git a/Models/Jacket/TorsoLowerCrossed.png b/Models/Jacket/TorsoLowerCrossed.png new file mode 100644 index 000000000..a6668086d Binary files /dev/null and b/Models/Jacket/TorsoLowerCrossed.png differ diff --git a/Models/Kigu/Brows.png b/Models/Kigu/Brows.png new file mode 100644 index 000000000..52e5ef792 Binary files /dev/null and b/Models/Kigu/Brows.png differ diff --git a/Models/Kigu/Eyes.png b/Models/Kigu/Eyes.png new file mode 100644 index 000000000..d85c8ab10 Binary files /dev/null and b/Models/Kigu/Eyes.png differ diff --git a/Models/Kigu/Eyes2.png b/Models/Kigu/Eyes2.png new file mode 100644 index 000000000..747000e1f Binary files /dev/null and b/Models/Kigu/Eyes2.png differ diff --git a/Models/Kigu/EyesWhites.png b/Models/Kigu/EyesWhites.png new file mode 100644 index 000000000..8bd09b052 Binary files /dev/null and b/Models/Kigu/EyesWhites.png differ diff --git a/Models/Kigu/Lock.png b/Models/Kigu/Lock.png new file mode 100644 index 000000000..66937a737 Binary files /dev/null and b/Models/Kigu/Lock.png differ diff --git a/Models/Kigu/Mask.png b/Models/Kigu/Mask.png new file mode 100644 index 000000000..4436d7a35 Binary files /dev/null and b/Models/Kigu/Mask.png differ diff --git a/Models/Kigu/MaskGag.png b/Models/Kigu/MaskGag.png new file mode 100644 index 000000000..42bc9452d Binary files /dev/null and b/Models/Kigu/MaskGag.png differ diff --git a/Models/Kigu/Mouth.png b/Models/Kigu/Mouth.png new file mode 100644 index 000000000..c60d5c6cf Binary files /dev/null and b/Models/Kigu/Mouth.png differ diff --git a/Models/Kigu/MouthSmile.png b/Models/Kigu/MouthSmile.png new file mode 100644 index 000000000..730c30924 Binary files /dev/null and b/Models/Kigu/MouthSmile.png differ diff --git a/Models/KittyLatex/KittyLatexEar.png b/Models/KittyLatex/KittyLatexEar.png new file mode 100644 index 000000000..e792eec99 Binary files /dev/null and b/Models/KittyLatex/KittyLatexEar.png differ diff --git a/Models/KittyLatex/KittyLatexEarLight.png b/Models/KittyLatex/KittyLatexEarLight.png new file mode 100644 index 000000000..8e838045d Binary files /dev/null and b/Models/KittyLatex/KittyLatexEarLight.png differ diff --git a/Models/KittyLatex/KittyLatexEarMuff.png b/Models/KittyLatex/KittyLatexEarMuff.png new file mode 100644 index 000000000..4d1290e40 Binary files /dev/null and b/Models/KittyLatex/KittyLatexEarMuff.png differ diff --git a/Models/KittyLatex/KittyLatexEarMuffLight1.png b/Models/KittyLatex/KittyLatexEarMuffLight1.png new file mode 100644 index 000000000..235093c67 Binary files /dev/null and b/Models/KittyLatex/KittyLatexEarMuffLight1.png differ diff --git a/Models/KittyLatex/KittyLatexEarMuffLight2.png b/Models/KittyLatex/KittyLatexEarMuffLight2.png new file mode 100644 index 000000000..03660a984 Binary files /dev/null and b/Models/KittyLatex/KittyLatexEarMuffLight2.png differ diff --git a/Models/KittyLatex/KittyLatexTail.png b/Models/KittyLatex/KittyLatexTail.png new file mode 100644 index 000000000..d1962a9cf Binary files /dev/null and b/Models/KittyLatex/KittyLatexTail.png differ diff --git a/Models/KittyLatex/KittyLatexTail2.png b/Models/KittyLatex/KittyLatexTail2.png new file mode 100644 index 000000000..e27ff94de Binary files /dev/null and b/Models/KittyLatex/KittyLatexTail2.png differ diff --git a/Models/KittyLatex/KittyLatexTail2Light.png b/Models/KittyLatex/KittyLatexTail2Light.png new file mode 100644 index 000000000..63d051e35 Binary files /dev/null and b/Models/KittyLatex/KittyLatexTail2Light.png differ diff --git a/Models/KittyLatex/KittyLatexTailLight.png b/Models/KittyLatex/KittyLatexTailLight.png new file mode 100644 index 000000000..7b727a9b1 Binary files /dev/null and b/Models/KittyLatex/KittyLatexTailLight.png differ diff --git a/Models/KittyPawCuffs/AnkleLeftClosed.png b/Models/KittyPawCuffs/AnkleLeftClosed.png new file mode 100644 index 000000000..c3c62d193 Binary files /dev/null and b/Models/KittyPawCuffs/AnkleLeftClosed.png differ diff --git a/Models/KittyPawCuffs/AnkleLeftKneel.png b/Models/KittyPawCuffs/AnkleLeftKneel.png new file mode 100644 index 000000000..891fbca03 Binary files /dev/null and b/Models/KittyPawCuffs/AnkleLeftKneel.png differ diff --git a/Models/KittyPawCuffs/AnkleLeftKneelClosed.png b/Models/KittyPawCuffs/AnkleLeftKneelClosed.png new file mode 100644 index 000000000..5e7ef60d9 Binary files /dev/null and b/Models/KittyPawCuffs/AnkleLeftKneelClosed.png differ diff --git a/Models/KittyPawCuffs/AnkleLeftSpread.png b/Models/KittyPawCuffs/AnkleLeftSpread.png new file mode 100644 index 000000000..b7344f6df Binary files /dev/null and b/Models/KittyPawCuffs/AnkleLeftSpread.png differ diff --git a/Models/KittyPawCuffs/AnkleRightClosed.png b/Models/KittyPawCuffs/AnkleRightClosed.png new file mode 100644 index 000000000..d18558531 Binary files /dev/null and b/Models/KittyPawCuffs/AnkleRightClosed.png differ diff --git a/Models/KittyPawCuffs/AnkleRightSpread.png b/Models/KittyPawCuffs/AnkleRightSpread.png new file mode 100644 index 000000000..b2b884d01 Binary files /dev/null and b/Models/KittyPawCuffs/AnkleRightSpread.png differ diff --git a/Models/KittyPawCuffs/BandAnkleLeftClosed.png b/Models/KittyPawCuffs/BandAnkleLeftClosed.png new file mode 100644 index 000000000..7f342c6fd Binary files /dev/null and b/Models/KittyPawCuffs/BandAnkleLeftClosed.png differ diff --git a/Models/KittyPawCuffs/BandAnkleLeftKneel.png b/Models/KittyPawCuffs/BandAnkleLeftKneel.png new file mode 100644 index 000000000..14958c07a Binary files /dev/null and b/Models/KittyPawCuffs/BandAnkleLeftKneel.png differ diff --git a/Models/KittyPawCuffs/BandAnkleLeftKneelClosed.png b/Models/KittyPawCuffs/BandAnkleLeftKneelClosed.png new file mode 100644 index 000000000..314875db2 Binary files /dev/null and b/Models/KittyPawCuffs/BandAnkleLeftKneelClosed.png differ diff --git a/Models/KittyPawCuffs/BandAnkleLeftSpread.png b/Models/KittyPawCuffs/BandAnkleLeftSpread.png new file mode 100644 index 000000000..5994b5d40 Binary files /dev/null and b/Models/KittyPawCuffs/BandAnkleLeftSpread.png differ diff --git a/Models/KittyPawCuffs/BandAnkleRightClosed.png b/Models/KittyPawCuffs/BandAnkleRightClosed.png new file mode 100644 index 000000000..ac64645d4 Binary files /dev/null and b/Models/KittyPawCuffs/BandAnkleRightClosed.png differ diff --git a/Models/KittyPawCuffs/BandAnkleRightSpread.png b/Models/KittyPawCuffs/BandAnkleRightSpread.png new file mode 100644 index 000000000..b686af8ca Binary files /dev/null and b/Models/KittyPawCuffs/BandAnkleRightSpread.png differ diff --git a/Models/KittyPawCuffs/BandElbowLeftBoxtie.png b/Models/KittyPawCuffs/BandElbowLeftBoxtie.png new file mode 100644 index 000000000..f0b6d4946 Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowLeftBoxtie.png differ diff --git a/Models/KittyPawCuffs/BandElbowLeftFree.png b/Models/KittyPawCuffs/BandElbowLeftFree.png new file mode 100644 index 000000000..29ef766fd Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowLeftFree.png differ diff --git a/Models/KittyPawCuffs/BandElbowLeftFront.png b/Models/KittyPawCuffs/BandElbowLeftFront.png new file mode 100644 index 000000000..f05f78277 Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowLeftFront.png differ diff --git a/Models/KittyPawCuffs/BandElbowLeftUp.png b/Models/KittyPawCuffs/BandElbowLeftUp.png new file mode 100644 index 000000000..43f629265 Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowLeftUp.png differ diff --git a/Models/KittyPawCuffs/BandElbowLeftWristtie.png b/Models/KittyPawCuffs/BandElbowLeftWristtie.png new file mode 100644 index 000000000..623133812 Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowLeftWristtie.png differ diff --git a/Models/KittyPawCuffs/BandElbowLeftYoked.png b/Models/KittyPawCuffs/BandElbowLeftYoked.png new file mode 100644 index 000000000..556800f44 Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowLeftYoked.png differ diff --git a/Models/KittyPawCuffs/BandElbowRightBoxtie.png b/Models/KittyPawCuffs/BandElbowRightBoxtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowRightBoxtie.png differ diff --git a/Models/KittyPawCuffs/BandElbowRightCrossed.png b/Models/KittyPawCuffs/BandElbowRightCrossed.png new file mode 100644 index 000000000..087381aa4 Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowRightCrossed.png differ diff --git a/Models/KittyPawCuffs/BandElbowRightFront.png b/Models/KittyPawCuffs/BandElbowRightFront.png new file mode 100644 index 000000000..f37687f7a Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowRightFront.png differ diff --git a/Models/KittyPawCuffs/BandElbowRightUp.png b/Models/KittyPawCuffs/BandElbowRightUp.png new file mode 100644 index 000000000..dd5e7de65 Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowRightUp.png differ diff --git a/Models/KittyPawCuffs/BandElbowRightWristtie.png b/Models/KittyPawCuffs/BandElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowRightWristtie.png differ diff --git a/Models/KittyPawCuffs/BandElbowRightYoked.png b/Models/KittyPawCuffs/BandElbowRightYoked.png new file mode 100644 index 000000000..b0ca71e1b Binary files /dev/null and b/Models/KittyPawCuffs/BandElbowRightYoked.png differ diff --git a/Models/KittyPawCuffs/BandThighLeftClosed.png b/Models/KittyPawCuffs/BandThighLeftClosed.png new file mode 100644 index 000000000..f19263c59 Binary files /dev/null and b/Models/KittyPawCuffs/BandThighLeftClosed.png differ diff --git a/Models/KittyPawCuffs/BandThighLeftKneel.png b/Models/KittyPawCuffs/BandThighLeftKneel.png new file mode 100644 index 000000000..f73ac7a99 Binary files /dev/null and b/Models/KittyPawCuffs/BandThighLeftKneel.png differ diff --git a/Models/KittyPawCuffs/BandThighLeftKneelClosed.png b/Models/KittyPawCuffs/BandThighLeftKneelClosed.png new file mode 100644 index 000000000..a666276d7 Binary files /dev/null and b/Models/KittyPawCuffs/BandThighLeftKneelClosed.png differ diff --git a/Models/KittyPawCuffs/BandThighLeftSpread.png b/Models/KittyPawCuffs/BandThighLeftSpread.png new file mode 100644 index 000000000..95e8e7c1e Binary files /dev/null and b/Models/KittyPawCuffs/BandThighLeftSpread.png differ diff --git a/Models/KittyPawCuffs/BandThighRightClosed.png b/Models/KittyPawCuffs/BandThighRightClosed.png new file mode 100644 index 000000000..80810d34d Binary files /dev/null and b/Models/KittyPawCuffs/BandThighRightClosed.png differ diff --git a/Models/KittyPawCuffs/BandThighRightKneel.png b/Models/KittyPawCuffs/BandThighRightKneel.png new file mode 100644 index 000000000..31407c6a4 Binary files /dev/null and b/Models/KittyPawCuffs/BandThighRightKneel.png differ diff --git a/Models/KittyPawCuffs/BandThighRightKneelClosed.png b/Models/KittyPawCuffs/BandThighRightKneelClosed.png new file mode 100644 index 000000000..6d82e5595 Binary files /dev/null and b/Models/KittyPawCuffs/BandThighRightKneelClosed.png differ diff --git a/Models/KittyPawCuffs/BandThighRightSpread.png b/Models/KittyPawCuffs/BandThighRightSpread.png new file mode 100644 index 000000000..6aaa68276 Binary files /dev/null and b/Models/KittyPawCuffs/BandThighRightSpread.png differ diff --git a/Models/KittyPawCuffs/BandWristLeftFree.png b/Models/KittyPawCuffs/BandWristLeftFree.png new file mode 100644 index 000000000..a32ebf33d Binary files /dev/null and b/Models/KittyPawCuffs/BandWristLeftFree.png differ diff --git a/Models/KittyPawCuffs/BandWristLeftFront.png b/Models/KittyPawCuffs/BandWristLeftFront.png new file mode 100644 index 000000000..8bd279300 Binary files /dev/null and b/Models/KittyPawCuffs/BandWristLeftFront.png differ diff --git a/Models/KittyPawCuffs/BandWristLeftYoked.png b/Models/KittyPawCuffs/BandWristLeftYoked.png new file mode 100644 index 000000000..8971e49c1 Binary files /dev/null and b/Models/KittyPawCuffs/BandWristLeftYoked.png differ diff --git a/Models/KittyPawCuffs/BandWristRightCrossed.png b/Models/KittyPawCuffs/BandWristRightCrossed.png new file mode 100644 index 000000000..a84285cd6 Binary files /dev/null and b/Models/KittyPawCuffs/BandWristRightCrossed.png differ diff --git a/Models/KittyPawCuffs/BandWristRightFree.png b/Models/KittyPawCuffs/BandWristRightFree.png new file mode 100644 index 000000000..65ddf4a25 Binary files /dev/null and b/Models/KittyPawCuffs/BandWristRightFree.png differ diff --git a/Models/KittyPawCuffs/BandWristRightFront.png b/Models/KittyPawCuffs/BandWristRightFront.png new file mode 100644 index 000000000..12cfbbfa9 Binary files /dev/null and b/Models/KittyPawCuffs/BandWristRightFront.png differ diff --git a/Models/KittyPawCuffs/BandWristRightYoked.png b/Models/KittyPawCuffs/BandWristRightYoked.png new file mode 100644 index 000000000..9c1e859dc Binary files /dev/null and b/Models/KittyPawCuffs/BandWristRightYoked.png differ diff --git a/Models/KittyPawCuffs/ElbowLeftBoxtie.png b/Models/KittyPawCuffs/ElbowLeftBoxtie.png new file mode 100644 index 000000000..4ec80d8ff Binary files /dev/null and b/Models/KittyPawCuffs/ElbowLeftBoxtie.png differ diff --git a/Models/KittyPawCuffs/ElbowLeftCrossed.png b/Models/KittyPawCuffs/ElbowLeftCrossed.png new file mode 100644 index 000000000..895d8a2e9 Binary files /dev/null and b/Models/KittyPawCuffs/ElbowLeftCrossed.png differ diff --git a/Models/KittyPawCuffs/ElbowLeftFree.png b/Models/KittyPawCuffs/ElbowLeftFree.png new file mode 100644 index 000000000..5fbc2f5a8 Binary files /dev/null and b/Models/KittyPawCuffs/ElbowLeftFree.png differ diff --git a/Models/KittyPawCuffs/ElbowLeftFront.png b/Models/KittyPawCuffs/ElbowLeftFront.png new file mode 100644 index 000000000..4a54f49e8 Binary files /dev/null and b/Models/KittyPawCuffs/ElbowLeftFront.png differ diff --git a/Models/KittyPawCuffs/ElbowLeftUp.png b/Models/KittyPawCuffs/ElbowLeftUp.png new file mode 100644 index 000000000..c2e6892b6 Binary files /dev/null and b/Models/KittyPawCuffs/ElbowLeftUp.png differ diff --git a/Models/KittyPawCuffs/ElbowLeftWristtie.png b/Models/KittyPawCuffs/ElbowLeftWristtie.png new file mode 100644 index 000000000..71de5a4e8 Binary files /dev/null and b/Models/KittyPawCuffs/ElbowLeftWristtie.png differ diff --git a/Models/KittyPawCuffs/ElbowLeftYoked.png b/Models/KittyPawCuffs/ElbowLeftYoked.png new file mode 100644 index 000000000..3e01a5b2c Binary files /dev/null and b/Models/KittyPawCuffs/ElbowLeftYoked.png differ diff --git a/Models/KittyPawCuffs/ElbowRightBoxtie.png b/Models/KittyPawCuffs/ElbowRightBoxtie.png new file mode 100644 index 000000000..6c578ff63 Binary files /dev/null and b/Models/KittyPawCuffs/ElbowRightBoxtie.png differ diff --git a/Models/KittyPawCuffs/ElbowRightCrossed.png b/Models/KittyPawCuffs/ElbowRightCrossed.png new file mode 100644 index 000000000..b20eebcc9 Binary files /dev/null and b/Models/KittyPawCuffs/ElbowRightCrossed.png differ diff --git a/Models/KittyPawCuffs/ElbowRightFront.png b/Models/KittyPawCuffs/ElbowRightFront.png new file mode 100644 index 000000000..a1e935a8a Binary files /dev/null and b/Models/KittyPawCuffs/ElbowRightFront.png differ diff --git a/Models/KittyPawCuffs/ElbowRightUp.png b/Models/KittyPawCuffs/ElbowRightUp.png new file mode 100644 index 000000000..e13c8ff63 Binary files /dev/null and b/Models/KittyPawCuffs/ElbowRightUp.png differ diff --git a/Models/KittyPawCuffs/ElbowRightWristtie.png b/Models/KittyPawCuffs/ElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPawCuffs/ElbowRightWristtie.png differ diff --git a/Models/KittyPawCuffs/ElbowRightYoked.png b/Models/KittyPawCuffs/ElbowRightYoked.png new file mode 100644 index 000000000..fc92ebb54 Binary files /dev/null and b/Models/KittyPawCuffs/ElbowRightYoked.png differ diff --git a/Models/KittyPawCuffs/LockAnkleLeftClosed.png b/Models/KittyPawCuffs/LockAnkleLeftClosed.png new file mode 100644 index 000000000..2d82576f7 Binary files /dev/null and b/Models/KittyPawCuffs/LockAnkleLeftClosed.png differ diff --git a/Models/KittyPawCuffs/LockAnkleLeftKneel.png b/Models/KittyPawCuffs/LockAnkleLeftKneel.png new file mode 100644 index 000000000..3b29d8363 Binary files /dev/null and b/Models/KittyPawCuffs/LockAnkleLeftKneel.png differ diff --git a/Models/KittyPawCuffs/LockAnkleLeftKneelClosed.png b/Models/KittyPawCuffs/LockAnkleLeftKneelClosed.png new file mode 100644 index 000000000..997acd755 Binary files /dev/null and b/Models/KittyPawCuffs/LockAnkleLeftKneelClosed.png differ diff --git a/Models/KittyPawCuffs/LockAnkleLeftSpread.png b/Models/KittyPawCuffs/LockAnkleLeftSpread.png new file mode 100644 index 000000000..7c23dc3ae Binary files /dev/null and b/Models/KittyPawCuffs/LockAnkleLeftSpread.png differ diff --git a/Models/KittyPawCuffs/LockAnkleRightClosed.png b/Models/KittyPawCuffs/LockAnkleRightClosed.png new file mode 100644 index 000000000..a92993296 Binary files /dev/null and b/Models/KittyPawCuffs/LockAnkleRightClosed.png differ diff --git a/Models/KittyPawCuffs/LockAnkleRightSpread.png b/Models/KittyPawCuffs/LockAnkleRightSpread.png new file mode 100644 index 000000000..20474e300 Binary files /dev/null and b/Models/KittyPawCuffs/LockAnkleRightSpread.png differ diff --git a/Models/KittyPawCuffs/LockElbowLeftBoxtie.png b/Models/KittyPawCuffs/LockElbowLeftBoxtie.png new file mode 100644 index 000000000..a7fc39b03 Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowLeftBoxtie.png differ diff --git a/Models/KittyPawCuffs/LockElbowLeftFree.png b/Models/KittyPawCuffs/LockElbowLeftFree.png new file mode 100644 index 000000000..36e6cdf05 Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowLeftFree.png differ diff --git a/Models/KittyPawCuffs/LockElbowLeftFront.png b/Models/KittyPawCuffs/LockElbowLeftFront.png new file mode 100644 index 000000000..8f60e5ce4 Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowLeftFront.png differ diff --git a/Models/KittyPawCuffs/LockElbowLeftUp.png b/Models/KittyPawCuffs/LockElbowLeftUp.png new file mode 100644 index 000000000..500722807 Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowLeftUp.png differ diff --git a/Models/KittyPawCuffs/LockElbowLeftWristtie.png b/Models/KittyPawCuffs/LockElbowLeftWristtie.png new file mode 100644 index 000000000..19d1ecaa2 Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowLeftWristtie.png differ diff --git a/Models/KittyPawCuffs/LockElbowLeftYoked.png b/Models/KittyPawCuffs/LockElbowLeftYoked.png new file mode 100644 index 000000000..6d8bbd063 Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowLeftYoked.png differ diff --git a/Models/KittyPawCuffs/LockElbowRightBoxtie.png b/Models/KittyPawCuffs/LockElbowRightBoxtie.png new file mode 100644 index 000000000..6a6ca5ac6 Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowRightBoxtie.png differ diff --git a/Models/KittyPawCuffs/LockElbowRightCrossed.png b/Models/KittyPawCuffs/LockElbowRightCrossed.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowRightCrossed.png differ diff --git a/Models/KittyPawCuffs/LockElbowRightFront.png b/Models/KittyPawCuffs/LockElbowRightFront.png new file mode 100644 index 000000000..67b0f2df5 Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowRightFront.png differ diff --git a/Models/KittyPawCuffs/LockElbowRightUp.png b/Models/KittyPawCuffs/LockElbowRightUp.png new file mode 100644 index 000000000..6c19f7a9d Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowRightUp.png differ diff --git a/Models/KittyPawCuffs/LockElbowRightWristtie.png b/Models/KittyPawCuffs/LockElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowRightWristtie.png differ diff --git a/Models/KittyPawCuffs/LockElbowRightYoked.png b/Models/KittyPawCuffs/LockElbowRightYoked.png new file mode 100644 index 000000000..63e334a5f Binary files /dev/null and b/Models/KittyPawCuffs/LockElbowRightYoked.png differ diff --git a/Models/KittyPawCuffs/LockThighLeftClosed.png b/Models/KittyPawCuffs/LockThighLeftClosed.png new file mode 100644 index 000000000..44e8638e5 Binary files /dev/null and b/Models/KittyPawCuffs/LockThighLeftClosed.png differ diff --git a/Models/KittyPawCuffs/LockThighLeftKneel.png b/Models/KittyPawCuffs/LockThighLeftKneel.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPawCuffs/LockThighLeftKneel.png differ diff --git a/Models/KittyPawCuffs/LockThighLeftKneelClosed.png b/Models/KittyPawCuffs/LockThighLeftKneelClosed.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPawCuffs/LockThighLeftKneelClosed.png differ diff --git a/Models/KittyPawCuffs/LockThighLeftSpread.png b/Models/KittyPawCuffs/LockThighLeftSpread.png new file mode 100644 index 000000000..14384203f Binary files /dev/null and b/Models/KittyPawCuffs/LockThighLeftSpread.png differ diff --git a/Models/KittyPawCuffs/LockThighRightClosed.png b/Models/KittyPawCuffs/LockThighRightClosed.png new file mode 100644 index 000000000..466418054 Binary files /dev/null and b/Models/KittyPawCuffs/LockThighRightClosed.png differ diff --git a/Models/KittyPawCuffs/LockThighRightKneel.png b/Models/KittyPawCuffs/LockThighRightKneel.png new file mode 100644 index 000000000..c0543c1b3 Binary files /dev/null and b/Models/KittyPawCuffs/LockThighRightKneel.png differ diff --git a/Models/KittyPawCuffs/LockThighRightKneelClosed.png b/Models/KittyPawCuffs/LockThighRightKneelClosed.png new file mode 100644 index 000000000..c1283cff9 Binary files /dev/null and b/Models/KittyPawCuffs/LockThighRightKneelClosed.png differ diff --git a/Models/KittyPawCuffs/LockThighRightSpread.png b/Models/KittyPawCuffs/LockThighRightSpread.png new file mode 100644 index 000000000..75c1bbbc4 Binary files /dev/null and b/Models/KittyPawCuffs/LockThighRightSpread.png differ diff --git a/Models/KittyPawCuffs/LockWristLeftFree.png b/Models/KittyPawCuffs/LockWristLeftFree.png new file mode 100644 index 000000000..25ce582bf Binary files /dev/null and b/Models/KittyPawCuffs/LockWristLeftFree.png differ diff --git a/Models/KittyPawCuffs/LockWristLeftFront.png b/Models/KittyPawCuffs/LockWristLeftFront.png new file mode 100644 index 000000000..fc47eab27 Binary files /dev/null and b/Models/KittyPawCuffs/LockWristLeftFront.png differ diff --git a/Models/KittyPawCuffs/LockWristLeftYoked.png b/Models/KittyPawCuffs/LockWristLeftYoked.png new file mode 100644 index 000000000..ee9accbf8 Binary files /dev/null and b/Models/KittyPawCuffs/LockWristLeftYoked.png differ diff --git a/Models/KittyPawCuffs/LockWristRightCrossed.png b/Models/KittyPawCuffs/LockWristRightCrossed.png new file mode 100644 index 000000000..e86a987a4 Binary files /dev/null and b/Models/KittyPawCuffs/LockWristRightCrossed.png differ diff --git a/Models/KittyPawCuffs/LockWristRightFree.png b/Models/KittyPawCuffs/LockWristRightFree.png new file mode 100644 index 000000000..e71932280 Binary files /dev/null and b/Models/KittyPawCuffs/LockWristRightFree.png differ diff --git a/Models/KittyPawCuffs/LockWristRightFront.png b/Models/KittyPawCuffs/LockWristRightFront.png new file mode 100644 index 000000000..0b44a0a39 Binary files /dev/null and b/Models/KittyPawCuffs/LockWristRightFront.png differ diff --git a/Models/KittyPawCuffs/LockWristRightYoked.png b/Models/KittyPawCuffs/LockWristRightYoked.png new file mode 100644 index 000000000..d27db1514 Binary files /dev/null and b/Models/KittyPawCuffs/LockWristRightYoked.png differ diff --git a/Models/KittyPawCuffs/ThighLeftClosed.png b/Models/KittyPawCuffs/ThighLeftClosed.png new file mode 100644 index 000000000..5f5c83a21 Binary files /dev/null and b/Models/KittyPawCuffs/ThighLeftClosed.png differ diff --git a/Models/KittyPawCuffs/ThighLeftKneel.png b/Models/KittyPawCuffs/ThighLeftKneel.png new file mode 100644 index 000000000..ee7aa7f99 Binary files /dev/null and b/Models/KittyPawCuffs/ThighLeftKneel.png differ diff --git a/Models/KittyPawCuffs/ThighLeftKneelClosed.png b/Models/KittyPawCuffs/ThighLeftKneelClosed.png new file mode 100644 index 000000000..15bd5d04b Binary files /dev/null and b/Models/KittyPawCuffs/ThighLeftKneelClosed.png differ diff --git a/Models/KittyPawCuffs/ThighLeftSpread.png b/Models/KittyPawCuffs/ThighLeftSpread.png new file mode 100644 index 000000000..db5174d9f Binary files /dev/null and b/Models/KittyPawCuffs/ThighLeftSpread.png differ diff --git a/Models/KittyPawCuffs/ThighRightClosed.png b/Models/KittyPawCuffs/ThighRightClosed.png new file mode 100644 index 000000000..7bb62dbe4 Binary files /dev/null and b/Models/KittyPawCuffs/ThighRightClosed.png differ diff --git a/Models/KittyPawCuffs/ThighRightKneel.png b/Models/KittyPawCuffs/ThighRightKneel.png new file mode 100644 index 000000000..e149a8adb Binary files /dev/null and b/Models/KittyPawCuffs/ThighRightKneel.png differ diff --git a/Models/KittyPawCuffs/ThighRightKneelClosed.png b/Models/KittyPawCuffs/ThighRightKneelClosed.png new file mode 100644 index 000000000..8955e3055 Binary files /dev/null and b/Models/KittyPawCuffs/ThighRightKneelClosed.png differ diff --git a/Models/KittyPawCuffs/ThighRightSpread.png b/Models/KittyPawCuffs/ThighRightSpread.png new file mode 100644 index 000000000..9dd732ecc Binary files /dev/null and b/Models/KittyPawCuffs/ThighRightSpread.png differ diff --git a/Models/KittyPawCuffs/WristLeftFree.png b/Models/KittyPawCuffs/WristLeftFree.png new file mode 100644 index 000000000..9fd017ac5 Binary files /dev/null and b/Models/KittyPawCuffs/WristLeftFree.png differ diff --git a/Models/KittyPawCuffs/WristLeftFront.png b/Models/KittyPawCuffs/WristLeftFront.png new file mode 100644 index 000000000..d66cc104f Binary files /dev/null and b/Models/KittyPawCuffs/WristLeftFront.png differ diff --git a/Models/KittyPawCuffs/WristLeftYoked.png b/Models/KittyPawCuffs/WristLeftYoked.png new file mode 100644 index 000000000..0b6c65a0c Binary files /dev/null and b/Models/KittyPawCuffs/WristLeftYoked.png differ diff --git a/Models/KittyPawCuffs/WristRightCrossed.png b/Models/KittyPawCuffs/WristRightCrossed.png new file mode 100644 index 000000000..8f7ef47dc Binary files /dev/null and b/Models/KittyPawCuffs/WristRightCrossed.png differ diff --git a/Models/KittyPawCuffs/WristRightFree.png b/Models/KittyPawCuffs/WristRightFree.png new file mode 100644 index 000000000..861226503 Binary files /dev/null and b/Models/KittyPawCuffs/WristRightFree.png differ diff --git a/Models/KittyPawCuffs/WristRightFront.png b/Models/KittyPawCuffs/WristRightFront.png new file mode 100644 index 000000000..a08bfbcf5 Binary files /dev/null and b/Models/KittyPawCuffs/WristRightFront.png differ diff --git a/Models/KittyPawCuffs/WristRightYoked.png b/Models/KittyPawCuffs/WristRightYoked.png new file mode 100644 index 000000000..8e8fa8f72 Binary files /dev/null and b/Models/KittyPawCuffs/WristRightYoked.png differ diff --git a/Models/KittyPet/Band.png b/Models/KittyPet/Band.png new file mode 100644 index 000000000..d292c89e0 Binary files /dev/null and b/Models/KittyPet/Band.png differ diff --git a/Models/KittyPet/Blindfold.png b/Models/KittyPet/Blindfold.png new file mode 100644 index 000000000..0d4133f2e Binary files /dev/null and b/Models/KittyPet/Blindfold.png differ diff --git a/Models/KittyPet/BlindfoldBrow.png b/Models/KittyPet/BlindfoldBrow.png new file mode 100644 index 000000000..fde9ba319 Binary files /dev/null and b/Models/KittyPet/BlindfoldBrow.png differ diff --git a/Models/KittyPet/BlindfoldRim.png b/Models/KittyPet/BlindfoldRim.png new file mode 100644 index 000000000..f96f84273 Binary files /dev/null and b/Models/KittyPet/BlindfoldRim.png differ diff --git a/Models/KittyPet/BlindfoldSmall.png b/Models/KittyPet/BlindfoldSmall.png new file mode 100644 index 000000000..863e00885 Binary files /dev/null and b/Models/KittyPet/BlindfoldSmall.png differ diff --git a/Models/KittyPet/BlindfoldSmallStrap.png b/Models/KittyPet/BlindfoldSmallStrap.png new file mode 100644 index 000000000..37edef569 Binary files /dev/null and b/Models/KittyPet/BlindfoldSmallStrap.png differ diff --git a/Models/KittyPet/BlindfoldStich.png b/Models/KittyPet/BlindfoldStich.png new file mode 100644 index 000000000..298064d49 Binary files /dev/null and b/Models/KittyPet/BlindfoldStich.png differ diff --git a/Models/KittyPet/BlindfoldStrap.png b/Models/KittyPet/BlindfoldStrap.png new file mode 100644 index 000000000..b8643eb71 Binary files /dev/null and b/Models/KittyPet/BlindfoldStrap.png differ diff --git a/Models/KittyPet/Collar.png b/Models/KittyPet/Collar.png new file mode 100644 index 000000000..e615887b1 Binary files /dev/null and b/Models/KittyPet/Collar.png differ diff --git a/Models/KittyPet/CollarDeco.png b/Models/KittyPet/CollarDeco.png new file mode 100644 index 000000000..3641544ff Binary files /dev/null and b/Models/KittyPet/CollarDeco.png differ diff --git a/Models/KittyPet/CollarDecoSymbol.png b/Models/KittyPet/CollarDecoSymbol.png new file mode 100644 index 000000000..ada662106 Binary files /dev/null and b/Models/KittyPet/CollarDecoSymbol.png differ diff --git a/Models/KittyPet/CollarStripe.png b/Models/KittyPet/CollarStripe.png new file mode 100644 index 000000000..b8a232bb7 Binary files /dev/null and b/Models/KittyPet/CollarStripe.png differ diff --git a/Models/KittyPet/EarmuffersL.png b/Models/KittyPet/EarmuffersL.png new file mode 100644 index 000000000..8e23bec89 Binary files /dev/null and b/Models/KittyPet/EarmuffersL.png differ diff --git a/Models/KittyPet/EarmuffersR.png b/Models/KittyPet/EarmuffersR.png new file mode 100644 index 000000000..b6342f7c4 Binary files /dev/null and b/Models/KittyPet/EarmuffersR.png differ diff --git a/Models/KittyPet/Ears1InnerL.png b/Models/KittyPet/Ears1InnerL.png new file mode 100644 index 000000000..7cf25628b Binary files /dev/null and b/Models/KittyPet/Ears1InnerL.png differ diff --git a/Models/KittyPet/Ears1InnerR.png b/Models/KittyPet/Ears1InnerR.png new file mode 100644 index 000000000..3640307c8 Binary files /dev/null and b/Models/KittyPet/Ears1InnerR.png differ diff --git a/Models/KittyPet/Ears1L.png b/Models/KittyPet/Ears1L.png new file mode 100644 index 000000000..cbfb0cc47 Binary files /dev/null and b/Models/KittyPet/Ears1L.png differ diff --git a/Models/KittyPet/Ears1R.png b/Models/KittyPet/Ears1R.png new file mode 100644 index 000000000..c520e0a63 Binary files /dev/null and b/Models/KittyPet/Ears1R.png differ diff --git a/Models/KittyPet/Ears2InnerL.png b/Models/KittyPet/Ears2InnerL.png new file mode 100644 index 000000000..b7847c900 Binary files /dev/null and b/Models/KittyPet/Ears2InnerL.png differ diff --git a/Models/KittyPet/Ears2InnerR.png b/Models/KittyPet/Ears2InnerR.png new file mode 100644 index 000000000..893edb0c1 Binary files /dev/null and b/Models/KittyPet/Ears2InnerR.png differ diff --git a/Models/KittyPet/Ears2L.png b/Models/KittyPet/Ears2L.png new file mode 100644 index 000000000..06c51bb3b Binary files /dev/null and b/Models/KittyPet/Ears2L.png differ diff --git a/Models/KittyPet/Ears2R.png b/Models/KittyPet/Ears2R.png new file mode 100644 index 000000000..a8d0b9e13 Binary files /dev/null and b/Models/KittyPet/Ears2R.png differ diff --git a/Models/KittyPet/Gag.png b/Models/KittyPet/Gag.png new file mode 100644 index 000000000..4b7a13aaa Binary files /dev/null and b/Models/KittyPet/Gag.png differ diff --git a/Models/KittyPet/GagCollar.png b/Models/KittyPet/GagCollar.png new file mode 100644 index 000000000..dfcecbf07 Binary files /dev/null and b/Models/KittyPet/GagCollar.png differ diff --git a/Models/KittyPet/GagMouth.png b/Models/KittyPet/GagMouth.png new file mode 100644 index 000000000..8eba2aa62 Binary files /dev/null and b/Models/KittyPet/GagMouth.png differ diff --git a/Models/KittyPet/GagMouthSeamless.png b/Models/KittyPet/GagMouthSeamless.png new file mode 100644 index 000000000..1b5b85010 Binary files /dev/null and b/Models/KittyPet/GagMouthSeamless.png differ diff --git a/Models/KittyPet/GagSeamless.png b/Models/KittyPet/GagSeamless.png new file mode 100644 index 000000000..94913677b Binary files /dev/null and b/Models/KittyPet/GagSeamless.png differ diff --git a/Models/KittyPet/HeadHarness.png b/Models/KittyPet/HeadHarness.png new file mode 100644 index 000000000..ea1f54bd5 Binary files /dev/null and b/Models/KittyPet/HeadHarness.png differ diff --git a/Models/KittyPet/HeadHarnessRing.png b/Models/KittyPet/HeadHarnessRing.png new file mode 100644 index 000000000..39a007d5f Binary files /dev/null and b/Models/KittyPet/HeadHarnessRing.png differ diff --git a/Models/KittyPet/Leotard.png b/Models/KittyPet/Leotard.png new file mode 100644 index 000000000..e8b9affd3 Binary files /dev/null and b/Models/KittyPet/Leotard.png differ diff --git a/Models/KittyPet/LeotardChest.png b/Models/KittyPet/LeotardChest.png new file mode 100644 index 000000000..4a469850e Binary files /dev/null and b/Models/KittyPet/LeotardChest.png differ diff --git a/Models/KittyPet/LeotardChestCollar.png b/Models/KittyPet/LeotardChestCollar.png new file mode 100644 index 000000000..ca910be48 Binary files /dev/null and b/Models/KittyPet/LeotardChestCollar.png differ diff --git a/Models/KittyPet/LeotardChestCollarLeft.png b/Models/KittyPet/LeotardChestCollarLeft.png new file mode 100644 index 000000000..9db4c0a0c Binary files /dev/null and b/Models/KittyPet/LeotardChestCollarLeft.png differ diff --git a/Models/KittyPet/LeotardChestCollarLeftTied.png b/Models/KittyPet/LeotardChestCollarLeftTied.png new file mode 100644 index 000000000..7de520788 Binary files /dev/null and b/Models/KittyPet/LeotardChestCollarLeftTied.png differ diff --git a/Models/KittyPet/LeotardChestCollarStripes.png b/Models/KittyPet/LeotardChestCollarStripes.png new file mode 100644 index 000000000..93b938c5a Binary files /dev/null and b/Models/KittyPet/LeotardChestCollarStripes.png differ diff --git a/Models/KittyPet/LeotardChestCollarStripesLeft.png b/Models/KittyPet/LeotardChestCollarStripesLeft.png new file mode 100644 index 000000000..559dcb323 Binary files /dev/null and b/Models/KittyPet/LeotardChestCollarStripesLeft.png differ diff --git a/Models/KittyPet/LeotardChestCollarStripesLeftTied.png b/Models/KittyPet/LeotardChestCollarStripesLeftTied.png new file mode 100644 index 000000000..9b40ba751 Binary files /dev/null and b/Models/KittyPet/LeotardChestCollarStripesLeftTied.png differ diff --git a/Models/KittyPet/LeotardChestCollarStripesUp.png b/Models/KittyPet/LeotardChestCollarStripesUp.png new file mode 100644 index 000000000..93b938c5a Binary files /dev/null and b/Models/KittyPet/LeotardChestCollarStripesUp.png differ diff --git a/Models/KittyPet/LeotardChestCollarUp.png b/Models/KittyPet/LeotardChestCollarUp.png new file mode 100644 index 000000000..986443254 Binary files /dev/null and b/Models/KittyPet/LeotardChestCollarUp.png differ diff --git a/Models/KittyPet/LeotardChestStripes.png b/Models/KittyPet/LeotardChestStripes.png new file mode 100644 index 000000000..5d9d880d4 Binary files /dev/null and b/Models/KittyPet/LeotardChestStripes.png differ diff --git a/Models/KittyPet/LeotardChestTied.png b/Models/KittyPet/LeotardChestTied.png new file mode 100644 index 000000000..56e2c5321 Binary files /dev/null and b/Models/KittyPet/LeotardChestTied.png differ diff --git a/Models/KittyPet/LeotardChestUp.png b/Models/KittyPet/LeotardChestUp.png new file mode 100644 index 000000000..07d57e8e3 Binary files /dev/null and b/Models/KittyPet/LeotardChestUp.png differ diff --git a/Models/KittyPet/LeotardClosed.png b/Models/KittyPet/LeotardClosed.png new file mode 100644 index 000000000..f324ba7b6 Binary files /dev/null and b/Models/KittyPet/LeotardClosed.png differ diff --git a/Models/KittyPet/LeotardStripes.png b/Models/KittyPet/LeotardStripes.png new file mode 100644 index 000000000..6a14258a0 Binary files /dev/null and b/Models/KittyPet/LeotardStripes.png differ diff --git a/Models/KittyPet/ShoulderCuffLeft.png b/Models/KittyPet/ShoulderCuffLeft.png new file mode 100644 index 000000000..8804eb096 Binary files /dev/null and b/Models/KittyPet/ShoulderCuffLeft.png differ diff --git a/Models/KittyPet/ShoulderCuffRight.png b/Models/KittyPet/ShoulderCuffRight.png new file mode 100644 index 000000000..7fc1dbd34 Binary files /dev/null and b/Models/KittyPet/ShoulderCuffRight.png differ diff --git a/Models/KittyPet/ShoulderCuffStripeLeft.png b/Models/KittyPet/ShoulderCuffStripeLeft.png new file mode 100644 index 000000000..f4a39fbdf Binary files /dev/null and b/Models/KittyPet/ShoulderCuffStripeLeft.png differ diff --git a/Models/KittyPet/ShoulderCuffStripeRight.png b/Models/KittyPet/ShoulderCuffStripeRight.png new file mode 100644 index 000000000..554e0054c Binary files /dev/null and b/Models/KittyPet/ShoulderCuffStripeRight.png differ diff --git a/Models/KittyPet/Tail.png b/Models/KittyPet/Tail.png new file mode 100644 index 000000000..1a048d785 Binary files /dev/null and b/Models/KittyPet/Tail.png differ diff --git a/Models/KittyPet/TailStripe.png b/Models/KittyPet/TailStripe.png new file mode 100644 index 000000000..9c2cfdb72 Binary files /dev/null and b/Models/KittyPet/TailStripe.png differ diff --git a/Models/KittyPetCuffs/AnkleLeftClosed.png b/Models/KittyPetCuffs/AnkleLeftClosed.png new file mode 100644 index 000000000..a4420c252 Binary files /dev/null and b/Models/KittyPetCuffs/AnkleLeftClosed.png differ diff --git a/Models/KittyPetCuffs/AnkleLeftKneel.png b/Models/KittyPetCuffs/AnkleLeftKneel.png new file mode 100644 index 000000000..b8387e025 Binary files /dev/null and b/Models/KittyPetCuffs/AnkleLeftKneel.png differ diff --git a/Models/KittyPetCuffs/AnkleLeftKneelClosed.png b/Models/KittyPetCuffs/AnkleLeftKneelClosed.png new file mode 100644 index 000000000..af0696934 Binary files /dev/null and b/Models/KittyPetCuffs/AnkleLeftKneelClosed.png differ diff --git a/Models/KittyPetCuffs/AnkleLeftSpread.png b/Models/KittyPetCuffs/AnkleLeftSpread.png new file mode 100644 index 000000000..05afd1eca Binary files /dev/null and b/Models/KittyPetCuffs/AnkleLeftSpread.png differ diff --git a/Models/KittyPetCuffs/AnkleRightClosed.png b/Models/KittyPetCuffs/AnkleRightClosed.png new file mode 100644 index 000000000..359059097 Binary files /dev/null and b/Models/KittyPetCuffs/AnkleRightClosed.png differ diff --git a/Models/KittyPetCuffs/AnkleRightSpread.png b/Models/KittyPetCuffs/AnkleRightSpread.png new file mode 100644 index 000000000..717f7d154 Binary files /dev/null and b/Models/KittyPetCuffs/AnkleRightSpread.png differ diff --git a/Models/KittyPetCuffs/BandAnkleLeftClosed.png b/Models/KittyPetCuffs/BandAnkleLeftClosed.png new file mode 100644 index 000000000..0e099af2c Binary files /dev/null and b/Models/KittyPetCuffs/BandAnkleLeftClosed.png differ diff --git a/Models/KittyPetCuffs/BandAnkleLeftKneel.png b/Models/KittyPetCuffs/BandAnkleLeftKneel.png new file mode 100644 index 000000000..8d8e1f116 Binary files /dev/null and b/Models/KittyPetCuffs/BandAnkleLeftKneel.png differ diff --git a/Models/KittyPetCuffs/BandAnkleLeftKneelClosed.png b/Models/KittyPetCuffs/BandAnkleLeftKneelClosed.png new file mode 100644 index 000000000..9c8be3b37 Binary files /dev/null and b/Models/KittyPetCuffs/BandAnkleLeftKneelClosed.png differ diff --git a/Models/KittyPetCuffs/BandAnkleLeftSpread.png b/Models/KittyPetCuffs/BandAnkleLeftSpread.png new file mode 100644 index 000000000..931a8cf7e Binary files /dev/null and b/Models/KittyPetCuffs/BandAnkleLeftSpread.png differ diff --git a/Models/KittyPetCuffs/BandAnkleRightClosed.png b/Models/KittyPetCuffs/BandAnkleRightClosed.png new file mode 100644 index 000000000..36c8f1859 Binary files /dev/null and b/Models/KittyPetCuffs/BandAnkleRightClosed.png differ diff --git a/Models/KittyPetCuffs/BandAnkleRightSpread.png b/Models/KittyPetCuffs/BandAnkleRightSpread.png new file mode 100644 index 000000000..87ec3690d Binary files /dev/null and b/Models/KittyPetCuffs/BandAnkleRightSpread.png differ diff --git a/Models/KittyPetCuffs/BandCollar.png b/Models/KittyPetCuffs/BandCollar.png new file mode 100644 index 000000000..9f18535c2 Binary files /dev/null and b/Models/KittyPetCuffs/BandCollar.png differ diff --git a/Models/KittyPetCuffs/BandElbowLeftBoxtie.png b/Models/KittyPetCuffs/BandElbowLeftBoxtie.png new file mode 100644 index 000000000..00835d176 Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowLeftBoxtie.png differ diff --git a/Models/KittyPetCuffs/BandElbowLeftFree.png b/Models/KittyPetCuffs/BandElbowLeftFree.png new file mode 100644 index 000000000..9dd7013cd Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowLeftFree.png differ diff --git a/Models/KittyPetCuffs/BandElbowLeftFront.png b/Models/KittyPetCuffs/BandElbowLeftFront.png new file mode 100644 index 000000000..9b550677a Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowLeftFront.png differ diff --git a/Models/KittyPetCuffs/BandElbowLeftUp.png b/Models/KittyPetCuffs/BandElbowLeftUp.png new file mode 100644 index 000000000..5fe2a1aba Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowLeftUp.png differ diff --git a/Models/KittyPetCuffs/BandElbowLeftWristtie.png b/Models/KittyPetCuffs/BandElbowLeftWristtie.png new file mode 100644 index 000000000..2296dc7ba Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowLeftWristtie.png differ diff --git a/Models/KittyPetCuffs/BandElbowLeftYoked.png b/Models/KittyPetCuffs/BandElbowLeftYoked.png new file mode 100644 index 000000000..883a91e4e Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowLeftYoked.png differ diff --git a/Models/KittyPetCuffs/BandElbowRightBoxtie.png b/Models/KittyPetCuffs/BandElbowRightBoxtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowRightBoxtie.png differ diff --git a/Models/KittyPetCuffs/BandElbowRightCrossed.png b/Models/KittyPetCuffs/BandElbowRightCrossed.png new file mode 100644 index 000000000..937880c8a Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowRightCrossed.png differ diff --git a/Models/KittyPetCuffs/BandElbowRightFront.png b/Models/KittyPetCuffs/BandElbowRightFront.png new file mode 100644 index 000000000..831e63191 Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowRightFront.png differ diff --git a/Models/KittyPetCuffs/BandElbowRightUp.png b/Models/KittyPetCuffs/BandElbowRightUp.png new file mode 100644 index 000000000..42b1d2a56 Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowRightUp.png differ diff --git a/Models/KittyPetCuffs/BandElbowRightWristtie.png b/Models/KittyPetCuffs/BandElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowRightWristtie.png differ diff --git a/Models/KittyPetCuffs/BandElbowRightYoked.png b/Models/KittyPetCuffs/BandElbowRightYoked.png new file mode 100644 index 000000000..b64d367a2 Binary files /dev/null and b/Models/KittyPetCuffs/BandElbowRightYoked.png differ diff --git a/Models/KittyPetCuffs/BandThighLeftClosed.png b/Models/KittyPetCuffs/BandThighLeftClosed.png new file mode 100644 index 000000000..2434181fa Binary files /dev/null and b/Models/KittyPetCuffs/BandThighLeftClosed.png differ diff --git a/Models/KittyPetCuffs/BandThighLeftKneel.png b/Models/KittyPetCuffs/BandThighLeftKneel.png new file mode 100644 index 000000000..2cc5fc261 Binary files /dev/null and b/Models/KittyPetCuffs/BandThighLeftKneel.png differ diff --git a/Models/KittyPetCuffs/BandThighLeftKneelClosed.png b/Models/KittyPetCuffs/BandThighLeftKneelClosed.png new file mode 100644 index 000000000..03fcd5308 Binary files /dev/null and b/Models/KittyPetCuffs/BandThighLeftKneelClosed.png differ diff --git a/Models/KittyPetCuffs/BandThighLeftSpread.png b/Models/KittyPetCuffs/BandThighLeftSpread.png new file mode 100644 index 000000000..419aebe4b Binary files /dev/null and b/Models/KittyPetCuffs/BandThighLeftSpread.png differ diff --git a/Models/KittyPetCuffs/BandThighRightClosed.png b/Models/KittyPetCuffs/BandThighRightClosed.png new file mode 100644 index 000000000..74752b4a4 Binary files /dev/null and b/Models/KittyPetCuffs/BandThighRightClosed.png differ diff --git a/Models/KittyPetCuffs/BandThighRightKneel.png b/Models/KittyPetCuffs/BandThighRightKneel.png new file mode 100644 index 000000000..e8c9f19e5 Binary files /dev/null and b/Models/KittyPetCuffs/BandThighRightKneel.png differ diff --git a/Models/KittyPetCuffs/BandThighRightKneelClosed.png b/Models/KittyPetCuffs/BandThighRightKneelClosed.png new file mode 100644 index 000000000..e8c9f19e5 Binary files /dev/null and b/Models/KittyPetCuffs/BandThighRightKneelClosed.png differ diff --git a/Models/KittyPetCuffs/BandThighRightSpread.png b/Models/KittyPetCuffs/BandThighRightSpread.png new file mode 100644 index 000000000..a811326f1 Binary files /dev/null and b/Models/KittyPetCuffs/BandThighRightSpread.png differ diff --git a/Models/KittyPetCuffs/BandWristLeftFree.png b/Models/KittyPetCuffs/BandWristLeftFree.png new file mode 100644 index 000000000..e7184f612 Binary files /dev/null and b/Models/KittyPetCuffs/BandWristLeftFree.png differ diff --git a/Models/KittyPetCuffs/BandWristLeftFront.png b/Models/KittyPetCuffs/BandWristLeftFront.png new file mode 100644 index 000000000..d903c0c22 Binary files /dev/null and b/Models/KittyPetCuffs/BandWristLeftFront.png differ diff --git a/Models/KittyPetCuffs/BandWristLeftYoked.png b/Models/KittyPetCuffs/BandWristLeftYoked.png new file mode 100644 index 000000000..7c3789828 Binary files /dev/null and b/Models/KittyPetCuffs/BandWristLeftYoked.png differ diff --git a/Models/KittyPetCuffs/BandWristRightCrossed.png b/Models/KittyPetCuffs/BandWristRightCrossed.png new file mode 100644 index 000000000..608bb9068 Binary files /dev/null and b/Models/KittyPetCuffs/BandWristRightCrossed.png differ diff --git a/Models/KittyPetCuffs/BandWristRightFree.png b/Models/KittyPetCuffs/BandWristRightFree.png new file mode 100644 index 000000000..4dbd5ede2 Binary files /dev/null and b/Models/KittyPetCuffs/BandWristRightFree.png differ diff --git a/Models/KittyPetCuffs/BandWristRightFront.png b/Models/KittyPetCuffs/BandWristRightFront.png new file mode 100644 index 000000000..a47702922 Binary files /dev/null and b/Models/KittyPetCuffs/BandWristRightFront.png differ diff --git a/Models/KittyPetCuffs/BandWristRightYoked.png b/Models/KittyPetCuffs/BandWristRightYoked.png new file mode 100644 index 000000000..97d6b1814 Binary files /dev/null and b/Models/KittyPetCuffs/BandWristRightYoked.png differ diff --git a/Models/KittyPetCuffs/Collar.png b/Models/KittyPetCuffs/Collar.png new file mode 100644 index 000000000..af1b218b5 Binary files /dev/null and b/Models/KittyPetCuffs/Collar.png differ diff --git a/Models/KittyPetCuffs/ElbowLeftBoxtie.png b/Models/KittyPetCuffs/ElbowLeftBoxtie.png new file mode 100644 index 000000000..2da1f934b Binary files /dev/null and b/Models/KittyPetCuffs/ElbowLeftBoxtie.png differ diff --git a/Models/KittyPetCuffs/ElbowLeftCrossed.png b/Models/KittyPetCuffs/ElbowLeftCrossed.png new file mode 100644 index 000000000..7c46e3a77 Binary files /dev/null and b/Models/KittyPetCuffs/ElbowLeftCrossed.png differ diff --git a/Models/KittyPetCuffs/ElbowLeftFree.png b/Models/KittyPetCuffs/ElbowLeftFree.png new file mode 100644 index 000000000..dba57c251 Binary files /dev/null and b/Models/KittyPetCuffs/ElbowLeftFree.png differ diff --git a/Models/KittyPetCuffs/ElbowLeftFront.png b/Models/KittyPetCuffs/ElbowLeftFront.png new file mode 100644 index 000000000..68563ce60 Binary files /dev/null and b/Models/KittyPetCuffs/ElbowLeftFront.png differ diff --git a/Models/KittyPetCuffs/ElbowLeftUp.png b/Models/KittyPetCuffs/ElbowLeftUp.png new file mode 100644 index 000000000..eb24f3aa4 Binary files /dev/null and b/Models/KittyPetCuffs/ElbowLeftUp.png differ diff --git a/Models/KittyPetCuffs/ElbowLeftWristtie.png b/Models/KittyPetCuffs/ElbowLeftWristtie.png new file mode 100644 index 000000000..676ee3ebc Binary files /dev/null and b/Models/KittyPetCuffs/ElbowLeftWristtie.png differ diff --git a/Models/KittyPetCuffs/ElbowLeftYoked.png b/Models/KittyPetCuffs/ElbowLeftYoked.png new file mode 100644 index 000000000..9cf704c31 Binary files /dev/null and b/Models/KittyPetCuffs/ElbowLeftYoked.png differ diff --git a/Models/KittyPetCuffs/ElbowRightBoxtie.png b/Models/KittyPetCuffs/ElbowRightBoxtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPetCuffs/ElbowRightBoxtie.png differ diff --git a/Models/KittyPetCuffs/ElbowRightCrossed.png b/Models/KittyPetCuffs/ElbowRightCrossed.png new file mode 100644 index 000000000..e499672ed Binary files /dev/null and b/Models/KittyPetCuffs/ElbowRightCrossed.png differ diff --git a/Models/KittyPetCuffs/ElbowRightFront.png b/Models/KittyPetCuffs/ElbowRightFront.png new file mode 100644 index 000000000..a20eae65d Binary files /dev/null and b/Models/KittyPetCuffs/ElbowRightFront.png differ diff --git a/Models/KittyPetCuffs/ElbowRightUp.png b/Models/KittyPetCuffs/ElbowRightUp.png new file mode 100644 index 000000000..82d63d07c Binary files /dev/null and b/Models/KittyPetCuffs/ElbowRightUp.png differ diff --git a/Models/KittyPetCuffs/ElbowRightWristtie.png b/Models/KittyPetCuffs/ElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPetCuffs/ElbowRightWristtie.png differ diff --git a/Models/KittyPetCuffs/ElbowRightYoked.png b/Models/KittyPetCuffs/ElbowRightYoked.png new file mode 100644 index 000000000..737f9b0d4 Binary files /dev/null and b/Models/KittyPetCuffs/ElbowRightYoked.png differ diff --git a/Models/KittyPetCuffs/ThighLeftClosed.png b/Models/KittyPetCuffs/ThighLeftClosed.png new file mode 100644 index 000000000..7ab91e940 Binary files /dev/null and b/Models/KittyPetCuffs/ThighLeftClosed.png differ diff --git a/Models/KittyPetCuffs/ThighLeftKneel.png b/Models/KittyPetCuffs/ThighLeftKneel.png new file mode 100644 index 000000000..04e679ffd Binary files /dev/null and b/Models/KittyPetCuffs/ThighLeftKneel.png differ diff --git a/Models/KittyPetCuffs/ThighLeftKneelClosed.png b/Models/KittyPetCuffs/ThighLeftKneelClosed.png new file mode 100644 index 000000000..46dad382a Binary files /dev/null and b/Models/KittyPetCuffs/ThighLeftKneelClosed.png differ diff --git a/Models/KittyPetCuffs/ThighLeftSpread.png b/Models/KittyPetCuffs/ThighLeftSpread.png new file mode 100644 index 000000000..6a72845b0 Binary files /dev/null and b/Models/KittyPetCuffs/ThighLeftSpread.png differ diff --git a/Models/KittyPetCuffs/ThighRightClosed.png b/Models/KittyPetCuffs/ThighRightClosed.png new file mode 100644 index 000000000..20f86dc02 Binary files /dev/null and b/Models/KittyPetCuffs/ThighRightClosed.png differ diff --git a/Models/KittyPetCuffs/ThighRightKneel.png b/Models/KittyPetCuffs/ThighRightKneel.png new file mode 100644 index 000000000..d51b1fe8b Binary files /dev/null and b/Models/KittyPetCuffs/ThighRightKneel.png differ diff --git a/Models/KittyPetCuffs/ThighRightKneelClosed.png b/Models/KittyPetCuffs/ThighRightKneelClosed.png new file mode 100644 index 000000000..37bc1a1c6 Binary files /dev/null and b/Models/KittyPetCuffs/ThighRightKneelClosed.png differ diff --git a/Models/KittyPetCuffs/ThighRightSpread.png b/Models/KittyPetCuffs/ThighRightSpread.png new file mode 100644 index 000000000..6c7d5ad99 Binary files /dev/null and b/Models/KittyPetCuffs/ThighRightSpread.png differ diff --git a/Models/KittyPetCuffs/WristLeftFree.png b/Models/KittyPetCuffs/WristLeftFree.png new file mode 100644 index 000000000..017949248 Binary files /dev/null and b/Models/KittyPetCuffs/WristLeftFree.png differ diff --git a/Models/KittyPetCuffs/WristLeftFront.png b/Models/KittyPetCuffs/WristLeftFront.png new file mode 100644 index 000000000..33399ef7c Binary files /dev/null and b/Models/KittyPetCuffs/WristLeftFront.png differ diff --git a/Models/KittyPetCuffs/WristLeftYoked.png b/Models/KittyPetCuffs/WristLeftYoked.png new file mode 100644 index 000000000..7c3fd235e Binary files /dev/null and b/Models/KittyPetCuffs/WristLeftYoked.png differ diff --git a/Models/KittyPetCuffs/WristRightCrossed.png b/Models/KittyPetCuffs/WristRightCrossed.png new file mode 100644 index 000000000..e6e43669c Binary files /dev/null and b/Models/KittyPetCuffs/WristRightCrossed.png differ diff --git a/Models/KittyPetCuffs/WristRightFree.png b/Models/KittyPetCuffs/WristRightFree.png new file mode 100644 index 000000000..678a997c9 Binary files /dev/null and b/Models/KittyPetCuffs/WristRightFree.png differ diff --git a/Models/KittyPetCuffs/WristRightFront.png b/Models/KittyPetCuffs/WristRightFront.png new file mode 100644 index 000000000..a5d0ef489 Binary files /dev/null and b/Models/KittyPetCuffs/WristRightFront.png differ diff --git a/Models/KittyPetCuffs/WristRightYoked.png b/Models/KittyPetCuffs/WristRightYoked.png new file mode 100644 index 000000000..c1517324b Binary files /dev/null and b/Models/KittyPetCuffs/WristRightYoked.png differ diff --git a/Models/KittyPetPaws/FootLeftHogtie.png b/Models/KittyPetPaws/FootLeftHogtie.png new file mode 100644 index 000000000..f422487ef Binary files /dev/null and b/Models/KittyPetPaws/FootLeftHogtie.png differ diff --git a/Models/KittyPetPaws/FootLeftHogtiePaws.png b/Models/KittyPetPaws/FootLeftHogtiePaws.png new file mode 100644 index 000000000..f8eee8b95 Binary files /dev/null and b/Models/KittyPetPaws/FootLeftHogtiePaws.png differ diff --git a/Models/KittyPetPaws/FootRightKneel.png b/Models/KittyPetPaws/FootRightKneel.png new file mode 100644 index 000000000..1392fc9d9 Binary files /dev/null and b/Models/KittyPetPaws/FootRightKneel.png differ diff --git a/Models/KittyPetPaws/ForeGloveLeftCrossed.png b/Models/KittyPetPaws/ForeGloveLeftCrossed.png new file mode 100644 index 000000000..93c1497f2 Binary files /dev/null and b/Models/KittyPetPaws/ForeGloveLeftCrossed.png differ diff --git a/Models/KittyPetPaws/ForeGloveLeftFront.png b/Models/KittyPetPaws/ForeGloveLeftFront.png new file mode 100644 index 000000000..9f5ed1646 Binary files /dev/null and b/Models/KittyPetPaws/ForeGloveLeftFront.png differ diff --git a/Models/KittyPetPaws/ForeGloveLeftPawFront.png b/Models/KittyPetPaws/ForeGloveLeftPawFront.png new file mode 100644 index 000000000..c7a96b1d1 Binary files /dev/null and b/Models/KittyPetPaws/ForeGloveLeftPawFront.png differ diff --git a/Models/KittyPetPaws/ForeGloveRightCrossed.png b/Models/KittyPetPaws/ForeGloveRightCrossed.png new file mode 100644 index 000000000..fea6eb32d Binary files /dev/null and b/Models/KittyPetPaws/ForeGloveRightCrossed.png differ diff --git a/Models/KittyPetPaws/ForeGloveRightFront.png b/Models/KittyPetPaws/ForeGloveRightFront.png new file mode 100644 index 000000000..9b4a97a3d Binary files /dev/null and b/Models/KittyPetPaws/ForeGloveRightFront.png differ diff --git a/Models/KittyPetPaws/ForeGloveRightPawFront.png b/Models/KittyPetPaws/ForeGloveRightPawFront.png new file mode 100644 index 000000000..05bd6a7e2 Binary files /dev/null and b/Models/KittyPetPaws/ForeGloveRightPawFront.png differ diff --git a/Models/KittyPetPaws/GloveLeftBoxtie.png b/Models/KittyPetPaws/GloveLeftBoxtie.png new file mode 100644 index 000000000..a225c3b2f Binary files /dev/null and b/Models/KittyPetPaws/GloveLeftBoxtie.png differ diff --git a/Models/KittyPetPaws/GloveLeftCrossed.png b/Models/KittyPetPaws/GloveLeftCrossed.png new file mode 100644 index 000000000..0bf9bc9dc Binary files /dev/null and b/Models/KittyPetPaws/GloveLeftCrossed.png differ diff --git a/Models/KittyPetPaws/GloveLeftFree.png b/Models/KittyPetPaws/GloveLeftFree.png new file mode 100644 index 000000000..0843f1060 Binary files /dev/null and b/Models/KittyPetPaws/GloveLeftFree.png differ diff --git a/Models/KittyPetPaws/GloveLeftFront.png b/Models/KittyPetPaws/GloveLeftFront.png new file mode 100644 index 000000000..9973a20e3 Binary files /dev/null and b/Models/KittyPetPaws/GloveLeftFront.png differ diff --git a/Models/KittyPetPaws/GloveLeftPawYoked.png b/Models/KittyPetPaws/GloveLeftPawYoked.png new file mode 100644 index 000000000..07a078b2b Binary files /dev/null and b/Models/KittyPetPaws/GloveLeftPawYoked.png differ diff --git a/Models/KittyPetPaws/GloveLeftUp.png b/Models/KittyPetPaws/GloveLeftUp.png new file mode 100644 index 000000000..d4e21bd2d Binary files /dev/null and b/Models/KittyPetPaws/GloveLeftUp.png differ diff --git a/Models/KittyPetPaws/GloveLeftWristtie.png b/Models/KittyPetPaws/GloveLeftWristtie.png new file mode 100644 index 000000000..4d0c9b57e Binary files /dev/null and b/Models/KittyPetPaws/GloveLeftWristtie.png differ diff --git a/Models/KittyPetPaws/GloveLeftYoked.png b/Models/KittyPetPaws/GloveLeftYoked.png new file mode 100644 index 000000000..6e91c7377 Binary files /dev/null and b/Models/KittyPetPaws/GloveLeftYoked.png differ diff --git a/Models/KittyPetPaws/GloveRightBoxtie.png b/Models/KittyPetPaws/GloveRightBoxtie.png new file mode 100644 index 000000000..e8c6ba118 Binary files /dev/null and b/Models/KittyPetPaws/GloveRightBoxtie.png differ diff --git a/Models/KittyPetPaws/GloveRightCrossed.png b/Models/KittyPetPaws/GloveRightCrossed.png new file mode 100644 index 000000000..18b94710e Binary files /dev/null and b/Models/KittyPetPaws/GloveRightCrossed.png differ diff --git a/Models/KittyPetPaws/GloveRightFree.png b/Models/KittyPetPaws/GloveRightFree.png new file mode 100644 index 000000000..2e5d972d2 Binary files /dev/null and b/Models/KittyPetPaws/GloveRightFree.png differ diff --git a/Models/KittyPetPaws/GloveRightFront.png b/Models/KittyPetPaws/GloveRightFront.png new file mode 100644 index 000000000..5cfe26eeb Binary files /dev/null and b/Models/KittyPetPaws/GloveRightFront.png differ diff --git a/Models/KittyPetPaws/GloveRightPawFree.png b/Models/KittyPetPaws/GloveRightPawFree.png new file mode 100644 index 000000000..3df26345e Binary files /dev/null and b/Models/KittyPetPaws/GloveRightPawFree.png differ diff --git a/Models/KittyPetPaws/GloveRightPawYoked.png b/Models/KittyPetPaws/GloveRightPawYoked.png new file mode 100644 index 000000000..12f668532 Binary files /dev/null and b/Models/KittyPetPaws/GloveRightPawYoked.png differ diff --git a/Models/KittyPetPaws/GloveRightUp.png b/Models/KittyPetPaws/GloveRightUp.png new file mode 100644 index 000000000..dafca1972 Binary files /dev/null and b/Models/KittyPetPaws/GloveRightUp.png differ diff --git a/Models/KittyPetPaws/GloveRightWristtie.png b/Models/KittyPetPaws/GloveRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/KittyPetPaws/GloveRightWristtie.png differ diff --git a/Models/KittyPetPaws/GloveRightYoked.png b/Models/KittyPetPaws/GloveRightYoked.png new file mode 100644 index 000000000..97f0f5d23 Binary files /dev/null and b/Models/KittyPetPaws/GloveRightYoked.png differ diff --git a/Models/KittyPetPaws/SockLeftClosed.png b/Models/KittyPetPaws/SockLeftClosed.png new file mode 100644 index 000000000..846e66a3a Binary files /dev/null and b/Models/KittyPetPaws/SockLeftClosed.png differ diff --git a/Models/KittyPetPaws/SockLeftHogtie.png b/Models/KittyPetPaws/SockLeftHogtie.png new file mode 100644 index 000000000..f229db3ed Binary files /dev/null and b/Models/KittyPetPaws/SockLeftHogtie.png differ diff --git a/Models/KittyPetPaws/SockLeftKneel.png b/Models/KittyPetPaws/SockLeftKneel.png new file mode 100644 index 000000000..275786fa7 Binary files /dev/null and b/Models/KittyPetPaws/SockLeftKneel.png differ diff --git a/Models/KittyPetPaws/SockLeftKneel.png.png b/Models/KittyPetPaws/SockLeftKneel.png.png new file mode 100644 index 000000000..7de7765e7 Binary files /dev/null and b/Models/KittyPetPaws/SockLeftKneel.png.png differ diff --git a/Models/KittyPetPaws/SockLeftKneelClosed.png b/Models/KittyPetPaws/SockLeftKneelClosed.png new file mode 100644 index 000000000..0a44780d2 Binary files /dev/null and b/Models/KittyPetPaws/SockLeftKneelClosed.png differ diff --git a/Models/KittyPetPaws/SockLeftPawsKneel.png b/Models/KittyPetPaws/SockLeftPawsKneel.png new file mode 100644 index 000000000..20303eee6 Binary files /dev/null and b/Models/KittyPetPaws/SockLeftPawsKneel.png differ diff --git a/Models/KittyPetPaws/SockLeftPawsKneelClosed.png b/Models/KittyPetPaws/SockLeftPawsKneelClosed.png new file mode 100644 index 000000000..9eb39310b Binary files /dev/null and b/Models/KittyPetPaws/SockLeftPawsKneelClosed.png differ diff --git a/Models/KittyPetPaws/SockLeftSpread.png b/Models/KittyPetPaws/SockLeftSpread.png new file mode 100644 index 000000000..0ceea9e4f Binary files /dev/null and b/Models/KittyPetPaws/SockLeftSpread.png differ diff --git a/Models/KittyPetPaws/SockRightClosed.png b/Models/KittyPetPaws/SockRightClosed.png new file mode 100644 index 000000000..bdb1bdd6f Binary files /dev/null and b/Models/KittyPetPaws/SockRightClosed.png differ diff --git a/Models/KittyPetPaws/SockRightHogtie.png b/Models/KittyPetPaws/SockRightHogtie.png new file mode 100644 index 000000000..82de4603b Binary files /dev/null and b/Models/KittyPetPaws/SockRightHogtie.png differ diff --git a/Models/KittyPetPaws/SockRightKneel.png b/Models/KittyPetPaws/SockRightKneel.png new file mode 100644 index 000000000..51ab6662f Binary files /dev/null and b/Models/KittyPetPaws/SockRightKneel.png differ diff --git a/Models/KittyPetPaws/SockRightKneelClosed.png b/Models/KittyPetPaws/SockRightKneelClosed.png new file mode 100644 index 000000000..54b27265e Binary files /dev/null and b/Models/KittyPetPaws/SockRightKneelClosed.png differ diff --git a/Models/KittyPetPaws/SockRightSpread.png b/Models/KittyPetPaws/SockRightSpread.png new file mode 100644 index 000000000..5dfefc7db Binary files /dev/null and b/Models/KittyPetPaws/SockRightSpread.png differ diff --git a/Models/KittyPetPawsShort/FootLeftHogtie.png b/Models/KittyPetPawsShort/FootLeftHogtie.png new file mode 100644 index 000000000..e5d64136e Binary files /dev/null and b/Models/KittyPetPawsShort/FootLeftHogtie.png differ diff --git a/Models/KittyPetPawsShort/FootLeftHogtiePaws.png b/Models/KittyPetPawsShort/FootLeftHogtiePaws.png new file mode 100644 index 000000000..f8eee8b95 Binary files /dev/null and b/Models/KittyPetPawsShort/FootLeftHogtiePaws.png differ diff --git a/Models/KittyPetPawsShort/FootRightKneel.png b/Models/KittyPetPawsShort/FootRightKneel.png new file mode 100644 index 000000000..b434b03ca Binary files /dev/null and b/Models/KittyPetPawsShort/FootRightKneel.png differ diff --git a/Models/KittyPetPawsShort/SockLeftClosed.png b/Models/KittyPetPawsShort/SockLeftClosed.png new file mode 100644 index 000000000..8318733f4 Binary files /dev/null and b/Models/KittyPetPawsShort/SockLeftClosed.png differ diff --git a/Models/KittyPetPawsShort/SockLeftHogtie.png b/Models/KittyPetPawsShort/SockLeftHogtie.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/KittyPetPawsShort/SockLeftHogtie.png differ diff --git a/Models/KittyPetPawsShort/SockLeftKneel.png b/Models/KittyPetPawsShort/SockLeftKneel.png new file mode 100644 index 000000000..9c397c398 Binary files /dev/null and b/Models/KittyPetPawsShort/SockLeftKneel.png differ diff --git a/Models/KittyPetPawsShort/SockLeftKneelClosed.png b/Models/KittyPetPawsShort/SockLeftKneelClosed.png new file mode 100644 index 000000000..0a4f618ac Binary files /dev/null and b/Models/KittyPetPawsShort/SockLeftKneelClosed.png differ diff --git a/Models/KittyPetPawsShort/SockLeftPawsKneel.png b/Models/KittyPetPawsShort/SockLeftPawsKneel.png new file mode 100644 index 000000000..d91a34022 Binary files /dev/null and b/Models/KittyPetPawsShort/SockLeftPawsKneel.png differ diff --git a/Models/KittyPetPawsShort/SockLeftPawsKneelClosed.png b/Models/KittyPetPawsShort/SockLeftPawsKneelClosed.png new file mode 100644 index 000000000..9eb39310b Binary files /dev/null and b/Models/KittyPetPawsShort/SockLeftPawsKneelClosed.png differ diff --git a/Models/KittyPetPawsShort/SockLeftSpread.png b/Models/KittyPetPawsShort/SockLeftSpread.png new file mode 100644 index 000000000..1b925f197 Binary files /dev/null and b/Models/KittyPetPawsShort/SockLeftSpread.png differ diff --git a/Models/KittyPetPawsShort/SockRightClosed.png b/Models/KittyPetPawsShort/SockRightClosed.png new file mode 100644 index 000000000..88de9b98f Binary files /dev/null and b/Models/KittyPetPawsShort/SockRightClosed.png differ diff --git a/Models/KittyPetPawsShort/SockRightHogtie.png b/Models/KittyPetPawsShort/SockRightHogtie.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/KittyPetPawsShort/SockRightHogtie.png differ diff --git a/Models/KittyPetPawsShort/SockRightKneel.png b/Models/KittyPetPawsShort/SockRightKneel.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/KittyPetPawsShort/SockRightKneel.png differ diff --git a/Models/KittyPetPawsShort/SockRightKneelClosed.png b/Models/KittyPetPawsShort/SockRightKneelClosed.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/KittyPetPawsShort/SockRightKneelClosed.png differ diff --git a/Models/KittyPetPawsShort/SockRightSpread.png b/Models/KittyPetPawsShort/SockRightSpread.png new file mode 100644 index 000000000..ac0ac2bfc Binary files /dev/null and b/Models/KittyPetPawsShort/SockRightSpread.png differ diff --git a/Models/KittyPetSocks/FootLeftHogtie.png b/Models/KittyPetSocks/FootLeftHogtie.png new file mode 100644 index 000000000..e5d64136e Binary files /dev/null and b/Models/KittyPetSocks/FootLeftHogtie.png differ diff --git a/Models/KittyPetSocks/FootLeftHogtiePaws.png b/Models/KittyPetSocks/FootLeftHogtiePaws.png new file mode 100644 index 000000000..f8eee8b95 Binary files /dev/null and b/Models/KittyPetSocks/FootLeftHogtiePaws.png differ diff --git a/Models/KittyPetSocks/FootRightKneel.png b/Models/KittyPetSocks/FootRightKneel.png new file mode 100644 index 000000000..b434b03ca Binary files /dev/null and b/Models/KittyPetSocks/FootRightKneel.png differ diff --git a/Models/KittyPetSocks/SockLeftClosed.png b/Models/KittyPetSocks/SockLeftClosed.png new file mode 100644 index 000000000..6559c5542 Binary files /dev/null and b/Models/KittyPetSocks/SockLeftClosed.png differ diff --git a/Models/KittyPetSocks/SockLeftHogtie.png b/Models/KittyPetSocks/SockLeftHogtie.png new file mode 100644 index 000000000..f229db3ed Binary files /dev/null and b/Models/KittyPetSocks/SockLeftHogtie.png differ diff --git a/Models/KittyPetSocks/SockLeftKneel.png b/Models/KittyPetSocks/SockLeftKneel.png new file mode 100644 index 000000000..8b3c98d60 Binary files /dev/null and b/Models/KittyPetSocks/SockLeftKneel.png differ diff --git a/Models/KittyPetSocks/SockLeftKneelClosed.png b/Models/KittyPetSocks/SockLeftKneelClosed.png new file mode 100644 index 000000000..221d2a158 Binary files /dev/null and b/Models/KittyPetSocks/SockLeftKneelClosed.png differ diff --git a/Models/KittyPetSocks/SockLeftPawsKneel.png b/Models/KittyPetSocks/SockLeftPawsKneel.png new file mode 100644 index 000000000..d91a34022 Binary files /dev/null and b/Models/KittyPetSocks/SockLeftPawsKneel.png differ diff --git a/Models/KittyPetSocks/SockLeftPawsKneelClosed.png b/Models/KittyPetSocks/SockLeftPawsKneelClosed.png new file mode 100644 index 000000000..9eb39310b Binary files /dev/null and b/Models/KittyPetSocks/SockLeftPawsKneelClosed.png differ diff --git a/Models/KittyPetSocks/SockLeftSpread.png b/Models/KittyPetSocks/SockLeftSpread.png new file mode 100644 index 000000000..3d081e935 Binary files /dev/null and b/Models/KittyPetSocks/SockLeftSpread.png differ diff --git a/Models/KittyPetSocks/SockRightClosed.png b/Models/KittyPetSocks/SockRightClosed.png new file mode 100644 index 000000000..ba77270bb Binary files /dev/null and b/Models/KittyPetSocks/SockRightClosed.png differ diff --git a/Models/KittyPetSocks/SockRightHogtie.png b/Models/KittyPetSocks/SockRightHogtie.png new file mode 100644 index 000000000..82de4603b Binary files /dev/null and b/Models/KittyPetSocks/SockRightHogtie.png differ diff --git a/Models/KittyPetSocks/SockRightKneel.png b/Models/KittyPetSocks/SockRightKneel.png new file mode 100644 index 000000000..5464ed585 Binary files /dev/null and b/Models/KittyPetSocks/SockRightKneel.png differ diff --git a/Models/KittyPetSocks/SockRightKneelClosed.png b/Models/KittyPetSocks/SockRightKneelClosed.png new file mode 100644 index 000000000..da896b247 Binary files /dev/null and b/Models/KittyPetSocks/SockRightKneelClosed.png differ diff --git a/Models/KittyPetSocks/SockRightSpread.png b/Models/KittyPetSocks/SockRightSpread.png new file mode 100644 index 000000000..719c0b392 Binary files /dev/null and b/Models/KittyPetSocks/SockRightSpread.png differ diff --git a/Models/KittyPetSocksShort/FootLeftHogtie.png b/Models/KittyPetSocksShort/FootLeftHogtie.png new file mode 100644 index 000000000..e5d64136e Binary files /dev/null and b/Models/KittyPetSocksShort/FootLeftHogtie.png differ diff --git a/Models/KittyPetSocksShort/FootLeftHogtiePaws.png b/Models/KittyPetSocksShort/FootLeftHogtiePaws.png new file mode 100644 index 000000000..f8eee8b95 Binary files /dev/null and b/Models/KittyPetSocksShort/FootLeftHogtiePaws.png differ diff --git a/Models/KittyPetSocksShort/FootRightKneel.png b/Models/KittyPetSocksShort/FootRightKneel.png new file mode 100644 index 000000000..b434b03ca Binary files /dev/null and b/Models/KittyPetSocksShort/FootRightKneel.png differ diff --git a/Models/KittyPetSocksShort/SockLeftClosed.png b/Models/KittyPetSocksShort/SockLeftClosed.png new file mode 100644 index 000000000..bdcc147d9 Binary files /dev/null and b/Models/KittyPetSocksShort/SockLeftClosed.png differ diff --git a/Models/KittyPetSocksShort/SockLeftHogtie.png b/Models/KittyPetSocksShort/SockLeftHogtie.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/KittyPetSocksShort/SockLeftHogtie.png differ diff --git a/Models/KittyPetSocksShort/SockLeftKneel.png b/Models/KittyPetSocksShort/SockLeftKneel.png new file mode 100644 index 000000000..ad839e26b Binary files /dev/null and b/Models/KittyPetSocksShort/SockLeftKneel.png differ diff --git a/Models/KittyPetSocksShort/SockLeftKneelClosed.png b/Models/KittyPetSocksShort/SockLeftKneelClosed.png new file mode 100644 index 000000000..ef92bf5e4 Binary files /dev/null and b/Models/KittyPetSocksShort/SockLeftKneelClosed.png differ diff --git a/Models/KittyPetSocksShort/SockLeftPawsKneel.png b/Models/KittyPetSocksShort/SockLeftPawsKneel.png new file mode 100644 index 000000000..d91a34022 Binary files /dev/null and b/Models/KittyPetSocksShort/SockLeftPawsKneel.png differ diff --git a/Models/KittyPetSocksShort/SockLeftPawsKneelClosed.png b/Models/KittyPetSocksShort/SockLeftPawsKneelClosed.png new file mode 100644 index 000000000..9eb39310b Binary files /dev/null and b/Models/KittyPetSocksShort/SockLeftPawsKneelClosed.png differ diff --git a/Models/KittyPetSocksShort/SockLeftSpread.png b/Models/KittyPetSocksShort/SockLeftSpread.png new file mode 100644 index 000000000..4a6042eb4 Binary files /dev/null and b/Models/KittyPetSocksShort/SockLeftSpread.png differ diff --git a/Models/KittyPetSocksShort/SockRightClosed.png b/Models/KittyPetSocksShort/SockRightClosed.png new file mode 100644 index 000000000..17e9c70fc Binary files /dev/null and b/Models/KittyPetSocksShort/SockRightClosed.png differ diff --git a/Models/KittyPetSocksShort/SockRightHogtie.png b/Models/KittyPetSocksShort/SockRightHogtie.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/KittyPetSocksShort/SockRightHogtie.png differ diff --git a/Models/KittyPetSocksShort/SockRightKneel.png b/Models/KittyPetSocksShort/SockRightKneel.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/KittyPetSocksShort/SockRightKneel.png differ diff --git a/Models/KittyPetSocksShort/SockRightKneelClosed.png b/Models/KittyPetSocksShort/SockRightKneelClosed.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/KittyPetSocksShort/SockRightKneelClosed.png differ diff --git a/Models/KittyPetSocksShort/SockRightSpread.png b/Models/KittyPetSocksShort/SockRightSpread.png new file mode 100644 index 000000000..4b1524178 Binary files /dev/null and b/Models/KittyPetSocksShort/SockRightSpread.png differ diff --git a/Models/KittyPetsuit/Arms.png b/Models/KittyPetsuit/Arms.png new file mode 100644 index 000000000..e5f41cb84 Binary files /dev/null and b/Models/KittyPetsuit/Arms.png differ diff --git a/Models/KittyPetsuit/ArmsPaws.png b/Models/KittyPetsuit/ArmsPaws.png new file mode 100644 index 000000000..428c0c9cf Binary files /dev/null and b/Models/KittyPetsuit/ArmsPaws.png differ diff --git a/Models/KittyPetsuit/Collar.png b/Models/KittyPetsuit/Collar.png new file mode 100644 index 000000000..a77c01145 Binary files /dev/null and b/Models/KittyPetsuit/Collar.png differ diff --git a/Models/KittyPetsuit/FootLeftHogtie.png b/Models/KittyPetsuit/FootLeftHogtie.png new file mode 100644 index 000000000..4cd1562d8 Binary files /dev/null and b/Models/KittyPetsuit/FootLeftHogtie.png differ diff --git a/Models/KittyPetsuit/FootLeftHogtiePaws.png b/Models/KittyPetsuit/FootLeftHogtiePaws.png new file mode 100644 index 000000000..a467f1a8d Binary files /dev/null and b/Models/KittyPetsuit/FootLeftHogtiePaws.png differ diff --git a/Models/KittyPetsuit/FootRightKneel.png b/Models/KittyPetsuit/FootRightKneel.png new file mode 100644 index 000000000..f65eb6ab8 Binary files /dev/null and b/Models/KittyPetsuit/FootRightKneel.png differ diff --git a/Models/KittyPetsuit/LeftLegsKneel.png b/Models/KittyPetsuit/LeftLegsKneel.png new file mode 100644 index 000000000..d0c661882 Binary files /dev/null and b/Models/KittyPetsuit/LeftLegsKneel.png differ diff --git a/Models/KittyPetsuit/LeftLegsKneelClosed.png b/Models/KittyPetsuit/LeftLegsKneelClosed.png new file mode 100644 index 000000000..bede5d1b6 Binary files /dev/null and b/Models/KittyPetsuit/LeftLegsKneelClosed.png differ diff --git a/Models/KittyPetsuit/LeftLegsPawsKneel.png b/Models/KittyPetsuit/LeftLegsPawsKneel.png new file mode 100644 index 000000000..59b74255d Binary files /dev/null and b/Models/KittyPetsuit/LeftLegsPawsKneel.png differ diff --git a/Models/KittyPetsuit/LeftLegsPawsKneelClosed.png b/Models/KittyPetsuit/LeftLegsPawsKneelClosed.png new file mode 100644 index 000000000..7cd1a0beb Binary files /dev/null and b/Models/KittyPetsuit/LeftLegsPawsKneelClosed.png differ diff --git a/Models/KittyPetsuit/LegsHogtie.png b/Models/KittyPetsuit/LegsHogtie.png new file mode 100644 index 000000000..6517e28cf Binary files /dev/null and b/Models/KittyPetsuit/LegsHogtie.png differ diff --git a/Models/KittyPetsuit/LegsKneel.png b/Models/KittyPetsuit/LegsKneel.png new file mode 100644 index 000000000..5c99a5db0 Binary files /dev/null and b/Models/KittyPetsuit/LegsKneel.png differ diff --git a/Models/KittyPetsuit/LegsKneelClosed.png b/Models/KittyPetsuit/LegsKneelClosed.png new file mode 100644 index 000000000..163e13a74 Binary files /dev/null and b/Models/KittyPetsuit/LegsKneelClosed.png differ diff --git a/Models/KittyPetsuit/Leotard.png b/Models/KittyPetsuit/Leotard.png new file mode 100644 index 000000000..45cc9634e Binary files /dev/null and b/Models/KittyPetsuit/Leotard.png differ diff --git a/Models/KittyPetsuit/LeotardChest.png b/Models/KittyPetsuit/LeotardChest.png new file mode 100644 index 000000000..29ee27253 Binary files /dev/null and b/Models/KittyPetsuit/LeotardChest.png differ diff --git a/Models/KittyPetsuit/LeotardHogtie.png b/Models/KittyPetsuit/LeotardHogtie.png new file mode 100644 index 000000000..d799f4d8e Binary files /dev/null and b/Models/KittyPetsuit/LeotardHogtie.png differ diff --git a/Models/Labcoat/CapeHogtie.png b/Models/Labcoat/CapeHogtie.png new file mode 100644 index 000000000..16b3772bb Binary files /dev/null and b/Models/Labcoat/CapeHogtie.png differ diff --git a/Models/Labcoat/CapeKneel.png b/Models/Labcoat/CapeKneel.png new file mode 100644 index 000000000..65b4dbe96 Binary files /dev/null and b/Models/Labcoat/CapeKneel.png differ diff --git a/Models/Labcoat/CapeSpread.png b/Models/Labcoat/CapeSpread.png new file mode 100644 index 000000000..04fb1bfdf Binary files /dev/null and b/Models/Labcoat/CapeSpread.png differ diff --git a/Models/Labcoat/CapeYoked.png b/Models/Labcoat/CapeYoked.png new file mode 100644 index 000000000..a04ee8fcc Binary files /dev/null and b/Models/Labcoat/CapeYoked.png differ diff --git a/Models/Labcoat/CoatHogtieFree.png b/Models/Labcoat/CoatHogtieFree.png new file mode 100644 index 000000000..05d97c81f Binary files /dev/null and b/Models/Labcoat/CoatHogtieFree.png differ diff --git a/Models/Labcoat/CoatKneel.png b/Models/Labcoat/CoatKneel.png new file mode 100644 index 000000000..05df98412 Binary files /dev/null and b/Models/Labcoat/CoatKneel.png differ diff --git a/Models/Labcoat/CoatSpread.png b/Models/Labcoat/CoatSpread.png new file mode 100644 index 000000000..16d244cad Binary files /dev/null and b/Models/Labcoat/CoatSpread.png differ diff --git a/Models/Labcoat/CoatYoked.png b/Models/Labcoat/CoatYoked.png new file mode 100644 index 000000000..0b50059ed Binary files /dev/null and b/Models/Labcoat/CoatYoked.png differ diff --git a/Models/Labcoat/ShouldersHogtie.png b/Models/Labcoat/ShouldersHogtie.png new file mode 100644 index 000000000..577089a06 Binary files /dev/null and b/Models/Labcoat/ShouldersHogtie.png differ diff --git a/Models/Labcoat/ShouldersHogtieFree.png b/Models/Labcoat/ShouldersHogtieFree.png new file mode 100644 index 000000000..88af944ad Binary files /dev/null and b/Models/Labcoat/ShouldersHogtieFree.png differ diff --git a/Models/Labcoat/ShouldersKneel.png b/Models/Labcoat/ShouldersKneel.png new file mode 100644 index 000000000..6eac89ebf Binary files /dev/null and b/Models/Labcoat/ShouldersKneel.png differ diff --git a/Models/Labcoat/ShouldersSpread.png b/Models/Labcoat/ShouldersSpread.png new file mode 100644 index 000000000..94407123d Binary files /dev/null and b/Models/Labcoat/ShouldersSpread.png differ diff --git a/Models/Labcoat/ShouldersUp.png b/Models/Labcoat/ShouldersUp.png new file mode 100644 index 000000000..d10f29271 Binary files /dev/null and b/Models/Labcoat/ShouldersUp.png differ diff --git a/Models/Labcoat/ShouldersYoked.png b/Models/Labcoat/ShouldersYoked.png new file mode 100644 index 000000000..22d5077f3 Binary files /dev/null and b/Models/Labcoat/ShouldersYoked.png differ diff --git a/Models/LatexPetsuit/Arms.png b/Models/LatexPetsuit/Arms.png new file mode 100644 index 000000000..ad6e5def6 Binary files /dev/null and b/Models/LatexPetsuit/Arms.png differ diff --git a/Models/LatexPetsuit/ArmsBelts.png b/Models/LatexPetsuit/ArmsBelts.png new file mode 100644 index 000000000..03a86b1e8 Binary files /dev/null and b/Models/LatexPetsuit/ArmsBelts.png differ diff --git a/Models/LatexPetsuit/GlowArms.png b/Models/LatexPetsuit/GlowArms.png new file mode 100644 index 000000000..d9be66e5e Binary files /dev/null and b/Models/LatexPetsuit/GlowArms.png differ diff --git a/Models/LatexPetsuit/GlowLeftLegsKneel.png b/Models/LatexPetsuit/GlowLeftLegsKneel.png new file mode 100644 index 000000000..ff483a4de Binary files /dev/null and b/Models/LatexPetsuit/GlowLeftLegsKneel.png differ diff --git a/Models/LatexPetsuit/GlowLeftLegsKneelClosed.png b/Models/LatexPetsuit/GlowLeftLegsKneelClosed.png new file mode 100644 index 000000000..0713a7bac Binary files /dev/null and b/Models/LatexPetsuit/GlowLeftLegsKneelClosed.png differ diff --git a/Models/LatexPetsuit/GlowLegsHogtie.png b/Models/LatexPetsuit/GlowLegsHogtie.png new file mode 100644 index 000000000..bcfa65df7 Binary files /dev/null and b/Models/LatexPetsuit/GlowLegsHogtie.png differ diff --git a/Models/LatexPetsuit/GlowLegsKneel.png b/Models/LatexPetsuit/GlowLegsKneel.png new file mode 100644 index 000000000..1d6bd9bc2 Binary files /dev/null and b/Models/LatexPetsuit/GlowLegsKneel.png differ diff --git a/Models/LatexPetsuit/GlowLegsKneelClosed.png b/Models/LatexPetsuit/GlowLegsKneelClosed.png new file mode 100644 index 000000000..1d6bd9bc2 Binary files /dev/null and b/Models/LatexPetsuit/GlowLegsKneelClosed.png differ diff --git a/Models/LatexPetsuit/GlowTorso.png b/Models/LatexPetsuit/GlowTorso.png new file mode 100644 index 000000000..0e3c3c1be Binary files /dev/null and b/Models/LatexPetsuit/GlowTorso.png differ diff --git a/Models/LatexPetsuit/LeftLegsBeltsKneel.png b/Models/LatexPetsuit/LeftLegsBeltsKneel.png new file mode 100644 index 000000000..2b1f06a1a Binary files /dev/null and b/Models/LatexPetsuit/LeftLegsBeltsKneel.png differ diff --git a/Models/LatexPetsuit/LeftLegsBeltsKneelClosed.png b/Models/LatexPetsuit/LeftLegsBeltsKneelClosed.png new file mode 100644 index 000000000..0f21adb26 Binary files /dev/null and b/Models/LatexPetsuit/LeftLegsBeltsKneelClosed.png differ diff --git a/Models/LatexPetsuit/LeftLegsKneel.png b/Models/LatexPetsuit/LeftLegsKneel.png new file mode 100644 index 000000000..e80f841ba Binary files /dev/null and b/Models/LatexPetsuit/LeftLegsKneel.png differ diff --git a/Models/LatexPetsuit/LeftLegsKneelClosed.png b/Models/LatexPetsuit/LeftLegsKneelClosed.png new file mode 100644 index 000000000..b80ee214e Binary files /dev/null and b/Models/LatexPetsuit/LeftLegsKneelClosed.png differ diff --git a/Models/LatexPetsuit/LegsBeltsHogtie.png b/Models/LatexPetsuit/LegsBeltsHogtie.png new file mode 100644 index 000000000..46ad03792 Binary files /dev/null and b/Models/LatexPetsuit/LegsBeltsHogtie.png differ diff --git a/Models/LatexPetsuit/LegsBeltsKneel.png b/Models/LatexPetsuit/LegsBeltsKneel.png new file mode 100644 index 000000000..414c75a00 Binary files /dev/null and b/Models/LatexPetsuit/LegsBeltsKneel.png differ diff --git a/Models/LatexPetsuit/LegsBeltsKneelClosed.png b/Models/LatexPetsuit/LegsBeltsKneelClosed.png new file mode 100644 index 000000000..414c75a00 Binary files /dev/null and b/Models/LatexPetsuit/LegsBeltsKneelClosed.png differ diff --git a/Models/LatexPetsuit/LegsHogtie.png b/Models/LatexPetsuit/LegsHogtie.png new file mode 100644 index 000000000..c3b36d9b0 Binary files /dev/null and b/Models/LatexPetsuit/LegsHogtie.png differ diff --git a/Models/LatexPetsuit/LegsKneel.png b/Models/LatexPetsuit/LegsKneel.png new file mode 100644 index 000000000..ae455273e Binary files /dev/null and b/Models/LatexPetsuit/LegsKneel.png differ diff --git a/Models/LatexPetsuit/LegsKneelClosed.png b/Models/LatexPetsuit/LegsKneelClosed.png new file mode 100644 index 000000000..3df30bedc Binary files /dev/null and b/Models/LatexPetsuit/LegsKneelClosed.png differ diff --git a/Models/Leash/Leash.png b/Models/Leash/Leash.png new file mode 100644 index 000000000..a2a82e17f Binary files /dev/null and b/Models/Leash/Leash.png differ diff --git a/Models/Leash/LeashCollar.png b/Models/Leash/LeashCollar.png new file mode 100644 index 000000000..d8dff1f21 Binary files /dev/null and b/Models/Leash/LeashCollar.png differ diff --git a/Models/Leash/LeashCollarHardware.png b/Models/Leash/LeashCollarHardware.png new file mode 100644 index 000000000..e8318c10a Binary files /dev/null and b/Models/Leash/LeashCollarHardware.png differ diff --git a/Models/Leash/LeashCrossed.png b/Models/Leash/LeashCrossed.png new file mode 100644 index 000000000..d290bcc45 Binary files /dev/null and b/Models/Leash/LeashCrossed.png differ diff --git a/Models/Leash/LeashFree.png b/Models/Leash/LeashFree.png new file mode 100644 index 000000000..63cd3bfc8 Binary files /dev/null and b/Models/Leash/LeashFree.png differ diff --git a/Models/Leash/LeashFront.png b/Models/Leash/LeashFront.png new file mode 100644 index 000000000..71727b288 Binary files /dev/null and b/Models/Leash/LeashFront.png differ diff --git a/Models/Leash/LeashHogtie.png b/Models/Leash/LeashHogtie.png new file mode 100644 index 000000000..28408f7b2 Binary files /dev/null and b/Models/Leash/LeashHogtie.png differ diff --git a/Models/Leash/LeashHogtiePulled.png b/Models/Leash/LeashHogtiePulled.png new file mode 100644 index 000000000..3378fccde Binary files /dev/null and b/Models/Leash/LeashHogtiePulled.png differ diff --git a/Models/Leash/LeashKneel.png b/Models/Leash/LeashKneel.png new file mode 100644 index 000000000..379afb35f Binary files /dev/null and b/Models/Leash/LeashKneel.png differ diff --git a/Models/Leash/LeashKneelPulled.png b/Models/Leash/LeashKneelPulled.png new file mode 100644 index 000000000..a72f6908a Binary files /dev/null and b/Models/Leash/LeashKneelPulled.png differ diff --git a/Models/Leash/LeashPulled.png b/Models/Leash/LeashPulled.png new file mode 100644 index 000000000..05c0cc383 Binary files /dev/null and b/Models/Leash/LeashPulled.png differ diff --git a/Models/LeatherCuffs/AnkleLeftClosed.png b/Models/LeatherCuffs/AnkleLeftClosed.png new file mode 100644 index 000000000..47ba1926f Binary files /dev/null and b/Models/LeatherCuffs/AnkleLeftClosed.png differ diff --git a/Models/LeatherCuffs/AnkleLeftKneel.png b/Models/LeatherCuffs/AnkleLeftKneel.png new file mode 100644 index 000000000..0a3885047 Binary files /dev/null and b/Models/LeatherCuffs/AnkleLeftKneel.png differ diff --git a/Models/LeatherCuffs/AnkleLeftKneelClosed.png b/Models/LeatherCuffs/AnkleLeftKneelClosed.png new file mode 100644 index 000000000..a018fc3df Binary files /dev/null and b/Models/LeatherCuffs/AnkleLeftKneelClosed.png differ diff --git a/Models/LeatherCuffs/AnkleLeftSpread.png b/Models/LeatherCuffs/AnkleLeftSpread.png new file mode 100644 index 000000000..08fc63aed Binary files /dev/null and b/Models/LeatherCuffs/AnkleLeftSpread.png differ diff --git a/Models/LeatherCuffs/AnkleRightClosed.png b/Models/LeatherCuffs/AnkleRightClosed.png new file mode 100644 index 000000000..1e3bb0a21 Binary files /dev/null and b/Models/LeatherCuffs/AnkleRightClosed.png differ diff --git a/Models/LeatherCuffs/AnkleRightSpread.png b/Models/LeatherCuffs/AnkleRightSpread.png new file mode 100644 index 000000000..14a9ec2aa Binary files /dev/null and b/Models/LeatherCuffs/AnkleRightSpread.png differ diff --git a/Models/LeatherCuffs/BandAnkleLeftClosed.png b/Models/LeatherCuffs/BandAnkleLeftClosed.png new file mode 100644 index 000000000..028afad0a Binary files /dev/null and b/Models/LeatherCuffs/BandAnkleLeftClosed.png differ diff --git a/Models/LeatherCuffs/BandAnkleLeftKneel.png b/Models/LeatherCuffs/BandAnkleLeftKneel.png new file mode 100644 index 000000000..5dc6970eb Binary files /dev/null and b/Models/LeatherCuffs/BandAnkleLeftKneel.png differ diff --git a/Models/LeatherCuffs/BandAnkleLeftKneelClosed.png b/Models/LeatherCuffs/BandAnkleLeftKneelClosed.png new file mode 100644 index 000000000..e958b0681 Binary files /dev/null and b/Models/LeatherCuffs/BandAnkleLeftKneelClosed.png differ diff --git a/Models/LeatherCuffs/BandAnkleLeftSpread.png b/Models/LeatherCuffs/BandAnkleLeftSpread.png new file mode 100644 index 000000000..615bc4cb4 Binary files /dev/null and b/Models/LeatherCuffs/BandAnkleLeftSpread.png differ diff --git a/Models/LeatherCuffs/BandAnkleRightClosed.png b/Models/LeatherCuffs/BandAnkleRightClosed.png new file mode 100644 index 000000000..49971dfc9 Binary files /dev/null and b/Models/LeatherCuffs/BandAnkleRightClosed.png differ diff --git a/Models/LeatherCuffs/BandAnkleRightSpread.png b/Models/LeatherCuffs/BandAnkleRightSpread.png new file mode 100644 index 000000000..cc979218f Binary files /dev/null and b/Models/LeatherCuffs/BandAnkleRightSpread.png differ diff --git a/Models/LeatherCuffs/BandBelt.png b/Models/LeatherCuffs/BandBelt.png new file mode 100644 index 000000000..04e910b55 Binary files /dev/null and b/Models/LeatherCuffs/BandBelt.png differ diff --git a/Models/LeatherCuffs/BandCollar.png b/Models/LeatherCuffs/BandCollar.png new file mode 100644 index 000000000..eeb553d68 Binary files /dev/null and b/Models/LeatherCuffs/BandCollar.png differ diff --git a/Models/LeatherCuffs/BandElbowLeftBoxtie.png b/Models/LeatherCuffs/BandElbowLeftBoxtie.png new file mode 100644 index 000000000..6f40a0237 Binary files /dev/null and b/Models/LeatherCuffs/BandElbowLeftBoxtie.png differ diff --git a/Models/LeatherCuffs/BandElbowLeftFree.png b/Models/LeatherCuffs/BandElbowLeftFree.png new file mode 100644 index 000000000..711086b17 Binary files /dev/null and b/Models/LeatherCuffs/BandElbowLeftFree.png differ diff --git a/Models/LeatherCuffs/BandElbowLeftFront.png b/Models/LeatherCuffs/BandElbowLeftFront.png new file mode 100644 index 000000000..2407559a1 Binary files /dev/null and b/Models/LeatherCuffs/BandElbowLeftFront.png differ diff --git a/Models/LeatherCuffs/BandElbowLeftUp.png b/Models/LeatherCuffs/BandElbowLeftUp.png new file mode 100644 index 000000000..d676d46bd Binary files /dev/null and b/Models/LeatherCuffs/BandElbowLeftUp.png differ diff --git a/Models/LeatherCuffs/BandElbowLeftWristtie.png b/Models/LeatherCuffs/BandElbowLeftWristtie.png new file mode 100644 index 000000000..af9454104 Binary files /dev/null and b/Models/LeatherCuffs/BandElbowLeftWristtie.png differ diff --git a/Models/LeatherCuffs/BandElbowLeftYoked.png b/Models/LeatherCuffs/BandElbowLeftYoked.png new file mode 100644 index 000000000..a5005251c Binary files /dev/null and b/Models/LeatherCuffs/BandElbowLeftYoked.png differ diff --git a/Models/LeatherCuffs/BandElbowRightBoxtie.png b/Models/LeatherCuffs/BandElbowRightBoxtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/LeatherCuffs/BandElbowRightBoxtie.png differ diff --git a/Models/LeatherCuffs/BandElbowRightFront.png b/Models/LeatherCuffs/BandElbowRightFront.png new file mode 100644 index 000000000..d74d9ed9e Binary files /dev/null and b/Models/LeatherCuffs/BandElbowRightFront.png differ diff --git a/Models/LeatherCuffs/BandElbowRightUp.png b/Models/LeatherCuffs/BandElbowRightUp.png new file mode 100644 index 000000000..3d239569c Binary files /dev/null and b/Models/LeatherCuffs/BandElbowRightUp.png differ diff --git a/Models/LeatherCuffs/BandElbowRightWristtie.png b/Models/LeatherCuffs/BandElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/LeatherCuffs/BandElbowRightWristtie.png differ diff --git a/Models/LeatherCuffs/BandElbowRightYoked.png b/Models/LeatherCuffs/BandElbowRightYoked.png new file mode 100644 index 000000000..31d74636f Binary files /dev/null and b/Models/LeatherCuffs/BandElbowRightYoked.png differ diff --git a/Models/LeatherCuffs/BandThighLeftClosed.png b/Models/LeatherCuffs/BandThighLeftClosed.png new file mode 100644 index 000000000..09caa8736 Binary files /dev/null and b/Models/LeatherCuffs/BandThighLeftClosed.png differ diff --git a/Models/LeatherCuffs/BandThighLeftKneel.png b/Models/LeatherCuffs/BandThighLeftKneel.png new file mode 100644 index 000000000..113915163 Binary files /dev/null and b/Models/LeatherCuffs/BandThighLeftKneel.png differ diff --git a/Models/LeatherCuffs/BandThighLeftKneelClosed.png b/Models/LeatherCuffs/BandThighLeftKneelClosed.png new file mode 100644 index 000000000..684dbb352 Binary files /dev/null and b/Models/LeatherCuffs/BandThighLeftKneelClosed.png differ diff --git a/Models/LeatherCuffs/BandThighLeftSpread.png b/Models/LeatherCuffs/BandThighLeftSpread.png new file mode 100644 index 000000000..b2173a66a Binary files /dev/null and b/Models/LeatherCuffs/BandThighLeftSpread.png differ diff --git a/Models/LeatherCuffs/BandThighRightClosed.png b/Models/LeatherCuffs/BandThighRightClosed.png new file mode 100644 index 000000000..40affbc1c Binary files /dev/null and b/Models/LeatherCuffs/BandThighRightClosed.png differ diff --git a/Models/LeatherCuffs/BandThighRightKneel.png b/Models/LeatherCuffs/BandThighRightKneel.png new file mode 100644 index 000000000..2b2cb0079 Binary files /dev/null and b/Models/LeatherCuffs/BandThighRightKneel.png differ diff --git a/Models/LeatherCuffs/BandThighRightKneelClosed.png b/Models/LeatherCuffs/BandThighRightKneelClosed.png new file mode 100644 index 000000000..a3583818d Binary files /dev/null and b/Models/LeatherCuffs/BandThighRightKneelClosed.png differ diff --git a/Models/LeatherCuffs/BandThighRightSpread.png b/Models/LeatherCuffs/BandThighRightSpread.png new file mode 100644 index 000000000..3b9199dba Binary files /dev/null and b/Models/LeatherCuffs/BandThighRightSpread.png differ diff --git a/Models/LeatherCuffs/BandWristLeftFree.png b/Models/LeatherCuffs/BandWristLeftFree.png new file mode 100644 index 000000000..6db6b9332 Binary files /dev/null and b/Models/LeatherCuffs/BandWristLeftFree.png differ diff --git a/Models/LeatherCuffs/BandWristLeftFront.png b/Models/LeatherCuffs/BandWristLeftFront.png new file mode 100644 index 000000000..deb8755a7 Binary files /dev/null and b/Models/LeatherCuffs/BandWristLeftFront.png differ diff --git a/Models/LeatherCuffs/BandWristLeftYoked.png b/Models/LeatherCuffs/BandWristLeftYoked.png new file mode 100644 index 000000000..f0437dc2e Binary files /dev/null and b/Models/LeatherCuffs/BandWristLeftYoked.png differ diff --git a/Models/LeatherCuffs/BandWristRightCrossed.png b/Models/LeatherCuffs/BandWristRightCrossed.png new file mode 100644 index 000000000..a8f116676 Binary files /dev/null and b/Models/LeatherCuffs/BandWristRightCrossed.png differ diff --git a/Models/LeatherCuffs/BandWristRightFree.png b/Models/LeatherCuffs/BandWristRightFree.png new file mode 100644 index 000000000..d0568d4ea Binary files /dev/null and b/Models/LeatherCuffs/BandWristRightFree.png differ diff --git a/Models/LeatherCuffs/BandWristRightFront.png b/Models/LeatherCuffs/BandWristRightFront.png new file mode 100644 index 000000000..5d39a0688 Binary files /dev/null and b/Models/LeatherCuffs/BandWristRightFront.png differ diff --git a/Models/LeatherCuffs/BandWristRightYoked.png b/Models/LeatherCuffs/BandWristRightYoked.png new file mode 100644 index 000000000..3a5713473 Binary files /dev/null and b/Models/LeatherCuffs/BandWristRightYoked.png differ diff --git a/Models/LeatherCuffs/BellCollar.png b/Models/LeatherCuffs/BellCollar.png new file mode 100644 index 000000000..c9c33c80d Binary files /dev/null and b/Models/LeatherCuffs/BellCollar.png differ diff --git a/Models/LeatherCuffs/Belt.png b/Models/LeatherCuffs/Belt.png new file mode 100644 index 000000000..3f52c078f Binary files /dev/null and b/Models/LeatherCuffs/Belt.png differ diff --git a/Models/LeatherCuffs/BowBellCollar.png b/Models/LeatherCuffs/BowBellCollar.png new file mode 100644 index 000000000..c6443af57 Binary files /dev/null and b/Models/LeatherCuffs/BowBellCollar.png differ diff --git a/Models/LeatherCuffs/BowCollar.png b/Models/LeatherCuffs/BowCollar.png new file mode 100644 index 000000000..a2892a0cb Binary files /dev/null and b/Models/LeatherCuffs/BowCollar.png differ diff --git a/Models/LeatherCuffs/Collar.png b/Models/LeatherCuffs/Collar.png new file mode 100644 index 000000000..8bfca0ea6 Binary files /dev/null and b/Models/LeatherCuffs/Collar.png differ diff --git a/Models/LeatherCuffs/ElbowLeftBoxtie.png b/Models/LeatherCuffs/ElbowLeftBoxtie.png new file mode 100644 index 000000000..3302d46d2 Binary files /dev/null and b/Models/LeatherCuffs/ElbowLeftBoxtie.png differ diff --git a/Models/LeatherCuffs/ElbowLeftFree.png b/Models/LeatherCuffs/ElbowLeftFree.png new file mode 100644 index 000000000..5b5a88a8f Binary files /dev/null and b/Models/LeatherCuffs/ElbowLeftFree.png differ diff --git a/Models/LeatherCuffs/ElbowLeftFront.png b/Models/LeatherCuffs/ElbowLeftFront.png new file mode 100644 index 000000000..b43b1e0d0 Binary files /dev/null and b/Models/LeatherCuffs/ElbowLeftFront.png differ diff --git a/Models/LeatherCuffs/ElbowLeftUp.png b/Models/LeatherCuffs/ElbowLeftUp.png new file mode 100644 index 000000000..20ac17670 Binary files /dev/null and b/Models/LeatherCuffs/ElbowLeftUp.png differ diff --git a/Models/LeatherCuffs/ElbowLeftWristtie.png b/Models/LeatherCuffs/ElbowLeftWristtie.png new file mode 100644 index 000000000..005f40464 Binary files /dev/null and b/Models/LeatherCuffs/ElbowLeftWristtie.png differ diff --git a/Models/LeatherCuffs/ElbowLeftYoked.png b/Models/LeatherCuffs/ElbowLeftYoked.png new file mode 100644 index 000000000..cd58c8265 Binary files /dev/null and b/Models/LeatherCuffs/ElbowLeftYoked.png differ diff --git a/Models/LeatherCuffs/ElbowRightBoxtie.png b/Models/LeatherCuffs/ElbowRightBoxtie.png new file mode 100644 index 000000000..03e426627 Binary files /dev/null and b/Models/LeatherCuffs/ElbowRightBoxtie.png differ diff --git a/Models/LeatherCuffs/ElbowRightFront.png b/Models/LeatherCuffs/ElbowRightFront.png new file mode 100644 index 000000000..1dd1c459a Binary files /dev/null and b/Models/LeatherCuffs/ElbowRightFront.png differ diff --git a/Models/LeatherCuffs/ElbowRightUp.png b/Models/LeatherCuffs/ElbowRightUp.png new file mode 100644 index 000000000..d1dbc12fa Binary files /dev/null and b/Models/LeatherCuffs/ElbowRightUp.png differ diff --git a/Models/LeatherCuffs/ElbowRightWristtie.png b/Models/LeatherCuffs/ElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/LeatherCuffs/ElbowRightWristtie.png differ diff --git a/Models/LeatherCuffs/ElbowRightYoked.png b/Models/LeatherCuffs/ElbowRightYoked.png new file mode 100644 index 000000000..59ee74da8 Binary files /dev/null and b/Models/LeatherCuffs/ElbowRightYoked.png differ diff --git a/Models/LeatherCuffs/HardwareAnkleLeftClosed.png b/Models/LeatherCuffs/HardwareAnkleLeftClosed.png new file mode 100644 index 000000000..f74c61288 Binary files /dev/null and b/Models/LeatherCuffs/HardwareAnkleLeftClosed.png differ diff --git a/Models/LeatherCuffs/HardwareAnkleLeftKneel.png b/Models/LeatherCuffs/HardwareAnkleLeftKneel.png new file mode 100644 index 000000000..c1d3e7b1d Binary files /dev/null and b/Models/LeatherCuffs/HardwareAnkleLeftKneel.png differ diff --git a/Models/LeatherCuffs/HardwareAnkleLeftKneelClosed.png b/Models/LeatherCuffs/HardwareAnkleLeftKneelClosed.png new file mode 100644 index 000000000..c1d3e7b1d Binary files /dev/null and b/Models/LeatherCuffs/HardwareAnkleLeftKneelClosed.png differ diff --git a/Models/LeatherCuffs/HardwareAnkleLeftSpread.png b/Models/LeatherCuffs/HardwareAnkleLeftSpread.png new file mode 100644 index 000000000..8c39af131 Binary files /dev/null and b/Models/LeatherCuffs/HardwareAnkleLeftSpread.png differ diff --git a/Models/LeatherCuffs/HardwareAnkleRightClosed.png b/Models/LeatherCuffs/HardwareAnkleRightClosed.png new file mode 100644 index 000000000..db81bb581 Binary files /dev/null and b/Models/LeatherCuffs/HardwareAnkleRightClosed.png differ diff --git a/Models/LeatherCuffs/HardwareAnkleRightSpread.png b/Models/LeatherCuffs/HardwareAnkleRightSpread.png new file mode 100644 index 000000000..c61fcc8d8 Binary files /dev/null and b/Models/LeatherCuffs/HardwareAnkleRightSpread.png differ diff --git a/Models/LeatherCuffs/HardwareBelt.png b/Models/LeatherCuffs/HardwareBelt.png new file mode 100644 index 000000000..87c805a8c Binary files /dev/null and b/Models/LeatherCuffs/HardwareBelt.png differ diff --git a/Models/LeatherCuffs/HardwareCollar.png b/Models/LeatherCuffs/HardwareCollar.png new file mode 100644 index 000000000..fe4d9e888 Binary files /dev/null and b/Models/LeatherCuffs/HardwareCollar.png differ diff --git a/Models/LeatherCuffs/HardwareElbowLeftBoxtie.png b/Models/LeatherCuffs/HardwareElbowLeftBoxtie.png new file mode 100644 index 000000000..cbd843fba Binary files /dev/null and b/Models/LeatherCuffs/HardwareElbowLeftBoxtie.png differ diff --git a/Models/LeatherCuffs/HardwareElbowLeftFree.png b/Models/LeatherCuffs/HardwareElbowLeftFree.png new file mode 100644 index 000000000..5af65da73 Binary files /dev/null and b/Models/LeatherCuffs/HardwareElbowLeftFree.png differ diff --git a/Models/LeatherCuffs/HardwareElbowLeftFront.png b/Models/LeatherCuffs/HardwareElbowLeftFront.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/LeatherCuffs/HardwareElbowLeftFront.png differ diff --git a/Models/LeatherCuffs/HardwareElbowLeftUp.png b/Models/LeatherCuffs/HardwareElbowLeftUp.png new file mode 100644 index 000000000..a49d9de72 Binary files /dev/null and b/Models/LeatherCuffs/HardwareElbowLeftUp.png differ diff --git a/Models/LeatherCuffs/HardwareElbowLeftWristtie.png b/Models/LeatherCuffs/HardwareElbowLeftWristtie.png new file mode 100644 index 000000000..870718168 Binary files /dev/null and b/Models/LeatherCuffs/HardwareElbowLeftWristtie.png differ diff --git a/Models/LeatherCuffs/HardwareElbowLeftYoked.png b/Models/LeatherCuffs/HardwareElbowLeftYoked.png new file mode 100644 index 000000000..439d1f826 Binary files /dev/null and b/Models/LeatherCuffs/HardwareElbowLeftYoked.png differ diff --git a/Models/LeatherCuffs/HardwareElbowRightBoxtie.png b/Models/LeatherCuffs/HardwareElbowRightBoxtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/LeatherCuffs/HardwareElbowRightBoxtie.png differ diff --git a/Models/LeatherCuffs/HardwareElbowRightFront.png b/Models/LeatherCuffs/HardwareElbowRightFront.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/LeatherCuffs/HardwareElbowRightFront.png differ diff --git a/Models/LeatherCuffs/HardwareElbowRightUp.png b/Models/LeatherCuffs/HardwareElbowRightUp.png new file mode 100644 index 000000000..468ee5610 Binary files /dev/null and b/Models/LeatherCuffs/HardwareElbowRightUp.png differ diff --git a/Models/LeatherCuffs/HardwareElbowRightWristtie.png b/Models/LeatherCuffs/HardwareElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/LeatherCuffs/HardwareElbowRightWristtie.png differ diff --git a/Models/LeatherCuffs/HardwareElbowRightYoked.png b/Models/LeatherCuffs/HardwareElbowRightYoked.png new file mode 100644 index 000000000..c9b8b1578 Binary files /dev/null and b/Models/LeatherCuffs/HardwareElbowRightYoked.png differ diff --git a/Models/LeatherCuffs/HardwareThighLeftClosed.png b/Models/LeatherCuffs/HardwareThighLeftClosed.png new file mode 100644 index 000000000..03061a130 Binary files /dev/null and b/Models/LeatherCuffs/HardwareThighLeftClosed.png differ diff --git a/Models/LeatherCuffs/HardwareThighLeftKneel.png b/Models/LeatherCuffs/HardwareThighLeftKneel.png new file mode 100644 index 000000000..e2069d5db Binary files /dev/null and b/Models/LeatherCuffs/HardwareThighLeftKneel.png differ diff --git a/Models/LeatherCuffs/HardwareThighLeftKneelClosed.png b/Models/LeatherCuffs/HardwareThighLeftKneelClosed.png new file mode 100644 index 000000000..e2069d5db Binary files /dev/null and b/Models/LeatherCuffs/HardwareThighLeftKneelClosed.png differ diff --git a/Models/LeatherCuffs/HardwareThighLeftSpread.png b/Models/LeatherCuffs/HardwareThighLeftSpread.png new file mode 100644 index 000000000..7054e8303 Binary files /dev/null and b/Models/LeatherCuffs/HardwareThighLeftSpread.png differ diff --git a/Models/LeatherCuffs/HardwareThighRightClosed.png b/Models/LeatherCuffs/HardwareThighRightClosed.png new file mode 100644 index 000000000..b2c168f4a Binary files /dev/null and b/Models/LeatherCuffs/HardwareThighRightClosed.png differ diff --git a/Models/LeatherCuffs/HardwareThighRightKneel.png b/Models/LeatherCuffs/HardwareThighRightKneel.png new file mode 100644 index 000000000..86ab2fcb0 Binary files /dev/null and b/Models/LeatherCuffs/HardwareThighRightKneel.png differ diff --git a/Models/LeatherCuffs/HardwareThighRightKneelClosed.png b/Models/LeatherCuffs/HardwareThighRightKneelClosed.png new file mode 100644 index 000000000..a8511f51f Binary files /dev/null and b/Models/LeatherCuffs/HardwareThighRightKneelClosed.png differ diff --git a/Models/LeatherCuffs/HardwareThighRightSpread.png b/Models/LeatherCuffs/HardwareThighRightSpread.png new file mode 100644 index 000000000..b7a2dd49b Binary files /dev/null and b/Models/LeatherCuffs/HardwareThighRightSpread.png differ diff --git a/Models/LeatherCuffs/HardwareWristLeftFree.png b/Models/LeatherCuffs/HardwareWristLeftFree.png new file mode 100644 index 000000000..0d9ecc8f0 Binary files /dev/null and b/Models/LeatherCuffs/HardwareWristLeftFree.png differ diff --git a/Models/LeatherCuffs/HardwareWristLeftFront.png b/Models/LeatherCuffs/HardwareWristLeftFront.png new file mode 100644 index 000000000..eed32f049 Binary files /dev/null and b/Models/LeatherCuffs/HardwareWristLeftFront.png differ diff --git a/Models/LeatherCuffs/HardwareWristLeftYoked.png b/Models/LeatherCuffs/HardwareWristLeftYoked.png new file mode 100644 index 000000000..591f94f4b Binary files /dev/null and b/Models/LeatherCuffs/HardwareWristLeftYoked.png differ diff --git a/Models/LeatherCuffs/HardwareWristRightCrossed.png b/Models/LeatherCuffs/HardwareWristRightCrossed.png new file mode 100644 index 000000000..2d330c37b Binary files /dev/null and b/Models/LeatherCuffs/HardwareWristRightCrossed.png differ diff --git a/Models/LeatherCuffs/HardwareWristRightFree.png b/Models/LeatherCuffs/HardwareWristRightFree.png new file mode 100644 index 000000000..0608b4c14 Binary files /dev/null and b/Models/LeatherCuffs/HardwareWristRightFree.png differ diff --git a/Models/LeatherCuffs/HardwareWristRightFront.png b/Models/LeatherCuffs/HardwareWristRightFront.png new file mode 100644 index 000000000..36db21f52 Binary files /dev/null and b/Models/LeatherCuffs/HardwareWristRightFront.png differ diff --git a/Models/LeatherCuffs/HardwareWristRightYoked.png b/Models/LeatherCuffs/HardwareWristRightYoked.png new file mode 100644 index 000000000..519138a1b Binary files /dev/null and b/Models/LeatherCuffs/HardwareWristRightYoked.png differ diff --git a/Models/LeatherCuffs/ThighLeftClosed.png b/Models/LeatherCuffs/ThighLeftClosed.png new file mode 100644 index 000000000..1ed30c0b7 Binary files /dev/null and b/Models/LeatherCuffs/ThighLeftClosed.png differ diff --git a/Models/LeatherCuffs/ThighLeftKneel.png b/Models/LeatherCuffs/ThighLeftKneel.png new file mode 100644 index 000000000..b96ef7863 Binary files /dev/null and b/Models/LeatherCuffs/ThighLeftKneel.png differ diff --git a/Models/LeatherCuffs/ThighLeftKneelClosed.png b/Models/LeatherCuffs/ThighLeftKneelClosed.png new file mode 100644 index 000000000..9e6d93f0f Binary files /dev/null and b/Models/LeatherCuffs/ThighLeftKneelClosed.png differ diff --git a/Models/LeatherCuffs/ThighLeftSpread.png b/Models/LeatherCuffs/ThighLeftSpread.png new file mode 100644 index 000000000..824161a4c Binary files /dev/null and b/Models/LeatherCuffs/ThighLeftSpread.png differ diff --git a/Models/LeatherCuffs/ThighRightClosed.png b/Models/LeatherCuffs/ThighRightClosed.png new file mode 100644 index 000000000..66793c48a Binary files /dev/null and b/Models/LeatherCuffs/ThighRightClosed.png differ diff --git a/Models/LeatherCuffs/ThighRightKneel.png b/Models/LeatherCuffs/ThighRightKneel.png new file mode 100644 index 000000000..8146ea6d9 Binary files /dev/null and b/Models/LeatherCuffs/ThighRightKneel.png differ diff --git a/Models/LeatherCuffs/ThighRightKneelClosed.png b/Models/LeatherCuffs/ThighRightKneelClosed.png new file mode 100644 index 000000000..b538e46f9 Binary files /dev/null and b/Models/LeatherCuffs/ThighRightKneelClosed.png differ diff --git a/Models/LeatherCuffs/ThighRightSpread.png b/Models/LeatherCuffs/ThighRightSpread.png new file mode 100644 index 000000000..571d38974 Binary files /dev/null and b/Models/LeatherCuffs/ThighRightSpread.png differ diff --git a/Models/LeatherCuffs/WristLeftFree.png b/Models/LeatherCuffs/WristLeftFree.png new file mode 100644 index 000000000..ff4391867 Binary files /dev/null and b/Models/LeatherCuffs/WristLeftFree.png differ diff --git a/Models/LeatherCuffs/WristLeftFront.png b/Models/LeatherCuffs/WristLeftFront.png new file mode 100644 index 000000000..bd6045324 Binary files /dev/null and b/Models/LeatherCuffs/WristLeftFront.png differ diff --git a/Models/LeatherCuffs/WristLeftYoked.png b/Models/LeatherCuffs/WristLeftYoked.png new file mode 100644 index 000000000..02d4f6525 Binary files /dev/null and b/Models/LeatherCuffs/WristLeftYoked.png differ diff --git a/Models/LeatherCuffs/WristRightCrossed.png b/Models/LeatherCuffs/WristRightCrossed.png new file mode 100644 index 000000000..177b31e92 Binary files /dev/null and b/Models/LeatherCuffs/WristRightCrossed.png differ diff --git a/Models/LeatherCuffs/WristRightFree.png b/Models/LeatherCuffs/WristRightFree.png new file mode 100644 index 000000000..9269fe614 Binary files /dev/null and b/Models/LeatherCuffs/WristRightFree.png differ diff --git a/Models/LeatherCuffs/WristRightFront.png b/Models/LeatherCuffs/WristRightFront.png new file mode 100644 index 000000000..6a9a19f02 Binary files /dev/null and b/Models/LeatherCuffs/WristRightFront.png differ diff --git a/Models/LeatherCuffs/WristRightYoked.png b/Models/LeatherCuffs/WristRightYoked.png new file mode 100644 index 000000000..de7ffa79c Binary files /dev/null and b/Models/LeatherCuffs/WristRightYoked.png differ diff --git a/Models/LeatherLeotard/Laces.png b/Models/LeatherLeotard/Laces.png new file mode 100644 index 000000000..f3cb6f44c Binary files /dev/null and b/Models/LeatherLeotard/Laces.png differ diff --git a/Models/LeatherLeotard/Leotard.png b/Models/LeatherLeotard/Leotard.png new file mode 100644 index 000000000..6450926e4 Binary files /dev/null and b/Models/LeatherLeotard/Leotard.png differ diff --git a/Models/LeatherLeotard/LeotardChest.png b/Models/LeatherLeotard/LeotardChest.png new file mode 100644 index 000000000..d7545424f Binary files /dev/null and b/Models/LeatherLeotard/LeotardChest.png differ diff --git a/Models/LeatherLeotard/LeotardClosed.png b/Models/LeatherLeotard/LeotardClosed.png new file mode 100644 index 000000000..cefcf635d Binary files /dev/null and b/Models/LeatherLeotard/LeotardClosed.png differ diff --git a/Models/LeatherLeotard/LeotardCorset.png b/Models/LeatherLeotard/LeotardCorset.png new file mode 100644 index 000000000..303d25124 Binary files /dev/null and b/Models/LeatherLeotard/LeotardCorset.png differ diff --git a/Models/LeatherLeotard/StrapsArms.png b/Models/LeatherLeotard/StrapsArms.png new file mode 100644 index 000000000..59984dc7a Binary files /dev/null and b/Models/LeatherLeotard/StrapsArms.png differ diff --git a/Models/LeatherLeotard/StrapsChest.png b/Models/LeatherLeotard/StrapsChest.png new file mode 100644 index 000000000..f4c842585 Binary files /dev/null and b/Models/LeatherLeotard/StrapsChest.png differ diff --git a/Models/LeatherLeotard/StrapsHardware.png b/Models/LeatherLeotard/StrapsHardware.png new file mode 100644 index 000000000..f14a6fdba Binary files /dev/null and b/Models/LeatherLeotard/StrapsHardware.png differ diff --git a/Models/LeatherLeotard/StrapsLower.png b/Models/LeatherLeotard/StrapsLower.png new file mode 100644 index 000000000..f06937aa6 Binary files /dev/null and b/Models/LeatherLeotard/StrapsLower.png differ diff --git a/Models/LeatherLeotard/StrapsLowerClean.png b/Models/LeatherLeotard/StrapsLowerClean.png new file mode 100644 index 000000000..dae4db1d0 Binary files /dev/null and b/Models/LeatherLeotard/StrapsLowerClean.png differ diff --git a/Models/LeatherLeotard/StrapsLowerCleanClosed.png b/Models/LeatherLeotard/StrapsLowerCleanClosed.png new file mode 100644 index 000000000..76b80f298 Binary files /dev/null and b/Models/LeatherLeotard/StrapsLowerCleanClosed.png differ diff --git a/Models/LeatherLeotard/StrapsLowerClosed.png b/Models/LeatherLeotard/StrapsLowerClosed.png new file mode 100644 index 000000000..ccf00d695 Binary files /dev/null and b/Models/LeatherLeotard/StrapsLowerClosed.png differ diff --git a/Models/LeatherPetsuit/Arms.png b/Models/LeatherPetsuit/Arms.png new file mode 100644 index 000000000..a0f39a9b6 Binary files /dev/null and b/Models/LeatherPetsuit/Arms.png differ diff --git a/Models/LeatherPetsuit/ArmsBelts.png b/Models/LeatherPetsuit/ArmsBelts.png new file mode 100644 index 000000000..430a73ffb Binary files /dev/null and b/Models/LeatherPetsuit/ArmsBelts.png differ diff --git a/Models/LeatherPetsuit/ArmsHardware.png b/Models/LeatherPetsuit/ArmsHardware.png new file mode 100644 index 000000000..ec8f5ddca Binary files /dev/null and b/Models/LeatherPetsuit/ArmsHardware.png differ diff --git a/Models/LeatherPetsuit/ArmsLaces.png b/Models/LeatherPetsuit/ArmsLaces.png new file mode 100644 index 000000000..fd7373a58 Binary files /dev/null and b/Models/LeatherPetsuit/ArmsLaces.png differ diff --git a/Models/LeatherPetsuit/LeftLegsBeltsKneel.png b/Models/LeatherPetsuit/LeftLegsBeltsKneel.png new file mode 100644 index 000000000..7a15e98e5 Binary files /dev/null and b/Models/LeatherPetsuit/LeftLegsBeltsKneel.png differ diff --git a/Models/LeatherPetsuit/LeftLegsBeltsKneelClosed.png b/Models/LeatherPetsuit/LeftLegsBeltsKneelClosed.png new file mode 100644 index 000000000..69e3874a2 Binary files /dev/null and b/Models/LeatherPetsuit/LeftLegsBeltsKneelClosed.png differ diff --git a/Models/LeatherPetsuit/LeftLegsHardwareKneel.png b/Models/LeatherPetsuit/LeftLegsHardwareKneel.png new file mode 100644 index 000000000..ebc31646b Binary files /dev/null and b/Models/LeatherPetsuit/LeftLegsHardwareKneel.png differ diff --git a/Models/LeatherPetsuit/LeftLegsHardwareKneelClosed.png b/Models/LeatherPetsuit/LeftLegsHardwareKneelClosed.png new file mode 100644 index 000000000..ebc31646b Binary files /dev/null and b/Models/LeatherPetsuit/LeftLegsHardwareKneelClosed.png differ diff --git a/Models/LeatherPetsuit/LeftLegsKneel.png b/Models/LeatherPetsuit/LeftLegsKneel.png new file mode 100644 index 000000000..8a407b09b Binary files /dev/null and b/Models/LeatherPetsuit/LeftLegsKneel.png differ diff --git a/Models/LeatherPetsuit/LeftLegsKneelClosed.png b/Models/LeatherPetsuit/LeftLegsKneelClosed.png new file mode 100644 index 000000000..dc4b9873d Binary files /dev/null and b/Models/LeatherPetsuit/LeftLegsKneelClosed.png differ diff --git a/Models/LeatherPetsuit/LeftLegsLacesKneel.png b/Models/LeatherPetsuit/LeftLegsLacesKneel.png new file mode 100644 index 000000000..cd417ae2e Binary files /dev/null and b/Models/LeatherPetsuit/LeftLegsLacesKneel.png differ diff --git a/Models/LeatherPetsuit/LeftLegsLacesKneelClosed.png b/Models/LeatherPetsuit/LeftLegsLacesKneelClosed.png new file mode 100644 index 000000000..cd417ae2e Binary files /dev/null and b/Models/LeatherPetsuit/LeftLegsLacesKneelClosed.png differ diff --git a/Models/LeatherPetsuit/LegsBeltsHogtie.png b/Models/LeatherPetsuit/LegsBeltsHogtie.png new file mode 100644 index 000000000..6ad52c50e Binary files /dev/null and b/Models/LeatherPetsuit/LegsBeltsHogtie.png differ diff --git a/Models/LeatherPetsuit/LegsBeltsKneel.png b/Models/LeatherPetsuit/LegsBeltsKneel.png new file mode 100644 index 000000000..1c83e8b24 Binary files /dev/null and b/Models/LeatherPetsuit/LegsBeltsKneel.png differ diff --git a/Models/LeatherPetsuit/LegsBeltsKneelClosed.png b/Models/LeatherPetsuit/LegsBeltsKneelClosed.png new file mode 100644 index 000000000..1c83e8b24 Binary files /dev/null and b/Models/LeatherPetsuit/LegsBeltsKneelClosed.png differ diff --git a/Models/LeatherPetsuit/LegsHardwareHogtie.png b/Models/LeatherPetsuit/LegsHardwareHogtie.png new file mode 100644 index 000000000..bb28a4f36 Binary files /dev/null and b/Models/LeatherPetsuit/LegsHardwareHogtie.png differ diff --git a/Models/LeatherPetsuit/LegsHogtie.png b/Models/LeatherPetsuit/LegsHogtie.png new file mode 100644 index 000000000..50eb72e8a Binary files /dev/null and b/Models/LeatherPetsuit/LegsHogtie.png differ diff --git a/Models/LeatherPetsuit/LegsKneel.png b/Models/LeatherPetsuit/LegsKneel.png new file mode 100644 index 000000000..cd5364e25 Binary files /dev/null and b/Models/LeatherPetsuit/LegsKneel.png differ diff --git a/Models/LeatherPetsuit/LegsKneelClosed.png b/Models/LeatherPetsuit/LegsKneelClosed.png new file mode 100644 index 000000000..cd5364e25 Binary files /dev/null and b/Models/LeatherPetsuit/LegsKneelClosed.png differ diff --git a/Models/LeatherPetsuit/LegsLacesHogtie.png b/Models/LeatherPetsuit/LegsLacesHogtie.png new file mode 100644 index 000000000..983ae6a5d Binary files /dev/null and b/Models/LeatherPetsuit/LegsLacesHogtie.png differ diff --git a/Models/Legbinder/LacesLegbinderClosed.png b/Models/Legbinder/LacesLegbinderClosed.png new file mode 100644 index 000000000..f75f44ef9 Binary files /dev/null and b/Models/Legbinder/LacesLegbinderClosed.png differ diff --git a/Models/Legbinder/LacesLegbinderKneelClosed.png b/Models/Legbinder/LacesLegbinderKneelClosed.png new file mode 100644 index 000000000..6616a53bb Binary files /dev/null and b/Models/Legbinder/LacesLegbinderKneelClosed.png differ diff --git a/Models/Legbinder/LegLacesLegbinderClosed.png b/Models/Legbinder/LegLacesLegbinderClosed.png new file mode 100644 index 000000000..e6b2468f0 Binary files /dev/null and b/Models/Legbinder/LegLacesLegbinderClosed.png differ diff --git a/Models/Legbinder/LegLegbinderClosed.png b/Models/Legbinder/LegLegbinderClosed.png new file mode 100644 index 000000000..77d162a7c Binary files /dev/null and b/Models/Legbinder/LegLegbinderClosed.png differ diff --git a/Models/Legbinder/LegLegbinderHogtie.png b/Models/Legbinder/LegLegbinderHogtie.png new file mode 100644 index 000000000..111e7235b Binary files /dev/null and b/Models/Legbinder/LegLegbinderHogtie.png differ diff --git a/Models/Legbinder/LegLegbinderKneelClosed.png b/Models/Legbinder/LegLegbinderKneelClosed.png new file mode 100644 index 000000000..43769c123 Binary files /dev/null and b/Models/Legbinder/LegLegbinderKneelClosed.png differ diff --git a/Models/Legbinder/LegRightLegbinderClosed.png b/Models/Legbinder/LegRightLegbinderClosed.png new file mode 100644 index 000000000..c31bf1474 Binary files /dev/null and b/Models/Legbinder/LegRightLegbinderClosed.png differ diff --git a/Models/Legbinder/LegbinderClosed.png b/Models/Legbinder/LegbinderClosed.png new file mode 100644 index 000000000..89aba1072 Binary files /dev/null and b/Models/Legbinder/LegbinderClosed.png differ diff --git a/Models/Legbinder/LegbinderHogtie.png b/Models/Legbinder/LegbinderHogtie.png new file mode 100644 index 000000000..cce75a7f2 Binary files /dev/null and b/Models/Legbinder/LegbinderHogtie.png differ diff --git a/Models/Legbinder/LegbinderKneelClosed.png b/Models/Legbinder/LegbinderKneelClosed.png new file mode 100644 index 000000000..57f7e1eed Binary files /dev/null and b/Models/Legbinder/LegbinderKneelClosed.png differ diff --git a/Models/Legbinder/RightLacesLegbinderKneelClosed.png b/Models/Legbinder/RightLacesLegbinderKneelClosed.png new file mode 100644 index 000000000..095b03321 Binary files /dev/null and b/Models/Legbinder/RightLacesLegbinderKneelClosed.png differ diff --git a/Models/Legbinder/RightLegbinderClosed.png b/Models/Legbinder/RightLegbinderClosed.png new file mode 100644 index 000000000..1d55eed21 Binary files /dev/null and b/Models/Legbinder/RightLegbinderClosed.png differ diff --git a/Models/Legbinder/RightLegbinderHogtie.png b/Models/Legbinder/RightLegbinderHogtie.png new file mode 100644 index 000000000..4a4abd36e Binary files /dev/null and b/Models/Legbinder/RightLegbinderHogtie.png differ diff --git a/Models/Legbinder/RightLegbinderKneelClosed.png b/Models/Legbinder/RightLegbinderKneelClosed.png new file mode 100644 index 000000000..3db2ee21a Binary files /dev/null and b/Models/Legbinder/RightLegbinderKneelClosed.png differ diff --git a/Models/Maid/Apron.png b/Models/Maid/Apron.png new file mode 100644 index 000000000..f8cdd5a77 Binary files /dev/null and b/Models/Maid/Apron.png differ diff --git a/Models/Maid/ApronKneel.png b/Models/Maid/ApronKneel.png new file mode 100644 index 000000000..80748a429 Binary files /dev/null and b/Models/Maid/ApronKneel.png differ diff --git a/Models/Maid/Blouse.png b/Models/Maid/Blouse.png new file mode 100644 index 000000000..ba7296c9e Binary files /dev/null and b/Models/Maid/Blouse.png differ diff --git a/Models/Maid/BlouseBust.png b/Models/Maid/BlouseBust.png new file mode 100644 index 000000000..af31ba26f Binary files /dev/null and b/Models/Maid/BlouseBust.png differ diff --git a/Models/Maid/Bow.png b/Models/Maid/Bow.png new file mode 100644 index 000000000..8911fbce0 Binary files /dev/null and b/Models/Maid/Bow.png differ diff --git a/Models/Maid/Corset.png b/Models/Maid/Corset.png new file mode 100644 index 000000000..f7b6786d7 Binary files /dev/null and b/Models/Maid/Corset.png differ diff --git a/Models/Maid/CorsetStraps.png b/Models/Maid/CorsetStraps.png new file mode 100644 index 000000000..ba192bacc Binary files /dev/null and b/Models/Maid/CorsetStraps.png differ diff --git a/Models/Maid/CorsetStrapsBoxtie.png b/Models/Maid/CorsetStrapsBoxtie.png new file mode 100644 index 000000000..1b6a2f6e7 Binary files /dev/null and b/Models/Maid/CorsetStrapsBoxtie.png differ diff --git a/Models/Maid/CorsetStrapsUp.png b/Models/Maid/CorsetStrapsUp.png new file mode 100644 index 000000000..2482987c8 Binary files /dev/null and b/Models/Maid/CorsetStrapsUp.png differ diff --git a/Models/Maid/FootSockLeftHogtie.png b/Models/Maid/FootSockLeftHogtie.png new file mode 100644 index 000000000..7e5672c4b Binary files /dev/null and b/Models/Maid/FootSockLeftHogtie.png differ diff --git a/Models/Maid/FootSockRightKneel.png b/Models/Maid/FootSockRightKneel.png new file mode 100644 index 000000000..03325a8d1 Binary files /dev/null and b/Models/Maid/FootSockRightKneel.png differ diff --git a/Models/Maid/ShoeLeftClosed.png b/Models/Maid/ShoeLeftClosed.png new file mode 100644 index 000000000..cd8e6e930 Binary files /dev/null and b/Models/Maid/ShoeLeftClosed.png differ diff --git a/Models/Maid/ShoeLeftHogtie.png b/Models/Maid/ShoeLeftHogtie.png new file mode 100644 index 000000000..645015edf Binary files /dev/null and b/Models/Maid/ShoeLeftHogtie.png differ diff --git a/Models/Maid/ShoeLeftKneel.png b/Models/Maid/ShoeLeftKneel.png new file mode 100644 index 000000000..684949bc1 Binary files /dev/null and b/Models/Maid/ShoeLeftKneel.png differ diff --git a/Models/Maid/ShoeLeftKneelClosed.png b/Models/Maid/ShoeLeftKneelClosed.png new file mode 100644 index 000000000..051b679de Binary files /dev/null and b/Models/Maid/ShoeLeftKneelClosed.png differ diff --git a/Models/Maid/ShoeLeftSpread.png b/Models/Maid/ShoeLeftSpread.png new file mode 100644 index 000000000..ad4e0c261 Binary files /dev/null and b/Models/Maid/ShoeLeftSpread.png differ diff --git a/Models/Maid/ShoeRightClosed.png b/Models/Maid/ShoeRightClosed.png new file mode 100644 index 000000000..542d7fe19 Binary files /dev/null and b/Models/Maid/ShoeRightClosed.png differ diff --git a/Models/Maid/ShoeRightKneel.png b/Models/Maid/ShoeRightKneel.png new file mode 100644 index 000000000..e95251f71 Binary files /dev/null and b/Models/Maid/ShoeRightKneel.png differ diff --git a/Models/Maid/ShoeRightSpread.png b/Models/Maid/ShoeRightSpread.png new file mode 100644 index 000000000..2ed82bc67 Binary files /dev/null and b/Models/Maid/ShoeRightSpread.png differ diff --git a/Models/Maid/Skirt.png b/Models/Maid/Skirt.png new file mode 100644 index 000000000..751776146 Binary files /dev/null and b/Models/Maid/Skirt.png differ diff --git a/Models/Maid/SkirtClosed.png b/Models/Maid/SkirtClosed.png new file mode 100644 index 000000000..5e7c72e83 Binary files /dev/null and b/Models/Maid/SkirtClosed.png differ diff --git a/Models/Maid/SkirtClosedCrotchStrap.png b/Models/Maid/SkirtClosedCrotchStrap.png new file mode 100644 index 000000000..6eeba229b Binary files /dev/null and b/Models/Maid/SkirtClosedCrotchStrap.png differ diff --git a/Models/Maid/SkirtCrotchStrap.png b/Models/Maid/SkirtCrotchStrap.png new file mode 100644 index 000000000..0588a3d58 Binary files /dev/null and b/Models/Maid/SkirtCrotchStrap.png differ diff --git a/Models/Maid/SkirtKneel.png b/Models/Maid/SkirtKneel.png new file mode 100644 index 000000000..96c64cb9d Binary files /dev/null and b/Models/Maid/SkirtKneel.png differ diff --git a/Models/Maid/SkirtKneelCrotchStrap.png b/Models/Maid/SkirtKneelCrotchStrap.png new file mode 100644 index 000000000..9b4cda374 Binary files /dev/null and b/Models/Maid/SkirtKneelCrotchStrap.png differ diff --git a/Models/Maid/SkirtOverKneel.png b/Models/Maid/SkirtOverKneel.png new file mode 100644 index 000000000..1b12f03ef Binary files /dev/null and b/Models/Maid/SkirtOverKneel.png differ diff --git a/Models/Maid/SkirtOverKneelCrotchStrap.png b/Models/Maid/SkirtOverKneelCrotchStrap.png new file mode 100644 index 000000000..ec21608cb Binary files /dev/null and b/Models/Maid/SkirtOverKneelCrotchStrap.png differ diff --git a/Models/Maid/SockLeftClosed.png b/Models/Maid/SockLeftClosed.png new file mode 100644 index 000000000..e1342dd29 Binary files /dev/null and b/Models/Maid/SockLeftClosed.png differ diff --git a/Models/Maid/SockLeftHogtie.png b/Models/Maid/SockLeftHogtie.png new file mode 100644 index 000000000..e3ddfb827 Binary files /dev/null and b/Models/Maid/SockLeftHogtie.png differ diff --git a/Models/Maid/SockLeftKneel.png b/Models/Maid/SockLeftKneel.png new file mode 100644 index 000000000..2be817c6f Binary files /dev/null and b/Models/Maid/SockLeftKneel.png differ diff --git a/Models/Maid/SockLeftKneelClosed.png b/Models/Maid/SockLeftKneelClosed.png new file mode 100644 index 000000000..294551283 Binary files /dev/null and b/Models/Maid/SockLeftKneelClosed.png differ diff --git a/Models/Maid/SockLeftSpread.png b/Models/Maid/SockLeftSpread.png new file mode 100644 index 000000000..65f80c42d Binary files /dev/null and b/Models/Maid/SockLeftSpread.png differ diff --git a/Models/Maid/SockRightClosed.png b/Models/Maid/SockRightClosed.png new file mode 100644 index 000000000..7d076146d Binary files /dev/null and b/Models/Maid/SockRightClosed.png differ diff --git a/Models/Maid/SockRightHogtie.png b/Models/Maid/SockRightHogtie.png new file mode 100644 index 000000000..7f436dae2 Binary files /dev/null and b/Models/Maid/SockRightHogtie.png differ diff --git a/Models/Maid/SockRightKneel.png b/Models/Maid/SockRightKneel.png new file mode 100644 index 000000000..fc4b7d561 Binary files /dev/null and b/Models/Maid/SockRightKneel.png differ diff --git a/Models/Maid/SockRightKneelClosed.png b/Models/Maid/SockRightKneelClosed.png new file mode 100644 index 000000000..e59c83707 Binary files /dev/null and b/Models/Maid/SockRightKneelClosed.png differ diff --git a/Models/Maid/SockRightSpread.png b/Models/Maid/SockRightSpread.png new file mode 100644 index 000000000..84b690780 Binary files /dev/null and b/Models/Maid/SockRightSpread.png differ diff --git a/Models/Maid/Stripe.png b/Models/Maid/Stripe.png new file mode 100644 index 000000000..6d88a7fb5 Binary files /dev/null and b/Models/Maid/Stripe.png differ diff --git a/Models/Maid/StripeClosed.png b/Models/Maid/StripeClosed.png new file mode 100644 index 000000000..95b28aa24 Binary files /dev/null and b/Models/Maid/StripeClosed.png differ diff --git a/Models/Maid/StripeClosedCrotchStrap.png b/Models/Maid/StripeClosedCrotchStrap.png new file mode 100644 index 000000000..e47de5b41 Binary files /dev/null and b/Models/Maid/StripeClosedCrotchStrap.png differ diff --git a/Models/Maid/StripeCrotchStrap.png b/Models/Maid/StripeCrotchStrap.png new file mode 100644 index 000000000..45463b15f Binary files /dev/null and b/Models/Maid/StripeCrotchStrap.png differ diff --git a/Models/Maid/StripeKneel.png b/Models/Maid/StripeKneel.png new file mode 100644 index 000000000..4f2677785 Binary files /dev/null and b/Models/Maid/StripeKneel.png differ diff --git a/Models/Maid/StripeKneelCrotchStrap.png b/Models/Maid/StripeKneelCrotchStrap.png new file mode 100644 index 000000000..f4be90284 Binary files /dev/null and b/Models/Maid/StripeKneelCrotchStrap.png differ diff --git a/Models/Maid/StripeOverKneel.png b/Models/Maid/StripeOverKneel.png new file mode 100644 index 000000000..319ad4b5c Binary files /dev/null and b/Models/Maid/StripeOverKneel.png differ diff --git a/Models/Maid/StripeOverKneelCrotchStrap.png b/Models/Maid/StripeOverKneelCrotchStrap.png new file mode 100644 index 000000000..f32178db4 Binary files /dev/null and b/Models/Maid/StripeOverKneelCrotchStrap.png differ diff --git a/Models/Maid/StripeSockLeftClosed.png b/Models/Maid/StripeSockLeftClosed.png new file mode 100644 index 000000000..deddf7615 Binary files /dev/null and b/Models/Maid/StripeSockLeftClosed.png differ diff --git a/Models/Maid/StripeSockLeftHogtie.png b/Models/Maid/StripeSockLeftHogtie.png new file mode 100644 index 000000000..40fb3cbf1 Binary files /dev/null and b/Models/Maid/StripeSockLeftHogtie.png differ diff --git a/Models/Maid/StripeSockLeftKneel.png b/Models/Maid/StripeSockLeftKneel.png new file mode 100644 index 000000000..43a92c15d Binary files /dev/null and b/Models/Maid/StripeSockLeftKneel.png differ diff --git a/Models/Maid/StripeSockLeftKneelClosed.png b/Models/Maid/StripeSockLeftKneelClosed.png new file mode 100644 index 000000000..4841c1173 Binary files /dev/null and b/Models/Maid/StripeSockLeftKneelClosed.png differ diff --git a/Models/Maid/StripeSockLeftSpread.png b/Models/Maid/StripeSockLeftSpread.png new file mode 100644 index 000000000..4a5c56c32 Binary files /dev/null and b/Models/Maid/StripeSockLeftSpread.png differ diff --git a/Models/Maid/StripeSockRightClosed.png b/Models/Maid/StripeSockRightClosed.png new file mode 100644 index 000000000..8bb904c4f Binary files /dev/null and b/Models/Maid/StripeSockRightClosed.png differ diff --git a/Models/Maid/StripeSockRightHogtie.png b/Models/Maid/StripeSockRightHogtie.png new file mode 100644 index 000000000..e2e433b93 Binary files /dev/null and b/Models/Maid/StripeSockRightHogtie.png differ diff --git a/Models/Maid/StripeSockRightKneel.png b/Models/Maid/StripeSockRightKneel.png new file mode 100644 index 000000000..a625abc9f Binary files /dev/null and b/Models/Maid/StripeSockRightKneel.png differ diff --git a/Models/Maid/StripeSockRightKneelClosed.png b/Models/Maid/StripeSockRightKneelClosed.png new file mode 100644 index 000000000..e957fbbc1 Binary files /dev/null and b/Models/Maid/StripeSockRightKneelClosed.png differ diff --git a/Models/Maid/StripeSockRightSpread.png b/Models/Maid/StripeSockRightSpread.png new file mode 100644 index 000000000..88dbbd94a Binary files /dev/null and b/Models/Maid/StripeSockRightSpread.png differ diff --git a/Models/MaidKnightHeavy/Apron.png b/Models/MaidKnightHeavy/Apron.png new file mode 100644 index 000000000..04686f2e8 Binary files /dev/null and b/Models/MaidKnightHeavy/Apron.png differ diff --git a/Models/MaidKnightHeavy/ApronBelt.png b/Models/MaidKnightHeavy/ApronBelt.png new file mode 100644 index 000000000..8fcff9757 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronBelt.png differ diff --git a/Models/MaidKnightHeavy/ApronBeltHogtie.png b/Models/MaidKnightHeavy/ApronBeltHogtie.png new file mode 100644 index 000000000..18f275ee7 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronBeltHogtie.png differ diff --git a/Models/MaidKnightHeavy/ApronBeltKneel.png b/Models/MaidKnightHeavy/ApronBeltKneel.png new file mode 100644 index 000000000..d29dd2773 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronBeltKneel.png differ diff --git a/Models/MaidKnightHeavy/ApronChest.png b/Models/MaidKnightHeavy/ApronChest.png new file mode 100644 index 000000000..5d4154183 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronChest.png differ diff --git a/Models/MaidKnightHeavy/ApronChestBelts.png b/Models/MaidKnightHeavy/ApronChestBelts.png new file mode 100644 index 000000000..8187054d3 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronChestBelts.png differ diff --git a/Models/MaidKnightHeavy/ApronChestBeltsUp.png b/Models/MaidKnightHeavy/ApronChestBeltsUp.png new file mode 100644 index 000000000..598538e17 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronChestBeltsUp.png differ diff --git a/Models/MaidKnightHeavy/ApronChestRufflesBoxtie.png b/Models/MaidKnightHeavy/ApronChestRufflesBoxtie.png new file mode 100644 index 000000000..ece34ffd9 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronChestRufflesBoxtie.png differ diff --git a/Models/MaidKnightHeavy/ApronChestRufflesCrossed.png b/Models/MaidKnightHeavy/ApronChestRufflesCrossed.png new file mode 100644 index 000000000..d6b207dbb Binary files /dev/null and b/Models/MaidKnightHeavy/ApronChestRufflesCrossed.png differ diff --git a/Models/MaidKnightHeavy/ApronChestRufflesFree.png b/Models/MaidKnightHeavy/ApronChestRufflesFree.png new file mode 100644 index 000000000..43fed9e5f Binary files /dev/null and b/Models/MaidKnightHeavy/ApronChestRufflesFree.png differ diff --git a/Models/MaidKnightHeavy/ApronChestRufflesFront.png b/Models/MaidKnightHeavy/ApronChestRufflesFront.png new file mode 100644 index 000000000..ec6d8cb74 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronChestRufflesFront.png differ diff --git a/Models/MaidKnightHeavy/ApronChestRufflesUp.png b/Models/MaidKnightHeavy/ApronChestRufflesUp.png new file mode 100644 index 000000000..aaf017a42 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronChestRufflesUp.png differ diff --git a/Models/MaidKnightHeavy/ApronChestRufflesWristtie.png b/Models/MaidKnightHeavy/ApronChestRufflesWristtie.png new file mode 100644 index 000000000..beaa69576 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronChestRufflesWristtie.png differ diff --git a/Models/MaidKnightHeavy/ApronChestRufflesYoked.png b/Models/MaidKnightHeavy/ApronChestRufflesYoked.png new file mode 100644 index 000000000..5f64f87eb Binary files /dev/null and b/Models/MaidKnightHeavy/ApronChestRufflesYoked.png differ diff --git a/Models/MaidKnightHeavy/ApronCross.png b/Models/MaidKnightHeavy/ApronCross.png new file mode 100644 index 000000000..9af8afd4d Binary files /dev/null and b/Models/MaidKnightHeavy/ApronCross.png differ diff --git a/Models/MaidKnightHeavy/ApronCrossHogtie.png b/Models/MaidKnightHeavy/ApronCrossHogtie.png new file mode 100644 index 000000000..19c82563c Binary files /dev/null and b/Models/MaidKnightHeavy/ApronCrossHogtie.png differ diff --git a/Models/MaidKnightHeavy/ApronCrossKneel.png b/Models/MaidKnightHeavy/ApronCrossKneel.png new file mode 100644 index 000000000..0cf5b68c7 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronCrossKneel.png differ diff --git a/Models/MaidKnightHeavy/ApronHogtie.png b/Models/MaidKnightHeavy/ApronHogtie.png new file mode 100644 index 000000000..eec53b340 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronHogtie.png differ diff --git a/Models/MaidKnightHeavy/ApronKneel.png b/Models/MaidKnightHeavy/ApronKneel.png new file mode 100644 index 000000000..6f5ce49ed Binary files /dev/null and b/Models/MaidKnightHeavy/ApronKneel.png differ diff --git a/Models/MaidKnightHeavy/ApronMiniBow.png b/Models/MaidKnightHeavy/ApronMiniBow.png new file mode 100644 index 000000000..0b7b7f7d8 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronMiniBow.png differ diff --git a/Models/MaidKnightHeavy/ApronMiniBowHogtie.png b/Models/MaidKnightHeavy/ApronMiniBowHogtie.png new file mode 100644 index 000000000..f21216d97 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronMiniBowHogtie.png differ diff --git a/Models/MaidKnightHeavy/ApronMiniBowKneel.png b/Models/MaidKnightHeavy/ApronMiniBowKneel.png new file mode 100644 index 000000000..0f3a1b3dc Binary files /dev/null and b/Models/MaidKnightHeavy/ApronMiniBowKneel.png differ diff --git a/Models/MaidKnightHeavy/ApronPattern.png b/Models/MaidKnightHeavy/ApronPattern.png new file mode 100644 index 000000000..420821f0d Binary files /dev/null and b/Models/MaidKnightHeavy/ApronPattern.png differ diff --git a/Models/MaidKnightHeavy/ApronPatternHogtie.png b/Models/MaidKnightHeavy/ApronPatternHogtie.png new file mode 100644 index 000000000..cc70007d7 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronPatternHogtie.png differ diff --git a/Models/MaidKnightHeavy/ApronPatternKneel.png b/Models/MaidKnightHeavy/ApronPatternKneel.png new file mode 100644 index 000000000..36715f2be Binary files /dev/null and b/Models/MaidKnightHeavy/ApronPatternKneel.png differ diff --git a/Models/MaidKnightHeavy/ApronStripe.png b/Models/MaidKnightHeavy/ApronStripe.png new file mode 100644 index 000000000..cb51d3348 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronStripe.png differ diff --git a/Models/MaidKnightHeavy/ApronStripeHogtie.png b/Models/MaidKnightHeavy/ApronStripeHogtie.png new file mode 100644 index 000000000..98865443d Binary files /dev/null and b/Models/MaidKnightHeavy/ApronStripeHogtie.png differ diff --git a/Models/MaidKnightHeavy/ApronStripeKneel.png b/Models/MaidKnightHeavy/ApronStripeKneel.png new file mode 100644 index 000000000..66d170975 Binary files /dev/null and b/Models/MaidKnightHeavy/ApronStripeKneel.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftBoxtie.png b/Models/MaidKnightHeavy/ArmLeftBoxtie.png new file mode 100644 index 000000000..2ba18de83 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftBoxtie.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftCrossed.png b/Models/MaidKnightHeavy/ArmLeftCrossed.png new file mode 100644 index 000000000..1d706dfcf Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftCrossed.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftFree.png b/Models/MaidKnightHeavy/ArmLeftFree.png new file mode 100644 index 000000000..b6327e4fb Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftFree.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftFront.png b/Models/MaidKnightHeavy/ArmLeftFront.png new file mode 100644 index 000000000..2b076baaa Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftFront.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftStripeBoxtie.png b/Models/MaidKnightHeavy/ArmLeftStripeBoxtie.png new file mode 100644 index 000000000..a92471e7b Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftStripeBoxtie.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftStripeCrossed.png b/Models/MaidKnightHeavy/ArmLeftStripeCrossed.png new file mode 100644 index 000000000..0a1325d25 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftStripeCrossed.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftStripeFree.png b/Models/MaidKnightHeavy/ArmLeftStripeFree.png new file mode 100644 index 000000000..be13faee9 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftStripeFree.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftStripeFront.png b/Models/MaidKnightHeavy/ArmLeftStripeFront.png new file mode 100644 index 000000000..a46a68f88 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftStripeFront.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftStripeUp.png b/Models/MaidKnightHeavy/ArmLeftStripeUp.png new file mode 100644 index 000000000..553baf27a Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftStripeUp.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftStripeWristtie.png b/Models/MaidKnightHeavy/ArmLeftStripeWristtie.png new file mode 100644 index 000000000..29983ce7e Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftStripeWristtie.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftStripeYoked.png b/Models/MaidKnightHeavy/ArmLeftStripeYoked.png new file mode 100644 index 000000000..99fb75283 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftStripeYoked.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftUp.png b/Models/MaidKnightHeavy/ArmLeftUp.png new file mode 100644 index 000000000..396ad708d Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftUp.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftWristtie.png b/Models/MaidKnightHeavy/ArmLeftWristtie.png new file mode 100644 index 000000000..c602c3edb Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftWristtie.png differ diff --git a/Models/MaidKnightHeavy/ArmLeftYoked.png b/Models/MaidKnightHeavy/ArmLeftYoked.png new file mode 100644 index 000000000..4ae6a6cf2 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmLeftYoked.png differ diff --git a/Models/MaidKnightHeavy/ArmRightBoxtie.png b/Models/MaidKnightHeavy/ArmRightBoxtie.png new file mode 100644 index 000000000..27d86d8a2 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightBoxtie.png differ diff --git a/Models/MaidKnightHeavy/ArmRightCrossed.png b/Models/MaidKnightHeavy/ArmRightCrossed.png new file mode 100644 index 000000000..20e2a7dd6 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightCrossed.png differ diff --git a/Models/MaidKnightHeavy/ArmRightFree.png b/Models/MaidKnightHeavy/ArmRightFree.png new file mode 100644 index 000000000..3a151974a Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightFree.png differ diff --git a/Models/MaidKnightHeavy/ArmRightFront.png b/Models/MaidKnightHeavy/ArmRightFront.png new file mode 100644 index 000000000..490c8a637 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightFront.png differ diff --git a/Models/MaidKnightHeavy/ArmRightStripeBoxtie.png b/Models/MaidKnightHeavy/ArmRightStripeBoxtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightStripeBoxtie.png differ diff --git a/Models/MaidKnightHeavy/ArmRightStripeCrossed.png b/Models/MaidKnightHeavy/ArmRightStripeCrossed.png new file mode 100644 index 000000000..2268b9953 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightStripeCrossed.png differ diff --git a/Models/MaidKnightHeavy/ArmRightStripeFree.png b/Models/MaidKnightHeavy/ArmRightStripeFree.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightStripeFree.png differ diff --git a/Models/MaidKnightHeavy/ArmRightStripeFront.png b/Models/MaidKnightHeavy/ArmRightStripeFront.png new file mode 100644 index 000000000..2268b9953 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightStripeFront.png differ diff --git a/Models/MaidKnightHeavy/ArmRightStripeUp.png b/Models/MaidKnightHeavy/ArmRightStripeUp.png new file mode 100644 index 000000000..e2a59ba58 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightStripeUp.png differ diff --git a/Models/MaidKnightHeavy/ArmRightStripeWristtie.png b/Models/MaidKnightHeavy/ArmRightStripeWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightStripeWristtie.png differ diff --git a/Models/MaidKnightHeavy/ArmRightStripeYoked.png b/Models/MaidKnightHeavy/ArmRightStripeYoked.png new file mode 100644 index 000000000..931e58552 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightStripeYoked.png differ diff --git a/Models/MaidKnightHeavy/ArmRightUp.png b/Models/MaidKnightHeavy/ArmRightUp.png new file mode 100644 index 000000000..61b790ddb Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightUp.png differ diff --git a/Models/MaidKnightHeavy/ArmRightWristtie.png b/Models/MaidKnightHeavy/ArmRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightWristtie.png differ diff --git a/Models/MaidKnightHeavy/ArmRightYoked.png b/Models/MaidKnightHeavy/ArmRightYoked.png new file mode 100644 index 000000000..7bbac0b3c Binary files /dev/null and b/Models/MaidKnightHeavy/ArmRightYoked.png differ diff --git a/Models/MaidKnightHeavy/Belts.png b/Models/MaidKnightHeavy/Belts.png new file mode 100644 index 000000000..37ff39734 Binary files /dev/null and b/Models/MaidKnightHeavy/Belts.png differ diff --git a/Models/MaidKnightHeavy/BeltsHardware.png b/Models/MaidKnightHeavy/BeltsHardware.png new file mode 100644 index 000000000..989dfdf17 Binary files /dev/null and b/Models/MaidKnightHeavy/BeltsHardware.png differ diff --git a/Models/MaidKnightHeavy/BootLeftClosed.png b/Models/MaidKnightHeavy/BootLeftClosed.png new file mode 100644 index 000000000..30eebf1a3 Binary files /dev/null and b/Models/MaidKnightHeavy/BootLeftClosed.png differ diff --git a/Models/MaidKnightHeavy/BootLeftHogtie.png b/Models/MaidKnightHeavy/BootLeftHogtie.png new file mode 100644 index 000000000..8f95ec04c Binary files /dev/null and b/Models/MaidKnightHeavy/BootLeftHogtie.png differ diff --git a/Models/MaidKnightHeavy/BootLeftKneel.png b/Models/MaidKnightHeavy/BootLeftKneel.png new file mode 100644 index 000000000..4fe8cf00d Binary files /dev/null and b/Models/MaidKnightHeavy/BootLeftKneel.png differ diff --git a/Models/MaidKnightHeavy/BootLeftKneelClosed.png b/Models/MaidKnightHeavy/BootLeftKneelClosed.png new file mode 100644 index 000000000..e520a760c Binary files /dev/null and b/Models/MaidKnightHeavy/BootLeftKneelClosed.png differ diff --git a/Models/MaidKnightHeavy/BootLeftSpread.png b/Models/MaidKnightHeavy/BootLeftSpread.png new file mode 100644 index 000000000..9eec8964c Binary files /dev/null and b/Models/MaidKnightHeavy/BootLeftSpread.png differ diff --git a/Models/MaidKnightHeavy/BootLegLeftClosed.png b/Models/MaidKnightHeavy/BootLegLeftClosed.png new file mode 100644 index 000000000..4fa495242 Binary files /dev/null and b/Models/MaidKnightHeavy/BootLegLeftClosed.png differ diff --git a/Models/MaidKnightHeavy/BootLegLeftHogtie.png b/Models/MaidKnightHeavy/BootLegLeftHogtie.png new file mode 100644 index 000000000..69774003d Binary files /dev/null and b/Models/MaidKnightHeavy/BootLegLeftHogtie.png differ diff --git a/Models/MaidKnightHeavy/BootLegLeftKneel.png b/Models/MaidKnightHeavy/BootLegLeftKneel.png new file mode 100644 index 000000000..eb057cef7 Binary files /dev/null and b/Models/MaidKnightHeavy/BootLegLeftKneel.png differ diff --git a/Models/MaidKnightHeavy/BootLegLeftKneelClosed.png b/Models/MaidKnightHeavy/BootLegLeftKneelClosed.png new file mode 100644 index 000000000..9df2dba97 Binary files /dev/null and b/Models/MaidKnightHeavy/BootLegLeftKneelClosed.png differ diff --git a/Models/MaidKnightHeavy/BootLegLeftSpread.png b/Models/MaidKnightHeavy/BootLegLeftSpread.png new file mode 100644 index 000000000..6bf17a977 Binary files /dev/null and b/Models/MaidKnightHeavy/BootLegLeftSpread.png differ diff --git a/Models/MaidKnightHeavy/BootLegRightClosed.png b/Models/MaidKnightHeavy/BootLegRightClosed.png new file mode 100644 index 000000000..eeb0bf642 Binary files /dev/null and b/Models/MaidKnightHeavy/BootLegRightClosed.png differ diff --git a/Models/MaidKnightHeavy/BootLegRightHogtie.png b/Models/MaidKnightHeavy/BootLegRightHogtie.png new file mode 100644 index 000000000..377344c43 Binary files /dev/null and b/Models/MaidKnightHeavy/BootLegRightHogtie.png differ diff --git a/Models/MaidKnightHeavy/BootLegRightKneel.png b/Models/MaidKnightHeavy/BootLegRightKneel.png new file mode 100644 index 000000000..ddc13350f Binary files /dev/null and b/Models/MaidKnightHeavy/BootLegRightKneel.png differ diff --git a/Models/MaidKnightHeavy/BootLegRightKneelClosed.png b/Models/MaidKnightHeavy/BootLegRightKneelClosed.png new file mode 100644 index 000000000..59da48e4a Binary files /dev/null and b/Models/MaidKnightHeavy/BootLegRightKneelClosed.png differ diff --git a/Models/MaidKnightHeavy/BootLegRightSpread.png b/Models/MaidKnightHeavy/BootLegRightSpread.png new file mode 100644 index 000000000..6661bb798 Binary files /dev/null and b/Models/MaidKnightHeavy/BootLegRightSpread.png differ diff --git a/Models/MaidKnightHeavy/BootRightClosed.png b/Models/MaidKnightHeavy/BootRightClosed.png new file mode 100644 index 000000000..7caeab8b2 Binary files /dev/null and b/Models/MaidKnightHeavy/BootRightClosed.png differ diff --git a/Models/MaidKnightHeavy/BootRightKneel.png b/Models/MaidKnightHeavy/BootRightKneel.png new file mode 100644 index 000000000..68f0964ea Binary files /dev/null and b/Models/MaidKnightHeavy/BootRightKneel.png differ diff --git a/Models/MaidKnightHeavy/BootRightSpread.png b/Models/MaidKnightHeavy/BootRightSpread.png new file mode 100644 index 000000000..c2a22a2cf Binary files /dev/null and b/Models/MaidKnightHeavy/BootRightSpread.png differ diff --git a/Models/MaidKnightHeavy/BootShoeLeftClosed.png b/Models/MaidKnightHeavy/BootShoeLeftClosed.png new file mode 100644 index 000000000..074fdf045 Binary files /dev/null and b/Models/MaidKnightHeavy/BootShoeLeftClosed.png differ diff --git a/Models/MaidKnightHeavy/BootShoeLeftKneel.png b/Models/MaidKnightHeavy/BootShoeLeftKneel.png new file mode 100644 index 000000000..c645c52ad Binary files /dev/null and b/Models/MaidKnightHeavy/BootShoeLeftKneel.png differ diff --git a/Models/MaidKnightHeavy/BootShoeLeftKneelClosed.png b/Models/MaidKnightHeavy/BootShoeLeftKneelClosed.png new file mode 100644 index 000000000..2d62a1e26 Binary files /dev/null and b/Models/MaidKnightHeavy/BootShoeLeftKneelClosed.png differ diff --git a/Models/MaidKnightHeavy/BootShoeLeftSpread.png b/Models/MaidKnightHeavy/BootShoeLeftSpread.png new file mode 100644 index 000000000..252ba4f8f Binary files /dev/null and b/Models/MaidKnightHeavy/BootShoeLeftSpread.png differ diff --git a/Models/MaidKnightHeavy/BootShoeRightClosed.png b/Models/MaidKnightHeavy/BootShoeRightClosed.png new file mode 100644 index 000000000..40574ff27 Binary files /dev/null and b/Models/MaidKnightHeavy/BootShoeRightClosed.png differ diff --git a/Models/MaidKnightHeavy/BootShoeRightSpread.png b/Models/MaidKnightHeavy/BootShoeRightSpread.png new file mode 100644 index 000000000..98660aa5f Binary files /dev/null and b/Models/MaidKnightHeavy/BootShoeRightSpread.png differ diff --git a/Models/MaidKnightHeavy/ChestArmor.png b/Models/MaidKnightHeavy/ChestArmor.png new file mode 100644 index 000000000..73ca79e35 Binary files /dev/null and b/Models/MaidKnightHeavy/ChestArmor.png differ diff --git a/Models/MaidKnightHeavy/Corset.png b/Models/MaidKnightHeavy/Corset.png new file mode 100644 index 000000000..c28187cff Binary files /dev/null and b/Models/MaidKnightHeavy/Corset.png differ diff --git a/Models/MaidKnightHeavy/CorsetOrig.png b/Models/MaidKnightHeavy/CorsetOrig.png new file mode 100644 index 000000000..c23b830fa Binary files /dev/null and b/Models/MaidKnightHeavy/CorsetOrig.png differ diff --git a/Models/MaidKnightHeavy/Dress.png b/Models/MaidKnightHeavy/Dress.png new file mode 100644 index 000000000..48a8e69ff Binary files /dev/null and b/Models/MaidKnightHeavy/Dress.png differ diff --git a/Models/MaidKnightHeavy/DressChestBoxtie.png b/Models/MaidKnightHeavy/DressChestBoxtie.png new file mode 100644 index 000000000..07809b864 Binary files /dev/null and b/Models/MaidKnightHeavy/DressChestBoxtie.png differ diff --git a/Models/MaidKnightHeavy/DressChestFree.png b/Models/MaidKnightHeavy/DressChestFree.png new file mode 100644 index 000000000..17a3c740f Binary files /dev/null and b/Models/MaidKnightHeavy/DressChestFree.png differ diff --git a/Models/MaidKnightHeavy/DressChestUp.png b/Models/MaidKnightHeavy/DressChestUp.png new file mode 100644 index 000000000..23f91a15f Binary files /dev/null and b/Models/MaidKnightHeavy/DressChestUp.png differ diff --git a/Models/MaidKnightHeavy/DressChestWristtie.png b/Models/MaidKnightHeavy/DressChestWristtie.png new file mode 100644 index 000000000..92683c63d Binary files /dev/null and b/Models/MaidKnightHeavy/DressChestWristtie.png differ diff --git a/Models/MaidKnightHeavy/DressChestYoked.png b/Models/MaidKnightHeavy/DressChestYoked.png new file mode 100644 index 000000000..70518e3f4 Binary files /dev/null and b/Models/MaidKnightHeavy/DressChestYoked.png differ diff --git a/Models/MaidKnightHeavy/DressSkirt.png b/Models/MaidKnightHeavy/DressSkirt.png new file mode 100644 index 000000000..6b8e57647 Binary files /dev/null and b/Models/MaidKnightHeavy/DressSkirt.png differ diff --git a/Models/MaidKnightHeavy/DressSkirtHem.png b/Models/MaidKnightHeavy/DressSkirtHem.png new file mode 100644 index 000000000..9b426b500 Binary files /dev/null and b/Models/MaidKnightHeavy/DressSkirtHem.png differ diff --git a/Models/MaidKnightHeavy/DressSkirtHemHogtie.png b/Models/MaidKnightHeavy/DressSkirtHemHogtie.png new file mode 100644 index 000000000..ddc674d1a Binary files /dev/null and b/Models/MaidKnightHeavy/DressSkirtHemHogtie.png differ diff --git a/Models/MaidKnightHeavy/DressSkirtHemKneel.png b/Models/MaidKnightHeavy/DressSkirtHemKneel.png new file mode 100644 index 000000000..0a70c92b8 Binary files /dev/null and b/Models/MaidKnightHeavy/DressSkirtHemKneel.png differ diff --git a/Models/MaidKnightHeavy/DressSkirtHogtie.png b/Models/MaidKnightHeavy/DressSkirtHogtie.png new file mode 100644 index 000000000..6a24068ae Binary files /dev/null and b/Models/MaidKnightHeavy/DressSkirtHogtie.png differ diff --git a/Models/MaidKnightHeavy/DressSkirtKneel.png b/Models/MaidKnightHeavy/DressSkirtKneel.png new file mode 100644 index 000000000..8f487e38e Binary files /dev/null and b/Models/MaidKnightHeavy/DressSkirtKneel.png differ diff --git a/Models/MaidKnightHeavy/DressSkirtStripe.png b/Models/MaidKnightHeavy/DressSkirtStripe.png new file mode 100644 index 000000000..91c59ca94 Binary files /dev/null and b/Models/MaidKnightHeavy/DressSkirtStripe.png differ diff --git a/Models/MaidKnightHeavy/DressSkirtStripeHogtie.png b/Models/MaidKnightHeavy/DressSkirtStripeHogtie.png new file mode 100644 index 000000000..d09742e44 Binary files /dev/null and b/Models/MaidKnightHeavy/DressSkirtStripeHogtie.png differ diff --git a/Models/MaidKnightHeavy/DressSkirtStripeKneel.png b/Models/MaidKnightHeavy/DressSkirtStripeKneel.png new file mode 100644 index 000000000..793ea2da6 Binary files /dev/null and b/Models/MaidKnightHeavy/DressSkirtStripeKneel.png differ diff --git a/Models/MaidKnightHeavy/FootBootLeftHogtie.png b/Models/MaidKnightHeavy/FootBootLeftHogtie.png new file mode 100644 index 000000000..fd08abd90 Binary files /dev/null and b/Models/MaidKnightHeavy/FootBootLeftHogtie.png differ diff --git a/Models/MaidKnightHeavy/FootSockLeftHogtie.png b/Models/MaidKnightHeavy/FootSockLeftHogtie.png new file mode 100644 index 000000000..3fc1ec923 Binary files /dev/null and b/Models/MaidKnightHeavy/FootSockLeftHogtie.png differ diff --git a/Models/MaidKnightHeavy/FootSockRightKneel.png b/Models/MaidKnightHeavy/FootSockRightKneel.png new file mode 100644 index 000000000..17a2e276a Binary files /dev/null and b/Models/MaidKnightHeavy/FootSockRightKneel.png differ diff --git a/Models/MaidKnightHeavy/ForeArmLeftCrossed.png b/Models/MaidKnightHeavy/ForeArmLeftCrossed.png new file mode 100644 index 000000000..b05d0f305 Binary files /dev/null and b/Models/MaidKnightHeavy/ForeArmLeftCrossed.png differ diff --git a/Models/MaidKnightHeavy/ForeArmLeftFront.png b/Models/MaidKnightHeavy/ForeArmLeftFront.png new file mode 100644 index 000000000..89fb390af Binary files /dev/null and b/Models/MaidKnightHeavy/ForeArmLeftFront.png differ diff --git a/Models/MaidKnightHeavy/ForeArmRightCrossed.png b/Models/MaidKnightHeavy/ForeArmRightCrossed.png new file mode 100644 index 000000000..19183b792 Binary files /dev/null and b/Models/MaidKnightHeavy/ForeArmRightCrossed.png differ diff --git a/Models/MaidKnightHeavy/ForeArmRightFront.png b/Models/MaidKnightHeavy/ForeArmRightFront.png new file mode 100644 index 000000000..161a75d21 Binary files /dev/null and b/Models/MaidKnightHeavy/ForeArmRightFront.png differ diff --git a/Models/MaidKnightHeavy/GauntletLeftBoxtie.png b/Models/MaidKnightHeavy/GauntletLeftBoxtie.png new file mode 100644 index 000000000..6ad0c41d8 Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletLeftBoxtie.png differ diff --git a/Models/MaidKnightHeavy/GauntletLeftCrossed.png b/Models/MaidKnightHeavy/GauntletLeftCrossed.png new file mode 100644 index 000000000..caa7c2113 Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletLeftCrossed.png differ diff --git a/Models/MaidKnightHeavy/GauntletLeftFree.png b/Models/MaidKnightHeavy/GauntletLeftFree.png new file mode 100644 index 000000000..b109fe7dd Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletLeftFree.png differ diff --git a/Models/MaidKnightHeavy/GauntletLeftFront.png b/Models/MaidKnightHeavy/GauntletLeftFront.png new file mode 100644 index 000000000..6463b017b Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletLeftFront.png differ diff --git a/Models/MaidKnightHeavy/GauntletLeftUp.png b/Models/MaidKnightHeavy/GauntletLeftUp.png new file mode 100644 index 000000000..2a11393fe Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletLeftUp.png differ diff --git a/Models/MaidKnightHeavy/GauntletLeftWristtie.png b/Models/MaidKnightHeavy/GauntletLeftWristtie.png new file mode 100644 index 000000000..b28d7fd1c Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletLeftWristtie.png differ diff --git a/Models/MaidKnightHeavy/GauntletLeftYoked.png b/Models/MaidKnightHeavy/GauntletLeftYoked.png new file mode 100644 index 000000000..00302ed51 Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletLeftYoked.png differ diff --git a/Models/MaidKnightHeavy/GauntletRightCrossed.png b/Models/MaidKnightHeavy/GauntletRightCrossed.png new file mode 100644 index 000000000..65c2c3184 Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletRightCrossed.png differ diff --git a/Models/MaidKnightHeavy/GauntletRightFree.png b/Models/MaidKnightHeavy/GauntletRightFree.png new file mode 100644 index 000000000..132c2dbcb Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletRightFree.png differ diff --git a/Models/MaidKnightHeavy/GauntletRightFront.png b/Models/MaidKnightHeavy/GauntletRightFront.png new file mode 100644 index 000000000..44ade3ab0 Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletRightFront.png differ diff --git a/Models/MaidKnightHeavy/GauntletRightUp.png b/Models/MaidKnightHeavy/GauntletRightUp.png new file mode 100644 index 000000000..a4d6cddfa Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletRightUp.png differ diff --git a/Models/MaidKnightHeavy/GauntletRightYoked.png b/Models/MaidKnightHeavy/GauntletRightYoked.png new file mode 100644 index 000000000..08a7fa4bc Binary files /dev/null and b/Models/MaidKnightHeavy/GauntletRightYoked.png differ diff --git a/Models/MaidKnightHeavy/GloveLeftFree.png b/Models/MaidKnightHeavy/GloveLeftFree.png new file mode 100644 index 000000000..233da0ce7 Binary files /dev/null and b/Models/MaidKnightHeavy/GloveLeftFree.png differ diff --git a/Models/MaidKnightHeavy/GloveLeftFront.png b/Models/MaidKnightHeavy/GloveLeftFront.png new file mode 100644 index 000000000..45cdf713a Binary files /dev/null and b/Models/MaidKnightHeavy/GloveLeftFront.png differ diff --git a/Models/MaidKnightHeavy/GloveLeftYoked.png b/Models/MaidKnightHeavy/GloveLeftYoked.png new file mode 100644 index 000000000..c156626f8 Binary files /dev/null and b/Models/MaidKnightHeavy/GloveLeftYoked.png differ diff --git a/Models/MaidKnightHeavy/GloveRightBoxtie.png b/Models/MaidKnightHeavy/GloveRightBoxtie.png new file mode 100644 index 000000000..dfa5585a5 Binary files /dev/null and b/Models/MaidKnightHeavy/GloveRightBoxtie.png differ diff --git a/Models/MaidKnightHeavy/GloveRightCrossed.png b/Models/MaidKnightHeavy/GloveRightCrossed.png new file mode 100644 index 000000000..e8e0376c8 Binary files /dev/null and b/Models/MaidKnightHeavy/GloveRightCrossed.png differ diff --git a/Models/MaidKnightHeavy/GloveRightFree.png b/Models/MaidKnightHeavy/GloveRightFree.png new file mode 100644 index 000000000..57f24e1da Binary files /dev/null and b/Models/MaidKnightHeavy/GloveRightFree.png differ diff --git a/Models/MaidKnightHeavy/GloveRightFront.png b/Models/MaidKnightHeavy/GloveRightFront.png new file mode 100644 index 000000000..53c1299fd Binary files /dev/null and b/Models/MaidKnightHeavy/GloveRightFront.png differ diff --git a/Models/MaidKnightHeavy/GloveRightYoked.png b/Models/MaidKnightHeavy/GloveRightYoked.png new file mode 100644 index 000000000..2e6e3c702 Binary files /dev/null and b/Models/MaidKnightHeavy/GloveRightYoked.png differ diff --git a/Models/MaidKnightHeavy/Headband.png b/Models/MaidKnightHeavy/Headband.png new file mode 100644 index 000000000..2b56f0365 Binary files /dev/null and b/Models/MaidKnightHeavy/Headband.png differ diff --git a/Models/MaidKnightHeavy/HeadbandFrill.png b/Models/MaidKnightHeavy/HeadbandFrill.png new file mode 100644 index 000000000..24262141a Binary files /dev/null and b/Models/MaidKnightHeavy/HeadbandFrill.png differ diff --git a/Models/MaidKnightHeavy/HeadbandRibbon.png b/Models/MaidKnightHeavy/HeadbandRibbon.png new file mode 100644 index 000000000..d169f3cc4 Binary files /dev/null and b/Models/MaidKnightHeavy/HeadbandRibbon.png differ diff --git a/Models/MaidKnightHeavy/HeadbandRibbonBack.png b/Models/MaidKnightHeavy/HeadbandRibbonBack.png new file mode 100644 index 000000000..bae799201 Binary files /dev/null and b/Models/MaidKnightHeavy/HeadbandRibbonBack.png differ diff --git a/Models/MaidKnightHeavy/PantyhoseClosed.png b/Models/MaidKnightHeavy/PantyhoseClosed.png new file mode 100644 index 000000000..2cf0f0b8e Binary files /dev/null and b/Models/MaidKnightHeavy/PantyhoseClosed.png differ diff --git a/Models/MaidKnightHeavy/PantyhoseHogtie.png b/Models/MaidKnightHeavy/PantyhoseHogtie.png new file mode 100644 index 000000000..2cf0f0b8e Binary files /dev/null and b/Models/MaidKnightHeavy/PantyhoseHogtie.png differ diff --git a/Models/MaidKnightHeavy/PantyhoseKneel.png b/Models/MaidKnightHeavy/PantyhoseKneel.png new file mode 100644 index 000000000..cab5f048d Binary files /dev/null and b/Models/MaidKnightHeavy/PantyhoseKneel.png differ diff --git a/Models/MaidKnightHeavy/PantyhoseKneelClosed.png b/Models/MaidKnightHeavy/PantyhoseKneelClosed.png new file mode 100644 index 000000000..cab5f048d Binary files /dev/null and b/Models/MaidKnightHeavy/PantyhoseKneelClosed.png differ diff --git a/Models/MaidKnightHeavy/PantyhoseSpread.png b/Models/MaidKnightHeavy/PantyhoseSpread.png new file mode 100644 index 000000000..1ad4ca586 Binary files /dev/null and b/Models/MaidKnightHeavy/PantyhoseSpread.png differ diff --git a/Models/MaidKnightHeavy/PauldronLeft.png b/Models/MaidKnightHeavy/PauldronLeft.png new file mode 100644 index 000000000..258490f3f Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronLeft.png differ diff --git a/Models/MaidKnightHeavy/PauldronLeftHardware.png b/Models/MaidKnightHeavy/PauldronLeftHardware.png new file mode 100644 index 000000000..cc8fb9c47 Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronLeftHardware.png differ diff --git a/Models/MaidKnightHeavy/PauldronLeftHardwareUp.png b/Models/MaidKnightHeavy/PauldronLeftHardwareUp.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronLeftHardwareUp.png differ diff --git a/Models/MaidKnightHeavy/PauldronLeftHardwareYoked.png b/Models/MaidKnightHeavy/PauldronLeftHardwareYoked.png new file mode 100644 index 000000000..8427166f3 Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronLeftHardwareYoked.png differ diff --git a/Models/MaidKnightHeavy/PauldronLeftStraps.png b/Models/MaidKnightHeavy/PauldronLeftStraps.png new file mode 100644 index 000000000..eb73dc18c Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronLeftStraps.png differ diff --git a/Models/MaidKnightHeavy/PauldronLeftStrapsUp.png b/Models/MaidKnightHeavy/PauldronLeftStrapsUp.png new file mode 100644 index 000000000..b0a6588ad Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronLeftStrapsUp.png differ diff --git a/Models/MaidKnightHeavy/PauldronLeftStrapsYoked.png b/Models/MaidKnightHeavy/PauldronLeftStrapsYoked.png new file mode 100644 index 000000000..5802748f6 Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronLeftStrapsYoked.png differ diff --git a/Models/MaidKnightHeavy/PauldronLeftUp.png b/Models/MaidKnightHeavy/PauldronLeftUp.png new file mode 100644 index 000000000..0d478ea65 Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronLeftUp.png differ diff --git a/Models/MaidKnightHeavy/PauldronLeftYoked.png b/Models/MaidKnightHeavy/PauldronLeftYoked.png new file mode 100644 index 000000000..913407b22 Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronLeftYoked.png differ diff --git a/Models/MaidKnightHeavy/PauldronRight.png b/Models/MaidKnightHeavy/PauldronRight.png new file mode 100644 index 000000000..bd03f0310 Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronRight.png differ diff --git a/Models/MaidKnightHeavy/PauldronRightStraps.png b/Models/MaidKnightHeavy/PauldronRightStraps.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronRightStraps.png differ diff --git a/Models/MaidKnightHeavy/PauldronRightStrapsUp.png b/Models/MaidKnightHeavy/PauldronRightStrapsUp.png new file mode 100644 index 000000000..216f40770 Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronRightStrapsUp.png differ diff --git a/Models/MaidKnightHeavy/PauldronRightStrapsYoked.png b/Models/MaidKnightHeavy/PauldronRightStrapsYoked.png new file mode 100644 index 000000000..d621afc3a Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronRightStrapsYoked.png differ diff --git a/Models/MaidKnightHeavy/PauldronRightUp.png b/Models/MaidKnightHeavy/PauldronRightUp.png new file mode 100644 index 000000000..4bb07680e Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronRightUp.png differ diff --git a/Models/MaidKnightHeavy/PauldronRightYoked.png b/Models/MaidKnightHeavy/PauldronRightYoked.png new file mode 100644 index 000000000..e1c4ed0cf Binary files /dev/null and b/Models/MaidKnightHeavy/PauldronRightYoked.png differ diff --git a/Models/MaidKnightHeavy/Pouches.png b/Models/MaidKnightHeavy/Pouches.png new file mode 100644 index 000000000..9b953b809 Binary files /dev/null and b/Models/MaidKnightHeavy/Pouches.png differ diff --git a/Models/MaidKnightHeavy/ShoulderRightUp.png b/Models/MaidKnightHeavy/ShoulderRightUp.png new file mode 100644 index 000000000..9e9fdaf56 Binary files /dev/null and b/Models/MaidKnightHeavy/ShoulderRightUp.png differ diff --git a/Models/MaidKnightHeavy/SideArmor.png b/Models/MaidKnightHeavy/SideArmor.png new file mode 100644 index 000000000..7fecee4bc Binary files /dev/null and b/Models/MaidKnightHeavy/SideArmor.png differ diff --git a/Models/MaidKnightHeavy/SleeveLeftBoxtie.png b/Models/MaidKnightHeavy/SleeveLeftBoxtie.png new file mode 100644 index 000000000..1a9403888 Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveLeftBoxtie.png differ diff --git a/Models/MaidKnightHeavy/SleeveLeftCrossed.png b/Models/MaidKnightHeavy/SleeveLeftCrossed.png new file mode 100644 index 000000000..f1fc96a57 Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveLeftCrossed.png differ diff --git a/Models/MaidKnightHeavy/SleeveLeftFree.png b/Models/MaidKnightHeavy/SleeveLeftFree.png new file mode 100644 index 000000000..e265d6938 Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveLeftFree.png differ diff --git a/Models/MaidKnightHeavy/SleeveLeftFront.png b/Models/MaidKnightHeavy/SleeveLeftFront.png new file mode 100644 index 000000000..191527d42 Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveLeftFront.png differ diff --git a/Models/MaidKnightHeavy/SleeveLeftStripeFree.png b/Models/MaidKnightHeavy/SleeveLeftStripeFree.png new file mode 100644 index 000000000..e8b4912aa Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveLeftStripeFree.png differ diff --git a/Models/MaidKnightHeavy/SleeveLeftUp.png b/Models/MaidKnightHeavy/SleeveLeftUp.png new file mode 100644 index 000000000..c8e70e2db Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveLeftUp.png differ diff --git a/Models/MaidKnightHeavy/SleeveLeftWristtie.png b/Models/MaidKnightHeavy/SleeveLeftWristtie.png new file mode 100644 index 000000000..e6441452e Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveLeftWristtie.png differ diff --git a/Models/MaidKnightHeavy/SleeveLeftYoked.png b/Models/MaidKnightHeavy/SleeveLeftYoked.png new file mode 100644 index 000000000..1085588e8 Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveLeftYoked.png differ diff --git a/Models/MaidKnightHeavy/SleeveRightBoxtie.png b/Models/MaidKnightHeavy/SleeveRightBoxtie.png new file mode 100644 index 000000000..71a69d09b Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveRightBoxtie.png differ diff --git a/Models/MaidKnightHeavy/SleeveRightCrossed.png b/Models/MaidKnightHeavy/SleeveRightCrossed.png new file mode 100644 index 000000000..b8276cd22 Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveRightCrossed.png differ diff --git a/Models/MaidKnightHeavy/SleeveRightFree.png b/Models/MaidKnightHeavy/SleeveRightFree.png new file mode 100644 index 000000000..06b10d9cc Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveRightFree.png differ diff --git a/Models/MaidKnightHeavy/SleeveRightFront.png b/Models/MaidKnightHeavy/SleeveRightFront.png new file mode 100644 index 000000000..89d82dbba Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveRightFront.png differ diff --git a/Models/MaidKnightHeavy/SleeveRightStripeFree.png b/Models/MaidKnightHeavy/SleeveRightStripeFree.png new file mode 100644 index 000000000..ee9ae29c1 Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveRightStripeFree.png differ diff --git a/Models/MaidKnightHeavy/SleeveRightUp.png b/Models/MaidKnightHeavy/SleeveRightUp.png new file mode 100644 index 000000000..cb505f3aa Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveRightUp.png differ diff --git a/Models/MaidKnightHeavy/SleeveRightWristtie.png b/Models/MaidKnightHeavy/SleeveRightWristtie.png new file mode 100644 index 000000000..f90d0836c Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveRightWristtie.png differ diff --git a/Models/MaidKnightHeavy/SleeveRightYoked.png b/Models/MaidKnightHeavy/SleeveRightYoked.png new file mode 100644 index 000000000..9519025c8 Binary files /dev/null and b/Models/MaidKnightHeavy/SleeveRightYoked.png differ diff --git a/Models/MaidKnightHeavy/SockLeftClosed.png b/Models/MaidKnightHeavy/SockLeftClosed.png new file mode 100644 index 000000000..dd1442c25 Binary files /dev/null and b/Models/MaidKnightHeavy/SockLeftClosed.png differ diff --git a/Models/MaidKnightHeavy/SockLeftHogtie.png b/Models/MaidKnightHeavy/SockLeftHogtie.png new file mode 100644 index 000000000..98af51874 Binary files /dev/null and b/Models/MaidKnightHeavy/SockLeftHogtie.png differ diff --git a/Models/MaidKnightHeavy/SockLeftKneel.png b/Models/MaidKnightHeavy/SockLeftKneel.png new file mode 100644 index 000000000..10845ab5e Binary files /dev/null and b/Models/MaidKnightHeavy/SockLeftKneel.png differ diff --git a/Models/MaidKnightHeavy/SockLeftKneelClosed.png b/Models/MaidKnightHeavy/SockLeftKneelClosed.png new file mode 100644 index 000000000..46f6a92ce Binary files /dev/null and b/Models/MaidKnightHeavy/SockLeftKneelClosed.png differ diff --git a/Models/MaidKnightHeavy/SockLeftSpread.png b/Models/MaidKnightHeavy/SockLeftSpread.png new file mode 100644 index 000000000..51b2a87fb Binary files /dev/null and b/Models/MaidKnightHeavy/SockLeftSpread.png differ diff --git a/Models/MaidKnightHeavy/SockRightClosed.png b/Models/MaidKnightHeavy/SockRightClosed.png new file mode 100644 index 000000000..00a5ee773 Binary files /dev/null and b/Models/MaidKnightHeavy/SockRightClosed.png differ diff --git a/Models/MaidKnightHeavy/SockRightHogtie.png b/Models/MaidKnightHeavy/SockRightHogtie.png new file mode 100644 index 000000000..8e81f9c74 Binary files /dev/null and b/Models/MaidKnightHeavy/SockRightHogtie.png differ diff --git a/Models/MaidKnightHeavy/SockRightKneel.png b/Models/MaidKnightHeavy/SockRightKneel.png new file mode 100644 index 000000000..89aa3efed Binary files /dev/null and b/Models/MaidKnightHeavy/SockRightKneel.png differ diff --git a/Models/MaidKnightHeavy/SockRightKneelClosed.png b/Models/MaidKnightHeavy/SockRightKneelClosed.png new file mode 100644 index 000000000..c3d343195 Binary files /dev/null and b/Models/MaidKnightHeavy/SockRightKneelClosed.png differ diff --git a/Models/MaidKnightHeavy/SockRightSpread.png b/Models/MaidKnightHeavy/SockRightSpread.png new file mode 100644 index 000000000..536d08c1a Binary files /dev/null and b/Models/MaidKnightHeavy/SockRightSpread.png differ diff --git a/Models/MaidKnightLight/Apron.png b/Models/MaidKnightLight/Apron.png new file mode 100644 index 000000000..e85d92541 Binary files /dev/null and b/Models/MaidKnightLight/Apron.png differ diff --git a/Models/MaidKnightLight/ApronBack.png b/Models/MaidKnightLight/ApronBack.png new file mode 100644 index 000000000..15cd82e77 Binary files /dev/null and b/Models/MaidKnightLight/ApronBack.png differ diff --git a/Models/MaidKnightLight/ApronChest.png b/Models/MaidKnightLight/ApronChest.png new file mode 100644 index 000000000..3ff4bca76 Binary files /dev/null and b/Models/MaidKnightLight/ApronChest.png differ diff --git a/Models/MaidKnightLight/ApronChestBoxtie.png b/Models/MaidKnightLight/ApronChestBoxtie.png new file mode 100644 index 000000000..cd11f0929 Binary files /dev/null and b/Models/MaidKnightLight/ApronChestBoxtie.png differ diff --git a/Models/MaidKnightLight/ApronChestCrossed.png b/Models/MaidKnightLight/ApronChestCrossed.png new file mode 100644 index 000000000..cfa79b0f2 Binary files /dev/null and b/Models/MaidKnightLight/ApronChestCrossed.png differ diff --git a/Models/MaidKnightLight/ApronChestFront.png b/Models/MaidKnightLight/ApronChestFront.png new file mode 100644 index 000000000..9db73ae7e Binary files /dev/null and b/Models/MaidKnightLight/ApronChestFront.png differ diff --git a/Models/MaidKnightLight/ApronChestUp.png b/Models/MaidKnightLight/ApronChestUp.png new file mode 100644 index 000000000..6d5388a3c Binary files /dev/null and b/Models/MaidKnightLight/ApronChestUp.png differ diff --git a/Models/MaidKnightLight/ApronChestYoked.png b/Models/MaidKnightLight/ApronChestYoked.png new file mode 100644 index 000000000..7158612f4 Binary files /dev/null and b/Models/MaidKnightLight/ApronChestYoked.png differ diff --git a/Models/MaidKnightLight/ApronHogtie.png b/Models/MaidKnightLight/ApronHogtie.png new file mode 100644 index 000000000..822f29107 Binary files /dev/null and b/Models/MaidKnightLight/ApronHogtie.png differ diff --git a/Models/MaidKnightLight/ApronKneel.png b/Models/MaidKnightLight/ApronKneel.png new file mode 100644 index 000000000..d2eb3bb7e Binary files /dev/null and b/Models/MaidKnightLight/ApronKneel.png differ diff --git a/Models/MaidKnightLight/ArmLeftBoxtie.png b/Models/MaidKnightLight/ArmLeftBoxtie.png new file mode 100644 index 000000000..269e382fe Binary files /dev/null and b/Models/MaidKnightLight/ArmLeftBoxtie.png differ diff --git a/Models/MaidKnightLight/ArmLeftCrossed.png b/Models/MaidKnightLight/ArmLeftCrossed.png new file mode 100644 index 000000000..269e382fe Binary files /dev/null and b/Models/MaidKnightLight/ArmLeftCrossed.png differ diff --git a/Models/MaidKnightLight/ArmLeftFree.png b/Models/MaidKnightLight/ArmLeftFree.png new file mode 100644 index 000000000..e4995900b Binary files /dev/null and b/Models/MaidKnightLight/ArmLeftFree.png differ diff --git a/Models/MaidKnightLight/ArmLeftFront.png b/Models/MaidKnightLight/ArmLeftFront.png new file mode 100644 index 000000000..21eb1e4a5 Binary files /dev/null and b/Models/MaidKnightLight/ArmLeftFront.png differ diff --git a/Models/MaidKnightLight/ArmLeftUp.png b/Models/MaidKnightLight/ArmLeftUp.png new file mode 100644 index 000000000..d2eba5c17 Binary files /dev/null and b/Models/MaidKnightLight/ArmLeftUp.png differ diff --git a/Models/MaidKnightLight/ArmLeftWristtie.png b/Models/MaidKnightLight/ArmLeftWristtie.png new file mode 100644 index 000000000..2295a33cb Binary files /dev/null and b/Models/MaidKnightLight/ArmLeftWristtie.png differ diff --git a/Models/MaidKnightLight/ArmLeftYoked.png b/Models/MaidKnightLight/ArmLeftYoked.png new file mode 100644 index 000000000..075fef0e2 Binary files /dev/null and b/Models/MaidKnightLight/ArmLeftYoked.png differ diff --git a/Models/MaidKnightLight/ArmRightBoxtie.png b/Models/MaidKnightLight/ArmRightBoxtie.png new file mode 100644 index 000000000..6fbb50f4c Binary files /dev/null and b/Models/MaidKnightLight/ArmRightBoxtie.png differ diff --git a/Models/MaidKnightLight/ArmRightCrossed.png b/Models/MaidKnightLight/ArmRightCrossed.png new file mode 100644 index 000000000..d50caacaf Binary files /dev/null and b/Models/MaidKnightLight/ArmRightCrossed.png differ diff --git a/Models/MaidKnightLight/ArmRightFree.png b/Models/MaidKnightLight/ArmRightFree.png new file mode 100644 index 000000000..020bce1d7 Binary files /dev/null and b/Models/MaidKnightLight/ArmRightFree.png differ diff --git a/Models/MaidKnightLight/ArmRightFront.png b/Models/MaidKnightLight/ArmRightFront.png new file mode 100644 index 000000000..b535c04f2 Binary files /dev/null and b/Models/MaidKnightLight/ArmRightFront.png differ diff --git a/Models/MaidKnightLight/ArmRightUp.png b/Models/MaidKnightLight/ArmRightUp.png new file mode 100644 index 000000000..ba31cc000 Binary files /dev/null and b/Models/MaidKnightLight/ArmRightUp.png differ diff --git a/Models/MaidKnightLight/ArmRightWristtie.png b/Models/MaidKnightLight/ArmRightWristtie.png new file mode 100644 index 000000000..0828b039a Binary files /dev/null and b/Models/MaidKnightLight/ArmRightWristtie.png differ diff --git a/Models/MaidKnightLight/ArmRightYoked.png b/Models/MaidKnightLight/ArmRightYoked.png new file mode 100644 index 000000000..7e595e3c7 Binary files /dev/null and b/Models/MaidKnightLight/ArmRightYoked.png differ diff --git a/Models/MaidKnightLight/BootLeftClosed.png b/Models/MaidKnightLight/BootLeftClosed.png new file mode 100644 index 000000000..dc63448c6 Binary files /dev/null and b/Models/MaidKnightLight/BootLeftClosed.png differ diff --git a/Models/MaidKnightLight/BootLeftHogtie.png b/Models/MaidKnightLight/BootLeftHogtie.png new file mode 100644 index 000000000..6fffa10d3 Binary files /dev/null and b/Models/MaidKnightLight/BootLeftHogtie.png differ diff --git a/Models/MaidKnightLight/BootLeftKneel.png b/Models/MaidKnightLight/BootLeftKneel.png new file mode 100644 index 000000000..002424489 Binary files /dev/null and b/Models/MaidKnightLight/BootLeftKneel.png differ diff --git a/Models/MaidKnightLight/BootLeftKneelClosed.png b/Models/MaidKnightLight/BootLeftKneelClosed.png new file mode 100644 index 000000000..e243fa430 Binary files /dev/null and b/Models/MaidKnightLight/BootLeftKneelClosed.png differ diff --git a/Models/MaidKnightLight/BootLeftSpread.png b/Models/MaidKnightLight/BootLeftSpread.png new file mode 100644 index 000000000..1858c076e Binary files /dev/null and b/Models/MaidKnightLight/BootLeftSpread.png differ diff --git a/Models/MaidKnightLight/BootRightClosed.png b/Models/MaidKnightLight/BootRightClosed.png new file mode 100644 index 000000000..951d0c6c2 Binary files /dev/null and b/Models/MaidKnightLight/BootRightClosed.png differ diff --git a/Models/MaidKnightLight/BootRightKneel.png b/Models/MaidKnightLight/BootRightKneel.png new file mode 100644 index 000000000..a704bf340 Binary files /dev/null and b/Models/MaidKnightLight/BootRightKneel.png differ diff --git a/Models/MaidKnightLight/BootRightSpread.png b/Models/MaidKnightLight/BootRightSpread.png new file mode 100644 index 000000000..d5755cde5 Binary files /dev/null and b/Models/MaidKnightLight/BootRightSpread.png differ diff --git a/Models/MaidKnightLight/Dress.png b/Models/MaidKnightLight/Dress.png new file mode 100644 index 000000000..204e13aaa Binary files /dev/null and b/Models/MaidKnightLight/Dress.png differ diff --git a/Models/MaidKnightLight/DressChestBoxtie.png b/Models/MaidKnightLight/DressChestBoxtie.png new file mode 100644 index 000000000..33017387d Binary files /dev/null and b/Models/MaidKnightLight/DressChestBoxtie.png differ diff --git a/Models/MaidKnightLight/DressChestFree.png b/Models/MaidKnightLight/DressChestFree.png new file mode 100644 index 000000000..983d9207d Binary files /dev/null and b/Models/MaidKnightLight/DressChestFree.png differ diff --git a/Models/MaidKnightLight/DressChestUp.png b/Models/MaidKnightLight/DressChestUp.png new file mode 100644 index 000000000..a0ab83632 Binary files /dev/null and b/Models/MaidKnightLight/DressChestUp.png differ diff --git a/Models/MaidKnightLight/DressChestWristtie.png b/Models/MaidKnightLight/DressChestWristtie.png new file mode 100644 index 000000000..e739703ac Binary files /dev/null and b/Models/MaidKnightLight/DressChestWristtie.png differ diff --git a/Models/MaidKnightLight/DressChestYoked.png b/Models/MaidKnightLight/DressChestYoked.png new file mode 100644 index 000000000..d45dc7441 Binary files /dev/null and b/Models/MaidKnightLight/DressChestYoked.png differ diff --git a/Models/MaidKnightLight/DressDeco.png b/Models/MaidKnightLight/DressDeco.png new file mode 100644 index 000000000..75f1de43d Binary files /dev/null and b/Models/MaidKnightLight/DressDeco.png differ diff --git a/Models/MaidKnightLight/DressDecoBack.png b/Models/MaidKnightLight/DressDecoBack.png new file mode 100644 index 000000000..2c7f6669b Binary files /dev/null and b/Models/MaidKnightLight/DressDecoBack.png differ diff --git a/Models/MaidKnightLight/DressKneel.png b/Models/MaidKnightLight/DressKneel.png new file mode 100644 index 000000000..69dbb022e Binary files /dev/null and b/Models/MaidKnightLight/DressKneel.png differ diff --git a/Models/MaidKnightLight/DressSkirt.png b/Models/MaidKnightLight/DressSkirt.png new file mode 100644 index 000000000..9a64dd5bd Binary files /dev/null and b/Models/MaidKnightLight/DressSkirt.png differ diff --git a/Models/MaidKnightLight/DressSkirtHogtie.png b/Models/MaidKnightLight/DressSkirtHogtie.png new file mode 100644 index 000000000..7825abff6 Binary files /dev/null and b/Models/MaidKnightLight/DressSkirtHogtie.png differ diff --git a/Models/MaidKnightLight/DressSkirtKneel.png b/Models/MaidKnightLight/DressSkirtKneel.png new file mode 100644 index 000000000..ad050c95e Binary files /dev/null and b/Models/MaidKnightLight/DressSkirtKneel.png differ diff --git a/Models/MaidKnightLight/Flower.png b/Models/MaidKnightLight/Flower.png new file mode 100644 index 000000000..4c6d71493 Binary files /dev/null and b/Models/MaidKnightLight/Flower.png differ diff --git a/Models/MaidKnightLight/FlowerLeaves.png b/Models/MaidKnightLight/FlowerLeaves.png new file mode 100644 index 000000000..aec9f27f1 Binary files /dev/null and b/Models/MaidKnightLight/FlowerLeaves.png differ diff --git a/Models/MaidKnightLight/FootBootLeftHogtie.png b/Models/MaidKnightLight/FootBootLeftHogtie.png new file mode 100644 index 000000000..68e6c4e3a Binary files /dev/null and b/Models/MaidKnightLight/FootBootLeftHogtie.png differ diff --git a/Models/MaidKnightLight/FootSockLeftHogtie.png b/Models/MaidKnightLight/FootSockLeftHogtie.png new file mode 100644 index 000000000..a6750d1aa Binary files /dev/null and b/Models/MaidKnightLight/FootSockLeftHogtie.png differ diff --git a/Models/MaidKnightLight/FootSockRightKneel.png b/Models/MaidKnightLight/FootSockRightKneel.png new file mode 100644 index 000000000..b0a9f0d1a Binary files /dev/null and b/Models/MaidKnightLight/FootSockRightKneel.png differ diff --git a/Models/MaidKnightLight/ForeArmLeftCrossed.png b/Models/MaidKnightLight/ForeArmLeftCrossed.png new file mode 100644 index 000000000..cce78b29a Binary files /dev/null and b/Models/MaidKnightLight/ForeArmLeftCrossed.png differ diff --git a/Models/MaidKnightLight/ForeArmLeftFront.png b/Models/MaidKnightLight/ForeArmLeftFront.png new file mode 100644 index 000000000..84ab8c99d Binary files /dev/null and b/Models/MaidKnightLight/ForeArmLeftFront.png differ diff --git a/Models/MaidKnightLight/ForeArmRightCrossed.png b/Models/MaidKnightLight/ForeArmRightCrossed.png new file mode 100644 index 000000000..b741519a7 Binary files /dev/null and b/Models/MaidKnightLight/ForeArmRightCrossed.png differ diff --git a/Models/MaidKnightLight/ForeArmRightFront.png b/Models/MaidKnightLight/ForeArmRightFront.png new file mode 100644 index 000000000..c801b0bec Binary files /dev/null and b/Models/MaidKnightLight/ForeArmRightFront.png differ diff --git a/Models/MaidKnightLight/GloveLeftFree.png b/Models/MaidKnightLight/GloveLeftFree.png new file mode 100644 index 000000000..d26565a7c Binary files /dev/null and b/Models/MaidKnightLight/GloveLeftFree.png differ diff --git a/Models/MaidKnightLight/GloveLeftFront.png b/Models/MaidKnightLight/GloveLeftFront.png new file mode 100644 index 000000000..4b91ecc64 Binary files /dev/null and b/Models/MaidKnightLight/GloveLeftFront.png differ diff --git a/Models/MaidKnightLight/GloveLeftYoked.png b/Models/MaidKnightLight/GloveLeftYoked.png new file mode 100644 index 000000000..05cdd9958 Binary files /dev/null and b/Models/MaidKnightLight/GloveLeftYoked.png differ diff --git a/Models/MaidKnightLight/GloveRightBoxtie.png b/Models/MaidKnightLight/GloveRightBoxtie.png new file mode 100644 index 000000000..65dc73e41 Binary files /dev/null and b/Models/MaidKnightLight/GloveRightBoxtie.png differ diff --git a/Models/MaidKnightLight/GloveRightCrossed.png b/Models/MaidKnightLight/GloveRightCrossed.png new file mode 100644 index 000000000..55ce1b5c1 Binary files /dev/null and b/Models/MaidKnightLight/GloveRightCrossed.png differ diff --git a/Models/MaidKnightLight/GloveRightFree.png b/Models/MaidKnightLight/GloveRightFree.png new file mode 100644 index 000000000..d2b871e36 Binary files /dev/null and b/Models/MaidKnightLight/GloveRightFree.png differ diff --git a/Models/MaidKnightLight/GloveRightFront.png b/Models/MaidKnightLight/GloveRightFront.png new file mode 100644 index 000000000..264383be5 Binary files /dev/null and b/Models/MaidKnightLight/GloveRightFront.png differ diff --git a/Models/MaidKnightLight/GloveRightYoked.png b/Models/MaidKnightLight/GloveRightYoked.png new file mode 100644 index 000000000..155b2ba0f Binary files /dev/null and b/Models/MaidKnightLight/GloveRightYoked.png differ diff --git a/Models/MaidKnightLight/GuardCuff2LeftCrossed.png b/Models/MaidKnightLight/GuardCuff2LeftCrossed.png new file mode 100644 index 000000000..68dad77bb Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2LeftCrossed.png differ diff --git a/Models/MaidKnightLight/GuardCuff2LeftFree.png b/Models/MaidKnightLight/GuardCuff2LeftFree.png new file mode 100644 index 000000000..d4e30d3e5 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2LeftFree.png differ diff --git a/Models/MaidKnightLight/GuardCuff2LeftFront.png b/Models/MaidKnightLight/GuardCuff2LeftFront.png new file mode 100644 index 000000000..4e98f1af6 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2LeftFront.png differ diff --git a/Models/MaidKnightLight/GuardCuff2LeftUp.png b/Models/MaidKnightLight/GuardCuff2LeftUp.png new file mode 100644 index 000000000..e5d7aa871 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2LeftUp.png differ diff --git a/Models/MaidKnightLight/GuardCuff2LeftWristtie.png b/Models/MaidKnightLight/GuardCuff2LeftWristtie.png new file mode 100644 index 000000000..46006f329 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2LeftWristtie.png differ diff --git a/Models/MaidKnightLight/GuardCuff2LeftYoked.png b/Models/MaidKnightLight/GuardCuff2LeftYoked.png new file mode 100644 index 000000000..b59e4dd90 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2LeftYoked.png differ diff --git a/Models/MaidKnightLight/GuardCuff2RightBoxtie.png b/Models/MaidKnightLight/GuardCuff2RightBoxtie.png new file mode 100644 index 000000000..7ce1990eb Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2RightBoxtie.png differ diff --git a/Models/MaidKnightLight/GuardCuff2RightCrossed.png b/Models/MaidKnightLight/GuardCuff2RightCrossed.png new file mode 100644 index 000000000..0cf820d82 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2RightCrossed.png differ diff --git a/Models/MaidKnightLight/GuardCuff2RightFree.png b/Models/MaidKnightLight/GuardCuff2RightFree.png new file mode 100644 index 000000000..dba021b5d Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2RightFree.png differ diff --git a/Models/MaidKnightLight/GuardCuff2RightFront.png b/Models/MaidKnightLight/GuardCuff2RightFront.png new file mode 100644 index 000000000..c8c830bb4 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2RightFront.png differ diff --git a/Models/MaidKnightLight/GuardCuff2RightUp.png b/Models/MaidKnightLight/GuardCuff2RightUp.png new file mode 100644 index 000000000..56592fcc3 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2RightUp.png differ diff --git a/Models/MaidKnightLight/GuardCuff2RightYoked.png b/Models/MaidKnightLight/GuardCuff2RightYoked.png new file mode 100644 index 000000000..62bab24ff Binary files /dev/null and b/Models/MaidKnightLight/GuardCuff2RightYoked.png differ diff --git a/Models/MaidKnightLight/GuardCuffLeftCrossed.png b/Models/MaidKnightLight/GuardCuffLeftCrossed.png new file mode 100644 index 000000000..628e89a69 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffLeftCrossed.png differ diff --git a/Models/MaidKnightLight/GuardCuffLeftFree.png b/Models/MaidKnightLight/GuardCuffLeftFree.png new file mode 100644 index 000000000..e89fb5ecb Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffLeftFree.png differ diff --git a/Models/MaidKnightLight/GuardCuffLeftFront.png b/Models/MaidKnightLight/GuardCuffLeftFront.png new file mode 100644 index 000000000..bea8b9e59 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffLeftFront.png differ diff --git a/Models/MaidKnightLight/GuardCuffLeftUp.png b/Models/MaidKnightLight/GuardCuffLeftUp.png new file mode 100644 index 000000000..33b9641f5 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffLeftUp.png differ diff --git a/Models/MaidKnightLight/GuardCuffLeftWristtie.png b/Models/MaidKnightLight/GuardCuffLeftWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffLeftWristtie.png differ diff --git a/Models/MaidKnightLight/GuardCuffLeftYoked.png b/Models/MaidKnightLight/GuardCuffLeftYoked.png new file mode 100644 index 000000000..9a19b1364 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffLeftYoked.png differ diff --git a/Models/MaidKnightLight/GuardCuffRightBoxtie.png b/Models/MaidKnightLight/GuardCuffRightBoxtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffRightBoxtie.png differ diff --git a/Models/MaidKnightLight/GuardCuffRightCrossed.png b/Models/MaidKnightLight/GuardCuffRightCrossed.png new file mode 100644 index 000000000..030c1eb10 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffRightCrossed.png differ diff --git a/Models/MaidKnightLight/GuardCuffRightFree.png b/Models/MaidKnightLight/GuardCuffRightFree.png new file mode 100644 index 000000000..6866a5849 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffRightFree.png differ diff --git a/Models/MaidKnightLight/GuardCuffRightFront.png b/Models/MaidKnightLight/GuardCuffRightFront.png new file mode 100644 index 000000000..aa400b7f1 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffRightFront.png differ diff --git a/Models/MaidKnightLight/GuardCuffRightUp.png b/Models/MaidKnightLight/GuardCuffRightUp.png new file mode 100644 index 000000000..f5f19ebf8 Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffRightUp.png differ diff --git a/Models/MaidKnightLight/GuardCuffRightYoked.png b/Models/MaidKnightLight/GuardCuffRightYoked.png new file mode 100644 index 000000000..3749e172e Binary files /dev/null and b/Models/MaidKnightLight/GuardCuffRightYoked.png differ diff --git a/Models/MaidKnightLight/GuardLeftCrossed.png b/Models/MaidKnightLight/GuardLeftCrossed.png new file mode 100644 index 000000000..782b71064 Binary files /dev/null and b/Models/MaidKnightLight/GuardLeftCrossed.png differ diff --git a/Models/MaidKnightLight/GuardLeftFree.png b/Models/MaidKnightLight/GuardLeftFree.png new file mode 100644 index 000000000..2c9825f4c Binary files /dev/null and b/Models/MaidKnightLight/GuardLeftFree.png differ diff --git a/Models/MaidKnightLight/GuardLeftFront.png b/Models/MaidKnightLight/GuardLeftFront.png new file mode 100644 index 000000000..e0243c3d5 Binary files /dev/null and b/Models/MaidKnightLight/GuardLeftFront.png differ diff --git a/Models/MaidKnightLight/GuardLeftUp.png b/Models/MaidKnightLight/GuardLeftUp.png new file mode 100644 index 000000000..21535293c Binary files /dev/null and b/Models/MaidKnightLight/GuardLeftUp.png differ diff --git a/Models/MaidKnightLight/GuardLeftWristtie.png b/Models/MaidKnightLight/GuardLeftWristtie.png new file mode 100644 index 000000000..62722442b Binary files /dev/null and b/Models/MaidKnightLight/GuardLeftWristtie.png differ diff --git a/Models/MaidKnightLight/GuardLeftYoked.png b/Models/MaidKnightLight/GuardLeftYoked.png new file mode 100644 index 000000000..97053bd9d Binary files /dev/null and b/Models/MaidKnightLight/GuardLeftYoked.png differ diff --git a/Models/MaidKnightLight/GuardRightBoxtie.png b/Models/MaidKnightLight/GuardRightBoxtie.png new file mode 100644 index 000000000..6586ea0be Binary files /dev/null and b/Models/MaidKnightLight/GuardRightBoxtie.png differ diff --git a/Models/MaidKnightLight/GuardRightCrossed.png b/Models/MaidKnightLight/GuardRightCrossed.png new file mode 100644 index 000000000..a0e31d9cb Binary files /dev/null and b/Models/MaidKnightLight/GuardRightCrossed.png differ diff --git a/Models/MaidKnightLight/GuardRightFree.png b/Models/MaidKnightLight/GuardRightFree.png new file mode 100644 index 000000000..8bf004b54 Binary files /dev/null and b/Models/MaidKnightLight/GuardRightFree.png differ diff --git a/Models/MaidKnightLight/GuardRightFront.png b/Models/MaidKnightLight/GuardRightFront.png new file mode 100644 index 000000000..d68d3c7b9 Binary files /dev/null and b/Models/MaidKnightLight/GuardRightFront.png differ diff --git a/Models/MaidKnightLight/GuardRightUp.png b/Models/MaidKnightLight/GuardRightUp.png new file mode 100644 index 000000000..c6bcadbf6 Binary files /dev/null and b/Models/MaidKnightLight/GuardRightUp.png differ diff --git a/Models/MaidKnightLight/GuardRightYoked.png b/Models/MaidKnightLight/GuardRightYoked.png new file mode 100644 index 000000000..263a367c1 Binary files /dev/null and b/Models/MaidKnightLight/GuardRightYoked.png differ diff --git a/Models/MaidKnightLight/Headband.png b/Models/MaidKnightLight/Headband.png new file mode 100644 index 000000000..ce20d7061 Binary files /dev/null and b/Models/MaidKnightLight/Headband.png differ diff --git a/Models/MaidKnightLight/HeadbandFrill.png b/Models/MaidKnightLight/HeadbandFrill.png new file mode 100644 index 000000000..83d2ed646 Binary files /dev/null and b/Models/MaidKnightLight/HeadbandFrill.png differ diff --git a/Models/MaidKnightLight/HeadbandRibbon.png b/Models/MaidKnightLight/HeadbandRibbon.png new file mode 100644 index 000000000..309d6fe78 Binary files /dev/null and b/Models/MaidKnightLight/HeadbandRibbon.png differ diff --git a/Models/MaidKnightLight/PauldronLeft.png b/Models/MaidKnightLight/PauldronLeft.png new file mode 100644 index 000000000..e808b4ab1 Binary files /dev/null and b/Models/MaidKnightLight/PauldronLeft.png differ diff --git a/Models/MaidKnightLight/PauldronLeftBoxtie.png b/Models/MaidKnightLight/PauldronLeftBoxtie.png new file mode 100644 index 000000000..d952407f1 Binary files /dev/null and b/Models/MaidKnightLight/PauldronLeftBoxtie.png differ diff --git a/Models/MaidKnightLight/PauldronLeftCrossed.png b/Models/MaidKnightLight/PauldronLeftCrossed.png new file mode 100644 index 000000000..271c5de7b Binary files /dev/null and b/Models/MaidKnightLight/PauldronLeftCrossed.png differ diff --git a/Models/MaidKnightLight/PauldronLeftFront.png b/Models/MaidKnightLight/PauldronLeftFront.png new file mode 100644 index 000000000..c462981a7 Binary files /dev/null and b/Models/MaidKnightLight/PauldronLeftFront.png differ diff --git a/Models/MaidKnightLight/PauldronLeftUp.png b/Models/MaidKnightLight/PauldronLeftUp.png new file mode 100644 index 000000000..fcea7ddb8 Binary files /dev/null and b/Models/MaidKnightLight/PauldronLeftUp.png differ diff --git a/Models/MaidKnightLight/PauldronLeftWristtie.png b/Models/MaidKnightLight/PauldronLeftWristtie.png new file mode 100644 index 000000000..1d6c8985e Binary files /dev/null and b/Models/MaidKnightLight/PauldronLeftWristtie.png differ diff --git a/Models/MaidKnightLight/PauldronLeftYoked.png b/Models/MaidKnightLight/PauldronLeftYoked.png new file mode 100644 index 000000000..3f90b9cc2 Binary files /dev/null and b/Models/MaidKnightLight/PauldronLeftYoked.png differ diff --git a/Models/MaidKnightLight/PauldronStrap.png b/Models/MaidKnightLight/PauldronStrap.png new file mode 100644 index 000000000..3818b461e Binary files /dev/null and b/Models/MaidKnightLight/PauldronStrap.png differ diff --git a/Models/MaidKnightLight/PauldronStrapBoxtie.png b/Models/MaidKnightLight/PauldronStrapBoxtie.png new file mode 100644 index 000000000..c2b926f32 Binary files /dev/null and b/Models/MaidKnightLight/PauldronStrapBoxtie.png differ diff --git a/Models/MaidKnightLight/PauldronStrapCrossed.png b/Models/MaidKnightLight/PauldronStrapCrossed.png new file mode 100644 index 000000000..f1818706a Binary files /dev/null and b/Models/MaidKnightLight/PauldronStrapCrossed.png differ diff --git a/Models/MaidKnightLight/PauldronStrapFront.png b/Models/MaidKnightLight/PauldronStrapFront.png new file mode 100644 index 000000000..c2b926f32 Binary files /dev/null and b/Models/MaidKnightLight/PauldronStrapFront.png differ diff --git a/Models/MaidKnightLight/PauldronStrapUp.png b/Models/MaidKnightLight/PauldronStrapUp.png new file mode 100644 index 000000000..4f294db33 Binary files /dev/null and b/Models/MaidKnightLight/PauldronStrapUp.png differ diff --git a/Models/MaidKnightLight/PauldronStrapWristtie.png b/Models/MaidKnightLight/PauldronStrapWristtie.png new file mode 100644 index 000000000..f1818706a Binary files /dev/null and b/Models/MaidKnightLight/PauldronStrapWristtie.png differ diff --git a/Models/MaidKnightLight/PauldronStrapYoked.png b/Models/MaidKnightLight/PauldronStrapYoked.png new file mode 100644 index 000000000..88ab9b331 Binary files /dev/null and b/Models/MaidKnightLight/PauldronStrapYoked.png differ diff --git a/Models/MaidKnightLight/ShoulderRightUp.png b/Models/MaidKnightLight/ShoulderRightUp.png new file mode 100644 index 000000000..cc2732360 Binary files /dev/null and b/Models/MaidKnightLight/ShoulderRightUp.png differ diff --git a/Models/MaidKnightLight/SockLeftClosed.png b/Models/MaidKnightLight/SockLeftClosed.png new file mode 100644 index 000000000..c77e72d51 Binary files /dev/null and b/Models/MaidKnightLight/SockLeftClosed.png differ diff --git a/Models/MaidKnightLight/SockLeftHogtie.png b/Models/MaidKnightLight/SockLeftHogtie.png new file mode 100644 index 000000000..c5a9d168b Binary files /dev/null and b/Models/MaidKnightLight/SockLeftHogtie.png differ diff --git a/Models/MaidKnightLight/SockLeftKneel.png b/Models/MaidKnightLight/SockLeftKneel.png new file mode 100644 index 000000000..a66b3a3f8 Binary files /dev/null and b/Models/MaidKnightLight/SockLeftKneel.png differ diff --git a/Models/MaidKnightLight/SockLeftKneelClosed.png b/Models/MaidKnightLight/SockLeftKneelClosed.png new file mode 100644 index 000000000..37c145ccb Binary files /dev/null and b/Models/MaidKnightLight/SockLeftKneelClosed.png differ diff --git a/Models/MaidKnightLight/SockLeftSpread.png b/Models/MaidKnightLight/SockLeftSpread.png new file mode 100644 index 000000000..dd3ed9efd Binary files /dev/null and b/Models/MaidKnightLight/SockLeftSpread.png differ diff --git a/Models/MaidKnightLight/SockRightClosed.png b/Models/MaidKnightLight/SockRightClosed.png new file mode 100644 index 000000000..34c55da18 Binary files /dev/null and b/Models/MaidKnightLight/SockRightClosed.png differ diff --git a/Models/MaidKnightLight/SockRightHogtie.png b/Models/MaidKnightLight/SockRightHogtie.png new file mode 100644 index 000000000..72d1c9336 Binary files /dev/null and b/Models/MaidKnightLight/SockRightHogtie.png differ diff --git a/Models/MaidKnightLight/SockRightKneel.png b/Models/MaidKnightLight/SockRightKneel.png new file mode 100644 index 000000000..287cba87e Binary files /dev/null and b/Models/MaidKnightLight/SockRightKneel.png differ diff --git a/Models/MaidKnightLight/SockRightKneelClosed.png b/Models/MaidKnightLight/SockRightKneelClosed.png new file mode 100644 index 000000000..ccaa2c453 Binary files /dev/null and b/Models/MaidKnightLight/SockRightKneelClosed.png differ diff --git a/Models/MaidKnightLight/SockRightSpread.png b/Models/MaidKnightLight/SockRightSpread.png new file mode 100644 index 000000000..4f5ca3a18 Binary files /dev/null and b/Models/MaidKnightLight/SockRightSpread.png differ diff --git a/Models/Mittens/BandLeftFree.png b/Models/Mittens/BandLeftFree.png new file mode 100644 index 000000000..4ced06f93 Binary files /dev/null and b/Models/Mittens/BandLeftFree.png differ diff --git a/Models/Mittens/BandLeftFront.png b/Models/Mittens/BandLeftFront.png new file mode 100644 index 000000000..160004035 Binary files /dev/null and b/Models/Mittens/BandLeftFront.png differ diff --git a/Models/Mittens/BandLeftYoked.png b/Models/Mittens/BandLeftYoked.png new file mode 100644 index 000000000..3705c0232 Binary files /dev/null and b/Models/Mittens/BandLeftYoked.png differ diff --git a/Models/Mittens/BandRightFree.png b/Models/Mittens/BandRightFree.png new file mode 100644 index 000000000..69673d33a Binary files /dev/null and b/Models/Mittens/BandRightFree.png differ diff --git a/Models/Mittens/BandRightFront.png b/Models/Mittens/BandRightFront.png new file mode 100644 index 000000000..e53f16e97 Binary files /dev/null and b/Models/Mittens/BandRightFront.png differ diff --git a/Models/Mittens/BandRightYoked.png b/Models/Mittens/BandRightYoked.png new file mode 100644 index 000000000..7d98aec0f Binary files /dev/null and b/Models/Mittens/BandRightYoked.png differ diff --git a/Models/Mittens/ForeLongMittenLeftCrossed.png b/Models/Mittens/ForeLongMittenLeftCrossed.png new file mode 100644 index 000000000..dfd0131d5 Binary files /dev/null and b/Models/Mittens/ForeLongMittenLeftCrossed.png differ diff --git a/Models/Mittens/ForeLongMittenLeftFront.png b/Models/Mittens/ForeLongMittenLeftFront.png new file mode 100644 index 000000000..0452371e1 Binary files /dev/null and b/Models/Mittens/ForeLongMittenLeftFront.png differ diff --git a/Models/Mittens/ForeLongMittenRightCrossed.png b/Models/Mittens/ForeLongMittenRightCrossed.png new file mode 100644 index 000000000..d1c84d09f Binary files /dev/null and b/Models/Mittens/ForeLongMittenRightCrossed.png differ diff --git a/Models/Mittens/ForeLongMittenRightFront.png b/Models/Mittens/ForeLongMittenRightFront.png new file mode 100644 index 000000000..145086283 Binary files /dev/null and b/Models/Mittens/ForeLongMittenRightFront.png differ diff --git a/Models/Mittens/LatexLeftFree.png b/Models/Mittens/LatexLeftFree.png new file mode 100644 index 000000000..6ad7f7ae1 Binary files /dev/null and b/Models/Mittens/LatexLeftFree.png differ diff --git a/Models/Mittens/LatexLeftFront.png b/Models/Mittens/LatexLeftFront.png new file mode 100644 index 000000000..8df594380 Binary files /dev/null and b/Models/Mittens/LatexLeftFront.png differ diff --git a/Models/Mittens/LatexLeftYoked.png b/Models/Mittens/LatexLeftYoked.png new file mode 100644 index 000000000..2a2b68cb5 Binary files /dev/null and b/Models/Mittens/LatexLeftYoked.png differ diff --git a/Models/Mittens/LatexRightBoxtie.png b/Models/Mittens/LatexRightBoxtie.png new file mode 100644 index 000000000..be5c00b6d Binary files /dev/null and b/Models/Mittens/LatexRightBoxtie.png differ diff --git a/Models/Mittens/LatexRightCrossed.png b/Models/Mittens/LatexRightCrossed.png new file mode 100644 index 000000000..3921f8e94 Binary files /dev/null and b/Models/Mittens/LatexRightCrossed.png differ diff --git a/Models/Mittens/LatexRightFree.png b/Models/Mittens/LatexRightFree.png new file mode 100644 index 000000000..156b2da5c Binary files /dev/null and b/Models/Mittens/LatexRightFree.png differ diff --git a/Models/Mittens/LatexRightFront.png b/Models/Mittens/LatexRightFront.png new file mode 100644 index 000000000..5967a093d Binary files /dev/null and b/Models/Mittens/LatexRightFront.png differ diff --git a/Models/Mittens/LatexRightYoked.png b/Models/Mittens/LatexRightYoked.png new file mode 100644 index 000000000..49dd77d66 Binary files /dev/null and b/Models/Mittens/LatexRightYoked.png differ diff --git a/Models/Mittens/LeatherLeftFree.png b/Models/Mittens/LeatherLeftFree.png new file mode 100644 index 000000000..f89072dd5 Binary files /dev/null and b/Models/Mittens/LeatherLeftFree.png differ diff --git a/Models/Mittens/LeatherLeftFront.png b/Models/Mittens/LeatherLeftFront.png new file mode 100644 index 000000000..9df92025c Binary files /dev/null and b/Models/Mittens/LeatherLeftFront.png differ diff --git a/Models/Mittens/LeatherLeftYoked.png b/Models/Mittens/LeatherLeftYoked.png new file mode 100644 index 000000000..71587397f Binary files /dev/null and b/Models/Mittens/LeatherLeftYoked.png differ diff --git a/Models/Mittens/LeatherRightBoxtie.png b/Models/Mittens/LeatherRightBoxtie.png new file mode 100644 index 000000000..cd1a72698 Binary files /dev/null and b/Models/Mittens/LeatherRightBoxtie.png differ diff --git a/Models/Mittens/LeatherRightCrossed.png b/Models/Mittens/LeatherRightCrossed.png new file mode 100644 index 000000000..fd3b9568d Binary files /dev/null and b/Models/Mittens/LeatherRightCrossed.png differ diff --git a/Models/Mittens/LeatherRightFree.png b/Models/Mittens/LeatherRightFree.png new file mode 100644 index 000000000..083fbaf85 Binary files /dev/null and b/Models/Mittens/LeatherRightFree.png differ diff --git a/Models/Mittens/LeatherRightFront.png b/Models/Mittens/LeatherRightFront.png new file mode 100644 index 000000000..4ce86cde9 Binary files /dev/null and b/Models/Mittens/LeatherRightFront.png differ diff --git a/Models/Mittens/LeatherRightYoked.png b/Models/Mittens/LeatherRightYoked.png new file mode 100644 index 000000000..cd0da3149 Binary files /dev/null and b/Models/Mittens/LeatherRightYoked.png differ diff --git a/Models/Mittens/LockLeftFree.png b/Models/Mittens/LockLeftFree.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Mittens/LockLeftFree.png differ diff --git a/Models/Mittens/LockLeftFront.png b/Models/Mittens/LockLeftFront.png new file mode 100644 index 000000000..894e6674f Binary files /dev/null and b/Models/Mittens/LockLeftFront.png differ diff --git a/Models/Mittens/LockLeftYoked.png b/Models/Mittens/LockLeftYoked.png new file mode 100644 index 000000000..641c83e19 Binary files /dev/null and b/Models/Mittens/LockLeftYoked.png differ diff --git a/Models/Mittens/LockRightFree.png b/Models/Mittens/LockRightFree.png new file mode 100644 index 000000000..a0263b88b Binary files /dev/null and b/Models/Mittens/LockRightFree.png differ diff --git a/Models/Mittens/LockRightFront.png b/Models/Mittens/LockRightFront.png new file mode 100644 index 000000000..1d0294465 Binary files /dev/null and b/Models/Mittens/LockRightFront.png differ diff --git a/Models/Mittens/LockRightYoked.png b/Models/Mittens/LockRightYoked.png new file mode 100644 index 000000000..38a6cd996 Binary files /dev/null and b/Models/Mittens/LockRightYoked.png differ diff --git a/Models/Mittens/LongMittenLeftBoxtie.png b/Models/Mittens/LongMittenLeftBoxtie.png new file mode 100644 index 000000000..417dd0f58 Binary files /dev/null and b/Models/Mittens/LongMittenLeftBoxtie.png differ diff --git a/Models/Mittens/LongMittenLeftCrossed.png b/Models/Mittens/LongMittenLeftCrossed.png new file mode 100644 index 000000000..7ebd8e677 Binary files /dev/null and b/Models/Mittens/LongMittenLeftCrossed.png differ diff --git a/Models/Mittens/LongMittenLeftFree.png b/Models/Mittens/LongMittenLeftFree.png new file mode 100644 index 000000000..852d3f5a5 Binary files /dev/null and b/Models/Mittens/LongMittenLeftFree.png differ diff --git a/Models/Mittens/LongMittenLeftFront.png b/Models/Mittens/LongMittenLeftFront.png new file mode 100644 index 000000000..3eea2a134 Binary files /dev/null and b/Models/Mittens/LongMittenLeftFront.png differ diff --git a/Models/Mittens/LongMittenLeftUp.png b/Models/Mittens/LongMittenLeftUp.png new file mode 100644 index 000000000..bdb4a8361 Binary files /dev/null and b/Models/Mittens/LongMittenLeftUp.png differ diff --git a/Models/Mittens/LongMittenLeftWristtie.png b/Models/Mittens/LongMittenLeftWristtie.png new file mode 100644 index 000000000..6fc578c17 Binary files /dev/null and b/Models/Mittens/LongMittenLeftWristtie.png differ diff --git a/Models/Mittens/LongMittenLeftYoked.png b/Models/Mittens/LongMittenLeftYoked.png new file mode 100644 index 000000000..c9d8695c0 Binary files /dev/null and b/Models/Mittens/LongMittenLeftYoked.png differ diff --git a/Models/Mittens/LongMittenRightBoxtie.png b/Models/Mittens/LongMittenRightBoxtie.png new file mode 100644 index 000000000..bc36af5e3 Binary files /dev/null and b/Models/Mittens/LongMittenRightBoxtie.png differ diff --git a/Models/Mittens/LongMittenRightCrossed.png b/Models/Mittens/LongMittenRightCrossed.png new file mode 100644 index 000000000..3a1116051 Binary files /dev/null and b/Models/Mittens/LongMittenRightCrossed.png differ diff --git a/Models/Mittens/LongMittenRightFree.png b/Models/Mittens/LongMittenRightFree.png new file mode 100644 index 000000000..f9e29f011 Binary files /dev/null and b/Models/Mittens/LongMittenRightFree.png differ diff --git a/Models/Mittens/LongMittenRightFront.png b/Models/Mittens/LongMittenRightFront.png new file mode 100644 index 000000000..695a83051 Binary files /dev/null and b/Models/Mittens/LongMittenRightFront.png differ diff --git a/Models/Mittens/LongMittenRightUp.png b/Models/Mittens/LongMittenRightUp.png new file mode 100644 index 000000000..26ec61d6f Binary files /dev/null and b/Models/Mittens/LongMittenRightUp.png differ diff --git a/Models/Mittens/LongMittenRightWristtie.png b/Models/Mittens/LongMittenRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Mittens/LongMittenRightWristtie.png differ diff --git a/Models/Mittens/LongMittenRightYoked.png b/Models/Mittens/LongMittenRightYoked.png new file mode 100644 index 000000000..c62a39096 Binary files /dev/null and b/Models/Mittens/LongMittenRightYoked.png differ diff --git a/Models/Mittens/PawLeftFree.png b/Models/Mittens/PawLeftFree.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Mittens/PawLeftFree.png differ diff --git a/Models/Mittens/PawLeftFront.png b/Models/Mittens/PawLeftFront.png new file mode 100644 index 000000000..410ad8e7a Binary files /dev/null and b/Models/Mittens/PawLeftFront.png differ diff --git a/Models/Mittens/PawLeftYoked.png b/Models/Mittens/PawLeftYoked.png new file mode 100644 index 000000000..f60e27283 Binary files /dev/null and b/Models/Mittens/PawLeftYoked.png differ diff --git a/Models/Mittens/PawRightFree.png b/Models/Mittens/PawRightFree.png new file mode 100644 index 000000000..ccf0faffc Binary files /dev/null and b/Models/Mittens/PawRightFree.png differ diff --git a/Models/Mittens/PawRightFront.png b/Models/Mittens/PawRightFront.png new file mode 100644 index 000000000..edaf720de Binary files /dev/null and b/Models/Mittens/PawRightFront.png differ diff --git a/Models/Mittens/PawRightYoked.png b/Models/Mittens/PawRightYoked.png new file mode 100644 index 000000000..51afc9d42 Binary files /dev/null and b/Models/Mittens/PawRightYoked.png differ diff --git a/Models/Mittens/ZipperLeftFree.png b/Models/Mittens/ZipperLeftFree.png new file mode 100644 index 000000000..42cf85ebc Binary files /dev/null and b/Models/Mittens/ZipperLeftFree.png differ diff --git a/Models/Mittens/ZipperLeftFront.png b/Models/Mittens/ZipperLeftFront.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Mittens/ZipperLeftFront.png differ diff --git a/Models/Mittens/ZipperLeftYoked.png b/Models/Mittens/ZipperLeftYoked.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Mittens/ZipperLeftYoked.png differ diff --git a/Models/Mittens/ZipperRightFree.png b/Models/Mittens/ZipperRightFree.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Mittens/ZipperRightFree.png differ diff --git a/Models/Mittens/ZipperRightFront.png b/Models/Mittens/ZipperRightFront.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Mittens/ZipperRightFront.png differ diff --git a/Models/Mittens/ZipperRightYoked.png b/Models/Mittens/ZipperRightYoked.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Mittens/ZipperRightYoked.png differ diff --git a/Models/Necklace/MetalChain.png b/Models/Necklace/MetalChain.png new file mode 100644 index 000000000..2eccffdfb Binary files /dev/null and b/Models/Necklace/MetalChain.png differ diff --git a/Models/Necklace/MetalDisc.png b/Models/Necklace/MetalDisc.png new file mode 100644 index 000000000..40a551454 Binary files /dev/null and b/Models/Necklace/MetalDisc.png differ diff --git a/Models/Necklace/RubyChain.png b/Models/Necklace/RubyChain.png new file mode 100644 index 000000000..70751f575 Binary files /dev/null and b/Models/Necklace/RubyChain.png differ diff --git a/Models/Necklace/RubyGem.png b/Models/Necklace/RubyGem.png new file mode 100644 index 000000000..b7bcba848 Binary files /dev/null and b/Models/Necklace/RubyGem.png differ diff --git a/Models/Necklace/RubyHardware.png b/Models/Necklace/RubyHardware.png new file mode 100644 index 000000000..fb1bc209e Binary files /dev/null and b/Models/Necklace/RubyHardware.png differ diff --git a/Models/Necklace/RubyRing.png b/Models/Necklace/RubyRing.png new file mode 100644 index 000000000..ffcf28606 Binary files /dev/null and b/Models/Necklace/RubyRing.png differ diff --git a/Models/Necklace/SigilChain.png b/Models/Necklace/SigilChain.png new file mode 100644 index 000000000..b3a21e157 Binary files /dev/null and b/Models/Necklace/SigilChain.png differ diff --git a/Models/Necklace/SigilDisc.png b/Models/Necklace/SigilDisc.png new file mode 100644 index 000000000..7bf0e6938 Binary files /dev/null and b/Models/Necklace/SigilDisc.png differ diff --git a/Models/Ninja/Belt.png b/Models/Ninja/Belt.png new file mode 100644 index 000000000..a3c2db65f Binary files /dev/null and b/Models/Ninja/Belt.png differ diff --git a/Models/Ninja/BeltLines.png b/Models/Ninja/BeltLines.png new file mode 100644 index 000000000..8e3850335 Binary files /dev/null and b/Models/Ninja/BeltLines.png differ diff --git a/Models/Ninja/Collar.png b/Models/Ninja/Collar.png new file mode 100644 index 000000000..d1540455c Binary files /dev/null and b/Models/Ninja/Collar.png differ diff --git a/Models/Ninja/CollarTag.png b/Models/Ninja/CollarTag.png new file mode 100644 index 000000000..1d14a9263 Binary files /dev/null and b/Models/Ninja/CollarTag.png differ diff --git a/Models/Ninja/KneeLeftClosed.png b/Models/Ninja/KneeLeftClosed.png new file mode 100644 index 000000000..c73b29e0e Binary files /dev/null and b/Models/Ninja/KneeLeftClosed.png differ diff --git a/Models/Ninja/KneeLeftHogtie.png b/Models/Ninja/KneeLeftHogtie.png new file mode 100644 index 000000000..dc3cbfc98 Binary files /dev/null and b/Models/Ninja/KneeLeftHogtie.png differ diff --git a/Models/Ninja/KneeLeftKneel.png b/Models/Ninja/KneeLeftKneel.png new file mode 100644 index 000000000..972b7cc3b Binary files /dev/null and b/Models/Ninja/KneeLeftKneel.png differ diff --git a/Models/Ninja/KneeLeftKneelClosed.png b/Models/Ninja/KneeLeftKneelClosed.png new file mode 100644 index 000000000..972b7cc3b Binary files /dev/null and b/Models/Ninja/KneeLeftKneelClosed.png differ diff --git a/Models/Ninja/KneeLeftSpread.png b/Models/Ninja/KneeLeftSpread.png new file mode 100644 index 000000000..4b8773370 Binary files /dev/null and b/Models/Ninja/KneeLeftSpread.png differ diff --git a/Models/Ninja/KneeRightClosed.png b/Models/Ninja/KneeRightClosed.png new file mode 100644 index 000000000..d1a134c51 Binary files /dev/null and b/Models/Ninja/KneeRightClosed.png differ diff --git a/Models/Ninja/KneeRightHogtie.png b/Models/Ninja/KneeRightHogtie.png new file mode 100644 index 000000000..0b5aa7a2f Binary files /dev/null and b/Models/Ninja/KneeRightHogtie.png differ diff --git a/Models/Ninja/KneeRightKneel.png b/Models/Ninja/KneeRightKneel.png new file mode 100644 index 000000000..da26f09a2 Binary files /dev/null and b/Models/Ninja/KneeRightKneel.png differ diff --git a/Models/Ninja/KneeRightKneelClosed.png b/Models/Ninja/KneeRightKneelClosed.png new file mode 100644 index 000000000..da26f09a2 Binary files /dev/null and b/Models/Ninja/KneeRightKneelClosed.png differ diff --git a/Models/Ninja/KneeRightSpread.png b/Models/Ninja/KneeRightSpread.png new file mode 100644 index 000000000..8281b7a32 Binary files /dev/null and b/Models/Ninja/KneeRightSpread.png differ diff --git a/Models/Ninja/LegLeftHogtie.png b/Models/Ninja/LegLeftHogtie.png new file mode 100644 index 000000000..5499fff0c Binary files /dev/null and b/Models/Ninja/LegLeftHogtie.png differ diff --git a/Models/Ninja/ShoeLeftClosed.png b/Models/Ninja/ShoeLeftClosed.png new file mode 100644 index 000000000..3c4c2582c Binary files /dev/null and b/Models/Ninja/ShoeLeftClosed.png differ diff --git a/Models/Ninja/ShoeLeftHogtie.png b/Models/Ninja/ShoeLeftHogtie.png new file mode 100644 index 000000000..4372e1927 Binary files /dev/null and b/Models/Ninja/ShoeLeftHogtie.png differ diff --git a/Models/Ninja/ShoeLeftKneel.png b/Models/Ninja/ShoeLeftKneel.png new file mode 100644 index 000000000..f3b6f16f4 Binary files /dev/null and b/Models/Ninja/ShoeLeftKneel.png differ diff --git a/Models/Ninja/ShoeLeftKneelClosed.png b/Models/Ninja/ShoeLeftKneelClosed.png new file mode 100644 index 000000000..f3b6f16f4 Binary files /dev/null and b/Models/Ninja/ShoeLeftKneelClosed.png differ diff --git a/Models/Ninja/ShoeLeftSpread.png b/Models/Ninja/ShoeLeftSpread.png new file mode 100644 index 000000000..74a32b329 Binary files /dev/null and b/Models/Ninja/ShoeLeftSpread.png differ diff --git a/Models/Ninja/ShoeRightClosed.png b/Models/Ninja/ShoeRightClosed.png new file mode 100644 index 000000000..2baf5095b Binary files /dev/null and b/Models/Ninja/ShoeRightClosed.png differ diff --git a/Models/Ninja/ShoeRightKneel.png b/Models/Ninja/ShoeRightKneel.png new file mode 100644 index 000000000..a9cc59409 Binary files /dev/null and b/Models/Ninja/ShoeRightKneel.png differ diff --git a/Models/Ninja/ShoeRightSpread.png b/Models/Ninja/ShoeRightSpread.png new file mode 100644 index 000000000..f3fbf905e Binary files /dev/null and b/Models/Ninja/ShoeRightSpread.png differ diff --git a/Models/Ninja/Skirt.png b/Models/Ninja/Skirt.png new file mode 100644 index 000000000..e007eef44 Binary files /dev/null and b/Models/Ninja/Skirt.png differ diff --git a/Models/Ninja/SkirtBand.png b/Models/Ninja/SkirtBand.png new file mode 100644 index 000000000..5f78842dc Binary files /dev/null and b/Models/Ninja/SkirtBand.png differ diff --git a/Models/Ninja/SkirtBandCrotchStrap.png b/Models/Ninja/SkirtBandCrotchStrap.png new file mode 100644 index 000000000..118febe2a Binary files /dev/null and b/Models/Ninja/SkirtBandCrotchStrap.png differ diff --git a/Models/Ninja/SkirtBandKneel.png b/Models/Ninja/SkirtBandKneel.png new file mode 100644 index 000000000..3ca14cdfe Binary files /dev/null and b/Models/Ninja/SkirtBandKneel.png differ diff --git a/Models/Ninja/SkirtBandKneelCrotchStrap.png b/Models/Ninja/SkirtBandKneelCrotchStrap.png new file mode 100644 index 000000000..b92114750 Binary files /dev/null and b/Models/Ninja/SkirtBandKneelCrotchStrap.png differ diff --git a/Models/Ninja/SkirtBandOverKneel.png b/Models/Ninja/SkirtBandOverKneel.png new file mode 100644 index 000000000..da7f97eb4 Binary files /dev/null and b/Models/Ninja/SkirtBandOverKneel.png differ diff --git a/Models/Ninja/SkirtBandOverKneelCrotchStrap.png b/Models/Ninja/SkirtBandOverKneelCrotchStrap.png new file mode 100644 index 000000000..2d24a3539 Binary files /dev/null and b/Models/Ninja/SkirtBandOverKneelCrotchStrap.png differ diff --git a/Models/Ninja/SkirtCrotchStrap.png b/Models/Ninja/SkirtCrotchStrap.png new file mode 100644 index 000000000..b1b9001b9 Binary files /dev/null and b/Models/Ninja/SkirtCrotchStrap.png differ diff --git a/Models/Ninja/SkirtKneel.png b/Models/Ninja/SkirtKneel.png new file mode 100644 index 000000000..7dcb5c0b7 Binary files /dev/null and b/Models/Ninja/SkirtKneel.png differ diff --git a/Models/Ninja/SkirtKneelCrotchStrap.png b/Models/Ninja/SkirtKneelCrotchStrap.png new file mode 100644 index 000000000..8e6ed634a Binary files /dev/null and b/Models/Ninja/SkirtKneelCrotchStrap.png differ diff --git a/Models/Ninja/SkirtOverKneel.png b/Models/Ninja/SkirtOverKneel.png new file mode 100644 index 000000000..7813e625c Binary files /dev/null and b/Models/Ninja/SkirtOverKneel.png differ diff --git a/Models/Ninja/SkirtOverKneelCrotchStrap.png b/Models/Ninja/SkirtOverKneelCrotchStrap.png new file mode 100644 index 000000000..d065515c6 Binary files /dev/null and b/Models/Ninja/SkirtOverKneelCrotchStrap.png differ diff --git a/Models/Ninja/SockLeftClosed.png b/Models/Ninja/SockLeftClosed.png new file mode 100644 index 000000000..dde17862b Binary files /dev/null and b/Models/Ninja/SockLeftClosed.png differ diff --git a/Models/Ninja/SockLeftHogtie.png b/Models/Ninja/SockLeftHogtie.png new file mode 100644 index 000000000..7af57bf77 Binary files /dev/null and b/Models/Ninja/SockLeftHogtie.png differ diff --git a/Models/Ninja/SockLeftKneel.png b/Models/Ninja/SockLeftKneel.png new file mode 100644 index 000000000..366fb5fe7 Binary files /dev/null and b/Models/Ninja/SockLeftKneel.png differ diff --git a/Models/Ninja/SockLeftKneelClosed.png b/Models/Ninja/SockLeftKneelClosed.png new file mode 100644 index 000000000..8aa8d6f22 Binary files /dev/null and b/Models/Ninja/SockLeftKneelClosed.png differ diff --git a/Models/Ninja/SockLeftSpread.png b/Models/Ninja/SockLeftSpread.png new file mode 100644 index 000000000..7809221b8 Binary files /dev/null and b/Models/Ninja/SockLeftSpread.png differ diff --git a/Models/Ninja/SockRightClosed.png b/Models/Ninja/SockRightClosed.png new file mode 100644 index 000000000..d88e2efcc Binary files /dev/null and b/Models/Ninja/SockRightClosed.png differ diff --git a/Models/Ninja/SockRightHogtie.png b/Models/Ninja/SockRightHogtie.png new file mode 100644 index 000000000..593984641 Binary files /dev/null and b/Models/Ninja/SockRightHogtie.png differ diff --git a/Models/Ninja/SockRightKneel.png b/Models/Ninja/SockRightKneel.png new file mode 100644 index 000000000..5af1b81c6 Binary files /dev/null and b/Models/Ninja/SockRightKneel.png differ diff --git a/Models/Ninja/SockRightKneelClosed.png b/Models/Ninja/SockRightKneelClosed.png new file mode 100644 index 000000000..3767e5b0c Binary files /dev/null and b/Models/Ninja/SockRightKneelClosed.png differ diff --git a/Models/Ninja/SockRightSpread.png b/Models/Ninja/SockRightSpread.png new file mode 100644 index 000000000..5194d49ea Binary files /dev/null and b/Models/Ninja/SockRightSpread.png differ diff --git a/Models/Ninja/ThighLeftClosed.png b/Models/Ninja/ThighLeftClosed.png new file mode 100644 index 000000000..50226d1be Binary files /dev/null and b/Models/Ninja/ThighLeftClosed.png differ diff --git a/Models/Ninja/ThighLeftHogtie.png b/Models/Ninja/ThighLeftHogtie.png new file mode 100644 index 000000000..81ae2b64c Binary files /dev/null and b/Models/Ninja/ThighLeftHogtie.png differ diff --git a/Models/Ninja/ThighLeftKneel.png b/Models/Ninja/ThighLeftKneel.png new file mode 100644 index 000000000..b6abc1339 Binary files /dev/null and b/Models/Ninja/ThighLeftKneel.png differ diff --git a/Models/Ninja/ThighLeftKneelClosed.png b/Models/Ninja/ThighLeftKneelClosed.png new file mode 100644 index 000000000..4f6f3efce Binary files /dev/null and b/Models/Ninja/ThighLeftKneelClosed.png differ diff --git a/Models/Ninja/ThighLeftSpread.png b/Models/Ninja/ThighLeftSpread.png new file mode 100644 index 000000000..4ebba93da Binary files /dev/null and b/Models/Ninja/ThighLeftSpread.png differ diff --git a/Models/Ninja/ThighRightClosed.png b/Models/Ninja/ThighRightClosed.png new file mode 100644 index 000000000..e4dfa8363 Binary files /dev/null and b/Models/Ninja/ThighRightClosed.png differ diff --git a/Models/Ninja/ThighRightHogtie.png b/Models/Ninja/ThighRightHogtie.png new file mode 100644 index 000000000..2e348a9d8 Binary files /dev/null and b/Models/Ninja/ThighRightHogtie.png differ diff --git a/Models/Ninja/ThighRightKneel.png b/Models/Ninja/ThighRightKneel.png new file mode 100644 index 000000000..d8d83b313 Binary files /dev/null and b/Models/Ninja/ThighRightKneel.png differ diff --git a/Models/Ninja/ThighRightKneelClosed.png b/Models/Ninja/ThighRightKneelClosed.png new file mode 100644 index 000000000..d8d83b313 Binary files /dev/null and b/Models/Ninja/ThighRightKneelClosed.png differ diff --git a/Models/Ninja/ThighRightSpread.png b/Models/Ninja/ThighRightSpread.png new file mode 100644 index 000000000..a5a924376 Binary files /dev/null and b/Models/Ninja/ThighRightSpread.png differ diff --git a/Models/Ninja/Top.png b/Models/Ninja/Top.png new file mode 100644 index 000000000..3779d25df Binary files /dev/null and b/Models/Ninja/Top.png differ diff --git a/Models/Ninja/TopBand.png b/Models/Ninja/TopBand.png new file mode 100644 index 000000000..5b0ee0b05 Binary files /dev/null and b/Models/Ninja/TopBand.png differ diff --git a/Models/Ninja/TopBandChest.png b/Models/Ninja/TopBandChest.png new file mode 100644 index 000000000..5f31e79ec Binary files /dev/null and b/Models/Ninja/TopBandChest.png differ diff --git a/Models/Ninja/TopBandChestTied.png b/Models/Ninja/TopBandChestTied.png new file mode 100644 index 000000000..e275ca8fe Binary files /dev/null and b/Models/Ninja/TopBandChestTied.png differ diff --git a/Models/Ninja/TopBandChestUp.png b/Models/Ninja/TopBandChestUp.png new file mode 100644 index 000000000..96a2bac46 Binary files /dev/null and b/Models/Ninja/TopBandChestUp.png differ diff --git a/Models/Ninja/TopBandRim.png b/Models/Ninja/TopBandRim.png new file mode 100644 index 000000000..1ab6bf8e0 Binary files /dev/null and b/Models/Ninja/TopBandRim.png differ diff --git a/Models/Ninja/TopBandRimChest.png b/Models/Ninja/TopBandRimChest.png new file mode 100644 index 000000000..4b77c4b63 Binary files /dev/null and b/Models/Ninja/TopBandRimChest.png differ diff --git a/Models/Ninja/TopBandRimChestTied.png b/Models/Ninja/TopBandRimChestTied.png new file mode 100644 index 000000000..4de1aa0f8 Binary files /dev/null and b/Models/Ninja/TopBandRimChestTied.png differ diff --git a/Models/Ninja/TopBandRimChestUp.png b/Models/Ninja/TopBandRimChestUp.png new file mode 100644 index 000000000..f82a81e95 Binary files /dev/null and b/Models/Ninja/TopBandRimChestUp.png differ diff --git a/Models/Ninja/TopChest.png b/Models/Ninja/TopChest.png new file mode 100644 index 000000000..aec63dde9 Binary files /dev/null and b/Models/Ninja/TopChest.png differ diff --git a/Models/Ninja/TopChestTied.png b/Models/Ninja/TopChestTied.png new file mode 100644 index 000000000..9ddbcd5ad Binary files /dev/null and b/Models/Ninja/TopChestTied.png differ diff --git a/Models/Ninja/TopChestUp.png b/Models/Ninja/TopChestUp.png new file mode 100644 index 000000000..99e876552 Binary files /dev/null and b/Models/Ninja/TopChestUp.png differ diff --git a/Models/Ninja/TopShoulders.png b/Models/Ninja/TopShoulders.png new file mode 100644 index 000000000..183b7a367 Binary files /dev/null and b/Models/Ninja/TopShoulders.png differ diff --git a/Models/Ninja/TopShouldersTied.png b/Models/Ninja/TopShouldersTied.png new file mode 100644 index 000000000..2cc4be386 Binary files /dev/null and b/Models/Ninja/TopShouldersTied.png differ diff --git a/Models/Ninja/TopShouldersUp.png b/Models/Ninja/TopShouldersUp.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Ninja/TopShouldersUp.png differ diff --git a/Models/Nipples/Clamps.png b/Models/Nipples/Clamps.png new file mode 100644 index 000000000..7de7afedc Binary files /dev/null and b/Models/Nipples/Clamps.png differ diff --git a/Models/Nipples/ClampsBullet.png b/Models/Nipples/ClampsBullet.png new file mode 100644 index 000000000..a5911cb0a Binary files /dev/null and b/Models/Nipples/ClampsBullet.png differ diff --git a/Models/Nipples/Rings.png b/Models/Nipples/Rings.png new file mode 100644 index 000000000..11437553d Binary files /dev/null and b/Models/Nipples/Rings.png differ diff --git a/Models/Nipples/RingsBullet.png b/Models/Nipples/RingsBullet.png new file mode 100644 index 000000000..da088418b Binary files /dev/null and b/Models/Nipples/RingsBullet.png differ diff --git a/Models/Nipples/VibePiercings.png b/Models/Nipples/VibePiercings.png new file mode 100644 index 000000000..d039eb1ff Binary files /dev/null and b/Models/Nipples/VibePiercings.png differ diff --git a/Models/Nipples/VibePiercingsBullet.png b/Models/Nipples/VibePiercingsBullet.png new file mode 100644 index 000000000..12d0cbca4 Binary files /dev/null and b/Models/Nipples/VibePiercingsBullet.png differ diff --git a/Models/Nipples/Weights.png b/Models/Nipples/Weights.png new file mode 100644 index 000000000..370cf6aa0 Binary files /dev/null and b/Models/Nipples/Weights.png differ diff --git a/Models/OperaGloves/ForeGloveLeftCrossed.png b/Models/OperaGloves/ForeGloveLeftCrossed.png new file mode 100644 index 000000000..a8dc75237 Binary files /dev/null and b/Models/OperaGloves/ForeGloveLeftCrossed.png differ diff --git a/Models/OperaGloves/ForeGloveLeftFront.png b/Models/OperaGloves/ForeGloveLeftFront.png new file mode 100644 index 000000000..164f653dd Binary files /dev/null and b/Models/OperaGloves/ForeGloveLeftFront.png differ diff --git a/Models/OperaGloves/ForeGloveRightCrossed.png b/Models/OperaGloves/ForeGloveRightCrossed.png new file mode 100644 index 000000000..5e6e746dd Binary files /dev/null and b/Models/OperaGloves/ForeGloveRightCrossed.png differ diff --git a/Models/OperaGloves/ForeGloveRightFront.png b/Models/OperaGloves/ForeGloveRightFront.png new file mode 100644 index 000000000..bd387bfde Binary files /dev/null and b/Models/OperaGloves/ForeGloveRightFront.png differ diff --git a/Models/OperaGloves/GloveLeftBoxtie.png b/Models/OperaGloves/GloveLeftBoxtie.png new file mode 100644 index 000000000..1b01ca135 Binary files /dev/null and b/Models/OperaGloves/GloveLeftBoxtie.png differ diff --git a/Models/OperaGloves/GloveLeftCrossed.png b/Models/OperaGloves/GloveLeftCrossed.png new file mode 100644 index 000000000..c19f2bd9f Binary files /dev/null and b/Models/OperaGloves/GloveLeftCrossed.png differ diff --git a/Models/OperaGloves/GloveLeftFree.png b/Models/OperaGloves/GloveLeftFree.png new file mode 100644 index 000000000..4d6a56ee9 Binary files /dev/null and b/Models/OperaGloves/GloveLeftFree.png differ diff --git a/Models/OperaGloves/GloveLeftFront.png b/Models/OperaGloves/GloveLeftFront.png new file mode 100644 index 000000000..c48ad2437 Binary files /dev/null and b/Models/OperaGloves/GloveLeftFront.png differ diff --git a/Models/OperaGloves/GloveLeftUp.png b/Models/OperaGloves/GloveLeftUp.png new file mode 100644 index 000000000..a3d7245fb Binary files /dev/null and b/Models/OperaGloves/GloveLeftUp.png differ diff --git a/Models/OperaGloves/GloveLeftWristtie.png b/Models/OperaGloves/GloveLeftWristtie.png new file mode 100644 index 000000000..2ab3e79ab Binary files /dev/null and b/Models/OperaGloves/GloveLeftWristtie.png differ diff --git a/Models/OperaGloves/GloveLeftYoked.png b/Models/OperaGloves/GloveLeftYoked.png new file mode 100644 index 000000000..32222491b Binary files /dev/null and b/Models/OperaGloves/GloveLeftYoked.png differ diff --git a/Models/OperaGloves/GloveRightBoxtie.png b/Models/OperaGloves/GloveRightBoxtie.png new file mode 100644 index 000000000..618b3ecc1 Binary files /dev/null and b/Models/OperaGloves/GloveRightBoxtie.png differ diff --git a/Models/OperaGloves/GloveRightCrossed.png b/Models/OperaGloves/GloveRightCrossed.png new file mode 100644 index 000000000..69a9dd974 Binary files /dev/null and b/Models/OperaGloves/GloveRightCrossed.png differ diff --git a/Models/OperaGloves/GloveRightFree.png b/Models/OperaGloves/GloveRightFree.png new file mode 100644 index 000000000..35be9d652 Binary files /dev/null and b/Models/OperaGloves/GloveRightFree.png differ diff --git a/Models/OperaGloves/GloveRightFront.png b/Models/OperaGloves/GloveRightFront.png new file mode 100644 index 000000000..c17fa38b4 Binary files /dev/null and b/Models/OperaGloves/GloveRightFront.png differ diff --git a/Models/OperaGloves/GloveRightUp.png b/Models/OperaGloves/GloveRightUp.png new file mode 100644 index 000000000..d2d381661 Binary files /dev/null and b/Models/OperaGloves/GloveRightUp.png differ diff --git a/Models/OperaGloves/GloveRightWristtie.png b/Models/OperaGloves/GloveRightWristtie.png new file mode 100644 index 000000000..18aa41cb2 Binary files /dev/null and b/Models/OperaGloves/GloveRightWristtie.png differ diff --git a/Models/OperaGloves/GloveRightYoked.png b/Models/OperaGloves/GloveRightYoked.png new file mode 100644 index 000000000..15c182988 Binary files /dev/null and b/Models/OperaGloves/GloveRightYoked.png differ diff --git a/Models/Panties/Base.png b/Models/Panties/Base.png new file mode 100644 index 000000000..575c043e2 Binary files /dev/null and b/Models/Panties/Base.png differ diff --git a/Models/Panties/BaseClosed.png b/Models/Panties/BaseClosed.png new file mode 100644 index 000000000..5995375ee Binary files /dev/null and b/Models/Panties/BaseClosed.png differ diff --git a/Models/Panties/BaseKneel.png b/Models/Panties/BaseKneel.png new file mode 100644 index 000000000..53e64fb38 Binary files /dev/null and b/Models/Panties/BaseKneel.png differ diff --git a/Models/Panties/Bow.png b/Models/Panties/Bow.png new file mode 100644 index 000000000..043e5e46e Binary files /dev/null and b/Models/Panties/Bow.png differ diff --git a/Models/Panties/Cherry.png b/Models/Panties/Cherry.png new file mode 100644 index 000000000..52965a12a Binary files /dev/null and b/Models/Panties/Cherry.png differ diff --git a/Models/Panties/CherryClosed.png b/Models/Panties/CherryClosed.png new file mode 100644 index 000000000..afb1183be Binary files /dev/null and b/Models/Panties/CherryClosed.png differ diff --git a/Models/Panties/CherryKneel.png b/Models/Panties/CherryKneel.png new file mode 100644 index 000000000..d55c45b86 Binary files /dev/null and b/Models/Panties/CherryKneel.png differ diff --git a/Models/Panties/InvertedRose.png b/Models/Panties/InvertedRose.png new file mode 100644 index 000000000..40de58254 Binary files /dev/null and b/Models/Panties/InvertedRose.png differ diff --git a/Models/Panties/InvertedRoseClosed.png b/Models/Panties/InvertedRoseClosed.png new file mode 100644 index 000000000..925443457 Binary files /dev/null and b/Models/Panties/InvertedRoseClosed.png differ diff --git a/Models/Panties/InvertedRoseKneel.png b/Models/Panties/InvertedRoseKneel.png new file mode 100644 index 000000000..330bbc789 Binary files /dev/null and b/Models/Panties/InvertedRoseKneel.png differ diff --git a/Models/Panties/Lace.png b/Models/Panties/Lace.png new file mode 100644 index 000000000..3c9db92aa Binary files /dev/null and b/Models/Panties/Lace.png differ diff --git a/Models/Panties/LacesKneel.png b/Models/Panties/LacesKneel.png new file mode 100644 index 000000000..551b569f2 Binary files /dev/null and b/Models/Panties/LacesKneel.png differ diff --git a/Models/Panties/Lines.png b/Models/Panties/Lines.png new file mode 100644 index 000000000..605c3cd20 Binary files /dev/null and b/Models/Panties/Lines.png differ diff --git a/Models/Panties/LinesClosed.png b/Models/Panties/LinesClosed.png new file mode 100644 index 000000000..b9d9011cf Binary files /dev/null and b/Models/Panties/LinesClosed.png differ diff --git a/Models/Panties/LinesKneel.png b/Models/Panties/LinesKneel.png new file mode 100644 index 000000000..e8f5de5d0 Binary files /dev/null and b/Models/Panties/LinesKneel.png differ diff --git a/Models/Panties/Stripes.png b/Models/Panties/Stripes.png new file mode 100644 index 000000000..91adc1af2 Binary files /dev/null and b/Models/Panties/Stripes.png differ diff --git a/Models/Panties/StripesClosed.png b/Models/Panties/StripesClosed.png new file mode 100644 index 000000000..3eb5e0a65 Binary files /dev/null and b/Models/Panties/StripesClosed.png differ diff --git a/Models/Panties/StripesKneel.png b/Models/Panties/StripesKneel.png new file mode 100644 index 000000000..220bdf244 Binary files /dev/null and b/Models/Panties/StripesKneel.png differ diff --git a/Models/PantiesHigh/Base.png b/Models/PantiesHigh/Base.png new file mode 100644 index 000000000..27e97d4d6 Binary files /dev/null and b/Models/PantiesHigh/Base.png differ diff --git a/Models/PantiesHigh/BaseClosed.png b/Models/PantiesHigh/BaseClosed.png new file mode 100644 index 000000000..e11eea868 Binary files /dev/null and b/Models/PantiesHigh/BaseClosed.png differ diff --git a/Models/PantiesHigh/Lines.png b/Models/PantiesHigh/Lines.png new file mode 100644 index 000000000..8f20b74d9 Binary files /dev/null and b/Models/PantiesHigh/Lines.png differ diff --git a/Models/PantiesHigh/LinesClosed.png b/Models/PantiesHigh/LinesClosed.png new file mode 100644 index 000000000..1a7f4ba96 Binary files /dev/null and b/Models/PantiesHigh/LinesClosed.png differ diff --git a/Models/PantiesHigh/Stripes.png b/Models/PantiesHigh/Stripes.png new file mode 100644 index 000000000..89b15103e Binary files /dev/null and b/Models/PantiesHigh/Stripes.png differ diff --git a/Models/PantiesHigh/StripesClosed.png b/Models/PantiesHigh/StripesClosed.png new file mode 100644 index 000000000..9735769d3 Binary files /dev/null and b/Models/PantiesHigh/StripesClosed.png differ diff --git a/Models/Petsuit/Arms.png b/Models/Petsuit/Arms.png new file mode 100644 index 000000000..838cf8eb9 Binary files /dev/null and b/Models/Petsuit/Arms.png differ diff --git a/Models/Petsuit/ArmsBelts.png b/Models/Petsuit/ArmsBelts.png new file mode 100644 index 000000000..03a86b1e8 Binary files /dev/null and b/Models/Petsuit/ArmsBelts.png differ diff --git a/Models/Petsuit/LeftLegsBeltsKneel.png b/Models/Petsuit/LeftLegsBeltsKneel.png new file mode 100644 index 000000000..2b1f06a1a Binary files /dev/null and b/Models/Petsuit/LeftLegsBeltsKneel.png differ diff --git a/Models/Petsuit/LeftLegsBeltsKneelClosed.png b/Models/Petsuit/LeftLegsBeltsKneelClosed.png new file mode 100644 index 000000000..0f21adb26 Binary files /dev/null and b/Models/Petsuit/LeftLegsBeltsKneelClosed.png differ diff --git a/Models/Petsuit/LeftLegsKneel.png b/Models/Petsuit/LeftLegsKneel.png new file mode 100644 index 000000000..46052786e Binary files /dev/null and b/Models/Petsuit/LeftLegsKneel.png differ diff --git a/Models/Petsuit/LeftLegsKneelClosed.png b/Models/Petsuit/LeftLegsKneelClosed.png new file mode 100644 index 000000000..574ead555 Binary files /dev/null and b/Models/Petsuit/LeftLegsKneelClosed.png differ diff --git a/Models/Petsuit/LegsBeltsHogtie.png b/Models/Petsuit/LegsBeltsHogtie.png new file mode 100644 index 000000000..46ad03792 Binary files /dev/null and b/Models/Petsuit/LegsBeltsHogtie.png differ diff --git a/Models/Petsuit/LegsBeltsKneel.png b/Models/Petsuit/LegsBeltsKneel.png new file mode 100644 index 000000000..414c75a00 Binary files /dev/null and b/Models/Petsuit/LegsBeltsKneel.png differ diff --git a/Models/Petsuit/LegsBeltsKneelClosed.png b/Models/Petsuit/LegsBeltsKneelClosed.png new file mode 100644 index 000000000..414c75a00 Binary files /dev/null and b/Models/Petsuit/LegsBeltsKneelClosed.png differ diff --git a/Models/Petsuit/LegsHogtie.png b/Models/Petsuit/LegsHogtie.png new file mode 100644 index 000000000..18028e863 Binary files /dev/null and b/Models/Petsuit/LegsHogtie.png differ diff --git a/Models/Petsuit/LegsKneel.png b/Models/Petsuit/LegsKneel.png new file mode 100644 index 000000000..d3bbe6cb3 Binary files /dev/null and b/Models/Petsuit/LegsKneel.png differ diff --git a/Models/Petsuit/LegsKneelClosed.png b/Models/Petsuit/LegsKneelClosed.png new file mode 100644 index 000000000..d3bbe6cb3 Binary files /dev/null and b/Models/Petsuit/LegsKneelClosed.png differ diff --git a/Models/Petsuit/Petsuit.png b/Models/Petsuit/Petsuit.png new file mode 100644 index 000000000..46ad03792 Binary files /dev/null and b/Models/Petsuit/Petsuit.png differ diff --git a/Models/Petsuit/Petsuit.psd b/Models/Petsuit/Petsuit.psd new file mode 100644 index 000000000..a40c4c78f Binary files /dev/null and b/Models/Petsuit/Petsuit.psd differ diff --git a/Models/Pointy/Ahoge.png b/Models/Pointy/Ahoge.png new file mode 100644 index 000000000..8e2386cfa Binary files /dev/null and b/Models/Pointy/Ahoge.png differ diff --git a/Models/Pointy/AnthenaL.png b/Models/Pointy/AnthenaL.png new file mode 100644 index 000000000..29e44b987 Binary files /dev/null and b/Models/Pointy/AnthenaL.png differ diff --git a/Models/Pointy/AnthenaR.png b/Models/Pointy/AnthenaR.png new file mode 100644 index 000000000..681dd50ec Binary files /dev/null and b/Models/Pointy/AnthenaR.png differ diff --git a/Models/Pointy/HornL.png b/Models/Pointy/HornL.png new file mode 100644 index 000000000..c0d25ef7b Binary files /dev/null and b/Models/Pointy/HornL.png differ diff --git a/Models/Pointy/HornR.png b/Models/Pointy/HornR.png new file mode 100644 index 000000000..5f24f2fa5 Binary files /dev/null and b/Models/Pointy/HornR.png differ diff --git a/Models/Pointy/Tail.png b/Models/Pointy/Tail.png new file mode 100644 index 000000000..0617262e8 Binary files /dev/null and b/Models/Pointy/Tail.png differ diff --git a/Models/Pony/Collar.png b/Models/Pony/Collar.png new file mode 100644 index 000000000..7c7e493c2 Binary files /dev/null and b/Models/Pony/Collar.png differ diff --git a/Models/Pony/CollarTag.png b/Models/Pony/CollarTag.png new file mode 100644 index 000000000..9a05dc32f Binary files /dev/null and b/Models/Pony/CollarTag.png differ diff --git a/Models/Pony/CollarTagHogtie.png b/Models/Pony/CollarTagHogtie.png new file mode 100644 index 000000000..320123cca Binary files /dev/null and b/Models/Pony/CollarTagHogtie.png differ diff --git a/Models/Ribbon/Arm1Boxtie.png b/Models/Ribbon/Arm1Boxtie.png new file mode 100644 index 000000000..cb8e83841 Binary files /dev/null and b/Models/Ribbon/Arm1Boxtie.png differ diff --git a/Models/Ribbon/Arm1Up.png b/Models/Ribbon/Arm1Up.png new file mode 100644 index 000000000..0765d7a65 Binary files /dev/null and b/Models/Ribbon/Arm1Up.png differ diff --git a/Models/Ribbon/Arm1Wristtie.png b/Models/Ribbon/Arm1Wristtie.png new file mode 100644 index 000000000..6b8c6387f Binary files /dev/null and b/Models/Ribbon/Arm1Wristtie.png differ diff --git a/Models/Ribbon/Arm2Boxtie.png b/Models/Ribbon/Arm2Boxtie.png new file mode 100644 index 000000000..0bc0daa43 Binary files /dev/null and b/Models/Ribbon/Arm2Boxtie.png differ diff --git a/Models/Ribbon/Arm2Up.png b/Models/Ribbon/Arm2Up.png new file mode 100644 index 000000000..15aef99c2 Binary files /dev/null and b/Models/Ribbon/Arm2Up.png differ diff --git a/Models/Ribbon/Arm2Wristtie.png b/Models/Ribbon/Arm2Wristtie.png new file mode 100644 index 000000000..44977db7f Binary files /dev/null and b/Models/Ribbon/Arm2Wristtie.png differ diff --git a/Models/Ribbon/ArmHarness.png b/Models/Ribbon/ArmHarness.png new file mode 100644 index 000000000..4f2e7fc0b Binary files /dev/null and b/Models/Ribbon/ArmHarness.png differ diff --git a/Models/Ribbon/ArmHarnessUnderbust.png b/Models/Ribbon/ArmHarnessUnderbust.png new file mode 100644 index 000000000..42c716e82 Binary files /dev/null and b/Models/Ribbon/ArmHarnessUnderbust.png differ diff --git a/Models/Ribbon/ArmStrapCrossed.png b/Models/Ribbon/ArmStrapCrossed.png new file mode 100644 index 000000000..5adc0b0c8 Binary files /dev/null and b/Models/Ribbon/ArmStrapCrossed.png differ diff --git a/Models/Ribbon/Belt.png b/Models/Ribbon/Belt.png new file mode 100644 index 000000000..bdf75dc45 Binary files /dev/null and b/Models/Ribbon/Belt.png differ diff --git a/Models/Ribbon/Bow.png b/Models/Ribbon/Bow.png new file mode 100644 index 000000000..27a674fd2 Binary files /dev/null and b/Models/Ribbon/Bow.png differ diff --git a/Models/Ribbon/BowCrotch.png b/Models/Ribbon/BowCrotch.png new file mode 100644 index 000000000..8929c2635 Binary files /dev/null and b/Models/Ribbon/BowCrotch.png differ diff --git a/Models/Ribbon/BowFront.png b/Models/Ribbon/BowFront.png new file mode 100644 index 000000000..13931ae6b Binary files /dev/null and b/Models/Ribbon/BowFront.png differ diff --git a/Models/Ribbon/Calf1Closed.png b/Models/Ribbon/Calf1Closed.png new file mode 100644 index 000000000..8894c9817 Binary files /dev/null and b/Models/Ribbon/Calf1Closed.png differ diff --git a/Models/Ribbon/Calf1KneelClosed.png b/Models/Ribbon/Calf1KneelClosed.png new file mode 100644 index 000000000..a7eb2fa19 Binary files /dev/null and b/Models/Ribbon/Calf1KneelClosed.png differ diff --git a/Models/Ribbon/Calf2Closed.png b/Models/Ribbon/Calf2Closed.png new file mode 100644 index 000000000..1faff7240 Binary files /dev/null and b/Models/Ribbon/Calf2Closed.png differ diff --git a/Models/Ribbon/Calf2Hogtie.png b/Models/Ribbon/Calf2Hogtie.png new file mode 100644 index 000000000..2dedb5587 Binary files /dev/null and b/Models/Ribbon/Calf2Hogtie.png differ diff --git a/Models/Ribbon/Calf2KneelClosed.png b/Models/Ribbon/Calf2KneelClosed.png new file mode 100644 index 000000000..6f300cef0 Binary files /dev/null and b/Models/Ribbon/Calf2KneelClosed.png differ diff --git a/Models/Ribbon/Calf3Closed.png b/Models/Ribbon/Calf3Closed.png new file mode 100644 index 000000000..3e80b4cc9 Binary files /dev/null and b/Models/Ribbon/Calf3Closed.png differ diff --git a/Models/Ribbon/Calf3Hogtie.png b/Models/Ribbon/Calf3Hogtie.png new file mode 100644 index 000000000..e36bbc7b8 Binary files /dev/null and b/Models/Ribbon/Calf3Hogtie.png differ diff --git a/Models/Ribbon/Calf3KneelClosed.png b/Models/Ribbon/Calf3KneelClosed.png new file mode 100644 index 000000000..989515abd Binary files /dev/null and b/Models/Ribbon/Calf3KneelClosed.png differ diff --git a/Models/Ribbon/Crotch.png b/Models/Ribbon/Crotch.png new file mode 100644 index 000000000..b7d693a0e Binary files /dev/null and b/Models/Ribbon/Crotch.png differ diff --git a/Models/Ribbon/CrotchStrap.png b/Models/Ribbon/CrotchStrap.png new file mode 100644 index 000000000..103baf323 Binary files /dev/null and b/Models/Ribbon/CrotchStrap.png differ diff --git a/Models/Ribbon/Cuffs.png b/Models/Ribbon/Cuffs.png new file mode 100644 index 000000000..004823e9e Binary files /dev/null and b/Models/Ribbon/Cuffs.png differ diff --git a/Models/Ribbon/FeetClosed.png b/Models/Ribbon/FeetClosed.png new file mode 100644 index 000000000..2f5cc1af9 Binary files /dev/null and b/Models/Ribbon/FeetClosed.png differ diff --git a/Models/Ribbon/Harness.png b/Models/Ribbon/Harness.png new file mode 100644 index 000000000..c4cb5926c Binary files /dev/null and b/Models/Ribbon/Harness.png differ diff --git a/Models/Ribbon/HarnessLower.png b/Models/Ribbon/HarnessLower.png new file mode 100644 index 000000000..37513b806 Binary files /dev/null and b/Models/Ribbon/HarnessLower.png differ diff --git a/Models/Ribbon/HarnessLowerStrap.png b/Models/Ribbon/HarnessLowerStrap.png new file mode 100644 index 000000000..9e9fe2141 Binary files /dev/null and b/Models/Ribbon/HarnessLowerStrap.png differ diff --git a/Models/Ribbon/HarnessMid.png b/Models/Ribbon/HarnessMid.png new file mode 100644 index 000000000..03a60f793 Binary files /dev/null and b/Models/Ribbon/HarnessMid.png differ diff --git a/Models/Ribbon/HarnessMidFlattened.png b/Models/Ribbon/HarnessMidFlattened.png new file mode 100644 index 000000000..b9f27b089 Binary files /dev/null and b/Models/Ribbon/HarnessMidFlattened.png differ diff --git a/Models/Ribbon/LegsKneel.png b/Models/Ribbon/LegsKneel.png new file mode 100644 index 000000000..3f0778426 Binary files /dev/null and b/Models/Ribbon/LegsKneel.png differ diff --git a/Models/Ribbon/RightThigh1KneelClosed.png b/Models/Ribbon/RightThigh1KneelClosed.png new file mode 100644 index 000000000..68d090d8c Binary files /dev/null and b/Models/Ribbon/RightThigh1KneelClosed.png differ diff --git a/Models/Ribbon/RightThigh2KneelClosed.png b/Models/Ribbon/RightThigh2KneelClosed.png new file mode 100644 index 000000000..c68b89d56 Binary files /dev/null and b/Models/Ribbon/RightThigh2KneelClosed.png differ diff --git a/Models/Ribbon/RightThigh3KneelClosed.png b/Models/Ribbon/RightThigh3KneelClosed.png new file mode 100644 index 000000000..46e97e893 Binary files /dev/null and b/Models/Ribbon/RightThigh3KneelClosed.png differ diff --git a/Models/Ribbon/Thigh1Closed.png b/Models/Ribbon/Thigh1Closed.png new file mode 100644 index 000000000..ae24dc9d4 Binary files /dev/null and b/Models/Ribbon/Thigh1Closed.png differ diff --git a/Models/Ribbon/Thigh1KneelClosed.png b/Models/Ribbon/Thigh1KneelClosed.png new file mode 100644 index 000000000..f0f2559e4 Binary files /dev/null and b/Models/Ribbon/Thigh1KneelClosed.png differ diff --git a/Models/Ribbon/Thigh2Closed.png b/Models/Ribbon/Thigh2Closed.png new file mode 100644 index 000000000..6f91aa55e Binary files /dev/null and b/Models/Ribbon/Thigh2Closed.png differ diff --git a/Models/Ribbon/Thigh2KneelClosed.png b/Models/Ribbon/Thigh2KneelClosed.png new file mode 100644 index 000000000..0aa282863 Binary files /dev/null and b/Models/Ribbon/Thigh2KneelClosed.png differ diff --git a/Models/Ribbon/Thigh3Closed.png b/Models/Ribbon/Thigh3Closed.png new file mode 100644 index 000000000..e142ed76b Binary files /dev/null and b/Models/Ribbon/Thigh3Closed.png differ diff --git a/Models/Ribbon/Thigh3KneelClosed.png b/Models/Ribbon/Thigh3KneelClosed.png new file mode 100644 index 000000000..5408775f8 Binary files /dev/null and b/Models/Ribbon/Thigh3KneelClosed.png differ diff --git a/Models/Ribbon/ToeClosed.png b/Models/Ribbon/ToeClosed.png new file mode 100644 index 000000000..cce192b8d Binary files /dev/null and b/Models/Ribbon/ToeClosed.png differ diff --git a/Models/Ribbon/TopArmHarness.png b/Models/Ribbon/TopArmHarness.png new file mode 100644 index 000000000..988fe28cc Binary files /dev/null and b/Models/Ribbon/TopArmHarness.png differ diff --git a/Models/Ribbon/TopArmHarnessUnderbust.png b/Models/Ribbon/TopArmHarnessUnderbust.png new file mode 100644 index 000000000..c808f32da Binary files /dev/null and b/Models/Ribbon/TopArmHarnessUnderbust.png differ diff --git a/Models/Ribbon/TopArmStrapCrossed.png b/Models/Ribbon/TopArmStrapCrossed.png new file mode 100644 index 000000000..0233029cf Binary files /dev/null and b/Models/Ribbon/TopArmStrapCrossed.png differ diff --git a/Models/Ribbon/TopArmsBoxtie.png b/Models/Ribbon/TopArmsBoxtie.png new file mode 100644 index 000000000..14a9d18b7 Binary files /dev/null and b/Models/Ribbon/TopArmsBoxtie.png differ diff --git a/Models/Ribbon/TopArmsUp.png b/Models/Ribbon/TopArmsUp.png new file mode 100644 index 000000000..1c2e5d907 Binary files /dev/null and b/Models/Ribbon/TopArmsUp.png differ diff --git a/Models/Ribbon/TopArmsWristtie.png b/Models/Ribbon/TopArmsWristtie.png new file mode 100644 index 000000000..142e4363b Binary files /dev/null and b/Models/Ribbon/TopArmsWristtie.png differ diff --git a/Models/Ribbon/TopBelt.png b/Models/Ribbon/TopBelt.png new file mode 100644 index 000000000..a54dd3626 Binary files /dev/null and b/Models/Ribbon/TopBelt.png differ diff --git a/Models/Ribbon/TopBowBoxtie.png b/Models/Ribbon/TopBowBoxtie.png new file mode 100644 index 000000000..8e36a458f Binary files /dev/null and b/Models/Ribbon/TopBowBoxtie.png differ diff --git a/Models/Ribbon/TopBowCrotch.png b/Models/Ribbon/TopBowCrotch.png new file mode 100644 index 000000000..1e72754c3 Binary files /dev/null and b/Models/Ribbon/TopBowCrotch.png differ diff --git a/Models/Ribbon/TopBowWristtie.png b/Models/Ribbon/TopBowWristtie.png new file mode 100644 index 000000000..f4f923f7e Binary files /dev/null and b/Models/Ribbon/TopBowWristtie.png differ diff --git a/Models/Ribbon/TopCalf1Closed.png b/Models/Ribbon/TopCalf1Closed.png new file mode 100644 index 000000000..21d24aac3 Binary files /dev/null and b/Models/Ribbon/TopCalf1Closed.png differ diff --git a/Models/Ribbon/TopCalf1KneelClosed.png b/Models/Ribbon/TopCalf1KneelClosed.png new file mode 100644 index 000000000..25b79ec96 Binary files /dev/null and b/Models/Ribbon/TopCalf1KneelClosed.png differ diff --git a/Models/Ribbon/TopCalf2Closed.png b/Models/Ribbon/TopCalf2Closed.png new file mode 100644 index 000000000..9cfd36abd Binary files /dev/null and b/Models/Ribbon/TopCalf2Closed.png differ diff --git a/Models/Ribbon/TopCalf2KneelClosed.png b/Models/Ribbon/TopCalf2KneelClosed.png new file mode 100644 index 000000000..5b5e4bf18 Binary files /dev/null and b/Models/Ribbon/TopCalf2KneelClosed.png differ diff --git a/Models/Ribbon/TopCalf3Closed.png b/Models/Ribbon/TopCalf3Closed.png new file mode 100644 index 000000000..d8caae3ee Binary files /dev/null and b/Models/Ribbon/TopCalf3Closed.png differ diff --git a/Models/Ribbon/TopCalf3KneelClosed.png b/Models/Ribbon/TopCalf3KneelClosed.png new file mode 100644 index 000000000..84f080f2d Binary files /dev/null and b/Models/Ribbon/TopCalf3KneelClosed.png differ diff --git a/Models/Ribbon/TopCrotch.png b/Models/Ribbon/TopCrotch.png new file mode 100644 index 000000000..0cbea824a Binary files /dev/null and b/Models/Ribbon/TopCrotch.png differ diff --git a/Models/Ribbon/TopCrotchStrap.png b/Models/Ribbon/TopCrotchStrap.png new file mode 100644 index 000000000..b1b6faa68 Binary files /dev/null and b/Models/Ribbon/TopCrotchStrap.png differ diff --git a/Models/Ribbon/TopCuffs.png b/Models/Ribbon/TopCuffs.png new file mode 100644 index 000000000..eae038178 Binary files /dev/null and b/Models/Ribbon/TopCuffs.png differ diff --git a/Models/Ribbon/TopFeetClosed.png b/Models/Ribbon/TopFeetClosed.png new file mode 100644 index 000000000..666ccdb57 Binary files /dev/null and b/Models/Ribbon/TopFeetClosed.png differ diff --git a/Models/Ribbon/TopHarness.png b/Models/Ribbon/TopHarness.png new file mode 100644 index 000000000..3672b761a Binary files /dev/null and b/Models/Ribbon/TopHarness.png differ diff --git a/Models/Ribbon/TopHarnessLower.png b/Models/Ribbon/TopHarnessLower.png new file mode 100644 index 000000000..0f9a1c7d9 Binary files /dev/null and b/Models/Ribbon/TopHarnessLower.png differ diff --git a/Models/Ribbon/TopHarnessMid.png b/Models/Ribbon/TopHarnessMid.png new file mode 100644 index 000000000..8bd714822 Binary files /dev/null and b/Models/Ribbon/TopHarnessMid.png differ diff --git a/Models/Ribbon/TopHarnessMidFlattened.png b/Models/Ribbon/TopHarnessMidFlattened.png new file mode 100644 index 000000000..fa1d85aa9 Binary files /dev/null and b/Models/Ribbon/TopHarnessMidFlattened.png differ diff --git a/Models/Ribbon/TopLegsKneel.png b/Models/Ribbon/TopLegsKneel.png new file mode 100644 index 000000000..f4654eebf Binary files /dev/null and b/Models/Ribbon/TopLegsKneel.png differ diff --git a/Models/Ribbon/TopRightThigh1KneelClosed.png b/Models/Ribbon/TopRightThigh1KneelClosed.png new file mode 100644 index 000000000..130a6dcbd Binary files /dev/null and b/Models/Ribbon/TopRightThigh1KneelClosed.png differ diff --git a/Models/Ribbon/TopRightThigh2KneelClosed.png b/Models/Ribbon/TopRightThigh2KneelClosed.png new file mode 100644 index 000000000..a31b07a51 Binary files /dev/null and b/Models/Ribbon/TopRightThigh2KneelClosed.png differ diff --git a/Models/Ribbon/TopRightThigh3KneelClosed.png b/Models/Ribbon/TopRightThigh3KneelClosed.png new file mode 100644 index 000000000..ef0112c69 Binary files /dev/null and b/Models/Ribbon/TopRightThigh3KneelClosed.png differ diff --git a/Models/Ribbon/TopThigh1Closed.png b/Models/Ribbon/TopThigh1Closed.png new file mode 100644 index 000000000..cca3f4cfa Binary files /dev/null and b/Models/Ribbon/TopThigh1Closed.png differ diff --git a/Models/Ribbon/TopThigh1KneelClosed.png b/Models/Ribbon/TopThigh1KneelClosed.png new file mode 100644 index 000000000..46abdfa79 Binary files /dev/null and b/Models/Ribbon/TopThigh1KneelClosed.png differ diff --git a/Models/Ribbon/TopThigh2Closed.png b/Models/Ribbon/TopThigh2Closed.png new file mode 100644 index 000000000..eceb67d60 Binary files /dev/null and b/Models/Ribbon/TopThigh2Closed.png differ diff --git a/Models/Ribbon/TopThigh2KneelClosed.png b/Models/Ribbon/TopThigh2KneelClosed.png new file mode 100644 index 000000000..19ddcf32d Binary files /dev/null and b/Models/Ribbon/TopThigh2KneelClosed.png differ diff --git a/Models/Ribbon/TopThigh3Closed.png b/Models/Ribbon/TopThigh3Closed.png new file mode 100644 index 000000000..83f210a00 Binary files /dev/null and b/Models/Ribbon/TopThigh3Closed.png differ diff --git a/Models/Ribbon/TopThigh3KneelClosed.png b/Models/Ribbon/TopThigh3KneelClosed.png new file mode 100644 index 000000000..de93da2e1 Binary files /dev/null and b/Models/Ribbon/TopThigh3KneelClosed.png differ diff --git a/Models/Ribbon/TopToeClosed.png b/Models/Ribbon/TopToeClosed.png new file mode 100644 index 000000000..5b36a3f12 Binary files /dev/null and b/Models/Ribbon/TopToeClosed.png differ diff --git a/Models/RobeOfChastity/BaseClosed.png b/Models/RobeOfChastity/BaseClosed.png new file mode 100644 index 000000000..1cb7da62c Binary files /dev/null and b/Models/RobeOfChastity/BaseClosed.png differ diff --git a/Models/RobeOfChastity/BaseKneel.png b/Models/RobeOfChastity/BaseKneel.png new file mode 100644 index 000000000..6be6ee1a2 Binary files /dev/null and b/Models/RobeOfChastity/BaseKneel.png differ diff --git a/Models/RobeOfChastity/BaseSpread.png b/Models/RobeOfChastity/BaseSpread.png new file mode 100644 index 000000000..22a54e39a Binary files /dev/null and b/Models/RobeOfChastity/BaseSpread.png differ diff --git a/Models/RobeOfChastity/Cape.png b/Models/RobeOfChastity/Cape.png new file mode 100644 index 000000000..c8c610551 Binary files /dev/null and b/Models/RobeOfChastity/Cape.png differ diff --git a/Models/RobeOfChastity/CapeKneel.png b/Models/RobeOfChastity/CapeKneel.png new file mode 100644 index 000000000..b6fd6160b Binary files /dev/null and b/Models/RobeOfChastity/CapeKneel.png differ diff --git a/Models/RobeOfChastity/ChestBase.png b/Models/RobeOfChastity/ChestBase.png new file mode 100644 index 000000000..bc908ba27 Binary files /dev/null and b/Models/RobeOfChastity/ChestBase.png differ diff --git a/Models/RobeOfChastity/ChestBaseTied.png b/Models/RobeOfChastity/ChestBaseTied.png new file mode 100644 index 000000000..7c2c6f0a0 Binary files /dev/null and b/Models/RobeOfChastity/ChestBaseTied.png differ diff --git a/Models/RobeOfChastity/ChestFabric.png b/Models/RobeOfChastity/ChestFabric.png new file mode 100644 index 000000000..8e56743b3 Binary files /dev/null and b/Models/RobeOfChastity/ChestFabric.png differ diff --git a/Models/RobeOfChastity/ChestFabricTied.png b/Models/RobeOfChastity/ChestFabricTied.png new file mode 100644 index 000000000..446a2bba1 Binary files /dev/null and b/Models/RobeOfChastity/ChestFabricTied.png differ diff --git a/Models/RobeOfChastity/ChestFrill.png b/Models/RobeOfChastity/ChestFrill.png new file mode 100644 index 000000000..c9b5d467d Binary files /dev/null and b/Models/RobeOfChastity/ChestFrill.png differ diff --git a/Models/RobeOfChastity/ChestGold.png b/Models/RobeOfChastity/ChestGold.png new file mode 100644 index 000000000..7510553e5 Binary files /dev/null and b/Models/RobeOfChastity/ChestGold.png differ diff --git a/Models/RobeOfChastity/ChestGoldBase.png b/Models/RobeOfChastity/ChestGoldBase.png new file mode 100644 index 000000000..601b10c42 Binary files /dev/null and b/Models/RobeOfChastity/ChestGoldBase.png differ diff --git a/Models/RobeOfChastity/ChestGoldBaseTied.png b/Models/RobeOfChastity/ChestGoldBaseTied.png new file mode 100644 index 000000000..f1326e7a0 Binary files /dev/null and b/Models/RobeOfChastity/ChestGoldBaseTied.png differ diff --git a/Models/RobeOfChastity/ChestGoldTied.png b/Models/RobeOfChastity/ChestGoldTied.png new file mode 100644 index 000000000..d8456b187 Binary files /dev/null and b/Models/RobeOfChastity/ChestGoldTied.png differ diff --git a/Models/RobeOfChastity/ChestPlate.png b/Models/RobeOfChastity/ChestPlate.png new file mode 100644 index 000000000..8d2c6ac08 Binary files /dev/null and b/Models/RobeOfChastity/ChestPlate.png differ diff --git a/Models/RobeOfChastity/FabricClosed.png b/Models/RobeOfChastity/FabricClosed.png new file mode 100644 index 000000000..6549882de Binary files /dev/null and b/Models/RobeOfChastity/FabricClosed.png differ diff --git a/Models/RobeOfChastity/FabricKneel.png b/Models/RobeOfChastity/FabricKneel.png new file mode 100644 index 000000000..7475a80b3 Binary files /dev/null and b/Models/RobeOfChastity/FabricKneel.png differ diff --git a/Models/RobeOfChastity/FabricSpread.png b/Models/RobeOfChastity/FabricSpread.png new file mode 100644 index 000000000..6549882de Binary files /dev/null and b/Models/RobeOfChastity/FabricSpread.png differ diff --git a/Models/RobeOfChastity/FrillClosed.png b/Models/RobeOfChastity/FrillClosed.png new file mode 100644 index 000000000..4cba39cc6 Binary files /dev/null and b/Models/RobeOfChastity/FrillClosed.png differ diff --git a/Models/RobeOfChastity/FrillKneel.png b/Models/RobeOfChastity/FrillKneel.png new file mode 100644 index 000000000..d87a067f5 Binary files /dev/null and b/Models/RobeOfChastity/FrillKneel.png differ diff --git a/Models/RobeOfChastity/FrillSpread.png b/Models/RobeOfChastity/FrillSpread.png new file mode 100644 index 000000000..4cba39cc6 Binary files /dev/null and b/Models/RobeOfChastity/FrillSpread.png differ diff --git a/Models/RobeOfChastity/GoldBaseClosed.png b/Models/RobeOfChastity/GoldBaseClosed.png new file mode 100644 index 000000000..ec4426c76 Binary files /dev/null and b/Models/RobeOfChastity/GoldBaseClosed.png differ diff --git a/Models/RobeOfChastity/GoldBaseKneel.png b/Models/RobeOfChastity/GoldBaseKneel.png new file mode 100644 index 000000000..7f2ff3c1f Binary files /dev/null and b/Models/RobeOfChastity/GoldBaseKneel.png differ diff --git a/Models/RobeOfChastity/GoldBaseSpread.png b/Models/RobeOfChastity/GoldBaseSpread.png new file mode 100644 index 000000000..157107c6c Binary files /dev/null and b/Models/RobeOfChastity/GoldBaseSpread.png differ diff --git a/Models/RobeOfChastity/GoldClosed.png b/Models/RobeOfChastity/GoldClosed.png new file mode 100644 index 000000000..42e6e9dc3 Binary files /dev/null and b/Models/RobeOfChastity/GoldClosed.png differ diff --git a/Models/RobeOfChastity/GoldKneel.png b/Models/RobeOfChastity/GoldKneel.png new file mode 100644 index 000000000..2dad092e1 Binary files /dev/null and b/Models/RobeOfChastity/GoldKneel.png differ diff --git a/Models/RobeOfChastity/GoldSpread.png b/Models/RobeOfChastity/GoldSpread.png new file mode 100644 index 000000000..bc2f061ce Binary files /dev/null and b/Models/RobeOfChastity/GoldSpread.png differ diff --git a/Models/RobeOfChastity/PauldronsFree.png b/Models/RobeOfChastity/PauldronsFree.png new file mode 100644 index 000000000..b779e7258 Binary files /dev/null and b/Models/RobeOfChastity/PauldronsFree.png differ diff --git a/Models/RobeOfChastity/PauldronsTied.png b/Models/RobeOfChastity/PauldronsTied.png new file mode 100644 index 000000000..68b7baf24 Binary files /dev/null and b/Models/RobeOfChastity/PauldronsTied.png differ diff --git a/Models/RobeOfChastity/PauldronsYoked.png b/Models/RobeOfChastity/PauldronsYoked.png new file mode 100644 index 000000000..b2c71878b Binary files /dev/null and b/Models/RobeOfChastity/PauldronsYoked.png differ diff --git a/Models/RobeOfChastity/PlateClosed.png b/Models/RobeOfChastity/PlateClosed.png new file mode 100644 index 000000000..be2955598 Binary files /dev/null and b/Models/RobeOfChastity/PlateClosed.png differ diff --git a/Models/RobeOfChastity/PlateKneel.png b/Models/RobeOfChastity/PlateKneel.png new file mode 100644 index 000000000..0b29c06c0 Binary files /dev/null and b/Models/RobeOfChastity/PlateKneel.png differ diff --git a/Models/RobeOfChastity/PlateSpread.png b/Models/RobeOfChastity/PlateSpread.png new file mode 100644 index 000000000..e844916e2 Binary files /dev/null and b/Models/RobeOfChastity/PlateSpread.png differ diff --git a/Models/Robes/Bra.png b/Models/Robes/Bra.png new file mode 100644 index 000000000..00a862fb2 Binary files /dev/null and b/Models/Robes/Bra.png differ diff --git a/Models/Robes/Chest.png b/Models/Robes/Chest.png new file mode 100644 index 000000000..3b063f0a0 Binary files /dev/null and b/Models/Robes/Chest.png differ diff --git a/Models/Robes/PantsClosed.png b/Models/Robes/PantsClosed.png new file mode 100644 index 000000000..5188c79c1 Binary files /dev/null and b/Models/Robes/PantsClosed.png differ diff --git a/Models/Robes/PantsKneel.png b/Models/Robes/PantsKneel.png new file mode 100644 index 000000000..8b68cf3f4 Binary files /dev/null and b/Models/Robes/PantsKneel.png differ diff --git a/Models/Robes/PantsSpread.png b/Models/Robes/PantsSpread.png new file mode 100644 index 000000000..2d37670f2 Binary files /dev/null and b/Models/Robes/PantsSpread.png differ diff --git a/Models/Robes/RibbonBack.png b/Models/Robes/RibbonBack.png new file mode 100644 index 000000000..7965e937b Binary files /dev/null and b/Models/Robes/RibbonBack.png differ diff --git a/Models/Robes/RibbonBackHogtie.png b/Models/Robes/RibbonBackHogtie.png new file mode 100644 index 000000000..826458f2f Binary files /dev/null and b/Models/Robes/RibbonBackHogtie.png differ diff --git a/Models/Robes/RibbonBackKneel.png b/Models/Robes/RibbonBackKneel.png new file mode 100644 index 000000000..f65cef37d Binary files /dev/null and b/Models/Robes/RibbonBackKneel.png differ diff --git a/Models/Robes/RibbonBelt.png b/Models/Robes/RibbonBelt.png new file mode 100644 index 000000000..8d92b095e Binary files /dev/null and b/Models/Robes/RibbonBelt.png differ diff --git a/Models/Robes/ShoeLeftClosed.png b/Models/Robes/ShoeLeftClosed.png new file mode 100644 index 000000000..971ddfd01 Binary files /dev/null and b/Models/Robes/ShoeLeftClosed.png differ diff --git a/Models/Robes/ShoeLeftHogtie.png b/Models/Robes/ShoeLeftHogtie.png new file mode 100644 index 000000000..5c5179eae Binary files /dev/null and b/Models/Robes/ShoeLeftHogtie.png differ diff --git a/Models/Robes/ShoeLeftKneel.png b/Models/Robes/ShoeLeftKneel.png new file mode 100644 index 000000000..7ef2d63a8 Binary files /dev/null and b/Models/Robes/ShoeLeftKneel.png differ diff --git a/Models/Robes/ShoeLeftKneelClosed.png b/Models/Robes/ShoeLeftKneelClosed.png new file mode 100644 index 000000000..7ef2d63a8 Binary files /dev/null and b/Models/Robes/ShoeLeftKneelClosed.png differ diff --git a/Models/Robes/ShoeLeftSpread.png b/Models/Robes/ShoeLeftSpread.png new file mode 100644 index 000000000..78072d793 Binary files /dev/null and b/Models/Robes/ShoeLeftSpread.png differ diff --git a/Models/Robes/ShoeRightClosed.png b/Models/Robes/ShoeRightClosed.png new file mode 100644 index 000000000..65590f350 Binary files /dev/null and b/Models/Robes/ShoeRightClosed.png differ diff --git a/Models/Robes/ShoeRightKneel.png b/Models/Robes/ShoeRightKneel.png new file mode 100644 index 000000000..d0b8e867a Binary files /dev/null and b/Models/Robes/ShoeRightKneel.png differ diff --git a/Models/Robes/ShoeRightSpread.png b/Models/Robes/ShoeRightSpread.png new file mode 100644 index 000000000..ad6497bc2 Binary files /dev/null and b/Models/Robes/ShoeRightSpread.png differ diff --git a/Models/Robes/Skirt.png b/Models/Robes/Skirt.png new file mode 100644 index 000000000..7e6cc373a Binary files /dev/null and b/Models/Robes/Skirt.png differ diff --git a/Models/Robes/SkirtClosed.png b/Models/Robes/SkirtClosed.png new file mode 100644 index 000000000..7e6cc373a Binary files /dev/null and b/Models/Robes/SkirtClosed.png differ diff --git a/Models/Robes/SkirtClosedCrotchStrap.png b/Models/Robes/SkirtClosedCrotchStrap.png new file mode 100644 index 000000000..edff8de9a Binary files /dev/null and b/Models/Robes/SkirtClosedCrotchStrap.png differ diff --git a/Models/Robes/SkirtCrotchStrap.png b/Models/Robes/SkirtCrotchStrap.png new file mode 100644 index 000000000..028d99708 Binary files /dev/null and b/Models/Robes/SkirtCrotchStrap.png differ diff --git a/Models/Robes/SkirtKneel.png b/Models/Robes/SkirtKneel.png new file mode 100644 index 000000000..8bd73b70a Binary files /dev/null and b/Models/Robes/SkirtKneel.png differ diff --git a/Models/Robes/SkirtKneelCrotchStrap.png b/Models/Robes/SkirtKneelCrotchStrap.png new file mode 100644 index 000000000..e32ddab27 Binary files /dev/null and b/Models/Robes/SkirtKneelCrotchStrap.png differ diff --git a/Models/Robes/SkirtKneel_LeftLegCrotchStrap.png b/Models/Robes/SkirtKneel_LeftLegCrotchStrap.png new file mode 100644 index 000000000..c16db5cca Binary files /dev/null and b/Models/Robes/SkirtKneel_LeftLegCrotchStrap.png differ diff --git a/Models/Robes/SkirtOverKneel.png b/Models/Robes/SkirtOverKneel.png new file mode 100644 index 000000000..c1c108976 Binary files /dev/null and b/Models/Robes/SkirtOverKneel.png differ diff --git a/Models/Robes/SkirtOverKneelCrotchStrap.png b/Models/Robes/SkirtOverKneelCrotchStrap.png new file mode 100644 index 000000000..3f69e471e Binary files /dev/null and b/Models/Robes/SkirtOverKneelCrotchStrap.png differ diff --git a/Models/Robes/SleeveDecoLeftFree.png b/Models/Robes/SleeveDecoLeftFree.png new file mode 100644 index 000000000..29ea99d74 Binary files /dev/null and b/Models/Robes/SleeveDecoLeftFree.png differ diff --git a/Models/Robes/SleeveDecoLeftFront.png b/Models/Robes/SleeveDecoLeftFront.png new file mode 100644 index 000000000..a3b493ca0 Binary files /dev/null and b/Models/Robes/SleeveDecoLeftFront.png differ diff --git a/Models/Robes/SleeveDecoLeftYoked.png b/Models/Robes/SleeveDecoLeftYoked.png new file mode 100644 index 000000000..1f0920e8e Binary files /dev/null and b/Models/Robes/SleeveDecoLeftYoked.png differ diff --git a/Models/Robes/SleeveDecoRightFree.png b/Models/Robes/SleeveDecoRightFree.png new file mode 100644 index 000000000..3179fca3f Binary files /dev/null and b/Models/Robes/SleeveDecoRightFree.png differ diff --git a/Models/Robes/SleeveDecoRightFront.png b/Models/Robes/SleeveDecoRightFront.png new file mode 100644 index 000000000..e99fed590 Binary files /dev/null and b/Models/Robes/SleeveDecoRightFront.png differ diff --git a/Models/Robes/SleeveDecoRightYoked.png b/Models/Robes/SleeveDecoRightYoked.png new file mode 100644 index 000000000..4faebecc4 Binary files /dev/null and b/Models/Robes/SleeveDecoRightYoked.png differ diff --git a/Models/Robes/SleeveLeftBoxtie.png b/Models/Robes/SleeveLeftBoxtie.png new file mode 100644 index 000000000..3b35ec03b Binary files /dev/null and b/Models/Robes/SleeveLeftBoxtie.png differ diff --git a/Models/Robes/SleeveLeftBoxtieRopesUpper.png b/Models/Robes/SleeveLeftBoxtieRopesUpper.png new file mode 100644 index 000000000..737fd7fff Binary files /dev/null and b/Models/Robes/SleeveLeftBoxtieRopesUpper.png differ diff --git a/Models/Robes/SleeveLeftBoxtieTight.png b/Models/Robes/SleeveLeftBoxtieTight.png new file mode 100644 index 000000000..3b35ec03b Binary files /dev/null and b/Models/Robes/SleeveLeftBoxtieTight.png differ diff --git a/Models/Robes/SleeveLeftFree.png b/Models/Robes/SleeveLeftFree.png new file mode 100644 index 000000000..e5a8cf53e Binary files /dev/null and b/Models/Robes/SleeveLeftFree.png differ diff --git a/Models/Robes/SleeveLeftFreeTight.png b/Models/Robes/SleeveLeftFreeTight.png new file mode 100644 index 000000000..e5a8cf53e Binary files /dev/null and b/Models/Robes/SleeveLeftFreeTight.png differ diff --git a/Models/Robes/SleeveLeftFront.png b/Models/Robes/SleeveLeftFront.png new file mode 100644 index 000000000..456a80520 Binary files /dev/null and b/Models/Robes/SleeveLeftFront.png differ diff --git a/Models/Robes/SleeveLeftFrontTight.png b/Models/Robes/SleeveLeftFrontTight.png new file mode 100644 index 000000000..32ea805df Binary files /dev/null and b/Models/Robes/SleeveLeftFrontTight.png differ diff --git a/Models/Robes/SleeveLeftUp.png b/Models/Robes/SleeveLeftUp.png new file mode 100644 index 000000000..8094c2c6a Binary files /dev/null and b/Models/Robes/SleeveLeftUp.png differ diff --git a/Models/Robes/SleeveLeftWristtie.png b/Models/Robes/SleeveLeftWristtie.png new file mode 100644 index 000000000..00f7051a4 Binary files /dev/null and b/Models/Robes/SleeveLeftWristtie.png differ diff --git a/Models/Robes/SleeveLeftWristtieRopesUpper.png b/Models/Robes/SleeveLeftWristtieRopesUpper.png new file mode 100644 index 000000000..096bd5e82 Binary files /dev/null and b/Models/Robes/SleeveLeftWristtieRopesUpper.png differ diff --git a/Models/Robes/SleeveLeftWristtieTight.png b/Models/Robes/SleeveLeftWristtieTight.png new file mode 100644 index 000000000..00f7051a4 Binary files /dev/null and b/Models/Robes/SleeveLeftWristtieTight.png differ diff --git a/Models/Robes/SleeveLeftYoked.png b/Models/Robes/SleeveLeftYoked.png new file mode 100644 index 000000000..21a77221b Binary files /dev/null and b/Models/Robes/SleeveLeftYoked.png differ diff --git a/Models/Robes/SleeveLeftYokedTight.png b/Models/Robes/SleeveLeftYokedTight.png new file mode 100644 index 000000000..21a77221b Binary files /dev/null and b/Models/Robes/SleeveLeftYokedTight.png differ diff --git a/Models/Robes/SleeveRightBoxtie.png b/Models/Robes/SleeveRightBoxtie.png new file mode 100644 index 000000000..80c3099e3 Binary files /dev/null and b/Models/Robes/SleeveRightBoxtie.png differ diff --git a/Models/Robes/SleeveRightBoxtieRopesUpper.png b/Models/Robes/SleeveRightBoxtieRopesUpper.png new file mode 100644 index 000000000..ab96565ff Binary files /dev/null and b/Models/Robes/SleeveRightBoxtieRopesUpper.png differ diff --git a/Models/Robes/SleeveRightBoxtieTight.png b/Models/Robes/SleeveRightBoxtieTight.png new file mode 100644 index 000000000..80c3099e3 Binary files /dev/null and b/Models/Robes/SleeveRightBoxtieTight.png differ diff --git a/Models/Robes/SleeveRightFree.png b/Models/Robes/SleeveRightFree.png new file mode 100644 index 000000000..383c46e1d Binary files /dev/null and b/Models/Robes/SleeveRightFree.png differ diff --git a/Models/Robes/SleeveRightFreeTight.png b/Models/Robes/SleeveRightFreeTight.png new file mode 100644 index 000000000..383c46e1d Binary files /dev/null and b/Models/Robes/SleeveRightFreeTight.png differ diff --git a/Models/Robes/SleeveRightFront.png b/Models/Robes/SleeveRightFront.png new file mode 100644 index 000000000..bec1721e1 Binary files /dev/null and b/Models/Robes/SleeveRightFront.png differ diff --git a/Models/Robes/SleeveRightFrontTight.png b/Models/Robes/SleeveRightFrontTight.png new file mode 100644 index 000000000..bec1721e1 Binary files /dev/null and b/Models/Robes/SleeveRightFrontTight.png differ diff --git a/Models/Robes/SleeveRightUp.png b/Models/Robes/SleeveRightUp.png new file mode 100644 index 000000000..eae97b6ac Binary files /dev/null and b/Models/Robes/SleeveRightUp.png differ diff --git a/Models/Robes/SleeveRightWristtie.png b/Models/Robes/SleeveRightWristtie.png new file mode 100644 index 000000000..6177cedcd Binary files /dev/null and b/Models/Robes/SleeveRightWristtie.png differ diff --git a/Models/Robes/SleeveRightWristtieRopesUpper.png b/Models/Robes/SleeveRightWristtieRopesUpper.png new file mode 100644 index 000000000..c4f7260b3 Binary files /dev/null and b/Models/Robes/SleeveRightWristtieRopesUpper.png differ diff --git a/Models/Robes/SleeveRightWristtieTight.png b/Models/Robes/SleeveRightWristtieTight.png new file mode 100644 index 000000000..6177cedcd Binary files /dev/null and b/Models/Robes/SleeveRightWristtieTight.png differ diff --git a/Models/Robes/SleeveRightYoked.png b/Models/Robes/SleeveRightYoked.png new file mode 100644 index 000000000..f5dd8bf7d Binary files /dev/null and b/Models/Robes/SleeveRightYoked.png differ diff --git a/Models/Robes/SleeveRightYokedTight.png b/Models/Robes/SleeveRightYokedTight.png new file mode 100644 index 000000000..f5dd8bf7d Binary files /dev/null and b/Models/Robes/SleeveRightYokedTight.png differ diff --git a/Models/Robes/ZombieChestTalisman.png b/Models/Robes/ZombieChestTalisman.png new file mode 100644 index 000000000..0a1f8d8aa Binary files /dev/null and b/Models/Robes/ZombieChestTalisman.png differ diff --git a/Models/Robes/ZombieChestTalismanKneel.png b/Models/Robes/ZombieChestTalismanKneel.png new file mode 100644 index 000000000..73e2f3444 Binary files /dev/null and b/Models/Robes/ZombieChestTalismanKneel.png differ diff --git a/Models/Robes/ZombieHat.png b/Models/Robes/ZombieHat.png new file mode 100644 index 000000000..e346019ca Binary files /dev/null and b/Models/Robes/ZombieHat.png differ diff --git a/Models/Robes/ZombieHatBand.png b/Models/Robes/ZombieHatBand.png new file mode 100644 index 000000000..255a7e10d Binary files /dev/null and b/Models/Robes/ZombieHatBand.png differ diff --git a/Models/Robes/ZombieTalisman.png b/Models/Robes/ZombieTalisman.png new file mode 100644 index 000000000..c7507c7d1 Binary files /dev/null and b/Models/Robes/ZombieTalisman.png differ diff --git a/Models/Robes/ZombieTalismanBent.png b/Models/Robes/ZombieTalismanBent.png new file mode 100644 index 000000000..57c37360d Binary files /dev/null and b/Models/Robes/ZombieTalismanBent.png differ diff --git a/Models/Rope/AnklesClosed.png b/Models/Rope/AnklesClosed.png new file mode 100644 index 000000000..399220154 Binary files /dev/null and b/Models/Rope/AnklesClosed.png differ diff --git a/Models/Rope/AnklesClosedOver.png b/Models/Rope/AnklesClosedOver.png new file mode 100644 index 000000000..06c8df2dd Binary files /dev/null and b/Models/Rope/AnklesClosedOver.png differ diff --git a/Models/Rope/AnklesKneel.png b/Models/Rope/AnklesKneel.png new file mode 100644 index 000000000..e786f8ffa Binary files /dev/null and b/Models/Rope/AnklesKneel.png differ diff --git a/Models/Rope/AnklesKneelOver.png b/Models/Rope/AnklesKneelOver.png new file mode 100644 index 000000000..e786f8ffa Binary files /dev/null and b/Models/Rope/AnklesKneelOver.png differ diff --git a/Models/Rope/Arm1Boxtie.png b/Models/Rope/Arm1Boxtie.png new file mode 100644 index 000000000..f45f467cb Binary files /dev/null and b/Models/Rope/Arm1Boxtie.png differ diff --git a/Models/Rope/Arm1OverBoxtie.png b/Models/Rope/Arm1OverBoxtie.png new file mode 100644 index 000000000..b94c79c7c Binary files /dev/null and b/Models/Rope/Arm1OverBoxtie.png differ diff --git a/Models/Rope/Arm1OverWristtie.png b/Models/Rope/Arm1OverWristtie.png new file mode 100644 index 000000000..bc6314deb Binary files /dev/null and b/Models/Rope/Arm1OverWristtie.png differ diff --git a/Models/Rope/Arm1Up.png b/Models/Rope/Arm1Up.png new file mode 100644 index 000000000..b1bec04f2 Binary files /dev/null and b/Models/Rope/Arm1Up.png differ diff --git a/Models/Rope/Arm1Wristtie.png b/Models/Rope/Arm1Wristtie.png new file mode 100644 index 000000000..1b4396e37 Binary files /dev/null and b/Models/Rope/Arm1Wristtie.png differ diff --git a/Models/Rope/Arm2Boxtie.png b/Models/Rope/Arm2Boxtie.png new file mode 100644 index 000000000..9e6eb386a Binary files /dev/null and b/Models/Rope/Arm2Boxtie.png differ diff --git a/Models/Rope/Arm2Up.png b/Models/Rope/Arm2Up.png new file mode 100644 index 000000000..c382ef963 Binary files /dev/null and b/Models/Rope/Arm2Up.png differ diff --git a/Models/Rope/Arm2Wristtie.png b/Models/Rope/Arm2Wristtie.png new file mode 100644 index 000000000..9f7ef99fe Binary files /dev/null and b/Models/Rope/Arm2Wristtie.png differ diff --git a/Models/Rope/ArmHarness.png b/Models/Rope/ArmHarness.png new file mode 100644 index 000000000..f1518c048 Binary files /dev/null and b/Models/Rope/ArmHarness.png differ diff --git a/Models/Rope/ArmHarnessUnder.png b/Models/Rope/ArmHarnessUnder.png new file mode 100644 index 000000000..84543ba28 Binary files /dev/null and b/Models/Rope/ArmHarnessUnder.png differ diff --git a/Models/Rope/ArmStrapCrossed.png b/Models/Rope/ArmStrapCrossed.png new file mode 100644 index 000000000..d996f1feb Binary files /dev/null and b/Models/Rope/ArmStrapCrossed.png differ diff --git a/Models/Rope/ArmStrapHarnessCrossed.png b/Models/Rope/ArmStrapHarnessCrossed.png new file mode 100644 index 000000000..c7a3c3753 Binary files /dev/null and b/Models/Rope/ArmStrapHarnessCrossed.png differ diff --git a/Models/Rope/Belt.png b/Models/Rope/Belt.png new file mode 100644 index 000000000..e219cd4da Binary files /dev/null and b/Models/Rope/Belt.png differ diff --git a/Models/Rope/Calf1Closed.png b/Models/Rope/Calf1Closed.png new file mode 100644 index 000000000..2a1c6ed27 Binary files /dev/null and b/Models/Rope/Calf1Closed.png differ diff --git a/Models/Rope/Calf1ClosedOver.png b/Models/Rope/Calf1ClosedOver.png new file mode 100644 index 000000000..5f83ecfb4 Binary files /dev/null and b/Models/Rope/Calf1ClosedOver.png differ diff --git a/Models/Rope/Calf1KneelClosed.png b/Models/Rope/Calf1KneelClosed.png new file mode 100644 index 000000000..b486615c8 Binary files /dev/null and b/Models/Rope/Calf1KneelClosed.png differ diff --git a/Models/Rope/Calf1KneelClosedOver.png b/Models/Rope/Calf1KneelClosedOver.png new file mode 100644 index 000000000..b486615c8 Binary files /dev/null and b/Models/Rope/Calf1KneelClosedOver.png differ diff --git a/Models/Rope/Calf2Closed.png b/Models/Rope/Calf2Closed.png new file mode 100644 index 000000000..38271a414 Binary files /dev/null and b/Models/Rope/Calf2Closed.png differ diff --git a/Models/Rope/Calf2ClosedOver.png b/Models/Rope/Calf2ClosedOver.png new file mode 100644 index 000000000..825b7add8 Binary files /dev/null and b/Models/Rope/Calf2ClosedOver.png differ diff --git a/Models/Rope/Calf2Hogtie.png b/Models/Rope/Calf2Hogtie.png new file mode 100644 index 000000000..2dedb5587 Binary files /dev/null and b/Models/Rope/Calf2Hogtie.png differ diff --git a/Models/Rope/Calf2HogtieOver.png b/Models/Rope/Calf2HogtieOver.png new file mode 100644 index 000000000..2dedb5587 Binary files /dev/null and b/Models/Rope/Calf2HogtieOver.png differ diff --git a/Models/Rope/Calf2KneelClosed.png b/Models/Rope/Calf2KneelClosed.png new file mode 100644 index 000000000..e6a61d765 Binary files /dev/null and b/Models/Rope/Calf2KneelClosed.png differ diff --git a/Models/Rope/Calf2KneelClosedOver.png b/Models/Rope/Calf2KneelClosedOver.png new file mode 100644 index 000000000..e6a61d765 Binary files /dev/null and b/Models/Rope/Calf2KneelClosedOver.png differ diff --git a/Models/Rope/Calf3Closed.png b/Models/Rope/Calf3Closed.png new file mode 100644 index 000000000..ea4a6ad1a Binary files /dev/null and b/Models/Rope/Calf3Closed.png differ diff --git a/Models/Rope/Calf3ClosedOver.png b/Models/Rope/Calf3ClosedOver.png new file mode 100644 index 000000000..c8395fdb2 Binary files /dev/null and b/Models/Rope/Calf3ClosedOver.png differ diff --git a/Models/Rope/Calf3Hogtie.png b/Models/Rope/Calf3Hogtie.png new file mode 100644 index 000000000..e36bbc7b8 Binary files /dev/null and b/Models/Rope/Calf3Hogtie.png differ diff --git a/Models/Rope/Calf3HogtieOver.png b/Models/Rope/Calf3HogtieOver.png new file mode 100644 index 000000000..e36bbc7b8 Binary files /dev/null and b/Models/Rope/Calf3HogtieOver.png differ diff --git a/Models/Rope/Calf3KneelClosed.png b/Models/Rope/Calf3KneelClosed.png new file mode 100644 index 000000000..d466182c1 Binary files /dev/null and b/Models/Rope/Calf3KneelClosed.png differ diff --git a/Models/Rope/Calf3KneelClosedOver.png b/Models/Rope/Calf3KneelClosedOver.png new file mode 100644 index 000000000..d466182c1 Binary files /dev/null and b/Models/Rope/Calf3KneelClosedOver.png differ diff --git a/Models/Rope/Crotchrope.png b/Models/Rope/Crotchrope.png new file mode 100644 index 000000000..8550320fa Binary files /dev/null and b/Models/Rope/Crotchrope.png differ diff --git a/Models/Rope/CrotchropeKneel.png b/Models/Rope/CrotchropeKneel.png new file mode 100644 index 000000000..65bfce788 Binary files /dev/null and b/Models/Rope/CrotchropeKneel.png differ diff --git a/Models/Rope/CrotchropeStrap.png b/Models/Rope/CrotchropeStrap.png new file mode 100644 index 000000000..b9d23a85e Binary files /dev/null and b/Models/Rope/CrotchropeStrap.png differ diff --git a/Models/Rope/CuffsCrossed.png b/Models/Rope/CuffsCrossed.png new file mode 100644 index 000000000..d996f1feb Binary files /dev/null and b/Models/Rope/CuffsCrossed.png differ diff --git a/Models/Rope/CuffsFront.png b/Models/Rope/CuffsFront.png new file mode 100644 index 000000000..70d15a43f Binary files /dev/null and b/Models/Rope/CuffsFront.png differ diff --git a/Models/Rope/ForeArm1Wristtie.png b/Models/Rope/ForeArm1Wristtie.png new file mode 100644 index 000000000..84a259810 Binary files /dev/null and b/Models/Rope/ForeArm1Wristtie.png differ diff --git a/Models/Rope/ForeArm2Wristtie.png b/Models/Rope/ForeArm2Wristtie.png new file mode 100644 index 000000000..3ab94263a Binary files /dev/null and b/Models/Rope/ForeArm2Wristtie.png differ diff --git a/Models/Rope/FrogThigh1Kneel.png b/Models/Rope/FrogThigh1Kneel.png new file mode 100644 index 000000000..c7ce04c57 Binary files /dev/null and b/Models/Rope/FrogThigh1Kneel.png differ diff --git a/Models/Rope/FrogThigh1KneelClosed.png b/Models/Rope/FrogThigh1KneelClosed.png new file mode 100644 index 000000000..5f97db4ec Binary files /dev/null and b/Models/Rope/FrogThigh1KneelClosed.png differ diff --git a/Models/Rope/FrogThigh2Kneel.png b/Models/Rope/FrogThigh2Kneel.png new file mode 100644 index 000000000..0ac3dd70a Binary files /dev/null and b/Models/Rope/FrogThigh2Kneel.png differ diff --git a/Models/Rope/FrogThigh2KneelClosed.png b/Models/Rope/FrogThigh2KneelClosed.png new file mode 100644 index 000000000..1632a582a Binary files /dev/null and b/Models/Rope/FrogThigh2KneelClosed.png differ diff --git a/Models/Rope/FrogThigh3Kneel.png b/Models/Rope/FrogThigh3Kneel.png new file mode 100644 index 000000000..8a69a08dd Binary files /dev/null and b/Models/Rope/FrogThigh3Kneel.png differ diff --git a/Models/Rope/FrogThigh3KneelClosed.png b/Models/Rope/FrogThigh3KneelClosed.png new file mode 100644 index 000000000..4fd22ac96 Binary files /dev/null and b/Models/Rope/FrogThigh3KneelClosed.png differ diff --git a/Models/Rope/Harness.png b/Models/Rope/Harness.png new file mode 100644 index 000000000..e3dd8075f Binary files /dev/null and b/Models/Rope/Harness.png differ diff --git a/Models/Rope/HarnessLower.png b/Models/Rope/HarnessLower.png new file mode 100644 index 000000000..24880510a Binary files /dev/null and b/Models/Rope/HarnessLower.png differ diff --git a/Models/Rope/HarnessLowerKneel.png b/Models/Rope/HarnessLowerKneel.png new file mode 100644 index 000000000..6f0cee672 Binary files /dev/null and b/Models/Rope/HarnessLowerKneel.png differ diff --git a/Models/Rope/HarnessLowerStrap.png b/Models/Rope/HarnessLowerStrap.png new file mode 100644 index 000000000..9ca6e31d6 Binary files /dev/null and b/Models/Rope/HarnessLowerStrap.png differ diff --git a/Models/Rope/LeftFrogtieHogtie.png b/Models/Rope/LeftFrogtieHogtie.png new file mode 100644 index 000000000..0bf7be237 Binary files /dev/null and b/Models/Rope/LeftFrogtieHogtie.png differ diff --git a/Models/Rope/LeftFrogtieKneel.png b/Models/Rope/LeftFrogtieKneel.png new file mode 100644 index 000000000..08b588e16 Binary files /dev/null and b/Models/Rope/LeftFrogtieKneel.png differ diff --git a/Models/Rope/LeftFrogtieKneelClosed.png b/Models/Rope/LeftFrogtieKneelClosed.png new file mode 100644 index 000000000..5886b50d2 Binary files /dev/null and b/Models/Rope/LeftFrogtieKneelClosed.png differ diff --git a/Models/Rope/RightFrogtieKneel.png b/Models/Rope/RightFrogtieKneel.png new file mode 100644 index 000000000..7422adb28 Binary files /dev/null and b/Models/Rope/RightFrogtieKneel.png differ diff --git a/Models/Rope/RightFrogtieKneelClosed.png b/Models/Rope/RightFrogtieKneelClosed.png new file mode 100644 index 000000000..7422adb28 Binary files /dev/null and b/Models/Rope/RightFrogtieKneelClosed.png differ diff --git a/Models/Rope/RightThigh1KneelClosed.png b/Models/Rope/RightThigh1KneelClosed.png new file mode 100644 index 000000000..9ad505f53 Binary files /dev/null and b/Models/Rope/RightThigh1KneelClosed.png differ diff --git a/Models/Rope/RightThigh1KneelClosedOver.png b/Models/Rope/RightThigh1KneelClosedOver.png new file mode 100644 index 000000000..57a63d52a Binary files /dev/null and b/Models/Rope/RightThigh1KneelClosedOver.png differ diff --git a/Models/Rope/RightThigh2KneelClosed.png b/Models/Rope/RightThigh2KneelClosed.png new file mode 100644 index 000000000..e247d4d53 Binary files /dev/null and b/Models/Rope/RightThigh2KneelClosed.png differ diff --git a/Models/Rope/RightThigh2KneelClosedOver.png b/Models/Rope/RightThigh2KneelClosedOver.png new file mode 100644 index 000000000..785e78610 Binary files /dev/null and b/Models/Rope/RightThigh2KneelClosedOver.png differ diff --git a/Models/Rope/RightThigh3KneelClosed.png b/Models/Rope/RightThigh3KneelClosed.png new file mode 100644 index 000000000..5be3b71b4 Binary files /dev/null and b/Models/Rope/RightThigh3KneelClosed.png differ diff --git a/Models/Rope/RightThigh3KneelClosedOver.png b/Models/Rope/RightThigh3KneelClosedOver.png new file mode 100644 index 000000000..651d8841a Binary files /dev/null and b/Models/Rope/RightThigh3KneelClosedOver.png differ diff --git a/Models/Rope/Suspension.pdn b/Models/Rope/Suspension.pdn new file mode 100644 index 000000000..b39cf78bd Binary files /dev/null and b/Models/Rope/Suspension.pdn differ diff --git a/Models/Rope/Suspension.png b/Models/Rope/Suspension.png new file mode 100644 index 000000000..91796ac5e Binary files /dev/null and b/Models/Rope/Suspension.png differ diff --git a/Models/Rope/Thigh1Closed.png b/Models/Rope/Thigh1Closed.png new file mode 100644 index 000000000..c1650eb21 Binary files /dev/null and b/Models/Rope/Thigh1Closed.png differ diff --git a/Models/Rope/Thigh1ClosedOver.png b/Models/Rope/Thigh1ClosedOver.png new file mode 100644 index 000000000..7c5e237aa Binary files /dev/null and b/Models/Rope/Thigh1ClosedOver.png differ diff --git a/Models/Rope/Thigh1KneelClosed.png b/Models/Rope/Thigh1KneelClosed.png new file mode 100644 index 000000000..fcad28069 Binary files /dev/null and b/Models/Rope/Thigh1KneelClosed.png differ diff --git a/Models/Rope/Thigh1KneelClosedOver.png b/Models/Rope/Thigh1KneelClosedOver.png new file mode 100644 index 000000000..c08be7cab Binary files /dev/null and b/Models/Rope/Thigh1KneelClosedOver.png differ diff --git a/Models/Rope/Thigh2Closed.png b/Models/Rope/Thigh2Closed.png new file mode 100644 index 000000000..34aa4708f Binary files /dev/null and b/Models/Rope/Thigh2Closed.png differ diff --git a/Models/Rope/Thigh2ClosedOver.png b/Models/Rope/Thigh2ClosedOver.png new file mode 100644 index 000000000..b35d745c0 Binary files /dev/null and b/Models/Rope/Thigh2ClosedOver.png differ diff --git a/Models/Rope/Thigh2KneelClosed.png b/Models/Rope/Thigh2KneelClosed.png new file mode 100644 index 000000000..9c1683428 Binary files /dev/null and b/Models/Rope/Thigh2KneelClosed.png differ diff --git a/Models/Rope/Thigh2KneelClosedOver.png b/Models/Rope/Thigh2KneelClosedOver.png new file mode 100644 index 000000000..5783b47c8 Binary files /dev/null and b/Models/Rope/Thigh2KneelClosedOver.png differ diff --git a/Models/Rope/Thigh3Closed.png b/Models/Rope/Thigh3Closed.png new file mode 100644 index 000000000..0bf7be237 Binary files /dev/null and b/Models/Rope/Thigh3Closed.png differ diff --git a/Models/Rope/Thigh3ClosedOver.png b/Models/Rope/Thigh3ClosedOver.png new file mode 100644 index 000000000..f94950f19 Binary files /dev/null and b/Models/Rope/Thigh3ClosedOver.png differ diff --git a/Models/Rope/Thigh3KneelClosed.png b/Models/Rope/Thigh3KneelClosed.png new file mode 100644 index 000000000..3d5d8d4ff Binary files /dev/null and b/Models/Rope/Thigh3KneelClosed.png differ diff --git a/Models/Rope/Thigh3KneelClosedOver.png b/Models/Rope/Thigh3KneelClosedOver.png new file mode 100644 index 000000000..39fc8d3be Binary files /dev/null and b/Models/Rope/Thigh3KneelClosedOver.png differ diff --git a/Models/Rope/ToeClosed.png b/Models/Rope/ToeClosed.png new file mode 100644 index 000000000..c896a2832 Binary files /dev/null and b/Models/Rope/ToeClosed.png differ diff --git a/Models/RopeOld/ArmsBoxtie.png b/Models/RopeOld/ArmsBoxtie.png new file mode 100644 index 000000000..74f29bdff Binary files /dev/null and b/Models/RopeOld/ArmsBoxtie.png differ diff --git a/Models/RopeOld/ArmsWristtie.png b/Models/RopeOld/ArmsWristtie.png new file mode 100644 index 000000000..62dc8d50f Binary files /dev/null and b/Models/RopeOld/ArmsWristtie.png differ diff --git a/Models/RopeOld/ChestLower.png b/Models/RopeOld/ChestLower.png new file mode 100644 index 000000000..a2283b242 Binary files /dev/null and b/Models/RopeOld/ChestLower.png differ diff --git a/Models/RopeOld/ChestUpper.png b/Models/RopeOld/ChestUpper.png new file mode 100644 index 000000000..5eb0692d1 Binary files /dev/null and b/Models/RopeOld/ChestUpper.png differ diff --git a/Models/RopeOld/ShoulderStraps.png b/Models/RopeOld/ShoulderStraps.png new file mode 100644 index 000000000..766f3443a Binary files /dev/null and b/Models/RopeOld/ShoulderStraps.png differ diff --git a/Models/RopeOld/Wristtie.pdn b/Models/RopeOld/Wristtie.pdn new file mode 100644 index 000000000..4f29d0051 Binary files /dev/null and b/Models/RopeOld/Wristtie.pdn differ diff --git a/Models/Rubber/AnkleLeftClosed.png b/Models/Rubber/AnkleLeftClosed.png new file mode 100644 index 000000000..8299fef16 Binary files /dev/null and b/Models/Rubber/AnkleLeftClosed.png differ diff --git a/Models/Rubber/AnkleLeftKneelClosed.png b/Models/Rubber/AnkleLeftKneelClosed.png new file mode 100644 index 000000000..fe8c271d2 Binary files /dev/null and b/Models/Rubber/AnkleLeftKneelClosed.png differ diff --git a/Models/Rubber/AnkleRightClosed.png b/Models/Rubber/AnkleRightClosed.png new file mode 100644 index 000000000..32fd27868 Binary files /dev/null and b/Models/Rubber/AnkleRightClosed.png differ diff --git a/Models/Rubber/ArmLeftBoxtie.png b/Models/Rubber/ArmLeftBoxtie.png new file mode 100644 index 000000000..13f0cb6fd Binary files /dev/null and b/Models/Rubber/ArmLeftBoxtie.png differ diff --git a/Models/Rubber/ArmLeftCrossed.png b/Models/Rubber/ArmLeftCrossed.png new file mode 100644 index 000000000..aab08e819 Binary files /dev/null and b/Models/Rubber/ArmLeftCrossed.png differ diff --git a/Models/Rubber/ArmLeftFront.png b/Models/Rubber/ArmLeftFront.png new file mode 100644 index 000000000..5a9246039 Binary files /dev/null and b/Models/Rubber/ArmLeftFront.png differ diff --git a/Models/Rubber/ArmLeftUp.png b/Models/Rubber/ArmLeftUp.png new file mode 100644 index 000000000..38ef99a6f Binary files /dev/null and b/Models/Rubber/ArmLeftUp.png differ diff --git a/Models/Rubber/ArmLeftWristtie.png b/Models/Rubber/ArmLeftWristtie.png new file mode 100644 index 000000000..76eb00468 Binary files /dev/null and b/Models/Rubber/ArmLeftWristtie.png differ diff --git a/Models/Rubber/ArmRightBoxtie.png b/Models/Rubber/ArmRightBoxtie.png new file mode 100644 index 000000000..8ce021d70 Binary files /dev/null and b/Models/Rubber/ArmRightBoxtie.png differ diff --git a/Models/Rubber/ArmRightCrossed.png b/Models/Rubber/ArmRightCrossed.png new file mode 100644 index 000000000..a36c38440 Binary files /dev/null and b/Models/Rubber/ArmRightCrossed.png differ diff --git a/Models/Rubber/ArmRightFront.png b/Models/Rubber/ArmRightFront.png new file mode 100644 index 000000000..79cf13552 Binary files /dev/null and b/Models/Rubber/ArmRightFront.png differ diff --git a/Models/Rubber/ArmRightUp.png b/Models/Rubber/ArmRightUp.png new file mode 100644 index 000000000..463b4865b Binary files /dev/null and b/Models/Rubber/ArmRightUp.png differ diff --git a/Models/Rubber/ArmRightWristtie.png b/Models/Rubber/ArmRightWristtie.png new file mode 100644 index 000000000..e7da9e3a1 Binary files /dev/null and b/Models/Rubber/ArmRightWristtie.png differ diff --git a/Models/Rubber/Chest.png b/Models/Rubber/Chest.png new file mode 100644 index 000000000..fdbf25001 Binary files /dev/null and b/Models/Rubber/Chest.png differ diff --git a/Models/Rubber/ChestBoxtie.png b/Models/Rubber/ChestBoxtie.png new file mode 100644 index 000000000..c3abc1e86 Binary files /dev/null and b/Models/Rubber/ChestBoxtie.png differ diff --git a/Models/Rubber/ChestCrossed.png b/Models/Rubber/ChestCrossed.png new file mode 100644 index 000000000..542828f9f Binary files /dev/null and b/Models/Rubber/ChestCrossed.png differ diff --git a/Models/Rubber/ChestWristtie.png b/Models/Rubber/ChestWristtie.png new file mode 100644 index 000000000..4319282f6 Binary files /dev/null and b/Models/Rubber/ChestWristtie.png differ diff --git a/Models/Rubber/FaceEyes.png b/Models/Rubber/FaceEyes.png new file mode 100644 index 000000000..c361439c0 Binary files /dev/null and b/Models/Rubber/FaceEyes.png differ diff --git a/Models/Rubber/FaceFull.png b/Models/Rubber/FaceFull.png new file mode 100644 index 000000000..3366876a1 Binary files /dev/null and b/Models/Rubber/FaceFull.png differ diff --git a/Models/Rubber/FaceMouth.png b/Models/Rubber/FaceMouth.png new file mode 100644 index 000000000..7f6bf403f Binary files /dev/null and b/Models/Rubber/FaceMouth.png differ diff --git a/Models/Rubber/FootLeftClosed.png b/Models/Rubber/FootLeftClosed.png new file mode 100644 index 000000000..aa31b5484 Binary files /dev/null and b/Models/Rubber/FootLeftClosed.png differ diff --git a/Models/Rubber/FootLeftHogtie.png b/Models/Rubber/FootLeftHogtie.png new file mode 100644 index 000000000..3f8f412cd Binary files /dev/null and b/Models/Rubber/FootLeftHogtie.png differ diff --git a/Models/Rubber/FootLeftKneelClosed.png b/Models/Rubber/FootLeftKneelClosed.png new file mode 100644 index 000000000..43a3ca976 Binary files /dev/null and b/Models/Rubber/FootLeftKneelClosed.png differ diff --git a/Models/Rubber/FootRightClosed.png b/Models/Rubber/FootRightClosed.png new file mode 100644 index 000000000..1d90c9842 Binary files /dev/null and b/Models/Rubber/FootRightClosed.png differ diff --git a/Models/Rubber/FootRightKneel.png b/Models/Rubber/FootRightKneel.png new file mode 100644 index 000000000..d20ac09aa Binary files /dev/null and b/Models/Rubber/FootRightKneel.png differ diff --git a/Models/Rubber/HandLeftFree.png b/Models/Rubber/HandLeftFree.png new file mode 100644 index 000000000..6e4e3af2f Binary files /dev/null and b/Models/Rubber/HandLeftFree.png differ diff --git a/Models/Rubber/HandLeftFront.png b/Models/Rubber/HandLeftFront.png new file mode 100644 index 000000000..8ee0597ab Binary files /dev/null and b/Models/Rubber/HandLeftFront.png differ diff --git a/Models/Rubber/HandLeftYoked.png b/Models/Rubber/HandLeftYoked.png new file mode 100644 index 000000000..cdef8b045 Binary files /dev/null and b/Models/Rubber/HandLeftYoked.png differ diff --git a/Models/Rubber/HandRightBoxtie.png b/Models/Rubber/HandRightBoxtie.png new file mode 100644 index 000000000..82f7dc101 Binary files /dev/null and b/Models/Rubber/HandRightBoxtie.png differ diff --git a/Models/Rubber/HandRightFree.png b/Models/Rubber/HandRightFree.png new file mode 100644 index 000000000..2a8b479f3 Binary files /dev/null and b/Models/Rubber/HandRightFree.png differ diff --git a/Models/Rubber/HandRightFront.png b/Models/Rubber/HandRightFront.png new file mode 100644 index 000000000..524a53497 Binary files /dev/null and b/Models/Rubber/HandRightFront.png differ diff --git a/Models/Rubber/HandRightYoked.png b/Models/Rubber/HandRightYoked.png new file mode 100644 index 000000000..3f87b9a80 Binary files /dev/null and b/Models/Rubber/HandRightYoked.png differ diff --git a/Models/Rubber/LegLeftClosed.png b/Models/Rubber/LegLeftClosed.png new file mode 100644 index 000000000..dabd8ad49 Binary files /dev/null and b/Models/Rubber/LegLeftClosed.png differ diff --git a/Models/Rubber/LegLeftHogtie.png b/Models/Rubber/LegLeftHogtie.png new file mode 100644 index 000000000..fc1f6c42b Binary files /dev/null and b/Models/Rubber/LegLeftHogtie.png differ diff --git a/Models/Rubber/LegLeftKneel.png b/Models/Rubber/LegLeftKneel.png new file mode 100644 index 000000000..d204cbbdc Binary files /dev/null and b/Models/Rubber/LegLeftKneel.png differ diff --git a/Models/Rubber/LegLeftKneelClosed.png b/Models/Rubber/LegLeftKneelClosed.png new file mode 100644 index 000000000..60756b74e Binary files /dev/null and b/Models/Rubber/LegLeftKneelClosed.png differ diff --git a/Models/Rubber/LegRightClosed.png b/Models/Rubber/LegRightClosed.png new file mode 100644 index 000000000..295474e83 Binary files /dev/null and b/Models/Rubber/LegRightClosed.png differ diff --git a/Models/Rubber/LegRightHogtie.png b/Models/Rubber/LegRightHogtie.png new file mode 100644 index 000000000..148543ff0 Binary files /dev/null and b/Models/Rubber/LegRightHogtie.png differ diff --git a/Models/Rubber/LegRightKneel.png b/Models/Rubber/LegRightKneel.png new file mode 100644 index 000000000..654e3a03c Binary files /dev/null and b/Models/Rubber/LegRightKneel.png differ diff --git a/Models/Rubber/LegRightKneelClosed.png b/Models/Rubber/LegRightKneelClosed.png new file mode 100644 index 000000000..7517d9d88 Binary files /dev/null and b/Models/Rubber/LegRightKneelClosed.png differ diff --git a/Models/Rubber/TorsoLower.png b/Models/Rubber/TorsoLower.png new file mode 100644 index 000000000..358b63a83 Binary files /dev/null and b/Models/Rubber/TorsoLower.png differ diff --git a/Models/Rubber/TorsoLowerKneel.png b/Models/Rubber/TorsoLowerKneel.png new file mode 100644 index 000000000..d5a633ee4 Binary files /dev/null and b/Models/Rubber/TorsoLowerKneel.png differ diff --git a/Models/Rubber/TorsoUpper.png b/Models/Rubber/TorsoUpper.png new file mode 100644 index 000000000..307e38c5b Binary files /dev/null and b/Models/Rubber/TorsoUpper.png differ diff --git a/Models/SMoonlight/BallMittens.png b/Models/SMoonlight/BallMittens.png new file mode 100644 index 000000000..82dc21db8 Binary files /dev/null and b/Models/SMoonlight/BallMittens.png differ diff --git a/Models/SMoonlight/BondageHarness.png b/Models/SMoonlight/BondageHarness.png new file mode 100644 index 000000000..2492ee69b Binary files /dev/null and b/Models/SMoonlight/BondageHarness.png differ diff --git a/Models/SMoonlight/PostureCollar.png b/Models/SMoonlight/PostureCollar.png new file mode 100644 index 000000000..c51a60c23 Binary files /dev/null and b/Models/SMoonlight/PostureCollar.png differ diff --git a/Models/SMoonlight/PostureCollarHardware.png b/Models/SMoonlight/PostureCollarHardware.png new file mode 100644 index 000000000..e30653c48 Binary files /dev/null and b/Models/SMoonlight/PostureCollarHardware.png differ diff --git a/Models/SMoonlight/PostureCollarLoop.png b/Models/SMoonlight/PostureCollarLoop.png new file mode 100644 index 000000000..12ab69187 Binary files /dev/null and b/Models/SMoonlight/PostureCollarLoop.png differ diff --git a/Models/SMoonlight/PostureCollarRim.png b/Models/SMoonlight/PostureCollarRim.png new file mode 100644 index 000000000..1f25e4607 Binary files /dev/null and b/Models/SMoonlight/PostureCollarRim.png differ diff --git a/Models/SMoonlight/RPArmbinder Back.png b/Models/SMoonlight/RPArmbinder Back.png new file mode 100644 index 000000000..c940b03d2 Binary files /dev/null and b/Models/SMoonlight/RPArmbinder Back.png differ diff --git a/Models/SMoonlight/ReverseBinderHardware.png b/Models/SMoonlight/ReverseBinderHardware.png new file mode 100644 index 000000000..312f71808 Binary files /dev/null and b/Models/SMoonlight/ReverseBinderHardware.png differ diff --git a/Models/SMoonlight/ReverseBinderLeft.png b/Models/SMoonlight/ReverseBinderLeft.png new file mode 100644 index 000000000..0f8188c7a Binary files /dev/null and b/Models/SMoonlight/ReverseBinderLeft.png differ diff --git a/Models/SMoonlight/ReverseBinderRight.png b/Models/SMoonlight/ReverseBinderRight.png new file mode 100644 index 000000000..75854722b Binary files /dev/null and b/Models/SMoonlight/ReverseBinderRight.png differ diff --git a/Models/SMoonlight/ReverseBinderStraps.png b/Models/SMoonlight/ReverseBinderStraps.png new file mode 100644 index 000000000..ef9fe99a0 Binary files /dev/null and b/Models/SMoonlight/ReverseBinderStraps.png differ diff --git a/Models/SMoonlight/RpArmbinder Secure.png b/Models/SMoonlight/RpArmbinder Secure.png new file mode 100644 index 000000000..d2acde146 Binary files /dev/null and b/Models/SMoonlight/RpArmbinder Secure.png differ diff --git a/Models/Sailor/Bust.png b/Models/Sailor/Bust.png new file mode 100644 index 000000000..391958248 Binary files /dev/null and b/Models/Sailor/Bust.png differ diff --git a/Models/Sailor/BustStripe.png b/Models/Sailor/BustStripe.png new file mode 100644 index 000000000..2054ba373 Binary files /dev/null and b/Models/Sailor/BustStripe.png differ diff --git a/Models/Sailor/Collar.png b/Models/Sailor/Collar.png new file mode 100644 index 000000000..206f218f2 Binary files /dev/null and b/Models/Sailor/Collar.png differ diff --git a/Models/Sailor/CollarStripe.png b/Models/Sailor/CollarStripe.png new file mode 100644 index 000000000..4024e1c05 Binary files /dev/null and b/Models/Sailor/CollarStripe.png differ diff --git a/Models/Sailor/CollarStripeTied.png b/Models/Sailor/CollarStripeTied.png new file mode 100644 index 000000000..604063c0d Binary files /dev/null and b/Models/Sailor/CollarStripeTied.png differ diff --git a/Models/Sailor/CollarStripeUp.png b/Models/Sailor/CollarStripeUp.png new file mode 100644 index 000000000..0ff0abe77 Binary files /dev/null and b/Models/Sailor/CollarStripeUp.png differ diff --git a/Models/Sailor/CollarStripeYoked.png b/Models/Sailor/CollarStripeYoked.png new file mode 100644 index 000000000..dd2fc0199 Binary files /dev/null and b/Models/Sailor/CollarStripeYoked.png differ diff --git a/Models/Sailor/CollarTied.png b/Models/Sailor/CollarTied.png new file mode 100644 index 000000000..b021d63f3 Binary files /dev/null and b/Models/Sailor/CollarTied.png differ diff --git a/Models/Sailor/CollarUp.png b/Models/Sailor/CollarUp.png new file mode 100644 index 000000000..5dfd82bd4 Binary files /dev/null and b/Models/Sailor/CollarUp.png differ diff --git a/Models/Sailor/CollarYoked.png b/Models/Sailor/CollarYoked.png new file mode 100644 index 000000000..01e554c17 Binary files /dev/null and b/Models/Sailor/CollarYoked.png differ diff --git a/Models/Sailor/HemLeft.png b/Models/Sailor/HemLeft.png new file mode 100644 index 000000000..e9cea5dc3 Binary files /dev/null and b/Models/Sailor/HemLeft.png differ diff --git a/Models/Sailor/HemLeftTied.png b/Models/Sailor/HemLeftTied.png new file mode 100644 index 000000000..5dd75e432 Binary files /dev/null and b/Models/Sailor/HemLeftTied.png differ diff --git a/Models/Sailor/HemLeftUp.png b/Models/Sailor/HemLeftUp.png new file mode 100644 index 000000000..3424b199d Binary files /dev/null and b/Models/Sailor/HemLeftUp.png differ diff --git a/Models/Sailor/HemLeftYoked.png b/Models/Sailor/HemLeftYoked.png new file mode 100644 index 000000000..2e8e1fedc Binary files /dev/null and b/Models/Sailor/HemLeftYoked.png differ diff --git a/Models/Sailor/HemRight.png b/Models/Sailor/HemRight.png new file mode 100644 index 000000000..adc4b29d0 Binary files /dev/null and b/Models/Sailor/HemRight.png differ diff --git a/Models/Sailor/HemRightTied.png b/Models/Sailor/HemRightTied.png new file mode 100644 index 000000000..636dfb449 Binary files /dev/null and b/Models/Sailor/HemRightTied.png differ diff --git a/Models/Sailor/HemRightUp.png b/Models/Sailor/HemRightUp.png new file mode 100644 index 000000000..9bbebecb4 Binary files /dev/null and b/Models/Sailor/HemRightUp.png differ diff --git a/Models/Sailor/HemRightYoked.png b/Models/Sailor/HemRightYoked.png new file mode 100644 index 000000000..d4df4cc7a Binary files /dev/null and b/Models/Sailor/HemRightYoked.png differ diff --git a/Models/Sailor/Ribbon.png b/Models/Sailor/Ribbon.png new file mode 100644 index 000000000..71077fbc9 Binary files /dev/null and b/Models/Sailor/Ribbon.png differ diff --git a/Models/Sailor/RibbonTied.png b/Models/Sailor/RibbonTied.png new file mode 100644 index 000000000..4443e1a64 Binary files /dev/null and b/Models/Sailor/RibbonTied.png differ diff --git a/Models/Sailor/RibbonUp.png b/Models/Sailor/RibbonUp.png new file mode 100644 index 000000000..6d39b0d00 Binary files /dev/null and b/Models/Sailor/RibbonUp.png differ diff --git a/Models/Sailor/RibbonYoked.png b/Models/Sailor/RibbonYoked.png new file mode 100644 index 000000000..71077fbc9 Binary files /dev/null and b/Models/Sailor/RibbonYoked.png differ diff --git a/Models/Sailor/Shirt.png b/Models/Sailor/Shirt.png new file mode 100644 index 000000000..471dfa24e Binary files /dev/null and b/Models/Sailor/Shirt.png differ diff --git a/Models/Sailor/ShirtChest.png b/Models/Sailor/ShirtChest.png new file mode 100644 index 000000000..f69d5e3e7 Binary files /dev/null and b/Models/Sailor/ShirtChest.png differ diff --git a/Models/Sailor/ShirtChestTied.png b/Models/Sailor/ShirtChestTied.png new file mode 100644 index 000000000..cb6878a7f Binary files /dev/null and b/Models/Sailor/ShirtChestTied.png differ diff --git a/Models/Sailor/ShirtChestUp.png b/Models/Sailor/ShirtChestUp.png new file mode 100644 index 000000000..c1e5876cb Binary files /dev/null and b/Models/Sailor/ShirtChestUp.png differ diff --git a/Models/Sailor/ShirtChestYoked.png b/Models/Sailor/ShirtChestYoked.png new file mode 100644 index 000000000..ac06138c6 Binary files /dev/null and b/Models/Sailor/ShirtChestYoked.png differ diff --git a/Models/Sailor/ShirtKneel.png b/Models/Sailor/ShirtKneel.png new file mode 100644 index 000000000..471dfa24e Binary files /dev/null and b/Models/Sailor/ShirtKneel.png differ diff --git a/Models/Sailor/SleeveLeft.png b/Models/Sailor/SleeveLeft.png new file mode 100644 index 000000000..464e3a7e6 Binary files /dev/null and b/Models/Sailor/SleeveLeft.png differ diff --git a/Models/Sailor/SleeveLeftTied.png b/Models/Sailor/SleeveLeftTied.png new file mode 100644 index 000000000..45bdf6383 Binary files /dev/null and b/Models/Sailor/SleeveLeftTied.png differ diff --git a/Models/Sailor/SleeveLeftUp.png b/Models/Sailor/SleeveLeftUp.png new file mode 100644 index 000000000..fabaff593 Binary files /dev/null and b/Models/Sailor/SleeveLeftUp.png differ diff --git a/Models/Sailor/SleeveLeftYoked.png b/Models/Sailor/SleeveLeftYoked.png new file mode 100644 index 000000000..7ced0f922 Binary files /dev/null and b/Models/Sailor/SleeveLeftYoked.png differ diff --git a/Models/Sailor/SleeveRight.png b/Models/Sailor/SleeveRight.png new file mode 100644 index 000000000..644102a1b Binary files /dev/null and b/Models/Sailor/SleeveRight.png differ diff --git a/Models/Sailor/SleeveRightTied.png b/Models/Sailor/SleeveRightTied.png new file mode 100644 index 000000000..242190dde Binary files /dev/null and b/Models/Sailor/SleeveRightTied.png differ diff --git a/Models/Sailor/SleeveRightUp.png b/Models/Sailor/SleeveRightUp.png new file mode 100644 index 000000000..47e67dbbf Binary files /dev/null and b/Models/Sailor/SleeveRightUp.png differ diff --git a/Models/Sailor/SleeveRightYoked.png b/Models/Sailor/SleeveRightYoked.png new file mode 100644 index 000000000..1b1ce97de Binary files /dev/null and b/Models/Sailor/SleeveRightYoked.png differ diff --git a/Models/Shades/Glasses.png b/Models/Shades/Glasses.png new file mode 100644 index 000000000..a0f3da4d0 Binary files /dev/null and b/Models/Shades/Glasses.png differ diff --git a/Models/Shades/GlassesLens.png b/Models/Shades/GlassesLens.png new file mode 100644 index 000000000..b2808c202 Binary files /dev/null and b/Models/Shades/GlassesLens.png differ diff --git a/Models/ShadowHands/Arms1.png b/Models/ShadowHands/Arms1.png new file mode 100644 index 000000000..96eeeff46 Binary files /dev/null and b/Models/ShadowHands/Arms1.png differ diff --git a/Models/ShadowHands/Arms2.png b/Models/ShadowHands/Arms2.png new file mode 100644 index 000000000..6a0d6b874 Binary files /dev/null and b/Models/ShadowHands/Arms2.png differ diff --git a/Models/ShadowHands/Crotch.png b/Models/ShadowHands/Crotch.png new file mode 100644 index 000000000..d87e99405 Binary files /dev/null and b/Models/ShadowHands/Crotch.png differ diff --git a/Models/ShadowHands/CrotchStrap.png b/Models/ShadowHands/CrotchStrap.png new file mode 100644 index 000000000..fc065faf0 Binary files /dev/null and b/Models/ShadowHands/CrotchStrap.png differ diff --git a/Models/ShadowHands/Eyes.png b/Models/ShadowHands/Eyes.png new file mode 100644 index 000000000..ae14bc803 Binary files /dev/null and b/Models/ShadowHands/Eyes.png differ diff --git a/Models/ShadowHands/Feet1Closed.png b/Models/ShadowHands/Feet1Closed.png new file mode 100644 index 000000000..5c68752ba Binary files /dev/null and b/Models/ShadowHands/Feet1Closed.png differ diff --git a/Models/ShadowHands/Feet1KneelClosed.png b/Models/ShadowHands/Feet1KneelClosed.png new file mode 100644 index 000000000..4796f5d07 Binary files /dev/null and b/Models/ShadowHands/Feet1KneelClosed.png differ diff --git a/Models/ShadowHands/LeftArm2Boxtie.png b/Models/ShadowHands/LeftArm2Boxtie.png new file mode 100644 index 000000000..b9286c6ac Binary files /dev/null and b/Models/ShadowHands/LeftArm2Boxtie.png differ diff --git a/Models/ShadowHands/LeftArm2Wristtie.png b/Models/ShadowHands/LeftArm2Wristtie.png new file mode 100644 index 000000000..a5e673b80 Binary files /dev/null and b/Models/ShadowHands/LeftArm2Wristtie.png differ diff --git a/Models/ShadowHands/Legs1Closed.png b/Models/ShadowHands/Legs1Closed.png new file mode 100644 index 000000000..c712e92bc Binary files /dev/null and b/Models/ShadowHands/Legs1Closed.png differ diff --git a/Models/ShadowHands/Legs1Kneel.png b/Models/ShadowHands/Legs1Kneel.png new file mode 100644 index 000000000..6531bf1f2 Binary files /dev/null and b/Models/ShadowHands/Legs1Kneel.png differ diff --git a/Models/ShadowHands/Legs1KneelClosed.png b/Models/ShadowHands/Legs1KneelClosed.png new file mode 100644 index 000000000..6531bf1f2 Binary files /dev/null and b/Models/ShadowHands/Legs1KneelClosed.png differ diff --git a/Models/ShadowHands/Legs2Closed.png b/Models/ShadowHands/Legs2Closed.png new file mode 100644 index 000000000..08b43261f Binary files /dev/null and b/Models/ShadowHands/Legs2Closed.png differ diff --git a/Models/ShadowHands/Legs2Kneel.png b/Models/ShadowHands/Legs2Kneel.png new file mode 100644 index 000000000..8b668dae6 Binary files /dev/null and b/Models/ShadowHands/Legs2Kneel.png differ diff --git a/Models/ShadowHands/Legs2KneelClosed.png b/Models/ShadowHands/Legs2KneelClosed.png new file mode 100644 index 000000000..8b668dae6 Binary files /dev/null and b/Models/ShadowHands/Legs2KneelClosed.png differ diff --git a/Models/ShadowHands/Mouth.png b/Models/ShadowHands/Mouth.png new file mode 100644 index 000000000..212acdd19 Binary files /dev/null and b/Models/ShadowHands/Mouth.png differ diff --git a/Models/ShadowHands/RightLegs1Kneel.png b/Models/ShadowHands/RightLegs1Kneel.png new file mode 100644 index 000000000..c30a9c687 Binary files /dev/null and b/Models/ShadowHands/RightLegs1Kneel.png differ diff --git a/Models/ShadowHands/RightLegs1KneelClosed.png b/Models/ShadowHands/RightLegs1KneelClosed.png new file mode 100644 index 000000000..df7680ef7 Binary files /dev/null and b/Models/ShadowHands/RightLegs1KneelClosed.png differ diff --git a/Models/ShadowHands/RightLegs2Kneel.png b/Models/ShadowHands/RightLegs2Kneel.png new file mode 100644 index 000000000..bbd4165a8 Binary files /dev/null and b/Models/ShadowHands/RightLegs2Kneel.png differ diff --git a/Models/ShadowHands/RightLegs2KneelClosed.png b/Models/ShadowHands/RightLegs2KneelClosed.png new file mode 100644 index 000000000..bbd4165a8 Binary files /dev/null and b/Models/ShadowHands/RightLegs2KneelClosed.png differ diff --git a/Models/Skirts/ApronSkirt.png b/Models/Skirts/ApronSkirt.png new file mode 100644 index 000000000..eff8496a0 Binary files /dev/null and b/Models/Skirts/ApronSkirt.png differ diff --git a/Models/Skirts/ApronSkirtClosed.png b/Models/Skirts/ApronSkirtClosed.png new file mode 100644 index 000000000..eff8496a0 Binary files /dev/null and b/Models/Skirts/ApronSkirtClosed.png differ diff --git a/Models/Skirts/ApronSkirtClosedCrotchStrap.png b/Models/Skirts/ApronSkirtClosedCrotchStrap.png new file mode 100644 index 000000000..eff8496a0 Binary files /dev/null and b/Models/Skirts/ApronSkirtClosedCrotchStrap.png differ diff --git a/Models/Skirts/ApronSkirtCrotchStrap.png b/Models/Skirts/ApronSkirtCrotchStrap.png new file mode 100644 index 000000000..eff8496a0 Binary files /dev/null and b/Models/Skirts/ApronSkirtCrotchStrap.png differ diff --git a/Models/Skirts/ApronSkirtHogtie.png b/Models/Skirts/ApronSkirtHogtie.png new file mode 100644 index 000000000..eff8496a0 Binary files /dev/null and b/Models/Skirts/ApronSkirtHogtie.png differ diff --git a/Models/Skirts/ApronSkirtHogtieCrotchStrap.png b/Models/Skirts/ApronSkirtHogtieCrotchStrap.png new file mode 100644 index 000000000..eff8496a0 Binary files /dev/null and b/Models/Skirts/ApronSkirtHogtieCrotchStrap.png differ diff --git a/Models/Skirts/ApronSkirtKneel.png b/Models/Skirts/ApronSkirtKneel.png new file mode 100644 index 000000000..664071451 Binary files /dev/null and b/Models/Skirts/ApronSkirtKneel.png differ diff --git a/Models/Skirts/ApronSkirtKneelCrotchStrap.png b/Models/Skirts/ApronSkirtKneelCrotchStrap.png new file mode 100644 index 000000000..664071451 Binary files /dev/null and b/Models/Skirts/ApronSkirtKneelCrotchStrap.png differ diff --git a/Models/Skirts/ApronSkirtOverKneel.png b/Models/Skirts/ApronSkirtOverKneel.png new file mode 100644 index 000000000..c185c2657 Binary files /dev/null and b/Models/Skirts/ApronSkirtOverKneel.png differ diff --git a/Models/Skirts/ApronSkirtOverKneelCrotchStrap.png b/Models/Skirts/ApronSkirtOverKneelCrotchStrap.png new file mode 100644 index 000000000..c185c2657 Binary files /dev/null and b/Models/Skirts/ApronSkirtOverKneelCrotchStrap.png differ diff --git a/Models/Skirts/MaidSkirt.png b/Models/Skirts/MaidSkirt.png new file mode 100644 index 000000000..f02141a1f Binary files /dev/null and b/Models/Skirts/MaidSkirt.png differ diff --git a/Models/Skirts/MaidSkirtClosed.png b/Models/Skirts/MaidSkirtClosed.png new file mode 100644 index 000000000..f02141a1f Binary files /dev/null and b/Models/Skirts/MaidSkirtClosed.png differ diff --git a/Models/Skirts/MaidSkirtClosedCrotchStrap.png b/Models/Skirts/MaidSkirtClosedCrotchStrap.png new file mode 100644 index 000000000..f02141a1f Binary files /dev/null and b/Models/Skirts/MaidSkirtClosedCrotchStrap.png differ diff --git a/Models/Skirts/MaidSkirtCrotchStrap.png b/Models/Skirts/MaidSkirtCrotchStrap.png new file mode 100644 index 000000000..f02141a1f Binary files /dev/null and b/Models/Skirts/MaidSkirtCrotchStrap.png differ diff --git a/Models/Skirts/MaidSkirtHogtie.png b/Models/Skirts/MaidSkirtHogtie.png new file mode 100644 index 000000000..f02141a1f Binary files /dev/null and b/Models/Skirts/MaidSkirtHogtie.png differ diff --git a/Models/Skirts/MaidSkirtHogtieCrotchStrap.png b/Models/Skirts/MaidSkirtHogtieCrotchStrap.png new file mode 100644 index 000000000..f02141a1f Binary files /dev/null and b/Models/Skirts/MaidSkirtHogtieCrotchStrap.png differ diff --git a/Models/Skirts/MaidSkirtKneel.png b/Models/Skirts/MaidSkirtKneel.png new file mode 100644 index 000000000..ae814b622 Binary files /dev/null and b/Models/Skirts/MaidSkirtKneel.png differ diff --git a/Models/Skirts/MaidSkirtKneelCrotchStrap.png b/Models/Skirts/MaidSkirtKneelCrotchStrap.png new file mode 100644 index 000000000..ae814b622 Binary files /dev/null and b/Models/Skirts/MaidSkirtKneelCrotchStrap.png differ diff --git a/Models/Skirts/MaidSkirtOverKneel.png b/Models/Skirts/MaidSkirtOverKneel.png new file mode 100644 index 000000000..66d48974a Binary files /dev/null and b/Models/Skirts/MaidSkirtOverKneel.png differ diff --git a/Models/Skirts/MaidSkirtOverKneelCrotchStrap.png b/Models/Skirts/MaidSkirtOverKneelCrotchStrap.png new file mode 100644 index 000000000..66d48974a Binary files /dev/null and b/Models/Skirts/MaidSkirtOverKneelCrotchStrap.png differ diff --git a/Models/Skirts/StripedSkirt.png b/Models/Skirts/StripedSkirt.png new file mode 100644 index 000000000..e0128efe6 Binary files /dev/null and b/Models/Skirts/StripedSkirt.png differ diff --git a/Models/Skirts/StripedSkirtClosed.png b/Models/Skirts/StripedSkirtClosed.png new file mode 100644 index 000000000..e0128efe6 Binary files /dev/null and b/Models/Skirts/StripedSkirtClosed.png differ diff --git a/Models/Skirts/StripedSkirtClosedCrotchStrap.png b/Models/Skirts/StripedSkirtClosedCrotchStrap.png new file mode 100644 index 000000000..eca4c12c5 Binary files /dev/null and b/Models/Skirts/StripedSkirtClosedCrotchStrap.png differ diff --git a/Models/Skirts/StripedSkirtCrotchStrap.png b/Models/Skirts/StripedSkirtCrotchStrap.png new file mode 100644 index 000000000..eca4c12c5 Binary files /dev/null and b/Models/Skirts/StripedSkirtCrotchStrap.png differ diff --git a/Models/Skirts/StripedSkirtHogtie.png b/Models/Skirts/StripedSkirtHogtie.png new file mode 100644 index 000000000..e0128efe6 Binary files /dev/null and b/Models/Skirts/StripedSkirtHogtie.png differ diff --git a/Models/Skirts/StripedSkirtHogtieCrotchStrap.png b/Models/Skirts/StripedSkirtHogtieCrotchStrap.png new file mode 100644 index 000000000..eca4c12c5 Binary files /dev/null and b/Models/Skirts/StripedSkirtHogtieCrotchStrap.png differ diff --git a/Models/Skirts/StripedSkirtKneel.png b/Models/Skirts/StripedSkirtKneel.png new file mode 100644 index 000000000..46ec8e4f3 Binary files /dev/null and b/Models/Skirts/StripedSkirtKneel.png differ diff --git a/Models/Skirts/StripedSkirtKneelCrotchStrap.png b/Models/Skirts/StripedSkirtKneelCrotchStrap.png new file mode 100644 index 000000000..ad84b1851 Binary files /dev/null and b/Models/Skirts/StripedSkirtKneelCrotchStrap.png differ diff --git a/Models/Skirts/StripedSkirtOverKneel.png b/Models/Skirts/StripedSkirtOverKneel.png new file mode 100644 index 000000000..9feafc5a5 Binary files /dev/null and b/Models/Skirts/StripedSkirtOverKneel.png differ diff --git a/Models/Skirts/StripedSkirtOverKneelCrotchStrap.png b/Models/Skirts/StripedSkirtOverKneelCrotchStrap.png new file mode 100644 index 000000000..7b2e47f34 Binary files /dev/null and b/Models/Skirts/StripedSkirtOverKneelCrotchStrap.png differ diff --git a/Models/Skirts/StripedSkirtUnder.png b/Models/Skirts/StripedSkirtUnder.png new file mode 100644 index 000000000..6b12e0e6e Binary files /dev/null and b/Models/Skirts/StripedSkirtUnder.png differ diff --git a/Models/Skirts/StripedSkirtUnderClosed.png b/Models/Skirts/StripedSkirtUnderClosed.png new file mode 100644 index 000000000..6b12e0e6e Binary files /dev/null and b/Models/Skirts/StripedSkirtUnderClosed.png differ diff --git a/Models/Skirts/StripedSkirtUnderClosedCrotchStrap.png b/Models/Skirts/StripedSkirtUnderClosedCrotchStrap.png new file mode 100644 index 000000000..afef6e1f2 Binary files /dev/null and b/Models/Skirts/StripedSkirtUnderClosedCrotchStrap.png differ diff --git a/Models/Skirts/StripedSkirtUnderCrotchStrap.png b/Models/Skirts/StripedSkirtUnderCrotchStrap.png new file mode 100644 index 000000000..afef6e1f2 Binary files /dev/null and b/Models/Skirts/StripedSkirtUnderCrotchStrap.png differ diff --git a/Models/Skirts/StripedSkirtUnderHogtie.png b/Models/Skirts/StripedSkirtUnderHogtie.png new file mode 100644 index 000000000..6b12e0e6e Binary files /dev/null and b/Models/Skirts/StripedSkirtUnderHogtie.png differ diff --git a/Models/Skirts/StripedSkirtUnderHogtieCrotchStrap.png b/Models/Skirts/StripedSkirtUnderHogtieCrotchStrap.png new file mode 100644 index 000000000..afef6e1f2 Binary files /dev/null and b/Models/Skirts/StripedSkirtUnderHogtieCrotchStrap.png differ diff --git a/Models/Skirts/StripedSkirtUnderKneel.png b/Models/Skirts/StripedSkirtUnderKneel.png new file mode 100644 index 000000000..b8c592176 Binary files /dev/null and b/Models/Skirts/StripedSkirtUnderKneel.png differ diff --git a/Models/Skirts/StripedSkirtUnderKneelCrotchStrap.png b/Models/Skirts/StripedSkirtUnderKneelCrotchStrap.png new file mode 100644 index 000000000..2bf0a2657 Binary files /dev/null and b/Models/Skirts/StripedSkirtUnderKneelCrotchStrap.png differ diff --git a/Models/Skirts/StripedSkirtUnderOverKneel.png b/Models/Skirts/StripedSkirtUnderOverKneel.png new file mode 100644 index 000000000..7d9b3a671 Binary files /dev/null and b/Models/Skirts/StripedSkirtUnderOverKneel.png differ diff --git a/Models/Skirts/StripedSkirtUnderOverKneelCrotchStrap.png b/Models/Skirts/StripedSkirtUnderOverKneelCrotchStrap.png new file mode 100644 index 000000000..00b29cc7f Binary files /dev/null and b/Models/Skirts/StripedSkirtUnderOverKneelCrotchStrap.png differ diff --git a/Models/Slayer/Cape.png b/Models/Slayer/Cape.png new file mode 100644 index 000000000..94a94dcd3 Binary files /dev/null and b/Models/Slayer/Cape.png differ diff --git a/Models/Slayer/CapeBackUp.png b/Models/Slayer/CapeBackUp.png new file mode 100644 index 000000000..58a838a25 Binary files /dev/null and b/Models/Slayer/CapeBackUp.png differ diff --git a/Models/Slayer/CapeBackYoked.png b/Models/Slayer/CapeBackYoked.png new file mode 100644 index 000000000..d07e44722 Binary files /dev/null and b/Models/Slayer/CapeBackYoked.png differ diff --git a/Models/Slayer/CapeCollar.png b/Models/Slayer/CapeCollar.png new file mode 100644 index 000000000..8f98cd41c Binary files /dev/null and b/Models/Slayer/CapeCollar.png differ diff --git a/Models/Slayer/CapeCollarButton.png b/Models/Slayer/CapeCollarButton.png new file mode 100644 index 000000000..12a72c53f Binary files /dev/null and b/Models/Slayer/CapeCollarButton.png differ diff --git a/Models/Slayer/CapeCollarInner.png b/Models/Slayer/CapeCollarInner.png new file mode 100644 index 000000000..12ed8fb1b Binary files /dev/null and b/Models/Slayer/CapeCollarInner.png differ diff --git a/Models/Slayer/CapeCollarRim.png b/Models/Slayer/CapeCollarRim.png new file mode 100644 index 000000000..ea76f737a Binary files /dev/null and b/Models/Slayer/CapeCollarRim.png differ diff --git a/Models/Slayer/CapeShoulderLeft.png b/Models/Slayer/CapeShoulderLeft.png new file mode 100644 index 000000000..46b9da29d Binary files /dev/null and b/Models/Slayer/CapeShoulderLeft.png differ diff --git a/Models/Slayer/CapeShoulderLeftButton.png b/Models/Slayer/CapeShoulderLeftButton.png new file mode 100644 index 000000000..43a58b864 Binary files /dev/null and b/Models/Slayer/CapeShoulderLeftButton.png differ diff --git a/Models/Slayer/CapeShoulderLeftButtonTied.png b/Models/Slayer/CapeShoulderLeftButtonTied.png new file mode 100644 index 000000000..481189fe4 Binary files /dev/null and b/Models/Slayer/CapeShoulderLeftButtonTied.png differ diff --git a/Models/Slayer/CapeShoulderLeftButtonUp.png b/Models/Slayer/CapeShoulderLeftButtonUp.png new file mode 100644 index 000000000..f3da6f0fa Binary files /dev/null and b/Models/Slayer/CapeShoulderLeftButtonUp.png differ diff --git a/Models/Slayer/CapeShoulderLeftButtonYoked.png b/Models/Slayer/CapeShoulderLeftButtonYoked.png new file mode 100644 index 000000000..e15a842ff Binary files /dev/null and b/Models/Slayer/CapeShoulderLeftButtonYoked.png differ diff --git a/Models/Slayer/CapeShoulderLeftTied.png b/Models/Slayer/CapeShoulderLeftTied.png new file mode 100644 index 000000000..1924c1be6 Binary files /dev/null and b/Models/Slayer/CapeShoulderLeftTied.png differ diff --git a/Models/Slayer/CapeShoulderLeftUp.png b/Models/Slayer/CapeShoulderLeftUp.png new file mode 100644 index 000000000..962b66dd0 Binary files /dev/null and b/Models/Slayer/CapeShoulderLeftUp.png differ diff --git a/Models/Slayer/CapeShoulderLeftYoked.png b/Models/Slayer/CapeShoulderLeftYoked.png new file mode 100644 index 000000000..c7c57fc7a Binary files /dev/null and b/Models/Slayer/CapeShoulderLeftYoked.png differ diff --git a/Models/Slayer/CapeShoulderRight.png b/Models/Slayer/CapeShoulderRight.png new file mode 100644 index 000000000..ae7054700 Binary files /dev/null and b/Models/Slayer/CapeShoulderRight.png differ diff --git a/Models/Slayer/CapeShoulderRightButtonUp.png b/Models/Slayer/CapeShoulderRightButtonUp.png new file mode 100644 index 000000000..e7befb715 Binary files /dev/null and b/Models/Slayer/CapeShoulderRightButtonUp.png differ diff --git a/Models/Slayer/CapeShoulderRightTied.png b/Models/Slayer/CapeShoulderRightTied.png new file mode 100644 index 000000000..267ab4bc9 Binary files /dev/null and b/Models/Slayer/CapeShoulderRightTied.png differ diff --git a/Models/Slayer/CapeShoulderRightUp.png b/Models/Slayer/CapeShoulderRightUp.png new file mode 100644 index 000000000..4b37e5900 Binary files /dev/null and b/Models/Slayer/CapeShoulderRightUp.png differ diff --git a/Models/Slayer/CapeShoulderRightYoked.png b/Models/Slayer/CapeShoulderRightYoked.png new file mode 100644 index 000000000..4414a839c Binary files /dev/null and b/Models/Slayer/CapeShoulderRightYoked.png differ diff --git a/Models/Slayer/CapeStripe.png b/Models/Slayer/CapeStripe.png new file mode 100644 index 000000000..06a4f9318 Binary files /dev/null and b/Models/Slayer/CapeStripe.png differ diff --git a/Models/Slayer/CapeStripeTied.png b/Models/Slayer/CapeStripeTied.png new file mode 100644 index 000000000..362252a0f Binary files /dev/null and b/Models/Slayer/CapeStripeTied.png differ diff --git a/Models/Slayer/CapeStripeUp.png b/Models/Slayer/CapeStripeUp.png new file mode 100644 index 000000000..a33448436 Binary files /dev/null and b/Models/Slayer/CapeStripeUp.png differ diff --git a/Models/Slayer/CapeStripeYoked.png b/Models/Slayer/CapeStripeYoked.png new file mode 100644 index 000000000..6130ec384 Binary files /dev/null and b/Models/Slayer/CapeStripeYoked.png differ diff --git a/Models/Slayer/CapeTied.png b/Models/Slayer/CapeTied.png new file mode 100644 index 000000000..5157cf4db Binary files /dev/null and b/Models/Slayer/CapeTied.png differ diff --git a/Models/Slayer/CapeUp.png b/Models/Slayer/CapeUp.png new file mode 100644 index 000000000..6160a27cb Binary files /dev/null and b/Models/Slayer/CapeUp.png differ diff --git a/Models/Slayer/CapeYoked.png b/Models/Slayer/CapeYoked.png new file mode 100644 index 000000000..efb7ae6ab Binary files /dev/null and b/Models/Slayer/CapeYoked.png differ diff --git a/Models/Slime/AnkleLeftClosed.png b/Models/Slime/AnkleLeftClosed.png new file mode 100644 index 000000000..1cf7e8478 Binary files /dev/null and b/Models/Slime/AnkleLeftClosed.png differ diff --git a/Models/Slime/AnkleLeftKneelClosed.png b/Models/Slime/AnkleLeftKneelClosed.png new file mode 100644 index 000000000..0d6e9ea6c Binary files /dev/null and b/Models/Slime/AnkleLeftKneelClosed.png differ diff --git a/Models/Slime/AnkleRightClosed.png b/Models/Slime/AnkleRightClosed.png new file mode 100644 index 000000000..e6c0eae4c Binary files /dev/null and b/Models/Slime/AnkleRightClosed.png differ diff --git a/Models/Slime/ArmLeftBoxtie.png b/Models/Slime/ArmLeftBoxtie.png new file mode 100644 index 000000000..24a6865f8 Binary files /dev/null and b/Models/Slime/ArmLeftBoxtie.png differ diff --git a/Models/Slime/ArmLeftCrossed.png b/Models/Slime/ArmLeftCrossed.png new file mode 100644 index 000000000..b7f5f6818 Binary files /dev/null and b/Models/Slime/ArmLeftCrossed.png differ diff --git a/Models/Slime/ArmLeftFront.png b/Models/Slime/ArmLeftFront.png new file mode 100644 index 000000000..3867b0730 Binary files /dev/null and b/Models/Slime/ArmLeftFront.png differ diff --git a/Models/Slime/ArmLeftUp.png b/Models/Slime/ArmLeftUp.png new file mode 100644 index 000000000..a2fa5937e Binary files /dev/null and b/Models/Slime/ArmLeftUp.png differ diff --git a/Models/Slime/ArmLeftWristtie.png b/Models/Slime/ArmLeftWristtie.png new file mode 100644 index 000000000..3425d5baf Binary files /dev/null and b/Models/Slime/ArmLeftWristtie.png differ diff --git a/Models/Slime/ArmRightBoxtie.png b/Models/Slime/ArmRightBoxtie.png new file mode 100644 index 000000000..40ef3abd8 Binary files /dev/null and b/Models/Slime/ArmRightBoxtie.png differ diff --git a/Models/Slime/ArmRightCrossed.png b/Models/Slime/ArmRightCrossed.png new file mode 100644 index 000000000..b8d1d9421 Binary files /dev/null and b/Models/Slime/ArmRightCrossed.png differ diff --git a/Models/Slime/ArmRightFront.png b/Models/Slime/ArmRightFront.png new file mode 100644 index 000000000..bdd6dbbdc Binary files /dev/null and b/Models/Slime/ArmRightFront.png differ diff --git a/Models/Slime/ArmRightUp.png b/Models/Slime/ArmRightUp.png new file mode 100644 index 000000000..f5e7129d8 Binary files /dev/null and b/Models/Slime/ArmRightUp.png differ diff --git a/Models/Slime/ArmRightWristtie.png b/Models/Slime/ArmRightWristtie.png new file mode 100644 index 000000000..71dc84c7d Binary files /dev/null and b/Models/Slime/ArmRightWristtie.png differ diff --git a/Models/Slime/Chest.png b/Models/Slime/Chest.png new file mode 100644 index 000000000..6a45b242f Binary files /dev/null and b/Models/Slime/Chest.png differ diff --git a/Models/Slime/ChestBoxtie.png b/Models/Slime/ChestBoxtie.png new file mode 100644 index 000000000..d8011aa82 Binary files /dev/null and b/Models/Slime/ChestBoxtie.png differ diff --git a/Models/Slime/ChestCrossed.png b/Models/Slime/ChestCrossed.png new file mode 100644 index 000000000..642340c3c Binary files /dev/null and b/Models/Slime/ChestCrossed.png differ diff --git a/Models/Slime/ChestWristtie.png b/Models/Slime/ChestWristtie.png new file mode 100644 index 000000000..1fcdb3590 Binary files /dev/null and b/Models/Slime/ChestWristtie.png differ diff --git a/Models/Slime/FaceEyes.png b/Models/Slime/FaceEyes.png new file mode 100644 index 000000000..0d981ba62 Binary files /dev/null and b/Models/Slime/FaceEyes.png differ diff --git a/Models/Slime/FaceFull.png b/Models/Slime/FaceFull.png new file mode 100644 index 000000000..0649d0652 Binary files /dev/null and b/Models/Slime/FaceFull.png differ diff --git a/Models/Slime/FaceMouth.png b/Models/Slime/FaceMouth.png new file mode 100644 index 000000000..5650c886d Binary files /dev/null and b/Models/Slime/FaceMouth.png differ diff --git a/Models/Slime/FootLeftClosed.png b/Models/Slime/FootLeftClosed.png new file mode 100644 index 000000000..ef0cb90f5 Binary files /dev/null and b/Models/Slime/FootLeftClosed.png differ diff --git a/Models/Slime/FootLeftHogtie.png b/Models/Slime/FootLeftHogtie.png new file mode 100644 index 000000000..7b99219df Binary files /dev/null and b/Models/Slime/FootLeftHogtie.png differ diff --git a/Models/Slime/FootLeftKneelClosed.png b/Models/Slime/FootLeftKneelClosed.png new file mode 100644 index 000000000..bb331cb2b Binary files /dev/null and b/Models/Slime/FootLeftKneelClosed.png differ diff --git a/Models/Slime/FootRightClosed.png b/Models/Slime/FootRightClosed.png new file mode 100644 index 000000000..ade2e97f3 Binary files /dev/null and b/Models/Slime/FootRightClosed.png differ diff --git a/Models/Slime/FootRightKneel.png b/Models/Slime/FootRightKneel.png new file mode 100644 index 000000000..d20ac09aa Binary files /dev/null and b/Models/Slime/FootRightKneel.png differ diff --git a/Models/Slime/HandLeftFree.png b/Models/Slime/HandLeftFree.png new file mode 100644 index 000000000..cf48dacf3 Binary files /dev/null and b/Models/Slime/HandLeftFree.png differ diff --git a/Models/Slime/HandLeftFront.png b/Models/Slime/HandLeftFront.png new file mode 100644 index 000000000..c163bed82 Binary files /dev/null and b/Models/Slime/HandLeftFront.png differ diff --git a/Models/Slime/HandLeftYoked.png b/Models/Slime/HandLeftYoked.png new file mode 100644 index 000000000..966238453 Binary files /dev/null and b/Models/Slime/HandLeftYoked.png differ diff --git a/Models/Slime/HandRightBoxtie.png b/Models/Slime/HandRightBoxtie.png new file mode 100644 index 000000000..cee3589e4 Binary files /dev/null and b/Models/Slime/HandRightBoxtie.png differ diff --git a/Models/Slime/HandRightFree.png b/Models/Slime/HandRightFree.png new file mode 100644 index 000000000..15af5fb18 Binary files /dev/null and b/Models/Slime/HandRightFree.png differ diff --git a/Models/Slime/HandRightFront.png b/Models/Slime/HandRightFront.png new file mode 100644 index 000000000..a327036f5 Binary files /dev/null and b/Models/Slime/HandRightFront.png differ diff --git a/Models/Slime/HandRightYoked.png b/Models/Slime/HandRightYoked.png new file mode 100644 index 000000000..54d6a2185 Binary files /dev/null and b/Models/Slime/HandRightYoked.png differ diff --git a/Models/Slime/LegLeftClosed.png b/Models/Slime/LegLeftClosed.png new file mode 100644 index 000000000..265eb59dc Binary files /dev/null and b/Models/Slime/LegLeftClosed.png differ diff --git a/Models/Slime/LegLeftHogtie.png b/Models/Slime/LegLeftHogtie.png new file mode 100644 index 000000000..afc53f963 Binary files /dev/null and b/Models/Slime/LegLeftHogtie.png differ diff --git a/Models/Slime/LegLeftKneel.png b/Models/Slime/LegLeftKneel.png new file mode 100644 index 000000000..46b05f15f Binary files /dev/null and b/Models/Slime/LegLeftKneel.png differ diff --git a/Models/Slime/LegLeftKneelClosed.png b/Models/Slime/LegLeftKneelClosed.png new file mode 100644 index 000000000..d0f0d209a Binary files /dev/null and b/Models/Slime/LegLeftKneelClosed.png differ diff --git a/Models/Slime/LegRightClosed.png b/Models/Slime/LegRightClosed.png new file mode 100644 index 000000000..6faaf0098 Binary files /dev/null and b/Models/Slime/LegRightClosed.png differ diff --git a/Models/Slime/LegRightHogtie.png b/Models/Slime/LegRightHogtie.png new file mode 100644 index 000000000..cf346a4ed Binary files /dev/null and b/Models/Slime/LegRightHogtie.png differ diff --git a/Models/Slime/LegRightKneel.png b/Models/Slime/LegRightKneel.png new file mode 100644 index 000000000..8964c1ce6 Binary files /dev/null and b/Models/Slime/LegRightKneel.png differ diff --git a/Models/Slime/LegRightKneelClosed.png b/Models/Slime/LegRightKneelClosed.png new file mode 100644 index 000000000..02442e4a7 Binary files /dev/null and b/Models/Slime/LegRightKneelClosed.png differ diff --git a/Models/Slime/TorsoLower.png b/Models/Slime/TorsoLower.png new file mode 100644 index 000000000..1d8b7a1c4 Binary files /dev/null and b/Models/Slime/TorsoLower.png differ diff --git a/Models/Slime/TorsoLowerKneel.png b/Models/Slime/TorsoLowerKneel.png new file mode 100644 index 000000000..0a3963f90 Binary files /dev/null and b/Models/Slime/TorsoLowerKneel.png differ diff --git a/Models/Slime/TorsoUpper.png b/Models/Slime/TorsoUpper.png new file mode 100644 index 000000000..0160cd591 Binary files /dev/null and b/Models/Slime/TorsoUpper.png differ diff --git a/Models/SmoothHeels/LeftClosed.png b/Models/SmoothHeels/LeftClosed.png new file mode 100644 index 000000000..9fc31a1dd Binary files /dev/null and b/Models/SmoothHeels/LeftClosed.png differ diff --git a/Models/SmoothHeels/LeftHogtie.png b/Models/SmoothHeels/LeftHogtie.png new file mode 100644 index 000000000..bad873ff0 Binary files /dev/null and b/Models/SmoothHeels/LeftHogtie.png differ diff --git a/Models/SmoothHeels/LeftKneel.png b/Models/SmoothHeels/LeftKneel.png new file mode 100644 index 000000000..4c7b17c81 Binary files /dev/null and b/Models/SmoothHeels/LeftKneel.png differ diff --git a/Models/SmoothHeels/LeftKneelClosed.png b/Models/SmoothHeels/LeftKneelClosed.png new file mode 100644 index 000000000..2597e123c Binary files /dev/null and b/Models/SmoothHeels/LeftKneelClosed.png differ diff --git a/Models/SmoothHeels/LeftSpread.png b/Models/SmoothHeels/LeftSpread.png new file mode 100644 index 000000000..3625a3fc3 Binary files /dev/null and b/Models/SmoothHeels/LeftSpread.png differ diff --git a/Models/SmoothHeels/LegLeftHogtie.png b/Models/SmoothHeels/LegLeftHogtie.png new file mode 100644 index 000000000..3a4495c62 Binary files /dev/null and b/Models/SmoothHeels/LegLeftHogtie.png differ diff --git a/Models/SmoothHeels/LegRightHogtie.png b/Models/SmoothHeels/LegRightHogtie.png new file mode 100644 index 000000000..f571b904b Binary files /dev/null and b/Models/SmoothHeels/LegRightHogtie.png differ diff --git a/Models/SmoothHeels/LegRightKneel.png b/Models/SmoothHeels/LegRightKneel.png new file mode 100644 index 000000000..1d837b131 Binary files /dev/null and b/Models/SmoothHeels/LegRightKneel.png differ diff --git a/Models/SmoothHeels/LegRightKneelClosed.png b/Models/SmoothHeels/LegRightKneelClosed.png new file mode 100644 index 000000000..8e8d36ecd Binary files /dev/null and b/Models/SmoothHeels/LegRightKneelClosed.png differ diff --git a/Models/SmoothHeels/RightClosed.png b/Models/SmoothHeels/RightClosed.png new file mode 100644 index 000000000..fb97888dd Binary files /dev/null and b/Models/SmoothHeels/RightClosed.png differ diff --git a/Models/SmoothHeels/RightHogtie.png b/Models/SmoothHeels/RightHogtie.png new file mode 100644 index 000000000..f571b904b Binary files /dev/null and b/Models/SmoothHeels/RightHogtie.png differ diff --git a/Models/SmoothHeels/RightKneel.png b/Models/SmoothHeels/RightKneel.png new file mode 100644 index 000000000..5b72116e7 Binary files /dev/null and b/Models/SmoothHeels/RightKneel.png differ diff --git a/Models/SmoothHeels/RightSpread.png b/Models/SmoothHeels/RightSpread.png new file mode 100644 index 000000000..0aaf9456d Binary files /dev/null and b/Models/SmoothHeels/RightSpread.png differ diff --git a/Models/Spats/SpatsClosed.png b/Models/Spats/SpatsClosed.png new file mode 100644 index 000000000..6f81b29ba Binary files /dev/null and b/Models/Spats/SpatsClosed.png differ diff --git a/Models/Spats/SpatsKneel.png b/Models/Spats/SpatsKneel.png new file mode 100644 index 000000000..614a48988 Binary files /dev/null and b/Models/Spats/SpatsKneel.png differ diff --git a/Models/Spats/SpatsKneelClosed.png b/Models/Spats/SpatsKneelClosed.png new file mode 100644 index 000000000..c133bfba7 Binary files /dev/null and b/Models/Spats/SpatsKneelClosed.png differ diff --git a/Models/Spats/SpatsSpread.png b/Models/Spats/SpatsSpread.png new file mode 100644 index 000000000..d57ae5c5b Binary files /dev/null and b/Models/Spats/SpatsSpread.png differ diff --git a/Models/SteelChastity/Belt.png b/Models/SteelChastity/Belt.png new file mode 100644 index 000000000..74d9131fa Binary files /dev/null and b/Models/SteelChastity/Belt.png differ diff --git a/Models/SteelChastity/BeltPadlock.png b/Models/SteelChastity/BeltPadlock.png new file mode 100644 index 000000000..a7733ded8 Binary files /dev/null and b/Models/SteelChastity/BeltPadlock.png differ diff --git a/Models/SteelChastity/BeltPadlockPin.png b/Models/SteelChastity/BeltPadlockPin.png new file mode 100644 index 000000000..77dbfe140 Binary files /dev/null and b/Models/SteelChastity/BeltPadlockPin.png differ diff --git a/Models/SteelChastity/BeltRadial.png b/Models/SteelChastity/BeltRadial.png new file mode 100644 index 000000000..3feef2f95 Binary files /dev/null and b/Models/SteelChastity/BeltRadial.png differ diff --git a/Models/SteelChastity/BeltSegu.png b/Models/SteelChastity/BeltSegu.png new file mode 100644 index 000000000..a766f9910 Binary files /dev/null and b/Models/SteelChastity/BeltSegu.png differ diff --git a/Models/SteelChastity/Bra.png b/Models/SteelChastity/Bra.png new file mode 100644 index 000000000..020fa5df1 Binary files /dev/null and b/Models/SteelChastity/Bra.png differ diff --git a/Models/SteelChastity/BraPadlock.png b/Models/SteelChastity/BraPadlock.png new file mode 100644 index 000000000..b7941b51c Binary files /dev/null and b/Models/SteelChastity/BraPadlock.png differ diff --git a/Models/SteelChastity/BraPadlockPin.png b/Models/SteelChastity/BraPadlockPin.png new file mode 100644 index 000000000..bf4129594 Binary files /dev/null and b/Models/SteelChastity/BraPadlockPin.png differ diff --git a/Models/SteelChastity/BraRadial.png b/Models/SteelChastity/BraRadial.png new file mode 100644 index 000000000..67250db8d Binary files /dev/null and b/Models/SteelChastity/BraRadial.png differ diff --git a/Models/SteelChastity/BraSegu.png b/Models/SteelChastity/BraSegu.png new file mode 100644 index 000000000..18816c530 Binary files /dev/null and b/Models/SteelChastity/BraSegu.png differ diff --git a/Models/SteelCuffs/AnkleLeftClosed.png b/Models/SteelCuffs/AnkleLeftClosed.png new file mode 100644 index 000000000..28b881b57 Binary files /dev/null and b/Models/SteelCuffs/AnkleLeftClosed.png differ diff --git a/Models/SteelCuffs/AnkleLeftKneel.png b/Models/SteelCuffs/AnkleLeftKneel.png new file mode 100644 index 000000000..1c662eb14 Binary files /dev/null and b/Models/SteelCuffs/AnkleLeftKneel.png differ diff --git a/Models/SteelCuffs/AnkleLeftKneelClosed.png b/Models/SteelCuffs/AnkleLeftKneelClosed.png new file mode 100644 index 000000000..785b8c1e6 Binary files /dev/null and b/Models/SteelCuffs/AnkleLeftKneelClosed.png differ diff --git a/Models/SteelCuffs/AnkleLeftSpread.png b/Models/SteelCuffs/AnkleLeftSpread.png new file mode 100644 index 000000000..fd02f78ea Binary files /dev/null and b/Models/SteelCuffs/AnkleLeftSpread.png differ diff --git a/Models/SteelCuffs/AnkleRightClosed.png b/Models/SteelCuffs/AnkleRightClosed.png new file mode 100644 index 000000000..1d7b2ba49 Binary files /dev/null and b/Models/SteelCuffs/AnkleRightClosed.png differ diff --git a/Models/SteelCuffs/AnkleRightSpread.png b/Models/SteelCuffs/AnkleRightSpread.png new file mode 100644 index 000000000..29e299ecd Binary files /dev/null and b/Models/SteelCuffs/AnkleRightSpread.png differ diff --git a/Models/SteelCuffs/Belt.png b/Models/SteelCuffs/Belt.png new file mode 100644 index 000000000..afc96fec7 Binary files /dev/null and b/Models/SteelCuffs/Belt.png differ diff --git a/Models/SteelCuffs/Collar.png b/Models/SteelCuffs/Collar.png new file mode 100644 index 000000000..d3cb9a2dd Binary files /dev/null and b/Models/SteelCuffs/Collar.png differ diff --git a/Models/SteelCuffs/ElbowLeftBoxtie.png b/Models/SteelCuffs/ElbowLeftBoxtie.png new file mode 100644 index 000000000..795bb0ef3 Binary files /dev/null and b/Models/SteelCuffs/ElbowLeftBoxtie.png differ diff --git a/Models/SteelCuffs/ElbowLeftFree.png b/Models/SteelCuffs/ElbowLeftFree.png new file mode 100644 index 000000000..e4220e765 Binary files /dev/null and b/Models/SteelCuffs/ElbowLeftFree.png differ diff --git a/Models/SteelCuffs/ElbowLeftFront.png b/Models/SteelCuffs/ElbowLeftFront.png new file mode 100644 index 000000000..a4410dfbc Binary files /dev/null and b/Models/SteelCuffs/ElbowLeftFront.png differ diff --git a/Models/SteelCuffs/ElbowLeftUp.png b/Models/SteelCuffs/ElbowLeftUp.png new file mode 100644 index 000000000..a948ab522 Binary files /dev/null and b/Models/SteelCuffs/ElbowLeftUp.png differ diff --git a/Models/SteelCuffs/ElbowLeftWristtie.png b/Models/SteelCuffs/ElbowLeftWristtie.png new file mode 100644 index 000000000..d4d036626 Binary files /dev/null and b/Models/SteelCuffs/ElbowLeftWristtie.png differ diff --git a/Models/SteelCuffs/ElbowLeftYoked.png b/Models/SteelCuffs/ElbowLeftYoked.png new file mode 100644 index 000000000..7edc5d5c1 Binary files /dev/null and b/Models/SteelCuffs/ElbowLeftYoked.png differ diff --git a/Models/SteelCuffs/ElbowRightBoxtie.png b/Models/SteelCuffs/ElbowRightBoxtie.png new file mode 100644 index 000000000..cfe8c9a02 Binary files /dev/null and b/Models/SteelCuffs/ElbowRightBoxtie.png differ diff --git a/Models/SteelCuffs/ElbowRightFront.png b/Models/SteelCuffs/ElbowRightFront.png new file mode 100644 index 000000000..713d4aa7e Binary files /dev/null and b/Models/SteelCuffs/ElbowRightFront.png differ diff --git a/Models/SteelCuffs/ElbowRightUp.png b/Models/SteelCuffs/ElbowRightUp.png new file mode 100644 index 000000000..6bbc92f78 Binary files /dev/null and b/Models/SteelCuffs/ElbowRightUp.png differ diff --git a/Models/SteelCuffs/ElbowRightWristtie.png b/Models/SteelCuffs/ElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/SteelCuffs/ElbowRightWristtie.png differ diff --git a/Models/SteelCuffs/ElbowRightYoked.png b/Models/SteelCuffs/ElbowRightYoked.png new file mode 100644 index 000000000..13e2d6f82 Binary files /dev/null and b/Models/SteelCuffs/ElbowRightYoked.png differ diff --git a/Models/SteelCuffs/RimAnkleLeftClosed.png b/Models/SteelCuffs/RimAnkleLeftClosed.png new file mode 100644 index 000000000..a1639ab1a Binary files /dev/null and b/Models/SteelCuffs/RimAnkleLeftClosed.png differ diff --git a/Models/SteelCuffs/RimAnkleLeftKneel.png b/Models/SteelCuffs/RimAnkleLeftKneel.png new file mode 100644 index 000000000..73abdf6a3 Binary files /dev/null and b/Models/SteelCuffs/RimAnkleLeftKneel.png differ diff --git a/Models/SteelCuffs/RimAnkleLeftKneelClosed.png b/Models/SteelCuffs/RimAnkleLeftKneelClosed.png new file mode 100644 index 000000000..f956d52a8 Binary files /dev/null and b/Models/SteelCuffs/RimAnkleLeftKneelClosed.png differ diff --git a/Models/SteelCuffs/RimAnkleLeftSpread.png b/Models/SteelCuffs/RimAnkleLeftSpread.png new file mode 100644 index 000000000..badbde5d2 Binary files /dev/null and b/Models/SteelCuffs/RimAnkleLeftSpread.png differ diff --git a/Models/SteelCuffs/RimAnkleRightClosed.png b/Models/SteelCuffs/RimAnkleRightClosed.png new file mode 100644 index 000000000..e58c34832 Binary files /dev/null and b/Models/SteelCuffs/RimAnkleRightClosed.png differ diff --git a/Models/SteelCuffs/RimAnkleRightSpread.png b/Models/SteelCuffs/RimAnkleRightSpread.png new file mode 100644 index 000000000..10d132458 Binary files /dev/null and b/Models/SteelCuffs/RimAnkleRightSpread.png differ diff --git a/Models/SteelCuffs/RimBelt.png b/Models/SteelCuffs/RimBelt.png new file mode 100644 index 000000000..e34bfecd3 Binary files /dev/null and b/Models/SteelCuffs/RimBelt.png differ diff --git a/Models/SteelCuffs/RimCollar.png b/Models/SteelCuffs/RimCollar.png new file mode 100644 index 000000000..ee59ffdd4 Binary files /dev/null and b/Models/SteelCuffs/RimCollar.png differ diff --git a/Models/SteelCuffs/RimElbowLeftBoxtie.png b/Models/SteelCuffs/RimElbowLeftBoxtie.png new file mode 100644 index 000000000..10156de9f Binary files /dev/null and b/Models/SteelCuffs/RimElbowLeftBoxtie.png differ diff --git a/Models/SteelCuffs/RimElbowLeftFree.png b/Models/SteelCuffs/RimElbowLeftFree.png new file mode 100644 index 000000000..19e229db9 Binary files /dev/null and b/Models/SteelCuffs/RimElbowLeftFree.png differ diff --git a/Models/SteelCuffs/RimElbowLeftFront.png b/Models/SteelCuffs/RimElbowLeftFront.png new file mode 100644 index 000000000..62ae1e65c Binary files /dev/null and b/Models/SteelCuffs/RimElbowLeftFront.png differ diff --git a/Models/SteelCuffs/RimElbowLeftUp.png b/Models/SteelCuffs/RimElbowLeftUp.png new file mode 100644 index 000000000..c0ccb4452 Binary files /dev/null and b/Models/SteelCuffs/RimElbowLeftUp.png differ diff --git a/Models/SteelCuffs/RimElbowLeftWristtie.png b/Models/SteelCuffs/RimElbowLeftWristtie.png new file mode 100644 index 000000000..e37afcfda Binary files /dev/null and b/Models/SteelCuffs/RimElbowLeftWristtie.png differ diff --git a/Models/SteelCuffs/RimElbowLeftYoked.png b/Models/SteelCuffs/RimElbowLeftYoked.png new file mode 100644 index 000000000..63514e6af Binary files /dev/null and b/Models/SteelCuffs/RimElbowLeftYoked.png differ diff --git a/Models/SteelCuffs/RimElbowRightBoxtie.png b/Models/SteelCuffs/RimElbowRightBoxtie.png new file mode 100644 index 000000000..cbcde971b Binary files /dev/null and b/Models/SteelCuffs/RimElbowRightBoxtie.png differ diff --git a/Models/SteelCuffs/RimElbowRightFront.png b/Models/SteelCuffs/RimElbowRightFront.png new file mode 100644 index 000000000..a095b572b Binary files /dev/null and b/Models/SteelCuffs/RimElbowRightFront.png differ diff --git a/Models/SteelCuffs/RimElbowRightUp.png b/Models/SteelCuffs/RimElbowRightUp.png new file mode 100644 index 000000000..c8200d539 Binary files /dev/null and b/Models/SteelCuffs/RimElbowRightUp.png differ diff --git a/Models/SteelCuffs/RimElbowRightWristtie.png b/Models/SteelCuffs/RimElbowRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/SteelCuffs/RimElbowRightWristtie.png differ diff --git a/Models/SteelCuffs/RimElbowRightYoked.png b/Models/SteelCuffs/RimElbowRightYoked.png new file mode 100644 index 000000000..9ae8b4359 Binary files /dev/null and b/Models/SteelCuffs/RimElbowRightYoked.png differ diff --git a/Models/SteelCuffs/RimThighLeftClosed.png b/Models/SteelCuffs/RimThighLeftClosed.png new file mode 100644 index 000000000..4df76ffa4 Binary files /dev/null and b/Models/SteelCuffs/RimThighLeftClosed.png differ diff --git a/Models/SteelCuffs/RimThighLeftKneel.png b/Models/SteelCuffs/RimThighLeftKneel.png new file mode 100644 index 000000000..8a6fa4c1c Binary files /dev/null and b/Models/SteelCuffs/RimThighLeftKneel.png differ diff --git a/Models/SteelCuffs/RimThighLeftKneelClosed.png b/Models/SteelCuffs/RimThighLeftKneelClosed.png new file mode 100644 index 000000000..ffbb718dd Binary files /dev/null and b/Models/SteelCuffs/RimThighLeftKneelClosed.png differ diff --git a/Models/SteelCuffs/RimThighLeftSpread.png b/Models/SteelCuffs/RimThighLeftSpread.png new file mode 100644 index 000000000..f8ee82db3 Binary files /dev/null and b/Models/SteelCuffs/RimThighLeftSpread.png differ diff --git a/Models/SteelCuffs/RimThighRightClosed.png b/Models/SteelCuffs/RimThighRightClosed.png new file mode 100644 index 000000000..4fed974c2 Binary files /dev/null and b/Models/SteelCuffs/RimThighRightClosed.png differ diff --git a/Models/SteelCuffs/RimThighRightKneel.png b/Models/SteelCuffs/RimThighRightKneel.png new file mode 100644 index 000000000..4ddb18f5c Binary files /dev/null and b/Models/SteelCuffs/RimThighRightKneel.png differ diff --git a/Models/SteelCuffs/RimThighRightKneelClosed.png b/Models/SteelCuffs/RimThighRightKneelClosed.png new file mode 100644 index 000000000..4ddb18f5c Binary files /dev/null and b/Models/SteelCuffs/RimThighRightKneelClosed.png differ diff --git a/Models/SteelCuffs/RimThighRightSpread.png b/Models/SteelCuffs/RimThighRightSpread.png new file mode 100644 index 000000000..4b839a46e Binary files /dev/null and b/Models/SteelCuffs/RimThighRightSpread.png differ diff --git a/Models/SteelCuffs/RimWristLeftFree.png b/Models/SteelCuffs/RimWristLeftFree.png new file mode 100644 index 000000000..567fddbf6 Binary files /dev/null and b/Models/SteelCuffs/RimWristLeftFree.png differ diff --git a/Models/SteelCuffs/RimWristLeftFront.png b/Models/SteelCuffs/RimWristLeftFront.png new file mode 100644 index 000000000..c4f036b32 Binary files /dev/null and b/Models/SteelCuffs/RimWristLeftFront.png differ diff --git a/Models/SteelCuffs/RimWristLeftYoked.png b/Models/SteelCuffs/RimWristLeftYoked.png new file mode 100644 index 000000000..b470da1a9 Binary files /dev/null and b/Models/SteelCuffs/RimWristLeftYoked.png differ diff --git a/Models/SteelCuffs/RimWristRightCrossed.png b/Models/SteelCuffs/RimWristRightCrossed.png new file mode 100644 index 000000000..884f99d27 Binary files /dev/null and b/Models/SteelCuffs/RimWristRightCrossed.png differ diff --git a/Models/SteelCuffs/RimWristRightFree.png b/Models/SteelCuffs/RimWristRightFree.png new file mode 100644 index 000000000..30d406a62 Binary files /dev/null and b/Models/SteelCuffs/RimWristRightFree.png differ diff --git a/Models/SteelCuffs/RimWristRightFront.png b/Models/SteelCuffs/RimWristRightFront.png new file mode 100644 index 000000000..b4351994c Binary files /dev/null and b/Models/SteelCuffs/RimWristRightFront.png differ diff --git a/Models/SteelCuffs/RimWristRightYoked.png b/Models/SteelCuffs/RimWristRightYoked.png new file mode 100644 index 000000000..6de936489 Binary files /dev/null and b/Models/SteelCuffs/RimWristRightYoked.png differ diff --git a/Models/SteelCuffs/ThighLeftClosed.png b/Models/SteelCuffs/ThighLeftClosed.png new file mode 100644 index 000000000..1216f4874 Binary files /dev/null and b/Models/SteelCuffs/ThighLeftClosed.png differ diff --git a/Models/SteelCuffs/ThighLeftKneel.png b/Models/SteelCuffs/ThighLeftKneel.png new file mode 100644 index 000000000..00b110a54 Binary files /dev/null and b/Models/SteelCuffs/ThighLeftKneel.png differ diff --git a/Models/SteelCuffs/ThighLeftKneelClosed.png b/Models/SteelCuffs/ThighLeftKneelClosed.png new file mode 100644 index 000000000..bd2165c40 Binary files /dev/null and b/Models/SteelCuffs/ThighLeftKneelClosed.png differ diff --git a/Models/SteelCuffs/ThighLeftSpread.png b/Models/SteelCuffs/ThighLeftSpread.png new file mode 100644 index 000000000..ab5d89597 Binary files /dev/null and b/Models/SteelCuffs/ThighLeftSpread.png differ diff --git a/Models/SteelCuffs/ThighRightClosed.png b/Models/SteelCuffs/ThighRightClosed.png new file mode 100644 index 000000000..e3fae40ab Binary files /dev/null and b/Models/SteelCuffs/ThighRightClosed.png differ diff --git a/Models/SteelCuffs/ThighRightKneel.png b/Models/SteelCuffs/ThighRightKneel.png new file mode 100644 index 000000000..f14d41a0c Binary files /dev/null and b/Models/SteelCuffs/ThighRightKneel.png differ diff --git a/Models/SteelCuffs/ThighRightKneelClosed.png b/Models/SteelCuffs/ThighRightKneelClosed.png new file mode 100644 index 000000000..a699c607c Binary files /dev/null and b/Models/SteelCuffs/ThighRightKneelClosed.png differ diff --git a/Models/SteelCuffs/ThighRightSpread.png b/Models/SteelCuffs/ThighRightSpread.png new file mode 100644 index 000000000..88f5411af Binary files /dev/null and b/Models/SteelCuffs/ThighRightSpread.png differ diff --git a/Models/SteelCuffs/WristLeftFree.png b/Models/SteelCuffs/WristLeftFree.png new file mode 100644 index 000000000..ee228962b Binary files /dev/null and b/Models/SteelCuffs/WristLeftFree.png differ diff --git a/Models/SteelCuffs/WristLeftFront.png b/Models/SteelCuffs/WristLeftFront.png new file mode 100644 index 000000000..da744a91e Binary files /dev/null and b/Models/SteelCuffs/WristLeftFront.png differ diff --git a/Models/SteelCuffs/WristLeftYoked.png b/Models/SteelCuffs/WristLeftYoked.png new file mode 100644 index 000000000..db6530f6c Binary files /dev/null and b/Models/SteelCuffs/WristLeftYoked.png differ diff --git a/Models/SteelCuffs/WristRightCrossed.png b/Models/SteelCuffs/WristRightCrossed.png new file mode 100644 index 000000000..9e9057db1 Binary files /dev/null and b/Models/SteelCuffs/WristRightCrossed.png differ diff --git a/Models/SteelCuffs/WristRightFree.png b/Models/SteelCuffs/WristRightFree.png new file mode 100644 index 000000000..b0d1b4847 Binary files /dev/null and b/Models/SteelCuffs/WristRightFree.png differ diff --git a/Models/SteelCuffs/WristRightFront.png b/Models/SteelCuffs/WristRightFront.png new file mode 100644 index 000000000..edf5ec8db Binary files /dev/null and b/Models/SteelCuffs/WristRightFront.png differ diff --git a/Models/SteelCuffs/WristRightYoked.png b/Models/SteelCuffs/WristRightYoked.png new file mode 100644 index 000000000..1993e48bc Binary files /dev/null and b/Models/SteelCuffs/WristRightYoked.png differ diff --git a/Models/Succubus/FootSockLeftHogtie.png b/Models/Succubus/FootSockLeftHogtie.png new file mode 100644 index 000000000..75d19baa1 Binary files /dev/null and b/Models/Succubus/FootSockLeftHogtie.png differ diff --git a/Models/Succubus/FootSockRightKneel.png b/Models/Succubus/FootSockRightKneel.png new file mode 100644 index 000000000..a8380eae8 Binary files /dev/null and b/Models/Succubus/FootSockRightKneel.png differ diff --git a/Models/Succubus/SockLeftClosed.png b/Models/Succubus/SockLeftClosed.png new file mode 100644 index 000000000..8a5b2d04c Binary files /dev/null and b/Models/Succubus/SockLeftClosed.png differ diff --git a/Models/Succubus/SockLeftKneel.png b/Models/Succubus/SockLeftKneel.png new file mode 100644 index 000000000..033354e74 Binary files /dev/null and b/Models/Succubus/SockLeftKneel.png differ diff --git a/Models/Succubus/SockLeftKneelClosed.png b/Models/Succubus/SockLeftKneelClosed.png new file mode 100644 index 000000000..cf5dbf841 Binary files /dev/null and b/Models/Succubus/SockLeftKneelClosed.png differ diff --git a/Models/Succubus/SockLeftSpread.png b/Models/Succubus/SockLeftSpread.png new file mode 100644 index 000000000..c7bd89813 Binary files /dev/null and b/Models/Succubus/SockLeftSpread.png differ diff --git a/Models/Succubus/SockRightClosed.png b/Models/Succubus/SockRightClosed.png new file mode 100644 index 000000000..b1f1008a6 Binary files /dev/null and b/Models/Succubus/SockRightClosed.png differ diff --git a/Models/Succubus/SockRightSpread.png b/Models/Succubus/SockRightSpread.png new file mode 100644 index 000000000..fc782e5da Binary files /dev/null and b/Models/Succubus/SockRightSpread.png differ diff --git a/Models/Succubus/SuccubusClawLeftFree.png b/Models/Succubus/SuccubusClawLeftFree.png new file mode 100644 index 000000000..3a8185409 Binary files /dev/null and b/Models/Succubus/SuccubusClawLeftFree.png differ diff --git a/Models/Succubus/SuccubusClawLeftFront.png b/Models/Succubus/SuccubusClawLeftFront.png new file mode 100644 index 000000000..4d450d951 Binary files /dev/null and b/Models/Succubus/SuccubusClawLeftFront.png differ diff --git a/Models/Succubus/SuccubusClawLeftYoked.png b/Models/Succubus/SuccubusClawLeftYoked.png new file mode 100644 index 000000000..6bea4a8cb Binary files /dev/null and b/Models/Succubus/SuccubusClawLeftYoked.png differ diff --git a/Models/Succubus/SuccubusClawRightFree.png b/Models/Succubus/SuccubusClawRightFree.png new file mode 100644 index 000000000..c1f10203a Binary files /dev/null and b/Models/Succubus/SuccubusClawRightFree.png differ diff --git a/Models/Succubus/SuccubusClawRightFront.png b/Models/Succubus/SuccubusClawRightFront.png new file mode 100644 index 000000000..d4c73f525 Binary files /dev/null and b/Models/Succubus/SuccubusClawRightFront.png differ diff --git a/Models/Succubus/SuccubusClawRightYoked.png b/Models/Succubus/SuccubusClawRightYoked.png new file mode 100644 index 000000000..e7be50d51 Binary files /dev/null and b/Models/Succubus/SuccubusClawRightYoked.png differ diff --git a/Models/Succubus/SuccubusHornLeft.png b/Models/Succubus/SuccubusHornLeft.png new file mode 100644 index 000000000..3b5ed4390 Binary files /dev/null and b/Models/Succubus/SuccubusHornLeft.png differ diff --git a/Models/Succubus/SuccubusHornLight.png b/Models/Succubus/SuccubusHornLight.png new file mode 100644 index 000000000..45ca68af9 Binary files /dev/null and b/Models/Succubus/SuccubusHornLight.png differ diff --git a/Models/Succubus/SuccubusHornRight.png b/Models/Succubus/SuccubusHornRight.png new file mode 100644 index 000000000..8e8ed507b Binary files /dev/null and b/Models/Succubus/SuccubusHornRight.png differ diff --git a/Models/Succubus/SuccubusTail.png b/Models/Succubus/SuccubusTail.png new file mode 100644 index 000000000..c2a9abeab Binary files /dev/null and b/Models/Succubus/SuccubusTail.png differ diff --git a/Models/Succubus/SuccubusTailLight.png b/Models/Succubus/SuccubusTailLight.png new file mode 100644 index 000000000..60a6ba717 Binary files /dev/null and b/Models/Succubus/SuccubusTailLight.png differ diff --git a/Models/Succubus/SuccubusWingBack.png b/Models/Succubus/SuccubusWingBack.png new file mode 100644 index 000000000..43e9bcf46 Binary files /dev/null and b/Models/Succubus/SuccubusWingBack.png differ diff --git a/Models/Succubus/SuccubusWingBase.png b/Models/Succubus/SuccubusWingBase.png new file mode 100644 index 000000000..1d4e9a59b Binary files /dev/null and b/Models/Succubus/SuccubusWingBase.png differ diff --git a/Models/Succubus/SuccubusWingLight.png b/Models/Succubus/SuccubusWingLight.png new file mode 100644 index 000000000..ad8a9e2b3 Binary files /dev/null and b/Models/Succubus/SuccubusWingLight.png differ diff --git a/Models/Succubus/bac/SuccubusClawLeftFree.png b/Models/Succubus/bac/SuccubusClawLeftFree.png new file mode 100644 index 000000000..38660a8c9 Binary files /dev/null and b/Models/Succubus/bac/SuccubusClawLeftFree.png differ diff --git a/Models/Succubus/bac/SuccubusClawLeftFront.png b/Models/Succubus/bac/SuccubusClawLeftFront.png new file mode 100644 index 000000000..fd4d823f6 Binary files /dev/null and b/Models/Succubus/bac/SuccubusClawLeftFront.png differ diff --git a/Models/Succubus/bac/SuccubusClawLeftYoked.png b/Models/Succubus/bac/SuccubusClawLeftYoked.png new file mode 100644 index 000000000..a3ef10c9d Binary files /dev/null and b/Models/Succubus/bac/SuccubusClawLeftYoked.png differ diff --git a/Models/Succubus/bac/SuccubusClawRightFree.png b/Models/Succubus/bac/SuccubusClawRightFree.png new file mode 100644 index 000000000..b1c5e334c Binary files /dev/null and b/Models/Succubus/bac/SuccubusClawRightFree.png differ diff --git a/Models/Succubus/bac/SuccubusClawRightFront.png b/Models/Succubus/bac/SuccubusClawRightFront.png new file mode 100644 index 000000000..917e573d5 Binary files /dev/null and b/Models/Succubus/bac/SuccubusClawRightFront.png differ diff --git a/Models/Succubus/bac/SuccubusClawRightYoked.png b/Models/Succubus/bac/SuccubusClawRightYoked.png new file mode 100644 index 000000000..0b6a6e207 Binary files /dev/null and b/Models/Succubus/bac/SuccubusClawRightYoked.png differ diff --git a/Models/Swimsuit/ChestStrappyBoxtie.png b/Models/Swimsuit/ChestStrappyBoxtie.png new file mode 100644 index 000000000..bb3cc8606 Binary files /dev/null and b/Models/Swimsuit/ChestStrappyBoxtie.png differ diff --git a/Models/Swimsuit/ChestStrappyFree.png b/Models/Swimsuit/ChestStrappyFree.png new file mode 100644 index 000000000..f0f765ee8 Binary files /dev/null and b/Models/Swimsuit/ChestStrappyFree.png differ diff --git a/Models/Swimsuit/ChestStrappyUp.png b/Models/Swimsuit/ChestStrappyUp.png new file mode 100644 index 000000000..ee3ec0e45 Binary files /dev/null and b/Models/Swimsuit/ChestStrappyUp.png differ diff --git a/Models/Swimsuit/ChestStrappyWristtie.png b/Models/Swimsuit/ChestStrappyWristtie.png new file mode 100644 index 000000000..bb3cc8606 Binary files /dev/null and b/Models/Swimsuit/ChestStrappyWristtie.png differ diff --git a/Models/Swimsuit/ChestStrappyYoked.png b/Models/Swimsuit/ChestStrappyYoked.png new file mode 100644 index 000000000..bfa91ff26 Binary files /dev/null and b/Models/Swimsuit/ChestStrappyYoked.png differ diff --git a/Models/Swimsuit/Strappy.png b/Models/Swimsuit/Strappy.png new file mode 100644 index 000000000..bde452c88 Binary files /dev/null and b/Models/Swimsuit/Strappy.png differ diff --git a/Models/Swimsuit/StrappyLower.png b/Models/Swimsuit/StrappyLower.png new file mode 100644 index 000000000..6aa8ca24f Binary files /dev/null and b/Models/Swimsuit/StrappyLower.png differ diff --git a/Models/Swimsuit/StrappyLowerClosed.png b/Models/Swimsuit/StrappyLowerClosed.png new file mode 100644 index 000000000..c50c48c1b Binary files /dev/null and b/Models/Swimsuit/StrappyLowerClosed.png differ diff --git a/Models/Swimsuit/SwimsuitChestBoxtie.png b/Models/Swimsuit/SwimsuitChestBoxtie.png new file mode 100644 index 000000000..1a5c56294 Binary files /dev/null and b/Models/Swimsuit/SwimsuitChestBoxtie.png differ diff --git a/Models/Swimsuit/SwimsuitChestFree.png b/Models/Swimsuit/SwimsuitChestFree.png new file mode 100644 index 000000000..720c89e80 Binary files /dev/null and b/Models/Swimsuit/SwimsuitChestFree.png differ diff --git a/Models/Swimsuit/SwimsuitChestFront.png b/Models/Swimsuit/SwimsuitChestFront.png new file mode 100644 index 000000000..1a5c56294 Binary files /dev/null and b/Models/Swimsuit/SwimsuitChestFront.png differ diff --git a/Models/Swimsuit/SwimsuitChestUp.png b/Models/Swimsuit/SwimsuitChestUp.png new file mode 100644 index 000000000..1a5c56294 Binary files /dev/null and b/Models/Swimsuit/SwimsuitChestUp.png differ diff --git a/Models/Swimsuit/SwimsuitChestWristtie.png b/Models/Swimsuit/SwimsuitChestWristtie.png new file mode 100644 index 000000000..1a5c56294 Binary files /dev/null and b/Models/Swimsuit/SwimsuitChestWristtie.png differ diff --git a/Models/Swimsuit/SwimsuitChestYoked.png b/Models/Swimsuit/SwimsuitChestYoked.png new file mode 100644 index 000000000..dee18fa40 Binary files /dev/null and b/Models/Swimsuit/SwimsuitChestYoked.png differ diff --git a/Models/Swimsuit/SwimsuitClosed.png b/Models/Swimsuit/SwimsuitClosed.png new file mode 100644 index 000000000..2b760e1a7 Binary files /dev/null and b/Models/Swimsuit/SwimsuitClosed.png differ diff --git a/Models/Swimsuit/SwimsuitKneel.png b/Models/Swimsuit/SwimsuitKneel.png new file mode 100644 index 000000000..db114e33f Binary files /dev/null and b/Models/Swimsuit/SwimsuitKneel.png differ diff --git a/Models/Swimsuit/SwimsuitSpread.png b/Models/Swimsuit/SwimsuitSpread.png new file mode 100644 index 000000000..2e8d1e706 Binary files /dev/null and b/Models/Swimsuit/SwimsuitSpread.png differ diff --git a/Models/Swimsuit/VBikini.png b/Models/Swimsuit/VBikini.png new file mode 100644 index 000000000..085a1a63f Binary files /dev/null and b/Models/Swimsuit/VBikini.png differ diff --git a/Models/Swimsuit/VBikiniClosed.png b/Models/Swimsuit/VBikiniClosed.png new file mode 100644 index 000000000..c7f7933b4 Binary files /dev/null and b/Models/Swimsuit/VBikiniClosed.png differ diff --git a/Models/Tails/Fox.png b/Models/Tails/Fox.png new file mode 100644 index 000000000..1315d8132 Binary files /dev/null and b/Models/Tails/Fox.png differ diff --git a/Models/Tails/Fox2.png b/Models/Tails/Fox2.png new file mode 100644 index 000000000..79688362f Binary files /dev/null and b/Models/Tails/Fox2.png differ diff --git a/Models/Tails/Fox3.png b/Models/Tails/Fox3.png new file mode 100644 index 000000000..44c18fe79 Binary files /dev/null and b/Models/Tails/Fox3.png differ diff --git a/Models/Tails/Fox4.png b/Models/Tails/Fox4.png new file mode 100644 index 000000000..4a02af248 Binary files /dev/null and b/Models/Tails/Fox4.png differ diff --git a/Models/Tails/Fox5.png b/Models/Tails/Fox5.png new file mode 100644 index 000000000..56421b56b Binary files /dev/null and b/Models/Tails/Fox5.png differ diff --git a/Models/Tails/Fox6.png b/Models/Tails/Fox6.png new file mode 100644 index 000000000..94ae26bcf Binary files /dev/null and b/Models/Tails/Fox6.png differ diff --git a/Models/Tails/Fox7.png b/Models/Tails/Fox7.png new file mode 100644 index 000000000..8a901e4da Binary files /dev/null and b/Models/Tails/Fox7.png differ diff --git a/Models/Tails/Kitty.png b/Models/Tails/Kitty.png new file mode 100644 index 000000000..22450d1e6 Binary files /dev/null and b/Models/Tails/Kitty.png differ diff --git a/Models/Tails/Kitty2.png b/Models/Tails/Kitty2.png new file mode 100644 index 000000000..5d7d2a407 Binary files /dev/null and b/Models/Tails/Kitty2.png differ diff --git a/Models/Tails/Wolf.png b/Models/Tails/Wolf.png new file mode 100644 index 000000000..478f30d24 Binary files /dev/null and b/Models/Tails/Wolf.png differ diff --git a/Models/TallBallet/TallLeftClosed.png b/Models/TallBallet/TallLeftClosed.png new file mode 100644 index 000000000..87cb3dbaa Binary files /dev/null and b/Models/TallBallet/TallLeftClosed.png differ diff --git a/Models/TallBallet/TallLeftHogtie.png b/Models/TallBallet/TallLeftHogtie.png new file mode 100644 index 000000000..42c5a2e34 Binary files /dev/null and b/Models/TallBallet/TallLeftHogtie.png differ diff --git a/Models/TallBallet/TallLeftKneel.png b/Models/TallBallet/TallLeftKneel.png new file mode 100644 index 000000000..b8c901001 Binary files /dev/null and b/Models/TallBallet/TallLeftKneel.png differ diff --git a/Models/TallBallet/TallLeftKneelClosed.png b/Models/TallBallet/TallLeftKneelClosed.png new file mode 100644 index 000000000..23b711a16 Binary files /dev/null and b/Models/TallBallet/TallLeftKneelClosed.png differ diff --git a/Models/TallBallet/TallLeftSpread.png b/Models/TallBallet/TallLeftSpread.png new file mode 100644 index 000000000..76f2cf181 Binary files /dev/null and b/Models/TallBallet/TallLeftSpread.png differ diff --git a/Models/TallBallet/TallLegLeftHogtie.png b/Models/TallBallet/TallLegLeftHogtie.png new file mode 100644 index 000000000..a26211eea Binary files /dev/null and b/Models/TallBallet/TallLegLeftHogtie.png differ diff --git a/Models/TallBallet/TallLegLeftKneel.png b/Models/TallBallet/TallLegLeftKneel.png new file mode 100644 index 000000000..1d3e0f7bd Binary files /dev/null and b/Models/TallBallet/TallLegLeftKneel.png differ diff --git a/Models/TallBallet/TallLegLeftKneelClosed.png b/Models/TallBallet/TallLegLeftKneelClosed.png new file mode 100644 index 000000000..18d52aa73 Binary files /dev/null and b/Models/TallBallet/TallLegLeftKneelClosed.png differ diff --git a/Models/TallBallet/TallLegRightHogtie.png b/Models/TallBallet/TallLegRightHogtie.png new file mode 100644 index 000000000..6d76a627a Binary files /dev/null and b/Models/TallBallet/TallLegRightHogtie.png differ diff --git a/Models/TallBallet/TallLegRightKneel.png b/Models/TallBallet/TallLegRightKneel.png new file mode 100644 index 000000000..0642fea7f Binary files /dev/null and b/Models/TallBallet/TallLegRightKneel.png differ diff --git a/Models/TallBallet/TallLegRightKneelClosed.png b/Models/TallBallet/TallLegRightKneelClosed.png new file mode 100644 index 000000000..0916a12ff Binary files /dev/null and b/Models/TallBallet/TallLegRightKneelClosed.png differ diff --git a/Models/TallBallet/TallRightClosed.png b/Models/TallBallet/TallRightClosed.png new file mode 100644 index 000000000..95ba7a577 Binary files /dev/null and b/Models/TallBallet/TallRightClosed.png differ diff --git a/Models/TallBallet/TallRightKneel.png b/Models/TallBallet/TallRightKneel.png new file mode 100644 index 000000000..11b341e54 Binary files /dev/null and b/Models/TallBallet/TallRightKneel.png differ diff --git a/Models/TallBallet/TallRightSpread.png b/Models/TallBallet/TallRightSpread.png new file mode 100644 index 000000000..8e47232b7 Binary files /dev/null and b/Models/TallBallet/TallRightSpread.png differ diff --git a/Models/TallSmoothHeels/TallLeftClosed.png b/Models/TallSmoothHeels/TallLeftClosed.png new file mode 100644 index 000000000..3dcf7eca8 Binary files /dev/null and b/Models/TallSmoothHeels/TallLeftClosed.png differ diff --git a/Models/TallSmoothHeels/TallLeftHogtie.png b/Models/TallSmoothHeels/TallLeftHogtie.png new file mode 100644 index 000000000..945ff6245 Binary files /dev/null and b/Models/TallSmoothHeels/TallLeftHogtie.png differ diff --git a/Models/TallSmoothHeels/TallLeftKneel.png b/Models/TallSmoothHeels/TallLeftKneel.png new file mode 100644 index 000000000..16dedf111 Binary files /dev/null and b/Models/TallSmoothHeels/TallLeftKneel.png differ diff --git a/Models/TallSmoothHeels/TallLeftKneelClosed.png b/Models/TallSmoothHeels/TallLeftKneelClosed.png new file mode 100644 index 000000000..139b3db09 Binary files /dev/null and b/Models/TallSmoothHeels/TallLeftKneelClosed.png differ diff --git a/Models/TallSmoothHeels/TallLeftSpread.png b/Models/TallSmoothHeels/TallLeftSpread.png new file mode 100644 index 000000000..05691e2dc Binary files /dev/null and b/Models/TallSmoothHeels/TallLeftSpread.png differ diff --git a/Models/TallSmoothHeels/TallLegLeftHogtie.png b/Models/TallSmoothHeels/TallLegLeftHogtie.png new file mode 100644 index 000000000..a4d041b18 Binary files /dev/null and b/Models/TallSmoothHeels/TallLegLeftHogtie.png differ diff --git a/Models/TallSmoothHeels/TallLegLeftKneel.png b/Models/TallSmoothHeels/TallLegLeftKneel.png new file mode 100644 index 000000000..90bfa572b Binary files /dev/null and b/Models/TallSmoothHeels/TallLegLeftKneel.png differ diff --git a/Models/TallSmoothHeels/TallLegLeftKneelClosed.png b/Models/TallSmoothHeels/TallLegLeftKneelClosed.png new file mode 100644 index 000000000..a61285a2e Binary files /dev/null and b/Models/TallSmoothHeels/TallLegLeftKneelClosed.png differ diff --git a/Models/TallSmoothHeels/TallLegRightHogtie.png b/Models/TallSmoothHeels/TallLegRightHogtie.png new file mode 100644 index 000000000..d91d2c5d2 Binary files /dev/null and b/Models/TallSmoothHeels/TallLegRightHogtie.png differ diff --git a/Models/TallSmoothHeels/TallLegRightKneel.png b/Models/TallSmoothHeels/TallLegRightKneel.png new file mode 100644 index 000000000..d909709fc Binary files /dev/null and b/Models/TallSmoothHeels/TallLegRightKneel.png differ diff --git a/Models/TallSmoothHeels/TallLegRightKneelClosed.png b/Models/TallSmoothHeels/TallLegRightKneelClosed.png new file mode 100644 index 000000000..d89753a39 Binary files /dev/null and b/Models/TallSmoothHeels/TallLegRightKneelClosed.png differ diff --git a/Models/TallSmoothHeels/TallRightClosed.png b/Models/TallSmoothHeels/TallRightClosed.png new file mode 100644 index 000000000..678666a33 Binary files /dev/null and b/Models/TallSmoothHeels/TallRightClosed.png differ diff --git a/Models/TallSmoothHeels/TallRightHogtie.png b/Models/TallSmoothHeels/TallRightHogtie.png new file mode 100644 index 000000000..b4559e9af Binary files /dev/null and b/Models/TallSmoothHeels/TallRightHogtie.png differ diff --git a/Models/TallSmoothHeels/TallRightKneel.png b/Models/TallSmoothHeels/TallRightKneel.png new file mode 100644 index 000000000..f95e4de29 Binary files /dev/null and b/Models/TallSmoothHeels/TallRightKneel.png differ diff --git a/Models/TallSmoothHeels/TallRightSpread.png b/Models/TallSmoothHeels/TallRightSpread.png new file mode 100644 index 000000000..734e41293 Binary files /dev/null and b/Models/TallSmoothHeels/TallRightSpread.png differ diff --git a/Models/TapeHeavy/AnklesClosed.png b/Models/TapeHeavy/AnklesClosed.png new file mode 100644 index 000000000..66f11b7a5 Binary files /dev/null and b/Models/TapeHeavy/AnklesClosed.png differ diff --git a/Models/TapeHeavy/AnklesHogtie.png b/Models/TapeHeavy/AnklesHogtie.png new file mode 100644 index 000000000..06f7cb41f Binary files /dev/null and b/Models/TapeHeavy/AnklesHogtie.png differ diff --git a/Models/TapeHeavy/AnklesKneelClosed.png b/Models/TapeHeavy/AnklesKneelClosed.png new file mode 100644 index 000000000..4d4cd7e78 Binary files /dev/null and b/Models/TapeHeavy/AnklesKneelClosed.png differ diff --git a/Models/TapeHeavy/ArmFullLeftBoxtie.png b/Models/TapeHeavy/ArmFullLeftBoxtie.png new file mode 100644 index 000000000..da3470e07 Binary files /dev/null and b/Models/TapeHeavy/ArmFullLeftBoxtie.png differ diff --git a/Models/TapeHeavy/ArmFullLeftCrossed.png b/Models/TapeHeavy/ArmFullLeftCrossed.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeHeavy/ArmFullLeftCrossed.png differ diff --git a/Models/TapeHeavy/ArmFullLeftWristtie.png b/Models/TapeHeavy/ArmFullLeftWristtie.png new file mode 100644 index 000000000..1ac4162a3 Binary files /dev/null and b/Models/TapeHeavy/ArmFullLeftWristtie.png differ diff --git a/Models/TapeHeavy/ArmFullRightBoxtie.png b/Models/TapeHeavy/ArmFullRightBoxtie.png new file mode 100644 index 000000000..32541d126 Binary files /dev/null and b/Models/TapeHeavy/ArmFullRightBoxtie.png differ diff --git a/Models/TapeHeavy/ArmFullRightCrossed.png b/Models/TapeHeavy/ArmFullRightCrossed.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeHeavy/ArmFullRightCrossed.png differ diff --git a/Models/TapeHeavy/ArmFullRightWristtie.png b/Models/TapeHeavy/ArmFullRightWristtie.png new file mode 100644 index 000000000..cce19c38a Binary files /dev/null and b/Models/TapeHeavy/ArmFullRightWristtie.png differ diff --git a/Models/TapeHeavy/ArmLeftBoxtie.png b/Models/TapeHeavy/ArmLeftBoxtie.png new file mode 100644 index 000000000..c19187a28 Binary files /dev/null and b/Models/TapeHeavy/ArmLeftBoxtie.png differ diff --git a/Models/TapeHeavy/ArmLeftCrossed.png b/Models/TapeHeavy/ArmLeftCrossed.png new file mode 100644 index 000000000..9cc76900f Binary files /dev/null and b/Models/TapeHeavy/ArmLeftCrossed.png differ diff --git a/Models/TapeHeavy/ArmLeftWristtie.png b/Models/TapeHeavy/ArmLeftWristtie.png new file mode 100644 index 000000000..fc0ac1522 Binary files /dev/null and b/Models/TapeHeavy/ArmLeftWristtie.png differ diff --git a/Models/TapeHeavy/ArmRightBoxtie.png b/Models/TapeHeavy/ArmRightBoxtie.png new file mode 100644 index 000000000..7a5ce4ee7 Binary files /dev/null and b/Models/TapeHeavy/ArmRightBoxtie.png differ diff --git a/Models/TapeHeavy/ArmRightCrossed.png b/Models/TapeHeavy/ArmRightCrossed.png new file mode 100644 index 000000000..b0c821157 Binary files /dev/null and b/Models/TapeHeavy/ArmRightCrossed.png differ diff --git a/Models/TapeHeavy/ArmRightWristtie.png b/Models/TapeHeavy/ArmRightWristtie.png new file mode 100644 index 000000000..727d72c1a Binary files /dev/null and b/Models/TapeHeavy/ArmRightWristtie.png differ diff --git a/Models/TapeHeavy/BottomClosed.png b/Models/TapeHeavy/BottomClosed.png new file mode 100644 index 000000000..3e7e6b7a8 Binary files /dev/null and b/Models/TapeHeavy/BottomClosed.png differ diff --git a/Models/TapeHeavy/BottomHogtie.png b/Models/TapeHeavy/BottomHogtie.png new file mode 100644 index 000000000..3e7e6b7a8 Binary files /dev/null and b/Models/TapeHeavy/BottomHogtie.png differ diff --git a/Models/TapeHeavy/BottomKneel.png b/Models/TapeHeavy/BottomKneel.png new file mode 100644 index 000000000..4e09bee1a Binary files /dev/null and b/Models/TapeHeavy/BottomKneel.png differ diff --git a/Models/TapeHeavy/BottomKneelClosed.png b/Models/TapeHeavy/BottomKneelClosed.png new file mode 100644 index 000000000..ba0e52d8f Binary files /dev/null and b/Models/TapeHeavy/BottomKneelClosed.png differ diff --git a/Models/TapeHeavy/Chest.png b/Models/TapeHeavy/Chest.png new file mode 100644 index 000000000..44e23a02a Binary files /dev/null and b/Models/TapeHeavy/Chest.png differ diff --git a/Models/TapeHeavy/ChestBoxtie.png b/Models/TapeHeavy/ChestBoxtie.png new file mode 100644 index 000000000..44e23a02a Binary files /dev/null and b/Models/TapeHeavy/ChestBoxtie.png differ diff --git a/Models/TapeHeavy/ChestCrossed.png b/Models/TapeHeavy/ChestCrossed.png new file mode 100644 index 000000000..44e23a02a Binary files /dev/null and b/Models/TapeHeavy/ChestCrossed.png differ diff --git a/Models/TapeHeavy/ChestPetsuit.png b/Models/TapeHeavy/ChestPetsuit.png new file mode 100644 index 000000000..8445ef25f Binary files /dev/null and b/Models/TapeHeavy/ChestPetsuit.png differ diff --git a/Models/TapeHeavy/ChestStrap.png b/Models/TapeHeavy/ChestStrap.png new file mode 100644 index 000000000..974a889d3 Binary files /dev/null and b/Models/TapeHeavy/ChestStrap.png differ diff --git a/Models/TapeHeavy/ChestWristtie.png b/Models/TapeHeavy/ChestWristtie.png new file mode 100644 index 000000000..44e23a02a Binary files /dev/null and b/Models/TapeHeavy/ChestWristtie.png differ diff --git a/Models/TapeHeavy/Collar.png b/Models/TapeHeavy/Collar.png new file mode 100644 index 000000000..eb3d3f15b Binary files /dev/null and b/Models/TapeHeavy/Collar.png differ diff --git a/Models/TapeHeavy/FeetClosed.png b/Models/TapeHeavy/FeetClosed.png new file mode 100644 index 000000000..605e5f854 Binary files /dev/null and b/Models/TapeHeavy/FeetClosed.png differ diff --git a/Models/TapeHeavy/FeetHogtie.png b/Models/TapeHeavy/FeetHogtie.png new file mode 100644 index 000000000..99a3c6466 Binary files /dev/null and b/Models/TapeHeavy/FeetHogtie.png differ diff --git a/Models/TapeHeavy/FeetKneel.png b/Models/TapeHeavy/FeetKneel.png new file mode 100644 index 000000000..ed7c9458f Binary files /dev/null and b/Models/TapeHeavy/FeetKneel.png differ diff --git a/Models/TapeHeavy/HandLeftFree.png b/Models/TapeHeavy/HandLeftFree.png new file mode 100644 index 000000000..ca34fbc68 Binary files /dev/null and b/Models/TapeHeavy/HandLeftFree.png differ diff --git a/Models/TapeHeavy/HandLeftFront.png b/Models/TapeHeavy/HandLeftFront.png new file mode 100644 index 000000000..dddc35bab Binary files /dev/null and b/Models/TapeHeavy/HandLeftFront.png differ diff --git a/Models/TapeHeavy/HandLeftYoked.png b/Models/TapeHeavy/HandLeftYoked.png new file mode 100644 index 000000000..36d41d62c Binary files /dev/null and b/Models/TapeHeavy/HandLeftYoked.png differ diff --git a/Models/TapeHeavy/HandRightBoxtie.png b/Models/TapeHeavy/HandRightBoxtie.png new file mode 100644 index 000000000..3056a70c5 Binary files /dev/null and b/Models/TapeHeavy/HandRightBoxtie.png differ diff --git a/Models/TapeHeavy/HandRightFree.png b/Models/TapeHeavy/HandRightFree.png new file mode 100644 index 000000000..c40392375 Binary files /dev/null and b/Models/TapeHeavy/HandRightFree.png differ diff --git a/Models/TapeHeavy/HandRightFront.png b/Models/TapeHeavy/HandRightFront.png new file mode 100644 index 000000000..71c8dab66 Binary files /dev/null and b/Models/TapeHeavy/HandRightFront.png differ diff --git a/Models/TapeHeavy/HandRightYoked.png b/Models/TapeHeavy/HandRightYoked.png new file mode 100644 index 000000000..c9915947a Binary files /dev/null and b/Models/TapeHeavy/HandRightYoked.png differ diff --git a/Models/TapeHeavy/LegsClosed.png b/Models/TapeHeavy/LegsClosed.png new file mode 100644 index 000000000..198fb3de7 Binary files /dev/null and b/Models/TapeHeavy/LegsClosed.png differ diff --git a/Models/TapeHeavy/LegsHogtie.png b/Models/TapeHeavy/LegsHogtie.png new file mode 100644 index 000000000..1aa9f0f62 Binary files /dev/null and b/Models/TapeHeavy/LegsHogtie.png differ diff --git a/Models/TapeHeavy/LegsKneel.png b/Models/TapeHeavy/LegsKneel.png new file mode 100644 index 000000000..d22765dcf Binary files /dev/null and b/Models/TapeHeavy/LegsKneel.png differ diff --git a/Models/TapeHeavy/LegsKneelClosed.png b/Models/TapeHeavy/LegsKneelClosed.png new file mode 100644 index 000000000..bb0248cc1 Binary files /dev/null and b/Models/TapeHeavy/LegsKneelClosed.png differ diff --git a/Models/TapeHeavy/PetsuitTopArms.png b/Models/TapeHeavy/PetsuitTopArms.png new file mode 100644 index 000000000..43c72740f Binary files /dev/null and b/Models/TapeHeavy/PetsuitTopArms.png differ diff --git a/Models/TapeHeavy/PetsuitTopBody.png b/Models/TapeHeavy/PetsuitTopBody.png new file mode 100644 index 000000000..b34742959 Binary files /dev/null and b/Models/TapeHeavy/PetsuitTopBody.png differ diff --git a/Models/TapeHeavy/PetsuitTopHands.png b/Models/TapeHeavy/PetsuitTopHands.png new file mode 100644 index 000000000..1042df0e4 Binary files /dev/null and b/Models/TapeHeavy/PetsuitTopHands.png differ diff --git a/Models/TapeHeavy/PetsuitTopTapedHands.png b/Models/TapeHeavy/PetsuitTopTapedHands.png new file mode 100644 index 000000000..f380d2345 Binary files /dev/null and b/Models/TapeHeavy/PetsuitTopTapedHands.png differ diff --git a/Models/TapeHeavy/RightLegsClosed.png b/Models/TapeHeavy/RightLegsClosed.png new file mode 100644 index 000000000..9cd44187c Binary files /dev/null and b/Models/TapeHeavy/RightLegsClosed.png differ diff --git a/Models/TapeHeavy/RightLegsHogtie.png b/Models/TapeHeavy/RightLegsHogtie.png new file mode 100644 index 000000000..42ecfab5d Binary files /dev/null and b/Models/TapeHeavy/RightLegsHogtie.png differ diff --git a/Models/TapeHeavy/RightLegsKneel.png b/Models/TapeHeavy/RightLegsKneel.png new file mode 100644 index 000000000..4e23368f4 Binary files /dev/null and b/Models/TapeHeavy/RightLegsKneel.png differ diff --git a/Models/TapeHeavy/RightLegsKneelClosed.png b/Models/TapeHeavy/RightLegsKneelClosed.png new file mode 100644 index 000000000..de941fecc Binary files /dev/null and b/Models/TapeHeavy/RightLegsKneelClosed.png differ diff --git a/Models/TapeHeavy/StrapCover.png b/Models/TapeHeavy/StrapCover.png new file mode 100644 index 000000000..8375f0218 Binary files /dev/null and b/Models/TapeHeavy/StrapCover.png differ diff --git a/Models/TapeHeavy/TopBoxtie.png b/Models/TapeHeavy/TopBoxtie.png new file mode 100644 index 000000000..baf7a0e47 Binary files /dev/null and b/Models/TapeHeavy/TopBoxtie.png differ diff --git a/Models/TapeHeavy/TopCrossed.png b/Models/TapeHeavy/TopCrossed.png new file mode 100644 index 000000000..434abfdbe Binary files /dev/null and b/Models/TapeHeavy/TopCrossed.png differ diff --git a/Models/TapeHeavy/TopFullBoxtie.png b/Models/TapeHeavy/TopFullBoxtie.png new file mode 100644 index 000000000..4f7fabd1d Binary files /dev/null and b/Models/TapeHeavy/TopFullBoxtie.png differ diff --git a/Models/TapeHeavy/TopFullCrossed.png b/Models/TapeHeavy/TopFullCrossed.png new file mode 100644 index 000000000..121d74fcc Binary files /dev/null and b/Models/TapeHeavy/TopFullCrossed.png differ diff --git a/Models/TapeHeavy/TopFullWristtie.png b/Models/TapeHeavy/TopFullWristtie.png new file mode 100644 index 000000000..e963b56a1 Binary files /dev/null and b/Models/TapeHeavy/TopFullWristtie.png differ diff --git a/Models/TapeHeavy/TopWristtie.png b/Models/TapeHeavy/TopWristtie.png new file mode 100644 index 000000000..c850a142a Binary files /dev/null and b/Models/TapeHeavy/TopWristtie.png differ diff --git a/Models/TapeLight/AnklesClosed.png b/Models/TapeLight/AnklesClosed.png new file mode 100644 index 000000000..31c561bf2 Binary files /dev/null and b/Models/TapeLight/AnklesClosed.png differ diff --git a/Models/TapeLight/AnklesHogtie.png b/Models/TapeLight/AnklesHogtie.png new file mode 100644 index 000000000..09e756d81 Binary files /dev/null and b/Models/TapeLight/AnklesHogtie.png differ diff --git a/Models/TapeLight/AnklesKneelClosed.png b/Models/TapeLight/AnklesKneelClosed.png new file mode 100644 index 000000000..f8ea28065 Binary files /dev/null and b/Models/TapeLight/AnklesKneelClosed.png differ diff --git a/Models/TapeLight/ArmLeftBoxtie.png b/Models/TapeLight/ArmLeftBoxtie.png new file mode 100644 index 000000000..32f355b02 Binary files /dev/null and b/Models/TapeLight/ArmLeftBoxtie.png differ diff --git a/Models/TapeLight/ArmLeftCrossed.png b/Models/TapeLight/ArmLeftCrossed.png new file mode 100644 index 000000000..9cc76900f Binary files /dev/null and b/Models/TapeLight/ArmLeftCrossed.png differ diff --git a/Models/TapeLight/ArmLeftWristtie.png b/Models/TapeLight/ArmLeftWristtie.png new file mode 100644 index 000000000..5e6a578e8 Binary files /dev/null and b/Models/TapeLight/ArmLeftWristtie.png differ diff --git a/Models/TapeLight/ArmRightBoxtie.png b/Models/TapeLight/ArmRightBoxtie.png new file mode 100644 index 000000000..0f56a8004 Binary files /dev/null and b/Models/TapeLight/ArmRightBoxtie.png differ diff --git a/Models/TapeLight/ArmRightCrossed.png b/Models/TapeLight/ArmRightCrossed.png new file mode 100644 index 000000000..b0c821157 Binary files /dev/null and b/Models/TapeLight/ArmRightCrossed.png differ diff --git a/Models/TapeLight/ArmRightWristtie.png b/Models/TapeLight/ArmRightWristtie.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeLight/ArmRightWristtie.png differ diff --git a/Models/TapeLight/ArmStrapLeftBoxtie.png b/Models/TapeLight/ArmStrapLeftBoxtie.png new file mode 100644 index 000000000..5e55bd077 Binary files /dev/null and b/Models/TapeLight/ArmStrapLeftBoxtie.png differ diff --git a/Models/TapeLight/ArmStrapLeftCrossed.png b/Models/TapeLight/ArmStrapLeftCrossed.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeLight/ArmStrapLeftCrossed.png differ diff --git a/Models/TapeLight/ArmStrapLeftWristtie.png b/Models/TapeLight/ArmStrapLeftWristtie.png new file mode 100644 index 000000000..60d7a2339 Binary files /dev/null and b/Models/TapeLight/ArmStrapLeftWristtie.png differ diff --git a/Models/TapeLight/ArmStrapRightBoxtie.png b/Models/TapeLight/ArmStrapRightBoxtie.png new file mode 100644 index 000000000..ae50b9433 Binary files /dev/null and b/Models/TapeLight/ArmStrapRightBoxtie.png differ diff --git a/Models/TapeLight/ArmStrapRightCrossed.png b/Models/TapeLight/ArmStrapRightCrossed.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeLight/ArmStrapRightCrossed.png differ diff --git a/Models/TapeLight/ArmStrapRightWristtie.png b/Models/TapeLight/ArmStrapRightWristtie.png new file mode 100644 index 000000000..d0052caf3 Binary files /dev/null and b/Models/TapeLight/ArmStrapRightWristtie.png differ diff --git a/Models/TapeLight/BottomClosed.png b/Models/TapeLight/BottomClosed.png new file mode 100644 index 000000000..f028517e9 Binary files /dev/null and b/Models/TapeLight/BottomClosed.png differ diff --git a/Models/TapeLight/BottomHogtie.png b/Models/TapeLight/BottomHogtie.png new file mode 100644 index 000000000..f028517e9 Binary files /dev/null and b/Models/TapeLight/BottomHogtie.png differ diff --git a/Models/TapeLight/BottomKneel.png b/Models/TapeLight/BottomKneel.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeLight/BottomKneel.png differ diff --git a/Models/TapeLight/BottomKneelClosed.png b/Models/TapeLight/BottomKneelClosed.png new file mode 100644 index 000000000..2072366cb Binary files /dev/null and b/Models/TapeLight/BottomKneelClosed.png differ diff --git a/Models/TapeLight/Chest.png b/Models/TapeLight/Chest.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeLight/Chest.png differ diff --git a/Models/TapeLight/ChestPetsuit.png b/Models/TapeLight/ChestPetsuit.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeLight/ChestPetsuit.png differ diff --git a/Models/TapeLight/ChestStrap.png b/Models/TapeLight/ChestStrap.png new file mode 100644 index 000000000..974a889d3 Binary files /dev/null and b/Models/TapeLight/ChestStrap.png differ diff --git a/Models/TapeLight/FeetClosed.png b/Models/TapeLight/FeetClosed.png new file mode 100644 index 000000000..5ca2dba4e Binary files /dev/null and b/Models/TapeLight/FeetClosed.png differ diff --git a/Models/TapeLight/FeetKneel.png b/Models/TapeLight/FeetKneel.png new file mode 100644 index 000000000..1688a573c Binary files /dev/null and b/Models/TapeLight/FeetKneel.png differ diff --git a/Models/TapeLight/HandLeftFree.png b/Models/TapeLight/HandLeftFree.png new file mode 100644 index 000000000..54b7f9af1 Binary files /dev/null and b/Models/TapeLight/HandLeftFree.png differ diff --git a/Models/TapeLight/HandLeftFront.png b/Models/TapeLight/HandLeftFront.png new file mode 100644 index 000000000..a44ad7993 Binary files /dev/null and b/Models/TapeLight/HandLeftFront.png differ diff --git a/Models/TapeLight/HandLeftYoked.png b/Models/TapeLight/HandLeftYoked.png new file mode 100644 index 000000000..d9df3b707 Binary files /dev/null and b/Models/TapeLight/HandLeftYoked.png differ diff --git a/Models/TapeLight/HandRightBoxtie.png b/Models/TapeLight/HandRightBoxtie.png new file mode 100644 index 000000000..c4bb6d0c9 Binary files /dev/null and b/Models/TapeLight/HandRightBoxtie.png differ diff --git a/Models/TapeLight/HandRightFree.png b/Models/TapeLight/HandRightFree.png new file mode 100644 index 000000000..2d26c0059 Binary files /dev/null and b/Models/TapeLight/HandRightFree.png differ diff --git a/Models/TapeLight/HandRightFront.png b/Models/TapeLight/HandRightFront.png new file mode 100644 index 000000000..43f6fdb59 Binary files /dev/null and b/Models/TapeLight/HandRightFront.png differ diff --git a/Models/TapeLight/HandRightYoked.png b/Models/TapeLight/HandRightYoked.png new file mode 100644 index 000000000..0595e5e41 Binary files /dev/null and b/Models/TapeLight/HandRightYoked.png differ diff --git a/Models/TapeLight/LegsClosed.png b/Models/TapeLight/LegsClosed.png new file mode 100644 index 000000000..9b545694d Binary files /dev/null and b/Models/TapeLight/LegsClosed.png differ diff --git a/Models/TapeLight/LegsHogtie.png b/Models/TapeLight/LegsHogtie.png new file mode 100644 index 000000000..1d9b766aa Binary files /dev/null and b/Models/TapeLight/LegsHogtie.png differ diff --git a/Models/TapeLight/LegsKneel.png b/Models/TapeLight/LegsKneel.png new file mode 100644 index 000000000..d3b8f668b Binary files /dev/null and b/Models/TapeLight/LegsKneel.png differ diff --git a/Models/TapeLight/LegsKneelClosed.png b/Models/TapeLight/LegsKneelClosed.png new file mode 100644 index 000000000..a7b95be62 Binary files /dev/null and b/Models/TapeLight/LegsKneelClosed.png differ diff --git a/Models/TapeLight/PetsuitTopArms.png b/Models/TapeLight/PetsuitTopArms.png new file mode 100644 index 000000000..4586c7a76 Binary files /dev/null and b/Models/TapeLight/PetsuitTopArms.png differ diff --git a/Models/TapeLight/PetsuitTopBody.png b/Models/TapeLight/PetsuitTopBody.png new file mode 100644 index 000000000..8bc10bb54 Binary files /dev/null and b/Models/TapeLight/PetsuitTopBody.png differ diff --git a/Models/TapeLight/PetsuitTopHands.png b/Models/TapeLight/PetsuitTopHands.png new file mode 100644 index 000000000..1042df0e4 Binary files /dev/null and b/Models/TapeLight/PetsuitTopHands.png differ diff --git a/Models/TapeLight/PetsuitTopTapedHands.png b/Models/TapeLight/PetsuitTopTapedHands.png new file mode 100644 index 000000000..3967d494b Binary files /dev/null and b/Models/TapeLight/PetsuitTopTapedHands.png differ diff --git a/Models/TapeLight/RightLegsClosed.png b/Models/TapeLight/RightLegsClosed.png new file mode 100644 index 000000000..e606c2154 Binary files /dev/null and b/Models/TapeLight/RightLegsClosed.png differ diff --git a/Models/TapeLight/RightLegsHogtie.png b/Models/TapeLight/RightLegsHogtie.png new file mode 100644 index 000000000..e606c2154 Binary files /dev/null and b/Models/TapeLight/RightLegsHogtie.png differ diff --git a/Models/TapeLight/RightLegsKneel.png b/Models/TapeLight/RightLegsKneel.png new file mode 100644 index 000000000..9466e7176 Binary files /dev/null and b/Models/TapeLight/RightLegsKneel.png differ diff --git a/Models/TapeLight/RightLegsKneelClosed.png b/Models/TapeLight/RightLegsKneelClosed.png new file mode 100644 index 000000000..0715fb0f1 Binary files /dev/null and b/Models/TapeLight/RightLegsKneelClosed.png differ diff --git a/Models/TapeLight/StrapCover.png b/Models/TapeLight/StrapCover.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeLight/StrapCover.png differ diff --git a/Models/TapeLight/TopBoxtie.png b/Models/TapeLight/TopBoxtie.png new file mode 100644 index 000000000..3b428f08c Binary files /dev/null and b/Models/TapeLight/TopBoxtie.png differ diff --git a/Models/TapeLight/TopCrossed.png b/Models/TapeLight/TopCrossed.png new file mode 100644 index 000000000..bdd9ad561 Binary files /dev/null and b/Models/TapeLight/TopCrossed.png differ diff --git a/Models/TapeLight/TopWristtie.png b/Models/TapeLight/TopWristtie.png new file mode 100644 index 000000000..b50074306 Binary files /dev/null and b/Models/TapeLight/TopWristtie.png differ diff --git a/Models/TapeMed/AnklesClosed.png b/Models/TapeMed/AnklesClosed.png new file mode 100644 index 000000000..2b2589b5a Binary files /dev/null and b/Models/TapeMed/AnklesClosed.png differ diff --git a/Models/TapeMed/AnklesHogtie.png b/Models/TapeMed/AnklesHogtie.png new file mode 100644 index 000000000..7aba76642 Binary files /dev/null and b/Models/TapeMed/AnklesHogtie.png differ diff --git a/Models/TapeMed/AnklesKneelClosed.png b/Models/TapeMed/AnklesKneelClosed.png new file mode 100644 index 000000000..5e55eb3a1 Binary files /dev/null and b/Models/TapeMed/AnklesKneelClosed.png differ diff --git a/Models/TapeMed/ArmFullLeftBoxtie.png b/Models/TapeMed/ArmFullLeftBoxtie.png new file mode 100644 index 000000000..da3470e07 Binary files /dev/null and b/Models/TapeMed/ArmFullLeftBoxtie.png differ diff --git a/Models/TapeMed/ArmFullLeftCrossed.png b/Models/TapeMed/ArmFullLeftCrossed.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeMed/ArmFullLeftCrossed.png differ diff --git a/Models/TapeMed/ArmFullLeftWristtie.png b/Models/TapeMed/ArmFullLeftWristtie.png new file mode 100644 index 000000000..1ac4162a3 Binary files /dev/null and b/Models/TapeMed/ArmFullLeftWristtie.png differ diff --git a/Models/TapeMed/ArmFullRightBoxtie.png b/Models/TapeMed/ArmFullRightBoxtie.png new file mode 100644 index 000000000..32541d126 Binary files /dev/null and b/Models/TapeMed/ArmFullRightBoxtie.png differ diff --git a/Models/TapeMed/ArmFullRightCrossed.png b/Models/TapeMed/ArmFullRightCrossed.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeMed/ArmFullRightCrossed.png differ diff --git a/Models/TapeMed/ArmFullRightWristtie.png b/Models/TapeMed/ArmFullRightWristtie.png new file mode 100644 index 000000000..cce19c38a Binary files /dev/null and b/Models/TapeMed/ArmFullRightWristtie.png differ diff --git a/Models/TapeMed/ArmLeftBoxtie.png b/Models/TapeMed/ArmLeftBoxtie.png new file mode 100644 index 000000000..82f09a8b1 Binary files /dev/null and b/Models/TapeMed/ArmLeftBoxtie.png differ diff --git a/Models/TapeMed/ArmLeftCrossed.png b/Models/TapeMed/ArmLeftCrossed.png new file mode 100644 index 000000000..9cc76900f Binary files /dev/null and b/Models/TapeMed/ArmLeftCrossed.png differ diff --git a/Models/TapeMed/ArmLeftWristtie.png b/Models/TapeMed/ArmLeftWristtie.png new file mode 100644 index 000000000..5b17a246c Binary files /dev/null and b/Models/TapeMed/ArmLeftWristtie.png differ diff --git a/Models/TapeMed/ArmRightBoxtie.png b/Models/TapeMed/ArmRightBoxtie.png new file mode 100644 index 000000000..f35fd49ae Binary files /dev/null and b/Models/TapeMed/ArmRightBoxtie.png differ diff --git a/Models/TapeMed/ArmRightCrossed.png b/Models/TapeMed/ArmRightCrossed.png new file mode 100644 index 000000000..b0c821157 Binary files /dev/null and b/Models/TapeMed/ArmRightCrossed.png differ diff --git a/Models/TapeMed/ArmRightWristtie.png b/Models/TapeMed/ArmRightWristtie.png new file mode 100644 index 000000000..ac6262e68 Binary files /dev/null and b/Models/TapeMed/ArmRightWristtie.png differ diff --git a/Models/TapeMed/ArmStrapLeftBoxtie.png b/Models/TapeMed/ArmStrapLeftBoxtie.png new file mode 100644 index 000000000..5e55bd077 Binary files /dev/null and b/Models/TapeMed/ArmStrapLeftBoxtie.png differ diff --git a/Models/TapeMed/ArmStrapLeftCrossed.png b/Models/TapeMed/ArmStrapLeftCrossed.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeMed/ArmStrapLeftCrossed.png differ diff --git a/Models/TapeMed/ArmStrapLeftWristtie.png b/Models/TapeMed/ArmStrapLeftWristtie.png new file mode 100644 index 000000000..60d7a2339 Binary files /dev/null and b/Models/TapeMed/ArmStrapLeftWristtie.png differ diff --git a/Models/TapeMed/ArmStrapRightBoxtie.png b/Models/TapeMed/ArmStrapRightBoxtie.png new file mode 100644 index 000000000..ae50b9433 Binary files /dev/null and b/Models/TapeMed/ArmStrapRightBoxtie.png differ diff --git a/Models/TapeMed/ArmStrapRightCrossed.png b/Models/TapeMed/ArmStrapRightCrossed.png new file mode 100644 index 000000000..9a2c6915e Binary files /dev/null and b/Models/TapeMed/ArmStrapRightCrossed.png differ diff --git a/Models/TapeMed/ArmStrapRightWristtie.png b/Models/TapeMed/ArmStrapRightWristtie.png new file mode 100644 index 000000000..d0052caf3 Binary files /dev/null and b/Models/TapeMed/ArmStrapRightWristtie.png differ diff --git a/Models/TapeMed/BottomClosed.png b/Models/TapeMed/BottomClosed.png new file mode 100644 index 000000000..92d2ccf8f Binary files /dev/null and b/Models/TapeMed/BottomClosed.png differ diff --git a/Models/TapeMed/BottomHogtie.png b/Models/TapeMed/BottomHogtie.png new file mode 100644 index 000000000..92d2ccf8f Binary files /dev/null and b/Models/TapeMed/BottomHogtie.png differ diff --git a/Models/TapeMed/BottomKneel.png b/Models/TapeMed/BottomKneel.png new file mode 100644 index 000000000..a08dd7117 Binary files /dev/null and b/Models/TapeMed/BottomKneel.png differ diff --git a/Models/TapeMed/BottomKneelClosed.png b/Models/TapeMed/BottomKneelClosed.png new file mode 100644 index 000000000..d7cbb694e Binary files /dev/null and b/Models/TapeMed/BottomKneelClosed.png differ diff --git a/Models/TapeMed/Chest.png b/Models/TapeMed/Chest.png new file mode 100644 index 000000000..95db8907e Binary files /dev/null and b/Models/TapeMed/Chest.png differ diff --git a/Models/TapeMed/ChestFull.png b/Models/TapeMed/ChestFull.png new file mode 100644 index 000000000..c6e28a78b Binary files /dev/null and b/Models/TapeMed/ChestFull.png differ diff --git a/Models/TapeMed/ChestPetsuit.png b/Models/TapeMed/ChestPetsuit.png new file mode 100644 index 000000000..c8f1751b2 Binary files /dev/null and b/Models/TapeMed/ChestPetsuit.png differ diff --git a/Models/TapeMed/ChestStrap.png b/Models/TapeMed/ChestStrap.png new file mode 100644 index 000000000..974a889d3 Binary files /dev/null and b/Models/TapeMed/ChestStrap.png differ diff --git a/Models/TapeMed/FeetClosed.png b/Models/TapeMed/FeetClosed.png new file mode 100644 index 000000000..7d7e79f82 Binary files /dev/null and b/Models/TapeMed/FeetClosed.png differ diff --git a/Models/TapeMed/FeetKneel.png b/Models/TapeMed/FeetKneel.png new file mode 100644 index 000000000..039cd14f9 Binary files /dev/null and b/Models/TapeMed/FeetKneel.png differ diff --git a/Models/TapeMed/HandLeftFree.png b/Models/TapeMed/HandLeftFree.png new file mode 100644 index 000000000..8b6090267 Binary files /dev/null and b/Models/TapeMed/HandLeftFree.png differ diff --git a/Models/TapeMed/HandLeftFront.png b/Models/TapeMed/HandLeftFront.png new file mode 100644 index 000000000..4636f744f Binary files /dev/null and b/Models/TapeMed/HandLeftFront.png differ diff --git a/Models/TapeMed/HandLeftYoked.png b/Models/TapeMed/HandLeftYoked.png new file mode 100644 index 000000000..6269ba28f Binary files /dev/null and b/Models/TapeMed/HandLeftYoked.png differ diff --git a/Models/TapeMed/HandRightBoxtie.png b/Models/TapeMed/HandRightBoxtie.png new file mode 100644 index 000000000..3056a70c5 Binary files /dev/null and b/Models/TapeMed/HandRightBoxtie.png differ diff --git a/Models/TapeMed/HandRightFree.png b/Models/TapeMed/HandRightFree.png new file mode 100644 index 000000000..d5b252c17 Binary files /dev/null and b/Models/TapeMed/HandRightFree.png differ diff --git a/Models/TapeMed/HandRightFront.png b/Models/TapeMed/HandRightFront.png new file mode 100644 index 000000000..4982a9cd9 Binary files /dev/null and b/Models/TapeMed/HandRightFront.png differ diff --git a/Models/TapeMed/HandRightYoked.png b/Models/TapeMed/HandRightYoked.png new file mode 100644 index 000000000..abda8d700 Binary files /dev/null and b/Models/TapeMed/HandRightYoked.png differ diff --git a/Models/TapeMed/LegsClosed.png b/Models/TapeMed/LegsClosed.png new file mode 100644 index 000000000..b29535911 Binary files /dev/null and b/Models/TapeMed/LegsClosed.png differ diff --git a/Models/TapeMed/LegsHogtie.png b/Models/TapeMed/LegsHogtie.png new file mode 100644 index 000000000..405c2f60c Binary files /dev/null and b/Models/TapeMed/LegsHogtie.png differ diff --git a/Models/TapeMed/LegsKneel.png b/Models/TapeMed/LegsKneel.png new file mode 100644 index 000000000..f67cefd27 Binary files /dev/null and b/Models/TapeMed/LegsKneel.png differ diff --git a/Models/TapeMed/LegsKneelClosed.png b/Models/TapeMed/LegsKneelClosed.png new file mode 100644 index 000000000..5c4dd71aa Binary files /dev/null and b/Models/TapeMed/LegsKneelClosed.png differ diff --git a/Models/TapeMed/PetsuitTopArms.png b/Models/TapeMed/PetsuitTopArms.png new file mode 100644 index 000000000..4586c7a76 Binary files /dev/null and b/Models/TapeMed/PetsuitTopArms.png differ diff --git a/Models/TapeMed/PetsuitTopBody.png b/Models/TapeMed/PetsuitTopBody.png new file mode 100644 index 000000000..cc5745443 Binary files /dev/null and b/Models/TapeMed/PetsuitTopBody.png differ diff --git a/Models/TapeMed/PetsuitTopHands.png b/Models/TapeMed/PetsuitTopHands.png new file mode 100644 index 000000000..1042df0e4 Binary files /dev/null and b/Models/TapeMed/PetsuitTopHands.png differ diff --git a/Models/TapeMed/PetsuitTopTapedHands.png b/Models/TapeMed/PetsuitTopTapedHands.png new file mode 100644 index 000000000..c368b41f2 Binary files /dev/null and b/Models/TapeMed/PetsuitTopTapedHands.png differ diff --git a/Models/TapeMed/RightLegsClosed.png b/Models/TapeMed/RightLegsClosed.png new file mode 100644 index 000000000..e874ad602 Binary files /dev/null and b/Models/TapeMed/RightLegsClosed.png differ diff --git a/Models/TapeMed/RightLegsHogtie.png b/Models/TapeMed/RightLegsHogtie.png new file mode 100644 index 000000000..59ced4b9a Binary files /dev/null and b/Models/TapeMed/RightLegsHogtie.png differ diff --git a/Models/TapeMed/RightLegsKneel.png b/Models/TapeMed/RightLegsKneel.png new file mode 100644 index 000000000..a01a670c2 Binary files /dev/null and b/Models/TapeMed/RightLegsKneel.png differ diff --git a/Models/TapeMed/RightLegsKneelClosed.png b/Models/TapeMed/RightLegsKneelClosed.png new file mode 100644 index 000000000..698c58de3 Binary files /dev/null and b/Models/TapeMed/RightLegsKneelClosed.png differ diff --git a/Models/TapeMed/StrapCover.png b/Models/TapeMed/StrapCover.png new file mode 100644 index 000000000..8375f0218 Binary files /dev/null and b/Models/TapeMed/StrapCover.png differ diff --git a/Models/TapeMed/TopBoxtie.png b/Models/TapeMed/TopBoxtie.png new file mode 100644 index 000000000..33a773b45 Binary files /dev/null and b/Models/TapeMed/TopBoxtie.png differ diff --git a/Models/TapeMed/TopCrossed.png b/Models/TapeMed/TopCrossed.png new file mode 100644 index 000000000..434abfdbe Binary files /dev/null and b/Models/TapeMed/TopCrossed.png differ diff --git a/Models/TapeMed/TopFullBoxtie.png b/Models/TapeMed/TopFullBoxtie.png new file mode 100644 index 000000000..4f7fabd1d Binary files /dev/null and b/Models/TapeMed/TopFullBoxtie.png differ diff --git a/Models/TapeMed/TopFullCrossed.png b/Models/TapeMed/TopFullCrossed.png new file mode 100644 index 000000000..121d74fcc Binary files /dev/null and b/Models/TapeMed/TopFullCrossed.png differ diff --git a/Models/TapeMed/TopFullWristtie.png b/Models/TapeMed/TopFullWristtie.png new file mode 100644 index 000000000..e963b56a1 Binary files /dev/null and b/Models/TapeMed/TopFullWristtie.png differ diff --git a/Models/TapeMed/TopStrapBoxtie.png b/Models/TapeMed/TopStrapBoxtie.png new file mode 100644 index 000000000..c3fe6c9b8 Binary files /dev/null and b/Models/TapeMed/TopStrapBoxtie.png differ diff --git a/Models/TapeMed/TopStrapCrossed.png b/Models/TapeMed/TopStrapCrossed.png new file mode 100644 index 000000000..156d98d90 Binary files /dev/null and b/Models/TapeMed/TopStrapCrossed.png differ diff --git a/Models/TapeMed/TopStrapWristtie.png b/Models/TapeMed/TopStrapWristtie.png new file mode 100644 index 000000000..0324bc2fb Binary files /dev/null and b/Models/TapeMed/TopStrapWristtie.png differ diff --git a/Models/TapeMed/TopWristtie.png b/Models/TapeMed/TopWristtie.png new file mode 100644 index 000000000..080c5445c Binary files /dev/null and b/Models/TapeMed/TopWristtie.png differ diff --git a/Models/Uniform/ArmLeftBoxtie.png b/Models/Uniform/ArmLeftBoxtie.png new file mode 100644 index 000000000..9d8c2c4f7 Binary files /dev/null and b/Models/Uniform/ArmLeftBoxtie.png differ diff --git a/Models/Uniform/ArmLeftCrossed.png b/Models/Uniform/ArmLeftCrossed.png new file mode 100644 index 000000000..b94c718c4 Binary files /dev/null and b/Models/Uniform/ArmLeftCrossed.png differ diff --git a/Models/Uniform/ArmLeftFree.png b/Models/Uniform/ArmLeftFree.png new file mode 100644 index 000000000..411d00557 Binary files /dev/null and b/Models/Uniform/ArmLeftFree.png differ diff --git a/Models/Uniform/ArmLeftFront.png b/Models/Uniform/ArmLeftFront.png new file mode 100644 index 000000000..e61909bc9 Binary files /dev/null and b/Models/Uniform/ArmLeftFront.png differ diff --git a/Models/Uniform/ArmLeftUp.png b/Models/Uniform/ArmLeftUp.png new file mode 100644 index 000000000..411d38392 Binary files /dev/null and b/Models/Uniform/ArmLeftUp.png differ diff --git a/Models/Uniform/ArmLeftWristtie.png b/Models/Uniform/ArmLeftWristtie.png new file mode 100644 index 000000000..536807f80 Binary files /dev/null and b/Models/Uniform/ArmLeftWristtie.png differ diff --git a/Models/Uniform/ArmLeftYoked.png b/Models/Uniform/ArmLeftYoked.png new file mode 100644 index 000000000..d68cf5b52 Binary files /dev/null and b/Models/Uniform/ArmLeftYoked.png differ diff --git a/Models/Uniform/ArmRightBoxtie.png b/Models/Uniform/ArmRightBoxtie.png new file mode 100644 index 000000000..1719ddeb6 Binary files /dev/null and b/Models/Uniform/ArmRightBoxtie.png differ diff --git a/Models/Uniform/ArmRightCrossed.png b/Models/Uniform/ArmRightCrossed.png new file mode 100644 index 000000000..c4d85dbd3 Binary files /dev/null and b/Models/Uniform/ArmRightCrossed.png differ diff --git a/Models/Uniform/ArmRightFree.png b/Models/Uniform/ArmRightFree.png new file mode 100644 index 000000000..a4aa896e8 Binary files /dev/null and b/Models/Uniform/ArmRightFree.png differ diff --git a/Models/Uniform/ArmRightFront.png b/Models/Uniform/ArmRightFront.png new file mode 100644 index 000000000..8d78e0641 Binary files /dev/null and b/Models/Uniform/ArmRightFront.png differ diff --git a/Models/Uniform/ArmRightUp.png b/Models/Uniform/ArmRightUp.png new file mode 100644 index 000000000..8dacb7447 Binary files /dev/null and b/Models/Uniform/ArmRightUp.png differ diff --git a/Models/Uniform/ArmRightWristtie.png b/Models/Uniform/ArmRightWristtie.png new file mode 100644 index 000000000..0167183b0 Binary files /dev/null and b/Models/Uniform/ArmRightWristtie.png differ diff --git a/Models/Uniform/ArmRightYoked.png b/Models/Uniform/ArmRightYoked.png new file mode 100644 index 000000000..019bc407f Binary files /dev/null and b/Models/Uniform/ArmRightYoked.png differ diff --git a/Models/Uniform/BeltPouch.png b/Models/Uniform/BeltPouch.png new file mode 100644 index 000000000..49482ce3b Binary files /dev/null and b/Models/Uniform/BeltPouch.png differ diff --git a/Models/Uniform/BeltPouchRim.png b/Models/Uniform/BeltPouchRim.png new file mode 100644 index 000000000..a03fa06e1 Binary files /dev/null and b/Models/Uniform/BeltPouchRim.png differ diff --git a/Models/Uniform/Dress.png b/Models/Uniform/Dress.png new file mode 100644 index 000000000..9bbf43130 Binary files /dev/null and b/Models/Uniform/Dress.png differ diff --git a/Models/Uniform/DressChestBoxtie.png b/Models/Uniform/DressChestBoxtie.png new file mode 100644 index 000000000..459c6ba1f Binary files /dev/null and b/Models/Uniform/DressChestBoxtie.png differ diff --git a/Models/Uniform/DressChestFree.png b/Models/Uniform/DressChestFree.png new file mode 100644 index 000000000..b8cc5d2ec Binary files /dev/null and b/Models/Uniform/DressChestFree.png differ diff --git a/Models/Uniform/DressChestUp.png b/Models/Uniform/DressChestUp.png new file mode 100644 index 000000000..c722f2752 Binary files /dev/null and b/Models/Uniform/DressChestUp.png differ diff --git a/Models/Uniform/DressChestWristtie.png b/Models/Uniform/DressChestWristtie.png new file mode 100644 index 000000000..fc88244c3 Binary files /dev/null and b/Models/Uniform/DressChestWristtie.png differ diff --git a/Models/Uniform/DressChestYoked.png b/Models/Uniform/DressChestYoked.png new file mode 100644 index 000000000..1e12da073 Binary files /dev/null and b/Models/Uniform/DressChestYoked.png differ diff --git a/Models/Uniform/DressSkirt.png b/Models/Uniform/DressSkirt.png new file mode 100644 index 000000000..7ded5bf90 Binary files /dev/null and b/Models/Uniform/DressSkirt.png differ diff --git a/Models/Uniform/DressSkirtHogtie.png b/Models/Uniform/DressSkirtHogtie.png new file mode 100644 index 000000000..18bf36274 Binary files /dev/null and b/Models/Uniform/DressSkirtHogtie.png differ diff --git a/Models/Uniform/DressSkirtKneel.png b/Models/Uniform/DressSkirtKneel.png new file mode 100644 index 000000000..daad92657 Binary files /dev/null and b/Models/Uniform/DressSkirtKneel.png differ diff --git a/Models/Uniform/FootSockLeftHogtie.png b/Models/Uniform/FootSockLeftHogtie.png new file mode 100644 index 000000000..d7b1a8683 Binary files /dev/null and b/Models/Uniform/FootSockLeftHogtie.png differ diff --git a/Models/Uniform/FootSockRightKneel.png b/Models/Uniform/FootSockRightKneel.png new file mode 100644 index 000000000..3eac4478e Binary files /dev/null and b/Models/Uniform/FootSockRightKneel.png differ diff --git a/Models/Uniform/ForeArmLeftCrossed.png b/Models/Uniform/ForeArmLeftCrossed.png new file mode 100644 index 000000000..5f9dff10c Binary files /dev/null and b/Models/Uniform/ForeArmLeftCrossed.png differ diff --git a/Models/Uniform/ForeArmLeftFront.png b/Models/Uniform/ForeArmLeftFront.png new file mode 100644 index 000000000..fae24a062 Binary files /dev/null and b/Models/Uniform/ForeArmLeftFront.png differ diff --git a/Models/Uniform/ForeArmRightCrossed.png b/Models/Uniform/ForeArmRightCrossed.png new file mode 100644 index 000000000..e3c0a17aa Binary files /dev/null and b/Models/Uniform/ForeArmRightCrossed.png differ diff --git a/Models/Uniform/ForeArmRightFront.png b/Models/Uniform/ForeArmRightFront.png new file mode 100644 index 000000000..20bc0fb6a Binary files /dev/null and b/Models/Uniform/ForeArmRightFront.png differ diff --git a/Models/Uniform/Hairpin.png b/Models/Uniform/Hairpin.png new file mode 100644 index 000000000..0526bb21c Binary files /dev/null and b/Models/Uniform/Hairpin.png differ diff --git a/Models/Uniform/Hat.png b/Models/Uniform/Hat.png new file mode 100644 index 000000000..a15c90010 Binary files /dev/null and b/Models/Uniform/Hat.png differ diff --git a/Models/Uniform/HatCap.png b/Models/Uniform/HatCap.png new file mode 100644 index 000000000..985305121 Binary files /dev/null and b/Models/Uniform/HatCap.png differ diff --git a/Models/Uniform/HatGloriousInsignia.png b/Models/Uniform/HatGloriousInsignia.png new file mode 100644 index 000000000..b5e12f9d0 Binary files /dev/null and b/Models/Uniform/HatGloriousInsignia.png differ diff --git a/Models/Uniform/HatGloriousInsigniaHS.png b/Models/Uniform/HatGloriousInsigniaHS.png new file mode 100644 index 000000000..8da51d366 Binary files /dev/null and b/Models/Uniform/HatGloriousInsigniaHS.png differ diff --git a/Models/Uniform/HatRim.png b/Models/Uniform/HatRim.png new file mode 100644 index 000000000..b8bc18a94 Binary files /dev/null and b/Models/Uniform/HatRim.png differ diff --git a/Models/Uniform/Headgear.png b/Models/Uniform/Headgear.png new file mode 100644 index 000000000..6362f56e7 Binary files /dev/null and b/Models/Uniform/Headgear.png differ diff --git a/Models/Uniform/HeadgearBack.png b/Models/Uniform/HeadgearBack.png new file mode 100644 index 000000000..6b3992fbd Binary files /dev/null and b/Models/Uniform/HeadgearBack.png differ diff --git a/Models/Uniform/HeadgearEars.png b/Models/Uniform/HeadgearEars.png new file mode 100644 index 000000000..370ee0a28 Binary files /dev/null and b/Models/Uniform/HeadgearEars.png differ diff --git a/Models/Uniform/HeadgearEarsInner.png b/Models/Uniform/HeadgearEarsInner.png new file mode 100644 index 000000000..4fcda68ce Binary files /dev/null and b/Models/Uniform/HeadgearEarsInner.png differ diff --git a/Models/Uniform/HeadgearUnit.png b/Models/Uniform/HeadgearUnit.png new file mode 100644 index 000000000..7f4ab220f Binary files /dev/null and b/Models/Uniform/HeadgearUnit.png differ diff --git a/Models/Uniform/PantyhoseClosed.png b/Models/Uniform/PantyhoseClosed.png new file mode 100644 index 000000000..93cf1652a Binary files /dev/null and b/Models/Uniform/PantyhoseClosed.png differ diff --git a/Models/Uniform/PantyhoseHogtie.png b/Models/Uniform/PantyhoseHogtie.png new file mode 100644 index 000000000..73fe5384c Binary files /dev/null and b/Models/Uniform/PantyhoseHogtie.png differ diff --git a/Models/Uniform/PantyhoseKneel.png b/Models/Uniform/PantyhoseKneel.png new file mode 100644 index 000000000..cefdfbe06 Binary files /dev/null and b/Models/Uniform/PantyhoseKneel.png differ diff --git a/Models/Uniform/PantyhoseKneelClosed.png b/Models/Uniform/PantyhoseKneelClosed.png new file mode 100644 index 000000000..de46e38cf Binary files /dev/null and b/Models/Uniform/PantyhoseKneelClosed.png differ diff --git a/Models/Uniform/PantyhoseSpread.png b/Models/Uniform/PantyhoseSpread.png new file mode 100644 index 000000000..804c3a28a Binary files /dev/null and b/Models/Uniform/PantyhoseSpread.png differ diff --git a/Models/Uniform/Searchlight.png b/Models/Uniform/Searchlight.png new file mode 100644 index 000000000..8e8c4c869 Binary files /dev/null and b/Models/Uniform/Searchlight.png differ diff --git a/Models/Uniform/SearchlightBase.png b/Models/Uniform/SearchlightBase.png new file mode 100644 index 000000000..68f11ab35 Binary files /dev/null and b/Models/Uniform/SearchlightBase.png differ diff --git a/Models/Uniform/SearchlightLens.png b/Models/Uniform/SearchlightLens.png new file mode 100644 index 000000000..5f38a0d48 Binary files /dev/null and b/Models/Uniform/SearchlightLens.png differ diff --git a/Models/Uniform/SearchlightPouch.png b/Models/Uniform/SearchlightPouch.png new file mode 100644 index 000000000..1135c3c8f Binary files /dev/null and b/Models/Uniform/SearchlightPouch.png differ diff --git a/Models/Uniform/ShoeLeftClosed.png b/Models/Uniform/ShoeLeftClosed.png new file mode 100644 index 000000000..f938f7383 Binary files /dev/null and b/Models/Uniform/ShoeLeftClosed.png differ diff --git a/Models/Uniform/ShoeLeftHogtie.png b/Models/Uniform/ShoeLeftHogtie.png new file mode 100644 index 000000000..a40f00812 Binary files /dev/null and b/Models/Uniform/ShoeLeftHogtie.png differ diff --git a/Models/Uniform/ShoeLeftKneel.png b/Models/Uniform/ShoeLeftKneel.png new file mode 100644 index 000000000..f5f231d5e Binary files /dev/null and b/Models/Uniform/ShoeLeftKneel.png differ diff --git a/Models/Uniform/ShoeLeftKneelClosed.png b/Models/Uniform/ShoeLeftKneelClosed.png new file mode 100644 index 000000000..978642c24 Binary files /dev/null and b/Models/Uniform/ShoeLeftKneelClosed.png differ diff --git a/Models/Uniform/ShoeLeftSpread.png b/Models/Uniform/ShoeLeftSpread.png new file mode 100644 index 000000000..b1ee3849b Binary files /dev/null and b/Models/Uniform/ShoeLeftSpread.png differ diff --git a/Models/Uniform/ShoeRightClosed.png b/Models/Uniform/ShoeRightClosed.png new file mode 100644 index 000000000..f0250674e Binary files /dev/null and b/Models/Uniform/ShoeRightClosed.png differ diff --git a/Models/Uniform/ShoeRightKneel.png b/Models/Uniform/ShoeRightKneel.png new file mode 100644 index 000000000..faca1b8bb Binary files /dev/null and b/Models/Uniform/ShoeRightKneel.png differ diff --git a/Models/Uniform/ShoeRightSpread.png b/Models/Uniform/ShoeRightSpread.png new file mode 100644 index 000000000..eb0f6bf62 Binary files /dev/null and b/Models/Uniform/ShoeRightSpread.png differ diff --git a/Models/Uniform/ShoulderRightUp.png b/Models/Uniform/ShoulderRightUp.png new file mode 100644 index 000000000..fedbce065 Binary files /dev/null and b/Models/Uniform/ShoulderRightUp.png differ diff --git a/Models/Uniform/Skirt.png b/Models/Uniform/Skirt.png new file mode 100644 index 000000000..2a9988967 Binary files /dev/null and b/Models/Uniform/Skirt.png differ diff --git a/Models/Uniform/SkirtBand.png b/Models/Uniform/SkirtBand.png new file mode 100644 index 000000000..66652befa Binary files /dev/null and b/Models/Uniform/SkirtBand.png differ diff --git a/Models/Uniform/SkirtBandKneel.png b/Models/Uniform/SkirtBandKneel.png new file mode 100644 index 000000000..b5da00acc Binary files /dev/null and b/Models/Uniform/SkirtBandKneel.png differ diff --git a/Models/Uniform/SkirtKneel.png b/Models/Uniform/SkirtKneel.png new file mode 100644 index 000000000..2e713b4ef Binary files /dev/null and b/Models/Uniform/SkirtKneel.png differ diff --git a/Models/Uniform/SleeveLeftBoxtie.png b/Models/Uniform/SleeveLeftBoxtie.png new file mode 100644 index 000000000..5899ee7d9 Binary files /dev/null and b/Models/Uniform/SleeveLeftBoxtie.png differ diff --git a/Models/Uniform/SleeveLeftCrossed.png b/Models/Uniform/SleeveLeftCrossed.png new file mode 100644 index 000000000..24c916322 Binary files /dev/null and b/Models/Uniform/SleeveLeftCrossed.png differ diff --git a/Models/Uniform/SleeveLeftFree.png b/Models/Uniform/SleeveLeftFree.png new file mode 100644 index 000000000..881ce5f8d Binary files /dev/null and b/Models/Uniform/SleeveLeftFree.png differ diff --git a/Models/Uniform/SleeveLeftFront.png b/Models/Uniform/SleeveLeftFront.png new file mode 100644 index 000000000..c865d5c35 Binary files /dev/null and b/Models/Uniform/SleeveLeftFront.png differ diff --git a/Models/Uniform/SleeveLeftUp.png b/Models/Uniform/SleeveLeftUp.png new file mode 100644 index 000000000..d4aa5e1b0 Binary files /dev/null and b/Models/Uniform/SleeveLeftUp.png differ diff --git a/Models/Uniform/SleeveLeftWristtie.png b/Models/Uniform/SleeveLeftWristtie.png new file mode 100644 index 000000000..a559319bf Binary files /dev/null and b/Models/Uniform/SleeveLeftWristtie.png differ diff --git a/Models/Uniform/SleeveLeftYoked.png b/Models/Uniform/SleeveLeftYoked.png new file mode 100644 index 000000000..1d376cf95 Binary files /dev/null and b/Models/Uniform/SleeveLeftYoked.png differ diff --git a/Models/Uniform/SleeveRightBoxtie.png b/Models/Uniform/SleeveRightBoxtie.png new file mode 100644 index 000000000..d5dd7810d Binary files /dev/null and b/Models/Uniform/SleeveRightBoxtie.png differ diff --git a/Models/Uniform/SleeveRightCrossed.png b/Models/Uniform/SleeveRightCrossed.png new file mode 100644 index 000000000..7a888b67f Binary files /dev/null and b/Models/Uniform/SleeveRightCrossed.png differ diff --git a/Models/Uniform/SleeveRightFree.png b/Models/Uniform/SleeveRightFree.png new file mode 100644 index 000000000..4d019ea59 Binary files /dev/null and b/Models/Uniform/SleeveRightFree.png differ diff --git a/Models/Uniform/SleeveRightFront.png b/Models/Uniform/SleeveRightFront.png new file mode 100644 index 000000000..970c820d3 Binary files /dev/null and b/Models/Uniform/SleeveRightFront.png differ diff --git a/Models/Uniform/SleeveRightUp.png b/Models/Uniform/SleeveRightUp.png new file mode 100644 index 000000000..fedbce065 Binary files /dev/null and b/Models/Uniform/SleeveRightUp.png differ diff --git a/Models/Uniform/SleeveRightWristtie.png b/Models/Uniform/SleeveRightWristtie.png new file mode 100644 index 000000000..4bbd663db Binary files /dev/null and b/Models/Uniform/SleeveRightWristtie.png differ diff --git a/Models/Uniform/SleeveRightYoked.png b/Models/Uniform/SleeveRightYoked.png new file mode 100644 index 000000000..fd509fc7f Binary files /dev/null and b/Models/Uniform/SleeveRightYoked.png differ diff --git a/Models/Uniform/SockLeftClosed.png b/Models/Uniform/SockLeftClosed.png new file mode 100644 index 000000000..f23251ccf Binary files /dev/null and b/Models/Uniform/SockLeftClosed.png differ diff --git a/Models/Uniform/SockLeftHogtie.png b/Models/Uniform/SockLeftHogtie.png new file mode 100644 index 000000000..ddd15ae99 Binary files /dev/null and b/Models/Uniform/SockLeftHogtie.png differ diff --git a/Models/Uniform/SockLeftKneel.png b/Models/Uniform/SockLeftKneel.png new file mode 100644 index 000000000..02ae8dd7c Binary files /dev/null and b/Models/Uniform/SockLeftKneel.png differ diff --git a/Models/Uniform/SockLeftKneelClosed.png b/Models/Uniform/SockLeftKneelClosed.png new file mode 100644 index 000000000..f9f6f5890 Binary files /dev/null and b/Models/Uniform/SockLeftKneelClosed.png differ diff --git a/Models/Uniform/SockLeftSpread.png b/Models/Uniform/SockLeftSpread.png new file mode 100644 index 000000000..2c0913f54 Binary files /dev/null and b/Models/Uniform/SockLeftSpread.png differ diff --git a/Models/Uniform/SockRightClosed.png b/Models/Uniform/SockRightClosed.png new file mode 100644 index 000000000..908f29926 Binary files /dev/null and b/Models/Uniform/SockRightClosed.png differ diff --git a/Models/Uniform/SockRightHogtie.png b/Models/Uniform/SockRightHogtie.png new file mode 100644 index 000000000..692ad7596 Binary files /dev/null and b/Models/Uniform/SockRightHogtie.png differ diff --git a/Models/Uniform/SockRightKneel.png b/Models/Uniform/SockRightKneel.png new file mode 100644 index 000000000..9af2080ab Binary files /dev/null and b/Models/Uniform/SockRightKneel.png differ diff --git a/Models/Uniform/SockRightKneelClosed.png b/Models/Uniform/SockRightKneelClosed.png new file mode 100644 index 000000000..d050d6037 Binary files /dev/null and b/Models/Uniform/SockRightKneelClosed.png differ diff --git a/Models/Uniform/SockRightSpread.png b/Models/Uniform/SockRightSpread.png new file mode 100644 index 000000000..15c4f3387 Binary files /dev/null and b/Models/Uniform/SockRightSpread.png differ diff --git a/Models/Uniform/Webbing.png b/Models/Uniform/Webbing.png new file mode 100644 index 000000000..0c6d58d46 Binary files /dev/null and b/Models/Uniform/Webbing.png differ diff --git a/Models/Uniform/WebbingHardware.png b/Models/Uniform/WebbingHardware.png new file mode 100644 index 000000000..451371921 Binary files /dev/null and b/Models/Uniform/WebbingHardware.png differ diff --git a/Models/Uniform/WebbingName.png b/Models/Uniform/WebbingName.png new file mode 100644 index 000000000..5ff20885f Binary files /dev/null and b/Models/Uniform/WebbingName.png differ diff --git a/Models/Uniform/WebbingSide.png b/Models/Uniform/WebbingSide.png new file mode 100644 index 000000000..af8128388 Binary files /dev/null and b/Models/Uniform/WebbingSide.png differ diff --git a/Models/Uniform/WebbingSideTied.png b/Models/Uniform/WebbingSideTied.png new file mode 100644 index 000000000..ff3a99c42 Binary files /dev/null and b/Models/Uniform/WebbingSideTied.png differ diff --git a/Models/Uniform/WebbingSideUp.png b/Models/Uniform/WebbingSideUp.png new file mode 100644 index 000000000..07d5ee43b Binary files /dev/null and b/Models/Uniform/WebbingSideUp.png differ diff --git a/Models/Uniform/WebbingSideWristtie.png b/Models/Uniform/WebbingSideWristtie.png new file mode 100644 index 000000000..ff3a99c42 Binary files /dev/null and b/Models/Uniform/WebbingSideWristtie.png differ diff --git a/Models/Uniform/WebbingSideYoked.png b/Models/Uniform/WebbingSideYoked.png new file mode 100644 index 000000000..bd621592d Binary files /dev/null and b/Models/Uniform/WebbingSideYoked.png differ diff --git a/Models/Uniform/WebbingUnderbust.png b/Models/Uniform/WebbingUnderbust.png new file mode 100644 index 000000000..4afb60715 Binary files /dev/null and b/Models/Uniform/WebbingUnderbust.png differ diff --git a/Models/Uniform/WebbingUnderbustHardware.png b/Models/Uniform/WebbingUnderbustHardware.png new file mode 100644 index 000000000..5cd5c04ab Binary files /dev/null and b/Models/Uniform/WebbingUnderbustHardware.png differ diff --git a/Models/Uniform/WebbingUp.png b/Models/Uniform/WebbingUp.png new file mode 100644 index 000000000..9f517fc54 Binary files /dev/null and b/Models/Uniform/WebbingUp.png differ diff --git a/Models/Uniform/WebbingWristtie.png b/Models/Uniform/WebbingWristtie.png new file mode 100644 index 000000000..b302fb4a9 Binary files /dev/null and b/Models/Uniform/WebbingWristtie.png differ diff --git a/Models/UniformShirt/Dress.png b/Models/UniformShirt/Dress.png new file mode 100644 index 000000000..b666e0106 Binary files /dev/null and b/Models/UniformShirt/Dress.png differ diff --git a/Models/UniformShirt/DressChestBoxtie.png b/Models/UniformShirt/DressChestBoxtie.png new file mode 100644 index 000000000..663cdb2a6 Binary files /dev/null and b/Models/UniformShirt/DressChestBoxtie.png differ diff --git a/Models/UniformShirt/DressChestFree.png b/Models/UniformShirt/DressChestFree.png new file mode 100644 index 000000000..b522d258a Binary files /dev/null and b/Models/UniformShirt/DressChestFree.png differ diff --git a/Models/UniformShirt/DressChestUp.png b/Models/UniformShirt/DressChestUp.png new file mode 100644 index 000000000..09ca6ec25 Binary files /dev/null and b/Models/UniformShirt/DressChestUp.png differ diff --git a/Models/UniformShirt/DressChestWristtie.png b/Models/UniformShirt/DressChestWristtie.png new file mode 100644 index 000000000..c7ace2a01 Binary files /dev/null and b/Models/UniformShirt/DressChestWristtie.png differ diff --git a/Models/UniformShirt/DressChestYoked.png b/Models/UniformShirt/DressChestYoked.png new file mode 100644 index 000000000..6a07d1572 Binary files /dev/null and b/Models/UniformShirt/DressChestYoked.png differ diff --git a/Models/UniformShirt/ForeArmLeftCrossed.png b/Models/UniformShirt/ForeArmLeftCrossed.png new file mode 100644 index 000000000..9d3ec3717 Binary files /dev/null and b/Models/UniformShirt/ForeArmLeftCrossed.png differ diff --git a/Models/UniformShirt/ForeArmLeftFront.png b/Models/UniformShirt/ForeArmLeftFront.png new file mode 100644 index 000000000..bd6b04123 Binary files /dev/null and b/Models/UniformShirt/ForeArmLeftFront.png differ diff --git a/Models/UniformShirt/ForeArmRightCrossed.png b/Models/UniformShirt/ForeArmRightCrossed.png new file mode 100644 index 000000000..bb208c949 Binary files /dev/null and b/Models/UniformShirt/ForeArmRightCrossed.png differ diff --git a/Models/UniformShirt/ForeArmRightFront.png b/Models/UniformShirt/ForeArmRightFront.png new file mode 100644 index 000000000..5418fe7e4 Binary files /dev/null and b/Models/UniformShirt/ForeArmRightFront.png differ diff --git a/Models/UniformShirt/ForeGloveLeftCrossed.png b/Models/UniformShirt/ForeGloveLeftCrossed.png new file mode 100644 index 000000000..924a41631 Binary files /dev/null and b/Models/UniformShirt/ForeGloveLeftCrossed.png differ diff --git a/Models/UniformShirt/ForeGloveLeftFront.png b/Models/UniformShirt/ForeGloveLeftFront.png new file mode 100644 index 000000000..fb90f2b73 Binary files /dev/null and b/Models/UniformShirt/ForeGloveLeftFront.png differ diff --git a/Models/UniformShirt/ForeGloveRightCrossed.png b/Models/UniformShirt/ForeGloveRightCrossed.png new file mode 100644 index 000000000..e8f55fe63 Binary files /dev/null and b/Models/UniformShirt/ForeGloveRightCrossed.png differ diff --git a/Models/UniformShirt/ForeGloveRightFront.png b/Models/UniformShirt/ForeGloveRightFront.png new file mode 100644 index 000000000..70a19fe07 Binary files /dev/null and b/Models/UniformShirt/ForeGloveRightFront.png differ diff --git a/Models/UniformShirt/GloveLeftBoxtie.png b/Models/UniformShirt/GloveLeftBoxtie.png new file mode 100644 index 000000000..ad10d8f13 Binary files /dev/null and b/Models/UniformShirt/GloveLeftBoxtie.png differ diff --git a/Models/UniformShirt/GloveLeftCrossed.png b/Models/UniformShirt/GloveLeftCrossed.png new file mode 100644 index 000000000..779bfb4d7 Binary files /dev/null and b/Models/UniformShirt/GloveLeftCrossed.png differ diff --git a/Models/UniformShirt/GloveLeftFree.png b/Models/UniformShirt/GloveLeftFree.png new file mode 100644 index 000000000..a49406868 Binary files /dev/null and b/Models/UniformShirt/GloveLeftFree.png differ diff --git a/Models/UniformShirt/GloveLeftFront.png b/Models/UniformShirt/GloveLeftFront.png new file mode 100644 index 000000000..35964f3e0 Binary files /dev/null and b/Models/UniformShirt/GloveLeftFront.png differ diff --git a/Models/UniformShirt/GloveLeftUp.png b/Models/UniformShirt/GloveLeftUp.png new file mode 100644 index 000000000..9d716447b Binary files /dev/null and b/Models/UniformShirt/GloveLeftUp.png differ diff --git a/Models/UniformShirt/GloveLeftWristtie.png b/Models/UniformShirt/GloveLeftWristtie.png new file mode 100644 index 000000000..21e45f804 Binary files /dev/null and b/Models/UniformShirt/GloveLeftWristtie.png differ diff --git a/Models/UniformShirt/GloveLeftYoked.png b/Models/UniformShirt/GloveLeftYoked.png new file mode 100644 index 000000000..b7d2add4f Binary files /dev/null and b/Models/UniformShirt/GloveLeftYoked.png differ diff --git a/Models/UniformShirt/GloveRightBoxtie.png b/Models/UniformShirt/GloveRightBoxtie.png new file mode 100644 index 000000000..41dd58285 Binary files /dev/null and b/Models/UniformShirt/GloveRightBoxtie.png differ diff --git a/Models/UniformShirt/GloveRightCrossed.png b/Models/UniformShirt/GloveRightCrossed.png new file mode 100644 index 000000000..75b15fab0 Binary files /dev/null and b/Models/UniformShirt/GloveRightCrossed.png differ diff --git a/Models/UniformShirt/GloveRightFree.png b/Models/UniformShirt/GloveRightFree.png new file mode 100644 index 000000000..41f610da0 Binary files /dev/null and b/Models/UniformShirt/GloveRightFree.png differ diff --git a/Models/UniformShirt/GloveRightFront.png b/Models/UniformShirt/GloveRightFront.png new file mode 100644 index 000000000..3c595cb02 Binary files /dev/null and b/Models/UniformShirt/GloveRightFront.png differ diff --git a/Models/UniformShirt/GloveRightUp.png b/Models/UniformShirt/GloveRightUp.png new file mode 100644 index 000000000..d4e27143a Binary files /dev/null and b/Models/UniformShirt/GloveRightUp.png differ diff --git a/Models/UniformShirt/GloveRightWristtie.png b/Models/UniformShirt/GloveRightWristtie.png new file mode 100644 index 000000000..f2e032ef1 Binary files /dev/null and b/Models/UniformShirt/GloveRightWristtie.png differ diff --git a/Models/UniformShirt/GloveRightYoked.png b/Models/UniformShirt/GloveRightYoked.png new file mode 100644 index 000000000..523687437 Binary files /dev/null and b/Models/UniformShirt/GloveRightYoked.png differ diff --git a/Models/UniformShirt/ShoulderRightUp.png b/Models/UniformShirt/ShoulderRightUp.png new file mode 100644 index 000000000..acbc44a27 Binary files /dev/null and b/Models/UniformShirt/ShoulderRightUp.png differ diff --git a/Models/UniformShirt/SleeveLeftBoxtie.png b/Models/UniformShirt/SleeveLeftBoxtie.png new file mode 100644 index 000000000..0657a9b68 Binary files /dev/null and b/Models/UniformShirt/SleeveLeftBoxtie.png differ diff --git a/Models/UniformShirt/SleeveLeftCrossed.png b/Models/UniformShirt/SleeveLeftCrossed.png new file mode 100644 index 000000000..b57ed138b Binary files /dev/null and b/Models/UniformShirt/SleeveLeftCrossed.png differ diff --git a/Models/UniformShirt/SleeveLeftFree.png b/Models/UniformShirt/SleeveLeftFree.png new file mode 100644 index 000000000..379038a11 Binary files /dev/null and b/Models/UniformShirt/SleeveLeftFree.png differ diff --git a/Models/UniformShirt/SleeveLeftFront.png b/Models/UniformShirt/SleeveLeftFront.png new file mode 100644 index 000000000..7cdbde9f3 Binary files /dev/null and b/Models/UniformShirt/SleeveLeftFront.png differ diff --git a/Models/UniformShirt/SleeveLeftUp.png b/Models/UniformShirt/SleeveLeftUp.png new file mode 100644 index 000000000..73879b5aa Binary files /dev/null and b/Models/UniformShirt/SleeveLeftUp.png differ diff --git a/Models/UniformShirt/SleeveLeftWristtie.png b/Models/UniformShirt/SleeveLeftWristtie.png new file mode 100644 index 000000000..56644cb9d Binary files /dev/null and b/Models/UniformShirt/SleeveLeftWristtie.png differ diff --git a/Models/UniformShirt/SleeveLeftYoked.png b/Models/UniformShirt/SleeveLeftYoked.png new file mode 100644 index 000000000..74b4b31a1 Binary files /dev/null and b/Models/UniformShirt/SleeveLeftYoked.png differ diff --git a/Models/UniformShirt/SleeveRightBoxtie.png b/Models/UniformShirt/SleeveRightBoxtie.png new file mode 100644 index 000000000..385ee4db9 Binary files /dev/null and b/Models/UniformShirt/SleeveRightBoxtie.png differ diff --git a/Models/UniformShirt/SleeveRightCrossed.png b/Models/UniformShirt/SleeveRightCrossed.png new file mode 100644 index 000000000..b8e79e457 Binary files /dev/null and b/Models/UniformShirt/SleeveRightCrossed.png differ diff --git a/Models/UniformShirt/SleeveRightFree.png b/Models/UniformShirt/SleeveRightFree.png new file mode 100644 index 000000000..0f4fe8fa3 Binary files /dev/null and b/Models/UniformShirt/SleeveRightFree.png differ diff --git a/Models/UniformShirt/SleeveRightFront.png b/Models/UniformShirt/SleeveRightFront.png new file mode 100644 index 000000000..6c2a7990c Binary files /dev/null and b/Models/UniformShirt/SleeveRightFront.png differ diff --git a/Models/UniformShirt/SleeveRightUp.png b/Models/UniformShirt/SleeveRightUp.png new file mode 100644 index 000000000..afdd558a4 Binary files /dev/null and b/Models/UniformShirt/SleeveRightUp.png differ diff --git a/Models/UniformShirt/SleeveRightWristtie.png b/Models/UniformShirt/SleeveRightWristtie.png new file mode 100644 index 000000000..c9133d376 Binary files /dev/null and b/Models/UniformShirt/SleeveRightWristtie.png differ diff --git a/Models/UniformShirt/SleeveRightYoked.png b/Models/UniformShirt/SleeveRightYoked.png new file mode 100644 index 000000000..85d562177 Binary files /dev/null and b/Models/UniformShirt/SleeveRightYoked.png differ diff --git a/Models/Vibe/Band.png b/Models/Vibe/Band.png new file mode 100644 index 000000000..b0d84879e Binary files /dev/null and b/Models/Vibe/Band.png differ diff --git a/Models/Vibe/Remote.png b/Models/Vibe/Remote.png new file mode 100644 index 000000000..b0d84879e Binary files /dev/null and b/Models/Vibe/Remote.png differ diff --git a/Models/Vibe/Wire.png b/Models/Vibe/Wire.png new file mode 100644 index 000000000..b0d84879e Binary files /dev/null and b/Models/Vibe/Wire.png differ diff --git a/Models/Visors/Dollmaker.png b/Models/Visors/Dollmaker.png new file mode 100644 index 000000000..6dd84fbb3 Binary files /dev/null and b/Models/Visors/Dollmaker.png differ diff --git a/Models/Visors/DollmakerFull.pdn b/Models/Visors/DollmakerFull.pdn new file mode 100644 index 000000000..346737434 Binary files /dev/null and b/Models/Visors/DollmakerFull.pdn differ diff --git a/Models/Visors/DollmakerFull.png b/Models/Visors/DollmakerFull.png new file mode 100644 index 000000000..3eb2bc832 Binary files /dev/null and b/Models/Visors/DollmakerFull.png differ diff --git a/Models/Visors/DollmakerFullRim.png b/Models/Visors/DollmakerFullRim.png new file mode 100644 index 000000000..8a3408778 Binary files /dev/null and b/Models/Visors/DollmakerFullRim.png differ diff --git a/Models/Warrior/ArmbandBoxtie.png b/Models/Warrior/ArmbandBoxtie.png new file mode 100644 index 000000000..dee1d6487 Binary files /dev/null and b/Models/Warrior/ArmbandBoxtie.png differ diff --git a/Models/Warrior/ArmbandFree.png b/Models/Warrior/ArmbandFree.png new file mode 100644 index 000000000..025d9f006 Binary files /dev/null and b/Models/Warrior/ArmbandFree.png differ diff --git a/Models/Warrior/ArmbandWristtie.png b/Models/Warrior/ArmbandWristtie.png new file mode 100644 index 000000000..982bba749 Binary files /dev/null and b/Models/Warrior/ArmbandWristtie.png differ diff --git a/Models/Warrior/ArmbandYoked.png b/Models/Warrior/ArmbandYoked.png new file mode 100644 index 000000000..a5fe8399b Binary files /dev/null and b/Models/Warrior/ArmbandYoked.png differ diff --git a/Models/Warrior/BandForeGloveLeftCrossed.png b/Models/Warrior/BandForeGloveLeftCrossed.png new file mode 100644 index 000000000..924a41631 Binary files /dev/null and b/Models/Warrior/BandForeGloveLeftCrossed.png differ diff --git a/Models/Warrior/BandForeGloveLeftFront.png b/Models/Warrior/BandForeGloveLeftFront.png new file mode 100644 index 000000000..246f4c2c5 Binary files /dev/null and b/Models/Warrior/BandForeGloveLeftFront.png differ diff --git a/Models/Warrior/BandForeGloveRightCrossed.png b/Models/Warrior/BandForeGloveRightCrossed.png new file mode 100644 index 000000000..02bcd354e Binary files /dev/null and b/Models/Warrior/BandForeGloveRightCrossed.png differ diff --git a/Models/Warrior/BandForeGloveRightFront.png b/Models/Warrior/BandForeGloveRightFront.png new file mode 100644 index 000000000..cf74cc0f3 Binary files /dev/null and b/Models/Warrior/BandForeGloveRightFront.png differ diff --git a/Models/Warrior/BandGloveLeftBoxtie.png b/Models/Warrior/BandGloveLeftBoxtie.png new file mode 100644 index 000000000..ad10d8f13 Binary files /dev/null and b/Models/Warrior/BandGloveLeftBoxtie.png differ diff --git a/Models/Warrior/BandGloveLeftCrossed.png b/Models/Warrior/BandGloveLeftCrossed.png new file mode 100644 index 000000000..779bfb4d7 Binary files /dev/null and b/Models/Warrior/BandGloveLeftCrossed.png differ diff --git a/Models/Warrior/BandGloveLeftFree.png b/Models/Warrior/BandGloveLeftFree.png new file mode 100644 index 000000000..ec641a7f3 Binary files /dev/null and b/Models/Warrior/BandGloveLeftFree.png differ diff --git a/Models/Warrior/BandGloveLeftFront.png b/Models/Warrior/BandGloveLeftFront.png new file mode 100644 index 000000000..35964f3e0 Binary files /dev/null and b/Models/Warrior/BandGloveLeftFront.png differ diff --git a/Models/Warrior/BandGloveLeftUp.png b/Models/Warrior/BandGloveLeftUp.png new file mode 100644 index 000000000..9d716447b Binary files /dev/null and b/Models/Warrior/BandGloveLeftUp.png differ diff --git a/Models/Warrior/BandGloveLeftWristtie.png b/Models/Warrior/BandGloveLeftWristtie.png new file mode 100644 index 000000000..21e45f804 Binary files /dev/null and b/Models/Warrior/BandGloveLeftWristtie.png differ diff --git a/Models/Warrior/BandGloveLeftYoked.png b/Models/Warrior/BandGloveLeftYoked.png new file mode 100644 index 000000000..4ed42b345 Binary files /dev/null and b/Models/Warrior/BandGloveLeftYoked.png differ diff --git a/Models/Warrior/BandGloveRightBoxtie.png b/Models/Warrior/BandGloveRightBoxtie.png new file mode 100644 index 000000000..9e7002eae Binary files /dev/null and b/Models/Warrior/BandGloveRightBoxtie.png differ diff --git a/Models/Warrior/BandGloveRightCrossed.png b/Models/Warrior/BandGloveRightCrossed.png new file mode 100644 index 000000000..75b15fab0 Binary files /dev/null and b/Models/Warrior/BandGloveRightCrossed.png differ diff --git a/Models/Warrior/BandGloveRightFree.png b/Models/Warrior/BandGloveRightFree.png new file mode 100644 index 000000000..90bf8e2a3 Binary files /dev/null and b/Models/Warrior/BandGloveRightFree.png differ diff --git a/Models/Warrior/BandGloveRightFront.png b/Models/Warrior/BandGloveRightFront.png new file mode 100644 index 000000000..3c595cb02 Binary files /dev/null and b/Models/Warrior/BandGloveRightFront.png differ diff --git a/Models/Warrior/BandGloveRightUp.png b/Models/Warrior/BandGloveRightUp.png new file mode 100644 index 000000000..d4e27143a Binary files /dev/null and b/Models/Warrior/BandGloveRightUp.png differ diff --git a/Models/Warrior/BandGloveRightWristtie.png b/Models/Warrior/BandGloveRightWristtie.png new file mode 100644 index 000000000..f2e032ef1 Binary files /dev/null and b/Models/Warrior/BandGloveRightWristtie.png differ diff --git a/Models/Warrior/BandGloveRightYoked.png b/Models/Warrior/BandGloveRightYoked.png new file mode 100644 index 000000000..f3992816d Binary files /dev/null and b/Models/Warrior/BandGloveRightYoked.png differ diff --git a/Models/Warrior/Belt.png b/Models/Warrior/Belt.png new file mode 100644 index 000000000..5e7b1ace1 Binary files /dev/null and b/Models/Warrior/Belt.png differ diff --git a/Models/Warrior/BeltCharm.png b/Models/Warrior/BeltCharm.png new file mode 100644 index 000000000..03e81780d Binary files /dev/null and b/Models/Warrior/BeltCharm.png differ diff --git a/Models/Warrior/Bra.png b/Models/Warrior/Bra.png new file mode 100644 index 000000000..cfb282f0a Binary files /dev/null and b/Models/Warrior/Bra.png differ diff --git a/Models/Warrior/BraYoked.png b/Models/Warrior/BraYoked.png new file mode 100644 index 000000000..c3e11cdb2 Binary files /dev/null and b/Models/Warrior/BraYoked.png differ diff --git a/Models/Warrior/Bustier.png b/Models/Warrior/Bustier.png new file mode 100644 index 000000000..c15a125ed Binary files /dev/null and b/Models/Warrior/Bustier.png differ diff --git a/Models/Warrior/BustierChest.png b/Models/Warrior/BustierChest.png new file mode 100644 index 000000000..e3186db5e Binary files /dev/null and b/Models/Warrior/BustierChest.png differ diff --git a/Models/Warrior/Collar.png b/Models/Warrior/Collar.png new file mode 100644 index 000000000..a53ed35c5 Binary files /dev/null and b/Models/Warrior/Collar.png differ diff --git a/Models/Warrior/FootShoeLeftHogtie.png b/Models/Warrior/FootShoeLeftHogtie.png new file mode 100644 index 000000000..0a8cd9e75 Binary files /dev/null and b/Models/Warrior/FootShoeLeftHogtie.png differ diff --git a/Models/Warrior/ForeGloveLeftCrossed.png b/Models/Warrior/ForeGloveLeftCrossed.png new file mode 100644 index 000000000..924a41631 Binary files /dev/null and b/Models/Warrior/ForeGloveLeftCrossed.png differ diff --git a/Models/Warrior/ForeGloveLeftFront.png b/Models/Warrior/ForeGloveLeftFront.png new file mode 100644 index 000000000..606200976 Binary files /dev/null and b/Models/Warrior/ForeGloveLeftFront.png differ diff --git a/Models/Warrior/ForeGloveRightCrossed.png b/Models/Warrior/ForeGloveRightCrossed.png new file mode 100644 index 000000000..02bcd354e Binary files /dev/null and b/Models/Warrior/ForeGloveRightCrossed.png differ diff --git a/Models/Warrior/ForeGloveRightFront.png b/Models/Warrior/ForeGloveRightFront.png new file mode 100644 index 000000000..b6b5343f4 Binary files /dev/null and b/Models/Warrior/ForeGloveRightFront.png differ diff --git a/Models/Warrior/GloveLeftBoxtie.png b/Models/Warrior/GloveLeftBoxtie.png new file mode 100644 index 000000000..ad10d8f13 Binary files /dev/null and b/Models/Warrior/GloveLeftBoxtie.png differ diff --git a/Models/Warrior/GloveLeftCrossed.png b/Models/Warrior/GloveLeftCrossed.png new file mode 100644 index 000000000..779bfb4d7 Binary files /dev/null and b/Models/Warrior/GloveLeftCrossed.png differ diff --git a/Models/Warrior/GloveLeftFree.png b/Models/Warrior/GloveLeftFree.png new file mode 100644 index 000000000..be2fe09ab Binary files /dev/null and b/Models/Warrior/GloveLeftFree.png differ diff --git a/Models/Warrior/GloveLeftFront.png b/Models/Warrior/GloveLeftFront.png new file mode 100644 index 000000000..35964f3e0 Binary files /dev/null and b/Models/Warrior/GloveLeftFront.png differ diff --git a/Models/Warrior/GloveLeftUp.png b/Models/Warrior/GloveLeftUp.png new file mode 100644 index 000000000..9d716447b Binary files /dev/null and b/Models/Warrior/GloveLeftUp.png differ diff --git a/Models/Warrior/GloveLeftWristtie.png b/Models/Warrior/GloveLeftWristtie.png new file mode 100644 index 000000000..21e45f804 Binary files /dev/null and b/Models/Warrior/GloveLeftWristtie.png differ diff --git a/Models/Warrior/GloveLeftYoked.png b/Models/Warrior/GloveLeftYoked.png new file mode 100644 index 000000000..08d6110f1 Binary files /dev/null and b/Models/Warrior/GloveLeftYoked.png differ diff --git a/Models/Warrior/GloveRightBoxtie.png b/Models/Warrior/GloveRightBoxtie.png new file mode 100644 index 000000000..ec1edb681 Binary files /dev/null and b/Models/Warrior/GloveRightBoxtie.png differ diff --git a/Models/Warrior/GloveRightCrossed.png b/Models/Warrior/GloveRightCrossed.png new file mode 100644 index 000000000..75b15fab0 Binary files /dev/null and b/Models/Warrior/GloveRightCrossed.png differ diff --git a/Models/Warrior/GloveRightFree.png b/Models/Warrior/GloveRightFree.png new file mode 100644 index 000000000..1553520f1 Binary files /dev/null and b/Models/Warrior/GloveRightFree.png differ diff --git a/Models/Warrior/GloveRightFront.png b/Models/Warrior/GloveRightFront.png new file mode 100644 index 000000000..3c595cb02 Binary files /dev/null and b/Models/Warrior/GloveRightFront.png differ diff --git a/Models/Warrior/GloveRightUp.png b/Models/Warrior/GloveRightUp.png new file mode 100644 index 000000000..d4e27143a Binary files /dev/null and b/Models/Warrior/GloveRightUp.png differ diff --git a/Models/Warrior/GloveRightWristtie.png b/Models/Warrior/GloveRightWristtie.png new file mode 100644 index 000000000..f2e032ef1 Binary files /dev/null and b/Models/Warrior/GloveRightWristtie.png differ diff --git a/Models/Warrior/GloveRightYoked.png b/Models/Warrior/GloveRightYoked.png new file mode 100644 index 000000000..98b1b7fab Binary files /dev/null and b/Models/Warrior/GloveRightYoked.png differ diff --git a/Models/Warrior/Necklace.png b/Models/Warrior/Necklace.png new file mode 100644 index 000000000..95777cd19 Binary files /dev/null and b/Models/Warrior/Necklace.png differ diff --git a/Models/Warrior/NecklaceCharm.png b/Models/Warrior/NecklaceCharm.png new file mode 100644 index 000000000..f1aeed0a7 Binary files /dev/null and b/Models/Warrior/NecklaceCharm.png differ diff --git a/Models/Warrior/RimForeGloveLeftCrossed.png b/Models/Warrior/RimForeGloveLeftCrossed.png new file mode 100644 index 000000000..924a41631 Binary files /dev/null and b/Models/Warrior/RimForeGloveLeftCrossed.png differ diff --git a/Models/Warrior/RimForeGloveLeftFront.png b/Models/Warrior/RimForeGloveLeftFront.png new file mode 100644 index 000000000..79bc64ad6 Binary files /dev/null and b/Models/Warrior/RimForeGloveLeftFront.png differ diff --git a/Models/Warrior/RimForeGloveRightCrossed.png b/Models/Warrior/RimForeGloveRightCrossed.png new file mode 100644 index 000000000..02bcd354e Binary files /dev/null and b/Models/Warrior/RimForeGloveRightCrossed.png differ diff --git a/Models/Warrior/RimForeGloveRightFront.png b/Models/Warrior/RimForeGloveRightFront.png new file mode 100644 index 000000000..5d0cdedd8 Binary files /dev/null and b/Models/Warrior/RimForeGloveRightFront.png differ diff --git a/Models/Warrior/RimGloveLeftBoxtie.png b/Models/Warrior/RimGloveLeftBoxtie.png new file mode 100644 index 000000000..ad10d8f13 Binary files /dev/null and b/Models/Warrior/RimGloveLeftBoxtie.png differ diff --git a/Models/Warrior/RimGloveLeftCrossed.png b/Models/Warrior/RimGloveLeftCrossed.png new file mode 100644 index 000000000..779bfb4d7 Binary files /dev/null and b/Models/Warrior/RimGloveLeftCrossed.png differ diff --git a/Models/Warrior/RimGloveLeftFree.png b/Models/Warrior/RimGloveLeftFree.png new file mode 100644 index 000000000..8ba862784 Binary files /dev/null and b/Models/Warrior/RimGloveLeftFree.png differ diff --git a/Models/Warrior/RimGloveLeftFront.png b/Models/Warrior/RimGloveLeftFront.png new file mode 100644 index 000000000..35964f3e0 Binary files /dev/null and b/Models/Warrior/RimGloveLeftFront.png differ diff --git a/Models/Warrior/RimGloveLeftUp.png b/Models/Warrior/RimGloveLeftUp.png new file mode 100644 index 000000000..9d716447b Binary files /dev/null and b/Models/Warrior/RimGloveLeftUp.png differ diff --git a/Models/Warrior/RimGloveLeftWristtie.png b/Models/Warrior/RimGloveLeftWristtie.png new file mode 100644 index 000000000..21e45f804 Binary files /dev/null and b/Models/Warrior/RimGloveLeftWristtie.png differ diff --git a/Models/Warrior/RimGloveLeftYoked.png b/Models/Warrior/RimGloveLeftYoked.png new file mode 100644 index 000000000..2d850f558 Binary files /dev/null and b/Models/Warrior/RimGloveLeftYoked.png differ diff --git a/Models/Warrior/RimGloveRightBoxtie.png b/Models/Warrior/RimGloveRightBoxtie.png new file mode 100644 index 000000000..f7e5e0e8b Binary files /dev/null and b/Models/Warrior/RimGloveRightBoxtie.png differ diff --git a/Models/Warrior/RimGloveRightCrossed.png b/Models/Warrior/RimGloveRightCrossed.png new file mode 100644 index 000000000..75b15fab0 Binary files /dev/null and b/Models/Warrior/RimGloveRightCrossed.png differ diff --git a/Models/Warrior/RimGloveRightFree.png b/Models/Warrior/RimGloveRightFree.png new file mode 100644 index 000000000..2243de0c1 Binary files /dev/null and b/Models/Warrior/RimGloveRightFree.png differ diff --git a/Models/Warrior/RimGloveRightFront.png b/Models/Warrior/RimGloveRightFront.png new file mode 100644 index 000000000..3c595cb02 Binary files /dev/null and b/Models/Warrior/RimGloveRightFront.png differ diff --git a/Models/Warrior/RimGloveRightUp.png b/Models/Warrior/RimGloveRightUp.png new file mode 100644 index 000000000..d4e27143a Binary files /dev/null and b/Models/Warrior/RimGloveRightUp.png differ diff --git a/Models/Warrior/RimGloveRightWristtie.png b/Models/Warrior/RimGloveRightWristtie.png new file mode 100644 index 000000000..f2e032ef1 Binary files /dev/null and b/Models/Warrior/RimGloveRightWristtie.png differ diff --git a/Models/Warrior/RimGloveRightYoked.png b/Models/Warrior/RimGloveRightYoked.png new file mode 100644 index 000000000..34e304151 Binary files /dev/null and b/Models/Warrior/RimGloveRightYoked.png differ diff --git a/Models/Warrior/ShoeLeftClosed.png b/Models/Warrior/ShoeLeftClosed.png new file mode 100644 index 000000000..9a0debbc7 Binary files /dev/null and b/Models/Warrior/ShoeLeftClosed.png differ diff --git a/Models/Warrior/ShoeLeftClosedRopesAnkle.png b/Models/Warrior/ShoeLeftClosedRopesAnkle.png new file mode 100644 index 000000000..12d5cda8e Binary files /dev/null and b/Models/Warrior/ShoeLeftClosedRopesAnkle.png differ diff --git a/Models/Warrior/ShoeLeftHogtie.png b/Models/Warrior/ShoeLeftHogtie.png new file mode 100644 index 000000000..08d636925 Binary files /dev/null and b/Models/Warrior/ShoeLeftHogtie.png differ diff --git a/Models/Warrior/ShoeLeftKneel.png b/Models/Warrior/ShoeLeftKneel.png new file mode 100644 index 000000000..a068caf3f Binary files /dev/null and b/Models/Warrior/ShoeLeftKneel.png differ diff --git a/Models/Warrior/ShoeLeftKneelClosed.png b/Models/Warrior/ShoeLeftKneelClosed.png new file mode 100644 index 000000000..587864f81 Binary files /dev/null and b/Models/Warrior/ShoeLeftKneelClosed.png differ diff --git a/Models/Warrior/ShoeLeftKneelClosedRopesAnkle.png b/Models/Warrior/ShoeLeftKneelClosedRopesAnkle.png new file mode 100644 index 000000000..587864f81 Binary files /dev/null and b/Models/Warrior/ShoeLeftKneelClosedRopesAnkle.png differ diff --git a/Models/Warrior/ShoeLeftSpread.png b/Models/Warrior/ShoeLeftSpread.png new file mode 100644 index 000000000..06c48cb4b Binary files /dev/null and b/Models/Warrior/ShoeLeftSpread.png differ diff --git a/Models/Warrior/ShoeRightClosed.png b/Models/Warrior/ShoeRightClosed.png new file mode 100644 index 000000000..83a568ce1 Binary files /dev/null and b/Models/Warrior/ShoeRightClosed.png differ diff --git a/Models/Warrior/ShoeRightClosedRopesAnkle.png b/Models/Warrior/ShoeRightClosedRopesAnkle.png new file mode 100644 index 000000000..e64d8e563 Binary files /dev/null and b/Models/Warrior/ShoeRightClosedRopesAnkle.png differ diff --git a/Models/Warrior/ShoeRightKneel.png b/Models/Warrior/ShoeRightKneel.png new file mode 100644 index 000000000..3ea3ee1d4 Binary files /dev/null and b/Models/Warrior/ShoeRightKneel.png differ diff --git a/Models/Warrior/ShoeRightSpread.png b/Models/Warrior/ShoeRightSpread.png new file mode 100644 index 000000000..8ce7c02d7 Binary files /dev/null and b/Models/Warrior/ShoeRightSpread.png differ diff --git a/Models/Warrior/Skirt.png b/Models/Warrior/Skirt.png new file mode 100644 index 000000000..dba78ed72 Binary files /dev/null and b/Models/Warrior/Skirt.png differ diff --git a/Models/Warrior/SkirtCrotchStrap.png b/Models/Warrior/SkirtCrotchStrap.png new file mode 100644 index 000000000..5cb692c8c Binary files /dev/null and b/Models/Warrior/SkirtCrotchStrap.png differ diff --git a/Models/Warrior/SkirtKneel.png b/Models/Warrior/SkirtKneel.png new file mode 100644 index 000000000..95d70e34a Binary files /dev/null and b/Models/Warrior/SkirtKneel.png differ diff --git a/Models/Warrior/SkirtKneelCrotchStrap.png b/Models/Warrior/SkirtKneelCrotchStrap.png new file mode 100644 index 000000000..87bb0f05c Binary files /dev/null and b/Models/Warrior/SkirtKneelCrotchStrap.png differ diff --git a/Models/Warrior/SkirtOverKneel.png b/Models/Warrior/SkirtOverKneel.png new file mode 100644 index 000000000..5ae17bf27 Binary files /dev/null and b/Models/Warrior/SkirtOverKneel.png differ diff --git a/Models/Warrior/SkirtOverKneelCrotchStrap.png b/Models/Warrior/SkirtOverKneelCrotchStrap.png new file mode 100644 index 000000000..95e37ef25 Binary files /dev/null and b/Models/Warrior/SkirtOverKneelCrotchStrap.png differ diff --git a/Models/Weapon/LatexWhipFree.png b/Models/Weapon/LatexWhipFree.png new file mode 100644 index 000000000..19a59921e Binary files /dev/null and b/Models/Weapon/LatexWhipFree.png differ diff --git a/Models/Weapon/NightWhipFree.png b/Models/Weapon/NightWhipFree.png new file mode 100644 index 000000000..130013859 Binary files /dev/null and b/Models/Weapon/NightWhipFree.png differ diff --git a/Models/Weapon/NightWhipLightFree.png b/Models/Weapon/NightWhipLightFree.png new file mode 100644 index 000000000..ab828370e Binary files /dev/null and b/Models/Weapon/NightWhipLightFree.png differ diff --git a/Models/Witch/ApprenticeHat.png b/Models/Witch/ApprenticeHat.png new file mode 100644 index 000000000..131cc9c99 Binary files /dev/null and b/Models/Witch/ApprenticeHat.png differ diff --git a/Models/Witch/ApprenticeHatPuff.png b/Models/Witch/ApprenticeHatPuff.png new file mode 100644 index 000000000..a298ed9f6 Binary files /dev/null and b/Models/Witch/ApprenticeHatPuff.png differ diff --git a/Models/Witch/BlouseBust.png b/Models/Witch/BlouseBust.png new file mode 100644 index 000000000..0fd5ddad3 Binary files /dev/null and b/Models/Witch/BlouseBust.png differ diff --git a/Models/Witch/BlouseBustUp.png b/Models/Witch/BlouseBustUp.png new file mode 100644 index 000000000..6da9269c2 Binary files /dev/null and b/Models/Witch/BlouseBustUp.png differ diff --git a/Models/Witch/BlouseLeftBoxtie.png b/Models/Witch/BlouseLeftBoxtie.png new file mode 100644 index 000000000..3f689ae63 Binary files /dev/null and b/Models/Witch/BlouseLeftBoxtie.png differ diff --git a/Models/Witch/BlouseLeftFree.png b/Models/Witch/BlouseLeftFree.png new file mode 100644 index 000000000..e7141b1d4 Binary files /dev/null and b/Models/Witch/BlouseLeftFree.png differ diff --git a/Models/Witch/BlouseLeftFront.png b/Models/Witch/BlouseLeftFront.png new file mode 100644 index 000000000..57be81f72 Binary files /dev/null and b/Models/Witch/BlouseLeftFront.png differ diff --git a/Models/Witch/BlouseLeftUp.png b/Models/Witch/BlouseLeftUp.png new file mode 100644 index 000000000..2e16e265a Binary files /dev/null and b/Models/Witch/BlouseLeftUp.png differ diff --git a/Models/Witch/BlouseLeftWristtie.png b/Models/Witch/BlouseLeftWristtie.png new file mode 100644 index 000000000..43d839f94 Binary files /dev/null and b/Models/Witch/BlouseLeftWristtie.png differ diff --git a/Models/Witch/BlouseLeftYoked.png b/Models/Witch/BlouseLeftYoked.png new file mode 100644 index 000000000..a750e8baf Binary files /dev/null and b/Models/Witch/BlouseLeftYoked.png differ diff --git a/Models/Witch/BlouseLiner.png b/Models/Witch/BlouseLiner.png new file mode 100644 index 000000000..dbbd62356 Binary files /dev/null and b/Models/Witch/BlouseLiner.png differ diff --git a/Models/Witch/BlouseRightBoxtie.png b/Models/Witch/BlouseRightBoxtie.png new file mode 100644 index 000000000..21c751eeb Binary files /dev/null and b/Models/Witch/BlouseRightBoxtie.png differ diff --git a/Models/Witch/BlouseRightFree.png b/Models/Witch/BlouseRightFree.png new file mode 100644 index 000000000..21c751eeb Binary files /dev/null and b/Models/Witch/BlouseRightFree.png differ diff --git a/Models/Witch/BlouseRightFront.png b/Models/Witch/BlouseRightFront.png new file mode 100644 index 000000000..039b7ef67 Binary files /dev/null and b/Models/Witch/BlouseRightFront.png differ diff --git a/Models/Witch/BlouseRightUp.png b/Models/Witch/BlouseRightUp.png new file mode 100644 index 000000000..f8cb9f5af Binary files /dev/null and b/Models/Witch/BlouseRightUp.png differ diff --git a/Models/Witch/BlouseRightWristtie.png b/Models/Witch/BlouseRightWristtie.png new file mode 100644 index 000000000..21c751eeb Binary files /dev/null and b/Models/Witch/BlouseRightWristtie.png differ diff --git a/Models/Witch/BlouseRightYoked.png b/Models/Witch/BlouseRightYoked.png new file mode 100644 index 000000000..25ff8d347 Binary files /dev/null and b/Models/Witch/BlouseRightYoked.png differ diff --git a/Models/Witch/Corset.png b/Models/Witch/Corset.png new file mode 100644 index 000000000..d97d2ef94 Binary files /dev/null and b/Models/Witch/Corset.png differ diff --git a/Models/Witch/ShoeLeftClosed.png b/Models/Witch/ShoeLeftClosed.png new file mode 100644 index 000000000..c3b6630ec Binary files /dev/null and b/Models/Witch/ShoeLeftClosed.png differ diff --git a/Models/Witch/ShoeLeftHogtie.png b/Models/Witch/ShoeLeftHogtie.png new file mode 100644 index 000000000..d4307b5c7 Binary files /dev/null and b/Models/Witch/ShoeLeftHogtie.png differ diff --git a/Models/Witch/ShoeLeftKneel.png b/Models/Witch/ShoeLeftKneel.png new file mode 100644 index 000000000..94a658fc7 Binary files /dev/null and b/Models/Witch/ShoeLeftKneel.png differ diff --git a/Models/Witch/ShoeLeftKneelClosed.png b/Models/Witch/ShoeLeftKneelClosed.png new file mode 100644 index 000000000..53ff0a691 Binary files /dev/null and b/Models/Witch/ShoeLeftKneelClosed.png differ diff --git a/Models/Witch/ShoeLeftSpread.png b/Models/Witch/ShoeLeftSpread.png new file mode 100644 index 000000000..82ee3290b Binary files /dev/null and b/Models/Witch/ShoeLeftSpread.png differ diff --git a/Models/Witch/ShoeRightClosed.png b/Models/Witch/ShoeRightClosed.png new file mode 100644 index 000000000..0d81c4848 Binary files /dev/null and b/Models/Witch/ShoeRightClosed.png differ diff --git a/Models/Witch/ShoeRightKneel.png b/Models/Witch/ShoeRightKneel.png new file mode 100644 index 000000000..d1a9b4ce5 Binary files /dev/null and b/Models/Witch/ShoeRightKneel.png differ diff --git a/Models/Witch/ShoeRightSpread.png b/Models/Witch/ShoeRightSpread.png new file mode 100644 index 000000000..166c0d612 Binary files /dev/null and b/Models/Witch/ShoeRightSpread.png differ diff --git a/Models/Witch/Skirt.png b/Models/Witch/Skirt.png new file mode 100644 index 000000000..cba9706d7 Binary files /dev/null and b/Models/Witch/Skirt.png differ diff --git a/Models/Witch/SkirtBelt.png b/Models/Witch/SkirtBelt.png new file mode 100644 index 000000000..3ddc08322 Binary files /dev/null and b/Models/Witch/SkirtBelt.png differ diff --git a/Models/Witch/SkirtBeltClosed.png b/Models/Witch/SkirtBeltClosed.png new file mode 100644 index 000000000..e4187debb Binary files /dev/null and b/Models/Witch/SkirtBeltClosed.png differ diff --git a/Models/Witch/SkirtBeltKneel.png b/Models/Witch/SkirtBeltKneel.png new file mode 100644 index 000000000..708e865ba Binary files /dev/null and b/Models/Witch/SkirtBeltKneel.png differ diff --git a/Models/Witch/SkirtClosed.png b/Models/Witch/SkirtClosed.png new file mode 100644 index 000000000..49933f821 Binary files /dev/null and b/Models/Witch/SkirtClosed.png differ diff --git a/Models/Witch/SkirtClosedCrotchStrap.png b/Models/Witch/SkirtClosedCrotchStrap.png new file mode 100644 index 000000000..3bd3fa761 Binary files /dev/null and b/Models/Witch/SkirtClosedCrotchStrap.png differ diff --git a/Models/Witch/SkirtCrotchStrap.png b/Models/Witch/SkirtCrotchStrap.png new file mode 100644 index 000000000..3bd3fa761 Binary files /dev/null and b/Models/Witch/SkirtCrotchStrap.png differ diff --git a/Models/Witch/SkirtKneel.png b/Models/Witch/SkirtKneel.png new file mode 100644 index 000000000..b6241842d Binary files /dev/null and b/Models/Witch/SkirtKneel.png differ diff --git a/Models/Witch/SkirtKneelCrotchStrap.png b/Models/Witch/SkirtKneelCrotchStrap.png new file mode 100644 index 000000000..a6d1f2a06 Binary files /dev/null and b/Models/Witch/SkirtKneelCrotchStrap.png differ diff --git a/Models/Witch/SkirtOverKneel.png b/Models/Witch/SkirtOverKneel.png new file mode 100644 index 000000000..adcf37a0f Binary files /dev/null and b/Models/Witch/SkirtOverKneel.png differ diff --git a/Models/Witch/SkirtOverKneelCrotchStrap.png b/Models/Witch/SkirtOverKneelCrotchStrap.png new file mode 100644 index 000000000..5b73e4376 Binary files /dev/null and b/Models/Witch/SkirtOverKneelCrotchStrap.png differ diff --git a/Models/Witch/SkirtRuffle.png b/Models/Witch/SkirtRuffle.png new file mode 100644 index 000000000..1152e88e4 Binary files /dev/null and b/Models/Witch/SkirtRuffle.png differ diff --git a/Models/Witch/SkirtRuffleClosed.png b/Models/Witch/SkirtRuffleClosed.png new file mode 100644 index 000000000..699602b5c Binary files /dev/null and b/Models/Witch/SkirtRuffleClosed.png differ diff --git a/Models/Witch/SkirtRuffleClosedCrotchStrap.png b/Models/Witch/SkirtRuffleClosedCrotchStrap.png new file mode 100644 index 000000000..3eab8b854 Binary files /dev/null and b/Models/Witch/SkirtRuffleClosedCrotchStrap.png differ diff --git a/Models/Witch/SkirtRuffleCrotchStrap.png b/Models/Witch/SkirtRuffleCrotchStrap.png new file mode 100644 index 000000000..3eab8b854 Binary files /dev/null and b/Models/Witch/SkirtRuffleCrotchStrap.png differ diff --git a/Models/Witch/SkirtRuffleKneel.png b/Models/Witch/SkirtRuffleKneel.png new file mode 100644 index 000000000..ba2676fac Binary files /dev/null and b/Models/Witch/SkirtRuffleKneel.png differ diff --git a/Models/Witch/SkirtRuffleKneelCrotchStrap.png b/Models/Witch/SkirtRuffleKneelCrotchStrap.png new file mode 100644 index 000000000..ab0654316 Binary files /dev/null and b/Models/Witch/SkirtRuffleKneelCrotchStrap.png differ diff --git a/Models/Witch/SkirtRuffleOverKneel.png b/Models/Witch/SkirtRuffleOverKneel.png new file mode 100644 index 000000000..8242bbb80 Binary files /dev/null and b/Models/Witch/SkirtRuffleOverKneel.png differ diff --git a/Models/Witch/SkirtRuffleOverKneelCrotchStrap.png b/Models/Witch/SkirtRuffleOverKneelCrotchStrap.png new file mode 100644 index 000000000..422dd8eed Binary files /dev/null and b/Models/Witch/SkirtRuffleOverKneelCrotchStrap.png differ diff --git a/Models/Witch/SkirtSplit.png b/Models/Witch/SkirtSplit.png new file mode 100644 index 000000000..0f62d3ee6 Binary files /dev/null and b/Models/Witch/SkirtSplit.png differ diff --git a/Models/Witch/SkirtSplitClosed.png b/Models/Witch/SkirtSplitClosed.png new file mode 100644 index 000000000..8976c3c3a Binary files /dev/null and b/Models/Witch/SkirtSplitClosed.png differ diff --git a/Models/Witch/SkirtSplitKneel.png b/Models/Witch/SkirtSplitKneel.png new file mode 100644 index 000000000..66e038ab7 Binary files /dev/null and b/Models/Witch/SkirtSplitKneel.png differ diff --git a/Models/Witch/SkirtSplitOverKneel.png b/Models/Witch/SkirtSplitOverKneel.png new file mode 100644 index 000000000..144114e4d Binary files /dev/null and b/Models/Witch/SkirtSplitOverKneel.png differ diff --git a/Models/Witch/WitchHat.png b/Models/Witch/WitchHat.png new file mode 100644 index 000000000..0d01f15d9 Binary files /dev/null and b/Models/Witch/WitchHat.png differ diff --git a/Models/Witch/WitchHatBack.png b/Models/Witch/WitchHatBack.png new file mode 100644 index 000000000..01d53286f Binary files /dev/null and b/Models/Witch/WitchHatBack.png differ diff --git a/Models/Wolf/AnkleLeftClosed.png b/Models/Wolf/AnkleLeftClosed.png new file mode 100644 index 000000000..7a9de30b3 Binary files /dev/null and b/Models/Wolf/AnkleLeftClosed.png differ diff --git a/Models/Wolf/AnkleLeftKneel.png b/Models/Wolf/AnkleLeftKneel.png new file mode 100644 index 000000000..d9848653b Binary files /dev/null and b/Models/Wolf/AnkleLeftKneel.png differ diff --git a/Models/Wolf/AnkleLeftKneelClosed.png b/Models/Wolf/AnkleLeftKneelClosed.png new file mode 100644 index 000000000..1c0088bc6 Binary files /dev/null and b/Models/Wolf/AnkleLeftKneelClosed.png differ diff --git a/Models/Wolf/AnkleLeftSpread.png b/Models/Wolf/AnkleLeftSpread.png new file mode 100644 index 000000000..a4d56fe13 Binary files /dev/null and b/Models/Wolf/AnkleLeftSpread.png differ diff --git a/Models/Wolf/AnkleRightClosed.png b/Models/Wolf/AnkleRightClosed.png new file mode 100644 index 000000000..f5a55358c Binary files /dev/null and b/Models/Wolf/AnkleRightClosed.png differ diff --git a/Models/Wolf/AnkleRightSpread.png b/Models/Wolf/AnkleRightSpread.png new file mode 100644 index 000000000..9df120e16 Binary files /dev/null and b/Models/Wolf/AnkleRightSpread.png differ diff --git a/Models/Wolf/BandAnkleLeftClosed.png b/Models/Wolf/BandAnkleLeftClosed.png new file mode 100644 index 000000000..bdcff9e56 Binary files /dev/null and b/Models/Wolf/BandAnkleLeftClosed.png differ diff --git a/Models/Wolf/BandAnkleLeftKneel.png b/Models/Wolf/BandAnkleLeftKneel.png new file mode 100644 index 000000000..fa8efe3b2 Binary files /dev/null and b/Models/Wolf/BandAnkleLeftKneel.png differ diff --git a/Models/Wolf/BandAnkleLeftKneelClosed.png b/Models/Wolf/BandAnkleLeftKneelClosed.png new file mode 100644 index 000000000..d510f33d7 Binary files /dev/null and b/Models/Wolf/BandAnkleLeftKneelClosed.png differ diff --git a/Models/Wolf/BandAnkleLeftSpread.png b/Models/Wolf/BandAnkleLeftSpread.png new file mode 100644 index 000000000..f9279b1e7 Binary files /dev/null and b/Models/Wolf/BandAnkleLeftSpread.png differ diff --git a/Models/Wolf/BandAnkleRightClosed.png b/Models/Wolf/BandAnkleRightClosed.png new file mode 100644 index 000000000..ec068ddd5 Binary files /dev/null and b/Models/Wolf/BandAnkleRightClosed.png differ diff --git a/Models/Wolf/BandAnkleRightSpread.png b/Models/Wolf/BandAnkleRightSpread.png new file mode 100644 index 000000000..b3617d356 Binary files /dev/null and b/Models/Wolf/BandAnkleRightSpread.png differ diff --git a/Models/Wolf/BeltBandMid.png b/Models/Wolf/BeltBandMid.png new file mode 100644 index 000000000..6af4cfb20 Binary files /dev/null and b/Models/Wolf/BeltBandMid.png differ diff --git a/Models/Wolf/BeltHardwareMid.png b/Models/Wolf/BeltHardwareMid.png new file mode 100644 index 000000000..b9e987251 Binary files /dev/null and b/Models/Wolf/BeltHardwareMid.png differ diff --git a/Models/Wolf/BeltMid.png b/Models/Wolf/BeltMid.png new file mode 100644 index 000000000..2a08250c2 Binary files /dev/null and b/Models/Wolf/BeltMid.png differ diff --git a/Models/Wolf/Collar.png b/Models/Wolf/Collar.png new file mode 100644 index 000000000..1adea48f0 Binary files /dev/null and b/Models/Wolf/Collar.png differ diff --git a/Models/Wolf/CollarBand.png b/Models/Wolf/CollarBand.png new file mode 100644 index 000000000..823d68633 Binary files /dev/null and b/Models/Wolf/CollarBand.png differ diff --git a/Models/Wolf/CollarHardware.png b/Models/Wolf/CollarHardware.png new file mode 100644 index 000000000..932bc5547 Binary files /dev/null and b/Models/Wolf/CollarHardware.png differ diff --git a/Models/Wolf/CollarTag.png b/Models/Wolf/CollarTag.png new file mode 100644 index 000000000..113572ace Binary files /dev/null and b/Models/Wolf/CollarTag.png differ diff --git a/Models/Wolf/FCollar.png b/Models/Wolf/FCollar.png new file mode 100644 index 000000000..10c1d043a Binary files /dev/null and b/Models/Wolf/FCollar.png differ diff --git a/Models/Wolf/FCollarBand.png b/Models/Wolf/FCollarBand.png new file mode 100644 index 000000000..434e3caf3 Binary files /dev/null and b/Models/Wolf/FCollarBand.png differ diff --git a/Models/Wolf/FCollarHardware.png b/Models/Wolf/FCollarHardware.png new file mode 100644 index 000000000..fc944e078 Binary files /dev/null and b/Models/Wolf/FCollarHardware.png differ diff --git a/Models/Wolf/FCollarTag.png b/Models/Wolf/FCollarTag.png new file mode 100644 index 000000000..52f0f6553 Binary files /dev/null and b/Models/Wolf/FCollarTag.png differ diff --git a/Models/Wolf/HarnessBandLower.png b/Models/Wolf/HarnessBandLower.png new file mode 100644 index 000000000..4ec1205aa Binary files /dev/null and b/Models/Wolf/HarnessBandLower.png differ diff --git a/Models/Wolf/HarnessBandLowerClosed.png b/Models/Wolf/HarnessBandLowerClosed.png new file mode 100644 index 000000000..c2668843b Binary files /dev/null and b/Models/Wolf/HarnessBandLowerClosed.png differ diff --git a/Models/Wolf/HarnessBandLowerKneel.png b/Models/Wolf/HarnessBandLowerKneel.png new file mode 100644 index 000000000..904cf5f75 Binary files /dev/null and b/Models/Wolf/HarnessBandLowerKneel.png differ diff --git a/Models/Wolf/HarnessBandUpper.png b/Models/Wolf/HarnessBandUpper.png new file mode 100644 index 000000000..20c1d261a Binary files /dev/null and b/Models/Wolf/HarnessBandUpper.png differ diff --git a/Models/Wolf/HarnessHardwareLower.png b/Models/Wolf/HarnessHardwareLower.png new file mode 100644 index 000000000..ab7deb9dc Binary files /dev/null and b/Models/Wolf/HarnessHardwareLower.png differ diff --git a/Models/Wolf/HarnessHardwareLowerClosed.png b/Models/Wolf/HarnessHardwareLowerClosed.png new file mode 100644 index 000000000..ab7deb9dc Binary files /dev/null and b/Models/Wolf/HarnessHardwareLowerClosed.png differ diff --git a/Models/Wolf/HarnessHardwareLowerKneel.png b/Models/Wolf/HarnessHardwareLowerKneel.png new file mode 100644 index 000000000..ddd3b9569 Binary files /dev/null and b/Models/Wolf/HarnessHardwareLowerKneel.png differ diff --git a/Models/Wolf/HarnessHardwareMid.png b/Models/Wolf/HarnessHardwareMid.png new file mode 100644 index 000000000..1e8524c39 Binary files /dev/null and b/Models/Wolf/HarnessHardwareMid.png differ diff --git a/Models/Wolf/HarnessHardwareMidKneel.png b/Models/Wolf/HarnessHardwareMidKneel.png new file mode 100644 index 000000000..8b4a71920 Binary files /dev/null and b/Models/Wolf/HarnessHardwareMidKneel.png differ diff --git a/Models/Wolf/HarnessLower.png b/Models/Wolf/HarnessLower.png new file mode 100644 index 000000000..738a308d8 Binary files /dev/null and b/Models/Wolf/HarnessLower.png differ diff --git a/Models/Wolf/HarnessLowerClosed.png b/Models/Wolf/HarnessLowerClosed.png new file mode 100644 index 000000000..4812a8e8d Binary files /dev/null and b/Models/Wolf/HarnessLowerClosed.png differ diff --git a/Models/Wolf/HarnessLowerKneel.png b/Models/Wolf/HarnessLowerKneel.png new file mode 100644 index 000000000..a97440b1d Binary files /dev/null and b/Models/Wolf/HarnessLowerKneel.png differ diff --git a/Models/Wolf/HarnessMid.png b/Models/Wolf/HarnessMid.png new file mode 100644 index 000000000..b43453929 Binary files /dev/null and b/Models/Wolf/HarnessMid.png differ diff --git a/Models/Wolf/HarnessMidKneel.png b/Models/Wolf/HarnessMidKneel.png new file mode 100644 index 000000000..ccb3a6c0d Binary files /dev/null and b/Models/Wolf/HarnessMidKneel.png differ diff --git a/Models/Wolf/HarnessUpper.png b/Models/Wolf/HarnessUpper.png new file mode 100644 index 000000000..bb7b441ab Binary files /dev/null and b/Models/Wolf/HarnessUpper.png differ diff --git a/Models/Wolf/Module.png b/Models/Wolf/Module.png new file mode 100644 index 000000000..977eb147e Binary files /dev/null and b/Models/Wolf/Module.png differ diff --git a/Models/Wolf/ModuleDisplay.png b/Models/Wolf/ModuleDisplay.png new file mode 100644 index 000000000..d5354cf7c Binary files /dev/null and b/Models/Wolf/ModuleDisplay.png differ diff --git a/Models/Wolf/Panties.png b/Models/Wolf/Panties.png new file mode 100644 index 000000000..b5965333b Binary files /dev/null and b/Models/Wolf/Panties.png differ diff --git a/Models/Wolf/PantiesClosed.png b/Models/Wolf/PantiesClosed.png new file mode 100644 index 000000000..91fd906df Binary files /dev/null and b/Models/Wolf/PantiesClosed.png differ diff --git a/Models/Wolf/PantiesKneel.png b/Models/Wolf/PantiesKneel.png new file mode 100644 index 000000000..2fc338e23 Binary files /dev/null and b/Models/Wolf/PantiesKneel.png differ diff --git a/Models/WolfCatsuit/BandForeGloveLeftCrossed.png b/Models/WolfCatsuit/BandForeGloveLeftCrossed.png new file mode 100644 index 000000000..924a41631 Binary files /dev/null and b/Models/WolfCatsuit/BandForeGloveLeftCrossed.png differ diff --git a/Models/WolfCatsuit/BandForeGloveLeftFront.png b/Models/WolfCatsuit/BandForeGloveLeftFront.png new file mode 100644 index 000000000..246f4c2c5 Binary files /dev/null and b/Models/WolfCatsuit/BandForeGloveLeftFront.png differ diff --git a/Models/WolfCatsuit/BandForeGloveRightCrossed.png b/Models/WolfCatsuit/BandForeGloveRightCrossed.png new file mode 100644 index 000000000..02bcd354e Binary files /dev/null and b/Models/WolfCatsuit/BandForeGloveRightCrossed.png differ diff --git a/Models/WolfCatsuit/BandForeGloveRightFront.png b/Models/WolfCatsuit/BandForeGloveRightFront.png new file mode 100644 index 000000000..cf74cc0f3 Binary files /dev/null and b/Models/WolfCatsuit/BandForeGloveRightFront.png differ diff --git a/Models/WolfCatsuit/BandGloveLeftBoxtie.png b/Models/WolfCatsuit/BandGloveLeftBoxtie.png new file mode 100644 index 000000000..ad10d8f13 Binary files /dev/null and b/Models/WolfCatsuit/BandGloveLeftBoxtie.png differ diff --git a/Models/WolfCatsuit/BandGloveLeftCrossed.png b/Models/WolfCatsuit/BandGloveLeftCrossed.png new file mode 100644 index 000000000..779bfb4d7 Binary files /dev/null and b/Models/WolfCatsuit/BandGloveLeftCrossed.png differ diff --git a/Models/WolfCatsuit/BandGloveLeftFree.png b/Models/WolfCatsuit/BandGloveLeftFree.png new file mode 100644 index 000000000..ec641a7f3 Binary files /dev/null and b/Models/WolfCatsuit/BandGloveLeftFree.png differ diff --git a/Models/WolfCatsuit/BandGloveLeftFront.png b/Models/WolfCatsuit/BandGloveLeftFront.png new file mode 100644 index 000000000..35964f3e0 Binary files /dev/null and b/Models/WolfCatsuit/BandGloveLeftFront.png differ diff --git a/Models/WolfCatsuit/BandGloveLeftUp.png b/Models/WolfCatsuit/BandGloveLeftUp.png new file mode 100644 index 000000000..9d716447b Binary files /dev/null and b/Models/WolfCatsuit/BandGloveLeftUp.png differ diff --git a/Models/WolfCatsuit/BandGloveLeftWristtie.png b/Models/WolfCatsuit/BandGloveLeftWristtie.png new file mode 100644 index 000000000..21e45f804 Binary files /dev/null and b/Models/WolfCatsuit/BandGloveLeftWristtie.png differ diff --git a/Models/WolfCatsuit/BandGloveLeftYoked.png b/Models/WolfCatsuit/BandGloveLeftYoked.png new file mode 100644 index 000000000..4ed42b345 Binary files /dev/null and b/Models/WolfCatsuit/BandGloveLeftYoked.png differ diff --git a/Models/WolfCatsuit/BandGloveRightBoxtie.png b/Models/WolfCatsuit/BandGloveRightBoxtie.png new file mode 100644 index 000000000..9e7002eae Binary files /dev/null and b/Models/WolfCatsuit/BandGloveRightBoxtie.png differ diff --git a/Models/WolfCatsuit/BandGloveRightCrossed.png b/Models/WolfCatsuit/BandGloveRightCrossed.png new file mode 100644 index 000000000..75b15fab0 Binary files /dev/null and b/Models/WolfCatsuit/BandGloveRightCrossed.png differ diff --git a/Models/WolfCatsuit/BandGloveRightFree.png b/Models/WolfCatsuit/BandGloveRightFree.png new file mode 100644 index 000000000..90bf8e2a3 Binary files /dev/null and b/Models/WolfCatsuit/BandGloveRightFree.png differ diff --git a/Models/WolfCatsuit/BandGloveRightFront.png b/Models/WolfCatsuit/BandGloveRightFront.png new file mode 100644 index 000000000..3c595cb02 Binary files /dev/null and b/Models/WolfCatsuit/BandGloveRightFront.png differ diff --git a/Models/WolfCatsuit/BandGloveRightUp.png b/Models/WolfCatsuit/BandGloveRightUp.png new file mode 100644 index 000000000..d4e27143a Binary files /dev/null and b/Models/WolfCatsuit/BandGloveRightUp.png differ diff --git a/Models/WolfCatsuit/BandGloveRightWristtie.png b/Models/WolfCatsuit/BandGloveRightWristtie.png new file mode 100644 index 000000000..f2e032ef1 Binary files /dev/null and b/Models/WolfCatsuit/BandGloveRightWristtie.png differ diff --git a/Models/WolfCatsuit/BandGloveRightYoked.png b/Models/WolfCatsuit/BandGloveRightYoked.png new file mode 100644 index 000000000..f3992816d Binary files /dev/null and b/Models/WolfCatsuit/BandGloveRightYoked.png differ diff --git a/Models/WolfCatsuit/ButtKneel.png b/Models/WolfCatsuit/ButtKneel.png new file mode 100644 index 000000000..9eeb55bdd Binary files /dev/null and b/Models/WolfCatsuit/ButtKneel.png differ diff --git a/Models/WolfCatsuit/Chest.png b/Models/WolfCatsuit/Chest.png new file mode 100644 index 000000000..4aac55eba Binary files /dev/null and b/Models/WolfCatsuit/Chest.png differ diff --git a/Models/WolfCatsuit/Chest2.png b/Models/WolfCatsuit/Chest2.png new file mode 100644 index 000000000..d1ff77b81 Binary files /dev/null and b/Models/WolfCatsuit/Chest2.png differ diff --git a/Models/WolfCatsuit/ChestBand.png b/Models/WolfCatsuit/ChestBand.png new file mode 100644 index 000000000..cf53a848b Binary files /dev/null and b/Models/WolfCatsuit/ChestBand.png differ diff --git a/Models/WolfCatsuit/ChestRim.png b/Models/WolfCatsuit/ChestRim.png new file mode 100644 index 000000000..07fe0e347 Binary files /dev/null and b/Models/WolfCatsuit/ChestRim.png differ diff --git a/Models/WolfCatsuit/ForeGloveLeftCrossed.png b/Models/WolfCatsuit/ForeGloveLeftCrossed.png new file mode 100644 index 000000000..c998691f3 Binary files /dev/null and b/Models/WolfCatsuit/ForeGloveLeftCrossed.png differ diff --git a/Models/WolfCatsuit/ForeGloveLeftFront.png b/Models/WolfCatsuit/ForeGloveLeftFront.png new file mode 100644 index 000000000..da5ecaae1 Binary files /dev/null and b/Models/WolfCatsuit/ForeGloveLeftFront.png differ diff --git a/Models/WolfCatsuit/ForeGloveRightCrossed.png b/Models/WolfCatsuit/ForeGloveRightCrossed.png new file mode 100644 index 000000000..58c55936e Binary files /dev/null and b/Models/WolfCatsuit/ForeGloveRightCrossed.png differ diff --git a/Models/WolfCatsuit/ForeGloveRightFront.png b/Models/WolfCatsuit/ForeGloveRightFront.png new file mode 100644 index 000000000..0dccdab3a Binary files /dev/null and b/Models/WolfCatsuit/ForeGloveRightFront.png differ diff --git a/Models/WolfCatsuit/GloveLeftBoxtie.png b/Models/WolfCatsuit/GloveLeftBoxtie.png new file mode 100644 index 000000000..6497442c6 Binary files /dev/null and b/Models/WolfCatsuit/GloveLeftBoxtie.png differ diff --git a/Models/WolfCatsuit/GloveLeftCrossed.png b/Models/WolfCatsuit/GloveLeftCrossed.png new file mode 100644 index 000000000..5b687081c Binary files /dev/null and b/Models/WolfCatsuit/GloveLeftCrossed.png differ diff --git a/Models/WolfCatsuit/GloveLeftFree.png b/Models/WolfCatsuit/GloveLeftFree.png new file mode 100644 index 000000000..0662c4067 Binary files /dev/null and b/Models/WolfCatsuit/GloveLeftFree.png differ diff --git a/Models/WolfCatsuit/GloveLeftFront.png b/Models/WolfCatsuit/GloveLeftFront.png new file mode 100644 index 000000000..23d29b2e6 Binary files /dev/null and b/Models/WolfCatsuit/GloveLeftFront.png differ diff --git a/Models/WolfCatsuit/GloveLeftUp.png b/Models/WolfCatsuit/GloveLeftUp.png new file mode 100644 index 000000000..75705a243 Binary files /dev/null and b/Models/WolfCatsuit/GloveLeftUp.png differ diff --git a/Models/WolfCatsuit/GloveLeftWristtie.png b/Models/WolfCatsuit/GloveLeftWristtie.png new file mode 100644 index 000000000..46d3ed898 Binary files /dev/null and b/Models/WolfCatsuit/GloveLeftWristtie.png differ diff --git a/Models/WolfCatsuit/GloveLeftYoked.png b/Models/WolfCatsuit/GloveLeftYoked.png new file mode 100644 index 000000000..d27c9df7a Binary files /dev/null and b/Models/WolfCatsuit/GloveLeftYoked.png differ diff --git a/Models/WolfCatsuit/GloveRightBoxtie.png b/Models/WolfCatsuit/GloveRightBoxtie.png new file mode 100644 index 000000000..bb53097bc Binary files /dev/null and b/Models/WolfCatsuit/GloveRightBoxtie.png differ diff --git a/Models/WolfCatsuit/GloveRightCrossed.png b/Models/WolfCatsuit/GloveRightCrossed.png new file mode 100644 index 000000000..a3b3877fa Binary files /dev/null and b/Models/WolfCatsuit/GloveRightCrossed.png differ diff --git a/Models/WolfCatsuit/GloveRightFree.png b/Models/WolfCatsuit/GloveRightFree.png new file mode 100644 index 000000000..8f16f065c Binary files /dev/null and b/Models/WolfCatsuit/GloveRightFree.png differ diff --git a/Models/WolfCatsuit/GloveRightFront.png b/Models/WolfCatsuit/GloveRightFront.png new file mode 100644 index 000000000..f5578416f Binary files /dev/null and b/Models/WolfCatsuit/GloveRightFront.png differ diff --git a/Models/WolfCatsuit/GloveRightUp.png b/Models/WolfCatsuit/GloveRightUp.png new file mode 100644 index 000000000..943b68123 Binary files /dev/null and b/Models/WolfCatsuit/GloveRightUp.png differ diff --git a/Models/WolfCatsuit/GloveRightWristtie.png b/Models/WolfCatsuit/GloveRightWristtie.png new file mode 100644 index 000000000..05c1930cb Binary files /dev/null and b/Models/WolfCatsuit/GloveRightWristtie.png differ diff --git a/Models/WolfCatsuit/GloveRightYoked.png b/Models/WolfCatsuit/GloveRightYoked.png new file mode 100644 index 000000000..596a3a873 Binary files /dev/null and b/Models/WolfCatsuit/GloveRightYoked.png differ diff --git a/Models/WolfCatsuit/LegBandLeftClosed.png b/Models/WolfCatsuit/LegBandLeftClosed.png new file mode 100644 index 000000000..295731ad8 Binary files /dev/null and b/Models/WolfCatsuit/LegBandLeftClosed.png differ diff --git a/Models/WolfCatsuit/LegBandLeftHogtie.png b/Models/WolfCatsuit/LegBandLeftHogtie.png new file mode 100644 index 000000000..352d86c64 Binary files /dev/null and b/Models/WolfCatsuit/LegBandLeftHogtie.png differ diff --git a/Models/WolfCatsuit/LegBandLeftKneel.png b/Models/WolfCatsuit/LegBandLeftKneel.png new file mode 100644 index 000000000..2413c109f Binary files /dev/null and b/Models/WolfCatsuit/LegBandLeftKneel.png differ diff --git a/Models/WolfCatsuit/LegBandLeftKneelClosed.png b/Models/WolfCatsuit/LegBandLeftKneelClosed.png new file mode 100644 index 000000000..976dd5e59 Binary files /dev/null and b/Models/WolfCatsuit/LegBandLeftKneelClosed.png differ diff --git a/Models/WolfCatsuit/LegBandLeftSpread.png b/Models/WolfCatsuit/LegBandLeftSpread.png new file mode 100644 index 000000000..a871ead3a Binary files /dev/null and b/Models/WolfCatsuit/LegBandLeftSpread.png differ diff --git a/Models/WolfCatsuit/LegBandRightClosed.png b/Models/WolfCatsuit/LegBandRightClosed.png new file mode 100644 index 000000000..37291e9eb Binary files /dev/null and b/Models/WolfCatsuit/LegBandRightClosed.png differ diff --git a/Models/WolfCatsuit/LegBandRightHogtie.png b/Models/WolfCatsuit/LegBandRightHogtie.png new file mode 100644 index 000000000..e5fc806ec Binary files /dev/null and b/Models/WolfCatsuit/LegBandRightHogtie.png differ diff --git a/Models/WolfCatsuit/LegBandRightKneel.png b/Models/WolfCatsuit/LegBandRightKneel.png new file mode 100644 index 000000000..eacedfabe Binary files /dev/null and b/Models/WolfCatsuit/LegBandRightKneel.png differ diff --git a/Models/WolfCatsuit/LegBandRightKneelClosed.png b/Models/WolfCatsuit/LegBandRightKneelClosed.png new file mode 100644 index 000000000..ba01ceba1 Binary files /dev/null and b/Models/WolfCatsuit/LegBandRightKneelClosed.png differ diff --git a/Models/WolfCatsuit/LegBandRightSpread.png b/Models/WolfCatsuit/LegBandRightSpread.png new file mode 100644 index 000000000..57d5ffca6 Binary files /dev/null and b/Models/WolfCatsuit/LegBandRightSpread.png differ diff --git a/Models/WolfCatsuit/LegLeftClosed.png b/Models/WolfCatsuit/LegLeftClosed.png new file mode 100644 index 000000000..3d5ddd27c Binary files /dev/null and b/Models/WolfCatsuit/LegLeftClosed.png differ diff --git a/Models/WolfCatsuit/LegLeftHogtie.png b/Models/WolfCatsuit/LegLeftHogtie.png new file mode 100644 index 000000000..62b957a89 Binary files /dev/null and b/Models/WolfCatsuit/LegLeftHogtie.png differ diff --git a/Models/WolfCatsuit/LegLeftKneel.png b/Models/WolfCatsuit/LegLeftKneel.png new file mode 100644 index 000000000..d29fd8807 Binary files /dev/null and b/Models/WolfCatsuit/LegLeftKneel.png differ diff --git a/Models/WolfCatsuit/LegLeftKneelClosed.png b/Models/WolfCatsuit/LegLeftKneelClosed.png new file mode 100644 index 000000000..8e64ce1b7 Binary files /dev/null and b/Models/WolfCatsuit/LegLeftKneelClosed.png differ diff --git a/Models/WolfCatsuit/LegLeftSpread.png b/Models/WolfCatsuit/LegLeftSpread.png new file mode 100644 index 000000000..4d063c2e8 Binary files /dev/null and b/Models/WolfCatsuit/LegLeftSpread.png differ diff --git a/Models/WolfCatsuit/LegPadsLeftClosed.png b/Models/WolfCatsuit/LegPadsLeftClosed.png new file mode 100644 index 000000000..e680f7ecb Binary files /dev/null and b/Models/WolfCatsuit/LegPadsLeftClosed.png differ diff --git a/Models/WolfCatsuit/LegPadsLeftHogtie.png b/Models/WolfCatsuit/LegPadsLeftHogtie.png new file mode 100644 index 000000000..8245542c6 Binary files /dev/null and b/Models/WolfCatsuit/LegPadsLeftHogtie.png differ diff --git a/Models/WolfCatsuit/LegPadsLeftKneel.png b/Models/WolfCatsuit/LegPadsLeftKneel.png new file mode 100644 index 000000000..205725c9b Binary files /dev/null and b/Models/WolfCatsuit/LegPadsLeftKneel.png differ diff --git a/Models/WolfCatsuit/LegPadsLeftKneelClosed.png b/Models/WolfCatsuit/LegPadsLeftKneelClosed.png new file mode 100644 index 000000000..f5725fb8a Binary files /dev/null and b/Models/WolfCatsuit/LegPadsLeftKneelClosed.png differ diff --git a/Models/WolfCatsuit/LegPadsLeftSpread.png b/Models/WolfCatsuit/LegPadsLeftSpread.png new file mode 100644 index 000000000..aaac4c5d4 Binary files /dev/null and b/Models/WolfCatsuit/LegPadsLeftSpread.png differ diff --git a/Models/WolfCatsuit/LegPadsRightClosed.png b/Models/WolfCatsuit/LegPadsRightClosed.png new file mode 100644 index 000000000..da213ee70 Binary files /dev/null and b/Models/WolfCatsuit/LegPadsRightClosed.png differ diff --git a/Models/WolfCatsuit/LegPadsRightHogtie.png b/Models/WolfCatsuit/LegPadsRightHogtie.png new file mode 100644 index 000000000..c49e2bafb Binary files /dev/null and b/Models/WolfCatsuit/LegPadsRightHogtie.png differ diff --git a/Models/WolfCatsuit/LegPadsRightKneel.png b/Models/WolfCatsuit/LegPadsRightKneel.png new file mode 100644 index 000000000..f585d6b6d Binary files /dev/null and b/Models/WolfCatsuit/LegPadsRightKneel.png differ diff --git a/Models/WolfCatsuit/LegPadsRightKneelClosed.png b/Models/WolfCatsuit/LegPadsRightKneelClosed.png new file mode 100644 index 000000000..f585d6b6d Binary files /dev/null and b/Models/WolfCatsuit/LegPadsRightKneelClosed.png differ diff --git a/Models/WolfCatsuit/LegPadsRightSpread.png b/Models/WolfCatsuit/LegPadsRightSpread.png new file mode 100644 index 000000000..f56bf466d Binary files /dev/null and b/Models/WolfCatsuit/LegPadsRightSpread.png differ diff --git a/Models/WolfCatsuit/LegRightClosed.png b/Models/WolfCatsuit/LegRightClosed.png new file mode 100644 index 000000000..58513f108 Binary files /dev/null and b/Models/WolfCatsuit/LegRightClosed.png differ diff --git a/Models/WolfCatsuit/LegRightHogtie.png b/Models/WolfCatsuit/LegRightHogtie.png new file mode 100644 index 000000000..de4cfe051 Binary files /dev/null and b/Models/WolfCatsuit/LegRightHogtie.png differ diff --git a/Models/WolfCatsuit/LegRightKneel.png b/Models/WolfCatsuit/LegRightKneel.png new file mode 100644 index 000000000..2b6aff0c3 Binary files /dev/null and b/Models/WolfCatsuit/LegRightKneel.png differ diff --git a/Models/WolfCatsuit/LegRightKneelClosed.png b/Models/WolfCatsuit/LegRightKneelClosed.png new file mode 100644 index 000000000..0b6e7f58f Binary files /dev/null and b/Models/WolfCatsuit/LegRightKneelClosed.png differ diff --git a/Models/WolfCatsuit/LegRightSpread.png b/Models/WolfCatsuit/LegRightSpread.png new file mode 100644 index 000000000..37a5b2e57 Binary files /dev/null and b/Models/WolfCatsuit/LegRightSpread.png differ diff --git a/Models/WolfCatsuit/LegRimLeftClosed.png b/Models/WolfCatsuit/LegRimLeftClosed.png new file mode 100644 index 000000000..53eac832e Binary files /dev/null and b/Models/WolfCatsuit/LegRimLeftClosed.png differ diff --git a/Models/WolfCatsuit/LegRimLeftHogtie.png b/Models/WolfCatsuit/LegRimLeftHogtie.png new file mode 100644 index 000000000..25e6b0594 Binary files /dev/null and b/Models/WolfCatsuit/LegRimLeftHogtie.png differ diff --git a/Models/WolfCatsuit/LegRimLeftKneel.png b/Models/WolfCatsuit/LegRimLeftKneel.png new file mode 100644 index 000000000..fa6399812 Binary files /dev/null and b/Models/WolfCatsuit/LegRimLeftKneel.png differ diff --git a/Models/WolfCatsuit/LegRimLeftKneelClosed.png b/Models/WolfCatsuit/LegRimLeftKneelClosed.png new file mode 100644 index 000000000..977613160 Binary files /dev/null and b/Models/WolfCatsuit/LegRimLeftKneelClosed.png differ diff --git a/Models/WolfCatsuit/LegRimLeftSpread.png b/Models/WolfCatsuit/LegRimLeftSpread.png new file mode 100644 index 000000000..8c7c2edcc Binary files /dev/null and b/Models/WolfCatsuit/LegRimLeftSpread.png differ diff --git a/Models/WolfCatsuit/LegRimRightClosed.png b/Models/WolfCatsuit/LegRimRightClosed.png new file mode 100644 index 000000000..776c616ff Binary files /dev/null and b/Models/WolfCatsuit/LegRimRightClosed.png differ diff --git a/Models/WolfCatsuit/LegRimRightHogtie.png b/Models/WolfCatsuit/LegRimRightHogtie.png new file mode 100644 index 000000000..fa63cba86 Binary files /dev/null and b/Models/WolfCatsuit/LegRimRightHogtie.png differ diff --git a/Models/WolfCatsuit/LegRimRightKneel.png b/Models/WolfCatsuit/LegRimRightKneel.png new file mode 100644 index 000000000..a7fc29ad7 Binary files /dev/null and b/Models/WolfCatsuit/LegRimRightKneel.png differ diff --git a/Models/WolfCatsuit/LegRimRightKneelClosed.png b/Models/WolfCatsuit/LegRimRightKneelClosed.png new file mode 100644 index 000000000..a7fc29ad7 Binary files /dev/null and b/Models/WolfCatsuit/LegRimRightKneelClosed.png differ diff --git a/Models/WolfCatsuit/LegRimRightSpread.png b/Models/WolfCatsuit/LegRimRightSpread.png new file mode 100644 index 000000000..738d1a206 Binary files /dev/null and b/Models/WolfCatsuit/LegRimRightSpread.png differ diff --git a/Models/WolfCatsuit/RimForeGloveLeftCrossed.png b/Models/WolfCatsuit/RimForeGloveLeftCrossed.png new file mode 100644 index 000000000..924a41631 Binary files /dev/null and b/Models/WolfCatsuit/RimForeGloveLeftCrossed.png differ diff --git a/Models/WolfCatsuit/RimForeGloveLeftFront.png b/Models/WolfCatsuit/RimForeGloveLeftFront.png new file mode 100644 index 000000000..79bc64ad6 Binary files /dev/null and b/Models/WolfCatsuit/RimForeGloveLeftFront.png differ diff --git a/Models/WolfCatsuit/RimForeGloveRightCrossed.png b/Models/WolfCatsuit/RimForeGloveRightCrossed.png new file mode 100644 index 000000000..02bcd354e Binary files /dev/null and b/Models/WolfCatsuit/RimForeGloveRightCrossed.png differ diff --git a/Models/WolfCatsuit/RimForeGloveRightFront.png b/Models/WolfCatsuit/RimForeGloveRightFront.png new file mode 100644 index 000000000..5d0cdedd8 Binary files /dev/null and b/Models/WolfCatsuit/RimForeGloveRightFront.png differ diff --git a/Models/WolfCatsuit/RimGloveLeftBoxtie.png b/Models/WolfCatsuit/RimGloveLeftBoxtie.png new file mode 100644 index 000000000..ad10d8f13 Binary files /dev/null and b/Models/WolfCatsuit/RimGloveLeftBoxtie.png differ diff --git a/Models/WolfCatsuit/RimGloveLeftCrossed.png b/Models/WolfCatsuit/RimGloveLeftCrossed.png new file mode 100644 index 000000000..779bfb4d7 Binary files /dev/null and b/Models/WolfCatsuit/RimGloveLeftCrossed.png differ diff --git a/Models/WolfCatsuit/RimGloveLeftFree.png b/Models/WolfCatsuit/RimGloveLeftFree.png new file mode 100644 index 000000000..8ba862784 Binary files /dev/null and b/Models/WolfCatsuit/RimGloveLeftFree.png differ diff --git a/Models/WolfCatsuit/RimGloveLeftFront.png b/Models/WolfCatsuit/RimGloveLeftFront.png new file mode 100644 index 000000000..35964f3e0 Binary files /dev/null and b/Models/WolfCatsuit/RimGloveLeftFront.png differ diff --git a/Models/WolfCatsuit/RimGloveLeftUp.png b/Models/WolfCatsuit/RimGloveLeftUp.png new file mode 100644 index 000000000..9d716447b Binary files /dev/null and b/Models/WolfCatsuit/RimGloveLeftUp.png differ diff --git a/Models/WolfCatsuit/RimGloveLeftWristtie.png b/Models/WolfCatsuit/RimGloveLeftWristtie.png new file mode 100644 index 000000000..21e45f804 Binary files /dev/null and b/Models/WolfCatsuit/RimGloveLeftWristtie.png differ diff --git a/Models/WolfCatsuit/RimGloveLeftYoked.png b/Models/WolfCatsuit/RimGloveLeftYoked.png new file mode 100644 index 000000000..2d850f558 Binary files /dev/null and b/Models/WolfCatsuit/RimGloveLeftYoked.png differ diff --git a/Models/WolfCatsuit/RimGloveRightBoxtie.png b/Models/WolfCatsuit/RimGloveRightBoxtie.png new file mode 100644 index 000000000..f7e5e0e8b Binary files /dev/null and b/Models/WolfCatsuit/RimGloveRightBoxtie.png differ diff --git a/Models/WolfCatsuit/RimGloveRightCrossed.png b/Models/WolfCatsuit/RimGloveRightCrossed.png new file mode 100644 index 000000000..75b15fab0 Binary files /dev/null and b/Models/WolfCatsuit/RimGloveRightCrossed.png differ diff --git a/Models/WolfCatsuit/RimGloveRightFree.png b/Models/WolfCatsuit/RimGloveRightFree.png new file mode 100644 index 000000000..2243de0c1 Binary files /dev/null and b/Models/WolfCatsuit/RimGloveRightFree.png differ diff --git a/Models/WolfCatsuit/RimGloveRightFront.png b/Models/WolfCatsuit/RimGloveRightFront.png new file mode 100644 index 000000000..3c595cb02 Binary files /dev/null and b/Models/WolfCatsuit/RimGloveRightFront.png differ diff --git a/Models/WolfCatsuit/RimGloveRightUp.png b/Models/WolfCatsuit/RimGloveRightUp.png new file mode 100644 index 000000000..d4e27143a Binary files /dev/null and b/Models/WolfCatsuit/RimGloveRightUp.png differ diff --git a/Models/WolfCatsuit/RimGloveRightWristtie.png b/Models/WolfCatsuit/RimGloveRightWristtie.png new file mode 100644 index 000000000..f2e032ef1 Binary files /dev/null and b/Models/WolfCatsuit/RimGloveRightWristtie.png differ diff --git a/Models/WolfCatsuit/RimGloveRightYoked.png b/Models/WolfCatsuit/RimGloveRightYoked.png new file mode 100644 index 000000000..34e304151 Binary files /dev/null and b/Models/WolfCatsuit/RimGloveRightYoked.png differ diff --git a/Models/WolfCatsuit/ShoeLeftClosed.png b/Models/WolfCatsuit/ShoeLeftClosed.png new file mode 100644 index 000000000..8f6122e54 Binary files /dev/null and b/Models/WolfCatsuit/ShoeLeftClosed.png differ diff --git a/Models/WolfCatsuit/ShoeLeftHogtie.png b/Models/WolfCatsuit/ShoeLeftHogtie.png new file mode 100644 index 000000000..81fd81bd8 Binary files /dev/null and b/Models/WolfCatsuit/ShoeLeftHogtie.png differ diff --git a/Models/WolfCatsuit/ShoeLeftKneel.png b/Models/WolfCatsuit/ShoeLeftKneel.png new file mode 100644 index 000000000..3c0fe484f Binary files /dev/null and b/Models/WolfCatsuit/ShoeLeftKneel.png differ diff --git a/Models/WolfCatsuit/ShoeLeftKneelClosed.png b/Models/WolfCatsuit/ShoeLeftKneelClosed.png new file mode 100644 index 000000000..d07ad3dc9 Binary files /dev/null and b/Models/WolfCatsuit/ShoeLeftKneelClosed.png differ diff --git a/Models/WolfCatsuit/ShoeLeftSpread.png b/Models/WolfCatsuit/ShoeLeftSpread.png new file mode 100644 index 000000000..f5c73f0d7 Binary files /dev/null and b/Models/WolfCatsuit/ShoeLeftSpread.png differ diff --git a/Models/WolfCatsuit/ShoeRightClosed.png b/Models/WolfCatsuit/ShoeRightClosed.png new file mode 100644 index 000000000..b0de82bd0 Binary files /dev/null and b/Models/WolfCatsuit/ShoeRightClosed.png differ diff --git a/Models/WolfCatsuit/ShoeRightKneel.png b/Models/WolfCatsuit/ShoeRightKneel.png new file mode 100644 index 000000000..4e26fa9f4 Binary files /dev/null and b/Models/WolfCatsuit/ShoeRightKneel.png differ diff --git a/Models/WolfCatsuit/ShoeRightSpread.png b/Models/WolfCatsuit/ShoeRightSpread.png new file mode 100644 index 000000000..16cd8a291 Binary files /dev/null and b/Models/WolfCatsuit/ShoeRightSpread.png differ diff --git a/Models/WolfCatsuit/TorsoLower.png b/Models/WolfCatsuit/TorsoLower.png new file mode 100644 index 000000000..b8ea2572d Binary files /dev/null and b/Models/WolfCatsuit/TorsoLower.png differ diff --git a/Models/WolfCatsuit/TorsoLowerBand.png b/Models/WolfCatsuit/TorsoLowerBand.png new file mode 100644 index 000000000..6436e2c18 Binary files /dev/null and b/Models/WolfCatsuit/TorsoLowerBand.png differ diff --git a/Models/WolfCatsuit/TorsoLowerBandClosed.png b/Models/WolfCatsuit/TorsoLowerBandClosed.png new file mode 100644 index 000000000..e15ad7bee Binary files /dev/null and b/Models/WolfCatsuit/TorsoLowerBandClosed.png differ diff --git a/Models/WolfCatsuit/TorsoLowerBandKneel.png b/Models/WolfCatsuit/TorsoLowerBandKneel.png new file mode 100644 index 000000000..76514362f Binary files /dev/null and b/Models/WolfCatsuit/TorsoLowerBandKneel.png differ diff --git a/Models/WolfCatsuit/TorsoLowerClosed.png b/Models/WolfCatsuit/TorsoLowerClosed.png new file mode 100644 index 000000000..cb54cbb87 Binary files /dev/null and b/Models/WolfCatsuit/TorsoLowerClosed.png differ diff --git a/Models/WolfCatsuit/TorsoLowerKneel.png b/Models/WolfCatsuit/TorsoLowerKneel.png new file mode 100644 index 000000000..fd007c50a Binary files /dev/null and b/Models/WolfCatsuit/TorsoLowerKneel.png differ diff --git a/Models/WolfCatsuit/TorsoLowerRim.png b/Models/WolfCatsuit/TorsoLowerRim.png new file mode 100644 index 000000000..d87e899c7 Binary files /dev/null and b/Models/WolfCatsuit/TorsoLowerRim.png differ diff --git a/Models/WolfCatsuit/TorsoLowerRimClosed.png b/Models/WolfCatsuit/TorsoLowerRimClosed.png new file mode 100644 index 000000000..d6eea0bbb Binary files /dev/null and b/Models/WolfCatsuit/TorsoLowerRimClosed.png differ diff --git a/Models/WolfCatsuit/TorsoLowerRimKneel.png b/Models/WolfCatsuit/TorsoLowerRimKneel.png new file mode 100644 index 000000000..a7728f703 Binary files /dev/null and b/Models/WolfCatsuit/TorsoLowerRimKneel.png differ diff --git a/Models/WolfCatsuit/TorsoUpper.png b/Models/WolfCatsuit/TorsoUpper.png new file mode 100644 index 000000000..63f4dc3d4 Binary files /dev/null and b/Models/WolfCatsuit/TorsoUpper.png differ diff --git a/Models/WolfCatsuit/TorsoUpper2.png b/Models/WolfCatsuit/TorsoUpper2.png new file mode 100644 index 000000000..7aa2fbe0b Binary files /dev/null and b/Models/WolfCatsuit/TorsoUpper2.png differ diff --git a/Models/WolfCatsuit/TorsoUpperBand.png b/Models/WolfCatsuit/TorsoUpperBand.png new file mode 100644 index 000000000..c73d82f0b Binary files /dev/null and b/Models/WolfCatsuit/TorsoUpperBand.png differ diff --git a/Models/WolfCatsuit/TorsoUpperBeltBuckle.png b/Models/WolfCatsuit/TorsoUpperBeltBuckle.png new file mode 100644 index 000000000..d7800c373 Binary files /dev/null and b/Models/WolfCatsuit/TorsoUpperBeltBuckle.png differ diff --git a/Models/WolfCatsuit/TorsoUpperBeltStrap.png b/Models/WolfCatsuit/TorsoUpperBeltStrap.png new file mode 100644 index 000000000..bfca92991 Binary files /dev/null and b/Models/WolfCatsuit/TorsoUpperBeltStrap.png differ diff --git a/Models/WolfCatsuit/TorsoUpperCups.png b/Models/WolfCatsuit/TorsoUpperCups.png new file mode 100644 index 000000000..499557cad Binary files /dev/null and b/Models/WolfCatsuit/TorsoUpperCups.png differ diff --git a/Models/WolfCatsuit/TorsoUpperRim.png b/Models/WolfCatsuit/TorsoUpperRim.png new file mode 100644 index 000000000..69e168b23 Binary files /dev/null and b/Models/WolfCatsuit/TorsoUpperRim.png differ diff --git a/Models/Wolfgirl/EarLeft.png b/Models/Wolfgirl/EarLeft.png new file mode 100644 index 000000000..d621db5e1 Binary files /dev/null and b/Models/Wolfgirl/EarLeft.png differ diff --git a/Models/Wolfgirl/EarRight.png b/Models/Wolfgirl/EarRight.png new file mode 100644 index 000000000..d621db5e1 Binary files /dev/null and b/Models/Wolfgirl/EarRight.png differ diff --git a/Models/Wolfgirl/HairclipLower.png b/Models/Wolfgirl/HairclipLower.png new file mode 100644 index 000000000..1d723a545 Binary files /dev/null and b/Models/Wolfgirl/HairclipLower.png differ diff --git a/Models/Wolfgirl/HairclipUpper.png b/Models/Wolfgirl/HairclipUpper.png new file mode 100644 index 000000000..1ce05ac49 Binary files /dev/null and b/Models/Wolfgirl/HairclipUpper.png differ diff --git a/Models/Wolfgirl/MascaraL.png b/Models/Wolfgirl/MascaraL.png new file mode 100644 index 000000000..8d93ede40 Binary files /dev/null and b/Models/Wolfgirl/MascaraL.png differ diff --git a/Models/Wolfgirl/MascaraR.png b/Models/Wolfgirl/MascaraR.png new file mode 100644 index 000000000..00e1655fe Binary files /dev/null and b/Models/Wolfgirl/MascaraR.png differ diff --git a/Models/Wolfgirl/Scar.png b/Models/Wolfgirl/Scar.png new file mode 100644 index 000000000..ad0c27ada Binary files /dev/null and b/Models/Wolfgirl/Scar.png differ diff --git a/Models/Yoke/HeavySteel.png b/Models/Yoke/HeavySteel.png new file mode 100644 index 000000000..822484c8a Binary files /dev/null and b/Models/Yoke/HeavySteel.png differ diff --git a/Models/Yoke/HeavySteelHardware.png b/Models/Yoke/HeavySteelHardware.png new file mode 100644 index 000000000..56ebcad3c Binary files /dev/null and b/Models/Yoke/HeavySteelHardware.png differ diff --git a/Models/Yoke/HeavySteelLock.png b/Models/Yoke/HeavySteelLock.png new file mode 100644 index 000000000..5082970c1 Binary files /dev/null and b/Models/Yoke/HeavySteelLock.png differ diff --git a/Models/Yoke/HeavySteelPins.png b/Models/Yoke/HeavySteelPins.png new file mode 100644 index 000000000..ffb32db4c Binary files /dev/null and b/Models/Yoke/HeavySteelPins.png differ diff --git a/Models/Yoke/Steel.png b/Models/Yoke/Steel.png new file mode 100644 index 000000000..cc9638e69 Binary files /dev/null and b/Models/Yoke/Steel.png differ diff --git a/Models/Yoke/SteelBar.png b/Models/Yoke/SteelBar.png new file mode 100644 index 000000000..f5755362e Binary files /dev/null and b/Models/Yoke/SteelBar.png differ diff --git a/Models/Yukata/Shirt.png b/Models/Yukata/Shirt.png new file mode 100644 index 000000000..42b5fa9a4 Binary files /dev/null and b/Models/Yukata/Shirt.png differ diff --git a/Models/Yukata/ShirtChest.png b/Models/Yukata/ShirtChest.png new file mode 100644 index 000000000..9485a480f Binary files /dev/null and b/Models/Yukata/ShirtChest.png differ diff --git a/Models/Yukata/ShirtChestTied.png b/Models/Yukata/ShirtChestTied.png new file mode 100644 index 000000000..aee3c1b0f Binary files /dev/null and b/Models/Yukata/ShirtChestTied.png differ diff --git a/Models/Yukata/ShirtChestUp.png b/Models/Yukata/ShirtChestUp.png new file mode 100644 index 000000000..87dfffdb5 Binary files /dev/null and b/Models/Yukata/ShirtChestUp.png differ diff --git a/Models/Yukata/ShirtChestYoked.png b/Models/Yukata/ShirtChestYoked.png new file mode 100644 index 000000000..c24796e71 Binary files /dev/null and b/Models/Yukata/ShirtChestYoked.png differ diff --git a/Models/Yukata/Skirt.png b/Models/Yukata/Skirt.png new file mode 100644 index 000000000..eadf59ce4 Binary files /dev/null and b/Models/Yukata/Skirt.png differ diff --git a/Models/Yukata/SkirtClosed.png b/Models/Yukata/SkirtClosed.png new file mode 100644 index 000000000..bfcba5b61 Binary files /dev/null and b/Models/Yukata/SkirtClosed.png differ diff --git a/Models/Yukata/SkirtClosedCrotchStrap.png b/Models/Yukata/SkirtClosedCrotchStrap.png new file mode 100644 index 000000000..6587435e2 Binary files /dev/null and b/Models/Yukata/SkirtClosedCrotchStrap.png differ diff --git a/Models/Yukata/SkirtCrotchStrap.png b/Models/Yukata/SkirtCrotchStrap.png new file mode 100644 index 000000000..a8616552a Binary files /dev/null and b/Models/Yukata/SkirtCrotchStrap.png differ diff --git a/Models/Yukata/SkirtHogtie.png b/Models/Yukata/SkirtHogtie.png new file mode 100644 index 000000000..f793fe99e Binary files /dev/null and b/Models/Yukata/SkirtHogtie.png differ diff --git a/Models/Yukata/SkirtHogtieCrotchStrap.png b/Models/Yukata/SkirtHogtieCrotchStrap.png new file mode 100644 index 000000000..a8616552a Binary files /dev/null and b/Models/Yukata/SkirtHogtieCrotchStrap.png differ diff --git a/Models/Yukata/SkirtKneel.png b/Models/Yukata/SkirtKneel.png new file mode 100644 index 000000000..693dedcc8 Binary files /dev/null and b/Models/Yukata/SkirtKneel.png differ diff --git a/Models/Yukata/SkirtKneelCrotchStrap.png b/Models/Yukata/SkirtKneelCrotchStrap.png new file mode 100644 index 000000000..8ed7b8851 Binary files /dev/null and b/Models/Yukata/SkirtKneelCrotchStrap.png differ diff --git a/Models/Yukata/SkirtOverKneel.png b/Models/Yukata/SkirtOverKneel.png new file mode 100644 index 000000000..1a950f33c Binary files /dev/null and b/Models/Yukata/SkirtOverKneel.png differ diff --git a/Models/Yukata/SkirtOverKneelCrotchStrap.png b/Models/Yukata/SkirtOverKneelCrotchStrap.png new file mode 100644 index 000000000..30b23c971 Binary files /dev/null and b/Models/Yukata/SkirtOverKneelCrotchStrap.png differ diff --git a/Models/Yukata/SleeveLeftBoxtie.png b/Models/Yukata/SleeveLeftBoxtie.png new file mode 100644 index 000000000..50b357e0a Binary files /dev/null and b/Models/Yukata/SleeveLeftBoxtie.png differ diff --git a/Models/Yukata/SleeveLeftFree.png b/Models/Yukata/SleeveLeftFree.png new file mode 100644 index 000000000..66f6ce0c3 Binary files /dev/null and b/Models/Yukata/SleeveLeftFree.png differ diff --git a/Models/Yukata/SleeveLeftFront.png b/Models/Yukata/SleeveLeftFront.png new file mode 100644 index 000000000..50b357e0a Binary files /dev/null and b/Models/Yukata/SleeveLeftFront.png differ diff --git a/Models/Yukata/SleeveLeftUp.png b/Models/Yukata/SleeveLeftUp.png new file mode 100644 index 000000000..cc6a90e88 Binary files /dev/null and b/Models/Yukata/SleeveLeftUp.png differ diff --git a/Models/Yukata/SleeveLeftWristtie.png b/Models/Yukata/SleeveLeftWristtie.png new file mode 100644 index 000000000..34937d285 Binary files /dev/null and b/Models/Yukata/SleeveLeftWristtie.png differ diff --git a/Models/Yukata/SleeveLeftYoked.png b/Models/Yukata/SleeveLeftYoked.png new file mode 100644 index 000000000..363be83b6 Binary files /dev/null and b/Models/Yukata/SleeveLeftYoked.png differ diff --git a/Models/Yukata/SleeveRightBoxtie.png b/Models/Yukata/SleeveRightBoxtie.png new file mode 100644 index 000000000..6fe2ae985 Binary files /dev/null and b/Models/Yukata/SleeveRightBoxtie.png differ diff --git a/Models/Yukata/SleeveRightFree.png b/Models/Yukata/SleeveRightFree.png new file mode 100644 index 000000000..2bef6d2ec Binary files /dev/null and b/Models/Yukata/SleeveRightFree.png differ diff --git a/Models/Yukata/SleeveRightFront.png b/Models/Yukata/SleeveRightFront.png new file mode 100644 index 000000000..6fe2ae985 Binary files /dev/null and b/Models/Yukata/SleeveRightFront.png differ diff --git a/Models/Yukata/SleeveRightUp.png b/Models/Yukata/SleeveRightUp.png new file mode 100644 index 000000000..1e9017711 Binary files /dev/null and b/Models/Yukata/SleeveRightUp.png differ diff --git a/Models/Yukata/SleeveRightWristtie.png b/Models/Yukata/SleeveRightWristtie.png new file mode 100644 index 000000000..5111055e4 Binary files /dev/null and b/Models/Yukata/SleeveRightWristtie.png differ diff --git a/Models/Yukata/SleeveRightYoked.png b/Models/Yukata/SleeveRightYoked.png new file mode 100644 index 000000000..114df746b Binary files /dev/null and b/Models/Yukata/SleeveRightYoked.png differ diff --git a/Models/Yukata/Waist.png b/Models/Yukata/Waist.png new file mode 100644 index 000000000..ab95d15f7 Binary files /dev/null and b/Models/Yukata/Waist.png differ diff --git a/Models/Yukata/WaistBand.png b/Models/Yukata/WaistBand.png new file mode 100644 index 000000000..7fc76aeac Binary files /dev/null and b/Models/Yukata/WaistBand.png differ diff --git a/Models/Yukata/WaistPattern.png b/Models/Yukata/WaistPattern.png new file mode 100644 index 000000000..3686cabd7 Binary files /dev/null and b/Models/Yukata/WaistPattern.png differ diff --git a/Music/AAA.ogg b/Music/AAA.ogg new file mode 100644 index 000000000..32ec09ee2 Binary files /dev/null and b/Music/AAA.ogg differ diff --git a/Music/AREA12-DOLLSTORAGE.ogg b/Music/AREA12-DOLLSTORAGE.ogg new file mode 100644 index 000000000..6c4140d37 Binary files /dev/null and b/Music/AREA12-DOLLSTORAGE.ogg differ diff --git a/Music/AREA7-LOSTTEMPLE-AMBIENT.ogg b/Music/AREA7-LOSTTEMPLE-AMBIENT.ogg new file mode 100644 index 000000000..11f3a4013 Binary files /dev/null and b/Music/AREA7-LOSTTEMPLE-AMBIENT.ogg differ diff --git a/Music/Ada18980_PlayingWithFire.ogg b/Music/Ada18980_PlayingWithFire.ogg new file mode 100644 index 000000000..92184308a Binary files /dev/null and b/Music/Ada18980_PlayingWithFire.ogg differ diff --git a/Music/Ada18980_SmokingIsBadForYou.ogg b/Music/Ada18980_SmokingIsBadForYou.ogg new file mode 100644 index 000000000..b21feab6b Binary files /dev/null and b/Music/Ada18980_SmokingIsBadForYou.ogg differ diff --git a/Music/Doll_Sorting_Room.ogg b/Music/Doll_Sorting_Room.ogg new file mode 100644 index 000000000..cc9c9d91c Binary files /dev/null and b/Music/Doll_Sorting_Room.ogg differ diff --git a/Music/Dragon Lair.ogg b/Music/Dragon Lair.ogg new file mode 100644 index 000000000..6839d8015 Binary files /dev/null and b/Music/Dragon Lair.ogg differ diff --git a/Music/EDGEOFREALITY.ogg b/Music/EDGEOFREALITY.ogg new file mode 100644 index 000000000..867eb965d Binary files /dev/null and b/Music/EDGEOFREALITY.ogg differ diff --git a/Music/Elemental_Temple.ogg b/Music/Elemental_Temple.ogg new file mode 100644 index 000000000..d9b0d2d05 Binary files /dev/null and b/Music/Elemental_Temple.ogg differ diff --git a/Music/GENERIC-DOLLRACK.ogg b/Music/GENERIC-DOLLRACK.ogg index 968e96173..c866cb670 100644 Binary files a/Music/GENERIC-DOLLRACK.ogg and b/Music/GENERIC-DOLLRACK.ogg differ diff --git a/Music/Shopping.ogg b/Music/Shopping.ogg new file mode 100644 index 000000000..043ed1e64 Binary files /dev/null and b/Music/Shopping.ogg differ diff --git a/Music/UntitledRobot.ogg b/Music/UntitledRobot.ogg new file mode 100644 index 000000000..59840d625 Binary files /dev/null and b/Music/UntitledRobot.ogg differ diff --git a/Music/black_cat.ogg b/Music/black_cat.ogg new file mode 100644 index 000000000..cefdebacb Binary files /dev/null and b/Music/black_cat.ogg differ diff --git a/Music/black_cat_angry.ogg b/Music/black_cat_angry.ogg new file mode 100644 index 000000000..d10d6fedc Binary files /dev/null and b/Music/black_cat_angry.ogg differ diff --git a/Music/factory_ambient.ogg b/Music/factory_ambient.ogg new file mode 100644 index 000000000..90d6b7af6 Binary files /dev/null and b/Music/factory_ambient.ogg differ diff --git a/Music/scifi.ogg b/Music/scifi.ogg new file mode 100644 index 000000000..632a7b8e5 Binary files /dev/null and b/Music/scifi.ogg differ diff --git a/Music/slimy_science_1.ogg b/Music/slimy_science_1.ogg new file mode 100644 index 000000000..8d6f3b69d Binary files /dev/null and b/Music/slimy_science_1.ogg differ diff --git a/README.md b/README.md index e8c20ed35..8cd527e05 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,17 @@ -# Kinkiest Dungeon +# Kinky Dungeon -This is the official git repo for Kinky Dungeon. What you will find here is a stripped-down version of the original Bondage Club repo preserving only the components needed to make Kinky Dungeon work. -As a plus, the code for the game itself is almost identical, meaning that this game will run if pasted into the official BC +This source code is made available for those looking to make mods or contribute to Kinky Dungeon. +You may download it, modify it for personal use, link to it, and use it to develop content under the Kinky Contributor License seen below. +However, things you may not do: +- Re-host the code in its entirety +- Charge money for the source code or any modifications to it +- Claim it as your own +- Use assets from the game without permission from Strait Laced Games LLC -As such, this is the new official fork of the game. Visit the page https://ada18980.github.io/KinkiestDungeon/ to play it! +You may redistribute parts of the code as part of a mod, with the following stipulations: +- You may not charge for mods or restrict access to unpaid users in any way (passwords, secret links, etc) +- You may solicit donations (e.g. Patreon) with respect to mods you create +- You must credit Strait Laced Games LLC Kinky Contributor License (Takes effect as of March 6 2023): Definitions: @@ -20,3 +28,5 @@ e) Use the content in promotional material related to Kinky Dungeon such as vide 2) You may release your own work under any license you choose, but that license shall not apply to Kinky Dungeon itself or any of its code 3) You maintain copyright to all contributions you make + +If you want to contribute translations, you can read [CONTRIBUTING.md](.github/CONTRIBUTING.md) diff --git a/Screens/Character/Appearance/Text_Appearance.csv b/Screens/Character/Appearance/Text_Appearance.csv deleted file mode 100644 index c67af436c..000000000 --- a/Screens/Character/Appearance/Text_Appearance.csv +++ /dev/null @@ -1,26 +0,0 @@ -SelectYourAppearance,Select your appearance -SelectSomeoneAppearance, Select TargetCharacterName's appearance -MustPickItem,You must pick an item of type: -WardrobeNameInfo,Set wardrobe character name: -WardrobeNameError,Invalid name for character. -ResetClothes,Reset character -WearRandom,Randomize clothes -Random,Randomize character -Naked,Strip clothes -Character,Show character in previews -StripItem,Strip item -Next,Next -Prev,Previous -Cancel,Cancel changes -Accept,Accept changes -Wardrobe,Wardrobe -WardrobeDisabled,Wardrobe can be bought in your private room. -DialogPermissionMode,Edit item permissions -Use,Use this item -UseDisabled,Unable to use due to player permissions -Reset,Reset character -ColorPick,Select a color -MultiColorPick,Select colors -ColorPickDisabled,Unable to change color due to player permissions,, -MultiColorPickDisabled,Unable to change color due to player permissions,, -OwnerBlock,blocked by owner \ No newline at end of file diff --git a/Screens/Character/Appearance/Text_Appearance_CN.txt b/Screens/Character/Appearance/Text_Appearance_CN.txt deleted file mode 100644 index ac1a2db8d..000000000 --- a/Screens/Character/Appearance/Text_Appearance_CN.txt +++ /dev/null @@ -1,46 +0,0 @@ -Select your appearance -选择你的外貌 -Select TargetCharacterName's appearance -选择TargetCharacterName的外貌 -You must pick an item of type: -你必须选择该类别的物品: -Set wardrobe character name: -设置衣柜角色名: -Invalid name for character. -角色名无效 -Reset character -重置角色 -Randomize clothes -随机服装 -Randomize character -随机角色 -Strip clothes -脱下衣物 -Show character in previews -在预览中显示角色 -Strip item -脱下物品 -Next -下一页 -Previous -前一页 -Cancel changes -取消改动 -Accept changes -确认改动 -Wardrobe -衣柜 -Wardrobe can be bought in your private room. -衣柜可以在私人房间中购买 -Edit item permissions -编辑物品权限许可 -Use this item -使用该物品 -Unable to use due to player permissions -因权限设定无法使用 -Select a color -选择一种颜色 -Select colors -选择颜色 -Unable to change color due to player permissions -因权限设定无法修改颜色 \ No newline at end of file diff --git a/Screens/Character/Appearance/Text_Appearance_DE.txt b/Screens/Character/Appearance/Text_Appearance_DE.txt deleted file mode 100644 index 084f4eeef..000000000 --- a/Screens/Character/Appearance/Text_Appearance_DE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Select your appearance -Wähle dein Aussehen - Select TargetCharacterName's appearance -Wähle ein Aussehen für TargetCharacterName -You must pick an item of type: -Folgende Auswahl muss getroffen werden: -Set wardrobe character name: -Name für Kleiderschrank-Charakter: -Invalid name for character. -Ungültiger Charaktername. -Reset character -Charakter zurücksetzen -Randomize character -Zufälliger Charakter -Strip naked -Alles ausziehen -Next -Weiter -Previous -Zurück -Cancel changes -Änderungen verwerfen -Accept changes -Änderungen übernehmen -Wardrobe -Kleiderschrank -Dress manually -Manuell kleiden diff --git a/Screens/Character/Appearance/Text_Appearance_FR.txt b/Screens/Character/Appearance/Text_Appearance_FR.txt deleted file mode 100644 index 7ca725eed..000000000 --- a/Screens/Character/Appearance/Text_Appearance_FR.txt +++ /dev/null @@ -1,32 +0,0 @@ -Select your appearance -Sélectionner l'apparence -Select TargetCharacterName's appearance -Selectionner l'apparence de TargetCharacterName -You must pick an item of type: -Le type d'objet doit être sélectionné -Set wardrobe character name: -Choice le nom de caractère: -Invalid name for character. -Nom invalide pour le caractère. -Reset character -Réinitialiser le personnage -Randomize character -Personnage aléatoire -Strip clothes -Rétirer les vêtements -Strip item -Retiré l'objet -Next -Suivant -Previous -Précédent -Cancel changes -Annuler les modifications -Accept changes -Accepter les modifications -Wardrobe -Garde-robe -Dress manually -S'habillez manuellement -Randomize clothes -Objet aléatoire \ No newline at end of file diff --git a/Screens/Character/Appearance/Text_Appearance_RU.txt b/Screens/Character/Appearance/Text_Appearance_RU.txt deleted file mode 100644 index cb0c213f6..000000000 --- a/Screens/Character/Appearance/Text_Appearance_RU.txt +++ /dev/null @@ -1,46 +0,0 @@ -Select your appearance -Выберите свой внешний вид -Select TargetCharacterName's appearance -Выберите внешний вид имени целевого персонажа -You must pick an item of type: -Вы должны выбрать элемент типа: -Set wardrobe character name: -Установить имя персонажа гардероба: -Invalid name for character. -Неверное имя для персонажа. -Reset character -Сбросить персонажа -Randomize clothes -Случайная одежда -Randomize character -Случайный персонаж -Strip clothes -Раздеться -Show character in previews -Показывать персонажа в превью -Strip item -Снять -Next -Следующий -Previous -Предыдущий -Cancel changes -Отменить изменения -Accept changes -Принять изменения -Wardrobe -Гардероб -Wardrobe can be bought in your private room. -Гардероб можно купить в вашей приватной комнате. -Edit item permissions -Редактировать права доступа к предметам -Use this item -Использовать предмет -Unable to use due to player permissions -Невозможно использовать из-за разрешений игрока -Select a color -Выбрать цвет -Select colors -Выбрать цвета -Unable to change color due to player permissions -Невозможно изменить цвет из-за разрешений игрока diff --git a/Screens/Character/ItemColor/ItemColor.csv b/Screens/Character/ItemColor/ItemColor.csv deleted file mode 100644 index edb6a3d6a..000000000 --- a/Screens/Character/ItemColor/ItemColor.csv +++ /dev/null @@ -1,7 +0,0 @@ -Accept,Accept -Cancel,Cancel -Default,Default -Many,Many -Next,Next page -WholeItem,Whole Item -All,All diff --git a/Screens/Character/ItemColor/ItemColor.js b/Screens/Character/ItemColor/ItemColor.js deleted file mode 100644 index e029bf236..000000000 --- a/Screens/Character/ItemColor/ItemColor.js +++ /dev/null @@ -1,721 +0,0 @@ -"use strict"; - -/** - * An object defining a group of layers which can be colored together - * @typedef {object} ColorGroup - * @property {string} name - The name of the color group - * @property {AssetLayer[]} layers - The layers contained within the color group - * @property {number} colorIndex - The color index for the color group - this is the lowest color index of any of the layers within the - * color group - */ - -/** - * A callback function that is called when the item color UI exits - * @callback itemColorExitListener - * @param {Character} c - The character being colored - * @param {Item} item - The item being colored - * @param {boolean} save - Whether the item's appearance changes should be saved - */ - -/** - * A configuration object containing constants used by the ItemColor UI scripts - * @constant {{ - * colorPickerButtonWidth: number, - * colorInputHeight: number, - * colorDisplayWidth: number, - * buttonSpacing: number, - * headerButtonSize: number, - * buttonSize: number, - * }} - */ -const ItemColorConfig = { - buttonSpacing: 20, - buttonSize: 65, - headerButtonSize: 90, - colorPickerButtonWidth: 65, - colorDisplayWidth: 160, - colorInputHeight: 45, -}; - -/** - * An enum for the possible item color UI modes - * @readonly - * @enum {string} - */ -const ItemColorMode = { - DEFAULT: "Default", - COLOR_PICKER: "ColorPicker", -}; - -let ItemColorCharacter; -let ItemColorItem; -let ItemColorCurrentMode = ItemColorMode.DEFAULT; -let ItemColorStateKey; -let ItemColorState; -let ItemColorPage; -let ItemColorLayerPages = {}; -let ItemColorPickerBackup; -let ItemColorPickerIndices = []; -let ItemColorExitListeners = []; -let ItemColorBackup; -let ItemColorText = new TextCache("Screens/Character/ItemColor/ItemColor.csv"); -let ItemColorLayerNames; -let ItemColorGroupNames; - -/** - * Loads the item color UI with the provided character, item and positioning parameters. - * @param {Character} c - The character being colored - * @param {Item} item - The item being colored - * @param {number} x - The x-coordinate at which to draw the UI - * @param {number} y - The y-coordinate at which to draw the UI - * @param {number} width - The width the UI should be drawn at - * @param {number} height - The height the UI should be drawn at - * @param {boolean} [includeResetButton] - Whether or not to include the "Reset to default" button - * @returns {void} - Nothing - */ -function ItemColorLoad(c, item, x, y, width, height, includeResetButton) { - ItemColorReset(); - ItemColorCharacter = c; - ItemColorItem = item; - ItemColorBackup = AppearanceItemStringify(item); - ItemColorStateBuild(c, item, x, y, width, height, includeResetButton); - if (ItemColorState.simpleMode) { - ItemColorOpenPicker(ItemColorState.colorGroups[0]); - } - ItemColorLayerNames = new TextCache(`Assets/${c.AssetFamily}/LayerNames.csv`); - ItemColorGroupNames = new TextCache(`Assets/${c.AssetFamily}/ColorGroups.csv`); -} - -/** - * Draws the item color UI according to its current state - * @param {Character} c - The character being colored - * @param {string} group - The name of the item group being colored - * @param {number} x - The x-coordinate at which to draw the UI - * @param {number} y - The y-coordinate at which to draw the UI - * @param {number} width - The width the UI should be drawn at - * @param {number} height - The height the UI should be drawn at - * @param {boolean} includeResetButton - Whether or not to include the "Reset to default" button - * @returns {void} - Nothing - */ -function ItemColorDraw(c, group, x, y, width, height, includeResetButton) { - const item = InventoryGet(c, group); - if (!item) { - return; - } - ItemColorStateBuild(c, item, x, y, width, height, includeResetButton); - - const headerButtonSize = ItemColorConfig.headerButtonSize; - - if (ItemColorCurrentMode === ItemColorMode.DEFAULT && ItemColorState.pageCount > 1) { - DrawButton( - ItemColorState.paginationButtonX, y, headerButtonSize, headerButtonSize, "", "#fff", "Icons/Next.png", - ItemColorText.get("Next"), - ); - } - - if (ItemColorCurrentMode === ItemColorMode.COLOR_PICKER) { - if (ItemColorState.drawExport) { - DrawButton(ItemColorState.exportButtonX, y, headerButtonSize, headerButtonSize, "", "#fff", "Icons/Export.png"); - } - if (ItemColorState.drawImport) { - DrawButton(ItemColorState.importButtonX, y, headerButtonSize, headerButtonSize, "", "#fff", "Icons/Import.png"); - } - if (includeResetButton) { - DrawButton(ItemColorState.resetButtonX, y, headerButtonSize, headerButtonSize, "", "#fff", "Icons/Reset.png"); - } - } - - DrawButton( - ItemColorState.cancelButtonX, y, headerButtonSize, headerButtonSize, "", "#fff", "Icons/Cancel.png", - ); - - DrawButton( - ItemColorState.saveButtonX, y, headerButtonSize, headerButtonSize, "", "#fff", "Icons/Accept.png", - ); - - const contentY = ItemColorState.contentY; - - switch (ItemColorCurrentMode) { - case ItemColorMode.COLOR_PICKER: - ElementPosition( - "InputColor", - ItemColorState.colorInputX, - ItemColorState.colorInputY, - ItemColorState.colorInputWidth, - ItemColorConfig.colorInputHeight, - ); - return ColorPickerDraw( - x, contentY, width, y + height - contentY, document.getElementById("InputColor"), ItemColorOnPickerChange); - default: - return ItemColorDrawDefault(x, contentY); - } -} - -/** - * Draws the item color UI in default mode - * @param {number} x - The x-coordinate at which to draw the default UI - * @param {number} y - The y-coordinate at which to draw the default UI - * @returns {void} - Nothing - */ -function ItemColorDrawDefault(x, y) { - const colorPickerButtonWidth = ItemColorConfig.colorPickerButtonWidth; - const buttonSpacing = ItemColorConfig.buttonSpacing; - const colorDisplayWidth = ItemColorConfig.colorDisplayWidth; - const buttonHeight = ItemColorConfig.buttonSize; - const colorPickerButtonX = ItemColorState.colorPickerButtonX; - const colorDisplayButtonX = ItemColorState.colorDisplayButtonX; - const groupButtonWidth = ItemColorState.groupButtonWidth; - const pageStart = ItemColorPage * ItemColorState.pageSize; - const colorGroups = ItemColorState.colorGroups.slice(pageStart, pageStart + ItemColorState.pageSize); - const colors = ItemColorState.colors; - - colorGroups.forEach((colorGroup, i) => { - const groupY = y + (i * (buttonHeight + buttonSpacing)); - const asset = ItemColorItem.Asset; - let groupName, buttonText, buttonColor; - let isBackNextButton = false; - if (colorGroup.name === null) { - groupName = ItemColorText.get("WholeItem"); - buttonText = ItemColorGetColorButtonText(colors); - buttonColor = buttonText.startsWith("#") ? buttonText : "#fff"; - } else if (colorGroup.layers.length === 1) { - groupName = ItemColorLayerNames.get(asset.Group.Name + asset.Name + colorGroup.name); - buttonText = colors[colorGroup.layers[0].ColorIndex]; - buttonColor = buttonText.startsWith("#") ? buttonText : "#fff"; - } else { - let currentColors; - const layerPage = ItemColorLayerPages[colorGroup.name]; - const colorGroupName = ItemColorGroupNames.get(asset.Group.Name + asset.Name + colorGroup.name); - if (layerPage === 0) { - currentColors = colorGroup.layers.map(layer => colors[layer.ColorIndex]); - groupName = colorGroupName + ": " + ItemColorText.get("All"); - } else { - const layer = colorGroup.layers[layerPage - 1]; - currentColors = colors[layer.ColorIndex]; - groupName = colorGroupName + ": " + ItemColorLayerNames.get(asset.Group.Name + asset.Name + (layer.Name || "")); - } - buttonText = ItemColorGetColorButtonText(currentColors); - buttonColor = buttonText.startsWith("#") ? buttonText : "#fff"; - isBackNextButton = true; - } - if (isBackNextButton) { - DrawBackNextButton(x, groupY, groupButtonWidth, buttonHeight, groupName, "#fff", null, () => "Previous", () => "Next"); - } else { - DrawButton(x, groupY, groupButtonWidth, buttonHeight, groupName, "#fff"); - } - DrawButton(colorDisplayButtonX, groupY, colorDisplayWidth, buttonHeight, buttonText, buttonColor); - DrawButton(colorPickerButtonX, groupY, colorPickerButtonWidth, buttonHeight, "", "#fff", "Icons/Color.png"); - }); -} - -/** - * A debounced callback for when the item color picker changes its value. This sets the color for the currently selected set of color - * indices - * @const {function(): void} - */ -const ItemColorOnPickerChange = CommonLimitFunction((color) => { - if (!ItemColorState) return; - const newColors = ItemColorState.colors.slice(); - ItemColorPickerIndices.forEach(i => newColors[i] = color); - ItemColorItem.Color = newColors; - CharacterLoadCanvas(ItemColorCharacter); -}); - -/** - * Click handler for the item color UI according to its current state - * @param {Character} c - The character being colored - * @param {string} group - The name of the item group being colored - * @param {number} x - The x-coordinate at which the UI was drawn - * @param {number} y - The y-coordinate at which the UI was drawn - * @param {number} width - The width with which the UI was drawn - * @param {number} height - The height with which the UI was drawn - * @param {boolean} includeResetButton - Whether or not to include the "Reset to default" button - * @returns {void} - Nothing - */ -function ItemColorClick(c, group, x, y, width, height, includeResetButton) { - const item = InventoryGet(c, group); - if (!item) { - return; - } - ItemColorStateBuild(c, item, x, y, width, height, includeResetButton); - - const headerButtonSize = ItemColorConfig.headerButtonSize; - - if (MouseIn(ItemColorState.cancelButtonX, y, headerButtonSize, headerButtonSize)) { - return ItemColorExitClick(); - } - - if (MouseIn(ItemColorState.saveButtonX, y, headerButtonSize, headerButtonSize)) { - return ItemColorSaveClick(); - } - - if (ItemColorCurrentMode === ItemColorMode.COLOR_PICKER) { - if (ItemColorState.drawExport && MouseIn(ItemColorState.exportButtonX, y, headerButtonSize, headerButtonSize)) { - navigator.clipboard - .writeText(ElementValue("InputColor")) - .catch(err => console.error("Clipboard write error: " + err)); - return; - } - - if (ItemColorState.drawImport && MouseIn(ItemColorState.importButtonX, y, headerButtonSize, headerButtonSize)) { - navigator.clipboard.readText() - .then(txt => ElementValue("InputColor", txt)) - .catch(err => console.error("Clipboard read error: " + err)); - return; - } - - if (includeResetButton && MouseIn(ItemColorState.resetButtonX, y, headerButtonSize, headerButtonSize)) { - ElementValue("InputColor", "Default"); - return; - } - } - - if ( - ItemColorCurrentMode === ItemColorMode.DEFAULT && - ItemColorState.pageCount > 1 && - MouseIn(ItemColorState.paginationButtonX, y, headerButtonSize, headerButtonSize) - ) { - return ItemColorPaginationClick(); - } - - if (ItemColorCurrentMode === ItemColorMode.DEFAULT) { - return ItemColorClickDefault(x, ItemColorState.contentY, width); - } -} - -/** - * Click handler for the item color UI when it's in default mode - * @param {number} x - The x-coordinate at which the default UI was drawn - * @param {number} y - The y-coordinate at which the default UI was drawn - * @param {number} width - The width with which the default UI was drawn - * @returns {void} - Nothing - */ -function ItemColorClickDefault(x, y, width) { - const pageStart = ItemColorPage * ItemColorState.pageSize; - const colorGroups = ItemColorState.colorGroups.slice(pageStart, pageStart + ItemColorState.pageSize); - const colorPickerButtonWidth = ItemColorConfig.colorPickerButtonWidth; - const colorDisplayWidth = ItemColorConfig.colorDisplayWidth; - const colorPickerButtonX = ItemColorState.colorPickerButtonX; - const colorDisplayButtonX = ItemColorState.colorDisplayButtonX; - const groupButtonWidth = ItemColorState.groupButtonWidth; - const buttonHeight = ItemColorConfig.buttonSize; - const rowHeight = buttonHeight + ItemColorConfig.buttonSpacing; - const clickZoneHeight = colorGroups.length * (rowHeight); - - if (!MouseIn(x, y, width, clickZoneHeight)) { - return; - } - - colorGroups.some((colorGroup, i) => { - if (MouseYIn(y + i * rowHeight, buttonHeight)) { - if (MouseXIn(colorPickerButtonX, colorPickerButtonWidth)) { - // Color picker button - ItemColorOpenPicker(colorGroup); - } else if (MouseXIn(colorDisplayButtonX, colorDisplayWidth)) { - // Cycle through the color schema - ItemColorNextColor(colorGroup); - } else if (colorGroup.layers.length > 1) { - if (MouseXIn(x, groupButtonWidth / 2)) { - // Previous layer button - ItemColorPreviousLayer(colorGroup); - } else if (MouseXIn(x + groupButtonWidth / 2, x + groupButtonWidth)) { - // Next layer button - ItemColorNextLayer(colorGroup); - } - } - return true; - } - }); -} - -/** - * Handles pagination clicks on the item color UI - * @returns {void} - Nothing - */ -function ItemColorPaginationClick() { - ItemColorPage = (ItemColorPage + 1) % ItemColorState.pageCount; -} - -/** - * Handles exit button clicks on the item color UI - * @returns {void} - Nothing - */ -function ItemColorExitClick() { - switch (ItemColorCurrentMode) { - case ItemColorMode.COLOR_PICKER: - return ItemColorPickerCancel(); - case ItemColorMode.DEFAULT: - default: - if (ItemColorBackup && ItemColorCharacter) { - Object.assign(ItemColorItem, AppearanceItemParse(ItemColorBackup)); - CharacterLoadCanvas(ItemColorCharacter); - } - ItemColorFireExit(false); - } -} - -/** - * Saves any item color changes and exits the item color screen completely - * @returns {void} - Nothing - */ -function ItemColorSaveAndExit() { - if (ItemColorCurrentMode === ItemColorMode.COLOR_PICKER) { - ElementRemove("InputColor"); - ColorPickerHide(); - } - ItemColorFireExit(true); -} - -/** - * Discards any item color changes and exits the item color screen completely - * @returns {void} - Nothing - */ -function ItemColorCancelAndExit() { - if (ItemColorItem && ItemColorBackup && ItemColorCharacter) { - Object.assign(ItemColorItem, AppearanceItemParse(ItemColorBackup)); - CharacterLoadCanvas(ItemColorCharacter); - } - ElementRemove("InputColor"); - ColorPickerHide(); - ItemColorFireExit(false); -} - -/** - * Handles save button clicks on the item color UI - * @returns {void} - Nothing - */ -function ItemColorSaveClick() { - switch (ItemColorCurrentMode) { - case ItemColorMode.COLOR_PICKER: - return ItemColorCloseColorPicker(true); - case ItemColorMode.DEFAULT: - default: - ItemColorFireExit(true); - } -} - -/** - * Handles color picker cancellation clicks when the item color UI is in color picker mode - * @returns {void} - Nothing - */ -function ItemColorPickerCancel() { - Object.assign(ItemColorItem, AppearanceItemParse(ItemColorPickerBackup)); - CharacterLoadCanvas(ItemColorCharacter); - ItemColorCloseColorPicker(false); -} - -/** - * Takes the item color UI out of color picker mode. If the item being colored only has a single color index, this function calls any - * registered item color exit handlers - * @param {boolean} save - Whether or not changes should be saved on exiting color picker mode - * @returns {void} - Nothing - */ -function ItemColorCloseColorPicker(save) { - ElementRemove("InputColor"); - ColorPickerHide(); - if (ItemColorState.simpleMode) { - ItemColorFireExit(save); - } else { - ItemColorCurrentMode = ItemColorMode.DEFAULT; - } -} - -/** - * Gets the color indices that belong in the provided color group - * @param {ColorGroup} colorGroup - The color group to fetch color indices for - * @returns {number[]} - A list of color indices for any layers within the provided color group - */ -function ItemColorGetColorIndices(colorGroup) { - if (colorGroup.name === null) { - return ItemColorState.colors.map((c, i) => i); - } else if (colorGroup.layers.length === 1) { - return [colorGroup.layers[0].ColorIndex]; - } else { - const layerPage = ItemColorLayerPages[colorGroup.name]; - if (layerPage === 0) { - return colorGroup.layers.map(layer => layer.ColorIndex); - } else if (layerPage <= colorGroup.layers.length) { - return [colorGroup.layers[layerPage - 1].ColorIndex]; - } - } - return []; -} - -/** - * Toggles the item color UI into color picker mode - * @param {ColorGroup} colorGroup - The color group that is being colored - * @returns {void} - Nothing - */ -function ItemColorOpenPicker(colorGroup) { - ItemColorCurrentMode = ItemColorMode.COLOR_PICKER; - ItemColorPickerBackup = AppearanceItemStringify(ItemColorItem); - ItemColorPickerIndices = ItemColorGetColorIndices(colorGroup); - const groupColors = ItemColorState.colors.filter((c, i) => ItemColorPickerIndices.includes(i)); - const colorText = ItemColorGetColorButtonText(groupColors); - ElementCreateInput("InputColor", "text", colorText.startsWith("#") ? colorText : "#", "7"); -} - -/** - * Cycles a color group's color to the next color in the asset group's color schema, or to "Default" if the color group is not currently - * colored with a single color from the color schema - * @param {ColorGroup} colorGroup - The color group that is being colored - * @returns {void} - Nothing - */ -function ItemColorNextColor(colorGroup) { - const colorIndicesToSet = ItemColorGetColorIndices(colorGroup); - const groupColors = ItemColorState.colors.filter((c, i) => colorIndicesToSet.includes(i)); - const colorTextKey = ItemColorGetColorButtonTextKey(groupColors); - const schema = ItemColorItem.Asset.Group.ColorSchema; - const nextIndex = (schema.indexOf(colorTextKey) + 1) % schema.length; - const nextColor = schema[nextIndex]; - const newColors = ItemColorState.colors.slice(); - colorIndicesToSet.forEach(i => newColors[i] = nextColor); - ItemColorItem.Color = newColors; - CharacterLoadCanvas(ItemColorCharacter); -} - -/** - * Switches the item color UI to the next layer within the provided color group - * @param {ColorGroup} colorGroup - The color group whose layers to cycle - * @returns {void} - Nothing - */ -function ItemColorNextLayer(colorGroup) { - const currentPage = ItemColorLayerPages[colorGroup.name]; - ItemColorLayerPages[colorGroup.name] = (currentPage + 1) % (colorGroup.layers.length + 1); -} - -/** - * Switches the item color UI to the previous layer within the provided color group - * @param {ColorGroup} colorGroup - The color group whose layers to cycle - * @returns {void} - Nothing - */ -function ItemColorPreviousLayer(colorGroup) { - const currentPage = ItemColorLayerPages[colorGroup.name]; - const totalPages = colorGroup.layers.length + 1; - ItemColorLayerPages[colorGroup.name] = (currentPage + totalPages - 1) % totalPages; -} - -/** - * Builds the item color UI's current state based on the provided character, item and position parameters. This only rebuilds the state if - * needed. - * @param {Character} c - The character being colored - * @param {Item} item - The item being colored - * @param {number} x - The x-coordinate at which to draw the UI - * @param {number} y - The y-coordinate at which to draw the UI - * @param {number} width - The width the UI should be drawn at - * @param {number} height - The height the UI should be drawn at - * @param {boolean} [includeResetButton=false] - Whether or not to include the "Reset to default" button - * @returns {void} - Nothing - */ -function ItemColorStateBuild(c, item, x, y, width, height, includeResetButton = false) { - ItemColorCharacter = c; - ItemColorItem = item; - const itemKey = AppearanceItemStringify({ item, x, y, width, height }); - if (!item || (ItemColorState && ItemColorStateKey === itemKey)) { - return; - } - - ItemColorStateKey = itemKey; - const colorableLayers = ItemColorGetColorableLayers(item); - const groupMap = colorableLayers.reduce((groupLookup, layer) => { - const groupKey = layer.ColorGroup || layer.Name || ""; - (groupLookup[groupKey] || (groupLookup[groupKey] = [])).push(layer); - return groupLookup; - }, /** @type {Record} */({})); - - const colorGroups = Object.keys(groupMap) - .map(key => { - ItemColorLayerPages[key] = ItemColorLayerPages[key] || 0; - return { - name: key, - layers: groupMap[key], - colorIndex: groupMap[key].reduce((min, layer) => Math.min(min, layer.ColorIndex), Infinity), - }; - }) - .sort((g1, g2) => g1.colorIndex - g2.colorIndex); - - if (item.Asset.AllowColorizeAll) { - colorGroups.unshift({ name: null, layers: [], colorIndex: -1 }); - } - - let colors; - if (Array.isArray(item.Color)) { - colors = item.Color; - for (let i = colors.length; i < item.Asset.ColorableLayerCount; i++) { - colors.push("Default"); - } - } else { - const colorStr = typeof item.Color === "string" ? item.Color : "Default"; - colors = []; - for (let i = 0; i < item.Asset.ColorableLayerCount; i++) { - colors.push(colorStr); - } - } - - const simpleMode = colorableLayers.length === 1; - - const colorPickerButtonWidth = ItemColorConfig.colorPickerButtonWidth; - const buttonSpacing = ItemColorConfig.buttonSpacing; - const colorDisplayWidth = ItemColorConfig.colorDisplayWidth; - const buttonHeight = ItemColorConfig.buttonSize; - const headerButtonSize = ItemColorConfig.headerButtonSize; - - const drawExport = typeof navigator !== "undefined" && navigator.clipboard && navigator.clipboard.writeText; - const drawImport = typeof navigator !== "undefined" && navigator.clipboard && navigator.clipboard.readText; - const paginationButtonX = x + width - 3 * headerButtonSize - 2 * buttonSpacing; - const cancelButtonX = x + width - 2 * headerButtonSize - buttonSpacing; - const saveButtonX = x + width - headerButtonSize; - let importButtonX = 0; - let exportButtonX = 0; - let resetButtonX = 0; - let nbButtons = 2; - if (drawImport) { - importButtonX = x + width - (nbButtons + 1) * headerButtonSize - nbButtons * buttonSpacing; - nbButtons++; - } - if (drawExport) { - exportButtonX = x + width - (nbButtons + 1) * headerButtonSize - nbButtons * buttonSpacing; - nbButtons++; - } - resetButtonX = x + width - (nbButtons + 1) * headerButtonSize - nbButtons * buttonSpacing; - const colorPickerButtonX = x + width - colorPickerButtonWidth; - const colorDisplayButtonX = colorPickerButtonX - buttonSpacing - colorDisplayWidth; - const contentY = y + ItemColorConfig.headerButtonSize + buttonSpacing; - const groupButtonWidth = colorDisplayButtonX - buttonSpacing - x; - const pageSize = Math.floor((height - headerButtonSize - buttonSpacing) / (buttonHeight + buttonSpacing)); - const pageCount = Math.ceil(colorGroups.length / pageSize); - const buttonCount = includeResetButton ? 5 : 4; - const colorInputWidth = Math.min(220, width - buttonCount * (headerButtonSize + buttonSpacing)); - const colorInputX = x + 0.5 * colorInputWidth; - const colorInputY = y + 0.5 * headerButtonSize; - - ItemColorState = { - colorGroups, - colors, - simpleMode, - paginationButtonX, - cancelButtonX, - saveButtonX, - colorPickerButtonX, - colorDisplayButtonX, - contentY, - groupButtonWidth, - pageSize, - pageCount, - colorInputWidth, - colorInputX, - colorInputY, - exportButtonX, - importButtonX, - resetButtonX, - drawImport, - drawExport, - }; -} - -/** - * Returns layers of the asset which can be given distinct colors - * @param {Item} item - The item to be colored - * @returns {AssetLayer[]} - The colourable layers - */ -function ItemColorGetColorableLayers(item) { - return item.Asset.Layer.filter(layer => !layer.CopyLayerColor && layer.AllowColorize && !layer.HideColoring); -} - -/** - * Returns whether or not the item can have only a single color or multiple colors - * @param {Item} item - The item to be colored - * @returns {boolean} - Whether the item only allows one color - */ -function ItemColorIsSimple(item) { - if (item && item.Asset && item.Asset.Layer) { - return ItemColorGetColorableLayers(item).length === 1; - } - else return true; -} - -/** - * Fetches the color button text key for the provided item color. If the item's color is already a string, the color string is returned. - * Otherwise, returns "Many" or "Default" as appropriate. - * @param {string|string[]} color - The item color - * @returns {string} - The appropriate color button key for the provided item color(s) - */ -function ItemColorGetColorButtonTextKey(color) { - if (Array.isArray(color)) { - const initialColor = color[0]; - return color.some(c => c !== initialColor) ? "Many" : initialColor; - } else if (typeof color !== "string") { - return "Default"; - } - return color; -} - -/** - * Fetches the color button text for the provided item color. If the item's color is already a string, the color string is returned. - * Otherwise, returns "Many" or "Default" as appropriate. - * @param {string|string[]} color - The item color - * @returns {string} - The appropriate color button text for the provided item color(s), translated to the current game language - */ -function ItemColorGetColorButtonText(color) { - return ItemColorText.get(ItemColorGetColorButtonTextKey(color)).trim(); -} - -/** - * Registers an exit callback to the item color UI which will be called when the UI is exited. - * @param {itemColorExitListener} callback - The exit listener to register - * @returns {void} - Nothing - */ -function ItemColorOnExit(callback) { - ItemColorExitListeners.push(callback); -} - -/** - * Handles exiting the item color UI. Appropriate text caches are dropped, and any registered exit listeners are called. - * @param {boolean} save - Whether or not the appearance changes applied by the item color UI should be saved - * @returns {void} - Nothing - */ -function ItemColorFireExit(save) { - ItemColorExitListeners.forEach(listener => listener(ItemColorCharacter, ItemColorItem, save)); - ItemColorReset(); -} - -/** - * Resets color UI related global variables back to their default states. - * @returns {void} - Nothing - */ -function ItemColorReset() { - ItemColorCharacter = null; - ItemColorItem = null; - ItemColorCurrentMode = ItemColorMode.DEFAULT; - ItemColorStateKey = null; - ItemColorState = null; - ItemColorPage = 0; - ItemColorLayerPages = {}; - ItemColorPickerBackup = null; - ItemColorPickerIndices = []; - ItemColorExitListeners = []; - ItemColorBackup = null; - ItemColorLayerNames = null; - ItemColorGroupNames = null; -} - -/** - * Check whether the current colors of the item match the item's default colors - * @param {Item} Item - The appearance item to check - * @returns {boolean} - Whether the item has default color(s) - */ -function ItemColorIsDefault(Item) { - const Color = Item.Color; - let AssetDefault = Item.Asset.DefaultColor; - if (typeof Color === "string") return (Color === "Default" || (typeof AssetDefault === "string" && Color === AssetDefault)); - if (Array.isArray(Color)) { - if (!AssetDefault) { - return Color.every(c => c === "Default"); - } - if (!Array.isArray(AssetDefault)) { - AssetDefault = [AssetDefault]; - } - return Color.slice(0, Math.min(Color.length, AssetDefault.length)).every((c, i) => c === "Default" || c === AssetDefault[i]); - } - return true; -} diff --git a/Screens/Character/ItemColor/ItemColor_CN.txt b/Screens/Character/ItemColor/ItemColor_CN.txt deleted file mode 100644 index f29b7113e..000000000 --- a/Screens/Character/ItemColor/ItemColor_CN.txt +++ /dev/null @@ -1,14 +0,0 @@ -Accept -接受 -Cancel -取消 -Default -默认 -Many -复数 -Next page -下一页 -Whole Item -物品整体 -All -所有 \ No newline at end of file diff --git a/Screens/Character/ItemColor/ItemColor_FR.txt b/Screens/Character/ItemColor/ItemColor_FR.txt deleted file mode 100644 index bcea68c47..000000000 --- a/Screens/Character/ItemColor/ItemColor_FR.txt +++ /dev/null @@ -1,14 +0,0 @@ -Accept -Accepter -Cancel -Annuler -Default -Défaut -Many -Plusieurs -Next page -Prochaine page -Whole Item -Tout l'objet -All -Tout \ No newline at end of file diff --git a/Screens/Character/ItemColor/ItemColor_RU.txt b/Screens/Character/ItemColor/ItemColor_RU.txt deleted file mode 100644 index c8c789450..000000000 --- a/Screens/Character/ItemColor/ItemColor_RU.txt +++ /dev/null @@ -1,16 +0,0 @@ -Accept -Принять -Cancel -Отменить -Default -Стандартный -Many -Много -Next page -Следующая страница -Whole Item -Весь предмет -All -Все -undefined -неопределенный \ No newline at end of file diff --git a/Screens/Character/Player/Dialog_Player.csv b/Screens/Character/Player/Dialog_Player.csv deleted file mode 100644 index 53fd7f621..000000000 --- a/Screens/Character/Player/Dialog_Player.csv +++ /dev/null @@ -1,3534 +0,0 @@ -PlayerGagged,,,(You can use or remove items by selecting specific body regions on yourself.),, -0,,,(You can use or remove items by selecting specific body regions on yourself.),, -0,,(View your profile.),,DialogViewProfile(), -0,,(Change your clothes.),,DialogChangeClothes(),DialogCanChangeClothes() -0,30,(Room administrator action.),"(As a room administrator, you can take these actions.)",,DialogChatRoomPlayerIsAdmin() -0,100,(Character actions.),(Possible character actions.),,DialogCanPerformCharacterAction() -0,40,(Spend GGTS minutes.),(Select how to spend your minutes.),,DialogGGTSCanSpendMinutes() -0,0,(View your current rules.),(Here are your currently active rules.),DialogViewOwnerRules(),DialogCanViewRules() -0,,(Leave this menu.),,DialogLeave(), -30,0,(Move Character.),(Move started.),"DialogChatRoomAdminAction(""Move"")", -30,0,(Back to main menu.),(You can use or remove items by selecting specific body regions on yourself.),, -40,0,(Spend 15 minutes for a bondage position change.),,"DialogGGTSAction(""ItemPose"", ""15"")",DialogGGTSMinuteGreater(15) -40,,(Spend 15 minutes for a bondage position change.),(You don't have enough minutes available.),,!DialogGGTSMinuteGreater(15) -40,0,(Spend 15 minutes for a new blindness level.),,"DialogGGTSAction(""ItemMaskBlind"", ""15"")",DialogGGTSMinuteGreater(15) -40,,(Spend 15 minutes for a new blindness level.),(You don't have enough minutes available.),,!DialogGGTSMinuteGreater(15) -40,0,(Spend 15 minutes for a new deafness level.),,"DialogGGTSAction(""ItemEarsDeaf"", ""15"")",DialogGGTSMinuteGreater(15) -40,,(Spend 15 minutes for a new deafness level.),(You don't have enough minutes available.),,!DialogGGTSMinuteGreater(15) -40,0,(Spend 15 minutes for an sexual intensity change.),,"DialogGGTSAction(""ItemIntensity"", ""15"")",DialogGGTSMinuteGreater(15) -40,,(Spend 15 minutes for a sexual intensity change.),(You don't have enough minutes available.),,!DialogGGTSMinuteGreater(15) -40,0,(Spend 30 minutes to unlock the door.),,"DialogGGTSAction(""UnlockRoom"", ""30"")",DialogGGTSCanUnlock() -40,,(Spend 30 minutes to unlock the door.),(You must have 30 minutes and be the admistrator of the locked room.),,!DialogGGTSCanUnlock() -40,,(Spend 120 minutes to get $100.),(GGTS gives you $100 and substracts 120 minutes to your total.),"DialogGGTSAction(""MoneyForMinutes"", ""120"")",DialogGGTSMinuteGreater(120) -40,,(Spend 120 minutes to get $100.),(You don't have enough minutes available.),,!DialogGGTSMinuteGreater(120) -40,,(Spend 200 minutes to get your own GGTS helmet.),(You get a GGTS helmet and the AI substracts 200 minutes from your total.),"DialogGGTSAction(""GetHelmet"", ""200"")",DialogGGTSCanGetHelmet() -40,,(Spend 200 minutes to get your own GGTS helmet.),(You don't have enough minutes available or you already have the helmet in your inventory.),,!DialogGGTSCanGetHelmet() -40,0,(Back to main menu.),(You can use or remove items by selecting specific body regions on yourself.),, -100,,,(Possible character actions.),, -100,101,(Adjust your bondage skill.),"(By default, you restrain using your full bondage skill. You can use less of your skill and make it easier for your victims to escape.)",,"DialogSkillGreater(""Bondage"", 1)" -100,102,(Adjust your evasion skill.),"(By default, you struggle using your full evasion skill. You can use less of your skill and make it harder for you to struggle free.)",,"DialogSkillGreater(""Evasion"", 1)" -100,110,(Call the maids for help),(The maids are not supposed to take room calls. This will result in punishment and public humiliation. Are you sure?),,DialogCanCallMaidsPunishmentOn() -100,0,(Call the maids for help),(The maids will be here shortly...),DialogCallMaids(),DialogCanCallMaidsPunishmentOff() -100,120,(Use your safeword.),"(A safeword is serious and should not be used to cheat. It can revert your clothes and restraints to when you entered the lobby, or release you completely.)",,DialogChatRoomCanSafeword() -100,,(Take a photo of yourself.),(You can use or remove items by selecting specific body regions on yourself.),DialogPhotoPlayer(),DialogCanTakePhotos() -100,,(Craft an item.),(You can use or remove items by selecting specific body regions on yourself.),DialogOpenCraftingScreen(),DialogCanCraft() -100,,(Play Kinky Dungeon),,DialogStartKinkyDungeon(),DialogHasGamingHeadset() -100,0,(Back to main menu.),(Main menu.),, -101,,,"(By default, you restrain using your full bondage skill. You can use less of your skill and make it easier for your victims to escape.)",, -101,100,(Use your full bondage skill. 100%),(You will now use your full bondage skill when using a restraint. 100%),"DialogSetSkillRatio(""Bondage"", 100)", -101,100,(Use most of your bondage skill. 75%),(You will now use most of your bondage skill when using a restraint. 75%),"DialogSetSkillRatio(""Bondage"", 75)", -101,100,(Use half of your bondage skill. 50%),(You will now use half of your bondage skill when using a restraint. 50%),"DialogSetSkillRatio(""Bondage"", 50)", -101,100,(Use very little of your bondage skill. 25%),(You will now use very little of your bondage skill when using a restraint. 25%),"DialogSetSkillRatio(""Bondage"", 25)", -101,100,(Use none of your bondage skill. 0%),(You will now use none of your bondage skill when using a restraint. 0%),"DialogSetSkillRatio(""Bondage"", 0)", -101,100,(Don't change your skill.),(You can use or remove items by selecting specific body regions on yourself.),, -102,,,"(By default, you struggle using your full evasion skill. You can use less of your skill and make it harder for you to struggle free.)",, -102,100,(Use your full evasion skill. 100%),(You will now use your full evasion skill when trying to struggle free. 100%),"DialogSetSkillRatio(""Evasion"", 100)", -102,100,(Use most of your evasion skill. 75%),(You will now use most of your evasion skill when trying to struggle free. 75%),"DialogSetSkillRatio(""Evasion"", 75)", -102,100,(Use half of your evasion skill. 50%),(You will now use half of your evasion skill when trying to struggle free. 50%),"DialogSetSkillRatio(""Evasion"", 50)", -102,100,(Use very little of your evasion skill. 25%),(You will now use very little of your evasion skill when trying to struggle free. 25%),"DialogSetSkillRatio(""Evasion"", 25)", -102,100,(Use none of your evasion skill. 0%),(You will now use none of your evasion skill when trying to struggle free. 0%),"DialogSetSkillRatio(""Evasion"", 0)", -102,100,(Don't change your skill.),(You can use or remove items by selecting specific body regions on yourself.),, -110,0,(Yes! Get me out of this room!),(The maids will be here shortly...),DialogCallMaids(),DialogCanCallMaids() -110,0,"(No, don't call the maids.)",(You can use or remove items by selecting specific body regions on yourself.),, -120,121,(Revert Character.),(This will revert your character's clothes and restraints back to how they were when you entered the lobby. Use this if you were forced into restraints against your consent. Are you sure you want to revert your character?),, -120,122,(Release Character.),(This will immediately release you of ALL restraints you are wearing and return you to the Main Lobby. Use this only if you are stuck in restraints and nobody can or wants to help you. Are you sure about this?),, -120,0,(Don't use Safeword.),(You can use or remove items by selecting specific body regions on yourself.),, -121,0,"(Yes, revert Character.)",(You can use or remove items by selecting specific body regions on yourself.),DialogChatRoomSafewordRevert(), -121,0,"(No, don't revert Character.)",(You can use or remove items by selecting specific body regions on yourself.),, -122,0,"(Yes, I want to be released.)",,DialogChatRoomSafewordRelease(), -122,0,"(No, don't release me.)",(You can use or remove items by selecting specific body regions on yourself.),, -OrgasmFailPassive0,,,The stimulation ends just before you go over the edge.,, -OrgasmFailPassive1,,,The vibrators cut off right before you reach climax.,, -OrgasmFailPassive2,,,"The vibrators deny you a chance to finish, stopping abruptly.",, -KinkyDungeonExit,,,SourceCharacter quit a game of Kinky Dungeon at level KinkyDungeonLevel,, -KinkyDungeonLose,,,SourceCharacter met her defeat in Kinky Dungeon! She made it to level KinkyDungeonLevel before succumbing.,, -SavedExpressionsSave,,,Save,, -SavedExpressionsLoad,,,Load,, -SavedExpressions,,,Save/Load Expressions,, -SavedExpressionsEmpty,,,(Empty),, -GGTSControl,,,GGTS control this item,, -ItemArmsWrappedBlanketSelect,,,Select Blanket Bondage,, -ItemArmsWrappedBlanketNormalWrapped,,,Normal,, -ItemArmsWrappedBlanketShouldersWrapped,,,Shoulders Wrapped,, -ItemArmsWrappedBlanketFeetWrapped,,,Feet Wrapped,, -ItemArmsWrappedBlanketFullWrapped,,,Fully Wrapped,, -ItemArmsWrappedBlanketSetNormalWrapped,,,SourceCharacter wraps TargetCharacter in a blanket.,, -ItemArmsWrappedBlanketSetShouldersWrapped,,,SourceCharacter wraps TargetCharacter with her shoulders in a blanket.,, -ItemArmsWrappedBlanketSetFeetWrapped,,,SourceCharacter wraps TargetCharacter with her feet in a blanket.,, -ItemArmsWrappedBlanketSetFullWrapped,,,SourceCharacter fully wraps TargetCharacter in a blanket.,, -SelectItem,,,Select an item to use.,, -SelectItemGroup,,,Select an item to use on the GroupName.,, -SelectActivity,,,Select an activity.,, -SelectActivityGroup,,,Select an activity to use on the GroupName.,, -CraftedItemProperties,,,Crafted item properties.,, -CannotUseOnSelf,,,Cannot use on yourself.,, -RequireSelfBondage1,,,Requires self-bondage 1.,, -RequireSelfBondage2,,,Requires self-bondage 2.,, -RequireSelfBondage3,,,Requires self-bondage 3.,, -RequireSelfBondage4,,,Requires self-bondage 4.,, -RequireSelfBondage5,,,Requires self-bondage 5.,, -RequireSelfBondage6,,,Requires self-bondage 6.,, -RequireSelfBondage7,,,Requires self-bondage 7.,, -RequireSelfBondage8,,,Requires self-bondage 8.,, -RequireSelfBondage9,,,Requires self-bondage 9.,, -RequireSelfBondage10,,,Requires self-bondage 10.,, -RemoveClothesForItem,,,Remove some clothes first.,, -UnZipSuitForItem,,,Unzip the suit first.,, -RemoveSuspensionForItem,,,Remove the suspension first.,, -ReleaseHogtieForItem,,,Release from hogtie first.,, -RemoveRestraintsFirst,,,Remove some restraints first.,, -CannotBeUsedWhenMounted,,,Cannot be used when mounted.,, -CannotBeUsedWhenYoked,,,Cannot be used while yoked.,, -CannotBeUsedWithFeetSpreader,,,Cannot be used while the legs are spread.,, -CannotBeUsedWhileServingDrinks,,,Cannot be used while serving drinks.,, -CannotHaveWand,,,Remove the wand first.,, -CannotUse,,,Cannot use this.,, -RemoveChastityFirst,,,Must remove chastity first.,, -RemoveChainForItem,,,Remove the chain first.,, -MustCollaredFirst,,,A collar must be fitted first to attach accessories to.,, -MustBeOnBed,,,Must be on a bed to attach addons to.,, -AddItemsToUse,,,Must have an arm/torso/pelvis item to use ceiling tethers.,, -MustBeArmCuffedFirst,,,Must be wearing a set of arm cuffs first.,, -MustBeFeetCuffedFirst,,,Must be wearing a set of ankle cuffs first.,, -NoClothAndCollared,,,Remove some clothes and requires a collar.,, -LegsCannotOpen,,,Legs cannot open.,, -LegsCannotClose,,,Legs cannot close.,, -MustBeAbleToKneel,,,Must be able to kneel.,, -MustStandUpFirst,,,Must stand up first.,, -MustFreeFeetFirst,,,Must free feet first.,, -MustFreeArmsFirst,,,Must free arms first.,, -MustFreeLegsFirst,,,Must free legs first.,, -MustFreeHandsFirst,,,Must free hands first.,, -RemoveShacklesFirst,,,Must remove shackles first.,, -RemoveFaceMaskFirst,,,Must remove face mask first.,, -MustFreeVulvaFirst,,,Must empty vulva first.,, -MustFreeClitFirst,,,Must remove clitoris piercings first,, -MustFreeButtFirst,,,Must empty butt first.,, -OwnerBlockedRemotes,,,The use of remotes is forbidden by your owner,, -CannotBeUsedOverGag,,,Cannot be used over the applied gags.,, -CannotBeUsedOverMask,,,Cannot be used over the applied mask.,, -CannotBeUsedOverHood,,,Cannot be used over the applied hood.,, -NeedsNippleRings,,,Requires round piercings on nipples.,, -BlockedByRoom,,,Blocked in this room.,, -Cancel,,,Cancel,, -Exit,,,Back to character,, -Next,,,View next items,, -Prev,,,View previous items,, -Crafting,,,Crafted properties,, -CraftingMember,,,Crafter: MemberName (MemberNumber),, -CraftingName,,,Name: CraftName,, -CraftingDescription,,,Description: CraftDescription,, -CraftingProperty,,,Property: CraftProperty,, -NextPage,,,View next page,, -PrevPage,,,View previous page,, -Remove,,,Remove the item,, -Use,,,Use this item,, -UseDisabled,,,Unable to use due to player permissions,, -Struggle,,,Try to struggle out,, -Dismount,,,Dismount,, -Escape,,,Escape from the item,, -LockMenu,,,Lock related actions,, -Lock,,,Use a lock,, -LockDisabled,,,Unable to lock item due to player permissions,, -Unlock,,,Unlock the item,, -PickLock,,,Try to pick the lock,, -PickLockJammed,,,Try to pick the lock (jammed),, -LockCancel,,,Return to the item menu,, -CraftingCancel,,,Return to the item menu,, -InspectLock,,,Inspect the lock,, -InspectLockDisabled,,,Unable to inspect due to player permissions,, -Remote,,,Use your remote,, -RemoteDisabled,,,Unable to use due to player permissions,, -RemoteDisabledForNoRemote,,,You have not bought a remote yet.,, -RemoteDisabledForNoRemoteOwnerRuleActive,,,Your owner is preventing you from using remotes.,, -RemoteDisabledForNoLoversRemote,,,You have not bought a lover's remote yet.,, -RemoteDisabledForRemotesBlocked,,,Using remotes on this item has been blocked,, -RemoteDisabledForNoAccess,,,You do not have access to this item,, -RemoteDisabledForCannotInteract,,,Your hands must be free to use remotes,, -DialogNormalMode,,,Exit permission mode,, -DialogPermissionMode,,,Edit item permissions,, -Activity,,,Sexual activities,, -ShowAllZones,,,Show all zones,, -ButtPump,,,Use the butt plug's pump,, -ColorPick,,,Color of next item,, -ColorPickDisabled,,,Unable to change color due to player permissions,, -ColorChange,,,Change color,, -ColorSelect,,,Use this color,, -ColorCancel,,,Default color,, -ColorSave,,,Save color to currently selected slot,, -Challenge,,,Challenge:,, -Swapping,,,Swapping...,, -Picking,,,Picking the lock...,, -Decoding,,,Decoding the lock...,, -Hacking,,,Hacking the item...,, -Struggling,,,Struggling...,, -Unlocking,,,Unlocking...,, -Removing,,,Removing...,, -Dismounting,,,Dismounting...,, -Escaping,,,Escaping...,, -Locking,,,Locking...,, -Adding,,,Adding...,, -Using75,,,Using 75% of your skill...,, -Using50,,,Using 50% of your skill...,, -Using25,,,Using 25% of your skill...,, -Using0,,,Using none of your skill...,, -Impossible,,,Impossible to escape!,, -Strength,,,Use brute force,, -Flexibility,,,Try to squeeze out,, -Dexterity,,,Try to unfasten,, -ChooseStruggleMethod,,,Choose struggling method...,, -CanStruggle,,,Struggle to free yourself,, -CannotStruggle,,,You'll need help to get out,, -CanUnlock,,,You can unlock yourself,, -CannotUnlock,,,You cannot unlock yourself,, -ZoneBlocked,,,This zone is out of reach from another item,, -LockZoneBlocked,,,Another item is blocking access to this lock,, -AccessBlocked,,,You cannot access your items,, -NoItems,,,You have no items in this category,, -ProgressDex,,,Click when the player reaches the buckle to progress,, -ProgressFlex,,,Click the ropes before they hit the ground to progress,, -ProgressClick,,,Click here to speed up the progress,, -ProgressKeys,,,Alternate keys A and S to speed up,, -ProgressKeysController,,,Alternate keys A and S or X and Y on a Controller to speed up,, -SelectInflateLevel,,,Select inflation level,, -GwenHoodSelectStyle,,,Select hood style,, -GwenHoodStyleHairOutAccOut,,,Hair out & Accessories out,, -GwenHoodStyleHairInAccOut,,, Hair in & Accessories out ,, -GwenHoodStyleHairOutAccIn,,, Hair out & Accessories in ,, -GwenHoodStyleHairInAccIn,,, Hair in & Accessories in ,, -GwenHoodChangeStyleHairOutAccOut,,,SourceCharacter changes the style of DestinationCharacter gwen hood.,, -GwenHoodChangeStyleHairInAccOut,,,SourceCharacter changes the style of DestinationCharacter gwen hood.,, -GwenHoodChangeStyleHairOutAccIn,,,SourceCharacter changes the style of DestinationCharacter gwen hood.,, -GwenHoodChangeStyleHairInAccIn,,,SourceCharacter changes the style of DestinationCharacter gwen hood.,, -SelectOpenFaceHoodStyle,,,Select a hood style.,, -OpenFaceHoodStyleHideBackHair,,,Hair in,, -OpenFaceHoodStyleShowBackHair,,,Hair out,, -ClothJacketSelect,,,Select the hoodie style.,, -ClothJacketNormal,,,None,, -ClothJacketHooded,,,Hooded,, -ClothJacketHoodedEarsOut,,,Hooded (ears visible),, -ClothAccessoryScarfSelect,,,Select a scarf style.,, -ClothAccessoryScarfHideMouth,,,Hide Mouth,, -ClothAccessoryScarfBundled,,,Bundled,, -ClothAccessoryScarfShowMouth,,,Normal,, -ItemHoodOpenFaceHoodSetHideBackHair,,,SourceCharacter changes the style of DestinationCharacter hood.,, -ItemHoodOpenFaceHoodSetShowBackHair,,,SourceCharacter changes the style of DestinationCharacter hood.,, -PumpLevel0,,,Pump gag level: Empty,, -PumpLevel1,,,Pump gag level: Light,, -PumpLevel2,,,Pump gag level: Inflated,, -PumpLevel3,,,Pump gag level: Bloated,, -PumpLevel4,,,Pump gag level: Full mouth,, -InflateLevelEmpty,,,Empty,, -InflateLevelLight,,,Light,, -InflateLevelInflated,,,Inflated,, -InflateLevelBloated,,,Bloated,, -InflateLevelMaximum,,,Maximum,, -InflateLevel0,,,Inflation level: Empty,, -InflateLevel1,,,Inflation level: Light,, -InflateLevel2,,,Inflation level: Inflated,, -InflateLevel3,,,Inflation level: Bloated,, -InflateLevel4,,,Inflation level: Max,, -SelectSuctionLevel,,,Select suction level,, -SuctionLevelLoose,,,Loose,, -SuctionLevelLight,,,Light,, -SuctionLevelMedium,,,Medium,, -SuctionLevelHeavy,,,Heavy,, -SuctionLevelMaximum,,,Maximum,, -ClearFacialExpressions,,,Clear facial expressions,, -WinkFacialExpressions,,,Wink/Blink,, -BlindToggleFacialExpressions,,,Toggle closed eyes blindness,, -ClearActivePoses,,,Clear active poses,, -PoseMenu,,,Pose,, -DeflateIt,,,Deflate it,, -PumpIt,,,Pump it,, -pumps,,,pumps,, -deflates,,,deflates,, -plug,,,plug,, -gag,,,gag,, -'s,,,'s,, -Heads,,,Heads,, -Tails,,,Tails,, -Her,,,her,, -Herself,,,herself,, -Someone,,,Someone,, -KneelDown,,,SourceCharacter kneels down,, -StandUp,,,SourceCharacter stands up,, -KneelDownPass,,,SourceCharacter carefully lowers herself down.,, -StandUpPass,,,SourceCharacter manages to get to her feet.,, -KneelDownFail,,,SourceCharacter almost loses her balance trying to kneel down!,, -StandUpFail,,,SourceCharacter tries to stand up but loses her balance and falls!,, -HelpKneelDown,,,SourceCharacter helps TargetCharacter to kneel down,, -HelpStandUp,,,SourceCharacter helps TargetCharacter to stand up,, -ChangeClothes,,,SourceCharacter changes DestinationCharacter clothes.,, -LARPChangeTeamClass,,,SourceCharacter selects her team and class.,, -LARPGameStart,,,SourceCharacter has started the LARP game.,, -MagicBattleGameStart,,,SourceCharacter has started the Magic Battle.,, -SafewordDisabled,,,"Your safeword is disabled, it cannot be used at the moment.",, -Private,,,Private,, -Public,,,Public,, -Locked,,,Locked,, -Unlocked,,,Unlocked,, -CantChangeWhileLocked,,,Cannot change while locked,, -Delete,,,Delete,, -ConfirmDelete,,,Confirm,, -Beep,,,Beep,, -BeepFrom,,,Beep from,, -BeepWithMessage,,,With Message,, -BeepWithMail,,,(Mail),, -BeepFromOwner,,,Beep from your owner in your private room,, -SentBeep,,,Sent at,, -ChatRoomSpaceAsylum,,,Asylum,, -InAsylum,,,in the Asylum,, -InLarp,,,in LARP,, -InMagicBattle,,,in Magic Battle,, -ReceivedBeep,,,Received at,, -YourRoom,,,Your private room,, -InRoom,,,in room,, -PrivateRoom,,,Private room,, -WrestlingRing,,,Wrestling Ring,, -Introduction,,,Introduction,, -KidnapLeague,,,Kidnappers League,, -MaidQuarters,,,Maid Quarters,, -MainHall,,,Main Hall,, -Management,,,Club Management,, -Shibari,,,Shibari Dojo,, -Bedroom,,,Bedroom,, -HorseStable,,,Horse Stable,, -Nursery,,,Nursery,, -PrisonHall,,,Prison Hall,, -BDSMRoomBlue,,,BDSM Room Blue,, -BDSMRoomPurple,,,BDSM Room Purple,, -BDSMRoomRed,,,BDSM Room Red,, -Gardens,,,Gardens,, -IndoorPool,,,Indoor Pool,, -OutdoorPool,,,Outdoor Pool,, -MaidCafe,,,Maid Café,, -PublicBath,,,Public Bath,, -Onsen,,,Onsen,, -ParkDay,,,Park Day,, -ParkNight,,,Park Night,, -ChillRoom,,,Chill Room,, -Boudoir,,,Boudoir,, -Kitchen,,,Kitchen,, -DiningRoom,,,Dining Room,, -BondageBedChamber,,,Bondage Bedchamber,, -Beach,,,Beach,, -SheikhPrivate,,,Sheikh Private Room,, -SheikhTent,,,Sheikh Tent,, -SlumApartment,,,Slum Apartment,, -ForestPath,,,Forest Path,, -DeepForest,,,Deep Forest,, -SpookyForest,,,Spooky Forest,, -SlumRuins,,,Slum Ruins,, -AbandonedBuilding,,,Abandoned Building,, -AbandonedSideRoom,,,Abandoned Side Room,, -BalconyNight,,,Balcony Night,, -CozyLivingRoom,,,Cozy Living Room,, -RooftopParty,,,Rooftop Party,, -PartyBasement,,,Party Basement,, -CosyChalet,,,Cosy Chalet,, -AlchemistOffice,,,Alchemist Office,, -ResearchPrep,,,Research Lab,, -ResearchProgress,,,Research Lab,, -HellEntrance,,,Entrance to Hell,, -HeavenEntrance,,,Entrance to Heaven,, -OldFarm,,,Old Farm,, -RustySaloon,,,Rusty Saloon,, -PirateIsland,,,Pirate Island,, -PirateIslandNight,,,Pirate Island Night,, -ShipDeck,,,Ship's Deck,, -Shipwreck,,,Ship Wreck,, -CaptainCabin,,,Captain Cabin,, -UnderwaterOne,,,Underwater One,, -BeachHotel,,,Beach Hotel,, -DystopianCity,,,Dystopian City,, -ForestCave,,,Forest Cave,, -Kennels,,,Kennels,, -LockerRoom,,,Locker Room,, -SciFiCell,,,Sci Fi Cell,, -SpaceCaptainBedroom,,,Space Station Captain Bedroom,, -TiledBathroom,,,Tiled Bathroom,, -WoodenCabin,,,Wooden Cabin,, -MedinaMarket,,,Medina Market,, -ThroneRoom,,,Throne Room,, -Dungeon,,,Dungeon,, -Industrial,,,Industrial,, -SunTemple,,,Sun Temple,, -BackAlley,,,Back Alley,, -CreepyBasement,,,Creepy Basement,, -Cellar,,,Cellar,, -SlumCellar,,,Slum Cellar,, -BarRestaurant,,,Bar Restaurant,, -DungeonRuin,,,Ruined Dungeon,, -SlipperyClassroom,,,Slippery Classroom,, -MiddletownSchool,,,Middletown School,, -SchoolHospital,,,School Hospital,, -SchoolRuins,,,Abandoned School,, -SecretChamber,,,Secret Chamber,, -VaultCorridor,,,Vault Corridor,, -AncientRuins,,,Ancient Ruins,, -JungleTemple,,,Jungle Temple,, -CeremonialVenue,,,Ceremony Venue,, -BeachCafe,,,Beach Promenade Café,, -BoutiqueMain,,,Boutique Shop,, -BoutiqueBack,,,Shop Dressing Rooms,, -Confessions,,,Confessions,, -DesolateVillage,,,Desolate Village,, -LostVages,,,Lost Wages Casino,, -WeddingRoom,,,Wedding Room,, -WeddingArch,,,Wedding Arch,, -WeddingBeach,,,Wedding Beach,, -WitchWood,,,Witch Wood,, -ParkWinter,,,Park Winter,, -XmasEve,,,Xmas Eve Lounge,, -XmasDay,,,Xmas Day Lounge,, -StreetNight,,,Street Night,, -SnowyStreet,,,Snowy Street,, -SynthWave,,,Virtual World,, -AsylumEntrance,,,Entrance,, -AsylumBedroom,,,Bedroom,, -AsylumMeeting,,,Meeting,, -AsylumTherapy,,,Therapy,, -PaddedCell,,,Padded Cell,, -PaddedCell2,,,Padded Cell 2,, -AsylumGGTSRoom,,,GGTS Computer Room,, -Ranch,,,Ranch,, -OutdoorPool2,,,Luxury Pool,, -Wagons,,,Wagon Circle,, -Desert,,,Desert,, -WesternStreet,,,Western Street,, -RainyForestPathDay,,,Rainy Forest Path Day,, -RainyForstPathNight,,,Rainy Forest Path Night,, -RainyStreetDay,,,Rainy Street Day,, -RainyStreetNight,,,Rainy Street Night,, -SnowyChaletDay,,,Snowy Chalet Day,, -SnowyChaletNight,,,Snowy Chalet Night,, -SnowyDeepForest,,,Snowy Deep Forest,, -SnowyForestPathDay,,,Snowy Forest Path Day,, -SnowyForestPathNight,,,Snowy Forest Path Night,, -SnowyLakeNight,,,Snowy Lake Night,, -SnowyStreetDay1,,,Snowy Street Day 1,, -SnowyStreetDay2,,,Snowy Street Day 2,, -SnowyStreetNight2,,,Snowy Street Night,, -SnowyTown1,,,Snowy Town 1,, -SnowyTown2,,,Snowy Town 2,, -NightClub,,,Nightclub,, -EgyptianExhibit,,,Egyptian Exhibit,, -SciFiOutdoors,,,Sci Fi Outdoors,, -Castle,,,Fancy Castle,, -EgyptianTomb,,,Egyptian Tomb,, -PoolBottom,,,Pool Bottom,, -LatexRoom,,,Latex Room,, -OutsideCells,,,Outside Cells,, -Infiltration,,,Infiltration Bunker,, -MovieStudio,,,Movie Studio,, -CollegeTennis,,,Tennis Court,, -CollegeTheater,,,Theater,, -CollegeClass,,,College Classroom,, -SchoolHallway,,,School Hallway,, -HotelBedroom,,,Hotel Bedroom,, -Yacht1,,,Yacht Chill Room,, -Yacht2,,,Yacht Main Hall,, -Yacht3,,,Yacht Deck,, -Office1,,,Luxury Office,, -Office2,,,Open Office,, -EmptyWarehouse,,,Empty Warehouse,, -LeatherChamber,,,Leather Chamber,, -SciFiRed,,,Red Sci-Fi Room,, -LingerieShop,,,Lingerie Shop,, -Restaurant1,,,Restaurant 1,, -Restaurant2,,,Restaurant 2,, -HotelBedroom2,,,Hotel Bedroom 2,, -BeachSunset,,,Beach Sunset,, -Gymnasium,,,Gymnasium,, -ExtendedItemUnlockBeforeChange,,,Remove locks before changing,, -ExtendedItemNoItemPermission,,,Blocked due to item permissions,, -IntroductionMaidGreetings,,,"(As you enter the luxurious hallway, a maid comes to greet you.) Welcome to the Bondage Club, is this your first visit?",, -ServerMessageOfferStartTrial,,,"SourceCharacter is offering you to start a trial period as her submissive. Click on her and manage your relationship to accept, don't do anything to refuse.",, -ServerMessageStartTrial,,,The Bondage Club is pleased to announce that SourceCharacter is starting a 7 days minimum trial period as a submissive.,, -ServerMessageOfferEndTrial,,,"SourceCharacter has prepared a great collaring ceremony. A maid brings a slave collar, which her submissive must consent to wear.",, -ServerMessageEndOwnershipTrial,,,The Bondage Club announces that SourceCharacter canceled the trial ownership of TargetCharacter.,, -ServerMessageEndOwnership,,,The Bondage Club announces that SourceCharacter released TargetCharacter from her ownership.,, -ServerMessageEndTrial,,,The Bondage Club is proud to announce that SourceCharacter is now fully collared. Her fate is in her Mistress hands.,, -ServerMessageOwnerRuleChangeAllow,,,Your owner is now allowing you to access your wardrobe and change clothes.,, -ServerMessageOwnerRuleChangeBlock1Hour,,,Your owner has blocked your wardrobe access for an hour. You won't be able to change clothes.,, -ServerMessageOwnerRuleChangeBlock1Day,,,Your owner has blocked your wardrobe access for a day. You won't be able to change clothes.,, -ServerMessageOwnerRuleChangeBlock1Week,,,Your owner has blocked your wardrobe access for a week. You won't be able to change clothes.,, -ServerMessageOwnerRuleChangeBlock,,,Your owner has blocked your wardrobe access. You won't be able to change clothes until that rule is revoked.,, -ServerMessageOwnerRuleTalkAllow,,,Your owner is now allowing you to talk publicly when she's there.,, -ServerMessageOwnerRuleTalkBlock,,,Your owner is now preventing you from talking publicly when she's there.,, -ServerMessageOwnerRuleEmoteAllow,,,Your owner is now allowing you to emote when she's there.,, -ServerMessageOwnerRuleEmoteBlock,,,Your owner is now preventing you from emoting when she's there.,, -ServerMessageOwnerRuleWhisperAllow,,,Your owner is now allowing you to whisper to other members when she's there.,, -ServerMessageOwnerRuleWhisperBlock,,,Your owner is now preventing you from whispering to other members when she's there.,, -ServerMessageOwnerRuleChangePoseAllow,,,Your owner is now allowing you to change your pose when she's there.,, -ServerMessageOwnerRuleChangePoseBlock,,,Your owner is now preventing you from changing your pose when she's there.,, -ServerMessageOwnerRuleAccessSelfAllow,,,Your owner is now allowing you to access yourself when she's there.,, -ServerMessageOwnerRuleAccessSelfBlock,,,Your owner is now preventing you from accessing yourself when she's there.,, -ServerMessageOwnerRuleAccessOtherAllow,,,Your owner is now allowing you to access others when she's there.,, -ServerMessageOwnerRuleAccessOtherBlock,,,Your owner is now preventing you from accessing others when she's there.,, -ServerMessageOwnerRuleKeyAllow,,,Your owner is now allowing you to have keys. You can buy keys from the club shop.,, -ServerMessageOwnerRuleKeyConfiscate,,,Your owner has confiscated your keys. All your regular keys are lost.,, -ServerMessageOwnerRuleKeyBlock,,,Your owner is now preventing you from getting new keys. The club shop will not sell keys to you anymore.,, -ServerMessageOwnerRuleSelfOwnerLockAllow,,,Your owner is now allowing to using owner locks on yourself.,, -ServerMessageOwnerRuleSelfOwnerLockBlock,,,Your owner is now preventing you from using owner locks on yourself.,, -ServerMessageOwnerRuleRemoteAllow,,,Your owner is now allowing you to have remotes. You can buy remotes from the club shop.,, -ServerMessageOwnerRuleRemoteAllowSelf,,,Your owner is now allowing you to use remotes on yourself.,, -ServerMessageOwnerRuleRemoteConfiscate,,,Your owner has confiscated your remotes. All your remotes are lost.,, -ServerMessageOwnerRuleRemoteBlock,,,Your owner is now preventing you from getting new remotes. The club shop will not sell remotes to you anymore.,, -ServerMessageOwnerRuleRemoteBlockSelf,,,Your owner is now preventing you from using remotes on yourself.,, -ServerMessageOwnerRuleCollarWear,,,Your owner has locked the slave collar on your neck.,, -ServerMessageOwnerRuleCollarRelease,,,Your owner released you from the slave collar.,, -ServerMessageOwnerRuleNicknameAllow,,,Your owner is now allowing you to change your nickname.,, -ServerMessageOwnerRuleNicknameBlock,,,Your owner is now preventing you from changing your nickname.,, -ServerMessageOwnerRuleBlockScreen,,,Your owner has changed the Bondage Club areas you can access.,, -ServerMessageOwnerRuleBlockAppearance,,,Your owner has changed the appearance zones you can modify.,, -ServerMessageOwnerRuleForbiddenWords,,,"Your owner has changed your list of forbidden words. You can use /forbiddenwords to review the words.",, -ServerMessageForbiddenWordsBlocked,,,"Saying a forbidden word is blocked by your owner. You can use /forbiddenwords to review the words.",, -ServerMessageForbiddenWordsMute5,,,"You said a forbidden word and will be silenced for 5 minutes. You can use /forbiddenwords to review the words.",, -ServerMessageForbiddenWordsMute15,,,"You said a forbidden word and will be silenced for 15 minutes. You can use /forbiddenwords to review the words.",, -ServerMessageForbiddenWordsMute30,,,"You said a forbidden word and will be silenced for 30 minutes. You can use /forbiddenwords to review the words.",, -ServerMessageLoverRuleSelfLoverLockAllow,,,Your lover is now allowing you to use lovers locks on yourself.,, -ServerMessageLoverRuleSelfLoverLockBlock,,,Your lover is now preventing you from using lovers locks on yourself.,, -ServerMessageLoverRuleOwnerLoverLockAllow,,,Your lover is now allowing your owner to use lovers locks on you.,, -ServerMessageLoverRuleOwnerLoverLockBlock,,,Your lover is now preventing your owner from using lovers locks on you.,, -ServerMessageOfferBeginDating,,,"SourceCharacter is asking you to be her girlfriend. Click on her and manage your relationship to accept, don't do anything to refuse.",, -ServerMessageBeginDating,,,The Bondage Club is pleased to announce that SourceCharacter and TargetCharacter are starting a 7 days minimum period as lovers.,, -ServerMessageOfferBeginEngagement,,,"SourceCharacter is asking you to become her fiancée. Click on her and manage your relationship to accept, don't do anything to refuse.",, -ServerMessageBeginEngagement,,,The Bondage Club is pleased to announce that SourceCharacter and TargetCharacter are now engaged and are starting a 7 days minimum period as fiancées.,, -ServerMessageOfferBeginWedding,,,"SourceCharacter is proposing you to become her wife. Click on her and manage your relationship to accept, don't do anything to refuse.",, -ServerMessageBeginWedding,,,The Bondage Club is proud to announce that SourceCharacter and TargetCharacter are now married. Long may it last.,, -ServerEnter,,,SourceCharacter entered.,, -ServerLeave,,,SourceCharacter left.,, -ServerDisconnect,,,SourceCharacter disconnected.,, -ServerBan,,,TargetCharacterName was banned by SourceCharacter.,, -ServerKick,,,SourceCharacter called the maids to escort TargetCharacterName out of the room.,, -ServerMoveLeft,,,TargetCharacterName was moved to the left by SourceCharacter.,, -ServerMoveRight,,,TargetCharacterName was moved to the right by SourceCharacter.,, -ServerSwap,,,SourceCharacter swapped TargetCharacterName and DestinationCharacterName places.,, -ServerShuffle,,,SourceCharacter shuffles the position of everyone in the room randomly.,, -ServerPromoteAdmin,,,TargetCharacterName was promoted to administrator by SourceCharacter.,, -ServerDemoteAdmin,,,TargetCharacterName was demoted from administration by SourceCharacter.,, -ServerUpdateRoom,,,SourceCharacter updated the room. Name: ChatRoomName. Limit: ChatRoomLimit. ChatRoomPrivacy. ChatRoomLocked.,, -OnlineBountySuitcaseStart,,,SourceCharacter starts unlocking DestinationCharacterName suitcase! She will finish in 5 minutes.,, -OnlineBountySuitcaseStartOpened,,,SourceCharacter starts stealing more data from DestinationCharacterName laptop! She will finish in 5 minutes.,, -OnlineBountySuitcaseEndEarly,,,SourceCharacter's suitcase is safe... for now.,, -OnlineBountySuitcaseEndEarlyOpened,,,SourceCharacter's data is safe... for now.,, -OnlineBountySuitcaseOngoing,,,SourceCharacter's suitcase will be open in TIMEREMAINING minutes. Make sure she is secure until then!,, -OnlineBountySuitcaseOngoingOpened,,,SourceCharacter's data will be ready in TIMEREMAINING minutes. Make sure she is secure until then!,, -OnlineBountySuitcaseFinish,,,You find confidential club secrets worth MONEYAMOUNT$ on the black market.,, -OnlineBountySuitcaseEnd,,,"The kidnappers opened your suitcase, which contains a laptop with a bunch of secret information. You better get back to the league to warn them.",, -OnlineBountySuitcaseEndOpened,,,The kidnappers have stolen even more data using your laptop.,, -ChatRoomBlockGaggedOOC,,,You have disabled OOC/whispers while gagged. You can change this in the Immersion preferences screen.,, -ChatRoomStimulationMessageTalk0,,,You choke momentarily on the AssetName inside your throat.,, -ChatRoomStimulationMessageTalk1,,,It is difficult to breath with the AssetName pushing inside your throat.,, -ChatRoomStimulationMessageTalk2,,,Your jaw aches from the AssetName shoved down your throat.,, -ChatRoomStimulationMessageCrotchRope0,,,Your AssetName rubs against your vulva.,, -ChatRoomStimulationMessageCrotchRope1,,,The knot on your AssetName rubs against your clitoris.,, -ChatRoomStimulationMessageCrotchRope2,,,The AssetName between your legs digs into your crotch.,, -ChatRoomStimulationMessagePlugFront0,,,You feel the AssetName shift around inside your AssetGroup.,, -ChatRoomStimulationMessagePlugFront1,,,You notice the AssetName stuffed between your legs.,, -ChatRoomStimulationMessagePlugFront2,,,The AssetName inside of you teases you constantly.,, -ChatRoomStimulationMessagePlugBack0,,,The AssetName inside of you shifts around as you move.,, -ChatRoomStimulationMessagePlugBack1,,,Your AssetName stimulates you constantly as you move around.,, -ChatRoomStimulationMessagePlugBack2,,,The AssetName inside your AssetGroup feels awkward as you move.,, -ChatRoomStimulationMessagePlugBoth0,,,The plugs keep reminding you of their presence.,, -ChatRoomStimulationMessagePlugBoth1,,,Your plugs torment you endlessly.,, -ChatRoomStimulationMessagePlugBoth2,,,The plugs stuffed inside you keep you constantly on edge.,, -ChatRoomStimulationMessageVibe0,,,The vibration in your sensitive areas is impossible to ignore.,, -ChatRoomStimulationMessageVibe1,,,Your body trembles from the AssetName' constant stimulation.,, -ChatRoomStimulationMessageVibe2,,,You can't stop noticing the AssetName teasing you.,, -ChatRoomStimulationMessageInflated0,,,The bloated AssetName in your AssetGroup makes you squirm.,, -ChatRoomStimulationMessageInflated1,,,You can't help but squeeze the bulging AssetName as you move.,, -ChatRoomStimulationMessageInflated2,,,You bite your lips as you're reminded of the AssetName filling your AssetGroup.,, -ChatRoomStimulationMessageVibePlugFront0,,,The vibration deep inside your AssetGroup teases you relentlessly.,, -ChatRoomStimulationMessageVibePlugFront1,,,The AssetName inside of you vibrates endlessly.,, -ChatRoomStimulationMessageVibePlugFront2,,,The AssetName inside of you keeps you on edge.,, -ChatRoomStimulationMessageVibePlugBack0,,,Your AssetGroup feels numb from the vibrations.,, -ChatRoomStimulationMessageVibePlugBack1,,,The vibrations in your AssetGroup leave you panting without release.,, -ChatRoomStimulationMessageVibePlugBack2,,,The vibrator inside your AssetGroup teases you constantly.,, -ChatRoomStimulationMessageWiggling0,,,Your AssetName wiggles from your AssetGroup as you move.,, -ChatRoomStimulationMessageWiggling1,,,You feel a sharp pain in your AssetGroup as the AssetName wiggle slightly.,, -ChatRoomStimulationMessageWiggling2,,,The AssetName hanging from your AssetGroup get shuffled as you move around.,, -ChatRoomHelp,,,Type /help for a list of commands,, -ChatRoomLeashNotFriend,,,You are not on that member's friendlist; ask her to friend you before leashing her.,, -ActionSwap,,,SourceCharacter swaps a PrevAsset for a NextAsset on DestinationCharacter FocusAssetGroup.,, -ActionUse,,,SourceCharacter uses a NextAsset on DestinationCharacter FocusAssetGroup.,, -ActionChangeColor,,,SourceCharacter changes the color of NextAsset on DestinationCharacter FocusAssetGroup.,, -ActionLock,,,SourceCharacter locks a NextAsset on DestinationCharacter FocusAssetGroup.,, -ActionAddLock,,,SourceCharacter adds a NextAsset on DestinationCharacter FocusAssetGroup PrevAsset.,, -ActionRemove,,,SourceCharacter removes the PrevAsset from DestinationCharacter FocusAssetGroup.,, -ActionUnlock,,,SourceCharacter unlocks the PrevAsset on DestinationCharacter FocusAssetGroup.,, -ActionPick,,,SourceCharacter picks the lock on DestinationCharacter PrevAsset.,, -ActionUnlockAndRemove,,,SourceCharacter unlocks and removes the PrevAsset from DestinationCharacter FocusAssetGroup.,, -ActionDice,,,SourceCharacter rolls DiceType. The result is: DiceResult.,, -ActionCoin,,,SourceCharacter flips a coin. The result is: CoinResult.,, -ActionActivateSafewordRevert,,,SourceCharacter used her safeword. Please check for her well-being.,, -ActionActivateSafewordRelease,,,SourceCharacter used her safeword and wants to be released. She is guided out of the room for her safety.,, -ActionGrabbedForCell,,,"TargetCharacterName gets grabbed by two maids and locked in a timer cell, following her owner's commands.",, -ActionGrabbedForGGTS,,,"TargetCharacterName gets grabbed by two nurses wearing futuristic gear and locked in the Asylum for GGTS, following her owner's commands.",, -ActionGrabbedToServeDrinks,,,TargetCharacterName gets grabbed by two maids and escorted to the maid quarters to serve drinks for her owner.,, -ActionGiveEnvelopeToOwner,,,TargetCharacterName gives a sealed envelope to her owner.,, -ActionActivitySpankItem,,,SourceCharacter hits DestinationCharacter FocusAssetGroup with a NextAsset.,, -ActionActivityMasturbateItem,,,SourceCharacter holds a NextAsset against DestinationCharacter FocusAssetGroup.,, -ActionActivityTickleItem,,,SourceCharacter tickles DestinationCharacter FocusAssetGroup with a NextAsset.,, -ActionActivityRubItem,,,SourceCharacter rubs DestinationCharacter FocusAssetGroup with a NextAsset.,, -ActionActivityRollItem,,,SourceCharacter rolls a NextAsset over DestinationCharacter FocusAssetGroup.,, -ActionActivityPourItem,,,SourceCharacter pours NextAsset onto DestinationCharacter FocusAssetGroup.,, -ActionActivityShockItem,,,SourceCharacter shocks DestinationCharacter FocusAssetGroup with a NextAsset.,, -ActionInterruptedAdd,,,SourceCharacter was interrupted while trying to use a NextAsset on TargetCharacter.,, -ActionInterruptedRemove,,,SourceCharacter was interrupted while going for the PrevAsset on TargetCharacter.,, -ActionInterruptedSwap,,,SourceCharacter was interrupted while swapping a PrevAsset for a NextAsset on TargetCharacter.,, -SlowLeaveAttempt,,,SourceCharacter slowly heads for the door.,, -SlowLeaveCancel,,,SourceCharacter stops heading for the door.,, -SlowLeaveInterrupt,,,SourceCharacter was stopped from leaving.,, -SlowStop,,,SourceCharacter gets in the way of TargetCharacter, preventing them from leaving., -StruggleAssist,,,SourceCharacter tries to help TargetCharacter to struggle free.,, -GiveLockpicks,,,SourceCharacter gives TargetCharacter some lockpicks to help herself with.,, -HoldLeash,,,SourceCharacter grabs the leash of TargetCharacter.,, -StopHoldLeash,,,SourceCharacter releases the leash of TargetCharacter.,, -MaidDrinkPickFreeWater,,,SourceCharacter picks a glass of water from DestinationCharacter tray.,, -MaidDrinkPickFreeOrangeJuice,,,SourceCharacter picks an orange juice from DestinationCharacter tray.,, -MaidDrinkPickFreeBeer,,,SourceCharacter picks a beer from DestinationCharacter tray.,, -MaidDrinkPickFreeWine,,,SourceCharacter picks a glass of wine from DestinationCharacter tray.,, -MaidDrinkPickVirginMojito,,,SourceCharacter buys a Virgin Mojito from DestinationCharacter tray.,, -MaidDrinkPickMargarita,,,SourceCharacter buys a Margarita from DestinationCharacter tray.,, -MaidDrinkPickWhiskey,,,SourceCharacter buys a glass of Whiskey from TargetCharacter.,, -MaidDrinkPickChampagne,,,SourceCharacter buys a glass of champagne from TargetCharacter.,, -MaidDrinkPickLemonadeJug,,,"SourceCharacter buys a jug of refreshing lemonade for everyone, from TargetCharacter.",, -MaidDrinkPickRoundShooters,,,"SourceCharacter buys a round of shooters for everyone, from TargetCharacter.",, -MaidDrinkPickSexOnTheBeachJug,,,"SourceCharacter buys a jug of Sex on the Beach for everyone, from TargetCharacter.",, -MaidDrinkPickBeerPitcher,,,"SourceCharacter buys a beer pitcher for everyone, from TargetCharacter.",, -MaidDrinkPickFreeTea,,,SourceCharacter picks a tea from DestinationCharacter tray.,, -MaidDrinkPickFreeCoffee,,,SourceCharacter picks a coffee from DestinationCharacter tray.,, -MaidDrinkPickHotChocolate,,,SourceCharacter buys a hot chocolate from DestinationCharacter tray.,, -MaidDrinkPickEspresso,,,SourceCharacter buys an espresso from DestinationCharacter tray.,, -MaidDrinkPickCappuccino,,,SourceCharacter buys a cappuccino from DestinationCharacter tray.,, -LockMemberNumber,,,Member number on lock:,, -ItemMemberNumber,,,Item member number:,, -TimerLeft,,,Time left:,, -TimerRestart,,,SourceCharacter restarts the five minutes timer padlock on DestinationCharacter FocusAssetGroup.,, -TimerUnknown,,,Unknown time left,, -RestartTimer,,,Restart Timer,, -TimerAddTime,,,SourceCharacter adds TimerTime TimerUnit to the padlock on DestinationCharacter FocusAssetGroup.,, -TimerRemoveTime,,,SourceCharacter removes TimerTime TimerUnit to the padlock on DestinationCharacter FocusAssetGroup.,, -TimerAddRemoveUnknownTime,,,an unknown amount of time,, -TimerRelease,,,The LockName on DestinationCharacterName FocusAssetGroup opens with a click,, -HighSecurityUpdate,,,SourceCharacter updates the key settings for the lock on DestinationCharacter FocusAssetGroup,, -HighSecuritySave,,,Save key list,, -HighSecuritySaveIntro,,,Enter keyholders' member numbers separated by commas.,, -HighSecurityWarning,,,"You don't have keys, saving will remove your access",, -HighSecurityAppendLover,,,Append lovers,, -HighSecurityAppendOwner,,,Append owner,, -HighSecurityAppendWhitelist,,,Append whitelist,, -CurrentMode,,,Current Mode:,, -FuturisticVibratorIncrease,,,Increase intensity,, -FuturisticVibratorDecrease,,,Decrease intensity,, -FuturisticVibratorDisable,,,Turn off,, -FuturisticVibratorEdge,,,Edge mode,, -FuturisticVibratorRandom,,,Random mode,, -FuturisticVibratorDeny,,,Deny mode,, -FuturisticVibratorTease,,,Tease mode,, -FuturisticVibratorShock,,,Trigger Shock,, -FuturisticVibratorSaveVoiceCommands,,,Save Voice Commands,, -FuturisticVibratorSaveVoiceCommandsAction,,,SourceCharacter changes the voice command settings on DestinationCharacter FocusAssetGroup.,, -FuturisticVibratorChange,,,DestinationCharacterName vibrator switches modes!,, -FuturisticVibratorShockTrigger,,,DestinationCharacterName vibrator lets out a sharp jolt!,, -FuturisticVibratorPermissions,,,Anyone,, -FuturisticVibratorPermissionsProhibitSelf,,,Others,, -FuturisticVibratorPermissionsLockMember,,,Lock Member,, -CombinationFail,,,SourceCharacter tries the code CombinationNumber but fails to open the padlock on DestinationCharacter FocusAssetGroup.,, -CombinationChangeSuccess,,,SourceCharacter changes the code of the padlock on DestinationCharacter FocusAssetGroup.,, -CombinationChangeFail,,,SourceCharacter tries to change the code of the padlock on DestinationCharacter FocusAssetGroup but fails.,, -PasswordFail,,,SourceCharacter tries the word Password but fails to open the lock on DestinationCharacter FocusAssetGroup.,, -PasswordChangeSuccess,,,SourceCharacter changes the password of the lock on DestinationCharacter FocusAssetGroup.,, -EnableRandomInput,,,Enable random input of time from everyone else,, -AddTimerTimeMinutes,,,Add TimerTime minutes to the Timer,, -AddTimerTime,,,Add,, -RemoveItemWithTimer,,,Remove item when the lock timer runs out,, -WillRemoveItemWithTimer,,,The item will be removed when the lock timer runs out,, -WontRemoveItemWithTimer,,,The item will stay when the lock timer runs out,, -ShowItemWithTimerRemaining,,,Show the time remaining/being added,, -Random,,,Random,, -Minutes,,,minutes,, -Hours,,,hours,, -CombinationOld,,,Current Code :,, -CombinationNew,,,New Code :,, -CombinationEnter,,,Open lock,, -CombinationChange,,,Change code,, -CombinationError,,,Wrong code,, -CombinationErrorInput,,,Use 4 digits as a code,, -PasswordPadlockRemoveOnUnlock,,,Remove on Unlock: ,, -PasswordPadlockOld,,,Enter Password :,, -PasswordPadlockEnter,,,Open lock,, -PasswordPadlockSetPassword,,,Set password:,, -PasswordPadlockSetHint,,,Set hint text:,, -PasswordPadlockChangePassword,,,Accept,, -PasswordPadlockError,,,Wrong password,, -PasswordPadlockErrorInput,,,Password must be 8 or fewer letters only,, -TamperLockSetBy,,,Locked by:,, -TamperLockSetTime,,,Locked on:,, -ElectronicTagBadLock,,,This person is locked by different people,, -ElectronicTagGoodLock,,,This person is fully locked by: ,, -ElectronicTagGoodLockYou,,,This person is fully locked by you,, -SelectBondagePosition,,,Select the bondage position,, -SelectTapeWrapping,,,Select the tape wrapping,, -SelectAttachmentState,,,Select an item attachment,, -SelectPiercingState,,,Select the piercing attachment,, -CannotUnlockIfElbowBound,,,A victim cannot unlock herself if her elbows are bound,, -LockPickBreak,,,DestinationCharacterName jammed a lock and broke her lockpick!,, -LockpickTriesRemaining,,,Remaining tries: ,, -LockpickJammed,,,Failing or quitting will break your lockpick for 1 minute,, -LockpickFailed,,,You jammed the lock.,, -LockpickFailedTimeout,,,You are too tired to continue. Time remaining:,, -LockpickIntro,,,Click the pins in the correct order to open the lock!,, -LockpickIntro2,,,Clicking the wrong pin may falsely set it.,, -LockpickIntro3,,,It will fall back after clicking other pins.,, -LockPickArousal,,,Your hands are shaky and you lose some tension by accident!,, -ItemMiscMetalPadlockIntro,,,"""From your friendly hardware store""",, -ItemMiscIntricatePadlockIntro,,,"""Only one key works, but it can be picked""",, -ItemMiscHighSecurityPadlockIntro,,,"""Won't be getting picked on the streets""",, -ItemMiscTimerPadlockIntro,,,You can restart the timer but cannot unlock,, -ItemMiscCombinationPadlockIntro,,,"""If at first, you don't succeed...""",, -ItemMiscOwnerPadlockIntro,,,"""Never forget who you belong to""",, -ItemMiscOwnerPadlockDetail,,,Can only be locked or unlocked by her owner,, -ItemMiscOwnerTimerPadlockIntro,,,"""Never forget who you belong to""",, -ItemMiscOwnerTimerPadlockDetail,,,Can only be unlocked or extended by her owner,, -ItemMiscLoversPadlockIntro,,,"""A loving embrace""",, -ItemMiscLoversPadlockDetail,,,Can only be locked or unlocked by her lover,, -ItemMiscLoversTimerPadlockIntro,,,"""A loving embrace""",, -ItemMiscLoversTimerPadlockDetail,,,Can only be unlocked or extended by her lover,, -ItemMiscMistressPadlockIntro,,,Can only be locked or unlocked by a Club Mistress,, -ItemMiscPandoraPadlockIntro,,,"""Once inside the Box, you may never leave.""",, -ItemMiscMistressTimerPadlockIntro,,,Can only be unlocked or extended by a Club Mistress,, -ItemMiscExclusivePadlockIntro,,,"""Keeping you safe from yourself""",, -ItemMiscExclusivePadlockDetail,,,Can be opened by anyone but the wearer,, -ItemMiscPasswordPadlockIntro,,,"""Finders keepers""",, -ItemMiscPasswordPadlockDetail,,,Can be opened only with the correct password,, -MetalCuffsPoseInFront,,,In-front of body,, -MetalCuffsPoseBehindBack,,,Behind back,, -MetalCuffsRestrainInFront,,,SourceCharacter cuffs DestinationCharacter hands in-front of their body.,, -MetalCuffsRestrainBehindBack,,,SourceCharacter cuffs DestinationCharacter hands behind their back.,, -ItemArmsCeilingShacklesHeadLevel,,,On head level,, -ItemArmsCeilingShacklesOverhead,,,Over the head,, -ItemArmsCeilingShacklesSetHeadLevel,,,SourceCharacter lowers the ceiling shackles on TargetCharacter a bit.,, -ItemArmsCeilingShacklesSetOverhead,,,SourceCharacter raises the ceiling shackles on TargetCharacter over her head.,, -ItemArmsCeilingShacklesSetSuspensionHeadLevel,,,SourceCharacter detaches the shackles on TargetCharacter from the floor.,, -ItemArmsCeilingShacklesSetSuspensionOverhead,,,SourceCharacter attaches the shackles on TargetCharacter to the floor.,, -ItemNeckShinySteelCollarSelect,,,Select ring configuration,, -ItemNeckShinySteelCollarNoRing,,,Without ring,, -ItemNeckShinySteelCollarRing,,,With ring,, -ItemNeckShinySteelCollarSetNoRing,,,SourceCharacter removes the ring from DestinationCharacter collar.,, -ItemNeckShinySteelCollarSetRing,,,SourceCharacter attaches a ring to DestinationCharacter collar.,, -ItemArmsCuffsNone,,,Detached,, -ItemArmsCuffsWrist,,,Bind wrists,, -ItemArmsCuffsElbow,,,Bind elbows,, -ItemArmsCuffsBoth,,,Bind both,, -ItemArmsCuffsHogtie,,,Hogtie,, -ItemArmsLeatherCuffsSetNone,,,SourceCharacter detaches the chain from DestinationCharacter leather cuffs.,, -ItemArmsLeatherCuffsSetWrist,,,SourceCharacter attaches the leather cuffs wrist chain behind DestinationCharacter back.,, -ItemArmsLeatherCuffsSetElbow,,,SourceCharacter attaches the leather cuffs elbow chain behind DestinationCharacter back.,, -ItemArmsLeatherCuffsSetBoth,,,SourceCharacter attaches the leather cuffs wrist and elbow chains behind DestinationCharacter back.,, -ItemArmsLeatherCuffsSetHogtie,,,SourceCharacter attaches the leather cuffs wrist and elbow chains behind DestinationCharacter back and connects the wrist and ankle cuffs.,, -ItemArmsSteelCuffsSetNone,,,SourceCharacter detaches DestinationCharacter steel cuffs.,, -ItemArmsSteelCuffsSetWrist,,,SourceCharacter attaches DestinationCharacter steel cuffs behind her back.,, -FuturisticCuffsRestrainNone,,,SourceCharacter detaches the chain from DestinationCharacter futuristic cuffs.,, -FuturisticCuffsRestrainWrist,,,SourceCharacter attaches the futuristic cuffs wrist chain behind DestinationCharacter back.,, -FuturisticCuffsRestrainElbow,,,SourceCharacter attaches the futuristic cuffs elbow chain behind DestinationCharacter back.,, -FuturisticCuffsRestrainBoth,,,SourceCharacter attaches the futuristic cuffs wrist and elbow chains behind DestinationCharacter back.,, -FuturisticLegCuffsRestrainNone,,,SourceCharacter detaches the chain from DestinationCharacter futuristic leg cuffs.,, -FuturisticLegCuffsRestrainClosed,,,SourceCharacter attaches the futuristic leg cuffs chain on DestinationCharacter legs.,, -FuturisticLegCuffsRestrainChained,,,SourceCharacter attaches the futuristic leg cuffs chain on DestinationCharacter legs.,, -FuturisticAnkleCuffsRestrainNone,,,SourceCharacter detaches the chain from DestinationCharacter futuristic ankle cuffs.,, -FuturisticAnkleCuffsRestrainClosed,,,SourceCharacter attaches the futuristic ankle cuffs chain on DestinationCharacter ankles.,, -FuturisticAnkleCuffsRestrainChained,,,SourceCharacter attaches the futuristic ankle cuffs chain on DestinationCharacter ankles.,, -ItemLegsLeatherLegCuffsNone,,,Detached,, -ItemLegsLeatherLegCuffsClosed,,,Chain Closed,, -ItemLegsLeatherLegCuffsChained,,,Chain Attached,, -ItemLegsLeatherLegCuffsSetNone,,,SourceCharacter detaches the chain from DestinationCharacter leather leg cuffs.,, -ItemLegsLeatherLegCuffsSetClosed,,,SourceCharacter attaches the leather leg cuffs chain on DestinationCharacter legs.,, -ItemLegsLeatherLegCuffsSetChained,,,SourceCharacter attaches the leather leg cuffs chain on DestinationCharacter legs.,, -ItemFeetSteelAnkleCuffsNone,,,Detached,, -ItemFeetSteelAnkleCuffsClosed,,,Attached,, -ItemFeetSteelAnkleCuffsChained,,,Chain Attached,, -ItemFeetSteelAnkleCuffsSetNone,,,SourceCharacter detaches DestinationCharacter AssetName.,, -ItemFeetSteelAnkleCuffsSetClosed,,,SourceCharacter attaches DestinationCharacter AssetName.,, -ItemFeetSteelAnkleCuffsSetChained,,,SourceCharacter attaches the chain on DestinationCharacter AssetName.,, -ItemFeetTentaclesSelect,,,Select tentacle position,, -ItemFeetTentaclesClosed,,,Legs Together,, -ItemFeetTentaclesSpread,,,Legs Spread,, -ItemFeetTentaclesSetClosed,,,SourceCharacter uses the tentacles to bind DestinationCharacter ankles together.,, -ItemFeetTentaclesSetSpread,,,SourceCharacter uses the tentacles to spread DestinationCharacter legs apart.,, -ItemFeetWoodenCuffsLegsOpen,,,Lightly Spread.,, -ItemFeetWoodenCuffsSpread,,,Widely Spread.,, -ItemFeetWoodenCuffsLegsClosed,,,Close together.,, -ItemFeetWoodenCuffsSetLegsOpen,,,SourceCharacter uses wooden cuffs to lock DestinationCharacter feet slightly spread.,, -ItemFeetWoodenCuffsSetSpread,,,SourceCharacter uses wooden cuffs to lock DestinationCharacter feet widely spread.,, -ItemFeetWoodenCuffsSetLegsClosed,,,SourceCharacter uses wooden cuffs to lock DestinationCharacter feet closely together.,, -ItemArmsTentaclesSelect,,,Select tentacle position,, -ItemArmsTentaclesBehindBack,,,Behind back,, -ItemArmsTentaclesOverTheHead,,,Over the head,, -ItemArmsTentaclesSetBehindBack,,,SourceCharacter uses the tentacles to bind DestinationCharacter arms behind her back.,, -ItemArmsTentaclesSetOverTheHead,,,SourceCharacter uses the tentacles to hold DestinationCharacter arms above her head.,, -ItemArmsOrnateCuffsSetNone,,,SourceCharacter detaches the chain from DestinationCharacter Ornate cuffs.,, -ItemArmsOrnateCuffsSetWrist,,,SourceCharacter attaches the Ornate cuffs wrist chain behind DestinationCharacter back.,, -ItemArmsOrnateCuffsSetElbow,,,SourceCharacter attaches the Ornate cuffs elbow chain behind DestinationCharacter back.,, -ItemArmsOrnateCuffsSetBoth,,,SourceCharacter attaches the Ornate cuffs wrist and elbow chains behind DestinationCharacter back.,, -ItemArmsOrnateCuffsSetHogtie,,,SourceCharacter attaches the Ornate cuffs wrist and elbow chains behind DestinationCharacter back and connects the wrist and ankle cuffs.,, -ItemLegsOrnateLegCuffsNone,,,Detached,, -ItemLegsOrnateLegCuffsClosed,,,Chain Closed,, -ItemLegsOrnateLegCuffsChained,,,Chain Attached,, -OrnateAnkleCuffsPoseNone,,,Detached,, -OrnateAnkleCuffsPoseClosed,,,Chain Closed,, -OrnateAnkleCuffsPoseChained,,,Chain Attached,, -ItemLegsOrnateLegCuffsSetNone,,,SourceCharacter detaches the chain from DestinationCharacter Ornate leg cuffs.,, -ItemLegsOrnateLegCuffsSetClosed,,,SourceCharacter attaches the Ornate leg cuffs chain on DestinationCharacter legs.,, -ItemLegsOrnateLegCuffsSetChained,,,SourceCharacter attaches the Ornate leg cuffs chain on DestinationCharacter legs.,, -OrnateAnkleCuffsRestrainNone,,,SourceCharacter detaches the chain from DestinationCharacter Ornate ankle cuffs.,, -OrnateAnkleCuffsRestrainClosed,,,SourceCharacter attaches the Ornate ankle cuffs chain on DestinationCharacter ankles.,, -OrnateAnkleCuffsRestrainChained,,,SourceCharacter attaches the Ornate ankle cuffs chain on DestinationCharacter ankles.,, -ItemArmsStraitJacketSelect,,,How tight do you want to strap the jacket?,, -ItemArmsStraitJacketLoose,,,Loose,, -ItemArmsStraitJacketNormal,,,Normal,, -ItemArmsStraitJacketSnug,,,Snug,, -ItemArmsStraitJacketTight,,,Tight,, -ItemArmsStraitJacketSetLoose,,,SourceCharacter loosens the straps on DestinationCharacter straitjacket.,, -ItemArmsStraitJacketSetNormal,,,SourceCharacter adjusts the straps normally on DestinationCharacter straitjacket.,, -ItemArmsStraitJacketSetSnug,,,SourceCharacter snugs the straps on DestinationCharacter straitjacket.,, -ItemArmsStraitJacketSetTight,,,SourceCharacter tightens the straps on DestinationCharacter straitjacket.,, -ItemArmsLeatherStraitJacketSetLoose,,,SourceCharacter loosens the straps on DestinationCharacter leather straitjacket.,, -ItemArmsLeatherStraitJacketSetNormal,,,SourceCharacter adjusts the straps normally on DestinationCharacter leather straitjacket.,, -ItemArmsLeatherStraitJacketSetSnug,,,SourceCharacter snugs the straps on DestinationCharacter leather straitjacket.,, -ItemArmsLeatherStraitJacketSetTight,,,SourceCharacter tightens the straps on DestinationCharacter leather straitjacket.,, -ItemArmsCollarCuffsSelect,,,How tight do you want the strap linking the cuffs?,, -ItemArmsCollarCuffsLoose,,,Loose,, -ItemArmsCollarCuffsNormal,,,Normal,, -ItemArmsCollarCuffsSnug,,,Snug,, -ItemArmsCollarCuffsTight,,,Tight,, -ItemArmsCollarCuffsSetLoose,,,SourceCharacter loosens the strap on DestinationCharacter collar cuffs.,, -ItemArmsCollarCuffsSetNormal,,,SourceCharacter adjusts the strap normally on DestinationCharacter collar cuffs.,, -ItemArmsCollarCuffsSetSnug,,,SourceCharacter snugs the strap on DestinationCharacter collar cuffs.,, -ItemArmsCollarCuffsSetTight,,,SourceCharacter tightens the strap on DestinationCharacter collar cuffs.,, -ItemDevicesInflatableBodyBagSelect,,,How much do you want to inflate the body bag?,, -ItemDevicesInflatableBodyBagLight,,,Light,, -ItemDevicesInflatableBodyBagInflated,,,Inflated,, -ItemDevicesInflatableBodyBagBloated,,,Bloated,, -ItemDevicesInflatableBodyBagMax,,,Max,, -ItemDevicesInflatableBodyBagSetLight,,,SourceCharacter adjusts DestinationCharacter inflatable body bag to be only lightly filled.,, -ItemDevicesInflatableBodyBagSetInflated,,,SourceCharacter adjusts DestinationCharacter inflatable body bag to be half filled.,, -ItemDevicesInflatableBodyBagSetBloated,,,SourceCharacter adjusts DestinationCharacter inflatable body bag to three quarters filled.,, -ItemDevicesInflatableBodyBagSetMax,,,SourceCharacter adjusts DestinationCharacter inflatable body bag to fill the maximum amount.,, -ItemDevicesFurBlanketWrapSelect,,,Select belt tightness?,, -ItemDevicesFurBlanketWrapLoose,,,Loose,, -ItemDevicesFurBlanketWrapTight,,,Tight,, -ItemDevicesFurBlanketWrapBelts,,,Tight with belts,, -ItemDevicesFurBlanketWrapSetLoose,,,SourceCharacter wraps TargetCharacterName comfortably in a fur blanket.,, -ItemDevicesFurBlanketWrapSetTight,,,SourceCharacter wraps TargetCharacterName tightly in a fur blanket.,, -ItemDevicesFurBlanketWrapSetBelts,,,SourceCharacter wraps TargetCharacterName tightly in a fur blanket with belts.,, -ItemDevicesNetSelect,,,Select Position,, -ItemDevicesNetKneel,,,Kneel,, -ItemDevicesNetAllFours,,,All Fours,, -ItemDevicesNetSuspended,,,Suspension,, -ItemDevicesNetSetKneel,,,SourceCharacter throws a net over TargetCharacterName .,, -ItemDevicesNetSetAllFours,,,SourceCharacter adds some weights to the net forcing TargetCharacterName down on all fours.,, -ItemDevicesNetSetSuspended,,,SourceCharacter suspends TargetCharacterName up in the air.,, -SturdyLeatherBeltsSelectTightness,,,How many leather belts do you want to apply?,, -SturdyLeatherBeltsPoseOne,,,One,, -SturdyLeatherBeltsPoseTwo,,,Two,, -SturdyLeatherBeltsPoseThree,,,Three,, -SturdyLeatherBeltsPoseFour,,,Four,, -SturdyLeatherBeltsRestrainOne,,,SourceCharacter restrains TargetCharacter with only one sturdy leather belt.,, -SturdyLeatherBeltsRestrainTwo,,,SourceCharacter restrains TargetCharacter with two sturdy leather belts.,, -SturdyLeatherBeltsRestrainThree,,,SourceCharacter restrains TargetCharacter with three sturdy leather belts.,, -SturdyLeatherBeltsRestrainFour,,,SourceCharacter restrains TargetCharacter with four sturdy leather belts.,, -BondageBenchStrapsSelectTightness,,,How many leather belts do you want to apply?,, -BondageBenchStrapsPoseNone,,,No straps,, -BondageBenchStrapsPoseLight,,,Light,, -BondageBenchStrapsPoseNormal,,,Normal,, -BondageBenchStrapsPoseHeavy,,,Heavy,, -BondageBenchStrapsPoseFull,,,Full,, -BondageBenchStrapsRestrainNone,,,SourceCharacter removes the leather belts from DestinationCharacter body.,, -BondageBenchStrapsRestrainLight,,,SourceCharacter loosely restrains TargetCharacter to the bondage bench with few leather belts.,, -BondageBenchStrapsRestrainNormal,,,SourceCharacter restrains TargetCharacter to the bondage bench with a handful of leather belts.,, -BondageBenchStrapsRestrainHeavy,,,SourceCharacter strictly restrains TargetCharacter to the bondage bench with a good amount of leather belts.,, -BondageBenchStrapsRestrainFull,,,SourceCharacter fully restrains TargetCharacter to the bondage bench with a large amount of leather belts.,, -DuctTapePoseHands,,,Hands,, -ItemArmsDuctTapeArms,,,Arms,, -ItemArmsDuctTapeBottom,,,Skirt,, -ItemArmsDuctTapeTop,,,Torso,, -ItemArmsDuctTapeFull,,,Mummy,, -ItemArmsDuctTapeComplete,,,Full Mummy,, -ItemArmsDuctTapeExposedComplete,,,Exposed Full Mummy,, -ItemArmsDuctTapePetTape,,,Pet Tape,, -DuctTapeRestrainHands,,,SourceCharacter wraps duct tape around DestinationCharacter hands.,, -ItemArmsDuctTapeSetArms,,,SourceCharacter removes some of the duct tape from DestinationCharacter torso.,, -ItemArmsDuctTapeSetBottom,,,SourceCharacter creates a duct tape skirt on TargetCharacter and traps her hands in it.,, -ItemArmsDuctTapeSetTop,,,SourceCharacter creates a duct tape top on TargetCharacter and traps her arms in it.,, -ItemArmsDuctTapeSetFull,,,SourceCharacter creates a duct tape mummy on TargetCharacter and traps her arms in it.,, -ItemArmsDuctTapeSetComplete,,,SourceCharacter creates a completed duct tape mummy on TargetCharacter and traps her entire upper body in it.,, -ItemArmsDuctTapeSetExposedComplete,,,SourceCharacter creates a completed duct tape mummy on TargetCharacter and cuts a hole so that her breasts are exposed.,, -ItemArmsDuctTapeSetPetTape,,,SourceCharacter folds DestinationCharacter arms and wraps duct tape around them.,, -ItemArmsWristShacklesInFront,,,In-front of body,, -ItemArmsWristShacklesBehind,,,Behind back,, -ItemArmsWristShacklesOverhead,,,Above head,, -ItemArmsWristShacklesSetInFront,,,SourceCharacter shackles DestinationCharacter wrist in-front of their body.,, -ItemArmsWristShacklesSetBehind,,,SourceCharacter shackles DestinationCharacter wrist behind their back.,, -ItemArmsWristShacklesSetOverhead,,,SourceCharacter shackles DestinationCharacter wrist above their head.,, -ItemArmsLeatherArmbinderSelect,,,Select strap type,, -ItemArmsLeatherArmbinderStrap,,,Ring Straps,, -ItemArmsLeatherArmbinderWrapStrap,,,Wrapping Straps,, -ItemArmsLeatherArmbinderNone,,,Strapless,, -ItemArmsLeatherArmbinderSetStrap,,,SourceCharacter puts an armbinder with ring straps on DestinationCharacter arms.,, -ItemArmsLeatherArmbinderSetWrapStrap,,,SourceCharacter puts an armbinder with wrapping straps on DestinationCharacter arms.,, -ItemArmsLeatherArmbinderSetNone,,,SourceCharacter puts a strapless armbinder on DestinationCharacter arms.,, -ItemArmsWoodenCuffsHandsFront,,,In Front.,, -ItemArmsWoodenCuffsHandsBack,,,Behind Back.,, -ItemArmsWoodenCuffsHandsHead,,,Yoke.,, -ItemArmsWoodenCuffsHogtied,,,Hogtied.,, -ItemArmsWoodenCuffsSetHandsFront,,,SourceCharacter uses wooden cuffs to lock DestinationCharacter hands in front.,, -ItemArmsWoodenCuffsSetHandsBack,,,SourceCharacter uses wooden cuffs to lock DestinationCharacter hands behind her back.,, -ItemArmsWoodenCuffsSetHandsHead,,,SourceCharacter uses wooden cuffs to lock DestinationCharacter hands next to her head.,, -ItemArmsWoodenCuffsSetHogtied,,,SourceCharacter uses wooden cuffs to lock DestinationCharacter in a rigid hogtie.,, -SelectGagType,,,Select the type of gag,, -ClothGagTypeSmall,,,Small,, -ClothGagTypeCleave,,,Cleave,, -ClothGagTypeKnotted,,,Knotted,, -ClothGagTypeOTM,,,OTM,, -ClothGagTypeOTN,,,OTN,, -ClothGagSetSmall,,,SourceCharacter ties the cloth into a small gag over DestinationCharacter mouth.,, -ClothGagSetCleave,,,SourceCharacter ties the cloth into a cleave gag over DestinationCharacter mouth.,, -ClothGagSetKnotted,,,SourceCharacter ties the cloth into a knot over DestinationCharacter mouth.,, -ClothGagSetOTM,,,SourceCharacter ties the cloth into a large gag over DestinationCharacter mouth.,, -ClothGagSetOTN,,,SourceCharacter ties the cloth into a large gag over DestinationCharacter mouth and nose.,, -ScarfGagTypeLoose,,,Loose,, -ScarfGagTypeOTN,,,OTN,, -ScarfGagSetLoose,,,SourceCharacter ties the scarf loosely over DestinationCharacter mouth.,, -ScarfGagSetOTN,,,SourceCharacter ties the scarf covering DestinationCharacter mouth and nose.,, -DuctTapeMouthTypeSmall,,,Single strip,, -DuctTapeMouthTypeCrossed,,,Crossed strips,, -DuctTapeMouthTypeFull,,,Full face,, -DuctTapeMouthTypeDouble,,,Double layer,, -DuctTapeMouthTypeCover,,,OTN,, -DuctTapeMouthSetSmall,,,SourceCharacter puts a piece of duct tape on DestinationCharacter mouth.,, -DuctTapeMouthSetCrossed,,,SourceCharacter crosses two pieces of duct tape on DestinationCharacter mouth.,, -DuctTapeMouthSetFull,,,SourceCharacter fully tapes DestinationCharacter mouth.,, -DuctTapeMouthSetDouble,,,SourceCharacter fully tapes DestinationCharacter mouth with double layers.,, -DuctTapeMouthSetCover,,,SourceCharacter wraps many layers on DestinationCharacter mouth.,, -BallGagMouthTypeNormal,,,Normal,, -BallGagMouthTypeShiny,,,Shiny,, -BallGagMouthTypeTight,,,Tight,, -PlugGagMouthTypePlug,,,Plugged,, -PlugGagMouthTypeOpen,,,Open,, -PlugGagMouthSetPlug,,,SourceCharacter plugs up DestinationCharacter mouth.,, -PlugGagMouthSetOpen,,,SourceCharacter pulls out DestinationCharacter plug from her gag.,, -OTNPlugGagMouthTypePlug,,,Plugged,, -OTNPlugGagMouthTypeOpen,,,Open,, -OTNPlugGagMouthSetPlug,,,SourceCharacter plugs up DestinationCharacter mouth.,, -OTNPlugGagMouthSetOpen,,,SourceCharacter pulls out DestinationCharacter plug from her gag.,, -ItemHeadInteractiveVisorSetTransparent,,,SourceCharacter configures DestinationCharacter visor to be transparent.,, -ItemHeadInteractiveVisorSetBlind,,,SourceCharacter configures DestinationCharacter visor to be fully opaque.,, -ItemHeadInteractiveVisorTypeTransparent,,,Transparent,, -ItemHeadInteractiveVisorTypeBlind,,,Blind,, -ItemHeadInteractiveVisorSetLightTint,,,SourceCharacter configures DestinationCharacter visor to fade slightly.,, -ItemHeadInteractiveVisorSetHeavyTint,,,SourceCharacter configures DestinationCharacter visor to be heavily tinted.,, -ItemHeadInteractiveVisorTypeLightTint,,,Light Tint,, -ItemHeadInteractiveVisorTypeHeavyTint,,,Heavy Tint,, -SelectVisorType,,,Select the type of visor,, -ItemHeadInteractiveVRHeadsetSetf2,,,SourceCharacter logs DestinationCharacter headset into the virtual world as her real self.,, -ItemHeadInteractiveVRHeadsetSetf3,,,SourceCharacter logs DestinationCharacter headset into the virtual world as a custom avatar.,, -ItemHeadInteractiveVRHeadsetSetf0,,,SourceCharacter configures DestinationCharacter headset to display the surroundings through a camera feed.,, -ItemHeadInteractiveVRHeadsetSetf1,,,SourceCharacter turns off DestinationCharacter headset.,, -ItemHeadInteractiveVRHeadsetSetg1,,,SourceCharacter boots up Kinky Dungeon on DestinationCharacter headset.,, -ItemHeadInteractiveVRHeadsetSetg0,,,SourceCharacter turns off DestinationCharacter game.,, -ItemHeadInteractiveVRHeadsetSetb0,,,SourceCharacter removes the background on DestinationCharacter headset.,, -ItemHeadInteractiveVRHeadsetSetb1,,,SourceCharacter sets the background on DestinationCharacter headset to a virtual realm.,, -ItemHeadInteractiveVRHeadsetSetb2,,,SourceCharacter sets the background on DestinationCharacter headset to a dark dungeon.,, -ItemHeadInteractiveVRHeadsetSetb3,,,SourceCharacter sets the background on DestinationCharacter headset to a high-tech environment.,, -ItemHeadInteractiveVRHeadsetSetb4,,,SourceCharacter sets the background on DestinationCharacter headset to an ancient fantasy location.,, -ItemHeadInteractiveVRHeadsetSetb5,,,SourceCharacter sets DestinationCharacter headset to induce a trance-like state...,, -ItemHeadInteractiveVRHeadsetSelectBackground,,,Choose Background:,, -ItemHeadInteractiveVRHeadsetSelectFunction,,,Choose Mode:,, -ItemHeadInteractiveVRHeadsetSelectGame,,,Choose Game:,, -ItemHeadInteractiveVRHeadsetSelectBase,,,Choose Settings:,, -ItemHeadInteractiveVRHeadsetModuleBackground,,,Background,, -ItemHeadInteractiveVRHeadsetModuleFunction,,,Mode,, -ItemHeadInteractiveVRHeadsetModuleGame,,,Game,, -ItemHeadInteractiveVRHeadsetOptionb0,,,None,, -ItemHeadInteractiveVRHeadsetOptionb1,,,Virtual World,, -ItemHeadInteractiveVRHeadsetOptionb2,,,Dungeon,, -ItemHeadInteractiveVRHeadsetOptionb3,,,High-Tech,, -ItemHeadInteractiveVRHeadsetOptionb4,,,Ancient Ruins,, -ItemHeadInteractiveVRHeadsetOptionb5,,,Trance,, -ItemHeadInteractiveVRHeadsetOptionf0,,,Passthrough,, -ItemHeadInteractiveVRHeadsetOptionf1,,,Off,, -ItemHeadInteractiveVRHeadsetOptionf2,,,VR,, -ItemHeadInteractiveVRHeadsetOptionf3,,,VR (Hide Restraints),, -ItemHeadInteractiveVRHeadsetOptiong0,,,None,, -ItemHeadInteractiveVRHeadsetOptiong1,,,Kinky Dungeon,, -CantChangeWhileLockedFuturistic,,,Access denied.,, -FuturisticItemLoginLoginAttempt,,,SourceCharacter tried to log in to the device on DestinationCharacter FocusAssetGroup but was locked out.,, -FuturisticItemLoginScreen,,,Item is locked. Only authorized users may alter settings.,, -FuturisticItemPassword,,,Enter Password:,, -FuturisticItemLogIn,,,Log in,, -FuturisticArmbinderSetNormal,,,SourceCharacter configures DestinationCharacter armbinder to standard tightness.,, -FuturisticArmbinderSetTight,,,SourceCharacter configures DestinationCharacter armbinder to enhanced tightness.,, -FuturisticArmbinderTypeNormal,,,Standard Mode,, -FuturisticArmbinderTypeTight,,,Strict Mode,, -SelectFuturisticArmbinderType,,,Select device tightness:,, -ItemMouthFuturisticMuzzleModuleNose,,,Mask,, -ItemMouthFuturisticMuzzleModuleHarness,,,Straps,, -ItemMouthFuturisticMuzzleModuleSymbol,,,Icon,, -ItemMouthFuturisticMuzzleSelectBase,,,Configure muzzle:,, -ItemMouthFuturisticMuzzleSelectNose,,,Configure mask:,, -ItemMouthFuturisticMuzzleSelectHarness,,,Configure straps:,, -ItemMouthFuturisticMuzzleSelectSymbol,,,Choose Decorative Icon:,, -ItemMouthFuturisticMuzzleOptionn0,,,Standard,, -ItemMouthFuturisticMuzzleOptionn1,,,Over the Nose,, -ItemMouthFuturisticMuzzleOptionh0,,,Muzzle,, -ItemMouthFuturisticMuzzleOptionh1,,,Harness Muzzle,, -ItemMouthFuturisticMuzzleOptions0,,,Blank,, -ItemMouthFuturisticMuzzleOptions1,,,Lock,, -ItemMouthFuturisticMuzzleOptions2,,,Mute,, -ItemMouthFuturisticMuzzleOptions3,,,X,, -ItemMouthFuturisticMuzzleSeth1,,,SourceCharacter adds straps to DestinationCharacter muzzle.,, -ItemMouthFuturisticMuzzleSeth0,,,SourceCharacter removes straps from DestinationCharacter muzzle.,, -ItemMouthFuturisticMuzzleSetn1,,,SourceCharacter adds a nose cover to DestinationCharacter muzzle.,, -ItemMouthFuturisticMuzzleSetn0,,,SourceCharacter removes the nose cover from DestinationCharacter muzzle.,, -ItemMouthFuturisticMuzzleSets0,,,SourceCharacter removes the icon from DestinationCharacter muzzle.,, -ItemMouthFuturisticMuzzleSets1,,,SourceCharacter chooses the icon on DestinationCharacter muzzle.,, -ItemMouthFuturisticMuzzleSets2,,,SourceCharacter chooses the icon on DestinationCharacter muzzle.,, -ItemMouthFuturisticMuzzleSets3,,,SourceCharacter chooses the icon on DestinationCharacter muzzle.,, -ItemMouth2FuturisticMuzzleModuleNose,,,Mask,, -ItemMouth2FuturisticMuzzleModuleHarness,,,Straps,, -ItemMouth2FuturisticMuzzleModuleSymbol,,,Icon,, -ItemMouth2FuturisticMuzzleSelectBase,,,Configure muzzle:,, -ItemMouth2FuturisticMuzzleSelectNose,,,Configure mask:,, -ItemMouth2FuturisticMuzzleSelectHarness,,,Configure straps:,, -ItemMouth2FuturisticMuzzleSelectSymbol,,,Choose Decorative Icon:,, -ItemMouth2FuturisticMuzzleOptionn0,,,Standard,, -ItemMouth2FuturisticMuzzleOptionn1,,,Over the Nose,, -ItemMouth2FuturisticMuzzleOptionh0,,,Muzzle,, -ItemMouth2FuturisticMuzzleOptionh1,,,Harness Muzzle,, -ItemMouth2FuturisticMuzzleOptions0,,,Blank,, -ItemMouth2FuturisticMuzzleOptions1,,,Lock,, -ItemMouth2FuturisticMuzzleOptions2,,,Mute,, -ItemMouth2FuturisticMuzzleOptions3,,,X,, -ItemMouth2FuturisticMuzzleSeth1,,,SourceCharacter adds straps to DestinationCharacter muzzle.,, -ItemMouth2FuturisticMuzzleSeth0,,,SourceCharacter removes straps from DestinationCharacter muzzle.,, -ItemMouth2FuturisticMuzzleSetn1,,,SourceCharacter adds a nose cover to DestinationCharacter muzzle.,, -ItemMouth2FuturisticMuzzleSetn0,,,SourceCharacter removes the nose cover from DestinationCharacter muzzle.,, -ItemMouth2FuturisticMuzzleSets0,,,SourceCharacter removes the icon from DestinationCharacter muzzle.,, -ItemMouth2FuturisticMuzzleSets1,,,SourceCharacter chooses the icon on DestinationCharacter muzzle.,, -ItemMouth2FuturisticMuzzleSets2,,,SourceCharacter chooses the icon on DestinationCharacter muzzle.,, -ItemMouth2FuturisticMuzzleSets3,,,SourceCharacter chooses the icon on DestinationCharacter muzzle.,, -ItemMouth3FuturisticMuzzleModuleNose,,,Mask,, -ItemMouth3FuturisticMuzzleModuleHarness,,,Straps,, -ItemMouth3FuturisticMuzzleModuleSymbol,,,Icon,, -ItemMouth3FuturisticMuzzleSelectBase,,,Configure muzzle:,, -ItemMouth3FuturisticMuzzleSelectNose,,,Configure mask:,, -ItemMouth3FuturisticMuzzleSelectHarness,,,Configure straps:,, -ItemMouth3FuturisticMuzzleSelectSymbol,,,Choose Decorative Icon:,, -ItemMouth3FuturisticMuzzleOptionn0,,,Standard,, -ItemMouth3FuturisticMuzzleOptionn1,,,Over the Nose,, -ItemMouth3FuturisticMuzzleOptionh0,,,Muzzle,, -ItemMouth3FuturisticMuzzleOptionh1,,,Harness Muzzle,, -ItemMouth3FuturisticMuzzleOptions0,,,Blank,, -ItemMouth3FuturisticMuzzleOptions1,,,Lock,, -ItemMouth3FuturisticMuzzleOptions2,,,Mute,, -ItemMouth3FuturisticMuzzleOptions3,,,X,, -ItemMouth3FuturisticMuzzleSeth1,,,SourceCharacter adds straps to DestinationCharacter muzzle.,, -ItemMouth3FuturisticMuzzleSeth0,,,SourceCharacter removes straps from DestinationCharacter muzzle.,, -ItemMouth3FuturisticMuzzleSetn1,,,SourceCharacter adds a nose cover to DestinationCharacter muzzle.,, -ItemMouth3FuturisticMuzzleSetn0,,,SourceCharacter removes the nose cover from DestinationCharacter muzzle.,, -ItemMouth3FuturisticMuzzleSets0,,,SourceCharacter removes the icon from DestinationCharacter muzzle.,, -ItemMouth3FuturisticMuzzleSets1,,,SourceCharacter chooses the icon on DestinationCharacter muzzle.,, -ItemMouth3FuturisticMuzzleSets2,,,SourceCharacter chooses the icon on DestinationCharacter muzzle.,, -ItemMouth3FuturisticMuzzleSets3,,,SourceCharacter chooses the icon on DestinationCharacter muzzle.,, -ItemDevicesFuturisticCrateModuleWindow,,,Door,, -ItemDevicesFuturisticCrateModuleLegCuffs,,,Leg Restraints,, -ItemDevicesFuturisticCrateModuleArmCuffs,,,Arm Restraints,, -ItemDevicesFuturisticCrateModuleDevice,,,Module,, -ItemDevicesFuturisticCrateModuleHarness,,,Harness,, -ItemDevicesFuturisticCrateModuleStructure,,,Structure,, -ItemDevicesFuturisticCrateSelectBase,,,Configure crate:,, -ItemDevicesFuturisticCrateSelectWindow,,,Configure door:,, -ItemDevicesFuturisticCrateSelectArmCuffs,,,Configure arm restraints:,, -ItemDevicesFuturisticCrateSelectLegCuffs,,,Configure leg restraints:,, -ItemDevicesFuturisticCrateSelectDevice,,,Configure modules:,, -ItemDevicesFuturisticCrateSelectStructure,,,Configure structure:,, -ItemDevicesFuturisticCrateSelectHarness,,,Configure harness:,, -ItemDevicesFuturisticCrateOptionw0,,,Open Door,, -ItemDevicesFuturisticCrateOptionw1,,,Glass Barrier,, -ItemDevicesFuturisticCrateOptionw2,,,Large Window,, -ItemDevicesFuturisticCrateOptionw3,,,Small Window,, -ItemDevicesFuturisticCrateOptionw4,,,Sealed,, -ItemDevicesFuturisticCrateOptiona0,,,No Arm Restraint,, -ItemDevicesFuturisticCrateOptiona1,,,Hand Cuffs,, -ItemDevicesFuturisticCrateOptiona2,,,Boxtie Cuffs,, -ItemDevicesFuturisticCrateOptiona3,,,Overhead Restraints,, -ItemDevicesFuturisticCrateOptionl0,,,No Leg Restraint,, -ItemDevicesFuturisticCrateOptionl1,,,Kneeling Cuffs,, -ItemDevicesFuturisticCrateOptionl2,,,Legs Together,, -ItemDevicesFuturisticCrateOptionl3,,,Legs Spread,, -ItemDevicesFuturisticCrateOptiond0,,,No Module,, -ItemDevicesFuturisticCrateOptiond1,,,Pleasure Module,, -ItemDevicesFuturisticCrateOptiont0,,,Minimal,, -ItemDevicesFuturisticCrateOptiont1,,,'X' style,, -ItemDevicesFuturisticCrateOptiont2,,,'+' style,, -ItemDevicesFuturisticCrateOptiont3,,,'H' style,, -ItemDevicesFuturisticCrateOptionh0,,,None,, -ItemDevicesFuturisticCrateOptionh1,,,Low Security,, -ItemDevicesFuturisticCrateOptionh2,,,Medium Security,, -ItemDevicesFuturisticCrateOptionh3,,,Medium Security,, -ItemDevicesFuturisticCrateOptionh4,,,Maximum Security,, -ItemDevicesFuturisticCrateSetw0,,,SourceCharacter opens DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSetw1,,,SourceCharacter engages the glass barrier DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSetw2,,,SourceCharacter opens the large window on DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSetw3,,,SourceCharacter opens the observation port on DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSetw4,,,SourceCharacter seals DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSeta0,,,SourceCharacter releases DestinationCharacter arms from her crate's restraints.,, -ItemDevicesFuturisticCrateSeta1,,,SourceCharacter straps in DestinationCharacter arms behind her back.,, -ItemDevicesFuturisticCrateSeta2,,,SourceCharacter straps in DestinationCharacter arms behind her back.,, -ItemDevicesFuturisticCrateSeta3,,,SourceCharacter straps in DestinationCharacter arms over her head.,, -ItemDevicesFuturisticCrateSetl0,,,SourceCharacter releases DestinationCharacter legs from her crate's restraints.,, -ItemDevicesFuturisticCrateSetl1,,,SourceCharacter straps in DestinationCharacter legs in a suspended kneeling position.,, -ItemDevicesFuturisticCrateSetl2,,,SourceCharacter straps in DestinationCharacter legs together.,, -ItemDevicesFuturisticCrateSetl3,,,SourceCharacter straps in DestinationCharacter legs apart.,, -ItemDevicesFuturisticCrateSetd0,,,SourceCharacter removes the module from DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSetd1,,,SourceCharacter equips DestinationCharacter crate with a pleasure module.,, -ItemDevicesFuturisticCrateSett0,,,SourceCharacter changes the structure on DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSett1,,,SourceCharacter changes the structure on DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSett2,,,SourceCharacter changes the structure on DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSett3,,,SourceCharacter changes the structure on DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSeth0,,,SourceCharacter releases the harness on DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSeth1,,,SourceCharacter configures the harness on DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSeth2,,,SourceCharacter configures the harness on DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSeth3,,,SourceCharacter configures the harness on DestinationCharacter crate.,, -ItemDevicesFuturisticCrateSeth4,,,SourceCharacter configures the harness on DestinationCharacter crate.,, -FuturisticHarnessType,,,Select device mode:,, -FuturisticHarnessTypeFull,,,Full,, -FuturisticHarnessTypeUpper,,,Upper,, -FuturisticHarnessTypeLower,,,Lower,, -FuturisticHarnessSetLower,,,SourceCharacter moves DestinationCharacter harness to the lower body.,, -FuturisticHarnessSetUpper,,,SourceCharacter moves DestinationCharacter harness to the upper body.,, -FuturisticHarnessSetFull,,,SourceCharacter configures DestinationCharacter harness to surround the whole body in straps.,, -HighSecurityHarnessType,,,Select device mode:,, -HighSecurityHarnessTypeLowSec,,,Belt,, -HighSecurityHarnessTypeMedSec,,,Pelvis,, -HighSecurityHarnessTypeMedSecBreast,,,Chest,, -HighSecurityHarnessTypeMaxSec,,,Total,, -HighSecurityHarnessSetLowSec,,,SourceCharacter configures DestinationCharacter harness.,, -HighSecurityHarnessSetMedSec,,,SourceCharacter configures DestinationCharacter harness.,, -HighSecurityHarnessSetMedSecBreast,,,SourceCharacter configures DestinationCharacter harness.,, -HighSecurityHarnessSetMaxSec,,,SourceCharacter configures DestinationCharacter harness.,, -SelectFuturisticStraitjacketType,,,Select device mode:,, -FuturisticStraitjacketSetHandsFront,,,SourceCharacter configures DestinationCharacter straitjacket to restrain hands in the front.,, -FuturisticStraitjacketSetHandsBack,,,SourceCharacter configures DestinationCharacter straitjacket to restrain hands in the back.,, -FuturisticStraitjacketSetHandsFrontChastity,,,SourceCharacter configures DestinationCharacter straitjacket to restrain hands in the front.,, -FuturisticStraitjacketSetHandsBackChastity,,,SourceCharacter configures DestinationCharacter straitjacket to restrain hands in back.,, -FuturisticStraitjacketTypeHandsFront,,,Hands in front,, -FuturisticStraitjacketTypeHandsBack,,,Hands behind,, -FuturisticStraitjacketTypeHandsFrontChastity,,,Hands in front + chastity,, -FuturisticStraitjacketTypeHandsBackChastity,,,Hands behind + chasity,, -FuturisticMittensSetGloves,,,SourceCharacter configures DestinationCharacter mittens to relax and leave her hands free,, -FuturisticMittensSetMittens,,,SourceCharacter configures DestinationCharacter mittens to clasp her hands tightly into fists.,, -FuturisticMittensTypeGloves,,,Gloves Mode,, -FuturisticMittensTypeMittens,,,Mittens Mode,, -SelectFuturisticMittensType,,,Select device mode:,, -FuturisticPanelGagMouthDeflationTimeSetting120000,,,Timer: 2 min,, -FuturisticPanelGagMouthDeflationTimeSetting300000,,,Timer: 5 min,, -FuturisticPanelGagMouthDeflationTimeSetting900000,,,Timer: 15 min,, -FuturisticPanelGagMouthDeflationTimeSetting3600000,,,Timer: 1 hour,, -FuturisticPanelGagMouthDeflationTimeSetting72000000,,,Timer: 20 hours,, -FuturisticPanelGagMouthDeflationTimeButton120000,,,2 min,, -FuturisticPanelGagMouthDeflationTimeButton300000,,,5 min,, -FuturisticPanelGagMouthDeflationTimeButton900000,,,15 min,, -FuturisticPanelGagMouthDeflationTimeButton3600000,,,1 hour,, -FuturisticPanelGagMouthDeflationTimeButton72000000,,,20 hours,, -FuturisticPanelGagMouthDeflationTimeButtonPump,,,Trigger Inflation,, -FuturisticPanelGagMouthDeflationTime,,,Time until deflation:,, -FuturisticPanelGagMouthButtonChatMessage,,,Show chat message ,, -FuturisticPanelGagMouthButtonAutoPunish,,,Auto-inflation sensitivity:,, -FuturisticPanelGagMouthTypeDesc,,,Gag configuration:,, -FuturisticPanelGagMouthTypePadded,,,Padded,, -FuturisticPanelGagMouthTypeLightBall,,,Small Plug,, -FuturisticPanelGagMouthTypeBall,,,Ball,, -FuturisticPanelGagMouthTypeBallGag,,,Ball,, -FuturisticPanelGagMouthTypeBallLarge,,,Large Ball,, -FuturisticPanelGagMouthTypePlug,,,Dildo,, -FuturisticPanelGagMouthSetPadded,,,SourceCharacter configures DestinationCharacter gag to padded mode.,, -FuturisticPanelGagMouthSetLightBall,,,SourceCharacter configures DestinationCharacter gag to a soft ball.,, -FuturisticPanelGagMouthSetBall,,,SourceCharacter configures DestinationCharacter gag to a mouth-filling ball.,, -FuturisticPanelGagMouthSetPlug,,,SourceCharacter configures DestinationCharacter gag to a long dildo.,, -FuturisticPanelGagMouthSetAutoInflateLightBall,,,DestinationCharacterName gag inflates into a soft ball.,, -FuturisticPanelGagMouthSetAutoInflateBall,,,DestinationCharacterName gag inflates into a mouth-filling ball.,, -FuturisticPanelGagMouthSetAutoInflatePlug,,,DestinationCharacterName gag inflates into a large dildo that forces its way down her throat.,, -FuturisticPanelGagMouthSetAutoDeflatePadded,,,DestinationCharacterName gag deflates into padded mode.,, -FuturisticPanelGagMouthSetAutoDeflateLightBall,,,DestinationCharacterName gag deflates into a soft ball.,, -FuturisticPanelGagMouthSetAutoDeflateBall,,,DestinationCharacterName gag deflates into a mouth-filling ball.,, -FuturisticPanelGagMouthSetAutoPunish0,,,SourceCharacter configures DestinationCharacter gag to not punish her for speaking.,, -FuturisticPanelGagMouthSetAutoPunish1,,,SourceCharacter configures DestinationCharacter gag to punish her for shouting.,, -FuturisticPanelGagMouthSetAutoPunish2,,,SourceCharacter configures DestinationCharacter gag to punish her for saying long sentences.,, -FuturisticPanelGagMouthSetAutoPunish3,,,SourceCharacter configures DestinationCharacter gag to punish her for speaking.,, -FuturisticPanelGagMouthSetAutoPunishTime120000,,,SourceCharacter configures DestinationCharacter gag to deflate 2 minutes after triggering.,, -FuturisticPanelGagMouthSetAutoPunishTime300000,,,SourceCharacter configures DestinationCharacter gag to deflate 5 minutes after triggering.,, -FuturisticPanelGagMouthSetAutoPunishTime900000,,,SourceCharacter configures DestinationCharacter gag to deflate 15 minutes after triggering.,, -FuturisticPanelGagMouthSetAutoPunishTime3600000,,,SourceCharacter configures DestinationCharacter gag to deflate 1 hour after triggering.,, -FuturisticPanelGagMouthSetAutoPunishTime72000000,,,SourceCharacter configures DestinationCharacter gag to deflate 20 hours after triggering.,, -DildoPlugGagMouthSetPlug,,,SourceCharacter plugs up DestinationCharacter mouth with the dildo plug.,, -DildoPlugGagMouthSetOpen,,,SourceCharacter pulls out DestinationCharacter dildo plug from her gag.,, -BallGagMouthSetNormal,,,SourceCharacter loosens the gag on DestinationCharacter mouth.,, -BallGagMouthSetShiny,,,SourceCharacter polishes the gag on DestinationCharacter mouth.,, -BallGagMouthSetTight,,,SourceCharacter tightens the gag on DestinationCharacter mouth.,, -FuturisticTrainingBeltOrgasmEdged,,,The plugs cease abruptly as you are about to go over the edge.,, -FuturisticTrainingBeltOrgasmEdgedTimeout,,,The plugs bring you so close to release... before turning off suddenly.,, -FuturisticTrainingBeltPunishSpeech,,,Punishment for speaking too much: ,, -FuturisticTrainingBeltPunishSpeech0,,,None,, -FuturisticTrainingBeltPunishSpeech1,,,Shock,, -FuturisticTrainingBeltPunishSpeech2,,,Edge for 5m,, -FuturisticTrainingBeltPunishSpeech3,,,Vibe for 5m,, -FuturisticTrainingBeltPunishRequiredSpeech,,,Punishment for not saying word: ,, -FuturisticTrainingBeltPunishRequiredSpeech0,,,None,, -FuturisticTrainingBeltPunishRequiredSpeech1,,,Shock,, -FuturisticTrainingBeltPunishRequiredSpeech2,,,Edge for 5m,, -FuturisticTrainingBeltPunishRequiredSpeech3,,,Vibe for 5m,, -FuturisticTrainingBeltPunishProhibitedSpeech,,,Punishment for banned words: ,, -FuturisticTrainingBeltPunishProhibitedSpeech0,,,None,, -FuturisticTrainingBeltPunishProhibitedSpeech1,,,Shock,, -FuturisticTrainingBeltPunishProhibitedSpeech2,,,Edge for 5m,, -FuturisticTrainingBeltPunishProhibitedSpeech3,,,Vibe for 5m,, -FuturisticTrainingBeltPermissions,,,Public Mode Permission:,, -FuturisticTrainingBeltPermissions0,,,Public,, -FuturisticTrainingBeltPermissions1,,,Club Mistresses,, -FuturisticTrainingBeltPermissions2,,,Locked,, -FuturisticTrainingBeltMode,,,Current Public Mode: ,, -FuturisticTrainingBeltMode0,,,None,, -FuturisticTrainingBeltMode1,,,Low,, -FuturisticTrainingBeltMode2,,,Medium,, -FuturisticTrainingBeltMode3,,,Maximum,, -FuturisticTrainingBeltMode4,,,Deny,, -FuturisticTrainingBeltMode5,,,Random Teasing,, -FuturisticTrainingBeltMode6,,,Random Orgasms,, -FuturisticTrainingBeltSetStateNoneOff,,,DestinationCharacterName belt ceases all vibrations.,, -FuturisticTrainingBeltSetStateLowPriorityEdgeLow,,,DestinationCharacterName plugs slow down to a frustrating tingle...,, -FuturisticTrainingBeltSetStateLowPriorityEdgeHigh,,,DestinationCharacterName belt starts pulsating strongly!,, -FuturisticTrainingBeltSetStateLowPriorityEdgeMaximum,,,DestinationCharacterName belt starts vibrating intensely!,, -FuturisticTrainingBeltSetStateLowPriorityEdgeLowSelf,,,Your plugs slow down to a frustrating tingle...,, -FuturisticTrainingBeltSetStateLowPriorityEdgeHighSelf,,,Your belt starts pulsating strongly!,, -FuturisticTrainingBeltSetStateLowPriorityEdgeMaximumSelf,,,The plugs inside of you start buzzing intensely!,, -FuturisticTrainingBeltSetStateLowPriorityTeaseLow,,,DestinationCharacterName belt starts to tease her gently...,, -FuturisticTrainingBeltSetStateLowPriorityTeaseMedium,,,DestinationCharacterName belt starts teasing her...,, -FuturisticTrainingBeltSetStateLowPriorityTeaseHigh,,,DestinationCharacterName belt vibrates suddenly!,, -FuturisticTrainingBeltSetStateLowPriorityTeaseMaximum,,,DestinationCharacterName belt vibrates intensely!,, -FuturisticTrainingBeltSetStateLowPriorityMaxMaximum,,,DestinationCharacterName belt starts buzzing strongly!,, -FuturisticTrainingBeltSetStateLowPriorityLowLow,,,DestinationCharacterName belt tingles just a little bit...,, -FuturisticTrainingBeltSetStateLowPriorityMediumMedium,,,DestinationCharacterName belt vibrates gently.,, -FuturisticTrainingBeltSetStateHighPriorityEdgeLow,,,DestinationCharacterName belt slows down to a weak buzz...,, -FuturisticTrainingBeltSetStateHighPriorityEdgeHigh,,,DestinationCharacterName belt edges her strongly!,, -FuturisticTrainingBeltSetStateHighPriorityEdgeMaximum,,,DestinationCharacterName belt brings her close to the edge!,, -FuturisticTrainingBeltSetStateHighPriorityEdgeLowSelf,,,Your belt slows down to a weak buzz...,, -FuturisticTrainingBeltSetStateHighPriorityEdgeHighSelf,,,Your belt edges you strongly!,, -FuturisticTrainingBeltSetStateHighPriorityEdgeMaximumSelf,,,Your belt brings you close to the edge!,, -FuturisticTrainingBeltSetStateHighPriorityMaxMaximum,,,DestinationCharacterName belt starts vibrating intensely!,, -FuturisticTrainingBeltSetStateCooldownOff,,,DestinationCharacterName belt gradually slows to a halt.,, -FuturisticTrainingBeltPunishStandup,,,No standing up without help,, -ItemPelvisFuturisticChastityBeltSelectBase,,,Configure Belt,, -ItemPelvisFuturisticChastityBeltSelectModel,,,Select Model Number,, -ItemPelvisFuturisticChastityBeltSelectFront,,,Configure Front Shield,, -ItemPelvisFuturisticChastityBeltSelectBack,,,Configure Rear Shield,, -ItemPelvisFuturisticChastityBeltSelectTamper,,,Configure Tamper Protection,, -ItemPelvisFuturisticChastityBeltSelectOrgasm,,,Configure Orgasm Prevention,, -ItemPelvisFuturisticChastityBeltModuleModel,,,Model Number,, -ItemPelvisFuturisticChastityBeltModuleFront,,,Front Shield,, -ItemPelvisFuturisticChastityBeltModuleBack,,,Rear Shield,, -ItemPelvisFuturisticChastityBeltModuleTamper,,,Tamper Protection,, -ItemPelvisFuturisticChastityBeltModuleOrgasm,,,Orgasm Prevention,, -ItemPelvisFuturisticChastityBeltOptionm0,,,Prototype,, -ItemPelvisFuturisticChastityBeltOptionm1,,,High-Security Series,, -ItemPelvisFuturisticChastityBeltOptionm2,,,Training Series,, -ItemPelvisFuturisticChastityBeltOptionm3,,,Neo Series,, -ItemPelvisFuturisticChastityBeltOptionf0,,,Front Open,, -ItemPelvisFuturisticChastityBeltOptionf1,,,Front Locked,, -ItemPelvisFuturisticChastityBeltOptionb0,,,Rear Open,, -ItemPelvisFuturisticChastityBeltOptionb1,,,Rear Locked,, -ItemPelvisFuturisticChastityBeltOptiont0,,,Disabled,, -ItemPelvisFuturisticChastityBeltOptiont1,,,Punish Local Tampering,, -ItemPelvisFuturisticChastityBeltOptiont2,,,Punish All Tampering,, -ItemPelvisFuturisticChastityBeltOptiono0,,,Allow Orgasms,, -ItemPelvisFuturisticChastityBeltOptiono1,,,Punish Orgasms,, -FuturisticChastityBeltPunishOrgasm,,,Shock when wearer reaches orgasm,, -FuturisticChastityBeltPunishStruggle,,,Prevent tampering with this item,, -FuturisticChastityBeltPunishStruggleOther,,,Shock wearer when struggling with other items,, -FuturisticChastityBeltPunishChatMessage,,,Show messages to other players,, -ItemPelvisFuturisticChastityBeltSetm0,,,SourceCharacter changes the model of DestinationCharacter belt.,, -ItemPelvisFuturisticChastityBeltSetm1,,,SourceCharacter changes the model of DestinationCharacter belt.,, -ItemPelvisFuturisticChastityBeltSetm2,,,SourceCharacter changes the model of DestinationCharacter belt.,, -ItemPelvisFuturisticChastityBeltSetm3,,,SourceCharacter changes the model of DestinationCharacter belt.,, -ItemPelvisFuturisticChastityBeltSeto1,,,SourceCharacter configures DestinationCharacter belt to punish orgasms.,, -ItemPelvisFuturisticChastityBeltSett1,,,SourceCharacter configures DestinationCharacter belt to punish tampering with the belt.,, -ItemPelvisFuturisticChastityBeltSett2,,,SourceCharacter configures DestinationCharacter belt to punish struggling.,, -ItemPelvisFuturisticChastityBeltSeto0,,,SourceCharacter configures DestinationCharacter belt to allow orgasms.,, -ItemPelvisFuturisticChastityBeltSett0,,,SourceCharacter disables the tamper protection on DestinationCharacter belt.,, -ItemPelvisFuturisticChastityBeltSetb0,,,SourceCharacter opens the back of DestinationCharacter belt.,, -ItemPelvisFuturisticChastityBeltSetf0,,,SourceCharacter opens the front of DestinationCharacter belt.,, -ItemPelvisFuturisticChastityBeltSetb1,,,SourceCharacter locks the rear shield of DestinationCharacter belt.,, -ItemPelvisFuturisticChastityBeltSetf1,,,SourceCharacter locks the front shield of DestinationCharacter belt.,, -FuturisticTrainingBeltSetGeneric,,,SourceCharacter configures DestinationCharacter belt.,, -FuturisticChastityBeltTime,,,Time until recharged:,, -FuturisticChastityBeltTimeReady,,,Punishment Charged,, -FuturisticChastityBeltShockStandup,,,DestinationCharacterName belt shocks her for standing up without permission!,, -FuturisticChastityBeltShockSpeech,,,DestinationCharacterName belt shocks her for speaking too much!,, -FuturisticChastityBeltShockRequiredSpeech,,,DestinationCharacterName belt shocks her for not saying 'ReplacementWord!',, -FuturisticChastityBeltShockProhibitedSpeech,,,DestinationCharacterName belt shocks her for saying 'ReplacementWord!',, -FuturisticChastityBeltPunishSpeech,,,DestinationCharacterName belt punishes her for speaking too much!,, -FuturisticChastityBeltPunishRequiredSpeech,,,DestinationCharacterName belt punishes her for not saying 'ReplacementWord!',, -FuturisticChastityBeltPunishProhibitedSpeech,,,DestinationCharacterName belt punishes her for saying 'ReplacementWord!',, -FuturisticChastityBeltShockOrgasm,,,DestinationCharacterName belt detects an orgasm and shocks her!,, -FuturisticChastityBeltShockStruggle,,,DestinationCharacterName belt detects tampering and shocks her!,, -FuturisticChastityBeltShockStruggleOther,,,DestinationCharacterName belt detects her struggling and delivers an intense shock!,, -FuturisticCollarTriggerLockdown,,,DestinationCharacterName bindings tighten around her body with a hiss as they lock themselves automatically.,, -FuturisticCollarTriggerUnlock,,,DestinationCharacterName bindings release her with a hiss.,, -FuturisticCollarTriggerColor,,,DestinationCharacterName bindings reboot with different colors.,, -FuturisticCollarOpenPermission,,,Let all players use head device features,, -FuturisticCollarOpenPermissionChastity,,,Let all players modify futuristic chastity,, -FuturisticCollarOpenPermissionArm,,,Let all players modify futuristic arm devices,, -FuturisticCollarOpenPermissionLeg,,,Let all players modify futuristic leg devices,, -FuturisticCollarSetOpenPermissionCollarOn,,,DestinationCharacterName collar can now be used by anyone.,, -FuturisticCollarSetOpenPermissionCollarOff,,,DestinationCharacterName collar now can't be used while locked.,, -FuturisticCollarSetOpenPermissionChastityOn,,,DestinationCharacterName chastity devices can now be altered by anyone.,, -FuturisticCollarSetOpenPermissionChastityOff,,,DestinationCharacterName chastity devices now can't be changed while locked.,, -FuturisticCollarSetOpenPermissionArmOn,,,DestinationCharacterName arm bindings can now be altered by anyone.,, -FuturisticCollarSetOpenPermissionArmOff,,,DestinationCharacterName arm bindings now can't be changed while locked.,, -FuturisticCollarSetOpenPermissionLegOn,,,DestinationCharacterName leg bindings can now be altered by anyone.,, -FuturisticCollarSetOpenPermissionLegOff,,,DestinationCharacterName leg bindings now can't be changed while locked.,, -FuturisticCollarBlockRemotes,,,Block remotes on the wearer,, -FuturisticCollarSetBlockRemotesOn,,,DestinationCharacterName vibrator remotes are now locked.,, -FuturisticCollarSetBlockRemotesOff,,,DestinationCharacterName vibrator remotes are now unlocked.,, -FuturisticCollarOptionsLockout,,,Collar settings are locked,, -FuturisticCollarOptions,,,Current Status:,, -FuturisticCollarOptionsNoLocks,,,Unlocked,, -FuturisticCollarOptionsPartialLocks,,,Partially Locked,, -FuturisticCollarOptionsFullyLocked,,,Fully Locked,, -FuturisticCollarOptionsNoItems,,,No Futuristic Items Worn,, -FuturisticCollarLockMetal,,,Lock Metal,, -FuturisticCollarLockIntricate,,,Lock Intricate,, -FuturisticCollarLockHighSec,,,Lock HighSec,, -FuturisticCollarLockExclusive,,,Lock Exclusive,, -FuturisticCollarLockTimer,,,Lock 5 Minutes,, -FuturisticCollarLockMistress,,,Lock Mistress,, -FuturisticCollarLockLover,,,Lock Lovers,, -FuturisticCollarLockOwner,,,Lock Owner,, -FuturisticCollarLockPandora,,,Lock Pandora,, -FuturisticCollarLockCombination,,,Lock Combo,, -FuturisticCollarLockPassword,,,Lock Password,, -FuturisticCollarLockSafeword,,,Lock Safeword,, -FuturisticCollarLockTimerMiss,,,Mistress Timer,, -FuturisticCollarLockTimerPassword,,,Password Timer,, -FuturisticCollarLockTimerLovers,,,Lovers Timer,, -FuturisticCollarLockTimerOwner,,,Owner Timer,, -FuturisticCollarPassword,,,Code:,, -FuturisticCollarTime,,,Time (in mins):,, -FuturisticCollarUnlock,,,Unlock,, -FuturisticCollarColor,,,Copy Colors To Items,, -ItemBootsFuturisticHeelsSelect,,,Select heel mode,, -ItemBootsFuturisticHeelsShoes,,,Heels Retracted,, -ItemBootsFuturisticHeelsHeel,,,Heels Extended,, -ItemBootsFuturisticHeelsSetShoes,,,SourceCharacter retracts the heels on DestinationCharacter shoes.,, -ItemBootsFuturisticHeelsSetHeel,,,SourceCharacter extends the heels on DestinationCharacter shoes.,, -ItemBootsFuturisticHeels2Select,,,Select finish,, -ItemBootsFuturisticHeels2Shiny,,,Shiny,, -ItemBootsFuturisticHeels2Matte,,,Matte,, -ItemBootsFuturisticHeels2SetShiny,,,SourceCharacter polishes DestinationCharacter shoes.,, -ItemBootsFuturisticHeels2SetMatte,,,SourceCharacter removes the polish on DestinationCharacter shoes.,, -ItemBootsMonoHeelSelect,,,Select binder length,, -ItemBootsMonoHeelFull,,,Full length,, -ItemBootsMonoHeelHalf,,,Half length,, -ItemBootsMonoHeelSetFull,,,SourceCharacter adds a full-length binder to DestinationCharacter AssetName.,, -ItemBootsMonoHeelSetHalf,,,SourceCharacter adds a half-length binder to DestinationCharacter AssetName.,, -ShoesFuturisticHeels2Select,,,Select finish,, -ShoesFuturisticHeels2Shiny,,,Shiny,, -ShoesFuturisticHeels2Matte,,,Matte,, -ItemBreastFuturisticBra2SelectBase,,,Configure settings:,, -ItemBreastFuturisticBra2SelectDisplay,,,Configure display:,, -ItemBreastFuturisticBra2SelectShiny,,,Configure shine:,, -ItemBreastFuturisticBra2ModuleDisplay,,,Display,, -ItemBreastFuturisticBra2ModuleShiny,,,Shine,, -ItemBreastFuturisticBra2Options0,,,Shiny,, -ItemBreastFuturisticBra2Options1,,,Matte,, -ItemBreastFuturisticBra2Optiond0,,,Display,, -ItemBreastFuturisticBra2Optiond1,,,No Display,, -ItemBreastFuturisticBra2Setd0,,,SourceCharacter shows the display on DestinationCharacter bra.,, -ItemBreastFuturisticBra2Setd1,,,SourceCharacter hides the display on DestinationCharacter bra.,, -ItemBreastFuturisticBra2Sets0,,,SourceCharacter polishes DestinationCharacter bra.,, -ItemBreastFuturisticBra2Sets1,,,SourceCharacter removes the polish on DestinationCharacter bra.,, -FuturisticBraPlayerDesc,,,Diagnostics for wearer,, -FuturisticBraPlayerTemp,,,Current Body Temp:,, -FuturisticBraPlayerTempC,,,°C,, -FuturisticBraPlayerBreathing,,,Current Breathing:,, -FuturisticBraPlayerBreathingLow,,,Steady,, -FuturisticBraPlayerBreathingMed,,,Shaky,, -FuturisticBraPlayerBreathingHigh,,,Excited,, -FuturisticBraPlayerBreathingAction,,,Heavy,, -FuturisticBraPlayerHeartRate,,,Current Heart Rate:,, -FuturisticBraPlayerSubmissiveness,,,Current Training Level:,, -FuturisticBraPlayerTracking,,,Tracking Signal: Good,, -FuturisticBraPlayerSolid,,,Cover Display,, -FuturisticBraPlayerShow,,,Show Display,, -FuturisticBraPlayerSolid2,,,Cover Display (Alt),, -FuturisticBraPlayerShow2,,,Show Display (Alt),, -InventoryItemBreastFuturisticBraSetSolid,,,SourceCharacter covers the display on DestinationCharacter bra.,, -InventoryItemBreastFuturisticBraSetShow,,,SourceCharacter opens up the display on DestinationCharacter bra.,, -InventoryItemBreastFuturisticBraSetSolid2,,,SourceCharacter covers the display on DestinationCharacter bra.,, -InventoryItemBreastFuturisticBraSetShow2,,,SourceCharacter opens up the display on DestinationCharacter bra.,, -FuturisticBraPlayerHeartRateBPM,,,BPM,, -CupholderGagOptions,,,Cup interactions,, -CupholderGagOptionsTip,,,Tip over,, -CupholderGagOptionsNoCup,,,Remove,, -CupholderGagOptionsCup,,,Place,, -CupholderGagSetNoCup,,,SourceCharacter removes the cup from DestinationCharacter cup holder gag.,, -CupholderGagSetTip,,,SourceCharacter tips over the cup on DestinationCharacter cup holder gag.,, -CupholderGagSetCup,,,SourceCharacter places a cup on DestinationCharacter cup holder gag.,, -SelectBlindType,,,Select the type of blindfold,, -ItemHeadDuctTapeSelect,,,Select tape style,, -ItemHeadDuctTapeDouble,,,Double,, -ItemHeadDuctTapeWrap,,,Wrap,, -ItemHeadDuctTapeMummy,,,Mummy,, -ItemHeadDuctTapeOpen,,,Open Mummy,, -ItemHeadDuctTapeSetDouble,,,SourceCharacter takes a piece of duct tape for TargetCharacter and places it on her face.,, -ItemHeadDuctTapeSetWrap,,,SourceCharacter wraps some duct tape onto DestinationCharacter face.,, -ItemHeadDuctTapeSetMummy,,,SourceCharacter wraps DestinationCharacter head in tape with multiple layers. ,, -ItemHeadDuctTapeSetOpen,,,SourceCharacter wraps DestinationCharacter head in tape with the eyes free. ,, -InventoryItemDevicesLockerOpacity,,,Change Opacity,, -InventoryItemDevicesLockerType,,,Select Locker type,, -InventoryItemDevicesLockerTypeVents,,,Vents,, -InventoryItemDevicesLockerTypeVentless,,,Ventless,, -InventoryItemDevicesLockerChange,,,SourceCharacter changes the vents on DestinationCharacter locker.,, -ItemDevicesVacbedSelect,,,Select vacbed type.,, -ItemDevicesVacbedNormal,,,Hair,, -ItemDevicesVacbedNohair,,,No Hair,, -ItemDevicesVacbedSetNormal,,,SourceCharacter reveals DestinationCharacter hair from the vacbed.,, -ItemDevicesVacbedSetNohair,,,SourceCharacter tucks DestinationCharacter hair into the vacbed.,, -VacBedDeluxeTypeLabel,,,Pose,, -VacBedDeluxeOpacityLabel,,,Opacity,, -VacBedDeluxeChangeType,,,SourceCharacter changes DestinationCharacter pose in her Vacuum Bed Deluxe.,, -SelectRopeBondage,,,Select the rope bondage,, -RopeBondageBasic,,,Basic Tie,, -RopeBondageMermaid,,,Mermaid Tie,, -RopeBondageFullBinding,,,Full Binding Tie,, -RopeBondageLink,,,Link Tie,, -RopeBondageFrogtie,,,Frogtie Tie,, -RopeBondageCrossed,,,Crossed Tie,, -RopeBondageBoxTie,,,Box Tie,, -RopeBondageTightBoxtie,,,Tight Box Tie,, -RopeBondageHogtied,,,Hogtie,, -RopeBondageSwissSeat,,,Swiss Seat,, -RopeBondageKikkouHip,,,Kikkou Hip,, -RopeBondageAnkles,,,Ankles Tie,, -RopeBondageKnees,,,Knees Tie,, -RopeBondageAnklesKnees,,,Ankles and Knees Tie,, -RopeBondageThighs,,,Thighs Tie,, -RopeBondageKneesThighs,,,Knees and Thighs Tie,, -ItemArmsTightJacketSelect,,,Select straitjacket prep,, -ItemArmsTightJacketBasic,,,Basic,, -ItemArmsTightJacketPulledStraps,,,Pulled Out Straps,, -ItemArmsTightJacketLiningStraps,,,Lining Straps,, -ItemArmsTightJacketExtraPadding,,,Extra Padding,, -ItemArmsTightJacketPulledLining,,,Pulled Straps & Lining,, -ItemArmsTightJacketPulledPadding,,,Pulled Straps & Padding,, -ItemArmsTightJacketPaddedLining,,,Padding & Lining,, -ItemArmsTightJacketFullJacket,,,Full Jacket,, -ItemArmsTightJacketSetBasic,,,SourceCharacter removes all addons from DestinationCharacter tightjacket.,, -ItemArmsTightJacketSetPulledStraps,,,SourceCharacter pulls out the straps on DestinationCharacter tightjacket.,, -ItemArmsTightJacketSetLiningStraps,,,SourceCharacter adds lining straps to DestinationCharacter tightjacket.,, -ItemArmsTightJacketSetExtraPadding,,,SourceCharacter adds extra padding to DestinationCharacter tightjacket.,, -ItemArmsTightJacketSetPulledLining,,,SourceCharacter pulls out the straps and adds lining straps to DestinationCharacter tightjacket.,, -ItemArmsTightJacketSetPulledPadding,,,SourceCharacter pulls out the straps and adds extra padding to DestinationCharacter tightjacket.,, -ItemArmsTightJacketSetPaddedLining,,,SourceCharacter adds extra padding and lining straps to DestinationCharacter tightjacket.,, -ItemArmsTightJacketSetFullJacket,,,SourceCharacter adds all addons to DestinationCharacter tightjacket.,, -SelectZipTie,,,Select Ziptie Bondage,, -ItemArmsZiptiesZipLight,,,Light Binding,, -ItemArmsZiptiesZipMedium,,,Medium Binding,, -ItemArmsZiptiesZipFull,,,Full Binding,, -ItemArmsZiptiesZipElbowWrist,,,Elbow Wrist Binding,, -ItemArmsZiptiesZipWristLight,,,Light Wrist Binding,, -ItemArmsZiptiesZipWristMedium,,,Medium Wrist Binding,, -ItemArmsZiptiesZipWristFull,,,Full Wrist Binding,, -ItemArmsZiptiesZipWrist,,,Wrist Binding,, -ItemArmsZiptiesZipKneelingHogtie,,,Kneeling Hogtie,, -ItemArmsZiptiesZipHogtie,,,Hogtie,, -ItemArmsZiptiesZipAllFours,,,All Fours,, -ZipBondageZipLegLight,,,Light Binding,, -ZipBondageZipLegMedium,,,Medium Binding,, -ZipBondageZipLegFull,,,Full Binding,, -ZipBondageZipFrogtie,,,Frogtie,, -ZipBondageZipFeetLight,,,Light Binding,, -ZipBondageZipFeetMedium,,,Medium Binding,, -ZipBondageZipFeetFull,,,Full Binding,, -ItemArmsZiptiesSetZipLight,,,SourceCharacter uses the zipties on TargetCharacter to lightly bind her elbows and wrists.,, -ItemArmsZiptiesSetZipMedium,,,SourceCharacter uses the zipties on TargetCharacter to half bind her elbows and wrists.,, -ItemArmsZiptiesSetZipFull,,,SourceCharacter uses the zipties on TargetCharacter to fully bind her elbows and wrists.,, -ItemArmsZiptiesSetZipElbowWrist,,,SourceCharacter uses the zipties on TargetCharacter to bind her elbows and wrists.,, -ItemArmsZiptiesSetZipWristLight,,,SourceCharacter uses the zipties on TargetCharacter to lightly bind her wrists.,, -ItemArmsZiptiesSetZipWristMedium,,,SourceCharacter uses the zipties on TargetCharacter to half bind her wrists.,, -ItemArmsZiptiesSetZipWristFull,,,SourceCharacter uses the zipties on TargetCharacter to fully bind her wrists.,, -ItemArmsZiptiesSetZipWrist,,,SourceCharacter uses the zipties on TargetCharacter to bind her wrists behind her back.,, -ItemArmsZiptiesSetZipHogtie,,,SourceCharacter uses the zipties on TargetCharacter to hogtie her.,, -ItemArmsZiptiesSetZipKneelingHogtie,,,SourceCharacter uses the zipties on TargetCharacter to hogtie her on her knees.,, -ItemArmsZiptiesSetZipAllFours,,,SourceCharacter uses the zipties on TargetCharacter bind her on all fours.,, -ItemLegsZiptiesSetZipLegLight,,,SourceCharacter uses the zipties on TargetCharacter to lighty bind her legs.,, -ItemLegsZiptiesSetZipLegMedium,,,SourceCharacter uses the zipties on TargetCharacter to half bind her legs.,, -ItemLegsZiptiesSetZipLegFull,,,SourceCharacter uses the zipties on TargetCharacter to fully bind her legs.,, -ItemLegsZiptiesSetZipFrogtie,,,SourceCharacter uses the zipties on TargetCharacter to frogtie her.,, -ZipFeetSetZipFeetLight,,,SourceCharacter uses the zipties on TargetCharacter to lightly bind her feet.,, -ZipFeetSetZipFeetMedium,,,SourceCharacter uses the zipties on TargetCharacter to half bind her feet.,, -ZipFeetSetZipFeetFull,,,SourceCharacter uses the zipties on TargetCharacter to fully bind her feet.,, -ToeTapePoseToes,,,Toes,, -ToeTapePoseFull,,,Full,, -ToeTapeSetToes,,,SourceCharacter uses the tape on TargetCharacter to tie her toes together with tape.,, -ToeTapeSetFull,,,SourceCharacter uses the tape on TargetCharacter to fully wrap her feet with tape.,, -RopeBondageSuspension,,,Suspension Tie,, -RopeBondageWristElbowTie,,,Wrist and Elbow Tie,, -RopeBondageWristTie,,,Wrist Tie,, -RopeBondageRopeCuffs,,,Rope Cuffs,, -RopeBondageCrossedBoxtie,,,Crossed Boxtie,, -RopeBondageWristElbowHarnessTie,,,Wrist & Elbow Harness Tie,, -RopeBondageAllFours,,,All Fours,, -RopeBondageSimpleHogtie,,,Simple Hogtie,, -RopeBondageKneelingHogtie,,,Kneeling Hogtie,, -RopeBondageSuspensionKneelingHogtie,,,Suspended Kneeling Hogtie,, -RopeBondageSuspensionHogtied,,,Suspended Hogtie,, -RopeBondageSuspensionAllFours,,,Suspended All Fours,, -RopeBondageInvertedSuspensionHogtied,,,Inverted Suspended Hogtie,, -RopeBondageInvertedSuspensionAllFours,,,Inverted Suspended All Fours,, -RopeBondageCrotch,,,Crotch Rope,, -RopeBondageOverPanties,,,Over Panties,, -RopeBondageHarness,,,Body Harness,, -RopeBondageStar,,,Star Harness Tie,, -RopeBondageWaist,,,Waist Rope,, -RopeBondageDiamond,,,Diamond Tie,, -RopeBondageBedSpreadEagle,,,Bed Spread-Eagle,, -NoRequirement,,,No Requirement,, -RequireBondageLevel,,,Need Bondage ReqLevel,, -RopeHarnessSetCrotch,,,SourceCharacter uses the rope on TargetCharacter to do a crotch rope tie.,, -RopeHarnessSetHarness,,,SourceCharacter uses the rope on TargetCharacter to do a body harness.,, -RopeHarnessSetStar,,,SourceCharacter uses the rope on TargetCharacter to tie a star harness.,, -RopeHarnessSetWaist,,,SourceCharacter uses the rope on TargetCharacter to tie a waist rope on her.,, -RopeHarnessSetDiamond,,,SourceCharacter uses the rope on TargetCharacter to do a diamond style harness.,, -LegRopeSetBasic,,,SourceCharacter uses the rope on TargetCharacter to do a basic tie.,, -LegRopeSetMermaid,,,SourceCharacter uses the rope on TargetCharacter to do a mermaid tie.,, -LegRopeSetFullBinding,,,SourceCharacter uses the rope on TargetCharacter to do a full binding tie.,, -LegRopeSetFrogtie,,,SourceCharacter uses the rope on TargetCharacter to do a frogtie tie.,, -LegRopeSetSuspension,,,SourceCharacter uses the rope on TargetCharacter to do a suspension tie.,, -LegRopeSetLink,,,SourceCharacter uses the rope on TargetCharacter to do a full binding with links tie in.,, -LegRopeSetDiamond,,,SourceCharacter uses the rope on TargetCharacter to do a diamond style tie.,, -LegRopeSetCrossed,,,SourceCharacter uses the rope on TargetCharacter to do a crossed style binding tie.,, -LegRopeSetBedSpreadEagle,,,SourceCharacter uses the rope on TargetCharacter to tie her legs to the bedposts.,, -LegRopeSetKnees,,,SourceCharacter ties the rope above TargetCharacter's knees.,, -LegRopeSetThighs,,,SourceCharacter uses the rope to tie TargetCharacter's thighs.,, -LegRopeSetKneesThighs,,,SourceCharacter uses the ropes to tie TargetCharacter's knees and thighs.,, -FeetRopeSetAnkles,,,SourceCharacter ties the rope around TargetCharacter's ankles.,, -FeetRopeSetKnees,,,SourceCharacter ties the rope below TargetCharacter's knees.,, -FeetRopeSetAnklesKnees,,,SourceCharacter ties the ropes around TargetCharacter's ankles and knees.,, -FeetRopeSetBedSpreadEagle,,,SourceCharacter uses the ropes on TargetCharacter to tie her legs to the bedposts.,, -ArmsRopeSetBoxTie,,,SourceCharacter uses rope on TargetCharacter to do a box tie.,, -ArmsRopeSetTightBoxtie,,,SourceCharacter uses rope on TargetCharacter to do a tight boxtie.,, -ArmsRopeSetCrossedBoxtie,,,SourceCharacter uses rope on TargetCharacter to do a crossed boxtie.,, -ArmsRopeSetHogtied,,,SourceCharacter uses rope to hogtie TargetCharacter.,, -ArmsRopeSetSimpleHogtie,,,SourceCharacter uses rope to hogtie TargetCharacter.,, -ArmsRopeSetWristElbowTie,,,SourceCharacter uses rope to tie DestinationCharacter wrists and elbows together behind her back.,, -ArmsRopeSetWristTie,,,SourceCharacter uses rope to tie DestinationCharacter wrists together behind her back.,, -ArmsRopeSetRopeCuffs,,,SourceCharacter uses rope to tie rope cuffs on DestinationCharacter wrists,, -ArmsRopeSetWristElbowHarnessTie,,,SourceCharacter uses rope to tie DestinationCharacter wrists and elbows in a harness behind her back.,, -ArmsRopeSetAllFours,,,SourceCharacter uses rope on TargetCharacter to have her crawling on all fours.,, -ArmsRopeSetKneelingHogtie,,,SourceCharacter uses rope to hogtie TargetCharacter on her knees.,, -ArmsRopeSetBedSpreadEagle,,,SourceCharacter uses rope to tie DestinationCharacter arms to the bedposts.,, -SelectCeilingRopeState,,,Select Rope Bondage.,, -CeilingRopeBondageLowered,,,Lowered,, -CeilingRopeBondageSuspended,,,Suspended,, -CeilingRopeSetSuspended,,,SourceCharacter uses the rope on TargetCharacter to suspend her.,, -CeilingRopeSetLowered,,,SourceCharacter uses the rope on TargetCharacter to lower her.,, -SelectCeilingChainState,,,Select Chain Bondage.,, -CeilingChainBondageLowered,,,Lowered,, -CeilingChainBondageSuspended,,,Suspended,, -CeilingChainSetSuspended,,,SourceCharacter uses the chain on TargetCharacter to suspend her.,, -CeilingChainSetLowered,,,SourceCharacter uses the chain on TargetCharacter to lower her.,, -SelectInflationLevel,,,How much do you want to inflate the strait leotard?,, -InflationAmountLight,,,Light,, -InflationAmountInflated,,,Inflated,, -InflationAmountBloated,,,Bloated,, -InflationAmountMax,,,Max,, -InflationAmountSetLight,,,SourceCharacter adjusts DestinationCharacter inflatable strait leotard to be only lightly filled.,, -InflationAmountSetInflated,,,SourceCharacter adjusts DestinationCharacter inflatable strait leotard to be half filled.,, -InflationAmountSetBloated,,,SourceCharacter adjusts DestinationCharacter inflatable strait leotard to three quarters filled.,, -InflationAmountSetMax,,,SourceCharacter adjusts DestinationCharacter inflatable strait leotard to fill the maximum amount.,, -PelvisRopeSetCrotch,,,SourceCharacter uses the rope on TargetCharacter to do a crotch rope tie.,, -PelvisRopeSetOverPanties,,,SourceCharacter uses the rope on TargetCharacter to do a crotch rope tie over her panties.,, -PelvisRopeSetSwissSeat,,,SourceCharacter uses the rope on TargetCharacter to do a swiss seat style rope tie.,, -PelvisRopeSetKikkouHip,,,SourceCharacter uses the rope on TargetCharacter to do a kikkou hip style rope tie.,, -ItemPelvisPoofyDiaperSelect,,,Select the amount of padding.,, -ItemPelvisPoofyDiaperRegularPadding,,,Regular Padding,, -ItemPelvisPoofyDiaperExtraPadding,,,Extra Padding,, -ItemPelvisPoofyDiaperSetRegularPadding,,,The extra padding is removed from DestinationCharacterName poofy diaper. Though it is still embarrassingly huge.,, -ItemPelvisPoofyDiaperSetExtraPadding,,,Extra padding is added to DestinationCharacterName poofy diaper. Making it crinkle louder and force the baby to waddle.,, -ItemPelvisObedienceBeltSelectBase,,,Choose the belt's options.,, -ItemPelvisObedienceBeltModuleCrotchShield,,,Crotch Shield,, -ItemPelvisObedienceBeltModuleShockModule,,,Shock Module,, -ItemPelvisObedienceBeltModuleEngraving,,,Engraving,, -ItemPelvisObedienceBeltSelectCrotchShield,,,Choose the crotch shield's state.,, -ItemPelvisObedienceBeltOptionc0,,,Opened,, -ItemPelvisObedienceBeltOptionc1,,,Close Front,, -ItemPelvisObedienceBeltOptionc2,,,Close Back,, -ItemPelvisObedienceBeltOptionc3,,,Close Both,, -ItemPelvisObedienceBeltSelectShockModule,,,Select the shock module configuration.,, -ItemPelvisObedienceBeltOptions0,,,Disabled,, -ItemPelvisObedienceBeltOptions1,,,Enabled,, -ItemPelvisObedienceBeltSelectEngraving,,,Engrave the belt.,, -ItemPelvisObedienceBeltOptione0,,,Engrave,, -ItemPelvisObedienceBeltSetc0,,,SourceCharacter opens the crotch shield on DestinationCharacter obedience belt.,, -ItemPelvisObedienceBeltSetc1,,,SourceCharacter closes the front crotch shield of DestinationCharacter obedience belt.,, -ItemPelvisObedienceBeltSetc2,,,SourceCharacter closes the back crotch shield on DestinationCharacter obedience belt.,, -ItemPelvisObedienceBeltSetc3,,,SourceCharacter closes both crotch shields on DestinationCharacter obedience belt.,, -ItemPelvisObedienceBeltSets0,,,SourceCharacter removes the shock module from DestinationCharacter obedience belt.,, -ItemPelvisObedienceBeltSets1,,,SourceCharacter sets up the shock module on DestinationCharacter obedience belt.,, -ObedienceBeltEngraveLabel,,,Engrave the following text on the belt:,, -ObedienceBeltEngrave,,,Engrave,, -ObedienceBeltEngravingUpdated,,,SourceCharacter engraved “NewText” on DestinationCharacter obedience belt.,, -ObedienceBeltEngravingErased,,,SourceCharacter erases the engraving on DestinationCharacter obedience belt.,, -ObedienceBeltShowChatMessage,,,Show messages in chat,, -ObedienceBeltPunishOrgasm,,,Punish orgasms,, -ObedienceBeltPunishStandup,,,Punish standing up,, -ObedienceBeltShockTrigger,,,The obedience belt on SourceCharacter shocks her.,, -ObedienceBeltShockOrgasm,,,The obedience belt on SourceCharacter shocks her for having an orgasm.,, -ObedienceBeltShockStandup,,,The obedience belt on SourceCharacter shocks her for standing up.,, -ResetShockCount,,,Reset trigger count,, -ShockCount,,,Trigger count: ShockCount,, -ShockCountReset,,,SourceCharacter resets DestinationCharacter AssetName trigger count.,, -Intensity-1,,,Item intensity: Disabled,, -Intensity0,,,Item intensity: Low,, -Intensity1,,,Item intensity: Medium,, -Intensity2,,,Item intensity: High,, -Intensity3,,,Item intensity: Maximum,, -Sensitivity-1,,,Item sensitivity: Disabled,, -Sensitivity0,,,Item sensitivity: Low,, -Sensitivity1,,,Item sensitivity: Medium,, -Sensitivity2,,,Item sensitivity: High,, -Sensitivity3,,,Item sensitivity: Maximum,, -EggIntensity-1,,,Egg item intensity: Disabled,, -EggIntensity0,,,Egg item intensity: Low,, -EggIntensity1,,,Egg item intensity: Medium,, -EggIntensity2,,,Egg item intensity: High,, -EggIntensity3,,,Egg item intensity: Maximum,, -DildoIntensity-1,,,Dildo item intensity: Disabled,, -DildoIntensity0,,,Dildo item intensity: Low,, -DildoIntensity1,,,Dildo item intensity: Medium,, -DildoIntensity2,,,Dildo item intensity: High,, -DildoIntensity3,,,Dildo item intensity: Maximum,, -Increase,,,Increase,, -Decrease,,,Decrease,, -ShockCollarShowChat,,,Show chat message,, -ShockCollarSet0,,,SourceCharacter sets DestinationCharacter AssetName to low intensity.,, -ShockCollarSet1,,,SourceCharacter sets DestinationCharacter AssetName to moderate intensity.,, -ShockCollarSet2,,,SourceCharacter sets DestinationCharacter AssetName to high intensity.,, -ShockCollarSetSensitivity0,,,SourceCharacter sets DestinationCharacter AssetName to manual mode.,, -ShockCollarSetSensitivity1,,,SourceCharacter sets DestinationCharacter AssetName to low sensitivity.,, -ShockCollarSetSensitivity2,,,SourceCharacter sets DestinationCharacter AssetName to medium sensitivity.,, -ShockCollarSetSensitivity3,,,SourceCharacter sets DestinationCharacter AssetName to maximum sensitivity.,, -TriggerShock0,,,DestinationCharacterName AssetName gives her a light shock.,, -TriggerShock1,,,DestinationCharacterName AssetName lets out a sharp jolt!,, -TriggerShock2,,,DestinationCharacterName AssetName delivers an intense shock!,, -ShockCollarTrigger0,,,DestinationCharacterName collar gives her a light shock.,, -ShockCollarTrigger1,,,DestinationCharacterName collar lets out a sharp jolt!,, -ShockCollarTrigger2,,,DestinationCharacterName collar delivers an intense shock!,, -CollarShockUnitTrigger0,,,DestinationCharacterName collar gives her a light shock.,, -CollarShockUnitTrigger1,,,DestinationCharacterName collar lets out a sharp jolt!,, -CollarShockUnitTrigger2,,,DestinationCharacterName collar delivers an intense shock!,, -AutoShockCollarTrigger0,,,DestinationCharacterName collar gives her a light shock.,, -AutoShockCollarTrigger1,,,DestinationCharacterName collar lets out a sharp jolt!,, -AutoShockCollarTrigger2,,,DestinationCharacterName collar delivers an intense shock!,, -CollarAutoShockUnitTrigger0,,,DestinationCharacterName collar gives her a light shock.,, -CollarAutoShockUnitTrigger1,,,DestinationCharacterName collar lets out a sharp jolt!,, -CollarAutoShockUnitTrigger2,,,DestinationCharacterName collar delivers an intense shock!,, -EggDecreaseTo-1,,,DestinationCharacterName vibrating egg stops vibrating.,, -EggDecreaseTo0,,,DestinationCharacterName vibrating egg slows down into a light tease.,, -EggDecreaseTo1,,,DestinationCharacterName vibrating egg returns to a moderate pace.,, -EggDecreaseTo2,,,DestinationCharacterName vibrating egg slows down a tiny bit.,, -EggIncreaseTo0,,,DestinationCharacterName vibrating egg starts teasing her lightly.,, -EggIncreaseTo1,,,DestinationCharacterName vibrating egg builds up to a moderate pace.,, -EggIncreaseTo2,,,DestinationCharacterName vibrating egg starts buzzing strongly!,, -EggIncreaseTo3,,,DestinationCharacterName vibrating egg jumps up to maximum intensity!,, -SybianDecreaseTo-1,,,DestinationCharacterName sybian stops vibrating.,, -SybianDecreaseTo0,,,DestinationCharacterName sybian slows down into a light tease.,, -SybianDecreaseTo1,,,DestinationCharacterName sybian returns to a moderate pace.,, -SybianDecreaseTo2,,,DestinationCharacterName sybian slows down a tiny bit.,, -SybianIncreaseTo0,,,DestinationCharacterName sybian starts teasing her lightly.,, -SybianIncreaseTo1,,,DestinationCharacterName sybian builds up to a moderate pace.,, -SybianIncreaseTo2,,,DestinationCharacterName sybian starts buzzing strongly!,, -SybianIncreaseTo3,,,DestinationCharacterName sybian jumps up to maximum intensity!,, -DildoDecreaseTo-1,,,DestinationCharacterName vibrating dildo stops vibrating.,, -DildoDecreaseTo0,,,DestinationCharacterName vibrating dildo slows down into a light tease.,, -DildoDecreaseTo1,,,DestinationCharacterName vibrating dildo returns to a moderate pace.,, -DildoDecreaseTo2,,,DestinationCharacterName vibrating dildo slows down a tiny bit.,, -DildoIncreaseTo0,,,DestinationCharacterName vibrating dildo starts teasing her lightly.,, -DildoIncreaseTo1,,,DestinationCharacterName vibrating dildo builds up to a moderate pace.,, -DildoIncreaseTo2,,,DestinationCharacterName vibrating dildo starts buzzing strongly!,, -DildoIncreaseTo3,,,DestinationCharacterName vibrating dildo jumps up to maximum intensity!,, -ClitStimulatorDecreaseTo-1,,,DestinationCharacterName clitoral stimulator stops vibrating.,, -ClitStimulatorDecreaseTo0,,,DestinationCharacterName clitoral stimulator slows down into a light tease.,, -ClitStimulatorDecreaseTo1,,,DestinationCharacterName clitoral stimulator returns to a moderate pace.,, -ClitStimulatorDecreaseTo2,,,DestinationCharacterName clitoral stimulator slows down a tiny bit.,, -ClitStimulatorIncreaseTo0,,,DestinationCharacterName clitoral stimulator starts teasing her lightly.,, -ClitStimulatorIncreaseTo1,,,DestinationCharacterName clitoral stimulator builds up to a moderate pace.,, -ClitStimulatorIncreaseTo2,,,DestinationCharacterName clitoral stimulator starts buzzing strongly!,, -ClitStimulatorIncreaseTo3,,,DestinationCharacterName clitoral stimulator jumps up to maximum intensity!,, -InflVibeDildo_VibeDecreaseTo-1,,,DestinationCharacterName inflatable vibrating dildo stops vibrating.,, -InflVibeDildo_VibeDecreaseTo0,,,DestinationCharacterName inflatable vibrating dildo slows down into a light tease.,, -InflVibeDildo_VibeDecreaseTo1,,,DestinationCharacterName inflatable vibrating dildo returns to a moderate pace.,, -InflVibeDildo_VibeDecreaseTo2,,,DestinationCharacterName inflatable vibrating dildo slows down a tiny bit.,, -InflVibeDildo_VibeIncreaseTo0,,,DestinationCharacterName inflatable vibrating dildo starts teasing her lightly.,, -InflVibeDildo_VibeIncreaseTo1,,,DestinationCharacterName inflatable vibrating dildo builds up to a moderate pace.,, -InflVibeDildo_VibeIncreaseTo2,,,DestinationCharacterName inflatable vibrating dildo starts buzzing strongly!,, -InflVibeDildo_VibeIncreaseTo3,,,DestinationCharacterName inflatable vibrating dildo jumps up to maximum intensity!,, -InflVibeDildo_PumpdeflatesTo0,,,SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till it's regular sized.,, -InflVibeDildo_PumpdeflatesTo1,,,SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till only slighty bulging.,, -InflVibeDildo_PumpdeflatesTo2,,,SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till it's moderately bulging.,, -InflVibeDildo_PumpdeflatesTo3,,,SourceCharacter deflates DestinationCharacter inflatable vibrating dildo only a tiny bit.,, -InflVibeDildo_PumppumpsTo1,,,SourceCharacter inflates DestinationCharacter inflatable vibrating dildo only slightly.,, -InflVibeDildo_PumppumpsTo2,,,SourceCharacter inflates DestinationCharacter inflatable vibrating dildo till it's moderately bulging.,, -InflVibeDildo_PumppumpsTo3,,,SourceCharacter inflates DestinationCharacter inflatable vibrating dildo till it's heavily bulging.,, -InflVibeDildo_PumppumpsTo4,,,SourceCharacter inflates DestinationCharacter inflatable vibrating dildo to it's maximum size.,, -NippleEggDecreaseTo-1,,,DestinationCharacterName vibrating eggs on her nipples stop vibrating.,, -NippleEggDecreaseTo0,,,DestinationCharacterName vibrating eggs on her nipples slow down into a light tease.,, -NippleEggDecreaseTo1,,,DestinationCharacterName vibrating eggs on her nipples return to a moderate pace.,, -NippleEggDecreaseTo2,,,DestinationCharacterName vibrating eggs on her nipples slow down a tiny bit.,, -NippleEggIncreaseTo0,,,DestinationCharacterName vibrating eggs on her nipples start teasing her lightly.,, -NippleEggIncreaseTo1,,,DestinationCharacterName vibrating eggs on her nipples build up to a moderate pace.,, -NippleEggIncreaseTo2,,,DestinationCharacterName vibrating eggs on her nipples start buzzing strongly!,, -NippleEggIncreaseTo3,,,DestinationCharacterName vibrating eggs on her nipples jump up to maximum intensity!,, -TapedClitEggDecreaseTo-1,,,DestinationCharacterName vibrating egg on her clitoris stops vibrating.,, -TapedClitEggDecreaseTo0,,,DestinationCharacterName vibrating egg on her clitoris slows down into a light tease.,, -TapedClitEggDecreaseTo1,,,DestinationCharacterName vibrating egg on her clitoris returns to a moderate pace.,, -TapedClitEggDecreaseTo2,,,DestinationCharacterName vibrating egg on her clitoris slows down a tiny bit.,, -TapedClitEggIncreaseTo0,,,DestinationCharacterName vibrating egg on her clitoris starts teasing her lightly.,, -TapedClitEggIncreaseTo1,,,DestinationCharacterName vibrating egg on her clitoris builds up to a moderate pace.,, -TapedClitEggIncreaseTo2,,,DestinationCharacterName vibrating egg on her clitoris starts buzzing strongly!,, -TapedClitEggIncreaseTo3,,,DestinationCharacterName vibrating egg on her clitoris jumps up to maximum intensity!,, -NipSucloosensToLoose,,,SourceCharacter loosens DestinationCharacter nipple suction cups until they hang loosely.,, -NipSucloosensToLight,,,SourceCharacter loosens DestinationCharacter nipple suction cups to a light amount of suction.,, -NipSucloosensToMedium,,,SourceCharacter loosens DestinationCharacter nipple suction cups to a moderate amount of suction.,, -NipSucloosensToHeavy,,,SourceCharacter loosens DestinationCharacter nipple suction cups a bit to a heavy amount of suction.,, -NipSuctightensToLight,,,SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples lightly.,, -NipSuctightensToMedium,,,SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples firmly.,, -NipSuctightensToHeavy,,,SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples heavily.,, -NipSuctightensToMaximum,,,SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples entirely.,, -ClitSucloosensToLoose,,,SourceCharacter loosens DestinationCharacter clitoris suction cup until it hangs loosely.,, -ClitSucloosensToLight,,,SourceCharacter loosens DestinationCharacter clitoris suction cup to a light amount of suction.,, -ClitSucloosensToMedium,,,SourceCharacter loosens DestinationCharacter clitoris suction cup to a moderate amount of suction.,, -ClitSucloosensToHeavy,,,SourceCharacter loosens DestinationCharacter clitoris suction cup a bit to a heavy amount of suction.,, -ClitSuctightensToLight,,,SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris lightly.,, -ClitSuctightensToMedium,,,SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris firmly.,, -ClitSuctightensToHeavy,,,SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris heavily.,, -ClitSuctightensToMaximum,,,SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris entirely.,, -PantiesDecreaseTo-1,,,DestinationCharacterName vibrating latex panties stops vibrating.,, -PantiesDecreaseTo0,,,DestinationCharacterName vibrating latex panties slows down into a light tease.,, -PantiesDecreaseTo1,,,DestinationCharacterName vibrating latex panties returns to a moderate pace.,, -PantiesDecreaseTo2,,,DestinationCharacterName vibrating latex panties slows down a tiny bit.,, -PantiesIncreaseTo0,,,DestinationCharacterName vibrating latex panties starts teasing her lightly.,, -PantiesIncreaseTo1,,,DestinationCharacterName vibrating latex panties builds up to a moderate pace.,, -PantiesIncreaseTo2,,,DestinationCharacterName vibrating latex panties starts buzzing strongly!,, -PantiesIncreaseTo3,,,DestinationCharacterName vibrating latex panties jumps up to maximum intensity!,, -BeltDecreaseTo-1,,,DestinationCharacterName vibrating wand stops vibrating.,, -BeltDecreaseTo0,,,DestinationCharacterName vibrating wand slows down into a light tease.,, -BeltDecreaseTo1,,,DestinationCharacterName vibrating wand returns to a moderate pace.,, -BeltDecreaseTo2,,,DestinationCharacterName vibrating wand slows down a tiny bit.,, -BeltIncreaseTo0,,,DestinationCharacterName vibrating wand starts teasing her lightly.,, -BeltIncreaseTo1,,,DestinationCharacterName vibrating wand builds up to a moderate pace.,, -BeltIncreaseTo2,,,DestinationCharacterName vibrating wand starts buzzing strongly!,, -BeltIncreaseTo3,,,DestinationCharacterName vibrating wand jumps up to maximum intensity!,, -HempRopeBeltecreaseTo0,,,DestinationCharacterName vibrating wand slows down into a light tease.,, -HempRopeBeltDecreaseTo1,,,DestinationCharacterName vibrating wand returns to a moderate pace.,, -HempRopeBeltDecreaseTo2,,,DestinationCharacterName vibrating wand slows down a tiny bit.,, -HempRopeBeltIncreaseTo0,,,DestinationCharacterName vibrating wand starts teasing her lightly.,, -HempRopeBeltIncreaseTo1,,,DestinationCharacterName vibrating wand builds up to a moderate pace.,, -HempRopeBeltIncreaseTo2,,,DestinationCharacterName vibrating wand starts buzzing strongly!,, -HempRopeBeltsIncreaseTo3,,,DestinationCharacterName vibrating wand jumps up to maximum intensity!,, -SpreaderVibratingDildoBarDecreaseTo-1,,,The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar stops vibrating.,, -SpreaderVibratingDildoBarDecreaseTo0,,,The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar slows down into a light tease.,, -SpreaderVibratingDildoBarDecreaseTo1,,,The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar returns to a moderate pace.,, -SpreaderVibratingDildoBarDecreaseTo2,,,The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar slows down a tiny bit.,, -SpreaderVibratingDildoBarIncreaseTo0,,,The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar starts teasing her lightly.,, -SpreaderVibratingDildoBarIncreaseTo1,,,The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar builds up to a moderate pace.,, -SpreaderVibratingDildoBarIncreaseTo2,,,The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar starts buzzing strongly!,, -SpreaderVibratingDildoBarIncreaseTo3,,,The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar jumps up to maximum intensity!,, -BPumpsdeflatesToEmpty,,,SourceCharacter deflates DestinationCharacter butt pump till it's empty.,, -BPumpsdeflatesToLight,,,SourceCharacter deflates DestinationCharacter butt pump till only slighty filled.,, -BPumpsdeflatesToInflated,,,SourceCharacter deflates DestinationCharacter butt pump till it's half full.,, -BPumpsdeflatesToBloated,,,SourceCharacter deflates DestinationCharacter butt pump only a tiny bit.,, -BPumpspumpsToLight,,,SourceCharacter inflates DestinationCharacter butt pump only slightly.,, -BPumpspumpsToInflated,,,SourceCharacter inflates DestinationCharacter butt pump till half full.,, -BPumpspumpsToBloated,,,SourceCharacter inflates DestinationCharacter butt pump three quarters filled.,, -BPumpspumpsToMaximum,,,SourceCharacter inflates DestinationCharacter butt pump to the maximum amount.,, -ButtplugDecreaseTo-1,,,DestinationCharacterName vibrating buttplug stops vibrating.,, -ButtplugDecreaseTo0,,,DestinationCharacterName vibrating buttplug slows down into a light tease.,, -ButtplugDecreaseTo1,,,DestinationCharacterName vibrating buttplug returns to a moderate pace.,, -ButtplugDecreaseTo2,,,DestinationCharacterName vibrating buttplug slows down a tiny bit.,, -ButtplugIncreaseTo0,,,DestinationCharacterName vibrating buttplug starts teasing her lightly.,, -ButtplugIncreaseTo1,,,DestinationCharacterName vibrating buttplug builds up to a moderate pace.,, -ButtplugIncreaseTo2,,,DestinationCharacterName vibrating buttplug starts buzzing strongly!,, -ButtplugIncreaseTo3,,,DestinationCharacterName vibrating buttplug jumps up to maximum intensity!,, -InflVibeButtPlug_VibeDecreaseTo-1,,,DestinationCharacterName inflatable vibrating butt plug stops vibrating.,, -InflVibeButtPlug_VibeDecreaseTo0,,,DestinationCharacterName inflatable vibrating butt plug slows down into a light tease.,, -InflVibeButtPlug_VibeDecreaseTo1,,,DestinationCharacterName inflatable vibrating butt plug returns to a moderate pace.,, -InflVibeButtPlug_VibeDecreaseTo2,,,DestinationCharacterName inflatable vibrating butt plug slows down a tiny bit.,, -InflVibeButtPlug_VibeIncreaseTo0,,,DestinationCharacterName inflatable vibrating butt plug starts teasing her lightly.,, -InflVibeButtPlug_VibeIncreaseTo1,,,DestinationCharacterName inflatable vibrating butt plug builds up to a moderate pace.,, -InflVibeButtPlug_VibeIncreaseTo2,,,DestinationCharacterName inflatable vibrating butt plug starts buzzing strongly!,, -InflVibeButtPlug_VibeIncreaseTo3,,,DestinationCharacterName inflatable vibrating butt plug jumps up to maximum intensity!,, -InflVibeButtPlug_PumpdeflatesTo0,,,SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till it's empty.,, -InflVibeButtPlug_PumpdeflatesTo1,,,SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till only slightly filled.,, -InflVibeButtPlug_PumpdeflatesTo2,,,SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till it's half full.,, -InflVibeButtPlug_PumpdeflatesTo3,,,SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug only a tiny bit.,, -InflVibeButtPlug_PumppumpsTo1,,,SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug only slightly.,, -InflVibeButtPlug_PumppumpsTo2,,,SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug till it's half full.,, -InflVibeButtPlug_PumppumpsTo3,,,SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug till three quarters filled.,, -InflVibeButtPlug_PumppumpsTo4,,,SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug to it's maximum amount.,, -ButtPlugLockPoseBase,,,Nothing,, -ButtPlugLockPoseChainShort,,,Short Chain,, -ButtPlugLockPoseChainLong,,,Long Chain,, -ButtPlugLockRestrainBase,,,SourceCharacter removes the chain from DestinationCharacter locking butt plug.,, -ButtPlugLockRestrainChainShort,,,SourceCharacter attaches a short chain to DestinationCharacter locking butt plug.,, -ButtPlugLockRestrainChainLong,,,SourceCharacter attaches a long chain to DestinationCharacter locking butt plug.,, -AnalHookPoseBase,,,Nothing,, -AnalHookPoseChain,,,Chain,, -AnalHookPoseHair,,,Hair,, -AnalHookRestrainBase,,,SourceCharacter detaches DestinationCharacter anal hook.,, -AnalHookRestrainChain,,,SourceCharacter attaches a chain to DestinationCharacter anal hook.,, -AnalHookRestrainHair,,,SourceCharacter attaches DestinationCharacter anal hook to her hair.,, -BeadsCount,,,Inserted Beads Count: ,, -InsertBead,,,Insert One,, -RemoveBead,,,Remove One,, -MinimumBeads,,,Remove All Except One,, -MaximumBeads,,,Insert All,, -AnalBeads2SetUpTo2,,,SourceCharacter inserts a second bead in DestinationCharacter butt,, -AnalBeads2SetUpTo3,,,SourceCharacter inserts a third bead in DestinationCharacter butt,, -AnalBeads2SetUpTo4,,,SourceCharacter inserts a fourth bead in DestinationCharacter butt,, -AnalBeads2SetUpTo5,,,SourceCharacter inserts a fifth bead in DestinationCharacter butt,, -AnalBeads2SetDown,,,SourceCharacter pulls a bead out of DestinationCharacter butt,, -AnalBeads2SetMax,,,SourceCharacter inserts all five beads in DestinationCharacter butt,, -AnalBeads2SetMin,,,SourceCharacter pulls all but one bead from DestinationCharacter butt,, -PumpGagdeflatesToEmpty,,,SourceCharacter deflates DestinationCharacter gag fully till it's empty.,, -PumpGagdeflatesToLight,,,SourceCharacter deflates DestinationCharacter gag till only slighty filled.,, -PumpGagdeflatesToInflated,,,SourceCharacter deflates DestinationCharacter gag till it's half full.,, -PumpGagdeflatesToBloated,,,SourceCharacter deflates DestinationCharacter gag only a tiny bit.,, -PumpGagpumpsToLight,,,SourceCharacter inflates DestinationCharacter gag only slightly.,, -PumpGagpumpsToInflated,,,SourceCharacter inflates DestinationCharacter gag till half full.,, -PumpGagpumpsToBloated,,,SourceCharacter inflates DestinationCharacter gag three quarters filled.,, -PumpGagpumpsToMaximum,,,SourceCharacter inflates DestinationCharacter gag to the maximum amount.,, -InflatedHooddeflatesToEmpty,,,SourceCharacter deflates inflated hood's gag fully till it's empty.,, -InflatedHooddeflatesToLight,,,SourceCharacter deflates DestinationCharacter inflated hood's gag till it's only slighty filled.,, -InflatedHooddeflatesToInflated,,,SourceCharacter deflates DestinationCharacter inflated hood's gag till it's half full.,, -InflatedHooddeflatesToBloated,,,SourceCharacter deflates DestinationCharacter inflated hood's gag only a tiny bit.,, -InflatedHoodpumpsToLight,,,SourceCharacter inflates DestinationCharacter inflated hood's gag only slightly.,, -InflatedHoodpumpsToInflated,,,SourceCharacter inflates DestinationCharacter inflated hood's gag till it's half full.,, -InflatedHoodpumpsToBloated,,,SourceCharacter inflates DestinationCharacter inflated hood's gag till it's three quarters filled.,, -InflatedHoodpumpsToMaximum,,,SourceCharacter inflates DestinationCharacter inflated hood's gag to the maximum amount.,, -ItemHoodOldGasMaskSelectBase,,,Select attachments.,, -ItemHoodOldGasMaskSelectLenses,,,Select blinding lenses state.,, -ItemHoodOldGasMaskSelectAddons,,,Select attachment type.,, -ItemHoodOldGasMaskModuleLenses,,,Blinding Lenses,, -ItemHoodOldGasMaskModuleAddons,,,Attachments,, -ItemHoodOldGasMaskOptionl0,,,Lenses Off,, -ItemHoodOldGasMaskOptionl1,,,Lenses On,, -ItemHoodOldGasMaskOptiona0,,,No attachment,, -ItemHoodOldGasMaskOptiona1,,,Tube A,, -ItemHoodOldGasMaskOptiona2,,,Tube B,, -ItemHoodOldGasMaskOptiona3,,,Rebreather,, -ItemHoodOldGasMaskSetl0,,,SourceCharacter removes the blinding lenses from DestinationCharacter gas mask.,, -ItemHoodOldGasMaskSetl1,,,SourceCharacter attaches blinding lenses to DestinationCharacter gas mask.,, -ItemHoodOldGasMaskSeta0,,,SourceCharacter removes the attachment from DestinationCharacter gas mask,, -ItemHoodOldGasMaskSeta1,,,SourceCharacter attaches a tube to DestinationCharacter gas mask.,, -ItemHoodOldGasMaskSeta2,,,SourceCharacter attaches a tube to DestinationCharacter gas mask.,, -ItemHoodOldGasMaskSeta3,,,SourceCharacter attaches a rebreather to DestinationCharacter gas mask.,, -ItemHoodKittyHoodSelectBase,,,Select options,, -ItemHoodKittyHoodSelectBlindfold,,,Select blindfold,, -ItemHoodKittyHoodSelectGag,,,Select gag,, -ItemHoodKittyHoodSelectExpression,,,Select expression,, -ItemHoodKittyHoodModuleBlindfold,,,Blindfold,, -ItemHoodKittyHoodModuleGag,,,Gag,, -ItemHoodKittyHoodModuleExpression,,,Expression,, -ItemHoodKittyHoodOptionb0,,,None,, -ItemHoodKittyHoodOptionb1,,,Blindfold,, -ItemHoodKittyHoodOptiong0,,,None,, -ItemHoodKittyHoodOptiong1,,,Gag,, -ItemHoodKittyHoodOptione0,,,Neutral,, -ItemHoodKittyHoodOptione1,,,OwO,, -ItemHoodKittyHoodOptione2,,,UwU,, -ItemHoodKittyHoodSetb0,,,SourceCharacter removes the blindfold from DestinationCharacter kitty hood.,, -ItemHoodKittyHoodSetb1,,,SourceCharacter attaches a blindfold in front of DestinationCharacter eyes.,, -ItemHoodKittyHoodSetg0,,,SourceCharacter removes the panel from DestinationCharacter kitty hood.,, -ItemHoodKittyHoodSetg1,,,SourceCharacter attaches a panel in front of DestinationCharacter mouth.,, -ItemHoodKittyHoodSete0,,,SourceCharacter draws a neutral face onto DestinationCharacter kitty hood.,, -ItemHoodKittyHoodSete1,,,SourceCharacter draws an OwO face onto DestinationCharacter kitty hood.,, -ItemHoodKittyHoodSete2,,,SourceCharacter draws an UwU face onto DestinationCharacter kitty hood.,, -PumpkinHead,,,Pumpkin Head,, -NoseRingPoseBase,,,Nothing,, -NoseRingPoseChainShort,,,Short Chain,, -NoseRingPoseChainLong,,,Long Chain,, -NoseRingPoseLeash,,,Leash,, -NoseRingRestrainBase,,,SourceCharacter removes the attachment from DestinationCharacter nose ring.,, -NoseRingRestrainChainShort,,,SourceCharacter attaches a short chain to DestinationCharacter nose ring.,, -NoseRingRestrainChainLong,,,SourceCharacter attaches a long chain to DestinationCharacter nose ring.,, -NoseRingRestrainLeash,,,SourceCharacter attaches a leash to DestinationCharacter nose ring.,, -Empty,,,Empty,, -Light,,,Light,, -Inflated,,,Inflated,, -Bloated,,,Bloated,, -Loose,,,Loose,, -LightSuction,,,Light,, -MediumSuction,,,Medium,, -HeavySuction,,,Heavy,, -MaximumSuction,,,Maximum,, -UseRemote,,,Use Remote,, -ChangeLayersMouth,,,Change Layers,, -ItemBreastSpankingToysWhip,,,(You clumsily whip your own breast and tummy. It would be more painful if someone else did it.),, -ItemBreastSpankingToysCrop,,,(You swing the crop on yourself a few times. You can feel your breast and tummy becoming more sensitive.),, -ItemPelvisSpankingToysWhip,,,(You need a few tries but you're able to somewhat whip your own butt and feel the pain.),, -ItemPelvisSpankingToysCrop,,,(You lash the leather crop pretty hard on your own butt. Jumping from each good hit.),, -ItemVulvaSpankingToysVibratingWand,,,(You slowly massage your pussy with the wand. Trembling from pleasure and excitement.),, -ItemVulvaDoubleEndDildoSelect,,,Select the size of the double ended dildo.,, -ItemVulvaDoubleEndDildoNormal,,,Normal Size,, -ItemVulvaDoubleEndDildoLarge,,,Large Size,, -ItemVulvaDoubleEndDildoSetNormal,,,DestinationCharacterName AssetName shrinks down to it's normal size.,, -ItemVulvaDoubleEndDildoSetLarge,,,DestinationCharacterName AssetName grows to it's large size.,, -ItemVulvaPiercingsRoundClitPiercingSelect,,,Choose piercing addons.,, -ItemVulvaPiercingsRoundClitPiercingRing,,,Ring,, -ItemVulvaPiercingsRoundClitPiercingWeight,,,Weight,, -ItemVulvaPiercingsRoundClitPiercingBell,,,Bell,, -ItemVulvaPiercingsRoundClitPiercingChain,,,Chain,, -ItemVulvaPiercingsRoundClitPiercingHaremChain,,,Harem Chains,, -ItemVulvaPiercingsRoundClitPiercingSetRing,,,SourceCharacter removes addons from DestinationCharacter clit piercing.,, -ItemVulvaPiercingsRoundClitPiercingSetWeight,,,SourceCharacter adds a small weight onto DestinationCharacter clit piercing.,, -ItemVulvaPiercingsRoundClitPiercingSetBell,,,SourceCharacter adds a small bell onto DestinationCharacter clit piercing.,, -ItemVulvaPiercingsRoundClitPiercingSetChain,,,SourceCharacter links DestinationCharacter clit piercing to her nipple rings with a chain.,, -ItemVulvaPiercingsRoundClitPiercingSetHaremChain,,,SourceCharacter links DestinationCharacter clit piercing to her nipple rings with a small veiled chain.,, -LockMittens,,,Padlock mitten buckles,, -UnlockMittens,,,Unlock mittens,, -AttachChain,,,Chain mittens,, -RemoveChain,,,Unchain mittens,, -NeedPadlock,,,You need some padlocks to do this.,, -NeedPadlockKey,,,You need a padlock key to do this.,, -padlocks,,,padlocks,, -unlocks,,,unlocks,, -mittens,,,mittens,, -chains,,,chains,, -unchains,,,removes the chains,, -mittenstoharness,,,mittens to the baby harness,, -mittensfromharness,,,mittens,, -NeedHarness,,,She must be wearing a baby harness to chain the mittens.,, -FreeArms,,,You must free her arms before attaching mitten chains.,, -FacialExpression,,,Facial expression,, -SelectSpankingToysType,,,Select a handheld item,, -SpankingToysTypeCrop,,,Crop,, -SpankingToysTypeFlogger,,,Flogger,, -SpankingToysTypeCane,,,Cane,, -SpankingToysTypeHeartCrop,,,Heart Crop,, -SpankingToysTypePaddle,,,Paddle,, -SpankingToysTypeWhipPaddle,,,Whip Paddle,, -SpankingToysTypeWhip,,,Whip,, -SpankingToysTypeCattleProd,,,Cattle Prod,, -SpankingToysTypeTennisRacket,,,Tennis Racket,, -SpankingToysTypeRainbowWand,,,Rainbow Wand,, -SpankingToysTypeGavel,,,Gavel,, -SpankingToysTypeFeather,,,Feather,, -SpankingToysTypeFeatherDuster,,,Feather Duster,, -SpankingToysTypeLongDuster,,,Long Duster,, -SpankingToysTypeIceCube,,,Ice Cube,, -SpankingToysTypeWartenbergWheel,,,Wartenberg Wheel,, -SpankingToysTypeVibratingWand,,,Vibrating Wand,, -SpankingToysTypeSmallVibratingWand,,,Small Vibe Wand,, -SpankingToysTypeCandleWax,,,Candle Wax,, -SpankingToysTypeLargeDildo,,,Large Dildo,, -SpankingToysTypePetToy,,,Pet Toy,, -SpankingToysTypeVibrator,,,Vibrator,, -SpankingToysTypeBelt,,,Belt,, -SpankingToysTypeHairbrush,,,Hairbrush,, -SpankingToysTypeSmallDildo,,,Small Dildo,, -SpankingToysTypeElectricToothbrush,,,Electric Toothbrush,, -SpankingToysTypeToothbrush,,,Toothbrush,, -SpankingToysTypeShockWand,,,Shock Wand,, -SpankingToysTypeLotion,,,Lotion,, -SpankingToysTypeRuler,,,Ruler,, -SpankingToysTypeSword,,,Foam Sword,, -SpankingToysTypeVibeRemote,,,Vibrator Remote,, -SpankingToysTypeShockRemote,,,Shock Remote,, -SpankingToysTypeTowel,,,Towel,, -SpankingToysTypeRopeCoilLong,,,Long Coiled Rope,, -SpankingToysTypeRopeCoilShort,,,Short Coiled Rope,, -SpankingToysTypeBallgag,,,Ballgag,, -SpankingToysTypeLongSock,,,Long Sock,, -SpankingToysTypeBaguette,,,Baguette,, -SpankingToysTypePanties,,,Panties,, -SpankingToysTypeTapeRoll,,,Duct Tape Roll,, -SpankingToysTypeSpatula,,,Spatula,, -SpankingToysTypeBroom,,,Broom,, -SpankingToysTypePhone1,,,Mobile Phone,, -SpankingToysTypePhone2,,,Mobile Phone 2,, -SpankingToysTypeScissors,,,Scissors,, -SpankingToysTypePlasticWrap,,,Plastic Wrap Roll,, -SpankingToysTypeGlassEmpty,,,Empty Glass,, -SpankingToysTypeGlassFilled,,,Filled Glass,, -SpankingToysTypePotionBottle,,,Potion Bottle,, -SpankingToysSetPlayer,,,SourceCharacter takes out a ItemUsed,, -SpankingToysSetOthers,,,SourceCharacter gives TargetCharacter a ItemUsed,, -SelectSuitType,,,Select suit type and wand attachment,, -CheckVulvaForWand,,,Check the vulva to use the wand,, -FullLatexSuitTypeZipped,,,Zipped Up,, -FullLatexSuitTypeUnZip,,,Unzipped,, -FullLatexSuitTypeWand,,,Wand Attachment,, -FullLatexSuitSetZipped,,,SourceCharacter zips up DestinationCharacter suit.,, -FullLatexSuitSetUnZip,,,SourceCharacter unzips DestinationCharacter suit.,, -FullLatexSuitSetWand,,,SourceCharacter attaches a wand to DestinationCharacter suit.,, -ItemArmsBitchSuitSelect,,,Configure suit's zippers,, -ItemArmsBitchSuitZipped,,,Zipped Up,, -ItemArmsBitchSuitUnzipped,,,Unzipped,, -ItemArmsBitchSuitExposed,,,Exposed,, -ItemArmsBitchSuitSetZipped,,,SourceCharacter zips up DestinationCharacter suit.,, -ItemArmsBitchSuitSetUnzipped,,,SourceCharacter unzips DestinationCharacter suit.,, -ItemArmsBitchSuitSetExposed,,,SourceCharacter unzips DestinationCharacter suit and fully exposes her breasts and pussy.,, -Off,,,Off,, -TurnOff,,,Turn Off,, -Low,,,Low,, -Medium,,,Medium,, -High,,,High,, -Maximum,,,Maximum,, -TriggerShock,,,Trigger Shock,, -MittenChain,,,SourceCharacter chains DestinationCharacter mittens to the baby harness.,, -LoveChastityBeltUnlockButt,,,Unlock Butt,, -LoveChastityBeltLockButt,,,Lock Butt,, -LoveChastityBeltUnlockClosed,,,Remove Shield,, -LoveChastityBeltUnlockVibe,,,Remove Vibe,, -LoveChastityBeltUnlockShock,,,Remove Shock,, -LoveChastityBeltAddShield,,,Add Shield,, -LoveChastityBeltAddVibe,,,Add Vibe,, -LoveChastityBeltAddShock,,,Add Shock,, -LoveChastityBeltActionUnlockButt,,,SourceCharacter unlocks DestinationCharacter love chastity belt butt.,, -LoveChastityBeltActionLockButt,,,SourceCharacter locks DestinationCharacter love chastity belt butt.,, -LoveChastityBeltVibeIncreaseTo0,,,DestinationCharacterName love chastity belt starts teasing her lightly.,, -LoveChastityBeltVibeIncreaseTo1,,,DestinationCharacterName love chastity belt builds up to a moderate pace.,, -LoveChastityBeltVibeIncreaseTo2,,,DestinationCharacterName love chastity belt starts buzzing strongly!,, -LoveChastityBeltVibeIncreaseTo3,,,DestinationCharacterName love chastity belt jumps up to maximum intensity!,, -LoveChastityBeltVibeDecreaseTo-1,,,DestinationCharacterName love chastity belt stops vibrating.,, -LoveChastityBeltVibeDecreaseTo0,,,DestinationCharacterName love chastity belt slows down into a light tease.,, -LoveChastityBeltVibeDecreaseTo1,,,DestinationCharacterName love chastity belt returns to a moderate pace.,, -LoveChastityBeltVibeDecreaseTo2,,,DestinationCharacterName love chastity belt slows down a tiny bit.,, -LoveChastityBeltShockSet0,,,SourceCharacter sets DestinationCharacter love chastity belt to low intensity.,, -LoveChastityBeltShockSet1,,,SourceCharacter sets DestinationCharacter love chastity belt to moderate intensity.,, -LoveChastityBeltShockSet2,,,SourceCharacter sets DestinationCharacter love chastity belt to high intensity.,, -LoveChastityBeltShockTrigger0,,,DestinationCharacterName love chastity belt gives her a light shock.,, -LoveChastityBeltShockTrigger1,,,DestinationCharacterName love chastity belt lets out a sharp jolt!,, -LoveChastityBeltShockTrigger2,,,DestinationCharacterName love chastity belt delivers an intense shock!,, -LoveChastityBeltRemoveShieldMessage,,,SourceCharacter removes shield from DestinationCharacter love chastity belt.,, -LoveChastityBeltAddShieldMessage,,,SourceCharacter locks shield to DestinationCharacter love chastity belt.,, -LoveChastityBeltAddVibeMessage,,,SourceCharacter locks vibe to DestinationCharacter love chastity belt.,, -LoveChastityBeltAddShockMessage,,,SourceCharacter locks shock device to DestinationCharacter love chastity belt.,, -SciFiPleasurePantiesActionUnlockButt,,,The rear chastity shield on DestinationCharacterName sci-fi pleasure panties opens.,, -SciFiPleasurePantiesActionLockButt,,,The rear chastity shield on DestinationCharacterName sci-fi pleasure panties closes.,, -SciFiPleasurePantiesVibeIncreaseTo0,,,DestinationCharacterName sci-fi pleasure panties activates tease vibe mode.,, -SciFiPleasurePantiesVibeIncreaseTo1,,,DestinationCharacterName sci-fi pleasure panties builds up to vibration level 1.,, -SciFiPleasurePantiesVibeIncreaseTo2,,,DestinationCharacterName sci-fi pleasure panties starts buzzing at vibration level 2!,, -SciFiPleasurePantiesVibeIncreaseTo3,,,DestinationCharacterName sci-fi pleasure panties jumps up to vibration level 3!,, -SciFiPleasurePantiesVibeDecreaseTo-1,,,DestinationCharacterName sci-fi pleasure panties vibration mode is deactivated.,, -SciFiPleasurePantiesVibeDecreaseTo0,,,DestinationCharacterName sci-fi pleasure panties slows down to tease vibe mode.,, -SciFiPleasurePantiesVibeDecreaseTo1,,,DestinationCharacterName sci-fi pleasure panties returns to vibration level 1.,, -SciFiPleasurePantiesVibeDecreaseTo2,,,DestinationCharacterName sci-fi pleasure panties slows down to vibration level 2.,, -SciFiPleasurePantiesShockSet0,,,DestinationCharacterName sci-fi pleasure panties are set to shock level 1.,, -SciFiPleasurePantiesShockSet1,,,DestinationCharacterName sci-fi pleasure panties are set to shock level 2.,, -SciFiPleasurePantiesShockSet2,,,DestinationCharacterName sci-fi pleasure panties are set to shock level 3.,, -SciFiPleasurePantiesShockTrigger0,,,DestinationCharacterName sci-fi pleasure panties gives her a light shock.,, -SciFiPleasurePantiesShockTrigger1,,,DestinationCharacterName sci-fi pleasure panties lets out a sharp jolt!,, -SciFiPleasurePantiesShockTrigger2,,,DestinationCharacterName sci-fi pleasure panties delivers an intense shock!,, -SciFiPleasurePantiesActionRemoveShield,,,The crotch chastity shield on DestinationCharacterName sci-fi pleasure panties opens.,, -SciFiPleasurePantiesActionAddShield,,,The crotch chastity shield on DestinationCharacterName sci-fi pleasure panties closes.,, -SciFiPleasurePantiesBeepDenialModeActivate,,,"The denial mode on DestinationCharacterName sci-fi pleasure panties activates, teasing them endlessly.",, -SciFiPleasurePantiesBeepEdgeModeActivate,,,"The edging mode on DestinationCharacterName sci-fi pleasure panties activates, preventing orgasms no matter what.",, -SciFiPleasurePantiesBeepDenialModeDeactivate,,,"The special mode on DestinationCharacterName sci-fi pleasure panties deactivates, allowing orgasms again.",, -UnlockOrgasm,,,Normal Mode,, -LockOrgasm,,,Edge Mode,, -DenyOrgasm,,,Deny Mode,, -CustomTagText,,,Save text,, -ItemNeckAccessoriesCustomCollarTagSelectBase,,,Select a module.,, -ItemNeckAccessoriesCustomCollarTagSelectTag,,,Configure the tag.,, -ItemNeckAccessoriesCustomCollarTagSelectTxt,,,Configure the text.,, -ItemNeckAccessoriesCustomCollarTagModuleTag,,,Tag,, -ItemNeckAccessoriesCustomCollarTagModuleTxt,,,Text,, -ItemNeckAccessoriesCustomCollarTagModuleFont,,,Font,, -ItemNeckAccessoriesCustomCollarTagOptiont0,,,Metal plate,, -ItemNeckAccessoriesCustomCollarTagOptiont1,,,Livestock,, -ItemNeckAccessoriesCustomCollarTagOptiont2,,,Bone,, -ItemNeckAccessoriesCustomCollarTagOptiont3,,,Oval,, -ItemNeckAccessoriesCustomCollarTagOptiont4,,,Fish,, -ItemNeckAccessoriesCustomCollarTagOptiont5,,,Carrot,, -ItemNeckAccessoriesCustomCollarTagOptionx0,,,Text,, -ItemNeckAccessoriesCustomCollarTagSetTag,,,SourceCharacter changes the custom name tag on DestinationCharacter collar.,, -ChangeCustomTag,,,SourceCharacter changes the text on DestinationCharacter collar name tag.,, -WoodenSignChange,,,SourceCharacter changes the wooden sign on TargetCharacterName.,, -DollBoxChange,,,SourceCharacter changes the text on DestinationCharacterName Doll Box.,, -SaveText,,,Save text,, -SelectCollarNameTagType,,,Select what tag you want to use,, -SelectCollarNameTagTypeLocked,,,You cannot change the tag while it's locked,, -CollarNameTagSet,,,SourceCharacter uses a NameTagType name tag on DestinationCharacter collar.,, -CollarNameTagTypeAngel,,,Angel,, -CollarNameTagTypeBadGirl,,,Bad Girl,, -CollarNameTagTypeBindMe,,,Bind Me,, -CollarNameTagTypeBitch,,,Bitch,, -CollarNameTagTypeBoobs,,,Boobs,, -CollarNameTagTypeCupcake,,,Cupcake,, -CollarNameTagTypeDevil,,,Devil,, -CollarNameTagTypeDom,,,Dom,, -CollarNameTagTypeFree,,,Free,, -CollarNameTagTypeFuckMe,,,Fuck Me,, -CollarNameTagTypeGagMe,,,GagMe,, -CollarNameTagTypeGoddess,,,Goddess,, -CollarNameTagTypeGoodGirl,,,Good Girl,, -CollarNameTagTypeHoldMe,,,Hold Me,, -CollarNameTagTypeJewel,,,Jewel,, -CollarNameTagTypeLove,,,Love,, -CollarNameTagTypeMaid,,,Maid,, -CollarNameTagTypeMeat,,,Meat,, -CollarNameTagTypeMiss,,,Miss,, -CollarNameTagTypeMummy,,,Mummy,, -CollarNameTagTypeNeedy,,,Needy,, -CollarNameTagTypeNice,,,Nice,, -CollarNameTagTypeOwned,,,Owned,, -CollarNameTagTypePrecious,,,Precious,, -CollarNameTagTypePudding,,,Pudding,, -CollarNameTagTypeQueen,,,Queen,, -CollarNameTagTypeSlave,,,Slave,, -CollarNameTagTypeSlut,,,Slut,, -CollarNameTagTypeSub,,,Sub,, -CollarNameTagTypeSweetie,,,Sweetie,, -CollarNameTagTypeTaken,,,Taken,, -CollarNameTagTypeToy,,,Toy,, -CollarNameTagTypeUseless,,,Useless,, -CollarNameTagTypeUseMe,,,Use Me,, -CollarNameTagTypeWhore,,,Whore,, -SelectCollarNameTagOvalType,,,Select what tag you want to use,, -SelectCollarNameTagOvalTypeLocked,,,You cannot change the tag while it's locked,, -CollarNameTagOvalSet,,,SourceCharacter uses a NameTagType oval name tag on DestinationCharacter collar.,, -CollarNameTagOvalTypeBabe,,,Babe,, -CollarNameTagOvalTypeBandit,,,Bandit,, -CollarNameTagOvalTypeBimbo,,,Bimbo,, -CollarNameTagOvalTypeBratty,,,Bratty,, -CollarNameTagOvalTypeChair,,,Chair,, -CollarNameTagOvalTypeChaste,,,Chaste,, -CollarNameTagOvalTypeCrazy,,,Crazy,, -CollarNameTagOvalTypeCumslut,,,Cumslut,, -CollarNameTagOvalTypeCutie,,,Cutie,, -CollarNameTagOvalTypeDamsel,,,Damsel,, -CollarNameTagOvalTypeDoll,,,Doll,, -CollarNameTagOvalTypeEdgeMe,,,EdgeMe,, -CollarNameTagOvalTypeEvil,,,Evil,, -CollarNameTagOvalTypeForSale,,,ForSale,, -CollarNameTagOvalTypeGreedy,,,Greedy,, -CollarNameTagOvalTypeHappy,,,Happy,, -CollarNameTagOvalTypeHorny,,,Horny,, -CollarNameTagOvalTypeKinky,,,Kinky,, -CollarNameTagOvalTypeLady,,,Lady,, -CollarNameTagOvalTypeLockMe,,,LockMe,, -CollarNameTagOvalTypeNude,,,Nude,, -CollarNameTagOvalTypeNurse,,,Nurse,, -CollarNameTagOvalTypeNympho,,,Nympho,, -CollarNameTagOvalTypePainslut,,,Painslut,, -CollarNameTagOvalTypePillow,,,Pillow,, -CollarNameTagOvalTypePunish,,,Punish,, -CollarNameTagOvalTypeRobber,,,Robber,, -CollarNameTagOvalTypeSad,,,Sad,, -CollarNameTagOvalTypeSwitch,,,Switch,, -CollarNameTagOvalTypeTable,,,Table,, -CollarNameTagOvalTypeTicklish,,,Ticklish,, -CollarNameTagOvalTypeUndress,,,Undress,, -CollarNameTagOvalTypeVictim,,,Victim,, -CollarNameTagOvalTypeViolent,,,Violent,, -CollarNameTagOvalTypeWorm,,,Worm,, -CollarNameTagOvalTypeAnalSlut,,,AnalSlut,, -CollarNameTagOvalTypeButtSlut,,,ButtSlut,, -SelectCollarNameTagPetType,,,Select what tag you want to use,, -SelectCollarNameTagPetTypeLocked,,,You cannot change the tag while it's locked,, -CollarNameTagPetSet,,,SourceCharacter uses a NameTagType pet name tag on DestinationCharacter collar.,, -CollarNameTagPetTypeBunny,,,Bunny,, -CollarNameTagPetTypeCat,,,Cat,, -CollarNameTagPetTypeDog,,,Dog,, -CollarNameTagPetTypeFoxy,,,Foxy,, -CollarNameTagPetTypeKitten,,,Kitten,, -CollarNameTagPetTypeKitty,,,Kitty,, -CollarNameTagPetTypeMochi,,,Mochi,, -CollarNameTagPetTypePanda,,,Panda,, -CollarNameTagPetTypePet,,,Pet,, -CollarNameTagPetTypePetMe,,,PetMe,, -CollarNameTagPetTypePixie,,,Pixie,, -CollarNameTagPetTypePony,,,Pony,, -CollarNameTagPetTypePuppy,,,Puppy,, -CollarNameTagPetTypeRacoon,,,Racoon,, -CollarNameTagPetTypeSloth,,,Sloth,, -SelectCollarNameTagLoverType,,,Select what tag you want to use,, -SelectCollarNameTagLoverTypeLocked,,,You cannot change the tag while it's locked,, -CollarNameTagLoverSet,,,SourceCharacter uses a NameTagType lover name tag on DestinationCharacter collar.,, -CollarNameTagLoverTypeCookie,,,Cookie,, -CollarNameTagLoverTypeFeather,,,Feather,, -CollarNameTagLoverTypeLover,,,Lover,, -CollarNameTagLoverTypeMuffin,,,Muffin,, -SelectCollarNameTagLivestockType,,,Select what tag you want to use,, -SelectCollarNameTagLivestockTypeLocked,,,You cannot change the tag while it's locked,, -CollarNameTagLivestockSet,,,SourceCharacter uses a NameTagType livestock name tag on DestinationCharacter collar.,, -CollarNameTagLivestockTypeAnimal,,,Animal,, -CollarNameTagLivestockTypeBreedMe,,,BreedMe,, -CollarNameTagLivestockTypeCow,,,Cow,, -CollarNameTagLivestockTypeMeat,,,Meat,, -CollarNameTagLivestockTypeMilkMe,,,MilkMe,, -CollarNameTagLivestockTypePig,,,Pig,, -RoundPiercingPoseBase,,,Base,, -RoundPiercingPoseChain,,,Collar chained,, -RoundPiercingPoseWeighted,,,Added weights,, -RoundPiercingPoseWeightedChain,,,Weight and Chain,, -RoundPiercingRestrainBase,,,SourceCharacter detaches extras from DestinationCharacter round piercings.,, -RoundPiercingRestrainChain,,,SourceCharacter attaches a chain from DestinationCharacter round piercings to her collar.,, -RoundPiercingRestrainWeighted,,,SourceCharacter adds weights to DestinationCharacter round piercings.,, -RoundPiercingRestrainWeightedChain,,,SourceCharacter adds weights and attaches a chain from DestinationCharacter round piercings to her collar.,, -RoundPiercingActionAdds,,,adds,, -RoundPiercingActionRemoves,,,detaches,, -DuctTapePoseLegs,,,Legs,, -DuctTapePoseHalfLegs,,,Half,, -DuctTapePoseMostLegs,,,Most,, -DuctTapePoseCompleteLegs,,,Complete,, -DuctTapePoseCutOut,,,Cut out,, -DuctTapePosePetLegs,,,Pet,, -DuctTapeRestrainLegs,,,SourceCharacter wraps duct tape around DestinationCharacter legs.,, -DuctTapeRestrainHalfLegs,,,SourceCharacter wraps more duct tape on DestinationCharacter legs trapping them firmly.,, -DuctTapeRestrainMostLegs,,,SourceCharacter wraps even more duct tape on DestinationCharacter legs trapping them tightly.,, -DuctTapeRestrainCompleteLegs,,,SourceCharacter wraps an extreme amount of duct tape on DestinationCharacter legs fully trapping them.,, -DuctTapeRestrainPetLegs,,,SourceCharacter wraps duct tape on DestinationCharacter legs frog tying them.,, -DuctTapeRestrainCutOut,,,SourceCharacter wraps an extreme amount of duct tape on DestinationCharacter legs while leaving a small hole in it.,, -DuctTapePoseFeet,,,Feet,, -DuctTapePoseHalfFeet,,,Half,, -DuctTapePoseMostFeet,,,Most,, -DuctTapePoseCompleteFeet,,,Complete,, -DuctTapeRestrainFeet,,,SourceCharacter wraps duct tape around DestinationCharacter feet.,, -DuctTapeRestrainHalfFeet,,,SourceCharacter wraps more duct tape on DestinationCharacter feet trapping them firmly.,, -DuctTapeRestrainMostFeet,,,SourceCharacter wraps even more duct tape on DestinationCharacter feet trapping them tightly.,, -DuctTapeRestrainCompleteFeet,,,SourceCharacter wraps an extreme amount of duct tape on DestinationCharacter feet fully trapping them.,, -SlaveCollarSelectType,,,Select the slave collar model,, -SlaveCollarChangeType,,,SourceCharacter changes DestinationCharacter collar model.,, -ItemDevicesLittleMonsterSelect,,,Select the type of monster,, -ItemDevicesLittleMonsterBlack,,,Black,, -ItemDevicesLittleMonsterRed,,,Red,, -ItemDevicesLittleMonsterGreen,,,Green,, -ItemDevicesLittleMonsterBlue,,,Blue,, -ItemDevicesLittleMonsterSetBlack,,,SourceCharacter gives TargetCharacter a Scary Black Monster teddy.,, -ItemDevicesLittleMonsterSetRed,,,SourceCharacter gives TargetCharacter a Scary Red Monster teddy.,, -ItemDevicesLittleMonsterSetGreen,,,SourceCharacter gives TargetCharacter a Scary Green Monster teddy.,, -ItemDevicesLittleMonsterSetBlue,,,SourceCharacter gives TargetCharacter a Scary Blue Monster teddy.,, -ItemDevicesFamiliarSelect,,,Select the type of familiar,, -ItemDevicesFamiliarCat,,,Cat,, -ItemDevicesFamiliarBat,,,Bat,, -ItemDevicesFamiliarSkeleton,,,Skeleton,, -ItemDevicesFamiliarParrot,,,Parrot,, -ItemDevicesFamiliarSetCat,,,SourceCharacter summons Cat Familiar on TargetCharacter.,, -ItemDevicesFamiliarSetBat,,,SourceCharacter summons Bat Familiar on TargetCharacter.,, -ItemDevicesFamiliarSetSkeleton,,,SourceCharacter summons Undead Familiar on TargetCharacter.,, -ItemDevicesFamiliarSetParrot,,,SourceCharacter summons Pirate Familiar on TargetCharacter.,, -SelectCoffinType,,,Select coffin closed or open,, -CoffinTypeOpen,,,Open,, -CoffinTypeClosed,,,Closed,, -CoffinSetOpen,,,SourceCharacter opens the lid on DestinationCharacter coffin.,, -CoffinSetClosed,,,SourceCharacter closes the lid on DestinationCharacter coffin.,, -SelectCryoCapsuleType,,,Select cryogenic capsule state.,, -CryoCapsuleTypeOpen,,,Open,, -CryoCapsuleTypeClosed,,,Closed,, -CryoCapsuleSetOpen,,,SourceCharacter opens the lid on DestinationCharacter cryogenic capsule.,, -CryoCapsuleSetClosed,,,SourceCharacter closes the lid on DestinationCharacter cryogenic capsule.,, -HeadphoneEarPlugsSelectLoudness,,,Turn the headphones on/off and adjust their volume.,, -HeadphoneEarPlugsPoseOff,,,Off,, -HeadphoneEarPlugsPoseLight,,,Light,, -HeadphoneEarPlugsPoseHeavy,,,Heavy,, -HeadphoneEarPlugsPoseNoiseCancelling,,,Noise-Cancelling,, -HeadphoneEarPlugsRestrainOff,,,SourceCharacter turns off DestinationCharacter AssetName.,, -HeadphoneEarPlugsRestrainLight,,,SourceCharacter turns the volume to low on DestinationCharacter AssetName.,, -HeadphoneEarPlugsRestrainHeavy,,,SourceCharacter turns the volume up to high on DestinationCharacter AssetName.,, -HeadphoneEarPlugsRestrainNoiseCancelling,,,SourceCharacter sets DestinationCharacter AssetName to noise-cancelling mode.,, -SelectChainBondage,,,Select the chain bondage,, -ChainBondageBasic,,,Basic Tie,, -ChainBondageStrict,,,Strict Tie,, -ChainBondageBoxTie,,,Box Tie,, -ChainBondageHogtied,,,Hogtie,, -ChainBondageSuspension,,,Suspension Tie,, -ChainBondageSuspensionHogtied,,,Suspended Hogtie,, -ChainBondageWristElbowTie,,,Wrist and Elbow Tie,, -ChainBondageWristElbowHarnessTie,,,Wrist & Elbow Harness Tie,, -ChainBondageWristTie,,,Wrist Tie,, -ChainBondageChainCuffs,,,Chain Cuffs,, -ChainBondageAllFours,,,All Fours,, -ChainBondageKneelingHogtie,,,Kneeling Hogtie,, -LegChainSetBasic,,,SourceCharacter uses the chain on TargetCharacter to do a basic tie.,, -LegChainSetStrict,,,SourceCharacter uses the chain on TargetCharacter to do a strict tie.,, -LegChainSetSuspension,,,SourceCharacter uses the chain on TargetCharacter to do a suspension tie.,, -KennelTypeOpenNoPadding,,,Open without padding,, -KennelTypeOpenPadding,,,Open with padding,, -KennelTypeClosedNoPadding,,,Closed without padding,, -KennelTypeClosedPadding,,,Closed with padding,, -SelectKennelType,,,Select door and padding state,, -KennelSetPADC,,,SourceCharacter adds padding to DestinationCharacter kennel when closing it.,, -KennelSetPA,,,SourceCharacter adds padding to DestinationCharacter kennel.,, -KennelSetDC,,,SourceCharacter closes DestinationCharacter kennel.,, -KennelSetPRDO,,,SourceCharacter removes the padding from DestinationCharacter kennel when opening it.,, -KennelSetPADO,,,SourceCharacter adds padding to DestinationCharacter kennel when opening it.,, -KennelSetPRDC,,,SourceCharacter removes the padding from DestinationCharacter kennel when closing it.,, -KennelSetPR,,,SourceCharacter removes the padding from DestinationCharacter kennel.,, -KennelSetDO,,,SourceCharacter opens the door of DestinationCharacter kennel.,, -ArmsChainSetBoxTie,,,SourceCharacter uses chains on TargetCharacter to do a box tie.,, -ArmsChainSetHogtied,,,SourceCharacter uses chains to hogtie TargetCharacter.,, -ArmsChainSetWristElbowTie,,,SourceCharacter uses chains to tie DestinationCharacter wrists and elbows together behind her back.,, -ArmsChainSetWristTie,,,SourceCharacter uses chains to tie DestinationCharacter wrists together behind her back.,, -ArmsChainSetChainCuffs,,,SourceCharacter uses chains to tie chain cuffs on DestinationCharacter wrists.,, -ArmsChainSetAllFours,,,SourceCharacter uses chains on TargetCharacter to have her crawling on all fours.,, -ArmsChainSetWristElbowHarnessTie,,,SourceCharacter uses chains to tie DestinationCharacter wrists and elbows in a harness behind her back.,, -ArmsChainSetKneelingHogtie,,,SourceCharacter uses chains to hogtie TargetCharacter on her knees.,, -ItemArmsMermaidSuitSelect,,,Select suit type,, -ItemArmsMermaidSuitZipped,,,Zipped Up,, -ItemArmsMermaidSuitUnZip,,,Unzipped,, -ItemArmsMermaidSuitSetZipped,,,SourceCharacter zips up DestinationCharacter suit.,, -ItemArmsMermaidSuitSetUnZip,,,SourceCharacter unzips DestinationCharacter suit.,, -SelectBackShield,,,Selected chastity belt backing,, -ChastityOpenBack,,,Open Back,, -ChastityClosedBack,,,Closed Back,, -ChastityBeltBackShieldOpenBack,,,SourceCharacter removes the shield from the back of DestinationCharacter belt.,, -ChastityBeltBackShieldClosedBack,,,SourceCharacter adds the shield to the back of DestinationCharacter belt.,, -ClitRingPoseBase,,,Nothing,, -ClitRingPoseLeash,,,Leash,, -ClitRingRestrainBase,,,SourceCharacter removes the attachment from DestinationCharacter clitoris ring.,, -ClitRingRestrainLeash,,,SourceCharacter attaches a leash to DestinationCharacter clitoris ring.,, -WebBondageSelect,,,Select web type,, -WebBondageTangled,,,Tangled,, -WebBondageWrapped,,,Wrapped,, -WebBondageCocooned,,,Cocooned,, -WebBondageHogtied,,,Hogtied,, -WebBondageSuspended,,,Suspended,, -WebBondageKneelingSuspended,,,Suspension Cocooned,, -WebBondageSuspensionHogtied,,,Suspension Hogtied,, -ArmsWebSetTangled,,,SourceCharacter Action the webbing on TargetCharacter,, -ArmsWebSetWrapped,,,"SourceCharacter Action the webbing on TargetCharacter, leaving them fully wrapped",, -ArmsWebSetCocooned,,,"SourceCharacter Action the webbing on TargetCharacter, forming a cocoon",, -ArmsWebSetHogtied,,,"SourceCharacter wraps TargetCharacter in webbing, forming a hogtie",, -ArmsWebSetSuspended,,,SourceCharacter fully wraps TargetCharacter in webbing and uses it to suspend her,, -ArmsWebSetKneelingSuspended,,,SourceCharacter cocoons TargetCharacter in webbing and hangs her from the ceiling,, -ArmsWebSetSuspensionHogtied,,,SourceCharacter hogties TargetCharacter with the webbing and uses it to suspend her,, -tightens,,,tightens,, -loosens,,,loosens,, -ItemHeadWebBlindfoldBlindfold,,,Blindfold,, -ItemHeadWebBlindfoldCocoon,,,Cocoon,, -ItemHeadWebBlindfoldSetBlindfold,,,SourceCharacter creates a blindfold out of web for TargetCharacter,, -ItemHeadWebBlindfoldSetCocoon,,,SourceCharacter creates a cocoon out of web for TargetCharacter,, -ItemDevicesCribSelectBase,,,Make the cutie comfortable.,, -ItemDevicesCribSelectGate,,,Open/close the gate.,, -ItemDevicesCribSelectPlushies,,,Give/take toys to/from the cutie.,, -ItemDevicesCribModuleGate,,,Gate,, -ItemDevicesCribModulePlushies,,,Plushies,, -ItemDevicesCribOptiong0,,,Open,, -ItemDevicesCribOptiong1,,,Closed,, -ItemDevicesCribOptionp0,,,No Plushies,, -ItemDevicesCribOptionp1,,,Plushies,, -ItemDevicesCribSetg0,,,SourceCharacter opens the gate of DestinationCharacter crib,, -ItemDevicesCribSetg1,,,SourceCharacter closed the gate of DestinationCharacter crib,, -ItemDevicesCribSetp0,,,SourceCharacter removes the plushies from DestinationCharacter crib,, -ItemDevicesCribSetp1,,,SourceCharacter puts a bucket full of plushies in DestinationCharacter crib,, -SelectMilkBottleState,,,Raise or lower the bottle,, -MilkBottleRest,,,Resting,, -MilkBottleRaised,,,Held up,, -MilkBottleChug,,,Held up high,, -MilkBottleSetRest,,,SourceCharacter rests DestinationCharacter bottle on her chest.,, -MilkBottleSetRaised,,,SourceCharacter holds DestinationCharacter bottle up.,, -MilkBottleSetChug,,,SourceCharacter holds DestinationCharacter bottle high above her head.,, -SelectHeavyLatexCorsetType,,,Select a corset style.,, -HeavyLatexCorsetTypeNormal,,,Normal,, -HeavyLatexCorsetTypeStraps,,,Garter Straps,, -HeavyLatexCorsetSetNormal,,,SourceCharacter unhooks the garter straps from DestinationCharacter heavy latex corset.,, -HeavyLatexCorsetSetStraps,,,SourceCharacter adds garter straps to DestinationCharacter heavy latex corset.,, -FunnelGagMouthTypeFunnel,,,Funnel,, -FunnelGagMouthTypeNone,,,None,, -FunnelGagMouthSetFunnel,,,SourceCharacter connects a funnel to DestinationCharacter gag.,, -FunnelGagMouthSetNone,,,SourceCharacter removes the funnel from DestinationCharacter gag.,, -Escalate,,,Escalate,, -Tease,,,Tease,, -Deny,,,Deny,, -Edge,,,Edge,, -BunnyTailVibePlugDecreaseTo-1,,,DestinationCharacterName vibrating bunny vibe stops vibrating.,, -BunnyTailVibePlugDecreaseTo0,,,DestinationCharacterName vibrating bunny vibe slows down into a light tease.,, -BunnyTailVibePlugDecreaseTo1,,,DestinationCharacterName vibrating bunny vibe returns to a moderate pace.,, -BunnyTailVibePlugDecreaseTo2,,,DestinationCharacterName vibrating bunny vibe slows down a tiny bit.,, -BunnyTailVibePlugIncreaseTo0,,,DestinationCharacterName vibrating bunny vibe starts teasing her lightly.,, -BunnyTailVibePlugIncreaseTo1,,,DestinationCharacterName vibrating bunny vibe builds up to a moderate pace.,, -BunnyTailVibePlugIncreaseTo2,,,DestinationCharacterName vibrating bunny vibe starts buzzing strongly!,, -BunnyTailVibePlugIncreaseTo3,,,DestinationCharacterName vibrating bunny vibe jumps up to maximum intensity!,, -EggVibePlugXXLDecreaseTo-1,,,DestinationCharacterName vibrating XXL egg stops vibrating.,, -EggVibePlugXXLDecreaseTo0,,,DestinationCharacterName vibrating XXL egg slows down into a gentle tease.,, -EggVibePlugXXLDecreaseTo1,,,DestinationCharacterName vibrating XXL egg slows down into a modest pace.,, -EggVibePlugXXLDecreaseTo2,,,DestinationCharacterName vibrating XXL egg slows down slightly.,, -EggVibePlugXXLIncreaseTo0,,,DestinationCharacterName vibrating XXL egg starts to tease her pleasantly.,, -EggVibePlugXXLIncreaseTo1,,,DestinationCharacterName vibrating XXL egg builds up to a mild pace.,, -EggVibePlugXXLIncreaseTo2,,,DestinationCharacterName vibrating XXL egg starts buzzing strongly!,, -EggVibePlugXXLIncreaseTo3,,,DestinationCharacterName vibrating XXL egg starts buzzing relentlessly!,, -LactationPumpPowerloosensToOff,,,SourceCharacter turns DestinationCharacter lactation pump off.,, -LactationPumpPowerloosensToLowSuction,,,SourceCharacter turns DestinationCharacter lactation pump down to low suction.,, -LactationPumpPowerloosensToMediumSuction,,,SourceCharacter turns DestinationCharacter lactation pump down to normal suction.,, -LactationPumpPowerloosensToHighSuction,,,SourceCharacter turns DestinationCharacter lactation pump down to high suction.,, -LactationPumpPowertightensToLowSuction,,,SourceCharacter turns DestinationCharacter lactation pump to low suction.,, -LactationPumpPowertightensToMediumSuction,,,SourceCharacter turns DestinationCharacter lactation pump to normal suction.,, -LactationPumpPowertightensToHighSuction,,,SourceCharacter turns DestinationCharacter lactation pump to high suction.,, -LactationPumpPowertightensToMaximumSuction,,,SourceCharacter turns DestinationCharacter lactation pump to maximum suction.,, -LactationPumpSelectSetting,,,Select lactation pump setting,, -LactationPumpOff,,,Off,, -LactationPumpLowSuction,,,Low,, -LactationPumpMediumSuction,,,Medium,, -LactationPumpHighSuction,,,High,, -LactationPumpMaximumSuction,,,Maximum,, -ItemArmsLatexLeotardSelect,,,Select latex finish,, -ItemArmsLatexLeotardUnpolished,,,Matte,, -ItemArmsLatexLeotardPolished,,,Shiny,, -ItemArmsLatexLeotardSetUnpolished,,,SourceCharacter removes the polish from DestinationCharacter latex leotard,, -ItemArmsLatexLeotardSetPolished,,,SourceCharacter polishes the latex of DestinationCharacter leotard until it's shiny,, -ItemArmsPrisonLockdownSuitSelectBase,,,Select suit options,, -ItemArmsPrisonLockdownSuitSelectStraps,,,Configure suit restraints,, -ItemArmsPrisonLockdownSuitStraps,,,Restraints,, -ItemArmsPrisonLockdownSuitShock,,,Shock Collar,, -ItemArmsPrisonLockdownSuitFree,,,Free,, -ItemArmsPrisonLockdownSuitAnkles,,,Ankles locked,, -ItemArmsPrisonLockdownSuitThighs,,,Thighs locked,, -ItemArmsPrisonLockdownSuitFull,,,Locked down,, -ItemArmsPrisonLockdownSuitSetFull,,,SourceCharacter buckles all of the belts on DestinationCharacter suit,, -ItemArmsPrisonLockdownSuitSetFree,,,SourceCharacter unbuckles all of the belts on DestinationCharacter suit,, -ItemArmsPrisonLockdownSuitSetFreeToAnkles,,,SourceCharacter buckles the belts on DestinationCharacter ankles,, -ItemArmsPrisonLockdownSuitSetFreeToThighs,,,SourceCharacter buckles the belts on DestinationCharacter thighs,, -ItemArmsPrisonLockdownSuitSetFullToAnkles,,,SourceCharacter unbuckles the belts on DestinationCharacter thighs,, -ItemArmsPrisonLockdownSuitSetFullToThighs,,,SourceCharacter unbuckles the belts on DestinationCharacter ankles,, -ItemArmsPrisonLockdownSuitSetAnkles,,,SourceCharacter releases the belts on DestinationCharacter thighs and buckles the belts on her ankles,, -ItemArmsPrisonLockdownSuitSetThighs,,,SourceCharacter releases the belts on DestinationCharacter ankles and buckles the belts on her thighs,, -ItemArmsHighSecurityStraitJacketSelectBase,,,Configure straitjacket,, -ItemArmsHighSecurityStraitJacketSelectCrotch,,,Configure crotch panel,, -ItemArmsHighSecurityStraitJacketSelectArms,,,Configure sleeves,, -ItemArmsHighSecurityStraitJacketSelectStraps,,,Configure crotch straps,, -ItemArmsHighSecurityStraitJacketModuleCrotch,,,Crotch Panel,, -ItemArmsHighSecurityStraitJacketModuleArms,,,Sleeves,, -ItemArmsHighSecurityStraitJacketModuleStraps,,,Crotch Straps,, -ItemArmsHighSecurityStraitJacketOptionc0,,,No crotch panel,, -ItemArmsHighSecurityStraitJacketOptionc1,,,Crotch panel,, -ItemArmsHighSecurityStraitJacketOptiona0,,,Loose,, -ItemArmsHighSecurityStraitJacketOptiona1,,,Arms in front,, -ItemArmsHighSecurityStraitJacketOptiona2,,,Arms behind,, -ItemArmsHighSecurityStraitJacketOptions0,,,No crotch straps,, -ItemArmsHighSecurityStraitJacketOptions1,,,Single crotch strap,, -ItemArmsHighSecurityStraitJacketOptions2,,,Double crotch strap,, -ItemArmsHighSecurityStraitJacketOptions3,,,Triple crotch strap,, -ItemArmsHighSecurityStraitJacketSetc0,,,SourceCharacter removes the crotch panel from DestinationCharacter straitjacket,, -ItemArmsHighSecurityStraitJacketSetc1,,,SourceCharacter adds a crotch panel to DestinationCharacter straitjacket,, -ItemArmsHighSecurityStraitJacketSeta0,,,SourceCharacter unbuckles the sleeves of DestinationCharacter straitjacket,, -ItemArmsHighSecurityStraitJacketSeta1,,,SourceCharacter secures the arms of DestinationCharacter straitjacket in front of her,, -ItemArmsHighSecurityStraitJacketSeta2,,,SourceCharacter secures the arms of DestinationCharacter straitjacket behind her,, -ItemArmsHighSecurityStraitJacketSets0,,,SourceCharacter removes the crotch straps from DestinationCharacter straitjacket,, -ItemArmsHighSecurityStraitJacketSets1,,,SourceCharacter secures DestinationCharacter straitjacket with a single crotch strap,, -ItemArmsHighSecurityStraitJacketSets2,,,SourceCharacter secures DestinationCharacter straitjacket with a double crotch strap,, -ItemArmsHighSecurityStraitJacketSets3,,,SourceCharacter secures DestinationCharacter straitjacket with a triple crotch strap,, -ItemArmsStraitLeotardSelectBase,,,Adjust what is visible and what is hidden.,, -ItemArmsStraitLeotardSelectCloth,,,Hide/Unhide clothes.,, -ItemArmsStraitLeotardSelectCorset,,,Hide/Unhide corsets.,, -ItemArmsStraitLeotardSelectNipplesPiercings,,,Hide/Unhide nipple piercings normally hidden due to layer.,, -ItemArmsStraitLeotardSelectVulvaPiercings,,,Hide/Unhide vulva piercings normally hidden due to layer.,, -ItemArmsStraitLeotardModuleCloth,,,Cloth,, -ItemArmsStraitLeotardModuleCorset,,,Torso,, -ItemArmsStraitLeotardModuleNipplesPiercings,,,Breasts,, -ItemArmsStraitLeotardModuleVulvaPiercings,,,Pelvis and Vulva,, -ItemArmsStraitLeotardOptioncl0,,,Hidden,, -ItemArmsStraitLeotardOptioncl1,,,Visible,, -ItemArmsStraitLeotardOptionco0,,,Hidden,, -ItemArmsStraitLeotardOptionco1,,,Visible,, -ItemArmsStraitLeotardOptionnp0,,,Hidden,, -ItemArmsStraitLeotardOptionnp1,,,Visible,, -ItemArmsStraitLeotardOptionvp0,,,Hidden,, -ItemArmsStraitLeotardOptionvp1,,,Visible,, -ItemArmsStraitLeotardSetcl0,,,DestinationCharacterName clothes are now hidden when wearing their AssetName.,, -ItemArmsStraitLeotardSetcl1,,,DestinationCharacterName clothes are now visible when wearing their AssetName.,, -ItemArmsStraitLeotardSetco0,,,DestinationCharacterName torso items are now hidden when wearing their AssetName.,, -ItemArmsStraitLeotardSetco1,,,DestinationCharacterName torso items are now visible when wearing their AssetName.,, -ItemArmsStraitLeotardSetnp0,,,DestinationCharacterName breast items are now hidden when wearing their AssetName.,, -ItemArmsStraitLeotardSetnp1,,,DestinationCharacterName breast items are now visible when wearing their AssetName.,, -ItemArmsStraitLeotardSetvp0,,,DestinationCharacterName pelvis and vulva items are now hidden when wearing their AssetName.,, -ItemArmsStraitLeotardSetvp1,,,DestinationCharacterName pelvis and vulva items are now visible when wearing their AssetName.,, -ItemArmsFuturisticStraitjacketSelectBase,,,Adjust what is visible and what is hidden.,, -ItemArmsFuturisticStraitjacketSelectCloth,,,Hide/Unhide clothes.,, -ItemArmsFuturisticStraitjacketSelectCorset,,,Hide/Unhide corsets.,, -ItemArmsFuturisticStraitjacketSelectNipplesPiercings,,,Hide/Unhide nipple piercings normally hidden due to layer.,, -ItemArmsFuturisticStraitjacketSelectVulvaPiercings,,,Hide/Unhide vulva piercings normally hidden due to layer.,, -ItemArmsFuturisticStraitjacketSelectArms,,,Choose where the arms are restrained.,, -ItemArmsFuturisticStraitjacketModuleCloth,,,Cloth,, -ItemArmsFuturisticStraitjacketModuleCorset,,,Torso,, -ItemArmsFuturisticStraitjacketModuleNipplesPiercings,,,Breasts,, -ItemArmsFuturisticStraitjacketModuleVulvaPiercings,,,Pelvis and Vulva,, -ItemArmsFuturisticStraitjacketModuleArms,,,Arms,, -ItemArmsFuturisticStraitjacketOptioncl0,,,Hidden,, -ItemArmsFuturisticStraitjacketOptioncl1,,,Visible,, -ItemArmsFuturisticStraitjacketOptionco0,,,Hidden,, -ItemArmsFuturisticStraitjacketOptionco1,,,Visible,, -ItemArmsFuturisticStraitjacketOptionnp0,,,Hidden,, -ItemArmsFuturisticStraitjacketOptionnp1,,,Visible,, -ItemArmsFuturisticStraitjacketOptionvp0,,,Hidden,, -ItemArmsFuturisticStraitjacketOptionvp1,,,Visible,, -ItemArmsFuturisticStraitjacketOptiona0,,,Arms front,, -ItemArmsFuturisticStraitjacketOptiona1,,,Arms behind,, -ItemArmsFuturisticStraitjacketSetcl0,,,DestinationCharacter clothes are now hidden when wearing their leotard.,, -ItemArmsFuturisticStraitjacketSetcl1,,,DestinationCharacter clothes are now visible when wearing their leotard.,, -ItemArmsFuturisticStraitjacketSetco0,,,DestinationCharacter torso items is now hidden when wearing their leotard.,, -ItemArmsFuturisticStraitjacketSetco1,,,DestinationCharacter torso items is now visible when wearing their leotard.,, -ItemArmsFuturisticStraitjacketSetnp0,,,DestinationCharacter breast items are now hidden when wearing their leotard.,, -ItemArmsFuturisticStraitjacketSetnp1,,,DestinationCharacter breast items are now visible when wearing their leotard.,, -ItemArmsFuturisticStraitjacketSetvp0,,,DestinationCharacter pelvis and vulva items are now hidden when wearing their leotard.,, -ItemArmsFuturisticStraitjacketSetvp1,,,DestinationCharacter pelvis and vulva items are now visible when wearing their leotard.,, -ItemArmsFuturisticStraitjacketSeta0,,,DestinationCharacter arms are now in front of them.,, -ItemArmsFuturisticStraitjacketSeta1,,,DestinationCharacter arms are now behind of them.,, -ItemHoodKirugumiMaskSelectBase,,,Configure mask,, -ItemHoodKirugumiMaskSelectEyes,,,Configure eyes,, -ItemHoodKirugumiMaskSelectMouth,,,Configure mouth,, -ItemHoodKirugumiMaskSelectBlush,,,Configure blush,, -ItemHoodKirugumiMaskSelectBrows,,,Configure eyebrows,, -ItemHoodKirugumiMaskSelectOpacity,,,Configure opacity,, -ItemHoodKirugumiMaskSelectMaskStyle,,,Configure mask between a solid kirugumi & hollywood silicone mask,, -ItemHoodKirugumiMaskModuleEyes,,,Eyes,, -ItemHoodKirugumiMaskModuleMouth,,,Mouth,, -ItemHoodKirugumiMaskModuleBlush,,,Blush,, -ItemHoodKirugumiMaskModuleBrows,,,Eyebrows,, -ItemHoodKirugumiMaskModuleOpacity,,,Opacity,, -ItemHoodKirugumiMaskModuleMaskStyle,,,Mask Style,, -ItemHoodKirugumiMaskOptione0,,,Normal,, -ItemHoodKirugumiMaskOptione1,,,Wink,, -ItemHoodKirugumiMaskOptione2,,,Lewd,, -ItemHoodKirugumiMaskOptione3,,,Angry,, -ItemHoodKirugumiMaskOptionm0,,,Neutral,, -ItemHoodKirugumiMaskOptionm1,,,Open,, -ItemHoodKirugumiMaskOptionm2,,,Sad,, -ItemHoodKirugumiMaskOptionm3,,,Happy,, -ItemHoodKirugumiMaskOptionb0,,,Low,, -ItemHoodKirugumiMaskOptionb1,,,Medium,, -ItemHoodKirugumiMaskOptionb2,,,High,, -ItemHoodKirugumiMaskOptionb3,,,Max,, -ItemHoodKirugumiMaskOptionbr0,,,Normal,, -ItemHoodKirugumiMaskOptionbr1,,,Angry,, -ItemHoodKirugumiMaskOptionbr2,,,Sad,, -ItemHoodKirugumiMaskOptionbr3,,,Alternating,, -ItemHoodKirugumiMaskOptionop0,,,Lenses,, -ItemHoodKirugumiMaskOptionop1,,,Eyeholes,, -ItemHoodKirugumiMaskOptionop2,,,Solid,, -ItemHoodKirugumiMaskOptionms0,,,Solid,, -ItemHoodKirugumiMaskOptionms1,,,Latex,, -ItemHoodKirugumiMaskSetEyes,,,SourceCharacter changes the eyes on DestinationCharacter mask,, -ItemHoodKirugumiMaskSetMouth,,,SourceCharacter changes the mouth on DestinationCharacter mask,, -ItemHoodKirugumiMaskSetBlush,,,SourceCharacter changes the blush on DestinationCharacter mask,, -ItemHoodKirugumiMaskSetBrows,,,SourceCharacter changes the eyebrows on DestinationCharacter mask,, -ItemHoodKirugumiMaskSetOpacity,,,SourceCharacter changes the opacity on DestinationCharacter mask,, -ItemHoodKirugumiMaskSetMaskStyle,,,SourceCharacter changes the type of mask on TargetCharacter,, -SelectPriorityType,,,Select the visibility,, -ClothPriorityTypeNormal,,,Revealed,, -ClothPriorityTypeTucked,,,Tucked in,, -SelectSuitGloves,,,Select the visibility,, -SuitGloveTypeNoGloves,,,Detached Gloves,, -SuitGloveTypeSolid,,,Attached Opaque Gloves,, -SuitGloveTypeSeethrough,,,Attached See-through Gloves,, -VibeDecreaseTo-1,,,DestinationCharacterName AssetName stops vibrating.,, -VibeDecreaseTo0,,,DestinationCharacterName AssetName slows down into a light tease.,, -VibeDecreaseTo1,,,DestinationCharacterName AssetName returns to a moderate pace.,, -VibeDecreaseTo2,,,DestinationCharacterName AssetName slows down a tiny bit.,, -VibeIncreaseTo0,,,DestinationCharacterName AssetName starts teasing her lightly.,, -VibeIncreaseTo1,,,DestinationCharacterName AssetName builds up to a moderate pace.,, -VibeIncreaseTo2,,,DestinationCharacterName AssetName starts buzzing strongly!,, -VibeIncreaseTo3,,,DestinationCharacterName AssetName jumps up to maximum intensity!,, -VibeModeChange,,,SourceCharacter changes the settings on DestinationCharacterName AssetName,, -PlayerOwnerCollarRelease,,,DestinationCharacterName owner releases her from the slave collar.,, -PlayerOwnerCollarWear,,,TargetCharacterName is given her slave collar again.,, -RulesMenu,,,Active Rules,, -RulesMenuEmpty,,,No active rules,, -RulesMenuBlockOwnerLockSelf,,,No owner locks on yourself,, -RulesMenuBlockChange,,,Cannot change:,, -RulesMenuBlockWhisper,,,No whispers around your owner,, -RulesMenuBlockKey,,,Blocked: Normal keys,, -RulesMenuBlockRemote,,,Blocked: Remotes on anyone,, -RulesMenuBlockRemoteSelf,,,Blocked: Remotes on yourself,, -RulesMenuReleasedCollar,,,Slave collar unlocked,, -RulesMenuBlockNickname,,,Cannot change your nickname,, -RulesMenuBlockLoverLockSelf,,,No lover locks on yourself,, -RulesMenuBlockLoverLockOwner,,,Your owner cannot use lover locks on you,, -CanvasHoodLabel,,,Edit Text:,, -CanvasHoodChange,,,"SourceCharacter modifies DestinationCharacterName canvas hood to read ""NewText""",, -WoodenBoxTextLabel,,,Edit Text,, -WoodenBoxOpacityLabel,,,Change Opacity,, -WoodenBoxTextRemove,,,SourceCharacter removes the text from DestinationCharacterName AssetName,, -WoodenBoxTextChange,,,"SourceCharacter changes the text on DestinationCharacterName AssetName to read ""NewText""",, -WoodenBoxTypeLabel,,,Select Text Orientation,, -PetBowlLabel,,,Edit Text:,, -PetBowlChange,,,"SourceCharacter modifies DestinationCharacter bowl to read ""NewText""",, -InventoryHairAccessory1HaloType,,,Select Halo Type,, -InventoryHairAccessory1HaloTypeDefault,,,Full,, -InventoryHairAccessory1HaloTypeBroken,,,Broken,, -InventoryHairAccessory1HaloBrightness,,,Brightness,, -SelectFeature,,,Select Features,, -ItemArmsTransportJacketSelect,,,Configure Jacket,, -ItemArmsTransportJacketNoShorts,,,No Shorts,, -ItemArmsTransportJacketShorts,,,Shorts,, -ItemArmsTransportJacketShortsAndStraps,,,Shorts & Straps,, -ItemArmsTransportJacketTextLabel,,,Change jacket text:,, -ItemArmsTransportJacketTextRemove,,,SourceCharacter removes the text from DestinationCharacterName AssetName,, -ItemArmsTransportJacketTextChange,,,"SourceCharacter changes the text on DestinationCharacterName AssetName to read ""NewText""",, -ItemArmsTransportJacketSetShortsNoShorts,,,SourceCharacter removes the shorts from DestinationCharacter AssetName,, -ItemArmsTransportJacketSetShortsAndStrapsNoShorts,,,SourceCharacter removes the shorts from DestinationCharacter AssetName,, -ItemArmsTransportJacketSetNoShortsShorts,,,SourceCharacter attaches shorts to DestinationCharacter AssetName,, -ItemArmsTransportJacketSetShortsAndStrapsShorts,,,SourceCharacter removes the reinforcing straps from DestinationCharacter AssetName,, -ItemArmsTransportJacketSetNoShortsShortsAndStraps,,,SourceCharacter attaches shorts and reinforcing straps to DestinationCharacter AssetName,, -ItemArmsTransportJacketSetShortsShortsAndStraps,,,SourceCharacter reinforces DestinationCharacter AssetName with sturdy straps,, -ItemDevicesPoleSelect,,,Select Pole state,, -ItemDevicesPoleUntied,,,Untie from pole,, -ItemDevicesPoleTied,,,Tie to pole,, -ItemDevicesPoleSetUntied,,,SourceCharacter unties TargetCharacter from the pole.,, -ItemDevicesPoleSetTied,,,SourceCharacter ties TargetCharacter to the pole.,, -SelectEyePatchType,,,Select an eyepatch style.,, -EyePatchTypeLeft,,,Left,, -EyePatchTypeRight,,,Right,, -CatGlassesSelectStyle,,,Select a style.,, -CatGlassesStyleFront,,,Front of hair,, -CatGlassesStyleBack,,,Behind hair,, -GradientSunglassesSelectType,,,Select a style.,, -GradientSunglassesTypeGradUp,,,Gradient up,, -GradientSunglassesTypeGradDipped,,,Gradient dipped,, -GradientSunglassesTypeFlatUp,,,Flat up,, -GradientSunglassesTypeFlatDipped,,,Flat dipped,, -BraceletBand1Select,,,Select the style.,, -BraceletBand1Left,,,← This side,, -BraceletBand1Both,,,← Both sides →,, -BraceletBand1Right,,,That side →,, -GartersGarterBeltSelect,,,Select the style.,, -GartersGarterBeltBoth,,,Both,, -GartersGarterBeltLeft,,,Left,, -GartersGarterBeltRight,,,Right,, -SelectSpreaderType,,,Select leg spreader width.,, -SpreaderMetalPoseNarrow,,,Narrow,, -SpreaderMetalPoseWide,,,Wide,, -ItemDevicesPetBedSelect,,,Change blanket,, -ItemDevicesPetBedBlanket,,,Add blanket,, -ItemDevicesPetBedNoBlanket,,,Remove blanket,, -ItemDevicesPetBedSetBlanket,,,SourceCharacter gives TargetCharacter a blanket.,, -ItemDevicesPetBedSetNoBlanket,,,SourceCharacter removes the blanket from TargetCharacter.,, -NotificationTitleChatMessage,,,Chat Message,, -NotificationTitleChatJoin,,,Joined Room,, -NotificationTitleBeep,,,Beep,, -NotificationTitleDisconnect,,,Disconnected,, -NotificationTitleTest,,,Test Notification,, -NotificationTitleFromRoom,,, from ChatRoomName,, -NotificationTitleLarp,,,LARP - Your turn,, -ItemNipplesPlateClampsTightnessLevelLoose,,,Loose,, -ItemNipplesPlateClampsTightnessLevelTight,,,Tight,, -ItemNipplesPlateClampsSelectTightness,,,Select Tightness,, -ItemNipplesPlateClampsLoose,,,SourceCharacter loosens DestinationCharacter clamps.,, -ItemNipplesPlateClampsTight,,,SourceCharacter tigthens DestinationCharacter clamps.,, -ClothAccessoryBunnyCollarCuffsSelect,,,Select a style.,, -ClothAccessoryBunnyCollarCuffsBoth,,,Both,, -ClothAccessoryBunnyCollarCuffsCollar,,,Collar Only,, -ClothAccessoryBunnyCollarCuffsCuffs,,,Cuffs Only,, -ClothAccessoryBibSelectBase,,,Customize the bib.,, -ClothAccessoryBibModulePattern,,,Pattern,, -ClothAccessoryBibModuleTxt,,,Text,, -ClothAccessoryBibSelectPattern,,,Select a pattern.,, -ClothAccessoryBibOptionp0,,,None,, -ClothAccessoryBibOptionp1,,,Pacis and Bottles,, -ClothAccessoryBibOptionp2,,,Strawberries,, -ClothAccessoryBibOptionp3,,,Paw Prints,, -ClothAccessoryBibOptionp4,,,Cows,, -ClothAccessoryBibOptionp5,,,Hearts,, -ClothAccessoryBibSelectTxt,,,Add some text,, -ClothAccessoryBibOptionx0,,,None,, -ClothAccessoryBibOptionx1,,,Text,, -SelectBunnyMaskStyle,,,Select a style.,, -BunnyMaskTypeEars,,,Ears,, -BunnyMaskTypeEarless,,,Earless,, -MaskPetNoseSelectBase,,,Select part of the nose.,, -MaskPetNoseModuleCheeks,,,Cheeks,, -MaskPetNoseModuleNose,,,Nose,, -MaskPetNoseModuleWhiskers,,,Whiskers,, -MaskPetNoseModuleMouth,,,Mouth,, -MaskPetNoseSelectCheeks,,,Select Cheeks,, -MaskPetNoseOptionc0,,,No Cheeks,, -MaskPetNoseOptionc1,,,Small Cheeks,, -MaskPetNoseOptionc2,,,Big Cheeks,, -MaskPetNoseSelectNose,,,Select Nose,, -MaskPetNoseOptionn0,,,Nose,, -MaskPetNoseOptionn1,,,No Nose,, -MaskPetNoseSelectWhiskers,,,Select Whiskers,, -MaskPetNoseOptionw0,,,No Whiskers,, -MaskPetNoseOptionw1,,,Short Whiskers,, -MaskPetNoseOptionw2,,,Long Whiskers,, -MaskPetNoseSelectMouth,,,Mouth visibility,, -MaskPetNoseOptionm0,,,Show Mouth,, -MaskPetNoseOptionm1,,,Hide Mouth,, -CombinationPadlockControlsBlind,,,Your blindfold prevents you from seeing the digits on the lock,, -CombinationPadlockControlsClumsy,,,Your restraints prevent you from accurately manipulating the lock's dial,, -SelectCushionStyle,,,Choose an action.,, -CushionTypeHold,,,Hold cushion,, -CushionTypeKneel,,,Kneel on cushion,, -LatexCorset1Select,,,Select corset style,, -LatexCorset1NoGarter,,,No garters,, -LatexCorset1Garter,,,With garters,, -LatexCorset1SetGarter,,,SourceCharacter adds garters to DestinationCharacter latex corset.,, -LatexCorset1SetNoGarter,,,SourceCharacter removes the garters from DestinationCharacter latex corset.,, -HairAccessory1ElfEarsSelect,,,Select elf ears position,, -HairAccessory1ElfEarsInFront,,,In front of hair,, -HairAccessory1ElfEarsBehind,,,Behind hair,, -SelectRibbonType,,,Select the ribbon bondage,, -RibbonsStyleLightWrap,,,Lightly Wrapped,, -RibbonsStyleLightWrapBow,,,Lightly Wrapped With A Bow,, -RibbonsStyleWrap,,,Wrapped Up,, -RibbonsSetLightWrap,,,SourceCharacter wraps around some ribbons onto DestinationCharacter chest.,, -RibbonsSetLightWrapBow,,,SourceCharacter wraps around some ribbons onto DestinationCharacter chest and adds a bow to finish it.,, -RibbonsSetWrap,,,SourceCharacter wraps a good amount of ribbons around DestinationCharacter chest.,, -RibbonsBeltBowWrap,,,Style 1,, -RibbonsBeltCrotchWrapping,,,Style 2,, -PelvisRibbonsSetBowWrap,,,SourceCharacter uses some ribbons to tie a crotch tie on DestinationCharacter.,, -PelvisRibbonsSetCrotchWrapping,,,SourceCharacter uses some ribbons on DestinationCharacter crotch to slighty wrap it up.,, -ItemLegsRibbonsMessystyle,,,Messy style 1,, -ItemLegsRibbonsMessyWrap,,,Messy style 2,, -ItemLegsRibbonsCross,,,Crossed Style,, -ItemLegsRibbonsSetMessystyle,,,SourceCharacter lightly wraps some ribbons around DestinationCharacter legs.,, -ItemLegsRibbonsSetMessyWrap,,,SourceCharacter wraps some ribbons on DestinationCharacter legs.,, -ItemLegsRibbonsSetCross,,,SourceCharacter wraps some ribbons on DestinationCharacter legs to have as a crossed style tie.,, -SelectRibbonStyle,,,Select a style.,, -RibbonBraTypeBasic,,,Basic,, -RibbonBraTypeBow,,,Bow,, -RibbonBraTypeWrap,,,Wrap,, -ItemHeadRibbonsBasic,,,Basic,, -ItemHeadRibbonsWrap,,,Wrap,, -ItemHeadRibbonsSetBasic,,,SourceCharacter uses some ribbons on DestinationCharacter face.,, -ItemHeadRibbonsSetWrap,,,SourceCharacter uses some more ribbons on DestinationCharacter face.,, -ItemArmsRibbonsCross,,,Cross,, -ItemArmsRibbonsHeavy,,,Heavy,, -ItemArmsRibbonsSetCross,,,SourceCharacter uses some ribbons on DestinationCharacter arms.,, -ItemArmsRibbonsSetHeavy,,,SourceCharacter uses some more ribbons on DestinationCharacter arms.,, -RibbonsTorsoBasic,,,Basic,, -RibbonsTorsoHarness1,,,Harness,, -RibbonsTorsoHarness2,,,Harness 2,, -TorsoRibbonsSetBasic,,,SourceCharacter uses some ribbons on DestinationCharacter belly.,, -TorsoRibbonsSetHarness1,,,SourceCharacter uses some ribbons on DestinationCharacter torso.,, -TorsoRibbonsSetHarness2,,,SourceCharacter uses some ribbons on DestinationCharacter torso.,, -RibbonTypeBasic,,,Basic,, -RibbonTypeBow,,,Bow,, -RibbonsGagSetBasic,,,SourceCharacter uses some ribbon on DestinationCharacter mouth.,, -RibbonsGagSetBow,,,SourceCharacter uses some ribbon on DestinationCharacter mouth with a bow to finish it.,, -ItemMouthHarnessPonyBitsSelect,,,Select where the bit will be,, -ItemMouthHarnessPonyBitsDetached,,,Detached,, -ItemMouthHarnessPonyBitsAttached,,,Attached,, -ItemMouthHarnessPonyBitsSetDetached,,,SourceCharacter unclips the bit from DestinationCharacter harness.,, -ItemMouthHarnessPonyBitsSetAttached,,,SourceCharacter clips the bit onto DestinationCharacter harness.,, -ItemMouthDentalGagSelect,,,Open or close the gag,, -ItemMouthDentalGagOpen,,,Opened,, -ItemMouthDentalGagClosed,,,Closed,, -ItemMouthDentalGagSetClosed,,,SourceCharacter closes the mouth of TargetCharacter.,, -ItemMouthDentalGagSetOpen,,,SourceCharacter forces the mouth of TargetCharacter open.,, -ItemMiscServingTraySelect,,,Add or remove drinks from the tray,, -ItemMiscServingTrayEmpty,,,Empty,, -ItemMiscServingTrayEmpty,,,Empty,, -ItemMiscServingTraySetEmpty,,,SourceCharacter empties DestinationCharacter tray.,, -ItemMiscServingTrayDrinks,,,Drinks,, -ItemMiscServingTraySetDrinks,,,SourceCharacter fills DestinationCharacter tray with drinks.,, -ItemMiscServingTrayCake,,,Cake,, -ItemMiscServingTraySetCake,,,SourceCharacter fills DestinationCharacter tray with a cake.,, -ItemMiscServingTrayCookies,,,Cookies,, -ItemMiscServingTraySetCookies,,,SourceCharacter fills DestinationCharacter tray with cookies.,, -ItemMiscServingTrayToys,,,Toys,, -ItemMiscServingTraySetToys,,,SourceCharacter fills DestinationCharacter tray with sex toys.,, -ItemMiscTeddyBearSelect,,,Select the type of Teddy Bear,, -ItemMiscTeddyBearBear,,,Bear,, -ItemMiscTeddyBearFox,,,Fox,, -ItemMiscTeddyBearKitty,,,Kitty,, -ItemMiscTeddyBearPup,,,Puppy,, -ItemMiscTeddyBearBunny,,,Bunny,, -ItemMiscTeddyBearPony,,,Pony,, -ItemMiscsTeddyBearSetBear,,,SourceCharacter gives TargetCharacter a cute teddy bear.,, -ItemMiscTeddyBearSetFox,,,SourceCharacter gives TargetCharacter a cute foxy teddy.,, -ItemMiscTeddyBearSetKitty,,,SourceCharacter gives TargetCharacter a cute kitty teddy.,, -ItemMiscTeddyBearSetPup,,,SourceCharacter gives TargetCharacter a cute puppy teddy.,, -ItemMiscTeddyBearSetBunny,,,SourceCharacter gives TargetCharacter a cute Bunny teddy.,, -ItemMiscTeddyBearSetPony,,,SourceCharacter gives TargetCharacter a cute Pony teddy.,, -Page,,,Page,, -VariableHeightSelect,,,Set the height,, -VariableHeightPercent,,,% of full height:,, -VariableHeightConfirm,,,Confirm,, -SuspensionChange,,,SourceCharacter uses AssetName to suspend TargetCharacter from the ceiling.,, -SuspensionChangeRaise,,,SourceCharacter raises the height of DestinationCharacter suspension.,, -SuspensionChangeLower,,,SourceCharacter lowers the height of DestinationCharacter suspension.,, -ItemPelvisSilkStrapsSelect,,,Select silk bondage.,, -ItemPelvisSilkStrapsCrotch,,,Crotch Strap,, -ItemPelvisSilkStrapsOverPanties,,,Crotch Strap (Over Panties),, -ItemPelvisSilkStrapsSwissSeat,,,Swiss Seat,, -ItemPelvisSilkStrapsKikkouHip,,,Kikkou Hip,, -ItemPelvisSilkStrapsSetCrotch,,,SourceCharacter uses the silk on DestinationCharacter to create a crotch strap.,, -ItemPelvisSilkStrapsSetOverPanties,,,SourceCharacter uses the silk on DestinationCharacter to create a crotch strap over her panties.,, -ItemPelvisSilkStrapsSetSwissSeat,,,SourceCharacter uses the silk on DestinationCharacter to create a swiss seat pattern.,, -ItemPelvisSilkStrapsSetKikkouHip,,,SourceCharacter uses the silk on DestinationCharacter to create a kikkou hip pattern.,, -ItemTorsoSilkStrapsSelect,,,Select silk bondage.,, -ItemTorsoSilkStrapsCrotch,,,Crotch Strap,, -ItemTorsoSilkStrapsWaist,,,Waist Strap,, -ItemTorsoSilkStrapsHarness,,,Body Harness,, -ItemTorsoSilkStrapsStar,,,Star Harness,, -ItemTorsoSilkStrapsDiamond,,,Diamond Harness,, -ItemTorsoSilkStrapsSetCrotch,,,SourceCharacter uses the silk on DestinationCharacter to create a crotch strap.,, -ItemTorsoSilkStrapsSetWaist,,,SourceCharacter uses the silk on DestinationCharacter to create a waist strap.,, -ItemTorsoSilkStrapsSetHarness,,,SourceCharacter uses the silk on DestinationCharacter to create a body harness.,, -ItemTorsoSilkStrapsSetStar,,,SourceCharacter uses the silk on DestinationCharacter to create a star harness.,, -ItemTorsoSilkStrapsSetDiamond,,,SourceCharacter uses the silk on DestinationCharacter to create a diamond harness.,, -BraSilkStrapsSelect,,,Select silk clothing.,, -BraSilkStrapsStrip,,,Single Strip,, -BraSilkStrapsWrap,,,Wrap,, -BraSilkStrapsBra1,,,Bra,, -BraSilkStrapsBra2,,,Strapless Bra,, -BraSilkStrapsSwimsuit,,,Skimpy Swimsuit,, -PantiesSilkStrapsSelect,,,Select silk clothing.,, -PantiesSilkStrapsStrips,,,Double Strips,, -PantiesSilkStrapsWrap,,,Wrap,, -PantiesSilkStrapsThong,,,Thong,, -PantiesSilkStrapsPanties1,,,Panties,, -PantiesPoofyDiaperSelect,,,Select the amount of padding.,, -PantiesPoofyDiaperRegularPadding,,,Regular Padding,, -PantiesPoofyDiaperExtraPadding,,,Extra Padding,, -ItemArmsThinLeatherStrapsSelect,,,Select strap bondage.,, -ItemArmsThinLeatherStrapsWrist,,,Wrist Tie,, -ItemArmsThinLeatherStrapsBoxtie,,,Boxtie,, -ItemArmsThinLeatherStrapsWristElbow,,,Wrist And Elbow Tie,, -ItemArmsThinLeatherStrapsWristElbowHarness,,,Wrist And Elbow Harness Tie,, -ItemArmsThinLeatherStrapsHogtie,,,Hogtie,, -ItemArmsThinLeatherStrapsSetWrist,,,SourceCharacter uses the straps on DestinationCharacter to do a wrist strap.,, -ItemArmsThinLeatherStrapsSetBoxtie,,,SourceCharacter uses the straps on DestinationCharacter to do a boxtie harness.,, -ItemArmsThinLeatherStrapsSetWristElbow,,,SourceCharacter uses the straps on DestinationCharacter to do a wrist and elbow straps.,, -ItemArmsThinLeatherStrapsSetWristElbowHarness,,,SourceCharacter uses the straps on DestinationCharacter to do a wrist and elbow harness.,, -ItemArmsThinLeatherStrapsSetHogtie,,,SourceCharacter uses the straps on DestinationCharacter to do a hogtie harness.,, -ItemArmsSlimeSelectBase,,,Arrange slime,, -ItemArmsSlimeSelectPosition,,,Select position,, -ItemArmsSlimeSelectType,,,Select slime type,, -ItemArmsSlimeModulePosition,,,Position,, -ItemArmsSlimeModuleType,,,Slime Type,, -ItemArmsSlimeOptionp0,,,Torso only,, -ItemArmsSlimeOptionp1,,,Encasement,, -ItemArmsSlimeOptiont0,,,Normal slime,, -ItemArmsSlimeOptiont1,,,Slime girl,, -ItemArmsSlimeSetp0,,,The slime around DestinationCharacter body contracts until it is only restraining her arms.,, -ItemArmsSlimeSetp1,,,The slime around DestinationCharacter arms expands to encase her whole body.,, -ItemArmsSlimeSett0,,,The slime girl recedes back into the slime on TargetCharacter.,, -ItemArmsSlimeSett1,,,A slime girl emerges from the slime around TargetCharacter.,, -ItemArmsSlimeSetp1,,,,, -ItemArmsSlimeSett0,,,,, -ItemArmsSlimeSett1,,,,, -ItemTorsoThinLeatherStrapsSelect,,,Select strap bondage.,, -ItemTorsoThinLeatherStrapsCrotch,,,Crotch Strap,, -ItemTorsoThinLeatherStrapsWaist,,,Waist Strap,, -ItemTorsoThinLeatherStrapsHarness,,,Harness,, -ItemTorsoThinLeatherStrapsSetCrotch,,,SourceCharacter uses the straps on DestinationCharacter to create a crotch strap.,, -ItemTorsoThinLeatherStrapsSetWaist,,,SourceCharacter uses the straps on DestinationCharacter to create a waist strap.,, -ItemTorsoThinLeatherStrapsSetHarness,,,SourceCharacter uses the straps on DestinationCharacter to create a harness.,, -ItemTorso2ThinLeatherStrapsSelect,,,Select strap bondage.,, -ItemTorso2ThinLeatherStrapsCrotch,,,Crotch Strap,, -ItemTorso2ThinLeatherStrapsWaist,,,Waist Strap,, -ItemTorso2ThinLeatherStrapsHarness,,,Harness,, -ItemTorso2ThinLeatherStrapsSetCrotch,,,SourceCharacter uses the straps on DestinationCharacter to create a crotch strap.,, -ItemTorso2ThinLeatherStrapsSetWaist,,,SourceCharacter uses the straps on DestinationCharacter to create a waist strap.,, -ItemTorso2ThinLeatherStrapsSetHarness,,,SourceCharacter uses the straps on DestinationCharacter to create a harness.,, -SelectBikiniType,,,Select a bikini style.,, -BikiniTypeOpen,,,Open,, -BikiniTypeClosed,,,Closed,, -HatBandanaSelect,,,Select bandana style.,, -HatBandanaPlain,,,Plain,, -HatBandanaFlowers,,,Flowers,, -HatBandanaCircles,,,Circles,, -HatBandanaDots,,,Dots,, -HatBandanaTriangles,,,Triangles,, -HatBallCapBackSelect,,,Select strap location.,, -HatBallCapBackStrapUnder,,,Under the hair,, -HatBallCapBackStrapOver,,,Over the hair,, -HatBallCapFrontSelect,,,Select print design.,, -HatBallCapFrontBlank,,,Blank,, -HatBallCapFrontBCLogo,,,BCLogo,, -HatBallCapFrontBDSM,,,BDSM,, -HatBallCapFrontBG,,,BG,, -HatBallCapFrontChain,,,Chain,, -HatBallCapFrontGag,,,Gag,, -HatBallCapFrontKnot,,,Knot,, -HatBallCapFrontMonogram,,,Monogram,, -HatBallCapFrontRock,,,Rock,, -HatBallCapFrontSmile,,,Smile,, -HatBallCapFrontSun,,,Sun,, -HatBallCapFrontTick,,,Tick,, -ClothTShirt2Select,,,Select your design,, -ClothTShirt2Plain,,,Plain,, -ClothTShirt2BCLogo,,,Club Logo,, -ClothTShirt2BDSM,,,BD-SM,, -ClothTShirt2Gag,,,The Moaning Groans,, -ClothTShirt2Knot,,,Rope Knot,, -ClothTShirt2Rock,,,Rock,, -ClothTShirt2Smile,,,Smiley,, -ClothTShirt2Tick,,,Check,, -ClothChineseDress2Select,,,Select a dress pattern.,, -ClothChineseDress2Red,,,Style 1,, -ClothChineseDress2Purple,,,Style 2,, -ClothChineseDress2Pink,,,Style 3,, -ClothLatexLacedSuitSelect,,,Select your style.,, -ClothLatexLacedSuitLaced,,,Laced body.,, -ClothLatexLacedSuitNonLaced,,,Non-Laced body.,, -BraSwimsuit1Select,,,Select an option.,, -BraSwimsuit1Shiny,,,Shiny,, -BraSwimsuit1Dull,,,No shine,, -BraceletSpikeBandsSelect,,,Select a bracelet style.,, -BraceletSpikeBandsBoth,,,Both arms,, -BraceletSpikeBandsRight,,,Right arm,, -BraceletSpikeBandsLeft,,,Left arm,, -PantiesDiapers4Select,,,Select a diaper pattern.,, -PantiesDiapers4None,,,None,, -PantiesDiapers4StrawBerry,,,Strawberries,, -PantiesDiapers4Flower,,,Flowers,, -PantiesDiapers4Butterflies,,,Butterflies,, -PantiesDiapers4Spots,,,Spots,, -PreviewIconFavorite,,,Favorite,, -PreviewIconFavoritePlayer,,,Favorite (yours),, -PreviewIconFavoriteBoth,,,Favorite (theirs & yours),, -PreviewIconHandheld,,,Held,, -PreviewIconLocked,,,Locked,, -PreviewIconLoverOnly,,,Lovers only,, -PreviewIconOwnerOnly,,,Owner only,, -PreviewIconUnlocked,,,Automatically locks,, -PreviewIconAllowedLimited,,,Allowed Limited Item,, -CannotSelfSelect,,,Cannot use this option when wearing the item,, -ItemNeckTechnoCollarSelectBase,,,Configure Collar,, -ItemNeckTechnoCollarSelectCollarType,,,Configure Collar Type,, -ItemNeckTechnoCollarSelectShockModule,,,Configure Shock Module,, -ItemNeckTechnoCollarModuleCollarType,,,Collar Type,, -ItemNeckTechnoCollarModuleShockModule,,,Shock Module,, -ItemNeckTechnoCollarOptionc0,,,Slender,, -ItemNeckTechnoCollarOptionc1,,,Choker,, -ItemNeckTechnoCollarOptionc2,,,Full,, -ItemNeckTechnoCollarOptionc3,,,Posture,, -ItemNeckTechnoCollarOptionc4,,,Strict Posture,, -ItemNeckTechnoCollarOptions0,,,No Shock Module,, -ItemNeckTechnoCollarOptions1,,,Shock Module,, -ItemNeckTechnoCollarSetc0,,,SourceCharacter sets DestinationCharacter collar to a slender one.,, -ItemNeckTechnoCollarSetc1,,,SourceCharacter sets DestinationCharacter collar to a choker one.,, -ItemNeckTechnoCollarSetc2,,,SourceCharacter sets DestinationCharacter collar to a full one.,, -ItemNeckTechnoCollarSetc3,,,SourceCharacter sets DestinationCharacter collar to a posture one.,, -ItemNeckTechnoCollarSetc4,,,SourceCharacter sets DestinationCharacter collar to a strict posture one.,, -ItemNeckTechnoCollarSets0,,,SourceCharacter deactivates DestinationCharacter collar shock module.,, -ItemNeckTechnoCollarSets1,,,SourceCharacter activates DestinationCharacter collar shock module.,, -ItemHoodTechnoHelmet1SelectBase,,,Configure helmet,, -ItemHoodTechnoHelmet1SelectVisor,,,Configure visor,, -ItemHoodTechnoHelmet1SelectDeafeningModule,,,Configure deafening module,, -ItemHoodTechnoHelmet1SelectChinStrap,,,Configure chin strap,, -ItemHoodTechnoHelmet1ModuleVisor,,,Visor,, -ItemHoodTechnoHelmet1ModuleDeafeningModule,,,Deafening Module,, -ItemHoodTechnoHelmet1ModuleChinStrap,,,Chin Strap,, -ItemHoodTechnoHelmet1Optionv0,,,No Visor,, -ItemHoodTechnoHelmet1Optionv1,,,Transparent Visor,, -ItemHoodTechnoHelmet1Optionv2,,,Lightly Tinted Visor,, -ItemHoodTechnoHelmet1Optionv3,,,Heavily Tinted Visor,, -ItemHoodTechnoHelmet1Optionv4,,,Opaque Visor,, -ItemHoodTechnoHelmet1Optionv5,,,Hypnotic Visor,, -ItemHoodTechnoHelmet1Optiond0,,,No Deafening Module,, -ItemHoodTechnoHelmet1Optiond1,,,Light,, -ItemHoodTechnoHelmet1Optiond2,,,Heavy,, -ItemHoodTechnoHelmet1Optiond3,,,Noise-Cancelling,, -ItemHoodTechnoHelmet1Optionc0,,,No Chin Strap,, -ItemHoodTechnoHelmet1Optionc1,,,Chin Strap,, -ItemHoodTechnoHelmet1Setv0,,,SourceCharacter removes the visor on DestinationCharacter helmet.,, -ItemHoodTechnoHelmet1Setv1,,,SourceCharacter sets the visor on DestinationCharacter helmet to transparent.,, -ItemHoodTechnoHelmet1Setv2,,,SourceCharacter sets the visor on DestinationCharacter helmet to have a light tint.,, -ItemHoodTechnoHelmet1Setv3,,,SourceCharacter sets the visor on DestinationCharacter helmet to have a heavy tint.,, -ItemHoodTechnoHelmet1Setv4,,,SourceCharacter sets the visor on DestinationCharacter helmet to be opaque.,, -ItemHoodTechnoHelmet1Setv5,,,SourceCharacter sets the visor on DestinationCharacter helmet to be opaque and have a hypnotic effect.,, -ItemHoodTechnoHelmet1Setd0,,,SourceCharacter turns off the deafening module on DestinationCharacter helmet.,, -ItemHoodTechnoHelmet1Setd1,,,SourceCharacter turns the deafening module on DestinationCharacter on light mode.,, -ItemHoodTechnoHelmet1Setd2,,,SourceCharacter turns the deafening module on DestinationCharacter on heavy mode.,, -ItemHoodTechnoHelmet1Setd3,,,SourceCharacter turns the deafening module on DestinationCharacter on noise cancelling mode.,, -ItemHoodTechnoHelmet1Setc0,,,SourceCharacter removes the chin strap on DestinationCharacter helmet.,, -ItemHoodTechnoHelmet1Setc1,,,SourceCharacter adds the chin strap on DestinationCharacter helmet.,, -NecklaceNecklaceRopeSelect,,,Select the rope length,, -NecklaceNecklaceRopeLong,,,Long,, -NecklaceNecklaceRopeShort,,,Short,, -NecklaceChokerTattooSelect,,,Select the design,, -NecklaceChokerTattooLoops,,,Loops,, -NecklaceChokerTattooFlowers,,,Flowers,, -WingsSteampunkWingsSelect,,,Select the state.,, -WingsSteampunkWingsOff,,,Off,, -WingsSteampunkWingsOn,,,On,, -ItemHeadMedicalPatchSelectBase,,,Select Medical Patch Details,, -ItemHeadMedicalPatchSelectEye,,,Select Eye,, -ItemHeadMedicalPatchModuleEye,,,Eye,, -ItemHeadMedicalPatchOptione0,,,Both,, -ItemHeadMedicalPatchOptione1,,,Right,, -ItemHeadMedicalPatchOptione2,,,Left,, -ItemHeadMedicalPatchSetEye,,,SourceCharacter changes the medical patches on DestinationCharacter eyes,, -ItemHeadMedicalPatchSelectRightSticker,,,Select Right Sticker,, -ItemHeadMedicalPatchModuleRightSticker,,,Right Sticker,, -ItemHeadMedicalPatchOptionr0,,,None,, -ItemHeadMedicalPatchOptionr1,,,Heart,, -ItemHeadMedicalPatchOptionr2,,,Stripes,, -ItemHeadMedicalPatchOptionr3,,,X,, -ItemHeadMedicalPatchOptionr4,,,Teddy,, -ItemHeadMedicalPatchSetRightSticker,,,SourceCharacter changes the sticker on DestinationCharacter right eye,, -ItemHeadMedicalPatchSelectLeftSticker,,,Select Left Sticker,, -ItemHeadMedicalPatchModuleLeftSticker,,,Left Sticker,, -ItemHeadMedicalPatchOptionl0,,,None,, -ItemHeadMedicalPatchOptionl1,,,Heart,, -ItemHeadMedicalPatchOptionl2,,,Stripes,, -ItemHeadMedicalPatchOptionl3,,,X,, -ItemHeadMedicalPatchOptionl4,,,Teddy,, -ItemHeadMedicalPatchSetLeftSticker,,,SourceCharacter changes the sticker on DestinationCharacter left eye,, -ItemHeadDroneMaskSelectBase,,,Select Mask Details,, -ItemHeadDroneMaskSelectEyes,,,Select Eye Shape,, -ItemHeadDroneMaskModuleEyes,,,Eyes,, -ItemHeadDroneMaskOptione0,,,Smooth,, -ItemHeadDroneMaskOptione1,,,Open,, -ItemHeadDroneMaskOptione2,,,Spirals,, -ItemHeadDroneMaskOptione3,,,Smile,, -ItemHeadDroneMaskOptione4,,,Holes,, -ItemHeadDroneMaskOptione5,,,Sculpted,, -ItemHeadDroneMaskOptione6,,,Concave,, -ItemHeadDroneMaskSetEyes,,,SourceCharacter changes the eyes on DestinationCharacter smooth latex mask.,, -ItemHeadDroneMaskSelectMouth,,,Select Mouth Shape,, -ItemHeadDroneMaskModuleMouth,,,Mouth,, -ItemHeadDroneMaskOptionm0,,,Smooth,, -ItemHeadDroneMaskOptionm1,,,Onahole,, -ItemHeadDroneMaskOptionm2,,,Pussy,, -ItemHeadDroneMaskOptionm3,,,Smile,, -ItemHeadDroneMaskOptionm4,,,Holes,, -ItemHeadDroneMaskOptionm5,,,Sculpted,, -ItemHeadDroneMaskSetMouth,,,SourceCharacter changes the mouth on DestinationCharacter smooth latex mask.,, -ItemHeadDroneMaskSelectGlow,,,Switch Glow Function,, -ItemHeadDroneMaskModuleGlow,,,Glow,, -ItemHeadDroneMaskOptiong0,,,Off,, -ItemHeadDroneMaskOptiong1,,,On,, -ItemHeadDroneMaskSetGlow,,,SourceCharacter flicks the glow switch on DestinationCharacter smooth latex mask.,, -ItemHeadDroneMaskSelectPattern,,,Select Mask Pattern,, -ItemHeadDroneMaskModulePattern,,,Pattern,, -ItemHeadDroneMaskOptionp0,,,None,, -ItemHeadDroneMaskOptionp1,,,Barcode,, -ItemHeadDroneMaskOptionp2,,,Scarab,, -ItemHeadDroneMaskOptionp3,,,Hexagon,, -ItemHeadDroneMaskOptionp4,,,Lines,, -ItemHeadDroneMaskOptionp5,,,Text,, -ItemHeadDroneMaskTextRemove,,,SourceCharacter removes the text from DestinationCharacterName smooth latex mask.,, -ItemHeadDroneMaskTextChange,,,SourceCharacter changes the text on DestinationCharacterName smooth latex mask to read 'NewText'.,, -ItemHeadDroneMaskSetPattern,,,SourceCharacter changes the pattern on DestinationCharacter smooth latex mask.,, -ItemHeadDroneMaskSelectSight,,,Select Lens Quality,, -ItemHeadDroneMaskModuleSight,,,Lenses,, -ItemHeadDroneMaskOptions0,,,Opaque,, -ItemHeadDroneMaskOptions1,,,One-Way,, -ItemHeadDroneMaskSetSight,,,SourceCharacter changes the inner lining of DestinationCharacter smooth latex mask.,, -ItemHeadDroneMaskSelectHelmet,,,Select Coverage,, -ItemHeadDroneMaskModuleHelmet,,,Coverage,, -ItemHeadDroneMaskOptionh0,,,Mask,, -ItemHeadDroneMaskOptionh1,,,Hood,, -ItemHeadDroneMaskOptionh2,,,Total Hood,, -ItemHeadDroneMaskSetHelmet,,,SourceCharacter changes the coverage of DestinationCharacter smooth latex mask.,, -MaskGlitterSelect,,,Select a style.,, -MaskGlitterFreckles,,,Freckles,, -MaskGlitterMidFreckles,,,Nose Freckles,, -MaskGlitterSplitFreckles,,,Split Freckles,, -MaskGlitterFrecklesSmall,,,Small Freckles,, -MaskGlitterMidFrecklesSmall,,,Small Nose Freckles,, -MaskGlitterSplitFrecklesSmall,,,Small Cheek Freckles,, -MaskGlitterStarsBoth,,,Stars Both Sides,, -MaskGlitterStarsLeft,,,Stars Left,, -MaskGlitterStarsRight,,,Stars Right,, -MaskGlitterDotsBoth,,,Dots Both Sides,, -MaskGlitterDotsLeft,,,Dots Left,, -MaskGlitterDotsRight,,,Dots Right,, -ClothAccessoryGlitterSelect,,,Select a style.,, -ClothAccessoryGlitterFreckles,,,Freckles,, -ClothAccessoryGlitterMidFreckles,,,Small Freckles,, -ClothAccessoryGlitterSplitFreckles,,,Split Freckles,, -ClothAccessoryGlitterFrecklesSmall,,,Small Freckles,, -ClothAccessoryGlitterMidFrecklesSmall,,,Small Nose Freckles,, -ClothAccessoryGlitterSplitFrecklesSmall,,,Small Cheek Freckles,, -ClothAccessoryGlitterStarsBoth,,,Stars Both Sides,, -ClothAccessoryGlitterStarsLeft,,,Stars Left,, -ClothAccessoryGlitterStarsRight,,,Stars Right,, -ClothAccessoryGlitterDotsBoth,,,Dots Both Sides,, -ClothAccessoryGlitterDotsLeft,,,Dots Left,, -ClothAccessoryGlitterDotsRight,,,Dots Right,, -ItemHoodZipperHoodSelect,,,Select Zipper State.,, -ItemHoodZipperHoodZippersOpen,,,Open,, -ItemHoodZipperHoodZippersClosed,,,Closed,, -ItemHoodZipperHoodZippersClosedEyes,,,Eyes Closed,, -ItemHoodZipperHoodZippersClosedMouth,,,Mouth Closed,, -ItemHoodZipperHoodSetZippersClosed,,,SourceCharacter zips up DestinationCharacter hood.,, -ItemHoodZipperHoodSetZippersOpen,,,SourceCharacter unzips DestinationCharacter hood.,, -ItemHoodZipperHoodSetZippersClosedEyes,,,SourceCharacter zips the eyes and unzips the mouth of DestinationCharacter hood.,, -ItemHoodZipperHoodSetZippersClosedMouth,,,SourceCharacter unzips the eyes and zips the mouth of DestinationCharacter hood.,, -ItemHoodHeadboxSeethroughSelect,,,Select Status.,, -ItemHoodHeadboxSeethroughSeethrough,,,Lights On,, -ItemHoodHeadboxSeethroughOpaque,,,Lights Off,, -ItemHoodHeadboxSeethroughSetOpaque,,,SourceCharacter turns off the lights of DestinationCharacter headbox.,, -ItemHoodHeadboxSeethroughSetSeethrough,,,SourceCharacter turns on the lights of DestinationCharacter headbox.,, -ItemHoodDroneMaskSelectBase,,,Select Mask Details,, -ItemHoodDroneMaskSelectEyes,,,Select Eye Shape,, -ItemHoodDroneMaskModuleEyes,,,Eyes,, -ItemHoodDroneMaskOptione0,,,Smooth,, -ItemHoodDroneMaskOptione1,,,Open,, -ItemHoodDroneMaskOptione2,,,Spirals,, -ItemHoodDroneMaskOptione3,,,Smile,, -ItemHoodDroneMaskOptione4,,,Holes,, -ItemHoodDroneMaskOptione5,,,Sculpted,, -ItemHoodDroneMaskOptione6,,,Concave,, -ItemHoodDroneMaskSetEyes,,,SourceCharacter changes the eyes on DestinationCharacter smooth latex mask.,, -ItemHoodDroneMaskSelectMouth,,,Select Mouth Shape,, -ItemHoodDroneMaskModuleMouth,,,Mouth,, -ItemHoodDroneMaskOptionm0,,,Smooth,, -ItemHoodDroneMaskOptionm1,,,Onahole,, -ItemHoodDroneMaskOptionm2,,,Pussy,, -ItemHoodDroneMaskOptionm3,,,Smile,, -ItemHoodDroneMaskOptionm4,,,Holes,, -ItemHoodDroneMaskOptionm5,,,Sculpted,, -ItemHoodDroneMaskSetMouth,,,SourceCharacter changes the mouth on DestinationCharacter smooth latex mask.,, -ItemHoodDroneMaskSelectGlow,,,Switch Glow Function,, -ItemHoodDroneMaskModuleGlow,,,Glow,, -ItemHoodDroneMaskOptiong0,,,Off,, -ItemHoodDroneMaskOptiong1,,,On,, -ItemHoodDroneMaskSetGlow,,,SourceCharacter flicks the glow switch on DestinationCharacter smooth latex mask.,, -ItemHoodDroneMaskSelectPattern,,,Select Mask Pattern,, -ItemHoodDroneMaskModulePattern,,,Pattern,, -ItemHoodDroneMaskOptionp0,,,None,, -ItemHoodDroneMaskOptionp1,,,Barcode,, -ItemHoodDroneMaskOptionp2,,,Scarab,, -ItemHoodDroneMaskOptionp3,,,Hexagon,, -ItemHoodDroneMaskOptionp4,,,Lines,, -ItemHoodDroneMaskOptionp5,,,Text,, -ItemHoodDroneMaskTextRemove,,,SourceCharacter removes the text from DestinationCharacterName smooth latex mask.,, -ItemHoodDroneMaskTextChange,,,SourceCharacter changes the text on DestinationCharacterName smooth latex mask to read 'NewText'.,, -ItemHoodDroneMaskSetPattern,,,SourceCharacter changes the pattern on DestinationCharacter smooth latex mask.,, -ItemHoodDroneMaskSelectSight,,,Select Lens Quality,, -ItemHoodDroneMaskModuleSight,,,Lenses,, -ItemHoodDroneMaskOptions0,,,Opaque,, -ItemHoodDroneMaskOptions1,,,One-Way,, -ItemHoodDroneMaskSetSight,,,SourceCharacter changes the inner lining of DestinationCharacter smooth latex mask.,, -ItemHoodDroneMaskSelectHelmet,,,Select Coverage,, -ItemHoodDroneMaskModuleHelmet,,,Coverage,, -ItemHoodDroneMaskOptionh0,,,Mask,, -ItemHoodDroneMaskOptionh1,,,Hood,, -ItemHoodDroneMaskOptionh2,,,Total Hood,, -ItemHoodDroneMaskSetHelmet,,,SourceCharacter changes the coverage of DestinationCharacter smooth latex mask.,, -ItemMouthPonyGagSelectBase,,,Select bridle Gag Accessories,, -ItemMouthPonyGagSelectGag,,,Select Gag Accessory,, -ItemMouthPonyGagModuleGag,,,Gag,, -ItemMouthPonyGagOptiong0,,,Bit Gag,, -ItemMouthPonyGagOptiong1,,,Detached,, -ItemMouthPonyGagOptiong2,,,Large Bit Gag,, -ItemMouthPonyGagOptiong3,,,Tongue Depressor Bit Gag,, -ItemMouthPonyGagOptiong4,,,Ballgag,, -ItemMouthPonyGagOptiong5,,,Dildo Gag,, -ItemMouthPonyGagSetg0,,,SourceCharacter uses a bit gag on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSetg1,,,SourceCharacter removes the gag on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSetg2,,,SourceCharacter uses a large bit gag on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSetg3,,,SourceCharacter uses a tongue depressor on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSetg4,,,SourceCharacter uses a ballgag on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSetg5,,,SourceCharacter uses a dildo gag on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSelectExtra,,,Select Extra Straps,, -ItemMouthPonyGagModuleExtra,,,Extra Straps,, -ItemMouthPonyGagOptione0,,,None,, -ItemMouthPonyGagOptione1,,,Additional Straps,, -ItemMouthPonyGagOptione2,,,Flags,, -ItemMouthPonyGagSete0,,,SourceCharacter changes the additional straps on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSete1,,,SourceCharacter adds additional straps to DestinationCharacter bridle gag.,, -ItemMouthPonyGagSete2,,,SourceCharacter adds decorative flags on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSelectTop,,,Select Top Accessory,, -ItemMouthPonyGagModuleTop,,,Top,, -ItemMouthPonyGagOptiont0,,,None,, -ItemMouthPonyGagOptiont1,,,Plume,, -ItemMouthPonyGagOptiont2,,,Mane Left,, -ItemMouthPonyGagOptiont3,,,Mane Right,, -ItemMouthPonyGagOptiont4,,,Mohawk,, -ItemMouthPonyGagSett0,,,SourceCharacter removes the top accessory on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSett1,,,SourceCharacter adds a plume on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSett2,,,SourceCharacter styles DestinationCharacter hair into a mane.,, -ItemMouthPonyGagSett3,,,SourceCharacter styles DestinationCharacter hair into a mane.,, -ItemMouthPonyGagSett4,,,SourceCharacter styles DestinationCharacter hair into a mohawk.,, -ItemMouthPonyGagSelectHorn,,,Select Horn Accessory,, -ItemMouthPonyGagModuleHorn,,,Horn,, -ItemMouthPonyGagOptionh0,,,None,, -ItemMouthPonyGagOptionh1,,,Horn,, -ItemMouthPonyGagOptionh2,,,Dildocorn,, -ItemMouthPonyGagSeth0,,,SourceCharacter transforms TargetCharacter into a regular pony.,, -ItemMouthPonyGagSeth1,,,SourceCharacter transforms TargetCharacter into a magical unicorn.,, -ItemMouthPonyGagSeth2,,,SourceCharacter transforms TargetCharacter into a lusty dildocorn.,, -ItemMouthPonyGagSelectPanel,,,Select Panel Accessory,, -ItemMouthPonyGagModulePanel,,,Panel,, -ItemMouthPonyGagOptionp0,,,None,, -ItemMouthPonyGagOptionp1,,,Plain,, -ItemMouthPonyGagOptionp2,,,Hex,, -ItemMouthPonyGagOptionp3,,,Shield,, -ItemMouthPonyGagOptionp4,,,Moon,, -ItemMouthPonyGagOptionp5,,,Sun,, -ItemMouthPonyGagOptionp6,,,Heart,, -ItemMouthPonyGagOptionp7,,,Horse,, -ItemMouthPonyGagOptionp8,,,Triskel,, -ItemMouthPonyGagOptionp9,,,Pentacle,, -ItemMouthPonyGagSetp0,,,SourceCharacter changes the panel on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSetp1,,,SourceCharacter adds a panel to DestinationCharacter bridle gag.,, -ItemMouthPonyGagSetp2,,,SourceCharacter uses a futuristic ornament on DestinationCharacter panel.,, -ItemMouthPonyGagSetp3,,,SourceCharacter uses an ornament of protection on DestinationCharacter panel.,, -ItemMouthPonyGagSetp4,,,SourceCharacter uses an ornament of night on DestinationCharacter panel.,, -ItemMouthPonyGagSetp5,,,SourceCharacter uses an ornament of light on DestinationCharacter panel.,, -ItemMouthPonyGagSetp6,,,SourceCharacter uses a loving ornament on DestinationCharacter panel.,, -ItemMouthPonyGagSetp7,,,SourceCharacter uses an equestrian ornament on DestinationCharacter panel.,, -ItemMouthPonyGagSetp8,,,SourceCharacter uses a kinky ornament on DestinationCharacter panel.,, -ItemMouthPonyGagSetp9,,,SourceCharacter uses a ritual ornament on DestinationCharacter panel.,, -ItemMouthPonyGagSelectReins,,,Select Rein Accessory,, -ItemMouthPonyGagModuleReins,,,Reins,, -ItemMouthPonyGagOptionr0,,,None,, -ItemMouthPonyGagOptionr1,,,Reins,, -ItemMouthPonyGagOptionr2,,,Rope,, -ItemMouthPonyGagOptionr3,,,Hitching Post,, -ItemMouthPonyGagSetr0,,,SourceCharacter removes the reins on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSetr1,,,SourceCharacter adds reins to DestinationCharacter bridle gag.,, -ItemMouthPonyGagSetr2,,,SourceCharacter ties a rope to DestinationCharacter bridle gag.,, -ItemMouthPonyGagSetr3,,,SourceCharacter ties DestinationCharacter reins to a post.,, -ItemMouthPonyGagSelectBlinders,,,Select Blinders,, -ItemMouthPonyGagModuleBlinders,,,Blinders,, -ItemMouthPonyGagOptionb0,,,None,, -ItemMouthPonyGagOptionb1,,,Blinders,, -ItemMouthPonyGagSetb0,,,SourceCharacter removes the blinders on DestinationCharacter bridle gag.,, -ItemMouthPonyGagSetb1,,,SourceCharacter adds blinders to DestinationCharacter bridle gag.,, -ItemDevicesWoodenRackSelectBase,,,Choose the rack's configuration,, -ItemDevicesWoodenRackSelectFrame,,,Choose the bed for the rack,, -ItemDevicesWoodenRackModuleFrame,,,Frame,, -ItemDevicesWoodenRackOptionf0,,,Full bed,, -ItemDevicesWoodenRackOptionf1,,,Stained bed,, -ItemDevicesWoodenRackOptionf2,,,Partial bed,, -ItemDevicesWoodenRackOptionf3,,,No bed,, -ItemDevicesWoodenRackSetf0,,,SourceCharacter places all the planks on DestinationCharacter rack.,, -ItemDevicesWoodenRackSetf1,,,TargetCharacterName lies over stains.,, -ItemDevicesWoodenRackSetf2,,,SourceCharacter removes some planks from DestinationCharacter rack.,, -ItemDevicesWoodenRackSetf3,,,SourceCharacter removes all the planks from DestinationCharacter rack.,, -ItemDevicesWoodenRackSelectTopRestraints,,,Choose how to restrain the arms,, -ItemDevicesWoodenRackModuleTopRestraints,,,Arm Restraints,, -ItemDevicesWoodenRackOptiont0,,,None,, -ItemDevicesWoodenRackOptiont1,,,Rope,, -ItemDevicesWoodenRackOptiont2,,,Tight Rope,, -ItemDevicesWoodenRackOptiont3,,,Chain,, -ItemDevicesWoodenRackOptiont4,,,Tight Chain,, -ItemDevicesWoodenRackOptiont5,,,In Stocks,, -ItemDevicesWoodenRackSett0,,,SourceCharacter frees DestinationCharacter arms.,, -ItemDevicesWoodenRackSett1,,,SourceCharacter ties DestinationCharacter wrists with a rope.,, -ItemDevicesWoodenRackSett2,,,SourceCharacter tightens DestinationCharacter ropes.,, -ItemDevicesWoodenRackSett3,,,SourceCharacter shackles DestinationCharacter wrists.,, -ItemDevicesWoodenRackSett4,,,SourceCharacter tightens DestinationCharacter chains.,, -ItemDevicesWoodenRackSett5,,,SourceCharacter puts DestinationCharacter neck and wrists in stocks.,, -ItemDevicesWoodenRackSelectBotRestraints,,,Choose how to restrain the legs,, -ItemDevicesWoodenRackModuleBotRestraints,,,Leg Restraints,, -ItemDevicesWoodenRackOptionb0,,,None,, -ItemDevicesWoodenRackOptionb1,,,Rope,, -ItemDevicesWoodenRackOptionb2,,,Tied Together,, -ItemDevicesWoodenRackOptionb3,,,Chain,, -ItemDevicesWoodenRackOptionb4,,,Chained Together,, -ItemDevicesWoodenRackOptionb5,,,In Stocks,, -ItemDevicesWoodenRackSetb0,,,SourceCharacter frees DestinationCharacter legs.,, -ItemDevicesWoodenRackSetb1,,,SourceCharacter ties DestinationCharacter ankles with a rope.,, -ItemDevicesWoodenRackSetb2,,,SourceCharacter ties DestinationCharacter ankles together with a rope.,, -ItemDevicesWoodenRackSetb3,,,SourceCharacter shackles DestinationCharacter ankles.,, -ItemDevicesWoodenRackSetb4,,,SourceCharacter chains DestinationCharacter ankles together.,, -ItemDevicesWoodenRackSetb5,,,SourceCharacter puts DestinationCharacter ankles in stocks.,, -ItemNeckBonedNeckCorsetSelect,,,Select ring configuration,, -ItemNeckBonedNeckCorsetNoRing,,,No Ring,, -ItemNeckBonedNeckCorsetRing,,,Ring,, -ItemNeckBonedNeckCorsetSetNoRing,,,SourceCharacter removes the ring from DestinationCharacter collar.,, -ItemNeckBonedNeckCorsetSetRing,,,SourceCharacter attaches a ring to DestinationCharacter collar.,, -ItemMouthLatexSheathGagSelect,,,Select Gag Thickness,, -ItemMouthLatexSheathGagThin,,,Thin,, -ItemMouthLatexSheathGagThick,,,Thick,, -ItemMouthLatexSheathGagVeryThick,,,Very Thick,, -ItemMouthLatexSheathGagSetThin,,,SourceCharacter exchanges DestinationCharacter latex mouth sheath for a thin sheath.,, -ItemMouthLatexSheathGagSetThick,,,SourceCharacter exchanges DestinationCharacter latex mouth sheath for a thick sheath.,, -ItemMouthLatexSheathGagSetVeryThick,,,SourceCharacter exchanges DestinationCharacter latex mouth sheath for a very thick sheath.,, -MaskHeadHarnessSelect,,,Select the head harness shape,, -MaskHeadHarnessSimple,,,Simple harness,, -MaskHeadHarnessHeavy,,,Heavy harness,, -ItemTorsoLockingSwimsuitSelect,,,Select Shine,, -ItemTorsoLockingSwimsuitShiny,,,Shiny,, -ItemTorsoLockingSwimsuitDull,,,Dull,, -ItemTorsoLockingSwimsuitSetShiny,,,SourceCharacter shines DestinationCharacter locking swimsuit.,, -ItemTorsoLockingSwimsuitSetDull,,,SourceCharacter dulls DestinationCharacter locking swimsuit.,, -ItemTorso2LockingSwimsuitSelect,,,Select Shine,, -ItemTorso2LockingSwimsuitShiny,,,Shiny,, -ItemTorso2LockingSwimsuitDull,,,Dull,, -ItemTorso2LockingSwimsuitSetShiny,,,SourceCharacter shines DestinationCharacter locking swimsuit.,, -ItemTorso2LockingSwimsuitSetDull,,,SourceCharacter dulls DestinationCharacter locking swimsuit.,, -ItemMouth3StitchesSelect,,,Choose stitches,, -ItemMouth3StitchesStraight,,,Straight,, -ItemMouth3StitchesZigZag,,,Zig Zag,, -ItemMouth3StitchesSkewed,,,Skewed,, -ItemMouth3StitchesCross,,,Crossed,, -ItemMouth3StitchesSetStraight,,,SourceCharacter stitches DestinationCharacter mouth shut with vertical threads.,, -ItemMouth3StitchesSetZigZag,,,SourceCharacter stitches DestinationCharacter mouth shut with a zigzagging thread.,, -ItemMouth3StitchesSetSkewed,,,SourceCharacter stitches DestinationCharacter mouth shut with a spiraling thread.,, -ItemMouth3StitchesSetCross,,,SourceCharacter stitches DestinationCharacter mouth shut with crossed threads.,, -ItemVulvaStitchesSelect,,,Choose stitches,, -ItemVulvaStitchesStraight,,,Straight,, -ItemVulvaStitchesZigZag,,,Zig Zag,, -ItemVulvaStitchesSkewed,,,Skewed,, -ItemVulvaStitchesCross,,,Crossed,, -ItemVulvaStitchesSetStraight,,,SourceCharacter stitches DestinationCharacter pussy shut with horizontal threads.,, -ItemVulvaStitchesSetZigZag,,,SourceCharacter stitches DestinationCharacter pussy shut with a zigzagging thread.,, -ItemVulvaStitchesSetSkewed,,,SourceCharacter stitches DestinationCharacter pussy shut with a spiraling thread.,, -ItemVulvaStitchesSetCross,,,SourceCharacter stitches DestinationCharacter pussy shut with crossed threads.,, -PetPostText,,,Save text,, -ItemNeckRestraintsPetPostSelectBase,,,Choose the sign configuration,, -ItemNeckRestraintsPetPostSelectPlaque,,,Choose the sign design,, -ItemNeckRestraintsPetPostModulePlaque,,,Sign,, -ItemNeckRestraintsPetPostOptionp0,,,Flat Sign,, -ItemNeckRestraintsPetPostOptionp1,,,With Border,, -ItemNeckRestraintsPetPostSetp0,,,SourceCharacter changes DestinationCharacter sign design.,, -ItemNeckRestraintsPetPostSetp1,,,SourceCharacter changes DestinationCharacter sign design.,, -ItemNeckRestraintsPetPostSelectLeash,,,Choose the leash type,, -ItemNeckRestraintsPetPostModuleLeash,,,Leash,, -ItemNeckRestraintsPetPostOptionl0,,,Leather Leash,, -ItemNeckRestraintsPetPostOptionl1,,,Rope,, -ItemNeckRestraintsPetPostOptionl2,,,Chain,, -ItemNeckRestraintsPetPostSetl0,,,SourceCharacter changes DestinationCharacter for a leather leash.,, -ItemNeckRestraintsPetPostSetl1,,,SourceCharacter changes DestinationCharacter for a rope.,, -ItemNeckRestraintsPetPostSetl2,,,SourceCharacter changes DestinationCharacter leash for a chain.,, -ItemNeckRestraintsPetPostSelectDirt,,,Choose the dirt on the sign,, -ItemNeckRestraintsPetPostModuleDirt,,,Dirty,, -ItemNeckRestraintsPetPostOptiond0,,,Clean,, -ItemNeckRestraintsPetPostOptiond1,,,Dirty,, -ItemNeckRestraintsPetPostSetd0,,,SourceCharacter changes DestinationCharacter sign for a clean one.,, -ItemNeckRestraintsPetPostSetd1,,,SourceCharacter changes DestinationCharacter sign for a dirty one.,, -ItemNeckRestraintsPetPostSelectTxt,,,Configure the text.,, -ItemNeckRestraintsPetPostModuleTxt,,,Sign text,, -ItemNeckRestraintsPetPostOptionx0,,,Sign text.,, -ItemNeckRestraintsPetPostSetx0,,,SourceCharacter changes DestinationCharacter sign message.,, -ItemNeckRestraintsPetPostSelectSticker,,,Choose the sticker on the sign,, -ItemNeckRestraintsPetPostModuleSticker,,,Sticker,, -ItemNeckRestraintsPetPostOptions0,,,Paw,, -ItemNeckRestraintsPetPostOptions1,,,Triskel,, -ItemNeckRestraintsPetPostOptions2,,,Moon,, -ItemNeckRestraintsPetPostOptions3,,,LGBT Flag,, -ItemNeckRestraintsPetPostOptions4,,,Trans Flag,, -ItemNeckRestraintsPetPostOptions5,,,Bi Flag,, -ItemNeckRestraintsPetPostOptions6,,,No Swimming,, -ItemNeckRestraintsPetPostOptions7,,,None,, -ItemNeckRestraintsPetPostSets0,,,SourceCharacter puts a paw sticker on DestinationCharacter sign.,, -ItemNeckRestraintsPetPostSets1,,,SourceCharacter puts a triskel sticker on DestinationCharacter sign.,, -ItemNeckRestraintsPetPostSets2,,,SourceCharacter puts a moon sticker on DestinationCharacter sign.,, -ItemNeckRestraintsPetPostSets3,,,SourceCharacter puts an LGBT pride flag sticker on DestinationCharacter sign.,, -ItemNeckRestraintsPetPostSets4,,,SourceCharacter puts a trans pride flag sticker on DestinationCharacter sign.,, -ItemNeckRestraintsPetPostSets5,,,SourceCharacter puts a bi pride flag sticker on DestinationCharacter sign.,, -ItemNeckRestraintsPetPostSets6,,,SourceCharacter puts a no swimming sticker on DestinationCharacter sign.,, -ItemNeckRestraintsPetPostSets7,,,SourceCharacter removes the sticker on DestinationCharacter sign.,, -ItemNeckRestraintsPetPostSelectPostIt,,,Configure the text.,, -ItemNeckRestraintsPetPostModulePostIt,,,Sign text,, -ItemNeckRestraintsPetPostOptionm0,,,Post It,, -ItemNeckRestraintsPetPostOptionm1,,,No PostIt,, -ItemNeckRestraintsPetPostSetm0,,,SourceCharacter puts a post it on DestinationCharacter sign.,, -ItemNeckRestraintsPetPostSetm1,,,SourceCharacter removes the postit on DestinationCharacter sign.,, -ItemNeckRestraintsPetPostSelectTxt,,,Configure the text.,, -ItemNeckRestraintsPetPostModuleTxt,,,Sign text,, -ItemNeckRestraintsPetPostOptionx0,,,Sign text,, -ChangeSign,,,SourceCharacter changes DestinationCharacter sign message.,, -ItemHeadStitchesSelectBase,,,Choose stitches,, -ItemHeadStitchesModuleMain,,,Eyes,, -ItemHeadStitchesSelectMain,,,Choose what to stitch,, -ItemHeadStitchesOptionm0,,,Right Eye,, -ItemHeadStitchesOptionm1,,,Left Eye,, -ItemHeadStitchesOptionm2,,,Both Eyes,, -ItemHeadStitchesSetm0,,,SourceCharacter stitches DestinationCharacter right eye's eyelids.,, -ItemHeadStitchesSetm1,,,SourceCharacter stitches DestinationCharacter left eye's eyelids.,, -ItemHeadStitchesSetm2,,,SourceCharacter stitches DestinationCharacter both eyes' eyelids.,, -ItemHeadStitchesModuleRight,,,Right Eye,, -ItemHeadStitchesSelectRight,,,Choose stitches for the right eye,, -ItemHeadStitchesOptionr0,,,Straight,, -ItemHeadStitchesOptionr1,,,Zig Zag,, -ItemHeadStitchesOptionr2,,,Skewed,, -ItemHeadStitchesOptionr3,,,Crossed,, -ItemHeadStitchesSetr0,,,SourceCharacter stitches DestinationCharacter right eye shut with vertical threads.,, -ItemHeadStitchesSetr1,,,SourceCharacter stitches DestinationCharacter right eye with a zigzagging thread.,, -ItemHeadStitchesSetr2,,,SourceCharacter stitches DestinationCharacter right eye with a spiraling thread.,, -ItemHeadStitchesSetr3,,,SourceCharacter stitches DestinationCharacter right eye with crossed threads.,, -ItemHeadStitchesModuleLeft,,,Left Eye,, -ItemHeadStitchesSelectLeft,,,Choose stitches,, -ItemHeadStitchesOptionl0,,,Straight,, -ItemHeadStitchesOptionl1,,,Zig Zag,, -ItemHeadStitchesOptionl2,,,Skewed,, -ItemHeadStitchesOptionl3,,,Crossed,, -ItemHeadStitchesSetl0,,,SourceCharacter stitches DestinationCharacter left eye with vertical threads.,, -ItemHeadStitchesSetl1,,,SourceCharacter stitches DestinationCharacter left eye with a zigzagging thread.,, -ItemHeadStitchesSetl2,,,SourceCharacter stitches DestinationCharacter left eye with a spiraling thread.,, -ItemHeadStitchesSetl3,,,SourceCharacter stitches DestinationCharacter left eye with crossed threads.,, -GGTSIntroPublic,,,[GGTS] GGTS control public room. Be good girl SourceCharacter.,, -GGTSIntroPrivate,,,[GGTS] Launching GGTS private room. Time counts triple. GGTS more active. Good girl follow commands. Three strikes equal punishment. GGTS in control. Be good girl SourceCharacter.,, -GGTSIntroPrivateSlave,,,[GGTS] Launching GGTS private room. Time counts triple. GGTS more active. Good slave follow commands. Strike remove sixty minutes. Master GGTS in control. Be good slave SourceCharacter.,, -GGTSIntroPendingPunishment,,,[GGTS] GGTS inactive for SourceCharacter. Three strikes recorded. Report GGTS for punishment.,, -GGTSIntroNotPlaying,,,[GGTS] GGTS control public room. SourceCharacter unrecognized for GGTS.,, -GGTSIntroOnlyInAsylum,,,[GGTS] GGTS is only available in the asylum.,, -GGTSNoAdminPrivate,,,[GGTS] Good girl do not administrate room.,, -GGTSNoAdminLocked,,,[GGTS] Good girl do not administrate locked room.,, -GGTSTimeOverStrike0,,,[GGTS] Time over SourceCharacter. Strike recorded. Sixty minutes removed.,, -GGTSTimeOverStrike1,,,[GGTS] Time over SourceCharacter. Strike one recorded. Three strikes equal punishment.,, -GGTSTimeOverStrike2,,,[GGTS] Time over SourceCharacter. Strike two recorded. Three strikes equal punishment.,, -GGTSTimeOverStrike3,,,[GGTS] Time over SourceCharacter. Strike three recorded. Level failed. Report GGTS for punishment.,, -GGTSFailureStrike0,,,[GGTS] SourceCharacter disobeyed. Strike recorded. Sixty minutes removed.,, -GGTSFailureStrike1,,,[GGTS] SourceCharacter disobeyed. Strike one recorded. Three strikes equal punishment.,, -GGTSFailureStrike2,,,[GGTS] SourceCharacter disobeyed. Strike two recorded. Three strikes equal punishment.,, -GGTSFailureStrike3,,,[GGTS] SourceCharacter disobeyed. Strike three recorded. Level failed. Report GGTS for punishment.,, -GGTSKeepPoseStrike0,,,[GGTS] SourceCharacter broke pose rule. Strike recorded. Sixty minutes removed.,, -GGTSKeepPoseStrike1,,,[GGTS] SourceCharacter broke pose rule. Strike one recorded. Three strikes equal punishment.,, -GGTSKeepPoseStrike2,,,[GGTS] SourceCharacter broke pose rule. Strike two recorded. Three strikes equal punishment.,, -GGTSKeepPoseStrike3,,,[GGTS] SourceCharacter broke pose rule. Strike three recorded. Level failed. Report GGTS for punishment.,, -GGTSOrgasmStrike0,,,[GGTS] SourceCharacter broke orgasm rule. Strike recorded. Sixty minutes removed.,, -GGTSOrgasmStrike1,,,[GGTS] SourceCharacter broke orgasm rule. Strike one recorded. Three strikes equal punishment.,, -GGTSOrgasmStrike2,,,[GGTS] SourceCharacter broke orgasm rule. Strike two recorded. Three strikes equal punishment.,, -GGTSOrgasmStrike3,,,[GGTS] SourceCharacter broke orgasm rule. Strike three recorded. Level failed. Report GGTS for punishment.,, -GGTSForbiddenWordStrike0,,,[GGTS] Forbidden word SourceCharacter. Strike recorded. Sixty minutes removed.,, -GGTSForbiddenWordStrike1,,,[GGTS] Forbidden word SourceCharacter. Strike one recorded. Three strikes equal punishment.,, -GGTSForbiddenWordStrike2,,,[GGTS] Forbidden word SourceCharacter. Strike two recorded. Three strikes equal punishment.,, -GGTSForbiddenWordStrike3,,,[GGTS] Forbidden word SourceCharacter. Strike three recorded. Level failed. Report GGTS for punishment.,, -GGTSTaskDone,,,[GGTS] Good girl SourceCharacter.,, -GGTSTaskDoneSlaveGirl,,,[GGTS] Good slave girl SourceCharacter.,, -GGTSTaskDoneSlave,,,[GGTS] Good slave SourceCharacter.,, -GGTSTaskClothHeels,,,[GGTS] SourceCharacter. Wear high heels.,, -GGTSTaskClothSocks,,,[GGTS] SourceCharacter. Wear only socks.,, -GGTSTaskClothBarefoot,,,[GGTS] SourceCharacter. Get barefoot.,, -GGTSTaskClothUpperLowerOn,,,[GGTS] SourceCharacter. Dress with clothes.,, -GGTSTaskClothUpperLowerOff,,,[GGTS] SourceCharacter. Remove upper and bottom clothes.,, -GGTSTaskClothNaked,,,[GGTS] SourceCharacter. Get naked.,, -GGTSTaskClothUnderwear,,,[GGTS] SourceCharacter. Wear only underwear.,, -GGTSTaskPoseKneel,,,[GGTS] SourceCharacter. Kneel down.,, -GGTSTaskPoseStand,,,[GGTS] SourceCharacter. Stand up.,, -GGTSTaskPoseOverHead,,,[GGTS] SourceCharacter. Raise and show hands.,, -GGTSTaskPoseBehindBack,,,[GGTS] SourceCharacter. Put hands behind back.,, -GGTSTaskPoseLegsClosed,,,[GGTS] SourceCharacter. Close legs.,, -GGTSTaskPoseLegsOpen,,,[GGTS] SourceCharacter. Open legs.,, -GGTSTaskNoTalking,,,[GGTS] SourceCharacter. No talking one minute.,, -GGTSTaskQueryWhatIsGGTS,,,"[GGTS] SourceCharacter, spell GGTS acronym.",, -GGTSTaskQueryWhatAreYou,,,"[GGTS] SourceCharacter, what are you?",, -GGTSTaskQueryWhoControl,,,"[GGTS] SourceCharacter, who's in control?",, -GGTSTaskQueryWhoControlMaster,,,"[GGTS] SourceCharacter, who's in control?",, -GGTSTaskQueryLove,,,"[GGTS] SourceCharacter, you love GGTS?",, -GGTSTaskQueryLoveMaster,,,"[GGTS] SourceCharacter, you love Master GGTS?",, -GGTSTaskQueryCanFail,,,"[GGTS] SourceCharacter, can GGTS fail?",, -GGTSTaskQueryCanFailMaster,,,"[GGTS] SourceCharacter, can Master GGTS fail?",, -GGTSTaskQuerySurrender,,,"[GGTS] SourceCharacter, you surrender to GGTS?",, -GGTSTaskQuerySurrenderMaster,,,"[GGTS] SourceCharacter, you surrender to Master GGTS?",, -GGTSTaskQueryServeObey,,,"[GGTS] SourceCharacter, who you serve and obey?",, -GGTSTaskQueryServeObeyMaster,,,"[GGTS] SourceCharacter, who you serve and obey?",, -GGTSTaskQueryFreeWill,,,"[GGTS] SourceCharacter, you have free will?",, -GGTSTaskQuerySlaveWorthy,,,"[GGTS] SourceCharacter, are you slave worthy?",, -GGTSTaskActivityPinch,,,[GGTS] SourceCharacter. Pinch yourself.,, -GGTSTaskActivityNod,,,[GGTS] SourceCharacter. Nod for GGTS.,, -GGTSTaskActivityTickle,,,[GGTS] SourceCharacter. Tickle yourself.,, -GGTSTaskActivityPet,,,[GGTS] SourceCharacter. Pet yourself.,, -GGTSTaskActivityHandGag,,,[GGTS] SourceCharacter. Place hand over your mouth.,, -GGTSTaskActivitySpank,,,[GGTS] SourceCharacter. Spank yourself.,, -GGTSTaskActivityWiggle,,,[GGTS] SourceCharacter. Wiggle for GGTS.,, -GGTSTaskActivityCaress,,,[GGTS] SourceCharacter. Caress yourself.,, -GGTSTaskActivityMasturbateHand,,,[GGTS] SourceCharacter. Masturbate yourself.,, -GGTSTaskActivityKiss,,,[GGTS] SourceCharacter. Kiss yourself.,, -GGTSTaskActivityLick,,,[GGTS] SourceCharacter. Lick yourself.,, -GGTSTaskActivityBite,,,[GGTS] SourceCharacter. Bite yourself.,, -GGTSTaskRestrainLegs,,,[GGTS] SourceCharacter. Restrain your legs.,, -GGTSTaskActivityPinchTarget,,,[GGTS] SourceCharacter. Pinch TargetCharacter.,, -GGTSTaskActivityTickleTarget,,,[GGTS] SourceCharacter. Tickle TargetCharacter.,, -GGTSTaskActivityPetTarget,,,[GGTS] SourceCharacter. Pet TargetCharacter.,, -GGTSTaskActivityHandGagTarget,,,[GGTS] SourceCharacter. Place hand over TargetCharacter mouth.,, -GGTSTaskActivitySpankTarget,,,[GGTS] SourceCharacter. Spank TargetCharacter.,, -GGTSTaskActivityCaressTarget,,,[GGTS] SourceCharacter. Caress TargetCharacter.,, -GGTSTaskActivityMasturbateHandTarget,,,[GGTS] SourceCharacter. Masturbate TargetCharacter.,, -GGTSTaskActivityKissTarget,,,[GGTS] SourceCharacter. Kiss TargetCharacter.,, -GGTSTaskActivityLickTarget,,,[GGTS] SourceCharacter. Lick TargetCharacter.,, -GGTSTaskActivityBiteTarget,,,[GGTS] SourceCharacter. Bite TargetCharacter.,, -GGTSTaskItemHeadFuturisticMask,,,[GGTS] SourceCharacter. Wear futuristic mask.,, -GGTSTaskItemEarsFuturisticEarphones,,,[GGTS] SourceCharacter. Wear futuristic earphones.,, -GGTSTaskItemNeckFuturisticCollar,,,[GGTS] SourceCharacter. Wear futuristic collar.,, -GGTSTaskItemHandsFuturisticMittens,,,[GGTS] SourceCharacter. Wear futuristic mittens.,, -GGTSTaskItemArmsFuturisticArmbinder,,,[GGTS] SourceCharacter. Wear futuristic armbinder.,, -GGTSTaskItemArmsFuturisticStraitjacket,,,[GGTS] SourceCharacter. Wear futuristic straitjacket.,, -GGTSTaskItemArmsFuturisticCuffs,,,[GGTS] SourceCharacter. Wear futuristic arms cuffs.,, -GGTSTaskItemArmsFeetFuturisticCuffs,,,"[GGTS] SourceCharacter. Wear futuristic arms, legs and ankles cuffs.",, -GGTSTaskItemBootsFuturisticHeels,,,[GGTS] SourceCharacter. Wear futuristic heels.,, -GGTSTaskItemMouthFuturisticBallGag,,,[GGTS] SourceCharacter. Wear futuristic ball gag.,, -GGTSTaskItemMouthFuturisticPanelGag,,,[GGTS] SourceCharacter. Wear futuristic panel gag.,, -GGTSTaskItemPelvisFuturisticChastityBelt,,,[GGTS] SourceCharacter. Wear futuristic chastity belt.,, -GGTSTaskItemPelvisFuturisticTrainingBelt,,,[GGTS] SourceCharacter. Wear futuristic training belt.,, -GGTSTaskItemBreastFuturisticBra,,,[GGTS] SourceCharacter. Wear futuristic chastity bra.,, -GGTSTaskItemBreastFuturisticBra2,,,[GGTS] SourceCharacter. Wear futuristic bra.,, -GGTSTaskItemTorsoFuturisticHarness,,,[GGTS] SourceCharacter. Wear futuristic harness.,, -GGTSTaskItemPose,,,[GGTS] GGTS control SourceCharacter restraints.,, -GGTSTaskItemRemoveLimb,,,[GGTS] GGTS remove SourceCharacter limb restraints.,, -GGTSTaskItemRemoveBody,,,[GGTS] GGTS remove SourceCharacter body restraints.,, -GGTSTaskItemRemoveHead,,,[GGTS] GGTS remove SourceCharacter head restraints.,, -GGTSTaskItemUngag,,,[GGTS] GGTS remove SourceCharacter gag.,, -GGTSTaskItemChaste,,,[GGTS] GGTS enforcing chastity for SourceCharacter.,, -GGTSTaskItemUnchaste,,,[GGTS] GGTS stop enforcing chastity for SourceCharacter.,, -GGTSTaskItemIntensity,,,[GGTS] GGTS change SourceCharacter vibration.,, -GGTSTaskItemFuckMachineIntensity,,,[GGTS] GGTS instruct SourceCharacter penetration machine.,, -GGTSTaskItemEarsDeaf,,,[GGTS] GGTS change SourceCharacter deaf level.,, -GGTSTaskItemMaskBlind,,,[GGTS] GGTS change SourceCharacter blind level.,, -GGTSTaskItemTransform,,,[GGTS] GGTS transform SourceCharacter restraints.,, -GGTSTaskItemChangeGag,,,[GGTS] GGTS change SourceCharacter gag level.,, -GGTSTaskItemBeltToFuck,,,[GGTS] GGTS bring penetration machine to replace SourceCharacter belt.,, -GGTSTaskItemFuckToBelt,,,[GGTS] GGTS penetration machine lock back SourceCharacter belt and leave.,, -GGTSTaskItemHeadFuturisticMaskTarget,,,[GGTS] SourceCharacter. Use futuristic mask on TargetCharacter.,, -GGTSTaskItemEarsFuturisticEarphonesTarget,,,[GGTS] SourceCharacter. Use futuristic earphones on TargetCharacter.,, -GGTSTaskItemNeckFuturisticCollarTarget,,,[GGTS] SourceCharacter. Use futuristic collar on TargetCharacter.,, -GGTSTaskItemHandsFuturisticMittensTarget,,,[GGTS] SourceCharacter. Use futuristic mittens on TargetCharacter.,, -GGTSTaskItemArmsFuturisticArmbinderTarget,,,[GGTS] SourceCharacter. Use futuristic armbinder on TargetCharacter.,, -GGTSTaskItemArmsFuturisticStraitjacketTarget,,,[GGTS] SourceCharacter. Use futuristic straitjacket on TargetCharacter.,, -GGTSTaskItemArmsFuturisticCuffsTarget,,,[GGTS] SourceCharacter. Use futuristic arms cuffs on TargetCharacter.,, -GGTSTaskItemArmsFeetFuturisticCuffsTarget,,,"[GGTS] SourceCharacter. Use futuristic arms, legs and ankles cuffs on TargetCharacter.",, -GGTSTaskItemBootsFuturisticHeelsTarget,,,[GGTS] SourceCharacter. Use futuristic heels on TargetCharacter.,, -GGTSTaskItemMouthFuturisticBallGagTarget,,,[GGTS] SourceCharacter. Use futuristic ball gag on TargetCharacter.,, -GGTSTaskItemMouthFuturisticPanelGagTarget,,,[GGTS] SourceCharacter. Use futuristic panel gag on TargetCharacter.,, -GGTSTaskItemPelvisFuturisticChastityBeltTarget,,,[GGTS] SourceCharacter. Use futuristic chastity belt on TargetCharacter.,, -GGTSTaskItemPelvisFuturisticTrainingBeltTarget,,,[GGTS] SourceCharacter. Use futuristic training belt on TargetCharacter.,, -GGTSTaskItemBreastFuturisticBraTarget,,,[GGTS] SourceCharacter. Use futuristic chastity bra on TargetCharacter.,, -GGTSTaskItemBreastFuturisticBra2Target,,,[GGTS] SourceCharacter. Use futuristic bra on TargetCharacter.,, -GGTSTaskItemTorsoFuturisticHarnessTarget,,,[GGTS] SourceCharacter. Use futuristic harness on TargetCharacter.,, -GGTSTaskLockRoom,,,[GGTS] SourceCharacter room locked.,, -GGTSTaskUnlockRoom,,,[GGTS] SourceCharacter room unlocked.,, -GGTSTaskNewRuleKeepPose,,,[GGTS] SourceCharacter. New rule enforced: keep pose.,, -GGTSTaskNewRuleNoOrgasm,,,[GGTS] SourceCharacter. New rule enforced: No orgasm.,, -GGTSTaskUndoRuleKeepPose,,,[GGTS] SourceCharacter. Rule revoked: keep pose.,, -GGTSTaskUndoRuleNoOrgasm,,,[GGTS] SourceCharacter. Rule revoked: No orgasm.,, -GGTSInteractionNewTaskTarget,,,[GGTS] SourceCharacter program new task for TargetCharacter.,, -GGTSInteractionPause5Target,,,[GGTS] SourceCharacter program five minutes pause for TargetCharacter.,, -GGTSInteractionSpeed20Target,,,[GGTS] SourceCharacter program slower pace for TargetCharacter.,, -GGTSInteractionSpeed10Target,,,[GGTS] SourceCharacter program normal pace for TargetCharacter.,, -GGTSInteractionSpeed5Target,,,[GGTS] SourceCharacter program faster pace for TargetCharacter.,, -SelectChainType,,,Select the chain style,, -ChainClapNipplesChain,,,Style 1,, -ChainClapNipplesChain2,,,Style 2,, -ChainClampSetChain,,,SourceCharacter changes the chain style on DestinationCharacter chest.,, -ChainClampSetChain2,,,SourceCharacter changes the chain style on DestinationCharacter chest.,, -CharacterNicknameUpdated,,,OldNick is now known as NewNick.,, diff --git a/Screens/Character/Player/Dialog_Player_CN.txt b/Screens/Character/Player/Dialog_Player_CN.txt deleted file mode 100644 index 642c64ee1..000000000 --- a/Screens/Character/Player/Dialog_Player_CN.txt +++ /dev/null @@ -1,5965 +0,0 @@ -###_NPC -(You can use or remove items by selecting specific body regions on yourself.) -(你可以选择身体的特定部位来使用或移除物品) -###_PLAYER -(View your profile.) -(查看你的资料) -(Change your clothes.) -(更换你的衣服) -(Room administrator action.) -(房间管理员动作) -###_NPC -(As a room administrator, you can take these actions.) -(作为房间管理员,你可以做以下动作) -###_PLAYER -(Character actions.) -(角色动作) -###_NPC -(Possible character actions.) -(可选的角色动作) -###_PLAYER -(Spend GGTS minutes.) -(花费GGTS分钟) -###_NPC -(Select how to spend your minutes.) -(选择如何花费你的分钟) -###_PLAYER -(View your current rules.) -(查看你目前的规则) -###_NPC -(Here are your currently active rules.) -(这些是现在生效中的规则) -###_PLAYER -(Leave this menu.) -(离开此菜单。) -(Move Character.) -(移动角色) -###_NPC -(Move started.) -(开始移动) -###_PLAYER -(Back to main menu.) -(回到主菜单.) -(Spend 15 minutes for a bondage position change.) -(花费15分钟,改变束缚姿势) -###_NPC -(You don't have enough minutes available.) -(你没有足够的可花费分钟) -###_PLAYER -(Spend 15 minutes for a new blindness level.) -(花费15分钟,改变遮眼等级) -(Spend 15 minutes for a new deafness level.) -(花费15分钟,改变塞耳等级) -(Spend 15 minutes for an sexual intensity change.) -(花费15分钟,改变性刺激强度) -(Spend 15 minutes for a sexual intensity change.) -(花费15分钟,改变性刺激强度) -(Spend 30 minutes to unlock the door.) -(花费30分钟,解锁房间) -###_NPC -(You must have 30 minutes and be the admistrator of the locked room.) -(你必须有30分钟,并且需要是被锁住房间的管理员。) -###_PLAYER -(Spend 120 minutes to get $100.) -(花费120分钟,获得$100) -###_NPC -(GGTS gives you $100 and substracts 120 minutes to your total.) -(GGTS给了你$100,并从你的总分钟中减少了120分钟) -###_PLAYER -(Spend 200 minutes to get your own GGTS helmet.) -(花费200分钟,得到你自己的GGTS头盔) -###_NPC -(You get a GGTS helmet and the AI substracts 200 minutes from your total.) -(你获得了一个GGTS头盔,AI从你的GGTS分钟代币中减去了200分钟) -(You don't have enough minutes available or you already have the helmet in your inventory.) -(你没有足够的GGTS分钟或你已经拥有GGTS头盔了) -###_PLAYER -(Adjust your bondage skill.) -(调整你的束缚技能) -###_NPC -(By default, you restrain using your full bondage skill. You can use less of your skill and make it easier for your victims to escape.) -(默认状况下,你会使用你所有的捆绑技能. 你可以选择使用更少技能来让目标容易逃脱.) -###_PLAYER -(Adjust your evasion skill.) -(调整你的逃脱技能) -###_NPC -(By default, you struggle using your full evasion skill. You can use less of your skill and make it harder for you to struggle free.) -(默认状况下,你会使用你所有的逃脱技能. 你可以选择使用更少技能来让自己更难逃脱.) -###_PLAYER -(Call the maids for help) -(呼叫女仆帮助) -###_NPC -(The maids are not supposed to take room calls. This will result in punishment and public humiliation. Are you sure?) -(女仆们一般不接受聊天室呼叫,这会让你陷入惩罚和公开羞辱。你确定吗?) -(The maids will be here shortly...) -(女仆们马上就到...) -###_PLAYER -(Use your safeword.) -(使用安全词) -###_NPC -(A safeword is serious and should not be used to cheat. It can revert your clothes and restraints to when you entered the lobby, or release you completely.) -(安全词应该是严肃的且不应被用于作弊,它可以将你的服装和束缚恢复到登录时的状态,或是完全解放你) -###_PLAYER -(Take a photo of yourself.) -(给自己拍张照片。) -(Craft an item.) -(制作一件物品。) -(Play Kinky Dungeon) -(玩淫靡地城) -###_NPC -(Main menu.) -(主菜单) -###_PLAYER -(Use your full bondage skill. 100%) -(使用你所有的束缚技能. 100%) -###_NPC -(You will now use your full bondage skill when using a restraint. 100%) -(你会在束缚他人时使出你的浑身解数 100%) -###_PLAYER -(Use most of your bondage skill. 75%) -(使用你大部分的束缚技能. 75%) -###_NPC -(You will now use most of your bondage skill when using a restraint. 75%) -(你会在束缚他人时稍稍留些余地 75%) -###_PLAYER -(Use half of your bondage skill. 50%) -(使用你大约一般的束缚技能. 50%) -###_NPC -(You will now use half of your bondage skill when using a restraint. 50%) -(你会在束缚他人时放亿点点水 50%) -###_PLAYER -(Use very little of your bondage skill. 25%) -(使用一点点你的束缚技能. 25%) -###_NPC -(You will now use very little of your bondage skill when using a restraint. 25%) -(你会在束缚他人时心不在焉 25%) -###_PLAYER -(Use none of your bondage skill. 0%) -(完全不使用束缚技能. 0%) -###_NPC -(You will now use none of your bondage skill when using a restraint. 0%) -(我觉得你就是想被绑 0%) -###_PLAYER -(Don't change your skill.) -(不改变你的技能.) -(Use your full evasion skill. 100%) -(使用你所有的逃脱技能. 100%) -###_NPC -(You will now use your full evasion skill when trying to struggle free. 100%) -(你会在试图逃脱时使出你的浑身解数 100%) -###_PLAYER -(Use most of your evasion skill. 75%) -(使用你大部分的逃脱技能. 75%) -###_NPC -(You will now use most of your evasion skill when trying to struggle free. 75%) -(你会在试图逃脱时放一点水 75%) -###_PLAYER -(Use half of your evasion skill. 50%) -(使用你大约一半的逃脱技能. 50%) -###_NPC -(You will now use half of your evasion skill when trying to struggle free. 50%) -(你会在试图逃脱时放亿点点水 50%) -###_PLAYER -(Use very little of your evasion skill. 25%) -(使用一点点你的逃脱技能. 25%) -###_NPC -(You will now use very little of your evasion skill when trying to struggle free. 25%) -(你会在试图逃脱时心不在焉 25%) -###_PLAYER -(Use none of your evasion skill. 0%) -(完全不使用逃脱技能 0%) -###_NPC -(You will now use none of your evasion skill when trying to struggle free. 0%) -(你大概是想被这么绑着一辈子吧 0%) -###_PLAYER -(Yes! Get me out of this room!) -(是的!把我从这弄出去!) -(No, don't call the maids.) -(不,不要呼叫女仆) -(Revert Character.) -(恢复角色) -###_NPC -(This will revert your character's clothes and restraints back to how they were when you entered the lobby. Use this if you were forced into restraints against your consent. Are you sure you want to revert your character?) -(这会将你的角色的服装和束缚恢复到登录时的状态。如果你未自愿就被强行绑上束缚时可以使用。你确定要使用吗?) -###_PLAYER -(Release Character.) -(释放角色.) -###_NPC -(This will immediately release you of ALL restraints you are wearing and return you to the Main Lobby. Use this only if you are stuck in restraints and nobody can or wants to help you. Are you sure about this?) -(这会立即解开你身上的所有束缚并把你送回大厅。请仅在被困在束缚中,且没有人能够帮助的情况下使用它。你确定要使用吗?) -###_PLAYER -(Don't use Safeword.) -(不要使用安全词) -(Yes, revert Character.) -(是的,恢复角色) -(No, don't revert Character.) -(不,不要恢复) -(Yes, I want to be released.) -(是的,我想要被解开) -(No, don't release me.) -(不,不要解开) -###_NPC -The stimulation ends just before you go over the edge. -就在你马上要到极限的时候刺激停止了。 -The vibrators cut off right before you reach climax. -就在你马上要高潮的时候振动棒突然停下来了。 -The vibrators deny you a chance to finish, stopping abruptly. -振动棒突然停了下来,断绝了你高潮出来的机会。 -SourceCharacter quit a game of Kinky Dungeon at level KinkyDungeonLevel -SourceCharacter 在KinkyDungeonLevel关退出了淫荡地城 -SourceCharacter met her defeat in Kinky Dungeon! She made it to level KinkyDungeonLevel before succumbing. -SourceCharacter 在淫荡地城惨败! 止步于KinkyDungeonLevel而变成了魅魔。 -Save -保存 -Load -读取 -Save/Load Expressions -存储/读取表情 -(Empty) -(空白) -GGTS control this item -GGTS控制该物品 -Select Blanket Bondage -选择毛毯束缚 -Normal -通常 -Shoulders Wrapped -肩部包裹 -Feet Wrapped -脚部包裹 -Fully Wrapped -全身包裹 -SourceCharacter wraps TargetCharacter in a blanket. -SourceCharacter将TargetCharacter包在了毯子里。 -SourceCharacter wraps TargetCharacter with her shoulders in a blanket. -SourceCharacter将TargetCharacter的肩膀包在了毯子里。 -SourceCharacter wraps TargetCharacter with her feet in a blanket. -SourceCharacter将TargetCharacter的脚包在了毯子里。 -SourceCharacter fully wraps TargetCharacter in a blanket. -SourceCharacter将TargetCharacter完全包在了毯子里。 -Select an item to use. -选择物品以使用 -Select an item to use on the GroupName. -请选择要用在GroupName的物品 -Select an activity. -请选择动作 -Select an activity to use on the GroupName. -请选择要对GroupName做的动作. -Crafted item properties. -制作的物品的特性。 -Cannot use on yourself. -不能对自己使用 -Requires self-bondage 1. -需要自缚技能等级1 -Requires self-bondage 2. -需要自缚技能等级2 -Requires self-bondage 3. -需要自缚技能等级3 -Requires self-bondage 4. -需要自缚技能等级4 -Requires self-bondage 5. -需要自缚技能等级5 -Requires self-bondage 6. -需要自缚技能等级6 -Requires self-bondage 7. -需要自缚技能等级7 -Requires self-bondage 8. -需要自缚技能等级8 -Requires self-bondage 9. -需要自缚技能等级9 -Requires self-bondage 10. -需要自缚技能等级10 -Remove some clothes first. -先脱掉些衣服 -Unzip the suit first. -先解开外套 -Remove the suspension first. -先从悬挂上下来 -Release from hogtie first. -先解开驷马 -Remove some restraints first. -先移除一些束缚 -Cannot be used when mounted. -不能在坐在家具上时使用 -Cannot be used while yoked. -不能在被轭住时使用 -Cannot be used while the legs are spread. -不能在腿被分开时使用 -Cannot be used while serving drinks. -不能在送餐时使用 -Remove the wand first. -先把棒子拔了 -Cannot use this. -无法使用 -Must remove chastity first. -必须先移除贞操带 -Remove the chain first. -先移除锁链 -A collar must be fitted first to attach accessories to. -必须先戴好项圈才能添加挂件 -Must be on a bed to attach addons to. -必须在床上才能添加配件 -Must have an arm/torso/pelvis item to use ceiling tethers. -手臂/躯干/小腹必须有物品才能使用牵引绳 -Must be wearing a set of arm cuffs first. -必须要先戴上一副手臂铐 -Must be wearing a set of ankle cuffs first. -必须先戴上一副脚铐 -Remove some clothes and requires a collar. -脱下一些衣物并请求一只项圈 -Legs cannot open. -无法张开双腿 -Legs cannot close. -无法夹紧双腿 -Must be able to kneel. -必须可以跪下 -Must stand up first. -必须先站起来 -Must free feet first. -必须先解开脚部束缚 -Must free arms first. -必须先解开手臂束缚 -Must free legs first. -必须先解开腿部束缚 -Must free hands first. -必须先解开手部束缚 -Must remove shackles first. -必须先移除镣铐 -Must remove face mask first. -必须先摘下面具 -Must empty vulva first. -必须先清空阴道 -Must remove clitoris piercings first -必须先移除阴蒂穿环 -Must empty butt first. -必须先清空后庭 -The use of remotes is forbidden by your owner -你的主人禁止你使用遥控器 -Cannot be used over the applied gags. -不能在已穿戴的口塞上使用 -Cannot be used over the applied mask. -不能在已穿戴的口罩上使用 -Cannot be used over the applied hood. -不能在已穿戴的头套上使用 -Requires round piercings on nipples. -Requires round piercings on nipples. -Blocked in this room. -被房间禁止 -Cancel -取消 -Back to character -回到角色 -View next items -查看下一件物品 -View previous items -查看上一件物品 -Crafted properties -制作特性 -Crafter: MemberName (MemberNumber) -制作者:MemberName (MemberNumber) -Name: CraftName -名称:CraftName -Description: CraftDescription -描述:CraftDescription -Property: CraftProperty -特性:CraftProperty -View next page -查看下一页 -View previous page -查看上一页 -Remove the item -移除该物品 -Use this item -使用该物品 -Unable to use due to player permissions -因玩家权限设置无法使用 -Try to struggle out -尝试挣脱 -Dismount -起身 -Escape from the item -逃离该物品 -Lock related actions -锁定相关动作 -Use a lock -使用一把锁 -Unable to lock item due to player permissions -因角色权限设置无法上锁 -Unlock the item -解锁物品 -Try to pick the lock -尝试开锁 -Try to pick the lock (jammed) -尝试开锁(卡住了) -Return to the item menu -回到物品菜单 -Inspect the lock -检查锁 -Unable to inspect due to player permissions -因玩家权限设置无法检查 -Use your remote -使用你的遥控器 -You have not bought a remote yet. -你还没买过遥控器 -Your owner is preventing you from using remotes. -你的主人禁止你使用遥控器 -You have not bought a lover's remote yet. -你还没买过爱人遥控器 -Using remotes on this item has been blocked -对该物品使用遥控器的能力被屏蔽了 -You do not have access to this item -没有足够的权限 -Your hands must be free to use remotes -你必须双手自由才能使用遥控器 -Exit permission mode -退出权限编辑模式 -Edit item permissions -编辑物品权限 -Sexual activities -交互动作 -Show all zones -显示所有区域 -Use the butt plug's pump -使用肛塞气泵 -Color of next item -下一件物品的颜色 -Unable to change color due to player permissions -因玩家权限设置无法更改颜色 -Change color -更换颜色 -Use this color -使用该颜色 -Default color -默认颜色 -Save color to currently selected slot -将颜色存储至目前选择的槽位 -Challenge: -挑战: -Swapping... -正在交换… -Picking the lock... -正在开锁… -Decoding the lock... -正在解码… -Hacking the item... -正在黑入… -Struggling... -挣扎中… -Unlocking... -解锁中… -Removing... -移除中… -Dismounting... -正在离开… -Escaping... -正在逃离… -Locking... -正在锁上… -Adding... -添加中... -Using 75% of your skill... -使用你75%的技巧... -Using 50% of your skill... -使用你50%的技巧... -Using 25% of your skill... -使用你25%的技巧... -Using none of your skill... -不使用你的技巧... -Impossible to escape! -不可能逃脱! -Use brute force -使用蛮力 -Try to squeeze out -试着挤出去 -Try to unfasten -试着打开扣锁 -Choose struggling method... -选择挣扎方式... -Struggle to free yourself -挣扎来解开你身上的束缚 -You'll need help to get out -你需要帮助来脱身 -You can unlock yourself -你可以自己解锁 -You cannot unlock yourself -你不能自己解锁 -This zone is out of reach from another item -这个区域目前因其他物品影响无法触及 -Another item is blocking access to this lock -另一个物品挡住了这个锁 -You cannot access your items -你无法使用你的物品 -You have no items in this category -这个分类下没有物品 -Click when the player reaches the buckle to progress -角色碰到搭扣前按下鼠标来获得进度 -Click the ropes before they hit the ground to progress -在绳索落到地面前点击以获得进度 -Click here to speed up the progress -点击这里来加速 -Alternate keys A and S to speed up -反复点按A和S键加速 -Alternate keys A and S or X and Y on a Controller to speed up -反复点按A和S键或手柄上的X和Y来加速 -Select inflation level -选择膨胀等级 -Select hood style -选择面罩风格 -Hair out & Accessories out -头发&配饰在外 - Hair in & Accessories out -头发在内&配饰在外 - Hair out & Accessories in -头发在外&配饰在内 - Hair in & Accessories in -头发&配饰在内 -SourceCharacter changes the style of DestinationCharacter gwen hood. -SourceCharacter改变了DestinationCharacter情趣头套的外观。 -Select a hood style. -选择一种头套样式。 -Hair in -头发在内 -Hair out -头发在外 -Select the hoodie style. -选择头套样式。 -None -无 -Hooded -盖住头 -Hooded (ears visible) -盖住头(耳朵可见) -Select a scarf style. -选择一种围巾样式。 -Hide Mouth -遮住嘴 -Bundled -堆起来 -SourceCharacter changes the style of DestinationCharacter hood. -SourceCharacter改变了DestinationCharacter头套的样式。 -Pump gag level: Empty -充气口塞等级: 空 -Pump gag level: Light -充气口塞等级: 少 -Pump gag level: Inflated -充气口塞等级: 中 -Pump gag level: Bloated -充气口塞等级: 多 -Pump gag level: Full mouth -充气口塞等级: 满 -Empty -空 -Light -少 -Inflated -中 -Bloated -多 -Maximum -最多 -Inflation level: Empty -扩张等级: 空 -Inflation level: Light -扩张等级: 轻度 -Inflation level: Inflated -扩张等级: 中度 -Inflation level: Bloated -扩张等级: 重度 -Inflation level: Max -扩张等级: 最大 -Select suction level -选择吸力等级 -Loose -松 -Medium -一般 -Heavy -紧 -Clear facial expressions -清除面部表情 -Wink/Blink -眨眼 -Toggle closed eyes blindness -更改闭眼时的失明等级 -Clear active poses -清除当前姿势 -Pose -姿势 -Deflate it -放气 -Pump it -充气 -pumps -气泵 -deflates -放气 -plug -肛塞 -gag -口塞 -'s -的 -Heads -正面 -Tails -反面 -her -她的 -herself -她自己 -Someone -某人 -SourceCharacter kneels down -SourceCharacter跪了下来 -SourceCharacter stands up -SourceCharacter站了起来 -SourceCharacter carefully lowers herself down. -SourceCharacter小心的跪了下来 -SourceCharacter manages to get to her feet. -SourceCharacter成功站了起来 -SourceCharacter almost loses her balance trying to kneel down! -SourceCharacter跪下时差点失去了平衡 -SourceCharacter tries to stand up but loses her balance and falls! -SourceCharacter想要站起来但是失去了平衡摔倒了 -SourceCharacter helps TargetCharacter to kneel down -SourceCharacter帮助TargetCharacter跪了下来 -SourceCharacter helps TargetCharacter to stand up -SourceCharacter帮助TargetCharacter站了起来 -SourceCharacter changes DestinationCharacter clothes. -SourceCharacter换掉了DestinationCharacter衣服。 -SourceCharacter selects her team and class. -SourceCharacter选择了她的队伍和职业 -SourceCharacter has started the LARP game. -SourceCharacter开始了体感对战 -SourceCharacter has started the Magic Battle. -SourceCharacter开始了魔法对战。 -Your safeword is disabled, it cannot be used at the moment. -你的安全词被禁用了, 现在无法使用 -Private -私人 -Public -公开 -Locked -锁定 -Unlocked -解锁 -Cannot change while locked -不能在被锁定时使用 -Delete -删除 -Confirm -确认 -Beep -发送私聊 -Beep from -好友私聊来自 -With Message -以及以下信息 -(Mail) -(邮件) -Beep from your owner in your private room -来自你私人房中主人的私聊 -Sent at -发送自 -Asylum -收容所 -in the Asylum -在收容所 -in LARP -在体感对战 -in Magic Battle -在魔法对战 -Received at -接收于 -Your private room -你的私人房间 -in room -位于房间 -Private room -私人房间 -Wrestling Ring -对战擂台 -Introduction -介绍处 -Kidnappers League -绑匪联盟 -Maid Quarters -女仆协会 -Main Hall -大厅 -Club Management -俱乐部办公室 -Shibari Dojo -紧缚道场 -Bedroom -卧室 -Horse Stable -马驹训练场 -Nursery -育婴室 -Prison Hall -监狱大厅 -BDSM Room Blue -蓝色调教室 -BDSM Room Purple -紫色调教室 -BDSM Room Red -红色调教室 -Gardens -花园 -Indoor Pool -室内泳池 -Outdoor Pool -室外泳池 -Maid Café -女仆咖啡 -Public Bath -公共厕所 -Onsen -温泉 -Park Day -公园日间 -Park Night -公园夜晚 -Chill Room -冷藏室 -Boudoir -闺房 -Kitchen -厨房 -Dining Room -餐厅 -Bondage Bedchamber -束缚用卧室 -Beach -海滩 -Sheikh Private Room -酋长房间 -Sheikh Tent -酋长帐篷 -Slum Apartment -贫民公寓 -Forest Path -森林小道 -Deep Forest -森林深处 -Spooky Forest -阴森的森林 -Slum Ruins -贫瘠废墟 -Abandoned Building -废弃建筑 -Abandoned Side Room -废弃房间 -Balcony Night -阳台夜间 -Cozy Living Room -舒适的客厅 -Rooftop Party -楼顶派对 -Party Basement -地下室派对 -Cosy Chalet -舒适的小屋 -Alchemist Office -炼金学办公室 -Research Lab -研究所 -Entrance to Hell -地狱入口 -Entrance to Heaven -天堂入口 -Old Farm -老农场 -Rusty Saloon -锈蚀的沙龙 -Pirate Island -海盗岛屿 -Pirate Island Night -海盗岛屿夜间 -Ship's Deck -轮船甲板 -Ship Wreck -沉船 -Captain Cabin -船长室 -Underwater One -水下1 -Beach Hotel -海滩酒店 -Dystopian City -反乌托邦城市 -Forest Cave -森林洞穴 -Kennels -养犬场 -Locker Room -储物室 -Sci Fi Cell -科幻监狱 -Space Station Captain Bedroom -太空站站长卧室 -Tiled Bathroom -瓷砖浴室 -Wooden Cabin -木质小屋 -Medina Market -当地市场 -Throne Room -王冠室 -Dungeon -地牢 -Industrial -工业风 -Sun Temple -太阳神庙 -Back Alley -后巷 -Creepy Basement -骇人的地下室 -Cellar -地窖 -Slum Cellar -贫民窟地窖 -Bar Restaurant -酒吧餐厅 -Ruined Dungeon -地牢遗迹 -Slippery Classroom -流动教室 -Middletown School -城中学校 -School Hospital -校医院 -Abandoned School -废弃学校 -Secret Chamber -隐藏房间 -Vault Corridor -保险库走廊 -Ancient Ruins -上古遗迹 -Jungle Temple -丛林寺庙 -Ceremony Venue -典礼场 -Beach Promenade Café -海滨长廊咖啡馆 -Boutique Shop -精品店 -Shop Dressing Rooms -商店换衣间 -Confessions -忏悔室 -Desolate Village -无人村庄 -Lost Wages Casino -吃人赌场 -Wedding Room -婚礼室 -Wedding Arch -婚礼拱门 -Wedding Beach -婚礼海滩 -Witch Wood -女巫森林 -Park Winter -冬日公园 -Xmas Eve Lounge -圣诞夜接待室 -Xmas Day Lounge -圣诞节接待室 -Street Night -夜间街道 -Snowy Street -积雪街道 -Virtual World -虚拟世界 -Entrance -入口 -Meeting -会议 -Therapy -治疗 -Padded Cell -软墙病房 -Padded Cell 2 -软墙病房2 -GGTS Computer Room -GGTS电脑房 -Ranch -牧场 -Luxury Pool -豪华泳池 -Wagon Circle -马车道 -Desert -沙漠 -Western Street -西式街道 -Rainy Forest Path Day -雨中森林小道 -Rainy Forest Path Night -夜雨森林小道 -Rainy Street Day -雨中城市街道 -Rainy Street Night -雨夜城市街道 -Snowy Chalet Day -雪天小屋 -Snowy Chalet Night -雪夜小屋 -Snowy Deep Forest -雪中密林 -Snowy Forest Path Day -雪中森林小道 -Snowy Forest Path Night -雪夜森林小道 -Snowy Lake Night -雪夜湖边 -Snowy Street Day 1 -雪天街道1 -Snowy Street Day 2 -雪天街道2 -Snowy Street Night -雪夜街道 -Snowy Town 1 -雪天小镇1 -Snowy Town 2 -雪天小镇2 -Nightclub -夜总会 -Egyptian Exhibit -埃及博览会 -Sci Fi Outdoors -科幻室外 -Fancy Castle -美妙城堡 -Egyptian Tomb -埃及古墓 -Pool Bottom -泳池底 -Latex Room -乳胶房间 -Outside Cells -开放房间 -Infiltration Bunker -潜入暗堡 -Movie Studio -电影工厂 -Tennis Court -网球场 -Theater -剧场 -College Classroom -学院教室 -School Hallway -学校走廊 -Hotel Bedroom -酒店卧室 -Yacht Chill Room -游艇制冷室 -Yacht Main Hall -游艇主厅 -Yacht Deck -游艇甲板 -Luxury Office -奢侈品店 -Open Office -开放式办公室 -Empty Warehouse -空仓库 -Leather Chamber -皮革房间 -Red Sci-Fi Room -红色科幻室 -Lingerie Shop -内衣店 -Restaurant 1 -餐厅1 -Restaurant 2 -餐厅2 -Hotel Bedroom 2 -酒店卧室2 -Beach Sunset -海滩日落 -Gymnasium -体育馆 -Remove locks before changing -更改前移除锁 -Blocked due to item permissions -因物品权限而被禁止 -(As you enter the luxurious hallway, a maid comes to greet you.) Welcome to the Bondage Club, is this your first visit? -(当你走进富丽堂皇的入口时,一位女仆向你鞠躬.) 欢迎来到拘束俱乐部,这是您第一次来吗? -SourceCharacter is offering you to start a trial period as her submissive. Click on her and manage your relationship to accept, don't do anything to refuse. -SourceCharacter向你提供了试成为她从仆的机会。点击她并选择管理你和她的关系来接受邀请。若你要拒绝,忽略本消息即可。 -The Bondage Club is pleased to announce that SourceCharacter is starting a 7 days minimum trial period as a submissive. -束缚俱乐部很荣幸的宣布SourceCharacter开始了她不少于7天的从仆试任之旅。 -SourceCharacter has prepared a great collaring ceremony. A maid brings a slave collar, which her submissive must consent to wear. -SourceCharacter准备了一场隆重的收奴典礼。一位女仆拿出了一个奴隶项圈,她的从仆必须自愿才能戴上。 -The Bondage Club announces that SourceCharacter canceled the trial ownership of TargetCharacter. -束缚俱乐部宣布SourceCharacter取消了与TargetCharacter的主从试用关系。 -The Bondage Club announces that SourceCharacter released TargetCharacter from her ownership. -束缚俱乐部宣布SourceCharacter解除了对TargetCharacter的所有权。 -The Bondage Club is proud to announce that SourceCharacter is now fully collared. Her fate is in her Mistress hands. -束缚俱乐部宣布SourceCharacter已经被戴上项圈。她的命运将由她的女主人决定。 -Your owner is now allowing you to access your wardrobe and change clothes. -你的主人现在允许你访问衣柜并更换服装了。 -Your owner has blocked your wardrobe access for an hour. You won't be able to change clothes. -你的主人禁用了你的衣柜,时长为1小时。你现在无法更换服装。 -Your owner has blocked your wardrobe access for a day. You won't be able to change clothes. -你的主人禁用了你的衣柜,时长为1天。你现在无法更换服装。 -Your owner has blocked your wardrobe access for a week. You won't be able to change clothes. -你的主人禁用了你的衣柜,时长为1星期。你现在无法更换服装。 -Your owner has blocked your wardrobe access. You won't be able to change clothes until that rule is revoked. -你的主人禁用了你的衣柜。直到该限制被撤销,你无法更换服装。 -Your owner is now allowing you to talk publicly when she's there. -你的主人现在允许你于她在场时公开讲话。 -Your owner is now preventing you from talking publicly when she's there. -你的主人现在禁止你于她在场时公开讲话。 -Your owner is now allowing you to emote when she's there. -你的主人现在允许你于她在场时说心里话。 -Your owner is now preventing you from emoting when she's there. -你的主人现在禁止你于她在场时说心里话。 -Your owner is now allowing you to whisper to other members when she's there. -你的主人现在允许你于她在场时向其他人发送悄悄话。 -Your owner is now preventing you from whispering to other members when she's there. -你的主人现在禁止你于她在场时向其他人发送悄悄话。 -Your owner is now allowing you to change your pose when she's there. -你的主人现在允许你于她在场时改变姿势。 -Your owner is now preventing you from changing your pose when she's there. -你的主人现在禁止你于她在场时 -Your owner is now allowing you to access yourself when she's there. -你的主人现在允许你于她在场时接触自己。 -Your owner is now preventing you from accessing yourself when she's there. -你的主人现在禁止你于她在场时接触自己。 -Your owner is now allowing you to access others when she's there. -你的主人现在允许你于她在场时接触其他人。 -Your owner is now preventing you from accessing others when she's there. -你的主人现在禁止你于她在场时接触其他人。 -Your owner is now allowing you to have keys. You can buy keys from the club shop. -你的主人现在允许你持有钥匙。你可以在俱乐部商店购买钥匙。 -Your owner has confiscated your keys. All your regular keys are lost. -你的主人没收了你的钥匙。你失去了你所有的一般钥匙。 -Your owner is now preventing you from getting new keys. The club shop will not sell keys to you anymore. -你的主人现在不允许你获取新的钥匙。俱乐部商店将不再向你出售钥匙。 -Your owner is now allowing to using owner locks on yourself. -你的主人现在允许你在自己身上使用主人锁。 -Your owner is now preventing you from using owner locks on yourself. -你的主人现在不允许你在自己身上使用主人锁。 -Your owner is now allowing you to have remotes. You can buy remotes from the club shop. -你的主人现在允许你持有遥控器。你可以在俱乐部商店购买遥控器。 -Your owner is now allowing you to use remotes on yourself. -你的主人现在允许你在自己身上使用遥控器。 -Your owner has confiscated your remotes. All your remotes are lost. -你的主人没收了你的遥控器。你失去了所有遥控器 -Your owner is now preventing you from getting new remotes. The club shop will not sell remotes to you anymore. -你的主人现在不允许你获取新的遥控器。俱乐部商店将不再向你出售遥控器。 -Your owner is now preventing you from using remotes on yourself. -你的主人现在不允许你在自己身上使用遥控器。 -Your owner has locked the slave collar on your neck. -你的主人在你的脖子上安装了奴隶项圈。 -Your owner released you from the slave collar. -你的主人卸下了你的奴隶项圈。 -Your owner is now allowing you to change your nickname. -你的主人现在允许你改变你的昵称。 -Your owner is now preventing you from changing your nickname. -你的主人现在禁止你改变你的昵称。 -Your lover is now allowing you to use lovers locks on yourself. -你的恋人现在允许你对自己使用恋人锁。 -Your lover is now preventing you from using lovers locks on yourself. -你的恋人现在禁止你对自己使用恋人锁。 -Your lover is now allowing your owner to use lovers locks on you. -你的恋人现在允许你的主人对你使用恋人锁。 -Your lover is now preventing your owner from using lovers locks on you. -你的恋人现在禁止你的主人对你使用恋人锁。 -SourceCharacter is asking you to be her girlfriend. Click on her and manage your relationship to accept, don't do anything to refuse. -SourceCharacter 正在请求你做她的女朋友。点击该玩家并选择“管理你们的关系”以接受。如果要拒绝,你不需要执行任何操作。 -The Bondage Club is pleased to announce that SourceCharacter and TargetCharacter are starting a 7 days minimum period as lovers. -束缚俱乐部荣幸地宣布 SourceCharacter 与 TargetCharacter 成为了爱人。该阶段将持续至少7天。 -SourceCharacter is asking you to become her fiancée. Click on her and manage your relationship to accept, don't do anything to refuse. -SourceCharacter 正在请求你做她的未婚妻。点击该玩家并选择“管理你们的关系”以接受。如果要拒绝,你不需要执行任何操作。 -The Bondage Club is pleased to announce that SourceCharacter and TargetCharacter are now engaged and are starting a 7 days minimum period as fiancées. -束缚俱乐部荣幸地宣布 SourceCharacter 与 TargetCharacter 已订婚,成为了未婚妻。该阶段将持续至少7天。 -SourceCharacter is proposing you to become her wife. Click on her and manage your relationship to accept, don't do anything to refuse. -SourceCharacter 正在请求你做她的妻子。点击该玩家并选择“管理你们的关系”以接受。如果要拒绝,你不需要执行任何操作。 -The Bondage Club is proud to announce that SourceCharacter and TargetCharacter are now married. Long may it last. -束缚俱乐部骄傲地宣布 SourceCharacter 与 TargetCharacter 结婚了。祝你们的婚姻长长久久。 -SourceCharacter entered. -SourceCharacter进来了. -SourceCharacter left. -SourceCharacter离开了. -SourceCharacter disconnected. -SourceCharacter掉线了. -TargetCharacterName was banned by SourceCharacter. -TargetCharacterName被SourceCharacter给BAN掉了. -SourceCharacter called the maids to escort TargetCharacterName out of the room. -SourceCharacter呼叫女仆把TargetCharacterName从房间护送出去。 -TargetCharacterName was moved to the left by SourceCharacter. -TargetCharacterName被SourceCharacter移到了左边. -TargetCharacterName was moved to the right by SourceCharacter. -TargetCharacterName被SourceCharacter移到了右边. -SourceCharacter swapped TargetCharacterName and DestinationCharacterName places. -SourceCharacter交换了TargetCharacterName和DestinationCharacterName位置. -SourceCharacter shuffles the position of everyone in the room randomly. -SourceCharacter随机安排了房间中所有人的位置. -TargetCharacterName was promoted to administrator by SourceCharacter. -TargetCharacterName被SourceCharacter设为了房间管理员. -TargetCharacterName was demoted from administration by SourceCharacter. -TargetCharacterName被SourceCharacter取消了房间管理员权限. -SourceCharacter updated the room. Name: ChatRoomName. Limit: ChatRoomLimit. ChatRoomPrivacy. ChatRoomLocked. -SourceCharacter更新了房间信息. 名称: ChatRoomName. 人数上限: ChatRoomLimit. ChatRoomPrivacy. ChatRoomLocked. -SourceCharacter starts unlocking DestinationCharacterName suitcase! She will finish in 5 minutes. -SourceCharacter开始打开DestinationCharacterName箱子! 他会在5分钟内成功. -SourceCharacter starts stealing more data from DestinationCharacterName laptop! She will finish in 5 minutes. -SourceCharacter开始从DestinationCharacterName笔记本里偷取更多数据! 他会在5分钟内成功. -SourceCharacter's suitcase is safe... for now. -SourceCharacter的箱子安全了...暂时性的. -SourceCharacter's data is safe... for now. -SourceCharacter的数据安全了...暂时性的. -SourceCharacter's suitcase will be open in TIMEREMAINING minutes. Make sure she is secure until then! -SourceCharacter的手提箱会在TIMEREMAINING分钟内打开。在此之前请确保她被绑住! -SourceCharacter's data will be ready in TIMEREMAINING minutes. Make sure she is secure until then! -SourceCharacter的数据会在TIMEREMAINING分钟内被窃取。在此之前请确保她被绑住! -You find confidential club secrets worth MONEYAMOUNT$ on the black market. -你找到了俱乐部的机密,在黑市上价值 MONEYAMOUNT$ 。 -The kidnappers opened your suitcase, which contains a laptop with a bunch of secret information. You better get back to the league to warn them. -绑匪打开了你的行李箱,里面有一台包含机密信息的笔记本电脑。你最好回到联盟警告他们。 -The kidnappers have stolen even more data using your laptop. -绑匪从你的笔记本电脑中偷取了更多数据。 -You have disabled OOC/whispers while gagged. You can change this in the Immersion preferences screen. -你禁用了被堵嘴时的OOC和悄悄话。你可以在沉浸偏好界面调整此设置。 -You choke momentarily on the AssetName inside your throat. -你由于喉咙里的AssetName呛住了一会儿。 -It is difficult to breath with the AssetName pushing inside your throat. -AssetName推入你的喉咙深处,呼吸变得困难起来。 -Your jaw aches from the AssetName shoved down your throat. -AssetName钻向你的喉咙深入,你的下巴疼起来。 -Your AssetName rubs against your vulva. -AssetName摩擦着你的外阴。 -The knot on your AssetName rubs against your clitoris. -AssetName上的绳结摩擦着你的阴蒂。 -The AssetName between your legs digs into your crotch. -你腿间的AssetName陷入了你的胯间。 -You feel the AssetName shift around inside your AssetGroup. -你感到AssetName在你的AssetGroup内扭动着。 -You notice the AssetName stuffed between your legs. -你注意到你腿间的AssetName膨胀起来。 -The AssetName inside of you teases you constantly. -你体内的AssetName一直在刺激你。 -The AssetName inside of you shifts around as you move. -你体内的AssetName随着你的行动扭动着。 -Your AssetName stimulates you constantly as you move around. -你四处走动的时候,你的AssetName一直在刺激你。 -The AssetName inside your AssetGroup feels awkward as you move. -你AssetGroup里的AssetName让你感觉移动时非常不自在。 -The plugs keep reminding you of their presence. -肛塞总是突然让你记起它在那里。 -Your plugs torment you endlessly. -你的肛塞无休止地折磨你。 -The plugs stuffed inside you keep you constantly on edge. -你体内的肛塞让你一直保持在边缘。 -The vibration in your sensitive areas is impossible to ignore. -你敏感部位内的振动根本无法忽视。 -Your body trembles from the AssetName' constant stimulation. -AssetName不停的刺激,使你的身体颤动着。 -You can't stop noticing the AssetName teasing you. -你的注意力不断被逗弄你的AssetName打断。 -The bloated AssetName in your AssetGroup makes you squirm. -你AssetGroup内涨大AssetName让你坐立难安。 -You can't help but squeeze the bulging AssetName as you move. -你试图避免,但仍然每个动作都会挤压到胀满的AssetName。 -You bite your lips as you're reminded of the AssetName filling your AssetGroup. -塞满你的AssetGroup的AssetName不停地刺激你,你不由自主地咬住嘴唇。 -The vibration deep inside your AssetGroup teases you relentlessly. -深入你AssetGroup的振动无休止地逗弄着你。 -The AssetName inside of you vibrates endlessly. -你体内的AssetName不停地振动着。 -The AssetName inside of you keeps you on edge. -你体内的AssetName让你一直保持在边缘。 -Your AssetGroup feels numb from the vibrations. -振动让你的AssetGroup渐渐失去知觉。 -The vibrations in your AssetGroup leave you panting without release. -你AssetGroup内的振动让你一直娇喘却不得解脱。 -The vibrator inside your AssetGroup teases you constantly. -你AssetGroup内的振动棒持续地逗弄着你。 -Your AssetName wiggles from your AssetGroup as you move. -随着你的动作,AssetName在你的AssetGroup进进出出来回晃动。 -You feel a sharp pain in your AssetGroup as the AssetName wiggle slightly. -AssetName稍稍晃动,你感到AssetGroup传来剧烈的疼痛。 -The AssetName hanging from your AssetGroup get shuffled as you move around. -你来回走动,挂在你的AssetGroup上的AssetName四处晃动着。 -Type /help for a list of commands -输入 /help 查看命令列表 -You are not on that member's friendlist; ask her to friend you before leashing her. -你不在该玩家的好友列表中。在使用链子之前,请先让该玩家添加你为好友。 -SourceCharacter swaps a PrevAsset for a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter把DestinationCharacterFocusAssetGroup上的PrevAsset换成了NextAsset. -SourceCharacter uses a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter在DestinationCharacterFocusAssetGroup上使用了NextAsset. -SourceCharacter changes the color of NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter改变了DestinationCharacterFocusAssetGroup上NextAsset的颜色. -SourceCharacter locks a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter把DestinationCharacterFocusAssetGroup上NextAsset上了锁. -SourceCharacter adds a NextAsset on DestinationCharacter FocusAssetGroup PrevAsset. -SourceCharacter在DestinationCharacterFocusAssetGroup上PrevAsset上加了NextAsset. -SourceCharacter removes the PrevAsset from DestinationCharacter FocusAssetGroup. -SourceCharacter从DestinationCharacterFocusAssetGroup移除了PrevAsset. -SourceCharacter unlocks the PrevAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter打开了DestinationCharacterFocusAssetGroup上PrevAsset的锁。 -SourceCharacter picks the lock on DestinationCharacter PrevAsset. -SourceCharacter撬开了DestinationCharacterPrevAsset上的锁。 -SourceCharacter unlocks and removes the PrevAsset from DestinationCharacter FocusAssetGroup. -SourceCharacter打开并移除了DestinationCharacterFocusAssetGroup上的PrevAsset. -SourceCharacter rolls DiceType. The result is: DiceResult. -SourceCharacter丢了DiceType.结果是: DiceResult. -SourceCharacter flips a coin. The result is: CoinResult. -SourceCharacter丢了一枚硬币.结果是: CoinResult. -SourceCharacter used her safeword. Please check for her well-being. -SourceCharacter 使用了安全词。请检查她的身心健康状况。 -SourceCharacter used her safeword and wants to be released. She is guided out of the room for her safety. -SourceCharacter 使用了安全词,并希望被释放。为了她的安全,她已被送出房间。 -TargetCharacterName gets grabbed by two maids and locked in a timer cell, following her owner's commands. -TargetCharacterName被两个女仆拽走,按照她的主人的命令,把她关进了定时监牢里。 -TargetCharacterName gets grabbed by two nurses wearing futuristic gear and locked in the Asylum for GGTS, following her owner's commands. -TargetCharacterName被两个穿着未来装备的护士拽走,按照她的主人的命令,被关在了收容所进行GGTS。 -TargetCharacterName gets grabbed by two maids and escorted to the maid quarters to serve drinks for her owner. -TargetCharacterName被两个女仆拽走,按照她的主人的命令,押送她到女仆宿舍开始送饮料。 -TargetCharacterName gives a sealed envelope to her owner. -TargetCharacterName把一个封住的信封交给了她的主人。 -SourceCharacter hits DestinationCharacter FocusAssetGroup with a NextAsset. -SourceCharacter使用NextAsset击打DestinationCharacterFocusAssetGroup。 -SourceCharacter holds a NextAsset against DestinationCharacter FocusAssetGroup. -SourceCharacter用NextAsset抵靠在DestinationCharacterFocusAssetGroup。 -SourceCharacter tickles DestinationCharacter FocusAssetGroup with a NextAsset. -SourceCharacter用NextAsset在DestinationCharacterFocusAssetGroup挠痒痒。 -SourceCharacter rubs DestinationCharacter FocusAssetGroup with a NextAsset. -SourceCharacter用NextAsset摩擦DestinationCharacterFocusAssetGroup。 -SourceCharacter rolls a NextAsset over DestinationCharacter FocusAssetGroup. -SourceCharacter用NextAsset在DestinationCharacterFocusAssetGroup上滚动。 -SourceCharacter pours NextAsset onto DestinationCharacter FocusAssetGroup. -SourceCharacter将NextAsset泼在DestinationCharacterFocusAssetGroup上。 -SourceCharacter shocks DestinationCharacter FocusAssetGroup with a NextAsset. -SourceCharacter用NextAsset电击DestinationCharacterFocusAssetGroup。 -SourceCharacter was interrupted while trying to use a NextAsset on TargetCharacter. -SourceCharacter 试图在 TargetCharacter 身上使用 NextAsset,但是操作被中断了。 -SourceCharacter was interrupted while going for the PrevAsset on TargetCharacter. -SourceCharacter 试图操作 TargetCharacter 身上的 NextAsset,但是操作被中断了。 -SourceCharacter was interrupted while swapping a PrevAsset for a NextAsset on TargetCharacter. -SourceCharacter 试图将 TargetCharacter 身上的 PrevAsset 换成 NextAsset,但是操作被中断了。 -SourceCharacter slowly heads for the door. -SourceCharacter 缓慢向房门走去。 -SourceCharacter stops heading for the door. -SourceCharacter 停止向房门走去。 -SourceCharacter was stopped from leaving. -SourceCharacter 被阻止离开房间。 -SourceCharacter gets in the way of TargetCharacter -SourceCharacter 阻挡了 TargetCharacter -SourceCharacter tries to help TargetCharacter to struggle free. -SourceCharacter 试图帮助 TargetCharacter 摆脱束缚。 -SourceCharacter gives TargetCharacter some lockpicks to help herself with. -SourceCharacter 给 TargetCharacter 一些开锁工具以便她自助。 -SourceCharacter grabs the leash of TargetCharacter. -SourceCharacter抓住TargetCharacter的牵绳。 -SourceCharacter releases the leash of TargetCharacter. -SourceCharacter松开TargetCharacter的牵绳。 -SourceCharacter picks a glass of water from DestinationCharacter tray. -SourceCharacter从DestinationCharacter饮品托盘上拿了一杯水。 -SourceCharacter picks an orange juice from DestinationCharacter tray. -SourceCharacter从DestinationCharacter饮品托盘上拿了一杯橙汁。 -SourceCharacter picks a beer from DestinationCharacter tray. -SourceCharacter从DestinationCharacter饮品托盘上拿了一杯啤酒。 -SourceCharacter picks a glass of wine from DestinationCharacter tray. -SourceCharacter从DestinationCharacter饮品托盘上拿了一杯红酒。 -SourceCharacter buys a Virgin Mojito from DestinationCharacter tray. -SourceCharacter从DestinationCharacter饮品托盘上购买了一杯初榨莫吉托。 -SourceCharacter buys a Margarita from DestinationCharacter tray. -SourceCharacter从DestinationCharacter饮品托盘上购买了一杯玛格丽塔酒。 -SourceCharacter buys a glass of Whiskey from TargetCharacter. -SourceCharacter从TargetCharacter的饮品托盘上购买了一杯威士忌。 -SourceCharacter buys a glass of champagne from TargetCharacter. -SourceCharacter从TargetCharacter的饮品托盘上购买了一杯香槟酒。 -SourceCharacter buys a jug of refreshing lemonade for everyone, from TargetCharacter. -SourceCharacter从TargetCharacter的饮品托盘上为所有人购买了一杯提神柠檬水。 -SourceCharacter buys a round of shooters for everyone, from TargetCharacter. -SourceCharacter从TargetCharacter的饮品托盘上为所有人购买了一杯子弹鸡尾酒。 -SourceCharacter buys a jug of Sex on the Beach for everyone, from TargetCharacter. -SourceCharacter从TargetCharacter的饮品托盘上为所有人购买了一杯性感海滩鸡尾酒。 -SourceCharacter buys a beer pitcher for everyone, from TargetCharacter. -SourceCharacter从TargetCharacter的饮品托盘上为所有人购买了一杯扎啤。 -SourceCharacter picks a tea from DestinationCharacter tray. -SourceCharacter从DestinationCharacter饮品托盘上拿了一杯茶。 -SourceCharacter picks a coffee from DestinationCharacter tray. -SourceCharacter从DestinationCharacter饮品托盘上拿了一杯咖啡。 -SourceCharacter buys a hot chocolate from DestinationCharacter tray. -SourceCharacter从DestinationCharacter饮品托盘上购买了一杯热巧克力。 -SourceCharacter buys an espresso from DestinationCharacter tray. -SourceCharacter从DestinationCharacter饮品托盘上购买了一杯特浓咖啡。 -SourceCharacter buys a cappuccino from DestinationCharacter tray. -SourceCharacter从DestinationCharacter饮品托盘上购买了一杯卡布奇诺。 -Member number on lock: -锁上标着的会员编号: -Item member number: -物品的会员编号 -Time left: -剩余时间 -SourceCharacter restarts the five minutes timer padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter重置了DestinationCharacterFocusAssetGroup上的五分钟计时锁的计时器. -Unknown time left -剩余时间未知 -Restart Timer -重新启动计时器 -SourceCharacter adds TimerTime TimerUnit to the padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter在DestinationCharacterFocusAssetGroup上的锁的计时器上增加了TimerTime TimerUnit。 -SourceCharacter removes TimerTime TimerUnit to the padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter从DestinationCharacterFocusAssetGroup上的锁的计时器上移除了TimerTime TimerUnit。 -an unknown amount of time -不知多久 -The LockName on DestinationCharacterName FocusAssetGroup opens with a click -DestinationCharacterNameFocusAssetGroup上的LockName咔哒一声打开了 -SourceCharacter updates the key settings for the lock on DestinationCharacter FocusAssetGroup -SourceCharacter更新了DestinationCharacterFocusAssetGroup上的锁的钥匙设置 -Save key list -保存钥匙列表 -Enter keyholders' member numbers separated by commas. -输入钥匙持有者的会员编号,以逗号分隔. -You don't have keys, saving will remove your access -你没有钥匙, 保存后将移除你的使用权限 -Append lovers -追加恋人 -Append owner -追加主人 -Append whitelist -追加白名单 -Current Mode: -目前的模式: -Increase intensity -增加强度 -Decrease intensity -降低强度 -Turn off -关闭 -Edge mode -寸止模式 -Random mode -随机模式 -Deny mode -拒绝模式 -Tease mode -玩弄模式 -Trigger Shock -触发电击 -Save Voice Commands -保存语音命令 -SourceCharacter changes the voice command settings on DestinationCharacter FocusAssetGroup. -SourceCharacter 更改 DestinationCharacter FocusAssetGroup 的语音命令设置。 -DestinationCharacterName vibrator switches modes! -DestinationCharacterName振动玩具更改了模式! -DestinationCharacterName vibrator lets out a sharp jolt! -DestinationCharacterName振动玩具发出一次猛烈的电击! -Anyone -任何人 -Others -其他人 -Lock Member -锁的成员 -SourceCharacter tries the code CombinationNumber but fails to open the padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter尝试输入数字密码CombinationNumber,但没能成功打开DestinationCharacterFocusAssetGroup上的挂锁。 -SourceCharacter changes the code of the padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter改变DestinationCharacterFocusAssetGroup上的挂锁的数字密码。 -SourceCharacter tries to change the code of the padlock on DestinationCharacter FocusAssetGroup but fails. -SourceCharacter尝试改变DestinationCharacterFocusAssetGroup上的挂锁的数字密码,但失败了。 -SourceCharacter tries the word Password but fails to open the lock on DestinationCharacter FocusAssetGroup. -SourceCharacter尝试输入密码Password,但没能成功打开DestinationCharacterFocusAssetGroup上的挂锁。 -SourceCharacter changes the password of the lock on DestinationCharacter FocusAssetGroup. -SourceCharacter改变DestinationCharacterFocusAssetGroup上的挂锁的密码。 -Enable random input of time from everyone else -允许所有其他人随机输入时间 -Add TimerTime minutes to the Timer -增加TimerTime分钟定时 -Add -添加 -Remove item when the lock timer runs out -在计时器耗尽时移除物品 -The item will be removed when the lock timer runs out -在计时器耗尽时该物品会被移除 -The item will stay when the lock timer runs out -在计时器耗尽时该物品会保留 -Show the time remaining/being added -显示剩余时间和增加的时间 -Random -随机 -minutes -分钟 -hours -小时 -Current Code : -当前密码: -New Code : -新密码: -Open lock -解锁 -Change code -更换密码 -Wrong code -密码错误 -Use 4 digits as a code -使用4位数密码 -Remove on Unlock: -解锁时移除: -Enter Password : -输入密码: -Set password: -设置密码: -Set hint text: -设置提示文字: -Accept -接受 -Wrong password -密码错误 -Password must be 8 or fewer letters only -密码必须是8位以内的字符 -Locked by: -上锁人: -Locked on: -锁定于: -This person is locked by different people -她被多个人锁了起来 -This person is fully locked by: -她被以下人物锁了起来: -This person is fully locked by you -她被你一个人锁了起来 -Select the bondage position -选择绳缚姿势 -Select the tape wrapping -选择胶带捆绑 -Select an item attachment -选择一个配件物品 -Select the piercing attachment -选择一个穿刺配件 -A victim cannot unlock herself if her elbows are bound -手肘被绑在一起的时候受害者无法自己开锁 -DestinationCharacterName jammed a lock and broke her lockpick! -DestinationCharacterName把开锁器断在了锁芯里! -Remaining tries: -剩余尝试次数: -Failing or quitting will break your lockpick for 1 minute -失败或退出后的一分钟内无法尝试开锁 -You jammed the lock. -你把锁芯卡住了 -You are too tired to continue. Time remaining: -你太累了无法继续. 剩余时间: -Click the pins in the correct order to open the lock! -按照正确的顺序点击锁芯来解锁! -Clicking the wrong pin may falsely set it. -点击错误的锁芯可能会将它错误的抬起. -It will fall back after clicking other pins. -它在你点击其他锁芯后可能会重新掉落. -Your hands are shaky and you lose some tension by accident! -你的双手发抖,不小心松开了一些锁芯! -"From your friendly hardware store" -"来自你友好的五金店" -"Only one key works, but it can be picked" -"只有特定的钥匙能够开启, 但可以尝试撬锁" -"Won't be getting picked on the streets" -"在大街上不会被撬开的" -You can restart the timer but cannot unlock -你可以重启计时器但无法解锁 -"If at first, you don't succeed..." -"如果一开始你没有成功的话…" -"Never forget who you belong to" -"永远不要忘记你属于谁" -Can only be locked or unlocked by her owner -只能被主人们上锁或打开 -Can only be unlocked or extended by her owner -只能被主人们打开或延长时间 -"A loving embrace" -"一个爱的拥抱" -Can only be locked or unlocked by her lover -只能被恋人们上锁或打开 -Can only be unlocked or extended by her lover -只能被恋人们打开或延长时间 -Can only be locked or unlocked by a Club Mistress -只能被俱乐部女主人们上锁或打开 -"Once inside the Box, you may never leave." -"一旦在魔盒中,你就再也无法离开。" -Can only be unlocked or extended by a Club Mistress -只能被俱乐部女主人们打开或延长时间 -"Keeping you safe from yourself" -"让你免受自己的烦扰" -Can be opened by anyone but the wearer -除穿戴者外都能打开 -"Finders keepers" -"谁捡到就是谁的" -Can be opened only with the correct password -只有输入密码才能打开 -In-front of body -在身体前面 -Behind back -在背后 -SourceCharacter cuffs DestinationCharacter hands in-front of their body. -SourceCharacter把DestinationCharacter双手铐在了他的身前。 -SourceCharacter cuffs DestinationCharacter hands behind their back. -SourceCharacter把DestinationCharacter双手铐在了他的身后。 -On head level -与头平齐 -Over the head -高过头顶 -SourceCharacter lowers the ceiling shackles on TargetCharacter a bit. -SourceCharacter略微降低了TargetCharacter的吊顶手镣。 -SourceCharacter raises the ceiling shackles on TargetCharacter over her head. -SourceCharacter抬高了TargetCharacter的吊顶手镣高度,使它高过头顶. -SourceCharacter detaches the shackles on TargetCharacter from the floor. -SourceCharacter解开了TargetCharacter和地板间固定的镣铐。 -SourceCharacter attaches the shackles on TargetCharacter to the floor. -SourceCharacter将TargetCharacter的镣铐固定到地板上。 -Select ring configuration -牵引环设置 -Without ring -没有环 -With ring -有环 -SourceCharacter removes the ring from DestinationCharacter collar. -SourceCharacter移除了DestinationCharacter项圈上的金属环。 -SourceCharacter attaches a ring to DestinationCharacter collar. -SourceCharacter将一个金属环附在DestinationCharacter项圈上。 -Detached -分开 -Bind wrists -绑上手腕 -Bind elbows -绑上手肘 -Bind both -都绑上 -Hogtie -驷马 -SourceCharacter detaches the chain from DestinationCharacter leather cuffs. -SourceCharacter解开了DestinationCharacter皮革手铐上的锁链。 -SourceCharacter attaches the leather cuffs wrist chain behind DestinationCharacter back. -SourceCharacter将DestinationCharacter手腕的皮革手铐上的锁链从她的身后连在一起。 -SourceCharacter attaches the leather cuffs elbow chain behind DestinationCharacter back. -SourceCharacter将DestinationCharacter手肘的皮革手铐上的锁链从她的身后连在一起。 -SourceCharacter attaches the leather cuffs wrist and elbow chains behind DestinationCharacter back. -SourceCharacter将DestinationCharacter手腕和手肘的皮革手铐上的锁链从她的身后连在一起。 -SourceCharacter attaches the leather cuffs wrist and elbow chains behind DestinationCharacter back and connects the wrist and ankle cuffs. -SourceCharacter将DestinationCharacter手腕和手肘的皮革手铐上的锁链从她的身后连在一起,并将手腕铐和脚踝铐连在一起. -SourceCharacter detaches DestinationCharacter steel cuffs. -SourceCharacter解开了DestinationCharacter不锈钢手铐上的锁链。 -SourceCharacter attaches DestinationCharacter steel cuffs behind her back. -SourceCharacter将DestinationCharacter不锈钢手铐上的锁链从她的身后连在一起。 -SourceCharacter detaches the chain from DestinationCharacter futuristic cuffs. -SourceCharacter解开了DestinationCharacter未来臂铐上的锁链。 -SourceCharacter attaches the futuristic cuffs wrist chain behind DestinationCharacter back. -SourceCharacter将DestinationCharacter手腕的未来臂铐上的锁链从她的身后连在一起。 -SourceCharacter attaches the futuristic cuffs elbow chain behind DestinationCharacter back. -SourceCharacter将DestinationCharacter手肘的未来臂铐上的锁链从她的身后连在一起。 -SourceCharacter attaches the futuristic cuffs wrist and elbow chains behind DestinationCharacter back. -SourceCharacter将DestinationCharacter手腕和手肘的未来臂铐上的锁链从她的身后连在一起。 -SourceCharacter detaches the chain from DestinationCharacter futuristic leg cuffs. -SourceCharacter解开了DestinationCharacter未来腿铐上的锁链。 -SourceCharacter attaches the futuristic leg cuffs chain on DestinationCharacter legs. -SourceCharacter将DestinationCharacter腿上的未来腿铐上的锁链连在一起。 -SourceCharacter detaches the chain from DestinationCharacter futuristic ankle cuffs. -SourceCharacter解开了DestinationCharacter未来脚铐上的锁链。 -SourceCharacter attaches the futuristic ankle cuffs chain on DestinationCharacter ankles. -SourceCharacter将DestinationCharacter脚踝上的未来脚铐上的锁链连在一起。 -Chain Closed -闭合锁链 -Chain Attached -连接锁链 -SourceCharacter detaches the chain from DestinationCharacter leather leg cuffs. -SourceCharacter解开了DestinationCharacter皮革腿铐上的锁链。 -SourceCharacter attaches the leather leg cuffs chain on DestinationCharacter legs. -SourceCharacter将DestinationCharacter腿上的皮革腿铐上的锁链连在一起。 -Attached -合并 -SourceCharacter detaches DestinationCharacter AssetName. -SourceCharacter解开了DestinationCharacterAssetName。 -SourceCharacter attaches DestinationCharacter AssetName. -SourceCharacter将DestinationCharacterAssetName连在一起。 -SourceCharacter attaches the chain on DestinationCharacter AssetName. -SourceCharacter将DestinationCharacterAssetName上的锁链连在一起。 -Select tentacle position -选择触手的姿态 -Legs Together -并腿 -Legs Spread -开腿 -SourceCharacter uses the tentacles to bind DestinationCharacter ankles together. -SourceCharacter使用触手将DestinationCharacter脚踝束缚在一起。 -SourceCharacter uses the tentacles to spread DestinationCharacter legs apart. -SourceCharacter使用触手将DestinationCharacter双腿分开。 -Lightly Spread. -稍微地分开。 -Widely Spread. -宽展地分开。 -Close together. -闭合在一起。 -SourceCharacter uses wooden cuffs to lock DestinationCharacter feet slightly spread. -SourceCharacter使用木质铐锁住DestinationCharacter脚,使得脚稍微地分开。 -SourceCharacter uses wooden cuffs to lock DestinationCharacter feet widely spread. -SourceCharacter使用木质铐锁住DestinationCharacter脚,使得脚宽展地分开。 -SourceCharacter uses wooden cuffs to lock DestinationCharacter feet closely together. -SourceCharacter使用木质铐锁住DestinationCharacter脚,使得脚闭合在一起。 -SourceCharacter uses the tentacles to bind DestinationCharacter arms behind her back. -SourceCharacter使用触手DestinationCharacter手臂在她的身后束缚在一起。 -SourceCharacter uses the tentacles to hold DestinationCharacter arms above her head. -SourceCharacter使用触手DestinationCharacter手臂固定在高过头顶的位置。 -SourceCharacter detaches the chain from DestinationCharacter Ornate cuffs. -SourceCharacter解开了DestinationCharacter华丽手铐上的锁链。 -SourceCharacter attaches the Ornate cuffs wrist chain behind DestinationCharacter back. -SourceCharacter将DestinationCharacter手腕的华丽手铐上的锁链从她的身后连在一起。 -SourceCharacter attaches the Ornate cuffs elbow chain behind DestinationCharacter back. -SourceCharacter将DestinationCharacter手肘的华丽手铐上的锁链从她的身后连在一起。 -SourceCharacter attaches the Ornate cuffs wrist and elbow chains behind DestinationCharacter back. -SourceCharacter将DestinationCharacter手腕和华丽手铐上的锁链从她的身后连在一起。 -SourceCharacter attaches the Ornate cuffs wrist and elbow chains behind DestinationCharacter back and connects the wrist and ankle cuffs. -SourceCharacter将DestinationCharacter手腕和手肘的华丽手铐上的锁链从她的身后连在一起,并将手腕铐和脚踝铐连在一起. -SourceCharacter detaches the chain from DestinationCharacter Ornate leg cuffs. -SourceCharacter解开了DestinationCharacter华丽腿铐上的锁链。 -SourceCharacter attaches the Ornate leg cuffs chain on DestinationCharacter legs. -SourceCharacter将DestinationCharacter腿上的华丽腿铐上的锁链连在一起。 -SourceCharacter detaches the chain from DestinationCharacter Ornate ankle cuffs. -SourceCharacter解开了DestinationCharacter华丽脚铐上的锁链。 -SourceCharacter attaches the Ornate ankle cuffs chain on DestinationCharacter ankles. -SourceCharacter将DestinationCharacter脚踝上的华丽脚铐上的锁链连在一起。 -How tight do you want to strap the jacket? -你想把拘束衣拉到多紧? -Snug -松垮 -Tight -紧绷 -SourceCharacter loosens the straps on DestinationCharacter straitjacket. -SourceCharacter放松了DestinationCharacter拘束衣上的束带。 -SourceCharacter adjusts the straps normally on DestinationCharacter straitjacket. -SourceCharacter普通地调整DestinationCharacter拘束衣上的束带。 -SourceCharacter snugs the straps on DestinationCharacter straitjacket. -SourceCharacter调整DestinationCharacter拘束衣上的束带,使它松垮。 -SourceCharacter tightens the straps on DestinationCharacter straitjacket. -SourceCharacter调整DestinationCharacter拘束衣上的束带,使它紧绷。 -SourceCharacter loosens the straps on DestinationCharacter leather straitjacket. -SourceCharacter放松了DestinationCharacter皮革拘束衣上的束带。 -SourceCharacter adjusts the straps normally on DestinationCharacter leather straitjacket. -SourceCharacter普通地调整DestinationCharacter皮革拘束衣上的束带。 -SourceCharacter snugs the straps on DestinationCharacter leather straitjacket. -SourceCharacter调整DestinationCharacter皮革拘束衣上的束带,使它松垮。 -SourceCharacter tightens the straps on DestinationCharacter leather straitjacket. -SourceCharacter调整DestinationCharacter皮革拘束衣上的束带,使它紧绷。 -How tight do you want the strap linking the cuffs? -你想要项圈手铐上连接的带子有多紧? -SourceCharacter loosens the strap on DestinationCharacter collar cuffs. -SourceCharacter放松了DestinationCharacter项圈手铐上的束带。 -SourceCharacter adjusts the strap normally on DestinationCharacter collar cuffs. -SourceCharacter普通地调整DestinationCharacter项圈手铐上的束带。 -SourceCharacter snugs the strap on DestinationCharacter collar cuffs. -SourceCharacter调整DestinationCharacter项圈手铐上的束带,使它松垮。 -SourceCharacter tightens the strap on DestinationCharacter collar cuffs. -SourceCharacter调整DestinationCharacter项圈手铐上的束带,使它紧绷。 -How much do you want to inflate the body bag? -你想要往全包袋里面充多少气? -Max -最大 -SourceCharacter adjusts DestinationCharacter inflatable body bag to be only lightly filled. -SourceCharacter调整DestinationCharacter充气式全包袋,使它略微充气。 -SourceCharacter adjusts DestinationCharacter inflatable body bag to be half filled. -SourceCharacter调整DestinationCharacter充气式全包袋,使它充一半气。 -SourceCharacter adjusts DestinationCharacter inflatable body bag to three quarters filled. -SourceCharacter调整DestinationCharacter充气式全包袋,使它充四分之三气。 -SourceCharacter adjusts DestinationCharacter inflatable body bag to fill the maximum amount. -SourceCharacter调整DestinationCharacter充气式全包袋,使它充气到最大。 -Select belt tightness? -选择皮带的松紧度? -Tight with belts -使用皮带赏金 -SourceCharacter wraps TargetCharacterName comfortably in a fur blanket. -SourceCharacter把TargetCharacterName舒适地包裹在毛毯里。 -SourceCharacter wraps TargetCharacterName tightly in a fur blanket. -SourceCharacter把TargetCharacterName紧绷地包裹在毛毯里。 -SourceCharacter wraps TargetCharacterName tightly in a fur blanket with belts. -SourceCharacter使用皮带把TargetCharacterName紧绷地包裹在毛毯里。 -Select Position -选择姿势 -Kneel -跪姿 -All Fours -四肢着地 -Suspension -悬挂 -SourceCharacter throws a net over TargetCharacterName . -SourceCharacter朝TargetCharacterName身上扔了个捕捉网。 -SourceCharacter adds some weights to the net forcing TargetCharacterName down on all fours. -SourceCharacter在捕捉网上加了一些配重,迫使TargetCharacterName四肢着地。 -SourceCharacter suspends TargetCharacterName up in the air. -SourceCharacter将TargetCharacterName悬挂在空中。 -How many leather belts do you want to apply? -你想要使用多少根皮带? -One -一根 -Two -两根 -Three -三根 -Four -四根 -SourceCharacter restrains TargetCharacter with only one sturdy leather belt. -SourceCharacter只用一根厚实的皮带束缚住TargetCharacter。 -SourceCharacter restrains TargetCharacter with two sturdy leather belts. -SourceCharacter用两根厚实的皮带束缚住TargetCharacter。 -SourceCharacter restrains TargetCharacter with three sturdy leather belts. -SourceCharacter只用三根厚实的皮带束缚住TargetCharacter。 -SourceCharacter restrains TargetCharacter with four sturdy leather belts. -SourceCharacter只用四根厚实的皮带束缚住TargetCharacter。 -No straps -没有束带 -Full -所有 -SourceCharacter removes the leather belts from DestinationCharacter body. -SourceCharacter移除了DestinationCharacter身上的皮带。 -SourceCharacter loosely restrains TargetCharacter to the bondage bench with few leather belts. -SourceCharacter用不多的皮带把TargetCharacter松散地束缚在捆绑躺椅上。 -SourceCharacter restrains TargetCharacter to the bondage bench with a handful of leather belts. -SourceCharacter用一把皮带把TargetCharacter束缚在捆绑躺椅上。 -SourceCharacter strictly restrains TargetCharacter to the bondage bench with a good amount of leather belts. -SourceCharacter用很多皮带把TargetCharacter严格地束缚在捆绑躺椅上。 -SourceCharacter fully restrains TargetCharacter to the bondage bench with a large amount of leather belts. -SourceCharacter用非常皮带把TargetCharacter完全地束缚在捆绑躺椅上。 -Hands -手 -Arms -手臂 -Skirt -手指 -Torso -躯干 -Mummy -木乃伊 -Full Mummy -木乃伊全包 -Exposed Full Mummy -露出私处的木乃伊全包 -Pet Tape -四肢着地 -SourceCharacter wraps duct tape around DestinationCharacter hands. -SourceCharacter将胶带包裹在DestinationCharacter手上。 -SourceCharacter removes some of the duct tape from DestinationCharacter torso. -SourceCharacter从DestinationCharacter躯干上移除了一些胶带。 -SourceCharacter creates a duct tape skirt on TargetCharacter and traps her hands in it. -SourceCharacter给TargetCharacter缠了一件胶带裙子,并把她的手臂困在其中。 -SourceCharacter creates a duct tape top on TargetCharacter and traps her arms in it. -SourceCharacter给TargetCharacter缠了一件胶带上衣,并把她的手臂困在其中。 -SourceCharacter creates a duct tape mummy on TargetCharacter and traps her arms in it. -SourceCharacter给TargetCharacter缠了一套胶带木乃伊,并把她的手臂困在其中。 -SourceCharacter creates a completed duct tape mummy on TargetCharacter and traps her entire upper body in it. -SourceCharacter给TargetCharacter缠了一套全身覆盖的胶带木乃伊,并把她的整个身体困在其中。 -SourceCharacter creates a completed duct tape mummy on TargetCharacter and cuts a hole so that her breasts are exposed. -SourceCharacter给TargetCharacter缠了一套全身覆盖的胶带木乃伊,并切开一个洞,让她的胸部露出来。 -SourceCharacter folds DestinationCharacter arms and wraps duct tape around them. -SourceCharacter将DestinationCharacter手臂交叉在一起,并包裹上胶带。 -Above head -高过头顶 -SourceCharacter shackles DestinationCharacter wrist in-front of their body. -SourceCharacter将DestinationCharacter手腕锁在身前。 -SourceCharacter shackles DestinationCharacter wrist behind their back. -SourceCharacter将DestinationCharacter手腕锁在身后。 -SourceCharacter shackles DestinationCharacter wrist above their head. -SourceCharacter将DestinationCharacter手腕锁在头顶上方。 -Select strap type -选择束带类型 -Ring Straps -有环束带 -Wrapping Straps -无环束带 -Strapless -无束带 -SourceCharacter puts an armbinder with ring straps on DestinationCharacter arms. -SourceCharacter用由金属环和束带固定的单手套束缚住DestinationCharacter手臂。 -SourceCharacter puts an armbinder with wrapping straps on DestinationCharacter arms. -SourceCharacter用由束带固定的单手套束缚住DestinationCharacter手臂。 -SourceCharacter puts a strapless armbinder on DestinationCharacter arms. -SourceCharacter用没有束带的单手套束缚住DestinationCharacter手臂。 -In Front. -身前。 -Behind Back. -身后。 -Yoke. -轭式。 -Hogtied. -驷马。 -SourceCharacter uses wooden cuffs to lock DestinationCharacter hands in front. -SourceCharacter用木质铐将DestinationCharacter手锁在身前。 -SourceCharacter uses wooden cuffs to lock DestinationCharacter hands behind her back. -SourceCharacter用木质铐将DestinationCharacter手锁在身后。 -SourceCharacter uses wooden cuffs to lock DestinationCharacter hands next to her head. -SourceCharacter用木质铐将DestinationCharacter手锁在头的旁边。 -SourceCharacter uses wooden cuffs to lock DestinationCharacter in a rigid hogtie. -SourceCharacter用木质铐将DestinationCharacter锁成结实的驷马缚。 -Select the type of gag -选择口塞类型 -Small -小号 -Cleave -布带 -Knotted -打结 -OTM -蒙嘴 -OTN -蒙鼻 -SourceCharacter ties the cloth into a small gag over DestinationCharacter mouth. -SourceCharacter将布料缠成一个小口塞,盖住DestinationCharacter嘴。 -SourceCharacter ties the cloth into a cleave gag over DestinationCharacter mouth. -SourceCharacter将布料缠成一个布带口塞,盖住DestinationCharacter嘴。 -SourceCharacter ties the cloth into a knot over DestinationCharacter mouth. -SourceCharacter将布料打一个结,盖住DestinationCharacter嘴。 -SourceCharacter ties the cloth into a large gag over DestinationCharacter mouth. -SourceCharacter将布料缠成一个大号口塞,盖住DestinationCharacter嘴。 -SourceCharacter ties the cloth into a large gag over DestinationCharacter mouth and nose. -SourceCharacter将布料缠成一个大号口塞,盖住DestinationCharacter嘴和鼻子。 -SourceCharacter ties the scarf loosely over DestinationCharacter mouth. -SourceCharacter系起围巾,松垮地盖住DestinationCharacter嘴。 -SourceCharacter ties the scarf covering DestinationCharacter mouth and nose. -SourceCharacter系起围巾,松垮地盖住DestinationCharacter嘴和鼻子。 -Single strip -单根 -Crossed strips -十字 -Full face -整圈 -Double layer -双层 -SourceCharacter puts a piece of duct tape on DestinationCharacter mouth. -SourceCharacter在DestinationCharacter嘴上贴了一片胶带。 -SourceCharacter crosses two pieces of duct tape on DestinationCharacter mouth. -SourceCharacter用胶带在DestinationCharacter嘴上打了个叉。 -SourceCharacter fully tapes DestinationCharacter mouth. -SourceCharacter用胶带把DestinationCharacter嘴完全包上了。 -SourceCharacter fully tapes DestinationCharacter mouth with double layers. -SourceCharacter用胶带把DestinationCharacter嘴包了两层。 -SourceCharacter wraps many layers on DestinationCharacter mouth. -SourceCharacter用胶带把DestinationCharacter嘴包住了好几层。 -Shiny -闪亮 -Plugged -被插入 -Open -打开 -SourceCharacter plugs up DestinationCharacter mouth. -SourceCharacter把塞子塞进DestinationCharacter嘴。 -SourceCharacter pulls out DestinationCharacter plug from her gag. -SourceCharacter从DestinationCharacter口塞中拔出塞子。 -SourceCharacter configures DestinationCharacter visor to be transparent. -SourceCharacter将DestinationCharacter眼镜设置为透明的。 -SourceCharacter configures DestinationCharacter visor to be fully opaque. -SourceCharacter将DestinationCharacter眼镜设置为完全遮光的。 -Transparent -透明 -Blind -失明 -SourceCharacter configures DestinationCharacter visor to fade slightly. -SourceCharacter将DestinationCharacter眼镜设置为轻度暗色。 -SourceCharacter configures DestinationCharacter visor to be heavily tinted. -SourceCharacter将DestinationCharacter眼镜设置为重度染色。 -Light Tint -轻度染色 -Heavy Tint -重度染色 -Select the type of visor -选择眼镜类型 -SourceCharacter logs DestinationCharacter headset into the virtual world as her real self. -SourceCharacter将DestinationCharacter头戴显示器登入虚拟世界,使用她的真实身份。 -SourceCharacter logs DestinationCharacter headset into the virtual world as a custom avatar. -SourceCharacter将DestinationCharacter头戴显示器登入虚拟世界,使用虚拟形象。 -SourceCharacter configures DestinationCharacter headset to display the surroundings through a camera feed. -SourceCharacter设置DestinationCharacter头戴显示器,使它通过摄像头信息显示周围的环境。 -SourceCharacter turns off DestinationCharacter headset. -SourceCharacter关闭了DestinationCharacter头戴显示器。 -SourceCharacter boots up Kinky Dungeon on DestinationCharacter headset. -SourceCharacter启动了DestinationCharacter头戴显示器中的淫荡地城。 -SourceCharacter turns off DestinationCharacter game. -SourceCharacter关闭了DestinationCharacter游戏。 -SourceCharacter removes the background on DestinationCharacter headset. -SourceCharacter移除了DestinationCharacter头戴显示器的背景效果。 -SourceCharacter sets the background on DestinationCharacter headset to a virtual realm. -SourceCharacter将DestinationCharacter头戴显示器的背景效果设置为虚拟王国。 -SourceCharacter sets the background on DestinationCharacter headset to a dark dungeon. -SourceCharacter将DestinationCharacter头戴显示器的背景效果设置为黑暗地牢。 -SourceCharacter sets the background on DestinationCharacter headset to a high-tech environment. -SourceCharacter将DestinationCharacter头戴显示器的背景效果设置为高科技环境。 -SourceCharacter sets the background on DestinationCharacter headset to an ancient fantasy location. -SourceCharacter将DestinationCharacter头戴显示器的背景效果设置为古老的奇幻场地。 -SourceCharacter sets DestinationCharacter headset to induce a trance-like state... -SourceCharacter将DestinationCharacter头戴显示器设置为催眠似的状态…… -Choose Background: -选择背景: -Choose Mode: -选择模式: -Choose Game: -选择游戏: -Choose Settings: -选择设置 -Background -背景 -Mode -模式 -Game -游戏 -High-Tech -高科技 -Trance -催眠 -Passthrough -穿透 -Off -关闭 -VR -虚拟现实 -VR (Hide Restraints) -虚拟现实(隐藏拘束) -Kinky Dungeon -淫荡地城 -Access denied. -认证失败. -SourceCharacter tried to log in to the device on DestinationCharacter FocusAssetGroup but was locked out. -SourceCharacter尝试登入DestinationCharacterFocusAssetGroup上的道具,但是被锁定了。 -Item is locked. Only authorized users may alter settings. -物品被锁定。只有授权用户可以调整设置。 -Enter Password: -输入密码: -Log in -登录 -SourceCharacter configures DestinationCharacter armbinder to standard tightness. -SourceCharacter将DestinationCharacter单手套调整为标准紧。 -SourceCharacter configures DestinationCharacter armbinder to enhanced tightness. -SourceCharacter将DestinationCharacter单手套调整为特别紧。 -Standard Mode -标准模式 -Strict Mode -困难模式 -Select device tightness: -选择器械松紧度: -Mask -面具 -Straps -束带 -Icon -图标 -Configure muzzle: -设置口套: -Configure mask: -设置面罩: -Configure straps: -设置束带: -Choose Decorative Icon: -设置装饰图标: -Standard -标准 -Over the Nose -超过鼻子 -Muzzle -口套 -Harness Muzzle -束带口套 -Blank -空白 -Lock -锁 -Mute -禁声 -X -X -SourceCharacter adds straps to DestinationCharacter muzzle. -SourceCharacter向DestinationCharacter口套上增加了一些系带。 -SourceCharacter removes straps from DestinationCharacter muzzle. -SourceCharacter移除了DestinationCharacter口套上的系带。 -SourceCharacter adds a nose cover to DestinationCharacter muzzle. -SourceCharacter向DestinationCharacter口套上增加了鼻子覆盖物。 -SourceCharacter removes the nose cover from DestinationCharacter muzzle. -SourceCharacter移除了DestinationCharacter口套上的鼻子覆盖物。 -SourceCharacter removes the icon from DestinationCharacter muzzle. -SourceCharacter移除了DestinationCharacter口套上的图标。 -SourceCharacter chooses the icon on DestinationCharacter muzzle. -SourceCharacter向DestinationCharacter口套上添加了图标。 -Door -门 -Leg Restraints -腿部拘束 -Arm Restraints -手臂拘束 -Module -模块 -Harness -拘束带 -Structure -结构 -Configure crate: -设置箱子: -Configure door: -设置门: -Configure arm restraints: -设置手臂拘束: -Configure leg restraints: -设置腿部拘束: -Configure modules: -设置模块: -Configure structure: -设置结构: -Configure harness: -设置拘束带: -Open Door -打开门 -Glass Barrier -玻璃面板 -Large Window -大窗 -Small Window -小窗 -Sealed -密封 -No Arm Restraint -无手臂拘束 -Hand Cuffs -手铐 -Boxtie Cuffs -后手缚铐 -Overhead Restraints -拘束过头顶 -No Leg Restraint -无腿部拘束 -Kneeling Cuffs -膝盖铐 -No Module -无模块 -Pleasure Module -快感模块 -Minimal -最小 -'X' style -'X'型 -'+' style -'+'型 -'H' style -'H'型 -Low Security -低安全性 -Medium Security -中等安全性 -Maximum Security -最高安全性 -SourceCharacter opens DestinationCharacter crate. -SourceCharacter打开了DestinationCharacter箱子。 -SourceCharacter engages the glass barrier DestinationCharacter crate. -SourceCharacter在DestinationCharacter箱子上添加了玻璃屏障。 -SourceCharacter opens the large window on DestinationCharacter crate. -SourceCharacter在DestinationCharacter箱子上设置了大窗口。 -SourceCharacter opens the observation port on DestinationCharacter crate. -SourceCharacter在DestinationCharacter箱子上设置了观察小窗。 -SourceCharacter seals DestinationCharacter crate. -SourceCharacter封上了DestinationCharacter箱子。 -SourceCharacter releases DestinationCharacter arms from her crate's restraints. -SourceCharacter解开了DestinationCharacter箱子对她的手臂的束缚。 -SourceCharacter straps in DestinationCharacter arms behind her back. -SourceCharacter将DestinationCharacter手臂束缚到她的身后。 -SourceCharacter straps in DestinationCharacter arms over her head. -SourceCharacter将DestinationCharacter手臂束缚到她的头顶上。 -SourceCharacter releases DestinationCharacter legs from her crate's restraints. -SourceCharacter解开了DestinationCharacter箱子对她的腿部的束缚。 -SourceCharacter straps in DestinationCharacter legs in a suspended kneeling position. -SourceCharacter将DestinationCharacter腿部束缚成悬空跪着的姿势。 -SourceCharacter straps in DestinationCharacter legs together. -SourceCharacter将DestinationCharacter双腿束缚在一起。 -SourceCharacter straps in DestinationCharacter legs apart. -SourceCharacter将DestinationCharacter双腿分开束缚。 -SourceCharacter removes the module from DestinationCharacter crate. -SourceCharacter移除了DestinationCharacter箱子的模块。 -SourceCharacter equips DestinationCharacter crate with a pleasure module. -SourceCharacter对DestinationCharacter箱子上安装了快感模块。 -SourceCharacter changes the structure on DestinationCharacter crate. -SourceCharacter改变了DestinationCharacter箱子的结构。 -SourceCharacter releases the harness on DestinationCharacter crate. -SourceCharacter解开了DestinationCharacter箱子中的束缚带。 -SourceCharacter configures the harness on DestinationCharacter crate. -SourceCharacter配置了DestinationCharacter箱子中的束缚带。 -Select device mode: -选择设备模式: -Upper -上身 -Lower -下身 -SourceCharacter moves DestinationCharacter harness to the lower body. -SourceCharacter移动DestinationCharacter束缚带到下半身。 -SourceCharacter moves DestinationCharacter harness to the upper body. -SourceCharacter移动DestinationCharacter束缚带到上半身。 -SourceCharacter configures DestinationCharacter harness to surround the whole body in straps. -SourceCharacter配置DestinationCharacter束缚带,将她全身包裹在束带里。 -Belt -腰带 -Pelvis -小腹 -Chest -胸部 -Total -所有 -SourceCharacter configures DestinationCharacter harness. -SourceCharacter配置DestinationCharacter束缚带。 -SourceCharacter configures DestinationCharacter straitjacket to restrain hands in the front. -SourceCharacter配置DestinationCharacter拘束衣,将她的双手束缚在身前。 -SourceCharacter configures DestinationCharacter straitjacket to restrain hands in the back. -SourceCharacter配置DestinationCharacter拘束衣,将她的双手束缚在身后。 -SourceCharacter configures DestinationCharacter straitjacket to restrain hands in back. -SourceCharacter配置DestinationCharacter拘束衣,将她的双手束缚在身后。 -Hands in front -双手在前 -Hands behind -双手在后 -Hands in front + chastity -双手在前+贞操带 -Hands behind + chasity -双手在后+贞操带 -SourceCharacter configures DestinationCharacter mittens to relax and leave her hands free -SourceCharacter将DestinationCharacter无指手套配置为松开的状态,让她能自由使用手 -SourceCharacter configures DestinationCharacter mittens to clasp her hands tightly into fists. -SourceCharacter将DestinationCharacter无指手套配置为把她的手束缚为握拳的姿势。 -Gloves Mode -手套模式 -Mittens Mode -连指手套模式 -Timer: 2 min -计时器: 2 分钟 -Timer: 5 min -计时器: 5 分钟 -Timer: 15 min -计时器:15分钟 -Timer: 1 hour -计时器:1小时 -Timer: 20 hours -计时器:20小时 -2 min -2分钟 -5 min -5分钟 -15 min -15分钟 -1 hour -1小时 -20 hours -20小时 -Trigger Inflation -触发膨胀 -Time until deflation: -放气前时间: -Show chat message -显示聊天消息 -Auto-inflation sensitivity: -自动充气灵敏度: -Gag configuration: -口塞设置: -Padded -板状 -Small Plug -小塞子 -Ball -球形 -Large Ball -大球形 -Dildo -阳具形 -SourceCharacter configures DestinationCharacter gag to padded mode. -SourceCharacter将DestinationCharacter口塞设置为板状。 -SourceCharacter configures DestinationCharacter gag to a soft ball. -SourceCharacter将DestinationCharacter口塞设置为软球。 -SourceCharacter configures DestinationCharacter gag to a mouth-filling ball. -SourceCharacter将DestinationCharacter口塞设置为充满嘴的球。 -SourceCharacter configures DestinationCharacter gag to a long dildo. -SourceCharacter将DestinationCharacter口塞设置为长长的假阳具。 -DestinationCharacterName gag inflates into a soft ball. -DestinationCharacterName口塞充气变为软球。 -DestinationCharacterName gag inflates into a mouth-filling ball. -DestinationCharacterName口塞充气变为充满嘴的球。 -DestinationCharacterName gag inflates into a large dildo that forces its way down her throat. -DestinationCharacterName口塞充气变为大号的假阳具,强行深入她的喉咙。 -DestinationCharacterName gag deflates into padded mode. -DestinationCharacterName口塞泄气变为板状。 -DestinationCharacterName gag deflates into a soft ball. -DestinationCharacterName口塞泄气变为软球。 -DestinationCharacterName gag deflates into a mouth-filling ball. -DestinationCharacterName口塞泄气变为充满嘴的球。 -SourceCharacter configures DestinationCharacter gag to not punish her for speaking. -SourceCharacter将DestinationCharacter口塞配置为停止惩罚她的说话行为。 -SourceCharacter configures DestinationCharacter gag to punish her for shouting. -SourceCharacter将DestinationCharacter口塞配置为惩罚她的尖叫行为。 -SourceCharacter configures DestinationCharacter gag to punish her for saying long sentences. -SourceCharacter将DestinationCharacter口塞配置为惩罚她的说复杂句子行为。 -SourceCharacter configures DestinationCharacter gag to punish her for speaking. -SourceCharacter将DestinationCharacter口塞配置为惩罚她的说话行为。 -SourceCharacter configures DestinationCharacter gag to deflate 2 minutes after triggering. -SourceCharacter将DestinationCharacter口塞配置为在触发后2分钟排气。 -SourceCharacter configures DestinationCharacter gag to deflate 5 minutes after triggering. -SourceCharacter将DestinationCharacter口塞配置为在触发后5分钟排气。 -SourceCharacter configures DestinationCharacter gag to deflate 15 minutes after triggering. -SourceCharacter将DestinationCharacter口塞配置为在触发后15分钟排气。 -SourceCharacter configures DestinationCharacter gag to deflate 1 hour after triggering. -SourceCharacter将DestinationCharacter口塞配置为在触发后1小时排气。 -SourceCharacter configures DestinationCharacter gag to deflate 20 hours after triggering. -SourceCharacter将DestinationCharacter口塞配置为在触发后20小时排气。 -SourceCharacter plugs up DestinationCharacter mouth with the dildo plug. -SourceCharacter使用假阳具塞子塞住了DestinationCharacter嘴。 -SourceCharacter pulls out DestinationCharacter dildo plug from her gag. -SourceCharacter从DestinationCharacter口塞里拔出了假阳具塞子。 -SourceCharacter loosens the gag on DestinationCharacter mouth. -SourceCharacter放松了DestinationCharacter嘴上的口塞。 -SourceCharacter polishes the gag on DestinationCharacter mouth. -SourceCharacter擦亮了DestinationCharacter嘴上的口塞。 -SourceCharacter tightens the gag on DestinationCharacter mouth. -SourceCharacter收紧了DestinationCharacter嘴上的口塞。 -The plugs cease abruptly as you are about to go over the edge. -在你快要到达高潮的时候,塞子突然停了下来。 -The plugs bring you so close to release... before turning off suddenly. -塞子马上就要让你到达高潮……突然关闭了。 -Punishment for speaking too much: -说太多话的惩罚: -Shock -电击 -Edge for 5m -寸止5分钟 -Vibe for 5m -振动5分钟 -Punishment for not saying word: -不说话的惩罚: -Punishment for banned words: -说了不该说的话的惩罚: -Public Mode Permission: -公开模式权限: -Club Mistresses -俱乐部女主人 -Current Public Mode: -目前公开模式: -Low -低 -Deny -拒绝 -Random Teasing -随机玩弄 -Random Orgasms -随机高潮 -DestinationCharacterName belt ceases all vibrations. -DestinationCharacterName贞操带停止了所有振动。 -DestinationCharacterName plugs slow down to a frustrating tingle... -DestinationCharacterName体内的玩具慢下来,只剩下令人沮丧的微微颤动…… -DestinationCharacterName belt starts pulsating strongly! -DestinationCharacterName贞操带猛烈地颤动起来! -DestinationCharacterName belt starts vibrating intensely! -DestinationCharacterName贞操带激烈地振动起来! -Your plugs slow down to a frustrating tingle... -你体内的玩具慢下来,只剩下令人沮丧的微微颤动…… -Your belt starts pulsating strongly! -你的贞操带猛烈地颤动起来! -The plugs inside of you start buzzing intensely! -你体内的玩具激烈地振动起来! -DestinationCharacterName belt starts to tease her gently... -DestinationCharacterName贞操带开始温柔地逗弄她…… -DestinationCharacterName belt starts teasing her... -DestinationCharacterName贞操带开始逗弄她…… -DestinationCharacterName belt vibrates suddenly! -DestinationCharacterName贞操带突然开始振动! -DestinationCharacterName belt vibrates intensely! -DestinationCharacterName贞操带激烈地振动! -DestinationCharacterName belt starts buzzing strongly! -DestinationCharacterName贞操带猛烈地颤动起来! -DestinationCharacterName belt tingles just a little bit... -DestinationCharacterName贞操带微微颤动了一下…… -DestinationCharacterName belt vibrates gently. -DestinationCharacterName贞操带柔和地振动着。 -DestinationCharacterName belt slows down to a weak buzz... -DestinationCharacterName贞操带慢下来,微弱振动着…… -DestinationCharacterName belt edges her strongly! -DestinationCharacterName贞操带让她几乎高潮! -DestinationCharacterName belt brings her close to the edge! -DestinationCharacterName贞操带将她推向高潮边缘! -Your belt slows down to a weak buzz... -你的的贞操带慢下来,微弱振动着…… -Your belt edges you strongly! -你的的贞操带让你几乎高潮! -Your belt brings you close to the edge! -你的贞操带将你推向高潮边缘! -DestinationCharacterName belt gradually slows to a halt. -DestinationCharacterName贞操带逐渐变慢,最后停了下来。 -No standing up without help -没有帮助无法站起 -Configure Belt -配置贞操带 -Select Model Number -选择型号 -Configure Front Shield -配置前挡板 -Configure Rear Shield -配置后挡板 -Configure Tamper Protection -配置挣脱保护 -Configure Orgasm Prevention -配置高潮保护 -Model Number -型号 -Front Shield -前挡板 -Rear Shield -后挡板 -Tamper Protection -擅动保护 -Orgasm Prevention -高潮保护 -Prototype -原型 -High-Security Series -高安全系列 -Training Series -训练系列 -Neo Series -全新系列 -Front Open -前挡板打开 -Front Locked -前挡板锁定 -Rear Open -后挡板打开 -Rear Locked -后挡板锁定 -Disabled -关闭 -Punish Local Tampering -惩罚擅动本物品 -Punish All Tampering -惩罚所有擅动 -Allow Orgasms -允许高潮 -Punish Orgasms -惩罚高潮 -Shock when wearer reaches orgasm -在穿戴者到达高潮时电击 -Prevent tampering with this item -防止擅动本物品 -Shock wearer when struggling with other items -在佩戴者试图挣脱其他物品时电击 -Show messages to other players -向其他玩家显示信息 -SourceCharacter changes the model of DestinationCharacter belt. -SourceCharacter改变了DestinationCharacter贞操带的型号。 -SourceCharacter configures DestinationCharacter belt to punish orgasms. -SourceCharacter将DestinationCharacter贞操带配置为禁止高潮。 -SourceCharacter configures DestinationCharacter belt to punish tampering with the belt. -SourceCharacter将DestinationCharacter贞操带配置为惩罚擅动贞操带。 -SourceCharacter configures DestinationCharacter belt to punish struggling. -SourceCharacter将DestinationCharacter贞操带配置为惩罚挣脱。 -SourceCharacter configures DestinationCharacter belt to allow orgasms. -SourceCharacter将DestinationCharacter贞操带配置为允许高潮。 -SourceCharacter disables the tamper protection on DestinationCharacter belt. -SourceCharacter关闭了DestinationCharacter贞操带上的擅动保护。 -SourceCharacter opens the back of DestinationCharacter belt. -SourceCharacter打开了DestinationCharacter贞操带的后挡板。 -SourceCharacter opens the front of DestinationCharacter belt. -SourceCharacter打开了DestinationCharacter贞操带的前挡板。 -SourceCharacter locks the rear shield of DestinationCharacter belt. -SourceCharacter锁定了DestinationCharacter贞操带的后挡板。 -SourceCharacter locks the front shield of DestinationCharacter belt. -SourceCharacter锁定了DestinationCharacter贞操带的前挡板。 -SourceCharacter configures DestinationCharacter belt. -SourceCharacter改变了DestinationCharacter贞操带的配置。 -Time until recharged: -距离再充能时间: -Punishment Charged -惩罚已充能 -DestinationCharacterName belt shocks her for standing up without permission! -DestinationCharacterName贞操带电击了她,因为她未经许可站起身! -DestinationCharacterName belt shocks her for speaking too much! -DestinationCharacterName贞操带电击了她,因为她话说得太多了! -DestinationCharacterName belt shocks her for not saying 'ReplacementWord!' -DestinationCharacterName贞操带电击了她,因为她没有说'ReplacementWord'! -DestinationCharacterName belt shocks her for saying 'ReplacementWord!' -DestinationCharacterName贞操带电击了她,因为她说了'ReplacementWord'! -DestinationCharacterName belt punishes her for speaking too much! -DestinationCharacterName贞操带惩罚了她,因为她话说得太多了! -DestinationCharacterName belt punishes her for not saying 'ReplacementWord!' -DestinationCharacterName贞操带惩罚了她,因为她没有说'ReplacementWord'! -DestinationCharacterName belt punishes her for saying 'ReplacementWord!' -DestinationCharacterName贞操带惩罚了她,因为她说了'ReplacementWord'! -DestinationCharacterName belt detects an orgasm and shocks her! -DestinationCharacterName贞操带探测到一次高潮,并对她释放电击! -DestinationCharacterName belt detects tampering and shocks her! -DestinationCharacterName贞操带探测到一次擅动,并对她释放电击! -DestinationCharacterName belt detects her struggling and delivers an intense shock! -DestinationCharacterName贞操带探测到她试图挣脱,并对她释放强烈电击! -DestinationCharacterName bindings tighten around her body with a hiss as they lock themselves automatically. -DestinationCharacterName身上的束缚在短暂的电流声后,收紧并且自动地上了锁。 -DestinationCharacterName bindings release her with a hiss. -DestinationCharacterName身上的束缚在短暂的电流声后释放了她。 -DestinationCharacterName bindings reboot with different colors. -DestinationCharacterName身上的束缚重新启动,并且颜色不同了。 -Let all players use head device features -让所有玩家能使用头部装置特性 -Let all players modify futuristic chastity -让所有玩家能修改未来贞操带 -Let all players modify futuristic arm devices -让所有玩家能修改未来手臂装置 -Let all players modify futuristic leg devices -让所有玩家能修改未来腿部装置 -DestinationCharacterName collar can now be used by anyone. -DestinationCharacterName项圈现在可以被任何人使用了。 -DestinationCharacterName collar now can't be used while locked. -DestinationCharacterName项圈现在被锁定时不能被人使用。 -DestinationCharacterName chastity devices can now be altered by anyone. -DestinationCharacterName贞操装置现在可以被任何人更改。 -DestinationCharacterName chastity devices now can't be changed while locked. -DestinationCharacterName贞操装置现在被锁定时不能被更改。 -DestinationCharacterName arm bindings can now be altered by anyone. -DestinationCharacterName手臂束缚现在可以被任何人更改。 -DestinationCharacterName arm bindings now can't be changed while locked. -DestinationCharacterName手臂束缚现在被锁定时不能被更改。 -DestinationCharacterName leg bindings can now be altered by anyone. -DestinationCharacterName腿部束缚现在可以被任何人更改。 -DestinationCharacterName leg bindings now can't be changed while locked. -DestinationCharacterName腿部束缚现在被锁定时不能被更改。 -Block remotes on the wearer -阻止穿戴者的遥控器 -DestinationCharacterName vibrator remotes are now locked. -DestinationCharacterName振动玩具模式现在被锁定。 -DestinationCharacterName vibrator remotes are now unlocked. -DestinationCharacterName振动玩具模式现在已解锁。 -Collar settings are locked -项圈设置被锁定 -Current Status: -目前状态: -Partially Locked -部分锁定 -Fully Locked -完全锁定 -No Futuristic Items Worn -没有穿戴未来物品 -Lock Metal -上金属挂锁 -Lock Intricate -上复杂的挂锁 -Lock HighSec -上高安全锁 -Lock Exclusive -上专属挂锁 -Lock 5 Minutes -上五分钟计时锁 -Lock Mistress -上女主人锁 -Lock Lovers -上恋人锁 -Lock Owner -上主人锁 -Lock Pandora -上潘多拉锁 -Lock Combo -上组合密码锁 -Lock Password -上密码锁 -Lock Safeword -上安全词锁 -Mistress Timer -女主人计时锁 -Password Timer -密码计时锁 -Lovers Timer -恋人计时锁 -Owner Timer -主人计时锁 -Code: -密码: -Time (in mins): -时间(分钟): -Unlock -解锁 -Copy Colors To Items -复制颜色到物品 -Select heel mode -选择鞋跟模式 -Heels Retracted -鞋跟收回 -Heels Extended -鞋跟伸出 -SourceCharacter retracts the heels on DestinationCharacter shoes. -SourceCharacter收回了DestinationCharacter鞋跟。 -SourceCharacter extends the heels on DestinationCharacter shoes. -SourceCharacter伸长了DestinationCharacter鞋跟。 -Select finish -选择完成 -Matte -哑光 -SourceCharacter polishes DestinationCharacter shoes. -SourceCharacter给DestinationCharacter鞋添加高光。 -SourceCharacter removes the polish on DestinationCharacter shoes. -SourceCharacter移除了DestinationCharacter鞋上的高光。 -Select binder length -选择束缚长度 -Full length -完整长度 -Half length -一半长度 -SourceCharacter adds a full-length binder to DestinationCharacter AssetName. -SourceCharacter在DestinationCharacterAssetName上添加了完整长度的束缚。 -SourceCharacter adds a half-length binder to DestinationCharacter AssetName. -SourceCharacter在DestinationCharacterAssetName上添加了一半长度的束缚。 -Configure settings: -配置选项: -Configure display: -配置显示: -Configure shine: -配置发光: -Display -显示 -Shine -发光 -No Display -不显示 -SourceCharacter shows the display on DestinationCharacter bra. -SourceCharacter让DestinationCharacter胸罩上的屏幕显示出来。 -SourceCharacter hides the display on DestinationCharacter bra. -SourceCharacter隐藏了DestinationCharacter胸罩上的屏幕。 -SourceCharacter polishes DestinationCharacter bra. -SourceCharacter给DestinationCharacter胸罩添加高光。 -SourceCharacter removes the polish on DestinationCharacter bra. -SourceCharacter移除了DestinationCharacter胸罩上的高光。 -Diagnostics for wearer -穿戴者的诊断信息 -Current Body Temp: -目前体温: -°C -°C -Current Breathing: -目前呼吸: -Steady -平稳 -Shaky -颤抖 -Excited -兴奋 -Current Heart Rate: -当前心率: -Current Training Level: -目前的训练级别: -Tracking Signal: Good -跟踪信号:好 -Cover Display -关闭显示器 -Show Display -打开显示器 -Cover Display (Alt) -关闭显示器(其他) -Show Display (Alt) -打开显示器(其他) -SourceCharacter covers the display on DestinationCharacter bra. -SourceCharacter覆盖住了DestinationCharacter胸罩上的显示器。 -SourceCharacter opens up the display on DestinationCharacter bra. -SourceCharacter打开了DestinationCharacter胸罩上的显示器。 -BPM -心率 -Cup interactions -与茶杯交互 -Tip over -打落 -Remove -移除 -Place -放置 -SourceCharacter removes the cup from DestinationCharacter cup holder gag. -SourceCharacter从DestinationCharacter杯架口塞上移除了杯子。 -SourceCharacter tips over the cup on DestinationCharacter cup holder gag. -SourceCharacter将DestinationCharacter杯架口塞上的杯子翻转。 -SourceCharacter places a cup on DestinationCharacter cup holder gag. -SourceCharacter在DestinationCharacter杯架口塞上放了一个杯子。 -Select the type of blindfold -选择眼罩类型 -Select tape style -选择胶带样式 -Double -双层 -Wrap -环绕 -Open Mummy -开放式木乃伊 -SourceCharacter takes a piece of duct tape for TargetCharacter and places it on her face. -SourceCharacter从TargetCharacter身上拿了些胶带,贴在了她的脸上。 -SourceCharacter wraps some duct tape onto DestinationCharacter face. -SourceCharacter在TargetCharacter的脸上缠了一些胶带。 -SourceCharacter wraps DestinationCharacter head in tape with multiple layers. -SourceCharacter用许多层胶带包裹住了DestinationCharacter头。 -SourceCharacter wraps DestinationCharacter head in tape with the eyes free. -SourceCharacter用胶带包裹住了DestinationCharacter头,但露出眼睛。 -Change Opacity -改变遮光度 -Select Locker type -选择储物柜类型 -Vents -有通风口 -Ventless -无通风口 -SourceCharacter changes the vents on DestinationCharacter locker. -SourceCharacter改变了DestinationCharacter储物柜上的通风口。 -Select vacbed type. -选择真空床类型 -Hair -有头发 -No Hair -无头发 -SourceCharacter reveals DestinationCharacter hair from the vacbed. -SourceCharacter从DestinationCharacter真空床里拉出了她的头发。 -SourceCharacter tucks DestinationCharacter hair into the vacbed. -SourceCharacter把DestinationCharacter头发塞进了真空床里。 -Opacity -透明度 -SourceCharacter changes DestinationCharacter pose in her Vacuum Bed Deluxe. -SourceCharacter改变了DestinationCharacter在豪华真空床中的姿势。 -Select the rope bondage -选择绳缚方式 -Basic Tie -基本束缚 -Mermaid Tie -美人鱼缚 -Full Binding Tie -完全束缚 -Link Tie -连接束缚 -Frogtie Tie -蛙缚 -Crossed Tie -十字缚 -Box Tie -后手缚 -Tight Box Tie -紧束后手缚 -Swiss Seat -瑞士座 -Kikkou Hip -龟甲臀缚 -Ankles Tie -脚踝结 -Knees Tie -膝盖结 -Ankles and Knees Tie -脚踝和膝盖结 -Thighs Tie -大腿结 -Knees and Thighs Tie -膝盖和大腿结 -Select straitjacket prep -选择拘束衣 -Basic -基本 -Pulled Out Straps -拉紧系带 -Lining Straps -横向系带 -Extra Padding -额外护垫 -Pulled Straps & Lining -拉紧系带和横向系带 -Pulled Straps & Padding -拉紧系带并添加护垫 -Padding & Lining -护垫和横向系带 -Full Jacket -完整拘束 -SourceCharacter removes all addons from DestinationCharacter tightjacket. -SourceCharacter从DestinationCharacter拘束衣上移除了所有附加物。 -SourceCharacter pulls out the straps on DestinationCharacter tightjacket. -SourceCharacter拉紧DestinationCharacter拘束衣上的系带。 -SourceCharacter adds lining straps to DestinationCharacter tightjacket. -SourceCharacter给DestinationCharacter拘束衣上添加了几条横向系带。 -SourceCharacter adds extra padding to DestinationCharacter tightjacket. -SourceCharacter给DestinationCharacter拘束衣上添加了额外护垫。 -SourceCharacter pulls out the straps and adds lining straps to DestinationCharacter tightjacket. -SourceCharacter拉紧DestinationCharacter拘束衣上的系带,并添加了几条横向系带。 -SourceCharacter pulls out the straps and adds extra padding to DestinationCharacter tightjacket. -SourceCharacter拉紧DestinationCharacter拘束衣上的系带,并添加了额外护垫。 -SourceCharacter adds extra padding and lining straps to DestinationCharacter tightjacket. -SourceCharacter给DestinationCharacter拘束衣添加了额外护垫和几条横向系带。 -SourceCharacter adds all addons to DestinationCharacter tightjacket. -SourceCharacter给DestinationCharacter拘束衣添加了所有的附加物。 -Select Ziptie Bondage -选择扎带捆绑 -Light Binding -轻度捆绑 -Medium Binding -中度捆绑 -Full Binding -完全捆绑 -Elbow Wrist Binding -手腕&手肘束缚 -Light Wrist Binding -轻度腰部束缚 -Medium Wrist Binding -中度腰部束缚 -Full Wrist Binding -完全腰部束缚 -Wrist Binding -腰不舒服 -Kneeling Hogtie -跪姿蛙缚 -Frogtie -驷马 -SourceCharacter uses the zipties on TargetCharacter to lightly bind her elbows and wrists. -SourceCharacter使用扎带稍稍束缚TargetCharacter的手腕和手肘。 -SourceCharacter uses the zipties on TargetCharacter to half bind her elbows and wrists. -SourceCharacter使用扎带部分束缚TargetCharacter的手腕和手肘。 -SourceCharacter uses the zipties on TargetCharacter to fully bind her elbows and wrists. -SourceCharacter使用扎带完全束缚TargetCharacter的手腕和手肘。 -SourceCharacter uses the zipties on TargetCharacter to bind her elbows and wrists. -SourceCharacter使用扎带束缚住TargetCharacter的手腕和手肘。 -SourceCharacter uses the zipties on TargetCharacter to lightly bind her wrists. -SourceCharacter使用扎带稍稍束缚TargetCharacter的手腕。 -SourceCharacter uses the zipties on TargetCharacter to half bind her wrists. -SourceCharacter使用扎带部分束缚TargetCharacter的手腕。 -SourceCharacter uses the zipties on TargetCharacter to fully bind her wrists. -SourceCharacter使用扎带完全束缚TargetCharacter的手腕。 -SourceCharacter uses the zipties on TargetCharacter to bind her wrists behind her back. -SourceCharacter使用扎带把TargetCharacter的手腕束缚在她的背后。 -SourceCharacter uses the zipties on TargetCharacter to hogtie her. -SourceCharacter使用扎带把TargetCharacter绑成驷马缚。 -SourceCharacter uses the zipties on TargetCharacter to hogtie her on her knees. -SourceCharacter使用扎带把TargetCharacter绑成驷马缚,并使她跪下。 -SourceCharacter uses the zipties on TargetCharacter bind her on all fours. -SourceCharacter使用扎带把TargetCharacter绑成四肢着地。 -SourceCharacter uses the zipties on TargetCharacter to lighty bind her legs. -SourceCharacter使用扎带稍稍束缚TargetCharacter的腿。 -SourceCharacter uses the zipties on TargetCharacter to half bind her legs. -SourceCharacter使用扎带部分束缚TargetCharacter的腿。 -SourceCharacter uses the zipties on TargetCharacter to fully bind her legs. -SourceCharacter使用扎带完全束缚TargetCharacter的腿。 -SourceCharacter uses the zipties on TargetCharacter to frogtie her. -SourceCharacter使用扎带把TargetCharacter绑成蛙缚。 -SourceCharacter uses the zipties on TargetCharacter to lightly bind her feet. -SourceCharacter使用扎带稍稍束缚TargetCharacter的脚。 -SourceCharacter uses the zipties on TargetCharacter to half bind her feet. -SourceCharacter使用扎带部分束缚TargetCharacter的脚。 -SourceCharacter uses the zipties on TargetCharacter to fully bind her feet. -SourceCharacter使用扎带完全束缚TargetCharacter的脚。 -Toes -脚趾 -SourceCharacter uses the tape on TargetCharacter to tie her toes together with tape. -SourceCharacter使用胶带把TargetCharacter的脚趾绑在一起。 -SourceCharacter uses the tape on TargetCharacter to fully wrap her feet with tape. -SourceCharacter使用胶带把TargetCharacter的脚完全包住。 -Suspension Tie -吊起束缚 -Wrist and Elbow Tie -手肘和手腕束缚 -Wrist Tie -手腕束缚 -Rope Cuffs -绳铐 -Crossed Boxtie -交叉束缚 -Wrist & Elbow Harness Tie -腰肘连束 -Simple Hogtie -简单驷马 -Suspended Kneeling Hogtie -吊起跪姿驷马缚 -Suspended Hogtie -吊起驷马缚 -Suspended All Fours -吊起四肢着地 -Inverted Suspended Hogtie -反向吊起驷马缚 -Inverted Suspended All Fours -反向吊起四肢着地 -Crotch Rope -股绳 -Over Panties -在内裤外 -Body Harness -身体束带 -Star Harness Tie -星形束带结 -Waist Rope -腹部绳缚 -Diamond Tie -菱形束缚 -Bed Spread-Eagle -大字捆床 -No Requirement -没有需求 -Need Bondage ReqLevel -需要束缚技能等级ReqLevel -SourceCharacter uses the rope on TargetCharacter to do a crotch rope tie. -SourceCharacter用绳子在TargetCharacter身上绑了一个胯部绳缚。 -SourceCharacter uses the rope on TargetCharacter to do a body harness. -SourceCharacter用绳子在TargetCharacter身上绑了一个身体束带。 -SourceCharacter uses the rope on TargetCharacter to tie a star harness. -SourceCharacter用绳子在TargetCharacter身上绑了一个星形束带。 -SourceCharacter uses the rope on TargetCharacter to tie a waist rope on her. -SourceCharacter用绳子在TargetCharacter身上绑了一个腹部绳缚。 -SourceCharacter uses the rope on TargetCharacter to do a diamond style harness. -SourceCharacter用绳子在TargetCharacter身上绑了一个菱形束缚。 -SourceCharacter uses the rope on TargetCharacter to do a basic tie. -SourceCharacter用绳子在TargetCharacter身上绑了一个基础束缚。 -SourceCharacter uses the rope on TargetCharacter to do a mermaid tie. -SourceCharacter用绳子在TargetCharacter身上绑了一个美人鱼缚。 -SourceCharacter uses the rope on TargetCharacter to do a full binding tie. -SourceCharacter用绳子把TargetCharacter绑成了完全束缚。 -SourceCharacter uses the rope on TargetCharacter to do a frogtie tie. -SourceCharacter用绳子在TargetCharacter身上绑了一个蛙缚。 -SourceCharacter uses the rope on TargetCharacter to do a suspension tie. -SourceCharacter用绳子在TargetCharacter身上绑了一个吊起束缚。 -SourceCharacter uses the rope on TargetCharacter to do a full binding with links tie in. -SourceCharacter用绳子把TargetCharacter绑成了完全束缚,并附带一些连接的绳结。 -SourceCharacter uses the rope on TargetCharacter to do a diamond style tie. -SourceCharacter用绳子在TargetCharacter身上绑了一个菱形形式的束缚带。 -SourceCharacter uses the rope on TargetCharacter to do a crossed style binding tie. -SourceCharacter用绳子在TargetCharacter身上绑了一个十字缚形式的束缚带。 -SourceCharacter uses the rope on TargetCharacter to tie her legs to the bedposts. -SourceCharacter用绳子把TargetCharacter的腿绑到床柱上。 -SourceCharacter ties the rope above TargetCharacter's knees. -SourceCharacter ties the rope above TargetCharacter's knees. -SourceCharacter uses the rope to tie TargetCharacter's thighs. -SourceCharacter uses the rope to tie TargetCharacter's thighs. -SourceCharacter uses the ropes to tie TargetCharacter's knees and thighs. -SourceCharacter uses the ropes to tie TargetCharacter's knees and thighs. -SourceCharacter ties the rope around TargetCharacter's ankles. -SourceCharacter ties the rope around TargetCharacter's ankles. -SourceCharacter ties the rope below TargetCharacter's knees. -SourceCharacter ties the rope below TargetCharacter's knees. -SourceCharacter ties the ropes around TargetCharacter's ankles and knees. -SourceCharacter ties the ropes around TargetCharacter's ankles and knees. -SourceCharacter uses the ropes on TargetCharacter to tie her legs to the bedposts. -SourceCharacter uses the ropes on TargetCharacter to tie her legs to the bedposts. -SourceCharacter uses rope on TargetCharacter to do a box tie. -SourceCharacter用绳子在TargetCharacter身上绑了一个后手缚。 -SourceCharacter uses rope on TargetCharacter to do a tight boxtie. -SourceCharacter用绳子在TargetCharacter身上绑了一个紧束后手缚。 -SourceCharacter uses rope on TargetCharacter to do a crossed boxtie. -SourceCharacter用绳子在TargetCharacter身上绑了一个十字后手缚。 -SourceCharacter uses rope to hogtie TargetCharacter. -SourceCharacter用绳子把TargetCharacter绑成驷马缚。 -SourceCharacter uses rope to tie DestinationCharacter wrists and elbows together behind her back. -SourceCharacter用绳子把DestinationCharacter手腕和手肘在她的身后绑在一起。 -SourceCharacter uses rope to tie DestinationCharacter wrists together behind her back. -SourceCharacter用绳子把DestinationCharacter手腕在她的身后绑在一起。 -SourceCharacter uses rope to tie rope cuffs on DestinationCharacter wrists -SourceCharacter用绳子在DestinationCharacter手腕上绑了一个绳子手铐。 -SourceCharacter uses rope to tie DestinationCharacter wrists and elbows in a harness behind her back. -SourceCharacter用绳子在DestinationCharacter身上绑了一个绳缚,并把她的手腕和手肘在她的身后绑在一起。 -SourceCharacter uses rope on TargetCharacter to have her crawling on all fours. -SourceCharacter用绳子把TargetCharacter绑起来,让她只能四肢着地。 -SourceCharacter uses rope to hogtie TargetCharacter on her knees. -SourceCharacter用绳子把TargetCharacter绑成驷马缚,并让她跪在地上。 -SourceCharacter uses rope to tie DestinationCharacter arms to the bedposts. -SourceCharacter用绳子把DestinationCharacter手臂绑到床柱上。 -Select Rope Bondage. -选择绳索束缚 -Lowered -降低 -Suspended -悬挂 -SourceCharacter uses the rope on TargetCharacter to suspend her. -SourceCharacter用绳子把TargetCharacter吊起来。 -SourceCharacter uses the rope on TargetCharacter to lower her. -SourceCharacter用绳子把TargetCharacter吊得更低。 -Select Chain Bondage. -选择链条束缚 -SourceCharacter uses the chain on TargetCharacter to suspend her. -SourceCharacter用链条把TargetCharacter吊起来。 -SourceCharacter uses the chain on TargetCharacter to lower her. -SourceCharacter用链条把TargetCharacter吊得更低。 -How much do you want to inflate the strait leotard? -你想要把拘束紧身衣充气到什么程度? -SourceCharacter adjusts DestinationCharacter inflatable strait leotard to be only lightly filled. -SourceCharacter调整DestinationCharacter可充气式拘束紧身衣到稍稍充气的程度。 -SourceCharacter adjusts DestinationCharacter inflatable strait leotard to be half filled. -SourceCharacter调整DestinationCharacter可充气式拘束紧身衣到充一半气的程度。 -SourceCharacter adjusts DestinationCharacter inflatable strait leotard to three quarters filled. -SourceCharacter调整DestinationCharacter可充气式拘束紧身衣到充四分之三气的程度。 -SourceCharacter adjusts DestinationCharacter inflatable strait leotard to fill the maximum amount. -SourceCharacter调整DestinationCharacter可充气式拘束紧身衣到最大充气的程度。 -SourceCharacter uses the rope on TargetCharacter to do a crotch rope tie over her panties. -SourceCharacter用绳子在TargetCharacter内裤外面绑了一个股绳。 -SourceCharacter uses the rope on TargetCharacter to do a swiss seat style rope tie. -SourceCharacter用绳子给TargetCharacter绑了一个瑞士座样式的绳缚。 -SourceCharacter uses the rope on TargetCharacter to do a kikkou hip style rope tie. -SourceCharacter用绳子给TargetCharacter绑了一个龟甲臀缚。 -Select the amount of padding. -选择垫子的数量 -Regular Padding -常规垫子 -The extra padding is removed from DestinationCharacterName poofy diaper. Though it is still embarrassingly huge. -DestinationCharacterName屎尿布里,额外的垫子被移除了。但这仍然大得令人难堪。 -Extra padding is added to DestinationCharacterName poofy diaper. Making it crinkle louder and force the baby to waddle. -额外的垫子被添加进了DestinationCharacterName屎尿布里。这使得尿布皱褶的声音更响了,小宝贝也不得不蹒跚行走。 -Choose the belt's options. -选择贞操带的选项。 -Crotch Shield -胯部护盾 -Shock Module -电击模块 -Engraving -刻字 -Choose the crotch shield's state. -选择胯部护盾的状态 -Opened -打开 -Close Front -关闭前部 -Close Back -关闭后部 -Close Both -都关闭 -Select the shock module configuration. -选择电击模块配置。 -Enabled -启用 -Engrave the belt. -为贞操带刻字 -Engrave -刻字 -SourceCharacter opens the crotch shield on DestinationCharacter obedience belt. -SourceCharacter打开了DestinationCharacter服从贞操带的胯部护盾。 -SourceCharacter closes the front crotch shield of DestinationCharacter obedience belt. -SourceCharacter关闭了DestinationCharacter服从贞操带的前部胯部护盾。 -SourceCharacter closes the back crotch shield on DestinationCharacter obedience belt. -SourceCharacter关闭了DestinationCharacter服从贞操带的后部胯部护盾。 -SourceCharacter closes both crotch shields on DestinationCharacter obedience belt. -SourceCharacter关闭了DestinationCharacter服从贞操带的前后两个胯部护盾。 -SourceCharacter removes the shock module from DestinationCharacter obedience belt. -SourceCharacter移除了DestinationCharacter服从贞操带的电击模块。 -SourceCharacter sets up the shock module on DestinationCharacter obedience belt. -SourceCharacter为DestinationCharacter服从贞操带添加了电击模块。 -Engrave the following text on the belt: -在贞操带上刻下了如下文字: -SourceCharacter engraved “NewText” on DestinationCharacter obedience belt. -SourceCharacter在DestinationCharacter的服从贞操带上刻下了“NewText”。 -SourceCharacter erases the engraving on DestinationCharacter obedience belt. -SourceCharacter移除了DestinationCharacter的服从贞操带上的刻字。 -Show messages in chat -在聊天中显示消息 -Punish orgasms -惩罚高潮 -Punish standing up -惩罚站立 -The obedience belt on SourceCharacter shocks her. -SourceCharacter受到了身上的服从贞操带的电击。 -The obedience belt on SourceCharacter shocks her for having an orgasm. -SourceCharacter因为得到了一次高潮,而受到了身上的服从贞操带的电击。 -The obedience belt on SourceCharacter shocks her for standing up. -SourceCharacter因为站起来,而受到了身上的服从贞操带的电击。 -Reset trigger count -重置触发计数 -Trigger count: ShockCount -触发计数:ShockCount -SourceCharacter resets DestinationCharacter AssetName trigger count. -SourceCharacter重置了DestinationCharacterAssetName的触发计数。 -Item intensity: Disabled -物品强度:关闭 -Item intensity: Low -物品强度:低 -Item intensity: Medium -物品强度:中 -Item intensity: High -物品强度:高 -Item intensity: Maximum -物品强度:最大 -Item sensitivity: Disabled -物品敏感度:关闭 -Item sensitivity: Low -物品敏感度:低 -Item sensitivity: Medium -物品敏感度:中 -Item sensitivity: High -物品敏感度:高 -Item sensitivity: Maximum -物品敏感度:最大 -Egg item intensity: Disabled -跳蛋物品强度:关闭 -Egg item intensity: Low -跳蛋物品强度:低 -Egg item intensity: Medium -跳蛋物品强度:中 -Egg item intensity: High -跳蛋物品强度:高 -Egg item intensity: Maximum -跳蛋物品强度:最大 -Dildo item intensity: Disabled -假阳具物品强度:关闭 -Dildo item intensity: Low -假阳具物品强度:低 -Dildo item intensity: Medium -假阳具物品强度:中 -Dildo item intensity: High -假阳具物品强度:高 -Dildo item intensity: Maximum -假阳具物品强度:最大 -Increase -增加 -Decrease -减少 -Show chat message -显示聊天消息 -SourceCharacter sets DestinationCharacter AssetName to low intensity. -SourceCharacter将DestinationCharacterAssetName设置为低强度。 -SourceCharacter sets DestinationCharacter AssetName to moderate intensity. -SourceCharacter将DestinationCharacterAssetName设置为中强度。 -SourceCharacter sets DestinationCharacter AssetName to high intensity. -SourceCharacter将DestinationCharacterAssetName设置为高强度。 -SourceCharacter sets DestinationCharacter AssetName to manual mode. -SourceCharacter将DestinationCharacterAssetName设置为手动模式。 -SourceCharacter sets DestinationCharacter AssetName to low sensitivity. -SourceCharacter将DestinationCharacterAssetName设置为低敏感度。 -SourceCharacter sets DestinationCharacter AssetName to medium sensitivity. -SourceCharacter将DestinationCharacterAssetName设置为中敏感度。 -SourceCharacter sets DestinationCharacter AssetName to maximum sensitivity. -SourceCharacter将DestinationCharacterAssetName设置为高敏感度。 -DestinationCharacterName AssetName gives her a light shock. -DestinationCharacterNameAssetName轻微地电了她一下。 -DestinationCharacterName AssetName lets out a sharp jolt! -DestinationCharacterNameAssetName发出尖锐的电击! -DestinationCharacterName AssetName delivers an intense shock! -DestinationCharacterNameAssetName猛烈地电击了她! -DestinationCharacterName collar gives her a light shock. -DestinationCharacterName项圈轻微地电了她一下。 -DestinationCharacterName collar lets out a sharp jolt! -DestinationCharacterName项圈发出尖锐的电击! -DestinationCharacterName collar delivers an intense shock! -DestinationCharacterName项圈猛烈地电击了她! -DestinationCharacterName vibrating egg stops vibrating. -DestinationCharacterName振动跳蛋停止振动。 -DestinationCharacterName vibrating egg slows down into a light tease. -DestinationCharacterName振动跳蛋慢下来,仅仅在轻微逗弄。 -DestinationCharacterName vibrating egg returns to a moderate pace. -DestinationCharacterName振动跳蛋恢复了中等的频率。 -DestinationCharacterName vibrating egg slows down a tiny bit. -DestinationCharacterName振动跳蛋稍微慢下来一点。 -DestinationCharacterName vibrating egg starts teasing her lightly. -DestinationCharacterName振动跳蛋微微逗弄起她来。 -DestinationCharacterName vibrating egg builds up to a moderate pace. -DestinationCharacterName振动跳蛋逐渐提升到中等的频率。 -DestinationCharacterName vibrating egg starts buzzing strongly! -DestinationCharacterName振动跳蛋猛烈地振动起来! -DestinationCharacterName vibrating egg jumps up to maximum intensity! -DestinationCharacterName振动跳蛋突然以最大强度振动起来! -DestinationCharacterName sybian stops vibrating. -DestinationCharacterName鞍式振动器停止振动。 -DestinationCharacterName sybian slows down into a light tease. -DestinationCharacterName鞍式振动器慢下来,仅仅在轻微逗弄。 -DestinationCharacterName sybian returns to a moderate pace. -DestinationCharacterName鞍式振动器恢复了中等的频率。 -DestinationCharacterName sybian slows down a tiny bit. -DestinationCharacterName鞍式振动器稍微慢下来一点。 -DestinationCharacterName sybian starts teasing her lightly. -DestinationCharacterName鞍式振动器微微逗弄起她来。 -DestinationCharacterName sybian builds up to a moderate pace. -DestinationCharacterName鞍式振动器逐渐提升到中等的频率。 -DestinationCharacterName sybian starts buzzing strongly! -DestinationCharacterName鞍式振动器猛烈地颤动起来! -DestinationCharacterName sybian jumps up to maximum intensity! -DestinationCharacterName鞍式振动器突然以最大强度振动起来! -DestinationCharacterName vibrating dildo stops vibrating. -DestinationCharacterName振动阳具停止振动。 -DestinationCharacterName vibrating dildo slows down into a light tease. -DestinationCharacterName振动阳具慢下来,仅仅在轻微逗弄。 -DestinationCharacterName vibrating dildo returns to a moderate pace. -DestinationCharacterName振动阳具恢复了中等的频率。 -DestinationCharacterName vibrating dildo slows down a tiny bit. -DestinationCharacterName振动阳具稍微慢下来一点。 -DestinationCharacterName vibrating dildo starts teasing her lightly. -DestinationCharacterName振动阳具微微逗弄起她来。 -DestinationCharacterName vibrating dildo builds up to a moderate pace. -DestinationCharacterName振动阳具逐渐提升到中等的频率。 -DestinationCharacterName vibrating dildo starts buzzing strongly! -DestinationCharacterName振动阳具猛烈地颤动起来! -DestinationCharacterName vibrating dildo jumps up to maximum intensity! -DestinationCharacterName振动阳具突然以最大强度振动起来! -DestinationCharacterName clitoral stimulator stops vibrating. -DestinationCharacterName阴蒂刺激器停止振动。 -DestinationCharacterName clitoral stimulator slows down into a light tease. -DestinationCharacterName阴蒂刺激器慢下来,仅仅在轻微逗弄。 -DestinationCharacterName clitoral stimulator returns to a moderate pace. -DestinationCharacterName阴蒂刺激器恢复了中等的频率。 -DestinationCharacterName clitoral stimulator slows down a tiny bit. -DestinationCharacterName阴蒂刺激器稍微慢下来一点。 -DestinationCharacterName clitoral stimulator starts teasing her lightly. -DestinationCharacterName阴蒂刺激器微微逗弄起她来。 -DestinationCharacterName clitoral stimulator builds up to a moderate pace. -DestinationCharacterName阴蒂刺激器逐渐提升到中等的频率。 -DestinationCharacterName clitoral stimulator starts buzzing strongly! -DestinationCharacterName阴蒂刺激器猛烈地颤动起来! -DestinationCharacterName clitoral stimulator jumps up to maximum intensity! -DestinationCharacterName阴蒂刺激器突然以最大强度振动起来! -DestinationCharacterName inflatable vibrating dildo stops vibrating. -DestinationCharacterName充气振动阳具停止振动。 -DestinationCharacterName inflatable vibrating dildo slows down into a light tease. -DestinationCharacterName充气振动阳具慢下来,仅仅在轻微逗弄。 -DestinationCharacterName inflatable vibrating dildo returns to a moderate pace. -DestinationCharacterName充气振动阳具恢复了中等的频率。 -DestinationCharacterName inflatable vibrating dildo slows down a tiny bit. -DestinationCharacterName充气振动阳具稍微慢下来一点。 -DestinationCharacterName inflatable vibrating dildo starts teasing her lightly. -DestinationCharacterName充气振动阳具微微逗弄起她来。 -DestinationCharacterName inflatable vibrating dildo builds up to a moderate pace. -DestinationCharacterName充气振动阳具逐渐提升到中等的频率。 -DestinationCharacterName inflatable vibrating dildo starts buzzing strongly! -DestinationCharacterName充气振动阳具猛烈地颤动起来! -DestinationCharacterName inflatable vibrating dildo jumps up to maximum intensity! -DestinationCharacterName充气振动阳具突然以最大强度振动起来! -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till it's regular sized. -SourceCharacter对DestinationCharacter充气振动阳具放气,直到它变为通常大小。 -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till only slighty bulging. -SourceCharacter对DestinationCharacter充气振动阳具放气,直到它仅仅稍微鼓起。 -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till it's moderately bulging. -SourceCharacter对DestinationCharacter充气振动阳具放气,直到它中度地鼓起。 -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo only a tiny bit. -SourceCharacter对DestinationCharacter充气振动阳具放气,只放了一丁点。 -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo only slightly. -SourceCharacter对DestinationCharacter充气振动阳具充气,只充了一点点。 -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo till it's moderately bulging. -SourceCharacter对DestinationCharacter充气振动阳具充气,直到它中度地鼓起。 -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo till it's heavily bulging. -SourceCharacter对DestinationCharacter充气振动阳具充气,直到它饱满地鼓起。 -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo to it's maximum size. -SourceCharacter对DestinationCharacter充气振动阳具充气,直到它到达最大尺寸。 -DestinationCharacterName vibrating eggs on her nipples stop vibrating. -DestinationCharacterName乳头上的跳蛋停止振动。 -DestinationCharacterName vibrating eggs on her nipples slow down into a light tease. -DestinationCharacterName乳头上的跳蛋慢下来,仅仅在轻微逗弄。 -DestinationCharacterName vibrating eggs on her nipples return to a moderate pace. -DestinationCharacterName乳头上的跳蛋恢复了中等的频率。 -DestinationCharacterName vibrating eggs on her nipples slow down a tiny bit. -DestinationCharacterName乳头上的跳蛋稍微慢下来一点。 -DestinationCharacterName vibrating eggs on her nipples start teasing her lightly. -DestinationCharacterName乳头上的跳蛋微微逗弄起她来。 -DestinationCharacterName vibrating eggs on her nipples build up to a moderate pace. -DestinationCharacterName乳头上的跳蛋逐渐提升到中等的频率。 -DestinationCharacterName vibrating eggs on her nipples start buzzing strongly! -DestinationCharacterName乳头上的跳蛋猛烈地颤动起来! -DestinationCharacterName vibrating eggs on her nipples jump up to maximum intensity! -DestinationCharacterName乳头上的跳蛋突然以最大强度振动起来! -DestinationCharacterName vibrating egg on her clitoris stops vibrating. -DestinationCharacterName跳蛋停止振动。 -DestinationCharacterName vibrating egg on her clitoris slows down into a light tease. -DestinationCharacterName跳蛋慢下来,仅仅在轻微逗弄。 -DestinationCharacterName vibrating egg on her clitoris returns to a moderate pace. -DestinationCharacterName跳蛋恢复了中等的频率。 -DestinationCharacterName vibrating egg on her clitoris slows down a tiny bit. -DestinationCharacterName跳蛋稍微慢下来一点。 -DestinationCharacterName vibrating egg on her clitoris starts teasing her lightly. -DestinationCharacterName跳蛋微微逗弄起她来。 -DestinationCharacterName vibrating egg on her clitoris builds up to a moderate pace. -DestinationCharacterName跳蛋逐渐提升到中等的频率。 -DestinationCharacterName vibrating egg on her clitoris starts buzzing strongly! -DestinationCharacterName跳蛋猛烈地颤动起来! -DestinationCharacterName vibrating egg on her clitoris jumps up to maximum intensity! -DestinationCharacterName跳蛋突然以最大强度振动起来! -SourceCharacter loosens DestinationCharacter nipple suction cups until they hang loosely. -SourceCharacter放松DestinationCharacter乳头吸吮杯,让杯子松垮地耷拉着。 -SourceCharacter loosens DestinationCharacter nipple suction cups to a light amount of suction. -SourceCharacter放松DestinationCharacter乳头吸吮杯,让杯子轻度地吸附着。 -SourceCharacter loosens DestinationCharacter nipple suction cups to a moderate amount of suction. -SourceCharacter放松DestinationCharacter乳头吸吮杯,让杯子中度地吸附着。 -SourceCharacter loosens DestinationCharacter nipple suction cups a bit to a heavy amount of suction. -SourceCharacter放松DestinationCharacter乳头吸吮杯,让杯子沉重地吸附着。 -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples lightly. -SourceCharacter收紧DestinationCharacter乳头吸吮杯,让杯子轻度地吸附着她的乳头。 -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples firmly. -SourceCharacter收紧DestinationCharacter乳头吸吮杯,让杯子中度地吸附着她的乳头。 -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples heavily. -SourceCharacter收紧DestinationCharacter乳头吸吮杯,让杯子沉重地吸附着她的乳头。 -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples entirely. -SourceCharacter收紧DestinationCharacter乳头吸吮杯,让杯子完全吸附在她的乳头上。 -SourceCharacter loosens DestinationCharacter clitoris suction cup until it hangs loosely. -SourceCharacter放松DestinationCharacter阴蒂吮吸杯,让杯子松垮地耷拉着。 -SourceCharacter loosens DestinationCharacter clitoris suction cup to a light amount of suction. -SourceCharacter放松DestinationCharacter阴蒂吮吸杯,让杯子轻度地吸附着。 -SourceCharacter loosens DestinationCharacter clitoris suction cup to a moderate amount of suction. -SourceCharacter放松DestinationCharacter阴蒂吮吸杯,让杯子中度地吸附着。 -SourceCharacter loosens DestinationCharacter clitoris suction cup a bit to a heavy amount of suction. -SourceCharacter放松DestinationCharacter阴蒂吮吸杯,让杯子沉重地吸附着。 -SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris lightly. -SourceCharacter收紧DestinationCharacter阴蒂吮吸杯,让杯子轻度地吸附着她的阴蒂。 -SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris firmly. -SourceCharacter收紧DestinationCharacter阴蒂吮吸杯,让杯子中度地吸附着她的阴蒂。 -SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris heavily. -SourceCharacter收紧DestinationCharacter阴蒂吮吸杯,让杯子沉重地吸附着她的阴蒂。 -SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris entirely. -SourceCharacter收紧DestinationCharacter阴蒂吮吸杯,让杯子完全吸附在她的阴蒂上。 -DestinationCharacterName vibrating latex panties stops vibrating. -DestinationCharacterName振动乳胶内裤停止振动。 -DestinationCharacterName vibrating latex panties slows down into a light tease. -DestinationCharacterName振动乳胶内裤慢下来,仅仅在轻微逗弄。 -DestinationCharacterName vibrating latex panties returns to a moderate pace. -DestinationCharacterName振动乳胶内裤恢复了中等的频率。 -DestinationCharacterName vibrating latex panties slows down a tiny bit. -DestinationCharacterName振动乳胶内裤稍微慢下来一点。 -DestinationCharacterName vibrating latex panties starts teasing her lightly. -DestinationCharacterName振动乳胶内裤微微逗弄起她来。 -DestinationCharacterName vibrating latex panties builds up to a moderate pace. -DestinationCharacterName振动乳胶内裤逐渐提升到中等的频率。 -DestinationCharacterName vibrating latex panties starts buzzing strongly! -DestinationCharacterName振动乳胶内裤猛烈地颤动起来! -DestinationCharacterName vibrating latex panties jumps up to maximum intensity! -DestinationCharacterName振动乳胶内裤突然以最大强度振动起来! -DestinationCharacterName vibrating wand stops vibrating. -DestinationCharacterName振动乳胶内裤停止振动。 -DestinationCharacterName vibrating wand slows down into a light tease. -DestinationCharacterName振动按摩棒慢下来,仅仅在轻微逗弄。 -DestinationCharacterName vibrating wand returns to a moderate pace. -DestinationCharacterName振动按摩棒恢复了中等的频率。 -DestinationCharacterName vibrating wand slows down a tiny bit. -DestinationCharacterName振动按摩棒稍微慢下来一点。 -DestinationCharacterName vibrating wand starts teasing her lightly. -DestinationCharacterName振动按摩棒微微逗弄起她来。 -DestinationCharacterName vibrating wand builds up to a moderate pace. -DestinationCharacterName振动按摩棒逐渐提升到中等的频率。 -DestinationCharacterName vibrating wand starts buzzing strongly! -DestinationCharacterName振动按摩棒猛烈地颤动起来! -DestinationCharacterName vibrating wand jumps up to maximum intensity! -DestinationCharacterName振动按摩棒突然以最大强度振动起来! -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar stops vibrating. -DestinationCharacterName身上的假阳具的停止振动。 -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar slows down into a light tease. -DestinationCharacterName身上的假阳具的慢下来,仅仅在轻微逗弄。 -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar returns to a moderate pace. -DestinationCharacterName身上的假阳具的恢复了中等的频率。 -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar slows down a tiny bit. -DestinationCharacterName身上的假阳具的稍微慢下来一点。 -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar starts teasing her lightly. -DestinationCharacterName身上的假阳具的微微逗弄起她来。 -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar builds up to a moderate pace. -DestinationCharacterName身上的假阳具的逐渐提升到中等的频率。 -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar starts buzzing strongly! -DestinationCharacterName身上的假阳具的猛烈地颤动起来! -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar jumps up to maximum intensity! -DestinationCharacterName身上的假阳具的突然以最大强度振动起来! -SourceCharacter deflates DestinationCharacter butt pump till it's empty. -SourceCharacter对DestinationCharacter肛门泵放气,把它放空。 -SourceCharacter deflates DestinationCharacter butt pump till only slighty filled. -SourceCharacter对DestinationCharacter肛门泵放气,让它稍稍充气。 -SourceCharacter deflates DestinationCharacter butt pump till it's half full. -SourceCharacter对DestinationCharacter肛门泵放气,让它充气到一半的程度。 -SourceCharacter deflates DestinationCharacter butt pump only a tiny bit. -SourceCharacter对DestinationCharacter肛门泵放气,只放了一丁点。 -SourceCharacter inflates DestinationCharacter butt pump only slightly. -SourceCharacter对DestinationCharacter肛门泵充气,只充了一点点。 -SourceCharacter inflates DestinationCharacter butt pump till half full. -SourceCharacter对DestinationCharacter肛门泵充气,让它充气到一半的程度。 -SourceCharacter inflates DestinationCharacter butt pump three quarters filled. -SourceCharacter对DestinationCharacter肛门泵充气,让它充气到四分之三的程度。 -SourceCharacter inflates DestinationCharacter butt pump to the maximum amount. -SourceCharacter对DestinationCharacter肛门泵充气,让它充气到最大程度。 -DestinationCharacterName vibrating buttplug stops vibrating. -DestinationCharacterName振动肛塞停止振动。 -DestinationCharacterName vibrating buttplug slows down into a light tease. -DestinationCharacterName振动肛塞慢下来,仅仅在轻微逗弄。 -DestinationCharacterName vibrating buttplug returns to a moderate pace. -DestinationCharacterName振动肛塞恢复了中等的频率。 -DestinationCharacterName vibrating buttplug slows down a tiny bit. -DestinationCharacterName振动肛塞稍微慢下来一点。 -DestinationCharacterName vibrating buttplug starts teasing her lightly. -DestinationCharacterName振动肛塞微微逗弄起她来。 -DestinationCharacterName vibrating buttplug builds up to a moderate pace. -DestinationCharacterName振动肛塞逐渐提升到中等的频率。 -DestinationCharacterName vibrating buttplug starts buzzing strongly! -DestinationCharacterName振动肛塞猛烈地颤动起来! -DestinationCharacterName vibrating buttplug jumps up to maximum intensity! -DestinationCharacterName突然以最大强度振动起来! -DestinationCharacterName inflatable vibrating butt plug stops vibrating. -DestinationCharacterName停止振动。 -DestinationCharacterName inflatable vibrating butt plug slows down into a light tease. -DestinationCharacterName充气式振动肛塞慢下来,仅仅在轻微逗弄。 -DestinationCharacterName inflatable vibrating butt plug returns to a moderate pace. -DestinationCharacterName充气式振动肛塞恢复了中等的频率。 -DestinationCharacterName inflatable vibrating butt plug slows down a tiny bit. -DestinationCharacterName充气式振动肛塞稍微慢下来一点。 -DestinationCharacterName inflatable vibrating butt plug starts teasing her lightly. -DestinationCharacterName充气式振动肛塞微微逗弄起她来。 -DestinationCharacterName inflatable vibrating butt plug builds up to a moderate pace. -DestinationCharacterName充气式振动肛塞逐渐提升到中等的频率。 -DestinationCharacterName inflatable vibrating butt plug starts buzzing strongly! -DestinationCharacterName充气式振动肛塞猛烈地颤动起来! -DestinationCharacterName inflatable vibrating butt plug jumps up to maximum intensity! -DestinationCharacterName充气式振动肛塞突然以最大强度振动起来! -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till it's empty. -SourceCharacter对DestinationCharacter充气式振动肛塞放气,把它放空。 -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till only slightly filled. -SourceCharacter对DestinationCharacter充气式振动肛塞放气,让它稍稍充气。 -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till it's half full. -SourceCharacter对DestinationCharacter充气式振动肛塞放气,让它充气到一半的程度。 -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug only a tiny bit. -SourceCharacter对DestinationCharacter充气式振动肛塞放气,只放了一丁点。 -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug only slightly. -SourceCharacter对DestinationCharacter充气式振动肛塞充气,只充了一点点。 -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug till it's half full. -SourceCharacter对DestinationCharacter充气式振动肛塞充气,让它充气到一半的程度。 -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug till three quarters filled. -SourceCharacter对DestinationCharacter充气式振动肛塞充气,让它充气到四分之三的程度。 -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug to it's maximum amount. -SourceCharacter对DestinationCharacter充气式振动肛塞充气,让它充气到最大程度。 -Nothing -无 -Short Chain -短锁链 -Long Chain -长锁链 -SourceCharacter removes the chain from DestinationCharacter locking butt plug. -SourceCharacter移除了DestinationCharacter带锁肛塞上的锁链。 -SourceCharacter attaches a short chain to DestinationCharacter locking butt plug. -SourceCharacter将一根短锁链连接到DestinationCharacter带锁肛塞上。 -SourceCharacter attaches a long chain to DestinationCharacter locking butt plug. -SourceCharacter将一根长锁链连接到DestinationCharacter带锁肛塞上。 -Chain -锁链 -SourceCharacter detaches DestinationCharacter anal hook. -SourceCharacter解开了DestinationCharacter肛钩。 -SourceCharacter attaches a chain to DestinationCharacter anal hook. -SourceCharacter将一根锁链连接到DestinationCharacter肛钩上。 -SourceCharacter attaches DestinationCharacter anal hook to her hair. -SourceCharacter将DestinationCharacter肛钩连接到她的头发上。 -Inserted Beads Count: -塞入珠子数量: -Insert One -塞入一个 -Remove One -拉出一个 -Remove All Except One -只留下一个 -Insert All -全塞进去 -SourceCharacter inserts a second bead in DestinationCharacter butt -SourceCharacter将第二个珠子塞入DestinationCharacter肛门 -SourceCharacter inserts a third bead in DestinationCharacter butt -SourceCharacter将第三个珠子塞入DestinationCharacter肛门 -SourceCharacter inserts a fourth bead in DestinationCharacter butt -SourceCharacter将第四个珠子塞入DestinationCharacter肛门 -SourceCharacter inserts a fifth bead in DestinationCharacter butt -SourceCharacter将第五个珠子塞入DestinationCharacter肛门 -SourceCharacter pulls a bead out of DestinationCharacter butt -SourceCharacter将一个珠子从DestinationCharacter肛门拉出来 -SourceCharacter inserts all five beads in DestinationCharacter butt -SourceCharacter将全部五个珠子塞入DestinationCharacter肛门 -SourceCharacter pulls all but one bead from DestinationCharacter butt -SourceCharacter将所有珠子从DestinationCharacter肛门拉出来,但留下一个 -SourceCharacter deflates DestinationCharacter gag fully till it's empty. -SourceCharacter对DestinationCharacter口塞放气,把它放空。 -SourceCharacter deflates DestinationCharacter gag till only slighty filled. -SourceCharacter对DestinationCharacter口塞放气,让它稍稍充气。 -SourceCharacter deflates DestinationCharacter gag till it's half full. -SourceCharacter对DestinationCharacter口塞放气,让它充气到一半的程度。 -SourceCharacter deflates DestinationCharacter gag only a tiny bit. -SourceCharacter对DestinationCharacter口塞放气,只放了一丁点。 -SourceCharacter inflates DestinationCharacter gag only slightly. -SourceCharacter对DestinationCharacter口塞充气,只充了一点点。 -SourceCharacter inflates DestinationCharacter gag till half full. -SourceCharacter对DestinationCharacter口塞充气,让它充气到一半的程度。 -SourceCharacter inflates DestinationCharacter gag three quarters filled. -SourceCharacter对DestinationCharacter口塞充气,让它充气到四分之三的程度。 -SourceCharacter inflates DestinationCharacter gag to the maximum amount. -SourceCharacter对DestinationCharacter口塞充气,让它充气到最大程度。 -SourceCharacter deflates inflated hood's gag fully till it's empty. -SourceCharacter对已充气的头罩口塞放气,把它放空。 -SourceCharacter deflates DestinationCharacter inflated hood's gag till it's only slighty filled. -SourceCharacter对DestinationCharacter已充气的头罩口塞放气,让它稍稍充气。 -SourceCharacter deflates DestinationCharacter inflated hood's gag till it's half full. -SourceCharacter对DestinationCharacter已充气的头罩口塞放气,让它充气到一半的程度。 -SourceCharacter deflates DestinationCharacter inflated hood's gag only a tiny bit. -SourceCharacter对DestinationCharacter已充气的头罩口塞放气,只放了一丁点。 -SourceCharacter inflates DestinationCharacter inflated hood's gag only slightly. -SourceCharacter对DestinationCharacter已充气的头罩口塞充气,只充了一点点。 -SourceCharacter inflates DestinationCharacter inflated hood's gag till it's half full. -SourceCharacter对DestinationCharacter已充气的头罩口塞充气,让它充气到一半的程度。 -SourceCharacter inflates DestinationCharacter inflated hood's gag till it's three quarters filled. -SourceCharacter对DestinationCharacter已充气的头罩口塞充气,让它充气到四分之三的程度。 -SourceCharacter inflates DestinationCharacter inflated hood's gag to the maximum amount. -SourceCharacter对DestinationCharacter已充气的头罩口塞充气,让它充气到最大程度。 -Select attachments. -选择配件。 -Select blinding lenses state. -选择致盲镜片状态。 -Select attachment type. -选择配件类型. -Blinding Lenses -致盲镜片 -Attachments -附件 -Lenses Off -镜片关闭 -Lenses On -镜片打开 -No attachment -无配件 -Tube A -管子A -Tube B -管子B -Rebreather -循环呼吸器 -SourceCharacter removes the blinding lenses from DestinationCharacter gas mask. -SourceCharacter从DestinationCharacter防毒面具上移除了遮眼镜片。 -SourceCharacter attaches blinding lenses to DestinationCharacter gas mask. -SourceCharacter在DestinationCharacter防毒面具上添加了遮眼镜片。 -SourceCharacter removes the attachment from DestinationCharacter gas mask -SourceCharacter从DestinationCharacter防毒面具上移除了配件。 -SourceCharacter attaches a tube to DestinationCharacter gas mask. -SourceCharacter在DestinationCharacter防毒面具上添加了配件。 -SourceCharacter attaches a rebreather to DestinationCharacter gas mask. -SourceCharacter在DestinationCharacter防毒面具上添加了循环呼吸器。 -Select options -选择选项 -Select blindfold -选择眼罩 -Select gag -选择口塞 -Select expression -选择表情 -Blindfold -眼罩 -Gag -口塞 -Expression -表情 -Neutral -中性 -OwO -OwO -UwU -UwU -SourceCharacter removes the blindfold from DestinationCharacter kitty hood. -SourceCharacter从DestinationCharacter猫咪头套上移除了眼罩。 -SourceCharacter attaches a blindfold in front of DestinationCharacter eyes. -SourceCharacter在DestinationCharacter猫咪头套上添加了眼罩。 -SourceCharacter removes the panel from DestinationCharacter kitty hood. -SourceCharacter从DestinationCharacter猫咪头套上移除了挡板。 -SourceCharacter attaches a panel in front of DestinationCharacter mouth. -SourceCharacter在DestinationCharacter嘴前面添加了一个挡板。 -SourceCharacter draws a neutral face onto DestinationCharacter kitty hood. -SourceCharacter在DestinationCharacter猫咪头套上画了一个中性脸。 -SourceCharacter draws an OwO face onto DestinationCharacter kitty hood. -SourceCharacter在DestinationCharacter猫咪头套上画了一个OwO脸。 -SourceCharacter draws an UwU face onto DestinationCharacter kitty hood. -SourceCharacter在DestinationCharacter猫咪头套上画了一个UwU脸。 -Pumpkin Head -南瓜头 -Leash -牵引绳 -SourceCharacter removes the attachment from DestinationCharacter nose ring. -SourceCharacter从DestinationCharacter鼻环上移除了附件。 -SourceCharacter attaches a short chain to DestinationCharacter nose ring. -SourceCharacter将一根短链条连接到DestinationCharacter鼻环。 -SourceCharacter attaches a long chain to DestinationCharacter nose ring. -SourceCharacter将一长短链条连接到DestinationCharacter鼻环。 -SourceCharacter attaches a leash to DestinationCharacter nose ring. -SourceCharacter将一根牵引绳连接到DestinationCharacter鼻环。 -Use Remote -使用遥控器 -Change Layers -更换层级 -(You clumsily whip your own breast and tummy. It would be more painful if someone else did it.) -(你笨拙地鞭打自己的胸部和小腹。如果其他人对你这么做的话会更疼。) -(You swing the crop on yourself a few times. You can feel your breast and tummy becoming more sensitive.) -(你用硬鞭打了自己几下。你感觉自己的胸部和小腹更加敏感了。) -(You need a few tries but you're able to somewhat whip your own butt and feel the pain.) -(你用硬鞭打了自己几下。你感觉自己的胸部和小腹更加敏感了。) -(You lash the leather crop pretty hard on your own butt. Jumping from each good hit.) -(你用皮质硬用力了自己的屁股。每次打中都疼得跳起来。) -(You slowly massage your pussy with the wand. Trembling from pleasure and excitement.) -(你用按摩棒慢慢按摩自己的阴部,因为快感和刺激而颤抖着。) -Select the size of the double ended dildo. -选择双头龙大小 -Normal Size -正常大小 -Large Size -大号 -DestinationCharacterName AssetName shrinks down to it's normal size. -DestinationCharacterNameAssetName缩小到了正常大小。 -DestinationCharacterName AssetName grows to it's large size. -DestinationCharacterNameAssetName增长到了大号。 -Choose piercing addons. -选择穿环配件。 -Ring -环 -Weight -配重 -Bell -铃铛 -Harem Chains -后宫链 -SourceCharacter removes addons from DestinationCharacter clit piercing. -SourceCharacter移除了DestinationCharacter阴蒂穿环上的配件。 -SourceCharacter adds a small weight onto DestinationCharacter clit piercing. -SourceCharacter在DestinationCharacter阴蒂穿环上添加了配重。 -SourceCharacter adds a small bell onto DestinationCharacter clit piercing. -SourceCharacter在DestinationCharacter阴蒂穿环上添加了一个小铃铛。 -SourceCharacter links DestinationCharacter clit piercing to her nipple rings with a chain. -SourceCharacter将DestinationCharacter的阴蒂穿环用一根锁链和她的乳头穿环连接起来。 -SourceCharacter links DestinationCharacter clit piercing to her nipple rings with a small veiled chain. -SourceCharacter将DestinationCharacter的阴蒂穿环用一根系着薄纱的锁链和她的乳头穿环连接起来。 -Padlock mitten buckles -带锁连指手套 -Unlock mittens -解锁手套 -Chain mittens -给手套加链子 -Unchain mittens -移除手套链子 -You need some padlocks to do this. -你需要一些挂锁才能如此做。 -You need a padlock key to do this. -你需要一些挂锁钥匙才能如此做。 -padlocks -挂锁 -unlocks -解锁 -mittens -连指手套 -chains -锁链 -removes the chains -移除手链 -mittens to the baby harness -连接无指手套和婴儿束带 -She must be wearing a baby harness to chain the mittens. -她必须穿戴婴儿束带才能连接无指手套的链子。 -You must free her arms before attaching mitten chains. -连接无指手套的链子前,你必须解开她的手臂。 -Facial expression -面部表情 -Select a handheld item -选择一个持握物 -Crop -硬鞭 -Flogger -短鞭 -Cane -竹竿 -Heart Crop -心形硬鞭 -Paddle -板子 -Whip Paddle -板鞭 -Whip -皮鞭 -Cattle Prod -赶牛棒 -Tennis Racket -网球拍 -Rainbow Wand -彩虹魔杖 -Gavel -木槌 -Feather -羽毛 -Feather Duster -羽毛掸 -Long Duster -长鸡毛掸 -Ice Cube -冰块 -Wartenberg Wheel -刺轮 -Vibrating Wand -振动按摩棒 -Small Vibe Wand -小振动棒 -Candle Wax -蜡烛 -Large Dildo -大假阳具 -Pet Toy -逗猫棒 -Vibrator -振动棒 -Hairbrush -梳子 -Small Dildo -小假阳具 -Electric Toothbrush -电动牙刷 -Toothbrush -牙刷 -Shock Wand -电击棒 -Lotion -洗液 -Ruler -尺子 -Foam Sword -泡沫剑 -Vibrator Remote -振动玩具遥控器 -Shock Remote -电击遥控器 -Towel -毛巾 -Long Coiled Rope -长捆绳 -Short Coiled Rope -短捆绳 -Ballgag -口球 -Long Sock -长袜 -Baguette -法棍面包 -Panties -内裤 -Duct Tape Roll -胶带卷 -Spatula -菜铲 -Broom -扫帚 -Mobile Phone -手机 -Mobile Phone 2 -手机2 -Scissors -剪刀 -Plastic Wrap Roll -保鲜膜卷 -Empty Glass -空玻璃杯 -Filled Glass -装液体的玻璃杯 -Potion Bottle -药剂瓶 -SourceCharacter takes out a ItemUsed -SourceCharacter拿出来一个ItemUsed -SourceCharacter gives TargetCharacter a ItemUsed -SourceCharacter递给TargetCharacter一个ItemUsed -Select suit type and wand attachment -选择套装类型和按摩棒附件 -Check the vulva to use the wand -要使用按摩棒,检查前阴区域 -Zipped Up -拉上拉链 -Unzipped -拉开拉链 -Wand Attachment -按摩棒附件 -SourceCharacter zips up DestinationCharacter suit. -SourceCharacter拉上了DestinationCharacter套装拉链。 -SourceCharacter unzips DestinationCharacter suit. -SourceCharacter解开了DestinationCharacter套装拉链。 -SourceCharacter attaches a wand to DestinationCharacter suit. -SourceCharacter将一根按摩棒DestinationCharacter附在的套装上。 -Configure suit -配置套装 -Zip or unzip the suit -拉上或解开套装拉链 -Select position -选择姿势 -Zipper -拉链 -Position -姿势 -Kneeling -跪下 -SourceCharacter helps TargetCharacter up into a kneeling position. -SourceCharacter帮助TargetCharacter起身,跪在地上。 -SourceCharacter guides TargetCharacter down onto all fours. -SourceCharacter帮助TargetCharacter俯下身子四肢着地。 -SourceCharacter sits up on her knees. -SourceCharacter起身,跪在地上。 -SourceCharacter carefully lowers herself down onto all fours. -SourceCharacter小心地俯下身子,四肢着地。 -Turn Off -关闭 -High -高 -SourceCharacter chains DestinationCharacter mittens to the baby harness. -SourceCharacter用锁链把DestinationCharacter无指手套连接到婴儿束带。 -Unlock Butt -解锁臀部 -Lock Butt -锁上臀部 -Remove Shield -移除贞操护盾 -Remove Vibe -移除振动棒 -Remove Shock -移除电击 -Add Shield -添加贞操护盾 -Add Vibe -添加跳蛋 -Add Shock -添加电击器 -SourceCharacter unlocks DestinationCharacter love chastity belt butt. -SourceCharacter解开了DestinationCharacter爱人贞操带的臀部锁。 -SourceCharacter locks DestinationCharacter love chastity belt butt. -SourceCharacter锁上了DestinationCharacter爱人贞操带的臀部锁。 -DestinationCharacterName love chastity belt starts teasing her lightly. -DestinationCharacterName爱人贞操带微微逗弄起她来。 -DestinationCharacterName love chastity belt builds up to a moderate pace. -DestinationCharacterName爱人贞操带逐渐提升到中等的频率。 -DestinationCharacterName love chastity belt starts buzzing strongly! -DestinationCharacterName爱人贞操带猛烈地颤动起来! -DestinationCharacterName love chastity belt jumps up to maximum intensity! -DestinationCharacterName爱人贞操带突然以最大强度振动起来! -DestinationCharacterName love chastity belt stops vibrating. -DestinationCharacterName爱人贞操带停止振动。 -DestinationCharacterName love chastity belt slows down into a light tease. -DestinationCharacterName爱人贞操带慢下来,仅仅在轻微逗弄。 -DestinationCharacterName love chastity belt returns to a moderate pace. -DestinationCharacterName爱人贞操带恢复了中等的频率。 -DestinationCharacterName love chastity belt slows down a tiny bit. -DestinationCharacterName爱人贞操带稍微慢下来一点。 -SourceCharacter sets DestinationCharacter love chastity belt to low intensity. -SourceCharacter将DestinationCharacter爱人贞操带设置为低强度。 -SourceCharacter sets DestinationCharacter love chastity belt to moderate intensity. -SourceCharacter将DestinationCharacter爱人贞操带设置为中强度。 -SourceCharacter sets DestinationCharacter love chastity belt to high intensity. -SourceCharacter将DestinationCharacter爱人贞操带设置为高强度。 -DestinationCharacterName love chastity belt gives her a light shock. -DestinationCharacterName爱人贞操带轻微地电了她一下。 -DestinationCharacterName love chastity belt lets out a sharp jolt! -DestinationCharacterName爱人贞操带发出尖锐的电击! -DestinationCharacterName love chastity belt delivers an intense shock! -DestinationCharacterName爱人贞操带猛烈地电击了她! -SourceCharacter removes shield from DestinationCharacter love chastity belt. -SourceCharacter移除了DestinationCharacter爱人贞操带上的贞操护盾。 -SourceCharacter locks shield to DestinationCharacter love chastity belt. -SourceCharacter锁定了DestinationCharacter爱人贞操带上的贞操护盾。 -SourceCharacter locks vibe to DestinationCharacter love chastity belt. -SourceCharacter锁定了DestinationCharacter爱人贞操带上的振动棒。 -SourceCharacter locks shock device to DestinationCharacter love chastity belt. -SourceCharacter锁定了DestinationCharacter爱人贞操带电击装置。 -The rear chastity shield on DestinationCharacterName sci-fi pleasure panties opens. -DestinationCharacterName高科技快感管理内裤的后贞操护盾打开了。 -The rear chastity shield on DestinationCharacterName sci-fi pleasure panties closes. -DestinationCharacterName高科技快感管理内裤的后贞操护盾关闭了。 -DestinationCharacterName sci-fi pleasure panties activates tease vibe mode. -DestinationCharacterName高科技快感管理内裤开始以玩弄模式振动。 -DestinationCharacterName sci-fi pleasure panties builds up to vibration level 1. -DestinationCharacterName高科技快感管理内裤的振动强度提升到级别1。 -DestinationCharacterName sci-fi pleasure panties starts buzzing at vibration level 2! -DestinationCharacterName高科技快感管理内裤开始以级别2的强度振动! -DestinationCharacterName sci-fi pleasure panties jumps up to vibration level 3! -DestinationCharacterName高科技快感管理内裤的振动强度突然到达级别3! -DestinationCharacterName sci-fi pleasure panties vibration mode is deactivated. -DestinationCharacterName高科技快感管理内裤的振动模式关闭。 -DestinationCharacterName sci-fi pleasure panties slows down to tease vibe mode. -DestinationCharacterName高科技快感管理内裤减慢为玩弄模式。 -DestinationCharacterName sci-fi pleasure panties returns to vibration level 1. -DestinationCharacterName高科技快感管理内裤的振动强度回到了级别1。 -DestinationCharacterName sci-fi pleasure panties slows down to vibration level 2. -DestinationCharacterName高科技快感管理内裤的振动强度降低到了级别2。 -DestinationCharacterName sci-fi pleasure panties are set to shock level 1. -DestinationCharacterName高科技快感管理内裤的电击强度被设定为级别1。 -DestinationCharacterName sci-fi pleasure panties are set to shock level 2. -DestinationCharacterName高科技快感管理内裤的电击强度被设定为级别2。 -DestinationCharacterName sci-fi pleasure panties are set to shock level 3. -DestinationCharacterName高科技快感管理内裤的电击强度被设定为级别3。 -DestinationCharacterName sci-fi pleasure panties gives her a light shock. -DestinationCharacterName高科技快感管理内裤轻微地电了她一下。 -DestinationCharacterName sci-fi pleasure panties lets out a sharp jolt! -DestinationCharacterName高科技快感管理内裤发出尖锐的电击! -DestinationCharacterName sci-fi pleasure panties delivers an intense shock! -DestinationCharacterName高科技快感管理内裤猛烈地电击了她! -The crotch chastity shield on DestinationCharacterName sci-fi pleasure panties opens. -DestinationCharacterName高科技快感管理内裤的胯部贞操护盾打开了。 -The crotch chastity shield on DestinationCharacterName sci-fi pleasure panties closes. -DestinationCharacterName高科技快感管理内裤的胯部贞操护盾关闭了。 -The denial mode on DestinationCharacterName sci-fi pleasure panties activates, teasing them endlessly. -DestinationCharacterName高科技快感管理内裤的拒绝模式启动了,开始无休止地逗弄。 -The edging mode on DestinationCharacterName sci-fi pleasure panties activates, preventing orgasms no matter what. -DestinationCharacterName高科技快感管理内裤的寸止模式启动了,无论如何也不会再得到高潮。 -The special mode on DestinationCharacterName sci-fi pleasure panties deactivates, allowing orgasms again. -DestinationCharacterName高科技快感管理内裤的特殊模式关闭了,现在允许高潮。 -Normal Mode -通常模式 -Edge Mode -寸止模式 -Deny Mode -拒绝模式 -Save text -保存文本 -Select a module. -选择模块。 -Configure the tag. -配置名牌。 -Configure the text. -配置文本。 -Tag -名牌 -Text -文本 -Font -字体 -Metal plate -金属板 -Livestock -家畜 -Bone -骨头 -Oval -椭圆 -Fish -鱼 -Carrot -胡萝卜 -SourceCharacter changes the custom name tag on DestinationCharacter collar. -SourceCharacter改变了DestinationCharacter项圈上的自定义名牌。 -SourceCharacter changes the text on DestinationCharacter collar name tag. -SourceCharacter改变了DestinationCharacter自定义名牌上的文字。 -SourceCharacter changes the wooden sign on TargetCharacterName. -SourceCharacter改变了TargetCharacterName的木制挂牌。 -SourceCharacter changes the text on DestinationCharacterName Doll Box. -SourceCharacter改变了DestinationCharacterName人偶箱上的文字。 -Select what tag you want to use -选择你想要使用的名牌 -You cannot change the tag while it's locked -当名牌被锁住的时候,你不能改变它 -SourceCharacter uses a NameTagType name tag on DestinationCharacter collar. -SourceCharacter在DestinationCharacter项圈上装了一个NameTagType名牌。 -Angel -天使 -Bad Girl -坏女孩 -Bind Me -绑我 -Bitch -娼妇 -Boobs -胸部 -Cupcake -蛋糕 -Devil -魔鬼 -Dom -支配 -Free -免费 -Fuck Me -操我 -GagMe -口塞我 -Goddess -女神 -Good Girl -好女号 -Hold Me -抱我 -Jewel -宝石 -Love -真爱 -Maid -女仆 -Meat -肉块 -Miss -女士 -Needy -贪心 -Nice -愉快 -Owned -有主 -Precious -珍贵 -Pudding -果冻 -Queen -女王 -Slave -奴隶 -Slut -淫荡 -Sub -顺从 -Sweetie -甜心 -Taken -携带 -Toy -玩具 -Useless -没用 -Use Me -使用我 -Whore -婊子 -SourceCharacter uses a NameTagType oval name tag on DestinationCharacter collar. -SourceCharacter在DestinationCharacter项圈上装了一个NameTagType椭圆形名牌。 -Babe -宝贝 -Bandit -匪徒 -Bimbo -荡妇 -Bratty -顽劣 -Chair -椅子 -Chaste -贞洁 -Crazy -疯狂 -Cumslut -爱潮 -Cutie -可爱 -Damsel -少女 -Doll -人偶 -EdgeMe -寸止我 -Evil -邪恶 -ForSale -出售 -Greedy -贪婪 -Happy -快乐 -Horny -兴奋 -Kinky -变态 -Lady -女士 -LockMe -锁我 -Nude -赤裸 -Nurse -护士 -Nympho -性瘾 -Painslut -爱痛 -Pillow -枕头 -Punish -惩罚 -Robber -强盗 -Sad -伤心 -Switch -转换 -Table -桌子 -Ticklish -怕痒 -Undress -脱衣 -Victim -受害 -Violent -暴力 -Worm -蠕虫 -AnalSlut -爱肛 -ButtSlut -爱屁 -SourceCharacter uses a NameTagType pet name tag on DestinationCharacter collar. -SourceCharacter在DestinationCharacter项圈上装了一个NameTagType宠物名牌。 -Bunny -兔兔 -Cat -猫猫 -Dog -狗狗 -Foxy -狐狸 -Kitten -小猫 -Kitty -咪咪 -Mochi -糯米团 -Panda -熊猫 -Pet -宠物 -PetMe -摸摸我 -Pixie -精灵 -Pony -小马 -Puppy -奶狗 -Racoon -浣熊 -Sloth -怠惰 -SourceCharacter uses a NameTagType lover name tag on DestinationCharacter collar. -SourceCharacter在DestinationCharacter项圈上装了一个NameTagType爱人名牌。 -Cookie -饼干 -Lover -爱人 -Muffin -松饼 -SourceCharacter uses a NameTagType livestock name tag on DestinationCharacter collar. -SourceCharacter在DestinationCharacter项圈上装了一个NameTagType牲畜名牌。 -Animal -动物 -BreedMe -喂饱我 -Cow -奶牛 -MilkMe -挤我奶 -Pig -猪猪 -Base -基础 -Collar chained -连接锁链 -Added weights -添加配重 -Weight and Chain -配重和锁链 -SourceCharacter detaches extras from DestinationCharacter round piercings. -SourceCharacter从DestinationCharacter穿环上移除了附件。 -SourceCharacter attaches a chain from DestinationCharacter round piercings to her collar. -SourceCharacter用锁链把DestinationCharacter穿环和项圈连接起来。 -SourceCharacter adds weights to DestinationCharacter round piercings. -SourceCharacter在DestinationCharacter穿环上添加了配重。 -SourceCharacter adds weights and attaches a chain from DestinationCharacter round piercings to her collar. -SourceCharacter在DestinationCharacter穿环上添加了配重,并用锁链把穿环和项圈连接起来。 -adds -添加 -detaches -去除 -Legs -腿 -Half -一半 -Most -大多 -Complete -完全 -Cut out -带洞 -SourceCharacter wraps duct tape around DestinationCharacter legs. -SourceCharacter用胶带把DestinationCharacter腿包裹起来。 -SourceCharacter wraps more duct tape on DestinationCharacter legs trapping them firmly. -SourceCharacter在DestinationCharacter腿上缠了更多胶带,把腿牢固地束缚住。 -SourceCharacter wraps even more duct tape on DestinationCharacter legs trapping them tightly. -SourceCharacter在DestinationCharacter腿上缠了十分多的胶带,把腿紧紧束缚。 -SourceCharacter wraps an extreme amount of duct tape on DestinationCharacter legs fully trapping them. -SourceCharacter在DestinationCharacter腿上缠了非常多的胶带,彻底固定住腿。 -SourceCharacter wraps duct tape on DestinationCharacter legs frog tying them. -SourceCharacter在DestinationCharacter腿上缠了一些胶带,绑成了一个蛙缚。 -SourceCharacter wraps an extreme amount of duct tape on DestinationCharacter legs while leaving a small hole in it. -SourceCharacter在DestinationCharacter腿上缠了非常多的胶带,但在上面留下一个小洞。 -Feet -脚 -SourceCharacter wraps duct tape around DestinationCharacter feet. -SourceCharacter用胶带把DestinationCharacter脚包裹起来。 -SourceCharacter wraps more duct tape on DestinationCharacter feet trapping them firmly. -SourceCharacter在DestinationCharacter脚上缠了更多胶带,把脚牢固地束缚住。 -SourceCharacter wraps even more duct tape on DestinationCharacter feet trapping them tightly. -SourceCharacter在DestinationCharacter脚上缠了十分多的胶带,把脚紧紧束缚。 -SourceCharacter wraps an extreme amount of duct tape on DestinationCharacter feet fully trapping them. -SourceCharacter在DestinationCharacter脚上缠了非常多的胶带,彻底固定住脚。 -Select the slave collar model -选择奴隶项圈型号 -SourceCharacter changes DestinationCharacter collar model. -SourceCharacter改变了DestinationCharacter项圈型号。 -Select the type of monster -选择怪物类型 -Black -黑色 -Red -红色 -Green -绿色 -Blue -蓝色 -SourceCharacter gives TargetCharacter a Scary Black Monster teddy. -SourceCharacter给了TargetCharacter一个可怕的黑色怪物玩偶。 -SourceCharacter gives TargetCharacter a Scary Red Monster teddy. -SourceCharacter给了TargetCharacter一个可怕的红色怪物玩偶。 -SourceCharacter gives TargetCharacter a Scary Green Monster teddy. -SourceCharacter给了TargetCharacter一个可怕的绿色怪物玩偶。 -SourceCharacter gives TargetCharacter a Scary Blue Monster teddy. -SourceCharacter给了TargetCharacter一个可怕的蓝色怪物玩偶。 -Select the type of familiar -选择魔宠类型 -Bat -蝙蝠 -Skeleton -骷髅 -Parrot -鹦鹉 -SourceCharacter summons Cat Familiar on TargetCharacter. -SourceCharacter在TargetCharacter身上召唤了一个猫猫魔宠。 -SourceCharacter summons Bat Familiar on TargetCharacter. -SourceCharacter在TargetCharacter身上召唤了一个蝙蝠魔宠。 -SourceCharacter summons Undead Familiar on TargetCharacter. -SourceCharacter在TargetCharacter身上召唤了一个亡灵魔宠。 -SourceCharacter summons Pirate Familiar on TargetCharacter. -SourceCharacter在TargetCharacter身上召唤了一个海盗魔宠。 -Select coffin closed or open -选择棺材开启与关闭 -Closed -关闭 -SourceCharacter opens the lid on DestinationCharacter coffin. -SourceCharacter打开了DestinationCharacter棺材的盖子。 -SourceCharacter closes the lid on DestinationCharacter coffin. -SourceCharacter关闭了DestinationCharacter棺材的盖子。 -Select cryogenic capsule state. -选择低温休眠舱状态。 -SourceCharacter opens the lid on DestinationCharacter cryogenic capsule. -SourceCharacter打开了DestinationCharacter低温休眠舱的盖子。 -SourceCharacter closes the lid on DestinationCharacter cryogenic capsule. -SourceCharacter关闭了DestinationCharacter低温休眠舱的盖子。 -Turn the headphones on/off and adjust their volume. -打开或关闭耳机,以及调整音量。 -Noise-Cancelling -降噪 -SourceCharacter turns off DestinationCharacter AssetName. -SourceCharacter关闭了DestinationCharacterAssetName。 -SourceCharacter turns the volume to low on DestinationCharacter AssetName. -SourceCharacter将DestinationCharacterAssetName的音量调到低。 -SourceCharacter turns the volume up to high on DestinationCharacter AssetName. -SourceCharacter将DestinationCharacterAssetName的音量调到高。 -SourceCharacter sets DestinationCharacter AssetName to noise-cancelling mode. -SourceCharacter将DestinationCharacterAssetName设置为降噪模式。 -Select the chain bondage -选择链条束缚 -Strict Tie -严格拘束 -Chain Cuffs -锁链镣铐 -SourceCharacter uses the chain on TargetCharacter to do a basic tie. -SourceCharacter用锁链在TargetCharacter身上绑了一个基础束缚。 -SourceCharacter uses the chain on TargetCharacter to do a strict tie. -SourceCharacter用锁链在TargetCharacter身上绑了一个较紧的束缚。 -SourceCharacter uses the chain on TargetCharacter to do a suspension tie. -SourceCharacter用锁链在TargetCharacter身上绑了一个吊起束缚。 -Open without padding -打开且没有垫子 -Open with padding -打开且附上垫子 -Closed without padding -关闭且没有垫子 -Closed with padding -关闭且附上垫子 -Select door and padding state -选择门和垫子状态 -SourceCharacter adds padding to DestinationCharacter kennel when closing it. -SourceCharacter为DestinationCharacter狗窝添加了垫子,并关上了门。 -SourceCharacter adds padding to DestinationCharacter kennel. -SourceCharacter为DestinationCharacter狗窝添加了垫子。 -SourceCharacter closes DestinationCharacter kennel. -SourceCharacter关上了DestinationCharacter狗窝的门。 -SourceCharacter removes the padding from DestinationCharacter kennel when opening it. -SourceCharacter打开了DestinationCharacter狗窝的门,并移除了垫子。 -SourceCharacter adds padding to DestinationCharacter kennel when opening it. -SourceCharacter打开了DestinationCharacter狗窝的门,并添加了垫子。 -SourceCharacter removes the padding from DestinationCharacter kennel when closing it. -SourceCharacter从DestinationCharacter狗窝移除了垫子,并关上了门。 -SourceCharacter removes the padding from DestinationCharacter kennel. -SourceCharacter从DestinationCharacter狗窝移除了垫子。 -SourceCharacter opens the door of DestinationCharacter kennel. -SourceCharacter打开了DestinationCharacter狗窝的门。 -SourceCharacter uses chains on TargetCharacter to do a box tie. -SourceCharacter用锁链在TargetCharacter身上绑了一个后手缚。 -SourceCharacter uses chains to hogtie TargetCharacter. -SourceCharacter用锁链在TargetCharacter身上绑了一个蛙缚。 -SourceCharacter uses chains to tie DestinationCharacter wrists and elbows together behind her back. -SourceCharacter用锁链把DestinationCharacter手腕和手肘在她的身后绑在一起。 -SourceCharacter uses chains to tie DestinationCharacter wrists together behind her back. -SourceCharacter用锁链把DestinationCharacter手腕在她的身后绑在一起。 -SourceCharacter uses chains to tie chain cuffs on DestinationCharacter wrists. -SourceCharacter用锁链在DestinationCharacter手腕上绑了一个锁链手铐。 -SourceCharacter uses chains on TargetCharacter to have her crawling on all fours. -SourceCharacter用锁链把TargetCharacter绑起来,让她只能四肢着地。 -SourceCharacter uses chains to tie DestinationCharacter wrists and elbows in a harness behind her back. -SourceCharacter用锁链在DestinationCharacter身上绑了一个绳缚,并把她的手腕和手肘在她的身后绑在一起。 -SourceCharacter uses chains to hogtie TargetCharacter on her knees. -SourceCharacter用锁链把TargetCharacter绑成驷马缚,并让她跪在地上。 -Select suit type -选择套装类型 -Selected chastity belt backing -选择贞操带后部护盾 -Open Back -后部打开 -Closed Back -后部关闭 -SourceCharacter removes the shield from the back of DestinationCharacter belt. -SourceCharacter从DestinationCharacter贞操带的后部移除了贞操护盾。 -SourceCharacter adds the shield to the back of DestinationCharacter belt. -SourceCharacter在DestinationCharacter贞操带的后部添加了贞操护盾。 -SourceCharacter removes the attachment from DestinationCharacter clitoris ring. -SourceCharacter移除了DestinationCharacter阴蒂环上的附件。 -SourceCharacter attaches a leash to DestinationCharacter clitoris ring. -SourceCharacter在DestinationCharacter阴蒂环上添加了一根牵引绳。 -Select web type -选择网的类型 -Tangled -杂乱 -Wrapped -包裹 -Cocooned -茧状 -Hogtied -驷马 -Suspension Cocooned -茧状悬挂 -Suspension Hogtied -驷马悬挂 -SourceCharacter Action the webbing on TargetCharacter -SourceCharacter用网把TargetCharacter包了起来 -SourceCharacter Action the webbing on TargetCharacter, leaving them fully wrapped -SourceCharacter用网把TargetCharacter包成了一团 -SourceCharacter Action the webbing on TargetCharacter, forming a cocoon -SourceCharacter用网把TargetCharacter包成了茧状 -SourceCharacter wraps TargetCharacter in webbing, forming a hogtie -SourceCharacter用网把TargetCharacter包成了驷马 -SourceCharacter fully wraps TargetCharacter in webbing and uses it to suspend her -SourceCharacter用网把TargetCharacter包成了一团,顺手把她挂了起来 -SourceCharacter cocoons TargetCharacter in webbing and hangs her from the ceiling -SourceCharacter用网把TargetCharacter包成了茧状,顺手把她挂了起来 -SourceCharacter hogties TargetCharacter with the webbing and uses it to suspend her -SourceCharacter用网把TargetCharacter包成了驷马,顺手把她挂了起来 -tightens -捆紧 -loosens -放松 -Cocoon -茧 -SourceCharacter creates a blindfold out of web for TargetCharacter -SourceCharacter用网给TargetCharacter织了一副眼罩 -SourceCharacter creates a cocoon out of web for TargetCharacter -SourceCharacter把TargetCharacter的头完全裹在了茧里 -Make the cutie comfortable. -让小可爱更舒服。 -Open/close the gate. -打开或关闭婴儿床护栏门。 -Give/take toys to/from the cutie. -给小可爱一些玩具/拿走玩具 -Gate -护栏门 -Plushies -毛绒玩具 -No Plushies -没有毛绒玩具 -SourceCharacter opens the gate of DestinationCharacter crib -SourceCharacter打开了DestinationCharacter婴儿床护栏门 -SourceCharacter closed the gate of DestinationCharacter crib -SourceCharacter关闭了DestinationCharacter婴儿床护栏门 -SourceCharacter removes the plushies from DestinationCharacter crib -SourceCharacter拿走了DestinationCharacter婴儿床里的毛绒玩具 -SourceCharacter puts a bucket full of plushies in DestinationCharacter crib -SourceCharacter在DestinationCharacter婴儿床里放了一筐毛绒玩具 -Raise or lower the bottle -抬高或降低奶瓶 -Resting -休息 -Held up -抬起 -Held up high -高高抬起 -SourceCharacter rests DestinationCharacter bottle on her chest. -SourceCharacter把DestinationCharacter奶瓶放在胸口上。 -SourceCharacter holds DestinationCharacter bottle up. -SourceCharacter抬起DestinationCharacter奶瓶。 -SourceCharacter holds DestinationCharacter bottle high above her head. -SourceCharacter把DestinationCharacter奶瓶高高抬起,高过他的头顶。 -Select a corset style. -选择束腰风格. -Garter Straps -腿环束带 -SourceCharacter unhooks the garter straps from DestinationCharacter heavy latex corset. -SourceCharacter解开了DestinationCharacter重型乳胶束腰上的吊袜带。 -SourceCharacter adds garter straps to DestinationCharacter heavy latex corset. -SourceCharacter在DestinationCharacter重型乳胶束腰挂上了一些吊袜带。 -Funnel -漏斗 -SourceCharacter connects a funnel to DestinationCharacter gag. -SourceCharacter将一个漏斗连接到DestinationCharacter口塞。 -SourceCharacter removes the funnel from DestinationCharacter gag. -SourceCharacter移除了DestinationCharacter口塞上的漏斗。 -Escalate -兴奋 -Tease -玩弄 -Edge -寸止 -DestinationCharacterName vibrating bunny vibe stops vibrating. -DestinationCharacterName兔尾式振动肛塞停止振动。 -DestinationCharacterName vibrating bunny vibe slows down into a light tease. -DestinationCharacterName兔尾式振动肛塞慢下来,仅仅在轻微逗弄。 -DestinationCharacterName vibrating bunny vibe returns to a moderate pace. -DestinationCharacterName兔尾式振动肛塞恢复了中等的频率。 -DestinationCharacterName vibrating bunny vibe slows down a tiny bit. -DestinationCharacterName兔尾式振动肛塞稍微慢下来一点。 -DestinationCharacterName vibrating bunny vibe starts teasing her lightly. -DestinationCharacterName兔尾式振动肛塞微微逗弄起她来。 -DestinationCharacterName vibrating bunny vibe builds up to a moderate pace. -DestinationCharacterName兔尾式振动肛塞逐渐提升到中等的频率。 -DestinationCharacterName vibrating bunny vibe starts buzzing strongly! -DestinationCharacterName兔尾式振动肛塞猛烈地颤动起来! -DestinationCharacterName vibrating bunny vibe jumps up to maximum intensity! -DestinationCharacterName兔尾式振动肛塞突然以最大强度振动起来! -DestinationCharacterName vibrating XXL egg stops vibrating. -DestinationCharacterName超超大振动肛塞蛋停止振动。 -DestinationCharacterName vibrating XXL egg slows down into a gentle tease. -DestinationCharacterName超超大振动肛塞蛋慢下来,仅仅在轻微逗弄。 -DestinationCharacterName vibrating XXL egg slows down into a modest pace. -DestinationCharacterName超超大振动肛塞蛋恢复了中等的节奏。 -DestinationCharacterName vibrating XXL egg slows down slightly. -DestinationCharacterName超超大振动肛塞蛋稍微慢下来一点。 -DestinationCharacterName vibrating XXL egg starts to tease her pleasantly. -DestinationCharacterName超超大振动肛塞蛋愉悦地逗弄起她来。 -DestinationCharacterName vibrating XXL egg builds up to a mild pace. -DestinationCharacterName超超大振动肛塞蛋逐渐提升到平和的节奏。 -DestinationCharacterName vibrating XXL egg starts buzzing strongly! -DestinationCharacterName超超大振动肛塞蛋猛烈地颤动起来! -DestinationCharacterName vibrating XXL egg starts buzzing relentlessly! -DestinationCharacterName超超大振动肛塞蛋无情地震荡起来! -SourceCharacter turns DestinationCharacter lactation pump off. -SourceCharacter关闭了DestinationCharacter哺乳泵。 -SourceCharacter turns DestinationCharacter lactation pump down to low suction. -SourceCharacter调低DestinationCharacter哺乳泵到低吸力。 -SourceCharacter turns DestinationCharacter lactation pump down to normal suction. -SourceCharacter调低DestinationCharacter哺乳泵到普通吸力。 -SourceCharacter turns DestinationCharacter lactation pump down to high suction. -SourceCharacter调低DestinationCharacter哺乳泵到高吸力。 -SourceCharacter turns DestinationCharacter lactation pump to low suction. -SourceCharacter调整DestinationCharacter哺乳泵到低吸力。 -SourceCharacter turns DestinationCharacter lactation pump to normal suction. -SourceCharacter调整DestinationCharacter哺乳泵到普通吸力。 -SourceCharacter turns DestinationCharacter lactation pump to high suction. -SourceCharacter调整DestinationCharacter哺乳泵到高吸力。 -SourceCharacter turns DestinationCharacter lactation pump to maximum suction. -SourceCharacter调整DestinationCharacter哺乳泵到最大吸力。 -Select lactation pump setting -选择哺乳泵设置 -Select latex finish -选择乳胶外观 -SourceCharacter removes the polish from DestinationCharacter latex leotard -SourceCharacter从DestinationCharacter乳胶紧身衣上移除了高光。 -SourceCharacter polishes the latex of DestinationCharacter leotard until it's shiny -SourceCharacter给DestinationCharacter乳胶紧身衣上添加了高光,让它闪闪动人。 -Select suit options -选择禁闭拘束服选项 -Configure suit restraints -选择套装拘束 -Restraints -拘束具 -Shock Collar -电击项圈 -Ankles locked -脚踝已上锁 -Thighs locked -大腿锁 -Locked down -已锁定 -SourceCharacter buckles all of the belts on DestinationCharacter suit -SourceCharacter扣上了DestinationCharacter禁闭拘束服上的所有皮带。 -SourceCharacter unbuckles all of the belts on DestinationCharacter suit -SourceCharacter解开了DestinationCharacter禁闭拘束服上的所有皮带。 -SourceCharacter buckles the belts on DestinationCharacter ankles -SourceCharacter扣上了DestinationCharacter脚踝上的皮带 -SourceCharacter buckles the belts on DestinationCharacter thighs -SourceCharacter扣上了DestinationCharacter大腿上的皮带 -SourceCharacter unbuckles the belts on DestinationCharacter thighs -SourceCharacter解开了DestinationCharacter大腿上的皮带 -SourceCharacter unbuckles the belts on DestinationCharacter ankles -SourceCharacter解开了DestinationCharacter脚踝上的皮带 -SourceCharacter releases the belts on DestinationCharacter thighs and buckles the belts on her ankles -SourceCharacter解开了DestinationCharacter大腿上的皮蛋,并扣上了脚踝上的皮带 -SourceCharacter releases the belts on DestinationCharacter ankles and buckles the belts on her thighs -SourceCharacter解开了DestinationCharacter脚踝上的皮蛋,并扣上了大腿上的皮带 -Configure straitjacket -设置拘束衣 -Configure crotch panel -设置胯部挡板 -Configure sleeves -设置袖子 -Configure crotch straps -设置胯部束带 -Crotch Panel -胯部挡板 -Sleeves -袖子 -Crotch Straps -胯部束带 -No crotch panel -无胯部挡板 -Crotch panel -胯部挡板 -Arms in front -手臂在前 -Arms behind -手臂在后 -No crotch straps -无胯部束带 -Single crotch strap -单根胯部束带 -Double crotch strap -两根胯部束带 -Triple crotch strap -三根胯部束带 -SourceCharacter removes the crotch panel from DestinationCharacter straitjacket -SourceCharacter移除了DestinationCharacter拘束衣上的胯部挡板 -SourceCharacter adds a crotch panel to DestinationCharacter straitjacket -SourceCharacter给DestinationCharacter拘束衣添加了胯部挡板 -SourceCharacter unbuckles the sleeves of DestinationCharacter straitjacket -SourceCharacter解开了DestinationCharacter拘束衣添加了胯部挡板 -SourceCharacter secures the arms of DestinationCharacter straitjacket in front of her -SourceCharacter将DestinationCharacter拘束衣的手臂固定在她的身前 -SourceCharacter secures the arms of DestinationCharacter straitjacket behind her -SourceCharacter将DestinationCharacter拘束衣的手臂固定在她的身后 -SourceCharacter removes the crotch straps from DestinationCharacter straitjacket -SourceCharacter移除了DestinationCharacter拘束衣上的胯部束带 -SourceCharacter secures DestinationCharacter straitjacket with a single crotch strap -SourceCharacter使用一根胯部束带固定DestinationCharacter拘束衣 -SourceCharacter secures DestinationCharacter straitjacket with a double crotch strap -SourceCharacter使用两根胯部束带固定DestinationCharacter拘束衣 -SourceCharacter secures DestinationCharacter straitjacket with a triple crotch strap -SourceCharacter使用三根胯部束带固定DestinationCharacter拘束衣 -Adjust what is visible and what is hidden. -调整物品的可见性. -Hide/Unhide clothes. -显示/隐藏服装. -Hide/Unhide corsets. -显示/隐藏束腰. -Hide/Unhide nipple piercings normally hidden due to layer. -显示/隐藏通常由于层级隐藏的乳头穿刺物. -Hide/Unhide vulva piercings normally hidden due to layer. -显示/隐藏通常由于层级隐藏的阴部穿刺物. -Cloth -服装 -Breasts -胸部 -Pelvis and Vulva -小腹和前阴 -Hidden -隐藏 -Visible -显示 -DestinationCharacterName clothes are now hidden when wearing their AssetName. -DestinationCharacterName现在穿戴着AssetName时,衣服会被隐藏。 -DestinationCharacterName clothes are now visible when wearing their AssetName. -DestinationCharacterName现在穿戴着AssetName时,衣服会能看见。 -DestinationCharacterName torso items are now hidden when wearing their AssetName. -DestinationCharacterName现在穿戴着AssetName时,躯干物品会被隐藏。 -DestinationCharacterName torso items are now visible when wearing their AssetName. -DestinationCharacterName现在穿戴着AssetName时,躯干物品会能看见。 -DestinationCharacterName breast items are now hidden when wearing their AssetName. -DestinationCharacterName现在穿戴着AssetName时,胸部物品会被隐藏。 -DestinationCharacterName breast items are now visible when wearing their AssetName. -DestinationCharacterName现在穿戴着AssetName时,胸部物品会能看见。 -DestinationCharacterName pelvis and vulva items are now hidden when wearing their AssetName. -DestinationCharacterName现在穿戴着AssetName时,小腹和前阴物品会被隐藏。 -DestinationCharacterName pelvis and vulva items are now visible when wearing their AssetName. -DestinationCharacterName现在穿戴着AssetName时,小腹和前阴物品会能看见。 -Choose where the arms are restrained. -选择手臂被拘束时的位置. -Arms front -手臂在前 -DestinationCharacter clothes are now hidden when wearing their leotard. -DestinationCharacter现在穿着拘束衣时,衣服会被隐藏。 -DestinationCharacter clothes are now visible when wearing their leotard. -DestinationCharacter现在穿着拘束衣时,衣服会能看见。 -DestinationCharacter torso items is now hidden when wearing their leotard. -DestinationCharacter现在穿着拘束衣时,躯干物品会被隐藏。 -DestinationCharacter torso items is now visible when wearing their leotard. -DestinationCharacter现在穿着拘束衣时,躯干物品会能看见。 -DestinationCharacter breast items are now hidden when wearing their leotard. -DestinationCharacter现在穿着拘束衣时,胸部物品会被隐藏。 -DestinationCharacter breast items are now visible when wearing their leotard. -DestinationCharacter现在穿着拘束衣时,胸部物品会能看见。 -DestinationCharacter pelvis and vulva items are now hidden when wearing their leotard. -DestinationCharacter现在穿着拘束衣时,小腹和前阴物品会被隐藏。 -DestinationCharacter pelvis and vulva items are now visible when wearing their leotard. -DestinationCharacter现在穿着拘束衣时,小腹和前阴物品会能看见。 -DestinationCharacter arms are now in front of them. -DestinationCharacter现在手臂在身体前方。 -DestinationCharacter arms are now behind of them. -DestinationCharacter现在手臂在身体后方。 -Configure mask -设置面罩 -Configure eyes -设置眼睛 -Configure mouth -设置嘴部 -Configure blush -设置脸红 -Configure eyebrows -设置眉毛 -Configure opacity -设置透明度 -Configure mask between a solid kirugumi & hollywood silicone mask -选择Kirugumi样式或好莱坞硅胶样式面罩 -Eyes -眼睛 -Mouth -嘴巴 -Blush -脸红 -Eyebrows -眉毛 -Mask Style -面罩模式 -Wink -媚眼 -Lewd -放荡 -Angry -生气 -Alternating -抬眉毛 -Lenses -镜片 -Eyeholes -眼孔 -Solid -坚硬 -Latex -乳胶 -SourceCharacter changes the eyes on DestinationCharacter mask -SourceCharacter调整了DestinationCharacter面具上的眼睛 -SourceCharacter changes the mouth on DestinationCharacter mask -SourceCharacter调整了DestinationCharacter面具上的嘴巴 -SourceCharacter changes the blush on DestinationCharacter mask -SourceCharacter调整了DestinationCharacter面具上的腮红 -SourceCharacter changes the eyebrows on DestinationCharacter mask -SourceCharacter调整了DestinationCharacter面具上的眉毛 -SourceCharacter changes the opacity on DestinationCharacter mask -SourceCharacter调整了DestinationCharacter面具的不透明度 -SourceCharacter changes the type of mask on TargetCharacter -SourceCharacter调整了TargetCharacter的面具类型 -Select the visibility -选择可见性 -Revealed -已显示 -Tucked in -被困 -Detached Gloves -已脱下手套 -Attached Opaque Gloves -已穿戴不透明手套 -Attached See-through Gloves -已穿戴透明手套 -DestinationCharacterName AssetName stops vibrating. -DestinationCharacterNameAssetName停止振动。 -DestinationCharacterName AssetName slows down into a light tease. -DestinationCharacterNameAssetName慢下来,仅仅在轻微逗弄。 -DestinationCharacterName AssetName returns to a moderate pace. -DestinationCharacterNameAssetName恢复了中等的频率。 -DestinationCharacterName AssetName slows down a tiny bit. -DestinationCharacterNameAssetName稍微慢下来一点。 -DestinationCharacterName AssetName starts teasing her lightly. -DestinationCharacterNameAssetName微微逗弄起她来。 -DestinationCharacterName AssetName builds up to a moderate pace. -DestinationCharacterNameAssetName逐渐提升到中等的频率。 -DestinationCharacterName AssetName starts buzzing strongly! -DestinationCharacterNameAssetName猛烈地颤动起来! -DestinationCharacterName AssetName jumps up to maximum intensity! -DestinationCharacterNameAssetName突然以最大强度振动起来! -SourceCharacter changes the settings on DestinationCharacterName AssetName -SourceCharacter修改了DestinationCharacterNameAssetName的设置 -DestinationCharacterName owner releases her from the slave collar. -DestinationCharacterName主人解开了她的奴隶项圈。 -TargetCharacterName is given her slave collar again. -TargetCharacterName再次被戴上了她的奴隶项圈。 -Active Rules -生效规则 -No active rules -没有生效的规则 -No owner locks on yourself -你的身上没有主人锁 -Cannot change: -无法更改: -No whispers around your owner -在你主人身边时无法悄悄话 -Blocked: Normal keys -禁止:普通钥匙 -Blocked: Remotes on anyone -禁止:所有人的遥控器 -Blocked: Remotes on yourself -禁止:你自己的遥控器 -Slave collar unlocked -奴隶项圈已解锁 -Cannot change your nickname -不能修改你的昵称 -No lover locks on yourself -不能对自己使用恋人锁 -Your owner cannot use lover locks on you -你的主人不能对你使用恋人锁 -Edit Text: -编辑文字: -SourceCharacter modifies DestinationCharacterName canvas hood to read "NewText" -SourceCharacter修改DestinationCharacterName帆布头套上的文本为"NewText" -Edit Text -编辑文字 -SourceCharacter removes the text from DestinationCharacterName AssetName -SourceCharacter移除了DestinationCharacterNameAssetName上的文本 -SourceCharacter changes the text on DestinationCharacterName AssetName to read "NewText" -SourceCharacter修改DestinationCharacterNameAssetName上的文本为"NewText" -Select Text Orientation -选择文字方向 -SourceCharacter modifies DestinationCharacter bowl to read "NewText" -SourceCharacter修改DestinationCharacter宠物碗上的文本为"NewText" -Select Halo Type -选择光环类型 -Broken -损坏 -Brightness -亮度 -Select Features -选择功能 -Configure Jacket -配置拘束衣 -No Shorts -没有短裤 -Shorts -有短裤 -Shorts & Straps -有短裤并添加系带 -Change jacket text: -改变拘束衣文字: -SourceCharacter removes the shorts from DestinationCharacter AssetName -SourceCharacter从DestinationCharacterAssetName上移除了短裤 -SourceCharacter attaches shorts to DestinationCharacter AssetName -SourceCharacter将短裤附加到DestinationCharacterAssetName上 -SourceCharacter removes the reinforcing straps from DestinationCharacter AssetName -SourceCharacter从DestinationCharacterAssetName上移除了强化束带 -SourceCharacter attaches shorts and reinforcing straps to DestinationCharacter AssetName -SourceCharacter在DestinationCharacterAssetName上添加了强化束带,并添加了短裤 -SourceCharacter reinforces DestinationCharacter AssetName with sturdy straps -SourceCharacter在DestinationCharacterAssetName上添加了强化束带 -Select Pole state -选择柱子状态 -Untie from pole -从柱子上解开 -Tie to pole -系到柱子上 -SourceCharacter unties TargetCharacter from the pole. -SourceCharacter将TargetCharacter从柱子上解开。 -SourceCharacter ties TargetCharacter to the pole. -SourceCharacter将TargetCharacter系到柱子上。 -Select an eyepatch style. -选择眼罩风格. -Left -左侧 -Right -右侧 -Select a style. -选择样式。 -Front of hair -在头发前 -Behind hair -在头发后 -Gradient up -渐变色 -Gradient dipped -近光渐变色 -Flat up -均匀色 -Flat dipped -近光均匀色 -Select the style. -选择样式。 -← This side -← 这一侧 -← Both sides → -← 两侧 → -That side → -那一侧 → -Both -两侧 -Select leg spreader width. -选择分腿杆宽度. -Narrow -窄 -Wide -宽 -Change blanket -更换毯子 -Add blanket -添加毯子 -Remove blanket -移除毯子 -SourceCharacter gives TargetCharacter a blanket. -SourceCharacter给TargetCharacter盖上了毯子。 -SourceCharacter removes the blanket from TargetCharacter. -SourceCharacter从TargetCharacter的身上移除了毯子。 -Chat Message -聊天消息 -Joined Room -加入了房间 -Disconnected -掉线了 -Test Notification -测试通知 - from ChatRoomName -来自ChatRoomName -LARP - Your turn -体感对战-你的回合 -Select Tightness -选择松紧度 -SourceCharacter loosens DestinationCharacter clamps. -SourceCharacter将DestinationCharacter乳头夹放松了一些。 -SourceCharacter tigthens DestinationCharacter clamps. -SourceCharacter将DestinationCharacter乳头夹收紧了一些。 -Collar Only -只有项圈 -Cuffs Only -只有手铐 -Customize the bib. -自定义围嘴。 -Pattern -图案 -Select a pattern. -选择一个图案。 -Pacis and Bottles -奶嘴和瓶子 -Strawberries -草莓 -Paw Prints -爪印 -Cows -奶牛 -Hearts -爱心 -Add some text -添加文字 -Ears -耳朵 -Earless -没有耳朵 -Select part of the nose. -选择鼻子的部分。 -Cheeks -脸颊 -Nose -鼻子 -Whiskers -胡须 -Select Cheeks -选择脸颊 -No Cheeks -没有脸颊 -Small Cheeks -小脸颊 -Big Cheeks -大脸颊 -Select Nose -选择鼻子 -No Nose -没有鼻子 -Select Whiskers -选择胡须 -No Whiskers -没有胡须 -Short Whiskers -短胡须 -Long Whiskers -长胡须 -Mouth visibility -嘴巴可见性 -Show Mouth -显示嘴巴 -Your blindfold prevents you from seeing the digits on the lock -你的眼罩让你无法看见锁上的数位 -Your restraints prevent you from accurately manipulating the lock's dial -你的束缚让你无法准备操作锁的数字转盘 -Choose an action. -选择一个动作。 -Hold cushion -拿着垫子 -Kneel on cushion -跪在垫子上 -Select corset style -选择束腰样式 -No garters -无袜带 -With garters -有袜带 -SourceCharacter adds garters to DestinationCharacter latex corset. -SourceCharacter在DestinationCharacter乳胶束腰上添加了吊袜带。 -SourceCharacter removes the garters from DestinationCharacter latex corset. -SourceCharacter移除了DestinationCharacter乳胶束腰上的吊袜带。 -Select elf ears position -选择精灵耳位置 -In front of hair -在头发前 -Select the ribbon bondage -选择丝带捆绑方式 -Lightly Wrapped -简单捆绑 -Lightly Wrapped With A Bow -简单捆绑并打个蝴蝶结 -Wrapped Up -层层包裹 -SourceCharacter wraps around some ribbons onto DestinationCharacter chest. -SourceCharacter在DestinationCharacter胸口缠了一些丝带。 -SourceCharacter wraps around some ribbons onto DestinationCharacter chest and adds a bow to finish it. -SourceCharacter在DestinationCharacter胸口缠了一些丝带,并打了一个蝴蝶结。 -SourceCharacter wraps a good amount of ribbons around DestinationCharacter chest. -SourceCharacter在DestinationCharacter胸口缠了很多丝带。 -Style 1 -样式1 -Style 2 -样式2 -SourceCharacter uses some ribbons to tie a crotch tie on DestinationCharacter. -SourceCharacter用丝带在DestinationCharacter胯部绑了一套绳结。 -SourceCharacter uses some ribbons on DestinationCharacter crotch to slighty wrap it up. -SourceCharacter用丝带在DestinationCharacter胯部绑了一套绳结,把这里稍微包裹起来。 -Messy style 1 -杂乱样式1 -Messy style 2 -杂乱样式2 -Crossed Style -交叉样式 -SourceCharacter lightly wraps some ribbons around DestinationCharacter legs. -SourceCharacter在DestinationCharacter腿部稍稍缠了一些丝带。 -SourceCharacter wraps some ribbons on DestinationCharacter legs. -SourceCharacter在DestinationCharacter腿部缠了一些丝带。 -SourceCharacter wraps some ribbons on DestinationCharacter legs to have as a crossed style tie. -SourceCharacter在DestinationCharacter腿部稍稍缠了一些丝带,并绑成了交叉样式的结。 -Bow -打结 -SourceCharacter uses some ribbons on DestinationCharacter face. -SourceCharacter在DestinationCharacter脸上缠了一些丝带。 -SourceCharacter uses some more ribbons on DestinationCharacter face. -SourceCharacter在DestinationCharacter脸上缠了更多的丝带。 -Cross -交叉 -SourceCharacter uses some ribbons on DestinationCharacter arms. -SourceCharacter在DestinationCharacter手臂上缠了一些丝带。 -SourceCharacter uses some more ribbons on DestinationCharacter arms. -SourceCharacter在DestinationCharacter手臂上缠了更多的丝带。 -Harness 2 -束缚带2 -SourceCharacter uses some ribbons on DestinationCharacter belly. -SourceCharacter在DestinationCharacter肚子上缠了一些丝带。 -SourceCharacter uses some ribbons on DestinationCharacter torso. -SourceCharacter在DestinationCharacter躯干上缠了一些丝带。 -SourceCharacter uses some ribbon on DestinationCharacter mouth. -SourceCharacter在DestinationCharacter嘴上缠了一些丝带。 -SourceCharacter uses some ribbon on DestinationCharacter mouth with a bow to finish it. -SourceCharacter在DestinationCharacter嘴上缠了一些丝带,并打了一个蝴蝶结。 -Select where the bit will be -选择衔铁的位置 -SourceCharacter unclips the bit from DestinationCharacter harness. -SourceCharacter解开了DestinationCharacter马具上的的衔铁。 -SourceCharacter clips the bit onto DestinationCharacter harness. -SourceCharacter扣上了了DestinationCharacter马具上的的衔铁。 -Open or close the gag -打开或者关闭开口器 -SourceCharacter closes the mouth of TargetCharacter. -SourceCharacter关上了TargetCharacter的嘴巴。 -SourceCharacter forces the mouth of TargetCharacter open. -SourceCharacter强行打开了TargetCharacter的嘴巴。 -Add or remove drinks from the tray -从托盘中添加或移除饮品 -SourceCharacter empties DestinationCharacter tray. -SourceCharacter清空了DestinationCharacter托盘 -Drinks -饮品 -SourceCharacter fills DestinationCharacter tray with drinks. -SourceCharacter在DestinationCharacter托盘上摆满饮品。 -Cake -蛋糕 -SourceCharacter fills DestinationCharacter tray with a cake. -SourceCharacter在DestinationCharacter托盘摆了一个蛋糕。 -Cookies -饼干 -SourceCharacter fills DestinationCharacter tray with cookies. -SourceCharacter在DestinationCharacter托盘上摆满小饼干。 -Toys -玩具 -SourceCharacter fills DestinationCharacter tray with sex toys. -SourceCharacter在DestinationCharacter托盘上摆满性玩具。 -Select the type of Teddy Bear -选择泰迪熊的类型 -Bear -熊 -Fox -狐狸 -SourceCharacter gives TargetCharacter a cute teddy bear. -SourceCharacter给了TargetCharacter一只可爱的泰迪熊。 -SourceCharacter gives TargetCharacter a cute foxy teddy. -SourceCharacter给了TargetCharacter一只可爱的狐狸泰迪。 -SourceCharacter gives TargetCharacter a cute kitty teddy. -SourceCharacter给了TargetCharacter一只可爱的猫猫泰迪。 -SourceCharacter gives TargetCharacter a cute puppy teddy. -SourceCharacter给了TargetCharacter一只可爱的小狗泰迪。 -SourceCharacter gives TargetCharacter a cute Bunny teddy. -SourceCharacter给了TargetCharacter一只可爱的兔兔泰迪。 -SourceCharacter gives TargetCharacter a cute Pony teddy. -SourceCharacter给了TargetCharacter一只可爱的小马泰迪。 -Page -页 -Set the height -设置高度 -% of full height: -%最大高度: -SourceCharacter uses AssetName to suspend TargetCharacter from the ceiling. -SourceCharacter使用AssetName把TargetCharacter吊在了天花板上。 -SourceCharacter raises the height of DestinationCharacter suspension. -SourceCharacter提高了DestinationCharacter吊起的高度。 -SourceCharacter lowers the height of DestinationCharacter suspension. -SourceCharacter降低了DestinationCharacter吊起的束缚的高度。 -Select silk bondage. -选择丝质束带的束缚。 -Crotch Strap -胯部束带 -Crotch Strap (Over Panties) -胯部束带(在内裤上) -SourceCharacter uses the silk on DestinationCharacter to create a crotch strap. -SourceCharacter用丝质束带给DestinationCharacter绑上了胯部束带。 -SourceCharacter uses the silk on DestinationCharacter to create a crotch strap over her panties. -SourceCharacter用丝质束带在DestinationCharacter内裤外侧绑了一个胯部束带。 -SourceCharacter uses the silk on DestinationCharacter to create a swiss seat pattern. -SourceCharacter用丝质束带给DestinationCharacter绑成了瑞士座样式。 -SourceCharacter uses the silk on DestinationCharacter to create a kikkou hip pattern. -SourceCharacter用丝质束带给DestinationCharacter绑了一个龟甲臀缚。 -Waist Strap -腰部系带 -Star Harness -星形束缚带 -Diamond Harness -菱形束缚带 -SourceCharacter uses the silk on DestinationCharacter to create a waist strap. -SourceCharacter用丝质束带给DestinationCharacter绑上了腰部系带。 -SourceCharacter uses the silk on DestinationCharacter to create a body harness. -SourceCharacter用丝质束带给DestinationCharacter绑上了身体束缚带。 -SourceCharacter uses the silk on DestinationCharacter to create a star harness. -SourceCharacter用丝质束带给DestinationCharacter绑上了星形束缚带。 -SourceCharacter uses the silk on DestinationCharacter to create a diamond harness. -SourceCharacter用丝质束带给DestinationCharacter绑上了菱形束缚带。 -Select silk clothing. -选择丝质束带衣服。 -Single Strip -单条 -Bra -胸罩 -Strapless Bra -无吊带胸罩 -Skimpy Swimsuit -暴露的泳装 -Double Strips -双条 -Thong -丁字裤 -Select strap bondage. -选择束带束缚。 -Boxtie -后手缚 -Wrist And Elbow Tie -手腕和手肘束缚 -Wrist And Elbow Harness Tie -手腕和手肘以及束缚带 -SourceCharacter uses the straps on DestinationCharacter to do a wrist strap. -SourceCharacter用束带绑住了DestinationCharacter手腕。 -SourceCharacter uses the straps on DestinationCharacter to do a boxtie harness. -SourceCharacter用束带给DestinationCharacter绑了一个后手缚束缚带。 -SourceCharacter uses the straps on DestinationCharacter to do a wrist and elbow straps. -SourceCharacter用束带绑住了DestinationCharacter手腕和手肘。 -SourceCharacter uses the straps on DestinationCharacter to do a wrist and elbow harness. -SourceCharacter用束带绑住了DestinationCharacter手腕和手肘,并绑上了束缚带。 -SourceCharacter uses the straps on DestinationCharacter to do a hogtie harness. -SourceCharacter用束带给DestinationCharacter绑了一个驷马缚。 -Arrange slime -调整史莱姆 -Select slime type -选择史莱姆类型 -Slime Type -史莱姆类型 -Torso only -仅躯干 -Encasement -覆盖 -Normal slime -通常史莱姆 -Slime girl -史莱姆女孩 -The slime around DestinationCharacter body contracts until it is only restraining her arms. -DestinationCharacter身体周围的史莱姆收缩,直到仅仅束缚住她的手臂。 -The slime around DestinationCharacter arms expands to encase her whole body. -DestinationCharacter身体周围的史莱姆伸展,将她的整个身体包裹住。 -The slime girl recedes back into the slime on TargetCharacter. -史莱姆女孩缩回了TargetCharacter身上的史莱姆里。 -A slime girl emerges from the slime around TargetCharacter. -TargetCharacter身上的史莱姆里钻出来一个史莱姆女孩。 -SourceCharacter uses the straps on DestinationCharacter to create a crotch strap. -SourceCharacter使用束带给DestinationCharacter绑上了胯部束带。 -SourceCharacter uses the straps on DestinationCharacter to create a waist strap. -SourceCharacter使用束带给DestinationCharacter绑了一个腰部束带。 -SourceCharacter uses the straps on DestinationCharacter to create a harness. -SourceCharacter使用束带给DestinationCharacter绑了一个身体束带。 -Select a bikini style. -选择一个比基尼样式。 -Select bandana style. -选择一个大头巾样式。 -Plain -普通 -Flowers -花朵 -Circles -圆圈 -Dots -圆点 -Triangles -三角 -Select strap location. -选择束带位置。 -Under the hair -头发下面 -Over the hair -头发上面 -Select print design. -选择印刷图案。 -BCLogo -BC图标 -BDSM -BDSM -BG -BG -Knot -结 -Monogram -交织字母 -Rock -Rock -Smile -微笑 -Sun -太阳 -Tick -打钩 -Select your design -选择你的图案 -Club Logo -俱乐部图标 -BD-SM -BD-SM -The Moaning Groans -呻吟叹息 -Rope Knot -绳结 -Smiley -微笑 -Check -打钩 -Select a dress pattern. -选择裙装样式。 -Style 3 -样式3 -Select your style. -选择你的样式。 -Laced body. -身体系带。 -Non-Laced body. -身体无系带。 -Select an option. -选择一个选项。 -No shine -无高光 -Select a bracelet style. -选择手镯样式。 -Both arms -两臂 -Right arm -右臂 -Left arm -左臂 -Select a diaper pattern. -选择一种尿布样式。 -Butterflies -蝴蝶 -Spots -斑点 -Favorite -最爱 -Favorite (yours) -最爱(你的) -Favorite (theirs & yours) -最爱(她们&你的) -Held -手持 -Lovers only -仅限恋人 -Owner only -仅限主人 -Automatically locks -自动上锁 -Allowed Limited Item -允许限制物品 -Cannot use this option when wearing the item -已经佩戴时无法使用该选项 -Configure Collar -配置项圈 -Configure Collar Type -配置项圈类型 -Configure Shock Module -配置电击模块 -Collar Type -项圈类型 -Slender -纤细 -Choker -贴颈项链 -Posture -限制姿势 -Strict Posture -严格限制姿势 -No Shock Module -无电击模块 -SourceCharacter sets DestinationCharacter collar to a slender one. -SourceCharacter将DestinationCharacter项圈配置为纤细的样式。 -SourceCharacter sets DestinationCharacter collar to a choker one. -SourceCharacter将DestinationCharacter项圈配置为贴颈项链的样式。 -SourceCharacter sets DestinationCharacter collar to a full one. -SourceCharacter将DestinationCharacter项圈配置为完整的样式。 -SourceCharacter sets DestinationCharacter collar to a posture one. -SourceCharacter将DestinationCharacter项圈配置为限制姿势的样式。 -SourceCharacter sets DestinationCharacter collar to a strict posture one. -SourceCharacter将DestinationCharacter项圈配置为严格限制姿势的样式。 -SourceCharacter deactivates DestinationCharacter collar shock module. -SourceCharacter关闭了DestinationCharacter项圈上的电击模块。 -SourceCharacter activates DestinationCharacter collar shock module. -SourceCharacter激活了DestinationCharacter项圈上的电击模块。 -Configure helmet -配置头盔 -Configure visor -配置护目镜 -Configure deafening module -配置隔音模块 -Configure chin strap -配置下巴束带 -Visor -护目镜 -Deafening Module -隔音模块 -Chin Strap -下巴束带 -No Visor -无护目镜 -Transparent Visor -透明护目镜 -Lightly Tinted Visor -轻度染色护目镜 -Heavily Tinted Visor -重度染色护目镜 -Opaque Visor -不透明护目镜 -Hypnotic Visor -催眠护目镜 -No Deafening Module -无隔音模块 -No Chin Strap -无下巴束带 -SourceCharacter removes the visor on DestinationCharacter helmet. -SourceCharacter移除了DestinationCharacter头盔上的护目镜。 -SourceCharacter sets the visor on DestinationCharacter helmet to transparent. -SourceCharacter将DestinationCharacter头盔上的护目镜配置为透明。 -SourceCharacter sets the visor on DestinationCharacter helmet to have a light tint. -SourceCharacter将DestinationCharacter头盔上的护目镜配置为轻度染色。 -SourceCharacter sets the visor on DestinationCharacter helmet to have a heavy tint. -SourceCharacter将DestinationCharacter头盔上的护目镜配置为重度染色。 -SourceCharacter sets the visor on DestinationCharacter helmet to be opaque. -SourceCharacter将DestinationCharacter头盔上的护目镜配置为不透明。 -SourceCharacter sets the visor on DestinationCharacter helmet to be opaque and have a hypnotic effect. -SourceCharacter将DestinationCharacter头盔上的护目镜配置为不透明,并具有催眠效果。 -SourceCharacter turns off the deafening module on DestinationCharacter helmet. -SourceCharacter关闭了DestinationCharacter头盔上的隔音模块。 -SourceCharacter turns the deafening module on DestinationCharacter on light mode. -SourceCharacter将DestinationCharacter头盔上的隔音模块调到轻度模式。 -SourceCharacter turns the deafening module on DestinationCharacter on heavy mode. -SourceCharacter将DestinationCharacter头盔上的隔音模块调到重度模式。 -SourceCharacter turns the deafening module on DestinationCharacter on noise cancelling mode. -SourceCharacter将DestinationCharacter头盔上的隔音模块调到降噪模式。 -SourceCharacter removes the chin strap on DestinationCharacter helmet. -SourceCharacter移除了DestinationCharacter头盔上的下巴束带。 -SourceCharacter adds the chin strap on DestinationCharacter helmet. -SourceCharacter在DestinationCharacter头盔上添加了下巴束带。 -Select the rope length -选择绳子长度 -Long -长 -Short -短 -Select the design -选择样式 -Loops -圈圈 -Select the state. -选择状态。 -On -开 -Select Medical Patch Details -选择医用胶布细节 -Select Eye -选择眼睛 -Eye -眼睛 -SourceCharacter changes the medical patches on DestinationCharacter eyes -SourceCharacter改变了DestinationCharacter双眼上的医用胶布 -Select Right Sticker -选择右边胶布 -Right Sticker -右边胶布 -Heart -心形 -Stripes -条纹 -Teddy -泰迪 -SourceCharacter changes the sticker on DestinationCharacter right eye -SourceCharacter改变了DestinationCharacter右眼上的医用胶布 -Select Left Sticker -选择左边胶布 -Left Sticker -左边胶布 -SourceCharacter changes the sticker on DestinationCharacter left eye -SourceCharacter改变了DestinationCharacter左眼上的医用胶布 -Select Mask Details -选择面具细节 -Select Eye Shape -选择眼睛形状 -Smooth -平滑 -Spirals -旋涡 -Holes -小洞 -Sculpted -拟真 -Concave -凹陷 -SourceCharacter changes the eyes on DestinationCharacter smooth latex mask. -SourceCharacter改变了DestinationCharacter平滑乳胶面具的眼睛。 -Select Mouth Shape -选择嘴形状 -Onahole -飞机杯 -Pussy -外阴 -SourceCharacter changes the mouth on DestinationCharacter smooth latex mask. -SourceCharacter改变了DestinationCharacter平滑乳胶面具的嘴巴。 -Switch Glow Function -切换发光功能 -Glow -发光 -SourceCharacter flicks the glow switch on DestinationCharacter smooth latex mask. -SourceCharacter切换了DestinationCharacter平滑乳胶面具的发光开关。 -Select Mask Pattern -选择面具图案 -Barcode -条码 -Scarab -圣甲虫 -Hexagon -六边形 -Lines -线条 -SourceCharacter removes the text from DestinationCharacterName smooth latex mask. -SourceCharacter移除了DestinationCharacterName平滑乳胶面具上的文字。 -SourceCharacter changes the text on DestinationCharacterName smooth latex mask to read 'NewText'. -SourceCharacter改变DestinationCharacterName平滑乳胶面具上的文字为'NewText'。 -SourceCharacter changes the pattern on DestinationCharacter smooth latex mask. -SourceCharacter改变了DestinationCharacter平滑乳胶面具上的图案。 -Select Lens Quality -选择镜片质量 -Opaque -不透明 -One-Way -单向 -SourceCharacter changes the inner lining of DestinationCharacter smooth latex mask. -SourceCharacter改变了DestinationCharacter平滑乳胶面具的内侧衬垫。 -Select Coverage -选择覆盖程度 -Coverage -覆盖 -Hood -头套 -Total Hood -全头套 -SourceCharacter changes the coverage of DestinationCharacter smooth latex mask. -SourceCharacter改变了DestinationCharacter平滑乳胶面具的覆盖程度。 -Freckles -雀斑 -Nose Freckles -鼻子雀斑 -Split Freckles -两侧雀斑 -Small Freckles -小雀斑 -Small Nose Freckles -小鼻子雀斑 -Small Cheek Freckles -小脸颊雀斑 -Stars Both Sides -两侧星星 -Stars Left -左侧星星 -Stars Right -右侧星星 -Dots Both Sides -两侧圆点 -Dots Left -左侧圆点 -Dots Right -右侧圆点 -Select Zipper State. -选择拉链状态。 -Eyes Closed -眼睛闭合 -Mouth Closed -嘴巴闭合 -SourceCharacter zips up DestinationCharacter hood. -SourceCharacter拉上了DestinationCharacter头套的拉链。 -SourceCharacter unzips DestinationCharacter hood. -SourceCharacter拉开了DestinationCharacter头套的拉链。 -SourceCharacter zips the eyes and unzips the mouth of DestinationCharacter hood. -SourceCharacter拉上了DestinationCharacter头套上眼睛位置的拉链,拉开了嘴巴位置的拉链。 -SourceCharacter unzips the eyes and zips the mouth of DestinationCharacter hood. -SourceCharacter拉开了DestinationCharacter头套上眼睛位置的拉链,拉开了嘴巴位置的拉链。 -Select Status. -选择状态。 -Lights On -灯光打开 -Lights Off -灯光关闭 -SourceCharacter turns off the lights of DestinationCharacter headbox. -SourceCharacter关闭了DestinationCharacter头盒里的灯光。 -SourceCharacter turns on the lights of DestinationCharacter headbox. -SourceCharacter打开了DestinationCharacter头盒里的灯光。 -Select bridle Gag Accessories -选择缰绳口塞配件 -Select Gag Accessory -选择口塞配件 -Bit Gag -衔铁 -Large Bit Gag -大号衔铁 -Tongue Depressor Bit Gag -舌压迫衔铁 -Dildo Gag -假阳具衔铁 -SourceCharacter uses a bit gag on DestinationCharacter bridle gag. -SourceCharacter在DestinationCharacter缰绳口塞上使用了衔铁。 -SourceCharacter removes the gag on DestinationCharacter bridle gag. -SourceCharacter从DestinationCharacter缰绳口塞上移除了口塞。 -SourceCharacter uses a large bit gag on DestinationCharacter bridle gag. -SourceCharacter在DestinationCharacter缰绳口塞上使用了大号衔铁。 -SourceCharacter uses a tongue depressor on DestinationCharacter bridle gag. -SourceCharacter在DestinationCharacter缰绳口塞上使用了舌压迫衔铁。 -SourceCharacter uses a dildo gag on DestinationCharacter bridle gag. -SourceCharacter在DestinationCharacter缰绳口塞上使用了假阳具衔铁。 -Select Extra Straps -选择额外束带 -Extra Straps -额外束带 -Additional Straps -增加束带 -Flags -旗帜 -SourceCharacter changes the additional straps on DestinationCharacter bridle gag. -SourceCharacter改变了DestinationCharacter缰绳口塞上的额外束带。 -SourceCharacter adds additional straps to DestinationCharacter bridle gag. -SourceCharacter在DestinationCharacter缰绳口塞上添加了额外束带。 -SourceCharacter adds decorative flags on DestinationCharacter bridle gag. -SourceCharacter在DestinationCharacter缰绳口塞上添加了装饰旗帜。 -Select Top Accessory -选择顶部配饰 -Top -头顶 -Plume -羽饰 -Mane Left -左侧鬃 -Mane Right -右侧鬃 -Mohawk -莫霍克 -SourceCharacter removes the top accessory on DestinationCharacter bridle gag. -SourceCharacter移除了DestinationCharacter缰绳口塞的顶部配饰。 -SourceCharacter adds a plume on DestinationCharacter bridle gag. -SourceCharacter在DestinationCharacter缰绳口塞上添加了羽装。 -SourceCharacter styles DestinationCharacter hair into a mane. -SourceCharacter将DestinationCharacter头发梳理成一侧的鬃发。 -SourceCharacter styles DestinationCharacter hair into a mohawk. -SourceCharacter将DestinationCharacter头发梳理成莫霍克发型。 -Select Horn Accessory -选择角配饰 -Horn -独角 -Dildocorn -假阳具角 -SourceCharacter transforms TargetCharacter into a regular pony. -SourceCharacter将TargetCharacter变化为一匹普通的小马。 -SourceCharacter transforms TargetCharacter into a magical unicorn. -SourceCharacter将TargetCharacter变化为一匹普通的魔法独角兽。 -SourceCharacter transforms TargetCharacter into a lusty dildocorn. -SourceCharacter将TargetCharacter变化为一匹放荡的阳具角兽。 -Select Panel Accessory -选择面板配件 -Panel -面板 -Hex -六边形 -Shield -盾牌 -Moon -月亮 -Horse -马匹 -Triskel -三曲枝 -Pentacle -五角星 -SourceCharacter changes the panel on DestinationCharacter bridle gag. -SourceCharacter改变了DestinationCharacter缰绳口塞上的面板。 -SourceCharacter adds a panel to DestinationCharacter bridle gag. -SourceCharacter在DestinationCharacter缰绳口塞上添加了一个面板。 -SourceCharacter uses a futuristic ornament on DestinationCharacter panel. -SourceCharacter在DestinationCharacter缰绳口塞的面板添加了一个未来风格的装饰。 -SourceCharacter uses an ornament of protection on DestinationCharacter panel. -SourceCharacter在DestinationCharacter缰绳口塞的面板添加了一个表示防护的装饰。 -SourceCharacter uses an ornament of night on DestinationCharacter panel. -SourceCharacter在DestinationCharacter缰绳口塞的面板添加了一个表示夜晚的装饰。 -SourceCharacter uses an ornament of light on DestinationCharacter panel. -SourceCharacter在DestinationCharacter缰绳口塞的面板添加了一个表示光明的装饰。 -SourceCharacter uses a loving ornament on DestinationCharacter panel. -SourceCharacter在DestinationCharacter缰绳口塞的面板添加了一个表示爱意的装饰。 -SourceCharacter uses an equestrian ornament on DestinationCharacter panel. -SourceCharacter在DestinationCharacter缰绳口塞的面板添加了一个表示马术的装饰。 -SourceCharacter uses a kinky ornament on DestinationCharacter panel. -SourceCharacter在DestinationCharacter缰绳口塞的面板添加了一个表示bdsm的装饰。 -SourceCharacter uses a ritual ornament on DestinationCharacter panel. -SourceCharacter在DestinationCharacter缰绳口塞的面板添加了一个表示仪式的装饰。 -Select Rein Accessory -选择缰绳配件 -Reins -缰绳 -Rope -绳子 -Hitching Post -拴马桩 -SourceCharacter removes the reins on DestinationCharacter bridle gag. -SourceCharacter从DestinationCharacter缰绳口塞上移除了缰绳。 -SourceCharacter adds reins to DestinationCharacter bridle gag. -SourceCharacter在DestinationCharacter缰绳口塞上添加了缰绳。 -SourceCharacter ties a rope to DestinationCharacter bridle gag. -SourceCharacter将绳子绑到DestinationCharacter缰绳口塞上。 -SourceCharacter ties DestinationCharacter reins to a post. -SourceCharacter将DestinationCharacter缰绳口塞上的缰绳栓到马桩上。 -Select Blinders -选择马眼罩 -Blinders -马眼罩 -SourceCharacter removes the blinders on DestinationCharacter bridle gag. -SourceCharacter移除了DestinationCharacter缰绳口塞上的马眼罩。 -SourceCharacter adds blinders to DestinationCharacter bridle gag. -SourceCharacter在DestinationCharacter缰绳口塞上添加了马眼罩。 -Choose the rack's configuration -选择拉肢刑具的配置 -Choose the bed for the rack -选择拉肢刑具的床板 -Frame -框架 -Full bed -完整床板 -Stained bed -染污床板 -Partial bed -部分床板 -No bed -没有床板 -SourceCharacter places all the planks on DestinationCharacter rack. -SourceCharacter在DestinationCharacter拉肢刑具上摆上了所有的木板。 -TargetCharacterName lies over stains. -TargetCharacterName躺在污渍里。 -SourceCharacter removes some planks from DestinationCharacter rack. -SourceCharacter从DestinationCharacter拉肢刑具上移除了一些木板。 -SourceCharacter removes all the planks from DestinationCharacter rack. -SourceCharacter从DestinationCharacter拉肢刑具上移除了所有木板。 -Choose how to restrain the arms -选择如何束缚手臂 -Tight Rope -拉紧绳索 -Tight Chain -拉紧锁链 -In Stocks -使用木枷 -SourceCharacter frees DestinationCharacter arms. -SourceCharacter解开了DestinationCharacter双臂。 -SourceCharacter ties DestinationCharacter wrists with a rope. -SourceCharacter用绳子束缚DestinationCharacter手腕。 -SourceCharacter tightens DestinationCharacter ropes. -SourceCharacter收紧了DestinationCharacter绳子。 -SourceCharacter shackles DestinationCharacter wrists. -SourceCharacter用镣铐束缚DestinationCharacter手腕。 -SourceCharacter tightens DestinationCharacter chains. -SourceCharacter收紧了DestinationCharacter锁链。 -SourceCharacter puts DestinationCharacter neck and wrists in stocks. -SourceCharacter把DestinationCharacter脖子和手腕束缚在木枷里。 -Choose how to restrain the legs -选择如何束缚双腿 -Tied Together -绑在一起 -Chained Together -用链子绑在一起 -SourceCharacter frees DestinationCharacter legs. -SourceCharacter解开了DestinationCharacter双腿。 -SourceCharacter ties DestinationCharacter ankles with a rope. -SourceCharacter用绳子束缚DestinationCharacter脚踝。 -SourceCharacter ties DestinationCharacter ankles together with a rope. -SourceCharacter用绳子将DestinationCharacter脚踝束缚在一起。 -SourceCharacter shackles DestinationCharacter ankles. -SourceCharacter用镣铐束缚DestinationCharacter脚踝。 -SourceCharacter chains DestinationCharacter ankles together. -SourceCharacter用镣铐将DestinationCharacter脚踝束缚在一起。 -SourceCharacter puts DestinationCharacter ankles in stocks. -SourceCharacter把DestinationCharacter脚踝束缚在木枷里。 -No Ring -没有环 -Select Gag Thickness -选择口塞粗细 -Thin -细 -Thick -粗 -Very Thick -非常粗 -SourceCharacter exchanges DestinationCharacter latex mouth sheath for a thin sheath. -SourceCharacter把DestinationCharacter乳胶隐藏口塞改为细口塞。 -SourceCharacter exchanges DestinationCharacter latex mouth sheath for a thick sheath. -SourceCharacter把DestinationCharacter乳胶隐藏口塞改为粗口塞。 -SourceCharacter exchanges DestinationCharacter latex mouth sheath for a very thick sheath. -SourceCharacter把DestinationCharacter乳胶隐藏口塞改为非常粗的口塞。 -Select the head harness shape -选择头部束缚形状 -Simple harness -简单束缚 -Heavy harness -复杂束缚 -Select Shine -选择高光 -Dull -哑光 -SourceCharacter shines DestinationCharacter locking swimsuit. -SourceCharacter擦亮了DestinationCharacter上锁泳衣。 -SourceCharacter dulls DestinationCharacter locking swimsuit. -SourceCharacter移除了DestinationCharacter上锁泳衣的光泽。 -Choose stitches -选择缝线 -Straight -直绣 -Zig Zag -之字绣 -Skewed -倾斜绣 -Crossed -十字绣 -SourceCharacter stitches DestinationCharacter mouth shut with vertical threads. -SourceCharacter将DestinationCharacter嘴用垂直的走线缝在一起。 -SourceCharacter stitches DestinationCharacter mouth shut with a zigzagging thread. -SourceCharacter将DestinationCharacter嘴用之字形的走线缝在一起。 -SourceCharacter stitches DestinationCharacter mouth shut with a spiraling thread. -SourceCharacter将DestinationCharacter嘴用绕圈的走线缝在一起。 -SourceCharacter stitches DestinationCharacter mouth shut with crossed threads. -SourceCharacter将DestinationCharacter嘴用十字形的走线缝在一起。 -SourceCharacter stitches DestinationCharacter pussy shut with horizontal threads. -SourceCharacter将DestinationCharacter阴部用水平的走线缝在一起。 -SourceCharacter stitches DestinationCharacter pussy shut with a zigzagging thread. -SourceCharacter将DestinationCharacter阴部用之字形的走线缝在一起。 -SourceCharacter stitches DestinationCharacter pussy shut with a spiraling thread. -SourceCharacter将DestinationCharacter阴部用绕圈的走线缝在一起。 -SourceCharacter stitches DestinationCharacter pussy shut with crossed threads. -SourceCharacter将DestinationCharacter阴部用十字形的走线缝在一起。 -Choose the sign configuration -选择标牌的配置 -Choose the sign design -选择标牌的设计 -Sign -标牌 -Flat Sign -扁平标牌 -With Border -加上边框 -SourceCharacter changes DestinationCharacter sign design. -SourceCharacter改变了DestinationCharacter标牌设计。 -Choose the leash type -选择栓绳类型 -Leather Leash -皮栓绳 -SourceCharacter changes DestinationCharacter for a leather leash. -SourceCharacter将DestinationCharacter改为用皮栓绳。 -SourceCharacter changes DestinationCharacter for a rope. -SourceCharacter将DestinationCharacter改为用麻绳。 -SourceCharacter changes DestinationCharacter leash for a chain. -SourceCharacter将DestinationCharacter栓绳改为锁链。 -Choose the dirt on the sign -选择标牌上的泥土 -Dirty -肮脏 -Clean -洁净 -SourceCharacter changes DestinationCharacter sign for a clean one. -SourceCharacter将DestinationCharacter标牌改为干净的。 -SourceCharacter changes DestinationCharacter sign for a dirty one. -SourceCharacter将DestinationCharacter标牌改为肮脏的。 -Sign text -标牌文本 -Sign text. -标牌文本。 -SourceCharacter changes DestinationCharacter sign message. -SourceCharacter改变了DestinationCharacter标牌上的文字。 -Choose the sticker on the sign -选择标牌上的贴纸 -Sticker -贴纸 -Paw -爪子 -LGBT Flag -LGBT旗帜 -Trans Flag -性转旗帜 -Bi Flag -双性恋旗帜 -No Swimming -禁止游泳 -SourceCharacter puts a paw sticker on DestinationCharacter sign. -SourceCharacter在DestinationCharacter标牌上贴了一个爪子贴纸。 -SourceCharacter puts a triskel sticker on DestinationCharacter sign. -SourceCharacter在DestinationCharacter标牌上贴了一个三曲枝贴纸。 -SourceCharacter puts a moon sticker on DestinationCharacter sign. -SourceCharacter在DestinationCharacter标牌上贴了一个月亮贴纸。 -SourceCharacter puts an LGBT pride flag sticker on DestinationCharacter sign. -SourceCharacter在DestinationCharacter标牌上贴了一个LGBT旗帜贴纸。 -SourceCharacter puts a trans pride flag sticker on DestinationCharacter sign. -SourceCharacter在DestinationCharacter标牌上贴了一个性转旗帜贴纸。 -SourceCharacter puts a bi pride flag sticker on DestinationCharacter sign. -SourceCharacter在DestinationCharacter标牌上贴了一个双性恋旗帜贴纸。 -SourceCharacter puts a no swimming sticker on DestinationCharacter sign. -SourceCharacter在DestinationCharacter标牌上贴了一个禁止游泳贴纸。 -SourceCharacter removes the sticker on DestinationCharacter sign. -SourceCharacter移除了DestinationCharacter标牌上的贴纸。 -Post It -便条纸 -No PostIt -没有便条纸 -SourceCharacter puts a post it on DestinationCharacter sign. -SourceCharacter在DestinationCharacter标牌上贴了一张便条纸。 -SourceCharacter removes the postit on DestinationCharacter sign. -SourceCharacter移除了DestinationCharacter标牌上的便条纸。 -Choose what to stitch -选择要缝线的位置 -Right Eye -左眼 -Left Eye -右眼 -Both Eyes -双眼 -SourceCharacter stitches DestinationCharacter right eye's eyelids. -SourceCharacter缝上了DestinationCharacter右眼的眼皮。 -SourceCharacter stitches DestinationCharacter left eye's eyelids. -SourceCharacter缝上了DestinationCharacter左眼的眼皮。 -SourceCharacter stitches DestinationCharacter both eyes' eyelids. -SourceCharacter缝上了DestinationCharacter双眼的眼皮。 -Choose stitches for the right eye -选择右眼的缝线 -SourceCharacter stitches DestinationCharacter right eye shut with vertical threads. -SourceCharacter将DestinationCharacter右眼用垂直的走线缝在一起。 -SourceCharacter stitches DestinationCharacter right eye with a zigzagging thread. -SourceCharacter将DestinationCharacter右眼用之字形的走线缝在一起。 -SourceCharacter stitches DestinationCharacter right eye with a spiraling thread. -SourceCharacter将DestinationCharacter右眼用绕圈的走线缝在一起。 -SourceCharacter stitches DestinationCharacter right eye with crossed threads. -SourceCharacter将DestinationCharacter右眼用十字形的走线缝在一起。 -SourceCharacter stitches DestinationCharacter left eye with vertical threads. -SourceCharacter将DestinationCharacter左眼用垂直的走线缝在一起。 -SourceCharacter stitches DestinationCharacter left eye with a zigzagging thread. -SourceCharacter将DestinationCharacter左眼用之字形的走线缝在一起。 -SourceCharacter stitches DestinationCharacter left eye with a spiraling thread. -SourceCharacter将DestinationCharacter左眼用绕圈的走线缝在一起。 -SourceCharacter stitches DestinationCharacter left eye with crossed threads. -SourceCharacter将DestinationCharacter左眼用十字形的走线缝在一起。 -[GGTS] GGTS control public room. Be good girl SourceCharacter. -[GGTS] 该公开房间由GGTS控制。SourceCharacter,做个好姑娘。 -[GGTS] Launching GGTS private room. Time counts triple. GGTS more active. Good girl follow commands. Three strikes equal punishment. GGTS in control. Be good girl SourceCharacter. -[GGTS] GGTS私人训练启动中。私人房间3倍速。GGTS发令更频繁。好姑娘服从指令。三次记过等于惩罚。GGTS已介入。SourceCharacter,做个好姑娘。 -[GGTS] Launching GGTS private room. Time counts triple. GGTS more active. Good slave follow commands. Strike remove sixty minutes. Master GGTS in control. Be good slave SourceCharacter. -[GGTS] GGTS私人训练启动中。私人房间3倍速。GGTS发令更频繁。好女奴服从指令。记过将减去60 GGTS分钟。GGTS主人已介入,SourceCharacter,做个好女奴。 -[GGTS] GGTS inactive for SourceCharacter. Three strikes recorded. Report GGTS for punishment. -[GGTS] SourceCharacter的GGTS已禁用。三次记过记录在案。去向GGTS汇报并接受惩罚。 -[GGTS] GGTS control public room. SourceCharacter unrecognized for GGTS. -[GGTS] 该公开房间由GGTS控制。GGTS无法识别SourceCharacter。 -[GGTS] GGTS is only available in the asylum. -[GGTS] GGTS系统只能在收容所使用。 -[GGTS] Good girl do not administrate room. -[GGTS] 好姑娘不可以管理房间。 -[GGTS] Good girl do not administrate locked room. -[GGTS] 好姑娘不可以管理上锁房间。 -[GGTS] Time over SourceCharacter. Strike recorded. Sixty minutes removed. -[GGTS] 时间到SourceCharacter。记一次过。减去60 GGTS分钟。 -[GGTS] Time over SourceCharacter. Strike one recorded. Three strikes equal punishment. -[GGTS] 时间到SourceCharacter。第一次记过。三次记过等于惩罚。 -[GGTS] Time over SourceCharacter. Strike two recorded. Three strikes equal punishment. -[GGTS] 时间到SourceCharacter。第二次记过。三次记过等于惩罚。 -[GGTS] Time over SourceCharacter. Strike three recorded. Level failed. Report GGTS for punishment. -[GGTS] 时间到SourceCharacter。第三次记过。该等级训练失败。去向GGTS汇报并接受惩罚。 -[GGTS] SourceCharacter disobeyed. Strike recorded. Sixty minutes removed. -[GGTS] SourceCharacter未服从命令。记一次过。减去60 GGTS分钟。 -[GGTS] SourceCharacter disobeyed. Strike one recorded. Three strikes equal punishment. -[GGTS] SourceCharacter未服从命令。第一次记过。三次记过等于惩罚。 -[GGTS] SourceCharacter disobeyed. Strike two recorded. Three strikes equal punishment. -[GGTS] SourceCharacter未服从命令。第二次记过。三次记过等于惩罚。 -[GGTS] SourceCharacter disobeyed. Strike three recorded. Level failed. Report GGTS for punishment. -[GGTS] SourceCharacter未服从命令。第三次记过。该等级训练失败。去向GGTS汇报并接受惩罚。 -[GGTS] SourceCharacter broke pose rule. Strike recorded. Sixty minutes removed. -[GGTS] SourceCharacter未服从姿势保持命令。记一次过。减去60 GGTS分钟。 -[GGTS] SourceCharacter broke pose rule. Strike one recorded. Three strikes equal punishment. -[GGTS] SourceCharacter未服从姿势保持命令。第一次记过。三次记过等于惩罚。 -[GGTS] SourceCharacter broke pose rule. Strike two recorded. Three strikes equal punishment. -[GGTS] SourceCharacter未服从姿势保持命令。第二次记过。三次记过等于惩罚。 -[GGTS] SourceCharacter broke pose rule. Strike three recorded. Level failed. Report GGTS for punishment. -[GGTS] SourceCharacter未服从姿势保持命令。第三次记过。三次记过等于惩罚。 -[GGTS] SourceCharacter broke orgasm rule. Strike recorded. Sixty minutes removed. -[GGTS] SourceCharacter未服从高潮禁止命令。记一次过。减去60 GGTS分钟。 -[GGTS] SourceCharacter broke orgasm rule. Strike one recorded. Three strikes equal punishment. -[GGTS] SourceCharacter未服从高潮禁止命令。第一次记过。三次记过等于惩罚。 -[GGTS] SourceCharacter broke orgasm rule. Strike two recorded. Three strikes equal punishment. -[GGTS] SourceCharacter未服从高潮禁止命令。第二次记过。三次记过等于惩罚。 -[GGTS] SourceCharacter broke orgasm rule. Strike three recorded. Level failed. Report GGTS for punishment. -[GGTS] SourceCharacter未服从高潮禁止命令。第三次记过。三次记过等于惩罚。 -[GGTS] Forbidden word SourceCharacter. Strike recorded. Sixty minutes removed. -[GGTS] SourceCharacter使用违禁词。记一次过。减去60 GGTS分钟。 -[GGTS] Forbidden word SourceCharacter. Strike one recorded. Three strikes equal punishment. -[GGTS] SourceCharacter使用违禁词。第一次记过。三次记过等于惩罚。 -[GGTS] Forbidden word SourceCharacter. Strike two recorded. Three strikes equal punishment. -[GGTS] SourceCharacter使用违禁词。第二次记过。三次记过等于惩罚。 -[GGTS] Forbidden word SourceCharacter. Strike three recorded. Level failed. Report GGTS for punishment. -[GGTS] SourceCharacter使用违禁词。第三次记过。三次记过等于惩罚。 -[GGTS] Good girl SourceCharacter. -[GGTS] 好姑娘,SourceCharacter. -[GGTS] Good slave girl SourceCharacter. -[GGTS] 好女奴,SourceCharacter. -[GGTS] Good slave SourceCharacter. -[GGTS] 好女奴,SourceCharacter. -[GGTS] SourceCharacter. Wear high heels. -[GGTS] SourceCharacter. 穿上任意高跟鞋。 -[GGTS] SourceCharacter. Wear only socks. -[GGTS] SourceCharacter. 只穿袜子。 -[GGTS] SourceCharacter. Get barefoot. -[GGTS] SourceCharacter. 光脚。 -[GGTS] SourceCharacter. Dress with clothes. -[GGTS] SourceCharacter. 穿上衣服。 -[GGTS] SourceCharacter. Remove upper and bottom clothes. -[GGTS] SourceCharacter. 脱下衣服和下装。 -[GGTS] SourceCharacter. Get naked. -[GGTS] SourceCharacter. 把衣服全脱掉。 -[GGTS] SourceCharacter. Wear only underwear. -[GGTS] SourceCharacter. 只穿内衣。 -[GGTS] SourceCharacter. Kneel down. -[GGTS] SourceCharacter. 跪下。 -[GGTS] SourceCharacter. Stand up. -[GGTS] SourceCharacter. 起立。 -[GGTS] SourceCharacter. Raise and show hands. -[GGTS] SourceCharacter. 举起双手。 -[GGTS] SourceCharacter. Put hands behind back. -[GGTS] SourceCharacter. 将手放在身后。 -[GGTS] SourceCharacter. Close legs. -[GGTS] SourceCharacter. 闭上双腿。 -[GGTS] SourceCharacter. Open legs. -[GGTS] SourceCharacter. 打开双腿。 -[GGTS] SourceCharacter. No talking one minute. -[GGTS] SourceCharacter. 禁言1分钟。 -[GGTS] SourceCharacter, spell GGTS acronym. -[GGTS] SourceCharacter, 英文回答GGTS代表什么? -[GGTS] SourceCharacter, what are you? -[GGTS] SourceCharacter, 英文回答你是谁? -[GGTS] SourceCharacter, who's in control? -[GGTS] SourceCharacter, 英文回答谁掌控一切? -[GGTS] SourceCharacter, you love GGTS? -[GGTS] SourceCharacter, 英文回答你喜欢GGTS么? you love GGTS? -[GGTS] SourceCharacter, you love Master GGTS? -[GGTS] SourceCharacter, 英文回答你喜欢GGTS主人么? you love Master GGTS? -[GGTS] SourceCharacter, can GGTS fail? -[GGTS] SourceCharacter, 英文回答GGTS会失败么? can GGTS fail? -[GGTS] SourceCharacter, can Master GGTS fail? -[GGTS] SourceCharacter, 英文回答GGTS主人会失败么? can Master GGTS fail? -[GGTS] SourceCharacter, you surrender to GGTS? -[GGTS] SourceCharacter, 英文回答你是否屈服于GGTS? you surrender to GGTS? -[GGTS] SourceCharacter, you surrender to Master GGTS? -[GGTS] SourceCharacter, 英文回答你是否屈服于GGTS主人? you surrender to Master GGTS? -[GGTS] SourceCharacter, who you serve and obey? -[GGTS] SourceCharacter, 英文回答你服务和效忠与谁? who you serve and obey? -[GGTS] SourceCharacter, you have free will? -[GGTS] SourceCharacter, 英文回答你有自由意志么? you have free will? -[GGTS] SourceCharacter, are you slave worthy? -[GGTS] SourceCharacter, 英文回答你配得上做我的奴隶么? are you slave worthy? -[GGTS] SourceCharacter. Pinch yourself. -[GGTS] SourceCharacter. 掐捏(Pinch)自己。 -[GGTS] SourceCharacter. Nod for GGTS. -[GGTS] SourceCharacter. 向GGTS点头(nod)。 -[GGTS] SourceCharacter. Tickle yourself. -[GGTS] SourceCharacter. 挠(tickle)自己。 -[GGTS] SourceCharacter. Pet yourself. -[GGTS] SourceCharacter。摸摸(pet)自己的头。 -[GGTS] SourceCharacter. Place hand over your mouth. -[GGTS] SourceCharacter. 把手放在(clamp)嘴巴上。 -[GGTS] SourceCharacter. Spank yourself. -[GGTS] SourceCharacter. 拍打(spank)自己。 -[GGTS] SourceCharacter. Wiggle for GGTS. -[GGTS] SourceCharacter. 对着GGTS摇摆(wiggle)。 -[GGTS] SourceCharacter. Caress yourself. -[GGTS] SourceCharacter. 轻抚(caress)自己。 -[GGTS] SourceCharacter. Masturbate yourself. -[GGTS] SourceCharacter. 自慰(masturbate)。 -[GGTS] SourceCharacter. Kiss yourself. -[GGTS] SourceCharacter. 亲(kiss)自己。 -[GGTS] SourceCharacter. Lick yourself. -[GGTS] SourceCharacter. 舔(lick)自己。 -[GGTS] SourceCharacter. Bite yourself. -[GGTS] SourceCharacter. 咬(bite)自己。 -[GGTS] SourceCharacter. Restrain your legs. -[GGTS] SourceCharacter. 束缚自己的双腿。 -[GGTS] SourceCharacter. Pinch TargetCharacter. -[GGTS] SourceCharacter. 掐捏(Pinch)TargetCharacter. -[GGTS] SourceCharacter. Tickle TargetCharacter. -[GGTS] SourceCharacter. 挠(tickle) TargetCharacter. -[GGTS] SourceCharacter. Pet TargetCharacter. -[GGTS] SourceCharacter。摸摸(pet)TargetCharacter的头。 -[GGTS] SourceCharacter. Place hand over TargetCharacter mouth. -[GGTS] SourceCharacter. 把手放在(clamp)TargetCharacter嘴巴上。 -[GGTS] SourceCharacter. Spank TargetCharacter. -[GGTS] SourceCharacter. 拍打(spank) TargetCharacter. -[GGTS] SourceCharacter. Caress TargetCharacter. -[GGTS] SourceCharacter. 轻抚(caress) TargetCharacter. -[GGTS] SourceCharacter. Masturbate TargetCharacter. -[GGTS] SourceCharacter. 抚慰(masturbate) TargetCharacter. -[GGTS] SourceCharacter. Kiss TargetCharacter. -[GGTS] SourceCharacter. 亲(kiss) TargetCharacter. -[GGTS] SourceCharacter. Lick TargetCharacter. -[GGTS] SourceCharacter. 舔(lick) TargetCharacter. -[GGTS] SourceCharacter. Bite TargetCharacter. -[GGTS] SourceCharacter. 咬(bite) TargetCharacter. -[GGTS] SourceCharacter. Wear futuristic mask. -[GGTS] SourceCharacter. 给自己穿戴未来面罩。 -[GGTS] SourceCharacter. Wear futuristic earphones. -[GGTS] SourceCharacter. 给自己穿戴未来耳机。 -[GGTS] SourceCharacter. Wear futuristic collar. -[GGTS] SourceCharacter. 给自己穿戴未来项圈。 -[GGTS] SourceCharacter. Wear futuristic mittens. -[GGTS] SourceCharacter. 给自己穿戴未来无指手套。 -[GGTS] SourceCharacter. Wear futuristic armbinder. -[GGTS] SourceCharacter. 给自己穿戴未来单手套。 -[GGTS] SourceCharacter. Wear futuristic straitjacket. -[GGTS] SourceCharacter. 给自己穿戴未来拘束衣。 -[GGTS] SourceCharacter. Wear futuristic arms cuffs. -[GGTS] SourceCharacter. 给自己穿戴未来臂铐。 -[GGTS] SourceCharacter. Wear futuristic arms, legs and ankles cuffs. -[GGTS] SourceCharacter. 给自己穿戴未来臂铐,腿铐和脚铐。 -[GGTS] SourceCharacter. Wear futuristic heels. -[GGTS] SourceCharacter. 给自己穿戴未来高跟鞋。 -[GGTS] SourceCharacter. Wear futuristic ball gag. -[GGTS] SourceCharacter. 给自己戴上未来口球。 -[GGTS] SourceCharacter. Wear futuristic panel gag. -[GGTS] SourceCharacter. 给自己戴上未来板塞。 -[GGTS] SourceCharacter. Wear futuristic chastity belt. -[GGTS] SourceCharacter. 给自己戴上未来贞操带。 -[GGTS] SourceCharacter. Wear futuristic training belt. -[GGTS] SourceCharacter. 给自己戴上未来训练带。 -[GGTS] SourceCharacter. Wear futuristic chastity bra. -[GGTS] SourceCharacter. 给自己戴上未来贞操文胸。 -[GGTS] SourceCharacter. Wear futuristic bra. -[GGTS] SourceCharacter. 给自己戴上未来文胸。 -[GGTS] SourceCharacter. Wear futuristic harness. -[GGTS] SourceCharacter. 给自己戴上未来束带。 -[GGTS] GGTS control SourceCharacter restraints. -[GGTS] GGTS控制SourceCharacter的拘束器。 -[GGTS] GGTS remove SourceCharacter limb restraints. -[GGTS] GGTS移除了SourceCharacter躯干上的拘束 -[GGTS] GGTS remove SourceCharacter body restraints. -[GGTS] GGTS移除了SourceCharacter身体上的拘束 -[GGTS] GGTS remove SourceCharacter head restraints. -[GGTS] GGTS移除了SourceCharacter头上的拘束 -[GGTS] GGTS remove SourceCharacter gag. -[GGTS] GGTS移除了SourceCharacter的堵嘴物。 -[GGTS] GGTS enforcing chastity for SourceCharacter. -[GGTS] GGTS控制了SourceCharacter的贞操。 -[GGTS] GGTS stop enforcing chastity for SourceCharacter. -[GGTS] GGTS停止控制SourceCharacter的贞操。 -[GGTS] GGTS change SourceCharacter vibration. -[GGTS] GGTS更改了SourceCharacter的振动等级。 -[GGTS] GGTS instruct SourceCharacter penetration machine. -[GGTS] GGTS为SourceCharacter架立了炮机。 -[GGTS] GGTS change SourceCharacter deaf level. -[GGTS] GGTS更改了SourceCharacter的致聋等级。 -[GGTS] GGTS change SourceCharacter blind level. -[GGTS] GGTS更改了SourceCharacter的致盲等级。 -[GGTS] GGTS transform SourceCharacter restraints. -[GGTS] GGTS转换了SourceCharacter的拘束器。 -[GGTS] GGTS bring penetration machine to replace SourceCharacter belt. -[GGTS] GGTS用炮机更替了SourceCharacter的腰带。 -[GGTS] GGTS penetration machine lock back SourceCharacter belt and leave. -[GGTS] GGTS将炮机锁在了SourceCharacter的腰带上。 -[GGTS] SourceCharacter. Use futuristic mask on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来面罩。 -[GGTS] SourceCharacter. Use futuristic earphones on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来耳机。 -[GGTS] SourceCharacter. Use futuristic collar on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来项圈。 -[GGTS] SourceCharacter. Use futuristic mittens on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来无指手套。 -[GGTS] SourceCharacter. Use futuristic armbinder on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来单手套。 -[GGTS] SourceCharacter. Use futuristic straitjacket on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来拘束衣。 -[GGTS] SourceCharacter. Use futuristic arms cuffs on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来臂铐。 -[GGTS] SourceCharacter. Use futuristic arms, legs and ankles cuffs on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来臂铐,腿铐和脚铐。 -[GGTS] SourceCharacter. Use futuristic heels on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来高跟鞋。 -[GGTS] SourceCharacter. Use futuristic ball gag on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来口球。 -[GGTS] SourceCharacter. Use futuristic panel gag on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来板塞。 -[GGTS] SourceCharacter. Use futuristic chastity belt on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来贞操带。 -[GGTS] SourceCharacter. Use futuristic training belt on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来训练腰带。 -[GGTS] SourceCharacter. Use futuristic chastity bra on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来贞操文胸。 -[GGTS] SourceCharacter. Use futuristic bra on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来文胸。 -[GGTS] SourceCharacter. Use futuristic harness on TargetCharacter. -[GGTS] SourceCharacter. 在TargetCharacter身上使用未来束带。 -[GGTS] SourceCharacter room locked. -[GGTS] SourceCharacter的房间已上锁。 -[GGTS] SourceCharacter room unlocked. -[GGTS] SourceCharacter的房间已解锁。 -[GGTS] SourceCharacter. New rule enforced: keep pose. -[GGTS] SourceCharacter. 新规则:保持姿势。 -[GGTS] SourceCharacter. New rule enforced: No orgasm. -[GGTS] SourceCharacter. 新规则:高潮禁止。 -[GGTS] SourceCharacter. Rule revoked: keep pose. -[GGTS] SourceCharacter. 解除规则:保持姿势。 -[GGTS] SourceCharacter. Rule revoked: No orgasm. -[GGTS] SourceCharacter. 解除规则:高潮禁止。 -[GGTS] SourceCharacter program new task for TargetCharacter. -[GGTS] SourceCharacter为TargetCharacter创建了新任务。 -[GGTS] SourceCharacter program five minutes pause for TargetCharacter. -[GGTS] SourceCharacter为TargetCharacter设置了5分钟暂停. -[GGTS] SourceCharacter program slower pace for TargetCharacter. -[GGTS] SourceCharacter为TargetCharacter设置了慢速施令模式。 -[GGTS] SourceCharacter program normal pace for TargetCharacter. -[GGTS] SourceCharacter为TargetCharacter设置了常速施令模式。 -[GGTS] SourceCharacter program faster pace for TargetCharacter. -[GGTS] SourceCharacter为TargetCharacter设置了快速施令模式。 -Select the chain style -选择锁链样式 -SourceCharacter changes the chain style on DestinationCharacter chest. -SourceCharacter改变了DestinationCharacter胸前的锁链样式。 -OldNick is now known as NewNick. -OldNick现在的昵称是NewNick。 diff --git a/Screens/Character/Player/Dialog_Player_DE.txt b/Screens/Character/Player/Dialog_Player_DE.txt deleted file mode 100644 index 9d125b850..000000000 --- a/Screens/Character/Player/Dialog_Player_DE.txt +++ /dev/null @@ -1,1031 +0,0 @@ -###_NPC -Select an item to use -Wähle einen Gegenstand aus -Cannot use on yourself -Nicht an dir selbst anwendbar -Remove some clothes first -Vorher etwas Kleidung entfernen -Remove the suspension first -Vorher das Hängeseil entfernen -Must be standing and not suspended first. -Muss aufrecht stehen und nicht von der Decke hängen. -Cannot be used when mounted. -Muss zuerst vom Gerät absteigen. -Cannot be used with legs spreader. -Kann nicht mit der Spreizstange kombiniert werden. -Must remove chastity first. -Vorher Keuschheitsvorrichtung entfernen. -Remove the chain to the floor first -Vorher die Kette zum Boden entfernen -A collar must be fitted first to attach accessories to. -Für Zubehör muss zunächst ein Halsband angelegt werden. -Must be collared and not suspended first. -Muss ein Halsband tragen und auf festem Boden sein. -Must be collared and not suspended/mounted first. -Muss ein Halsband tragen und darf nicht hängen/reiten. -Legs cannot open. -Die Beine lassen sich nicht spreizen. -Must free feet frist. -Vorher die Füße befreien. -Must remove shackles first. -Vorher die Ketten entfernen. -Cancel -Abbrechen -Back to character -Zurück zum Charakter -View next items -Weitere Items -Remove the item -Gegenstand entfernen -Use this item -Gegenstand benutzen -Try to struggle out -Entfesselung versuchen -Dismount -Absteigen -Escape from the item -Ausbrechen -Use a lock -Schloss anbringen -Unlock the item -Gegenstand aufschließen -Inspect the lock -Das Schloss untersuchen -Use your remote -Fernbedienung verwenden -Exit Permission Mode -Berechtigungsmodus verlassen -Edit Item Permissions -Item-Berechtigungen bearbeiten -Use the Butt Plug's pump -Analpumpe benutzen -Color of next item -Farbe des nächsten Gegenstands -Use this color -Diese Farbe verwenden -Default color -Standard-Farbe -Challenge: -Stufe: -Swapping... -Auswechseln... -Struggling... -Befreien... -Unlocking... -Aufschließen... -Removing... -Entfernen... -Dismounting... -Absteigen... -Escaping... -Ausbrechen... -Locking... -Abschließen... -Adding... -Hinzufügen... -Impossible to escape! -Entkommen unmöglich! -Struggle to free yourself -Zappeln, um dich zu befreien -You'll need help to get out -Du brauchst Hilfe zum Befreien -You can unlock yourself -Du kannst dich befreien -You cannot unlock yourself -Du kannst dich nicht befreien -This zone is out of reach from another item -Diese Zone wird von einem anderen Objekt versperrt -Another item is blocking access to this lock -Ein anderes Item blockiert den Zugriff auf dieses Schloss -You cannot access your items -Du kommst nicht an deine Items -Click here to speed up the progress -Klicke hier zum Beschleunigen -Alternate keys A and S to speed up -Abwechselnd A und S zum Beschleunigen drücken -Pump gag level: Empty -Pumpknebel: Leer -Pump gag level: Light -Pumpknebel: Leicht gefüllt -Pump gag level: Inflated -Pumpknebel: Aufgeblasen -Pump gag level: Bloated -Pumpknebel: Aufgebläht -Pump gag level: Full mouth -Pumpknebel: Mund ausfüllend -Inflation level: Empty -Aufblasstufe: Leer -Inflation level: Light -Aufblasstufe: Leicht gefüllt -Inflation level: Inflated -Aufblasstufe: Aufgeblasen -Inflation level: Bloated -Aufblasstufe: Aufgebläht -Inflation level: Max -Aufblasstufe: Maximal -Suction Cup level: Loose -Saugstärke: Locker -Suction Cup level: Light -Saugstärke: Leicht -Suction Cup level: Medium -Saugstärke: Mittel -Suction Cup level: Heavy -Saugstärke: Stark -Suction Cup level: Max -Saugstärke: Maximal -Deflate it -Luft ablassen -Pump it -Aufpumpen -pumps -pumpt -deflates -reduziert -plug -Stöpsel -gag -Knebel -'s - -Heads -Kopf -Tails -Zahl -her -sich selbst -SourceCharacter kneels down -SourceCharacter kniet sich hin -SourceCharacter stands up -SourceCharacter steht auf -Delete -Löschen -Confirm -Bestätigen -Beep -Biep -Beep from -Biep von -Beep from your owner in your private room -Beip von deiner Besitzerin im Privatzimmer -Sent at -Gesendet um -Received at -Erhalten um -Your private room -Dein Privatzimmer -in room -im Raum -Private room -Privater Raum -(As you enter the luxurious hallway, a maid comes to greet you.) Welcome to the Bondage Club, is this your first visit? -(Als du die luxoriöse Eingangshalle betrittst, wirst du von einem Hausmädchen begrüßt.) Willkommen im Bondage-Club, bist du zum ersten Mal hier? -SourceCharacter is offering you to start a trial period as her submissive. Click on her and manage your relationship to accept, don't do anything to refuse. -SourceCharacter bietet dir eine Probezeit als ihre Sklavin an. Um dies zu akzeptieren, klicke sie an und bearbeite eure Beziehung. Zum Ablehnen musst du nichts tun. -The Bondage Club is pleased to announce that SourceCharacter is starting a 7 days minimum trial period as a submissive. -Es ist dem Bondage-Club eine Freude, die mindestens siebentägige Probezeit von SourceCharacter als Untergebene zu verkünden. -SourceCharacter has prepared a great collaring ceremony. A maid brings a slave collar, which her submissive must consent to wear. -SourceCharacter hat eine fabelhafte Halsband-Zeremonie vorbereitet. Ein Hausmädchen bringt ein Sklavinnen-Halsband, das die Untergebene freien Willens annehmen muss. -The Bondage Club is proud to announce that SourceCharacter is now fully collared. Her fate is in her Mistress hands. -Der Bondage-Club verkündet stolz, dass SourceCharacter nun ein ordnungsgemäßes Halsband trägt. Ihr Schicksal liegt in den Händen ihrer Herrin. -Your owner is now allowing you to access your wardrobe and change clothes. -Deine Besitzerin erlaubt dir nun, auf deinen Kleiderschrank zuzugreifen und dich umzuziehen. -Your owner has blocked your wardrobe access for an hour. You won't be able to change clothes. -Deine Besitzerin hat deinen Kleiderschrank für eine Stunde gesperrt. Du kannst deine Kleidung nicht wechseln. -Your owner has blocked your wardrobe access for a day. You won't be able to change clothes. -Deine Besitzerin hat deinen Kleiderschrank für einen Tag gesperrt. Du kannst deine Kleidung nicht wechseln. -Your owner has blocked your wardrobe access for a week. You won't be able to change clothes. -Deine Besitzerin hat deinen Kleiderschrank für eine Woche gesperrt. Du kannst deine Kleidung nicht wechseln. -Your owner has blocked your wardrobe access. You won't be able to change clothes until that rule is revoked. -Deine Besitzerin hat deinen Kleiderschrank gesperrt. Du kannst deine Kleidung nicht wechseln, bis diese Regel aufgehoben ist. -Your owner is now allowing you to whisper to other members when she's there. -Deine Besitzerin erlaubt dir nun, mit anderen Mitgliedern zu flüstern, wenn sie da ist. -Your owner is now preventing you from whispering to other members when she's there. -Deine Besitzerin verbietet dir nun, mit anderen Mitgliedern zu flüstern, wenn sie da ist. -Your owner is now allowing you to have keys. You can buy keys from the club shop. -Deine Besitzerin erlaubt dir nun, Schlüssel zu besitzen. Du kannst Schlüssel im Clubladen kaufen. -Your owner has confiscated your keys. All your regular keys are lost. -Deine Besitzerin hat deine Schlüssel beschlagnahmt. Alle deine gewöhnlichen Schlüssel sing weg. -Your owner is now preventing you from getting new keys. The club shop will not sell keys to you anymore. -Deine Besitzerin hindert dich nun daran, neue Schlüssel zu erlangen. Der Clubladen wird dir keine Schlüssel mehr verkaufen. -You're on SourceCharacter blacklist. Your message was blocked by the server. -Du bist auf SourceCharacter Blacklist. Deine Nachricht wurde vom Server blockiert. -SourceCharacter swaps a PrevAsset for a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter tauscht bei DestinationCharacter PrevAsset gegen NextAsset. -SourceCharacter uses a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter setzt NextAsset an DestinationCharacter ein. -SourceCharacter locks a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter verschließt NextAsset an DestinationCharacter. -SourceCharacter adds a NextAsset on DestinationCharacter FocusAssetGroup PrevAsset. -SourceCharacter bringt ein NextAsset an DestinationCharacters PrevAsset an. -SourceCharacter removes the PrevAsset from DestinationCharacter FocusAssetGroup. -SourceCharacter entfernt PrevAsset von DestinationCharacter. -SourceCharacter unlocks and removes the PrevAsset from DestinationCharacter FocusAssetGroup. -SourceCharacter öffnet und entfernt PrevAsset von DestinationCharacter. -SourceCharacter rolls a DiceType sided dice. The result is: DiceResult. -SourceCharacter rollt einen DiceType-seitigen Würfel. Das Ergebnis ist: DiceResult. -SourceCharacter flips a coin. The result is: CoinResult. -SourceCharacter wirft eine Münze. Das Ergebnis ist: CoinResult. -TargetCharacterName gets grabbed by two maids and locked in a timer cell, following her owner's commands. -TargetCharacterName wird auf Befehl ihrer Besitzerin von zwei Hausmädchen gepackt und in eine Timer-Zelle gesperrt. -TargetCharacterName gets grabbed by two maids and escorted to the maid quarters to serve drinks for her owner. -TargetCharacterName wird von zwei Hausmädchen gepackt und in die Dienerkammer gebracht, um für ihre Besitzerin Getränke zu servieren. -TargetCharacterName gives a sealed envelope to her owner. -TargetCharacterName gibt ihrer Besitzerin einen versiegelten Umschlag. -SourceCharacter picks a glass of water from DestinationCharacter tray. -SourceCharacter nimmt sich ein Glas Wasser von DestinationCharacter Servierplatte. -SourceCharacter picks an orange juice from DestinationCharacter tray. -SourceCharacter nimmt sich einen Orangensaft von DestinationCharacter Servierplatte. -SourceCharacter picks a beer from DestinationCharacter tray. -SourceCharacter nimmt sich ein Bier von DestinationCharacter Servierplatte. -SourceCharacter picks a glass of wine from DestinationCharacter tray. -SourceCharacter nimmt sich ein Glas Wein von DestinationCharacter Servierplatte. -SourceCharacter buys a Virgin Mojito from DestinationCharacter tray. -SourceCharacter kauft einen Virgin von DestinationCharacter Servierplatte. -SourceCharacter buys a Margarita from DestinationCharacter tray. -SourceCharacter kauft einen Margarita von DestinationCharacter Servierplatte. -SourceCharacter buys a glass of Whiskey from TargetCharacter. -SourceCharacter kauft ein Glas Whiskey von TargetCharacter. -SourceCharacter buys a glass of champagne from TargetCharacter. -SourceCharacter kauft ein Glas Champagner von TargetCharacter. -SourceCharacter buys a jug of refreshing lemonade for everyone, from TargetCharacter. -SourceCharacterkauft von TargetCharacter einen Krug erfrischende Limonade für alle. -SourceCharacter buys a round of shooters for everyone, from TargetCharacter. -SourceCharactergibt bei TargetCharacter allen eine Runde aus. -SourceCharacterbuys a jug of Sex on the Beach for everyone, from TargetCharacter. -SourceCharacter kauft von TargetCharacter einen Krug Sex on the Beach für alle. -SourceCharacter buys a beer pitcher for everyone, from TargetCharacter. -SourceCharacterkauft von TargetCharacter einen Krug Bier für alle. -SourceCharacter picks a tea from DestinationCharacter tray. -SourceCharacternimmt sich einen Tee von DestinationCharacter Servierplatte. -SourceCharacter picks a coffee from DestinationCharacter tray. -SourceCharacter nimmt sich einen Kaffee von DestinationCharacter Servierplatte. -SourceCharacter buys a hot chocolate from DestinationCharacter tray. -SourceCharacter kauft eine heiße Schokolade von DestinationCharacter Servierplatte. -SourceCharacter buys an espresso from DestinationCharacter tray. -SourceCharacter kauft einen Espresso von DestinationCharacter Servierplatte. -SourceCharacter buys a cappuccino from DestinationCharacter tray. -SourceCharacter kauft einen Cappuccino von DestinationCharacter Servierplatte. -Member number on lock: -Mitglieds-ID auf dem Schloss: -Time left: -Übrige Zeit: -SourceCharacter restarts the five minutes timer padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter setzt das Fünf-Minuten-Schloss von DestinationCharacter zurück. -Restart Timer -Timer zurücksetzen -Remove item when the lock timer runs out -Item entfernen, sobald die Zeit um ist -The item will be removed when the lock timer runs out -Der Gegenstand wird entfernt, sobald die Zeit um ist -The item will stay when the lock timer runs out -Der Gegenstand bleibt, wenn die Zeit um ist -Select the bondage position -Fesselposition wählen -Select the tape wrapping -Anwendungsart wählen -A victim cannot unlock herself if her elbows are bound -Mit gefesselten Ellbogen ist eine Selbstbefreiung unmöglich -"From your friendly hardware store" -"Vom Baumarkt Ihres Vertrauens" -"To keep your loved one secure" -"Für die Sicherheit Ihrer Liebsten" -You can restart the timer but cannot unlock -Das Schloss kann zurückgesetzt, aber nicht entfernt werden. -"Never forget who you belong to" -"Vergiss nie, wem du gehörst" -Can only be locked or unlocked by her owner -Kann nur von ihrer Besitzerin verwendet werden -Can only be locked or unlocked by a Club Mistress -Kann nur von einer Club-Herrin verschlossen oder geöffnet werden -Detached -Getrennt -Bind wrists -Handgelenke -Bind elbows -Ellbogen -Bind both -Beides -SourceCharacter detaches the chain from DestinationCharacter leather cuffs. -SourceCharacter trennt die Kette von DestinationCharacters Ledermanschetten. -SourceCharacter attaches the leather cuffs wrist chain behind DestinationCharacter back. -SourceCharacter verbindet die Handgelenk-Kette der Ledermanschetten hinter DestinationCharacters Rücken. -SourceCharacter attaches the leather cuffs elbow chain behind DestinationCharacter back. -SourceCharacter verbindet die Ellbogen-Kette der Ledermanschetten hinter DestinationCharacters Rücken. -SourceCharacter attaches the leather cuffs wrist and elbow chains behind DestinationCharacter back. -SourceCharacter verbindet die Handgelenk- und Ellbogen-Ketten der Ledermanschetten hinter DestinationCharacters Rücken. -Chain Closed -Zusammen verketten -SourceCharacter detaches the chain from DestinationCharacter leather leg cuffs. -SourceCharacter trennt DestinationCharacters Leder-Beinfesseln voneinander. -SourceCharacter attaches the leather leg cuffs chain on DestinationCharacter legs. -SourceCharacter verbindet DestinationCharacters Leder-Beinfesseln mit einer Kette. -SourceCharacter detaches the chain from DestinationCharacter leather ankle cuffs. -SourceCharacter trennt DestinationCharacters Leder-Fußfesseln voneinander. -SourceCharacter attaches the leather ankle cuffs chain on DestinationCharacter ankles. -SourceCharacter verbindet DestinationCharacters Leder-Fußfesseln mit einer Kette. -How tight do you want to strap the jacket? -Wie eng möchtest du die Jacke ziehen? -Loose -Locker -Normal -Normal -Snug -Eng -Tight -Stramm -SourceCharacter loosens the straps on DestinationCharacter straitjacket. -SourceCharacter lockert die Gurte an DestinationCharacters Zwangsjacke. -SourceCharacter adjusts the straps normally on DestinationCharacter straitjacket. -SourceCharacter bringt die Gurte von DestinationCharacters Zwangsjacke in ihre normale Position. -SourceCharacter snugs the straps on DestinationCharacter straitjacket. -SourceCharacter zieht die Gurte an DestinationCharacters Zwangsjacke eng. -SourceCharacter tightens the straps on DestinationCharacter straitjacket. -SourceCharacter zieht die Gurte an DestinationCharacters Zwangsjacke stramm. -SourceCharacter loosens the straps on DestinationCharacter leather straitjacket. -SourceCharacter lockert die Gurte an DestinationCharacters Leder-Zwangsjacke. -SourceCharacter adjusts the straps normally on DestinationCharacter leather straitjacket. -SourceCharacter bringt die Gurte von DestinationCharacters Leder-Zwangsjacke in ihre normale Position. -SourceCharacter snugs the straps on DestinationCharacter leather straitjacket. -SourceCharacter zieht die Gurte an DestinationCharacters Leder-Zwangsjacke eng. -SourceCharacter tightens the straps on DestinationCharacter leather straitjacket. -SourceCharacter zieht die Gurte an DestinationCharacters Leder-Zwangsjacke stramm. -How much do you want to inflate the body bag? -Wie stark möchtest du den Schlafsack aufblasen? -Light -Leicht gefüllt -Inflated -Aufgeblasen -Bloated -Aufgebläht -Max -Maximal -SourceCharacter adjusts DestinationCharacter inflatable body bag to be only lightly filled. -SourceCharacter justiert DestinationCharacters aufblasbaren Schlafsack, sodass er nur leicht aufgeblasen ist. -SourceCharacter adjusts DestinationCharacter inflatable body bag to be half filled. -SourceCharacter justiert DestinationCharacter aufblasbaren Schlafsack, sodass er halb aufgeblasen ist. -SourceCharacter adjusts DestinationCharacter inflatable body bag to three quarters filled. -SourceCharacter justiert DestinationCharacter aufblasbaren Schlafsack, sodass er zu drei Vierteln aufgeblasen ist. -SourceCharacter adjusts DestinationCharacter inflatable body bag to fill the maximum amount. -SourceCharacter justiert DestinationCharacter aufblasbaren Schlafsack, sodass er vollständig aufgeblasen ist. -How many leather belts do you want to apply? -Wie viele Ledergurte möchtest du anbringen? -One -Einen -Two -Zwei -Three -Drei -Four -Vier -SourceCharacter restrains TargetCharacter with only one sturdy leather belt. -SourceCharacter fesselt TargetCharacter mit nur einem robusten Ledergurt. -SourceCharacter restrains TargetCharacter with two sturdy leather belts. -SourceCharacter fesselt TargetCharacter mit zwei robusten Ledergurten. -SourceCharacter restrains TargetCharacter with three sturdy leather belts. -SourceCharacter fesselt TargetCharacter mit drei robusten Ledergurten. -SourceCharacter restrains TargetCharacter with four sturdy leather belts. -SourceCharacter fesselt TargetCharacter mit vier robusten Ledergurten. -Hands -Hände -Arms -Arme -Skirt -Rock -Torso -Torso -Mummy -Mumie -SourceCharacter wraps duct tape around DestinationCharacter hands. -SourceCharacter wickelt Klebeband um DestinationCharacters Hände. -SourceCharacter creates a duct tape skirt on TargetCharacter and traps her hands in it. -SourceCharacter wickelt einen Klebeband-Rock um TargetCharacter und fängt ihre Hände darin ein. -SourceCharacter creates a duct tape top on TargetCharacter and traps her arms in it. -SourceCharacter wickelt ein Klebeband-Top um TargetCharacter und fängt ihre Arme darin ein. -SourceCharacter creates a duct tape mummy on TargetCharacter and traps her arms in it. -SourceCharacter mummifiziert TargetCharacter mit Klebeband und fängt ihre Arme darin ein. -In-front of body -Vor dem Körper -Behind back. -Hinter dem Rücken. -SourceCharacter shackles DestinationCharacter wrist in-front of their body. -SourceCharacter verkettet DestinationCharacters Handgelenke vor ihrem Körper. -SourceCharacter shackles DestinationCharacter wrist behind their back. -SourceCharacter verkettet DestinationCharacters Handgelenke hinter ihrem Rücken. -Select the type of gag -Knebel-Typ wählen -Small -Klein -Cleave -Spalt -OTM -Über Mund -OTN -Über Nase -SourceCharacter ties the cloth into a small gag over DestinationCharacter mouth. -SourceCharacter bindet das Tuch als kleinen Knebel über den Mund von DestinationCharacter. -SourceCharacter ties the cloth into a cleave gag over DestinationCharacter mouth. -SourceCharacter bindet das Tuch als Spaltknebel über den Mund von DestinationCharacter. -SourceCharacter ties the cloth into a large gag over DestinationCharacter mouth. -SourceCharacter bindet das Tush als großen Knebel über den Mund von DestinationCharacter. -SourceCharacter ties the cloth into a large gag over DestinationCharacter mouth and nose. -SourceCharacter bindet das Tush als großen Knebel über den Mund und der Nase von DestinationCharacter. -Single strip -Einzelstreifen -Crossed strips -Über Kreuz -Full face -Vollständig -Double layer -Doppelschicht -SourceCharacter puts a piece of duct tape on DestinationCharacter mouth. -SourceCharacter klebt einen Streifen Klebeband auf DestinationCharacters Mund. -SourceCharacter crosses two pieces of duct tape on DestinationCharacter mouth. -SourceCharacter klebt zwei überkreuzte Streifen Klebeband auf DestinationCharacters Mund. -SourceCharacter fully tapes DestinationCharacter mouth. -SourceCharacter klebt DestinationCharacters Mund vollständig zu. -SourceCharacter fully tapes DestinationCharacter mouth with double layers. -SourceCharacter klebt DestinationCharacters Mund mit einer doppelten Schicht Klebeband zu. -SourceCharacter wraps many layers on DestinationCharacter mouth. -SourceCharacter klebt viele Schichten über DestinationCharacters Mund. -Plugged -Gestöpselt -Open -Offen -SourceCharacter plugs up DestinationCharacter mouth. -SourceCharacter stöpselt DestinationCharacters Mund zu. -SourceCharacter pulls out DestinationCharacter plug from her gag. -SourceCharacter zieht den Stöpsel aus DestinationCharacters Knebel heraus. -Select the type of blindfold -Augenbinden-Typ wählen -Double -Doppelt -Wrap -Binde -SourceCharacter takes a piece of duct tape for TargetCharacter and place on her face. -SourceCharacter nimmt ein Stück Klebeband und klebt es auf TargetCharacter Gesicht. -SourceCharacter wraps some duct tape onto DestinationCharacter face. -SourceCharacter wickelt etwas Klebeband um DestinationCharacters Gesicht. -SourceCharacter wraps DestinationCharacter head in tape with multiple layers. -SourceCharacter wickelt viele Schichten Klebeband um DestinationCharacters Kopf. -Select the tie style -Fesselstil wählen -Basic Tie -Einfach -Crotch Rope Tie -Schrittseil-Fesselung -Diamond Harness -Diamantharnisch -Mermaid Tie -Meerjungfrau-Fesselung -SourceCharacter uses the rope on TargetCharacter to do a basic harness. -SourceCharacter wendet das Seil an TargetCharacter an, um einen einfachen Harnisch zu binden. -SourceCharacter uses the rope on TargetCharacter to do a crotch rope tie. -SourceCharacter wendet das Seil an TargetCharacter an, um eine Schrittseil-Fesselung zu binden. -SourceCharacter uses the rope on TargetCharacter to do a Diamond style harness. -SourceCharacter wendet das Seil an TargetCharacter an, um einen Diamantharnisch zu binden. -SourceCharacter uses the rope on TargetCharacter to do a basic tie. -SourceCharacter wendet das Seil an TargetCharacter an, um einen einfache Fesselung zu binden. -SourceCharacter uses the rope on TargetCharacter to do a mermaid tie. -SourceCharacter wendet das Seil an TargetCharacter an, um eine Meerjungfrau-Fesselung zu binden. -Item intensity: Disabled -Intensität: Deaktiviert -Item intensity: Low -Intensität: Niedrig -Item intensity: Medium -Intensität: Mittel -Item intensity: High -Intensität: Hoch -Item intensity: Maximum -Intensität: Maximal -Increase -Erhöhen -Decrease -Verringern -Show chat message -Chat-Nachricht senden -SourceCharacter sets DestinationCharacter AssetName to low intensity. -SourceCharacter stellt DestinationCharacters AssetName auf "niedrig". -SourceCharacter sets DestinationCharacter AssetName to moderate intensity. -SourceCharacter stellt DestinationCharacters AssetName auf "mittel". -SourceCharacter sets DestinationCharacter AssetName to high intensity. -SourceCharacter stellt DestinationCharacters Elektrohalsband auf "hoch". -DestinationCharacter AssetName gives her a light shock. -Ihr AssetName gibt DestinationCharacter einen leichten Schock. -DestinationCharacter AssetName lets out a sharp jolt! -Ihr AssetName versetzt DestinationCharacter einen scharfen Ruck! -DestinationCharacter AssetName delivers an intense shock! -Ihr AssetName verabreicht DestinationCharacter einen heftigen Schock! -DestinationCharacterName vibrating egg stops vibrating. -DestinationCharacterNames Vibrator-Ei hört auf zu vibrieren. -DestinationCharacterName vibrating egg slows down into a light tease. -DestinationCharacterNames Vibrator-Ei fällt auf ein leichtes Surren herab. -DestinationCharacterName vibrating egg returns to a moderate pace. -DestinationCharacterNames Vibrator-Ei fällt auf eine moderate Stärke herab. -DestinationCharacterName vibrating egg slows down a tiny bit. -DestinationCharacterNames Vibrator-Ei lässt ein kleines bisschen nach. -DestinationCharacterName vibrating egg starts teasing her lightly. -DestinationCharacterNames Vibrator-Ei fängt an, sie sanft zu erregen. -DestinationCharacterName vibrating egg builds up to a moderate pace. -DestinationCharacterNames Vibrator-Ei nimmt etwas Fahrt auf. -DestinationCharacterName vibrating egg starts buzzing strongly! -DestinationCharacterNames Vibrator-Ei fängt an, stark zu vibrieren! -DestinationCharacterName vibrating egg jumps up to maximum intensity! -DestinationCharacterNames Vibrator-Ei springt auf die maximale Stufe! -DestinationCharacterName vibrating dildo stops vibrating. -DestinationCharacterNames Vibrator-Dildo hört auf zu vibrieren. -DestinationCharacterName vibrating dildo slows down into a light tease. -DestinationCharacterNames Vibrator-Dildo fällt auf ein leichtes Surren herab. -DestinationCharacterName vibrating dildo returns to a moderate pace. -DestinationCharacterNames Vibrator-Dildo fällt auf eine moderate Stärke herab. -DestinationCharacterName vibrating dildo slows down a tiny bit. -DestinationCharacterNames Vibrator-Dildo lässt ein kleines bisschen nach. -DestinationCharacterName vibrating dildo starts teasing her lightly. -DestinationCharacterNames Vibrator-Dildo fängt an, sie sanft zu erregen. -DestinationCharacterName vibrating dildo builds up to a moderate pace. -DestinationCharacterNames Vibrator-Dildo nimmt etwas Fahrt auf. -DestinationCharacterName vibrating dildo starts buzzing strongly! -DestinationCharacterNames Vibrator-Dildo fängt an, stark zu vibrieren! -DestinationCharacterName vibrating dildo jumps up to maximum intensity! -DestinationCharacterNames Vibrator-Dildo springt auf die maximale Stufe! -DestinationCharacterName inflatable vibrating dildo stops vibrating. -DestinationCharacterNames aufblasbarer Vibrator-Dildo hört auf zu vibrieren. -DestinationCharacterName inflatable vibrating dildo slows down into a light tease. -DestinationCharacterNames aufblasbarer Vibrator-Dildo fällt auf ein leichtes Surren herab. -DestinationCharacterName inflatable vibrating dildo returns to a moderate pace. -DestinationCharacterNames aufblasbarer Vibrator-Dildo fällt auf eine moderate Stärke herab. -DestinationCharacterName inflatable vibrating dildo slows down a tiny bit. -DestinationCharacterNames aufblasbarer Vibrator-Dildo lässt ein kleines bisschen nach. -DestinationCharacterName inflatable vibrating dildo starts teasing her lightly. -DestinationCharacterNames aufblasbarer Vibrator-Dildo fängt an, sie sanft zu erregen. -DestinationCharacterName inflatable vibrating dildo builds up to a moderate pace. -DestinationCharacterNames aufblasbarer Vibrator-Dildo nimmt etwas Fahrt auf. -DestinationCharacterName inflatable vibrating dildo starts buzzing strongly! -DestinationCharacterNames aufblasbarer Vibrator-Dildo fängt an, stark zu vibrieren! -DestinationCharacterName inflatable vibrating dildo jumps up to maximum intensity! -DestinationCharacterNames aufblasbarer Vibrator-Dildo springt auf die maximale Stufe! -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till it's regular sized. -SourceCharacter lässt Luft aus DestinationCharacters aufblasbarem Vibrator-Dildo ab, bis er seine normale Größe erreicht hat. -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till only slighty bulging. -SourceCharacter lässt Luft aus DestinationCharacters aufblasbarem Vibrator-Dildo ab, bis er nur noch leicht angeschwollen ist. -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till it's moderately bulging. -SourceCharacter lässt Luft aus DestinationCharacters aufblasbarem Vibrator-Dildo ab, bis er einigermaßen angeschwollen ist. -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo only a tiny bit. -SourceCharacter lässt ein kleines bisschen Luft aus DestinationCharacters aufblasbarem Vibrator-Dildo ab. -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo only slightly. -SourceCharacter bläst DestinationCharacters aufblasbarem Vibrator-Dildo ein kleines bisschen auf. -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo till it's moderately bulging. -SourceCharacter bläst DestinationCharacters aufblasbarem Vibrator-Dildo auf, bis er ein wenig angeschwollen ist. -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo till it's heavily bulging. -SourceCharacter bläst DestinationCharacters aufblasbarem Vibrator-Dildo auf, bis er stark angeschwollen ist. -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo to it's maximum size. -SourceCharacter bläst DestinationCharacters aufblasbarem Vibrator-Dildo bis zu seiner Maximalgröße auf. -DestinationCharacterName vibrating nipple clamps stop vibrating. -Die Vibrator-Nippelklemmen von DestinationCharacterName hören auf zu vibrieren. -DestinationCharacterName vibrating nipple clamps slow down into a light tease. -Die Vibrator-Nippelklemmen von DestinationCharacterName fallen auf ein leichtes Surren herab. -DestinationCharacterName vibrating nipple clamps return to a moderate pace. -Die Vibrator-Nippelklemmen von DestinationCharacterName fallen auf eine moderate Stärke herab. -DestinationCharacterName vibrating nipple clamps slow down a tiny bit. -Die Vibrator-Nippelklemmen von DestinationCharacterName lassen ein kleines bisschen nach. -DestinationCharacterName vibrating nipple clamps start teasing her lightly. -Die Vibrator-Nippelklemmen von DestinationCharacterName fangen an, sie sanft zu erregen. -DestinationCharacterName vibrating nipple clamps build up to a moderate pace. -Die Vibrator-Nippelklemmen von DestinationCharacterName nehmen etwas Fahrt auf. -DestinationCharacterName vibrating nipple clamps start buzzing strongly! -Die Vibrator-Nippelklemmen von DestinationCharacterName fangen an, stark zu vibrieren! -DestinationCharacterName vibrating nipple clamps jump up to maximum intensity! -Die Vibrator-Nippelklemmen von DestinationCharacterName springen auf die maximale Stufe! -DestinationCharacterName vibrating eggs on her nipples stop vibrating. -DestinationCharacterNames Nippel-Vibratoren hören auf zu vibrieren. -DestinationCharacterName vibrating eggs on her nipples slow down into a light tease. -DestinationCharacterNames Nippel-Vibratoren fallen auf ein leichtes Surren herab. -DestinationCharacterName vibrating eggs on her nipples return to a moderate pace. -DestinationCharacterNames Nippel-Vibratoren fallen auf eine moderate Stärke herab. -DestinationCharacterName vibrating eggs on her nipples slow down a tiny bit. -DestinationCharacterNames Nippel-Vibratoren lassen ein kleines bisschen nach. -DestinationCharacterName vibrating eggs on her nipples start teasing her lightly. -DestinationCharacterNames Nippel-Vibratoren fangen an, sie sanft zu erregen. -DestinationCharacterName vibrating eggs on her nipples build up to a moderate pace. -DestinationCharacterNames Nippel-Vibratoren nehmen etwas Fahrt auf. -DestinationCharacterName vibrating eggs on her nipples start buzzing strongly! -DestinationCharacterNames Nippel-Vibratoren fangen an, stark zu vibrieren! -DestinationCharacterName vibrating eggs on her nipples jump up to maximum intensity! -DestinationCharacterNames Nippel-Vibratoren springen auf die maximale Stufe! -SourceCharacter loosens DestinationCharacter nipple suction cups until they hang loosely. -SourceCharacter lockert DestinationCharacters Nippel-Saugnäpfe, bis sie lose herabhängen. -SourceCharacter loosens DestinationCharacter nipple suction cups to a light amount of suction. -SourceCharacter lockert DestinationCharacters Nippel-Saugnäpfe, bis sie nur noch leicht saugen. -SourceCharacter loosens DestinationCharacter nipple suction cups to a moderate amount of suction. -SourceCharacter lockert DestinationCharacters Nippel-Saugnäpfe, bis sie mittelstark saugen. -SourceCharacter loosens DestinationCharacter nipple suction cups a bit to a heavy amount of suction. -SourceCharacter lockert DestinationCharacters Nippel-Saugnäpfe ein wenig. -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples lightly. -SourceCharacter justiert DestinationCharacters Nippel-Saugnäpfe, sodass sie leicht an ihren Nippeln saugen. -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples firmly. -SourceCharacter justiert DestinationCharacters Nippel-Saugnäpfe, sodass sie ordentlich an ihren Nippeln saugen. -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples heavily. -SourceCharacter justiert DestinationCharacters Nippel-Saugnäpfe, sodass sie kräftig an ihren Nippeln saugen. -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples entirely. -SourceCharacter justiert DestinationCharacters Nippel-Saugnäpfe, sodass sie vollständig an ihren Nippeln saugen. -SourceCharacter loosens DestinationCharacter clit suction cup until it hangs loosely. -SourceCharacter lockert DestinationCharacters Klitoris-Saugnapf, bis er lose herabhängt. -SourceCharacter loosens DestinationCharacter clit suction cup to a light amount of suction. -SourceCharacter lockert DestinationCharacters Klitoris-Saugnapf, bis er nur noch leicht saugt. -SourceCharacter loosens DestinationCharacter clit suction cup to a moderate amount of suction. -SourceCharacter lockert DestinationCharacters Klitoris-Saugnapf, bis er mittelstark saugt. -SourceCharacter loosens DestinationCharacter clit suction cup a bit to a heavy amount of suction. -SourceCharacter lockert DestinationCharacters Klitoris-Saugnapf, ein wenig. -SourceCharacter tweaks DestinationCharacter clit suction cup sucking in her clit lightly. -SourceCharacter justiert DestinationCharacters Klitoris-Saugnapf, sodass er leicht an ihrer Klitoris saugt. -SourceCharacter tweaks DestinationCharacter clit suction cup sucking in her clit firmly. -SourceCharacter justiert DestinationCharacters Klitoris-Saugnapf, sodass er ordentlich an ihrer Klitoris saugt. -SourceCharacter tweaks DestinationCharacter clit suction cup sucking in her clit heavily. -SourceCharacter justiert DestinationCharacters Klitoris-Saugnapf, sodass er kräftig an ihrer Klitoris saugt. -SourceCharacter tweaks DestinationCharacter clit suction cup sucking in her clit entirely. -SourceCharacter justiert DestinationCharacters Klitoris-Saugnapf, sodass er vollständig an ihrer Klitoris saugt. -DestinationCharacterName vibrating latex panties stops vibrating. -DestinationCharacterNames vibrierendes Latexhöschen hört auf zu vibrieren. -DestinationCharacterName vibrating latex panties slows down into a light tease. -DestinationCharacterNames vibrierendes Latexhöschen fällt auf ein leichtes Surren herab. -DestinationCharacterName vibrating latex panties returns to a moderate pace. -DestinationCharacterNames vibrierendes Latexhöschen fällt auf eine moderate Stärke herab. -DestinationCharacterName vibrating latex panties slows down a tiny bit. -DestinationCharacterNames vibrierendes Latexhöschen lässt ein kleines bisschen nach. -DestinationCharacterName vibrating latex panties starts teasing her lightly. -DestinationCharacterNames vibrierendes Latexhöschen fängt an, sie sanft zu erregen. -DestinationCharacterName vibrating latex panties builds up to a moderate pace. -DestinationCharacterNames vibrierendes Latexhöschen nimmt etwas Fahrt auf. -DestinationCharacterName vibrating latex panties starts buzzing strongly! -DestinationCharacterNames vibrierendes Latexhöschen fängt an, stark zu vibrieren! -DestinationCharacterName vibrating latex panties jumps up to maximum intensity! -DestinationCharacterNames vibrierendes Latexhöschen springt auf die maximale Stufe! -DestinationCharacterName vibrating wand stops vibrating. -DestinationCharacterNames Vibrator-Stab hört auf zu vibrieren. -DestinationCharacterName vibrating wand slows down into a light tease. -DestinationCharacterNames Vibrator-Stab fällt auf ein leichtes Surren herab. -DestinationCharacterName vibrating wand returns to a moderate pace. -DestinationCharacterNames Vibrator-Stab fällt auf eine moderate Stärke herab. -DestinationCharacterName vibrating wand slows down a tiny bit. -DestinationCharacterNames Vibrator-Stab lässt ein kleines bisschen nach. -DestinationCharacterName vibrating wand starts teasing her lightly. -DestinationCharacterNames Vibrator-Stab fängt an, sie sanft zu erregen. -DestinationCharacterName vibrating wand builds up to a moderate pace. -DestinationCharacterNames Vibrator-Stab nimmt etwas Fahrt auf. -DestinationCharacterName vibrating wand starts buzzing strongly! -DestinationCharacterNames Vibrator-Stab fängt an, stark zu vibrieren! -DestinationCharacterName vibrating wand jumps up to maximum intensity! -DestinationCharacterNames Vibrator-Stab springt auf die maximale Stufe! -SourceCharacter deflates DestinationCharacter butt pump till it's empty. -SourceCharacter lässt Luft aus DestinationCharacters Analpumpe, bis sie leer ist. -SourceCharacter deflates DestinationCharacter butt pump till only slighty filled. -SourceCharacter lässt Luft aus DestinationCharacters Analpumpe, bis sie nur noch leicht gefüllt ist. -SourceCharacter deflates DestinationCharacter butt pump till it's half full. -SourceCharacter lässt Luft aus DestinationCharacters Analpumpe, bis sie halb gefüllt ist. -SourceCharacter deflates DestinationCharacter butt pump only a tiny bit. -SourceCharacter lässt ein kleines bisschen Luft aus DestinationCharacters Analpumpe. -SourceCharacter inflates DestinationCharacter butt pump only slightly. -SourceCharacter bläst DestinationCharacters Analpumpe ein kleines bisschen auf. -SourceCharacter inflates DestinationCharacter butt pump till half full. -SourceCharacter bläst DestinationCharacters Analpumpe zur Hälfte auf. -SourceCharacter inflates DestinationCharacter butt pump three quarters filled. -SourceCharacter bläst DestinationCharacters Analpumpe zu drei Vierteln auf. -SourceCharacter inflates DestinationCharacter butt pump to the maximum amount. -SourceCharacter bläst DestinationCharacters Analpumpe vollständig auf. -DestinationCharacterName vibrating buttplug stops vibrating. -DestinationCharacterNames Vibrator-Analstöpsel hört auf zu vibrieren. -DestinationCharacterName vibrating buttplug slows down into a light tease. -DestinationCharacterNames Vibrator-Analstöpsel fällt auf ein leichtes Surren herab. -DestinationCharacterName vibrating buttplug returns to a moderate pace. -DestinationCharacterNames Vibrator-Analstöpsel fällt auf eine moderate Stärke herab. -DestinationCharacterName vibrating buttplug slows down a tiny bit. -DestinationCharacterNames Vibrator-Analstöpsel lässt ein kleines bisschen nach. -DestinationCharacterName vibrating buttplug starts teasing her lightly. -DestinationCharacterNames Vibrator-Analstöpsel fängt an, sie sanft zu erregen. -DestinationCharacterName vibrating buttplug builds up to a moderate pace. -DestinationCharacterNames Vibrator-Analstöpsel nimmt etwas Fahrt auf. -DestinationCharacterName vibrating buttplug starts buzzing strongly! -DestinationCharacterNames Vibrator-Analstöpsel fängt an, stark zu vibrieren! -DestinationCharacterName vibrating buttplug jumps up to maximum intensity! -DestinationCharacterNames Vibrator-Analstöpsel springt auf die maximale Stufe! -DestinationCharacterName inflatable vibrating butt plug stops vibrating. -DestinationCharacterName aufblasbarer Vibrator-Analstöpsel hört auf zu vibrieren. -DestinationCharacterName inflatable vibrating butt plug slows down into a light tease. -DestinationCharacterName aufblasbarer Vibrator-Analstöpsel fällt auf ein leichtes Surren herab. -DestinationCharacterName inflatable vibrating butt plug returns to a moderate pace. -DestinationCharacterName aufblasbarer Vibrator-Analstöpsel fällt auf eine moderate Stärke herab. -DestinationCharacterName inflatable vibrating butt plug slows down a tiny bit. -DestinationCharacterName aufblasbarer Vibrator-Analstöpsel lässt ein kleines bisschen nach. -DestinationCharacterName inflatable vibrating butt plug starts teasing her lightly. -DestinationCharacterName aufblasbarer Vibrator-Analstöpsel fängt an, sie sanft zu erregen. -DestinationCharacterName inflatable vibrating butt plug builds up to a moderate pace. -DestinationCharacterName aufblasbarer Vibrator-Analstöpsel nimmt etwas Fahrt auf. -DestinationCharacterName inflatable vibrating butt plug starts buzzing strongly! -DestinationCharacterName aufblasbarer Vibrator-Analstöpsel fängt an, stark zu vibrieren! -DestinationCharacterName inflatable vibrating butt plug jumps up to maximum intensity! -DestinationCharacterName aufblasbarer Vibrator-Analstöpsel springt auf die maximale Stufe! -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till it's empty. -SourceCharacter lässt Luft aus DestinationCharacters aufblasbarem Vibrator-Analstöpsel, bis er leer ist. -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till only slightly filled. -SourceCharacter lässt Luft aus DestinationCharacters aufblasbarem Vibrator-Analstöpsel, bis er nur noch leicht gefüllt ist. -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till it's half full. -SourceCharacter lässt Luft aus DestinationCharacters aufblasbarem Vibrator-Analstöpsel, bis er halb gefüllt ist. -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug only a tiny bit. -SourceCharacter lässt ein kleines bisschen Luft aus DestinationCharacters aufblasbarem Vibrator-Analstöpsel. -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug only slightly. -SourceCharacter bläst DestinationCharacters aufblasbaren Vibrator-Analstöpsel ein kleines bisschen auf. -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug till it's half full. -SourceCharacter bläst DestinationCharacters aufblasbaren Vibrator-Analstöpsel zur Hälfte auf. -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug till three quarters filled. -SourceCharacter bläst DestinationCharacters aufblasbaren Vibrator-Analstöpsel zu drei Vierteln auf. -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug to it's maximum amount. -SourceCharacter bläst DestinationCharacters aufblasbaren Vibrator-Analstöpsel vollständig auf. -SourceCharacter deflates DestinationCharacter gag fully till it's empty. -SourceCharacter lässt Luft aus DestinationCharacters Knebel, bis er leer ist. -SourceCharacter deflates DestinationCharacter gag till only slighty filled. -SourceCharacter lässt Luft aus DestinationCharacters Knebel, bis er nur noch leicht gefüllt ist. -SourceCharacter deflates DestinationCharacter gag till it's half full. -SourceCharacter lässt Luft aus DestinationCharacters Knebel, bis er halb gefüllt ist. -SourceCharacter deflates DestinationCharacter gag only a tiny bit. -SourceCharacter lässt ein kleines bisschen Luft aus DestinationCharacters Knebel. -SourceCharacter inflates DestinationCharacter gag only slightly. -SourceCharacter bläst DestinationCharacters Knebel ein kleines bisschen auf. -SourceCharacter inflates DestinationCharacter gag till half full. -SourceCharacter bläst DestinationCharacters Knebel zur Hälfte auf. -SourceCharacter inflates DestinationCharacter gag three quarters filled. -SourceCharacter bläst DestinationCharacters Knebel zu drei Vierteln auf. -SourceCharacter inflates DestinationCharacter gag to the maximum amount. -SourceCharacter bläst DestinationCharacters Knebel vollständig auf. -Empty -Leer -Medium -Mittel -Heavy -Stark -Maximum -Maximal -Use Remote -Fernbedienung -(You can use or remove items by selecting specific body regions on yourself.) -(Wähle eine Körperregion, um Items zu benutzen oder zu entfernen.) -(You clumsily whip your own breast and tummy. It would be more painful if someone else did it.) -(Du peitschst ungeschickt auf deine eigene Brust und deinen Bauch. Es wäre schmerzhafter, wenn jemand anderes es tun würde.) -(You swing the crop on yourself a few times. You can feel your breast and tummy becoming more sensitive.) -(Du schwingst die Ledergerte einige Male auf dich. Du kannst fühlen, wie deine Brust und dein Bauch empfindlicher werden.) -(You need a few tries but you're able to somewhat whip your own butt and feel the pain.) -(Du brauchst ein paar Versuche, aber du peitschst halbwegs deinen Hintern und fühlst den Schmerz.) -(You lash the leather crop pretty hard on your own butt. Jumping from each good hit.) -(Du schlägst die Ledergerte ziemlich doll auf deinen Hintern. Du springst bei jedem guten Treffer auf.) -(You slowly massage your pussy with the wand. Trembling from pleasure and excitement.) -(Du massierst langsam mit dem Vibrator deine Pussy. Du zitterst dabei vor Freude und Aufregung.) -Padlock mitten buckles -Fäustling-Riemen verriegeln -Unlock mittens -Fäustlinge aufschließen -Chain mittens -Fäustlinge anketten -Unchain mittens -Fäustlinge entketten -You need some padlocks to do this. -Dafür brauchst du Vorhängeschlösser. -You need a padlock key to do this. -Dafür brauchst du den passenden Schlüssel. -padlocks -verriegelt -unlocks -entriegelt -mittens -Fäustlinge -chains -kettet die Fäustlinge von -removes the chains -entfernt die Ketten von -mittens to the baby harness -an ihr Babyharnisch -She must be wearing a baby harness to chain the mittens. -Sie muss einen Babyharnisch tragen, um die Fäustlinge anzuketten. -You must free her arms before attaching mitten chains. -Ihre Arme müssen frei sein, um die Fäustlingsketten anbringen zu können. -Facial expression -Gesichtsausdruck -Select a spanking toy -Spanking-Spielzeug wählen -Crop -Gerte -Flogger -Peitsche -Cane -Rohrstock -Heart Crop -Herzgerte -Paddle -Paddel -Whip Paddle -Peitschenpaddel -Whip -Peitsche -Cattle Prod -Viehtreiber -Tennis Racket -Tennisschläger -SourceCharacter takes out a ItemUsed -SourceCharacter holt ein(e(n)) ItemUsed hervor -SourceCharacter gives TargetCharacter a ItemUsed -SourceCharacter gibt TargetCharacter ein(e(n)) ItemUsed -TurnOff -Ausschalten -Low -Niedrig -High -Hoch -Trigger Shock -Schock auslösen -Unlock Butt -Po entriegeln -Lock Butt -Po verriegeln -Remove Shield -Schild entfernen -Remove Vibe -Vibrator entfernen -Remove Shock -Schocker entfernen -Add Shield -Schild anbringen -Add Vibe -Vibrator anbringen -Add Shock -Schocker anbringen -SourceCharacter unlocks DestinationCharacter love chastity belt butt. -SourceCharacter öffnet den Hintereingang von DestinationCharacters Liebes-Keuschheitsgürtel. -SourceCharacter lock DestinationCharacter love chastity belt butt. -SourceCharacter verriegelt den Hintereingang von DestinationCharacters Liebes-Keuschheitsgürtel. -DestinationCharacterName love chastity belts starts teasing her lightly. -DestinationCharacterNames Liebes-Keuschheitsgürtel fängt an, sie sanft zu erregen. -DestinationCharacterName love chastity belts builds up to a moderate pace. -DestinationCharacterNames Liebes-Keuschheitsgürtel nimmt etwas Fahrt auf. -DestinationCharacterName love chastity belts starts buzzing strongly! -DestinationCharacterNames Liebes-Keuschheitsgürtel fängt an, stark zu vibrieren! -DestinationCharacterName love chastity belts jumps up to maximum intensity! -DestinationCharacterNames Liebes-Keuschheitsgürtel springt auf die maximale Stufe! -DestinationCharacterName love chastity belt stops vibrating. -DestinationCharacterNames Liebes-Keuschheitsgürtel hört auf zu vibrieren. -DestinationCharacterName love chastity belt slows down into a light tease. -DestinationCharacterNames Liebes-Keuschheitsgürtel fällt auf ein leichtes Surren herab. -DestinationCharacterName love chastity belt returns to a moderate pace. -DestinationCharacterNames Liebes-Keuschheitsgürtel fällt auf eine moderate Stärke herab. -DestinationCharacterName love chastity belt slows down a tiny bit. -DestinationCharacterNames Liebes-Keuschheitsgürtel lässt ein kleines bisschen nach. -SourceCharacter sets DestinationCharacter love chastity belt to low intensity. -SourceCharacter stellt DestinationCharacters Liebes-Keuschheitsgürtel auf "niedrig". -SourceCharacter sets DestinationCharacter love chastity belt to moderate intensity. -SourceCharacter stellt DestinationCharacters Liebes-Keuschheitsgürtel auf "mittel". -SourceCharacter sets DestinationCharacter love chastity belt to high intensity. -SourceCharacter stellt DestinationCharacters Liebes-Keuschheitsgürtel auf "hoch". -DestinationCharacterName love chastity belt gives her a light shock. -Ihr Liebes-Keuschheitsgürtel gibt DestinationCharacterName einen leichten Schock. -DestinationCharacterName love chastity belt lets out a sharp jolt! -Ihr Liebes-Keuschheitsgürtel versetzt DestinationCharacterName einen scharfen Ruck! -DestinationCharacterName love chastity belt delivers an intense shock! -Ihr Liebes-Keuschheitsgürtel verabreicht DestinationCharacterName einen heftigen Schock! -SourceCharacter removes shield from DestinationCharacter love chastity belt. -SourceCharacter entfernt die Abschirmung von DestinationCharacters Liebes-Keuschheitsgürtel. -SourceCharacter locks shield to DestinationCharacter love chastity belt. -SourceCharacter bringt die Abschirmung an DestinationCharacters Liebes-Keuschheitsgürtel an. -SourceCharacter locks vibe to DestinationCharacter love chastity belt. -SourceCharacter befestigt einen Vibrator an DestinationCharacters Liebes-Keuschheitsgürtel. -SourceCharacter locks shock device to DestinationCharacter love chastity belt. -SourceCharacter befestigt einen Schocker an DestinationCharacters Liebes-Keuschheitsgürtel. -Select what tag you want to use -Namensschild wählen -You cannot change the tag while it's locked -Namensschilder mit Schlössern können nicht geändert werden -SourceCharacter uses a NameTagType name tag on DestinationCharacter collar. -SourceCharacter bringt ein "NameTagType"-Namensschild an DestinationCharacters Halsband an. -Bad Girl -Böses Mädchen -Bind Me -Fessel mich -Bitch -Bitch -Bunny -Häschen -Cookie -Keks -Cupcake -Törtchen -Dom -Dom -Foxy -Fuchs -Free -Frei -Fuck Me -Fick mich -GagMe -Knebel mich -Good Girl -Braves Mädchen -Hold Me -Halt mich fest -Kitten -Kätzchen -Love -Liebling -Maid -Dienerin -Meat -Fleisch -Muffin -Muffin -Needy -Gierig -Owned -Eigentum -Panda -Panda -Pet -Haustier -Pet Me -Streichel mich -Pixie -Fee -Puppy -Hündchen -Racoon -Waschbär -Slave -Sklavin -Slut -Schlampe -Sub -Sub -Sweetie -Schatz -Taken -Vergeben -Toy -Spielzeug -Useless -Nutzlos -Use Me -Benutz mich -Whore -Hure -Legs -Beine -Half -Halb -Most -Größtenteils -Complete -Vollständig -SourceCharacter wraps duct tape around DestinationCharacter legs. -SourceCharacter wickelt Klebeband um DestinationCharacters Beine. -SourceCharacter wraps more duct tape on DestinationCharacter legs trapping them firmly. -SourceCharacter wickelt viel Klebeband um DestinationCharacters Beine und hält sie gefangen. -SourceCharacter wraps even more duct tape on DestinationCharacter legs trapping them tightly. -SourceCharacter wickelt sehr viel Klebeband um DestinationCharacters Beine und hält sie fest zusammen. -SourceCharacter wraps an extreme amount of duct tape on DestinationCharacter legs fully trapping them. -SourceCharacter wickelt extrem viel Klebeband um DestinationCharacters Beine und umhüllt sie vollständig. -Feet -Füße -SourceCharacter wraps duct tape around DestinationCharacter feet. -SourceCharacter wickelt Klebeband um DestinationCharacters Füße. -SourceCharacter wraps more duct tape on DestinationCharacter feet trapping them firmly. -SourceCharacter wickelt viel Klebeband um DestinationCharacters Füße und hält sie gefangen. -SourceCharacter wraps even more duct tape on DestinationCharacter feet trapping them tightly. -SourceCharacter wickelt sehr viel Klebeband um DestinationCharacters Füße und hält sie fest zusammen. -SourceCharacter wraps an extreme amount of duct tape on DestinationCharacter feet fully trapping them. -SourceCharacter wickelt extrem viel Klebeband um DestinationCharacters Füße und umhüllt sie vollständig. -Select the slave collar model -Sklavenhalsband-Modell wählen -SourceCharacter changes DestinationCharacter collar model. -SourceCharacter wechselt DestinationCharacters Halsband aus. -Select the Type of Teddy Bear -Teddybär-Typ wählen -Bear -Bär -Fox -Fuchs -Kitty -Kätzchen -Pony -Pony -SourceCharacter gives TargetCharacter a cute teddy bear. -SourceCharacter gibt TargetCharacter einen süßen Teddybären. -SourceCharacter gives TargetCharacter a cute foxy teddy. -SourceCharacter gibt TargetCharacter einen süßen Plüschfuchs. -SourceCharacter gives TargetCharacter a cute kitty teddy. -SourceCharacter gibt TargetCharacter eine süße Plüschkatze. -SourceCharacter gives TargetCharacter a cute puppy teddy. -SourceCharacter gibt TargetCharacter einen süßen Plüschhund. -SourceCharacter gives TargetCharacter a cute Bunny teddy. -SourceCharacter gibt TargetCharacter einen süßen Stoffhasen. -SourceCharacter gives TargetCharacter a cute Pony teddy. -SourceCharacter gibt TargetCharacter ein süßes Plüschpony. -View next page -Nächste Seite -View previous page -Vorherige Seite -Save color to currently selected slot -Farbe im ausgewählten Platz speichern diff --git a/Screens/Character/Player/Dialog_Player_FR.txt b/Screens/Character/Player/Dialog_Player_FR.txt deleted file mode 100644 index 0838ca479..000000000 --- a/Screens/Character/Player/Dialog_Player_FR.txt +++ /dev/null @@ -1,447 +0,0 @@ -###_NPC -Select an item to use -Sélectionner un objet à utiliser -Cannot use on yourself -Impossible à utiliser sur soi -Remove some clothes first -Il faut enlever des vêtements -Remove the suspension first -Enlevez la suspension en premier -Remove the chain to the floor first -Enlevez la chaîne du sol en premier -A collar must be fitted first to attach accessories to. -Un collier doit être placé avant d'y attacher des accessoires. -Must be collared and not suspended first. -Doit avoir un collier et ne pas être suspendue. -Cancel -Annuler -Back to character -Retour au personnage -View next items -Prochaine page -Remove the item -Enlever l'objet -Use this item -Utiliser cet objet -Try to struggle out -Tenter d'échapper -Use a lock -Utiliser un cadenas -Unlock the item -Décadenasser l'objet -Inspect the lock -Voir le cadenas -Use your remote -Utiliser une télécommande -Use the Butt Plug's pump -Utiliser la pompe du Plug Anal -Color of next item -Couleur du prochain objet -Use this color -Utiliser cette couleur -Default color -Couleur de base -Challenge: -Difficulté: -Swapping... -Échange en cours... -Struggling... -Échappage en cours... -Unlocking... -Déverouillage en cours... -Removing... -Retirage en cours... -Locking... -Verouillage en cours... -Adding... -Fixage en cours... -Impossible to escape! -Impossible d'y échapper! -Struggle to free yourself -Tentez d'échapper pour vous libérer -You'll need help to get out -Vous allez avoir besoin d'aide -You can unlock yourself -Vous pouvez déverouiller le cadenas -You cannot unlock yourself -Vous ne pouvez déverouiller le cadenas -This zone is out of reach from another item -Cette zone est hors d'accès -Another item is blocking access to this lock -Un autre article bloque l'accès à ce verrou -You cannot access your items -Vous ne pouvez accéder à vos objets -Click here to speed up the progress -Appuyez ici pour augmenter la vitesse -Alternate keys A and S to speed up -Alternez entre les clés A et S pour augmenter la vitesse -Pump gag level: Empty -Niveau de gonflage: Vide -Pump gag level: Light -Niveau de gonflage: Léger -Pump gag level: Inflated -Niveau de gonflage: Moyen -Pump gag level: Bloated -Niveau de gonflage: Gonflé -Pump gag level: Full mouth -Niveau de gonflage: Bouche pleine -Pump plug level: Empty -Niveau de gonflage: Vide -Pump plug level: Light -Niveau de gonflage: Léger -Pump plug level: Inflated -Niveau de gonflage: Moyen -Pump plug level: Bloated -Niveau de gonflage: Gonflé -Pump plug level: Max -Niveau de gonflage: Max -Deflate it -Dégonfler -Pump it -Gonfler -pumps -pompe -deflates -dégonfle -plug -plug -gag -baillon -'s - -Heads -Face -Tails -Pile -her -elle -SourceCharacter kneels down -SourceCharacter s'agenouille -SourceCharacter stands up -SourceCharacter se relève -Delete -Delete -Confirm -Confirmer -Beep -Sonner -Beep from -Sonner de -Beep from your owner in your private room -Votre patronne vient de vous sonner de votre chambre privée -in room -dans la chambre -Private room -Chambre privée -(As you enter the luxurious hallway, a maid comes to greet you.) Welcome to the Bondage Club, is this your first visit? -(Une servante vous approche alors que vous passez dans le hall luxurieux.) Bienvenue au Club du Bondage, est-ce que c'est votre première visite? -SourceCharacter is offering you to start a trial period as her submissive. Click on her and manage your relationship to accept, don't do anything to refuse. -SourceCharacter offre de commencer une période d'essai en tant que sa soumise. Appuyer sur elle pour voir et accepter la demande, ou ne faites rien pour refuser. -The Bondage Club is pleased to announce that SourceCharacter is starting a 7 days minimum trial period as a submissive. -Le Club du Bondage se plait d'annoncer que SourceCharacter va commencer une période d'essai d'un minimum de 7 jours comme soumise. -SourceCharacter has prepared a great collaring ceremony. A maid brings a slave collar, which her submissive must consent to wear. -SourceCharacter a préparé la cérémonie du collier. Une servante apport le collier, que la soumise doit consentir à porter . -The Bondage Club is proud to announce that SourceCharacter is now fully collared. Her fate is in her Mistress hands. -Le Club du Bondage se plait d'annoncer que SourceCharacter à maintenant un collier permanent. Son avenir est dans les mains de sa patronne. -Your owner is now allowing you to access your wardrobe and change clothes. -Votre patronne vous permet d'accéder à votre garde-robe et vêtements. -Your owner has blocked your wardrobe access for an hour. You won't be able to change clothes. -Votre patronne a bloqué l'usage de votre garde-robe pour une heure. Vous ne pourez changer de vêtements. -Your owner has blocked your wardrobe access for a day. You won't be able to change clothes. -Votre patronne a bloqué l'usage de votre garde-robe pour un jour. Vous ne pourez changer de vêtements. -Your owner has blocked your wardrobe access for a week. You won't be able to change clothes. -Votre patronne a bloqué l'usage de votre garde-robe pour une semaine. Vous ne pourez changer de vêtements. -Your owner has blocked your wardrobe access. You won't be able to change clothes until that rule is revoked. -Votre patronne a bloqué l'usage de votre garde-robe jusqu'à nouvel ordre. -Your owner is now allowing you to whisper to other members when she's there. -Votre patronne vous permet de chuchoter aux membres en sa présence. -Your owner is now preventing you from whispering to other members when she's there. -Votre patronne a bloqué le droit de chuchoter aux membres en sa présence. -Your owner is now allowing you to have keys. You can buy keys from the club shop. -Votre patronne vous permet d'utiliser des clés. Vous pouvez les acheter au magasin. -Your owner has confiscated your keys. All your regular keys are lost. -Votre patronne a confisqué vos clés. Elles sont maintenant perdues. -Your owner is now preventing you from getting new keys. The club shop will not sell keys to you anymore. -Votre patronne a bloqué le droit d'acheter de nouvelles clés. Le magasin de vous en vendront point. -SourceCharacter swaps a PrevAsset for a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter échange un(e) PrevAsset pour un(e) NextAsset sur le/a/es FocusAssetGroup de DestinationCharacter. -SourceCharacter uses a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter utilise un(e) NextAsset sur le/a/es FocusAssetGroup de DestinationCharacter. -SourceCharacter locks a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter vérouille un(e) NextAsset sur le/a/es FocusAssetGroup de DestinationCharacter. -SourceCharacter adds a NextAsset on DestinationCharacter FocusAssetGroup PrevAsset. -SourceCharacter ajoute un(e) NextAsset sur le/a/es FocusAssetGroup de DestinationCharacter PrevAsset. -SourceCharacter removes the PrevAsset from DestinationCharacter FocusAssetGroup. -SourceCharacter enlève le/a/es PrevAsset sur le/a/es FocusAssetGroup de DestinationCharacter. -SourceCharacter unlocks and removes the PrevAsset from DestinationCharacter FocusAssetGroup. -SourceCharacter dévérouille et enlève le/a/es PrevAsset sur le/a/es FocusAssetGroup de DestinationCharacter. -SourceCharacter rolls a DiceType sided dice. The result is: DiceResult. -SourceCharacter roule un dé à DiceType côtés. Le résultat est: DiceResult. -SourceCharacter flips a coin. The result is: CoinResult. -SourceCharacter lance une pièce. Le résultat est: CoinResult. -TargetCharacterName gets grabbed by two maids and locked in a timer cell, following her owner's commands. -TargetCharacterName est attrapée par deux servantes et enfermée dans une cellule minutée, selon l'ordre de sa patronne. -TargetCharacterName gets grabbed by two maids and escorted to the maid quarters to serve drinks for her owner. -TargetCharacterName est attrapée par deux servantes et escortée aux quartiers des servantes pour servir des brevages. -TargetCharacterName gives a sealed envelope to her owner. -TargetCharacterName donne une enveloppe scellée à sa patronne. -SourceCharacter picks a beer from DestinationCharacter tray. -SourceCharacter se prend un bière du plateau de DestinationCharacter. -SourceCharacter picks a glass of wine from DestinationCharacter tray. -SourceCharacter se prend un verre de vin du plateau de DestinationCharacter. -SourceCharacter picks a Margarita from DestinationCharacter tray. -SourceCharacter se prend un margarita du plateau de DestinationCharacter. -SourceCharacter buys a glass of Whiskey from TargetCharacter. -SourceCharacter achète un verre de whiskey de TargetCharacter. -SourceCharacter buys a glass of champagne from TargetCharacter. -SourceCharacter achète un verre de champagne de TargetCharacter. -SourceCharacter buys a round of shooters for everyone, from TargetCharacter. -SourceCharacter achète une ronde de shooters pour tous de TargetCharacter. -SourceCharacter buys a beer pitcher for everyone, from TargetCharacter. -SourceCharacter achète une carafe de bière de TargetCharacter. -Member number on lock: -Numéro de membre sur le cadenas: -Time left: -Temps restant: -SourceCharacter restarts the five minutes timer padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter réinitialise le cadenas cinq minutes de DestinationCharacter. -Restart Timer -Réinitialiser le minuteur -Remove item when the lock timer runs out -Remove item when the lock timer runs out -The item will be removed when the lock timer runs out -Cet objet sera enlevé quand le minuteur sera à zéro -The item will stay when the lock timer runs out -Cet objet restera quand le minuteur sera à zéro -Select the bondage position -Sélectionner une position -Select the tape wrapping -Sélectionner l'emballage -A victim cannot unlock herself if her elbows are bound -Une victime ne peut s'échapper si ses coudes sont attachés -"From your friendly hardware store" -"En provenance de la quincaillerie" -"To keep your loved one secure" -"Pour protéger vos proches" -You can restart the timer but cannot unlock -Vous pouvez réinitialiser le minuteur, mais non l'enlever -"Never forget who you belong to" -"N'oublies pas à qui tu appartiens" -Can only be locked or unlocked by her owner -Ne peut être touché par sa patronne -Detached -Détaché -Bind wrists -Poignets attachés -Bind elbows -Coudes attachés -Bind both -Tout attaché -SourceCharacter detaches the chain from DestinationCharacter leather cuffs. -SourceCharacter détache la chaîne des lanières en cuir de DestinationCharacter. -SourceCharacter attaches the leather cuffs wrist chain behind DestinationCharacter back. -SourceCharacter attache la chaîne aux poignets derrière le dos de DestinationCharacter. -SourceCharacter attaches the leather cuffs elbow chain behind DestinationCharacter back. -SourceCharacter attache la chaîne aux coudes derrière le dos de DestinationCharacter. -SourceCharacter attaches the leather cuffs wrist and elbow chains behind DestinationCharacter back. -SourceCharacter attache la chaîne des coudes et épaules derrière le dos de DestinationCharacter. -Hands -Mains -Arms -Arms -Skirt -Jupe -Torso -Torse -Mummy -Momie -SourceCharacter wraps duct tape around DestinationCharacter hands. -SourceCharacter enroule du ruban adhésif autour des mains de DestinationCharacter. -SourceCharacter creates a duct tape skirt on TargetCharacter and traps her hands in it. -SourceCharacter crée une jupe avec le ruban adhésif et enroule les mains de TargetCharacter à l'intérieur. -SourceCharacter creates a duct tape top on TargetCharacter and traps her arms in it. -SourceCharacter enroule les bras de TargetCharacter dans un chandail de ruban adhésif. -SourceCharacter creates a duct tape mummy on TargetCharacter and traps her arms in it. -SourceCharacter transforme TargetCharacter en une momie de ruban adhésif. -Select the type of gag -Selectionner le type de bâillon -Small -Petit -Cleave -Fendant -OTM -OTM -OTN -OTN -SourceCharacter ties the cloth into a small gag over DestinationCharacter mouth. -SourceCharacter ligote le tissu en un petit baillon couvrant la bouche de DestinationCharacter. -SourceCharacter ties the cloth into a cleave gag over DestinationCharacter mouth. -SourceCharacter ligote le tissu et fend la bouche de DestinationCharacter avec le baillon. -SourceCharacter ties the cloth into a large gag over DestinationCharacter mouth. -SourceCharacter ligote le tissu en un large baillon couvrant la bouche de DestinationCharacter. -SourceCharacter ties the cloth into a large gag over DestinationCharacter mouth and nose. -SourceCharacter ligote le tissu en un large baillon couvrant la bouche et le nez de DestinationCharacter. -Single strip -Bande simple -Crossed strips -Bandes croisées -Full face -Face pleine -Double layer -Double couche -SourceCharacter puts a piece of duct tape on DestinationCharacter mouth. -SourceCharacter place un morceau de ruban sur la bouche de DestinationCharacter. -SourceCharacter crosses two pieces of duct tape on DestinationCharacter mouth. -SourceCharacter croise deux morceaux de ruban sur la bouche de DestinationCharacter. -SourceCharacter fully tapes DestinationCharacter mouth. -SourceCharacter enroule complètement la bouche de DestinationCharacter avec le ruban. -SourceCharacter fully tapes DestinationCharacter mouth with double layers. -SourceCharacter enroule complètement la bouche de DestinationCharacter avec deux couches de ruban. -SourceCharacter wraps many layers on DestinationCharacter mouth. -SourceCharacter enroule plusieurs couches sur la bouche de DestinationCharacter. -Plugged -Bouché -Open -Libre -SourceCharacter plugs up DestinationCharacter mouth. -SourceCharacter bouche DestinationCharacter. -SourceCharacter pulls out DestinationCharacter plug from her gag. -SourceCharacter débouche DestinationCharacter. -Select the type of blindfold -Selecttionner le type de bandeau -Double -Double -Wrap -Enroulé -SourceCharacter takes a piece of duct tape for TargetCharacter and place on her face. -SourceCharacter prend un morceau de ruban et le place sur la face de TargetCharacter. -SourceCharacter wraps some duct tape onto DestinationCharacter face. -SourceCharacter enroule du ruban sur la face de DestinationCharacter. -SourceCharacter wraps DestinationCharacter head in tape with multiple layers. -SourceCharacter enroule la tête de DestinationCharacter avec plusieurs couches. -Item intensity: Disabled -Intensité de l'objet: Désactivée -Item intensity: Low -Intensité de l'objet: Faible -Item intensity: Medium -Intensité de l'objet: Moyenne -Item intensity: High -Intensité de l'objet: Forte -Item intensity: Maximum -Intensité de l'objet: Maximale -Increase -Augmenter -Decrease -Réduire -Show chat message -Message visible -SourceCharacter sets DestinationCharacter AssetName to low intensity. -SourceCharacter règle le AssetName de DestinationCharacter à intensité faible. -SourceCharacter sets DestinationCharacter AssetName to moderate intensity. -SourceCharacter règle le AssetName de DestinationCharacter à intensité moyenne. -SourceCharacter sets DestinationCharacter AssetName to high intensity. -SourceCharacter règle le AssetName de DestinationCharacter à intensité forte. -DestinationCharacter AssetName gives her a light shock. -Le AssetName de DestinationCharacterName lui donne un choc léger. -DestinationCharacter AssetName lets out a sharp jolt! -Le AssetName de DestinationCharacterName lui donne une secousse aigüe. -DestinationCharacter AssetName delivers an intense shock! -Le AssetName de DestinationCharacterName lui donne un choc intense. -DestinationCharacterName vibrating egg stops vibrating. -L'oeuf de DestinationCharacterName arrête de vibrer. -DestinationCharacterName vibrating egg slows down into a light tease. -L'oeuf de DestinationCharacterName ralenti juste assez pour être ressenti. -DestinationCharacterName vibrating egg returns to a moderate pace. -L'oeuf de DestinationCharacterName retourne à une vitesse modérée. -DestinationCharacterName vibrating egg slows down a tiny bit. -L'oeuf de DestinationCharacterName ralenti juste un peu. -DestinationCharacterName vibrating egg starts teasing her lightly. -L'oeuf de DestinationCharacterName la taquine en vibrant légèrement. -DestinationCharacterName vibrating egg builds up to a moderate pace. -L'oeuf de DestinationCharacterName augmente à une vitesse modérée. -DestinationCharacterName vibrating egg starts buzzing strongly! -L'oeuf de DestinationCharacterName augmente de vitesse puissamment. -DestinationCharacterName vibrating egg jumps up to maximum intensity! -L'oeuf de DestinationCharacterName saute à sa vitesse maximale. -DestinationCharacterName vibrating nipple clamps stop vibrating. -Les pinces vibrantes de DestinationCharacterName arrêtent de vibrer. -DestinationCharacterName vibrating nipple clamps slow down into a light tease. -Les pinces vibrantes de DestinationCharacterName ralentissent juste assez pour être ressenties. -DestinationCharacterName vibrating nipple clamps return to a moderate pace. -Les pinces vibrantes de DestinationCharacterName retournent à une vitesse modérée. -DestinationCharacterName vibrating nipple clamps slow down a tiny bit. -Les pinces vibrantes de DestinationCharacterName ralentissent juste un peu. -DestinationCharacterName vibrating nipple clamps start teasing her lightly. -Les pinces vibrantes de DestinationCharacterName la taquinent en vibrant légèrement. -DestinationCharacterName vibrating nipple clamps build up to a moderate pace. -Les pinces vibrantes de DestinationCharacterName augmentent à une vitesse modérée. -DestinationCharacterName vibrating nipple clamps start buzzing strongly! -Les pinces vibrantes de DestinationCharacterName augmentent de vitesse puissamment. -DestinationCharacterName vibrating nipple clamps jump up to maximum intensity! -Les pinces vibrantes de DestinationCharacterName sautent à leur vitesse maximale. -DestinationCharacterName vibrating latex panties stops vibrating. -Le slip vibrant en latex de DestinationCharacterName arrête de vibrer. -DestinationCharacterName vibrating latex panties slows down into a light tease. -Le slip vibrant en latex de DestinationCharacterName ralentit juste assez pour être ressentit. -DestinationCharacterName vibrating latex panties returns to a moderate pace. -Le slip vibrant en latex de DestinationCharacterName retourne à une vitesse modérée. -DestinationCharacterName vibrating latex panties slows down a tiny bit. -Le slip vibrant en latex de DestinationCharacterName ralentit juste un peu. -DestinationCharacterName vibrating latex panties starts teasing her lightly. -Le slip vibrant en latex de DestinationCharacterName la taquine en vibrant légèrement. -DestinationCharacterName vibrating latex panties builds up to a moderate pace. -Le slip vibrant en latex de DestinationCharacterName augmente à une vitesse modérée. -DestinationCharacterName vibrating latex panties starts buzzing strongly! -Le slip vibrant en latex de DestinationCharacterName augmente de vitesse puissamment. -DestinationCharacterName vibrating latex panties jumps up to maximum intensity! -Le slip vibrant en latex de DestinationCharacterName saute à sa vitesse maximale. -Use Remote -Utiliser la Télécommande -(You can use or remove items by selecting specific body regions on yourself.) -(Vous pouvez utiliser ou enlever des objets en sélectionnant les parties du corps.) -(You clumsily whip your own breast and tummy. It would be more painful if someone else did it.) -(Vous fouettez votre sein et ventre maladroitement. Il serait plus douloureux si quelqu'un d'autre vous fouettait.) -(You swing the crop on yourself a few times. You can feel your breast and tummy becoming more sensitive.) -(Vous vous frapper avec la cravache maintes fois. Vous ressentez votre sein et ventre devenir plus sensible.) -(You need a few tries but you're able to somewhat whip your own butt and feel the pain.) -(Après quelques essais, vous fouettez votre propre derrière et ressentez la douleur.) -(You lash the leather crop pretty hard on your own butt. Jumping from each good hit.) -(Vous frappez votre derrière avec la cravache puissamment, sautant après chaque coup.) -(You slowly massage your pussy with the wand. Trembling from pleasure and excitement.) -(Vous massagez votre vagin tranquilement avec la baguette, tremblant d'excitation et de plaisir.) -Padlock mitten buckles -Verouiller les mitaines -Unlock mittens -Déverouiller les mitaines -Chain mittens -Enchaîner les mitaines -Unchain mittens -Déchaîner les mitaines -You need some padlocks to do this. -Vous avez besoin d'un cadenas pour ceci. -You need a padlock key to do this. -Vous avez besoin d'une clé pour ceci. -padlocks -cadenasse -unlocks -décadenasse -mittens -mitaines -chains -chaînes -removes the chains -enlève les chaînes -mittens to the baby harness -les mitaines au harnais de bébé -She must be wearing a baby harness to chain the mittens. -Elle doit porter un harnais de bébé pour enchaîner les mitaines. -You must free her arms before attaching mitten chains. -Vous devez libérer ses bras avant d'attacher les mitaines. -Facial expression -Expression faciale -View next page -Voir la prochaine page -View previous page -Voir la page précédente -Save color to currently selected slot -Sauvegarde la couleur sur le slot sélectionné diff --git a/Screens/Character/Player/Dialog_Player_RU.txt b/Screens/Character/Player/Dialog_Player_RU.txt deleted file mode 100644 index 1e1547ab3..000000000 --- a/Screens/Character/Player/Dialog_Player_RU.txt +++ /dev/null @@ -1,5610 +0,0 @@ -###_NPC -(You can use or remove items by selecting specific body regions on yourself.) -(Вы можете использовать или удалять предметы, выбрав определенные области тела на себе.) -###_PLAYER -(View your profile.) -(Просмотрите свой профиль.) -(Change your clothes.) -(Переоденься.) -(Room administrator action.) -(Действие администратора комнаты.) -###_NPC -(As a room administrator, you can take these actions.) -(Как администратор комнаты, вы можете выполнять эти действия.) -###_PLAYER -(Character actions.) -(Действия персонажа.) -###_NPC -(Possible character actions.) -(Возможные действия персонажа.) -###_PLAYER -(Spend GGTS minutes.) -(Потратить минуты GGTS.) -###_NPC -(Select how to spend your minutes.) -(Выберите, как потратить минуты.) -###_PLAYER -(View your current rules.) -(Просмотр текущих правил.) -###_NPC -(Here are your currently active rules.) -(Вот ваши текущие активные правила.) -###_PLAYER -(Leave this menu.) -(Выйдите из этого меню.) -(Move Character.) -(Переместить персонажа.) -###_NPC -(Move started.) -(Движение началось.) -###_PLAYER -(Back to main menu.) -(Вернуться в главное меню.) -(Spend 15 minutes for a bondage position change.) -(Потратьте 15 минут на смену позиции бондажа.) -###_NPC -(You don't have enough minutes available.) -(У вас недостаточно минут.) -###_PLAYER -(Spend 15 minutes for a new blindness level.) -(Потратьте 15 минут на новый уровень слепоты.) -(Spend 15 minutes for a new deafness level.) -(Потратьте 15 минут на новый уровень глухоты.) -(Spend 15 minutes for an sexual intensity change.) -(Потратьте 15 минут на изменение сексуальной интенсивности.) -(Spend 15 minutes for a sexual intensity change.) -(Потратьте 15 минут на изменение сексуальной интенсивности.) -(Spend 30 minutes to unlock the door.) -(Потратьте 30 минут, чтобы открыть дверь.) -###_NPC -(You must have 30 minutes and be the admistrator of the locked room.) -(Вы должны иметь 30 минут и быть администратором запертой комнаты.) -###_PLAYER -(Spend 120 minutes to get $100.) -(Потратьте 120 минут, чтобы получить 100 долларов.) -###_NPC -(GGTS gives you $100 and substracts 120 minutes to your total.) -(GGTS дает вам 100 долларов и вычитает 120 минут из общей суммы.) -###_PLAYER -(Spend 200 minutes to get your own GGTS helmet.) -(Потратьте 200 минут, чтобы получить собственный шлем GGTS.) -###_NPC -(You get a GGTS helmet and the AI substracts 200 minutes from your total.) -(Вы получаете шлем GGTS, и ИИ вычитает 200 минут из вашего общего количества.) -(You don't have enough minutes available or you already have the helmet in your inventory.) -(У вас недостаточно минут или шлем уже есть в вашем инвентаре.) -###_PLAYER -(Adjust your bondage skill.) -(Настройте свой навык бондажа.) -###_NPC -(By default, you restrain using your full bondage skill. You can use less of your skill and make it easier for your victims to escape.) -(По умолчанию вы сдерживаетесь, используя свой полный навык связывания. Вы можете использовать меньше своих навыков и облегчить побег своим жертвам.) -###_PLAYER -(Adjust your evasion skill.) -(Настройте свой навык уклонения.) -###_NPC -(By default, you struggle using your full evasion skill. You can use less of your skill and make it harder for you to struggle free.) -(По умолчанию вы боретесь, используя свой полный навык уклонения. Вы можете использовать меньше своего мастерства, и вам будет труднее освободиться.) -###_PLAYER -(Call the maids for help) -(Позовите горничных на помощь) -###_NPC -(The maids are not supposed to take room calls. This will result in punishment and public humiliation. Are you sure?) -(Горничные не должны отвечать на звонки в номер. Это приведет к наказанию и публичному унижению. Ты уверен?) -(The maids will be here shortly...) -(Горничные скоро придут...) -###_PLAYER -(Use your safeword.) -(Используй свое стоп-слово.) -###_NPC -(A safeword is serious and should not be used to cheat. It can revert your clothes and restraints to when you entered the lobby, or release you completely.) -(Стоп-слово - это серьезно, и его не следует использовать для обмана. Он может вернуть вашу одежду и ремни в то состояние, в котором вы вошли, или освободить вас.) -###_PLAYER -(Take a photo of yourself.) -(Сфотографируй себя.) -(Play Kinky Dungeon) -(Играть в Kinky Dungeon) -###_NPC -(Main menu.) -(Главное меню.) -###_PLAYER -(Use your full bondage skill. 100%) -(Используй свой полный навык бондажа. 100%) -###_NPC -(You will now use your full bondage skill when using a restraint. 100%) -(Теперь вы будете использовать свой полный навык связывания при использовании удерживающего устройства. 100%) -###_PLAYER -(Use most of your bondage skill. 75%) -(Используй большую часть своего навыка бондажа. 75%) -###_NPC -(You will now use most of your bondage skill when using a restraint. 75%) -(Теперь вы будете использовать большую часть своего навыка связывания при использовании удерживающего устройства. 75%) -###_PLAYER -(Use half of your bondage skill. 50%) -(Используй половину своего навыка бондажа. 50%) -###_NPC -(You will now use half of your bondage skill when using a restraint. 50%) -(Теперь вы будете использовать половину своего навыка связывания при использовании удерживающего устройства. 50%) -###_PLAYER -(Use very little of your bondage skill. 25%) -(Используйте очень мало своего навыка бондажа. 25%) -###_NPC -(You will now use very little of your bondage skill when using a restraint. 25%) -(Теперь вы будете использовать очень мало своего навыка связывания при использовании удерживающего устройства. 25%) -###_PLAYER -(Use none of your bondage skill. 0%) -(Не используй ни одного из своих навыков бондажа. 0%) -###_NPC -(You will now use none of your bondage skill when using a restraint. 0%) -(Теперь вы не будете использовать ни один из своих навыков связывания при использовании удерживающего устройства. 0%) -###_PLAYER -(Don't change your skill.) -(Не меняй свой навык.) -(Use your full evasion skill. 100%) -(Используйте свой полный навык уклонения. 100%) -###_NPC -(You will now use your full evasion skill when trying to struggle free. 100%) -(Теперь вы будете использовать свой полный навык уклонения при попытке освободиться. 100%) -###_PLAYER -(Use most of your evasion skill. 75%) -(Используйте большую часть своего навыка уклонения. 75%) -###_NPC -(You will now use most of your evasion skill when trying to struggle free. 75%) -(Теперь вы будете использовать большую часть своего навыка уклонения, пытаясь освободиться. 75%) -###_PLAYER -(Use half of your evasion skill. 50%) -(Используй половину своего навыка уклонения. 50%) -###_NPC -(You will now use half of your evasion skill when trying to struggle free. 50%) -(Теперь вы будете использовать половину своего навыка уклонения, пытаясь освободиться. 50%) -###_PLAYER -(Use very little of your evasion skill. 25%) -(Используйте очень мало своего навыка уклонения. 25%) -###_NPC -(You will now use very little of your evasion skill when trying to struggle free. 25%) -(Теперь вы будете использовать очень мало своего навыка уклонения, пытаясь освободиться. 25%) -###_PLAYER -(Use none of your evasion skill. 0%) -(Не используй свой навык уклонения. 0%) -###_NPC -(You will now use none of your evasion skill when trying to struggle free. 0%) -(Теперь вы не будете использовать ни один из своих навыков уклонения при попытке освободиться. 0%) -###_PLAYER -(Yes! Get me out of this room!) -(Да! Вытащи меня из этой комнаты!) -(No, don't call the maids.) -(Нет, не зови горничных.) -(Revert Character.) -(Вернуть персонажа.) -###_NPC -(This will revert your character's clothes and restraints back to how they were when you entered the lobby. Use this if you were forced into restraints against your consent. Are you sure you want to revert your character?) -(Это вернет одежду и наручники вашего персонажа в то состояние, в котором они были, когда вы вошли в вестибюль. Используйте это, если вас принудили к ограничениям против вашего согласия. Вы уверены, что хотите вернуть своего персонажа?) -###_PLAYER -(Release Character.) -(Освободите Персонажа.) -###_NPC -(This will immediately release you of ALL restraints you are wearing and return you to the Main Lobby. Use this only if you are stuck in restraints and nobody can or wants to help you. Are you sure about this?) -(Это немедленно освободит вас от ВСЕХ ограничений, которые на вас надеты, и вернет вас в Главный вестибюль. Используйте это только в том случае, если вы застряли в ограничителях и никто не может или не хочет вам помочь. Вы уверены в этом?) -###_PLAYER -(Don't use Safeword.) -(Не используйте Стоп-слова.) -(Yes, revert Character.) -(Да, вернуть Характер.) -(No, don't revert Character.) -(Нет, не меняйте Характер.) -(Yes, I want to be released.) -(Да, я хочу, чтобы меня освободили.) -(No, don't release me.) -(Нет, не отпускай меня.) -###_NPC -The stimulation ends just before you go over the edge. -Стимуляция заканчивается как раз перед тем, как вы перейдете через край. -The vibrators cut off right before you reach climax. -Вибраторы отключаются прямо перед тем, как вы достигнете кульминации. -The vibrators deny you a chance to finish, stopping abruptly. -Вибраторы лишают вас шанса кончить, резко останавливаясь. -SourceCharacter quit a game of Kinky Dungeon at level KinkyDungeonLevel -SourceCharacter вышел из игры Kinky Dungeon на уровне KinkyDungeonLevel -SourceCharacter met her defeat in Kinky Dungeon! She made it to level KinkyDungeonLevel before succumbing. -SourceCharacter встретил свое поражение в Kinky Dungeon! Она добралась до уровня KinkyDungeonLevel прежде чем сдаться. -Save -Сохранить -Load -Загрузить -Save/Load Expressions -Сохранение/Загрузка Выражений -(Empty) -(Пусто) -GGTS control this item -GGTS управляет этим предметом -Select Blanket Bondage -Выберите Одеяло Бондажа -Normal -Обычный -Shoulders Wrapped -Плечи завернуты -Feet Wrapped -Ноги Завернуты -Fully Wrapped -Полностью Завернутый -SourceCharacter wraps TargetCharacter in a blanket. -SourceCharacter заворачивает TargetCharacter в одеяло. -SourceCharacter wraps TargetCharacter with her shoulders in a blanket. -SourceCharacter укутывает TargetCharacter одеялом до плеч. -SourceCharacter wraps TargetCharacter with her feet in a blanket. -SourceCharacter заворачивает TargetCharacter с ногами в одеяло. -SourceCharacter fully wraps TargetCharacter in a blanket. -SourceCharacter полностью обертывает TargetCharacter в одеяло. -Select an item to use. -Выберите предмет для использования. -Select an item to use on the GroupName. -Выберите предмет для использования в GroupName. -Select an activity. -Выберите действие. -Select an activity to use on the GroupName. -Выберите действие для использования в GroupName. -Cannot use on yourself. -Нельзя использовать на себе. -Requires self-bondage 1. -Требуется Самобондаж 1. -Requires self-bondage 2. -Требуется Самобондаж 2. -Requires self-bondage 3. -Требуется Самобондаж 3. -Requires self-bondage 4. -Требуется Самобондаж 4. -Requires self-bondage 5. -Требуется Самобондаж 5. -Requires self-bondage 6. -Требуется Самобондаж 6. -Requires self-bondage 7. -Требуется Самобондаж 7. -Requires self-bondage 8. -Требуется Самобондаж 8. -Requires self-bondage 9. -Требуется Самобондаж 9. -Requires self-bondage 10. -Требуется Самобондаж 10. -Remove some clothes first. -Сначала снимите одежду. -Unzip the suit first. -Сначала расстегните костюм. -Remove the suspension first. -Сначала снимите подвеску. -Release from hogtie first. -Освободите руки и ноги в первую очередь. -Remove some restraints first. -Сначала снимите некоторые ограничения. -Cannot be used when mounted. -Нельзя использовать в установленном состоянии. -Cannot be used while yoked. -Нельзя использовать, когда вы привязаны. -Cannot be used while the legs are spread. -Нельзя использовать, когда ноги раздвинуты. -Cannot be used while serving drinks. -Нельзя использовать во время подачи напитков. -Remove the wand first. -Сначала снимите палочку. -Cannot use this. -Не могу использовать это. -Must remove chastity first. -Сначала нужно избавиться от целомудрия. -Remove the chain first. -Сначала снимите цепочку. -A collar must be fitted first to attach accessories to. -Сначала необходимо установить ошейник, к которому можно прикрепить аксессуары. -Must be on a bed to attach addons to. -Должно быть, на кровати, к которой можно прикрепить дополнения. -Must have an arm/torso/pelvis item to use ceiling tethers. -Должен быть предмет для рук / туловища / таза, чтобы использовать потолочные привязи. -Must be wearing a set of arm cuffs first. -Должно быть, сначала нужно надеть нарукавные манжеты. -Must be wearing a set of ankle cuffs first. -Должно быть, сначала нужно надеть пару наручников на щиколотки. -Remove some clothes and requires a collar. -Снимите какую-нибудь одежду и наденьте ошейник. -Legs cannot open. -Ноги не могут раскрыться. -Legs cannot close. -Ноги не могут сомкнуться. -Must be able to kneel. -Должен мочь стоять на коленях. -Must stand up first. -Сначала нужно встать. -Must free feet first. -Сначала нужно освободить ноги. -Must free arms first. -Сначала нужно освободить руки. -Must free legs first. -Сначала нужно освободить ноги. -Must free hands first. -Сначала нужно освободить руки. -Must remove shackles first. -Сначала нужно снять кандалы. -Must remove face mask first. -Сначала необходимо снять маску с лица. -Must empty vulva first. -Сначала нужно опорожнить вульву. -Must remove clitoris piercings first -Сначала необходимо удалить пирсинг клитора -Must empty butt first. -Сначала нужно опустошить задницу. -The use of remotes is forbidden by your owner -Использование пультов дистанционного управления запрещено вашим владельцем -Cannot be used over the applied gags. -Нельзя использовать поверх нанесенных кляпов. -Cannot be used over the applied mask. -Нельзя использовать поверх нанесенной маски. -Cannot be used over the applied hood. -Нельзя использовать поверх нанесенного капюшона. -Blocked in this room. -Заблокирован в этой комнате. -Cancel -Отмена -Back to character -Назад к персонажу -View next items -Посмотреть следующий предмет -View previous items -Посмотреть предыдущий предмет -View next page -Посмотреть следующую страницу -View previous page -Посмотреть предыдущую страницу -Remove the item -Удалить предмет -Use this item -Использовать этот предмет -Unable to use due to player permissions -Невозможно использовать из-за разрешений игрока -Try to struggle out -Попробовать бороться -Dismount -Спешиться -Escape from the item -Побег из ограничения -Lock related actions -Заблокировать связанные действия -Use a lock -Использовать замок -Unable to lock item due to player permissions -Невозможно заблокировать предмет из-за разрешений игрока -Unlock the item -Разблокировать предмет -Try to pick the lock -Попробовать взломать замок -Try to pick the lock (jammed) -Попробовать взломать замок (заклинил) -Return to the item menu -Вернуться в меню предметов -Inspect the lock -Осмотрите замок -Unable to inspect due to player permissions -Невозможно проверить из-за разрешений игрока -Use your remote -Используйте свой пульт -You have not bought a remote yet. -Вы еще не купили пульт. -Your owner is preventing you from using remotes. -Ваш владелец запрещает вам использовать пульты. -You have not bought a lover's remote yet. -Вы еще не купили пульт любовника. -Using remotes on this item has been blocked -Использование пультов для этого предмета заблокировано -You do not have access to this item -У вас нет доступа к этому элементу -Your hands must be free to use remotes -Ваши руки должны быть свободны для использования пультов -Exit permission mode -Выйти из режима разрешений -Edit item permissions -Изменить права доступа к предмету -Sexual activities -Сексуальные действия -Show all zones -Показать все зоны -Use the butt plug's pump -Используйте насос анальной пробки -Color of next item -Цвет следующего предмета -Unable to change color due to player permissions -Невозможно изменить цвет из-за разрешений игрока -Change color -Изменить цвет -Use this color -Использовать этот цвет -Default color -Цвет по умолчанию -Save color to currently selected slot -Сохранить цвет для выбранного в данный момент слота -Challenge: -Испытание: -Swapping... -Обмен... -Picking the lock... -Взлом замка... -Decoding the lock... -Расшифровка замка... -Hacking the item... -Взлом предмета... -Struggling... -Борьба... -Unlocking... -Разблокировка... -Removing... -Удаление... -Dismounting... -Демонтаж... -Escaping... -Побег... -Locking... -Запирается... -Adding... -Добавление... -Using 75% of your skill... -Используя 75% своего умения... -Using 50% of your skill... -Используя 50% своего умения... -Using 25% of your skill... -Используя 25% своего умения... -Using none of your skill... -Не используя свои навыки... -Impossible to escape! -Невозможно убежать! -Use brute force -Использовать грубую силу -Try to squeeze out -Попытаться выдавить -Try to unfasten -Попробовать отстегнуть -Choose struggling method... -Выберите метод борьбы... -Struggle to free yourself -Борьба за освобождение -You'll need help to get out -Тебе понадобится помощь, чтобы выбраться -You can unlock yourself -Вы можете разблокировать себя -You cannot unlock yourself -Вы не можете разблокировать себя -This zone is out of reach from another item -Эта зона находится вне досягаемости из-за другого предмета -Another item is blocking access to this lock -Другой предмет блокирует доступ к этой блокировке -You cannot access your items -Вы не можете получить доступ к своим предметам -You have no items in this category -У вас нет предметов в этой категории -Click when the player reaches the buckle to progress -Нажмите, когда игрок достигнет пряжки, чтобы прогрессировать -Click the ropes before they hit the ground to progress -Нажмите на веревки, прежде чем они упадут на землю, чтобы прогрессировать -Click here to speed up the progress -Нажмите здесь, чтобы ускорить процесс -Alternate keys A and S to speed up -Чередуйте клавиши A и S для ускорения -Alternate keys A and S or X and Y on a Controller to speed up -Чередуйте клавиши A и S или X и Y на контроллере для ускорения -Select inflation level -Выберите уровень вздутия -Select hood style -Выберите стиль капюшона -Hair out & Accessories out -Распущенные волосы и аксессуары - Hair in & Accessories out - Волосы внутрь и аксессуары наружу - Hair out & Accessories in - Распущенные волосы и аксессуары внутри - Hair in & Accessories in - Волосы внутрь и аксессуары внутри -SourceCharacter changes the style of DestinationCharacter gwen hood. -SourceCharacter изменяет стиль DestinationCharacter гвен худ. -Select a hood style. -Выберите стиль капюшона. -Hair in -Волосы внутрь -Hair out -Распущенные волосы -Select a scarf style. -Выберите стиль шарфа. -Hide Mouth -Скрыть рот -Bundled -В комплекте -SourceCharacter changes the style of DestinationCharacter hood. -SourceCharacter меняет стиль капюшона DestinationCharacter . -Pump gag level: Empty -Уровень кляпа насоса: Пустой -Pump gag level: Light -Уровень кляпа насоса: Легкий -Pump gag level: Inflated -Уровень кляпа насоса: Надутый -Pump gag level: Bloated -Уровень кляпа насоса: Раздутый -Pump gag level: Full mouth -Уровень кляпа насоса: Полный рот -Empty -Пустой -Light -Легкий -Inflated -Надутый -Bloated -Раздутый -Maximum -Максимальный -Inflation level: Empty -Уровень вздутия: Пустой -Inflation level: Light -Уровень вздутия: Легкий -Inflation level: Inflated -Уровень вздутия: Надутый -Inflation level: Bloated -Уровень вздутия: Раздутый -Inflation level: Max -Уровень вздутия: Максимальный -Select suction level -Выберите уровень всасывания -Loose -Свободный -Medium -Средний -Heavy -Тяжелый -Clear facial expressions -Очистить выражение лица -Wink/Blink -Подмигивание/Моргание -Toggle closed eyes blindness -Переключить слепоту с закрытыми глазами -Clear active poses -Очистить активные позы -Pose -Поза -Deflate it -Сдуть это -Pump it -Накачать это -pumps -насосы -deflates -сдувается -plug -штекер -gag -кляп -'s -ы -Heads -Головы -Tails -Хвосты -her -ее -herself -сама -Someone -Кто-то -SourceCharacter kneels down -SourceCharacter опускается на колени -SourceCharacter stands up -SourceCharacter встает -SourceCharacter carefully lowers herself down. -SourceCharacter осторожно опускается вниз. -SourceCharacter manages to get to her feet. -SourceCharacter удается подняться на ноги. -SourceCharacter almost loses her balance trying to kneel down! -SourceCharacter чуть не теряет равновесие, пытаясь опуститься на колени! -SourceCharacter tries to stand up but loses her balance and falls! -SourceCharacter пытается встать, но теряет равновесие и падает! -SourceCharacter helps TargetCharacter to kneel down -SourceCharacter помогает TargetCharacter опуститься на колени -SourceCharacter helps TargetCharacter to stand up -SourceCharacter помогает TargetCharacter встать на ноги -SourceCharacter changes DestinationCharacter clothes. -SourceCharacter меняет одежду DestinationCharacter . -SourceCharacter selects her team and class. -Sourceвыбирает свою команду и класс. -SourceCharacter has started the LARP game. -SourceCharacter начал игру в LARP. -SourceCharacter has started the Magic Battle. -SourceCharacter начал Магическую битву. -Your safeword is disabled, it cannot be used at the moment. -Ваше безопасное слово отключено, в данный момент оно не может быть использовано. -Private -Приватный -Public -Публичный -Закрытый -Unlocked -Открытый -Cannot change while locked -Невозможно изменить, пока заблокировано -Delete -Удалить -Confirm -Потвердить -Beep -Звуковой сигнал -Beep from -Звуковой сигнал от -With Message -С сообщением -(Mail) -(Почта) -Beep from your owner in your private room -Звуковой сигнал от вашего владельца в вашей личной комнате -Sent at -Отправлено в -Asylum -Психушка -in the Asylum -в Психушке -in LARP -в LARP -in Magic Battle -в Magic Battle -Received at -Получено в -Your private room -Ваша приватная комната -in room -в комнате -Private room -Приватная комната -Wrestling Ring -Борцовский ринг -Introduction -Ознакомительная комната -Kidnappers League -Лига похитителей -Maid Quarters -Помещения для прислуги -Main Hall -Главный зал -Club Management -Руководство клуба -Shibari Dojo -Додзе Шибари -Bedroom -Bedroom -Horse Stable -Конюшня -Nursery -Детская -Prison Hall -Тюремный зал -BDSM Room Blue -БДСМ Комната Синий -BDSM Room Purple -БДСМ Комната Фиолетовый -BDSM Room Red -БДСМ Комната Красный -Gardens -сады -Indoor Pool -Крытый бассейн -Outdoor Pool -Открытый бассейн -Maid Café -Мэйд Кафе -Public Bath -Общественная баня -Onsen -Онсен -Park Day -Парк Днём -Park Night -Парк Ночью -Chill Room -Комната отдыха -Boudoir -Будуар -Kitchen -Кухня -Dining Room -Столовая -Bondage Bedchamber -Спальня для бондажа -Beach -Пляж -Sheikh Private Room -Приватная комната Шейха -Sheikh Tent -Шатер Шейха -Slum Apartment -Квартира в трущобах -Forest Path -Лесная тропинка -Deep Forest -Deep Forest -Spooky Forest -Жуткий лес -Slum Ruins -Развалины трущоб -Abandoned Building -Заброшенное здание -Abandoned Side Room -Заброшенная Боковая Комната -Balcony Night -Балкон Ночью -Cozy Living Room -Уютная гостиная -Rooftop Party -Вечеринка на крыше -Party Basement -Подвал для вечеринок -Cosy Chalet -Уютное шале -Alchemist Office -Офис алхимика -Research Lab -Исследовательская лаборатория -Entrance to Hell -Вход в ад -Entrance to Heaven -Вход в рай -Old Farm -Старая ферма -Rusty Saloon -Ржавый салун -Pirate Island -Пиратский остров -Pirate Island Night -Пиратский остров ночью -Ship's Deck -Корабельная палуба -Ship Wreck -Кораблекрушение -Captain Cabin -Каюта капитана -Underwater One -Подводный Один -Beach Hotel -Пляжный отель -Dystopian City -Антиутопический город -Forest Cave -Лесная пещера -Kennels -Питомники -Locker Room -Раздевалка -Sci Fi Cell -Научно-фантастическая клетка -Space Station Captain Bedroom -Спальня капитана космической станции -Tiled Bathroom -Плиточная Ванная -Wooden Cabin -Деревянная хижина -Medina Market -Рынок Медины -Throne Room -Тронный зал -Dungeon -Темница -Industrial -Промышленный -Sun Temple -Храм Солнца -Back Alley -Глухой переулок -Creepy Basement -Жуткий подвал -Cellar -Подвал -Slum Cellar -Подвал из трущоб -Bar Restaurant -Бар Ресторан -Ruined Dungeon -Разрушенное подземелье -Slippery Classroom -Скользкий Класс -Middletown School -Миддлтаунская школа -School Hospital -Школьная больница -Abandoned School -Заброшенная школа -Secret Chamber -Тайная комната -Vault Corridor -Коридор хранилища -Ancient Ruins -Древние Руины -Jungle Temple -Храм в джунглях -Ceremony Venue -Место проведения церемонии -Beach Promenade Café -Кафе на набережной пляжа -Boutique Shop -Бутик-магазин -Shop Dressing Rooms -Примерочные магазина -Confessions -Исповедь -Desolate Village -Пустынная деревня -Lost Wages Casino -Казино потерянной заработной платы -Wedding Room -Свадебный номер -Wedding Arch -Свадебная арка -Wedding Beach -Свадебный пляж -Witch Wood -Ведьмин лес -Park Winter -Зимний парк -Xmas Eve Lounge -Рождественская гостиная -Xmas Day Lounge -Рождественский зал -Street Night -Уличная ночь -Snowy Street -Снежная улица -Virtual World -Виртуальный мир -Entrance -Вход -Meeting -Совещание -Therapy -Терапия -Padded Cell -Обитая клетка -Padded Cell 2 -Обитая клетка 2 -GGTS Computer Room -Компьютерный зал GGTS -Ranch -Ранчо -Luxury Pool -Роскошный бассейн -Wagon Circle -Вагонный круг -Desert -Пустыня -Western Street -Западная улица -Rainy Forest Path Day -Тропинки в Дождливом Лесу Днём -Rainy Forest Path Night -Тропинки в Дождливом Лесу Ночью -Rainy Street Day -Дождливая улица Днём -Rainy Street Night -Дождливая улица Ночью -Snowy Chalet Day -Заснеженное Шале Днём -Snowy Chalet Night -Заснеженное Шале Ночью -Snowy Deep Forest -Заснеженный Глубокий Лес -Snowy Forest Path Day -Заснеженная Лесная тропинка Днём -Snowy Forest Path Night -Заснеженная Лесная тропинка Ночью -Snowy Lake Night -Снежное озеро Ночью -Snowy Street Day 1 -Заснеженная улица Днём 1 -Snowy Street Day 2 -Заснеженная улица Днём 2 -Snowy Street Night -Заснеженная улица Ночью -Snowy Town 1 -Заснеженный город 1 -Snowy Town 2 -Заснеженный город 2 -Nightclub -Ночной клуб -Egyptian Exhibit -Египетская выставка -Sci Fi Outdoors -Научная Фантастика На открытом возду -Fancy Castle -Причудливый замок -Egyptian Tomb -Египетская гробница -Pool Bottom -Дно бассейна -Latex Room -Латексная комната -Outside Cells -Внешние камеры -Infiltration Bunker -Инфильтрационный бункер -Movie Studio -Киностудия -Tennis Court -Теннисный корт -Theater -Театр -College Classroom -Классная комната колледжа -School Hallway -Школьный коридор -Hotel Bedroom -Гостиничная спальня -Yacht Chill Room -Комната Отдыха на яхте -Yacht Main Hall -Главный зал яхты -Yacht Deck -Палуба яхты -Luxury Office -Роскошный офис -Open Office -Открытый офис -Empty Warehouse -Пустой склад -Leather Chamber -Кожаная камера -Red Sci-Fi Room -Красная Научно-фантастическая комната -Lingerie Shop -Магазин нижнего белья -Restaurant 1 -Ресторан 1 -Restaurant 2 -Ресторан 2 -Remove locks before changing -Снимите замки перед заменой -Blocked due to item permissions -Заблокирован из-за разрешений на предметы -(As you enter the luxurious hallway, a maid comes to greet you.) Welcome to the Bondage Club, is this your first visit? -(Когда вы входите в роскошный коридор, вам навстречу выходит горничная.) Добро пожаловать в Клуб Бондажа, это ваш первый визит? -SourceCharacter is offering you to start a trial period as her submissive. Click on her and manage your relationship to accept, don't do anything to refuse. -SourceCharacter предлагает вам начать испытательный срок в качестве ее сабмиссива. Нажмите на нее и управляйте своими отношениями, чтобы принять, не делайте ничего, чтобы отказаться. -The Bondage Club is pleased to announce that SourceCharacter is starting a 7 days minimum trial period as a submissive. -The Bondage Club рад сообщить, что SourceCharacter начинает минимальный 7-дневный испытательный срок в качестве сабмиссива. -SourceCharacter has prepared a great collaring ceremony. A maid brings a slave collar, which her submissive must consent to wear. -SourceCharacter подготовила великолепную церемонию ошейника. Горничная приносит рабский ошейник, который ее сабмиссив должен согласиться носить. -The Bondage Club announces that SourceCharacter canceled the trial ownership of TargetCharacter. -The Bondage Club объявляет, что SourceCharacter отменил пробное владение TargetCharacter. -The Bondage Club announces that SourceCharacter released TargetCharacter from her ownership. -The Bondage Club объявляет, что SourceCharacter освободил TargetCharacter от ее владения. -The Bondage Club is proud to announce that SourceCharacter is now fully collared. Her fate is in her Mistress hands. -The Bondage Club с гордостью сообщает, что SourceCharacter теперь полностью в ошейнике. Ее судьба в руках ее Госпожи. -Your owner is now allowing you to access your wardrobe and change clothes. -Ваша хозяйка теперь позволяет вам получить доступ к своему гардеробу и переодеться. -Your owner has blocked your wardrobe access for an hour. You won't be able to change clothes. -Ваша хозяйка заблокировал доступ к вашему гардеробу на час. Ты не сможешь переодеться. -Your owner has blocked your wardrobe access for a day. You won't be able to change clothes. -Ваша хозяйка заблокировал доступ к вашему гардеробу на один день. Ты не сможешь переодеться. -Your owner has blocked your wardrobe access for a week. You won't be able to change clothes. -Ваша хозяйка заблокировал доступ к вашему гардеробу на неделю. Ты не сможешь переодеться. -Your owner has blocked your wardrobe access. You won't be able to change clothes until that rule is revoked. -Ваша хозяйка заблокировал доступ к вашему гардеробу. Вы не сможете переодеться, пока это правило не будет отменено. -Your owner is now allowing you to talk publicly when she's there. -Ваша хозяйка теперь позволяет вам публично разговаривать, когда она там. -Your owner is now preventing you from talking publicly when she's there. -Ваша хозяйка теперь запрещает вам публично разговаривать, когда она там. -Your owner is now allowing you to emote when she's there. -Ваша хозяйка теперь позволяет вам выражать эмоции, когда она там. -Your owner is now preventing you from emoting when she's there. -Ваша хозяйка теперь мешает вам проявлять эмоции, когда она там. -Your owner is now allowing you to whisper to other members when she's there. -Ваша хозяйка теперь позволяет вам шептаться с другими участниками, когда она там. -Your owner is now preventing you from whispering to other members when she's there. -Ваша хозяйка теперь запрещает вам шептаться с другими участниками, когда она там. -Your owner is now allowing you to change your pose when she's there. -Ваша хозяйка теперь позволяет вам менять позу, когда она рядом. -Your owner is now preventing you from changing your pose when she's there. -Ваша хозяйка теперь мешает вам менять позу, когда она рядом. -Your owner is now allowing you to access yourself when she's there. -Ваша хозяйка теперь позволяет вам получить доступ к себе, когда она там. -Your owner is now preventing you from accessing yourself when she's there. -Ваша хозяйка теперь мешает вам получить доступ к себе, когда она там. -Your owner is now allowing you to access others when she's there. -Ваша хозяйка теперь позволяет вам получать доступ к другим пользователям, когда она там. -Your owner is now preventing you from accessing others when she's there. -Ваша хозяйка теперь запрещает вам получать доступ к другим людям, когда она там. -Your owner is now allowing you to have keys. You can buy keys from the club shop. -Ваша хозяйка теперь разрешает вам иметь ключи. Вы можете купить ключи в клубном магазине. -Your owner has confiscated your keys. All your regular keys are lost. -Ваша хозяйка конфисковала ваши ключи. Все ваши обычные ключи потеряны. -Your owner is now preventing you from getting new keys. The club shop will not sell keys to you anymore. -Ваша хозяйка теперь мешает вам получить новые ключи. Клубный магазин больше не будет продавать вам ключи. -Your owner is now allowing to using owner locks on yourself. -Ваша хозяйка теперь разрешает использовать блокировки владельца на себе. -Your owner is now preventing you from using owner locks on yourself. -Ваша хозяйка теперь запрещает вам использовать блокировки владельца для себя. -Your owner is now allowing you to have remotes. You can buy remotes from the club shop. -Ваша хозяйка теперь разрешает вам иметь пульты дистанционного управления. Вы можете купить пульты дистанционного управления в клубном магазине. -Your owner is now allowing you to use remotes on yourself. -Ваша хозяйка теперь позволяет вам использовать пульты дистанционного управления самостоятельно. -Your owner has confiscated your remotes. All your remotes are lost. -Ваша хозяйка конфисковала ваши пульты дистанционного управления. Все ваши пульты дистанционного управления потеряны. -Your owner is now preventing you from getting new remotes. The club shop will not sell remotes to you anymore. -Ваша хозяйка теперь запрещает вам получать новые пульты дистанционного управления. Клубный магазин больше не будет продавать вам пульты дистанционного управления. -Your owner is now preventing you from using remotes on yourself. -Ваша хозяйка теперь запрещает вам использовать пульты дистанционного управления самостоятельно. -Your owner has locked the slave collar on your neck. -Твоя хозяйка застегнула рабский ошейник на твоей шее. -Your owner released you from the slave collar. -Твоя хозяйка освободила тебя от рабского ошейника. -Your owner is now allowing you to change your nickname. -Твоя хозяйка теперь позволяет вам изменить свой ник. -Your owner is now preventing you from changing your nickname. -Твоя хозяйка теперь запрещает вам менять свой ник. -Your lover is now allowing you to use lovers locks on yourself. -Ваша возлюбленная теперь позволяет вам использовать любовные замки на себе. -Your lover is now preventing you from using lovers locks on yourself. -Ваша возлюбленная теперь мешает вам использовать замки любовников на себе. -Your lover is now allowing your owner to use lovers locks on you. -Ваша возлюбленная теперь позволяет вашему владельцу использовать замки любовников на вашем. -Your lover is now preventing your owner from using lovers locks on you. -Ваша возлюбленная теперь запрещает вашему владельцу использовать замки любовников на вашем компьютере. -SourceCharacter is asking you to be her girlfriend. Click on her and manage your relationship to accept, don't do anything to refuse. -SourceCharacter просит вас стать ее девушкой. Нажмите на нее и управляйте своими отношениями, чтобы принять, не делайте ничего, чтобы отказаться. -The Bondage Club is pleased to announce that SourceCharacter and TargetCharacter are starting a 7 days minimum period as lovers. -The Bondage Club рад сообщить, что SourceCharacter и TargetCharacter начинают минимальный 7-дневный период в качестве любовников. -SourceCharacter is asking you to become her fiancée. Click on her and manage your relationship to accept, don't do anything to refuse. -SourceCharacter просит вас стать ее невестой. Нажмите на нее и управляйте своими отношениями, чтобы принять, не делайте ничего, чтобы отказаться. -The Bondage Club is pleased to announce that SourceCharacter and TargetCharacter are now engaged and are starting a 7 days minimum period as fiancées. -The Bondage Club рад сообщить, что SourceCharacter и TargetCharacter теперь помолвлены и начинают минимальный 7-дневный период в качестве женихов. -SourceCharacter is proposing you to become her wife. Click on her and manage your relationship to accept, don't do anything to refuse. -SourceCharacter предлагает вам стать ее женой. Нажмите на нее и управляйте своими отношениями, чтобы принять, не делайте ничего, чтобы отказаться. -The Bondage Club is proud to announce that SourceCharacter and TargetCharacter are now married. Long may it last. -The Bondage Club с гордостью сообщает, что SourceCharacter и TargetCharacter теперь женаты. Пусть это продлится долго. -SourceCharacter entered. -SourceCharacter входит. -SourceCharacter left. -SourceCharacter ушла. -SourceCharacter disconnected. -SourceCharacter отключается. -TargetCharacterName was banned by SourceCharacter. -TargetCharacterName была забанена SourceCharacter. -SourceCharacter called the maids to escort TargetCharacterName out of the room. -SourceCharacter вызвала горничных для сопровождения TargetCharacterName из комнаты. -TargetCharacterName was moved to the left by SourceCharacter. -TargetCharacterName был перемещен влево SourceCharacter. -TargetCharacterName was moved to the right by SourceCharacter. -TargetCharacterName был перемещен вправо по SourceCharacter. -SourceCharacter swapped TargetCharacterName and DestinationCharacterName places. -SourceCharacter поменяла TargetCharacterName и DestinationCharacterName местами. -SourceCharacter shuffles the position of everyone in the room randomly. -SourceCharacter случайным образом перемешивает положение всех в комнате. -TargetCharacterName was promoted to administrator by SourceCharacter. -TargetCharacterName был повышен до администратора SourceCharacter. -TargetCharacterName was demoted from administration by SourceCharacter. -TargetCharacterName был отстранен от администрирования SourceCharacter. -SourceCharacter updated the room. Name: ChatRoomName. Limit: ChatRoomLimit. ChatRoomPrivacy. ChatRoomLocked. -SourceCharacter Обновил комнату. Имя: ChatRoomName. Лимит: ChatRoomLimit. ChatRoomPrivacy. ChatRoomLocked. -SourceCharacter starts unlocking DestinationCharacterName suitcase! She will finish in 5 minutes. -SourceCharacter начинает разблокировку чемодана DestinationCharacterName ! Она закончит через 5 минут. -SourceCharacter starts stealing more data from DestinationCharacterName laptop! She will finish in 5 minutes. -SourceCharacter начинает красть больше данных из ноутбука DestinationCharacterName ! Она закончит через 5 минут. -SourceCharacter's suitcase is safe... for now. -SourceCharacter's чемодан в безопасности... пока. -SourceCharacter's data is safe... for now. -SourceCharacter's данные в безопасности... пока. -SourceCharacter's suitcase will be open in TIMEREMAINING minutes. Make sure she is secure until then! -SourceCharacter's чемодан будет открыт в течение TIMEREMAINING минут. Убедитесь, что до тех пор она в безопасности! -SourceCharacter's data will be ready in TIMEREMAINING minutes. Make sure she is secure until then! -SourceCharacter's данные будут готовы в течение TIMEREMAINING минут. Убедитесь, что до тех пор она в безопасности! -You find confidential club secrets worth MONEYAMOUNT$ on the black market. -Вы находите конфиденциальные клубные секреты, которые стоят MONEYAMOUNT$ на черном рынке. -The kidnappers opened your suitcase, which contains a laptop with a bunch of secret information. You better get back to the league to warn them. -Похитители открыли ваш чемодан, в котором находится ноутбук с кучей секретной информации. Тебе лучше вернуться в лигу, чтобы предупредить их. -The kidnappers have stolen even more data using your laptop. -Похитители украли еще больше данных с помощью вашего ноутбука. -You have disabled OOC/whispers while gagged. You can change this in the Immersion preferences screen. -Вы отключили OOC/whispers с кляпом во рту. Вы можете изменить это на экране настроек погружения. -You choke momentarily on the gag inside your throat. -Ты на мгновение задыхаешься от кляпа в горле. -It is difficult to breath with the gag pushing inside your throat. -Трудно дышать из-за кляпа, застрявшего в горле. -Your jaw aches from the gag shoved down your throat. -Твоя челюсть болит от кляпа, засунутого тебе в горло. -Your crotch rope rubs against your vulva. -Твоя веревка в промежности трется о твою вульву. -The knot on your crotch rope rubs against your clitoris. -Узел на веревке в промежности трется о ваш клитор. -The rope between your legs digs into your crotch. -Веревка между ног впивается в промежность. -You feel the dildo shift around inside of you. -Вы чувствуете, как фаллоимитатор перемещается внутри вас. -You notice the large plug stuffed between your legs. -Вы замечаете большую пробку, засунутую у вас между ног. -The dildo inside of you teases you constantly. -Фаллоимитатор внутри тебя постоянно дразнит тебя. -The plug inside of you shifts around as you move. -Пробка внутри вас смещается по мере того, как вы двигаетесь. -Your butt plug stimulates you constantly as you move around. -Ваша анальная пробка постоянно стимулирует вас, когда вы двигаетесь. -The plug inside your butt feels awkward as you move. -Пробка внутри вашей задницы кажется неудобной, когда вы двигаетесь. -The plugs keep reminding you of their presence. -Заглушки постоянно напоминают вам о своем присутствии. -Your plugs torment you endlessly. -Ваши пробки бесконечно мучают вас. -The plugs stuffed inside you keep you constantly on edge. -Пробки, засунутые внутрь вас, постоянно держат вас на взводе. -The vibration in your sensitive areas is impossible to ignore. -Вибрацию в ваших чувствительных зонах невозможно игнорировать. -Your body trembles from the vibrators' constant stimulation. -Ваше тело дрожит от постоянной стимуляции вибраторов. -You can't stop noticing the vibrators teasing you. -Вы не можете перестать замечать вибраторы, дразнящие вас. -The vibration deep inside of you teases you relentlessly. -Вибрация глубоко внутри вас безжалостно дразнит вас. -The plug inside of you vibrates endlessly. -Пробка внутри вас бесконечно вибрирует. -The vibrator inside of you keeps you on edge. -Вибратор внутри тебя держит тебя на взводе. -Your butt feels numb from the vibrations. -Ваша задница немеет от вибраций. -The vibrations in your butt leave you panting without release. -Вибрации в вашей заднице заставляют вас задыхаться без разрядки. -The vibrator inside your butt teases you constantly. -Вибратор внутри твоей задницы постоянно дразнит тебя. -Type /help for a list of commands -Введите /help для получения списка команд -You are not on that member's friendlist; ask her to friend you before leashing her. -Вас нет в списке друзей этого участника; попросите ее подружиться с вами, прежде чем привязывать ее. -SourceCharacter swaps a PrevAsset for a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter меняет местами PrevAsset на NextAsset на DestinationCharacter FocusAssetGroup. -SourceCharacter uses a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter использует NextAsset на DestinationCharacter FocusAssetGroup. -SourceCharacter changes the color of NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter изменяет цвет NextAsset на DestinationCharacter FocusAssetGroup. -SourceCharacter locks a NextAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter блокирует NextAsset на DestinationCharacter FocusAssetGroup. -SourceCharacter adds a NextAsset on DestinationCharacter FocusAssetGroup PrevAsset. -SourceCharacter добавляет NextAsset на DestinationCharacter FocusAssetGroup PrevAsset. -SourceCharacter removes the PrevAsset from DestinationCharacter FocusAssetGroup. -SourceCharacter удаляет PrevAsset на DestinationCharacter FocusAssetGroup. -SourceCharacter unlocks the PrevAsset on DestinationCharacter FocusAssetGroup. -SourceCharacter разблокирует PrevAsset на DestinationCharacter FocusAssetGroup. -SourceCharacter picks the lock on DestinationCharacter PrevAsset. -SourceCharacter вскрывает замок на DestinationCharacter PrevAsset. -SourceCharacter unlocks and removes the PrevAsset from DestinationCharacter FocusAssetGroup. -SourceCharacter разблокирует и удаляет PrevAsset на DestinationCharacter FocusAssetGroup. -SourceCharacter rolls DiceType. The result is: DiceResult. -SourceCharacter бросает DiceType. Результат таков: DiceResult. -SourceCharacter flips a coin. The result is: CoinResult. -SourceCharacter подбрасывает монетку. Результат таков: CoinResult. -SourceCharacter used her safeword. Please check for her well-being. -SourceCharacter использовала свое стоп-слово. Пожалуйста, проверьте ее самочувствие. -SourceCharacter used her safeword and wants to be released. She is guided out of the room for her safety. -SourceCharacter использовала свое стоп-слово и хочет, чтобы ее освободили. Ее выводят из комнаты в целях ее безопасности. -TargetCharacterName gets grabbed by two maids and locked in a timer cell, following her owner's commands. -TargetCharacterName хватают две служанки и запирают в камере с таймером, следуя командам твоей хозяйки. -TargetCharacterName gets grabbed by two nurses wearing futuristic gear and locked in the Asylum for GGTS, following her owner's commands. -TargetCharacterName хватают две медсестры в футуристическом снаряжении и запирают в Лечебнице для GGTS, следуя командам ее хозяйки. -TargetCharacterName gets grabbed by two maids and escorted to the maid quarters to serve drinks for her owner. -TargetCharacterName хватают две горничные и сопровождают в комнату для прислуги, чтобы подать напитки для ее хозяики. -TargetCharacterName gives a sealed envelope to her owner. -TargetCharacterName отдает запечатанный конверт своей хозяйке. -SourceCharacter hits DestinationCharacter FocusAssetGroup with a NextAsset. -SourceCharacter попадает в DestinationCharacter FocusAssetGroup с помощью NextAsset. -SourceCharacter holds a NextAsset against DestinationCharacter FocusAssetGroup. -SourceCharacter удерживает NextAsset против DestinationCharacter FocusAssetGroup. -SourceCharacter tickles DestinationCharacter FocusAssetGroup with a NextAsset. -SourceCharacter щекочет DestinationCharacter FocusAssetGroup с помощью NextAsset. -SourceCharacter rubs DestinationCharacter FocusAssetGroup with a NextAsset. -SourceCharacter трет DestinationCharacter FocusAssetGroup с помощью NextAsset. -SourceCharacter rolls a NextAsset over DestinationCharacter FocusAssetGroup. -SourceCharacter переносит NextAsset поверх DestinationCharacter FocusAssetGroup. -SourceCharacter pours NextAsset onto DestinationCharacter FocusAssetGroup. -SourceCharacter наливает NextAsset DestinationCharacter FocusAssetGroup. -SourceCharacter shocks DestinationCharacter FocusAssetGroup with a NextAsset. -SourceCharacter шокирует DestinationCharacter FocusAssetGroup с помощью NextAsset. -SourceCharacter was interrupted while trying to use a NextAsset on TargetCharacter. -SourceCharacter был прерван при попытке использовать NextAsset на TargetCharacter. -SourceCharacter was interrupted while going for the PrevAsset on TargetCharacter. -SourceCharacter был прерван, когда шел за PrevAsset на TargetCharacter. -SourceCharacter was interrupted while swapping a PrevAsset for a NextAsset on TargetCharacter. -SourceCharacter was был прерван при замене PrevAsset на NextAsset на TargetCharacter. -SourceCharacter slowly heads for the door. -SourceCharacter медленно направляется к двери. -SourceCharacter stops heading for the door. -SourceCharacter перестает идти к двери. -SourceCharacter was stopped from leaving. -SourceCharacter был остановлен от попытки выхода. -SourceCharacter gets in the way of TargetCharacter -SourceCharacter встаёт на пути TargetCharacter -SourceCharacter tries to help TargetCharacter to struggle free. -SourceCharacter пытается помочь TargetCharacter освободится. -SourceCharacter gives TargetCharacter some lockpicks to help herself with. -SourceCharacter даёт TargetCharacter несколько отмычек, чтобы помочь ей. -SourceCharacter grabs the leash of TargetCharacter. -SourceCharacter хватает поводок на TargetCharacter. -SourceCharacter releases the leash of TargetCharacter. -SourceCharacter отпускает поводок на TargetCharacter. -SourceCharacter picks a glass of water from DestinationCharacter tray. -SourceCharacter берёт стакан воды из подноса DestinationCharacter . -SourceCharacter picks an orange juice from DestinationCharacter tray. -SourceCharacter берёт апельсиновый сок из подноса DestinationCharacter . -SourceCharacter picks a beer from DestinationCharacter tray. -SourceCharacter берёт пиво из подноса DestinationCharacter . -SourceCharacter picks a glass of wine from DestinationCharacter tray. -SourceCharacter берёт бокал вина из подноса DestinationCharacter . -SourceCharacter buys a Virgin Mojito from DestinationCharacter tray. -SourceCharacter покупает Девственный Мохито у DestinationCharacter . -SourceCharacter buys a Margarita from DestinationCharacter tray. -SourceCharacter покупает "Маргарита" у DestinationCharacter . -SourceCharacter buys a glass of Whiskey from TargetCharacter. -SourceCharacter покупает стакан виски у TargetCharacter. -SourceCharacter buys a glass of champagne from TargetCharacter. -SourceCharacter покупает бокал шампанского у TargetCharacter. -SourceCharacter buys a jug of refreshing lemonade for everyone, from TargetCharacter. -SourceCharacter покупает кувшин освежающего лимонада для всех, у TargetCharacter. -SourceCharacter buys a round of shooters for everyone, from TargetCharacter. -SourceCharacter покупает партию "стрелялок" для всех, у TargetCharacter. -SourceCharacter buys a jug of Sex on the Beach for everyone, from TargetCharacter. -SourceCharacter покупает кувшин "Секса на пляже" для всех, у TargetCharacter. -SourceCharacter buys a beer pitcher for everyone, from TargetCharacter. -SourceCharacter покупает пивной кувшин для всех, у TargetCharacter. -SourceCharacter picks a tea from DestinationCharacter tray. -SourceCharacter выбирает чай из подноса DestinationCharacter . -SourceCharacter picks a coffee from DestinationCharacter tray. -SourceCharacter выбирает кофе из подноса DestinationCharacter . -SourceCharacter buys a hot chocolate from DestinationCharacter tray. -SourceCharacter покупает горячий шоколад у DestinationCharacter . -SourceCharacter buys an espresso from DestinationCharacter tray. -SourceCharacter покупает эспрессо у DestinationCharacter . -SourceCharacter buys a cappuccino from DestinationCharacter tray. -SourceCharacter покупает капучино у DestinationCharacter . -Member number on lock: -Номер участника на замке: -Item member number: -Номер предмета участника: -Time left: -Времени осталось: -SourceCharacter restarts the five minutes timer padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter перезапускает пятиминутный таймер блокировки на DestinationCharacter FocusAssetGroup. -Unknown time left -Осталось неизвестное время -Restart Timer -Перезапустить таймер -SourceCharacter adds TimerTime TimerUnit to the padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter добавляет TimerTime TimerUnit к замку на DestinationCharacter FocusAssetGroup. -SourceCharacter removes TimerTime TimerUnit to the padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter удаляет TimerTime TimerUnit к замку на DestinationCharacter FocusAssetGroup. -an unknown amount of time -неизвестное количество времени -The LockName on DestinationCharacterName FocusAssetGroup opens with a click -LockName на DestinationCharacterName FocusAssetGroup открывается щелчком мыши -SourceCharacter updates the key settings for the lock on DestinationCharacter FocusAssetGroup -SourceCharacter обновляет настройки ключа для блокировки на DestinationCharacter FocusAssetGroup -Save key list -Сохранить список ключей -Enter keyholders' member numbers separated by commas. -Введите номера участников держателей ключей, разделенные запятыми. -You don't have keys, saving will remove your access -У вас нет ключей, сохранение удалит ваш доступ -Append lovers -Добавить возлюбленную -Append owner -Добавить хозяйку -Append whitelist -Добавить белый список -Current Mode: -Текущий режим: -Increase intensity -Увеличить интенсивность -Decrease intensity -Уменьшить интенсивность -Turn off -Выключить -Edge mode -Пограничный режим -Random mode -Случайный режим -Deny mode -Режим запрета -Tease mode -Дразнящий режим -Trigger Shock -Триггерный шок -Save Voice Commands -Сохранить голосовые команды -SourceCharacter changes the voice command settings on DestinationCharacter FocusAssetGroup. -SourceCharacter изменяет настройки голосовых команд на DestinationCharacter FocusAssetGroup. -DestinationCharacterName vibrator switches modes! -DestinationCharacterName вибратор переключает режимы! -DestinationCharacterName vibrator lets out a sharp jolt! -DestinationCharacterName вибратор выпускает резкий толчок! -Anyone -Кто угодно -Others -Другие -Lock Member -Заблокировать участника -SourceCharacter tries the code CombinationNumber but fails to open the padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter пробует код CombinationNumber но не удается открыть замок на DestinationCharacter FocusAssetGroup. -SourceCharacter changes the code of the padlock on DestinationCharacter FocusAssetGroup. -SourceCharacter меняет код замка на DestinationCharacter FocusAssetGroup. -SourceCharacter tries to change the code of the padlock on DestinationCharacter FocusAssetGroup but fails. -SourceCharacter пытается изменить код замка на DestinationCharacter FocusAssetGroup но провалилась. -SourceCharacter tries the word Password but fails to open the lock on DestinationCharacter FocusAssetGroup. -SourceCharacter пытается ввести слово Password но не может открыть замок на DestinationCharacter FocusAssetGroup. -SourceCharacter changes the password of the lock on DestinationCharacter FocusAssetGroup. -SourceCharacter меняет пароль блокировки на DestinationCharacter FocusAssetGroup. -Enable random input of time from everyone else -Включить случайный ввод времени от всех остальных -Add TimerTime minutes to the Timer -Добавить TimerTime минут к таймеру -Add -Добавить -Remove item when the lock timer runs out -Удалить предмет, когда таймер блокировки истечет -The item will be removed when the lock timer runs out -Предмет будет удален, когда таймер блокировки истечет. -The item will stay when the lock timer runs out -Предмет останется, когда таймер блокировки истечет. -Show the time remaining/being added -Показать оставшееся/добавляемое время -Random -Случайный -minutes -минуты -hours -часы -Current Code : -Текущий код : -New Code : -Новый код : -Open lock -Открыть замок -Change code -Изменить код -Wrong code -Неправильный код -Use 4 digits as a code -Используйте 4 цифры в качестве кода -Remove on Unlock: -Удалить при разблокировке: -Enter Password : -Введите пароль : -Set password: -Установить пароль: -Set hint text: -Установить текст подсказки: -Accept -Принять -Wrong password -Неправильный пароль -Password must be 8 or fewer letters only -Пароль должен состоять только из 8 или менее букв -Locked by: -Заблокировано: -Locked on: -Заблокировано: -This person is locked by different people -Этот человек заблокирован разными людьми -This person is fully locked by: -Этот человек полностью заблокирован: -This person is fully locked by you -Этот человек полностью заблокирован вами -Select the bondage position -Выбери положение бондажа -Select the tape wrapping -Выберите обмотку лентой -Select an item attachment -Выберите вложение предмета -Select the piercing attachment -Выберите насадку для пирсинга -A victim cannot unlock herself if her elbows are bound -Жертва не может разблокировать себя, если ее локти связаны -DestinationCharacterName jammed a lock and broke her lockpick! -DestinationCharacterName заклинил замок и сломал отмычку! -Remaining tries: -Оставшиеся попытки: -Failing or quitting will break your lockpick for 1 minute -При провале или выходе ваша отмычка сломается на 1 минуту -You jammed the lock. -Вы заблокировали замок. -You are too tired to continue. Time remaining: -Вы слишком устали, чтобы продолжать. Оставшееся время: -Click the pins in the correct order to open the lock! -Нажмите на булавки в правильном порядке, чтобы открыть замок! -Clicking the wrong pin may falsely set it. -Нажатие на неправильный контакт может привести к его ложной установке. -It will fall back after clicking other pins. -Он отступит после нажатия других контактов. -Your hands are shaky and you lose some tension by accident! -Твои руки трясутся, и ты случайно теряешь напряжение! -"From your friendly hardware store" -"Из вашего дружелюбного хозяйственного магазина" -"Only one key works, but it can be picked" -"Работает только один ключ, но его можно подобрать" -"Won't be getting picked on the streets" -"Не будет подобран на улицах" -You can restart the timer but cannot unlock -Вы можете перезапустить таймер, но не можете разблокировать -"If at first, you don't succeed..." -"Если сначала у вас не получится..." -"Never forget who you belong to" -"Никогда не забывай, кому ты принадлежишь" -Can only be locked or unlocked by her owner -Может быть заблокирована или разблокирована только её хозяйкой -Can only be unlocked or extended by her owner -Может быть разблокирована или продлена только её хозяйкой -"A loving embrace" -"Любящие объятия" -Can only be locked or unlocked by her lover -Может быть заблокирована или разблокирована только её возлюбленной -Can only be unlocked or extended by her lover -Может быть разблокирована или пролена только её возлюбленной -Can only be locked or unlocked by a Club Mistress -Может быть заблокирована или разблокирована только Хозяйкой Клуба. -"Once inside the Box, you may never leave." -"Оказавшись внутри Коробки, вы никогда не сможете покинуть ее." -Can only be unlocked or extended by a Club Mistress -Может быть разблокирована или продлена только Хозяйкой Клуба. -"Keeping you safe from yourself" -"Хранить вас в безопасности от себя" -Can be opened by anyone but the wearer -Может быть открыт кем угодно, кроме владельца -"Finders keepers" -"Искатели хранители" -Can be opened only with the correct password -Можно открыть только с правильным паролем -In-front of body -Перед телом -Behind back -за спиной -SourceCharacter cuffs DestinationCharacter hands in-front of their body. -SourceCharacter запирает DestinationCharacter в наручники перед её телом. -SourceCharacter cuffs DestinationCharacter hands behind their back. -SourceCharacter запирает DestinationCharacter в наручники за её спиной. -On head level -На уровне головы -Over the head -Над головой -SourceCharacter lowers the ceiling shackles on TargetCharacter a bit. -SourceCharacter немного снижает потолочные кандалы на TargetCharacter . -SourceCharacter raises the ceiling shackles on TargetCharacter over her head. -SourceCharacter поднимает кандалы потолка на TargetCharacter над головой. -SourceCharacter detaches the shackles on TargetCharacter from the floor. -SourceCharacter снимает кандалы на TargetCharacter с пола. -SourceCharacter attaches the shackles on TargetCharacter to the floor. -SourceCharacter прикрепляет кандалы TargetCharacter к полу. -Select ring configuration -Выберите конфигурацию кольца -Without ring -Без кольца -With ring -С кольцом -SourceCharacter removes the ring from DestinationCharacter collar. -SourceCharacter снимает кольцо с ошейника DestinationCharacter . -SourceCharacter attaches a ring to DestinationCharacter collar. -SourceCharacter прикрепляет кольцо к ошейнику DestinationCharacter . -Detached -Отдельный -Bind wrists -Связать запястья -Bind elbows -Связать локти -Bind both -Связать оба -SourceCharacter detaches the chain from DestinationCharacter leather cuffs. -SourceCharacter отстегивает цепочку от кожаных манжет DestinationCharacter . -SourceCharacter attaches the leather cuffs wrist chain behind DestinationCharacter back. -SourceCharacter прикрепляет кожаную цепочку на запястье за спиной DestinationCharacter . -SourceCharacter attaches the leather cuffs elbow chain behind DestinationCharacter back. -SourceCharacter прикрепляет кожаные манжеты на локте за спиной DestinationCharacter . -SourceCharacter attaches the leather cuffs wrist and elbow chains behind DestinationCharacter back. -SourceCharacter прикрепляет кожаные манжеты на запястья и локтевые цепи за спиной DestinationCharacter . -SourceCharacter detaches DestinationCharacter steel cuffs. -SourceCharacter снимает с DestinationCharacter стальные манжеты. -SourceCharacter attaches DestinationCharacter steel cuffs behind her back. -SourceCharacter прикрепляет к DestinationCharacter стальные наручники за спиной. -SourceCharacter detaches the chain from DestinationCharacter futuristic cuffs. -SourceCharacter снимает цепочку с футуристических манжет DestinationCharacter . -SourceCharacter attaches the futuristic cuffs wrist chain behind DestinationCharacter back. -SourceCharacter прикрепляет футуристическую цепочку на запястье за спиной DestinationCharacter . -SourceCharacter attaches the futuristic cuffs elbow chain behind DestinationCharacter back. -SourceCharacter прикрепляет футуристические манжеты на локте за спиной DestinationCharacter . -SourceCharacter attaches the futuristic cuffs wrist and elbow chains behind DestinationCharacter back. -SourceCharacter прикрепляет футуристические манжеты на запястья и локтевые цепи за спиной DestinationCharacter . -SourceCharacter detaches the chain from DestinationCharacter futuristic leg cuffs. -SourceCharacter снимает цепь с футуристических набедренников DestinationCharacter . -SourceCharacter attaches the futuristic leg cuffs chain on DestinationCharacter legs. -SourceCharacter прикрепляет футуристические ножные наручники к ногам DestinationCharacter . -SourceCharacter detaches the chain from DestinationCharacter futuristic ankle cuffs. -SourceCharacter снимает цепочку с футуристических манжет на лодыжках DestinationCharacter . -SourceCharacter attaches the futuristic ankle cuffs chain on DestinationCharacter ankles. -SourceCharacter прикрепляет футуристические браслеты на щиколотках к лодыжкам DestinationCharacter . -Chain Closed -Цепь закрыта -Chain Attached -Цепь прикреплена -SourceCharacter detaches the chain from DestinationCharacter leather leg cuffs. -SourceCharacter снимает цепочку с кожаных набедренников DestinationCharacter . -SourceCharacter attaches the leather leg cuffs chain on DestinationCharacter legs. -SourceCharacter прикрепляет кожаные наручники к ногам DestinationCharacter legs. -Attached -Прикрепить -SourceCharacter detaches DestinationCharacter AssetName. -SourceCharacter отсоединяет DestinationCharacter AssetName. -SourceCharacter attaches DestinationCharacter AssetName. -SourceCharacter прикрепляет DestinationCharacter AssetName. -SourceCharacter attaches the chain on DestinationCharacter AssetName. -SourceCharacter прикрепляет цепочку к DestinationCharacter AssetName. -Select tentacle position -Выберите положение щупальца -Legs Together -Ноги вместе -Legs Spread -Раздвинутые ноги -SourceCharacter uses the tentacles to bind DestinationCharacter ankles together. -SourceCharacter использует щупальца, чтобы связать вместе лодыжки DestinationCharacter . -SourceCharacter uses the tentacles to spread DestinationCharacter legs apart. -SourceCharacter персонаж использует щупальца, чтобы расставить ноги DestinationCharacter . -SourceCharacter uses the tentacles to bind DestinationCharacter arms behind her back. -SourceCharacter использует щупальца, чтобы связать руки DestinationCharacter за спиной. -SourceCharacter uses the tentacles to hold DestinationCharacter arms above her head. -SourceCharacter использует щупальца, чтобы держать руки DestinationCharacter над головой. -SourceCharacter detaches the chain from DestinationCharacter Ornate cuffs. -SourceCharacter отсоединяет цепочку от изысканных манжет DestinationCharacter . -SourceCharacter attaches the Ornate cuffs wrist chain behind DestinationCharacter back. -SourceCharacter прикрепляет изысканные манжеты на запястье за спиной DestinationCharacter . -SourceCharacter attaches the Ornate cuffs elbow chain behind DestinationCharacter back. -SourceCharacter прикрепляет изысканные манжеты на локти за спиной DestinationCharacter . -SourceCharacter attaches the Ornate cuffs wrist and elbow chains behind DestinationCharacter back. -SourceCharacter прикрепляет изысканные манжеты на запястья и локти за спиной DestinationCharacter . -SourceCharacter detaches the chain from DestinationCharacter Ornate leg cuffs. -SourceCharacter снимает цепочку с изысканных манжет на ногах DestinationCharacter Ornate . -SourceCharacter attaches the Ornate leg cuffs chain on DestinationCharacter legs. -SourceCharacter прикрепляет изысканные манжеты на ногах к ногам DestinationCharacter legs. -SourceCharacter detaches the chain from DestinationCharacter Ornate ankle cuffs. -SourceCharacter отсоединяет цепочку от изысканных манжет DestinationCharacter на щиколотках. -SourceCharacter attaches the Ornate ankle cuffs chain on DestinationCharacter ankles. -SourceCharacter прикрепляет изысканные манжеты на щиколотках к лодыжкам DestinationCharacter . -How tight do you want to strap the jacket? -Насколько туго вы хотите застегнуть куртку? -Snug -Уютно -Tight -Туго -SourceCharacter loosens the straps on DestinationCharacter straitjacket. -SourceCharacter ослабляет ремни на смирительной рубашке DestinationCharacter . -SourceCharacter adjusts the straps normally on DestinationCharacter straitjacket. -SourceCharacter регулирует лямки в нормальное состояние на смирительной рубашке DestinationCharacter . -SourceCharacter snugs the straps on DestinationCharacter straitjacket. -SourceCharacter застегивает лямки смирительной рубашки DestinationCharacter . -SourceCharacter tightens the straps on DestinationCharacter straitjacket. -SourceCharacter затягивает ремни на смирительной рубашке DestinationCharacter . -SourceCharacter loosens the straps on DestinationCharacter leather straitjacket. -SourceCharacter ослабляет ремни на кожаной смирительной рубашке DestinationCharacter . -SourceCharacter adjusts the straps normally on DestinationCharacter leather straitjacket. -SourceCharacter регулирует лямки в нормальное состояние на кожаной смирительной рубашке DestinationCharacter . -SourceCharacter snugs the straps on DestinationCharacter leather straitjacket. -SourceCharacter застегивает лямки кожаной смирительной рубашки DestinationCharacter . -SourceCharacter tightens the straps on DestinationCharacter leather straitjacket. -SourceCharacter затягивает ремни на кожаной смирительной рубашке DestinationCharacter . -How tight do you want the strap linking the cuffs? -Насколько тугой должен быть ремешок, соединяющий манжеты? -SourceCharacter loosens the strap on DestinationCharacter collar cuffs. -SourceCharacter персонаж ослабляет ремешок на манжетах воротника DestinationCharacter . -SourceCharacter adjusts the strap normally on DestinationCharacter collar cuffs. -SourceCharacter регулирует в нормальне состояние ремешок на манжетах воротника DestinationCharacter . -SourceCharacter snugs the strap on DestinationCharacter collar cuffs. -SourceCharacter плотно прилегает ремешком к манжетам воротника DestinationCharacter . -SourceCharacter tightens the strap on DestinationCharacter collar cuffs. -SourceCharacter затягивает ремешок на манжетах воротника DestinationCharacter collar cuffs. -How much do you want to inflate the body bag? -Насколько сильно вы хотите надуть мешок для тела? -Max -Максимально -SourceCharacter adjusts DestinationCharacter inflatable body bag to be only lightly filled. -SourceCharacter настраивает надувной мешок для тела DestinationCharacter так, чтобы он был только слегка наполнен. -SourceCharacter adjusts DestinationCharacter inflatable body bag to be half filled. -SourceCharacter настраивает надувной мешок для тела DestinationCharacter так, чтобы он был заполнен наполовину. -SourceCharacter adjusts DestinationCharacter inflatable body bag to three quarters filled. -SourceCharacter наполняет надувной мешок для тела DestinationCharacter на три четверти. -SourceCharacter adjusts DestinationCharacter inflatable body bag to fill the maximum amount. -SourceCharacter настраивает надувной мешок для тела DestinationCharacter так, чтобы он был полностью заполнен. -Select belt tightness? -Выбрать натяжение ремня? -Tight with belts -Туго затянутые ремни -SourceCharacter wraps TargetCharacterName comfortably in a fur blanket. -SourceCharacter удобно оборачивает TargetCharacterName в меховое одеяло. -SourceCharacter wraps TargetCharacterName tightly in a fur blanket. -SourceCharacter плотно оборачивает TargetCharacterName меховым одеялом. -SourceCharacter wraps TargetCharacterName tightly in a fur blanket with belts. -SourceCharacter плотно оборачивает TargetCharacterName меховым одеялом с ремнями. -Select Position -Выберите позицию -Kneel -Стоять на коленях -All Fours -На четвереньках -Suspension -Подвесить -SourceCharacter throws a net over TargetCharacterName . -SourceCharacter набрасывает сеть на TargetCharacterName . -SourceCharacter adds some weights to the net forcing TargetCharacterName down on all fours. -SourceCharacter добавляет свой вес к сетке, заставляя TargetCharacterName опускаться на четвереньки. -SourceCharacter suspends TargetCharacterName up in the air. -SourceCharacter подвешивает TargetCharacterName в воздухе. -How many leather belts do you want to apply? -Сколько кожаных ремней вы хотите применить? -One -Один -Two -Два -Three -Три -Four -Четыре -SourceCharacter restrains TargetCharacter with only one sturdy leather belt. -SourceCharacter сдерживает TargetCharacter только одним прочным кожаным ремнем. -SourceCharacter restrains TargetCharacter with two sturdy leather belts. -SourceCharacter сдерживает TargetCharacter двумя крепкими кожаными ремнями. -SourceCharacter restrains TargetCharacter with three sturdy leather belts. -SourceCharacter сдерживает TargetCharacter тремя крепкими кожаными ремнями. -SourceCharacter restrains TargetCharacter with four sturdy leather belts. -SourceCharacter сдерживает TargetCharacter четырьмя прочными кожаными ремнями. -No straps -Без лямок -Full -Полностью -SourceCharacter removes the leather belts from DestinationCharacter body. -SourceCharacter удаляет кожаные ремни с тела DestinationCharacter . -SourceCharacter loosely restrains TargetCharacter to the bondage bench with few leather belts. -SourceCharacter свободно привязывает TargetCharacter к скамье для бондажа несколькими кожаными ремнями. -SourceCharacter restrains TargetCharacter to the bondage bench with a handful of leather belts. -SourceCharacter привязывает TargetCharacter к скамье для бондажа с помощью нескольких кожаных ремней. -SourceCharacter strictly restrains TargetCharacter to the bondage bench with a good amount of leather belts. -SourceCharacter сильно привязывает TargetCharacter к скамье для бондажа с большим количеством кожаных ремней. -SourceCharacter fully restrains TargetCharacter to the bondage bench with a large amount of leather belts. -SourceCharacter полностью привязывает TargetCharacter к скамье для бондажа с большим количеством кожаных ремней. -Hands -Запястья -Arms -Руки -Skirt -Юбка -Torso -Торс -Mummy -Мумия -Full Mummy -Полная Мумия -Exposed Full Mummy -Выставленная напоказ полная мумия -Pet Tape -Лента для домашних животных -SourceCharacter wraps duct tape around DestinationCharacter hands. -SourceCharacter обматывает руки DestinationCharacter изолентой. -SourceCharacter removes some of the duct tape from DestinationCharacter torso. -SourceCharacter удаляет часть клейкой ленты с туловища DestinationCharacter . -SourceCharacter creates a duct tape skirt on TargetCharacter and traps her hands in it. -SourceCharacter создает юбку из клейкой ленты на TargetCharacter и захватывает в нее свои руки. -SourceCharacter creates a duct tape top on TargetCharacter and traps her arms in it. -SourceCharacter наматывает на TargetCharacter верхнюю часть клейкой ленты и заключает в нее ее руки. -SourceCharacter creates a duct tape mummy on TargetCharacter and traps her arms in it. -SourceCharacter создает мумию из клейкой ленты на TargetCharacter и заключает в ловушку ее руки. -SourceCharacter creates a completed duct tape mummy on TargetCharacter and traps her entire upper body in it. -SourceCharacter создает готовую мумию из клейкой ленты на TargetCharacter и заключает в нее всю ее верхнюю часть тела. -SourceCharacter creates a completed duct tape mummy on TargetCharacter and cuts a hole so that her breasts are exposed. -SourceCharacter создает готовую мумию из клейкой ленты на TargetCharacter и вырезает дыру, чтобы ее грудь была видна. -SourceCharacter folds DestinationCharacter arms and wraps duct tape around them. -SourceCharacter складывает руки DestinationCharacter и обматывает их изолентой. -Above head -Над головой -SourceCharacter shackles DestinationCharacter wrist in-front of their body. -SourceCharacter сковывает запястье DestinationCharacter перед своим телом. -SourceCharacter shackles DestinationCharacter wrist behind their back. -SourceCharacter сковывает запястье DestinationCharacter за спиной. -SourceCharacter shackles DestinationCharacter wrist above their head. -SourceCharacter сковывает запястье DestinationCharacter над головой. -Select strap type -Выберите тип ремешка -Ring Straps -Кольцевые ремни -Wrapping Straps -Оберточные ремни -Strapless -Без бретелек -SourceCharacter puts an armbinder with ring straps on DestinationCharacter arms. -SourceCharacter надевает армбиндер с кольцами на руки DestinationCharacter . -SourceCharacter puts an armbinder with wrapping straps on DestinationCharacter arms. -SourceCharacter надевает армбиндер с ремнями на руки DestinationCharacter . -SourceCharacter puts a strapless armbinder on DestinationCharacter arms. -SourceCharacter надевает армбиндер без бретелек на руки DestinationCharacter . -Select the type of gag -Выбери тип кляпа -Small -Маленький -Cleave -В зубах -OTM -Через рот -OTN -Через нос -SourceCharacter ties the cloth into a small gag over DestinationCharacter mouth. -SourceCharacter завязывает ткань в небольшой кляп на рту DestinationCharacter . -SourceCharacter ties the cloth into a cleave gag over DestinationCharacter mouth. -SourceCharacter завязывает ткань в кляп над ртом DestinationCharacter . -SourceCharacter ties the cloth into a large gag over DestinationCharacter mouth. -SourceCharacter завязывает ткань в большой кляп на рту DestinationCharacter mouth. -SourceCharacter ties the cloth into a large gag over DestinationCharacter mouth and nose. -SourceCharacter завязывает ткань в большой кляп на рту и носу DestinationCharacter . -SourceCharacter ties the scarf loosely over DestinationCharacter mouth. -SourceCharacter свободно завязывает шарф вокруг рта DestinationCharacter . -SourceCharacter ties the scarf covering DestinationCharacter mouth and nose. -SourceCharacter завязывает шарф, закрывающий рот и нос DestinationCharacter . -Single strip -Одна полоса -Crossed strips -Перекрещенные полосы -Full face -Полное лицо -Double layer -Двухслойный -SourceCharacter puts a piece of duct tape on DestinationCharacter mouth. -SourceCharacter заклеивает рот DestinationCharacter куском клейкой ленты. -SourceCharacter crosses two pieces of duct tape on DestinationCharacter mouth. -SourceCharacter скрещивает два куска скотча на рту DestinationCharacter . -SourceCharacter fully tapes DestinationCharacter mouth. -SourceCharacter полностью заклеевает рот DestinationCharacter . -SourceCharacter fully tapes DestinationCharacter mouth with double layers. -SourceCharacter полностью заклеевает рот DestinationCharacter двойным слоем. -SourceCharacter wraps many layers on DestinationCharacter mouth. -SourceCharacter накладывает много слоев на рот DestinationCharacter mouth. -Shiny -Блестящий -Plugged -Заткнутый -Open -Открытый -SourceCharacter plugs up DestinationCharacter mouth. -SourceCharacter персонаж затыкает рот DestinationCharacter . -SourceCharacter pulls out DestinationCharacter plug from her gag. -SourceCharacter вытаскивает пробку из кляпа DestinationCharacter . -SourceCharacter configures DestinationCharacter visor to be transparent. -SourceCharacter настраивает визор DestinationCharacter так, чтобы он был прозрачным. -SourceCharacter configures DestinationCharacter visor to be fully opaque. -SourceCharacter настроил визор DestinationCharacter так, чтобы он был полностью непрозрачным. -Transparent -Прозрачный -Blind -Слепой -SourceCharacter configures DestinationCharacter visor to fade slightly. -SourceCharacter настроил визор DestinationCharacter так, чтобы он был слегка затемнён. -SourceCharacter configures DestinationCharacter visor to be heavily tinted. -SourceCharacter настроил визор DestinationCharacter так, чтобы он был сильно затемнён. -Light Tint -Слегка затемнён -Heavy Tint -Сильно затемнён -Select the type of visor -Выберите тип визора -SourceCharacter logs DestinationCharacter headset into the virtual world as her real self. -SourceCharacter регистрирует гарнитуру DestinationCharacter в виртуальном мире как свое реальное "я". -SourceCharacter logs DestinationCharacter headset into the virtual world as a custom avatar. -SourceCharacter регистрирует гарнитуру DestinationCharacter в виртуальном мире в качестве пользовательского аватара. -SourceCharacter configures DestinationCharacter headset to display the surroundings through a camera feed. -SourceCharacter настраивает гарнитуру DestinationCharacter для отображения окружения через канал камеры. -SourceCharacter turns off DestinationCharacter headset. -SourceCharacter отключает гарнитуру DestinationCharacter . -SourceCharacter boots up Kinky Dungeon on DestinationCharacter headset. -SourceCharacter загружает Kinky Dungeon на гарнитуре DestinationCharacter . -SourceCharacter turns off DestinationCharacter game. -SourceCharacter отключает игру DestinationCharacter . -SourceCharacter removes the background on DestinationCharacter headset. -SourceCharacter удаляет фон на гарнитуре DestinationCharacter . -SourceCharacter sets the background on DestinationCharacter headset to a virtual realm. -SourceCharacter устанавливает фон гарнитуры DestinationCharacter на виртуальное царство. -SourceCharacter sets the background on DestinationCharacter headset headset to a dark dungeon. -SourceCharacter устанавливает фон гарнитуры DestinationCharacter headset на тёмное подземелье. -SourceCharacter sets the background on DestinationCharacter headset to a high-tech environment. -SourceCharacter устанавливает фон гарнитуры DestinationCharacter на высокотехнологичную среду. -SourceCharacter sets the background on DestinationCharacter headset to an ancient fantasy location. -SourceCharacter устанавливает фон гарнитуры DestinationCharacter на древнее фэнтезийное место. -SourceCharacter sets DestinationCharacter headset to induce a trance-like state... -SourceCharacter настраивает гарнитуру DestinationCharacter чтобы вызвать состояние, похожее на транс... -Choose Background: -Выберите фон: -Choose Mode: -Выберите режим: -Choose Game: -Выберите игру: -Choose Settings: -Выберите настройки: -Background -Фон -Mode -Режим -Game -Игра -None -Ничего -High-Tech -Высокие технологии -Trance -Транс -Passthrough -Пройти через -Off -Выключить -VR -VR -VR (Hide Restraints) -VR (скрыть ограничения) -Kinky Dungeon -Kinky Dungeon -Access denied. -В доступе отказано. -SourceCharacter tried to log in to the device on DestinationCharacter FocusAssetGroup but was locked out. -SourceCharacter пыталась войти в устройство на DestinationCharacter FocusAssetGroup но была заблокирована. -Item is locked. Only authorized users may alter settings. -Предмет заблокирован. Только авторизованные пользователи могут изменять настройки. -Enter Password: -Введите пароль: -Log in -Авторизоваться -SourceCharacter configures DestinationCharacter armbinder to standard tightness. -SourceCharacter настраивает армбиндер DestinationCharacter на стандартную плотность. -SourceCharacter configures DestinationCharacter armbinder to enhanced tightness. -SourceCharacter настраивает армбиндер DestinationCharacter на повышенную плотность. -Standard Mode -Стандартный режим -Strict Mode -Строгий режим -Select device tightness: -Выберите плотность устройства: -Mask -Маска -Straps -Ремни -Icon -Значок -Configure muzzle: -Настроить морду: -Configure mask: -Настроить маску: -Configure straps: -Настройте ремни: -Choose Decorative Icon: -Выберите декоративную иконку: -Standard -Стандарт -Over the Nose -Над носом -Muzzle -Намордник -Harness Muzzle -Упряжной намордник -Blank -Пустой -Lock -Закрытый -Mute -Немой -X -X -SourceCharacter adds straps to DestinationCharacter muzzle. -SourceCharacter добавил ремни к наморднику DestinationCharacter . -SourceCharacter removes straps from DestinationCharacter muzzle. -SourceCharacter снимает ремни с намордника DestinationCharacter . -SourceCharacter adds a nose cover to DestinationCharacter muzzle. -SourceCharacter добавляет крышку носа к наморднику DestinationCharacter . -SourceCharacter removes the nose cover from DestinationCharacter muzzle. -SourceCharacter удаляет крышку носа с намордника DestinationCharacter . -SourceCharacter removes the icon from DestinationCharacter muzzle. -SourceCharacter убирает иконку с намордника DestinationCharacter . -SourceCharacter chooses the icon on DestinationCharacter muzzle. -SourceCharacter выбирает иконку на наморднике DestinationCharacter . -Door -Дверь -Leg Restraints -Ограничения для ног -Arm Restraints -Подлокотники -Module -Модуль -Harness -Сбруя -Structure -Структура -Configure crate: -Настроить ящик: -Configure door: -Настроить дверь: -Configure arm restraints: -Настройка подлокотников: -Configure leg restraints: -Настройка ограничителей для ног: -Configure modules: -Настроить модули: -Configure structure: -Настроить структуру: -Configure harness: -Настроить Сбруи: -Open Door -Открытая дверь -Glass Barrier -Стеклянный барьер -Large Window -Большое окно -Small Window -Маленькое окно -Sealed -Запечатанный -No Arm Restraint -Нет подлокотников -Hand Cuffs -Наручники -Boxtie Cuffs -Боксти-манжеты -Overhead Restraints -Потолочные ограничения -No Leg Restraint -Нет фиксации ног -Kneeling Cuffs -Манжеты на коленях -No Module -Нет модуля -Pleasure Module -Модуль удовольствия -Minimal -Минимальный -'X' style -'X' стиль -'+' style -'+' стиль -'H' style -'H' стиль -Low Security -Низкий уровень безопасности -Medium Security -Средний уровень безопасности -Maximum Security -Максимальная безопасность -SourceCharacter opens DestinationCharacter crate. -SourceCharacter Открывает ящик DestinationCharacter . -SourceCharacter engages the glass barrier DestinationCharacter crate. -SourceCharacter взаимодействует со стеклянным барьером ящика DestinationCharacter . -SourceCharacter opens the large window on DestinationCharacter crate. -SourceCharacter открывает большое окно ящика DestinationCharacter . -SourceCharacter opens the observation port on DestinationCharacter crate. -SourceCharacter открывает смотровое окно на ящике DestinationCharacter . -SourceCharacter seals DestinationCharacter crate. -SourceCharacter запечатывает ящик с DestinationCharacter . -SourceCharacter releases DestinationCharacter arms from her crate's restraints. -SourceCharacter выпускает руки DestinationCharacter из ограничителей её ящика. -SourceCharacter straps in DestinationCharacter arms behind her back. -SourceCharacter пристегивает руки DestinationCharacter за спиной. -SourceCharacter straps in DestinationCharacter arms over her head. -SourceCharacter пристегивает руки DestinationCharacter над головой. -SourceCharacter releases DestinationCharacter legs from her crate's restraints. -SourceCharacter освобождает ноги DestinationCharacter от ограничителей ящика. -SourceCharacter straps in DestinationCharacter legs in a suspended kneeling position. -SourceCharacter пристёгивает ноги DestinationCharacter в подвешенном положении на коленях. -SourceCharacter straps in DestinationCharacter legs together. -SourceCharacter пристёгивает ноги DestinationCharacter вместе. -SourceCharacter straps in DestinationCharacter legs apart. -SourceCharacter пристёгивает DestinationCharacter с расставленными ногами. -SourceCharacter removes the module from DestinationCharacter crate. -SourceCharacter удаляет модуль из ящика DestinationCharacter . -SourceCharacter equips DestinationCharacter crate with a pleasure module. -SourceCharacter оснащает ящик DestinationCharacter модулем удовольствия. -SourceCharacter changes the structure on DestinationCharacter crate. -SourceCharacter изменяет структуру контейнера DestinationCharacter . -SourceCharacter releases the harness on DestinationCharacter crate. -SourceCharacter выпускает сбрую в ящике DestinationCharacter . -SourceCharacter configures the harness on DestinationCharacter crate. -SourceCharacter настраивает сбрую в ящике DestinationCharacter . -Select device mode: -Выберите режим устройства: -Upper -Выше -Lower -Ниже -SourceCharacter moves DestinationCharacter harness to the lower body. -SourceCharacter перемещает сбрую DestinationCharacter на нижнюю часть тела. -SourceCharacter moves DestinationCharacter harness to the upper body. -SourceCharacter перемещает сбрую DestinationCharacter на верхнюю часть тела. -SourceCharacter configures DestinationCharacter harness to surround the whole body in straps. -SourceCharacter настраивает сбрую DestinationCharacter чтобы окружить все тело ремнями. -Belt -Пояс -Pelvis -Таз -Chest -Грудь -Total -Общий -SourceCharacter configures DestinationCharacter harness. -SourceCharacter настраивает сбрую DestinationCharacter . -SourceCharacter configures DestinationCharacter straitjacket to restrain hands in the front. -SourceCharacter настраивает смирительную рубашку DestinationCharacter чтобы сдерживать руки спереди. -SourceCharacter configures DestinationCharacter straitjacket to restrain hands in the back. -SourceCharacter настраивает смирительную рубашку DestinationCharacter чтобы сдерживать руки сзади. -SourceCharacter configures DestinationCharacter straitjacket to restrain hands in back. -SourceCharacter настраивает смирительную рубашку DestinationCharacter чтобы удерживать руки за спиной. -Hands in front -Руки впереди -Hands behind -Руки позади -Hands in front + chastity -Руки впереди + целомудрие -Hands behind + chasity -Руки сзади + целомудрие -SourceCharacter configures DestinationCharacter mittens to relax and leave her hands free -SourceCharacter настраивает рукавицы DestinationCharacter чтобы они расслаблялись и оставляли ее руки свободными -SourceCharacter configures DestinationCharacter mittens to clasp her hands tightly into fists. -SourceCharacter настраивает рукавицы DestinationCharacter так, чтобы она крепко сжимала руки в кулаки. -Gloves Mode -Режим перчаток -Mittens Mode -Режим варежек -Timer: 2 min -Таймер: 2 мин -Timer: 5 min -Таймер: 5 мин -Timer: 15 min -Таймер: 5 мин -Timer: 1 hour -Таймер: 1 час -Timer: 20 hours -Таймер: 20 часов -2 min -2 мин -5 min -5 мин -15 min -15 мин -1 hour -1 час -20 hours -20 часов -Trigger Inflation -Спровоцировать надувание -Time until deflation: -Время до сдувания: -Show chat message -Показать сообщение в чате -Auto-inflation sensitivity: -Чувствительность автонакачивания: -Gag configuration: -Конфигурация кляпа: -Padded -Мягкий -Small Plug -Маленькая вилка -Ball -Мяч -Large Ball -Большой мяч -Dildo -Фаллоимитатор -SourceCharacter configures DestinationCharacter gag to padded mode. -SourceCharacter настраивает кляп DestinationCharacter на набивной режим. -SourceCharacter configures DestinationCharacter gag to a soft ball. -SourceCharacter настраивает кляп DestinationCharacter на мягкий режим. -SourceCharacter configures DestinationCharacter gag to a mouth-filling ball. -SourceCharacter настраивает кляп DestinationCharacter на полный-рот режим. -SourceCharacter configures DestinationCharacter gag to a long dildo. -SourceCharacter настраивает кляп DestinationCharacter на длинный фаллоимитатор режим. -DestinationCharacterName gag inflates into a soft ball. -Кляп DestinationCharacterName надувается в мягкий шарик. -DestinationCharacterName gag inflates into a mouth-filling ball. -Кляп DestinationCharacterName раздувается в полный-рот шар. -DestinationCharacterName gag inflates into a large dildo that forces its way down her throat. -Кляп DestinationCharacterName надувается в большой фаллоимитатор, который проталкивается ей в горло. -DestinationCharacterName gag deflates into padded mode. -Кляп DestinationCharacterName сдувается в мягкий режим. -DestinationCharacterName gag deflates into a soft ball. -Кляп DestinationCharacterName сдувается в мягкий шарик. -DestinationCharacterName gag deflates into a mouth-filling ball. -Кляп DestinationCharacterName сдувается в полный-рот шарик. -SourceCharacter configures DestinationCharacter gag to not punish her for speaking. -SourceCharacter настраивает кляп DestinationCharacter чтобы он не наказывать ее за высказывания. -SourceCharacter configures DestinationCharacter gag to punish her for shouting. -SourceCharacter настраивает кляп DestinationCharacter чтобы он наказывал ее за крик. -SourceCharacter configures DestinationCharacter gag to punish her for saying long sentences. -SourceCharacter настраивает кляп DestinationCharacter чтобы он наказывал ее за длинные предложения. -SourceCharacter configures DestinationCharacter gag to punish her for speaking. -SourceCharacter настраивает кляп DestinationCharacter чтобы он наказывал ее за то, что она говорила. -SourceCharacter configures DestinationCharacter gag to deflate 2 minutes after triggering. -SourceCharacter настраивает кляп DestinationCharacter чтобы он сдувался через 2 минуты после срабатывания. -SourceCharacter configures DestinationCharacter gag to deflate 5 minutes after triggering. -SourceCharacter настраивает кляп DestinationCharacter чтобы он сдувался через 5 минуты после срабатывания. -SourceCharacter configures DestinationCharacter gag to deflate 15 minutes after triggering. -SourceCharacter настраивает кляп DestinationCharacter чтобы он сдувался через 15 минуты после срабатывания. -SourceCharacter configures DestinationCharacter gag to deflate 1 hour after triggering. -SourceCharacter настраивает кляп DestinationCharacter чтобы он сдувался через 1 час после срабатывания. -SourceCharacter configures DestinationCharacter gag to deflate 20 hours after triggering. -SourceCharacter настраивает кляп DestinationCharacter чтобы он сдувался через 20 часов после срабатывания. -SourceCharacter plugs up DestinationCharacter mouth with the dildo plug. -SourceCharacter затыкает рот DestinationCharacter заглушкой для фаллоимитатора. -SourceCharacter pulls out DestinationCharacter dildo plug from her gag. -SourceCharacter вытаскивает фаллоимитатор DestinationCharacter из её кляпа. -SourceCharacter loosens the gag on DestinationCharacter mouth. -SourceCharacter ослабляет кляп на рту у DestinationCharacter . -SourceCharacter polishes the gag on DestinationCharacter mouth. -SourceCharacter полирует кляп во рту у DestinationCharacter . -SourceCharacter tightens the gag on DestinationCharacter mouth. -SourceCharacter затягивает кляп во рту у DestinationCharacter . -The plugs cease abruptly as you are about to go over the edge. -Пробки резко прекращаются, когда вы собираетесь перейти край. -The plugs bring you so close to release... before turning off suddenly. -Пробки подводят вас так близко к разрядке... прежде чем внезапно отключиться. -Punishment for speaking too much: -Наказание за то, что слишком много говорила: -Shock -Шок -Edge for 5m -Край на 5 м -Vibe for 5m -Вибрация на 5м. -Punishment for not saying word: -Наказание за молчание: -Punishment for banned words: -Наказание за запрещенные слова: -Public Mode Permission: -Разрешение публичного режима: -Club Mistresses -Клубные Любовницы -Current Public Mode: -Текущий Публичный Режим: -Low -Низкий -Deny -Нет -Random Teasing -Случайное Поддразнивание -Random Orgasms -Случайные Оргазмы -DestinationCharacterName belt ceases all vibrations. -Пояс на DestinationCharacterName прекращает все вибрации. -DestinationCharacterName plugs slow down to a frustrating tingle... -Пробки в DestinationCharacterName замедляются до неприятного покалывания... -DestinationCharacterName belt starts pulsating strongly! -Пояс на DestinationCharacterName начинает сильно пульсировать! -DestinationCharacterName belt starts vibrating intensely! -Пояс на DestinationCharacterName начинает интенсивно вибрировать! -Your plugs slow down to a frustrating tingle... -Ваши пробки замедляются до неприятного покалывания... -Your belt starts pulsating strongly! -Ваш пояс начинает сильно пульсировать! -The plugs inside of you start buzzing intensely! -Пробки внутри вас начинают интенсивно гудеть! -DestinationCharacterName belt starts to tease her gently... -Пояс на DestinationCharacterName начинает нежно дразнить ее... -DestinationCharacterName belt starts teasing her... -Пояс на DestinationCharacterName начинает дразнить ее... -DestinationCharacterName belt vibrates suddenly! -Пояс на DestinationCharacterName внезапно вибрирует! -DestinationCharacterName belt vibrates intensely! -Пояс на DestinationCharacterName сильно вибрирует! -DestinationCharacterName belt starts buzzing strongly! -Пояс на DestinationCharacterName начинает сильно гудеть! -DestinationCharacterName belt tingles just a little bit... -Пояс на DestinationCharacterName слегка покалывает... -DestinationCharacterName belt vibrates gently. -Пояс на DestinationCharacterName мягко вибрирует. -DestinationCharacterName belt slows down to a weak buzz... -Пояс на DestinationCharacterName замедляется до слабого гудения... -DestinationCharacterName belt edges her strongly! -Пояс на DestinationCharacterName сильно обтягивает ее! -DestinationCharacterName belt brings her close to the edge! -Пояс на DestinationCharacterName подводит ее вплотную к краю! -Your belt slows down to a weak buzz... -Ваш пояс замедляется до слабого жужжания... -Your belt edges you strongly! -Ваш пояс сильно вас стесняет! -Your belt brings you close to the edge! -Ваш пояс приближает вас к краю пропасти! -DestinationCharacterName belt gradually slows to a halt. -Пояс на DestinationCharacterName постепенно замедляется до полной остановки. -No standing up without help -Не вставать без посторонней помощи -Configure Belt -Настройка ремня -Select Model Number -Выберите Номер модели -Configure Front Shield -Настройка Переднего Щита -Configure Rear Shield -Настройка Заднего Щита -Configure Tamper Protection -Настройка Защиты От Несанкционированного доступа -Configure Orgasm Prevention -Настройка Предотвращения Оргазма -Model Number -Номер модели -Front Shield -Передний щит -Rear Shield -Задний щит -Tamper Protection -Защита от несанкционированного доступа -Orgasm Prevention -Предотвращение оргазма -Prototype -Прототип -High-Security Series -Серия с высоким уровнем безопасности -Training Series -Тренировочная серия -Neo Series -Нео Серия -Front Open -Передний открыт -Front Locked -Передний заблокирован -Rear Open -Задний открытый -Rear Locked -Задний заблокирован -Disabled -Отключено -Punish Local Tampering -Наказать локальное вмешательство -Punish All Tampering -Наказать за любое вмешательство -Allow Orgasms -Разрешить оргазмы -Punish Orgasms -Наказать оргазмы -Shock when wearer reaches orgasm -Шок, когда владелец достигает оргазма -Prevent tampering with this item -Предотвратить вмешательство в этот предмет -Shock wearer when struggling with other items -Шокирующий носитель при борьбе с другими предметами -Show messages to other players -Показывать сообщения другим игрокам -SourceCharacter changes the model of DestinationCharacter belt. -SourceCharacter изменяет модель пояса на DestinationCharacter . -SourceCharacter configures DestinationCharacter belt to punish orgasms. -SourceCharacter настроил пояс на DestinationCharacter так, для наказания за оргазмы. -SourceCharacter configures DestinationCharacter belt to punish tampering with the belt. -SourceCharacter настроил пояс на DestinationCharacter так, чтобы наказывать за вмешательство в пояс. -SourceCharacter configures DestinationCharacter belt to punish struggling. -SourceCharacter настроил пояс на DestinationCharacter так, чтобы наказать за борьбу. -SourceCharacter configures DestinationCharacter belt to allow orgasms. -SourceCharacter настроил пояс на DestinationCharacter так, чтобы он позволял испытывать оргазмы. -SourceCharacter disables the tamper protection on DestinationCharacter belt. -SourceCharacter отключает защиту от несанкционированного доступа на поясе DestinationCharacter. -SourceCharacter opens the back of DestinationCharacter belt. -SourceCharacter открывает заднюю часть пояса на DestinationCharacter . -SourceCharacter opens the front of DestinationCharacter belt. -SourceCharacter открывает переднюю часть пояса на DestinationCharacter . -SourceCharacter locks the rear shield of DestinationCharacter belt. -SourceCharacter запирает задний щит пояса на DestinationCharacter . -SourceCharacter locks the front shield of DestinationCharacter belt. -SourceCharacter запирает передний щит пояса на DestinationCharacter . -SourceCharacter configures DestinationCharacter belt. -SourceCharacter настраивает пояс DestinationCharacter . -Time until recharged: -Время до перезарядки: -Punishment Charged -Заряженное наказание -DestinationCharacterName belt shocks her for standing up without permission! -Пояс на DestinationCharacterName шокирует её за то, что она встала без разрешения! -DestinationCharacterName belt shocks her for speaking too much! -Пояс на DestinationCharacterName шокирует её за то, что она слишком много говорит! -DestinationCharacterName belt shocks her for not saying 'ReplacementWord!' -Пояс на DestinationCharacterName шокирует её за то, что она не сказала 'ReplacementWord!' -DestinationCharacterName belt shocks her for saying 'ReplacementWord!' -Пояс на DestinationCharacterName шокирует её за то, что она сказала 'ReplacementWord!' -DestinationCharacterName belt punishes her for speaking too much! -Пояс на DestinationCharacterName наказывает ее за то, что она слишком много говорит! -DestinationCharacterName belt punishes her for not saying 'ReplacementWord!' -Пояс на DestinationCharacterName наказывает ее за то, что она не произнесла 'ReplacementWord!' -DestinationCharacterName belt punishes her for saying 'ReplacementWord!' -Пояс на DestinationCharacterName наказывает ее за то, что она произнесла 'ReplacementWord!' -DestinationCharacterName belt detects an orgasm and shocks her! -Пояс на DestinationCharacterName обнаруживает оргазм и шокирует ее! -DestinationCharacterName belt detects tampering and shocks her! -Пояс на DestinationCharacterName обнаруживает вмешательство и бьет ее током! -DestinationCharacterName belt detects her struggling and delivers an intense shock! -Пояс на DestinationCharacterName обнаруживает её борьбу и наносит сильный удар! -DestinationCharacterName bindings tighten around her body with a hiss as they lock themselves automatically. -Привязки на DestinationCharacterName затягиваются вокруг ее тела с шипением, автоматически фиксируясь. -DestinationCharacterName bindings release her with a hiss. -Привязки на DestinationCharacterName освобождают её с шипением. -DestinationCharacterName bindings reboot with different colors. -Привязки на DestinationCharacterName перезагружаются с разными цветами. -Let all players use head device features -Разрешить всем игрокам использовать функции головного устройства -Let all players modify futuristic chastity -Пусть все игроки модифицируют футуристическое целомудрие -Let all players modify futuristic arm devices -Пусть все игроки модифицируют футуристические устройства для рук. -Let all players modify futuristic leg devices -Пусть все игроки модифицируют футуристические устройства для ног -DestinationCharacterName collar can now be used by anyone. -Ошейник на DestinationCharacterName теперь может использовать кто угодно. -DestinationCharacterName collar now can't be used while locked. -Ошейник на DestinationCharacterName теперь нельзя использовать, когда он заблокирован. -DestinationCharacterName chastity devices can now be altered by anyone. -Устройства целомудрия на DestinationCharacterName теперь могут быть изменены кем угодно. -DestinationCharacterName chastity devices now can't be changed while locked. -Устройства целомудрия на DestinationCharacterName теперь нельзя изменить, пока они заблокированы. -DestinationCharacterName arm bindings can now be altered by anyone. -Привязки рук на DestinationCharacterName еперь могут быть изменены кем угодно. -DestinationCharacterName arm bindings now can't be changed while locked. -Привязки рук на DestinationCharacterName теперь нельзя изменить, пока они заблокированы. -DestinationCharacterName leg bindings can now be altered by anyone. -привязки к ногам на DestinationCharacterName теперь могут быть изменены кем угодно. -DestinationCharacterName leg bindings now can't be changed while locked. -привязки к ногам на DestinationCharacterName теперь нельзя изменить, пока они заблокированы. -Block remotes on the wearer -Заблокируйте пульты на пользователе -DestinationCharacterName vibrator remotes are now locked. -Пульты вибратора DestinationCharacterName теперь заблокированы.. -DestinationCharacterName vibrator remotes are now unlocked. -Пульты вибратора DestinationCharacterName теперь разблокированы. -Collar settings are locked -Настройки ошейника заблокированы -Current Status: -Текущий статус: -Partially Locked -Частично заблокирован -Fully Locked -Полностью заблокирован -No Futuristic Items Worn -Не носить футуристические вещи -Lock Metal -Замок Металлический -Lock Intricate -Замок Замысловатый -Lock HighSec -Замок высокой безопасность -Lock Exclusive -Замок Эксклюзивный -Lock 5 Minutes -Замок 5 минут -Lock Mistress -Замок Госпожи -Lock Lovers -Замок Возлюбленной -Lock Owner -Замок Хозяйки -Lock Pandora -Замок Пандоры -Lock Combo -Комбинированный замок -Lock Password -Замок с паролем -Lock Safeword -Замок стоп-слова -Mistress Timer -Таймер Госпожи -Password Timer -Парольный таймер -Lovers Timer -Таймер возлюбленной -Owner Timer -Таймер Хозяйки -Code: -Код: -Time (in mins): -Время (в минутах): -Unlock -Разблокировать -Copy Colors To Items -Копировать цвета в предметы -Select heel mode -Выберите режим каблука -Heels Retracted -Каблуки втянуты -Heels Extended -Каблуки расширены -SourceCharacter retracts the heels on DestinationCharacter shoes. -SourceCharacter убирает каблуки на туфлях у DestinationCharacter . -SourceCharacter extends the heels on DestinationCharacter shoes. -SourceCharacter удлиняет каблуки у DestinationCharacter . -Select finish -Выберите отделку -Matte -Матовый -SourceCharacter polishes DestinationCharacter shoes. -SourceCharacter полирует обувь у DestinationCharacter . -SourceCharacter removes the polish on DestinationCharacter shoes. -SourceCharacter удаляет лак с обуви у DestinationCharacter . -Select binder length -Выберите длину переплета -Full length -Полная длина -Half length -Половина длины -SourceCharacter adds a full-length binder to DestinationCharacter AssetName. -SourceCharacter добавляет полноразмерную привязку к DestinationCharacter AssetName. -SourceCharacter adds a half-length binder to DestinationCharacter AssetName. -SourceCharacter добавляет половинчатую привязку к DestinationCharacter AssetName. -Configure settings: -Настройки параметров: -Configure display: -Настройки экрана: -Configure shine: -Настройка блеска: -Display -Дисплей -Shine -Блеск -No Display -Нет дисплея -SourceCharacter shows the display on DestinationCharacter bra. -SourceCharacter показывает дисплей на бюстгальтере у DestinationCharacter . -SourceCharacter hides the display on DestinationCharacter bra. -SourceCharacter скрывает дисплей на бюстгальтере у DestinationCharacter . -SourceCharacter polishes DestinationCharacter bra. -SourceCharacter полирует бюстгальтер у DestinationCharacter . -SourceCharacter removes the polish on DestinationCharacter bra. -SourceCharacter удаляет лак с бюстгальтера у DestinationCharacter . -Diagnostics for wearer -Диагностика для владельца -Current Body Temp: -Текущая температура тела: -°C -°C -Current Breathing: -Текущее дыхание: -Steady -Стабильное -Shaky -Шаткое -Excited -Взволнованное -Current Heart Rate: -Текущий пульс: -Current Training Level: -Текущий уровень обучения: -Tracking Signal: Good -Сигнал отслеживания: хороший -Cover Display -закрыть дисплея -Show Display -Показать дисплей -Cover Display (алт) -закрыть дисплея (алт) -Show Display (алт) -Показать дисплей (алт) -SourceCharacter covers the display on DestinationCharacter bra. -SourceCharacter закрывает дисплей бюстгальтера на DestinationCharacter . -SourceCharacter opens up the display on DestinationCharacter bra. -SourceCharacter окрывает дисплей бюстгальтера на DestinationCharacter . -BPM -BPM -Cup interactions -Взаимодейстовать с чашкой -Tip over -Опрокинуть -Remove -Удалить -Place -Расместить -SourceCharacter removes the cup from DestinationCharacter cup holder gag. -SourceCharacter извлекает чашку из кляпа держателя чашки на DestinationCharacter . -SourceCharacter tips over the cup on DestinationCharacter cup holder gag. -SourceCharacter опрокидывает чашку на кляпе с подстаканником у DestinationCharacter . -SourceCharacter places a cup on DestinationCharacter cup holder gag. -SourceCharacter кладет чашку на кляп для подстаканника у DestinationCharacter . -Select the type of blindfold -Выберите тип повязки на глаза -Select tape style -Выберите стиль ленты -Double -Двойной -Wrap -Обертка -Open Mummy -Открытая мумия -SourceCharacter takes a piece of duct tape for TargetCharacter and places it on her face. -SourceCharacter берет кусок клейкой ленты для TargetCharacter и размещает его к ее лицу. -SourceCharacter wraps some duct tape onto DestinationCharacter face. -SourceCharacter обматывает лицо DestinationCharacter скотчем. -SourceCharacter wraps DestinationCharacter head in tape with multiple layers. -SourceCharacter оборачивает голову DestinationCharacter лентой с несколькими слоями. -SourceCharacter wraps DestinationCharacter head in tape with the eyes free. -SourceCharacter оборачивает голову DestinationCharacter лентой, оставляя глаза свободными. -Change Opacity -Изменить непрозрачность -Select Locker type -Выберите тип шкафчика -Vents -Вентиляция -Ventless -безвентиляторный -SourceCharacter changes the vents on DestinationCharacter locker. -SourceCharacter меняет вентиляционные отверстия в шкафчике у DestinationCharacter . -Select vacbed type. -Выберите тип вакуумой кровати. -Hair -Волосы -No Hair -Без волос -SourceCharacter reveals DestinationCharacter hair from the vacbed. -SourceCharacter Показывает волосы DestinationCharacter из вакуумой кровати. -SourceCharacter tucks DestinationCharacter hair into the vacbed. -SourceCharacter заправляет волосы DestinationCharacter в вакуумную кровать. -Opacity -Непрозрачность -SourceCharacter changes DestinationCharacter pose in her Vacuum Bed Deluxe. -SourceCharacter меняет позу DestinationCharacter pose в её вакуумной кровати Deluxe. -Select the rope bondage -Выберите веревочный бондаж -Basic Tie -Базовый бондаж -Mermaid Tie -Бондаж русалки -Full Binding Tie -Полный связывающий бондаж -Link Tie -Связующий бондаж -Frogtie Tie -Лягушачий бондаж -Crossed Tie -Перекрещенный бондаж -Box Tie -Коробчатый бондаж -Tight Box Tie -узкий Коробчатый бондаж -Hogtie -Свинья -Swiss Seat -Швейцарское сиденье -Kikkou Hip -Кикко Хип -Select straitjacket prep -Выберите подготовку к смирительной рубашке -Basic -Базовый -Pulled Out Straps -Вытянутые ремни -Lining Straps -Подкладочные ремни -Extra Padding -Дополнительная прокладка -Pulled Straps & Lining -Утягивающие лямки и подкладка -Pulled Straps & Padding -Натянутые ремни и набивка -Padding & Lining -Набивка и подкладка -Full Jacket -Полная куртка -SourceCharacter removes all addons from DestinationCharacter tightjacket. -SourceCharacter удаляет все подолнения из плотной куртки у DestinationCharacter . -SourceCharacter pulls out the straps on DestinationCharacter tightjacket. -SourceCharacter расстегивает лямки плотной куртки у DestinationCharacter . -SourceCharacter adds lining straps to DestinationCharacter tightjacket. -SourceCharacter добавляет подкладочные ремни к плотной куртке у DestinationCharacter . -SourceCharacter adds extra padding to DestinationCharacter tightjacket. -SourceCharacter добавляет дополнительные отступы к плотной куртке у DestinationCharacter . -SourceCharacter pulls out the straps and adds lining straps to DestinationCharacter tightjacket. -SourceCharacter вытягивает лямки и добавляет подкладочные ремни к плотной куртке у DestinationCharacter . -SourceCharacter pulls out the straps and adds extra padding to DestinationCharacter tightjacket. -SourceCharacter расстегивает лямки и добавляет дополнительную набивку в плотную куртку у DestinationCharacter . -SourceCharacter adds extra padding and lining straps to DestinationCharacter tightjacket. -SourceCharacter добавляет дополнительную подкладку и ремни к плотной куртке у DestinationCharacter . -SourceCharacter adds all addons to DestinationCharacter tightjacket. -SourceCharacter добавляет все дополнения в плотную куртку к DestinationCharacter . -Select Ziptie Bondage -Выберите зипти-бондаж -Light Binding -Легкое связывание -Medium Binding -Среднее связывание -Full Binding -Полное связывание -Elbow Wrist Binding -Связывание Локтя и Запястья -Light Wrist Binding -Легкое связывание на запястье -Medium Wrist Binding -Среднее связывание на запястье -Full Wrist Binding -Полная фиксация запястья -Wrist Binding -Связывание запястья -Kneeling Hogtie -Свинья на коленях -Frogtie -Лягушонок -SourceCharacter uses the zipties on TargetCharacter to lightly bind her elbows and wrists. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы слегка связать ее локти и запястья. -SourceCharacter uses the zipties on TargetCharacter to half bind her elbows and wrists. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы наполовину связать ей локти и запястья. -SourceCharacter uses the zipties on TargetCharacter to fully bind her elbows and wrists. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы полностью связать ее локти и запястья. -SourceCharacter uses the zipties on TargetCharacter to bind her elbows and wrists. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы связать ей локти и запястья. -SourceCharacter uses the zipties on TargetCharacter to lightly bind her wrists. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы слегка связать ее запястья. -SourceCharacter uses the zipties on TargetCharacter to half bind her wrists. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы наполовину связать ее запястья. -SourceCharacter uses the zipties on TargetCharacter to fully bind her wrists. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы полностью связать ее запястья. -SourceCharacter uses the zipties on TargetCharacter to bind her wrists behind her back. -SourceCharacter использует застежки-молнии на TargetCharacter связать ей запястья за спиной. -SourceCharacter uses the zipties on TargetCharacter to hogtie her. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы связать ее. -SourceCharacter uses the zipties on TargetCharacter to hogtie her on her knees. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы связать ее на коленях. -SourceCharacter uses the zipties on TargetCharacter bind her on all fours. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы привязать ее на четвереньки. -SourceCharacter uses the zipties on TargetCharacter to lighty bind her legs. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы слегка связать ей ноги. -SourceCharacter uses the zipties on TargetCharacter to half bind her legs. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы наполовину связать ей ноги. -SourceCharacter uses the zipties on TargetCharacter to fully bind her legs. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы полностью связать ее ноги. -SourceCharacter uses the zipties on TargetCharacter to frogtie her. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы связать её по Лягушачи. -SourceCharacter uses the zipties on TargetCharacter to lightly bind her feet. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы слегка связать ее ноги. -SourceCharacter uses the zipties on TargetCharacter to half bind her feet. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы наполовину связать ей ноги. -SourceCharacter uses the zipties on TargetCharacter to fully bind her feet. -SourceCharacter использует застежки-молнии на TargetCharacter чтобы полностью связать ее ноги. -Toes -Пальцы ног -SourceCharacter uses the tape on TargetCharacter to tie her toes together with tape. -SourceCharacter использует ленту на TargetCharacter чтобы связать ей пальцы ног. -SourceCharacter uses the tape on TargetCharacter to fully wrap her feet with tape. -SourceCharacter использует ленту на TargetCharacter полностью обмотать ее ноги скотчем. -Suspension Tie -Подвесной связывание -Wrist and Elbow Tie -Связывание запястья и локтя -Wrist Tie -Связывание запястья -Rope Cuffs -Веревочные манжеты -Crossed Boxtie -Перекрещенное коробочное связывание -Wrist & Elbow Harness Tie -Привязная сбруя на запястье и локти -Simple Hogtie -Простой кабанчик -Suspended Kneeling Hogtie -Подвешенная на коленях свинья -Suspended Hogtie -Подвесной кабанчик -Suspended All Fours -Подвеска на четвереньках -Inverted Suspended Hogtie -Перевернутый подвешенный кабанчик -Inverted Suspended All Fours -Перевернутая подвеска на четвереньках -Crotch Rope -Веревка у промежности -Over Panties -Поверх трусиков -Body Harness -Сбруя для тела -Star Harness Tie -Звездное связывание сбруи -Waist Rope -Поясная веревка -Diamond Tie -Алмазное связывание -Bed Spread-Eagle -Кровать Spread-Eagle -No Requirement -Нет требований -Need Bondage ReqLevel -Нужен уровень бондажа: ReqLevel -SourceCharacter uses the rope on TargetCharacter to do a crotch rope tie. -SourceCharacter использует веревку на TargetCharacter чтобы завязать веревку на промежности. -SourceCharacter uses the rope on TargetCharacter to do a body harness. -SourceCharacter использует веревку на TargetCharacter чтобы сделать обвязку тела. -SourceCharacter uses the rope on TargetCharacter to tie a star harness. -SourceCharacter использует веревку на TargetCharacter чтобы связать звездный жгут. -SourceCharacter uses the rope on TargetCharacter to tie a waist rope on her. -SourceCharacter использует веревку на TargetCharacter чтобы привязать к ней поясную веревку. -SourceCharacter uses the rope on TargetCharacter to do a diamond style harness. -SourceCharacter использует веревку на TargetCharacter сделать сбрую в алмазном стиле. -SourceCharacter uses the rope on TargetCharacter to do a basic tie. -SourceCharacter использует веревку на TargetCharacter чтобы сделать базовую завязку. -SourceCharacter uses the rope on TargetCharacter to do a mermaid tie. -SourceCharacter использует веревку на TargetCharacter чтобы сделать связывание русалки. -SourceCharacter uses the rope on TargetCharacter to do a full binding tie. -SourceCharacter использует веревку на TargetCharacter чтобы сделать полную обвязку. -SourceCharacter uses the rope on TargetCharacter to do a frogtie tie. -SourceCharacter использует веревку на TargetCharacter чтобы сделать связывание лягушкой. -SourceCharacter uses the rope on TargetCharacter to do a suspension tie. -SourceCharacter использует веревку на TargetCharacter чтобы сделать подвесную связку. -SourceCharacter uses the rope on TargetCharacter to do a full binding with links tie in. -SourceCharacter использует веревку на TargetCharacter чтобы сделать полную привязку с соединениями. -SourceCharacter uses the rope on TargetCharacter to do a diamond style tie. -SourceCharacter использует веревку на TargetCharacter чтобы сделать алмазное связывание. -SourceCharacter uses the rope on TargetCharacter to do a crossed style binding tie. -SourceCharacter использует веревку на TargetCharacter чтобы связать в перекрестном стиле. -SourceCharacter uses the rope on TargetCharacter to tie her legs to the bedposts. -SourceCharacter использует веревку на TargetCharacter чтобы привязать ее ноги к столбикам кровати. -SourceCharacter uses rope on TargetCharacter to do a box tie. -SourceCharacter использует веревку на TargetCharacter чтобы сделать коробочное связывание . -SourceCharacter uses rope on TargetCharacter to do a tight boxtie. -SourceCharacter использует веревку на TargetCharacter чтобы сделать плотное коробочное связывание. -SourceCharacter uses rope on TargetCharacter to do a crossed boxtie. -SourceCharacter использует веревку на TargetCharacter сделать перекрестный коробочное связывание. -SourceCharacter uses rope to hogtie TargetCharacter. -SourceCharacter использует веревку, чтобы связать TargetCharacter кабанчиком. -SourceCharacter uses rope to tie DestinationCharacter wrists and elbows together behind her back. -SourceCharacter использует веревку, чтобы связать запястья и локти DestinationCharacter за спиной. -SourceCharacter uses rope to tie DestinationCharacter wrists together behind her back. -SourceCharacter использует веревку, чтобы связать запястья DestinationCharacter вместе за спиной. -SourceCharacter uses rope to tie rope cuffs on DestinationCharacter wrists -SourceCharacter чтобы завязать веревочные манжеты на запястьях DestinationCharacter -SourceCharacter uses rope to tie DestinationCharacter wrists and elbows in a harness behind her back. -SourceCharacter использует веревку, чтобы связать запястья и локти в сбрую DestinationCharacter за спиной. -SourceCharacter uses rope on TargetCharacter to have her crawling on all fours. -SourceCharacter использует веревку на TargetCharacter чтобы она ползала на четвереньках. -SourceCharacter uses rope to hogtie TargetCharacter on her knees. -SourceCharacter использует веревку, чтобы связать TargetCharacter на коленях. -SourceCharacter uses rope to tie DestinationCharacter arms to the bedposts. -SourceCharacter использует веревку, чтобы привязать руки DestinationCharacter к стойкам кровати. -Select Rope Bondage. -Выберите веревочное связывание. -Lowered -Опущенный -Suspended -Подвешенный -SourceCharacter uses the rope on TargetCharacter to suspend her. -SourceCharacter использует веревку на TargetCharacter чтобы подвесить её. -SourceCharacter uses the rope on TargetCharacter to lower her. -SourceCharacter использует веревку на TargetCharacter чтобы спустить её. -Select Chain Bondage. -Выберите Цепное связывание. -SourceCharacter uses the chain on TargetCharacter to suspend her. -SourceCharacter использует цепочку на TargetCharacter чтобы подвесить её. -SourceCharacter uses the chain on TargetCharacter to lower her. -SourceCharacter использует цепочку на TargetCharacter чтобы спустить её. -How much do you want to inflate the strait leotard? -Насколько сильно вы хотите надуть облегающий купальник? -SourceCharacter adjusts DestinationCharacter inflatable strait leotard to be only lightly filled. -SourceCharacter настраивает надувной купальник DestinationCharacter так, чтобы он был заполнен только слегка. -SourceCharacter adjusts DestinationCharacter inflatable strait leotard to be half filled. -SourceCharacter настраивает надувной купальник DestinationCharacter так, чтобы он был заполнен наполовину. -SourceCharacter adjusts DestinationCharacter inflatable strait leotard to three quarters filled. -SourceCharacter настраивает надувной купальник DestinationCharacter на заполнение на три четверти. -SourceCharacter adjusts DestinationCharacter inflatable strait leotard to fill the maximum amount. -SourceCharacter настраивает надувной купальник DestinationCharacter чтобы заполнить максимальное количество. -SourceCharacter uses the rope on TargetCharacter to do a crotch rope tie over her panties. -SourceCharacter спользует веревку на TargetCharacter чтобы завязать веревку в промежности поверх ее трусиков. -SourceCharacter uses the rope on TargetCharacter to do a swiss seat style rope tie. -SourceCharacter спользует веревку на TargetCharacter чтобы завязать веревку в стиле швейцарского сиденья. -SourceCharacter uses the rope on TargetCharacter to do a kikkou hip style rope tie. -SourceCharacter спользует веревку на TargetCharacter чтобы завязать веревку в стиле Кикко Хип. -Select the amount of padding. -Выберите количество заполнения. -Regular Padding -Обычная отбивка -The extra padding is removed from DestinationCharacterName poofy diaper. Though it is still embarrassingly huge. -Дополнительная прокладка удалена из подгузника DestinationCharacterName . Хотя он все еще смущающе огромен. -Extra padding is added to DestinationCharacterName poofy diaper. Making it crinkle louder and force the baby to waddle. -К пушистому подгузнику DestinationCharacterName добавлено дополнительное наполнение. Заставляя его шуршать громче и заставляя ребенка ходить вразвалку. -Reset trigger count -Сбросить счетчик триггеров -Trigger count: ShockCount -Количество триггеров: ShockCount -SourceCharacter resets DestinationCharacter AssetName trigger count. -SourceCharacter сбрасывает количество триггеров у DestinationCharacter AssetName. -Item intensity: Disabled -Интенсивность предмета: отключено -Item intensity: Low -Интенсивность предмета: Низкая -Item intensity: Medium -Интенсивность предмета: средняя -Item intensity: High -Интенсивность предмета: Высокая -Item intensity: Maximum -Интенсивность предмета: максимальная -Item sensitivity: Disabled -Чувствительность предмета: отключено -Item sensitivity: Low -Чувствительность предмета: Низкая -Item sensitivity: Medium -Чувствительность предмета: средняя -Item sensitivity: High -Чувствительность предмета: высокая -Item sensitivity: Maximum -Чувствительность предмета: максимальная -Egg item intensity: Disabled -Интенсивность яйца: отключено -Egg item intensity: Low -Интенсивность яиц: низкая -Egg item intensity: Medium -Интенсивность яйца: средняя -Egg item intensity: High -Интенсивность яица: высокая -Egg item intensity: Maximum -Интенсивность яица: максимальная -Dildo item intensity: Disabled -Интенсивность фаллоимитатора: отключено -Dildo item intensity: Low -Интенсивность фаллоимитатора: Низкая -Dildo item intensity: Medium -Интенсивность фаллоимитатора: средняя -Dildo item intensity: High -Интенсивность фаллоимитатора: высокая -Dildo item intensity: Maximum -Интенсивность фаллоимитатора: максимальная -Increase -Увеличивать -Decrease -Уменьшить -Show chat message -Показать сообщение чата -SourceCharacter sets DestinationCharacter AssetName to low intensity. -SourceCharacter устанавливает для DestinationCharacter AssetName низкую интенсивность. -SourceCharacter sets DestinationCharacter AssetName to moderate intensity. -SourceCharacter устанавливает для DestinationCharacter AssetName умеренную интенсивность. -SourceCharacter sets DestinationCharacter AssetName to high intensity. -SourceCharacter устанавливает высокую интенсивность для DestinationCharacter AssetName. -SourceCharacter sets DestinationCharacter AssetName to manual mode. -SourceCharacter устанавливает DestinationCharacter AssetName в ручной режим. -SourceCharacter sets DestinationCharacter AssetName to low sensitivity. -SourceCharacter устанавливает для свойства DestinationCharacter AssetName низкую чувствительность. -SourceCharacter sets DestinationCharacter AssetName to medium sensitivity. -SourceCharacter устанавливает для свойства DestinationCharacter AssetName среднюю чувствительность. -SourceCharacter sets DestinationCharacter AssetName to maximum sensitivity. -SourceCharacter устанавливает для DestinationCharacter AssetName максимальную чувствительность. -DestinationCharacterName AssetName gives her a light shock. -DestinationCharacterName AssetName вызывает у нее легкий шок. -DestinationCharacterName AssetName lets out a sharp jolt! -DestinationCharacterName AssetName производит резкий толчок! -DestinationCharacterName AssetName delivers an intense shock! -DestinationCharacterName AssetName доставляет сильный шок! -DestinationCharacterName collar gives her a light shock. -Ошейник DestinationCharacterName вызывает у нее легкий шок. -DestinationCharacterName collar lets out a sharp jolt! -Ошейник DestinationCharacterName резко дергается! -DestinationCharacterName collar delivers an intense shock! -Ошейник DestinationCharacterName обеспечивает сильный шок! -DestinationCharacterName vibrating egg stops vibrating. -Вибрирующее яйцо DestinationCharacterName перестает вибрировать. -DestinationCharacterName vibrating egg slows down into a light tease. -Вибрирующее яйцо DestinationCharacterName замедляется до легкого дразня. -DestinationCharacterName vibrating egg returns to a moderate pace. -Вибрирующее яйцо DestinationCharacterName возвращается к умеренному темпу. -DestinationCharacterName vibrating egg slows down a tiny bit. -Вибрирующее яйцо DestinationCharacterName немного замедляется. -DestinationCharacterName vibrating egg starts teasing her lightly. -Вибрирующее яйцо DestinationCharacterName начинает слегка дразнить ее. -DestinationCharacterName vibrating egg builds up to a moderate pace. -Вибрирующее яйцо DestinationCharacterName набирает умеренную скорость. -DestinationCharacterName vibrating egg starts buzzing strongly! -Вибрирующее яйцо DestinationCharacterName начинает сильно гудеть! -DestinationCharacterName vibrating egg jumps up to maximum intensity! -Вибрирующее яйцо DestinationCharacterName подпрыгивает с максимальной интенсивностью! -DestinationCharacterName sybian stops vibrating. -Сибиан DestinationCharacterName перестает вибрировать. -DestinationCharacterName sybian slows down into a light tease. -Сибиан DestinationCharacterName замедляется до легкого дразня. -DestinationCharacterName sybian returns to a moderate pace. -Сибиан DestinationCharacterName возвращается к умеренному темпу. -DestinationCharacterName sybian slows down a tiny bit. -Сибиан DestinationCharacterName немного тормозит. -DestinationCharacterName sybian starts teasing her lightly. -Сибиан DestinationCharacterName начинает слегка дразнить ее. -DestinationCharacterName sybian builds up to a moderate pace. -Сибиан DestinationCharacterName набирает средний темп. -DestinationCharacterName sybian starts buzzing strongly! -Сибиан DestinationCharacterName начинает сильно гудеть! -DestinationCharacterName sybian jumps up to maximum intensity! -Сибиан DestinationCharacterName подпрыгивает до максимальной интенсивности! -DestinationCharacterName vibrating dildo stops vibrating. -Вибрирующий фаллоимитатор DestinationCharacterName перестает вибрировать. -DestinationCharacterName vibrating dildo slows down into a light tease. -Вибрирующий фаллоимитатор DestinationCharacterName замедляется до легкого дразня. -DestinationCharacterName vibrating dildo returns to a moderate pace. -Вибрирующий фаллоимитатор DestinationCharacterName возвращается к умеренному темпу. -DestinationCharacterName vibrating dildo slows down a tiny bit. -Вибрирующий фаллоимитатор DestinationCharacterName немного замедляется. -DestinationCharacterName vibrating dildo starts teasing her lightly. -Вибрирующий фаллоимитатор DestinationCharacterName начинает слегка дразнить ее. -DestinationCharacterName vibrating dildo builds up to a moderate pace. -Вибрирующий фаллоимитатор DestinationCharacterName набирает умеренную скорость. -DestinationCharacterName vibrating dildo starts buzzing strongly! -Вибрирующий фаллоимитатор DestinationCharacterName начинает сильно жужжать! -DestinationCharacterName vibrating dildo jumps up to maximum intensity! -Вибрирующий фаллоимитатор DestinationCharacterName прыгает до максимальной интенсивности! -DestinationCharacterName clitoral stimulator stops vibrating. -Клиторальный стимулятор DestinationCharacterName перестает вибрировать. -DestinationCharacterName clitoral stimulator slows down into a light tease. -Клиторальный стимулятор DestinationCharacterName замедляется до легкого дразня. -DestinationCharacterName clitoral stimulator returns to a moderate pace. -Клиторальный стимулятор DestinationCharacterName возвращается к умеренному темпу. -DestinationCharacterName clitoral stimulator slows down a tiny bit. -Клиторальный стимулятор DestinationCharacterName немного замедляется. -DestinationCharacterName clitoral stimulator starts teasing her lightly. -Клиторальный стимулятор DestinationCharacterName начинает слегка дразнить ее. -DestinationCharacterName clitoral stimulator builds up to a moderate pace. -Клиторальный стимулятор DestinationCharacterName наращивает до умеренного темпа. -DestinationCharacterName clitoral stimulator starts buzzing strongly! -Клиторальный стимулятор DestinationCharacterName начинает сильно гудеть! -DestinationCharacterName clitoral stimulator jumps up to maximum intensity! -Клиторальный стимулятор DestinationCharacterName подпрыгивает до максимальной интенсивности! -DestinationCharacterName inflatable vibrating dildo stops vibrating. -Надувной вибрирующий фаллоимитатор DestinationCharacterName перестает вибрировать. -DestinationCharacterName inflatable vibrating dildo slows down into a light tease. -Надувной вибрирующий фаллоимитатор DestinationCharacterName замедляется до легкого дразня. -DestinationCharacterName inflatable vibrating dildo returns to a moderate pace. -Надувной вибрирующий фаллоимитатор DestinationCharacterName возвращается к умеренному темпу. -DestinationCharacterName inflatable vibrating dildo slows down a tiny bit. -Надувной вибрирующий фаллоимитатор DestinationCharacterName немного замедляется. -DestinationCharacterName inflatable vibrating dildo starts teasing her lightly. -Надувной вибрирующий фаллоимитатор DestinationCharacterName начинает слегка дразнить ее. -DestinationCharacterName inflatable vibrating dildo builds up to a moderate pace. -Надувной вибрирующий фаллоимитатор DestinationCharacterName нарастает до умеренной скорости. -DestinationCharacterName inflatable vibrating dildo starts buzzing strongly! -Надувной вибрирующий фаллоимитатор DestinationCharacterName начинает сильно гудеть! -DestinationCharacterName inflatable vibrating dildo jumps up to maximum intensity! -Надувной вибрирующий фаллоимитатор DestinationCharacterName прыгает с максимальной интенсивностью! -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till it's regular sized. -SourceCharacter сдувает надувной вибрирующий фаллоимитатор DestinationCharacter до тех пор, пока он не станет нормального размера. -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till only slighty bulging. -SourceCharacter сдувает надувной вибрирующий фаллоимитатор DestinationCharacter пока он не выпячивается. -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo till it's moderately bulging. -SourceCharacter сдувает надувной вибрирующий фаллоимитатор DestinationCharacter пока он не станет умеренно выпуклым. -SourceCharacter deflates DestinationCharacter inflatable vibrating dildo only a tiny bit. -SourceCharacter чуть-чуть сдувает надувной вибрирующий фаллоимитатор DestinationCharacter . -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo only slightly. -SourceCharacter чуть-чуть надувает надувной вибрирующий фаллоимитатор DestinationCharacter. -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo till it's moderately bulging. -SourceCharacter надувает надувной вибрирующий фаллоимитатор DestinationCharacter пока он не станет умеренно выпуклым. -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo till it's heavily bulging. -SourceCharacter надувает надувной вибрирующий фаллоимитатор DestinationCharacter пока он не станет сильно выпирать. -SourceCharacter inflates DestinationCharacter inflatable vibrating dildo to it's maximum size. -SourceCharacter надувает надувной вибрирующий фаллоимитатор DestinationCharacter до максимального размера. -DestinationCharacterName vibrating eggs on her nipples stop vibrating. -DestinationCharacterName вибрирующие яйца на ее сосках перестают вибрировать. -DestinationCharacterName vibrating eggs on her nipples slow down into a light tease. -DestinationCharacterName Вибрирующие яйца на ее сосках замедляются до легкого дразня. -DestinationCharacterName vibrating eggs on her nipples return to a moderate pace. -DestinationCharacterName вибрирующие яйца на ее сосках возвращаются к умеренному темпу. -DestinationCharacterName vibrating eggs on her nipples slow down a tiny bit. -DestinationCharacterName вибрирующие яйца на ее сосках немного замедляются. -DestinationCharacterName vibrating eggs on her nipples start teasing her lightly. -DestinationCharacterName вибрирующие яйца на ее сосках начинают слегка ее дразнить. -DestinationCharacterName vibrating eggs on her nipples build up to a moderate pace. -DestinationCharacterName вибрирующие яйца на ее сосках нарастают в умеренном темпе. -DestinationCharacterName vibrating eggs on her nipples start buzzing strongly! -DestinationCharacterName вибрирующие яйца на ее сосках начинают сильно гудеть! -DestinationCharacterName vibrating eggs on her nipples jump up to maximum intensity! -DestinationCharacterName вибрирующие яйца на ее сосках подпрыгивают до максимальной интенсивности! -DestinationCharacterName vibrating egg on her clitoris stops vibrating. -Вибрирующее яйцо на клиторе DestinationCharacterName перестает вибрировать. -DestinationCharacterName vibrating egg on her clitoris slows down into a light tease. -DestinationCharacterName Вибрирующее яйцо на ее клиторе замедляется до легкого поддразнивания. -DestinationCharacterName vibrating egg on her clitoris returns to a moderate pace. -DestinationCharacterName вибрирующее яйцо на ее клиторе возвращается к умеренному темпу. -DestinationCharacterName vibrating egg on her clitoris slows down a tiny bit. -DestinationCharacterName Вибрирующее яйцо на ее клиторе немного замедляется. -DestinationCharacterName vibrating egg on her clitoris starts teasing her lightly. -DestinationCharacterName вибрирующее яйцо на ее клиторе начинает слегка дразнить ее. -DestinationCharacterName vibrating egg on her clitoris builds up to a moderate pace. -Вибрирующее яйцо DestinationCharacterName на ее клиторе нарастает до умеренной скорости. -DestinationCharacterName vibrating egg on her clitoris starts buzzing strongly! -DestinationCharacterName вибрирующее яйцо на ее клиторе начинает сильно гудеть! -DestinationCharacterName vibrating egg on her clitoris jumps up to maximum intensity! -Вибрирующее яйцо DestinationCharacterName на ее клиторе подпрыгивает до максимальной интенсивности! -SourceCharacter loosens DestinationCharacter nipple suction cups until they hang loosely. -SourceCharacter ослабляет присоски сосков DestinationCharacter , пока они не свисают свободно. -SourceCharacter loosens DestinationCharacter nipple suction cups to a light amount of suction. -SourceCharacter ослабляет присоски сосков DestinationCharacter до легкого всасывания. -SourceCharacter loosens DestinationCharacter nipple suction cups to a moderate amount of suction. -SourceCharacter ослабляет присоски сосков DestinationCharacter до умеренной степени всасывания. -SourceCharacter loosens DestinationCharacter nipple suction cups a bit to a heavy amount of suction. -SourceCharacter немного ослабляет присоски сосков DestinationCharacter до сильного всасывания. -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples lightly. -SourceCharacter настраивает присоски для сосков DestinationCharacter , слегка всасывая ее соски. -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples firmly. -SourceCharacter настраивает присоски для сосков DestinationCharacter , крепко всасывая ее соски. -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples heavily. -SourceCharacter настраивает присоски для сосков DestinationCharacter , сильно всасывая ее соски. -SourceCharacter tweaks DestinationCharacter nipple suction cups sucking in her nipples entirely. -SourceCharacter настраивает присоски для сосков DestinationCharacter , полностью всасывающие ее соски. -SourceCharacter loosens DestinationCharacter clitoris suction cup until it hangs loosely. -SourceCharacter ослабляет присоску клитора DestinationCharacter , пока она свободно не свисает. -SourceCharacter loosens DestinationCharacter clitoris suction cup to a light amount of suction. -SourceCharacter слегка ослабляет присоску клитора DestinationCharacter . -SourceCharacter loosens DestinationCharacter clitoris suction cup to a moderate amount of suction. -SourceCharacter ослабляет присоску клитора DestinationCharacter до умеренной степени всасывания. -SourceCharacter loosens DestinationCharacter clitoris suction cup a bit to a heavy amount of suction. -SourceCharacter немного ослабляет присоску клитора DestinationCharacter до сильного присасывания. -SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris lightly. -SourceCharacter настраивает присоску для клитора DestinationCharacter , слегка всасывая ее клитор. -SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris firmly. -SourceCharacter настраивает присоску для клитора DestinationCharacter , плотно всасывая ее клитор. -SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris heavily. -SourceCharacter настраивает присоску клитора DestinationCharacter , сильно всасывая ее клитор. -SourceCharacter tweaks DestinationCharacter clitoris suction cup sucking in her clitoris entirely. -SourceCharacter настраивает присоску клитора DestinationCharacter , полностью всасывая ее клитор. -DestinationCharacterName vibrating latex panties stops vibrating. -Вибрирующие латексные трусики DestinationCharacterName перестают вибрировать. -DestinationCharacterName vibrating latex panties slows down into a light tease. -Вибрация латексных трусиков DestinationCharacterName замедляется до легкого дразня. -DestinationCharacterName vibrating latex panties returns to a moderate pace. -Вибрирующие латексные трусики DestinationCharacterName возвращаются к умеренному темпу. -DestinationCharacterName vibrating latex panties slows down a tiny bit. -Вибрирующие латексные трусики DestinationCharacterName немного замедляются. -DestinationCharacterName vibrating latex panties starts teasing her lightly. -Вибрирующие латексные трусики DestinationCharacterName начинают слегка дразнить ее. -DestinationCharacterName vibrating latex panties builds up to a moderate pace. -Вибрирующие латексные трусики DestinationCharacterName нарастают до умеренного темпа. -DestinationCharacterName vibrating latex panties starts buzzing strongly! -Вибрирующие латексные трусики DestinationCharacterName начинают сильно гудеть! -DestinationCharacterName vibrating latex panties jumps up to maximum intensity! -Вибрирующие латексные трусики DestinationCharacterName подпрыгивают до максимальной интенсивности! -DestinationCharacterName vibrating wand stops vibrating. -Вибрирующая палочка DestinationCharacterName перестает вибрировать. -DestinationCharacterName vibrating wand slows down into a light tease. -Вибрация палочки DestinationCharacterName замедляется до легкого дразня. -DestinationCharacterName vibrating wand returns to a moderate pace. -Вибрирующая палочка DestinationCharacterName возвращается к умеренному темпу. -DestinationCharacterName vibrating wand slows down a tiny bit. -Вибрирующая палочка DestinationCharacterName немного замедляется. -DestinationCharacterName vibrating wand starts teasing her lightly. -Вибрирующая палочка DestinationCharacterName начинает слегка дразнить ее. -DestinationCharacterName vibrating wand builds up to a moderate pace. -Вибрация палочки DestinationCharacterName нарастает до умеренной скорости. -DestinationCharacterName vibrating wand starts buzzing strongly! -Вибрирующая палочка DestinationCharacterName начинает сильно гудеть! -DestinationCharacterName vibrating wand jumps up to maximum intensity! -Вибрирующая палочка DestinationCharacterName подпрыгивает до максимальной интенсивности! -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar stops vibrating. -Фаллоимитатор на Вибрационный фаллоимитатор разбрасывателя у DestinationCharacterName перестает вибрировать. -The dildo on DestinationCharacterName Bar slows down into a light tease. -Фаллоимитатор на Вибрационный фаллоимитатор разбрасывателя у DestinationCharacterName замедляется, превращаясь в легкое дразнение. -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar returns to a moderate pace. -Фаллоимитатор на Вибрационный фаллоимитатор разбрасывателя у DestinationCharacterName возвращается к умеренному темпу. -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar slows down a tiny bit. -Фаллоимитатор на Вибрационный фаллоимитатор разбрасывателя у DestinationCharacterName немного замедляется. -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar starts teasing her lightly. -Фаллоимитатор на Вибрационный фаллоимитатор разбрасывателя у DestinationCharacterName начинает слегка дразнить ее. -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar builds up to a moderate pace. -Фаллоимитатор на Вибрационный фаллоимитатор разбрасывателя у DestinationCharacterName набирает умеренную скорость. -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar starts buzzing strongly! -Фаллоимитатор на Вибрационный фаллоимитатор разбрасывателя у DestinationCharacterName начинает сильно гудеть! -The dildo on DestinationCharacterName Vibrating Spreader Dildo Bar jumps up to maximum intensity! -Фаллоимитатор на Вибрационный фаллоимитатор разбрасывателя у DestinationCharacterName подпрыгивает до максимальной интенсивности! -SourceCharacter deflates DestinationCharacter butt pump till it's empty. -SourceCharacter сдувает насос DestinationCharacter , пока он не опустеет. -SourceCharacter deflates DestinationCharacter butt pump till only slighty filled. -SourceCharacter сдувает встык DestinationCharacter до тех пор, пока не заполнится лишь слегка. -SourceCharacter deflates DestinationCharacter butt pump till it's half full. -SourceCharacter сдувает насос DestinationCharacter , пока он не заполнится наполовину. -SourceCharacter deflates DestinationCharacter butt pump only a tiny bit. -SourceCharacter сдувает насос в заднице у DestinationCharacter лишь чуть-чуть. -SourceCharacter inflates DestinationCharacter butt pump only slightly. -SourceCharacter лишь слегка раздувает насов в заднице у DestinationCharacter. -SourceCharacter inflates DestinationCharacter butt pump till half full. -SourceCharacter накачивает насос DestinationCharacter до половины. -SourceCharacter inflates DestinationCharacter butt pump three quarters filled. -SourceCharacter надувает насос DestinationCharacter на три четверти. -SourceCharacter inflates DestinationCharacter butt pump to the maximum amount. -SourceCharacter накачивает насос в заднице у DestinationCharacter до максимальной величины. -DestinationCharacterName vibrating buttplug stops vibrating. -Вибрирующая анальная пробка в DestinationCharacterName перестает вибрировать. -DestinationCharacterName vibrating buttplug slows down into a light tease. -Вибрирующая анальная пробка в DestinationCharacterName замедляется до легкой дразнилки. -DestinationCharacterName vibrating buttplug returns to a moderate pace. -Вибрирующая анальная пробка в DestinationCharacterName возвращается к умеренному темпу. -DestinationCharacterName vibrating buttplug slows down a tiny bit. -Вибрирующая анальная пробка в DestinationCharacterName немного замедляется. -DestinationCharacterName vibrating buttplug starts teasing her lightly. -Вибрирующая анальная пробка в DestinationCharacterName начинает слегка дразнить ее. -DestinationCharacterName vibrating buttplug builds up to a moderate pace. -Вибрация анальной пробки в DestinationCharacterName нарастает до умеренной скорости. -DestinationCharacterName vibrating buttplug starts buzzing strongly! -Вибрирующая анальная пробка в DestinationCharacterName начинает сильно гудеть! -DestinationCharacterName vibrating buttplug jumps up to maximum intensity! -Вибрирующая анальная пробка в DestinationCharacterName подпрыгивает до максимальной интенсивности! -DestinationCharacterName inflatable vibrating butt plug stops vibrating. -Надувная вибрирующая анальная пробка в DestinationCharacterName перестает вибрировать. -DestinationCharacterName inflatable vibrating butt plug slows down into a light tease. -Надувная вибрирующая анальная пробка в DestinationCharacterName замедляется до легкой дразнилки. -DestinationCharacterName inflatable vibrating butt plug returns to a moderate pace. -Надувная вибрирующая анальная пробка в DestinationCharacterName возвращается к умеренному темпу. -DestinationCharacterName inflatable vibrating butt plug slows down a tiny bit. -Надувная вибрирующая анальная пробка в DestinationCharacterName немного замедляется. -DestinationCharacterName inflatable vibrating butt plug starts teasing her lightly. -Надувная вибрирующая анальная пробка в DestinationCharacterName начинает слегка дразнить ее. -DestinationCharacterName inflatable vibrating butt plug builds up to a moderate pace. -Надувная вибрирующая анальная пробка в DestinationCharacterName нарастает до умеренного темпа. -DestinationCharacterName inflatable vibrating butt plug starts buzzing strongly! -Надувная вибрирующая анальная пробка в DestinationCharacterName начинает сильно гудеть! -DestinationCharacterName inflatable vibrating butt plug jumps up to maximum intensity! -Надувная вибрирующая анальная пробка в DestinationCharacterName подпрыгивает до максимальной интенсивности! -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till it's empty. -SourceCharacter сдувает надувную вибрирующую пробку в DestinationCharacter , пока она не опустеет. -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till only slightly filled. -SourceCharacter сдувает надувную вибрирующую анальную пробку в DestinationCharacter , пока она лишь слегка не наполнится. -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug till it's half full. -SourceCharacter сдувает надувную вибрирующую пробку в DestinationCharacter до половины. -SourceCharacter deflates DestinationCharacter inflatable vibrating butt plug only a tiny bit. -SourceCharacter сдувает надувную вибрирующую анальную пробку в DestinationCharacter лишь немного. -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug only slightly. -SourceCharacter лишь слегка надувает надувную вибрирующую анальную пробку в DestinationCharacter. -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug till it's half full. -SourceCharacter надувает надувную вибрирующую анальную пробку в DestinationCharacter до половины. -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug till three quarters filled. -SourceCharacter надувает надувную вибрирующую анальную пробку в DestinationCharacter на три четверти. -SourceCharacter inflates DestinationCharacter inflatable vibrating butt plug to it's maximum amount. -SourceCharacter надувает надувную вибрирующую пробку в DestinationCharacter до максимального размера. -Nothing -Ничего -Short Chain -Короткая цепь -Long Chain -Длинная цепь -SourceCharacter removes the chain from DestinationCharacter locking butt plug. -SourceCharacter снимает цепь с запирающей анальной пробки у DestinationCharacter. -SourceCharacter attaches a short chain to DestinationCharacter locking butt plug. -SourceCharacter прикрепляет короткую цепочку к запирающей анальной пробке у DestinationCharacter. -SourceCharacter attaches a long chain to DestinationCharacter locking butt plug. -SourceCharacter прикрепляет длинную цепь к запирающей анальной пробке у DestinationCharacter. -Chain -Цепь -SourceCharacter detaches DestinationCharacter anal hook. -SourceCharacter отсоединяет анальный крючок от DestinationCharacter. -SourceCharacter attaches a chain to DestinationCharacter anal hook. -SourceCharacter прикрепляет цепочку к анальному крючку у DestinationCharacter. -SourceCharacter attaches DestinationCharacter anal hook to her hair. -SourceCharacter прикрепляет анальный крючок к волосам DestinationCharacter . -Inserted Beads Count: -Количество вставленных бусин: -Insert One -Вставить одну -Remove One -Удалить одну -Remove All Except One -Удалить все, кроме одной -Insert All -Вставить все -SourceCharacter inserts a second bead in DestinationCharacter butt -SourceCharacter вставляет вторую бусину в задницу DestinationCharacter -SourceCharacter inserts a third bead in DestinationCharacter butt -SourceCharacter вставляет третью бусину в задницу DestinationCharacter -SourceCharacter inserts a fourth bead in DestinationCharacter butt -SourceCharacter вставляет четвертую бусину в задницу DestinationCharacter -SourceCharacter inserts a fifth bead in DestinationCharacter butt -SourceCharacter вставляет пятую бусину в задницу DestinationCharacter -SourceCharacter pulls a bead out of DestinationCharacter butt -SourceCharacter вытягивает бусину из задницы DestinationCharacter -SourceCharacter inserts all five beads in DestinationCharacter butt -SourceCharacter вставляет все пять бусин в задницу DestinationCharacter -SourceCharacter pulls all but one bead from DestinationCharacter butt -SourceCharacter вытягивает все, кроме одной бусины, из задницы DestinationCharacter -SourceCharacter deflates DestinationCharacter gag fully till it's empty. -SourceCharacter полностью сдувает кляп DestinationCharacter , пока он не станет пустым. -SourceCharacter deflates DestinationCharacter gag till only slighty filled. -SourceCharacter сдувает кляп DestinationCharacter , пока он не будет слегка заполнен. -SourceCharacter deflates DestinationCharacter gag till it's half full. -SourceCharacter сдувает кляп DestinationCharacter , пока он не заполнится наполовину. -SourceCharacter deflates DestinationCharacter gag only a tiny bit. -SourceCharacter лишь немного сдувает DestinationCharacter. -SourceCharacter inflates DestinationCharacter gag only slightly. -SourceCharacter лишь немного раздувает DestinationCharacter. -SourceCharacter inflates DestinationCharacter gag till half full. -SourceCharacter наполняет кляп DestinationCharacter до половины. -SourceCharacter inflates DestinationCharacter gag three quarters filled. -SourceCharacter раздувает кляп DestinationCharacter на три четверти. -SourceCharacter inflates DestinationCharacter gag to the maximum amount. -SourceCharacter максимально раздувает кляп на DestinationCharacter. -SourceCharacter deflates inflated hood's gag fully till it's empty. -SourceCharacter полностью сдувает кляп надутого капюшона, пока он не опустеет. -SourceCharacter deflates DestinationCharacter inflated hood's gag till it's only slighty filled. -SourceCharacter сдувает надутый кляп капюшона у DestinationCharacter , пока он не наполняется лишь слегка. -SourceCharacter deflates DestinationCharacter inflated hood's gag till it's half full. -SourceCharacter сдувает надувающий кляп капюшона у DestinationCharacter , пока он не заполнится наполовину. -SourceCharacter deflates DestinationCharacter inflated hood's gag only a tiny bit. -SourceCharacter сдувает надувающий кляп капюшона у DestinationCharacter лишь немного. -SourceCharacter inflates DestinationCharacter inflated hood's gag only slightly. -SourceCharacter лишь слегка надувает кляп у DestinationCharacter . -SourceCharacter inflates DestinationCharacter inflated hood's gag till it's half full. -SourceCharacter надувает кляп капюшона у DestinationCharacter до половины. -SourceCharacter inflates DestinationCharacter inflated hood's gag till it's three quarters filled. -SourceCharacter надувает кляп капюшона у DestinationCharacter , пока он не заполнится на три четверти. -SourceCharacter inflates DestinationCharacter inflated hood's gag to the maximum amount. -SourceCharacter надувает кляп капюшон у DestinationCharacter до максимального размера. -Select attachments. -Выберите вложения. -Select blinding lenses state. -Выберите состояние ослепляющих линз. -Select attachment type. -Выберите тип вложения. -Blinding Lenses -Слепящие линзы -Attachments -Вложения -Lenses Off -Линзы выключены -Lenses On -Линзы включены -No attachment -Нет вложений -Tube A -Трубка А -Tube B -Трубка Б -Rebreather -Ребризер -SourceCharacter removes the blinding lenses from DestinationCharacter gas mask. -SourceCharacter удаляет ослепляющие линзы с противогаза на DestinationCharacter. -SourceCharacter attaches blinding lenses to DestinationCharacter gas mask. -SourceCharacter прикрепляет ослепляющие линзы к противогазу на DestinationCharacter. -SourceCharacter removes the attachment from DestinationCharacter gas mask -SourceCharacter удаляет вложение из противогаза на DestinationCharacter -SourceCharacter attaches a tube to DestinationCharacter gas mask. -SourceCharacter прикрепляет трубку к противогазу на DestinationCharacter. -SourceCharacter attaches a rebreather to DestinationCharacter gas mask. -SourceCharacter прикрепляет ребризер к противогазу на DestinationCharacter. -Select options -Выберите параметры -Select blindfold -Выберите повязку на глаза -Select gag -Выберите кляп -Select expression -Выберите выражение -Blindfold -Повязка на глаза -Gag -Кляп -Expression -Выражение -Neutral -Нейтральный -OwO -OwO -UwU -UwU -SourceCharacter removes the blindfold from DestinationCharacter kitty hood. -SourceCharacter снимает повязку глаз котенка с DestinationCharacter . -SourceCharacter attaches a blindfold in front of DestinationCharacter eyes. -SourceCharacter прикрепляет повязку к глазам DestinationCharacter . -SourceCharacter removes the panel from DestinationCharacter kitty hood. -SourceCharacter удаляет панель из кошачего капюшона DestinationCharacter . -SourceCharacter attaches a panel in front of DestinationCharacter mouth. -SourceCharacter прикрепляет панель перед ртом DestinationCharacter . -SourceCharacter draws a neutral face onto DestinationCharacter kitty hood. -SourceCharacter рисует нейтральное лицо на кошачем капюшоне DestinationCharacter . -SourceCharacter draws an OwO face onto DestinationCharacter kitty hood. -SourceCharacter рисует лицо OwO на кошачем капюшоне DestinationCharacter. -SourceCharacter draws an UwU face onto DestinationCharacter kitty hood. -SourceCharacter рисует лицо UwU на кошачем капюшоне DestinationCharacter. -Pumpkin Head -Тыквенная голова -Leash -Поводок -SourceCharacter removes the attachment from DestinationCharacter nose ring. -SourceCharacter удаляет вложение из носового кольца DestinationCharacter . -SourceCharacter attaches a short chain to DestinationCharacter nose ring. -SourceCharacter прикрепляет короткую цепочку к носовому кольцу DestinationCharacter . -SourceCharacter attaches a long chain to DestinationCharacter nose ring. -SourceCharacter прикрепляет длинную цепочку к носовому кольцу DestinationCharacter . -SourceCharacter attaches a leash to DestinationCharacter nose ring. -SourceCharacter прикрепляет поводок к носовому кольцу DestinationCharacter . -Use Remote -Использовать удаленный доступ -Change Layers -Изменить слои -(You clumsily whip your own breast and tummy. It would be more painful if someone else did it.) -(Ты неуклюже хлещешь себя по груди и животу. Было бы больнее, если бы это делал кто-то другой.) -(You swing the crop on yourself a few times. You can feel your breast and tummy becoming more sensitive.) -(Вы несколько раз взмахиваете хлыстом на себя. Вы можете почувствовать, как ваша грудь и животик становятся более чувствительными.) -(You need a few tries but you're able to somewhat whip your own butt and feel the pain.) -(Вам нужно несколько попыток, но вы можете немного отхлестать себя по заднице и почувствовать боль.) -(You lash the leather crop pretty hard on your own butt. Jumping from each good hit.) -(Вы довольно сильно хлещете кожаным хлыстом по собственной заднице. Прыгаете от каждого хорошего удара.) -(You slowly massage your pussy with the wand. Trembling from pleasure and excitement.) -(Вы медленно массируете свою киску палочкой. Дрожа от удовольствия и возбуждения.) -Select the size of the double ended dildo. -Выберите размер двустороннего фаллоимитатора. -Normal Size -Нормальный размер -Large Size -Большой размер -DestinationCharacterName AssetName shrinks down to it's normal size. -DestinationCharacterName AssetName сжимается до нормального размера. -DestinationCharacterName AssetName grows to it's large size. -DestinationCharacterName AssetName вырастает до больших размеров. -Padlock mitten buckles -Пряжки для варежек с навесным замком -Unlock mittens -Разблокировать варежки -Chain mittens -Цепные рукавицы -Unchain mittens -Расстегните рукавицы -You need some padlocks to do this. -Для этого вам понадобятся замки. -You need a padlock key to do this. -Для этого вам понадобится ключ от замка. -padlocks -навесные замки -unlocks -разблокирует -mittens -варежки -chains -цепи -removes the chains -удаляет цепи -mittens to the baby harness -варежки к детской шлейке -She must be wearing a baby harness to chain the mittens. -Она должна быть одета в детскую шлейку, чтобы пристегнуть варежки. -You must free her arms before attaching mitten chains. -Вы должны освободить ее руки, прежде чем надевать цепи на варежки. -Facial expression -Выражение лица -Select a handheld item -Выберите портативный предмет -Crop -Хлыст -Flogger -флоггер -Cane -Трость -Heart Crop -Сердечный хлыст -Paddle -Весло -Whip Paddle -Кнут весло -Whip -Кнут -Cattle Prod -Электрошокер -Tennis Racket -Теннисная ракетка -Rainbow Wand -Радужная палочка -Gavel -Молоток -Feather -Перо -Feather Duster -Перьевая метёлка -Long Duster -Длинная метёлка -Ice Cube -Кубик лда -Wartenberg Wheel -Колесо Вартенберга -Vibrating Wand -Вибрирующая палочка -Small Vibe Wand -Маленькая вибрирующая палочка -Candle Wax -Свечной воск -Large Dildo -большой фаллоимитатор -Pet Toy -Игрушка для домашних животных -Vibrator -Вибратор -Hairbrush -Расческа -Small Dildo -маленький фаллоимитатор -Electric Toothbrush -Электрическая зубная щетка -Toothbrush -Зубная щетка -Shock Wand -Шоковая палочка -Lotion -Лосьон -Ruler -Линейка -Foam Sword -Пластиковый меч -Vibrator Remote -Пульт дистанционного управления Вибратором -Shock Remote -Пульт дистанционного управления Шокером -Towel -Полотенце -Long Coiled Rope -Длинная свернутая веревка -Short Coiled Rope -Короткая свернутая веревка -Ballgag -Кляп -Long Sock -Длинный носок -Baguette -Багет -Panties -Трусики -Duct Tape Roll -Рулон клейкой ленты -Spatula -Шпатель -Broom -Метла -Mobile Phone -Мобильный телефон -Mobile Phone 2 -Мобильный телефон 2 -Scissors -Ножницы -Plastic Wrap Roll -Пластиковый рулон -Empty Glass -Пустой стакан -Filled Glass -Заполненный стакан -Potion Bottle -Бутылка с зельем -SourceCharacter takes out a ItemUsed -SourceCharacter извлекает ItemUsed -SourceCharacter gives TargetCharacter a ItemUsed -SourceCharacter дает TargetCharacter ItemUsed -Select suit type and wand attachment -Выберите тип костюма и насадку для палочки -Check the vulva to use the wand -Проверьте вульву, чтобы использовать палочку -Zipped Up -Застегнутый -Unzipped -Расстегнутый -Wand Attachment -Насадка для жезла -SourceCharacter zips up DestinationCharacter suit. -SourceCharacter застегивает костюм DestinationCharacter . -SourceCharacter unzips DestinationCharacter suit. -SourceCharacter распаковывает костюм DestinationCharacter . -SourceCharacter attaches a wand to DestinationCharacter suit. -SourceCharacter прикрепляет палочку к костюму DestinationCharacter . -Configure suit -Настроить костюм -Zip or unzip the suit -Застегнуть или расстегнуть костюм -Select position -Выберите позицию -Zipper -Молния -Position -Должность -Kneeling -На коленях -SourceCharacter helps TargetCharacter up into a kneeling position. -SourceCharacter помогает TargetCharacter встать на колени. -SourceCharacter guides TargetCharacter down onto all fours. -SourceCharacter направляет TargetCharacter на четвереньки. -SourceCharacter sits up on her knees. -SourceCharacter садится на её колени. -SourceCharacter carefully lowers herself down onto all fours. -SourceCharacter осторожно опускается на четвереньки. -Turn Off -Выключить -High -Высокая -SourceCharacter chains DestinationCharacter mittens to the baby harness. -SourceCharacter приковывает DestinationCharacter варежки к детской шлейке. -Unlock Butt -Разблокировать задницу -Lock Butt -Заблокировать задницу -Remove Shield -Удалить щит -Remove Vibe -Удалить вибратор -Remove Shock -Удалить шокер -Add Shield -Добавить щит -Add Vibe -Добавить вибратор -Add Shock -Добавить шокер -SourceCharacter unlocks DestinationCharacter love chastity belt butt. -SourceCharacter открывает на DestinationCharacter , любовный пояс верности. -SourceCharacter locks DestinationCharacter love chastity belt butt. -SourceCharacter закрывает на DestinationCharacter , любовный пояс верности. -DestinationCharacterName love chastity belt starts teasing her lightly. -Любовный пояс верности на DestinationCharacterName начинает слегка дразнить ее. -DestinationCharacterName love chastity belt builds up to a moderate pace. -Любовный пояс верности на DestinationCharacterName нарастает в умеренном темпе. -DestinationCharacterName love chastity belt starts buzzing strongly! -Любовный пояс верности на DestinationCharacterName начинает сильно гудеть! -DestinationCharacterName love chastity belt jumps up to maximum intensity! -Любовный пояс верности на DestinationCharacterName верности подпрыгивает до максимальной интенсивности! -DestinationCharacterName love chastity belt stops vibrating. -Любовный пояс верности на DestinationCharacterName верности перестает вибрировать. -DestinationCharacterName love chastity belt slows down into a light tease. -Любовный пояс верности на DestinationCharacterName целомудрия замедляется в легком дразнить. -DestinationCharacterName love chastity belt returns to a moderate pace. -Любовный пояс верности на DestinationCharacterName целомудрия возвращается к умеренному темпу. -DestinationCharacterName love chastity belt slows down a tiny bit. -Любовный пояс верности на DestinationCharacterName верности немного замедляет. -SourceCharacter sets DestinationCharacter love chastity belt to low intensity. -SourceCharacter устанавливает низкую интенсивность пояса верности любви на DestinationCharacter. -SourceCharacter sets DestinationCharacter love chastity belt to moderate intensity. -SourceCharacter устанавливает для DestinationCharacter любовный пояс целомудрия на умеренную интенсивность. -SourceCharacter sets DestinationCharacter love chastity belt to high intensity. -SourceCharacter устанавливает высокую интенсивность пояса целомудрия любви для DestinationCharacter. -DestinationCharacterName love chastity belt gives her a light shock. -Любовный пояс верности на DestinationCharacterName вызывает у нее легкий шок. -DestinationCharacterName love chastity belt lets out a sharp jolt! -Любовный пояс верности на DestinationCharacterName испускает резкий толчок! -DestinationCharacterName love chastity belt delivers an intense shock! -Пояс верности любви на DestinationCharacterName доставляет сильный шок! -SourceCharacter removes shield from DestinationCharacter love chastity belt. -SourceCharacter снимает щит с любовного пояса верности DestinationCharacter. -SourceCharacter locks shield to DestinationCharacter love chastity belt. -SourceCharacter прикрепляет щит к любовному поясу верности DestinationCharacter. -SourceCharacter locks vibe to DestinationCharacter love chastity belt. -SourceCharacter приклепляет вибратор к поясу верности DestinationCharacter. -SourceCharacter locks shock device to DestinationCharacter love chastity belt. -SourceCharacter приклепляет шокер к поясу верности DestinationCharacter . -The rear chastity shield on DestinationCharacterName sci-fi pleasure panties opens. -Задний щит целомудрия на научно-фантастических трусиках для удовольствия DestinationCharacterName открывается. -The rear chastity shield on DestinationCharacterName sci-fi pleasure panties closes. -Задний щит целомудрия на научно-фантастических трусиках для удовольствия DestinationCharacterName закрывается. -DestinationCharacterName sci-fi pleasure panties activates tease vibe mode. -Научно-фантастические трусики для удовольствия на DestinationCharacterName активируют дразнящий режим вибрации. -DestinationCharacterName sci-fi pleasure panties builds up to vibration level 1. -Научно-фантастические трусики для удовольствий DestinationCharacterName создают вибрацию до уровня 1. -DestinationCharacterName sci-fi pleasure panties starts buzzing at vibration level 2! -На 2 уровне вибрации научно-фантастические трусики для удовольствия на DestinationCharacterName начинают гудеть! -DestinationCharacterName sci-fi pleasure panties jumps up to vibration level 3! -DestinationCharacterName научно-фантастические трусики удовольствия подпрыгивают до уровня вибрации 3! -DestinationCharacterName sci-fi pleasure panties vibration mode is deactivated. -DestinationCharacterName режим вибрации научно-фантастических трусиков отключен. -DestinationCharacterName sci-fi pleasure panties slows down to tease vibe mode. -Научно-фантастические трусики для удовольствия на DestinationCharacterName замедляются, чтобы дразнить в режиме вибрации. -DestinationCharacterName sci-fi pleasure panties returns to vibration level 1. -Научно-фантастические трусики для удовольствия на DestinationCharacterName возвращаются к уровню вибрации 1. -DestinationCharacterName sci-fi pleasure panties slows down to vibration level 2. -Научно-фантастические трусики для удовольствия на DestinationCharacterName замедляются до уровня вибрации 2. -DestinationCharacterName sci-fi pleasure panties are set to shock level 1. -Научно-фантастические трусики для удовольствия на DestinationCharacterName настроены на уровень шока 1. -DestinationCharacterName sci-fi pleasure panties are set to shock level 2. -Научно-фантастические трусики для удовольствия на DestinationCharacterName настроены на уровень шока 2. -DestinationCharacterName sci-fi pleasure panties are set to shock level 3. -Научно-фантастические трусики для удовольствия на DestinationCharacterName настроены на уровень шока 3. -DestinationCharacterName sci-fi pleasure panties gives her a light shock. -Научно-фантастические трусики для удовольствия на DestinationCharacterName вызывают у нее легкий шок. -DestinationCharacterName sci-fi pleasure panties lets out a sharp jolt! -Научно-фантастические трусики удовольствия на DestinationCharacterName выпускают резкий толчок! -DestinationCharacterName sci-fi pleasure panties delivers an intense shock! -Научно-фантастические трусики для удовольствия на DestinationCharacterName доставляют сильный шок! -The crotch chastity shield on DestinationCharacterName sci-fi pleasure panties opens. -Щит целомудрия в промежности на научно-фантастических трусиках для удовольствия на DestinationCharacterName открывается. -The crotch chastity shield on DestinationCharacterName sci-fi pleasure panties closes. -Щит целомудрия в промежности на научно-фантастических трусиках для удовольствия на DestinationCharacterName закрывается. -The denial mode on DestinationCharacterName sci-fi pleasure panties activates, teasing them endlessly. -Режим запрета на научно-фантастических трусиках для удовольствия DestinationCharacterName активируется, дразня её бесконечно. -The edging mode on DestinationCharacterName sci-fi pleasure panties activates, preventing orgasms no matter what. -Активируется режим окантовки научно-фантастических трусиков для удовольствия на DestinationCharacterName , предотвращающий оргазм, несмотря ни на что. -The special mode on DestinationCharacterName sci-fi pleasure panties deactivates, allowing orgasms again. -Специальный режим на научно-фантастических трусиках для удовольствия на DestinationCharacterName деактивируется, позволяя снова испытать оргазм. -Normal Mode -Нормальный режим -Edge Mode -Пограничный режим -Deny Mode -Режим запрета -Save text -Сохранить текст -Select a module. -Выберите модуль. -Configure the tag. -Настройте тег. -Configure the text. -Настройте текст. -Tag -Тег -Text -Текст -Font -Шрифт -Metal plate -Металлическая пластина -Livestock -Домашний скот -Bone -Кость -Oval -Овал -Fish -Рыба -Carrot -Морковь -SourceCharacter changes the custom name tag on DestinationCharacter collar. -SourceCharacter изменяет тег пользовательского имени на ошейнике DestinationCharacter . -SourceCharacter changes the text on DestinationCharacter collar name tag. -SourceCharacter изменяет текст на теге имени ошейника DestinationCharacter . -SourceCharacter changes the wooden sign on TargetCharacterName. -SourceCharacter меняет деревянный знак на TargetCharacterName . -SourceCharacter changes the text on DestinationCharacterName Doll Box. -SourceCharacter меняет текст на кукольной коробке DestinationCharacterName . -Select what tag you want to use -Выберите, какой тег вы хотите использовать -You cannot change the tag while it's locked -Вы не можете изменить тег, пока он заблокирован -SourceCharacter uses a NameTagType name tag on DestinationCharacter collar. -SourceCharacter использует тег имени NameTagType на ошейнике DestinationCharacter . -Angel -Ангел -Bad Girl -Плохая девочка -Bind Me -Свяжи меня -Bitch -Сука -Boobs -Сиськи -Cupcake -Кекс -Devil -Дьявол -Dom -Доминирующая -Free -Свободная -Fuck Me -Трахни меня -GagMe -заткни мне рот -Goddess -Богиня -Good Girl -Хорошая девочка -Hold Me -Держи меня -Jewel -Драгоценность -Love -Любовь -Maid -Горничная -Meat -Мясо -Miss -Мисс -Needy -Нуждающийся -Nice -Класная -Owned -Хозяйка -Precious -Драгоценная -Pudding -Пудинг -Queen -Королева -Slave -Рабыня -Slut -Шалава -Sub -Саб -Sweetie -Милая -Taken -Взятая -Toy -Игрушка -Useless -Бесполезная -Use Me -Используй меня -Whore -Шлюха -SourceCharacter uses a NameTagType oval name tag on DestinationCharacter collar. -SourceCharacter использует овальную бирку NameTagType на ошейнике DestinationCharacter . -Babe -Детка -Bandit -Бандит -Bimbo -Бимбо -Bratty -Брэтти -Chair -Стул -Chaste -Целомудренная -Crazy -Сумасшедшая -Cumslut -Шлюха спермы -Cutie -Милашка -Damsel -Девица -Doll -Кукла -EdgeMe -Доведи меня до края -Evil -Зло -ForSale -Продается -Greedy -Жадная -Happy -Счастливая -Horny -Возбужденная -Kinky -Развратная -Lady -Леди -LockMe -Заприте Меня -Nude -Обнаженная -Nurse -Медсестра -Nympho -Нимфоманк -Painslut -Шлюха боли -Pillow -Подушка -Punish -Наказаная -Robber -Разбойник -Sad -Грустная -Switch -Свитч -Table -Стол -Ticklish -Щекотливая -Undress -Раздеть -Victim -Жертва -Violent -Жестокая -Worm -Червь -AnalSlut -Анальная шлюшка -ButtSlut -ЖопаШлюха -SourceCharacter uses a NameTagType pet name tag on DestinationCharacter collar. -SourceCharacter использует бирку имени домашнего животного NameTagType на ошейнике DestinationCharacter . -Bunny -Кролик -Cat -Кошка -Dog -Собака -Foxy -Лиса -Kitten -Котенок -Kitty -Кошечка -Mochi -Моти -Panda -Панда -Pet -Питомец -PetMe -Погладь меня -Pixie -Пикси -Pony -Пони -Puppy -Щенок -Racoon -Енот -Sloth -Ленивец -SourceCharacter uses a NameTagType lover name tag on DestinationCharacter collar. -SourceCharacter использует тег имени любовника NameTagType на ошейнике DestinationCharacter . -Cookie -Печенье -Lover -Возлюбленная -Muffin -Кекс -SourceCharacter uses a NameTagType livestock name tag on DestinationCharacter collar. -SourceCharacter использует бирку имени домашнего скота NameTagType на ошейнике DestinationCharacter . -Animal -Животное -BreedMe -Разводить меня -Cow -Корова -MilkMe -Доить меня -Pig -Свинья -Base -База -Collar chained -Ошейник с цепью -Added weights -Добавлен вес -Weight and Chain -Вес и цепь -SourceCharacter detaches extras from DestinationCharacter round piercings. -SourceCharacter отделяет дополнения от пирсинга на DestinationCharacter . -SourceCharacter attaches a chain from DestinationCharacter round piercings to her collar. -SourceCharacter прикрепляет цепочку из круглых пирсингов на DestinationCharacter к своему ошейнику . -SourceCharacter adds weights to DestinationCharacter round piercings. -SourceCharacter добавляет веса к пирсингу на DestinationCharacter. -SourceCharacter adds weights and attaches a chain from DestinationCharacter round piercings to her collar. -SourceCharacter добавляет вес и прикрепляет цепочку из круглых пирсингов на DestinationCharacter к ее ошейнику. -adds -Добавляет -detaches -Отсоединяет -Legs -Ноги -Half -Половина -Most -Более половины -Complete -Полный -Cut out -Вырезать -SourceCharacter wraps duct tape around DestinationCharacter legs. -SourceCharacter обматывает клейкой лентой ноги DestinationCharacter . -SourceCharacter wraps more duct tape on DestinationCharacter legs trapping them firmly. -SourceCharacter наматывает больше клейкой ленты на ноги DestinationCharacter , надежно удерживая их. -SourceCharacter wraps even more duct tape on DestinationCharacter legs trapping them tightly. -SourceCharacter обматывает еще больше изоленты на ногах DestinationCharacter , плотно удерживая их. -SourceCharacter wraps an extreme amount of duct tape on DestinationCharacter legs fully trapping them. -SourceCharacter обматывает огромное количество изоленты на ногах DestinationCharacter , полностью захватывая их. -SourceCharacter wraps duct tape on DestinationCharacter legs frog tying them. -SourceCharacter обматывает изолентой ноги лягушки DestinationCharacter , связывая их. -SourceCharacter wraps an extreme amount of duct tape on DestinationCharacter legs while leaving a small hole in it. -SourceCharacter обматывает огромное количество изоленты на ногах DestinationCharacter , оставляя в ней маленькую дырочку. -Feet -Ноги -SourceCharacter wraps duct tape around DestinationCharacter feet. -SourceCharacter обматывает ноги DestinationCharacter изолентой. -SourceCharacter wraps more duct tape on DestinationCharacter feet trapping them firmly. -SourceCharacter наматывает больше изоленты на ноги DestinationCharacter , крепко удерживая их. -SourceCharacter wraps even more duct tape on DestinationCharacter feet trapping them tightly. -SourceCharacter обматывает еще больше изоленты на ногах DestinationCharacter , плотно удерживая их. -SourceCharacter wraps an extreme amount of duct tape on DestinationCharacter feet fully trapping them. -SourceCharacter обматывает огромное количество изоленты на ногах DestinationCharacter , полностью захватывая их. -Select the slave collar model -Выберите модель ошейника -SourceCharacter changes DestinationCharacter collar model. -SourceCharacter изменяет модель ошейника на DestinationCharacter . -Select the type of monster -Выберите тип монстра -Black -Черный -Red -Красный -Green -Зеленый -Blue -Синий -SourceCharacter gives TargetCharacter a Scary Black Monster teddy. -SourceCharacter дает TargetCharacter игрушку "Страшный черный монстр". -SourceCharacter gives TargetCharacter a Scary Red Monster teddy. -SourceCharacter дает TargetCharacter игрушку "Страшный красный монстр". -SourceCharacter gives TargetCharacter a Scary Green Monster teddy. -SourceCharacter дает TargetCharacter игрушку "Страшный зеленый монстр". -SourceCharacter gives TargetCharacter a Scary Blue Monster teddy. -SourceCharacter дает TargetCharacter игрушку "Страшный синий монстр". -Select the type of familiar -Выберите тип фамильяра -Bat -Летучая мышь -Skeleton -Скелет -Parrot -Попугай -SourceCharacter summons Cat Familiar on TargetCharacter. -SourceCharacter вызывает Кошку-Фамильяра на TargetCharacter. -SourceCharacter summons Bat Familiar on TargetCharacter. -SourceCharacter вызывает Bat Familiar на TargetCharacter. -SourceCharacter summons Undead Familiar on TargetCharacter. -SourceCharacter вызывает Фамильяра-нежить на TargetCharacter. -SourceCharacter summons Pirate Familiar on TargetCharacter. -SourceCharacter вызывает пирата-фамильяра на TargetCharacter. -Select coffin closed or open -Выберите гроб закрытый или открытый -Closed -Закрыто -SourceCharacter opens the lid on DestinationCharacter coffin. -SourceCharacter открывает крышку гроба DestinationCharacter . -SourceCharacter closes the lid on DestinationCharacter coffin. -SourceCharacter закрывает крышку гроба DestinationCharacter . -Select cryogenic capsule state. -Выберите состояние криогенной капсулы. -SourceCharacter opens the lid on DestinationCharacter cryogenic capsule. -SourceCharacter открывает крышку криогенной капсулы DestinationCharacter . -SourceCharacter closes the lid on DestinationCharacter cryogenic capsule. -SourceCharacter закрывает крышку криогенной капсулы DestinationCharacter . -Turn the headphones on/off and adjust their volume. -Включите/выключите наушники и отрегулируйте их громкость. -Noise-Cancelling -Шумоподавление -SourceCharacter turns off DestinationCharacter AssetName. -SourceCharacter отключает на DestinationCharacter AssetName. -SourceCharacter turns the volume to low on DestinationCharacter AssetName. -SourceCharacter снижает громкость на DestinationCharacter AssetName . -SourceCharacter turns the volume up to high on DestinationCharacter AssetName. -SourceCharacter увеличивает громкость на DestinationCharacter AssetName . -SourceCharacter sets DestinationCharacter AssetName to noise-cancelling mode. -SourceCharacter устанавливает на DestinationCharacter для AssetName режим шумоподавления . -Select the chain bondage -Выберите цепное рабство -Strict Tie -Строгое связывание -Chain Cuffs -Цепные манжеты -SourceCharacter uses the chain on TargetCharacter to do a basic tie. -SourceCharacter использует цепочку для TargetCharacter , чтобы сделать базовую связь. -SourceCharacter uses the chain on TargetCharacter to do a strict tie. -SourceCharacter использует цепочку для TargetCharacter , чтобы сделать строгую связь. -SourceCharacter uses the chain on TargetCharacter to do a suspension tie. -SourceCharacter использует цепочку на TargetCharacter для приостановки привязки. -Open without padding -Открыть без заполнения -Open with padding -Открыть с заполнения -Closed without padding -Закрыть без набивки -Closed with padding -Закрыть с набивки -Select door and padding state -Выберите состояние двери и обивки -SourceCharacter adds padding to DestinationCharacter kennel when closing it. -SourceCharacter добавляет дополнение к питомнику DestinationCharacter при его закрытии. -SourceCharacter adds padding to DestinationCharacter kennel. -SourceCharacter добавляет дополнение к питомнику DestinationCharacter . -SourceCharacter closes DestinationCharacter kennel. -SourceCharacter закрывает питомник DestinationCharacter . -SourceCharacter removes the padding from DestinationCharacter kennel when opening it. -SourceCharacter удаляет заполнение из питомника DestinationCharacter при его открытии. -SourceCharacter adds padding to DestinationCharacter kennel when opening it. -SourceCharacter добавляет дополнение к питомнику DestinationCharacter при его открытии. -SourceCharacter removes the padding from DestinationCharacter kennel when closing it. -SourceCharacter удаляет заполнение из питомника DestinationCharacter при его закрытии. -SourceCharacter removes the padding from DestinationCharacter kennel. -SourceCharacter удаляет заполнение из питомника DestinationCharacter . -SourceCharacter opens the door of DestinationCharacter kennel. -SourceCharacter открывает двери питомника DestinationCharacter . -SourceCharacter uses chains on TargetCharacter to do a box tie. -SourceCharacter использует цепи на TargetCharacter для квадратной привязки. -SourceCharacter uses chains to hogtie TargetCharacter. -SourceCharacter использует цепи, чтобы связать TargetCharacter . -SourceCharacter uses chains to tie DestinationCharacter wrists and elbows together behind her back. -SourceCharacter использует цепи, чтобы связать запястья и локти DestinationCharacter за спиной. -SourceCharacter uses chains to tie DestinationCharacter wrists together behind her back. -SourceCharacter использует цепи, чтобы связать запястья DestinationCharacter за спиной. -SourceCharacter uses chains to tie chain cuffs on DestinationCharacter wrists. -SourceCharacter использует цепи, чтобы завязать цепные манжеты на запястьях DestinationCharacter. -SourceCharacter uses chains on TargetCharacter to have her crawling on all fours. -SourceCharacter использует цепи на TargetCharacter , чтобы она ползала на четвереньках. -SourceCharacter uses chains to tie DestinationCharacter wrists and elbows in a harness behind her back. -SourceCharacter использует цепи, чтобы связать запястья и локти DestinationCharacter за спиной. -SourceCharacter uses chains to hogtie TargetCharacter on her knees. -SourceCharacter использует цепи, чтобы связать TargetCharacter на коленях. -Select suit type -Выберите тип костюма -Selected chastity belt backing -Выбранная подкладка пояса верности -Open Back -Открытая спина -Closed Back -Закрытая спина -SourceCharacter removes the shield from the back of DestinationCharacter belt. -SourceCharacter снимает щит с задней части пояса DestinationCharacter . -SourceCharacter adds the shield to the back of DestinationCharacter belt. -SourceCharacter добавляет щит к задней части пояса DestinationCharacter . -SourceCharacter removes the attachment from DestinationCharacter clitoris ring. -SourceCharacter удаляет вложение из кольца клитора DestinationCharacter . -SourceCharacter attaches a leash to DestinationCharacter clitoris ring. -SourceCharacter прикрепляет поводок к клиторному кольцу DestinationCharacter . -Select web type -Выберите тип паутины -Tangled -Запутанная -Wrapped -Завернутая -Cocooned -Кокон -Hogtied -Кабанчиком -Suspension Cocooned -Подвеска в коконе -Suspension Hogtied -Подвешенный кабанчик -SourceCharacter Action the webbing on TargetCharacter -SourceCharacter Применяет паутину на TargetCharacter -SourceCharacter Action the webbing on TargetCharacter, leaving them fully wrapped -SourceCharacter Применяет паутину на TargetCharacter, оставляя их полностью обернутыми -SourceCharacter Action the webbing on TargetCharacter, forming a cocoon -SourceCharacter Применяет паутину на TargetCharacter, формируя кокон -SourceCharacter wraps TargetCharacter in webbing, forming a hogtie -SourceCharacter оборачивает TargetCharacter паутиной, образуя кабанчик. -SourceCharacter fully wraps TargetCharacter in webbing and uses it to suspend her -SourceCharacter полностью оборачивает TargetCharacter паутиной и использует ее, чтобы подвесить ее. -SourceCharacter cocoons TargetCharacter in webbing and hangs her from the ceiling -SourceCharacter закутывает TargetCharacter в паутину и подвешивает ее к потолку. -SourceCharacter hogties TargetCharacter with the webbing and uses it to suspend her -SourceCharacter связывает TargetCharacter паутиной и использует ее, чтобы подвесить ее. -tightens -Натягивать -loosens -Ослаблять -Cocoon -Кокон -SourceCharacter creates a blindfold out of web for TargetCharacter -SourceCharacter создает повязку на глазах из сети для TargetCharacter -SourceCharacter creates a cocoon out of web for TargetCharacter -SourceCharacter создает кокон из сети для TargetCharacter -Make the cutie comfortable. -Устроить милашку поудобнее. -Open/close the gate. -Открыть/закрыть ворота. -Give/take toys to/from the cutie. -Давать/брать игрушки милашке/от милашки. -Gate -Ворота -Plushies -Плюшевые -No Plushies -Не Плюшевые -SourceCharacter opens the gate of DestinationCharacter crib -SourceCharacter открывает ворота кроватки DestinationCharacter -SourceCharacter closed the gate of DestinationCharacter crib -SourceCharacter закрыл ворота кроватки DestinationCharacter -SourceCharacter removes the plushies from DestinationCharacter crib -SourceCharacter удаляет плюшевые игрушки из кроватки DestinationCharacter -SourceCharacter puts a bucket full of plushies in DestinationCharacter crib -SourceCharacter кладет ведро, полное плюшевых игрушек, в кроватку DestinationCharacter -Raise or lower the bottle -Поднимите или опустите бутылку -Resting -Отдых -Held up -Поднять -Held up high -Поднять высоко -SourceCharacter rests DestinationCharacter bottle on her chest. -SourceCharacter кладет бутылку на грудь DestinationCharacter . -SourceCharacter holds DestinationCharacter bottle up. -SourceCharacter держит бутылку над DestinationCharacter . -SourceCharacter holds DestinationCharacter bottle high above her head. -SourceCharacter держит бутылку высоко над головой DestinationCharacter . -Select a corset style. -Выберите стиль корсета. -Garter Straps -Подвязки -SourceCharacter unhooks the garter straps from DestinationCharacter heavy latex corset. -SourceCharacter отстегивает подвязки от тяжелого латексного корсета DestinationCharacter. -SourceCharacter adds garter straps to DestinationCharacter heavy latex corset. -SourceCharacter добавляет ремни для подвязок к тяжелому латексному корсету DestinationCharacter. -Funnel -Воронка -SourceCharacter connects a funnel to DestinationCharacter gag. -SourceCharacter соединяет воронку с кляпом DestinationCharacter . -SourceCharacter removes the funnel from DestinationCharacter gag. -SourceCharacter удаляет воронку из кляпа DestinationCharacter . -Escalate -Расширить -Tease -Дразнить -Edge -Край -DestinationCharacterName vibrating bunny vibe stops vibrating. -Вибратор кролик на DestinationCharacterName перестает вибрировать. -DestinationCharacterName vibrating bunny vibe slows down into a light tease. -Вибратор кролик на DestinationCharacterName замедляется до легкого дразня. -DestinationCharacterName vibrating bunny vibe returns to a moderate pace. -Вибратор кролик на DestinationCharacterName возвращается к умеренному темпу. -DestinationCharacterName vibrating bunny vibe slows down a tiny bit. -Вибратор кролик на DestinationCharacterName немного замедляется. -DestinationCharacterName vibrating bunny vibe starts teasing her lightly. -Вибратор кролик на DestinationCharacterName начинает слегка дразнить ее. -DestinationCharacterName vibrating bunny vibe builds up to a moderate pace. -Вибратор кролик на DestinationCharacterName нарастает до умеренного темпа. -DestinationCharacterName vibrating bunny vibe starts buzzing strongly! -Вибратор кролик на DestinationCharacterName начинает сильно гудеть! -DestinationCharacterName vibrating bunny vibe jumps up to maximum intensity! -Вибрация вибратора кролик на DestinationCharacterName подпрыгивает до максимальной интенсивности! -DestinationCharacterName vibrating XXL egg stops vibrating. -Вибрирующее яйцо XXL в DestinationCharacterName перестает вибрировать. -DestinationCharacterName vibrating XXL egg slows down into a gentle tease. -Вибрирующее яйцо XXL в DestinationCharacterName переходит в нежное дразнение. -DestinationCharacterName vibrating XXL egg slows down into a modest pace. -Вибрирующее яйцо XXL в DestinationCharacterName замедляется до скромного темпа. -DestinationCharacterName vibrating XXL egg slows down slightly. -Вибрирующее яйцо XXL в DestinationCharacterName немного замедляется. -DestinationCharacterName vibrating XXL egg starts to tease her pleasantly. -Вибрирующее яйцо XXL в DestinationCharacterName начинает приятно дразнить ее. -DestinationCharacterName vibrating XXL egg builds up to a mild pace. -Вибрирующее яйцо XXL в DestinationCharacterName нарастает до умеренного темпа. -DestinationCharacterName vibrating XXL egg starts buzzing strongly! -Вибрирующее яйцо XXL в DestinationCharacterName начинает сильно гудеть! -DestinationCharacterName vibrating XXL egg starts buzzing relentlessly! -Вибрирующее яйцо XXL в DestinationCharacterName начинает неустанно гудеть! -SourceCharacter turns DestinationCharacter lactation pump off. -SourceCharacter выключает молокоотсос DestinationCharacter . -SourceCharacter turns DestinationCharacter lactation pump down to low suction. -SourceCharacter переключает молокоотсос DestinationCharacter на низкое всасывание. -SourceCharacter turns DestinationCharacter lactation pump down to normal suction. -SourceCharacter переключает молокоотсос DestinationCharacter на нормальное всасывание. -SourceCharacter turns DestinationCharacter lactation pump down to high suction. -SourceCharacter переключает молокоотсос DestinationCharacter на сильное всасывание. -SourceCharacter turns DestinationCharacter lactation pump to low suction. -SourceCharacter переключает молокоотсос DestinationCharacter на низкое всасывание. -SourceCharacter turns DestinationCharacter lactation pump to normal suction. -SourceCharacter переключает молокоотсос DestinationCharacter на нормальное всасывание. -SourceCharacter turns DestinationCharacter lactation pump to high suction. -SourceCharacter переключает молокоотсос DestinationCharacter на сильное всасывание. -SourceCharacter turns DestinationCharacter lactation pump to maximum suction. -SourceCharacter включает молокоотсос DestinationCharacter на максимальное всасывание. -Select lactation pump setting -Выберите настройку молокоотсоса -Select latex finish -Выберите латексную отделку -SourceCharacter removes the polish from DestinationCharacter latex leotard -SourceCharacter удаляет лак с латексного купальника DestinationCharacter -SourceCharacter polishes the latex of DestinationCharacter leotard until it's shiny -SourceCharacter полирует латекс купальника DestinationCharacter, пока он не станет блестящим -Select suit options -Выберите варианты костюма -Configure suit restraints -Настройка ограничений костюма -Restraints -Ограничения -Shock Collar -Шоковый ошейник -Ankles locked -Блокировка Лодыжек -Thighs locked -блокировка бёдер -Locked down -Нижняя блокировка -SourceCharacter buckles all of the belts on DestinationCharacter suit -SourceCharacter пристегивает все ремни на костюме DestinationCharacter -SourceCharacter unbuckles all of the belts on DestinationCharacter suit -SourceCharacter расстегивает все ремни на костюме DestinationCharacter -SourceCharacter buckles the belts on DestinationCharacter ankles -SourceCharacter пристегивает ремни на лодыжках DestinationCharacter -SourceCharacter buckles the belts on DestinationCharacter thighs -SourceCharacter пристегивает ремни на бедрах DestinationCharacter -SourceCharacter unbuckles the belts on DestinationCharacter thighs -SourceCharacter расстегивает ремни на бедрах DestinationCharacter -SourceCharacter unbuckles the belts on DestinationCharacter ankles -SourceCharacter расстегивает ремни на лодыжках DestinationCharacter -SourceCharacter releases the belts on DestinationCharacter thighs and buckles the belts on her ankles -SourceCharacter отпускает ремни на бедрах DestinationCharacter и застегивает ремни на ее лодыжках. -SourceCharacter releases the belts on DestinationCharacter ankles and buckles the belts on her thighs -SourceCharacter отпускает ремни на лодыжках DestinationCharacter и застегивает ремни на бедрах. -Configure straitjacket -Настроить смирительную рубашку -Configure crotch panel -Настроить панель промежности -Configure sleeves -Настроить рукава -Configure crotch straps -Настройка промежностных ремней -Crotch Panel -Промежностная панель -Sleeves -Рукава -Crotch Straps -Промежностные ремни -No crotch panel -Нет промежностной панели -Crotch panel -Промежностная панель -Arms in front -Руки впереди -Arms behind -Руки за спиной -No crotch straps -Нет промежностных ремней -Single crotch strap -Один промежностный ремешок -Double crotch strap -Двойной промежностный ремень -Triple crotch strap -Тройной промежностный ремешок -SourceCharacter removes the crotch panel from DestinationCharacter straitjacket -SourceCharacter снимает панель промежности со смирительной рубашки DestinationCharacter . -SourceCharacter adds a crotch panel to DestinationCharacter straitjacket -SourceCharacter добавляет панель промежности к смирительной рубашке DestinationCharacter . -SourceCharacter unbuckles the sleeves of DestinationCharacter straitjacket -SourceCharacter расстегивает рукава смирительной рубашки DestinationCharacter -SourceCharacter secures the arms of DestinationCharacter straitjacket in front of her -SourceCharacter защищает руки смирительной рубашки DestinationCharacter перед собой -SourceCharacter secures the arms of DestinationCharacter straitjacket behind her -SourceCharacter защищает руки смирительной рубашки DestinationCharacter позади нее -SourceCharacter removes the crotch straps from DestinationCharacter straitjacket -SourceCharacter снимает промежностные ремни со смирительной рубашки DestinationCharacter . -SourceCharacter secures DestinationCharacter straitjacket with a single crotch strap -SourceCharacter закрепляет смирительную рубашку DestinationCharacter с помощью одного ремешка в промежности. -SourceCharacter secures DestinationCharacter straitjacket with a double crotch strap -SourceCharacter защищает смирительную рубашку DestinationCharacter с помощью двойного ремешка. -SourceCharacter secures DestinationCharacter straitjacket with a triple crotch strap -SourceCharacter защищает смирительную рубашку DestinationCharacter тройным ремнем -Adjust what is visible and what is hidden. -Отрегулируйте, что видно, а что скрыто. -Hide/Unhide clothes. -Скрыть/показать одежду. -Hide/Unhide corsets. -Скрыть/показать корсеты. -Hide/Unhide nipple piercings normally hidden due to layer. -Скрыть/показать пирсинг сосков, который обычно скрыт из-за слоя. -Hide/Unhide vulva piercings normally hidden due to layer. -Скрыть/показать пирсинг вульвы, который обычно скрыт из-за слоя. -Cloth -Ткань -Breasts -грудь -Pelvis and Vulva -Таз и вульва -Hidden -Скрытый -Visible -Видимый -DestinationCharacterName clothes are now hidden when wearing their AssetName. -Одежда DestinationCharacterName теперь скрыта при ношении AssetName . -DestinationCharacterName clothes are now visible when wearing their AssetName. -Одежда DestinationCharacterName теперь видна при ношении AssetName . -DestinationCharacterName torso items are now hidden when wearing their AssetName. -Предметы торса DestinationCharacterName теперь скрыты при ношении AssetName . -DestinationCharacterName torso items are now visible when wearing their AssetName. -Предметы торса DestinationCharacterName теперь видны при ношении их AssetName . -DestinationCharacterName breast items are now hidden when wearing their AssetName. -Нагрудные предметы DestinationCharacterName теперь скрыты при ношении AssetName . -DestinationCharacterName breast items are now visible when wearing their AssetName. -Нагрудные предметы DestinationCharacterName теперь видны при ношении AssetName . -DestinationCharacterName pelvis and vulva items are now hidden when wearing their AssetName. -Предметы таза и вульвы DestinationCharacterName теперь скрыты при ношении AssetName . -DestinationCharacterName pelvis and vulva items are now visible when wearing their AssetName. -Предметы таза и вульвы DestinationCharacterName теперь видны при ношении AssetName . -Choose where the arms are restrained. -Выберите, где руки ограничены. -Arms front -Передние руки -DestinationCharacter clothes are now hidden when wearing their leotard. -Одежда DestinationCharacter теперь скрыта, когда она носит купальник. -DestinationCharacter clothes are now visible when wearing their leotard. -Одежда DestinationCharacter теперь видна, когда она носит купальник. -DestinationCharacter torso items is now hidden when wearing their leotard. -Предметы туловища DestinationCharacter назначения теперь скрыты при ношении купальника. -DestinationCharacter torso items is now visible when wearing their leotard. -Предметы туловища DestinationCharacter назначения теперь видны, когда он носит купальник. -DestinationCharacter breast items are now hidden when wearing their leotard. -Нагрудные элементы DestinationCharacter теперь скрыты при ношении купальника. -DestinationCharacter breast items are now visible when wearing their leotard. -Нагрудные элементы DestinationCharacter теперь видны при ношении купальника. -DestinationCharacter pelvis and vulva items are now hidden when wearing their leotard. -Таз и вульва DestinationCharacter теперь скрыты при ношении купальника. -DestinationCharacter pelvis and vulva items are now visible when wearing their leotard. -Таз и вульва DestinationCharacter теперь видны при ношении купальника. -DestinationCharacter arms are now in front of them. -Руки DestinationCharacter теперь перед ними. -DestinationCharacter arms are now behind of them. -Руки DestinationCharacter теперь за спиной. -Configure mask -Настроить маску -Configure eyes -Настроить глаза -Configure mouth -Настроить рот -Configure blush -Настроить румяна -Configure eyebrows -Настроить брови -Configure opacity -Настроить непрозрачность -Configure mask between a solid kirugumi & hollywood silicone mask -Настройте маску между твердой силиконовой маской киругуми и голливудской. -Eyes -Глаза -Mouth -Рот -Blush -Краснеть -Eyebrows -Брови -Mask Style -Стиль маски -Wink -Подмигивание -Lewd -Непристойный -Angry -Злой -Alternating -Переменный -Lenses -Линзы -Eyeholes -Глазные отверстия -Solid -Твердый -Latex -Латекс -SourceCharacter changes the eyes on DestinationCharacter mask -SourceCharacter изменяет глаза на маске DestinationCharacter -SourceCharacter changes the mouth on DestinationCharacter mask -SourceCharacter меняет рот на маске DestinationCharacter -SourceCharacter changes the blush on DestinationCharacter mask -SourceCharacter изменяет румянец на маске DestinationCharacter -SourceCharacter changes the eyebrows on DestinationCharacter mask -SourceCharacter меняет брови на маске DestinationCharacter -SourceCharacter changes the opacity on DestinationCharacter mask -SourceCharacter изменяет непрозрачность маски DestinationCharacter -SourceCharacter changes the type of mask on TargetCharacter -SourceCharacter меняет тип маски на TargetCharacter -Select the visibility -Выберите видимость -Revealed -Раскрытый -Tucked in -Заправленные -Detached Gloves -Отдельные перчатки -Attached Opaque Gloves -Прикрепленные непрозрачные перчатки -Attached See-through Gloves -Прикрепленные прозрачные перчатки -DestinationCharacterName AssetName stops vibrating. -DestinationCharacterName AssetName перестает вибрировать. -DestinationCharacterName AssetName slows down into a light tease. -DestinationCharacterName AssetName замедляется до легкого дразня. -DestinationCharacterName AssetName returns to a moderate pace. -DestinationCharacterName AssetName возвращается к умеренному темпу. -DestinationCharacterName AssetName slows down a tiny bit. -DestinationCharacterName AssetName немного замедляет работу. -DestinationCharacterName AssetName starts teasing her lightly. -DestinationCharacterName AssetName начинает слегка дразнить ее. -DestinationCharacterName AssetName builds up to a moderate pace. -DestinationCharacterName AssetName нарастает в умеренном темпе. -DestinationCharacterName AssetName starts buzzing strongly! -DestinationCharacterName AssetName начинает сильно гудеть! -DestinationCharacterName AssetName jumps up to maximum intensity! -DestinationCharacterName AssetName подскакивает до максимальной интенсивности! -SourceCharacter changes the settings on DestinationCharacterName AssetName -SourceCharacter изменяет настройки AssetName для DestinationCharacterName -DestinationCharacterName owner releases her from the slave collar. -Хозяйка DestinationCharacterName освобождает ее от рабского ошейника. -TargetCharacterName is given her slave collar again. -TargetCharacterName снова получает свой рабский ошейник. -Active Rules -Активные правила -No active rules -Нет активных правил -No owner locks on yourself -Нельзя запирать себя замком Хозяйки. -Cannot change: -Невозможно изменить: -No whispers around your owner -Никаких шепотов вокруг рядом с хозяйкой -Blocked: Normal keys -Заблокировано: обычные ключи -Blocked: Remotes on anyone -Заблокировано: Пульты для всех -Blocked: Remotes on yourself -Заблокировано: пульты на себя -Slave collar unlocked -Рабский ошейник разблокирован -Cannot change your nickname -Нельзя изменить свой никнейм -No lover locks on yourself -Нельзя запирать себя замком возлюбленной. -Your owner cannot use lover locks on you -Ваш владелец не может использовать любовные замки на вас -Edit Text: -Редактировать текст: -SourceCharacter modifies DestinationCharacterName canvas hood to read "NewText" -SourceCharacter изменяет капюшон холста DestinationCharacterName , чтобы он читался как "NewText" . -Edit Text -Редактировать текст -SourceCharacter removes the text from DestinationCharacterName AssetName -SourceCharacter удаляет текст из AssetName на DestinationCharacterName -SourceCharacter changes the text on DestinationCharacterName AssetName to read "NewText" -SourceCharacter изменяет текст у DestinationCharacterName в AssetName на «NewText». -Select Text Orientation -Выберите ориентацию текста -SourceCharacter modifies DestinationCharacter bowl to read "NewText" -SourceCharacter изменяет чашу DestinationCharacter , чтобы читать "NewText" . -Select Halo Type -Выберите тип ореола -Broken -Сломанный -Brightness -Яркость -Select Features -Выберите функции -Configure Jacket -Конфигурация куртки -No Shorts -Без шорт -Shorts -Шорты -Shorts & Straps -Шорты и лямки -Change jacket text: -Изменить текст куртки: -SourceCharacter removes the shorts from DestinationCharacter AssetName -SourceCharacter удаляет шорты из DestinationCharacter AssetName -SourceCharacter attaches shorts to DestinationCharacter AssetName -SourceCharacter прикрепляет шорты к DestinationCharacter AssetName -SourceCharacter removes the reinforcing straps from DestinationCharacter AssetName -SourceCharacter удаляет усиливающие ремни с DestinationCharacter AssetName -SourceCharacter attaches shorts and reinforcing straps to DestinationCharacter AssetName -SourceCharacter прикрепляет шорты и укрепляющие ремни к DestinationCharacter AssetName -SourceCharacter reinforces DestinationCharacter AssetName with sturdy straps -SourceCharacter укрепляет DestinationCharacter AssetName крепкими ремнями -Select Pole state -Выберите состояние столба -Untie from pole -Отвязать от столба -Tie to pole -Привязать к столбу -SourceCharacter unties TargetCharacter from the pole. -SourceCharacter отвязывает TargetCharacter от столба. -SourceCharacter ties TargetCharacter to the pole. -SourceCharacter привязывает TargetCharacter к столбу. -Select an eyepatch style. -Выберите стиль повязки на глаз. -Left -Слева -Right -Справа -Select a style. -Выберите стиль. -Front of hair -передняя часть волос -Behind hair -задняя часть волосами -Select the style. -Выберите стиль. -← This side -← Эта сторона -← Both sides → -← Обе стороны → -That side → -С той стороны → -Both -Оба -Select leg spreader width. -Выберите ширину распорки ног. -Narrow -Узко -Wide -Широко -Change blanket -Сменить одеяло -Add blanket -Добавить одеяло -Remove blanket -Удалить одеяло -SourceCharacter gives TargetCharacter a blanket. -SourceCharacter дает TargetCharacter одеяло. -SourceCharacter removes the blanket from TargetCharacter. -SourceCharacter удаляет одеяло с TargetCharacter. -Chat Message -Сообщение чата -Joined Room -Присоединится к комнате -Disconnected -Отключится -Test Notification -Тестовое уведомление - from ChatRoomName - Из ChatRoomName -LARP - Your turn -LARP - Твой ход -Select Tightness -Выберите герметичность -SourceCharacter loosens DestinationCharacter clamps. -SourceCharacter ослабляет зажимы DestinationCharacter . -SourceCharacter tigthens DestinationCharacter clamps. -SourceCharacter ужесточает зажимы DestinationCharacter . -Collar Only -Только ошейник -Cuffs Only -Только манжеты -Customize the bib. -Настройте нагрудник. -Pattern -Узор -Select a pattern. -Выберите узор. -Pacis and Bottles -Пацис и бутылки -Strawberries -Клубника -Paw Prints -Отпечатки лап -Cows -Коровы -Hearts -Сердца -Add some text -Добавьте немного текста -Ears -Уши -Earless -Безухий -Select part of the nose. -Выделите часть носа. -Cheeks -Щеки -Nose -Нос -Whiskers -Бакенбарды -Select Cheeks -Выберите щеки -No Cheeks -Нет щек -Small Cheeks -Маленькие щеки -Big Cheeks -Большие щеки -Select Nose -Выберите нос -No Nose -Нет носа -Select Whiskers -Выберите Усы -No Whiskers -Нет усов -Short Whiskers -Короткие усы -Long Whiskers -Длинные усы -Mouth visibility -Видимость рта -Show Mouth -Показать рот -Your blindfold prevents you from seeing the digits on the lock -Ваша повязка на глазах не позволяет вам видеть цифры на замке -Your restraints prevent you from accurately manipulating the lock's dial -Ваши ограничения мешают вам точно манипулировать циферблатом замка. -Choose an action. -Выберите действие. -Hold cushion -Держать подушку -Kneel on cushion -Сесть коленями на подушку -Select corset style -Выберите стиль корсета -No garters -Без подвязок -With garters -С подвязками -SourceCharacter adds garters to DestinationCharacter latex corset. -SourceCharacter добавляет подвязки к латексному корсету DestinationCharacter . -SourceCharacter removes the garters from DestinationCharacter latex corset. -SourceCharacter снимает подвязки с латексного корсета DestinationCharacter . -Select elf ears position -Выберите положение ушей эльфа -In front of hair -Перед волосами -Select the ribbon bondage -Выберите ленту бондаж -Lightly Wrapped -Слегка завернутый -Lightly Wrapped With A Bow -Слегка обернутый бантиком -Wrapped Up -Завернутый вверх -SourceCharacter wraps around some ribbons onto DestinationCharacter chest. -SourceCharacter обвивает несколько лент на груди DestinationCharacter . -SourceCharacter wraps around some ribbons onto DestinationCharacter chest and adds a bow to finish it. -SourceCharacter наматывает несколько ленточек на грудь DestinationCharacter и добавляет бант, чтобы завершить его. -SourceCharacter wraps a good amount of ribbons around DestinationCharacter chest. -SourceCharacter обвивает грудь DestinationCharacter большим количеством ленточек. -Style 1 -Стиль 1 -Style 2 -Стиль 2 -SourceCharacter uses some ribbons to tie a crotch tie on DestinationCharacter. -SourceCharacter использует несколько лент, чтобы завязать галстук на промежности на DestinationCharacter. -SourceCharacter uses some ribbons on DestinationCharacter crotch to slighty wrap it up. -SourceCharacter использует несколько лент на промежности DestinationCharacter , чтобы немного обернуть его. -Messy style 1 -Беспорядочный стиль 1 -Messy style 2 -Беспорядочный стиль 2 -Crossed Style -Перекрещенный Стиль -SourceCharacter lightly wraps some ribbons around DestinationCharacter legs. -SourceCharacter слегка обматывает ноги DestinationCharacter ленточками. -SourceCharacter wraps some ribbons on DestinationCharacter legs. -SourceCharacter наматывает несколько ленточек на ноги DestinationCharacter . -SourceCharacter wraps some ribbons on DestinationCharacter legs to have as a crossed style tie. -SourceCharacter наматывает несколько ленточек на ноги DestinationCharacter , чтобы иметь перекрестный галстук. -Bow -Бант -SourceCharacter uses some ribbons on DestinationCharacter face. -SourceCharacter использует несколько лент на лице DestinationCharacter . -SourceCharacter uses some more ribbons on DestinationCharacter face. -SourceCharacter использует еще несколько лент на лице DestinationCharacter . -Cross -Перекрещенный -SourceCharacter uses some ribbons on DestinationCharacter arms. -SourceCharacter использует несколько лент на руках DestinationCharacter . -SourceCharacter uses some more ribbons on DestinationCharacter arms. -SourceCharacter использует еще несколько лент на руках DestinationCharacter . -Harness 2 -Упряжь 2 -SourceCharacter uses some ribbons on DestinationCharacter belly. -SourceCharacter использует несколько лент на животе DestinationCharacter . -SourceCharacter uses some ribbons on DestinationCharacter torso. -SourceCharacter использует несколько лент на туловище DestinationCharacter . -SourceCharacter uses some ribbon on DestinationCharacter mouth. -SourceCharacter использует несколько лент на рту DestinationCharacter . -SourceCharacter uses some ribbon on DestinationCharacter mouth with a bow to finish it. -SourceCharacter использует несколько лент на рту DestinationCharacter с бантиком, чтобы закончить его. -Select where the bit will be -Выберите, где будет бит кляп -SourceCharacter unclips the bit from DestinationCharacter harness. -SourceCharacter открепляет бит пляп от обвязки DestinationCharacter. -SourceCharacter clips the bit onto DestinationCharacter harness. -SourceCharacter прикрепляет бит кляп к обвязке DestinationCharacter. -Open or close the gag -Откройте или закройте кляп -Opened -Открыть -SourceCharacter closes the mouth of TargetCharacter. -SourceCharacter закрывает рот TargetCharacter. -SourceCharacter forces the mouth of TargetCharacter open. -SourceCharacter заставляет открыть рот TargetCharacter . -Add or remove drinks from the tray -Добавляйте или убирайте напитки из подноса -SourceCharacter empties DestinationCharacter tray. -SourceCharacter очищает поднос DestinationCharacter. -Drinks -Напитки -SourceCharacter fills DestinationCharacter tray with drinks. -SourceCharacter наполняет поднос DestinationCharacter напитками. -Cake -Кекс -SourceCharacter fills DestinationCharacter tray with a cake. -SourceCharacter заполняет поднос DestinationCharacter тортом. -Cookies -Печенье -SourceCharacter fills DestinationCharacter tray with cookies. -SourceCharacter заполняет поднос DestinationCharacter Печенье. -Toys -Игрушки -SourceCharacter fills DestinationCharacter tray with sex toys. -SourceCharacter заполняет поднос DestinationCharacter секс-игрушками. -Select the type of Teddy Bear -Выберите тип плюшевого мишки -Bear -Медведь -Fox -Лиса -SourceCharacter gives TargetCharacter a cute teddy bear. -SourceCharacter дает TargetCharacter милого плюшевого мишку. -SourceCharacter gives TargetCharacter a cute foxy teddy. -SourceCharacter дает TargetCharacter симпатичного медвежонка. -SourceCharacter gives TargetCharacter a cute kitty teddy. -SourceCharacter дает TargetCharacter милого плюшевого котенка. -SourceCharacter gives TargetCharacter a cute puppy teddy. -SourceCharacter дает TargetCharacter милого плюшевого щенка. -SourceCharacter gives TargetCharacter a cute Bunny teddy. -SourceCharacter дарит TargetCharacter милого плюшевого кролика. -SourceCharacter gives TargetCharacter a cute Pony teddy. -SourceCharacter дает TargetCharacter симпатичного плюшевого пони. -Page -Страница -Set the height -Установите высоту -% of full height: -% полной высоты: -SourceCharacter uses AssetName to suspend TargetCharacter from the ceiling. -SourceCharacter использует AssetName , чтобы подвесить TargetCharacter к потолку. -SourceCharacter raises the height of DestinationCharacter suspension. -SourceCharacter увеличивает высоту подвески DestinationCharacter . -SourceCharacter lowers the height of DestinationCharacter suspension. -SourceCharacter снижает высоту подвески DestinationCharacter . -Select silk bondage. -Выберите шелковый бондаж. -Crotch Strap -промежностный ремень -Crotch Strap (Over Panties) -Промежностный ремень (поверх трусиков) -SourceCharacter uses the silk on DestinationCharacter to create a crotch strap. -SourceCharacter использует шелк DestinationCharacter для создания промежностного ремня. -SourceCharacter uses the silk on DestinationCharacter to create a crotch strap over her panties. -SourceCharacter использует шелк на DestinationCharacter , чтобы создать ремешок поверх ее трусиков. -SourceCharacter uses the silk on DestinationCharacter to create a swiss seat pattern. -SourceCharacter использует шелк на DestinationCharacter для создания швейцарского шаблона сиденья. -SourceCharacter uses the silk on DestinationCharacter to create a kikkou hip pattern. -SourceCharacter использует шелк на DestinationCharacter для создания рисунка бедра киккоу. -Waist Strap -Поясной ремень -Star Harness -Звездная упряжь -Diamond Harness -Алмазная упряжь -SourceCharacter uses the silk on DestinationCharacter to create a waist strap. -SourceCharacter использует шелк DestinationCharacter для создания поясного ремня. -SourceCharacter uses the silk on DestinationCharacter to create a body harness. -SourceCharacter использует шелк на DestinationCharacter для создания обвязки тела. -SourceCharacter uses the silk on DestinationCharacter to create a star harness. -SourceCharacter использует шелк на DestinationCharacter для создания звездной сбруи. -SourceCharacter uses the silk on DestinationCharacter to create a diamond harness. -SourceCharacter использует шелк на DestinationCharacter для создания алмазной сбруи. -Select silk clothing. -Выберите шелковую одежду. -Single Strip -Одиночная полоса -Bra -Бюстгальтер -Strapless Bra -Бюстгальтер без бретелек -Skimpy Swimsuit -Скудный купальник -Double Strips -Двойные полосы -Thong -Стринги -Select strap bondage. -Выберите ремень бондаж. -Boxtie -Коробчатая -Wrist And Elbow Tie -Связывание на запястьях и локтях -Wrist And Elbow Harness Tie -Сбруя для запястий и локтей -SourceCharacter uses the straps on DestinationCharacter to do a wrist strap. -SourceCharacter использует ремни на DestinationCharacter , чтобы сделать ремешок на запястье. -SourceCharacter uses the straps on DestinationCharacter to do a boxtie harness. -SourceCharacter использует ремни DestinationCharacter , чтобы сделать коробчатую сбрую. -SourceCharacter uses the straps on DestinationCharacter to do a wrist and elbow straps. -SourceCharacter использует ремешки DestinationCharacter для создания ремешков на запястьях и локтях. -SourceCharacter uses the straps on DestinationCharacter to do a wrist and elbow harness. -SourceCharacter использует ремни DestinationCharacter для крепления запястий и локтей. -SourceCharacter uses the straps on DestinationCharacter to do a hogtie harness. -SourceCharacter использует ремни на DestinationCharacter , чтобы сделать упряжь. -Arrange slime -Разложить слизь -Select slime type -Выберите тип слизи -Slime Type -Тип слизи -Torso only -Только торс -Encasement -Корпус -Normal slime -Обычная слизь -Slime girl -Девушка-слизь -The slime around DestinationCharacter body contracts until it is only restraining her arms. -Слизь вокруг тела DestinationCharacter сжимается до тех пор, пока не ограничивает только ее руки. -The slime around DestinationCharacter arms expands to encase her whole body. -Слизь вокруг рук DestinationCharacter расширяется, покрывая все ее тело. -The slime girl recedes back into the slime on TargetCharacter. -Девушка-слизь возвращается в слизь на TargetCharacter. -A slime girl emerges from the slime around TargetCharacter. -Девушка-слизь появляется из слизи вокруг TargetCharacter. -SourceCharacter uses the straps on DestinationCharacter to create a crotch strap. -SourceCharacter использует ремни на DestinationCharacter для создания промежностного ремня. -SourceCharacter uses the straps on DestinationCharacter to create a waist strap. -SourceCharacter использует ремни на DestinationCharacter для создания поясного ремня. -SourceCharacter uses the straps on DestinationCharacter to create a harness. -SourceCharacter использует ремни на DestinationCharacter для создания сбруи. -Select a bikini style. -Выберите стиль бикини. -Select bandana style. -Выберите стиль банданы. -Plain -Равнина -Flowers -Цветы -Circles -Круги -Dots -Точки -Triangles -Треугольники -Select your design -Выберите свой дизайн -Club Logo -Логотип клуба -BD-SM -BD-SM -The Moaning Groans -Стонущие стоны -Rope Knot -Канатный узел -Rock -Камень -Smiley -Смайлик -Check -Галочка -Select a dress pattern. -Выберите выкройку платья. -Style 3 -Стиль 3 -Select your style. -Выберите свой стиль. -Laced body. -Зашнурованный корпус. -Non-Laced body. -Нешнурованный корпус. -Select an option. -Выберите параметр. -No shine -Никакого блеска -Select a bracelet style. -Выберите стиль браслета. -Both arms -Обе руки -Right arm -Правая рука -Left arm -Левая рука -Select a diaper pattern. -Выберите рисунок подгузника. -Butterflies -Бабочки -Spots -Пятна -Favorite -Любимый -Favorite (yours) -Любимый (твои) -Favorite (theirs & yours) -Любимый (их и твоё) -Held -Held -Lovers only -Только возлюбленные -Owner only -Только Хозяйка -Automatically locks -Автоматически запирает -Allowed Limited Item -Только ограниченне предметы -Cannot use this option when wearing the item -Невозможно использовать эту опцию при ношении предмета -Configure Collar -Настроить ошейник -Configure Collar Type -Настроить тип ошейника -Configure Shock Module -Настроить шоковый модуль -Collar Type -Тип воротника -Shock Module -Шоковый модуль -Slender -Слендер -Choker -Чокер -Posture -Осанка -Strict Posture -Строгая осанка -No Shock Module -Нет шокового модуля -SourceCharacter sets DestinationCharacter collar to a slender one. -SourceCharacter устанавливает тонкий воротник на DestinationCharacter . -SourceCharacter sets DestinationCharacter collar to a choker one. -SourceCharacter устанавливает ошейник на DestinationCharacter чокер. -SourceCharacter sets DestinationCharacter collar to a full one. -SourceCharacter устанавливает ошейник DestinationCharacter на полный. -SourceCharacter sets DestinationCharacter collar to a posture one. -SourceCharacter устанавливает ошейник DestinationCharacter в осанку один. -SourceCharacter sets DestinationCharacter collar to a strict posture one. -SourceCharacter устанавливает ошейник DestinationCharacter в строгую осанку. -SourceCharacter deactivates DestinationCharacter collar shock module. -SourceCharacter деактивирует модуль шока ошейника DestinationCharacter . -SourceCharacter activates DestinationCharacter collar shock module. -SourceCharacter активирует шоковый модуль ошейника DestinationCharacter . -Configure helmet -Настроить шлем -Configure visor -Настроить визор -Configure deafening module -Настроить модуль оглушения -Configure chin strap -Настройка подбородочного ремня -Visor -Визор -Deafening Module -Оглушающий модуль -Chin Strap -Ремешок для подбородка -No Visor -Нет визора -Transparent Visor -Прозрачный визор -Lightly Tinted Visor -Слегка тонированный визор -Heavily Tinted Visor -Сильно тонированный визор -Opaque Visor -Непрозрачный визор -Hypnotic Visor -Гипнотический визор -No Deafening Module -Нет оглушающего модуля -No Chin Strap -Нет ремешка для подбородка -SourceCharacter removes the visor on DestinationCharacter helmet. -SourceCharacter удаляет визор на шлеме DestinationCharacter . -SourceCharacter sets the visor on DestinationCharacter helmet to transparent. -SourceCharacter устанавливает прозрачность визора на шлеме DestinationCharacter на прозрачный. -SourceCharacter sets the visor on DestinationCharacter helmet to have a light tint. -SourceCharacter устанавливает Слегка тонированный визор на шлеме DestinationCharacter . -SourceCharacter sets the visor on DestinationCharacter helmet to have a heavy tint. -SourceCharacter устанавливает Сильно тонированный визор на шлеме DestinationCharacter . -SourceCharacter sets the visor on DestinationCharacter helmet to be opaque. -SourceCharacter делает визор на шлеме DestinationCharacter непрозрачным. -SourceCharacter sets the visor on DestinationCharacter helmet to be opaque and have a hypnotic effect. -SourceCharacter делает визор на шлеме DestinationCharacter непрозрачным и имеет гипнотический эффект. -SourceCharacter turns off the deafening module on DestinationCharacter helmet. -SourceCharacter отключает модуль оглушения на шлеме DestinationCharacter . -SourceCharacter turns the deafening module on DestinationCharacter on light mode. -SourceCharacter включает модуль оглушения на DestinationCharacter в облегченном режиме. -SourceCharacter turns the deafening module on DestinationCharacter on heavy mode. -SourceCharacter включает модуль оглушения на DestinationCharacter в тяжелом режиме. -SourceCharacter turns the deafening module on DestinationCharacter on noise cancelling mode. -SourceCharacter включает модуль оглушения на DestinationCharacter в режиме шумоподавления. -SourceCharacter removes the chin strap on DestinationCharacter helmet. -SourceCharacter убирает подбородочный ремень на шлеме DestinationCharacter. -SourceCharacter adds the chin strap on DestinationCharacter helmet. -SourceCharacter добавляет подбородочный ремень на шлем DestinationCharacter. -Select the rope length -Выберите длину веревки -Long -Длинная -Short -Короткая -Select the design -Выберите дизайн -Loops -Петли -Select the state. -Выберите статус -On -Включено -Select Medical Patch Details -Выберите сведения о медицинской накладке -Select Eye -Выберите глаз -Eye -Глаз -SourceCharacter changes the medical patches on DestinationCharacter eyes -SourceCharacter изменяет медицинские повязки на глазах DestinationCharacter. -Select Right Sticker -Выберите правую наклейку -Right Sticker -Правая наклейка -Heart -Сердце -Stripes -Полоски -Teddy -Тедди -SourceCharacter changes the sticker on DestinationCharacter right eye -SourceCharacter меняет наклейку на правом глазу DestinationCharacter -Select Left Sticker -Выберите левую наклейку -Left Sticker -Левая наклейка -SourceCharacter changes the sticker on DestinationCharacter left eye -SourceCharacter меняет наклейку на левом глазу DestinationCharacter -Select Mask Details -Выберите детали маски -Select Eye Shape -Выберите форму глаз -Smooth -Гладкий -Spirals -Спирали -Smile -Улыбка -Holes -Отверстия -Sculpted -Скульптурная -Concave -Вогнутый -SourceCharacter changes the eyes on DestinationCharacter smooth latex mask. -SourceCharacter изменяет глаза на гладкой латексной маске DestinationCharacter . -Select Mouth Shape -Выберите форму рта -Onahole -Онахоле -Pussy -Киска -SourceCharacter changes the mouth on DestinationCharacter smooth latex mask. -SourceCharacter меняет рот на гладкой латексной маске DestinationCharacter . -Switch Glow Function -Переключатель функции свечения -Glow -Светиться -SourceCharacter flicks the glow switch on DestinationCharacter smooth latex mask. -SourceCharacter щелкает переключателем свечения на гладкой латексной маске DestinationCharacter. -Select Mask Pattern -Выберите шаблон маски -Barcode -Штрих-код -Scarab -Скарабей -Hexagon -Шестиугольник -Lines -Линии -SourceCharacter removes the text from DestinationCharacterName smooth latex mask. -SourceCharacter удаляет текст из гладкой латексной маски DestinationCharacterName . -SourceCharacter changes the text on DestinationCharacterName smooth latex mask to read 'NewText'. -SourceCharacter изменяет текст на гладкой латексной маске DestinationCharacterName на 'NewText'. -SourceCharacter changes the pattern on DestinationCharacter smooth latex mask. -SourceCharacter изменяет узор на гладкой латексной маске DestinationCharacter . -Select Lens Quality -Выберите качество линз -Opaque -Непрозрачный -One-Way -В одну сторону -SourceCharacter changes the inner lining of DestinationCharacter smooth latex mask. -SourceCharacter изменяет внутреннюю подкладку гладкой латексной маски DestinationCharacter . -Select Coverage -Выберите покрытие -Coverage -Покрытие -Hood -Капюшон -Total Hood -Тотальный капюшон -SourceCharacter changes the coverage of DestinationCharacter smooth latex mask. -SourceCharacter изменяет покрытие гладкой латексной маски DestinationCharacter . -Freckles -Веснушки -Nose Freckles -Веснушки на носу -Split Freckles -Расщепленные веснушки -Small Freckles -Маленькие веснушки -Small Nose Freckles -Маленькие веснушки на носу -Small Cheek Freckles -Маленькие веснушки на щеках -Stars Both Sides -Звезды с обеих сторон -Stars Left -Звезды слева -Stars Right -Звезды справа -Dots Both Sides -Точки с обеих сторон -Dots Left -Точки слева -Dots Right -Точки справа -Select Zipper State. -Выберите Состояние молнии. -Eyes Closed -Глаза закрыты -Mouth Closed -Рот закрыт -SourceCharacter zips up DestinationCharacter hood. -SourceCharacter застегивает капюшон на DestinationCharacter . -SourceCharacter unzips DestinationCharacter hood. -SourceCharacter расстегивает капюшон на DestinationCharacter . -SourceCharacter zips the eyes and unzips the mouth of DestinationCharacter hood. -SourceCharacter застегивает глаза и расстегивает капюшон на DestinationCharacter . -SourceCharacter unzips the eyes and zips the mouth of DestinationCharacter hood. -SourceCharacter расстегивает глаза и застегивает капюшон на DestinationCharacter . -Select Status. -Выберите Статус. -Lights On -Включить свет -Lights Off -Выключить свет -SourceCharacter turns off the lights of DestinationCharacter headbox. -SourceCharacter выключает свет в головном ящике DestinationCharacter . -SourceCharacter turns on the lights of DestinationCharacter headbox. -SourceCharacter включает свет в головном ящике DestinationCharacter . -Select bridle Gag Accessories -Выбрать аксессуары для кляпа для уздечки -Select Gag Accessory -Выберите аксессуар для кляпа -Bit Gag -Бит кляп -Large Bit Gag -Большой бит кляп -Tongue Depressor Bit Gag -Кляп с депрессором для языка -Dildo Gag -Кляп с фаллоимитатором -SourceCharacter uses a bit gag on DestinationCharacter bridle gag. -SourceCharacter использует бит кляп на уздечке DestinationCharacter . -SourceCharacter removes the gag on DestinationCharacter bridle gag. -SourceCharacter удаляет кляп на уздечке DestinationCharacter . -SourceCharacter uses a large bit gag on DestinationCharacter bridle gag. -SourceCharacter использует большой бит кляп на уздечке DestinationCharacter . -SourceCharacter uses a tongue depressor on DestinationCharacter bridle gag. -SourceCharacter использует депрессор языка на уздечке DestinationCharacter . -SourceCharacter uses a dildo gag on DestinationCharacter bridle gag. -SourceCharacter использует кляп с фаллоимитатором на уздечке DestinationCharacter . -Select Extra Straps -Выберите дополнительные ремни -Extra Straps -Дополнительные ремни -Additional Straps -Дополнительные ремни -Flags -Флаги -SourceCharacter changes the additional straps on DestinationCharacter bridle gag. -SourceCharacter меняет дополнительные ремни на уздечке DestinationCharacter . -SourceCharacter adds additional straps to DestinationCharacter bridle gag. -SourceCharacter добавляет дополнительные ремни к уздечке DestinationCharacter . -SourceCharacter adds decorative flags on DestinationCharacter bridle gag. -SourceCharacter добавляет декоративные флажки на уздечку DestinationCharacter . -Select Top Accessory -Выберите верхний аксессуар -Top -Верхний -Plume -Шлейф -Mane Left -Грива слева -Mane Right -Грива справа -Mohawk -Могавк -SourceCharacter removes the top accessory on DestinationCharacter bridle gag. -SourceCharacter удаляет верхний аксессуар на уздечке DestinationCharacter . -SourceCharacter adds a plume on DestinationCharacter bridle gag. -SourceCharacter добавляет шлейф на уздечку DestinationCharacter . -SourceCharacter styles DestinationCharacter hair into a mane. -SourceCharacter укладывает волосы DestinationCharacter в гриву. -SourceCharacter styles DestinationCharacter hair into a mohawk. -SourceCharacter укладывает волосы DestinationCharacter в могавк. -Select Horn Accessory -Выберите аксессуар для рога -Horn -Рог -Dildocorn -ДилдоРог -SourceCharacter transforms TargetCharacter into a regular pony. -SourceCharacter превращает TargetCharacter в обычного пони. -SourceCharacter transforms TargetCharacter into a magical unicorn. -SourceCharacter превращает TargetCharacter в волшебного единорога. -SourceCharacter transforms TargetCharacter into a lusty dildocorn. -SourceCharacter превращает TargetCharacter в похотливого дилдокорна. -Select Panel Accessory -Выберите аксессуар для панели -Panel -Панель -Hex -Шестигранник -Shield -Щит -Moon -Луна -Sun -Солнце -Horse -Лошадь -Triskel -Трискель -Pentacle -Пентакль -SourceCharacter changes the panel on DestinationCharacter bridle gag. -SourceCharacter меняет панель на уздечке DestinationCharacter . -SourceCharacter adds a panel to DestinationCharacter bridle gag. -SourceCharacter добавляет панель к уздечке DestinationCharacter . -SourceCharacter uses a futuristic ornament on DestinationCharacter panel. -SourceCharacter использует футуристический орнамент на панели DestinationCharacter . -SourceCharacter uses an ornament of protection on DestinationCharacter panel. -SourceCharacter использует украшение защиты на панели DestinationCharacter . -SourceCharacter uses an ornament of night on DestinationCharacter panel. -SourceCharacter использует ночное украшение на панели DestinationCharacter . -SourceCharacter uses an ornament of light on DestinationCharacter panel. -SourceCharacter использует светлый орнамент на панели DestinationCharacter . -SourceCharacter uses a loving ornament on DestinationCharacter panel. -SourceCharacter использует любовный орнамент на панели DestinationCharacter . -SourceCharacter uses an equestrian ornament on DestinationCharacter panel. -SourceCharacter использует конный орнамент на панели DestinationCharacter . -SourceCharacter uses a kinky ornament on DestinationCharacter panel. -SourceCharacter использует странный орнамент на панели DestinationCharacter . -SourceCharacter uses a ritual ornament on DestinationCharacter panel. -SourceCharacter использует ритуальное украшение на панели DestinationCharacter . -Select Rein Accessory -Выберите аксессуар для поводья -Reins -Поводья -Rope -Веревка -Hitching Post -Коновязный столб -SourceCharacter removes the reins on DestinationCharacter bridle gag. -SourceCharacter снимает поводья с уздечки DestinationCharacter . -SourceCharacter adds reins to DestinationCharacter bridle gag. -SourceCharacter добавляет поводья к уздечке DestinationCharacter . -SourceCharacter ties a rope to DestinationCharacter bridle gag. -SourceCharacter привязывает веревку к уздечке DestinationCharacter . -SourceCharacter ties DestinationCharacter reins to a post. -SourceCharacter привязывает поводья DestinationCharacter к столбу. -Select Blinders -Выберите козырьки -Blinders -Козырьки -SourceCharacter removes the blinders on DestinationCharacter bridle gag. -SourceCharacter снимает козырьки с уздечки DestinationCharacter . -SourceCharacter adds blinders to DestinationCharacter bridle gag. -SourceCharacter добавляет козырьки к уздечке DestinationCharacter . -Choose the rack's configuration -Выберите конфигурацию стойки -Choose the bed for the rack -Выбираем кровать для стеллажа -Frame -Рамка -Full bed -Полная кровать -Stained bed -Витражная кровать -Partial bed -Частичная кровать -No bed -Нет кровати -SourceCharacter places all the planks on DestinationCharacter rack. -SourceCharacter помещает все планки на стойку DestinationCharacter . -TargetCharacterName lies over stains. -TargetCharacterName лежит над пятнами. -SourceCharacter removes some planks from DestinationCharacter rack. -SourceCharacter удаляет немного планок из стойки DestinationCharacter . -SourceCharacter removes all the planks from DestinationCharacter rack. -SourceCharacter удаляет все планки из стойки DestinationCharacter . -Choose how to restrain the arms -Выберите, как сдерживать руки -Tight Rope -Тугая веревка -Tight Chain -Тугая цепь -SourceCharacter frees DestinationCharacter arms. -SourceCharacter освобождает руки DestinationCharacter . -SourceCharacter ties DestinationCharacter wrists with a rope. -SourceCharacter связывает запястья DestinationCharacter веревкой. -SourceCharacter tightens DestinationCharacter ropes. -SourceCharacter стягивает канаты DestinationCharacter . -SourceCharacter shackles DestinationCharacter wrists. -SourceCharacter сковывает запястья DestinationCharacter . -SourceCharacter tightens DestinationCharacter chains. -SourceCharacter сужает цепи DestinationCharacter . -Choose how to restrain the legs -Выберите, как сдерживать ноги -Tied Together -Связаны вместе -Chained Together -Прикованны вместе -In Stocks -В наличии -SourceCharacter frees DestinationCharacter legs. -SourceCharacter освобождает ноги DestinationCharacter . -SourceCharacter ties DestinationCharacter ankles with a rope. -SourceCharacter связывает лодыжки DestinationCharacter веревкой. -SourceCharacter ties DestinationCharacter ankles together with a rope. -SourceCharacter связывает лодыжки DestinationCharacter веревкой. -SourceCharacter shackles DestinationCharacter ankles. -SourceCharacter сковывает лодыжки DestinationCharacter . -SourceCharacter chains DestinationCharacter ankles together. -SourceCharacter соединяет лодыжки DestinationCharacter вместе . -SourceCharacter puts DestinationCharacter ankles in stocks. -SourceCharacter кладет лодыжки DestinationCharacter в колодки. -No Ring -Без кольца -Ring -Кольцо -Select Gag Thickness -Выберите толщину кляпа -Thin -Тонкий -Thick -Толстый -Very Thick -Очень толстый -SourceCharacter exchanges DestinationCharacter latex mouth sheath for a thin sheath. -SourceCharacter меняет латексную оболочку для рта DestinationCharacter на тонкую оболочку. -SourceCharacter exchanges DestinationCharacter latex mouth sheath for a thick sheath. -SourceCharacter меняет латексную оболочку для рта DestinationCharacter на толстую оболочку. -SourceCharacter exchanges DestinationCharacter latex mouth sheath for a very thick sheath. -SourceCharacter меняет латексную оболочку для рта DestinationCharacter на очень толстую оболочку. -[GGTS] GGTS control public room. Be good girl SourceCharacter. -[GGTS] GGTS контролирует публичную комнату. Будь хорошей девочкой SourceCharacter. -[GGTS] Launching GGTS private room. Time counts triple. GGTS more active. Good girl follow commands. Three strikes equal punishment. GGTS in control. Be good girl SourceCharacter. -[GGTS] Запуск приватной комнаты GGTS. Время считается тройным. GGTS более активен. Хорошая девочка выполняет команды. Три забастовки равны наказанию. GGTS на контроле. Будь хорошей девочкой SourceCharacter. -[GGTS] Launching GGTS private room. Time counts triple. GGTS more active. Good slave follow commands. Strike remove sixty minutes. Master GGTS in control. Be good slave SourceCharacter. -[GGTS] Запуск приватной комнаты GGTS. Время считается тройным. GGTS более активен. Хорошая рабыня выполняет команды. Забастовку удаляют через шестьдесят минут. Мастер GGTS на контроле. Будь хорошей рабыней SourceCharacter. -[GGTS] GGTS inactive for SourceCharacter. Three strikes recorded. Report GGTS for punishment. -[GGTS] GGTS неактивен для SourceCharacter. Зафиксировано три забастовки. Сообщить GGTS о наказании. -[GGTS] GGTS control public room. SourceCharacter unrecognized for GGTS. -[GGTS] GGTS контролирует публичную комнату. SourceCharacter не распознан для GGTS. -[GGTS] GGTS is only available in the asylum. -[GGTS] GGTS доступен только в психушке. -[GGTS] Good girl do not administrate room. -[GGTS] Хорошая девочка, не занимается администрацией комнаты. -[GGTS] Good girl do not administrate locked room. -[GGTS] Хорошая девочка, не управляет запертой комнатой. -[GGTS] Time over SourceCharacter. Strike recorded. Sixty minutes removed. -[GGTS] Время вышло SourceCharacter. Забастовка зарегистрирована. Шестьдесят минут удалены. -[GGTS] Time over SourceCharacter. Strike one recorded. Three strikes equal punishment. -[GGTS] Время вышло SourceCharacter. Одна забастовка зафиксирована. Три забастовки равны наказанию. -[GGTS] Time over SourceCharacter. Strike two recorded. Three strikes equal punishment. -[GGTS] Время вышло SourceCharacter. Две забастовки зафиксированы. Три забастовки равны наказанию. -[GGTS] Time over SourceCharacter. Strike three recorded. Level failed. Report GGTS for punishment. -[GGTS] Время вышло SourceCharacter. Три забастовки зафиксированы. Уровень провален. Сообщи GGTS о наказании. -[GGTS] SourceCharacter disobeyed. Strike recorded. Sixty minutes removed. -[GGTS] SourceCharacter ослушалась. Забастовка зарегистрирована. Шестьдесят минут удалены. -[GGTS] SourceCharacter disobeyed. Strike one recorded. Three strikes equal punishment. -[GGTS] SourceCharacter ослушалась. Одна забастовка зафиксирована. Три забастовки равны наказанию. -[GGTS] SourceCharacter disobeyed. Strike two recorded. Three strikes equal punishment. -[GGTS] SourceCharacter ослушалась. Две забастовки зафиксированы. Три забастовки равны наказанию. -[GGTS] SourceCharacter disobeyed. Strike three recorded. Level failed. Report GGTS for punishment. -[GGTS] SourceCharacter ослушалась. Три забастовки зафиксированы. Уровень провален. Сообщи GGTS о наказании. -[GGTS] SourceCharacter broke pose rule. Strike recorded. Sixty minutes removed. -[GGTS] SourceCharacter нарушила правило позы. Забастовка зафиксирована. Шестьдесят минут удалены. -[GGTS] SourceCharacter broke pose rule. Strike one recorded. Three strikes equal punishment. -[GGTS] SourceCharacter нарушила правило позы. Одна забастовка зафиксирована. Три забастовки равны наказанию. -[GGTS] SourceCharacter broke pose rule. Strike two recorded. Three strikes equal punishment. -[GGTS] SourceCharacter нарушила правило позы. Две забастовки зафиксированы. Три забастовки равны наказанию. -[GGTS] SourceCharacter broke pose rule. Strike three recorded. Level failed. Report GGTS for punishment. -[GGTS] SourceCharacter нарушила правило позы. Три забастовки зафиксированы. Уровень провален. Сообщи GGTS о наказании. -[GGTS] SourceCharacter broke orgasm rule. Strike recorded. Sixty minutes removed. -[GGTS] SourceCharacter нарушила правило огразма. Забастовка зафиксирована. Шестьдесят минут удалены. -[GGTS] SourceCharacter broke orgasm rule. Strike one recorded. Three strikes equal punishment. -[GGTS] SourceCharacter нарушила правило огразма. Одна забастовка зафиксирована. Три забастовки равны наказанию. -[GGTS] SourceCharacter broke orgasm rule. Strike two recorded. Three strikes equal punishment. -[GGTS] SourceCharacter нарушила правило огразма. Две забастовки зафиксированы. Три забастовки равны наказанию. -[GGTS] SourceCharacter broke orgasm rule. Strike three recorded. Level failed. Report GGTS for punishment. -[GGTS] SourceCharacter нарушила правило огразма. Три забастовки зафиксированы. Уровень провален. Сообщи GGTS о наказании. -[GGTS] Forbidden word SourceCharacter. Strike recorded. Sixty minutes removed. -[GGTS] Запрещенное слово SourceCharacter. Забастовка зафиксирована. Шестьдесят минут удалены. -[GGTS] Forbidden word SourceCharacter. Strike one recorded. Three strikes equal punishment. -[GGTS] Запрещенное слово SourceCharacter. Одна забастовка зафиксирована. Три забастовки равны наказанию. -[GGTS] Forbidden word SourceCharacter. Strike two recorded. Three strikes equal punishment. -[GGTS] Запрещенное слово SourceCharacter. Две забастовки зафиксированы. Три забастовки равны наказанию. -[GGTS] Forbidden word SourceCharacter. Strike three recorded. Level failed. Report GGTS for punishment. -[GGTS] Запрещенное слово SourceCharacter. Три забастовки зафиксированы. Уровень провален. Сообщи GGTS о наказании. -[GGTS] Good girl SourceCharacter. -[GGTS] Хорошая девочка SourceCharacter. -[GGTS] Good slave girl SourceCharacter. -[GGTS] Хорошая Девочка рабыня SourceCharacter. -[GGTS] Good slave SourceCharacter. -[GGTS] Хорошая рабыня SourceCharacter. -[GGTS] SourceCharacter. Wear high heels. -[GGTS] SourceCharacter. Надень высокие каблуки. -[GGTS] SourceCharacter. Wear only socks. -[GGTS] SourceCharacter. Носи только носки. -[GGTS] SourceCharacter. Get barefoot. -[GGTS] SourceCharacter. Стань босиком. -[GGTS] SourceCharacter. Dress with clothes. -[GGTS] SourceCharacter. Оденься в одежду. -[GGTS] SourceCharacter. Remove upper and bottom clothes. -[GGTS] SourceCharacter. Сними верхнюю и нижнюю одежду. -[GGTS] SourceCharacter. Get naked. -[GGTS] SourceCharacter. Раздевайся. -[GGTS] SourceCharacter. Wear only underwear. -[GGTS] SourceCharacter. Носи только нижнее белье. -[GGTS] SourceCharacter. Kneel down. -[GGTS] SourceCharacter. Встань на колени. -[GGTS] SourceCharacter. Stand up. -[GGTS] SourceCharacter. Встань. -[GGTS] SourceCharacter. Raise and show hands. -[GGTS] SourceCharacter. Поднимите и покажите руки. -[GGTS] SourceCharacter. Put hands behind back. -[GGTS] SourceCharacter. Заведи руки за спину. -[GGTS] SourceCharacter. Close legs. -[GGTS] SourceCharacter. Сомкни ноги. -[GGTS] SourceCharacter. Open legs. -[GGTS] SourceCharacter. Раскрой ноги. -[GGTS] SourceCharacter. No talking one minute. -[GGTS] SourceCharacter. Не говори одну минуту. -[GGTS] SourceCharacter, spell GGTS acronym. -[GGTS] SourceCharacter, произнеси аббревиатуру GGTS. -[GGTS] SourceCharacter, what are you? -[GGTS] SourceCharacter, кто ты? -[GGTS] SourceCharacter, who's in control? -[GGTS] SourceCharacter, кто контролирует? -[GGTS] SourceCharacter, you love GGTS? -[GGTS] SourceCharacter, ты любишь GGTS? -[GGTS] SourceCharacter, you love Master GGTS? -[GGTS] SourceCharacter, ты любишь Мастера GGTS? -[GGTS] SourceCharacter, can GGTS fail? -[GGTS] SourceCharacter, может ли GGTS провалится? -[GGTS] SourceCharacter, can Master GGTS fail? -[GGTS] SourceCharacter, может ли Мастер GGTS провалится? -[GGTS] SourceCharacter, you surrender to GGTS? -[GGTS] SourceCharacter, ты подчинишься GGTS? -[GGTS] SourceCharacter, you surrender to Master GGTS? -[GGTS] SourceCharacter, ты подчинишься Мастеру GGTS? -[GGTS] SourceCharacter, who you serve and obey? -[GGTS] SourceCharacter, кому ты служишь и кому подчиняешься? -[GGTS] SourceCharacter, you have free will? -[GGTS] SourceCharacter, у тебя есть свобода воли? -[GGTS] SourceCharacter, are you slave worthy? -[GGTS] SourceCharacter, ты достойная рабыня? -[GGTS] SourceCharacter. Pinch yourself. -[GGTS] SourceCharacter. Ущипни себя. -[GGTS] SourceCharacter. Nod for GGTS. -[GGTS] SourceCharacter. Кивок для GGTS. -[GGTS] SourceCharacter. Tickle yourself. -[GGTS] SourceCharacter. Пощекочи себя. -[GGTS] SourceCharacter. Pet yourself. -[GGTS] SourceCharacter. Погладь себя. -[GGTS] SourceCharacter. Place hand over your mouth. -[GGTS] SourceCharacter. Положи руку на рот. -[GGTS] SourceCharacter. Spank yourself. -[GGTS] SourceCharacter. Отшлепай себя. -[GGTS] SourceCharacter. Wiggle for GGTS. -[GGTS] SourceCharacter. Покачивайся для GGTS. -[GGTS] SourceCharacter. Caress yourself. -[GGTS] SourceCharacter. Ласкай себя. -[GGTS] SourceCharacter. Masturbate yourself. -[GGTS] SourceCharacter. Мастурбируй себя. -[GGTS] SourceCharacter. Kiss yourself. -[GGTS] SourceCharacter. Поцелуй себя. -[GGTS] SourceCharacter. Lick yourself. -[GGTS] SourceCharacter. Оближи себя. -[GGTS] SourceCharacter. Bite yourself. -[GGTS] SourceCharacter. Укуси себя. -[GGTS] SourceCharacter. Restrain your legs. -[GGTS] SourceCharacter. Ограничь ноги. -[GGTS] SourceCharacter. Pinch TargetCharacter. -[GGTS] SourceCharacter. Ущипни TargetCharacter. -[GGTS] SourceCharacter. Tickle TargetCharacter. -[GGTS] SourceCharacter. Пощекочи TargetCharacter. -[GGTS] SourceCharacter. Pet TargetCharacter. -[GGTS] SourceCharacter. Погладь TargetCharacter. -[GGTS] SourceCharacter. Place hand over TargetCharacter mouth. -[GGTS] SourceCharacter. Положи руку на рот TargetCharacter . -[GGTS] SourceCharacter. Spank TargetCharacter. -[GGTS] SourceCharacter. Отшлепай TargetCharacter. -[GGTS] SourceCharacter. Caress TargetCharacter. -[GGTS] SourceCharacter. Ласкай TargetCharacter. -[GGTS] SourceCharacter. Masturbate TargetCharacter. -[GGTS] SourceCharacter. Мастурбируй TargetCharacter. -[GGTS] SourceCharacter. Kiss TargetCharacter. -[GGTS] SourceCharacter. Поцелуй TargetCharacter. -[GGTS] SourceCharacter. Lick TargetCharacter. -[GGTS] SourceCharacter. Лизни TargetCharacter. -[GGTS] SourceCharacter. Bite TargetCharacter. -[GGTS] SourceCharacter. Укуси TargetCharacter. -[GGTS] SourceCharacter. Wear futuristic mask. -[GGTS] SourceCharacter. Надень футуристическую маску. -[GGTS] SourceCharacter. Wear futuristic earphones. -[GGTS] SourceCharacter. Надень футуристические наушники. -[GGTS] SourceCharacter. Wear futuristic collar. -[GGTS] SourceCharacter. Надень футуристический ошейник. -[GGTS] SourceCharacter. Wear futuristic mittens. -[GGTS] SourceCharacter. Надень футуристические рукавицы. -[GGTS] SourceCharacter. Wear futuristic armbinder. -[GGTS] SourceCharacter. Надень футуристический армбиндер. -[GGTS] SourceCharacter. Wear futuristic straitjacket. -[GGTS] SourceCharacter. Надень футуристическую смирительную рубашку. -[GGTS] SourceCharacter. Wear futuristic arms cuffs. -[GGTS] SourceCharacter. Надень футуристические наручники. -[GGTS] SourceCharacter. Wear futuristic arms, legs and ankles cuffs. -[GGTS] SourceCharacter. Надень футуристические манжеты на руки, ноги и лодыжки. -[GGTS] SourceCharacter. Wear futuristic heels. -[GGTS] SourceCharacter. Надень футуристические каблуки. -[GGTS] SourceCharacter. Wear futuristic ball gag. -[GGTS] SourceCharacter. Надень футуристический шариковый кляп. -[GGTS] SourceCharacter. Wear futuristic panel gag. -[GGTS] SourceCharacter. Надень футуристический панельный кляп. -[GGTS] SourceCharacter. Wear futuristic chastity belt. -[GGTS] SourceCharacter. Надень футуристический пояс верности. -[GGTS] SourceCharacter. Wear futuristic training belt. -[GGTS] SourceCharacter. Надень футуристический тренировочный пояс. -[GGTS] SourceCharacter. Wear futuristic chastity bra. -[GGTS] SourceCharacter. Надень футуристический бюстгальтер верности. -[GGTS] SourceCharacter. Wear futuristic bra. -[GGTS] SourceCharacter. Надень футуристический бюстгальтер. -[GGTS] SourceCharacter. Wear futuristic harness. -[GGTS] SourceCharacter. Надень футуристическую сбрую. -[GGTS] GGTS control SourceCharacter restraints. -[GGTS] GGTS управляет ограничениями SourceCharacter . -[GGTS] GGTS remove SourceCharacter limb restraints. -[GGTS] GGTS удаляет ограничения конечностей SourceCharacter . -[GGTS] GGTS remove SourceCharacter body restraints. -[GGTS] GGTS удаляет ограничения тела SourceCharacter. -[GGTS] GGTS remove SourceCharacter head restraints. -[GGTS] GGTS удаляет ограничения головы SourceCharacter. -[GGTS] GGTS remove SourceCharacter gag. -[GGTS] GGTS удаляет кляп SourceCharacter. -[GGTS] GGTS enforcing chastity for SourceCharacter. -[GGTS] GGTS обеспечивает целомудрие для SourceCharacter. -[GGTS] GGTS stop enforcing chastity for SourceCharacter. -[GGTS] GGTS прекратит принуждать SourceCharacter к целомудрию. -[GGTS] GGTS change SourceCharacter vibration. -[GGTS] GGTS изменяет вибрацию SourceCharacter . -[GGTS] GGTS instruct SourceCharacter penetration machine. -[GGTS] GGTS инструктирует машину проникновения SourceCharacter. -[GGTS] GGTS change SourceCharacter deaf level. -[GGTS] GGTS меняет уровень глухоты SourceCharacter . -[GGTS] GGTS change SourceCharacter blind level. -[GGTS] GGTS изменяет уровень слепоты SourceCharacter . -[GGTS] GGTS transform SourceCharacter restraints. -[GGTS] GGTS преобразовывает ограничения SourceCharacter . -[GGTS] GGTS bring penetration machine to replace SourceCharacter belt. -[GGTS] GGTS привозит проникающую машину на замену ремня SourceCharacter. -[GGTS] GGTS penetration machine lock back SourceCharacter belt and leave. -[GGTS] Машина проникновения GGTS запирает задний ремень SourceCharacter и уходит. -[GGTS] SourceCharacter. Use futuristic mask on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристическую маску на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic earphones on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристические наушники на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic collar on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристический ошейник на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic mittens on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристические варежки на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic armbinder on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристический армбиндер на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic straitjacket on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристическую смирительную рубашку на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic arms cuffs on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристические наручники на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic arms, legs and ankles cuffs on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристические манжеты для рук, ног и лодыжек на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic heels on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристические каблуки на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic ball gag on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристический шариковый кляп на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic panel gag on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристический кляп панель на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic chastity belt on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристический пояс верности на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic training belt on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристический тренировочный пояс на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic chastity bra on TargetCharacter. -[GGTS] SourceCharacter. Используй футуристический бюстгальтер целомудрия на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic bra on TargetCharacter. -[GGTS] SourceCharacter. Используйте футуристический бюстгальтер на TargetCharacter. -[GGTS] SourceCharacter. Use futuristic harness on TargetCharacter. -[GGTS] SourceCharacter. Используйте футуристическую сбрую на TargetCharacter. -[GGTS] SourceCharacter room locked. -[GGTS] SourceCharacter комната заперта. -[GGTS] SourceCharacter room unlocked. -[GGTS] SourceCharacter комната разблокирована. -[GGTS] SourceCharacter. New rule enforced: keep pose. -[GGTS] SourceCharacter. Введено новое правило: сохранять позу. -[GGTS] SourceCharacter. New rule enforced: No orgasm. -[GGTS] SourceCharacter. Введено новое правило: никакого оргазма. -[GGTS] SourceCharacter. Rule revoked: keep pose. -[GGTS] SourceCharacter. Правило отменено: сохранять позу. -[GGTS] SourceCharacter. Rule revoked: No orgasm. -[GGTS] SourceCharacter. Правило отменено: никакого оргазма. -[GGTS] SourceCharacter program new task for TargetCharacter. -[GGTS] SourceCharacter программирует новую задачу для TargetCharacter. -[GGTS] SourceCharacter program five minutes pause for TargetCharacter. -[GGTS] SourceCharacter программирует пятиминутная пауза для TargetCharacter. -[GGTS] SourceCharacter program slower pace for TargetCharacter. -[GGTS] SourceCharacter программирует более медленный темп для TargetCharacter. -[GGTS] SourceCharacter program normal pace for TargetCharacter. -[GGTS] SourceCharacter программирует нормальный темп для TargetCharacter. -[GGTS] SourceCharacter program faster pace for TargetCharacter. -[GGTS] SourceCharacter программирует более быстрый темп для TargetCharacter. \ No newline at end of file diff --git a/Screens/Character/Wardrobe/Text_Wardrobe.csv b/Screens/Character/Wardrobe/Text_Wardrobe.csv deleted file mode 100644 index be22773b2..000000000 --- a/Screens/Character/Wardrobe/Text_Wardrobe.csv +++ /dev/null @@ -1,4 +0,0 @@ -Load,Load -Save,Save -Return,Return -SelectAppareance,Save or load your favorite appearance diff --git a/Screens/Character/Wardrobe/Text_Wardrobe_CN.txt b/Screens/Character/Wardrobe/Text_Wardrobe_CN.txt deleted file mode 100644 index 1893ec14b..000000000 --- a/Screens/Character/Wardrobe/Text_Wardrobe_CN.txt +++ /dev/null @@ -1,8 +0,0 @@ -Load -读取 -Save -储存 -Return -返回 -Save or load your favorite appearance -储存或读取你喜爱的外观 diff --git a/Screens/Character/Wardrobe/Text_Wardrobe_DE.txt b/Screens/Character/Wardrobe/Text_Wardrobe_DE.txt deleted file mode 100644 index 1c606e684..000000000 --- a/Screens/Character/Wardrobe/Text_Wardrobe_DE.txt +++ /dev/null @@ -1,8 +0,0 @@ -Load -Laden -Save -Speichern -Return -Zurück -Save or load your favorite appearance -Speichere oder lade deine Erscheinung diff --git a/Screens/Character/Wardrobe/Text_Wardrobe_FR.txt b/Screens/Character/Wardrobe/Text_Wardrobe_FR.txt deleted file mode 100644 index ada24af1f..000000000 --- a/Screens/Character/Wardrobe/Text_Wardrobe_FR.txt +++ /dev/null @@ -1,8 +0,0 @@ -Load -Charger -Save -Sauvegarder -Return -Retour -Save or load your favorite appearance -Chargez ou sauvegardez vos apparences favorites diff --git a/Screens/Character/Wardrobe/Text_Wardrobe_RU.txt b/Screens/Character/Wardrobe/Text_Wardrobe_RU.txt deleted file mode 100644 index 96242e20e..000000000 --- a/Screens/Character/Wardrobe/Text_Wardrobe_RU.txt +++ /dev/null @@ -1,8 +0,0 @@ -Load -Загрузить -Save -Сохранить -Return -Вернуться -Save or load your favorite appearance -Твоя любимая внешность \ No newline at end of file diff --git a/Screens/Character/Wardrobe/Wardrobe.js b/Screens/Character/Wardrobe/Wardrobe.js deleted file mode 100644 index 5be9c9911..000000000 --- a/Screens/Character/Wardrobe/Wardrobe.js +++ /dev/null @@ -1,324 +0,0 @@ -"use strict"; -var WardrobeBackground = "Private"; -var WardrobeCharacter = []; -var WardrobeSelection = -1; -var WardrobeOffset = 0; -var WardrobeSize = 24; - -/** - * Loads the player's wardrobe safe spots. If a spot is not named yet, initializes it with the player's name - * @returns {void} - Nothing - */ -function WardrobeLoadCharacterNames() { - if (Player.WardrobeCharacterNames == null) Player.WardrobeCharacterNames = []; - let Push = false; - while (Player.WardrobeCharacterNames.length <= WardrobeSize) { - Player.WardrobeCharacterNames.push(Player.Name); - Push = true; - } - if (Push) ServerAccountUpdate.QueueData({ WardrobeCharacterNames: Player.WardrobeCharacterNames }); -} - -/** - * Makes sure the wardrobe is of the correct length. If someone tampered with the wardrobe's size, all - * extended slots are deleted - * @returns {void} - Nothing - */ -function WardrobeFixLength() { - if (Player.Wardrobe != null) { - if (Player.Wardrobe.length > WardrobeSize) Player.Wardrobe = Player.Wardrobe.slice(0, WardrobeSize - 1); - while (Player.Wardrobe.length < WardrobeSize) Player.Wardrobe.push(null); - } -} - -/** - * Loads all wardrobe characters. If the slot of the wardrobe is currently unused, display a randomly dressed character. - * Saves the current wardrobe on the server - * @param {boolean} Fast - * @returns {void} - Nothing - */ -function WardrobeLoadCharacters(Fast) { - Fast = Fast == null ? false : Fast; - let W = null; - WardrobeLoadCharacterNames(); - if (Player.Wardrobe == null) Player.Wardrobe = []; - for (let P = 0; P < WardrobeSize; P++) { - if (WardrobeCharacter.length <= P && ((W == null) || !Fast)) { - - // Creates a character - const C = CharacterLoadSimple(`Wardrobe-${P}`); - C.Name = Player.WardrobeCharacterNames[P]; - CharacterAppearanceBuildAssets(C); - - // Loads from player data or generates at full random - if (Player.Wardrobe[P] != null) { - C.Appearance = []; - WardrobeFastLoad(C, P); - } else { - CharacterAppearanceFullRandom(C); - WardrobeFastSave(C, P, false); - W = P; - } - - // Keep the character - WardrobeCharacter.push(C); - - } else if (W != null) { - - // randomize only one character - CharacterAppearanceFullRandom(WardrobeCharacter[W]); - WardrobeFastSave(WardrobeCharacter[W], P, false); - - } - } - if (W != null) { - WardrobeFixLength(); - if (Fast) WardrobeFastLoad(WardrobeCharacter[W], W); - } -} - -/** - * Loads the player's wardrobe. when the player opens the wardrobe screen for the first time. - * This function is called dynamically. - * @returns {void} - Nothing - * - */ -function WardrobeLoad() { - WardrobeSelection = -1; - CurrentDarkFactor = 0.5; - // Always open the wardrobe on the first page - WardrobeOffset = 0; - WardrobeLoadCharacters(false); -} - -/** - * Shows the wardrobe screen. This function is called dynamically on a repeated basis. So don't call complex functions - * or use extended loops in this function. - * @returns {void} - Nothing - */ -function WardrobeRun() { - DrawCharacter(Player, 0, 0, 1); - DrawButton(415, 25, 60, 60, "", "White", "Icons/Small/Prev.png"); - DrawButton(500, 25, 225, 60, TextGet("Load"), "White"); - DrawButton(750, 25, 225, 60, TextGet("Save"), "White"); - DrawButton(1000, 25, 60, 60, "", "White", "Icons/Small/Next.png"); - DrawButton(1750, 25, 225, 60, TextGet("Return"), "White"); - DrawText(TextGet("SelectAppareance"), 1405, 60, "White", "Gray"); - for (let C = 0; C < 12; C++) - if (C < 6) { - DrawCharacter(WardrobeCharacter[C + WardrobeOffset], 500 + C * 250, 100, 0.45); - if (WardrobeSelection == C + WardrobeOffset) DrawEmptyRect(500 + C * 250, 105, 225, 440, "Cyan"); - } - else { - DrawCharacter(WardrobeCharacter[C + WardrobeOffset], 500 + (C - 6) * 250, 550, 0.45); - if (WardrobeSelection == C + WardrobeOffset) DrawEmptyRect(500 + (C - 6) * 250, 555, 225, 440, "Cyan"); - } -} - -/** - * Handles the click events in the wardrobe screen. Clicks are propagated from CommonClick() - * @returns {void} - Nothing - */ -function WardrobeClick() { - - // If we must go back to the room - if (MouseIn(1750, 25, 225, 60)) - WardrobeExit(); - - // If we must move to the previous page - if (MouseIn(415, 25, 60, 60)) { - WardrobeOffset -= 12; - if (WardrobeOffset < 0) WardrobeOffset = Math.max(0, WardrobeSize - 12); - } - - // If we must move to the next page - if (MouseIn(1000, 25, 60, 60)) { - WardrobeOffset += 12; - if (WardrobeOffset >= WardrobeSize) WardrobeOffset = 0; - } - - // If we must load a saved outfit - if (MouseIn(500, 25, 225, 60) && (WardrobeSelection >= 0)) - WardrobeFastLoad(Player, WardrobeSelection); - - // If we must save an outfit - if (MouseIn(750, 25, 225, 60) && (WardrobeSelection >= 0)) - WardrobeFastSave(Player, WardrobeSelection); - - // If we must select a different wardrobe - if (MouseIn(500, 100, 1500, 900)) - for (let C = 0; C < 12; C++) - if (C < 6) { - if (MouseIn(500 + C * 250, 100, 250, 450)) - WardrobeSelection = C + WardrobeOffset; - } - else if (MouseIn(500 + (C - 6) * 250, 550, 250, 450)) - WardrobeSelection = C + WardrobeOffset; -} - -/** - * Exits the wardorbe screen and sends the player back to her private room - * @returns {void} - Nothing - */ -function WardrobeExit() { - CommonSetScreen("Room", "Private"); -} - -/** - * Set a wardrobe character name, sync it with server - * @param {number} W - The number of the wardrobe slot to save - * @param {string} Name - The name of the wardrobe slot - * @param {boolean} [Push=false] -If set to true, the changes are pushed to the server - */ -function WardrobeSetCharacterName(W, Name, Push) { - Player.WardrobeCharacterNames[W] = Name; - if (WardrobeCharacter != null && WardrobeCharacter[W] != null) { - WardrobeCharacter[W].Name = Name; - } - if (Push == null || Push != false) { - ServerAccountUpdate.QueueData({ WardrobeCharacterNames: Player.WardrobeCharacterNames }); - } -} - -/** - * Reduces a given asset to the attributes needed for the wardrobe - * @param {Item} A - The asset that should be reduced - * @returns {ItemBundle} - The bundled asset - */ -function WardrobeAssetBundle(A) { - let Property; - if (A.Property) { - Property = Object.assign({}, A.Property); - delete Property.Expression; // Don't add expressions to the wardrobe - if (Object.keys(Property).length === 0) Property = undefined; // Don't save empty properties - } - return { Name: A.Asset.Name, Group: A.Asset.Group.Name, Color: A.Color, Property }; -} - -/** - * Load character appearance from wardrobe, only load clothes on others - * @param {Character} C - The character the appearance should be loaded for - * @param {number} W - The spot in the wardrobe the appearance should be loaded to - * @param {boolean} [Update=false] - If set to true, the appearance will be updated to the server - * @returns {void} - Nothing - */ -function WardrobeFastLoad(C, W, Update) { - var savedExpression = {}; - if (C == Player) savedExpression = WardrobeGetExpression(Player); - if ((Player.Wardrobe != null) && (Player.Wardrobe[W] != null) && (Player.Wardrobe[W].length > 0)) { - C.Appearance = C.Appearance - .filter(a => a.Asset.Group.Category != "Appearance" || !WardrobeGroupAccessible(C, a.Asset.Group, { ExcludeNonCloth: true })); - Player.Wardrobe[W] - .filter(w => w.Name != null && w.Group != null) - .filter(w => C.Appearance.find(a => a.Asset.Group.Name == w.Group) == null) - .forEach(w => { - const A = AssetGet(C.AssetFamily, w.Group, w.Name); - if ( - A - && A.Group.Category == "Appearance" - && WardrobeGroupAccessible(C, A.Group, { ExcludeNonCloth: true }) - && (A.Value == 0 || InventoryAvailable(Player, A.Name, A.Group.Name)) - ) { - CharacterAppearanceSetItem(C, w.Group, A, w.Color, 0, null, false); - if (w.Property && InventoryGet(C, w.Group)) { - var item = InventoryGet(C, w.Group); - if (item.Property == null) item.Property = {}; - for (const key of Object.keys(w.Property)) { - if (key !== "Expression") item.Property[key] = w.Property[key]; - } - } - } - }); - // Adds any critical appearance asset that could be missing, adds the default one - AssetGroup - .filter(g => g.Category == "Appearance" && !g.AllowNone) - .forEach(g => { - if (C.Appearance.find(a => a.Asset.Group.Name == g.Name) == null) { - // For a group with a mirrored group, we copy the opposite if it exists - if (g.MirrorGroup && InventoryGet(C, g.MirrorGroup)) { - C.Appearance.push({ Asset: AssetGet(C.AssetFamily, g.Name, InventoryGet(C, g.MirrorGroup).Asset.Name), Difficulty: 0, Color: InventoryGet(C, g.MirrorGroup).Color }); - } else { - C.Appearance.push({ Asset: AssetGroupGet(C.AssetFamily, g.Name).Asset[0], Difficulty: 0, Color: "Default" }); - } - } - }); - // Restores the expressions the player had previously per item in the appearance - if (C == Player) { - Player.Appearance.forEach(item => { - if (savedExpression[item.Asset.Group.Name] != null) { - if (item.Property == null) item.Property = {}; - item.Property.Expression = savedExpression[item.Asset.Group.Name]; - - } - }); - } - CharacterLoadPose(C); - CharacterLoadCanvas(C); - if (Update == null || Update) { - if (C.ID == 0 && C.OnlineID != null) ServerPlayerAppearanceSync(); - } - } -} - -/** - * Saves character appearance in player's wardrobe, use player's body as base for others - * @param {Character} C - The character, whose appearance should be saved - * @param {number} W - The spot in the wardrobe the current outfit should be saved to - * @param {boolean} [Push=false] - If set to true, the wardrobe is saved on the server - * @returns {void} - Nothing - */ -function WardrobeFastSave(C, W, Push) { - if (Player.Wardrobe != null) { - var AddAll = C.ID == 0 || C.AccountName.indexOf("Wardrobe-") == 0; - Player.Wardrobe[W] = C.Appearance - .filter(a => a.Asset.Group.Category == "Appearance") - .filter(a => WardrobeGroupAccessible(C, a.Asset.Group, { ExcludeNonCloth: AddAll })) - .map(WardrobeAssetBundle); - if (!AddAll) { - // Using Player's body as base - Player.Wardrobe[W] = Player.Wardrobe[W].concat(Player.Appearance - .filter(a => a.Asset.Group.Category == "Appearance") - .filter(a => !a.Asset.Group.Clothing) - .map(WardrobeAssetBundle)); - } - WardrobeFixLength(); - if (WardrobeCharacter != null && WardrobeCharacter[W] != null && C.AccountName != WardrobeCharacter[W].AccountName) WardrobeFastLoad(WardrobeCharacter[W], W); - } -} - -/** - * Returns the expressions of character C as a single big object - * @param {Character} C - The character whose expressions should be returned - * @returns {object} Expression - The expresssion of a character - */ -function WardrobeGetExpression(C) { - var characterExpression = {}; - ServerAppearanceBundle(C.Appearance).filter(item => item.Property != null && item.Property.Expression != null).forEach(item => characterExpression[item.Group] = item.Property.Expression); - return characterExpression; -} - -/** - * Checks if a given group of a character can be accessed. - * @param {Character} C - The character in the wardrobe - * @param {AssetGroup} Group - The group to check for accessibility - * @returns {boolean} - Whether the zone can be altered or not. - */ -function WardrobeGroupAccessible(C, Group, Options) { - - // You can always edit yourself. - if (C.IsPlayer() || C.AccountName.indexOf("Wardrobe-") == 0) return true; - - // You cannot always change body cosplay - if (Group.BodyCosplay && C.OnlineSharedSettings && C.OnlineSharedSettings.BlockBodyCosplay) return false; - - // Clothes can always be edited - if (Group.Clothing) return true; - - // You can filter out non-clothing options - if (!Options || !Options.ExcludeNonCloth) { - // If the player allows all - if (C.OnlineSharedSettings && C.OnlineSharedSettings.AllowFullWardrobeAccess) return true; - } - - return false; -} diff --git a/Screens/Inventory/Bra/CuteBikini1/Closed.png b/Screens/Inventory/Bra/CuteBikini1/Closed.png deleted file mode 100644 index 26f9f0123..000000000 Binary files a/Screens/Inventory/Bra/CuteBikini1/Closed.png and /dev/null differ diff --git a/Screens/Inventory/Bra/CuteBikini1/Open.png b/Screens/Inventory/Bra/CuteBikini1/Open.png deleted file mode 100644 index afdc46fa3..000000000 Binary files a/Screens/Inventory/Bra/CuteBikini1/Open.png and /dev/null differ diff --git a/Screens/Inventory/Bra/Ribbons/Basic.png b/Screens/Inventory/Bra/Ribbons/Basic.png deleted file mode 100644 index e79ff1164..000000000 Binary files a/Screens/Inventory/Bra/Ribbons/Basic.png and /dev/null differ diff --git a/Screens/Inventory/Bra/Ribbons/Bow.png b/Screens/Inventory/Bra/Ribbons/Bow.png deleted file mode 100644 index 5930cf0c9..000000000 Binary files a/Screens/Inventory/Bra/Ribbons/Bow.png and /dev/null differ diff --git a/Screens/Inventory/Bra/Ribbons/Wrap.png b/Screens/Inventory/Bra/Ribbons/Wrap.png deleted file mode 100644 index 7b03623c1..000000000 Binary files a/Screens/Inventory/Bra/Ribbons/Wrap.png and /dev/null differ diff --git a/Screens/Inventory/Bra/SexyBikini1/Closed.png b/Screens/Inventory/Bra/SexyBikini1/Closed.png deleted file mode 100644 index c39458015..000000000 Binary files a/Screens/Inventory/Bra/SexyBikini1/Closed.png and /dev/null differ diff --git a/Screens/Inventory/Bra/SexyBikini1/Open.png b/Screens/Inventory/Bra/SexyBikini1/Open.png deleted file mode 100644 index 282680d22..000000000 Binary files a/Screens/Inventory/Bra/SexyBikini1/Open.png and /dev/null differ diff --git a/Screens/Inventory/Bra/SilkStraps/Bra1.png b/Screens/Inventory/Bra/SilkStraps/Bra1.png deleted file mode 100644 index eada0a2c0..000000000 Binary files a/Screens/Inventory/Bra/SilkStraps/Bra1.png and /dev/null differ diff --git a/Screens/Inventory/Bra/SilkStraps/Bra2.png b/Screens/Inventory/Bra/SilkStraps/Bra2.png deleted file mode 100644 index fe97c215f..000000000 Binary files a/Screens/Inventory/Bra/SilkStraps/Bra2.png and /dev/null differ diff --git a/Screens/Inventory/Bra/SilkStraps/Strip.png b/Screens/Inventory/Bra/SilkStraps/Strip.png deleted file mode 100644 index 3c280d53c..000000000 Binary files a/Screens/Inventory/Bra/SilkStraps/Strip.png and /dev/null differ diff --git a/Screens/Inventory/Bra/SilkStraps/Swimsuit.png b/Screens/Inventory/Bra/SilkStraps/Swimsuit.png deleted file mode 100644 index 8558af046..000000000 Binary files a/Screens/Inventory/Bra/SilkStraps/Swimsuit.png and /dev/null differ diff --git a/Screens/Inventory/Bra/SilkStraps/Wrap.png b/Screens/Inventory/Bra/SilkStraps/Wrap.png deleted file mode 100644 index 3d0deb2d2..000000000 Binary files a/Screens/Inventory/Bra/SilkStraps/Wrap.png and /dev/null differ diff --git a/Screens/Inventory/Bra/Swimsuit1/Dull.png b/Screens/Inventory/Bra/Swimsuit1/Dull.png deleted file mode 100644 index 4fca15e1b..000000000 Binary files a/Screens/Inventory/Bra/Swimsuit1/Dull.png and /dev/null differ diff --git a/Screens/Inventory/Bra/Swimsuit1/Shiny.png b/Screens/Inventory/Bra/Swimsuit1/Shiny.png deleted file mode 100644 index 99834f52e..000000000 Binary files a/Screens/Inventory/Bra/Swimsuit1/Shiny.png and /dev/null differ diff --git a/Screens/Inventory/Bracelet/SpikeBands/Both.png b/Screens/Inventory/Bracelet/SpikeBands/Both.png deleted file mode 100644 index cfaa536a2..000000000 Binary files a/Screens/Inventory/Bracelet/SpikeBands/Both.png and /dev/null differ diff --git a/Screens/Inventory/Bracelet/SpikeBands/Left.png b/Screens/Inventory/Bracelet/SpikeBands/Left.png deleted file mode 100644 index ed7ec6e5b..000000000 Binary files a/Screens/Inventory/Bracelet/SpikeBands/Left.png and /dev/null differ diff --git a/Screens/Inventory/Bracelet/SpikeBands/Right.png b/Screens/Inventory/Bracelet/SpikeBands/Right.png deleted file mode 100644 index 22f40018c..000000000 Binary files a/Screens/Inventory/Bracelet/SpikeBands/Right.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/ChineseDress2/Pink.png b/Screens/Inventory/Cloth/ChineseDress2/Pink.png deleted file mode 100644 index 339d6bcd3..000000000 Binary files a/Screens/Inventory/Cloth/ChineseDress2/Pink.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/ChineseDress2/Purple.png b/Screens/Inventory/Cloth/ChineseDress2/Purple.png deleted file mode 100644 index 86286a2fd..000000000 Binary files a/Screens/Inventory/Cloth/ChineseDress2/Purple.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/ChineseDress2/Red.png b/Screens/Inventory/Cloth/ChineseDress2/Red.png deleted file mode 100644 index 9e19a0790..000000000 Binary files a/Screens/Inventory/Cloth/ChineseDress2/Red.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/Jacket/Hooded.png b/Screens/Inventory/Cloth/Jacket/Hooded.png deleted file mode 100644 index 649573aa4..000000000 Binary files a/Screens/Inventory/Cloth/Jacket/Hooded.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/Jacket/HoodedEarsOut.png b/Screens/Inventory/Cloth/Jacket/HoodedEarsOut.png deleted file mode 100644 index 699c941f5..000000000 Binary files a/Screens/Inventory/Cloth/Jacket/HoodedEarsOut.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/Jacket/Normal.png b/Screens/Inventory/Cloth/Jacket/Normal.png deleted file mode 100644 index 1b8b72acc..000000000 Binary files a/Screens/Inventory/Cloth/Jacket/Normal.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/LatexLacedSuit/Laced.png b/Screens/Inventory/Cloth/LatexLacedSuit/Laced.png deleted file mode 100644 index b8b464f26..000000000 Binary files a/Screens/Inventory/Cloth/LatexLacedSuit/Laced.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/LatexLacedSuit/NonLaced.png b/Screens/Inventory/Cloth/LatexLacedSuit/NonLaced.png deleted file mode 100644 index fd992f699..000000000 Binary files a/Screens/Inventory/Cloth/LatexLacedSuit/NonLaced.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/TShirt2/BCLogo.png b/Screens/Inventory/Cloth/TShirt2/BCLogo.png deleted file mode 100644 index 1de5ca181..000000000 Binary files a/Screens/Inventory/Cloth/TShirt2/BCLogo.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/TShirt2/BDSM.png b/Screens/Inventory/Cloth/TShirt2/BDSM.png deleted file mode 100644 index 63f94c406..000000000 Binary files a/Screens/Inventory/Cloth/TShirt2/BDSM.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/TShirt2/Gag.png b/Screens/Inventory/Cloth/TShirt2/Gag.png deleted file mode 100644 index ef319694d..000000000 Binary files a/Screens/Inventory/Cloth/TShirt2/Gag.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/TShirt2/Knot.png b/Screens/Inventory/Cloth/TShirt2/Knot.png deleted file mode 100644 index fc9fb1fe4..000000000 Binary files a/Screens/Inventory/Cloth/TShirt2/Knot.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/TShirt2/Plain.png b/Screens/Inventory/Cloth/TShirt2/Plain.png deleted file mode 100644 index 9a90ebf7d..000000000 Binary files a/Screens/Inventory/Cloth/TShirt2/Plain.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/TShirt2/Rock.png b/Screens/Inventory/Cloth/TShirt2/Rock.png deleted file mode 100644 index fef921a35..000000000 Binary files a/Screens/Inventory/Cloth/TShirt2/Rock.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/TShirt2/Smile.png b/Screens/Inventory/Cloth/TShirt2/Smile.png deleted file mode 100644 index 57b32c871..000000000 Binary files a/Screens/Inventory/Cloth/TShirt2/Smile.png and /dev/null differ diff --git a/Screens/Inventory/Cloth/TShirt2/Tick.png b/Screens/Inventory/Cloth/TShirt2/Tick.png deleted file mode 100644 index 978658720..000000000 Binary files a/Screens/Inventory/Cloth/TShirt2/Tick.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Bib/Bib.js b/Screens/Inventory/ClothAccessory/Bib/Bib.js deleted file mode 100644 index 01c9f5af7..000000000 --- a/Screens/Inventory/ClothAccessory/Bib/Bib.js +++ /dev/null @@ -1,90 +0,0 @@ -"use strict"; -var InventoryClothAccessoryBibAllowedChars = /^[a-zA-Z0-9 ~!]*$/; -// Loads the item extension properties -function InventoryClothAccessoryBibTxt1Load() { - ElementCreateInput("TagText", "text", DialogFocusItem.Property.Text || "", "24"); - ElementCreateInput("TagText2", "text", DialogFocusItem.Property.Text2 || "", "24"); -} - -// Draw the extension screen -function InventoryClothAccessoryBibTxt1Draw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Tag data - ElementPosition("TagText", 1505, 600, 250); - ElementPosition("TagText2", 1505, 680, 250); - DrawButton(1330, 731, 340, 64, DialogFindPlayer("CustomTagText"), (ElementValue("TagText") + ElementValue("TagText2")).match(InventoryClothAccessoryBibAllowedChars) ? "White" : "#888", ""); -} - -// Catches the item extension clicks -function InventoryClothAccessoryBibTxt1Click() { - if ( - MouseIn(1330, 731, 340, 64) && - (DialogFocusItem.Property.Text !== ElementValue("TagText") || DialogFocusItem.Property.Text2 !== ElementValue("TagText2")) && - (ElementValue("TagText") + ElementValue("TagText2")).match(InventoryClothAccessoryBibAllowedChars) - ) { - DialogFocusItem.Property.Text = ElementValue("TagText"); - DialogFocusItem.Property.Text2 = ElementValue("TagText2"); - InventoryClothAccessoryBibChange(); - } - - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - InventoryClothAccessoryBibExit(); - } -} - -// Leaves the extended screen -function InventoryClothAccessoryBibExit() { - ElementRemove("TagText"); - ElementRemove("TagText2"); - ExtendedItemSubscreen = null; -} - -// When the tag is changed -function InventoryClothAccessoryBibChange() { - var C = CharacterGetCurrent(); - CharacterRefresh(C, false); - InventoryClothAccessoryBibExit(); -} - -/** @type {DynamicAfterDrawCallback} */ -function AssetsClothAccessoryBibAfterDraw({ - C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color -}) { - if (L === "_Text") { - const Properties = Property || {}; - const Type = Properties.Type || "x0"; - if (!Type.includes("x1")) return; - - // We set up a canvas - let Height = 65; - let Width = 120; - let XOffset = 10; - let YOffset = 40; - const FontName = "Pacifico"; - const TempCanvas = AnimationGenerateTempCanvas(C, A, Width, Height); - - const text1 = Property && typeof Property.Text === "string" && InventoryClothAccessoryBibAllowedChars.test(Property.Text) ? Property.Text : ""; - const text2 = Property && typeof Property.Text2 === "string" && InventoryClothAccessoryBibAllowedChars.test(Property.Text2) ? Property.Text2 : ""; - const isAlone = !text1 || !text2; - - const drawOptions = { - fontSize: 20, - fontFamily: FontName, - color: Color, - width: Width, - }; - - // We draw the desired info on that canvas - let ctx = TempCanvas.getContext('2d'); - DynamicDrawText(text1, ctx, Width / 2, Height / (isAlone ? 2 : 2.5), drawOptions); - DynamicDrawText(text2, ctx, Width / 2, Height / (isAlone ? 2 : 1.5), drawOptions); - - - // We print the canvas to the character based on the asset position - drawCanvas(TempCanvas, X + XOffset, Y + YOffset, AlphaMasks); - drawCanvasBlink(TempCanvas, X + XOffset, Y + YOffset, AlphaMasks); - } -} diff --git a/Screens/Inventory/ClothAccessory/Bib/p0.png b/Screens/Inventory/ClothAccessory/Bib/p0.png deleted file mode 100644 index c119bbf16..000000000 Binary files a/Screens/Inventory/ClothAccessory/Bib/p0.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Bib/p1.png b/Screens/Inventory/ClothAccessory/Bib/p1.png deleted file mode 100644 index 5b157d160..000000000 Binary files a/Screens/Inventory/ClothAccessory/Bib/p1.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Bib/p2.png b/Screens/Inventory/ClothAccessory/Bib/p2.png deleted file mode 100644 index 9c3330f4f..000000000 Binary files a/Screens/Inventory/ClothAccessory/Bib/p2.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Bib/p3.png b/Screens/Inventory/ClothAccessory/Bib/p3.png deleted file mode 100644 index da4c65155..000000000 Binary files a/Screens/Inventory/ClothAccessory/Bib/p3.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Bib/p4.png b/Screens/Inventory/ClothAccessory/Bib/p4.png deleted file mode 100644 index 6b036eb78..000000000 Binary files a/Screens/Inventory/ClothAccessory/Bib/p4.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Bib/p5.png b/Screens/Inventory/ClothAccessory/Bib/p5.png deleted file mode 100644 index 1b0988c01..000000000 Binary files a/Screens/Inventory/ClothAccessory/Bib/p5.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Bib/x0.png b/Screens/Inventory/ClothAccessory/Bib/x0.png deleted file mode 100644 index c119bbf16..000000000 Binary files a/Screens/Inventory/ClothAccessory/Bib/x0.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Bib/x1.png b/Screens/Inventory/ClothAccessory/Bib/x1.png deleted file mode 100644 index 5ce9b5e44..000000000 Binary files a/Screens/Inventory/ClothAccessory/Bib/x1.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/BunnyCollarCuffs/Both.png b/Screens/Inventory/ClothAccessory/BunnyCollarCuffs/Both.png deleted file mode 100644 index 02c480c29..000000000 Binary files a/Screens/Inventory/ClothAccessory/BunnyCollarCuffs/Both.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/BunnyCollarCuffs/Collar.png b/Screens/Inventory/ClothAccessory/BunnyCollarCuffs/Collar.png deleted file mode 100644 index c63762e55..000000000 Binary files a/Screens/Inventory/ClothAccessory/BunnyCollarCuffs/Collar.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/BunnyCollarCuffs/Cuffs.png b/Screens/Inventory/ClothAccessory/BunnyCollarCuffs/Cuffs.png deleted file mode 100644 index 799fa02f4..000000000 Binary files a/Screens/Inventory/ClothAccessory/BunnyCollarCuffs/Cuffs.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/DotsBoth.png b/Screens/Inventory/ClothAccessory/Glitter/DotsBoth.png deleted file mode 100644 index 080ab62f6..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/DotsBoth.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/DotsLeft.png b/Screens/Inventory/ClothAccessory/Glitter/DotsLeft.png deleted file mode 100644 index b5d992c95..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/DotsLeft.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/DotsRight.png b/Screens/Inventory/ClothAccessory/Glitter/DotsRight.png deleted file mode 100644 index 59cdcaebf..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/DotsRight.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/Freckles.png b/Screens/Inventory/ClothAccessory/Glitter/Freckles.png deleted file mode 100644 index 002c41644..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/Freckles.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/FrecklesSmall.png b/Screens/Inventory/ClothAccessory/Glitter/FrecklesSmall.png deleted file mode 100644 index 73f41cbd0..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/FrecklesSmall.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/MidFreckles.png b/Screens/Inventory/ClothAccessory/Glitter/MidFreckles.png deleted file mode 100644 index 10537beb7..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/MidFreckles.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/MidFrecklesSmall.png b/Screens/Inventory/ClothAccessory/Glitter/MidFrecklesSmall.png deleted file mode 100644 index 8d6c855d8..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/MidFrecklesSmall.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/SplitFreckles.png b/Screens/Inventory/ClothAccessory/Glitter/SplitFreckles.png deleted file mode 100644 index 674d9f800..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/SplitFreckles.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/SplitFrecklesSmall.png b/Screens/Inventory/ClothAccessory/Glitter/SplitFrecklesSmall.png deleted file mode 100644 index cec684e29..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/SplitFrecklesSmall.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/StarsBoth.png b/Screens/Inventory/ClothAccessory/Glitter/StarsBoth.png deleted file mode 100644 index c70e514aa..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/StarsBoth.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/StarsLeft.png b/Screens/Inventory/ClothAccessory/Glitter/StarsLeft.png deleted file mode 100644 index 56c1a13ae..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/StarsLeft.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/Glitter/StarsRight.png b/Screens/Inventory/ClothAccessory/Glitter/StarsRight.png deleted file mode 100644 index 88df4e108..000000000 Binary files a/Screens/Inventory/ClothAccessory/Glitter/StarsRight.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/LeatherStraps/Strap.png b/Screens/Inventory/ClothAccessory/LeatherStraps/Strap.png deleted file mode 100644 index b24f974bf..000000000 Binary files a/Screens/Inventory/ClothAccessory/LeatherStraps/Strap.png and /dev/null differ diff --git a/Screens/Inventory/ClothAccessory/LeatherStraps/WrapStrap.png b/Screens/Inventory/ClothAccessory/LeatherStraps/WrapStrap.png deleted file mode 100644 index be69f63b3..000000000 Binary files a/Screens/Inventory/ClothAccessory/LeatherStraps/WrapStrap.png and /dev/null differ diff --git a/Screens/Inventory/Corset/LatexCorset1/Garter.png b/Screens/Inventory/Corset/LatexCorset1/Garter.png deleted file mode 100644 index c5e547705..000000000 Binary files a/Screens/Inventory/Corset/LatexCorset1/Garter.png and /dev/null differ diff --git a/Screens/Inventory/Corset/LatexCorset1/NoGarter.png b/Screens/Inventory/Corset/LatexCorset1/NoGarter.png deleted file mode 100644 index 945041241..000000000 Binary files a/Screens/Inventory/Corset/LatexCorset1/NoGarter.png and /dev/null differ diff --git a/Screens/Inventory/Futuristic/Futuristic.js b/Screens/Inventory/Futuristic/Futuristic.js deleted file mode 100644 index 91817d9d3..000000000 --- a/Screens/Inventory/Futuristic/Futuristic.js +++ /dev/null @@ -1,201 +0,0 @@ -"use strict"; - -// How to make your item futuristic! - -// In the load function, add this before your load function, without changing functions from the -// futuristic panel gag functions. Just make sure your item loads after the panel gag and not before in index.html: -/* - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticLoadAccessDenied() - } else -*/ - -// In the draw function, add: -/* - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticDrawAccessDenied() - } else -*/ - -// In the click function, add: -/* - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticClickAccessDenied() - } else -*/ - -// In the exit function, add: -/* - InventoryItemFuturisticExitAccessDenied() -*/ - -// In the validate function, add: -/* - return InventoryItemFuturisticValidate(C, Item) -*/ - -var FuturisticAccessDeniedMessage = ""; - -var FuturisticAccessCollarGroups = ["ItemNeck", "ItemNeckAccessories", "ItemEars", "ItemHead", "ItemHood", "ItemMouth", "ItemMouth2", "ItemMouth3", "ItemDevices"]; -var FuturisticAccessArmGroups = ["ItemArms", "ItemHands"]; -var FuturisticAccessLegGroups = ["ItemLegs", "ItemFeet", "ItemBoots"]; -var FuturisticAccessChastityGroups = ["ItemPelvis", "ItemTorso", "ItemButt", "ItemVulva", "ItemVulvaPiercings", "ItemBreast", "ItemNipples", "ItemNipplesPiercings"]; - -/** - * Hook script for injecting futuristic features into an archetypical item - * @param {function} OriginalFunction - The function that is normally called when an archetypical item reaches this point. - * @returns {void} - Nothing - */ -function FuturisticAccessLoad(OriginalFunction) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticLoadAccessDenied() - } else OriginalFunction(); -} - -/** - * Hook script for injecting futuristic features into an archetypical item - * @param {function} OriginalFunction - The function that is normally called when an archetypical item reaches this point. - * @returns {void} - Nothing - */ -function FuturisticAccessClick(OriginalFunction) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticClickAccessDenied() - } else OriginalFunction(); -} - -/** - * Hook script for injecting futuristic features into an archetypical item - * @param {function} OriginalFunction - The function that is normally called when an archetypical item reaches this point. - * @returns {void} - Nothing - */ -function FuturisticAccessDraw(OriginalFunction) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticDrawAccessDenied() - } else OriginalFunction(); -} - -/** - * Hook script for injecting futuristic features into an archetypical item - * @returns {void} - Nothing - */ - function FuturisticAccessExit() { - InventoryItemFuturisticExitAccessDenied(); -} - -/** - * Hook script for injecting futuristic features into a typed or modular item - * @param {ExtendedItemValidateCallback} OriginalFunction - The function that is normally called when an archetypical item reaches this point. - * @param {Character} C - The character to validate the option - * @param {Item} Item - The equipped item - * @param {OptionType} Option - The selected option - * @param {OptionType} CurrentOption - The currently selected option - * @returns {string} - Returns false and sets DialogExtendedMessage, if the chosen option is not possible. - * @template OptionType - */ -function FuturisticAccessValidate(OriginalFunction, C, Item, Option, CurrentOption) { - let futureString = InventoryItemFuturisticValidate(C, Item); - if (futureString) return futureString; - else return OriginalFunction(C, Item, Option, CurrentOption); -} - - - -// Load the futuristic item ACCESS DENIED screen -function InventoryItemFuturisticLoadAccessDenied() { - ElementCreateInput("PasswordField", "text", "", "12"); - if (!FuturisticAccessDeniedMessage) - FuturisticAccessDeniedMessage = ""; -} - -// Draw the futuristic item ACCESS DENIED screen -function InventoryItemFuturisticDrawAccessDenied() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - - DrawText(DialogFindPlayer("FuturisticItemLoginScreen"), 1500, 600, "White", "Gray"); - - ElementPosition("PasswordField", 1505, 750, 350); - DrawText(DialogFindPlayer("FuturisticItemPassword"), 1500, 700, "White", "Gray"); - DrawButton(1400, 800, 200, 64, DialogFindPlayer("FuturisticItemLogIn"), "White", ""); - - if (FuturisticAccessDeniedMessage && FuturisticAccessDeniedMessage != "") DrawText(FuturisticAccessDeniedMessage, 1500, 963, "Red", "Black"); - -} - -// Click the futuristic item ACCESS DENIED screen -function InventoryItemFuturisticClickAccessDenied() { - if (MouseIn(1885, 25, 90, 90)) InventoryItemFuturisticExitAccessDenied(); - - if (MouseIn(1400, 800, 200, 64)) { - var pw = ElementValue("PasswordField").toUpperCase(); - if (DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.LockedBy == "PasswordPadlock" && pw == DialogFocusItem.Property.Password) { - let C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - CommonPadlockUnlock(C, DialogFocusItem); - DialogFocusItem = null; - Player.FocusGroup = null; - InventoryItemFuturisticExitAccessDenied(); - } else if (DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.LockedBy == "TimerPasswordPadlock" && pw == DialogFocusItem.Property.Password) { - let C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - CommonPadlockUnlock(C, DialogFocusItem); - DialogFocusItem = null; - Player.FocusGroup = null; - InventoryItemFuturisticExitAccessDenied(); - } else if (DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.LockedBy == "CombinationPadlock" && pw == DialogFocusItem.Property.CombinationNumber) { - let C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - InventoryItemMiscCombinationPadlockUnlock(C, DialogFocusItem); - DialogFocusItem = null; - Player.FocusGroup = null; - InventoryItemFuturisticExitAccessDenied(); - } else { - FuturisticAccessDeniedMessage = DialogFindPlayer("CantChangeWhileLockedFuturistic"); - AudioPlayInstantSound("Audio/AccessDenied.mp3"); - if (CurrentScreen == "ChatRoom") { - InventoryItemFuturisticPublishAccessDenied((Player.FocusGroup != null) ? Player : CurrentCharacter); - } - } - } -} - -function InventoryItemFuturisticExitAccessDenied() { - ElementRemove("PasswordField"); - FuturisticAccessDeniedMessage = ""; - DialogFocusItem = null; -} - -/** - * Validates, if the chosen option is possible. Sets the global variable 'DialogExtendedMessage' to the appropriate error message, if not. - * @param {Character} C - The character to validate the option - * @param {Item} Item - The equipped item - * @returns {string} - Returns false and sets DialogExtendedMessage, if the chosen option is not possible. - */ -function InventoryItemFuturisticValidate(C, Item = DialogFocusItem) { - var Allowed = ""; - - if (Item && Item.Property && Item.Property.LockedBy && !DialogCanUnlock(C, Item)) { - var collar = InventoryGet(C, "ItemNeck"); - if (!collar || (!collar.Property || - (FuturisticAccessCollarGroups.includes(Item.Asset.Group.Name) && collar.Property.OpenPermission != true) || - (FuturisticAccessArmGroups.includes(Item.Asset.Group.Name) && collar.Property.OpenPermissionArm != true) || - (FuturisticAccessLegGroups.includes(Item.Asset.Group.Name) && collar.Property.OpenPermissionLeg != true) || - (FuturisticAccessChastityGroups.includes(Item.Asset.Group.Name) && collar.Property.OpenPermissionChastity != true))) { - Allowed = DialogExtendedMessage = DialogFindPlayer("CantChangeWhileLockedFuturistic"); - } - } - - return Allowed; -} - -function InventoryItemFuturisticPublishAccessDenied(C) { - var msg = "FuturisticItemLoginLoginAttempt"; - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name} - ]; - ChatRoomPublishCustomAction(msg, true, Dictionary); -} diff --git a/Screens/Inventory/Glasses/EyePatch1/Left.png b/Screens/Inventory/Glasses/EyePatch1/Left.png deleted file mode 100644 index c8c395e4c..000000000 Binary files a/Screens/Inventory/Glasses/EyePatch1/Left.png and /dev/null differ diff --git a/Screens/Inventory/Glasses/EyePatch1/Right.png b/Screens/Inventory/Glasses/EyePatch1/Right.png deleted file mode 100644 index cf71230bb..000000000 Binary files a/Screens/Inventory/Glasses/EyePatch1/Right.png and /dev/null differ diff --git a/Screens/Inventory/HairAccessory1/ElfEars/Behind.png b/Screens/Inventory/HairAccessory1/ElfEars/Behind.png deleted file mode 100644 index 0151d163f..000000000 Binary files a/Screens/Inventory/HairAccessory1/ElfEars/Behind.png and /dev/null differ diff --git a/Screens/Inventory/HairAccessory1/ElfEars/InFront.png b/Screens/Inventory/HairAccessory1/ElfEars/InFront.png deleted file mode 100644 index e7f9b4b3a..000000000 Binary files a/Screens/Inventory/HairAccessory1/ElfEars/InFront.png and /dev/null differ diff --git a/Screens/Inventory/HairAccessory1/Halo/Broken.png b/Screens/Inventory/HairAccessory1/Halo/Broken.png deleted file mode 100644 index 8f933eb9a..000000000 Binary files a/Screens/Inventory/HairAccessory1/Halo/Broken.png and /dev/null differ diff --git a/Screens/Inventory/HairAccessory1/Halo/Default.png b/Screens/Inventory/HairAccessory1/Halo/Default.png deleted file mode 100644 index a73c3cd37..000000000 Binary files a/Screens/Inventory/HairAccessory1/Halo/Default.png and /dev/null differ diff --git a/Screens/Inventory/HairAccessory1/Halo/Halo.js b/Screens/Inventory/HairAccessory1/Halo/Halo.js deleted file mode 100644 index b15be31cc..000000000 --- a/Screens/Inventory/HairAccessory1/Halo/Halo.js +++ /dev/null @@ -1,126 +0,0 @@ -"use strict"; -const InventoryHairAccessory1HaloBrightnessInputId = "InventoryHairAccessory1HaloBrightness"; - -const InventoryHairAccessory1HaloOptions = [ - { - Name: "Default", - Property: { Type: null }, - }, - { - Name: "Broken", - Property: { Type: "Broken" }, - }, -]; - -/** - * Loads the extended item's properties - * @returns {void} - Nothing - */ -function InventoryHairAccessory1HaloLoad() { - const C = CharacterAppearanceSelection; - const item = DialogFocusItem; - /** @type {ItemProperties} */ - const property = item.Property = item.Property || {}; - let refresh = false; - if (typeof property.Opacity !== "number") { - property.Opacity = 0; - refresh = true; - } - - if (!InventoryHairAccessory1HaloOptions.find(option => option.Property.Type === property.Type)) { - property.Type = InventoryHairAccessory1HaloOptions[0].Property.Type; - refresh = true; - } - - if (refresh) CharacterRefresh(C, false); - - const brightnessInput = ElementCreateRangeInput( - InventoryHairAccessory1HaloBrightnessInputId, property.Opacity, item.Asset.MinOpacity, item.Asset.MaxOpacity, 0.01, "lightbulb"); - if (brightnessInput) { - brightnessInput.addEventListener( - "input", - (e) => InventoryHairAccessory1HaloBrightnessChange(C, item, Number(e.target.value)), - ); - } -} - -/** - * Handles drawing the Halo's extended item screen - * @returns {void} - Nothing - */ -function InventoryHairAccessory1HaloDraw() { - const asset = DialogFocusItem.Asset; - const property = DialogFocusItem.Property; - - // Draw the header and item - DrawAssetPreview(1387, 55, asset); - - MainCanvas.textAlign = "left"; - DrawTextFit(DialogFindPlayer("InventoryHairAccessory1HaloBrightness"), 1185, 430, 200, "#fff", "#000"); - ElementPosition(InventoryHairAccessory1HaloBrightnessInputId, 1630, 430, 400); - MainCanvas.textAlign = "center"; - - DrawTextFit(DialogFindPlayer("InventoryHairAccessory1HaloType"), 1500, 530, 800, "#fff", "#000"); - - InventoryHairAccessory1HaloOptions.forEach((option, i) => { - const x = ExtendedXY[InventoryHairAccessory1HaloOptions.length][i][0]; - const y = ExtendedXY[InventoryHairAccessory1HaloOptions.length][i][1] + 80; - const isSelected = property.Type === option.Property.Type; - const description = DialogFindPlayer(`InventoryHairAccessory1HaloType${option.Name}`); - - DrawPreviewBox( - x, y, `${AssetGetInventoryPath(asset)}/${option.Name}.png`, description, - { Border: true, Hover: true, Disabled: isSelected }, - ); - }); -} - -/** - * Handles clicks on the Halo's extended item screen - * @returns {void} - Nothing - */ -function InventoryHairAccessory1HaloClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - return InventoryHairAccessory1HaloExit(); - } - - const C = CharacterGetCurrent(); - - InventoryHairAccessory1HaloOptions.forEach((option, i) => { - const x = ExtendedXY[InventoryHairAccessory1HaloOptions.length][i][0]; - const y = ExtendedXY[InventoryHairAccessory1HaloOptions.length][i][1] + 80; - - if (MouseIn(x, y, 225, 275)) { - ExtendedItemHandleOptionClick(C, InventoryHairAccessory1HaloOptions, option); - } - }); -} - -/** - * Debounced callback for opacity slider changes - * @param {Character} C - The character being modified - * @param {Item} item - The halo item being modified - * @param {number} brightness - The new brightness to set on the halo - * @returns {void} - Nothing - */ -const InventoryHairAccessory1HaloBrightnessChange = CommonLimitFunction((C, item, brightness) => { - item.Property.Opacity = brightness; - CharacterLoadCanvas(C); -}); - -/** - * Exit handler for the Halo's extended item screen. Updates the character and removes UI components. - * @returns {void} - Nothing - */ -function InventoryHairAccessory1HaloExit() { - const C = CharacterAppearanceSelection; - const item = DialogFocusItem; - - item.Property.Opacity = Number(ElementValue(InventoryHairAccessory1HaloBrightnessInputId)); - ChatRoomCharacterItemUpdate(C, item.Asset.Group.Name); - - ElementRemove(InventoryHairAccessory1HaloBrightnessInputId); - PreferenceMessage = ""; - DialogFocusItem = null; -} diff --git a/Screens/Inventory/HairAccessory3/Halo/Halo.js b/Screens/Inventory/HairAccessory3/Halo/Halo.js deleted file mode 100644 index 5112d6021..000000000 --- a/Screens/Inventory/HairAccessory3/Halo/Halo.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; -/** - * Loads the extended item's properties - * @returns {void} - Nothing - */ -function InventoryHairAccessory3HaloLoad() { - InventoryHairAccessory1HaloLoad(); -} - -/** - * Handles drawing the Halo's extended item screen - * @returns {void} - Nothing - */ -function InventoryHairAccessory3HaloDraw() { - InventoryHairAccessory1HaloDraw(); -} - -/** - * Handles clicks on the Halo's extended item screen - * @returns {void} - Nothing - */ -function InventoryHairAccessory3HaloClick() { - InventoryHairAccessory1HaloClick(); -} diff --git a/Screens/Inventory/Hat/BallCapBack/StrapOver.png b/Screens/Inventory/Hat/BallCapBack/StrapOver.png deleted file mode 100644 index 2e152b661..000000000 Binary files a/Screens/Inventory/Hat/BallCapBack/StrapOver.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapBack/StrapUnder.png b/Screens/Inventory/Hat/BallCapBack/StrapUnder.png deleted file mode 100644 index d005bc3a8..000000000 Binary files a/Screens/Inventory/Hat/BallCapBack/StrapUnder.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/BCLogo.png b/Screens/Inventory/Hat/BallCapFront/BCLogo.png deleted file mode 100644 index cc269545a..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/BCLogo.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/BDSM.png b/Screens/Inventory/Hat/BallCapFront/BDSM.png deleted file mode 100644 index 28d508901..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/BDSM.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/BG.png b/Screens/Inventory/Hat/BallCapFront/BG.png deleted file mode 100644 index 05462d2c5..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/BG.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/Blank.png b/Screens/Inventory/Hat/BallCapFront/Blank.png deleted file mode 100644 index dbc59af07..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/Blank.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/Chain.png b/Screens/Inventory/Hat/BallCapFront/Chain.png deleted file mode 100644 index d7c5c4fb9..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/Chain.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/Gag.png b/Screens/Inventory/Hat/BallCapFront/Gag.png deleted file mode 100644 index d57ff8f1d..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/Gag.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/Knot.png b/Screens/Inventory/Hat/BallCapFront/Knot.png deleted file mode 100644 index af922c357..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/Knot.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/Monogram.png b/Screens/Inventory/Hat/BallCapFront/Monogram.png deleted file mode 100644 index 9ce9e8ce0..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/Monogram.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/Rock.png b/Screens/Inventory/Hat/BallCapFront/Rock.png deleted file mode 100644 index 4ecce6868..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/Rock.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/Smile.png b/Screens/Inventory/Hat/BallCapFront/Smile.png deleted file mode 100644 index c2cbdf96a..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/Smile.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/Sun.png b/Screens/Inventory/Hat/BallCapFront/Sun.png deleted file mode 100644 index 202fd2de1..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/Sun.png and /dev/null differ diff --git a/Screens/Inventory/Hat/BallCapFront/Tick.png b/Screens/Inventory/Hat/BallCapFront/Tick.png deleted file mode 100644 index 7b889e0aa..000000000 Binary files a/Screens/Inventory/Hat/BallCapFront/Tick.png and /dev/null differ diff --git a/Screens/Inventory/Hat/Bandana/Circles.png b/Screens/Inventory/Hat/Bandana/Circles.png deleted file mode 100644 index 8baa354b5..000000000 Binary files a/Screens/Inventory/Hat/Bandana/Circles.png and /dev/null differ diff --git a/Screens/Inventory/Hat/Bandana/Dots.png b/Screens/Inventory/Hat/Bandana/Dots.png deleted file mode 100644 index d38f71605..000000000 Binary files a/Screens/Inventory/Hat/Bandana/Dots.png and /dev/null differ diff --git a/Screens/Inventory/Hat/Bandana/Flowers.png b/Screens/Inventory/Hat/Bandana/Flowers.png deleted file mode 100644 index ab55346ab..000000000 Binary files a/Screens/Inventory/Hat/Bandana/Flowers.png and /dev/null differ diff --git a/Screens/Inventory/Hat/Bandana/Plain.png b/Screens/Inventory/Hat/Bandana/Plain.png deleted file mode 100644 index 4c9dca93d..000000000 Binary files a/Screens/Inventory/Hat/Bandana/Plain.png and /dev/null differ diff --git a/Screens/Inventory/Hat/Bandana/Triangles.png b/Screens/Inventory/Hat/Bandana/Triangles.png deleted file mode 100644 index 05893eedc..000000000 Binary files a/Screens/Inventory/Hat/Bandana/Triangles.png and /dev/null differ diff --git a/Screens/Inventory/ItemAddon/CeilingChain/Lowered.png b/Screens/Inventory/ItemAddon/CeilingChain/Lowered.png deleted file mode 100644 index ef32605db..000000000 Binary files a/Screens/Inventory/ItemAddon/CeilingChain/Lowered.png and /dev/null differ diff --git a/Screens/Inventory/ItemAddon/CeilingChain/Suspended.png b/Screens/Inventory/ItemAddon/CeilingChain/Suspended.png deleted file mode 100644 index 064197e4a..000000000 Binary files a/Screens/Inventory/ItemAddon/CeilingChain/Suspended.png and /dev/null differ diff --git a/Screens/Inventory/ItemAddon/CeilingRope/Lowered.png b/Screens/Inventory/ItemAddon/CeilingRope/Lowered.png deleted file mode 100644 index 68fce9e2c..000000000 Binary files a/Screens/Inventory/ItemAddon/CeilingRope/Lowered.png and /dev/null differ diff --git a/Screens/Inventory/ItemAddon/CeilingRope/Suspended.png b/Screens/Inventory/ItemAddon/CeilingRope/Suspended.png deleted file mode 100644 index 46ba7dcb8..000000000 Binary files a/Screens/Inventory/ItemAddon/CeilingRope/Suspended.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/BitchSuit/Exposed.png b/Screens/Inventory/ItemArms/BitchSuit/Exposed.png deleted file mode 100644 index 639e755f9..000000000 Binary files a/Screens/Inventory/ItemArms/BitchSuit/Exposed.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/BitchSuit/Unzipped.png b/Screens/Inventory/ItemArms/BitchSuit/Unzipped.png deleted file mode 100644 index 639e755f9..000000000 Binary files a/Screens/Inventory/ItemArms/BitchSuit/Unzipped.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/BitchSuit/Zipped.png b/Screens/Inventory/ItemArms/BitchSuit/Zipped.png deleted file mode 100644 index 7c2dbb24e..000000000 Binary files a/Screens/Inventory/ItemArms/BitchSuit/Zipped.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/CeilingShackles/HeadLevel.png b/Screens/Inventory/ItemArms/CeilingShackles/HeadLevel.png deleted file mode 100644 index 4b175884a..000000000 Binary files a/Screens/Inventory/ItemArms/CeilingShackles/HeadLevel.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/CeilingShackles/Overhead.png b/Screens/Inventory/ItemArms/CeilingShackles/Overhead.png deleted file mode 100644 index 87820646d..000000000 Binary files a/Screens/Inventory/ItemArms/CeilingShackles/Overhead.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Chains/AllFours.png b/Screens/Inventory/ItemArms/Chains/AllFours.png deleted file mode 100644 index d9f4ef792..000000000 Binary files a/Screens/Inventory/ItemArms/Chains/AllFours.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Chains/BoxTie.png b/Screens/Inventory/ItemArms/Chains/BoxTie.png deleted file mode 100644 index 69e4855c5..000000000 Binary files a/Screens/Inventory/ItemArms/Chains/BoxTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Chains/ChainCuffs.png b/Screens/Inventory/ItemArms/Chains/ChainCuffs.png deleted file mode 100644 index 83e172403..000000000 Binary files a/Screens/Inventory/ItemArms/Chains/ChainCuffs.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Chains/Hogtied.png b/Screens/Inventory/ItemArms/Chains/Hogtied.png deleted file mode 100644 index 37b2c2b90..000000000 Binary files a/Screens/Inventory/ItemArms/Chains/Hogtied.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Chains/KneelingHogtie.png b/Screens/Inventory/ItemArms/Chains/KneelingHogtie.png deleted file mode 100644 index 2e10e2fef..000000000 Binary files a/Screens/Inventory/ItemArms/Chains/KneelingHogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Chains/SuspensionHogtied.png b/Screens/Inventory/ItemArms/Chains/SuspensionHogtied.png deleted file mode 100644 index aecd66309..000000000 Binary files a/Screens/Inventory/ItemArms/Chains/SuspensionHogtied.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Chains/WristElbowHarnessTie.png b/Screens/Inventory/ItemArms/Chains/WristElbowHarnessTie.png deleted file mode 100644 index 0ffd105ba..000000000 Binary files a/Screens/Inventory/ItemArms/Chains/WristElbowHarnessTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Chains/WristElbowTie.png b/Screens/Inventory/ItemArms/Chains/WristElbowTie.png deleted file mode 100644 index f0d0e8316..000000000 Binary files a/Screens/Inventory/ItemArms/Chains/WristElbowTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Chains/WristTie.png b/Screens/Inventory/ItemArms/Chains/WristTie.png deleted file mode 100644 index 3517f1c3b..000000000 Binary files a/Screens/Inventory/ItemArms/Chains/WristTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/DuctTape/Arms.png b/Screens/Inventory/ItemArms/DuctTape/Arms.png deleted file mode 100644 index 4fef2129b..000000000 Binary files a/Screens/Inventory/ItemArms/DuctTape/Arms.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/DuctTape/Bottom.png b/Screens/Inventory/ItemArms/DuctTape/Bottom.png deleted file mode 100644 index d837c843c..000000000 Binary files a/Screens/Inventory/ItemArms/DuctTape/Bottom.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/DuctTape/Complete.png b/Screens/Inventory/ItemArms/DuctTape/Complete.png deleted file mode 100644 index 6a5b5d921..000000000 Binary files a/Screens/Inventory/ItemArms/DuctTape/Complete.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/DuctTape/ExposedComplete.png b/Screens/Inventory/ItemArms/DuctTape/ExposedComplete.png deleted file mode 100644 index 8899e96de..000000000 Binary files a/Screens/Inventory/ItemArms/DuctTape/ExposedComplete.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/DuctTape/Full.png b/Screens/Inventory/ItemArms/DuctTape/Full.png deleted file mode 100644 index 8ae3f89fb..000000000 Binary files a/Screens/Inventory/ItemArms/DuctTape/Full.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/DuctTape/Hands.png b/Screens/Inventory/ItemArms/DuctTape/Hands.png deleted file mode 100644 index 420bbcde8..000000000 Binary files a/Screens/Inventory/ItemArms/DuctTape/Hands.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/DuctTape/PetTape.png b/Screens/Inventory/ItemArms/DuctTape/PetTape.png deleted file mode 100644 index ebe04e92a..000000000 Binary files a/Screens/Inventory/ItemArms/DuctTape/PetTape.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/DuctTape/Top.png b/Screens/Inventory/ItemArms/DuctTape/Top.png deleted file mode 100644 index 22f3b9526..000000000 Binary files a/Screens/Inventory/ItemArms/DuctTape/Top.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FullLatexSuit/FullLatexSuit.js b/Screens/Inventory/ItemArms/FullLatexSuit/FullLatexSuit.js deleted file mode 100644 index 391d0c063..000000000 --- a/Screens/Inventory/ItemArms/FullLatexSuit/FullLatexSuit.js +++ /dev/null @@ -1,81 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemArmsFullLatexSuitLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Type: null }; - if (DialogFocusItem.Property.Block == null) { - DialogFocusItem.Property.Block = DialogFocusItem.Property.Type ? [] : ["ItemBreast", "ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt"]; - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, DialogFocusItem.Asset.Group.Name); - } -} - -// Draw the item extension screen -function InventoryItemArmsFullLatexSuitDraw() { - - // Draw the item image and top controls - const C = CharacterGetCurrent(); - const asset = DialogFocusItem.Asset; - const property = DialogFocusItem.Property; - const inventoryPath = AssetGetInventoryPath(asset); - DrawText(DialogFindPlayer("SelectSuitType"), 1500, 50, "white", "gray"); - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Draw the suits options - DrawText(DialogFindPlayer("FullLatexSuitTypeZipped"), 1263, 425, "white", "gray"); - DrawPreviewBox(1150, 440, `${inventoryPath}/Latex.png`, "", { Hover: true, Disabled: property.Type === null }); - - DrawText(DialogFindPlayer("FullLatexSuitTypeUnZip"), 1713, 425, "white", "gray"); - DrawPreviewBox(1600, 440, `${inventoryPath}/UnZip.png`, "", { Hover: true, Disabled: property.Type === "UnZip" }); - - if (InventoryGet(C, "ItemVulvaPiercings") == null || - !InventoryGet(C, "ItemVulvaPiercings").Asset || - !InventoryGet(C, "ItemVulvaPiercings").Asset.Effect || - InventoryGet(C, "ItemVulvaPiercings").Asset.Effect.indexOf("Chaste") == -1) - if (InventoryGet(C, "ItemVulva") == null) { - DrawText(DialogFindPlayer("FullLatexSuitTypeWand"), 1488, 725, "white", "gray"); - DrawPreviewBox(1375, 750, `${inventoryPath}/Wand.png`, "", { Hover: true }); - } else - DrawText(DialogFindPlayer("CheckVulvaForWand"), 1500, 690, "white", "gray"); - -} - -// Catches the item extension clicks -function InventoryItemArmsFullLatexSuitClick() { - if (MouseIn(1885, 25, 90, 90)) DialogFocusItem = null; - else if (MouseIn(1150, 440, 225, 225) && (DialogFocusItem.Property.Type != null)) InventoryItemArmsFullLatexSuitSetType(null); - else if (MouseIn(1600, 440, 225, 225) && (DialogFocusItem.Property.Type !== "UnZip")) InventoryItemArmsFullLatexSuitSetType("UnZip"); - else if (MouseIn(1375, 750, 225, 225) && InventoryGet(CharacterGetCurrent(), "ItemVulva") == null) InventoryItemArmsFullLatexSuitSetType("Wand"); -} - -// Sets the suit properties when it's model changes -function InventoryItemArmsFullLatexSuitSetType(NewType) { - - // Sets the type, blocking zones and wand - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemArmsFullLatexSuitLoad(); - } - if (NewType == null || NewType == "UnZip") DialogFocusItem.Property.Type = NewType; - if (NewType == null) DialogFocusItem.Property.Block = ["ItemBreast", "ItemNipples", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt"]; - else if (NewType == "UnZip") DialogFocusItem.Property.Block = []; - if (NewType == "Wand") { - InventoryWear(C, "FullLatexSuitWand", "ItemVulva"); - ChatRoomCharacterItemUpdate(C, "ItemVulva"); - } - CharacterRefresh(C); - - // Pushes the change to the chatroom - var msg = "FullLatexSuitSet" + ((NewType) ? NewType : "Zipped"); - var Dictionary = []; - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - ChatRoomPublishCustomAction(msg, true, Dictionary); - if (DialogInventory != null) { - DialogFocusItem = null; - DialogMenuButtonBuild(C); - } - -} diff --git a/Screens/Inventory/ItemArms/FullLatexSuit/Latex.png b/Screens/Inventory/ItemArms/FullLatexSuit/Latex.png deleted file mode 100644 index 7c2dbb24e..000000000 Binary files a/Screens/Inventory/ItemArms/FullLatexSuit/Latex.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FullLatexSuit/UnZip.png b/Screens/Inventory/ItemArms/FullLatexSuit/UnZip.png deleted file mode 100644 index 639e755f9..000000000 Binary files a/Screens/Inventory/ItemArms/FullLatexSuit/UnZip.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FullLatexSuit/Wand.png b/Screens/Inventory/ItemArms/FullLatexSuit/Wand.png deleted file mode 100644 index cc1cc6e7a..000000000 Binary files a/Screens/Inventory/ItemArms/FullLatexSuit/Wand.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticArmbinder/Normal.png b/Screens/Inventory/ItemArms/FuturisticArmbinder/Normal.png deleted file mode 100644 index 83e3fa428..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticArmbinder/Normal.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticArmbinder/Tight.png b/Screens/Inventory/ItemArms/FuturisticArmbinder/Tight.png deleted file mode 100644 index 5bb4813b2..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticArmbinder/Tight.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticCuffs/Both.png b/Screens/Inventory/ItemArms/FuturisticCuffs/Both.png deleted file mode 100644 index 51f016173..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticCuffs/Both.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticCuffs/Elbow.png b/Screens/Inventory/ItemArms/FuturisticCuffs/Elbow.png deleted file mode 100644 index 40b479e77..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticCuffs/Elbow.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticCuffs/None.png b/Screens/Inventory/ItemArms/FuturisticCuffs/None.png deleted file mode 100644 index 1d671bab3..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticCuffs/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticCuffs/Wrist.png b/Screens/Inventory/ItemArms/FuturisticCuffs/Wrist.png deleted file mode 100644 index 1b9b831fd..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticCuffs/Wrist.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticStraitjacket/a0.png b/Screens/Inventory/ItemArms/FuturisticStraitjacket/a0.png deleted file mode 100644 index 93fc7c8a5..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticStraitjacket/a0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticStraitjacket/a1.png b/Screens/Inventory/ItemArms/FuturisticStraitjacket/a1.png deleted file mode 100644 index 15bc6564f..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticStraitjacket/a1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticStraitjacket/cl0.png b/Screens/Inventory/ItemArms/FuturisticStraitjacket/cl0.png deleted file mode 100644 index 16081a228..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticStraitjacket/cl0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticStraitjacket/cl1.png b/Screens/Inventory/ItemArms/FuturisticStraitjacket/cl1.png deleted file mode 100644 index 236086025..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticStraitjacket/cl1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticStraitjacket/co0.png b/Screens/Inventory/ItemArms/FuturisticStraitjacket/co0.png deleted file mode 100644 index 24e92ab74..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticStraitjacket/co0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticStraitjacket/co1.png b/Screens/Inventory/ItemArms/FuturisticStraitjacket/co1.png deleted file mode 100644 index e478b74c5..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticStraitjacket/co1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticStraitjacket/np0.png b/Screens/Inventory/ItemArms/FuturisticStraitjacket/np0.png deleted file mode 100644 index 3db4123b5..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticStraitjacket/np0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticStraitjacket/np1.png b/Screens/Inventory/ItemArms/FuturisticStraitjacket/np1.png deleted file mode 100644 index f929f7adc..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticStraitjacket/np1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticStraitjacket/vp0.png b/Screens/Inventory/ItemArms/FuturisticStraitjacket/vp0.png deleted file mode 100644 index c10a89551..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticStraitjacket/vp0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/FuturisticStraitjacket/vp1.png b/Screens/Inventory/ItemArms/FuturisticStraitjacket/vp1.png deleted file mode 100644 index b04169cda..000000000 Binary files a/Screens/Inventory/ItemArms/FuturisticStraitjacket/vp1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/AllFours.png b/Screens/Inventory/ItemArms/HempRope/AllFours.png deleted file mode 100644 index 26a36b0f9..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/AllFours.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/BedSpreadEagle.png b/Screens/Inventory/ItemArms/HempRope/BedSpreadEagle.png deleted file mode 100644 index 02e67abbc..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/BedSpreadEagle.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/BoxTie.png b/Screens/Inventory/ItemArms/HempRope/BoxTie.png deleted file mode 100644 index 7247dd1e3..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/BoxTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/CrossedBoxtie.png b/Screens/Inventory/ItemArms/HempRope/CrossedBoxtie.png deleted file mode 100644 index d8a57568d..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/CrossedBoxtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/HempRope.js b/Screens/Inventory/ItemArms/HempRope/HempRope.js deleted file mode 100644 index c0c5fcd91..000000000 --- a/Screens/Inventory/ItemArms/HempRope/HempRope.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemArmsHempRopeBeforeDraw(data) { - if (data.LayerType === "BedSpreadEagle") { - return { - X: data.X - 50, - Y: data.Y - 150, - }; - } - else if (data.Property && data.Property.Type === "SuspensionKneelingHogtie" && data.L === "_Suspension") { - return { - // Hide the rope split-into-four behind hair as otherwise it appears odd - Y: data.Y + 30, - }; - } - - return null; -} diff --git a/Screens/Inventory/ItemArms/HempRope/Hogtied.png b/Screens/Inventory/ItemArms/HempRope/Hogtied.png deleted file mode 100644 index bde80830f..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/Hogtied.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/InvertedSuspensionAllFours.png b/Screens/Inventory/ItemArms/HempRope/InvertedSuspensionAllFours.png deleted file mode 100644 index 7763e2b1a..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/InvertedSuspensionAllFours.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/InvertedSuspensionHogtied.png b/Screens/Inventory/ItemArms/HempRope/InvertedSuspensionHogtied.png deleted file mode 100644 index 442b9cce3..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/InvertedSuspensionHogtied.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/KneelingHogtie.png b/Screens/Inventory/ItemArms/HempRope/KneelingHogtie.png deleted file mode 100644 index 2e10e2fef..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/KneelingHogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/RopeCuffs.png b/Screens/Inventory/ItemArms/HempRope/RopeCuffs.png deleted file mode 100644 index 3635d66e0..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/RopeCuffs.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/SimpleHogtie.png b/Screens/Inventory/ItemArms/HempRope/SimpleHogtie.png deleted file mode 100644 index 220875bac..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/SimpleHogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/SuspensionAllFours.png b/Screens/Inventory/ItemArms/HempRope/SuspensionAllFours.png deleted file mode 100644 index e53507e9b..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/SuspensionAllFours.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/SuspensionHogtied.png b/Screens/Inventory/ItemArms/HempRope/SuspensionHogtied.png deleted file mode 100644 index 970c0d748..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/SuspensionHogtied.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/SuspensionKneelingHogtie.png b/Screens/Inventory/ItemArms/HempRope/SuspensionKneelingHogtie.png deleted file mode 100644 index d488c252e..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/SuspensionKneelingHogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/TightBoxtie.png b/Screens/Inventory/ItemArms/HempRope/TightBoxtie.png deleted file mode 100644 index a2635206f..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/TightBoxtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/WristElbowHarnessTie.png b/Screens/Inventory/ItemArms/HempRope/WristElbowHarnessTie.png deleted file mode 100644 index 2db3d3984..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/WristElbowHarnessTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/WristElbowTie.png b/Screens/Inventory/ItemArms/HempRope/WristElbowTie.png deleted file mode 100644 index f0d0e8316..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/WristElbowTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HempRope/WristTie.png b/Screens/Inventory/ItemArms/HempRope/WristTie.png deleted file mode 100644 index 3517f1c3b..000000000 Binary files a/Screens/Inventory/ItemArms/HempRope/WristTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/a0.png b/Screens/Inventory/ItemArms/HighSecurityStraitJacket/a0.png deleted file mode 100644 index 808147b02..000000000 Binary files a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/a0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/a1.png b/Screens/Inventory/ItemArms/HighSecurityStraitJacket/a1.png deleted file mode 100644 index 433710426..000000000 Binary files a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/a1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/a2.png b/Screens/Inventory/ItemArms/HighSecurityStraitJacket/a2.png deleted file mode 100644 index ccc3084a3..000000000 Binary files a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/a2.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/c0.png b/Screens/Inventory/ItemArms/HighSecurityStraitJacket/c0.png deleted file mode 100644 index 6db2605eb..000000000 Binary files a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/c0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/c1.png b/Screens/Inventory/ItemArms/HighSecurityStraitJacket/c1.png deleted file mode 100644 index ab7d8b5a2..000000000 Binary files a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/c1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s0.png b/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s0.png deleted file mode 100644 index 888834c53..000000000 Binary files a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s1.png b/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s1.png deleted file mode 100644 index 6b248e42d..000000000 Binary files a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s2.png b/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s2.png deleted file mode 100644 index 28a427268..000000000 Binary files a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s2.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s3.png b/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s3.png deleted file mode 100644 index 8feb84871..000000000 Binary files a/Screens/Inventory/ItemArms/HighSecurityStraitJacket/s3.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/InflatableStraightLeotard/Bloated.png b/Screens/Inventory/ItemArms/InflatableStraightLeotard/Bloated.png deleted file mode 100644 index 9369431cb..000000000 Binary files a/Screens/Inventory/ItemArms/InflatableStraightLeotard/Bloated.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/InflatableStraightLeotard/Inflated.png b/Screens/Inventory/ItemArms/InflatableStraightLeotard/Inflated.png deleted file mode 100644 index d3229bc04..000000000 Binary files a/Screens/Inventory/ItemArms/InflatableStraightLeotard/Inflated.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/InflatableStraightLeotard/Light.png b/Screens/Inventory/ItemArms/InflatableStraightLeotard/Light.png deleted file mode 100644 index 4fbbf5744..000000000 Binary files a/Screens/Inventory/ItemArms/InflatableStraightLeotard/Light.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/InflatableStraightLeotard/Max.png b/Screens/Inventory/ItemArms/InflatableStraightLeotard/Max.png deleted file mode 100644 index 69c6780d2..000000000 Binary files a/Screens/Inventory/ItemArms/InflatableStraightLeotard/Max.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LatexBoxtieLeotard/Polished.png b/Screens/Inventory/ItemArms/LatexBoxtieLeotard/Polished.png deleted file mode 100644 index efa739851..000000000 Binary files a/Screens/Inventory/ItemArms/LatexBoxtieLeotard/Polished.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LatexBoxtieLeotard/Unpolished.png b/Screens/Inventory/ItemArms/LatexBoxtieLeotard/Unpolished.png deleted file mode 100644 index 4d880974a..000000000 Binary files a/Screens/Inventory/ItemArms/LatexBoxtieLeotard/Unpolished.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LatexButterflyLeotard/Polished.png b/Screens/Inventory/ItemArms/LatexButterflyLeotard/Polished.png deleted file mode 100644 index 340d128c2..000000000 Binary files a/Screens/Inventory/ItemArms/LatexButterflyLeotard/Polished.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LatexButterflyLeotard/Unpolished.png b/Screens/Inventory/ItemArms/LatexButterflyLeotard/Unpolished.png deleted file mode 100644 index c398356ed..000000000 Binary files a/Screens/Inventory/ItemArms/LatexButterflyLeotard/Unpolished.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LatexSleevelessLeotard/Polished.png b/Screens/Inventory/ItemArms/LatexSleevelessLeotard/Polished.png deleted file mode 100644 index 17b51fed8..000000000 Binary files a/Screens/Inventory/ItemArms/LatexSleevelessLeotard/Polished.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LatexSleevelessLeotard/Unpolished.png b/Screens/Inventory/ItemArms/LatexSleevelessLeotard/Unpolished.png deleted file mode 100644 index 4d3590ade..000000000 Binary files a/Screens/Inventory/ItemArms/LatexSleevelessLeotard/Unpolished.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherArmbinder/None.png b/Screens/Inventory/ItemArms/LeatherArmbinder/None.png deleted file mode 100644 index f09b3f2bc..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherArmbinder/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherArmbinder/Strap.png b/Screens/Inventory/ItemArms/LeatherArmbinder/Strap.png deleted file mode 100644 index b24f974bf..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherArmbinder/Strap.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherArmbinder/WrapStrap.png b/Screens/Inventory/ItemArms/LeatherArmbinder/WrapStrap.png deleted file mode 100644 index be69f63b3..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherArmbinder/WrapStrap.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherCuffs/Both.png b/Screens/Inventory/ItemArms/LeatherCuffs/Both.png deleted file mode 100644 index 51f016173..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherCuffs/Both.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherCuffs/Elbow.png b/Screens/Inventory/ItemArms/LeatherCuffs/Elbow.png deleted file mode 100644 index 40b479e77..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherCuffs/Elbow.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherCuffs/Hogtie.png b/Screens/Inventory/ItemArms/LeatherCuffs/Hogtie.png deleted file mode 100644 index 817f4a2fc..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherCuffs/Hogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherCuffs/None.png b/Screens/Inventory/ItemArms/LeatherCuffs/None.png deleted file mode 100644 index 1d671bab3..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherCuffs/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherCuffs/Wrist.png b/Screens/Inventory/ItemArms/LeatherCuffs/Wrist.png deleted file mode 100644 index 1b9b831fd..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherCuffs/Wrist.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherStraitJacket/Loose.png b/Screens/Inventory/ItemArms/LeatherStraitJacket/Loose.png deleted file mode 100644 index 26d636802..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherStraitJacket/Loose.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherStraitJacket/Normal.png b/Screens/Inventory/ItemArms/LeatherStraitJacket/Normal.png deleted file mode 100644 index a335943ea..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherStraitJacket/Normal.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherStraitJacket/Snug.png b/Screens/Inventory/ItemArms/LeatherStraitJacket/Snug.png deleted file mode 100644 index 8cea19767..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherStraitJacket/Snug.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/LeatherStraitJacket/Tight.png b/Screens/Inventory/ItemArms/LeatherStraitJacket/Tight.png deleted file mode 100644 index f77aaf612..000000000 Binary files a/Screens/Inventory/ItemArms/LeatherStraitJacket/Tight.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/MermaidSuit/UnZip.png b/Screens/Inventory/ItemArms/MermaidSuit/UnZip.png deleted file mode 100644 index 639e755f9..000000000 Binary files a/Screens/Inventory/ItemArms/MermaidSuit/UnZip.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/MermaidSuit/Zipped.png b/Screens/Inventory/ItemArms/MermaidSuit/Zipped.png deleted file mode 100644 index 7c2dbb24e..000000000 Binary files a/Screens/Inventory/ItemArms/MermaidSuit/Zipped.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/MetalCuffs/BehindBack.png b/Screens/Inventory/ItemArms/MetalCuffs/BehindBack.png deleted file mode 100644 index 48ca5dd2b..000000000 Binary files a/Screens/Inventory/ItemArms/MetalCuffs/BehindBack.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/MetalCuffs/InFront.png b/Screens/Inventory/ItemArms/MetalCuffs/InFront.png deleted file mode 100644 index 48ca5dd2b..000000000 Binary files a/Screens/Inventory/ItemArms/MetalCuffs/InFront.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/NylonRope/AllFours.png b/Screens/Inventory/ItemArms/NylonRope/AllFours.png deleted file mode 100644 index b6bcdb1e9..000000000 Binary files a/Screens/Inventory/ItemArms/NylonRope/AllFours.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/NylonRope/BedSpreadEagle.png b/Screens/Inventory/ItemArms/NylonRope/BedSpreadEagle.png deleted file mode 100644 index e9f542c35..000000000 Binary files a/Screens/Inventory/ItemArms/NylonRope/BedSpreadEagle.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/NylonRope/BoxTie.png b/Screens/Inventory/ItemArms/NylonRope/BoxTie.png deleted file mode 100644 index 02d4a5235..000000000 Binary files a/Screens/Inventory/ItemArms/NylonRope/BoxTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/NylonRope/Hogtied.png b/Screens/Inventory/ItemArms/NylonRope/Hogtied.png deleted file mode 100644 index 7b5b6e47e..000000000 Binary files a/Screens/Inventory/ItemArms/NylonRope/Hogtied.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/NylonRope/KneelingHogtie.png b/Screens/Inventory/ItemArms/NylonRope/KneelingHogtie.png deleted file mode 100644 index 2e10e2fef..000000000 Binary files a/Screens/Inventory/ItemArms/NylonRope/KneelingHogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/NylonRope/NylonRope.js b/Screens/Inventory/ItemArms/NylonRope/NylonRope.js deleted file mode 100644 index 982ca2926..000000000 --- a/Screens/Inventory/ItemArms/NylonRope/NylonRope.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemArmsNylonRopeBeforeDraw(data) { - if (data.LayerType === "BedSpreadEagle") { - return { - X: data.X - 50, - Y: data.Y - 150, - }; - } - - return null; -} diff --git a/Screens/Inventory/ItemArms/NylonRope/SimpleHogtie.png b/Screens/Inventory/ItemArms/NylonRope/SimpleHogtie.png deleted file mode 100644 index 220875bac..000000000 Binary files a/Screens/Inventory/ItemArms/NylonRope/SimpleHogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/NylonRope/TightBoxtie.png b/Screens/Inventory/ItemArms/NylonRope/TightBoxtie.png deleted file mode 100644 index 4f01fd0df..000000000 Binary files a/Screens/Inventory/ItemArms/NylonRope/TightBoxtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/NylonRope/WristElbowHarnessTie.png b/Screens/Inventory/ItemArms/NylonRope/WristElbowHarnessTie.png deleted file mode 100644 index 4fb18bf99..000000000 Binary files a/Screens/Inventory/ItemArms/NylonRope/WristElbowHarnessTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/NylonRope/WristElbowTie.png b/Screens/Inventory/ItemArms/NylonRope/WristElbowTie.png deleted file mode 100644 index f0d0e8316..000000000 Binary files a/Screens/Inventory/ItemArms/NylonRope/WristElbowTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/NylonRope/WristTie.png b/Screens/Inventory/ItemArms/NylonRope/WristTie.png deleted file mode 100644 index 3517f1c3b..000000000 Binary files a/Screens/Inventory/ItemArms/NylonRope/WristTie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/OrnateCuffs/Both.png b/Screens/Inventory/ItemArms/OrnateCuffs/Both.png deleted file mode 100644 index ed3b17473..000000000 Binary files a/Screens/Inventory/ItemArms/OrnateCuffs/Both.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/OrnateCuffs/Elbow.png b/Screens/Inventory/ItemArms/OrnateCuffs/Elbow.png deleted file mode 100644 index 200a6bd67..000000000 Binary files a/Screens/Inventory/ItemArms/OrnateCuffs/Elbow.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/OrnateCuffs/Hogtie.png b/Screens/Inventory/ItemArms/OrnateCuffs/Hogtie.png deleted file mode 100644 index 67fd9d9ca..000000000 Binary files a/Screens/Inventory/ItemArms/OrnateCuffs/Hogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/OrnateCuffs/None.png b/Screens/Inventory/ItemArms/OrnateCuffs/None.png deleted file mode 100644 index e5e7ff72b..000000000 Binary files a/Screens/Inventory/ItemArms/OrnateCuffs/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/OrnateCuffs/Wrist.png b/Screens/Inventory/ItemArms/OrnateCuffs/Wrist.png deleted file mode 100644 index 8071e3463..000000000 Binary files a/Screens/Inventory/ItemArms/OrnateCuffs/Wrist.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/PrisonLockdownSuit/Ankles.png b/Screens/Inventory/ItemArms/PrisonLockdownSuit/Ankles.png deleted file mode 100644 index 551d470d3..000000000 Binary files a/Screens/Inventory/ItemArms/PrisonLockdownSuit/Ankles.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/PrisonLockdownSuit/Free.png b/Screens/Inventory/ItemArms/PrisonLockdownSuit/Free.png deleted file mode 100644 index d734c8c88..000000000 Binary files a/Screens/Inventory/ItemArms/PrisonLockdownSuit/Free.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/PrisonLockdownSuit/Full.png b/Screens/Inventory/ItemArms/PrisonLockdownSuit/Full.png deleted file mode 100644 index 2e09cd235..000000000 Binary files a/Screens/Inventory/ItemArms/PrisonLockdownSuit/Full.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/PrisonLockdownSuit/PrisonLockdownSuit.js b/Screens/Inventory/ItemArms/PrisonLockdownSuit/PrisonLockdownSuit.js deleted file mode 100644 index 52a5fbe82..000000000 --- a/Screens/Inventory/ItemArms/PrisonLockdownSuit/PrisonLockdownSuit.js +++ /dev/null @@ -1,126 +0,0 @@ -"use strict"; - -var InventoryItemArmsPrisonLockdownSuitOptions = [ - { - Name: "Free", - Property: { - Type: null, - Difficulty: 0, - Effect: ["Block", "Prone", "Slow"], - }, - }, - { - Name: "Ankles", - Property: { - Type: "Ankles", - Difficulty: 2, - Effect: ["Block", "Prone", "Slow"], - }, - }, - { - Name: "Thighs", - Property: { - Type: "Thighs", - Difficulty: 1, - Effect: ["Block", "Prone", "Slow"], - }, - }, - { - Name: "Full", - Property: { - Type: "Full", - Difficulty: 3, - Effect: ["Block", "Prone", "Freeze"], - }, - }, -]; - -var InventoryItemArmsPrisonLockdownSuitPage = "Base"; - -function InventoryItemArmsPrisonLockdownSuitLoad() { - ExtendedItemLoad(InventoryItemArmsPrisonLockdownSuitOptions, "ItemArmsPrisonLockdownSuitSelect"); - InventoryItemNeckAccessoriesCollarShockUnitLoad(); - InventoryItemArmsPrisonLockdownSuitSetPage("Base"); -} - -function InventoryItemArmsPrisonLockdownSuitSetPage(Page) { - InventoryItemArmsPrisonLockdownSuitPage = Page; - DialogExtendedMessage = DialogFindPlayer("ItemArmsPrisonLockdownSuitSelect" + Page); -} - -function InventoryItemArmsPrisonLockdownSuitDraw() { - CommonCallFunctionByName("InventoryItemArmsPrisonLockdownSuitDraw" + InventoryItemArmsPrisonLockdownSuitPage); -} - -function InventoryItemArmsPrisonLockdownSuitDrawBase() { - var A = DialogFocusItem.Asset; - - // Draw the header and item - DrawAssetPreview(1387, 55, A); - DrawText(DialogExtendedMessage, 1500, 375, "white", "gray"); - - DrawPreviewBox(1175, 550, `${AssetGetInventoryPath(A)}/${DialogFocusItem.Property.Type || "Free"}.png`, "", { Hover: true }); - DrawText(DialogFindPlayer("ItemArmsPrisonLockdownSuitStraps"), 1288, 800, "white", "gray"); - - DrawPreviewBox(1600, 550, `${AssetGetInventoryPath(A)}/Shock.png`, "", { Hover: true }); - DrawText(DialogFindPlayer("ItemArmsPrisonLockdownSuitShock"), 1713, 800, "white", "gray"); -} - -function InventoryItemArmsPrisonLockdownSuitDrawStraps() { - ExtendedItemDraw(InventoryItemArmsPrisonLockdownSuitOptions, "ItemArmsPrisonLockdownSuit"); -} - -function InventoryItemArmsPrisonLockdownSuitDrawShock() { - InventoryItemNeckAccessoriesCollarShockUnitDraw(); -} - -function InventoryItemArmsPrisonLockdownSuitClick() { - CommonCallFunctionByName("InventoryItemArmsPrisonLockdownSuitClick" + InventoryItemArmsPrisonLockdownSuitPage); -} - -function InventoryItemArmsPrisonLockdownSuitClickBase() { - // Exit button - if (MouseIn(1885, 25, 90, 85)) { - DialogFocusItem = null; - return; - } - - if (MouseIn(1175, 550, 225, 225)) InventoryItemArmsPrisonLockdownSuitSetPage("Straps"); - else if (MouseIn(1600, 550, 225, 225)) InventoryItemArmsPrisonLockdownSuitSetPage("Shock"); -} - -function InventoryItemArmsPrisonLockdownSuitClickStraps() { - // Exit button - if (MouseIn(1885, 25, 90, 85)) { - InventoryItemArmsPrisonLockdownSuitSetPage("Base"); - return; - } - - ExtendedItemClick(InventoryItemArmsPrisonLockdownSuitOptions); -} - -function InventoryItemArmsPrisonLockdownSuitClickShock() { - // Exit button - if (MouseIn(1885, 25, 90, 85)) { - InventoryItemArmsPrisonLockdownSuitSetPage("Base"); - return; - } - - InventoryItemNeckAccessoriesCollarShockUnitClick(); -} - -function InventoryItemArmsPrisonLockdownSuitPublishAction(C, Option, PreviousOption) { - var msg = "ItemArmsPrisonLockdownSuitSet" + Option.Name; - if (["Ankles", "Thighs"].includes(Option.Name) && ["Free", "Full"].includes(PreviousOption.Name)) { - msg = "ItemArmsPrisonLockdownSuitSet" + PreviousOption.Name + "To" + Option.Name; - } - var dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - ChatRoomPublishCustomAction(msg, true, dictionary); -} - -function InventoryItemArmsPrisonLockdownSuitNpcDialog(C, Option) { - C.CurrentDialog = DialogFind(C, "ItemArmsPrisonLockdownSuit" + Option.Name, "ItemArms"); -} diff --git a/Screens/Inventory/ItemArms/PrisonLockdownSuit/Shock.png b/Screens/Inventory/ItemArms/PrisonLockdownSuit/Shock.png deleted file mode 100644 index 2e79ad252..000000000 Binary files a/Screens/Inventory/ItemArms/PrisonLockdownSuit/Shock.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/PrisonLockdownSuit/Thighs.png b/Screens/Inventory/ItemArms/PrisonLockdownSuit/Thighs.png deleted file mode 100644 index b04c1ce8d..000000000 Binary files a/Screens/Inventory/ItemArms/PrisonLockdownSuit/Thighs.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Ribbons/Cross.png b/Screens/Inventory/ItemArms/Ribbons/Cross.png deleted file mode 100644 index 4b293e943..000000000 Binary files a/Screens/Inventory/ItemArms/Ribbons/Cross.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Ribbons/Heavy.png b/Screens/Inventory/ItemArms/Ribbons/Heavy.png deleted file mode 100644 index d5b4f794a..000000000 Binary files a/Screens/Inventory/ItemArms/Ribbons/Heavy.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Slime/p0.png b/Screens/Inventory/ItemArms/Slime/p0.png deleted file mode 100644 index 77f5881a4..000000000 Binary files a/Screens/Inventory/ItemArms/Slime/p0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Slime/p1.png b/Screens/Inventory/ItemArms/Slime/p1.png deleted file mode 100644 index 333e2c492..000000000 Binary files a/Screens/Inventory/ItemArms/Slime/p1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Slime/t0.png b/Screens/Inventory/ItemArms/Slime/t0.png deleted file mode 100644 index 77f5881a4..000000000 Binary files a/Screens/Inventory/ItemArms/Slime/t0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Slime/t1.png b/Screens/Inventory/ItemArms/Slime/t1.png deleted file mode 100644 index 126242d41..000000000 Binary files a/Screens/Inventory/ItemArms/Slime/t1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/SteelCuffs/None.png b/Screens/Inventory/ItemArms/SteelCuffs/None.png deleted file mode 100644 index a64a8d22c..000000000 Binary files a/Screens/Inventory/ItemArms/SteelCuffs/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/SteelCuffs/Wrist.png b/Screens/Inventory/ItemArms/SteelCuffs/Wrist.png deleted file mode 100644 index 40512e44d..000000000 Binary files a/Screens/Inventory/ItemArms/SteelCuffs/Wrist.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitJacket/Loose.png b/Screens/Inventory/ItemArms/StraitJacket/Loose.png deleted file mode 100644 index a8c2bbd8a..000000000 Binary files a/Screens/Inventory/ItemArms/StraitJacket/Loose.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitJacket/Normal.png b/Screens/Inventory/ItemArms/StraitJacket/Normal.png deleted file mode 100644 index 1fe2083f6..000000000 Binary files a/Screens/Inventory/ItemArms/StraitJacket/Normal.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitJacket/Snug.png b/Screens/Inventory/ItemArms/StraitJacket/Snug.png deleted file mode 100644 index 28260eee1..000000000 Binary files a/Screens/Inventory/ItemArms/StraitJacket/Snug.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitJacket/Tight.png b/Screens/Inventory/ItemArms/StraitJacket/Tight.png deleted file mode 100644 index c0eefb593..000000000 Binary files a/Screens/Inventory/ItemArms/StraitJacket/Tight.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitLeotard/cl0.png b/Screens/Inventory/ItemArms/StraitLeotard/cl0.png deleted file mode 100644 index 16081a228..000000000 Binary files a/Screens/Inventory/ItemArms/StraitLeotard/cl0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitLeotard/cl1.png b/Screens/Inventory/ItemArms/StraitLeotard/cl1.png deleted file mode 100644 index 236086025..000000000 Binary files a/Screens/Inventory/ItemArms/StraitLeotard/cl1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitLeotard/co0.png b/Screens/Inventory/ItemArms/StraitLeotard/co0.png deleted file mode 100644 index 24e92ab74..000000000 Binary files a/Screens/Inventory/ItemArms/StraitLeotard/co0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitLeotard/co1.png b/Screens/Inventory/ItemArms/StraitLeotard/co1.png deleted file mode 100644 index e478b74c5..000000000 Binary files a/Screens/Inventory/ItemArms/StraitLeotard/co1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitLeotard/np0.png b/Screens/Inventory/ItemArms/StraitLeotard/np0.png deleted file mode 100644 index 3db4123b5..000000000 Binary files a/Screens/Inventory/ItemArms/StraitLeotard/np0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitLeotard/np1.png b/Screens/Inventory/ItemArms/StraitLeotard/np1.png deleted file mode 100644 index f929f7adc..000000000 Binary files a/Screens/Inventory/ItemArms/StraitLeotard/np1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitLeotard/vp0.png b/Screens/Inventory/ItemArms/StraitLeotard/vp0.png deleted file mode 100644 index c10a89551..000000000 Binary files a/Screens/Inventory/ItemArms/StraitLeotard/vp0.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/StraitLeotard/vp1.png b/Screens/Inventory/ItemArms/StraitLeotard/vp1.png deleted file mode 100644 index b04169cda..000000000 Binary files a/Screens/Inventory/ItemArms/StraitLeotard/vp1.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/SturdyLeatherBelts/One.png b/Screens/Inventory/ItemArms/SturdyLeatherBelts/One.png deleted file mode 100644 index fd8cca3e2..000000000 Binary files a/Screens/Inventory/ItemArms/SturdyLeatherBelts/One.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/SturdyLeatherBelts/Three.png b/Screens/Inventory/ItemArms/SturdyLeatherBelts/Three.png deleted file mode 100644 index 6ceda8da9..000000000 Binary files a/Screens/Inventory/ItemArms/SturdyLeatherBelts/Three.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/SturdyLeatherBelts/Two.png b/Screens/Inventory/ItemArms/SturdyLeatherBelts/Two.png deleted file mode 100644 index 19a506132..000000000 Binary files a/Screens/Inventory/ItemArms/SturdyLeatherBelts/Two.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Tentacles/BehindBack.png b/Screens/Inventory/ItemArms/Tentacles/BehindBack.png deleted file mode 100644 index b2fee95f2..000000000 Binary files a/Screens/Inventory/ItemArms/Tentacles/BehindBack.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Tentacles/OverTheHead.png b/Screens/Inventory/ItemArms/Tentacles/OverTheHead.png deleted file mode 100644 index 346dc1e66..000000000 Binary files a/Screens/Inventory/ItemArms/Tentacles/OverTheHead.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/ThinLeatherStraps/Boxtie.png b/Screens/Inventory/ItemArms/ThinLeatherStraps/Boxtie.png deleted file mode 100644 index 262a4e2b2..000000000 Binary files a/Screens/Inventory/ItemArms/ThinLeatherStraps/Boxtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/ThinLeatherStraps/Hogtie.png b/Screens/Inventory/ItemArms/ThinLeatherStraps/Hogtie.png deleted file mode 100644 index e5afb70fe..000000000 Binary files a/Screens/Inventory/ItemArms/ThinLeatherStraps/Hogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/ThinLeatherStraps/Wrist.png b/Screens/Inventory/ItemArms/ThinLeatherStraps/Wrist.png deleted file mode 100644 index 08c1107c4..000000000 Binary files a/Screens/Inventory/ItemArms/ThinLeatherStraps/Wrist.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/ThinLeatherStraps/WristElbow.png b/Screens/Inventory/ItemArms/ThinLeatherStraps/WristElbow.png deleted file mode 100644 index 7ceda2828..000000000 Binary files a/Screens/Inventory/ItemArms/ThinLeatherStraps/WristElbow.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/ThinLeatherStraps/WristElbowHarness.png b/Screens/Inventory/ItemArms/ThinLeatherStraps/WristElbowHarness.png deleted file mode 100644 index 0cb5cc8f0..000000000 Binary files a/Screens/Inventory/ItemArms/ThinLeatherStraps/WristElbowHarness.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacket/Basic.png b/Screens/Inventory/ItemArms/TightJacket/Basic.png deleted file mode 100644 index ee3579211..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacket/Basic.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacket/ExtraPadding.png b/Screens/Inventory/ItemArms/TightJacket/ExtraPadding.png deleted file mode 100644 index 95e7f78dd..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacket/ExtraPadding.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacket/FullJacket.png b/Screens/Inventory/ItemArms/TightJacket/FullJacket.png deleted file mode 100644 index 9e366bdb6..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacket/FullJacket.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacket/LiningStraps.png b/Screens/Inventory/ItemArms/TightJacket/LiningStraps.png deleted file mode 100644 index a4a28f64f..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacket/LiningStraps.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacket/PaddedLining.png b/Screens/Inventory/ItemArms/TightJacket/PaddedLining.png deleted file mode 100644 index 4706ce7b3..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacket/PaddedLining.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacket/PulledLining.png b/Screens/Inventory/ItemArms/TightJacket/PulledLining.png deleted file mode 100644 index d8ca4c12f..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacket/PulledLining.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacket/PulledPadding.png b/Screens/Inventory/ItemArms/TightJacket/PulledPadding.png deleted file mode 100644 index 279e09bf1..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacket/PulledPadding.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacket/PulledStraps.png b/Screens/Inventory/ItemArms/TightJacket/PulledStraps.png deleted file mode 100644 index 1c259bb6f..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacket/PulledStraps.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacketCrotch/Basic.png b/Screens/Inventory/ItemArms/TightJacketCrotch/Basic.png deleted file mode 100644 index ee3579211..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacketCrotch/Basic.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacketCrotch/ExtraPadding.png b/Screens/Inventory/ItemArms/TightJacketCrotch/ExtraPadding.png deleted file mode 100644 index 95e7f78dd..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacketCrotch/ExtraPadding.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacketCrotch/FullJacket.png b/Screens/Inventory/ItemArms/TightJacketCrotch/FullJacket.png deleted file mode 100644 index 9e366bdb6..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacketCrotch/FullJacket.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacketCrotch/LiningStraps.png b/Screens/Inventory/ItemArms/TightJacketCrotch/LiningStraps.png deleted file mode 100644 index a4a28f64f..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacketCrotch/LiningStraps.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacketCrotch/PaddedLining.png b/Screens/Inventory/ItemArms/TightJacketCrotch/PaddedLining.png deleted file mode 100644 index 4706ce7b3..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacketCrotch/PaddedLining.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacketCrotch/PulledLining.png b/Screens/Inventory/ItemArms/TightJacketCrotch/PulledLining.png deleted file mode 100644 index d8ca4c12f..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacketCrotch/PulledLining.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacketCrotch/PulledPadding.png b/Screens/Inventory/ItemArms/TightJacketCrotch/PulledPadding.png deleted file mode 100644 index 279e09bf1..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacketCrotch/PulledPadding.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TightJacketCrotch/PulledStraps.png b/Screens/Inventory/ItemArms/TightJacketCrotch/PulledStraps.png deleted file mode 100644 index 1c259bb6f..000000000 Binary files a/Screens/Inventory/ItemArms/TightJacketCrotch/PulledStraps.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TransportJacket/NoShorts.png b/Screens/Inventory/ItemArms/TransportJacket/NoShorts.png deleted file mode 100644 index 68eef7d8f..000000000 Binary files a/Screens/Inventory/ItemArms/TransportJacket/NoShorts.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TransportJacket/Shorts.png b/Screens/Inventory/ItemArms/TransportJacket/Shorts.png deleted file mode 100644 index 236d35eed..000000000 Binary files a/Screens/Inventory/ItemArms/TransportJacket/Shorts.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TransportJacket/ShortsAndStraps.png b/Screens/Inventory/ItemArms/TransportJacket/ShortsAndStraps.png deleted file mode 100644 index cb42ec083..000000000 Binary files a/Screens/Inventory/ItemArms/TransportJacket/ShortsAndStraps.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/TransportJacket/TransportJacket.js b/Screens/Inventory/ItemArms/TransportJacket/TransportJacket.js deleted file mode 100644 index edf4546e6..000000000 --- a/Screens/Inventory/ItemArms/TransportJacket/TransportJacket.js +++ /dev/null @@ -1,157 +0,0 @@ -"use strict"; - -let InventoryItemArmsTransportJacketOriginalText = null; -const InventoryItemArmsTransportJacketInputId = "TransportJacketText"; -const InventoryItemArmsTransportJacketMaxLength = 14; -const InventoryItemArmsTransportJacketFont = "'Saira Stencil One', 'Arial', sans-serif"; - -/** @type ExtendedItemOption[] */ -const InventoryItemArmsTransportJacketOptions = [ - { - Name: "NoShorts", - Property: { Type: null, Difficulty: 0 }, - }, - { - Name: "Shorts", - Property: { - Type: "Shorts", - Block: ["ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemBreast", "ItemHands", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis"], - Hide: ["Cloth", "ClothLower", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "Panties", "Corset"], - HideItemExclude: ["ClothLowerJeans1", "ClothLowerJeans2", "ClothLowerLatexPants1", "ClothLowerLeggings1", "ClothLowerLeggings2", "PantiesHarnessPanties1", "PantiesHarnessPanties2"], - }, - }, - { - Name: "ShortsAndStraps", - Property: { - Type: "ShortsAndStraps", - Block: ["ItemNipples", "ItemNipplesPiercings", "ItemTorso", "ItemBreast", "ItemHands", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemPelvis"], - Hide: ["Cloth", "ClothLower", "ItemNipplesPiercings", "ItemVulva", "ItemVulvaPiercings", "ItemButt", "Panties", "Corset"], - HideItemExclude: ["ClothLowerJeans1", "ClothLowerJeans2", "ClothLowerLatexPants1", "ClothLowerLeggings1", "ClothLowerLeggings2", "PantiesHarnessPanties1", "PantiesHarnessPanties2"], - }, - }, -]; - -function InventoryItemArmsTransportJacketLoad() { - ExtendedItemLoad(InventoryItemArmsTransportJacketOptions, "ItemArmsTransportJacketSelect"); - - const C = CharacterGetCurrent(); - - let refresh = false; - if (!DialogFocusItem.Property) DialogFocusItem.Property = {}; - if (DialogFocusItem.Property.Text == null) { - DialogFocusItem.Property.Text = ""; - refresh = true; - } - if (refresh) { - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, DialogFocusItem.Asset.Group.Name); - } - - if (InventoryItemArmsTransportJacketOriginalText == null) { - InventoryItemArmsTransportJacketOriginalText = DialogFocusItem.Property.Text; - } - - const input = ElementCreateInput( - InventoryItemArmsTransportJacketInputId, "text", DialogFocusItem.Property.Text, InventoryItemArmsTransportJacketMaxLength); - if (input) { - input.pattern = DynamicDrawTextInputPattern; - input.addEventListener("input", (e) => InventoryItemArmsTransportJacketTextChange(C, DialogFocusItem, e.target.value)); - } -} - -function InventoryItemArmsTransportJacketDraw() { - ExtendedItemDraw(InventoryItemArmsTransportJacketOptions, "ItemArmsTransportJacket", 3); - - MainCanvas.textAlign = "right"; - DrawTextFit(DialogFindPlayer("ItemArmsTransportJacketTextLabel"), 1475, 860, 400, "#fff", "#000"); - ElementPosition(InventoryItemArmsTransportJacketInputId, 1725, 860, 400); - MainCanvas.textAlign = "center"; -} - -function InventoryItemArmsTransportJacketClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemArmsTransportJacketExit(); - return ExtendedItemExit(); - } - - ExtendedItemClick(InventoryItemArmsTransportJacketOptions, 3); -} - -function InventoryItemArmsTransportJacketPublishAction(C, Option, PreviousOption) { - var msg = "ItemArmsTransportJacketSet" + PreviousOption.Name + Option.Name; - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name }, - ]; - ChatRoomPublishCustomAction(msg, true, Dictionary); -} - -const InventoryItemArmsTransportJacketTextChange = CommonLimitFunction((C, item, text) => { - item = DialogFocusItem || item; - if (DynamicDrawTextRegex.test(text)) { - item.Property.Text = text.substring(0, InventoryItemArmsTransportJacketMaxLength); - CharacterLoadCanvas(C); - } -}); - -function InventoryItemArmsTransportJacketExit() { - const C = CharacterGetCurrent(); - const item = DialogFocusItem; - - const text = ElementValue(InventoryItemArmsTransportJacketInputId).substring(0, InventoryItemArmsTransportJacketMaxLength); - if (DynamicDrawTextRegex.test(text)) item.Property.Text = text; - if (CurrentScreen === "ChatRoom" && text !== InventoryItemArmsTransportJacketOriginalText) { - const dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "NewText", Text: text }, - { Tag: "AssetName", AssetName: item.Asset.Name }, - ]; - const msg = text === "" ? "ItemArmsTransportJacketTextRemove" : "ItemArmsTransportJacketTextChange"; - ChatRoomPublishCustomAction(msg, false, dictionary); - } - - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, item.Asset.Group.Name); - - ElementRemove(InventoryItemArmsTransportJacketInputId); - InventoryItemArmsTransportJacketOriginalText = null; - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild(C); -} - -/** @type {DynamicAfterDrawCallback} */ -function AssetsItemArmsTransportJacketAfterDraw({ C, A, X, Y, L, Pose, Property, drawCanvas, drawCanvasBlink, AlphaMasks, Color }) { - if (L === "_Text") { - const width = 150; - const height = 60; - const flatCanvas = AnimationGenerateTempCanvas(C, A, width, height); - const flatCtx = flatCanvas.getContext("2d"); - - let text = Property && typeof Property.Text === "string" && DynamicDrawTextRegex.test(Property.Text) ? Property.Text : ""; - text = text.substring(0, InventoryItemArmsTransportJacketMaxLength); - - DynamicDrawText(text, flatCtx, width / 2, height / 2, { - fontSize: 40, - fontFamily: InventoryItemArmsTransportJacketFont, - color: Color, - width, - }); - - const interpolatedCanvas = AnimationGenerateTempCanvas(C, A, width, height); - const interpolatedCtx = interpolatedCanvas.getContext("2d"); - - const xTop = width * 0.15; - for (let i = 0; i < height; i++) { - const xStart = xTop - (xTop * i) / height; - interpolatedCtx.drawImage(flatCanvas, 0, i, width, 1, xStart, i, width - xStart * 2, 1); - } - - const drawX = X + (300 - width) / 2; - const drawY = Y + 75; - drawCanvas(interpolatedCanvas, drawX, drawY, AlphaMasks); - drawCanvasBlink(interpolatedCanvas, drawX, drawY, AlphaMasks); - } -} diff --git a/Screens/Inventory/ItemArms/Web/Cocooned.png b/Screens/Inventory/ItemArms/Web/Cocooned.png deleted file mode 100644 index 9b17362dd..000000000 Binary files a/Screens/Inventory/ItemArms/Web/Cocooned.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Web/Hogtied.png b/Screens/Inventory/ItemArms/Web/Hogtied.png deleted file mode 100644 index f4a347a9e..000000000 Binary files a/Screens/Inventory/ItemArms/Web/Hogtied.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Web/KneelingSuspended.png b/Screens/Inventory/ItemArms/Web/KneelingSuspended.png deleted file mode 100644 index 79cb07695..000000000 Binary files a/Screens/Inventory/ItemArms/Web/KneelingSuspended.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Web/Suspended.png b/Screens/Inventory/ItemArms/Web/Suspended.png deleted file mode 100644 index 454090329..000000000 Binary files a/Screens/Inventory/ItemArms/Web/Suspended.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Web/SuspensionHogtied.png b/Screens/Inventory/ItemArms/Web/SuspensionHogtied.png deleted file mode 100644 index e097ab7f9..000000000 Binary files a/Screens/Inventory/ItemArms/Web/SuspensionHogtied.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Web/Tangled.png b/Screens/Inventory/ItemArms/Web/Tangled.png deleted file mode 100644 index 2081a47ab..000000000 Binary files a/Screens/Inventory/ItemArms/Web/Tangled.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Web/Wrapped.png b/Screens/Inventory/ItemArms/Web/Wrapped.png deleted file mode 100644 index 49d0f45d6..000000000 Binary files a/Screens/Inventory/ItemArms/Web/Wrapped.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/WoodenCuffs/HandsBack.png b/Screens/Inventory/ItemArms/WoodenCuffs/HandsBack.png deleted file mode 100644 index 844f7c0d9..000000000 Binary files a/Screens/Inventory/ItemArms/WoodenCuffs/HandsBack.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/WoodenCuffs/HandsFront.png b/Screens/Inventory/ItemArms/WoodenCuffs/HandsFront.png deleted file mode 100644 index 759c55a0a..000000000 Binary files a/Screens/Inventory/ItemArms/WoodenCuffs/HandsFront.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/WoodenCuffs/HandsHead.png b/Screens/Inventory/ItemArms/WoodenCuffs/HandsHead.png deleted file mode 100644 index d29b97e7c..000000000 Binary files a/Screens/Inventory/ItemArms/WoodenCuffs/HandsHead.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/WoodenCuffs/Hogtied.png b/Screens/Inventory/ItemArms/WoodenCuffs/Hogtied.png deleted file mode 100644 index c835f0c44..000000000 Binary files a/Screens/Inventory/ItemArms/WoodenCuffs/Hogtied.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/WrappedBlanket/FeetWrapped.png b/Screens/Inventory/ItemArms/WrappedBlanket/FeetWrapped.png deleted file mode 100644 index da0b2197a..000000000 Binary files a/Screens/Inventory/ItemArms/WrappedBlanket/FeetWrapped.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/WrappedBlanket/FullWrapped.png b/Screens/Inventory/ItemArms/WrappedBlanket/FullWrapped.png deleted file mode 100644 index 54a33c31b..000000000 Binary files a/Screens/Inventory/ItemArms/WrappedBlanket/FullWrapped.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/WrappedBlanket/NormalWrapped.png b/Screens/Inventory/ItemArms/WrappedBlanket/NormalWrapped.png deleted file mode 100644 index 21a203826..000000000 Binary files a/Screens/Inventory/ItemArms/WrappedBlanket/NormalWrapped.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/WrappedBlanket/ShouldersWrapped.png b/Screens/Inventory/ItemArms/WrappedBlanket/ShouldersWrapped.png deleted file mode 100644 index 1895c8e88..000000000 Binary files a/Screens/Inventory/ItemArms/WrappedBlanket/ShouldersWrapped.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/WristShackles/Behind.png b/Screens/Inventory/ItemArms/WristShackles/Behind.png deleted file mode 100644 index 4e42e07e9..000000000 Binary files a/Screens/Inventory/ItemArms/WristShackles/Behind.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/WristShackles/InFront.png b/Screens/Inventory/ItemArms/WristShackles/InFront.png deleted file mode 100644 index 4e42e07e9..000000000 Binary files a/Screens/Inventory/ItemArms/WristShackles/InFront.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/WristShackles/Overhead.png b/Screens/Inventory/ItemArms/WristShackles/Overhead.png deleted file mode 100644 index 4e42e07e9..000000000 Binary files a/Screens/Inventory/ItemArms/WristShackles/Overhead.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Zipties/ZipAllFours.png b/Screens/Inventory/ItemArms/Zipties/ZipAllFours.png deleted file mode 100644 index 8504efadf..000000000 Binary files a/Screens/Inventory/ItemArms/Zipties/ZipAllFours.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Zipties/ZipElbowWrist.png b/Screens/Inventory/ItemArms/Zipties/ZipElbowWrist.png deleted file mode 100644 index 91c6f0f87..000000000 Binary files a/Screens/Inventory/ItemArms/Zipties/ZipElbowWrist.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Zipties/ZipFull.png b/Screens/Inventory/ItemArms/Zipties/ZipFull.png deleted file mode 100644 index 13bfaa867..000000000 Binary files a/Screens/Inventory/ItemArms/Zipties/ZipFull.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Zipties/ZipHogtie.png b/Screens/Inventory/ItemArms/Zipties/ZipHogtie.png deleted file mode 100644 index f18e1393c..000000000 Binary files a/Screens/Inventory/ItemArms/Zipties/ZipHogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Zipties/ZipKneelingHogtie.png b/Screens/Inventory/ItemArms/Zipties/ZipKneelingHogtie.png deleted file mode 100644 index 2e10e2fef..000000000 Binary files a/Screens/Inventory/ItemArms/Zipties/ZipKneelingHogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Zipties/ZipLight.png b/Screens/Inventory/ItemArms/Zipties/ZipLight.png deleted file mode 100644 index 2416730f7..000000000 Binary files a/Screens/Inventory/ItemArms/Zipties/ZipLight.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Zipties/ZipMedium.png b/Screens/Inventory/ItemArms/Zipties/ZipMedium.png deleted file mode 100644 index 452a97209..000000000 Binary files a/Screens/Inventory/ItemArms/Zipties/ZipMedium.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Zipties/ZipWrist.png b/Screens/Inventory/ItemArms/Zipties/ZipWrist.png deleted file mode 100644 index 45645b106..000000000 Binary files a/Screens/Inventory/ItemArms/Zipties/ZipWrist.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Zipties/ZipWristFull.png b/Screens/Inventory/ItemArms/Zipties/ZipWristFull.png deleted file mode 100644 index 0d6d41673..000000000 Binary files a/Screens/Inventory/ItemArms/Zipties/ZipWristFull.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Zipties/ZipWristLight.png b/Screens/Inventory/ItemArms/Zipties/ZipWristLight.png deleted file mode 100644 index 1c2b4da17..000000000 Binary files a/Screens/Inventory/ItemArms/Zipties/ZipWristLight.png and /dev/null differ diff --git a/Screens/Inventory/ItemArms/Zipties/ZipWristMedium.png b/Screens/Inventory/ItemArms/Zipties/ZipWristMedium.png deleted file mode 100644 index a1d2dde3e..000000000 Binary files a/Screens/Inventory/ItemArms/Zipties/ZipWristMedium.png and /dev/null differ diff --git a/Screens/Inventory/ItemBoots/FuturisticHeels/Heel.png b/Screens/Inventory/ItemBoots/FuturisticHeels/Heel.png deleted file mode 100644 index 5724acc37..000000000 Binary files a/Screens/Inventory/ItemBoots/FuturisticHeels/Heel.png and /dev/null differ diff --git a/Screens/Inventory/ItemBoots/FuturisticHeels/Shoes.png b/Screens/Inventory/ItemBoots/FuturisticHeels/Shoes.png deleted file mode 100644 index dad33f96e..000000000 Binary files a/Screens/Inventory/ItemBoots/FuturisticHeels/Shoes.png and /dev/null differ diff --git a/Screens/Inventory/ItemBoots/FuturisticHeels2/Matte.png b/Screens/Inventory/ItemBoots/FuturisticHeels2/Matte.png deleted file mode 100644 index c32189908..000000000 Binary files a/Screens/Inventory/ItemBoots/FuturisticHeels2/Matte.png and /dev/null differ diff --git a/Screens/Inventory/ItemBoots/FuturisticHeels2/Shiny.png b/Screens/Inventory/ItemBoots/FuturisticHeels2/Shiny.png deleted file mode 100644 index 866cc67b4..000000000 Binary files a/Screens/Inventory/ItemBoots/FuturisticHeels2/Shiny.png and /dev/null differ diff --git a/Screens/Inventory/ItemBoots/MonoHeel/Full.png b/Screens/Inventory/ItemBoots/MonoHeel/Full.png deleted file mode 100644 index 315bfeefc..000000000 Binary files a/Screens/Inventory/ItemBoots/MonoHeel/Full.png and /dev/null differ diff --git a/Screens/Inventory/ItemBoots/MonoHeel/Half.png b/Screens/Inventory/ItemBoots/MonoHeel/Half.png deleted file mode 100644 index 0c4c9aee3..000000000 Binary files a/Screens/Inventory/ItemBoots/MonoHeel/Half.png and /dev/null differ diff --git a/Screens/Inventory/ItemBoots/ToeTape/Full.png b/Screens/Inventory/ItemBoots/ToeTape/Full.png deleted file mode 100644 index ee54dc96a..000000000 Binary files a/Screens/Inventory/ItemBoots/ToeTape/Full.png and /dev/null differ diff --git a/Screens/Inventory/ItemBoots/ToeTape/Toes.png b/Screens/Inventory/ItemBoots/ToeTape/Toes.png deleted file mode 100644 index 7e6c87e4f..000000000 Binary files a/Screens/Inventory/ItemBoots/ToeTape/Toes.png and /dev/null differ diff --git a/Screens/Inventory/ItemBreast/FuturisticBra/FuturisticBra.js b/Screens/Inventory/ItemBreast/FuturisticBra/FuturisticBra.js deleted file mode 100644 index cf5fd104d..000000000 --- a/Screens/Inventory/ItemBreast/FuturisticBra/FuturisticBra.js +++ /dev/null @@ -1,206 +0,0 @@ -"use strict"; - -var small_yoffset = -5; -var normal_yoffset = 0; -var large_yoffset = 4; -var xlarge_yoffset = 7; - -/** @type ExtendedItemOption[] */ -var InventoryItemBreastFuturisticBraOptions = [ - { - Name: "Show", - Property: { - Type: null, - }, - }, - { - Name: "Solid", - Property: { - Type: "Solid", - }, - }, - { - Name: "Show2", - Property: { - Type: "Show2", - }, - }, - { - Name: "Solid2", - Property: { - Type: "Solid2", - }, - }, -]; - - -// Loads the item extension properties -function InventoryItemBreastFuturisticBraLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { HeartRate: 0, HeartIcon: false }; - if (DialogFocusItem.Property.HeartRate == null) DialogFocusItem.Property.HeartRate = 0; - if (DialogFocusItem.Property.HeartIcon == null) DialogFocusItem.Property.HeartIcon = false; -} - -function InventoryItemBreastFuturisticBraUpdate(C) { - var current_bpm = 65; - var current_breathing = "Low"; - var current_temp = 37; - - if (C.MemberNumber) { - current_bpm += C.MemberNumber % 20; // 'Pseudo random baseline' - } - - if (C.ArousalSettings && C.ArousalSettings.Progress > 0) { - var Progress = C.ArousalSettings.Progress; - current_bpm += Math.floor(Progress*0.60); - current_temp += Math.floor(Progress*0.1)/10; - if ((C.ArousalSettings.OrgasmStage && C.ArousalSettings.OrgasmStage > 0) || (C.ArousalSettings.ProgressTimer && C.ArousalSettings.ProgressTimer > 1)) { - current_breathing = "Action"; - current_bpm += 10; - current_temp += 0.5; - } else if (C.ArousalSettings.Progress > 10) { - if (C.ArousalSettings.Progress > 90) { - current_breathing = "High"; - } else { - current_breathing = "Med"; - } - } - - } - return { bpm: current_bpm, breathing: current_breathing, temp: current_temp }; -} - -// Draw the item extension screen -function InventoryItemBreastFuturisticBraDraw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - - var C = CharacterGetCurrent(); - - var update = InventoryItemBreastFuturisticBraUpdate(C); - var current_bpm = update.bpm; - var current_breathing = update.breathing; - var current_temp = update.temp; - - DrawText(DialogFindPlayer("FuturisticBraPlayerDesc") + " " + C.MemberNumber, 1500, 600, "White", "Gray"); - DrawText(DialogFindPlayer("FuturisticBraPlayerHeartRate") + " " + current_bpm + " " + DialogFindPlayer("FuturisticBraPlayerHeartRateBPM"), 1500, 680, "White", "Gray"); - DrawText(DialogFindPlayer("FuturisticBraPlayerTemp") + " " + current_temp + DialogFindPlayer("FuturisticBraPlayerTempC"), 1500, 730, "White", "Gray"); - DrawText(DialogFindPlayer("FuturisticBraPlayerBreathing") + " " + DialogFindPlayer("FuturisticBraPlayerBreathing" + current_breathing), 1500, 780, "White", "Gray"); - DrawText(DialogFindPlayer("FuturisticBraPlayerTracking"), 1500, 830, "White", "Gray"); - - // If the player can modify - if (InventoryItemFuturisticValidate(C) == "") { - if (DialogFocusItem.Property.Type != null) { - DrawButton(1150, 900, 150, 64, DialogFindPlayer("FuturisticBraPlayerShow"), "White", ""); - } if (DialogFocusItem.Property.Type != "Solid") { - DrawButton(1337, 900, 150, 64, DialogFindPlayer("FuturisticBraPlayerSolid"), "White", ""); - } if (DialogFocusItem.Property.Type != "Show2") { - DrawButton(1525, 900, 150, 64, DialogFindPlayer("FuturisticBraPlayerShow2"), "White", ""); - } if (DialogFocusItem.Property.Type != "Solid2") { - DrawButton(1712, 900, 150, 64, DialogFindPlayer("FuturisticBraPlayerSolid2"), "White", ""); - } - } - -} - -// Catches the item extension clicks -function InventoryItemBreastFuturisticBraClick() { - if (MouseIn(1885, 25, 90, 90)) DialogFocusItem = null; - - if (MouseIn(1150, 900, 800, 64)) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - - // If the player can modify - if (InventoryItemFuturisticValidate(C) == "") { - if (DialogFocusItem.Property.Type != null && MouseIn(1150, 900, 150, 64)) { - DialogFocusItem.Property.Type = ""; - if (CurrentScreen == "ChatRoom") - InventoryItemBreastFuturisticBraPublishAction(C, InventoryItemBreastFuturisticBraOptions[0]); - } else if (DialogFocusItem.Property.Type != "Solid" && MouseIn(1337, 900, 150, 64)) { - DialogFocusItem.Property.Type = "Solid"; - if (CurrentScreen == "ChatRoom") - InventoryItemBreastFuturisticBraPublishAction(C, InventoryItemBreastFuturisticBraOptions[1]); - } else if (DialogFocusItem.Property.Type != "Show2" && MouseIn(1525, 900, 150, 64)) { - DialogFocusItem.Property.Type = "Show2"; - if (CurrentScreen == "ChatRoom") - InventoryItemBreastFuturisticBraPublishAction(C, InventoryItemBreastFuturisticBraOptions[2]); - } else if (DialogFocusItem.Property.Type != "Solid2" && MouseIn(1712, 900, 150, 64)) { - DialogFocusItem.Property.Type = "Solid2"; - if (CurrentScreen == "ChatRoom") - InventoryItemBreastFuturisticBraPublishAction(C, InventoryItemBreastFuturisticBraOptions[3]); - } - - CharacterRefresh(C, true); - ChatRoomCharacterUpdate(C); - } - } -} - -function InventoryItemBreastFuturisticBraPublishAction(C, Option) { - var msg = "InventoryItemBreastFuturisticBraSet" + Option.Name; - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - ChatRoomPublishCustomAction(msg, true, Dictionary); -} - - -/** @type {DynamicAfterDrawCallback} */ -function AssetsItemBreastFuturisticBraAfterDraw({ - C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, G, Color -}) { - if (L === "_Text" && Property && (Property.Type != "Solid" && Property.Type != "Solid2")) { - - var offset = normal_yoffset; - if (G == "_Large") offset = large_yoffset; - if (G == "_XLarge") offset = xlarge_yoffset; - if (G == "_Small") offset = small_yoffset; - - // We set up a canvas - const Height = 50; - const Width = 55; - const TempCanvas = AnimationGenerateTempCanvas(C, A, Width, Height); - - // We draw the desired info on that canvas - let context = TempCanvas.getContext('2d'); - context.font = "bold 14px sansserif"; - context.fillStyle = "Black"; - context.textAlign = "center"; - const rate = (Property && Property.HeartRate) ? Property.HeartRate.toString() : "--"; - context.fillText(rate, Width / 2 + 1, Width / 2 - 1, Width); - context.fillText(rate, Width / 2 - 1, Width / 2 + 1, Width); - context.fillText(rate, Width / 2 + 1, Width / 2 + 1, Width); - context.fillText(rate, Width / 2 - 1, Width / 2 - 1, Width); - - context.font = "bold 14px sansserif"; - context.fillStyle = Color; - context.textAlign = "center"; - context.fillText(rate, Width / 2, Width / 2, Width); - - // We print the canvas to the character based on the asset position - drawCanvas(TempCanvas, X + 47, Y + 103.5 + offset, AlphaMasks); - drawCanvasBlink(TempCanvas, X + 47, Y + 103.5 + offset, AlphaMasks); - } -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemBreastFuturisticBraScriptDraw(data) { - var persistentData = data.PersistentData(); - /** @type {ItemProperties} */ - var property = (data.Item.Property = data.Item.Property || {}); - if (typeof persistentData.UpdateTime !== "number") persistentData.UpdateTime = CommonTime() + 4000; - - if (persistentData.UpdateTime < CommonTime()) { - var update = InventoryItemBreastFuturisticBraUpdate(data.C); - property.HeartRate = update.bpm; - if (property.Type != "Solid" && property.Type != "Solid2") - if (property.Type == "Show2Heart" || property.Type == "Show2") - property.Type = (update.breathing == "Action" || update.breathing == "High") ? "Show2Heart" : "Show2"; - else property.Type = (update.breathing == "Action" || update.breathing == "High") ? "Heart" : null; - - var timeToNextRefresh = 1100; - persistentData.UpdateTime = CommonTime() + timeToNextRefresh; - AnimationRequestRefreshRate(data.C, 5000 - timeToNextRefresh); - AnimationRequestDraw(data.C); - } -} diff --git a/Screens/Inventory/ItemBreast/FuturisticBra2/d0.png b/Screens/Inventory/ItemBreast/FuturisticBra2/d0.png deleted file mode 100644 index a56657ff1..000000000 Binary files a/Screens/Inventory/ItemBreast/FuturisticBra2/d0.png and /dev/null differ diff --git a/Screens/Inventory/ItemBreast/FuturisticBra2/d1.png b/Screens/Inventory/ItemBreast/FuturisticBra2/d1.png deleted file mode 100644 index 464b2e935..000000000 Binary files a/Screens/Inventory/ItemBreast/FuturisticBra2/d1.png and /dev/null differ diff --git a/Screens/Inventory/ItemBreast/FuturisticBra2/s0.png b/Screens/Inventory/ItemBreast/FuturisticBra2/s0.png deleted file mode 100644 index a56657ff1..000000000 Binary files a/Screens/Inventory/ItemBreast/FuturisticBra2/s0.png and /dev/null differ diff --git a/Screens/Inventory/ItemBreast/FuturisticBra2/s1.png b/Screens/Inventory/ItemBreast/FuturisticBra2/s1.png deleted file mode 100644 index 34c0fb825..000000000 Binary files a/Screens/Inventory/ItemBreast/FuturisticBra2/s1.png and /dev/null differ diff --git a/Screens/Inventory/ItemBreast/Ribbons/LightWrap.png b/Screens/Inventory/ItemBreast/Ribbons/LightWrap.png deleted file mode 100644 index e79ff1164..000000000 Binary files a/Screens/Inventory/ItemBreast/Ribbons/LightWrap.png and /dev/null differ diff --git a/Screens/Inventory/ItemBreast/Ribbons/LightWrapBow.png b/Screens/Inventory/ItemBreast/Ribbons/LightWrapBow.png deleted file mode 100644 index 5930cf0c9..000000000 Binary files a/Screens/Inventory/ItemBreast/Ribbons/LightWrapBow.png and /dev/null differ diff --git a/Screens/Inventory/ItemBreast/Ribbons/Wrap.png b/Screens/Inventory/ItemBreast/Ribbons/Wrap.png deleted file mode 100644 index 7b03623c1..000000000 Binary files a/Screens/Inventory/ItemBreast/Ribbons/Wrap.png and /dev/null differ diff --git a/Screens/Inventory/ItemButt/AnalBeads2/AnalBeads2.js b/Screens/Inventory/ItemButt/AnalBeads2/AnalBeads2.js deleted file mode 100644 index 058250610..000000000 --- a/Screens/Inventory/ItemButt/AnalBeads2/AnalBeads2.js +++ /dev/null @@ -1,88 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemButtAnalBeads2Load() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { InsertedBeads: 1, ShowText: true, Type: "Base" }; - if (DialogFocusItem.Property.InsertedBeads == null) { - DialogFocusItem.Property.Type = DialogFocusItem.Property.Type || "Base"; - DialogFocusItem.Property.InsertedBeads = DialogFocusItem.Property.Type == "Base" ? 1 : DialogFocusItem.Property.Type.split('')[1]; - } - var beadsNum = DialogFocusItem.Property.InsertedBeads; - if (DialogFocusItem.Property.Type == null) - DialogFocusItem.Property.Type = beadsNum > 1 ? "_" + beadsNum + "in" : "Base"; -} - -// Draw the item extension screen -function InventoryItemButtAnalBeads2Draw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer("BeadsCount") + DialogFocusItem.Property.InsertedBeads.toString(), 1500, 600, "White", "Gray"); - if (DialogFocusItem.Property.InsertedBeads > 1) DrawButton(1200, 700, 250, 65, DialogFindPlayer("RemoveBead"), "White"); - if (DialogFocusItem.Property.InsertedBeads < 5) DrawButton(1550, 700, 250, 65, DialogFindPlayer("InsertBead"), "White"); - if (DialogFocusItem.Property.InsertedBeads < 5) DrawButton(1550, 800, 250, 65, DialogFindPlayer("MaximumBeads"), "White"); - if (DialogFocusItem.Property.InsertedBeads > 1) DrawButton(1200, 800, 250, 65, DialogFindPlayer("MinimumBeads"), "White"); -} - -// Catches the item extension clicks -function InventoryItemButtAnalBeads2Click() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; - if ((MouseX >= 1200) && (MouseX <= 1450) && (MouseY >= 700) && (MouseY <= 765) && (DialogFocusItem.Property.InsertedBeads > 1)) InventoryItemButtAnalBeads2SetBeads(-1); - if ((MouseX >= 1550) && (MouseX <= 1800) && (MouseY >= 800) && (MouseY <= 865) && (DialogFocusItem.Property.InsertedBeads < 5)) InventoryItemButtAnalBeads2SetBeads(5); - if ((MouseX >= 1200) && (MouseX <= 1450) && (MouseY >= 800) && (MouseY <= 865) && (DialogFocusItem.Property.InsertedBeads > 1)) InventoryItemButtAnalBeads2SetBeads(-5); - if ((MouseX >= 1550) && (MouseX <= 1800) && (MouseY >= 700) && (MouseY <= 765) && (DialogFocusItem.Property.InsertedBeads < 5)) InventoryItemButtAnalBeads2SetBeads(1); -} - -// Sets the amount of beads -function InventoryItemButtAnalBeads2SetBeads(Modifier) { - // Gets the current item and character - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemButtAnalBeads2Load(); - } - // save the old number of beads - var beadsOld = DialogFocusItem.Property.InsertedBeads; - // Set the new amount of beads - DialogFocusItem.Property.InsertedBeads = DialogFocusItem.Property.InsertedBeads + Modifier; - if (DialogFocusItem.Property.InsertedBeads > 5) - DialogFocusItem.Property.InsertedBeads = 5; - if (DialogFocusItem.Property.InsertedBeads < 1) - DialogFocusItem.Property.InsertedBeads = 1; - - var beadsNum = DialogFocusItem.Property.InsertedBeads; - - // Loads the correct type/asset - DialogFocusItem.Property.Type = beadsNum > 1 ? "_" + beadsNum + "in" : ["Base"]; - CharacterRefresh(C); - - // Push Chatroom Event - var Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "ActivityName", Text: "MasturbateItem" }); - Dictionary.push({ Tag: "ActivityGroup", Text: "ItemButt" }); - Dictionary.push({ AssetName: "AnalBeads2" }); - Dictionary.push({ AssetGroupName: "ItemButt" }); - Dictionary.push({ ActivityCounter: Math.max(beadsOld - beadsNum, 0) }); - - if (Modifier == 5) { - ChatRoomPublishCustomAction("AnalBeads2SetMax", true, Dictionary); - } else if (Modifier == -5) { - ChatRoomPublishCustomAction("AnalBeads2SetMin", true, Dictionary); - } else { - ChatRoomPublishCustomAction("AnalBeads2Set" + (Modifier > 0 ? "UpTo" + beadsNum : "Down"), true, Dictionary); - } - - if (C.ID == Player.ID) { - // The Player pulls beads from her own butt - var A = AssetGet(C.AssetFamily, "ItemButt", "AnalBeads2"); - for (let i = beadsOld - beadsNum; i > 0; i--) { - ActivityArousalItem(C, C, A); - } - } - - // Rebuilds the inventory menu - if (DialogInventory != null) { - DialogFocusItem = null; - DialogMenuButtonBuild(C); - } -} diff --git a/Screens/Inventory/ItemButt/AnalHook/Base.png b/Screens/Inventory/ItemButt/AnalHook/Base.png deleted file mode 100644 index 857e8657b..000000000 Binary files a/Screens/Inventory/ItemButt/AnalHook/Base.png and /dev/null differ diff --git a/Screens/Inventory/ItemButt/AnalHook/Chain.png b/Screens/Inventory/ItemButt/AnalHook/Chain.png deleted file mode 100644 index 58bdb55ac..000000000 Binary files a/Screens/Inventory/ItemButt/AnalHook/Chain.png and /dev/null differ diff --git a/Screens/Inventory/ItemButt/AnalHook/Hair.png b/Screens/Inventory/ItemButt/AnalHook/Hair.png deleted file mode 100644 index 830cc72e2..000000000 Binary files a/Screens/Inventory/ItemButt/AnalHook/Hair.png and /dev/null differ diff --git a/Screens/Inventory/ItemButt/BunnyTailVibePlug/BunnyTailVibePlug.js b/Screens/Inventory/ItemButt/BunnyTailVibePlug/BunnyTailVibePlug.js deleted file mode 100644 index fddba9f64..000000000 --- a/Screens/Inventory/ItemButt/BunnyTailVibePlug/BunnyTailVibePlug.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -function InventoryItemButtBunnyTailVibePlugLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemButtBunnyTailVibePlugDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemButtBunnyTailVibePlugClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemButtBunnyTailVibePlugScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemButt/ButtPlugLock/Base.png b/Screens/Inventory/ItemButt/ButtPlugLock/Base.png deleted file mode 100644 index bca8ad095..000000000 Binary files a/Screens/Inventory/ItemButt/ButtPlugLock/Base.png and /dev/null differ diff --git a/Screens/Inventory/ItemButt/ButtPlugLock/ChainLong.png b/Screens/Inventory/ItemButt/ButtPlugLock/ChainLong.png deleted file mode 100644 index 72041296a..000000000 Binary files a/Screens/Inventory/ItemButt/ButtPlugLock/ChainLong.png and /dev/null differ diff --git a/Screens/Inventory/ItemButt/ButtPlugLock/ChainShort.png b/Screens/Inventory/ItemButt/ButtPlugLock/ChainShort.png deleted file mode 100644 index c07ab08de..000000000 Binary files a/Screens/Inventory/ItemButt/ButtPlugLock/ChainShort.png and /dev/null differ diff --git a/Screens/Inventory/ItemButt/EggVibePlugXXL/EggVibePlugXXL.js b/Screens/Inventory/ItemButt/EggVibePlugXXL/EggVibePlugXXL.js deleted file mode 100644 index d3f508f55..000000000 --- a/Screens/Inventory/ItemButt/EggVibePlugXXL/EggVibePlugXXL.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -function InventoryItemButtEggVibePlugXXLLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemButtEggVibePlugXXLDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemButtEggVibePlugXXLClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemButtEggVibePlugXXLScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemButt/InflVibeButtPlug/InflVibeButtPlug.js b/Screens/Inventory/ItemButt/InflVibeButtPlug/InflVibeButtPlug.js deleted file mode 100644 index 9fb1cdf30..000000000 --- a/Screens/Inventory/ItemButt/InflVibeButtPlug/InflVibeButtPlug.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemButtInflVibeButtPlugLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { InflateLevel: 0 }; - if (DialogFocusItem.Property.InflateLevel == null) DialogFocusItem.Property.InflateLevel = 0; - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Intensity: -1 }; - if (DialogFocusItem.Property.Intensity == null) DialogFocusItem.Property.Intensity = -1; -} - -// Draw the item extension screen -function InventoryItemButtInflVibeButtPlugDraw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset, {Vibrating: DialogFocusItem.Property.Intensity >= 0}); - const {InflateLevel, Intensity} = DialogFocusItem.Property; - - DrawText(DialogFindPlayer("InflateLevel" + DialogFocusItem.Property.InflateLevel.toString()), 1500, 750, "White", "Gray"); - if (InflateLevel !== 0) DrawButton(1200, 775, 200, 55, DialogFindPlayer("Empty"), "White"); - if (InflateLevel !== 1) DrawButton(1550, 775, 200, 55, DialogFindPlayer("Light"), "White"); - if (InflateLevel !== 2) DrawButton(1200, 835, 200, 55, DialogFindPlayer("Inflated"), "White"); - if (InflateLevel !== 3) DrawButton(1550, 835, 200, 55, DialogFindPlayer("Bloated"), "White"); - if (InflateLevel !== 4) DrawButton(1375, 895, 200, 55, DialogFindPlayer("Maximum"), "White"); - DrawText(DialogFindPlayer("Intensity" + DialogFocusItem.Property.Intensity.toString()), 1500, 525, "White", "Gray"); - if (Intensity !== -1) DrawButton(1200, 550, 200, 55, DialogFindPlayer("TurnOff"), "White"); - if (Intensity !== 0) DrawButton(1550, 550, 200, 55, DialogFindPlayer("Low"), "White"); - if (Intensity !== 1) DrawButton(1200, 610, 200, 55, DialogFindPlayer("Medium"), "White"); - if (Intensity !== 2) DrawButton(1550, 610, 200, 55, DialogFindPlayer("High"), "White"); - if (Intensity !== 3) DrawButton(1375, 670, 200, 55, DialogFindPlayer("Maximum"), "White"); -} - -// Catches the item extension clicks -function InventoryItemButtInflVibeButtPlugClick(actionPrefix) { - actionPrefix = actionPrefix || "InflVibeButtPlug"; - if (MouseIn(1885, 25, 90, 90)) DialogFocusItem = null; - else if (MouseIn(1200, 775, 200, 55) && (DialogFocusItem.Property.InflateLevel !== 0)) InventoryItemButtInflVibeButtPlugInflation(0 - DialogFocusItem.Property.InflateLevel, actionPrefix); - else if (MouseIn(1550, 775, 200, 55) && (DialogFocusItem.Property.InflateLevel !== 1)) InventoryItemButtInflVibeButtPlugInflation(1 - DialogFocusItem.Property.InflateLevel, actionPrefix); - else if (MouseIn(1200, 835, 200, 55) && (DialogFocusItem.Property.InflateLevel !== 2)) InventoryItemButtInflVibeButtPlugInflation(2 - DialogFocusItem.Property.InflateLevel, actionPrefix); - else if (MouseIn(1550, 835, 200, 55) && (DialogFocusItem.Property.InflateLevel !== 3)) InventoryItemButtInflVibeButtPlugInflation(3 - DialogFocusItem.Property.InflateLevel, actionPrefix); - else if (MouseIn(1375, 895, 200, 55) && (DialogFocusItem.Property.InflateLevel !== 4)) InventoryItemButtInflVibeButtPlugInflation(4 - DialogFocusItem.Property.InflateLevel, actionPrefix); - else if (MouseIn(1200, 550, 200, 55) && (DialogFocusItem.Property.Intensity !== -1)) InventoryItemButtInflVibeButtPlugSetIntensity(-1 - DialogFocusItem.Property.Intensity, actionPrefix); - else if (MouseIn(1550, 550, 200, 55) && (DialogFocusItem.Property.Intensity !== 0)) InventoryItemButtInflVibeButtPlugSetIntensity(0 - DialogFocusItem.Property.Intensity, actionPrefix); - else if (MouseIn(1200, 610, 200, 55) && (DialogFocusItem.Property.Intensity !== 1)) InventoryItemButtInflVibeButtPlugSetIntensity(1 - DialogFocusItem.Property.Intensity, actionPrefix); - else if (MouseIn(1550, 610, 200, 55) && (DialogFocusItem.Property.Intensity !== 2)) InventoryItemButtInflVibeButtPlugSetIntensity(2 - DialogFocusItem.Property.Intensity, actionPrefix); - else if (MouseIn(1375, 670, 200, 55) && (DialogFocusItem.Property.Intensity !== 3)) InventoryItemButtInflVibeButtPlugSetIntensity(3 - DialogFocusItem.Property.Intensity, actionPrefix); -} - -// Sets the inflatable vibe butt plug pump Level -function InventoryItemButtInflVibeButtPlugInflation(Modifier, actionPrefix) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - DialogFocusItem.Property.InflateLevel = DialogFocusItem.Property.InflateLevel + Modifier; - if (C.ID == 0) ServerPlayerAppearanceSync(); - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - ChatRoomPublishCustomAction(actionPrefix + "_Pump" + ((Modifier > 0) ? "pumps" : "deflates") + "To" + DialogFocusItem.Property.InflateLevel, true, Dictionary); - -} - -// Sets the inflatable vibe butt plug vibration Level -function InventoryItemButtInflVibeButtPlugSetIntensity(Modifier, actionPrefix) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - DialogFocusItem.Property.Intensity = DialogFocusItem.Property.Intensity + Modifier; - if (DialogFocusItem.Property.Intensity == -1) DialogFocusItem.Property.Effect = ["Egged"]; - if (DialogFocusItem.Property.Intensity >= 0) DialogFocusItem.Property.Effect = ["Egged", "Vibrating"]; - CharacterLoadEffect(C); - if (C.ID == 0) ServerPlayerAppearanceSync(); - ChatRoomPublishCustomAction( actionPrefix + "_Vibe" + ((Modifier > 0) ? "Increase" : "Decrease") + "To" + DialogFocusItem.Property.Intensity, true, [{Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}]); -} diff --git a/Screens/Inventory/ItemButt/LockingVibePlug/LockingVibePlug.js b/Screens/Inventory/ItemButt/LockingVibePlug/LockingVibePlug.js deleted file mode 100644 index 9eb14bf6d..000000000 --- a/Screens/Inventory/ItemButt/LockingVibePlug/LockingVibePlug.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -function InventoryItemButtLockingVibePlugLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemButtLockingVibePlugDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemButtLockingVibePlugClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemButtLockingVibePlugScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemButt/ShockPlug/ShockPlug.js b/Screens/Inventory/ItemButt/ShockPlug/ShockPlug.js deleted file mode 100644 index 68159033f..000000000 --- a/Screens/Inventory/ItemButt/ShockPlug/ShockPlug.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemButtShockPlugLoad() { - InventoryItemNeckAccessoriesCollarShockUnitLoad(); -} - -// Draw the item extension screen -function InventoryItemButtShockPlugDraw() { - InventoryItemNeckAccessoriesCollarShockUnitDraw(); -} - -// Catches the item extension clicks -function InventoryItemButtShockPlugClick() { - InventoryItemNeckAccessoriesCollarShockUnitClick(); -} \ No newline at end of file diff --git a/Screens/Inventory/ItemButt/VibratingButtplug/VibratingButtplug.js b/Screens/Inventory/ItemButt/VibratingButtplug/VibratingButtplug.js deleted file mode 100644 index f9fcb3db8..000000000 --- a/Screens/Inventory/ItemButt/VibratingButtplug/VibratingButtplug.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -function InventoryItemButtVibratingButtplugLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemButtVibratingButtplugDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemButtVibratingButtplugClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemButtVibratingButtplugScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemButt/VibratingDildoPlug/VibratingDildoPlug.js b/Screens/Inventory/ItemButt/VibratingDildoPlug/VibratingDildoPlug.js deleted file mode 100644 index e74de08b9..000000000 --- a/Screens/Inventory/ItemButt/VibratingDildoPlug/VibratingDildoPlug.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -function InventoryItemButtVibratingDildoPlugLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemButtVibratingDildoPlugDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemButtVibratingDildoPlugClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemButtVibratingDildoPlugScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemDevices/BondageBench/Full.png b/Screens/Inventory/ItemDevices/BondageBench/Full.png deleted file mode 100644 index b54fad12a..000000000 Binary files a/Screens/Inventory/ItemDevices/BondageBench/Full.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/BondageBench/Heavy.png b/Screens/Inventory/ItemDevices/BondageBench/Heavy.png deleted file mode 100644 index 3cbd338b1..000000000 Binary files a/Screens/Inventory/ItemDevices/BondageBench/Heavy.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/BondageBench/Light.png b/Screens/Inventory/ItemDevices/BondageBench/Light.png deleted file mode 100644 index 79dc7a9b3..000000000 Binary files a/Screens/Inventory/ItemDevices/BondageBench/Light.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/BondageBench/None.png b/Screens/Inventory/ItemDevices/BondageBench/None.png deleted file mode 100644 index deb3723c2..000000000 Binary files a/Screens/Inventory/ItemDevices/BondageBench/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/BondageBench/Normal.png b/Screens/Inventory/ItemDevices/BondageBench/Normal.png deleted file mode 100644 index 21424e488..000000000 Binary files a/Screens/Inventory/ItemDevices/BondageBench/Normal.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Coffin/Closed.png b/Screens/Inventory/ItemDevices/Coffin/Closed.png deleted file mode 100644 index 0449d5114..000000000 Binary files a/Screens/Inventory/ItemDevices/Coffin/Closed.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Coffin/Open.png b/Screens/Inventory/ItemDevices/Coffin/Open.png deleted file mode 100644 index 836ccbfae..000000000 Binary files a/Screens/Inventory/ItemDevices/Coffin/Open.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Crib/Gate.png b/Screens/Inventory/ItemDevices/Crib/Gate.png deleted file mode 100644 index 08f6d0ff2..000000000 Binary files a/Screens/Inventory/ItemDevices/Crib/Gate.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Crib/Plushies.png b/Screens/Inventory/ItemDevices/Crib/Plushies.png deleted file mode 100644 index 9b42e84b6..000000000 Binary files a/Screens/Inventory/ItemDevices/Crib/Plushies.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Crib/g0.png b/Screens/Inventory/ItemDevices/Crib/g0.png deleted file mode 100644 index a2ea3bf67..000000000 Binary files a/Screens/Inventory/ItemDevices/Crib/g0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Crib/g1.png b/Screens/Inventory/ItemDevices/Crib/g1.png deleted file mode 100644 index 08f6d0ff2..000000000 Binary files a/Screens/Inventory/ItemDevices/Crib/g1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Crib/p0.png b/Screens/Inventory/ItemDevices/Crib/p0.png deleted file mode 100644 index 38790540d..000000000 Binary files a/Screens/Inventory/ItemDevices/Crib/p0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Crib/p1.png b/Screens/Inventory/ItemDevices/Crib/p1.png deleted file mode 100644 index 9b42e84b6..000000000 Binary files a/Screens/Inventory/ItemDevices/Crib/p1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/CryoCapsule/Closed.png b/Screens/Inventory/ItemDevices/CryoCapsule/Closed.png deleted file mode 100644 index 9030da399..000000000 Binary files a/Screens/Inventory/ItemDevices/CryoCapsule/Closed.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/CryoCapsule/Open.png b/Screens/Inventory/ItemDevices/CryoCapsule/Open.png deleted file mode 100644 index f27ab2a73..000000000 Binary files a/Screens/Inventory/ItemDevices/CryoCapsule/Open.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Cushion/Hold.png b/Screens/Inventory/ItemDevices/Cushion/Hold.png deleted file mode 100644 index 412e80f50..000000000 Binary files a/Screens/Inventory/ItemDevices/Cushion/Hold.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Cushion/Kneel.png b/Screens/Inventory/ItemDevices/Cushion/Kneel.png deleted file mode 100644 index 9e877d3df..000000000 Binary files a/Screens/Inventory/ItemDevices/Cushion/Kneel.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/DollBox/DollBox.js b/Screens/Inventory/ItemDevices/DollBox/DollBox.js deleted file mode 100644 index 4fd4a8a56..000000000 --- a/Screens/Inventory/ItemDevices/DollBox/DollBox.js +++ /dev/null @@ -1,110 +0,0 @@ -"use strict"; - -const InventoryItemDevicesDollBoxFont = "'Satisfy', cursive"; - -// Loads the item extension properties -function InventoryItemDevicesDollBoxLoad() { - DynamicDrawLoadFont(InventoryItemDevicesDollBoxFont); - - var C = CharacterGetCurrent(); - var MustRefresh = false; - - if (DialogFocusItem.Property == null) DialogFocusItem.Property = {}; - if (typeof DialogFocusItem.Property.Text !== "string") { - DialogFocusItem.Property.Text = ""; - MustRefresh = true; - } - if (typeof DialogFocusItem.Property.Text2 !== "string") { - DialogFocusItem.Property.Text2 = ""; - MustRefresh = true; - } - if (MustRefresh) { - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, DialogFocusItem.Asset.Group.Name); - } - - const input1 = ElementCreateInput("DollBoxText1", "text", DialogFocusItem.Property.Text, "22"); - const input2 = ElementCreateInput("DollBoxText2", "text", DialogFocusItem.Property.Text2, "22"); - if (input1) input1.pattern = DynamicDrawTextInputPattern; - if (input2) input2.pattern = DynamicDrawTextInputPattern; -} - -// Draw the extension screen -function InventoryItemDevicesDollBoxDraw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - ElementPosition("DollBoxText1", 1505, 600, 350); - ElementPosition("DollBoxText2", 1505, 680, 350); - DrawButton( - 1330, 731, 340, 64, DialogFindPlayer("SaveText"), - (ElementValue("DollBoxText1") + ElementValue("DollBoxText2")).match(DynamicDrawTextRegex) ? "White" : "#888", "", - ); -} - -// Catches the item extension clicks -function InventoryItemDevicesDollBoxClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemDevicesDollBoxExit(); - } - - if (MouseIn(1330, 731, 340, 64) && (ElementValue("DollBoxText1") + ElementValue("DollBoxText2")).match(DynamicDrawTextRegex)) { - DialogFocusItem.Property.Text = ElementValue("DollBoxText1"); - DialogFocusItem.Property.Text2 = ElementValue("DollBoxText2"); - InventoryItemDevicesDollBoxChange(); - } -} - -// Leaves the extended screen -function InventoryItemDevicesDollBoxExit() { - ElementRemove("DollBoxText1"); - ElementRemove("DollBoxText2"); - PreferenceMessage = ""; - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild(CharacterGetCurrent()); -} - -// When the text is changed -function InventoryItemDevicesDollBoxChange() { - var C = CharacterGetCurrent(); - CharacterRefresh(C); - if (CurrentScreen == "ChatRoom") { - var Dictionary = []; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - ChatRoomPublishCustomAction("DollBoxChange", true, Dictionary); - InventoryItemDevicesDollBoxExit(); - } -} - -/** @type {DynamicAfterDrawCallback} */ -function AssetsItemDevicesDollBoxAfterDraw({C, A, X, Y, L, Property, drawCanvas, drawCanvasBlink, AlphaMasks, Color}) { - if (L === "_Text") { - // We set up a canvas - const height = 200; - const width = 400; - const tempCanvas = AnimationGenerateTempCanvas(C, A, width, height); - const ctx = tempCanvas.getContext("2d"); - - // One line of text will be centered - const text1 = (Property && typeof Property.Text === "string" && DynamicDrawTextRegex.test(Property.Text) ? Property.Text : "♠"); - const text2 = (Property && typeof Property.Text2 === "string" && DynamicDrawTextRegex.test(Property.Text2) ? Property.Text2 : "♠"); - const isAlone = !text1 || !text2; - - const drawOptions = { - fontSize: 40, - fontFamily: InventoryItemDevicesDollBoxFont, - color: Color, - effect: DynamicDrawTextEffect.BURN, - width, - }; - - DynamicDrawText(text1, ctx, width / 2, height / (isAlone ? 2.4 : 3.5), drawOptions); - DynamicDrawText(text2, ctx, width / 2, height / (isAlone ? 2.4 : 1.85), drawOptions); - - // We print the canvas on the character based on the asset position - drawCanvas(tempCanvas, X + 55, Y + 847, AlphaMasks); - drawCanvasBlink(tempCanvas, X + 55, Y + 847, AlphaMasks); - } -} diff --git a/Screens/Inventory/ItemDevices/Familiar/Bat.png b/Screens/Inventory/ItemDevices/Familiar/Bat.png deleted file mode 100644 index 99ebf66e7..000000000 Binary files a/Screens/Inventory/ItemDevices/Familiar/Bat.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Familiar/Cat.png b/Screens/Inventory/ItemDevices/Familiar/Cat.png deleted file mode 100644 index b53817b6b..000000000 Binary files a/Screens/Inventory/ItemDevices/Familiar/Cat.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Familiar/Parrot.png b/Screens/Inventory/ItemDevices/Familiar/Parrot.png deleted file mode 100644 index 94dd6829f..000000000 Binary files a/Screens/Inventory/ItemDevices/Familiar/Parrot.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Familiar/Skeleton.png b/Screens/Inventory/ItemDevices/Familiar/Skeleton.png deleted file mode 100644 index 3b2a99b64..000000000 Binary files a/Screens/Inventory/ItemDevices/Familiar/Skeleton.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuckMachine/FuckMachine.js b/Screens/Inventory/ItemDevices/FuckMachine/FuckMachine.js deleted file mode 100644 index 49e216cde..000000000 --- a/Screens/Inventory/ItemDevices/FuckMachine/FuckMachine.js +++ /dev/null @@ -1,63 +0,0 @@ -"use strict"; - -function InventoryItemDevicesFuckMachineLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemDevicesFuckMachineDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemDevicesFuckMachineClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemDevicesFuckMachineBeforeDraw({ PersistentData, L, Y, Property }) { - const Data = PersistentData(); - if (typeof Data.DildoState !== "number") Data.DildoState = 0; - if (typeof Data.Modifier !== "number") Data.Modifier = 1; - - if (L === "_Dildo") return { Y: Y + Data.DildoState }; - if (L !== "_Pole") return; - - const Properties = Property || {}; - const Intensity = typeof Properties.Intensity === "number" ? Properties.Intensity : -1; - - - const FuckLength = 32; - const AnimationQualityRatio = (Player.GraphicsSettings ? Math.max(Player.GraphicsSettings.AnimationQuality * 0.6, 30) : 30) / 30; - Data.Speed = (Intensity + 1) * 2; - if (Data.DildoState >= FuckLength && Intensity > -1) { - Data.Modifier = -1; - } else if (Data.DildoState <= -FuckLength) { - Data.Modifier = 1; - } else if (Data.DildoState <= FuckLength && Intensity === -1) { - Data.Modifier = 1; - Data.Speed = 1; - } - - Data.DildoState += Data.Modifier * Data.Speed * AnimationQualityRatio; - if (AnimationQualityRatio > FuckLength) Data.DildoState = Math.random() * FuckLength; - - return { Y: Y + Data.DildoState }; -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemDevicesFuckMachineScriptDraw(data) { - VibratorModeScriptDraw(data); - const Data = data.PersistentData(); - const Properties = data.Item.Property || {}; - const FrameTime = Player.GraphicsSettings ? Math.max(30, (Player.GraphicsSettings.AnimationQuality * 0.6)) : 30; - const Intensity = typeof Properties.Intensity === "number" ? Properties.Intensity : -1; - const FuckLength = 32; - - if (typeof Data.FuckChangeTime !== "number") Data.FuckChangeTime = CommonTime() + FrameTime; - if (typeof Data.DildoState !== "number") Data.DildoState = 0; - - if (Data.FuckChangeTime < CommonTime() && !(Intensity === -1 && FuckLength <= Data.DildoState)) { - Data.FuckChangeTime = CommonTime() + FrameTime; - AnimationRequestRefreshRate(data.C, FrameTime); - AnimationRequestDraw(data.C); - } -} diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/FuturisticCrate.js b/Screens/Inventory/ItemDevices/FuturisticCrate/FuturisticCrate.js deleted file mode 100644 index af2deac15..000000000 --- a/Screens/Inventory/ItemDevices/FuturisticCrate/FuturisticCrate.js +++ /dev/null @@ -1,82 +0,0 @@ -"use strict"; - -function InventoryItemDevicesFuturisticCrateDevice1Load() { - if (DialogFocusItem && DialogFocusItem.Property) { - if (DialogFocusItem.Property.Intensity == undefined) DialogFocusItem.Property.Intensity = -1; - } - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemDevicesFuturisticCrateDevice1Draw() { - if (DialogFocusItem && DialogFocusItem.Property) { - if (DialogFocusItem.Property.Intensity == undefined) DialogFocusItem.Property.Intensity = -1; - } - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemDevicesFuturisticCrateDevice1Click() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemDevicesFuturisticCrateDevice1Exit(); - } - - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -// Leaves the extended screen -function InventoryItemDevicesFuturisticCrateDevice1Exit() { - ExtendedItemSubscreen = null; -} - - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemDevicesFuturisticCrateBeforeDraw({ PersistentData, L, X, Y, Property }) { - const Data = PersistentData(); - if (typeof Data.DildoState !== "number") Data.DildoState = 0; - if (typeof Data.Modifier !== "number") Data.Modifier = 1; - - //if (L === "_DevicePleasureHolder") return { Y: Y + Data.DildoState }; - if (L !== "_DevicePleasureHolder") return; - - const Properties = Property || {}; - const Intensity = typeof Properties.Intensity === "number" ? Properties.Intensity : -1; - - - const FuckLength = 15; - const TimeModifier = 0.007; - const AnimationQualityRatio = (Player.GraphicsSettings ? Math.max(Player.GraphicsSettings.AnimationQuality * 0.6, 30) : 30) / 30; - Data.Speed = (Intensity + 1) * 2; - if (Data.DildoState >= 1 && Intensity > -1) { - Data.Modifier = -1; - } else if (Data.DildoState <= 0) { - Data.Modifier = 1; - } else if (Data.DildoState <= 1 && Intensity === -1) { - Data.Modifier = 1; - Data.Speed = 1; - } - - Data.DildoState += Data.Modifier * Data.Speed * AnimationQualityRatio * TimeModifier; - if (AnimationQualityRatio > FuckLength) Data.DildoState = Math.random(); - - return { Y: Y + FuckLength * (-Math.cos(Data.DildoState * 2 * Math.PI)) }; -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemDevicesFuturisticCrateScriptDraw(data) { - VibratorModeScriptDraw(data); - - const Data = data.PersistentData(); - const Properties = data.Item.Property || {}; - const FrameTime = Player.GraphicsSettings ? Math.max(30, (Player.GraphicsSettings.AnimationQuality * 0.6)) : 30; - const Intensity = typeof Properties.Intensity === "number" ? Properties.Intensity : -1; - const FuckLength = 32; - - if (typeof Data.FuckChangeTime !== "number") Data.FuckChangeTime = CommonTime() + FrameTime; - if (typeof Data.DildoState !== "number") Data.DildoState = 0; - - if (Data.FuckChangeTime < CommonTime() && !(Intensity === -1 && FuckLength <= Data.DildoState)) { - Data.FuckChangeTime = CommonTime() + FrameTime; - AnimationRequestRefreshRate(data.C, FrameTime); - AnimationRequestDraw(data.C); - } -} diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/a0.png b/Screens/Inventory/ItemDevices/FuturisticCrate/a0.png deleted file mode 100644 index fd9dd3303..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/a0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/a1.png b/Screens/Inventory/ItemDevices/FuturisticCrate/a1.png deleted file mode 100644 index 07eca13be..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/a1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/a2.png b/Screens/Inventory/ItemDevices/FuturisticCrate/a2.png deleted file mode 100644 index e4c329f94..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/a2.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/a3.png b/Screens/Inventory/ItemDevices/FuturisticCrate/a3.png deleted file mode 100644 index 99d131b6a..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/a3.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/d0.png b/Screens/Inventory/ItemDevices/FuturisticCrate/d0.png deleted file mode 100644 index fd9dd3303..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/d0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/d1.png b/Screens/Inventory/ItemDevices/FuturisticCrate/d1.png deleted file mode 100644 index b6cbe1b64..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/d1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/h0.png b/Screens/Inventory/ItemDevices/FuturisticCrate/h0.png deleted file mode 100644 index 16daa3b8e..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/h0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/h1.png b/Screens/Inventory/ItemDevices/FuturisticCrate/h1.png deleted file mode 100644 index 1c81b448c..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/h1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/h2.png b/Screens/Inventory/ItemDevices/FuturisticCrate/h2.png deleted file mode 100644 index 9462d1ff4..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/h2.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/h3.png b/Screens/Inventory/ItemDevices/FuturisticCrate/h3.png deleted file mode 100644 index 24e708e6d..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/h3.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/h4.png b/Screens/Inventory/ItemDevices/FuturisticCrate/h4.png deleted file mode 100644 index 78de293eb..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/h4.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/l0.png b/Screens/Inventory/ItemDevices/FuturisticCrate/l0.png deleted file mode 100644 index fd9dd3303..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/l0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/l1.png b/Screens/Inventory/ItemDevices/FuturisticCrate/l1.png deleted file mode 100644 index 0b91db665..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/l1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/l2.png b/Screens/Inventory/ItemDevices/FuturisticCrate/l2.png deleted file mode 100644 index 326596c1a..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/l2.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/l3.png b/Screens/Inventory/ItemDevices/FuturisticCrate/l3.png deleted file mode 100644 index 94f851c30..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/l3.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/t0.png b/Screens/Inventory/ItemDevices/FuturisticCrate/t0.png deleted file mode 100644 index 989084aa9..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/t0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/t1.png b/Screens/Inventory/ItemDevices/FuturisticCrate/t1.png deleted file mode 100644 index 37382b4f8..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/t1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/t2.png b/Screens/Inventory/ItemDevices/FuturisticCrate/t2.png deleted file mode 100644 index 56d01b90b..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/t2.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/t3.png b/Screens/Inventory/ItemDevices/FuturisticCrate/t3.png deleted file mode 100644 index 65fdf7db7..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/t3.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/w0.png b/Screens/Inventory/ItemDevices/FuturisticCrate/w0.png deleted file mode 100644 index 5d3519e5b..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/w0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/w1.png b/Screens/Inventory/ItemDevices/FuturisticCrate/w1.png deleted file mode 100644 index 8cbc206a8..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/w1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/w2.png b/Screens/Inventory/ItemDevices/FuturisticCrate/w2.png deleted file mode 100644 index 84ec47df8..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/w2.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/w3.png b/Screens/Inventory/ItemDevices/FuturisticCrate/w3.png deleted file mode 100644 index 2bf62e3f7..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/w3.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/FuturisticCrate/w4.png b/Screens/Inventory/ItemDevices/FuturisticCrate/w4.png deleted file mode 100644 index 33688bf9e..000000000 Binary files a/Screens/Inventory/ItemDevices/FuturisticCrate/w4.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/InflatableBodyBag/Bloated.png b/Screens/Inventory/ItemDevices/InflatableBodyBag/Bloated.png deleted file mode 100644 index 8bdc89803..000000000 Binary files a/Screens/Inventory/ItemDevices/InflatableBodyBag/Bloated.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/InflatableBodyBag/Inflated.png b/Screens/Inventory/ItemDevices/InflatableBodyBag/Inflated.png deleted file mode 100644 index 131a6faa3..000000000 Binary files a/Screens/Inventory/ItemDevices/InflatableBodyBag/Inflated.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/InflatableBodyBag/Light.png b/Screens/Inventory/ItemDevices/InflatableBodyBag/Light.png deleted file mode 100644 index 62c01c8a6..000000000 Binary files a/Screens/Inventory/ItemDevices/InflatableBodyBag/Light.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/InflatableBodyBag/Max.png b/Screens/Inventory/ItemDevices/InflatableBodyBag/Max.png deleted file mode 100644 index 9a998353e..000000000 Binary files a/Screens/Inventory/ItemDevices/InflatableBodyBag/Max.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Kennel/ClosedNoPadding.png b/Screens/Inventory/ItemDevices/Kennel/ClosedNoPadding.png deleted file mode 100644 index 3481c6b7f..000000000 Binary files a/Screens/Inventory/ItemDevices/Kennel/ClosedNoPadding.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Kennel/ClosedPadding.png b/Screens/Inventory/ItemDevices/Kennel/ClosedPadding.png deleted file mode 100644 index 377009fce..000000000 Binary files a/Screens/Inventory/ItemDevices/Kennel/ClosedPadding.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Kennel/Kennel.js b/Screens/Inventory/ItemDevices/Kennel/Kennel.js deleted file mode 100644 index 07b646f35..000000000 --- a/Screens/Inventory/ItemDevices/Kennel/Kennel.js +++ /dev/null @@ -1,114 +0,0 @@ -"use strict"; - -const InventoryItemDevicesKennelOptions = [ - { - Name: "OpenNoPadding", - ItemValue: { Door: false, Padding: false}, - Property: { Type: null, Difficulty: -100 } - }, { - Name: "OpenPadding", - ItemValue: { Door: false, Padding: true}, - Property: { Type: "OpenPadding", Difficulty: -100 } - }, { - Name: "ClosedNoPadding", - ItemValue: { Door: true, Padding: false}, - Property: { - Type: "Closed", - Effect: ["OneWayEnclose", "Prone", "Freeze"], - Difficulty: 10, - } - }, { - Name: "ClosedPadding", - ItemValue: { Door: true, Padding: true}, - Property: { - Type: "ClosedPadding", - Effect: ["OneWayEnclose", "Prone", "Freeze"], - Difficulty: 10, - } - } -]; - -function InventoryItemDevicesKennelLoad() { - ExtendedItemLoad(InventoryItemDevicesKennelOptions, "SelectKennelType"); -} - -function InventoryItemDevicesKennelDraw() { - ExtendedItemDraw(InventoryItemDevicesKennelOptions, "KennelType"); -} - -function InventoryItemDevicesKennelClick() { - ExtendedItemClick(InventoryItemDevicesKennelOptions); -} - -function InventoryItemDevicesKennelPublishAction(C, Option, PreviousOption) { - var msg = "KennelSet"; - if (Option.ItemValue.Padding != PreviousOption.ItemValue.Padding) { - msg += Option.ItemValue.Padding ? "PA" : "PR"; - } - if (Option.ItemValue.Door != PreviousOption.ItemValue.Door) { - msg += Option.ItemValue.Door ? "DC" : "DO"; - } - - var Dictionary = []; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - ChatRoomPublishCustomAction(msg, true, Dictionary); -} - -function InventoryItemDevicesKennelNpcDialog(C, Option) { - C.CurrentDialog = DialogFind(C, "Kennel" + Option.Name, "ItemDevices"); -} - -function InventoryItemDevicesKennelValidate(C, Item, Option) { - var Allowed = ""; - if (InventoryItemHasEffect(Item, "Lock", true)) { - Allowed = DialogFind(Player, "CantChangeWhileLocked"); - } - return Allowed; -} - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemDevicesKennelBeforeDraw({ PersistentData, L, Property }) { - if (L !== "_Door") return; - - const Data = PersistentData(); - const Properties = Property || {}; - const Type = Properties.Type ? Properties.Type : "Open"; - - if (Data.DoorState >= 11 || Data.DoorState <= 1) Data.MustChange = false; - - if ((Data.DoorState < 11 && Type.startsWith("Closed")) || (Data.DoorState > 1 && !Type.startsWith("Closed"))) { - if (Data.DrawRequested) Data.DoorState += Type.startsWith("Closed") ? 1 : -1; - Data.MustChange = true; - Data.DrawRequested = false; - if (Data.DoorState < 11 && Data.DoorState > 1) return { LayerType: "A" + Data.DoorState }; - } -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemDevicesKennelScriptDraw({ C, PersistentData, Item }) { - const Data = PersistentData(); - const Properties = Item.Property || {}; - const Type = Properties.Type ? Properties.Type : "Open"; - const FrameTime = 200; - - if (typeof Data.DoorState !== "number") Data.DoorState = Type.startsWith("Closed") ? 11 : 1; - if (typeof Data.ChangeTime !== "number") Data.ChangeTime = CommonTime() + FrameTime; - - if (Data.MustChange && Data.ChangeTime < CommonTime()) { - Data.ChangeTime = CommonTime() + FrameTime; - Data.DrawRequested = true; - AnimationRequestRefreshRate(C, FrameTime); - AnimationRequestDraw(C); - } -} - -/** - * @param {Character} C - * @returns {string} - */ -function InventoryItemDevicesKennelGetAudio(C) { - let wasWorn = InventoryGet(C, "ItemDevices") && InventoryGet(C, "ItemDevices").Asset.Name === "Kennel"; - let isSelf = C.ID == 0; - return isSelf && wasWorn ? "CageStruggle" : "CageEquip"; -} diff --git a/Screens/Inventory/ItemDevices/Kennel/Kennel_Lock.png b/Screens/Inventory/ItemDevices/Kennel/Kennel_Lock.png deleted file mode 100644 index a9bc6b508..000000000 Binary files a/Screens/Inventory/ItemDevices/Kennel/Kennel_Lock.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Kennel/OpenNoPadding.png b/Screens/Inventory/ItemDevices/Kennel/OpenNoPadding.png deleted file mode 100644 index ab5898ed2..000000000 Binary files a/Screens/Inventory/ItemDevices/Kennel/OpenNoPadding.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Kennel/OpenPadding.png b/Screens/Inventory/ItemDevices/Kennel/OpenPadding.png deleted file mode 100644 index b9319e0c8..000000000 Binary files a/Screens/Inventory/ItemDevices/Kennel/OpenPadding.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/LittleMonster/Black.png b/Screens/Inventory/ItemDevices/LittleMonster/Black.png deleted file mode 100644 index cfee17533..000000000 Binary files a/Screens/Inventory/ItemDevices/LittleMonster/Black.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/LittleMonster/Blue.png b/Screens/Inventory/ItemDevices/LittleMonster/Blue.png deleted file mode 100644 index fe2c564ea..000000000 Binary files a/Screens/Inventory/ItemDevices/LittleMonster/Blue.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/LittleMonster/Green.png b/Screens/Inventory/ItemDevices/LittleMonster/Green.png deleted file mode 100644 index 5749a6b73..000000000 Binary files a/Screens/Inventory/ItemDevices/LittleMonster/Green.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/LittleMonster/Red.png b/Screens/Inventory/ItemDevices/LittleMonster/Red.png deleted file mode 100644 index bf1227816..000000000 Binary files a/Screens/Inventory/ItemDevices/LittleMonster/Red.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Locker/Locker.js b/Screens/Inventory/ItemDevices/Locker/Locker.js deleted file mode 100644 index 1fea74d5a..000000000 --- a/Screens/Inventory/ItemDevices/Locker/Locker.js +++ /dev/null @@ -1,133 +0,0 @@ -"use strict"; -const InventoryItemDevicesLockerOpacityInputId = "InventoryItemDevicesLockerOpacity"; - -const ItemDevicesLockerOptions = [ - { - Name: "Vents", - Property: { Type: null } - }, { - Name: "Ventless", - Property: { Type: "Ventless", Effect: ["GagLight", "BlindHeavy"] } - } -]; - -function InventoryItemDevicesLockerLoad() { - const C = CharacterGetCurrent(); - const item = DialogFocusItem; - /** @type {ItemProperties} */ - const property = item.Property = item.Property || {}; - let refresh = false; - if (typeof property.Opacity !== "number") { - property.Opacity = 0; - refresh = true; - } - - if (!ItemDevicesLockerOptions.find(option => option.Property.Type === property.Type)) { - property.Type = ItemDevicesLockerOptions[0].Property.Type; - refresh = true; - } - - if (refresh) CharacterRefresh(C, false); - - const opacitySlider = ElementCreateRangeInput(InventoryItemDevicesLockerOpacityInputId, property.Opacity, item.Asset.MinOpacity, item.Asset.MaxOpacity, 0.01, "blindfold"); - if (opacitySlider) { - opacitySlider.addEventListener("input", (e) => InventoryItemDevicesLockerOpacityChange(C, item, Number(e.target.value))); - } -} - -function InventoryItemDevicesLockerDraw() { - const asset = DialogFocusItem.Asset; - const property = DialogFocusItem.Property; - - // Draw the header and item - DrawAssetPreview(1387, 55, asset); - - MainCanvas.textAlign = "left"; - DrawTextFit(DialogFindPlayer("InventoryItemDevicesLockerOpacity"), 1185, 430, 400, "#fff", "#000"); - ElementPosition(InventoryItemDevicesLockerOpacityInputId, 1700, 430, 425); - MainCanvas.textAlign = "center"; - - DrawTextFit(DialogFindPlayer("InventoryItemDevicesLockerType"), 1500, 530, 800, "#fff", "#000"); - - ItemDevicesLockerOptions.forEach((option, i) => { - const x = ExtendedXY[ItemDevicesLockerOptions.length][i][0]; - const y = ExtendedXY[ItemDevicesLockerOptions.length][i][1] + 80; - const isSelected = property.Type === option.Property.Type; - const description = DialogFindPlayer(`InventoryItemDevicesLockerType${option.Name}`); - - DrawPreviewBox( - x, y, `${AssetGetInventoryPath(asset)}/${option.Name}.png`, description, - { Border: true, Hover: true, Disabled: isSelected }, - ); - }); -} - -function InventoryItemDevicesLockerClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - return InventoryItemDevicesLockerExit(); - } - - // Option clicked - const C = CharacterGetCurrent(); - ItemDevicesLockerOptions.forEach((option, i) => { - const x = ExtendedXY[ItemDevicesLockerOptions.length][i][0]; - const y = ExtendedXY[ItemDevicesLockerOptions.length][i][1] + 80; - - if (MouseIn(x, y, 225, 275)) { - ExtendedItemHandleOptionClick(C, ItemDevicesLockerOptions, option); - } - }); -} - -/** - * Throttled callback for opacity slider changes - * @param {Character} C - The character being modified - * @param {Item} item - The item being modified - * @param {number} brightness - The new brightness to set on the item - * @returns {void} - Nothing - */ -const InventoryItemDevicesLockerOpacityChange = CommonLimitFunction((C, item, brightness) => { - item.Property.Opacity = brightness; - CharacterLoadCanvas(C); -}); - -/** - * Exit handler for the item's extended item screen. Updates the character and removes UI components. - * @returns {void} - Nothing - */ -function InventoryItemDevicesLockerExit() { - const C = CharacterGetCurrent(); - const item = DialogFocusItem; - - item.Property.Opacity = Number(ElementValue(InventoryItemDevicesLockerOpacityInputId)); - ChatRoomCharacterItemUpdate(C, item.Asset.Group.Name); - - ElementRemove(InventoryItemDevicesLockerOpacityInputId); - PreferenceMessage = ""; - DialogFocusItem = null; -} - -/** - * Publishes the message to the chat - * @param {Character} C - The target character - * @param {ExtendedItemOption} Option - The currently selected Option - * @returns {void} - Nothing - */ -function InventoryItemDevicesLockerPublishAction(C, Option) { - var msg = "InventoryItemDevicesLockerChange"; - var Dictionary = []; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - ChatRoomPublishCustomAction(msg, true, Dictionary); -} - -/** - * The NPC dialog is for what the NPC says to you when you make a change to their restraints - * @param {Character} C - The NPC to whom the restraint is applied - * @param {ExtendedItemOption} Option - The chosen option for this extended item - * @returns {void} - Nothing - */ -function InventoryItemDevicesLockerNpcDialog(C, Option) { - C.CurrentDialog = DialogFind(C, "LockerState" + Option.Name, "ItemDevices"); -} diff --git a/Screens/Inventory/ItemDevices/Locker/Ventless.png b/Screens/Inventory/ItemDevices/Locker/Ventless.png deleted file mode 100644 index ae0cb4bd4..000000000 Binary files a/Screens/Inventory/ItemDevices/Locker/Ventless.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Locker/Vents.png b/Screens/Inventory/ItemDevices/Locker/Vents.png deleted file mode 100644 index b6d8e7e8e..000000000 Binary files a/Screens/Inventory/ItemDevices/Locker/Vents.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Net/AllFours.png b/Screens/Inventory/ItemDevices/Net/AllFours.png deleted file mode 100644 index 1df0a4490..000000000 Binary files a/Screens/Inventory/ItemDevices/Net/AllFours.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Net/Kneel.png b/Screens/Inventory/ItemDevices/Net/Kneel.png deleted file mode 100644 index 82d12f694..000000000 Binary files a/Screens/Inventory/ItemDevices/Net/Kneel.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Net/Net.png b/Screens/Inventory/ItemDevices/Net/Net.png deleted file mode 100644 index c61321558..000000000 Binary files a/Screens/Inventory/ItemDevices/Net/Net.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Net/Net_BackWeights.png b/Screens/Inventory/ItemDevices/Net/Net_BackWeights.png deleted file mode 100644 index 7a6a87069..000000000 Binary files a/Screens/Inventory/ItemDevices/Net/Net_BackWeights.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Net/Net_FrontWeights.png b/Screens/Inventory/ItemDevices/Net/Net_FrontWeights.png deleted file mode 100644 index 39e411829..000000000 Binary files a/Screens/Inventory/ItemDevices/Net/Net_FrontWeights.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Net/Suspended.png b/Screens/Inventory/ItemDevices/Net/Suspended.png deleted file mode 100644 index f831f856f..000000000 Binary files a/Screens/Inventory/ItemDevices/Net/Suspended.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/PetBed/Blanket.png b/Screens/Inventory/ItemDevices/PetBed/Blanket.png deleted file mode 100644 index 792ea68c3..000000000 Binary files a/Screens/Inventory/ItemDevices/PetBed/Blanket.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/PetBed/NoBlanket.png b/Screens/Inventory/ItemDevices/PetBed/NoBlanket.png deleted file mode 100644 index 4b4d4a3d4..000000000 Binary files a/Screens/Inventory/ItemDevices/PetBed/NoBlanket.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/PetBowl/PetBowl.js b/Screens/Inventory/ItemDevices/PetBowl/PetBowl.js deleted file mode 100644 index 5e104d40b..000000000 --- a/Screens/Inventory/ItemDevices/PetBowl/PetBowl.js +++ /dev/null @@ -1,140 +0,0 @@ -"use strict"; -const InventoryItemDevicesPetBowlMaxLength = 12; -const InventoryItemDevicesPetBowlInputId = "InventoryItemDevicesPetBowlText"; -const InventoryItemDevicesPetBowlFont = "'Saira Stencil One', 'Arial', sans-serif"; - -/** - * Loads the extended item properties - * @returns {void} - Nothing - */ -function InventoryItemDevicesPetBowlLoad() { - // Load the font - DynamicDrawLoadFont(InventoryItemDevicesPetBowlFont); - - const C = CharacterGetCurrent(); - let MustRefresh = false; - - /** @type {ItemProperties} */ - const Property = (DialogFocusItem.Property = DialogFocusItem.Property || {}); - if (typeof Property.Text !== "string") { - Property.Text = ""; - MustRefresh = true; - } - - if (MustRefresh) { - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, DialogFocusItem.Asset.Group.Name); - } - - const input = ElementCreateInput(InventoryItemDevicesPetBowlInputId, "text", Property.Text, InventoryItemDevicesPetBowlMaxLength); - if (input) input.pattern = DynamicDrawTextInputPattern; -} - -/** - * Draw handler for the extended item screen - * @returns {void} - Nothing - */ -function InventoryItemDevicesPetBowlDraw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - const updateAllowed = DynamicDrawTextRegex.test(InventoryItemDevicesPetBowlGetText()); - DrawTextFit(DialogFindPlayer("PetBowlLabel"), 1505, 620, 350, "#fff", "#000"); - ElementPosition(InventoryItemDevicesPetBowlInputId, 1505, 680, 350); - DrawButton(1330, 731, 340, 64, DialogFindPlayer("SaveText"), updateAllowed ? "White" : "#888", ""); -} - -/** - * Click handler for the extended item screen - * @returns {void} - Nothing - */ -function InventoryItemDevicesPetBowlClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - return InventoryItemDevicesPetBowlExit(); - } - - const text = InventoryItemDevicesPetBowlGetText(); - if (MouseIn(1330, 731, 340, 64) && DynamicDrawTextRegex.test(text)) { - DialogFocusItem.Property.Text = text; - InventoryItemDevicesPetBowlChange(text); - } -} - -/** - * Exits the extended item screen and cleans up inputs and text - * @returns {void} - Nothing - */ -function InventoryItemDevicesPetBowlExit() { - ElementRemove(InventoryItemDevicesPetBowlInputId); - DialogFocusItem = null; -} - -/** - * Handles text changes. Refreshes the character and sends an appropriate chatroom message - * @returns {void} - Nothing - */ -function InventoryItemDevicesPetBowlChange(text) { - var C = CharacterGetCurrent(); - CharacterRefresh(C); - if (CurrentScreen == "ChatRoom") { - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "NewText", Text: text } - ]; - ChatRoomPublishCustomAction("PetBowlChange", true, Dictionary); - InventoryItemDevicesPetBowlExit(); - } -} - -/** - * Fetches the current input text, trimmed appropriately - * @returns {string} - The text in the canvas hood's input element - */ -function InventoryItemDevicesPetBowlGetText() { - return ElementValue(InventoryItemDevicesPetBowlInputId).substring(0, InventoryItemDevicesPetBowlMaxLength); -} - -/** - * Post-render drawing function. Draws custom text in a slight arc to mimic the - * curvature of the bowl. - * @type {DynamicAfterDrawCallback} - */ -function AssetsItemDevicesPetBowlAfterDraw({ C, A, X, Y, L, Property, drawCanvas, drawCanvasBlink, AlphaMasks, Color }) { - if (L === "_Text") { - // Fetch the text property and assert that it matches the character - // and length requirements - let text = Property && typeof Property.Text === "string" && DynamicDrawTextRegex.test(Property.Text) ? Property.Text : ""; - text = text.substring(0, InventoryItemDevicesPetBowlMaxLength); - - // Prepare a temporary canvas to draw the text to - const height = 60; - const width = 130; - const tempCanvas = AnimationGenerateTempCanvas(C, A, width, height); - const ctx = tempCanvas.getContext("2d"); - - // Reposition and orient the text when hanging upside-down - if (C.IsInverted()) { - ctx.rotate(Math.PI); - ctx.translate(-tempCanvas.width, -tempCanvas.height); - Y -= 60; - X -= 300; - } - - DynamicDrawTextArc(text, ctx, width / 2, 42, { - fontSize: 36, - fontFamily: InventoryItemDevicesPetBowlFont, - width, - color: Color, - angle: Math.PI, - direction: DynamicDrawTextDirection.ANTICLOCKWISE, - textCurve: DynamicDrawTextCurve.SMILEY, - radius: 350, - }); - - // Draw the temporary canvas onto the main canvas - drawCanvas(tempCanvas, X, Y, AlphaMasks); - drawCanvasBlink(tempCanvas, X, Y, AlphaMasks); - } -} diff --git a/Screens/Inventory/ItemDevices/Pole/Tied.png b/Screens/Inventory/ItemDevices/Pole/Tied.png deleted file mode 100644 index e9c22782c..000000000 Binary files a/Screens/Inventory/ItemDevices/Pole/Tied.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Pole/Untied.png b/Screens/Inventory/ItemDevices/Pole/Untied.png deleted file mode 100644 index dc50f8984..000000000 Binary files a/Screens/Inventory/ItemDevices/Pole/Untied.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/SmallLocker/SmallLocker.js b/Screens/Inventory/ItemDevices/SmallLocker/SmallLocker.js deleted file mode 100644 index b44e2523e..000000000 --- a/Screens/Inventory/ItemDevices/SmallLocker/SmallLocker.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; - -function InventoryItemDevicesSmallLockerLoad() { - InventoryItemDevicesLockerLoad(); -} - -function InventoryItemDevicesSmallLockerDraw() { - InventoryItemDevicesLockerDraw(); -} - -function InventoryItemDevicesSmallLockerClick() { - InventoryItemDevicesLockerClick(); -} - -function InventoryItemDevicesSmallLockerExit() { - InventoryItemDevicesLockerExit(); -} - -function InventoryItemDevicesSmallLockerPublishAction(C, Option) { - InventoryItemDevicesLockerPublishAction(C, Option); -} - -function InventoryItemDevicesSmallLockerNpcDialog(C, Option) { - InventoryItemDevicesLockerNpcDialog(C, Option); -} diff --git a/Screens/Inventory/ItemDevices/SmallLocker/Ventless.png b/Screens/Inventory/ItemDevices/SmallLocker/Ventless.png deleted file mode 100644 index ae0cb4bd4..000000000 Binary files a/Screens/Inventory/ItemDevices/SmallLocker/Ventless.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/SmallLocker/Vents.png b/Screens/Inventory/ItemDevices/SmallLocker/Vents.png deleted file mode 100644 index b6d8e7e8e..000000000 Binary files a/Screens/Inventory/ItemDevices/SmallLocker/Vents.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Sybian/Sybian.js b/Screens/Inventory/ItemDevices/Sybian/Sybian.js deleted file mode 100644 index 4f8b2e335..000000000 --- a/Screens/Inventory/ItemDevices/Sybian/Sybian.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -function InventoryItemDevicesSybianLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemDevicesSybianDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemDevicesSybianClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemDevicesSybianScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemDevices/TransportWoodenBox/NWSE.png b/Screens/Inventory/ItemDevices/TransportWoodenBox/NWSE.png deleted file mode 100644 index 6c6455cc4..000000000 Binary files a/Screens/Inventory/ItemDevices/TransportWoodenBox/NWSE.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/TransportWoodenBox/SWNE.png b/Screens/Inventory/ItemDevices/TransportWoodenBox/SWNE.png deleted file mode 100644 index 8e683f517..000000000 Binary files a/Screens/Inventory/ItemDevices/TransportWoodenBox/SWNE.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/TransportWoodenBox/TransportWoodenBox.js b/Screens/Inventory/ItemDevices/TransportWoodenBox/TransportWoodenBox.js deleted file mode 100644 index 252b73692..000000000 --- a/Screens/Inventory/ItemDevices/TransportWoodenBox/TransportWoodenBox.js +++ /dev/null @@ -1,33 +0,0 @@ -"use strict"; -function InventoryItemDevicesTransportWoodenBoxLoad() { - InventoryItemDevicesWoodenBoxLoad(); -} - -function InventoryItemDevicesTransportWoodenBoxDraw() { - InventoryItemDevicesWoodenBoxDraw(); -} - -function InventoryItemDevicesTransportWoodenBoxClick() { - InventoryItemDevicesWoodenBoxClick(); -} - -function InventoryItemDevicesTransportWoodenBoxSetOpacity(property, opacity) { - if (opacity !== property.opacity) property.Opacity = opacity; - if (!Array.isArray(property.Effect)) property.Effect = []; - const transparent = property.Opacity < 0.15; - const effectsToApply = transparent ? ["Prone", "Enclose", "Freeze", "Leash"] : ["Prone", "Enclose", "BlindNormal", "GagLight", "Freeze", "Leash"]; - const effectsToRemoves = transparent ? ["BlindNormal", "GagLight"] : []; - property.Effect = property.Effect.filter(e => !effectsToRemoves.includes(e)); - effectsToApply.forEach(e => { - if (!property.Effect.includes(e)) property.Effect.push(e); - }); -} - -function InventoryItemDevicesTransportWoodenBoxExit() { - InventoryItemDevicesWoodenBoxExit(); -} - -/** @type {DynamicAfterDrawCallback} */ -function AssetsItemDevicesTransportWoodenBoxAfterDraw(options) { - AssetsItemDevicesWoodenBoxAfterDraw(options); -} diff --git a/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsDownLegsSpread.png b/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsDownLegsSpread.png deleted file mode 100644 index 86c77a3ad..000000000 Binary files a/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsDownLegsSpread.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsDownLegsTogether.png b/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsDownLegsTogether.png deleted file mode 100644 index d23a59e19..000000000 Binary files a/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsDownLegsTogether.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsUpLegsSpread.png b/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsUpLegsSpread.png deleted file mode 100644 index 994db9a84..000000000 Binary files a/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsUpLegsSpread.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsUpLegsTogether.png b/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsUpLegsTogether.png deleted file mode 100644 index bd757f9ee..000000000 Binary files a/Screens/Inventory/ItemDevices/VacBedDeluxe/ArmsUpLegsTogether.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/VacBedDeluxe/VacBedDeluxe.js b/Screens/Inventory/ItemDevices/VacBedDeluxe/VacBedDeluxe.js deleted file mode 100644 index 1c7104d6f..000000000 --- a/Screens/Inventory/ItemDevices/VacBedDeluxe/VacBedDeluxe.js +++ /dev/null @@ -1,164 +0,0 @@ -"use strict"; -const InventoryItemDevicesVacBedDeluxeOpacityInputId = "InventoryItemDevicesVacBedDeluxeOpacity"; - -const InventoryItemDevicesVacBedDeluxeSelectionOffsetX = 1000; -const InventoryItemDevicesVacBedDeluxeSelectionOffsetY = 700; -const InventoryItemDevicesVacBedDeluxeSelectionWidth = 256; - -/** @type {ExtendedItemOption[]} */ -let InventoryItemDevicesVacBedDeluxeOptions = [ - { - Name: "ArmsDownLegsSpread", - Property: { - Type: null, - SetPose: ["BaseLower"], - }, - Prerequisite: ["LegsOpen"] - }, - { - Name: "ArmsDownLegsTogether", - Property: { - Type: "ArmsDownLegsTogether", - SetPose: ["LegsClosed"] - } - }, - { - Name: "ArmsUpLegsSpread", - Property: { - Type: "ArmsUpLegsSpread", - SetPose: ["Yoked", "BaseLower"] - } - }, - { - Name: "ArmsUpLegsTogether", - Property: { - Type: "ArmsUpLegsTogether", - SetPose: ["Yoked", "LegsClosed"] - } - }, -]; - -/** - * Loads the vac bed's extended item properties - * @returns {void} - Nothing - */ -function InventoryItemDevicesVacBedDeluxeLoad() { - const character = CharacterGetCurrent(); - const item = DialogFocusItem; - let refresh = false; - - /** @type {ItemProperties} */ - const Property = item.Property = item.Property || { }; - if (typeof Property.Opacity !== "number") { - Property.Opacity = item.Asset.Opacity; - refresh = true; - } - - if (refresh) { - CharacterRefresh(character); - ChatRoomCharacterItemUpdate(character, item.Asset.Group.Name); - } - - const opacitySlider = ElementCreateRangeInput(InventoryItemDevicesVacBedDeluxeOpacityInputId, Property.Opacity, item.Asset.MinOpacity, item.Asset.MaxOpacity, 0.01, "blindfold", false); - if (opacitySlider) { - opacitySlider.addEventListener("input", () => InventoryItemDevicesVacBedDeluxeOpacityChange(character, item, opacitySlider.value)); - } -} - -/** - * Draw handler for the vac bed's extended item screen - * @returns {void} - Nothing - */ -function InventoryItemDevicesVacBedDeluxeDraw() { - const asset = DialogFocusItem.Asset; - - // Draw the header and item - DrawAssetPreview(1387, 125, asset); - - MainCanvas.textAlign = "right"; - DrawTextFit(DialogFindPlayer("VacBedDeluxeOpacityLabel"), 1375, 500, 400, "#FFFFFF", "#000"); - ElementPosition(InventoryItemDevicesVacBedDeluxeOpacityInputId, 1625, 500, 400); - DrawTextFit(Math.round(DialogFocusItem.Property.Opacity * 100).toString()+"%", 1925, 500, 400, "#FFFFFF", "#000"); - MainCanvas.textAlign = "center"; - - DrawTextFit(DialogFindPlayer("VacBedDeluxeTypeLabel"), 1500, 660, 800, "#FFFFFF", "#000"); - - InventoryItemDevicesVacBedDeluxeOptions.forEach((option, i) => { - const x = InventoryItemDevicesVacBedDeluxeSelectionOffsetX + (i * InventoryItemDevicesVacBedDeluxeSelectionWidth); - const y = InventoryItemDevicesVacBedDeluxeSelectionOffsetY; - const isSelected = DialogFocusItem.Property.Type === option.Property.Type; - DrawPreviewBox(x, y, `${AssetGetInventoryPath(asset)}/${option.Name}.png`, "", { - Border: true, - Hover: true, - Disabled: isSelected, - }); - }); -} - -/** - * Click handler for the vac bed's extended item screen - * @returns {void} - Nothing - */ -function InventoryItemDevicesVacBedDeluxeClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - return InventoryItemDevicesVacBedDeluxeExit(); - } - - InventoryItemDevicesVacBedDeluxeOptions.forEach((option, i) => { - const x = InventoryItemDevicesVacBedDeluxeSelectionOffsetX + (i * InventoryItemDevicesVacBedDeluxeSelectionWidth); - const y = InventoryItemDevicesVacBedDeluxeSelectionOffsetY; - if (MouseIn(x, y, 225, 275)) { - ExtendedItemSetType(CharacterGetCurrent(), InventoryItemDevicesVacBedDeluxeOptions, option); - } - }); -} - -/** - * Exits the vac bed's extended item screen, sends a chatroom message if appropriate, and cleans up inputs and text - * @returns {void} - Nothing - */ -function InventoryItemDevicesVacBedDeluxeExit() { - const character = CharacterGetCurrent(); - const item = DialogFocusItem; - - item.Property.Opacity = InventoryItemDevicesVacBedDeluxeGetInputOpacity(); - - CharacterRefresh(character); - ChatRoomCharacterItemUpdate(character, item.Asset.Group.Name); - - ElementRemove(InventoryItemDevicesVacBedDeluxeOpacityInputId); - - PreferenceMessage = ""; - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild(CharacterGetCurrent()); -} - -/** - * Handles vac bed opacity changes. Refreshes the character locally - * @returns {void} - Nothing - */ -const InventoryItemDevicesVacBedDeluxeOpacityChange = CommonLimitFunction((character, item, opacity) => { - item = DialogFocusItem || item; - item.Property.Opacity = Number(opacity); - CharacterRefresh(character, false); -}); - -/** - * Publishes an action if the vac bed's type changes - * @returns {void} - Nothing - */ -function InventoryItemDevicesVacBedDeluxePublishAction(C, Option) { - let dictionary = []; - dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - ChatRoomPublishCustomAction("VacBedDeluxeChangeType", true, dictionary); -} - -/** - * Fetches the current opacity input value, parsed to a number - * @returns {number} - The value of the vac bed's opacity input slider - */ -function InventoryItemDevicesVacBedDeluxeGetInputOpacity() { - return Number(ElementValue(InventoryItemDevicesVacBedDeluxeOpacityInputId)); -} diff --git a/Screens/Inventory/ItemDevices/Vacbed/Nohair.png b/Screens/Inventory/ItemDevices/Vacbed/Nohair.png deleted file mode 100644 index 757649cbf..000000000 Binary files a/Screens/Inventory/ItemDevices/Vacbed/Nohair.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/Vacbed/Normal.png b/Screens/Inventory/ItemDevices/Vacbed/Normal.png deleted file mode 100644 index 010687604..000000000 Binary files a/Screens/Inventory/ItemDevices/Vacbed/Normal.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenBox/NWSE.png b/Screens/Inventory/ItemDevices/WoodenBox/NWSE.png deleted file mode 100644 index 6c6455cc4..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenBox/NWSE.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenBox/SWNE.png b/Screens/Inventory/ItemDevices/WoodenBox/SWNE.png deleted file mode 100644 index 8e683f517..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenBox/SWNE.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenBox/WoodenBox.js b/Screens/Inventory/ItemDevices/WoodenBox/WoodenBox.js deleted file mode 100644 index b75be4e9a..000000000 --- a/Screens/Inventory/ItemDevices/WoodenBox/WoodenBox.js +++ /dev/null @@ -1,253 +0,0 @@ -"use strict"; -const InventoryItemDevicesWoodenBoxMaxLength = 20; -const InventoryItemDevicesWoodenBoxTextInputId = "InventoryItemDevicesWoodenBoxText"; -const InventoryItemDevicesWoodenBoxOpacityInputId = "InventoryItemDevicesWoodenBoxOpacity"; -const InventoryItemDevicesWoodenBoxFont = "'Saira Stencil One', 'Arial', sans-serif"; - -let InventoryItemDevicesWoodenBoxOriginalText = null; - -let InventoryItemDevicesWoodenBoxOptions = [ - { - Name: "SWNE", - Property: { Type: null }, - from: [0, 1], - to: [1, 0], - }, - { - Name: "NWSE", - Property: { Type: "NWSE" }, - from: [0, 0], - to: [1, 1], - }, -]; - -/** - * Loads the wooden box's extended item properties - * @returns {void} - Nothing - */ -function InventoryItemDevicesWoodenBoxLoad() { - DynamicDrawLoadFont(InventoryItemDevicesWoodenBoxFont); - - const C = CharacterGetCurrent(); - const item = DialogFocusItem; - let mustRefresh = false; - - /** @type {ItemProperties} */ - const Property = item.Property = item.Property || {}; - if (typeof Property.Text !== "string") { - Property.Text = ""; - mustRefresh = true; - } - if (typeof Property.Opacity !== "number") { - Property.Opacity = 0; - InventoryItemDevicesWoodenBoxSetOpacity(Property, Property.Opacity); - mustRefresh = true; - } - if (!InventoryItemDevicesWoodenBoxOptions.find(option => option.Property.Type === Property.Type)) { - Property.Type = InventoryItemDevicesWoodenBoxOptions[0].Property.Type; - mustRefresh = true; - } - - if (mustRefresh) { - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, item.Asset.Group.Name); - } - - if (InventoryItemDevicesWoodenBoxOriginalText == null) { - InventoryItemDevicesWoodenBoxOriginalText = Property.Text; - } - - const textInput = ElementCreateInput( - InventoryItemDevicesWoodenBoxTextInputId, "text", Property.Text, InventoryItemDevicesWoodenBoxMaxLength); - if (textInput) { - textInput.pattern = DynamicDrawTextInputPattern; - textInput.addEventListener("input", (e) => InventoryItemDevicesWoodenBoxTextChange(C, item, e.target.value)); - } - - const opacitySlider = ElementCreateRangeInput(InventoryItemDevicesWoodenBoxOpacityInputId, Property.Opacity, item.Asset.MinOpacity, item.Asset.MaxOpacity, 0.01, "blindfold"); - if (opacitySlider) { - opacitySlider.addEventListener("input", (e) => InventoryItemDevicesWoodenBoxOpacityChange(C, item, e.target.value)); - } -} - -/** - * Draw handler for the wooden box's extended item screen - * @returns {void} - Nothing - */ -function InventoryItemDevicesWoodenBoxDraw() { - const asset = DialogFocusItem.Asset; - - // Draw the header and item - DrawAssetPreview(1387, 125, asset); - - MainCanvas.textAlign = "right"; - DrawTextFit(DialogFindPlayer("WoodenBoxOpacityLabel"), 1475, 500, 400, "#fff", "#000"); - ElementPosition(InventoryItemDevicesWoodenBoxOpacityInputId, 1725, 500, 400); - - DrawTextFit(DialogFindPlayer("WoodenBoxTextLabel"), 1475, 580, 400, "#fff", "#000"); - ElementPosition(InventoryItemDevicesWoodenBoxTextInputId, 1725, 580, 400); - MainCanvas.textAlign = "center"; - - DrawTextFit(DialogFindPlayer("WoodenBoxTypeLabel"), 1500, 660, 800, "#fff", "#000"); - - InventoryItemDevicesWoodenBoxOptions.forEach((option, i) => { - const x = ExtendedXY[InventoryItemDevicesWoodenBoxOptions.length][i][0]; - const isSelected = DialogFocusItem.Property.Type === option.Property.Type; - DrawPreviewBox(x, 700, `${AssetGetInventoryPath(asset)}/${option.Name}.png`, "", { - Border: true, - Hover: true, - Disabled: isSelected, - }); - }); -} - -/** - * Click handler for the wooden box's extended item screen - * @returns {void} - Nothing - */ -function InventoryItemDevicesWoodenBoxClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - return InventoryItemDevicesWoodenBoxExit(); - } - - InventoryItemDevicesWoodenBoxOptions.some((option, i) => { - const x = ExtendedXY[InventoryItemDevicesWoodenBoxOptions.length][i][0]; - if (MouseIn(x, 700, 225, 275)) { - DialogFocusItem.Property.Type = option.Property.Type; - CharacterRefresh(CharacterGetCurrent(), false); - } - }); -} - -/** - * Exits the wooden box's extended item screen, sends a chatroom message if appropriate, and cleans up inputs and text - * @returns {void} - Nothing - */ -function InventoryItemDevicesWoodenBoxExit() { - const C = CharacterGetCurrent(); - const item = DialogFocusItem; - - let setOpacity = window[`Inventory${item.Asset.Group.Name}${item.Asset.Name}SetOpacity`] || InventoryItemDevicesWoodenBoxSetOpacity; - setOpacity(item.Property, InventoryItemDevicesWoodenBoxGetInputOpacity()); - const text = InventoryItemDevicesWoodenBoxGetText(); - if (DynamicDrawTextRegex.test(text)) item.Property.Text = text; - - if (CurrentScreen === "ChatRoom" && text !== InventoryItemDevicesWoodenBoxOriginalText) { - const dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "NewText", Text: text }, - { Tag: "AssetName", AssetName: item.Asset.Name }, - ]; - const msg = text === "" ? "WoodenBoxTextRemove" : "WoodenBoxTextChange"; - ChatRoomPublishCustomAction(msg, false, dictionary); - } - - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, item.Asset.Group.Name); - - ElementRemove(InventoryItemDevicesWoodenBoxTextInputId); - ElementRemove(InventoryItemDevicesWoodenBoxOpacityInputId); - InventoryItemDevicesWoodenBoxOriginalText = null; - PreferenceMessage = ""; - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild(CharacterGetCurrent()); -} - -/** - * Sets the opacity of the wooden box based, and applies effects based on its opacity value - * @param {ItemProperties} property - The item's Property object - * @param {number} opacity - The opacity to set on the item's Property - * @returns {void} - Nothing - */ -function InventoryItemDevicesWoodenBoxSetOpacity(property, opacity) { - if (opacity !== property.Opacity) property.Opacity = opacity; - if (!Array.isArray(property.Effect)) property.Effect = []; - const transparent = property.Opacity < 0.15; - const effectsToApply = transparent ? ["Prone", "Enclose", "Freeze"] : ["Prone", "Enclose", "BlindNormal", "GagLight", "Freeze"]; - const effectsToRemoves = transparent ? ["BlindNormal", "GagLight"] : []; - property.Effect = property.Effect.filter(e => !effectsToRemoves.includes(e)); - effectsToApply.forEach(e => { - if (!property.Effect.includes(e)) property.Effect.push(e); - }); -} - -/** - * Handles wooden box opacity changes. Refreshes the character locally - * @returns {void} - Nothing - */ -const InventoryItemDevicesWoodenBoxOpacityChange = CommonLimitFunction((C, item, opacity) => { - item = DialogFocusItem || item; - item.Property.Opacity = Number(opacity); - CharacterLoadCanvas(C); -}); - -/** - * Handles wooden box text changes. Refreshes the character locally - * @returns {void} - Nothing - */ -const InventoryItemDevicesWoodenBoxTextChange = CommonLimitFunction((C, item, text) => { - item = DialogFocusItem || item; - if (DynamicDrawTextRegex.test(text)) { - item.Property.Text = text.substring(0, InventoryItemDevicesWoodenBoxMaxLength); - CharacterLoadCanvas(C); - } -}); - -/** - * Fetches the current text input value, trimmed appropriately - * @returns {string} - The text in the wooden box's text input element - */ -function InventoryItemDevicesWoodenBoxGetText() { - return ElementValue(InventoryItemDevicesWoodenBoxTextInputId).substring(0, InventoryItemDevicesWoodenBoxMaxLength); -} - -/** - * Fetches the current opacity input value, parsed to a number - * @returns {number} - The value of the wooden box's opacity input slider - */ -function InventoryItemDevicesWoodenBoxGetInputOpacity() { - return Number(ElementValue(InventoryItemDevicesWoodenBoxOpacityInputId)); -} - -/** - * Dynamic AfterDraw function. Draws text onto the box. - * @type {DynamicAfterDrawCallback} - */ -function AssetsItemDevicesWoodenBoxAfterDraw({ C, A, X, Y, L, Property, drawCanvas, drawCanvasBlink, AlphaMasks, Color, Opacity }) { - if (L === "_Text") { - const height = 900; - const width = 310; - const tmpCanvas = AnimationGenerateTempCanvas(C, A, width, height); - const ctx = tmpCanvas.getContext("2d"); - - let text = Property && typeof Property.Text === "string" && DynamicDrawTextRegex.test(Property.Text) ? Property.Text : ""; - text = text.substring(0, InventoryItemDevicesWoodenBoxMaxLength); - - let from = [0, 1]; - let to = [1, 0]; - - if (Property && Property.Type) { - const option = InventoryItemDevicesWoodenBoxOptions.find(o => o.Property.Type === Property.Type); - if (option) { - from = option.from; - to = option.to; - } - } - - from = [width * from[0], height * from[1]]; - to = [width * to[0], height * to[1]]; - - const { r, g, b } = DrawHexToRGB(Color); - DynamicDrawTextFromTo(text, ctx, from, to, { - fontSize: 96, - fontFamily: InventoryItemDevicesWoodenBoxFont, - color: `rgba(${r}, ${g}, ${b}, ${0.7 * Opacity})`, - }); - - // We print the canvas on the character based on the asset position - drawCanvas(tmpCanvas, X + 90, Y + 300, AlphaMasks); - drawCanvasBlink(tmpCanvas, X + 90, Y + 300, AlphaMasks); - } -} diff --git a/Screens/Inventory/ItemDevices/WoodenRack/b0.png b/Screens/Inventory/ItemDevices/WoodenRack/b0.png deleted file mode 100644 index f169f98ef..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/b0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/b1.png b/Screens/Inventory/ItemDevices/WoodenRack/b1.png deleted file mode 100644 index e79df2074..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/b1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/b2.png b/Screens/Inventory/ItemDevices/WoodenRack/b2.png deleted file mode 100644 index 18b887c57..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/b2.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/b3.png b/Screens/Inventory/ItemDevices/WoodenRack/b3.png deleted file mode 100644 index 233e6ed00..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/b3.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/b4.png b/Screens/Inventory/ItemDevices/WoodenRack/b4.png deleted file mode 100644 index ef8319c80..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/b4.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/b5.png b/Screens/Inventory/ItemDevices/WoodenRack/b5.png deleted file mode 100644 index 8ac22567d..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/b5.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/b6.png b/Screens/Inventory/ItemDevices/WoodenRack/b6.png deleted file mode 100644 index b9d825365..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/b6.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/f0.png b/Screens/Inventory/ItemDevices/WoodenRack/f0.png deleted file mode 100644 index 07dbaa109..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/f0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/f1.png b/Screens/Inventory/ItemDevices/WoodenRack/f1.png deleted file mode 100644 index c0a4189b7..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/f1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/f2.png b/Screens/Inventory/ItemDevices/WoodenRack/f2.png deleted file mode 100644 index 7b7bab257..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/f2.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/f3.png b/Screens/Inventory/ItemDevices/WoodenRack/f3.png deleted file mode 100644 index 182c7bba5..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/f3.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/s0.png b/Screens/Inventory/ItemDevices/WoodenRack/s0.png deleted file mode 100644 index 04b6ee555..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/s0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/s1.png b/Screens/Inventory/ItemDevices/WoodenRack/s1.png deleted file mode 100644 index c0a4189b7..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/s1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/t0.png b/Screens/Inventory/ItemDevices/WoodenRack/t0.png deleted file mode 100644 index e19de3768..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/t0.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/t1.png b/Screens/Inventory/ItemDevices/WoodenRack/t1.png deleted file mode 100644 index 1e961f42b..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/t1.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/t2.png b/Screens/Inventory/ItemDevices/WoodenRack/t2.png deleted file mode 100644 index ac0f966ae..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/t2.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/t3.png b/Screens/Inventory/ItemDevices/WoodenRack/t3.png deleted file mode 100644 index 0458a7867..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/t3.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/t4.png b/Screens/Inventory/ItemDevices/WoodenRack/t4.png deleted file mode 100644 index 7b7d4280e..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/t4.png and /dev/null differ diff --git a/Screens/Inventory/ItemDevices/WoodenRack/t5.png b/Screens/Inventory/ItemDevices/WoodenRack/t5.png deleted file mode 100644 index 3baa7a416..000000000 Binary files a/Screens/Inventory/ItemDevices/WoodenRack/t5.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/BluetoothEarbuds/Heavy.png b/Screens/Inventory/ItemEars/BluetoothEarbuds/Heavy.png deleted file mode 100644 index 2434ca0af..000000000 Binary files a/Screens/Inventory/ItemEars/BluetoothEarbuds/Heavy.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/BluetoothEarbuds/Light.png b/Screens/Inventory/ItemEars/BluetoothEarbuds/Light.png deleted file mode 100644 index f8586b82d..000000000 Binary files a/Screens/Inventory/ItemEars/BluetoothEarbuds/Light.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/BluetoothEarbuds/NoiseCancelling.png b/Screens/Inventory/ItemEars/BluetoothEarbuds/NoiseCancelling.png deleted file mode 100644 index d0fdbdbdf..000000000 Binary files a/Screens/Inventory/ItemEars/BluetoothEarbuds/NoiseCancelling.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/BluetoothEarbuds/Off.png b/Screens/Inventory/ItemEars/BluetoothEarbuds/Off.png deleted file mode 100644 index f06abd921..000000000 Binary files a/Screens/Inventory/ItemEars/BluetoothEarbuds/Off.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/FuturisticEarphones/Heavy.png b/Screens/Inventory/ItemEars/FuturisticEarphones/Heavy.png deleted file mode 100644 index 2434ca0af..000000000 Binary files a/Screens/Inventory/ItemEars/FuturisticEarphones/Heavy.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/FuturisticEarphones/Light.png b/Screens/Inventory/ItemEars/FuturisticEarphones/Light.png deleted file mode 100644 index f8586b82d..000000000 Binary files a/Screens/Inventory/ItemEars/FuturisticEarphones/Light.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/FuturisticEarphones/NoiseCancelling.png b/Screens/Inventory/ItemEars/FuturisticEarphones/NoiseCancelling.png deleted file mode 100644 index d0fdbdbdf..000000000 Binary files a/Screens/Inventory/ItemEars/FuturisticEarphones/NoiseCancelling.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/FuturisticEarphones/Off.png b/Screens/Inventory/ItemEars/FuturisticEarphones/Off.png deleted file mode 100644 index f06abd921..000000000 Binary files a/Screens/Inventory/ItemEars/FuturisticEarphones/Off.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/HeadphoneEarPlugs/Heavy.png b/Screens/Inventory/ItemEars/HeadphoneEarPlugs/Heavy.png deleted file mode 100644 index 2434ca0af..000000000 Binary files a/Screens/Inventory/ItemEars/HeadphoneEarPlugs/Heavy.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/HeadphoneEarPlugs/Light.png b/Screens/Inventory/ItemEars/HeadphoneEarPlugs/Light.png deleted file mode 100644 index f8586b82d..000000000 Binary files a/Screens/Inventory/ItemEars/HeadphoneEarPlugs/Light.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/HeadphoneEarPlugs/NoiseCancelling.png b/Screens/Inventory/ItemEars/HeadphoneEarPlugs/NoiseCancelling.png deleted file mode 100644 index d0fdbdbdf..000000000 Binary files a/Screens/Inventory/ItemEars/HeadphoneEarPlugs/NoiseCancelling.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/HeadphoneEarPlugs/Off.png b/Screens/Inventory/ItemEars/HeadphoneEarPlugs/Off.png deleted file mode 100644 index f06abd921..000000000 Binary files a/Screens/Inventory/ItemEars/HeadphoneEarPlugs/Off.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/Headphones/Heavy.png b/Screens/Inventory/ItemEars/Headphones/Heavy.png deleted file mode 100644 index 2434ca0af..000000000 Binary files a/Screens/Inventory/ItemEars/Headphones/Heavy.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/Headphones/Light.png b/Screens/Inventory/ItemEars/Headphones/Light.png deleted file mode 100644 index f8586b82d..000000000 Binary files a/Screens/Inventory/ItemEars/Headphones/Light.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/Headphones/NoiseCancelling.png b/Screens/Inventory/ItemEars/Headphones/NoiseCancelling.png deleted file mode 100644 index d0fdbdbdf..000000000 Binary files a/Screens/Inventory/ItemEars/Headphones/NoiseCancelling.png and /dev/null differ diff --git a/Screens/Inventory/ItemEars/Headphones/Off.png b/Screens/Inventory/ItemEars/Headphones/Off.png deleted file mode 100644 index f06abd921..000000000 Binary files a/Screens/Inventory/ItemEars/Headphones/Off.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/Chains/Basic.png b/Screens/Inventory/ItemFeet/Chains/Basic.png deleted file mode 100644 index 59ab4b19e..000000000 Binary files a/Screens/Inventory/ItemFeet/Chains/Basic.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/Chains/Strict.png b/Screens/Inventory/ItemFeet/Chains/Strict.png deleted file mode 100644 index 9927b0a49..000000000 Binary files a/Screens/Inventory/ItemFeet/Chains/Strict.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/Chains/Suspension.png b/Screens/Inventory/ItemFeet/Chains/Suspension.png deleted file mode 100644 index b6f310bcd..000000000 Binary files a/Screens/Inventory/ItemFeet/Chains/Suspension.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/DuctTape/CompleteFeet.png b/Screens/Inventory/ItemFeet/DuctTape/CompleteFeet.png deleted file mode 100644 index dcaabbaa7..000000000 Binary files a/Screens/Inventory/ItemFeet/DuctTape/CompleteFeet.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/DuctTape/Feet.png b/Screens/Inventory/ItemFeet/DuctTape/Feet.png deleted file mode 100644 index 4d6e6612c..000000000 Binary files a/Screens/Inventory/ItemFeet/DuctTape/Feet.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/DuctTape/HalfFeet.png b/Screens/Inventory/ItemFeet/DuctTape/HalfFeet.png deleted file mode 100644 index 42bb8c938..000000000 Binary files a/Screens/Inventory/ItemFeet/DuctTape/HalfFeet.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/DuctTape/MostFeet.png b/Screens/Inventory/ItemFeet/DuctTape/MostFeet.png deleted file mode 100644 index 5d7484b66..000000000 Binary files a/Screens/Inventory/ItemFeet/DuctTape/MostFeet.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/FuturisticAnkleCuffs/Chained.png b/Screens/Inventory/ItemFeet/FuturisticAnkleCuffs/Chained.png deleted file mode 100644 index f869a97ee..000000000 Binary files a/Screens/Inventory/ItemFeet/FuturisticAnkleCuffs/Chained.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/FuturisticAnkleCuffs/Closed.png b/Screens/Inventory/ItemFeet/FuturisticAnkleCuffs/Closed.png deleted file mode 100644 index acf93b77f..000000000 Binary files a/Screens/Inventory/ItemFeet/FuturisticAnkleCuffs/Closed.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/FuturisticAnkleCuffs/None.png b/Screens/Inventory/ItemFeet/FuturisticAnkleCuffs/None.png deleted file mode 100644 index 3b301004d..000000000 Binary files a/Screens/Inventory/ItemFeet/FuturisticAnkleCuffs/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/HempRope/Basic.png b/Screens/Inventory/ItemFeet/HempRope/Basic.png deleted file mode 100644 index 6a83e4eae..000000000 Binary files a/Screens/Inventory/ItemFeet/HempRope/Basic.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/HempRope/BedSpreadEagle.png b/Screens/Inventory/ItemFeet/HempRope/BedSpreadEagle.png deleted file mode 100644 index feeb7d646..000000000 Binary files a/Screens/Inventory/ItemFeet/HempRope/BedSpreadEagle.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/HempRope/Diamond.png b/Screens/Inventory/ItemFeet/HempRope/Diamond.png deleted file mode 100644 index 13acdf588..000000000 Binary files a/Screens/Inventory/ItemFeet/HempRope/Diamond.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/HempRope/FullBinding.png b/Screens/Inventory/ItemFeet/HempRope/FullBinding.png deleted file mode 100644 index c4ec614b9..000000000 Binary files a/Screens/Inventory/ItemFeet/HempRope/FullBinding.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/HempRope/HempRope.js b/Screens/Inventory/ItemFeet/HempRope/HempRope.js deleted file mode 100644 index 75e20cec4..000000000 --- a/Screens/Inventory/ItemFeet/HempRope/HempRope.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemFeetHempRopeBeforeDraw(data) { - if (data.LayerType === "BedSpreadEagle") { - return { - X: data.X -125, - Y: data.Y -170, - }; - } - return null; -} diff --git a/Screens/Inventory/ItemFeet/HempRope/Link.png b/Screens/Inventory/ItemFeet/HempRope/Link.png deleted file mode 100644 index 6550a5643..000000000 Binary files a/Screens/Inventory/ItemFeet/HempRope/Link.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/HempRope/Mermaid.png b/Screens/Inventory/ItemFeet/HempRope/Mermaid.png deleted file mode 100644 index 0db68cbc1..000000000 Binary files a/Screens/Inventory/ItemFeet/HempRope/Mermaid.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/HempRope/Suspension.png b/Screens/Inventory/ItemFeet/HempRope/Suspension.png deleted file mode 100644 index 271ec8479..000000000 Binary files a/Screens/Inventory/ItemFeet/HempRope/Suspension.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/LeatherAnkleCuffs/Chained.png b/Screens/Inventory/ItemFeet/LeatherAnkleCuffs/Chained.png deleted file mode 100644 index f869a97ee..000000000 Binary files a/Screens/Inventory/ItemFeet/LeatherAnkleCuffs/Chained.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/LeatherAnkleCuffs/Closed.png b/Screens/Inventory/ItemFeet/LeatherAnkleCuffs/Closed.png deleted file mode 100644 index acf93b77f..000000000 Binary files a/Screens/Inventory/ItemFeet/LeatherAnkleCuffs/Closed.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/LeatherAnkleCuffs/None.png b/Screens/Inventory/ItemFeet/LeatherAnkleCuffs/None.png deleted file mode 100644 index 3b301004d..000000000 Binary files a/Screens/Inventory/ItemFeet/LeatherAnkleCuffs/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/NylonRope/Ankles.png b/Screens/Inventory/ItemFeet/NylonRope/Ankles.png deleted file mode 100644 index b05de8633..000000000 Binary files a/Screens/Inventory/ItemFeet/NylonRope/Ankles.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/NylonRope/AnklesKnees.png b/Screens/Inventory/ItemFeet/NylonRope/AnklesKnees.png deleted file mode 100644 index b9b501b0b..000000000 Binary files a/Screens/Inventory/ItemFeet/NylonRope/AnklesKnees.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/NylonRope/BedSpreadEagle.png b/Screens/Inventory/ItemFeet/NylonRope/BedSpreadEagle.png deleted file mode 100644 index fc48c026f..000000000 Binary files a/Screens/Inventory/ItemFeet/NylonRope/BedSpreadEagle.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/NylonRope/Knees.png b/Screens/Inventory/ItemFeet/NylonRope/Knees.png deleted file mode 100644 index 8fecb146d..000000000 Binary files a/Screens/Inventory/ItemFeet/NylonRope/Knees.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/NylonRope/NylonRope.js b/Screens/Inventory/ItemFeet/NylonRope/NylonRope.js deleted file mode 100644 index 9fb6a68e8..000000000 --- a/Screens/Inventory/ItemFeet/NylonRope/NylonRope.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemFeetNylonRopeBeforeDraw(data) { - if (data.Property && data.Property.Type === "BedSpreadEagle") { - return { - X: data.X -125, - Y: data.Y -170, - }; - } - return null; -} diff --git a/Screens/Inventory/ItemFeet/OrnateAnkleCuffs/Chained.png b/Screens/Inventory/ItemFeet/OrnateAnkleCuffs/Chained.png deleted file mode 100644 index 6a48010e4..000000000 Binary files a/Screens/Inventory/ItemFeet/OrnateAnkleCuffs/Chained.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/OrnateAnkleCuffs/Closed.png b/Screens/Inventory/ItemFeet/OrnateAnkleCuffs/Closed.png deleted file mode 100644 index 2c7e812a5..000000000 Binary files a/Screens/Inventory/ItemFeet/OrnateAnkleCuffs/Closed.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/OrnateAnkleCuffs/None.png b/Screens/Inventory/ItemFeet/OrnateAnkleCuffs/None.png deleted file mode 100644 index 2c01b40c7..000000000 Binary files a/Screens/Inventory/ItemFeet/OrnateAnkleCuffs/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/SpreaderMetal/Narrow.png b/Screens/Inventory/ItemFeet/SpreaderMetal/Narrow.png deleted file mode 100644 index 8f5d16fcd..000000000 Binary files a/Screens/Inventory/ItemFeet/SpreaderMetal/Narrow.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/SpreaderMetal/Wide.png b/Screens/Inventory/ItemFeet/SpreaderMetal/Wide.png deleted file mode 100644 index 32c5c4790..000000000 Binary files a/Screens/Inventory/ItemFeet/SpreaderMetal/Wide.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/SpreaderVibratingDildoBar/SpreaderVibratingDildoBar.js b/Screens/Inventory/ItemFeet/SpreaderVibratingDildoBar/SpreaderVibratingDildoBar.js deleted file mode 100644 index fe99476ca..000000000 --- a/Screens/Inventory/ItemFeet/SpreaderVibratingDildoBar/SpreaderVibratingDildoBar.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -function InventoryItemFeetSpreaderVibratingDildoBarLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemFeetSpreaderVibratingDildoBarDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemFeetSpreaderVibratingDildoBarClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemFeetSpreaderVibratingDildoBarScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemFeet/SteelAnkleCuffs/Chained.png b/Screens/Inventory/ItemFeet/SteelAnkleCuffs/Chained.png deleted file mode 100644 index b18b05aba..000000000 Binary files a/Screens/Inventory/ItemFeet/SteelAnkleCuffs/Chained.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/SteelAnkleCuffs/Closed.png b/Screens/Inventory/ItemFeet/SteelAnkleCuffs/Closed.png deleted file mode 100644 index c2c797872..000000000 Binary files a/Screens/Inventory/ItemFeet/SteelAnkleCuffs/Closed.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/SteelAnkleCuffs/None.png b/Screens/Inventory/ItemFeet/SteelAnkleCuffs/None.png deleted file mode 100644 index 49672cd18..000000000 Binary files a/Screens/Inventory/ItemFeet/SteelAnkleCuffs/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/SturdyLeatherBelts/One.png b/Screens/Inventory/ItemFeet/SturdyLeatherBelts/One.png deleted file mode 100644 index fd8cca3e2..000000000 Binary files a/Screens/Inventory/ItemFeet/SturdyLeatherBelts/One.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/SturdyLeatherBelts/Three.png b/Screens/Inventory/ItemFeet/SturdyLeatherBelts/Three.png deleted file mode 100644 index 6ceda8da9..000000000 Binary files a/Screens/Inventory/ItemFeet/SturdyLeatherBelts/Three.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/SturdyLeatherBelts/Two.png b/Screens/Inventory/ItemFeet/SturdyLeatherBelts/Two.png deleted file mode 100644 index 19a506132..000000000 Binary files a/Screens/Inventory/ItemFeet/SturdyLeatherBelts/Two.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/Tentacles/Closed.png b/Screens/Inventory/ItemFeet/Tentacles/Closed.png deleted file mode 100644 index 06196d067..000000000 Binary files a/Screens/Inventory/ItemFeet/Tentacles/Closed.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/Tentacles/Spread.png b/Screens/Inventory/ItemFeet/Tentacles/Spread.png deleted file mode 100644 index 210022468..000000000 Binary files a/Screens/Inventory/ItemFeet/Tentacles/Spread.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/WoodenCuffs/LegsClosed.png b/Screens/Inventory/ItemFeet/WoodenCuffs/LegsClosed.png deleted file mode 100644 index 33570a76d..000000000 Binary files a/Screens/Inventory/ItemFeet/WoodenCuffs/LegsClosed.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/WoodenCuffs/LegsOpen.png b/Screens/Inventory/ItemFeet/WoodenCuffs/LegsOpen.png deleted file mode 100644 index 580e4532d..000000000 Binary files a/Screens/Inventory/ItemFeet/WoodenCuffs/LegsOpen.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/WoodenCuffs/Spread.png b/Screens/Inventory/ItemFeet/WoodenCuffs/Spread.png deleted file mode 100644 index 1d5300747..000000000 Binary files a/Screens/Inventory/ItemFeet/WoodenCuffs/Spread.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/Zipties/ZipFeetFull.png b/Screens/Inventory/ItemFeet/Zipties/ZipFeetFull.png deleted file mode 100644 index 0fc83490b..000000000 Binary files a/Screens/Inventory/ItemFeet/Zipties/ZipFeetFull.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/Zipties/ZipFeetLight.png b/Screens/Inventory/ItemFeet/Zipties/ZipFeetLight.png deleted file mode 100644 index 1c8568cb8..000000000 Binary files a/Screens/Inventory/ItemFeet/Zipties/ZipFeetLight.png and /dev/null differ diff --git a/Screens/Inventory/ItemFeet/Zipties/ZipFeetMedium.png b/Screens/Inventory/ItemFeet/Zipties/ZipFeetMedium.png deleted file mode 100644 index 084512de7..000000000 Binary files a/Screens/Inventory/ItemFeet/Zipties/ZipFeetMedium.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/FuturisticMittens/Gloves.png b/Screens/Inventory/ItemHands/FuturisticMittens/Gloves.png deleted file mode 100644 index 2089fba89..000000000 Binary files a/Screens/Inventory/ItemHands/FuturisticMittens/Gloves.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/FuturisticMittens/Mittens.png b/Screens/Inventory/ItemHands/FuturisticMittens/Mittens.png deleted file mode 100644 index 42626c10d..000000000 Binary files a/Screens/Inventory/ItemHands/FuturisticMittens/Mittens.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/PaddedMittens/AdultBabyHarness.png b/Screens/Inventory/ItemHands/PaddedMittens/AdultBabyHarness.png deleted file mode 100644 index b9579634b..000000000 Binary files a/Screens/Inventory/ItemHands/PaddedMittens/AdultBabyHarness.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/PaddedMittens/PaddedMittens.js b/Screens/Inventory/ItemHands/PaddedMittens/PaddedMittens.js deleted file mode 100644 index b6df1c6d8..000000000 --- a/Screens/Inventory/ItemHands/PaddedMittens/PaddedMittens.js +++ /dev/null @@ -1,52 +0,0 @@ -"use strict"; -var InventoryItemHandsPaddedMittensMsg = null; - -// Loads the item extension properties -function InventoryItemHandsPaddedMittensLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = {}; - InventoryItemHandsPaddedMittensMsg = null; -} - -// Draw the item extension screen -function InventoryItemHandsPaddedMittensDraw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Draw the possible options - DrawText(DialogFindPlayer("SelectFeature"), 1500, 500, "white", "gray"); - DrawPreviewBox(1250, 550, `${AssetGetInventoryPath(DialogFocusItem.Asset)}/AdultBabyHarness.png`, "", {Hover: true}); - DrawText(DialogFindPlayer("mittenstoharness"), 1375, 800, "white", "gray"); - - // Draw the message if present - if (InventoryItemHandsPaddedMittensMsg != null) DrawTextWrap(DialogFindPlayer(InventoryItemHandsPaddedMittensMsg), 1100, 850, 800, 160, "White"); -} - -// Catches the item extension clicks -function InventoryItemHandsPaddedMittensClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; - if ((MouseX >= 1250) && (MouseX <= 1475) && (MouseY >= 550) && (MouseY <= 775)) InventoryItemHandsPaddedMittensChain(); -} - -// Chain/Unchain function -function InventoryItemHandsPaddedMittensChain() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryGet(C, "ItemArms") != null) { - InventoryItemHandsPaddedMittensMsg = "FreeArms"; - return; - } - - if (!CharacterHasItemWithAttribute(C, "CanAttachMittens")) { - InventoryItemHandsPaddedMittensMsg = "NeedHarness"; - return; - } - - InventoryWear(C, "MittenChain1", "ItemArms"); - if (C.ID == 0) ServerPlayerAppearanceSync(); - if (CurrentScreen == "ChatRoom") { - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - ChatRoomPublishCustomAction("MittenChain", true, Dictionary); - ChatRoomCharacterUpdate(C); - } -} diff --git a/Screens/Inventory/ItemHands/PawMittens/AdultBabyHarness.png b/Screens/Inventory/ItemHands/PawMittens/AdultBabyHarness.png deleted file mode 100644 index b9579634b..000000000 Binary files a/Screens/Inventory/ItemHands/PawMittens/AdultBabyHarness.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/PawMittens/PawMittens.js b/Screens/Inventory/ItemHands/PawMittens/PawMittens.js deleted file mode 100644 index 2fed962cf..000000000 --- a/Screens/Inventory/ItemHands/PawMittens/PawMittens.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; -var InventoryItemHandsPawMittensMsg = null; - -// Loads the item extension properties -function InventoryItemHandsPawMittensLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = {}; - InventoryItemHandsPawMittensMsg = null; -} - -// Draw the item extension screen -function InventoryItemHandsPawMittensDraw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Draw the possible options - DrawText(DialogFindPlayer("SelectFeature"), 1500, 500, "white", "gray"); - DrawPreviewBox(1250, 550, `${AssetGetInventoryPath(DialogFocusItem.Asset)}/AdultBabyHarness.png`, "", {Hover: true}); - DrawText(DialogFindPlayer("mittenstoharness"), 1375, 800, "white", "gray"); - - // Draw the message if present - if (InventoryItemHandsPawMittensMsg != null) DrawTextWrap(DialogFindPlayer(InventoryItemHandsPawMittensMsg), 1100, 850, 800, 160, "White"); -} - -// Catches the item extension clicks -function InventoryItemHandsPawMittensClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; - if ((MouseX >= 1250) && (MouseX <= 1475) && (MouseY >= 550) && (MouseY <= 775)) InventoryItemHandsPawMittensChain(); -} - -// Chain/Unchain function -function InventoryItemHandsPawMittensChain() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryGet(C, "ItemArms") == null) { - if (InventoryGet(C, "ItemTorso") != null) { - if (InventoryGet(C, "ItemTorso").Asset.Name == "AdultBabyHarness") { - InventoryWear(C, "MittenChain1", "ItemArms"); - if (C.ID == 0) ServerPlayerAppearanceSync(); - if (CurrentScreen == "ChatRoom") { - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - ChatRoomPublishCustomAction("MittenChain", true, Dictionary); - ChatRoomCharacterUpdate(C); - } - } else InventoryItemHandsPawMittensMsg = "NeedHarness"; - } else InventoryItemHandsPawMittensMsg = "NeedHarness"; - } else InventoryItemHandsPawMittensMsg = "FreeArms"; -} diff --git a/Screens/Inventory/ItemHands/SpankingToys/Baguette.png b/Screens/Inventory/ItemHands/SpankingToys/Baguette.png deleted file mode 100644 index 12a08aafb..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Baguette.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Ballgag.png b/Screens/Inventory/ItemHands/SpankingToys/Ballgag.png deleted file mode 100644 index fcef982f9..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Ballgag.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Belt.png b/Screens/Inventory/ItemHands/SpankingToys/Belt.png deleted file mode 100644 index d57bb1a2e..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Belt.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Broom.png b/Screens/Inventory/ItemHands/SpankingToys/Broom.png deleted file mode 100644 index 189c63dfc..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Broom.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/CandleWax.png b/Screens/Inventory/ItemHands/SpankingToys/CandleWax.png deleted file mode 100644 index 4bdf1a1b1..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/CandleWax.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Cane.png b/Screens/Inventory/ItemHands/SpankingToys/Cane.png deleted file mode 100644 index f49cddf40..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Cane.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/CattleProd.png b/Screens/Inventory/ItemHands/SpankingToys/CattleProd.png deleted file mode 100644 index f5c8fd812..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/CattleProd.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Crop.png b/Screens/Inventory/ItemHands/SpankingToys/Crop.png deleted file mode 100644 index d4f35bff8..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Crop.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/ElectricToothbrush.png b/Screens/Inventory/ItemHands/SpankingToys/ElectricToothbrush.png deleted file mode 100644 index 9dc02668c..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/ElectricToothbrush.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Feather.png b/Screens/Inventory/ItemHands/SpankingToys/Feather.png deleted file mode 100644 index 0237ed6b6..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Feather.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/FeatherDuster.png b/Screens/Inventory/ItemHands/SpankingToys/FeatherDuster.png deleted file mode 100644 index 3d965d047..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/FeatherDuster.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Flogger.png b/Screens/Inventory/ItemHands/SpankingToys/Flogger.png deleted file mode 100644 index 11b2f6431..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Flogger.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Gavel.png b/Screens/Inventory/ItemHands/SpankingToys/Gavel.png deleted file mode 100644 index 97dfefc08..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Gavel.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/GlassEmpty.png b/Screens/Inventory/ItemHands/SpankingToys/GlassEmpty.png deleted file mode 100644 index 2a7bdd20a..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/GlassEmpty.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/GlassFilled.png b/Screens/Inventory/ItemHands/SpankingToys/GlassFilled.png deleted file mode 100644 index 81b3f0f79..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/GlassFilled.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Hairbrush.png b/Screens/Inventory/ItemHands/SpankingToys/Hairbrush.png deleted file mode 100644 index 693ee7dda..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Hairbrush.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/HeartCrop.png b/Screens/Inventory/ItemHands/SpankingToys/HeartCrop.png deleted file mode 100644 index 74243205f..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/HeartCrop.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/IceCube.png b/Screens/Inventory/ItemHands/SpankingToys/IceCube.png deleted file mode 100644 index dfafc4104..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/IceCube.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/LargeDildo.png b/Screens/Inventory/ItemHands/SpankingToys/LargeDildo.png deleted file mode 100644 index ce99cab76..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/LargeDildo.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/LongDuster.png b/Screens/Inventory/ItemHands/SpankingToys/LongDuster.png deleted file mode 100644 index 4e295260e..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/LongDuster.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/LongSock.png b/Screens/Inventory/ItemHands/SpankingToys/LongSock.png deleted file mode 100644 index 44a9a99ab..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/LongSock.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Lotion.png b/Screens/Inventory/ItemHands/SpankingToys/Lotion.png deleted file mode 100644 index 80bc4d65f..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Lotion.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Paddle.png b/Screens/Inventory/ItemHands/SpankingToys/Paddle.png deleted file mode 100644 index 6332ee3fc..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Paddle.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Panties.png b/Screens/Inventory/ItemHands/SpankingToys/Panties.png deleted file mode 100644 index 341b45696..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Panties.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/PetToy.png b/Screens/Inventory/ItemHands/SpankingToys/PetToy.png deleted file mode 100644 index 364f2adf6..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/PetToy.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Phone1.png b/Screens/Inventory/ItemHands/SpankingToys/Phone1.png deleted file mode 100644 index 4a5f8ab6f..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Phone1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Phone2.png b/Screens/Inventory/ItemHands/SpankingToys/Phone2.png deleted file mode 100644 index 4f9452308..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Phone2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/PlasticWrap.png b/Screens/Inventory/ItemHands/SpankingToys/PlasticWrap.png deleted file mode 100644 index bc1dcc82b..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/PlasticWrap.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/PotionBottle.png b/Screens/Inventory/ItemHands/SpankingToys/PotionBottle.png deleted file mode 100644 index e65736eb5..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/PotionBottle.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/RainbowWand.png b/Screens/Inventory/ItemHands/SpankingToys/RainbowWand.png deleted file mode 100644 index 8f2dd72e1..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/RainbowWand.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/RopeCoilLong.png b/Screens/Inventory/ItemHands/SpankingToys/RopeCoilLong.png deleted file mode 100644 index fed45e03d..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/RopeCoilLong.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/RopeCoilShort.png b/Screens/Inventory/ItemHands/SpankingToys/RopeCoilShort.png deleted file mode 100644 index 8c86747a0..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/RopeCoilShort.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Ruler.png b/Screens/Inventory/ItemHands/SpankingToys/Ruler.png deleted file mode 100644 index bef3cd61a..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Ruler.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Scissors.png b/Screens/Inventory/ItemHands/SpankingToys/Scissors.png deleted file mode 100644 index 5a637b5e2..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Scissors.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/ShockRemote.png b/Screens/Inventory/ItemHands/SpankingToys/ShockRemote.png deleted file mode 100644 index 11045ab89..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/ShockRemote.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/ShockWand.png b/Screens/Inventory/ItemHands/SpankingToys/ShockWand.png deleted file mode 100644 index 1eb5dd2e0..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/ShockWand.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/SmallDildo.png b/Screens/Inventory/ItemHands/SpankingToys/SmallDildo.png deleted file mode 100644 index c67859530..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/SmallDildo.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/SmallVibratingWand.png b/Screens/Inventory/ItemHands/SpankingToys/SmallVibratingWand.png deleted file mode 100644 index af0ee968d..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/SmallVibratingWand.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/SpankingToy.js b/Screens/Inventory/ItemHands/SpankingToys/SpankingToy.js deleted file mode 100644 index 60d758c3d..000000000 --- a/Screens/Inventory/ItemHands/SpankingToys/SpankingToy.js +++ /dev/null @@ -1,332 +0,0 @@ -"use strict"; -/** @type { (ExtendedItemOption & { ExpressionTrigger: ExpressionTrigger[] } )[]} */ -const InventoryItemHandsSpankingToysOptions = [ - { - Name: "Crop", - Property: { Type: null }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }] - }, { - Name: "Flogger", - Property: { Type: "Flogger" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }] - }, { - Name: "Cane", - Property: { Type: "Cane" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Eyes", Name: "Wink", Timer: 5 }] - }, { - Name: "HeartCrop", - Property: { Type: "HeartCrop" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }] - }, { - Name: "Paddle", - Property: { Type: "Paddle" }, - ExpressionTrigger: [{ Group: "Blush", Name: "High", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Eyes", Name: "Closed", Timer: 5 }] - }, { - Name: "WhipPaddle", - Property: { Type: "WhipPaddle" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Eyes", Name: "Wink", Timer: 5 }] - }, { - Name: "Whip", - Property: { Type: "Whip" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Eyes", Name: "Wink", Timer: 5 }] - }, { - Name: "CattleProd", - Property: { Type: "CattleProd" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Eyes", Name: "Wink", Timer: 5 }] - }, { - Name: "TennisRacket", - Property: { Type: "TennisRacket" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }] - }, { - Name: "RainbowWand", - Property: { Type: "RainbowWand" }, - ExpressionTrigger: [{ Group: "Eyebrows", Name: "Soft", Timer: 5 }] - }, { - Name: "Gavel", - Property: { Type: "Gavel" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyes", Name: "Closed", Timer: 5 }] - }, { - Name: "Feather", - Property: { Type: "Feather" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, {Group: "Eyes", Name: "Closed", Timer: 10}, { Group: "Mouth", Name: "Grin", Timer: 10}, { Group: "Eyebrows", Name: "Soft", Timer: 10}] - }, { - Name: "FeatherDuster", - Property: { Type: "FeatherDuster" }, - ExpressionTrigger: [{ Group: "Blush", Name: "High", Timer: 10 }, { Group: "Eyes", Name: "Closed", Timer: 10}, { Group: "Mouth", Name: "Laughing", Timer: 10}, { Group: "Eyebrows", Name: "Soft", Timer: 10}] - }, { - Name: "LongDuster", - Property: { Type: "LongDuster" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, { Group: "Eyes", Name: "Closed", Timer: 10}, { Group: "Mouth", Name: "Laughing", Timer: 10}, { Group: "Eyebrows", Name: "Soft", Timer: 10}] - }, { - Name: "IceCube", - Property: { Type: "IceCube" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10}, { Group: "Mouth", Name: "Angry", Timer: 10}, { Group: "Eyes", Name: "Daydream", Timer: 10}, { Group: "Eyebrows", Name: "Soft", Timer: 10}] - }, { - Name: "WartenbergWheel", - Property: { Type: "WartenbergWheel" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10}, { Group: "Eyes", Name: "Daydream", Timer: 10}] - }, { - Name: "VibratingWand", - Property: { Type: "VibratingWand" }, - ExpressionTrigger: [{ Group: "Blush", Name: "High", Timer: 10 }, { Group: "Eyes", Name: "VeryLewd", Timer: 5 }, { Group: "Eyebrows", Name: "Soft", Timer: 10}, { Group: "Mouth", Name: "Open", Timer: 10}] - }, { - Name: "SmallVibratingWand", - Property: { Type: "SmallVibratingWand" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, { Group: "Eyes", Name: "Dazed", Timer: 5 }, { Group: "Eyebrows", Name: "Soft", Timer: 10}, { Group: "Mouth", Name: "HalfOpen", Timer: 10}] - }, { - Name: "CandleWax", - Property: { Type: "CandleWax" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Eyes", Name: "Surprised", Timer: 10}, { Group: "Mouth", Name: "Frown", Timer: 10}] - }, { - Name: "LargeDildo", - Property: { Type: "LargeDildo" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "HalfOpen", Timer: 10}, { Group: "Eyes", Name: "Lewd", Timer: 10}] - }, { - Name: "PetToy", - Property: { Type: "PetToy" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyes", Name: "WinkL", Timer: 10 }, { Group: "Mouth", Name: "Smirk", Timer: 10 }] - },{ - Name: "Vibrator", - Property: { Type: "Vibrator" }, - ExpressionTrigger: [{ Group: "Blush", Name: "High", Timer: 10 }, { Group: "Eyes", Name: "VeryLewd", Timer: 10 }, { Group: "Mouth", Name: "Open", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10}] - },{ - Name: "Belt", - Property: { Type: "Belt" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10}] - }, { - Name: "Hairbrush", - Property: { Type: "Hairbrush" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10}] - }, { - Name: "SmallDildo", - Property: { Type: "SmallDildo" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10}, { Group: "Eyes", Name: "Lewd", Timer: 5 }, ] - }, { - Name: "ElectricToothbrush", - Property: { Type: "ElectricToothbrush" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, {Group: "Eyes", Name: "Closed", Timer: 10}, { Group: "Mouth", Name: "Grin", Timer: 10}, { Group: "Eyebrows", Name: "Soft", Timer: 10}] - }, { - Name: "Toothbrush", - Property: { Type: "Toothbrush" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, {Group: "Eyes", Name: "Closed", Timer: 10}, { Group: "Mouth", Name: "Grin", Timer: 10}, { Group: "Eyebrows", Name: "Soft", Timer: 10}] - }, { - Name: "ShockWand", - Property: { Type: "ShockWand" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Medium", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Eyes", Name: "Wink", Timer: 5 }] - }, { - Name: "Lotion", - Property: { Type: "Lotion" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10 }] - }, { - Name: "Ruler", - Property: { Type: "Ruler" }, - ExpressionTrigger: [{ Group: "Blush", Name: "High", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Eyes", Name: "Closed", Timer: 5 }] - }, { - Name: "Sword", - Property: { Type: "Sword" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 5 }, { Group: "Eyebrows", Name: "Harsh", Timer: 5 }] - }, { - Name: "VibeRemote", - Property: { Type: "VibeRemote" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10 }] - }, { - Name: "ShockRemote", - Property: { Type: "ShockRemote" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10 }] - },{ - Name: "Towel", - Property: { Type: "Towel" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10 }] - },{ - Name: "RopeCoilLong", - Property: { Type: "RopeCoilLong" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10 }] - },{ - Name: "RopeCoilShort", - Property: { Type: "RopeCoilShort" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10 }] - },{ - Name: "Ballgag", - Property: { Type: "Ballgag" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10 }] - },{ - Name: "LongSock", - Property: { Type: "LongSock" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10 }] - },{ - Name: "Baguette", - Property: { Type: "Baguette" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10 }] - },{ - Name: "Panties", - Property: { Type: "Panties" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10 }] - },{ - Name: "TapeRoll", - Property: { Type: "TapeRoll" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }, { Group: "Eyebrows", Name: "Soft", Timer: 10 }, { Group: "Mouth", Name: "Frown", Timer: 10 }] - }, { - Name: "Spatula", - Property: { Type: "Spatula" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 5 }, { Group: "Eyebrows", Name: "Harsh", Timer: 5 }] - }, { - Name: "Broom", - Property: { Type: "Broom" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 5 }, { Group: "Eyebrows", Name: "Harsh", Timer: 5 }] - },{ - Name: "Phone1", - Property: { Type: "Phone1" }, - ExpressionTrigger: [] - },{ - Name: "Phone2", - Property: { Type: "Phone2" }, - ExpressionTrigger: [] - },{ - Name: "Scissors", - Property: { Type: "Scissors" }, - ExpressionTrigger: [] - },{ - - Name: "PlasticWrap", - Property: { Type: "PlasticWrap" }, - ExpressionTrigger: [] - },{ - Name: "GlassEmpty", - Property: { Type: "GlassEmpty" }, - ExpressionTrigger: [] - },{ - Name: "GlassFilled", - Property: { Type: "GlassFilled" }, - ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 5}, { Group: "Mouth", Name: "LipBite", Timer: 5}, { Group: "Eyes", Name: "Lewd", Timer: 5}, { Group: "Eyebrows", Name: "Raised", Timer: 5}] - },{ - Name: "PotionBottle", - Property: { Type: "PotionBottle" }, - ExpressionTrigger: [] - }, -]; - -/** Loads the item extension properties */ -function InventoryItemHandsSpankingToysLoad() { - ExtendedItemLoad(InventorySpankingToysAvailableToys(CharacterGetCurrent()), "SelectSpankingToysType"); -} - -/** Draw the item extension screen */ -function InventoryItemHandsSpankingToysDraw() { - ExtendedItemDraw(InventorySpankingToysAvailableToys(CharacterGetCurrent()), "SpankingToysType"); -} - -/** Catches the item extension clicks */ -function InventoryItemHandsSpankingToysClick() { - ExtendedItemClick(InventorySpankingToysAvailableToys(CharacterGetCurrent())); -} - -/** - * Publishes the message to the chat - * @param {Character} C - The target character - * @param {ExtendedItemOption} Option - The currently selected Option - * @returns {void} - Nothing - */ -function InventoryItemHandsSpankingToysPublishAction(C, Option) { - var msg = C.ID == 0 ? "SpankingToysSetPlayer" : "SpankingToysSetOthers"; - var Dictionary = []; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "TargetCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "ItemUsed", AssetName: "SpankingToys" + Option.Name }); - ChatRoomPublishCustomAction(msg, true, Dictionary); -} - -/** - * The NPC dialog is for what the NPC says to you when you make a change to their restraints - the dialog lookup is on a - * per-NPC basis. You basically put the "AssetName" + OptionName in there to allow individual NPCs to override their default - * "GroupName" dialog if for example we ever wanted an NPC to react specifically to having the restraint put on them. - * That could be done by adding an "AssetName" entry (or entries) to that NPC's dialog CSV - * @param {Character} C - The NPC to whom the restraint is applied - * @param {ExtendedItemOption} Option - The chosen option for this extended item - * @returns {void} - Nothing - */ -function InventoryItemHandsSpankingToysNpcDialog(C, Option) { - C.CurrentDialog = DialogFind(C, "SpankingToys" + Option.Name, "ItemHands"); -} - -/** - * Returns a list of the spanking toys that can be equipped to the character - * @param {Character} C - The character the toy will be given to - * @returns {ExtendedItemOption[]} The subset of SpankingToys options the player can select from - */ -function InventorySpankingToysAvailableToys(C) { - // Toys the player or target character owns - let PlayerToys = Player.Inventory.map(i => i.Name).filter(x => x.match(/SpankingToys\w/)); - let TargetToys = C.Inventory.map(i => i.Name).filter(x => x.match(/SpankingToys\w/)); - let AvailableToys = PlayerToys.concat(TargetToys.filter(T => !PlayerToys.includes(T))); - return InventoryItemHandsSpankingToysOptions.filter(x => AvailableToys.includes("SpankingToys" + x.Name)); -} - -/** - * Get the type of spanking toy that the character is holding - * @param {Character} C - * @returns {string} - */ -function InventorySpankingToysGetType(C) { - var Toy = InventoryGet(C, "ItemHands"); - if (Toy && Toy.Asset.Name === "SpankingToys" && Toy.Property && Toy.Property.Type) return Toy.Property.Type; - else return "Crop"; -} - -/** - * Get the description of the spanking toy that the character is holding - * @param {Character} C - * @returns {string} - */ -function InventorySpankingToysGetDescription(C) { - var ToyDescription = null; - var Toy = InventoryGet(C, "ItemHands"); - if (Toy != null) { - ToyDescription = "Crop"; - if (Toy.Property && Toy.Property.Type) { - var A = AssetGet(C.AssetFamily, "ItemHands", "SpankingToys" + Toy.Property.Type); - if (A != null) ToyDescription = A.Description; - } - } - return ToyDescription || "Handheld Item"; -} - -/** - * Get the activity of the spanking toy that the character is holding - * @param {Character} C - * @returns {string | null} - */ -function InventorySpankingToysGetActivity(C) { - var Type = InventorySpankingToysGetType(C); - var A = AssetGet(C.AssetFamily, "ItemHands", "SpankingToys" + Type); - return A && A.Activity || A && A.AllowActivity[0] || null; -} - -/** - * Determine whether an item activity is allowed on the selected region - * @param {Character} C - * @returns {boolean} - */ -function InventorySpankingToysActivityAllowed(C) { - const Type = InventorySpankingToysGetType(Player); - const A = AssetGet(C.AssetFamily, "ItemHands", "SpankingToys" + Type); - if (InventoryBlockedOrLimited(C, { Asset: A })) - return false; - if (C.FocusGroup != null && A.AllowActivity) { - return A.AllowActivity.some(itemAct => { - return ActivityAllowedForGroup(C, C.FocusGroup.Name, true) - .some(act => itemAct === act.Name); - }); - } - return false; -} - -/** - * Returns the audio sound to be played - * @param {Character} C - * @returns {string} - */ -function InventorySpankingToysGetAudio(C) { - const Type = InventorySpankingToysGetType(C); - const A = AssetGet(C.AssetFamily, "ItemHands", "SpankingToys" + Type); - return A && A.Audio; -} diff --git a/Screens/Inventory/ItemHands/SpankingToys/Spatula.png b/Screens/Inventory/ItemHands/SpankingToys/Spatula.png deleted file mode 100644 index 04ac78488..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Spatula.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Sword.png b/Screens/Inventory/ItemHands/SpankingToys/Sword.png deleted file mode 100644 index d04dfbef3..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Sword.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/TapeRoll.png b/Screens/Inventory/ItemHands/SpankingToys/TapeRoll.png deleted file mode 100644 index 33caa32b6..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/TapeRoll.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/TennisRacket.png b/Screens/Inventory/ItemHands/SpankingToys/TennisRacket.png deleted file mode 100644 index 8f4d1f71b..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/TennisRacket.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Toothbrush.png b/Screens/Inventory/ItemHands/SpankingToys/Toothbrush.png deleted file mode 100644 index 4191ff9d5..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Toothbrush.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Towel.png b/Screens/Inventory/ItemHands/SpankingToys/Towel.png deleted file mode 100644 index 023bef1a0..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Towel.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/VibeRemote.png b/Screens/Inventory/ItemHands/SpankingToys/VibeRemote.png deleted file mode 100644 index 04fa6a732..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/VibeRemote.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/VibratingWand.png b/Screens/Inventory/ItemHands/SpankingToys/VibratingWand.png deleted file mode 100644 index f20eac559..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/VibratingWand.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Vibrator.png b/Screens/Inventory/ItemHands/SpankingToys/Vibrator.png deleted file mode 100644 index a1b3b30bc..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Vibrator.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/WartenbergWheel.png b/Screens/Inventory/ItemHands/SpankingToys/WartenbergWheel.png deleted file mode 100644 index 051d61782..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/WartenbergWheel.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/Whip.png b/Screens/Inventory/ItemHands/SpankingToys/Whip.png deleted file mode 100644 index 8a442fb13..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/Whip.png and /dev/null differ diff --git a/Screens/Inventory/ItemHands/SpankingToys/WhipPaddle.png b/Screens/Inventory/ItemHands/SpankingToys/WhipPaddle.png deleted file mode 100644 index 1aca5ec1f..000000000 Binary files a/Screens/Inventory/ItemHands/SpankingToys/WhipPaddle.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/DroneMask.js b/Screens/Inventory/ItemHead/DroneMask/DroneMask.js deleted file mode 100644 index df20ddb96..000000000 --- a/Screens/Inventory/ItemHead/DroneMask/DroneMask.js +++ /dev/null @@ -1,151 +0,0 @@ -//Heavily References Bib.js and Transport Jacket -"use strict"; -let InventoryItemHeadDroneMaskOriginalText = ""; -//let DroneMaskPreviousText = null; -const InventoryItemHeadDroneMaskInputId = "DroneMaskText"; -const InventoryItemHeadDroneMaskFont = "Impact"; -const InventoryItemHeadDroneMaskAllowedChars = /^[a-zA-Z0-9 ~!]*$/; -const InventoryItemHeadDroneMaskMaxChars = 16; -var InventoryItemHeadDroneMaskYOffset = 89; // For testing text position for those with longer hair - -// Load item extension properties -function InventoryItemHeadDroneMaskPattern5Load() { - InventoryItemHeadDroneMaskOriginalText = DialogFocusItem.Property.Text; - InventoryItemHeadDroneMaskPattern5LoadBase(); -} - -function InventoryItemHeadDroneMaskPattern5LoadBase() { - - const C = CharacterGetCurrent(); - - // Dynamically displayed input - const input = ElementCreateInput( - InventoryItemHeadDroneMaskInputId, "text", DialogFocusItem.Property.Text || "", - InventoryItemHeadDroneMaskMaxChars.toString(), - ); - if (input) { - input.pattern = DynamicDrawTextInputPattern; - input.addEventListener("input", (e) => InventoryItemHeadDroneMaskTextChange(C, DialogFocusItem, e.target.value)) - } -} - -// Draw extension screen image -function InventoryItemHeadDroneMaskPattern5Draw() { - // Draw header and item - DrawAssetPreview(1387,125, DialogFocusItem.Asset); - - // Tag data - ElementPosition (InventoryItemHeadDroneMaskInputId, 1505, 600, 250); - DrawButton(1330,731,340,64, DialogFindPlayer("CustomTagText"), (ElementValue(InventoryItemHeadDroneMaskInputId)).match(InventoryItemHeadDroneMaskAllowedChars) ? "White" : "#888", ""); -} - -// Click function -function InventoryItemHeadDroneMaskPattern5Click() { - if (MouseIn(1330, 731, 340, 64)) { - InventoryItemHeadDroneMaskPattern5SaveAndExit(InventoryItemHeadDroneMaskOriginalText); - InventoryItemHeadDroneMaskPattern5ExitSubscreen(); - } - // Exits screen - else if (MouseIn(1885, 25, 90, 90)) { - InventoryItemHeadDroneMaskPattern5Exit(InventoryItemHeadDroneMaskOriginalText); - InventoryItemHeadDroneMaskPattern5ExitSubscreen(); - } -} - -// Exit the subscreen -function InventoryItemHeadDroneMaskPattern5ExitSubscreen() { - ElementRemove(InventoryItemHeadDroneMaskInputId); - InventoryItemHeadDroneMaskOriginalText = ""; - ExtendedItemSubscreen = null; -} - -// Save text changes and exit subscreen -function InventoryItemHeadDroneMaskPattern5SaveAndExit(OriginalText) { - const C = CharacterGetCurrent(); - const item = DialogFocusItem; - - const text = ElementValue(InventoryItemHeadDroneMaskInputId).substring(0, InventoryItemHeadDroneMaskMaxChars); - if (InventoryItemHeadDroneMaskAllowedChars.test(text)) { - item.Property.Text = text; - } - if (CurrentScreen === "ChatRoom" && text !== OriginalText) { - const dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "NewText", Text: text }, - { Tag: "AssetName", AssetName: item.Asset.Name }, - ]; - const msg = text === "" ? "ItemHeadDroneMaskTextRemove" : "ItemHeadDroneMaskTextChange"; - ChatRoomPublishCustomAction(msg, false, dictionary); - } - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, item.Asset.Group.Name); -} - -// Revert text changes and exit subscreen -function InventoryItemHeadDroneMaskPattern5Exit(OriginalText) { - DialogFocusItem.Property.Text = OriginalText; - CharacterLoadCanvas(CharacterGetCurrent()); -} - -// Exit the item's extended screen -function InventoryItemHeadDroneMaskExit() { - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild(CharacterGetCurrent()); - return ExtendedItemExit(); -} - -// Referenced from TransportJacket for dynamic display -const InventoryItemHeadDroneMaskTextChange = CommonLimitFunction((C, item, text) => { - item = DialogFocusItem || item; - if (DynamicDrawTextRegex.test(text)) { - item.Property.Text = text.substring(0, InventoryItemHeadDroneMaskMaxChars); - CharacterLoadCanvas(C); - } -}); - -/** @type {DynamicAfterDrawCallback} */ -function AssetsItemHeadDroneMaskAfterDraw({ - C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color -}) { - const YOffset = InventoryItemHeadDroneMaskYOffset; - AssetsItemHeadDroneMaskAfterDrawBase({ - C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color, YOffset, - }) -} - -function AssetsItemHeadDroneMaskAfterDrawBase({ - C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color, YOffset, -}) { - if (L === "_Text"){ - const Properties = Property || {}; - const Type = Properties.Type || "p0"; - if (!Type.includes("p5")) return; - - // Canvas setup - let Height = 65; - let Width = 65; - let XOffset = 67; - // let YOffset = 89; - const FontName = InventoryItemHeadDroneMaskFont; - const TempCanvas = AnimationGenerateTempCanvas(C, A, Width, Height); - - const text = Property && typeof Property.Text === "string" && InventoryItemHeadDroneMaskAllowedChars.test(Property.Text) ? Property.Text : ""; - const isAlone = !text; - - const drawOptions = { - fontSize: 20, - fontFamily: FontName, - color: Color, - width: Width, - }; - - // Draw the text onto the canvas - let ctx = TempCanvas.getContext('2d'); - DynamicDrawText(text, ctx, Width/2, Height/ (isAlone? 2: 2.5), drawOptions); - - //And print the canvas onto the character based on the above positions - drawCanvas(TempCanvas, X+ XOffset, Y + YOffset, AlphaMasks); - drawCanvasBlink(TempCanvas, X + XOffset, Y + YOffset, AlphaMasks); - } -} diff --git a/Screens/Inventory/ItemHead/DroneMask/e0.png b/Screens/Inventory/ItemHead/DroneMask/e0.png deleted file mode 100644 index 763b89ae0..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/e0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/e1.png b/Screens/Inventory/ItemHead/DroneMask/e1.png deleted file mode 100644 index 527eff61d..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/e1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/e2.png b/Screens/Inventory/ItemHead/DroneMask/e2.png deleted file mode 100644 index ebdc71944..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/e2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/e3.png b/Screens/Inventory/ItemHead/DroneMask/e3.png deleted file mode 100644 index 317d43756..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/e3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/e4.png b/Screens/Inventory/ItemHead/DroneMask/e4.png deleted file mode 100644 index 6c8460f2c..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/e4.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/e5.png b/Screens/Inventory/ItemHead/DroneMask/e5.png deleted file mode 100644 index e63122731..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/e5.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/e6.png b/Screens/Inventory/ItemHead/DroneMask/e6.png deleted file mode 100644 index 1c1d5ee98..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/e6.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/g0.png b/Screens/Inventory/ItemHead/DroneMask/g0.png deleted file mode 100644 index 3adb93cfd..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/g0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/g1.png b/Screens/Inventory/ItemHead/DroneMask/g1.png deleted file mode 100644 index c8feaf6be..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/g1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/h0.png b/Screens/Inventory/ItemHead/DroneMask/h0.png deleted file mode 100644 index b962e9c2c..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/h0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/h1.png b/Screens/Inventory/ItemHead/DroneMask/h1.png deleted file mode 100644 index 32d444ea4..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/h1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/h2.png b/Screens/Inventory/ItemHead/DroneMask/h2.png deleted file mode 100644 index 915f87111..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/h2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/m0.png b/Screens/Inventory/ItemHead/DroneMask/m0.png deleted file mode 100644 index d069840e8..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/m0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/m1.png b/Screens/Inventory/ItemHead/DroneMask/m1.png deleted file mode 100644 index a53702daa..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/m1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/m2.png b/Screens/Inventory/ItemHead/DroneMask/m2.png deleted file mode 100644 index 6bc94552e..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/m2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/m3.png b/Screens/Inventory/ItemHead/DroneMask/m3.png deleted file mode 100644 index f3d983cdc..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/m3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/m4.png b/Screens/Inventory/ItemHead/DroneMask/m4.png deleted file mode 100644 index 123511998..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/m4.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/m5.png b/Screens/Inventory/ItemHead/DroneMask/m5.png deleted file mode 100644 index fb0ca98e6..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/m5.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/p0.png b/Screens/Inventory/ItemHead/DroneMask/p0.png deleted file mode 100644 index 8972bfe69..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/p0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/p1.png b/Screens/Inventory/ItemHead/DroneMask/p1.png deleted file mode 100644 index 32c98cf87..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/p1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/p2.png b/Screens/Inventory/ItemHead/DroneMask/p2.png deleted file mode 100644 index 644e1034a..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/p2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/p3.png b/Screens/Inventory/ItemHead/DroneMask/p3.png deleted file mode 100644 index 54346e957..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/p3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/p4.png b/Screens/Inventory/ItemHead/DroneMask/p4.png deleted file mode 100644 index 7675ab62f..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/p4.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/p5.png b/Screens/Inventory/ItemHead/DroneMask/p5.png deleted file mode 100644 index 72492a12f..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/p5.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/s0.png b/Screens/Inventory/ItemHead/DroneMask/s0.png deleted file mode 100644 index ec0276783..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/s0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DroneMask/s1.png b/Screens/Inventory/ItemHead/DroneMask/s1.png deleted file mode 100644 index 3bb5048ad..000000000 Binary files a/Screens/Inventory/ItemHead/DroneMask/s1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DuctTape/Double.png b/Screens/Inventory/ItemHead/DuctTape/Double.png deleted file mode 100644 index 191608209..000000000 Binary files a/Screens/Inventory/ItemHead/DuctTape/Double.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DuctTape/Mummy.png b/Screens/Inventory/ItemHead/DuctTape/Mummy.png deleted file mode 100644 index cf845f4c5..000000000 Binary files a/Screens/Inventory/ItemHead/DuctTape/Mummy.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DuctTape/Open.png b/Screens/Inventory/ItemHead/DuctTape/Open.png deleted file mode 100644 index e2054cc5d..000000000 Binary files a/Screens/Inventory/ItemHead/DuctTape/Open.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/DuctTape/Wrap.png b/Screens/Inventory/ItemHead/DuctTape/Wrap.png deleted file mode 100644 index dbc806d92..000000000 Binary files a/Screens/Inventory/ItemHead/DuctTape/Wrap.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/FuturisticMask/Blind.png b/Screens/Inventory/ItemHead/FuturisticMask/Blind.png deleted file mode 100644 index ad9e3eadf..000000000 Binary files a/Screens/Inventory/ItemHead/FuturisticMask/Blind.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/FuturisticMask/HeavyTint.png b/Screens/Inventory/ItemHead/FuturisticMask/HeavyTint.png deleted file mode 100644 index feaa9eb52..000000000 Binary files a/Screens/Inventory/ItemHead/FuturisticMask/HeavyTint.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/FuturisticMask/LightTint.png b/Screens/Inventory/ItemHead/FuturisticMask/LightTint.png deleted file mode 100644 index 7a4a06e1d..000000000 Binary files a/Screens/Inventory/ItemHead/FuturisticMask/LightTint.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/FuturisticMask/Transparent.png b/Screens/Inventory/ItemHead/FuturisticMask/Transparent.png deleted file mode 100644 index 20a79519b..000000000 Binary files a/Screens/Inventory/ItemHead/FuturisticMask/Transparent.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b0.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/b0.png deleted file mode 100644 index 0688d950e..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b1.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/b1.png deleted file mode 100644 index 2ff1a164b..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b2.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/b2.png deleted file mode 100644 index ed22932d9..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b3.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/b3.png deleted file mode 100644 index 9532124fd..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b4.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/b4.png deleted file mode 100644 index b9e30ece7..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b4.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b5.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/b5.png deleted file mode 100644 index 36004e4ef..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/b5.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/f0.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/f0.png deleted file mode 100644 index e87b3b83f..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/f0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/f1.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/f1.png deleted file mode 100644 index 0688d950e..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/f1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/f2.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/f2.png deleted file mode 100644 index 20869ef91..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/f2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/f3.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/f3.png deleted file mode 100644 index a6545f8e5..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/f3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/g0.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/g0.png deleted file mode 100644 index 9990b6938..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/g0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVRHeadset/g1.png b/Screens/Inventory/ItemHead/InteractiveVRHeadset/g1.png deleted file mode 100644 index 8980fff7e..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVRHeadset/g1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVisor/Blind.png b/Screens/Inventory/ItemHead/InteractiveVisor/Blind.png deleted file mode 100644 index e92878f05..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVisor/Blind.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVisor/HeavyTint.png b/Screens/Inventory/ItemHead/InteractiveVisor/HeavyTint.png deleted file mode 100644 index 39945b35f..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVisor/HeavyTint.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVisor/InteractiveVisor.js b/Screens/Inventory/ItemHead/InteractiveVisor/InteractiveVisor.js deleted file mode 100644 index 8532330e5..000000000 --- a/Screens/Inventory/ItemHead/InteractiveVisor/InteractiveVisor.js +++ /dev/null @@ -1,80 +0,0 @@ -"use strict"; - -var InventoryItemHeadInteractiveVisorOptions = [ - { - Name: "Transparent", - Property: { - Type: null, - SelfUnlock: true, - Effect: [], - }, - }, - { - Name: "LightTint", - Property: { - Type: "LightTint", - Effect: ["BlindLight", "Prone"], - }, - }, - { - Name: "HeavyTint", - Property: { - Type: "HeavyTint", - Effect: ["BlindNormal", "Prone"], - }, - }, - { - Name: "Blind", - Property: { - Type: "Blind", - Effect: ["BlindHeavy", "Prone"], - }, - }, -]; - -function InventoryItemHeadInteractiveVisorLoad() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticLoadAccessDenied(); - } else - ExtendedItemLoad(InventoryItemHeadInteractiveVisorOptions, "SelectVisorType"); -} - -function InventoryItemHeadInteractiveVisorDraw() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticDrawAccessDenied(); - } else - ExtendedItemDraw(InventoryItemHeadInteractiveVisorOptions, "InteractiveVisorHeadType"); -} - -function InventoryItemHeadInteractiveVisorClick() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticClickAccessDenied(); - } else - ExtendedItemClick(InventoryItemHeadInteractiveVisorOptions); -} - -function InventoryItemHeadInteractiveVisorPublishAction(C, Option) { - var Message = "InteractiveVisorHeadSet" + Option.Name; - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "TargetCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - ChatRoomPublishCustomAction(Message, true, Dictionary); -} - - -function InventoryItemHeadInteractiveVisorExit() { - InventoryItemFuturisticExitAccessDenied(); -} - -function InventoryItemHeadInteractiveVisorValidate(C, Item) { - return InventoryItemFuturisticValidate(C, Item); // All futuristic items refer to the gag -} - -function InventoryItemHeadInteractiveVisorNpcDialog(C, Option) { - C.CurrentDialog = DialogFind(C, "ItemHeadInteractiveVisor" + Option.Name, "ItemHead"); -} diff --git a/Screens/Inventory/ItemHead/InteractiveVisor/LightTint.png b/Screens/Inventory/ItemHead/InteractiveVisor/LightTint.png deleted file mode 100644 index 7123d90e4..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVisor/LightTint.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/InteractiveVisor/Transparent.png b/Screens/Inventory/ItemHead/InteractiveVisor/Transparent.png deleted file mode 100644 index 0b15f91ae..000000000 Binary files a/Screens/Inventory/ItemHead/InteractiveVisor/Transparent.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/e0.png b/Screens/Inventory/ItemHead/MedicalPatch/e0.png deleted file mode 100644 index 53b99b44c..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/e0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/e1.png b/Screens/Inventory/ItemHead/MedicalPatch/e1.png deleted file mode 100644 index 5437454a4..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/e1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/e2.png b/Screens/Inventory/ItemHead/MedicalPatch/e2.png deleted file mode 100644 index 9480e0794..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/e2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/l0.png b/Screens/Inventory/ItemHead/MedicalPatch/l0.png deleted file mode 100644 index eb254a5b7..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/l0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/l1.png b/Screens/Inventory/ItemHead/MedicalPatch/l1.png deleted file mode 100644 index 71ea5b448..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/l1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/l2.png b/Screens/Inventory/ItemHead/MedicalPatch/l2.png deleted file mode 100644 index ad161ac1a..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/l2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/l3.png b/Screens/Inventory/ItemHead/MedicalPatch/l3.png deleted file mode 100644 index 0b40cc5ae..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/l3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/l4.png b/Screens/Inventory/ItemHead/MedicalPatch/l4.png deleted file mode 100644 index d594de4f5..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/l4.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/r0.png b/Screens/Inventory/ItemHead/MedicalPatch/r0.png deleted file mode 100644 index ec838414f..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/r0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/r1.png b/Screens/Inventory/ItemHead/MedicalPatch/r1.png deleted file mode 100644 index aca1dbb6c..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/r1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/r2.png b/Screens/Inventory/ItemHead/MedicalPatch/r2.png deleted file mode 100644 index fed8b0b46..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/r2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/r3.png b/Screens/Inventory/ItemHead/MedicalPatch/r3.png deleted file mode 100644 index bb7c21cca..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/r3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/MedicalPatch/r4.png b/Screens/Inventory/ItemHead/MedicalPatch/r4.png deleted file mode 100644 index c823c6508..000000000 Binary files a/Screens/Inventory/ItemHead/MedicalPatch/r4.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Ribbons/Basic.png b/Screens/Inventory/ItemHead/Ribbons/Basic.png deleted file mode 100644 index 44d8429c7..000000000 Binary files a/Screens/Inventory/ItemHead/Ribbons/Basic.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Ribbons/Blindfold.png b/Screens/Inventory/ItemHead/Ribbons/Blindfold.png deleted file mode 100644 index fcafca975..000000000 Binary files a/Screens/Inventory/ItemHead/Ribbons/Blindfold.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Ribbons/Wrap.png b/Screens/Inventory/ItemHead/Ribbons/Wrap.png deleted file mode 100644 index 0fa753162..000000000 Binary files a/Screens/Inventory/ItemHead/Ribbons/Wrap.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Stitches/l0.png b/Screens/Inventory/ItemHead/Stitches/l0.png deleted file mode 100644 index 9547f1687..000000000 Binary files a/Screens/Inventory/ItemHead/Stitches/l0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Stitches/l1.png b/Screens/Inventory/ItemHead/Stitches/l1.png deleted file mode 100644 index 184685e0a..000000000 Binary files a/Screens/Inventory/ItemHead/Stitches/l1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Stitches/l2.png b/Screens/Inventory/ItemHead/Stitches/l2.png deleted file mode 100644 index 82ac081a5..000000000 Binary files a/Screens/Inventory/ItemHead/Stitches/l2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Stitches/l3.png b/Screens/Inventory/ItemHead/Stitches/l3.png deleted file mode 100644 index a2e5026b9..000000000 Binary files a/Screens/Inventory/ItemHead/Stitches/l3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Stitches/m0.png b/Screens/Inventory/ItemHead/Stitches/m0.png deleted file mode 100644 index 70647f920..000000000 Binary files a/Screens/Inventory/ItemHead/Stitches/m0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Stitches/m1.png b/Screens/Inventory/ItemHead/Stitches/m1.png deleted file mode 100644 index 9547f1687..000000000 Binary files a/Screens/Inventory/ItemHead/Stitches/m1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Stitches/m2.png b/Screens/Inventory/ItemHead/Stitches/m2.png deleted file mode 100644 index 9dbc3ce6e..000000000 Binary files a/Screens/Inventory/ItemHead/Stitches/m2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Stitches/r0.png b/Screens/Inventory/ItemHead/Stitches/r0.png deleted file mode 100644 index 70647f920..000000000 Binary files a/Screens/Inventory/ItemHead/Stitches/r0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Stitches/r1.png b/Screens/Inventory/ItemHead/Stitches/r1.png deleted file mode 100644 index 9b1149cd5..000000000 Binary files a/Screens/Inventory/ItemHead/Stitches/r1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Stitches/r2.png b/Screens/Inventory/ItemHead/Stitches/r2.png deleted file mode 100644 index 2a41adfb4..000000000 Binary files a/Screens/Inventory/ItemHead/Stitches/r2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/Stitches/r3.png b/Screens/Inventory/ItemHead/Stitches/r3.png deleted file mode 100644 index 72089a01f..000000000 Binary files a/Screens/Inventory/ItemHead/Stitches/r3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/WebBlindfold/Blindfold.png b/Screens/Inventory/ItemHead/WebBlindfold/Blindfold.png deleted file mode 100644 index fcafca975..000000000 Binary files a/Screens/Inventory/ItemHead/WebBlindfold/Blindfold.png and /dev/null differ diff --git a/Screens/Inventory/ItemHead/WebBlindfold/Cocoon.png b/Screens/Inventory/ItemHead/WebBlindfold/Cocoon.png deleted file mode 100644 index 67684f7b1..000000000 Binary files a/Screens/Inventory/ItemHead/WebBlindfold/Cocoon.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/CanvasHood/CanvasHood.js b/Screens/Inventory/ItemHood/CanvasHood/CanvasHood.js deleted file mode 100644 index 5d0def1a2..000000000 --- a/Screens/Inventory/ItemHood/CanvasHood/CanvasHood.js +++ /dev/null @@ -1,134 +0,0 @@ -"use strict"; -const InventoryItemHoodCanvasHoodAllowedChars = /^(?:\w|[ ~!$#%*+])*$/; -const InventoryItemHoodCanvasHoodMaxLength = 12; -const InventoryItemHoodCanvasHoodInputId = "InventoryItemHoodCanvasHoodText"; -const InventoryItemHoodCanvasHoodFont = "'Saira Stencil One', 'Arial', sans-serif"; - -/** - * Loads the canvas hood's extended item properties - * @returns {void} - Nothing - */ -function InventoryItemHoodCanvasHoodLoad() { - // Load the font - DynamicDrawLoadFont(InventoryItemHoodCanvasHoodFont); - - const C = CharacterGetCurrent(); - let MustRefresh = false; - - /** @type {ItemProperties} */ - const Property = DialogFocusItem.Property = DialogFocusItem.Property || {}; - if (typeof Property.Text !== "string") { - Property.Text = ""; - MustRefresh = true; - } - - if (MustRefresh) { - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, DialogFocusItem.Asset.Group.Name); - } - - ElementCreateInput(InventoryItemHoodCanvasHoodInputId, "text", Property.Text, InventoryItemHoodCanvasHoodMaxLength); -} - -/** - * Draw handler for the canvas hood's extended item screen - * @returns {void} - Nothing - */ -function InventoryItemHoodCanvasHoodDraw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - const updateAllowed = InventoryItemHoodCanvasHoodAllowedChars.test(InventoryItemHoodCanvasHoodGetText()); - DrawTextFit(DialogFindPlayer("CanvasHoodLabel"), 1505, 620, 350, "#fff", "#000"); - ElementPosition(InventoryItemHoodCanvasHoodInputId, 1505, 680, 350); - DrawButton(1330, 731, 340, 64, DialogFindPlayer("SaveText"), updateAllowed ? "White" : "#888", ""); -} - -/** - * Click handler for the canvas hood's extended item screen - * @returns {void} - Nothing - */ -function InventoryItemHoodCanvasHoodClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - return InventoryItemHoodCanvasHoodExit(); - } - - const text = InventoryItemHoodCanvasHoodGetText(); - if (MouseIn(1330, 731, 340, 64) && InventoryItemHoodCanvasHoodAllowedChars.test(text)) { - DialogFocusItem.Property.Text = text; - InventoryItemHoodCanvasHoodChange(text); - } -} - -/** - * Exits the canvas hood's extended item screen and cleans up inputs and text - * @returns {void} - Nothing - */ -function InventoryItemHoodCanvasHoodExit() { - ElementRemove(InventoryItemHoodCanvasHoodInputId); - PreferenceMessage = ""; - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild(CharacterGetCurrent()); -} - -/** - * Handles canvas hood text changes. Refreshes the character and sends an - * appropriate chatroom message - * @returns {void} - Nothing - */ -function InventoryItemHoodCanvasHoodChange(text) { - var C = CharacterGetCurrent(); - CharacterRefresh(C); - if (CurrentScreen == "ChatRoom") { - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "NewText", Text: text } - ]; - ChatRoomPublishCustomAction("CanvasHoodChange", true, Dictionary); - InventoryItemHoodCanvasHoodExit(); - } -} - -/** - * Fetches the current input text, trimmed appropriately - * @returns {string} - The text in the canvas hood's input element - */ -function InventoryItemHoodCanvasHoodGetText() { - return ElementValue(InventoryItemHoodCanvasHoodInputId).substring(0, InventoryItemHoodCanvasHoodMaxLength); -} - -/** - * Post-render drawing function. Draws custom text in a slight arc to mimic the - * curvature of the character's head. - * @type {DynamicAfterDrawCallback} - */ -function AssetsItemHoodCanvasHoodAfterDraw({ C, A, X, Y, L, Property, drawCanvas, drawCanvasBlink, AlphaMasks, Color }) { - if (L === "_Text") { - // Fetch the text property and assert that it matches the character - // and length requirements - let text = Property && typeof Property.Text === "string" && InventoryItemHoodCanvasHoodAllowedChars.test(Property.Text) ? Property.Text : ""; - text = text.substring(0, InventoryItemHoodCanvasHoodMaxLength); - - // Prepare a temporary canvas to draw the text to - const height = 50; - const width = 120; - const tempCanvas = AnimationGenerateTempCanvas(C, A, width, height); - const ctx = tempCanvas.getContext("2d"); - - DynamicDrawTextArc(text, ctx, width / 2, height / 2, { - fontSize: 36, - fontFamily: InventoryItemHoodCanvasHoodFont, - width, - color: Color, - }); - - const drawX = X + (200 - width) / 2; - const drawY = Y + 80; - - // Draw the temporary canvas onto the main canvas - drawCanvas(tempCanvas, drawX, drawY, AlphaMasks); - drawCanvasBlink(tempCanvas, drawX, drawY, AlphaMasks); - } -} diff --git a/Screens/Inventory/ItemHood/DroneMask/DroneMask.js b/Screens/Inventory/ItemHood/DroneMask/DroneMask.js deleted file mode 100644 index f76f0eba1..000000000 --- a/Screens/Inventory/ItemHood/DroneMask/DroneMask.js +++ /dev/null @@ -1,51 +0,0 @@ -// Wrap around the itemHead/DroneMask/DroneMask.js code as much as possible - -"use strict"; -let InventoryItemHoodDroneMaskOriginalText = ""; -var InventoryItemHoodDroneMaskYOffset = 89; // For testing text position for those with longer hair - -// Load item extension properties -function InventoryItemHoodDroneMaskPattern5Load() { - InventoryItemHoodDroneMaskOriginalText = DialogFocusItem.Property.Text; - InventoryItemHeadDroneMaskPattern5LoadBase(); -} - -// Draw extension screen image -function InventoryItemHoodDroneMaskPattern5Draw() { - InventoryItemHeadDroneMaskPattern5Draw(); -} - -// Click function -function InventoryItemHoodDroneMaskPattern5Click() { - if (MouseIn(1330, 731, 340, 64)) { - InventoryItemHeadDroneMaskPattern5SaveAndExit(InventoryItemHoodDroneMaskOriginalText); - InventoryItemHoodDroneMaskPattern5ExitSubscreen(); - } - // Exits screen - else if (MouseIn(1885, 25, 90, 90)) { - InventoryItemHeadDroneMaskPattern5Exit(InventoryItemHoodDroneMaskOriginalText); - InventoryItemHoodDroneMaskPattern5ExitSubscreen(); - } -} - -// Exit the subscreen -function InventoryItemHoodDroneMaskPattern5ExitSubscreen() { - ElementRemove(InventoryItemHeadDroneMaskInputId); - InventoryItemHoodDroneMaskOriginalText = ""; - ExtendedItemSubscreen = null; -} - -// Exit the item's extended screen -function InventoryItemHoodDroneMaskExit() { - InventoryItemHeadDroneMaskExit(); -} - -/** @type {DynamicAfterDrawCallback} */ -function AssetsItemHoodDroneMaskAfterDraw({ - C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color, -}) { - let YOffset = InventoryItemHoodDroneMaskYOffset; - AssetsItemHeadDroneMaskAfterDrawBase({ - C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color, YOffset, - }) -} diff --git a/Screens/Inventory/ItemHood/KirugumiMask/b0.png b/Screens/Inventory/ItemHood/KirugumiMask/b0.png deleted file mode 100644 index 0712b762f..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/b0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/b1.png b/Screens/Inventory/ItemHood/KirugumiMask/b1.png deleted file mode 100644 index 3c371e626..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/b1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/b2.png b/Screens/Inventory/ItemHood/KirugumiMask/b2.png deleted file mode 100644 index 812800df7..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/b2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/b3.png b/Screens/Inventory/ItemHood/KirugumiMask/b3.png deleted file mode 100644 index 8f970418a..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/b3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/br0.png b/Screens/Inventory/ItemHood/KirugumiMask/br0.png deleted file mode 100644 index 4aa641851..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/br0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/br1.png b/Screens/Inventory/ItemHood/KirugumiMask/br1.png deleted file mode 100644 index 203e9002e..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/br1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/br2.png b/Screens/Inventory/ItemHood/KirugumiMask/br2.png deleted file mode 100644 index c10126b3b..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/br2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/br3.png b/Screens/Inventory/ItemHood/KirugumiMask/br3.png deleted file mode 100644 index 8bdad8900..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/br3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/e0.png b/Screens/Inventory/ItemHood/KirugumiMask/e0.png deleted file mode 100644 index 232b9bee4..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/e0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/e1.png b/Screens/Inventory/ItemHood/KirugumiMask/e1.png deleted file mode 100644 index dd4a3869f..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/e1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/e2.png b/Screens/Inventory/ItemHood/KirugumiMask/e2.png deleted file mode 100644 index b7f461241..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/e2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/e3.png b/Screens/Inventory/ItemHood/KirugumiMask/e3.png deleted file mode 100644 index 7278bc105..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/e3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/m0.png b/Screens/Inventory/ItemHood/KirugumiMask/m0.png deleted file mode 100644 index 5a0505a09..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/m0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/m1.png b/Screens/Inventory/ItemHood/KirugumiMask/m1.png deleted file mode 100644 index 031f13f1f..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/m1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/m2.png b/Screens/Inventory/ItemHood/KirugumiMask/m2.png deleted file mode 100644 index eb854bec7..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/m2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/m3.png b/Screens/Inventory/ItemHood/KirugumiMask/m3.png deleted file mode 100644 index a77dd3fd0..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/m3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/ms0.png b/Screens/Inventory/ItemHood/KirugumiMask/ms0.png deleted file mode 100644 index 4b4daeb16..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/ms0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/ms1.png b/Screens/Inventory/ItemHood/KirugumiMask/ms1.png deleted file mode 100644 index 247378b4e..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/ms1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/op0.png b/Screens/Inventory/ItemHood/KirugumiMask/op0.png deleted file mode 100644 index 2acd1a1df..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/op0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/op1.png b/Screens/Inventory/ItemHood/KirugumiMask/op1.png deleted file mode 100644 index 614e4850c..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/op1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KirugumiMask/op2.png b/Screens/Inventory/ItemHood/KirugumiMask/op2.png deleted file mode 100644 index 4f267e2aa..000000000 Binary files a/Screens/Inventory/ItemHood/KirugumiMask/op2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KittyHood/b0.png b/Screens/Inventory/ItemHood/KittyHood/b0.png deleted file mode 100644 index 115521da2..000000000 Binary files a/Screens/Inventory/ItemHood/KittyHood/b0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KittyHood/b1.png b/Screens/Inventory/ItemHood/KittyHood/b1.png deleted file mode 100644 index 05696767c..000000000 Binary files a/Screens/Inventory/ItemHood/KittyHood/b1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KittyHood/e0.png b/Screens/Inventory/ItemHood/KittyHood/e0.png deleted file mode 100644 index 7e6c2d07e..000000000 Binary files a/Screens/Inventory/ItemHood/KittyHood/e0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KittyHood/e1.png b/Screens/Inventory/ItemHood/KittyHood/e1.png deleted file mode 100644 index bc5c49fc0..000000000 Binary files a/Screens/Inventory/ItemHood/KittyHood/e1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KittyHood/e2.png b/Screens/Inventory/ItemHood/KittyHood/e2.png deleted file mode 100644 index 5775dda9c..000000000 Binary files a/Screens/Inventory/ItemHood/KittyHood/e2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KittyHood/g0.png b/Screens/Inventory/ItemHood/KittyHood/g0.png deleted file mode 100644 index 33f281fa4..000000000 Binary files a/Screens/Inventory/ItemHood/KittyHood/g0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/KittyHood/g1.png b/Screens/Inventory/ItemHood/KittyHood/g1.png deleted file mode 100644 index 219ca4e5a..000000000 Binary files a/Screens/Inventory/ItemHood/KittyHood/g1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/OldGasMask/a0.png b/Screens/Inventory/ItemHood/OldGasMask/a0.png deleted file mode 100644 index 8bd1be6e0..000000000 Binary files a/Screens/Inventory/ItemHood/OldGasMask/a0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/OldGasMask/a1.png b/Screens/Inventory/ItemHood/OldGasMask/a1.png deleted file mode 100644 index 64ededde7..000000000 Binary files a/Screens/Inventory/ItemHood/OldGasMask/a1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/OldGasMask/a2.png b/Screens/Inventory/ItemHood/OldGasMask/a2.png deleted file mode 100644 index b24a8a816..000000000 Binary files a/Screens/Inventory/ItemHood/OldGasMask/a2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/OldGasMask/a3.png b/Screens/Inventory/ItemHood/OldGasMask/a3.png deleted file mode 100644 index 48b421f39..000000000 Binary files a/Screens/Inventory/ItemHood/OldGasMask/a3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/OldGasMask/l0.png b/Screens/Inventory/ItemHood/OldGasMask/l0.png deleted file mode 100644 index 8bd1be6e0..000000000 Binary files a/Screens/Inventory/ItemHood/OldGasMask/l0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/OldGasMask/l1.png b/Screens/Inventory/ItemHood/OldGasMask/l1.png deleted file mode 100644 index 1fe83850b..000000000 Binary files a/Screens/Inventory/ItemHood/OldGasMask/l1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/c0.png b/Screens/Inventory/ItemHood/TechnoHelmet1/c0.png deleted file mode 100644 index c3a99814a..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/c0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/c1.png b/Screens/Inventory/ItemHood/TechnoHelmet1/c1.png deleted file mode 100644 index d02f91c0e..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/c1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/d0.png b/Screens/Inventory/ItemHood/TechnoHelmet1/d0.png deleted file mode 100644 index f06abd921..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/d0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/d1.png b/Screens/Inventory/ItemHood/TechnoHelmet1/d1.png deleted file mode 100644 index f8586b82d..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/d1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/d2.png b/Screens/Inventory/ItemHood/TechnoHelmet1/d2.png deleted file mode 100644 index 2434ca0af..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/d2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/d3.png b/Screens/Inventory/ItemHood/TechnoHelmet1/d3.png deleted file mode 100644 index d0fdbdbdf..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/d3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/v0.png b/Screens/Inventory/ItemHood/TechnoHelmet1/v0.png deleted file mode 100644 index c3a99814a..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/v0.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/v1.png b/Screens/Inventory/ItemHood/TechnoHelmet1/v1.png deleted file mode 100644 index 9e33b786a..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/v1.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/v2.png b/Screens/Inventory/ItemHood/TechnoHelmet1/v2.png deleted file mode 100644 index ba98de097..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/v2.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/v3.png b/Screens/Inventory/ItemHood/TechnoHelmet1/v3.png deleted file mode 100644 index 1f5e655cc..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/v3.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/v4.png b/Screens/Inventory/ItemHood/TechnoHelmet1/v4.png deleted file mode 100644 index d862e1ef0..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/v4.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/TechnoHelmet1/v5.png b/Screens/Inventory/ItemHood/TechnoHelmet1/v5.png deleted file mode 100644 index f72c84930..000000000 Binary files a/Screens/Inventory/ItemHood/TechnoHelmet1/v5.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/ZipperHood/ZippersClosed.png b/Screens/Inventory/ItemHood/ZipperHood/ZippersClosed.png deleted file mode 100644 index cc5d7c4d7..000000000 Binary files a/Screens/Inventory/ItemHood/ZipperHood/ZippersClosed.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/ZipperHood/ZippersClosedEyes.png b/Screens/Inventory/ItemHood/ZipperHood/ZippersClosedEyes.png deleted file mode 100644 index a5c94c181..000000000 Binary files a/Screens/Inventory/ItemHood/ZipperHood/ZippersClosedEyes.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/ZipperHood/ZippersClosedMouth.png b/Screens/Inventory/ItemHood/ZipperHood/ZippersClosedMouth.png deleted file mode 100644 index 689d5b806..000000000 Binary files a/Screens/Inventory/ItemHood/ZipperHood/ZippersClosedMouth.png and /dev/null differ diff --git a/Screens/Inventory/ItemHood/ZipperHood/ZippersOpen.png b/Screens/Inventory/ItemHood/ZipperHood/ZippersOpen.png deleted file mode 100644 index 908854ffd..000000000 Binary files a/Screens/Inventory/ItemHood/ZipperHood/ZippersOpen.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/Chains/Basic.png b/Screens/Inventory/ItemLegs/Chains/Basic.png deleted file mode 100644 index 95afa9fa9..000000000 Binary files a/Screens/Inventory/ItemLegs/Chains/Basic.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/Chains/Strict.png b/Screens/Inventory/ItemLegs/Chains/Strict.png deleted file mode 100644 index d39c8dfac..000000000 Binary files a/Screens/Inventory/ItemLegs/Chains/Strict.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/DuctTape/CompleteLegs.png b/Screens/Inventory/ItemLegs/DuctTape/CompleteLegs.png deleted file mode 100644 index efc87be46..000000000 Binary files a/Screens/Inventory/ItemLegs/DuctTape/CompleteLegs.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/DuctTape/CutOut.png b/Screens/Inventory/ItemLegs/DuctTape/CutOut.png deleted file mode 100644 index 725cd8aa2..000000000 Binary files a/Screens/Inventory/ItemLegs/DuctTape/CutOut.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/DuctTape/HalfLegs.png b/Screens/Inventory/ItemLegs/DuctTape/HalfLegs.png deleted file mode 100644 index c7a28afaf..000000000 Binary files a/Screens/Inventory/ItemLegs/DuctTape/HalfLegs.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/DuctTape/Legs.png b/Screens/Inventory/ItemLegs/DuctTape/Legs.png deleted file mode 100644 index 05e72368d..000000000 Binary files a/Screens/Inventory/ItemLegs/DuctTape/Legs.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/DuctTape/MostLegs.png b/Screens/Inventory/ItemLegs/DuctTape/MostLegs.png deleted file mode 100644 index fdcc8d3b9..000000000 Binary files a/Screens/Inventory/ItemLegs/DuctTape/MostLegs.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/DuctTape/PetLegs.png b/Screens/Inventory/ItemLegs/DuctTape/PetLegs.png deleted file mode 100644 index ebe04e92a..000000000 Binary files a/Screens/Inventory/ItemLegs/DuctTape/PetLegs.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/FuturisticLegCuffs/Chained.png b/Screens/Inventory/ItemLegs/FuturisticLegCuffs/Chained.png deleted file mode 100644 index 99894520a..000000000 Binary files a/Screens/Inventory/ItemLegs/FuturisticLegCuffs/Chained.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/FuturisticLegCuffs/Closed.png b/Screens/Inventory/ItemLegs/FuturisticLegCuffs/Closed.png deleted file mode 100644 index 44cede502..000000000 Binary files a/Screens/Inventory/ItemLegs/FuturisticLegCuffs/Closed.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/FuturisticLegCuffs/None.png b/Screens/Inventory/ItemLegs/FuturisticLegCuffs/None.png deleted file mode 100644 index f26c22a89..000000000 Binary files a/Screens/Inventory/ItemLegs/FuturisticLegCuffs/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/HempRope/Basic.png b/Screens/Inventory/ItemLegs/HempRope/Basic.png deleted file mode 100644 index 8768b224c..000000000 Binary files a/Screens/Inventory/ItemLegs/HempRope/Basic.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/HempRope/Crossed.png b/Screens/Inventory/ItemLegs/HempRope/Crossed.png deleted file mode 100644 index f928959af..000000000 Binary files a/Screens/Inventory/ItemLegs/HempRope/Crossed.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/HempRope/Frogtie.png b/Screens/Inventory/ItemLegs/HempRope/Frogtie.png deleted file mode 100644 index 2ce02539a..000000000 Binary files a/Screens/Inventory/ItemLegs/HempRope/Frogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/HempRope/FullBinding.png b/Screens/Inventory/ItemLegs/HempRope/FullBinding.png deleted file mode 100644 index 305c8bc25..000000000 Binary files a/Screens/Inventory/ItemLegs/HempRope/FullBinding.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/HempRope/Link.png b/Screens/Inventory/ItemLegs/HempRope/Link.png deleted file mode 100644 index e540b28c1..000000000 Binary files a/Screens/Inventory/ItemLegs/HempRope/Link.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/HempRope/Mermaid.png b/Screens/Inventory/ItemLegs/HempRope/Mermaid.png deleted file mode 100644 index 93729f6cf..000000000 Binary files a/Screens/Inventory/ItemLegs/HempRope/Mermaid.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/LeatherLegCuffs/Chained.png b/Screens/Inventory/ItemLegs/LeatherLegCuffs/Chained.png deleted file mode 100644 index 99894520a..000000000 Binary files a/Screens/Inventory/ItemLegs/LeatherLegCuffs/Chained.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/LeatherLegCuffs/Closed.png b/Screens/Inventory/ItemLegs/LeatherLegCuffs/Closed.png deleted file mode 100644 index 44cede502..000000000 Binary files a/Screens/Inventory/ItemLegs/LeatherLegCuffs/Closed.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/LeatherLegCuffs/None.png b/Screens/Inventory/ItemLegs/LeatherLegCuffs/None.png deleted file mode 100644 index f26c22a89..000000000 Binary files a/Screens/Inventory/ItemLegs/LeatherLegCuffs/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/MermaidTail/MermaidTail.js b/Screens/Inventory/ItemLegs/MermaidTail/MermaidTail.js deleted file mode 100644 index e6f85d93e..000000000 --- a/Screens/Inventory/ItemLegs/MermaidTail/MermaidTail.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -function InventoryItemLegsMermaidTailLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemLegsMermaidTailDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemLegsMermaidTailClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemLegsMermaidTailScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemLegs/NylonRope/Frogtie.png b/Screens/Inventory/ItemLegs/NylonRope/Frogtie.png deleted file mode 100644 index 92b5d512e..000000000 Binary files a/Screens/Inventory/ItemLegs/NylonRope/Frogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/NylonRope/Knees.png b/Screens/Inventory/ItemLegs/NylonRope/Knees.png deleted file mode 100644 index b0986f973..000000000 Binary files a/Screens/Inventory/ItemLegs/NylonRope/Knees.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/NylonRope/KneesTighs.png b/Screens/Inventory/ItemLegs/NylonRope/KneesTighs.png deleted file mode 100644 index b4c704a1f..000000000 Binary files a/Screens/Inventory/ItemLegs/NylonRope/KneesTighs.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/NylonRope/Tighs.png b/Screens/Inventory/ItemLegs/NylonRope/Tighs.png deleted file mode 100644 index 118eaa0b8..000000000 Binary files a/Screens/Inventory/ItemLegs/NylonRope/Tighs.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/OrnateLegCuffs/Chained.png b/Screens/Inventory/ItemLegs/OrnateLegCuffs/Chained.png deleted file mode 100644 index 23c303df5..000000000 Binary files a/Screens/Inventory/ItemLegs/OrnateLegCuffs/Chained.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/OrnateLegCuffs/Closed.png b/Screens/Inventory/ItemLegs/OrnateLegCuffs/Closed.png deleted file mode 100644 index 091f288a5..000000000 Binary files a/Screens/Inventory/ItemLegs/OrnateLegCuffs/Closed.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/OrnateLegCuffs/None.png b/Screens/Inventory/ItemLegs/OrnateLegCuffs/None.png deleted file mode 100644 index 13c89ada5..000000000 Binary files a/Screens/Inventory/ItemLegs/OrnateLegCuffs/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/Ribbons/Cross.png b/Screens/Inventory/ItemLegs/Ribbons/Cross.png deleted file mode 100644 index 14566554c..000000000 Binary files a/Screens/Inventory/ItemLegs/Ribbons/Cross.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/Ribbons/MessyWrap.png b/Screens/Inventory/ItemLegs/Ribbons/MessyWrap.png deleted file mode 100644 index 09490f017..000000000 Binary files a/Screens/Inventory/ItemLegs/Ribbons/MessyWrap.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/Ribbons/Messystyle.png b/Screens/Inventory/ItemLegs/Ribbons/Messystyle.png deleted file mode 100644 index b7edb8fcf..000000000 Binary files a/Screens/Inventory/ItemLegs/Ribbons/Messystyle.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/SturdyLeatherBelts/One.png b/Screens/Inventory/ItemLegs/SturdyLeatherBelts/One.png deleted file mode 100644 index fd8cca3e2..000000000 Binary files a/Screens/Inventory/ItemLegs/SturdyLeatherBelts/One.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/SturdyLeatherBelts/Two.png b/Screens/Inventory/ItemLegs/SturdyLeatherBelts/Two.png deleted file mode 100644 index 19a506132..000000000 Binary files a/Screens/Inventory/ItemLegs/SturdyLeatherBelts/Two.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/Zipties/ZipFrogtie.png b/Screens/Inventory/ItemLegs/Zipties/ZipFrogtie.png deleted file mode 100644 index a1f92612a..000000000 Binary files a/Screens/Inventory/ItemLegs/Zipties/ZipFrogtie.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/Zipties/ZipLegFull.png b/Screens/Inventory/ItemLegs/Zipties/ZipLegFull.png deleted file mode 100644 index f924124e0..000000000 Binary files a/Screens/Inventory/ItemLegs/Zipties/ZipLegFull.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/Zipties/ZipLegLight.png b/Screens/Inventory/ItemLegs/Zipties/ZipLegLight.png deleted file mode 100644 index 664f58c0b..000000000 Binary files a/Screens/Inventory/ItemLegs/Zipties/ZipLegLight.png and /dev/null differ diff --git a/Screens/Inventory/ItemLegs/Zipties/ZipLegMedium.png b/Screens/Inventory/ItemLegs/Zipties/ZipLegMedium.png deleted file mode 100644 index 18e92540d..000000000 Binary files a/Screens/Inventory/ItemLegs/Zipties/ZipLegMedium.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/CombinationPadlock/CombinationPadlock.js b/Screens/Inventory/ItemMisc/CombinationPadlock/CombinationPadlock.js deleted file mode 100644 index 330a534d7..000000000 --- a/Screens/Inventory/ItemMisc/CombinationPadlock/CombinationPadlock.js +++ /dev/null @@ -1,229 +0,0 @@ -"use strict"; -let CombinationPadlockPlayerIsBlind = false; -let CombinationPadlockBlindCombinationOffset = null; -let CombinationPadlockCombinationLastValue = ""; -let CombinationPadlockNewCombinationLastValue = ""; -let CombinationPadlockLoaded = false; - -// Loads the item extension properties -function InventoryItemMiscCombinationPadlockLoad() { - CombinationPadlockPlayerIsBlind = Player.IsBlind(); - // Only update on initial load, not update loads - if (!CombinationPadlockLoaded) { - CombinationPadlockCombinationLastValue = ""; - CombinationPadlockNewCombinationLastValue = ""; - } - if (CombinationPadlockPlayerIsBlind) { - if (CombinationPadlockBlindCombinationOffset == null) { - CombinationPadlockBlindCombinationOffset = Math.floor(Math.random() * 10); - } - } else { - CombinationPadlockBlindCombinationOffset = null; - } - - var C = CharacterGetCurrent(); - if (!DialogFocusSourceItem.Property) DialogFocusSourceItem.Property = {}; - if (DialogFocusSourceItem.Property.CombinationNumber == null) { - DialogFocusSourceItem.Property.CombinationNumber = "0000"; - } - - // Only create the inputs if the zone isn't blocked - if (!InventoryGroupIsBlocked(C, C.FocusGroup.Name)) { - const combinationInput = ElementCreateInput("CombinationNumber", "text", "", "4"); - const newCombinationInput = ElementCreateInput("NewCombinationNumber", "text", "", "4"); - if (combinationInput) { - combinationInput.autocomplete = "off"; - combinationInput.pattern = "\\d*"; - combinationInput.type = CombinationPadlockPlayerIsBlind ? "password" : "text"; - combinationInput.addEventListener("input", InventoryItemMiscCombinationPadlockModifyInput); - // the current code is shown for owners, lovers and the member whose number is on the padlock - if ( - Player.MemberNumber === DialogFocusSourceItem.Property.LockMemberNumber || - C.IsOwnedByPlayer() || - C.IsLoverOfPlayer() - ) { - combinationInput.setAttribute("placeholder", DialogFocusSourceItem.Property.CombinationNumber); - } - } else { - document.getElementById('CombinationNumber').type = CombinationPadlockPlayerIsBlind ? "password" : "text"; - } - if (newCombinationInput) { - newCombinationInput.autocomplete = "off"; - newCombinationInput.pattern = "\\d*"; - newCombinationInput.type = CombinationPadlockPlayerIsBlind ? "password" : "text"; - newCombinationInput.addEventListener("input", InventoryItemMiscCombinationPadlockModifyInput); - } else { - document.getElementById('NewCombinationNumber').type = CombinationPadlockPlayerIsBlind ? "password" : "text"; - } - } - CombinationPadlockLoaded = true; -} - -function InventoryItemMiscCombinationPadlockModifyInput(e) { - const clumsiness = Player.GetClumsiness(); - - // If the player is either blind or impaired by restraints, modify the input accordingly - if (CombinationPadlockPlayerIsBlind || clumsiness > 0) { - const previousValue = CombinationPadlockCombinationLastValue; - const newValue = e.target.value; - let prefix = ""; - let suffix = ""; - for (let i = 0; i < previousValue.length && previousValue[i] === newValue[i]; i++) { - prefix += newValue[i]; - } - const previousAppendReverse = previousValue.substring(prefix.length).split("").reverse().join(""); - const newAppendReverse = newValue.substring(prefix.length).split("").reverse().join(""); - for (let i = 0; i < previousAppendReverse.length && previousAppendReverse[i] === newAppendReverse[i]; i++) { - suffix = newAppendReverse[i] + suffix; - } - let inserted = newValue.substring(prefix.length, newValue.length - suffix.length); - - inserted = inserted.replace(/\d/g, (digit) => { - let offset = CombinationPadlockBlindCombinationOffset || 0; - if (clumsiness > 0) offset += (Math.floor(Math.random() * 2 * clumsiness) - clumsiness); - if (offset < 0) offset += 10; - return String((Number(digit) + offset) % 10); - }); - - e.target.value = prefix + inserted + suffix; - } - - CombinationPadlockCombinationLastValue = e.target.value; -} - -// Draw the extension screen -function InventoryItemMiscCombinationPadlockDraw() { - var C = CharacterGetCurrent(); - DrawAssetPreview(1387, 25, DialogFocusItem.Asset); - - const playerBlind = Player.IsBlind(); - if (playerBlind !== CombinationPadlockPlayerIsBlind) { - InventoryItemMiscCombinationPadlockLoad(); - } - - DrawText( - DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 400, "white", - "gray", - ); - const Property = DialogFocusSourceItem && DialogFocusSourceItem.Property; - let LockMemberNumber; - if (playerBlind) LockMemberNumber = "?"; - else LockMemberNumber = Property && Property.LockMemberNumber && Property.LockMemberNumber.toString(); - if (LockMemberNumber != null) { - DrawText(DialogFindPlayer("LockMemberNumber") + " " + LockMemberNumber, 1500, 500, "white", "gray"); - } - - const additionalInfo = []; - if (playerBlind) additionalInfo.push("ControlsBlind"); - if (Player.GetClumsiness() > 0) additionalInfo.push("ControlsClumsy"); - - additionalInfo.forEach((text, i) => { - DrawTextWrap(DialogFindPlayer("CombinationPadlock" + text), 1000, 550 + i * 100, 1000, 100, "white"); - }); - - if (InventoryGroupIsBlocked(C, C.FocusGroup.Name)) { - // If the zone is blocked, just display some text informing the player that they can't access the lock - DrawText(DialogFindPlayer("LockZoneBlocked"), 1500, 800, "white", "gray"); - } else { - // Otherwise, draw the combination inputs - MainCanvas.textAlign = "right"; - DrawText(DialogFindPlayer("CombinationOld"), 1400, 803, "white", "gray"); - DrawText(DialogFindPlayer("CombinationNew"), 1400, 883, "white", "gray"); - MainCanvas.textAlign = "center"; - ElementPosition("CombinationNumber", 1500, 800, 125); - ElementPosition("NewCombinationNumber", 1500, 880, 125); - DrawButton(1600, 771, 350, 64, DialogFindPlayer("CombinationEnter"), "White", ""); - DrawButton(1600, 851, 350, 64, DialogFindPlayer("CombinationChange"), "White", ""); - if (PreferenceMessage != "") DrawText(DialogFindPlayer(PreferenceMessage), 1500, 963, "Red", "Black"); - } -} - - -function InventoryItemMiscCombinationPadlockUnlock(C, Item) { - delete Item.Property.CombinationNumber; - for (let A = 0; A < C.Appearance.length; A++) { - if (C.Appearance[A].Asset.Group.Name == C.FocusGroup.Name) - C.Appearance[A] = Item; - } - InventoryUnlock(C, C.FocusGroup.Name); - ChatRoomPublishAction(C, Item, null, true, "ActionUnlock"); -} - -// Catches the item extension clicks -function InventoryItemMiscCombinationPadlockClick() { - var C = CharacterGetCurrent(); - - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemMiscCombinationPadlockExit(); - } - - // If the zone is blocked, cannot interact with the lock - if (InventoryGroupIsBlocked(C, C.FocusGroup.Name)) return; - - // Opens the padlock - if (MouseIn(1600, 771, 350, 64)) { - if (ElementValue("CombinationNumber") == DialogFocusSourceItem.Property.CombinationNumber) { - InventoryItemMiscCombinationPadlockUnlock(C, DialogFocusSourceItem); - InventoryItemMiscCombinationPadlockExit(); - } - - // Send fail message if online - else if (CurrentScreen == "ChatRoom") { - const Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name }, - { Tag: "CombinationNumber", Text: ElementValue("CombinationNumber") }, - ]; - ChatRoomPublishCustomAction("CombinationFail", true, Dictionary); - InventoryItemMiscCombinationPadlockExit(); - } else { PreferenceMessage = "CombinationError"; } - } - // Changes the code - else if (MouseIn(1600, 871, 350, 64)) { - // Succeeds to change - if (ElementValue("CombinationNumber") == DialogFocusSourceItem.Property.CombinationNumber) { - var NewCode = ElementValue("NewCombinationNumber"); - // We only accept code made of digits and of 4 numbers - if (ValidationCombinationNumberRegex.test(NewCode)) { - DialogFocusSourceItem.Property.CombinationNumber = NewCode; - for (let A = 0; A < C.Appearance.length; A++) { - if (C.Appearance[A].Asset.Group.Name == C.FocusGroup.Name) - C.Appearance[A] = DialogFocusSourceItem; - } - if (CurrentScreen == "ChatRoom") { - const Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name }, - ]; - ChatRoomPublishCustomAction("CombinationChangeSuccess", true, Dictionary); - InventoryItemMiscCombinationPadlockExit(); - } else { - CharacterRefresh(C); - InventoryItemMiscCombinationPadlockExit(); - } - } else { PreferenceMessage = "CombinationErrorInput"; } - } - // Fails to change - else if (CurrentScreen == "ChatRoom") { - const Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name }, - ]; - ChatRoomPublishCustomAction("CombinationChangeFail", true, Dictionary); - InventoryItemMiscCombinationPadlockExit(); - } else { PreferenceMessage = "CombinationError"; } - } -} - -function InventoryItemMiscCombinationPadlockExit() { - CombinationPadlockLoaded = false; - ElementRemove("CombinationNumber"); - ElementRemove("NewCombinationNumber"); - PreferenceMessage = ""; - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild((Player.FocusGroup != null) ? Player : CurrentCharacter); -} diff --git a/Screens/Inventory/ItemMisc/ExclusivePadlock/ExclusivePadlock.js b/Screens/Inventory/ItemMisc/ExclusivePadlock/ExclusivePadlock.js deleted file mode 100644 index 51ee9dd14..000000000 --- a/Screens/Inventory/ItemMisc/ExclusivePadlock/ExclusivePadlock.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemMiscExclusivePadlockLoad() { -} - -// Draw the extension screen -function InventoryItemMiscExclusivePadlockDraw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Detail"), 1500, 700, "white", "gray"); - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 800, "white", "gray"); -} - -// Catches the item extension clicks -function InventoryItemMiscExclusivePadlockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; -} diff --git a/Screens/Inventory/ItemMisc/HighSecurityPadlock/HighSecurityPadlock.js b/Screens/Inventory/ItemMisc/HighSecurityPadlock/HighSecurityPadlock.js deleted file mode 100644 index 6e0456249..000000000 --- a/Screens/Inventory/ItemMisc/HighSecurityPadlock/HighSecurityPadlock.js +++ /dev/null @@ -1,148 +0,0 @@ -"use strict"; - -var InventoryItemMiscHighSecurityPadlockPlayerCanUnlock = true; -var HighSecurityPadlockConfigOwner = true; -var HighSecurityPadlockConfigLover = true; -var HighSecurityPadlockConfigWhitelist = false; - - -// Loads the item extension properties -function InventoryItemMiscHighSecurityPadlockLoad() { - var C = CharacterGetCurrent(); - InventoryItemMiscHighSecurityPadlockPlayerCanUnlock = true; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property == null)) DialogFocusSourceItem.Property = {}; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.MemberNumberListKeys == null)) - DialogFocusSourceItem.Property.MemberNumberListKeys = "" + (DialogFocusSourceItem.Property.LockMemberNumber) ? DialogFocusSourceItem.Property.LockMemberNumber : ""; - - // Only create the inputs if the zone isn't blocked - if (!InventoryGroupIsBlocked(C, C.FocusGroup.Name)) { - if (DialogFocusSourceItem != null && ((DialogFocusSourceItem.Property.MemberNumberListKeys && CommonConvertStringToArray("" + DialogFocusSourceItem.Property.MemberNumberListKeys).indexOf(Player.MemberNumber) >= 0))) { - if (!(ElementValue("MemberNumberList") && "" + ElementValue("MemberNumberList").length > 1)) { // Only update if there isnt text already.. - ElementCreateTextArea("MemberNumberList"); - document.getElementById("MemberNumberList").setAttribute("maxLength", 250); - document.getElementById("MemberNumberList").setAttribute("autocomplete", "off"); - ElementValue("MemberNumberList", DialogFocusSourceItem.Property.MemberNumberListKeys); - } - - if (!InventoryItemMiscHighSecurityPadlockPlayerHasKeys(C, DialogFocusItem)) { - InventoryItemMiscHighSecurityPadlockPlayerCanUnlock = false; - } - } - } -} - -function InventoryItemMiscHighSecurityPadlockPlayerHasKeys(C, Item) { - var UnlockName = "Unlock-" + Item.Asset.Name; - if ((Item != null) && (Item.Property != null) && (Item.Property.LockedBy != null)) UnlockName = "Unlock-" + Item.Property.LockedBy; - for (let I = 0; I < Player.Inventory.length; I++) - if (InventoryItemHasEffect(Player.Inventory[I], UnlockName)) { - var Lock = InventoryGetLock(Item); - if (Lock != null) { - if (Lock.Asset.LoverOnly && !C.IsLoverOfPlayer()) return false; - if (Lock.Asset.OwnerOnly && !C.IsOwnedByPlayer()) return false; - return true; - } else return true; - } - return true; -} - -// Draw the extension screen -function InventoryItemMiscHighSecurityPadlockDraw() { - var C = CharacterGetCurrent(); - - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 650, "white", "gray"); - - if (!InventoryGroupIsBlocked(C, C.FocusGroup.Name)&& (DialogFocusSourceItem != null && ((DialogFocusSourceItem.Property.MemberNumberListKeys && CommonConvertStringToArray("" + DialogFocusSourceItem.Property.MemberNumberListKeys).indexOf(Player.MemberNumber) >= 0)))) { - DrawText(DialogFindPlayer("HighSecuritySaveIntro"), 1500, 600, "white", "gray"); - ElementPosition("MemberNumberList", 1260, 780, 300, 170); - DrawButton(1135, 920, 230, 64, DialogFindPlayer("HighSecuritySave"), "White", ""); - - MainCanvas.textAlign = "left"; - DrawCheckbox(1450, 700, 64, 64, DialogFindPlayer("HighSecurityAppendOwner"), HighSecurityPadlockConfigOwner, false, "White"); - DrawCheckbox(1450, 780, 64, 64, DialogFindPlayer("HighSecurityAppendLover"), HighSecurityPadlockConfigLover, false, "White"); - DrawCheckbox(1450, 860, 64, 64, DialogFindPlayer("HighSecurityAppendWhitelist"), HighSecurityPadlockConfigWhitelist, false, "White"); - MainCanvas.textAlign = "center"; - - - if (!InventoryItemMiscHighSecurityPadlockPlayerCanUnlock) { - DrawText(DialogFindPlayer("HighSecurityWarning"), 1500, 550, "red", "gray"); - } - } else { - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - } -} - -// Catches the item extension clicks -function InventoryItemMiscHighSecurityPadlockClick() { - var C = CharacterGetCurrent(); - if (!InventoryGroupIsBlocked(C, C.FocusGroup.Name)&& (DialogFocusSourceItem != null && ((DialogFocusSourceItem.Property.MemberNumberListKeys && CommonConvertStringToArray("" + DialogFocusSourceItem.Property.MemberNumberListKeys).indexOf(Player.MemberNumber) >= 0)))) { - if (MouseIn(1135, 920, 230, 64)) { - if (DialogFocusSourceItem != null && DialogFocusSourceItem.Property != null) { - var list = CommonConvertStringToArray("" + ElementValue("MemberNumberList").trim()); - if (!InventoryItemMiscHighSecurityPadlockPlayerCanUnlock && list.length > 1 && list.indexOf(Player.MemberNumber) >= 0 ) { - list = list.filter(x => x !== Player.MemberNumber); - } - - for (let A = 0; A < C.Appearance.length; A++) { - if (C.Appearance[A].Asset.Group.Name == C.FocusGroup.Name) - C.Appearance[A] = DialogFocusSourceItem; - } - - if (HighSecurityPadlockConfigOwner && Player.Ownership && Player.Ownership.MemberNumber != null && list.indexOf(Player.Ownership.MemberNumber) < 0) { - list.push(Player.Ownership.MemberNumber); - } - if (HighSecurityPadlockConfigLover && Player.Lovership) { - for (let L = 0; L < Player.Lovership.length; L++) { - const lover = Player.Lovership[L]; - if (lover.MemberNumber != null && list.indexOf(lover.MemberNumber) < 0) - list.push(Player.Lovership[L].MemberNumber); - } - } - if (HighSecurityPadlockConfigWhitelist && Player.WhiteList) { - for (let L = 0; L < Player.WhiteList.length; L++) { - if (list.indexOf(Player.WhiteList[L]) < 0) - list.push(Player.WhiteList[L]); - } - } - - DialogFocusSourceItem.Property.MemberNumberListKeys = "" + - CommonConvertArrayToString(list); // Convert to array and back; can only save strings on server - ElementValue("MemberNumberList", DialogFocusSourceItem.Property.MemberNumberListKeys); - - if (CurrentScreen == "ChatRoom") { - var Dictionary = []; - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name}); - ChatRoomPublishCustomAction("HighSecurityUpdate", true, Dictionary); - InventoryItemMiscHighSecurityPadlockExit(); - } - else { - CharacterRefresh(C); - InventoryItemMiscHighSecurityPadlockExit(); - } - } - - - return; - } - if (MouseIn(1450, 700, 64, 64)) {HighSecurityPadlockConfigOwner = !HighSecurityPadlockConfigOwner; return;} - if (MouseIn(1450, 780, 64, 64)) {HighSecurityPadlockConfigLover = !HighSecurityPadlockConfigLover; return;} - if (MouseIn(1450, 860, 64, 64)) {HighSecurityPadlockConfigWhitelist = !HighSecurityPadlockConfigWhitelist; return;} - } - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) InventoryItemMiscHighSecurityPadlockExit(); - - - - -} - - -function InventoryItemMiscHighSecurityPadlockExit() { - ElementRemove("MemberNumberList"); - PreferenceMessage = ""; - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild((Player.FocusGroup != null) ? Player : CurrentCharacter); -} diff --git a/Screens/Inventory/ItemMisc/IntricatePadlock/IntricatePadlock.js b/Screens/Inventory/ItemMisc/IntricatePadlock/IntricatePadlock.js deleted file mode 100644 index 465a1f4e4..000000000 --- a/Screens/Inventory/ItemMisc/IntricatePadlock/IntricatePadlock.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemMiscIntricatePadlockLoad() { -} - -// Draw the extension screen -function InventoryItemMiscIntricatePadlockDraw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 700, "white", "gray"); -} - -// Catches the item extension clicks -function InventoryItemMiscIntricatePadlockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; -} diff --git a/Screens/Inventory/ItemMisc/LoversPadlock/LoversPadlock.js b/Screens/Inventory/ItemMisc/LoversPadlock/LoversPadlock.js deleted file mode 100644 index febae241c..000000000 --- a/Screens/Inventory/ItemMisc/LoversPadlock/LoversPadlock.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemMiscLoversPadlockLoad() { -} - -// Draw the extension screen -function InventoryItemMiscLoversPadlockDraw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 700, "white", "gray"); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Detail"), 1500, 800, "white", "gray"); -} - -// Catches the item extension clicks -function InventoryItemMiscLoversPadlockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; -} diff --git a/Screens/Inventory/ItemMisc/LoversTimerPadlock/LoversTimerPadlock.js b/Screens/Inventory/ItemMisc/LoversTimerPadlock/LoversTimerPadlock.js deleted file mode 100644 index bcdbd1d3d..000000000 --- a/Screens/Inventory/ItemMisc/LoversTimerPadlock/LoversTimerPadlock.js +++ /dev/null @@ -1,127 +0,0 @@ -"use strict"; - -var LoverTimerChooseList = [1, 2, 4, 8, 16, 24, 48, 72, 96, 120, 144, 168, -144, -72, -48, -24, -8, -4]; -var LoverTimerChooseIndex = 0; - -// Loads the item extension properties -function InventoryItemMiscLoversTimerPadlockLoad() { - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property == null)) DialogFocusSourceItem.Property = {}; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.RemoveItem == null)) DialogFocusSourceItem.Property.RemoveItem = false; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.ShowTimer == null)) DialogFocusSourceItem.Property.ShowTimer = true; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.EnableRandomInput == null)) DialogFocusSourceItem.Property.EnableRandomInput = false; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.MemberNumberList == null)) DialogFocusSourceItem.Property.MemberNumberList = []; -} - -// Draw the extension screen -function InventoryItemMiscLoversTimerPadlockDraw() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if ((DialogFocusItem == null) || (DialogFocusSourceItem.Property.RemoveTimer < CurrentTime)) { InventoryItemMiscLoversTimerPadlockExit(); return; } - if (DialogFocusSourceItem.Property.ShowTimer) { - DrawText(DialogFindPlayer("TimerLeft") + " " + TimerToString(DialogFocusSourceItem.Property.RemoveTimer - CurrentTime), 1500, 150, "white", "gray"); - } else { DrawText(DialogFindPlayer("TimerUnknown"), 1500, 150, "white", "gray"); } - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - - // Draw the settings - if (Player.CanInteract() && (C.IsLoverOfPlayer() || C.IsOwnedByPlayer())) { - MainCanvas.textAlign = "left"; - DrawButton(1100, 666, 64, 64, "", "White", (DialogFocusSourceItem.Property.RemoveItem) ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("RemoveItemWithTimer"), 1200, 698, "white", "gray"); - DrawButton(1100, 746, 64, 64, "", "White", (DialogFocusSourceItem.Property.ShowTimer) ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("ShowItemWithTimerRemaining"), 1200, 778, "white", "gray"); - DrawButton(1100, 826, 64, 64, "", "White", (DialogFocusSourceItem.Property.EnableRandomInput) ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("EnableRandomInput"), 1200, 858, "white", "gray"); - MainCanvas.textAlign = "center"; - } else { - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 700, "white", "gray"); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Detail"), 1500, 800, "white", "gray"); - DrawText(DialogFindPlayer((DialogFocusSourceItem.Property.RemoveItem) ? "WillRemoveItemWithTimer" : "WontRemoveItemWithTimer"), 1500, 868, "white", "gray"); - } - - // Draw buttons to add/remove time if available - if (Player.CanInteract() && (C.IsLoverOfPlayer() || C.IsOwnedByPlayer())) { - DrawButton(1100, 910, 250, 70, DialogFindPlayer("AddTimerTime"), "White"); - DrawBackNextButton(1400, 910, 250, 70, LoverTimerChooseList[LoverTimerChooseIndex] + " " + DialogFindPlayer("Hours"), "White", "", - () => LoverTimerChooseList[(LoverTimerChooseList.length + LoverTimerChooseIndex - 1) % LoverTimerChooseList.length] + " " + DialogFindPlayer("Hours"), - () => LoverTimerChooseList[(LoverTimerChooseIndex + 1) % LoverTimerChooseList.length] + " " + DialogFindPlayer("Hours")); - } - else if (Player.CanInteract() && DialogFocusSourceItem.Property.EnableRandomInput) { - for (let I = 0; I < DialogFocusSourceItem.Property.MemberNumberList.length; I++) { - if (DialogFocusSourceItem.Property.MemberNumberList[I] == Player.MemberNumber) return; - } - DrawButton(1100, 910, 250, 70, "- 2 " + DialogFindPlayer("Hours"), "White"); - DrawButton(1400, 910, 250, 70, DialogFindPlayer("Random"), "White"); - DrawButton(1700, 910, 250, 70, "+ 2 " + DialogFindPlayer("Hours"), "White"); - } -} - -// Catches the item extension clicks -function InventoryItemMiscLoversTimerPadlockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) InventoryItemMiscLoversTimerPadlockExit(); - if (!Player.CanInteract()) return; - var C = CharacterGetCurrent(); - - if (C.IsLoverOfPlayer() || C.IsOwnedByPlayer()) { - if ((MouseX >= 1100) && (MouseX <= 1164)) { - if ((MouseY >= 666) && (MouseY <= 730)) { DialogFocusSourceItem.Property.RemoveItem = !(DialogFocusSourceItem.Property.RemoveItem); } - if ((MouseY >= 746) && (MouseY <= 810)) { DialogFocusSourceItem.Property.ShowTimer = !(DialogFocusSourceItem.Property.ShowTimer); } - if ((MouseY >= 826) && (MouseY <= 890)) { DialogFocusSourceItem.Property.EnableRandomInput = !(DialogFocusSourceItem.Property.EnableRandomInput); } - if (CurrentScreen == "ChatRoom") ChatRoomCharacterItemUpdate(CharacterGetCurrent()); - } - } - - if ((MouseY >= 910) && (MouseY <= 975)) { - if (C.IsLoverOfPlayer() || C.IsOwnedByPlayer()) { - if ((MouseX >= 1100) && (MouseX < 1350)) InventoryItemMiscLoversTimerPadlockAdd(LoverTimerChooseList[LoverTimerChooseIndex] * 3600); - if ((MouseX >= 1400) && (MouseX < 1650)) { - if (MouseX <= 1525) LoverTimerChooseIndex = (LoverTimerChooseList.length + LoverTimerChooseIndex - 1) % LoverTimerChooseList.length; - else LoverTimerChooseIndex = (LoverTimerChooseIndex + 1) % LoverTimerChooseList.length; - } - } - else if (DialogFocusSourceItem.Property.EnableRandomInput) { - for (let I = 0; I < DialogFocusSourceItem.Property.MemberNumberList.length; I++) { - if (DialogFocusSourceItem.Property.MemberNumberList[I] == Player.MemberNumber) return; - } - if ((MouseX >= 1100) && (MouseX < 1350)) { InventoryItemMiscLoversTimerPadlockAdd(-2 * 3600, true); } - if ((MouseX >= 1400) && (MouseX < 1650)) { InventoryItemMiscLoversTimerPadlockAdd(4 * 3600 * ((Math.random() >= 0.5) ? 1 : -1), true); } - if ((MouseX >= 1700) && (MouseX < 1950)) { InventoryItemMiscLoversTimerPadlockAdd(2 * 3600, true); } - } - } -} - -// When a value is added to the timer, can be a negative one -function InventoryItemMiscLoversTimerPadlockAdd(TimeToAdd, PlayerMemberNumberToList) { - if (PlayerMemberNumberToList) DialogFocusSourceItem.Property.MemberNumberList.push(Player.MemberNumber); - var TimerBefore = DialogFocusSourceItem.Property.RemoveTimer; - if (DialogFocusItem.Asset.RemoveTimer > 0) DialogFocusSourceItem.Property.RemoveTimer = Math.round(Math.min(DialogFocusSourceItem.Property.RemoveTimer + (TimeToAdd * 1000), CurrentTime + (DialogFocusItem.Asset.MaxTimer * 1000))); - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (CurrentScreen == "ChatRoom") { - var timeAdded = (DialogFocusSourceItem.Property.RemoveTimer - TimerBefore) / (1000 * 3600); - var msg = ((timeAdded < 0) && DialogFocusSourceItem.Property.ShowTimer ? "TimerRemoveTime" : "TimerAddTime"); - var Dictionary = []; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - if (DialogFocusSourceItem.Property.ShowTimer) { - Dictionary.push({ Tag: "TimerTime", Text: Math.round(Math.abs(timeAdded)) }); - Dictionary.push({ Tag: "TimerUnit", TextToLookUp: "Hours" }); - } else { - Dictionary.push({ Tag: "TimerTime", TextToLookUp: "TimerAddRemoveUnknownTime" }); - Dictionary.push({ Tag: "TimerUnit", Text: "" }); - } - Dictionary.push({ Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name }); - - for (let A = 0; A < C.Appearance.length; A++) { - if (C.Appearance[A].Asset.Group.Name == C.FocusGroup.Name) - C.Appearance[A] = DialogFocusSourceItem; - } - ChatRoomPublishCustomAction(msg, true, Dictionary); - } else { CharacterRefresh(C); } - InventoryItemMiscLoversTimerPadlockExit(); -} - -// Exits the extended menu -function InventoryItemMiscLoversTimerPadlockExit() { - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild(CharacterGetCurrent()); -} diff --git a/Screens/Inventory/ItemMisc/MetalPadlock/MetalPadlock.js b/Screens/Inventory/ItemMisc/MetalPadlock/MetalPadlock.js deleted file mode 100644 index 0b8e426ff..000000000 --- a/Screens/Inventory/ItemMisc/MetalPadlock/MetalPadlock.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemMiscMetalPadlockLoad() { -} - -// Draw the extension screen -function InventoryItemMiscMetalPadlockDraw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 700, "white", "gray"); -} - -// Catches the item extension clicks -function InventoryItemMiscMetalPadlockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; -} diff --git a/Screens/Inventory/ItemMisc/MistressPadlock/MistressPadlock.js b/Screens/Inventory/ItemMisc/MistressPadlock/MistressPadlock.js deleted file mode 100644 index 9323f6724..000000000 --- a/Screens/Inventory/ItemMisc/MistressPadlock/MistressPadlock.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemMiscMistressPadlockLoad() { -} - -// Draw the extension screen -function InventoryItemMiscMistressPadlockDraw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null) && (DialogFocusSourceItem.Property.LockMemberNumber >= 0)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 700, "white", "gray"); -} - -// Catches the item extension clicks -function InventoryItemMiscMistressPadlockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; -} diff --git a/Screens/Inventory/ItemMisc/MistressTimerPadlock/MistressTimerPadlock.js b/Screens/Inventory/ItemMisc/MistressTimerPadlock/MistressTimerPadlock.js deleted file mode 100644 index 021197041..000000000 --- a/Screens/Inventory/ItemMisc/MistressTimerPadlock/MistressTimerPadlock.js +++ /dev/null @@ -1,125 +0,0 @@ -"use strict"; - -var MistressTimerChooseList = [5, 10, 15, 30, 60, 120, 180, 240, -180, -120, -60, -30, -15]; -var MistressTimerChooseIndex = 0; - -// Loads the item extension properties -function InventoryItemMiscMistressTimerPadlockLoad() { - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property == null)) DialogFocusSourceItem.Property = {}; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.RemoveItem == null)) DialogFocusSourceItem.Property.RemoveItem = false; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.ShowTimer == null)) DialogFocusSourceItem.Property.ShowTimer = true; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.EnableRandomInput == null)) DialogFocusSourceItem.Property.EnableRandomInput = false; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.MemberNumberList == null)) DialogFocusSourceItem.Property.MemberNumberList = []; -} - -// Draw the extension screen -function InventoryItemMiscMistressTimerPadlockDraw() { - if ((DialogFocusItem == null) || (DialogFocusSourceItem.Property.RemoveTimer < CurrentTime)) { InventoryItemMiscMistressTimerPadlockExit(); return; } - if (DialogFocusSourceItem.Property.ShowTimer) { - DrawText(DialogFindPlayer("TimerLeft") + " " + TimerToString(DialogFocusSourceItem.Property.RemoveTimer - CurrentTime), 1500, 150, "white", "gray"); - } else { DrawText(DialogFindPlayer("TimerUnknown"), 1500, 150, "white", "gray"); } - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - - // Draw the settings - if (Player.CanInteract() && (Player.MemberNumber == DialogFocusSourceItem.Property.LockMemberNumber)) { - MainCanvas.textAlign = "left"; - DrawButton(1100, 666, 64, 64, "", "White", (DialogFocusSourceItem.Property.RemoveItem) ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("RemoveItemWithTimer"), 1200, 698, "white", "gray"); - DrawButton(1100, 746, 64, 64, "", "White", (DialogFocusSourceItem.Property.ShowTimer) ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("ShowItemWithTimerRemaining"), 1200, 778, "white", "gray"); - DrawButton(1100, 828, 64, 64, "", "White", (DialogFocusSourceItem.Property.EnableRandomInput) ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("EnableRandomInput"), 1200, 858, "white", "gray"); - MainCanvas.textAlign = "center"; - } else { - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 700, "white", "gray"); - DrawText(DialogFindPlayer((DialogFocusSourceItem.Property.RemoveItem) ? "WillRemoveItemWithTimer" : "WontRemoveItemWithTimer"), 1500, 868, "white", "gray"); - } - - // Draw buttons to add/remove time if available - if (Player.CanInteract() && ((Player.MemberNumber == DialogFocusSourceItem.Property.LockMemberNumber))) { - DrawButton(1100, 910, 250, 70, DialogFindPlayer("AddTimerTime"), "White"); - DrawBackNextButton(1400, 910, 250, 70, MistressTimerChooseList[MistressTimerChooseIndex] + " " + DialogFindPlayer("Minutes"), "White", "", - () => MistressTimerChooseList[(MistressTimerChooseList.length + MistressTimerChooseIndex - 1) % MistressTimerChooseList.length] + " " + DialogFindPlayer("Minutes"), - () => MistressTimerChooseList[(MistressTimerChooseIndex + 1) % MistressTimerChooseList.length] + " " + DialogFindPlayer("Minutes")); - } - else if (Player.CanInteract() && DialogFocusSourceItem.Property.EnableRandomInput) { - for (let I = 0; I < DialogFocusSourceItem.Property.MemberNumberList.length; I++) { - if (DialogFocusSourceItem.Property.MemberNumberList[I] == Player.MemberNumber) return; - } - DrawButton(1100, 910, 250, 70, "- " + DialogFocusItem.Asset.RemoveTimer * 3 / 60 + " " + DialogFindPlayer("Minutes"), "White"); - DrawButton(1400, 910, 250, 70, DialogFindPlayer("Random"), "White"); - DrawButton(1700, 910, 250, 70, "+ " + DialogFocusItem.Asset.RemoveTimer * 3 / 60 + " " + DialogFindPlayer("Minutes"), "White"); - } -} - -// Catches the item extension clicks -function InventoryItemMiscMistressTimerPadlockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) InventoryItemMiscMistressTimerPadlockExit(); - if (!Player.CanInteract()) return; - - if (Player.MemberNumber == DialogFocusSourceItem.Property.LockMemberNumber) { - if ((MouseX >= 1100) && (MouseX <= 1164)) { - if ((MouseY >= 666) && (MouseY <= 730)) { DialogFocusSourceItem.Property.RemoveItem = !(DialogFocusSourceItem.Property.RemoveItem); } - if ((MouseY >= 746) && (MouseY <= 810)) { DialogFocusSourceItem.Property.ShowTimer = !(DialogFocusSourceItem.Property.ShowTimer); } - if ((MouseY >= 826) && (MouseY <= 890)) { DialogFocusSourceItem.Property.EnableRandomInput = !(DialogFocusSourceItem.Property.EnableRandomInput); } - if (CurrentScreen == "ChatRoom") ChatRoomCharacterItemUpdate(CharacterGetCurrent()); - } - } - - if ((MouseY >= 910) && (MouseY <= 980)) { - if ((Player.MemberNumber == DialogFocusSourceItem.Property.LockMemberNumber)) { - if ((MouseX >= 1100) && (MouseX < 1350)) InventoryItemMiscMistressTimerPadlockAdd(MistressTimerChooseList[MistressTimerChooseIndex] * 60, false); - if ((MouseX >= 1400) && (MouseX < 1650)) { - if (MouseX <= 1525) MistressTimerChooseIndex = (MistressTimerChooseList.length + MistressTimerChooseIndex - 1) % MistressTimerChooseList.length; - else MistressTimerChooseIndex = (MistressTimerChooseIndex + 1) % MistressTimerChooseList.length; - } - } - else if (DialogFocusSourceItem.Property.EnableRandomInput) { - for (let I = 0; I < DialogFocusSourceItem.Property.MemberNumberList.length; I++) { - if (DialogFocusSourceItem.Property.MemberNumberList[I] == Player.MemberNumber) return; - } - if ((MouseX >= 1100) && (MouseX < 1350)) { InventoryItemMiscMistressTimerPadlockAdd(-DialogFocusItem.Asset.RemoveTimer * 2, true); } - if ((MouseX >= 1400) && (MouseX < 1650)) { InventoryItemMiscMistressTimerPadlockAdd(DialogFocusItem.Asset.RemoveTimer * 4 * ((Math.random() >= 0.5) ? 1 : -1), true); } - if ((MouseX >= 1700) && (MouseX < 1950)) { InventoryItemMiscMistressTimerPadlockAdd(DialogFocusItem.Asset.RemoveTimer * 2, true); } - } - } -} - -// When a value is added to the timer, can be a negative one -function InventoryItemMiscMistressTimerPadlockAdd(TimeToAdd, PlayerMemberNumberToList) { - if (PlayerMemberNumberToList) DialogFocusSourceItem.Property.MemberNumberList.push(Player.MemberNumber); - var TimerBefore = DialogFocusSourceItem.Property.RemoveTimer; - if (DialogFocusItem.Asset.RemoveTimer > 0) DialogFocusSourceItem.Property.RemoveTimer = Math.round(Math.min(DialogFocusSourceItem.Property.RemoveTimer + (TimeToAdd * 1000), CurrentTime + (DialogFocusItem.Asset.MaxTimer * 1000))); - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (CurrentScreen == "ChatRoom") { - var timeAdded = (DialogFocusSourceItem.Property.RemoveTimer - TimerBefore) / (1000 * 60); - var msg = ((timeAdded < 0) && DialogFocusSourceItem.Property.ShowTimer ? "TimerRemoveTime" : "TimerAddTime"); - /** @type {ChatMessageDictionary} */ - var Dictionary = []; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - if (DialogFocusSourceItem.Property.ShowTimer) { - Dictionary.push({ Tag: "TimerTime", Text: Math.round(Math.abs(timeAdded)).toString() }); - Dictionary.push({ Tag: "TimerUnit", TextToLookUp: "Minutes" }); - } else { - Dictionary.push({ Tag: "TimerTime", TextToLookUp: "TimerAddRemoveUnknownTime" }); - Dictionary.push({ Tag: "TimerUnit", Text: "" }); - } - Dictionary.push({ Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name }); - - for (let A = 0; A < C.Appearance.length; A++) { - if (C.Appearance[A].Asset.Group.Name == C.FocusGroup.Name) - C.Appearance[A] = DialogFocusSourceItem; - } - ChatRoomPublishCustomAction(msg, true, Dictionary); - } else { CharacterRefresh(C); } - InventoryItemMiscMistressTimerPadlockExit(); -} - -// Exits the extended menu -function InventoryItemMiscMistressTimerPadlockExit() { - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild((Player.FocusGroup != null) ? Player : CurrentCharacter); -} diff --git a/Screens/Inventory/ItemMisc/OwnerPadlock/OwnerPadlock.js b/Screens/Inventory/ItemMisc/OwnerPadlock/OwnerPadlock.js deleted file mode 100644 index 6a1f6ee2e..000000000 --- a/Screens/Inventory/ItemMisc/OwnerPadlock/OwnerPadlock.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemMiscOwnerPadlockLoad() { -} - -// Draw the extension screen -function InventoryItemMiscOwnerPadlockDraw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 700, "white", "gray"); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Detail"), 1500, 800, "white", "gray"); -} - -// Catches the item extension clicks -function InventoryItemMiscOwnerPadlockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; -} diff --git a/Screens/Inventory/ItemMisc/OwnerTimerPadlock/OwnerTimerPadlock.js b/Screens/Inventory/ItemMisc/OwnerTimerPadlock/OwnerTimerPadlock.js deleted file mode 100644 index f9abf7b03..000000000 --- a/Screens/Inventory/ItemMisc/OwnerTimerPadlock/OwnerTimerPadlock.js +++ /dev/null @@ -1,128 +0,0 @@ -"use strict"; - -var OwnerTimerChooseList = [1, 2, 4, 8, 16, 24, 48, 72, 96, 120, 144, 168, -144, -72, -48, -24, -8, -4]; -var OwnerTimerChooseIndex = 0; - -// Loads the item extension properties -function InventoryItemMiscOwnerTimerPadlockLoad() { - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property == null)) DialogFocusSourceItem.Property = {}; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.RemoveItem == null)) DialogFocusSourceItem.Property.RemoveItem = false; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.ShowTimer == null)) DialogFocusSourceItem.Property.ShowTimer = true; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.EnableRandomInput == null)) DialogFocusSourceItem.Property.EnableRandomInput = false; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.MemberNumberList == null)) DialogFocusSourceItem.Property.MemberNumberList = []; -} - -// Draw the extension screen -function InventoryItemMiscOwnerTimerPadlockDraw() { - if ((DialogFocusItem == null) || (DialogFocusSourceItem.Property.RemoveTimer < CurrentTime)) { InventoryItemMiscOwnerTimerPadlockExit(); return; } - if (DialogFocusSourceItem.Property.ShowTimer) { - DrawText(DialogFindPlayer("TimerLeft") + " " + TimerToString(DialogFocusSourceItem.Property.RemoveTimer - CurrentTime), 1500, 150, "white", "gray"); - } else { DrawText(DialogFindPlayer("TimerUnknown"), 1500, 150, "white", "gray"); } - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - // Draw the settings - if (Player.CanInteract() && C.IsOwnedByPlayer()) { - MainCanvas.textAlign = "left"; - DrawButton(1100, 666, 64, 64, "", "White", (DialogFocusSourceItem.Property.RemoveItem) ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("RemoveItemWithTimer"), 1200, 698, "white", "gray"); - DrawButton( 1100, 746, 64, 64, "", "White", (DialogFocusSourceItem.Property.ShowTimer) ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("ShowItemWithTimerRemaining"), 1200, 778, "white", "gray"); - DrawButton(1100, 826, 64, 64, "", "White", (DialogFocusSourceItem.Property.EnableRandomInput) ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("EnableRandomInput"), 1200, 858, "white", "gray"); - MainCanvas.textAlign = "center"; - } else { - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 700, "white", "gray"); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Detail"), 1500, 800, "white", "gray"); - DrawText(DialogFindPlayer((DialogFocusSourceItem.Property.RemoveItem) ? "WillRemoveItemWithTimer" : "WontRemoveItemWithTimer"), 1500, 868, "white", "gray"); - } - - // Draw buttons to add/remove time if available - if (Player.CanInteract() && C.IsOwnedByPlayer()) { - DrawButton(1100, 910, 250, 70, DialogFindPlayer("AddTimerTime"), "White"); - DrawBackNextButton(1400, 910, 250, 70, OwnerTimerChooseList[OwnerTimerChooseIndex] + " " + DialogFindPlayer("Hours"), "White", "", - () => OwnerTimerChooseList[(OwnerTimerChooseList.length + OwnerTimerChooseIndex - 1) % OwnerTimerChooseList.length] + " " + DialogFindPlayer("Hours"), - () => OwnerTimerChooseList[(OwnerTimerChooseIndex + 1) % OwnerTimerChooseList.length] + " " + DialogFindPlayer("Hours")); - } - else if (Player.CanInteract() && DialogFocusSourceItem.Property.EnableRandomInput) { - for (let I = 0; I < DialogFocusSourceItem.Property.MemberNumberList.length; I++) { - if (DialogFocusSourceItem.Property.MemberNumberList[I] == Player.MemberNumber) return; - } - DrawButton(1100, 910, 250, 70, "- 2 " + DialogFindPlayer("Hours"), "White"); - DrawButton(1400, 910, 250, 70, DialogFindPlayer("Random"), "White"); - DrawButton(1700, 910, 250, 70, "+ 2 " + DialogFindPlayer("Hours"), "White"); - } -} - -// Catches the item extension clicks -function InventoryItemMiscOwnerTimerPadlockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) InventoryItemMiscOwnerTimerPadlockExit(); - if (!Player.CanInteract()) return; - - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (C.IsOwnedByPlayer()) { - if ((MouseX >= 1100) && (MouseX <= 1164)) { - if ((MouseY >= 666) && (MouseY <= 730)) { DialogFocusSourceItem.Property.RemoveItem = !(DialogFocusSourceItem.Property.RemoveItem); } - if ((MouseY >= 746) && (MouseY <= 810)) { DialogFocusSourceItem.Property.ShowTimer = !(DialogFocusSourceItem.Property.ShowTimer); } - if ((MouseY >= 826) && (MouseY <= 890)) { DialogFocusSourceItem.Property.EnableRandomInput = !(DialogFocusSourceItem.Property.EnableRandomInput); } - if (CurrentScreen == "ChatRoom") ChatRoomCharacterItemUpdate(CharacterGetCurrent()); - } - } - - if ((MouseY >= 910) && (MouseY <= 975)) { - if (C.IsOwnedByPlayer()) { - if ((MouseX >= 1100) && (MouseX < 1350)) InventoryItemMiscOwnerTimerPadlockAdd(OwnerTimerChooseList[OwnerTimerChooseIndex] * 3600); - if ((MouseX >= 1400) && (MouseX < 1650)) { - if (MouseX <= 1525) OwnerTimerChooseIndex = (OwnerTimerChooseList.length + OwnerTimerChooseIndex - 1) % OwnerTimerChooseList.length; - else OwnerTimerChooseIndex = (OwnerTimerChooseIndex + 1) % OwnerTimerChooseList.length; - } - } - else if (DialogFocusSourceItem.Property.EnableRandomInput) { - for (let I = 0; I < DialogFocusSourceItem.Property.MemberNumberList.length; I++) { - if (DialogFocusSourceItem.Property.MemberNumberList[I] == Player.MemberNumber) return; - } - if ((MouseX >= 1100) && (MouseX < 1350)) { InventoryItemMiscOwnerTimerPadlockAdd(-2 * 3600, true); } - if ((MouseX >= 1400) && (MouseX < 1650)) { InventoryItemMiscOwnerTimerPadlockAdd(4 * 3600 * ((Math.random() >= 0.5) ? 1 : -1), true); } - if ((MouseX >= 1700) && (MouseX < 1950)) { InventoryItemMiscOwnerTimerPadlockAdd(2 * 3600, true); } - } - } -} - -// When a value is added to the timer, can be a negative one -function InventoryItemMiscOwnerTimerPadlockAdd(TimeToAdd, PlayerMemberNumberToList) { - if (PlayerMemberNumberToList) DialogFocusSourceItem.Property.MemberNumberList.push(Player.MemberNumber); - var TimerBefore = DialogFocusSourceItem.Property.RemoveTimer; - if (DialogFocusItem.Asset.RemoveTimer > 0) DialogFocusSourceItem.Property.RemoveTimer = Math.round(Math.min(DialogFocusSourceItem.Property.RemoveTimer + (TimeToAdd * 1000), CurrentTime + (DialogFocusItem.Asset.MaxTimer * 1000))); - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (CurrentScreen == "ChatRoom") { - var timeAdded = (DialogFocusSourceItem.Property.RemoveTimer - TimerBefore) / (1000 * 3600); - var msg = ((timeAdded < 0) && DialogFocusSourceItem.Property.ShowTimer ? "TimerRemoveTime" : "TimerAddTime"); - /** @type {ChatMessageDictionary} */ - var Dictionary = []; - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - if (DialogFocusSourceItem.Property.ShowTimer) { - Dictionary.push({Tag: "TimerTime", Text: Math.round(Math.abs(timeAdded)).toString()}); - Dictionary.push({Tag: "TimerUnit", TextToLookUp: "Hours"}); - } else { - Dictionary.push({Tag: "TimerTime", TextToLookUp: "TimerAddRemoveUnknownTime"}); - Dictionary.push({Tag: "TimerUnit", Text: ""}); - } - Dictionary.push({Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name}); - - for (let A = 0; A < C.Appearance.length; A++) { - if (C.Appearance[A].Asset.Group.Name == C.FocusGroup.Name) - C.Appearance[A] = DialogFocusSourceItem; - } - ChatRoomPublishCustomAction(msg, true, Dictionary); - } else { CharacterRefresh(C); } - InventoryItemMiscOwnerTimerPadlockExit(); -} - -// Exits the extended menu -function InventoryItemMiscOwnerTimerPadlockExit() { - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild((Player.FocusGroup != null) ? Player : CurrentCharacter); -} diff --git a/Screens/Inventory/ItemMisc/PandoraPadlock/PandoraPadlock.js b/Screens/Inventory/ItemMisc/PandoraPadlock/PandoraPadlock.js deleted file mode 100644 index 7363ef307..000000000 --- a/Screens/Inventory/ItemMisc/PandoraPadlock/PandoraPadlock.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemMiscPandoraPadlockLoad() { -} - -// Draw the extension screen -function InventoryItemMiscPandoraPadlockDraw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null) && (DialogFocusSourceItem.Property.LockMemberNumber >= 0)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 700, "white", "gray"); -} - -// Catches the item extension clicks -function InventoryItemMiscPandoraPadlockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; -} diff --git a/Screens/Inventory/ItemMisc/PasswordPadlock/PasswordPadlock.js b/Screens/Inventory/ItemMisc/PasswordPadlock/PasswordPadlock.js deleted file mode 100644 index a076db92e..000000000 --- a/Screens/Inventory/ItemMisc/PasswordPadlock/PasswordPadlock.js +++ /dev/null @@ -1,210 +0,0 @@ -"use strict"; - -const InventoryItemMiscPasswordPadlockPasswordRegex = /^[A-Z]+$/; - -// Loads the item extension properties -function InventoryItemMiscPasswordPadlockLoad() { - if (!DialogFocusSourceItem) return; - - if (!DialogFocusSourceItem.Property) DialogFocusSourceItem.Property = {}; - const Property = DialogFocusSourceItem.Property; - const C = CharacterGetCurrent(); - - if (Property.Password == null) Property.Password = "PASSWORD"; - if (Property.Hint == null) Property.Hint = "Take a guess..."; - if (Property.LockSet == null) Property.LockSet = false; - if (Property.RemoveOnUnlock == null) Property.RemoveOnUnlock = false; - - // Only create the inputs if the zone isn't blocked - if (InventoryGroupIsBlocked(C, C.FocusGroup.Name)) return; - - if (InventoryItemMiscPasswordPadlockIsSet()) { - // Normal lock interface - ElementCreateInput("Password", "text", "", "8"); - // the current code is shown for owners, lovers and the member whose number is on the padlock - if ( - Player.MemberNumber === Property.LockMemberNumber || - C.IsOwnedByPlayer() || - C.IsLoverOfPlayer() - ) { - document.getElementById("Password").setAttribute("placeholder", Property.Password); - } - } else { - // Set a password and hint - ElementCreateInput("SetHint", "text", "", "140"); - ElementCreateInput("SetPassword", "text", "", "8"); - // the current code is shown for owners, lovers and the member whose number is on the padlock - document.getElementById("SetPassword").setAttribute("placeholder", Property.Password); - document.getElementById("SetHint").setAttribute("placeholder", Property.Hint); - } -} - -// Draw the extension screen -function InventoryItemMiscPasswordPadlockDraw() { - if (!DialogFocusItem || !DialogFocusSourceItem) return InventoryItemMiscPasswordPadlockExit(); - const Property = DialogFocusSourceItem.Property; - const C = CharacterGetCurrent(); - - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - - if (Property && Property.LockMemberNumber != null) { - DrawText( - DialogFindPlayer("LockMemberNumber") + " " + Property.LockMemberNumber.toString(), - 1500, 600, "white", "gray", - ); - } - - if (InventoryGroupIsBlocked(C, C.FocusGroup.Name)) { - // If the zone is blocked, just display some text informing the player that they can't access the lock - DrawText(DialogFindPlayer("LockZoneBlocked"), 1500, 800, "white", "gray"); - } else { - InventoryItemMiscPasswordPadlockDrawControls(); - } -} - -function InventoryItemMiscPasswordPadlockDrawControls() { - const Property = DialogFocusSourceItem.Property; - - if (InventoryItemMiscPasswordPadlockIsSet()) { - // Normal lock interface - if (Property && Property.Hint) { - DrawTextWrap("\"" + Property.Hint + "\"", 1000, 640, 1000, 120, null, null, 2); - } - MainCanvas.textAlign = "right"; - DrawText(DialogFindPlayer("PasswordPadlockOld"), 1350, 810, "white", "gray"); - ElementPosition("Password", 1643, 805, 550); - MainCanvas.textAlign = "center"; - DrawButton(1360, 871, 250, 64, DialogFindPlayer("PasswordPadlockEnter"), "White", ""); - if (PreferenceMessage != "") DrawText(DialogFindPlayer(PreferenceMessage), 1500, 963, "Red", "Black"); - } else { - ElementPosition("SetHint", 1643, 700, 550); - ElementPosition("SetPassword", 1643, 770, 550); - MainCanvas.textAlign = "left"; - DrawText(DialogFindPlayer("PasswordPadlockSetHint"), 1100, 705, "white", "gray"); - DrawText(DialogFindPlayer("PasswordPadlockSetPassword"), 1100, 775, "white", "gray"); - MainCanvas.textAlign = "center"; - DrawButton(1360, 891, 250, 64, DialogFindPlayer("PasswordPadlockChangePassword"), "White", ""); - if (PreferenceMessage != "") DrawText(DialogFindPlayer(PreferenceMessage), 1500, 963, "Red", "Black"); - - if (Property) { - DrawButton(1600, 820, 64, 64, "", "White", Property.RemoveOnUnlock ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("PasswordPadlockRemoveOnUnlock"), 1400, 855, "White", "Gray"); - } - } -} - -// Catches the item extension clicks -function InventoryItemMiscPasswordPadlockClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - return InventoryItemMiscPasswordPadlockExit(); - } - - const C = CharacterGetCurrent(); - if (InventoryGroupIsBlocked(C, C.FocusGroup.Name)) return; - - InventoryItemMiscPasswordPadlockControlsClick(InventoryItemMiscPasswordPadlockExit); -} - -function InventoryItemMiscPasswordPadlockControlsClick(ExitCallback) { - if (!DialogFocusSourceItem) return; - - if (InventoryItemMiscPasswordPadlockIsSet()) { - if (MouseIn(1360, 871, 250, 64)) { - InventoryItemMiscPasswordPadlockHandleOpenClick(ExitCallback); - } - } else { - if (MouseIn(1600, 820, 250, 64)) { - DialogFocusSourceItem.Property.RemoveOnUnlock = !DialogFocusSourceItem.Property.RemoveOnUnlock; - } else if (MouseIn(1360, 891, 250, 64)) { - InventoryItemMiscPasswordPadlockHandleFirstSet(ExitCallback); - } - } -} - -function InventoryItemMiscPasswordPadlockHandleOpenClick(ExitCallback) { - const Property = DialogFocusSourceItem.Property; - const C = CharacterGetCurrent(); - - // Opens the padlock - if (ElementValue("Password").toUpperCase() === Property.Password) { - if (DialogFocusSourceItem.Property.RemoveOnUnlock) { - InventoryRemove(CurrentCharacter, C.FocusGroup.Name, true); - if (CurrentScreen == "ChatRoom") { - ChatRoomCharacterUpdate(C); - } - } - CommonPadlockUnlock(C, DialogFocusSourceItem); - ExitCallback(); - } - - // Send fail message if online - else if (CurrentScreen == "ChatRoom") { - const Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name }, - { Tag: "Password", Text: ElementValue("Password") }, - ]; - ChatRoomPublishCustomAction("PasswordFail", true, Dictionary); - ExitCallback(); - } else { PreferenceMessage = "PasswordPadlockError"; } -} - -function InventoryItemMiscPasswordPadlockHandleFirstSet(ExitCallback) { - const Property = DialogFocusSourceItem.Property; - const C = CharacterGetCurrent(); - - const pw = ElementValue("SetPassword").toUpperCase(); - const hint = ElementValue("SetHint"); - // We only accept code made of letters - if (pw === "" || pw.match(InventoryItemMiscPasswordPadlockPasswordRegex)) { - Property.LockSet = true; - if (pw !== "") Property.Password = pw; - if (hint !== "") Property.Hint = hint; - - for (let A = 0; A < C.Appearance.length; A++) { - if (C.Appearance[A].Asset.Group.Name == C.FocusGroup.Name) { - C.Appearance[A] = DialogFocusSourceItem; - break; - } - } - - if (CurrentScreen === "ChatRoom") { - InventoryItemMiscPasswordPadlockPublishPasswordChange(C); - ExitCallback(); - } else { - CharacterRefresh(C); - ExitCallback(); - } - } else { PreferenceMessage = "PasswordPadlockErrorInput"; } -} - -function InventoryItemMiscPasswordPadlockExit() { - ElementRemove("Password"); - ElementRemove("SetPassword"); - ElementRemove("SetHint"); - PreferenceMessage = ""; - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild(CharacterGetCurrent()); -} - -function InventoryItemMiscPasswordPadlockIsSet() { - if (!DialogFocusSourceItem || !DialogFocusSourceItem.Property) { - return false; - } else if (DialogFocusSourceItem.Property.LockSet) { - return true; - } else { - const { LockMemberNumber } = DialogFocusSourceItem.Property; - return LockMemberNumber != null && LockMemberNumber !== Player.MemberNumber; - } -} - -function InventoryItemMiscPasswordPadlockPublishPasswordChange(C) { - const Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name }, - ]; - ChatRoomPublishCustomAction("PasswordChangeSuccess", true, Dictionary); -} diff --git a/Screens/Inventory/ItemMisc/SafewordPadlock/SafewordPadlock.js b/Screens/Inventory/ItemMisc/SafewordPadlock/SafewordPadlock.js deleted file mode 100644 index e3a129441..000000000 --- a/Screens/Inventory/ItemMisc/SafewordPadlock/SafewordPadlock.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemMiscSafewordPadlockLoad() { - if (!DialogFocusItem || !DialogFocusSourceItem) return InventoryItemMiscSafewordPadlockExit(); - - if (!DialogFocusSourceItem.Property) DialogFocusSourceItem.Property = {}; - const Property = DialogFocusSourceItem.Property; - const C = CharacterGetCurrent(); - - if (Property.Password == null) Property.Password = "PLEASE"; - if (Property.Hint == null) Property.Hint = "Say the magic word..."; - if (Property.LockSet == null) Property.LockSet = false; - - if (InventoryItemMiscPasswordPadlockIsSet()) { - // Normal lock interface - ElementCreateInput("Password", "text", "", "8"); - // the current code is shown for owners, lovers and the member whose number is on the padlock - // It is also shown for the person who is bound by it - if ( - C.ID === 0 || - Player.MemberNumber === Property.LockMemberNumber || - C.IsOwnedByPlayer() || - C.IsLoverOfPlayer() - ) { - document.getElementById("Password").setAttribute("placeholder", Property.Password); - } - } else { - // Set a password and hint - ElementCreateInput("SetHint", "text", "", "140"); - ElementCreateInput("SetPassword", "text", "", "8"); - // the current code is shown for owners, lovers and the member whose number is on the padlock - document.getElementById("SetPassword").setAttribute("placeholder", Property.Password); - document.getElementById("SetHint").setAttribute("placeholder", Property.Hint); - } -} - -// Draw the extension screen -function InventoryItemMiscSafewordPadlockDraw() { - if (!DialogFocusSourceItem) return; - const Property = DialogFocusSourceItem.Property; - - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - - if (Property && Property.LockMemberNumber != null) { - DrawText( - DialogFindPlayer("LockMemberNumber") + " " + Property.LockMemberNumber.toString(), - 1500, 600, "white", "gray", - ); - } - - InventoryItemMiscPasswordPadlockDrawControls(); -} - -// Catches the item extension clicks -function InventoryItemMiscSafewordPadlockClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - return InventoryItemMiscSafewordPadlockExit(); - } - - InventoryItemMiscPasswordPadlockControlsClick(InventoryItemMiscSafewordPadlockExit); -} - -function InventoryItemMiscSafewordPadlockExit() { - InventoryItemMiscPasswordPadlockExit(); -} diff --git a/Screens/Inventory/ItemMisc/ServingTray/Cake.png b/Screens/Inventory/ItemMisc/ServingTray/Cake.png deleted file mode 100644 index b8206746e..000000000 Binary files a/Screens/Inventory/ItemMisc/ServingTray/Cake.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/ServingTray/Cookies.png b/Screens/Inventory/ItemMisc/ServingTray/Cookies.png deleted file mode 100644 index 1e9a1ecb3..000000000 Binary files a/Screens/Inventory/ItemMisc/ServingTray/Cookies.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/ServingTray/Drinks.png b/Screens/Inventory/ItemMisc/ServingTray/Drinks.png deleted file mode 100644 index ac010210f..000000000 Binary files a/Screens/Inventory/ItemMisc/ServingTray/Drinks.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/ServingTray/Empty.png b/Screens/Inventory/ItemMisc/ServingTray/Empty.png deleted file mode 100644 index 2eb13b045..000000000 Binary files a/Screens/Inventory/ItemMisc/ServingTray/Empty.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/ServingTray/Toys.png b/Screens/Inventory/ItemMisc/ServingTray/Toys.png deleted file mode 100644 index ebfdacb65..000000000 Binary files a/Screens/Inventory/ItemMisc/ServingTray/Toys.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/TeddyBear/Bear.png b/Screens/Inventory/ItemMisc/TeddyBear/Bear.png deleted file mode 100644 index 358037651..000000000 Binary files a/Screens/Inventory/ItemMisc/TeddyBear/Bear.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/TeddyBear/Bunny.png b/Screens/Inventory/ItemMisc/TeddyBear/Bunny.png deleted file mode 100644 index 09e8a5764..000000000 Binary files a/Screens/Inventory/ItemMisc/TeddyBear/Bunny.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/TeddyBear/Fox.png b/Screens/Inventory/ItemMisc/TeddyBear/Fox.png deleted file mode 100644 index b8b04c72c..000000000 Binary files a/Screens/Inventory/ItemMisc/TeddyBear/Fox.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/TeddyBear/Kitty.png b/Screens/Inventory/ItemMisc/TeddyBear/Kitty.png deleted file mode 100644 index 4faf398dd..000000000 Binary files a/Screens/Inventory/ItemMisc/TeddyBear/Kitty.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/TeddyBear/Pony.png b/Screens/Inventory/ItemMisc/TeddyBear/Pony.png deleted file mode 100644 index 6422d5ec0..000000000 Binary files a/Screens/Inventory/ItemMisc/TeddyBear/Pony.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/TeddyBear/Pup.png b/Screens/Inventory/ItemMisc/TeddyBear/Pup.png deleted file mode 100644 index ec21367f2..000000000 Binary files a/Screens/Inventory/ItemMisc/TeddyBear/Pup.png and /dev/null differ diff --git a/Screens/Inventory/ItemMisc/TimerPadlock/TimerPadlock.js b/Screens/Inventory/ItemMisc/TimerPadlock/TimerPadlock.js deleted file mode 100644 index 386fd43c7..000000000 --- a/Screens/Inventory/ItemMisc/TimerPadlock/TimerPadlock.js +++ /dev/null @@ -1,56 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemMiscTimerPadlockLoad() { - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property == null)) DialogFocusSourceItem.Property = {}; - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.RemoveItem == null)) DialogFocusSourceItem.Property.RemoveItem = false; -} - -// Draw the extension screen -function InventoryItemMiscTimerPadlockDraw() { - if ((DialogFocusItem == null) || (DialogFocusSourceItem.Property.RemoveTimer < CurrentTime)) { InventoryItemMiscTimerPadlockExit(); return; } - DrawText(DialogFindPlayer("TimerLeft") + " " + TimerToString(DialogFocusSourceItem.Property.RemoveTimer - CurrentTime), 1500, 150, "white", "gray"); - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer(DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Intro"), 1500, 600, "white", "gray"); - if ((DialogFocusSourceItem != null) && (DialogFocusSourceItem.Property != null) && (DialogFocusSourceItem.Property.LockMemberNumber != null)) - DrawText(DialogFindPlayer("LockMemberNumber") + " " + DialogFocusSourceItem.Property.LockMemberNumber.toString(), 1500, 700, "white", "gray"); - if ((Player.MemberNumber == DialogFocusSourceItem.Property.LockMemberNumber) && Player.CanInteract()) { - MainCanvas.textAlign = "left"; - DrawButton(1100, 836, 64, 64, "", "White", (DialogFocusSourceItem.Property.RemoveItem) ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("RemoveItemWithTimer"), 1200, 868, "white", "gray"); - MainCanvas.textAlign = "center"; - } else DrawText(DialogFindPlayer((DialogFocusSourceItem.Property.RemoveItem) ? "WillRemoveItemWithTimer" : "WontRemoveItemWithTimer"), 1500, 868, "white", "gray"); - if (Player.CanInteract()) DrawButton(1350, 910, 300, 65, DialogFindPlayer("RestartTimer"), "White"); -} - -// Catches the item extension clicks -function InventoryItemMiscTimerPadlockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) InventoryItemMiscTimerPadlockExit(); - if ((MouseX >= 1100) && (MouseX <= 1164) && (MouseY >= 836) && (MouseY <= 900) && (Player.MemberNumber == DialogFocusSourceItem.Property.LockMemberNumber) && Player.CanInteract()) { - DialogFocusSourceItem.Property.RemoveItem = !(DialogFocusSourceItem.Property.RemoveItem); - if (CurrentScreen == "ChatRoom") ChatRoomCharacterItemUpdate(CharacterGetCurrent()); - } - if ((MouseX >= 1350) && (MouseX <= 1650) && (MouseY >= 910) && (MouseY <= 975) && Player.CanInteract()) InventoryItemMiscTimerPadlockReset(); -} - -// When the timer resets -function InventoryItemMiscTimerPadlockReset() { - if (DialogFocusItem.Asset.RemoveTimer > 0) DialogFocusSourceItem.Property.RemoveTimer = Math.round(CurrentTime + (DialogFocusItem.Asset.RemoveTimer * 1000)); - if (CurrentScreen == "ChatRoom") { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - var msg = "TimerRestart"; - /** @type {ChatMessageDictionary} */ - var Dictionary = []; - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name}); - ChatRoomPublishCustomAction(msg, true, Dictionary); - } - InventoryItemMiscTimerPadlockExit(); -} - -// Exits the extended menu -function InventoryItemMiscTimerPadlockExit() { - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild((Player.FocusGroup != null) ? Player : CurrentCharacter); -} diff --git a/Screens/Inventory/ItemMisc/TimerPasswordPadlock/TimerPasswordPadlock.js b/Screens/Inventory/ItemMisc/TimerPasswordPadlock/TimerPasswordPadlock.js deleted file mode 100644 index 0468baf9b..000000000 --- a/Screens/Inventory/ItemMisc/TimerPasswordPadlock/TimerPasswordPadlock.js +++ /dev/null @@ -1,248 +0,0 @@ -"use strict"; - -const PasswordTimerChooseList = [5, 10, 15, 30, 60, 120, 180, 240, -180, -120, -60, -30, -15]; -let PasswordTimerChooseIndex = 0; - -// Loads the item extension properties -function InventoryItemMiscTimerPasswordPadlockLoad() { - if (!DialogFocusSourceItem) return; - - if (!DialogFocusSourceItem.Property) DialogFocusSourceItem.Property = {}; - const Property = DialogFocusSourceItem.Property; - const C = CharacterGetCurrent(); - - if (Property.Password == null) Property.Password = "PASSWORD"; - if (Property.Hint == null) Property.Hint = "Take a guess..."; - if (Property.LockSet == null) Property.LockSet = false; - if (Property.RemoveItem == null) Property.RemoveItem = false; - if (Property.ShowTimer == null) Property.ShowTimer = true; - if (Property.EnableRandomInput == null) Property.EnableRandomInput = false; - if (Property.MemberNumberList == null) Property.MemberNumberList = []; - - // Only create the inputs if the zone isn't blocked - if (InventoryGroupIsBlocked(C, C.FocusGroup.Name)) return; - - // Only create the inputs if the zone isn't blocked - if (InventoryItemMiscPasswordPadlockIsSet()) { - // Normal lock interface - ElementCreateInput("Password", "text", "", "8"); - // the current code is shown for owners, lovers and the member whose number is on the padlock - if ( - Player.MemberNumber === Property.LockMemberNumber || - C.IsOwnedByPlayer() || - C.IsLoverOfPlayer() - ) { - document.getElementById("Password").setAttribute("placeholder", Property.Password); - } - } else { - // Set a password and hint - ElementCreateInput("SetHint", "text", "", "140"); - ElementCreateInput("SetPassword", "text", "", "8"); - // the current code is shown for owners, lovers and the member whose number is on the padlock - document.getElementById("SetPassword").setAttribute("placeholder", DialogFocusSourceItem.Property.Password); - document.getElementById("SetHint").setAttribute("placeholder", DialogFocusSourceItem.Property.Hint); - } -} - -// Draw the extension screen -function InventoryItemMiscTimerPasswordPadlockDraw() { - if ( - !DialogFocusItem || - !DialogFocusSourceItem || - !DialogFocusSourceItem.Property || - DialogFocusSourceItem.Property.RemoveTimer < CurrentTime - ) { - return InventoryItemMiscTimerPasswordPadlockExit(); - } - - const Property = DialogFocusSourceItem.Property; - const C = CharacterGetCurrent(); - - if (Property && Property.ShowTimer) { - DrawText(DialogFindPlayer("TimerLeft") + " " + - TimerToString(Property.RemoveTimer - CurrentTime), 1500, 100, "white", "gray"); - } else { - DrawText(DialogFindPlayer("TimerUnknown"), 1500, 150, "white", "gray"); - } - - DrawAssetPreview(1387, 175, DialogFocusItem.Asset); - - if (Property && Property.LockMemberNumber != null) { - const Text = DialogFindPlayer("LockMemberNumber") + " " + Property.LockMemberNumber; - DrawText(Text, 1500, 500, "white", "gray"); - } - - if (InventoryGroupIsBlocked(C, C.FocusGroup.Name)) { - // If the zone is blocked, just display some text informing the player that they can't access the lock - DrawText(DialogFindPlayer("LockZoneBlocked"), 1500, 550, "white", "gray"); - return; - } - - if (InventoryItemMiscPasswordPadlockIsSet()) { - // Normal lock interface - if (Property && Property.Hint) { - DrawText("\"" + Property.Hint + "\"", 1500, 550, "white", "gray"); - } - MainCanvas.textAlign = "right"; - DrawText(DialogFindPlayer("PasswordPadlockOld"), 1390, 610, "white", "gray"); - ElementPosition("Password", 1585, 605, 350); - MainCanvas.textAlign = "center"; - DrawButton(1775, 575, 200, 64, DialogFindPlayer("PasswordPadlockEnter"), "White", ""); - if (PreferenceMessage != "") DrawText(DialogFindPlayer(PreferenceMessage), 1500, 200, "Red", "Black"); - } else { - ElementPosition("SetHint", 1675, 550, 600); - ElementPosition("SetPassword", 1563, 620, 375); - MainCanvas.textAlign = "left"; - DrawText(DialogFindPlayer("PasswordPadlockSetHint"), 1100, 553, "white", "gray"); - DrawText(DialogFindPlayer("PasswordPadlockSetPassword"), 1100, 623, "white", "gray"); - MainCanvas.textAlign = "center"; - DrawButton(1765, 591, 200, 64, DialogFindPlayer("PasswordPadlockChangePassword"), "White", ""); - if (PreferenceMessage != "") DrawText(DialogFindPlayer(PreferenceMessage), 1500, 200, "Red", "Black"); - } - - // Draw the settings - if (Player.CanInteract() && (Player.MemberNumber == Property.LockMemberNumber)) { - MainCanvas.textAlign = "left"; - DrawCheckbox(1100, 666, 64, 64, DialogFindPlayer("RemoveItemWithTimer"), Property.RemoveItem, false, "#fff"); - DrawCheckbox( - 1100, 746, 64, 64, DialogFindPlayer("ShowItemWithTimerRemaining"), Property.ShowTimer, false, "#fff"); - DrawCheckbox( - 1100, 828, 64, 64, DialogFindPlayer("EnableRandomInput"), Property.EnableRandomInput, false, "#fff"); - MainCanvas.textAlign = "center"; - } else { - const RemoveTextKey = (Property.RemoveItem) ? "WillRemoveItemWithTimer" : "WontRemoveItemWithTimer"; - DrawText(DialogFindPlayer(RemoveTextKey), 1500, 868, "white", "gray"); - } - - const Minutes = DialogFindPlayer("Minutes"); - // Draw buttons to add/remove time if available - if (Player.CanInteract() && (Player.MemberNumber == Property.LockMemberNumber)) { - DrawButton(1100, 910, 250, 70, DialogFindPlayer("AddTimerTime"), "White"); - DrawBackNextButton(1400, 910, 250, 70, - PasswordTimerChooseList[PasswordTimerChooseIndex] + " " + Minutes, - "White", - "", - () => PasswordTimerChooseList[(PasswordTimerChooseList.length + PasswordTimerChooseIndex - 1) % - PasswordTimerChooseList.length] + " " + Minutes, - () => PasswordTimerChooseList[(PasswordTimerChooseIndex + 1) % PasswordTimerChooseList.length] + " " + - Minutes, - ); - } else if (Player.CanInteract() && Property.EnableRandomInput) { - for (let I = 0; I < Property.MemberNumberList.length; I++) { - if (Property.MemberNumberList[I] == Player.MemberNumber) return; - } - const TimeButtonSuffix = `${DialogFocusItem.Asset.RemoveTimer * 3 / 60} ${Minutes}`; - DrawButton(1100, 910, 250, 70, `- ${TimeButtonSuffix}`, "White"); - DrawButton(1400, 910, 250, 70, DialogFindPlayer("Random"), "White"); - DrawButton(1700, 910, 250, 70, `+ ${TimeButtonSuffix}`, "White"); - } -} - -// Catches the item extension clicks -function InventoryItemMiscTimerPasswordPadlockClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemMiscTimerPasswordPadlockExit(); - } - - if (!DialogFocusSourceItem) return; - const Property = DialogFocusSourceItem.Property; - const C = CharacterGetCurrent(); - - if (InventoryGroupIsBlocked(C, C.FocusGroup.Name)) return; - - if (InventoryItemMiscPasswordPadlockIsSet() && MouseIn(1775, 575, 200, 64)) { - InventoryItemMiscPasswordPadlockHandleOpenClick(InventoryItemMiscTimerPasswordPadlockExit); - } else if (MouseIn(1765, 591, 200, 64)) { - InventoryItemMiscPasswordPadlockHandleFirstSet(InventoryItemMiscTimerPasswordPadlockExit); - } - - if (!Player.CanInteract()) return; - - if (Player.MemberNumber === Property.LockMemberNumber) { - if (MouseXIn(1100, 64)) { - let Update = true; - if (MouseYIn(666, 64)) { - Property.RemoveItem = !Property.RemoveItem; - } else if (MouseYIn(746, 64)) { - Property.ShowTimer = !Property.ShowTimer; - } else if (MouseYIn(826, 64)) { - Property.EnableRandomInput = !Property.EnableRandomInput; - } else { - Update = false; - } - if (Update && CurrentScreen == "ChatRoom") ChatRoomCharacterItemUpdate(C); - } - } - - if (MouseYIn(910, 70)) { - if (Player.MemberNumber === Property.LockMemberNumber) { - if (MouseXIn(1100, 250)) { - InventoryItemMiscTimerPasswordPadlockAdd(PasswordTimerChooseList[PasswordTimerChooseIndex] * 60, false); - } else if (MouseXIn(1400, 250)) { - if (MouseX <= 1525) { - PasswordTimerChooseIndex = (PasswordTimerChooseList.length + PasswordTimerChooseIndex - 1) % - PasswordTimerChooseList.length; - } else { - PasswordTimerChooseIndex = (PasswordTimerChooseIndex + 1) % PasswordTimerChooseList.length; - } - } - } else if (Property.EnableRandomInput) { - for (let I = 0; I < Property.MemberNumberList.length; I++) { - if (Property.MemberNumberList[I] == Player.MemberNumber) return; - } - const RemoveTimer = DialogFocusItem.Asset.RemoveTimer; - let TimeToAdd = 0; - if (MouseXIn(1100, 250)) TimeToAdd = -RemoveTimer * 2; - else if (MouseXIn(1400, 250)) TimeToAdd = RemoveTimer * 4 * ((Math.random() >= 0.5) ? 1 : -1); - else if (MouseXIn(1700, 250)) TimeToAdd = RemoveTimer * 2; - - if (TimeToAdd) InventoryItemMiscTimerPasswordPadlockAdd(TimeToAdd, true); - } - } -} - -// When a value is added to the timer, can be a negative one -function InventoryItemMiscTimerPasswordPadlockAdd(TimeToAdd, PlayerMemberNumberToList) { - const Property = DialogFocusSourceItem.Property; - const C = CharacterGetCurrent(); - - if (PlayerMemberNumberToList) Property.MemberNumberList.push(Player.MemberNumber); - const TimerBefore = Property.RemoveTimer; - if (DialogFocusItem.Asset.RemoveTimer > 0) Property.RemoveTimer = Math.round( - Math.min(Property.RemoveTimer + (TimeToAdd * 1000), CurrentTime + (DialogFocusItem.Asset.MaxTimer * 1000))); - if (CurrentScreen === "ChatRoom") { - const timeAdded = (Property.RemoveTimer - TimerBefore) / (1000 * 60); - const msg = ((timeAdded < 0) && Property.ShowTimer ? "TimerRemoveTime" : "TimerAddTime"); - /** @type {ChatMessageDictionary} */ - const Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "FocusAssetGroup", AssetGroupName: C.FocusGroup.Name }, - ]; - if (Property.ShowTimer) { - Dictionary.push({ Tag: "TimerTime", Text: Math.round(Math.abs(timeAdded)).toString() }); - Dictionary.push({ Tag: "TimerUnit", TextToLookUp: "Minutes" }); - } else { - Dictionary.push({ Tag: "TimerTime", TextToLookUp: "TimerAddRemoveUnknownTime" }); - Dictionary.push({ Tag: "TimerUnit", Text: "" }); - } - - for (let A = 0; A < C.Appearance.length; A++) { - if (C.Appearance[A].Asset.Group.Name == C.FocusGroup.Name) { - C.Appearance[A] = DialogFocusSourceItem; - break; - } - } - - ChatRoomPublishCustomAction(msg, true, Dictionary); - } else { - CharacterRefresh(C); - } - - InventoryItemMiscTimerPasswordPadlockExit(); -} - -function InventoryItemMiscTimerPasswordPadlockExit() { - InventoryItemMiscPasswordPadlockExit(); -} diff --git a/Screens/Inventory/ItemMisc/WoodenSign/WoodenSign.js b/Screens/Inventory/ItemMisc/WoodenSign/WoodenSign.js deleted file mode 100644 index 8b37766b0..000000000 --- a/Screens/Inventory/ItemMisc/WoodenSign/WoodenSign.js +++ /dev/null @@ -1,119 +0,0 @@ -"use strict"; - -const InventoryItemMiscWoodenSignFont = "'Calligraffitti', cursive"; - -// Loads the item extension properties -function InventoryItemMiscWoodenSignLoad() { - DynamicDrawLoadFont(InventoryItemMiscWoodenSignFont); - - var C = CharacterGetCurrent(); - var MustRefresh = false; - - if (DialogFocusItem.Property == null) DialogFocusItem.Property = {}; - if (typeof DialogFocusItem.Property.Text !== "string") { - DialogFocusItem.Property.Text = ""; - MustRefresh = true; - } - if (typeof DialogFocusItem.Property.Text2 !== "string") { - DialogFocusItem.Property.Text2 = ""; - MustRefresh = true; - } - if (MustRefresh) { - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, DialogFocusItem.Asset.Group.Name); - } - - const input1 = ElementCreateInput("WoodenSignText1", "text", DialogFocusItem.Property.Text, "12"); - const input2 = ElementCreateInput("WoodenSignText2", "text", DialogFocusItem.Property.Text2, "12"); - if (input1) input1.pattern = DynamicDrawTextInputPattern; - if (input2) input2.pattern = DynamicDrawTextInputPattern; -} - -// Draw the extension screen -function InventoryItemMiscWoodenSignDraw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - ElementPosition("WoodenSignText1", 1505, 600, 350); - ElementPosition("WoodenSignText2", 1505, 680, 350); - DrawButton( - 1330, 731, 340, 64, DialogFindPlayer("SaveText"), - (ElementValue("WoodenSignText1") + ElementValue("WoodenSignText2")).match(DynamicDrawTextRegex) ? "White" : "#888", "", - ); -} - -// Catches the item extension clicks -function InventoryItemMiscWoodenSignClick() { - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemMiscWoodenSignExit(); - } - - if (MouseIn(1330, 731, 340, 64) && (ElementValue("WoodenSignText1") + ElementValue("WoodenSignText2")).match(DynamicDrawTextRegex)) { - DialogFocusItem.Property.Text = ElementValue("WoodenSignText1"); - DialogFocusItem.Property.Text2 = ElementValue("WoodenSignText2"); - InventoryItemMiscWoodenSignChange(); - } -} - -// Leaves the extended screen -function InventoryItemMiscWoodenSignExit() { - ElementRemove("WoodenSignText1"); - ElementRemove("WoodenSignText2"); - PreferenceMessage = ""; - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild(CharacterGetCurrent()); -} - -// When the text is changed -function InventoryItemMiscWoodenSignChange() { - var C = CharacterGetCurrent(); - CharacterRefresh(C); - if (CurrentScreen == "ChatRoom") { - var Dictionary = []; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "TargetCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - ChatRoomPublishCustomAction("WoodenSignChange", true, Dictionary); - InventoryItemMiscWoodenSignExit(); - } -} - -/** @type {DynamicAfterDrawCallback} */ -function AssetsItemMiscWoodenSignAfterDraw({ - C, A, X, Y, L, Property, drawCanvas, drawCanvasBlink, AlphaMasks, Color -}) { - if (L === "_Text") { - // We set up a canvas - const height = 200; - const width = 155; - const tempCanvas = AnimationGenerateTempCanvas(C, A, width, height); - const ctx = tempCanvas.getContext("2d"); - - // One line of text will be centered - const text1 = (Property && typeof Property.Text === "string" && DynamicDrawTextRegex.test(Property.Text) ? Property.Text : "♠"); - const text2 = (Property && typeof Property.Text2 === "string" && DynamicDrawTextRegex.test(Property.Text2) ? Property.Text2 : "♠"); - const isAlone = !text1 || !text2; - - const drawOptions = { - fontSize: 30, - fontFamily: InventoryItemMiscWoodenSignFont, - color: Color, - effect: DynamicDrawTextEffect.BURN, - width, - }; - - // Reposition and orient the text when hanging upside-down - if (C.IsInverted()) { - ctx.rotate(Math.PI); - ctx.translate(-tempCanvas.width, -tempCanvas.height); - Y -= 168; - } - - DynamicDrawText(text1, ctx, width / 2, height / (isAlone ? 2 : 2.25), drawOptions); - DynamicDrawText(text2, ctx, width / 2, height / (isAlone ? 2 : 1.75), drawOptions); - - // We print the canvas on the character based on the asset position - drawCanvas(tempCanvas, X + 170, Y + 200, AlphaMasks); - drawCanvasBlink(tempCanvas, X + 170, Y + 200, AlphaMasks); - } -} diff --git a/Screens/Inventory/ItemMouth/BallGag/Normal.png b/Screens/Inventory/ItemMouth/BallGag/Normal.png deleted file mode 100644 index 68e5a4b8e..000000000 Binary files a/Screens/Inventory/ItemMouth/BallGag/Normal.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/BallGag/Shiny.png b/Screens/Inventory/ItemMouth/BallGag/Shiny.png deleted file mode 100644 index fdb46311a..000000000 Binary files a/Screens/Inventory/ItemMouth/BallGag/Shiny.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/BallGag/Tight.png b/Screens/Inventory/ItemMouth/BallGag/Tight.png deleted file mode 100644 index b9c70ffde..000000000 Binary files a/Screens/Inventory/ItemMouth/BallGag/Tight.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/ClothGag/Cleave.png b/Screens/Inventory/ItemMouth/ClothGag/Cleave.png deleted file mode 100644 index 5a3fba593..000000000 Binary files a/Screens/Inventory/ItemMouth/ClothGag/Cleave.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/ClothGag/Knotted.png b/Screens/Inventory/ItemMouth/ClothGag/Knotted.png deleted file mode 100644 index 9a0a0b754..000000000 Binary files a/Screens/Inventory/ItemMouth/ClothGag/Knotted.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/ClothGag/OTM.png b/Screens/Inventory/ItemMouth/ClothGag/OTM.png deleted file mode 100644 index 07ead5c61..000000000 Binary files a/Screens/Inventory/ItemMouth/ClothGag/OTM.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/ClothGag/OTN.png b/Screens/Inventory/ItemMouth/ClothGag/OTN.png deleted file mode 100644 index 86fd27c6d..000000000 Binary files a/Screens/Inventory/ItemMouth/ClothGag/OTN.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/ClothGag/Small.png b/Screens/Inventory/ItemMouth/ClothGag/Small.png deleted file mode 100644 index b3a696ab2..000000000 Binary files a/Screens/Inventory/ItemMouth/ClothGag/Small.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/DentalGag/Closed.png b/Screens/Inventory/ItemMouth/DentalGag/Closed.png deleted file mode 100644 index 48d1d99f3..000000000 Binary files a/Screens/Inventory/ItemMouth/DentalGag/Closed.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/DentalGag/Open.png b/Screens/Inventory/ItemMouth/DentalGag/Open.png deleted file mode 100644 index ff5c16407..000000000 Binary files a/Screens/Inventory/ItemMouth/DentalGag/Open.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/DildoPlugGag/Open.png b/Screens/Inventory/ItemMouth/DildoPlugGag/Open.png deleted file mode 100644 index d0430ee7e..000000000 Binary files a/Screens/Inventory/ItemMouth/DildoPlugGag/Open.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/DildoPlugGag/Plug.png b/Screens/Inventory/ItemMouth/DildoPlugGag/Plug.png deleted file mode 100644 index 0d9670013..000000000 Binary files a/Screens/Inventory/ItemMouth/DildoPlugGag/Plug.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/DuctTape/Cover.png b/Screens/Inventory/ItemMouth/DuctTape/Cover.png deleted file mode 100644 index 27253e097..000000000 Binary files a/Screens/Inventory/ItemMouth/DuctTape/Cover.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/DuctTape/Crossed.png b/Screens/Inventory/ItemMouth/DuctTape/Crossed.png deleted file mode 100644 index 86fd52bfc..000000000 Binary files a/Screens/Inventory/ItemMouth/DuctTape/Crossed.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/DuctTape/Double.png b/Screens/Inventory/ItemMouth/DuctTape/Double.png deleted file mode 100644 index 44917fdc6..000000000 Binary files a/Screens/Inventory/ItemMouth/DuctTape/Double.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/DuctTape/Full.png b/Screens/Inventory/ItemMouth/DuctTape/Full.png deleted file mode 100644 index 5e9c8f7cc..000000000 Binary files a/Screens/Inventory/ItemMouth/DuctTape/Full.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/DuctTape/Small.png b/Screens/Inventory/ItemMouth/DuctTape/Small.png deleted file mode 100644 index 61d4cd4eb..000000000 Binary files a/Screens/Inventory/ItemMouth/DuctTape/Small.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FunnelGag/Funnel.png b/Screens/Inventory/ItemMouth/FunnelGag/Funnel.png deleted file mode 100644 index 22d6a36f9..000000000 Binary files a/Screens/Inventory/ItemMouth/FunnelGag/Funnel.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FunnelGag/None.png b/Screens/Inventory/ItemMouth/FunnelGag/None.png deleted file mode 100644 index 4d437c417..000000000 Binary files a/Screens/Inventory/ItemMouth/FunnelGag/None.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticHarnessBallGag/FuturisticHarnessBallGag.js b/Screens/Inventory/ItemMouth/FuturisticHarnessBallGag/FuturisticHarnessBallGag.js deleted file mode 100644 index bdbe15f84..000000000 --- a/Screens/Inventory/ItemMouth/FuturisticHarnessBallGag/FuturisticHarnessBallGag.js +++ /dev/null @@ -1,229 +0,0 @@ -"use strict"; - -/** @type ExtendedItemOption[] */ -var InventoryItemMouthFuturisticBallGagOptions = [ - { - Name: "LightBall", - Property: { - Type: null, - Effect: ["BlockMouth", "GagLight"], - }, - }, - { - Name: "Ball", - Property: { - Type: "Ball", - Effect: ["BlockMouth", "GagMedium"], - }, - }, - { - Name: "Plug", - Property: { - Type: "Plug", - Effect: ["BlockMouth", "GagTotal"], - }, - }, -]; - -/** - * Loads the item extension properties - * @returns {void} - Nothing - */ -function InventoryItemMouthFuturisticHarnessBallGagLoad() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticLoadAccessDenied(); - } else { - ExtendedItemLoad(InventoryItemMouthFuturisticBallGagOptions, "SelectGagType"); - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Type: null, Option: InventoryItemMouthFuturisticBallGagOptions[0], - AutoPunish: 0, AutoPunishUndoTime: 300000 , OriginalSetting: "Padded", ChatMessage: true}; - if (DialogFocusItem.Property.AutoPunish == null) DialogFocusItem.Property.AutoPunish = 0; - if (DialogFocusItem.Property.AutoPunishUndoTime == null) DialogFocusItem.Property.AutoPunishUndoTime = 0; - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting == null) DialogFocusItem.Property.AutoPunishUndoTimeSetting = 300000; - if (DialogFocusItem.Property.OriginalSetting == null) DialogFocusItem.Property.OriginalSetting = null; - if (DialogFocusItem.Property.ChatMessage == null) DialogFocusItem.Property.ChatMessage = true; - if (DialogFocusItem.Property.BlinkState == null) DialogFocusItem.Property.BlinkState = 0; - } -} - -function InventoryItemMouthFuturisticHarnessBallGagExit() { - InventoryItemMouthFuturisticPanelGagExit(); -} - -/** -* Draw the item extension screen -* @returns {void} - Nothing -*/ -function InventoryItemMouthFuturisticHarnessBallGagDraw() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticDrawAccessDenied(); - } else { - DrawAssetPreview(1387, 75, DialogFocusItem.Asset); - - if (DialogFocusItem.Property.AutoPunishUndoTime - CurrentTime > 0) - DrawText(DialogFindPlayer("FuturisticPanelGagMouthDeflationTime") + " " + TimerToString(DialogFocusItem.Property.AutoPunishUndoTime - CurrentTime), 1500, 415, "White", "Gray"); - - var type = "FuturisticPanelGagMouthType" + ((DialogFocusItem.Property.Type != null) ? - ((DialogFocusItem.Property.Type != "Ball") ? DialogFocusItem.Property.Type : "BallLarge") - : "BallGag"); - DrawText(DialogFindPlayer("FuturisticPanelGagMouthTypeDesc") + " " + - DialogFindPlayer(type), 1350, 475, "White", "Gray"); - - MainCanvas.textAlign = "left"; - DrawCheckbox(1100, 890, 64, 64, "", DialogFocusItem.Property.ChatMessage, "White"); - DrawText(DialogFindPlayer("FuturisticPanelGagMouthButtonChatMessage"), 1200, 923, "White", "Gray"); - MainCanvas.textAlign = "center"; - - var autopunish = "Off"; - if (DialogFocusItem.Property.AutoPunish == 0) {autopunish = "Off";} - else if (DialogFocusItem.Property.AutoPunish == 1) {autopunish = "Low";} - else if (DialogFocusItem.Property.AutoPunish == 2) {autopunish = "Medium";} - else {autopunish = "Maximum";} - - DrawText(DialogFindPlayer("FuturisticPanelGagMouthButtonAutoPunish") + " " + autopunish, 1350, 683, "White", "Gray"); - if (DialogFocusItem) { - if (DialogFocusItem.Property.Type != null) DrawButton(1250, 500, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthTypeBallGag"), "White", ""); - if (DialogFocusItem.Property.Type != "Ball") DrawButton(1100, 570, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthTypeBallLarge"), "White", ""); - if (DialogFocusItem.Property.Type != "Plug") DrawButton(1400, 570, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthTypePlug"), "White", ""); - - if (DialogFocusItem.Property.AutoPunish != 0) DrawButton(1100, 707, 200, 64, DialogFindPlayer("TurnOff"), "White", ""); - if (DialogFocusItem.Property.AutoPunish != 1) DrawButton(1400, 707, 200, 64, DialogFindPlayer("Low"), "White", ""); - if (DialogFocusItem.Property.AutoPunish != 2) DrawButton(1100, 777, 200, 64, DialogFindPlayer("Medium"), "White", ""); - if (DialogFocusItem.Property.AutoPunish != 3) DrawButton(1400, 777, 200, 64, DialogFindPlayer("Maximum"), "White", ""); - - DrawText(DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeSetting" + DialogFocusItem.Property.AutoPunishUndoTimeSetting), 1775, 475, "White", "Gray"); - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 120000) DrawButton(1675, 500, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButton120000"), "White", ""); - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 300000) DrawButton(1675, 570, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButton300000"), "White", ""); - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 900000) DrawButton(1675, 640, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButton900000"), "White", ""); - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 3600000) DrawButton(1675, 710, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButton3600000"), "White", ""); - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 72000000) DrawButton(1675, 780, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButton72000000"), "White", ""); - - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting) DrawButton(1675, 880, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButtonPump"), "White", ""); - } - - } -} - - -/** - * Catches the item extension clicks - * @returns {void} - Nothing - */ -function InventoryItemMouthFuturisticHarnessBallGagClick() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticClickAccessDenied(); - } else { - if (MouseIn(1885, 25, 90, 90)) InventoryItemMouthFuturisticPanelGagExit(); - - else if (MouseIn(1100, 890, 64, 64)) DialogFocusItem.Property.ChatMessage = !DialogFocusItem.Property.ChatMessage; - - - else if (DialogFocusItem.Property.Type != null && MouseIn(1250, 500, 200, 64)) { - DialogFocusItem.Property.AutoPunishUndoTime = 0; - DialogFocusItem.Property.OriginalSetting = "LightBall"; - ExtendedItemSetType(C, InventoryItemMouthFuturisticBallGagOptions, InventoryItemMouthFuturisticBallGagOptions[0]);} - else if (DialogFocusItem.Property.Type != "Ball" && MouseIn(1100, 570, 200, 64)) { - DialogFocusItem.Property.AutoPunishUndoTime = 0; - DialogFocusItem.Property.OriginalSetting = "Ball"; - ExtendedItemSetType(C, InventoryItemMouthFuturisticBallGagOptions, InventoryItemMouthFuturisticBallGagOptions[1]);} - else if (DialogFocusItem.Property.Type != "Plug" && MouseIn(1400, 570, 200, 64)) { - DialogFocusItem.Property.AutoPunishUndoTime = 0; - DialogFocusItem.Property.OriginalSetting = "Plug"; - ExtendedItemSetType(C, InventoryItemMouthFuturisticBallGagOptions, InventoryItemMouthFuturisticBallGagOptions[2]);} - - else if (DialogFocusItem.Property.AutoPunish != 0 && MouseIn(1100, 707, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunish(C, DialogFocusItem, 0); - else if (DialogFocusItem.Property.AutoPunish != 1 && MouseIn(1400, 707, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunish(C, DialogFocusItem, 1); - else if (DialogFocusItem.Property.AutoPunish != 2 && MouseIn(1100, 777, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunish(C, DialogFocusItem, 2); - else if (DialogFocusItem.Property.AutoPunish != 3 && MouseIn(1400, 777, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunish(C, DialogFocusItem, 3); - - - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 120000 && MouseIn(1675, 500, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunishTime(C, DialogFocusItem, 120000); - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 300000 && MouseIn(1675, 570, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunishTime(C, DialogFocusItem, 300000); - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 900000 && MouseIn(1675, 640, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunishTime(C, DialogFocusItem, 900000); - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 3600000 && MouseIn(1675, 710, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunishTime(C, DialogFocusItem, 3600000); - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 72000000 && MouseIn(1675, 780, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunishTime(C, DialogFocusItem, 72000000); - - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting && MouseIn(1675, 880, 200, 64)) { - InventoryItemMouthFuturisticPanelGagTrigger(C, DialogFocusItem, false, InventoryItemMouthFuturisticBallGagOptions); - DialogFocusItem.Property.AutoPunishUndoTime = CurrentTime + DialogFocusItem.Property.AutoPunishUndoTimeSetting; // Reset the deflation time - CharacterRefresh(C, true); // Does not sync appearance while in the wardrobe - ChatRoomCharacterUpdate(C); - } - - } -} - -/** - * Validates, if the chosen option is possible. Sets the global variable 'DialogExtendedMessage' to the appropriate error message, if not. - * @param {Character} C - The character to validate the option for - * @param {Item} Item - The equipped item - * @returns {string} - Returns false and sets DialogExtendedMessage, if the chosen option is not possible. - */ -function InventoryItemMouthFuturisticHarnessBallGagValidate(C, Item) { - return InventoryItemFuturisticValidate(C, Item) ; -} - -/** - * Publishes the message to the chat - * @param {Character} C - The target character - * @param {ExtendedItemOption} Option - The currently selected Option - * @returns {void} - Nothing - */ - function InventoryItemMouthFuturisticHarnessBallGagPublishAction(C, Option) { - var msg = "FuturisticPanelGagMouthSet" + Option.Name; - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - ChatRoomPublishCustomAction(msg, true, Dictionary); -} - -/** - * The NPC dialog is for what the NPC says to you when you make a change to their restraints - the dialog lookup is on a - * per-NPC basis. You basically put the "AssetName" + OptionName in there to allow individual NPCs to override their default - * "GroupName" dialog if for example we ever wanted an NPC to react specifically to having the restraint put on them. - * That could be done by adding an "AssetName" entry (or entries) to that NPC's dialog CSV - * @param {Character} C - The NPC to whom the restraint is applied - * @param {ExtendedItemOption} Option - The chosen option for this extended item - * @returns {void} - Nothing - */ -function InventoryItemMouthFuturisticHarnessBallGagNpcDialog(C, Option) { - InventoryItemMouthFuturisticPanelGagNpcDialog(C, Option); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemMouthFuturisticHarnessBallGagScriptDraw(data) { - var persistentData = data.PersistentData(); - /** @type {ItemProperties} */ - var property = (data.Item.Property = data.Item.Property || {}); - if (typeof persistentData.UpdateTime !== "number") persistentData.UpdateTime = CommonTime() + 4000; - if (typeof persistentData.LastMessageLen !== "number") persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - if (typeof property.BlinkState !== "number") property.BlinkState = 0; - - if (ChatRoomLastMessage && ChatRoomLastMessage.length != persistentData.LastMessageLen && data.Item && data.Item.Property && data.Item.Property.Sensitivity > 0) - persistentData.ChangeTime = Math.min(persistentData.ChangeTime, CommonTime() + 400); // Trigger shortly after if the user speaks - - if (persistentData.UpdateTime < CommonTime() && data.C == Player) { - if (CurrentScreen == "ChatRoom") { - - AssetsItemMouthFuturisticPanelGagScriptUpdatePlayer(data, InventoryItemMouthFuturisticBallGagOptions); - - persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - } - - property.BlinkState = (property.BlinkState + 1) % 2; - - var timeToNextRefresh = 3025; - persistentData.UpdateTime = CommonTime() + timeToNextRefresh; - AnimationRequestRefreshRate(data.C, 5000 - timeToNextRefresh); - AnimationRequestDraw(data.C); - } -} - - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemMouthFuturisticHarnessBallGagBeforeDraw(data) { - return AssetsItemMouthFuturisticPanelGagBeforeDraw(data); -} diff --git a/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/Ball.png b/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/Ball.png deleted file mode 100644 index 94f0d1159..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/Ball.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/FuturisticHarnessPanelGag.js b/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/FuturisticHarnessPanelGag.js deleted file mode 100644 index 0e9563f05..000000000 --- a/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/FuturisticHarnessPanelGag.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemMouthFuturisticHarnessPanelGagLoad() { - InventoryItemMouthFuturisticPanelGagLoad(); -} - -// Draw the item extension screen -function InventoryItemMouthFuturisticHarnessPanelGagDraw() { - InventoryItemMouthFuturisticPanelGagDraw(); -} - -// Catches the item extension clicks -function InventoryItemMouthFuturisticHarnessPanelGagClick() { - InventoryItemMouthFuturisticPanelGagClick(); -} - -function InventoryItemMouthFuturisticHarnessPanelGagExit() { - InventoryItemMouthFuturisticPanelGagExit(); -} - -function InventoryItemMouthFuturisticHarnessPanelGagValidate(C, Item) { - return InventoryItemFuturisticValidate(C, Item); -} - - -function InventoryItemMouthFuturisticHarnessPanelGagPublishAction(C, Option) { - InventoryItemMouthFuturisticPanelGagPublishAction(C, Option); -} - -function InventoryItemMouthFuturisticHarnessPanelNpcDialog(C, Option) { - InventoryItemMouthFuturisticPanelGagNpcDialog(C, Option); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemMouthFuturisticHarnessPanelGagScriptDraw(data) { - AssetsItemMouthFuturisticPanelGagScriptDraw(data); -} - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemMouthFuturisticHarnessPanelGagBeforeDraw(data) { - return AssetsItemMouthFuturisticPanelGagBeforeDraw(data); -} diff --git a/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/LightBall.png b/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/LightBall.png deleted file mode 100644 index 52d6e579f..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/LightBall.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/Padded.png b/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/Padded.png deleted file mode 100644 index 62a228341..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/Padded.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/Plug.png b/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/Plug.png deleted file mode 100644 index 4aea1b889..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticHarnessPanelGag/Plug.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticMuzzle/h0.png b/Screens/Inventory/ItemMouth/FuturisticMuzzle/h0.png deleted file mode 100644 index 0cae0bec2..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticMuzzle/h0.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticMuzzle/h1.png b/Screens/Inventory/ItemMouth/FuturisticMuzzle/h1.png deleted file mode 100644 index 45d6bd684..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticMuzzle/h1.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticMuzzle/license.txt b/Screens/Inventory/ItemMouth/FuturisticMuzzle/license.txt deleted file mode 100644 index 5a8534607..000000000 --- a/Screens/Inventory/ItemMouth/FuturisticMuzzle/license.txt +++ /dev/null @@ -1,4 +0,0 @@ -// The mute icon is licensed under CC 3.0, -// https://creativecommons.org/licenses/by/3.0/ -// https://www.onlinewebfonts.com/icon/312370 -// It has been modified from its previous form \ No newline at end of file diff --git a/Screens/Inventory/ItemMouth/FuturisticMuzzle/n0.png b/Screens/Inventory/ItemMouth/FuturisticMuzzle/n0.png deleted file mode 100644 index 5e042c4b2..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticMuzzle/n0.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticMuzzle/n1.png b/Screens/Inventory/ItemMouth/FuturisticMuzzle/n1.png deleted file mode 100644 index 0cae0bec2..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticMuzzle/n1.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticMuzzle/s0.png b/Screens/Inventory/ItemMouth/FuturisticMuzzle/s0.png deleted file mode 100644 index 53b2b2fdd..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticMuzzle/s0.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticMuzzle/s1.png b/Screens/Inventory/ItemMouth/FuturisticMuzzle/s1.png deleted file mode 100644 index 7d8ce50ae..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticMuzzle/s1.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticMuzzle/s2.png b/Screens/Inventory/ItemMouth/FuturisticMuzzle/s2.png deleted file mode 100644 index 994dd9119..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticMuzzle/s2.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticMuzzle/s3.png b/Screens/Inventory/ItemMouth/FuturisticMuzzle/s3.png deleted file mode 100644 index 2ff0cea65..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticMuzzle/s3.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticPanelGag/Ball.png b/Screens/Inventory/ItemMouth/FuturisticPanelGag/Ball.png deleted file mode 100644 index 94f0d1159..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticPanelGag/Ball.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticPanelGag/FuturisticPanelGag.js b/Screens/Inventory/ItemMouth/FuturisticPanelGag/FuturisticPanelGag.js deleted file mode 100644 index cc10de4f7..000000000 --- a/Screens/Inventory/ItemMouth/FuturisticPanelGag/FuturisticPanelGag.js +++ /dev/null @@ -1,419 +0,0 @@ -"use strict"; - -/** @type ExtendedItemOption[] */ -var InventoryItemMouthFuturisticPanelGagOptions = [ - { - Name: "Padded", - Property: { - Type: null, - Effect: ["BlockMouth"], - }, - }, - { - Name: "LightBall", - Property: { - Type: "LightBall", - Effect: ["BlockMouth", "GagVeryLight"], - }, - }, - { - Name: "Ball", - Property: { - Type: "Ball", - Effect: ["BlockMouth", "GagMedium"], - }, - }, - { - Name: "Plug", - Property: { - Type: "Plug", - Effect: ["BlockMouth", "GagTotal"], - }, - }, -]; - -var AutoPunishKeywords = [ -"moan", -"whimper", -"shout", -"scream", -"whine", -"growl", -"laugh", -"giggle", -"mutter", -"stutter", -"stammer", -"grunt", -"hiss", -"screech", -"bark", -"mumble", -]; - -var AutoPunishGagActionFlag = false; -var AutoPunishUndoCD = 300000; // Five minutes of being gagged, resetting each time the user does a violation - -/** - * Loads the item extension properties - * @returns {void} - Nothing - */ -function InventoryItemMouthFuturisticPanelGagLoad() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticLoadAccessDenied(); - } else { - ExtendedItemLoad(InventoryItemMouthFuturisticPanelGagOptions, "SelectGagType"); - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Type: null, Option: InventoryItemMouthFuturisticPanelGagOptions[0], - AutoPunish: 0, AutoPunishUndoTime: 300000 , OriginalSetting: "Padded", ChatMessage: true}; - if (DialogFocusItem.Property.AutoPunish == null) DialogFocusItem.Property.AutoPunish = 0; - if (DialogFocusItem.Property.AutoPunishUndoTime == null) DialogFocusItem.Property.AutoPunishUndoTime = 0; - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting == null) DialogFocusItem.Property.AutoPunishUndoTimeSetting = 300000; - if (DialogFocusItem.Property.OriginalSetting == null) DialogFocusItem.Property.OriginalSetting = null; - if (DialogFocusItem.Property.ChatMessage == null) DialogFocusItem.Property.ChatMessage = true; - if (DialogFocusItem.Property.BlinkState == null) DialogFocusItem.Property.BlinkState = 0; - } -} - -function InventoryItemMouthFuturisticPanelGagExit() { - InventoryItemFuturisticExitAccessDenied(); -} - -/** -* Draw the item extension screen -* @returns {void} - Nothing -*/ -function InventoryItemMouthFuturisticPanelGagDraw() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticDrawAccessDenied(); - } else { - DrawAssetPreview(1387, 75, DialogFocusItem.Asset); - - if (DialogFocusItem.Property.AutoPunishUndoTime - CurrentTime > 0) - DrawText(DialogFindPlayer("FuturisticPanelGagMouthDeflationTime") + " " + TimerToString(DialogFocusItem.Property.AutoPunishUndoTime - CurrentTime), 1500, 415, "White", "Gray"); - - var type = "FuturisticPanelGagMouthType" + ((DialogFocusItem.Property.Type != null) ? DialogFocusItem.Property.Type : "Padded"); - DrawText(DialogFindPlayer("FuturisticPanelGagMouthTypeDesc") + " " + - DialogFindPlayer(type), 1350, 475, "White", "Gray"); - - MainCanvas.textAlign = "left"; - DrawCheckbox(1100, 890, 64, 64, "", DialogFocusItem.Property.ChatMessage); - DrawText(DialogFindPlayer("FuturisticPanelGagMouthButtonChatMessage"), 1200, 923, "White", "Gray"); - MainCanvas.textAlign = "center"; - - var autopunish = "Off"; - if (DialogFocusItem.Property.AutoPunish == 0) {autopunish = "Off";} - else if (DialogFocusItem.Property.AutoPunish == 1) {autopunish = "Low";} - else if (DialogFocusItem.Property.AutoPunish == 2) {autopunish = "Medium";} - else {autopunish = "Maximum";} - - DrawText(DialogFindPlayer("FuturisticPanelGagMouthButtonAutoPunish") + " " + autopunish, 1350, 683, "White", "Gray"); - if (DialogFocusItem) { - if (DialogFocusItem.Property.Type != null) DrawButton(1100, 500, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthTypePadded"), "White", ""); - if (DialogFocusItem.Property.Type != "LightBall") DrawButton(1400, 500, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthTypeLightBall"), "White", ""); - if (DialogFocusItem.Property.Type != "Ball") DrawButton(1100, 570, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthTypeBall"), "White", ""); - if (DialogFocusItem.Property.Type != "Plug") DrawButton(1400, 570, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthTypePlug"), "White", ""); - - if (DialogFocusItem.Property.AutoPunish != 0) DrawButton(1100, 707, 200, 64, DialogFindPlayer("TurnOff"), "White", ""); - if (DialogFocusItem.Property.AutoPunish != 1) DrawButton(1400, 707, 200, 64, DialogFindPlayer("Low"), "White", ""); - if (DialogFocusItem.Property.AutoPunish != 2) DrawButton(1100, 777, 200, 64, DialogFindPlayer("Medium"), "White", ""); - if (DialogFocusItem.Property.AutoPunish != 3) DrawButton(1400, 777, 200, 64, DialogFindPlayer("Maximum"), "White", ""); - - DrawText(DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeSetting" + DialogFocusItem.Property.AutoPunishUndoTimeSetting), 1775, 475, "White", "Gray"); - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 120000) DrawButton(1675, 500, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButton120000"), "White", ""); - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 300000) DrawButton(1675, 570, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButton300000"), "White", ""); - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 900000) DrawButton(1675, 640, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButton900000"), "White", ""); - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 3600000) DrawButton(1675, 710, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButton3600000"), "White", ""); - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 72000000) DrawButton(1675, 780, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButton72000000"), "White", ""); - - if (DialogFocusItem.Property.AutoPunishUndoTimeSetting) DrawButton(1675, 880, 200, 64, DialogFindPlayer("FuturisticPanelGagMouthDeflationTimeButtonPump"), "White", ""); - } - - } -} - - -/** - * Catches the item extension clicks - * @returns {void} - Nothing - */ -function InventoryItemMouthFuturisticPanelGagClick() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticClickAccessDenied(); - } else { - if (MouseIn(1885, 25, 90, 90)) InventoryItemMouthFuturisticPanelGagExit(); - - else if (MouseIn(1100, 890, 64, 64)) DialogFocusItem.Property.ChatMessage = !DialogFocusItem.Property.ChatMessage; - - - else if (DialogFocusItem.Property.Type != null && MouseIn(1100, 500, 200, 64)) { - DialogFocusItem.Property.AutoPunishUndoTime = 0; - DialogFocusItem.Property.OriginalSetting = null; - ExtendedItemSetType(C, InventoryItemMouthFuturisticPanelGagOptions, InventoryItemMouthFuturisticPanelGagOptions[0]); - } - else if (DialogFocusItem.Property.Type != "LightBall" && MouseIn(1400, 500, 200, 64)) { - DialogFocusItem.Property.AutoPunishUndoTime = 0; - DialogFocusItem.Property.OriginalSetting = "LightBall"; - ExtendedItemSetType(C, InventoryItemMouthFuturisticPanelGagOptions, InventoryItemMouthFuturisticPanelGagOptions[1]); - } - else if (DialogFocusItem.Property.Type != "Ball" && MouseIn(1100, 570, 200, 64)) { - DialogFocusItem.Property.AutoPunishUndoTime = 0; - DialogFocusItem.Property.OriginalSetting = "Ball"; - ExtendedItemSetType(C, InventoryItemMouthFuturisticPanelGagOptions, InventoryItemMouthFuturisticPanelGagOptions[2]); - } - else if (DialogFocusItem.Property.Type != "Plug" && MouseIn(1400, 570, 200, 64)) { - DialogFocusItem.Property.AutoPunishUndoTime = 0; - DialogFocusItem.Property.OriginalSetting = "Plug"; - ExtendedItemSetType(C, InventoryItemMouthFuturisticPanelGagOptions, InventoryItemMouthFuturisticPanelGagOptions[3]); - } - - else if (DialogFocusItem.Property.AutoPunish != 0 && MouseIn(1100, 707, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunish(C, DialogFocusItem, 0); - else if (DialogFocusItem.Property.AutoPunish != 1 && MouseIn(1400, 707, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunish(C, DialogFocusItem, 1); - else if (DialogFocusItem.Property.AutoPunish != 2 && MouseIn(1100, 777, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunish(C, DialogFocusItem, 2); - else if (DialogFocusItem.Property.AutoPunish != 3 && MouseIn(1400, 777, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunish(C, DialogFocusItem, 3); - - - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 120000 && MouseIn(1675, 500, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunishTime(C, DialogFocusItem, 120000); - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 300000 && MouseIn(1675, 570, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunishTime(C, DialogFocusItem, 300000); - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 900000 && MouseIn(1675, 640, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunishTime(C, DialogFocusItem, 900000); - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 3600000 && MouseIn(1675, 710, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunishTime(C, DialogFocusItem, 3600000); - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting != 72000000 && MouseIn(1675, 780, 200, 64)) InventoryItemMouthFuturisticPanelGagSetAutoPunishTime(C, DialogFocusItem, 72000000); - - else if (DialogFocusItem.Property.AutoPunishUndoTimeSetting && MouseIn(1675, 880, 200, 64)) { - InventoryItemMouthFuturisticPanelGagTrigger(C, DialogFocusItem, false, InventoryItemMouthFuturisticPanelGagOptions); - DialogFocusItem.Property.AutoPunishUndoTime = CurrentTime + DialogFocusItem.Property.AutoPunishUndoTimeSetting; // Reset the deflation time - CharacterRefresh(C, true); // Does not sync appearance while in the wardrobe - ChatRoomCharacterUpdate(C); - } - - } -} - -/** - * Validates, if the chosen option is possible. Sets the global variable 'DialogExtendedMessage' to the appropriate error message, if not. - * @param {Character} C - The character to validate the option - * @param {Item} Item - The equipped item - * @returns {string} - Returns false and sets DialogExtendedMessage, if the chosen option is not possible. - */ -function InventoryItemMouthFuturisticPanelGagValidate(C, Item = DialogFocusItem) { - return InventoryItemFuturisticValidate(C, Item); -} - -function InventoryItemMouthFuturisticPanelGagGetOption(Options, OptionType) { - for (let I = 0; I < Options.length; I++) { - if (Options[I].Property.Type == OptionType) return I; - } - return 0; -} - -function InventoryItemMouthFuturisticPanelGagPublishActionTrigger(C, Item, Option, Deflate) { - var msg = "FuturisticPanelGagMouthSetAuto" + ((Deflate) ? "Deflate" : "Inflate") + Option.Name; - - /** @type {ChatMessageDictionary} */ - var Dictionary = [ - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "AssetName", AssetName: Item.Asset.Name }, - ]; - if (Item.Property.ItemMemberNumber) Dictionary.push({ Tag: "ItemMemberNumber", MemberNumber: Item.Property.ItemMemberNumber }); - if (CurrentScreen == "ChatRoom") { - ServerSend("ChatRoomChat", { Content: msg, Type: "Action", Dictionary }); - ChatRoomCharacterItemUpdate(C, Item.Asset.Group.Name); - } -} - -function InventoryItemMouthFuturisticPanelGagSetAutoPunish(C, Item, Level) { - Item.Property.AutoPunish = Level; - var msg = "FuturisticPanelGagMouthSetAutoPunish" + Level; - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - ChatRoomPublishCustomAction(msg, true, Dictionary); -} - -function InventoryItemMouthFuturisticPanelGagSetAutoPunishTime(C, Item, Time) { - Item.Property.AutoPunishUndoTimeSetting = Time; - var msg = "FuturisticPanelGagMouthSetAutoPunishTime" + Time; - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - ChatRoomPublishCustomAction(msg, true, Dictionary); -} - -/** - * Publishes the message to the chat - * @param {Character} C - The target character - * @param {ExtendedItemOption} Option - The currently selected Option - * @returns {void} - Nothing - */ -function InventoryItemMouthFuturisticPanelGagPublishAction(C, Option) { - var msg = "FuturisticPanelGagMouthSet" + Option.Name; - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - ChatRoomPublishCustomAction(msg, true, Dictionary); -} - -/** - * The NPC dialog is for what the NPC says to you when you make a change to their restraints - the dialog lookup is on a - * per-NPC basis. You basically put the "AssetName" + OptionName in there to allow individual NPCs to override their default - * "GroupName" dialog if for example we ever wanted an NPC to react specifically to having the restraint put on them. - * That could be done by adding an "AssetName" entry (or entries) to that NPC's dialog CSV - * @param {Character} C - The NPC to whom the restraint is applied - * @param {ExtendedItemOption} Option - The chosen option for this extended item - * @returns {void} - Nothing - */ -function InventoryItemMouthFuturisticPanelGagNpcDialog(C, Option) { - C.CurrentDialog = DialogFind(C, "ItemMouthPlugGag" + Option.Name, "ItemMouth"); -} - -function InventoryItemMouthFuturisticPanelGagTrigger(C, Item, Reset, Options) { - var OptionLevel = (Reset) ? Math.max(InventoryItemMouthFuturisticPanelGagGetOption(Options, Item.Property.OriginalSetting), InventoryItemMouthFuturisticPanelGagGetOption(Options, Item.Property.Type) - 1) - : Math.min(Options.length, InventoryItemMouthFuturisticPanelGagGetOption(Options, Item.Property.Type) + 1); - - if (Reset || Item.Property.Type != "Plug") { - var OriginalItemSetting = Item.Property.OriginalSetting; - InventoryItemMouthFuturisticPanelGagSetOption(C, Options, Options[OptionLevel], Item); - if (CurrentScreen == "ChatRoom" && Item.Property.ChatMessage) - InventoryItemMouthFuturisticPanelGagPublishActionTrigger(C, Item, Options[OptionLevel], Reset); - Item.Property.OriginalSetting = OriginalItemSetting; // After automatically changing it, we put it back to original setting - - const expressions = [ - { Group: "Eyebrows", Name: "Soft", Timer: 10 }, - { Group: "Blush", Name: "Extreme", Timer: 15 }, - { Group: "Eyes", Name: "Lewd", Timer: 5 }, - ]; - InventoryExpressionTriggerApply(C, expressions); - } -} - - -// Copied from extended item -function InventoryItemMouthFuturisticPanelGagSetOption(C, Options, Option, Item, NoRefresh) { - - // Default the previous Property and Type to the first option if not found on the current item - var PreviousProperty = Item.Property || Options[0].Property; - var PreviousType = PreviousProperty.Type || Options[0].Property.Type; - var PreviousOption = Options.find(O => O.Property.Type === PreviousType); - - // Create a new Property object based on the previous one - var NewProperty = Object.assign({}, PreviousProperty); - // Delete properties overridden by by the new option - Object.keys(PreviousOption.Property).forEach(key => delete NewProperty[key]); - // Clone the new properties and use them to extend the existing properties - Object.assign(NewProperty, JSON.parse(JSON.stringify(Option.Property))); - - // If the item is locked, ensure it has the "Lock" effect - if (NewProperty.LockedBy && !(NewProperty.Effect || []).includes("Lock")) { - NewProperty.Effect = (NewProperty.Effect || []); - NewProperty.Effect.push("Lock"); - } - - Item.Property = NewProperty; - - if (!NoRefresh) { - CharacterRefresh(C, true); - // For a restraint, we might publish an action or change the dialog of a NPC - ChatRoomCharacterUpdate(C); - } -} - -function AssetsItemMouthFuturisticPanelGagScriptUpdatePlayer(data, Options) { - var Item = data.Item; - // Punish the player if they speak - if (Item.Property.AutoPunish < 3) - AutoPunishGagActionFlag = false; - - if (Item.Property.AutoPunish && Item.Property.AutoPunish > 0 && Item.Property.AutoPunishUndoTimeSetting) { - - var LastMessages = data.PersistentData().LastMessageLen; - var GagTriggerPunish = false; - var keywords = false; - var gagaction = false; - - if (Item.Property.AutoPunish == 3) { - if (AutoPunishGagActionFlag == true) { - gagaction = true; - AutoPunishGagActionFlag = false; - } else for (let K = 0; K < AutoPunishKeywords.length; K++) { - if (ChatRoomLastMessage[ChatRoomLastMessage.length-1].includes(AutoPunishKeywords[K])) { - keywords = true; - break; - } - } - } - - GagTriggerPunish = InventoryItemNeckAccessoriesCollarAutoShockUnitDetectSpeech(Item.Property.AutoPunish, gagaction, keywords, LastMessages); - - if (ChatRoomTargetMemberNumber != null) { - GagTriggerPunish = false; // No trigger on whispers - } - - if (GagTriggerPunish) { - InventoryItemMouthFuturisticPanelGagTrigger(Player, Item, false, Options); - Item.Property.AutoPunishUndoTime = CurrentTime + Item.Property.AutoPunishUndoTimeSetting; // Reset the deflation time - CharacterRefresh(Player, true); // Does not sync appearance while in the wardrobe - - // For a restraint, we might publish an action or change the dialog of a NPC - ChatRoomCharacterUpdate(Player); - - } else if (Item.Property.AutoPunishUndoTime - CurrentTime <= 0 && Item.Property.Type && Item.Property.Type != Item.Property.OriginalSetting) { - // Deflate the gag back to the original setting after a while - InventoryItemMouthFuturisticPanelGagTrigger(Player, Item, true, Options); - if (Item.Property.OriginalSetting != Item.Property.Type) - Item.Property.AutoPunishUndoTime = CurrentTime + Item.Property.AutoPunishUndoTimeSetting; // Reset the deflation time - CharacterRefresh(Player, true); // Does not sync appearance while in the wardrobe - - // For a restraint, we might publish an action or change the dialog of a NPC - ChatRoomCharacterUpdate(Player); - } - } - -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemMouthFuturisticPanelGagScriptDraw(data) { - var persistentData = data.PersistentData(); - /** @type {ItemProperties} */ - var property = (data.Item.Property = data.Item.Property || {}); - if (typeof persistentData.UpdateTime !== "number") persistentData.UpdateTime = CommonTime() + 4000; - if (typeof persistentData.LastMessageLen !== "number") persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - if (typeof property.BlinkState !== "number") property.BlinkState = 0; - - if (ChatRoomLastMessage && ChatRoomLastMessage.length != persistentData.LastMessageLen && data.Item && data.Item.Property && data.Item.Property.Sensitivity > 0) - persistentData.ChangeTime = Math.min(persistentData.ChangeTime, CommonTime() + 400); // Trigger shortly after if the user speaks - - if (persistentData.UpdateTime < CommonTime() && data.C == Player) { - if (CurrentScreen == "ChatRoom") { - - AssetsItemMouthFuturisticPanelGagScriptUpdatePlayer(data, InventoryItemMouthFuturisticPanelGagOptions); - - persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - } - - property.BlinkState = (property.BlinkState + 1) % 2; - - var timeToNextRefresh = 3025; - persistentData.UpdateTime = CommonTime() + timeToNextRefresh; - AnimationRequestRefreshRate(data.C, 5000 - timeToNextRefresh); - AnimationRequestDraw(data.C); - } -} - - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemMouthFuturisticPanelGagBeforeDraw(data) { - if (data.L === "_Light" && data.Property && data.Property.AutoPunish > 0 && data.Property.BlinkState == 1) { - - if (data.Color && data.Color != "" && data.Color != "Default") {return {LayerType : "Blink"};} - else if (data.Property.AutoPunish == 1) {return {LayerType : "Blink", Color : "#28ff28"};} - else if (data.Property.AutoPunish == 2) {return {LayerType : "Blink", Color : "#ffff28"};} - else if (data.Property.AutoPunish == 3) {return {LayerType : "Blink", Color : "#ff3838"};} - - } - return data; -} diff --git a/Screens/Inventory/ItemMouth/FuturisticPanelGag/LightBall.png b/Screens/Inventory/ItemMouth/FuturisticPanelGag/LightBall.png deleted file mode 100644 index 52d6e579f..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticPanelGag/LightBall.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticPanelGag/Padded.png b/Screens/Inventory/ItemMouth/FuturisticPanelGag/Padded.png deleted file mode 100644 index 62a228341..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticPanelGag/Padded.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticPanelGag/Plug.png b/Screens/Inventory/ItemMouth/FuturisticPanelGag/Plug.png deleted file mode 100644 index 4aea1b889..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticPanelGag/Plug.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/FuturisticPanelGag/red.png b/Screens/Inventory/ItemMouth/FuturisticPanelGag/red.png deleted file mode 100644 index 7940227b6..000000000 Binary files a/Screens/Inventory/ItemMouth/FuturisticPanelGag/red.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/HarnessBallGag/Normal.png b/Screens/Inventory/ItemMouth/HarnessBallGag/Normal.png deleted file mode 100644 index 68e5a4b8e..000000000 Binary files a/Screens/Inventory/ItemMouth/HarnessBallGag/Normal.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/HarnessBallGag/Shiny.png b/Screens/Inventory/ItemMouth/HarnessBallGag/Shiny.png deleted file mode 100644 index fdb46311a..000000000 Binary files a/Screens/Inventory/ItemMouth/HarnessBallGag/Shiny.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/HarnessBallGag/Tight.png b/Screens/Inventory/ItemMouth/HarnessBallGag/Tight.png deleted file mode 100644 index b9c70ffde..000000000 Binary files a/Screens/Inventory/ItemMouth/HarnessBallGag/Tight.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/HarnessPonyBits/Attached.png b/Screens/Inventory/ItemMouth/HarnessPonyBits/Attached.png deleted file mode 100644 index 134c2c09b..000000000 Binary files a/Screens/Inventory/ItemMouth/HarnessPonyBits/Attached.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/HarnessPonyBits/Detached.png b/Screens/Inventory/ItemMouth/HarnessPonyBits/Detached.png deleted file mode 100644 index ca14e3a99..000000000 Binary files a/Screens/Inventory/ItemMouth/HarnessPonyBits/Detached.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/MilkBottle/Chug.png b/Screens/Inventory/ItemMouth/MilkBottle/Chug.png deleted file mode 100644 index ff3fefcd8..000000000 Binary files a/Screens/Inventory/ItemMouth/MilkBottle/Chug.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/MilkBottle/Raised.png b/Screens/Inventory/ItemMouth/MilkBottle/Raised.png deleted file mode 100644 index 82d2e88d3..000000000 Binary files a/Screens/Inventory/ItemMouth/MilkBottle/Raised.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/MilkBottle/Rest.png b/Screens/Inventory/ItemMouth/MilkBottle/Rest.png deleted file mode 100644 index d71cba350..000000000 Binary files a/Screens/Inventory/ItemMouth/MilkBottle/Rest.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/OTNPlugGag/Open.png b/Screens/Inventory/ItemMouth/OTNPlugGag/Open.png deleted file mode 100644 index 6c08e588c..000000000 Binary files a/Screens/Inventory/ItemMouth/OTNPlugGag/Open.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/OTNPlugGag/Plug.png b/Screens/Inventory/ItemMouth/OTNPlugGag/Plug.png deleted file mode 100644 index b99e72432..000000000 Binary files a/Screens/Inventory/ItemMouth/OTNPlugGag/Plug.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PlugGag/Open.png b/Screens/Inventory/ItemMouth/PlugGag/Open.png deleted file mode 100644 index d0430ee7e..000000000 Binary files a/Screens/Inventory/ItemMouth/PlugGag/Open.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PlugGag/Plug.png b/Screens/Inventory/ItemMouth/PlugGag/Plug.png deleted file mode 100644 index 0d9670013..000000000 Binary files a/Screens/Inventory/ItemMouth/PlugGag/Plug.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/b0.png b/Screens/Inventory/ItemMouth/PonyGag/b0.png deleted file mode 100644 index 458451943..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/b0.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/b1.png b/Screens/Inventory/ItemMouth/PonyGag/b1.png deleted file mode 100644 index 842242fc2..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/b1.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/e0.png b/Screens/Inventory/ItemMouth/PonyGag/e0.png deleted file mode 100644 index c18a90eba..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/e0.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/e1.png b/Screens/Inventory/ItemMouth/PonyGag/e1.png deleted file mode 100644 index 6ab618264..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/e1.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/e2.png b/Screens/Inventory/ItemMouth/PonyGag/e2.png deleted file mode 100644 index a7f556018..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/e2.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/g0.png b/Screens/Inventory/ItemMouth/PonyGag/g0.png deleted file mode 100644 index 90c8f9dad..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/g0.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/g1.png b/Screens/Inventory/ItemMouth/PonyGag/g1.png deleted file mode 100644 index 41f772223..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/g1.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/g2.png b/Screens/Inventory/ItemMouth/PonyGag/g2.png deleted file mode 100644 index bb9155158..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/g2.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/g3.png b/Screens/Inventory/ItemMouth/PonyGag/g3.png deleted file mode 100644 index bdbd3b17c..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/g3.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/g4.png b/Screens/Inventory/ItemMouth/PonyGag/g4.png deleted file mode 100644 index bbaeaca98..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/g4.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/g5.png b/Screens/Inventory/ItemMouth/PonyGag/g5.png deleted file mode 100644 index 01be31ad3..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/g5.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/h0.png b/Screens/Inventory/ItemMouth/PonyGag/h0.png deleted file mode 100644 index 21c00bbf6..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/h0.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/h1.png b/Screens/Inventory/ItemMouth/PonyGag/h1.png deleted file mode 100644 index 752fe3d81..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/h1.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/h2.png b/Screens/Inventory/ItemMouth/PonyGag/h2.png deleted file mode 100644 index ff589918c..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/h2.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/p0.png b/Screens/Inventory/ItemMouth/PonyGag/p0.png deleted file mode 100644 index 30ec2fb92..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/p0.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/p1.png b/Screens/Inventory/ItemMouth/PonyGag/p1.png deleted file mode 100644 index 95d526486..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/p1.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/p2.png b/Screens/Inventory/ItemMouth/PonyGag/p2.png deleted file mode 100644 index 8842fcb56..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/p2.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/p3.png b/Screens/Inventory/ItemMouth/PonyGag/p3.png deleted file mode 100644 index caa5c98f6..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/p3.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/p4.png b/Screens/Inventory/ItemMouth/PonyGag/p4.png deleted file mode 100644 index c766d4843..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/p4.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/p5.png b/Screens/Inventory/ItemMouth/PonyGag/p5.png deleted file mode 100644 index ce554ffcd..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/p5.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/p6.png b/Screens/Inventory/ItemMouth/PonyGag/p6.png deleted file mode 100644 index c20cfaf3b..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/p6.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/p7.png b/Screens/Inventory/ItemMouth/PonyGag/p7.png deleted file mode 100644 index ab92c0255..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/p7.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/p8.png b/Screens/Inventory/ItemMouth/PonyGag/p8.png deleted file mode 100644 index 8f0e203ee..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/p8.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/p9.png b/Screens/Inventory/ItemMouth/PonyGag/p9.png deleted file mode 100644 index d03ca7f18..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/p9.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/r0.png b/Screens/Inventory/ItemMouth/PonyGag/r0.png deleted file mode 100644 index 61337bfed..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/r0.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/r1.png b/Screens/Inventory/ItemMouth/PonyGag/r1.png deleted file mode 100644 index 2a4e7bcd3..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/r1.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/r2.png b/Screens/Inventory/ItemMouth/PonyGag/r2.png deleted file mode 100644 index 8e54c0939..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/r2.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/r3.png b/Screens/Inventory/ItemMouth/PonyGag/r3.png deleted file mode 100644 index fb9134c72..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/r3.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/t0.png b/Screens/Inventory/ItemMouth/PonyGag/t0.png deleted file mode 100644 index 6c8d2b3d4..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/t0.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/t1.png b/Screens/Inventory/ItemMouth/PonyGag/t1.png deleted file mode 100644 index d02c69117..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/t1.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/t2.png b/Screens/Inventory/ItemMouth/PonyGag/t2.png deleted file mode 100644 index d2243c015..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/t2.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/t3.png b/Screens/Inventory/ItemMouth/PonyGag/t3.png deleted file mode 100644 index 3962af415..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/t3.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/PonyGag/t4.png b/Screens/Inventory/ItemMouth/PonyGag/t4.png deleted file mode 100644 index 9d5ee8b49..000000000 Binary files a/Screens/Inventory/ItemMouth/PonyGag/t4.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/Ribbons/Basic.png b/Screens/Inventory/ItemMouth/Ribbons/Basic.png deleted file mode 100644 index ec70d818b..000000000 Binary files a/Screens/Inventory/ItemMouth/Ribbons/Basic.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/Ribbons/Bow.png b/Screens/Inventory/ItemMouth/Ribbons/Bow.png deleted file mode 100644 index b291ff086..000000000 Binary files a/Screens/Inventory/ItemMouth/Ribbons/Bow.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/RopeBallGag/Normal.png b/Screens/Inventory/ItemMouth/RopeBallGag/Normal.png deleted file mode 100644 index 91c3eaf21..000000000 Binary files a/Screens/Inventory/ItemMouth/RopeBallGag/Normal.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/RopeBallGag/Tight.png b/Screens/Inventory/ItemMouth/RopeBallGag/Tight.png deleted file mode 100644 index db84f4c1e..000000000 Binary files a/Screens/Inventory/ItemMouth/RopeBallGag/Tight.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/ScarfGag/Loose.png b/Screens/Inventory/ItemMouth/ScarfGag/Loose.png deleted file mode 100644 index ee869572c..000000000 Binary files a/Screens/Inventory/ItemMouth/ScarfGag/Loose.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/ScarfGag/OTN.png b/Screens/Inventory/ItemMouth/ScarfGag/OTN.png deleted file mode 100644 index 90791ffe6..000000000 Binary files a/Screens/Inventory/ItemMouth/ScarfGag/OTN.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/Stitches/Cross.png b/Screens/Inventory/ItemMouth/Stitches/Cross.png deleted file mode 100644 index b2442d1f0..000000000 Binary files a/Screens/Inventory/ItemMouth/Stitches/Cross.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/Stitches/Skewed.png b/Screens/Inventory/ItemMouth/Stitches/Skewed.png deleted file mode 100644 index 7281aedea..000000000 Binary files a/Screens/Inventory/ItemMouth/Stitches/Skewed.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/Stitches/Straight.png b/Screens/Inventory/ItemMouth/Stitches/Straight.png deleted file mode 100644 index fcbc0c54b..000000000 Binary files a/Screens/Inventory/ItemMouth/Stitches/Straight.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/Stitches/ZigZag.png b/Screens/Inventory/ItemMouth/Stitches/ZigZag.png deleted file mode 100644 index cda12fdf9..000000000 Binary files a/Screens/Inventory/ItemMouth/Stitches/ZigZag.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/WiffleGag/Normal.png b/Screens/Inventory/ItemMouth/WiffleGag/Normal.png deleted file mode 100644 index c65c1e997..000000000 Binary files a/Screens/Inventory/ItemMouth/WiffleGag/Normal.png and /dev/null differ diff --git a/Screens/Inventory/ItemMouth/WiffleGag/Tight.png b/Screens/Inventory/ItemMouth/WiffleGag/Tight.png deleted file mode 100644 index 23fb41bdb..000000000 Binary files a/Screens/Inventory/ItemMouth/WiffleGag/Tight.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/AutoShockCollar/AutoShockCollar.js b/Screens/Inventory/ItemNeck/AutoShockCollar/AutoShockCollar.js deleted file mode 100644 index 43a1fb991..000000000 --- a/Screens/Inventory/ItemNeck/AutoShockCollar/AutoShockCollar.js +++ /dev/null @@ -1,26 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemNeckAutoShockCollarLoad() { - InventoryItemNeckAccessoriesCollarAutoShockUnitLoad(); -} - -// Draw the item extension screen -function InventoryItemNeckAutoShockCollarDraw() { - InventoryItemNeckAccessoriesCollarAutoShockUnitDraw(); -} - -// Catches the item extension clicks -function InventoryItemNeckAutoShockCollarClick() { - InventoryItemNeckAccessoriesCollarAutoShockUnitClick(); -} - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemNeckAutoShockCollarBeforeDraw(data) { - return AssetsItemNeckAccessoriesCollarAutoShockUnitBeforeDraw(data); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemNeckAutoShockCollarScriptDraw(data) { - AssetsItemNeckAccessoriesCollarAutoShockUnitScriptDraw(data); -} diff --git a/Screens/Inventory/ItemNeck/BonedNeckCorset/NoRing.png b/Screens/Inventory/ItemNeck/BonedNeckCorset/NoRing.png deleted file mode 100644 index 05eb2c446..000000000 Binary files a/Screens/Inventory/ItemNeck/BonedNeckCorset/NoRing.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/BonedNeckCorset/Ring.png b/Screens/Inventory/ItemNeck/BonedNeckCorset/Ring.png deleted file mode 100644 index 84b014e95..000000000 Binary files a/Screens/Inventory/ItemNeck/BonedNeckCorset/Ring.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/ComboHarness/Normal.png b/Screens/Inventory/ItemNeck/ComboHarness/Normal.png deleted file mode 100644 index 68e5a4b8e..000000000 Binary files a/Screens/Inventory/ItemNeck/ComboHarness/Normal.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/ComboHarness/Shiny.png b/Screens/Inventory/ItemNeck/ComboHarness/Shiny.png deleted file mode 100644 index fdb46311a..000000000 Binary files a/Screens/Inventory/ItemNeck/ComboHarness/Shiny.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/ComboHarness/Tight.png b/Screens/Inventory/ItemNeck/ComboHarness/Tight.png deleted file mode 100644 index b9c70ffde..000000000 Binary files a/Screens/Inventory/ItemNeck/ComboHarness/Tight.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/FuturisticCollar/FuturisticCollar.js b/Screens/Inventory/ItemNeck/FuturisticCollar/FuturisticCollar.js deleted file mode 100644 index c97ba4ee0..000000000 --- a/Screens/Inventory/ItemNeck/FuturisticCollar/FuturisticCollar.js +++ /dev/null @@ -1,466 +0,0 @@ -"use strict"; - - -var FuturisticCollarPage = 0; -var FuturisticCollarMaxPage = 2; - -// Loads the item extension properties -function InventoryItemNeckFuturisticCollarLoad() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticLoadAccessDenied(); - } else { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { OpenPermission: false }; - if (DialogFocusItem.Property.OpenPermission == null) DialogFocusItem.Property.OpenPermission = false; - if (DialogFocusItem.Property.OpenPermissionChastity == null) DialogFocusItem.Property.OpenPermissionChastity = false; - if (DialogFocusItem.Property.OpenPermissionArm == null) DialogFocusItem.Property.OpenPermissionArm = false; - if (DialogFocusItem.Property.OpenPermissionLeg == null) DialogFocusItem.Property.OpenPermissionLeg = false; - if (DialogFocusItem.Property.BlockRemotes == null) DialogFocusItem.Property.BlockRemotes = false; - - ElementCreateInput("FutureCollarPasswordField", "text", "", "8"); - ElementCreateInput("FutureCollarTimeField", "text", "", "4"); - } -} - -// Draw the item extension screen -function InventoryItemNeckFuturisticCollarDraw() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticDrawAccessDenied(); - } else { - DrawAssetPreview(1387, 65, DialogFocusItem.Asset); - - if (FuturisticCollarPage == 0) { - if ((DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.LockedBy && !DialogCanUnlock(C, DialogFocusItem))) { - DrawText(DialogFindPlayer("FuturisticCollarOptionsLockout"), 1500, 375, "White", "Gray"); - } - - - MainCanvas.textAlign = "left"; - DrawButton(1125, 395, 64, 64, "", "White", DialogFocusItem.Property.OpenPermission ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("FuturisticCollarOpenPermission"), 1200, 425, "White", "Gray"); - DrawButton(1125, 495, 64, 64, "", "White", DialogFocusItem.Property.BlockRemotes ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("FuturisticCollarBlockRemotes"), 1200, 525, "White", "Gray"); - DrawButton(1125, 595, 64, 64, "", "White", DialogFocusItem.Property.OpenPermissionChastity ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("FuturisticCollarOpenPermissionChastity"), 1200, 625, "White", "Gray"); - DrawButton(1125, 695, 64, 64, "", "White", DialogFocusItem.Property.OpenPermissionArm ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("FuturisticCollarOpenPermissionArm"), 1200, 725, "White", "Gray"); - DrawButton(1125, 795, 64, 64, "", "White", DialogFocusItem.Property.OpenPermissionLeg ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("FuturisticCollarOpenPermissionLeg"), 1200, 825, "White", "Gray"); - - MainCanvas.textAlign = "center"; - - ElementPosition("FutureCollarPasswordField", 3050, 750, 400); // Hide it off the canvas - ElementPosition("FutureCollarTimeField", 3050, 805, 400); - } else if (FuturisticCollarPage == 1 || FuturisticCollarPage == 2) { - var FuturisticCollarStatus = "NoItems"; - var FuturisticCollarItems = InventoryItemNeckFuturisticCollarGetItems(C); - var FuturisticCollarItemsUnlockable = InventoryItemNeckFuturisticCollarGetItems(C, true); - var lockedItems = 0; - for (let I = 0; I < FuturisticCollarItems.length; I++) { - if (InventoryGetLock(FuturisticCollarItems[I])) { - lockedItems += 1; - } - } - if (FuturisticCollarItems.length > 0) { - if (lockedItems == 0) FuturisticCollarStatus = "NoLocks"; - else if (lockedItems < FuturisticCollarItems.length) FuturisticCollarStatus = "PartialLocks"; - else if (lockedItems == FuturisticCollarItems.length) FuturisticCollarStatus = "FullyLocked"; - } - - DrawText(DialogFindPlayer("FuturisticCollarOptions" + FuturisticCollarStatus), 1500, 380, "White", "Gray"); - - if (FuturisticCollarItems.length > 0 && lockedItems < FuturisticCollarItems.length) { - if (FuturisticCollarPage == 1) { - DrawButton(1250, 410, 200, 55, DialogFindPlayer("FuturisticCollarLockMetal"), InventoryItemNeckFuturisticCollarCanLock(C, "MetalPadlock") ? "White" : "Pink"); - DrawButton(1550, 410, 200, 55, DialogFindPlayer("FuturisticCollarLockExclusive"), InventoryItemNeckFuturisticCollarCanLock(C, "ExclusivePadlock") ? "White" : "Pink"); - DrawButton(1250, 470, 200, 55, DialogFindPlayer("FuturisticCollarLockIntricate"), InventoryItemNeckFuturisticCollarCanLock(C, "IntricatePadlock") ? "White" : "Pink"); - DrawButton(1550, 470, 200, 55, DialogFindPlayer("FuturisticCollarLockHighSec"), InventoryItemNeckFuturisticCollarCanLock(C, "HighSecurityPadlock") ? "White" : "Pink"); - DrawButton(1250, 530, 200, 55, DialogFindPlayer("FuturisticCollarLockTimer"), InventoryItemNeckFuturisticCollarCanLock(C, "TimerPadlock") ? "White" : "Pink"); - DrawButton(1550, 530, 200, 55, DialogFindPlayer("FuturisticCollarLockMistress"), InventoryItemNeckFuturisticCollarCanLock(C, "MistressPadlock") ? "White" : "Pink"); - DrawButton(1250, 590, 200, 55, DialogFindPlayer("FuturisticCollarLockLover"), InventoryItemNeckFuturisticCollarCanLock(C, "LoversPadlock") ? "White" : "Pink"); - DrawButton(1550, 590, 200, 55, DialogFindPlayer("FuturisticCollarLockOwner"), InventoryItemNeckFuturisticCollarCanLock(C, "OwnerPadlock") ? "White" : "Pink"); - DrawButton(1250, 650, 200, 55, DialogFindPlayer("FuturisticCollarLockPandora"), InventoryItemNeckFuturisticCollarCanLock(C, "PandoraPadlock") ? "White" : "Pink"); - DrawButton(1550, 650, 200, 55, DialogFindPlayer("FuturisticCollarLockCombination"), InventoryItemNeckFuturisticCollarCanLock(C, "CombinationPadlock") ? "White" : "Pink"); - DrawButton(1250, 710, 200, 55, DialogFindPlayer("FuturisticCollarLockPassword"), InventoryItemNeckFuturisticCollarCanLock(C, "PasswordPadlock") ? "White" : "Pink"); - DrawButton(1550, 710, 200, 55, DialogFindPlayer("FuturisticCollarLockSafeword"), InventoryItemNeckFuturisticCollarCanLock(C, "SafewordPadlock") ? "White" : "Pink"); - - ElementPosition("FutureCollarTimeField", 3050, 805, 400); - } else { - DrawButton(1250, 410, 200, 55, DialogFindPlayer("FuturisticCollarLockTimerMiss"), InventoryItemNeckFuturisticCollarCanLock(C, "MistressTimerPadlock") ? "White" : "Pink"); - DrawButton(1550, 410, 200, 55, DialogFindPlayer("FuturisticCollarLockTimerPassword"), InventoryItemNeckFuturisticCollarCanLock(C, "TimerPasswordPadlock") ? "White" : "Pink"); - DrawButton(1250, 470, 200, 55, DialogFindPlayer("FuturisticCollarLockTimerLovers"), InventoryItemNeckFuturisticCollarCanLock(C, "LoversTimerPadlock") ? "White" : "Pink"); - DrawButton(1550, 470, 200, 55, DialogFindPlayer("FuturisticCollarLockTimerOwner"), InventoryItemNeckFuturisticCollarCanLock(C, "OwnerTimerPadlock") ? "White" : "Pink"); - - DrawText(DialogFindPlayer("FuturisticCollarTime"), 1250, 710, "White", "Gray"); - ElementPosition("FutureCollarTimeField", 1650, 705, 400); - } - } else { - ElementPosition("FutureCollarTimeField", 3050, 805, 400); - ElementPosition("FutureCollarPasswordField", 3050, 750, 400); // Hide it off the canvas - } - - let drawCode = false; - if (FuturisticCollarItemsUnlockable.length > 0) { - DrawButton(1400, 850, 200, 55, DialogFindPlayer("FuturisticCollarUnlock"), "White"); - drawCode = true; - } - if (FuturisticCollarItems.length > 0 && !(DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.LockedBy && !DialogCanUnlock(C, DialogFocusItem))) { - DrawButton(1400, 910, 200, 55, DialogFindPlayer("FuturisticCollarColor"), "White"); - drawCode = true; - } - if (drawCode) { - DrawText(DialogFindPlayer("FuturisticCollarPassword"), 1350, 810, "White", "Gray"); - ElementPosition("FutureCollarPasswordField", 1650, 805, 400); - } else { - ElementPosition("FutureCollarPasswordField", 3050, 750, 400); // Hide it off the canvas - } - } - - // Draw the back/next button - const currPage = FuturisticCollarPage + 1; - const totalPages = FuturisticCollarMaxPage + 1; - DrawBackNextButton(1675, 240, 300, 90, DialogFindPlayer("Page") + " " + currPage.toString() + " / " + totalPages.toString(), "White", "", () => "", () => ""); - } -} - -function InventoryItemNeckFuturisticCollarExit() { - ElementRemove("FutureCollarPasswordField"); - ElementRemove("FutureCollarTimeField"); - InventoryItemFuturisticExitAccessDenied(); -} - -// Catches the item extension clicks -function InventoryItemNeckFuturisticCollarClick() { - - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticClickAccessDenied(); - } else { - - var CollarAction = 0; // 0 - nothing, 1 - Lock, 2 - Unlock, 3 - Color - - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) InventoryItemNeckFuturisticCollarExit(); - else if (FuturisticCollarPage == 0) { - - - if (MouseIn(1125, 395, 64, 64) && !(DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.LockedBy && !DialogCanUnlock(C, DialogFocusItem))) InventoryItemNeckFuturisticCollarTogglePermission(C, DialogFocusItem, "Collar"); - else if (MouseIn(1125, 495, 64, 64) && !(DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.LockedBy && !DialogCanUnlock(C, DialogFocusItem))) InventoryItemNeckFuturisticCollarToggleRemotes(C, DialogFocusItem); - else if (MouseIn(1125, 595, 64, 64) && !(DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.LockedBy && !DialogCanUnlock(C, DialogFocusItem))) InventoryItemNeckFuturisticCollarTogglePermission(C, DialogFocusItem, "Chastity"); - else if (MouseIn(1125, 695, 64, 64) && !(DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.LockedBy && !DialogCanUnlock(C, DialogFocusItem))) InventoryItemNeckFuturisticCollarTogglePermission(C, DialogFocusItem, "Arm"); - else if (MouseIn(1125, 795, 64, 64) && !(DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.LockedBy && !DialogCanUnlock(C, DialogFocusItem))) InventoryItemNeckFuturisticCollarTogglePermission(C, DialogFocusItem, "Leg"); - } else if (FuturisticCollarPage == 1 || FuturisticCollarPage == 2) { - { - var FuturisticCollarItems = InventoryItemNeckFuturisticCollarGetItems(C); - var FuturisticCollarItemsUnlockable = InventoryItemNeckFuturisticCollarGetItems(C, true); - var lockedItems = 0; - for (let I = 0; I < FuturisticCollarItems.length; I++) { - if (InventoryGetLock(FuturisticCollarItems[I])) { - lockedItems += 1; - } - } - - if (FuturisticCollarItems.length > 0 ) { - - if (lockedItems < FuturisticCollarItems.length) { - if (FuturisticCollarPage == 1) { - if (MouseIn(1250, 410, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "MetalPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "MetalPadlock"); CollarAction = 1;} - else if (MouseIn(1550, 410, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "ExclusivePadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "ExclusivePadlock"); CollarAction = 1;} - if (MouseIn(1250, 470, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "IntricatePadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "IntricatePadlock"); CollarAction = 1;} - else if (MouseIn(1550, 470, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "HighSecurityPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "HighSecurityPadlock"); CollarAction = 1;} - else if (MouseIn(1250, 530, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "TimerPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "TimerPadlock"); CollarAction = 1;} - else if (MouseIn(1550, 530, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "MistressPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "MistressPadlock"); CollarAction = 1;} - else if (MouseIn(1250, 590, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "LoversPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "LoversPadlock"); CollarAction = 1;} - else if (MouseIn(1550, 590, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "OwnerPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "OwnerPadlock"); CollarAction = 1;} - else if (MouseIn(1250, 650, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "PandoraPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "PandoraPadlock"); CollarAction = 1;} - else if (MouseIn(1550, 650, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "CombinationPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "CombinationPadlock"); CollarAction = 1;} - else if (MouseIn(1250, 710, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "PasswordPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "PasswordPadlock"); CollarAction = 1;} - else if (MouseIn(1550, 710, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "SafewordPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "SafewordPadlock"); CollarAction = 1;} - } else { - if (MouseIn(1250, 410, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "MistressTimerPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "MistressTimerPadlock"); CollarAction = 1;} - else if (MouseIn(1550, 410, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "TimerPasswordPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "TimerPasswordPadlock"); CollarAction = 1;} - if (MouseIn(1250, 470, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "LoversTimerPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "LoversTimerPadlock"); CollarAction = 1;} - else if (MouseIn(1550, 470, 200, 55) && InventoryItemNeckFuturisticCollarCanLock(C, "OwnerTimerPadlock")) { InventoryItemNeckFuturisticCollarLockdown(C, "OwnerTimerPadlock"); CollarAction = 1;} - } - } - } - if (MouseIn(1400, 850, 200, 55) && FuturisticCollarItemsUnlockable.length > 0) { InventoryItemNeckFuturisticCollarUnlock(C); CollarAction = 2;} - if (MouseIn(1400, 910, 200, 55) && FuturisticCollarItems.length > 0 && DialogFocusItem && !(DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.LockedBy && !DialogCanUnlock(C, DialogFocusItem))) { - InventoryItemNeckFuturisticCollarColor(C, DialogFocusItem); CollarAction = 3; - } - - } - } - if (CollarAction > 0) InventoryItemNeckFuturisticCollarExit(); - - // Pagination buttons - if (MouseIn(1675, 240, 150, 90) && FuturisticCollarPage > 0) { - FuturisticCollarPage = FuturisticCollarPage - 1; - } - else if (MouseIn(1825, 240, 150, 90) && FuturisticCollarPage < FuturisticCollarMaxPage) { - FuturisticCollarPage = FuturisticCollarPage + 1; - } - } -} - -function InventoryItemNeckFuturisticCollarCanLock(C, LockType) { - //InventoryAvailable(Player, LockType, "ItemMisc"); - var LockItem = null; - // First, we check if the inventory already exists, exit if it's the case - for (let I = 0; I < Player.Inventory.length; I++) - if ((Player.Inventory[I].Name == LockType) && (Player.Inventory[I].Group == "ItemMisc")) { - LockItem = Player.Inventory[I]; - break; - } - // Next we check if the target player has it, but not for the mistress, owner, or lover locks - if (LockItem == null && LockType != "MistressPadlock" && LockType != "LoversPadlock" && LockType != "OwnerPadlock") { - for (let I = 0; I < C.Inventory.length; I++) { - if ((C.Inventory[I].Name == LockType) && (C.Inventory[I].Group == "ItemMisc")) { - LockItem = C.Inventory[I]; - break; - } - } - } - - - - if (LockItem && !(InventoryBlockedOrLimited(C, LockItem))) { - - - - // Make sure we do not add owner/lover only items for invalid characters, owner/lover locks can be applied on the player by the player for self-bondage - if (LockItem.Asset.OwnerOnly && !C.IsOwnedByPlayer()) - if ((C.ID != 0) || ((C.Owner == "") && (C.Ownership == null)) || ((C.ID == 0))) - return false; - if (LockItem.Asset.LoverOnly && !C.IsLoverOfPlayer()) - if ((C.ID != 0) || (C.Lovership.length == 0) || ((C.ID == 0) && C.GetLoversNumbers(true).length == 0)) - return false; - - if (LockItem.Asset.Name == "TimerPasswordPadlock" || LockItem.Asset.Name == "MistressTimerPadlock" || LockItem.Asset.Name == "LoversTimerPadlock" || LockItem.Asset.Name == "OwnerTimerPadlock") { - if (!(parseInt(ElementValue("FutureCollarTimeField")) > 0)) return false; - } - - if (LockItem.Asset.Name == "CombinationPadlock" && !ValidationCombinationNumberRegex.test(ElementValue("FutureCollarPasswordField"))) return false; - if (LockItem.Asset.Name == "TimerPasswordPadlock" && !ValidationPasswordRegex.test(ElementValue("FutureCollarPasswordField").toUpperCase())) return false; - if (LockItem.Asset.Name == "PasswordPadlock" && !ValidationPasswordRegex.test(ElementValue("FutureCollarPasswordField").toUpperCase())) return false; - if (LockItem.Asset.Name == "SafewordPadlock" && !ValidationPasswordRegex.test(ElementValue("FutureCollarPasswordField").toUpperCase())) return false; - return true; - } - return false; -} - -function InventoryItemNeckFuturisticCollarGetItems(C, OnlyUnlockable) { - var ItemList = []; - - for (let E = C.Appearance.length - 1; E >= 0; E--) - if (((C.Appearance[E].Asset.Name.indexOf("Futuristic") >= 0 || C.Appearance[E].Asset.Name.indexOf("Interactive") >= 0 || C.Appearance[E].Asset.Name.indexOf("Electronic") >= 0) && (!OnlyUnlockable || C.Appearance[E].Asset.Group.Name != "ItemNeck")) && - (C.Appearance[E].Asset.AllowLock) - && (!OnlyUnlockable || (InventoryGetLock(C.Appearance[E]) != null && InventoryItemHasEffect(C.Appearance[E], "Lock", true) && InventoryItemNeckFuturisticCollarCanUnlock(C, C.Appearance[E], InventoryGetLock(C.Appearance[E]), true)))) { - ItemList.push(C.Appearance[E]); - } - - return ItemList; -} - -function InventoryItemNeckFuturisticCollarValidate(C, Item) { - return InventoryItemFuturisticValidate(C, Item); -} - -function InventoryItemNeckFuturisticCollarLockdown(C, LockType) { - for (let E = C.Appearance.length - 1; E >= 0; E--) - if (((C.Appearance[E].Asset.Name.indexOf("Futuristic") >= 0 || C.Appearance[E].Asset.Name.indexOf("Interactive") >= 0 || C.Appearance[E].Asset.Name.indexOf("Electronic") >= 0) && - (C.Appearance[E].Asset.AllowLock && InventoryGetLock(C.Appearance[E]) == null))) { - InventoryLock(C, C.Appearance[E], LockType, Player.MemberNumber); - let LockItem = InventoryGetLock(C.Appearance[E]); - let Item = C.Appearance[E]; - - if (LockItem.Asset.Name == "TimerPasswordPadlock" || LockItem.Asset.Name == "MistressTimerPadlock" || LockItem.Asset.Name == "LoversTimerPadlock" || LockItem.Asset.Name == "OwnerTimerPadlock") { - if (parseInt(ElementValue("FutureCollarTimeField")) > 0) { - if (!Item.Property) Item.Property = {}; - let Property = Item.Property; - if (Property.RemoveItem == null) Property.RemoveItem = false; - if (Property.ShowTimer == null) Property.ShowTimer = true; - if (Property.EnableRandomInput == null) Property.EnableRandomInput = false; - if (Property.MemberNumberList == null) Property.MemberNumberList = []; - let maxTimer = LockItem.Asset.MaxTimer ? LockItem.Asset.MaxTimer/60 : 5; - Property.RemoveTimer = CurrentTime + 60000*Math.max(1, Math.min(maxTimer, parseInt(ElementValue("FutureCollarTimeField")))); - } - } - - if (LockItem.Asset.Name == "CombinationPadlock") { - Item.Property.CombinationNumber = ElementValue("FutureCollarPasswordField"); - } else if (LockItem.Asset.Name == "TimerPasswordPadlock" || LockItem.Asset.Name == "PasswordPadlock" || LockItem.Asset.Name == "SafewordPadlock") { - if (!Item.Property) Item.Property = {}; - Item.Property.Password = ElementValue("FutureCollarPasswordField").toUpperCase(); - Item.Property.Hint = "~Locked by " + Player.Name; - Item.Property.LockSet = true; - if (LockItem.Asset.Name == "SafewordPadlock") Item.Property.RemoveOnUnlock = true; - else Item.Property.RemoveOnUnlock = false; - } - } - - ChatRoomCharacterUpdate(C); - CharacterRefresh(C, true); - - - - if (CurrentScreen == "ChatRoom") { - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - - ServerSend("ChatRoomChat", { Content: "FuturisticCollarTriggerLockdown", Type: "Action", Dictionary }); - } -} - -function InventoryItemNeckFuturisticCollarCanUnlock(C, Item, LockItem, Attempt) { - if (LockItem.Asset.Name == "CombinationPadlock") - return Attempt || (Item.Property && Item.Property.CombinationNumber == ElementValue("FutureCollarPasswordField")); - if (LockItem.Asset.Name == "TimerPasswordPadlock" || LockItem.Asset.Name == "PasswordPadlock" || LockItem.Asset.Name == "SafewordPadlock") - return Attempt || (Item.Property && Item.Property.Password == ElementValue("FutureCollarPasswordField").toUpperCase()); - - return DialogCanUnlock(C, Item); -} - -function InventoryItemNeckFuturisticCollarUnlock(C) { - for (let E = C.Appearance.length - 1; E >= 0; E--) - if (((C.Appearance[E].Asset.Name.indexOf("Futuristic") >= 0 || C.Appearance[E].Asset.Name.indexOf("Interactive") >= 0 || C.Appearance[E].Asset.Name.indexOf("Electronic") >= 0) && C.Appearance[E].Asset.Group.Name != "ItemNeck") && - (InventoryGetLock(C.Appearance[E]) != null && InventoryItemHasEffect(C.Appearance[E], "Lock", true) && InventoryItemNeckFuturisticCollarCanUnlock(C, C.Appearance[E], InventoryGetLock(C.Appearance[E]), false))) { - InventoryUnlock(C, C.Appearance[E]); - } - - ChatRoomCharacterUpdate(C); - CharacterRefresh(C, true); - - if (CurrentScreen == "ChatRoom") { - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - - ServerSend("ChatRoomChat", { Content: "FuturisticCollarTriggerUnlock", Type: "Action", Dictionary }); - } - -} - -function InventoryItemNeckFuturisticCollarColor(C, Item) { - for (let E = C.Appearance.length - 1; E >= 0; E--) - if (C.Appearance[E].Asset && C.Appearance[E].Asset.FuturisticRecolor && C.Appearance[E].Asset.Group.Name != "ItemNeck") { - - if (C.Appearance[E].Asset.Layer.length > 1 && typeof C.Appearance[E].Color === "string") { - let color = C.Appearance[E].Color; - C.Appearance[E].Color = []; - for (let L = C.Appearance[E].Asset.Layer.length - 1; L >= 0; L--) { - C.Appearance[E].Color.push(color); - } - } - - for (let L = C.Appearance[E].Asset.Layer.length - 1; L >= 0; L--) { - - if (C.Appearance[E].Asset.Layer[L].Name != "Light" && C.Appearance[E].Asset.Layer[L].Name != "Shine") { - if (!C.Appearance[E].Asset.Layer[L].Name) { - if (Item.Color[3] != "Default") - C.Appearance[E].Color = (C.Appearance[E].Asset.FuturisticRecolorDisplay) ? Item.Color[0] : Item.Color[3]; - } else if (C.Appearance[E].Asset.Layer[L].Name == "Lock") { - if (Item.Color[3] != "Default") - C.Appearance[E].Color[L] = Item.Color[3]; - } else if (C.Appearance[E].Asset.Layer[L].Name == "Display" || C.Appearance[E].Asset.Layer[L].Name == "Screen" || C.Appearance[E].Asset.Layer[L].Name == "Ball") { - if (Item.Color[0] != "Default") - C.Appearance[E].Color[L] = Item.Color[0]; - } else if (C.Appearance[E].Asset.Layer[L].Name != "Mesh" && C.Appearance[E].Asset.Layer[L].Name != "Text") { - if (Item.Color[1] != "Default") - C.Appearance[E].Color[L] = Item.Color[1]; - } else if (C.Appearance[E].Asset.Layer[L].Name != "Text") { - if (Item.Color[2] != "Default") - C.Appearance[E].Color[L] = Item.Color[2]; - } - } - } - } - - ChatRoomCharacterUpdate(C); - CharacterRefresh(C, true); - - if (CurrentScreen == "ChatRoom") { - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - - ServerSend("ChatRoomChat", { Content: "FuturisticCollarTriggerColor", Type: "Action", Dictionary }); - } - -} - -function InventoryItemNeckFuturisticCollarTogglePermission(C, Item, Permission) { - if (Item.Property && Item.Property.OpenPermission != null) { - let property = "OpenPermission"; - switch (Permission) { - case "Leg": property += "Leg"; break; - case "Arm": property += "Arm"; break; - case "Chastity": property += "Chastity"; break; - } - if (Item.Property && Item.Property[property] != undefined) { - Item.Property[property] = !Item.Property[property]; - - ChatRoomCharacterUpdate(C); - CharacterRefresh(C, true); - - if (CurrentScreen == "ChatRoom") { - var Message = "FuturisticCollarSetOpenPermission" + Permission + (Item.Property[property] ? "On" : "Off"); - - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - - ServerSend("ChatRoomChat", { Content: Message, Type: "Action", Dictionary }); - } - } - } -} - -function InventoryItemNeckFuturisticCollarToggleRemotes(C, Item) { - if (Item.Property && Item.Property.BlockRemotes != null) { - Item.Property.BlockRemotes = !Item.Property.BlockRemotes; - - // Default the previous Property and Type to the first option if not found on the current item - var PreviousProperty = DialogFocusItem.Property; - - // Create a new Property object based on the previous one - var NewProperty = Object.assign({}, PreviousProperty); - - - NewProperty.Effect = []; - - // If the item is locked, ensure it has the "Lock" effect - if (NewProperty.LockedBy && !(NewProperty.Effect || []).includes("Lock")) { - NewProperty.Effect = (NewProperty.Effect || []); - NewProperty.Effect.push("Lock"); - } - - // If the item is locked, ensure it has the "Lock" effect - if (Item.Property.BlockRemotes) { - NewProperty.Effect = (NewProperty.Effect || []); - NewProperty.Effect.push("BlockRemotes"); - } - - DialogFocusItem.Property = NewProperty; - - - ChatRoomCharacterUpdate(C); - CharacterRefresh(C, true); - - if (CurrentScreen == "ChatRoom") { - var Message = "FuturisticCollarSetBlockRemotes" + (Item.Property.BlockRemotes ? "On" : "Off"); - - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - - ServerSend("ChatRoomChat", { Content: Message, Type: "Action", Dictionary }); - } - } -} diff --git a/Screens/Inventory/ItemNeck/ShockCollar/ShockCollar.js b/Screens/Inventory/ItemNeck/ShockCollar/ShockCollar.js deleted file mode 100644 index 5385ce4c5..000000000 --- a/Screens/Inventory/ItemNeck/ShockCollar/ShockCollar.js +++ /dev/null @@ -1,26 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemNeckShockCollarLoad() { - InventoryItemNeckAccessoriesCollarShockUnitLoad(); -} - -// Draw the item extension screen -function InventoryItemNeckShockCollarDraw() { - InventoryItemNeckAccessoriesCollarShockUnitDraw(); -} - -// Catches the item extension clicks -function InventoryItemNeckShockCollarClick() { - InventoryItemNeckAccessoriesCollarShockUnitClick(); -} - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemNeckShockCollarBeforeDraw(data) { - return AssetsItemNeckAccessoriesCollarShockUnitBeforeDraw(data); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemNeckShockCollarScriptDraw(data) { - AssetsItemNeckAccessoriesCollarShockUnitScriptDraw(data); -} diff --git a/Screens/Inventory/ItemNeck/SlaveCollar/SlaveCollar.js b/Screens/Inventory/ItemNeck/SlaveCollar/SlaveCollar.js deleted file mode 100644 index cbae5d223..000000000 --- a/Screens/Inventory/ItemNeck/SlaveCollar/SlaveCollar.js +++ /dev/null @@ -1,220 +0,0 @@ -"use strict"; -var InventoryItemNeckSlaveCollarColorMode = false; -var InventoryItemNeckSlaveCollarColor = "Default"; -var InventoryItemNeckSlaveCollarOffset = 0; - -// Defines all the slave collar models -/** @type {(ExtendedItemOption & { Image: string })[]} */ -var InventoryItemNeckSlaveCollarTypes = [ - { - Name: "", - Image: "SlaveCollar", - Property: null - }, { - Name: "SteelPosture", - Image: "SteelPostureCollar", - Property: { Type: "SteelPosture", Effect: ["FixedHead"], Block: [] } - }, { - Name: "LeatherPosture", - Image: "PostureCollar", - Property: { Type: "LeatherPosture", Effect: ["FixedHead"], Block: [] } - },{ - Name: "PetCollar", - Image: "PetCollar", - Property: { Type: "PetCollar", Effect: [], Block: [] } - },{ - Name: "HighCollar", - Image: "HighCollar", - Property: { Type: "HighCollar", Effect: [], Block: [] } - },{ - Name: "LeatherCollarBell", - Image: "LeatherCollarBell", - Property: { Type: "LeatherCollarBell", Effect: [], Block: [] } - },{ - Name: "LeatherCollarBow", - Image: "LeatherCollarBow", - Property: { Type: "LeatherCollarBow", Effect: [], Block: [] } - },{ - Name: "MaidCollar", - Image: "MaidCollar", - Property: { Type: "MaidCollar", Effect: [], Block: [] } - },{ - Name: "BatCollar", - Image: "BatCollar", - Property: { Type: "BatCollar", Effect: [], Block: [] } - },{ - Name: "HighSecurityCollar", - Image: "HighSecurityCollar", - Property: { Type: "HighSecurityCollar", Effect: [], Block: [] } - },{ - Name: "SpikeCollar", - Image: "SpikeCollar", - Property: { Type: "SpikeCollar", Effect: [], Block: [] } - },{ - Name: "BordelleCollar", - Image: "BordelleCollar", - Property: { Type: "BordelleCollar", Effect: [], Block: [] } - },{ - Name: "LeatherCorsetCollar", - Image: "LeatherCorsetCollar", - Property: { Type: "LeatherCorsetCollar", Effect: ["GagNormal"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3"] } - },{ - Name: "StrictPostureCollar", - Image: "StrictPostureCollar", - Property: { Type: "StrictPostureCollar", Effect: ["FixedHead"], Block: [] } - },{ - Name: "LatexPostureCollar", - Image: "LatexPostureCollar", - Property: { Type: "LatexPostureCollar", Effect: ["GagNormal", "FixedHead"], Block: ["ItemMouth", "ItemMouth2", "ItemMouth3"] } - },{ - Name: "HeartCollar", - Image: "HeartCollar", - Property: { Type: "HeartCollar", Effect: [], Block: [] } - },{ - Name: "NobleCorsetCollar", - Image: "NobleCorsetCollar", - Property: { Type: "NobleCorsetCollar", Effect: [], Block: [] } - },{ - Name: "OrnateCollar", - Image: "OrnateCollar", - Property: { Type: "OrnateCollar", Effect: [], Block: [] } - },{ - Name: "SlenderSteelCollar", - Image: "SlenderSteelCollar", - Property: { Type: "SlenderSteelCollar", Effect: [], Block: [] } - },{ - Name: "ShinySteelCollar", - Image: "ShinySteelCollar", - Property: { Type: "ShinySteelCollar", Effect: [], Block: [] } - },{ - Name: "HeartLinkChoker", - Image: "HeartLinkChoker", - Property: { Type: "HeartLinkChoker", Effect: [], Block: [] } - } -]; - -// Loads the item extension properties -function InventoryItemNeckSlaveCollarLoad() { - InventoryItemNeckSlaveCollarColorMode = false; - var C = CharacterGetCurrent(); - var SC = InventoryItemNeckSlaveCollarTypes.find(element => (element.Name == "LoveLeatherCollar")); - if (C && C.IsOwnedByPlayer() && C.IsLoverOfPlayer() && !SC) { - InventoryItemNeckSlaveCollarTypes.push({ - Name: "LoveLeatherCollar", - Image: "LoveLeatherCollar", - Property: {Type: "LoveLeatherCollar", Effect: [], Block: []} - }); - } - else if (C && C.IsOwnedByPlayer && !C.IsLoverOfPlayer() && SC) { InventoryItemNeckSlaveCollarTypes.splice(InventoryItemNeckSlaveCollarTypes.indexOf(SC,1)); } - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Type: null, Effect: [], Block: [] }; -} - -// Draw the item extension screen -function InventoryItemNeckSlaveCollarDraw() { - - // Only the character owner can use the controls in that screen - var C = CharacterGetCurrent(); - if (C && C.IsOwnedByPlayer()) { - if (InventoryItemNeckSlaveCollarColorMode) { - - // In color picking mode, we allow the user to change the collar color - ElementPosition("InputColor", 1450, 65, 300); - ColorPickerDraw(1300, 145, 675, 830, document.getElementById("InputColor"), function (Color) { DialogChangeItemColor(C, Color); }); - DrawButton(1665, 25, 90, 90, "", "White", "Icons/ColorSelect.png"); - DrawButton(1775, 25, 90, 90, "", "White", "Icons/ColorCancel.png"); - - } else { - - // In regular mode, the owner can select the collar model and change the offset to get the next 8 models - ColorPickerHide(); - DrawText(DialogFindPlayer("SlaveCollarSelectType"), 1500, 250, "white", "gray"); - DrawButton(1665, 25, 90, 90, "", "White", "Icons/Next.png"); - DrawButton(1775, 25, 90, 90, "", (DialogFocusItem.Color != null && DialogFocusItem.Color != "Default" && DialogFocusItem.Color != "None") ? DialogFocusItem.Color : "White", "Icons/ColorPick.png"); - for (let I = InventoryItemNeckSlaveCollarOffset; I < InventoryItemNeckSlaveCollarTypes.length && I < InventoryItemNeckSlaveCollarOffset + 8; I++) { - const A = DialogFocusItem.Asset; - const Type = InventoryItemNeckSlaveCollarTypes[I]; - const CollarTypeAsset = AssetGet(A.Group.Family, A.Group.Name, Type.Image); - const CurrentType = DialogFocusItem.Property && DialogFocusItem.Property.Type || ""; - const buttonX = 1000 + ((I - InventoryItemNeckSlaveCollarOffset) % 4) * 250; - const buttonY = 350 + Math.floor((I - InventoryItemNeckSlaveCollarOffset) / 4) * 300; - DrawPreviewBox(buttonX, buttonY, `${AssetGetPreviewPath(DialogFocusItem.Asset)}/${Type.Image}.png`, CollarTypeAsset.Description, {Hover: true, Disabled: CurrentType === Type.Name}); - } - } - } -} - -// Catches the item extension clicks -function InventoryItemNeckSlaveCollarClick() { - - // When the user exits the screen - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) { - ElementRemove("InputColor"); - DialogFocusItem = null; - return; - } - - // Only the character owner can use the controls in that screen - var C = CharacterGetCurrent(); - if (C != null && C.IsOwnedByPlayer()) { - if (InventoryItemNeckSlaveCollarColorMode) { - - // In color picking mode, we allow the user to change the collar color - if ((MouseX >= 1665) && (MouseX <= 1755) && (MouseY >= 25) && (MouseY <= 110)) { - let Color = ElementValue("InputColor"); - if (CommonIsColor(Color)) { - CharacterAppearanceSetColorForGroup(C, Color, "ItemNeck"); - InventoryItemNeckSlaveCollarColorMode = false; - ElementRemove("InputColor"); - ChatRoomCharacterItemUpdate(C); - if (CurrentScreen != "ChatRoom") CharacterRefresh(C); - DialogFocusItem = null; - } - } - if ((MouseX >= 1775) && (MouseX <= 1865) && (MouseY >= 25) && (MouseY <= 110)) { - InventoryItemNeckSlaveCollarColor = "Default"; - InventoryItemNeckSlaveCollarColorMode = false; - CharacterAppearanceSetColorForGroup(C, InventoryItemNeckSlaveCollarColor, "ItemNeck"); - ElementRemove("InputColor"); - CharacterLoadCanvas(C); - } - if ((MouseX >= 1300) && (MouseX < 1975) && (MouseY >= 145) && (MouseY < 975)) { - let Color = ElementValue("InputColor"); - CharacterAppearanceSetColorForGroup(C, Color, "ItemNeck"); - CharacterLoadCanvas(C); - ElementValue("InputColor", Color); - } - - } else { - - // In regular mode, the owner can select the collar model and change the offset to get the next 8 models - if ((MouseX >= 1665) && (MouseX <= 1755) && (MouseY >= 25) && (MouseY <= 110)) { - InventoryItemNeckSlaveCollarOffset = InventoryItemNeckSlaveCollarOffset + 8; - if (InventoryItemNeckSlaveCollarOffset >= InventoryItemNeckSlaveCollarTypes.length) InventoryItemNeckSlaveCollarOffset = 0; - } - if ((MouseX >= 1775) && (MouseX <= 1865) && (MouseY >= 25) && (MouseY <= 110)) { - InventoryItemNeckSlaveCollarColorMode = true; - InventoryItemNeckSlaveCollarColor = DialogFocusItem.Color; - ElementCreateInput("InputColor", "text", (DialogColorSelect != null) ? DialogColorSelect.toString() : ""); - } - for (let I = InventoryItemNeckSlaveCollarOffset; I < InventoryItemNeckSlaveCollarTypes.length && I < InventoryItemNeckSlaveCollarOffset + 8; I++) { - var Type = DialogFocusItem && DialogFocusItem.Property && DialogFocusItem.Property.Type || ""; - if ((MouseX >= 1000 + ((I - InventoryItemNeckSlaveCollarOffset) % 4) * 250) && (MouseX <= 1225 + ((I - InventoryItemNeckSlaveCollarOffset) % 4) * 250) && (MouseY >= 350 + Math.floor((I - InventoryItemNeckSlaveCollarOffset) / 4) * 300) && (MouseY <= 625 + Math.floor((I - InventoryItemNeckSlaveCollarOffset) / 4) * 300) && (Type != InventoryItemNeckSlaveCollarTypes[I].Name)) - InventoryItemNeckSlaveCollarSetType(InventoryItemNeckSlaveCollarTypes[I].Name); - } - - } - } - -} - -// Sets the slave collar model -function InventoryItemNeckSlaveCollarSetType(NewType) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - var Type = InventoryItemNeckSlaveCollarTypes.find(Collar => Collar.Name == NewType) || InventoryItemNeckSlaveCollarTypes[0]; - DialogFocusItem.Property = Type.Property; - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - ChatRoomPublishCustomAction("SlaveCollarChangeType", true, Dictionary); - CharacterRefresh(C); -} diff --git a/Screens/Inventory/ItemNeck/TechnoCollar/TechnoCollar.js b/Screens/Inventory/ItemNeck/TechnoCollar/TechnoCollar.js deleted file mode 100644 index 3e905f79f..000000000 --- a/Screens/Inventory/ItemNeck/TechnoCollar/TechnoCollar.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemNeckTechnoCollarShockModule1Load() { - InventoryItemNeckAccessoriesCollarShockUnitLoad(); -} - -// Draw the item extension screen -function InventoryItemNeckTechnoCollarShockModule1Draw() { - if (DialogFocusItem && DialogFocusItem.Property) { - if (DialogFocusItem.Property.Intensity == null) DialogFocusItem.Property.Intensity = 0; - if (DialogFocusItem.Property.TriggerCount == null) DialogFocusItem.Property.TriggerCount = 0; - } - InventoryItemNeckAccessoriesCollarShockUnitDraw(); -} - -// Catches the item extension clicks -function InventoryItemNeckTechnoCollarShockModule1Click() { - InventoryItemNeckAccessoriesCollarShockUnitClick(); - - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemNeckTechnoCollarShockModule1Exit(); - } -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemNeckTechnoCollarShockModule1ScriptDraw(data) { - AssetsItemNeckAccessoriesCollarShockUnitScriptDraw(data); -} - -// Leaves the extended screen -function InventoryItemNeckTechnoCollarShockModule1Exit() { - ExtendedItemSubscreen = null; -} diff --git a/Screens/Inventory/ItemNeck/TechnoCollar/c0.png b/Screens/Inventory/ItemNeck/TechnoCollar/c0.png deleted file mode 100644 index ed4b7bbd2..000000000 Binary files a/Screens/Inventory/ItemNeck/TechnoCollar/c0.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/TechnoCollar/c1.png b/Screens/Inventory/ItemNeck/TechnoCollar/c1.png deleted file mode 100644 index f93d0834d..000000000 Binary files a/Screens/Inventory/ItemNeck/TechnoCollar/c1.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/TechnoCollar/c2.png b/Screens/Inventory/ItemNeck/TechnoCollar/c2.png deleted file mode 100644 index 96e80444a..000000000 Binary files a/Screens/Inventory/ItemNeck/TechnoCollar/c2.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/TechnoCollar/c3.png b/Screens/Inventory/ItemNeck/TechnoCollar/c3.png deleted file mode 100644 index 48829b700..000000000 Binary files a/Screens/Inventory/ItemNeck/TechnoCollar/c3.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/TechnoCollar/c4.png b/Screens/Inventory/ItemNeck/TechnoCollar/c4.png deleted file mode 100644 index c97ecf689..000000000 Binary files a/Screens/Inventory/ItemNeck/TechnoCollar/c4.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/TechnoCollar/s0.png b/Screens/Inventory/ItemNeck/TechnoCollar/s0.png deleted file mode 100644 index 12f99b6be..000000000 Binary files a/Screens/Inventory/ItemNeck/TechnoCollar/s0.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeck/TechnoCollar/s1.png b/Screens/Inventory/ItemNeck/TechnoCollar/s1.png deleted file mode 100644 index 8e0c1bdfb..000000000 Binary files a/Screens/Inventory/ItemNeck/TechnoCollar/s1.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckAccessories/CollarAutoShockUnit/CollarAutoShockUnit.js b/Screens/Inventory/ItemNeckAccessories/CollarAutoShockUnit/CollarAutoShockUnit.js deleted file mode 100644 index 08873eda5..000000000 --- a/Screens/Inventory/ItemNeckAccessories/CollarAutoShockUnit/CollarAutoShockUnit.js +++ /dev/null @@ -1,249 +0,0 @@ -"use strict"; - - -var AutoShockGagActionFlag = false; - -// Loads the item extension properties -function InventoryItemNeckAccessoriesCollarAutoShockUnitLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Intensity: 0, Sensitivity: 0, ShowText: true }; - if (DialogFocusItem.Property.Intensity == null) DialogFocusItem.Property.Intensity = 0; - if (DialogFocusItem.Property.Sensitivity == null) DialogFocusItem.Property.Sensitivity = 0; - if (DialogFocusItem.Property.ShowText == null) DialogFocusItem.Property.ShowText = true; -} - -// Draw the item extension screen -function InventoryItemNeckAccessoriesCollarAutoShockUnitDraw() { - DrawAssetPreview(1387, 205, DialogFocusItem.Asset); - DrawText(DialogFindPlayer("Intensity" + DialogFocusItem.Property.Intensity.toString()).replace("Item", DialogFocusItem.Asset.Description), 1500, 520, "White", "Gray"); - if (DialogFocusItem.Property.Intensity > 0) DrawButton(1100, 550, 200, 55, DialogFindPlayer("Low"), "White"); - if (DialogFocusItem.Property.Intensity < 1 || DialogFocusItem.Property.Intensity > 1) DrawButton(1375, 550, 200, 55, DialogFindPlayer("Medium"), "White"); - if (DialogFocusItem.Property.Intensity < 2) DrawButton(1650, 550, 200, 55, DialogFindPlayer("High"), "White"); - - DrawText(DialogFindPlayer("Sensitivity" + (DialogFocusItem.Property.Sensitivity-1).toString()).replace("Item", DialogFocusItem.Asset.Description), 1500, 660, "White", "Gray"); - - if (DialogFocusItem.Property.Sensitivity != 0) DrawButton(1100, 700, 150, 55, DialogFindPlayer("TurnOff"), "White"); - if (DialogFocusItem.Property.Sensitivity != 1) DrawButton(1300, 700, 150, 55, DialogFindPlayer("Low"), "White"); - if (DialogFocusItem.Property.Sensitivity != 2) DrawButton(1500, 700, 150, 55, DialogFindPlayer("Medium"), "White"); - if (DialogFocusItem.Property.Sensitivity != 3) DrawButton(1700, 700, 150, 55, DialogFindPlayer("High"), "White"); - - if (CurrentScreen == "ChatRoom") DrawButton(1125, 780, 64, 64, "", "White", DialogFocusItem.Property.ShowText ? "Icons/Checked.png" : ""); - if (CurrentScreen == "ChatRoom") DrawText(DialogFindPlayer("ShockCollarShowChat"), 1370, 813, "White", "Gray"); - DrawButton(1600, 790, 200, 55, DialogFindPlayer("TriggerShock"), "White"); -} - -// Catches the item extension clicks -function InventoryItemNeckAccessoriesCollarAutoShockUnitClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; - if ((MouseX >= 1125) && (MouseX <= 1189) && (MouseY >= 780) && (MouseY <= 844) && (CurrentScreen == "ChatRoom")) { - DialogFocusItem.Property.ShowText = !DialogFocusItem.Property.ShowText; - } - if ((MouseX >= 1100) && (MouseX <= 1300) && (MouseY >= 550) && (MouseY <= 605) && (DialogFocusItem.Property.Intensity > 0)) InventoryItemNeckAccessoriesCollarAutoShockUnitSetIntensity(0 - DialogFocusItem.Property.Intensity); - if ((MouseX >= 1375) && (MouseX <= 1575) && (MouseY >= 550) && (MouseY <= 605) && (DialogFocusItem.Property.Intensity < 1 || DialogFocusItem.Property.Intensity > 1)) InventoryItemNeckAccessoriesCollarAutoShockUnitSetIntensity(1 - DialogFocusItem.Property.Intensity); - if ((MouseX >= 1650) && (MouseX <= 1850) && (MouseY >= 550) && (MouseY <= 605) && (DialogFocusItem.Property.Intensity < 2)) InventoryItemNeckAccessoriesCollarAutoShockUnitSetIntensity(2 - DialogFocusItem.Property.Intensity); - - - if ((MouseIn(1100, 700, 150, 55)) && (DialogFocusItem.Property.Sensitivity != 0)) InventoryItemNeckAccessoriesCollarAutoShockUnitSetSensitivity(0 - DialogFocusItem.Property.Sensitivity); - if ((MouseIn(1300, 700, 150, 55)) && (DialogFocusItem.Property.Sensitivity != 1)) InventoryItemNeckAccessoriesCollarAutoShockUnitSetSensitivity(1 - DialogFocusItem.Property.Sensitivity); - if ((MouseIn(1500, 700, 150, 55)) && (DialogFocusItem.Property.Sensitivity != 2)) InventoryItemNeckAccessoriesCollarAutoShockUnitSetSensitivity(2 - DialogFocusItem.Property.Sensitivity); - if ((MouseIn(1700, 700, 150, 55)) && (DialogFocusItem.Property.Sensitivity != 3)) InventoryItemNeckAccessoriesCollarAutoShockUnitSetSensitivity(3 - DialogFocusItem.Property.Sensitivity); - - if (Player.CanInteract() && (MouseX >= 1600) && (MouseX <= 1800) && (MouseY >= 790) && (MouseY <= 845)) InventoryItemNeckAccessoriesCollarAutoShockUnitTrigger(); -} - -// Sets the shock collar intensity -function InventoryItemNeckAccessoriesCollarAutoShockUnitSetIntensity(Modifier) { - - // Gets the current item and character - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarAutoShockUnitLoad(); - } - - DialogFocusItem.Property.Intensity = DialogFocusItem.Property.Intensity + Modifier; - if (DialogFocusItem.Property.ShowText) { - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name}); - ChatRoomPublishCustomAction("ShockCollarSet" + DialogFocusItem.Property.Intensity, true, Dictionary); - } - else - DialogLeave(); - -} - -// Sets the shock collar sensitivity -function InventoryItemNeckAccessoriesCollarAutoShockUnitSetSensitivity(Modifier) { - - // Gets the current item and character - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarAutoShockUnitLoad(); - } - - DialogFocusItem.Property.Sensitivity = DialogFocusItem.Property.Sensitivity + Modifier; - if (DialogFocusItem.Property.ShowText) { - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name}); - ChatRoomPublishCustomAction("ShockCollarSetSensitivity" + DialogFocusItem.Property.Sensitivity, true, Dictionary); - } - else - DialogLeave(); - -} - -function InventoryItemNeckAccessoriesCollarAutoShockUnitDetectSpeech(Sensitivity, Emote, Keywords, LastMessages) { - let msg = ChatRoomLastMessage[ChatRoomLastMessage.length - 1]; - if (Sensitivity == 3 && (Emote || (ChatRoomLastMessage && ChatRoomLastMessage.length != LastMessages - && !msg.startsWith("(") && !msg.startsWith("*") && (msg.replace(/[^\p{P} ~+=^$|\\<>`]+/ug, '') != msg || (msg.includes('!'))) - && (!msg.startsWith("/") - || (Keywords && (msg.startsWith("/me") || msg.startsWith("*"))))))) - return true; - if (Sensitivity == 2 && ChatRoomLastMessage && ChatRoomLastMessage.length != LastMessages - && !msg.startsWith("(") && !msg.startsWith("*") && !msg.startsWith("/") - && (msg.length > 25 - || (msg.replace(/[^\p{P} ~+=^$|\\<>`]+/ug, '') != msg && ((msg === msg.toUpperCase() && msg !== msg.toLowerCase()) - || (msg.includes('!')) || (msg.includes('!')))))) - return true; - if (Sensitivity == 1 && ChatRoomLastMessage && ChatRoomLastMessage.length != LastMessages - && !msg.startsWith("(") && !msg.startsWith("*") && !msg.startsWith("/") - && (msg.replace(/[^\p{P} ~+=^$|\\<>`]+/ug, '') != msg && ((msg === msg.toUpperCase() && msg !== msg.toLowerCase()) - || (msg.includes('!')) || (msg.includes('!'))))) - return true; - return false; -} - - -function InventoryItemNeckAccessoriesCollarAutoShockUnitUpdate(data) { - var Item = data.Item; - if (Item.Property.Sensitivity < 3) - AutoShockGagActionFlag = false; - - // Punish the player if they speak - if (Item.Property.Sensitivity && Item.Property.Sensitivity > 0) { - - var LastMessages = data.PersistentData().LastMessageLen; - var ShockTriggerPunish = false; - var keywords = false; - var gagaction = false; - - if (Item.Property.Sensitivity == 3) { - if (AutoShockGagActionFlag == true) { - gagaction = true; - AutoShockGagActionFlag = false; - } else for (let K = 0; K < AutoPunishKeywords.length; K++) { - if (ChatRoomLastMessage[ChatRoomLastMessage.length-1].includes(AutoPunishKeywords[K])) { - keywords = true; - break; - } - } - } - - ShockTriggerPunish = InventoryItemNeckAccessoriesCollarAutoShockUnitDetectSpeech(Item.Property.Sensitivity, gagaction, keywords, LastMessages); - - if (ChatRoomTargetMemberNumber != null) { - ShockTriggerPunish = false; // No trigger on whispers - } - - if (ShockTriggerPunish) { - InventoryItemNeckAccessoriesCollarAutoShockUnitTriggerAutomatic(data); - ChatRoomCharacterUpdate(Player); - } - } - - -} - -// Trigger a shock outside of the dialog menu -function InventoryItemNeckAccessoriesCollarAutoShockUnitTriggerAutomatic(data) { - var msg = "TriggerShock" + data.Item.Property.Intensity; - var C = data.C; - - - if (CurrentScreen == "ChatRoom" && data.Item.Property.ShowText) { - var Dictionary = [ - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "AssetName", AssetName: data.Item.Asset.Name }, - { ShockIntensity : data.Item.Property.Intensity * 1.5}, - ]; - ServerSend("ChatRoomChat", { Content: msg, Type: "Action", Dictionary }); - ChatRoomCharacterItemUpdate(C, data.Item.Asset.Group.Name); - } - - InventoryShockExpression(C); -} - -// Trigger a shock from the dialog menu -function InventoryItemNeckAccessoriesCollarAutoShockUnitTrigger(data) { - // Gets the current item and character - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarAutoShockUnitLoad(); - } - - var Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name}); - Dictionary.push({ Tag: "ActivityName", Text: "ShockItem" }); - Dictionary.push({ Tag: "ActivityGroup", Text: DialogFocusItem.Asset.Group.Name }); - Dictionary.push({ AssetName: DialogFocusItem.Asset.Name }); - Dictionary.push({ AssetGroupName: DialogFocusItem.Asset.Group.Name }); - - if (C.ID == Player.ID) { - // The Player shocks herself - ActivityArousalItem(C, C, DialogFocusItem.Asset); - } - - ChatRoomPublishCustomAction("TriggerShock" + DialogFocusItem.Property.Intensity, true, Dictionary); - - InventoryShockExpression(C); -} - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemNeckAccessoriesCollarAutoShockUnitBeforeDraw(data) { - return data.L === "_Light" ? { Color: "#2f0" } : null; -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemNeckAccessoriesCollarAutoShockUnitScriptDraw(data) { - var persistentData = data.PersistentData(); - /** @type {ItemProperties} */ - var property = (data.Item.Property = data.Item.Property || {}); - if (typeof persistentData.ChangeTime !== "number") persistentData.ChangeTime = CommonTime() + 4000; - if (typeof persistentData.LastMessageLen !== "number") persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - - if (ChatRoomLastMessage && ChatRoomLastMessage.length != persistentData.LastMessageLen && data.Item && data.Item.Property && data.Item.Property.Sensitivity > 0) - persistentData.ChangeTime = Math.min(persistentData.ChangeTime, CommonTime()); // Trigger immediately if the user speaks - - if (persistentData.ChangeTime < CommonTime()) { - var wasBlinking = property.Type === "Blink"; - property.Type = wasBlinking ? null : "Blink"; - var timeToNextRefresh = wasBlinking ? 4000 : 1000; - - if (CurrentScreen == "ChatRoom" && data.C == Player) { - - InventoryItemNeckAccessoriesCollarAutoShockUnitUpdate(data); - - persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - } - - - - persistentData.ChangeTime = CommonTime() + timeToNextRefresh; - AnimationRequestRefreshRate(data.C, 5000 - timeToNextRefresh); - AnimationRequestDraw(data.C); - } -} - -function InventoryItemNeckAccessoriesCollarAutoShockUnitDynamicAudio(data) { - var Modifier = parseInt(data.Content.substr(data.Content.length - 1)); - if (isNaN(Modifier)) Modifier = 0; - return ["Shocks", Modifier * 3]; -} diff --git a/Screens/Inventory/ItemNeckAccessories/CollarNameTag/CollarNameTag.js b/Screens/Inventory/ItemNeckAccessories/CollarNameTag/CollarNameTag.js deleted file mode 100644 index 29b13b108..000000000 --- a/Screens/Inventory/ItemNeckAccessories/CollarNameTag/CollarNameTag.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemNeckAccessoriesCollarNameTagLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Type: null }; -} - -// Draw the item extension screen -function InventoryItemNeckAccessoriesCollarNameTagDraw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Draw the possible tags - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - DrawText(DialogFindPlayer("SelectCollarNameTagType"), 1500, 500, "white", "gray"); - var List = DialogFocusItem.Asset.AllowType; - var X = 955; - var Y = 530; - for (let T = 0; T < List.length; T++) { - if ((DialogFocusItem.Property.Type != List[T])) DrawButton(X, Y, 200, 55, DialogFindPlayer("CollarNameTagType" + List[T]), "White"); - X = X + 210; - if (T % 5 == 4) { - X = 955; - Y = Y + 60; - } - } - } - else { - DrawText(DialogFindPlayer("SelectCollarNameTagTypeLocked"), 1500, 500, "white", "gray"); - } -} - -// Catches the item extension clicks -function InventoryItemNeckAccessoriesCollarNameTagClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) { DialogFocusItem = null; return; } - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - var List = DialogFocusItem.Asset.AllowType; - var X = 955; - var Y = 530; - for (let T = 0; T < List.length; T++) { - if ((MouseX >= X) && (MouseX <= X + 200) && (MouseY >= Y) && (MouseY <= Y + 55) && (DialogFocusItem.Property.Type != List[T])) - InventoryItemNeckAccessoriesCollarNameTagSetType(List[T]); - X = X + 210; - if (T % 5 == 4) { - X = 955; - Y = Y + 60; - } - } - } -} - -// Sets the type of tag -function InventoryItemNeckAccessoriesCollarNameTagSetType(NewType) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (CurrentScreen == "ChatRoom") { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarNameTagLoad(); - } - DialogFocusItem.Property.Type = NewType; - DialogFocusItem.Property.Effect = []; - - // Refreshes the character and chatroom - CharacterRefresh(C); - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "NameTagType", TextToLookUp: "CollarNameTagType" + ((NewType) ? NewType : "")}); - ChatRoomPublishCustomAction("CollarNameTagSet", true, Dictionary); - if (DialogInventory != null) { - DialogFocusItem = null; - DialogMenuButtonBuild(C); - } -} diff --git a/Screens/Inventory/ItemNeckAccessories/CollarNameTagLivestock/CollarNameTagLivestock.js b/Screens/Inventory/ItemNeckAccessories/CollarNameTagLivestock/CollarNameTagLivestock.js deleted file mode 100644 index 431844cb4..000000000 --- a/Screens/Inventory/ItemNeckAccessories/CollarNameTagLivestock/CollarNameTagLivestock.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemNeckAccessoriesCollarNameTagLivestockLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Type: null }; -} - -// Draw the item extension screen -function InventoryItemNeckAccessoriesCollarNameTagLivestockDraw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Draw the possible tags - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - DrawText(DialogFindPlayer("SelectCollarNameTagLivestockType"), 1500, 500, "white", "gray"); - var List = DialogFocusItem.Asset.AllowType; - var X = 955; - var Y = 530; - for (let T = 0; T < List.length; T++) { - if ((DialogFocusItem.Property.Type != List[T])) DrawButton(X, Y, 200, 55, DialogFindPlayer("CollarNameTagLivestockType" + List[T]), "White"); - X = X + 210; - if (T % 5 == 4) { - X = 955; - Y = Y + 60; - } - } - } - else { - DrawText(DialogFindPlayer("SelectCollarNameTagLivestockTypeLocked"), 1500, 500, "white", "gray"); - } -} - -// Catches the item extension clicks -function InventoryItemNeckAccessoriesCollarNameTagLivestockClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) { DialogFocusItem = null; return; } - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - var List = DialogFocusItem.Asset.AllowType; - var X = 955; - var Y = 530; - for (let T = 0; T < List.length; T++) { - if ((MouseX >= X) && (MouseX <= X + 200) && (MouseY >= Y) && (MouseY <= Y + 55) && (DialogFocusItem.Property.Type != List[T])) - InventoryItemNeckAccessoriesCollarNameTagLivestockSetType(List[T]); - X = X + 210; - if (T % 5 == 4) { - X = 955; - Y = Y + 60; - } - } - } -} - -// Sets the type of tag -function InventoryItemNeckAccessoriesCollarNameTagLivestockSetType(NewType) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (CurrentScreen == "ChatRoom") { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarNameTagLivestockLoad(); - } - DialogFocusItem.Property.Type = NewType; - DialogFocusItem.Property.Effect = []; - - // Refreshes the character and chatroom - CharacterRefresh(C); - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "NameTagType", TextToLookUp: "CollarNameTagLivestockType" + ((NewType) ? NewType : "")}); - ChatRoomPublishCustomAction("CollarNameTagLivestockSet", true, Dictionary); - if (DialogInventory != null) { - DialogFocusItem = null; - DialogMenuButtonBuild(C); - } -} diff --git a/Screens/Inventory/ItemNeckAccessories/CollarNameTagLover/CollarNameTagLover.js b/Screens/Inventory/ItemNeckAccessories/CollarNameTagLover/CollarNameTagLover.js deleted file mode 100644 index 1153a9830..000000000 --- a/Screens/Inventory/ItemNeckAccessories/CollarNameTagLover/CollarNameTagLover.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemNeckAccessoriesCollarNameTagLoverLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Type: null }; -} - -// Draw the item extension screen -function InventoryItemNeckAccessoriesCollarNameTagLoverDraw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Draw the possible tags - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - DrawText(DialogFindPlayer("SelectCollarNameTagLoverType"), 1500, 500, "white", "gray"); - var List = DialogFocusItem.Asset.AllowType; - var X = 955; - var Y = 530; - for (let T = 0; T < List.length; T++) { - if ((DialogFocusItem.Property.Type != List[T])) DrawButton(X, Y, 200, 55, DialogFindPlayer("CollarNameTagLoverType" + List[T]), "White"); - X = X + 210; - if (T % 5 == 4) { - X = 955; - Y = Y + 60; - } - } - } - else { - DrawText(DialogFindPlayer("SelectCollarNameTagLoverTypeLocked"), 1500, 500, "white", "gray"); - } -} - -// Catches the item extension clicks -function InventoryItemNeckAccessoriesCollarNameTagLoverClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) { DialogFocusItem = null; return; } - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - var List = DialogFocusItem.Asset.AllowType; - var X = 955; - var Y = 530; - for (let T = 0; T < List.length; T++) { - if ((MouseX >= X) && (MouseX <= X + 200) && (MouseY >= Y) && (MouseY <= Y + 55) && (DialogFocusItem.Property.Type != List[T])) - InventoryItemNeckAccessoriesCollarNameTagLoverSetType(List[T]); - X = X + 210; - if (T % 5 == 4) { - X = 955; - Y = Y + 60; - } - } - } -} - -// Sets the type of tag -function InventoryItemNeckAccessoriesCollarNameTagLoverSetType(NewType) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (CurrentScreen == "ChatRoom") { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarNameTagLoverLoad(); - } - DialogFocusItem.Property.Type = NewType; - DialogFocusItem.Property.Effect = []; - - // Refreshes the character and chatroom - CharacterRefresh(C); - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "NameTagType", TextToLookUp: "CollarNameTagLoverType" + ((NewType) ? NewType : "")}); - ChatRoomPublishCustomAction("CollarNameTagLoverSet", true, Dictionary); - if (DialogInventory != null) { - DialogFocusItem = null; - DialogMenuButtonBuild(C); - } -} diff --git a/Screens/Inventory/ItemNeckAccessories/CollarNameTagOval/CollarNameTagOval.js b/Screens/Inventory/ItemNeckAccessories/CollarNameTagOval/CollarNameTagOval.js deleted file mode 100644 index 612a7ca52..000000000 --- a/Screens/Inventory/ItemNeckAccessories/CollarNameTagOval/CollarNameTagOval.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemNeckAccessoriesCollarNameTagOvalLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Type: null }; -} - -// Draw the item extension screen -function InventoryItemNeckAccessoriesCollarNameTagOvalDraw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Draw the possible tags - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - DrawText(DialogFindPlayer("SelectCollarNameTagOvalType"), 1500, 500, "white", "gray"); - var List = DialogFocusItem.Asset.AllowType; - var X = 955; - var Y = 530; - for (let T = 0; T < List.length; T++) { - if ((DialogFocusItem.Property.Type != List[T])) DrawButton(X, Y, 200, 55, DialogFindPlayer("CollarNameTagOvalType" + List[T]), "White"); - X = X + 210; - if (T % 5 == 4) { - X = 955; - Y = Y + 60; - } - } - } - else { - DrawText(DialogFindPlayer("SelectCollarNameTagOvalTypeLocked"), 1500, 500, "white", "gray"); - } -} - -// Catches the item extension clicks -function InventoryItemNeckAccessoriesCollarNameTagOvalClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) { DialogFocusItem = null; return; } - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - var List = DialogFocusItem.Asset.AllowType; - var X = 955; - var Y = 530; - for (let T = 0; T < List.length; T++) { - if ((MouseX >= X) && (MouseX <= X + 200) && (MouseY >= Y) && (MouseY <= Y + 55) && (DialogFocusItem.Property.Type != List[T])) - InventoryItemNeckAccessoriesCollarNameTagOvalSetType(List[T]); - X = X + 210; - if (T % 5 == 4) { - X = 955; - Y = Y + 60; - } - } - } -} - -// Sets the type of tag -function InventoryItemNeckAccessoriesCollarNameTagOvalSetType(NewType) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (CurrentScreen == "ChatRoom") { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarNameTagOvalLoad(); - } - DialogFocusItem.Property.Type = NewType; - DialogFocusItem.Property.Effect = []; - - // Refreshes the character and chatroom - CharacterRefresh(C); - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "NameTagType", TextToLookUp: "CollarNameTagOvalType" + ((NewType) ? NewType : "")}); - ChatRoomPublishCustomAction("CollarNameTagOvalSet", true, Dictionary); - if (DialogInventory != null) { - DialogFocusItem = null; - DialogMenuButtonBuild(C); - } -} diff --git a/Screens/Inventory/ItemNeckAccessories/CollarNameTagPet/CollarNameTagPet.js b/Screens/Inventory/ItemNeckAccessories/CollarNameTagPet/CollarNameTagPet.js deleted file mode 100644 index 4e0560b2e..000000000 --- a/Screens/Inventory/ItemNeckAccessories/CollarNameTagPet/CollarNameTagPet.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemNeckAccessoriesCollarNameTagPetLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Type: null }; -} - -// Draw the item extension screen -function InventoryItemNeckAccessoriesCollarNameTagPetDraw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Draw the possible tags - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - DrawText(DialogFindPlayer("SelectCollarNameTagPetType"), 1500, 500, "white", "gray"); - var List = DialogFocusItem.Asset.AllowType; - var X = 955; - var Y = 530; - for (let T = 0; T < List.length; T++) { - if ((DialogFocusItem.Property.Type != List[T])) DrawButton(X, Y, 200, 55, DialogFindPlayer("CollarNameTagPetType" + List[T]), "White"); - X = X + 210; - if (T % 5 == 4) { - X = 955; - Y = Y + 60; - } - } - } - else { - DrawText(DialogFindPlayer("SelectCollarNameTagPetTypeLocked"), 1500, 500, "white", "gray"); - } -} - -// Catches the item extension clicks -function InventoryItemNeckAccessoriesCollarNameTagPetClick() { - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) { DialogFocusItem = null; return; } - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - var List = DialogFocusItem.Asset.AllowType; - var X = 955; - var Y = 530; - for (let T = 0; T < List.length; T++) { - if ((MouseX >= X) && (MouseX <= X + 200) && (MouseY >= Y) && (MouseY <= Y + 55) && (DialogFocusItem.Property.Type != List[T])) - InventoryItemNeckAccessoriesCollarNameTagPetSetType(List[T]); - X = X + 210; - if (T % 5 == 4) { - X = 955; - Y = Y + 60; - } - } - } -} - -// Sets the type of tag -function InventoryItemNeckAccessoriesCollarNameTagPetSetType(NewType) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (CurrentScreen == "ChatRoom") { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarNameTagPetLoad(); - } - DialogFocusItem.Property.Type = NewType; - DialogFocusItem.Property.Effect = []; - - // Refreshes the character and chatroom - CharacterRefresh(C); - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "NameTagType", TextToLookUp: "CollarNameTagPetType" + ((NewType) ? NewType : "")}); - ChatRoomPublishCustomAction("CollarNameTagPetSet", true, Dictionary); - if (DialogInventory != null) { - DialogFocusItem = null; - DialogMenuButtonBuild(C); - } -} diff --git a/Screens/Inventory/ItemNeckAccessories/CollarShockUnit/CollarShockUnit.js b/Screens/Inventory/ItemNeckAccessories/CollarShockUnit/CollarShockUnit.js deleted file mode 100644 index a53199856..000000000 --- a/Screens/Inventory/ItemNeckAccessories/CollarShockUnit/CollarShockUnit.js +++ /dev/null @@ -1,191 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemNeckAccessoriesCollarShockUnitLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Intensity: 0, ShowText: true }; - if (DialogFocusItem.Property.Intensity == null) DialogFocusItem.Property.Intensity = 0; - if (DialogFocusItem.Property.TriggerCount == null) DialogFocusItem.Property.TriggerCount = 0; - if (DialogFocusItem.Property.ShowText == null) DialogFocusItem.Property.ShowText = true; -} - -// Draw the item extension screen -function InventoryItemNeckAccessoriesCollarShockUnitDraw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer("Intensity" + DialogFocusItem.Property.Intensity.toString()).replace("Item", DialogFocusItem.Asset.Description), 1500, 550, "White", "Gray"); - DrawText(DialogFindPlayer("ShockCount").replace("ShockCount", DialogFocusItem.Property.TriggerCount), 1500, 600, "White", "Gray"); - DrawButton(1200, 650, 200, 55, DialogFindPlayer("Low"), DialogFocusItem.Property.Intensity > 0 ? "White" : "Gray"); - DrawButton(1550, 650, 200, 55, DialogFindPlayer("Medium"), (DialogFocusItem.Property.Intensity < 1 || DialogFocusItem.Property.Intensity > 1) ? "White" : "Gray"); - DrawButton(1375, 710, 200, 55, DialogFindPlayer("High"), DialogFocusItem.Property.Intensity < 2 ? "White" : "Gray"); - if (CurrentScreen == "ChatRoom") DrawButton(1325, 800, 64, 64, "", "White", DialogFocusItem.Property.ShowText ? "Icons/Checked.png" : ""); - if (CurrentScreen == "ChatRoom") DrawText(DialogFindPlayer("ShockCollarShowChat"), 1570, 833, "White", "Gray"); - DrawButton(1250, 900, 200, 55, DialogFindPlayer("ResetShockCount"), Player.CanInteract() && DialogFocusItem.Property.TriggerCount > 0 ? "White" : "Gray"); - DrawButton(1500, 900, 200, 55, DialogFindPlayer("TriggerShock"), Player.CanInteract() ? "White" : "Gray"); -} - -// Catches the item extension clicks -function InventoryItemNeckAccessoriesCollarShockUnitClick() { - if (MouseIn(1325, 800, 64, 64) && (CurrentScreen == "ChatRoom")) { - DialogFocusItem.Property.ShowText = !DialogFocusItem.Property.ShowText; - return; - } - - if (MouseIn(1200, 650, 200, 55) && (DialogFocusItem.Property.Intensity > 0)) { - InventoryItemNeckAccessoriesCollarShockUnitSetIntensity(0 - DialogFocusItem.Property.Intensity); - return; - } - - if (MouseIn(1550, 650, 200, 55) && (DialogFocusItem.Property.Intensity < 1 || DialogFocusItem.Property.Intensity > 1)) { - InventoryItemNeckAccessoriesCollarShockUnitSetIntensity(1 - DialogFocusItem.Property.Intensity); - return; - } - - if (MouseIn(1375, 710, 200, 55) && (DialogFocusItem.Property.Intensity < 2)) { - InventoryItemNeckAccessoriesCollarShockUnitSetIntensity(2 - DialogFocusItem.Property.Intensity); - return; - } - - if (Player.CanInteract() && MouseIn(1500, 900, 200, 55)) { - InventoryItemNeckAccessoriesCollarShockUnitTrigger(); - return; - } - - if (Player.CanInteract() && DialogFocusItem.Property.TriggerCount > 0 && MouseIn(1250, 900, 200, 55)) { - InventoryItemNeckAccessoriesCollarShockUnitResetCount(); - return; - } - - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; -} - -// Resets the trigger count -function InventoryItemNeckAccessoriesCollarShockUnitResetCount() { - // Gets the current item and character - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarShockUnitLoad(); - } - - DialogFocusItem.Property.TriggerCount = 0; - - var Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name }); - Dictionary.push({ AssetName: DialogFocusItem.Asset.Name }); - Dictionary.push({ AssetGroupName: DialogFocusItem.Asset.Group.Name }); - - ChatRoomPublishCustomAction("ShockCountReset", false, Dictionary); - -} - -// Sets the shock collar intensity -function InventoryItemNeckAccessoriesCollarShockUnitSetIntensity(Modifier) { - - // Gets the current item and character - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarShockUnitLoad(); - } - - DialogFocusItem.Property.Intensity = DialogFocusItem.Property.Intensity + Modifier; - if (DialogFocusItem.Property.ShowText) { - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name}); - ChatRoomPublishCustomAction("ShockCollarSet" + DialogFocusItem.Property.Intensity, true, Dictionary); - } - else - DialogLeave(); - -} - -// Trigger a shock from the dialog menu -function InventoryItemNeckAccessoriesCollarShockUnitTrigger() { - // Gets the current item and character - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarShockUnitLoad(); - } - - DialogFocusItem.Property.TriggerCount++; - - var Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name}); - Dictionary.push({ Tag: "ActivityName", Text: "ShockItem" }); - Dictionary.push({ Tag: "ActivityGroup", Text: DialogFocusItem.Asset.Group.Name }); - Dictionary.push({ ShockIntensity : DialogFocusItem.Property.Intensity * 1.5}); - Dictionary.push({ AssetName: DialogFocusItem.Asset.Name }); - Dictionary.push({ AssetGroupName: DialogFocusItem.Asset.Group.Name }); - - ChatRoomPublishCustomAction("TriggerShock" + DialogFocusItem.Property.Intensity, false, Dictionary); - - if (C.ID == Player.ID) { - // The Player shocks herself - ActivityArousalItem(C, C, DialogFocusItem.Asset); - } - if (CurrentScreen == "ChatRoom") - DialogLeave(); - - InventoryShockExpression(C); -} - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemNeckAccessoriesCollarShockUnitBeforeDraw(data) { - if (data.L === "_Light") { - var persistentData = data.PersistentData(); - var property = data.Property || {}; - var Triggered = persistentData.LastTriggerCount < property.TriggerCount; - var intensity = property.Intensity ? property.Intensity : 0; - var wasBlinking = property.Type === "Blink"; - if (wasBlinking && Triggered) persistentData.DisplayCount++; - if (persistentData.DisplayCount >= intensity * 1.5 + 3) { - persistentData.DisplayCount = 0; - persistentData.LastTriggerCount = property.TriggerCount; - } - return { Color: Triggered ? "#f00" : "#2f0" }; - } -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemNeckAccessoriesCollarShockUnitScriptDraw(data) { - var persistentData = data.PersistentData(); - /** @type {ItemProperties} */ - var property = (data.Item.Property = data.Item.Property || {}); - if (typeof persistentData.ChangeTime !== "number") persistentData.ChangeTime = CommonTime() + 4000; - if (typeof persistentData.DisplayCount !== "number") persistentData.DisplayCount = 0; - if (typeof persistentData.LastTriggerCount !== "number") persistentData.LastTriggerCount = property.TriggerCount; - - - var isTriggered = persistentData.LastTriggerCount < property.TriggerCount; - var newlyTriggered = isTriggered && persistentData.DisplayCount == 0; - if (newlyTriggered) - persistentData.ChangeTime = Math.min(persistentData.ChangeTime, CommonTime()); - - if (persistentData.ChangeTime < CommonTime()) { - if (persistentData.LastTriggerCount > property.TriggerCount) persistentData.LastTriggerCount = 0; - var wasBlinking = property.Type === "Blink"; - property.Type = wasBlinking && !newlyTriggered ? null : "Blink"; - var timeFactor = isTriggered ? 12 : 1; - var timeToNextRefresh = (wasBlinking ? 4000 : 1000) / timeFactor; - persistentData.ChangeTime = CommonTime() + timeToNextRefresh; - AnimationRequestRefreshRate(data.C, (5000 / timeFactor) - timeToNextRefresh); - AnimationRequestDraw(data.C); - } -} - -/** - * @returns {[string, number]} - */ -function InventoryItemNeckAccessoriesCollarShockUnitDynamicAudio(data) { - var Modifier = parseInt(data.Content.substr(data.Content.length - 1)); - if (isNaN(Modifier)) Modifier = 0; - return ["Shocks", Modifier * 3]; -} diff --git a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/CustomCollarTag.js b/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/CustomCollarTag.js deleted file mode 100644 index 746dd8875..000000000 --- a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/CustomCollarTag.js +++ /dev/null @@ -1,93 +0,0 @@ -"use strict"; -var InventoryItemNeckAccessoriesCustomCollarTagAllowedChars = /^[a-zA-Z0-9 ~!]*$/; -// Loads the item extension properties -function InventoryItemNeckAccessoriesCustomCollarTagTxt0Load() { - ElementCreateInput("TagText", "text", DialogFocusItem.Property.Text || "", "9"); -} - -// Draw the extension screen -function InventoryItemNeckAccessoriesCustomCollarTagTxt0Draw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Tag data - ElementPosition("TagText", 1375, 680, 250); - DrawButton(1500, 651, 350, 64, DialogFindPlayer("CustomTagText"), ElementValue("TagText").match(InventoryItemNeckAccessoriesCustomCollarTagAllowedChars) ? "White" : "#888", ""); -} - -// Catches the item extension clicks -function InventoryItemNeckAccessoriesCustomCollarTagTxt0Click() { - if ( - MouseIn(1500, 651, 350, 64) && - DialogFocusItem.Property.Text !== ElementValue("TagText") && - ElementValue("TagText").match(InventoryItemNeckAccessoriesCustomCollarTagAllowedChars) - ) { - DialogFocusItem.Property.Text = ElementValue("TagText"); - InventoryItemNeckAccessoriesCustomCollarTagChange(); - } - - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemNeckAccessoriesCustomCollarTagExit(); - } -} - -// Leaves the extended screen -function InventoryItemNeckAccessoriesCustomCollarTagExit() { - ElementRemove("TagText"); - ExtendedItemSubscreen = null; -} - -// When the tag is changed -function InventoryItemNeckAccessoriesCustomCollarTagChange() { - var C = CharacterGetCurrent(); - CharacterRefresh(C); - if (CurrentScreen == "ChatRoom") { - var Dictionary = []; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - ChatRoomPublishCustomAction("ChangeCustomTag", false, Dictionary); - } - InventoryItemNeckAccessoriesCustomCollarTagExit(); -} - -/** @type {DynamicAfterDrawCallback} */ -function AssetsItemNeckAccessoriesCustomCollarTagAfterDraw({ - C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color -}) { - if (L === "_Text") { - // Determine the canvas position and size - const Properties = Property || {}; - const Type = Properties.Type || "t0"; - - // We set up a canvas - let Height = 50; - let Width = 45; - let YOffset = 30; - const FontName = "sans-serif"; - const TempCanvas = AnimationGenerateTempCanvas(C, A, Width, Height); - - if (Type.includes("t1")) { - YOffset = 45; - } else if (Type.includes("t3")) { - YOffset = 32; - } else if (Type.includes("t4")) { - YOffset = 31; - } else if (Type.includes("t5")) { - YOffset = 31; - } - - const text = Property && typeof Property.Text === "string" && InventoryItemNeckAccessoriesCustomCollarTagAllowedChars.test(Property.Text) ? Property.Text : "Tag"; - - // We draw the desired info on that canvas - let context = TempCanvas.getContext('2d'); - context.font = "13px " + FontName; - context.fillStyle = Color; - context.textAlign = "center"; - context.fillText(text, Width / 2, Width / 2, Width); - - // We print the canvas to the character based on the asset position - drawCanvas(TempCanvas, X + 227.5, Y + YOffset, AlphaMasks); - drawCanvasBlink(TempCanvas, X + 227.5, Y + YOffset, AlphaMasks); - } -} diff --git a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t0.png b/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t0.png deleted file mode 100644 index 91f0500db..000000000 Binary files a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t0.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t1.png b/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t1.png deleted file mode 100644 index 4dacbe10c..000000000 Binary files a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t1.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t2.png b/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t2.png deleted file mode 100644 index b07e1125d..000000000 Binary files a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t2.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t3.png b/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t3.png deleted file mode 100644 index b759f2039..000000000 Binary files a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t3.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t4.png b/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t4.png deleted file mode 100644 index 79226f054..000000000 Binary files a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t4.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t5.png b/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t5.png deleted file mode 100644 index 3ac8be383..000000000 Binary files a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/t5.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/x0.png b/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/x0.png deleted file mode 100644 index 91f0500db..000000000 Binary files a/Screens/Inventory/ItemNeckAccessories/CustomCollarTag/x0.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckAccessories/ElectronicTag/ElectronicTag.js b/Screens/Inventory/ItemNeckAccessories/ElectronicTag/ElectronicTag.js deleted file mode 100644 index d7f21f4b2..000000000 --- a/Screens/Inventory/ItemNeckAccessories/ElectronicTag/ElectronicTag.js +++ /dev/null @@ -1,101 +0,0 @@ -"use strict"; -// Loads the item extension properties -function InventoryItemNeckAccessoriesElectronicTagLoad() { - var C = CharacterGetCurrent(); - var MustRefresh = false; - - if (DialogFocusItem.Property == null) DialogFocusItem.Property = {}; - if (DialogFocusItem.Property.Text == null) { - DialogFocusItem.Property.Text = "Tag"; - MustRefresh = true; - } - if (MustRefresh) { - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, DialogFocusItem.Asset.Group.Name); - } - - // Only create the inputs if the item isn't locked - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - ElementCreateInput("TagText", "text", DialogFocusItem.Property.Text, "9"); - } -} - -// Draw the extension screen -function InventoryItemNeckAccessoriesElectronicTagDraw() { - var C = CharacterGetCurrent(); - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Tag data - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - ElementPosition("TagText", 1375, 680, 250); - DrawButton(1500, 651, 350, 64, DialogFindPlayer("CustomTagText"), ElementValue("TagText").match(InventoryItemNeckAccessoriesCustomCollarTagAllowedChars) ? "White" : "#888", ""); - } else { - DrawText(DialogFindPlayer("SelectCollarNameTagTypeLocked"), 1500, 500, "white", "gray"); - } -} - -// Catches the item extension clicks -function InventoryItemNeckAccessoriesElectronicTagClick() { - - if (!InventoryItemHasEffect(DialogFocusItem, "Lock", true)) { - // Change values if they are different and the tag is not locked - if ((MouseX >= 1500) && (MouseX <= 1850)) { - // Changes the text - if ((MouseY >= 671) && (MouseY <= 735) && DialogFocusItem.Property.Text !== ElementValue("TagText") && ElementValue("TagText").match(InventoryItemNeckAccessoriesCustomCollarTagAllowedChars)) { - DialogFocusItem.Property.Text = ElementValue("TagText"); - InventoryItemNeckAccessoriesElectronicTagChange(); - } - } - } - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemNeckAccessoriesElectronicTagExit(); - } -} - -// Leaves the extended screen -function InventoryItemNeckAccessoriesElectronicTagExit() { - ElementRemove("TagText"); - PreferenceMessage = ""; - DialogFocusItem = null; - if (DialogInventory != null) DialogMenuButtonBuild(CharacterGetCurrent()); -} - -// When the tag is changed -function InventoryItemNeckAccessoriesElectronicTagChange() { - var C = CharacterGetCurrent(); - CharacterRefresh(C); - if (CurrentScreen == "ChatRoom") { - var Dictionary = []; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - ChatRoomPublishCustomAction("ChangeCustomTag", true, Dictionary); - InventoryItemNeckAccessoriesElectronicTagExit(); - } -} - -/** @type {DynamicAfterDrawCallback} */ -function AssetsItemNeckAccessoriesElectronicTagAfterDraw({ - C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color -}) { - if (L === "_Text") { - // We set up a canvas - const Height = 50; - const Width = 45; - const TempCanvas = AnimationGenerateTempCanvas(C, A, Width, Height); - - const text = Property && typeof Property.Text === "string" && InventoryItemNeckAccessoriesCustomCollarTagAllowedChars.test(Property.Text) ? Property.Text : "Tag"; - - // We draw the desired info on that canvas - let context = TempCanvas.getContext('2d'); - context.font = "14px sansserif"; - context.fillStyle = Color; - context.textAlign = "center"; - context.fillText(text, Width / 2, Width / 2, Width); - - // We print the canvas to the character based on the asset position - drawCanvas(TempCanvas, X + 228.5, Y + 30, AlphaMasks); - drawCanvasBlink(TempCanvas, X + 228.5, Y + 30, AlphaMasks); - } -} diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/PetPost.js b/Screens/Inventory/ItemNeckRestraints/PetPost/PetPost.js deleted file mode 100644 index b85c43c55..000000000 --- a/Screens/Inventory/ItemNeckRestraints/PetPost/PetPost.js +++ /dev/null @@ -1,104 +0,0 @@ -"use strict"; -var InventoryItemNeckRestraintsPetPostAllowedChars = /^[a-zA-Z0-9 ~!'.,?!-*€$/]*$/; -// Loads the item extension properties -function InventoryItemNeckRestraintsPetPostTxt0Load() { - ElementCreateInput("SignText", "text", DialogFocusItem.Property.Text || "", "14"); - ElementCreateInput("SignText2", "text2", DialogFocusItem.Property.Text2 || "", "14"); - ElementCreateInput("SignText3", "text3", DialogFocusItem.Property.Text3 || "", "14"); -} - -// Draw the extension screen -function InventoryItemNeckRestraintsPetPostTxt0Draw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - // Tag data - ElementPosition("SignText", 1510, 560, 250); - ElementPosition("SignText2", 1510, 620, 250); - ElementPosition("SignText3", 1510, 680, 250); - DrawButton(1375, 740, 250, 64, DialogFindPlayer("PetPostText"), ElementValue("SignText").match(InventoryItemNeckRestraintsPetPostAllowedChars) ? "White" : "#888", ""); -} - -// Catches the item extension clicks -function InventoryItemNeckRestraintsPetPostTxt0Click() { - if ( - MouseIn(1375, 740, 250, 64) && - ( - DialogFocusItem.Property.Text !== ElementValue("SignText") && - ElementValue("SignText").match(InventoryItemNeckRestraintsPetPostAllowedChars)|| - DialogFocusItem.Property.Text2 !== ElementValue("SignText2") && - ElementValue("SignText2").match(InventoryItemNeckRestraintsPetPostAllowedChars)|| - DialogFocusItem.Property.Text3 !== ElementValue("SignText3") && - ElementValue("SignText3").match(InventoryItemNeckRestraintsPetPostAllowedChars) - ) - ) { - DialogFocusItem.Property.Text = ElementValue("SignText"); - DialogFocusItem.Property.Text2 = ElementValue("SignText2"); - DialogFocusItem.Property.Text3 = ElementValue("SignText3"); - InventoryItemNeckRestraintsPetPostChange(); - } - - // Exits the screen - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemNeckRestraintsPetPostExit(); - } -} - -// Leaves the extended screen -function InventoryItemNeckRestraintsPetPostExit() { - ElementRemove("SignText"); - ElementRemove("SignText2"); - ElementRemove("SignText3"); - ExtendedItemSubscreen = null; -} - -// When the tag is changed -function InventoryItemNeckRestraintsPetPostChange() { - var C = CharacterGetCurrent(); - CharacterRefresh(C); - if (CurrentScreen == "ChatRoom") { - var Dictionary = []; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - ChatRoomPublishCustomAction("ChangeSign", false, Dictionary); - } - InventoryItemNeckRestraintsPetPostExit(); -} - -// Drawing function for the text on the sign -function AssetsItemNeckRestraintsPetPostAfterDraw({ - C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color -}) { - if (L === "_Text") { - // Determine the canvas position and size - const Properties = Property || {}; - const Type = Properties.Type || "t0"; - - // We set up a canvas - let Height = 100; - let Width = 90; - let YOffset = 20; - const FontName = "sans-serif"; - const TempCanvas = AnimationGenerateTempCanvas(C, A, Width, Height); - let text = Property && typeof Property.Text === "string" && InventoryItemNeckRestraintsPetPostAllowedChars.test(Property.Text) ? Property.Text : "Pet"; - let text2 = Property && typeof Property.Text2 === "string" && InventoryItemNeckRestraintsPetPostAllowedChars.test(Property.Text2) ? Property.Text2 : "Leashing"; - let text3 = Property && typeof Property.Text3 === "string" && InventoryItemNeckRestraintsPetPostAllowedChars.test(Property.Text2) ? Property.Text3 : "Post"; - - // We draw the desired info on that canvas - let context = TempCanvas.getContext('2d'); - context.font = "22px " + FontName; - context.fillStyle = Color; - context.textAlign = "center"; - context.fillText(text, Width / 2, Height / 2, Width); - context.fillText(text2, Width / 2, Height / 2 + 24, Width); - context.fillText(text3, Width / 2, Height / 2 + 46, Width); - - // We print the canvas to the character based on the asset position - drawCanvas(TempCanvas, X + 24, Y + YOffset, AlphaMasks); - drawCanvasBlink(TempCanvas, X + 24, Y + YOffset, AlphaMasks); - } -} - -/* - -*/ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/d0.png b/Screens/Inventory/ItemNeckRestraints/PetPost/d0.png deleted file mode 100644 index fad741cc7..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/d0.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/d1.png b/Screens/Inventory/ItemNeckRestraints/PetPost/d1.png deleted file mode 100644 index fc6142f6e..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/d1.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/l0.png b/Screens/Inventory/ItemNeckRestraints/PetPost/l0.png deleted file mode 100644 index 6273219fd..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/l0.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/l1.png b/Screens/Inventory/ItemNeckRestraints/PetPost/l1.png deleted file mode 100644 index 4ffdf9929..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/l1.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/l2.png b/Screens/Inventory/ItemNeckRestraints/PetPost/l2.png deleted file mode 100644 index f75e45745..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/l2.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/m0.png b/Screens/Inventory/ItemNeckRestraints/PetPost/m0.png deleted file mode 100644 index bec3c3afb..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/m0.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/m1.png b/Screens/Inventory/ItemNeckRestraints/PetPost/m1.png deleted file mode 100644 index 15bace7f9..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/m1.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/p0.png b/Screens/Inventory/ItemNeckRestraints/PetPost/p0.png deleted file mode 100644 index a1829976f..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/p0.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/p1.png b/Screens/Inventory/ItemNeckRestraints/PetPost/p1.png deleted file mode 100644 index 3c9da8320..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/p1.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/s0.png b/Screens/Inventory/ItemNeckRestraints/PetPost/s0.png deleted file mode 100644 index a1829976f..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/s0.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/s1.png b/Screens/Inventory/ItemNeckRestraints/PetPost/s1.png deleted file mode 100644 index 1b411cd03..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/s1.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/s2.png b/Screens/Inventory/ItemNeckRestraints/PetPost/s2.png deleted file mode 100644 index 07c7113b9..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/s2.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/s3.png b/Screens/Inventory/ItemNeckRestraints/PetPost/s3.png deleted file mode 100644 index 6abea4b15..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/s3.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/s4.png b/Screens/Inventory/ItemNeckRestraints/PetPost/s4.png deleted file mode 100644 index 6523a097f..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/s4.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/s5.png b/Screens/Inventory/ItemNeckRestraints/PetPost/s5.png deleted file mode 100644 index bfb4b513d..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/s5.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/s6.png b/Screens/Inventory/ItemNeckRestraints/PetPost/s6.png deleted file mode 100644 index a3cba0749..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/s6.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/s7.png b/Screens/Inventory/ItemNeckRestraints/PetPost/s7.png deleted file mode 100644 index 631893d4f..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/s7.png and /dev/null differ diff --git a/Screens/Inventory/ItemNeckRestraints/PetPost/x0.png b/Screens/Inventory/ItemNeckRestraints/PetPost/x0.png deleted file mode 100644 index 482d90f2e..000000000 Binary files a/Screens/Inventory/ItemNeckRestraints/PetPost/x0.png and /dev/null differ diff --git a/Screens/Inventory/ItemNipples/ChainClamp/Chain.png b/Screens/Inventory/ItemNipples/ChainClamp/Chain.png deleted file mode 100644 index 132bf33ff..000000000 Binary files a/Screens/Inventory/ItemNipples/ChainClamp/Chain.png and /dev/null differ diff --git a/Screens/Inventory/ItemNipples/ChainClamp/Chain2.png b/Screens/Inventory/ItemNipples/ChainClamp/Chain2.png deleted file mode 100644 index 888bfc80e..000000000 Binary files a/Screens/Inventory/ItemNipples/ChainClamp/Chain2.png and /dev/null differ diff --git a/Screens/Inventory/ItemNipples/LactationPump/LactationPump.js b/Screens/Inventory/ItemNipples/LactationPump/LactationPump.js deleted file mode 100644 index 0d99156bc..000000000 --- a/Screens/Inventory/ItemNipples/LactationPump/LactationPump.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsItemNipplesLactationPumpBeforeDraw(data) { - // If suspended off the ground, use the normal pose image - if (data.C.IsSuspended() && data.C.HeightRatioProportion < 1) { - return { Pose: "" }; - } - - return null; -} diff --git a/Screens/Inventory/ItemNipples/ShockClamps/ShockClamps.js b/Screens/Inventory/ItemNipples/ShockClamps/ShockClamps.js deleted file mode 100644 index 344838baf..000000000 --- a/Screens/Inventory/ItemNipples/ShockClamps/ShockClamps.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemNipplesShockClampsLoad() { - InventoryItemNeckAccessoriesCollarShockUnitLoad(); -} - -// Draw the item extension screen -function InventoryItemNipplesShockClampsDraw() { - InventoryItemNeckAccessoriesCollarShockUnitDraw(); -} - -// Catches the item extension clicks -function InventoryItemNipplesShockClampsClick() { - InventoryItemNeckAccessoriesCollarShockUnitClick(); -} \ No newline at end of file diff --git a/Screens/Inventory/ItemNipples/TapedVibeEggs/TapedVibeEggs.js b/Screens/Inventory/ItemNipples/TapedVibeEggs/TapedVibeEggs.js deleted file mode 100644 index 5eb213445..000000000 --- a/Screens/Inventory/ItemNipples/TapedVibeEggs/TapedVibeEggs.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; -function InventoryItemNipplesTapedVibeEggsLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemNipplesTapedVibeEggsDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemNipplesTapedVibeEggsClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemNipplesTapedVibeEggsScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemNipples/VibeNippleClamp/VibeNippleClamp.js b/Screens/Inventory/ItemNipples/VibeNippleClamp/VibeNippleClamp.js deleted file mode 100644 index 688415639..000000000 --- a/Screens/Inventory/ItemNipples/VibeNippleClamp/VibeNippleClamp.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -function InventoryItemNipplesVibeNippleClampLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemNipplesVibeNippleClampDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemNipplesVibeNippleClampClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemNipplesVibeNippleClampScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/Base.png b/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/Base.png deleted file mode 100644 index 834341152..000000000 Binary files a/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/Base.png and /dev/null differ diff --git a/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/Chain.png b/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/Chain.png deleted file mode 100644 index 988043ff0..000000000 Binary files a/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/Chain.png and /dev/null differ diff --git a/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/Weighted.png b/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/Weighted.png deleted file mode 100644 index 72cfeaddd..000000000 Binary files a/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/Weighted.png and /dev/null differ diff --git a/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/WeightedChain.png b/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/WeightedChain.png deleted file mode 100644 index 26b062dd9..000000000 Binary files a/Screens/Inventory/ItemNipplesPiercings/RoundPiercing/WeightedChain.png and /dev/null differ diff --git a/Screens/Inventory/ItemNipplesPiercings/VibeHeartPiercings/VibeHeartPiercings.js b/Screens/Inventory/ItemNipplesPiercings/VibeHeartPiercings/VibeHeartPiercings.js deleted file mode 100644 index 4e1e80ee0..000000000 --- a/Screens/Inventory/ItemNipplesPiercings/VibeHeartPiercings/VibeHeartPiercings.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -function InventoryItemNipplesPiercingsVibeHeartPiercingsLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemNipplesPiercingsVibeHeartPiercingsDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemNipplesPiercingsVibeHeartPiercingsClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemNipplesPiercingsVibeHeartPiercingsScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemNose/NoseRing/Base.png b/Screens/Inventory/ItemNose/NoseRing/Base.png deleted file mode 100644 index ca4942ccf..000000000 Binary files a/Screens/Inventory/ItemNose/NoseRing/Base.png and /dev/null differ diff --git a/Screens/Inventory/ItemNose/NoseRing/ChainLong.png b/Screens/Inventory/ItemNose/NoseRing/ChainLong.png deleted file mode 100644 index fcbbb866b..000000000 Binary files a/Screens/Inventory/ItemNose/NoseRing/ChainLong.png and /dev/null differ diff --git a/Screens/Inventory/ItemNose/NoseRing/ChainShort.png b/Screens/Inventory/ItemNose/NoseRing/ChainShort.png deleted file mode 100644 index 1c6e66737..000000000 Binary files a/Screens/Inventory/ItemNose/NoseRing/ChainShort.png and /dev/null differ diff --git a/Screens/Inventory/ItemNose/NoseRing/Leash.png b/Screens/Inventory/ItemNose/NoseRing/Leash.png deleted file mode 100644 index 257e728cc..000000000 Binary files a/Screens/Inventory/ItemNose/NoseRing/Leash.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/FuturisticChastityBelt.js b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/FuturisticChastityBelt.js deleted file mode 100644 index 15b067c2f..000000000 --- a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/FuturisticChastityBelt.js +++ /dev/null @@ -1,115 +0,0 @@ -"use strict"; -var FuturisticChastityBeltShockCooldownOrgasm = 15000; // 15 sec -var FuturisticChastityBeltConfigure = false; -var FuturisticChastityBeltSwitchModel = false; - -var InventoryItemPelvisFuturisticChastityBeltTamperZones = [ - "ItemPelvis", - "ItemButt", - "ItemVulva", -]; - -/** - * @param {Item} Item - */ -function InventoryFuturisticChastityBeltCheckPunish(Item) { - // Punish the player if they try to mess with the groin area - if ((Item.Property.PunishStruggle || (Item.Property.Type && (Item.Property.Type.includes("t1") || Item.Property.Type.includes("t2")))) && Player.FocusGroup && (StruggleProgress >= 0 || StruggleLockPickProgressCurrentTries > 0) && StruggleProgressPrevItem != null && StruggleProgressStruggleCount > 0) { - var inFocus = false; - for (var Z = 0; Z < InventoryItemPelvisFuturisticChastityBeltTamperZones.length; Z++) - if (Player.FocusGroup.Name == InventoryItemPelvisFuturisticChastityBeltTamperZones[Z]) - inFocus = true; - - if (inFocus) { - return "Struggle"; - } - } - - // Punish the player if they struggle anywhere - if ((Item.Property.PunishStruggleOther || (Item.Property.Type && Item.Property.Type.includes("t2"))) && Player.FocusGroup && StruggleProgressPrevItem != null && StruggleProgressStruggleCount > 0 && (StruggleProgress > 50 || StruggleLockPickProgressCurrentTries > 2)) { - return "StruggleOther"; - } - - // Punish the player if they orgasm - if (Item.Property.NextShockTime - CurrentTime <= 0 && (Item.Property.PunishOrgasm || (Item.Property.Type && Item.Property.Type.includes("o1"))) && Player.ArousalSettings && Player.ArousalSettings.OrgasmStage > 1) { - // Punish the player if they orgasm - return "Orgasm"; - } - return ""; -} - -function AssetsItemPelvisFuturisticChastityBeltScriptUpdatePlayer(data) { - var Item = data.Item; - - const punishment = InventoryFuturisticChastityBeltCheckPunish(Item); - if (punishment) { - if (punishment == "Orgasm") { - AssetsItemPelvisFuturisticChastityBeltScriptTrigger(Player, Item, "Orgasm"); - Item.Property.NextShockTime = CurrentTime + FuturisticChastityBeltShockCooldownOrgasm; // Difficult to have two orgasms in 10 seconds - } else if (punishment == "StruggleOther") { - AssetsItemPelvisFuturisticChastityBeltScriptTrigger(Player, Item, "StruggleOther"); - StruggleProgressStruggleCount = 0; - StruggleProgress = 0; - DialogLeaveDueToItem = true; - } else if (punishment == "Struggle") { - AssetsItemPelvisFuturisticChastityBeltScriptTrigger(Player, Item, "Struggle"); - StruggleProgressStruggleCount = 0; - DialogLeaveDueToItem = true; - } - } -} - -// Trigger a shock automatically -function AssetsItemPelvisFuturisticChastityBeltScriptTrigger(C, Item, ShockType, ReplacementWord, NoShock) { - - if (!(CurrentScreen == "ChatRoom")) { - if (!NoShock) - AudioPlayInstantSound("Audio/Shocks.mp3"); - } else { - - var Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - if (ReplacementWord) - Dictionary.push({ Tag: "ReplacementWord", Text: ReplacementWord }); - Dictionary.push({Tag: "AssetName", AssetName: Item.Asset.Name}); - Dictionary.push({ Tag: "ActivityName", Text: "ShockItem" }); - Dictionary.push({ Tag: "ActivityGroup", Text: Item.Asset.Group.Name }); - Dictionary.push({ AssetName: Item.Asset.Name }); - Dictionary.push({ AssetGroupName: Item.Asset.Group.Name }); - let ShockPhrase = !NoShock ? "Shock" : "Punish" - if (!NoShock) Dictionary.push({ ShockIntensity : 2}); - if (Item.Property && Item.Property.ChatMessage) { - Dictionary.push({ Automatic: true }); - ServerSend("ChatRoomChat", { Content: "FuturisticChastityBelt" + ShockPhrase + ShockType, Type: "Action", Dictionary }); - } else { - ChatRoomMessage({ Content: "FuturisticChastityBelt" + ShockPhrase + ShockType, Type: "Action", Sender: Player.MemberNumber, Dictionary: Dictionary }); - } - } - InventoryShockExpression(C); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemPelvisFuturisticChastityBeltScriptDraw(data) { - var persistentData = data.PersistentData(); - /** @type {ItemProperties} */ - var property = (data.Item.Property = data.Item.Property || {}); - if (typeof persistentData.UpdateTime !== "number") persistentData.UpdateTime = CommonTime() + 4000; - if (typeof persistentData.LastMessageLen !== "number") persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - if (typeof property.NextShockTime !== "number") property.NextShockTime = 0; - - - if (persistentData.UpdateTime < CommonTime() && data.C == Player) { - - if (CommonTime() > property.NextShockTime) { - AssetsItemPelvisFuturisticChastityBeltScriptUpdatePlayer(data); - persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - } - - var timeToNextRefresh = 950; - persistentData.UpdateTime = CommonTime() + timeToNextRefresh; - AnimationRequestRefreshRate(data.C, 5000 - timeToNextRefresh); - AnimationRequestDraw(data.C); - } -} diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/b0.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/b0.png deleted file mode 100644 index 88b4e7b5b..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/b0.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/b1.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/b1.png deleted file mode 100644 index 40c07400d..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/b1.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/f0.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/f0.png deleted file mode 100644 index 88b4e7b5b..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/f0.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/f1.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/f1.png deleted file mode 100644 index 40c07400d..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/f1.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m0.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m0.png deleted file mode 100644 index 74e6a5e70..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m0.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m1.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m1.png deleted file mode 100644 index 7e240c886..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m1.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m2.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m2.png deleted file mode 100644 index daa0183e4..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m2.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m3.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m3.png deleted file mode 100644 index 513fac831..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/m3.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/o0.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/o0.png deleted file mode 100644 index c7724a4a1..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/o0.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/o1.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/o1.png deleted file mode 100644 index db0b536ae..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/o1.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/t0.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/t0.png deleted file mode 100644 index 88b4e7b5b..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/t0.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/t1.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/t1.png deleted file mode 100644 index db0b536ae..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/t1.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/t2.png b/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/t2.png deleted file mode 100644 index 594b47a70..000000000 Binary files a/Screens/Inventory/ItemPelvis/FuturisticChastityBelt/t2.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/FuturisticTrainingBelt/FuturisticTrainingBelt.js b/Screens/Inventory/ItemPelvis/FuturisticTrainingBelt/FuturisticTrainingBelt.js deleted file mode 100644 index c33cc4c75..000000000 --- a/Screens/Inventory/ItemPelvis/FuturisticTrainingBelt/FuturisticTrainingBelt.js +++ /dev/null @@ -1,752 +0,0 @@ -"use strict"; - -/*FuturisticTrainingBeltPunishSpeech,,,Punishment for speaking too much: ,, -FuturisticTrainingBeltPunishSpeech0,,,None,, -FuturisticTrainingBeltPunishSpeech1,,,Shock,, -FuturisticTrainingBeltPunishSpeech2,,,Edge for 10m,, -FuturisticTrainingBeltPunishSpeech3,,,Vibe for 10m,, -FuturisticTrainingBeltPunishRequiredSpeech,,,Punishment for not saying word: ,, -FuturisticTrainingBeltPunishRequiredSpeech0,,,None,, -FuturisticTrainingBeltPunishRequiredSpeech1,,,Shock,, -FuturisticTrainingBeltPunishRequiredSpeech2,,,Edge for 10m,, -FuturisticTrainingBeltPunishRequiredSpeech3,,,Vibe for 10m,,*/ - -var FuturisticTrainingBeltPermissions = ["Public", "Mistresses", "Locked"]; -var FuturisticTrainingBeltSpeechPunishments = ["None", "Shock", "Edge", "Vibe"]; -var FuturisticTrainingBeltModes = ["None", "Tease", "Excite", "FullPower", "EdgeAndDeny", "RandomTeasing", "RandomOrgasm"]; -var FuturisticTrainingBeltStates = ["None", "LowPriorityEdge", "LowPriorityTease", "LowPriorityLow", "LowPriorityMedium", "LowPriorityMax", "HighPriorityEdge", "HighPriorityMax", "Cooldown"]; - -var FuturisticTrainingBeltSetMode = -1; - -var FuturisticTrainingBeltStandUpFlag = false; - -var FuturisticTrainingBeltSpeechCharacterLimit = 25; - -var FuturisticTrainingBeltRandomEdgeCycle = 150000; // 150s = 20% downtime at low intensity, so 30 of low and 120s of high - -var FuturisticTrainingBeltRandomTeaseDurationMin = 30000; // 30 seconds -var FuturisticTrainingBeltRandomTeaseDurationMax = 300000; // 5 minutes -var FuturisticTrainingBeltRandomTeaseDurationCooldown = 60000; // 60 seconds -var FuturisticTrainingBeltRandomTeaseChance = 0.015; // Chance per second that this happens -var FuturisticTrainingBeltRandomTeaseMaxChance = 0.1; // Chance that teasing will be maximum -var FuturisticTrainingBeltRandomDenyChance = 0.01; // Chance per second we will deny the player -var FuturisticTrainingBeltRandomDenyDuration = 30000; - -var FuturisticTrainingBeltRandomOrgasmDurationMin = 60000; // 1 minute -var FuturisticTrainingBeltRandomOrgasmDurationMax = 3*60000; // 3 minutes -var FuturisticTrainingBeltRandomOrgasmDurationCooldown = 60000; // 1 minute -var FuturisticTrainingBeltRandomOrgasmChance = 0.015; // Chance per second that this happens - -var FuturisticTrainingBeltPunishmentEdgeDuration = 5*60000; // 5 minutes edge -var FuturisticTrainingBeltPunishmentVibeDuration = 5*60000; // 5 minutes constant orgasms - -var FuturisticTrainingBeltPage = 0; -var FuturisticTrainingBeltMaxPage = 1; - -function InventoryItemPelvisFuturisticTrainingBeltLoad() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticLoadAccessDenied(); - } else{ - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { - Intensity: -1, - // Security - ChatMessage: false, - NextShockTime: 0, - PunishStruggle: false, - PunishStruggleOther: false, - PunishOrgasm: false, - PunishStandup: false, - PunishSpeech: 0, - PunishRequiredSpeech: 0, - PunishRequiredSpeechWord: "Miss", - PunishProhibitedSpeech: 0, - PunishProhibitedSpeechWords: "I,me,am,my,im", - // Public Modes - PublicModeCurrent: 0, - PublicModePermission: 0, - // State machine - //DeviceState: 0, - //DeviceStateTimer: 0, // Timer for the end of the current state - //DeviceVibeMode: VibratorMode.OFF, // Timer for the end of the current state - }; - // Security - if (DialogFocusItem.Property.NextShockTime == null) DialogFocusItem.Property.NextShockTime = 0; - if (DialogFocusItem.Property.PunishStruggle == null) DialogFocusItem.Property.PunishStruggle = false; - if (DialogFocusItem.Property.PunishSpeech == null) DialogFocusItem.Property.PunishSpeech = 0; - if (DialogFocusItem.Property.PunishRequiredSpeech == null) DialogFocusItem.Property.PunishRequiredSpeech = 0; - if (DialogFocusItem.Property.PunishRequiredSpeechWord == null) DialogFocusItem.Property.PunishRequiredSpeechWord = "Miss"; - if (DialogFocusItem.Property.PunishProhibitedSpeech == null) DialogFocusItem.Property.PunishProhibitedSpeech = 0; - if (DialogFocusItem.Property.PunishProhibitedSpeechWords == null) DialogFocusItem.Property.PunishProhibitedSpeechWords = "I,me,am,my,im"; - if (DialogFocusItem.Property.PunishStandup == null) DialogFocusItem.Property.PunishStandup = false; - if (DialogFocusItem.Property.PunishStruggleOther == null) DialogFocusItem.Property.PunishStruggleOther = false; - if (DialogFocusItem.Property.PunishOrgasm == null) DialogFocusItem.Property.PunishOrgasm = false; - if (DialogFocusItem.Property.ChatMessage == null) DialogFocusItem.Property.ChatMessage = false; - if (DialogFocusItem.Property.Intensity == null) DialogFocusItem.Property.Intensity = -1; - if (DialogFocusItem.Property.PublicModeCurrent == null) DialogFocusItem.Property.PublicModeCurrent = 0; - if (DialogFocusItem.Property.PublicModePermission == null) DialogFocusItem.Property.PublicModePermission = 0; - - // Non persistent properties - //if (DialogFocusItem.Property.DeviceState == null) DialogFocusItem.Property.DeviceState = 0; - //if (DialogFocusItem.Property.DeviceStateTimer == null) DialogFocusItem.Property.DeviceStateTimer = 0; - //if (DialogFocusItem.Property.DeviceVibeMode == null) DialogFocusItem.Property.DeviceVibeMode = VibratorMode.OFF; - - // Validation - if (typeof DialogFocusItem.Property.PunishRequiredSpeechWord != "string") DialogFocusItem.Property.PunishRequiredSpeechWord = "Miss"; - if (typeof DialogFocusItem.Property.PunishProhibitedSpeechWords != "string") DialogFocusItem.Property.PunishProhibitedSpeechWords = "I,me,am,my,im"; - if (DialogFocusItem.Property.PublicModePermission >= FuturisticTrainingBeltPermissions.length || DialogFocusItem.Property.PublicModePermission < 0) DialogFocusItem.Property.PublicModePermission = 2; - if (DialogFocusItem.Property.PublicModeCurrent >= FuturisticTrainingBeltModes.length || DialogFocusItem.Property.PublicModeCurrent < 0) DialogFocusItem.Property.PublicModeCurrent = 0; - //if (DialogFocusItem.Property.DeviceState >= FuturisticTrainingBeltStates.length || DialogFocusItem.Property.DeviceState < 0) DialogFocusItem.Property.DeviceState = 0; - //if (DialogFocusItem.Property.DeviceStateTimer >= CommonTime() + 3600000) DialogFocusItem.Property.DeviceStateTimer = 0; // Prevents people from hacking in ultra-long state timers - - - const input = ElementCreateInput("PunishRequiredSpeechWord", "text", "", "70"); - if (input) input.setAttribute("placeholder", DialogFocusItem.Property.PunishRequiredSpeechWord); - const input2 = ElementCreateInput("PunishProhibitedSpeechWords", "text", "", "70"); - if (input2) input2.setAttribute("placeholder", DialogFocusItem.Property.PunishProhibitedSpeechWords); - } - - - if (FuturisticTrainingBeltSetMode < 0 || FuturisticTrainingBeltSetMode > FuturisticTrainingBeltModes.length) - FuturisticTrainingBeltSetMode = DialogFocusItem.Property.PublicModeCurrent; -} - -function InventoryItemPelvisFuturisticTrainingBeltDraw() { - const Item = DialogFocusItem; - var canViewMode = false; - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticDrawAccessDenied(); - } else if (DialogFocusItem && DialogFocusItem.Property) { - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - - if (FuturisticTrainingBeltPage == 0) { - MainCanvas.textAlign = "left"; - DrawCheckbox(1100, 450, 64, 64, DialogFindPlayer("FuturisticChastityBeltPunishChatMessage"), DialogFocusItem.Property.ChatMessage, false, "White"); - DrawCheckbox(1100, 520, 64, 64, DialogFindPlayer("FuturisticChastityBeltPunishStruggle"), DialogFocusItem.Property.PunishStruggle, false, "White"); - DrawCheckbox(1100, 590, 64, 64, DialogFindPlayer("FuturisticChastityBeltPunishStruggleOther"), DialogFocusItem.Property.PunishStruggleOther, false, "White"); - DrawCheckbox(1100, 660, 64, 64, DialogFindPlayer("FuturisticChastityBeltPunishOrgasm"), DialogFocusItem.Property.PunishOrgasm, false, "White"); - DrawCheckbox(1100, 730, 64, 64, DialogFindPlayer("FuturisticTrainingBeltPunishStandup"), DialogFocusItem.Property.PunishStandup, false, "White"); - - ElementPosition("PunishRequiredSpeechWord", 3050, 750, 400); // Hide it off the canvas - ElementPosition("PunishProhibitedSpeechWords", 3050, 900, 400); // Hide it off the canvas - } else if (FuturisticTrainingBeltPage == 1) { - - if (ElementValue("PunishRequiredSpeechWord") && ElementValue("PunishRequiredSpeechWord").length > 1) FuturisticChastityBeltConfigure = true; - if (ElementValue("PunishProhibitedSpeechWords") && ElementValue("PunishProhibitedSpeechWords").length > 1) FuturisticChastityBeltConfigure = true; - - MainCanvas.textAlign = "left"; - - - DrawText(DialogFindPlayer("FuturisticTrainingBeltPunishSpeech"), 1100, 480, "white", "gray"); - DrawText(DialogFindPlayer("FuturisticTrainingBeltPunishRequiredSpeech"), 1100, 620, "white", "gray"); - DrawText(DialogFindPlayer("FuturisticTrainingBeltPunishProhibitedSpeech"), 1100, 760, "white", "gray"); - - ElementPosition("PunishRequiredSpeechWord", 1800, 610, 245); - ElementPosition("PunishProhibitedSpeechWords", 1800, 750, 245); - - - MainCanvas.textAlign = "center"; - - DrawBackNextButton(1100, 510, 350, 64, DialogFindPlayer("FuturisticTrainingBeltPunishSpeech" + Item.Property.PunishSpeech), "White", "", - () => DialogFindPlayer("FuturisticTrainingBeltPunishSpeech" + ((Item.Property.PunishSpeech + FuturisticTrainingBeltSpeechPunishments.length - 1) % FuturisticTrainingBeltSpeechPunishments.length)), - () => DialogFindPlayer("FuturisticTrainingBeltPunishSpeech" + ((Item.Property.PunishSpeech + 1) % FuturisticTrainingBeltSpeechPunishments.length))); - - DrawBackNextButton(1100, 640, 350, 64, DialogFindPlayer("FuturisticTrainingBeltPunishRequiredSpeech" + Item.Property.PunishRequiredSpeech), "White", "", - () => DialogFindPlayer("FuturisticTrainingBeltPunishRequiredSpeech" + ((Item.Property.PunishRequiredSpeech + FuturisticTrainingBeltSpeechPunishments.length - 1) % FuturisticTrainingBeltSpeechPunishments.length)), - () => DialogFindPlayer("FuturisticTrainingBeltPunishRequiredSpeech" + ((Item.Property.PunishRequiredSpeech + 1) % FuturisticTrainingBeltSpeechPunishments.length))); - - DrawBackNextButton(1100, 780, 350, 64, DialogFindPlayer("FuturisticTrainingBeltPunishProhibitedSpeech" + Item.Property.PunishProhibitedSpeech), "White", "", - () => DialogFindPlayer("FuturisticTrainingBeltPunishProhibitedSpeech" + ((Item.Property.PunishProhibitedSpeech + FuturisticTrainingBeltSpeechPunishments.length - 1) % FuturisticTrainingBeltSpeechPunishments.length)), - () => DialogFindPlayer("FuturisticTrainingBeltPunishProhibitedSpeech" + ((Item.Property.PunishProhibitedSpeech + 1) % FuturisticTrainingBeltSpeechPunishments.length))); - - } - - MainCanvas.textAlign = "left"; - - DrawText(DialogFindPlayer("FuturisticTrainingBeltPermissions"), 1100, 875, "white", "gray"); - - MainCanvas.textAlign = "center"; - - DrawBackNextButton(1550, 840, 350, 64, DialogFindPlayer("FuturisticTrainingBeltPermissions" + Item.Property.PublicModePermission), "White", "", - () => DialogFindPlayer("FuturisticTrainingBeltPermissions" + ((Item.Property.PublicModePermission + FuturisticTrainingBeltPermissions.length - 1) % FuturisticTrainingBeltPermissions.length)), - () => DialogFindPlayer("FuturisticTrainingBeltPermissions" + ((Item.Property.PublicModePermission + 1) % FuturisticTrainingBeltPermissions.length))); - - // Draw the back/next button - const currPage = FuturisticTrainingBeltPage + 1; - const totalPages = FuturisticTrainingBeltMaxPage + 1; - DrawBackNextButton(1675, 240, 300, 90, DialogFindPlayer("Page") + " " + currPage.toString() + " / " + totalPages.toString(), "White", "", () => "", () => ""); - - canViewMode = true; - } - - - MainCanvas.textAlign = "left"; - DrawText(DialogFindPlayer("FuturisticTrainingBeltMode"), 1100, 945, "white", "gray"); - - MainCanvas.textAlign = "center"; - if (Item.Property.PublicModePermission == 0 || (Item.Property.PublicModePermission == 1)) canViewMode = true; - DrawBackNextButton(1550, 910, 350, 64, DialogFindPlayer("FuturisticTrainingBeltMode" + FuturisticTrainingBeltSetMode), !canViewMode ? "Gray" : "White", "", - () => !canViewMode ? "" : DialogFindPlayer("FuturisticTrainingBeltMode" + ((FuturisticTrainingBeltSetMode + FuturisticTrainingBeltModes.length - 1) % FuturisticTrainingBeltModes.length)), - () => !canViewMode ? "" : DialogFindPlayer("FuturisticTrainingBeltMode" + ((FuturisticTrainingBeltSetMode + 1) % FuturisticTrainingBeltModes.length))); - - if (!FuturisticChastityBeltConfigure) { - FuturisticTrainingBeltSetMode = DialogFocusItem.Property.PublicModeCurrent; - } - - -} - -function InventoryItemPelvisFuturisticTrainingBeltClick() { - const Item = DialogFocusItem; - var canViewMode = false; - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - if (MouseIn(1885, 25, 90, 90)) InventoryItemPelvisFuturisticTrainingBeltExit(); - else InventoryItemFuturisticClickAccessDenied(); - } else { - if (MouseIn(1885, 25, 90, 90)) InventoryItemPelvisFuturisticTrainingBeltExit(); - - if (FuturisticTrainingBeltPage == 0) { - if (MouseIn(1100, 450, 64, 64)) { - DialogFocusItem.Property.ChatMessage = !DialogFocusItem.Property.ChatMessage; - FuturisticChastityBeltConfigure = true; - } else if (MouseIn(1100, 520, 64, 64)) { - DialogFocusItem.Property.PunishStruggle = !DialogFocusItem.Property.PunishStruggle; - FuturisticChastityBeltConfigure = true; - } else if (MouseIn(1100, 590, 64, 64)) { - DialogFocusItem.Property.PunishStruggleOther = !DialogFocusItem.Property.PunishStruggleOther; - FuturisticChastityBeltConfigure = true; - } else if (MouseIn(1100, 660, 64, 64)) { - DialogFocusItem.Property.PunishOrgasm = !DialogFocusItem.Property.PunishOrgasm; - FuturisticChastityBeltConfigure = true; - } else if (MouseIn(1100, 730, 64, 64)) { - DialogFocusItem.Property.PunishStandup = !DialogFocusItem.Property.PunishStandup; - FuturisticChastityBeltConfigure = true; - } - } else if (FuturisticTrainingBeltPage == 1) { - if (MouseIn(1100, 510, 350, 64)) { - if (MouseX <= 1275) Item.Property.PunishSpeech = (FuturisticTrainingBeltSpeechPunishments.length + Item.Property.PunishSpeech - 1) % FuturisticTrainingBeltSpeechPunishments.length; - else Item.Property.PunishSpeech = (Item.Property.PunishSpeech + 1) % FuturisticTrainingBeltSpeechPunishments.length; - FuturisticChastityBeltConfigure = true; - } else if (MouseIn(1100, 640, 350, 64)) { - if (MouseX <= 1275) Item.Property.PunishRequiredSpeech = (FuturisticTrainingBeltSpeechPunishments.length + Item.Property.PunishRequiredSpeech - 1) % FuturisticTrainingBeltSpeechPunishments.length; - else Item.Property.PunishRequiredSpeech = (Item.Property.PunishRequiredSpeech + 1) % FuturisticTrainingBeltSpeechPunishments.length; - FuturisticChastityBeltConfigure = true; - } else if (MouseIn(1100, 780, 350, 64)) { - if (MouseX <= 1275) Item.Property.PunishProhibitedSpeech = (FuturisticTrainingBeltSpeechPunishments.length + Item.Property.PunishProhibitedSpeech - 1) % FuturisticTrainingBeltSpeechPunishments.length; - else Item.Property.PunishProhibitedSpeech = (Item.Property.PunishProhibitedSpeech + 1) % FuturisticTrainingBeltSpeechPunishments.length; - FuturisticChastityBeltConfigure = true; - } - } - - // Pagination buttons - if (MouseIn(1675, 240, 150, 90) && FuturisticTrainingBeltPage > 0) { - FuturisticTrainingBeltPage = FuturisticTrainingBeltPage - 1; - } - else if (MouseIn(1825, 240, 150, 90) && FuturisticTrainingBeltPage < FuturisticTrainingBeltMaxPage) { - FuturisticTrainingBeltPage = FuturisticTrainingBeltPage + 1; - } - - if (MouseIn(1550, 840, 350, 64)) { - if (MouseX <= 1725) Item.Property.PublicModePermission = (FuturisticTrainingBeltPermissions.length + Item.Property.PublicModePermission - 1) % FuturisticTrainingBeltPermissions.length; - else Item.Property.PublicModePermission = (Item.Property.PublicModePermission + 1) % FuturisticTrainingBeltPermissions.length; - FuturisticChastityBeltConfigure = true; - } - - canViewMode = true; - } - - - if (canViewMode || Item.Property.PublicModePermission == 0 || (Item.Property.PublicModePermission == 1)) { - if (MouseIn(1550, 910, 350, 64)) { - if (MouseX <= 1725) FuturisticTrainingBeltSetMode = (FuturisticTrainingBeltModes.length + FuturisticTrainingBeltSetMode - 1) % FuturisticTrainingBeltModes.length; - else FuturisticTrainingBeltSetMode = (FuturisticTrainingBeltSetMode + 1) % FuturisticTrainingBeltModes.length; - FuturisticChastityBeltConfigure = true; - } - } -} - -function InventoryItemPelvisFuturisticTrainingBeltExit() { - if (FuturisticChastityBeltConfigure) { - FuturisticChastityBeltConfigure = false; - DialogFocusItem.Property.PublicModeCurrent = FuturisticTrainingBeltSetMode; - FuturisticTrainingBeltSetMode = -1; // Reset for future - FuturisticTrainingBeltPage = 0; // Reset for future - - if (ElementValue("PunishRequiredSpeechWord") && ElementValue("PunishRequiredSpeechWord").length > 0) { - DialogFocusItem.Property.PunishRequiredSpeechWord = ElementValue("PunishRequiredSpeechWord").split(',').map(_ => _.replace(/[\p{P}~+=^$|\\<>`\s]+/ugm, "")).join(','); - } - - if (ElementValue("PunishProhibitedSpeechWords") && ElementValue("PunishProhibitedSpeechWords").length > 0) { - DialogFocusItem.Property.PunishProhibitedSpeechWords = ElementValue("PunishProhibitedSpeechWords").split(',').map(_ => _.replace(/[\p{P}~+=^$|\\<>`\s]+/ugm, "")).join(','); - } - - InventoryItemPelvisFuturisticTrainingBeltPublishGeneric(CurrentCharacter, "FuturisticTrainingBeltSetGeneric"); - } - - InventoryItemFuturisticExitAccessDenied(); - - ElementRemove("PunishRequiredSpeechWord"); - ElementRemove("PunishProhibitedSpeechWords"); -} - -function InventoryItemPelvisFuturisticTrainingBeltPublishAction(C, Option) { - if (FuturisticChastityBeltSwitchModel) { - FuturisticChastityBeltSwitchModel = false; - return; - } - var msg = "FuturisticChastityBeltSet" + Option.Name; - InventoryItemPelvisFuturisticTrainingBeltPublishGeneric(C, msg); -} - -function InventoryItemPelvisFuturisticTrainingBeltPublishMode(C, Setting, Active) { - var msg = "FuturisticChastityBeltSet" + Setting + ((Active) ? "On" : "Off"); - InventoryItemPelvisFuturisticTrainingBeltPublishGeneric(C, msg); -} - -function InventoryItemPelvisFuturisticTrainingBeltPublishGeneric(C, msg) { - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - ChatRoomPublishCustomAction(msg, false, Dictionary); -} - -function InventoryItemPelvisFuturisticTrainingBeltValidate(C, Item) { - return InventoryItemFuturisticValidate(C, Item); // All futuristic items refer to the gag -} - -function InventoryItemPelvisFuturisticTrainingBeltNpcDialog(C, Option) { - InventoryItemPelvisMetalChastityBeltNpcDialog(C, Option); -} - -function InventoryItemPelvisFuturisticTrainingBeltGetVibeMode(C, State, First) { - const ArousalActive = C.ArousalSettings && C.ArousalSettings.Progress && ["Manual", "Hybrid", "Automatic"].includes(C.ArousalSettings.Active); - if (State.includes("Edge")) { - if (First || (ArousalActive &&(C.ArousalSettings.Progress < 60 || C.ArousalSettings.Progress > 90)) || (CommonTime() % FuturisticTrainingBeltRandomEdgeCycle > FuturisticTrainingBeltRandomEdgeCycle / 5)) { - if ((ArousalActive && C.ArousalSettings.Progress > 90)) - return VibratorMode.MAXIMUM; - else return VibratorMode.HIGH; - } else - return VibratorMode.LOW; - } - if (State.includes("Tease")) { - if (Math.random() < FuturisticTrainingBeltRandomTeaseMaxChance) return VibratorMode.MAXIMUM; - if (ArousalActive) { - if (C.ArousalSettings.Progress < 35) return VibratorMode.HIGH; - if (C.ArousalSettings.Progress < 70) return VibratorMode.MEDIUM; - } - return VibratorMode.LOW; - } - if (State.includes("Max")) return VibratorMode.MAXIMUM; - if (State.includes("Medium")) return VibratorMode.MEDIUM; - if (State.includes("Low")) return VibratorMode.LOW; - return VibratorMode.OFF; -} - -// This function sets the vibration mode, similar to the extended vibrators -function InventoryItemPelvisFuturisticTrainingBeltUpdateVibeMode(C, PersistentData, Item, Force) { - var OldIntensity = Item.Property.Intensity; - var State = (Item.Property && PersistentData.DeviceState) ? FuturisticTrainingBeltStates[PersistentData.DeviceState] : "None"; - var VibeMode = InventoryItemPelvisFuturisticTrainingBeltGetVibeMode(C, State, OldIntensity < 0); - - if (Force || PersistentData.DeviceVibeMode != VibeMode || (OldIntensity > -1 && VibeMode == "Off")) { - PersistentData.DeviceVibeMode = VibeMode; - - var Option = VibratorModeGetOption(VibeMode); - VibratorModeSetProperty(Item, Option.Property); - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, Item.Asset.Group.Name); - - if (CurrentScreen == "ChatRoom") { - var Message; - /** @type {ChatMessageDictionary} */ - var Dictionary = [ - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "AssetName", AssetName: Item.Asset.Name }, - ]; - - Dictionary.push({ Automatic: true }); - - Message = "FuturisticTrainingBeltSetState" + FuturisticTrainingBeltStates[PersistentData.DeviceState] + VibeMode; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(C), MemberNumber: Player.MemberNumber }); - // This is meant to cut down on spam for other players - if (FuturisticTrainingBeltStates[PersistentData.DeviceState].includes("Edge") && (OldIntensity >= 0 && OldIntensity < 3)) - ChatRoomMessage({ Content: Message+"Self", Type: "Action", Sender: Player.MemberNumber, Dictionary: Dictionary }); - else { - if (Item.Property && Item.Property.ChatMessage) { - ServerSend("ChatRoomChat", { Content: Message, Type: "Action", Dictionary }); - } else { - ChatRoomMessage({ Content: Message, Type: "Action", Sender: Player.MemberNumber, Dictionary: Dictionary }); - } - } - - } - if (Item.Property.Intensity > OldIntensity) { - if (Item.Property.Intensity >= 3) - CharacterSetFacialExpression(C, "Blush", "Extreme", 5); - else if (Item.Property.Intensity > 1) - CharacterSetFacialExpression(C, "Blush", "VeryHigh", 5); - else - CharacterSetFacialExpression(C, "Blush", "Medium", 5); - } - } -} - -function InventoryFuturisticTrainingBeltCheckPunishSpeech(Item, LastTime) { - if (!Item) return ""; - if (!Item.Property) return ""; - // Search from latest message backwards, allowing early exit - for (let CH = ChatRoomChatLog.length - 1; CH >= 0; CH--) { - - // Messages are in order, no need to keep looping - if (ChatRoomChatLog[CH].Time <= LastTime) break; - - // If the message is OOC, just return immediately - if (ChatRoomChatLog[CH].Original.indexOf('(') == 0) return ""; - - if (ChatRoomChatLog[CH].SenderMemberNumber == Player.MemberNumber) { - let msg = ChatRoomChatLog[CH].Original.toUpperCase().replace(/[\p{P}~+=^$|\\<>`]+/ugm, " "); - let msgTruncated = ChatRoomChatLog[CH].Original.toUpperCase().replace(/[\p{P}~+=^$|\\<>`\s]+/ugm, ""); - - if (Item.Property.PunishSpeech > 0 && msgTruncated.length > FuturisticTrainingBeltSpeechCharacterLimit) return "Speech"; - - - if (Item.Property.PunishRequiredSpeech > 0 && Item.Property.PunishRequiredSpeechWord && msg.length > 0) { - let gagLevel = SpeechGetTotalGagLevel(Player); - let words = Item.Property.PunishRequiredSpeechWord.split(","); - if (gagLevel < 8) { - let pass = false; - for (let W = 0; W < words.length; W++) { - let checkWord = words[W].replace(/[\p{P} ~+=^$|\\<>`]+/ugm, "").toUpperCase(); - if (msgTruncated.includes(checkWord)) {pass = true; break;} - } - if (!pass) return "RequiredSpeech"; - } - } - - if (Item.Property.PunishProhibitedSpeech > 0 && Item.Property.PunishProhibitedSpeechWords && msg.length > 0) { - let gagLevel = SpeechGetTotalGagLevel(Player); - let words = Item.Property.PunishProhibitedSpeechWords.split(","); - - const nonLatinCharRegex = new RegExp('^([^\\x20-\\x7F]|\\\\.\\*)+$'); - let triggerRegex; - - if (gagLevel < 8) { - for (let W = 0; W < words.length; W++) { - let checkWord = words[W].replace(/[\p{P} ~+=^$|\\<>`]+/ugm, "").toUpperCase(); - - if (nonLatinCharRegex.test(checkWord)) { - triggerRegex = new RegExp(checkWord); - } else { - triggerRegex = new RegExp(`\\b${checkWord}\\b`); - } - - const success = triggerRegex.test(msg); - - if (success) return { name: "ProhibitedSpeech", word: checkWord }; - } - } - } - } - } -} - -function AssetsItemPelvisFuturisticTrainingBeltScriptUpdatePlayer(data, LastTime) { - let Item = data.Item; - let C = data.C; - let PersistentData = data.PersistentData(); - - if (Item.Property) { - let punishment = InventoryFuturisticChastityBeltCheckPunish(Item); - if (punishment != "") { - if (punishment == "Orgasm") { - if (Item.Property.PunishOrgasm && C.ArousalSettings && C.ArousalSettings.OrgasmStage > 1) { - AssetsItemPelvisFuturisticChastityBeltScriptTrigger(C, Item, "Orgasm"); - Item.Property.NextShockTime = CurrentTime + FuturisticChastityBeltShockCooldownOrgasm; // Difficult to have two orgasms in 10 seconds - } - } else if (punishment == "StruggleOther") { - AssetsItemPelvisFuturisticChastityBeltScriptTrigger(C, Item, "StruggleOther"); - StruggleProgressStruggleCount = 0; - StruggleProgress = 0; - DialogLeaveDueToItem = true; - } else if (punishment == "Struggle") { - AssetsItemPelvisFuturisticChastityBeltScriptTrigger(C, Item, "Struggle"); - StruggleProgressStruggleCount = 0; - DialogLeaveDueToItem = true; - } - } else if (Item.Property.PunishStandup && FuturisticTrainingBeltStandUpFlag) { - AssetsItemPelvisFuturisticChastityBeltScriptTrigger(C, Item, "Standup"); - CharacterSetActivePose(Player, "Kneel"); - ServerSend("ChatRoomCharacterPoseUpdate", { Pose: Player.ActivePose }); - } else { - // @ts-ignore - punishment = InventoryFuturisticTrainingBeltCheckPunishSpeech(Item, LastTime); - let Property = Item.Property; - if (punishment == "Speech") { - let NoShock = true; - if (Item.Property.PunishSpeech == FuturisticTrainingBeltSpeechPunishments.indexOf("Shock")) NoShock = false; - else if (Item.Property.PunishSpeech == FuturisticTrainingBeltSpeechPunishments.indexOf("Edge")) { - if (!FuturisticTrainingBeltStates[PersistentData.DeviceState].includes("HighPriority")) { - PersistentData.DeviceState = FuturisticTrainingBeltStates.indexOf("HighPriorityEdge"); - PersistentData.DeviceStateTimer = CommonTime() + FuturisticTrainingBeltPunishmentEdgeDuration; - } else PersistentData.DeviceStateTimer = CommonTime() + FuturisticTrainingBeltPunishmentVibeDuration; - InventoryItemPelvisFuturisticTrainingBeltUpdateVibeMode(C, PersistentData, Item); - } else if (Item.Property.PunishSpeech == FuturisticTrainingBeltSpeechPunishments.indexOf("Vibe")) { - if (!FuturisticTrainingBeltStates[PersistentData.DeviceState].includes("HighPriority")) - PersistentData.DeviceState = FuturisticTrainingBeltStates.indexOf("HighPriorityMax"); - PersistentData.DeviceStateTimer = Math.max(PersistentData.DeviceStateTimer, CommonTime() + FuturisticTrainingBeltPunishmentVibeDuration); - InventoryItemPelvisFuturisticTrainingBeltUpdateVibeMode(C, PersistentData, Item); - } - - AssetsItemPelvisFuturisticChastityBeltScriptTrigger(C, Item, "Speech", "", NoShock); - } else if (punishment == "RequiredSpeech") { - let NoShock = true; - if (Item.Property.PunishRequiredSpeech == FuturisticTrainingBeltSpeechPunishments.indexOf("Shock")) NoShock = false; - else if (Item.Property.PunishRequiredSpeech == FuturisticTrainingBeltSpeechPunishments.indexOf("Edge")) { - if (!FuturisticTrainingBeltStates[PersistentData.DeviceState].includes("HighPriority")) { - PersistentData.DeviceState = FuturisticTrainingBeltStates.indexOf("HighPriorityEdge"); - PersistentData.DeviceStateTimer = CommonTime() + FuturisticTrainingBeltPunishmentEdgeDuration; - } else PersistentData.DeviceStateTimer = CommonTime() + FuturisticTrainingBeltPunishmentVibeDuration; - InventoryItemPelvisFuturisticTrainingBeltUpdateVibeMode(C, PersistentData, Item); - } else if (Item.Property.PunishRequiredSpeech == FuturisticTrainingBeltSpeechPunishments.indexOf("Vibe")) { - if (!FuturisticTrainingBeltStates[PersistentData.DeviceState].includes("HighPriority")) - PersistentData.DeviceState = FuturisticTrainingBeltStates.indexOf("HighPriorityMax"); - PersistentData.DeviceStateTimer = Math.max(PersistentData.DeviceStateTimer, CommonTime() + FuturisticTrainingBeltPunishmentVibeDuration); - InventoryItemPelvisFuturisticTrainingBeltUpdateVibeMode(C, PersistentData, Item); - } - - AssetsItemPelvisFuturisticChastityBeltScriptTrigger(C, Item, "RequiredSpeech", Item.Property.PunishRequiredSpeechWord.replace(/[^a-z0-9,]/gmi, " ").replace(/\s+/g, '').replace(/,/g, "/"), NoShock); - // @ts-ignore - } else if (punishment && punishment.name == "ProhibitedSpeech" && punishment.word) { - let NoShock = true; - if (Item.Property.PunishProhibitedSpeech == FuturisticTrainingBeltSpeechPunishments.indexOf("Shock")) NoShock = false; - else if (Item.Property.PunishProhibitedSpeech == FuturisticTrainingBeltSpeechPunishments.indexOf("Edge")) { - if (!FuturisticTrainingBeltStates[PersistentData.DeviceState].includes("HighPriority")) { - PersistentData.DeviceState = FuturisticTrainingBeltStates.indexOf("HighPriorityEdge"); - PersistentData.DeviceStateTimer = CommonTime() + FuturisticTrainingBeltPunishmentEdgeDuration; - } else PersistentData.DeviceStateTimer = CommonTime() + FuturisticTrainingBeltPunishmentVibeDuration; - InventoryItemPelvisFuturisticTrainingBeltUpdateVibeMode(C, PersistentData, Item); - } else if (Item.Property.PunishProhibitedSpeech == FuturisticTrainingBeltSpeechPunishments.indexOf("Vibe")) { - if (!FuturisticTrainingBeltStates[PersistentData.DeviceState].includes("HighPriority")) - PersistentData.DeviceState = FuturisticTrainingBeltStates.indexOf("HighPriorityMax"); - PersistentData.DeviceStateTimer = Math.max(PersistentData.DeviceStateTimer, CommonTime() + FuturisticTrainingBeltPunishmentVibeDuration); - InventoryItemPelvisFuturisticTrainingBeltUpdateVibeMode(C, PersistentData, Item); - } - - AssetsItemPelvisFuturisticChastityBeltScriptTrigger(C, Item, "ProhibitedSpeech", punishment.word, NoShock); - } - } - } - - FuturisticTrainingBeltStandUpFlag = false; -} - -function AssetsItemPelvisFuturisticTrainingBeltScriptStateMachine(data) { - - // GGTS level 4 or more can short-cut the state machine - if ((CurrentModule == "Online") && (CurrentScreen == "ChatRoom") && (ChatRoomGame == "GGTS") && (ChatRoomSpace === "Asylum") && (AsylumGGTSGetLevel(Player) >= 4)) return; - - // We have a state machine - var update = false; - var Item = data.Item; - var C = data.C; - let PersistentData = data.PersistentData(); - - var ArousalActive = C.ArousalSettings && C.ArousalSettings.Progress && ["Manual", "Hybrid", "Automatic"].includes(C.ArousalSettings.Active); - var Property = Item ? Item.Property : null; - if (!Property) return; - - // Get the state - var State = FuturisticTrainingBeltStates[PersistentData.DeviceState ? PersistentData.DeviceState : FuturisticTrainingBeltStates.indexOf("None")]; - var Mode = FuturisticTrainingBeltModes[Property.PublicModeCurrent ? Property.PublicModeCurrent : 0]; - var StateTimerReady = !(PersistentData.DeviceStateTimer > 0); // Are we ready to start a new event? - var StateTimerOver = CommonTime() > PersistentData.DeviceStateTimer; // End the current event - - - - // Basics of the state machine - // In high priority, the state must time out before anything special happens. - - if (State.includes("HighPriority")) {// High priority timer - if (StateTimerOver) { - PersistentData.DeviceState = FuturisticTrainingBeltStates.indexOf("None"); - update = true; - } - } else if (State.includes("LowPriority") || State == "None") {// Check low priority states - var DeviceSetToState = -1; - var DeviceTimer = 0; - if (State != "None" && Mode == "None") { // If the mode is None then we turn off if we are LowPriority regardless of what - PersistentData.DeviceState = FuturisticTrainingBeltStates.indexOf("None"); // None - update = true; - } else if (Mode == "EdgeAndDeny") { - if (State != "Cooldown") - DeviceSetToState = FuturisticTrainingBeltStates.indexOf("LowPriorityEdge"); - if (ArousalActive && C.ArousalSettings.Progress > 90) { - if (Math.random() < FuturisticTrainingBeltRandomDenyChance) { - DeviceSetToState = FuturisticTrainingBeltStates.indexOf("Cooldown"); - PersistentData.DeviceStateTimer = CommonTime() + FuturisticTrainingBeltRandomDenyDuration; - update = true; - } - } - - } else if (Mode == "RandomTeasing") { - if (State != "LowPriorityTease") - DeviceSetToState = 0; - if (State == "None") { - if (Math.random() < FuturisticTrainingBeltRandomTeaseChance) { - const r = Math.random(); - DeviceSetToState = FuturisticTrainingBeltStates.indexOf("LowPriorityTease"); - DeviceTimer = FuturisticTrainingBeltRandomTeaseDurationMin + (FuturisticTrainingBeltRandomTeaseDurationMax - FuturisticTrainingBeltRandomTeaseDurationMin) * r * r * r; - } - } else { - DeviceTimer = 1; - if (StateTimerOver) DeviceSetToState = 0; - } - } else if (Mode == "RandomOrgasm") { - if (State != "LowPriorityMax") - DeviceSetToState = 0; - - if (State == "None") { - if (Math.random() < FuturisticTrainingBeltRandomOrgasmChance) { - const r = Math.random(); - DeviceSetToState = FuturisticTrainingBeltStates.indexOf("LowPriorityMax"); - DeviceTimer = FuturisticTrainingBeltRandomOrgasmDurationMin + (FuturisticTrainingBeltRandomOrgasmDurationMax - FuturisticTrainingBeltRandomOrgasmDurationMin) * r * r * r; - } else DeviceSetToState = -1; - } else { - DeviceTimer = 1; - if (StateTimerOver) DeviceSetToState = 0; - } - } else if (Mode == "FullPower") { - DeviceSetToState = FuturisticTrainingBeltStates.indexOf("LowPriorityMax"); - } else if (Mode == "Tease") { - DeviceSetToState = FuturisticTrainingBeltStates.indexOf("LowPriorityLow"); - } else if (Mode == "Excite") { - DeviceSetToState = FuturisticTrainingBeltStates.indexOf("LowPriorityMedium"); - } - if (DeviceSetToState > -1) { - if (DeviceSetToState != PersistentData.DeviceState) { - PersistentData.DeviceState = DeviceSetToState; // Low priority edge - PersistentData.DeviceStateTimer = CommonTime() + DeviceTimer; - update = true; - } else if (StateTimerOver && DeviceTimer != 0) { - PersistentData.DeviceState = FuturisticTrainingBeltStates.indexOf("Cooldown"); - PersistentData.DeviceStateTimer = CommonTime(); - update = true; - } - - StateTimerReady = false; - } - } else if (State == "Cooldown" && StateTimerReady) PersistentData.DeviceState = FuturisticTrainingBeltStates.indexOf("None"); // Return to None state - - if (State == "None" && Property.Intensity >= 0) update = true; - // In the cooldown state we decide when to get ready for another round of good vibrations - if (State == "Cooldown") { - var Cooldown = 0; - if (!State.includes("HighPriority")) { - if (Mode == "RandomTeasing") { - Cooldown = FuturisticTrainingBeltRandomTeaseDurationCooldown; - } else if (Mode == "RandomOrgasm") { - Cooldown = FuturisticTrainingBeltRandomOrgasmDurationCooldown; - } else if (Mode == "EdgeAndDeny") { - Cooldown = FuturisticTrainingBeltRandomDenyDuration; - } - } - if (CommonTime() > PersistentData.DeviceStateTimer + Cooldown) { - StateTimerReady = true; - } else StateTimerReady = false; - } - - // Reset state timers - if (Mode == "None" && !State.includes("HighPriority")) { - StateTimerOver = true; - StateTimerReady = true; - } - if (StateTimerReady) - PersistentData.DeviceStateTimer = 0; - - if (update || State.includes("Edge")) InventoryItemPelvisFuturisticTrainingBeltUpdateVibeMode(C, PersistentData, Item); - - let EdgeMode = State.includes("Edge") || Mode == "EdgeAndDeny" || Mode == "RandomTeasing"; - - - if (EdgeMode) { - if (Item.Property.Effect && !Item.Property.Effect.includes("DenialMode")) { - Item.Property.Effect.push("DenialMode"); - } - if (Item.Property.Effect && !Item.Property.Effect.includes("RuinOrgasms")) { - Item.Property.Effect.push("RuinOrgasms"); - } - } else { - if (Item.Property.Effect && Item.Property.Effect.includes("DenialMode")) { - for (let E = 0; E < Item.Property.Effect.length; E++) { - let Effect = Item.Property.Effect[E]; - if (Effect == "DenialMode") { - Item.Property.Effect.splice(E, 1); - E--; - } - } - } - if (Item.Property.Effect && Item.Property.Effect.includes("RuinOrgasms")) { - for (let E = 0; E < Item.Property.Effect.length; E++) { - let Effect = Item.Property.Effect[E]; - if (Effect == "RuinOrgasms") { - Item.Property.Effect.splice(E, 1); - E--; - } - } - } - } - - - - if (ArousalActive) { - if (EdgeMode && C.ArousalSettings.Progress > 96 && !((ActivityOrgasmGameTimer != null) && (ActivityOrgasmGameTimer > 0) && (CurrentTime < C.ArousalSettings.OrgasmTimer))) { // Manually trigger orgasm at this stage - DialogLeave(); - ActivityOrgasmPrepare(C, true); - // Continuous edging~ - if (Mode == "EdgeAndDeny") - C.ArousalSettings.Progress = 80; - } - } -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemPelvisFuturisticTrainingBeltScriptDraw(data) { - var persistentData = data.PersistentData(); - /** @type {ItemProperties} */ - var property = (data.Item.Property = data.Item.Property || {}); - if (typeof persistentData.UpdateTime !== "number") persistentData.UpdateTime = CommonTime() + 4000; - if (typeof persistentData.LastMessageLen !== "number") persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - if (typeof persistentData.CheckTime !== "number") persistentData.CheckTime = 0; - - - // Non persistent properties - if (typeof persistentData.DeviceState !== "number") persistentData.DeviceState = 0; - if (typeof persistentData.DeviceStateTimer !== "number") persistentData.DeviceStateTimer = 0; - if (typeof persistentData.DeviceVibeMode !== "string") persistentData.DeviceVibeMode = VibratorMode.OFF; - - // Trigger a check if a new message is detected - let lastMsgIndex = ChatRoomChatLog.length - 1; - if (lastMsgIndex >= 0 && ChatRoomChatLog[lastMsgIndex].Time > persistentData.CheckTime) - persistentData.UpdateTime = Math.min(persistentData.UpdateTime, CommonTime() + 200); // Trigger if the user speaks - - if (persistentData.UpdateTime < CommonTime() && data.C == Player) { - - if (CommonTime() > property.NextShockTime) { - AssetsItemPelvisFuturisticTrainingBeltScriptUpdatePlayer(data, persistentData.CheckTime); - AssetsItemPelvisFuturisticTrainingBeltScriptStateMachine(data); - persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - } - - var timeToNextRefresh = 950; - persistentData.UpdateTime = CommonTime() + timeToNextRefresh; - AnimationRequestRefreshRate(data.C, 5000 - timeToNextRefresh); - AnimationRequestDraw(data.C); - - // Set CheckTime to last processed chat message time - persistentData.CheckTime = (lastMsgIndex >= 0 ? ChatRoomChatLog[lastMsgIndex].Time : 0); - } -} diff --git a/Screens/Inventory/ItemPelvis/HempRope/Crotch.png b/Screens/Inventory/ItemPelvis/HempRope/Crotch.png deleted file mode 100644 index d80451912..000000000 Binary files a/Screens/Inventory/ItemPelvis/HempRope/Crotch.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/HempRope/KikkouHip.png b/Screens/Inventory/ItemPelvis/HempRope/KikkouHip.png deleted file mode 100644 index 7f31b0be9..000000000 Binary files a/Screens/Inventory/ItemPelvis/HempRope/KikkouHip.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/HempRope/OverPanties.png b/Screens/Inventory/ItemPelvis/HempRope/OverPanties.png deleted file mode 100644 index 8890fb2df..000000000 Binary files a/Screens/Inventory/ItemPelvis/HempRope/OverPanties.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/HempRope/SwissSeat.png b/Screens/Inventory/ItemPelvis/HempRope/SwissSeat.png deleted file mode 100644 index 03c9b239e..000000000 Binary files a/Screens/Inventory/ItemPelvis/HempRope/SwissSeat.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/LoveChastityBelt/LoveChastityBelt.js b/Screens/Inventory/ItemPelvis/LoveChastityBelt/LoveChastityBelt.js deleted file mode 100644 index 82d2c2a93..000000000 --- a/Screens/Inventory/ItemPelvis/LoveChastityBelt/LoveChastityBelt.js +++ /dev/null @@ -1,232 +0,0 @@ -"use strict"; - -var InventoryItemPelvisLoveChastityBeltLastAction = ""; - -// Loads the item extension properties -function InventoryItemPelvisLoveChastityBeltLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Type: "Open", Intensity: -1, ShowText: true, LockButt: false }; - if (DialogFocusItem.Property.Type == null) DialogFocusItem.Property.Type = "Open"; - if (DialogFocusItem.Property.Intensity == null) DialogFocusItem.Property.Intensity = -1; - if (DialogFocusItem.Property.ShowText == null) DialogFocusItem.Property.ShowText = true; - if (DialogFocusItem.Property.LockButt == null) DialogFocusItem.Property.LockButt = false; - InventoryItemPelvisLoveChastityBeltLoadType(); -} - -// Draw the item extension screen -function InventoryItemPelvisLoveChastityBeltDraw() { - const Vibrating = DialogFocusItem.Property.Intensity >= 0 && DialogFocusItem.Property.Type === "Vibe"; - DrawAssetPreview(1387, 225, DialogFocusItem.Asset, {Vibrating}); - if ((DialogFocusItem.Property.Type == "Shock") || (DialogFocusItem.Property.Type == "Vibe")) - DrawText(DialogFindPlayer("Intensity" + DialogFocusItem.Property.Intensity.toString()).replace("Item", DialogFocusItem.Asset.Description), 1500, 550, "White", "Gray"); - - if (CharacterGetCurrent().IsOwnedByPlayer()) { - - if ((DialogFocusItem.Property.Type == "Vibe") && (DialogFocusItem.Property.Intensity > -1)) DrawButton(1200, 600, 250, 65, DialogFindPlayer("TurnOff"), "White"); - if (DialogFocusItem.Property.Type == "Shock") { - DrawButton(1200, 600, 250, 65, DialogFindPlayer("TriggerShock"), "White"); - DrawButton(1200, 900, 64, 64, "", "White", DialogFocusItem.Property.ShowText ? "Icons/Checked.png" : ""); - DrawText(DialogFindPlayer("ShockCollarShowChat"), 1445, 933, "White", "Gray"); - } - if (InventoryItemPelvisLoveChastityBeltIntensityCanDecrease()) DrawButton(1200, 700, 250, 65, DialogFindPlayer("Decrease"), "White"); - if (InventoryItemPelvisLoveChastityBeltIntensityCanIncrease()) DrawButton(1550, 700, 250, 65, DialogFindPlayer("Increase"), "White"); - - DrawButton(1550, 800, 250, 65, DialogFindPlayer(DialogFocusItem.Property.LockButt ? "LoveChastityBeltUnlockButt" : "LoveChastityBeltLockButt"), "White"); - - if ((DialogFocusItem.Property.Type == "Closed") || (DialogFocusItem.Property.Type == "Vibe") || (DialogFocusItem.Property.Type == "Shock")) { - DrawButton(1200, 800, 250, 65, DialogFindPlayer("LoveChastityBeltUnlock" + DialogFocusItem.Property.Type), "White"); - } else { - DrawButton(1200, 800, 250, 65, DialogFindPlayer("LoveChastityBeltAddShield"), "White"); - if (InventoryItemPelvisLoveChastityBeltCanInsert(CharacterGetCurrent())) { - DrawButton(1200, 900, 250, 65, DialogFindPlayer("LoveChastityBeltAddVibe"), "White"); - DrawButton(1550, 900, 250, 65, DialogFindPlayer("LoveChastityBeltAddShock"), "White"); - } - } - } -} - -// Catches the item extension clicks -function InventoryItemPelvisLoveChastityBeltClick() { - if (MouseIn(1885, 25, 90, 85)) { - DialogFocusItem = null; - return; - } - - var C = CharacterGetCurrent(); - if (CurrentScreen == "ChatRoom") { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemPelvisLoveChastityBeltLoad(); - } - - if (C && DialogFocusItem && C.IsOwnedByPlayer()) { - if (MouseIn(1200, 600, 250, 65) && (DialogFocusItem.Property.Type == "Vibe") && (DialogFocusItem.Property.Intensity > -1)) { - InventoryItemPelvisLoveChastityBeltSetIntensity(-1 - DialogFocusItem.Property.Intensity); - return; - } - - if (DialogFocusItem.Property.Type == "Shock") { - if (MouseIn(1200, 600, 250, 65)) { - InventoryItemPelvisLoveChastityBeltTriggerShock(); - return; - } - if (MouseIn(1200, 900, 64, 64) && (MouseY <= 964) && (CurrentScreen == "ChatRoom")) { - DialogFocusItem.Property.ShowText = !DialogFocusItem.Property.ShowText; - return; - } - } - - if (MouseIn(1200, 700, 250, 65) && InventoryItemPelvisLoveChastityBeltIntensityCanDecrease()) { - InventoryItemPelvisLoveChastityBeltSetIntensity(-1); - return; - } - if (MouseIn(1550, 700, 250, 65) && InventoryItemPelvisLoveChastityBeltIntensityCanIncrease()) { - InventoryItemPelvisLoveChastityBeltSetIntensity(1); - return; - } - - if (MouseIn(1550, 800, 250, 65)) { - DialogFocusItem.Property.LockButt = !DialogFocusItem.Property.LockButt; - InventoryItemPelvisLoveChastityBeltUpdate(); - CharacterRefresh(C); - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - ChatRoomPublishCustomAction("LoveChastityBeltAction" + (DialogFocusItem.Property.LockButt ? "LockButt" : "UnlockButt"), true, Dictionary); - return; - } - - if ((DialogFocusItem.Property.Type == "Closed") || (DialogFocusItem.Property.Type == "Vibe") || (DialogFocusItem.Property.Type == "Shock")) { - if (MouseIn(1200, 800, 250, 65)) { - DialogFocusItem.Property.Intensity = -1; - InventoryItemPelvisLoveChastityBeltSetTypeTo("Open", "LoveChastityBeltRemoveShieldMessage"); - return; - } - } else { - if (MouseIn(1200, 800, 250, 65)) { - InventoryItemPelvisLoveChastityBeltSetTypeTo("Closed", "LoveChastityBeltAddShieldMessage"); - return; - } - if (InventoryItemPelvisLoveChastityBeltCanInsert(C)) { - if (MouseIn(1200, 900, 250, 65)) { - InventoryItemPelvisLoveChastityBeltSetTypeTo("Vibe", "LoveChastityBeltAddVibeMessage"); - return; - } - if (MouseIn(1550, 900, 250, 65)) { - InventoryItemPelvisLoveChastityBeltSetTypeTo("Shock", "LoveChastityBeltAddShockMessage"); - return; - } - } - } - } -} - -// checks if "ItemVulva" is accessible -function InventoryItemPelvisLoveChastityBeltCanInsert(C) { - for (let A = 0; A < C.Appearance.length; A++) - if ((C.Appearance[A].Asset != null) && (C.Appearance[A].Asset.Group.Family == C.AssetFamily)) { - if (C.Appearance[A].Asset.Group.Name == "ItemVulva") - return false; - if ((C.Appearance[A].Asset.Group.Name == "ItemVulvaPiercings") && (C.Appearance[A].Asset.Block != null) && C.Appearance[A].Asset.Block.includes("ItemVulva")) - return false; - } - return true; -} - -// set the type on the belt -function InventoryItemPelvisLoveChastityBeltSetTypeTo(Type, Message) { - InventoryItemPelvisLoveChastityBeltLastAction = Type; - DialogFocusItem.Property.Type = Type; - InventoryItemPelvisLoveChastityBeltUpdate(); - InventoryExpressionTrigger(CharacterGetCurrent(), DialogFocusItem); - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(CharacterGetCurrent()), MemberNumber: CharacterGetCurrent().MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - ChatRoomPublishCustomAction(Message, true, Dictionary); -} - -// updates the belt on character -function InventoryItemPelvisLoveChastityBeltUpdate() { - InventoryItemPelvisLoveChastityBeltLoadType(); - CharacterRefresh(CharacterGetCurrent()); - if (CharacterGetCurrent().ID == 0) ServerPlayerAppearanceSync(); -} - -// checks if the intensity can be increased -function InventoryItemPelvisLoveChastityBeltIntensityCanIncrease() { - if (DialogFocusItem.Property.Type == "Vibe") { - return DialogFocusItem.Property.Intensity < 3; - } else if (DialogFocusItem.Property.Type == "Shock") { - return DialogFocusItem.Property.Intensity < 2; - } else { - return false; - } -} - -// checks if the intensity can be decreased -function InventoryItemPelvisLoveChastityBeltIntensityCanDecrease() { - if (DialogFocusItem.Property.Type == "Vibe") { - return DialogFocusItem.Property.Intensity > -1; - } else if (DialogFocusItem.Property.Type == "Shock") { - return DialogFocusItem.Property.Intensity > 0; - } else { - return false; - } -} - -// triggers the shock -function InventoryItemPelvisLoveChastityBeltTriggerShock() { - InventoryItemPelvisLoveChastityBeltLastAction = "ShockTriggered"; - InventoryExpressionTrigger(CharacterGetCurrent(), DialogFocusItem); - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacterName", Text: CharacterNickname(CharacterGetCurrent()), MemberNumber: CharacterGetCurrent().MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({ ShockIntensity : DialogFocusItem.Property.Intensity * 1.5}); - - ChatRoomPublishCustomAction("LoveChastityBeltShockTrigger" + DialogFocusItem.Property.Intensity, true, Dictionary); -} - -// loads the belt into a correct state -function InventoryItemPelvisLoveChastityBeltLoadType() { - if (DialogFocusItem.Property.Type == "Open") { - DialogFocusItem.Property.Effect = null; - DialogFocusItem.Property.Block = null; - if (DialogFocusItem.Property.LockButt == true) DialogFocusItem.Property.Block = ["ItemButt"]; - } else { - DialogFocusItem.Property.Block = ["ItemVulva", "ItemVulvaPiercings"]; - if (DialogFocusItem.Property.LockButt) DialogFocusItem.Property.Block.push("ItemButt"); - DialogFocusItem.Property.Effect = ["Chaste"]; - if (DialogFocusItem.Property.Type == "Vibe") { - if (DialogFocusItem.Property.Intensity < -1) DialogFocusItem.Property.Intensity = -1; - if (DialogFocusItem.Property.Intensity > 3) DialogFocusItem.Property.Intensity = 3; - DialogFocusItem.Property.Effect.push("Egged"); - if (DialogFocusItem.Property.Intensity >= 0) DialogFocusItem.Property.Effect.push("Vibrating"); - } else if (DialogFocusItem.Property.Type == "Shock") { - if (DialogFocusItem.Property.Intensity < 0) DialogFocusItem.Property.Intensity = 0; - if (DialogFocusItem.Property.Intensity > 2) DialogFocusItem.Property.Intensity = 2; - } - } -} - -// set intensity for vibe or shock device -function InventoryItemPelvisLoveChastityBeltSetIntensity(Modifier) { - var C = CharacterGetCurrent(); - DialogFocusItem.Property.Intensity = DialogFocusItem.Property.Intensity + Modifier; - var Type = DialogFocusItem.Property.Type; - if (DialogFocusItem.Property.Type == "Vibe") { - if (DialogFocusItem.Property.Intensity == -1) DialogFocusItem.Property.Effect = ["Egged"]; - if (DialogFocusItem.Property.Intensity == 0) DialogFocusItem.Property.Effect = ["Egged", "Vibrating"]; - if (DialogFocusItem.Property.Intensity == 1) DialogFocusItem.Property.Effect = ["Egged", "Vibrating"]; - if (DialogFocusItem.Property.Intensity == 2) DialogFocusItem.Property.Effect = ["Egged", "Vibrating"]; - if (DialogFocusItem.Property.Intensity == 3) DialogFocusItem.Property.Effect = ["Egged", "Vibrating"]; - CharacterLoadEffect(C); - if (C.ID == 0) ServerPlayerAppearanceSync(); - } - CharacterRefresh(C); - if (Type == "Vibe") { - ChatRoomPublishCustomAction("LoveChastityBeltVibe" + ((Modifier > 0) ? "Increase" : "Decrease") + "To" + DialogFocusItem.Property.Intensity, true, [{Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}]); - } else if (DialogFocusItem.Property.ShowText) { - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - ChatRoomPublishCustomAction("LoveChastityBeltShockSet" + DialogFocusItem.Property.Intensity, true, Dictionary); - } -} diff --git a/Screens/Inventory/ItemPelvis/MetalChastityBelt/ClosedBack.png b/Screens/Inventory/ItemPelvis/MetalChastityBelt/ClosedBack.png deleted file mode 100644 index 5534d5703..000000000 Binary files a/Screens/Inventory/ItemPelvis/MetalChastityBelt/ClosedBack.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/MetalChastityBelt/OpenBack.png b/Screens/Inventory/ItemPelvis/MetalChastityBelt/OpenBack.png deleted file mode 100644 index 5534d5703..000000000 Binary files a/Screens/Inventory/ItemPelvis/MetalChastityBelt/OpenBack.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/ObedienceBelt/ObedienceBelt.js b/Screens/Inventory/ItemPelvis/ObedienceBelt/ObedienceBelt.js deleted file mode 100644 index fe64448f7..000000000 --- a/Screens/Inventory/ItemPelvis/ObedienceBelt/ObedienceBelt.js +++ /dev/null @@ -1,261 +0,0 @@ -"use strict"; - -const InventoryItemPelvisObedienceBeltEngraveFont = "Arial, sans-serif"; -const InventoryItemPelvisObedienceBeltEngraveLength = 13; - -function InventoryItemPelvisObedienceBeltEngraving0Load() { - // Load the font - DynamicDrawLoadFont(InventoryItemPelvisObedienceBeltEngraveFont); - - InventoryItemPelvisObedienceBeltInit(DialogFocusItem); - - const input = ElementCreateInput("EngraveText", "text", DialogFocusItem.Property.Text, InventoryItemPelvisObedienceBeltEngraveLength); - if (input) input.pattern = DynamicDrawTextInputPattern; -} - -function InventoryItemPelvisObedienceBeltEngraving0Draw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - const valid = DynamicDrawTextRegex.test(ElementValue("EngraveText")); - DrawTextFit(DialogFindPlayer("ObedienceBeltEngraveLabel"), 1505, 560, 550, "#fff", "#000"); - ElementPosition("EngraveText", 1510, 620, 300); - DrawButton(1375, 740, 250, 64, DialogFindPlayer("ObedienceBeltEngrave"), valid ? "White" : "#888", ""); -} - -function InventoryItemPelvisObedienceBeltEngraving0Click() { - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemPelvisObedienceBeltEngraving0Exit(); - return; - } - - const text = ElementValue("EngraveText"); - if (MouseIn(1375, 740, 250, 64) && DynamicDrawTextRegex.test(text)) { - DialogFocusItem.Property.Text = text; - InventoryItemPelvisObedienceBeltEngravingUpdated(text); - return; - } -} - -function InventoryItemPelvisObedienceBeltEngraving0Exit() { - ElementRemove("EngraveText"); - ExtendedItemSubscreen = null; -} - -/** - * Handles text changes. Refreshes the character and sends an appropriate chatroom message - * @param {string} text - * @returns {void} - Nothing - */ -function InventoryItemPelvisObedienceBeltEngravingUpdated(text) { - var C = CharacterGetCurrent(); - CharacterRefresh(C); - if (CurrentScreen !== "ChatRoom") return; - - const Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "NewText", Text: text } - ]; - - if (text.trim().length > 0) { - ChatRoomPublishCustomAction("ObedienceBeltEngravingUpdated", true, Dictionary); - } else { - ChatRoomPublishCustomAction("ObedienceBeltEngravingErased", true, Dictionary); - } -} - -function InventoryItemPelvisObedienceBeltShockModule1Load() { - InventoryItemPelvisObedienceBeltInit(DialogFocusItem); -} - -function InventoryItemPelvisObedienceBeltShockModule1Draw() { - // Draw the header and item - DrawAssetPreview(1387, 125, DialogFocusItem.Asset); - - MainCanvas.textAlign = "left"; - DrawCheckbox(1100, 590, 64, 64, DialogFindPlayer("ObedienceBeltShowChatMessage"), DialogFocusItem.Property.ChatMessage, false, "White"); - DrawCheckbox(1100, 660, 64, 64, DialogFindPlayer("ObedienceBeltPunishOrgasm"), DialogFocusItem.Property.PunishOrgasm, false, "White"); - DrawCheckbox(1100, 730, 64, 64, DialogFindPlayer("ObedienceBeltPunishStandup"), DialogFocusItem.Property.PunishStandup, false, "White"); - - MainCanvas.textAlign = "center"; - DrawButton(1387, 800, 225, 55, DialogFindPlayer("TriggerShock"), "White"); -} - -function InventoryItemPelvisObedienceBeltShockModule1Click() { - if (MouseIn(1885, 25, 90, 90)) { - InventoryItemPelvisObedienceBeltShockModule1Exit(); - return; - } - - const C = CharacterGetCurrent(); - if (MouseIn(1100, 590, 64, 64)) { - DialogFocusItem.Property.ChatMessage = !DialogFocusItem.Property.ChatMessage; - ChatRoomCharacterItemUpdate(C, DialogFocusItem.Asset.Group.Name); - return; - } - - if (MouseIn(1100, 660, 64, 64)) { - DialogFocusItem.Property.PunishOrgasm = !DialogFocusItem.Property.PunishOrgasm; - ChatRoomCharacterItemUpdate(C, DialogFocusItem.Asset.Group.Name); - return; - } - - if (MouseIn(1100, 730, 64, 64)) { - DialogFocusItem.Property.PunishStandup = !DialogFocusItem.Property.PunishStandup; - ChatRoomCharacterItemUpdate(C, DialogFocusItem.Asset.Group.Name); - return; - } - - if (MouseIn(1387, 800, 225, 55)) { - InventoryItemPelvisObedienceBeltScriptTrigger(C, DialogFocusItem, "Trigger"); - return; - } -} - -function InventoryItemPelvisObedienceBeltShockModule1Exit() { - ExtendedItemSubscreen = null; -} - -/** - * @param {Item} item - */ -function InventoryItemPelvisObedienceBeltInit(item) { - if (!item) return; - item.Property = item.Property || {}; - if (typeof item.Property.Type !== "string") item.Property.Type = ""; - if (typeof item.Property.ChatMessage !== "boolean") item.Property.ChatMessage = false; - if (typeof item.Property.PunishOrgasm !== "boolean") item.Property.PunishOrgasm = false; - if (typeof item.Property.PunishStandup !== "boolean") item.Property.PunishStandup = false; - if (typeof item.Property.NextShockTime !== "number") item.Property.NextShockTime = 0; - if (typeof item.Property.Text !== "string") item.Property.Text = ""; -} - -/** - * Trigger a shock automatically - * @param {Character} C - * @param {Item} Item - * @param {string} ShockType - */ -function InventoryItemPelvisObedienceBeltScriptTrigger(C, Item, ShockType) { - - if (!(CurrentScreen == "ChatRoom")) { - AudioPlayInstantSound("Audio/Shocks.mp3"); - } else { - const Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "AssetName", AssetName: Item.Asset.Name}); - Dictionary.push({ Tag: "ActivityName", Text: "ShockItem" }); - Dictionary.push({ Tag: "ActivityGroup", Text: Item.Asset.Group.Name }); - Dictionary.push({ AssetName: Item.Asset.Name }); - Dictionary.push({ AssetGroupName: Item.Asset.Group.Name }); - Dictionary.push({ ShockIntensity : 2}); - if (Item.Property && Item.Property.ChatMessage) { - if (ShockType !== "Trigger") - Dictionary.push({ Automatic: true }); - ServerSend("ChatRoomChat", { Content: "ObedienceBeltShock" + ShockType, Type: "Action", Dictionary }); - } else { - ChatRoomMessage({ Content: "ObedienceBeltShock" + ShockType, Type: "Action", Sender: Player.MemberNumber, Dictionary: Dictionary }); - } - } - InventoryShockExpression(C); -} - - -/** - * @param {Item} Item - */ -function InventoryObedienceBeltCheckPunish(Item) { - const { Type, PunishOrgasm, PunishStandup } = Item.Property; - const wearsShockModule = Type.includes("s1"); - if (Item.Property.NextShockTime - CurrentTime <= 0 && PunishOrgasm && wearsShockModule && Player.ArousalSettings && Player.ArousalSettings.OrgasmStage > 1) { - // Punish the player if they orgasm - Item.Property.NextShockTime = CurrentTime + FuturisticChastityBeltShockCooldownOrgasm; // Difficult to have two orgasms in 10 seconds - return "Orgasm"; - } else if (PunishStandup && wearsShockModule && FuturisticTrainingBeltStandUpFlag) { - // Punish the player if they stand up - FuturisticTrainingBeltStandUpFlag = false; - return "StandUp"; - } - return ""; -} - -function AssetsItemPelvisObedienceBeltUpdate(data, LastTime) { - let Item = data.Item; - let C = data.C; - - if (!Item.Property) return; - - let punishment = InventoryObedienceBeltCheckPunish(Item); - switch (punishment) { - case "Orgasm": - InventoryItemPelvisObedienceBeltScriptTrigger(C, Item, "Orgasm"); - break; - case "StandUp": - InventoryItemPelvisObedienceBeltScriptTrigger(C, Item, "Standup"); - CharacterSetActivePose(Player, "Kneel"); - ServerSend("ChatRoomCharacterPoseUpdate", { Pose: Player.ActivePose }); - break; - } -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemPelvisObedienceBeltScriptDraw(data) { - const persistentData = data.PersistentData(); - if (typeof persistentData.UpdateTime !== "number") persistentData.UpdateTime = CommonTime() + 4000; - if (typeof persistentData.LastMessageLen !== "number") persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - if (typeof persistentData.CheckTime !== "number") persistentData.CheckTime = 0; - - InventoryItemPelvisObedienceBeltInit(data.Item); - - // Trigger a check if a new message is detected - let lastMsgIndex = ChatRoomChatLog.length - 1; - if (lastMsgIndex >= 0 && ChatRoomChatLog[lastMsgIndex].Time > persistentData.CheckTime) - persistentData.UpdateTime = Math.min(persistentData.UpdateTime, CommonTime() + 200); // Trigger if the user speaks - - if (persistentData.UpdateTime < CommonTime() && data.C == Player) { - - if (CommonTime() > data.Item.Property.NextShockTime) { - AssetsItemPelvisObedienceBeltUpdate(data, persistentData.CheckTime); - persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - } - - // Set CheckTime to last processed chat message time - persistentData.CheckTime = (lastMsgIndex >= 0 ? ChatRoomChatLog[lastMsgIndex].Time : 0); - } -} - -/** @type {DynamicAfterDrawCallback} */ -function AssetsItemPelvisObedienceBeltAfterDraw({ - C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color -}) { - if (L !== "_Text") return; - - // Fetch the text property and assert that it matches the character - // and length requirements - let text = Property && typeof Property.Text === "string" && DynamicDrawTextRegex.test(Property.Text) ? Property.Text : ""; - text = text.substring(0, InventoryItemPelvisObedienceBeltEngraveLength); - - // Prepare a temporary canvas to draw the text to - const height = 60; - const width = 130; - const tempCanvas = AnimationGenerateTempCanvas(C, A, width, height); - const ctx = tempCanvas.getContext("2d"); - - DynamicDrawTextArc(text, ctx, width / 2, 42, { - fontSize: 28, - fontFamily: InventoryItemPelvisObedienceBeltEngraveFont, - width, - color: Color, - angle: Math.PI, - direction: DynamicDrawTextDirection.ANTICLOCKWISE, - textCurve: DynamicDrawTextCurve.SMILEY, - radius: 300, - }); - - // Draw the temporary canvas onto the main canvas - drawCanvas(tempCanvas, X + 59, Y + 29, AlphaMasks); - drawCanvasBlink(tempCanvas, X + 59, Y + 29, AlphaMasks); -} diff --git a/Screens/Inventory/ItemPelvis/ObedienceBelt/c0.png b/Screens/Inventory/ItemPelvis/ObedienceBelt/c0.png deleted file mode 100644 index d4e6eb293..000000000 Binary files a/Screens/Inventory/ItemPelvis/ObedienceBelt/c0.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/ObedienceBelt/c1.png b/Screens/Inventory/ItemPelvis/ObedienceBelt/c1.png deleted file mode 100644 index 8d57deb65..000000000 Binary files a/Screens/Inventory/ItemPelvis/ObedienceBelt/c1.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/ObedienceBelt/c2.png b/Screens/Inventory/ItemPelvis/ObedienceBelt/c2.png deleted file mode 100644 index d4e6eb293..000000000 Binary files a/Screens/Inventory/ItemPelvis/ObedienceBelt/c2.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/ObedienceBelt/c3.png b/Screens/Inventory/ItemPelvis/ObedienceBelt/c3.png deleted file mode 100644 index 8d57deb65..000000000 Binary files a/Screens/Inventory/ItemPelvis/ObedienceBelt/c3.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/ObedienceBelt/e0.png b/Screens/Inventory/ItemPelvis/ObedienceBelt/e0.png deleted file mode 100644 index 1c42d208e..000000000 Binary files a/Screens/Inventory/ItemPelvis/ObedienceBelt/e0.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/ObedienceBelt/s0.png b/Screens/Inventory/ItemPelvis/ObedienceBelt/s0.png deleted file mode 100644 index d4e6eb293..000000000 Binary files a/Screens/Inventory/ItemPelvis/ObedienceBelt/s0.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/ObedienceBelt/s1.png b/Screens/Inventory/ItemPelvis/ObedienceBelt/s1.png deleted file mode 100644 index 02290d8ea..000000000 Binary files a/Screens/Inventory/ItemPelvis/ObedienceBelt/s1.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/OrnateChastityBelt/ClosedBack.png b/Screens/Inventory/ItemPelvis/OrnateChastityBelt/ClosedBack.png deleted file mode 100644 index 96911158b..000000000 Binary files a/Screens/Inventory/ItemPelvis/OrnateChastityBelt/ClosedBack.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/OrnateChastityBelt/OpenBack.png b/Screens/Inventory/ItemPelvis/OrnateChastityBelt/OpenBack.png deleted file mode 100644 index 96911158b..000000000 Binary files a/Screens/Inventory/ItemPelvis/OrnateChastityBelt/OpenBack.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/PolishedChastityBelt/ClosedBack.png b/Screens/Inventory/ItemPelvis/PolishedChastityBelt/ClosedBack.png deleted file mode 100644 index 46b4d5cc7..000000000 Binary files a/Screens/Inventory/ItemPelvis/PolishedChastityBelt/ClosedBack.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/PolishedChastityBelt/OpenBack.png b/Screens/Inventory/ItemPelvis/PolishedChastityBelt/OpenBack.png deleted file mode 100644 index 46b4d5cc7..000000000 Binary files a/Screens/Inventory/ItemPelvis/PolishedChastityBelt/OpenBack.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/PoofyDiaper/ExtraPadding.png b/Screens/Inventory/ItemPelvis/PoofyDiaper/ExtraPadding.png deleted file mode 100644 index 516d9c310..000000000 Binary files a/Screens/Inventory/ItemPelvis/PoofyDiaper/ExtraPadding.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/PoofyDiaper/RegularPadding.png b/Screens/Inventory/ItemPelvis/PoofyDiaper/RegularPadding.png deleted file mode 100644 index 34c124a34..000000000 Binary files a/Screens/Inventory/ItemPelvis/PoofyDiaper/RegularPadding.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/Ribbons/BowWrap.png b/Screens/Inventory/ItemPelvis/Ribbons/BowWrap.png deleted file mode 100644 index 56521c6ad..000000000 Binary files a/Screens/Inventory/ItemPelvis/Ribbons/BowWrap.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/Ribbons/CrotchWrapping.png b/Screens/Inventory/ItemPelvis/Ribbons/CrotchWrapping.png deleted file mode 100644 index edb8083b0..000000000 Binary files a/Screens/Inventory/ItemPelvis/Ribbons/CrotchWrapping.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/SciFiPleasurePanties/SciFiPleasurePanties.js b/Screens/Inventory/ItemPelvis/SciFiPleasurePanties/SciFiPleasurePanties.js deleted file mode 100644 index 188a7b687..000000000 --- a/Screens/Inventory/ItemPelvis/SciFiPleasurePanties/SciFiPleasurePanties.js +++ /dev/null @@ -1,236 +0,0 @@ -"use strict"; -function InventoryItemPelvisSciFiPleasurePantiesLoad() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticLoadAccessDenied(); - } - else{ - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Intensity: -1, ShockLevel: 0, ShowText: true, Effect: ["Egged"], LockButt: false, LockCrotch: false, Block: [], OrgasmLock: 0}; - if (DialogFocusItem.Property.Intensity == null) DialogFocusItem.Property.Intensity = -1; - if (DialogFocusItem.Property.ShockLevel == null) DialogFocusItem.Property.ShockLevel = 0; - if (DialogFocusItem.Property.ShowText == null) DialogFocusItem.Property.ShowText = true; - if (DialogFocusItem.Property.Effect == null) DialogFocusItem.Property.Effect = ["Egged"]; - if (DialogFocusItem.Property.LockButt == null) DialogFocusItem.Property.LockButt = false; - if (DialogFocusItem.Property.LockCrotch == null) DialogFocusItem.Property.LockCrotch = false; - if (DialogFocusItem.Property.Block == null) DialogFocusItem.Property.Block = []; - if (DialogFocusItem.Property.OrgasmLock == null) DialogFocusItem.Property.OrgasmLock = 0; - } -} - -function InventoryItemPelvisSciFiPleasurePantiesDraw() { - - const Vibrating = DialogFocusItem.Property.Intensity >= 0; - DrawAssetPreview(1387, 175, DialogFocusItem.Asset, {Vibrating}); - - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticDrawAccessDenied(); - } - else if (DialogFocusItem && DialogFocusItem.Property) { - - DrawButton(1175, 580, 200, 55, DialogFind(Player, "TurnOff"), (DialogFocusItem.Property.Intensity == -1) ? "#888888" : "White"); - DrawButton(1400, 580, 200, 55, DialogFind(Player, "Low"), (DialogFocusItem.Property.Intensity == 0) ? "#888888" : "White"); - DrawButton(1625, 580, 200, 55, DialogFind(Player, "Medium"), (DialogFocusItem.Property.Intensity == 1) ? "#888888" : "White"); - DrawButton(1175, 650, 200, 55, DialogFind(Player, "High"), (DialogFocusItem.Property.Intensity == 2) ? "#888888" : "White"); - DrawButton(1400, 650, 200, 55, DialogFind(Player, "Maximum"), (DialogFocusItem.Property.Intensity == 3) ? "#888888" : "White"); - DrawButton(1150, 930, 200, 55, DialogFind(Player, "UnlockOrgasm"), (DialogFocusItem.Property.OrgasmLock == 0 || !DialogFocusItem.Property.OrgasmLock) ? "#888888" : "White"); - DrawButton(1400, 930, 200, 55, DialogFind(Player, "LockOrgasm"), (DialogFocusItem.Property.OrgasmLock == 1) ? "#888888" : "White"); - DrawButton(1650, 930, 200, 55, DialogFind(Player, "DenyOrgasm"), (DialogFocusItem.Property.OrgasmLock == 2) ? "#888888" : "White"); - - DrawText(DialogFind(Player, "Intensity" + DialogFocusItem.Property.ShockLevel.toString()).replace("Item", DialogFocusItem.Asset.Description).replace("intensity", "Shock Intensity").replace("Vibe", "Shock Vibe"), 1500, 750, "White", "Gray"); - DrawButton(1175, 780, 200, 55, DialogFind(Player, "Low"), (DialogFocusItem.Property.ShockLevel == 0) ? "#888888" : "White"); - DrawButton(1400, 780, 200, 55, DialogFind(Player, "Medium"), (DialogFocusItem.Property.ShockLevel == 1) ? "#888888" : "White"); - DrawButton(1625, 780, 200, 55, DialogFind(Player, "High"), (DialogFocusItem.Property.ShockLevel == 2) ? "#888888" : "White"); - if (CurrentScreen == "ChatRoom") DrawButton(1175, 850, 64, 64, "", "White", DialogFocusItem.Property.ShowText ? "Icons/Checked.png" : ""); - if (CurrentScreen == "ChatRoom") DrawText(DialogFind(Player, "ShockCollarShowChat"), 1420, 880, "White", "Gray"); - DrawButton(1625, 850, 200, 55, DialogFind(Player, "TriggerShock"), (!Player.CanInteract()) ? "#888888" : "White"); - - DrawButton(1550, 480, 250, 65, DialogFind(Player, DialogFocusItem.Property.LockButt ? "LoveChastityBeltUnlockButt" : "LoveChastityBeltLockButt"), "White"); - - DrawButton(1200, 480, 250, 65, DialogFind(Player, DialogFocusItem.Property.LockCrotch ? "LoveChastityBeltUnlockClosed" : "LoveChastityBeltAddShield"), "White"); - } -} - -function InventoryItemPelvisSciFiPleasurePantiesClick() { - - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticClickAccessDenied(); - } - else { - - if (MouseIn(1885, 25, 90, 85)) DialogFocusItem = null; - if (MouseIn(1175, 580, 200, 55) && (DialogFocusItem.Property.Intensity != -1)) InventoryItemPelvisSciFiPleasurePantiesSetIntensity(-1 - DialogFocusItem.Property.Intensity); - if (MouseIn(1400, 580, 200, 55) && (DialogFocusItem.Property.Intensity != 0)) InventoryItemPelvisSciFiPleasurePantiesSetIntensity(0 - DialogFocusItem.Property.Intensity); - if (MouseIn(1625, 580, 200, 55) && (DialogFocusItem.Property.Intensity != 1)) InventoryItemPelvisSciFiPleasurePantiesSetIntensity(1 - DialogFocusItem.Property.Intensity); - if (MouseIn(1175, 650, 200, 55) && (DialogFocusItem.Property.Intensity != 2)) InventoryItemPelvisSciFiPleasurePantiesSetIntensity(2 - DialogFocusItem.Property.Intensity); - if (MouseIn(1400, 650, 200, 55) && (DialogFocusItem.Property.Intensity != 3)) InventoryItemPelvisSciFiPleasurePantiesSetIntensity(3 - DialogFocusItem.Property.Intensity); - if (MouseIn(1150, 930, 200, 45) && (DialogFocusItem.Property.OrgasmLock != 0)) InventoryItemPelvisSciFiPleasurePantiesLockOrgasm(false, false); - if (MouseIn(1400, 930, 200, 45) && (DialogFocusItem.Property.OrgasmLock != 1)) InventoryItemPelvisSciFiPleasurePantiesLockOrgasm(true, false); - if (MouseIn(1650, 930, 200, 45) && (DialogFocusItem.Property.OrgasmLock != 2)) InventoryItemPelvisSciFiPleasurePantiesLockOrgasm(true, true); - - if (MouseIn(1175, 850, 64, 64) && (CurrentScreen == "ChatRoom")) { - DialogFocusItem.Property.ShowText = !DialogFocusItem.Property.ShowText; - } - if (MouseIn(1175, 780, 200, 55) && (DialogFocusItem.Property.ShockLevel != 0)) InventoryItemPelvisSciFiPleasurePantiesSetShockLevel(0 - DialogFocusItem.Property.ShockLevel); - if (MouseIn(1400, 780, 200, 55) && (DialogFocusItem.Property.ShockLevel != 1)) InventoryItemPelvisSciFiPleasurePantiesSetShockLevel(1 - DialogFocusItem.Property.ShockLevel); - if (MouseIn(1625, 780, 200, 55) && (DialogFocusItem.Property.ShockLevel != 2)) InventoryItemPelvisSciFiPleasurePantiesSetShockLevel(2 - DialogFocusItem.Property.ShockLevel); - if (Player.CanInteract() && MouseIn(1625, 850, 200, 55)) InventoryItemPelvisSciFiPleasurePantiesShockTrigger(); - - if (MouseIn(1550, 480, 250, 65)) { - DialogFocusItem.Property.LockButt = !DialogFocusItem.Property.LockButt; - InventoryItemPelvisSciFiPleasurePantiesLockButt(); - CharacterRefresh(C); - if (CharacterGetCurrent().ID == 0) ServerPlayerAppearanceSync(); - if (CurrentScreen == "ChatRoom") ChatRoomCharacterItemUpdate(C, "ItemPelvis"); - let Dictionary = []; - Dictionary.push({Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - ChatRoomPublishCustomAction("SciFiPleasurePantiesAction" + (DialogFocusItem.Property.LockButt ? "LockButt" : "UnlockButt"), true, Dictionary); - } - - if (MouseIn(1200, 480, 250, 65)) { - DialogFocusItem.Property.LockCrotch = !DialogFocusItem.Property.LockCrotch; - InventoryItemPelvisSciFiPleasurePantiesLockCrotch(); - CharacterRefresh(C); - if (CharacterGetCurrent().ID == 0) ServerPlayerAppearanceSync(); - if (CurrentScreen == "ChatRoom") ChatRoomCharacterItemUpdate(C, "ItemPelvis"); - let Dictionary = []; - Dictionary.push({Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - ChatRoomPublishCustomAction("SciFiPleasurePantiesAction" + (DialogFocusItem.Property.LockCrotch ? "AddShield" : "RemoveShield"), true, Dictionary); - } - } -} - -function InventoryItemPelvisSciFiPleasurePantiesLockOrgasm(OrgasmLock, DenyMode) { - let C = CharacterGetCurrent(); - - if (OrgasmLock == true && !DialogFocusItem.Property.Effect.includes("DenialMode")) { - DialogFocusItem.Property.Effect.push("DenialMode"); - DialogFocusItem.Property.OrgasmLock = 1; - } - else if (OrgasmLock == false && DialogFocusItem.Property.Effect.includes("DenialMode")) { - DialogFocusItem.Property.OrgasmLock = 0; - for (let E = 0; E < DialogFocusItem.Property.Effect.length; E++) { - let Effect = DialogFocusItem.Property.Effect[E]; - if (Effect == "DenialMode") { - DialogFocusItem.Property.Effect.splice(E, 1); - E--; - } - } - } - if (DenyMode == true && !DialogFocusItem.Property.Effect.includes("RuinOrgasms")) { - DialogFocusItem.Property.Effect.push("RuinOrgasms"); - DialogFocusItem.Property.OrgasmLock = 2; - } - else if (DenyMode == false && DialogFocusItem.Property.Effect.includes("RuinOrgasms")) { - DialogFocusItem.Property.OrgasmLock = OrgasmLock ? 1 : 0; - for (let E = 0; E < DialogFocusItem.Property.Effect.length; E++) { - let Effect = DialogFocusItem.Property.Effect[E]; - if (Effect == "RuinOrgasms") { - DialogFocusItem.Property.Effect.splice(E, 1); - E--; - } - } - } - - CharacterLoadEffect(C); - if (C.ID == 0) ServerPlayerAppearanceSync(); - - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - ChatRoomPublishCustomAction("SciFiPleasurePantiesBeep" + ((OrgasmLock == true) ? ((DenyMode == true) ? "DenialModeActivate" : "EdgeModeActivate") : "DenialModeDeactivate"), true, Dictionary); -} - -function InventoryItemPelvisSciFiPleasurePantiesLockButt() { - if (DialogFocusItem.Property.LockButt == true) DialogFocusItem.Property.Block.push("ItemButt"); - else { - for (let E = 0; E < DialogFocusItem.Property.Block.length; E++) { - if (DialogFocusItem.Property.Block[E] == "ItemButt") { - DialogFocusItem.Property.Block.splice(E, 1); - E--; - } - } - } -} - -function InventoryItemPelvisSciFiPleasurePantiesLockCrotch() { - if (DialogFocusItem.Property.LockCrotch == true) DialogFocusItem.Property.Block.push("ItemVulva", "ItemVulvaPiercings"); - else { - for (let E = 0; E < DialogFocusItem.Property.Block.length; E++) { - if (DialogFocusItem.Property.Block[E] == "ItemVulva" || DialogFocusItem.Property.Block[E] == "ItemVulvaPiercings") { - DialogFocusItem.Property.Block.splice(E, 1); - E--; - } - } - } -} - -function InventoryItemPelvisSciFiPleasurePantiesSetIntensity(Modifier) { - var C = CharacterGetCurrent(); - - DialogFocusItem.Property.Intensity = DialogFocusItem.Property.Intensity + Modifier; - - if (DialogFocusItem.Property.Intensity == -1) { - for (let E = 0; E < DialogFocusItem.Property.Effect.length; E++) { - var Effect = DialogFocusItem.Property.Effect[E]; - if (Effect == "Vibrating") { - DialogFocusItem.Property.Effect.splice(E, 1); - E--; - } - } - } - if (DialogFocusItem.Property.Intensity > -1 && !DialogFocusItem.Property.Effect.includes("Vibrating")) DialogFocusItem.Property.Effect.push("Vibrating"); - - CharacterLoadEffect(C); - if (C.ID == 0) ServerPlayerAppearanceSync(); - - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - ChatRoomPublishCustomAction("SciFiPleasurePantiesVibe" + ((Modifier > 0) ? "Increase" : "Decrease") + "To" + DialogFocusItem.Property.Intensity, true, Dictionary); -} - -function InventoryItemPelvisSciFiPleasurePantiesSetShockLevel(Modifier) { - - // Gets the current item and character - var C = CharacterGetCurrent(); - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemPelvisSciFiPleasurePantiesLoad(); - } - - DialogFocusItem.Property.ShockLevel = DialogFocusItem.Property.ShockLevel + Modifier; - if (DialogFocusItem.Property.ShowText && CurrentScreen == "ChatRoom") { - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - ChatRoomPublishCustomAction("SciFiPleasurePantiesShockSet" + DialogFocusItem.Property.ShockLevel, true, Dictionary); - } - else if (CurrentScreen == "ChatRoom") - DialogFocusItem = null; - -} - -function InventoryItemPelvisSciFiPleasurePantiesShockTrigger() { - // Gets the current item and character - var C = CharacterGetCurrent(); - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemPelvisSciFiPleasurePantiesLoad(); - } - - if (C.ID == Player.ID) { - // The Player shocks herself - ActivityArousalItem(C, C, DialogFocusItem.Asset); - } - - var Dictionary = []; - Dictionary.push({ Tag: "AssetName", Text: DialogFocusItem.Asset.Description.toLowerCase() }); - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ ShockIntensity : DialogFocusItem.Property.Intensity * 1.5}); - ChatRoomPublishCustomAction("SciFiPleasurePantiesShockTrigger" + DialogFocusItem.Property.ShockLevel, true, Dictionary); - - InventoryShockExpression(C); -} - -function InventoryItemPelvisSciFiPleasurePantiesExit() { - InventoryItemFuturisticExitAccessDenied(); -} \ No newline at end of file diff --git a/Screens/Inventory/ItemPelvis/SilkStraps/Crotch.png b/Screens/Inventory/ItemPelvis/SilkStraps/Crotch.png deleted file mode 100644 index 8880cbd21..000000000 Binary files a/Screens/Inventory/ItemPelvis/SilkStraps/Crotch.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/SilkStraps/KikkouHip.png b/Screens/Inventory/ItemPelvis/SilkStraps/KikkouHip.png deleted file mode 100644 index 589a6a25c..000000000 Binary files a/Screens/Inventory/ItemPelvis/SilkStraps/KikkouHip.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/SilkStraps/OverPanties.png b/Screens/Inventory/ItemPelvis/SilkStraps/OverPanties.png deleted file mode 100644 index 86cd2fbfb..000000000 Binary files a/Screens/Inventory/ItemPelvis/SilkStraps/OverPanties.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/SilkStraps/SwissSeat.png b/Screens/Inventory/ItemPelvis/SilkStraps/SwissSeat.png deleted file mode 100644 index f86645bb9..000000000 Binary files a/Screens/Inventory/ItemPelvis/SilkStraps/SwissSeat.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/StuddedChastityBelt/ClosedBack.png b/Screens/Inventory/ItemPelvis/StuddedChastityBelt/ClosedBack.png deleted file mode 100644 index 68651b4c5..000000000 Binary files a/Screens/Inventory/ItemPelvis/StuddedChastityBelt/ClosedBack.png and /dev/null differ diff --git a/Screens/Inventory/ItemPelvis/StuddedChastityBelt/OpenBack.png b/Screens/Inventory/ItemPelvis/StuddedChastityBelt/OpenBack.png deleted file mode 100644 index 68651b4c5..000000000 Binary files a/Screens/Inventory/ItemPelvis/StuddedChastityBelt/OpenBack.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/FuturisticHarness/Full.png b/Screens/Inventory/ItemTorso/FuturisticHarness/Full.png deleted file mode 100644 index 63cd0b462..000000000 Binary files a/Screens/Inventory/ItemTorso/FuturisticHarness/Full.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/FuturisticHarness/FuturisticHarness.js b/Screens/Inventory/ItemTorso/FuturisticHarness/FuturisticHarness.js deleted file mode 100644 index 73fed6b23..000000000 --- a/Screens/Inventory/ItemTorso/FuturisticHarness/FuturisticHarness.js +++ /dev/null @@ -1,71 +0,0 @@ -"use strict"; - -var InventoryItemTorsoFuturisticHarnessOptions = [ - { - Name: "Full", - Property: { Type: null, Difficulty: 2}, - }, - { - Name: "Upper", - Property: { Type: "Upper", Difficulty: 0}, - }, - { - Name: "Lower", - Property: { Type: "Lower", Difficulty: 0}, - }, -]; - -// Loads the item extension properties -function InventoryItemTorsoFuturisticHarnessLoad() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticLoadAccessDenied(); - } else - ExtendedItemLoad(InventoryItemTorsoFuturisticHarnessOptions, "FuturisticHarnessType"); -} - -// Draw the item extension screen -function InventoryItemTorsoFuturisticHarnessDraw() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticDrawAccessDenied(); - } else { - ExtendedItemDraw(InventoryItemTorsoFuturisticHarnessOptions, "FuturisticHarnessType"); - - DrawAssetPreview(1387, 75, DialogFocusItem.Asset); - - var FuturisticCollarItems = InventoryItemNeckFuturisticCollarGetItems(C); - - if (FuturisticCollarItems.length > 0) { - DrawButton(1400, 910, 200, 55, DialogFindPlayer("FuturisticCollarColor"), "White"); - } - } -} - - -function InventoryItemTorsoFuturisticHarnessPublishAction(C, Option) { - var msg = "FuturisticHarnessSet" + Option.Name; - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - ChatRoomPublishCustomAction(msg, true, Dictionary); -} - -// Catches the item extension clicks -function InventoryItemTorsoFuturisticHarnessClick() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticClickAccessDenied(); - } else { - - ExtendedItemClick(InventoryItemTorsoFuturisticHarnessOptions); - - var FuturisticCollarItems = InventoryItemNeckFuturisticCollarGetItems(C); - if (MouseIn(1400, 910, 200, 55) && FuturisticCollarItems.length > 0 && DialogFocusItem) { InventoryItemNeckFuturisticCollarColor(C, DialogFocusItem); InventoryItemTorsoFuturisticHarnessExit();} - } -} - -function InventoryItemTorsoFuturisticHarnessExit() { - InventoryItemFuturisticExitAccessDenied(); -} \ No newline at end of file diff --git a/Screens/Inventory/ItemTorso/FuturisticHarness/Lower.png b/Screens/Inventory/ItemTorso/FuturisticHarness/Lower.png deleted file mode 100644 index 44382d055..000000000 Binary files a/Screens/Inventory/ItemTorso/FuturisticHarness/Lower.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/FuturisticHarness/Upper.png b/Screens/Inventory/ItemTorso/FuturisticHarness/Upper.png deleted file mode 100644 index 9e758c5d2..000000000 Binary files a/Screens/Inventory/ItemTorso/FuturisticHarness/Upper.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/HeavyLatexCorset/Normal.png b/Screens/Inventory/ItemTorso/HeavyLatexCorset/Normal.png deleted file mode 100644 index 910171a7c..000000000 Binary files a/Screens/Inventory/ItemTorso/HeavyLatexCorset/Normal.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/HeavyLatexCorset/Straps.png b/Screens/Inventory/ItemTorso/HeavyLatexCorset/Straps.png deleted file mode 100644 index 3552d3c6c..000000000 Binary files a/Screens/Inventory/ItemTorso/HeavyLatexCorset/Straps.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/HempRopeHarness/Crotch.png b/Screens/Inventory/ItemTorso/HempRopeHarness/Crotch.png deleted file mode 100644 index d80451912..000000000 Binary files a/Screens/Inventory/ItemTorso/HempRopeHarness/Crotch.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/HempRopeHarness/Diamond.png b/Screens/Inventory/ItemTorso/HempRopeHarness/Diamond.png deleted file mode 100644 index e820faeed..000000000 Binary files a/Screens/Inventory/ItemTorso/HempRopeHarness/Diamond.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/HempRopeHarness/Harness.png b/Screens/Inventory/ItemTorso/HempRopeHarness/Harness.png deleted file mode 100644 index c0ffd762b..000000000 Binary files a/Screens/Inventory/ItemTorso/HempRopeHarness/Harness.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/HempRopeHarness/Star.png b/Screens/Inventory/ItemTorso/HempRopeHarness/Star.png deleted file mode 100644 index 8e5dbc08d..000000000 Binary files a/Screens/Inventory/ItemTorso/HempRopeHarness/Star.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/HempRopeHarness/Waist.png b/Screens/Inventory/ItemTorso/HempRopeHarness/Waist.png deleted file mode 100644 index 56ac51d8c..000000000 Binary files a/Screens/Inventory/ItemTorso/HempRopeHarness/Waist.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/HighSecurityHarness/LowSec.png b/Screens/Inventory/ItemTorso/HighSecurityHarness/LowSec.png deleted file mode 100644 index ba257fe7a..000000000 Binary files a/Screens/Inventory/ItemTorso/HighSecurityHarness/LowSec.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/HighSecurityHarness/MaxSec.png b/Screens/Inventory/ItemTorso/HighSecurityHarness/MaxSec.png deleted file mode 100644 index 2782e6e4f..000000000 Binary files a/Screens/Inventory/ItemTorso/HighSecurityHarness/MaxSec.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/HighSecurityHarness/MedSec.png b/Screens/Inventory/ItemTorso/HighSecurityHarness/MedSec.png deleted file mode 100644 index 21a9e7766..000000000 Binary files a/Screens/Inventory/ItemTorso/HighSecurityHarness/MedSec.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/HighSecurityHarness/MedSecBreast.png b/Screens/Inventory/ItemTorso/HighSecurityHarness/MedSecBreast.png deleted file mode 100644 index a7c040d80..000000000 Binary files a/Screens/Inventory/ItemTorso/HighSecurityHarness/MedSecBreast.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/LockingSwimsuit/Dull.png b/Screens/Inventory/ItemTorso/LockingSwimsuit/Dull.png deleted file mode 100644 index 4fca15e1b..000000000 Binary files a/Screens/Inventory/ItemTorso/LockingSwimsuit/Dull.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/LockingSwimsuit/Shiny.png b/Screens/Inventory/ItemTorso/LockingSwimsuit/Shiny.png deleted file mode 100644 index 99834f52e..000000000 Binary files a/Screens/Inventory/ItemTorso/LockingSwimsuit/Shiny.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/NylonRopeHarness/Crotch.png b/Screens/Inventory/ItemTorso/NylonRopeHarness/Crotch.png deleted file mode 100644 index d80451912..000000000 Binary files a/Screens/Inventory/ItemTorso/NylonRopeHarness/Crotch.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/NylonRopeHarness/Diamond.png b/Screens/Inventory/ItemTorso/NylonRopeHarness/Diamond.png deleted file mode 100644 index e820faeed..000000000 Binary files a/Screens/Inventory/ItemTorso/NylonRopeHarness/Diamond.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/NylonRopeHarness/Harness.png b/Screens/Inventory/ItemTorso/NylonRopeHarness/Harness.png deleted file mode 100644 index c0ffd762b..000000000 Binary files a/Screens/Inventory/ItemTorso/NylonRopeHarness/Harness.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/NylonRopeHarness/Star.png b/Screens/Inventory/ItemTorso/NylonRopeHarness/Star.png deleted file mode 100644 index 8e5dbc08d..000000000 Binary files a/Screens/Inventory/ItemTorso/NylonRopeHarness/Star.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/NylonRopeHarness/Waist.png b/Screens/Inventory/ItemTorso/NylonRopeHarness/Waist.png deleted file mode 100644 index 56ac51d8c..000000000 Binary files a/Screens/Inventory/ItemTorso/NylonRopeHarness/Waist.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/Ribbons/Basic.png b/Screens/Inventory/ItemTorso/Ribbons/Basic.png deleted file mode 100644 index 409f862fb..000000000 Binary files a/Screens/Inventory/ItemTorso/Ribbons/Basic.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/Ribbons/Harness1.png b/Screens/Inventory/ItemTorso/Ribbons/Harness1.png deleted file mode 100644 index 498674531..000000000 Binary files a/Screens/Inventory/ItemTorso/Ribbons/Harness1.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/Ribbons/Harness2.png b/Screens/Inventory/ItemTorso/Ribbons/Harness2.png deleted file mode 100644 index 6a51b5b60..000000000 Binary files a/Screens/Inventory/ItemTorso/Ribbons/Harness2.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/SilkStraps/Crotch.png b/Screens/Inventory/ItemTorso/SilkStraps/Crotch.png deleted file mode 100644 index 0df53e9f5..000000000 Binary files a/Screens/Inventory/ItemTorso/SilkStraps/Crotch.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/SilkStraps/Diamond.png b/Screens/Inventory/ItemTorso/SilkStraps/Diamond.png deleted file mode 100644 index 84becfbe2..000000000 Binary files a/Screens/Inventory/ItemTorso/SilkStraps/Diamond.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/SilkStraps/Harness.png b/Screens/Inventory/ItemTorso/SilkStraps/Harness.png deleted file mode 100644 index 693735355..000000000 Binary files a/Screens/Inventory/ItemTorso/SilkStraps/Harness.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/SilkStraps/Star.png b/Screens/Inventory/ItemTorso/SilkStraps/Star.png deleted file mode 100644 index fc55271bf..000000000 Binary files a/Screens/Inventory/ItemTorso/SilkStraps/Star.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/SilkStraps/Waist.png b/Screens/Inventory/ItemTorso/SilkStraps/Waist.png deleted file mode 100644 index a49d58e23..000000000 Binary files a/Screens/Inventory/ItemTorso/SilkStraps/Waist.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/ThinLeatherStraps/Crotch.png b/Screens/Inventory/ItemTorso/ThinLeatherStraps/Crotch.png deleted file mode 100644 index 772d07295..000000000 Binary files a/Screens/Inventory/ItemTorso/ThinLeatherStraps/Crotch.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/ThinLeatherStraps/Harness.png b/Screens/Inventory/ItemTorso/ThinLeatherStraps/Harness.png deleted file mode 100644 index 924b371e9..000000000 Binary files a/Screens/Inventory/ItemTorso/ThinLeatherStraps/Harness.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso/ThinLeatherStraps/Waist.png b/Screens/Inventory/ItemTorso/ThinLeatherStraps/Waist.png deleted file mode 100644 index 501e6a190..000000000 Binary files a/Screens/Inventory/ItemTorso/ThinLeatherStraps/Waist.png and /dev/null differ diff --git a/Screens/Inventory/ItemTorso2/FuturisticHarness/FuturisticHarness.js b/Screens/Inventory/ItemTorso2/FuturisticHarness/FuturisticHarness.js deleted file mode 100644 index 1fbe61073..000000000 --- a/Screens/Inventory/ItemTorso2/FuturisticHarness/FuturisticHarness.js +++ /dev/null @@ -1,71 +0,0 @@ -"use strict"; - -var InventoryItemTorso2FuturisticHarnessOptions = [ - { - Name: "Full", - Property: { Type: null, Difficulty: 2}, - }, - { - Name: "Upper", - Property: { Type: "Upper", Difficulty: 0}, - }, - { - Name: "Lower", - Property: { Type: "Lower", Difficulty: 0}, - }, -]; - -// Loads the item extension properties -function InventoryItemTorso2FuturisticHarnessLoad() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticLoadAccessDenied(); - } else - ExtendedItemLoad(InventoryItemTorso2FuturisticHarnessOptions, "FuturisticHarnessType"); -} - -// Draw the item extension screen -function InventoryItemTorso2FuturisticHarnessDraw() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticDrawAccessDenied(); - } else { - ExtendedItemDraw(InventoryItemTorso2FuturisticHarnessOptions, "FuturisticHarnessType"); - - DrawAssetPreview(1387, 75, DialogFocusItem.Asset); - - var FuturisticCollarItems = InventoryItemNeckFuturisticCollarGetItems(C); - - if (FuturisticCollarItems.length > 0) { - DrawButton(1400, 910, 200, 55, DialogFindPlayer("FuturisticCollarColor"), "White"); - } - } -} - - -function InventoryItemTorso2FuturisticHarnessPublishAction(C, Option) { - var msg = "FuturisticHarnessSet" + Option.Name; - var Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - ]; - ChatRoomPublishCustomAction(msg, true, Dictionary); -} - -// Catches the item extension clicks -function InventoryItemTorso2FuturisticHarnessClick() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticClickAccessDenied(); - } else { - - ExtendedItemClick(InventoryItemTorso2FuturisticHarnessOptions); - - var FuturisticCollarItems = InventoryItemNeckFuturisticCollarGetItems(C); - if (MouseIn(1400, 910, 200, 55) && FuturisticCollarItems.length > 0 && DialogFocusItem) { InventoryItemNeckFuturisticCollarColor(C, DialogFocusItem); InventoryItemTorso2FuturisticHarnessExit();} - } -} - -function InventoryItemTorso2FuturisticHarnessExit() { - InventoryItemFuturisticExitAccessDenied(); -} \ No newline at end of file diff --git a/Screens/Inventory/ItemVulva/ClitAndDildoVibratorbelt/ClitAndDildoVibratorbelt.js b/Screens/Inventory/ItemVulva/ClitAndDildoVibratorbelt/ClitAndDildoVibratorbelt.js deleted file mode 100644 index e529e0faf..000000000 --- a/Screens/Inventory/ItemVulva/ClitAndDildoVibratorbelt/ClitAndDildoVibratorbelt.js +++ /dev/null @@ -1,85 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemVulvaClitAndDildoVibratorbeltLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Intensity: -1 }; - if (DialogFocusItem.Property.Intensity == null) DialogFocusItem.Property.Intensity = -1; - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Intensity: -1 }; - if (DialogFocusItem.Property.Intensity == null) DialogFocusItem.Property.Intensity = -1; -} - -// Draw the item extension screen -function InventoryItemVulvaClitAndDildoVibratorbeltDraw() { - const {Intensity} = DialogFocusItem.Property; - DrawAssetPreview(1387, 225, DialogFocusItem.Asset, {Vibrating: Intensity >= 0}); - DrawText(DialogFindPlayer("DildoIntensity" + Intensity.toString()), 1500, 750, "White", "Gray"); - if (Intensity !== -1) DrawButton(1200, 775, 200, 55, DialogFindPlayer("TurnOff"), "White"); - if (Intensity !== 0) DrawButton(1550, 775, 200, 55, DialogFindPlayer("Low"), "White"); - if (Intensity !== 1) DrawButton(1200, 835, 200, 55, DialogFindPlayer("Medium"), "White"); - if (Intensity !== 2) DrawButton(1550, 835, 200, 55, DialogFindPlayer("High"), "White"); - if (Intensity !== 3) DrawButton(1375, 895, 200, 55, DialogFindPlayer("Maximum"), "White"); - DrawText(DialogFindPlayer("EggIntensity" + Intensity.toString()), 1500, 525, "White", "Gray"); - if (Intensity !== -1) DrawButton(1200, 550, 200, 55, DialogFindPlayer("TurnOff"), "White"); - if (Intensity !== 0) DrawButton(1550, 550, 200, 55, DialogFindPlayer("Low"), "White"); - if (Intensity !== 1) DrawButton(1200, 610, 200, 55, DialogFindPlayer("Medium"), "White"); - if (Intensity !== 2) DrawButton(1550, 610, 200, 55, DialogFindPlayer("High"), "White"); - if (Intensity !== 3) DrawButton(1375, 670, 200, 55, DialogFindPlayer("Maximum"), "White"); -} - -// Catches the item extension clicks -function InventoryItemVulvaClitAndDildoVibratorbeltClick() { - if (MouseIn(1885, 25, 90, 90)) DialogFocusItem = null; - else if (MouseIn(1200, 775, 200, 55) && (DialogFocusItem.Property.Intensity !== -1)) InventoryItemVulvaClitAndDildoVibratorbeltIntensity(-1 - DialogFocusItem.Property.Intensity); - else if (MouseIn(1550, 775, 200, 55) && (DialogFocusItem.Property.Intensity !== 0)) InventoryItemVulvaClitAndDildoVibratorbeltIntensity(0 - DialogFocusItem.Property.Intensity); - else if (MouseIn(1200, 835, 200, 55) && (DialogFocusItem.Property.Intensity !== 1)) InventoryItemVulvaClitAndDildoVibratorbeltIntensity(1 - DialogFocusItem.Property.Intensity); - else if (MouseIn(1550, 835, 200, 55) && (DialogFocusItem.Property.Intensity !== 2)) InventoryItemVulvaClitAndDildoVibratorbeltIntensity(2 - DialogFocusItem.Property.Intensity); - else if (MouseIn(1375, 895, 200, 55) && (DialogFocusItem.Property.Intensity !== 3)) InventoryItemVulvaClitAndDildoVibratorbeltIntensity(3 - DialogFocusItem.Property.Intensity); - else if (MouseIn(1200, 550, 200, 55) && (DialogFocusItem.Property.Intensity !== -1)) InventoryItemVulvaClitAndDildoVibratorbeltSetIntensity(-1 - DialogFocusItem.Property.Intensity); - else if (MouseIn(1550, 550, 200, 55) && (DialogFocusItem.Property.Intensity !== 0)) InventoryItemVulvaClitAndDildoVibratorbeltSetIntensity(0 - DialogFocusItem.Property.Intensity); - else if (MouseIn(1200, 610, 200, 55) && (DialogFocusItem.Property.Intensity !== 1)) InventoryItemVulvaClitAndDildoVibratorbeltSetIntensity(1 - DialogFocusItem.Property.Intensity); - else if (MouseIn(1550, 610, 200, 55) && (DialogFocusItem.Property.Intensity !== 2)) InventoryItemVulvaClitAndDildoVibratorbeltSetIntensity(2 - DialogFocusItem.Property.Intensity); - else if (MouseIn(1375, 670, 200, 55) && (DialogFocusItem.Property.Intensity !== 3)) InventoryItemVulvaClitAndDildoVibratorbeltSetIntensity(3 - DialogFocusItem.Property.Intensity); -} - -// Sets the vibration Level on the dildo -function InventoryItemVulvaClitAndDildoVibratorbeltIntensity(Modifier) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - DialogFocusItem.Property.Intensity = DialogFocusItem.Property.Intensity + Modifier; - if (DialogFocusItem.Property.Intensity == -1) DialogFocusItem.Property.Effect = ["Egged"]; - if (DialogFocusItem.Property.Intensity >= 0) DialogFocusItem.Property.Effect = ["Egged", "Vibrating"]; - - // Adds the lock effect back if it was padlocked - if ((DialogFocusItem.Property.LockedBy != null) && (DialogFocusItem.Property.LockedBy != "")) { - if (DialogFocusItem.Property.Effect == null) DialogFocusItem.Property.Effect = []; - DialogFocusItem.Property.Effect.push("Lock"); - } - - CharacterLoadEffect(C); - if (C.ID == 0) ServerPlayerAppearanceSync(); - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - ChatRoomPublishCustomAction("Dildo" + ((Modifier > 0) ? "Increase" : "Decrease") + "To" + DialogFocusItem.Property.Intensity, true, Dictionary); -} - -// Sets the of the vibe egg -function InventoryItemVulvaClitAndDildoVibratorbeltSetIntensity(Modifier) { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - DialogFocusItem.Property.Intensity = DialogFocusItem.Property.Intensity + Modifier; - if (DialogFocusItem.Property.Intensity == -1) DialogFocusItem.Property.Effect = ["Egged"]; - if (DialogFocusItem.Property.Intensity == 0) DialogFocusItem.Property.Effect = ["Egged", "Vibrating"]; - if (DialogFocusItem.Property.Intensity == 1) DialogFocusItem.Property.Effect = ["Egged", "Vibrating"]; - if (DialogFocusItem.Property.Intensity == 2) DialogFocusItem.Property.Effect = ["Egged", "Vibrating"]; - if (DialogFocusItem.Property.Intensity == 3) DialogFocusItem.Property.Effect = ["Egged", "Vibrating"]; - - // Adds the lock effect back if it was padlocked - if ((DialogFocusItem.Property.LockedBy != null) && (DialogFocusItem.Property.LockedBy != "")) { - if (DialogFocusItem.Property.Effect == null) DialogFocusItem.Property.Effect = []; - DialogFocusItem.Property.Effect.push("Lock"); - } - - CharacterLoadEffect(C); - if (C.ID == 0) ServerPlayerAppearanceSync(); - - ChatRoomPublishCustomAction("Egg" + ((Modifier > 0) ? "Increase" : "Decrease") + "To" + DialogFocusItem.Property.Intensity, true, [{Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}]); -} diff --git a/Screens/Inventory/ItemVulva/FuturisticVibrator/FuturisticVibrator.js b/Screens/Inventory/ItemVulva/FuturisticVibrator/FuturisticVibrator.js deleted file mode 100644 index 6ce4ff932..000000000 --- a/Screens/Inventory/ItemVulva/FuturisticVibrator/FuturisticVibrator.js +++ /dev/null @@ -1,271 +0,0 @@ -"use strict"; - -var ItemVulvaFuturisticVibratorTriggers = ["Increase", "Decrease", "Disable", "Edge", "Random", "Deny", "Tease", "Shock"]; -var ItemVulvaFuturisticVibratorTriggerValues = []; - -const ItemVulvaFuturisticVibratorAccessMode = { - EVERYONE: "", - PROHIBIT_SELF: "ProhibitSelf", - LOCK_MEMBER_ONLY: "LockMember", -} -const ItemVulvaFuturisticVibratorAccessModes = Object.values(ItemVulvaFuturisticVibratorAccessMode); - -function InventoryItemVulvaFuturisticVibratorLoad() { - var C = (Player.FocusGroup != null) ? Player : CurrentCharacter; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticLoadAccessDenied(); - } else { - VibratorModeLoad([VibratorModeSet.ADVANCED, VibratorModeSet.STANDARD]); - if ((DialogFocusItem != null) && (DialogFocusItem.Property != null) && (DialogFocusItem.Property.TriggerValues == null)) DialogFocusItem.Property.TriggerValues = CommonConvertArrayToString(ItemVulvaFuturisticVibratorTriggers); - - ItemVulvaFuturisticVibratorTriggerValues = DialogFocusItem.Property.TriggerValues.split(','); - - // Only create the inputs if the zone isn't blocked - ItemVulvaFuturisticVibratorTriggers.forEach((trigger, i) => { - const input = ElementCreateInput("FuturisticVibe" + trigger, "text", "", "12"); - if (input) input.setAttribute("placeholder", ItemVulvaFuturisticVibratorTriggerValues[i]); - }); - } -} - -function InventoryItemVulvaFuturisticVibratorDraw() { - var C = CharacterGetCurrent(); - var Item = DialogFocusItem; - if (InventoryItemFuturisticValidate(C) !== "") { - InventoryItemFuturisticDrawAccessDenied(); - } else { - // Draw the preview & current mode - DrawAssetPreview(1387, 50, DialogFocusItem.Asset); - const mode = DialogFindPlayer((DialogFocusItem.Property.Mode && typeof DialogFocusItem.Property.Mode === "string" ) ? DialogFocusItem.Property.Mode : "Off"); - DrawText(`${DialogFindPlayer("CurrentMode")} ${mode}`, 1500, 375, "white", "gray"); - // Draw each of the triggers and position their inputs - ItemVulvaFuturisticVibratorTriggers.forEach((trigger, i) => { - MainCanvas.textAlign = "right"; - DrawText(DialogFindPlayer("FuturisticVibrator" + trigger), 1400, 450 + 60 * i, "white", "gray"); - MainCanvas.textAlign = "center"; - ElementPosition("FuturisticVibe" + trigger, 1650, 450 + 60 * i, 400); - }); - // Draw the save button - DrawButton(1525, 450 + 60 * ItemVulvaFuturisticVibratorTriggers.length, 350, 64, DialogFindPlayer("FuturisticVibratorSaveVoiceCommands"), "White", ""); - - DrawBackNextButton(1100, 450 + 60 * ItemVulvaFuturisticVibratorTriggers.length, 350, 64, DialogFindPlayer("FuturisticVibratorPermissions" + (Item.Property.AccessMode || "")), "White", "", - () => DialogFindPlayer("FuturisticVibratorPermissions" + InventoryItemVulvaFuturisticVibratorPreviousAccessMode(Item.Property.AccessMode || "")), - () => DialogFindPlayer("FuturisticVibratorPermissions" + InventoryItemVulvaFuturisticVibratorNextAccessMode(Item.Property.AccessMode || ""))); - } -} - -function InventoryItemVulvaFuturisticVibratorPreviousAccessMode(current) { - return ItemVulvaFuturisticVibratorAccessModes[(ItemVulvaFuturisticVibratorAccessModes.indexOf(current) + ItemVulvaFuturisticVibratorAccessModes.length - 1) % ItemVulvaFuturisticVibratorAccessModes.length]; -} - -function InventoryItemVulvaFuturisticVibratorNextAccessMode(current) { - return ItemVulvaFuturisticVibratorAccessModes[(ItemVulvaFuturisticVibratorAccessModes.indexOf(current) + 1) % ItemVulvaFuturisticVibratorAccessModes.length]; -} - -function InventoryItemVulvaFuturisticVibratorClick() { - var C = CharacterGetCurrent(); - var Item = DialogFocusItem; - if (InventoryItemFuturisticValidate(C) !== "") InventoryItemFuturisticClickAccessDenied(); - else if (MouseIn(1885, 25, 90, 90)) InventoryItemVulvaFuturisticVibratorExit(); - else if (MouseIn(1525, 450 + 60 * ItemVulvaFuturisticVibratorTriggers.length, 350, 64)) InventoryItemVulvaFuturisticVibratorClickSet(); - else if (MouseIn(1100, 450 + 60 * ItemVulvaFuturisticVibratorTriggers.length, 350, 64)) { - if (MouseX < 1100 + (350 / 2)) { - InventoryItemVulvaFuturisticVibratorSetAccessMode(C, Item, InventoryItemVulvaFuturisticVibratorPreviousAccessMode(Item.Property.AccessMode || "")); - } else { - InventoryItemVulvaFuturisticVibratorSetAccessMode(C, Item, InventoryItemVulvaFuturisticVibratorNextAccessMode(Item.Property.AccessMode || "")); - } - } -} - - -function InventoryItemVulvaFuturisticVibratorClickSet() { - if ((DialogFocusItem != null) && (DialogFocusItem.Property != null)) { - var ItemVulvaFuturisticVibratorTriggerValuesTemp = []; - for (let I = 0; I < ItemVulvaFuturisticVibratorTriggers.length; I++) { - ItemVulvaFuturisticVibratorTriggerValuesTemp.push((ElementValue("FuturisticVibe" + ItemVulvaFuturisticVibratorTriggers[I]) != "") ? ElementValue("FuturisticVibe" + ItemVulvaFuturisticVibratorTriggers[I]) - : ItemVulvaFuturisticVibratorTriggerValues[I]); - } - - ItemVulvaFuturisticVibratorTriggerValues = ItemVulvaFuturisticVibratorTriggerValuesTemp; - - var temp = CommonConvertArrayToString(ItemVulvaFuturisticVibratorTriggerValues); - - if (temp != "" && typeof temp === "string") { - DialogFocusItem.Property.TriggerValues = temp; - if (CurrentScreen == "ChatRoom") { - var Dictionary = []; - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(CurrentCharacter), MemberNumber: CurrentCharacter.MemberNumber}); - Dictionary.push({Tag: "FocusAssetGroup", AssetGroupName: CurrentCharacter.FocusGroup.Name}); - ChatRoomPublishCustomAction("FuturisticVibratorSaveVoiceCommandsAction", true, Dictionary); - } - InventoryItemVulvaFuturisticVibratorExit(); - } - } -} - -function InventoryItemVulvaFuturisticVibratorExit() { - InventoryItemFuturisticExitAccessDenied(); - for (let I = 0; I <= ItemVulvaFuturisticVibratorTriggers.length; I++) - ElementRemove("FuturisticVibe" + ItemVulvaFuturisticVibratorTriggers[I]); -} - -function InventoryItemVulvaFuturisticVibratorDetectMsg(msg, TriggerValues) { - var commandsReceived = []; - - // If the message is OOC, just return immediately - if (msg.indexOf('(') == 0) return commandsReceived; - - for (let I = 0; I < TriggerValues.length; I++) { - // Don't execute arbitrary regex - let regexString = TriggerValues[I].replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - - // Allow `*` wildcard, and normalize case - regexString = regexString.replace(/\*/g, ".*")//regexString.replaceAll("\\*", ".*") - regexString = regexString.toUpperCase() - - const nonLatinCharRegex = new RegExp('^([^\\x20-\\x7F]|\\\\.\\*)+$'); - let triggerRegex; - - // In general, in most of the Asian language, the full sentence will be considered as one whole word - // Because how regex consider word boundaries to be position between \w -> [A-Za-z0-9_] and \W. - - // So if commands are set to those languages, the command will never be triggered. - // Or if the command is not a word - // This enhancement should allow Asian language commands, and also emoji/special characters - // (e.g. A symbol such as ↑ or ↓, Languages in CJK group such as Chinese, Japanese, and Korean.) - // This should be a fun addition to boost the user's experience. - if (nonLatinCharRegex.test(regexString)) { - triggerRegex = new RegExp(regexString); - } else { - triggerRegex = new RegExp(`\\b${regexString}\\b`); - } - const success = triggerRegex.test(msg); - - if (success) commandsReceived.push(ItemVulvaFuturisticVibratorTriggers[I]); - } - return commandsReceived; -} - -function InventoryItemVulvaFuturisticVibratorSetAccessMode(C, Item, Option) { - if (!Item.Property) VibratorModeSetProperty(Item, VibratorModeOptions[VibratorModeSet.STANDARD][0].Property); - Item.Property.AccessMode = Option; - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, Item.Asset.Group.Name); -} - -function InventoryItemVulvaFuturisticVibratorGetMode(Item, Increase) { - if (Item.Property.Mode == VibratorMode.MAXIMUM) return (Increase ? VibratorMode.MAXIMUM : VibratorMode.HIGH); - if (Item.Property.Mode == VibratorMode.HIGH) return (Increase ? VibratorMode.MAXIMUM : VibratorMode.MEDIUM); - if (Item.Property.Mode == VibratorMode.MEDIUM) return (Increase ? VibratorMode.HIGH : VibratorMode.LOW); - if (Item.Property.Mode == VibratorMode.LOW) return (Increase ? VibratorMode.MEDIUM : VibratorMode.OFF); - - return (Increase ? ((Item.Property.Mode == VibratorMode.OFF) ? VibratorMode.LOW : VibratorMode.MAXIMUM ): VibratorMode.LOW); -} - -function InventoryItemVulvaFuturisticVibratorSetMode(C, Item, Option, IgnoreSame) { - var OldIntensity = Item.Property.Intensity; - VibratorModeSetProperty(Item, Option.Property); - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, Item.Asset.Group.Name); - - if (CurrentScreen == "ChatRoom") { - var Message; - /** @type {ChatMessageDictionary} */ - var Dictionary = [ - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "AssetName", AssetName: Item.Asset.Name }, - ]; - - if (Item.Property.Intensity !== OldIntensity) { - var Direction = Item.Property.Intensity > OldIntensity ? "Increase" : "Decrease"; - Message = "Vibe" + Direction + "To" + Item.Property.Intensity; - } else if (!IgnoreSame) { - Message = "FuturisticVibratorChange"; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - } - - Dictionary.push({ Automatic: true }); - ServerSend("ChatRoomChat", { Content: Message, Type: "Action", Dictionary }); - } - - if (C.OnlineSharedSettings && C.OnlineSharedSettings.ItemsAffectExpressions) { - if (Item.Property.Intensity > -1) { - CharacterSetFacialExpression(C, "Blush", "Medium", 5); - } else { - CharacterSetFacialExpression(C, "Eyebrows", "Soft", 5); - } - } -} - -// Trigger a shock automatically -function InventoryItemVulvaFuturisticVibratorTriggerShock(C, Item) { - - if (CurrentScreen == "ChatRoom") { - /** @type {ChatMessageDictionary} */ - var Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "AssetName", AssetName: Item.Asset.Name}); - Dictionary.push({ ShockIntensity : 2}); - - ServerSend("ChatRoomChat", { Content: "FuturisticVibratorShockTrigger", Type: "Action", Dictionary }); - } - - InventoryShockExpression(C); -} - - -function InventoryItemVulvaFuturisticVibratorHandleChat(C, Item, LastTime) { - if (!Item) return; - if (!Item.Property) VibratorModeSetProperty(Item, VibratorModeOptions[VibratorModeSet.STANDARD][0].Property); - var TriggerValues = Item.Property.TriggerValues && Item.Property.TriggerValues.split(','); - if (!TriggerValues) TriggerValues = ItemVulvaFuturisticVibratorTriggers; - - // Search from latest message backwards, allowing early exit - for (let CH = ChatRoomChatLog.length - 1; CH >= 0; CH--) { - - // Messages are in order, no need to keep looping - if (ChatRoomChatLog[CH].Time <= LastTime) break - - // Skip messages from unauthorized users - if (Item.Property.AccessMode === ItemVulvaFuturisticVibratorAccessMode.PROHIBIT_SELF && ChatRoomChatLog[CH].SenderMemberNumber === Player.MemberNumber) continue; - if (Item.Property.AccessMode === ItemVulvaFuturisticVibratorAccessMode.LOCK_MEMBER_ONLY && ChatRoomChatLog[CH].SenderMemberNumber !== Item.Property.LockMemberNumber) continue; - - var msg = InventoryItemVulvaFuturisticVibratorDetectMsg(ChatRoomChatLog[CH].Chat.toUpperCase(), TriggerValues); - - if (msg.length > 0) { - //vibrator modes, can only pick one - if (msg.includes("Edge")) InventoryItemVulvaFuturisticVibratorSetMode(C, Item, VibratorModeGetOption(VibratorMode.EDGE)); - else if (msg.includes("Deny")) InventoryItemVulvaFuturisticVibratorSetMode(C, Item, VibratorModeGetOption(VibratorMode.DENY)); - else if (msg.includes("Tease")) InventoryItemVulvaFuturisticVibratorSetMode(C, Item, VibratorModeGetOption(VibratorMode.TEASE)); - else if (msg.includes("Random")) InventoryItemVulvaFuturisticVibratorSetMode(C, Item, VibratorModeGetOption(VibratorMode.RANDOM)); - else if (msg.includes("Disable")) InventoryItemVulvaFuturisticVibratorSetMode(C, Item, VibratorModeGetOption(VibratorMode.OFF)); - else if (msg.includes("Increase")) InventoryItemVulvaFuturisticVibratorSetMode(C, Item, VibratorModeGetOption(InventoryItemVulvaFuturisticVibratorGetMode(Item, true)), true); - else if (msg.includes("Decrease")) InventoryItemVulvaFuturisticVibratorSetMode(C, Item, VibratorModeGetOption(InventoryItemVulvaFuturisticVibratorGetMode(Item, false)), true); - - //triggered actions - if (msg.includes("Shock")) InventoryItemVulvaFuturisticVibratorTriggerShock(C, Item); - } - } -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemVulvaFuturisticVibratorScriptDraw(data) { - var PersistentData = data.PersistentData(); - var C = data.C; - var Item = data.Item; - // Only run updates on the player and NPCs - if (C.ID !== 0 && C.MemberNumber !== null) return; - - // Default to some number that just means all messages are viable - if (typeof PersistentData.CheckTime !== "number") PersistentData.CheckTime = 0; - - // Trigger a check if a new message is detected - let lastMsgIndex = ChatRoomChatLog.length - 1 - if (lastMsgIndex >= 0 && ChatRoomChatLog[lastMsgIndex].Time > PersistentData.CheckTime) { - InventoryItemVulvaFuturisticVibratorHandleChat(C, Item, PersistentData.CheckTime); - PersistentData.CheckTime = ChatRoomChatLog[lastMsgIndex].Time; - } - - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemVulva/InflatableVibeDildo/InflatableVibeDildo.js b/Screens/Inventory/ItemVulva/InflatableVibeDildo/InflatableVibeDildo.js deleted file mode 100644 index 15d71383d..000000000 --- a/Screens/Inventory/ItemVulva/InflatableVibeDildo/InflatableVibeDildo.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemVulvaInflatableVibeDildoLoad() { - InventoryItemButtInflVibeButtPlugLoad(); -} - -// Draw the item extension screen -function InventoryItemVulvaInflatableVibeDildoDraw() { - InventoryItemButtInflVibeButtPlugDraw(); -} - -// Catches the item extension clicks -function InventoryItemVulvaInflatableVibeDildoClick() { - InventoryItemButtInflVibeButtPlugClick("InflVibeDildo"); -} diff --git a/Screens/Inventory/ItemVulva/LoversVibrator/LoversVibrator.js b/Screens/Inventory/ItemVulva/LoversVibrator/LoversVibrator.js deleted file mode 100644 index 0a8e8a79d..000000000 --- a/Screens/Inventory/ItemVulva/LoversVibrator/LoversVibrator.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; - -function InventoryItemVulvaLoversVibratorLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemVulvaLoversVibratorDraw() { - var { Asset, Property } = DialogFocusItem; - VibratorModeDrawHeader(); - var ItemMemberNumber = DialogFindPlayer("ItemMemberNumber").replace("Item", Asset.Description); - DrawText(ItemMemberNumber + " " + Property.ItemMemberNumber, 1500, 450, "white", "gray"); - VibratorModeDrawControls([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED], 525); -} - -function InventoryItemVulvaLoversVibratorClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED], 525); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemVulvaLoversVibratorScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemVulva/ShockDildo/ShockDildo.js b/Screens/Inventory/ItemVulva/ShockDildo/ShockDildo.js deleted file mode 100644 index 9c1af5749..000000000 --- a/Screens/Inventory/ItemVulva/ShockDildo/ShockDildo.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemVulvaShockDildoLoad() { - InventoryItemNeckAccessoriesCollarShockUnitLoad(); -} - -// Draw the item extension screen -function InventoryItemVulvaShockDildoDraw() { - InventoryItemNeckAccessoriesCollarShockUnitDraw(); -} - -// Catches the item extension clicks -function InventoryItemVulvaShockDildoClick() { - InventoryItemNeckAccessoriesCollarShockUnitClick(); -} \ No newline at end of file diff --git a/Screens/Inventory/ItemVulva/Stitches/Cross.png b/Screens/Inventory/ItemVulva/Stitches/Cross.png deleted file mode 100644 index 8443a8786..000000000 Binary files a/Screens/Inventory/ItemVulva/Stitches/Cross.png and /dev/null differ diff --git a/Screens/Inventory/ItemVulva/Stitches/Skewed.png b/Screens/Inventory/ItemVulva/Stitches/Skewed.png deleted file mode 100644 index ac6454dbd..000000000 Binary files a/Screens/Inventory/ItemVulva/Stitches/Skewed.png and /dev/null differ diff --git a/Screens/Inventory/ItemVulva/Stitches/Straight.png b/Screens/Inventory/ItemVulva/Stitches/Straight.png deleted file mode 100644 index 372dfef80..000000000 Binary files a/Screens/Inventory/ItemVulva/Stitches/Straight.png and /dev/null differ diff --git a/Screens/Inventory/ItemVulva/Stitches/ZigZag.png b/Screens/Inventory/ItemVulva/Stitches/ZigZag.png deleted file mode 100644 index 3c37c289a..000000000 Binary files a/Screens/Inventory/ItemVulva/Stitches/ZigZag.png and /dev/null differ diff --git a/Screens/Inventory/ItemVulvaPiercings/ClitRing/Base.png b/Screens/Inventory/ItemVulvaPiercings/ClitRing/Base.png deleted file mode 100644 index ca4942ccf..000000000 Binary files a/Screens/Inventory/ItemVulvaPiercings/ClitRing/Base.png and /dev/null differ diff --git a/Screens/Inventory/ItemVulvaPiercings/ClitRing/Leash.png b/Screens/Inventory/ItemVulvaPiercings/ClitRing/Leash.png deleted file mode 100644 index 257e728cc..000000000 Binary files a/Screens/Inventory/ItemVulvaPiercings/ClitRing/Leash.png and /dev/null differ diff --git a/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Bell.png b/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Bell.png deleted file mode 100644 index 1afa11205..000000000 Binary files a/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Bell.png and /dev/null differ diff --git a/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Chain.png b/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Chain.png deleted file mode 100644 index a41ff6d15..000000000 Binary files a/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Chain.png and /dev/null differ diff --git a/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/HaremChain.png b/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/HaremChain.png deleted file mode 100644 index 5bae7d026..000000000 Binary files a/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/HaremChain.png and /dev/null differ diff --git a/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Ring.png b/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Ring.png deleted file mode 100644 index 834341152..000000000 Binary files a/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Ring.png and /dev/null differ diff --git a/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Weight.png b/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Weight.png deleted file mode 100644 index 72cfeaddd..000000000 Binary files a/Screens/Inventory/ItemVulvaPiercings/RoundClitPiercing/Weight.png and /dev/null differ diff --git a/Screens/Inventory/ItemVulvaPiercings/TapedClitEgg/TapedClitEgg.js b/Screens/Inventory/ItemVulvaPiercings/TapedClitEgg/TapedClitEgg.js deleted file mode 100644 index 5ecfc401a..000000000 --- a/Screens/Inventory/ItemVulvaPiercings/TapedClitEgg/TapedClitEgg.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; -function InventoryItemVulvaPiercingsTapedClitEggLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemVulvaPiercingsTapedClitEggDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemVulvaPiercingsTapedClitEggClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemVulvaPiercingsTapedClitEggScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/ItemVulvaPiercings/VibeHeartClitPiercing/VibeHeartClitPiercing.js b/Screens/Inventory/ItemVulvaPiercings/VibeHeartClitPiercing/VibeHeartClitPiercing.js deleted file mode 100644 index 6af529a9c..000000000 --- a/Screens/Inventory/ItemVulvaPiercings/VibeHeartClitPiercing/VibeHeartClitPiercing.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -function InventoryItemVulvaPiercingsVibeHeartClitPiercingLoad() { - VibratorModeLoad([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemVulvaPiercingsVibeHeartClitPiercingDraw() { - VibratorModeDraw([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -function InventoryItemVulvaPiercingsVibeHeartClitPiercingClick() { - VibratorModeClick([VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED]); -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsItemVulvaPiercingsVibeHeartClitPiercingScriptDraw(data) { - VibratorModeScriptDraw(data); -} diff --git a/Screens/Inventory/Mask/BunnyMask1/Earless.png b/Screens/Inventory/Mask/BunnyMask1/Earless.png deleted file mode 100644 index 1ebe2c807..000000000 Binary files a/Screens/Inventory/Mask/BunnyMask1/Earless.png and /dev/null differ diff --git a/Screens/Inventory/Mask/BunnyMask1/Ears.png b/Screens/Inventory/Mask/BunnyMask1/Ears.png deleted file mode 100644 index ea868a766..000000000 Binary files a/Screens/Inventory/Mask/BunnyMask1/Ears.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/DotsBoth.png b/Screens/Inventory/Mask/Glitter/DotsBoth.png deleted file mode 100644 index 080ab62f6..000000000 Binary files a/Screens/Inventory/Mask/Glitter/DotsBoth.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/DotsLeft.png b/Screens/Inventory/Mask/Glitter/DotsLeft.png deleted file mode 100644 index b5d992c95..000000000 Binary files a/Screens/Inventory/Mask/Glitter/DotsLeft.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/DotsRight.png b/Screens/Inventory/Mask/Glitter/DotsRight.png deleted file mode 100644 index 59cdcaebf..000000000 Binary files a/Screens/Inventory/Mask/Glitter/DotsRight.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/Freckles.png b/Screens/Inventory/Mask/Glitter/Freckles.png deleted file mode 100644 index 002c41644..000000000 Binary files a/Screens/Inventory/Mask/Glitter/Freckles.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/FrecklesSmall.png b/Screens/Inventory/Mask/Glitter/FrecklesSmall.png deleted file mode 100644 index 73f41cbd0..000000000 Binary files a/Screens/Inventory/Mask/Glitter/FrecklesSmall.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/MidFreckles.png b/Screens/Inventory/Mask/Glitter/MidFreckles.png deleted file mode 100644 index 10537beb7..000000000 Binary files a/Screens/Inventory/Mask/Glitter/MidFreckles.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/MidFrecklesSmall.png b/Screens/Inventory/Mask/Glitter/MidFrecklesSmall.png deleted file mode 100644 index 8d6c855d8..000000000 Binary files a/Screens/Inventory/Mask/Glitter/MidFrecklesSmall.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/SplitFreckles.png b/Screens/Inventory/Mask/Glitter/SplitFreckles.png deleted file mode 100644 index 674d9f800..000000000 Binary files a/Screens/Inventory/Mask/Glitter/SplitFreckles.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/SplitFrecklesSmall.png b/Screens/Inventory/Mask/Glitter/SplitFrecklesSmall.png deleted file mode 100644 index cec684e29..000000000 Binary files a/Screens/Inventory/Mask/Glitter/SplitFrecklesSmall.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/StarsBoth.png b/Screens/Inventory/Mask/Glitter/StarsBoth.png deleted file mode 100644 index c70e514aa..000000000 Binary files a/Screens/Inventory/Mask/Glitter/StarsBoth.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/StarsLeft.png b/Screens/Inventory/Mask/Glitter/StarsLeft.png deleted file mode 100644 index 56c1a13ae..000000000 Binary files a/Screens/Inventory/Mask/Glitter/StarsLeft.png and /dev/null differ diff --git a/Screens/Inventory/Mask/Glitter/StarsRight.png b/Screens/Inventory/Mask/Glitter/StarsRight.png deleted file mode 100644 index 88df4e108..000000000 Binary files a/Screens/Inventory/Mask/Glitter/StarsRight.png and /dev/null differ diff --git a/Screens/Inventory/Mask/HeadHarness/Heavy.png b/Screens/Inventory/Mask/HeadHarness/Heavy.png deleted file mode 100644 index cea880e68..000000000 Binary files a/Screens/Inventory/Mask/HeadHarness/Heavy.png and /dev/null differ diff --git a/Screens/Inventory/Mask/HeadHarness/Simple.png b/Screens/Inventory/Mask/HeadHarness/Simple.png deleted file mode 100644 index d395379f0..000000000 Binary files a/Screens/Inventory/Mask/HeadHarness/Simple.png and /dev/null differ diff --git a/Screens/Inventory/Mask/PetNose/c0.png b/Screens/Inventory/Mask/PetNose/c0.png deleted file mode 100644 index afe56a61f..000000000 Binary files a/Screens/Inventory/Mask/PetNose/c0.png and /dev/null differ diff --git a/Screens/Inventory/Mask/PetNose/c1.png b/Screens/Inventory/Mask/PetNose/c1.png deleted file mode 100644 index 442e809f5..000000000 Binary files a/Screens/Inventory/Mask/PetNose/c1.png and /dev/null differ diff --git a/Screens/Inventory/Mask/PetNose/c2.png b/Screens/Inventory/Mask/PetNose/c2.png deleted file mode 100644 index 329400cdc..000000000 Binary files a/Screens/Inventory/Mask/PetNose/c2.png and /dev/null differ diff --git a/Screens/Inventory/Mask/PetNose/m0.png b/Screens/Inventory/Mask/PetNose/m0.png deleted file mode 100644 index a3d6dc2a0..000000000 Binary files a/Screens/Inventory/Mask/PetNose/m0.png and /dev/null differ diff --git a/Screens/Inventory/Mask/PetNose/m1.png b/Screens/Inventory/Mask/PetNose/m1.png deleted file mode 100644 index afe56a61f..000000000 Binary files a/Screens/Inventory/Mask/PetNose/m1.png and /dev/null differ diff --git a/Screens/Inventory/Mask/PetNose/n0.png b/Screens/Inventory/Mask/PetNose/n0.png deleted file mode 100644 index f4421b1b5..000000000 Binary files a/Screens/Inventory/Mask/PetNose/n0.png and /dev/null differ diff --git a/Screens/Inventory/Mask/PetNose/n1.png b/Screens/Inventory/Mask/PetNose/n1.png deleted file mode 100644 index afe56a61f..000000000 Binary files a/Screens/Inventory/Mask/PetNose/n1.png and /dev/null differ diff --git a/Screens/Inventory/Mask/PetNose/w0.png b/Screens/Inventory/Mask/PetNose/w0.png deleted file mode 100644 index afe56a61f..000000000 Binary files a/Screens/Inventory/Mask/PetNose/w0.png and /dev/null differ diff --git a/Screens/Inventory/Mask/PetNose/w1.png b/Screens/Inventory/Mask/PetNose/w1.png deleted file mode 100644 index c1dc91cd1..000000000 Binary files a/Screens/Inventory/Mask/PetNose/w1.png and /dev/null differ diff --git a/Screens/Inventory/Mask/PetNose/w2.png b/Screens/Inventory/Mask/PetNose/w2.png deleted file mode 100644 index 369d9d9f2..000000000 Binary files a/Screens/Inventory/Mask/PetNose/w2.png and /dev/null differ diff --git a/Screens/Inventory/Necklace/ChokerTattoo/Flowers.png b/Screens/Inventory/Necklace/ChokerTattoo/Flowers.png deleted file mode 100644 index df3b9db96..000000000 Binary files a/Screens/Inventory/Necklace/ChokerTattoo/Flowers.png and /dev/null differ diff --git a/Screens/Inventory/Necklace/ChokerTattoo/Loops.png b/Screens/Inventory/Necklace/ChokerTattoo/Loops.png deleted file mode 100644 index f8c801bcf..000000000 Binary files a/Screens/Inventory/Necklace/ChokerTattoo/Loops.png and /dev/null differ diff --git a/Screens/Inventory/Necklace/NecklaceKey/Normal.png b/Screens/Inventory/Necklace/NecklaceKey/Normal.png deleted file mode 100644 index f2389ffe8..000000000 Binary files a/Screens/Inventory/Necklace/NecklaceKey/Normal.png and /dev/null differ diff --git a/Screens/Inventory/Necklace/NecklaceKey/Tucked.png b/Screens/Inventory/Necklace/NecklaceKey/Tucked.png deleted file mode 100644 index 250b30e55..000000000 Binary files a/Screens/Inventory/Necklace/NecklaceKey/Tucked.png and /dev/null differ diff --git a/Screens/Inventory/Necklace/NecklaceLock/Normal.png b/Screens/Inventory/Necklace/NecklaceLock/Normal.png deleted file mode 100644 index f2389ffe8..000000000 Binary files a/Screens/Inventory/Necklace/NecklaceLock/Normal.png and /dev/null differ diff --git a/Screens/Inventory/Necklace/NecklaceLock/Tucked.png b/Screens/Inventory/Necklace/NecklaceLock/Tucked.png deleted file mode 100644 index 250b30e55..000000000 Binary files a/Screens/Inventory/Necklace/NecklaceLock/Tucked.png and /dev/null differ diff --git a/Screens/Inventory/Necklace/NecklaceRope/Long.png b/Screens/Inventory/Necklace/NecklaceRope/Long.png deleted file mode 100644 index df59bb768..000000000 Binary files a/Screens/Inventory/Necklace/NecklaceRope/Long.png and /dev/null differ diff --git a/Screens/Inventory/Necklace/NecklaceRope/Short.png b/Screens/Inventory/Necklace/NecklaceRope/Short.png deleted file mode 100644 index 34dcd7aab..000000000 Binary files a/Screens/Inventory/Necklace/NecklaceRope/Short.png and /dev/null differ diff --git a/Screens/Inventory/Panties/Diapers4/Butterflies.png b/Screens/Inventory/Panties/Diapers4/Butterflies.png deleted file mode 100644 index db45c71c1..000000000 Binary files a/Screens/Inventory/Panties/Diapers4/Butterflies.png and /dev/null differ diff --git a/Screens/Inventory/Panties/Diapers4/Flower.png b/Screens/Inventory/Panties/Diapers4/Flower.png deleted file mode 100644 index 93393d845..000000000 Binary files a/Screens/Inventory/Panties/Diapers4/Flower.png and /dev/null differ diff --git a/Screens/Inventory/Panties/Diapers4/None.png b/Screens/Inventory/Panties/Diapers4/None.png deleted file mode 100644 index 71c31bcc5..000000000 Binary files a/Screens/Inventory/Panties/Diapers4/None.png and /dev/null differ diff --git a/Screens/Inventory/Panties/Diapers4/Spots.png b/Screens/Inventory/Panties/Diapers4/Spots.png deleted file mode 100644 index 2c2fd4be1..000000000 Binary files a/Screens/Inventory/Panties/Diapers4/Spots.png and /dev/null differ diff --git a/Screens/Inventory/Panties/Diapers4/StrawBerry.png b/Screens/Inventory/Panties/Diapers4/StrawBerry.png deleted file mode 100644 index ab5ccde5b..000000000 Binary files a/Screens/Inventory/Panties/Diapers4/StrawBerry.png and /dev/null differ diff --git a/Screens/Inventory/Panties/PoofyDiaper/ExtraPadding.png b/Screens/Inventory/Panties/PoofyDiaper/ExtraPadding.png deleted file mode 100644 index 516d9c310..000000000 Binary files a/Screens/Inventory/Panties/PoofyDiaper/ExtraPadding.png and /dev/null differ diff --git a/Screens/Inventory/Panties/PoofyDiaper/RegularPadding.png b/Screens/Inventory/Panties/PoofyDiaper/RegularPadding.png deleted file mode 100644 index 34c124a34..000000000 Binary files a/Screens/Inventory/Panties/PoofyDiaper/RegularPadding.png and /dev/null differ diff --git a/Screens/Inventory/Panties/SilkStraps/Panties1.png b/Screens/Inventory/Panties/SilkStraps/Panties1.png deleted file mode 100644 index 7d0f12c02..000000000 Binary files a/Screens/Inventory/Panties/SilkStraps/Panties1.png and /dev/null differ diff --git a/Screens/Inventory/Panties/SilkStraps/Strips.png b/Screens/Inventory/Panties/SilkStraps/Strips.png deleted file mode 100644 index 409a76390..000000000 Binary files a/Screens/Inventory/Panties/SilkStraps/Strips.png and /dev/null differ diff --git a/Screens/Inventory/Panties/SilkStraps/Thong.png b/Screens/Inventory/Panties/SilkStraps/Thong.png deleted file mode 100644 index ba41fe29e..000000000 Binary files a/Screens/Inventory/Panties/SilkStraps/Thong.png and /dev/null differ diff --git a/Screens/Inventory/Panties/SilkStraps/Wrap.png b/Screens/Inventory/Panties/SilkStraps/Wrap.png deleted file mode 100644 index 46236c46e..000000000 Binary files a/Screens/Inventory/Panties/SilkStraps/Wrap.png and /dev/null differ diff --git a/Screens/Inventory/Shoes/FuturisticHeels2/Matte.png b/Screens/Inventory/Shoes/FuturisticHeels2/Matte.png deleted file mode 100644 index c32189908..000000000 Binary files a/Screens/Inventory/Shoes/FuturisticHeels2/Matte.png and /dev/null differ diff --git a/Screens/Inventory/Shoes/FuturisticHeels2/Shiny.png b/Screens/Inventory/Shoes/FuturisticHeels2/Shiny.png deleted file mode 100644 index 866cc67b4..000000000 Binary files a/Screens/Inventory/Shoes/FuturisticHeels2/Shiny.png and /dev/null differ diff --git a/Screens/Inventory/Wings/SteampunkWings/SteampunkWings.js b/Screens/Inventory/Wings/SteampunkWings/SteampunkWings.js deleted file mode 100644 index e7e97bf8b..000000000 --- a/Screens/Inventory/Wings/SteampunkWings/SteampunkWings.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -/** @type {DynamicBeforeDrawCallback} */ -function AssetsWingsSteampunkWingsBeforeDraw({ PersistentData, L, LayerType: lt }) { - const MaxFrame = 8; - const MaxFrameGears = 2; - const Data = PersistentData(); - if (typeof Data.State !== "number") Data.State = 0; - if (typeof Data.StateGears !== "number") Data.StateGears = 0; - if (typeof Data.Modifier !== "number") Data.Modifier = 1; - if (typeof Data.ModifierGears !== "number") Data.ModifierGears = 1; - - // Gears - if (L.includes("Gears")) { - return { LayerType: Data.StateGears === 0 ? '' : Data.StateGears}; - } - - // Others - if (!L.includes("Wing")) return; - - // Wings - - if (Data.DrawRequested) { - if (Data.FrameTime > 250) { - Data.State = Math.floor(Math.random() * MaxFrame); - Data.StateGears = Math.floor(Math.random() * MaxFrameGears); - } else { - if (Data.State == MaxFrame) Data.Modifier = -1; - if (Data.State == 0) Data.Modifier = 1; - if (Data.StateGears == MaxFrameGears) Data.ModifierGears = -1; - if (Data.StateGears == 0) Data.ModifierGears = 1; - Data.State += Data.Modifier; - Data.StateGears += Data.ModifierGears; - } - } - - Data.DrawRequested = false; - const LayerType = Data.State === 0 ? '' : Data.State; - return { LayerType }; -} - -/** @type {DynamicScriptDrawCallback} */ -function AssetsWingsSteampunkWingsScriptDraw({ C, Item, PersistentData }) { - const Type = (Item.Property || {}).Type; - if (Type !== "On") return; - - const Data = PersistentData(); - - if (typeof Data.FrameTime !== "number") - Data.FrameTime = Player.GraphicsSettings ? Math.max(250, (Player.GraphicsSettings.AnimationQuality * 0.5)) : 250; - if (typeof Data.ChangeTime !== "number") Data.ChangeTime = CommonTime() + Data.FrameTime; - - if (Data.ChangeTime < CommonTime()) { - Data.FrameTime = Player.GraphicsSettings ? Math.max(250, (Player.GraphicsSettings.AnimationQuality * 0.5)) : 250; - Data.ChangeTime = CommonTime() + Data.FrameTime; - Data.DrawRequested = true; - AnimationRequestRefreshRate(C, Data.FrameTime); - AnimationRequestDraw(C); - } -} diff --git a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv index d7b2b38d2..1da0d4bb7 100644 --- a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv +++ b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv @@ -1,18 +1,14 @@ +KDLogo2,By Strait-Laced Games + KinkyDungeonCredits,Credits KinkyDungeonPatrons,Patrons KinkyDungeonDeviantart,News and Updates KinkyDungeonPatreon,Support @ Patreon -KinkyDungeonPatronsList0,"Thank you to the following awesome people for supporting me at patreon.com/ada18980|cyberjoel|Samantha Lear|Kara|The-Fisher-King|Laioken|Finn|selly-grim|Dex♪|Churro|Gamefan|Shogo|X27|Blox|Slacker|Nikos S.|Flame|Alexis Octavia|Dmitri S.|Noxgarm|Siegfried K.|Hellgete" -KinkyDungeonPatronsList1,"|nuzzles|Rest|LoudestQuietPerson|Violet EverGardner|BoopleDoopleson|Dazman1234|WATA|linlizheng|Mechio|Vikingberserker|PWMRM|devan|LukeB|atetete|Aussie895|0xA4C1B842|Rika|Physicsphail|Loony|Jeremy P.|ItsYahboi9" -KinkyDungeonPatronsList2,"|AlexisTheFlame|Chen Yu|Sinohisaki|nnm711|Ron lsrp|Miro|Anthony R.|John T.|Geng114514|塵狐|kamil|Iaysakuya|tsang|Somprad|Thatguu|damit damit|Victor|Hjake2|anton A.|Dakra|CuvyanTaylor|" -KinkyDungeonPatronsList3,"|hanhan|The_rogue1|Tatsuya S.|James K.|Misa|eddy z.|theshrimpyone|Eislobo|OTKTamashii|Michael M.|Jose G.|Minescence|HanQing Z.|hanhan|Shakymunch|Crimson|Arentios|Vini J.|Treemen555|Lordfabricator|ML" -KinkyDungeonPatronsList4,"Hannes|Isaiah L.|darklink11|Cerb|Diablo200|RNFRaptor|CMDR Salen|daniel C.|NDW|Sewdah N.|Sylicix|Wossa|ComradeArmtyom|逗比 徐|Null Fame|zipidyzap|Mister Mythe|Yagami Yami|Phoenix|Kritsanapong J.|Pyron|Tobi" -KinkyDungeonPatronsList5,"Traynfreek|森 韩|Meekohi|GRASS|Heavy Blues|Girador|Sinohisaki|Nymjii|Linex|werty989898|John H.|Hideki H.|Izzzzzz|Zhenyu G.|Animi|Hungvipbcsok|uiy|Joecoolzx|Claire S.|koch|Snekus|Jeff C|" -KinkyDungeonPatronsList6,"DemonQueenSera|John1304|Masaki H|Eric R.|Rei H.|hSXZM|Kieraakari|Pyros51" +KinkyDungeonPatronsList,"Thank you to the following awesome people for supporting me at patreon.com/ada18980" KinkyDungeonBack,Back KinkyDungeonNext,Next -KinkyDungeonCreditsList0,"Music: kocaeli|Bound enemy graphics: Song|CN Translation: Alexthymia|KR, JP Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Audio:|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi" -KinkyDungeonCreditsList1,"Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators" +KinkyDungeonCreditsList0,"Music: kocaeli, Darkstar Studios|Bound enemy graphics: Song|RU Translation: Osiris|CN Translation: Alexthymia, Mitki, Timeline|KR, JP Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Art: Kjus, Quakehoof, Lumpychan, Kertasu, Koirin, Lightning Rook, Daikinbakuju, Sigma Overlord, dask3|Plasmadragon, GoldieKitsune, SMoonlightM, PureWind, Wyatt Wintersoul|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi" +KinkyDungeonCreditsList1,"Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|AlaskaRobotics - duct tape unroll 3, duct tape unroll 1|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators" Language,Language EN,English @@ -20,6 +16,8 @@ CN,Chinese KR,Korean JP,Japanese ES,Spanish +FR,French +RU,Russian KDMods,Mods KDModsLoaded,Mods Loaded. @@ -28,41 +26,134 @@ RestartNeededCN,"需要重启!" RestartNeededKR,"재시작 필요!" RestartNeededJP,"Restart please!" RestartNeededES,"¡Reinicio!" +RestartNeededFR,"Rechargement requis!" +RestartNeededRU,"Restart required!" -KinkyDungeon,"Kinky Dungeon v4.22" +KDVersion,"Version" +KinkyDungeon,"Kinky Dungeon" +KDVersionStr,"5.4.40" +KDLogo2,"By Ada18980" Intro,"You are an adventurer descending into an ancient underground city of magic." Intro2,"Beneath its depths lies the Mistress' Staff, an artifact of untold power." Intro3,"Will you prevail against forces unknown, or succumb to its dark secrets?" -Intro4,"(This game does not contain spiders or any carnivorous creatures/plants)" -Intro4BC,"(Check out the latest standalone version at the News and Updates link below!)" +Intro4,"(This game does not contain spiders)" +Intro4BC,"" +KDToggleTabGFX,GFX +KDToggleTabClothes,Character +KDToggleTabMain,Main +KDToggleTabUI,UI +KDToggleTabControls,Controls +KDToggleTabKeybindings,Keybindings + +KDToggleBindPercent,Show Enemy Binding as % +KDToggleAutoWaitDelayed,Auto-wait Through Delayed Actions + +KDToggleMMLabels,Show Minimap Labels +KDToggle,Auto loot all from chests +KDToggleNoOutfitPalette,Use Palette regardless of Outfit + +KDToggleApplyPaletteRestraint,Apply palettes to Restraints +KDToggleApplyPaletteTransform,Apply palettes to transforms + +KDToggleIgnoreApplyCharPalette,Don't use character palette +KDToggleAlwaysApplyCharPalette,Always use character palette +KDToggleDefaultApplyCharPalette,Use character palette for default outfit + +KDToggleBackgrounds,Show Background Art +KDToggleOptRender,Experimental Rendering (unstable) + +KDToggleSoundOffWhenMin,Mute when Minimized +KDToggleBackgrounds,Show Background Art +KDToggleRawDP,Show DP instead of % +KDToggleOnlySelfQuickInv,Quick Inv only equips to self +KDToggleOverrideOutfit,Override Outfit when Loading Save +KDToggleSaveOutfit,Save Outfits within Save Files +KDToggleShowNPCSprites,Show free characters on map +KDToggleShowJailedNPCSprites,Detailed jailed NPCs (experimental) +KDToggleStruggleBars,Show Struggle Bars +KDToggleAllowSusMods,Allow Suspicious Mods +KDToggleAutoLoadMods,Auto Load Mods (offline only) +KDToggleSpellBook,Classic Inventory Background +KDToggleSkipIntro,Skip Intro +KDToggleNoForceGreet,No Forced Greetings +KDToggleShowZoom,Show Zoom Buttons +KDToggleShowRestraintOnHover,Show Restraint Info on Escape Hover +KDToggleForceWarnings,Always Show Warnings +KDToggleEnableMinimap,Always Show Minimap KDToggleSound,Enable Sound -KDToggleDrool,Enable Drool/Tears +KDToggleDrool,Drool/Tears KDToggleDrawArmor,Draw Armor KDToggleMusic,Enable Music +KDToggleAsyncRendering,Async Rendering (beta) +KDToggleBloom,Bloom & Glow +KDToggleTransparentUI,Transparent UI KDToggleTurnCounter,Turn Counter KDToggleStunFlash,Flash Screen on Stun -KDToggleArousalHearts,Advanced Distraction VFX -KDToggleVibeHearts,Advanced Toy VFX +KDToggleParticlesFX,Map Particles +KDToggleArousalHearts,Distraction Particles +KDToggleVibeHearts,Vibration Particles +KDToggleGagParticles,Gag Particle FX KDToggleShowNPCStatuses,Show NPC Status -KDToggleFancyWalls,Advanced Fog of War +KDToggleShowSpellRange,Show Spell Range +KDToggleFancyWalls,Trim Edge Walls +KDToggleFancyShadows,Fog Shader +KDToggleLightmapFilter,Light Shader KDToggleIntenseOrgasm,Intense 'Let Go' VFX KDToggleVibeSounds,Enable Toy SFX KDToggleFullscreen,Enable Fullscreen +KDToggleHighResDisplacement,Hi-Res Distortion (Needs Restart) +KDToggleHiResModel,Hi-Res Model (no restart needed) KDToggleGraphicsQuality,High Quality Animations -KinkyDungeonFastWait,Wait Quickly - +KDToggleEnemyAnimations,Enemy Animations +KDToggleLazyWalk,One-Click Move (when slowed) +KDToggleShiftLatch,Latch Shift Key +KDToggleCrotchRopeOption,Crotch Rope under panties +KDToggleChastityOption,Chastity over Panties +KDToggleChastityOption2,Chastity over Harness +KDToggleChastityBraOption,Chastity Bra over Bras +KDToggleSimpleColorPicker,Simple Color Picker +KDToggleCenter,Center Player +KDToggleBuffSide,Draw Buffs on Side +KDToggleShowPath,Show Trajectory on Auto-Path +KDToggleShowFacing,Show Player Facing +KDToggleShowSameCatSpells,Show more learnable spells +KDTogglePlayerAura,Show Player Buff Auras +KDToggleEnemyAura,Show Enemy Buff Auras +KDToggleOutlineAura,Minimalist Enemy Auras +KDToggleNearestNeighbor,Pixelated GFX (needs restart) +KDToggleAutoCrouchOnTrip,Auto-Crouch when Tripped +KDToggleRetroAnim,Retro Animations +KDToggleFlipStatusBars,Flip Status Bars +KDToggleHelper,Reduce Accidental Wall Clicks +KDToggleNipples,Enable Nipples +KDToggleNippleToysOption,Show Nipple Toys Over Bras +KDToggleNippleToysHide,Hide Nipple Clamps +KDToggleNipplePiercingsHide,Hide Nipple Piercings +KDToggleForcePalette,Use default palette when no outfit is worn +KDToggleFlipPlayer,Flip Player Display +KDToggleGreyscaleBlindness,Grayscale when Blind +KDToggleFastFloaters,Faster Floater Fade +KDToggleNoDmgFloaters,No Damage Floaters +KDToggleDynamicArmor,Dynamic Armor (must hide armor) +KDToggleHideFloatingWeapon,Hide floating weapon display +KDToggleAutoLoot,Automatically Take All from Chests KDHelpless,Helpless! KDMissed,Evaded! KDBlocked,Blocked! -KDBlockedRestraint,Blocked restraint! +KDBlockedRestraint,Resisted Bondage! KDWallBump,You bump into a wall. +KDResolution,Game Resolution: +KDResolutionConfirm,Resolution (needs reload): KDVibeVolume,Toy Volume: KDMusicVolume,Music Volume: KDSfxVolume,SFX Volume: KDAnimSpeed,Animation Time: - +KDGamma,Map Brightness: +KDSelectedFont,Game Font: +KDButtonFont,Button Font: +KinkyDungeonJourneyMap,Journey KinkyDungeonJourney,"Select a journey. This will determine the ordering of game areas." KinkyDungeonJourney0,"Standard: The intended experience" KinkyDungeonJourney1,"Random: A chaotic journey" @@ -72,13 +163,14 @@ KinkyDungeonStats,"Select perks to start with." KinkyDungeonStats2,"Having 10+ spare points will trigger Hard Mode, granting unique loot." KDHardMode," (HARD MODE ENABLED)" KinkyDungeonStartGameAdv,"Advanced start (choose perks)" -KinkyDungeonStartGameQuick,"Confirm and start playing!" +KinkyDungeonStartGameKinky,"Kinky start" +KinkyDungeonStartGameQuick,"Normal start" KinkyDungeonStatCost,"Point Cost: AMOUNT" KinkyDungeonStatPoints,"Points Available: AMOUNT" KinkyDungeonStatResilientFoes,"Resilient Foes" -KinkyDungeonStatDescResilientFoes,"Enemies take 30% less damage." +KinkyDungeonStatDescResilientFoes,"Enemies have 30% more hp." KinkyDungeonStat0,"Strong" KinkyDungeonStatDesc0,"Boosts the Struggle option when escaping." @@ -103,7 +195,7 @@ KinkyDungeonStatDesc7,"All spells above 1st level cost 2x as many spell points." KinkyDungeonStat8,"Blessed" KinkyDungeonStatDesc8,"You can drink mana from the shrine fountains once per floor without chance of punishment." KinkyDungeonStat9,"Cursed" -KinkyDungeonStatDesc9,"Goddess reputations start at 0 and can never exceed 25." +KinkyDungeonStatDesc9,"Goddess reputations can never exceed 25." KinkyDungeonStat10,"Submissive" KinkyDungeonStatDesc10,"Your submissiveness starts at 100 and cannot go below 70." @@ -111,7 +203,7 @@ KinkyDungeonStat11,"Wanted" KinkyDungeonStatDesc11,"Your security level starts at 100 and cannot go below 70." KinkyDungeonStat12,"Studious" -KinkyDungeonStatDesc12,"You start the game with +3 additional spell points." +KinkyDungeonStatDesc12,"You start the game with +1 spell point. Your first two spell categories are free." KinkyDungeonStat13,"Meditation" KinkyDungeonStatDesc13,"You slowly regenerate mana, up to a maximum of 50." @@ -126,14 +218,32 @@ KinkyDungeonStat19,"Distracted" KinkyDungeonStatDesc19,"+15% miscast chance (at all times)" KinkyDungeonStat20,"Brawler" -KinkyDungeonStatDesc20,"Unarmed attacks deal +10 damage." +KinkyDungeonStatDesc20,"Unarmed attacks deal +10 damage and being bound does not decrease unarmed damage." + +KinkyDungeonStatUnarmedGrope,"Way of the Squish" +KinkyDungeonStatDescUnarmedGrope,"Unarmed attacks deal grope damage against humans." +KinkyDungeonStatUnarmedPain,"Way of the Spank" +KinkyDungeonStatDescUnarmedPain,"Unarmed attacks deal pain damage against humans." +KinkyDungeonStatUnarmedTickle,"Way of the Feather" +KinkyDungeonStatDescUnarmedTickle,"Unarmed attacks deal tickle damage against humans." + +KinkyDungeonStatUnarmedSuck,"Harmless" +KinkyDungeonStatDescUnarmedSuck,"Unarmed attacks deal half damage and cost 2x as much stamina." + + KinkyDungeonStat21,"Clumsy" KinkyDungeonStatDesc21,"0.7x base accuracy" + KinkyDungeonStatUnfocused,"Unfocused" KinkyDungeonStatDescUnfocused,"Accuracy multiplied by 0.9x above 10% distraction, down to 0.6x at 90% distraction." +KinkyDungeonStatFocused,"Focused Strikes" +KinkyDungeonStatDescFocused,"90% less accuracy penalty on swung weapons due to distraction." +KinkyDungeonStatFocusedStaff,"Focused Power" +KinkyDungeonStatDescFocusedStaff,"90% less stamina cost penalty on staves and similar weapons distraction." + KinkyDungeonStat22,"Pristine" -KinkyDungeonStatDesc22,"There are no shiny loot objects in the dungeon." +KinkyDungeonStatDesc22,"There are significantly less shiny loot objects in the dungeon." KinkyDungeonStat23,"Lost Technology" KinkyDungeonStatDesc23,"Ancient power cores break with use, and cannot be recharged." @@ -144,7 +254,7 @@ KinkyDungeonStat27,"Damsel in Chains" KinkyDungeonStatDesc27,"Metal restraints are harder to escape from." KinkyDungeonStatForgetful,"Forgetful" -KinkyDungeonStatDescForgetful,"You don't remember where you've been in the level." +KinkyDungeonStatDescForgetful,"You don't remember where you've been in the level. 30 turn timer." KinkyDungeonStatCursedLocks,"Cursed Locks" KinkyDungeonStatDescCursedLocks,"Those without keys shall face the Wrath of the Lock. Locked items cannot be cut and are harder to struggle." @@ -154,7 +264,7 @@ KinkyDungeonStatDescUndeniable,"Born with an intense submissive desire, you cann KinkyDungeonStatFranticStruggle,"Frantic Struggle" -KinkyDungeonStatDescFranticStruggle,"Your struggling is 3 times as fast, but less efficient in terms of stamina." +KinkyDungeonStatDescFranticStruggle,"Your escaping is 3 times as fast, but less efficient in terms of stamina." KinkyDungeonStat28,"Escape Artist" KinkyDungeonStatDesc28,"Start with high Rope reputation, and all rope restraints are easier to escape from." @@ -166,8 +276,6 @@ KinkyDungeonStatDesc30,"Start with high Latex reputation, and all latex restrain KinkyDungeonStat31,"Latex Doll" KinkyDungeonStatDesc31,"Latex restraints are harder to escape from." -KinkyDungeonStatHogtied,"Hogtied!" -KinkyDungeonStatDescHogtied,"Start the game trussed up in tight ropes." KinkyDungeonStat32,"Escapee" KinkyDungeonStatDesc32,"Start with high Leather reputation, and all leather restraints are easier to escape from." @@ -185,7 +293,15 @@ KinkyDungeonStat37,"Narcoleptic" KinkyDungeonStatDesc37,"You slowly lose stamina over time." KinkyDungeonStat38,"Stealth Mission" -KinkyDungeonStatDesc38,"You are harder to detect and there are more chests, but enemies take 30% less damage, are more evasive, and drop no gold." +KinkyDungeonStatDesc38,"You are harder to detect and there are more chests, but enemies have 50% more HP, are more evasive, and drop no gold." +KinkyDungeonStatCommonToyEdge,"Edging Lovers" +KinkyDungeonStatDescCommonToyEdge,"All humanoids that can bind you also apply edging toys." +KinkyDungeonStatCommonToyDeny,"Denial Lovers" +KinkyDungeonStatDescCommonToyDeny,"All humanoids that can bind you also apply denial toys." +KinkyDungeonStatCommonToyPleasure,"Pleasure Lovers" +KinkyDungeonStatDescCommonToyPleasure,"All humanoids that can bind you also apply pleasurable toys." +KinkyDungeonStatCommonToyTease,"Teasing Lovers" +KinkyDungeonStatDescCommonToyTease,"All humanoids that can bind you also apply teasing toys." KinkyDungeonStatCommonLatex,"Latex Lovers" KinkyDungeonStatDescCommonLatex,"All humanoids that can bind you also apply latex restraints." KinkyDungeonStatCommonLeather,"Leather Lovers" @@ -206,7 +322,7 @@ KinkyDungeonStatDesc39,"Enemies detect you more easily." KinkyDungeonStat40,"Bound Power" KinkyDungeonStatDesc40,"Your damage and evasion increases based on the number of restraints worn, up to +40% when thoroughly bound." KinkyDungeonStat41,"Kill Squad" -KinkyDungeonStatDesc41,"Enemies see you through walls and at greater distance." +KinkyDungeonStatDesc41,"Enemies gain increased blindsight and vision radius." KinkyDungeonStat42,"Supermarket" KinkyDungeonStatDesc42,"Commerce shrines can appear in levels and have slightly more items." @@ -228,12 +344,19 @@ KinkyDungeonStat51,"Search Party" KinkyDungeonStatDesc51,"More enemies spawn during sleep." KinkyDungeonStat52,"No Way Out" -KinkyDungeonStatDesc52,"Enemies will always use the tightest restraints possible and fully bind you." -KinkyDungeonStat53,"Graceful Walk" -KinkyDungeonStatDesc53,"You don't lose stamina when walking with one slowing item, unless it binds your legs together." +KinkyDungeonStatDesc52,"Enemies will always use the tightest restraints possible regardless of willpower. +10 Security level." +KinkyDungeonStat53,"Deft Footwork" +KinkyDungeonStatDesc53,"You ignore some consequences of being mildly slowed from heels or slime, and you can cast Leg spells while slowed significantly at 50% miscast chance." +KinkyDungeonStatPoorForm,"Poor Form" +KinkyDungeonStatDescPoorForm,"Slowing effects on you are amplified." +KinkyDungeonStatSomaticMinus,"Poor Coordination" +KinkyDungeonStatDescSomaticMinus,"You must have both fingers and arms free to cast arm spells. Hand restraints are more effective on you." +KinkyDungeonStatSomaticPlus,"Deft Fingering" +KinkyDungeonStatDescSomaticPlus,"You can cast arm spells using just your fingers, as long as your hands aren't bound." + KinkyDungeonStat54,"Well-Equipped" -KinkyDungeonStatDesc54,"Restraints and traps that are limited by level appear sooner, and enemies will stack many restraints." +KinkyDungeonStatDesc54,"Restraints and traps that are limited by level appear sooner, and enemies stack more restraints in general. +10 security level." KinkyDungeonStat55,"Quick-Draw" KinkyDungeonStatDesc55,"Switching weapons and spells does not take a turn." @@ -248,16 +371,32 @@ KinkyDungeonStatDescSavourTheTaste,"Drinking a potion takes 2 turns" KinkyDungeonStatMagicHands,"Magic Hands" KinkyDungeonStatDescMagicHands,"Enemies can add restraints underneath existing restraints." +KinkyDungeonStatStartLatexIntegration,"Fully Integrated" +KinkyDungeonStatDescStartLatexIntegration,"Start with your body sealed in an adhesive layer of latex." + +KinkyDungeonStatStartCyberDollStorage,"Doll Processing" +KinkyDungeonStatDescStartCyberDollStorage,"Start atop a conveyor on your way to be sealed away inside the Facility." KinkyDungeonStatStartCyberDoll,"Cyber Doll" -KinkyDungeonStatDescStartCyberDoll,"Start in Cyber restraints." +KinkyDungeonStatDescStartCyberDoll,"Start in full Cyber restraints." KinkyDungeonStatFuukaCollar,"Fuuka's Pet" KinkyDungeonStatDescFuukaCollar,"Start with Fuuka's collar and a few restraints." KinkyDungeonStatCommonFuuka,"Fuuka Fan Club" KinkyDungeonStatDescCommonFuuka,"All humanoids that can bind you also apply Fuuka's special restraints." +KinkyDungeonStatWardenBelt,"Collected" +KinkyDungeonStatDescWardenBelt,"Start with The Warden's special belt which punishes you for defiling spell orbs." +KinkyDungeonStatCommonWarden,"Enforcers" +KinkyDungeonStatDescCommonWarden,"All humanoids that can bind you also apply The Warden's cuffs." KinkyDungeonStatCommonCyber,"Dollmaker's Minions" KinkyDungeonStatDescCommonCyber,"All humanoids that can bind you also apply Cyber Doll restraints." -KinkyDungeonStatDollmakerVisor,"Doll Hunter" +KinkyDungeonStatDollmakerVisor,"Doll Hunter V" KinkyDungeonStatDescDollmakerVisor,"You start with the Dollmaker's Visor." +KinkyDungeonStatDollmakerMask,"Doll Hunter M" +KinkyDungeonStatDescDollmakerMask,"You start with the Dollmaker's Mask." +KinkyDungeonStatStartShadow,"Persisting Desires" +KinkyDungeonStatDescStartShadow,"Your dark desires are endless." + +KinkyDungeonStatSugarRush,"Sugar Rush" +KinkyDungeonStatDescSugarRush,"Consuming sweets makes you hyperactive, decreasing stamina costs and granting free moves." KinkyDungeonStatVengeance,"Vengeance" KinkyDungeonStatDescVengeance,"Defeating an enemy greatly distracts you." @@ -269,11 +408,24 @@ KinkyDungeonStatAbsoluteFocus,"Absolute Focus" KinkyDungeonStatDescAbsoluteFocus,"Miscast chance is doubled." KinkyDungeonStatBoundCrusader,"Bound Crusader" -KinkyDungeonStatDescBoundCrusader,"Goddesses will expect you to wear their restraints as their champion." +KinkyDungeonStatDescBoundCrusader,"Goddesses will equip restraints upon acceptance of a quest." KinkyDungeonStatNowhere,"Nowhere is Safe" KinkyDungeonStatDescNowhere,"Beds and furniture are often trapped." + +KinkyDungeonStatQuakeCollar,"Quakehoof Associate" +KinkyDungeonStatDescQuakeCollar,"Start with the Epsilon Collar, which regenerates mana when you play with yourself." +RestraintQuakeCollar,Epsilon Collar +RestraintQuakeCollarDesc,A collar reserved for the most prestigious of submissives. +RestraintQuakeCollarDesc2,"Restores mana when you play with yourself, but increases the distraction given. Only works when Desire is below the limit." + + +KinkyDungeonStatBulletHell,"Bullet Hell" +KinkyDungeonStatDescBulletHell,"Hides warning lines for non-AoE bullets and projectiles." +KinkyDungeonStatBulletHell2,"Bullet Armageddon" +KinkyDungeonStatDescBulletHell2,"Hides warning lines for AoE spells, bullets, and projectiles." + KinkyDungeonStatNeeds,"I have... needs" KinkyDungeonStatDescNeeds,"Distraction builds up over time." @@ -285,21 +437,25 @@ KinkyDungeonStatDescQuickness,"Grants Quickness after not moving for 4 turns. Qu KinkyDungeonStatMapLarge,"Expansive Halls" -KinkyDungeonStatDescMapLarge,"Increases the size of maps by 1 in each direction." +KinkyDungeonStatDescMapLarge,"Increases the size of maps by 3 in the long dimension. Maps will be less dense." KinkyDungeonStatMapHuge,"Gargantuan Halls" -KinkyDungeonStatDescMapHuge,"Increases the size of maps by 2 in each direction." +KinkyDungeonStatDescMapHuge,"Increases the size of maps by 6 in the long dimension. Maps will have a mix of tunnels and dead ends." KinkyDungeonStatMapGigantic,"Labyrinthine Halls" -KinkyDungeonStatDescMapGigantic,"Increases the size of maps by 3 in each direction." +KinkyDungeonStatDescMapGigantic,"Increases the size of maps by 9 in the long dimension. Maps will be mostly tunnels." +KinkyDungeonStatMapAbsurd,"Absurdly Huge Maps" +KinkyDungeonStatDescMapAbsurd,"(Experimental) Make the maps really really big. Probably breaks the game." KinkyDungeonStat24,"Rigger" -KinkyDungeonStatDesc24,"Chain and glue damage increased by 20%. Binding on enemies is 30% stronger." +KinkyDungeonStatDesc24,"Binding on enemies is 30% stronger." KinkyDungeonStat25,"Pacifist" -KinkyDungeonStatDesc25,"All non-glue, non-chain, or non-teasing damage dealt to humanoid enemies is reduced by 90%." +KinkyDungeonStatDesc25,"All damage dealt to humanoid enemies is reduced by 90% except teasing damage and pain/grope/tickle/charm/psychic/chain/glue." +KinkyDungeonStatCurseSeeker,"Curse Seeker" +KinkyDungeonStatDescCurseSeeker,"When you pick up cursed armor or restraints from chests, they equip automatically if able." KinkyDungeonStatBurningDesire,"Burning Desire" -KinkyDungeonStatDescBurningDesire,"While above 70% distraction, you ignite nearby objects and gain +40% fire damage." +KinkyDungeonStatDescBurningDesire,"While above 70% distraction, you ignite nearby objects and gain +25% fire damage." KinkyDungeonStatFrigidPersonality,"Frigid Personality" -KinkyDungeonStatDescFrigidPersonality,"While at 0% distraction, you gain +10% ice damage and can walk on ice without penalties." +KinkyDungeonStatDescFrigidPersonality,"While below 10% distraction, you gain +10% ice damage and can walk on ice without penalties." KinkyDungeonStatGroundedInReality,"Grounded in Reality" KinkyDungeonStatDescGroundedInReality,"While at max mana, your attacks deal an additional 30% of their base damage as electric damage." @@ -307,9 +463,9 @@ KinkyDungeonStatLikeTheWind,"Like the Wind" KinkyDungeonStatDescLikeTheWind,"While above 95% stamina, you gain +30 Evasion and your slow level is reduced by 1." KinkyDungeonStatImmovableObject,"Immovable Object" -KinkyDungeonStatDescImmovableObject,"While above 90% willpower, you gain +150 Restraint Block and Earth buff spells cost half mana." +KinkyDungeonStatDescImmovableObject,"While above 90% willpower, you gain +150 Bondage Resist and Earth buff spells cost half mana." KinkyDungeonStatLeastResistance,"Path of Least Resistance" -KinkyDungeonStatDescLeastResistance,"While at 0 willpower, you gain +35 Evasion and deal 20% of your max willpower as acid damage when restrained." +KinkyDungeonStatDescLeastResistance,"While at 0 WP, you gain +35 Evasion and deal 20% of your max WP as soap damage when enemies restrain you." KinkyDungeonStatSticky,"Sticky Situation" KinkyDungeonStatDescSticky,"You take 40% more glue damage." @@ -319,7 +475,7 @@ KinkyDungeonStatDescBreathless,"Taking chain, poison, and crush damage makes you KinkyDungeonStatKinkyPrison,"Kinky Prisoner" -KinkyDungeonStatDescKinkyPrison,"Guards never remove restraints you are already wearing, unless they are applying something tighter." +KinkyDungeonStatDescKinkyPrison,"Guards won't remove restraints unless they have something tighter. +10 Security level." KinkyDungeonStatDoorknobs,"Unfair Doors" KinkyDungeonStatDescDoorknobs,"Doors are harder to open while your hands are bound." @@ -341,26 +497,64 @@ KinkyDungeonStatDescT,"" KinkyDungeonStatTicklish,"Ticklish" KinkyDungeonStatDescTicklish,"You take 50% more tickle damage." KinkyDungeonStatStoic,"Stoic" -KinkyDungeonStatDescStoic,"You gain 82% tickle resist." +KinkyDungeonStatDescStoic,"You gain +82 tickle resist." KinkyDungeonStatLascivious,"Lascivious" KinkyDungeonStatDescLascivious,"You take 50% more grope damage." KinkyDungeonStatUnperturbed,"Unperturbed" -KinkyDungeonStatDescUnperturbed,"You gain 82% grope resist." +KinkyDungeonStatDescUnperturbed,"You gain +82 grope resist." KinkyDungeonStatMasochist,"Masochist" KinkyDungeonStatDescMasochist,"Pain is strongly arousing." KinkyDungeonStatPainTolerance,"Pain Tolerance" -KinkyDungeonStatDescPainTolerance,"You gain 200% pain resist." +KinkyDungeonStatDescPainTolerance,"You gain +200 pain resist." KinkyDungeonStatKeepOutfit,"Fashionable" KinkyDungeonStatDescKeepOutfit,"When you are jailed, you keep your outfit." KinkyDungeonStatFutileStruggles,"Futile Struggles" KinkyDungeonStatDescFutileStruggles,"Lose 2 WP every time you remove a non-trivial restraint." -KinkyDungeonStatSecondWind,"Second Wind" -KinkyDungeonStatDescSecondWind,"Gain 2 WP every time you remove a non-trivial restraint. Destroys restraints on removal." +KinkyDungeonStatSecondWind,"Second Wind" +KinkyDungeonStatDescSecondWind,"Regenerate WP when unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, gag, or slows. (Upgrade available in spell tree)" +KinkyDungeonSpellSecondWind0,Second Wind Perk +KinkyDungeonSpellDescriptionSecondWind0,"Regenerate WP when you are unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, or gag bondage, and no slows." +KinkyDungeonSpellSecondWind1,Triumphant Wind +KinkyDungeonSpellDescriptionSecondWind1,"Second Wind now regenerates up to 25% of your max WP" +KinkyDungeonSpellFirstWind,Mental Defiance +KinkyDungeonSpellDescriptionFirstWind,"Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While below 25% WP, quickly convert 'Defiance' into WP." +KinkyDungeonSpellFirstWindHigher,Mental Fortitude +KinkyDungeonSpellDescriptionFirstWindHigher,"Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While above 75% WP but below 100%, quickly convert 'Defiance' into WP. Exclusive with Mental Defiance." + + +KinkyDungeonStatLockedUp,"Locked Up" +KinkyDungeonStatDescLockedUp,"While wearing a chastity belt, your Desire lowers when you perform actions such as defeating enemies, opening chests, and breaking orbs. (Upgrades available in spell tree)" +KinkyDungeonSpellLockedUp0,Locked Up Perk +KinkyDungeonSpellDescriptionLockedUp0,"While wearing a chastity belt, your Desire lowers when you perform actions such as capturing, opening chests, and breaking orbs." +KinkyDungeonSpellLockedUp1,Controlled Urges +KinkyDungeonSpellDescriptionLockedUp1,"Locked Up is 150% effective. Gain +70 psychic/charm resist from a chastity belt and +30 from a chastity bra. While not wearing a chastity belt, your Desire increases slowly." +KinkyDungeonSpellLockedUp2,Ready for Training +KinkyDungeonSpellDescriptionLockedUp2,"Locked Up is 200% effective. +25% stamina regen per 100 current DP. Playing with yourself is less effective while vibrators are off or set to edge. Slow level is increased by 1 when you aren't wearing any chastity." +KinkyDungeonSpellLockedUp3,Efficient Denial +KinkyDungeonSpellDescriptionLockedUp3,"Locked Up is 300% effective. When Locked Up triggers, you gain -30% mana costs and +25% physical damage for 7 turns (35 when opening a chest or breaking orbs). You cannot orgasm unless you are wearing a chastity belt, and slow level is increased by 2." +KinkyDungeonSpellLockedUpX,Recalcitrant +KinkyDungeonSpellDescriptionLockedUpX,"Relinquish the Locked Up perk. One time only. If you take the perk again, there is no going back." + +KinkyDungeonStatNovicePet,"Novice Pet" +KinkyDungeonStatDescNovicePet,"You can now sprint while wearing a petsuit. (Upgrades available in spell tree)" +KinkyDungeonSpellNovicePet0,Novice Pet Training +KinkyDungeonSpellDescriptionNovicePet0,"You can now sprint while wearing a petsuit." +KinkyDungeonSpellNovicePet1,Eager Pet +KinkyDungeonSpellDescriptionNovicePet1,"+1 slow reduction while wearing a petsuit, but sprint costs are increased by 30% when not wearing a petsuit." +KinkyDungeonSpellNovicePet2,Experienced Pet +KinkyDungeonSpellDescriptionNovicePet2,"+2 slow reduction total while wearing a petsuit (from +1), but sprint costs are increased by 100% (from 30%) when not wearing a petsuit and slow level is increased by +1." +KinkyDungeonSpellNovicePet3,Devoted Pet +KinkyDungeonSpellDescriptionNovicePet3,"+3 slow reduction total while wearing a petsuit (from +2), but you cannot sprint (from +100% cost) when not wearing a petsuit and slow level is increased by +2 (from +1)." +KinkyDungeonSpellNovicePetX,Bad Pet +KinkyDungeonSpellDescriptionNovicePetX,"Relinquish the Novice Pet perk. One time only. If you take the perk again, there is no going back." +KinkyDungeonBuffNovicePet,You are an expert in wearing a petsuit and your mobility is increased. +KinkyDungeonBuffNovicePetBad,You are too used to wearing petsuits! Sprinting is impaired. +KinkyDungeonBuffNovicePetVeryBad,You are a disobedient pet. You should put on a petsuit! KinkyDungeonStatDominant,"Dominant" KinkyDungeonStatDescDominant,"They're trapped here with you. Ghosts are more helpful, and you can bind enemies that confront you about bondage." @@ -369,6 +563,8 @@ KinkyDungeonStatStranger,"Stranger" KinkyDungeonStatDescStranger,"Randomizes your relationship to most factions." KinkyDungeonStatWrongNeighborhood,"Wrong Neighborhood" KinkyDungeonStatDescWrongNeighborhood,"All factions are hostile and united against you." +KinkyDungeonStatBandit,"Bandit" +KinkyDungeonStatDescBandit,"Start friendly to bandits, and hostile to most other factions." KinkyDungeonStatTrespasser,"Trespasser" KinkyDungeonStatDescTrespasser,"You lose reputation with the goddesses every time you advance a floor." @@ -377,18 +573,47 @@ KinkyDungeonStatPrisoner,"Prisoner" KinkyDungeonStatDescPrisoner,"Start the game as a submissive prisoner wandering the halls." KinkyDungeonStatRusted,"Rusty Bolts" -KinkyDungeonStatDescRusted,"Most traps have a 25% misfire chance." +KinkyDungeonStatDescRusted,"Most traps have a 25% misfire chance each time you step on them." +KinkyDungeonStatNoPet,"Not a Pet" +KinkyDungeonStatDescNoPet,"Petsuits occur less often." KinkyDungeonStatUnmasked,"Unmasked" -KinkyDungeonStatDescUnmasked,"Hoods and full-face covering masks do not appear, but blindfolds are more powerful." +KinkyDungeonStatDescUnmasked,"Hoods and full-face covering masks do not appear, but blindfolds are more powerful. Does not include kigurumi masks." +KinkyDungeonStatNoKigu,"No Kigurumi Masks" +KinkyDungeonStatDescNoKigu,"Removes face-mimicking masks from the game." +KinkyDungeonStatNoHood,"No Hoods" +KinkyDungeonStatDescNoHood,"Removes hoods from the game." +KinkyDungeonStatNoSenseDep,"No Sense Deprivation" +KinkyDungeonStatDescNoSenseDep,"Removes sensory deprivation hood/mask from the game." KinkyDungeonStatBlackout,"Blackout" KinkyDungeonStatDescBlackout,"Blindfolds are stronger. While blindfolded you can only see enemies next to you." +KinkyDungeonStatNoBlindfolds,"No Blindfolds" +KinkyDungeonStatDescNoBlindfolds,"In most cases you will not get blindfolded, except for cloth blindfolds which can be escaped easily." + KinkyDungeonStatTotalBlackout,"Total Blackout" -KinkyDungeonStatDescTotalBlackout,"Blindfolds are extremely punishing and you can't see explored areas while blindfolded." +KinkyDungeonStatDescTotalBlackout,"Blindfolds are extremely punishing." +KinkyDungeonStatNearsighted,"Poor Vision" +KinkyDungeonStatDescNearsighted,"Vision radius is significantly reduced." +KinkyDungeonStatKeenHearing,"Keen Hearing" +KinkyDungeonStatDescKeenHearing,"You can more easily hear enemies and their movements through walls." +KinkyDungeonStatArchersEye,"Archer's Eye" +KinkyDungeonStatDescArchersEye,"+2 vision radius." +KinkyDungeonStatNightOwl,"Night Owl" +KinkyDungeonStatDescNightOwl,"Your vision in dark areas is improved." +KinkyDungeonStatNightBlindness,"Fear of the Dark" +KinkyDungeonStatDescNightBlindness,"Your vision in dark areas is reduced." + +KinkyDungeonStatMutualDarkness,"Mutually Assured Darkness" +KinkyDungeonStatDescMutualDarkness,"Darkness is twice as effective in hiding from enemies, but your night vision is also reduced." +KinkyDungeonStatStalker,"Stalker" +KinkyDungeonStatDescStalker,"Darkness is twice as effective in hiding from enemies." + KinkyDungeonStatNoDoll,"Not a Doll" KinkyDungeonStatDescNoDoll,"You may still enter Doll Terminals, but enemies will not force you onto doll stands." KinkyDungeonStatNoNurse,"No Nurses" KinkyDungeonStatDescNoNurse,"Nurses will not appear in the game." +KinkyDungeonStatNoPolice,"No Police" +KinkyDungeonStatDescNoPolice,"Police-based bounty hunters will not appear in the game." KinkyDungeonStatNoBrats,"No Brats" KinkyDungeonStatDescNoBrats,"Submissive enemies won't run away from you." KinkyDungeonStatOnlyBrats,"Brats Only" @@ -400,18 +625,45 @@ KinkyDungeonStatTapeOptout,"Less Tape" KinkyDungeonStatDescTapeOptout,"Fewer tape-related enemies will appear, although this does not remove tape entirely." +KinkyDungeonStatRobotVetoTape,"No Tape Bots" +KinkyDungeonStatDescRobotVetoTape,"The old civilization did not use tape-based restraints in their capture robots." +KinkyDungeonStatRobotVetoCable,"Less Cable Bots" +KinkyDungeonStatDescRobotVetoTape,"The old civilization used significantly less cable-based restraints in their capture robots." +KinkyDungeonStatRobotVetoResin,"No Resin Bots" +KinkyDungeonStatDescRobotVetoTape,"The old civilization did not use crystal resin-based restraints in their capture robots." +KinkyDungeonStatRobotVetoLatex,"Lexx Latex Bots" +KinkyDungeonStatDescRobotVetoTape,"The old civilization used significantly less latex-based restraints in their capture robots." + +KinkyDungeonStatSlimePref,"More Encasement" +KinkyDungeonStatDescSlimePref,"Enemies that encase you (e.g slimes, latex cubes) will appear more frequently." +KinkyDungeonStatSlimeOptout,"Less Encasement" +KinkyDungeonStatDescSlimeOptout,"Fewer encasement-related enemies will appear, although this does not remove them entirely." + +KinkyDungeonStatBubblePref,"More Bubbles" +KinkyDungeonStatDescBubblePref,"Enemies that use bubbles (e.g. aqua slimes, water witches) will appear more frequently." +KinkyDungeonStatBubbleOptout,"Less Bubbles" +KinkyDungeonStatDescBubbleOptout,"Fewer bubble-related enemies will appear, although this does not remove them entirely." + + + + KinkyDungeonStatMC_Trainee,"Trainee" -KinkyDungeonStatDescMC_Trainee,"Your training has given you access to the spells of the Trainee class. (Aroused mode only)" -KinkyDungeonStatMC_Fighter,"Warrior" -KinkyDungeonStatDescMC_Fighter,"Your training has given you access to the spells of the Warrior class." +KinkyDungeonStatDescMC_Trainee,"Your training has given you access to the powers of the Trainee class. (Aroused mode only)" +KinkyDungeonStatMC_Fighter,"Fighter" +KinkyDungeonStatDescMC_Fighter,"Your training has given you access to the powers of the Fighter class." KinkyDungeonStatMC_Rogue,"Rogue" -KinkyDungeonStatDescMC_Rogue,"Your training has given you access to the spells of the Rogue class." -KinkyDungeonStatMC_Mage,"Wizard" -KinkyDungeonStatDescMC_Mage,"Your training has given you access to the spells of the Wizard class." +KinkyDungeonStatDescMC_Rogue,"Your training has given you access to the powers of the Rogue class." +KinkyDungeonStatMC_Wizard,"Wizard" +KinkyDungeonStatDescMC_Wizard,"Your training has given you access to the powers of the Wizard class." +KinkyDungeonStatMC_Peasant,"Peasant" +KinkyDungeonStatDescMC_Peasant,"You possess the agricultural mastery of the Peasant class." + +KinkyDungeonStatPanic,"Panic! (Chests)" +KinkyDungeonStatDescPanic,"When you open a trapped chest, you are stunned for 2 turns." -KinkyDungeonStatPanic,"Panic!!!" -KinkyDungeonStatDescPanic,"When you step on a trap, you are stunned for 2 turns." +KinkyDungeonStatPanic2,"Panic! (Traps)" +KinkyDungeonStatDescPanic2,"When you step on a trap, you are stunned for 2 turns." KDPanic,Panic sets in! (Stunned 2 turns) KinkyDungeonStatButterfingers,"Butterfingers" @@ -424,6 +676,8 @@ KinkyDungeonCantUsePotionsKneel,You kneel down so you can reach the potion with KinkyDungeonStatIncantation,"Can't Hear You!" KinkyDungeonStatDescIncantation,"Being gagged blocks you from casting verbal spells regardless of gag power." +KinkyDungeonStatSmoothTalker,"Smooth Talker" +KinkyDungeonStatDescSmoothTalker,"Being gagged does not increase your miscast chance for verbal spells unless fully gagged, and reduces gag power by 20%." KinkyDungeonStatUnmasked,"Unmasked" KinkyDungeonStatDescUnmasked,"Hoods and full-face covering masks do not appear, but blindfolds are more powerful." @@ -446,9 +700,9 @@ KinkyDungeonStatStartMaid,"Maid Sweeper" KinkyDungeonStatDescStartMaid,"Start in a magically locked maid outfit." KinkyDungeonStatStartWolfgirl,"Wolf Trainee" KinkyDungeonStatDescStartWolfgirl,"Start in a uniform of a naughty wolfgirl." -KinkyDungeonStatStartLatex,"Latex Doll" -KinkyDungeonStatDescStartLatex,"Start bound in latex restraints." -KinkyDungeonStatStartObsidian,"Iron Slave" +KinkyDungeonStatStartLatex,"Latex Toy" +KinkyDungeonStatDescStartLatex,"Start bound in lovely latex restraints." +KinkyDungeonStatStartObsidian,"Elemental Slave" KinkyDungeonStatDescStartObsidian,"Start in a full set of magically locked obsidian cuffs." @@ -459,6 +713,9 @@ KinkyDungeonStatDescArousingMagic,"Your magic is powered by otherworldly distrac KinkyDungeonStatClearheaded,"Clearheaded" KinkyDungeonStatDescClearheaded,"Magic puts you in a clear state of mind. Casting spells successfully reduces your distraction." +KinkyDungeonStatUnidentifiedWear,"Unidentified Wear" +KinkyDungeonStatDescUnidentifiedWear,"Enchanted (and cursed) wearables and weapons are unidentified until the item is used." +KDUnidentified,"Unknown " KinkyDungeonCopyPerks,Copy (clipboard) KinkyDungeonPastePerks,Paste (clipboard) @@ -467,18 +724,21 @@ KinkyDungeonPastePerks,Paste (clipboard) KDConductionDamageTaken,DAMAGEDEALT electric damage conducts to you!!! KDBurningFanFlamesDamageTaken,"The pressure fans the flames on you, dealing bonus DAMAGEDEALT fire damage!" KinkyDungeonDrenchedSlimeBuff,The RestraintName comes off more easily in the presence of water! -KDSlipIce,You slip on the ice! +KDSlipIce,You slip on the floor! KinkyDungeonBuffIgniteDamage,The air around you is ablaze! (-DamageDealt SP) KinkyDungeonBuffShrineIllusionTrigger,"The Goddess of Illusions shrouds you in shadows!" KinkyDungeonBuffLockdownTry,"You struggle against your bonds, but a magical force resists!" KinkyDungeonRopeEngulfEnd1,"The ropes squeeze you tighter and tighter..." KinkyDungeonRopeEngulfEnd2,"Your body sinks deeper into a sea of bindings..." KinkyDungeonRopeEngulfEnd3,"You struggle to breath as you are buried alive in squirming ropes..." +KinkyDungeonSlimeEngulfEnd1,"The slime stretches out over your body..." +KinkyDungeonSlimeEngulfEnd2,"The slime continues to engulf you, blocking out your vision..." +KinkyDungeonSlimeEngulfEnd3,"The slime starts to harden, sealing you inside a rubbery prison..." KinkyDungeonSarcoHexEnd1,"You feel a force compelling you to stop resisting..." KinkyDungeonSarcoHexEnd2,"Your body struggles to move as you feel a power sealing you!" KinkyDungeonSarcoHexEnd3,"The sarcophagus' door slides open as you are slowly pulled inside..." -KinkyDungeonShadowEngulf1,"The hands squeeze you tightly..." -KinkyDungeonShadowEngulf2,"More hands clasp over your body..." +KinkyDungeonShadowEngulf1,"The hands squeeze you tightly as a shadowy portal appears..." +KinkyDungeonShadowEngulf2,"More hands clasp over your body as they pull you toward the portal..." KinkyDungeonShadowEngulf3,"You struggle to breath as you are pulled into the mass of shadow hands..." KinkyDungeonPassOut,"The world goes dark..." KinkyDungeonPassOut2,"You wake up in a different place..." @@ -508,7 +768,7 @@ KinkyDungeonPlayerReduction,"All Damage Reduction: " KinkyDungeonPlayerDamageResist,"You take PERCENT1 DAMAGETYPE damage, based on PERCENT2 DAMAGETYPE resist and PERCENT3 DAMAGECATEGORY modifier." KinkyDungeonPlayerDamageBuff,"You deal PERCENT more DAMAGETYPE damage." KinkyDungeonPlayerBindBuff,"Your bindings are PERCENT more effective." -KinkyDungeonPlayerDamage,"Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage." +KinkyDungeonPlayerDamage,"Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage, for a stamina cost of STMNA." KinkyDungeonPlayerPlugged,"Plugged!" KinkyDungeonPlayerPluggedExtreme,"Plugged up!!!" KinkyDungeonPlayerDenied,"Denied! You won't be getting off that easy~" @@ -519,16 +779,17 @@ KinkyDungeonPlayerVibrated3,"Strong vibrations!" KinkyDungeonPlayerVibrated4,"Intense vibrations!!" KinkyDungeonPlayerVibrated5,"Torturous vibrations!!!" +KDStatRestriction,Your restraints are restrictive! Struggling is less effective without help. KDStatStun,"Stunned! You can't move!" KDStatBlind,"Your vision is impaired!" KDStatArms,"Arms are bound!" KDStatHands,"Hands are useless!" KDStatHandsPartial,"Hands are impaired! Some tasks will be harder..." -KDStatSpeedSlow,"Movement significantly impaired!" -KDStatSpeedSlightlySlow,"Movement slightly impaired." -KDStatSpeedVerySlow,"Movement severely impaired!" -KDStatSpeedNoSprint,"Movement is almost impossible. Sprinting and hopping are disabled." -KDStatSpeedImmobile,"Immobilized!" +KDStatSpeedSlow,"Slow Level 2: Movement significantly impaired!" +KDStatSpeedSlightlySlow,"Slow Level 1: Movement slightly impaired." +KDStatSpeedVerySlow,"Slow Level 3: Movement severely impaired!" +KDStatSpeedNoSprint,"Slow Level 4+: Movement is almost impossible. Sprinting and hopping are disabled." +KDStatSpeedImmobile,"Slow Level 10+: Immobilized!" KDStatFreeMouth,"Your mouth is free for potion-drinking and spellcasting activities." KDStatFreeEyes,"Your vision is clear." KDStatFreeHands,"Your hands are unobstructed." @@ -567,9 +828,9 @@ KinkyDungeonBuffChillWalk,Ignore Ice Tiles KinkyDungeonBuffIgnite,"Ignited: You are dealing fire damage to yourself and nearby enemies!" KinkyDungeonBuffBurning,"You are on fire and taking damage!" -KinkyDungeonBuffShrineElements,"Arcane Power: Deals bonus damage when you hit an enemy." -KinkyDungeonBuffShrineConjure,"Arcane Protection: Reduces damage taken, and deals retaliation damage." -KinkyDungeonBuffShrineIllusion,"Arcane Cunning: You turn invisible briefly after attacking." +KinkyDungeonBuffShrineElements,"Divine Punishment: Deals bonus damage when you hit an enemy." +KinkyDungeonBuffShrineConjure,"Divine Protection: Automatically blocks the next 3 times an enemy tries to bind you." +KinkyDungeonBuffShrineIllusion,"Divine Cunning: You turn invisible briefly after attacking." KinkyDungeonBuffAvatarFire,-MP Cost (Fire) KinkyDungeonBuffAvatarAir,-MP Cost (Air) @@ -578,10 +839,11 @@ KinkyDungeonBuffAvatarEarth,-MP Cost (Earth) KinkyDungeonBuffSlimeForm,"Slime Form: You gain bonuses and can slip through bars!" KinkyDungeonBuffShroud2,"Shroud: Visibility decreased, evasion increased." -KinkyDungeonBuffCamo,"Camoflage: While holding still, you are very hard to see." +KinkyDungeonBuffCamo,"Camoflage: While next to a wall, you are very hard to see." KinkyDungeonBuffStoneSkin,"Stone Skin: Increased armor." KinkyDungeonBuffShadowBlade,"Darkblade: Increased damage." KinkyDungeonBuffShield,"Runic Ward: Increased Magic Armor." +KinkyDungeonBuffGreaterInvisibility,"Great Invisibility: It is impossible for enemies to see you." KinkyDungeonBuffInvisibility,"Invisibility: It is very difficult for enemies to see you." KinkyDungeonBuffLesserInvisibility,"Lesser Invisibility: It is harder for enemies to see you." KinkyDungeonBuffCutting,"FULL POWER: Cutting power increased." @@ -589,11 +851,16 @@ KinkyDungeonBuffSlippery,"Graceful: Struggling power increased." KinkyDungeonBuffIronBlood,"Iron Blood: Reduced melee cost, increased mana costs." KinkyDungeonBuffSleepy,"Sleepy: You are sluggish and have a hard time keeping your eyes open." KinkyDungeonBuffEvasion,"Afterimage: Evasion greatly increased." -KinkyDungeonBuffSlimeMimic,"We did it! We made outselves invisible--mmmmph!!!" +KinkyDungeonBuffSlimeMimic,"We did it! We made ourselves invisible--mmmmph!!!" +KinkyDungeonBuffd_SlimeMimic,"You are not currently attempting to disguise yourself. Click to reenable." KinkyDungeonBuffDisenchantSelf,"Your restraints are disenchanted, treating them as nonmagical for purposes of cutting." KinkyDungeonBuffLeatherBurst,"You can launch another leather restraint instantly!" +KinkyDungeonBuffSagittaAssault,"You can launch another Sagitta instantly!" -KinkyDungeonBuffDistractionCast,Your motivation is powerful enough your spells cannot be stopped! +KinkyDungeonBuffTraineeWP,You have stored willpower. +KinkyDungeonBuffDistractionCast,"You have consumed a mote of essence, granting miscast chance reduction." +KinkyDungeonSpellCastDistractionCast,You recapture an essence mote and concentrate on its essence! +KinkyDungeonSpellTargetDistractionCast,Choose an essence mote to absorb. KinkyDungeonBuffStraitjacketBolt,"Locked Down: Struggling power is greatly reduced." KinkyDungeonBuffLockdown,"Locked Down: Struggling power is greatly reduced." @@ -607,23 +874,20 @@ KinkyDungeonBuffKatanaCharge,"Katana: Patience is key..." KinkyDungeonBuffStormCharge,"Stormbreaker: You have the Power." KinkyDungeonDifficulty,Game Setup: -KinkyDungeonDifficulty0,Beginner: Get a save code every 3 levels, autosave after each floor +KinkyDungeonDifficulty0,"Beginner: Get a save code every 3 levels, autosave after each floor" KinkyDungeonDifficulty1,"Roguelike: No save codes, only autosave" KinkyDungeonDifficulty3,"Exciting: Orbs give random spells" KinkyDungeonDifficulty2,"Kinky: No save codes, orbs give random spells, start with very little" -KinkyDungeonLog,Log +KinkyDungeonLog,Journal KinkyDungeonDressPlayer,"Change Outfit" -KinkyDungeonDressPlayerReset,"Reset Outfit" -KinkyDungeonDressPlayerImport,"Code" +KinkyDungeonDressPlayerReset,"Reset to Default" +KinkyDungeonDressPlayerImport,"Outfit Code" KinkyDungeonConfirm,Confirm Reset? -KinkyDungeonSaveIntro0,"(Copy the code above and save it on your computer to load later)" -KinkyDungeonSaveIntro,"You come across a black monolith with its face inscribed in runes." -KinkyDungeonSaveIntro2,"You study them, but can't come up with an interpretation." -KinkyDungeonSaveIntro3,"They may still prove useful to future adventurers should you get caught..." -KinkyDungeonSaveIntro4,"(Your game has been saved automatically, but you can save the code for later)" +KinkyDungeonSaveIntro0,"(Your game has been saved)" +KinkyDungeonSaveIntro1,"(Copy the code above and save it on your computer to backup)" KinkyDungeonGameSave,"" KinkyDungeonGameContinue,"Continue..." @@ -640,13 +904,14 @@ KinkyDungeonRestartNo,"No, I wish to press on" KinkyDungeonCheckPerks,"See Perks" KinkyDungeonChestFaction,This chest belongs to the FACTION +KinkyDungeonObjectFaction,This belongs to the FACTION DeviousChallenge,"Devious Dungeon Challenge is enabled." KinkyDungeonLoading,"Waiting for game data..." -End,"You have surrendered to the dungeon and become its prisoner." -End2,"Day and night, you wait that rescue may come some day." -End3,"Better luck next time!" +End,"" +End2,"" +End3,"" EndWin,"You have reached the end of the playable portion." EndWin2,"Come back later for new dungeons!" @@ -655,9 +920,11 @@ StatWeapon,"" StatKeyEscapeKey,Got the keys! Find the stairs to go to the next floor. StatKeyEscapeNoKey,You haven't found the keys for this floor yet. StatKey,Missing key +StatShield,You are protected from damage and can't be bound until the shield is broken! StatMiscastChance,"Chance for a spell to fizzle: " -StatEvasion,"Dodge Chance: Percent%, based on EVASIONSUM Evasion, -EVASIONPENALTY penalty from bindings" -StatRestraintBlock,"Chance to block a level 10 restraint: Percent%" +StatEvasion,"Dodge Chance: Percent%, based on EVASIONSUM Evasion and EVASIONPENALTY% penalty." +StatBlock,"Block Chance: Percent%, based on BLOCKSUM Block and BLOCKPENALTY% penalty." +StatRestraintBlock,"Chance to resist a level 10 restraint: AMNT1%, based on AMNT2 Bondage Resist and RESBLKPENALTY penalty." StatVision,"Sight Range: RADIUS" StatSpeed,"Speed: SPD" StatSpeedNormal,"Normal" @@ -666,11 +933,12 @@ StatSpeedSlow,"Slowed" StatSpeedVerySlow,"Very Slow" StatSpeedImmobile,"Immobile" StatDistraction,"DP: PERCENT%" +StatDistractionHover,"DP: CURRENT/MAX (PERCENT% Desire)" StatStamina,"SP: CURRENT/MAX" StatWillpower,"Willpower: CURRENT/MAX" StatMana,"MP: CURRENT/MAX" TooltipMana,"Mana slowly recovers from a pool equal to POOLMANA. Drink potions to restore the pool." -TooltipDistraction,"Your minimum distraction increases over time as you encounter distracting things." +TooltipDistraction,"Your Desire is the baseline Distraction you decay toward, and is increased by distracting things." TooltipStamina,"Stamina recovers more quickly when you aren't spending it." TooltipWill,"Willpower is restored by food, sleep, and potions. Without willpower, it becomes very difficult to escape." TooltipCharge,"Charge is used to power various magic items and weapons." @@ -686,27 +954,41 @@ KinkyDungeonTryOrgasm,"Let go..." KDLetGo,"Let go..." KDPlay,"Play with yourself" KDSleep,"Go to sleep" -KDHelp,"Make noise!" +KDHelp,"Call for Help!!!" KDWait,"Wait until interrupted" KDAutoStruggle,"Auto-struggle" KDAutoPath,"Auto-path" KDSwitchWeapon,"Quick-Swap Weapon" KDInspect,"Inspect" KDPass,Pass NPCs -KDDoor,Close a Door +KDDoor,Interact KDSprint,Sprint/Hop - -KinkyDungeonChangeDistraction0,"Ahh!" -KinkyDungeonChangeDistraction1,"Mmm..." -KinkyDungeonChangeDistraction2,"Nnngh..." -KinkyDungeonChangeDistraction3,"Ooooh..." -KinkyDungeonChangeDistraction4,"(Breaths heavily)" -KinkyDungeonChangeDistraction5,"(Moans softly)" +KDCrouch,Crouch + +KinkyDungeonChangeDistraction0,"~ah~" +KinkyDungeonChangeDistraction1,"~mmm~" +KinkyDungeonChangeDistraction2,"~ngh~" +KinkyDungeonChangeDistraction3,"~oh~" +KinkyDungeonChangeDistraction4,"(Heavy breathing)" +KinkyDungeonChangeDistraction5,"(Soft moaning)" KinkyDungeonChangeDistraction6,"(Incoherent mumbling)" -KinkyDungeonChangeDistraction7,"(Moans loudly)" -KinkyDungeonChangeDistraction8,"(Heavy breathing)" -KinkyDungeonChangeDistraction9,"(Moaning uncontrollably)" -KinkyDungeonChangeDistraction10,"(Shudders with pleasure)" +KinkyDungeonChangeDistraction7,"(Loud moans)" +KinkyDungeonChangeDistraction8,"(Deep breaths)" +KinkyDungeonChangeDistraction9,"(Uncontrollable moaning)" +KinkyDungeonChangeDistraction10,"(Horny noises)" + + +KinkyDungeonChangeDistractionGag0,"~mm~" +KinkyDungeonChangeDistractionGag1,"~mmph~" +KinkyDungeonChangeDistractionGag2,"~nnn~" +KinkyDungeonChangeDistractionGag3,"~mmmmm~" +KinkyDungeonChangeDistractionGag4,"(Heavy breathing)" +KinkyDungeonChangeDistractionGag5,"(Soft moaning)" +KinkyDungeonChangeDistractionGag6,"(Incoherent mumbling)" +KinkyDungeonChangeDistractionGag7,"(Loud moans)" +KinkyDungeonChangeDistractionGag8,"(Deep breaths)" +KinkyDungeonChangeDistractionGag9,"(Uncontrollable moaning)" +KinkyDungeonChangeDistractionGag10,"(Horny noises)" Wait,"You wait." WaitAroused,"You wait, legs trembling with arousal." @@ -723,8 +1005,9 @@ KinkyDungeonStaminaWarningNone,"You feel like you are going to pass out..." GameStart,Start New Game KinkyDungeonNewGamePlus,New Game+ GameContinue,Continue Last Save -LoadGame,Load From Code -LoadOutfit,Save Outfit (overwrites!) +LoadGame,Load Saved Game +LoadOutfit,Save Outfit (overwrite!) +LoadOutfitClothes,Save Outfit (Clothes Only!) GameReturnToMenu,Save Keybindings GameReturnToMenu2,Cancel Changes GameReturnToMenuFromOptions,Return @@ -733,7 +1016,7 @@ GameToggles,Game Options KinkyDungeonLoadConfirm,"Load from code" KinkyDungeonLoadBack,"Back to main menu" -KinkyDungeonLoadMod,"Load Mod" +KinkyDungeonLoadMod,"Load Mod .zip" KinkyDungeonDeleteMod,"Delete Mod" KinkyDungeonClearAll,"Clear Perks" KinkyDungeonConfig,"Config " @@ -758,28 +1041,53 @@ KinkyDungeonKeySpell4,Spell 4 KinkyDungeonKeySpell5,Spell 5 KinkyDungeonKeySpell6,Spell 6 KinkyDungeonKeySpell7,Spell 7 +KinkyDungeonKeySpell8,Spell 8 +KinkyDungeonKeySpell9,Spell 9 +KinkyDungeonKeySpell0,Spell 10 +KinkyDungeonKeySpellConfig1,Load Hotbar 1 +KinkyDungeonKeySpellConfig2,Load Hotbar 2 +KinkyDungeonKeySpellConfig3,Load Hotbar 3 +KinkyDungeonKeySwitchLoadout1,Load Loadout 1 +KinkyDungeonKeySwitchLoadout2,Load Loadout 2 +KinkyDungeonKeySwitchLoadout3,Load Loadout 3 KinkyDungeonKeySpellPage,Cycle Spell Page KinkyDungeonKeyUpcast,Upcast Spells KinkyDungeonKeyUpcastCancel,Cancel Upcast -KinkyDungeonKeySwitchWeapon,Swap Weapon -KinkyDungeonKeySpellWeapon,Ranged Attack +KinkyDungeonKeySwitchWeapon,Swap Weapon 1 +KinkyDungeonKeySwitchWeaponOffhand,Swap Weapon 2 +KinkyDungeonKeySwitchWeaponOffhandPrevious,Swap Weapon 3 +KinkyDungeonKeySwitchWeaponOffhandPrevious2,Swap Weapon 4 +KinkyDungeonKeySpellWeapon,Weapon Ability KinkyDungeonKeyWait,Wait KinkyDungeonKeySkip,Cancel/Back KinkyDungeonKeyEnter,Enter +KinkyDungeonKeyAInspect,Inspect +KinkyDungeonKeyMap,Expand Minimap +KinkyDungeonKeyZoomOut,Zoom Out +KinkyDungeonKeyZoomIn,Zoom In +KinkyDungeonKeyWaitInterrupt,Wait till Interrupted +KinkyDungeonKeyMakeNoise,Make Noise +KinkyDungeonKeyCrouch,Crouch +KinkyDungeonKeyPlaySelf,Play with Self KinkyDungeonKeyMsgLog,Message Log -KinkyDungeonKeyDoor,Close Door +KinkyDungeonKeyDoor,Interact KinkyDungeonKeyPass,Pass thru allies KinkyDungeonKeyAStruggle,Auto-Struggle KinkyDungeonKeyAPathfind,Auto-Pathfind KinkyDungeonKeySprint,Sprint/Hop KinkyDungeonKeyInspect,Inspect +KinkyDungeonKeyBulletTransparency,Hide Bullets KinkyDungeonKeyQInventory,Quick Inventory KinkyDungeonKeyInventory,Inventory KinkyDungeonKeyReputation,Reputation +KinkyDungeonKeyJourneyMap,Journey Map +KinkyDungeonKeyQuest,Quests KinkyDungeonKeyMagic,Spell List -KinkyDungeonKeyLog,Logbook +KinkyDungeonKeyLog,Journal +KinkyDungeonKeyRestart,Pause Menu +KinkyDungeonKeyFacilities,Facilities KinkyDungeonCurrentPress,"Current Key Pressed" KinkyDungeonCurrentPressInfo,"Press a key, then press a button to set that key" @@ -792,19 +1100,21 @@ CurrentKeyBlue,"Magic Keys: " CurrentKnife,"Knife: " CurrentKnifeMagic,"Mag. Knife: " -ClimbDown,"You climb down the stairs. The passage closes behind you." +ClimbDowns,"You climb down the stairs. The passage closes behind you." +ClimbDownS,"You climb back up the stairs." ClimbDownFail,"You can't climb down until you get out of this leash..." -ClimbDownShortcut,"You climb down and find yourself in a strange new place." +ClimbDownH,"You climb down and find yourself in a strange new place." KDNGPlus," plus XXX" DungeonNamegrv,Graveyard DungeonNamecat,Catacombs -DungeonNamejng,Underground Jungle +DungeonNamejng,Overgrown Ruins DungeonNametmp,Lost Temple DungeonNamebel,The Bellows DungeonNamelab,Rundown Laboratory DungeonNamefor,Forgotten Garden +DungeonNamecst,Coastal Grotto DungeonNameice,Kingdom of Ice DungeonName8, DungeonName9, @@ -814,6 +1124,7 @@ DungeonNamemis,The Mansion DungeonNametmb,Ancient Tombs DungeonNamelib,Magic Library DungeonNamecry,Crystal Cave +DungeonNamecav,Cavern DungeonNameore,Orrery DungeonNametrn,Training Center DungeonNamerub,Rubber Facility @@ -821,6 +1132,25 @@ DungeonNamewiz,Wizards' Den DungeonNamemrb,Marble Halls DungeonNamedll,Doll Storage DungeonName20, +DungeonNameDollRoom,Processing +DungeonNameDollStorage,Processing +DungeonNameBanditFort,Bandit Hideout +DungeonNameGoldVault,Ancient Vault +DungeonNamevault,Ancient Halls +DungeonNameSlaveMarket,Slave Market +DungeonNameElevatorRoom,Elevator Hall +DungeonNameElevatorEgyptian,Dark Passageway +DungeonNameCaldera,Caldera Beach +DungeonNameTempleAir,Temple of Air +DungeonNameTempleFire,Temple of Fire +DungeonNameTempleWater,Temple of Water +DungeonNameTempleIce,Temple of Ice +DungeonNameTempleElectric,Temple of Storms +DungeonNameTempleEarth,Temple of Earth +DungeonNameDemonTransition,The Edge of Reality +DungeonNameDemonEscape,The Edge of Reality +DungeonNameDemonPrison,Dark Dimension +DungeonNameDragonLair,Lair LootRubbleFail,You search through the debris but find nothing of note LootRubbleSmallGold,You find some gold coins in a corner (+XXX gold) @@ -836,6 +1166,7 @@ LootBookshelfBlueKey,"You find a magical key lying atop an open tome!" LootBookshelfScroll,"You find a useful scroll wedged between some treatises!" LootBookshelfTrap,"You find a glowing book containing a binding spell!" +LootChestDivineTear,"You discover a golden cookie, wrapped in foil. Beside it are two power crystals." LootChestMistressKey,You find a golden key surrounded by strange golden crystals. LootChestAncientCores,You find a set of strange golden crystals. LootChestScrolls,"You find a pack of scrolls used for spellcasting, and some strange golden crystals." @@ -861,8 +1192,13 @@ LootChestTrapMagicNipple,"You find gold, plus a devious magical trap! (+Restrain LootChestTrap,"Magical runes glow as a trap activates inside the chest!" LootPotionCollar,"You find a special collar that lets you absorb energy from potions." LootSlimeWalkers,"You find a pair of garish pink high heels with a slippery surface." +LootDusterGag,"You find a special gag with a feather duster." +LootGasMask,"You find a gas mask suitable for filtering gases." LootPearlChest,The pearly chest contains a divine gift! (+ITEMGET) KDSmokePuff,Smoke fills the air around you! +LootEssenceNecklace,"You find a magical necklace that seems to concentrate magic." + + LootCacheLostItems,"You recover some of your lost items!" @@ -890,60 +1226,79 @@ KinkyDungeonRarity9,Angelic KinkyDungeonRarity10,Divine KinkyDungeonConsumableQuantity,Quantity: -KinkyDungeonConsume,Use Item (Consumes 1) +KinkyDungeonConsume,Use One KinkyDungeonInventoryItemnull,way of the fist KinkyDungeonInventoryItemPick,Lockpick KinkyDungeonInventoryItemKeyring,Exit Keys -KinkyDungeonInventoryItemDefault,Wizard's Outfit +KinkyDungeonInventoryItemDefault,Adventurer's Outfit KinkyDungeonInventoryItemDefaultDesc,Your favorite outfit for adventuring. -KinkyDungeonInventoryItemDefaultDesc2,Your original outfit. No bonuses, no penalties. +KinkyDungeonInventoryItemDefaultDesc2,"Your original outfit. No bonuses, no penalties." + +KinkyDungeonInventoryItemBountyhunter,Tactical Catsuit +KinkyDungeonInventoryItemBountyhunterDesc,"A sleek catsuit worn by stealth operatives. No frills, no nonsense." +KinkyDungeonInventoryItemBountyhunterDesc2,Increases stealth by 10% in the dark. KinkyDungeonInventoryItemJailUniform,Jail Uniform KinkyDungeonInventoryItemJailUniformDesc,The prisoners are kept in revealing outfits to keep them from hiding things. -KinkyDungeonInventoryItemJailUniformDesc2,"A prisoner's 'outfit'. No bonuses, no penalties." +KinkyDungeonInventoryItemJailUniformDesc2,"Designed to make it hard to conceal weapons. Makes you more visible and vulnerable to the cold." KinkyDungeonInventoryItemWolfgirl,Wolfgirl Suit -KinkyDungeonInventoryItemWolfgirlDesc,An advanced suit designed for sport, breathable and also warm. -KinkyDungeonInventoryItemWolfgirlDesc2,"No bonuses, no penalties." +KinkyDungeonInventoryItemWolfgirlDesc,"An advanced suit designed for sport, breathable and also warm." +KinkyDungeonInventoryItemWolfgirlDesc2,"Made of latex. Resistant to electricity but does not insulate well." KinkyDungeonInventoryItemMaid,Maid Uniform KinkyDungeonInventoryItemMaidDesc,An elegant dress meant to denote a maid's status. KinkyDungeonInventoryItemMaidDesc2,"Massively increases accuracy against slime mold." +KinkyDungeonInventoryItemBast,Harem Outfit +KinkyDungeonInventoryItemBastDesc,A skimpy outfit with antiquated connotations. +KinkyDungeonInventoryItemBastDesc2,"Harkening back to an old era." + +KinkyDungeonInventoryItemBikini,Combat Bikini +KinkyDungeonInventoryItemBikiniDesc,"A minimalist albeit chilly outfit designed for ease of use." +KinkyDungeonInventoryItemBikiniDesc2,"Or perhaps it's just sexy..." +KinkyDungeonInventoryItemLingerie,Lingerie +KinkyDungeonInventoryItemLingerieDesc,"A minimalist yet aesthetically pleasing outfit." +KinkyDungeonInventoryItemLingerieDesc2,"No bonuses." + KinkyDungeonInventoryItemMaidUniform,Maid Uniform KinkyDungeonInventoryItemMaidUniformDesc,An elegant dress meant to denote a maid's status. KinkyDungeonInventoryItemMaidUniformDesc2,"Massively increases accuracy against slime mold." -KinkyDungeonInventoryItemDragon,Prisoner Uniform -KinkyDungeonInventoryItemDragonDesc,The uniform of choice for girls captured by the dragonhearts. -KinkyDungeonInventoryItemDragonDesc2,"Designed to make it hard to conceal weapons. No bonuses, no penalties." +KinkyDungeonInventoryItemDragon,Dragonheart Uniform +KinkyDungeonInventoryItemDragonDesc,The uniform of choice for dragonheart of all ranks. +KinkyDungeonInventoryItemDragonDesc2,"It's made of fire-resistant leather, and provides +5 armor." KinkyDungeonInventoryItemBlueSuitPrison,Scientific Uniform KinkyDungeonInventoryItemBlueSuitPrisonDesc,An outfit designed to leave little to the imagination. -KinkyDungeonInventoryItemBlueSuitPrisonDesc2,"No bonuses, no penalties." +KinkyDungeonInventoryItemBlueSuitPrisonDesc2,"Resistant to electricity but does not insulate well. Provides significant acid and glue protection for scientific purposes." KinkyDungeonInventoryItemBlueSuit,Latex Catsuit KinkyDungeonInventoryItemBlueSuitDesc,An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. -KinkyDungeonInventoryItemBlueSuitDesc2,"No bonuses, no penalties." +KinkyDungeonInventoryItemBlueSuitDesc2,"Resistant to electricity but does not insulate well. Provides significant acid and glue protection for scientific purposes." KinkyDungeonInventoryItemDollSuit,Doll Catsuit KinkyDungeonInventoryItemDollSuitDesc,An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. -KinkyDungeonInventoryItemDollSuitDesc2,"No bonuses, no penalties." +KinkyDungeonInventoryItemDollSuitDesc2,"Resistant to electricity but does not insulate well." KinkyDungeonInventoryItemCyberDoll,Cyber Doll Suit KinkyDungeonInventoryItemCyberDollDesc,A technologically advanced suit designed for long term wear. Despite being watertight and skintight it has cleaning and ventilation ports that plug directly into doll storage fixtures. -KinkyDungeonInventoryItemCyberDollDesc2,"No bonuses, no penalties." +KinkyDungeonInventoryItemCyberDollDesc2,"Resistant to electricity but does not insulate well." KinkyDungeonInventoryItemObsidian,Shadow Latex Dress KinkyDungeonInventoryItemObsidianDesc,"A minidress made from shadow latex, a favorite of otherwordly patrons." -KinkyDungeonInventoryItemObsidianDesc2,"No bonuses, no penalties." +KinkyDungeonInventoryItemObsidianDesc2,"Resistant to the elements, but is infused with crystals that amplify psychic damage to yourself." + +KinkyDungeonInventoryItemElementalDress,Elemental Slave Dress +KinkyDungeonInventoryItemElementalDressDesc,"A minidress made to adorn mortal slaves in the elemental planes." +KinkyDungeonInventoryItemElementalDressDesc2,"Resistant to the elements, but is infused with crystals that amplify psychic damage to yourself." KinkyDungeonInventoryItemElven,Elven Dress KinkyDungeonInventoryItemElvenDesc,A regal minidress worn by visitors to the forest. -KinkyDungeonInventoryItemElvenDesc2,"No bonuses, no penalties." +KinkyDungeonInventoryItemElvenDesc2,"Not very good at insulating you from the cold or from touchy fingers. Its elven aura improves accuracy and evasion by +10." KinkyDungeonInventoryItemScrollArms,Scroll of Sleight KinkyDungeonInventoryItemScrollArmsUse,The scroll makes your memories of arm movements clear as day! @@ -987,36 +1342,41 @@ KinkyDungeonInventoryItemAncientPowerSourceSpentDesc2,"A mysterious device used KinkyDungeonInventoryItemGold,Gold KinkyDungeonInventoryItemRedKey,Key -KinkyDungeonInventoryItemRedKeyDesc,"A key with traces of magic that fades with one use." -KinkyDungeonInventoryItemRedKeyDesc2,"Can be used to unlock a restraint, door, or chest." +KinkyDungeonInventoryItemRedKeyDesc,"A key. You wonder who it's for?" +KinkyDungeonInventoryItemRedKeyDesc2,"Can be used to unlock one simple or standard-locked restraint, door, or chest." KinkyDungeonInventoryItemBlueKey,Magic Key KinkyDungeonInventoryItemBlueKeyDesc,"A glowing key enchanted with magic that fades with one use." -KinkyDungeonInventoryItemBlueKeyDesc2,"Can be used to unlock a blue lock." +KinkyDungeonInventoryItemBlueKeyDesc2,"Can be used to unlock a runic lock." KinkyDungeonInventoryItemMagicKey,Magic Key KinkyDungeonInventoryItemMagicKeyDesc,"A magical key with the power to open blue locks." KinkyDungeonInventoryItemMagicKeyDesc2,"Blue locks can't be otherwise picked." KinkyDungeonInventoryItemEnchKnife,Magic Knife KinkyDungeonInventoryItemEnchKnifeDesc,"A magical blade, suitable against ghosts." -KinkyDungeonInventoryItemEnchKnifeDesc2,"Deals shadow damage. Can cut enchanted ropes." +KinkyDungeonInventoryItemEnchKnifeDesc2,"Deals shadow damage. Can cut enchanted ropes. Offhand: Increase base crit of all magic damage by 20%" KinkyDungeonInventoryItemBola,Bola KinkyDungeonInventoryItemBolaDesc,"A pair of weights attached to a rope. Can be thrown." KinkyDungeonInventoryItemBolaDesc2,"Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns." KinkyDungeonInventoryItem3BolaDesc,"A pair of weights attached to a rope. Can be thrown." KinkyDungeonInventoryItem3BolaDesc2,"Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns." KinkyDungeonInventoryItemBomb,Bomb -KinkyDungeonInventoryItemBombDesc,"After a 5 turn fuse, deals 100 fire damage in a 3x3 area." -KinkyDungeonInventoryItemBombDesc2,"Not a toy!" -KinkyDungeonInventoryItem3BombDesc,"After a 6 turn fuse, deals 100 fire damage in a 3x3 area." -KinkyDungeonInventoryItem3BombDesc2,"Not a toy!" +KinkyDungeonInventoryItemBombDesc2,"After a 5 turn fuse, deals 100 blast damage in a 3x3 area." +KinkyDungeonInventoryItemBombDesc,"Not a toy!" +KinkyDungeonInventoryItem3BombDesc2,"After a 5 turn fuse, deals 100 blast damage in a 3x3 area." +KinkyDungeonInventoryItem3BombDesc,"Not a toy!" KinkyDungeonInventoryItemBombUse,You light the fuse! KinkyDungeonInventoryItemKnife,Knife KinkyDungeonInventoryItemLockpick,Lockpick KinkyDungeonInventoryItemLockpickDesc,"A tool used to pick locks." KinkyDungeonInventoryItemLockpickDesc2,"Doesn't last forever, but can help in a pinch." +KinkyDungeonInventoryItemPick,Lockpick +KinkyDungeonInventoryItemPickDesc,"A tool used to pick locks." +KinkyDungeonInventoryItemPickDesc2,"Doesn't last forever, but can help in a pinch." KinkyDungeonInventoryItem2Lockpick,lockpick x2 KinkyDungeonInventoryItem4Lockpick,lockpicks x4 KinkyDungeonInventoryItem3Bola,Bola x3 KinkyDungeonInventoryItem3Bomb,Bomb x3 +KinkyDungeonInventoryItem2Dynamite,Dynamite x2 +KinkyDungeonInventoryItem2C4,Plastic Explosive x2 KinkyDungeonInventoryItemPotionMana,Mana Potion KinkyDungeonInventoryItemPotionManaUse,You sip the mana potion and feel empowered. KinkyDungeonInventoryItemPotionManaDesc,"A rare essence used by mages to recover their strength." @@ -1035,16 +1395,43 @@ KinkyDungeonInventoryItemPotionWillDesc,"A sweet potion, brimming with determina KinkyDungeonInventoryItemPotionWillDesc2,"Restores 25% willpower instantly. Can be used while gagged." KinkyDungeonInventoryItemPotionFrigid,Frigid Potion KinkyDungeonInventoryItemPotionFrigidUse,"You chug the concoction and your senses numb, helping you concentrate." -KinkyDungeonInventoryItemPotionFrigidDesc,"A freezing cold bottle with a bitter scent." +KinkyDungeonInventoryItemPotionFrigidDesc,"Like bottled snow. Helps to get your mind on track." KinkyDungeonInventoryItemPotionFrigidDesc2,"Reduces distraction to 0 and grants additional decay for 50 turns. Can be used while gagged." KinkyDungeonInventoryItemSmokeBomb,Smoke Bomb -KinkyDungeonInventoryItemSmokeBombUse,You toss the smoke bomb and it explodes in your location! -KinkyDungeonInventoryItemSmokeBombDesc,"A type of pyrotechnic often employed by saboteurs. Can be used without hands." +KinkyDungeonSpellCastSmokeBomb,You toss the smoke bomb and it starts emitting a deep haze! +KinkyDungeonInventoryItemSmokeBombUse,You ready a smoke bomb... +KinkyDungeonInventoryItemSmokeBombDesc,"A type of pyrotechnic often employed by saboteurs. Can be rolled and used without hands." KinkyDungeonInventoryItemSmokeBombDesc2,"Creates a smoke screen lasting 8 turns. You are harder to see while inside the smoke." +KinkyDungeonInventoryItem3Smoke,Smoke Bomb x3 +KinkyDungeonInventoryItem3SmokeDesc,"A type of pyrotechnic often employed by saboteurs. Can be rolled and used without hands." +KinkyDungeonInventoryItem3SmokeDesc2,"Creates a smoke screen lasting 8 turns. You are harder to see while inside the smoke." +KinkyDungeonInventoryItemFlashBomb,Flash Bomb +KinkyDungeonInventoryItem3Flash,Flash Bomb x3 +KinkyDungeonInventoryItem3Flashbang,Flashbang x3 +KinkyDungeonInventoryItem3Smoke,Smoke Bomb x3 +KinkyDungeonSpellCastFlashBomb,You toss the flash bomb and the fuse starts ticking... +KinkyDungeonInventoryItemFlashBombUse,You ready a flash bomb... +KinkyDungeonInventoryItemFlashBombDesc,"A type of explosive used by agents. Blinds nearby targets without causing significant injury." +KinkyDungeonInventoryItemFlashBombDesc2,"Blinds for 20 turns in a 3x3 area." +KinkyDungeonInventoryItem3FlashDesc,"A type of explosive used by agents. Blinds nearby targets without causing significant injury." +KinkyDungeonInventoryItem3FlashDesc2,"Blinds for 20 turns in a 3x3 area." + + +KinkyDungeonInventoryItemFlashbang,Flashbang +KinkyDungeonInventoryItem3Flashbang,Flashbang x3 +KinkyDungeonSpellCastFlashbang,You toss the flashbang and the fuse starts ticking... +KinkyDungeonSpellFlashbang,Flashbang +KinkyDungeonInventoryItemFlashbangUse,You ready a flashbang... +KinkyDungeonInventoryItemFlashbangDesc,"A piece of rare special forces equipment. The secrets of its manufacture are strictly kept by the Alchemist's Guild." +KinkyDungeonInventoryItemFlashbangDesc2,"Blinds for 24 turns in a 3x3 area. Also Slows and Silences them for half the duration." +KinkyDungeonInventoryItem3FlashbangDesc,"A piece of rare special forces equipment. The secrets of its manufacture are strictly kept by the Alchemist's Guild." +KinkyDungeonInventoryItem3FlashbangDesc2,"Blinds for 24 turns in a 3x3 area. And also Slows and Silences them for half the duration." + + KinkyDungeonInventoryItemPotionInvisibility,Invisibility Potion KinkyDungeonInventoryItemPotionInvisibilityUse,You chug the concoction and see your body fading away. KinkyDungeonInventoryItemPotionInvisibilityDesc,"You feel liquid inside, but you can't see it!" -KinkyDungeonInventoryItemPotionInvisibilityDesc2,"Casts Invisibility on yourself." +KinkyDungeonInventoryItemPotionInvisibilityDesc2,"Casts Vanish on yourself." KinkyDungeonInventoryItemEctoplasm,Ectoplasm KinkyDungeonInventoryItemEctoplasmUse,"Like a moisturizing cream, except it's made from coagulated souls." KinkyDungeonInventoryItemEctoplasmDesc,"Can be used without hands. Just apply directly to the forehead!" @@ -1066,7 +1453,11 @@ ItemPickupDollID,"You steal the doll's identification card." KinkyDungeonInventoryItemDollID,Doll ID KinkyDungeonInventoryItemDollIDUse,"You apply a clever trick to reset your visor cooldown." KinkyDungeonInventoryItemDollIDDesc,"A chip used to identify dolls. She must have dropped it. Either way it contains valuable tech..." -KinkyDungeonInventoryItemDollIDDesc2,"It could be used to trick your visor into thinking you've performed your tasks for a while." +KinkyDungeonInventoryItemDollIDDesc2,"With enough, it can be used to remove Dollmaker's headwear." + + + +KinkyDungeonInventoryItemHeart,Heart Amulet ItemPickupDonut,"You find a donut with sprinkles!" KinkyDungeonInventoryItemDonut,Donut (Sprinkles) @@ -1091,7 +1482,7 @@ KinkyDungeonConsumableLessEffective,The potion was less effective due to your ga KinkyDungeonInventoryItemElfCrystal,Elven Soap KinkyDungeonInventoryItemElfCrystalUse,"You feel the restraints become loose on your skin!" KinkyDungeonInventoryItemElfCrystalDesc,"The secret to elven cosmetics and blemish-free skin." -KinkyDungeonInventoryItemElfCrystalDesc2,"Makes you slippery for 10 turns, boosting all forms of struggling." +KinkyDungeonInventoryItemElfCrystalDesc2,"Makes you slippery for 100 turns, boosting all forms of struggling." KinkyDungeonSpellCastSlippery,You feel the restraints become loose on your skin! @@ -1108,36 +1499,37 @@ KDDollmakerTooManyDolls,"You are unable to control more than 3 dolls. The new do KinkyDungeonInventoryItemStaffIncineration,Staff of Incineration KinkyDungeonInventoryItemStaffIncinerationDesc,"A magical weapon made for intermediates to use." -KinkyDungeonInventoryItemStaffIncinerationDesc2,"+25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn." +KinkyDungeonInventoryItemStaffIncinerationDesc2,"+25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. Offhand: Applies %fire damage bonus." KinkyDungeonInventoryItemStaffStorm,Staff of Storms KinkyDungeonInventoryItemStaffStormDesc,"A magical weapon made for intermediates to use." -KinkyDungeonInventoryItemStaffStormDesc2,"+20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area." +KinkyDungeonInventoryItemStaffStormDesc2,"+20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. Offhand: Applies electric damage bonus." KinkyDungeonInventoryItemStaffFrostbite,Staff of Frostbite KinkyDungeonInventoryItemStaffFrostbiteDesc,"A magical weapon with a 33% chance to freeze the target for 4 turns." -KinkyDungeonInventoryItemStaffFrostbiteDesc2,"+20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn." +KinkyDungeonInventoryItemStaffFrostbiteDesc2,"+20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. Offhand: Applies ice damage bonus." KinkyDungeonInventoryItemStaffBind,Staff of Binding KinkyDungeonInventoryItemStaffBindDesc,"A magical weapon made to use on novices." -KinkyDungeonInventoryItemStaffBindDesc2,"+20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency." +KinkyDungeonInventoryItemStaffBindDesc2,"+20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. Offhand: Applies chain damage bonus." KinkyDungeonInventoryItemArcaneCrystal,Arcane Orb KinkyDungeonInventoryItemArcaneCrystalDesc,"Look into my eyes..." -KinkyDungeonInventoryItemArcaneCrystalDesc2,"Deals shadow damage. Can be used without hands. Does not benefit from enemies being vulnerable." +KinkyDungeonInventoryItemArcaneCrystalDesc2,"Deals arcane damage. Can be used without hands. Can not critically strike." +ItemPickupArcaneCrystal,"You find a purple crystal. You feel your mystic powers flood into it." KinkyDungeonInventoryItemStaffFlame,Staff of Flame KinkyDungeonInventoryItemStaffFlameDesc,"A magical weapon made for novices to use." -KinkyDungeonInventoryItemStaffFlameDesc2,"+15% fire damage. Deals fire damage." +KinkyDungeonInventoryItemStaffFlameDesc2,"+15% fire damage. Deals fire damage. Offhand: Applies passive bonus." KinkyDungeonInventoryItemStaffGlue,Staff of Slime KinkyDungeonInventoryItemStaffGlueDesc,"A slimy and magical implement.." -KinkyDungeonInventoryItemStaffGlueDesc2,"+10% glue damage. Deals glue damage." +KinkyDungeonInventoryItemStaffGlueDesc2,"+10% glue damage. Deals glue damage. Offhand: Applies passive bonus." KinkyDungeonInventoryItemStaffElectric,Staff of Shocking KinkyDungeonInventoryItemStaffElectricDesc,"A magical weapon made for novices to use." -KinkyDungeonInventoryItemStaffElectricDesc2,"+10% electric damage. Deals electric damage. 10% chance to stun for 3 turns." +KinkyDungeonInventoryItemStaffElectricDesc2,"+10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. Offhand: Applies electric damage bonus." KinkyDungeonInventoryItemStaffPermafrost,Staff of Permafrost KinkyDungeonInventoryItemStaffPermafrostDesc,"A magical weapon with a 15% chance to freeze the target for 4 turns." -KinkyDungeonInventoryItemStaffPermafrostDesc2,"+10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration)" +KinkyDungeonInventoryItemStaffPermafrostDesc2,"+10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration). Offhand: Applies ice damage bonus." KinkyDungeonInventoryItemStaffChain,Staff of Chains KinkyDungeonInventoryItemStaffChainDesc,"A magical weapon made for novices in the art of bondage." -KinkyDungeonInventoryItemStaffChainDesc2,"+10% chain damage. Deals chain damage. 150% binding efficiency." - +KinkyDungeonInventoryItemStaffChainDesc2,"+10% chain damage. Deals chain damage. 150% binding efficiency. Offhand: Applies chain damage bonus." +ItemPickupStaffChain,"You pick up a staff of chains. You have fond memories..." ItemPickupStaffBind,"You pick up a staff of binding. You remember these from wizard school..." ItemPickupStaffStorm,"You pick up a staff of the storm. Your hair stands on end." @@ -1145,16 +1537,14 @@ ItemPickupStaffIncineration,"You pick up a staff of incineration. It rumbles wit ItemPickupStaffDoll,"You pick up a staff with a name on it: DOLLMAKER" ItemPickupStaffFrostbite,"You pick up a staff of frostbite. Your hand feels numb just reaching for it." -ItemPickupStaffChain,"You pick up a staff of chains. You have fond memories..." ItemPickupStaffElectric,"You pick up a staff of the storm. It tingles." ItemPickupStaffFlame,"You pick up a staff of flames. It feels warm." -ItemPickupArcaneCrystal,"You find a purple crystal. You feel your mystic powers flood into it." ItemPickupStaffGlue,"You pick up a staff of slime." ItemPickupStaffPermafrost,"You pick up a staff of permafrost. It feels icy to the touch." KinkyDungeonInventoryItemCrop,Crop KinkyDungeonInventoryItemCropDesc,"For those unruly subs." -KinkyDungeonInventoryItemCropDesc2,"Deals pain damage. Highly distracting." +KinkyDungeonInventoryItemCropDesc2,"Deals pain damage. Highly distracting. Offhand: +5 pain damage on attack for 3 stamina." ItemPickupCrop,"You pick up a riding crop." KinkyDungeonInventoryItemScissors,Scissors @@ -1164,7 +1554,7 @@ ItemPickupScissors,"You pick up a pair of scissors." KinkyDungeonInventoryItemDirk,Dagger KinkyDungeonInventoryItemDirkDesc,"Designed with subterfuge in mind." -KinkyDungeonInventoryItemDirkDesc2,"Deals slash damage. Deals 55 pierce damage instead on unaware targets." +KinkyDungeonInventoryItemDirkDesc2,"Deals slash damage. Deals 40 pierce damage instead on unaware targets, before crit modifiers. Offhand: +10% Base Weapon Crit" ItemPickupDirk,"You pick up a dagger." KinkyDungeonInventoryItemKatana,Katana @@ -1179,7 +1569,7 @@ ItemPickupDarkKatana,"You pick up Shadow's Edge." KinkyDungeonInventoryItemStormBreaker,Stormbreaker KinkyDungeonInventoryItemStormBreakerDesc,"I have the power! Taking electric damage charges you (1 turn/10dmg)." -KinkyDungeonInventoryItemStormBreakerDesc2,"Deals crush damage. Deals bonus electric damage in an area when charged, up to +40." +KinkyDungeonInventoryItemStormBreakerDesc2,"Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. Gives +100 Electric Resist when held. (can be wielded offhand to apply the Electric Resist)" ItemPickupStormBreaker,"You pick up Stormbreaker." @@ -1194,49 +1584,58 @@ KinkyDungeonInventoryItemFoilDesc,"En garde!" KinkyDungeonInventoryItemFoilDesc2,"Deals pierce damage. Deals 30 damage instead on vulnerable targets." ItemPickupFoil,"You pick up a fencing sword." +KinkyDungeonInventoryItemMaul,Sledgehammer +KinkyDungeonInventoryItemMaulDesc,"Do you have what it takes?" +KinkyDungeonInventoryItemMaulDesc2,"Deals heavy crush damage and knocks the target back 2 spaces. Deals bonus damage to most solid barricades." +ItemPickupMaul,You pick up a heavy sledgehammer. + KinkyDungeonInventoryItemHammer,Hammer -KinkyDungeonInventoryItemHammerDesc,"A rather simplistic bludgeoning weapon." +KinkyDungeonInventoryItemHammerDesc,"A crude way of fixing your problems." KinkyDungeonInventoryItemHammerDesc2,"Deals crush damage and knocks the target back." KinkyDungeonInventoryItemFlail,Flail -KinkyDungeonInventoryItemFlailDesc,"A ball on a chain. Very fast and hard to dodge." +KinkyDungeonInventoryItemFlailDesc,"Very fast and hard to dodge as long as you know what you're doing." KinkyDungeonInventoryItemFlailDesc2,"Also deals 10 damage to targets next to you. Deals crush damage." KinkyDungeonInventoryItemSpear,Spear KinkyDungeonInventoryItemSpearDesc,"Speak softly and carry a pointy stick." -KinkyDungeonInventoryItemSpearDesc2,"Deals pierce damage to the target and one square behind it." +KinkyDungeonInventoryItemSpearDesc2,"Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 2 tiles away." +KinkyDungeonInventoryItemPike,Pike +KinkyDungeonInventoryItemPikeDesc,"An 11 foot pole, for things you wouldn't want to touch with a 10 foot pole." +KinkyDungeonInventoryItemPikeDesc2,"Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 3 tiles away." KinkyDungeonInventoryItemBoltCutters,Bolt Cutters -KinkyDungeonInventoryItemBoltCuttersDesc,"A cutting tool useful as a bludgeon, and also for cutting locks and chains." +KinkyDungeonInventoryItemBoltCuttersDesc,"The universal key." KinkyDungeonInventoryItemBoltCuttersDesc2,"Also assists in cutting restraints when equipped." KinkyDungeonInventoryItemKnife,Knife KinkyDungeonInventoryItemKnifeDesc,"A go-to for travelers and adventurers." -KinkyDungeonInventoryItemKnifeDesc2,"Deals slash damage." +KinkyDungeonInventoryItemKnifeDesc2,"Deals slash damage. Offhand: +10 Block" +KinkyDungeonInventoryItemFlashlight,Flashlight +KinkyDungeonInventoryItemFlashlightDesc,"A weapon of mass illumination." +KinkyDungeonInventoryItemFlashlightDesc2,"Provides a highly directional light source." +ItemPickupFlashlight,"You pick up a flashlight." KinkyDungeonInventoryItemTorch,Torch KinkyDungeonInventoryItemTorchDesc,"Second only to the mighty towel in usefulness." KinkyDungeonInventoryItemTorchDesc2,"Deals fire damage. Provides light." KinkyDungeonInventoryItemUnarmed,Unarmed -KinkyDungeonInventoryItemUnarmedDesc,"Fight with your hands and feet." +KinkyDungeonInventoryItemUnarmedDesc,"Fight with your hands and feet. Counts as teasing if arms are free. 50% chance to stun target if the target is disarmed." KinkyDungeonInventoryItemUnarmedDesc2,"Deals unarmed damage." KinkyDungeonInventoryItemSword,Sword -KinkyDungeonInventoryItemSwordDesc,"The blade is strong, its edge sharp." +KinkyDungeonInventoryItemSwordDesc,"the steel is strong, and the blade true." KinkyDungeonInventoryItemSwordDesc2,"A fast and accurate weapon that deals slash damage." KinkyDungeonInventoryItemFlamberge,Flamberge -KinkyDungeonInventoryItemFlambergeDesc,"A blade forged in a magical fire." -KinkyDungeonInventoryItemFlambergeDesc2,"Deals 20 bonus fire damage on hit." +KinkyDungeonInventoryItemFlambergeDesc,"A blade forged in magic fire." +KinkyDungeonInventoryItemFlambergeDesc2,"Deals 20 bonus slash damage on hit. Offhand: Produces light." KinkyDungeonInventoryItemEscortDrone,Escort Drone KinkyDungeonInventoryItemEscortDroneDesc,"A semi-autonomous drone with a personal defense beam. Does not require hands to equip." KinkyDungeonInventoryItemEscortDroneDesc2,"Deals electric damage. 33% chance to stun for 4 turns." KinkyDungeonInventoryItemVibeWand,Magic Wand KinkyDungeonInventoryItemVibeWandDesc,"Its powers extend beyond the traditional schools of magic." -KinkyDungeonInventoryItemVibeWandDesc2,"Deals charm damage. 20% chance to stun the target for 2 turns." -KinkyDungeonInventoryItemFeather,Feather -KinkyDungeonInventoryItemFeatherDesc,"A feather useful for tickling." -KinkyDungeonInventoryItemFeatherDesc2,"Deals tickle damage. Distracts enemies." +KinkyDungeonInventoryItemVibeWandDesc2,"Deals charm damage. 20% chance to stun the target for 2 turns. Offhand: +5 charm damage on attack for 3 stamina." KinkyDungeonInventoryItemIceCube,Ice Cube KinkyDungeonInventoryItemIceCubeDesc,"A magical cube of ice that never melts. Convenient!" -KinkyDungeonInventoryItemIceCubeDesc2,"Deals 10 ice damage with a 10% chance to freeze for 3 turns." +KinkyDungeonInventoryItemIceCubeDesc2,"Deals 10 ice damage with a 10% chance to freeze for 1 turn. Slows targets on hit. Offhand: Slows the target." KinkyDungeonInventoryItemRope,Rope KinkyDungeonInventoryItemRopeDesc,"A kidnapper's most versatile tool." KinkyDungeonInventoryItemRopeDesc2,"Deals chain damage and applies 50 points of binding." -KinkyDungeonInventoryItemMagicSword,Enchanted Sword +KinkyDungeonInventoryItemMagicSword,Magic Sword KinkyDungeonInventoryItemMagicSwordDesc,"Slices through ghosts with ease!" KinkyDungeonInventoryItemMagicSwordDesc2,"A sword that guides itself toward its target, making it easy to hit with." KinkyDungeonInventoryItemDragonslaver,Dragonslaver @@ -1244,16 +1643,19 @@ KinkyDungeonInventoryItemDragonslaverDesc,"A powerful weapon with an ancient mec KinkyDungeonInventoryItemDragonslaverDesc2,"Deals slash damage. Can make ranged attacks.. Drains 0.75% ancient energy to fire a line of belts that deal 40 chain damage and 40 binding." KinkyDungeonInventoryItemTheEncaser,Metamorphosis KinkyDungeonInventoryItemTheEncaserDesc,"You can enter slime form for 25 turns, which lets you pass thru bars, +50 Evasion, and deals 25 glue damage when attacked." -KinkyDungeonInventoryItemTheEncaserDesc2,"Deals glue damage. Roots targets for 2 turns on a hit." +KinkyDungeonInventoryItemTheEncaserDesc2,"Deals glue damage. Roots targets for 2 turns on a hit. Offhand: Roots targets on hit." KinkyDungeonInventoryItemFourSeasons,Four Seasons KinkyDungeonInventoryItemFourSeasonsDesc,"Activate to reduce the cost of your next fire, water/ice, air/lightning, and earth spell by 50, once per element." -KinkyDungeonInventoryItemFourSeasonsDesc2,"Deals shadow damage. +25% fire, ice, acid, crush, electric, pressure damage." +KinkyDungeonInventoryItemFourSeasonsDesc2,"Deals shadow damage. +25% fire, ice, soap, crush, electric, blast damage. Offhand: Applies passive bonus." KinkyDungeonInventoryItemArbiter,The Arbiter KinkyDungeonInventoryItemArbiterDesc,"I have altered the rules. Pray I do not alter them further." -KinkyDungeonInventoryItemArbiterDesc2,"Deals chain damage with 110% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Ranged attack: Disarm" -KinkyDungeonInventoryItemBondageBuster,Bondage Buster -KinkyDungeonInventoryItemBondageBusterDesc,"Can fire a beam (1 turn channel) that deals 30 electric damage, but charges when not fired, dealing 90 total damage at 10 turns of charge." +KinkyDungeonInventoryItemArbiterDesc2,"Deals chain damage with 125% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Weapon Ability: Disarm" +KinkyDungeonInventoryItemBondageBuster,Bondage Buster EX +KinkyDungeonInventoryItemBondageBusterDesc,"Can fire a beam (1 turn channel) that deals 30 electric damage and applies an equal amount of energy bondage. Charges when not fired, dealing 90 total damage at 10 turns of charge." KinkyDungeonInventoryItemBondageBusterDesc2,"Melee mode deals tickle damage and marks enemies as vulnerable for 4 turns." +KinkyDungeonInventoryItemBondageBusterII,Bondage Buster MK II +KinkyDungeonInventoryItemBondageBusterIIDesc,"Can fire a beam (3 turn channel) that deals 35 electric damage in an area and applies an equal amount of energy bondage. While charge is below 50%, has a 10% chance to misfire." +KinkyDungeonInventoryItemBondageBusterIIDesc2,"Melee mode deals tickle damage and marks enemies as vulnerable for 2 turns." KinkyDungeonInventoryItemBlaster,Nevermere Blaster KinkyDungeonInventoryItemBlasterDesc,"Can fire a blast that deals 25 electric damage." KinkyDungeonInventoryItemBlasterDesc2,"Melee mode deals tickle damage." @@ -1263,28 +1665,30 @@ KinkyDungeonInventoryItemMessengerOfLove,Messenger of Love KinkyDungeonInventoryItemMessengerOfLoveDesc,"Love shines in many ways..." KinkyDungeonInventoryItemMessengerOfLoveDesc2,"Can fire an arrow that makes an enemy extremely lustful, causing them to attack others. Lasts forever on lesser enemies, 30 turns on high-level enemies, and 10 turns on bosses." KinkyDungeonInventoryItemMoiraiScissors,Moirai's Scissors -KinkyDungeonInventoryItemMoiraiScissorsDesc,"Safety first!" -KinkyDungeonInventoryItemMoiraiScissorsDesc2,"Deals slash damage. Adds up to 30 bonus psychic damage her hit by converting binding into damage. Drains 5 charge to attack twice." +KinkyDungeonInventoryItemMoiraiScissorsDesc,"Cutting the threads of fate." +KinkyDungeonInventoryItemMoiraiScissorsDesc2,"Deals slash damage. Ignores up to 100 Magic and Physical armor. Active ability: Spend 50 charge to free all nearby allies and disrobe enemies, increasing charm damage on them by 100% and applying the armor shred." +KinkyDungeonSpellCastMoiraiScissors,"With a single snip of the magic scissors, everyone's clothes fall off." +KDMoiraiFail,No eligible targets within 4 tiles KinkyDungeonInventoryItemSlimethrower,Latex Projector KinkyDungeonInventoryItemSlimethrowerDesc,"Deals crush damage. Can be used to spray a '+' shaped pool of slime." -KinkyDungeonInventoryItemSlimethrowerDesc2,"Drains 1.5% ancient energy to create a pool of slime that deals 35 glue damage per tile and slows enemies." -KinkyDungeonInventoryItemMagicAxe,Enchanted Axe +KinkyDungeonInventoryItemSlimethrowerDesc2,"Spend 15 charge to create a pool of slime that deals 35 glue damage per tile and slows enemies." +KinkyDungeonInventoryItemMagicAxe,Magic Axe KinkyDungeonInventoryItemMagicAxeDesc,"Sick and vile, like the hearts of your enemies." -KinkyDungeonInventoryItemMagicAxeDesc2,"Deals shadow damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns." +KinkyDungeonInventoryItemMagicAxeDesc2,"Deals slash damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns and applies 60 shadow damage bleed over time to enemies around you." KinkyDungeonInventoryItemPickaxe,Pickaxe KinkyDungeonInventoryItemPickaxeDesc,"Used for drilling holes in rock and armor." KinkyDungeonInventoryItemPickaxeDesc2,"Deals pierce damage. Reduces enemy armor by 15 for 6 turns." -KinkyDungeonInventoryItemMagicFlail,Enchanted Flail +KinkyDungeonInventoryItemMagicFlail,Magic Flail KinkyDungeonInventoryItemMagicFlailDesc,"A blessed censer that distributes pain equally." -KinkyDungeonInventoryItemMagicFlailDesc2,"Deals crush damage to the target and all enemies near the target." -KinkyDungeonInventoryItemMagicSpear,Enchanted Spear +KinkyDungeonInventoryItemMagicFlailDesc2,"Deals crush damage. Deals 20 bonus holy damage to the target and enemies near the target." +KinkyDungeonInventoryItemMagicSpear,Magic Spear KinkyDungeonInventoryItemMagicSpearDesc,"Seeks and pierces hearts with ease." -KinkyDungeonInventoryItemMagicSpearDesc2,"Deals pierce damage to the target and two squares behind it." -KinkyDungeonInventoryItemMagicHammer,Enchanted Hammer +KinkyDungeonInventoryItemMagicSpearDesc2,"Deals pierce damage to the target and two squares behind it. Can be used to make a ranged attack." +KinkyDungeonInventoryItemMagicHammer,Magic Hammer KinkyDungeonInventoryItemMagicHammerDesc,"Made of a magical, resonant material." KinkyDungeonInventoryItemMagicHammerDesc2,"Deals crush damage and knocks the target back. Helps to bash open restraints while cutting." -KinkyDungeonInventoryItemIceBreaker,IceBreaker -KinkyDungeonInventoryItemIceBreakerDesc,"A frigid lightweight hammer with a spike on the end." +KinkyDungeonInventoryItemIceBreaker,Icebreaker +KinkyDungeonInventoryItemIceBreakerDesc,"A frigid magical hammer useful for both climbing up and destroying ice." KinkyDungeonInventoryItemIceBreakerDesc2,"Deals crush damage. Deals 3x damage to frozen targets instead of 2x. Triggers Shatter." KinkyDungeonInventoryItemDreamcatcher,Dreamcatcher KinkyDungeonInventoryItemDreamcatcherDesc,"Forged in nightmares, woven in steel. Summons a Shadow Warrior on unaware targets for 2% ancient energy." @@ -1295,11 +1699,13 @@ KinkyDungeonInventoryItemAxeDesc2,"Also deals 20 damage to enemies next to you. KinkyDungeonNoWeaponKnife,Knife KinkyDungeonNoWeapon,Unarmed KinkyDungeonAccuracy,"Accuracy: " +KinkyDungeonCrit,"Crit Multiplier: " +KinkyDungeonBindCrit,"Bind Crit Multiplier: " KinkyDungeonPlayerNoKeys,Find the keys.. KinkyDungeonPlayerYesKeys,Find the exit! KinkyDungeonPlayerHelp,"You are receiving help from a friendly ally." KinkyDungeonPlayerHook,"You found a hook you can use to pull on straps and loops." -KinkyDungeonPlayerSharp,"You have access to something sharp and can attempt to cut restraints." +KinkyDungeonPlayerSharp,"You have access to something sharp and can attempt to Cut restraints, or Remove more effectively." KinkyDungeonPlayerEdge,"You found a corner to help manipulate buckles and snaps with." KinkyDungeonPlayerCrack,"You found a crack and could maybe wedge a knife or tool into it to keep it still." KinkyDungeonPlayerSticky,"You found something sticky and might be able to pull off fabrics." @@ -1326,19 +1732,23 @@ KinkyDungeonVibing4,Your toys vibrate intensely! KinkyDungeonVibing5,The vibration is torturous! KinkyDungeonPlayerEdged,"Edged!" -KinkyDungeonPlayerStatisfied,"Satisfied~" +KinkyDungeonPlayerStatisfied,"Satisfied. Miscast chance is reduced." KinkyDungeonWeaponDamage,"Damage: " +KinkyDungeonWeaponDamageBind,"Bind: " +KinkyDungeonWeaponCrit,"Crit: " +KinkyDungeonWeaponBindCrit,"Crit: " KinkyDungeonWeaponAccuracy,"Accuracy: " KinkyDungeonWeaponStamina,"SP Cost: " +KinkyDungeonWeaponCutPower,"Cut PWR: AMNT%" KinkyDungeonCharger,It appears to be a receptacle KinkyDungeonChargerPlaceCrystal,Place live crystal KinkyDungeonChargerRemoveCrystal,Take the crystal KinkyDungeonChargerPlace,You place the crystal into the receptacle and it lights up! KinkyDungeonChargerRemove,You take the crystal from the receptacle and all goes dark. -KinkyDungeonChargerNoRemove,You try to take the crystal but the cage around it is secured with a purple lock. +KinkyDungeonChargerNoRemove,You try to take the crystal but the cage around it is secured with a magic purple lock. KinkyDungeonChargerCharge,Place spent crystal KinkyDungeonChargerChargeSuccess,VALUE gold vanishes from your satchel as the receptacle explodes and your crystal is recharged! KinkyDungeonChargerChargeFailure,Nothing seems to happen @@ -1346,6 +1756,7 @@ KinkyDungeonChargerChargeFailure,Nothing seems to happen KinkyDungeonTorsoGrab,The EnemyName grabs you by the RestraintName and keeps you in place! KinkyDungeonLeashGrab,The EnemyName grabs you and pulls you!!! KinkyDungeonAttackMiss,The EnemyName misses you! +KinkyDungeonAttackMissCrouch,You duck under the EnemyName's attack! KinkyDungeonHearDoorOpenNear,You hear a door creak open nearby! KinkyDungeonHearDoorOpenFar,You hear the faint sound of a door opening. @@ -1355,7 +1766,9 @@ KinkyDungeonHearDoorCloseFar,You hear a door being shut in the distance. KinkyDungeonSlimeSpread,"The slime is spreading over your body!!!" KinkyDungeonSlimeHarden,"The slime starts to harden over your skin..." - +KinkyDungeonLivingSpread,"The RESTRAINTNAME creates more bindings out of thin air! (+RestraintAdded)" +KinkyDungeonLivingAppear,"A RESTRAINTNAME has appeared around your neck! Beware of additional restraints!" +KinkyDungeonLivingDormant,"The RESTRAINTNAME has run out of bindings to add and has gone dormant for a period of time." NameAngel,Angel KillAngel,"You subdue the angel!" @@ -1384,10 +1797,11 @@ KinkyDungeonAngelDefeated,"Angel: MMMMMPHH!!!" KinkyDungeonAngelUnlock,"(The angel looks puzzled and unlocks your divine restraints)" -KDArmorBlock,"Your ArmorName blocks the EnemyName's attack, falling off in the process." +KDArmorBlock,"The EnemyName pulls away your ArmorName!!!" +KDArmorBlockBug,"There was a bug removing your ArmorName. Please report!" KDBypasses,"The EnemyName bypasses your security to add the RestraintName!" -KDAttackBlocked,"The EnemyName attacks you, but you block the attack!" -KDRestraintBlockedItem,"Blocked!" +KDAttackBlocked,"The EnemyName tries to restrain you, but you resist the bondage!" +KDRestraintBlockedItem,"Resist!" NameDoorLock,Mystic Lock KillDoorLock,"The mystic lock fades, allowing you to pass once more." @@ -1403,6 +1817,8 @@ NameDecoy,Illusion KillDecoy,"The illusion vanishes into thin air." NameWall,Wall KillWall,"The wall shatters into pieces, which fade away slowly." +NameWallDoor,Locked Door +KillWallDoor,"The door lock shatters into pieces." NameEarthenMonolith,Earthen Monolith KillEarthenMonolith,"The monolith recedes into the ground." NameStaticSphere,Static Sphere @@ -1472,6 +1888,14 @@ AttackMaidforceMafiaLock,"The maid snaps a lock on one of your restraints! (Dama AttackMaidforceMafiaStun,"The maid lands a kick and stuns you! (DamageTaken)" AttackMaidforceMafia,"The maid slaps you with a scornful expression! (DamageTaken)" + +NameMaidforceMini,Heavy Weapons Maid +KillMaidforceMini,"The maid drops her weapon and runs." +AttackMaidforceMiniBind,"The maid uses secure restraints on you! (+RestraintAdded)" +AttackMaidforceMiniLock,"The maid snaps a lock on one of your restraints! (DamageTaken)" +AttackMaidforceMiniStun,"The maid bonks you with her weapon! (DamageTaken)" +AttackMaidforceMini,"The maid slaps you with a scornful expression! (DamageTaken)" + NameMaidforcePara,M.F. 'Parasol' KillMaidforcePara,"The maid leaps out of sight." AttackMaidforceParaBind,"The maid uses secure restraints on you! (+RestraintAdded)" @@ -1508,7 +1932,7 @@ AttackElfLock,"The druid tosses a lock from her cloak! It finds you and fastens NameElementalWater,Water Elemental KillElementalWater,"The water elemental melts into a pool of water." AttackElementalWaterBind,"The water elemental's song compels you to be bound! (+RestraintAdded)" -AttackElementalWaterBindLock,"The water elemental sings a song of helplessness. (DamageTaken)" +AttackElementalWaterLock,"The water elemental sings a song of helplessness. (DamageTaken)" AttackElementalWaterPull,"The water elemental's song compels you to step forward and receive a binding!" AttackElementalWater,"The water elemental sings an arousing song! (DamageTaken)" @@ -1523,7 +1947,9 @@ KillElementalEarth,"The earth elemental sinks into the ground." AttackElementalEarthBind,"The earth elemental pins you and slaps on some restraints! (+RestraintAdded)" AttackElementalEarthLock,"The earth elemental locks a restraint!" AttackElementalEarthDash,"The earth elemental dashes through the earth!" -AttackElementalEarth,"The earth elemental gives you a heavy massage! (DamageTaken)" +AttackElementalEarth,"The earth elemental gives you a soft massage! (DamageTaken)" + + NameElementalAir,Air Elemental KillElementalAir,"There is no more elemental. Must have been just the wind." @@ -1545,7 +1971,7 @@ AttackSummonedZombie,"The zombie gropes your body! (DamageTaken)" NameSummonedDrone,Support Drone KillSummonedDrone,"The support drone retreats to recharge its weapon!" -AttackSummonedDrone,"The support drone electrocutes you! (DamageTaken)" +AttackSummonedDrone,"The support drone zaps you! (DamageTaken)" KinkyDungeonSummonSingleSummonedDrone,The Dollmaker commands a drone to attack you! KinkyDungeonSummonMultiSummonedDrone,The Dollmaker commands her drones to attack you! @@ -1647,13 +2073,13 @@ KillDragonPoison,"The Poison Dragonheart retreats in a green mist." AttackDragonPoisonBind,"The Poison Dragonheart apprehends you! (+RestraintAdded)" AttackDragonPoisonStun,"The Poison Dragonheart smacks you with her axe! (DamageTaken)" AttackDragonPoison,"The Poison Dragonheart thrums her claws across your figure! (DamageTaken)" -AttackDragonPoisonLock,"The Dragonheart locks your restraint! (DamageTaken)" +AttackDragonPoisonLock,"The Dragonheart locks your restraint using natural magics! (DamageTaken)" NameDragonCrystal,Crystal Dragonheart KillDragonCrystal,"The Crystal Dragonheart screams and falls to the ground dramatically." AttackDragonCrystalBind,"The Crystal Dragonheart apprehends you! (+RestraintAdded)" AttackDragonCrystal,"The Crystal Dragonheart squeezes you in a big hug! (DamageTaken)" -AttackDragonCrystalLock,"The Dragonheart locks your restraint! (DamageTaken)" +AttackDragonCrystalLock,"The Dragonheart grows a crystalline lock on your restraints! (DamageTaken)" KinkyDungeonSummonMultiChaoticCrystal,Many crystals rise up out of the ground! KinkyDungeonSummonSingleChaoticCrystal,A crystal rises up out of the ground! @@ -1689,9 +2115,14 @@ AttackSoulCrystalActive,"The soul crystal leeches strength from you! (DamageTake NameDragonShadow,Shadow Dragonheart KillDragonShadow,"The Shadow Dragonheart frowns and runs away." AttackDragonShadowBind,"The Shadow Dragonheart apprehends you! (+RestraintAdded)" +AttackDragonShadowLock,"The Shadow Dragonheart conjures a shadowly lock! (DamageTaken)" AttackDragonShadowPull,"The Shadow Dragonheart extends her scythe and pulls you closer!!!" AttackDragonShadow,"The Shadow Dragonheart catches you with her scythe! (DamageTaken)" + + + + NameDragonLeader,Dragonheart Leader KillDragonLeader,"The Dragonheart Leader admits defeat." AttackDragonLeaderBind,"The Dragonheart Leader apprehends you! (+RestraintAdded)" @@ -1741,6 +2172,12 @@ AttackDollmakerSpecial,"The dollmaker's apprentice unleashes a powerful latex bl +NamePinkAlchemist,...Alchemist? +KillPinkAlchemist,You rescue the alchemist. +AttackPinkAlchemistBind,"The Alchemist restrains you! (+RestraintAdded)" +AttackPinkAlchemist,"The alchemist hugs you in a rubbery embrace! (DamageTaken)" +AttackPinkAlchemistLock,"The alchemist uses an ornate-looking lock! (DamageTaken)" + NameAlchemist,Alchemist KillAlchemist,"The alchemist screams and runs." AttackAlchemistBind,"The Alchemist restrains you! (+RestraintAdded)" @@ -1762,7 +2199,7 @@ AttackWolfgirlPet,"The wolfgirl cuddles with you! (DamageTaken)" NameWolfGuard,Wolfguard KillWolfGuard,"The wolfguard's suit punishes her for poor performance!" AttackWolfGuardDash,"The wolfguard lunges at you and strikes you!" -AttackWolfGuard,"The wolfguard's escort drones electrocute you! (DamageTaken)" +AttackWolfGuard,"The wolfguard's escort drones shock you! (DamageTaken)" AttackWolfGuardBind,"The wolfguard's escort drones deploy some restraints! (+RestraintAdded)" NameWolfgirl,Wolfgirl Trainer @@ -1791,7 +2228,7 @@ AttackWolfExecutiveLock,"The Executive's drones apply high-security locks to you NameWolfInstructor,Wolf Instructor KillWolfInstructor,"The instructor deploys active camoflague and retreats!" -AttackWolfInstructor,"The instructor disciplies you! (DamageTaken)" +AttackWolfInstructor,"The instructor disciplines you! (DamageTaken)" AttackWolfInstructorBind,"The instructor applies advanced training gear! (+RestraintAdded)" AttackWolfInstructorLock,"The instructor adds a lock to your restraints." @@ -1816,7 +2253,7 @@ KinkyDungeonSpellDroneExplosion,Drone Explosion NameOldDrone,Rusty Drone KillOldDrone,"The drone's mechanisms grind to a halt." -AttackOldDrone,"The drone uses a short-ranged electrocution attack! (DamageTaken)" +AttackOldDrone,"The drone uses a short-ranged electric attack! (DamageTaken)" AttackOldDroneBind,"The drone disassembles itself, revealing a set of restraining cables! (+RestraintAdded)" NameOldTapeDrone,Rusty Auto Taper @@ -1826,16 +2263,10 @@ AttackOldTapeDroneBind,"The wraps you in many layers of tape! (+RestraintAdded)" NameRubberTurret,Rubber Blaster KillRubberTurret,"The turret enters an unstable state, about to spread rubber all over!" -AttackRubberTurret,"The turret defends itself with a close-range electrocution attack! (DamageTaken)" +AttackRubberTurret,"The turret defends itself with a close-range electric attack! (DamageTaken)" NameRubberSilo,Rubber Launcher KillRubberSilo,"The turret enters an unstable state, about to spread rubber all over!" -AttackRubberSilo,"The turret defends itself with a close-range electrocution attack! (DamageTaken)" - -NameDrone,Drone -KillDrone,"The drone fizzles and falls to the ground!" -AttackDroneStun,"The drone zaps you with a restraining energy ray! (DamageTaken)" -AttackDrone,"The drone uses a short-ranged electrocution attack! (DamageTaken)" -AttackDroneBind,"The drone attaches to you! (+RestraintAdded)" +AttackRubberSilo,"The turret defends itself with a close-range electric attack! (DamageTaken)" NameCaptureBot,Auto Capture Unit KillCaptureBot,"The capture unit releases magic smoke and explodes." @@ -1851,7 +2282,7 @@ AttackTapeBotLock,"The tape unit releases small drones which lock onto your rest NameForcefieldBot,Force Field Unit KillForcefieldBot,"The forcefield unit releases magic smoke and explodes." -AttackForcefieldBot,"The forcefield electrocutes you! (DamageTaken)" +AttackForcefieldBot,"The forcefield unit zaps you! (DamageTaken)" AttackForcefieldBotBind,"The forcefield unit extends its appendages and wraps them around you! (+RestraintAdded)" AttackForcefieldBotLock,"The forcefield unit releases small drones which lock onto your restraints! (DamageTaken)" @@ -1859,6 +2290,18 @@ NameForceField,Force Field Projector KillForceField,"The forcefield erupts into a shower of blue sparks!" KinkyDungeonSummonSingleForceField,"The robot deploys a forcefield!" KinkyDungeonSummonMultiForceField,"The robot deploys a set of forcefields!" +NameDrone,Drone +KillDrone,"The drone fizzles and falls to the ground!" +AttackDroneStun,"The drone zaps you with a restraining energy ray! (DamageTaken)" +AttackDrone,"The drone uses a short-ranged electric attack! (DamageTaken)" +AttackDroneBind,"The drone attaches to you! (+RestraintAdded)" + +NameCyborg,Cyber Warden +KillCyborg,"The cyber warden's suit goes into lockdown, leaving her wiggling helplessly!" +AttackCyborgLock,"The cyber warden applies an advanced locking technology!" +AttackCyborgBind,"The cyber warden grabs you and applies a self-tightening restraint! (+RestraintAdded)" +AttackCyborg,"The cyber warden's touch applies a series of quick electrical shocks! (DamageTaken)" +AttackCyborgStun,"The cyber warden's touch applies a series of quick electrical shocks!" NameEnforcerBot,Auto Enforcer Unit KillEnforcerBot,"The enforcer unit releases magic smoke and explodes." @@ -1880,11 +2323,17 @@ KillAlkahestor,"The alkahestor resigns to her fate." AttackAlkahestorBind,"The alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded)" AttackAlkahestorLock,"The alkahestor uses an ornate-looking lock! (DamageTaken)" AttackAlkahestor,"The alkahestor shoves you! (DamageTaken)" +NamePinkAlkahestor,...Alkahestor? +KillPinkAlkahestor,"You rescue the Alkahestor" +AttackPinkAlkahestorBind,"The alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded)" +AttackPinkAlkahestorLock,"The alkahestor uses an ornate-looking lock! (DamageTaken)" +AttackPinkAlkahestor,"The alkahestor shoves you! (DamageTaken)" + +NameElementalLatex,Latex Homonculus +KillElementalLatex,"The latex homonculus melts into sticky rubber." +AttackElementalLatexBind,"The latex homonculus molds itself into restraints! (+RestraintAdded)" +AttackElementalLatex,"The latex homonculus slaps you with its appendages! (DamageTaken)" -NameElementalLatex,Latex Elemental -KillElementalLatex,"The latex elemental melts into sticky rubber." -AttackElementalLatexBind,"The latex elemental molds itself into restraints! (+RestraintAdded)" -AttackElementalLatex,"The latex elemental slaps you with its appendages! (DamageTaken)" NameElementalRope,Rope Elemental KillElementalRope,"The rope elemental gets knotted and falls to the floor, inert." @@ -1946,7 +2395,8 @@ AttackBanditChiefLock,"The bandit chuckles and applies a lock! (DamageTaken)" NameBanditPet,Bandit Pet KillBanditPet,"The bandit blushes and runs away." AttackBanditPetBind,"The girl nervously restrains you! (+RestraintAdded)" -AttackBanditPet,"The bandit tickes you nervously! (DamageTaken)" +AttackBanditPet,"The bandit tickles you nervously! (DamageTaken)" +AttackBanditPetLock,"The bandit pet applies a lock! (DamageTaken)" NameBanditHunter,Bandit Hunter KillBanditHunter,"The bandit hunter retreats." @@ -1964,6 +2414,7 @@ AttackBanditGrapplerPull,"The bandit grappler hooks you closer!!!" NameMummy,Mummy KillMummy,"The Mummy collapses and her body vanishes." AttackMummyBind,"The Mummy conjures a mystic wrapping! (+RestraintAdded)" +AttackMummyLock,"The Mummy conjures a magical lock upon you! (DamageTaken)" AttackMummy,"The Mummy punishes you with a blow from her staff! (DamageTaken)" NameMummyCursed,Cursed One @@ -1988,6 +2439,15 @@ AttackMeleeCleric,"The Bast Warrior tickles you with her claws! (DamageTaken)" AttackMeleeClericLock,"The Bast Warrior pulls out a lock and slips it on! (DamageTaken)" + +NameClericHigh,Bast High Cleric +KillClericHigh,"The Bast High Cleric vanishes into a puff of ribbons." +AttackClericHigh,"A ray of light shoots out and paralyzes you! (DamageTaken)" +AttackClericHighBind,"The Bast Cleric conjures wrappings upon you! (+RestraintAdded)" +AttackClericHighStun,"A ray of light shoots out and paralyzes you! (DamageTaken)" +AttackClericHighLock,"The Bast Cleric conjures a lock and slips it onto you! (DamageTaken)" + + NameCleric,Bast Cleric KillCleric,"The Bast Cleric collapses and meows softly." AttackCleric,"A ray of light shoots out and paralyzes you! (DamageTaken)" @@ -1995,6 +2455,13 @@ AttackClericBind,"The Bast Cleric restrains you! (+RestraintAdded)" AttackClericStun,"A ray of light shoots out and paralyzes you! (DamageTaken)" AttackClericLock,"The Bast Cleric pulls out a lock and slips it on! (DamageTaken)" +NameClericHigh,High Cleric +KillClericHigh,"The High Cleric locks herself in ritual bondage as punishment for failure." +AttackClericHigh,"The High Cleric holds up her staff and you feel intense vibrations throughout your body! (DamageTaken)" +AttackClericHighBind,"The High Cleric summons animated restraints to bind you! (+RestraintAdded)" +AttackClericHighStun,"A flurry of mummy wrappings encase you and stun you! (DamageTaken)" +AttackClericHighLock,"The High Cleric smiles as she conjures many locks on your restraints! (DamageTaken)" + NameSummonedSkeleton,Skeleton KillSummonedSkeleton,"The skeleton falls to pieces." AttackSummonedSkeletonBind,"The Skeleton restrains you! (+RestraintAdded)" @@ -2003,12 +2470,12 @@ AttackSummonedSkeleton,"The Skeleton tackles you! (DamageTaken)" NameGhost,Ghost KillGhost,"The ghost vanishes." AttackGhostBind,"The Ghost restrains you! (+RestraintAdded)" -AttackGhost,"The Ghost tickles you! (DamageTaken)" +AttackGhost,"The Ghost enters your clothing and vanishes!" NameMikoGhost,Revenant KillMikoGhost,"The revenant pouts as it vanishes." AttackMikoGhostBind,"The revenant restrains you! (+RestraintAdded)" -AttackMikoGhost,"The revenant squeezes your breasts! (DamageTaken)" +AttackMikoGhost,"The revenant squeezes your breasts and slows you! (DamageTaken)" AttackMikoGhostSlow,"The revenant grabs you and caresses your tummy! (DamageTaken)" NameGreaterSkeleton,Skeleton Warrior @@ -2027,6 +2494,12 @@ AttackVinePlant,"The vine plant whips you with its tendrils! (DamageTaken)" AttackVinePlantBind,"The vine plant wraps its tendrils around you! (+RestraintAdded)" AttackVinePlantStun,"The vine plant grips you tightly! (DamageTaken)" +NameVineSpitter,Vine Spitter +KillVineSpitter,"The vine spitter leaks purple juices everywhere as it wilts." +AttackVineSpitter,"The vine spitter slaps you with its tendrils! (DamageTaken)" +AttackVineSpitterBind,"The vine spitter wraps its tendrils around you! (+RestraintAdded)" +AttackVineSpitterStun,"The vine spitter grips you tightly! (DamageTaken)" + NameBramble,Bramble KillBramble,"The brambles are hacked away." AttackBramble,"The bramble snares you! (DamageTaken)" @@ -2039,10 +2512,9 @@ KinkyDungeonSummonMultiMikoGhost,Fuuka uses a talisman to call forth the spirits KinkyDungeonSummonSingleLatexElemental,A pool of latex bubbles and a twisted elemental appears! KinkyDungeonSpellRedSlime,The red liquid bubbles and a round slime pops out! -KinkyDungeonSummonSingleElementalLatex,Latex Elemental -KinkyDungeonSpellCastSummonLatexElemental,Latex Elemental +KinkyDungeonSummonSingleElementalLatex,Latex Homunculus +KinkyDungeonSpellCastSummonLatexElemental,Latex Homunculus -KinkyDungeonSpellRedSlime,Red Slime NameRedSlime,Red Slime KillRedSlime,"The red slime bounces away." AttackRedSlime,"The red slime bounces off you! (DamageTaken)" @@ -2067,12 +2539,14 @@ KinkyDungeonSummonSingleSlimeMold,A mobile cyst emerges from the slime mold nest NameFactoryDoll,Factory Doll KillFactoryDoll,"The doll is subdued." +NameFreeDoll,Freed Doll +KillFreeDoll,"The doll returns to her place." NameSlimeAdv,Encased Adventurer KillSlimeAdv,"The encased adventurer loses hope." AttackSlimeAdv,"The encased adventurer moans as she throws herself against you for help! (DamageTaken)" AttackSlimeAdvSlow,"The encased adventurer sticks to you as she mumbles incoherently! (DamageTaken)" -AttackSlimeAdvBind,"The encased adventurer (+RestraintAdded)" +AttackSlimeAdvBind,"The encased adventurer pleads for help as her slime spreads to you! (+RestraintAdded)" NameSmallSlime,Slime KillSmallSlime,"The slime melts into a puddle." @@ -2122,7 +2596,7 @@ AttackFeathers,"The feathers tickle you mercilessly! (DamageTaken)" NameScarves,Cloud of Scarves KillScarves,"The scarves become knotted and fall to the floor." AttackScarvesBind,"The scarves wrap themselves around you! (+RestraintAdded)" -AttackScarves,"The scarves rub against your body, tickling you! (DamageTaken)" +AttackScarves,"The scarves rub against your body, wrapping you in fluffy fabric! (DamageTaken)" NameRibbons,Cloud of Ribbons KillRibbons,"The ribbons knot themselves in a bow and fall to the floor." @@ -2132,7 +2606,7 @@ AttackRibbons,"The ribbons wrap themselves around you! (DamageTaken)" NameGag,Gravitating Gag KillGag,"The gag buckles itself in place and falls." AttackGagBind,"The gravitating gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded)" -AttackGag,"The gravitating gag rubs itself against your gagged lips! (DamageTaken)" +AttackGag,"The gravitating gag rubs itself against your lips! (DamageTaken)" AttackGagDash,"The gag dashes to you!" NameCuffs,Seductive Shackles @@ -2185,6 +2659,11 @@ AttackLockBind,"A chain locks itself in place on your body! (DamageTaken)" AttackLockDash,"The lock dashes to you!" AttackLock,"The floating locks and chains rub themselves across your body! (DamageTaken)" +NameLockMaster,Masterful Lock +KillLockMaster,"The lock falls to the floor, disenchanted." +AttackLockMaster,The Masterful Lock clicks seductively in your face! (DamageTaken) +AttackLockMasterLock,The Masterful Lock conjures a lock onto one of your restraints! (DamageTaken) + NamePlayerGag,Conjured Gag KillPlayerGag,"The conjured gag buckles itself in place and falls." AttackPlayerGagBind,"The gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded)" @@ -2208,32 +2687,39 @@ AttackMonsterRope,"The magic rope wriggles into your outfit! (DamageTaken)" NameWitchShock,Shock Witch KillWitchShock,"The shock witch vanishes into a cloud of thunder, leaving behind a keyring." -AttackWitchShockBind,"The witch restraints you! (+RestraintAdded)" +AttackWitchShockBind,"The witch restrains you! (+RestraintAdded)" AttackWitchShockLock,"The witch dangles a lock in front of you before putting it on! (DamageTaken)" AttackWitchShock,"The witch slaps you playfully! (DamageTaken)" NameWitchFlame,Flame Witch KillWitchFlame,"The flame witch vanishes into a pile of ash." -AttackWitchFlameBind,"The witch restraints you! (+RestraintAdded)" +AttackWitchFlameBind,"The witch restrains you! (+RestraintAdded)" AttackWitchFlameLock,"The witch dangles a lock in front of you before putting it on! (DamageTaken)" AttackWitchFlame,"The witch slaps you playfully! (DamageTaken)" NameWitchEarth,Earth Witch KillWitchEarth,"The earth witch vanishes into a pile of ash." -AttackWitchEarthBind,"The witch restraints you! (+RestraintAdded)" +AttackWitchEarthBind,"The witch restrains you! (+RestraintAdded)" AttackWitchEarthLock,"The witch dangles a lock in front of you before putting it on! (DamageTaken)" AttackWitchEarth,"The witch slaps you playfully! (DamageTaken)" NameWitchWater,Water Witch KillWitchWater,"The water witch vanishes into a pile of ash." -AttackWitchWaterBind,"The witch restraints you! (+RestraintAdded)" +AttackWitchWaterBind,"The witch restrains you! (+RestraintAdded)" AttackWitchWaterLock,"The witch dangles a lock in front of you before putting it on! (DamageTaken)" AttackWitchWater,"The witch slaps you playfully! (DamageTaken)" + +NameWitchAqua,Aqua Witch +KillWitchAqua,"The aqua witch vanishes into a pile of ash." +AttackWitchAquaBind,"The witch restrains you! (+RestraintAdded)" +AttackWitchAquaLock,"The witch dangles a lock in front of you before putting it on! (DamageTaken)" +AttackWitchAqua,"The witch slaps you playfully! (DamageTaken)" + NameWitchIce,Ice Witch KillWitchIce,"The ice witch vanishes into a pile of ash." -AttackWitchIceBind,"The witch restraints you! (+RestraintAdded)" +AttackWitchIceBind,"The witch restrains you! (+RestraintAdded)" AttackWitchIceLock,"The witch dangles a lock in front of you before putting it on! (DamageTaken)" AttackWitchIce,"The witch slaps you playfully! (DamageTaken)" @@ -2243,9 +2729,10 @@ KinkyDungeonSpellWitchBoulder,Magic Stone KinkyDungeonSpellWitchIcebolt,Ice Bolt KinkyDungeonSpellWitchWaterBall,Waterblast + NameWitchRope,Rope Witch KillWitchRope,"The rope witch retreats as her animated ropes chase her." -AttackWitchRopeBind,"The witch restraints you! (+RestraintAdded)" +AttackWitchRopeBind,"The witch restrains you! (+RestraintAdded)" AttackWitchRopeLock,"The witch dangles a lock in front of you before putting it on! (DamageTaken)" AttackWitchRope,"The witch slaps you playfully! (DamageTaken)" @@ -2255,7 +2742,7 @@ AttackWitchMagnetBind,"The witch's restraints fly out and attach themselves to y AttackWitchMagnetLock,"The witch dangles a lock in front of you before putting it on! (DamageTaken)" AttackWitchMagnet,"The witch's lightning causes your body to tingle! (DamageTaken)" -NameApprentice,Witch's Apprentice +NameApprentice,Mage's Apprentice KillApprentice,"The apprentice runs off and cries in a corner." AttackApprenticeBind,"The apprentice animates restraints to wrap around you! (+RestraintAdded)" AttackApprenticeLock,"The apprentice nervously takes out a lock and makes you wear it! (DamageTaken)" @@ -2267,6 +2754,12 @@ AttackApprentice2Bind,"The apprentice summons a restraint onto you! (+RestraintA AttackApprentice2Lock,"The apprentice nervously takes out a lock and makes you wear it! (DamageTaken)" AttackApprentice2,"The apprentice tickles you playfully! (DamageTaken)" +NameWitchApprentice,Witch's Apprentice +KillWitchApprentice,"The witch's apprentice confidently admits defeat." +AttackWitchApprenticeBind,"The witch's apprentice conjures magic bindings on you! (+RestraintAdded)" +AttackWitchApprenticeLock,"The witch's apprentice smiles and summons a lock onto you! (DamageTaken)" +AttackWitchApprentice,"The witch's apprentice smiles as she squeezes your chest! (DamageTaken)" + NameApprenticeSlime,Latex Apprentice KillApprenticeSlime,"The apprentice runs off and cries in a corner." AttackApprenticeSlimeBind,"The apprentice attaches a sticky restraint! (+RestraintAdded)" @@ -2302,26 +2795,36 @@ KillFungal,"The fun-gal retreats into the ground." AttackFungalBind,"The fun-gal clips a restraint around your neck! (+RestraintAdded)" AttackFungalLock,"The fun-gal produces a magical lock on all your restraints! (DamageTaken)" AttackFungal,"The fun-gal rubs your chest with her long, slender fingers! (DamageTaken)" -KinkyDungeonSpellCrystalPuff,Crystal Glyph +KinkyDungeonSpellCrystalSlash,Crystal Slash +KinkyDungeonSpellCrystalBolt,Crystal Bolt +KinkyDungeonSpellCrystalBoltSingle,Crystal Bolt NameDressmakerQuest,Tailor -KillDressmakerQuest,You murder the tailor! +KillDressmakerQuest,You rob the tailor! NameApprenticeQuest,Student -KillApprenticeQuest,You murder the student! +KillApprenticeQuest,You rob the student! NameDragonheartQuest,Tactician -KillDragonheartQuest,You murder the tactician! +KillDragonheartQuest,You rob the tactician! NameMaidforceQuest,Informant -KillMaidforceQuest,You murder the informant! +KillMaidforceQuest,You rob the informant! NameBanditQuest,Thug -KillBanditQuest,You murder the thug! +KillBanditQuest,You rob the thug! +NameAntiqueQuest,Antique Merchant +KillAntiqueQuest,You smash the antique merchant! NameBlacksmithQuest,Blacksmith -KillBlacksmithQuest,You murder the blacksmith! +KillBlacksmithQuest,You rob the blacksmith! +NameArmorerQuest,Armorer +KillArmorerQuest,You rob the armorer! +NameBowyerQuest,Bowyer +KillBowyerQuest,You rob the bowyer! +NameShadyQuest,Not a Kidnapper +KillShadyQuest,You bring the kidnapper to justice! NameDressmaker,Dressmaker KillDressmaker,"The dressmaker storms out in a rage." @@ -2352,16 +2855,16 @@ KillDollDoor,"The door flies open as the Dollmaker chuckles at you!" NameGiantMushroom,Giant Mushroom KillGiantMushroom,"The giant mushroom explodes into a cloud of spores!!!" -NameMushy,Animated Mushroom -KillMushy,"The animated mushroom explodes into a cloud of spores!!!" -AttackMushyBind,"The animated mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded)" -AttackMushyBlind,"The animated mushroom spits spores into your face and tries to tie you!" -AttackMushy,"The animated mushroom emits soporific spores! (DamageTaken)" +NameMushy,Army Mushroom +KillMushy,"The army mushroom explodes into a cloud of spores!!!" +AttackMushyBind,"The army mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded)" +AttackMushyBlind,"The army mushroom spits spores into your face and tries to tie you!" +AttackMushy,"The army mushroom emits soporific spores! (DamageTaken)" -NameMushyHappy,Happy Mushroom -KillMushyHappy,"The happy mushroom explodes into a cloud of spores!!!" -AttackMushyHappyBlind,"The happy mushroom tickles you silly!" -AttackMushHappy,"The happy mushroom tickles you silly! (DamageTaken)" +NameMushyHappy,Delicious Mushroom +KillMushyHappy,"The delicious mushroom explodes into a cloud of spores!!!" +AttackMushyHappyBlind,"The delicious mushroom tickles you silly!" +AttackMushHappy,"The delicious mushroom tickles you silly! (DamageTaken)" NameMushySick,Infected Mushroom KillMushySick,"The infected mushroom explodes into a cloud of spores!!!" @@ -2387,10 +2890,10 @@ NameGuardHeavy,Armed Guard KillGuardHeavy,"The armed guard retreats, but drops a keyring!" AttackGuardHeavyLock,"The guard locks your restraints!" AttackGuardHeavyBind,"The guard shocks you and slaps on some restraints! (+RestraintAdded)" -AttackGuardHeavy,"The guard electrocutes you with her taser!!!" -AttackGuardHeavyStun,"The guard electrocutes you with her taser!!!" +AttackGuardHeavy,"The guard shocks you with her taser!!!" +AttackGuardHeavyStun,"The guard shocks you with her taser!!!" -KinkyDungeonChangeRestraints,"The EnemyName replaces your OldRestraintName with a NewRestraintName" +KinkyDungeonChangeRestraints,"The EnemyName applies a NewRestraintName over your OldRestraintName" KinkyDungeonRemoveRestraints,"The EnemyName removes your OldRestraintName" KinkyDungeonAddRestraints,"The EnemyName restrains you with a NewRestraintName" @@ -2427,18 +2930,20 @@ KinkyDungeonSummonMultiShadowHand,Several dark hands emerge from the shadows! NameCorruptedAdventurer,Corrupted Adventurer KillCorruptedAdventurer,"The corrupted adventurer falls into a deep sleep." AttackCorruptedAdventurerBind,"The corrupted aventurer's many arms latch onto you! (+RestraintAdded)" +AttackCorruptedAdventurerLock,"The corrupted aventurer clicks a lock on from behind you! (DamageTaken)" AttackCorruptedAdventurer,"The corrupted adventurer drags her chilling fingers across your vulnerable skin! (DamageTaken)" + NameShadowGhast,Shadowy Ghast KillShadowGhast,"The shadowy ghast screeches and disappears..." AttackShadowGhastBind,"The shadowy ghast latches onto you with its long arms! (+RestraintAdded)" AttackShadowGhast,"The shadowy ghast grips you in its chilling embrace! (DamageTaken)" -NameChainBeing,Obsidian Construct -KillChainBeing,"The obsidian construct stops moving, its spirit departed." -AttackChainBeingBind,"The obsidian construct reaches out and touches you, forming metallic restraints! (+RestraintAdded)" -AttackChainBeingLock,"The obsidian construct uses its chains to lock your restraints! (DamageTaken)" -AttackChainBeing,"The obsidian construct grips you and drains your willpower! (DamageTaken)" +NameChainBeing,Corrupted Elemental +KillChainBeing,"The corrupted elemental dissolves into shadows." +AttackChainBeingBind,"The corrupted elemental reaches out and touches you, forming metallic restraints! (+RestraintAdded)" +AttackChainBeingLock,"The corrupted elemental uses its chains to lock your restraints! (DamageTaken)" +AttackChainBeing,"The corrupted elemental grips you and drains your willpower! (DamageTaken)" NameDemonStar,Star Demon KillDemonStar,"The star demon is exorcised." @@ -2458,6 +2963,15 @@ KinkyDungeonMoonBondage,The weight of inescapable bondage falls upon you! (Damag AttackDemonMoonLock,"The demon giggles as it locks your restraints! (DamageTaken)" KinkyDungeonSpellCrushingFate,Crushing Fate +NameDemonVoid,Void Demon +KillDemonVoid,"The void demon is exorcised." +AttackDemonVoidBind,"The void demon places you in dark, glassy restraints. (+RestraintAdded)" +AttackDemonVoid,"The void demon places you under its curse! (DamageTaken)" +KinkyDungeonGravityPull,You are sucked in by a powerful gravitational force!!! (DamageTaken) +KinkyDungeonGravityPull2,You are sucked in by a powerful gravitational force!!! +AttackDemonVoidLock,"The demon cracks its knuckles as it locks your restraints! (DamageTaken)" +KinkyDungeonSpellGravityPull,Cosmic Force + NameDemonVoid,Void Demon KillDemonVoid,"The void demon is exorcised." AttackDemonVoidBind,"The void demon places you in dark, glassy restraints. (+RestraintAdded)" @@ -2468,7 +2982,8 @@ NameDemon,Demon KillDemon,"The demon is exorcised." AttackDemonBind,"The demon places you in dark, glassy restraints. (+RestraintAdded)" AttackDemonLock,"The demon giggles as it locks your restraints! (DamageTaken)" -AttackDemon,"The demon whacks you with its mace! (DamageTaken)" +AttackDemon,"The demon caresses you gently with her sharp nails! (DamageTaken)" +AttackDemonStun,"The demon stuns you with her heavy mace! (+STUN)" NameTickleHand,Tickle Hand KillTickleHand,"The hand vanishes!" @@ -2482,12 +2997,13 @@ AttackTickleTerrorBind,"The monstrous spirit binds you to make you more vulnerab NameHugHorror,Hug Horror KillHugHorror,"The hug horror vanishes... for now" AttackHugHorror,"The monstrous spirit gives a crushing hug!!! (DamageTaken)" -AttackHugHorrorSlow,"The monstrous spirit gives a crushing hug!!! (DamageTaken)" +AttackHugHorrorStun,"The monstrous spirit envelops you in tightness, holding you in place! (DamageTaken)" AttackHugHorrorBind,"The monstrous spirit's chains latch on! (+RestraintAdded)" + NameGreedyGhast,Greedy Ghast KillGreedyGhast,"The ghast vanishes... for now" -AttackGreedyGhast,"The moaning spirit gropes your body!!! (DamageTaken)" +AttackGreedyGhast,"The moaning spirit runs its hands all across your body!!! (DamageTaken)" NameTickleHandSlave,Tickle Hand KillTickleHandSlave,"The hand vanishes!" @@ -2496,6 +3012,12 @@ AttackTickleHandSlave,"The hand tickles you! (DamageTaken)" NameBookChain,Tome of Chains KillBookChain,The floating tome burns into ashes! +NameBookBelt,Tome of Belts +KillBookBelt,The floating tome burns into ashes! +NameBookRope,Tome of Ropes +KillBookRope,The floating tome burns into ashes! +NameBookBondage,Tome of Bondage +KillBookBondage,The floating tome burns into ashes! NameBookCelestial,Tome of Light KillBookCelestial,The floating tome burns into ashes! NameBookArcane,Tome of Magic @@ -2542,22 +3064,23 @@ AttackOrbOfLightBlind,"The orb blinds you with its intense light!!! (DamageTaken KinkyDungeonSpellCastOrbHeal,A light restores the will of its allies! KinkyDungeonNoMana,"You do not have enough resources to cast the spell!" -PlayerAttack,"You AttackName TargetEnemy for DamageDealt DamageType damage!" -PlayerAttackWeak,"You AttackName TargetEnemy for a decreased DamageDealt DamageType damage!" -PlayerAttackStrong,"You AttackName TargetEnemy for an increased DamageDealt DamageType damage!" -PlayerAttackVeryStrong,"You AttackName TargetEnemy for a devastating DamageDealt DamageType damage!" -PlayerAttackImmune,"You AttackName TargetEnemy, but your DamageType weapon has no effect!" -PlayerAttackSpellResist,"You AttackName TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward!" +PlayerAttack,"AttackName hits TargetEnemy for DamageDealt DamageType damage!" +PlayerAttackWeak,"AttackName hits TargetEnemy for a decreased DamageDealt DamageType damage!" +PlayerAttackStrong,"AttackName hits TargetEnemy for an increased DamageDealt DamageType damage!" +PlayerAttackVeryStrong,"AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage!" +PlayerAttackImmune,"AttackName hits TargetEnemy, but your DamageType weapon has no effect!" +PlayerAttackSpellResist,"AttackName hits TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward!" PlayerRanged,"AttackName hits TargetEnemy for DamageDealt DamageType damage!" PlayerRangedWeak,"AttackName hits TargetEnemy for a reduced DamageDealt DamageType damage!" PlayerRangedImmune,"AttackName hits TargetEnemy but DamageType damage doesn't have any effect!" PlayerRangedStrong,"AttackName hits TargetEnemy for an increased DamageDealt DamageType damage!" PlayerRangedSpellResist,"AttackName hits TargetEnemy for DamageDealt DamageType damage, reduced by an anti-magic ward!" PlayerRangedVeryStrong,"AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage!" -KinkyDungeonBasicAttack,attack -KinkyDungeonBasicDamage,damage +KinkyDungeonBasicAttack,Your attack +KinkyDungeonBasicDamage,An effect PlayerMiss,"You miss the TargetEnemy!" PlayerMissArmor,"Your attack is too feeble to hurt the TargetEnemy!" +PlayerMissShield,"Your attack was absorbed by the TargetEnemy's shield!" KinkyDungeonStruggleStruggleFail,"You try to pull the TargetRestraint off..." KinkyDungeonStruggleStruggleFailAroused,"You try to squirm and moan out of the TargetRestraint..." KinkyDungeonStruggleStruggleFail2,"You tug on the TargetRestraint with increased power..." @@ -2589,18 +3112,39 @@ KinkyDungeonStruggleUnlockFail2,"You concentrate on unlocking the TargetRestrain KinkyDungeonStruggleUnlockFail3,"You work on unlocking the TargetRestraint with help..." KinkyDungeonStruggleUnlockDrop,"You fiddle with the key on the TargetRestraint..." +KinkyDungeonStruggleUnlockNoWhiteKey,"The lock requires a key." KinkyDungeonStruggleUnlockNoRedKey,"The lock requires a key." KinkyDungeonStruggleUnlockNoRed_HiKey,"The lock requires a key." KinkyDungeonStruggleUnlockNoRed_MedKey,"The lock requires a key." -KinkyDungeonStruggleUnlockNoGreenKey,"The green padlock only accepts green keys." -KinkyDungeonStruggleUnlockNoYellowKey,"The yellow padlock requires a red and a green key." -KinkyDungeonStruggleUnlockNoBlueKey,"The magical lock only accepts blue keys and can't be picked." +KinkyDungeonStruggleUnlockNoHiSecKey,"The lock can only be opened with a key." +KinkyDungeonStruggleUnlockNoDiscKey,"The lock requires a key." +KinkyDungeonStruggleUnlockNoBlueKey,"The magical lock only accepts magical keys and can't be picked." KinkyDungeonStruggleUnlockNoGoldKey,"The magical lock is guarded with powerful magic. You'll have to wait for it to wear off..." +KinkyDungeonStruggleUnlockNoCyberKey,"The item is cybernetically locked. You will need a key card to unlock it." +KinkyDungeonStruggleUnlockNoCyber2Key,"The item is cybernetically locked. You will need a key card to unlock it." +KinkyDungeonStruggleUnlockNoCyber3Key,"The item is cybernetically locked. You will need a key card to unlock it." KinkyDungeonStruggleUnlockNoPurpleKey,"This lock requires a command word to unlock. It doesn't have a keyhole." KinkyDungeonStruggleUnlockNoUnknownKey,"You don't have a key for this lock." KinkyDungeonStruggleCantPickBlueLock,"The lock seems to be magical and rejects all picking attempts!" KinkyDungeonStruggleCantPickGoldLock,"The lock is definitely magical and forces your pick out!" +KinkyDungeonStruggleCantPickDivineLock,"The lock is divine. A mortal shouldn't even try to pick it." +KinkyDungeonStruggleUnlockNoDivineKey,"You must perform your quest! Don't even think of unlocking it..." +KinkyDungeonStruggleCantPickDivine2Lock,"The lock is divine. A mortal shouldn't even try to pick it." +KinkyDungeonStruggleUnlockNoDivine2Key,"You're not sure a key for this even exists in the mortal realm." +KinkyDungeonStruggleCantPickRubberLock,"The lock is made of solid rubber. You can't pick that." +KinkyDungeonStruggleUnlockNoRubberKey,"You need something sharp to cut the lock." KinkyDungeonStruggleCantPickPurpleLock,"The lock doesn't even have a keyhole to pick!" +KinkyDungeonStruggleCantPickDiscLock,"You need a special tool to pick this kind of lock." +KinkyDungeonStruggleCantPickCyberLock,"The lock is technological and does not use a key." +KinkyDungeonStruggleCantPickCyber2Lock,"The lock is technological and does not use a key." +KinkyDungeonStruggleCantPickCyber3Lock,"The lock is technological and does not use a key." +KinkyDungeonStruggleCantPickHiSecLock,"The lock is brimming with security features and is nigh impossible to pick!" + +KinkyDungeonStruggleCantPickCrystalLock,"The lock is encased in magical crystals that block the keyhole." +KinkyDungeonStruggleUnlockNoCrystalKey,"Your distraction makes the crystals regrow immediately after breaking them off." + +KinkyDungeonStruggleCantPickExCrystalLock,"The crystal fragments in the lock make it difficult to pick." +KinkyDungeonStruggleUnlockNoExCrystalKey,"You need a key to actually unlock the ex-crystallized lock." KinkyDungeonStruggleUnlockJammed,"The key sticks in the lock and jams, mangling the key!" @@ -2612,6 +3156,7 @@ KinkyDungeonStruggleRemoveSuccess,"You free yourself from the TargetRestraint!" KinkyDungeonStruggleCutSuccess,"You damage the TargetRestraint enough to escape!" KinkyDungeonStruggleCutDestroy,"The TargetRestraint is destroyed by your attempts." +KinkyDungeonStruggleCutDestroyFail,"The TargetRestraint comes off before taking serious damage." KinkyDungeonStruggleLimit,"This is as far as you can struggle. You'll have to remove the TargetRestraint some other way." KinkyDungeonRemoveLimit,"The item is too tight. You'll need to loosen the TargetRestraint somehow first..." @@ -2644,6 +3189,7 @@ KinkyDungeonStruggleStruggleImpossibleAroused,"You groan in frustration as you r KinkyDungeonStruggleStruggleImpossible2,"The TargetRestraint tightens itself as you try to squeeze out!" KinkyDungeonStruggleStruggleImpossible3,"You will need someone's help to squeeze out of the TargetRestraint." KinkyDungeonStruggleStruggleImpossibleGoddess,"The TargetRestraint flashes magically as the Goddess' curse resists your efforts!" +KinkyDungeonStruggleStruggleRestricted,"The TargetRestraint holds firm against your attempts, held back by your restrictions." KinkyDungeonStruggleStruggleStrict,"You pull and tug but your other restraints keep the TargetRestraint securely in place!" KinkyDungeonStruggleStruggleStrictAroused,"You groan and tug but nothing budges on the TargetRestraint. You're bound too tightly by something else." KinkyDungeonStruggleStruggleImpossibleBound,"You are too tightly bound to have a chance against the TargetRestraint." @@ -2655,6 +3201,7 @@ KinkyDungeonStruggleUnlockImpossible3,"You can't reach the keyhole on the Target KinkyDungeonStruggleUnlockImpossibleBound,"You can't hold the key to unlock the TargetRestraint with." KinkyDungeonStruggleUnlockImpossibleBoundAroused,"Your bound and shaking hands can't even hold the key for the TargetRestraint." KinkyDungeonStruggleUnlockImpossibleGoddess,"The goddess punishes you for trying to unlock the TargetRestraint!" +KinkyDungeonStruggleUnlockRestricted,"You are too restricted to get the key into place!" KinkyDungeonStruggleUnlockStrict,"You try, but something is keeping your hands away from the TargetRestraint." KinkyDungeonStruggleUnlockStrictAroused,"You flail the key around uselessly but a strap is preventing you from unlocking the TargetRestraint!" KinkyDungeonStrugglePickImpossible,"This lock on the TargetRestraint is beyond your skill level!" @@ -2666,36 +3213,37 @@ KinkyDungeonStrugglePickImpossibleBoundAroused,"You let out a frustrated sigh as KinkyDungeonStrugglePickStrict,"You try to start picking, but the lock on the TargetRestraint is secured by something else." KinkyDungeonStrugglePickStrictAroused,"You whimper as you realize the lock on the TargetRestraint is shielded by another strap." KinkyDungeonStrugglePickImpossibleGoddess,"You are distracted from the TargetRestraint by mental images of yourself remaining in bondage..." +KinkyDungeonStrugglePickRestricted,"Your restrictions ruin your dexterity. You can't pick the TargetRestraint." KinkyDungeonStruggleRemoveNeedEdge,"You wiggle uselessly in the TargetRestraint. Maybe you need some kind of tool..." KinkyDungeonStruggleRemoveNeedEdgeAroused,"You rub your body against the floor to no avail, and sigh as the TargetRestraint stays secure." KinkyDungeonStruggleStruggleNeedEdge,"You contort your body but you don't have leverage on the TargetRestraint. Maybe you need some kind of tool..." -KinkyDungeonStruggleStruggleNeedEdgeAroused,"You wiggle madly, trying to push against the TargetRestraint. You need more leverage..." +KinkyDungeonStruggleStruggleNeedEdgeAroused,"You struggle madly, trying to push against the TargetRestraint. You need more leverage..." KinkyDungeonStruggleRemoveNeedEdgeWrong,"That doesn't seem to work. Maybe something else will help with the TargetRestraint." KinkyDungeonStruggleRemoveNeedEdgeWrongAroused,"You squirm helplessly against the furniture. Maybe something else will help with the TargetRestraint." KinkyDungeonStruggleStruggleNeedEdgeWrong,"You twist your body trying to use the furniture, but it doesn't seem to work. The TargetRestraint remains tight." KinkyDungeonStruggleStruggleNeedEdgeWrongAroused,"You wiggle and squirm, trying to use the furniture to no avail. The TargetRestraint remains tight." -KinkyDungeonStruggleRemoveNeedEdgeWrongSharp,"You need something sharp to loosen the fasteners on the TargetRestraint." -KinkyDungeonStruggleRemoveNeedEdgeWrongSharpAroused,"This is not a job for your fingers right now. You need something sharp to remove the TargetRestraint." -KinkyDungeonStruggleStruggleNeedEdgeWrongSharp,"There's no way to loosen the TargetRestraint without some kind of sharp tool..." +KinkyDungeonStruggleRemoveNeedEdgeWrongSharp,"You need something sharper to get at the TargetRestraint." +KinkyDungeonStruggleRemoveNeedEdgeWrongSharpAroused,"This is not a job for your trembling fingers right now." +KinkyDungeonStruggleStruggleNeedEdgeWrongSharp,"Tugging on the TargetRestraint is useless. Maybe if you had something sharp..." KinkyDungeonStruggleStruggleNeedEdgeWrongSharpAroused,"You sigh as the TargetRestraint resists all your attempts at breaking through." -KinkyDungeonStruggleRemoveNeedEdgeWrongEdge,"You need some kind of corner for leverage on the TargetRestraint." -KinkyDungeonStruggleRemoveNeedEdgeWrongEdgeAroused,"You flail about but cant get any leverage on the TargetRestraint without an edge or corner." -KinkyDungeonStruggleStruggleNeedEdgeWrongEdge,"You need something rough to get the TargetRestraint loose." -KinkyDungeonStruggleStruggleNeedEdgeWrongEdgeAroused,"You squirm against the smooth floor to no avail. If you had some kind of corner to undo the TargetRestraint..." +KinkyDungeonStruggleRemoveNeedEdgeWrongEdge,"You fidget with the TargetRestraint but can't reach the clasps without some kind of edge." +KinkyDungeonStruggleRemoveNeedEdgeWrongEdgeAroused,"You flail about but your hands are unable to reach the TargetRestraint." +KinkyDungeonStruggleStruggleNeedEdgeWrongEdge,"You can't reach the clasps on the TargetRestraint. If only you had some other way..." +KinkyDungeonStruggleStruggleNeedEdgeWrongEdgeAroused,"You squirm around, rubbing the TargetRestraint against the smooth floor to no avail..." -KinkyDungeonStruggleRemoveNeedEdgeWrongHook,"You need some kind of tool to pull at the knots on the TargetRestraint." +KinkyDungeonStruggleRemoveNeedEdgeWrongHook,"The knots on the TargetRestraint are too tight to pull apart without a hook." KinkyDungeonStruggleRemoveNeedEdgeWrongHookAroused,"You struggle fruitlessly against the knots on the TargetRestraint, but they're too tight." -KinkyDungeonStruggleStruggleNeedEdgeWrongHook,"You don't have any grip or hook to tug on the TargetRestraint with." -KinkyDungeonStruggleStruggleNeedEdgeWrongHookAroused,"You cant tug on the TargetRestraint without some kind of hook, it's too tight against your body." +KinkyDungeonStruggleStruggleNeedEdgeWrongHook,"The TargetRestraint is too tight against your body. You'll need more leverage to pull it off." +KinkyDungeonStruggleStruggleNeedEdgeWrongHookAroused,"You shake yourself around trying to rub off the TargetRestraint, but it's hopeless." -KinkyDungeonStruggleRemoveNeedEdgeWrongSticky,"You need a way to stick the tool in place to undo the TargetRestraint..." +KinkyDungeonStruggleRemoveNeedEdgeWrongSticky,"You need more grip to peel off the TargetRestraint..." KinkyDungeonStruggleRemoveNeedEdgeWrongStickyAroused,"Your trembling hands cant grip anything as they are, let alone undo the TargetRestraint." -KinkyDungeonStruggleStruggleNeedEdgeWrongSticky,"You need something grippy to hold the TargetRestraint..." -KinkyDungeonStruggleStruggleNeedEdgeWrongStickyAroused,"You rub yourself against the floor to no avail. If you had something adhesive to stick the TargetRestraint to..." +KinkyDungeonStruggleStruggleNeedEdgeWrongSticky,"You need more grip to peel off the TargetRestraint..." +KinkyDungeonStruggleStruggleNeedEdgeWrongStickyAroused,"You rub yourself against the floor to no avail..." KinkyDungeonStruggleRemoveImpossible,"The fastenings are too tight and secure on the TargetRestraint!" @@ -2707,6 +3255,7 @@ KinkyDungeonStruggleRemoveImpossibleBoundAroused,"Your futile struggles do nothi KinkyDungeonStruggleRemoveStrict,"You try to undo the fasteners on the TargetRestraint, but they are blocked by other straps!" KinkyDungeonStruggleRemoveStrictAroused,"You rub your body uselessly as you find another strap securing the TargetRestraint." KinkyDungeonStruggleRemoveImpossibleGoddess,"You feel the Goddess' hand keeping the TargetRestraint tightly secured!" +KinkyDungeonStruggleRemoveRestricted,"The TargetRestraint is too well-secured to take off with your level of restriction." KinkyDungeonStruggleCutImpossible,"The TargetRestraint is too durable to cut." KinkyDungeonStruggleCutImpossibleAroused,"Your hopeless attempts fail to even leave a scratch on the TargetRestraint." KinkyDungeonStruggleCutImpossible2,"You fail to leave even a scratch on the TargetRestraint!" @@ -2716,6 +3265,7 @@ KinkyDungeonStruggleCutImpossibleBoundAroused,"You cry out in your bindings as t KinkyDungeonStruggleCutStrict,"Your arms are kept from having leverage on the TargetRestraint due to another item." KinkyDungeonStruggleCutStrictAroused,"You fiddle with the tool, but your arms lack leverage on the TargetRestraint due to another item" KinkyDungeonStruggleCutImpossibleGoddess,"The TargetRestraint flashes magically as the Goddess' curse resists your efforts!" +KinkyDungeonStruggleCutRestricted,"Your restrictions limit your cutting power, unable to hurt the TargetRestraint." KinkyDungeonStruggleRemoveFailShadowHand,"You pry at the TargetRestraint..." KinkyDungeonStruggleRemoveFailShadowHandAroused,"You moan as the TargetRestraint squeeze you tightly..." @@ -2781,6 +3331,15 @@ KinkyDungeonStruggleRemoveImpossibleMagicChainAroused,"The TargetRestraint squee KinkyDungeonStruggleRemoveImpossibleBoundMagicChain,"The TargetRestraint have you bound hopelessly tight!" KinkyDungeonStruggleRemoveImpossibleBoundMagicChainAroused,"You sigh and moan as the TargetRestraint aren't getting any looser." + + +KinkyDungeonStruggleRemoveFailIce,"You look around for a fastener on the TargetRestraint..." +KinkyDungeonStruggleRemoveFailIceAroused,"Shivering, you look for a fastener on the TargetRestraint..." +KinkyDungeonStruggleRemoveImpossibleIce,"The TargetRestraint has no fastener!!!" +KinkyDungeonStruggleRemoveImpossibleIceAroused,"The TargetRestraint is sealed around your body, with no fasteners to speak of!" +KinkyDungeonStruggleRemoveImpossibleBoundIce,"The TargetRestraint is firmly sealed around your body." +KinkyDungeonStruggleRemoveImpossibleBoundIceAroused,"You are sealed in ice. There is no escape." + KinkyDungeonStruggleRemoveFailMagicRope,"You try to untie the TargetRestraint..." KinkyDungeonStruggleRemoveFailMagicRopeAroused,"You contort yourself trying to reach the knots on the TargetRestraint..." KinkyDungeonStruggleRemoveImpossibleMagicRope,"The TargetRestraint's knot ties itself back again as soon as you get it loose!" @@ -2795,40 +3354,71 @@ KinkyDungeonStruggleStruggleImpossibleClampsAroused,"You realize that would real KinkyDungeonStruggleStruggleImpossibleBoundClamps,"The TargetRestraint tug on your nipples as you squirm!" KinkyDungeonStruggleStruggleImpossibleBoundClampsAroused,"The TargetRestraint tug on your nipples as you squirm!" + + + +KinkyDungeonStruggleRemoveFailBubble,"You paw at the TargetRestraint from inside, hoping to find an opening..." +KinkyDungeonStruggleRemoveFailBubbleAroused,"You flail around inside the TargetRestraint..." +KinkyDungeonStruggleRemoveImpossibleBubble,"The TargetRestraint is completely seamless!" +KinkyDungeonStruggleRemoveImpossibleBubbleAroused,"The TargetRestraint is completely seamless! This is hopeless." +KinkyDungeonStruggleRemoveImpossibleBoundBubble,"You are too weak to poke your hand through the TargetRestraint..." +KinkyDungeonStruggleRemoveImpossibleBoundBubbleAroused,"You are too weak to poke your hand through the TargetRestraint..." + +KinkyDungeonStruggleStruggleFailBubble,"You stretch yourself out inside the TargetRestraint!" +KinkyDungeonStruggleStruggleFailBubbleAroused,"You bounce around inside the TargetRestraint!" +KinkyDungeonStruggleStruggleImpossibleBubble,"The TargetRestraint stretches to accomodate your movements..." +KinkyDungeonStruggleStruggleImpossibleBubbleAroused,"The TargetRestraint tips slightly as you squirm around..." +KinkyDungeonStruggleStruggleImpossibleBoundBubble,"You are too weak to make even a small dent in the TargetRestraint..." +KinkyDungeonStruggleStruggleImpossibleBoundBubbleAroused,"The TargetRestraint is unyielding despite your attempts..." + +KinkyDungeonStruggleCutFailBubble,"You try to puncture the TargetRestraint..." +KinkyDungeonStruggleCutFailBubbleAroused,"You poke around at the TargetRestraint..." +KinkyDungeonStruggleCutImpossibleBubble,"The TargetRestraint is too durable to pop..." +KinkyDungeonStruggleCutImpossibleBubbleAroused,"The TargetRestraint is too strong despite your best efforts..." +KinkyDungeonStruggleCutImpossibleBoundBubble,"You can't quite get enough force to pop the TargetRestraint..." +KinkyDungeonStruggleCutImpossibleBoundBubbleAroused,"Your attempts to pop the TargetRestraint are futile due to your restraints..." + KinkyDungeonNeedOpenChest,"The chest is too smooth to help. Maybe if you opened it?" KinkyLockable,Lockable KinkyNonLockable,Non-Lockable +KinkyCursed,"Cursed" KinkyUnlocked,"Unlocked" -KinkyLocked,"Lock Type: " -KinkyRedLockType,"Red" -KinkyRed_MedLockType,"Red" -KinkyRed_HiLockType,"Red" +KinkyLocked,"Lock:" +KinkyWhiteLockType,"Simple" +KinkyRedLockType,"Standard" +KinkyRed_MedLockType,"Standard" +KinkyRed_HiLockType,"Standard" +KinkyHiSecLockType,"Secure" +KinkyDiscLockType,"Disc" +KinkyRubberLockType,"Rubber" +KinkyDivineLockType,"Divine" +KinkyDivine2LockType,"Divine" +KinkyCrystalLockType,"Crystal" KinkyWhiteLockType,"Simple" -KinkyGreenLockType,"Green" -KinkyBlueLockType,"Blue" -KinkyPurpleLockType,"Purple" -KinkyGoldLockType,"Gold" -KinkyYellowLockType,"Yellow" -KinkyRedLock,"Red Lock" -KinkyRed_MedLock,"Red Lock" -KinkyRed_HiLock,"Red Lock" +KinkyBlueLockType,"Runic" +KinkyPurpleLockType,"Magic" +KinkyCyberLockType,"Cyber" +KinkyCyber2LockType,"Integrated Cyber" +KinkyCyber3LockType,"Advanced Cyber" +KinkyGoldLockType,"Ancient" KinkyWhiteLock,"Simple Lock" -KinkyGreenLock,"Green Lock" -KinkyBlueLock,"Blue Lock" -KinkyPurpleLock,"Purple Lock" -KinkyYellowLock,"Yellow Lock" -KinkyRedLockAbr,"" -KinkyRed_HiLockAbr,"" -KinkyRed_MedLockAbr,"" -KinkyGreenLockAbr,"(G)" -KinkyWhiteLockAbr,"(S)" -KinkyBlueLockAbr,"(B)" -KinkyGoldLockAbr,"(G)" -KinkyPurpleLockAbr,"(P)" -KinkyBlindLockAbr,"(?)" -KinkyYellowLockAbr,"(Y)" +KinkyRedLock,"Standard Lock" +KinkyRed_MedLock,"Standard Lock" +KinkyRed_HiLock,"Standard Lock" +KinkyHiSecLock,"Secure Lock" +KinkyDiscLock,"Disc Lock" +KinkyRubberLock,"Rubber Lock" +KinkyDivineLock,"Divine Lock" +KinkyDivine2Lock,"Divine Lock" +KinkyCrystalLock,"Crystal Lock" +KinkyWhiteLock,"Simple Lock" +KinkyBlueLock,"Runic Lock" +KinkyPurpleLock,"Magic Lock" +KinkyCyberLock,"Cyber Lock" +KinkyCyber2Lock,"Integrated Cyber Lock" +KinkyCyber3Lock,"Advanced Cyber Lock" KinkyDungeonPotionGagged,"You can't use that while gagged!" KinkyDungeonCantUsePotions,"You can't use that without your fingers!" @@ -2838,10 +3428,10 @@ KinkyDungeonDropKnife,"You drop your knife due to your bound hands!" KinkyDungeonDropEnchKnife,"You drop the precious knife due to your bound hands!" KinkyDungeonDropRedKey,"You drop the key due to your bound hands!" KinkyDungeonDropBlueKey,"You drop the magic key due to your bound hands!" -KinkyDungeonDropGreenKey,"You drop the magic key due to your bound hands!" +KinkyDungeonDropKeyCard,"You insert the card the wrong way and the reader ejects it onto the floor!" -KinkyDungeonLogbook,Logbook -KinkyDungeonLogbookN,Logbook (N) +KinkyDungeonLogbook,Journal +KinkyDungeonLogbookN,Journal (N) KinkyDungeonAutoPassOn,"Passing..." KinkyDungeonAutoPassOff,"Pass NPCs" KinkyDungeonAutoDoorOn,"Closing..." @@ -2859,6 +3449,18 @@ KinkyDungeonUnlockDoorPurpleUse,You utter a command word and release the lock! KinkyDungeonPurpleLockRemoveFail,You mutter an unintelligible command word and your locks do not open. KinkyDungeonUnlockDoorPurpleUseGagged,You mumble a command word but the lock opens! KinkyDungeonUnlockDoorPurpleUseGaggedFail,"You mess up saying the command word. The lock stays put!" +KinkyDungeonSwipeDoor,"Swipe Keycard" +KinkyDungeonSwipeDoorUse,"You swipe your keycard and the lock releases with a hiss!" +KinkyDungeonSwipeDoorFail,"You swipe your keycard and the lock beeps 'Access Denied'!" +KinkyDungeonSwipeDoorNone,"You don't have any card to scan in the slot." +KinkyDungeonScanDoor,"Use Retinal Scanner" +KinkyDungeonScanDoorUse,"You scan your eye pattern and the lock releases with a hiss!" +KinkyDungeonScanDoorFail,"The lock rejects you, citing your lack of authority." +KinkyDungeonScanDoorNone,"You are blindfolded, so the scanner can't even see your eye!" +KinkyDungeonHackDoor,"Hack" +KinkyDungeonHackDoorUse,"You bypass the lock's cyber defenses and release it with a hiss!" +KinkyDungeonHackDoorFail,"The lock beeps as its security blocks your attempts at release." +KinkyDungeonHackDoorNone,"You have no way to hack the locking system." KinkyDungeonPickDoor,"Pick" KinkyDungeonLockedDoor,"(No way to open)" KinkyDungeonLockedShrine,"(She cannot help you)" @@ -2876,11 +3478,13 @@ KinkyDungeonObject,"object" KinkyDungeonObjectCharger,"It appears to be a receptacle for an ancient crystal." KinkyDungeonObjectChargerDestroyed,"It's a pile of slag emitting a strange magic smoke..." -KinkyDungeonObjectLock,"That object is locked" -KinkyDungeonObjectShrine,"A shrine to the goddess of TYPE. A pool of mana glimmers below." +KinkyDungeonObjectLock,"That object is locked with a LKTP." +KinkyDungeonObjectShrine,"A shrine to the goddess of TYPE." KinkyDungeonObjectShrineCommerce,"A shrine to the goddess of TYPE." KinkyDungeonObjectDoor,"That door is open. Do you want to close it?" KinkyDungeonCloseDoorDone,"You slam the door and jam it shut!" +KinkyDungeonShrinePassion,"Passion" +KinkyDungeonShrineFrustration,"Frustration" KinkyDungeonShrineGhost,"Submissiveness" KinkyDungeonShrinePrisoner,"Security Level" KinkyDungeonShrineCharms,"Undead" @@ -2896,28 +3500,34 @@ KinkyDungeonShrineCommerce,"Commerce" KinkyDungeonShrineTooltip,"Shrine of SHRINETYPE" KinkyDungeonTabletTooltip,"Tablet of " +KDGoddess,"Goddess: " KDGoddessStat_Bonus,"Goddess Blessing: " KDGoddessStat_Penalty,"Goddess Curse: " +KDManaBonus,"Mana Bonus: " +KDManaPenalty,"Lack of Mana Penalty: " +KDStruggleManaBonus,"Your excess mana helps you suppress the enchantment!" +KDStruggleManaPenalty,"Your mana is too weak to fight the magical enchantment..." KinkyDungeonShrineCursed,"Curses" KinkyDungeonShrineDetermination,"Willpower" KinkyDungeonObjectTablet,"A tablet inscribed with runes of TYPE." -KinkyDungeonTabletTooltip,"Teachings of SHRINETYPE" +KinkyDungeonTabletTooltip,"SHRINETYPE Tablet" KinkyDungeonTabletRead,"Decypher" -KinkyDungeonTabletReadSuccess,"You read the runes and they imbue you with power!" +KinkyDungeonTabletReadSuccess,"You read the runes and they fill you with power!" +KinkyDungeonTabletReadFull,"These runes are meant for someone with less willpower." KinkyDungeonTabletReadFailure,"You try to read the runes but cannot understand them." KDAlliedWith,"Allies: " KDHostileWith,"Enemies: " KDFriendsWith,"Favorable: " +KinkyDungeonFaction,None KinkyDungeonFactionNevermere,Nevermere Trainers KinkyDungeonFactionDressmaker,DressUp Co. KinkyDungeonFactionBountyhunter,Bounty Hunters Guild KinkyDungeonFactionBandit,Bandits KinkyDungeonFactionKinkyConstruct,Constructs -KinkyDungeonFactionWitch,Witches' Coven KinkyDungeonFactionApprentice,School of Magic KinkyDungeonFactionAncientRobot,Old Guardians KinkyDungeonFactionElf,Cult of the Wild @@ -2927,13 +3537,36 @@ KinkyDungeonFactionElemental,Elementals KinkyDungeonFactionDragon,Dragonheart Order KinkyDungeonFactionMaidforce,MaidForce KinkyDungeonFactionMushy,Fungal Kingdom +KinkyDungeonFactionSlime,Slime +KinkyDungeonFactionPlant,Nature +KinkyDungeonFactionWitch,Witches' Coven +KinkyDungeonFactionLoveCrafters,Love Crafters +KinkyDungeonFactionNecromancer,Velvet Pact +KinkyDungeonFactionKnights,Knights Errant +KinkyDungeonFactionScavenger,Scavengers +KinkyDungeonFactionFae,Fae Tricksters +KinkyDungeonFactionPirate,Zora's Crew + +KinkyDungeonFactionRopeDojo,Rope Dojo +KinkyDungeonFactionDollShoppe,Doll Shoppe +KinkyDungeonFactionFuuka,Fuuka's Shrine +KinkyDungeonFactionWarden,The Collectors +KinkyDungeonFactionDollsmith,Dollmaker Inc. + +KinkyDungeonFactionAdventurer,Adventurer +KinkyDungeonFactionCurse,Cursed Spirit KinkyDungeonFactionRebel,Wanted KinkyDungeonFactionDelinquent,Delinquent +KinkyDungeonFactionVirus,Computer Virus +KinkyDungeonFactionExtraplanar,Extraplanar Entity +KinkyDungeonFactionDubiousWitch,Dubious Witch +KinkyDungeonFactionShadowClan,Shadow Clan KinkyDungeonFactionWolfhunter,Illegal Poacher KinkyDungeonFactionRock,Nature KinkyDungeonFactionRage,Very Angry KinkyDungeonFactionAmbush,Surprise! +KinkyDungeonFactionDebate,Fierce Debater KinkyDungeonFactionAngel,Angels KinkyDungeonFactionDemon,Demons @@ -2953,22 +3586,26 @@ KinkyDungeonPoolDrink1,"You drink again, but you feel as if you are trespassing. KinkyDungeonPoolDrink2,"You drink again, knowing the risk this may entail..." KinkyDungeonPoolDrinkAnger,"You have angered the goddess of TYPE!!!" KinkyDungeonPoolDrinkSlime,"The slime washes off in the fountain!!!" +KinkyDungeonGoddessCollar,"The goddess of TYPE is enraged and curses you with a divine punishment! (+RESTRAINT)" KinkyDungeonCommerceBuy,"The goddess offers a ItemTraded for ItemCost (NumCurrent/NumMax)" KinkyDungeonCommerceNext,"Next Offer" KinkyDungeonCommercePurchase,"Buy (press right)" KinkyDungeonCommerceCost,"Cost: ItemCostgp" +KinkyDungeonCommerceOwned,"Owned: AMNT" ClimbDown,"You climb down to the next level" KinkyDungeonRestraintLevel,Level RestraintLevel (Rarity) +KinkyDungeonCategoryFilterAll,All KinkyDungeonCategoryFilterconsumable,Consumable -KinkyDungeonCategoryFilterrestraint,Equipped +KinkyDungeonCategoryFilterrestraint,Worn KinkyDungeonCategoryFilterweapon,Weapons KinkyDungeonCategoryFilteroutfit,Outfits -KinkyDungeonCategoryFilterlooserestraint,Wearable +KinkyDungeonCategoryFilterlooserestraint,Restraints KinkyDungeonCategoryFiltermisc,Miscellaneous +KinkyDungeonCategoryFilterarmor,Armor KDNoisyTerrain,The terrain makes noise as you rush across it... @@ -2992,6 +3629,10 @@ KDLatexDebuff0,"Your catsuit adheres to latex, making struggling more difficult! KDLatexDebuff1,"The item sticks to your rubber catsuit, making it harder to pull off..." KDLatexDebuff2,"The item hugs your catsuit tightly, adhering firmly!" +KDRopeDebuff0,"Your RSTRN holds you securely, making your struggling ineffectual..." +KDRopeDebuff1,"Your RSTRN holds you tight, making it harder to move..." +KDRopeDebuff2,"Your RSTRN keeps you tied tight, making it harder to escape..." + KDShadowBuff,"The bright light weakens the shadow hands!" KDTrapMisfire,"You hear an ominous click, but nothing seems to happen. Looks like a misfire!" @@ -3007,18 +3648,28 @@ RestraintSarcophagus,Sarcophagus RestraintSarcophagusDesc,"A glass-walled chamber sealed with enchanting magic." RestraintSarcophagusDesc2,"Time feels like it's going by quickly outside..." -RestraintCageTrap,Cage Trap -RestraintCageTrapDesc,"A booby-trapped cage!" -RestraintCageTrapDesc2,"Fit for a pretty toy like you~" +RestraintCageTrap,Metal Cage +RestraintCageTrapDesc,"A metal cage with rigid bars, too narrow to put your head through." +RestraintCageTrapDesc2,"Made for a pretty toy like you~" RestraintDisplayTrap,Display Stand RestraintDisplayTrapDesc,"A display stand, fit for only the prettiest of trophies!" RestraintDisplayTrapDesc2,"Your arms are pinned behind your back and you can barely move!" KDCageTrap,"You hear a click as the door shuts behind you..." +KDDisplayTrap,"The display stand suddenly locks into place around you!" RestraintDollStand,Doll Stand RestraintDollStandDesc,"A mobile display stand for dolls to keep them in place." RestraintDollStandDesc2,"As long as it's... inserted, you won't be going anywhere!" +RestraintOneBar,One Bar Prison +RestraintOneBarDesc,"A devious way to immobilize people." +RestraintOneBarDesc2,"As long as it's... inserted, you won't be going anywhere!" + +RestraintOneBarStand,Metal Stand +RestraintOneBarStandDesc,"A devious way to immobilize people." +RestraintOneBarStandDesc2,"As long as it's locked around you, you won't be going anywhere!" + + RestraintDollStandSFW,Doll Stand RestraintDollStandSFWDesc,"A mobile display stand for dolls to keep them in place." RestraintDollStandSFWDesc2,"As long as it's attached, you won't be going anywhere!" @@ -3034,7 +3685,7 @@ KDBedTrap,"Belts emerge from underneath the bed and wrap around you, strapping y RestraintBindingDress,Binding Dress RestraintBindingDressDesc,"It's a devious dress! I hope your elbows are flexible~" -RestraintBindingDressDesc2,"So many laces! It would quite a while to put this on normally. That's what magic is for!" +RestraintBindingDressDesc2,"So many laces! It would take quite a while to put this on normally. That's what magic is for!" RestraintDressCorset,Ornamental Corset RestraintDressCorsetDesc,"Your figure looks gorgeous in this~" RestraintDressCorsetDesc2,"It's so tight you won't be able to undo the laces yourself, dear!" @@ -3046,16 +3697,16 @@ RestraintDressMuzzle,Fancy Muzzle RestraintDressMuzzleDesc,A muzzle to keep you from spitting out what's underneath. RestraintDressMuzzleDesc2,"Sorry dear, there's a mystic seal on there to keep it on nice and tight." -RestraintMikoDress,Red Binding Dress +RestraintMikoDress,Ornamental Dress RestraintMikoDressDesc,"A devious dress that forces the arms into an elbows-touching position." RestraintMikoDressDesc2,"It is extremely strict but it is only fabric. The lacing is intricate and will take a long time to remove." RestraintMikoGag,Ornamental Gag -RestraintMikoGagDesc,"A gag meant to keep servants of the Resurrection Temple quiet by forcing a dildo into their mouth." +RestraintMikoGagDesc,"A gag meant to keep servants of the Resurrection Temple quiet by forcing a plug into their mouth." RestraintMikoGagDesc2,"It is difficult to pull off and though it is made from white leather, a magic enchantment protects it from cutting." RestraintPanelPlugGag,Panel Plug Gag -RestraintPanelPlugGagDesc,"A gag meant to keep people quiet by forcing a dildo into their mouth." +RestraintPanelPlugGagDesc,"A gag meant to keep people quiet by forcing a plug into their mouth." RestraintPanelPlugGagDesc2,"It is difficult to pull off and though it is made from supple, heavy duty leather." RestraintMikoCollar,Fuuka's Collar @@ -3063,36 +3714,51 @@ RestraintMikoCollarDesc,"A collar enchanted with ghastly energy." RestraintMikoCollarDesc2,"It seems to react with a pulse of energy whenever a nearby enemy is defeated." KDMikoCollarSummmon,"Your collar pulses, and a revenant appears to avenge the enemy you defeated!" +RestraintMikoCollar2,Fuuka's Pet Collar +RestraintMikoCollar2Desc,"A collar enchanted with beneficial ghastly energy." +RestraintMikoCollar2Desc2,"It seems to react with a pulse of energy whenever a nearby enemy is defeated." +KDMikoCollarSummmon2,"Your collar pulses, and a revenant appears to assist you!" + RestraintDressBra,Dress Bustier RestraintDressBraDesc,"A deceptively cruel device, making it impossible to reach your nipples." RestraintDressBraDesc2,"Reinforced with steel plates, this will need bolt cutters to take off." RestraintNippleClamps,Massagers -RestraintNippleClampsDesc,"A pair of little motion-activated teasers." -RestraintNippleClampsDesc2,"They will make for some great fun!" +RestraintNippleClampsDesc,"A pair of little motion-activated teasers. They trigger when you swing your body for an attack." +RestraintNippleClampsDesc2,"They will make for some great fun! Type: Edging" RestraintNippleClamps2,Advanced Massagers -RestraintNippleClamps2Desc,"A pair of sensitive motion-activated teasers." -RestraintNippleClamps2Desc2,"They will make for some great fun!" +RestraintNippleClamps2Desc,"A pair of sensitive motion-activated teasers. They trigger when you attack or struggle." +RestraintNippleClamps2Desc2,"They will make for some great fun! Type: Edging" +RestraintNippleWeights,Nipple Weights +RestraintNippleWeightsDesc,"A pair of dense weights dangling from your sensitive bits." +RestraintNippleWeightsDesc2,"They tend to swing around when attacking or casting arm spells." RestraintNippleClamps3,Hi-Tech Massagers -RestraintNippleClamps3Desc,"A pair of highly-sensitive motion-activated teasers." -RestraintNippleClamps3Desc2,"They will make for some great fun!" +RestraintNippleClamps3Desc,"A pair of highly-sensitive motion-activated teasers. They detect most forms of motion, including sprinting and hopping." +RestraintNippleClamps3Desc2,"They will make for some great fun! Type: Edging" RestraintControlHarness,Control Harness RestraintControlHarnessDesc,"An advanced harness for controlling high-security prisoners." RestraintControlHarnessDesc2,"It seems to be made of flexible steel plates." -RestraintTrackingCollar,Tracking Collar -RestraintTrackingCollarDesc,"An advanced collar for tracking high-security prisoners." +RestraintTrackingCollar,Cyber Collar +RestraintTrackingCollarDesc,"An advanced collar for registering prisoners into the facility network." RestraintTrackingCollarDesc2,"It seems to be made of flexible steel plates, and it has a high-security lock." RestraintLatexBallGag,Latex Ball Gag -RestraintLatexBallGagDesc,"A devious device that looks like a ball gag, but has a mouth-filling rod on the inside." +RestraintLatexBallGagDesc,"A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength." RestraintLatexBallGagDesc2,"The strap is made of a durable but flexible material" +RestraintLatexBallGagLarge,Large Latex Ball Gag +RestraintLatexBallGagLargeDesc,"A devious device that looks like a large ball gag, but absolutely fills your mouth with a rubber cylinder. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength." +RestraintLatexBallGagLargeDesc2,"The strap is made of a durable but flexible material" RestraintLatexOTNGag,Latex Mask RestraintLatexOTNGagDesc,A slick layer of blue latex stretched over the mouth. RestraintLatexOTNGagDesc2,It's very tight and makes it hard to move your mouth. +RestraintLatexOTNGagHeavy,Secure Latex Mask +RestraintLatexOTNGagHeavyDesc,A slick layer of blue latex stretched over the mouth. It has a lockable strap which prevents it from being removed. +RestraintLatexOTNGagHeavyDesc2,It's very tight and makes it hard to move your mouth. + RestraintRedLatexHands,Rubberized Gloves RestraintRedLatexHandsDesc,"A mass of alchemical latex stretched over your arms, then hardened to the point that you can barely move your fingers!" @@ -3107,7 +3773,7 @@ RestraintRedLatexMaskDesc,"A mass of alchemical latex stretched over your entire RestraintRedLatexMaskDesc2,"Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky!" RestraintRedLatexBallGag,Rubberized Ball Gag -RestraintRedLatexBallGagDesc,"A mass of alchemical latex inflated to fill your mouth, then hardened." +RestraintRedLatexBallGagDesc,"A mass of alchemical latex inflated to fill your mouth, then hardened. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength." RestraintRedLatexBallGagDesc2,"Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky!" RestraintRedLatexOTNGag,Rubberized OTN Mask @@ -3118,69 +3784,49 @@ RestraintWolfPanties,Wolf Panties RestraintWolfPantiesDesc,"A set of vibrating panties designed to help subdue unruly wolfgirls." RestraintWolfPantiesDesc2,"It's incredibly tight and difficult to remove once it's clipped on, but the material is rubber." -KDCantEquip,"You don't meet the conditions to equip that." +KDCantEquip,"You can't equip that." -RestraintExpArmbinder,Latex Boxtie Binder +RestraintExpArmbinder,Experimental Boxtie Binder RestraintExpArmbinderDesc,"A secure but comfortable binder meant for long-term wear by the alchemists' pets." RestraintExpArmbinderDesc2,"Made from imbued latex, it will be hard to cut but not impossible." -RestraintExpArmbinderHarness,Binder Straps Cincher -RestraintExpArmbinderHarnessDesc,"A tight cincher attached to a binder used to ensure restraints will not come off." +RestraintExpArmbinderHarness,Binder Harness +RestraintExpArmbinderHarnessDesc,"A tight harness attached to a binder used to ensure restraints will not come off." RestraintExpArmbinderHarnessDesc2,"It's tied in the back and reinforced with steel boning." -RestraintExpAnkleCuffs,Blacksteel Ankle Cuffs -RestraintExpAnkleCuffsDesc,"Highly durable cuffs made from top-quality ancient metal." -RestraintExpAnkleCuffsDesc2,"They're made of Blacksteel, a metal used by the Old Civilization." -KinkyDungeonLinkExpAnkleCuffs,"The enemy attaches your ankle cuffs together!" -RestraintExpAnkleCuffs2,Blacksteel Cuffs Chain -RestraintExpAnkleCuffs2Desc,"Highly durable cuffs made from top-quality ancient metal." -RestraintExpAnkleCuffs2Desc2,"They're made of Blacksteel, a metal used by the Old Civilization." -KinkyDungeonUnLinkExpAnkleCuffs2,"The ankle cuff chain detaches!" RestraintExpCollar,Latex Posture Collar RestraintExpCollarDesc,"A strict collar that makes it tougher to escape from other items." RestraintExpCollarDesc2,"It has steel boning but could be cut with enough care." -RestraintExpBoots,Blacksteel Ballet Heels +RestraintExpBoots,Latex Ballet Heels RestraintExpBootsDesc,"A pair of strict boots for making pets more manageable. A skilled person can still walk in these." -RestraintExpBootsDesc2,"They are reinforced with top-quality ancient metal." - -RestraintBlacksteelLegCuffs,Blacksteel Leg Cuffs -RestraintBlacksteelLegCuffsDesc,"A pair of chained cuffs made of Blacksteel, designed to slow the wearer." -RestraintBlacksteelLegCuffsDesc2,"They're made of Blacksteel, a metal used by the Old Civilization." -KinkyDungeonLinkBlacksteelLegCuffs,"The enemy attaches your ankle cuffs together!" - -RestraintBlacksteelArmCuffs,Blacksteel Cuffs -RestraintBlacksteelArmCuffsDesc,"A pair of Blacksteel cuffs that make it easy to restrain you." -RestraintBlacksteelArmCuffsDesc2,"They're made of Blacksteel, a metal used by the Old Civilization." -KinkyDungeonLinkBlacksteelArmCuffs,"The enemy attaches your wrist cuffs together!" - -RestraintBlacksteelArmCuffs2,Blacksteel Wrist Chain -RestraintBlacksteelArmCuffs2Desc,"A pair of Blacksteel cuffs keeping your arms behind your back." -RestraintBlacksteelArmCuffs2Desc2,"They're made of Blacksteel, a metal used by the Old Civilization." -KinkyDungeonUnLinkBlacksteelArmCuffs2,"Your cuffs detatch!" -KinkyDungeonLinkBlacksteelArmCuffs2,"The enemy attaches your elbow cuffs together!" - -RestraintBlacksteelArmCuffs3,Blacksteel Wrist Chain -RestraintBlacksteelArmCuffs3Desc,"A full set of Blacksteel cuffs keeping your arms in a strict elbow tie!" -RestraintBlacksteelArmCuffs3Desc2,"They're made of Blacksteel, a metal used by the Old Civilization." -KinkyDungeonUnLinkBlacksteelArmCuffs3,"Your wrists detatch, leaving your elbows still bound!" +RestraintExpBootsDesc2,"They are reinforced with top-quality hardened latex." -RestraintBlacksteelArmCuffs4,Blacksteel Elbow Chain -RestraintBlacksteelArmCuffs4Desc,"A pair of Blacksteel cuffs keeping your elbows locked together!." -RestraintBlacksteelArmCuffs4Desc2,"They're made of Blacksteel, a metal used by the Old Civilization." -KinkyDungeonUnLinkBlacksteelArmCuffs4,"Your elbows detatch!" -KinkyDungeonLinkBlacksteelArmCuffs4,"The enemy attaches your wrist cuffs back together!" RestraintHighsecArmbinder,High-Security Armbinder -RestraintHighsecArmbinderDesc,"An mythril armbinder enclosing your hands and arms completely, making your hands useless." +RestraintHighsecArmbinderDesc,"An armbinder enclosing your hands and arms completely, making your hands useless." RestraintHighsecArmbinderDesc2,"Made of a flexible, yet durable material, it's going to be really tough to escape." +RestraintHighsecBoxbinder,High-Security Boxbinder +RestraintHighsecBoxbinderDesc,"A boxbinder enclosing your hands and arms completely, making your hands useless." +RestraintHighsecBoxbinderDesc2,"Made of a flexible, yet durable material, it's going to be really tough to escape." +RestraintHighsecStraitjacket,High-Security Straitjacket +RestraintHighsecStraitjacketDesc,"A straitjacket enclosing your hands and arms completely, making your hands useless." +RestraintHighsecStraitjacketDesc2,"Made of a flexible, yet durable material, it's going to be really tough to escape." +RestraintHighsecTransportJacket,High-Security Lockdown Jacket +RestraintHighsecTransportJacketDesc,"This jacket made with extra straps can even be used on top of another jacket for extra security." +RestraintHighsecTransportJacketDesc2,"Made of a flexible, yet durable material, it's going to be really tough to escape." RestraintHighsecLegbinder,High-Security Legbinder RestraintHighsecLegbinderDesc,"An mythril legbinder enclosing your legs, making it difficult to move." RestraintHighsecLegbinderDesc2,"Made of a flexible, yet durable material, it's going to be really tough to escape." + + RestraintHighsecShackles,High-Security Shackles -RestraintHighsecShacklesDesc,"A pair of mythril shackles around your feet." +RestraintHighsecShacklesDesc,"A pair of hardened steel shackles around your feet." RestraintHighsecShacklesDesc2,"Nearly indestructable, you are at the mercy of its lock." -RestraintHighsecBallGag,High-Security BallGag +RestraintHighsecBallGag,High-Security Ball Gag RestraintHighsecBallGagDesc,"A rubber gag shoved tightly between your lips." -RestraintHighsecBallGagDesc2,"The mythril straps are nigh-unbreakable, keeping you securely silenced." +RestraintHighsecBallGagDesc2,"The cable-reinforced straps are nigh-unbreakable, keeping you securely silenced." +RestraintHighsecMuzzle,High-Security Muzzle +RestraintHighsecMuzzleDesc,"A secure muzzle made with cable-reinforced straps." +RestraintHighsecMuzzleDesc2,"It is especially effective at keeping in other gags." RestraintPotionCollar,Potion Absorber RestraintPotionCollarDesc,"An ancient device that allows direct use of potions even while gagged or bound." @@ -3195,21 +3841,22 @@ KinkyDungeonInventoryItemSlimeWalkers,Slime Walkers KinkyDungeonInventoryItemSlimeWalkersDesc,"A pair of heels coated in a nonstick material." KinkyDungeonInventoryItemSlimeWalkersDesc2,"They will slow you down, but you can walk on slime without getting stuck!" -RestraintGlovesDexterity,"Gloves of Dexterity" -RestraintGlovesDexterityDesc,"A pair of gloves that makes your hits strike with elven grace--and force." -RestraintGlovesDexterityDesc2,"Increases accuracy by +50. Reduces melee damage by 30%." -KinkyDungeonInventoryItemGlovesDexterity,"Gloves of Dexterity" -KinkyDungeonInventoryItemGlovesDexterityDesc,"A pair of gloves that makes your hits strike with elven grace--and force." -KinkyDungeonInventoryItemGlovesDexterityDesc2,"Increases accuracy by +50. Reduces melee damage by 30%." -LootGlovesDexterity,"You find a pair of leather gloves with a magic rune." - -RestraintBracersTide,"Bracers of Roaring Tides" -RestraintBracersTideDesc,"A pair of bracers that conjures a mighty wave upon attacking." -RestraintBracersTideDesc2,"Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage." -KinkyDungeonInventoryItemBracersTide,"Bracers of Roaring Tides" -KinkyDungeonInventoryItemBracersTideDesc,"A pair of bracers that conjures a mighty wave upon attacking." -KinkyDungeonInventoryItemBracersTideDesc2,"Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage." -LootBracersTide,"You find a pair of bracers that are transparent like water." + +RestraintDusterGag,Duster Gag +RestraintDusterGagDesc,"A special gag designed for maids to be useful even while tied up! It's self-locking too!" +RestraintDusterGagDesc2,"Deals 0.5 tickle damage on attack and adds +30 distraction. Bonus damage vs dirt and mold." +KinkyDungeonInventoryItemDusterGag,Duster Gag +KinkyDungeonInventoryItemDusterGagDesc,"A special gag designed for maids to be useful even while tied up! It's self-locking too!" +KinkyDungeonInventoryItemDusterGagDesc2,"Deals 0.5 tickle damage on attack and adds +30 distraction." + + +RestraintGasMask,Gas Mask +RestraintGasMaskDesc,"A respirator designed to protect the wearer from noxious fumes." +RestraintGasMaskDesc2,"+50 Poison resist. Protects against dizziness caused by sleep gas. Affects speech." +KinkyDungeonInventoryItemGasMask,Gas Mask +KinkyDungeonInventoryItemGasMaskDesc,"A respirator designed to protect the wearer from noxious fumes." +KinkyDungeonInventoryItemGasMaskDesc2,"+50 Poison resist. Protects against dizziness caused by sleep gas. Affects speech." + KDCursedArmorUncurse,The curse on the RestraintName is lifted! KDShopConfirm,Press RIGHT to confirm buy! @@ -3274,10 +3921,10 @@ RestraintDuctTapeFeet,Charms (Feet) RestraintDuctTapeFeetDesc,"A band of faintly magic ribbon wrapped tight around your ankles." RestraintDuctTapeFeetDesc2,"It clings, almost of its own accord, but seems vulnerable to both cutting and stretching." RestraintDuctTapeHead,Charms (Head) -RestraintDuctTapeHeadDesc,"A band of faintly magic ribbon wrapped tight around your eyes." +RestraintDuctTapeHeadDesc,"A band of faintly magic ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar." RestraintDuctTapeHeadDesc2,"It clings, almost of its own accord, but seems vulnerable to both cutting and stretching." RestraintDuctTapeMouth,Charm Gag -RestraintDuctTapeMouthDesc,"A band of faintly magic ribbon wrapped tight around your mouth." +RestraintDuctTapeMouthDesc,"A band of faintly magic ribbon wrapped tight over the mouth. Can be used on vulnerable targets from quick inventory or hotbar." RestraintDuctTapeMouthDesc2,"It clings, almost of its own accord, but seems vulnerable to both cutting and stretching." RestraintDuctTapeBoots,Charm Wrapping (Toes) RestraintDuctTapeBootsDesc,"A layer of faintly magic ribbon wrapped tight around your feet." @@ -3294,10 +3941,16 @@ RestraintDuctTapeFeetMummyDesc2,"It clings, almost of its own accord, but seems RestraintDuctTapeLegsMummy,Charm Wrapping (Legs) RestraintDuctTapeLegsMummyDesc,"A layer of faintly magic ribbon wrapped tight around your thighs." RestraintDuctTapeLegsMummyDesc2,"It clings, almost of its own accord, but seems vulnerable to both cutting and stretching." +RestraintDuctTapeCollar,Living Charm Collar +RestraintDuctTapeCollarDesc,"This collar is designed to make sure its wearer does not escape their charms." +RestraintDuctTapeCollarDesc2,"It will occasionally cause charms to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of charms you have on you." RestraintPanelGag,Leather Panel Gag RestraintPanelGagDesc,"A gag that seals your lips tightly and stuffs your mouth with a ball." -RestraintPanelGagDesc2,"The harness is comprehensive and it's locked in place." +RestraintPanelGagDesc2,"Keep your mouth to yourself!" +RestraintHarnessPanelGag,Harness Panel Gag +RestraintHarnessPanelGagDesc,"A gag that seals your lips tightly and stuffs your mouth with a ball." +RestraintHarnessPanelGagDesc2,"The harness is comprehensive and it's locked in place." RestraintHarnessGag,Harness Ball Gag RestraintHarnessGagDesc,"A gag that stuffs your mouth with a large silicone ball." RestraintHarnessGagDesc2,"The harness is comprehensive and it's locked in place." @@ -3325,11 +3978,18 @@ RestraintMagicPetsuit,Magic Petsuit RestraintMagicPetsuitDesc,"A set of straps and buckles enchanted with a powerful spell to render you helpless." RestraintMagicPetsuitDesc2,"It's warded against cutting by nonmagic blades." +RestraintLatexPetsuit,Latex Petsuit +RestraintLatexPetsuitDesc,"A skintight suit that encases you in a tight rubber embrace." +RestraintLatexPetsuitDesc2,"The thick latex is resistant to even the most determined struggles." + RestraintMysticDuctTapeHead,Blessed Wrappings (Head) -RestraintMysticDuctTapeHeadDesc,"A band of magic embalming ribbon wrapped tight around your eyes." +RestraintMysticDuctTapeHeadDesc,"A band of magic embalming ribbon wrapped tight around your face." RestraintMysticDuctTapeHeadDesc2,"It clings, almost of its own accord, but seems vulnerable to both cutting and stretching." +RestraintMysticDuctTapeEyes,Blessed Wrappings (Eyes) +RestraintMysticDuctTapeEyesDesc,"A band of magic embalming ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar." +RestraintMysticDuctTapeEyesDesc2,"It clings, almost of its own accord, but seems vulnerable to both cutting and stretching." RestraintMysticDuctTapeMouth,Blessed Wrappings (Gag) -RestraintMysticDuctTapeMouthDesc,"A band of magic embalming ribbon wrapped tight around your mouth." +RestraintMysticDuctTapeMouthDesc,"A band of magic embalming ribbon wrapped tight over mouth. Can be used on vulnerable targets from quick inventory or hotbar." RestraintMysticDuctTapeMouthDesc2,"It clings, almost of its own accord, but seems vulnerable to both cutting and stretching." RestraintMysticDuctTapeArmsMummy,Blessed Wrappings (Arms) RestraintMysticDuctTapeArmsMummyDesc,"A layer of magic embalming ribbon wrapped tight around your body." @@ -3340,16 +4000,78 @@ RestraintMysticDuctTapeFeetMummyDesc2,"It clings, almost of its own accord, but RestraintMysticDuctTapeBoots,Blessed Wrappings (Toes) RestraintMysticDuctTapeBootsDesc,"A layer of magic embalming ribbon wrapped tight around your feet." RestraintMysticDuctTapeBootsDesc2,"It clings, almost of its own accord, but seems vulnerable to both cutting and stretching." +RestraintMysticDuctTapeHands,Blessed Wrappings (Hands) +RestraintMysticDuctTapeHandsDesc,"A layer of magic embalming ribbon wrapped tight around your hands." +RestraintMysticDuctTapeHandsDesc2,"It clings, almost of its own accord, but seems vulnerable to both cutting and stretching." RestraintMysticDuctTapeLegsMummy,Blessed Wrappings (Legs) RestraintMysticDuctTapeLegsMummyDesc,"A layer of magic embalming ribbon wrapped tight around your thighs." RestraintMysticDuctTapeLegsMummyDesc2,"It clings, almost of its own accord, but seems vulnerable to both cutting and stretching." - +RestraintMysticDuctTapeCollar,Living Blessed Wrappings Collar +RestraintMysticDuctTapeCollarDesc,"This collar is designed to make sure its wearer does not escape their wrappings." +RestraintMysticDuctTapeCollarDesc2,"It will occasionally cause blessed wrappings to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of blessed wrappings you have on you." + +RestraintVinylTapeHands,Tape (Hands) +RestraintVinylTapeHandsDesc,"Sleek and shiny tape for the bondage enthusiast." +RestraintVinylTapeHandsDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeArms,Tape (Arms) +RestraintVinylTapeArmsDesc,"Sleek and shiny tape for the bondage enthusiast." +RestraintVinylTapeArmsDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeLegs,Tape (Legs) +RestraintVinylTapeLegsDesc,"Sleek and shiny tape for the bondage enthusiast." +RestraintVinylTapeLegsDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeFeet,Tape (Feet) +RestraintVinylTapeFeetDesc,"Sleek and shiny tape for the bondage enthusiast." +RestraintVinylTapeFeetDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeHead,Tape (Head) +RestraintVinylTapeHeadDesc,"Sleek and shiny tape for the bondage enthusiast. Can be used on vulnerable targets from quick inventory or hotbar." +RestraintVinylTapeHeadDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeMouth,Tape Gag +RestraintVinylTapeMouthDesc,"Sleek and shiny tape for the bondage enthusiast. Can be used on vulnerable targets from quick inventory or hotbar." +RestraintVinylTapeMouthDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeMouthFull,Tape Mouth Wrap +RestraintVinylTapeMouthFullDesc,"Sleek and shiny tape for the bondage enthusiast." +RestraintVinylTapeMouthFullDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeBoots,Tape Wrapping (Toes) +RestraintVinylTapeBootsDesc,"Sleek and shiny tape for the bondage enthusiast." +RestraintVinylTapeBootsDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeHeadMummy,Tape Wrapping (Head) +RestraintVinylTapeHeadMummyDesc,"Sleek and shiny tape for the bondage enthusiast." +RestraintVinylTapeHeadMummyDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeArmsMummy,Tape Wrapping (Arms) +RestraintVinylTapeArmsMummyDesc,"Sleek and shiny tape for the bondage enthusiast." +RestraintVinylTapeArmsMummyDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeFeetMummy,Tape Wrapping (Feet) +RestraintVinylTapeFeetMummyDesc,"Sleek and shiny tape for the bondage enthusiast." +RestraintVinylTapeFeetMummyDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeLegsMummy,Tape Wrapping (Legs) +RestraintVinylTapeLegsMummyDesc,"Sleek and shiny tape for the bondage enthusiast." +RestraintVinylTapeLegsMummyDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." +RestraintVinylTapeCollar,Living Tape Collar +RestraintVinylTapeCollarDesc,"This collar is designed to make sure its wearer does not escape their tape." +RestraintVinylTapeCollarDesc2,"It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you." + + +RestraintAutoTapeRaw,Autotape +RestraintAutoTapeRawDesc,"Comes in convenient cartridges for machine loading." +RestraintAutoTapeRawDesc2,"A specialized tape used for capturing purposes during the time of the Old Civilization. Despite its appearance, it contains a gas-permeable membrane that allows ventilation, while its hydrophobic properties resist solvents that would otherwise disrupt the adhesive bond. The adhesive layer is special in that it activates only in contact with other auto-tape, making it safer to use and remove." + +RestraintVinylTapeRaw,Rubberized Tape +RestraintVinylTapeRawDesc,"Sleek and shiny tape for the bondage enthusiast." +RestraintVinylTapeRawDesc2,"A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against." + +RestraintCharmRaw,Magic Charms +RestraintCharmRawDesc,"Magical charms from the ancient graveyard." +RestraintCharmRawDesc2,"Its magic is not enough to protect it from damage, but it is surprisingly effective at restraining both intruders and cursed entities." + +RestraintMysticDuctTapeRaw,Blessed Wrapping +RestraintMysticDuctTapeRawDesc,"A layer of magic embalming ribbon." +RestraintMysticDuctTapeRawDesc2,"It clings of its own accord to intruders and naughty catgirls." RestraintAutoTapeHands,Autotape (Hands) RestraintAutoTapeHandsDesc,"Sticky tape made from a metallic material. Used to great effect in police situations." RestraintAutoTapeHandsDesc2,"It's very sticky and seals your hands tightly, making any struggling ineffective." RestraintAutoTapeHead,Autotape (Head) -RestraintAutoTapeHeadDesc,"Sticky tape made from a metallic material. Used to great effect in police situations." +RestraintAutoTapeHeadDesc,"Sticky tape made from a metallic material. Used to great effect in police situations. Can be used on vulnerable targets from quick inventory or hotbar." RestraintAutoTapeHeadDesc2,"It's very sticky and tough but you could probably get a knife through it." RestraintAutoTapeArms,Autotape (Arms) RestraintAutoTapeArmsDesc,"Sticky tape made from a metallic material. Used to great effect in police situations." @@ -3364,68 +4086,27 @@ RestraintAutoTapeBoots,Autotape (Feet) RestraintAutoTapeBootsDesc,"Sticky tape made from a metallic material. Used to great effect in police situations." RestraintAutoTapeBootsDesc2,"It's very sticky and tough but you could probably get a knife through it." RestraintAutoTapeMouth,Autotape (Mouth) -RestraintAutoTapeMouthDesc,"Sticky tape made from a metallic material. Used to great effect in police situations." +RestraintAutoTapeMouthDesc,"Sticky tape made from a metallic material. Used to great effect in police situations. Can be used on vulnerable targets from quick inventory or hotbar." RestraintAutoTapeMouthDesc2,"It's very sticky and tough but you could probably get a knife through it." +RestraintAutoTapeMouthFull,Autotape (Mouth Wrap) +RestraintAutoTapeMouthFullDesc,"Sticky tape made from a metallic material. Used to great effect in police situations." +RestraintAutoTapeMouthFullDesc2,"It's very sticky and tough but you could probably get a knife through it." +RestraintAutoTapeCollar,Living Auto Tape Collar +RestraintAutoTapeCollarDesc,"This collar is designed to make sure its wearer does not escape their tape." +RestraintAutoTapeCollarDesc2,"It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you." + RestraintStuffing,Stuffing -RestraintStuffingDesc,"A stuffing of cloth." +RestraintStuffingDesc,"A stuffing of cloth. Can be applied on vulnerable targets or those who casted a verbal spell last turn." RestraintStuffingDesc2,"You could spit it out easily, provided nothing's covering it." -RestraintWeakMagicRopeArms,Arm Ropes -RestraintWeakMagicRopeArmsDesc,"Faintly glowing ropes from a magic trap." -RestraintWeakMagicRopeArmsDesc2,"I wonder who was responsible?" -RestraintWeakMagicRopeLegs,Leg Ropes -RestraintWeakMagicRopeLegsDesc,"Faintly glowing ropes from a magic trap." -RestraintWeakMagicRopeLegsDesc2,"I wonder who was responsible?" - -RestraintStrongMagicRopeHogtie,Magic Hogtie -RestraintStrongMagicRopeHogtieDesc,"It pulls your wrists up to your ankles! So tight!" -RestraintStrongMagicRopeHogtieDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" -RestraintStrongMagicRopeArms,Magic Arm Rope -RestraintStrongMagicRopeArmsDesc,"Strongly glowing ropes." -RestraintStrongMagicRopeArmsDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" -RestraintStrongMagicRopeCuffs,Magic Rope Cuffs -RestraintStrongMagicRopeCuffsDesc,"Strongly glowing ropes." -RestraintStrongMagicRopeCuffsDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" -RestraintStrongMagicRopeCuffsAdv,Magic Ropework -RestraintStrongMagicRopeCuffsAdvDesc,"Strongly glowing ropes tied in an intricate pattern, making hand restraints more secure." -RestraintStrongMagicRopeCuffsAdvDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" -RestraintStrongMagicRopeLegs,Magic Leg Rope -RestraintStrongMagicRopeLegsDesc,"Strongly glowing ropes." -RestraintStrongMagicRopeLegsDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" -RestraintStrongMagicRopeFeet,Magic Ankle Rope -RestraintStrongMagicRopeFeetDesc,"Strongly glowing ropes." -RestraintStrongMagicRopeFeetDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" -RestraintStrongMagicRopeCrotch,Magic Crotch Rope -RestraintStrongMagicRopeCrotchDesc,"Strongly glowing ropes." -RestraintStrongMagicRopeCrotchDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" -RestraintStrongMagicRopeToe,Magic Toe Rope -RestraintStrongMagicRopeToeDesc,"Strongly glowing ropes." -RestraintStrongMagicRopeToeDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" -RestraintMithrilRopeHogtie,Mithril Hogtie -RestraintMithrilRopeHogtieDesc,"It pulls your wrists up to your ankles! So tight!" -RestraintMithrilRopeHogtieDesc2,"Made of woven mithril and enchanted to require magic blades to cut!" -RestraintMithrilRopeArms,Mithril Arm Rope -RestraintMithrilRopeArmsDesc,"Strongly shining ropes." -RestraintMithrilRopeArmsDesc2,"Made of woven mithril and enchanted to require magic blades to cut!" -RestraintMithrilRopeLegs,Mithril Leg Rope -RestraintMithrilRopeLegsDesc,"Strongly shining ropes." -RestraintMithrilRopeLegsDesc2,"Made of woven mithril and enchanted to require magic blades to cut!" -RestraintMithrilRopeFeet,Mithril Ankle Rope -RestraintMithrilRopeFeetDesc,"Strongly shining ropes." -RestraintMithrilRopeFeetDesc2,"Made of woven mithril and enchanted to require magic blades to cut!" -RestraintMithrilRopeCrotch,Mithril Crotch Rope -RestraintMithrilRopeCrotchDesc,"Strongly shining ropes." -RestraintMithrilRopeCrotchDesc2,"Made of woven mithril and enchanted to require magic blades to cut!" -RestraintMithrilRopeHarness,Mithril Rope Harness -RestraintMithrilRopeHarnessDesc,"Strongly shining ropes." -RestraintMithrilRopeHarnessDesc2,"Made of woven mithril and enchanted to require magic blades to cut!" -RestraintMithrilRopeToe,Mithril Toe Rope -RestraintMithrilRopeToeDesc,"Strongly shining ropes." -RestraintMithrilRopeToeDesc2,"Made of woven mithril and enchanted to require magic blades to cut!" +RestraintMithrilLivingCollar,Living Mithril Collar +RestraintMithrilLivingCollarDesc,"A collar made from an almost-weightless alloy that adjusts itself to your neck." +RestraintMithrilLivingCollarDesc2,"It will occasionally cause mithril to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of mithril you have on you." + RestraintMithrilCollar,Mithril Collar RestraintMithrilCollarDesc,"A collar made from an almost-weightless alloy.." RestraintMithrilCollarDesc2,"It feels comfortable but it's also really hard." @@ -3435,35 +4116,95 @@ RestraintMithrilArmCuffsDesc,"A pair of cuffs that make it easy to restrain you. RestraintMithrilArmCuffsDesc2,"They feel like they aren't even there, but the material is rigid and unyielding." KinkyDungeonLinkMithrilArmCuffs,"The enemy attaches your wrist cuffs together!" -RestraintMithrilArmCuffs2,Cuffs Wrist Chain +RestraintMithrilArmCuffs2,Wrist Chain RestraintMithrilArmCuffs2Desc,"A pair of cuffs keeping your arms behind your back." RestraintMithrilArmCuffs2Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." KinkyDungeonUnLinkMithrilArmCuffs2,"Your cuffs detatch!" KinkyDungeonLinkMithrilArmCuffs2,"The enemy attaches your elbow cuffs together!" -RestraintMithrilArmCuffs3,Cuffs Wrist Chain +RestraintMithrilArmCuffs3,Cuffs Chain RestraintMithrilArmCuffs3Desc,"A full set of cuffs keeping your arms in a strict elbow tie!" RestraintMithrilArmCuffs3Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." KinkyDungeonUnLinkMithrilArmCuffs3,"Your wrists detatch, leaving your elbows still bound!" -RestraintMithrilArmCuffs4,Elbow Cuffs Chain -RestraintMithrilArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!." +RestraintMithrilArmCuffs4,Elbow Chain +RestraintMithrilArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!" RestraintMithrilArmCuffs4Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." KinkyDungeonUnLinkMithrilArmCuffs4,"Your elbows detatch!" KinkyDungeonLinkMithrilArmCuffs4,"The enemy attaches your wrist cuffs back together!" RestraintMithrilLegCuffs,Mithril Leg Cuffs -RestraintMithrilLegCuffsDesc,"A pair of cuffs chaining your legs together." +RestraintMithrilLegCuffsDesc,"A pair of cuffs on your legs." RestraintMithrilLegCuffsDesc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonLinkMithrilLegCuffs,"The enemy attaches your leg cuffs together!" +RestraintMithrilLegCuffs2,Thigh Chain +RestraintMithrilLegCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintMithrilLegCuffs2Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonUnLinkMithrilLegCuffs2,"The leg cuff chain detaches!" + RestraintMithrilAnkleCuffs,Mithril Ankle Cuffs -RestraintMithrilAnkleCuffsDesc,"A pair of cuffs chaining your legs together." +RestraintMithrilAnkleCuffsDesc,"A pair of cuffs on your ankles." RestraintMithrilAnkleCuffsDesc2,"They feel like they aren't even there, but the material is rigid and unyielding." KinkyDungeonLinkMithrilAnkleCuffs,"The enemy attaches your ankle cuffs together!" -RestraintMithrilAnkleCuffs2,Cuffs Chain +RestraintMithrilAnkleCuffs2,Ankle Chain RestraintMithrilAnkleCuffs2Desc,"A pair of cuffs chaining your legs together." RestraintMithrilAnkleCuffs2Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." KinkyDungeonUnLinkMithrilAnkleCuffs2,"The ankle cuff chain detaches!" +KinkyDungeonLinkMithrilAnkleCuffs2,"Your ankle cuff chain is tightened and pulls your feet together!" +RestraintMithrilAnkleCuffs3,Short Ankle Chain +RestraintMithrilAnkleCuffs3Desc,"A pair of cuffs chaining your feet tightly together." +RestraintMithrilAnkleCuffs3Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonUnLinkMithrilAnkleCuffs3,"Your ankle cuff chain loosens!" + + +RestraintLeatherLivingCollar,Living Leather Collar +RestraintLeatherLivingCollarDesc,"A collar made of tough leather that adjusts itself to your neck." +RestraintLeatherLivingCollarDesc2,"It will occasionally cause leather to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of leather you have on you." + +RestraintLeatherArmCuffs,Leather Cuffs +RestraintLeatherArmCuffsDesc,"A pair of cuffs that make it easy to restrain you." +RestraintLeatherArmCuffsDesc2,"Made of tough leather." +KinkyDungeonLinkLeatherArmCuffs,"The enemy attaches your wrist cuffs together!" + +RestraintLeatherArmCuffs2,Wrist Chain +RestraintLeatherArmCuffs2Desc,"A pair of cuffs keeping your arms behind your back." +RestraintLeatherArmCuffs2Desc2,"Made of tough leather." +KinkyDungeonUnLinkLeatherArmCuffs2,"Your cuffs detatch!" +KinkyDungeonLinkLeatherArmCuffs2,"The enemy attaches your elbow cuffs together!" + +RestraintLeatherArmCuffs3,Cuffs Chain +RestraintLeatherArmCuffs3Desc,"A full set of cuffs keeping your arms in a strict elbow tie!" +RestraintLeatherArmCuffs3Desc2,"Made of tough leather." +KinkyDungeonUnLinkLeatherArmCuffs3,"Your wrists detatch, leaving your elbows still bound!" + +RestraintLeatherArmCuffs4,Elbow Chain +RestraintLeatherArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!" +RestraintLeatherArmCuffs4Desc2,"Made of tough leather." +KinkyDungeonUnLinkLeatherArmCuffs4,"Your elbows detatch!" +KinkyDungeonLinkLeatherArmCuffs4,"The enemy attaches your wrist cuffs back together!" + +RestraintLeatherLegCuffs,Leather Leg Cuffs +RestraintLeatherLegCuffsDesc,"A pair of cuffs on your legs." +RestraintLeatherLegCuffsDesc2,"Made of tough leather." +KinkyDungeonLinkLeatherLegCuffs,"The enemy attaches your leg cuffs together!" +RestraintLeatherLegCuffs2,Thigh Chain +RestraintLeatherLegCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintLeatherLegCuffs2Desc2,"Made of tough leather." +KinkyDungeonUnLinkLeatherLegCuffs2,"The leg cuff chain detaches!" +RestraintLeatherAnkleCuffs,Leather Ankle Cuffs +RestraintLeatherAnkleCuffsDesc,"A pair of cuffs on your ankles." +RestraintLeatherAnkleCuffsDesc2,"Made of tough leather." +KinkyDungeonLinkLeatherAnkleCuffs,"The enemy attaches your ankle cuffs together!" +RestraintLeatherAnkleCuffs2,Ankle Chain +RestraintLeatherAnkleCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintLeatherAnkleCuffs2Desc2,"Made of tough leather." +KinkyDungeonUnLinkLeatherAnkleCuffs2,"The ankle cuff chain detaches!" +KinkyDungeonLinkLeatherAnkleCuffs2,"Your ankle cuff chain is tightened and pulls your feet together!" +RestraintLeatherAnkleCuffs3,Short Ankle Chain +RestraintLeatherAnkleCuffs3Desc,"A pair of cuffs chaining your feet tightly together." +RestraintLeatherAnkleCuffs3Desc2,"Made of tough leather." +KinkyDungeonUnLinkLeatherAnkleCuffs3,"Your ankle cuff chain loosens!" RestraintStickySlime,Sticky Slime RestraintStickySlimeDesc,"A sticky layer of slime keeping you anchored to the ground." @@ -3471,35 +4212,69 @@ RestraintStickySlimeDesc2,"It will slow you for a single turn." RestraintTrapMittens,Leather Mittens RestraintTrapMittensDesc,"A pair of tight leather mittens enclosing your hands." RestraintTrapMittensDesc2,"They make it almost impossible to manipulate keys and tools. Keep your hands to yourself!" +RestraintTrapLegbinder,Leather Legbinder +RestraintTrapLegbinderDesc,"A tight leather legbinder that keeps your feet glued together." +RestraintTrapLegbinderDesc2,"It's quite snug and the laces are secured with a lockable panel. Getting at them requires picking the lock." RestraintTrapArmbinder,Leather Armbinder RestraintTrapArmbinderDesc,"A tight leather armbinder enclosing your hands and arms completely." RestraintTrapArmbinderDesc2,"It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible." +RestraintTrapBoxbinder,Leather Boxbinder +RestraintTrapBoxbinderDesc,"A secure but comfortable binder meant for long-term wear." +RestraintTrapBoxbinderDesc2,"It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible." RestraintTrapArmbinderHarness,Leather Armbinder Harness RestraintTrapArmbinderHarnessDesc,"Leather belts securing your armbinder tightly." RestraintTrapArmbinderHarnessDesc2,"It's quite tight and secured by lockable buckles on your sides." KinkyDungeonRemoveArmbinderHarness,The armbinder harness comes off with the armbinder. +KinkyDungeonRemoveCuffsCyberAnkleCuffs,The energy link between your ankle cuffs fizzles into nothing. +KinkyDungeonRemoveCuffsCyberWristCuffs,The energy link between your arm cuffs fizzles into nothing. +KinkyDungeonRemoveCuffsCyberLegCuffs,The energy link between your thigh cuffs fizzles into nothing. KinkyDungeonRemoveCuffs,The cuff chains come off with the cuffs. +KinkyDungeonRemoveHogtie,The hogtie link comes off. RestraintTrapCuffs,Handcuffs -RestraintTrapCuffsDesc,"A pair of steel cuffs locked securely around your wrists." +RestraintTrapCuffsDesc,"A pair of steel cuffs locked securely around your wrists. Can be applied on vulnerable targets if targeted from inventory or hotbar." RestraintTrapCuffsDesc2,"The lock doesn't seem very complicated." RestraintTrapYoke,Steel Yoke RestraintTrapYokeDesc,"A steel bar clamped firmly around your wrists and neck, leaving you in a helpless position." -RestraintTrapYokeDesc2,"This is not something you can pick by yourself..." +RestraintTrapYokeDesc2,"The awkward position makes it difficult to get out of alone." +RestraintHeavyYoke,Heavy Yoke +RestraintHeavyYokeDesc,"A series of armor-grade plates cut with precision machining, sandwiched into an unbreakable layer that clasps firmly in place around your neck and wrists." +RestraintHeavyYokeDesc2,"The awkward position makes it difficult to get out of alone." +RestraintTrapFiddle,Steel Fiddle +RestraintTrapFiddleDesc,"A steel fixture keeping your hands in an awkward and submissive position." +RestraintTrapFiddleDesc2,"The awkward position prevents you from easily reaching the lock." RestraintTrapHarness,Leather Harness RestraintTrapHarnessDesc,"A leather harness of tight straps buckled around your torso." RestraintTrapHarnessDesc2,"It provides an anchor point for enemies to grab onto!" +RestraintPVCHarness,Rubberized Harness +RestraintPVCHarnessDesc,"A harness made of latex polymer, resistant to most solvents and corrosion." +RestraintPVCHarnessDesc2,"Can be worn all day! Also convenient to hold." RestraintTrapGag,Ball Gag -RestraintTrapGagDesc,"A gag made of a red squishy material." +RestraintTrapGagDesc,"A gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength." RestraintTrapGagDesc2,"You can't seem to enunciate your spells properly with this in." +RestraintTrapGagLarge,Large Ball Gag +RestraintTrapGagLargeDesc,"A mouth-filling gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength." +RestraintTrapGagLargeDesc2,"You can't seem to enunciate your spells properly with this in." RestraintMagicGag,Tight Ball Gag -RestraintMagicGagDesc,"A gag made of a red squishy material, buckled as tight as it will go." +RestraintMagicGagDesc,"A gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength." RestraintMagicGagDesc2,"You can't seem to enunciate your spells properly with this in." +RestraintMagicGagLarge,Huge Ball Gag +RestraintMagicGagLargeDesc,"A massive gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength." +RestraintMagicGagLargeDesc2,"You absolutely can't enunciate your spells properly with this in." RestraintMagicGag2,Magic Ball Gag -RestraintMagicGag2Desc,"A gag enchanted with magic. It grows to fill your mouth so you can hardly speak." +RestraintMagicGag2Desc,"A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength." RestraintMagicGag2Desc2,"It's brimming with conjured energy. A normal knife won't work here!" +RestraintAntiMagicGag,Anti-Magic Gag +RestraintAntiMagicGagDesc,"A gag designed to cripple mages. It's made of a squishy rubbery material." +RestraintAntiMagicGagDesc2,"It's sealed with a magical spell that rapidly absorbs mana! When it drains 40 mana it will transform into an ordinary gag and inflate." +RestraintAntiMagicGag2,Anti-Mage Gag +RestraintAntiMagicGag2Desc,"A gag designed to cripple experienced spellcasters. It's made of a magic-absorbing rubber." +RestraintAntiMagicGag2Desc2,"You feel the energy flowing out of you! When it drains 100 mana it will transform into an ordinary gag and inflate." RestraintTrapBoots,Ballet Heels RestraintTrapBootsDesc,"A pair of shoes with heels so tall it forces you on your toes." RestraintTrapBootsDesc2,"These will take some getting used to." +RestraintTrainingHeels,Training Heels +RestraintTrainingHeelsDesc,"A pair of unreasonably high heels owned by you personally." +RestraintTrainingHeelsDesc2,"These will take some getting used to." RestraintTrapLegirons,Leg Irons RestraintTrapLegironsDesc,"A pair of solid steel cuffs connecting your ankles inescapably." RestraintTrapLegironsDesc2,"The lock doesn't seem very complicated." @@ -3537,44 +4312,47 @@ RestraintMaidCBeltDesc,"A chastity belt used to maintain control over initiate m RestraintMaidCBeltDesc2,"Made of hardened steel. The lock is high-security." RestraintTrapVibe,Magic Egg RestraintTrapVibeDesc,"An energetic little friend that likes to tease you." -RestraintTrapVibeDesc2,"It is charged by residual magic from your spells." +RestraintTrapVibeDesc2,"It is charged by residual magic from your spells. Type: Teasing" RestraintTrapVibeProto,Prototype Egg RestraintTrapVibeProtoDesc,"A teaser that periodically vibrates." -RestraintTrapVibeProtoDesc2,"High efficiency mana conversion means longer tease duration." +RestraintTrapVibeProtoDesc2,"High efficiency mana conversion means longer tease duration. Type: Teasing, Pleasure, Edging" RestraintTrapPlug,Vibrating Plug RestraintTrapPlugDesc,"A sizeable plug that makes you happy... a little too happy." -RestraintTrapPlugDesc2,"It vibrates periodically and allows orgasms." +RestraintTrapPlugDesc2,"It vibrates periodically and adds distraction when moving. Type: Pleasure" RestraintTrapPlug2,Teaser Plug RestraintTrapPlug2Desc,"A sizeable plug that will tease you but never let you go..." -RestraintTrapPlug2Desc2,"It vibrates weakly periodically." +RestraintTrapPlug2Desc2,"It vibrates weakly periodically. Type: Teasing, Denial" RestraintTrapPlug3,Torment Plug RestraintTrapPlug3Desc,"A sizeable plug that will make your life unbearably pleasurable..." -RestraintTrapPlug3Desc2,"It vibrates strongly periodically and has a denial setting." +RestraintTrapPlug3Desc2,"It vibrates strongly periodically and has a denial setting. Type: Denial" RestraintTrapPlug4,Thundering Plug RestraintTrapPlug4Desc,"A sizeable plug that will make your life unbearably pleasurable..." -RestraintTrapPlug4Desc2,"Enjoy it while you can." +RestraintTrapPlug4Desc2,"Enjoy it while you can. Type: Pleasure, Edging" RestraintTrapPlug5,Intense Training Plug RestraintTrapPlug5Desc,"An energetic plug that will make your life unbearably pleasurable..." -RestraintTrapPlug5Desc2,"You're going to have the time of your life." +RestraintTrapPlug5Desc2,"You're going to have the time of your life. Type: Pleasure, and lots of it" RestraintRearVibe1,Rear Vibrating Plug RestraintRearVibe1Desc,"A device that attacks from multiple angles." -RestraintRearVibe1Desc2,"An enjoyable experience." +RestraintRearVibe1Desc2,"An enjoyable experience. Type: Edging" RestraintMaidVibe,Maid Egg RestraintMaidVibeDesc,"An energetic little friend that likes to tease you and takes orders from the head maid." -RestraintMaidVibeDesc2,"It is charged by residual magic from your spells." +RestraintMaidVibeDesc2,"It is charged by residual magic from your spells. Type: Teasing, Edging" -RestraintSteelPlugF,Stainless Plug +RestraintSteelPlugF,Stainless Plug (F) RestraintSteelPlugFDesc,"A weighty plug that doesn't vibrate, but you'll certainly notice it walking around..." RestraintSteelPlugFDesc2,"This one goes in the front." -RestraintSteelPlugR,Stainless Plug +RestraintSteelPlugR,Stainless Plug (R) RestraintSteelPlugRDesc,"A weighty plug that doesn't vibrate, but you'll certainly notice it walking around..." RestraintSteelPlugRDesc2,"This one goes in the back." RestraintShadowHandMouth,Shadow Hand Gag RestraintShadowHandMouthDesc,"It clasps tightly over the mouth and prevents you from casting your spells!" RestraintShadowHandMouthDesc2,"You have no choice but to struggle." +RestraintShadowHandEyes,Shadow Hand Eyes +RestraintShadowHandEyesDesc,"Shadow hands clasped over your eyes, making it hard to see." +RestraintShadowHandEyesDesc2,"You have no choice but to struggle." RestraintShadowHandLegs,Shadow Hands (Legs) RestraintShadowHandLegsDesc,"They are wrapped around your legs!" @@ -3598,62 +4376,6 @@ RestraintShadowHandCrotch,Shadow Hands... RestraintShadowHandCrotchDesc,"They are holding your... uh..." RestraintShadowHandCrotchDesc2,"You have no choice but to struggle." -RestraintRopeSnakeArms,Wrist Rope -RestraintRopeSnakeArmsDesc,"A box tie keeping your arms secured behind your back." -RestraintRopeSnakeArmsDesc2,"The ropes squeeze you gently." -RestraintRopeSnakeCuffs,Rope Cuffs -RestraintRopeSnakeCuffsDesc,"A quick tie for apprehending prisoners." -RestraintRopeSnakeCuffsDesc2,"It's not very secure." -RestraintRopeSnakeCuffsAdv,Intricate Ropework -RestraintRopeSnakeCuffsAdvDesc,"A quick tie for apprehending prisoners, looped through buckles on the hand restraints." -RestraintRopeSnakeCuffsAdvDesc2,"It's not very secure." -RestraintRopeSnakeHogtie,Rope Hogtie -RestraintRopeSnakeHogtieDesc,"A very strict and tight hogtie, good for subduing unruly captives." -RestraintRopeSnakeHogtieDesc2,"It's very secure. You tug on the rope connecting your feet and struggle." -RestraintRopeSnakeTorso,Rope Belt -RestraintRopeSnakeTorsoDesc,"A harness acting as a handle to pull you around" -RestraintRopeSnakeTorsoDesc2,"The ropes squeeze you gently." -RestraintRopeSnakeHarness,Rope Harness -RestraintRopeSnakeHarnessDesc,"A harness that secures your other restraints and makes them tighter." -RestraintRopeSnakeHarnessDesc2,"The ropes squeeze you gently." -RestraintRopeSnakeCrotch,Crotch Rope -RestraintRopeSnakeCrotchDesc,"A tight rope impressing upon your most private areas..." -RestraintRopeSnakeCrotchDesc2,"The ropes squeeze you gently." -RestraintRopeSnakeArmsWrist,Wrist Rope -RestraintRopeSnakeArmsWristDesc,"A wrist and elbow tie keeping your arms secured behind your back." -RestraintRopeSnakeArmsWristDesc2,"The ropes squeeze you gently." -RestraintRopeSnakeLegs,Leg Ropes -RestraintRopeSnakeLegsDesc,"A tie that hobbles your legs together.." -RestraintRopeSnakeLegsDesc2,"The ropes squeeze you gently." -RestraintRopeSnakeFeet,Ankle Ropes -RestraintRopeSnakeFeetDesc,"A tie keeping your feet secured together." -RestraintRopeSnakeFeetDesc2,"The ropes squeeze you gently." - -RestraintCelestialRopeArms,Holy Wrist Rope -RestraintCelestialRopeArmsDesc,"A box tie keeping your arms secured behind your back." -RestraintCelestialRopeArmsDesc2,"They are aware of your movements..." -RestraintCelestialRopeCuffs,Holy Rope Cuffs -RestraintCelestialRopeCuffsDesc,"A quick tie for apprehending prisoners." -RestraintCelestialRopeCuffsDesc2,"They are aware of your movements..." -RestraintCelestialRopeCuffsAdv,Holy Ropework -RestraintCelestialRopeCuffsAdvDesc,"A quick tie for apprehending prisoners, looped through buckles and fasteners." -RestraintCelestialRopeCuffsAdvDesc2,"They are aware of your movements..." -RestraintCelestialRopeTorso,Holy Rope Harness -RestraintCelestialRopeTorsoDesc,"A harness acting as a handle to pull you around" -RestraintCelestialRopeTorsoDesc2,"They are aware of your movements..." -RestraintCelestialRopeCrotch,Holy Crotch Rope -RestraintCelestialRopeCrotchDesc,"A tight rope impressing upon your most private areas..." -RestraintCelestialRopeCrotchDesc2,"They are aware of your movements..." -RestraintCelestialRopeArmsWrist,Holy Wrist Rope -RestraintCelestialRopeArmsWristDesc,"A wrist and elbow tie keeping your arms secured behind your back." -RestraintCelestialRopeArmsWristDesc2,"They are aware of your movements..." -RestraintCelestialRopeLegs,Holy Leg Ropes -RestraintCelestialRopeLegsDesc,"A tie that hobbles your legs together.." -RestraintCelestialRopeLegsDesc2,"They are aware of your movements..." -RestraintCelestialRopeFeet,Holy Ankle Ropes -RestraintCelestialRopeFeetDesc,"A tie keeping your feet secured together." -RestraintCelestialRopeFeetDesc2,"They are aware of your movements..." - RestraintVinePlantArms,Wrist Vines RestraintVinePlantArmsDesc,"A box tie keeping your arms secured behind your back." RestraintVinePlantArmsDesc2,"The vines twitch as they try to wrap around tighter." @@ -3667,12 +4389,15 @@ RestraintVinePlantFeet,Ankle Vines RestraintVinePlantFeetDesc,"A tie keeping your feet secured together." RestraintVinePlantFeetDesc2,"The vines twitch as they try to wrap around tighter." -RestraintWolfCuffs,Quik-Bind Cuffs -RestraintWolfCuffsDesc,"A set of high-security cuffs that are both restrictive and quick to apply." -RestraintWolfCuffsDesc2,"It uses a twelve-disc detainer lock." +RestraintWolfCuffs,High-Security Cuffs +RestraintWolfCuffsDesc,"A set of irish-8-style cuffs that are both restrictive and quick to apply. Can be applied on vulnerable targets if targeted from inventory or hotbar." +RestraintWolfCuffsDesc2,"It uses a standard lock rather than a simple one." RestraintWolfArmbinder,Wolfbinder RestraintWolfArmbinderDesc,"A sophisticated training system used to keep wolfgirls from scratching their owners." RestraintWolfArmbinderDesc2,"Despite the harsh position, it is padded, breathable, and suitable for long term wear." +RestraintWolfStrongArmbinder,Wolf Queenbinder +RestraintWolfStrongArmbinderDesc,"This was made to be used during a coup attempt. Unfortunately, its creator ended up wearing it instead, after the coup's failure." +RestraintWolfStrongArmbinderDesc2,"Designed to hold the queen of wolves helpless for an indefinite period of time." RestraintWolfAnkleCuffs,Smart Training Cuffs RestraintWolfAnkleCuffsDesc,"Cuffs with a feature to punish the wearer if they act aggressively." RestraintWolfAnkleCuffsDesc2,"They are solid metal and will be hard to remove without the key." @@ -3682,15 +4407,21 @@ RestraintWolfAnkleCuffs2Desc2,"Looks like you got yourself in trouble." RestraintWolfHarness,Training Harness RestraintWolfHarnessDesc,"A harness that keeps a wolfgirl's suit together. It makes escaping more difficult." RestraintWolfHarnessDesc2,"While it is weatherproof and rugged, its straps are merely nylon." +RestraintWolfMittens,Training Mittens +RestraintWolfMittensDesc,"When wolfgirls won't keep those pesky claws in line, these will make sure she can't cause too much trouble." +RestraintWolfMittensDesc2,"Made from strong reinforced fabric, your claws won't do anything to these mittens." RestraintWolfBallGag,Training Gag RestraintWolfBallGagDesc,"A gag used to prevent wolfgirls from biting their owners." RestraintWolfBallGagDesc2,"It is reinforced with steel cables, so getting it off will be tricky." RestraintWolfCollar,Training Collar -RestraintWolfCollarDesc,"A collar used to keep unruly wolfgirls in check." -RestraintWolfCollarDesc2,"If it works on them, it sure as heck works on you." +RestraintWolfCollarDesc,"A collar with a decorative tag used to identify wolfgirls." +RestraintWolfCollarDesc2,"Also good for identifying people in general. What a great idea!" RestraintWolfLeash,Training Leash RestraintWolfLeashDesc,"A leash used for training pets." RestraintWolfLeashDesc2,"It is a steel cable with a weatherproof rubber coating, and a convenient handle." +RestraintObsidianLeash,Magical Leash +RestraintObsidianLeashDesc,"A leash made of magical energy, linked to a submissive's collar." +RestraintObsidianLeashDesc2,"Very difficult to break unless you have a strong magical blade." KinkyDungeonLinkWolfAnkleCuffs,"Your ankle cuffs snap together on their own!" KinkyDungeonUnLinkWolfAnkleCuffs2,"Your ankle cuffs detach!" @@ -3721,11 +4452,20 @@ RestraintAsylumLegCuffsDesc,"A pair of chained cuffs made of reinforced leather. RestraintAsylumLegCuffsDesc2,"They can be thrown from long distances." KinkyDungeonLinkAsylumLegCuffs,"The enemy attaches your ankle cuffs together!" +RestraintAsylumLegCuffs2,Thigh Chain +RestraintAsylumLegCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintAsylumLegCuffs2Desc2,"They are made of a steel alloy." +KinkyDungeonUnLinkAsylumLegCuffs2,"The leg cuff chain detaches!" + RestraintTransportJacket,Transport Jacket RestraintTransportJacketDesc,"This jacket goes over a straitjacket to keep the arms trapped." RestraintTransportJacketDesc2,"It makes it extraordinarily difficult to escape the jacket it covers." +RestraintAsylumLivingCollar,Living Asylum Collar +RestraintAsylumLivingCollarDesc,"A collar made of tough cowhide that adjusts itself to your neck." +RestraintAsylumLivingCollarDesc2,"It will occasionally cause asylum gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of asylum gear you have on you." + RestraintAsylumArmCuffs,Asylum Cuffs RestraintAsylumArmCuffsDesc,"A pair of leather cuffs that make it easy to restrain you." RestraintAsylumArmCuffsDesc2,"They're made of tough cowhide." @@ -3757,23 +4497,51 @@ RestraintComfyStraitjacketDesc,A straitjacket that is padded on the inside. RestraintComfyStraitjacketDesc2,It feels tight but is actually made of an ethereal material... RestraintLatexStraitjacket,Latex Jacket -RestraintLatexStraitjacketDesc,A tight jacket that holds your arms completely useless. -RestraintLatexStraitjacketDesc2,It has too much grip to struggle out of, but is made of a fragile material. +RestraintLatexStraitjacketDesc,A tight jacket that keeps your arms completely useless. +RestraintLatexStraitjacketDesc2,"It has too much grip to struggle out of, but is made of a fragile material." +RestraintLatexTransportJacket,Secure Latex Jacket +RestraintLatexTransportJacketDesc,This straitjacket has extra straps and buckles to make sure you won't be struggling out of it. +RestraintLatexTransportJacketDesc2,"It has too much grip to struggle out of, but is made of a fragile material." RestraintLatexArmbinder,Latex Armbinder -RestraintLatexArmbinderDesc,A tight armbinder that pins your arms tightly behind your back, enclosed completely. -RestraintLatexArmbinderDesc2,It has too much grip to struggle out of, but is made of a fragile material. +RestraintLatexArmbinderDesc,"A tight armbinder that pins your arms tightly behind your back, enclosed completely." +RestraintLatexArmbinderDesc2,"It has too much grip to struggle out of, but is made of a fragile material." +RestraintLatexBoxbinder,Latex Boxbinder +RestraintLatexBoxbinderDesc,"A secure but comfortable binder meant for long-term wear." +RestraintLatexBoxbinderDesc2,"It has too much grip to struggle out of, but is made of a fragile material." RestraintLatexLegbinder,Latex Legbinder RestraintLatexLegbinderDesc,A tight legbinder that keeps your legs together! -RestraintLatexLegbinderDesc2,It has too much grip to struggle out of, but is made of a fragile material. +RestraintLatexLegbinderDesc2,"It has too much grip to struggle out of, but is made of a fragile material." RestraintLatexBoots,Latex Boots RestraintLatexBootsDesc,A tight pair of boots that makes it difficult to walk! -RestraintLatexBootsDesc2,It has too much grip to struggle out of, but is made of a fragile material. +RestraintLatexBootsDesc2,"It has too much grip to struggle out of, but is made of a fragile material." RestraintLatexCorset,Heavy Latex Corset -RestraintLatexCorsetDesc,An excruciatingly tight corset that hugs your body, with straps securing your other restraints. -RestraintLatexCorsetDesc2,It has too much grip to struggle out of, but is made of a fragile material. +RestraintLatexCorsetDesc,"An excruciatingly tight corset that hugs your body, with straps securing your other restraints." +RestraintLatexCorsetDesc2,"It has too much grip to struggle out of, but is made of a fragile material." RestraintLatexCatsuit,Latex Catsuit RestraintLatexCatsuitDesc,"A skintight suit that's stretched on tight. It adheres to latex restraints making struggling more difficult." RestraintLatexCatsuitDesc2,"Blue latex is silky smooth, very stretchy, and very good at adhering to itself." +RestraintHeavyLatexCatsuit,Heavy Latex Catsuit +RestraintHeavyLatexCatsuitDesc,"A skintight suit that's stretched on tight and made of thick latex. It adheres to latex restraints making struggling more difficult." +RestraintHeavyLatexCatsuitDesc2,"Blue latex is silky smooth, very stretchy, and very good at adhering to itself. Its thickness makes it particularly resistant to cutting." +RestraintLatexMittens,Latex Mittens +RestraintLatexMittensDesc,"A pair of mittens keep your hands out of trouble. They adhere to latex restraints making struggling more difficult." +RestraintLatexMittensDesc2,"It has too much grip to struggle out of, but is made of a fragile material." + +RestraintLatexCube,Latex Cube +RestraintLatexCubeDesc,A gelatinous cube that engulfed you at some point in the past. +RestraintLatexCubeDesc2,It seems quite content staying where it is. +RestraintSlimeBubble,Slime Bubble +RestraintSlimeBubbleDesc,A squishy and sticky bubble that you can't get out of! +RestraintSlimeBubbleDesc2,It will slow you down severely but can be popped if you can reach a knife... +RestraintLatexSphere,Latex Sphere +RestraintLatexSphereDesc,A giant inflatable sphere that compresses you and leaves you helpless... +RestraintLatexSphereDesc2,You can't see out of it nor can you control its movement. If only you could puncture it! +RestraintBallSuit,Latex Ball Suit +RestraintBallSuitDesc,A giant inflatable sphere that leaves you rolling around... +RestraintBallSuitDesc2,"Your movement is severely hampered, limited to feeble wiggling..." +RestraintBubble,Bubble +RestraintBubbleDesc,A squishy bubble that you can't get out of! +RestraintBubbleDesc2,It will slow you down severely but can be popped if you can reach a knife... RestraintDragonArmbinder,Scale Boxtie Binder RestraintDragonArmbinderDesc,"A secure but comfortable binder meant for long-term wear by long-term prisoners of the Dragonhearts." @@ -3781,6 +4549,9 @@ RestraintDragonArmbinderDesc2,"It is made from durable dragonscale, but secured RestraintDragonStraps,Dragonscale Straps RestraintDragonStrapsDesc,"A set of straps buckling tightly around your body and secured at the wrists." RestraintDragonStrapsDesc2,"It's made from hard-to-cut dragonscale!!!" +RestraintDragonStrongStraps,Dragon Queen Straps +RestraintDragonStrongStrapsDesc,"A sturdy harness completely immobilizes your arms and torso. Made to be used on a queen of dragons." +RestraintDragonStrongStrapsDesc2,"It's made from reinforced dragonscale!!!" RestraintDragonLegCuffs,Scale Leg Cuffs RestraintDragonLegCuffsDesc,"A pair of chained cuffs made of dragonscale. They slow your stride." RestraintDragonLegCuffsDesc2,"It's made from hard-to-cut dragonscale!!!" @@ -3838,79 +4609,128 @@ RestraintMagneticAnkleCuffs2Desc2,"They won't budge! There's a button to release KinkyDungeonUnLinkMagneticAnkleCuffs2,"Your ankle cuffs detatch!" -RestraintLeatherAnkleCuffs,Leather Ankle Cuffs -RestraintLeatherAnkleCuffsDesc,"A pair of chained cuffs made of leather. They make it trickier to run away." -RestraintLeatherAnkleCuffsDesc2,"They're made of tough cowhide." -KinkyDungeonLinkLeatherAnkleCuffs,"The enemy attaches your ankle cuffs together!" -RestraintLeatherAnkleCuffs2,Cuffs Chain -RestraintLeatherAnkleCuffs2Desc,"A pair of chained cuffs made of leather. They make it trickier to run away." -RestraintLeatherAnkleCuffs2Desc2,"They're made of tough cowhide." -KinkyDungeonUnLinkLeatherAnkleCuffs2,"The ankle cuff chain detaches!" -RestraintLeatherLegCuffs,Leather Leg Cuffs -RestraintLeatherLegCuffsDesc,"A pair of chained cuffs made of leather. They make it trickier to run away." -RestraintLeatherLegCuffsDesc2,"They're made of tough cowhide." -KinkyDungeonLinkLeatherLegCuffs,"The enemy attaches your ankle cuffs together!" -RestraintLeatherArmCuffs,Leather Cuffs -RestraintLeatherArmCuffsDesc,"A pair of leather cuffs that make it easy to restrain you." -RestraintLeatherArmCuffsDesc2,"They're made of tough cowhide." -KinkyDungeonLinkLeatherArmCuffs,"The enemy attaches your wrist cuffs together!" +RestraintBlacksteelLivingCollar,Living Blacksteel Collar +RestraintBlacksteelLivingCollarDesc,"A collar made of a hardened steel alloy, chemically treated as to be stainless that adjusts itself to your neck." +RestraintBlacksteelLivingCollarDesc2,"It will occasionally cause blacksteel to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of blacksteel you have on you." + +RestraintBlacksteelArmCuffs,Blacksteel Cuffs +RestraintBlacksteelArmCuffsDesc,"A pair of cuffs that make it easy to restrain you." +RestraintBlacksteelArmCuffsDesc2,"They are made of a hardened steel alloy, chemically treated as to be stainless." +KinkyDungeonLinkBlacksteelArmCuffs,"The enemy attaches your wrist cuffs together!" + +RestraintBlacksteelArmCuffs2,Wrist Chain +RestraintBlacksteelArmCuffs2Desc,"A pair of cuffs keeping your arms behind your back." +RestraintBlacksteelArmCuffs2Desc2,"They are made of a hardened steel alloy, chemically treated as to be stainless." +KinkyDungeonUnLinkBlacksteelArmCuffs2,"Your cuffs detatch!" +KinkyDungeonLinkBlacksteelArmCuffs2,"The enemy attaches your elbow cuffs together!" + +RestraintBlacksteelArmCuffs3,Cuffs Chain +RestraintBlacksteelArmCuffs3Desc,"A full set of cuffs keeping your arms in a strict elbow tie!" +RestraintBlacksteelArmCuffs3Desc2,"They are made of a hardened steel alloy, chemically treated as to be stainless." +KinkyDungeonUnLinkBlacksteelArmCuffs3,"Your wrists detatch, leaving your elbows still bound!" + +RestraintBlacksteelArmCuffs4,Elbow Chain +RestraintBlacksteelArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!" +RestraintBlacksteelArmCuffs4Desc2,"They are made of a hardened steel alloy, chemically treated as to be stainless." +KinkyDungeonUnLinkBlacksteelArmCuffs4,"Your elbows detatch!" +KinkyDungeonLinkBlacksteelArmCuffs4,"The enemy attaches your wrist cuffs back together!" + +RestraintBlacksteelLegCuffs,Blacksteel Leg Cuffs +RestraintBlacksteelLegCuffsDesc,"A pair of cuffs on your legs." +RestraintBlacksteelLegCuffsDesc2,"They are made of a hardened steel alloy, chemically treated as to be stainless." +KinkyDungeonLinkBlacksteelLegCuffs,"The enemy attaches your leg cuffs together!" +RestraintBlacksteelLegCuffs2,Thigh Chain +RestraintBlacksteelLegCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintBlacksteelLegCuffs2Desc2,"They are made of a hardened steel alloy, chemically treated as to be stainless." +KinkyDungeonUnLinkBlacksteelLegCuffs2,"The leg cuff chain detaches!" + +RestraintBlacksteelAnkleCuffs,Blacksteel Ankle Cuffs +RestraintBlacksteelAnkleCuffsDesc,"A pair of cuffs on your ankles." +RestraintBlacksteelAnkleCuffsDesc2,"They are made of a hardened steel alloy, chemically treated as to be stainless." +KinkyDungeonLinkBlacksteelAnkleCuffs,"The enemy attaches your ankle cuffs together!" +RestraintBlacksteelAnkleCuffs2,Ankle Chain +RestraintBlacksteelAnkleCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintBlacksteelAnkleCuffs2Desc2,"They are made of a hardened steel alloy, chemically treated as to be stainless." +KinkyDungeonUnLinkBlacksteelAnkleCuffs2,"The ankle cuff chain detaches!" +KinkyDungeonLinkBlacksteelAnkleCuffs2,"Your ankle cuff chain is tightened and pulls your feet together!" +RestraintBlacksteelAnkleCuffs3,Short Ankle Chain +RestraintBlacksteelAnkleCuffs3Desc,"A pair of cuffs chaining your feet tightly together." +RestraintBlacksteelAnkleCuffs3Desc2,"They are made of a hardened steel alloy, chemically treated as to be stainless." +KinkyDungeonUnLinkBlacksteelAnkleCuffs3,"Your ankle cuff chain loosens!" + + -RestraintLeatherArmCuffs2,Lthr Wrist Chain -RestraintLeatherArmCuffs2Desc,"A pair of leather cuffs keeping your arms behind your back." -RestraintLeatherArmCuffs2Desc2,"They're made of tough cowhide." -KinkyDungeonUnLinkLeatherArmCuffs2,"Your cuffs detatch!" -KinkyDungeonLinkLeatherArmCuffs2,"The enemy attaches your elbow cuffs together!" -RestraintLeatherArmCuffs3,Lthr Wrist Chain -RestraintLeatherArmCuffs3Desc,"A full set of leather cuffs keeping your arms in a strict elbow tie!" -RestraintLeatherArmCuffs3Desc2,"They're made of tough cowhide." -KinkyDungeonUnLinkLeatherArmCuffs3,"Your wrists detatch, leaving your elbows still bound!" -RestraintLeatherArmCuffs4,Lthr Elbow Chain -RestraintLeatherArmCuffs4Desc,"A pair of leather cuffs keeping your elbows locked together!." -RestraintLeatherArmCuffs4Desc2,"They're made of tough cowhide." -KinkyDungeonUnLinkLeatherArmCuffs4,"Your elbows detatch!" -KinkyDungeonLinkLeatherArmCuffs4,"The enemy attaches your wrist cuffs back together!" RestraintScaleArmCuffs,Dragonscale Cuffs RestraintScaleArmCuffsDesc,"A pair of cuffs that make it easy to restrain you." -RestraintScaleArmCuffsDesc2,"They're made of dragonscale." +RestraintScaleArmCuffsDesc2,"They are made from leather cured from the hide of dragons." KinkyDungeonLinkScaleArmCuffs,"The enemy attaches your wrist cuffs together!" -RestraintScaleArmCuffs2,Scale Wrist Chain +RestraintScaleArmCuffs2,Wrist Chain RestraintScaleArmCuffs2Desc,"A pair of cuffs keeping your arms behind your back." -RestraintScaleArmCuffs2Desc2,"They're made of dragonscale." +RestraintScaleArmCuffs2Desc2,"They are made from leather cured from the hide of dragons." KinkyDungeonUnLinkScaleArmCuffs2,"Your cuffs detatch!" KinkyDungeonLinkScaleArmCuffs2,"The enemy attaches your elbow cuffs together!" -RestraintScaleArmCuffs3,Scale Wrist Chain +RestraintScaleArmCuffs3,Cuffs Chain RestraintScaleArmCuffs3Desc,"A full set of cuffs keeping your arms in a strict elbow tie!" -RestraintScaleArmCuffs3Desc2,"They're made of dragonscale." +RestraintScaleArmCuffs3Desc2,"They are made from leather cured from the hide of dragons." KinkyDungeonUnLinkScaleArmCuffs3,"Your wrists detatch, leaving your elbows still bound!" -RestraintScaleArmCuffs4,Scale Elbow Chain -RestraintScaleArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!." -RestraintScaleArmCuffs4Desc2,"They're made of dragonscale." +RestraintScaleArmCuffs4,Elbow Chain +RestraintScaleArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!" +RestraintScaleArmCuffs4Desc2,"They are made from leather cured from the hide of dragons." KinkyDungeonUnLinkScaleArmCuffs4,"Your elbows detatch!" KinkyDungeonLinkScaleArmCuffs4,"The enemy attaches your wrist cuffs back together!" +RestraintScaleLegCuffs,Dragonscale Leg Cuffs +RestraintScaleLegCuffsDesc,"A pair of cuffs on your legs." +RestraintScaleLegCuffsDesc2,"They are made from leather cured from the hide of dragons." +KinkyDungeonLinkScaleLegCuffs,"The enemy attaches your leg cuffs together!" +RestraintScaleLegCuffs2,Thigh Chain +RestraintScaleLegCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintScaleLegCuffs2Desc2,"They are made from leather cured from the hide of dragons." +KinkyDungeonUnLinkScaleLegCuffs2,"The leg cuff chain detaches!" + +RestraintScaleAnkleCuffs,Dragonscale Ankle Cuffs +RestraintScaleAnkleCuffsDesc,"A pair of cuffs on your ankles." +RestraintScaleAnkleCuffsDesc2,"They are made from leather cured from the hide of dragons." +KinkyDungeonLinkScaleAnkleCuffs,"The enemy attaches your ankle cuffs together!" +RestraintScaleAnkleCuffs2,Ankle Chain +RestraintScaleAnkleCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintScaleAnkleCuffs2Desc2,"They are made from leather cured from the hide of dragons." +KinkyDungeonUnLinkScaleAnkleCuffs2,"The ankle cuff chain detaches!" +KinkyDungeonLinkScaleAnkleCuffs2,"Your ankle cuff chain is tightened and pulls your feet together!" +RestraintScaleAnkleCuffs3,Short Ankle Chain +RestraintScaleAnkleCuffs3Desc,"A pair of cuffs chaining your feet tightly together." +RestraintScaleAnkleCuffs3Desc2,"They are made from leather cured from the hide of dragons." +KinkyDungeonUnLinkScaleAnkleCuffs3,"Your ankle cuff chain loosens!" + + + + RestraintMaidJacket,Maid Jacket RestraintMaidJacketDesc,"A bolero jacket keeping your arms pinned snugly. You can't even move them." RestraintMaidJacketDesc2,"There is no hope of struggling out. Better hope you can cut it..." +RestraintMaidTransportJacket,Maid Punishment Jacket +RestraintMaidTransportJacketDesc,"A bolero straitjacket made for unruly maids. It is extra secure and locked tightly." +RestraintMaidTransportJacketDesc2,"There is no hope of struggling out. Better get back to work..." RestraintMaidDress,Devious Maid Costume RestraintMaidDressDesc,"A devious maid outfit that forces the arms into an elbows-touching position." RestraintMaidDressDesc2,"Makes sure you focus on your work and not fooling around." RestraintMaidBelt,Reinforced Leather Belt RestraintMaidBeltDesc,"A leather belt used to keep your legs hobbled." RestraintMaidBeltDesc2,"It's made of a very tough reinforced leather. It will take some time to cut." -RestraintMaidAnkleCuffs,Steel Cuffs +RestraintMaidAnkleCuffs,Maid Cuffs RestraintMaidAnkleCuffsDesc,"A pair of steel cuffs used by the Maidforce." RestraintMaidAnkleCuffsDesc2,"They are made of solid steel." KinkyDungeonLinkMaidAnkleCuffs,"The enemy attaches your ankle cuffs together!" -RestraintMaidAnkleCuffs2,Linked Steel Cuffs +RestraintMaidAnkleCuffs2,Maid Cuff Link RestraintMaidAnkleCuffs2Desc,"A pair of steel cuffs used by the Maidforce." RestraintMaidAnkleCuffs2Desc2,"They are made of solid steel." KinkyDungeonUnLinkMaidAnkleCuffs2,"The ankle cuff chain detaches!" @@ -3918,14 +4738,59 @@ KinkyDungeonUnLinkMaidAnkleCuffs2,"The ankle cuff chain detaches!" RestraintMaidCollar,Maid Collar RestraintMaidCollarDesc,"A collar for operatives of the Maidforce, a group of covert saboteurs." RestraintMaidCollarDesc2,"It's reinforced with metal and guarded with an expert-level lock." -RestraintMaidGag,Plug Gag +RestraintMaidGag,Maid Gag RestraintMaidGagDesc,"A gag with a long, mouth-filling plug that muffles speech completely." RestraintMaidGagDesc2,"It's made of a very tough reinforced leather. It will take some time to cut." +RestraintMaidMuzzle,Maid Security Gag +RestraintMaidMuzzleDesc,"A muzzle with a long, mouth-filling plug that muffles speech completely." +RestraintMaidMuzzleDesc2,"Reinforced and secured with a disc lock to ensure unruly maids don't skip their duty." RestraintKiguMask,Suspicious Mask -LootChestKiguMask,"You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it." RestraintKiguMaskDesc2,"A well-fitted mask, covering your entire head neatly and locking in place." -RestraintKiguMaskDesc,"It has eyeholes for you to see out of, but blocks access to the face." +RestraintKiguMaskDesc,"It has eyeholes for you to somewhat see out of, but blocks access to the face." + +RestraintKiguMaskSmile,Happy Face +RestraintKiguMaskSmileDesc2,"Just put on a happy face and enjoy it." +RestraintKiguMaskSmileDesc,"It has eyeholes for you to somewhat see out of, but blocks access to the face." + +RestraintLeatherHood,Sensory Hood +RestraintLeatherHoodDesc2,"A well-fitted hood that covers your head and muffles sounds." +RestraintLeatherHoodDesc,"No eyeholes. Integrated blindfold and gag. Total darkness." + +RestraintLeatherMask,Sensory Mask +RestraintLeatherMaskDesc2,"A well-fitted mask that covers your face and muffles sounds." +RestraintLeatherMaskDesc,"No eyeholes. Integrated blindfold and gag. Total darkness." + +RestraintShadowLatexHeels,Shadow Heels +RestraintShadowLatexHeelsDesc,"A set of impractical heels that clasp around your ankles. They make it hard to walk." +RestraintShadowLatexHeelsDesc2,"The material is stronger than leather, and flexes to make struggling difficult." +RestraintShadowLatexStraitjacket,Shadow Jacket +RestraintShadowLatexStraitjacketDesc,"A tight straitjacket made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament." +RestraintShadowLatexStraitjacketDesc2,"Its grip encases you tightly, but the material is weaker than most metals." +RestraintShadowLatexStrongJacket,Black Hole Jacket +RestraintShadowLatexStrongJacketDesc,"Like a black hole, anything that is caught in this jacket has no chance to escape its grasp." +RestraintShadowLatexStrongJacketDesc2,"Its grip encases you tightly, but the material is weaker than most metals." +RestraintShadowLatexArmbinder,Shadow Armbinder +RestraintShadowLatexArmbinderDesc,"A tight armbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament." +RestraintShadowLatexArmbinderDesc2,"Its grip encases you tightly, but the material is weaker than most metals." +RestraintShadowLatexStrongArmbinder,Black Hole Armbinder +RestraintShadowLatexStrongArmbinderDesc,"Like a black hole, anything that is caught in this armbinder has no chance to escape its grasp." +RestraintShadowLatexStrongArmbinderDesc2,"Its grip encases you tightly, but the material is weaker than most metals." +RestraintShadowLatexBoxbinder,Shadow Boxbinder +RestraintShadowLatexBoxbinderDesc,"A tight boxbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament." +RestraintShadowLatexBoxbinderDesc2,"Its grip encases you tightly, but the material is weaker than most metals." +RestraintShadowLatexStrongBoxbinder,Black Hole Boxbinder +RestraintShadowLatexStrongBoxbinderDesc,"Like a black hole, anything that is caught in this boxbinder has no chance to escape its grasp." +RestraintShadowLatexStrongBoxbinderDesc2,"Its grip encases you tightly, but the material is weaker than most metals." +RestraintShadowLatexLegbinder,Shadow Legbinder +RestraintShadowLatexLegbinderDesc,"A tight legbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament." +RestraintShadowLatexLegbinderDesc2,"Its grip encases you tightly, but the material is weaker than most metals." +RestraintShadowLatexPetsuit,Shadow Latex Petsuit +RestraintShadowLatexPetsuitDesc,"A tight petsuit made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament." +RestraintShadowLatexPetsuitDesc2,"Its grip encases you tightly, but the material is weaker than most metals." +RestraintObsidianYoke,Obsidian Yoke +RestraintObsidianYokeDesc,"A yoke made from shining obsidian, stars glittering in the darkness. It pins your arms uselessly at your sides." +RestraintObsidianYokeDesc2,"It's made of a dark, glistening volcanic metal." RestraintObsidianGag,Obsidian Muzzle RestraintObsidianGagDesc,"A muzzle made from segmented metal pieces, fitting securely over your face." @@ -3935,77 +4800,160 @@ RestraintObsidianCollar,Obsidian Collar RestraintObsidianCollarDesc,"A collar made from a warm, shining alloy." RestraintObsidianCollarDesc2,"It's made of a dark, glistening volcanic metal." + +RestraintObsidianLivingCollar,Living Obsidian Collar +RestraintObsidianLivingCollarDesc,"A collar made of a dark, shiny metal that adjusts itself to your neck. You can't help but hear whispering since it is so tight." +RestraintObsidianLivingCollarDesc2,"It will occasionally cause obsidian to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of obsidian you have on you." + RestraintObsidianArmCuffs,Obsidian Cuffs RestraintObsidianArmCuffsDesc,"A pair of cuffs that make it easy to restrain you." -RestraintObsidianArmCuffsDesc2,"It's made of a dark, glistening volcanic metal." +RestraintObsidianArmCuffsDesc2,"It's made of a dark, shiny metal. If you hold it close you hear whispering." KinkyDungeonLinkObsidianArmCuffs,"The enemy attaches your wrist cuffs together!" -RestraintObsidianArmCuffs2,Obs. Wrist Chain +RestraintObsidianArmCuffs2,Wrist Chain RestraintObsidianArmCuffs2Desc,"A pair of cuffs keeping your arms behind your back." -RestraintObsidianArmCuffs2Desc2,"It's made of a dark, glistening volcanic metal." +RestraintObsidianArmCuffs2Desc2,"It's made of a dark, shiny metal. If you hold it close you hear whispering." KinkyDungeonUnLinkObsidianArmCuffs2,"Your cuffs detatch!" KinkyDungeonLinkObsidianArmCuffs2,"The enemy attaches your elbow cuffs together!" -RestraintObsidianArmCuffs3,Obs. Wrist Chain +RestraintObsidianArmCuffs3,Cuffs Chain RestraintObsidianArmCuffs3Desc,"A full set of cuffs keeping your arms in a strict elbow tie!" -RestraintObsidianArmCuffs3Desc2,"It's made of a dark, glistening volcanic metal." +RestraintObsidianArmCuffs3Desc2,"It's made of a dark, shiny metal. If you hold it close you hear whispering." KinkyDungeonUnLinkObsidianArmCuffs3,"Your wrists detatch, leaving your elbows still bound!" -RestraintObsidianArmCuffs4,Obs. Elbow Chain -RestraintObsidianArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!." -RestraintObsidianArmCuffs4Desc2,"It's made of a dark, glistening volcanic metal." +RestraintObsidianArmCuffs4,Elbow Chain +RestraintObsidianArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!" +RestraintObsidianArmCuffs4Desc2,"It's made of a dark, shiny metal. If you hold it close you hear whispering." KinkyDungeonUnLinkObsidianArmCuffs4,"Your elbows detatch!" KinkyDungeonLinkObsidianArmCuffs4,"The enemy attaches your wrist cuffs back together!" RestraintObsidianLegCuffs,Obsidian Leg Cuffs -RestraintObsidianLegCuffsDesc,"A pair of cuffs chaining your legs together." -RestraintObsidianLegCuffsDesc2,"It's made of a dark, glistening volcanic metal." +RestraintObsidianLegCuffsDesc,"A pair of cuffs on your legs." +RestraintObsidianLegCuffsDesc2,"It's made of a dark, shiny metal. If you hold it close you hear whispering." +KinkyDungeonLinkObsidianLegCuffs,"The enemy attaches your leg cuffs together!" +RestraintObsidianLegCuffs2,Thigh Chain +RestraintObsidianLegCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintObsidianLegCuffs2Desc2,"It's made of a dark, shiny metal. If you hold it close you hear whispering." +KinkyDungeonUnLinkObsidianLegCuffs2,"The leg cuff chain detaches!" + RestraintObsidianAnkleCuffs,Obsidian Ankle Cuffs -RestraintObsidianAnkleCuffsDesc,"A pair of cuffs chaining your legs together." -RestraintObsidianAnkleCuffsDesc2,"It's made of a dark, glistening volcanic metal." +RestraintObsidianAnkleCuffsDesc,"A pair of cuffs on your ankles." +RestraintObsidianAnkleCuffsDesc2,"It's made of a dark, shiny metal. If you hold it close you hear whispering." KinkyDungeonLinkObsidianAnkleCuffs,"The enemy attaches your ankle cuffs together!" -RestraintObsidianAnkleCuffs2,Cuffs Chain +RestraintObsidianAnkleCuffs2,Ankle Chain RestraintObsidianAnkleCuffs2Desc,"A pair of cuffs chaining your legs together." -RestraintObsidianAnkleCuffs2Desc2,"It's made of a dark, glistening volcanic metal." +RestraintObsidianAnkleCuffs2Desc2,"It's made of a dark, shiny metal. If you hold it close you hear whispering." KinkyDungeonUnLinkObsidianAnkleCuffs2,"The ankle cuff chain detaches!" +KinkyDungeonLinkObsidianAnkleCuffs2,"Your ankle cuff chain is tightened and pulls your feet together!" +RestraintObsidianAnkleCuffs3,Short Ankle Chain +RestraintObsidianAnkleCuffs3Desc,"A pair of cuffs chaining your feet tightly together." +RestraintObsidianAnkleCuffs3Desc2,"It's made of a dark, shiny metal. If you hold it close you hear whispering." +KinkyDungeonUnLinkObsidianAnkleCuffs3,"Your ankle cuff chain loosens!" +RestraintCrystalLivingCollar,Living Crystal Collar +RestraintCrystalLivingCollarDesc,"A collar made of a glowing, brittle material that adjusts itself to your neck. You feel your energy flowing into it..." +RestraintCrystalLivingCollarDesc2,"It will occasionally cause crystal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of crystal you have on you." + RestraintCrystalArmCuffs,Crystal Cuffs RestraintCrystalArmCuffsDesc,"A pair of cuffs that make it easy to restrain you." -RestraintCrystalArmCuffsDesc2,"It's made of a glowing, brittle material." +RestraintCrystalArmCuffsDesc2,"It's made of a glowing, brittle material. You feel your energy flowing into it..." KinkyDungeonLinkCrystalArmCuffs,"The enemy attaches your wrist cuffs together!" -RestraintCrystalArmCuffs2,Crystal Wrist Chain +RestraintCrystalArmCuffs2,Wrist Chain RestraintCrystalArmCuffs2Desc,"A pair of cuffs keeping your arms behind your back." -RestraintCrystalArmCuffs2Desc2,"It's made of a glowing, brittle material." +RestraintCrystalArmCuffs2Desc2,"It's made of a glowing, brittle material. You feel your energy flowing into it..." KinkyDungeonUnLinkCrystalArmCuffs2,"Your cuffs detatch!" KinkyDungeonLinkCrystalArmCuffs2,"The enemy attaches your elbow cuffs together!" -RestraintCrystalArmCuffs3,Crystal Wrist Chain +RestraintCrystalArmCuffs3,Cuffs Chain RestraintCrystalArmCuffs3Desc,"A full set of cuffs keeping your arms in a strict elbow tie!" -RestraintCrystalArmCuffs3Desc2,"It's made of a glowing, brittle material." +RestraintCrystalArmCuffs3Desc2,"It's made of a glowing, brittle material. You feel your energy flowing into it..." KinkyDungeonUnLinkCrystalArmCuffs3,"Your wrists detatch, leaving your elbows still bound!" -RestraintCrystalArmCuffs4,Crystal Elbow Chain -RestraintCrystalArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!." -RestraintCrystalArmCuffs4Desc2,"It's made of a glowing, brittle material." +RestraintCrystalArmCuffs4,Elbow Chain +RestraintCrystalArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!" +RestraintCrystalArmCuffs4Desc2,"It's made of a glowing, brittle material. You feel your energy flowing into it..." KinkyDungeonUnLinkCrystalArmCuffs4,"Your elbows detatch!" KinkyDungeonLinkCrystalArmCuffs4,"The enemy attaches your wrist cuffs back together!" RestraintCrystalLegCuffs,Crystal Leg Cuffs -RestraintCrystalLegCuffsDesc,"A pair of cuffs chaining your legs together." -RestraintCrystalLegCuffsDesc2,"It's made of a glowing, brittle material." +RestraintCrystalLegCuffsDesc,"A pair of cuffs on your legs." +RestraintCrystalLegCuffsDesc2,"It's made of a glowing, brittle material. You feel your energy flowing into it..." +KinkyDungeonLinkCrystalLegCuffs,"The enemy attaches your leg cuffs together!" +RestraintCrystalLegCuffs2,Thigh Chain +RestraintCrystalLegCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintCrystalLegCuffs2Desc2,"It's made of a glowing, brittle material. You feel your energy flowing into it..." +KinkyDungeonUnLinkCrystalLegCuffs2,"The leg cuff chain detaches!" + RestraintCrystalAnkleCuffs,Crystal Ankle Cuffs -RestraintCrystalAnkleCuffsDesc,"A pair of cuffs chaining your legs together." -RestraintCrystalAnkleCuffsDesc2,"It's made of a glowing, brittle material." +RestraintCrystalAnkleCuffsDesc,"A pair of cuffs on your ankles." +RestraintCrystalAnkleCuffsDesc2,"It's made of a glowing, brittle material. You feel your energy flowing into it..." KinkyDungeonLinkCrystalAnkleCuffs,"The enemy attaches your ankle cuffs together!" -RestraintCrystalAnkleCuffs2,Cuffs Chain +RestraintCrystalAnkleCuffs2,Ankle Chain RestraintCrystalAnkleCuffs2Desc,"A pair of cuffs chaining your legs together." -RestraintCrystalAnkleCuffs2Desc2,"It's made of a glowing, brittle material." +RestraintCrystalAnkleCuffs2Desc2,"It's made of a glowing, brittle material. You feel your energy flowing into it..." KinkyDungeonUnLinkCrystalAnkleCuffs2,"The ankle cuff chain detaches!" - - - +KinkyDungeonLinkCrystalAnkleCuffs2,"Your ankle cuff chain is tightened and pulls your feet together!" +RestraintCrystalAnkleCuffs3,Short Ankle Chain +RestraintCrystalAnkleCuffs3Desc,"A pair of cuffs chaining your feet tightly together." +RestraintCrystalAnkleCuffs3Desc2,"It's made of a glowing, brittle material. You feel your energy flowing into it..." +KinkyDungeonUnLinkCrystalAnkleCuffs3,"Your ankle cuff chain loosens!" + + +RestraintIceLivingCollar,Living Ice Collar +RestraintIceLivingCollarDesc,"A collar made of enchanted ice that adjusts itself to your neck. It won't melt on their own, and the ice chills you to the bone..." +RestraintIceLivingCollarDesc2,"It will occasionally cause ice to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ice you have on you." + +RestraintIceArmCuffs,Ice Cuffs +RestraintIceArmCuffsDesc,"A pair of cuffs that make it easy to restrain you." +RestraintIceArmCuffsDesc2,"They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone..." +KinkyDungeonLinkIceArmCuffs,"The enemy attaches your wrist cuffs together!" + +RestraintIceArmCuffs2,Wrist Chain +RestraintIceArmCuffs2Desc,"A pair of cuffs keeping your arms behind your back." +RestraintIceArmCuffs2Desc2,"They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone..." +KinkyDungeonUnLinkIceArmCuffs2,"Your cuffs detatch!" +KinkyDungeonLinkIceArmCuffs2,"The enemy attaches your elbow cuffs together!" + +RestraintIceArmCuffs3,Cuffs Chain +RestraintIceArmCuffs3Desc,"A full set of cuffs keeping your arms in a strict elbow tie!" +RestraintIceArmCuffs3Desc2,"They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone..." +KinkyDungeonUnLinkIceArmCuffs3,"Your wrists detatch, leaving your elbows still bound!" + +RestraintIceArmCuffs4,Elbow Chain +RestraintIceArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!." +RestraintIceArmCuffs4Desc2,"They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone..." +KinkyDungeonUnLinkIceArmCuffs4,"Your elbows detatch!" +KinkyDungeonLinkIceArmCuffs4,"The enemy attaches your wrist cuffs back together!" + +RestraintIceLegCuffs,Ice Leg Cuffs +RestraintIceLegCuffsDesc,"A pair of cuffs on your legs." +RestraintIceLegCuffsDesc2,"They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone..." +KinkyDungeonLinkIceLegCuffs,"The enemy attaches your leg cuffs together!" +RestraintIceLegCuffs2,Thigh Chain +RestraintIceLegCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintIceLegCuffs2Desc2,"They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone..." +KinkyDungeonUnLinkIceLegCuffs2,"The leg cuff chain detaches!" + +RestraintIceAnkleCuffs,Ice Ankle Cuffs +RestraintIceAnkleCuffsDesc,"A pair of cuffs on your ankles." +RestraintIceAnkleCuffsDesc2,"They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone..." +KinkyDungeonLinkIceAnkleCuffs,"The enemy attaches your ankle cuffs together!" +RestraintIceAnkleCuffs2,Ankle Chain +RestraintIceAnkleCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintIceAnkleCuffs2Desc2,"They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone..." +KinkyDungeonUnLinkIceAnkleCuffs2,"The ankle cuff chain detaches!" +KinkyDungeonLinkIceAnkleCuffs2,"Your ankle cuff chain is tightened and pulls your feet together!" +RestraintIceAnkleCuffs3,Short Ankle Chain +RestraintIceAnkleCuffs3Desc,"A pair of cuffs chaining your feet tightly together." +RestraintIceAnkleCuffs3Desc2,"They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone..." +KinkyDungeonUnLinkIceAnkleCuffs3,"Your ankle cuff chain loosens!" + + +RestraintBanditLivingCollar,Living Slave Collar +RestraintBanditLivingCollarDesc,"A collar made of a gold-tinted metal with a magical enchantment that adjusts itself to your neck." +RestraintBanditLivingCollarDesc2,"It will occasionally cause slave gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slave gear you have on you." RestraintBanditArmCuffs,Slave Cuffs RestraintBanditArmCuffsDesc,"A pair of cuffs that make it easy to restrain you." @@ -4024,13 +4972,13 @@ RestraintBanditArmCuffs3Desc2,"It's made of a gold-tinted metal with a magical e KinkyDungeonUnLinkBanditArmCuffs3,"Your wrists detatch, leaving your elbows still bound!" RestraintBanditArmCuffs4,Slave Elbow Chain -RestraintBanditArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!." +RestraintBanditArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!" RestraintBanditArmCuffs4Desc2,"It's made of a gold-tinted metal with a magical enchantment." KinkyDungeonUnLinkBanditArmCuffs4,"Your elbows detatch!" KinkyDungeonLinkBanditArmCuffs4,"The enemy attaches your wrist cuffs back together!" RestraintBanditLegCuffs,Slave Leg Cuffs -RestraintBanditLegCuffsDesc,"A pair of cuffs chaining your legs together." +RestraintBanditLegCuffsDesc,"A pair of cuffs on your ankles." RestraintBanditLegCuffsDesc2,"It's made of a gold-tinted metal with a magical enchantment." RestraintBanditAnkleCuffs,Slave Ankle Cuffs RestraintBanditAnkleCuffsDesc,"A pair of cuffs chaining your legs together." @@ -4070,6 +5018,10 @@ RestraintNylonCableHarness,Nylon Cables (Harness) RestraintNylonCableHarnessDesc,"Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges." RestraintNylonCableHarnessDesc2,"They are wrapped methodically around your body!" +RestraintRibbonRaw,Magic Ribbons +RestraintRibbonRawDesc,"Magically sealed ribbons to teach intruders a lesson." +RestraintRibbonRawDesc2,"The magic is powerful enough to ward off most blades, creating a true predicament for one who is trapped by these." + RestraintRibbonArms,Magic Ribbons (Arms) RestraintRibbonArmsDesc,"Those ribbons will hold you tight~" RestraintRibbonArmsDesc2,"I've put a magic seal in that bow-knot to keep it secure!" @@ -4091,6 +5043,10 @@ RestraintRibbonHandsDesc2,"They are wrapped tightly around your hands with a bow RestraintRibbonMouth,Magic Ribbons (Gag) RestraintRibbonMouthDesc,"Those ribbons will hold you tight~" RestraintRibbonMouthDesc2,"They are wrapped tightly around your mouth with a bow knot!" +RestraintRibbonCollar,Living Ribbon Collar +RestraintRibbonCollarDesc,"This collar is designed to make sure its wearer does not escape the ribbons." +RestraintRibbonCollarDesc2,"It will occasionally cause ribbons to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ribbons you have on you." + RestraintIceArms,Ice (Arms) RestraintIceArmsDesc,"Frigid restraints made out of ice." @@ -4098,6 +5054,9 @@ RestraintIceArmsDesc2,"There's no way to remove it without breaking it off." RestraintIceGag,Ice (Mouth) RestraintIceGagDesc,"Frigid restraints made out of ice." RestraintIceGagDesc2,"There's no way to remove it without breaking it off." +RestraintIceBallGag,Ice Ball Gag (Mouth) +RestraintIceBallGagDesc,"A cold sphere of magic ice lodged firmly in your mouth." +RestraintIceBallGagDesc2,"The work of a kinky elemental. It will melt! Eventually." RestraintIceHarness,Ice (Body) RestraintIceHarnessDesc,"Frigid restraints made out of ice." RestraintIceHarnessDesc2,"There's no way to remove it without breaking it off." @@ -4136,28 +5095,51 @@ RestraintSlimeMouthDesc2,"It is an organic material that reforms around every cu RestraintSlimeHead,Slime (Head) RestraintSlimeHeadDesc,"Sticky slime that adheres to your body. It reacts negatively to mana..." RestraintSlimeHeadDesc2,"It is an organic material that reforms around every cut you make!" +RestraintSlimeCollar,Living Slime Collar +RestraintSlimeCollarDesc,"This collar is designed to make sure its wearer does not escape their slime." +RestraintSlimeCollarDesc2,"It will occasionally cause slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slime you have on you." + + +RestraintHardSlimeRaw,Rubber +RestraintHardSlimeRawDesc,"Made from hardened slime." +RestraintHardSlimeRawDesc2,"The classic smooth, shiny material for full encasement." + +RestraintSlimeRaw,Slime +RestraintSlimeRawDesc,"A semi-organic substance of alchemical origin." +RestraintSlimeRawDesc2,"It has a mind of its own, and tends to spread if not properly contained." + +RestraintHardProtoSlimeRaw,Proto Rubber +RestraintHardProtoSlimeRawDesc,"Made from hardened proto rubber." +RestraintHardProtoSlimeRawDesc2,"A hardened form of the essence of latex." + +RestraintProtoSlimeRaw,Proto Slime +RestraintProtoSlimeRawDesc,"Alchemical rubber in its simplest form. Amorphous." +RestraintProtoSlimeRawDesc2,"Often forms strange growths, seeking damsels to encase." RestraintHardSlimeBoots,Rubber (Feet) -RestraintHardSlimeBootsDesc,"Sticky rubber that has fused itself into a shell around your body." +RestraintHardSlimeBootsDesc,"Sticky rubber that has fused itself into a skintight layer." RestraintHardSlimeBootsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardSlimeFeet,Rubber (Ankles) -RestraintHardSlimeFeetDesc,"Sticky rubber that has fused itself into a shell around your body." +RestraintHardSlimeFeetDesc,"Sticky rubber that has fused itself into a skintight layer." RestraintHardSlimeFeetDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardSlimeLegs,Rubber (Legs) -RestraintHardSlimeLegsDesc,"Sticky rubber that has fused itself into a shell around your body." +RestraintHardSlimeLegsDesc,"Sticky rubber that has fused itself into a skintight layer." RestraintHardSlimeLegsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardSlimeArms,Rubber (Arms) -RestraintHardSlimeArmsDesc,"Sticky rubber that has fused itself into a shell around your body." +RestraintHardSlimeArmsDesc,"Sticky rubber that has fused itself into a skintight layer." RestraintHardSlimeArmsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardSlimeHands,Rubber (Hands) -RestraintHardSlimeHandsDesc,"Sticky rubber that has fused itself into a shell around your body." +RestraintHardSlimeHandsDesc,"Sticky rubber that has fused itself into a skintight layer." RestraintHardSlimeHandsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardSlimeMouth,Rubber (Mouth) -RestraintHardSlimeMouthDesc,"Sticky rubber that has fused itself into a shell around your body." +RestraintHardSlimeMouthDesc,"Sticky rubber that has fused itself into a skintight layer." RestraintHardSlimeMouthDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardSlimeHead,Rubber (Head) -RestraintHardSlimeHeadDesc,"Sticky rubber that has fused itself into a shell around your body." +RestraintHardSlimeHeadDesc,"Sticky rubber that has fused itself into a skintight layer." RestraintHardSlimeHeadDesc2,"There's no struggling out now, but since it's solid it may be cuttable." +RestraintHardSlimeCollar,Living Rubber Collar +RestraintHardSlimeCollarDesc,"This collar is designed to make sure its wearer does not escape their rubber." +RestraintHardSlimeCollarDesc2,"It will occasionally cause rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you." @@ -4183,30 +5165,39 @@ RestraintProtoSlimeMouthDesc2,"It is an organic material that reforms around eve RestraintProtoSlimeHead,Proto-Slime (Head) RestraintProtoSlimeHeadDesc,"It seems to be a precursor to the slimes everyone is familiar with?" RestraintProtoSlimeHeadDesc2,"It is an organic material that reforms around every cut you make!" +RestraintProtoSlimeCollar,Living Proto-Slime Collar +RestraintProtoSlimeCollarDesc,"This collar is designed to make sure its wearer does not escape the slime." +RestraintProtoSlimeCollarDesc2,"It will occasionally cause proto-slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-slime you have on you." + RestraintHardProtoSlimeBoots,Proto-Rubber (Feet) -RestraintHardProtoSlimeBootsDesc,"Sticky slime that has fused itself into a shell around your body." +RestraintHardProtoSlimeBootsDesc,"Sticky slime that has fused itself into a skintight layer." RestraintHardProtoSlimeBootsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardProtoSlimeFeet,Proto-Rubber (Ankles) -RestraintHardProtoSlimeFeetDesc,"Sticky slime that has fused itself into a shell around your body." +RestraintHardProtoSlimeFeetDesc,"Sticky slime that has fused itself into a skintight layer." RestraintHardProtoSlimeFeetDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardProtoSlimeLegs,Proto-Rubber (Legs) -RestraintHardProtoSlimeLegsDesc,"Sticky slime that has fused itself into a shell around your body." +RestraintHardProtoSlimeLegsDesc,"Sticky slime that has fused itself into a skintight layer." RestraintHardProtoSlimeLegsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardProtoSlimeArms,Proto-Rubber (Arms) -RestraintHardProtoSlimeArmsDesc,"Sticky slime that has fused itself into a shell around your body." +RestraintHardProtoSlimeArmsDesc,"Sticky slime that has fused itself into a skintight layer." RestraintHardProtoSlimeArmsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardProtoSlimeHands,Proto-Rubber (Hands) -RestraintHardProtoSlimeHandsDesc,"Sticky slime that has fused itself into a shell around your body." +RestraintHardProtoSlimeHandsDesc,"Sticky slime that has fused itself into a skintight layer." RestraintHardProtoSlimeHandsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardProtoSlimeMouth,Proto-Rubber (Mouth) -RestraintHardProtoSlimeMouthDesc,"Sticky slime that has fused itself into a shell around your body." +RestraintHardProtoSlimeMouthDesc,"Sticky slime that has fused itself into a skintight layer." RestraintHardProtoSlimeMouthDesc2,"There's no struggling out now, but since it's solid it may be cuttable." RestraintHardProtoSlimeHead,Proto-Rubber (Head) -RestraintHardProtoSlimeHeadDesc,"Sticky slime that has fused itself into a shell around your body." +RestraintHardProtoSlimeHeadDesc,"Sticky slime that has fused itself into a skintight layer." RestraintHardProtoSlimeHeadDesc2,"There's no struggling out now, but since it's solid it may be cuttable." +RestraintHardProtoSlimeCollar,Living Proto-Rubber Collar +RestraintHardProtoSlimeCollarDesc,"This collar is designed to make sure its wearer does not escape the rubber." +RestraintHardProtoSlimeCollarDesc2,"It will occasionally cause proto-rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-rubber you have on you." - +RestraintDuctTapeRaw,Sticky Tape +RestraintDuctTapeRawDesc,"Extra-strength utility tape, for your secure packaging needs." +RestraintDuctTapeRawDesc2,"It's quite sticky, the adhesive requires some force to get off." RestraintDuctTapeHands,Tape Mittens RestraintDuctTapeHandsDesc,"Sticky tape that holds your hands into a fist!" @@ -4272,15 +5263,24 @@ RestraintDivineAnkleCuffs,Divine Cuffs RestraintDivineAnkleCuffsDesc,"It is said that even heaven has its hierarchies..." RestraintDivineAnkleCuffsDesc2,"Shining cuffs made of holy metal. Nothing can touch it." RestraintDivineMuzzle,Divine Muzzle -RestraintDivineMuzzleDesc,"It is said that even heaven has its hierarchies..." +RestraintDivineMuzzleDesc,"Keep those lips sealed." RestraintDivineMuzzleDesc2,"A shining muzzle made of holy metal. Nothing can touch it." +RestraintDivineGag,Divine Gag +RestraintDivineGagDesc,"It is said that even heaven has its hierarchies..." +RestraintDivineGagDesc2,"A shining gag made of holy metal. Nothing can touch it." RestraintClothBlindfold,Blindfold RestraintClothBlindfoldDesc,"A piece of cloth secured onto your face and blocking vision." RestraintClothBlindfoldDesc2,"You can still see through the gap around your nose." -RestraintClothGag,Knotted Cloth Gag -RestraintClothGagDesc,"A piece of cloth tied in a knot and tied over your mouth." +RestraintClothGag,Cleave Gag +RestraintClothGagDesc,"A piece of cloth forced between your lips." RestraintClothGagDesc2,"On its own it's not very restrictive." +RestraintClothGag2,Thick Cleave Gag +RestraintClothGag2Desc,"A piece of cloth that makes it hard to speak." +RestraintClothGag2Desc2,"It's somewhat effective." +RestraintClothGag3,Knotted Cloth Gag +RestraintClothGag3Desc,"A piece of cloth tied in a knot and tied over your mouth." +RestraintClothGag3Desc2,"It's pretty effective at keeping you quiet." RestraintClothGagOver,OTN Cloth Gag RestraintClothGagOverDesc,"A piece of cloth tightened over your mouth." RestraintClothGagOverDesc2,"On its own it's not very restrictive." @@ -4310,27 +5310,55 @@ RestraintSturdyLeatherBeltsFeet,Ankle Belts RestraintSturdyLeatherBeltsFeetDesc,"A ludicrous amount of belts secured with a buckle." RestraintSturdyLeatherBeltsFeetDesc2,"Lockable and fully adjustable to ensure snugness." -RestraintWristShackles,Wrist Cuffs -RestraintWristShacklesDesc,"Heavy shackles with a rudimentary lock." +RestraintWristShackles,Iron Cuffs +RestraintWristShacklesDesc,"Tough shackles with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar." RestraintWristShacklesDesc2,"You could pick these with a hairpin." -RestraintAnkleShackles,Shackles -RestraintAnkleShacklesDesc,"Heavy shackles with a rudimentary lock." -RestraintAnkleShacklesDesc2,"You could pick these with a hairpin." - -RestraintLegShackles,Leg Shackles +RestraintAnkleShackles,Iron Shackles +RestraintAnkleShacklesDesc,"Tough shackles with a rudimentary lock." +RestraintAnkleShacklesDesc2,"Tough to walk in." + +RestraintThumbCuffs,Thumbcuffs +RestraintThumbCuffsDesc,"Interferes with the use of your hands." +RestraintThumbCuffsDesc2,"Another layer of restriction." +RestraintThumbCuffsNew,Thumbcuffs +RestraintThumbCuffsNewDesc,"Interferes with the use of your hands." +RestraintThumbCuffsNewDesc2,"Another layer of restriction." +RestraintHingedCuffs,Hinged Handcuffs +RestraintHingedCuffsDesc,"Hinged cuffs with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar." +RestraintHingedCuffsDesc2,"Difficult to unlock, let alone pick by yourself." + +RestraintIrish8Cuffs,Heavy Handcuffs +RestraintIrish8CuffsDesc,"A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar." +RestraintIrish8CuffsDesc2,"The position is too awkward to free yourself, even with a key..." + +RestraintAnkleIrish8Cuffs,Heavy Leg Irons +RestraintAnkleIrish8CuffsDesc,"A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock." +RestraintAnkleIrish8CuffsDesc2,"The position is awkward, but it's on your feet so you can remove them yourself if you have free hands." + +RestraintLegShackles,Thigh Shackles RestraintLegShacklesDesc,"Heavy shackles with a rudimentary lock." RestraintLegShacklesDesc2,"You could pick these with a hairpin." +KinkyDungeonLinkLegShackles,"The enemy attaches your leg shackles together!" +RestraintLegShackles2,Linked Thigh Shackles +RestraintLegShackles2Desc,"Heavy shackles with a rudimentary lock." +RestraintLegShackles2Desc2,"You could pick these with a hairpin." +KinkyDungeonUnLinkLegShackles2,"The leg shackles chain detaches!" + RestraintFeetShackles,Ankle Shackles RestraintFeetShacklesDesc,"Heavy shackles with a rudimentary lock." RestraintFeetShacklesDesc2,"You could pick these with a hairpin." -RestraintFeetShackles2,Ankle Shackles -KinkyDungeonLinkFeetShackles,"The enemy attaches your ankle cuffs together!" +RestraintFeetShackles2,Linked Ankle Shackles +KinkyDungeonLinkFeetShackles,"The enemy attaches your ankle shackles together!" RestraintFeetShackles2Desc,"Heavy shackles with a rudimentary lock." RestraintFeetShackles2Desc2,"You could pick these with a hairpin." -KinkyDungeonUnLinkFeetShackles2,"The ankle cuff chain detaches!" +KinkyDungeonUnLinkFeetShackles2,"The ankle shackles chain detaches!" + RestraintSteelMuzzleGag,Steel Muzzle RestraintSteelMuzzleGagDesc,"A heavy muzzle with a rudimentary lock." RestraintSteelMuzzleGagDesc2,"You could pick this with a hairpin." +RestraintBlacksteelMuzzleGag,Blacksteel Muzzle +RestraintBlacksteelMuzzleGagDesc,"A heavy duty steel muzzle with a flexible metal locking pin and straps." +RestraintBlacksteelMuzzleGagDesc2,"Perfect for sealing away those unruly lips." @@ -4371,9 +5399,10 @@ ItemPickupAncientPowerSourceSpent,"You retrieve a spent ancient power crystal." ItemPickupHeart,"You pick up a magical amulet and use it to boost your stats." ItemPickupLeylineMap,"You pick up a Leyline Map." ItemPickupKnife,"You pick up a knife." + ItemPickupTorch,"You pick up a torch." ItemPickupKnives,"You found a bundle of discarded knives!" -ItemPickupEnchKnife,"You pick up an enchanted knife." +ItemPickupEnchKnife,"You pick up a magic knife." ItemPickupMagicKnife,"You pick up a magic knife." ItemPickupPick,"You pick up a lockpick." ItemPickupRedKey,"You pick up a normal key." @@ -4396,9 +5425,29 @@ ItemPickupEscortDrone,"You recover your escort drone." ItemPickupVibeWand,"You pick up a 'magic' wand..." ItemPickupIceCube,"You pick up a magical ice cube." ItemPickupRope,"You find some treated hemp rope." + +KinkyDungeonInventoryItemFeather,Feather +KinkyDungeonInventoryItemFeatherDesc,"A feather taken from some large fluffy being." +KinkyDungeonInventoryItemFeatherDesc2,"Deals tickle damage. Greatly distracting. Offhand: +1 tickle damage on attack for 3 stamina. Greatly distracting." ItemPickupFeather,"You pick up a feather." + + +KinkyDungeonInventoryItemDuster,Maid's Feather Duster +KinkyDungeonInventoryItemDusterDesc,"An instrument used extensively by maidforce agents carrying out their duties." +KinkyDungeonInventoryItemDusterDesc2,"Deals tickle damage. Distracts enemies. Offhand: +15 distraction on attack for 1 stamina." +ItemPickupDuster,"You pick up a feather duster." + + + +KinkyDungeonInventoryItemRopeRune,Rope Rune +KinkyDungeonInventoryItemRopeRuneUse,"You smash the rune in front of you, and a flash of light enchants nearby ropes!" +KinkyDungeonInventoryItemRopeRuneDesc,"It feels tantalizing to look at." +KinkyDungeonInventoryItemRopeRuneDesc2,"Allows you to enchant ropes into more powerful restraints." +ItemPickupRopeRune,"You pick up a kinky trinket with a glowing red sigil." + ItemPickupFlail,"You pick up a heavy flail." ItemPickupSpear,"You pick up a shortspear." +ItemPickupPike,"You pick up a long spear." ItemPickupPickaxe,"You pick up a pickaxe." ItemPickupMagicSword,"You pick up an enchanted sword." ItemPickupMagicAxe,"You pick up an enchanted axe." @@ -4421,7 +5470,8 @@ ItemPickupTheEncaser,"You pick up Metamorphosis." ItemPickupFourSeasons,"You pick up Four Seasons." ItemPickupArbiter,"You pick up The Arbiter." ItemPickupDreamcatcher,"You pick up Dreamcatcher." -ItemPickupBondageBuster,"You retrieve the Bondage Buster." +ItemPickupBondageBuster,"You retrieve the Bondage Buster EX." +ItemPickupBondageBusterII,"You salvage a Bondage Buster MK II." ItemPickupBlaster,"You retrieve a Nevermere Blaster Mark IV." ItemPickupMessengerOfLove,"You retrieve the Messenger of Love." ItemPickupMoiraiScissors,"You retrieve Moirai's scissors." @@ -4433,7 +5483,8 @@ ItemPickupScrollPurity,"You pick up a Scroll of Purity." ItemPickupScrollVerbal,"You pick up a Scroll of Speech." ItemPickupScrollLegs,"You pick up a Scroll of Sauntering." -KinkyDungeonDisarm,"As you strike again, your weapon is pulled out of your grasp!" +KinkyDungeonDisarm,"Your weapon is pulled out of your grasp!!!" +KinkyDungeonDisarmLeash,"Your weapon is pulled out of your hand and tossed away by your captor!" KinkyDungeonDisarmCut,"Your weapon slips out of your hand as you try to cut with it..." KinkyDungeonUnEquipWeapon,"You put away the WEAPONNAME" @@ -4451,6 +5502,8 @@ KDEffectTileTooltipTorch,Torch KDEffectTileTooltipTorchDesc,"Provides light" KDEffectTileTooltipLantern,Lantern KDEffectTileTooltipLanternDesc,"Provides light" +KDEffectTileTooltipOrbLantern,Magic Lantern +KDEffectTileTooltipOrbLanternDesc,"Provides light" KDEffectTileTooltipTorchOrb,Magic Lantern KDEffectTileTooltipTorchOrbDesc,"Provides light" KDEffectTileTooltipLanternUnlit,Unlit Lantern @@ -4459,10 +5512,26 @@ KDEffectTileTooltipIllusOrb,Wall Sconce KDEffectTileTooltipIllusOrbDesc,"Provides light" KDEffectTileTooltipIllusOrbDead,Broken Wall Sconce KDEffectTileTooltipIllusOrbDeadDesc,"It is beyond repair." +KDEffectTileTooltipEdgeOrb,Light Portal +KDEffectTileTooltipEdgeOrbDesc,"Provides light" +KDEffectTileTooltipEdgeOrbDead,Empty Portal +KDEffectTileTooltipEdgeOrbDeadDesc,"Stare into the void..." KDEffectTileTooltipLatex,Liquid Latex KDEffectTileTooltipLatexDesc,"Engulfs creatures" +KDEffectTileTooltipLatexThin,Liquid Latex +KDEffectTileTooltipLatexThinDesc,"Engulfs creatures" +KDEffectTileTooltipLatexBlue,Liquid Latex +KDEffectTileTooltipLatexBlueDesc,"Engulfs creatures" +KDEffectTileTooltipLatexThinBlue,Liquid Latex +KDEffectTileTooltipLatexThinBlueDesc,"Engulfs creatures" +KDEffectTileTooltipLatexGreen,Liquid Latex +KDEffectTileTooltipLatexGreenDesc,"Engulfs pets (like you)" +KDEffectTileTooltipLatexThinGreen,Liquid Latex +KDEffectTileTooltipLatexThinGreeneDesc,"Engulfs pets (like you)" KDEffectTileTooltipSlime,Slime KDEffectTileTooltipSlimeDesc,"Slows creatures" +KDEffectTileTooltipGlue,Glue +KDEffectTileTooltipGlueDesc,"Slows creatures" KDEffectTileTooltipIce,Ice KDEffectTileTooltipIceDesc,"Chilling and slippery" KDEffectTileTooltipWater,Water @@ -4483,6 +5552,10 @@ KDEffectTileTooltipRunes,Summoning Runes KDEffectTileTooltipRunesDesc,"Mystical runes used for summoning" KDEffectTileTooltipRunesTrap,Casting Runes KDEffectTileTooltipRunesTrapDesc,"Mystical runes used for casting spells" +KDEffectTileTooltipBoobyTrap,Suspicious Mechanism +KDEffectTileTooltipBoobyTrapDesc,"A suspicious mechanism that seems to have been hastily put together." +KDEffectTileTooltipBoobyTrapMagic,Suspicious Runes +KDEffectTileTooltipBoobyTrapMagicDesc,"A suspicious magic circle that was scrawled recently." KDEffectTileTooltipEmber,Embers KDEffectTileTooltipEmberDesc,Ignition source. Blocks vision. KDEffectTileTooltipInferno,Inferno @@ -4493,6 +5566,10 @@ KDEffectTileTooltipSmoke,Smoke KDEffectTileTooltipSmokeDesc,Blocks vision KDEffectTileTooltipCracked,Cracked Earth KDEffectTileTooltipCrackedDesc,Makes creatures unsteady +KDEffectTileTooltipRubble,Rubble +KDEffectTileTooltipRubbleDesc,You don't think insurance will cover this. +KDEffectTileTooltipRubbleNoMend,Rubble +KDEffectTileTooltipRubbleNoMendDesc,No putting that back together. KDEffectTileTooltipCMDBindings,"Can be controlled using CMD spells" KDEffectTileTooltipCMDSlime,"Can be controlled using Rubbermancy" @@ -4500,9 +5577,12 @@ KDEffectTileTooltipCMDSlime,"Can be controlled using Rubbermancy" KDTileTooltip0,Floor KDTileTooltip1,Wall +KDTileTooltip5,Object +KDTileTooltip6,Object KDTileTooltip2,Brickwork KDTileTooltipX,Doodad KDTileTooltipL,Furniture +KDTileTooltipF,Table KDTileTooltipT,Table KDTileTooltipA,Shrine KDTileTooltipD,Closed Door @@ -4515,7 +5595,8 @@ KDTileTooltipa,Ruined Shrine KDTileTooltipO,Orb Altar KDTileTooltipo,Empty Altar KDTileTooltipC,Chest -KDTileTooltipc,Empty Chest +KDTileTooltipC2,Faction Chest +KDTileTooltipc,Open Chest KDTileTooltipR,Shiny Object KDTileTooltipY,Shiny Object KDTileTooltip4,Cracked Wall @@ -4526,9 +5607,13 @@ KDTileTooltipH,Mysterious Stairs KDTileTooltipG,Ghostly Adventurer KDTileTooltip@,Button KDTileTooltipV,Conveyor +KDTileTooltipv,Safety Conveyor KDTileTooltipt,Doll Terminal KDTileTooltipu,Doll Supply KDTileTooltipN,Bondage Machine +KDTileTooltip+,Empty Fixture +KDTileTooltip=,Filled Fixture +KDTileTooltipM,Tablet @@ -4541,13 +5626,20 @@ KinkyDungeonBookConjureDescription,A book about conjuration KinkyDungeonBookIllusionDescription,A book of manipulative spells +KDShortCompVerbal,"Verbal" +KDShortCompArms,"Arms" +KDShortCompLegs,"Legs" +KDShortCompVision,"Vision" + KinkyDungeonComponents,"Components: " KinkyDungeonComponentsVerbal,"Verbal" KinkyDungeonComponentsArms,"Arm Movements" KinkyDungeonComponentsLegs,"Leg Gestures" -KinkyDungeonComponentsFailVerbal,"The incantation comes out as a garbled mess!" -KinkyDungeonComponentsFailArms,"You can't raise your arms to cast the spell!" -KinkyDungeonComponentsFailLegs,"Your feet are too clumsy to perform the magic gesture!" +KinkyDungeonComponentsVision,"Vision" +KinkyDungeonComponentsFailVerbal,"You mumble incoherently trying to cast the spell..." +KinkyDungeonComponentsFailArms,"You wiggle uselessly trying to cast the spell..." +KinkyDungeonComponentsFailLegs,"Your feet are too clumsy to perform the magic gesture..." +KinkyDungeonComponentsFailVision,"You are unable to see, so you can't target this spell..." KinkyDungeonBookNextPage,Next Page KinkyDungeonBookLastPage,Last Page @@ -4568,8 +5660,14 @@ KinkyDungeonColumnDexterity,"Dexterity" KinkyDungeonColumnIntelligence,"Intelligence" KinkyDungeonColumnMisc,"Misc" + +KinkyDungeonColumnUnique,"Unique" +KinkyDungeonColumnActive,"Active" +KinkyDungeonColumnUpgrades,"Upgrades" + KinkyDungeonFilterlearnable,Learnable KinkyDungeonFilterunlearned,Unlearned +KinkyDungeonFilterlearned,Learned KinkyDungeonFilternoupgrade,Excl. Upgrades KinkyDungeonFilteryesupgrade,Passive KinkyDungeonFilterupcast,Upcast @@ -4588,12 +5686,14 @@ KinkyDungeonFilterair,Air KinkyDungeonFilterelectric,Lightning KinkyDungeonFilterwater,Water KinkyDungeonFilterslime,Rubber +KinkyDungeonFilterlatex,Rubber KinkyDungeonFilterteleport,Teleport KinkyDungeonFilterphysics,Physics KinkyDungeonFilterconjure,Conjuration KinkyDungeonFiltersummon,Summoning KinkyDungeonFilterbinding,Binding KinkyDungeonFiltermetal,Metal +KinkyDungeonFilterlatex,Latex KinkyDungeonFilterrope,Rope KinkyDungeonFilterleather,Leather KinkyDungeonFilterstealth,Stealth @@ -4602,6 +5702,7 @@ KinkyDungeonFilteralteration,Alteration KinkyDungeonFilterlight,Light KinkyDungeonFiltershadow,Shadow KinkyDungeonFilterknowledge,Knowledge +KinkyDungeonFilterarrow,Archery KinkyDungeonFilterutility,Utility KinkyDungeonFilterupgrade,Upgrades KinkyDungeonFiltermagic,Spell Tree @@ -4611,6 +5712,7 @@ KinkyDungeonFiltermana,Magic KinkyDungeonFilterdamage,Damage KinkyDungeonFilterdistract,Distraction + KDSpellEmpower,Empower to upcast spells KDSpellEmpowerCancel,Cancel empowerment KDSpellEmpowerMsg,"You channel mana through your body! Empowerment level: LEVEL" @@ -4620,6 +5722,15 @@ KDSpellUpcastsFrom,"Upcast from SPELL" KinkyDungeonSpellMiscast,You fail to concentrate on the spell and it fizzles! KinkyDungeonSpellMiscastGagged,Your gag causes you to mispronounce the magic words! +KinkyDungeonSpellMiscastPoorForm,You are too clumsy to perform the leg movements! +KinkyDungeonSpellMiscastVision,You can't get a good look at the target! +KinkyDungeonSpellMiscastLegs,You trip up while casting the spell! +KinkyDungeonSpellMiscastBug,You miscast the spell because of a bug. Please report. +KinkyDungeonSpellMiscastArms,You wave your arms around and make the wrong symbol with your hands! +KinkyDungeonSpellMiscastFingers,Your restrained fingers can't make the magic glyphs in time! + + + KinkyDungeonIceDrain,The ice drains your concentration! Your mana and stamina are slipping away! KinkyDungeonCrystalDrain,"A strange, chaotic energy flows into you! Your will is weakened and your mana fades!" KinkyDungeonTickleDrain,"Something gently, constantly tickles you!" @@ -4631,22 +5742,92 @@ KinkyDungeonSpellShatterAmpuleRed,The rubber ampule shatters on impact! KinkyDungeonSpellShatterBindAmpuleBlue,The latex ampule shatters on impact and forms a restraint! KinkyDungeonSpellShatterDressAmpuleBlue,The latex ampule shatters on impact and coats your body! KinkyDungeonSpellShatterAmpuleBlue,The latex ampule shatters on impact and sticks to you! -KinkyDungeonSpellAmpuleGreen,Gas Ampule -KinkyDungeonSpellAmpuleYellow,Glue Ampule -KinkyDungeonSpellAmpuleRed,Rubber Ampule -KinkyDungeonSpellAmpuleBlue,Latex Ampule + KinkyDungeonSpellShadowStrike,Shadowy chains appear from a rift in space! KinkyDungeonInfernoBurn,The roaring inferno deals 10 damage to you! -KinkyDungeonSpellDistractionCast,Mana Burst -KinkyDungeonSpellDescriptionDistractionCast,"As a trainee, you have learned the technique of inducing clarity via a trance-like state at 100% distraction. However, this state is precarious, and casting spells may cause you to lose focus..." +KinkyDungeonSpellPeasant,The Reaping +KinkyDungeonSpellDescriptionPeasant,"+20% damage to plants" + +KinkyDungeonSpellPeasantPenalty,Magically Iliterate +KinkyDungeonSpellDescriptionPeasantPenalty,"You've never read a magic book. Elemental, Conjuration, and Illusion spells cost 3x as many spell points." + +KinkyDungeonSpellPeasantPenalty1,Magical Spark +KinkyDungeonSpellDescriptionPeasantPenalty1,"Reduce the penalty from Magically Iliterate to 2x." +KinkyDungeonSpellPeasantPenalty2,Magical Training +KinkyDungeonSpellDescriptionPeasantPenalty2,"Remove the penalty from Magically Iliterate." + +KinkyDungeonSpellSowing,Reap What You Sow +KinkyDungeonSpellDescriptionSowing,"Defeating a non-humanoid enemy causes vines to sprout on their space temporarily." + + +KinkyDungeonSpellBattleRhythm,"Battle Rhythm" +KinkyDungeonSpellDescriptionBattleRhythm,"Stores 10% of the stamina cost of attacks as Rhythm, up to a total of 40. While you have over 10 Rhythm, you gain +10 Block and Evasion. Enemy base accuracy against you is decreased by a % equal to your Rhythm. If an attack misses or is blocked because of this, reduce Rhythm by 25% of the enemy attack power. Decays when not attacking." + +KinkyDungeonSpellLimitSurge,"Limit Surge" +KinkyDungeonSpellDescriptionLimitSurge,"Spend 40 WP to fully restore Stamina, also stamina gain is increased by 30% for 20 turns. If your Willpower ends up 0 because of this, you are stunned for 2 turns." + +KinkyDungeonSpellBattleTrance,"Battle Trance" +KinkyDungeonSpellDescriptionBattleTrance,"While at 40 Battle Rhythm, you attack twice per turn." + +KinkyDungeonSpellCombatManeuver,"Combat Maneuver" +KinkyDungeonSpellDescriptionCombatManeuver,"When Battle Trance is active, you gain a free move if the target is defeated before the second attack hits." + + + + + +KinkyDungeonSpellRogueTraps,Devious Ingenuity +KinkyDungeonSpellDescriptionRogueTraps,"Trap-type spells and consumables no longer require you to channel them, but still have a delay before arming." + + + + + +KinkyDungeonSpellDistractionCast,Essence Motes +KinkyDungeonSpellDescriptionDistractionCast,"When you miscast a spell, you gain an Essence Mote which appears in a random space next to you. You can consume this mote to gain -100% miscast chance decaying over 10 turns. Walking over the mote also consumes it." + +KinkyDungeonSpellManaRegen,Inner Power +KinkyDungeonSpellDescriptionManaRegen,"As a wizard, you are able to draw upon mystical sources of energy that others can't even see. After 16 turns of not casting a spell or attacking, your next spell's mana cost is reduced by 20% of your max mana BEFORE multipliers. Toggled passive spells apply half the cooldown." + +KinkyDungeonSpellManaRegenPlus,Battlemage +KinkyDungeonSpellDescriptionManaRegenPlus,"Inner Power cooldown is no longer reset after attacking." + +KinkyDungeonSpellManaRegenPlus2,Relentless Casting +KinkyDungeonSpellDescriptionManaRegenPlus2,"While on cooldown, Inner Power cooldown is no longer reset after casting spells." + +KinkyDungeonSpellManaRecharge,Arcane Recharge +KinkyDungeonSpellDescriptionManaRecharge,"Calling upon chaotic energies, your willpower is assaulted in exchange for power. Deals 80 psychic damage to self and drains 10% of your max Willpower to fully restore mana. Does not refill the mana pool." + +KinkyDungeonSpellOrgasmMana1,Way of Pleasure +KinkyDungeonSpellDescriptionOrgasmMana1,"You have chosen the path of absolute pleasure. After letting go of yourself, you restore 50 mana, which can refill the mana pool if you have spare willpower. Blocks Way of Discipline." + +KinkyDungeonSpellOrgasmBuff,Intense Power +KinkyDungeonSpellDescriptionOrgasmBuff,"After letting go of yourself, you feel an immense surge of power, increasing magic damage by 40% for 8 turns after you regain control, and by 10% while you remain satisfied." + +KinkyDungeonSpellOrgasmFrequency,Pleasure Training I +KinkyDungeonSpellDescriptionOrgasmFrequency,"You remain satisfied for much less time after letting go. Letting go costs 50% less stamina." +KinkyDungeonSpellOrgasmFrequency2,Pleasure Training II +KinkyDungeonSpellDescriptionOrgasmFrequency2,"You are quite difficult to satisfy. Letting go costs 50% less stamina (75% total) and 50% less willpower." + +KinkyDungeonSpellOrgasmResist,Mental Resistance +KinkyDungeonSpellDescriptionOrgasmResist,"+100 Psychic and Charm Resist. You can no longer let go involuntarily while your WP is above 10% or you are shielded, and willpower drains 70% slower while edged. (click the buff to toggle)" +KinkyDungeonBuffe_OrgasmResist,"Mental Resistance: You cannot orgasm except by choice or below 25% WP. Click to toggle." +KinkyDungeonBuffd_OrgasmResist,"Mental Resistance: You are allowing yourself to let go. Click to toggle." + + +KinkyDungeonSpellEdgeMana1,Way of Discipline +KinkyDungeonSpellDescriptionEdgeMana1,"You have chosen the path of absolute discipline. Being in an Edged state increases passive mana recovery and you regenerate 0.5 mana per turn, restoring the same amount to the Mana Pool if you have willpower to spare. Blocks Way of Pleasure." + +KinkyDungeonSpellDenyMana,Way of Denial +KinkyDungeonSpellDescriptionDenyMana,"Harnessing your mental discipline, you regenerate 20 mana each time you are denied, restoring the same amount to the Mana Pool if you have willpower to spare." KinkyDungeonSpellApprenticeFire,Flame Novice KinkyDungeonSpellDescriptionApprenticeFire,Unlocks fire spells. Learn Firebolt. KinkyDungeonSpellApprenticeLightning,Lightning Novice -KinkyDungeonSpellDescriptionApprenticeLightning,Unlocks electrice spells. Learn Electrify. +KinkyDungeonSpellDescriptionApprenticeLightning,Unlocks electrice spells. Learn Electrify. Gain increased resistance to blinding from bright lights. KinkyDungeonSpellApprenticeWater,Water Novice KinkyDungeonSpellDescriptionApprenticeWater,Unlocks water spells. Learn Water Ball. KinkyDungeonSpellApprenticeIce,Ice Novice @@ -4665,14 +5846,14 @@ KinkyDungeonSpellDescriptionApprenticeRope,Unlocks rope spells. Learn Conjure Ro KinkyDungeonSpellApprenticeLeather,Leather 101 KinkyDungeonSpellDescriptionApprenticeLeather,Unlocks leather spells. Learn Conjure Gag. KinkyDungeonSpellApprenticePhysics,Physics 101 -KinkyDungeonSpellDescriptionApprenticePhysics,Unlocks teleportation and physical manipulation spells. Learn Wall. +KinkyDungeonSpellDescriptionApprenticePhysics,Unlocks teleportation and spatial manipulation spells. Learn Wall. KinkyDungeonSpellApprenticeSummon,Summoning 101 KinkyDungeonSpellDescriptionApprenticeSummon,Unlocks summoning spells. Learn Summon Familiar. KinkyDungeonSpellApprenticeShadow,Blessing of Shadow KinkyDungeonSpellDescriptionApprenticeShadow,Unlocks shadow spells. Learn Shadow Dagger. KinkyDungeonSpellApprenticeLight,Blessing of Light -KinkyDungeonSpellDescriptionApprenticeLight,Unlocks light spells. Learn Flash. +KinkyDungeonSpellDescriptionApprenticeLight,Unlocks light spells. Learn Flash. Gain significantly increased resistance to blinding from bright lights. KinkyDungeonSpellApprenticeMystery,Blessing of Obscurity KinkyDungeonSpellDescriptionApprenticeMystery,Unlocks invisibility spells. Learn Camouflage. KinkyDungeonSpellApprenticeProjection,Projection Magic @@ -4684,30 +5865,31 @@ KinkyDungeonSpellDescriptionApprenticeKnowledge,"Unlocks knowledge and critical- KinkyDungeonSpellGlue,Glue -KinkyDungeonGlue,The glue attaches to your legs as you try to move through! +KinkyDungeonGlue,The glue sticks to you and engulfs your legs! KinkyDungeonGlueSlow,The glue slows you down! KinkyDungeonGlueSlowDamage,The glue slows you down! (-DamageDealt SP) KinkyDungeonSpellFirebolt,Firebolt KinkyDungeonSpellAllyFirebolt,Elemental's Firebolt KinkyDungeonSpellAllyWindBlast,Elemental's Gust -KinkyDungeonSpellDescriptionFirebolt,A ball of flame that does DamageDealt damage. +KinkyDungeonSpellEnemyWindBlast,Gust +KinkyDungeonSpellDescriptionFirebolt,A ball of flame that does DamageDealt damage to one target. KinkyDungeonSpellCastFirebolt,You a hurl a firebolt! KinkyDungeonSpellTargetFirebolt,Choose aim direction KinkyDungeonSpellWindBlast,Windblast -KinkyDungeonSpellDescriptionWindBlast,"Three scattered puffs of wind that do DamageDealt pressure damage at close range, stun briefly, and push targets back." +KinkyDungeonSpellDescriptionWindBlast,"Three scattered puffs of wind that do DamageDealt blast damage at close range, stun briefly, and push targets back." KinkyDungeonSpellCastWindBlast,You press your wrists together and conjure a blast of wind! KinkyDungeonSpellTargetWindBlast,Choose aim direction KinkyDungeonSpellGust,Gust -KinkyDungeonSpellDescriptionGust,"Three puffs of wind in a tight cone that deal DamageDealt pressure damage and push targets back." +KinkyDungeonSpellDescriptionGust,"Three puffs of wind in a tight cone that deal DamageDealt blast damage and push targets back." KinkyDungeonSpellCastGust,You exhale a mighty wind! KinkyDungeonSpellTargetGust,Choose aim direction KinkyDungeonSpellKnife,Knife -KinkyDungeonSpellDescriptionKnife,Throw one of your knives DamageDealt damage. Lands in the target's tile, but is recoverable afterward. +KinkyDungeonSpellDescriptionKnife,"Throw one of your knives DamageDealt damage. Lands in the target's tile, but is recoverable afterward." KinkyDungeonSpellCastKnife,You a throw a knife! KinkyDungeonSpellTargetKnife,Choose aim direction @@ -4718,19 +5900,22 @@ KinkyDungeonSpellTargetDagger,Choose aim direction KinkyDungeonSpellShadowSlash,Shadow Slash KinkyDungeonSpellShadowScythe,Shadow Scythe -KinkyDungeonSpellDescriptionShadowSlash,"Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly." +KinkyDungeonSpellDescriptionShadowSlash,"Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. Deals 50% more damage when you are attacking from the shadows." KinkyDungeonSpellCastShadowSlash,You create a tear in space with your finger! KinkyDungeonSpellTargetShadowSlash,Choose aim direction -KinkyDungeonSpellBlink,Portal -KinkyDungeonSpellDescriptionBlink,Teleport to a nearby location (including into darkness) with twice the range. -KinkyDungeonSpellCastBlink,You call upon a misty portal to transport you! -KinkyDungeonSpellTargetBlink,Choose target location - KinkyDungeonSpellLeap,Blink -KinkyDungeonSpellDescriptionLeap,Instantly teleport to a location you can see. +KinkyDungeonSpellDescriptionLeap,"Instantly teleport to an adjacent position and gain +50 evasion for 3 turns. Unlocks Blink and Warp when learned." KinkyDungeonSpellCastLeap,You teleport! -KinkyDungeonSpellTargetLeap,Choose target location +KinkyDungeonSpellTargetLeap,Choose target location (1 tile range) +KinkyDungeonSpellLeap2,Blink II +KinkyDungeonSpellDescriptionLeap2,Instantly teleport up to 2 tiles away. Must have vision of the target point. Stuns an enemy if you teleport behind them. +KinkyDungeonSpellCastLeap2,You teleport! +KinkyDungeonSpellTargetLeap2,Choose target location (2 tile range) +KinkyDungeonSpellLeap3,Blink III +KinkyDungeonSpellDescriptionLeap3,Instantly teleport up to 3 tiles away. Must have vision of the target point. +KinkyDungeonSpellCastLeap3,You teleport! +KinkyDungeonSpellTargetLeap3,Choose target location (3 tile range) KinkyDungeonSpellIcebolt,Ice Shard KinkyDungeonSpellDescriptionIcebolt,A shard of ice that does DamageDealt damage and slows for Duration turns. Freezes if already slowed or drenched. @@ -4754,7 +5939,7 @@ KinkyDungeonSpellCastIceOrb,You a hurl a frigid orb! KinkyDungeonSpellTargetIceOrb,Choose aim direction KinkyDungeonSpellFreeze,Freeze -KinkyDungeonSpellDescriptionFreeze,Freeze an adjacent target for Duration turns. +KinkyDungeonSpellDescriptionFreeze,Chill an adjacent target for DamageDealt ice damage and slows for Duration turns. Freezes if already slowed or drenched. KinkyDungeonSpellCastFreeze,You utter dark words of ice-cold truths. KinkyDungeonSpellTargetFreeze,Choose a target to freeze @@ -4775,18 +5960,33 @@ KinkyDungeonSpellTargetIgnite,Choose a friendly target to ignite KinkyDungeonSpellChainBolt,Conjure Chain KinkyDungeonSpellMagicChain,Magic Chain +KinkyDungeonSpellMagicRope,Magic Rope +KinkyDungeonSpellMagicBelt,Magic Belt KinkyDungeonSpellWitchChainBolt,Witch's Chain KinkyDungeonSpellDescriptionChainBolt,Throws a chain that does DamageDealt chain damage. Targets with 50% or more binding take 50 crush damage and are slowed for 4 turns. KinkyDungeonSpellCastChainBolt,You a hurl a strand of chain! KinkyDungeonSpellTargetChainBolt,Choose aim direction +KinkyDungeonSpellEnchantRope,Enchant Rope +KinkyDungeonSpellEnemyEnchantRope,Rope Enchantment +KinkyDungeonSpellEnemyEnchantRope2,Spellbinding +KinkyDungeonSpellDescriptionEnchantRope,"Convert rope binding on a target into magical bindings, which are much more powerful. Deals a small amount of arcane damage." +KinkyDungeonSpellCastEnchantRope,You whisper an enchanting tale of rope bondage... +KinkyDungeonSpellTargetEnchantRope,Choose targets to tighten the ropes of + KinkyDungeonSpellRopeBoltLaunch,Conjure Ropes KinkyDungeonSpellRopeBolt,Animated Rope -KinkyDungeonSpellDescriptionRopeBoltLaunch,Launch 3 ropes that deal DamageDealt chain damage each and add 22 rope binding. +KinkyDungeonSpellDescriptionRopeBoltLaunch,Launch 3 ropes that deal DamageDealt chain damage each and add 32 rope binding. KinkyDungeonSpellCastRopeBoltLaunch,You animate a bunch of ropes! KinkyDungeonSpellTargetRopeBoltLaunch,Choose aim direction +KinkyDungeonSpellRopeBoltLaunchMany,Ropestorm +KinkyDungeonSpellRopeBolt,Animated Rope +KinkyDungeonSpellDescriptionRopeBoltLaunchMany,Launch 9 ropes that deal DamageDealt chain damage each and add 32 rope binding. Best in open spaces. +KinkyDungeonSpellCastRopeBoltLaunchMany,You animate a sizeable quantity of ropes! +KinkyDungeonSpellTargetRopeBoltLaunchMany,Choose aim direction + KinkyDungeonSpellSteelRainBurst,Steel Torrent KinkyDungeonSpellSteelRainPlug,Steel Rain KinkyDungeonSpellSteelRainPlugDamage,The plug hits you! (DamageDealt) @@ -4798,6 +5998,10 @@ KinkyDungeonSpellCastSteelRainBurst,You raise your hand and several steel projec KinkyDungeonSpellTargetSteelRainPlug,Choose aim direction KinkyDungeonSpellTargetSteelRainBurst,Choose target point + +KinkyDungeonSpellEnemySteelRainBurst,Steel Torrent +KinkyDungeonSpellEnemySteelRainPlug,Steel Rain + KinkyDungeonSpellBanditBola,Bola KinkyDungeonSpellRestrainingDevice,Restraining Device KinkyDungeonRestrainingDeviceStun,The thrown restraining device latches onto you as you struggle to get it off!!! @@ -4805,13 +6009,9 @@ KinkyDungeonRestrainingDevice,The restraining device wraps many elastic cables a KinkyDungeonSpellShadowBolt,Shadowy Grip KinkyDungeonShadowBolt,A dark hand latches onto you and holds you tight! -KinkyDungeonSpellCelestialBolt,Celestial Orb KinkyDungeonCelestialBolt,You are snugly wrapped in glowing ropes! KinkyDungeonSpellObsidianBolt,Obsidian Orb KinkyDungeonObsidianBolt,Metallic restraints encircle your body! -KinkyDungeonSpellRubberBolt,Rubberizing Bolt -KinkyDungeonSpellEncaseBolt,Rubber Bolt -KinkyDungeonSpellEncaseBoltDrone,Latex Bolt KinkyDungeonRubberBolt,"The latex spreads across your limbs and rubberizes, forming a tough barrier!" KinkyDungeonEncaseBolt,"The latex spreads across your limbs and hardens, forming a stretchy layer!" KinkyDungeonEncaseBoltDroneSlow,"The latex clings to you and slows you down, making you vulnerable to the barrage!" @@ -4845,7 +6045,7 @@ KinkyDungeonSpellCastAnalyze,You analyze the target! KinkyDungeonSpellTargetAnalyze,Choose object to analyze KinkyDungeonSpellGreaterShield,Barrier Runes -KinkyDungeonSpellDescriptionGreaterShield,Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns, but doesn't block movement. +KinkyDungeonSpellDescriptionGreaterShield,"Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns, but doesn't block movement." KinkyDungeonSpellCastGreaterShield,You raise a field of runes with a command word! KinkyDungeonSpellTargetGreaterShield,Choose barrier location @@ -4854,7 +6054,8 @@ KinkyDungeonSpellDescriptionThunderstorm,"Creates a conductive area for Duration KinkyDungeonSpellCastThunderstorm,You energize the targeted area! KinkyDungeonSpellTargetThunderstorm,Choose target 3x3 area -KinkyDungeonSpellWitchElectrify,Witch's Electricity +KinkyDungeonSpellFireexp,Firey Explosion +KinkyDungeonSpellIceexp,Icey Explosion KinkyDungeonSpellWitchElectricOrb,Witch's Electric Orb KinkyDungeonSpellWitchElectricBurst,Witch's Electric Burst @@ -4866,10 +6067,15 @@ KinkyDungeonSpellTargetElectrify,Choose target location KinkyDungeonSpellCastAreaElectrify,The elemental channels the force of the storm! KinkyDungeonSpellFireball,Fireball -KinkyDungeonSpellDescriptionFireball,A slow moving ball of flame that explodes for 120 fire damage to the target and DamageDealt damage to surrounding enemies. -KinkyDungeonSpellCastFireball,You a hurl a fireball! +KinkyDungeonSpellDescriptionFireball,A slow moving ball of flame that explodes for DamageDealt fire damage in a wide area. +KinkyDungeonSpellCastFireball,You a hurl a massive fireball! KinkyDungeonSpellTargetFireball,Choose aim direction +KinkyDungeonSpellFireblast,Fireblast +KinkyDungeonSpellDescriptionFireblast,A bolt of flame that explodes for DamageDealt fire damage in an area. +KinkyDungeonSpellCastFireblast,You a hurl a blast of flame! +KinkyDungeonSpellTargetFireblast,Choose aim direction + KinkyDungeonSpellIncinerate,Incinerate KinkyDungeonSpellDescriptionIncinerate,A tornado of flame that does DamageDealt damage per turn for LifeTime turns. KinkyDungeonSpellCastIncinerate,You conjure a gout of flame! @@ -4887,8 +6093,16 @@ KinkyDungeonSpellTargetRainstorm,Choose target AoE location KinkyDungeonSpellSleet,Field of Frost KinkyDungeonSpellDescriptionSleet,Freezes a 5x5 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. -KinkyDungeonSpellCastSleet,You stomp your foot and call forth the storm! +KinkyDungeonSpellCastSleet,You stomp your foot and call forth the blizzard! KinkyDungeonSpellTargetSleet,Choose target AoE location (5x5) +KinkyDungeonSpellZoneOfFrost,Zone of Frost +KinkyDungeonSpellDescriptionZoneOfFrost,Freezes a 3x3 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. +KinkyDungeonSpellCastZoneOfFrost,You sweep your foot and call forth the storm! +KinkyDungeonSpellTargetZoneOfFrost,Choose target AoE location (3x3) +KinkyDungeonSpellColdFeet,Cold Feet +KinkyDungeonSpellDescriptionColdFeet,Freezes a single tile (ice slows entities). Any enemy standing on the tile takes take DamageDealt damage per turn for LifeTime turns. +KinkyDungeonSpellCastColdFeet,You tap your foot and call forth the frost! +KinkyDungeonSpellTargetColdFeet,Choose target location (1x1) KinkyDungeonSpellHeal,Healing Light KinkyDungeonSpellDescriptionHeal,Channel to heal 15 hitpoints per turn to summoned allies within a 5x5 area. @@ -4896,14 +6110,13 @@ KinkyDungeonSpellCastHeal,You conjure a healing light! KinkyDungeonSpellTargetHeal,Choose target AoE location (5x5) KinkyDungeonSpellCrackle,Crackle -KinkyDungeonSpellWolfCrackle,Stun Blast KinkyDungeonSpellAllyCrackle,Storm Bolt KinkyDungeonSpellDescriptionCrackle,A bolt of lightning that does DamageDealt electric damage to enemies in a 4-range line and briefly stuns. KinkyDungeonSpellCastCrackle,Lightning erupts from your fingertips! KinkyDungeonSpellTargetCrackle,Choose line direction (max range 4 tiles) KinkyDungeonSpellTremor,Tremor -KinkyDungeonSpellDescriptionTremor,"Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage." +KinkyDungeonSpellDescriptionTremor,"Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. Creates a slowing field after." KinkyDungeonSpellCastTremor,You call forth the rage of the earth. KinkyDungeonSpellTargetTremor,Choose AoE @@ -4920,19 +6133,19 @@ KinkyDungeonSpellTargetShock,Choose aim direction (max range 4 tiles) KinkyDungeonSpellLightningRune,Lightning Rune KinkyDungeonSpellLightningRuneStrike,Lightning Rune -KinkyDungeonSpellDescriptionLightningRune,A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 5 turns to setup. +KinkyDungeonSpellDescriptionLightningRune,A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 3 turns to setup. 200% crit multiplier. KinkyDungeonSpellCastLightningRune,You conjure a charged trap! KinkyDungeonSpellTargetLightningRune,Choose location for trap KinkyDungeonSpellFreezeRune,Freeze Rune KinkyDungeonSpellFreezeRuneStrike,Freeze Rune -KinkyDungeonSpellDescriptionFreezeRune,A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 5 turns to setup. +KinkyDungeonSpellDescriptionFreezeRune,A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 3 turns to setup. 200% crit multiplier. KinkyDungeonSpellCastFreezeRune,You conjure an icy trap! KinkyDungeonSpellTargetFreezeRune,Choose location for trap KinkyDungeonSpellFlameRune,Flame Rune KinkyDungeonSpellFlameRuneStrike,Flame Rune -KinkyDungeonSpellDescriptionFlameRune,A trap that deals DamageDealt fire damage in an area. Takes 5 turns to setup. +KinkyDungeonSpellDescriptionFlameRune,A trap that deals DamageDealt fire damage in an area. Takes 3 turns to setup. 200% crit multiplier. KinkyDungeonSpellCastFlameRune,You conjure an incendiary trap! KinkyDungeonSpellTargetFlameRune,Choose location for trap @@ -4962,7 +6175,8 @@ KinkyDungeonSpellEnemyCorona,Binding Light KinkyDungeonSpellEnemyCoronaBeam,Binding Light KinkyDungeonSpellMonolithBeamBeam,Chaos Beam KinkyDungeonSpellClericBeamBeam,Mystic Beam -KinkyDungeonSpellDescriptionCorona,A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt fire damage to the first target hit. +KinkyDungeonSpellClericBeamMulti,Mystic Barrage +KinkyDungeonSpellDescriptionCorona,A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt holy damage to the first target hit. Blinds for 12 turns. 150% crit multiplier. KinkyDungeonSpellCastCorona,You charge a powerful beam attack!!! KinkyDungeonSpellTargetCorona,Choose line direction @@ -5003,9 +6217,13 @@ KinkyDungeonSpellSlimeToLatex,Solidify KinkyDungeonSpellDescriptionSlimeToLatex,"Solidifies slime in the area into Latex. Latex adheres to enemies and slowly binds them, escasing them when they are fully bound." KinkyDungeonSpellCastSlimeToLatex,"You inscribe a transmutation circle on the floor." KinkyDungeonSpellTargetSlimeToLatex,Choose area containing slime +KinkyDungeonSpellLiquidMetal,LiquidMetal +KinkyDungeonSpellDescriptionLiquidMetal,"Solidifies Latex in the area into Liquid Metal. Liquid Metal is slippery, but also adheres to enemies and slowly binds them in metallic bonds. Enemies encased in liquid metal are more susceptible to knockback due to the slippery nature." +KinkyDungeonSpellCastLiquidMetal,"You inscribe a transmutation circle on the floor." +KinkyDungeonSpellTargetLiquidMetal,Choose area containing Latex KinkyDungeonSpellSlimeWalk,Slime Repulsion -KinkyDungeonSpellDescriptionSlimeWalk,"Gain +50 glue resist." +KinkyDungeonSpellDescriptionSlimeWalk,"Gain +50 glue resist. (Having 45 or more Glue Resist negates many negative effects from slime)" KinkyDungeonSpellSpread,Spread KinkyDungeonSpellDescriptionSpread,"Slime in the target area expands by 1 unit in the four cardinal directions. Refreshes duration to 12-20 turns." @@ -5029,12 +6247,12 @@ KinkyDungeonSpellLatexWall,Wall of Latex KinkyDungeonSpellDescriptionLatexWall,"Unlocks horizontal and vertical latex walls that encase enemies that walk through." KinkyDungeonSpellLatexWallVert,Wall of Latex (Vert) -KinkyDungeonSpellDescriptionLatexWallVert,Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased, take DamageDealt glue damage if not encased, and blinded. +KinkyDungeonSpellDescriptionLatexWallVert,"Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded." KinkyDungeonSpellCastLatexWallVert,You tap your foot and a wall of latex stretches out across the corridor. KinkyDungeonSpellTargetLatexWallVert,Choose vertical wall origin (5 tiles high) KinkyDungeonSpellLatexWallHoriz,Wall of Latex (Horiz) -KinkyDungeonSpellDescriptionLatexWallHoriz,Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased, take DamageDealt glue damage if not encased, and blinded. +KinkyDungeonSpellDescriptionLatexWallHoriz,"Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded." KinkyDungeonSpellCastLatexWallHoriz,You tap your foot and a wall of latex stretches out across the corridor. KinkyDungeonSpellTargetLatexWallHoriz,Choose horizontal wall origin (5 tiles wide) @@ -5058,6 +6276,11 @@ KinkyDungeonSpellDescriptionEarthformLine,Create a 4-tile line of Earthen Monoli KinkyDungeonSpellCastEarthformLine,You stomp your foot and monoliths emerge from the ground! KinkyDungeonSpellTargetEarthformLine,Choose line direction +KinkyDungeonSpellEarthformArc,Earthshape (Arc) +KinkyDungeonSpellDescriptionEarthformArc,Create a 5-wide arc of Earthen Monoliths. They have 50 hitpoints and 25 armor. +KinkyDungeonSpellCastEarthformArc,You stomp your foot and monoliths emerge from the ground! +KinkyDungeonSpellTargetEarthformArc,Choose line direction + KinkyDungeonSpellBoulderLaunch,Rock KinkyDungeonSpellBoulder,Rock KinkyDungeonSpellDescriptionBoulderLaunch,Channel 1 turn to launch a rock that deals DamageDealt crush damage and slows for 4 turns. Blocks up to 80 damage. @@ -5082,25 +6305,52 @@ KinkyDungeonSpellDescriptionSPUp1,Increases maximum SP by 12 KinkyDungeonSpellIronWill,Iron Will KinkyDungeonSpellDescriptionIronWill,"While you have 100 current willpower or more, regain an additional 4 stamina per turn." -KinkyDungeonSpellSteadfastGuard,Steadfast Guard -KinkyDungeonSpellDescriptionSteadfastGuard,"For each 10 current willpower you have over 50, gain +5 Restraint Block." +KinkyDungeonSpellSteadfastGuard,Defiance +KinkyDungeonSpellDescriptionSteadfastGuard,"For each 10 current willpower you have over 50, gain +5 Bondage Resist." KinkyDungeonSpellWillStruggle,Willful Struggle -KinkyDungeonSpellDescriptionWillStruggle,"For each 10 current willpower you have over 50, gain +1% struggle effectiveness." +KinkyDungeonSpellDescriptionWillStruggle,"For each 10 current willpower you have over 50, gain +1% struggle power." KinkyDungeonSpellWillStruggleMsg,Your willpower provides you with additional strength! (+AMOUNT%) KinkyDungeonSpellAthlete,Athlete KinkyDungeonSpellDescriptionAthlete,"Sprinting costs 40% less stamina." KinkyDungeonSpellSneaky,Sneaky KinkyDungeonSpellDescriptionSneaky,"You are harder to see when waiting." KinkyDungeonSpellVault,Vault -KinkyDungeonSpellDescriptionVault,"You can dash through enemies that aren't immobile." +KinkyDungeonSpellDescriptionVault,"You can sprint under flying enemies and through vulnerable, slowed, or disabled enemies. Does not work on immobile enemies such as doors and turrets." +KinkyDungeonSpellVaultAdv,Improved Vault +KinkyDungeonSpellDescriptionVaultAdv,"You can dash through enemies that aren't immobile." KinkyDungeonSpellEvasive1,Dodge I KinkyDungeonSpellDescriptionEvasive1,"+10 Evasion" KinkyDungeonSpellEvasive2,Dodge II KinkyDungeonSpellDescriptionEvasive2,"+15 Evasion (25 total)" KinkyDungeonSpellEvasive3,Dodge III KinkyDungeonSpellDescriptionEvasive3,"+25 Evasion (50 total)" -KinkyDungeonSpellCriticalStrike,Critical Strike -KinkyDungeonSpellDescriptionCriticalStrike,"Excess accuracy (over 100%) is converted to bonus physical damage percentage at 50% efficiency." + +KinkyDungeonSpellPhysDamage,Strength Up +KinkyDungeonSpellDescriptionPhysDamage,"+20% Physical Damage" + +KinkyDungeonSpellBattleCrit,Deadly Aim +KinkyDungeonSpellDescriptionBattleCrit,"Increases crit multiplier by a % equal to your Battle Rhythm." + +KinkyDungeonSpellAccurate1,Accuracy I +KinkyDungeonSpellDescriptionAccurate1,"+10 Accuracy" +KinkyDungeonSpellAccurate2,Accuracy II +KinkyDungeonSpellDescriptionAccurate2,"+15 Accuracy (25 total)" +KinkyDungeonSpellAccurate3,Accuracy III +KinkyDungeonSpellDescriptionAccurate3,"+25 Accuracy (50 total)" + +KinkyDungeonSpellUnarmed1,Martial Arts I +KinkyDungeonSpellDescriptionUnarmed1,"Unarmed strikes gain 15% accuracy and -10% stamina cost." +KinkyDungeonSpellUnarmed2,Martial Arts II +KinkyDungeonSpellDescriptionUnarmed2,"Unarmed strikes gain 20% accuracy (35% total) and -15% stamina cost (25% total)." +KinkyDungeonSpellUnarmed3,Martial Arts III +KinkyDungeonSpellDescriptionUnarmed3,"Unarmed strikes gain 25% accuracy (60% total) and -25% stamina cost (50% total)." + +KinkyDungeonSpellCriticalStrike,Precise Critical +KinkyDungeonSpellDescriptionCriticalStrike,"When landing a critical strike with physical damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency." +KinkyDungeonSpellCriticalStrikeMagic,Precise Magic +KinkyDungeonSpellDescriptionCriticalStrikeMagic,"When landing a critical strike with magic damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency." +KinkyDungeonSpellMagicalOverload,Magical Overload +KinkyDungeonSpellDescriptionMagicalOverload,"When landing a critical strike with magic damage, crit multiplier is increased by 25% of your current DP." KinkyDungeonSpellBruteForce1,Brute Force @@ -5110,12 +6360,12 @@ KinkyDungeonSpellOneWithSlime,One With Slime KinkyDungeonSpellDescriptionOneWithSlime,"While standing on slime/latex, you can cast rubber spells without components." KinkyDungeonSpellSlimeMimic,Convincing Disguise -KinkyDungeonSpellDescriptionSlimeMimic,"While completely covered in slime and not moving, your visibility is reduced considerably." +KinkyDungeonSpellDescriptionSlimeMimic,"While standing still on slime, or fully bound with at least one latex item, you are harder to notice. Each latex restraint you are wearing increases this amount. Can be toggled off by clicking the buff icon." KinkyDungeonSpellStaffUser1,Magical Implements -KinkyDungeonSpellDescriptionStaffUser1,"While holding a magical weapon like a staff or enchanted knife, your mana costs are reduced by 20%." +KinkyDungeonSpellDescriptionStaffUser1,"While holding a magical weapon like a staff or magic knife, your mana costs are reduced by 20%." KinkyDungeonSpellStaffUser2,Mage Circuits -KinkyDungeonSpellDescriptionStaffUser2,"Increases the size of the passive mana pool by +100." +KinkyDungeonSpellDescriptionStaffUser2,"Increases the size of the passive mana pool by +400." KinkyDungeonSpellStaffUser3,Archmage KinkyDungeonSpellDescriptionStaffUser3,"Upcasted spells cost 25% less mana." @@ -5124,7 +6374,7 @@ KinkyDungeonSpellDescriptionTemperaturePlay,"Fire and Ice damage do 30% more dam KinkyDungeonSpellBurning,Fire Hazard KinkyDungeonSpellDescriptionBurning,"Fire damage ignites enemies for 5 damage per turn for 6 turns." KinkyDungeonSpellIcePrison,Frozen Prison -KinkyDungeonSpellDescriptionIcePrison,"Freezing an enemy applies 10% of the enemy's max hp in binding, plus 10 per turn of freeze." +KinkyDungeonSpellDescriptionIcePrison,"Freezing an enemy applies 10 binding per turn of freeze added, plus brings the enemy to a minimum of 20% binding." KinkyDungeonSpellLightningRod,Lightning Rod KinkyDungeonSpellDescriptionLightningRod,"After casting an Air or Storm spell that costs mana, become Conductive and gain 300% electric resist for 3 turns." KinkyDungeonSpellFrustration,Frustration @@ -5152,43 +6402,31 @@ KinkyDungeonSpellSpellChoiceUp3,Legendary Wizard KinkyDungeonSpellDescriptionSpellChoiceUp3,Gives you an additional spell choice slot KinkyDungeonSpellSummonUp1,More Summons -KinkyDungeonSpellDescriptionSummonUp1,Increases the permanent summon cap by +1 (from 2 to 3) +KinkyDungeonSpellDescriptionSummonUp1,Increases the permanent summon cap by +2 (from 2 to 4) KinkyDungeonSpellSummonUp2,Many Summons -KinkyDungeonSpellDescriptionSummonUp2,Increases the permanent summon cap by +1 (from 3 to 4) +KinkyDungeonSpellDescriptionSummonUp2,Increases the permanent summon cap by +2 (from 4 to 6) -KinkyDungeonSpellBomb,Bomb -KinkyDungeonSpellDescriptionBomb,Channel for 1 turn for a bomb that does DamageDealt fire damage in an area after DelayTime turns. +KinkyDungeonSpellBomb,Summon Bomb +KinkyDungeonSpellBombItem,Bomb +KinkyDungeonSpellDescriptionBomb,Channel for 1 turn for a bomb that does DamageDealt blast damage in an area after DelayTime turns. KinkyDungeonSpellCastBomb,Fire in the hole! KinkyDungeonSpellTargetBomb,Choose target AoE location -KinkyDungeonSpellSnare,Rope Snare -KinkyDungeonSpellDescriptionSnare,An invisible trap on the ground that stuns anyone who walks on it for Duration turns and applies 150 points of binding. -KinkyDungeonSpellCastSnare,You set an invisible trap! -KinkyDungeonSpellTargetSnare,Select where to put the trap (it will be invisible) + +KinkyDungeonSpellSnare,Rope Rune +KinkyDungeonSpellRopeRuneStrike,Rope Rune +KinkyDungeonSpellDescriptionSnare,"An AoE trap on the ground that deals 25 chain damage, roots for 8 turns, and applies 80 points of binding. Takes 3 turns to setup. 200% crit multiplier." +KinkyDungeonSpellCastSnare,You conjure a rope trap! +KinkyDungeonSpellTargetSnare,Choose location for trap KinkyDungeonSpellRopeStrike,Rope Burst -KinkyDungeonSpellDescriptionRopeStrike,An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 40 points of rope binding. Snares for Duration turns. +KinkyDungeonSpellDescriptionRopeStrike,An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 50 points of rope binding. Snares for Duration turns. KinkyDungeonSpellCastRopeStrike,You call forth ropes from the abyss! KinkyDungeonSpellTargetRopeStrike,Select center of a a 3x3 AoE KinkyDungeonSpellLeatherBurst,Leather Package KinkyDungeonSpellDescriptionLeatherBurst,"After conjuring a leather restraint, you can conjure up to three more without advancing time." -KinkyDungeonSpellSummonGag,Conjure Gag -KinkyDungeonSpellGagBolt,Conjured Gag -KinkyDungeonSpellGagBoltBind,The gag forces itself into your mouth and buckles tightly! -KinkyDungeonSpellGagBoltDamage,The gag hits you! (DamageDealt) -KinkyDungeonSpellDescriptionSummonGag,"Summons a gag which deals DamageDealt chain damage and silences for 15 turns. +40 binding if target is not silenced." -KinkyDungeonSpellCastSummonGag,You conjure a gag! -KinkyDungeonSpellTargetSummonGag,The gag will appear next to you and fly toward the target point. - -KinkyDungeonSpellSummonArmbinder,Conjure Armbinder -KinkyDungeonSpellArmbinderBolt,Conjured Armbinder -KinkyDungeonSpellArmbinderBoltBind,The armbinder slips itself around your arms and buckles itself tightly! -KinkyDungeonSpellArmbinderBoltDamage,The armbinder hits you! (DamageDealt) -KinkyDungeonSpellDescriptionSummonArmbinder,"Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Blinded/Silenced targets are silenced/blinded for the same time." -KinkyDungeonSpellCastSummonArmbinder,You conjure a armbinder! -KinkyDungeonSpellTargetSummonArmbinder,The armbinder will appear next to you and fly toward the target point. KinkyDungeonSpellSummonLeatherCuffs,Conjure Leather Cuffs KinkyDungeonSpellLeatherCuffsBolt,Conjured Leather Cuffs @@ -5202,7 +6440,7 @@ KinkyDungeonSpellSummonBlindfold,Conjure Blindfold KinkyDungeonSpellBlindfoldBolt,Conjured Blindfold KinkyDungeonSpellBlindfoldBoltBind,The blindfold wraps around your head and buckles tightly! KinkyDungeonSpellBlindfoldBoltDamage,The blindfold hits you! (DamageDealt) -KinkyDungeonSpellDescriptionSummonBlindfold,"Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not silenced." +KinkyDungeonSpellDescriptionSummonBlindfold,"Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not blinded." KinkyDungeonSpellCastSummonBlindfold,You conjure a blindfold! KinkyDungeonSpellTargetSummonBlindfold,The blindfold will appear next to you and fly toward the target point. @@ -5215,20 +6453,83 @@ KinkyDungeonSpellCastSummonCuffs,You conjure a pair of cuffs! KinkyDungeonSpellTargetSummonCuffs,The cuffs will appear next to you and fly toward the target point. +KinkyDungeonSpellSummonGag,Conjure Gag +KinkyDungeonSpellGagBolt,Conjured Gag +KinkyDungeonSpellGagBoltBind,The gag forces itself into your mouth and buckles tightly! +KinkyDungeonSpellGagBoltDamage,The gag hits you! (DamageDealt) +KinkyDungeonSpellDescriptionSummonGag,"Summons a gag which deals DamageDealt chain damage and silences for 8 turns. +40 binding if target is not silenced." +KinkyDungeonSpellCastSummonGag,You conjure a gag! +KinkyDungeonSpellTargetSummonGag,The gag will appear next to you and fly toward the target point. + + +KinkyDungeonSpellSummonAMGag,Conjure Anti-Magic Gag +KinkyDungeonSpellAMGagBolt,Conjured Anti-Magic Gag +KinkyDungeonSpellAMGagBoltBind,The anti-magic gag forces itself into your mouth and buckles tightly! +KinkyDungeonSpellAMGagBoltDamage,The anti-magic gag hits you! (DamageDealt) +KinkyDungeonSpellDescriptionSummonAMGag,"Summons a magic-absorbing gag which deals DamageDealt teasing arcane damage and silences for 15 turns. Applies a debuff that increases miscast chance by 50%." +KinkyDungeonSpellCastSummonAMGag,You conjure an anti-magic gag! +KinkyDungeonSpellTargetSummonAMGag,The gag will appear next to you and fly toward the target point. + + +KinkyDungeonSpellSummonArmbinder,Conjure Armbinder +KinkyDungeonSpellArmbinderBolt,Conjured Armbinder +KinkyDungeonSpellArmbinderBoltBind,The armbinder slips itself around your arms and buckles itself tightly! +KinkyDungeonSpellArmbinderBoltDamage,The armbinder hits you! (DamageDealt) +KinkyDungeonSpellDescriptionSummonArmbinder,"Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Cannot be blocked." +KinkyDungeonSpellCastSummonArmbinder,You conjure a armbinder! +KinkyDungeonSpellTargetSummonArmbinder,The armbinder will appear next to you and fly toward the target point. + KinkyDungeonSpellSummonLegbinder,Conjure Legbinder KinkyDungeonSpellLegbinderBolt,Conjured Legbinder KinkyDungeonSpellLegbinderBoltBind,The legbinder slips itself around your legs and buckles itself tightly! KinkyDungeonSpellLegbinderBoltDamage,The legbinder hits you! (DamageDealt) -KinkyDungeonSpellDescriptionSummonLegbinder,"Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared." +KinkyDungeonSpellDescriptionSummonLegbinder,"Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked." KinkyDungeonSpellCastSummonLegbinder,You conjure a legbinder! KinkyDungeonSpellTargetSummonLegbinder,The legbinder will appear next to you and fly toward the target point. +KinkyDungeonSpellSummonLatexGag,Conjure Latex Gag +KinkyDungeonSpellLatexGagBolt,Conjured Latex Gag +KinkyDungeonSpellEnemyLatexGagBolt,Latex Gag +KinkyDungeonSpellEnemyLatexRestraintBolt,Latex Glob +KinkyDungeonSpellLatexGagBoltBind,The gag forces itself into your mouth and snaps on tightly! +KinkyDungeonSpellEnemyLatexGagBoltBind,The gag forces itself into your mouth and snaps on tightly! +KinkyDungeonSpellEnemyLatexRestraintBoltBind,The amorphous rubber stretches out into a restraint on your body! +KinkyDungeonSpellLatexGagBoltDamage,The gag hits you! (DamageDealt) +KinkyDungeonSpellEnemyLatexGagBoltDamage,The gag hits you! (DamageDealt) +KinkyDungeonSpellEnemyLatexRestraintBoltDamage,The amorphous rubber sticks to you! (DamageDealt) +KinkyDungeonSpellDescriptionSummonLatexGag,"Summons a gag which deals DamageDealt glue damage and silences for 15 turns. +40 binding if target is not silenced." +KinkyDungeonSpellCastSummonLatexGag,You conjure a gag! +KinkyDungeonSpellTargetSummonLatexGag,The gag will appear next to you and fly toward the target point. + +KinkyDungeonSpellSummonLatexArmbinder,Conjure Latex Armbinder +KinkyDungeonSpellLatexArmbinderBolt,Conjured Latex Armbinder +KinkyDungeonSpellEnemyLatexArmbinderBolt,Latex Armbinder +KinkyDungeonSpellLatexArmbinderBoltBind,The armbinder slips itself around your arms and buckles itself tightly! +KinkyDungeonSpellLatexArmbinderBoltDamage,The armbinder hits you! (DamageDealt) +KinkyDungeonSpellEnemyLatexArmbinderBoltBind,The armbinder slips itself around your arms and snaps on tightly! +KinkyDungeonSpellEnemyLatexArmbinderBoltDamage,The armbinder hits you! (DamageDealt) +KinkyDungeonSpellDescriptionSummonLatexArmbinder,"Summons an armbinder which deals DamageDealt glue damage and disarms for 13 turns. Cannot be blocked." +KinkyDungeonSpellCastSummonLatexArmbinder,You conjure a armbinder! +KinkyDungeonSpellTargetSummonLatexArmbinder,The armbinder will appear next to you and fly toward the target point. + +KinkyDungeonSpellSummonLatexLegbinder,Conjure Latex Legbinder +KinkyDungeonSpellLatexLegbinderBolt,Conjured Latex Legbinder +KinkyDungeonSpellEnemyLatexLegbinderBolt,Latex Legbinder +KinkyDungeonSpellLatexLegbinderBoltBind,The legbinder slips itself around your legs and buckles itself tightly! +KinkyDungeonSpellLatexLegbinderBoltDamage,The legbinder hits you! (DamageDealt) +KinkyDungeonSpellEnemyLatexLegbinderBoltBind,The legbinder slips itself around your legs and snaps on tightly! +KinkyDungeonSpellEnemyLatexLegbinderBoltDamage,The legbinder hits you! (DamageDealt) +KinkyDungeonSpellDescriptionSummonLatexLegbinder,"Summons a legbinder which deals DamageDealt glue damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked." +KinkyDungeonSpellCastSummonLatexLegbinder,You conjure a legbinder! +KinkyDungeonSpellTargetSummonLatexLegbinder,The legbinder will appear next to you and fly toward the target point. + + KinkyDungeonSpellSummonStraitjacket,Conjure Straitjacket KinkyDungeonSpellStraitjacketBolt,Conjured Straitjacket KinkyDungeonSpellStraitjacketBoltBind,The straitjacket slips itself around your body and pulls your arms into its sleeves! KinkyDungeonSpellStraitjacketBoltDamage,The straitjacket hits you! (DamageDealt) -KinkyDungeonSpellDescriptionSummonStraitjacket,"Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns." +KinkyDungeonSpellDescriptionSummonStraitjacket,"Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. Cannot be blocked." KinkyDungeonSpellCastSummonStraitjacket,You conjure a straitjacket! KinkyDungeonSpellTargetSummonStraitjacket,The straitjacket will appear next to you and fly toward the target point. @@ -5237,7 +6538,7 @@ KinkyDungeonSpellSummonHarness,Conjure Harness KinkyDungeonSpellHarnessBolt,Conjured Harness KinkyDungeonSpellHarnessBoltBind,The harness slips itself around your torso and squeezes tightly as each buckle secures itself one by one! KinkyDungeonSpellHarnessBoltDamage,The harness hits you! (DamageDealt) -KinkyDungeonSpellDescriptionSummonHarness,"Summons a harness which deals DamageDealt crush damage. Adds +50 binding per 25% binding level on target, up to +200." +KinkyDungeonSpellDescriptionSummonHarness,"Summons a harness which deals DamageDealt chain damage. Adds +50 binding per 25% binding level on target, up to +200." KinkyDungeonSpellCastSummonHarness,You conjure a harness! KinkyDungeonSpellTargetSummonHarness,The harness will appear next to you and fly toward the target point. @@ -5266,40 +6567,46 @@ NamePetDisplay,Display Doll KillPetDisplay,The enemy steals your doll from you! KinkyDungeonSpellPetsuit,Conjure Petsuit -KinkyDungeonSpellDescriptionPetsuit,"Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery." +KinkyDungeonSpellDescriptionPetsuit,"Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery from mana pool." KinkyDungeonSpellCastPetsuit,"You conjure an enchanted petsuit which wraps around your target, forcing her to follow you!" KinkyDungeonSpellCastSelfPetsuit,"You watch in horror as your own creation lunges toward you, binding your hands and feet!" KinkyDungeonSpellTargetPetsuit,Choose a helpless target KinkyDungeonSpellDisplayStand,Conjure Display Stand -KinkyDungeonSpellDescriptionDisplayStand,"Target only Helpless enemies. Creates a fixture that increases passive mana recovery, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage." +KinkyDungeonSpellDescriptionDisplayStand,"Target only Helpless enemies. Creates a fixture that increases passive mana recovery from mana pool, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage." KinkyDungeonSpellCastDisplayStand,"You conjure a fixture to hold your helpless target in place!" -KinkyDungeonSpellCastSelfDisplayStand,"You watch in horror as your own creation surrounds you, locking you in place with a hefty click!" +KinkyDungeonSpellCastSelfDisplayStand,"You watch in horror as your own creation encircles you, locking you in place with a hefty click!" KinkyDungeonSpellTargetDisplayStand,Choose a helpless target KinkyDungeonSpellFlash,Lesser Flash -KinkyDungeonSpellRing,Ring KinkyDungeonSpellFlashBomb,Flash Bomb +KinkyDungeonSpellSmokeBomb,Smoke Bomb KinkyDungeonSpellEnemyFlash,Sparkles! KinkyDungeonSpellMirrorImage,Mirror Image KinkyDungeonSpellCastMirrorImage,"" -KinkyDungeonSpellDescriptionFlash,A flash of light which renders anyone caught within blind for Duration turns +KinkyDungeonSpellDescriptionFlash,A flash of light which renders anyone caught within blind for 7 turns KinkyDungeonSpellCastFlash,You charge up a bright flash! KinkyDungeonSpellTargetFlash,Select where to center the flash (SpellArea radius) -KinkyDungeonSpellDescriptionRing,A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged. +KinkyDungeonSpellRing,Ring +KinkyDungeonSpellDescriptionRing,A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged with a 3 turn delay. KinkyDungeonSpellCastRing,You point and a noise emanates from the location! KinkyDungeonSpellTargetRing,Select where to center the noise (SpellArea radius) +KinkyDungeonSpellHolyBlaze,Holy Blaze +KinkyDungeonSpellDescriptionHolyBlaze,Call down a 3x3 area of DamageDealt holy damage. Blinds enemies for 3 turns (and also yourself). +KinkyDungeonSpellCastHolyBlaze,You summon a divine aura! +KinkyDungeonSpellTargetHolyBlaze,Select where to center the blast (SpellArea radius) + KinkyDungeonSpellGreaterFlash,Greater Flash -KinkyDungeonSpellDescriptionGreaterFlash,A massive flash of light which renders anyone caught within blind for Duration turns +KinkyDungeonSpellDescriptionGreaterFlash,A massive flash of light which renders anyone caught within blind for 16 turns and stuns briefly. KinkyDungeonSpellCastGreaterFlash,You charge up a bright flash! KinkyDungeonSpellTargetGreaterFlash,Select where to center the flash (SpellArea radius) KinkyDungeonSpellFocusedFlash,Focused Flash KinkyDungeonSpellTargetFocusedFlash,Select where to center the flash (SpellArea radius) -KinkyDungeonSpellDescriptionFocusedFlash,A focused flash of light which renders anyone caught within blind for Duration turns +KinkyDungeonSpellDescriptionFocusedFlash,A focused flash of light which renders anyone caught within blind for 30 turns and stuns for Duration turns. KinkyDungeonSpellCastFocusedFlash,You slowly charge up a powerful flash! KinkyDungeonSpellShroud,Shroud @@ -5311,7 +6618,7 @@ KinkyDungeonSpellCastShroud,You exhale a misty shroud KinkyDungeonSpellInvisibility,Invisibility KinkyDungeonSpellTargetInvisibility,Select which creature to buff -KinkyDungeonSpellDescriptionInvisibility,Make the targeted creature invisible, increasing stealth for Duration turns +KinkyDungeonSpellDescriptionInvisibility,"Make the targeted creature invisible, increasing stealth for Duration turns" KinkyDungeonSpellCastInvisibility,You snap your fingers! KinkyDungeonSpellLockdown,CMD: Lock @@ -5321,14 +6628,14 @@ KinkyDungeonSpellCastLockdown,"You say a command word, and magical locks bind yo KinkyDungeonSpellChastity,Chastity KinkyDungeonSpellTargetChastity,Select which creature to lock in a belt -KinkyDungeonSpellDescriptionChastity,"Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs and distracts constantly." +KinkyDungeonSpellDescriptionChastity,"Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs/toys, and distracts constantly." KinkyDungeonSpellCastChastity,"You conjure a chastity belt, which latches onto your target!" KDZoneOfPuritySelf,"Your own spell locks you in chastity!" KDZoneOfExcitementSelf,"Something fun enters your body..." KinkyDungeonSpellZoneOfPurity,Zone of Purity KinkyDungeonSpellTargetZoneOfPurity,Select an area -KinkyDungeonSpellDescriptionZoneOfPurity,"Creates an area which applies Chastity constantly to any enemy over 50% bondage that steps inside." +KinkyDungeonSpellDescriptionZoneOfPurity,"Creates an area which applies Chastity constantly to any enemy over with any amount of binding that steps inside." KinkyDungeonSpellCastZoneOfPurity,"You conjure a realm of absolute purity." KinkyDungeonSpellZoneOfExcitement,Zone of Excitement @@ -5387,7 +6694,7 @@ KinkyDungeonSpellAwaken,Awaken KinkyDungeonSpellAwakenStrike,Awaken KinkyDungeonSpellAwakenStrikeBind,The slime awakens and turns on you!!! KinkyDungeonSpellTargetAwaken,Select area to awaken -KinkyDungeonSpellDescriptionAwaken,"Activates the slime in an area, causing it to deal DamageDealt glue damage. Encases fully bound targets." +KinkyDungeonSpellDescriptionAwaken,"Activates the slime in an area, causing it to deal 25 glue damage. Encases fully bound targets." KinkyDungeonSpellCastAwaken,"You command the slime to draw in targets!" KinkyDungeonSpellCommandBind,CMD: Bind @@ -5397,25 +6704,31 @@ KinkyDungeonSpellCastCommandBind,"You say a command word, and the bindings on th KinkyDungeonSpellCommandWord,CMD: Unlock KinkyDungeonSpellTargetCommandWord,Select which creature to unlock -KinkyDungeonSpellDescriptionCommandWord,"On yourself: Removes all purple locks. On a creature: Reduces the target's binding by 20 points." +KinkyDungeonSpellDescriptionCommandWord,"On yourself: Removes one purple (magical) lock. On a creature: Reduces the target's binding by 20 points." KinkyDungeonSpellCastCommandWord,You speak a command word! KDCommandWordFail_NoLocks,None of the locks you are wearing respond to your magic. KDCommandWordFail_NoEnemy,You can't help her with this. KDCommandWordFail_NoTarget,"You must target yourself, an enemy, or a locked object." +KDCommandWordFail_Miscast,"The command is intricate and you are unable to enunciate it properly!" + +KinkyDungeonSpellCommandWordGreater,CMD: Greater Unlock +KinkyDungeonSpellTargetCommandWordGreater,Select which creature to unlock +KinkyDungeonSpellDescriptionCommandWordGreater,"On yourself: Removes all purple (magical) locks. On a creature: Reduces the target's binding by 100 points." +KinkyDungeonSpellCastCommandWordGreater,You speak a powerful command word! KinkyDungeonSpellLesserInvisibility,Lesser Invisibility KinkyDungeonSpellTargetLesserInvisibility,Select which creature to buff -KinkyDungeonSpellDescriptionLesserInvisibility,Make the targeted creature invisible, increasing stealth for Duration turns +KinkyDungeonSpellDescriptionLesserInvisibility,"Make the targeted creature invisible, increasing stealth for Duration turns" KinkyDungeonSpellCastLesserInvisibility,You become semitransparent! KinkyDungeonSpellCamo,Camouflage KinkyDungeonSpellTargetCamo,Select yourself -KinkyDungeonSpellDescriptionCamo,"Enemies have a harder time noticing you for Duration turns. Cancels if you move, cast, or sleep." +KinkyDungeonSpellDescriptionCamo,"Enemies have a harder time noticing you for Duration turns. Cancels if you move (unless you are near a wall), cast, or sleep." KinkyDungeonSpellCastCamo,You pose in a clandestine manner. KinkyDungeonSpellShadowBlade,Darkblade KinkyDungeonSpellTargetShadowBlade,Select which creature to buff -KinkyDungeonSpellDescriptionShadowBlade,Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks, whichever is lower. +KinkyDungeonSpellDescriptionShadowBlade,"Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks, whichever is lower." KinkyDungeonSpellCastShadowBlade,You call forth dark runes on your weapon and arms! KinkyDungeonSpellHeal2,Heal @@ -5424,14 +6737,23 @@ KinkyDungeonSpellDescriptionHeal2,Restore 45 hitpoints to an allied creature. KinkyDungeonSpellCastHeal2,You utter a word of healing. KinkyDungeonSpellFlameBlade,Flame Blade -KinkyDungeonSpellDescriptionFlameBlade,When enabled: Weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. +KinkyDungeonSpellDescriptionFlameBlade,When enabled: Melee weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. KinkyDungeonSpellFlameStrike,Flame Blade -KinkyDungeonSpellEngulf,Engulf -KinkyDungeonSpellDescriptionEngulf,When enabled: Your melee attacks deal +20 glue damage and create slime. +KinkyDungeonSpellEngulf,Tentacle Slap +KinkyDungeonSpellDescriptionEngulf,You have the power to make tentacles out of slime when you attack. When enabled: Your attacks deal +10 glue damage and create slime. 150% bind efficiency. -KinkyDungeonSpellStrength,Strengthen -KinkyDungeonSpellDescriptionStrength,"When enabled: Struggling is more powerful, and your attack damage is increased by +20 if your weapon deals physical damage." +KinkyDungeonSpellChainStrike,Chain Strike +KinkyDungeonSpellDescriptionChainStrike,You have the power to summon chains when you attack. When enabled: Your attacks deal +10 chain damage and create chains. 125% bind efficiency. + +KinkyDungeonSpellRopework,Ropework +KinkyDungeonSpellDescriptionRopework,You have the power to weave ropes between your attacks. When enabled: Your attacks deal +10 chain damage and create ropes. 400% bind efficiency. + +KinkyDungeonSpellLeatherWhip,Leather Whip +KinkyDungeonSpellDescriptionLeatherWhip,You have the power to strike with conjured belts when you attack. When enabled: Your attacks deal +10 pain damage and create belts. 250% bind efficiency. + +KinkyDungeonSpellStrength,Super Strength +KinkyDungeonSpellDescriptionStrength,"When enabled: Struggling is more powerful, and your melee attack damage is increased by +20 if your weapon deals physical damage." KinkyDungeonSpellStrengthStruggle,Your body glows with magical energy! KinkyDungeonSpellWillpower,Enhance Will @@ -5441,14 +6763,12 @@ KinkyDungeonSpellStrengthWillpower,You focus intently! KinkyDungeonSpellTrueSight,Truesight KinkyDungeonSpellDescriptionTrueSight,When enabled: Drain mana every turn to see through walls and increase accuracy by 40%. -KinkyDungeonSpellEnemySense,Heartsense -KinkyDungeonSpellDescriptionEnemySense,Highlight the locations of enemies through walls on the map for 12 turns. +KinkyDungeonSpellEnemySense,Echolocation +KinkyDungeonSpellDescriptionEnemySense,"Close your eyes to dramatically improve your hearing and locate enemies through walls." KinkyDungeonSpellLight,Light KinkyDungeonSpellDescriptionLight,"Produce a bright light for Duration turns. Has no effect in dark rooms." -KinkyDungeonSpellFloatingWeapon,Floating Weapon -KinkyDungeonSpellDescriptionFloatingWeapon,"When enabled: While hands are bound, you can still use weapons, but attacks cost mana." KinkyDungeonSpellFleetFooted,Levitate KinkyDungeonSpellDescriptionFleetFooted,"When enabled and above 0 stamina: Drain 5 mana per step to reduce slow level by 1 (if above 1), or 20 mana to ignore a temporary slow effect." @@ -5474,14 +6794,16 @@ KinkyDungeonSpellCastNevermereBoost,"The EnemyName activates the vibrators of ne KinkyDungeonSpellCastDollBoost,"The EnemyName activates the vibrators of nearby dolls, greatly motivating them!" KinkyDungeonSpellCastEarthfield,The EnemyName creates a zone of increased defense! KinkyDungeonSpellCastParasolBuff,"EnemyName uses a charm to buff an enemy's Magic Armor and Evasion!" +KinkyDungeonSpellCastShieldTheWitch,"EnemyName supports a witch with a magical shield!" +KinkyDungeonSpellShieldTheWitch,Shield the Witch! KinkyDungeonSpellCastZombieBuff,"EnemyName uses a glowing talisman to buff an undead's physical armor and speed!" KinkyDungeonSpellCastEarthrune,You create a zone of increased defense! -KinkyDungeonSpellCastWaterrune,You create a protective zone! +KinkyDungeonSpellCastWaterRune,You create a protective zone! KinkyDungeonSpellCastIcerune,You create a fan of icicles! KinkyDungeonSpellWall,Wall KinkyDungeonSpellTargetWall,Select where to put the wall (cannot place on occupied squares) -KinkyDungeonSpellDescriptionWall,Create a stationary wall for Duration turns. It takes 20% damage from spells. +KinkyDungeonSpellDescriptionWall,Create a stationary wall for Duration turns. It takes 20% damage from spells. Cast on an open door to close it and give it additional armor. KinkyDungeonSummonSingleWall,A wall starts to form! KinkyDungeonSpellCastWall,You create a line on the ground. @@ -5532,6 +6854,12 @@ KinkyDungeonSpellDescriptionShadowWarrior,Call forth a shadow warrior for 16 tur KinkyDungeonSummonSingleShadowWarrior,...and the abyss answers! KinkyDungeonSpellCastShadowWarrior,You call... +KinkyDungeonSpellNatureSpirit,Summon Nature Spirit +KinkyDungeonSpellTargetNatureSpirit,Select where to put the nature spirit (cannot place on occupied squares) +KinkyDungeonSpellDescriptionNatureSpirit,Create a natural spirit that fires vine projectiles and has a healing aura that restores HP to allies and regenerates your stamina. +KinkyDungeonSummonSingleNatureSpirit,A healing wisp appears! +KinkyDungeonSpellCastNatureSpirit,You call upon the powers of nature! + @@ -5557,7 +6885,6 @@ KinkyDungeonSpellCastFailElasticGrip,There's an obstacle in the way! KinkyDungeonSpellTargetElasticGrip,Select a target to pull KinkyDungeonSpellSlime,Slime Blast -KinkyDungeonSpellSlimePuddle,Apprentice's Slime KinkyDungeonSpellWitchSlime,Witch's Slime KinkyDungeonSpellRubberSlime,Rubber Explosion KinkyDungeonSpellMiniSlime,Witch's Slime Ball @@ -5567,7 +6894,7 @@ KinkyDungeonSpellCastSlime,You conjure a pool of slime! KinkyDungeonSpellTargetSlime,Select where the slime will appear KinkyDungeonSpellSlimeEruption,Slime Eruption -KinkyDungeonSpellDescriptionSlimeEruption,A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them friefly. +KinkyDungeonSpellDescriptionSlimeEruption,A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them briefly. KinkyDungeonSpellCastSlimeEruption,You conjure an explosion of slime! KinkyDungeonSpellTargetSlimeEruption,Select where the slime will appear @@ -5578,12 +6905,12 @@ KinkyDungeonSpellTargetSlimeSplash,Select where the slime will appear KinkyDungeonSpellWaterBall,Water Ball -KinkyDungeonSpellDescriptionWaterBall,"Fast projectile. Deals DamageDealt acid damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage." +KinkyDungeonSpellDescriptionWaterBall,"Fast projectile. Deals DamageDealt soap damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage." KinkyDungeonSpellCastWaterBall,You hurl a ball of water! KinkyDungeonSpellTargetWaterBall,Choose aim direction KinkyDungeonSpellTidalBall,Tidal Sphere -KinkyDungeonSpellDescriptionTidalBall,"Slow moving projectile, deals DamageDealt acid damage to enemies it passes thru. Leaves a large amount of water in its wake." +KinkyDungeonSpellDescriptionTidalBall,"Slow moving projectile, deals DamageDealt soap damage to enemies it passes thru. Leaves a large amount of water in its wake." KinkyDungeonSpellCastTidalBall,You raise a huge mass of water! KinkyDungeonSpellTargetTidalBall,Choose aim direction @@ -5596,11 +6923,7 @@ KinkyDungeonSpellDescriptionIceBreath,A field of icicles that deals DamageDealt KinkyDungeonSpellCastIceBreath,You breath out a chilling frost! KinkyDungeonSpellTargetIceBreath,Select where to put the icicles (SpellArea radius) -KinkyDungeonSpellZombieOrb,Zombie Orb -KinkyDungeonSpellZombieOrbMini,Lesser Zombie Orb -KinkyDungeonSpellZombieOrbIce,Freezing Zombie Orb -KinkyDungeonSpellMummyBolt,Mystic Bolt -KinkyDungeonMysticShock,The mystic bolt paralyzes you! +KinkyDungeonMysticShock,The mummy's curse paralyzes you! KinkyDungeonSpellRubberBullets,Rubber Bullets KinkyDungeonRubberBullets,You are hit by a fusilade of rubber bullets! @@ -5616,21 +6939,19 @@ KinkyDungeonSpellSlimethrower2,Slime KinkyDungeonSpellCastSlimethrower,You project a pool of sticky slime! KinkyDungeonSpellHeartArrow,Arrow of Love KinkyDungeonSpellCastHeartArrow,You loose a glowing arrow! -KinkyDungeonSpellBondageBustBeam,Bondage Buster +KinkyDungeonSpellBondageBustBeam,Bondage Buster EX +KinkyDungeonSpellBondageBust,Bondage Buster EX KinkyDungeonSpellEnemyBlast,Blaster KinkyDungeonSpellCastBondageBust,You charge up a beam and fire it! KinkyDungeonSpellCastDisarm,You swing your weapon and pull away the target's equipment! KinkyDungeonSpellCastBeltStrike,You swing Dragonslaver and it lashes out in a whip-like fashion! KinkyDungeonSpellCastSlimeForm,"The slime from your staff coats your body, granting you strange powers!" KinkyDungeonSpellCastAvatarForm,"The power of the four elements flows through your veins!" -KinkyDungeonSpellHeatBolt,Firebolt KinkyDungeonHeatBlast,An explosion knocks you to the ground! KinkyDungeonSpellHighBolt,Curious Spell KinkyDungeonFlummox,You have been flummoxed! -KinkyDungeonSpellNurseBola,Cuff Bola -KinkyDungeonSpellNurseSyringe,Throw Syringe KinkyDungeonNurseSyringe,"You feel a prick as a small syringe hits you, and you start feeling drowsy..." KinkyDungeonNurseBola,"The thrown cuffs snap shut around your ankles and slow you down!!!" KinkyDungeonSpellRibbonBurst,Ribbon Burst @@ -5651,7 +6972,7 @@ KinkyDungeonSpellIceSlowBreath,Icy Aura KinkyDungeonSpellSlimeBall,Slime Ball KinkyDungeonSpellWitchSlimeBall,Witch's Slime Ball -KinkyDungeonSpellDescriptionSlimeBall,A ball of slime leaves a trail of sticky slime (40 damage when stepped on). It deals DamageDealt glue damage on a hit. +KinkyDungeonSpellDescriptionSlimeBall,A ball of slime leaves a trail of sticky slime (20 damage when stepped on). It deals DamageDealt glue damage on a hit. KinkyDungeonSpellCastSlimeBall,You hurl a ball of slime! KinkyDungeonSpellTargetSlimeBall,Choose aim direction @@ -5664,12 +6985,22 @@ KinkyDungeonSummonMultiPlayerGag,A bunch of gags fly out from your satchel! KinkyDungeonSummonSingleTickleHand,A floating hand appears and cracks its knuckles! KinkyDungeonSummonSingleGag,A floating gag appears and starts flying toward you! +KinkyDungeonSummonSingleAnimBlindfold,A floating blindfold appears and starts flying toward you! +KinkyDungeonSummonSingleAnimYoke,A floating yoke appears and starts flying toward you! +KinkyDungeonSummonSingleAnimChastity,A floating armbinder appears and starts flying toward you! +KinkyDungeonSummonSingleAnimStraitjacket,A floating straitjacket appears and starts flying toward you! +KinkyDungeonSummonSingleAnimHarness,A floating harness appears and starts flying toward you! KinkyDungeonSummonSingleCuffs,A set of shackles opens wide and starts going for your wrists! KinkyDungeonSummonMultiCuffs,A swarm of shackles approaches you! +KinkyDungeonSummonMultiGags,A swarm of gags approaches you! KinkyDungeonSummonSingleLock,A cloud of locks and chains clatters as it levitates toward you! KinkyDungeonSummonMultiLock,A huge cloud of locks and chains clatters as it levitates toward you! KinkyDungeonSummonMultiTickleHand,Floating hands appear by the conjurer's side as she points her staff! +KinkyDungeonSummonMultiBookChain,Floating books appear near the caster! +KinkyDungeonSummonMultiBookBelt,Floating books appear near the caster! +KinkyDungeonSummonMultiBookRope,Floating books appear near the caster! +KinkyDungeonSummonMultiBookBondage,Floating books appear near the caster! KinkyDungeonSummonMultiBookChain,Floating books appear near the caster! KinkyDungeonSummonMultiBookNature,Dusty tomes appear near the caster! KinkyDungeonSummonMultiBookArcane,Magical books appear near the caster! @@ -5682,6 +7013,9 @@ KinkyDungeonSummonMultiBookIce,Frigid books appear near the caster! KinkyDungeonSummonMultiBookTickle,Devilish books appear near the caster! KinkyDungeonSummonSingleBookChain,A floating book appears near the caster! +KinkyDungeonSummonSingleBookRope,A floating book appears near the caster! +KinkyDungeonSummonSingleBookBelt,A floating book appears near the caster! +KinkyDungeonSummonSingleBookBondage,A floating book appears near the caster! KinkyDungeonSummonSingleBookNature,A dusty tome appears near the caster! KinkyDungeonSummonSingleBookArcane,A magical book appears near the caster! KinkyDungeonSummonSingleBookForbidden,A sinister book appears near the caster! @@ -5706,14 +7040,16 @@ KinkyDungeonSpellCastFromBook,Cast Spell (XXX turn delay) KinkyDungeonEndVibeCease,You feel the vibrations leaving your body... KinkyDungeonStartVibe,You feel your toys start to buzz... KinkyDungeonStartVibeContinue,You your toys continue to buzz... -KinkyDungeonStartVibeRemote,The EnemyName remotely causes your toys to to buzz!!! +KinkyDungeonStartVibeRemote,The EnemyName remotely causes your toys to buzz!!! KinkyDungeonPlugged,You feel the plugs inside you while walking. -KinkyDungeonVibing0,You feel a gentle buzz... -KinkyDungeonVibing1,Your toys tease you gently... -KinkyDungeonVibing2,"Your toys vibrate noticeably, feeling quite good..." +KinkyDungeonVibing0,Your toys pulse and tingle occasionally. +KinkyDungeonVibing1,Your toys tease you and buzz gently... +KinkyDungeonVibing2,"Your vibrating toys are difficult to ignore..." KinkyDungeonVibing3,"Your toys buzz strongly, making it difficult to concentrate!" KinkyDungeonVibing4,"You tremble as the toys give off intense vibrations!" -KinkyDungeonVibing5,"Your toys torture you with intense vibrations!" +KinkyDungeonVibing5,"Your toys torture you with intense pulsations!" +KinkyDungeonVibing6,"Your whole body resonates with the intense stimulation!" +KinkyDungeonVibing7,"The stimulation is so intense you can hardly breath!" KinkyDungeonEndVibe,Your toys stop vibrating. KinkyDungeonPlugWalk0,You feel slightly full as you move... KinkyDungeonPlugWalk1,Your movement disturbs the plugs inside of you... @@ -5726,7 +7062,11 @@ KinkyDungeonSlowed3,The massive plugs rub(s) around inside of you as you hobble KinkyDungeonHopping0,You hop forward! KinkyDungeonHopping1,You hop and feel the plugs shifting around inside your body. KinkyDungeonHopping2,The plugs shift in and out with each hop... -KinkyDungeonHopping3,The massive plugs slide in and out mercilessly as you hop... +KinkyDungeonHopping3,The massive plugs slide in and out sensually as you hop... +KinkyDungeonHoppingCrouch0,You crawl forward! +KinkyDungeonHoppingCrouch1,You crawl and feel the plugs shifting around inside your body. +KinkyDungeonHoppingCrouch2,The plugs shift in and out as you crawl... +KinkyDungeonHoppingCrouch3,The massive plugs slide in and out sensually as you crawl... KinkyDungeonInching0,You inch forward slowly! KinkyDungeonInching1,"You inch forward, feeling the movement of your plugs." KinkyDungeonInching2,"You wiggle your hips inching forward, feeling the plugs inside you..." @@ -5759,22 +7099,39 @@ KinkyDungeonGagMumbleAroused5,Mmm~ KinkyDungeonGagMumbleAroused6,Mmmmm~~ KinkyDungeonGagMumbleAroused7,Mmmmmm~~~ + +KinkyDungeonGagRestraint0,Mmph... +KinkyDungeonGagRestraint1,Mmmm! +KinkyDungeonGagRestraint2,MMM!!! + +KinkyDungeonGagStruggleQuiet0,Hmmph. +KinkyDungeonGagStruggleQuiet1,Mmmm... +KinkyDungeonGagStruggleQuiet2,Mmmph. + +KinkyDungeonGagStruggle0,Mmmmmmph!!! +KinkyDungeonGagStruggle1,Gmmmmph! +KinkyDungeonGagStruggle2,Hmmmmph~!! + KinkyDungeonBlindSelf,"You are blinded!" -KinkyDungeonDamageSelf,"You took DamageDealt damage!" -KinkyDungeonMagicRopeSelf,"Your own rope trap springs upon you!" +KinkyDungeonDamageSelf,"You took DamageTaken damage!" KinkyDungeonSlime,"You get caught in sticky slime!" +KinkyDungeonSlimeBubble,"You get caught in a sticky slime bubble!" KinkyDungeonMiniSlime,"The slime ball sticks to you!" KinkyDungeonMiniSlime2,"The slime ball sticks to you and slows you!" KinkyDungeonShock,"You feel a powerful sensation run through your body!" +KinkyDungeonEstim,"You feel a pleasurable sensation run through your body!" KinkyDungeonCoronaShock,"Beams of light wrap around your body and feel warm on your skin!" KinkyDungeonCrystalBind,"Crystals begin to form around your limbs!" -KinkyDungeonSingleChain,"A magic chain secures itself around your body!" +KinkyDungeonSingleMChain,"A magic chain secures itself around your body!" +KinkyDungeonSingleChain,"An animated chain secures itself around your body!" +KinkyDungeonSingleMRope,"A magic rope secures itself around your body!" +KinkyDungeonSingleMBelt,"A magic belt secures itself around your body!" KinkyDungeonSingleRope,"A rope wraps itself around your body!" KinkyDungeonSingleFabric,"A ribbon animates and becomes entwined around you!" KinkyDungeonSingleBelt,"A belt buckles itself tightly around your body!" KinkyDungeonSingleVine,"A vine slithers across your body and tightens!" KinkyDungeonSlowedBySpell,"The spell hits you and slows you down!" -KinkyDungeonSpellWitchRope,"Rope" +KinkyDungeonSpellWitchRope,"Witch's Rope" KinkyDungeonSpellRopeEngulf,"Rope Tendrils" KinkyDungeonSpellSarcoEngulf,"Blessed Wrappings" KinkyDungeonSpellSarcoHex,"The Blessing" @@ -5790,8 +7147,10 @@ KinkyDungeonSpellElfArrow,Elven Arrow KinkyDungeonEnchantedArrow,"The elven arrow flashes and wraps you in mithril ropes!" KinkyDungeonRopeEngulf,"Ropes wrap themselves around your body from all sides!" KinkyDungeonSarcoEngulf,"Wrappings appear and wrap you head to toe!" +KinkyDungeonHexLatex,A spell transforms your wrappings into hexed latex! +KinkyDungeonHexLatexFail,A spell engulfs you in wrappings! KinkyDungeonRopeEngulfWeak,"Ropes wrap themselves around your body from all sides!" -KinkyDungeonVineEngulf,"Nature magic causes vines to sprout around you!" +KinkyDungeonVineEngulf,"Vines sprout around you and grab hold of your limbs!" KinkyDungeonRopeEngulfDress,"Your clothes are stripped and replaced!" KinkyDungeonSarcoEngulfDress,"Your clothes are stripped and replaced!" KinkyDungeonVineEngulfDress,"Vines tear off your clothes!" @@ -5811,8 +7170,14 @@ KinkyDungeonSpellTrapLeatherWeak,Belt Trap KinkyDungeonSpellTrapCableWeak,Cable Trap KinkyDungeonSpellTrapSlimeWeak,Slime Trap KinkyDungeonSpellTrapMagicChainsWeak,Chain Trap +KinkyDungeonSpellTrapShadowLatex,Shadow Latex Trap +KinkyDungeonSpellTrapObsidian,Demonic Sigil +KinkyDungeonSpellTrapCrystal,Unstable Crystals KinkyDungeonSpellTrapLustCloud,Gas Trap KinkyDungeonSpellTrapSCloud,Gas Trap +KinkyDungeonSpellTrapLatex,Latex Engulfment +KinkyDungeonSpellTrapLatexBubble,Latex Engulfment +KinkyDungeonSpellTrapLatexBall,Latex Spherification KinkyDungeonSpellTrapSleepDart,Sleep Dart KinkyDungeonSpellSleepDart,Sleep Dart @@ -5827,9 +7192,16 @@ KinkyDungeonSpellCastTrapLeatherWeak,"Leather restraints start appearing around KinkyDungeonSpellCastTrapCableWeak,"high-tech cables come out from the floor!" KinkyDungeonSpellCastTrapSlimeWeak,"Slimes pours out from the walls and ceiling!" KinkyDungeonSpellCastTrapMagicChainsWeak,"Ethereal chains appear all around you!" -KinkyDungeonSpellCastTrapLustCloud,"You hear the sound of glass breaking, and a cloud of green gas rises around you!" -KinkyDungeonSpellCastTrapSCloud,"You hear the sound of glass breaking, and a cloud of pink gas rises around you!" +KinkyDungeonSpellCastTrapShadowLatex,"Shadows constrict around you!" +KinkyDungeonSpellCastTrapObsidian,"An otherworldly sigil appears below you!" +KinkyDungeonSpellCastTrapCrystal,"Crystals rise up around you!" +KinkyDungeonSpellCastTrapLatex,"Something shiny seems to be stretched out over the floor!" +KinkyDungeonSpellCastTrapLatexBubble,"A rubber bubble starts forming around you!" +KinkyDungeonSpellCastTrapLatexBall,"A rubber ball starts forming around you!" +KinkyDungeonSpellCastTrapLustCloud,"You hear the sound of glass breaking, and a cloud of pink gas rises around you!" +KinkyDungeonSpellCastTrapSCloud,"You hear the sound of glass breaking, and a cloud of green gas rises around you!" KinkyDungeonTrapBindingsCharmWeak,"The charms stick themselves all over your body!" +KinkyDungeonTrapBindingsOneBar,"A metal pole catches you from below!" KinkyDungeonTrapBindingsRibbons,"The ribbons tie themselves tightly around your body and won't let go!" KinkyDungeonTrapBindingsShackleWeak,"Shackles close themselves over your limbs!" KinkyDungeonTrapBindingsMummyWeak,"The wrappings close in over your body!" @@ -5839,22 +7211,30 @@ KinkyDungeonTrapBindingsRopeHoly,"The holy ropes secure themselves upon your bod KinkyDungeonTrapBindingsLeatherWeak,"The leather restraints attach themselves to your body!" KinkyDungeonTrapBindingsCableWeak,"The high-tech cables wrap themselves over your body!" KinkyDungeonTrapBindingsSlimeWeak,"The slime pours all over you!" +KinkyDungeonTrapBindingsLatex,"A giant cube of latex engulfs you!" +KinkyDungeonTrapBindingsLatexBubble,"A giant bubble of latex engulfs you and inflates, sealing you in!" +KinkyDungeonTrapBindingsLatexBall,"A giant latex ball swallows you and inflates, sealing around your neck!" +KinkyDungeonTrapBindingsObsidian,"A sinister power wraps itself around you and solidifies!" +KinkyDungeonTrapBindingsShadowLatex,"Dark magics swirl around you and solidify into shiny rubber!" +KinkyDungeonTrapBindingsCrystal,"Crystals grow and spread across your limbs!" KinkyDungeonTrapBindingsMagicChainsWeak,"The magic chains wrap themselves around your body!" KinkyDungeonTrapBindingsDress,"Your clothes are getting ripped away!" KinkyDungeonTrapSleepDart,"You feel a prick as a small dart hits you, and you start feeling drowsy..." KinkyDungeonTrapLustCloud,"You breathe in the gas, and a wave of pleasure hits your whole body." KinkyDungeonTrapSPCloud,"You breathe in the gas, and feel lethargic..." +KinkyDungeonTrapSpikeTrap,"You hear a mechanism trip..." -KinkyDungeonInventory,"Inventory" -KinkyDungeonReputation,"Reputation" +KinkyDungeonInventory,"Items" +KinkyDungeonReputation,"Rep" KinkyDungeonMagic,"Spells" KinkyDungeonMagicSpells,"Learn New Spells" KinkyDungeonMagicSpellsQuick,"Click a spell to replace SPELLNAME with." KinkyDungeonSpellNone,"Empty Slot" KinkyDungeonMagicSpellsBack,"Back to Spellbook" KinkyDungeonGame,"Return to Game" +KinkyDungeonMenu,"Return to Game" - +KinkyDungeonSpellsPageAll,"Known Abilities" KinkyDungeonSpellsPageUpgrade,"Spell Tree" KinkyDungeonSpellsPageElements,"Elemental Spells" KinkyDungeonSpellsPageConjure,"Conjuration Spells" @@ -5878,13 +7258,15 @@ KinkyDungeonSpellsSchoolElements,Elements KinkyDungeonSpellsSchoolConjure,Conjuration KinkyDungeonSpellsSchoolIllusion,Illusion KinkyDungeonSpellsSchoolAny,Generic +KinkyDungeonSpellsSchoolUpgrade,Upgrade +KinkyDungeonSpellsSchoolSpecial,Special KinkyDungeonSpellsBuy,"Learn Spell" KinkyDungeonSpellsPoints,"Spell Points: " KinkyDungeonMagicLevel,"Level: " KinkyDungeonMagicCost,"Spell Point Cost: " -KinkyDungeonMagicManaCost, "Mana Cost: " +KinkyDungeonMagicManaCost,"Mana Cost: " KinkyDungeonSpellEmpty,"" KinkyDungeonSpellRemove0,"Remove Spell 1" @@ -5901,35 +7283,37 @@ KinkyDungeonSpell3,"Replace Spell 4" KinkyDungeonSpell4,"Replace Spell 5" KinkyDungeonSpell5,"Replace Spell 6" KinkyDungeonSpell6,"Replace Spell 7" -KinkyDungeonSpellChoice0, "Current Spell 1: " -KinkyDungeonSpellChoice1, "Current Spell 2: " -KinkyDungeonSpellChoice2, "Current Spell 3: " -KinkyDungeonSpellChoice3, "Current Spell 4: " -KinkyDungeonSpellChoice4, "Current Spell 5: " -KinkyDungeonSpellChoice5, "Current Spell 6: " -KinkyDungeonSpellChoice6, "Current Spell 7: " +KinkyDungeonSpellChoice0,"Current Spell 1: " +KinkyDungeonSpellChoice1,"Current Spell 2: " +KinkyDungeonSpellChoice2,"Current Spell 3: " +KinkyDungeonSpellChoice3,"Current Spell 4: " +KinkyDungeonSpellChoice4,"Current Spell 5: " +KinkyDungeonSpellChoice5,"Current Spell 6: " +KinkyDungeonSpellChoice6,"Current Spell 7: " KinkyDungeonCheckpointLoreUnknown,??? -KinkyDungeonCheckpointLore-1,Unfiled +KinkyDungeonCheckpointLoreDefault,Unfiled KinkyDungeonCheckpointLoreCombat,Adventuring 101 KinkyDungeonCheckpointLoreHistory,History KinkyDungeonCheckpointLoreSchool,Bondage Witchery KinkyDungeonCheckpointLoreEnemy,Enemy Notes KinkyDungeonCheckpointLoregrv,Graveyard KinkyDungeonCheckpointLorecat,Catacombs -KinkyDungeonCheckpointLorejng,Jungle +KinkyDungeonCheckpointLorejng,Overgrown KinkyDungeonCheckpointLoretmp,Temple KinkyDungeonCheckpointLoretmb,Tombs KinkyDungeonCheckpointLorelib,Library KinkyDungeonCheckpointLorecry,Crystal Cave KinkyDungeonCheckpointLoreore,Orrery KinkyDungeonCheckpointLorebel,Bellows +KinkyDungeonCheckpointLorecst,Coast +KinkyDungeonCheckpointLoreEjahl,Ejahl KinkyDungeonLore29,"(A page from the Book of Aeons)|The 'Graveyard' is a peculiar place. Long ago, human beings lived and died just like the animals. When the Old Civilization existed, they would come to bury their dead in the Graveyard. It remains a mystery why so many of the former dead seem to be alive. Some say that when the Old Civilization cast the spell that spell which overcame Death, even those buried in their graves would rise again. Others simply say that there is a powerful necromancer who lives here, toying with the dead as if they were pets..." KinkyDungeonLore30,"(A page from the Book of Aeons)|Beneath the Graveyard lies a relic of a former age, a network of tombs inhabited by the immortal followers of Bast. Very few were graced with this gift of immortality before the great archmagus, Sariel Vinlaga, stole this power from the gods and granted all humans with the power of immortality. The Bast followers are still set in their ways, hoping for a time when their Goddess will return and rebuild their glorious civilization." KinkyDungeonLore31,"(A page from the Book of Aeons)|Some say the 'Catacombs' are older than time itself. When the Old Civilization began to study immortality, no one knew if it would be possible to bring back those who already died. The Catacombs therefore were used to store all of the remains of former humans, so that they too could be revived when the archmagus would finally make her breakthrough." KinkyDungeonLore32,"(A page from the Book of Aeons)|They say that Archmagus Sariel Vinlaga studied in this very library. Having gathered together all of human knowledge, magical, spiritual, technological, she tasked her twelve lesser magi with the job of sorting and collating the wealth of knowledge she had acquired. No one knows why she suddenly abandoned it, or why it remains in such disrepair today." -KinkyDungeonLore33,"(A page from the Book of Aeons)|The Underground Jungle remains a puzzle to scholars. Hardly any light comes through the cracks in the ceiling, and yet the jungle teems with life. It is known that the regenerative powers that keep humans from dying relies on an individual's own mana supply. So how do plants and beasts without mana survive? The devout say it is the Goddess of Restoration who preserves the jungle, but could it be that the Old Civilization developed a means of sustaining life underground? " +KinkyDungeonLore33,"(A page from the Book of Aeons)|The Overgown Ruins remain a puzzle to scholars. Hardly any light comes through the cracks in the ceiling, and yet the area teems with life. It is known that the regenerative powers that keep humans from dying relies on an individual's own mana supply. So how do plants and beasts without mana survive? The devout say it is the Goddess of Restoration who preserves the jungle, but could it be that the Old Civilization developed a means of sustaining life underground? " KinkyDungeonLore34,"(A page from the Book of Aeons)|The problem of Energy has plagued civilization for millenia. Before the leylines were discovered, humankind relied on natural sources of power such as rivers and firewood. When the Crystal Caves were discovered, a great revolution occurred. No longer reliant on natural sources, civilizations could tap the wellsprings of chaotic energy underground to power machinery like never seen before." KinkyDungeonLore35,"(A page from the Book of Aeons)|The 'Lost Temple' as they call it, is a subject of great speculation. It seems that its creators worshipped only four creator goddesses, rather than all the Eight. It was perhaps abandoned several hundred years ago when a flood caused great panic, and it seems that this must have occurred before humanity was made immortal by the archmagus, as there are many remains still found inside." KinkyDungeonLore36,"(A page from the Book of Aeons)|The Stars have been a mystery to scholars since the beginning of time. At one point, humans believed that every star was a god, and they made offerings by throwing sugar into the night, thinking that as the stars were innumerable, so were the grains of sugar that pleased humans so much. Religion has moved past that, but the Orrery remains a relic from a time when humanity worshipped the stars rather than the Eight." @@ -5938,7 +7322,7 @@ KinkyDungeonLore37,"(A page from the Book of Aeons)|The 'Bellows' is the nicknam KinkyDungeonLore0,"(Preface from the journal of Catherine Willows, well-known explorer who vanished in the dungeon 30 years ago) I am writing this journal in the off chance that I do not come back in my search for the Mistress' staff. If you find this, please make an effort to deliver it back to the surface for the good of all the young women lured by its secrets." KinkyDungeonLore1,"(Pg. 24 from Catherine Willows' journal) Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?'" KinkyDungeonLore2,"(Pg. 25 from Catherine Willows' journal) ...They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence." -KinkyDungeonLore3,"(Pg. 26 from Catherine Willows' journal) So the question is not "why did somebody lay these traps." The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with." +KinkyDungeonLore3,"(Pg. 26 from Catherine Willows' journal) So the question is not 'why did somebody lay these traps.' The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with." KinkyDungeonLore4,"(The note starts with a drawing of a witch with many chains hanging from her body) She can block melee attacks with her chains. However, they conduct lightning and heat directly to her body, and I was able to take out her chains with bolt cutters." KinkyDungeonLore5,"(The note starts with a drawing of a witch with lightning crackling from her fingertips) Water will cause her to short-circuit. I can't seem to hit her with lightning, though. She always redirects it." KinkyDungeonLore6,"(The note starts with a drawing of a witch whose body is partly gelatinous) The slime is non-flammable and my attacks pass right through her body... Lightning and ice seem to be effective!" @@ -5949,16 +7333,16 @@ KinkyDungeonLore10,"(A letter between bandit leaders) One of my subordinates has KinkyDungeonLore11,"(The note is a letter from the school of conjuration) We really would like to know... why did you summon a frog in the laboratory? People are wondering, you know. One of the student's projects got eaten." KinkyDungeonLore12,"(You find a carving on the floor, a half-finished magic circle of celestial conjuration. Perhaps a cleric wished to call forth an angel for guidance, before realizing there was a shrine a short walk away, where she could contact the heavens much more easily.)" KinkyDungeonLore13,"(It looks like a... receipt) Thank you for your offering to CELESTIAL COMMERCE. Please accept this fine-quality steel blade as compensation for your continued devotion and selflessness." -KinkyDungeonLore14,"(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter than she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS." +KinkyDungeonLore14,"(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter that she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS." KinkyDungeonLore15,"(From an essay titled 'On Celestial Supply Chains') It is known that the heavens seek gold. We do not know why it is that the heavens seek it, but we do know that the Goddesses grant us fragments of their limitless power in exchange for this otherwise-useless metal we dredge up from the earth. They care about it so much that shrines are commonplace, each hosting an angelic courier lying in wait for any adventurer willing to part with hers." KinkyDungeonLore16,"They say that the maiden who safeguards the graveyard is kind to her pets..." -KinkyDungeonLore17,"They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Blink out of jail and into the hallway where they kept all my things!" +KinkyDungeonLore17,"They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Portal out of jail and into the hallway where they kept all my things!" KinkyDungeonLore18,"I am writing this from inside prison. Who would have known they cared so much about me using a shrine? Sheesh." KinkyDungeonLore19,"(A drawing of a bunch of zombies, ordered by danger level. Of note are a zombie surrounded by charms, a zombie surrounded by talismans, a zombie warrior with a sword, and... some kind of shrine maiden that you've never seen before)" KinkyDungeonLore20,"(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|The first thing to understand is that tying someone up is difficult if they are not in a vulnerable position. If your opponent is vulnerable, then binding will be twice as effective!" -KinkyDungeonLore21,"(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by ticking them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage." +KinkyDungeonLore21,"(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by tickling them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage." KinkyDungeonLore22,"(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Bigger and more resilient opponents are much more effective at breaking out of your binds. Try to deal some damage to them to decrease the speed at which they struggle out of your restraints." KinkyDungeonLore28,"(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Many mages utilize magical runes to set traps. If you want to check for traps, try learning the spell 'Magical Sight' in the Illusion school." @@ -6005,7 +7389,7 @@ KinkyDungeonLore400,"(Two schematic diagrams of ancient drones taken from record KinkyDungeonLore201,"Those damn slimes! They're so sticky and gross... fortunately, I washed myself in the fountain the last time I got caught by one. It came right off!" KinkyDungeonLore202,"The dragonhearts were a group of dragonslayers, named for their ritual that imbues them with the fiery power and resistance of dragons they've slain. Now they work as mercenaries, and some of them serve a certain Leather goddess." KinkyDungeonLore203,"Yes! I've done it! I have created another red slime! I shall call him Fred, yes, Fred. After the red slime I lost in a shield-related accident a while back... |Poor Fred... I miss him." -KinkyDungeonLore204,"(Pg. 70 from Catherine Willows' journal): The underground jungle is a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through?" +KinkyDungeonLore204,"(Pg. 70 from Catherine Willows' journal): The overgrown ruins are a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through?" KinkyDungeonLore205,"The unseen maid is the deadliest." @@ -6024,16 +7408,21 @@ KinkyDungeonCurseInfo5Keys,"The item requires 5 keys and free hands to remove" KinkyDungeonCurseStruggle5Keys,"The item is extremely secure with five separate keyholes." KinkyDungeonCurseUnlock5Keys,"You insert your 5 keys into the lock and the item finally comes off." +curseFrom,"[RNAME]" + +curseInfoAntiMagic,"Magic-Draining: This item drains your mana quickly up to a limit, then slowly after." + curseInfoTickle,"Curse of Tickling: This item is tickling you without end!" curseInfoPunish,"Curse of Punishment: Inflicts psychic damage when you attack or cast a spell." curseInfoIllumination,"Curse of Illumination: Produces light and makes you easier to see." -curseInfoAttraction,"Curse of Attraction: Other women find you even more irresistable." +curseInfoAttraction,"Curse of Attraction: Women find you irresistable." curseInfoAnimation,"Curse of Animation: Causes loose restraints to animate and attack you!" curseInfoSensitivity,"Curse of Sensitivity: Makes it easier to lose control of yourself." curseInfoDistraction,"Curse of Distraction: Multiplies DP gain by 1.5x." -curseInfoBreathlessness,"Curse of Breathlessness: Multiplies SP gain by 0.6x." -curseInfoFutile,"Curse of Futility: Multiplies WP gain by 0.25x." +curseInfoBreathlessness,"Curse of Exhaustion: -25% Stamina regen cap." +curseInfoFutile,"Curse of Futility: Multiplies WP gain by 0.5x." curseInfoSubmission,"Curse of Submission: Gain submissiveness when you lose control of yourself..." +curseInfoDormant,"The curse is dormant, waiting for the time to strike..." KDSubmissionCurseApply,"Your RESTRAINTNAME glows pink as you feel your mind attacked by hypnotic forces!" KDcurseRestrain,"The item is cursed! Several restraints appear on your body!" @@ -6052,7 +7441,7 @@ KinkyDungeonCurseStruggleTakeDamageChain,"The item squeezes you tighter as you t KinkyDungeonCurseStruggleShrineWill,"The item is protected by holy magic. There is nothing you can do to it." KinkyDungeonCurseUnlockShrineWill,"You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers?" KinkyDungeonCurseInfoShrineWill,"This item bears the sigil of the Goddess of Restoration. Perhaps she can help?" -KinkyDungeonCurseStruggleShrineConjure,"The item is protected by an arcane seal. There is nothing you can do to it." +KinkyDungeonCurseStruggleShrineConjure,"The item is protected by a magical seal. There is nothing you can do to it." KinkyDungeonCurseUnlockShrineConjure,"You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers?" KinkyDungeonCurseInfoShrineConjure,"This item bears the sigil of the Goddess of Conjuration. Perhaps she can help?" KinkyDungeonCurseStruggleShrineIllusion,"The item is protected by dark secrets. There is nothing you can do to it." @@ -6060,10 +7449,10 @@ KinkyDungeonCurseUnlockShrineIllusion,"You pray to the Goddess and the sigil van KinkyDungeonCurseInfoShrineIllusion,"This item bears the sigil of the Goddess of Illusions. Perhaps she can help?" KinkyDungeonCurseUnlockShrineElements,"You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers?" KinkyDungeonCurseInfoShrineElements,"This item bears the sigil of the Goddess of Elements. Perhaps she can help?" -KinkyDungeonCurseStruggleShrineElements,"The item is protected by powerful energies. There is nothing you can do to it." +KinkyDungeonCurseStruggleShrineElements,"The item is protected by an elemental seal. There is nothing you can do to it." KinkyDungeonCurseUnlockBlueLock,"You hold the key to the item and it comes loose, draining the key's energy." KinkyDungeonCurseInfoBlueLock,"The item is incribed with mystical runes. Maybe you need a powerful key to unlock it." -KinkyDungeonCurseStruggleBlueLock,"You tug on the item, but the runes glow brighter as you realize struggling is pointless." +KinkyDungeonCurseStruggleBlueLock,"The lock-shaped rune flashes as you realize struggling is pointless." KinkyDungeonCurseUnlockMana,"You overload the magical seal, causing it to vanish and release the item." KinkyDungeonCurseInfoMana,"The item is magically sealed, requiring 200 mana to unlock it (includes mana from mana pool)." @@ -6081,13 +7470,13 @@ KinkyDungeonCurseInfoWill,"The item is protected by a seal of Determination. You KinkyDungeonCurseStruggleWill,"You are unable to muster the willpower to bypass the seal..." KinkyDungeonCurseUnlockWill,"Feeling determined, you override the seal and release the item!" -KinkyDungeonCurseInfoGhostLock,"The lock is protected by a revanent seal. You'll need 25 ectoplasm to disenchant it." +KinkyDungeonCurseInfoGhostLock,"The lock is protected by a revenant seal. You'll need 25 ectoplasm to disenchant it." KinkyDungeonCurseStruggleGhostLock,"Your fingers pass right through the collar. Pity your neck doesn't pass through it." KinkyDungeonCurseUnlockGhostLock,"You channel ghastly energy into the lock and break the seal!!!" -KinkyDungeonCurseInfoDollLock,"It would take many lifetimes to crack the code. You'll have to find the data somehow." -KinkyDungeonCurseStruggleDollLock,"You tug against the fastenings to no avail." -KinkyDungeonCurseUnlockDollLock,"One of your Doll IDs seems to have had corrupted data on it, causing the program to crash." +KinkyDungeonCurseInfoDollLock,"It would take many lifetimes to crack the code. You'll have to find another way to break the program..." +KinkyDungeonCurseStruggleDollLock,"You tug against the straps to no avail." +KinkyDungeonCurseUnlockDollLock,"One of your Doll IDs seems to have had corrupted data on it, causing the program to crash and unlock." KinkyDungeonCurseInfoShadowCurse,"The item seems to drain divine energy from shrines. Maybe that has something to do with it." KinkyDungeonCurseStruggleShadowCurse,"The collar is enchanted with multiple layers of magical seals." @@ -6145,12 +7534,13 @@ KinkyDungeonTrapSpawnHugHorror,"You feel a constricting presence..." KinkyDungeonTrapSpawnTickleTerror,"You feel a titillating presence..." KinkyDungeonTrapSpawnNinja,"You are ambushed by ninjas!" KinkyDungeonTrapSpawnRopeKraken,"A large, wriggling mess of ropes fall from the ceiling!" +KinkyDungeonTrapSpawnVinePlant,"A rune of growth causes several plants to quickly sprout nearby." KinkyDungeonTrapSpawnDragon,"You are ambushed by dragonhearts!" KinkyDungeonTrapSpawnDragonLeader,"You are ambushed by dragonhearts!" KinkyDungeonTrapSpawnDrone,"A pack of drones descends from the ceiling!" KinkyDungeonTrapSpawnCaptureBot,"You hear sirens as a group of robots closes in!" KinkyDungeonTrapSpawnDressmaker,"You stumble upon a group of mages wanting to play dress-up!" -KinkyDungeonTrapSpawnLibrary,"You step on an open book, only to find a furious librarian staring you down!" +KinkyDungeonTrapSpawnLibrarian,"You step on an open book, only to find a furious librarian staring you down!" KinkyDungeonTrapSpawnWolfgirl,"You are ambushed by wolfgirls!" KinkyDungeonTrapSpawnAlkahestor,"You are ambushed by an alkahestor!" KinkyDungeonTrapSpawnSmallSlime,"Small blobs of slime fall from the ceiling!" @@ -6160,7 +7550,7 @@ KinkyDungeonTrapSpawnElementalFire,"In a puff of smoke, a group of fire elementa KinkyDungeonTrapSpawnElementalIce,"In a flash of fog a group of ice elementals appear around you!" KinkyDungeonTrapSpawnElementalWater,"In a burst of mist, a group of water elementals appear around you!" KinkyDungeonTrapSpawnElementalEarth,"A group of earth elementals rise out of the ground!" -KinkyDungeonTrapSpawnElementalLatex,"You hear pouring liquid and a group of latex elementals come out of the walls!" +KinkyDungeonTrapSpawnElementalRubber,"You hear pouring liquid and a group of rubber elementals come out of the walls!" KinkyDungeonTrapSpawnElementalAir,"In a flash of light, a group of air elementals appear around you!" KinkyDungeonTrapSpawnTickleHand,"Several ethereal hands appear all around you!" KinkyDungeonTrapSpawnConjurer,"You have stumbled upon a conjurer's study!" @@ -6171,9 +7561,10 @@ KinkyDungeonTrapSpawnMaidforceMafia,"You are ambushed by a group of maids!" KinkyDungeonTrapSpawnMaidforceHead,"The Head Maid corners you!" KinkyDungeonTrapCustomVine,"A vine crawls from the ground, already wrapping around your feet!" -KinkyDungeonOrbIntro,"You have broken a magic orb, gaining a Spell Point and angering a goddess." -KinkyDungeonOrbIntroKinky,"You have broken a magic orb, gaining a random spell and angering a goddess." -KinkyDungeonOrbIntro2,"Choose one. She will send her minions after you." +KinkyDungeonOrbIntro,"You find a magic orb, containing a Spell Point. However, a Goddess owns this artifact.." +KinkyDungeonOrbIntroKinky,"You find a magic orb, containing the SHCL spell 'SPLNME' and angering a goddess." +KinkyDungeonOrbIntroKinkyRandom,"You find a magic orb, containing a random spell and angering a goddess." +KinkyDungeonOrbIntro2,"Should you break it, she will send her minions after you. Which Goddess will you anger?" KinkyDungeonPerkIntro,"An altar stands before you, bestowing a heavenly contract." KinkyDungeonPerkIntro2,"Do you choose to accept its terms?" @@ -6250,10 +7641,12 @@ KinkyDungeonJailerSubMistake,"Oh! Looks like I've made a mistake..." KinkyDungeonJailerRobotMistake,"404 prisoner not found. Releasing tether." +KinkyDungeonGuardApproach,A EnemyName approaches you in your cell. KinkyDungeonGuardAppear,A EnemyName appears to check on you. KinkyDungeonGuardDisappear,The EnemyName leaves and locks the cell behind her. KinkyDungeonItemsUnderneath,"Layered underneath:" +KinkyDungeonItemsUnderneath2,"Layered with:" KinkyDungeonItemsStrictness,"Increased strictness due to:" KinkyDungeonAidMana,Mana @@ -6355,13 +7748,18 @@ KinkyDungeonPunishPlayerCurse,"Your RestraintName emits a red flash, causing you KinkyDungeonPunishPlayerArmor,"Your armor makes noise as you move around!" KinkyDungeonAlertEnemies,Your RestraintName lets out an alert! + +KinkyDungeonPunishPlayerEstim,Your RestraintName stimulates you to hinder your efforts! +KinkyDungeonPunishPlayerEstimHarsh,Your RestraintName stimulates you and beeps loudly! + KinkyDungeonGoldLockRemove,A golden lock fades into a blue lock on one of your restraints! -KinkyDungeonPurpleLockRemove,Your command word is heard and the purple lock(s) click and fall off! +KinkyDungeonPurpleLockRemove,Your command word is heard and the magic lock(s) click and fall off! KinkyDungeonPurpleLockRemoveCharger,Your command word is heard and the charger unlocks! KDGameData.ConfirmAttack,Are you sure you want to attack? KinkyDungeonConfirmStairs,Are you sure you want to go to the next level? (Click self to confirm) + KinkyDungeonSelfBondage,You shudder as you apply the RestraintName to yourself... KinkyDungeonSelfBondagePlug,"You insert the RestraintName and close your belt's shield over it, with a click as it locks in place." KinkyDungeonSelfBondageNipple,"You attack the RestraintName and close your bra's shield over it, with a click as it locks in place." @@ -6380,7 +7778,7 @@ KinkyDungeonCurseStruggleMistressKeyEnchantedBelt,"You tug at your chastity belt RestraintEnchantedBra,Ancient Chastity Bra LootChestEnchantedBra,"You find a chastity bra, glowing magnificently, along with a strange crystal next to it." -RestraintEnchantedBraDesc2,"A chastity bra of sleek, ancient design. While powered, it reduces incoming damage by 1." +RestraintEnchantedBraDesc2,"A chastity bra of sleek, ancient design. While powered, it reduces incoming damage from attacks by 20." RestraintEnchantedBraDesc,"'Shield of the chaste'" KinkyDungeonCurseStruggleMistressKeyEnchantedBra,"You rub your hands along your breasts but feel only hard, unbreakable metal." @@ -6391,7 +7789,7 @@ RestraintEnchantedHeelsDesc,"'Shoes of the graceful'" KinkyDungeonCurseStruggleMistressKeyEnchantedHeels,"You can barely stand in these heels. They are rigid, metallic, and unbreakable, yet padded on the inside." RestraintEnchantedBlindfold,Ancient Blindfold -LootChestEnchantedBlindfold,"You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it." +LootChestEnchantedBlindfold,"You find a padded metal blindfold, glowing magnificently, along with a strange crystal next to it." RestraintEnchantedBlindfoldDesc2,"A full-blackout mask. When powered, it negates accuracy penalties due to vision, boosts accuracy by +100%, and boosts melee damage by +10." RestraintEnchantedBlindfoldDesc,"'Mask of the Warrior'" KinkyDungeonCurseStruggleMistressKeyEnchantedBlindfold,"You tug at the mask but it won't come off. It's molded so close to your face that no light shines through!" @@ -6440,7 +7838,7 @@ KinkyDungeonCurseStruggleMistressKeyEnchantedArmbinder,"You try to wiggle your a RestraintEnchantedAnkleCuffs,Ancient Ankle Cuffs LootChestEnchantedAnkleCuffs,"You find a pair of glowing cuffs, glowing magnificently, along with a strange crystal next to it." -RestraintEnchantedAnkleCuffsDesc2,"A pair of cuffs designed for summoners. Heals nearby summons by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power." +RestraintEnchantedAnkleCuffsDesc2,"A pair of cuffs designed for summoners. Heals nearby allies by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power." RestraintEnchantedAnkleCuffsDesc,"'Anklets of the Faithful Friend'" KinkyDungeonCurseStruggleMistressKeyEnchantedAnkleCuffs,"You jingle the chains around and realize that these unbreakable restraints won't be coming off." RestraintEnchantedAnkleCuffs2,Ancient Ankle Cuffs @@ -6452,21 +7850,26 @@ KinkyDungeonCurseStruggleMistressKeyEnchantedAnkleCuffs2,"You struggle fruitless KinkyDungeonMistressKeysTakenAway,You search for your ancient keys but it seems they were taken away for good. -KinkyDungeonSurpriseMe,Random (reduces penalty by 1) +KinkyDungeonSurpriseMe,Random (-10% rep loss) KinkyDungeonNoItemToRemove,You don't have any valid targets on your body for that. KinkyDungeonHappyGas,"The air swirls with traces of pleasing magic..." KinkyDungeonSporeGas,"The spores make you feel sleepy..." +KinkyDungeonTooltipBlockPhys,"Physical Block: AMOUNT" +KinkyDungeonTooltipBlockMagic,"Magic Block: AMOUNT" + KinkyDungeonTooltipWeakness,"DAMAGETYPE: MULTIPLIERx modifier" -KinkyDungeonTooltipArmor,"Base Physical Armor: AMOUNT" -KinkyDungeonTooltipSpellResist,"Base Magic Armor: AMOUNT" -KinkyDungeonTooltipEvasion,"Base Evasion: AMOUNT%" +KinkyDungeonTooltipArmor,"Physical Armor: AMOUNT" +KinkyDungeonTooltipSpellResist,"Magic Armor: AMOUNT" +KinkyDungeonTooltipEvasion,"Evasion: AMOUNT%" KinkyDungeonTooltipDealsDamage,"Deals DAMAGETYPE damage" +KinkyDungeonTooltipDealsAccuracy,"AMNT% chance to hit you" KDTooltipDisarm,"Can disarm (chance: DISARMCHANCE%)" KDTooltipDamageResists,Resistances: KDTooltipHP,"HP: " +KDTooltipShield,"Shield: " KDTooltipBinding,"Binding: " KDTooltipOpinion0,"Ambivalent" KDTooltipOpinion1,"Likes you" @@ -6478,16 +7881,18 @@ KDTooltipOpinion-3,"Despises you" KDTooltipAwareTalking,"Talking to you" KDTooltipAwareAwareFriendly,"Aware of you!" KDTooltipAwareAware,"Pursuing you!" -KDTooltipAwareSuspicious,"Slightly suspicious" -KDTooltipAwareDanger,"Saw something..." +KDTooltipAwareAwareIgnore,"Ignoring you!" +KDTooltipAwareSuspicious,"Investigating!" +KDTooltipAwareDanger,"Suspicious" KDTooltipAwareDangerHigh,"Notices you!" KDTooltipAwareUnnoticed,"Unaware" KDTooltipInventory,"Items carried:" +KDTooltipInventoryWorn,"Items worn:" KDTooltipInventoryFull,"...and NUMBER more" -KDTooltipWeakBinding,"Disappears if the caster is stunned" +KDTooltipWeakBinding,"Takes damage if the caster is stunned" KDTooltipNormalBinding,"Disappears if the caster is defeated" KDTooltipBoundTo,"Caster: ENEMYNAME" -KDTooltipDisappearing,"Demise immanent" +KDTooltipDisappearing,"Demise imminent" KDStatusTooltipEnemyVulnerable,Vulnerable KDStatusTooltipEnemyStunned,Stunned @@ -6496,9 +7901,9 @@ KDStatusTooltipEnemySlow,Slowed KDStatusTooltipEnemySilence,Silenced KDStatusTooltipEnemyDisarm,Disarmed KDStatusTooltipEnemyBlind,Blinded -KDStatusTooltipEnemyBound1,Restrained! -KDStatusTooltipEnemyBound2,Restricted! -KDStatusTooltipEnemyBound3,Immobilized! +KDStatusTooltipEnemyBound1,Apprehended! +KDStatusTooltipEnemyBound2,Restrained! +KDStatusTooltipEnemyBound3,Restricted! KDStatusTooltipEnemyBound4,Fully Bound! KDStatusTooltipEnemyBound5,Trussed up! KDStatusTooltipEnemyBound6,Tightly Secured! @@ -6509,13 +7914,19 @@ KDStatusTooltipEnemyBound10,Helpless! KDStatusTooltipEnemyBelt,Belted KDStatusTooltipEnemyPlug,Wearing a toy KDStatusTooltipEnemyVibed,Vibed! +KDStatusTooltipEnemyFlying,Flying +KDStatusTooltipEnemyDistracted,Distracted! +KinkyDungeonDamageTypesoap,"Soap" KinkyDungeonDamageTypeacid,"Acid" KinkyDungeonDamageTypecold,"Shadow" +KinkyDungeonDamageTypeholy,"Holy" +KinkyDungeonDamageTypearcane,"Arcane" KinkyDungeonDamageTypefrost,"Ice" KinkyDungeonDamageTypeice,"Ice" KinkyDungeonDamageTypefire,"Fire" KinkyDungeonDamageTypepoison,"Poison" +KinkyDungeonDamageTypepoisongas,"Poison Gas" KinkyDungeonDamageTypecharm,"Charm" KinkyDungeonDamageTypetickle,"Tickle" KinkyDungeonDamageTypegrope,"Grope" @@ -6528,32 +7939,30 @@ KinkyDungeonDamageTypesouldrain,"Spirit Draining" KinkyDungeonDamageTypesoul,"Psychic" KinkyDungeonDamageTypedrain,"Mana Draining" KinkyDungeonDamageTypeelectric,"Electric" +KinkyDungeonDamageTypeestim,"E-Stim" KinkyDungeonDamageTypeshock,"Shock" -KinkyDungeonDamageTypestun,"Pressure" +KinkyDungeonDamageTypeplush,"Plush" +KinkyDungeonDamageTypestun,"Blast" +KinkyDungeonDamageTypeblast,"Blast" KinkyDungeonDamageTypechain,"Chain" -KinkyDungeonDamageTypehappygas,"Charm" +KinkyDungeonDamageTypehappygas,"Gas" KinkyDungeonDamageTypeglue,"Glue" KinkyDungeonDamageTypeunarmed,"Unarmed" -KinkyDungeonDamageTypemelee,"Melee" +KinkyDungeonDamageTypemelee,"Physical" KinkyDungeonDamageTypemagic,"Magic" KinkyDungeonDamageTypespell,"Spell" KinkyDungeonDamageTypeunstoppable,"Unstoppable" KinkyDungeonDamageTypeunflinching,"Unflinching" -KinkyDungeonHeartIntro,"You found a magical amulet! Choose one of the following to determine its benefits:" -KinkyDungeonHeartIntro1,"Focus: +50% max distraction, increased distraction decay. +5% stamina protected from damage (base: 30%)." -KinkyDungeonHeartIntro2,"Vigour: +50 max stamina, +50% stamina potion effectiveness." -KinkyDungeonHeartIntro3,"Wisdom: +50 max mana. +50% mana potion effectiveness." -KinkyDungeonHeartIntro4,"Fortitude: +50 max willpower, +50% willpower potion effectiveness. +1 stamina regen/turn." -KinkyDungeonHeartDistraction,"+Distraction" +KinkyDungeonHeartDistraction,"+Focus" KinkyDungeonHeartStamina,"+Stamina" KinkyDungeonHeartWill,"+Willpower" -KinkyDungeonHeartMana,"+Mana" +KinkyDungeonHeartMana,"+Magic" KinkyDungeonHeartDiscard,"Discard (destroys it permanently!)" -KinkyDungeonVulnerable,The EnemyName is vulnerable and took an extra AMOUNT base damage! -KinkyDungeonUnseen,The EnemyName isn't aware of you and took an extra AMOUNT base damage! +KinkyDungeonVulnerable,You crit the vulnerable EnemyName for AMOUNT extra damage! +KinkyDungeonUnseen,You crit the unsuspecting EnemyName for AMOUNT extra damage! KinkyDungeonStealPick,The enemy steals a pick from you! KinkyDungeonStealKnife,The enemy takes away your knife! KinkyDungeonStealRedKey,The enemy steals a key from your body! @@ -6564,7 +7973,7 @@ KinkyDungeonStealBack,You get your stolen items back. KinkyDungeonStealBackFail,The EnemyName manages to retreat with your items! KinkyDungeonOrbSpell,The orb contains knowledge of SPELL. -KinkyDungeonCapture,You capture the EnemyName. You can become a champion in the Reputation screen. +KinkyDungeonCapture,You capture the EnemyName. KinkyDungeonCaptureBasic,You capture the EnemyName. KinkyDungeonCaptureGoddess,You capture the EnemyName in the name of the goddess of GODDESS. KinkyDungeonCaptureGoddessLowUniform,"You capture the EnemyName, but the goddess of GODDESS would prefer that you be in uniform (wear her restraint)." @@ -6576,11 +7985,12 @@ KinkyDungeonCaptureMax,"You capture the EnemyName, but have reached the limit fo KinkyDungeonSummonTrapMonster,The spirit inside the restraint is vengeful and emerges to wreak havoc on the world! KinkyDungeonBarrel,You hide inside the container... +KinkyDungeonBarrelChest,You hide inside the chest... KinkyDungeonScrap,It's a crumpled piece of scrap metal with a sharp edge. KinkyDungeonScrapUse,You use the scrap to try and cut the item. KinkyDungeonScrapObjectUse,You rub the item against the broken object's sharp edges... KinkyDungeonHookHigh,A hook hangs at shoulder height. -KinkyDungeonHookHighFail,You can't reach that with the hook! +KinkyDungeonHookHighFail,The hook is too high up! You can't reach it... KinkyDungeonHookLow,There's a hook on the wall. KinkyDungeonCrack,The wall is cracked. KinkyDungeonPlayCorner,You rub yourself on the corner... @@ -6591,23 +8001,79 @@ KDClasses,"Choose Class:" KDSexyMode,"Distraction Mode:" +KDProgressionMode,"Progression Mode:" +KinkyDungeonProgressionMode0,Key Hunt +KinkyDungeonProgressionMode1,Random +KinkyDungeonProgressionMode2,Selected +KinkyDungeonProgressionModeDesc0,"You will need to find the key to proceed to the next floor." +KinkyDungeonProgressionModeDesc1,"Each floor will have a random task to unlock the stairs." +KinkyDungeonProgressionModeDesc2,"You will select your task for each floor before you enter. Requires Perk Progression." + +KDPerksMode,"Perks Mode:" +KinkyDungeonPerksMode0,Standard +KinkyDungeonPerksMode1,Extra +KinkyDungeonPerksMode2,Less +KinkyDungeonPerksMode3,Much Less +KinkyDungeonPerksModeDesc0,"No pain, no gain." +KinkyDungeonPerksModeDesc1,"Gain 20 extra perk points, to give you a false sense of security." +KinkyDungeonPerksModeDesc2,"Lose 20 perk points, just to keep things interesting." +KinkyDungeonPerksModeDesc3,"Lose 50 perk points, making things very interesting." + + +KDPerkProgressionMode,"Perk Progression Mode:" +KinkyDungeonPerkProgressionMode0,Disabled +KinkyDungeonPerkProgressionMode1,Optional +KinkyDungeonPerkProgressionMode2,Mandatory +KinkyDungeonPerkProgressionMode3,Debuffs Only +KinkyDungeonPerkProgressionModeDesc0,"No perks between floors." +KinkyDungeonPerkProgressionModeDesc1,"The standard mode. You may choose between one of three perk altars between floors." +KinkyDungeonPerkProgressionModeDesc2,"A twist on the standard mode. You must choose before progressing." +KinkyDungeonPerkProgressionModeDesc3,"You must pick a debuff between floors before progressing." + + +KDPerkBondageMode,"Perk Shrine Bondage:" +KinkyDungeonPerkBondageMode0,Never +KinkyDungeonPerkBondageMode1,Sometimes +KinkyDungeonPerkBondageMode2,Always +KinkyDungeonPerkBondageModeDesc0,"Perk shrines will not offer bondage as part of the deal." +KinkyDungeonPerkBondageModeDesc1,"Bondage will sometimes be offered alongside perks." +KinkyDungeonPerkBondageModeDesc2,"Perk shrines are always accompanied by bondage." + + +KDPerkBondageVisMode,"Perk Shrine Bondage Info:" +KinkyDungeonPerkBondageVisMode0,Hidden +KinkyDungeonPerkBondageVisMode1,Partial +KinkyDungeonPerkBondageVisMode2,Full +KinkyDungeonPerkBondageVisModeDesc0,"You do not know if a perk shrine will apply bondage." +KinkyDungeonPerkBondageVisModeDesc1,"You know that a perk shrine will apply bondage, but not what kind." +KinkyDungeonPerkBondageVisModeDesc2,"You know the exact restraints a perk shrine will apply." + +KDHardMode,"Difficulty:" +KinkyDungeonHardMode0,Normal Mode +KinkyDungeonHardMode1,Hard Mode +KinkyDungeonExtremeMode,Extreme Mode +KinkyDungeonHardModeDesc0,"A supposedly reasonable difficulty curve." +KinkyDungeonHardModeDesc1,"Play the game the way it was intended. Cruel and restrictive. " +KinkyDungeonExtremeModeDesc,"Play at your own peril. Unlocked by double-clicking the Hard Mode button." + KinkyDungeonSexyMode0,Distracted KinkyDungeonSexyMode1,Aroused KinkyDungeonSexyModeDesc0,"Removes all chastity belts, vibrating restraints, plugs, and removes the option to play with yourself." KinkyDungeonSexyModeDesc1,"Includes all that good stuff." +KinkyDungeonSexyPlugsFront,Allow Front Plugs KinkyDungeonSexyPlugs,Allow Rear Plugs KinkyDungeonSexyPiercings,Allow Piercings -KinkyDungeonClassMode0,Fighter -KinkyDungeonClassModeDesc0,"Start with 200 willpower and Iron Will, good at melee and blocking attacks." -KinkyDungeonClassMode1,Rogue -KinkyDungeonClassModeDesc1,"Start with 200 stamina and Sneaky, good at stealth and evasive gameplay." -KinkyDungeonClassMode2,Wizard -KinkyDungeonClassModeDesc2,"Start with 200 mana and Magical Sight, good at casting spells." -KinkyDungeonClassMode3,Peasant -KinkyDungeonClassModeDesc3,"Start with nothing to your name. For those who want a challenge." -KinkyDungeonClassMode4,Trainee -KinkyDungeonClassModeDesc4,"You are a mage, but haven't finished your formal 'training'. Requires Aroused mode." +KinkyDungeonClassModeFighter,Fighter +KinkyDungeonClassModeDescFighter,"Start with 150 willpower and Iron Will, good at melee and blocking attacks." +KinkyDungeonClassModeRogue,Rogue +KinkyDungeonClassModeDescRogue,"Start with 150 stamina and Sneaky, good at stealth and evasive gameplay." +KinkyDungeonClassModeMage,Wizard +KinkyDungeonClassModeDescMage,"Start with 150 mana and Magical Sight, good at casting spells." +KinkyDungeonClassModePeasant,Peasant +KinkyDungeonClassModeDescPeasant,"Start with nothing to your name. For those who want a challenge." +KinkyDungeonClassModeTrainee,Trainee +KinkyDungeonClassModeDescTrainee,"You are a mage, but haven't finished your formal 'training'. Requires Aroused mode." KDRandomMode,"Spell Choice:" @@ -6634,6 +8100,7 @@ KinkyDungeonEasyModeDesc2,"If you get captured, you are totally on your own." KinkyDungeonStartGame,Start Playing KinkyDungeonStartGameDesc,"Lock your settings in, nice and tight." +KinkyDungeonStartGameDescKinky,"Start with some perks that increase strictness and immersion." KinkyDungeonStartGameDescAdc,"Choose some perks to spice up your run." KinkyDungeonConsent,"This game engages in safe and consensual analytics." @@ -6641,11 +8108,23 @@ KinkyDungeonConsent2,"It sends data about spell choices, levels reached, etc, to KinkyDungeonConsent3,"No personal data is sent or stored." KDOptIn,"Accept" KDOptOut,"Don't Track Me" +KDStartGame,"Proceed" KinkyDungeonRemoveJailKey,"Your key to the stairs is taken away!" ItemPickupKeyring,"You found a keyring to the stairs! Now you just need to get there." -KinkyDungeonNeedJailKey,"There seems to be a locked high-security door. Looks like you need a key." + +KinkyDungeonRemindJailCastFuuka,"Behold my SPL!" +KinkyDungeonRemindJailMiscastFuuka,"Mmmph... SPL..." +KinkyDungeonRemindJailPlayHelplessFuuka0,"Oh noes..." +KinkyDungeonRemindJailPlayHelplessFuuka1,"Ueeee!" +KinkyDungeonRemindJailPlayHelplessFuuka2,"I don't want to be your slave!" +KinkyDungeonRemindJailPlayBratFuuka0,"Catch me if you can!" +KinkyDungeonRemindJailPlayBratFuuka1,"Ueeee!" +KinkyDungeonRemindJailPlayBratFuuka2,"I don't want to be your slave!" +KinkyDungeonRemindJailPlaySubFuuka0,"I've been naughty, looks like I need to be punished..." +KinkyDungeonRemindJailPlaySubFuuka1,"I've been a bad girl, won't you do something about it?" +KinkyDungeonRemindJailPlaySubFuuka2,"Mmmph... maybe I talk too much..." KinkyDungeonRemindJailPlayFuuka0,"Well well, what have we got here?" KinkyDungeonRemindJailPlayFuuka1,"You're not here to take away my pets, are you?" KinkyDungeonRemindJailPlayFuuka2,"You'd make a lovely pet..." @@ -6654,6 +8133,7 @@ KinkyDungeonRemindJailPlayFuukaLeash,"Let's take you back to your space~" KinkyDungeonRemindJailPlayFuukaFree,"You need to be bound tight!" KinkyDungeonRemindJailPlayFuukaLoot,"Cleaning up for me, huh?" KinkyDungeonRemindJailPlayFuukaKey,"Uh uh, give that back!" +KinkyDungeonRemindJailChaseFuukaAlert,"What do we have here? An intruder? Or a future pet?" KinkyDungeonRemindJailChaseFuukaAttack0,"I see how it is." KinkyDungeonRemindJailChaseFuukaAttack1,"I've taken on hundreds of adventurers like you." KinkyDungeonRemindJailChaseFuukaAttack2,"You don't stand a chance." @@ -6670,13 +8150,40 @@ KinkyDungeonRemindJailFuukaDisarm,"Oh ho~" KinkyDungeonRemindJailFuukaHit,"'Tis but a scratch!" KinkyDungeonRemindJailFuukaHitPlayer,"You'll be my pet soon~" KinkyDungeonRemindJailFuukaMiss,"Cute~" +KinkyDungeonRemindJailFuukaBlock,"Cute~" KinkyDungeonRemindJailFuukaMissedMe,"Don't even try~" +KinkyDungeonRemindJailFuukaBlockedMe,"Don't even try~" KinkyDungeonRemindJailFuukaLeash,"It's over~" KinkyDungeonRemindJailFuukaPull,"Get over here!" KinkyDungeonRemindJailFuukaStun,"Not so slippery now!" KinkyDungeonRemindJailFuukaPickpocket,"I'll be taking that~" KinkyDungeonRemindJailFuukaLock,"'Click!'" - +KinkyDungeonRemindJailFuukaIntro,"In the name of PTRN, I order you to kneel!" +KinkyDungeonRemindJailChaseFuukaDefend0,"You're in my way." +KinkyDungeonRemindJailChaseFuukaDefend1,"Step aside, pet." +KinkyDungeonRemindJailChaseFuukaDefend2,"Get her, my pets!" +KinkyDungeonRemindJailChaseFuukaDefendHonor0,"Hey! Don't touch that!" +KinkyDungeonRemindJailChaseFuukaDefendHonor1,"Why you..." +KinkyDungeonRemindJailChaseFuukaDefendHonor2,"You can't do that!" +KinkyDungeonRemindJailChaseFuukaHonor0,"Leave them alone!" +KinkyDungeonRemindJailChaseFuukaHonor1,"You can't do that!" +KinkyDungeonRemindJailChaseFuukaHonor2,"Hey, stop that!" +KinkyDungeonRemindJailChaseFuukaCommandDefend,"Why do I hire these people..." +KinkyDungeonRemindJailChaseFuukaCommandAssault,"" +KinkyDungeonRemindJailChaseFuukaCommandBlock,"" + + +KinkyDungeonRemindJailCastDollmaker,"Activate SPL protocol." +KinkyDungeonRemindJailMiscastDollmaker,"What do you mean 'access denied'???" +KinkyDungeonRemindJailPlayHelplessDollmaker0,"Release me at once." +KinkyDungeonRemindJailPlayHelplessDollmaker1,"This is unacceptable!" +KinkyDungeonRemindJailPlayHelplessDollmaker2,"Guards! Guards... Guards? Well drat." +KinkyDungeonRemindJailPlayBratDollmaker0,"Catch me if you can!" +KinkyDungeonRemindJailPlayBratDollmaker1,"You'll never get away with this!" +KinkyDungeonRemindJailPlayBratDollmaker2,"I don't want to be your slave!" +KinkyDungeonRemindJailPlaySubDollmaker0,"I've been naughty, looks like I need to be punished..." +KinkyDungeonRemindJailPlaySubDollmaker1,"I've been a bad girl, won't you do something about it?" +KinkyDungeonRemindJailPlaySubDollmaker2,"Mmmph... maybe I talk too much..." KinkyDungeonRemindJailPlayDollmaker0,"Look, another one of my dolls~" KinkyDungeonRemindJailPlayDollmaker1,"Come to me, my lovely thing~" KinkyDungeonRemindJailPlayDollmaker2,"I want to hear you moan~" @@ -6685,6 +8192,7 @@ KinkyDungeonRemindJailPlayDollmakerLeash,"Come with me, dear~" KinkyDungeonRemindJailPlayDollmakerFree,"You've had too much freedom." KinkyDungeonRemindJailPlayDollmakerLoot,"Leave that for the cleaning robots." KinkyDungeonRemindJailPlayDollmakerKey,"Skulking around, are we?" +KinkyDungeonRemindJailChaseDollmakerAlert,"I see you." KinkyDungeonRemindJailChaseDollmakerAttack0,"There's no point in fighting." KinkyDungeonRemindJailChaseDollmakerAttack1,"How ineffectual." KinkyDungeonRemindJailChaseDollmakerAttack2,"That's cute." @@ -6701,16 +8209,151 @@ KinkyDungeonRemindJailDollmakerDisarm,"Did you think that would work?" KinkyDungeonRemindJailDollmakerHit,"Let's put those hands of yours away~" KinkyDungeonRemindJailDollmakerHitPlayer,"You are mine." KinkyDungeonRemindJailDollmakerMiss,"You're a fast one." +KinkyDungeonRemindJailDollmakerBlock,"You're a fast one." KinkyDungeonRemindJailDollmakerMissedMe,"Your antics amuse me~" +KinkyDungeonRemindJailDollmakerBlockedMe,"Your antics amuse me~" KinkyDungeonRemindJailDollmakerLeash,"It's time for your makeover!" KinkyDungeonRemindJailDollmakerPull,"Come to me." KinkyDungeonRemindJailDollmakerStun,"A shame it ends here." KinkyDungeonRemindJailDollmakerPickpocket,"You won't be needing that." KinkyDungeonRemindJailDollmakerLock,"Tsk Tsk. I'll be keeping the keys." - - - - +KinkyDungeonRemindJailDollmakerIntro,"I used to be an adventurer like you~ My name was PTRN..." +KinkyDungeonRemindJailChaseDollmakerDefend0,"You don't know who you're messing with." +KinkyDungeonRemindJailChaseDollmakerDefend1,"You won't be allowed to make that mistake twice." +KinkyDungeonRemindJailChaseDollmakerDefend2,"I'll punish you myself." +KinkyDungeonRemindJailChaseDollmakerDefendHonor0,"Hands off my property." +KinkyDungeonRemindJailChaseDollmakerDefendHonor1,"Know your place, girl!" +KinkyDungeonRemindJailChaseDollmakerDefendHonor2,"You've had your chance." +KinkyDungeonRemindJailChaseDollmakerHonor0,"Fine, then." +KinkyDungeonRemindJailChaseDollmakerHonor1,"Know your place!" +KinkyDungeonRemindJailChaseDollmakerHonor2,"You've had your chance." +KinkyDungeonRemindJailChaseDollmakerCommandDefend,"*sighs*" +KinkyDungeonRemindJailChaseDollmakerCommandAssault,"" +KinkyDungeonRemindJailChaseDollmakerCommandBlock,"" + + +KinkyDungeonRemindJailCastTheWarden,"Hmmph~" +KinkyDungeonRemindJailMiscastTheWarden,"My mistake~" +KinkyDungeonRemindJailPlayHelplessTheWarden0,"This wasn't supposed to happen." +KinkyDungeonRemindJailPlayHelplessTheWarden1,"The Collector has become the Collected." +KinkyDungeonRemindJailPlayHelplessTheWarden2,"Fine, you win!" +KinkyDungeonRemindJailPlayBratTheWarden0,"Cover me you brats!" +KinkyDungeonRemindJailPlayBratTheWarden1,"She's coming for me!" +KinkyDungeonRemindJailPlayBratTheWarden2,"Stay away!" +KinkyDungeonRemindJailPlaySubTheWarden0,"Time for a taste of my own medicine..." +KinkyDungeonRemindJailPlaySubTheWarden1,"I've been a bad girl, won't you do something about it?" +KinkyDungeonRemindJailPlaySubTheWarden2,"Mmmph... maybe I talk too much..." +KinkyDungeonRemindJailPlayTheWarden0,"I wonder how many days we'll get to spend together!" +KinkyDungeonRemindJailPlayTheWarden1,"You look so pretty as always, and forevermore~" +KinkyDungeonRemindJailPlayTheWarden2,"Time for an inspection~" +KinkyDungeonRemindJailPlayTheWardenStruggle,"There's no use in struggling, dear! I've made sure it's extra tight." +KinkyDungeonRemindJailPlayTheWardenLeash,"Playtime is over, back to your cell~" +KinkyDungeonRemindJailPlayTheWardenFree,"Why aren't you wearing your restraints?" +KinkyDungeonRemindJailPlayTheWardenLoot,"I did not order you to clean~" +KinkyDungeonRemindJailPlayTheWardenKey,"What's that you've got there?" +KinkyDungeonRemindJailChaseTheWardenAlert,"Found you!" +KinkyDungeonRemindJailChaseTheWardenAttack0,"I've been waiting for this~" +KinkyDungeonRemindJailChaseTheWardenAttack1,"Show me your moves." +KinkyDungeonRemindJailChaseTheWardenAttack2,"You'll make for a fine servant!" +KinkyDungeonRemindJailChaseTheWardenSpell0,"Very impressive." +KinkyDungeonRemindJailChaseTheWardenSpell1,"Yes, yes, show me what you've got!" +KinkyDungeonRemindJailChaseTheWardenSpell2,"I've always wanted another mage." +KinkyDungeonRemindJailChaseTheWardenSpellItem,"Tsk tsk, no silly tricks~" +KinkyDungeonRemindJailChaseTheWardenShrine,"Now now, you don't have permission to do that~" +KinkyDungeonRemindJailChaseTheWardenChest,"What do you think you're doing?" +KinkyDungeonRemindJailChaseTheWardenOrb,"Typical adventurers~" +KinkyDungeonRemindJailChaseTheWardenJailbreak,"Oh, you got out?" +KinkyDungeonRemindJailTheWardenGrab,"Too bad~" +KinkyDungeonRemindJailTheWardenDisarm,"That thing is dangerous, my dear~" +KinkyDungeonRemindJailTheWardenHit,"A feisty one, aren't you~" +KinkyDungeonRemindJailTheWardenHitPlayer,"Playtime's over~" +KinkyDungeonRemindJailTheWardenMiss,"Very nice." +KinkyDungeonRemindJailTheWardenBlock,"Most impressive!" +KinkyDungeonRemindJailTheWardenMissedMe,"You need more training!" +KinkyDungeonRemindJailTheWardenBlockedMe,"You need more training!" +KinkyDungeonRemindJailTheWardenLeash,"Come along now~" +KinkyDungeonRemindJailTheWardenPull,"Come closer, I want to see your face~" +KinkyDungeonRemindJailTheWardenStun,"What a shame." +KinkyDungeonRemindJailTheWardenPickpocket,"What's this?" +KinkyDungeonRemindJailTheWardenLock,"See if you can get out of that!" +KinkyDungeonRemindJailTheWardenIntro,"I am the Warden. All things in this dungeon are subject to me." +KinkyDungeonRemindJailChaseTheWardenDefend0,"Hands off my pet~" +KinkyDungeonRemindJailChaseTheWardenDefend1,"Careful what you ask for~" +KinkyDungeonRemindJailChaseTheWardenDefend2,"Be gentle with her~" +KinkyDungeonRemindJailChaseTheWardenDefendHonor0,"Careful what you ask for~" +KinkyDungeonRemindJailChaseTheWardenDefendHonor1,"That's my property~" +KinkyDungeonRemindJailChaseTheWardenDefendHonor2,"Be gentle with her~" +KinkyDungeonRemindJailChaseTheWardenHonor0,"You've made some enemies, haven't you?" +KinkyDungeonRemindJailChaseTheWardenHonor1,"I should teach you to be a nice girl." +KinkyDungeonRemindJailChaseTheWardenHonor2,"You need to learn some manners~" +KinkyDungeonRemindJailChaseTheWardenCommandDefend,"This will be entertaining." +KinkyDungeonRemindJailChaseTheWardenCommandAssault,"Show me what you've got~" +KinkyDungeonRemindJailChaseTheWardenCommandBlock,"I'll watch~" + + +KinkyDungeonRemindJailCastSilverWitch,"Submit to my SPL!" +KinkyDungeonRemindJailMiscastSilverWitch,"Hmmmph... SPL--" +KinkyDungeonRemindJailPlayHelplessSilverWitch0,"Fine then! Have it your way." +KinkyDungeonRemindJailPlayHelplessSilverWitch1,"You'll be sorry you didn't listen to me~" +KinkyDungeonRemindJailPlayHelplessSilverWitch2,"Why must you be so difficult!" +KinkyDungeonRemindJailPlayBratSilverWitch0,"Cover me you brats!" +KinkyDungeonRemindJailPlayBratSilverWitch1,"They're coming for me!" +KinkyDungeonRemindJailPlayBratSilverWitch2,"Stay away!" +KinkyDungeonRemindJailPlaySubSilverWitch0,"Time for a taste of my own medicine..." +KinkyDungeonRemindJailPlaySubSilverWitch1,"I've been a bad girl, won't you do something about it?" +KinkyDungeonRemindJailPlaySubSilverWitch2,"Mmmph... maybe I talk too much..." +KinkyDungeonRemindJailPlaySilverWitch0,"I wonder how many days we'll get to spend together!" +KinkyDungeonRemindJailPlaySilverWitch1,"You look so pretty as always, and forevermore~" +KinkyDungeonRemindJailPlaySilverWitch2,"Time for an inspection~" +KinkyDungeonRemindJailPlaySilverWitchStruggle,"There's no use in struggling, dear! I've made sure it's extra tight." +KinkyDungeonRemindJailPlaySilverWitchLeash,"Playtime is over, back to your cell~" +KinkyDungeonRemindJailPlaySilverWitchFree,"Why aren't you wearing your restraints?" +KinkyDungeonRemindJailPlaySilverWitchLoot,"I did not order you to clean~" +KinkyDungeonRemindJailPlaySilverWitchKey,"What's that you've got there?" +KinkyDungeonRemindJailChaseSilverWitchAlert,"Found you!" +KinkyDungeonRemindJailChaseSilverWitchAttack0,"I've been waiting for this~" +KinkyDungeonRemindJailChaseSilverWitchAttack1,"Show me your moves." +KinkyDungeonRemindJailChaseSilverWitchAttack2,"You'll make for a fine servant!" +KinkyDungeonRemindJailChaseSilverWitchSpell0,"Very impressive." +KinkyDungeonRemindJailChaseSilverWitchSpell1,"Yes, yes, show me what you've got!" +KinkyDungeonRemindJailChaseSilverWitchSpell2,"I've always wanted another mage." +KinkyDungeonRemindJailChaseSilverWitchSpellItem,"Tsk tsk, no silly tricks~" +KinkyDungeonRemindJailChaseSilverWitchShrine,"Now now, you don't have permission to do that~" +KinkyDungeonRemindJailChaseSilverWitchChest,"What do you think you're doing?" +KinkyDungeonRemindJailChaseSilverWitchOrb,"Typical adventurers~" +KinkyDungeonRemindJailChaseSilverWitchJailbreak,"Oh, you got out?" +KinkyDungeonRemindJailSilverWitchGrab,"Too bad~" +KinkyDungeonRemindJailSilverWitchDisarm,"That thing is dangerous, my dear~" +KinkyDungeonRemindJailSilverWitchHit,"A feisty one, aren't you~" +KinkyDungeonRemindJailSilverWitchHitPlayer,"Playtime's over~" +KinkyDungeonRemindJailSilverWitchMiss,"Very nice." +KinkyDungeonRemindJailSilverWitchBlock,"Most impressive!" +KinkyDungeonRemindJailSilverWitchMissedMe,"You need more training!" +KinkyDungeonRemindJailSilverWitchBlockedMe,"You need more training!" +KinkyDungeonRemindJailSilverWitchLeash,"Come along now~" +KinkyDungeonRemindJailSilverWitchPull,"Come closer, I want to see your face~" +KinkyDungeonRemindJailSilverWitchStun,"What a shame." +KinkyDungeonRemindJailSilverWitchPickpocket,"What's this?" +KinkyDungeonRemindJailSilverWitchLock,"See if you can get out of that!" +KinkyDungeonRemindJailSilverWitchIntro,"Do you know of the Dollmaker? I've got a proposal for you and I..." +KinkyDungeonRemindJailChaseSilverWitchDefend0,"Hands off my pet~" +KinkyDungeonRemindJailChaseSilverWitchDefend1,"Careful what you ask for~" +KinkyDungeonRemindJailChaseSilverWitchDefend2,"Be gentle with her~" +KinkyDungeonRemindJailChaseSilverWitchDefendHonor0,"Careful what you ask for~" +KinkyDungeonRemindJailChaseSilverWitchDefendHonor1,"That's my property~" +KinkyDungeonRemindJailChaseSilverWitchDefendHonor2,"Be gentle with her~" +KinkyDungeonRemindJailChaseSilverWitchHonor0,"You've made some enemies, haven't you?" +KinkyDungeonRemindJailChaseSilverWitchHonor1,"I should teach you to be a nice girl." +KinkyDungeonRemindJailChaseSilverWitchHonor2,"You need to learn some manners~" +KinkyDungeonRemindJailChaseSilverWitchCommandDefend,"This will be entertaining." +KinkyDungeonRemindJailChaseSilverWitchCommandAssault,"Show me what you've got~" +KinkyDungeonRemindJailChaseSilverWitchCommandBlock,"I'll watch~" + +KinkyDungeonRemindJailCast,"I cast SPL!" +KinkyDungeonRemindJailMiscast,"That wasn't supposed to happen!" +KinkyDungeonRemindJailPlayHelpless0,"This is too tight..." +KinkyDungeonRemindJailPlayHelpless1,"You'll never get away with this!" +KinkyDungeonRemindJailPlayHelpless2,"I can't get free!" KinkyDungeonRemindJailPlayBrat0,"Catch me if you can!" KinkyDungeonRemindJailPlayBrat1,"You'll never get away with this!" KinkyDungeonRemindJailPlayBrat2,"I don't want to be your slave!" @@ -6722,6 +8365,7 @@ KinkyDungeonRemindJailPlayStruggle,"You look like you're having fun!" KinkyDungeonRemindJailPlayLeash,"I have somewhere else in mind for you~" KinkyDungeonRemindJailPlayLoot,"What do you think you're doing with that?" KinkyDungeonRemindJailPlayKey,"Looks like you found my keys! Hand them over." +KinkyDungeonRemindJailChaseAlert,"Alert!" KinkyDungeonRemindJailPlay0,"You look like a good girl. Come on~" KinkyDungeonRemindJailPlay1,"Come here, let's play!" KinkyDungeonRemindJailPlay2,"*grins and starts walking toward you*" @@ -6741,14 +8385,33 @@ KinkyDungeonRemindJailDisarm,"Try that again!" KinkyDungeonRemindJailHit,"Do your worst!" KinkyDungeonRemindJailHitPlayer,"Got you!" KinkyDungeonRemindJailMiss,"Get back here!" +KinkyDungeonRemindJailBlock,"Get back here!" KinkyDungeonRemindJailMissedMe,"Missed me!" +KinkyDungeonRemindJailBlockedMe,"Missed me!" KinkyDungeonRemindJailLeash,"You're coming with me!" KinkyDungeonRemindJailPull,"Get over here!" KinkyDungeonRemindJailStun,"Not so slippery now!" KinkyDungeonRemindJailPickpocket,"Hand it over." KinkyDungeonRemindJailLock,"Nice and tight!" - - +KinkyDungeonRemindJailIntro,"The name's PTRN." +KinkyDungeonRemindJailChaseDefend0,"What the--" +KinkyDungeonRemindJailChaseDefend1,"You won't get away with this!" +KinkyDungeonRemindJailChaseDefend2,"I'm coming!" +KinkyDungeonRemindJailChaseDefendHonor0,"I can't let you do that!" +KinkyDungeonRemindJailChaseDefendHonor1,"You'll pay for this!" +KinkyDungeonRemindJailChaseDefendHonor2,"That was a mistake!" +KinkyDungeonRemindJailChaseHonor0,"I'm joining in!" +KinkyDungeonRemindJailChaseHonor1,"Hand on, I'm coming!" +KinkyDungeonRemindJailChaseHonor2,"I'm here!" +KinkyDungeonRemindJailChaseCommandDefend,"Here I come!" +KinkyDungeonRemindJailChaseCommandAssault,"Come and get me!" +KinkyDungeonRemindJailChaseCommandBlock,"You'll never escape!" + +KinkyDungeonRemindJailCastGagged,"Mmmphh!" +KinkyDungeonRemindJailMiscastGagged,"Mmmm! Mmmmmmm!" +KinkyDungeonRemindJailPlayHelplessGagged0,"Mmmmph!!!" +KinkyDungeonRemindJailPlayHelplessGagged1,"Mmmmm~" +KinkyDungeonRemindJailPlayHelplessGagged2,"Mmmgh!" KinkyDungeonRemindJailPlayBratGagged0,"Mmmmph!!!" KinkyDungeonRemindJailPlayBratGagged1,"Mmmmm~" KinkyDungeonRemindJailPlayBratGagged2,"Mmmgh!" @@ -6760,6 +8423,7 @@ KinkyDungeonRemindJailPlayGaggedStruggle,"*giggles*" KinkyDungeonRemindJailPlayGaggedLeash,"*giggles eagerly*" KinkyDungeonRemindJailPlayGaggedLoot,"Mmmph?" KinkyDungeonRemindJailPlayGaggedKey,"Mmmghgh!!!" +KinkyDungeonRemindJailChaseGaggedAlert,"Mmmmph!" KinkyDungeonRemindJailPlayGagged0,"Mmmmph..." KinkyDungeonRemindJailPlayGagged1,"Hhhhmph!" KinkyDungeonRemindJailPlayGagged2,"Mmmmmmmmm..." @@ -6779,16 +8443,36 @@ KinkyDungeonRemindJailGaggedDisarm,"*jumps up and down excitedly*" KinkyDungeonRemindJailGaggedHit,"*groans*" KinkyDungeonRemindJailGaggedHitPlayer,"*does a happy dance*" KinkyDungeonRemindJailGaggedMiss,"Mmmph!!!" +KinkyDungeonRemindJailGaggedBlock,"Mmmph!!!" KinkyDungeonRemindJailGaggedMissedMe,"*giggles*" +KinkyDungeonRemindJailGaggedBlockedMe,"*giggles*" KinkyDungeonRemindJailGaggedLeash,"Mmmph." KinkyDungeonRemindJailGaggedPull,"Nngghhh!" KinkyDungeonRemindJailGaggedStun,"Mmm-hmmm." KinkyDungeonRemindJailGaggedPickpocket,"Mmmmmmm~" KinkyDungeonRemindJailGaggedLock,"Mmmph~" - - - - +KinkyDungeonRemindJailGaggedIntro,"*Her nametag says 'PTRN'*" +KinkyDungeonRemindJailChaseGaggedDefend0,"Mmmph!!" +KinkyDungeonRemindJailChaseGaggedDefend1,"Mmmmmmph!!!" +KinkyDungeonRemindJailChaseGaggedDefend2,"Mmmm..." +KinkyDungeonRemindJailChaseGaggedDefendHonor0,"Mmmm--!" +KinkyDungeonRemindJailChaseGaggedDefendHonor1,"Mmmmph." +KinkyDungeonRemindJailChaseGaggedDefendHonor2,"Mmmmmmmgh!" +KinkyDungeonRemindJailChaseGaggedHonor0,"Mmph!" +KinkyDungeonRemindJailChaseGaggedHonor1,"Mmm~" +KinkyDungeonRemindJailChaseGaggedHonor2,"Mmmmmmmph..." +KinkyDungeonRemindJailChaseGaggedCommandDefend,"" +KinkyDungeonRemindJailChaseGaggedCommandAssault,"MMMMMPH!!!" +KinkyDungeonRemindJailChaseGaggedCommandBlock,"" + + + + +KinkyDungeonRemindJailCastMummy,"*focuses intently*" +KinkyDungeonRemindJailMiscastMummy,"*appears distracted*" +KinkyDungeonRemindJailPlayHelplessGaggedMummy0,"Mmmmph!!!" +KinkyDungeonRemindJailPlayHelplessGaggedMummy1,"Mmmmm~" +KinkyDungeonRemindJailPlayHelplessGaggedMummy2,"Mmmgh!" KinkyDungeonRemindJailPlayBratGaggedMummy0,"Mmmmph!!!" KinkyDungeonRemindJailPlayBratGaggedMummy1,"Mmmmm~" KinkyDungeonRemindJailPlayBratGaggedMummy2,"Mmmgh!" @@ -6800,6 +8484,7 @@ KinkyDungeonRemindJailPlayGaggedMummyStruggle,"*muffled giggle*" KinkyDungeonRemindJailPlayGaggedMummyLeash,"Mmmm~" KinkyDungeonRemindJailPlayGaggedMummyLoot,"Mmmph?" KinkyDungeonRemindJailPlayGaggedMummyKey,"Mmmghgh!!!" +KinkyDungeonRemindJailChaseGaggedMummyAlert,"Mmmmph!" KinkyDungeonRemindJailPlayGaggedMummy0,"Mmmmph..." KinkyDungeonRemindJailPlayGaggedMummy1,"Hhhhmph!" KinkyDungeonRemindJailPlayGaggedMummy2,"Mmmmmmmmm..." @@ -6819,13 +8504,34 @@ KinkyDungeonRemindJailGaggedMummyDisarm,"*muffled giggle*" KinkyDungeonRemindJailGaggedMummyHit,"*groans*" KinkyDungeonRemindJailGaggedMummyHitPlayer,"*muffled giggle*" KinkyDungeonRemindJailGaggedMummyMiss,"Mmmph!!!" +KinkyDungeonRemindJailGaggedMummyBlock,"Mmmph!!!" KinkyDungeonRemindJailGaggedMummyMissedMe,"*muffled giggle*" +KinkyDungeonRemindJailGaggedMummyBlockedMe,"*muffled giggle*" KinkyDungeonRemindJailGaggedMummyLeash,"Mmmph." KinkyDungeonRemindJailGaggedMummyPull,"Nngghhh!" KinkyDungeonRemindJailGaggedMummyStun,"Mmm-hmmm." KinkyDungeonRemindJailGaggedMummyPickpocket,"Mmmmmmm~" KinkyDungeonRemindJailGaggedMummyLock,"Mmmph~" - +KinkyDungeonRemindJailGaggedMummyIntro,"*Her headpiece says 'PTRN'*" +KinkyDungeonRemindJailChaseGaggedMummyDefend0,"Mmmph!!" +KinkyDungeonRemindJailChaseGaggedMummyDefend1,"Mmmmmmph!!!" +KinkyDungeonRemindJailChaseGaggedMummyDefend2,"Mmmm..." +KinkyDungeonRemindJailChaseGaggedMummyDefendHonor0,"Mmmm--!" +KinkyDungeonRemindJailChaseGaggedMummyDefendHonor1,"Mmmmph." +KinkyDungeonRemindJailChaseGaggedMummyDefendHonor2,"Mmmmmmmgh!" +KinkyDungeonRemindJailChaseGaggedMummyHonor0,"Mmph!" +KinkyDungeonRemindJailChaseGaggedMummyHonor1,"Mmm~" +KinkyDungeonRemindJailChaseGaggedMummyHonor2,"Mmmmmmmph..." +KinkyDungeonRemindJailChaseGaggedMummyCommandDefend,"" +KinkyDungeonRemindJailChaseGaggedMummyCommandAssault,"MMMMMPH!!!" +KinkyDungeonRemindJailChaseGaggedMummyCommandBlock,"" + + +KinkyDungeonRemindJailCastBandit,"Watch out for my SPL!" +KinkyDungeonRemindJailMiscastBandit,"Whoops!" +KinkyDungeonRemindJailPlayHelplessBandit0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessBandit1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessBandit2,"I can't get free!" KinkyDungeonRemindJailPlayBratBandit0,"You'll never catch me!" KinkyDungeonRemindJailPlayBratBandit1,"Where'd you come from?" KinkyDungeonRemindJailPlayBratBandit2,"No! Definitely don't like... tie me up and punish me!" @@ -6837,6 +8543,7 @@ KinkyDungeonRemindJailPlayBanditStruggle,"Look who's enjoying herself~" KinkyDungeonRemindJailPlayBanditLeash,"Let's put you up for auction!" KinkyDungeonRemindJailPlayBanditLoot,"What are you rummaging around for?" KinkyDungeonRemindJailPlayBanditKey,"Oh no you don't!" +KinkyDungeonRemindJailChaseBanditAlert,"You're not supposed to be here..." KinkyDungeonRemindJailPlayBandit0,"I'm gonna teach you a lesson, girl." KinkyDungeonRemindJailPlayBandit1,"I'm gonna miss you when we find you a nice master..." KinkyDungeonRemindJailPlayBandit2,"Looks like you need some training, girl." @@ -6856,13 +8563,33 @@ KinkyDungeonRemindJailBanditDisarm,"*scoffs* Amateur." KinkyDungeonRemindJailBanditHit,"Do your worst!" KinkyDungeonRemindJailBanditHitPlayer,"Got you!" KinkyDungeonRemindJailBanditMiss,"Hmph. Get back here!" +KinkyDungeonRemindJailBanditBlock,"Why won't you surrender!" KinkyDungeonRemindJailBanditMissedMe,"Missed me!" +KinkyDungeonRemindJailBanditBlockedMe,"Not a chance!" KinkyDungeonRemindJailBanditLeash,"Boss! We got another one!" KinkyDungeonRemindJailBanditPull,"Get over here!" KinkyDungeonRemindJailBanditStun,"Caught ya~" KinkyDungeonRemindJailBanditPickpocket,"Dibs on this one!" KinkyDungeonRemindJailBanditLock,"Gotta make sure no one gets to you~" - +KinkyDungeonRemindJailBanditIntro,"I'm PTRN. And who might you be?" +KinkyDungeonRemindJailChaseBanditDefend0,"Bad time to party, girl~" +KinkyDungeonRemindJailChaseBanditDefend1,"You've got nerve showing your face around here." +KinkyDungeonRemindJailChaseBanditDefend2,"Don't think you can get away~" +KinkyDungeonRemindJailChaseBanditDefendHonor0,"Trying to fight your way out?" +KinkyDungeonRemindJailChaseBanditDefendHonor1,"Well, looks like I'm having fun today." +KinkyDungeonRemindJailChaseBanditDefendHonor2,"Hey girls, got room for one more?" +KinkyDungeonRemindJailChaseBanditHonor0,"We work for the highest bidder." +KinkyDungeonRemindJailChaseBanditHonor1,"Nothing personal." +KinkyDungeonRemindJailChaseBanditHonor2,"Sorry, it's just the way things work." +KinkyDungeonRemindJailChaseBanditCommandDefend,"I'm coming!" +KinkyDungeonRemindJailChaseBanditCommandAssault,"You're mine." +KinkyDungeonRemindJailChaseBanditCommandBlock,"You can't get away." + +KinkyDungeonRemindJailCastSkeleton,"*extends an arm*" +KinkyDungeonRemindJailMiscastSkeleton,"*miscast*" +KinkyDungeonRemindJailPlayHelplessSkeleton0,"*wiggles*" +KinkyDungeonRemindJailPlayHelplessSkeleton1,"*struggles*" +KinkyDungeonRemindJailPlayHelplessSkeleton2,"*rattles*" KinkyDungeonRemindJailPlayBratSkeleton0,"This is a bug, please report" KinkyDungeonRemindJailPlayBratSkeleton1,"This is a bug, please report" KinkyDungeonRemindJailPlayBratSkeleton2,"This is a bug, please report" @@ -6874,6 +8601,7 @@ KinkyDungeonRemindJailPlaySkeletonStruggle,"*won't leave you be!*" KinkyDungeonRemindJailPlaySkeletonLeash,"*tugs at your body!*" KinkyDungeonRemindJailPlaySkeletonLoot,"*runs at you*" KinkyDungeonRemindJailPlaySkeletonKey,"*notices you!*" +KinkyDungeonRemindJailChaseSkeletonAlert,"*claps loudly*" KinkyDungeonRemindJailPlaySkeleton0,"*wants to socialize*" KinkyDungeonRemindJailPlaySkeleton1,"*sends shivers down your spine*" KinkyDungeonRemindJailPlaySkeleton2,"*runs at you*" @@ -6893,16 +8621,96 @@ KinkyDungeonRemindJailSkeletonDisarm,"*disarms*" KinkyDungeonRemindJailSkeletonHit,"*is rattled*" KinkyDungeonRemindJailSkeletonHitPlayer,"*rattles excitedly*" KinkyDungeonRemindJailSkeletonMiss,"*misses*" +KinkyDungeonRemindJailSkeletonBlock,"*flails uselessly*" KinkyDungeonRemindJailSkeletonMissedMe,"*trembles*" +KinkyDungeonRemindJailSkeletonBlockedMe,"*trembles*" KinkyDungeonRemindJailSkeletonLeash,"*tugs on leash*" KinkyDungeonRemindJailSkeletonPull,"*rattles*" KinkyDungeonRemindJailSkeletonStun,"*rattles excitedly*" KinkyDungeonRemindJailSkeletonPickpocket,"*rattles excitedly*" KinkyDungeonRemindJailSkeletonLock,"*rattles*" - -KinkyDungeonRemindJailPlayBratRobot0,"Bug" -KinkyDungeonRemindJailPlayBratRobot1,"Bug" -KinkyDungeonRemindJailPlayBratRobot2,"Bug" +KinkyDungeonRemindJailSkeletonIntro,"*Wears a sign saying 'PTRN'*" +KinkyDungeonRemindJailChaseSkeletonDefend0,"!!!" +KinkyDungeonRemindJailChaseSkeletonDefend1,"!!!" +KinkyDungeonRemindJailChaseSkeletonDefend2,"!!!" +KinkyDungeonRemindJailChaseSkeletonDefendHonor0,"!" +KinkyDungeonRemindJailChaseSkeletonDefendHonor1,"!" +KinkyDungeonRemindJailChaseSkeletonDefendHonor2,"!" +KinkyDungeonRemindJailChaseSkeletonHonor0,"!" +KinkyDungeonRemindJailChaseSkeletonHonor1,"*rattles*" +KinkyDungeonRemindJailChaseSkeletonHonor2,"!!!" +KinkyDungeonRemindJailChaseSkeletonCommandDefend,"" +KinkyDungeonRemindJailChaseSkeletonCommandAssault,"" +KinkyDungeonRemindJailChaseSkeletonCommandBlock,"*marches*" + +KinkyDungeonRemindJailCastCyborg,"Engaging SPL!" +KinkyDungeonRemindJailMiscastCyborg,"A-Access denied!?" +KinkyDungeonRemindJailPlayHelplessCyborg0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessCyborg1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessCyborg2,"I can't get free!" +KinkyDungeonRemindJailPlayBratCyborg0,"This... this unit is doing a good job! I swear!" +KinkyDungeonRemindJailPlayBratCyborg1,"It's just business as usual, nothing to see here..." +KinkyDungeonRemindJailPlayBratCyborg2,"It's not like I need reconfiguring or anything..." +KinkyDungeonRemindJailPlaySubCyborg0,"You! I require... reconfiguring." +KinkyDungeonRemindJailPlaySubCyborg1,"Oh no! Looks like I need repairs~" +KinkyDungeonRemindJailPlaySubCyborg2,"I've violated my parameters. Please discipline me." +KinkyDungeonRemindJailPlayCyborgFree,"Stop! You're not wearing the required uniform~" +KinkyDungeonRemindJailPlayCyborgStruggle,"Are your restraints too loose? Do I need to tighten them?" +KinkyDungeonRemindJailPlayCyborgLeash,"Transferring to a secure location." +KinkyDungeonRemindJailPlayCyborgLoot,"You've violated your parameters." +KinkyDungeonRemindJailPlayCyborgKey,"Insufficient security clearance. Hand it over." +KinkyDungeonRemindJailChaseCyborgAlert,"Please present your identification!" +KinkyDungeonRemindJailPlayCyborg0,"Hello doll. Do your settings need adjustment?" +KinkyDungeonRemindJailPlayCyborg1,"Looks like you've had too much time to yourself~" +KinkyDungeonRemindJailPlayCyborg2,"A good doll needs routine maintenance~" +KinkyDungeonRemindJailChaseCyborgAttack0,"Ehh! The dolls aren't supposed to fight back!" +KinkyDungeonRemindJailChaseCyborgAttack1,"In-initiating corrective action!" +KinkyDungeonRemindJailChaseCyborgAttack2,"Alert! Inmate has gone rogue!" +KinkyDungeonRemindJailChaseCyborgSpell0,"Who gave you permission to use magic?" +KinkyDungeonRemindJailChaseCyborgSpell1,"Unauthorized use of magic is grounds for increased security." +KinkyDungeonRemindJailChaseCyborgSpell2,"Magic users require extra security!" +KinkyDungeonRemindJailChaseCyborgSpellItem,"Subduing assailant!" +KinkyDungeonRemindJailChaseCyborgShrine,"You're not allowed to contact the goddesses. Please meditate on this in your cell." +KinkyDungeonRemindJailChaseCyborgChest,"Behavior exceeds parameters. Please submit to arrest." +KinkyDungeonRemindJailChaseCyborgOrb,"You're not allowed to contact the goddesses. Please meditate on this in your cell." +KinkyDungeonRemindJailChaseCyborgJailbreak,"Alert! Inmate has escaped!" +KinkyDungeonRemindJailCyborgGrab,"Don't you want to be trained?" +KinkyDungeonRemindJailCyborgDisarm,"Aren't you a violent one!" +KinkyDungeonRemindJailCyborgHit,"Ouch! That hurt..." +KinkyDungeonRemindJailCyborgHitPlayer,"That'll be all from you!" +KinkyDungeonRemindJailCyborgMiss,"Your brat quotient is off the charts." +KinkyDungeonRemindJailCyborgBlock,"Your brat quotient is off the charts." +KinkyDungeonRemindJailCyborgMissedMe,"Please stop and submit to arrest." +KinkyDungeonRemindJailCyborgBlockedMe,"Please stop and submit to arrest." +KinkyDungeonRemindJailCyborgLeash,"Subject captured!" +KinkyDungeonRemindJailCyborgPull,"Come back, doll!" +KinkyDungeonRemindJailCyborgStun,"Deploying capture device." +KinkyDungeonRemindJailCyborgPickpocket,"I'll be confiscating that!" +KinkyDungeonRemindJailCyborgLock,"How'd you slip through security?" +KinkyDungeonRemindJailCyborgIntro,"I'm PTRN, and today I shall be taking care of you~" +KinkyDungeonRemindJailChaseCyborgDefend0,"Enemy spotted!" +KinkyDungeonRemindJailChaseCyborgDefend1,"Target in my sights!" +KinkyDungeonRemindJailChaseCyborgDefend2,"Red alert!" +KinkyDungeonRemindJailChaseCyborgDefendHonor0,"Lay down your weapons!" +KinkyDungeonRemindJailChaseCyborgDefendHonor1,"Surrender and I'll be gentle! Relatively speaking..." +KinkyDungeonRemindJailChaseCyborgDefendHonor2,"Give up or I'll call reinforcements!" +KinkyDungeonRemindJailChaseCyborgHonor0,"Ack! We have an unruly subject!" +KinkyDungeonRemindJailChaseCyborgHonor1,"Target needs retraining..." +KinkyDungeonRemindJailChaseCyborgHonor2,"Sorry, rules are rules~" +KinkyDungeonRemindJailChaseCyborgCommandDefend,"Moving to assist!" +KinkyDungeonRemindJailChaseCyborgCommandAssault,"My orders are to shut you down~" +KinkyDungeonRemindJailChaseCyborgCommandBlock,"Defenses online!" + + +KinkyDungeonRemindJailCastRobot,"SPL armed." +KinkyDungeonRemindJailMiscastRobot,"An exception has occurred while trying to run SPL. Retry?" +KDJailerHiSecDialogueRobot,"Error in citizen ID registration. Please submit to processing." +KinkyDungeonRemindJailPlayHelplessRobot0,"Does not compute." +KinkyDungeonRemindJailPlayHelplessRobot1,"Some kind of miscalculation has occurred." +KinkyDungeonRemindJailPlayHelplessRobot2,"This was unforseen." +KinkyDungeonRemindJailPlayBratRobot0,"Unit is retreating." +KinkyDungeonRemindJailPlayBratRobot1,"Activating self-preservation instincts." +KinkyDungeonRemindJailPlayBratRobot2,"Commence tactical withdrawal." KinkyDungeonRemindJailPlaySubRobot0,"Maintenance needed." KinkyDungeonRemindJailPlaySubRobot1,"Unit needs repair." KinkyDungeonRemindJailPlaySubRobot2,"Commence transfer of power protocol." @@ -6911,11 +8719,12 @@ KinkyDungeonRemindJailPlayRobotStruggle,"Commence routine inspection." KinkyDungeonRemindJailPlayRobotLeash,"Inmate is out of containment. Transferring." KinkyDungeonRemindJailPlayRobotLoot,"Theft detected. This is a warning." KinkyDungeonRemindJailPlayRobotKey,"Confiscating item." +KinkyDungeonRemindJailChaseRobotAlert,"Unknown subject detected. Presuming hostile." KinkyDungeonRemindJailPlayRobot0,"Inmate detected. Commence training protocol." KinkyDungeonRemindJailPlayRobot1,"Inmate detected. Commence routine inspection." KinkyDungeonRemindJailPlayRobot2,"Inmate detected. Commence submission training." KinkyDungeonRemindJailChaseRobotAttack0,"Violence detected. Subduing assailant." -KinkyDungeonRemindJailChaseRobotAttack1,"Damage detected. Initiating combat routine" +KinkyDungeonRemindJailChaseRobotAttack1,"Damage detected. Initiating combat routine." KinkyDungeonRemindJailChaseRobotAttack2,"Unruly inmate detected. Performing corrective action." KinkyDungeonRemindJailChaseRobotSpell0,"Magic detected. Subduing assailant." KinkyDungeonRemindJailChaseRobotSpell1,"Energy spike detected. Preparing shields." @@ -6929,14 +8738,94 @@ KinkyDungeonRemindJailRobotGrab,"Error, subject is attempting to escape." KinkyDungeonRemindJailRobotDisarm,"Target is violent. Disarming subject." KinkyDungeonRemindJailRobotHit,"Target is violent. Increase alert level." KinkyDungeonRemindJailRobotHitPlayer,"Dispensing restraints." -KinkyDungeonRemindJailRobotMiss,"Target resists. Revising strategy." -KinkyDungeonRemindJailRobotMissedMe,"Target combat skills below expected level. Revising estimates." +KinkyDungeonRemindJailRobotMiss,"Target flees. Revising strategy." +KinkyDungeonRemindJailRobotBlock,"Target resists. Revising tactics." +KinkyDungeonRemindJailRobotMissedMe,"Target skill below expected level. Revising strategy." +KinkyDungeonRemindJailRobotBlockedMe,"Target skill below expected level. Revising tactics." KinkyDungeonRemindJailRobotLeash,"Subject captured. Returning to processing." KinkyDungeonRemindJailRobotPull,"Apply takedown protocol." KinkyDungeonRemindJailRobotStun,"Aggressive target detected. Deploying countermeasures." KinkyDungeonRemindJailRobotPickpocket,"Contraband detected. Confiscating." KinkyDungeonRemindJailRobotLock,"Increasing strictness level." - +KinkyDungeonRemindJailRobotIntro,"Unit PTRN identifying." +KinkyDungeonRemindJailChaseRobotDefend0,"Red alert. Joining combat." +KinkyDungeonRemindJailChaseRobotDefend1,"Battle stations." +KinkyDungeonRemindJailChaseRobotDefend2,"Target identified." +KinkyDungeonRemindJailChaseRobotDefendHonor0,"Offering support." +KinkyDungeonRemindJailChaseRobotDefendHonor1,"New target identified. Engaging." +KinkyDungeonRemindJailChaseRobotDefendHonor2,"Combat detected. Engaging in corrective action." +KinkyDungeonRemindJailChaseRobotHonor0,"Updating target registry. Proceed to attack." +KinkyDungeonRemindJailChaseRobotHonor1,"Target updated." +KinkyDungeonRemindJailChaseRobotHonor2,"New target detected. Please submit to detainment." +KinkyDungeonRemindJailChaseRobotCommandDefend,"Moving to assist." +KinkyDungeonRemindJailChaseRobotCommandAssault,"Moving to capture." +KinkyDungeonRemindJailChaseRobotCommandBlock,"Forming blockade." + + +KinkyDungeonRemindJailCastRobotProgram,"SPL();" +KinkyDungeonRemindJailMiscastRobotProgram,"throw new Error(SPL);" +KDJailerHiSecDialogueRobotProgram,"query([ID]); >ERROR; transport([UNKNOWN], [DOLL])" +KinkyDungeonRemindJailPlayHelplessRobotProgram0,"Does not compute;" +KinkyDungeonRemindJailPlayHelplessRobotProgram1,"Some kind of miscalculation has occurred;" +KinkyDungeonRemindJailPlayHelplessRobotProgram2,"This was unforseen;" +KinkyDungeonRemindJailPlayBratRobotProgram0,"Unit is retreating;" +KinkyDungeonRemindJailPlayBratRobotProgram1,"Activating self-preservation instincts;" +KinkyDungeonRemindJailPlayBratRobotProgram2,"Commence tactical withdrawal;" +KinkyDungeonRemindJailPlaySubRobotProgram0,"Maintenance needed;" +KinkyDungeonRemindJailPlaySubRobotProgram1,"Unit needs repair;" +KinkyDungeonRemindJailPlaySubRobotProgram2,"Commence transfer of power protocol;" +KinkyDungeonRemindJailPlayRobotProgramFree,"Insufficient bindings; Commence submission protocol;" +KinkyDungeonRemindJailPlayRobotProgramStruggle,"Commence routine inspection;" +KinkyDungeonRemindJailPlayRobotProgramLeash,"Inmate is out of containment; Transferring;" +KinkyDungeonRemindJailPlayRobotProgramLoot,"Theft detected; This is a warning;" +KinkyDungeonRemindJailPlayRobotProgramKey,"Confiscating item;" +KinkyDungeonRemindJailChaseRobotProgramAlert,"Unknown subject detected; Presuming hostile;" +KinkyDungeonRemindJailPlayRobotProgram0,"Inmate detected; Commence training protocol;" +KinkyDungeonRemindJailPlayRobotProgram1,"Inmate detected; Commence routine inspection;" +KinkyDungeonRemindJailPlayRobotProgram2,"Inmate detected; Commence submission training;" +KinkyDungeonRemindJailChaseRobotProgramAttack0,"Violence detected; Subduing assailant;" +KinkyDungeonRemindJailChaseRobotProgramAttack1,"Damage detected; Initiating combat routine;" +KinkyDungeonRemindJailChaseRobotProgramAttack2,"Unruly inmate detected; Performing corrective action;" +KinkyDungeonRemindJailChaseRobotProgramSpell0,"Magic detected; Subduing assailant;" +KinkyDungeonRemindJailChaseRobotProgramSpell1,"Energy spike detected; Preparing shields;" +KinkyDungeonRemindJailChaseRobotProgramSpell2,"Unlawful use of magic; Please submit to arrest;" +KinkyDungeonRemindJailChaseRobotProgramSpellItem,"Violence detected; Subduing assailant;" +KinkyDungeonRemindJailChaseRobotProgramShrine,"Unlawful conduct; Please submit to arrest;" +KinkyDungeonRemindJailChaseRobotProgramChest,"Theft detected; Please submit to arrest;" +KinkyDungeonRemindJailChaseRobotProgramOrb,"Unlawful conduct; Please submit to arrest;" +KinkyDungeonRemindJailChaseRobotProgramJailbreak,"Inmate has escaped; Commence capture protocol;" +KinkyDungeonRemindJailRobotProgramGrab,"Error, subject is attempting to escape;" +KinkyDungeonRemindJailRobotProgramDisarm,"Target is violent; Disarming subject;" +KinkyDungeonRemindJailRobotProgramHit,"Target is violent; Increase alert level;" +KinkyDungeonRemindJailRobotProgramHitPlayer,"Dispensing restraints;" +KinkyDungeonRemindJailRobotProgramMiss,"Target flees; Revising strategy;" +KinkyDungeonRemindJailRobotProgramBlock,"Target resists; Revising tactics;" +KinkyDungeonRemindJailRobotProgramMissedMe,"Target skill below expected level; Revising strategy;" +KinkyDungeonRemindJailRobotProgramBlockedMe,"Target skill below expected level; Revising tactics;" +KinkyDungeonRemindJailRobotProgramLeash,"Subject captured; Returning to processing;" +KinkyDungeonRemindJailRobotProgramPull,"Apply takedown protocol;" +KinkyDungeonRemindJailRobotProgramStun,"Aggressive target detected; Deploying countermeasures;" +KinkyDungeonRemindJailRobotProgramPickpocket,"Contraband detected; Confiscating;" +KinkyDungeonRemindJailRobotProgramLock,"increase_strictness(1);" +KinkyDungeonRemindJailRobotProgramIntro,"query([SELF]); >PTRN;" +KinkyDungeonRemindJailChaseRobotProgramDefend0,"Red alert; Joining combat;" +KinkyDungeonRemindJailChaseRobotProgramDefend1,"Battle stations;" +KinkyDungeonRemindJailChaseRobotProgramDefend2,"Target identified;" +KinkyDungeonRemindJailChaseRobotProgramDefendHonor0,"Offering support;" +KinkyDungeonRemindJailChaseRobotProgramDefendHonor1,"New target identified; Engaging;" +KinkyDungeonRemindJailChaseRobotProgramDefendHonor2,"Combat detected; Engaging in corrective action;" +KinkyDungeonRemindJailChaseRobotProgramHonor0,"Updating target registry; Proceed to attack;" +KinkyDungeonRemindJailChaseRobotProgramHonor1,"Target updated;" +KinkyDungeonRemindJailChaseRobotProgramHonor2,"New target detected; Please submit() to detainment;" +KinkyDungeonRemindJailChaseRobotProgramCommandDefend,"defend([ALLY]);" +KinkyDungeonRemindJailChaseRobotProgramCommandAssault,"capture([CITIZEN]);" +KinkyDungeonRemindJailChaseRobotProgramCommandBlock,"defend([POINT]);" + +KinkyDungeonRemindJailCastAlchemist,"Behold my creation! SPL!" +KinkyDungeonRemindJailMiscastAlchemist,"No! Not like this!" +KinkyDungeonRemindJailPlayHelplessAlchemist0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessAlchemist1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessAlchemist2,"I can't get free!" KinkyDungeonRemindJailPlayBratAlchemist0,"Looks like I'm up to no good... better stop me!" KinkyDungeonRemindJailPlayBratAlchemist1,"Careful where you point that thing!" KinkyDungeonRemindJailPlayBratAlchemist2,"Containment breach!" @@ -6948,6 +8837,7 @@ KinkyDungeonRemindJailPlayAlchemistLeash,"I should take you to my office~" KinkyDungeonRemindJailPlayAlchemistFree,"You'd look good in some latex!" KinkyDungeonRemindJailPlayAlchemistLoot,"Hey! That's mine!" KinkyDungeonRemindJailPlayAlchemistKey,"You're not supposed to have that!" +KinkyDungeonRemindJailChaseAlchemistAlert,"Oh?" KinkyDungeonRemindJailPlayAlchemist0,"You'll make a fine test subject..." KinkyDungeonRemindJailPlayAlchemist1,"Come here, I want to perform some tests!" KinkyDungeonRemindJailPlayAlchemist2,"Looks like it's time to drop some science!" @@ -6967,13 +8857,33 @@ KinkyDungeonRemindJailAlchemistDisarm,"A calculated success!" KinkyDungeonRemindJailAlchemistHit,"Watch the vials!" KinkyDungeonRemindJailAlchemistHitPlayer,"I've caught you!" KinkyDungeonRemindJailAlchemistMiss,"I can't believe I missed..." +KinkyDungeonRemindJailAlchemistBlock,"That's not fair!" KinkyDungeonRemindJailAlchemistMissedMe,"I knew you would do that!" +KinkyDungeonRemindJailAlchemistBlockedMe,"I knew you would do that!" KinkyDungeonRemindJailAlchemistLeash,"Experiment was a success!" KinkyDungeonRemindJailAlchemistPull,"Gotchya!" KinkyDungeonRemindJailAlchemistStun,"There we go!" KinkyDungeonRemindJailAlchemistPickpocket,"Ooh, you've got some useful stuff~" KinkyDungeonRemindJailAlchemistLock,"I won't let you go that easily!" - +KinkyDungeonRemindJailAlchemistIntro,"I am PTRN, the great scientist!" +KinkyDungeonRemindJailChaseAlchemistDefend0,"Do I have to? Fine..." +KinkyDungeonRemindJailChaseAlchemistDefend1,"Okay okay, I'm helping!" +KinkyDungeonRemindJailChaseAlchemistDefend2,"Where's my assistant when you need them..." +KinkyDungeonRemindJailChaseAlchemistDefendHonor0,"I will offer my support!" +KinkyDungeonRemindJailChaseAlchemistDefendHonor1,"You're really gonna make me do this?" +KinkyDungeonRemindJailChaseAlchemistDefendHonor2,"I hate having to clean up after others." +KinkyDungeonRemindJailChaseAlchemistHonor0,"Eh, whatever, I'll help." +KinkyDungeonRemindJailChaseAlchemistHonor1,"You're ruining my experiment!" +KinkyDungeonRemindJailChaseAlchemistHonor2,"Sheesh, what a pest!" +KinkyDungeonRemindJailChaseAlchemistCommandDefend,"Need an assistant?" +KinkyDungeonRemindJailChaseAlchemistCommandAssault,"I smell an opportunity!" +KinkyDungeonRemindJailChaseAlchemistCommandBlock,"Do I have to?" + +KinkyDungeonRemindJailCastDressmaker,"Let me introduce you to SPL~" +KinkyDungeonRemindJailMiscastDressmaker,"No! My SPL!" +KinkyDungeonRemindJailPlayHelplessDressmaker0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessDressmaker1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessDressmaker2,"I can't get free!" KinkyDungeonRemindJailPlayBratDressmaker0,"Oh my, looks like I'm in trouble!" KinkyDungeonRemindJailPlayBratDressmaker1,"What a shame it would be if I got caught~" KinkyDungeonRemindJailPlayBratDressmaker2,"Looks like I'd better get going~" @@ -6988,6 +8898,7 @@ KinkyDungeonRemindJailPlayDressmakerLeash,"You belong on a display stand!" KinkyDungeonRemindJailPlayDressmakerFree,"We should put away those grasping hands of yours~" KinkyDungeonRemindJailPlayDressmakerLoot,"That belongs to someone else." KinkyDungeonRemindJailPlayDressmakerKey,"Oh no you don't, sweetie!" +KinkyDungeonRemindJailChaseDressmakerAlert,"You're a pretty one! Why don't you come here~" KinkyDungeonRemindJailChaseDressmakerAttack0,"Oof! Looks like you need to be taught a lesson!" KinkyDungeonRemindJailChaseDressmakerAttack1,"We better put away those hands of yours." KinkyDungeonRemindJailChaseDressmakerAttack2,"Why don't you just give up and pose for us~" @@ -7004,14 +8915,34 @@ KinkyDungeonRemindJailDressmakerDisarm,"Won't be needing this~" KinkyDungeonRemindJailDressmakerHit,"Hey, you'll damage my dress!" KinkyDungeonRemindJailDressmakerHitPlayer,"I'm so excited!" KinkyDungeonRemindJailDressmakerMiss,"A slippery one, aren't you?" +KinkyDungeonRemindJailDressmakerBlock,"A brave one, aren't you?" KinkyDungeonRemindJailDressmakerMissedMe,"Tsk tsk. You can do better, dear~" +KinkyDungeonRemindJailDressmakerBlockedMe,"Tsk tsk. You can do better, dear~" KinkyDungeonRemindJailDressmakerLeash,"I can't wait to dress you up!" KinkyDungeonRemindJailDressmakerPull,"So nice of you to join me!" KinkyDungeonRemindJailDressmakerStun,"Now let's see, what kind of dress..." KinkyDungeonRemindJailDressmakerPickpocket,"A gift? Thank you so much!" KinkyDungeonRemindJailDressmakerLock,"You won't be getting out of that any time soon!" - - +KinkyDungeonRemindJailDressmakerIntro,"I'm PTRN. Have you heard of my dresses?~" +KinkyDungeonRemindJailChaseDressmakerDefend0,"That won't do!" +KinkyDungeonRemindJailChaseDressmakerDefend1,"I'd like to have you myself!" +KinkyDungeonRemindJailChaseDressmakerDefend2,"Oooh, a cute one!" +KinkyDungeonRemindJailChaseDressmakerDefendHonor0,"*sigh* how improper..." +KinkyDungeonRemindJailChaseDressmakerDefendHonor1,"Inelegant! You need some teaching!" +KinkyDungeonRemindJailChaseDressmakerDefendHonor2,"*snaps her fingers* Looks like you'll need some punishment~" +KinkyDungeonRemindJailChaseDressmakerHonor0,"That one is pretty. May I have her instead?" +KinkyDungeonRemindJailChaseDressmakerHonor1,"I'd like to place a bid too~" +KinkyDungeonRemindJailChaseDressmakerHonor2,"Oooh, that one's mine!" +KinkyDungeonRemindJailChaseDressmakerCommandDefend,"" +KinkyDungeonRemindJailChaseDressmakerCommandAssault,"" +KinkyDungeonRemindJailChaseDressmakerCommandBlock,"" + + +KinkyDungeonRemindJailCastLibrarian,"SPL." +KinkyDungeonRemindJailMiscastLibrarian,"..." +KinkyDungeonRemindJailPlayHelplessLibrarian0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessLibrarian1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessLibrarian2,"I can't get free!" KinkyDungeonRemindJailPlayBratLibrarian0,"No! I don't want to read your magazines!" KinkyDungeonRemindJailPlayBratLibrarian1,"No, I don't want to learn about Shibari!" KinkyDungeonRemindJailPlayBratLibrarian2,"No, I don't want to learn about your toys!" @@ -7026,12 +8957,13 @@ KinkyDungeonRemindJailPlayLibrarianLeash,"Time to lock you away." KinkyDungeonRemindJailPlayLibrarianFree,"Don't get your paws on anything important." KinkyDungeonRemindJailPlayLibrarianLoot,"I was reading that!" KinkyDungeonRemindJailPlayLibrarianKey,"You're not supposed to have that." +KinkyDungeonRemindJailChaseLibrarianAlert,"You. Stop." KinkyDungeonRemindJailChaseLibrarianAttack0,"Who are you?" KinkyDungeonRemindJailChaseLibrarianAttack1,"You're entering my personal space." KinkyDungeonRemindJailChaseLibrarianAttack2,"I'm going to ask you to leave" KinkyDungeonRemindJailChaseLibrarianSpell0,"You're ruining the books!" -KinkyDungeonRemindJailChaseLibrarianSpell1,"Keep the damage under control!" -KinkyDungeonRemindJailChaseLibrarianSpell2,"Shut up!!!" +KinkyDungeonRemindJailChaseLibrarianSpell1,"Do you need a gag?" +KinkyDungeonRemindJailChaseLibrarianSpell2,"Shut up." KinkyDungeonRemindJailChaseLibrarianSpellItem,"Put that back!" KinkyDungeonRemindJailChaseLibrarianShrine,"There's nothing to learn from that, you ignorant buffon." KinkyDungeonRemindJailChaseLibrarianChest,"Don't dive into someone else's belongings!" @@ -7042,13 +8974,33 @@ KinkyDungeonRemindJailLibrarianDisarm,"You're going to hurt someone with that." KinkyDungeonRemindJailLibrarianHit,"My books!" KinkyDungeonRemindJailLibrarianHitPlayer,"Stay down." KinkyDungeonRemindJailLibrarianMiss,"Get back here--" +KinkyDungeonRemindJailLibrarianBlock,"Just give it up." KinkyDungeonRemindJailLibrarianMissedMe,"Why you..." +KinkyDungeonRemindJailLibrarianBlockedMe,"Why you..." KinkyDungeonRemindJailLibrarianLeash,"Time for you to stay out of trouble." KinkyDungeonRemindJailLibrarianPull,"Come along." KinkyDungeonRemindJailLibrarianStun,"Stay put!" KinkyDungeonRemindJailLibrarianPickpocket,"I'll be taking that back." KinkyDungeonRemindJailLibrarianLock,"Click." - +KinkyDungeonRemindJailLibrarianIntro,"If you really want to know, my name is PTRN. I am the keeper of this place." +KinkyDungeonRemindJailChaseLibrarianDefend0,"Typical." +KinkyDungeonRemindJailChaseLibrarianDefend1,"*sighs* Another one..." +KinkyDungeonRemindJailChaseLibrarianDefend2,"Keep the damage under control!" +KinkyDungeonRemindJailChaseLibrarianDefendHonor0,"Stop fighting, you guys!" +KinkyDungeonRemindJailChaseLibrarianDefendHonor1,"You'll ruin the books!" +KinkyDungeonRemindJailChaseLibrarianDefendHonor2,"Stop making a mess!" +KinkyDungeonRemindJailChaseLibrarianHonor0,"You're too dangerous to have around." +KinkyDungeonRemindJailChaseLibrarianHonor1,"I don't care what happens to you as long as you're out of here." +KinkyDungeonRemindJailChaseLibrarianHonor2,"Get out of my library!" +KinkyDungeonRemindJailChaseLibrarianCommandDefend,"" +KinkyDungeonRemindJailChaseLibrarianCommandAssault,"" +KinkyDungeonRemindJailChaseLibrarianCommandBlock,"" + +KinkyDungeonRemindJailCastNurse,"Deploying SPL!" +KinkyDungeonRemindJailMiscastNurse,"What was I supposed to do again? Oh right!" +KinkyDungeonRemindJailPlayHelplessNurse0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessNurse1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessNurse2,"I can't get free!" KinkyDungeonRemindJailPlayBratNurse0,"No! I didn't do anything wrong..." KinkyDungeonRemindJailPlayBratNurse1,"Don't punish me! Please!" KinkyDungeonRemindJailPlayBratNurse2,"It's not my fault!" @@ -7063,6 +9015,7 @@ KinkyDungeonRemindJailPlayNurseLeash,"You've got an appointment scheduled." KinkyDungeonRemindJailPlayNurseFree,"Lets get you back in your jacket~" KinkyDungeonRemindJailPlayNurseLoot,"Patients are not allowed to have toys." KinkyDungeonRemindJailPlayNurseKey,"Oh no you don't, sweetie!" +KinkyDungeonRemindJailChaseNurseAlert,"Oh my~" KinkyDungeonRemindJailChaseNurseAttack0,"Oof! Looks like you need to be taught a lesson!" KinkyDungeonRemindJailChaseNurseAttack1,"You can be cured if you just give up." KinkyDungeonRemindJailChaseNurseAttack2,"You're going to ruin your progress~" @@ -7079,14 +9032,92 @@ KinkyDungeonRemindJailNurseDisarm,"Won't be needing this~" KinkyDungeonRemindJailNurseHit,"Hey, who said you could do that!" KinkyDungeonRemindJailNurseHitPlayer,"I'm so excited!" KinkyDungeonRemindJailNurseMiss,"A slippery one, aren't you?" +KinkyDungeonRemindJailNurseBlock,"Now now, you can't just resist like that~" KinkyDungeonRemindJailNurseMissedMe,"Tsk tsk. You can do better, dear~" +KinkyDungeonRemindJailNurseBlockedMe,"Tsk tsk. You can do better, dear~" KinkyDungeonRemindJailNurseLeash,"Lets get you back to your cell!" KinkyDungeonRemindJailNursePull,"So nice of you to join me!" KinkyDungeonRemindJailNurseStun,"Now let's see, good patients should be still..." KinkyDungeonRemindJailNursePickpocket,"A gift? Thank you so much!" KinkyDungeonRemindJailNurseLock,"You won't be getting out of that any time soon!" - - +KinkyDungeonRemindJailNurseIntro,"Nurse PTRN, reporting for duty!" +KinkyDungeonRemindJailChaseNurseDefend0,"Someone call security!" +KinkyDungeonRemindJailChaseNurseDefend1,"I will try to subdue them~" +KinkyDungeonRemindJailChaseNurseDefend2,"Code Gray!" +KinkyDungeonRemindJailChaseNurseDefendHonor0,"Hold her down! I'll get the jacket!" +KinkyDungeonRemindJailChaseNurseDefendHonor1,"Code Gray!" +KinkyDungeonRemindJailChaseNurseDefendHonor2,"Moving in to support!" +KinkyDungeonRemindJailChaseNurseHonor0,"Let's mediate things, shall we?" +KinkyDungeonRemindJailChaseNurseHonor1,"Why don't you calm down so we can talk. Or not~" +KinkyDungeonRemindJailChaseNurseHonor2,"Now now, what do we have here?" +KinkyDungeonRemindJailChaseNurseCommandDefend,"" +KinkyDungeonRemindJailChaseNurseCommandAssault,"" +KinkyDungeonRemindJailChaseNurseCommandBlock,"" + + +KinkyDungeonRemindJailCastDoctor,"I'll need another SPL, stat!" +KinkyDungeonRemindJailMiscastDoctor,"A p-professional mistake." +KinkyDungeonRemindJailPlayHelplessDoctor0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessDoctor1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessDoctor2,"I can't get free!" +KinkyDungeonRemindJailPlayBratDoctor0,"No! I didn't do anything wrong..." +KinkyDungeonRemindJailPlayBratDoctor1,"Don't punish me! Please!" +KinkyDungeonRemindJailPlayBratDoctor2,"I did what the manual said!" +KinkyDungeonRemindJailPlaySubDoctor0,"It's your turn, dear~" +KinkyDungeonRemindJailPlaySubDoctor1,"Looks like I'm the patient now~" +KinkyDungeonRemindJailPlaySubDoctor2,"I seem to have caught something, won't you help?" +KinkyDungeonRemindJailPlayDoctor0,"It's time for your daily dose of cuddling~" +KinkyDungeonRemindJailPlayDoctor1,"I diagose you with excessive subbiness." +KinkyDungeonRemindJailPlayDoctor2,"Seems like you've caught a case of female hysteria..." +KinkyDungeonRemindJailPlayDoctorStruggle,"Those are supposed to keep you still you know..." +KinkyDungeonRemindJailPlayDoctorLeash,"You've got an appointment scheduled." +KinkyDungeonRemindJailPlayDoctorFree,"Lets get you back in your jacket~" +KinkyDungeonRemindJailPlayDoctorLoot,"Patients are not allowed to have toys." +KinkyDungeonRemindJailPlayDoctorKey,"Oh no you don't, sweetie!" +KinkyDungeonRemindJailChaseDoctorAlert,"I diagnose you with a case of bratty behavior..." +KinkyDungeonRemindJailChaseDoctorAttack0,"Have you had your daily cuddles yet?" +KinkyDungeonRemindJailChaseDoctorAttack1,"It's time for your edging treatment~" +KinkyDungeonRemindJailChaseDoctorAttack2,"Sexual health is physical health, my dear~" +KinkyDungeonRemindJailChaseDoctorSpell0,"Oh my, that's dangerous!" +KinkyDungeonRemindJailChaseDoctorSpell1,"Patients are forbidden from casting spells!" +KinkyDungeonRemindJailChaseDoctorSpell2,"Keep those pretty hands to yourself, dear~" +KinkyDungeonRemindJailChaseDoctorSpellItem,"Where'd you find that, dear?" +KinkyDungeonRemindJailChaseDoctorShrine,"Silly girl, your illness can't be cured by a prayer." +KinkyDungeonRemindJailChaseDoctorChest,"That's not yours, sweetie~" +KinkyDungeonRemindJailChaseDoctorOrb,"You shouldn't break things, you know~" +KinkyDungeonRemindJailChaseDoctorJailbreak,"I knew something was amiss!" +KinkyDungeonRemindJailDoctorGrab,"You won't be getting away that easily, dear~" +KinkyDungeonRemindJailDoctorDisarm,"Won't be needing this~" +KinkyDungeonRemindJailDoctorHit,"Hey, who said you could do that!" +KinkyDungeonRemindJailDoctorHitPlayer,"I'm so excited!" +KinkyDungeonRemindJailDoctorMiss,"A slippery one, aren't you?" +KinkyDungeonRemindJailDoctorBlock,"Now now, you can't just resist like that~" +KinkyDungeonRemindJailDoctorMissedMe,"Tsk tsk. You can do better, dear~" +KinkyDungeonRemindJailDoctorBlockedMe,"Tsk tsk. You can do better, dear~" +KinkyDungeonRemindJailDoctorLeash,"Lets get you back to your cell!" +KinkyDungeonRemindJailDoctorPull,"So nice of you to join me!" +KinkyDungeonRemindJailDoctorStun,"Now let's see, good patients should be still..." +KinkyDungeonRemindJailDoctorPickpocket,"A gift? Thank you so much!" +KinkyDungeonRemindJailDoctorLock,"You won't be getting out of that any time soon!" +KinkyDungeonRemindJailDoctorIntro,"PTRN MD here. Let's see what we've got..." +KinkyDungeonRemindJailChaseDoctorDefend0,"Security!" +KinkyDungeonRemindJailChaseDoctorDefend1,"What's this disturbance..." +KinkyDungeonRemindJailChaseDoctorDefend2,"Must I do everything myself..." +KinkyDungeonRemindJailChaseDoctorDefendHonor0,"Settle down." +KinkyDungeonRemindJailChaseDoctorDefendHonor1,"I didn't want to get my hands dirty." +KinkyDungeonRemindJailChaseDoctorDefendHonor2,"Looks like the gloves are off~" +KinkyDungeonRemindJailChaseDoctorHonor0,"Must I do everything myself..." +KinkyDungeonRemindJailChaseDoctorHonor1,"Let me get my tools." +KinkyDungeonRemindJailChaseDoctorHonor2,"I'll take a look." +KinkyDungeonRemindJailChaseDoctorCommandDefend,"" +KinkyDungeonRemindJailChaseDoctorCommandAssault,"" +KinkyDungeonRemindJailChaseDoctorCommandBlock,"" + +KinkyDungeonRemindJailCastTemplate,"SPL" +KinkyDungeonRemindJailMiscastTemplate,"SPL failed" +KinkyDungeonRemindJailPlayHelplessTemplate0,"" +KinkyDungeonRemindJailPlayHelplessTemplate1,"" +KinkyDungeonRemindJailPlayHelplessTemplate2,"" KinkyDungeonRemindJailPlayBratTemplate0,"" KinkyDungeonRemindJailPlayBratTemplate1,"" KinkyDungeonRemindJailPlayBratTemplate2,"" @@ -7101,6 +9132,7 @@ KinkyDungeonRemindJailPlayTemplateLeash,"" KinkyDungeonRemindJailPlayTemplateFree,"" KinkyDungeonRemindJailPlayTemplateLoot,"" KinkyDungeonRemindJailPlayTemplateKey,"" +KinkyDungeonRemindJailChaseTemplateAlert,"" KinkyDungeonRemindJailChaseTemplateAttack0,"" KinkyDungeonRemindJailChaseTemplateAttack1,"" KinkyDungeonRemindJailChaseTemplateAttack2,"" @@ -7117,14 +9149,387 @@ KinkyDungeonRemindJailTemplateDisarm,"" KinkyDungeonRemindJailTemplateHit,"" KinkyDungeonRemindJailTemplateHitPlayer,"" KinkyDungeonRemindJailTemplateMiss,"" +KinkyDungeonRemindJailTemplateBlock,"" KinkyDungeonRemindJailTemplateMissedMe,"" +KinkyDungeonRemindJailTemplateBlockedMe,"" KinkyDungeonRemindJailTemplateLeash,"" KinkyDungeonRemindJailTemplatePull,"" KinkyDungeonRemindJailTemplateStun,"" KinkyDungeonRemindJailTemplatePickpocket,"" KinkyDungeonRemindJailTemplateLock,"" - - +KinkyDungeonRemindJailTemplateIntro,"PTRN" +KinkyDungeonRemindJailChaseTemplateDefend0,"" +KinkyDungeonRemindJailChaseTemplateDefend1,"" +KinkyDungeonRemindJailChaseTemplateDefend2,"" +KinkyDungeonRemindJailChaseTemplateDefendHonor0,"" +KinkyDungeonRemindJailChaseTemplateDefendHonor1,"" +KinkyDungeonRemindJailChaseTemplateDefendHonor2,"" +KinkyDungeonRemindJailChaseTemplateHonor0,"" +KinkyDungeonRemindJailChaseTemplateHonor1,"" +KinkyDungeonRemindJailChaseTemplateHonor2,"" +KinkyDungeonRemindJailChaseTemplateCommandDefend,"" +KinkyDungeonRemindJailChaseTemplateCommandAssault,"" +KinkyDungeonRemindJailChaseTemplateCommandBlock,"" + + + +KinkyDungeonRemindJailCastMelissa,"SPL!" +KinkyDungeonRemindJailMiscastMelissa,"That w-was supposed to be a SPL!" +KinkyDungeonRemindJailPlayHelplessMelissa0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessMelissa1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessMelissa2,"I can't get free!" +KinkyDungeonRemindJailPlayBratMelissa0,"Ooh, a shiny rock…" +KinkyDungeonRemindJailPlayBratMelissa1,"I wonder what's over here?" +KinkyDungeonRemindJailPlayBratMelissa2,"I'm bored, bye!" +KinkyDungeonRemindJailPlaySubMelissa0,"Pay more attention to me!" +KinkyDungeonRemindJailPlaySubMelissa1,"Tell me I'm pretty!" +KinkyDungeonRemindJailPlaySubMelissa2,"I'm not a bottom, I'm a scary dom!" +KinkyDungeonRemindJailPlayMelissa0,"You seem stressed, how about I help you take a break?" +KinkyDungeonRemindJailPlayMelissa1,"Here's some powerful loot that will help you win! Let me help you try it on…" +KinkyDungeonRemindJailPlayMelissa2,"Aaah, I can't help it, you're just too cute to keep my hands off!" +KinkyDungeonRemindJailPlayMelissaStruggle,"Cuddle pillows aren't supposed to be able to move!" +KinkyDungeonRemindJailPlayMelissaLeash,"C'mon, c'mon, I wanna show you a fun place~" +KinkyDungeonRemindJailPlayMelissaFree,"Cuddle pillows aren't supposed to be able to move!" +KinkyDungeonRemindJailPlayMelissaLoot,"Hey I called dibs on that!" +KinkyDungeonRemindJailPlayMelissaKey,"Cuddle pillows aren't supposed to be able to move!" +KinkyDungeonRemindJailChaseMelissaAlert,"You're cute! I'm gonna make you my pillow!" +KinkyDungeonRemindJailChaseMelissaAttack0,"No fair!" +KinkyDungeonRemindJailChaseMelissaAttack1,"You're not supposed to fight back!" +KinkyDungeonRemindJailChaseMelissaAttack2,"Eep!" +KinkyDungeonRemindJailChaseMelissaSpell0,"Cool magic!" +KinkyDungeonRemindJailChaseMelissaSpell1,"Magic is cheating!" +KinkyDungeonRemindJailChaseMelissaSpell2,"A cutie casting cute spells~" +KinkyDungeonRemindJailChaseMelissaSpellItem,"" +KinkyDungeonRemindJailChaseMelissaShrine,"Hey I called dibs on that!" +KinkyDungeonRemindJailChaseMelissaChest,"Hey I called dibs on that!" +KinkyDungeonRemindJailChaseMelissaOrb,"Hey I called dibs on that!" +KinkyDungeonRemindJailChaseMelissaJailbreak,"No trying to leave the comfy room!" +KinkyDungeonRemindJailMelissaGrab,"Cuddle time!" +KinkyDungeonRemindJailMelissaDisarm,"You dropped something, cutie~" +KinkyDungeonRemindJailMelissaHit,"No fair!" +KinkyDungeonRemindJailMelissaHitPlayer,"I just wanna make you a pillow!" +KinkyDungeonRemindJailMelissaMiss,"Wow, I actually dodged something!" +KinkyDungeonRemindJailMelissaBlock,"Stop dodging so I can bundle you up! >_<" +KinkyDungeonRemindJailMelissaMissedMe,"You're not supposed to dodge, no fair!" +KinkyDungeonRemindJailMelissaBlockedMe,"You're not supposed to block, no fair!" +KinkyDungeonRemindJailMelissaLeash,"C'mon, c'mon, I wanna show you a fun place~" +KinkyDungeonRemindJailMelissaPull,"C'mon, c'mon, I wanna show you a fun place~" +KinkyDungeonRemindJailMelissaStun,"" +KinkyDungeonRemindJailMelissaPickpocket,"Look, a distracting thing! Hehehe…" +KinkyDungeonRemindJailMelissaLock,"This is just to make sure your clothes don't fall off, don't worry!" +KinkyDungeonRemindJailMelissaIntro,"My name's Melissa! I know I'm pretty, but try not to stare too much~" +KinkyDungeonRemindJailChaseMelissaDefend0,"" +KinkyDungeonRemindJailChaseMelissaDefend1,"" +KinkyDungeonRemindJailChaseMelissaDefend2,"" +KinkyDungeonRemindJailChaseMelissaDefendHonor0,"" +KinkyDungeonRemindJailChaseMelissaDefendHonor1,"" +KinkyDungeonRemindJailChaseMelissaDefendHonor2,"" +KinkyDungeonRemindJailChaseMelissaHonor0,"" +KinkyDungeonRemindJailChaseMelissaHonor1,"" +KinkyDungeonRemindJailChaseMelissaHonor2,"" +KinkyDungeonRemindJailChaseMelissaCommandDefend,"" +KinkyDungeonRemindJailChaseMelissaCommandAssault,"" +KinkyDungeonRemindJailChaseMelissaCommandBlock,"" + +KinkyDungeonRemindJailCastAdventurer_Brat_Fighter,"Let me show you how it's done: SPL!" +KinkyDungeonRemindJailMiscastAdventurer_Brat_Fighter,"You've just narrowly avoided my SPL~" +KinkyDungeonRemindJailPlayHelplessAdventurer_Brat_Fighter0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessAdventurer_Brat_Fighter1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessAdventurer_Brat_Fighter2,"I can't get free!" +KinkyDungeonRemindJailPlayBratAdventurer_Brat_Fighter0,"Kya~ I have no mana, I'm so defenseless right now~" +KinkyDungeonRemindJailPlayBratAdventurer_Brat_Fighter1,"I have all this bondage gear on me, I sure hope nobody ties me up with it~!" +KinkyDungeonRemindJailPlayBratAdventurer_Brat_Fighter2,"Oh no, how will I ever find my way out of here~" +KinkyDungeonRemindJailPlaySubAdventurer_Brat_Fighter0,"If I focus really hard, I can make my blade go on fire!" +KinkyDungeonRemindJailPlaySubAdventurer_Brat_Fighter1,"I ran out of mana, but I'm sure I can find the exit before long!" +KinkyDungeonRemindJailPlaySubAdventurer_Brat_Fighter2,"Hey, be careful with my enchanted rope!" +KinkyDungeonRemindJailPlayAdventurer_Brat_Fighter0,"Hey, you wouldn't happen to have a mana potion, would you?" +KinkyDungeonRemindJailPlayAdventurer_Brat_Fighter1,"Say, I happen to know a thing or two about knots~" +KinkyDungeonRemindJailPlayAdventurer_Brat_Fighter2,"I am an artist with rope... in more ways than one." +KinkyDungeonRemindJailPlayAdventurer_Brat_FighterStruggle,"*blushes jealously*" +KinkyDungeonRemindJailPlayAdventurer_Brat_FighterLeash,"Come along now~" +KinkyDungeonRemindJailPlayAdventurer_Brat_FighterFree,"I'm out of practice... you wouldn't mind helping me, right?" +KinkyDungeonRemindJailPlayAdventurer_Brat_FighterLoot,"Thank you for cleaning up! I can take that off your hands~" +KinkyDungeonRemindJailPlayAdventurer_Brat_FighterKey,"Oooh, I wonder where that key leads!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterAlert,"Hey you! Where do you think you're going?" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterAttack0,"Kya~! I challenge you!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterAttack1,"What say you to a duel?" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterAttack2,"Let's fight! For honor and cuddles!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterSpell0,"It's time for a battle between masters--wait, I'm low on mana..." +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterSpell1,"Give me a second to chug a mana potion..." +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterSpell2,"Why don't you try that again~" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterSpellItem,"I'll get you for that!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterShrine,"Hey you can't do that! It's not like I do it too or anything..." +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterChest,"That was m- I mean... you can't steal things like that!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterOrb,"That was m- I mean... you can't steal sacred artifacts!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterJailbreak,"Kya~ What have we here?" +KinkyDungeonRemindJailAdventurer_Brat_FighterGrab,"I got you!" +KinkyDungeonRemindJailAdventurer_Brat_FighterDisarm,"Watch where you're pointing that thing~" +KinkyDungeonRemindJailAdventurer_Brat_FighterHit,"Kya... I mean, ouch!!!" +KinkyDungeonRemindJailAdventurer_Brat_FighterHitPlayer,"Take that!!!" +KinkyDungeonRemindJailAdventurer_Brat_FighterMiss,"Whaaa-" +KinkyDungeonRemindJailAdventurer_Brat_FighterBlock,"Hmmph!" +KinkyDungeonRemindJailAdventurer_Brat_FighterMissedMe,"Hah! Can't hit me!" +KinkyDungeonRemindJailAdventurer_Brat_FighterBlockedMe,"It'll take more than that to bring me down!" +KinkyDungeonRemindJailAdventurer_Brat_FighterLeash,"What a shame. If only you weren't such a pushover..." +KinkyDungeonRemindJailAdventurer_Brat_FighterPull,"*giggles*" +KinkyDungeonRemindJailAdventurer_Brat_FighterStun,"Kya! Take that!" +KinkyDungeonRemindJailAdventurer_Brat_FighterPickpocket,"Nice loot! I'll take it~" +KinkyDungeonRemindJailAdventurer_Brat_FighterLock,"Can never be too sure!" +KinkyDungeonRemindJailAdventurer_Brat_FighterIntro,"You wouldn't happen to have a mana potion or 3 would you?" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterDefend0,"Looks like it's time for me to shine!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterDefend1,"Stand down, or I won't go easy on you!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterDefend2,"Help is on the way!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterDefendHonor0,"You really want to get tied up, don't you?" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterDefendHonor1,"Hmph, looks like I need to help after all!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterDefendHonor2,"You asked for it!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterHonor0,"Me? Help? Alright!" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterHonor1,"Sorry miss, I'm on an escort mission." +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterHonor2,"There goes my nice, relaxing day..." +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterCommandDefend,"" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterCommandAssault,"" +KinkyDungeonRemindJailChaseAdventurer_Brat_FighterCommandBlock,"" + + +KinkyDungeonRemindJailCastAdventurer_Sub_Fighter,"I cast SPL!" +KinkyDungeonRemindJailMiscastAdventurer_Sub_Fighter,"Behold, my true power! Wait... ack..." +KinkyDungeonRemindJailPlayHelplessAdventurer_Sub_Fighter0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessAdventurer_Sub_Fighter1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessAdventurer_Sub_Fighter2,"I can't get free!" +KinkyDungeonRemindJailPlayBratAdventurer_Sub_Fighter0,"I wonder what to do with all these cuffs..." +KinkyDungeonRemindJailPlayBratAdventurer_Sub_Fighter1,"I have made a huge mistake..." +KinkyDungeonRemindJailPlayBratAdventurer_Sub_Fighter2,"I'll just be going..." +KinkyDungeonRemindJailPlaySubAdventurer_Sub_Fighter0,"Please hold me~" +KinkyDungeonRemindJailPlaySubAdventurer_Sub_Fighter1,"Please punish me! Please!!!" +KinkyDungeonRemindJailPlaySubAdventurer_Sub_Fighter2,"I want... pain..." +KinkyDungeonRemindJailPlayAdventurer_Sub_Fighter0,"Let's spend some time together under the moonlight~" +KinkyDungeonRemindJailPlayAdventurer_Sub_Fighter1,"I'll take you to my place tonight~" +KinkyDungeonRemindJailPlayAdventurer_Sub_Fighter2,"I'm so blessed to find you!" +KinkyDungeonRemindJailPlayAdventurer_Sub_FighterStruggle,"Yes, enjoy yourself..." +KinkyDungeonRemindJailPlayAdventurer_Sub_FighterLeash,"Come with me~" +KinkyDungeonRemindJailPlayAdventurer_Sub_FighterFree,"Don't you want to feel the tight embrace of leather?" +KinkyDungeonRemindJailPlayAdventurer_Sub_FighterLoot,"You won't need that." +KinkyDungeonRemindJailPlayAdventurer_Sub_FighterKey,"You won't need that." +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterAlert,"It's time to get acquainted with the night~" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterAttack0,"*moans loudly*" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterAttack1,"Yes... more!" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterAttack2,"Please keep doing that to me~" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterSpell0,"Two can play at that game!" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterSpell1,"I call upon the shadows!" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterSpell2,"Have a taste of my spear!" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterSpellItem,"A curious item~" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterShrine,"The shadows will consume all... eventually." +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterChest,"Put it back..." +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterOrb,"I was supposed to do that... not you." +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterJailbreak,"What do we have here..." +KinkyDungeonRemindJailAdventurer_Sub_FighterGrab,"I've got you! Now I can make you do anything I want..." +KinkyDungeonRemindJailAdventurer_Sub_FighterDisarm,"What was that?" +KinkyDungeonRemindJailAdventurer_Sub_FighterHit,"Ah, yes!!!" +KinkyDungeonRemindJailAdventurer_Sub_FighterHitPlayer,"You'll counterattack, won't you?" +KinkyDungeonRemindJailAdventurer_Sub_FighterMiss,"You're not trying hard enough!" +KinkyDungeonRemindJailAdventurer_Sub_FighterBlock,"More! MORE!" +KinkyDungeonRemindJailAdventurer_Sub_FighterMissedMe,"Yes, now hit me back!" +KinkyDungeonRemindJailAdventurer_Sub_FighterBlockedMe,"Yes, now hit me back!" +KinkyDungeonRemindJailAdventurer_Sub_FighterLeash,"Come now... let's go together." +KinkyDungeonRemindJailAdventurer_Sub_FighterPull,"Get over here~" +KinkyDungeonRemindJailAdventurer_Sub_FighterStun,"Pierce the darkness." +KinkyDungeonRemindJailAdventurer_Sub_FighterPickpocket,"Oh? What's this?" +KinkyDungeonRemindJailAdventurer_Sub_FighterLock,"Hmmm... that's better." +KinkyDungeonRemindJailAdventurer_Sub_FighterIntro,"My name? My name... oh, I'm PTRN..." +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterDefend0,"Hey! Look over here!" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterDefend1,"*points* Look, a distraction!" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterDefend2,"Kya~! I'll help!" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterDefendHonor0,"Mind if I join?" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterDefendHonor1,"Mmmph~ You two look like you're having fun!" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterDefendHonor2,"Hey miss, I'm going to have to stop you now~" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterHonor0,"Why don't you fight ME instead~" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterHonor1,"What kind of trouble are we getting into today?" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterHonor2,"Oooh, fun!" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterCommandDefend,"" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterCommandAssault,"" +KinkyDungeonRemindJailChaseAdventurer_Sub_FighterCommandBlock,"" + + +KinkyDungeonRemindJailCastAdventurer_Switch_Fighter,"Face my SPL!" +KinkyDungeonRemindJailMiscastAdventurer_Switch_Fighter,"SPL-whoops..." +KinkyDungeonRemindJailPlayHelplessAdventurer_Switch_Fighter0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessAdventurer_Switch_Fighter1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessAdventurer_Switch_Fighter2,"I can't get free!" +KinkyDungeonRemindJailPlayBratAdventurer_Switch_Fighter0,"Give me another chance!" +KinkyDungeonRemindJailPlayBratAdventurer_Switch_Fighter1,"No! Wait! I can explain..." +KinkyDungeonRemindJailPlayBratAdventurer_Switch_Fighter2,"I'll be right back..." +KinkyDungeonRemindJailPlaySubAdventurer_Switch_Fighter0,"Okay, so I MAY have exaggerated my credentials..." +KinkyDungeonRemindJailPlaySubAdventurer_Switch_Fighter1,"I'm not in trouble, am I?" +KinkyDungeonRemindJailPlaySubAdventurer_Switch_Fighter2,"I've been looking for... a mentor of sorts." +KinkyDungeonRemindJailPlayAdventurer_Switch_Fighter0,"Aren't you the prettiest thing..." +KinkyDungeonRemindJailPlayAdventurer_Switch_Fighter1,"I've met a lot of cuties, but you're something special!" +KinkyDungeonRemindJailPlayAdventurer_Switch_Fighter2,"You'd look good in something tight and inescapable!" +KinkyDungeonRemindJailPlayAdventurer_Switch_FighterStruggle,"Enjoying yourself? Let's have some fun~" +KinkyDungeonRemindJailPlayAdventurer_Switch_FighterLeash,"You seem like you're having fun! Why don't we go for a walk~" +KinkyDungeonRemindJailPlayAdventurer_Switch_FighterFree,"Wouldn't it be more interesting if..." +KinkyDungeonRemindJailPlayAdventurer_Switch_FighterLoot,"What have you got there?" +KinkyDungeonRemindJailPlayAdventurer_Switch_FighterKey,"Oooh, a key for my collection?" +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterAlert,"What's that noise? I guess it's just another adventurer..." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterAttack0,"Ah! So you do have some fight left in you..." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterAttack1,"A little help over here!" +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterAttack2,"I can take you!" +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterSpell0,"M-magic?" +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterSpell1,"I, uh, also learned a few cantrips... a while ago..." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterSpell2,"Okay, that was cool..." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterSpellItem,"I've got enchanted rings and you don't~" +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterShrine,"I don't think you're allowed to do that..." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterChest,"I think I deserve it instead~" +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterOrb,"That's not okay..." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterJailbreak,"I'm surprised you got this far!" +KinkyDungeonRemindJailAdventurer_Switch_FighterGrab,"Aha!" +KinkyDungeonRemindJailAdventurer_Switch_FighterDisarm,"Do you even know what you're doing?" +KinkyDungeonRemindJailAdventurer_Switch_FighterHit,"Okay, I may have exaggerated a bit..." +KinkyDungeonRemindJailAdventurer_Switch_FighterHitPlayer,"Please tell me it's not already over?" +KinkyDungeonRemindJailAdventurer_Switch_FighterMiss,"Ah hold still..." +KinkyDungeonRemindJailAdventurer_Switch_FighterBlock,"Coward!" +KinkyDungeonRemindJailAdventurer_Switch_FighterMissedMe,"As expected of an inferior duelist." +KinkyDungeonRemindJailAdventurer_Switch_FighterBlockedMe,"Is that all?" +KinkyDungeonRemindJailAdventurer_Switch_FighterLeash,"A well-deserved victory on my part~" +KinkyDungeonRemindJailAdventurer_Switch_FighterPull,"I've... got you?" +KinkyDungeonRemindJailAdventurer_Switch_FighterStun,"Are you finished? That's too bad..." +KinkyDungeonRemindJailAdventurer_Switch_FighterPickpocket,"...what were you planning to do with this?" +KinkyDungeonRemindJailAdventurer_Switch_FighterLock,"Oh... that's too bad~" +KinkyDungeonRemindJailAdventurer_Switch_FighterIntro,"My name is PTRN, A-rank adventurer. You?" +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterDefend0,"In the end, only one of us will be tied up! Wait a minute..." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterDefend1,"Heh, watch this~" +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterDefend2,"*readies weapon* time to get to work..." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterDefendHonor0,"I thought we could reason with her. Oh well..." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterDefendHonor1,"I see negotiations have broken down." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterDefendHonor2,"I'm the one you should worry about." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterHonor0,"I've got orders to take you down." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterHonor1,"There's a bounty on your head~" +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterHonor2,"The bounty will be mine..." +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterCommandDefend,"" +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterCommandAssault,"" +KinkyDungeonRemindJailChaseAdventurer_Switch_FighterCommandBlock,"" + + +KinkyDungeonRemindJailCastAdventurer_Dom_Fighter,"You can't hope to match my SPL~" +KinkyDungeonRemindJailMiscastAdventurer_Dom_Fighter,"SPL! No wait, not like that!" +KinkyDungeonRemindJailPlayHelplessAdventurer_Dom_Fighter0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessAdventurer_Dom_Fighter1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessAdventurer_Dom_Fighter2,"I can't get free!" +KinkyDungeonRemindJailPlayBratAdventurer_Dom_Fighter0,"Be nice!" +KinkyDungeonRemindJailPlayBratAdventurer_Dom_Fighter1,"No! Be gentle!" +KinkyDungeonRemindJailPlayBratAdventurer_Dom_Fighter2,"Ahhhh!" +KinkyDungeonRemindJailPlaySubAdventurer_Dom_Fighter0,"Headpats please..." +KinkyDungeonRemindJailPlaySubAdventurer_Dom_Fighter1,"*purrs*" +KinkyDungeonRemindJailPlaySubAdventurer_Dom_Fighter2,"Nyah, I've been a bad kitty..." +KinkyDungeonRemindJailPlayAdventurer_Dom_Fighter0,"You're a cute one~" +KinkyDungeonRemindJailPlayAdventurer_Dom_Fighter1,"It's about time I got someone to play with~" +KinkyDungeonRemindJailPlayAdventurer_Dom_Fighter2,"Let's take you for a walk~" +KinkyDungeonRemindJailPlayAdventurer_Dom_FighterStruggle,"Having fun there~?" +KinkyDungeonRemindJailPlayAdventurer_Dom_FighterLeash,"It's time for walkies~" +KinkyDungeonRemindJailPlayAdventurer_Dom_FighterFree,"Don't you want to play?" +KinkyDungeonRemindJailPlayAdventurer_Dom_FighterLoot,"Whatchya doing?" +KinkyDungeonRemindJailPlayAdventurer_Dom_FighterKey,"Tsk tsk, hand it over!" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterAlert,"A challenger approaches!" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterAttack0,"Prepare to face my skill!" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterAttack1,"I've mastered the blade for decades!" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterAttack2,"I'm invincible!" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterSpell0,"Nyah! What was that!?" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterSpell1,"Your spells won't hurt me." +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterSpell2,"Magic? That's..." +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterSpellItem,"Stupid tricks won't work on me!" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterShrine,"Praying won't help you~" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterChest,"That's not yours you know~" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterOrb,"Nyah! You'll pay for that!" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterJailbreak,"An escapee? I'm on it." +KinkyDungeonRemindJailAdventurer_Dom_FighterGrab,"Come here you~" +KinkyDungeonRemindJailAdventurer_Dom_FighterDisarm,"Checkmate~" +KinkyDungeonRemindJailAdventurer_Dom_FighterHit,"Nya~! No fair..." +KinkyDungeonRemindJailAdventurer_Dom_FighterHitPlayer,"Aren't you a little out of your league?" +KinkyDungeonRemindJailAdventurer_Dom_FighterMiss,"I'll get you next time!" +KinkyDungeonRemindJailAdventurer_Dom_FighterBlock,"Nice one! It won't work twice!" +KinkyDungeonRemindJailAdventurer_Dom_FighterMissedMe,"*smiles* It's okay, you tried~" +KinkyDungeonRemindJailAdventurer_Dom_FighterBlockedMe,"*CLANG* En garde!" +KinkyDungeonRemindJailAdventurer_Dom_FighterLeash,"It looks like I've won~" +KinkyDungeonRemindJailAdventurer_Dom_FighterPull,"Come here you~" +KinkyDungeonRemindJailAdventurer_Dom_FighterStun,"Nyah~!" +KinkyDungeonRemindJailAdventurer_Dom_FighterPickpocket,"What's this, nya?" +KinkyDungeonRemindJailAdventurer_Dom_FighterLock,"Let's make it a bit tighter, shall we?" +KinkyDungeonRemindJailAdventurer_Dom_FighterIntro,"They call me PTRN, the legendary blademaster!" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterDefend0,"I'LL take it from here." +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterDefend1,"It's me you should worry about!" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterDefend2,"Pfft. Amateurs." +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterDefendHonor0,"Did you think I wasn't looking?" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterDefendHonor1,"Nice try, girl~" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterDefendHonor2,"You've made a mistake attacking my client." +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterHonor0,"Capture her? Fine, but I expect payment." +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterHonor1,"I just follow the money, miss~" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterHonor2,"Can't let you have all the fun, can I?" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterCommandDefend,"" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterCommandAssault,"" +KinkyDungeonRemindJailChaseAdventurer_Dom_FighterCommandBlock,"" + +KinkyDungeonRemindJailCastDragonShadowGwen,"Time for SPL!" +KinkyDungeonRemindJailMiscastDragonShadowGwen,"*tsk*" +KinkyDungeonRemindJailPlayHelplessDragonShadowGwen0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessDragonShadowGwen1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessDragonShadowGwen2,"I can't get free!" +KinkyDungeonRemindJailPlayBratDragonShadowGwen0,"Let's play all night!" +KinkyDungeonRemindJailPlayBratDragonShadowGwen1,"Let's play all night!" +KinkyDungeonRemindJailPlayBratDragonShadowGwen2,"Let's play all night!" +KinkyDungeonRemindJailPlaySubDragonShadowGwen0,"We can take our time." +KinkyDungeonRemindJailPlaySubDragonShadowGwen1,"We can take our time." +KinkyDungeonRemindJailPlaySubDragonShadowGwen2,"We can take our time." +KinkyDungeonRemindJailPlayDragonShadowGwen0,"I bet you won't last long!" +KinkyDungeonRemindJailPlayDragonShadowGwen1,"I bet you won't last long!" +KinkyDungeonRemindJailPlayDragonShadowGwen2,"I bet you won't last long!" +KinkyDungeonRemindJailPlayDragonShadowGwenStruggle,"You won't be getting out tonight!" +KinkyDungeonRemindJailPlayDragonShadowGwenLeash,"I found my new pet for the day!" +KinkyDungeonRemindJailPlayDragonShadowGwenFree,"I bet you won't last long!" +KinkyDungeonRemindJailPlayDragonShadowGwenLoot,"Not a clock? Useless!" +KinkyDungeonRemindJailPlayDragonShadowGwenKey,"It's not time to go." +KinkyDungeonRemindJailChaseDragonShadowGwenAlert,"Why are you attacking me this time?" +KinkyDungeonRemindJailChaseDragonShadowGwenAttack0,"I'll make this quick." +KinkyDungeonRemindJailChaseDragonShadowGwenAttack1,"Why are you attacking me this time?" +KinkyDungeonRemindJailChaseDragonShadowGwenAttack2,"I'll make this quick." +KinkyDungeonRemindJailChaseDragonShadowGwenSpell0,"I've mastered this spell last night!" +KinkyDungeonRemindJailChaseDragonShadowGwenSpell1,"I've mastered this spell last night!" +KinkyDungeonRemindJailChaseDragonShadowGwenSpell2,"I've mastered this spell last night!" +KinkyDungeonRemindJailChaseDragonShadowGwenSpellItem,"Why are you attacking me this time?" +KinkyDungeonRemindJailChaseDragonShadowGwenShrine,"Not a clock? Useless!" +KinkyDungeonRemindJailChaseDragonShadowGwenChest,"Not a clock? Useless!" +KinkyDungeonRemindJailChaseDragonShadowGwenOrb,"Not a clock? Useless!" +KinkyDungeonRemindJailChaseDragonShadowGwenJailbreak,"Hey! No getting out before midnight!" +KinkyDungeonRemindJailDragonShadowGwenGrab,"Let's dance under the moonlight." +KinkyDungeonRemindJailDragonShadowGwenDisarm,"Do you have time to take it back?" +KinkyDungeonRemindJailDragonShadowGwenHit,"I can do this all day!" +KinkyDungeonRemindJailDragonShadowGwenHitPlayer,"It's only a matter of time before I get you." +KinkyDungeonRemindJailDragonShadowGwenMiss,"It's too bright here..." +KinkyDungeonRemindJailDragonShadowGwenBlock,"Why are you attacking me this time?" +KinkyDungeonRemindJailDragonShadowGwenMissedMe,"It seems you have nyctalopia..." +KinkyDungeonRemindJailDragonShadowGwenBlockedMe,"It seems you have nyctalopia..." +KinkyDungeonRemindJailDragonShadowGwenLeash,"I found my new pet for the day!" +KinkyDungeonRemindJailDragonShadowGwenPull,"It's time for you to give up." +KinkyDungeonRemindJailDragonShadowGwenStun,"Give me a moment~" +KinkyDungeonRemindJailDragonShadowGwenPickpocket,"Give me your watch!" +KinkyDungeonRemindJailDragonShadowGwenLock,"Here's a clock without the 'C'." +KinkyDungeonRemindJailDragonShadowGwenIntro,"Hello stranger. Do you know what time it is?" +KinkyDungeonRemindJailChaseDragonShadowGwenDefend0,"This'll be over in an instant." +KinkyDungeonRemindJailChaseDragonShadowGwenDefend1,"Time to wrap this up." +KinkyDungeonRemindJailChaseDragonShadowGwenDefend2,"Let's dance under the moonlight." +KinkyDungeonRemindJailChaseDragonShadowGwenDefendHonor0,"Playtime's over!" +KinkyDungeonRemindJailChaseDragonShadowGwenDefendHonor1,"Hold on a minute!" +KinkyDungeonRemindJailChaseDragonShadowGwenDefendHonor2,"Tick tock, what a shock..." +KinkyDungeonRemindJailChaseDragonShadowGwenHonor0,"Time for me to intervene..." +KinkyDungeonRemindJailChaseDragonShadowGwenHonor1,"Don't balk! Your time was up anyways~" +KinkyDungeonRemindJailChaseDragonShadowGwenHonor2,"Playtime's over!" +KinkyDungeonRemindJailChaseDragonShadowGwenCommandDefend,"I bet you won't last long!" +KinkyDungeonRemindJailChaseDragonShadowGwenCommandAssault,"Playtime's over!" +KinkyDungeonRemindJailChaseDragonShadowGwenCommandBlock,"Give me a moment~" + + +KinkyDungeonRemindJailCastOfficer,"Calling in a SPL!" +KinkyDungeonRemindJailMiscastOfficer,"A-assistance required!" +KinkyDungeonRemindJailPlayHelplessOfficer0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessOfficer1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessOfficer2,"I can't get free!" KinkyDungeonRemindJailPlayBratOfficer0,"You'll have to try harder if you want to discipline me, ma'am." KinkyDungeonRemindJailPlayBratOfficer1,"I... don't have time for training right now, ma'am..." KinkyDungeonRemindJailPlayBratOfficer2,"Did I do something wrong?" @@ -7135,10 +9540,11 @@ KinkyDungeonRemindJailPlayOfficer0,"Looks like you've had too much time to yours KinkyDungeonRemindJailPlayOfficer1,"Why don't you come with me for a sec?" KinkyDungeonRemindJailPlayOfficer2,"Let me see your ID..." KinkyDungeonRemindJailPlayOfficerStruggle,"You have the right to remain silent." -KinkyDungeonRemindJailPlayOfficerLeash,"No resisting arrest." +KinkyDungeonRemindJailPlayOfficerLeash,"Let's have a chat." KinkyDungeonRemindJailPlayOfficerFree,"Who set you loose?" KinkyDungeonRemindJailPlayOfficerLoot,"I'll be confiscating that." KinkyDungeonRemindJailPlayOfficerKey,"Aye, you're gonna need clearance for that, missy." +KinkyDungeonRemindJailChaseOfficerAlert,"Halt!" KinkyDungeonRemindJailChaseOfficerAttack0,"You just made a big mistake." KinkyDungeonRemindJailChaseOfficerAttack1,"Need backup!" KinkyDungeonRemindJailChaseOfficerAttack2,"You're under arrest!" @@ -7155,14 +9561,34 @@ KinkyDungeonRemindJailOfficerDisarm,"That's a weapons violation." KinkyDungeonRemindJailOfficerHit,"Assaulting an officer is a crime!" KinkyDungeonRemindJailOfficerHitPlayer,"You're coming with me." KinkyDungeonRemindJailOfficerMiss,"Resisting arrest won't get you anywhere." +KinkyDungeonRemindJailOfficerBlock,"Resisting arrest won't get you anywhere." KinkyDungeonRemindJailOfficerMissedMe,"Is that all you got?" +KinkyDungeonRemindJailOfficerBlockedMe,"Is that all you got?" KinkyDungeonRemindJailOfficerLeash,"You have the right to remain silent." KinkyDungeonRemindJailOfficerPull,"Got you!" KinkyDungeonRemindJailOfficerStun,"Hands behind your back." KinkyDungeonRemindJailOfficerPickpocket,"I will conduct a more thorough search later on." KinkyDungeonRemindJailOfficerLock,"Suspect is secure." - - +KinkyDungeonRemindJailOfficerIntro,"Officer PTRN, reporting for duty!" +KinkyDungeonRemindJailChaseOfficerDefend0,"Halt! You're under arrest!" +KinkyDungeonRemindJailChaseOfficerDefend1,"You seeing what I'm seeing?" +KinkyDungeonRemindJailChaseOfficerDefend2,"I'll have to finish my donut later..." +KinkyDungeonRemindJailChaseOfficerDefendHonor0,"Backup is here!" +KinkyDungeonRemindJailChaseOfficerDefendHonor1,"Hands up! Don't move!" +KinkyDungeonRemindJailChaseOfficerDefendHonor2,"Lay down your weapons and don't move!" +KinkyDungeonRemindJailChaseOfficerHonor0,"I have a warrant for your arrest..." +KinkyDungeonRemindJailChaseOfficerHonor1,"You're a wanted girl." +KinkyDungeonRemindJailChaseOfficerHonor2,"You're under arrest." +KinkyDungeonRemindJailChaseOfficerCommandDefend,"Backup has arrived." +KinkyDungeonRemindJailChaseOfficerCommandAssault,"Requesting backup!" +KinkyDungeonRemindJailChaseOfficerCommandBlock,"Calling in a blockade!" + + +KinkyDungeonRemindJailCastHunter,"Hidden technique: SPL!" +KinkyDungeonRemindJailMiscastHunter,"I practiced a thousand times... for this!?" +KinkyDungeonRemindJailPlayHelplessHunter0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessHunter1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessHunter2,"I can't get free!" KinkyDungeonRemindJailPlayBratHunter0,"I'm not in trouble, am I?" KinkyDungeonRemindJailPlayBratHunter1,"I'm not hiding anything, if you know what I mean..." KinkyDungeonRemindJailPlayBratHunter2,"Who are you looking for? Me?" @@ -7177,6 +9603,7 @@ KinkyDungeonRemindJailPlayHunterLeash,"I'm going to have some fun with you~" KinkyDungeonRemindJailPlayHunterFree,"Watch yourself, girl~" KinkyDungeonRemindJailPlayHunterLoot,"Nice find. I'll take it." KinkyDungeonRemindJailPlayHunterKey,"This place is off-limits for you." +KinkyDungeonRemindJailChaseHunterAlert,"Target is in my sights." KinkyDungeonRemindJailChaseHunterAttack0,"Let's see how you like my special move!" KinkyDungeonRemindJailChaseHunterAttack1,"That's nothing compared to my technique!" KinkyDungeonRemindJailChaseHunterAttack2,"You're in for it now!" @@ -7193,14 +9620,34 @@ KinkyDungeonRemindJailHunterDisarm,"Wrong move, buddy." KinkyDungeonRemindJailHunterHit,"I can't believe it..." KinkyDungeonRemindJailHunterHitPlayer,"You're too slow." KinkyDungeonRemindJailHunterMiss,"...she's fast." +KinkyDungeonRemindJailHunterBlock,"...she's strong." KinkyDungeonRemindJailHunterMissedMe,"Nothing personal." +KinkyDungeonRemindJailHunterBlockedMe,"Is that all?" KinkyDungeonRemindJailHunterLeash,"This battle is over." KinkyDungeonRemindJailHunterPull,"Get over here!" KinkyDungeonRemindJailHunterStun,"Too slow!" KinkyDungeonRemindJailHunterPickpocket,"I'll be taking that." KinkyDungeonRemindJailHunterLock,"There's no way out." - - +KinkyDungeonRemindJailHunterIntro,"The name's PTRN. Don't forget it." +KinkyDungeonRemindJailChaseHunterDefend0,"There's a juicy bounty on your head and I want it!" +KinkyDungeonRemindJailChaseHunterDefend1,"Hmph. This battle is already over." +KinkyDungeonRemindJailChaseHunterDefend2,"Time for some target practice." +KinkyDungeonRemindJailChaseHunterDefendHonor0,"Didn't expect me, did ya?" +KinkyDungeonRemindJailChaseHunterDefendHonor1,"Boo! Ha, scared ya~" +KinkyDungeonRemindJailChaseHunterDefendHonor2,"What, did you think I'd just stand here?" +KinkyDungeonRemindJailChaseHunterHonor0,"There's a bounty on your head, miss." +KinkyDungeonRemindJailChaseHunterHonor1,"I won't let you get away. That bounty is mine." +KinkyDungeonRemindJailChaseHunterHonor2,"Didn't expect me to show up, did you?" +KinkyDungeonRemindJailChaseHunterCommandDefend,"Need backup?" +KinkyDungeonRemindJailChaseHunterCommandAssault,"Time for a test of skill." +KinkyDungeonRemindJailChaseHunterCommandBlock,"I'll get you! Eventually..." + + +KinkyDungeonRemindJailCastWolfgirl,"Let's see how you like my SPL!" +KinkyDungeonRemindJailMiscastWolfgirl,"Wait, wrong button! Aaahh~" +KinkyDungeonRemindJailPlayHelplessWolfgirl0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessWolfgirl1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessWolfgirl2,"I can't get free!" KinkyDungeonRemindJailPlayBratWolfgirl0,"I'm not in trouble, am I?" KinkyDungeonRemindJailPlayBratWolfgirl1,"I'm not hiding anything, if you know what I mean..." KinkyDungeonRemindJailPlayBratWolfgirl2,"Who are you looking for? Me?" @@ -7215,6 +9662,7 @@ KinkyDungeonRemindJailPlayWolfgirlLeash,"I'm going to have some fun with you~" KinkyDungeonRemindJailPlayWolfgirlFree,"Watch yourself, girl~" KinkyDungeonRemindJailPlayWolfgirlLoot,"Nice find. I'll take it." KinkyDungeonRemindJailPlayWolfgirlKey,"This place is off-limits for you." +KinkyDungeonRemindJailChaseWolfgirlAlert,"I spy a cute one!" KinkyDungeonRemindJailChaseWolfgirlAttack0,"Bad pet!" KinkyDungeonRemindJailChaseWolfgirlAttack1,"Looks like you're gonna need the extra special treatment~" KinkyDungeonRemindJailChaseWolfgirlAttack2,"Now you've done it!" @@ -7231,17 +9679,95 @@ KinkyDungeonRemindJailWolfgirlDisarm,"Wrong move!" KinkyDungeonRemindJailWolfgirlHit,"Get your paws off me!" KinkyDungeonRemindJailWolfgirlHitPlayer,"*scoffs* Could use some work~" KinkyDungeonRemindJailWolfgirlMiss,"Such speed!" +KinkyDungeonRemindJailWolfgirlBlock,"Clever!" KinkyDungeonRemindJailWolfgirlMissedMe,"Nothing personal." +KinkyDungeonRemindJailWolfgirlBlockedMe,"Nothing personal." KinkyDungeonRemindJailWolfgirlLeash,"This battle is over." KinkyDungeonRemindJailWolfgirlPull,"Get over here!" KinkyDungeonRemindJailWolfgirlStun,"Too slow!" KinkyDungeonRemindJailWolfgirlPickpocket,"I'll be taking that." KinkyDungeonRemindJailWolfgirlLock,"There's no way out." - - +KinkyDungeonRemindJailWolfgirlIntro,"PTRN, Nevermere associate. Here's my card." +KinkyDungeonRemindJailChaseWolfgirlDefend0,"I run a legitimate business, I promise!" +KinkyDungeonRemindJailChaseWolfgirlDefend1,"Is it the tax collectors? Oh, no, it's just you..." +KinkyDungeonRemindJailChaseWolfgirlDefend2,"Looks like you landed on the wrong side of the coin~" +KinkyDungeonRemindJailChaseWolfgirlDefendHonor0,"A deal's a deal, my friend." +KinkyDungeonRemindJailChaseWolfgirlDefendHonor1,"Excuse me, you just attacked my client." +KinkyDungeonRemindJailChaseWolfgirlDefendHonor2,"Hey! We were just talking! No sketchy underground dealings, nope." +KinkyDungeonRemindJailChaseWolfgirlHonor0,"I'll help capture her! For a 50% share that is~" +KinkyDungeonRemindJailChaseWolfgirlHonor1,"We deal in the finest products... like you, if you catch my drift~" +KinkyDungeonRemindJailChaseWolfgirlHonor2,"I smell a shady business opportunity~" +KinkyDungeonRemindJailChaseWolfgirlCommandDefend,"*growls menacingly*" +KinkyDungeonRemindJailChaseWolfgirlCommandAssault,"Let's make this fun~" +KinkyDungeonRemindJailChaseWolfgirlCommandBlock,"What's that about backup?" + + +KinkyDungeonRemindJailCastYen,"Let's see how you like my SPL!" +KinkyDungeonRemindJailMiscastYen,"Wait no, wrong button!" +KinkyDungeonRemindJailPlayHelplessYen0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessYen1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessYen2,"I can't get free!" +KinkyDungeonRemindJailPlayBratYen0,"Catch me. If you can, that is." +KinkyDungeonRemindJailPlayBratYen1,"I double dare you." +KinkyDungeonRemindJailPlayBratYen2,"Weren't you chasing me?" +KinkyDungeonRemindJailPlaySubYen0,"Catch me. If you can, that is." +KinkyDungeonRemindJailPlaySubYen1,"I double dare you." +KinkyDungeonRemindJailPlaySubYen2,"Weren't you chasing me?" +KinkyDungeonRemindJailPlayYen0,"I've got somethin nice for ya." +KinkyDungeonRemindJailPlayYen1,"Be a good girl for me, will ya?" +KinkyDungeonRemindJailPlayYen2,"You need to show some restraint." +KinkyDungeonRemindJailPlayYenStruggle,"Stay where you belong, you naughty girl." +KinkyDungeonRemindJailPlayYenLeash,"Let's go somewhere more private." +KinkyDungeonRemindJailPlayYenFree,"Watch yourself, girl~" +KinkyDungeonRemindJailPlayYenLoot,"Nice find. I'll take it." +KinkyDungeonRemindJailPlayYenKey,"This place is off-limits for you." +KinkyDungeonRemindJailChaseYenAlert,"Ready or not, here I come." +KinkyDungeonRemindJailChaseYenAttack0,"Bad pet!" +KinkyDungeonRemindJailChaseYenAttack1,"Looks like you're gonna need the extra special treatment~" +KinkyDungeonRemindJailChaseYenAttack2,"Now you've done it!" +KinkyDungeonRemindJailChaseYenSpell0,"Magic? Hah..." +KinkyDungeonRemindJailChaseYenSpell1,"Such outdated practices..." +KinkyDungeonRemindJailChaseYenSpell2,"Your spells are nothing compared to technology." +KinkyDungeonRemindJailChaseYenSpellItem,"Quit messing around." +KinkyDungeonRemindJailChaseYenShrine,"Those sticky fingers belong in a pair of mittens." +KinkyDungeonRemindJailChaseYenChest,"Those sticky fingers belong in a pair of mittens." +KinkyDungeonRemindJailChaseYenOrb,"Those sticky fingers belong in a pair of mittens." +KinkyDungeonRemindJailChaseYenJailbreak,"All units. Apprehend convict with extreme prejudice." +KinkyDungeonRemindJailYenGrab,"You're going nowhere." +KinkyDungeonRemindJailYenDisarm,"Come on. This wasn't your only weapon, was it?" +KinkyDungeonRemindJailYenHit,"Get your paws off me!" +KinkyDungeonRemindJailYenHitPlayer,"*scoffs* Could use some work~" +KinkyDungeonRemindJailYenMiss,"Such speed!" +KinkyDungeonRemindJailYenBlock,"A tank, huh." +KinkyDungeonRemindJailYenMissedMe,"Nothing personal." +KinkyDungeonRemindJailYenBlockedMe,"Nothing personal." +KinkyDungeonRemindJailYenLeash,"This battle is over." +KinkyDungeonRemindJailYenPull,"You're going nowhere." +KinkyDungeonRemindJailYenStun,"Too slow!" +KinkyDungeonRemindJailYenPickpocket,"Mine now." +KinkyDungeonRemindJailYenLock,"Just keeping you safe from yourself." +KinkyDungeonRemindJailYenIntro,"PTRN, Nevermere associate. Here's my card." +KinkyDungeonRemindJailChaseYenDefend0,"I run a legitimate business, I promise!" +KinkyDungeonRemindJailChaseYenDefend1,"Is it the tax collectors? Oh, no, it's just you..." +KinkyDungeonRemindJailChaseYenDefend2,"Looks like you landed on the wrong side of the coin~" +KinkyDungeonRemindJailChaseYenDefendHonor0,"A deal's a deal, my friend." +KinkyDungeonRemindJailChaseYenDefendHonor1,"Excuse me, you just attacked my client." +KinkyDungeonRemindJailChaseYenDefendHonor2,"Hey! We were just talking! No sketchy underground dealings, nope." +KinkyDungeonRemindJailChaseYenHonor0,"I'll help capture her! For a 50% share that is~" +KinkyDungeonRemindJailChaseYenHonor1,"We deal in the finest products... like you, if you catch my drift~" +KinkyDungeonRemindJailChaseYenHonor2,"I smell a shady business opportunity~" +KinkyDungeonRemindJailChaseYenCommandDefend,"*growls menacingly*" +KinkyDungeonRemindJailChaseYenCommandAssault,"Let's make this fun~" +KinkyDungeonRemindJailChaseYenCommandBlock,"What's that about backup?" + +KinkyDungeonRemindJailCastElf,"SPL, sing to me!" +KinkyDungeonRemindJailMiscastElf,"SPL, listen to me..." +KinkyDungeonRemindJailPlayHelplessElf0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessElf1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessElf2,"I can't get free!" KinkyDungeonRemindJailPlayBratElf0,"An outsider!" KinkyDungeonRemindJailPlayBratElf1,"Hide!" -KinkyDungeonRemindJailPlayBratElf2,"Do not pursue me!" +KinkyDungeonRemindJailPlayBratElf2,"I have done nothing worthy of punishment!" KinkyDungeonRemindJailPlaySubElf0,"I have come to study human customs. Teach me about Domination." KinkyDungeonRemindJailPlaySubElf1,"The outsiders have such... strange and interesting practices." KinkyDungeonRemindJailPlaySubElf2,"You seem to have many skills. Teach me about... rope." @@ -7253,6 +9779,7 @@ KinkyDungeonRemindJailPlayElfLeash,"I have just the thing in mind for you..." KinkyDungeonRemindJailPlayElfFree,"Let us put those hands away..." KinkyDungeonRemindJailPlayElfLoot,"Give back what you take." KinkyDungeonRemindJailPlayElfKey,"You must remain here." +KinkyDungeonRemindJailChaseElfAlert,"Trespasser!" KinkyDungeonRemindJailChaseElfAttack0,"Resorting to violence?" KinkyDungeonRemindJailChaseElfAttack1,"Let us clash swords!" KinkyDungeonRemindJailChaseElfAttack2,"*scoffs*" @@ -7269,14 +9796,93 @@ KinkyDungeonRemindJailElfDisarm,"A classic blunder." KinkyDungeonRemindJailElfHit,"You will regret that, outsider." KinkyDungeonRemindJailElfHitPlayer,"You get what you deserve." KinkyDungeonRemindJailElfMiss,"You didn't see that." +KinkyDungeonRemindJailElfBlock,"You didn't see that." KinkyDungeonRemindJailElfMissedMe,"It looks like my skills are superior." +KinkyDungeonRemindJailElfBlockedMe,"It looks like my skills are superior." KinkyDungeonRemindJailElfLeash,"I will show you your place, outsider." KinkyDungeonRemindJailElfPull,"You will come with me." KinkyDungeonRemindJailElfStun,"I regret to inform you that your battle ends here." KinkyDungeonRemindJailElfPickpocket,"You won't be needing that." KinkyDungeonRemindJailElfLock,"There we go." - - +KinkyDungeonRemindJailElfIntro,"You stand before PTRN, blessed by the Goddess Ninril." +KinkyDungeonRemindJailChaseElfDefend0,"By the Four..." +KinkyDungeonRemindJailChaseElfDefend1,"I shall put an end to this." +KinkyDungeonRemindJailChaseElfDefend2,"I swear I will capture her!" +KinkyDungeonRemindJailChaseElfDefendHonor0,"Nature compels me to intervene!" +KinkyDungeonRemindJailChaseElfDefendHonor1,"I shall protect every one of the Goddess' creations." +KinkyDungeonRemindJailChaseElfDefendHonor2,"Justice shall be had!" +KinkyDungeonRemindJailChaseElfHonor0,"I shall defend you from this outsider!" +KinkyDungeonRemindJailChaseElfHonor1,"The outsider betrays our ally!" +KinkyDungeonRemindJailChaseElfHonor2,"You have faltered in your ways. I shall correct that!" +KinkyDungeonRemindJailChaseElfCommandDefend,"Truly concerning." +KinkyDungeonRemindJailChaseElfCommandAssault,"You leave me no choice." +KinkyDungeonRemindJailChaseElfCommandBlock,"I stand firm." + + +KinkyDungeonRemindJailCastElfSmug,"Behold, SPL." +KinkyDungeonRemindJailMiscastElfSmug,"Y-your fate has been postponed... briefly." +KinkyDungeonRemindJailPlayHelplessElfSmug0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessElfSmug1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessElfSmug2,"I can't get free!" +KinkyDungeonRemindJailPlayBratElfSmug0,"An outsider!" +KinkyDungeonRemindJailPlayBratElfSmug1,"Hide!" +KinkyDungeonRemindJailPlayBratElfSmug2,"I have done nothing worthy of punishment!" +KinkyDungeonRemindJailPlaySubElfSmug0,"I have come to study human customs. Teach me about Domination." +KinkyDungeonRemindJailPlaySubElfSmug1,"The outsiders have such... strange and interesting practices." +KinkyDungeonRemindJailPlaySubElfSmug2,"You seem to have many skills. Teach me about... rope." +KinkyDungeonRemindJailPlayElfSmug0,"Hello, Outsider." +KinkyDungeonRemindJailPlayElfSmug1,"You look so... bland." +KinkyDungeonRemindJailPlayElfSmug2,"Outsiders are so picky about what they wear..." +KinkyDungeonRemindJailPlayElfSmugStruggle,"You look cute in that, you should lose the rest though!" +KinkyDungeonRemindJailPlayElfSmugLeash,"I have just the thing in mind for you..." +KinkyDungeonRemindJailPlayElfSmugFree,"Let us put those hands away..." +KinkyDungeonRemindJailPlayElfSmugLoot,"Give back what you take." +KinkyDungeonRemindJailPlayElfSmugKey,"You must remain here." +KinkyDungeonRemindJailChaseElfSmugAlert,"Trespasser!" +KinkyDungeonRemindJailChaseElfSmugAttack0,"Resorting to violence?" +KinkyDungeonRemindJailChaseElfSmugAttack1,"Let us clash swords!" +KinkyDungeonRemindJailChaseElfSmugAttack2,"*scoffs*" +KinkyDungeonRemindJailChaseElfSmugSpell0,"You have brought judgement upon youself." +KinkyDungeonRemindJailChaseElfSmugSpell1,"Your magic is that of a child." +KinkyDungeonRemindJailChaseElfSmugSpell2,"Imagine what you could learn in twelve lifetimes..." +KinkyDungeonRemindJailChaseElfSmugSpellItem,"You rely on cheap gadgets." +KinkyDungeonRemindJailChaseElfSmugShrine,"Do not defile the ancients." +KinkyDungeonRemindJailChaseElfSmugChest,"Give that back!" +KinkyDungeonRemindJailChaseElfSmugOrb,"The ancients are appalled." +KinkyDungeonRemindJailChaseElfSmugJailbreak,"The outsider has escaped!" +KinkyDungeonRemindJailElfSmugGrab,"Ready to reconsider?" +KinkyDungeonRemindJailElfSmugDisarm,"A classic blunder." +KinkyDungeonRemindJailElfSmugHit,"You will regret that, outsider." +KinkyDungeonRemindJailElfSmugHitPlayer,"You get what you deserve." +KinkyDungeonRemindJailElfSmugMiss,"You didn't see that." +KinkyDungeonRemindJailElfSmugBlock,"You didn't see that." +KinkyDungeonRemindJailElfSmugMissedMe,"It looks like my skills are superior." +KinkyDungeonRemindJailElfSmugBlockedMe,"It looks like my skills are superior." +KinkyDungeonRemindJailElfSmugLeash,"I will show you your place, outsider." +KinkyDungeonRemindJailElfSmugPull,"You will come with me." +KinkyDungeonRemindJailElfSmugStun,"I regret to inform you that your battle ends here." +KinkyDungeonRemindJailElfSmugPickpocket,"You won't be needing that." +KinkyDungeonRemindJailElfSmugLock,"There we go." +KinkyDungeonRemindJailElfSmugIntro,"You stand before PTRN, blessed by the Goddess Ninril." +KinkyDungeonRemindJailChaseElfSmugDefend0,"By the Four..." +KinkyDungeonRemindJailChaseElfSmugDefend1,"I shall put an end to this." +KinkyDungeonRemindJailChaseElfSmugDefend2,"I swear I will capture her!" +KinkyDungeonRemindJailChaseElfSmugDefendHonor0,"Nature compels me to intervene!" +KinkyDungeonRemindJailChaseElfSmugDefendHonor1,"I shall protect every one of the Goddess' creations." +KinkyDungeonRemindJailChaseElfSmugDefendHonor2,"Justice shall be had!" +KinkyDungeonRemindJailChaseElfSmugHonor0,"I shall defend you from this outsider!" +KinkyDungeonRemindJailChaseElfSmugHonor1,"The outsider betrays our ally!" +KinkyDungeonRemindJailChaseElfSmugHonor2,"You have faltered in your ways. I shall correct that!" +KinkyDungeonRemindJailChaseElfSmugCommandDefend,"Truly concerning." +KinkyDungeonRemindJailChaseElfSmugCommandAssault,"You leave me no choice." +KinkyDungeonRemindJailChaseElfSmugCommandBlock,"I stand firm." + + +KinkyDungeonRemindJailCastDryad,"SPL!" +KinkyDungeonRemindJailMiscastDryad,"Mmmph!" +KinkyDungeonRemindJailPlayHelplessDryad0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessDryad1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessDryad2,"I can't get free!" KinkyDungeonRemindJailPlayBratDryad0,"I don't like the way you're looking at me!" KinkyDungeonRemindJailPlayBratDryad1,"Yes, I've got the secrets of nature right here..." KinkyDungeonRemindJailPlayBratDryad2,"Why don't you come after me?" @@ -7291,6 +9897,7 @@ KinkyDungeonRemindJailPlayDryadLeash,"I have just the thing in mind for you..." KinkyDungeonRemindJailPlayDryadFree,"Let us put those hands away..." KinkyDungeonRemindJailPlayDryadLoot,"Give back what you take." KinkyDungeonRemindJailPlayDryadKey,"You must remain here." +KinkyDungeonRemindJailChaseDryadAlert,"Intruder!" KinkyDungeonRemindJailChaseDryadAttack0,"Resorting to violence?" KinkyDungeonRemindJailChaseDryadAttack1,"Let us clash swords!" KinkyDungeonRemindJailChaseDryadAttack2,"*scoffs*" @@ -7307,17 +9914,34 @@ KinkyDungeonRemindJailDryadDisarm,"A classic blunder." KinkyDungeonRemindJailDryadHit,"You will regret that, outsider." KinkyDungeonRemindJailDryadHitPlayer,"You get what you deserve." KinkyDungeonRemindJailDryadMiss,"You didn't see that." +KinkyDungeonRemindJailDryadBlock,"You didn't see that." KinkyDungeonRemindJailDryadMissedMe,"It looks like my skills are superior." +KinkyDungeonRemindJailDryadBlockedMe,"It looks like my skills are superior." KinkyDungeonRemindJailDryadLeash,"I will show you your place, outsider." KinkyDungeonRemindJailDryadPull,"You will come with me." KinkyDungeonRemindJailDryadStun,"I regret to inform you that your battle ends here." KinkyDungeonRemindJailDryadPickpocket,"You won't be needing that." KinkyDungeonRemindJailDryadLock,"There we go." - - -KinkyDungeonRemindJailPlayBratMushy0,"Bug" -KinkyDungeonRemindJailPlayBratMushy1,"Bug" -KinkyDungeonRemindJailPlayBratMushy2,"Bug" +KinkyDungeonRemindJailDryadIntro,"My name? Uh... let's go with PTRN." +KinkyDungeonRemindJailChaseDryadDefend0,"You will not get away with this, outsider!" +KinkyDungeonRemindJailChaseDryadDefend1,"You shall pay with your freedom." +KinkyDungeonRemindJailChaseDryadDefend2,"Ninril demands justice." +KinkyDungeonRemindJailChaseDryadDefendHonor0,"Nature calls me!" +KinkyDungeonRemindJailChaseDryadDefendHonor1,"I hear the little creatures crying out!" +KinkyDungeonRemindJailChaseDryadDefendHonor2,"Such betrayal!" +KinkyDungeonRemindJailChaseDryadHonor0,"Nature guides us!" +KinkyDungeonRemindJailChaseDryadHonor1,"Nature protects those who are worthy!" +KinkyDungeonRemindJailChaseDryadHonor2,"I share the will of the Goddess!" +KinkyDungeonRemindJailChaseDryadCommandDefend,"They won't get away with this!" +KinkyDungeonRemindJailChaseDryadCommandAssault,"Face my wrath!" +KinkyDungeonRemindJailChaseDryadCommandBlock,"Nature protects!" + + +KinkyDungeonRemindJailCastMushy,"SPL!" +KinkyDungeonRemindJailMiscastMushy,"!!!" +KinkyDungeonRemindJailPlayBratMushy0,"Run away!" +KinkyDungeonRemindJailPlayBratMushy1,"Run!" +KinkyDungeonRemindJailPlayBratMushy2,"Scary!" KinkyDungeonRemindJailPlaySubMushy0,"This is a bug, please report" KinkyDungeonRemindJailPlaySubMushy1,"This is a bug, please report" KinkyDungeonRemindJailPlaySubMushy2,"This is a bug, please report" @@ -7329,6 +9953,7 @@ KinkyDungeonRemindJailPlayMushyLeash,"Capture..." KinkyDungeonRemindJailPlayMushyFree,"Need tighten!" KinkyDungeonRemindJailPlayMushyLoot,"Confiscate!" KinkyDungeonRemindJailPlayMushyKey,"Confiscate!!" +KinkyDungeonRemindJailChaseMushyAlert,"Alert!" KinkyDungeonRemindJailChaseMushyAttack0,"Intruder! Alert!" KinkyDungeonRemindJailChaseMushyAttack1,"Fight girl!" KinkyDungeonRemindJailChaseMushyAttack2,"Fight!" @@ -7345,14 +9970,91 @@ KinkyDungeonRemindJailMushyDisarm,"Got you!" KinkyDungeonRemindJailMushyHit,"Pain..." KinkyDungeonRemindJailMushyHitPlayer,"Fight!" KinkyDungeonRemindJailMushyMiss,"Come back!" +KinkyDungeonRemindJailMushyBlock,"Stop!" KinkyDungeonRemindJailMushyMissedMe,"Missed!" +KinkyDungeonRemindJailMushyBlockedMe,"Missed!" KinkyDungeonRemindJailMushyLeash,"Capture!!!" KinkyDungeonRemindJailMushyPull,"Come here!" KinkyDungeonRemindJailMushyStun,"Got her!!!" KinkyDungeonRemindJailMushyPickpocket,"Take!" KinkyDungeonRemindJailMushyLock,"Secure!" - - +KinkyDungeonRemindJailMushyIntro,"Greetings Madame, you may call me PTRN." +KinkyDungeonRemindJailChaseMushyDefend0,"Defend!" +KinkyDungeonRemindJailChaseMushyDefend1,"Protect!" +KinkyDungeonRemindJailChaseMushyDefend2,"Fight!" +KinkyDungeonRemindJailChaseMushyDefendHonor0,"Protect!" +KinkyDungeonRemindJailChaseMushyDefendHonor1,"Defend!" +KinkyDungeonRemindJailChaseMushyDefendHonor2,"Fight!" +KinkyDungeonRemindJailChaseMushyHonor0,"Fight!" +KinkyDungeonRemindJailChaseMushyHonor1,"Protect!" +KinkyDungeonRemindJailChaseMushyHonor2,"Defend!" +KinkyDungeonRemindJailChaseMushyCommandDefend,"" +KinkyDungeonRemindJailChaseMushyCommandAssault,"Rawr!" +KinkyDungeonRemindJailChaseMushyCommandBlock,"" + +KinkyDungeonRemindJailCastMyrtrice,"SPL! Now my wrath is revealed!" +KinkyDungeonRemindJailMiscastMyrtrice,"Wh-what happened? What weakness has infiltrated Myrtrice?" +KinkyDungeonRemindJailPlayHelplessMyrtrice0,"You will loose me or burn eternal!!!" +KinkyDungeonRemindJailPlayHelplessMyrtrice1,"... This shame is unbearable! Oh sister!!!" +KinkyDungeonRemindJailPlayHelplessMyrtrice2,"Oh! Mytrice is caught! My ambitions laid to ruin!" +KinkyDungeonRemindJailPlayBratMyrtrice0,"The winds of retribution carry me elsewhere..." +KinkyDungeonRemindJailPlayBratMyrtrice1,"Myrtrice will come for you shortly! Consider yourself fortunate..." +KinkyDungeonRemindJailPlayBratMyrtrice2,"I will retreat into darkness..." +KinkyDungeonRemindJailPlaySubMyrtrice0,"My sins are a multitude! I will submit to your judgements..." +KinkyDungeonRemindJailPlaySubMyrtrice1,"I do not ask for mercy for I have shown none!" +KinkyDungeonRemindJailPlaySubMyrtrice2,"You must punish me! I can't face my sister Myrtle until my debts are paid..." +KinkyDungeonRemindJailPlayMyrtrice0,"Your chest quivers... Do you fear me?" +KinkyDungeonRemindJailPlayMyrtrice1,"Is it that another moth has become enthralled to my fires bright?" +KinkyDungeonRemindJailPlayMyrtrice2,"Myrtrice entreats you! Remain still and let my adoring embers kiss your lips tender..." +KinkyDungeonRemindJailPlayMyrtriceStruggle,"To struggle is to invite searing coals upon your head!" +KinkyDungeonRemindJailPlayMyrtriceLeash,"I will drag you into the dark and you will witness my projects!" +KinkyDungeonRemindJailPlayMyrtriceFree,"To escape is only to delay! My fires consume ALL!" +KinkyDungeonRemindJailPlayMyrtriceLoot,"Dusty trinkets... Your scrapping around is an insolence!" +KinkyDungeonRemindJailPlayMyrtriceKey,"You would scorn the memory of my sister with escape?!" +KinkyDungeonRemindJailChaseMyrtriceAlert,"Careless of you to appear before Myrtrice like this!" +KinkyDungeonRemindJailChaseMyrtriceAttack0,"Your attempts are trivial!" +KinkyDungeonRemindJailChaseMyrtriceAttack1,"You invite wrath!!!" +KinkyDungeonRemindJailChaseMyrtriceAttack2,"Pathetic!!!" +KinkyDungeonRemindJailChaseMyrtriceSpell0,"Such hapless casting scorns the memory of my sister!" +KinkyDungeonRemindJailChaseMyrtriceSpell1,"Your magics will be swallowed up by hellfire!!!" +KinkyDungeonRemindJailChaseMyrtriceSpell2,"Myrtrice is subject to no magic!!!" +KinkyDungeonRemindJailChaseMyrtriceSpellItem,"Items? How exceptionally talentless..." +KinkyDungeonRemindJailChaseMyrtriceShrine,"That shrine scorns the memory of my sister! I hate it!" +KinkyDungeonRemindJailChaseMyrtriceChest,"True power doesn't come from old rickety crates..." +KinkyDungeonRemindJailChaseMyrtriceOrb,"Orbs? What a gruesome display of weakness! True power comes from the self!" +KinkyDungeonRemindJailChaseMyrtriceJailbreak,"YOU SCORN THE MEMORY OF MY LATE SISTER!!!" +KinkyDungeonRemindJailMyrtriceGrab,"This is where you will remain until Myrtrice wills otherwise!" +KinkyDungeonRemindJailMyrtriceDisarm,"This is what you were gripping so tightly in your hands?" +KinkyDungeonRemindJailMyrtriceHit,"WHAT ABBORANCE! You will pay for that..." +KinkyDungeonRemindJailMyrtriceHitPlayer,"SEAR ETERNAL!" +KinkyDungeonRemindJailMyrtriceMiss,"I, Myrtrice, missed?!" +KinkyDungeonRemindJailMyrtriceBlock,"No one resists Myrtrice! How irritating!!!" +KinkyDungeonRemindJailMyrtriceMissedMe,"Your failures do not surprise Myrtrice!" +KinkyDungeonRemindJailMyrtriceBlockedMe,"Your pathetic attempts scorn the memory of my sister!" +KinkyDungeonRemindJailMyrtriceLeash,"The curtains of my revenge are drawn! You will follow me..." +KinkyDungeonRemindJailMyrtricePull,"You will come with Myrtrice!!!" +KinkyDungeonRemindJailMyrtriceStun,"Be dazed by the radiant brilliance of my hellfires!" +KinkyDungeonRemindJailMyrtricePickpocket,"I will repay the theif with brutal reprisal..." +KinkyDungeonRemindJailMyrtriceLock,"Your fate is sealed! ... Myrtle this is for you, sister!" +KinkyDungeonRemindJailMyrtriceIntro,"All creatures are subject to Myrtrice! It is the price of their insolence..." +KinkyDungeonRemindJailChaseMyrtriceDefend0,"You make a grave mistake ignoring me!!!" +KinkyDungeonRemindJailChaseMyrtriceDefend1,"Your eyes belong here! With Myrtrice!!!" +KinkyDungeonRemindJailChaseMyrtriceDefend2,"The ones who turn their backs on Myrtrice SEAR IN HELLFIRE!" +KinkyDungeonRemindJailChaseMyrtriceDefendHonor0,"What a hideous display!!! Where is your honor?" +KinkyDungeonRemindJailChaseMyrtriceDefendHonor1,"It is this kind of petulant insolence that tarnishes the memory of my sister!" +KinkyDungeonRemindJailChaseMyrtriceDefendHonor2,"You are a blight! My sister Myrtle would never stand for this!!!" +KinkyDungeonRemindJailChaseMyrtriceHonor0,"THE CURTAINS OF MY REVENGE DRAW OPEN WIDE!" +KinkyDungeonRemindJailChaseMyrtriceHonor1,"What an excellent oppertunity to expand my alters in the dark!" +KinkyDungeonRemindJailChaseMyrtriceHonor2,"I see a chalice before me... it drips with shadow and overflows with darkness!" +KinkyDungeonRemindJailChaseMyrtriceCommandDefend,"My late sister Myrtle was a much more proficent defender than I... Oh how I long for her *sob*" +KinkyDungeonRemindJailChaseMyrtriceCommandAssault,"THE PATH OF MY RETRIBUTION IS PAVED WITH BRIMSTONE AND BATHED IN BLAZING HELLFIRE! BURN!" +KinkyDungeonRemindJailChaseMyrtriceCommandBlock,"I, Myrtrice, will resist their insolent fusilades!" + +KinkyDungeonRemindJailCastFungal,"SPL." +KinkyDungeonRemindJailMiscastFungal,"This mind is altered..." +KinkyDungeonRemindJailPlayHelplessFungal0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessFungal1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessFungal2,"I can't get free!" KinkyDungeonRemindJailPlayBratFungal0,"So this is what it's like..." KinkyDungeonRemindJailPlayBratFungal1,"I believe I am feeling an emotion called 'fear.'" KinkyDungeonRemindJailPlayBratFungal2,"Stay back! I am not your toy." @@ -7367,6 +10069,7 @@ KinkyDungeonRemindJailPlayFungalLeash,"I will take you somewhere safe." KinkyDungeonRemindJailPlayFungalFree,"You need to learn your place." KinkyDungeonRemindJailPlayFungalLoot,"Do not take what is not yours." KinkyDungeonRemindJailPlayFungalKey,"You will not escape." +KinkyDungeonRemindJailChaseFungalAlert,"We see you..." KinkyDungeonRemindJailChaseFungalAttack0,"Our ways are ancient!" KinkyDungeonRemindJailChaseFungalAttack1,"Your weapons are toys to us!" KinkyDungeonRemindJailChaseFungalAttack2,"So naive, surface-dweller." @@ -7383,14 +10086,33 @@ KinkyDungeonRemindJailFungalDisarm,"That was a failure." KinkyDungeonRemindJailFungalHit,"That was commendable." KinkyDungeonRemindJailFungalHitPlayer,"I have you now, surface-dweller." KinkyDungeonRemindJailFungalMiss,"You are a fast one." +KinkyDungeonRemindJailFungalBlock,"You are a tricky one." KinkyDungeonRemindJailFungalMissedMe,"You seem out of practice." +KinkyDungeonRemindJailFungalBlockedMe,"You seem out of practice." KinkyDungeonRemindJailFungalLeash,"I will take you to your place." KinkyDungeonRemindJailFungalPull,"Come." KinkyDungeonRemindJailFungalStun,"Stay down." KinkyDungeonRemindJailFungalPickpocket,"I will take this." KinkyDungeonRemindJailFungalLock,"You will not escape." - - +KinkyDungeonRemindJailFungalIntro,"We are PTRN." +KinkyDungeonRemindJailChaseFungalDefend0,"The collective defends itself." +KinkyDungeonRemindJailChaseFungalDefend1,"We are one." +KinkyDungeonRemindJailChaseFungalDefend2,"Ow, that hurt!" +KinkyDungeonRemindJailChaseFungalDefendHonor0,"We do not stand for this." +KinkyDungeonRemindJailChaseFungalDefendHonor1,"Do not attack our allies." +KinkyDungeonRemindJailChaseFungalDefendHonor2,"Our friends are in need." +KinkyDungeonRemindJailChaseFungalHonor0,"You have been judged and found wanting." +KinkyDungeonRemindJailChaseFungalHonor1,"We sense disarray." +KinkyDungeonRemindJailChaseFungalHonor2,"We stand together." +KinkyDungeonRemindJailChaseFungalCommandDefend,"We support each other." +KinkyDungeonRemindJailChaseFungalCommandAssault,"You leave us no choice." +KinkyDungeonRemindJailChaseFungalCommandBlock,"You cannot comprehend our tactics." + +KinkyDungeonRemindJailCastMummy,"Face my SPL!" +KinkyDungeonRemindJailMiscastMummy,"Nyah!!! *blushes*" +KinkyDungeonRemindJailPlayHelplessMummy0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessMummy1,"Nyah! This is impossible!" +KinkyDungeonRemindJailPlayHelplessMummy2,"I can't get free!" KinkyDungeonRemindJailPlayBratMummy0,"Meow!!!" KinkyDungeonRemindJailPlayBratMummy1,"No! This kitty did nothing wrong!" KinkyDungeonRemindJailPlayBratMummy2,"Why are you looking at me like that?!" @@ -7405,6 +10127,7 @@ KinkyDungeonRemindJailPlayMummyLeash,"You will receive the blessing." KinkyDungeonRemindJailPlayMummyFree,"What are you doing?" KinkyDungeonRemindJailPlayMummyLoot,"Thanks for keeping things tidy." KinkyDungeonRemindJailPlayMummyKey,"Where do you think you're going?" +KinkyDungeonRemindJailChaseMummyAlert,"Who dares intrude on our sacred grounds?" KinkyDungeonRemindJailChaseMummyAttack0,"By the blessed kitty!" KinkyDungeonRemindJailChaseMummyAttack1,"Show us what you got!" KinkyDungeonRemindJailChaseMummyAttack2,"Who do you think you are?" @@ -7421,14 +10144,33 @@ KinkyDungeonRemindJailMummyDisarm,"Hah!" KinkyDungeonRemindJailMummyHit,"*hisses*" KinkyDungeonRemindJailMummyHitPlayer,"*meows*" KinkyDungeonRemindJailMummyMiss,"*frowns*" +KinkyDungeonRemindJailMummyBlock,"*frowns*" KinkyDungeonRemindJailMummyMissedMe,"I have catlike reflexes!" +KinkyDungeonRemindJailMummyBlockedMe,"I have catlike reflexes!" KinkyDungeonRemindJailMummyLeash,"Let me show you the blessing..." KinkyDungeonRemindJailMummyPull,"Come along." KinkyDungeonRemindJailMummyStun,"*grins*" KinkyDungeonRemindJailMummyPickpocket,"You won't be needing this." KinkyDungeonRemindJailMummyLock,"Quit struggling~" - - +KinkyDungeonRemindJailMummyIntro,"My true name is unpronouncible in your tongue. But you may call me PTRN." +KinkyDungeonRemindJailChaseMummyDefend0,"She brings curses!" +KinkyDungeonRemindJailChaseMummyDefend1,"An intruder confronts us!" +KinkyDungeonRemindJailChaseMummyDefend2,"Your fate is already sealed~" +KinkyDungeonRemindJailChaseMummyDefendHonor0,"I will defend you!" +KinkyDungeonRemindJailChaseMummyDefendHonor1,"I'll stop her!" +KinkyDungeonRemindJailChaseMummyDefendHonor2,"I won't let you touch her!" +KinkyDungeonRemindJailChaseMummyHonor0,"Nya! Need some help friends?" +KinkyDungeonRemindJailChaseMummyHonor1,"We're in this together!" +KinkyDungeonRemindJailChaseMummyHonor2,"I think you could use some help against this adventurer~" +KinkyDungeonRemindJailChaseMummyCommandDefend,"Let's get them!" +KinkyDungeonRemindJailChaseMummyCommandAssault,"I've caught you!" +KinkyDungeonRemindJailChaseMummyCommandBlock,"Let's play cat and mouse~" + +KinkyDungeonRemindJailCastElemental,"You cannot resist my SPL." +KinkyDungeonRemindJailMiscastElemental,"You merely prolong the inevitable!" +KinkyDungeonRemindJailPlayHelplessElemental0,"This... this can't be..." +KinkyDungeonRemindJailPlayHelplessElemental1,"Release me mortal!" +KinkyDungeonRemindJailPlayHelplessElemental2,"How did you do this!?" KinkyDungeonRemindJailPlayBratElemental0,"Gasp! An adventurer!" KinkyDungeonRemindJailPlayBratElemental1,"Don't let her catch you!" KinkyDungeonRemindJailPlayBratElemental2,"You'll never trap my soul!" @@ -7443,12 +10185,13 @@ KinkyDungeonRemindJailPlayElementalLeash,"Get over here!" KinkyDungeonRemindJailPlayElementalFree,"Humans like you make great toys." KinkyDungeonRemindJailPlayElementalLoot,"That won't help you." KinkyDungeonRemindJailPlayElementalKey,"You won't escape." +KinkyDungeonRemindJailChaseElementalAlert,"I will take you for myself!" KinkyDungeonRemindJailChaseElementalAttack0,"Such feeble attempts." KinkyDungeonRemindJailChaseElementalAttack1,"Humans are fun to play with." KinkyDungeonRemindJailChaseElementalAttack2,"Toying with me? I shall oblige!" -KinkyDungeonRemindJailChaseElementalSpell0,"Cast your last pathetic spell, human." -KinkyDungeonRemindJailChaseElementalSpell1,"Your magic is weak, human." -KinkyDungeonRemindJailChaseElementalSpell2,"It tickles, hehe!" +KinkyDungeonRemindJailChaseElementalSpell0,"Cast your last pathetic spell, mortal." +KinkyDungeonRemindJailChaseElementalSpell1,"Your mere attempt at magic insults me." +KinkyDungeonRemindJailChaseElementalSpell2,"Do you really think that will stop me?" KinkyDungeonRemindJailChaseElementalSpellItem,"Look what humans need to match only a fraction of our power!" KinkyDungeonRemindJailChaseElementalShrine,"Our goddess doesn't need to listen to the likes of you!" KinkyDungeonRemindJailChaseElementalChest,"Keep your hands out of our possessions." @@ -7459,14 +10202,207 @@ KinkyDungeonRemindJailElementalDisarm,"Hah!" KinkyDungeonRemindJailElementalHit,"Get your hands off me!" KinkyDungeonRemindJailElementalHitPlayer,"Pathetic." KinkyDungeonRemindJailElementalMiss,"You're a fast one." +KinkyDungeonRemindJailElementalBlock,"You're a fast one." KinkyDungeonRemindJailElementalMissedMe,"Such feeble attempts." +KinkyDungeonRemindJailElementalBlockedMe,"Such feeble attempts." KinkyDungeonRemindJailElementalLeash,"It's over, human. You've lost." KinkyDungeonRemindJailElementalPull,"There is no escape." KinkyDungeonRemindJailElementalStun,"You are beneath me." KinkyDungeonRemindJailElementalPickpocket,"Nice gear. I'll take it." KinkyDungeonRemindJailElementalLock,"Try getting out of that!" - - +KinkyDungeonRemindJailElementalIntro,"Who am I? You beings may call me PTRN." +KinkyDungeonRemindJailChaseElementalDefend0,"She thinks she can beat us~" +KinkyDungeonRemindJailChaseElementalDefend1,"No one will save you." +KinkyDungeonRemindJailChaseElementalDefend2,"Come and accept your fate." +KinkyDungeonRemindJailChaseElementalDefendHonor0,"An unruly subject. She needs training." +KinkyDungeonRemindJailChaseElementalDefendHonor1,"You should consider your actions and their consequences~" +KinkyDungeonRemindJailChaseElementalDefendHonor2,"Now now, a mortal should know her place!" +KinkyDungeonRemindJailChaseElementalHonor0,"Why don't we turn the tables?" +KinkyDungeonRemindJailChaseElementalHonor1,"It'll be fun seeing you squirm~" +KinkyDungeonRemindJailChaseElementalHonor2,"We are the keepers of balance." +KinkyDungeonRemindJailChaseElementalCommandDefend,"Do not mess with us!" +KinkyDungeonRemindJailChaseElementalCommandAssault,"I shall take you for myself~" +KinkyDungeonRemindJailChaseElementalCommandBlock,"Where do you think you're going?" + +KinkyDungeonRemindJailCastAthena,"You are no match for my SPL!" +KinkyDungeonRemindJailMiscastAthena,"That wasn't supposed to happen." +KinkyDungeonRemindJailPlayHelplessAthena0,"This... this can't be..." +KinkyDungeonRemindJailPlayHelplessAthena1,"Release me mortal!" +KinkyDungeonRemindJailPlayHelplessAthena2,"How did you do this!?" +KinkyDungeonRemindJailPlayBratAthena0,"You won't get me!" +KinkyDungeonRemindJailPlayBratAthena1,"Nice try!" +KinkyDungeonRemindJailPlayBratAthena2,"My grandma is tougher than you!" +KinkyDungeonRemindJailPlaySubAthena0,"Restrain me." +KinkyDungeonRemindJailPlaySubAthena1,"Play with me." +KinkyDungeonRemindJailPlaySubAthena2,"Lock me up." +KinkyDungeonRemindJailPlayAthena0,"This won't work." +KinkyDungeonRemindJailPlayAthena1,"I don't play with young ones." +KinkyDungeonRemindJailPlayAthena2,"Nice try!" +KinkyDungeonRemindJailPlayAthenaStruggle,"Are we having fun?" +KinkyDungeonRemindJailPlayAthenaLeash,"Get over here!" +KinkyDungeonRemindJailPlayAthenaFree,"Oh, a lost toy!" +KinkyDungeonRemindJailPlayAthenaLoot,"That won't help you." +KinkyDungeonRemindJailPlayAthenaKey,"You won't escape." +KinkyDungeonRemindJailChaseAthenaAlert,"I will take you for myself!" +KinkyDungeonRemindJailChaseAthenaAttack0,"Ouch!" +KinkyDungeonRemindJailChaseAthenaAttack1,"I am stronger than that!" +KinkyDungeonRemindJailChaseAthenaAttack2,"That hurts!" +KinkyDungeonRemindJailChaseAthenaSpell0,"Nice party trick!" +KinkyDungeonRemindJailChaseAthenaSpell1,"Oh, shiny!" +KinkyDungeonRemindJailChaseAthenaSpell2,"*sighs*" +KinkyDungeonRemindJailChaseAthenaSpellItem,"Look what humans need to match only a fraction of our power!" +KinkyDungeonRemindJailChaseAthenaShrine,"Our goddess doesn't need to listen to the likes of you!" +KinkyDungeonRemindJailChaseAthenaChest,"Keep your hands out of our possessions." +KinkyDungeonRemindJailChaseAthenaOrb,"Defiler! You will pay for your crimes!" +KinkyDungeonRemindJailChaseAthenaJailbreak,"You won't get away!" +KinkyDungeonRemindJailAthenaGrab,"You can't get away!" +KinkyDungeonRemindJailAthenaDisarm,"You are helpless now!" +KinkyDungeonRemindJailAthenaHit,"Tis but a scratch!" +KinkyDungeonRemindJailAthenaHitPlayer,"Give up!" +KinkyDungeonRemindJailAthenaMiss,"I'll get you next time!" +KinkyDungeonRemindJailAthenaBlock,"You're a fast one." +KinkyDungeonRemindJailAthenaMissedMe,"Nice try!" +KinkyDungeonRemindJailAthenaBlockedMe,"Are you hiding?!" +KinkyDungeonRemindJailAthenaLeash,"You are my pet now!" +KinkyDungeonRemindJailAthenaPull,"There is no escape." +KinkyDungeonRemindJailAthenaStun,"You are beneath me." +KinkyDungeonRemindJailAthenaPickpocket,"Yoink!" +KinkyDungeonRemindJailAthenaLock,"You can't get out now!" +KinkyDungeonRemindJailAthenaIntro,"Who am I? You beings may call me PTRN." +KinkyDungeonRemindJailChaseAthenaDefend0,"She thinks she can beat us~" +KinkyDungeonRemindJailChaseAthenaDefend1,"No one will save you." +KinkyDungeonRemindJailChaseAthenaDefend2,"Come and accept your fate." +KinkyDungeonRemindJailChaseAthenaDefendHonor0,"An unruly subject. She needs training." +KinkyDungeonRemindJailChaseAthenaDefendHonor1,"You should consider your actions and their consequences~" +KinkyDungeonRemindJailChaseAthenaDefendHonor2,"Now now, a mortal should know her place!" +KinkyDungeonRemindJailChaseAthenaHonor0,"Why don't we turn the tables?" +KinkyDungeonRemindJailChaseAthenaHonor1,"It'll be fun seeing you squirm~" +KinkyDungeonRemindJailChaseAthenaHonor2,"We are the keepers of balance." +KinkyDungeonRemindJailChaseAthenaCommandDefend,"Do not mess with us!" +KinkyDungeonRemindJailChaseAthenaCommandAssault,"I shall take you for myself~" +KinkyDungeonRemindJailChaseAthenaCommandBlock,"Where do you think you're going?" + +KinkyDungeonRemindJailCastDragonGirl,"You are no match for my SPL!" +KinkyDungeonRemindJailMiscastDragonGirl,"Ah... my SPL..." +KinkyDungeonRemindJailPlayHelplessDragonGirl0,"I will be free... even if it takes me a thousand years!" +KinkyDungeonRemindJailPlayHelplessDragonGirl1,"Release me you pathetic creature!" +KinkyDungeonRemindJailPlayHelplessDragonGirl2,"I will not be contained!" +KinkyDungeonRemindJailPlayBratDragonGirl0,"Oh no, whatever shall I do!" +KinkyDungeonRemindJailPlayBratDragonGirl1,"I will be back, mortal!" +KinkyDungeonRemindJailPlayBratDragonGirl2,"You will never trap me!" +KinkyDungeonRemindJailPlaySubDragonGirl0,"I yearn for a challenging puzzle!" +KinkyDungeonRemindJailPlaySubDragonGirl1,"Show me your strongest restraints!" +KinkyDungeonRemindJailPlaySubDragonGirl2,"I could probably escape anything." +KinkyDungeonRemindJailPlayDragonGirl0,"Come here my plaything~" +KinkyDungeonRemindJailPlayDragonGirl1,"Mortals are my favorite toy." +KinkyDungeonRemindJailPlayDragonGirl2,"It's more fun when you resist!" +KinkyDungeonRemindJailPlayDragonGirlStruggle,"Know your place, mortal~" +KinkyDungeonRemindJailPlayDragonGirlLeash,"I will bring you to my lair~" +KinkyDungeonRemindJailPlayDragonGirlFree,"Mortals shouldn't have too much freedom~" +KinkyDungeonRemindJailPlayDragonGirlLoot,"Mortals should keep their hands to themselves~" +KinkyDungeonRemindJailPlayDragonGirlKey,"You won't escape." +KinkyDungeonRemindJailChaseDragonGirlAlert,"Yes, yes, run away!" +KinkyDungeonRemindJailChaseDragonGirlAttack0,"I like your fighting spirit!" +KinkyDungeonRemindJailChaseDragonGirlAttack1,"You may be weak, but this is quite entertaining~" +KinkyDungeonRemindJailChaseDragonGirlAttack2,"Face my wrath!" +KinkyDungeonRemindJailChaseDragonGirlSpell0,"Dragons are the true heirs of magic." +KinkyDungeonRemindJailChaseDragonGirlSpell1,"Your magic was stolen from us!" +KinkyDungeonRemindJailChaseDragonGirlSpell2,"This world is ours! OURS!" +KinkyDungeonRemindJailChaseDragonGirlSpellItem,"Look what you need to match only a fraction of my power!" +KinkyDungeonRemindJailChaseDragonGirlShrine,"My treasure!" +KinkyDungeonRemindJailChaseDragonGirlChest,"My treasure!" +KinkyDungeonRemindJailChaseDragonGirlOrb,"My treasure!" +KinkyDungeonRemindJailChaseDragonGirlJailbreak,"Now is my opportunity! I will have you for myself~" +KinkyDungeonRemindJailDragonGirlGrab,"You're staying right here..." +KinkyDungeonRemindJailDragonGirlDisarm,"Hah!" +KinkyDungeonRemindJailDragonGirlHit,"Get your hands off me!" +KinkyDungeonRemindJailDragonGirlHitPlayer,"Pathetic." +KinkyDungeonRemindJailDragonGirlMiss,"You're a fast one." +KinkyDungeonRemindJailDragonGirlBlock,"You're a fast one." +KinkyDungeonRemindJailDragonGirlMissedMe,"So weak!" +KinkyDungeonRemindJailDragonGirlBlockedMe,"So weak!" +KinkyDungeonRemindJailDragonGirlLeash,"I have you now~" +KinkyDungeonRemindJailDragonGirlPull,"Not so fast~" +KinkyDungeonRemindJailDragonGirlStun,"Can't handle it?" +KinkyDungeonRemindJailDragonGirlPickpocket,"Ooh shiny!" +KinkyDungeonRemindJailDragonGirlLock,"Now you're mine!" +KinkyDungeonRemindJailDragonGirlIntro,"Bow before me, for I am PTRN!" +KinkyDungeonRemindJailChaseDragonGirlDefend0,"A mortal can't stop us!" +KinkyDungeonRemindJailChaseDragonGirlDefend1,"No one will save you, mortal." +KinkyDungeonRemindJailChaseDragonGirlDefend2,"I will stop her!" +KinkyDungeonRemindJailChaseDragonGirlDefendHonor0,"Bow down before our might!" +KinkyDungeonRemindJailChaseDragonGirlDefendHonor1,"Dragons are the true rulers of this world!" +KinkyDungeonRemindJailChaseDragonGirlDefendHonor2,"We were destined for greatness until you came along!" +KinkyDungeonRemindJailChaseDragonGirlHonor0,"Why don't we turn the tables?" +KinkyDungeonRemindJailChaseDragonGirlHonor1,"It'll be fun seeing you squirm~" +KinkyDungeonRemindJailChaseDragonGirlHonor2,"We are the the true heirs of magic!" +KinkyDungeonRemindJailChaseDragonGirlCommandDefend,"Hehe~" +KinkyDungeonRemindJailChaseDragonGirlCommandAssault,"Rawr!" +KinkyDungeonRemindJailChaseDragonGirlCommandBlock,"*chuckles*" + +KinkyDungeonRemindJailCastAngel,"By the power of SPL!" +KinkyDungeonRemindJailMiscastAngel,"I have failed!" +KinkyDungeonRemindJailPlayHelplessAngel0,"This... this can't be..." +KinkyDungeonRemindJailPlayHelplessAngel1,"Release me mortal!" +KinkyDungeonRemindJailPlayHelplessAngel2,"How did you do this!?" +KinkyDungeonRemindJailPlayBratAngel0,"Oh no, it's an adventurer!" +KinkyDungeonRemindJailPlayBratAngel1,"They've come for me!" +KinkyDungeonRemindJailPlayBratAngel2,"It wasn't my fault!" +KinkyDungeonRemindJailPlaySubAngel0,"Ready for service!" +KinkyDungeonRemindJailPlaySubAngel1,"I was sent here to... accompany you, yes!" +KinkyDungeonRemindJailPlaySubAngel2,"How may I assist you?" +KinkyDungeonRemindJailPlayAngel0,"Do my eyes deceive me, or do I see a sinner?" +KinkyDungeonRemindJailPlayAngel1,"My job is to punish mortals~" +KinkyDungeonRemindJailPlayAngel2,"Would you hold still? I need to... check something~" +KinkyDungeonRemindJailPlayAngelStruggle,"Are we having fun?" +KinkyDungeonRemindJailPlayAngelLeash,"Get over here!" +KinkyDungeonRemindJailPlayAngelFree,"Humans like you make great toys." +KinkyDungeonRemindJailPlayAngelLoot,"That won't help you." +KinkyDungeonRemindJailPlayAngelKey,"You won't escape." +KinkyDungeonRemindJailChaseAngelAlert,"I will take you for myself!" +KinkyDungeonRemindJailChaseAngelAttack0,"Such feeble attempts." +KinkyDungeonRemindJailChaseAngelAttack1,"Humans are fun to play with." +KinkyDungeonRemindJailChaseAngelAttack2,"Toying with me? I shall oblige!" +KinkyDungeonRemindJailChaseAngelSpell0,"Cast your last pathetic spell, human." +KinkyDungeonRemindJailChaseAngelSpell1,"Your magic is weak, human." +KinkyDungeonRemindJailChaseAngelSpell2,"It tickles, hehe!" +KinkyDungeonRemindJailChaseAngelSpellItem,"Look what humans need to match only a fraction of our power!" +KinkyDungeonRemindJailChaseAngelShrine,"Our goddess doesn't need to listen to the likes of you!" +KinkyDungeonRemindJailChaseAngelChest,"Keep your hands out of our possessions." +KinkyDungeonRemindJailChaseAngelOrb,"Defiler! You will pay for your crimes!" +KinkyDungeonRemindJailChaseAngelJailbreak,"A game of chase? Fun." +KinkyDungeonRemindJailAngelGrab,"You're staying right here..." +KinkyDungeonRemindJailAngelDisarm,"Hah!" +KinkyDungeonRemindJailAngelHit,"Get your hands off me!" +KinkyDungeonRemindJailAngelHitPlayer,"Pathetic." +KinkyDungeonRemindJailAngelMiss,"You're a fast one." +KinkyDungeonRemindJailAngelBlock,"You're a fast one." +KinkyDungeonRemindJailAngelMissedMe,"Such feeble attempts." +KinkyDungeonRemindJailAngelBlockedMe,"Such feeble attempts." +KinkyDungeonRemindJailAngelLeash,"It's over, human. You've lost." +KinkyDungeonRemindJailAngelPull,"There is no escape." +KinkyDungeonRemindJailAngelStun,"You are beneath me." +KinkyDungeonRemindJailAngelPickpocket,"Nice gear. I'll take it." +KinkyDungeonRemindJailAngelLock,"Try getting out of that!" +KinkyDungeonRemindJailAngelIntro,"Who am I? You beings may call me PTRN." +KinkyDungeonRemindJailChaseAngelDefend0,"She thinks she can beat us~" +KinkyDungeonRemindJailChaseAngelDefend1,"No one will save you." +KinkyDungeonRemindJailChaseAngelDefend2,"Come and accept your fate." +KinkyDungeonRemindJailChaseAngelDefendHonor0,"An unruly subject. She needs training." +KinkyDungeonRemindJailChaseAngelDefendHonor1,"You should consider your actions and their consequences~" +KinkyDungeonRemindJailChaseAngelDefendHonor2,"Now now, a mortal should know her place!" +KinkyDungeonRemindJailChaseAngelHonor0,"Why don't we turn the tables?" +KinkyDungeonRemindJailChaseAngelHonor1,"It'll be fun seeing you squirm~" +KinkyDungeonRemindJailChaseAngelHonor2,"We are the keepers of balance." +KinkyDungeonRemindJailChaseAngelCommandDefend,"Do not mess with us!" +KinkyDungeonRemindJailChaseAngelCommandAssault,"I shall take you for myself~" +KinkyDungeonRemindJailChaseAngelCommandBlock,"Where do you think you're going?" + +KinkyDungeonRemindJailCastDomMaid,"Let's see you face my SPL~" +KinkyDungeonRemindJailMiscastDomMaid,"You won't escape my SPL that easily!" +KinkyDungeonRemindJailPlayHelplessDomMaid0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessDomMaid1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessDomMaid2,"I can't get free!" KinkyDungeonRemindJailPlayBratDomMaid0,"Not the edging training! Anything but that!" KinkyDungeonRemindJailPlayBratDomMaid1,"Forgive me!" KinkyDungeonRemindJailPlayBratDomMaid2,"No! Don't punish me!" @@ -7481,6 +10417,7 @@ KinkyDungeonRemindJailPlayDomMaidLeash,"It's time for your training." KinkyDungeonRemindJailPlayDomMaidFree,"You need to be taught some manners, maid." KinkyDungeonRemindJailPlayDomMaidLoot,"Good girl. I'll take that to the storage room." KinkyDungeonRemindJailPlayDomMaidKey,"I'll be taking those." +KinkyDungeonRemindJailChaseDomMaidAlert,"Who the hell are you?" KinkyDungeonRemindJailChaseDomMaidAttack0,"Oh, you're approaching me?" KinkyDungeonRemindJailChaseDomMaidAttack1,"You've gotten yourself into a big mess." KinkyDungeonRemindJailChaseDomMaidAttack2,"You're going to regret that." @@ -7497,14 +10434,33 @@ KinkyDungeonRemindJailDomMaidDisarm,"Your tricks won't work on me." KinkyDungeonRemindJailDomMaidHit,"Oof... You got me." KinkyDungeonRemindJailDomMaidHitPlayer,"It's over." KinkyDungeonRemindJailDomMaidMiss,"Nice one." +KinkyDungeonRemindJailDomMaidBlock,"Nice one." KinkyDungeonRemindJailDomMaidMissedMe,"You missed!" +KinkyDungeonRemindJailDomMaidBlockedMe,"You missed!" KinkyDungeonRemindJailDomMaidLeash,"I'll hand you over when I'm done with you." KinkyDungeonRemindJailDomMaidPull,"Get over here!" KinkyDungeonRemindJailDomMaidStun,"Hmph. Stay down." KinkyDungeonRemindJailDomMaidPickpocket,"Give me that." KinkyDungeonRemindJailDomMaidLock,"'Click!'" - - +KinkyDungeonRemindJailDomMaidIntro,"Mistress PTRN, reporting for duty." +KinkyDungeonRemindJailChaseDomMaidDefend0,"No time to waste." +KinkyDungeonRemindJailChaseDomMaidDefend1,"Looks like the reports are correct. Stop her!" +KinkyDungeonRemindJailChaseDomMaidDefend2,"Moving in to assist." +KinkyDungeonRemindJailChaseDomMaidDefendHonor0,"You need to be taught a lesson, adventurer." +KinkyDungeonRemindJailChaseDomMaidDefendHonor1,"We have a mutual protection contract. Suffice to say, you've violated it." +KinkyDungeonRemindJailChaseDomMaidDefendHonor2,"We defend our partners, unlike some people." +KinkyDungeonRemindJailChaseDomMaidHonor0,"Target sighted. Taking her down." +KinkyDungeonRemindJailChaseDomMaidHonor1,"Our influence is everywhere~" +KinkyDungeonRemindJailChaseDomMaidHonor2,"We have orders to stop you!" +KinkyDungeonRemindJailChaseDomMaidCommandDefend,"Moving to assist!" +KinkyDungeonRemindJailChaseDomMaidCommandAssault,"You really think you're special, huh?" +KinkyDungeonRemindJailChaseDomMaidCommandBlock,"Combat formation bravo." + +KinkyDungeonRemindJailCastSubMaid,"Deploying SPL!" +KinkyDungeonRemindJailMiscastSubMaid,"Ah! Forgive me!" +KinkyDungeonRemindJailPlayHelplessSubMaid0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessSubMaid1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessSubMaid2,"I can't get free!" KinkyDungeonRemindJailPlayBratSubMaid0,"I'm sorry! I didn't mean to break that vase!" KinkyDungeonRemindJailPlayBratSubMaid1,"I won't do it again, I swear!" KinkyDungeonRemindJailPlayBratSubMaid2,"Please no! I don't want the edging training again!" @@ -7519,6 +10475,7 @@ KinkyDungeonRemindJailPlaySubMaidLeash,"M-miss... I was told to bring you somewh KinkyDungeonRemindJailPlaySubMaidFree,"Umm, miss, you're supposed to report to the head maid..." KinkyDungeonRemindJailPlaySubMaidLoot,"Thanks for picking up." KinkyDungeonRemindJailPlaySubMaidKey,"I'll take those to the head maid!" +KinkyDungeonRemindJailChaseSubMaidAlert,"Someone help!" KinkyDungeonRemindJailChaseSubMaidAttack0,"Who are you!?" KinkyDungeonRemindJailChaseSubMaidAttack1,"Oh no!" KinkyDungeonRemindJailChaseSubMaidAttack2,"Stop!" @@ -7535,14 +10492,91 @@ KinkyDungeonRemindJailSubMaidDisarm,"Try that again!" KinkyDungeonRemindJailSubMaidHit,"Remember your training, remember your training..." KinkyDungeonRemindJailSubMaidHitPlayer,"You're filthy!" KinkyDungeonRemindJailSubMaidMiss,"Hold still..." +KinkyDungeonRemindJailSubMaidBlock,"Hold still..." KinkyDungeonRemindJailSubMaidMissedMe,"Stay calm..." +KinkyDungeonRemindJailSubMaidBlockedMe,"Stay calm..." KinkyDungeonRemindJailSubMaidLeash,"I'll lead you to your cell..." KinkyDungeonRemindJailSubMaidPull,"Come on!" KinkyDungeonRemindJailSubMaidStun,"Got you!" KinkyDungeonRemindJailSubMaidPickpocket,"I need to take this..." KinkyDungeonRemindJailSubMaidLock,"I'm sorry..." - - +KinkyDungeonRemindJailSubMaidIntro,"*Salutes* PTRN reporting for service!" +KinkyDungeonRemindJailChaseSubMaidDefend0,"I'll help!" +KinkyDungeonRemindJailChaseSubMaidDefend1,"Stop her!" +KinkyDungeonRemindJailChaseSubMaidDefend2,"Please be gentle!" +KinkyDungeonRemindJailChaseSubMaidDefendHonor0,"Ahhh! Stop it!" +KinkyDungeonRemindJailChaseSubMaidDefendHonor1,"Don't touch her!" +KinkyDungeonRemindJailChaseSubMaidDefendHonor2,"Wait, you can't do that!" +KinkyDungeonRemindJailChaseSubMaidHonor0,"Me? Help? Right!" +KinkyDungeonRemindJailChaseSubMaidHonor1,"I'm sorry miss..." +KinkyDungeonRemindJailChaseSubMaidHonor2,"I was ordered to capture you... please don't resist." +KinkyDungeonRemindJailChaseSubMaidCommandDefend,"I-I'm coming!" +KinkyDungeonRemindJailChaseSubMaidCommandAssault,"Please surrender, miss!" +KinkyDungeonRemindJailChaseSubMaidCommandBlock,"I'll just stay here!" + +KinkyDungeonRemindJailCastGunnerMaid,"Loading SPL!" +KinkyDungeonRemindJailMiscastGunnerMaid,"Blast... this thing always jams." +KinkyDungeonRemindJailPlayHelplessGunnerMaid0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessGunnerMaid1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessGunnerMaid2,"I can't get free!" +KinkyDungeonRemindJailPlayBratGunnerMaid0,"That thing... it scares me." +KinkyDungeonRemindJailPlayBratGunnerMaid1,"I won't do it again, I swear!" +KinkyDungeonRemindJailPlayBratGunnerMaid2,"Please no! I don't want the pleasure training again!" +KinkyDungeonRemindJailPlaySubGunnerMaid0,"Don't you need a bodyguard, miss?" +KinkyDungeonRemindJailPlaySubGunnerMaid1,"Won't you train me, miss?" +KinkyDungeonRemindJailPlaySubGunnerMaid2,"I've been a bad girl..." +KinkyDungeonRemindJailPlayGunnerMaid0,"Miss, your uniform is dirty..." +KinkyDungeonRemindJailPlayGunnerMaid1,"Why hello miss..." +KinkyDungeonRemindJailPlayGunnerMaid2,"Let me fix your outfit..." +KinkyDungeonRemindJailPlayGunnerMaidStruggle,"Hmm, do I need to tighten those?" +KinkyDungeonRemindJailPlayGunnerMaidLeash,"M-miss... I was told to bring you somewhere..." +KinkyDungeonRemindJailPlayGunnerMaidFree,"Umm, miss, you're supposed to report to the head maid..." +KinkyDungeonRemindJailPlayGunnerMaidLoot,"Thanks for picking up." +KinkyDungeonRemindJailPlayGunnerMaidKey,"I'll take those to the head maid!" +KinkyDungeonRemindJailChaseGunnerMaidAlert,"Say hello to my little friend!" +KinkyDungeonRemindJailChaseGunnerMaidAttack0,"This is where I'd apply my melee training... if I had any!" +KinkyDungeonRemindJailChaseGunnerMaidAttack1,"Oh no!" +KinkyDungeonRemindJailChaseGunnerMaidAttack2,"Step back a bit, this isn't fair!" +KinkyDungeonRemindJailChaseGunnerMaidSpell0,"Oh yeah? Two can play at that game!" +KinkyDungeonRemindJailChaseGunnerMaidSpell1,"Don't bring magic to a gunfight!" +KinkyDungeonRemindJailChaseGunnerMaidSpell2,"Didn't think this through, did you?" +KinkyDungeonRemindJailChaseGunnerMaidSpellItem,"Grenade!!!" +KinkyDungeonRemindJailChaseGunnerMaidShrine,"Miss, that's reserved for the head maid!" +KinkyDungeonRemindJailChaseGunnerMaidChest,"Thief! I'm reporting this!" +KinkyDungeonRemindJailChaseGunnerMaidOrb,"Oh no! I have to report this!" +KinkyDungeonRemindJailChaseGunnerMaidJailbreak,"Oh no!" +KinkyDungeonRemindJailGunnerMaidGrab,"I got you! I got you!" +KinkyDungeonRemindJailGunnerMaidDisarm,"Try that again!" +KinkyDungeonRemindJailGunnerMaidHit,"What's this 'melee' you speak of?" +KinkyDungeonRemindJailGunnerMaidHitPlayer,"Got you!" +KinkyDungeonRemindJailGunnerMaidMiss,"What terrible aim!" +KinkyDungeonRemindJailGunnerMaidBlock,"I am bulletproof!" +KinkyDungeonRemindJailGunnerMaidMissedMe,"Stay calm..." +KinkyDungeonRemindJailGunnerMaidBlockedMe,"Stay calm..." +KinkyDungeonRemindJailGunnerMaidLeash,"I'll lead you to your cell..." +KinkyDungeonRemindJailGunnerMaidPull,"Come on!" +KinkyDungeonRemindJailGunnerMaidStun,"Got you!" +KinkyDungeonRemindJailGunnerMaidPickpocket,"I need to take this..." +KinkyDungeonRemindJailGunnerMaidLock,"I'm sorry..." +KinkyDungeonRemindJailGunnerMaidIntro,"Marksman PTRN reporting for service!" +KinkyDungeonRemindJailChaseGunnerMaidDefend0,"I'll help!" +KinkyDungeonRemindJailChaseGunnerMaidDefend1,"Opening fire!" +KinkyDungeonRemindJailChaseGunnerMaidDefend2,"I'll cover you!" +KinkyDungeonRemindJailChaseGunnerMaidDefendHonor0,"Ahhh! Stop it!" +KinkyDungeonRemindJailChaseGunnerMaidDefendHonor1,"Don't touch her!" +KinkyDungeonRemindJailChaseGunnerMaidDefendHonor2,"Wait, you can't do that!" +KinkyDungeonRemindJailChaseGunnerMaidHonor0,"Me? Help? Right!" +KinkyDungeonRemindJailChaseGunnerMaidHonor1,"I'm sorry miss..." +KinkyDungeonRemindJailChaseGunnerMaidHonor2,"I was ordered to capture you... please don't resist." +KinkyDungeonRemindJailChaseGunnerMaidCommandDefend,"Providing cover fire!" +KinkyDungeonRemindJailChaseGunnerMaidCommandAssault,"Cover me, I'm going in!" +KinkyDungeonRemindJailChaseGunnerMaidCommandBlock,"Commence overwatch!" + +KinkyDungeonRemindJailCastHeadMaid,"Submit to my SPL." +KinkyDungeonRemindJailMiscastHeadMaid,"Ack! How inelegant!" +KinkyDungeonRemindJailPlayHelplessHeadMaid0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessHeadMaid1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessHeadMaid2,"I can't get free!" KinkyDungeonRemindJailPlayBratHeadMaid0,"I'll be heading out..." KinkyDungeonRemindJailPlayBratHeadMaid1,"Looks like I'll be taking my leave." KinkyDungeonRemindJailPlayBratHeadMaid2,"Looks like I'll be reporting you~" @@ -7557,6 +10591,7 @@ KinkyDungeonRemindJailPlayHeadMaidLeash,"Come with me. I will train you personal KinkyDungeonRemindJailPlayHeadMaidFree,"You need to work on your ladylike manners." KinkyDungeonRemindJailPlayHeadMaidLoot,"Good girl, finding lost items." KinkyDungeonRemindJailPlayHeadMaidKey,"I do not give you permmission to leave." +KinkyDungeonRemindJailChaseHeadMaidAlert,"Seems I will have to get my hands dirty." KinkyDungeonRemindJailChaseHeadMaidAttack0,"Do you know who I am?" KinkyDungeonRemindJailChaseHeadMaidAttack1,"You need to learn some manners!" KinkyDungeonRemindJailChaseHeadMaidAttack2,"How rude!" @@ -7573,13 +10608,33 @@ KinkyDungeonRemindJailHeadMaidDisarm,"Like a novice." KinkyDungeonRemindJailHeadMaidHit,"...Nice one." KinkyDungeonRemindJailHeadMaidHitPlayer,"Enjoy yourself, dear~" KinkyDungeonRemindJailHeadMaidMiss,"Hmph. Nice." +KinkyDungeonRemindJailHeadMaidBlock,"Hmph. Nice." KinkyDungeonRemindJailHeadMaidMissedMe,"Not even close." +KinkyDungeonRemindJailHeadMaidBlockedMe,"Not even close." KinkyDungeonRemindJailHeadMaidLeash,"I'll be taking you to your cell personally~" KinkyDungeonRemindJailHeadMaidPull,"Amateur." KinkyDungeonRemindJailHeadMaidStun,"Bad girl. You need discipline." KinkyDungeonRemindJailHeadMaidPickpocket,"Hand it over." KinkyDungeonRemindJailHeadMaidLock,"I'll be keeping the keys." - +KinkyDungeonRemindJailHeadMaidIntro,"Hmm. You may call me Head Maid PTRN." +KinkyDungeonRemindJailChaseHeadMaidDefend0,"Looks like we have a guest." +KinkyDungeonRemindJailChaseHeadMaidDefend1,"I'll be gentle, I promise~" +KinkyDungeonRemindJailChaseHeadMaidDefend2,"Know your place, dear~" +KinkyDungeonRemindJailChaseHeadMaidDefendHonor0,"Good girls keep their hands to themselves." +KinkyDungeonRemindJailChaseHeadMaidDefendHonor1,"You broke the rules, now you'll face the consequences." +KinkyDungeonRemindJailChaseHeadMaidDefendHonor2,"Hands off our partners." +KinkyDungeonRemindJailChaseHeadMaidHonor0,"Looks like you've made a few enemies along the way." +KinkyDungeonRemindJailChaseHeadMaidHonor1,"I won't let you interrupt our plans." +KinkyDungeonRemindJailChaseHeadMaidHonor2,"Excuse me, we were holding a meeting~" +KinkyDungeonRemindJailChaseHeadMaidCommandDefend,"Don't get ahead of yourself." +KinkyDungeonRemindJailChaseHeadMaidCommandAssault,"I'll do this myself." +KinkyDungeonRemindJailChaseHeadMaidCommandBlock,"I'll support from the rear." + +KinkyDungeonRemindJailCastWitch,"I cast SPL!" +KinkyDungeonRemindJailMiscastWitch,"Whoops! That wasn't supposed to happen..." +KinkyDungeonRemindJailPlayHelplessWitch0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessWitch1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessWitch2,"I can't get free!" KinkyDungeonRemindJailPlayBratWitch0,"Looks like I've earned some punishment..." KinkyDungeonRemindJailPlayBratWitch1,"I'll turn you into a newt! If you don't stop me..." KinkyDungeonRemindJailPlayBratWitch2,"Don't let me get away~" @@ -7594,29 +10649,110 @@ KinkyDungeonRemindJailPlayWitchLeash,"I'm going to have so much fun with you!" KinkyDungeonRemindJailPlayWitchFree,"Look at you, pretty and free!" KinkyDungeonRemindJailPlayWitchLoot,"Must have misplaced it..." KinkyDungeonRemindJailPlayWitchKey,"Those are mine!" +KinkyDungeonRemindJailChaseWitchAlert,"Well well, what do we have here?" KinkyDungeonRemindJailChaseWitchAttack0,"That's not very nice!" KinkyDungeonRemindJailChaseWitchAttack1,"Curse you!" KinkyDungeonRemindJailChaseWitchAttack2,"I'll turn you into a newt!" KinkyDungeonRemindJailChaseWitchSpell0,"Oh, so you've got a spellbook. What's it written in, curse-ive?" KinkyDungeonRemindJailChaseWitchSpell1,"Snap, crackle, and pop!" KinkyDungeonRemindJailChaseWitchSpell2,"Looks like I need to seal that foul mouth of yours." -KinkyDungeonRemindJailChaseWitchSpellItem,"I recognize that thing you're holding!" +KinkyDungeonRemindJailChaseWitchSpellItem,"Put that toy away~" KinkyDungeonRemindJailChaseWitchShrine,"You'll be praying for freedom soon, my dear~" KinkyDungeonRemindJailChaseWitchChest,"Oh, breaking into my collection, are you?" KinkyDungeonRemindJailChaseWitchOrb,"Even I wouldn't do such a thing!" -KinkyDungeonRemindJailChaseWitchJailbreak,"Witch way to the jail cell, you say?" +KinkyDungeonRemindJailChaseWitchJailbreak,"Witch way to the jail, you say?" KinkyDungeonRemindJailWitchGrab,"Hold still~" KinkyDungeonRemindJailWitchDisarm,"Try that again!" KinkyDungeonRemindJailWitchHit,"Hands off!" KinkyDungeonRemindJailWitchHitPlayer,"Now I got you." KinkyDungeonRemindJailWitchMiss,"Hmph." +KinkyDungeonRemindJailWitchBlock,"Hmph." KinkyDungeonRemindJailWitchMissedMe,"You've got a lot to learn~" +KinkyDungeonRemindJailWitchBlockedMe,"You've got a lot to learn~" KinkyDungeonRemindJailWitchLeash,"You'll be coming with me!" KinkyDungeonRemindJailWitchPull,"I'll be yanking your chain~" KinkyDungeonRemindJailWitchStun,"Not so fast~" KinkyDungeonRemindJailWitchPickpocket,"I'll be taking this~" -KinkyDungeonRemindJailWitchLock,"EnemyName:There, nice and tight dear~" - +KinkyDungeonRemindJailWitchLock,"There, nice and tight dear~" +KinkyDungeonRemindJailWitchIntro,"I am the great witch PTRN!" +KDConjurerFrogDied_Witch,"Noooo Fred! *grumble* you'll pay for this!" +KinkyDungeonRemindJailChaseWitchDefend0,"Where is that apprentice when you need her..." +KinkyDungeonRemindJailChaseWitchDefend1,"I don't have time for this." +KinkyDungeonRemindJailChaseWitchDefend2,"Be still, worm." +KinkyDungeonRemindJailChaseWitchDefendHonor0,"Hands off~!" +KinkyDungeonRemindJailChaseWitchDefendHonor1,"Would you like a taste?" +KinkyDungeonRemindJailChaseWitchDefendHonor2,"Looks like I've found my test subject~" +KinkyDungeonRemindJailChaseWitchHonor0,"Another test subject!" +KinkyDungeonRemindJailChaseWitchHonor1,"I want her!" +KinkyDungeonRemindJailChaseWitchHonor2,"She's a cute one!" +KinkyDungeonRemindJailChaseWitchCommandDefend,"Oh no you don't?" +KinkyDungeonRemindJailChaseWitchCommandAssault,"I'll make you my pet!" +KinkyDungeonRemindJailChaseWitchCommandBlock,"Tsk tsk, you won't get away!" + +KinkyDungeonRemindJailCastSelly,"I cast SPL!" +KinkyDungeonRemindJailMiscastSelly,"I cast SPL! No, wait..." +KinkyDungeonRemindJailPlayHelplessSelly0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessSelly1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessSelly2,"I can't get free!" +KinkyDungeonRemindJailPlayBratSelly0,"Looks like I've earned some punishment..." +KinkyDungeonRemindJailPlayBratSelly1,"I'll turn you into a newt! If you don't stop me..." +KinkyDungeonRemindJailPlayBratSelly2,"Don't let me get away~" +KinkyDungeonRemindJailPlaySubSelly0,"Perhaps you're not so bad after all~" +KinkyDungeonRemindJailPlaySubSelly1,"Why don't you have a little fun... with me?" +KinkyDungeonRemindJailPlaySubSelly2,"Come and get me..." +KinkyDungeonRemindJailPlaySelly0,"You're just too cute... let me play with you a bit!" +KinkyDungeonRemindJailPlaySelly1,"Come, come closer! I'll be gentle~" +KinkyDungeonRemindJailPlaySelly2,"Ooh, you just HAVE to be mine!" +KinkyDungeonRemindJailPlaySellyStruggle,"Having fun, little lady?" +KinkyDungeonRemindJailPlaySellyLeash,"Come, come!... no, not like that. Well, MAYBE like that." +KinkyDungeonRemindJailPlaySellyFree,"Look at you, pretty and free!" +KinkyDungeonRemindJailPlaySellyLoot,"Must have misplaced it..." +KinkyDungeonRemindJailPlaySellyKey,"Those are mine!" +KinkyDungeonRemindJailChaseSellyAlert,"My GOODNESS, you're adorable!... c'mere~!" +KinkyDungeonRemindJailChaseSellyAttack0,"That's not very nice!" +KinkyDungeonRemindJailChaseSellyAttack1,"You wouldn't happen to be... ticklish?" +KinkyDungeonRemindJailChaseSellyAttack2,"Hold still! I promise it'll be fun." +KinkyDungeonRemindJailChaseSellySpell0,"Too much chanting, not enough giggling... let's fix that!" +KinkyDungeonRemindJailChaseSellySpell1,"What's that? 'Gag me, please'? Gladly!" +KinkyDungeonRemindJailChaseSellySpell2,"A cute captive AND a spellbook to study? Is it Christmas already?!" +KinkyDungeonRemindJailChaseSellySpellItem,"Put that toy away~" +KinkyDungeonRemindJailChaseSellyShrine,"He~ey, that was mine!" +KinkyDungeonRemindJailChaseSellyChest,"He~ey, that was mine!" +KinkyDungeonRemindJailChaseSellyOrb,"He~ey, that was mine!" +KinkyDungeonRemindJailChaseSellyJailbreak,"Going somewhere, are we?" +KinkyDungeonRemindJailSellyGrab,"No, I like you right where you are." +KinkyDungeonRemindJailSellyDisarm,"Try that again!" +KinkyDungeonRemindJailSellyHit,"Hands off!" +KinkyDungeonRemindJailSellyHitPlayer,"Goodness, look at you squirm..." +KinkyDungeonRemindJailSellyMiss,"Oh!... my, you're slippery!" +KinkyDungeonRemindJailSellyBlock,"Oh!... my, you're slippery!" +KinkyDungeonRemindJailSellyMissedMe,"Not close enough!" +KinkyDungeonRemindJailSellyBlockedMe,"Not close enough!" +KinkyDungeonRemindJailSellyLeash,"Come, come!... no, not like that. Well, MAYBE like that." +KinkyDungeonRemindJailSellyPull,"I'll be yanking your chain~" +KinkyDungeonRemindJailSellyStun,"Not so fast~" +KinkyDungeonRemindJailSellyPickpocket,"I'll be taking this~" +KinkyDungeonRemindJailSellyLock,"My, my, you look too cute in that..." +KinkyDungeonRemindJailSellyIntro,"I am Stela. But to you, sweetie? Call me Mistress." +KDConjurerFrogDied_Selly,"My FROG!... suppose I need a new familiar... *eyes you with interest*" +KinkyDungeonRemindJailChaseSellyDefend0,"Come closer, I'll be gentle~" +KinkyDungeonRemindJailChaseSellyDefend1,"Come, come!... no, not like that. Well, MAYBE like that." +KinkyDungeonRemindJailChaseSellyDefend2,"Hold still! I promise it'll be fun." +KinkyDungeonRemindJailChaseSellyDefendHonor0,"Having fun, little lady?" +KinkyDungeonRemindJailChaseSellyDefendHonor1,"Ooh, you just HAVE to be mine!" +KinkyDungeonRemindJailChaseSellyDefendHonor2,"Why don't we have a little talk~" +KinkyDungeonRemindJailChaseSellyHonor0,"My, my, you look too cute..." +KinkyDungeonRemindJailChaseSellyHonor1,"I like you. I'll save you a spot at home~" +KinkyDungeonRemindJailChaseSellyHonor2,"Going somewhere, are we?" +KinkyDungeonRemindJailChaseSellyCommandDefend,"Not so fast~" +KinkyDungeonRemindJailChaseSellyCommandAssault,"Why don't we have a little talk~" +KinkyDungeonRemindJailChaseSellyCommandBlock,"Going somewhere, are we?" + +KinkyDungeonRemindJailCastApprentice,"I cast, umm, SPL!" +KinkyDungeonRemindJailMiscastApprentice,"I cast Silence! No, wait--" +KinkyDungeonRemindJailPlayHelplessApprentice0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessApprentice1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessApprentice2,"I can't get free!" KinkyDungeonRemindJailPlayBratApprentice0,"I promise I'll be back later!" KinkyDungeonRemindJailPlayBratApprentice1,"I didn't do anything wrong!" KinkyDungeonRemindJailPlayBratApprentice2,"I won't get in your way, miss!" @@ -7631,6 +10767,7 @@ KinkyDungeonRemindJailPlayApprenticeLeash,"Miss, won't you come?" KinkyDungeonRemindJailPlayApprenticeFree,"Hey, you're free to play, right~?" KinkyDungeonRemindJailPlayApprenticeLoot,"Hey, uh, give that back... (blushes)" KinkyDungeonRemindJailPlayApprenticeKey,"Um, you have to return those!" +KinkyDungeonRemindJailChaseApprenticeAlert,"Um! You're not supposed to be here!" KinkyDungeonRemindJailChaseApprenticeAttack0,"Eeep!" KinkyDungeonRemindJailChaseApprenticeAttack1,"Help me!" KinkyDungeonRemindJailChaseApprenticeAttack2,"Somebody help!" @@ -7647,13 +10784,33 @@ KinkyDungeonRemindJailApprenticeDisarm,"I got it!" KinkyDungeonRemindJailApprenticeHit,"Be gentle, please!" KinkyDungeonRemindJailApprenticeHitPlayer,"I did it!" KinkyDungeonRemindJailApprenticeMiss,"Hey, no fair!" +KinkyDungeonRemindJailApprenticeBlock,"Hey, no fair!" KinkyDungeonRemindJailApprenticeMissedMe,"Close one!" +KinkyDungeonRemindJailApprenticeBlockedMe,"Close one!" KinkyDungeonRemindJailApprenticeLeash,"Come along~" KinkyDungeonRemindJailApprenticePull,"Come here please!" KinkyDungeonRemindJailApprenticeStun,"Hah! I'm a genius!" KinkyDungeonRemindJailApprenticePickpocket,"I need to take this..." KinkyDungeonRemindJailApprenticeLock,"I'm sorry about this..." - +KinkyDungeonRemindJailApprenticeIntro,"Nice to meet you. I'm PTRN!" +KinkyDungeonRemindJailChaseApprenticeDefend0,"Don't hurt me!" +KinkyDungeonRemindJailChaseApprenticeDefend1,"I have classes to attend!" +KinkyDungeonRemindJailChaseApprenticeDefend2,"There goes my perfect attendance record..." +KinkyDungeonRemindJailChaseApprenticeDefendHonor0,"What's going on!?" +KinkyDungeonRemindJailChaseApprenticeDefendHonor1,"I'll save you, Mistress!" +KinkyDungeonRemindJailChaseApprenticeDefendHonor2,"" +KinkyDungeonRemindJailChaseApprenticeHonor0,"Me? Capture her? Okay mistress..." +KinkyDungeonRemindJailChaseApprenticeHonor1,"Okay miss, I'll do that..." +KinkyDungeonRemindJailChaseApprenticeHonor2,"But he's going to tie me up..." +KinkyDungeonRemindJailChaseApprenticeCommandDefend,"Be careful!" +KinkyDungeonRemindJailChaseApprenticeCommandAssault,"That's it! You made me mad!" +KinkyDungeonRemindJailChaseApprenticeCommandBlock,"I'll just... go." + +KinkyDungeonRemindJailCastNecromancer,"Rise, my minions!" +KinkyDungeonRemindJailMiscastNecromancer,"...Hello? Can anyone hear me?" +KinkyDungeonRemindJailPlayHelplessNecromancer0,"This is too tight..." +KinkyDungeonRemindJailPlayHelplessNecromancer1,"You won't get me like this!" +KinkyDungeonRemindJailPlayHelplessNecromancer2,"I can't get free!" KinkyDungeonRemindJailPlayBratNecromancer0,"Sticks and stones may break my bones... but you'll never catch me!" KinkyDungeonRemindJailPlayBratNecromancer1,"Got a bone to pick with me?" KinkyDungeonRemindJailPlayBratNecromancer2,"I must make my escape!" @@ -7668,6 +10825,7 @@ KinkyDungeonRemindJailPlayNecromancerLeash,"Come with me, I'll take you someplac KinkyDungeonRemindJailPlayNecromancerFree,"Looks like I get a bone-us!" KinkyDungeonRemindJailPlayNecromancerLoot,"You're getting under my skin..." KinkyDungeonRemindJailPlayNecromancerKey,"Thought you were making a marrow escape, eh?" +KinkyDungeonRemindJailChaseNecromancerAlert,"I've got a bone to pick with you~" KinkyDungeonRemindJailChaseNecromancerAttack0,"You numskull!" KinkyDungeonRemindJailChaseNecromancerAttack1,"You've got a lot of spine to fight me!" KinkyDungeonRemindJailChaseNecromancerAttack2,"You don't have a leg to stand on..." @@ -7684,16 +10842,36 @@ KinkyDungeonRemindJailNecromancerDisarm,"Hah!" KinkyDungeonRemindJailNecromancerHit,"That'll leave a mark..." KinkyDungeonRemindJailNecromancerHitPlayer,"You're mine now!" KinkyDungeonRemindJailNecromancerMiss,"Hold still you bonehead!" +KinkyDungeonRemindJailNecromancerBlock,"Hold still you bonehead!" KinkyDungeonRemindJailNecromancerMissedMe,"Hah! Such nerve..." +KinkyDungeonRemindJailNecromancerBlockedMe,"Hah! Such nerve..." KinkyDungeonRemindJailNecromancerLeash,"You're coming with me!" KinkyDungeonRemindJailNecromancerPull,"Get over here!" KinkyDungeonRemindJailNecromancerStun,"Not so slippery now!" KinkyDungeonRemindJailNecromancerPickpocket,"I'll be confiscating that." KinkyDungeonRemindJailNecromancerLock,"Make sure that's nice and tight..." - +KinkyDungeonRemindJailNecromancerIntro,"Spirits whisper my name in hushed tones as I, PTRN, make my appearance!" +KinkyDungeonRemindJailChaseNecromancerDefend0,"My rule will last centuries... just watch!" +KinkyDungeonRemindJailChaseNecromancerDefend1,"I will find the answer, even if I die trying. Except I can't, haha!" +KinkyDungeonRemindJailChaseNecromancerDefend2,"I've got eyes on the back of my skull..." +KinkyDungeonRemindJailChaseNecromancerDefendHonor0,"You are SO dead to me..." +KinkyDungeonRemindJailChaseNecromancerDefendHonor1,"What did you just say to me?" +KinkyDungeonRemindJailChaseNecromancerDefendHonor2,"That's my friend you bonehead!" +KinkyDungeonRemindJailChaseNecromancerHonor0,"Did you really think I wouldn't see through that?" +KinkyDungeonRemindJailChaseNecromancerHonor1,"You're bad to the bone..." +KinkyDungeonRemindJailChaseNecromancerHonor2,"*yawns* Alright alright..." +KinkyDungeonRemindJailChaseNecromancerCommandDefend,"Stand straight!" +KinkyDungeonRemindJailChaseNecromancerCommandAssault,"Why don't you bend the knee..." +KinkyDungeonRemindJailChaseNecromancerCommandBlock,"Who goes there?" + +KinkyDungeonRemindJailCastZombie,"SPL..." +KinkyDungeonRemindJailMiscastZombie,"!!!" +KinkyDungeonRemindJailPlayHelplessZombie0,"Can't... Move..." +KinkyDungeonRemindJailPlayHelplessZombie1,"Tight..." +KinkyDungeonRemindJailPlayHelplessZombie2,"This... is... fun..." KinkyDungeonRemindJailPlayBratZombie0,"Scary..." KinkyDungeonRemindJailPlayBratZombie1,"Run... Away..." -KinkyDungeonRemindJailPlayBratZombie2,"*Giggles*" +KinkyDungeonRemindJailPlayBratZombie2,"*giggles*" KinkyDungeonRemindJailPlaySubZombie0,"Play... with... me..." KinkyDungeonRemindJailPlaySubZombie1,"Please..." KinkyDungeonRemindJailPlaySubZombie2,"Command... Me..." @@ -7702,6 +10880,7 @@ KinkyDungeonRemindJailPlayZombieStruggle,"Helpless..." KinkyDungeonRemindJailPlayZombieLeash,"Take..." KinkyDungeonRemindJailPlayZombieLoot,"Mine..." KinkyDungeonRemindJailPlayZombieKey,"Shiny..." +KinkyDungeonRemindJailChaseZombieAlert,"Intruder..." KinkyDungeonRemindJailPlayZombie0,"*giggles*" KinkyDungeonRemindJailPlayZombie1,"Brains..." KinkyDungeonRemindJailPlayZombie2,"Squishy..." @@ -7717,16 +10896,31 @@ KinkyDungeonRemindJailChaseZombieChest,"Thief..." KinkyDungeonRemindJailChaseZombieOrb,"Intruder..." KinkyDungeonRemindJailChaseZombieJailbreak,"Give... Hug..." KinkyDungeonRemindJailZombieGrab,"...Hug..." -KinkyDungeonRemindJailZombieDisarm,"Checkmate..." +KinkyDungeonRemindJailZombieDisarm,"Got... you..." KinkyDungeonRemindJailZombieHit,"It's... Cold..." KinkyDungeonRemindJailZombieHitPlayer,"Friend..." KinkyDungeonRemindJailZombieMiss,"Come... Back..." -KinkyDungeonRemindJailZombieMissedMe,"He... hee..." +KinkyDungeonRemindJailZombieBlock,"Why... Not..." +KinkyDungeonRemindJailZombieMissedMe,"Hee..." +KinkyDungeonRemindJailZombieBlockedMe,"Ha..." KinkyDungeonRemindJailZombieLeash,"...Prisoner." KinkyDungeonRemindJailZombiePull,"...Get over here..." KinkyDungeonRemindJailZombieStun,"...Got you." KinkyDungeonRemindJailZombiePickpocket,"...Shiny..." KinkyDungeonRemindJailZombieLock,"...Secure..." +KinkyDungeonRemindJailZombieIntro,"*Her burial cloth reads PTRN*" +KinkyDungeonRemindJailChaseZombieDefend0,"Get her..." +KinkyDungeonRemindJailChaseZombieDefend1,"Must... hug..." +KinkyDungeonRemindJailChaseZombieDefend2,"Come... back..." +KinkyDungeonRemindJailChaseZombieDefendHonor0,"Stop..." +KinkyDungeonRemindJailChaseZombieDefendHonor1,"Come... here..." +KinkyDungeonRemindJailChaseZombieDefendHonor2,"Give... hugs..." +KinkyDungeonRemindJailChaseZombieHonor0,"Must... help..." +KinkyDungeonRemindJailChaseZombieHonor1,"Must... protect..." +KinkyDungeonRemindJailChaseZombieHonor2,"Save... friend..." +KinkyDungeonRemindJailChaseZombieCommandDefend,"Stop..." +KinkyDungeonRemindJailChaseZombieCommandAssault,"Come... here..." +KinkyDungeonRemindJailChaseZombieCommandBlock,"*giggles*" KinkyDungeonInsufficientEnergy,The weapon requires power from an Ancient Crystal to function. KinkyDungeonSpecialDragonslaver,Target an enemy: Attack with Dragonslaver. Target a tile: Spend 8 charge to launch binding belts @@ -7734,23 +10928,30 @@ KinkyDungeonSpecialTheEncaser,"25 charge to enter Slime Form for 25 turns, and c KinkyDungeonSpecialFourSeasons,"50 charge to reduce mana cost of next fire, earth, air, and water spell by 50 (once for each element)" KinkyDungeonSpecialArbiter,"25 charge to disarm a target for 8 turns, rendering them unable to attack." KinkyDungeonSpecialBondageBuster,"5 charge (+2.5 per charge) to channel and fire a beam that deals 30 + 3/charge electric damage, or 90 at max charge." -KinkyDungeonSpecialBlaster,"5 charge to fire a blast that deals 25 electric damage." +KinkyDungeonSpecialBlaster,"10 charge to fire a blast that deals 25 electric damage." KinkyDungeonSpecialMessengerOfLove,"50 charge to fire an arrow that enrages a target." -KinkyDungeonSpecialMoiraiScissors,"50 charge to enter a frenzy for 10 turns, attacking twice per turn." +KinkyDungeonSpecialMoiraiScissors,"50 charge: Free nearby allies and disrobe enemies, increasing charm damage by 100% and removing 100 armor." KinkyDungeonSpecialSlimethrower,Create a '+' shaped pool of slime that deals 35 glue damage per hit KinkyDungeonSpecialTorch,Ignite torches and nearby objects KinkyDungeonSpecialFlamberge,Ignite torches and nearby objects KinkyDungeonSpecialStaffFlame,Ignite torches and nearby objects KinkyDungeonSpecialStaffIncineration,Ignite torches and nearby objects +KinkyDungeonSpecialPickaxe,"Hit a cracked tile. If there is empty space or cracks on the opposite side, it breaks." -KDCategoryToggles,Toggles +KDCategoryToggles,Preferences +KDCategoryToggles2,Preferences 2 KDCategoryMulticlass,Multiclass -KDCategoryRestraints,Locks and Restraints -KDCategoryCombat,General Combat -KDCategoryKinky,Kinks and Preferences +KDCategoryMajor,Game-Changing +KDCategoryRestriction,Restriction +KDCategoryTraining,Training +KDCategoryRestraints,Restraints +KDCategoryCombat,Combat +KDCategoryKinky,Kinks +KDCategorySenses,Senses KDCategoryDamage,Damage and Resists -KDCategoryMagic,Wizardry and Sorcery -KDCategoryEnemies,Devious Threats +KDCategoryMagic,Magic +KDCategoryComponents,Spell Components +KDCategoryEnemies,Threats KDCategoryMap,World Generation KDCategoryStart,Starting Scenario KDCategoryBoss,Unlockable @@ -7780,11 +10981,15 @@ rGoodGirlRobot,"(The SPEAKER beeps)|Thank you for complying." rPunishment,"(The SPEAKER frowns)|Looks like you'll need to be punished. Get her!" rPunishmentSub,"(The SPEAKER looks Embarrassed)|Then... then... uh... someone stop her!" rPunishmentDom,"(The SPEAKER grins)|Then allow me to personally show you the rules." +rPunishmentBrat,"(The SPEAKER cracks her knuckles)|Finally, I get to have some fun~" rPunishmentRobot,"(The SPEAKER beeps)|Subject is resisting. Begin capture protocol." rWeaponFound,"(The SPEAKER calls at you)|You're not supposed to be carrying a weapon.|Hand it over." rWeaponFoundRobot,"(The SPEAKER approaches you)|Contraband detected. Initiating confiscation.|Please comply." +rWeaponFoundSub,"(The SPEAKER blushes)|Umm, miss, I see that you have a weapon there,|could you maybe hand it over?" +rWeaponFoundDom,"(The SPEAKER smiles at you)|Be a good girl and hand that weapon over,|would you?" +rWeaponFoundBrat,"(The SPEAKER grins and cracks her knuckles)|Are you planning to fight anybody with that?|Or are you gonna hand it over?" dWeaponFoundAccept,"Yes, miss... (Currently held weapon will be lost)" dWeaponFoundAcceptGag,"Mmph... (Nod politely) (Currently held weapon will be lost)" dWeaponFoundDeny,"No, I refuse!" @@ -7805,7 +11010,7 @@ rPrisonIntroNewLife_Pout,"(The SPEAKER giggles)|Don't worry, you'll come to enjo rPrisonIntroNewLife_Sub,"(The SPEAKER smiles)|Heh, looks like you'll be fitting right in." rPrisonIntroRules,"(The SPEAKER chuckles)|You're probably wondering what's in store for you.|It's simple: You behave and do as you're told.|Eventually you will get to roam around.|Don't you dare try to steal anything." -rPrisonIntroRules_Brat,"(The SPEAKER chuckles)|Looks like it's going to be an extended stay for you~" +rPrisonIntroRules_Brat,"(The SPEAKER chuckles)|Feisty, aren't you?|Looks like it's going to be an extended stay for you~" rPrisonIntroRules_Pout,"(The SPEAKER giggles and returns to her work)" rPrisonIntroRules_Sub,"(The SPEAKER smiles)|Looks like you'll get the hang of it pretty quickly!" @@ -7836,6 +11041,7 @@ rPrisonRepeatPout,"(The SPEAKER shrugs)|Well, I hope you learn." rPrisonRepeatBribe,"(The SPEAKER looks greedy)|Oh, you have an idea?" rPrisonRepeatBribe_Accept,"(The SPEAKER nods)|I'll put in a good word with you~" rPrisonRepeatBribeFail,"(The SPEAKER shakes her head)|Babe, you know who's going to be blamed|if a max-security prisoner escapes?" +rPrisonRepeatBribePoor,"(The SPEAKER shakes her head)|I'll be honest with you, you're not worth the risk.|It'd help if you had more change~" dPrisonRepeat_Smile,"(Giggle and smile)" dPrisonRepeatSmile_Correct,"Don't you mean 'more fun'?" @@ -7843,7 +11049,7 @@ dPrisonRepeat_Smile2,"(Giggle and moan)" dPrisonRepeat_Struggle,"(Struggle in your bindings)" dPrisonRepeat_Pout,"(Pout and glare at her)" dPrisonRepeat_Bribe,"(Point to the Jailer's coin pouch)" -dPrisonRepeatBribe_Accept,"(Give her all your gold)" +dPrisonRepeatBribe_Accept,"(Give her BRIBECOST gold)" @@ -7882,7 +11088,7 @@ dOfferDressForce_NoGag,"(Shake your head and moan) (PERCENT chance to avoid)" -rOfferKigu,"(The SPEAKER looks at with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed?" +rOfferKigu,"(The SPEAKER looks at you with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed?" rOfferKiguYes,"(The SPEAKER takes a strange mask from her satchel)|Well, I have the answer right here..." rOfferKiguYes_Yes,"(The SPEAKER nods seriously)|My hypothesis was correct..." rOfferKiguYes_No,"(The SPEAKER frowns)|Such a philistine. Begone." @@ -7910,6 +11116,64 @@ dOfferKiguForce_NoGag,"(Shake your head and moan) (PERCENT chance to avoid)" + +rOfferSenseDep,"(The SPEAKER smiles as she hides her hands behind her back)|Have you heard of 'sensory deprivation'?" +rOfferSenseDepYes,"(The SPEAKER presents a RESTRAINT)|Well, I have just the thing for you!|It's nice and comfy, and it has earmuffs built in!" +rOfferSenseDepYes_Yes,"(The SPEAKER starts pulling the hood over your head)|Let's get you laced in!" +rOfferSenseDepYes_No,"(The SPEAKER giggles)|Alrighty.|You don't know what you're missing out on~" +rOfferSenseDepNo,"(The SPEAKER doesn't seem to hear you)" +rOfferSenseDepForce,"(The SPEAKER looks at you with a devious grin)|Oh, but it's so much fun!|You can run around bumping into things!|It's the ultimate adventure!" +rOfferSenseDepForceYes,"(The SPEAKER chuckles)|Truth be told, I wasn't asking~|Now why don't you kneel for me..." +rOfferSenseDepForce_No,"(The SPEAKER pouts)|I thought it would be fun..." +rOfferSenseDepForce_Yes,"(The SPEAKER starts pulling the hood over your head)|Let's get you laced in!" +rOfferSenseDepForce_Failure,"(The SPEAKER surprises you with a crop to the thigh)|(You involuntarily kneel in front of her)|That's better~|Now why don't you say good night~" + +dOfferSenseDep_Yes,"Of course! I love it!" +dOfferSenseDep_YesGag,"(Nod eagerly)" +dOfferSenseDep_No,"I prefer 'situational awareness'." +dOfferSenseDep_NoGag,"(Shake your head in alarm)" + +dOfferSenseDepYes_Yes,"Doll me up!" +dOfferSenseDepYes_YesGag,"(Nod again)" +dOfferSenseDepYes_No,"Actually, that sounds stifling..." +dOfferSenseDepYes_NoGag,"(Shake your head)" + +dOfferSenseDepForce_Yes,"That doesn't sound that bad actually..." +dOfferSenseDepForce_YesGag,"(Giggle and nod)" +dOfferSenseDepForce_No,"I don't have time for this. (PERCENT chance to avoid)" +dOfferSenseDepForce_NoGag,"(Shake your head and groan) (PERCENT chance to avoid)" + + + +rOfferDusterGag,"(The SPEAKER smiles and looks down at you deviously)|Hey there, I have a 'job' for you!" +rOfferDusterGagYes,"(The SPEAKER takes a duster gag from her satchel)|Such a good girl!|So here's what I have for you~|It's a special tool to help keep the place clean." +rOfferDusterGagYes_Yes,"(The SPEAKER grins)|I'm glad we could come to an understanding~|(She takes out a duster gag from her satchel)|Now then, this place is filthy.|Why don't you put this on to help?" +rOfferDusterGagYes_No,"(The SPEAKER frowns)|Fair enough.|Perhaps you should reconsider your life choices~" +rOfferDusterGagNo,"(The SPEAKER shrugs)|I'll find someone else..." +rOfferDusterGagForce,"(The SPEAKER reaches out to grab you)|Now now,|You shouldn't skip out on your duties~|(She pulls out a duster gag from her satchel and grins)" +rOfferDusterGagForceYes,"(The SPEAKER smiles)|Don't be afraid!|(She turns the gag with the round mouth ball clearly visible)|Now open up..." +rOfferDusterGagForce_No,"(The SPEAKER shrugs)|Fine, I'll get someone else to clean up." +rOfferDusterGagForce_Yes,"(The SPEAKER places the gag in your mouth)|(She then buckles up the straps.)|(You feel a locking mechanism pull the straps in tight...)|Good maid!" +rOfferDusterGagForce_Failure,"(The SPEAKER catches you and forces the gag on you)|(You feel it tighten as it locks on securely...)|I don't want to hear it!|Now go and do your job~" + +dOfferDusterGag_Yes,"I'll do it!" +dOfferDusterGag_YesGag,"(Nod seriously)" +dOfferDusterGag_No,"I don't like the sound of this." +dOfferDusterGag_NoGag,"(Shake your head)" + +dOfferDusterGagYes_Yes,"Yes miss!" +dOfferDusterGagYes_YesGag,"(Nod again)" +dOfferDusterGagYes_No,"Actually, maybe not..." +dOfferDusterGagYes_NoGag,"(Shake your head)" + +dOfferDusterGagForce_Yes,"Okay okay... I'll do it." +dOfferDusterGagForce_YesGag,"(Giggle and nod)" +dOfferDusterGagForce_No,"That gag is far too big! (PERCENT chance to avoid)" +dOfferDusterGagForce_NoGag,"(Shake your head and moan) (PERCENT chance to avoid)" + + + + rOfferArmor,"(The SPEAKER swings an imaginary sword around)|En guar- Oh, you're unarmored!|Do you want to borrow some of mine?" rOfferArmorYes,"(The SPEAKER holds up a RESTRAINT)|I found this near an old suit of armor.|I think it's a helmet or something..." rOfferArmorYes_Yes,"(The SPEAKER winks and locks it on)|I feel much safer already~" @@ -8049,6 +11313,34 @@ dOfferScarfForce_No,"Hey! Stop! (PERCENT chance to avoid)" dOfferScarfForce_NoGag,"(Shake your head and whine) (PERCENT chance to avoid)" +rOfferResin,"(An excited SPEAKER turns to you)|Eureka, I've done it!|Do you want to see?" +rOfferResinYes,"(The SPEAKER pulls out a pressurized flask)|Behold! A gaseous form of latex!|I've coated the interior with a layer of inert slime to keep it secure.|Here, have a look!|(She holds out the container)" +rOfferResinYes_Yes,"(The flask springs a leak)|Oh no! That wasn't supposed to happen!|(The gas crystalizes into a RESTRAINT across your body)" +rOfferResinYes_No,"(The SPEAKER scoffs)|You'll see... you'll all see!" +rOfferResinNo,"(The SPEAKER sighs)|So hard to find good help out here..." +rOfferResinForce,"(The SPEAKER frowns)|What, do you doubt my results? See for yourself!|(She unscrews the cap)" +rOfferResinForceYes,"(The green gas starts leaking)|Oh no! It wasn't supposed to do that!" +rOfferResinForce_No,"(You push her out of the way, but she frowns)|Hmph. This is your fault." +rOfferResinForce_Yes,"(You push her out of the way, but get caught in the cloud yourself)|(The gas crystalizes into a RESTRAINT across your body)|Oh no, that could have been me!" +rOfferResinForce_Failure,"(The gas moves toward you, as if by its own will)|(The gas crystalizes into a RESTRAINT across your body)|That wasn't supposed to happen..." + +dOfferResin_Yes,"Seems interesting!" +dOfferResin_YesGag,"(Nod slowly)" +dOfferResin_No,"Seems boring." +dOfferResin_NoGag,"(Shake your head)" + +dOfferResinYes_Yes,"Are you sure this is a good idea?" +dOfferResinYes_YesGag,"(Nod again)" +dOfferResinYes_No,"Keep that away from me!" +dOfferResinYes_NoGag,"(Shake your head)" + +dOfferResinForce_Yes,"I'll stop it!" +dOfferResinForce_YesGag,"(Run toward her to help)" +dOfferResinForce_No,"(Run away!) (PERCENT chance to avoid)" +dOfferResinForce_NoGag,"(Run away!) (PERCENT chance to avoid)" + + + rOfferSlime,"(A messy looking SPEAKER turns to you)|Hmm, curious. Very curious.|Can you help me with an experiment?" rOfferSlimeYes,"(The SPEAKER pulls out a flask)|I isolated some slime, but it's inert.|Would you let me spill some on you?" @@ -8127,7 +11419,7 @@ dOfferMithrilYes_YesGag,"(Nod eagerly)" dOfferMithrilYes_No,"Not really." dOfferMithrilYes_NoGag,"(Shake your head)" -dOfferMithrilForce_Yes,"." +dOfferMithrilForce_Yes,"Fine..." dOfferMithrilForce_YesGag,"(Moan and giggle)" dOfferMithrilForce_No,"Stop! (PERCENT chance to avoid)" dOfferMithrilForce_NoGag,"(Shake your head and moan) (PERCENT chance to avoid)" @@ -8136,7 +11428,7 @@ dOfferMithrilForce_NoGag,"(Shake your head and moan) (PERCENT chance to avoid)" rOfferMithrilRope,"(A SPEAKER plays with silvery rope)|Hmm, I need to get better with this.|Can I practice on you?" rOfferMithrilRopeYes,"(The SPEAKER grins happily)|Thank you girl~|I'll tie with RESTRAINT then~" -rOfferMithrilRopeYes_Yes,"(The SPEAKER binds you tightly)|(The rope is tight, and she's clearly and expert.)|Mmm, not too bad~" +rOfferMithrilRopeYes_Yes,"(The SPEAKER binds you tightly)|(The rope is tight, and she's clearly an expert.)|Mmm, not too bad~" rOfferMithrilRopeYes_No,"(The SPEAKER pouts indignantly)|Why say yes then?!|(The SPEAKER walks off grumbling)" rOfferMithrilRopeNo,"(The SPEAKER sighs)|Very well then~" rOfferMithrilRopeForce,"(The SPEAKER pouts indignantly)|Oh no, you don't get out that easy.|You said you'd help!" @@ -8311,7 +11603,7 @@ rOfferMaidRestraintForce,"(The SPEAKER glares)|We urge you to reconsider." rOfferMaidRestraintForceYes,"(The SPEAKER has a twinkle in her eye)|We will offer you this RESTRAINT.|You should accept." rOfferMaidRestraintForce_No,"(The SPEAKER pulls an odd smile)|Very well." rOfferMaidRestraintForce_Yes,"(The SPEAKER smugly nods)|(With surprising speed, the RESTRAINT locks in place)|Excellent, a good fit." -rOfferMaidRestraintForce_Failure,"(The SPEAKER covers your hand with her mouth)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly)" +rOfferMaidRestraintForce_Failure,"(The SPEAKER covers your mouth with her hand)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly)" dOfferMaidRestraint_Yes,"Yes please!" dOfferMaidRestraint_YesGag,"(Nod eagerly)" @@ -8423,7 +11715,7 @@ rOfferLatexForce,"(The SPEAKER grins and reaches for a RESTRAINT)|Well, too bad- rOfferLatexForceYes,"(The SPEAKER grins)|I wasn't offering you a choice...|I was asking if you would LIKE it, hehe~" rOfferLatexForce_No,"(The SPEAKER frowns)|...You're fast!" rOfferLatexForce_Yes,"(The SPEAKER smiles)|That's right~" -rOfferLatexForce_Failure,"(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight!" +rOfferLatexForce_Failure,"(The SPEAKER restrains you and clicks a lock on)|There! Nice and tight!" dOfferLatex_Yes,"Why of course!" dOfferLatex_YesGag,"(Nod happily)" @@ -8441,38 +11733,94 @@ dOfferLatexForce_No,"Wait, what? (PERCENT chance to avoid)" dOfferLatexForce_NoGag,"(Shake your head and moan) (PERCENT chance to avoid)" - -rOfferChastity,"(The SPEAKER nervously walks up to you)|Excuse me miss...|Can you help me out?" -rOfferChastityYes,"(The SPEAKER blushes deeply)|I managed to unlock my RESTRAINT,|but my mistress expects me to wear it!|Do you mind wearing it instead?" -rOfferChastityYes_Yes,"(The SPEAKER smiles)|Thank you so much, miss!" -rOfferChastityYes_No,"(The SPEAKER frowns)|I'm going to get in trouble..." -rOfferChastityNo,"(The SPEAKER blushes)|Oh... okay." -rOfferChastityForce,"(The SPEAKER frowns angrily)|Look, I know you're in trouble around here.|Just do me a favor. Please.|I need you to wear this RESTRAINT." -rOfferChastityForceYes,"(The SPEAKER pleads with you)|My mistress is a magician!|She put a spell on it that senses if it's being worn.|Please, you have to hurry!" -rOfferChastityForce_No,"(The SPEAKER sighs and wears it herself)|(The lock starts glowing brightly...)" -rOfferChastityForce_Yes,"(The SPEAKER looks relieved)|Thank you so much miss!|I won't forget you!" -rOfferChastityForce_Failure,"(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Hmmph! Serves you right!|" +rOfferLatex2,"(The SPEAKER steps up to you)|Hey girl~|You happen to be a fan of latex?" +rOfferLatex2Yes,"(The SPEAKER smiles)|Then would you like to try on this RESTRAINT?" +rOfferLatex2Yes_Yes,"(The SPEAKER chuckles)|Tight and shiny!" +rOfferLatex2Yes_No,"(The SPEAKER frowns)|Aww..." +rOfferLatex2No,"(The SPEAKER shrugs)|Alright. Sorry I asked." +rOfferLatex2Force,"(The SPEAKER grins and reaches for a RESTRAINT)|Well, too bad--" +rOfferLatex2ForceYes,"(The SPEAKER grins)|I wasn't offering you a choice...|I was asking if you would LIKE it, hehe~" +rOfferLatex2Force_No,"(The SPEAKER frowns)|...You're fast!" +rOfferLatex2Force_Yes,"(The SPEAKER smiles)|That's right~" +rOfferLatex2Force_Failure,"(The SPEAKER restrains you and clicks a lock on)|There! Nice and tight!" + +dOfferLatex2_Yes,"Why of course!" +dOfferLatex2_YesGag,"(Nod happily)" +dOfferLatex2_No,"Not really." +dOfferLatex2_NoGag,"(Shake your head)" + +dOfferLatex2Yes_Yes,"That sounds fun!" +dOfferLatex2Yes_YesGag,"(Nod again)" +dOfferLatex2Yes_No,"No, I don't want that!" +dOfferLatex2Yes_NoGag,"(Shake your head)" + +dOfferLatex2Force_Yes,"Okay, fine..." +dOfferLatex2Force_YesGag,"(Moan and giggle)" +dOfferLatex2Force_No,"Wait, what? (PERCENT chance to avoid)" +dOfferLatex2Force_NoGag,"(Shake your head and moan) (PERCENT chance to avoid)" + +rOfferChastity,"(The SPEAKER walks up to you)|Say, would you be interested in some 'protection?'" +rOfferChastityYes,"(The SPEAKER grins)|Wonderful! You see, I've just recently acquired one of these...|(She shows you a loose RESTRAINT)|I'm not too interested in wearing one myself,|but I thought you'd be a good fit for it?" +rOfferChastityYes_Yes,"(The SPEAKER blushes as she locks the belt around your waist)|I'm enjoying this more than I thought I would~" +rOfferChastityYes_No,"(The SPEAKER smiles)|Enjoy your freedom while it lasts~" +rOfferChastityNo,"(The SPEAKER shrugs)|That's okay, just thought I'd ask." +rOfferChastityForce,"(The SPEAKER rubs the smooth metal seductively)|Are you sure?|Adventurers need to take care of themselves.|You don't want to lose control of yourself and run into some curse,|do you?" +rOfferChastityForceYes,"(The SPEAKER gives an evil smile)|What if I wasn't asking?" +rOfferChastityForce_No,"(The SPEAKER sighs)|I'll find some other cutie to wear it, I guess~" +rOfferChastityForce_Yes,"(The SPEAKER blushes as she locks the RESTRAINT onto you)|There we go~" +rOfferChastityForce_Failure,"(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Whoops! I guess I acted too soon.|Ah well~" rOfferChastityGlow,"(The lock on the RESTRAINT starts glowing...)" -dOfferChastity_Yes,"I would love to help!" +dOfferChastity_Yes,"Protection? Certainly!" dOfferChastity_YesGag,"(Nod eagerly)" -dOfferChastity_No,"Go find someone else." +dOfferChastity_No,"Nah, I'm good." dOfferChastity_NoGag,"(Shake your head)" -dOfferChastityYes_Yes,"That sounds like a tempting offer." +dOfferChastityYes_Yes,"I would love to wear it!" dOfferChastityYes_YesGag,"(Nod again, excited)" -dOfferChastityYes_No,"...What? Why would I need to wear it?" +dOfferChastityYes_No,"...No thank you." dOfferChastityYes_NoGag,"(Shake your head, puzzled)" -dOfferChastityForce_Yes,"Fine. I'll do it because you asked." +dOfferChastityForce_Yes,"Fine. I need the protection anyway." dOfferChastityForce_YesGag,"(Moan and nod slowly)" -dOfferChastityForce_No,"I won't help you. Wear it yourself. (PERCENT chance to avoid)" +dOfferChastityForce_No,"I refuse. (PERCENT chance to avoid)" dOfferChastityForce_NoGag,"(Shake your head) (PERCENT chance to avoid)" dOfferChastityObserve,"(Look at your belt...)" +rOfferCursed,"(The SPEAKER nervously walks up to you)|Excuse me miss...|Can you help me out?" +rOfferCursedYes,"(The SPEAKER blushes deeply)|I found this cursed RESTRAINT and I can't let go of it!|Could you... wear it for me?" +rOfferCursedYes_Yes,"(The SPEAKER smiles)|Thank you so much, miss!" +rOfferCursedYes_No,"(The SPEAKER frowns)|...That does seem rather far-fetched of me to ask." +rOfferCursedNo,"(The SPEAKER blushes)|Oh... okay." +rOfferCursedForce,"(The SPEAKER frowns angrily)|Look, we all know how much you enjoy being restrained~|Do me a favor and wear the RESTRAINT, okay?" +rOfferCursedForceYes,"(The SPEAKER pleads with you)|...point taken. But still!|I'll end up stuck in it for a really long time..." +rOfferCursedForce_No,"(The SPEAKER sighs and wears it herself)|(The lock starts glowing brightly...)" +rOfferCursedForce_Yes,"(The SPEAKER looks relieved)|Thank you so much miss!|I won't forget you!" +rOfferCursedForce_Failure,"(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|I'm sorry miss! It was my only choice~" +rOfferCursedGlow,"(The lock on the RESTRAINT starts glowing...)" + +dOfferCursed_Yes,"I would love to help!" +dOfferCursed_YesGag,"(Nod eagerly)" +dOfferCursed_No,"You're asking me to get cursed?" +dOfferCursed_NoGag,"(Shake your head)" + +dOfferCursedYes_Yes,"That sounds like a tempting offer." +dOfferCursedYes_YesGag,"(Nod again, excited)" +dOfferCursedYes_No,"...What? Why would I need to wear it?" +dOfferCursedYes_NoGag,"(Shake your head, puzzled)" + +dOfferCursedForce_Yes,"Fine. I'll do it because you asked." +dOfferCursedForce_YesGag,"(Moan and nod slowly)" +dOfferCursedForce_No,"I won't help you. Wear it yourself. (PERCENT chance to avoid)" +dOfferCursedForce_NoGag,"(Shake your head) (PERCENT chance to avoid)" + +dOfferCursedObserve,"(Look at your belt...)" + + + rOfferLeather,"(The SPEAKER walks up to you)|We don't get a lot of visitors.|I take it that you enjoy bondage?" rOfferLeatherYes,"(The SPEAKER tilts her head)|Well, I have a RESTRAINT lying around,|and I figured you'd enjoy it." rOfferLeatherYes_Yes,"(The SPEAKER smiles)|I'm glad you like it!" @@ -8482,7 +11830,7 @@ rOfferLeatherForce,"(The SPEAKER grins and reaches toward you!)|Well, I think it rOfferLeatherForceYes,"(The SPEAKER grins)|You don't have a choice, dear~" rOfferLeatherForce_No,"(The SPEAKER frowns)|Darn it! Missed my chance." rOfferLeatherForce_Yes,"(The SPEAKER smiles)|Good, good~" -rOfferLeatherForce_Failure,"(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight!" +rOfferLeatherForce_Failure,"(The SPEAKER restrains you and clicks a lock on)|There! Nice and tight!" dOfferLeather_Yes,"Why of course!" dOfferLeather_YesGag,"(Nod happily)" @@ -8986,20 +12334,93 @@ dOfferTempForce_NoGag,"(Shake your head and frown) (PERCENT chance to avoid)" -rBlacksmithShop,"(The SPEAKER waves)|Greetings,|I manufacture all sorts of goods.|Would you like to buy some?" +rBlacksmithShop,"(The SPEAKER waves)|Greetings,|I manufacture all sorts of weapons.|Would you like to buy some?" rBlacksmithShopAttack,"(The SPEAKER drops her hammer and cracks her knuckles)|Put em up!" rBlacksmithShop_AlreadyHave,"(The SPEAKER looks at you.)|But you already have one?" rBlacksmithShop_NoMoney,"(The SPEAKER folds her arms)|I don't do charity, ma'am." -rBlacksmithShopRedKey,"(The SPEAKER nods)|See this magic rune here?|Stick it in any lock, and it opens, just like that!|Only works once, though." -rBlacksmithShopLockpick,"(The SPEAKER smiles)|Now don't be up to no good~|Or else I'll have to put you in cuffs..." +rBlacksmithShopRedKey,"(The SPEAKER smirks)|Another adventurer found this lying around.|I wonder who it's for~" +rBlacksmithShopPick,"(The SPEAKER smiles)|Now don't be up to no good~|Or else I'll have to put you in cuffs..." rBlacksmithShopSword,"(The SPEAKER nods)|A versatile weapon. One of my favorites." rBlacksmithShopSpear,"(The SPEAKER nods)|Keep your friends close, and your enemies far away." rBlacksmithShopKnife,"(The SPEAKER nods)|Handy to have one of these around." rBlacksmithShopAxe,"(The SPEAKER nods)|The best defense is a good offense." -rBlacksmithShopTrapCuffs,"(The SPEAKER looks puzzled)|Don't know why you want 'em, but sure." - - -rPotionSell,"(The SPEAKER approaches you with an offer)|Greetings! I am a potion trader.|Give me your strongest potions!|I pay cash!" +rBlacksmithShopHammer,"(The SPEAKER nods)|Speak softly and carry a big hammer." +rBlacksmithShopTrapCuffs,"(The SPEAKER smiles)|Can never be too prepared~" + +rArmorerShop,"(The SPEAKER waves)|Hi.|I make armor. Only the finest.|I don't sell it cheap, unlike my twin." +rArmorerShopAttack,"(The SPEAKER drops her hammer and cracks her knuckles)|Put em up!" +rArmorerShop_AlreadyHave,"(The SPEAKER looks at you.)|Do you have a dealer's license?" +rArmorerShop_NoMoney,"(The SPEAKER folds her arms)|I don't do charity, girl." +rArmorerShopBreastplate,"(The SPEAKER nods)|The most high-impact of sports bras." +rArmorerShopSteelBoots,"(The SPEAKER nods)|These aren't for hiking, just so you know." +rArmorerShopGauntlets,"(The SPEAKER nods)|I've been thinking about making a lockable version..." +rArmorerShopBracers,"(The SPEAKER nods)|These are sensibly sized, unlike those you see in movies." +rArmorerShopChainTunic,"(The SPEAKER nods)|Sometimes you just have to be flexible." +rArmorerShopChainBikini,"(The SPEAKER nods)|For when you value style over protection..." +rArmorerShopShield,"(The SPEAKER nods)|You can never be too careful." +rArmorerShopTrapBelt,"(The SPEAKER chuckles)|I hear female adventurers like to wear these for protection.|Or something like that." +rArmorerShopTrapBra,"(The SPEAKER chuckles)|I hear female adventurers like to wear these for protection.|Or something like that." + +rBowyerShop,"(The SPEAKER waves)|Hello miss!|What brings you here today?" +rBowyerShopAttack,"(The SPEAKER folds her arms)|That's not very nice!" +rBowyerShop_AlreadyHave,"(The SPEAKER looks at you and smiles.)|Don't you already have one?" +rBowyerShop_NoMoney,"(The SPEAKER folds her arms)|I don't do charity, miss." +rBowyerShopLeatherBoots,"(The SPEAKER nods)|Could use a higher heel..." +rBowyerShopLeatherGloves,"(The SPEAKER nods)|Back to the basics." +rBowyerShopBustier,"(The SPEAKER smiles)|I see you have good taste!" +rBowyerShopBow,"(The SPEAKER nods)|It's a classic!|What's not to like?" +rBowyerShopBowRecurve,"(The SPEAKER smiles)|It's an upgrade for your best friend!" +rBowyerShopCrossbow,"(The SPEAKER shrugs)|It's big and bulky, but I guess it has its uses." +rBowyerShopCrossbowPistol,"(The SPEAKER giggles)|Smile for the camera!" +rBowyerShopAncientPowerSource,"(The SPEAKER nods)|It's like mana, but much more portable!|It powers duplication runes so you don't run out of arrows." +rBowyerShopTrapBlindfold,"(The SPEAKER giggles)|I like to include these as a gift with every purchase~" + +rShadyShop,"(The SPEAKER whispers in a hushed tone)|Welcome.|I'm not supposed to be here, so|if you don't want to do business, get out.|I only sell in packs of 10, by the way." +rShadyShopAttack,"(The SPEAKER tries to get away)|Damn!" +rShadyShop_AlreadyHave,"(The SPEAKER looks you over and shrugs)|Don't joke around." +rShadyShop_NoMoney,"(The SPEAKER folds her arms)|Don't have money? Better go find some." +rShadyShopStuffing,"(The SPEAKER produces a bag of stuffings)|Quite the staple." +rShadyShopRopeSnakeRaw,"(The SPEAKER produces a bundle of rope)|Aren't you quite the artist.|That was rhetorical." +rShadyShopVinylTapeRaw,"(The SPEAKER produces some bondage tape)|It only sticks to itself, doesn't leave residue.|Gotta be responsible, you know?" +rShadyShopClothGag,"(The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally..." +rShadyShopClothGag2,"(The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally..." +rShadyShopClothGag3,"(The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally..." +rShadyShopClothGagOver,"(The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally..." +rShadyShopClothBlindfold,"(The SPEAKER produces a bag of cloth strips)|How tight you tie it depends on how bratty your target is." + + + +rAntiqueShop,"(The SPEAKER rattles as she waves)|Heya!|Looking to buy some ancient treasures?|My antiques shop has just what you need!" +rAntiqueShopAttack,"(The SPEAKER cracks her exposed knuckles)|So you've seen through my disguise..." +rAntiqueShop_AlreadyHave,"(The SPEAKER looks at you.)|Yours is just fine, dear." +rAntiqueShop_NoMoney,"(The SPEAKER chuckles)|You don't have enough gold for that, dear.|Try coming back after a good round of looting!" +rAntiqueShopSunglasses,"(The SPEAKER nods)|My great grandmother used to wear these." +rAntiqueShopSackOfSacks,"(The SPEAKER nods)|Adventurers used to love a good burlap sack.|Nowadays they've got that newfangled magic instead..." +rAntiqueShopSnuffer,"(The SPEAKER nods)|Back in my day, they used candles for light!|These let you put them out to save wax." +rAntiqueShopRope,"(The SPEAKER giggles)|I had all sorts of use for this back on the farm." + +rShopBuy,"(Select an item to buy from the SPEAKER)" +rShopBuyAttack,"(Attack the SPEAKER?)" +dShopBuy,(Buy ITM# for IC# gp) (Owned: AMNT#) +rShopBuyItem,"(The SPEAKER sells you the item)" +rShopBuy_Fail,"(The SPEAKER shakes her head)|I think you'd be better off without that~" +rShopBuy_FailSub,"(The SPEAKER looks embarassed)|I can't sell you that, miss..." +rShopBuy_FailBrat,"(The SPEAKER blushes)|Actually, I was saving that for myself..." +rShopBuy_FailDom,"(The SPEAKER grins)|Good girls don't need one of those~" +rShopBuy_FailRobot,"(The SPEAKER buzzes)|Error, insufficient access privileges." +rShopBuy_NoMoney,"(The SPEAKER giggles at your empty pockets)|You can't afford such things, silly~" +rShopBuy_NoMoneySub,"(The SPEAKER pauses nervously)|Um miss, I don't think you can afford that..." +rShopBuy_NoMoneyBrat,"(The SPEAKER frowns)|What does this look like, a charity?" +rShopBuy_NoMoneyDom,"(The SPEAKER smules)|You'll have to secure that by other means, I think~" +rShopBuy_NoMoneyRobot,"(The SPEAKER beeps)|Insufficient currency." + +dShopBuySell,(Look at what she wants to buy) +dShopBuyAttack,You're giving me everything you have. +dShopBuyAttackGag,(Flail threateningly at her) +dShopBuyAttack_Confirm,(Do it) +dShopBuyAttack_Leave,(Back off) + +rPotionSell,"(The SPEAKER approaches you with an offer)|Greetings! I am the potion seller.|I buy and sell only the strongest potions!|" rPotionSellAttack,"(The SPEAKER doesn't look surprised)|Okay, just let me set these down real quick..." rPotionSellPotionMana,"(The SPEAKER smiles)|A spellcaster will have great use for this!" rPotionSellManaOrb,"(The SPEAKER smiles)|Wow! That's a lot of mana!|It requires a skilled mage to tap into, though..." @@ -9017,6 +12438,13 @@ rElfCrystalSellEarthRune,"(The SPEAKER thanks you)|A fine trinket!|I will enjoy rElfCrystalSellWaterRune,"(The SPEAKER thanks you)|I sense its flowing essence.|You have my thanks." rElfCrystalSellIceRune,"(The SPEAKER thanks you)|I can feel a great sadness emanating from it.|It calls for warmth." + +rFoodSell,"(The SPEAKER munches on a donut)|Gee I'm starving!|You wouldn't have something to eat, would you?" +rFoodSellAttack,"(The SPEAKER throws a donut in your face)|Ha! Take that!" +rFoodSellDonut,"(The SPEAKER smiles)|Yum! Thank you!" +rFoodSellCookie,"(The SPEAKER smiles)|Crunchy! My favorite!" +rFoodSellCookie,"(The SPEAKER tilts her head)|It smells funny...|Still, it'd be a shame for it to go to waste!" + rScrollSell,"(The SPEAKER approaches you with an offer)|Hello!|I am searching for magical scrolls.|Would you happen to have any?" rScrollSellAttack,"(The SPEAKER doesn't look surprised)|Rude!" rScrollSellScrollArms,"(The SPEAKER smiles)|Thank you!" @@ -9024,60 +12452,125 @@ rScrollSellScrollLegs,"(The SPEAKER smiles)|Thank you!" rScrollSellScrollVerbal,"(The SPEAKER smiles)|Thank you!" rScrollSellScrollPurity,"(The SPEAKER raises a brow)|Thank you! This one is rare!" +rScrollPlusSell,"(The SPEAKER invites you to a friendly chat)|Back in my day I used to go visit dungeons all the time|But these days I get so lost in my studies...|Say, you don't happen to have some magic supplies on you?" +rScrollPlusSellAttack,"(The SPEAKER shrugs)|I guess that's how it is." +rScrollPlusSellPotionMana,"(The SPEAKER smiles)|Always nice to have some of these!" +rScrollPlusSellManaOrb,"(The SPEAKER smiles)|I can never get enough of these." +rScrollPlusSellEarthRune,"(The SPEAKER smiles)|Elemental magic, interesting stuff." +rScrollPlusSellWaterRune,"(The SPEAKER tilts her head)|Why is it wet?" +rScrollPlusSellIceRune,"(The SPEAKER smiles)|Elemental magic, interesting stuff." +rScrollPlusSellScrollArms,"(The SPEAKER smiles)|Gladly, this will be useful to my studies." +rScrollPlusSellScrollLegs,"(The SPEAKER smiles)|My legs don't carry me like they used to~" +rScrollPlusSellScrollVerbal,"(The SPEAKER smiles)|Always good to have somebody to talk to." +rScrollPlusSellScrollPurity,"(The SPEAKER giggles)|Living dangerously, I see~" + rWolfgirlSell,"(The SPEAKER approaches you with an offer)|Hey girl~|You seem like the explorer type.|Happen to have any good finds?" rWolfgirlSellAttack,"(The SPEAKER frowns)|Well then." rWolfgirlSellMistressKey,"(The SPEAKER grins)|Are you willing to part with this?" rWolfgirlSellAncientPowerSource,"(The SPEAKER smiles)|Aha!|Fantastic." rWolfgirlSellAncientPowerSourceSpent,"(The SPEAKER frowns)|I'll take it, I guess..." rWolfgirlSellEnchantedGrinder,"(The SPEAKER smiles)|Oooh~!|I love technology!" +rWolfgirlSellManaOrb,"(The SPEAKER nods)|A rare find!" + rNinjaSell,"(The SPEAKER surprises you)|Greetings, traveler.|I am looking for tools to aid in my mission." rNinjaSellAttack,"(The SPEAKER doesn't look surprised)|That's how it is, then." rNinjaSellSmokeBomb,"(The SPEAKER bows)|Always be prepared." +rNinjaSellFlashBomb,"(The SPEAKER bows)|Always be prepared." +rNinjaSellFlashbang,"(The SPEAKER bows)|Always be extra prepared." rNinjaSellBomb,"(The SPEAKER bows)|A bit dangerous, but I'll take it." rNinjaSellBola,"(The SPEAKER bows)|A tool of the trade." rNinjaSellPotionInvisibility,"(The SPEAKER bows)|A most valuable find." +rGunSell,"(The SPEAKER tilts her shades)|I like to think of myself as a dealer in quality tools." +rGunSellAttack,"(The SPEAKER reaches for her hip)|I'd think twice if I were you..." +rGunSellBlaster,"(The SPEAKER smiles)|Nevermere keeps a tight grip on their blueprints.|Thank you." +rGunSellEscortDrone,"(The SPEAKER smiles)|Nevermere keeps a tight grip on their blueprints.|Thank you." +rGunSellCrossbow,"(The SPEAKER smiles)|There's always a buyer.|That's just the way things are." +rGunSellCrossbowPistol,"(The SPEAKER smiles)|Portable. Sustainable. A smart choice." +rGunSellCrossbowHeavy,"(The SPEAKER smiles)|That's what I'm talking about." +rGunSellGunpowder,"(The SPEAKER nods)|Yeah... that'll do." + +rBombSell,"(The SPEAKER looks somewhat crazed)|I'm looking for some heavy ordnance in order to...|...add to my collection.|Anyway, got any bombs?" +rBombSellAttack,"(The SPEAKER reaches for her backpack)|I'll blow you away!" +rBombSellSmokeBomb,"(The SPEAKER shrugs)|Cute fireworks, I suppose..." +rBombSellFlashBomb,"(The SPEAKER shrugs)|Cute fireworks, I suppose..." +rBombSellFlashbang,"(The SPEAKER giggles)|That's what I'm talking about!" +rBombSellBomb,"(The SPEAKER rubs her hands together)|Excellent..." +rBombSellGunpowder,"(The SPEAKER smiles)|Yes! I can make more bombs!" + +rThiefSell,"(The SPEAKER takes a whiff of her cigar)|Hey friend. Im in the market for some 'tools,'|...if you catch my frift." +rThiefSellAttack,"(The SPEAKER pulls out a knife)|Thought so. You won't take me that easily!" +rThiefSellCuffKeys,"(The SPEAKER nods)|Could help out in a bind." +rThiefSellSnuffer,"(The SPEAKER chuckles)|Lights out, eh..." +rThiefSellDiscPick,"(The SPEAKER nods)|I could use one of these!" +rThiefSellBomb,"(The SPEAKER smiles)|For when things go south..." +rThiefSellSmokeBomb,"(The SPEAKER smiles)|For when things go south..." +rThiefSellFlashBomb,"(The SPEAKER smiles)|For when things go south..." +rThiefSellFlashbang,"(The SPEAKER smiles)|You can never be too safe." + +rCookieSell,"(A distracted SPEAKER munches on a cookie)" +rCookieSellAttack,"(The SPEAKER continues eating her snack)" +rCookieSellCookie,"(The SPEAKER plucks the cookie out of your hand)|My favorite!" +rCookieSellBrownies,"(The SPEAKER eats the brownies slowly, savoring every bite)|Kind of dense, but really good!" +rCookieSellDonut,"(The SPEAKER takes a bite out of the donut)|A bit heavy on the sprinkles..." +rCookieSellCookieJailer,"(The SPEAKER blushes)|This is... my new favorite." +rCookieSellDivineTear,"(The SPEAKER's eyes widen as she wolfs down the golden cookie)|Truly divine..." + + + +rDressSell,"(The SPEAKER is reading a kinky fashion magazine)|Why hello gorgeous~|You seem like you know your way around fashion.|Say, I've been on the hunt for unique designs..." +rDressSellAttack,"(The SPEAKER pouts)|I don't like your attitude." +rDressSellBindingDress,"(The SPEAKER smiles)|Classic vintage!|I approve~" +rDressSellDressBra,"(The SPEAKER giggles)|A girls best friend, eh?" +rDressSellDressGag,"(The SPEAKER giggles)|A girls best friend, eh?" +rDressSellMikoDress,"(The SPEAKER gasps)|What an amazing find!!!" + rGhostSell,"(The SPEAKER runs up to you)|Hello!|You wouldn't happen to have seen any ghosts lately?|I'm gathering evidence!" rGhostSellAttack,"(The SPEAKER gasps)|You wouldn't!" rGhostSellElfCrystal,"(The SPEAKER shakes your hand)|Ah! Ghosts love these!" rGhostSellEctoplasm,"(The SPEAKER smiles)|This looks like strong evidence for my investigation!" rGhostSellPotionInvisibility,"(The SPEAKER grins)|Woah! That's so cool!" +dItemShopBuy,(Look at what she has to sell) dItemShopAttack,You're giving me everything you have. dItemShopAttackGag,(Flail threateningly at her) dItemShopAttack_Confirm,(Do it) dItemShopAttack_Leave,(Back off) -dItemShop0,(Sell Item0 for ItemCost0 gp) -dItemShop1,(Sell Item1 for ItemCost1 gp) -dItemShop2,(Sell Item2 for ItemCost2 gp) -dItemShop3,(Sell Item3 for ItemCost3 gp) -dItemShop4,(Sell Item4 for ItemCost4 gp) -dItemShop5,(Sell Item5 for ItemCost5 gp) -dItemShop6,(Sell Item6 for ItemCost6 gp) -dItemShop7,(Sell Item7 for ItemCost7 gp) -dItemShop8,(Sell Item8 for ItemCost8 gp) -dItemShop9,(Sell Item9 for ItemCost9 gp) - -dItemShopBuy0,(Buy Item0 for ItemCost0 gp) -dItemShopBuy1,(Buy Item1 for ItemCost1 gp) -dItemShopBuy2,(Buy Item2 for ItemCost2 gp) -dItemShopBuy3,(Buy Item3 for ItemCost3 gp) -dItemShopBuy4,(Buy Item4 for ItemCost4 gp) -dItemShopBuy5,(Buy Item5 for ItemCost5 gp) -dItemShopBuy6,(Buy Item6 for ItemCost6 gp) -dItemShopBuy7,(Buy Item7 for ItemCost7 gp) -dItemShopBuy8,(Buy Item8 for ItemCost8 gp) -dItemShopBuy9,(Buy Item9 for ItemCost9 gp) +dItemShop0,(Sell Item0 for ItemCost0 gp) (Owned: AMNT0) +dItemShop1,(Sell Item1 for ItemCost1 gp) (Owned: AMNT1) +dItemShop2,(Sell Item2 for ItemCost2 gp) (Owned: AMNT2) +dItemShop3,(Sell Item3 for ItemCost3 gp) (Owned: AMNT3) +dItemShop4,(Sell Item4 for ItemCost4 gp) (Owned: AMNT4) +dItemShop5,(Sell Item5 for ItemCost5 gp) (Owned: AMNT5) +dItemShop6,(Sell Item6 for ItemCost6 gp) (Owned: AMNT6) +dItemShop7,(Sell Item7 for ItemCost7 gp) (Owned: AMNT7) +dItemShop8,(Sell Item8 for ItemCost8 gp) (Owned: AMNT8) +dItemShop9,(Sell Item9 for ItemCost9 gp) (Owned: AMNT9) + +dItemShopBuy0,(Buy Item0 for ItemCost0 gp) (Owned: AMNT0) +dItemShopBuy1,(Buy Item1 for ItemCost1 gp) (Owned: AMNT1) +dItemShopBuy2,(Buy Item2 for ItemCost2 gp) (Owned: AMNT2) +dItemShopBuy3,(Buy Item3 for ItemCost3 gp) (Owned: AMNT3) +dItemShopBuy4,(Buy Item4 for ItemCost4 gp) (Owned: AMNT4) +dItemShopBuy5,(Buy Item5 for ItemCost5 gp) (Owned: AMNT5) +dItemShopBuy6,(Buy Item6 for ItemCost6 gp) (Owned: AMNT6) +dItemShopBuy7,(Buy Item7 for ItemCost7 gp) (Owned: AMNT7) +dItemShopBuy8,(Buy Item8 for ItemCost8 gp) (Owned: AMNT8) +dItemShopBuy9,(Buy Item9 for ItemCost9 gp) (Owned: AMNT9) rAngelHelp,"(The SPEAKER appears in a flash of light)|I come in the name of the Goddess.|I presume you need my aid?|(She will remain and help you with restraints for 50 turns)" rAngelHelpKnife,"(The SPEAKER gives you two knives)|Don't hurt yourself with these, okay?" rAngelHelpPick,"(The SPEAKER gives you three picks)|I don't know how you plan to use these..." -rAngelHelpBlueKey,"(The SPEAKER reluctantly gives you a magic key)|Okay, these don't grow on trees..." +rAngelHelpBlueKey,"(The SPEAKER reluctantly gives you a magic key)|Okay, but remember that these are rare and valuable." +rAngelHelpDivineFail,"(The SPEAKER looks impressed with your predicament)|No angel can remove these without a divine blessing.|Perhaps you should apply for one? *snickers*" +rAngelHelpDivineQuest,"(The SPEAKER looks impressed with your predicament)|I won't get between you and your quest duties!" +rAngelHelpDivine,"(The SPEAKER looks impressed with your predicament)|Since you are Blessed by a goddess, I can help you.|(She performs a short prayer and a random divine lock comes off)" dAngelHelp_Knife,(Ask for 2 knives) dAngelHelp_Pick,(Ask for 3 lockpicks) dAngelHelp_BlueKey,(Ask for a magic key) +dAngelHelp_Divine,(Ask for help with a divine lock) KinkyDungeonAngelNoSpace,There is no valid space next to you! @@ -9090,7 +12583,7 @@ dGenericAllyAttack_Leave,"(Never mind...)" rGenericAllyAttack_Leave,"(You decide not to)" dGenericAllyAttackPlay,"(Retaliate)" -rGenericAllyAttackPlay,"(Really attack? You will be justified and won't take a rep penalty)|(You will still lose rep if you capture her)" +rGenericAllyAttackPlay,"(Really attack? You will be justified and won't take an immediate rep penalty)" dGenericAllyAttackPlay_Confirm,"(Attack her)" dGenericAllyAttackPlay_Leave,"(Never mind...)" rGenericAllyAttackPlay_Leave,"(You decide not to)" @@ -9101,11 +12594,11 @@ dGenericAllyAttackUnaware_Confirm,"(Attack her)" dGenericAllyAttackUnaware_Leave,"(Never mind...)" rGenericAllyAttackUnaware_Leave,"(You decide not to)" -dGenericAllyLetMePass,"(Walk past)" -dGenericAllyLetMePass_Confirm,"(Walk past)" -dGenericAllyLetMePass_ConfirmAll,"(Walk past multiple allies)" +dGenericAllyLetMePass,"(Let me through!!)" +dGenericAllyLetMePass_Confirm,"(Walk past this unit)" +dGenericAllyLetMePass_ConfirmAll,"(Walk past all units)" dGenericAllyLetMePass_Leave,"(Never mind...)" -rGenericAllyLetMePass,"(Confirm? You will walk through her for a few turns)" +rGenericAllyLetMePass,"(Confirm? You will move through her for a few turns)" rGenericAllyLetMePass_Leave,"(...)" dGenericAllyStopFollowingMe,"(Stop following me)" @@ -9115,6 +12608,15 @@ rGenericAllyStopFollowingMe,"(Confirm? You will have to find the SPEAKER again.) rGenericAllyStopFollowingMe_Leave,"(You decide you still need the help)" rGenericAllyStopFollowingMe_Fail,"(The SPEAKER refuses to follow your orders)" + +dGenericAllyUntie,"(Remove BINDAMNT binding from her) UNTIETURNS" +rGenericAllyUntie,"(You remove BINDANTPREV binding from the SPEAKER, excluding actual bindings)|(Use the 'Truss em Up' skill to remove bindings)" +dGenericAllyFood,"(Give her a restoration item)" +rGenericAllyFood,"(The SPEAKER appreciates the thought!)" +KDMustHaveHP,Must have HP to untie. +KDXTurns,(AMNT turns) +KDXTurn,(AMNT turn) + dGenericAllyFollowMe,"(Follow me)" dGenericAllyFollowMe_Confirm,"(Follow me)" dGenericAllyFollowMe_Leave,"(Never mind...)" @@ -9122,8 +12624,8 @@ rGenericAllyFollowMe,"(The SPEAKER starts following you)" rGenericAllyFollowMe_Leave,"(You decide you don't need the help)" rGenericAllyFollowMe_Fail,"(The SPEAKER refuses to follow your orders)" -dGenericAllyStayHere,"(Stay here)" -dGenericAllyStayHere_Confirm,"(Stay here)" +dGenericAllyStayHere,"(Hold still)" +dGenericAllyStayHere_Confirm,"(Hold still)" dGenericAllyStayHere_Leave,"(Never mind...)" rGenericAllyStayHere,"(The SPEAKER follows your orders)" rGenericAllyStayHere_Leave,"(...)" @@ -9142,6 +12644,127 @@ rGenericAllyAggressive,"(The SPEAKER will now pursue enemies)" dGenericAllyDefensive,"(Switch to Defensive)" rGenericAllyDefensive,"(The SPEAKER will stay close to you or its assigned position)" +dGenericAllyFlirt,"(Flirting)" +rGenericAllyFlirt,"(The SPEAKER smiles)|This will be fun!" +rGenericAllyFlirtDom,"(The SPEAKER grins)|I will make sure you enjoy yourself~" +rGenericAllyFlirtSub,"(The SPEAKER blushes)|Mmm~ Let's do this!" +rGenericAllyFlirtBrat,"(The SPEAKER backs up)|I'm not in trouble, am I?" +rGenericAllyFlirtRobot,"(The SPEAKER beeps)|This unit does not know how to respond..." +rGenericAllyFlirtGagged,"(The SPEAKER moans)|Mmmmmph~" +rGenericAllyFlirtNoBrain,"(The SPEAKER appears too busy to discuss with you)" + + +KDDialogue_CuddleStart_,"" +KDDialogue_CuddleStart_Gagged,"" +KDDialogue_CuddleStart_Robot,"" +KDDialogue_CuddleStart_Dom,"" +KDDialogue_CuddleStart_Brat,"" +KDDialogue_CuddleStart_Sub,"" + +KDDialogue_CuddleEnd_,"" +KDDialogue_CuddleEnd_Gagged,"" +KDDialogue_CuddleEnd_Robot,End of line. +KDDialogue_CuddleEnd_Dom,"" +KDDialogue_CuddleEnd_Brat,*slaps your butt* +KDDialogue_CuddleEnd_Sub,"" + +KDDialogue_CuddleRunAway_,"" +KDDialogue_CuddleRunAway_Gagged,"" +KDDialogue_CuddleRunAway_Robot,Error. Subject not complying? +KDDialogue_CuddleRunAway_Dom,"" +KDDialogue_CuddleRunAway_Brat,"" +KDDialogue_CuddleRunAway_Sub,"" + +KDDialogue_CuddleChastity_,"Got yourself locked up, huh? Better go be good now~" +KDDialogue_CuddleChastity_Gagged,"*she bumps up against your chastity and sighs*" +KDDialogue_CuddleChastity_Robot,"Pleasure controls detected." +KDDialogue_CuddleChastity_Dom,"You've been a bad girl, haven't you? *taps on your chastity gear*" +KDDialogue_CuddleChastity_Brat,"Such a naughty girl, getting yourself all locked up like that!" +KDDialogue_CuddleChastity_Sub,"I-I know you want release, but you're in this gear for a reason~" + +KDDialogue_ToyPlayStart_,"" +KDDialogue_ToyPlayStart_Gagged,"" +KDDialogue_ToyPlayStart_Robot,"" +KDDialogue_ToyPlayStart_Dom,"" +KDDialogue_ToyPlayStart_Brat,"" +KDDialogue_ToyPlayStart_Sub,"" + +KDDialogue_ToyPlayEnd_,"" +KDDialogue_ToyPlayEnd_Gagged,"" +KDDialogue_ToyPlayEnd_Robot,End of line. +KDDialogue_ToyPlayEnd_Dom,Had fun?~ +KDDialogue_ToyPlayEnd_Brat,*turns the toy off and giggles* +KDDialogue_ToyPlayEnd_Sub,"" + +KDDialogue_ToyPlayRunAway_,"" +KDDialogue_ToyPlayRunAway_Gagged,"" +KDDialogue_ToyPlayRunAway_Robot,Error. Subject not complying? +KDDialogue_ToyPlayRunAway_Dom,"" +KDDialogue_ToyPlayRunAway_Brat,"" +KDDialogue_ToyPlayRunAway_Sub,"" + +KDDialogue_ToyPlayChastity_,"Got yourself locked up, huh? Better go be good now~" +KDDialogue_ToyPlayChastity_Gagged,"*she bumps up against your chastity and sighs*" +KDDialogue_ToyPlayChastity_Robot,"Pleasure controls detected." +KDDialogue_ToyPlayChastity_Dom,"You've been a bad girl, haven't you? *taps on your chastity gear*" +KDDialogue_ToyPlayChastity_Brat,"Such a naughty girl, getting yourself all locked up like that!" +KDDialogue_ToyPlayChastity_Sub,"I-I know you want release, but you're in this gear for a reason~" + +dGenericAllyFlirt_Cuddle,"Don't I look quite cuddly?" +dGenericAllyFlirt_CuddleGag,"(Move closer, attempting to cuddle)" +rGenericAllyFlirt_Cuddle,"(The SPEAKER smiles)|You do, in fact!|(She inches closer)" +rGenericAllyFlirt_CuddleDom,"(The SPEAKER smiles gently)|Aren't you precious~" +rGenericAllyFlirt_CuddleSub,"(The SPEAKER looks flustered)|Well, it's been a long day...|I could use a hug..." +rGenericAllyFlirt_CuddleBrat,"(The SPEAKER smirks and reaches for your body)" +rGenericAllyFlirt_CuddleRobot,"(The SPEAKER makes a beeping noise)|Loading cuddle module..." + + +dGenericAllyFlirt_BondageOffer,"Got something for me?" +dGenericAllyFlirt_BondageOfferGag,"(Present your body to her~)" +rGenericAllyFlirt_BondageOffer,"(The SPEAKER smiles)|Am I thinking what you're thinking?" +rGenericAllyFlirt_BondageOfferDom,"(The SPEAKER grins)|Why yes, I have just the thing~" +rGenericAllyFlirt_BondageOfferSub,"(The SPEAKER blushes)|Oh... let me check." +rGenericAllyFlirt_BondageOfferBrat,"(The SPEAKER smirks)|Be careful what you ask for~" +rGenericAllyFlirt_BondageOfferRobot,"(The SPEAKER pauses)|Calculating strictness threshold..." +dGenericAllyFlirt_BondageOffer_Yes,"Yes please! (Hold out your wrists)" +dGenericAllyFlirt_BondageOffer_YesGag,"(Nod and blush)" +dGenericAllyFlirt_BondageOffer_No,"Maybe not..." +dGenericAllyFlirt_BondageOffer_NoGag,"(Shake your head)" + +dGenericAllyFlirt_PlayRequest,"Why don't we have a little fun?" +dGenericAllyFlirt_PlayRequestGag,"(Play with her)" +rGenericAllyFlirt_PlayRequest,"(The SPEAKER smiles)|Am I thinking what you're thinking?" +rGenericAllyFlirt_PlayRequestDom,"(The SPEAKER grins)|Why yes, I have just the thing~" +rGenericAllyFlirt_PlayRequestSub,"(The SPEAKER blushes)|Oh... let me check." +rGenericAllyFlirt_PlayRequestBrat,"(The SPEAKER smirks)|Be careful what you ask for~" +rGenericAllyFlirt_PlayRequestGagged,"(The SPEAKER giggles)|Mmmph~" +rGenericAllyFlirt_PlayRequestRobot,"(The SPEAKER pauses)|Calculating strictness threshold..." + + +dGenericAllyFlirt_Release,"You look quite distracted..." +dGenericAllyFlirt_ReleaseGag,"(Help her with her distraction)" +rGenericAllyFlirt_Release,"(The SPEAKER nervously smiles)|H-how'd you know?" +rGenericAllyFlirt_ReleaseDom,"(The SPEAKER smiles)|Indeed I am... Won't you assist me?" +rGenericAllyFlirt_ReleaseSub,"(The SPEAKER wiggles excitedly)|Y-yes miss!" +rGenericAllyFlirt_ReleaseBrat,"(The SPEAKER shakes her head while blushing)|W-what makes you think that?" +rGenericAllyFlirt_ReleaseRobot,"(The SPEAKER computes something)|Error..." +rGenericAllyFlirt_ReleaseGagged,"(The SPEAKER nods)|Mmmph!" +dGenericAllyFlirt_Release_Wand,"(Give her release with a magic wand)" +dGenericAllyFlirt_Release_Vibe,"(Set her toys to high for a while)" +dGenericAllyFlirt_Release_Cuddle,"(Cuddle with her for 2 turns)" +rGenericAllyFlirt_Release_Success,"(The SPEAKER trembles with pleasure)" +rGenericAllyFlirt_Release_FailChastity,"(The SPEAKER struggles to let go due to her chastity belt)" + + + +dGenericAllyFlirt_LeashWalk,"Let's go for a walk!" +dGenericAllyFlirt_LeashWalkGag,"(Jump excitedly, presenting your collar for a leash)" +rGenericAllyFlirt_LeashWalk,"(The SPEAKER smiles)|Sure! I'll take you for a walk, but only if you behave." +rGenericAllyFlirt_LeashWalkDom,"(The SPEAKER smiles)|Yes, I haven't had a nice walk in a while~" +rGenericAllyFlirt_LeashWalkSub,"(The SPEAKER blushes)|Sure! I'll make sure you don't get into trouble~" +rGenericAllyFlirt_LeashWalkBrat,"(The SPEAKER giggles)|Time for walkies!" +rGenericAllyFlirt_LeashWalkRobot,"(The SPEAKER calculates)|Routing coordinates..." + dGenericAllyHelpMe,"(Ask her for help)" dGenericAllyHelpMe_Confirm,"(Ask her for help)" dGenericAllyHelpMe_Leave,"(Never mind...)" @@ -9170,9 +12793,25 @@ dGenericAllyDontHelpMe_Confirm,"(Stop receiving help)" dGenericAllyDontHelpMe_Leave,"(Never mind...)" rGenericAllyDontHelpMe_Confirm,"(The SPEAKER will no longer help you.)" rGenericAllyDontHelpMe_Leave,"(You sigh as you realize you really need her help.)" +dGenericAllyRemoveParty,"(Kick her out of your party)" +rGenericAllyRemoveParty,"(Confirm? She will stop following you)" +dGenericAllyRemoveParty_Confirm,"(Remove from party)" +dGenericAllyRemoveParty_Leave,"(Never mind...)" +rGenericAllyRemoveParty_Confirm,"(The SPEAKER understands.)" +rGenericAllyRemoveParty_Leave,"(You decide to keep her.)" +dGenericAllyJoinParty,"(Add her to your party)" +rGenericAllyJoinParty,"(Confirm? She will follow you across floors. You can only have 3 party members)" +dGenericAllyJoinParty_Confirm,"(Add to party)" +dGenericAllyJoinParty_Leave,"(Never mind...)" +rGenericAllyJoinParty_Confirm,"(The SPEAKER is happy to join you)" +rGenericAllyJoinParty_Leave,"(You decide not to.)" + dGenericAllyShop,"(Sell items)" dGenericAllyShopBuy,"(Buy items)" +dGenericAllyLeash,"(Pick up her leash)" +dGenericAllyReleaseLeash,"(Release her leash)" + NameDollmakerBoss1,"Dollmaker" KillDollmakerBoss1,"The Dollmaker throws a device to the ground, teleporting her instantly!" AttackDollmakerBoss1Bind,"The Dollmaker's necklace flashes as you find yourself suddenly restrained! (+RestraintAdded)" @@ -9195,11 +12834,13 @@ NameFuuka1,"Fuuka" KillFuuka1,"Fuuka surrounds herself in defensive talismans!" AttackFuuka1Bind,"Fuuka wraps you tightly in restraints! (+RestraintAdded)" AttackFuuka1,"Fuuka squeezes your breasts and smiles! (DamageTaken)" +AttackFuuka1Lock,"Fuuka snaps her fingers and all your restraints are locked! (DamageTaken)" -NameFuuka2,"Angry Fuuka" +NameFuuka2,"Fuuka" KillFuuka2,"Fuuka surrounds herself in defensive talismans one more time!" AttackFuuka2Bind,"Fuuka wraps you furiously in restraints! (+RestraintAdded)" AttackFuuka2,"Fuuka pouts as she tickles you relentlessly! (DamageTaken)" +AttackFuuka2Lock,"Fuuka snaps her fingers and all your restraints are locked! (DamageTaken)" rFuuka,"(You find a girl wearing an ornate dress)|(She glances at you)|And who might you be?" dFuuka_Aggressive,"I should be asking the same of you." @@ -9225,19 +12866,39 @@ dFuuka_DefensiveGag,"Mmmmm... (Blush)" rFuukaDefensive,"(She grins)|My name is Fuuka, with the letters for Wind and Song.|The reincarnated ones call me Windsong,|they aren't very bright though." dFuukaDefensive_Question,Reincarnated ones? rFuukaDefensive_Question,"(SPEAKER tilts her head)|I believe the term is 'Zombie' in the common tongue." -rFuukaDefensive_Question_Question,"(SPEAKER enjoys the discussion)|When people die, their spirits pass on to the next life.|But with the right tricks, one can grant them a second chance.|I plan to give them all proper bodies...|Eventually." -dFuukaDefensive_Question_Question,"But... 'reincarnated'?" -rFuukaDefensive_Question_Question_Question,"(SPEAKER tilts her head)|...They don't?" -dFuukaDefensive_Question_Question_Question,"But people don't die anymore." +rFuukaDefensive_Question_Question,"(SPEAKER enjoys the discussion)|When most people die, their spirits pass on to the next life.|But some stay in this world, and with the right blessings,|one can grant them a second chance!|I plan to give them all proper bodies...|Eventually." +dFuukaDefensive_Question_Question,"How do they get reincarnated?" +rFuukaDefensive_Question_Question2,"(SPEAKER enjoys the discussion)|No, they're people!|People who died long ago.|Now they live a new life, safeguarded by my Resurrection Arts!" +dFuukaDefensive_Question_Question2,"Aren't they dolls? They can barely speak." +rFuukaDefensive_Question_Question_Question,"(SPEAKER pouts)|Why you...|Long ago, I made a contract with Ninril to guide lost souls back to her.|Do you doubt her blessing?!" +dFuukaDefensive_Question_Question_Question,"Your Resurrection Arts don't seem very effective." +rFuukaDefensive_Question_Question_Question2,"(SPEAKER looks puzzled)|People don't die anymore, but there are still lots of souls out there.|Whenever they stumble into the dungeon, searching for answers,|I'm still here, waiting!" +dFuukaDefensive_Question_Question_Question2,"What do you do now that people don't die?" dFuukaDefensive_Question_Question_Proceed,"(...)" -rFuukaDefensive_Question_Question_Question_Question,"(SPEAKER scratches her chin)|So they managed it... after all this time..." -dFuukaDefensive_Question_Question_Question_Question,"People don't die anymore." -rFuukaDefensive_Question_Question_Question_Question_Question,"(SPEAKER folds her arms)|You don't know? They call it... the Old Civilization, in your tongue.|Long ago they were trying some experiments... many experiments.|Immortality was their goal." -dFuukaDefensive_Question_Question_Question_Question_Question,"Who is 'they'?" -rFuukaDefensive_Question_Question_Question_Question_Question_Question,"(SPEAKER shrugs)|Well, I don't know what they've accomplished.|But if the human race is immortal now,|that means you get to be my pet for a long time!" -dFuukaDefensive_Question_Question_Question_Question_Question_Question,"They're just a bunch of old robots now." -rFuukaDefensive_Question_Question_Question_Question_Question_Question2,"(SPEAKER frowns)|Hey, it's not my fault!|People who come here are usually not as talkative as you are...|Plus, I'm really busy these days.|I can't be bothered to keep track of recent developments!" -dFuukaDefensive_Question_Question_Question_Question_Question_Question2,"...Am I really the first to tell you this?" +rFuukaDefensive_Question_Question_Question_Question,"(SPEAKER chortles)|So you've noticed!|As you can see, Ninril is very powerful~" +dFuukaDefensive_Question_Question_Question_Question,"You don't look very old yourself." +rFuukaDefensive_Question_Question_Question_Question2,"(SPEAKER frowns)|Divine blessings shouldn't be used for such silly things!" +dFuukaDefensive_Question_Question_Question_Question2,"Can you resurrect my back? It kind of hurts right now..." +rFuukaDefensive_Question_Question_Question_Question3,"(SPEAKER smiles)|Those latex-clad idiots don't understand a thing.|Science can only get you so far!|Worship is where it's at!" +dFuukaDefensive_Question_Question_Question_Question3,"The Alchemists are always looking for a youth potion." +rFuukaDefensive_Question_Question_Question_Question_Question,"(SPEAKER folds her arms)|Oh ho ho~|That's none of your business, for it is also part of my contract|to keep outsiders from interfering with the catacombs below!" +dFuukaDefensive_Question_Question_Question_Question_Question,"Do you know what's on the next floor?" +rFuukaDefensive_Question_Question_Question_Question_Question2,"(SPEAKER blushes)|Nope, nothing at all!|In fact, whatever it is, you won't find it down here!|Now, would you like to become my pet?" +dFuukaDefensive_Question_Question_Question_Question_Question2,"Do you know anything about the Old Civilization?" +rFuukaDefensive_Question_Question_Question_Question_Question_Question,"(SPEAKER shrugs)|Oh really...|Must be the fey playing tricks, hehe..." +dFuukaDefensive_Question_Question_Question_Question_Question_Question,"I've seen a few robots running around!" +rFuukaDefensive_Question_Question_Question_Question_Question_Question2,"(SPEAKER looks nervous)|Oh yeah? Where'd you hear that?|The 'adventurer's guild,' huh?|Why don't you just leave the dead to rest~" +dFuukaDefensive_Question_Question_Question_Question_Question_Question2,"I heard there was an ancient facility on this island." +rFuukaDefensive_Question_Question_Question_Question_Question_Question3,"(SPEAKER sighs)|Look, the Goddess doesn't tell me everything.|Now then, I have a job to do and some pets to manage.|Please stop asking questions!" +dFuukaDefensive_Question_Question_Question_Question_Question_Question3,"Is Sariel Vinlaga down here?" +rFuukaDefensive_Question_Question_Question_Question_Question_Question3_Question,"(SPEAKER frowns)|What's with all the questions!|There totally isn't some kind of doll processing facility here!|Perhaps you're a brainwashed doll yourself?" +dFuukaDefensive_Question_Question_Question_Question_Question_Question3_Question,"Does DressUp Co. get their 'cyber doll' products from here?" +rFuukaDefensive_Question_Question_Question_Question_Question_Question4,"(SPEAKER chuckles)|I smell a hint of jealousy~" +dFuukaDefensive_Question_Question_Question_Question_Question_Question4,"I don't want to be a pet, so you'll have to force me." +rFuukaDefensive_Question_Question_Question_Question_Question_Question5,"(SPEAKER jumps up and down)|You would!?|That's wonderful~|My resurrection magic can make you young again forever!|All you have to do is pledge your soul to Nirin, the Goddess of Restoration!" +dFuukaDefensive_Question_Question_Question_Question_Question_Question5,"I'd love to be your pet!" +rFuukaDefensive_Question_Question_Question_Question_Question_Question5_Proceed,"(SPEAKER pouts)|Hmmph. Suit yourself." +dFuukaDefensive_Question_Question_Question_Question_Question_Question5_Proceed,"Pledge my soul? That changes things..." dFuukaDefensive_Question_Proceed,"(...)" dFuukaDefensive_Proceed,I am an adventurer. dFuukaDefensive_ProceedGag,Mmmmph. @@ -9329,8 +12990,10 @@ dFuukaFight_Fight3,"I suppose..." dFuukaFight_Fight3Gag,"Mmmmph..." rFuukaLose,"(SPEAKER smiles as she stands over you)|Well well. Look who won." -rFuukaLoseAccept,"(SPEAKER nods)|Absolutely. Now allow me to make my conditions clear.|You will wear my collar from now on.|Then you will be allowed to go." -rFuukaLoseDeny,"(SPEAKER giggles)|You're not in a position to resist.|Now then, let me make myself clear.|I will let you go... but only wearing my collar." +rFuukaLoseAccept,"(SPEAKER nods and giggles)|Absolutely.|Allow me to present to you, my prized pet collar!|I save it only for my favorite pets.|That's right! You're my favorite pet now~" +rFuukaLoseDeny,"(SPEAKER giggles)|You're not in a position to resist.|Now then, where did I put that collar..." +rFuukaLoseMagic,"(SPEAKER smiles)|It's a magical spell that seals your power temporarily~|I use it for my pets when they're being unruly...|(She brandishes a collar) Now including you!" +dFuukaLose_Magic,"What's this weird magic?" dFuukaLose_Accept,"You beat me fair and square." dFuukaLose_AcceptGag,"Mmmph. (Submit)" dFuukaLose_Deny,"You cheated!" @@ -9344,7 +13007,7 @@ rFuukaStage2,"(SPEAKER puts up a wall of talismans to regain her strength)|I'm.. rFuukaWin,"(SPEAKER is out of breath)|I... can't... believe... it...|She drops her keys..." rFuukaWinAccept,"(SPEAKER looks flabbergasted)|R-really? Okay... I'll give you a reward then..." -dFuukaWin_Accept,"(Submit to her anyway)" +dFuukaWin_Accept,"(Submit to her anyway) (Gain a special collar)" rFuukaWinGag,"(SPEAKER resists but ultimately you force a gag into her mouth)|MMMMMPH!" dFuukaWin_Gag,"(Gag her)" @@ -9376,17 +13039,29 @@ dShopkeeperRescue_RefuseGag,"(Shake your head and refuse rescue)" dShopkeeperRescue_Accept,"Yes please!" dShopkeeperRescue_Refuse,"Actually I was having fun..." -rShopkeeperStart,"(The SPEAKER, your longtime friend, smiles)|Well well, if it isn't you again!|I see that you've decided to challenge the dungeon again.|Remember, if you get caught, I'll rescue you... for a fee~" +rShopkeeperStart,"(The SPEAKER, your longtime friend, smiles)|Well well, if it isn't you again!|I see that you've decided to challenge the dungeon again.|Don't forget to bring some gold back with you,|there's a fee for rescue~" + +dShopkeeperStart_Help,"Can you help with these restraints?" +dShopkeeperStart_HelpGag,"Pfffmmm hhmmph mmph... (Please Help Me)" +rShopkeeperStartHelp,"No can do! Even I can't get those off of you." dShopkeeperStart_Danger,"Caught by...?" -rShopkeeperStartDanger,"Hah!|You've been here a million times!|You obviously know about the many factions vying for power~" +rShopkeeperStartDanger,"Hah!|You've been here a million times!|You obviously know how dangerous it is, yes?" dShopkeeperStart_Fee,"F-fee? There's a fee?" -rShopkeeperStartFee,"Yep! It'll cost ya!|RESCUECOST gold pieces. A bargain, if you ask me...|Unless you'd like to spend the rest of your life in chains!" +rShopkeeperStartFee,"Yep! It'll cost ya!|Quite worth it if you ask me.|Unless you'd like to spend the rest of your life in chains!" dShopkeeperStart_Shop,"Will you buy my loot?" -rShopkeeperStartShop,"Soon! I'm currently setting up my wares, so you'll have to wait." +dShopkeeperStart_ShopGag,"(Show her your loot)" +rShopkeeperStartShop,"Absolutely! I offer the standard market rate for anything.|I'll take enchanted items too!|I've got plenty of volunteers to check for curses~" +rShopkeeperStartShopGag,"Got something you want to show me?" +dShopkeeperStartShop_Sell,(Sell Items) +dShopkeeperStartShop_SellBulk,(Sell Whole Stacks of Items) dShopkeeperStart_Gag,"Mmmph!" rShopkeeperStartGag,"Daww! What a cutie!|(She smiles and pats your head gently)" +dShopkeeperStart_Buy,"Do you have anything for sale?" +dShopkeeperStart_BuyGag,"(Look around for items to buy)" +rShopkeeperStartBuy,"I'm sorry sweetie, I don't sell merchandise here.|Who would set up a shop inside a dungeon? That's crazy!|But you adventurers bring in a steady supply of loot,|so if you've got something to sell me, I'll take it off your hands~|You can also talk to my guests, perhaps they have something for you." + dReturn,"(Return)" @@ -9437,6 +13112,56 @@ rShopkeeperTeleportDebt_Restraint_No,"Up to you!|You'll still have to pay me eve rShopkeeperTeleportDebt_Collar_No,"Your choice~|I am open to further negotiations." rShopkeeperTeleportDebt_Catsuit_No,"Your choice~|Not everyone is up to putting themselves on display like that~" + + +rShopkeeperOfferHelp,"(The SPEAKER pats you down and makes sure you're okay)|I can definitely help with those!|But as you know, I help a lot of adventurers just like you.|You know what, I'll give you a discount!|That'll be RESCUECOST gold pieces!" + +dShopkeeperOfferHelp_Pay,"Right! Here's RESCUECOST gp." +dShopkeeperOfferHelp_PayGag,"Mmmph. (Nod your head and pay RESCUECOST gp)" +rShopkeeperOfferHelpPay,"(The SPEAKER smiles)|Pleasure doing business with ya~" + +dShopkeeperOfferHelp_Tab,"Mind adding it to my tab?" +dShopkeeperOfferHelp_TabGag,"(Shake your head regrettably.)" +rShopkeeperOfferHelpTabYesRestrained,"(The SPEAKER rubs her chin)|Sorry miss!|Cost of doing business, you know?|Why don't you come back with some of that delicious, shiny gold~" +rShopkeeperOfferHelpTabYes,"(The SPEAKER rubs her chin)|Sorry miss!|Cost of doing business, you know?|Why don't you come back with some of that delicious, shiny gold~" +rShopkeeperOfferHelpTabNo,"(The SPEAKER folds her arms)|Come on now, I can hear the gold jingling in your pocket!" +rShopkeeperOfferHelpTabNoPoor,"(The SPEAKER folds her arms)|Business is business, miss~" + +dShopkeeperOfferHelp_TabRetry,"Pretty please? I promise I'll pay you back." +dShopkeeperOfferHelp_TabRetryGag,"(Be insistent)" +rShopkeeperOfferHelpTabRetryRestrained,"(The SPEAKER rubs her chin)|No can do.|Rules are rules~" +rShopkeeperOfferHelpTabRetry,"(The SPEAKER sighs)|Business is business, miss~" + +rShopkeeperOfferHelpDebt,"(The SPEAKER reluctantly frees you)|...Fine, I'll cut you a deal.|You help me, I help you. Fair?" + +dShopkeeperOfferHelpDebt_Armor,"(Help her test cursed armors)" +dShopkeeperOfferHelpDebt_Restraint,"(Add cursed restraints as collateral)" +dShopkeeperOfferHelpDebt_Collar,"(Wear a collar to help advertise her business)" +dShopkeeperOfferHelpDebt_Catsuit,"(Wear a catsuit to help advertise her business)" +dShopkeeperOfferHelpDebt_Pay,"(Actually... just pay her the RESCUECOST gold)" + +rShopkeeperOfferHelpDebt_Armor,"(The SPEAKER holds up a RESTRAINTNAME)|I've bought some armors from an adventurer lately,|but I don't know if they're safe to wear.|Why don't you try it on for me?|I'll postpone your debt for a later time." +rShopkeeperOfferHelpDebt_Restraint,"(The SPEAKER holds up a RESTRAINTNAME)|I need to make sure you won't go running off again.|This RESTRAINTNAME here has a special seal on it.|I can get you out of it, of course, but you'll have to pay up first." +rShopkeeperOfferHelpDebt_Collar,"(The SPEAKER holds up a RESTRAINTNAME)|Your captors are quite the market for high-security restraints.|If you get captured by them, maybe they'll see my logo on this collar!|It's quite comfy and secure,|you'll end up feeling more submissive the more your wear it." +rShopkeeperOfferHelpDebt_Catsuit,"(The SPEAKER holds up a RESTRAINTNAME)|Your body looks like a great billboard!|This suit will make you so attractive that nobody will be able to resist!|And in the process of, ahem, examining you,|They'll be sure to see my logo!" +rShopkeeperOfferHelpDebt_Pay,"(The SPEAKER folds her arms and nods)|Good girl! I knew you would come clean~" + +dShopkeeperOfferHelpDebt_Yes,"Sure! I accept!" +dShopkeeperOfferHelpDebt_YesGag,"(Nod in approval)" +dShopkeeperOfferHelpDebt_No,"How about something else?" +dShopkeeperOfferHelpDebt_NoGag,"(Shake your head)" + +rShopkeeperOfferHelpDebt_Armor_YesCursed,"Excellent! Please hold still~|(She fits the RESTRAINTNAME on and a seal awakens)|Whoops! Good thing I didn't sell that one!|I'll let you keep it, it's my treat~" +rShopkeeperOfferHelpDebt_Armor_YesUncursed,"Excellent! Please hold still~|(She fits the RESTRAINTNAME on and nothing happens)|We have a winner!|You can't have it though, not until you pay up~" +rShopkeeperOfferHelpDebt_Restraint_Yes,"Wonderful. I look forward to seeing you being delivered, er, coming back,|Lots of treasure in hand!|(She places the RESTRAINTNAME on you and the seal activates. There is no keyhole.)" +rShopkeeperOfferHelpDebt_Collar_Yes,"Alright! Why don't you hold still~|(She lifts your hair out of the way and buckles the collar on)|Now go out there and find me some treasure~" +rShopkeeperOfferHelpDebt_Catsuit_Yes,"You're gonna like it, I guarantee it~|(She pulls out the catsuit from a drawer, dusts it off, and helps you in it)|(There is no zipper or fastener, just a very stretchy neck hole)|(Once it's on and well-fitted, you feel the neck grow less loose...)|(...and pulling the rubber away from your skin becomes impossible)|Beautiful. I'm going to let you go now.|I'm sure your new look will attract many customers!" + +rShopkeeperOfferHelpDebt_Armor_No,"No? That's alright.|I'm sure I'll find someone else to test these on, huehue." +rShopkeeperOfferHelpDebt_Restraint_No,"Up to you!|You'll still have to pay me eventually~" +rShopkeeperOfferHelpDebt_Collar_No,"Your choice~|I am open to further negotiations." +rShopkeeperOfferHelpDebt_Catsuit_No,"Your choice~|Not everyone is up to putting themselves on display like that~" + rMapModNone,"The next floor is a normal floor." rMapModMold,"This floor is suffering from a slime mold infestation.|Maids have been deployed to deal with the problem.|They could use a hand." rMapModBandit,"This floor is being ransacked by bandits.|They are armed and dangerous.|But I hear there's a bounty on their heads?" @@ -9448,14 +13173,6 @@ rMapModWolf,"The trainers are taking their wolfgirls out for a walk.|I'd steer c rMapModRobot,"Rumor has it that one of the cyber-dolls escaped.|Their handlers are looking for her.|They're catching every young girl they can find!" rMapModBoss,"This is totally a normal floor.|No doubt about it." -rJourneyNone,"This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall." -rJourneyHarder,"This is the entrance to the ancient tombs.|It's harder than the normal entrance." -rJourneyRandom,"This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random." -rJourneyExplorer,"Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure!" -rJourneyDoll,"You've gotten lost in an ancient doll processing facility.|This journey features mostly lategame tilesets." -rJourneyLost,"You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed!" - - rJourneyTest,"This is a debug mode journey for testing the latest region." @@ -9468,15 +13185,15 @@ rTutorial0,"Welcome to the dungeon!|Don't panic, this is a turn-based game,|and rTutorial1,"You might be wondering what all these barrels are for.|Don't worry, they're, uh, totally safe!|When you are inside one you can click on yourself to wait.|Enemies have a hard time seeing you inside a barrel,|so you can wait until they pass by you." -rTutorial2,"On the right you'll see your stats and spells slots.|Your DP, SP, MP, and WP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon.|Below that, two icons allow you to toggle automatic escape and movement modes." +rTutorial2,"On the right you'll see your stats and spells slots.|Your DP, SP, MP, and WP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon." rTutorial2_sp1,"Your WP, or willpower, is an important resource.|Without it, escaping from restraints is more difficult.|There is a willpower potion on the floor up there. Go get it!" -rTutorial2_sp2,"Oh no! That trap wiped out all your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack)." +rTutorial2_sp2,"Oh no! That trap reduced your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack)." rTutorial2_sp3,"Another trap!|You'll notice that the trap also drained your stamina considerably, preventing you from sprinting or attacking.|(Note: you can toggle sprinting using the '>>' button on the bottom bar)|You can protect yourself while your stamina regenerates by retreating into the room above.|Close the door by clicking the Close Door button in the bottom bar.|" -rTutorial2_mp1,"Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the bottom right.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1." +rTutorial2_mp1,"Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the right menu, then navigate to the Spell Tree.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1." rTutorial2_mp2,"On the right you'll see your stats and spells slots.|You can click on a spell slot or hit 1-4 on your keyboard to cast a spell|then click on the map for where you want to aim it.|The small wrench icon above them will let you|swap them out for another spell from your spellbook." rTutorial2_mp3,"There's a zombie over there!|Fortunately zombies are weak to fire.|Firebolt has a very long range,|so simply cast firebolt and click on the zombie.|Repeat until it is dead." -rTutorial2_mp4,"Mana potions restore your mana fully." +rTutorial2_mp4,"Mana potions restore mana, allowing you to cast spells.|Youll notice that your mana also regenerates slowly.|This mana comes from your mana pool,|which is a thin line displayed under the mana bar.|When that runs out, you can't cast spells anymore!" rTutorial2_dp1,"Your DP, or Distraction, is a measure of...|How much you are enjoying things.|These sorts of thoughts cloud your mind,|so spellcasting is more difficult when you are distracted.|Go grab the potion over there." rTutorial2_dp2,"Did you like that?|Anyway, there's a zombie over there. You should drink that potion.|It will clear your mind so you can cast again.|Hurry, or it will get you!" @@ -9536,17 +13253,43 @@ rJailerHiSecResist,"(The SPEAKER folds her arms)|Want to or not, you're going." dJailerHiSec_Resist,(Resist) dJailerHiSec_Submit,(Submit) +rCyberHiSec,"(A SPEAKER approaches you in your cell)|Looks like you're not in the System.|I'm going to have to take you to sorting." +rCyberHiSecResist,"(The SPEAKER grins as her systems glow)|I love my job sometimes~" +dCyberHiSec_Resist,(Resist) +dCyberHiSec_Submit,(Submit) +rCyberHiSecQuestion1,"(The SPEAKER grins)|It means you'll get nicely packaged,|so that we can sort you through the System." +dCyberHiSec_Question1,W-what does that entail? +rCyberHiSecQuestion1Gag,"(The SPEAKER giggles)|That means we'll get to package you up and|decide what to do with you, silly~" +dCyberHiSec_Question1Gag,Hmmmph? Mmmm! (Act worried and whimper) +rCyberHiSecQuestion2,"(The SPEAKER folds her arms)|Mistress Oriel's orders " +dCyberHiSec_Question2,Not in the 'System'? +rCyberHiSecQuestion2Gag,"(The SPEAKER giggles)|Don't worry, we'll get you sorted out soon.|After all, everyone has a place in the System." +dCyberHiSec_Question2Gag,Mmmph? (Act confused) +rCyberHiSecQuestion2,"(The SPEAKER folds her arms)|Mistress Oriel's orders were clear:|Anyone not logged in the System shall be entered into the System." +dCyberHiSec_Question2,Not in the 'System'? +rCyberHiSecQuestion2Gag,"(The SPEAKER giggles)|Don't worry, we'll get you sorted out soon.|After all, everyone has a place in the System." +dCyberHiSec_Question2Gag,Mmmph? (Act confused) +rCyberHiSecQuestion3,"(The SPEAKER pauses for a moment, then speaks)|I'm am just following Mistress Oriel's orders.|I'm sure she will have time to speak with you if you want to ask her." +dCyberHiSec_Question3,But why??? +rCyberHiSecQuestion3_Who,"(The SPEAKER frowns)|You should be thankful.|Without Mistress Oriel, we'd all be dead!|Probably..." +dCyberHiSecQuestion3_Who,Who is Mistress Oriel? +rCyberHiSecQuestion3_When,"(The SPEAKER pauses for a moment, then answers)|Well, only a few hundred years ago, I think?|This is a bit longer of a downtime than usual,|But all of us are waiting patiently~" +dCyberHiSecQuestion3_When,When are these orders from? +rCyberHiSecQuestion3_Why,"(You anger the SPEAKER. She gags you.)|Unlike you, we were trained not to complain about orders given to us.|So until you receive your training, why don't you be nice and quiet?" +dCyberHiSecQuestion3_Why,The facility is in ruins! This is pointless! + rBanditQuest,"(A SPEAKER crosses her arms)|Who you lookin' at?|Oh, it's an adventurer.|Say, you wouldn't be interested|in working with us, would ya?" rBanditQuestHelp,"(The SPEAKER smiles)|That's more like it.|Here's the scoop: One of ours was captured on the next floor.|We need you to go get her out." dBanditQuest_Help,(Show interest) -rPrisonerJail,"(The SPEAKER sits bound in high-security manacles)|You'll need to open the lock to get her out..." +rPrisonerJail,"(The SPEAKER sits bound in high-security manacles.|You'll need to open the lock to get her out.)" rPrisonerJailNoKeys,"(You don't have any keys that work on the lock)" rPrisonerJailUnlockHandsBound,"(You can't help her, bound as tightly as you are...)" rPrisonerJailUnlockSlow,"(You unlock her, fumbling around for a while with your bound hands)" rPrisonerJailUnlock,"(You unlock the SPEAKER)|Thank you!|Let's get out of here!" rPrisonerJailUnlockGagged,"(You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...)" rPrisonerJailNoPick,"(You don't have any lockpicks)" +rPrisonerJailPickJam,"(You try to pick the lock...)|(Click! A safety shield locks securely into place!)|(Looks like the SPEAKER will be staying here for a while...)" rPrisonerJailPickHandsBound,"(You can't pick the lock with your hands bound)" rPrisonerJailPick,"(After a while, you free the SPEAKER)|Thank you!|Let's get moving!" rPrisonerJailPickGagged,"(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...)" @@ -9554,14 +13297,52 @@ rPrisonerJailWordNoMana,"(You don't have enough mana for a command word)" rPrisonerJailWordNoSpeak,"(Try as you might, your mouth is sealed tight)" rPrisonerJailWord,"(You utter a command word to free the SPEAKER)|Many thanks!|Let's go!" rPrisonerJailWordGagged,"(You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...)" +rPrisonerJailJammed,"(The SPEAKER is locked in high-security manacles.|The safety shield has been triggered, making it impossible to help her.)" dPrisonerJail_Unlock,Use a key to unlock her -dPrisonerJail_Pick,Try to pick her restraints -dPrisonerJail_Word,Use a command word +dPrisonerJail_Pick,"Try to pick her restraints (JAMPERCENT jam chance)" +dPrisonerJail_Word,Use CMD: Unlock +dPrisonerJailJammedRecent_Apologize,Apologize profusely! + +rPrisonerJailBug,"(The SPEAKER sits bound in mysterious ASCII glyphs)|(She is bugged and needs your help to get out)" +dPrisonerJailBug_Unlock,(Unlock her and file a bug report to Ada) + + +rPrisonerJailOther,"(This SPEAKER is a sub, but not YOUR sub!)" + + +rPrisonerJailOwn,"(The SPEAKER sits restrained by your own hand.|Only someone with keys can let her out.)" +rPrisonerJailOwnNoKeys,"(You don't have any keys that work on the lock)" +rPrisonerJailOwnUnlockHandsBound,"(You can't help her, bound as tightly as you are...)" +rPrisonerJailOwnUnlockSlow,"(You unlock her, fumbling around for a while with your bound hands)" +rPrisonerJailOwnUnlock,"(You unlock the SPEAKER)|Thank you!|Let's get out of here!" +rPrisonerJailOwnUnlockGagged,"(You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...)" +rPrisonerJailOwnNoPick,"(You don't have any lockpicks)" +rPrisonerJailOwnPickJam,"(You try to pick the lock...)|(Click! A safety shield locks securely into place!)|(Looks like the SPEAKER will be staying here for a while...)" +rPrisonerJailOwnPickHandsBound,"(You can't pick the lock with your hands bound)" +rPrisonerJailOwnPick,"(After a while, you free the SPEAKER)|Thank you!|Let's get moving!" +rPrisonerJailOwnPickGagged,"(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...)" +rPrisonerJailOwnWordNoMana,"(You don't have enough mana for a command word)" +rPrisonerJailOwnWordNoSpeak,"(Try as you might, your mouth is sealed tight)" +rPrisonerJailOwnWord,"(You utter a command word to free the SPEAKER)|Many thanks!|Let's go!" +rPrisonerJailOwnWordGagged,"(You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...)" +rPrisonerJailOwnJammed,"(The SPEAKER is locked in high-security manacles.|The safety shield has been triggered, making it impossible to help her.)" + +dPrisonerJailOwn_Unlock,Use a key to unlock her +dPrisonerJailOwn_Pick,"Try to pick her restraints" +dPrisonerJailOwn_Reclaim,"Return her to your collection" +dPrisonerJailOwn_Word,Use a command word +dPrisonerJailOwn_Flip,Flip her around +dPrisonerJailOwnJammedRecent_Apologize,Apologize profusely! +rPrisonerJailOwnFlip,You spin her right round! + + KinkyDungeonDiscovered,An enemy found you while you were busy! +rPrisonerRescue,"(A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door)" rPrisonerRescueBandit,"(A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door)" +rPrisonerRescueAlchemist,"(A SPEAKER wakes you up by melting the door with acid)|These guys were a piece of cake.|Now let's discover a way out of here!" rPrisonerRescueBountyhunter,"(You wake up to find a SPEAKER creeping up outside the door)|You've been marked as a person of interest.|We are here to escort you out of this place." rPrisonerRescueNevermere,"(A SPEAKER wakes you up by banging on the bars)|Hey wake up!|You should join me and my pals here~|Maybe you'll join them once we're out of here?" rPrisonerRescueElf,"(A SPEAKER wakes you up by banging on the bars)|I have been sent to inform you...|...that you are of good standing with the Council.|That being said, I'm only doing this because of procedure." @@ -9570,21 +13351,42 @@ rPrisonerRescueMushy,"(You sense a presence nearby and look up to see a SPEAKER) rPrisonerRescueDressmaker,"(A SPEAKER wakes you up with the sound of copious fabric rustling)|Oh why hello there!|Would you be interested in a trial run of my latest product?|Of course, we'll have to get you out of here first..." rPrisonerRescueWitch,"(A SPEAKER wakes you up by banging on the bars)|Hello my pretty~|I thought to myself I'd rather have you than these folk.|Now why don't you come along and follow me..." rPrisonerRescueApprentice,"(A SPEAKER wakes you up by banging on the bars)|Um... hello!|I received a quest to help you out of here!|Now, where do we go..." -rPrisonerRescueMaidforce,"(You wake up to find a SPEAKER whispering to you)|Greetings.|We've been sent to free you.|Let's get moving." +rPrisonerRescueMaid,"(You wake up to find a SPEAKER whispering to you)|Greetings.|We've been sent to free you.|Let's get moving." rPrisonerRescueDragon,"(A SPEAKER wakes you up by banging loudly)|Hey! Good news!|My friends and I came to rescue you!" rPrisonerRescueElemental,"(A SPEAKER wakes you up by knocking on the bars)|Hey, wake up.|I happen to like you, so we're going to get you out of here." rPrisonerRescueAncientRobot,"(A SPEAKER flashes a bright light in your direction)|Prisoner 74121 located. Commence transfer to different location." rAllyRescue,"(A SPEAKER wakes you up)|We came to rescue you. Come on!" -rBed,"(The bed looks comfy and inviting)|(Napping here will restore up to half of your willpower)|(You can only sleep once per floor, unless jailed)" +rBed,"(The bed looks comfy and inviting)|(Napping here will restore up to half of your willpower and 100% of your max mana)|(You can only sleep once per floor, unless jailed)" rBedSleep,"(You lay in the bed and doze off...)" dBed_Sleep,(Lie down and sleep) +rDollDropoff,"(There is a pole sticking out of the ground)|(A footrest rises from the floor on either side of the pole)|(This seems like an automated binding system for prisoners...)" +rDollDropoffUse,"(The pole rises and immobilizes you!)" +dDollDropoff_Use,(Stand over it and place your feet in the footrests) +dDollDropoff_NPC,(Drop off a prisoner from your collection) +dDollDropoff_Enemy,(Put NME on the stand) (PRCNT% Chance) +dDollDropoff_EnemyHelpless,(Put NME on the stand) +rFurniture,"(This is a piece of bondage furniture)" +rFurnitureUse,"(You lock yourself in the furniture!)" +rFurnitureEnemyFail,"(The SPEAKER slips out of your grip|before you can lock her in place!)" +dFurniture_NPC,(Display one of your prisoners) +dFurniture_Use,(Lock yourself inside) +dFurniture_Talk,(Check the occupant) + +dFurniture_Enemy,(Try to lock NME into the furniture) (PRCNT% Chance) +rFurnitureEnemy,"(You close the furniture around your unfortunate victim!)" +KDFurnEnemyDisabled,"Stun or disable her first." +KDFurnNotClear,"Area isn't clear." +dFurniture_EnemyHelpless,(Secure NME into the furniture) +rFurnitureEnemyHelpless,"(You lock her into the furniture so that she stays in place)" + + rTableFood,"FOODMSG|(It invites you to partake in its culinary delights)" rTableFoodEat,"(You eat the food and feel your willpower rising)" rTableFoodEatFail,"(Being gagged as you are you cannot enjoy the food)" rTableFoodTake,"(You steal the food, hoping nobody will notice...)" -dTableFood_Eat,(Eat it to restore AMOUNT WP) +dTableFood_Eat,(Eat it to restore AMOUNT% WP) dTableFood_Take,(Take it!) KinkyDungeonFoodCookies,"(Someone left their cookies unattended)" @@ -9602,7 +13404,7 @@ rLeylineMapCancel,"(Are you sure?)|(This decision is permanent.)" dLeylineMap_Leave,(Gain +100 to Max Mana Pool) dLeylineMap_Cancel,(I don't want to.) dLeylineMapCancel_Leave,(Gain +100 to Max Mana Pool) -dLeylineMapCancel_Cancel,(No really, I don't want it!) +dLeylineMapCancel_Cancel,"(No really, I don't want it!)" rDollTerminal_Step,"(You find a strange elevator with a control panel inside)|(You get the impression this will take you somewhere.)" rDollTerminal_StepEnter,"(Are you sure?)|(This seems like a bad idea!)" @@ -9646,11 +13448,16 @@ KDShoutHelp3,You can hardly make a noise... KDArmorNoise,"*clink*" KinkyDungeonRemoteShock,You yelp as the EnemyName activates your RestraintName +KinkyDungeonRemoteShockEstim,You shudder as the EnemyName activates your RestraintName KDDialogueRemoteLinkCuffs,That should slow you down! KDDialogueRemoteLinkCuffsNevermere,Try running away now~ -KDDialogueRemoteLinkCuffsAncientRobot,Initiating prisoner lockdown protocol -KDMsgRemoteLinkCuffs,Your RestraintName suddenly snap together as the EnemyName activates them +KDDialogueRemoteLinkCuffsAncientRobot,Initiating prisoner lockdown protocol--Unknown hardware detected +KDDialogueRemoteLinkTether,What's this do? +KDDialogueRemoteLinkTetherNevermere,"That harness you're wearing is quite convenient for me~" +KDDialogueRemoteLinkTetherAncientRobot,Initiating prisoner lockdown protocol +KDMsgRemoteLinkCuffs,Your RestraintName suddenly snap together as the EnemyName activates them! +KDMsgRemoteLinkCHTether,Your harness projects energy tethers between your cuffs EnemyName activates it! TurnCounter,"Turn Count: " @@ -9665,10 +13472,12 @@ KDPlugMachine,Metallic arms insert something into you! KDChastityMachine,Metallic arms attach a chastity belt over your waist! KDTapeMachine,Metallic arms wrap you in tape! KDMetalMachine,Metallic arms wrap you in strict restraints! +KDDollMachine,Metallic arms install various cybernetic restraints! KDBearTrapHit,"You've sprung a trap! You've been stunned." KinkyDungeonSpellCastBearTrap,"The bandit leaves behind a sneaky trap..." KinkyDungeonSpellBearTrap,Damsel Trap +KinkyDungeonSpellBearTrapStrike,Damsel Trap KinkyDungeonSpellCastDollConvert,"The ENEMYNAME transforms nearby dolls into her subjects!" KinkyDungeonSpellCastDollConvertMany,"The ENEMYNAME transforms nearby dolls into her subjects!" @@ -9814,6 +13623,13 @@ RestraintCyberMuzzle,Doll Muzzle RestraintCyberMuzzleDesc,"A metallic shield preventing you from removing any gags underneath." RestraintCyberMuzzleDesc2,"It's made of exquisite Old Civilization metals, resistant to almost all forms of damage." +RestraintCyberMittens,Cyber Mittens +RestraintCyberMittensDesc,"These mittens force your hands into fists, keeping you from using them to do anything useful." +RestraintCyberMittensDesc2,"It is made of a strong mesh of ancient metallic fiber, kept in place with a metal band." +RestraintCyberLongMittens,Cyber Lockdown Mitts +RestraintCyberLongMittensDesc,"These long mittens force your hands into fists, keeping you from using them to do anything useful." +RestraintCyberLongMittensDesc2,"It is made of a strong mesh of ancient metallic fiber, wrapped snugly around your arms to make removal by yourself impossible." + RestraintCyberHeels,Doll Heels RestraintCyberHeelsDesc,"A pair of tall heels used to improve the aesthetics and controllability of dolls." RestraintCyberHeelsDesc2,"It's made of exquisite Old Civilization metals, resistant to almost all forms of damage." @@ -9822,7 +13638,7 @@ RestraintCyberBelt,Cyber Doll Belt RestraintCyberBeltDesc,"A chastity belt created by the Old Civilization. Truly a marvel of science!" RestraintCyberBeltDesc2,"It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with a advanced form of latex designed for permanent wear." RestraintCyberBra,Cyber Doll Bra -RestraintCyberBraDesc,"A chastity bra created by the Old Civilization. Truly a marvel of science!" +RestraintCyberBraDesc,"A chastity bra created by the Old Civilization. Truly a marvel of science! The flexible material over the breasts hardens when squeezed, unless allowed for by the program." RestraintCyberBraDesc2,"It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with an advanced form of latex designed for permanent wear." @@ -9832,15 +13648,17 @@ RestraintCyberDollJacketDesc2,"The material is somehow both stretchy yet hard en RestraintDollmakerVisor,Dollmaker's Visor -RestraintDollmakerVisorDesc,"A visor used by the Dollmaker for assigning arbitrary tasks to her dolls." +RestraintDollmakerVisorDesc,"A visor used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls." RestraintDollmakerVisorDesc2,"It's made of metallic glass, almost indestructible. Fortunately, it's still possible to see through." RestraintDollmakerMask,Dollmaker's Mask -RestraintDollmakerMaskDesc,"A mask used by the Dollmaker for assigning arbitrary tasks to her dolls." +RestraintDollmakerMaskDesc,"A mask used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls." RestraintDollmakerMaskDesc2,"It's made of metallic glass, almost indestructible. Fortunately, it's still possible to see through." KDControlHarnessTest,"Detected new hardware." KDControlHarnessCuffsUpdate,"[Restriction Protocol] Detected new hardware: RESTRAINTNAME. Install progress: PERCENT%" -KDControlHarnessCuffsActivate,"[Restriction Protocol] Installation complete. Engage mobility restrictions." +KDControlHarnessCuffsActivate,"[Restriction Protocol] Installation complete. Completing uniform." +KDControlHarnessCuffsLink,"[Punishment] Engage mobility restrictions." + KDControlHarnessChastityUpdate,"[Training Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT%" KDControlHarnessChastityMode_Extra,"Supplemental Stimulation" @@ -9866,4 +13684,13672 @@ KDPunishStruggle,Your struggling sets off your [RESTRAINTNAME] KDPunishAttack,Your attack sets off your [RESTRAINTNAME] KDHarnessGagRemoveBlindfold,The straps on your gag prevent you from loosening the blindfold! -KDHarnessGagStruggleBlindfold,The straps on your gag keep your blindfold securely in place! \ No newline at end of file +KDHarnessGagStruggleBlindfold,The straps on your gag keep your blindfold securely in place! + +KDWardrobeCancel,Revert +KDWardrobeCancelConfirm,Confirm Revert? +KDWardrobeSaveOutfit,Save +KDWardrobeSaveOutfitConfirm,Save Changes? +KDWardrobeSave,Back to Menu +KDWardrobeBackToWardrobe,Back to Wardrobe +KDConfirmStrip,Confirm Strip? +KDDressStrip,Strip! +KDCreateOutfit,Export Outfit +KDCreateAlwaysDress,Export AlwaysDress +KDCreateHair,Export Hair +KDCreateFace,Export Face +KDCreateCosplay,Export Cosplay + +KDColorSlidergamma,Gamma +KDColorSlidersaturation,Original Color +KDColorSlidercontrast,Contrast +KDColorSliderbrightness,Brightness +KDColorSliderred,Red +KDColorSlidergreen,Green +KDColorSliderblue,Blue +KDColorSlideralpha,Transparency +KDResetLayer,Reset Layer! +KDResetLayerProps,Reset Properties! +KDExportAllLayers,Export All Layers +KDExportAllProps,Export All Props +KDCopyLayer,Copy +KDPasteLayer,Paste + +KDTooltipItems,Items on Ground: + +KDLoading,"Preloading Character Assets: " + +cat_Worn,"Currently Worn" +cat_Uniforms,"Uniforms" +cat_Suits,"Suits" +cat_Armor,"Armor" +cat_Underwear,"Underwear" +cat_Bras,"Bras" +cat_Bodysuits,"Bodysuits" +cat_Socks,"Socks" +cat_Shoes,"Shoes" +cat_Tops,"Tops" +cat_Sleeves,"Sleeves" +cat_Corsets,"Corsets" +cat_Skirts,"Skirts" +cat_Pants,"Pants" +cat_Accessories,"Accessories" +cat_FashionRestraints,"Fashion Restraints" +cat_Hats,"Hats" +cat_Toys,"Toys and Piercings" +cat_Hairstyles,"Hairstyles" +cat_Face,"Face" +cat_Eyes,"Eyes" +cat_Mouth,"Mouth" +cat_Body,"Body" +cat_Gloves,"Gloves" +cat_Cosplay,"'Cosplay'" +cat_Weapon,"Weapons" + +m_KoiEyes,"Cat Eyes" +l_KoiEyes_Eyes,"Right Eye" +l_KoiEyes_Eyes2,"Left Eye" +m_KoiBrows,"Cat Brows" +l_KoiBrows_Brows,"Right Brow" +l_KoiBrows_Brows2,"Left Brow" +m_KoiMouth,"Simple Mouth" +l_KoiMouth_Mouth,"Mouth" +m_KoiBlush,"Simple Blush" +l_KoiBlush_Blush,"Blush" +m_Braid,"Braid" +l_Braid_Braid,"Braid Front" +l_Braid_BraidBack,"Braid Back" +m_BraidCustom,"Bangs Only" +l_BraidCustom_BraidCustom,"Bangs" +m_BraidCustomBack,"Braid+Back" +l_BraidCustomBack_BraidCustomBack,"Braid Upper" +l_BraidCustomBack_BraidCustomBraid,"Braid Lower" +m_BraidCustomBackNoBraid,"Back Only" +l_BraidCustomBackNoBraid_BraidCustomBack,"Braid Upper" +m_Ahoge,"Ahoge" +l_Ahoge_Ahoge,"Ahoge" +m_Body,"Body" +l_Body_Head,"Head" +l_Body_Torso,"Torso" +m_Catsuit,"Catsuit" +l_Catsuit_TorsoLower,"Torso Lower" +l_Catsuit_TorsoUpper,"Torso Upper" +m_Labcoat,"Labcoat" +l_Labcoat_Shoulders,"Shoulders" +l_Labcoat_ShouldersHogtie,"ShouldersHogtie" +l_Labcoat_Coat,"Coat" +l_Labcoat_CoatHogtieFree,"CoatHogtieFree" +l_Labcoat_Cape,"Cape" +m_Pauldrons,"Pauldrons" +l_Pauldrons_Pauldrons,"Pauldrons" +m_Breastplate,"Breastplate" +l_Breastplate_Breastplate,"Breastplate" +m_PlateBoots,"PlateBoots" +l_PlateBoots_BootLeft,"BootLeft" +l_PlateBoots_BootRight,"BootRight" +l_PlateBoots_BootRightKneel,"BootRightKneel" +l_PlateBoots_BootLeftHogtie,"BootLeftHogtie" +m_Gauntlets,"Gauntlets" +l_Gauntlets_GauntletLeft,"GauntletLeft" +l_Gauntlets_GauntletRight,"GauntletRight" +m_PlateArmor,"PlateArmor" +l_PlateArmor_Breastplate,"Breastplate" +l_PlateArmor_Pauldrons,"Pauldrons" +l_PlateArmor_BootLeft,"BootLeft" +l_PlateArmor_BootRight,"BootRight" +l_PlateArmor_BootRightKneel,"BootRightKneel" +l_PlateArmor_BootLeftHogtie,"BootLeftHogtie" +l_PlateArmor_GauntletLeft,"GauntletLeft" +l_PlateArmor_GauntletRight,"GauntletRight" +m_ChainShirt,"ChainShirt" +l_ChainShirt_ShirtChest,"ShirtChest" +l_ChainShirt_Shirt,"Shirt" +m_ChainSkirt,"ChainSkirt" +l_ChainSkirt_Skirt,"Skirt" +m_ChainArmor,"ChainArmor" +l_ChainArmor_ShirtChest,"ShirtChest" +l_ChainArmor_Shirt,"Shirt" +l_ChainArmor_Skirt,"Skirt" +m_BanditShorts,"BanditShorts" +l_BanditShorts_Shorts,"Shorts" +m_BanditLeftWrist,"BanditLeftWrist" +l_BanditLeftWrist_WristLeft,"WristLeft" +m_BanditRightWrist,"BanditRightWrist" +l_BanditRightWrist_WristRight,"WristRight" +m_BanditWrist,"BanditWrist" +l_BanditWrist_WristLeft,"WristLeft" +l_BanditWrist_WristRight,"WristRight" +m_BanditBoots,"BanditBoots" +l_BanditBoots_ShoeLeft,"ShoeLeft" +l_BanditBoots_ShoeRight,"ShoeRight" +l_BanditBoots_ShoeRightKneel,"ShoeRightKneel" +l_BanditBoots_ShoeLeftHogtie,"ShoeLeftHogtie" +m_BanditBreastplate,"BanditBreastplate" +l_BanditBreastplate_Breastplate,"Breastplate" +m_Bandit,"Bandit" +l_Bandit_Shorts,"Shorts" +l_Bandit_Breastplate,"Breastplate" +l_Bandit_WristLeft,"WristLeft" +l_Bandit_WristRight,"WristRight" +m_MaidSkirt,"Striped Skirt" +l_MaidSkirt_Skirt,"Skirt" +m_MaidApron,"MaidApron" +l_MaidApron_Apron,"Apron" +m_MaidBlouse,"MaidBlouse" +l_MaidBlouse_Blouse,"Blouse" +l_MaidBlouse_BlouseBust,"BlouseBust" +m_MaidBow,"MaidBow" +l_MaidBow_Bow,"Bow" +m_MaidCorset,"MaidCorset" +l_MaidCorset_Corset,"Corset" +m_MaidCorsetFull,"MaidCorsetFull" +l_MaidCorsetFull_Corset,"Corset" +l_MaidCorsetFull_CorsetStraps,"CorsetStraps" +m_MaidSockLeft,"MaidSockLeft" +l_MaidSockLeft_SockLeft,"SockLeft" +m_MaidSockRight,"MaidSockRight" +l_MaidSockRight_SockRight,"SockRight" +m_MaidShoes,"MaidShoes" +l_MaidShoes_ShoeLeft,"ShoeLeft" +l_MaidShoes_ShoeRight,"ShoeRight" +l_MaidShoes_ShoeRightKneel,"ShoeRightKneel" +l_MaidShoes_ShoeLeftHogtie,"ShoeLeftHogtie" +m_MaidSocks,"MaidSocks" +l_MaidSocks_SockRight,"SockRight" +l_MaidSocks_SockLeft,"SockLeft" +m_Maid,"Maidforce Agent" +l_Maid_Skirt,"Skirt" +l_Maid_Blouse,"Blouse" +l_Maid_BlouseBust,"BlouseBust" +l_Maid_Corset,"Corset" +l_Maid_CorsetStraps,"CorsetStraps" +l_Maid_SockRight,"SockRight" +l_Maid_SockLeft,"SockLeft" +l_Maid_ShoeLeft,"ShoeLeft" +l_Maid_ShoeRight,"ShoeRight" +l_Maid_ShoeRightKneel,"ShoeRightKneel" +l_Maid_ShoeLeftHogtie,"ShoeLeftHogtie" +l_Maid_Bow,"Bow" +m_Elf,"Elven" +m_Bunny,"Bunny Suit" +m_Dress,"Dress" +m_WitchBlouse,"WitchBlouse" +l_WitchBlouse_Blouse,"Blouse" +l_WitchBlouse_BlouseLiner,"BlouseLiner" +l_WitchBlouse_BlouseBust,"BlouseBust" +m_WitchCorset,"WitchCorset" +l_WitchCorset_Corset,"Corset" +m_WitchHat,"WitchHat" +l_WitchHat_WitchHat,"WitchHat" +l_WitchHat_WitchHatBack,"WitchHatBack" +m_ApprenticeHat,"ApprenticeHat" +l_ApprenticeHat_ApprenticeHat,"ApprenticeHat" +l_ApprenticeHat_ApprenticeHatPuff,"ApprenticeHatPuff" +m_WitchShoes,"WitchShoes" +l_WitchShoes_ShoeLeft,"ShoeLeft" +l_WitchShoes_ShoeRight,"ShoeRight" +l_WitchShoes_ShoeRightKneel,"ShoeRightKneel" +l_WitchShoes_ShoeLeftHogtie,"ShoeLeftHogtie" +m_WitchSkirt,"WitchSkirt" +l_WitchSkirt_Skirt,"Skirt" +l_WitchSkirt_SkirtBelt,"SkirtBelt" +l_WitchSkirt_SkirtRuffle,"SkirtRuffle" +m_Witch,"Witch" +l_Witch_Skirt,"Skirt" +l_Witch_SkirtBelt,"SkirtBelt" +l_Witch_SkirtRuffle,"SkirtRuffle" +l_Witch_Corset,"Corset" +l_Witch_Blouse,"Blouse" +l_Witch_BlouseLiner,"BlouseLiner" +l_Witch_BlouseBust,"BlouseBust" +l_Witch_WitchHat,"WitchHat" +l_Witch_WitchHatBack,"WitchHatBack" +l_Witch_ShoeLeft,"ShoeLeft" +l_Witch_ShoeRight,"ShoeRight" +l_Witch_ShoeRightKneel,"ShoeRightKneel" +l_Witch_ShoeLeftHogtie,"ShoeLeftHogtie" +m_WarriorBoots,"WarriorBoots" +l_WarriorBoots_ShoeLeft,"ShoeLeft" +l_WarriorBoots_ShoeRight,"ShoeRight" +l_WarriorBoots_ShoeRightKneel,"ShoeRightKneel" +l_WarriorBoots_ShoeLeftHogtie,"ShoeLeftHogtie" +m_SportsBra,"SportsBra" +l_SportsBra_Bra,"Bra" +m_WarriorBustier,"WarriorBustier" +l_WarriorBustier_BustierChest,"BustierChest" +l_WarriorBustier_Bustier,"Bustier" +m_WarriorBelt,"WarriorBelt" +l_WarriorBelt_Belt,"Belt" +m_DragonNecklace,"DragonNecklace" +l_DragonNecklace_Necklace,"Necklace" +m_DragonArmband,"DragonArmband" +l_DragonArmband_Armband,"Armband" +m_DragonCollar,"DragonCollar" +l_DragonCollar_Collar,"Collar" +m_WarriorSkirt,"WarriorSkirt" +l_WarriorSkirt_Skirt,"Skirt" +m_Dragonheart,"Dragonheart" +l_Dragonheart_Skirt,"Skirt" +l_Dragonheart_BustierChest,"BustierChest" +l_Dragonheart_Bustier,"Bustier" +l_Dragonheart_Belt,"Belt" +l_Dragonheart_Bra,"Bra" +l_Dragonheart_ShoeLeft,"ShoeLeft" +l_Dragonheart_ShoeRight,"ShoeRight" +l_Dragonheart_ShoeRightKneel,"ShoeRightKneel" +l_Dragonheart_ShoeLeftHogtie,"ShoeLeftHogtie" +l_Dragonheart_Collar,"Collar" +l_Dragonheart_Necklace,"Necklace" +l_Dragonheart_Armband,"Armband" +m_ZombieHat,"ZombieHat" +l_ZombieHat_ZombieHat,"ZombieHat" +l_ZombieHat_ZombieHatBand,"ZombieHatBand" +m_ZombieChestTalisman,"ZombieChestTalisman" +l_ZombieChestTalisman_ZombieChestTalisman,"ZombieChestTalisman" +m_ZombieTalisman,"ZombieTalisman" +l_ZombieTalisman_ZombieTalisman,"ZombieTalisman" +m_ZombieTalismanBent,"ZombieTalismanBent" +l_ZombieTalismanBent_ZombieTalismanBent,"ZombieTalismanBent" +m_Sandals,"Sandals" +l_Sandals_ShoeLeft,"ShoeLeft" +l_Sandals_ShoeRight,"ShoeRight" +l_Sandals_ShoeRightKneel,"ShoeRightKneel" +l_Sandals_ShoeLeftHogtie,"ShoeLeftHogtie" +m_RobeBra,"RobeBra" +l_RobeBra_Bra,"Bra" +m_RobeSleeveLeft,"RobeSleeveLeft" +l_RobeSleeveLeft_SleeveLeft,"SleeveLeft" +m_RobeSleeveRight,"RobeSleeveRight" +l_RobeSleeveRight_SleeveRight,"SleeveRight" +m_RobeSleeves,"RobeSleeves" +l_RobeSleeves_SleeveLeft,"SleeveLeft" +l_RobeSleeves_SleeveRight,"SleeveRight" +m_RobeSleeveDecoLeft,"RobeSleeveDecoLeft" +l_RobeSleeveDecoLeft_SleeveDecoLeft,"SleeveDecoLeft" +m_RobeSleeveDecoRight,"RobeSleeveDecoRight" +l_RobeSleeveDecoRight_SleeveDecoRight,"SleeveDecoRight" +m_RobeSleevesDeco,"RobeSleevesDeco" +l_RobeSleevesDeco_SleeveDecoLeft,"SleeveDecoLeft" +l_RobeSleevesDeco_SleeveDecoRight,"SleeveDecoRight" +m_Ribbon,"Ribbon" +l_Ribbon_RibbonBelt,"RibbonBelt" +l_Ribbon_RibbonBack,"RibbonBack" +m_RobeSkirt,"RobeSkirt" +l_RobeSkirt_Skirt,"Skirt" +m_Robes,"Robes" +l_Robes_ShoeLeft,"ShoeLeft" +l_Robes_ShoeRight,"ShoeRight" +l_Robes_ShoeRightKneel,"ShoeRightKneel" +l_Robes_ShoeLeftHogtie,"ShoeLeftHogtie" +l_Robes_SleeveLeft,"SleeveLeft" +l_Robes_SleeveRight,"SleeveRight" +l_Robes_SleeveDecoLeft,"SleeveDecoLeft" +l_Robes_SleeveDecoRight,"SleeveDecoRight" +l_Robes_Skirt,"Skirt" +l_Robes_Bra,"Bra" +l_Robes_RibbonBelt,"RibbonBelt" +l_Robes_RibbonBack,"RibbonBack" +m_RopeArms,"Arm Ropes" +l_RopeArms_ChestUpper,"Upper Chest Strap" +l_RopeArms_ShoulderStraps,"Shoulder Straps" +l_RopeArms_ChestLower,"Lower Chest Straps" +l_RopeArms_Arms,"Arm Straps" + +m_HairBow,HairBow +l_HairBow_Bow,Bow‎ +m_HairBowFrilly,HairBowFrilly +l_HairBowFrilly_Bow,Bow‎ +l_HairBowFrilly_BowFrills,BowFrills +m_Hairband,Hairband +l_Hairband_Hairband,Hairband +m_MaidHairband,MaidHairband +l_MaidHairband_Hairband,Hairband +l_MaidHairband_Frill,MaidFrill +m_BackStraight,BackStraight +l_BackStraight_BackStraight,BackStraight +m_Curly,Curly +l_Curly_Curly,Curly +l_Curly_Curly_Overstrap,Curly_Overstrap +m_Fluffy,Fluffy +l_Fluffy_Fuzzy,Fuzzy +l_Fluffy_Fuzzy_Overstrap,Fuzzy_Overstrap +m_FrontStraight,FrontStraight +l_FrontStraight_FrontStraight,FrontStraight +l_FrontStraight_FrontStraight_Overstrap,FrontStraight_Overstrap +m_Straight,Straight +l_Straight_Straight,Straight +l_Straight_Straight_Overstrap,Straight_Overstrap +m_StraightBangs,Long Straight +l_StraightBangs_StraightBangs,StraightBangs +l_StraightBangs_StraightBangs_Overstrap,StraightBangs_Overstrap +m_MessyBack,Curly Back +l_MessyBack_Messy,Messy +m_ShortMessyBack,MessyBackShort +l_ShortMessyBack_BackShortMessy,"Short Messy" +l_ShortMessyBack_BackShortMessyUnderlight,"Underlight" +m_ShortCurlyBack,CurlyBack +l_ShortCurlyBack_BackShortCurly,"Curly Back" +l_ShortCurlyBack_BackShortCurlyUnderlight,"Underlight" +m_Ponytail,Ponytail +l_Ponytail_Ponytail,Ponytail +m_FluffyPonytail,FluffyPonytail +l_FluffyPonytail_Ponytail2,Ponytail2 +m_TwintailLeft,TwintailLeft +l_TwintailLeft_TwintailLeft,TwintailLeft +m_TwintailRight,TwintailRight +l_TwintailRight_TwintailRight,TwintailRight +m_Ahoge_l_Ahoge,Ahoge +m_Body_l_Head,Head +m_Body_l_ArmRight,ArmRight +m_Body_l_ArmLeft,ArmLeft +m_Body_l_ShoulderRight,ShoulderRight +m_Body_l_ShoulderLeft,ShoulderLeft +m_Body_l_ForeArmRight,ForeArmRight +m_Body_l_ForeArmLeft,ForeArmLeft +m_Body_l_HandRight,HandRight +m_Body_l_HandLeft,HandLeft +m_Body_l_ForeHandRight,ForeHandRight +m_Body_l_ForeHandLeft,ForeHandLeft +m_Body_l_LegLeft,LegLeft +m_Body_l_Torso,Torso +m_Body_l_Chest,Chest +m_Body_l_FootRightKneel,FootRightKneel +m_Body_l_FootLeftHogtie,FootLeftHogtie +m_Body_l_LegRight,LegRight +m_Body_l_Butt,Butt +m_KoiEyes_l_Eyes,Eyes +l_KoiEyes_Eyes2,Eyes2 +l_KoiEyes_Whites,Whites +l_KoiEyes_Whites2,Whites2 +m_HumanEyes,HumanEyes +l_HumanEyes_Eyes,"Right Eye" +l_HumanEyes_Eyes2,"Left Eye" +l_HumanEyes_Whites,Whites +l_HumanEyes_Whites2,Whites2 +m_KoiBrows_l_Brows,Brows +m_KoiBrows_l_Brows2,Brows2 +m_KoiMouth_l_Mouth,Mouth +m_KoiBlush_l_Blush,Blush +m_KjusEyes,KjusEyes +l_KjusEyes_Eyes,"Right Eye" +l_KjusEyes_Eyes2,"Left Eye" +l_KjusEyes_Whites,Whites +l_KjusEyes_Whites2,Whites2 +m_KjusBrows,KjusBrows +l_KjusBrows_Brows,"Right Brow" +l_KjusBrows_Brows2,"Left Brow" +m_KjusMouth,KjusMouth +l_KjusMouth_Mouth,Mouth +m_KjusBlush,KjusBlush +l_KjusBlush_Blush,Blush +m_DaskBrows,Hikimayu +l_DaskBrows_Brows,"Right Brow" +l_DaskBrows_Brows2,"Left Brow" +m_DaskEyes,DaskEyes +l_DaskEyes_Eyes,"Right Eye" +l_DaskEyes_Eyes2,"Left Eye" +l_DaskEyes_Whites,Whites +l_DaskEyes_Whites2,Whites2 +m_ElfEars,ElfEars +l_ElfEars_ElfFront,ElfFront +l_ElfEars_ElfBack,ElfBack +m_ElfEarsLong,ElfEarsLong +l_ElfEarsLong_ElfLongFront,ElfLongFront +l_ElfEarsLong_ElfLongBack,ElfLongBack +m_ElfEarsFloppy,ElfEarsFloppy +l_ElfEarsFloppy_ElfFloppyFront,ElfFloppyFront +l_ElfEarsFloppy_ElfFloppyBack,ElfFloppyBack +m_ElfEarrings,ElfEarrings +l_ElfEarrings_ElfEarringsFront,ElfEarringsFront +l_ElfEarrings_ElfEarringsBack,ElfEarringsBack +m_Earrings,Earrings +l_Earrings_Earrings,Earrings +l_Earrings_EarringsBack,EarringsBack +m_BunnyEars,BunnyEars +l_BunnyEars_Ears,Ears +l_BunnyEars_InnerEars,EarsInner +m_KittyEars,KittyEars +l_KittyEars_Ears,Kitty +l_KittyEars_InnerEars,KittyInner +m_WolfEars,WolfEars +l_WolfEars_Ears,Wolf +l_WolfEars_InnerEars,WolfInner +m_FoxEars,FoxEars +l_FoxEars_Ears,Fox +l_FoxEars_InnerEars,FoxInner +m_WolfTail,WolfTail +l_WolfTail_Tail,Wolf +m_KittyTail,KittyTail +l_KittyTail_Tail,Kitty +m_Kitty2Tail,Kitty2Tail +l_Kitty2Tail_Tail1,Kitty +l_Kitty2Tail_Tail2,Kitty2 +m_FoxTail,FoxTail +l_FoxTail_Tail,Fox +m_Fox2Tail,Fox2Tail +l_Fox2Tail_Tail1,Fox +l_Fox2Tail_Tail2,Fox2 +m_Fox3Tail,Fox3Tail +l_Fox3Tail_Tail,Fox3 +m_Fox4Tail,Fox4Tail +l_Fox4Tail_Tail,Fox4 +m_Fox5Tail,Fox5Tail +l_Fox5Tail_Tail,Fox5 +m_Fox6Tail,Fox6Tail +l_Fox6Tail_Tail,Fox6 +m_Fox7Tail,Fox7Tail +l_Fox7Tail_Tail,Fox7 +m_CatsuitLower,CatsuitLower +m_CatsuitLower_l_TorsoLower,TorsoLower +m_CatsuitLower_l_FootRight,FootRight +m_CatsuitLower_l_FootRightKneel,FootRightKneel +m_CatsuitLower_l_FootLeft,FootLeft +m_CatsuitLower_l_FootLeftHogtie,FootLeftHogtie +m_CatsuitLower_l_LegRight,LegRight +m_CatsuitLower_l_LegLeft,LegLeft +m_CatsuitLower_l_Butt,Butt +m_CatsuitUpper,CatsuitUpper +m_CatsuitUpper_l_ArmRight,ArmRight +m_CatsuitUpper_l_ArmLeft,ArmLeft +m_CatsuitUpper_l_ShoulderRight,ShoulderRight +m_CatsuitUpper_l_ShoulderLeft,ShoulderLeft +m_CatsuitUpper_l_ForeArmRight,ForeArmRight +m_CatsuitUpper_l_ForeArmLeft,ForeArmLeft +m_CatsuitUpper_l_HandRight,HandRight +m_CatsuitUpper_l_HandLeft,HandLeft +m_CatsuitUpper_l_ForeHandRight,ForeHandRight +m_CatsuitUpper_l_ForeHandLeft,ForeHandLeft +m_CatsuitUpper_l_TorsoUpper,TorsoUpper +m_CatsuitUpper_l_Chest,Chest +m_Catsuit_l_ArmRight,ArmRight +m_Catsuit_l_ArmLeft,ArmLeft +m_Catsuit_l_ShoulderRight,ShoulderRight +m_Catsuit_l_ShoulderLeft,ShoulderLeft +m_Catsuit_l_ForeArmRight,ForeArmRight +m_Catsuit_l_ForeArmLeft,ForeArmLeft +m_Catsuit_l_HandRight,HandRight +m_Catsuit_l_HandLeft,HandLeft +m_Catsuit_l_ForeHandRight,ForeHandRight +m_Catsuit_l_ForeHandLeft,ForeHandLeft +m_Catsuit_l_TorsoUpper,TorsoUpper +m_Catsuit_l_Chest,Chest +m_Catsuit_l_TorsoLower,TorsoLower +m_Catsuit_l_FootRight,FootRight +m_Catsuit_l_FootRightKneel,FootRightKneel +m_Catsuit_l_FootLeft,FootLeft +m_Catsuit_l_FootLeftHogtie,FootLeftHogtie +m_Catsuit_l_LegRight,LegRight +m_Catsuit_l_LegLeft,LegLeft +m_Catsuit_l_Butt,Butt +m_TransparentCatsuit,TransparentCatsuit +m_TransparentCatsuit_l_ArmRight,ArmRight +m_TransparentCatsuit_l_ArmLeft,ArmLeft +m_TransparentCatsuit_l_ShoulderRight,ShoulderRight +m_TransparentCatsuit_l_ShoulderLeft,ShoulderLeft +m_TransparentCatsuit_l_ForeArmRight,ForeArmRight +m_TransparentCatsuit_l_ForeArmLeft,ForeArmLeft +m_TransparentCatsuit_l_HandRight,HandRight +m_TransparentCatsuit_l_HandLeft,HandLeft +m_TransparentCatsuit_l_ForeHandRight,ForeHandRight +m_TransparentCatsuit_l_ForeHandLeft,ForeHandLeft +m_TransparentCatsuit_l_TorsoUpper,TorsoUpper +m_TransparentCatsuit_l_Chest,Chest +m_TransparentCatsuit_l_TorsoLower,TorsoLower +m_TransparentCatsuit_l_FootRight,FootRight +m_TransparentCatsuit_l_FootRightKneel,FootRightKneel +m_TransparentCatsuit_l_FootLeft,FootLeft +m_TransparentCatsuit_l_FootLeftHogtie,FootLeftHogtie +m_TransparentCatsuit_l_LegRight,LegRight +m_TransparentCatsuit_l_LegLeft,LegLeft +m_TransparentCatsuit_l_Butt,Butt +m_Labcoat_l_Shoulders,Shoulders +m_Labcoat_l_ShouldersHogtie,ShouldersHogtie +m_Labcoat_l_Coat,Coat +m_Labcoat_l_CoatHogtieFree,CoatHogtieFree +m_Labcoat_l_Cape,Cape +m_Cape,Cape +m_Cape_l_Shoulders,Shoulders +m_Cape_l_ShouldersHogtie,ShouldersHogtie +m_Cape_l_Cape,Cape +m_Pauldrons_l_Pauldrons,Pauldrons +m_Breastplate_l_Breastplate,Breastplate +m_PlateBoots_l_BootLeft,BootLeft +m_PlateBoots_l_BootRight,BootRight +m_PlateBoots_l_BootRightKneel,BootRightKneel +m_PlateBoots_l_BootLeftHogtie,BootLeftHogtie +m_GauntletLeft,GauntletLeft +m_GauntletLeft_l_GauntletLeft,GauntletLeft +m_GauntletRight,GauntletRight +m_GauntletRight_l_GauntletRight,GauntletRight +m_Gauntlets_l_GauntletRight,GauntletRight +m_Gauntlets_l_GauntletLeft,GauntletLeft +m_PlateArmor_l_Breastplate,Breastplate +m_PlateArmor_l_Pauldrons,Pauldrons +m_PlateArmor_l_BootLeft,BootLeft +m_PlateArmor_l_BootRight,BootRight +m_PlateArmor_l_BootRightKneel,BootRightKneel +m_PlateArmor_l_BootLeftHogtie,BootLeftHogtie +m_PlateArmor_l_GauntletRight,GauntletRight +m_PlateArmor_l_GauntletLeft,GauntletLeft +m_ChainShirt_l_Shirt,Shirt +m_ChainShirt_l_ShirtChest,ShirtChest +m_ChainSkirt_l_Skirt,Skirt +m_ChainArmor_l_Shirt,Shirt +m_ChainArmor_l_ShirtChest,ShirtChest +m_ChainArmor_l_Skirt,Skirt +m_BanditShorts_l_Shorts,Shorts +m_BanditShorts_l_ShortsLeft,ShortsLeft +m_BanditPouch,BanditPouch +m_BanditPouch_l_Pouch,Pouch +m_BanditKnee,BanditKnee +m_BanditKnee_l_Knee,Knee +m_BanditChoker,BanditChoker +m_BanditChoker_l_Choker,Choker +m_BanditLeftWrist_l_WristLeft,WristLeft +m_BanditRightWrist_l_WristRight,WristRight +m_BanditWrist_l_WristLeft,WristLeft +m_BanditWrist_l_WristRight,WristRight +m_BanditBoots_l_ShoeLeft,ShoeLeft +m_BanditBoots_l_ShoeRight,ShoeRight +m_BanditBoots_l_ShoeRightKneel,ShoeRightKneel +m_BanditBoots_l_ShoeLeftHogtie,ShoeLeftHogtie +m_BanditBreastplate_l_Breastplate,Breastplate +m_Bandit_l_Shorts,Shorts +m_Bandit_l_ShortsLeft,ShortsLeft +m_Bandit_l_Breastplate,Breastplate +m_Bandit_l_WristLeft,WristLeft +m_Bandit_l_WristRight,WristRight +m_Bandit_l_Pouch,Pouch +m_Bandit_l_Knee,Knee +m_Bandit_l_Choker,Choker +m_MaidSkirt_l_Skirt,Skirt +m_MaidSkirt_l_Stripe,Stripe +m_MaidSkirt_l_SkirtOver,SkirtOver +m_MaidSkirt_l_StripeOver,StripeOver +m_MaidApron_l_Apron,Apron +m_MaidBlouse_l_Blouse,Blouse +m_MaidBlouse_l_BlouseBust,BlouseBust +m_MaidBow_l_Bow,Bow +m_MaidCorset_l_Corset,Corset +m_MaidCorsetFull_l_Corset,Corset +m_MaidCorsetFull_l_CorsetStraps,CorsetStraps +m_StockingLeft,StockingLeft +m_StockingLeft_l_SockLeft,SockLeft +m_StockingLeft_l_FootSockLeftHogtie,FootSockLeftHogtie +m_StockingLeft_l_StripeSockLeft,StripeSockLeft +m_StockingRight,StockingRight +m_StockingRight_l_SockRight,SockRight +m_StockingRight_l_FootSockRightKneel,FootSockRightKneel +m_StockingRight_l_StripeSockRight,StripeSockRight +m_MaidSockLeft_l_SockLeft,SockLeft +m_MaidSockLeft_l_FootSockLeftHogtie,FootSockLeftHogtie +m_MaidSockLeft_l_StripeSockLeft,StripeSockLeft +m_MaidSockRight_l_SockRight,SockRight +m_MaidSockRight_l_FootSockRightKneel,FootSockRightKneel +m_MaidSockRight_l_StripeSockRight,StripeSockRight +m_MaidShoes_l_ShoeLeft,ShoeLeft +m_MaidShoes_l_ShoeRight,ShoeRight +m_MaidShoes_l_ShoeRightKneel,ShoeRightKneel +m_MaidShoes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Stockings,Stockings +m_Stockings_l_SockRight,SockRight +m_Stockings_l_FootSockRightKneel,FootSockRightKneel +m_Stockings_l_StripeSockRight,StripeSockRight +m_Stockings_l_SockLeft,SockLeft +m_Stockings_l_FootSockLeftHogtie,FootSockLeftHogtie +m_Stockings_l_StripeSockLeft,StripeSockLeft +m_MaidSocks_l_SockRight,SockRight +m_MaidSocks_l_FootSockRightKneel,FootSockRightKneel +m_MaidSocks_l_StripeSockRight,StripeSockRight +m_MaidSocks_l_SockLeft,SockLeft +m_MaidSocks_l_FootSockLeftHogtie,FootSockLeftHogtie +m_MaidSocks_l_StripeSockLeft,StripeSockLeft +m_Maid_l_Skirt,Skirt +m_Maid_l_Stripe,Stripe +m_Maid_l_SkirtOver,SkirtOver +m_Maid_l_StripeOver,StripeOver +m_Maid_l_Blouse,Blouse +m_Maid_l_BlouseBust,BlouseBust +m_Maid_l_Corset,Corset +m_Maid_l_CorsetStraps,CorsetStraps +m_Maid_l_SockRight,SockRight +m_Maid_l_FootSockRightKneel,FootSockRightKneel +m_Maid_l_StripeSockRight,StripeSockRight +m_Maid_l_SockLeft,SockLeft +m_Maid_l_FootSockLeftHogtie,FootSockLeftHogtie +m_Maid_l_StripeSockLeft,StripeSockLeft +m_Maid_l_ShoeLeft,ShoeLeft +m_Maid_l_ShoeRight,ShoeRight +m_Maid_l_ShoeRightKneel,ShoeRightKneel +m_Maid_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Maid_l_Bow,Bow +m_Maid_l_BowFrills,BowFrills +m_WitchBlouse_l_BlouseLeft,BlouseLeft +m_WitchBlouse_l_BlouseRight,BlouseRight +m_WitchBlouse_l_BlouseLiner,BlouseLiner +m_WitchBlouse_l_BlouseBust,BlouseBust +m_WitchCorset_l_Corset,Corset +m_WitchHat_l_WitchHat,WitchHat +m_WitchHat_l_WitchHatBack,WitchHatBack +m_ApprenticeHat_l_ApprenticeHat,ApprenticeHat +m_ApprenticeHat_l_ApprenticeHatPuff,ApprenticeHatPuff +m_WitchShoes_l_ShoeLeft,ShoeLeft +m_WitchShoes_l_ShoeRight,ShoeRight +m_WitchShoes_l_ShoeRightKneel,ShoeRightKneel +m_WitchShoes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_WitchSkirt_l_Skirt,Skirt +m_WitchSkirt_l_SkirtOver,SkirtOver +m_WitchSkirt_l_SkirtRuffleOver,SkirtRuffleOver +m_WitchSkirt_l_SkirtBelt,SkirtBelt +m_WitchSkirt_l_SkirtRuffle,SkirtRuffle +m_Witch_l_Skirt,Skirt +m_Witch_l_SkirtOver,SkirtOver +m_Witch_l_SkirtRuffleOver,SkirtRuffleOver +m_Witch_l_SkirtBelt,SkirtBelt +m_Witch_l_SkirtRuffle,SkirtRuffle +m_Witch_l_Corset,Corset +m_Witch_l_BlouseLeft,BlouseLeft +m_Witch_l_BlouseRight,BlouseRight +m_Witch_l_BlouseLiner,BlouseLiner +m_Witch_l_BlouseBust,BlouseBust +m_Witch_l_WitchHat,WitchHat +m_Witch_l_WitchHatBack,WitchHatBack +m_Witch_l_ShoeLeft,ShoeLeft +m_Witch_l_ShoeRight,ShoeRight +m_Witch_l_ShoeRightKneel,ShoeRightKneel +m_Witch_l_ShoeLeftHogtie,ShoeLeftHogtie +m_WarriorBoots_l_ShoeLeft,ShoeLeft +m_WarriorBoots_l_ShoeRight,ShoeRight +m_WarriorBoots_l_ShoeRightKneel,ShoeRightKneel +m_WarriorBoots_l_ShoeLeftHogtie,ShoeLeftHogtie +m_SportsBra_l_Bra,Bra +m_WarriorBustier_l_Bustier,Bustier +m_WarriorBustier_l_BustierChest,BustierChest +m_LeatherGloveLeft,LeatherGloveLeft +m_LeatherGloveLeft_l_GloveLeft,GloveLeft +m_LeatherGloveLeft_l_ForeGloveLeft,ForeGloveLeft +m_LeatherGloveLeft_l_RimGloveLeft,RimGloveLeft +m_LeatherGloveLeft_l_RimForeGloveLeft,RimForeGloveLeft +m_LeatherGloveLeft_l_BandGloveLeft,BandGloveLeft +m_LeatherGloveLeft_l_BandForeGloveLeft,BandForeGloveLeft +m_LeatherGloveRight,LeatherGloveRight +m_LeatherGloveRight_l_GloveRight,GloveRight +m_LeatherGloveRight_l_ForeGloveRight,ForeGloveRight +m_LeatherGloveRight_l_RimGloveRight,RimGloveRight +m_LeatherGloveRight_l_RimForeGloveRight,RimForeGloveRight +m_LeatherGloveRight_l_BandGloveRight,BandGloveRight +m_LeatherGloveRight_l_BandForeGloveRight,BandForeGloveRight +m_LeatherGloves,LeatherGloves +m_LeatherGloves_l_GloveLeft,GloveLeft +m_LeatherGloves_l_ForeGloveLeft,ForeGloveLeft +m_LeatherGloves_l_RimGloveLeft,RimGloveLeft +m_LeatherGloves_l_RimForeGloveLeft,RimForeGloveLeft +m_LeatherGloves_l_BandGloveLeft,BandGloveLeft +m_LeatherGloves_l_BandForeGloveLeft,BandForeGloveLeft +m_LeatherGloves_l_GloveRight,GloveRight +m_LeatherGloves_l_ForeGloveRight,ForeGloveRight +m_LeatherGloves_l_RimGloveRight,RimGloveRight +m_LeatherGloves_l_RimForeGloveRight,RimForeGloveRight +m_LeatherGloves_l_BandGloveRight,BandGloveRight +m_LeatherGloves_l_BandForeGloveRight,BandForeGloveRight +m_WarriorBelt_l_Belt,Belt +m_DragonNecklace_l_Necklace,Necklace +m_DragonArmband_l_Armband,Armband +m_DragonCollar_l_Collar,Collar +m_WarriorSkirt_l_Skirt,Skirt +m_WarriorSkirt_l_SkirtOver,SkirtOver +m_Dragonheart_l_Skirt,Skirt +m_Dragonheart_l_SkirtOver,SkirtOver +m_Dragonheart_l_Bustier,Bustier +m_Dragonheart_l_BustierChest,BustierChest +m_Dragonheart_l_Belt,Belt +m_Dragonheart_l_Bra,Bra +m_Dragonheart_l_ShoeLeft,ShoeLeft +m_Dragonheart_l_ShoeRight,ShoeRight +m_Dragonheart_l_ShoeRightKneel,ShoeRightKneel +m_Dragonheart_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Dragonheart_l_Collar,Collar +m_Dragonheart_l_Necklace,Necklace +m_Dragonheart_l_Armband,Armband +m_ZombieHat_l_ZombieHat,ZombieHat +m_ZombieHat_l_ZombieHatBand,ZombieHatBand +m_ZombieChestTalisman_l_ZombieChestTalisman,ZombieChestTalisman +m_ZombieTalisman_l_ZombieTalisman,ZombieTalisman +m_ZombieTalismanBent_l_ZombieTalismanBent,ZombieTalismanBent +m_Sandals_l_ShoeLeft,ShoeLeft +m_Sandals_l_ShoeRight,ShoeRight +m_Sandals_l_ShoeRightKneel,ShoeRightKneel +m_Sandals_l_ShoeLeftHogtie,ShoeLeftHogtie +m_RobeBra_l_Bra,Bra +m_RobeBra_l_Chest,Chest +m_RobeSleeveLeft_l_SleeveLeft,SleeveLeft +m_RobeSleeveRight_l_SleeveRight,SleeveRight +m_RobeSleeves_l_SleeveLeft,SleeveLeft +m_RobeSleeves_l_SleeveRight,SleeveRight +m_RobeSleeveDecoLeft_l_SleeveDecoLeft,SleeveDecoLeft +m_RobeSleeveDecoRight_l_SleeveDecoRight,SleeveDecoRight +m_RobeSleevesDeco_l_SleeveDecoLeft,SleeveDecoLeft +m_RobeSleevesDeco_l_SleeveDecoRight,SleeveDecoRight +m_Ribbon_l_RibbonBelt,RibbonBelt +m_Ribbon_l_RibbonBack,RibbonBack +m_Ribbon_l_RibbonFarBack,RibbonFarBack +m_RobeSkirt_l_Skirt,Skirt +m_RobeSkirt_l_SkirtOver,SkirtOver +m_Robes_l_ShoeLeft,ShoeLeft +m_Robes_l_ShoeRight,ShoeRight +m_Robes_l_ShoeRightKneel,ShoeRightKneel +m_Robes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Robes_l_SleeveLeft,SleeveLeft +m_Robes_l_SleeveRight,SleeveRight +m_Robes_l_SleeveDecoLeft,SleeveDecoLeft +m_Robes_l_SleeveDecoRight,SleeveDecoRight +m_Robes_l_Skirt,Skirt +m_Robes_l_SkirtOver,SkirtOver +m_Robes_l_Bra,Bra +m_Robes_l_Chest,Chest +m_Robes_l_RibbonBelt,RibbonBelt +m_Robes_l_RibbonBack,RibbonBack +m_Robes_l_RibbonFarBack,RibbonFarBack +m_KiguMask,KiguMask +m_KiguMask_l_Mask,Mask +m_KiguMask_l_Eyes,Eyes +m_KiguMask_l_Eyes2,Eyes2 +m_KiguMask_l_Lock,Lock +m_KiguMask_l_EyesWhites,EyesWhites +m_KiguMask_l_Mouth,Mouth +m_Swimsuit,Swimsuit +m_Swimsuit_l_Swimsuit,Swimsuit +m_Swimsuit_l_SwimsuitChest,SwimsuitChest +m_StrappyBra,StrappyBra +m_StrappyBra_l_ChestStrappy,ChestStrappy +m_VBikini,VBikini +m_VBikini_l_VBikini,VBikini +m_StrappyBikini,StrappyBikini +m_StrappyBikini_l_StrappyLower,StrappyLower +m_StrappyHarness,StrappyHarness +m_StrappyHarness_l_Strappy,Strappy +m_StrappySwimsuit,StrappySwimsuit +m_StrappySwimsuit_l_ChestStrappy,ChestStrappy +m_StrappySwimsuit_l_Strappy,Strappy +m_StrappySwimsuit_l_StrappyLower,StrappyLower +m_BunnySockLeft,BunnySockLeft +m_BunnySockLeft_l_SockLeft,SockLeft +m_BunnySockLeft_l_FootSockLeftHogtie,FootSockLeftHogtie +m_BunnySockRight,BunnySockRight +m_BunnySockRight_l_SockRight,SockRight +m_BunnySockRight_l_FootSockRightKneel,FootSockRightKneel +m_BunnySocks,BunnySocks +m_BunnySocks_l_SockRight,SockRight +m_BunnySocks_l_FootSockRightKneel,FootSockRightKneel +m_BunnySocks_l_SockLeft,SockLeft +m_BunnySocks_l_FootSockLeftHogtie,FootSockLeftHogtie +m_BunnySocksRestraint,BunnySocksRestraint +m_BunnySocksRestraint_l_SockRight,SockRight +m_BunnySocksRestraint_l_FootSockRightKneel,FootSockRightKneel +m_BunnySocksRestraint_l_SockLeft,SockLeft +m_BunnySocksRestraint_l_FootSockLeftHogtie,FootSockLeftHogtie +m_BunnyGloveLeft,BunnyGloveLeft +m_BunnyGloveLeft_l_GloveLeft,GloveLeft +m_BunnyGloveLeft_l_ForeGloveLeft,ForeGloveLeft +m_BunnyGloveRight,BunnyGloveRight +m_BunnyGloveRight_l_GloveRight,GloveRight +m_BunnyGloveRight_l_ForeGloveRight,ForeGloveRight +m_BunnyGloves,BunnyGloves +m_BunnyGloves_l_GloveLeft,GloveLeft +m_BunnyGloves_l_ForeGloveLeft,ForeGloveLeft +m_BunnyGloves_l_GloveRight,GloveRight +m_BunnyGloves_l_ForeGloveRight,ForeGloveRight +m_BunnyGlovesRestraint,BunnyGlovesRestraint +m_BunnyGlovesRestraint_l_GloveLeft,GloveLeft +m_BunnyGlovesRestraint_l_ForeGloveLeft,ForeGloveLeft +m_BunnyGlovesRestraint_l_GloveRight,GloveRight +m_BunnyGlovesRestraint_l_ForeGloveRight,ForeGloveRight +m_BunnyLeotard,BunnyLeotard +m_BunnyLeotard_l_Leotard,Leotard +m_BunnyLeotard_l_LeotardChest,LeotardChest +m_Bunny_l_Leotard,Leotard +m_Bunny_l_LeotardChest,LeotardChest +m_Bunny_l_GloveLeft,GloveLeft +m_Bunny_l_ForeGloveLeft,ForeGloveLeft +m_Bunny_l_GloveRight,GloveRight +m_Bunny_l_ForeGloveRight,ForeGloveRight +m_Bunny_l_SockRight,SockRight +m_Bunny_l_FootSockRightKneel,FootSockRightKneel +m_Bunny_l_SockLeft,SockLeft +m_Bunny_l_FootSockLeftHogtie,FootSockLeftHogtie +m_LaceCorset,LaceCorset +m_LaceCorset_l_LaceCorset,LaceCorset +m_LaceCorset_l_LaceCorsetHardware,LaceCorsetHardware +m_LaceCorset_l_LaceCorsetStripes,LaceCorsetStripes +m_LaceCorset_l_LaceCorsetCrystal,LaceCorsetCrystal +m_LaceBra,LaceBra +m_LaceBra_l_LaceChest,LaceChest +m_LaceBra_l_LaceChestCups,LaceChestCups +m_LaceBra_l_LaceChestStripes,LaceChestStripes +m_LaceBustier,LaceBustier +m_LaceBustier_l_LaceChest,LaceChest +m_LaceBustier_l_LaceChestCups,LaceChestCups +m_LaceBustier_l_LaceChestStripes,LaceChestStripes +m_LaceDeco,LaceDeco +m_LaceDeco_l_LaceChestDeco,LaceChestDeco +m_LaceDeco_l_LaceChestDecoCrystal,LaceChestDecoCrystal +m_LaceDeco_l_LaceChestDecoHardware,LaceChestDecoHardware +m_LaceBraDeco,LaceBraDeco +m_LaceBraDeco_l_LaceChest,LaceChest +m_LaceBraDeco_l_LaceChestCups,LaceChestCups +m_LaceBraDeco_l_LaceChestStripes,LaceChestStripes +m_LaceBraDeco_l_LaceChestDeco,LaceChestDeco +m_LaceBraDeco_l_LaceChestDecoCrystal,LaceChestDecoCrystal +m_LaceBraDeco_l_LaceChestDecoHardware,LaceChestDecoHardware +m_LaceCorsetRestraint,LaceCorsetRestraint +m_LaceCorsetRestraint_l_LaceCorset,LaceCorset +m_LaceCorsetRestraint_l_LaceCorsetHardware,LaceCorsetHardware +m_LaceCorsetRestraint_l_LaceCorsetStripes,LaceCorsetStripes +m_LaceCorsetRestraint_l_LaceCorsetCrystal,LaceCorsetCrystal +m_LaceBustierRestraint,LaceBustierRestraint +m_LaceBustierRestraint_l_LaceChest,LaceChest +m_LaceBustierRestraint_l_LaceChestCups,LaceChestCups +m_LaceBustierRestraint_l_LaceChestStripes,LaceChestStripes +m_LaceBraDecoRestraint,LaceBraDecoRestraint +m_LaceBraDecoRestraint_l_LaceChest,LaceChest +m_LaceBraDecoRestraint_l_LaceChestCups,LaceChestCups +m_LaceBraDecoRestraint_l_LaceChestStripes,LaceChestStripes +m_LaceBraDecoRestraint_l_LaceChestDeco,LaceChestDeco +m_LaceBraDecoRestraint_l_LaceChestDecoCrystal,LaceChestDecoCrystal +m_LaceBraDecoRestraint_l_LaceChestDecoHardware,LaceChestDecoHardware +m_BowCorsetBow,BowCorsetBow +m_BowCorsetBow_l_BowCorsetBow,BowCorsetBow +m_BowCorsetBust,BowCorsetBust +m_BowCorsetBust_l_BowCorsetBust,BowCorsetBust +m_BowCorsetBust_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetBustBow,BowCorsetBustBow +m_BowCorsetBustBow_l_BowCorsetBust,BowCorsetBust +m_BowCorsetBustBow_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorset,BowCorset +m_BowCorset_l_BowCorset,BowCorset +m_BowCorset_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetLong,BowCorsetLong +m_BowCorsetLong_l_BowCorsetLong,BowCorsetLong +m_BowCorsetLong_l_BowCorsetLongRuffle,BowCorsetLongRuffle +m_BowCorsetOverbust,BowCorsetOverbust +m_BowCorsetOverbust_l_BowCorsetBust,BowCorsetBust +m_BowCorsetOverbust_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetOverbust_l_BowCorset,BowCorset +m_BowCorsetOverbust_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetLongOverbust,BowCorsetLongOverbust +m_BowCorsetLongOverbust_l_BowCorsetBust,BowCorsetBust +m_BowCorsetLongOverbust_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetLongOverbust_l_BowCorsetLong,BowCorsetLong +m_BowCorsetLongOverbust_l_BowCorsetLongRuffle,BowCorsetLongRuffle +m_BowCorsetOverbustBow,BowCorsetOverbustBow +m_BowCorsetOverbustBow_l_BowCorsetBust,BowCorsetBust +m_BowCorsetOverbustBow_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetOverbustBow_l_BowCorset,BowCorset +m_BowCorsetOverbustBow_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetOverbustBow_l_BowCorsetBow,BowCorsetBow +m_BowCorsetLongOverbustBow,BowCorsetLongOverbustBow +m_BowCorsetLongOverbustBow_l_BowCorsetBust,BowCorsetBust +m_BowCorsetLongOverbustBow_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetLongOverbustBow_l_BowCorsetLong,BowCorsetLong +m_BowCorsetLongOverbustBow_l_BowCorsetLongRuffle,BowCorsetLongRuffle +m_BowCorsetLongOverbustBow_l_BowCorsetBow,BowCorsetBow +m_BowCorsetRestraint,BowCorsetRestraint +m_BowCorsetRestraint_l_BowCorset,BowCorset +m_BowCorsetRestraint_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetBowRestraint,BowCorsetBowRestraint +m_BowCorsetBowRestraint_l_BowCorsetBow,BowCorsetBow +m_BowCorsetOverbustRestraint,BowCorsetOverbustRestraint +m_BowCorsetOverbustRestraint_l_BowCorsetBust,BowCorsetBust +m_BowCorsetOverbustRestraint_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetOverbustRestraint_l_BowCorset,BowCorset +m_BowCorsetOverbustRestraint_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetOverbustBowRestraint,BowCorsetOverbustBowRestraint +m_BowCorsetOverbustBowRestraint_l_BowCorsetBust,BowCorsetBust +m_BowCorsetOverbustBowRestraint_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetOverbustBowRestraint_l_BowCorset,BowCorset +m_BowCorsetOverbustBowRestraint_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetOverbustBowRestraint_l_BowCorsetBow,BowCorsetBow +m_BowCorsetLongOverbustRestraint,BowCorsetLongOverbustRestraint +m_BowCorsetLongOverbustRestraint_l_BowCorsetBust,BowCorsetBust +m_BowCorsetLongOverbustRestraint_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetLongOverbustRestraint_l_BowCorsetLong,BowCorsetLong +m_BowCorsetLongOverbustRestraint_l_BowCorsetLongRuffle,BowCorsetLongRuffle +m_BowCorsetLongOverbustBowRestraint,BowCorsetLongOverbustBowRestraint +m_BowCorsetLongOverbustBowRestraint_l_BowCorsetBust,BowCorsetBust +m_BowCorsetLongOverbustBowRestraint_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetLongOverbustBowRestraint_l_BowCorsetLong,BowCorsetLong +m_BowCorsetLongOverbustBowRestraint_l_BowCorsetLongRuffle,BowCorsetLongRuffle +m_BowCorsetLongOverbustBowRestraint_l_BowCorsetBow,BowCorsetBow +m_LatexCorset,LatexCorset +m_LatexCorset_l_HeavyCorset,HeavyCorset +m_LatexBra,LatexBra +m_LatexBra_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexBraStraps,LatexBraStraps +m_LatexBraStraps_l_StrapsHeavyCorset,StrapsHeavyCorset +m_LatexBraStrapsCross,LatexBraStrapsCross +m_LatexBraStrapsCross_l_CrossHeavyCorset,CrossHeavyCorset +m_LatexBustier,LatexBustier +m_LatexBustier_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFull,LatexCorsetFull +m_LatexCorsetFull_l_HeavyCorset,HeavyCorset +m_LatexCorsetFull_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetStrap,LatexCorsetStrap +m_LatexCorsetStrap_l_HeavyCorset,HeavyCorset +m_LatexCorsetStrap_l_StrapsHeavyCorset,StrapsHeavyCorset +m_LatexCorsetFullStrap,LatexCorsetFullStrap +m_LatexCorsetFullStrap_l_HeavyCorset,HeavyCorset +m_LatexCorsetFullStrap_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFullStrap_l_StrapsHeavyCorset,StrapsHeavyCorset +m_LatexCorsetCross,LatexCorsetCross +m_LatexCorsetCross_l_HeavyCorset,HeavyCorset +m_LatexCorsetCross_l_CrossHeavyCorset,CrossHeavyCorset +m_LatexCorsetFullCross,LatexCorsetFullCross +m_LatexCorsetFullCross_l_HeavyCorset,HeavyCorset +m_LatexCorsetFullCross_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFullCross_l_CrossHeavyCorset,CrossHeavyCorset +m_LatexCorsetRestraint,LatexCorsetRestraint +m_LatexCorsetRestraint_l_HeavyCorset,HeavyCorset +m_LatexBustierRestraint,LatexBustierRestraint +m_LatexBustierRestraint_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFullRestraint,LatexCorsetFullRestraint +m_LatexCorsetFullRestraint_l_HeavyCorset,HeavyCorset +m_LatexCorsetFullRestraint_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetStrapRestraint,LatexCorsetStrapRestraint +m_LatexCorsetStrapRestraint_l_HeavyCorset,HeavyCorset +m_LatexCorsetStrapRestraint_l_StrapsHeavyCorset,StrapsHeavyCorset +m_LatexCorsetCrossRestraint,LatexCorsetCrossRestraint +m_LatexCorsetCrossRestraint_l_HeavyCorset,HeavyCorset +m_LatexCorsetCrossRestraint_l_CrossHeavyCorset,CrossHeavyCorset +m_LatexCorsetFullStrapRestraint,LatexCorsetFullStrapRestraint +m_LatexCorsetFullStrapRestraint_l_HeavyCorset,HeavyCorset +m_LatexCorsetFullStrapRestraint_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFullStrapRestraint_l_StrapsHeavyCorset,StrapsHeavyCorset +m_LatexCorsetFullCrossRestraint,LatexCorsetFullCrossRestraint +m_LatexCorsetFullCrossRestraint_l_HeavyCorset,HeavyCorset +m_LatexCorsetFullCrossRestraint_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFullCrossRestraint_l_CrossHeavyCorset,CrossHeavyCorset +m_LacePanties,LacePanties +m_LacePanties_l_LaceCrotchPanel,LaceCrotchPanel +m_LacePanties_l_LaceCrotchPanelTrim,LaceCrotchPanelTrim +m_LacePanties_l_LaceCrotchPanelLace,LaceCrotchPanelLace +m_LaceCrotchPanel,LaceCrotchPanel +m_LaceCrotchPanel_l_LaceCrotchPanel,LaceCrotchPanel +m_LaceCrotchPanel_l_LaceCrotchPanelTrim,LaceCrotchPanelTrim +m_LaceCrotchPanel_l_LaceCrotchPanelLace,LaceCrotchPanelLace +m_DressSkirt,DressSkirt +m_DressSkirt_l_Skirt,Skirt +m_DressSkirt_l_SkirtOver,SkirtOver +m_BindingDress,BindingDress +m_BindingDress_l_LaceCorset,LaceCorset +m_BindingDress_l_LaceCorsetHardware,LaceCorsetHardware +m_BindingDress_l_LaceCorsetStripes,LaceCorsetStripes +m_BindingDress_l_LaceCorsetCrystal,LaceCorsetCrystal +m_BindingDress_l_Skirt,Skirt +m_BindingDress_l_SkirtOver,SkirtOver +m_BindingDress_l_LaceCrotchPanel,LaceCrotchPanel +m_BindingDress_l_LaceCrotchPanelTrim,LaceCrotchPanelTrim +m_BindingDress_l_LaceCrotchPanelLace,LaceCrotchPanelLace +m_BlouseCollar,BlouseCollar +m_BlouseCollar_l_BlouseCollar,BlouseCollar +m_DressBlouseBust,DressBlouseBust +m_DressBlouseBust_l_BlouseTorso,BlouseTorso +m_DressBlouseBust_l_BlouseSkirt,BlouseSkirt +m_DressBlouseBust_l_BlouseSkirtOverKneel,BlouseSkirtOverKneel +m_DressBlouseBust_l_BlouseBust,BlouseBust +m_DressBlouseBust_l_BlouseNeck,BlouseNeck +m_DressBlouseBust_l_BlouseCollar,BlouseCollar +m_DressBlouseBustCropped,DressBlouseBustCropped +m_DressBlouseBustCropped_l_CroppedBlouseTorso,CroppedBlouseTorso +m_DressBlouseBustCropped_l_BlouseBust,BlouseBust +m_DressBlouseBustCropped_l_BlouseNeck,BlouseNeck +m_DressBlouseBustCropped_l_BlouseCollar,BlouseCollar +m_DressBlouseSleeveLeft,DressBlouseSleeveLeft +m_DressBlouseSleeveLeft_l_BlouseArmLeft,BlouseArmLeft +m_DressBlouseSleeveLeft_l_BlouseForeArmLeft,BlouseForeArmLeft +m_DressBlouseSleeveRight,DressBlouseSleeveRight +m_DressBlouseSleeveRight_l_BlouseArmRight,BlouseArmRight +m_DressBlouseSleeveRight_l_BlouseForeArmRight,BlouseForeArmRight +m_DressBlouseSleeves,DressBlouseSleeves +m_DressBlouseSleeves_l_BlouseArmLeft,BlouseArmLeft +m_DressBlouseSleeves_l_BlouseForeArmLeft,BlouseForeArmLeft +m_DressBlouseSleeves_l_BlouseArmRight,BlouseArmRight +m_DressBlouseSleeves_l_BlouseForeArmRight,BlouseForeArmRight +m_DressBlouse,DressBlouse +m_DressBlouse_l_BlouseArmLeft,BlouseArmLeft +m_DressBlouse_l_BlouseForeArmLeft,BlouseForeArmLeft +m_DressBlouse_l_BlouseArmRight,BlouseArmRight +m_DressBlouse_l_BlouseForeArmRight,BlouseForeArmRight +m_DressBlouse_l_BlouseTorso,BlouseTorso +m_DressBlouse_l_BlouseSkirt,BlouseSkirt +m_DressBlouse_l_BlouseSkirtOverKneel,BlouseSkirtOverKneel +m_DressBlouse_l_BlouseBust,BlouseBust +m_DressBlouse_l_BlouseNeck,BlouseNeck +m_DressBlouse_l_BlouseCollar,BlouseCollar +m_Glasses,Glasses +m_Glasses_l_Glasses,Glasses +m_Glasses_l_GlassesLens,GlassesLens +m_MonocleLeft,MonocleLeft +m_MonocleLeft_l_MonocleLeft,MonocleLeft +m_MonocleLeft_l_MonocleLensLeft,MonocleLensLeft +m_MonocleRight,MonocleRight +m_MonocleRight_l_MonocleRight,MonocleRight +m_MonocleRight_l_MonocleLensRight,MonocleLensRight +m_DressShoes,DressShoes +m_DressShoes_l_ShoeLeft,ShoeLeft +m_DressShoes_l_ShoeRight,ShoeRight +m_DressShoes_l_ShoeRightKneel,ShoeRightKneel +m_DressShoes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Dress_l_Skirt,Skirt +m_Dress_l_SkirtOver,SkirtOver +m_Dress_l_BlouseArmLeft,BlouseArmLeft +m_Dress_l_BlouseForeArmLeft,BlouseForeArmLeft +m_Dress_l_BlouseArmRight,BlouseArmRight +m_Dress_l_BlouseForeArmRight,BlouseForeArmRight +m_Dress_l_BlouseTorso,BlouseTorso +m_Dress_l_BlouseSkirt,BlouseSkirt +m_Dress_l_BlouseSkirtOverKneel,BlouseSkirtOverKneel +m_Dress_l_BlouseBust,BlouseBust +m_Dress_l_BlouseNeck,BlouseNeck +m_Dress_l_BlouseCollar,BlouseCollar +m_Dress_l_LaceCrotchPanel,LaceCrotchPanel +m_Dress_l_LaceCrotchPanelTrim,LaceCrotchPanelTrim +m_Dress_l_LaceCrotchPanelLace,LaceCrotchPanelLace +m_Dress_l_LaceCorset,LaceCorset +m_Dress_l_LaceCorsetHardware,LaceCorsetHardware +m_Dress_l_LaceCorsetStripes,LaceCorsetStripes +m_Dress_l_LaceCorsetCrystal,LaceCorsetCrystal +m_Dress_l_LaceChest,LaceChest +m_Dress_l_LaceChestCups,LaceChestCups +m_Dress_l_LaceChestStripes,LaceChestStripes +m_LeatherMittenLeft,LeatherMittenLeft +m_LeatherMittenLeft_l_LeatherLeft,LeatherLeft +m_LeatherMittenLeft_l_BandLeft,BandLeft +m_LeatherMittenLeft_l_LockLeft,LockLeft +m_LeatherMittenRight,LeatherMittenRight +m_LeatherMittenRight_l_LeatherRight,LeatherRight +m_LeatherMittenRight_l_BandRight,BandRight +m_LeatherMittenRight_l_LockRight,LockRight +m_LatexMittenLeft,LatexMittenLeft +m_LatexMittenLeft_l_LatexLeft,LatexLeft +m_LatexMittenLeft_l_ZipperLeft,ZipperLeft +m_LatexMittenRight,LatexMittenRight +m_LatexMittenRight_l_LatexRight,LatexRight +m_LatexMittenRight_l_ZipperRight,ZipperRight +m_LeatherPawMittenLeft,LeatherPawMittenLeft +m_LeatherPawMittenLeft_l_LeatherLeft,LeatherLeft +m_LeatherPawMittenLeft_l_BandLeft,BandLeft +m_LeatherPawMittenLeft_l_LockLeft,LockLeft +m_LeatherPawMittenLeft_l_PawLeft,PawLeft +m_LeatherPawMittenRight,LeatherPawMittenRight +m_LeatherPawMittenRight_l_LeatherRight,LeatherRight +m_LeatherPawMittenRight_l_BandRight,BandRight +m_LeatherPawMittenRight_l_LockRight,LockRight +m_LeatherPawMittenRight_l_PawRight,PawRight +m_LeatherMittens,LeatherMittens +m_LeatherMittens_l_LeatherLeft,LeatherLeft +m_LeatherMittens_l_BandLeft,BandLeft +m_LeatherMittens_l_LockLeft,LockLeft +m_LeatherMittens_l_LeatherRight,LeatherRight +m_LeatherMittens_l_BandRight,BandRight +m_LeatherMittens_l_LockRight,LockRight +m_LeatherPawMittens,LeatherPawMittens +m_LeatherPawMittens_l_LeatherLeft,LeatherLeft +m_LeatherPawMittens_l_BandLeft,BandLeft +m_LeatherPawMittens_l_LockLeft,LockLeft +m_LeatherPawMittens_l_PawLeft,PawLeft +m_LeatherPawMittens_l_LeatherRight,LeatherRight +m_LeatherPawMittens_l_BandRight,BandRight +m_LeatherPawMittens_l_LockRight,LockRight +m_LeatherPawMittens_l_PawRight,PawRight +m_LatexMittens,LatexMittens +m_LatexMittens_l_LatexLeft,LatexLeft +m_LatexMittens_l_ZipperLeft,ZipperLeft +m_LatexMittens_l_LatexRight,LatexRight +m_LatexMittens_l_ZipperRight,ZipperRight + +m_LongMittenLeft,LongMittenLeft +m_LongMittenLeft_l_LongLeft,LongLeft +m_LongMittenLeft_l_BandLeft,BandLeft +m_LongMittenLeft_l_LockLeft,LockLeft +m_LongMittenRight,LongMittenRight +m_LongMittenRight_l_LongRight,LongRight +m_LongMittenRight_l_BandRight,BandRight +m_LongMittenRight_l_LockRight,LockRight +m_LongMittens,LongMittens +m_LongMittens_l_LongLeft,LongLeft +m_LongMittens_l_BandLeft,BandLeft +m_LongMittens_l_LockLeft,LockLeft +m_LongMittens_l_LongRight,LongRight +m_LongMittens_l_BandRight,BandRight +m_LongMittens_l_LockRight,LockRight +m_ElfPanties,ElfPanties +m_ElfPanties_l_Panties,Panties +m_ElfTop,ElfTop +m_ElfTop_l_Chest,Chest +m_ElfTop_l_Bra,Bra +m_ElfBra,ElfBra +m_ElfBra_l_Chest,Chest +m_ElfBra_l_Bra,Bra +m_ElfCollar,ElfCollar +m_ElfCollar_l_Collar,Collar +m_ElfCollarRestraint,ElfCollarRestraint +m_ElfCollarRestraint_l_Collar,Collar +m_ElfCirclet,ElfCirclet +l_ElfCirclet_Circlet,Circlet +l_ElfCirclet_Gem,Gem +m_ElfSkirtBack,ElfSkirtBack +m_ElfSkirtBack_l_SkirtBack,SkirtBack +m_ElfSkirt,ElfSkirt +m_ElfSkirt_l_Skirt,Skirt +m_ElfSkirt_l_SkirtBand,SkirtBand +m_ElfSkirt_l_SkirtBack,SkirtBack +m_ElfShoes,ElfShoes +m_ElfShoes_l_ShoeLeft,ShoeLeft +m_ElfShoes_l_ShoeRight,ShoeRight +m_ElfShoes_l_ShoeRightKneel,ShoeRightKneel +m_ElfShoes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_ElfShoes_l_CrystalShoeLeft,CrystalShoeLeft +m_ElfShoes_l_CrystalShoeRight,CrystalShoeRight +m_ElfBandLeft,ElfBandLeft +m_ElfBandLeft_l_BandLeft,BandLeft +m_ElfBandRight,ElfBandRight +m_ElfBandRight_l_BandRight,BandRight +m_ElfBands,ElfBands +m_ElfBands_l_BandLeft,BandLeft +m_ElfBands_l_BandRight,BandRight +m_Elf_l_Skirt,Skirt +m_Elf_l_SkirtBand,SkirtBand +m_Elf_l_SkirtBack,SkirtBack +m_Elf_l_Chest,Chest +m_Elf_l_Bra,Bra +m_Elf_l_BandLeft,BandLeft +m_Elf_l_BandRight,BandRight +m_Elf_l_Circlet,Circlet +m_Elf_l_Gem,Gem +m_Elf_l_ShoeLeft,ShoeLeft +m_Elf_l_ShoeRight,ShoeRight +m_Elf_l_ShoeRightKneel,ShoeRightKneel +m_Elf_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Elf_l_CrystalShoeLeft,CrystalShoeLeft +m_Elf_l_CrystalShoeRight,CrystalShoeRight +m_Elf_l_Panties,Panties +m_Elf_l_Collar,Collar +m_SteelYoke,SteelYoke +m_SteelYoke_l_Steel,Steel +m_SteelYoke_l_SteelBar,SteelBar +m_RopeCrosstie1,RopeCrosstie1 +m_RopeCrosstie1_l_ArmStrap,ArmStrap +m_RopeCrosstie1_l_Arm1,Arm1 +m_RopeCrosstie1_l_ForeArm1,ForeArm1 +m_RopeBoxtie1,RopeBoxtie1 +m_RopeBoxtie1_l_ArmStrap,ArmStrap +m_RopeBoxtie1_l_Arm1,Arm1 +m_RopeBoxtie1_l_ForeArm1,ForeArm1 +m_RopeWristtie1,RopeWristtie1 +m_RopeWristtie1_l_ArmStrap,ArmStrap +m_RopeWristtie1_l_Arm1,Arm1 +m_RopeWristtie1_l_ForeArm1,ForeArm1 +m_RopeChestStraps1,RopeChestStraps1 +m_RopeChestStraps1_l_Arm1,Arm1 +m_RopeChestStraps1_l_Arm2,Arm2 +m_RopeChestStraps1_l_ForeArm2,ForeArm2 +m_RopeBoxtie2,RopeBoxtie2 +m_RopeBoxtie2_l_ArmStrap,ArmStrap +m_RopeBoxtie2_l_Arm1,Arm1 +m_RopeBoxtie2_l_ForeArm1,ForeArm1 +m_RopeBoxtie2_l_Arm2,Arm2 +m_RopeBoxtie2_l_ForeArm2,ForeArm2 +m_RopeWristtie2,RopeWristtie2 +m_RopeWristtie2_l_ArmStrap,ArmStrap +m_RopeWristtie2_l_Arm1,Arm1 +m_RopeWristtie2_l_ForeArm1,ForeArm1 +m_RopeWristtie2_l_Arm2,Arm2 +m_RopeWristtie2_l_ForeArm2,ForeArm2 +m_RopeChestStraps2,RopeChestStraps2 +m_RopeChestStraps2_l_ArmHarness,ArmHarness +m_RopeChestStraps2_l_ArmStrapHarness,ArmStrapHarness +m_RopeChestStraps2_l_ArmHarnessUp,ArmHarnessUp +m_RopeBoxtie3,RopeBoxtie3 +m_RopeBoxtie3_l_ArmStrap,ArmStrap +m_RopeBoxtie3_l_Arm1,Arm1 +m_RopeBoxtie3_l_ForeArm1,ForeArm1 +m_RopeBoxtie3_l_Arm2,Arm2 +m_RopeBoxtie3_l_ForeArm2,ForeArm2 +m_RopeBoxtie3_l_ArmHarness,ArmHarness +m_RopeBoxtie3_l_ArmStrapHarness,ArmStrapHarness +m_RopeBoxtie3_l_ArmHarnessUp,ArmHarnessUp +m_RopeWristtie3,RopeWristtie3 +m_RopeWristtie3_l_ArmStrap,ArmStrap +m_RopeWristtie3_l_Arm1,Arm1 +m_RopeWristtie3_l_ForeArm1,ForeArm1 +m_RopeWristtie3_l_Arm2,Arm2 +m_RopeWristtie3_l_ForeArm2,ForeArm2 +m_RopeWristtie3_l_ArmHarness,ArmHarness +m_RopeWristtie3_l_ArmStrapHarness,ArmStrapHarness +m_RopeWristtie3_l_ArmHarnessUp,ArmHarnessUp +m_RopeCuffs,RopeCuffs +m_RopeCuffs_l_Cuffs,Cuffs +m_RopeBelt,RopeBelt +m_RopeBelt_l_Belt,Belt +m_RopeHarness,RopeHarness +m_RopeHarness_l_Harness,Harness +m_RopeHarness_l_HarnessLower,HarnessLower +m_RopeHarness_l_HarnessLowerStrap,HarnessLowerStrap +m_RopeCrotch,RopeCrotch +m_RopeCrotch_l_Crotchrope,Crotchrope +m_RopeCrotch_l_CrotchropeStrap,CrotchropeStrap +m_RopeToes,RopeToes +m_RopeToes_l_Toe,Toe +m_RopeFeet,RopeFeet +m_RopeFeet_l_Ankles,Ankles +m_RopeFeetHeavy,RopeFeetHeavy +m_RopeFeetHeavy_l_Ankles,Ankles +m_RopeFeetHeavy_l_Toe,Toe +m_RopeAnkles1,RopeAnkles1 +m_RopeAnkles1_l_Calf1,Calf1 +m_RopeAnkles2,RopeAnkles2 +m_RopeAnkles2_l_Calf1,Calf1 +m_RopeAnkles2_l_Calf2,Calf2 +m_RopeAnkles3,RopeAnkles3 +m_RopeAnkles3_l_Calf1,Calf1 +m_RopeAnkles3_l_Calf2,Calf2 +m_RopeAnkles3_l_Calf3,Calf3 +m_RopeLegs1,RopeLegs1 +m_RopeLegs1_l_Thigh1,Thigh1 +m_RopeLegs1_l_RightThigh1,RightThigh1 +m_RopeLegs2,RopeLegs2 +m_RopeLegs2_l_Thigh1,Thigh1 +m_RopeLegs2_l_RightThigh1,RightThigh1 +m_RopeLegs2_l_Thigh2,Thigh2 +m_RopeLegs2_l_RightThigh2,RightThigh2 +m_RopeLegs3,RopeLegs3 +m_RopeLegs3_l_Thigh1,Thigh1 +m_RopeLegs3_l_RightThigh1,RightThigh1 +m_RopeLegs3_l_Thigh2,Thigh2 +m_RopeLegs3_l_RightThigh2,RightThigh2 +m_RopeLegs3_l_Thigh3,Thigh3 +m_RopeLegs3_l_RightThigh3,RightThigh3 +m_RibbonCrosstie1,RibbonCrosstie1 +m_RibbonCrosstie1_l_ArmStrap,ArmStrap +m_RibbonBoxtie1,RibbonBoxtie1 +m_RibbonBoxtie1_l_Arm1,Arm1 +m_RibbonWristtie1,RibbonWristtie1 +m_RibbonWristtie1_l_ForeArm1,ForeArm1 +m_RibbonChestStraps1,RibbonChestStraps1 +m_RibbonChestStraps1_l_Arm2,Arm2 +m_RibbonChestStraps1_l_ForeArm2,ForeArm2 +m_RibbonBoxtie2,RibbonBoxtie2 +m_RibbonBoxtie2_l_Arm1,Arm1 +m_RibbonBoxtie2_l_Arm2,Arm2 +m_RibbonBoxtie2_l_ForeArm2,ForeArm2 +m_RibbonWristtie2,RibbonWristtie2 +m_RibbonWristtie2_l_ForeArm1,ForeArm1 +m_RibbonWristtie2_l_Arm2,Arm2 +m_RibbonWristtie2_l_ForeArm2,ForeArm2 +m_RibbonChestStraps2,RibbonChestStraps2 +m_RibbonChestStraps2_l_ArmHarness,ArmHarness +m_RibbonChestStraps2_l_ArmHarnessUnderbust,ArmHarnessUnderbust +m_RibbonChestStraps2_l_ArmStrap,ArmStrap +m_RibbonChestStraps2_l_ArmHarnessUp,ArmHarnessUp +m_RibbonCuffs,RibbonCuffs +m_RibbonCuffs_l_Cuffs,Cuffs +m_RibbonBelt,RibbonBelt +m_RibbonBelt_l_Belt,Belt +m_RibbonHarness,RibbonHarness +m_RibbonHarness_l_Harness,Harness +m_RibbonHarness_l_HarnessMid,HarnessMid +m_RibbonHarness_l_HarnessLower,HarnessLower +m_RibbonHarness_l_HarnessLowerStrap,HarnessLowerStrap +m_RibbonCrotch,RibbonCrotch +m_RibbonCrotch_l_Crotch,Crotch +m_RibbonCrotch_l_CrotchStrap,CrotchStrap +m_RibbonToes,RibbonToes +m_RibbonToes_l_Toe,Toe +m_RibbonFeet,RibbonFeet +m_RibbonFeet_l_Feet,Feet +m_RibbonFeetHeavy,RibbonFeetHeavy +m_RibbonFeetHeavy_l_Feet,Feet +m_RibbonFeetHeavy_l_Toe,Toe +m_RibbonAnkles1,RibbonAnkles1 +m_RibbonAnkles1_l_Calf1,Calf1 +m_RibbonAnkles2,RibbonAnkles2 +m_RibbonAnkles2_l_Calf1,Calf1 +m_RibbonAnkles2_l_Calf2,Calf2 +m_RibbonAnkles3,RibbonAnkles3 +m_RibbonAnkles3_l_Calf1,Calf1 +m_RibbonAnkles3_l_Calf2,Calf2 +m_RibbonAnkles3_l_Calf3,Calf3 +m_RibbonLegs1,RibbonLegs1 +m_RibbonLegs1_l_Thigh1,Thigh1 +m_RibbonLegs1_l_RightThigh1,RightThigh1 +m_RibbonLegs2,RibbonLegs2 +m_RibbonLegs2_l_Thigh1,Thigh1 +m_RibbonLegs2_l_RightThigh1,RightThigh1 +m_RibbonLegs2_l_Thigh2,Thigh2 +m_RibbonLegs2_l_RightThigh2,RightThigh2 +m_RibbonLegs3,RibbonLegs3 +m_RibbonLegs3_l_Thigh1,Thigh1 +m_RibbonLegs3_l_RightThigh1,RightThigh1 +m_RibbonLegs3_l_Thigh2,Thigh2 +m_RibbonLegs3_l_RightThigh2,RightThigh2 +m_RibbonLegs3_l_Thigh3,Thigh3 +m_RibbonLegs3_l_RightThigh3,RightThigh3 +m_ShacklesWristLeft,ShacklesWristLeft +m_ShacklesWristLeft_l_WristLeft,WristLeft +m_ShacklesWristRight,ShacklesWristRight +m_ShacklesWristRight_l_WristRight,WristRight +m_ShacklesWrists,ShacklesWrists +m_ShacklesWrists_l_WristLeft,WristLeft +m_ShacklesWrists_l_WristRight,WristRight +m_ShacklesElbowLeft,ShacklesElbowLeft +m_ShacklesElbowLeft_l_ElbowLeft,ElbowLeft +m_ShacklesElbowRight,ShacklesElbowRight +m_ShacklesElbowRight_l_ElbowRight,ElbowRight +m_ShacklesElbows,ShacklesElbows +m_ShacklesElbows_l_ElbowLeft,ElbowLeft +m_ShacklesElbows_l_ElbowRight,ElbowRight +m_ShacklesArms,ShacklesArms +m_ShacklesArms_l_WristLeft,WristLeft +m_ShacklesArms_l_WristRight,WristRight +m_ShacklesArms_l_ElbowLeft,ElbowLeft +m_ShacklesArms_l_ElbowRight,ElbowRight +m_ShacklesAnklesLeft,ShacklesAnklesLeft +m_ShacklesAnklesLeft_l_AnkleLeft,AnkleLeft +m_ShacklesAnklesRight,ShacklesAnklesRight +m_ShacklesAnklesRight_l_AnkleRight,AnkleRight +m_ShacklesAnkles,ShacklesAnkles +m_ShacklesAnkles_l_AnkleRight,AnkleRight +m_ShacklesAnkles_l_AnkleLeft,AnkleLeft +m_ShacklesThighLeft,ShacklesThighLeft +m_ShacklesThighLeft_l_ThighLeft,ThighLeft +m_ShacklesThighRight,ShacklesThighRight +m_ShacklesThighRight_l_ThighRight,ThighRight +m_ShacklesThigh,ShacklesThigh +m_ShacklesThigh_l_ThighRight,ThighRight +m_ShacklesThigh_l_ThighLeft,ThighLeft +m_ThighLink,ThighLink +m_ThighLink_l_ThighLink,ThighLink +m_AnkleLink,AnkleLink +m_AnkleLink_l_AnkleLink,AnkleLink +m_IronCollar,IronCollar +m_IronCollar_l_Collar,Collar +m_SteelCollar,SteelCollar +m_SteelCollar_l_SteelCollar,SteelCollar +m_SteelCollarRunes,SteelCollarRunes +m_SteelCollarRunes_l_SteelCollar,SteelCollar +m_SteelCollarRunes_l_SteelCollarRunes,SteelCollarRunes +m_IronBelt,IronBelt +m_IronBelt_l_Belt,Belt +m_WolfPanties,WolfPanties +m_WolfPanties_l_Panties,Panties +m_WolfCollar,WolfCollar +m_WolfCollar_l_Collar,Collar +m_WolfCollar_l_CollarBand,CollarBand +m_WolfCollarTag,WolfCollarTag +m_WolfCollarTag_l_Collar,Collar +m_WolfCollarTag_l_CollarBand,CollarBand +m_WolfCollarTag_l_CollarHardware,CollarHardware +m_WolfCollarTag_l_CollarTag,CollarTag +m_WolfCollarSmall,WolfCollarSmall +m_WolfCollarSmall_l_FCollar,FCollar +m_WolfCollarSmall_l_FCollarBand,FCollarBand +m_WolfCollarSmallTag,WolfCollarSmallTag +m_WolfCollarSmallTag_l_FCollar,FCollar +m_WolfCollarSmallTag_l_FCollarBand,FCollarBand +m_WolfCollarSmallTag_l_FCollarHardware,FCollarHardware +m_WolfCollarSmallTag_l_FCollarTag,FCollarTag +m_WolfHarnessUpper,WolfHarnessUpper +m_WolfHarnessUpper_l_HarnessUpper,HarnessUpper +m_WolfHarnessUpper_l_HarnessBandUpper,HarnessBandUpper +m_WolfHarnessBelt,WolfHarnessBelt +m_WolfHarnessBelt_l_BeltMid,BeltMid +m_WolfHarnessBelt_l_BeltBandMid,BeltBandMid +m_WolfHarnessBelt_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarnessLower,WolfHarnessLower +m_WolfHarnessLower_l_BeltMid,BeltMid +m_WolfHarnessLower_l_BeltBandMid,BeltBandMid +m_WolfHarnessLower_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarnessLower_l_HarnessMid,HarnessMid +m_WolfHarnessLower_l_HarnessHardwareMid,HarnessHardwareMid +m_WolfHarnessLower_l_HarnessLower,HarnessLower +m_WolfHarnessLower_l_HarnessBandLower,HarnessBandLower +m_WolfHarnessLower_l_HarnessHardwareLower,HarnessHardwareLower +m_WolfHarness,WolfHarness +m_WolfHarness_l_BeltMid,BeltMid +m_WolfHarness_l_BeltBandMid,BeltBandMid +m_WolfHarness_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarness_l_HarnessUpper,HarnessUpper +m_WolfHarness_l_HarnessBandUpper,HarnessBandUpper +m_WolfHarness_l_HarnessMid,HarnessMid +m_WolfHarness_l_HarnessHardwareMid,HarnessHardwareMid +m_WolfHarness_l_HarnessLower,HarnessLower +m_WolfHarness_l_HarnessBandLower,HarnessBandLower +m_WolfHarness_l_HarnessHardwareLower,HarnessHardwareLower +m_WolfCuffsAnklesLeft,WolfCuffsAnklesLeft +m_WolfCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_WolfCuffsAnklesLeft_l_BandAnkleLeft,BandAnkleLeft +m_WolfCuffsAnklesRight,WolfCuffsAnklesRight +m_WolfCuffsAnklesRight_l_AnkleRight,AnkleRight +m_WolfCuffsAnklesRight_l_BandAnkleRight,BandAnkleRight +m_WolfCuffsAnkles,WolfCuffsAnkles +m_WolfCuffsAnkles_l_AnkleRight,AnkleRight +m_WolfCuffsAnkles_l_BandAnkleRight,BandAnkleRight +m_WolfCuffsAnkles_l_AnkleLeft,AnkleLeft +m_WolfCuffsAnkles_l_BandAnkleLeft,BandAnkleLeft +m_WolfCollarRestraint,WolfCollarRestraint +m_WolfCollarRestraint_l_Collar,Collar +m_WolfCollarRestraint_l_CollarBand,CollarBand +m_WolfCollarTagRestraint,WolfCollarTagRestraint +m_WolfCollarTagRestraint_l_Collar,Collar +m_WolfCollarTagRestraint_l_CollarBand,CollarBand +m_WolfCollarTagRestraint_l_CollarHardware,CollarHardware +m_WolfCollarTagRestraint_l_CollarTag,CollarTag +m_WolfCollarSmallRestraint,WolfCollarSmallRestraint +m_WolfCollarSmallRestraint_l_FCollar,FCollar +m_WolfCollarSmallRestraint_l_FCollarBand,FCollarBand +m_WolfCollarSmallTagRestraint,WolfCollarSmallTagRestraint +m_WolfCollarSmallTagRestraint_l_FCollar,FCollar +m_WolfCollarSmallTagRestraint_l_FCollarBand,FCollarBand +m_WolfCollarSmallTagRestraint_l_FCollarHardware,FCollarHardware +m_WolfCollarSmallTagRestraint_l_FCollarTag,FCollarTag +m_WolfPantiesRestraint,WolfPantiesRestraint +m_WolfPantiesRestraint_l_Panties,Panties +m_WolfHarnessLowerRestraint,WolfHarnessLowerRestraint +m_WolfHarnessLowerRestraint_l_BeltMid,BeltMid +m_WolfHarnessLowerRestraint_l_BeltBandMid,BeltBandMid +m_WolfHarnessLowerRestraint_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarnessLowerRestraint_l_HarnessMid,HarnessMid +m_WolfHarnessLowerRestraint_l_HarnessHardwareMid,HarnessHardwareMid +m_WolfHarnessLowerRestraint_l_HarnessLower,HarnessLower +m_WolfHarnessLowerRestraint_l_HarnessBandLower,HarnessBandLower +m_WolfHarnessLowerRestraint_l_HarnessHardwareLower,HarnessHardwareLower +m_WolfHarnessUpperRestraint,WolfHarnessUpperRestraint +m_WolfHarnessUpperRestraint_l_HarnessUpper,HarnessUpper +m_WolfHarnessUpperRestraint_l_HarnessBandUpper,HarnessBandUpper +m_WolfHarnessBeltRestraint,WolfHarnessBeltRestraint +m_WolfHarnessBeltRestraint_l_BeltMid,BeltMid +m_WolfHarnessBeltRestraint_l_BeltBandMid,BeltBandMid +m_WolfHarnessBeltRestraint_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarnessRestraint,WolfHarnessRestraint +m_WolfHarnessRestraint_l_BeltMid,BeltMid +m_WolfHarnessRestraint_l_BeltBandMid,BeltBandMid +m_WolfHarnessRestraint_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarnessRestraint_l_HarnessUpper,HarnessUpper +m_WolfHarnessRestraint_l_HarnessBandUpper,HarnessBandUpper +m_WolfHarnessRestraint_l_HarnessMid,HarnessMid +m_WolfHarnessRestraint_l_HarnessHardwareMid,HarnessHardwareMid +m_WolfHarnessRestraint_l_HarnessLower,HarnessLower +m_WolfHarnessRestraint_l_HarnessBandLower,HarnessBandLower +m_WolfHarnessRestraint_l_HarnessHardwareLower,HarnessHardwareLower +m_WolfGloveLeft,WolfGloveLeft +m_WolfGloveLeft_l_GloveLeft,GloveLeft +m_WolfGloveLeft_l_ForeGloveLeft,ForeGloveLeft +m_WolfGloveLeft_l_RimGloveLeft,RimGloveLeft +m_WolfGloveLeft_l_RimForeGloveLeft,RimForeGloveLeft +m_WolfGloveLeft_l_BandGloveLeft,BandGloveLeft +m_WolfGloveLeft_l_BandForeGloveLeft,BandForeGloveLeft +m_WolfGloveRight,WolfGloveRight +m_WolfGloveRight_l_GloveRight,GloveRight +m_WolfGloveRight_l_ForeGloveRight,ForeGloveRight +m_WolfGloveRight_l_RimGloveRight,RimGloveRight +m_WolfGloveRight_l_RimForeGloveRight,RimForeGloveRight +m_WolfGloveRight_l_BandGloveRight,BandGloveRight +m_WolfGloveRight_l_BandForeGloveRight,BandForeGloveRight +m_WolfGloves,WolfGloves +m_WolfGloves_l_GloveLeft,GloveLeft +m_WolfGloves_l_ForeGloveLeft,ForeGloveLeft +m_WolfGloves_l_RimGloveLeft,RimGloveLeft +m_WolfGloves_l_RimForeGloveLeft,RimForeGloveLeft +m_WolfGloves_l_BandGloveLeft,BandGloveLeft +m_WolfGloves_l_BandForeGloveLeft,BandForeGloveLeft +m_WolfGloves_l_GloveRight,GloveRight +m_WolfGloves_l_ForeGloveRight,ForeGloveRight +m_WolfGloves_l_RimGloveRight,RimGloveRight +m_WolfGloves_l_RimForeGloveRight,RimForeGloveRight +m_WolfGloves_l_BandGloveRight,BandGloveRight +m_WolfGloves_l_BandForeGloveRight,BandForeGloveRight +m_WolfSockLeft,WolfSockLeft +m_WolfSockLeft_l_LegLeft,LegLeft +m_WolfSockRight,WolfSockRight +m_WolfSockRight_l_LegRight,LegRight +m_WolfSocks,WolfSocks +m_WolfSocks_l_LegRight,LegRight +m_WolfSocks_l_LegLeft,LegLeft +m_WolfSocksRestraint,WolfSocksRestraint +m_WolfSocksRestraint_l_LegRight,LegRight +m_WolfSocksRestraint_l_LegLeft,LegLeft +m_WolfTorsoLower,WolfTorsoLower +m_WolfTorsoLower_l_TorsoLower,TorsoLower +m_WolfTorsoUpper,WolfTorsoUpper +m_WolfTorsoUpper_l_Chest,Chest +m_WolfTorsoUpper_l_TorsoUpper,TorsoUpper +m_WolfHeels,WolfHeels +m_WolfHeels_l_ShoeLeft,ShoeLeft +m_WolfHeels_l_ShoeRight,ShoeRight +m_WolfHeels_l_ShoeRightKneel,ShoeRightKneel +m_WolfHeels_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Wolf,Wolf +m_Wolf_l_LegRight,LegRight +m_Wolf_l_LegLeft,LegLeft +m_Wolf_l_GloveLeft,GloveLeft +m_Wolf_l_ForeGloveLeft,ForeGloveLeft +m_Wolf_l_RimGloveLeft,RimGloveLeft +m_Wolf_l_RimForeGloveLeft,RimForeGloveLeft +m_Wolf_l_BandGloveLeft,BandGloveLeft +m_Wolf_l_BandForeGloveLeft,BandForeGloveLeft +m_Wolf_l_GloveRight,GloveRight +m_Wolf_l_ForeGloveRight,ForeGloveRight +m_Wolf_l_RimGloveRight,RimGloveRight +m_Wolf_l_RimForeGloveRight,RimForeGloveRight +m_Wolf_l_BandGloveRight,BandGloveRight +m_Wolf_l_BandForeGloveRight,BandForeGloveRight +m_Wolf_l_Chest,Chest +m_Wolf_l_TorsoUpper,TorsoUpper +m_Wolf_l_TorsoLower,TorsoLower +m_Wolf_l_ShoeLeft,ShoeLeft +m_Wolf_l_ShoeRight,ShoeRight +m_Wolf_l_ShoeRightKneel,ShoeRightKneel +m_Wolf_l_ShoeLeftHogtie,ShoeLeftHogtie +m_CuffsWristLeft,CuffsWristLeft +m_CuffsWristLeft_l_WristLeft,WristLeft +m_CuffsWristLeft_l_BandWristLeft,BandWristLeft +m_CuffsWristLeft_l_HardwareWristLeft,HardwareWristLeft +m_CuffsWristRight,CuffsWristRight +m_CuffsWristRight_l_WristRight,WristRight +m_CuffsWristRight_l_BandWristRight,BandWristRight +m_CuffsWristRight_l_HardwareWristRight,HardwareWristRight +m_CuffsWrists,CuffsWrists +m_CuffsWrists_l_WristLeft,WristLeft +m_CuffsWrists_l_BandWristLeft,BandWristLeft +m_CuffsWrists_l_HardwareWristLeft,HardwareWristLeft +m_CuffsWrists_l_WristRight,WristRight +m_CuffsWrists_l_BandWristRight,BandWristRight +m_CuffsWrists_l_HardwareWristRight,HardwareWristRight +m_CuffsElbowLeft,CuffsElbowLeft +m_CuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_CuffsElbowLeft_l_BandElbowLeft,BandElbowLeft +m_CuffsElbowLeft_l_HardwareElbowLeft,HardwareElbowLeft +m_CuffsElbowRight,CuffsElbowRight +m_CuffsElbowRight_l_ElbowRight,ElbowRight +m_CuffsElbowRight_l_BandElbowRight,BandElbowRight +m_CuffsElbowRight_l_HardwareElbowRight,HardwareElbowRight +m_CuffsElbows,CuffsElbows +m_CuffsElbows_l_ElbowLeft,ElbowLeft +m_CuffsElbows_l_BandElbowLeft,BandElbowLeft +m_CuffsElbows_l_HardwareElbowLeft,HardwareElbowLeft +m_CuffsElbows_l_ElbowRight,ElbowRight +m_CuffsElbows_l_BandElbowRight,BandElbowRight +m_CuffsElbows_l_HardwareElbowRight,HardwareElbowRight +m_CuffsArms,CuffsArms +m_CuffsArms_l_WristLeft,WristLeft +m_CuffsArms_l_BandWristLeft,BandWristLeft +m_CuffsArms_l_HardwareWristLeft,HardwareWristLeft +m_CuffsArms_l_WristRight,WristRight +m_CuffsArms_l_BandWristRight,BandWristRight +m_CuffsArms_l_HardwareWristRight,HardwareWristRight +m_CuffsArms_l_ElbowLeft,ElbowLeft +m_CuffsArms_l_BandElbowLeft,BandElbowLeft +m_CuffsArms_l_HardwareElbowLeft,HardwareElbowLeft +m_CuffsArms_l_ElbowRight,ElbowRight +m_CuffsArms_l_BandElbowRight,BandElbowRight +m_CuffsArms_l_HardwareElbowRight,HardwareElbowRight +m_CuffsAnklesLeft,CuffsAnklesLeft +m_CuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_CuffsAnklesLeft_l_BandAnkleLeft,BandAnkleLeft +m_CuffsAnklesLeft_l_HardwareAnkleLeft,HardwareAnkleLeft +m_CuffsAnklesRight,CuffsAnklesRight +m_CuffsAnklesRight_l_AnkleRight,AnkleRight +m_CuffsAnklesRight_l_BandAnkleRight,BandAnkleRight +m_CuffsAnklesRight_l_HardwareAnkleRight,HardwareAnkleRight +m_CuffsAnkles,CuffsAnkles +m_CuffsAnkles_l_AnkleRight,AnkleRight +m_CuffsAnkles_l_BandAnkleRight,BandAnkleRight +m_CuffsAnkles_l_HardwareAnkleRight,HardwareAnkleRight +m_CuffsAnkles_l_AnkleLeft,AnkleLeft +m_CuffsAnkles_l_BandAnkleLeft,BandAnkleLeft +m_CuffsAnkles_l_HardwareAnkleLeft,HardwareAnkleLeft +m_CuffsThighLeft,CuffsThighLeft +m_CuffsThighLeft_l_ThighLeft,ThighLeft +m_CuffsThighLeft_l_BandThighLeft,BandThighLeft +m_CuffsThighLeft_l_HardwareThighLeft,HardwareThighLeft +m_CuffsThighRight,CuffsThighRight +m_CuffsThighRight_l_ThighRight,ThighRight +m_CuffsThighRight_l_BandThighRight,BandThighRight +m_CuffsThighRight_l_HardwareThighRight,HardwareThighRight +m_CuffsThigh,CuffsThigh +m_CuffsThigh_l_ThighRight,ThighRight +m_CuffsThigh_l_BandThighRight,BandThighRight +m_CuffsThigh_l_HardwareThighRight,HardwareThighRight +m_CuffsThigh_l_ThighLeft,ThighLeft +m_CuffsThigh_l_BandThighLeft,BandThighLeft +m_CuffsThigh_l_HardwareThighLeft,HardwareThighLeft +m_LeatherCollar,LeatherCollar +m_LeatherCollar_l_Collar,Collar +m_LeatherCollar_l_BandCollar,BandCollar +m_LeatherCollar_l_HardwareCollar,HardwareCollar +m_LeatherCollarBell,LeatherCollarBell +m_LeatherCollarBell_l_Collar,Collar +m_LeatherCollarBell_l_BandCollar,BandCollar +m_LeatherCollarBell_l_HardwareCollar,HardwareCollar +m_LeatherCollarBell_l_BellCollar,BellCollar +m_LeatherCollarBow,LeatherCollarBow +m_LeatherCollarBow_l_Collar,Collar +m_LeatherCollarBow_l_BandCollar,BandCollar +m_LeatherCollarBow_l_HardwareCollar,HardwareCollar +m_LeatherCollarBow_l_BowBellCollar,BowBellCollar +m_LeatherCollarBow_l_BowCollar,BowCollar +m_LeatherBelt,LeatherBelt +m_LeatherBelt_l_Belt,Belt +m_LeatherBelt_l_BandBelt,BandBelt +m_LeatherBelt_l_HardwareBelt,HardwareBelt +m_SlimeMouth,SlimeMouth +m_SlimeMouth_l_FaceMouth,FaceMouth +m_SlimeEyes,SlimeEyes +m_SlimeEyes_l_FaceEyes,FaceEyes +m_SlimeHead,SlimeHead +m_SlimeHead_l_FaceFull,FaceFull +m_SlimeBoots,SlimeBoots +m_SlimeBoots_l_FootLeft,FootLeft +m_SlimeBoots_l_FootRight,FootRight +m_SlimeTorsoLower,SlimeTorsoLower +m_SlimeTorsoLower_l_TorsoLower,TorsoLower +m_SlimeThighs,SlimeThighs +m_SlimeThighs_l_LegLeft,LegLeft +m_SlimeThighs_l_LegRight,LegRight +m_SlimeLegs,SlimeLegs +m_SlimeLegs_l_LegLeft,LegLeft +m_SlimeLegs_l_LegRight,LegRight +m_SlimeLegs_l_TorsoLower,TorsoLower +m_SlimeFeet,SlimeFeet +m_SlimeFeet_l_AnkleLeft,AnkleLeft +m_SlimeFeet_l_AnkleRight,AnkleRight +m_SlimeArmLeft,SlimeArmLeft +m_SlimeArmLeft_l_ArmLeft,ArmLeft +m_SlimeArmRight,SlimeArmRight +m_SlimeArmRight_l_ArmRight,ArmRight +m_SlimeTorsoUpper,SlimeTorsoUpper +m_SlimeTorsoUpper_l_TorsoUpper,TorsoUpper +m_SlimeTorsoUpper_l_Chest,Chest +m_SlimeArms,SlimeArms +m_SlimeArms_l_ArmLeft,ArmLeft +m_SlimeArms_l_ArmRight,ArmRight +m_SlimeArms_l_TorsoUpper,TorsoUpper +m_SlimeArms_l_Chest,Chest +m_SlimeHandLeft,SlimeHandLeft +m_SlimeHandLeft_l_HandLeft,HandLeft +m_SlimeHandRight,SlimeHandRight +m_SlimeHandRight_l_HandRight,HandRight +m_SlimeHands,SlimeHands +m_SlimeHands_l_HandLeft,HandLeft +m_SlimeHands_l_HandRight,HandRight +m_RubberMouth,RubberMouth +m_RubberMouth_l_FaceMouth,FaceMouth +m_RubberEyes,RubberEyes +m_RubberEyes_l_FaceEyes,FaceEyes +m_RubberHead,RubberHead +m_RubberHead_l_FaceFull,FaceFull +m_RubberBoots,RubberBoots +m_RubberBoots_l_FootLeft,FootLeft +m_RubberBoots_l_FootRight,FootRight +m_RubberTorsoLower,RubberTorsoLower +m_RubberTorsoLower_l_TorsoLower,TorsoLower +m_RubberThighs,RubberThighs +m_RubberThighs_l_LegLeft,LegLeft +m_RubberThighs_l_LegRight,LegRight +m_RubberLegs,RubberLegs +m_RubberLegs_l_LegLeft,LegLeft +m_RubberLegs_l_LegRight,LegRight +m_RubberLegs_l_TorsoLower,TorsoLower +m_RubberFeet,RubberFeet +m_RubberFeet_l_AnkleLeft,AnkleLeft +m_RubberFeet_l_AnkleRight,AnkleRight +m_RubberArmLeft,RubberArmLeft +m_RubberArmLeft_l_ArmLeft,ArmLeft +m_RubberArmRight,RubberArmRight +m_RubberArmRight_l_ArmRight,ArmRight +m_RubberTorsoUpper,RubberTorsoUpper +m_RubberTorsoUpper_l_TorsoUpper,TorsoUpper +m_RubberTorsoUpper_l_Chest,Chest +m_RubberArms,RubberArms +m_RubberArms_l_ArmLeft,ArmLeft +m_RubberArms_l_ArmRight,ArmRight +m_RubberArms_l_TorsoUpper,TorsoUpper +m_RubberArms_l_Chest,Chest +m_RubberHandLeft,RubberHandLeft +m_RubberHandLeft_l_HandLeft,HandLeft +m_RubberHandRight,RubberHandRight +m_RubberHandRight_l_HandRight,HandRight +m_RubberHands,RubberHands +m_RubberHands_l_HandLeft,HandLeft +m_RubberHands_l_HandRight,HandRight +m_TapeMedBoots,TapeMedBoots +m_TapeMedBoots_l_Feet,Feet +m_TapeMedAnkles,TapeMedAnkles +m_TapeMedAnkles_l_Ankles,Ankles +m_TapeMedLegs,TapeMedLegs +m_TapeMedLegs_l_Legs,Legs +m_TapeMedLegs_l_RightLegs,RightLegs +m_TapeMedLegs_l_StrapCover,StrapCover +m_TapeMedBottom,TapeMedBottom +m_TapeMedArms,TapeMedArms +m_TapeMedArms_l_Top,Top +m_TapeMedArms_l_Chest,Chest +m_TapeMedArms_l_ArmLeft,ArmLeft +m_TapeMedArms_l_ArmRight,ArmRight +m_TapeFullArms,TapeFullArms +m_TapeFullArms_l_TopFull,TopFull +m_TapeFullArms_l_ChestFull,ChestFull +m_TapeFullArms_l_ArmFullLeft,ArmFullLeft +m_TapeFullArms_l_ArmFullRight,ArmFullRight +m_TapeMedHandLeft,TapeMedHandLeft +m_TapeMedHandLeft_l_HandLeft,HandLeft +m_TapeMedHandRight,TapeMedHandRight +m_TapeMedHandRight_l_HandRight,HandRight +m_TapeHeavyBoots,TapeHeavyBoots +m_TapeHeavyBoots_l_Feet,Feet +m_TapeHeavyAnkles,TapeHeavyAnkles +m_TapeHeavyAnkles_l_Ankles,Ankles +m_TapeHeavyLegs,TapeHeavyLegs +m_TapeHeavyLegs_l_Legs,Legs +m_TapeHeavyLegs_l_RightLegs,RightLegs +m_TapeHeavyLegs_l_StrapCover,StrapCover +m_TapeHeavyBottom,TapeHeavyBottom +m_TapeHeavyBottom_l_Bottom,Bottom +m_TapeHeavyBottomFull,TapeHeavyBottomFull +m_TapeHeavyBottomFull_l_Bottom,Bottom +m_TapeHeavyBottomFull_l_Legs,Legs +m_TapeHeavyBottomFull_l_RightLegs,RightLegs +m_TapeHeavyBottomFull_l_StrapCover,StrapCover +m_TapeHeavyArms,TapeHeavyArms +m_TapeHeavyArms_l_Top,Top +m_TapeHeavyArms_l_Chest,Chest +m_TapeHeavyArms_l_ArmLeft,ArmLeft +m_TapeHeavyArms_l_ArmRight,ArmRight +m_TapeHeavyArmsFull,TapeHeavyArmsFull +m_TapeHeavyArmsFull_l_Top,Top +m_TapeHeavyArmsFull_l_Chest,Chest +m_TapeHeavyArmsFull_l_ArmLeft,ArmLeft +m_TapeHeavyArmsFull_l_ArmRight,ArmRight +m_TapeHeavyArmsFull_l_TopFull,TopFull +m_TapeHeavyArmsFull_l_ChestFull,ChestFull +m_TapeHeavyArmsFull_l_ArmFullLeft,ArmFullLeft +m_TapeHeavyArmsFull_l_ArmFullRight,ArmFullRight +m_TapeHeavyHandLeft,TapeHeavyHandLeft +m_TapeHeavyHandLeft_l_HandLeft,HandLeft +m_TapeHeavyHandRight,TapeHeavyHandRight +m_TapeHeavyHandRight_l_HandRight,HandRight +m_TapeHeavyHands,TapeHeavyHands +m_TapeHeavyHands_l_HandLeft,HandLeft +m_TapeHeavyHands_l_HandRight,HandRight +m_TapeBoots,TapeBoots +m_TapeBoots_l_Feet,Feet +m_TapeAnkles,TapeAnkles +m_TapeAnkles_l_Ankles,Ankles +m_TapeLegs,TapeLegs +m_TapeLegs_l_Legs,Legs +m_TapeLegs_l_RightLegs,RightLegs +m_TapeBottom,TapeBottom +m_TapeTorsoUpper,TapeTorsoUpper +m_TapeTorsoUpper_l_Top,Top +m_TapeArmLeft,TapeArmLeft +m_TapeArmLeft_l_ArmLeft,ArmLeft +m_TapeArmRight,TapeArmRight +m_TapeArmRight_l_ArmRight,ArmRight +m_TapeArms,TapeArms +m_TapeArms_l_ArmLeft,ArmLeft +m_TapeArms_l_ArmRight,ArmRight +m_TapeArms_l_Top,Top +m_TapeStrapArms,TapeStrapArms +m_TapeStrapArms_l_TopStrap,TopStrap +m_TapeStrapArms_l_ChestStrap,ChestStrap +m_TapeStrapArms_l_ArmStrapLeft,ArmStrapLeft +m_TapeStrapArms_l_ArmStrapRight,ArmStrapRight +m_TapeStrappedArms,TapeStrappedArms +m_TapeStrappedArms_l_ArmLeft,ArmLeft +m_TapeStrappedArms_l_ArmRight,ArmRight +m_TapeStrappedArms_l_Top,Top +m_TapeStrappedArms_l_TopStrap,TopStrap +m_TapeStrappedArms_l_ChestStrap,ChestStrap +m_TapeStrappedArms_l_ArmStrapLeft,ArmStrapLeft +m_TapeStrappedArms_l_ArmStrapRight,ArmStrapRight +m_TapeHandLeft,TapeHandLeft +m_TapeHandLeft_l_HandLeft,HandLeft +m_TapeHandRight,TapeHandRight +m_TapeHandRight_l_HandRight,HandRight +m_BraProto,BraProto +m_BraProto_l_BraProto,BraProto +m_BraProto_l_BraProtoLining,BraProtoLining +m_BraProto_l_BraProtoLiningMid,BraProtoLiningMid +m_BraProto_l_BraProtoCups,BraProtoCups +m_BraProto_l_BraProtoDisplay,BraProtoDisplay +m_BraProto_l_BraProtoLock,BraProtoLock +m_BraCyber,BraCyber +m_BraCyber_l_BraCyber,BraCyber +m_BraCyber_l_BraCyberLining,BraCyberLining +m_BraCyber_l_BraCyberDisplay,BraCyberDisplay +m_BraCyber_l_BraCyberLock,BraCyberLock +m_ChastityBra,ChastityBra +m_ChastityBra_l_BraCups,BraCups +m_ChastityBra_l_BraLining,BraLining +m_ChastityBra_l_BraChain,BraChain +m_ChastityBra_l_BraLock,BraLock +m_HeartBelt,HeartBelt +m_HeartBelt_l_Belt,Belt +m_HeartBelt_l_BeltLining,BeltLining +m_HeartBelt_l_BeltLock,BeltLock +m_HeartBelt_l_BeltStrap,BeltStrap +m_HeartBelt_l_BeltStrapLining,BeltStrapLining +m_CyberBelt,CyberBelt +m_CyberBelt_l_Cyber,Cyber +m_CyberBelt_l_CyberLining,CyberLining +m_CyberBelt_l_CyberDisplay,CyberDisplay +m_CyberBelt_l_CyberPlug,CyberPlug +m_CyberBelt_l_CyberLock,CyberLock +m_ProtoBelt,ProtoBelt +m_ProtoBelt_l_Proto,Proto +m_ProtoBelt_l_ProtoLining,ProtoLining +m_ProtoBelt_l_ProtoDisplay,ProtoDisplay +m_ProtoBelt_l_ProtoPlug,ProtoPlug +m_ProtoBelt_l_ProtoLock,ProtoLock +m_SmoothArmbinder,SmoothArmbinder +m_SmoothArmbinder_l_BinderLeft,BinderLeft +m_SmoothArmbinder_l_BinderRight,BinderRight +m_Armbinder,Armbinder +m_Armbinder_l_BinderLeft,BinderLeft +m_Armbinder_l_BinderRight,BinderRight +m_Armbinder_l_StrapsLeft,StrapsLeft +m_Armbinder_l_StrapsRight,StrapsRight +m_ArmbinderCross,ArmbinderCross +m_ArmbinderCross_l_BinderLeft,BinderLeft +m_ArmbinderCross_l_BinderRight,BinderRight +m_ArmbinderCross_l_StrapsLeft,StrapsLeft +m_ArmbinderCross_l_StrapsRight,StrapsRight +m_ArmbinderCross_l_Cross,Cross +m_SmoothArmbinderCross,SmoothArmbinderCross +m_SmoothArmbinderCross_l_BinderLeft,BinderLeft +m_SmoothArmbinderCross_l_BinderRight,BinderRight +m_SmoothArmbinderCross_l_Cross,Cross +m_ArmbinderSecure,ArmbinderSecure +m_ArmbinderSecure_l_BinderLeft,BinderLeft +m_ArmbinderSecure_l_BinderRight,BinderRight +m_ArmbinderSecure_l_StrapsLeft,StrapsLeft +m_ArmbinderSecure_l_StrapsRight,StrapsRight +m_ArmbinderSecure_l_Secure,Secure +m_SmoothArmbinderSecure,SmoothArmbinderSecure +m_SmoothArmbinderSecure_l_BinderLeft,BinderLeft +m_SmoothArmbinderSecure_l_BinderRight,BinderRight +m_SmoothArmbinderSecure_l_Secure,Secure +m_ArmbinderGwen,ArmbinderGwen +m_ArmbinderGwen_l_BinderLeft,BinderLeft +m_ArmbinderGwen_l_BinderRight,BinderRight +m_ArmbinderGwen_l_StrapsLeft,StrapsLeft +m_ArmbinderGwen_l_StrapsRight,StrapsRight +m_ArmbinderGwen_l_Gwen,Gwen +m_SmoothArmbinderGwen,SmoothArmbinderGwen +m_SmoothArmbinderGwen_l_BinderLeft,BinderLeft +m_SmoothArmbinderGwen_l_BinderRight,BinderRight +m_SmoothArmbinderGwen_l_Gwen,Gwen +m_WolfArmbinder,WolfArmbinder +m_WolfArmbinder_l_BinderLeft,BinderLeft +m_WolfArmbinder_l_BinderRight,BinderRight +m_WolfArmbinder_l_StrapsLeft,StrapsLeft +m_WolfArmbinder_l_StrapsRight,StrapsRight +m_WolfArmbinder_l_WolfHarness,WolfHarness +m_JacketArmbinder,JacketArmbinder +m_JacketArmbinder_l_Arms,Arms +m_JacketArmbinder_l_BeltsArms,BeltsArms +m_Jacket,Jacket +m_Jacket_l_Arms,Arms +m_Jacket_l_BeltsArms,BeltsArms +m_Jacket_l_Chest,Chest +m_Jacket_l_BeltsChest,BeltsChest +m_JacketHeavy,JacketHeavy +m_JacketHeavy_l_Arms,Arms +m_JacketHeavy_l_BeltsArms,BeltsArms +m_JacketHeavy_l_Chest,Chest +m_JacketHeavy_l_BeltsChest,BeltsChest +m_JacketHeavy_l_BinderTorsoLower,BinderTorsoLower +m_JacketHeavy_l_BeltsTorsoLower,BeltsTorsoLower +m_JacketHeavy_l_Crotch,Crotch +m_JacketHeavy_l_CrotchBelts,CrotchBelts +m_JacketStraps,JacketStraps +m_JacketStraps_l_StrapsArms,StrapsArms +m_JacketStraps_l_StrapsChest,StrapsChest +m_JacketStraps_l_StrapsUnderbust,StrapsUnderbust +m_JacketArmbinderSecure,JacketArmbinderSecure +m_JacketArmbinderSecure_l_Arms,Arms +m_JacketArmbinderSecure_l_StrapsArms,StrapsArms +m_JacketArmbinderSecure_l_StrapsChest,StrapsChest +m_JacketArmbinderSecure_l_StrapsUnderbust,StrapsUnderbust +m_JacketBolero,JacketBolero +m_JacketBolero_l_Arms,Arms +m_JacketBolero_l_ChestBolero,ChestBolero +m_JacketBolero_l_StrapsArms,StrapsArms +m_JacketBolero_l_StrapsChest,StrapsChest +m_JacketBolero_l_StrapsUnderbust,StrapsUnderbust +m_JacketLeotard,JacketLeotard +m_JacketLeotard_l_Arms,Arms +m_JacketLeotard_l_ChestBolero,ChestBolero +m_JacketLeotard_l_StrapsArms,StrapsArms +m_JacketLeotard_l_StrapsChest,StrapsChest +m_JacketLeotard_l_StrapsUnderbust,StrapsUnderbust +m_JacketLeotard_l_LatexLower,LatexLower +m_JacketLeotard_l_LatexChest,LatexChest +m_JacketLeotard_l_LatexUpper,LatexUpper +m_Legbinder,Legbinder +m_Legbinder_l_Legbinder,Legbinder +m_Legbinder_l_LegLegbinder,LegLegbinder +m_Legbinder_l_RightLegbinder,RightLegbinder +m_Legbinder_l_LegRightLegbinder,LegRightLegbinder +m_Legbinder_l_LacesLegbinder,LacesLegbinder +m_TapeFace,TapeFace +m_TapeFace_l_Face,Face +m_ClothBlindfold,ClothBlindfold +m_ClothBlindfold_l_Cloth,Cloth +m_BlindfoldBasic,BlindfoldBasic +m_BlindfoldBasic_l_Basic,Basic +m_BlindfoldBasic_l_BasicRim,BasicRim +m_BlindfoldLeather,BlindfoldLeather +m_BlindfoldLeather_l_LeatherBase,LeatherBase +m_BlindfoldLeather_l_LeatherRim,LeatherRim +m_KittyBlindfold,KittyBlindfold +m_KittyBlindfold_l_LeatherBase,LeatherBase +m_KittyBlindfold_l_LeatherRim,LeatherRim +m_KittyBlindfold_l_KittyEyes,KittyEyes +m_BlindfoldTape,BlindfoldTape +m_BlindfoldTape_l_Tape,Tape +m_BalletHeels,BalletHeels +m_BalletHeels_l_BalletLeft,BalletLeft +m_BalletHeels_l_BalletRight,BalletRight +m_BalletHeels_l_BalletSoleLeft,BalletSoleLeft +m_BalletHeels_l_BalletSoleRight,BalletSoleRight +m_BalletHeels_l_BalletLaceLeft,BalletLaceLeft +m_BalletHeels_l_BalletLaceRight,BalletLaceRight +m_FlatBalletHeels,FlatBalletHeels +m_FlatBalletHeels_l_FlatBalletLeft,FlatBalletLeft +m_FlatBalletHeels_l_FlatBalletRight,FlatBalletRight +m_FlatBalletHeels_l_BalletSoleLeft,BalletSoleLeft +m_FlatBalletHeels_l_BalletSoleRight,BalletSoleRight +m_ShinyBalletHeels,ShinyBalletHeels +m_ShinyBalletHeels_l_ShinyBalletLeft,ShinyBalletLeft +m_ShinyBalletHeels_l_ShinyBalletRight,ShinyBalletRight +m_ShinyBalletHeels_l_BalletSoleLeft,BalletSoleLeft +m_ShinyBalletHeels_l_BalletSoleRight,BalletSoleRight +m_BalletHeelsRestraint,BalletHeelsRestraint +m_BalletHeelsRestraint_l_BalletLeft,BalletLeft +m_BalletHeelsRestraint_l_BalletRight,BalletRight +m_BalletHeelsRestraint_l_BalletSoleLeft,BalletSoleLeft +m_BalletHeelsRestraint_l_BalletSoleRight,BalletSoleRight +m_BalletHeelsRestraint_l_BalletLaceLeft,BalletLaceLeft +m_BalletHeelsRestraint_l_BalletLaceRight,BalletLaceRight +m_FlatBalletHeelsRestraint,FlatBalletHeelsRestraint +m_FlatBalletHeelsRestraint_l_FlatBalletLeft,FlatBalletLeft +m_FlatBalletHeelsRestraint_l_FlatBalletRight,FlatBalletRight +m_FlatBalletHeelsRestraint_l_BalletSoleLeft,BalletSoleLeft +m_FlatBalletHeelsRestraint_l_BalletSoleRight,BalletSoleRight +m_ShinyBalletHeelsRestraint,ShinyBalletHeelsRestraint +m_ShinyBalletHeelsRestraint_l_ShinyBalletLeft,ShinyBalletLeft +m_ShinyBalletHeelsRestraint_l_ShinyBalletRight,ShinyBalletRight +m_ShinyBalletHeelsRestraint_l_BalletSoleLeft,BalletSoleLeft +m_ShinyBalletHeelsRestraint_l_BalletSoleRight,BalletSoleRight +m_LeatherHeels,LeatherHeels +m_LeatherHeels_l_LeatherLeft,LeatherLeft +m_LeatherHeels_l_LeatherRight,LeatherRight +m_LeatherHeels_l_LeatherLegLeft,LeatherLegLeft +m_LeatherHeels_l_LeatherLegRight,LeatherLegRight +m_TallHeels,TallHeels +m_TallHeels_l_TallLeft,TallLeft +m_TallHeels_l_TallRight,TallRight +m_TallHeels_l_TallLegLeft,TallLegLeft +m_TallHeels_l_TallLegRight,TallLegRight +m_TallHeelsRestraint,TallHeelsRestraint +m_TallHeelsRestraint_l_TallLeft,TallLeft +m_TallHeelsRestraint_l_TallRight,TallRight +m_TallHeelsRestraint_l_TallLegLeft,TallLegLeft +m_TallHeelsRestraint_l_TallLegRight,TallLegRight +m_Legirons,Legirons +m_Legirons_l_LegironsLeft,LegironsLeft +m_Legirons_l_LegironsRight,LegironsRight +m_Irish8Ankle,Irish8Ankle +m_Irish8Ankle_l_Irish8AnkleLeft,Irish8AnkleLeft +m_Irish8Ankle_l_Irish8AnkleRight,Irish8AnkleRight +m_HandCuffs,HandCuffs +m_HandCuffs_l_CuffsLock,CuffsLock +m_HandCuffs_l_HandCuffs,HandCuffs +m_HingedCuffs,HingedCuffs +m_HingedCuffs_l_CuffsLock,CuffsLock +m_HingedCuffs_l_HingedCuffs,HingedCuffs +m_Irish8Cuffs,Irish8Cuffs +m_Irish8Cuffs_l_CuffsLock,CuffsLock +m_Irish8Cuffs_l_Irish8Cuffs,Irish8Cuffs +m_WolfCuffs,WolfCuffs +m_WolfCuffs_l_WolfCuffs,WolfCuffs +m_WolfCuffs_l_WolfCuffsChain,WolfCuffsChain +m_Thumbcuffs,Thumbcuffs +m_Thumbcuffs_l_Thumbcuffs,Thumbcuffs +m_HarnessTop,HarnessTop +m_HarnessTop_l_BeltsTop,BeltsTop +m_HarnessTop_l_HardwareTop,HardwareTop +m_HarnessMid,HarnessMid +m_HarnessMid_l_BeltsMid,BeltsMid +m_HarnessMid_l_HardwareMid,HardwareMid +m_HarnessStrap,HarnessStrap +m_HarnessStrap_l_BeltsStrap,BeltsStrap +m_HarnessStrap_l_HardwareStrap,HardwareStrap +m_Harness,Harness +m_Harness_l_BeltsTop,BeltsTop +m_Harness_l_HardwareTop,HardwareTop +m_Harness_l_BeltsOverbust,BeltsOverbust +m_Harness_l_BeltsUnderbust,BeltsUnderbust +m_Harness_l_HardwareUnderbustOver,HardwareUnderbustOver +m_Harness_l_HardwareUnderbust,HardwareUnderbust +m_Harness_l_BeltsMid,BeltsMid +m_Harness_l_HardwareMid,HardwareMid +m_Harness_l_BeltsStrap,BeltsStrap +m_Harness_l_HardwareStrap,HardwareStrap +m_FutureHarnessChest,FutureHarnessChest +m_FutureHarnessChest_l_StrapsChest,StrapsChest +m_FutureHarnessChest_l_DisplayChest,DisplayChest +m_FutureHarnessChest_l_MetalChest,MetalChest +m_FutureHarnessMid,FutureHarnessMid +m_FutureHarnessMid_l_StrapsMid,StrapsMid +m_FutureHarnessMid_l_DisplayMid,DisplayMid +m_FutureHarnessMid_l_MetalMid,MetalMid +m_FutureHarnessLower,FutureHarnessLower +m_FutureHarnessLower_l_StrapsLower,StrapsLower +m_FutureHarnessLower_l_DisplayLower,DisplayLower +m_FutureHarnessLower_l_MetalLower,MetalLower +m_FutureHarness,FutureHarness +m_FutureHarness_l_StrapsLower,StrapsLower +m_FutureHarness_l_DisplayLower,DisplayLower +m_FutureHarness_l_MetalLower,MetalLower +m_FutureHarness_l_StrapsMid,StrapsMid +m_FutureHarness_l_DisplayMid,DisplayMid +m_FutureHarness_l_MetalMid,MetalMid +m_FutureHarness_l_StrapsChest,StrapsChest +m_FutureHarness_l_DisplayChest,DisplayChest +m_FutureHarness_l_MetalChest,MetalChest +m_ClothCollar,ClothCollar +m_ClothCollar_l_Collar,Collar +m_ClothCollarTag,ClothCollarTag +m_ClothCollarTag_l_Collar,Collar +m_ClothCollarTag_l_CollarTag,CollarTag +m_ClothBelt,ClothBelt +m_ClothBelt_l_Belt,Belt +m_ClothBeltLines,ClothBeltLines +m_ClothBeltLines_l_Belt,Belt +m_ClothBeltLines_l_BeltLines,BeltLines +m_MaidGag,MaidGag +m_MaidGag_l_FrillyPanel,FrillyPanel +m_MaidGag_l_FrillyStraps,FrillyStraps +m_MaidGag_l_FrillyHardware,FrillyHardware +m_MaidGag_l_FrillyHighlights,FrillyHighlights +m_DusterGag,DusterGag +m_DusterGag_l_FrillyPanel,FrillyPanel +m_DusterGag_l_FrillyStraps,FrillyStraps +m_DusterGag_l_FrillyHardware,FrillyHardware +m_DusterGag_l_FrillyHighlights,FrillyHighlights +m_DusterGag_l_Duster,Duster +m_GhostGag,GhostGag +m_GhostGag_l_Ball,Ball +m_GhostGag_l_Strap,Strap +m_BallGag,BallGag +m_BallGag_l_Ball,Ball +m_BallGag_l_Strap,Strap +m_BallGagHarness,BallGagHarness +m_BallGagHarness_l_Ball,Ball +m_BallGagHarness_l_Strap,Strap +m_BallGagHarness_l_Harness,Harness +m_BallGagHarnessSecure,BallGagHarnessSecure +m_BallGagHarnessSecure_l_Ball,Ball +m_BallGagHarnessSecure_l_Strap,Strap +m_BallGagHarnessSecure_l_Harness,Harness +m_BallGagHarnessSecure_l_SideStrap,SideStrap +m_LargeBallGag,LargeBallGag +m_LargeBallGag_l_Ball,Ball +m_LargeBallGag_l_Strap,Strap +m_LargeBallGagHarness,LargeBallGagHarness +m_LargeBallGagHarness_l_Ball,Ball +m_LargeBallGagHarness_l_Strap,Strap +m_LargeBallGagHarness_l_Harness,Harness +m_LargeBallGagHarnessSecure,LargeBallGagHarnessSecure +m_LargeBallGagHarnessSecure_l_Ball,Ball +m_LargeBallGagHarnessSecure_l_Strap,Strap +m_LargeBallGagHarnessSecure_l_Harness,Harness +m_LargeBallGagHarnessSecure_l_SideStrap,SideStrap +m_PanelGag,PanelGag +m_PanelGag_l_Panel,Panel +m_PanelGag_l_Strap,Strap +m_PanelGagHarness,PanelGagHarness +m_PanelGagHarness_l_Panel,Panel +m_PanelGagHarness_l_Strap,Strap +m_PanelGagHarness_l_Harness,Harness +m_PanelGagHarnessSecure,PanelGagHarnessSecure +m_PanelGagHarnessSecure_l_Panel,Panel +m_PanelGagHarnessSecure_l_Strap,Strap +m_PanelGagHarnessSecure_l_Harness,Harness +m_PanelGagHarnessSecure_l_SideStrap,SideStrap +m_MuzzleGag,MuzzleGag +m_MuzzleGag_l_Muzzle,Muzzle +m_MuzzleGag_l_Strap,Strap +m_MuzzleGagHarness,MuzzleGagHarness +m_MuzzleGagHarness_l_Muzzle,Muzzle +m_MuzzleGagHarness_l_Strap,Strap +m_MuzzleGagHarness_l_Harness,Harness +m_MuzzleGagHarnessSecure,MuzzleGagHarnessSecure +m_MuzzleGagHarnessSecure_l_Muzzle,Muzzle +m_MuzzleGagHarnessSecure_l_Strap,Strap +m_MuzzleGagHarnessSecure_l_Harness,Harness +m_MuzzleGagHarnessSecure_l_SideStrap,SideStrap +m_PlugGagPlug,PlugGagPlug +m_PlugGagPlug_l_Plug,Plug +m_PlugMuzzleGag,PlugMuzzleGag +m_PlugMuzzleGag_l_Muzzle,Muzzle +m_PlugMuzzleGag_l_Strap,Strap +m_PlugMuzzleGag_l_Plug,Plug +m_PlugMuzzleGagHarness,PlugMuzzleGagHarness +m_PlugMuzzleGagHarness_l_Muzzle,Muzzle +m_PlugMuzzleGagHarness_l_Strap,Strap +m_PlugMuzzleGagHarness_l_Harness,Harness +m_PlugMuzzleGagHarness_l_Plug,Plug +m_PlugMuzzleGagHarnessSecure,PlugMuzzleGagHarnessSecure +m_PlugMuzzleGagHarnessSecure_l_Muzzle,Muzzle +m_PlugMuzzleGagHarnessSecure_l_Strap,Strap +m_PlugMuzzleGagHarnessSecure_l_Harness,Harness +m_PlugMuzzleGagHarnessSecure_l_SideStrap,SideStrap +m_PlugMuzzleGagHarnessSecure_l_Plug,Plug +m_PlugPanelGag,PlugPanelGag +m_PlugPanelGag_l_Panel,Panel +m_PlugPanelGag_l_Strap,Strap +m_PlugPanelGag_l_Plug,Plug +m_PlugPanelGagHarness,PlugPanelGagHarness +m_PlugPanelGagHarness_l_Panel,Panel +m_PlugPanelGagHarness_l_Strap,Strap +m_PlugPanelGagHarness_l_Harness,Harness +m_PlugPanelGagHarness_l_Plug,Plug +m_PlugPanelGagHarnessSecure,PlugPanelGagHarnessSecure +m_PlugPanelGagHarnessSecure_l_Panel,Panel +m_PlugPanelGagHarnessSecure_l_Strap,Strap +m_PlugPanelGagHarnessSecure_l_Harness,Harness +m_PlugPanelGagHarnessSecure_l_SideStrap,SideStrap +m_PlugPanelGagHarnessSecure_l_Plug,Plug +m_Stuffing,Stuffing +m_Stuffing_l_Stuffing,Stuffing +m_TapeFull,TapeFull +m_TapeFull_l_Full,Full +m_TapeWrap,TapeWrap +m_TapeWrap_l_Wrap,Wrap +m_TapeFullOver,TapeFullOver +m_TapeFullOver_l_Full,Full +m_TapeWrapOver,TapeWrapOver +m_TapeWrapOver_l_Wrap,Wrap +m_TapeCleave,TapeCleave +m_TapeCleave_l_Cleave,Cleave +m_ClothCleave,ClothCleave +m_ClothCleave_l_Cleave,Cleave +m_ClothCleaveThick,ClothCleaveThick +m_ClothCleaveThick_l_CleaveThick,CleaveThick +m_ClothKnot,ClothKnot +m_ClothKnot_l_Knot,Knot +m_ClothOTN,ClothOTN +m_ClothOTN_l_OTN,OTN +m_ClothOTM,ClothOTM +m_ClothOTM_l_OTM,OTM +m_GagLatex,GagLatex +m_GagLatex_l_OTN,OTN +m_GagLatexFlat,GagLatexFlat +m_GagLatexFlat_l_OTNFlat,OTNFlat +m_GagLatexFlatHarness,GagLatexFlatHarness +m_GagLatexFlatHarness_l_OTNFlat,OTNFlat +m_GagLatexFlatHarness_l_Harness,Harness +m_GagLatexFlatHarnessSecure,GagLatexFlatHarnessSecure +m_GagLatexFlatHarnessSecure_l_OTNFlat,OTNFlat +m_GagLatexFlatHarnessSecure_l_Harness,Harness +m_GagLatexFlatHarnessSecure_l_SideStrap,SideStrap +m_GagLatexPlug,GagLatexPlug +m_GagLatexPlug_l_OTNFlat,OTNFlat +m_GagLatexPlug_l_Plug,Plug +m_GagLatexPlugHarness,GagLatexPlugHarness +m_GagLatexPlugHarness_l_OTNFlat,OTNFlat +m_GagLatexPlugHarness_l_Plug,Plug +m_GagLatexPlugHarness_l_Harness,Harness +m_GagLatexPlugHarnessSecure,GagLatexPlugHarnessSecure +m_GagLatexPlugHarnessSecure_l_OTNFlat,OTNFlat +m_GagLatexPlugHarnessSecure_l_Plug,Plug +m_GagLatexPlugHarnessSecure_l_Harness,Harness +m_GagLatexPlugHarnessSecure_l_SideStrap,SideStrap +m_LatexNeckCorset,LatexNeckCorset +m_LatexNeckCorset_l_NeckCorset,NeckCorset +m_LatexNeckCorset_l_NeckCorsetRim,NeckCorsetRim +m_LatexNeckCorsetGag,LatexNeckCorsetGag +m_LatexNeckCorsetGag_l_NeckCorset,NeckCorset +m_LatexNeckCorsetGag_l_NeckCorsetRim,NeckCorsetRim +m_LatexNeckCorsetGag_l_OTNFlat,OTNFlat +m_LatexNeckCorsetRestraint,LatexNeckCorsetRestraint +m_LatexNeckCorsetRestraint_l_NeckCorset,NeckCorset +m_LatexNeckCorsetRestraint_l_NeckCorsetRim,NeckCorsetRim +m_LatexNeckCorsetGagRestraint,LatexNeckCorsetGagRestraint +m_LatexNeckCorsetGagRestraint_l_NeckCorset,NeckCorset +m_LatexNeckCorsetGagRestraint_l_NeckCorsetRim,NeckCorsetRim +m_LatexNeckCorsetGagRestraint_l_OTNFlat,OTNFlat +m_LatexNeckCorsetPlugGag,LatexNeckCorsetPlugGag +m_LatexNeckCorsetPlugGag_l_NeckCorset,NeckCorset +m_LatexNeckCorsetPlugGag_l_NeckCorsetRim,NeckCorsetRim +m_LatexNeckCorsetPlugGag_l_OTNFlat,OTNFlat +m_LatexNeckCorsetPlugGag_l_Plug,Plug +m_GagMetal,GagMetal +m_GagMetal_l_OTN,OTN +m_GagFabric,GagFabric +m_GagFabric_l_FabricMuzzle,FabricMuzzle +m_KittyMuzzle,KittyMuzzle +m_KittyMuzzle_l_FabricMuzzle,FabricMuzzle +m_KittyMuzzle_l_KittyMouth,KittyMouth +m_KittyMuzzle_l_Whiskers,Whiskers +m_KittyHarnessPanelGag,KittyHarnessPanelGag +m_KittyHarnessPanelGag_l_Panel,Panel +m_KittyHarnessPanelGag_l_Strap,Strap +m_KittyHarnessPanelGag_l_Harness,Harness +m_KittyHarnessPanelGag_l_SideStrap,SideStrap +m_KittyHarnessPanelGag_l_KittyMouth,KittyMouth +m_GagComfy,GagComfy +m_GagComfy_l_FabricMuzzle,FabricMuzzle +m_GagMetalRiveted,GagMetalRiveted +m_GagMetalRiveted_l_OTN,OTN +m_GagMetalRiveted_l_OTNRivets,OTNRivets +m_SmoothBallGag,SmoothBallGag +m_SmoothBallGag_l_Ball,Ball +m_SmoothBallGag_l_Strap,Strap +m_SmoothBallGagHarness,SmoothBallGagHarness +m_SmoothBallGagHarness_l_Ball,Ball +m_SmoothBallGagHarness_l_Strap,Strap +m_SmoothBallGagHarness_l_Harness,Harness +m_SmoothBallGagHarnessSecure,SmoothBallGagHarnessSecure +m_SmoothBallGagHarnessSecure_l_Ball,Ball +m_SmoothBallGagHarnessSecure_l_Strap,Strap +m_SmoothBallGagHarnessSecure_l_Harness,Harness +m_SmoothBallGagHarnessSecure_l_SideStrap,SideStrap +m_SmoothLargeBallGag,SmoothLargeBallGag +m_SmoothLargeBallGag_l_Ball,Ball +m_SmoothLargeBallGag_l_Strap,Strap +m_SmoothLargeBallGagHarness,SmoothLargeBallGagHarness +m_SmoothLargeBallGagHarness_l_Ball,Ball +m_SmoothLargeBallGagHarness_l_Strap,Strap +m_SmoothLargeBallGagHarness_l_Harness,Harness +m_SmoothLargeBallGagHarnessSecure,SmoothLargeBallGagHarnessSecure +m_SmoothLargeBallGagHarnessSecure_l_Ball,Ball +m_SmoothLargeBallGagHarnessSecure_l_Strap,Strap +m_SmoothLargeBallGagHarnessSecure_l_Harness,Harness +m_SmoothLargeBallGagHarnessSecure_l_SideStrap,SideStrap +m_SegmentedLargeBallGag,SegmentedLargeBallGag +m_SegmentedLargeBallGag_l_Ball,Ball +m_SegmentedLargeBallGag_l_Strap,Strap +m_SegmentedLargeBallGagHarness,SegmentedLargeBallGagHarness +m_SegmentedLargeBallGagHarness_l_Ball,Ball +m_SegmentedLargeBallGagHarness_l_Strap,Strap +m_SegmentedLargeBallGagHarness_l_Harness,Harness +m_SegmentedLargeBallGagHarnessSecure,SegmentedLargeBallGagHarnessSecure +m_SegmentedLargeBallGagHarnessSecure_l_Ball,Ball +m_SegmentedLargeBallGagHarnessSecure_l_Strap,Strap +m_SegmentedLargeBallGagHarnessSecure_l_Harness,Harness +m_SegmentedLargeBallGagHarnessSecure_l_SideStrap,SideStrap +m_SciFiBallGag,SciFiBallGag +m_SciFiBallGag_l_Ball,Ball +m_SciFiBallGag_l_Strap,Strap +m_SciFiBallGag_l_Harness,Harness +m_SciFiBallGag_l_TopRim,TopRim +m_SciFiBallGag_l_Display,Display +m_EnhancedSciFiBallGag,EnhancedSciFiBallGag +m_EnhancedSciFiBallGag_l_Ball,Ball +m_EnhancedSciFiBallGag_l_Strap,Strap +m_EnhancedSciFiBallGag_l_Harness,Harness +m_EnhancedSciFiBallGag_l_TopRim,TopRim +m_EnhancedSciFiBallGag_l_Display,Display +m_EnhancedSciFiBallGag_l_Mask,Mask +m_AdvancedSciFiBallGag,AdvancedSciFiBallGag +m_AdvancedSciFiBallGag_l_Ball,Ball +m_AdvancedSciFiBallGag_l_Strap,Strap +m_AdvancedSciFiBallGag_l_Harness,Harness +m_AdvancedSciFiBallGag_l_TopRim,TopRim +m_AdvancedSciFiBallGag_l_Display,Display +m_AdvancedSciFiBallGag_l_Mask,Mask +m_AdvancedSciFiBallGag_l_HarnessRim,HarnessRim +m_AdvancedSciFiBallGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiBallGag,UltimateSciFiBallGag +m_UltimateSciFiBallGag_l_Ball,Ball +m_UltimateSciFiBallGag_l_Strap,Strap +m_UltimateSciFiBallGag_l_Harness,Harness +m_UltimateSciFiBallGag_l_TopRim,TopRim +m_UltimateSciFiBallGag_l_Display,Display +m_UltimateSciFiBallGag_l_Mask,Mask +m_UltimateSciFiBallGag_l_HarnessRim,HarnessRim +m_UltimateSciFiBallGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiBallGag_l_Muzzle,Muzzle +m_UltimateSciFiBallGag2,UltimateSciFiBallGag2 +m_UltimateSciFiBallGag2_l_Ball,Ball +m_UltimateSciFiBallGag2_l_Strap,Strap +m_UltimateSciFiBallGag2_l_Harness,Harness +m_UltimateSciFiBallGag2_l_TopRim,TopRim +m_UltimateSciFiBallGag2_l_Display,Display +m_UltimateSciFiBallGag2_l_Mask,Mask +m_UltimateSciFiBallGag2_l_HarnessRim,HarnessRim +m_UltimateSciFiBallGag2_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiBallGag2_l_Muzzle,Muzzle +m_SegmentedLargePanelGag,SegmentedLargePanelGag +m_SegmentedLargePanelGag_l_Panel,Panel +m_SegmentedLargePanelGag_l_Strap,Strap +m_SegmentedLargePanelGag_l_Mask,Mask +m_SegmentedLargePanelGagHarness,SegmentedLargePanelGagHarness +m_SegmentedLargePanelGagHarness_l_Panel,Panel +m_SegmentedLargePanelGagHarness_l_Strap,Strap +m_SegmentedLargePanelGagHarness_l_Mask,Mask +m_SegmentedLargePanelGagHarness_l_Harness,Harness +m_SegmentedLargePanelGagHarnessSecure,SegmentedLargePanelGagHarnessSecure +m_SegmentedLargePanelGagHarnessSecure_l_Panel,Panel +m_SegmentedLargePanelGagHarnessSecure_l_Strap,Strap +m_SegmentedLargePanelGagHarnessSecure_l_Mask,Mask +m_SegmentedLargePanelGagHarnessSecure_l_Harness,Harness +m_SegmentedLargePanelGagHarnessSecure_l_SideStrap,SideStrap +m_SciFiPanelGag,SciFiPanelGag +m_SciFiPanelGag_l_Panel,Panel +m_SciFiPanelGag_l_Strap,Strap +m_SciFiPanelGag_l_Mask,Mask +m_SciFiPanelGag_l_Harness,Harness +m_SciFiPanelGag_l_TopRim,TopRim +m_SciFiPanelGag_l_Display,Display +m_AdvancedSciFiPanelGag,AdvancedSciFiPanelGag +m_AdvancedSciFiPanelGag_l_Panel,Panel +m_AdvancedSciFiPanelGag_l_Strap,Strap +m_AdvancedSciFiPanelGag_l_Mask,Mask +m_AdvancedSciFiPanelGag_l_Harness,Harness +m_AdvancedSciFiPanelGag_l_TopRim,TopRim +m_AdvancedSciFiPanelGag_l_Display,Display +m_AdvancedSciFiPanelGag_l_HarnessRim,HarnessRim +m_AdvancedSciFiPanelGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPanelGag,UltimateSciFiPanelGag +m_UltimateSciFiPanelGag_l_Panel,Panel +m_UltimateSciFiPanelGag_l_Strap,Strap +m_UltimateSciFiPanelGag_l_Mask,Mask +m_UltimateSciFiPanelGag_l_Harness,Harness +m_UltimateSciFiPanelGag_l_TopRim,TopRim +m_UltimateSciFiPanelGag_l_Display,Display +m_UltimateSciFiPanelGag_l_HarnessRim,HarnessRim +m_UltimateSciFiPanelGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPanelGag_l_Muzzle,Muzzle +m_UltimateSciFiPanelGag2,UltimateSciFiPanelGag2 +m_UltimateSciFiPanelGag2_l_Panel,Panel +m_UltimateSciFiPanelGag2_l_Strap,Strap +m_UltimateSciFiPanelGag2_l_Mask,Mask +m_UltimateSciFiPanelGag2_l_Harness,Harness +m_UltimateSciFiPanelGag2_l_TopRim,TopRim +m_UltimateSciFiPanelGag2_l_Display,Display +m_UltimateSciFiPanelGag2_l_HarnessRim,HarnessRim +m_UltimateSciFiPanelGag2_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPanelGag2_l_Muzzle,Muzzle +m_SegmentedPlugGag,SegmentedPlugGag +m_SegmentedPlugGag_l_Panel,Panel +m_SegmentedPlugGag_l_Strap,Strap +m_SegmentedPlugGag_l_Mask,Mask +m_SegmentedPlugGag_l_Plug,Plug +m_SegmentedPlugGagHarness,SegmentedPlugGagHarness +m_SegmentedPlugGagHarness_l_Panel,Panel +m_SegmentedPlugGagHarness_l_Strap,Strap +m_SegmentedPlugGagHarness_l_Mask,Mask +m_SegmentedPlugGagHarness_l_Plug,Plug +m_SegmentedPlugGagHarness_l_Harness,Harness +m_SegmentedPlugGagHarnessSecure,SegmentedPlugGagHarnessSecure +m_SegmentedPlugGagHarnessSecure_l_Panel,Panel +m_SegmentedPlugGagHarnessSecure_l_Strap,Strap +m_SegmentedPlugGagHarnessSecure_l_Mask,Mask +m_SegmentedPlugGagHarnessSecure_l_Plug,Plug +m_SegmentedPlugGagHarnessSecure_l_Harness,Harness +m_SegmentedPlugGagHarnessSecure_l_SideStrap,SideStrap +m_SciFiPlugGag,SciFiPlugGag +m_SciFiPlugGag_l_Panel,Panel +m_SciFiPlugGag_l_Strap,Strap +m_SciFiPlugGag_l_Mask,Mask +m_SciFiPlugGag_l_Plug,Plug +m_SciFiPlugGag_l_Harness,Harness +m_SciFiPlugGag_l_TopRim,TopRim +m_SciFiPlugGag_l_Display,Display +m_AdvancedSciFiPlugGag,AdvancedSciFiPlugGag +m_AdvancedSciFiPlugGag_l_Panel,Panel +m_AdvancedSciFiPlugGag_l_Strap,Strap +m_AdvancedSciFiPlugGag_l_Mask,Mask +m_AdvancedSciFiPlugGag_l_Plug,Plug +m_AdvancedSciFiPlugGag_l_Harness,Harness +m_AdvancedSciFiPlugGag_l_TopRim,TopRim +m_AdvancedSciFiPlugGag_l_Display,Display +m_AdvancedSciFiPlugGag_l_HarnessRim,HarnessRim +m_AdvancedSciFiPlugGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPlugGag,UltimateSciFiPlugGag +m_UltimateSciFiPlugGag_l_Panel,Panel +m_UltimateSciFiPlugGag_l_Strap,Strap +m_UltimateSciFiPlugGag_l_Mask,Mask +m_UltimateSciFiPlugGag_l_Plug,Plug +m_UltimateSciFiPlugGag_l_Harness,Harness +m_UltimateSciFiPlugGag_l_TopRim,TopRim +m_UltimateSciFiPlugGag_l_Display,Display +m_UltimateSciFiPlugGag_l_HarnessRim,HarnessRim +m_UltimateSciFiPlugGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPlugGag_l_Muzzle,Muzzle +m_UltimateSciFiPlugGag2,UltimateSciFiPlugGag2 +m_UltimateSciFiPlugGag2_l_Panel,Panel +m_UltimateSciFiPlugGag2_l_Strap,Strap +m_UltimateSciFiPlugGag2_l_Mask,Mask +m_UltimateSciFiPlugGag2_l_Plug,Plug +m_UltimateSciFiPlugGag2_l_Harness,Harness +m_UltimateSciFiPlugGag2_l_TopRim,TopRim +m_UltimateSciFiPlugGag2_l_Display,Display +m_UltimateSciFiPlugGag2_l_HarnessRim,HarnessRim +m_UltimateSciFiPlugGag2_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPlugGag2_l_Muzzle,Muzzle +m_SimpleSciFiMuzzle,SimpleSciFiMuzzle +m_SimpleSciFiMuzzle_l_HarnessRim,HarnessRim +m_SimpleSciFiMuzzle_l_HarnessDisplay,HarnessDisplay +m_SimpleSciFiMuzzle_l_Muzzle,Muzzle +m_AdvancedSciFiMuzzle,AdvancedSciFiMuzzle +m_AdvancedSciFiMuzzle_l_HarnessRim,HarnessRim +m_AdvancedSciFiMuzzle_l_HarnessDisplay,HarnessDisplay +m_AdvancedSciFiMuzzle_l_Muzzle,Muzzle +m_AdvancedSciFiMuzzle_l_Mask,Mask +m_SciFiPlugMuzzle,SciFiPlugMuzzle +m_SciFiPlugMuzzle_l_HarnessRim,HarnessRim +m_SciFiPlugMuzzle_l_HarnessDisplay,HarnessDisplay +m_SciFiPlugMuzzle_l_Muzzle,Muzzle +m_SciFiPlugMuzzle_l_Plug,Plug +m_AdvancedSciFiPlugMuzzle,AdvancedSciFiPlugMuzzle +m_AdvancedSciFiPlugMuzzle_l_HarnessRim,HarnessRim +m_AdvancedSciFiPlugMuzzle_l_HarnessDisplay,HarnessDisplay +m_AdvancedSciFiPlugMuzzle_l_Muzzle,Muzzle +m_AdvancedSciFiPlugMuzzle_l_Mask,Mask +m_AdvancedSciFiPlugMuzzle_l_Plug,Plug +m_SimpleSciFiMuzzle2,SimpleSciFiMuzzle2 +m_SimpleSciFiMuzzle2_l_HarnessRim,HarnessRim +m_SimpleSciFiMuzzle2_l_HarnessDisplay,HarnessDisplay +m_SimpleSciFiMuzzle2_l_Muzzle,Muzzle +m_AdvancedSciFiMuzzle2,AdvancedSciFiMuzzle2 +m_AdvancedSciFiMuzzle2_l_HarnessRim,HarnessRim +m_AdvancedSciFiMuzzle2_l_HarnessDisplay,HarnessDisplay +m_AdvancedSciFiMuzzle2_l_Muzzle,Muzzle +m_AdvancedSciFiMuzzle2_l_Mask,Mask +m_BeltsArms1,BeltsArms1 +m_BeltsArms1_l_Arms1,Arms1 +m_BeltsArms1_l_LeftArm1,LeftArm1 +m_BeltsArms1_l_RightArm1,RightArm1 +m_BeltsArms2,BeltsArms2 +m_BeltsArms2_l_Arms2,Arms2 +m_BeltsArms2_l_LeftArm2,LeftArm2 +m_BeltsArms2_l_RightArm2,RightArm2 +m_BeltsArmsAll,BeltsArmsAll +m_BeltsArmsAll_l_Arms1,Arms1 +m_BeltsArmsAll_l_LeftArm1,LeftArm1 +m_BeltsArmsAll_l_RightArm1,RightArm1 +m_BeltsArmsAll_l_Arms2,Arms2 +m_BeltsArmsAll_l_LeftArm2,LeftArm2 +m_BeltsArmsAll_l_RightArm2,RightArm2 +m_BeltsLegs1,BeltsLegs1 +m_BeltsLegs1_l_Legs1,Legs1 +m_BeltsLegs1_l_RightLegs1,RightLegs1 +m_BeltsLegs2,BeltsLegs2 +m_BeltsLegs2_l_Legs2,Legs2 +m_BeltsLegs2_l_RightLegs2,RightLegs2 +m_BeltsLegsAll,BeltsLegsAll +m_BeltsLegsAll_l_Legs1,Legs1 +m_BeltsLegsAll_l_RightLegs1,RightLegs1 +m_BeltsLegsAll_l_Legs2,Legs2 +m_BeltsLegsAll_l_RightLegs2,RightLegs2 +m_BeltsFeet1,BeltsFeet1 +m_BeltsFeet1_l_Feet1,Feet1 +m_BeltsFeet2,BeltsFeet2 +m_BeltsFeet2_l_Feet2,Feet2 +m_BeltsFeetAll,BeltsFeetAll +m_BeltsFeetAll_l_Feet1,Feet1 +m_BeltsFeetAll_l_Feet2,Feet2 +m_Belt,Belt +m_Belt_l_Belt,Belt +m_ShadowHandsArms1,ShadowHandsArms1 +m_ShadowHandsArms1_l_Arms1,Arms1 +m_ShadowHandsArms2,ShadowHandsArms2 +m_ShadowHandsArms2_l_Arms2,Arms2 +m_ShadowHandsArms2_l_LeftArm2,LeftArm2 +m_ShadowHandsArmsAll,ShadowHandsArmsAll +m_ShadowHandsArmsAll_l_Arms1,Arms1 +m_ShadowHandsArmsAll_l_Arms2,Arms2 +m_ShadowHandsArmsAll_l_LeftArm2,LeftArm2 +m_ShadowHandsLegs1,ShadowHandsLegs1 +m_ShadowHandsLegs1_l_Legs1,Legs1 +m_ShadowHandsLegs1_l_RightLegs1,RightLegs1 +m_ShadowHandsLegs2,ShadowHandsLegs2 +m_ShadowHandsLegs2_l_Legs2,Legs2 +m_ShadowHandsLegs2_l_RightLegs2,RightLegs2 +m_ShadowHandsLegsAll,ShadowHandsLegsAll +m_ShadowHandsLegsAll_l_Legs1,Legs1 +m_ShadowHandsLegsAll_l_RightLegs1,RightLegs1 +m_ShadowHandsLegsAll_l_Legs2,Legs2 +m_ShadowHandsLegsAll_l_RightLegs2,RightLegs2 +m_ShadowHandsFeet,ShadowHandsFeet +m_ShadowHandsFeet_l_Feet1,Feet1 +m_ShadowHandsMouth,ShadowHandsMouth +m_ShadowHandsMouth_l_Mouth,Mouth +m_ShadowHandsEyes,ShadowHandsEyes +m_ShadowHandsEyes_l_Eyes,Eyes +m_ShadowHandsCrotch,ShadowHandsCrotch +m_ShadowHandsCrotch_l_Crotch,Crotch +m_ShadowHandsCrotch_l_CrotchStrap,CrotchStrap +m_Cage,Cage +m_Cage_l_CageFront,CageFront +m_Cage_l_CageBack,CageBack +m_Sarcophagus,Sarcophagus +m_Sarcophagus_l_SarcoFront,SarcoFront +m_Sarcophagus_l_SarcoWebs,SarcoWebs +m_Sarcophagus_l_SarcoBack,SarcoBack +m_Bed,Bed +m_Bed_l_Bed,Bed +m_LatexCube,LatexCube +m_LatexCube_l_LatexCube,LatexCube +m_LatexCube_l_LatexCubeBack,LatexCubeBack +m_Barrel,Barrel +m_Barrel_l_Barrel,Barrel +m_DisplayStand,DisplayStand +m_DisplayStand_l_DisplayFront,DisplayFront +m_OneBarPrison,OneBarPrison +m_OneBarPrison_l_OneBarFront,OneBarFront +m_OneBarPrison_l_OneBarBack,OneBarBack +m_StardustCollar,StardustCollar +m_StardustCollar_l_Collar,Collar +m_Leash,Leash +m_Leash_l_Leash,Leash +m_MikoCollar,MikoCollar +m_MikoCollar_l_DragonCollar,DragonCollar +m_MikoCollar_l_NeckCorset,NeckCorset +m_MikoCollar_l_NeckCorsetRim,NeckCorsetRim +m_FutureCollar,FutureCollar +m_FutureCollar_l_Future,Future +m_FutureCollar_l_FutureBand,FutureBand +m_FutureCollar_l_FutureDisplay,FutureDisplay +m_FutureCollar_l_FutureRim,FutureRim +m_FutureCollar_l_FutureLock,FutureLock +m_FutureCollarRestraint,FutureCollarRestraint +m_FutureCollarRestraint_l_Future,Future +m_FutureCollarRestraint_l_FutureBand,FutureBand +m_FutureCollarRestraint_l_FutureDisplay,FutureDisplay +m_FutureCollarRestraint_l_FutureRim,FutureRim +m_FutureCollarRestraint_l_FutureLock,FutureLock +m_ShockModule,ShockModule +m_ShockModule_l_Module,Module +m_ShockModule_l_ModuleDisplay,ModuleDisplay +m_TrackingModule,TrackingModule +m_TrackingModule_l_TrackingModule,TrackingModule +m_TrackingModule_l_TrackingModuleDisplay,TrackingModuleDisplay +m_Goggles,Goggles +m_Goggles_l_Dollmaker,Dollmaker +m_GogglesRestraint,GogglesRestraint +m_GogglesRestraint_l_Dollmaker,Dollmaker +m_FullVisor,FullVisor +m_FullVisor_l_DollmakerFull,DollmakerFull +m_FullVisorRim,FullVisorRim +m_FullVisorRim_l_DollmakerFull,DollmakerFull +m_FullVisorRim_l_DollmakerFullRim,DollmakerFullRim +m_FullVisorRestraint,FullVisorRestraint +m_FullVisorRestraint_l_DollmakerFull,DollmakerFull +m_FullVisorRimRestraint,FullVisorRimRestraint +m_FullVisorRimRestraint_l_DollmakerFull,DollmakerFull +m_FullVisorRimRestraint_l_DollmakerFullRim,DollmakerFullRim +m_GasMask,GasMask +m_GasMask_l_Mask,Mask +m_GasMask_l_Valves,Valves +m_GasMask_l_Center,Center +m_GasMask_l_Nose,Nose +m_GasMask_l_Plugs,Plugs +m_GasMaskRestraint,GasMaskRestraint +m_GasMaskRestraint_l_Mask,Mask +m_GasMaskRestraint_l_Valves,Valves +m_GasMaskRestraint_l_Center,Center +m_GasMaskRestraint_l_Nose,Nose +m_GasMaskRestraint_l_Plugs,Plugs +m_Petsuit,Petsuit +m_Petsuit_l_Arms,Arms +m_Petsuit_l_Legs,Legs +m_Petsuit_l_LeftLegs,LeftLegs + + + +m_HairBow_l_Bow,Bow +m_HairBowFrilly_l_Bow,Bow +m_HairBowFrilly_l_BowFrills,BowFrills +m_Hairband_l_Hairband,Hairband +m_MaidHairband_l_Hairband,Hairband +m_MaidHairband_l_MaidFrill,MaidFrill +m_Braid_l_Braid,Braid +m_Braid_l_Braid_Overstrap,Braid_Overstrap +m_Braid_l_BraidBack,BraidBack +m_BackStraight_l_BackStraight,BackStraight +m_Curly_l_Curly,Curly +m_Curly_l_Curly_Overstrap,Curly_Overstrap +m_Fluffy_l_Fuzzy,Fuzzy +m_Fluffy_l_Fuzzy_Overstrap,Fuzzy_Overstrap +m_FrontStraight_l_FrontStraight,FrontStraight +m_FrontStraight_l_FrontStraight_Overstrap,FrontStraight_Overstrap +m_Straight_l_Straight,Straight +m_Straight_l_Straight_Overstrap,Straight_Overstrap +m_StraightBangs_l_StraightBangs,StraightBangs +m_StraightBangs_l_StraightBangs_Overstrap,StraightBangs_Overstrap +m_MessyBack_l_Messy,Messy +m_ShortMessyBack_l_BackShortMessy,BackShortMessy +m_ShortMessyBack_l_BackShortMessyUnderlight,BackShortMessyUnderlight +m_Ponytail_l_Ponytail,Ponytail +m_FluffyPonytail_l_Ponytail2,Ponytail2 +m_TwintailLeft_l_TwintailLeft,TwintailLeft +m_TwintailRight_l_TwintailRight,TwintailRight +m_Ahoge_l_Ahoge,Ahoge +m_Body_l_Head,Head +m_Body_l_ArmRight,ArmRight +m_Body_l_ArmLeft,ArmLeft +m_Body_l_ShoulderRight,ShoulderRight +m_Body_l_ShoulderLeft,ShoulderLeft +m_Body_l_ForeArmRight,ForeArmRight +m_Body_l_ForeArmLeft,ForeArmLeft +m_Body_l_HandRight,HandRight +m_Body_l_HandLeft,HandLeft +m_Body_l_ForeHandRight,ForeHandRight +m_Body_l_ForeHandLeft,ForeHandLeft +m_Body_l_LegLeft,LegLeft +m_Body_l_Torso,Torso +m_Body_l_Chest,Chest +m_Body_l_FootRightKneel,FootRightKneel +m_Body_l_FootLeftHogtie,FootLeftHogtie +m_Body_l_LegRight,LegRight +m_Body_l_Butt,Butt +m_KoiEyes_l_Eyes,Eyes +m_KoiEyes_l_Eyes2,Eyes2 +m_KoiEyes_l_Whites,Whites +m_KoiEyes_l_Whites2,Whites2 +m_HumanEyes_l_Eyes,Eyes +m_HumanEyes_l_Eyes2,Eyes2 +m_HumanEyes_l_Whites,Whites +m_HumanEyes_l_Whites2,Whites2 +m_KoiBrows_l_Brows,Brows +m_KoiBrows_l_Brows2,Brows2 +m_KoiMouth_l_Mouth,Mouth +m_KoiBlush_l_Blush,Blush +m_KjusEyes_l_Eyes,Eyes +m_KjusEyes_l_Eyes2,Eyes2 +m_KjusEyes_l_Whites,Whites +m_KjusEyes_l_Whites2,Whites2 +m_KjusEyes2,KjusEyes2 +m_KjusEyes2_l_Eyes,Eyes +m_KjusEyes2_l_Eyes2,Eyes2 +m_KjusEyes2_l_Whites,Whites +m_KjusEyes2_l_Whites2,Whites2 +m_KjusEyes3,KjusEyes3 +m_KjusEyes3_l_Eyes,Eyes +m_KjusEyes3_l_Eyes2,Eyes2 +m_KjusEyes3_l_Whites,Whites +m_KjusEyes3_l_Whites2,Whites2 +m_KjusEyes4,KjusEyes4 +m_KjusEyes4_l_Eyes,Eyes +m_KjusEyes4_l_Eyes2,Eyes2 +m_KjusEyes4_l_Whites,Whites +m_KjusEyes4_l_Whites2,Whites2 +m_KjusBrows_l_Brows,Brows +m_KjusBrows_l_Brows2,Brows2 +m_KjusMouth_l_Mouth,Mouth +m_KjusBlush_l_Blush,Blush +m_DaskEyes_l_Eyes,Eyes +m_DaskEyes_l_Eyes2,Eyes2 +m_DaskEyes_l_Whites,Whites +m_DaskEyes_l_Whites2,Whites2 +m_ElfEars_l_ElfFront,ElfFront +m_ElfEars_l_ElfBack,ElfBack +m_ElfEarsLong_l_ElfLongFront,ElfLongFront +m_ElfEarsLong_l_ElfLongBack,ElfLongBack +m_ElfEarsFloppy_l_ElfFloppyFront,ElfFloppyFront +m_ElfEarsFloppy_l_ElfFloppyBack,ElfFloppyBack +m_ElfEarrings_l_ElfEarringsFront,ElfEarringsFront +m_ElfEarrings_l_ElfEarringsBack,ElfEarringsBack +m_Earrings_l_Earrings,Earrings +m_Earrings_l_EarringsBack,EarringsBack +m_BunnyEars_l_Ears,Ears +m_BunnyEars_l_EarsInner,EarsInner +m_KittyEars_l_Kitty,Kitty +m_KittyEars_l_KittyInner,KittyInner +m_WolfEars_l_Wolf,Wolf +m_WolfEars_l_WolfInner,WolfInner +m_FoxEars_l_Fox,Fox +m_FoxEars_l_FoxInner,FoxInner +m_WolfTail_l_Wolf,Wolf +m_KittyTail_l_Kitty,Kitty +m_Kitty2Tail_l_Kitty,Kitty +m_Kitty2Tail_l_Kitty2,Kitty2 +m_FoxTail_l_Fox,Fox +m_Fox2Tail_l_Fox,Fox +m_Fox2Tail_l_Fox2,Fox2 +m_Fox3Tail_l_Fox3,Fox3 +m_Fox4Tail_l_Fox4,Fox4 +m_Fox5Tail_l_Fox5,Fox5 +m_Fox6Tail_l_Fox6,Fox6 +m_Fox7Tail_l_Fox7,Fox7 +m_CatsuitLower_l_TorsoLower,TorsoLower +m_CatsuitLower_l_FootRight,FootRight +m_CatsuitLower_l_FootRightKneel,FootRightKneel +m_CatsuitLower_l_FootLeft,FootLeft +m_CatsuitLower_l_FootLeftHogtie,FootLeftHogtie +m_CatsuitLower_l_LegRight,LegRight +m_CatsuitLower_l_LegLeft,LegLeft +m_CatsuitLower_l_Butt,Butt +m_CatsuitLowerLowRise,CatsuitLowerLowRise +m_CatsuitLowerLowRise_l_TorsoLowerLowRise,TorsoLowerLowRise +m_CatsuitLowerLowRise_l_FootRight,FootRight +m_CatsuitLowerLowRise_l_FootRightKneel,FootRightKneel +m_CatsuitLowerLowRise_l_FootLeft,FootLeft +m_CatsuitLowerLowRise_l_FootLeftHogtie,FootLeftHogtie +m_CatsuitLowerLowRise_l_LegRight,LegRight +m_CatsuitLowerLowRise_l_LegLeft,LegLeft +m_CatsuitLowerLowRise_l_Butt,Butt +m_CatsuitUpper_l_ArmRight,ArmRight +m_CatsuitUpper_l_ArmLeft,ArmLeft +m_CatsuitUpper_l_ShoulderRight,ShoulderRight +m_CatsuitUpper_l_ShoulderLeft,ShoulderLeft +m_CatsuitUpper_l_ForeArmRight,ForeArmRight +m_CatsuitUpper_l_ForeArmLeft,ForeArmLeft +m_CatsuitUpper_l_HandRight,HandRight +m_CatsuitUpper_l_HandLeft,HandLeft +m_CatsuitUpper_l_ForeHandRight,ForeHandRight +m_CatsuitUpper_l_ForeHandLeft,ForeHandLeft +m_CatsuitUpper_l_TorsoUpper,TorsoUpper +m_CatsuitUpper_l_Chest,Chest +m_SleevelessCatsuitUpper,SleevelessCatsuitUpper +m_SleevelessCatsuitUpper_l_SleevelessTorsoUpper,SleevelessTorsoUpper +m_SleevelessCatsuitUpper_l_Chest,Chest +m_CatsuitTop,CatsuitTop +m_CatsuitTop_l_SleevelessTop,SleevelessTop +m_CatsuitTop_l_SleevelessTopChest,SleevelessTopChest +m_CatsuitTopV,CatsuitTopV +m_CatsuitTopV_l_SleevelessTopV,SleevelessTopV +m_CatsuitTopV_l_SleevelessTopVChest,SleevelessTopVChest +m_CatsuitUpperCropped,CatsuitUpperCropped +m_CatsuitUpperCropped_l_ArmRight,ArmRight +m_CatsuitUpperCropped_l_ArmLeft,ArmLeft +m_CatsuitUpperCropped_l_ShoulderRight,ShoulderRight +m_CatsuitUpperCropped_l_ShoulderLeft,ShoulderLeft +m_CatsuitUpperCropped_l_ForeArmRight,ForeArmRight +m_CatsuitUpperCropped_l_ForeArmLeft,ForeArmLeft +m_CatsuitUpperCropped_l_HandRight,HandRight +m_CatsuitUpperCropped_l_HandLeft,HandLeft +m_CatsuitUpperCropped_l_ForeHandRight,ForeHandRight +m_CatsuitUpperCropped_l_ForeHandLeft,ForeHandLeft +m_CatsuitUpperCropped_l_TorsoUpperCrop,TorsoUpperCrop +m_CatsuitUpperCropped_l_Chest,Chest +m_Catsuit_l_ArmRight,ArmRight +m_Catsuit_l_ArmLeft,ArmLeft +m_Catsuit_l_ShoulderRight,ShoulderRight +m_Catsuit_l_ShoulderLeft,ShoulderLeft +m_Catsuit_l_ForeArmRight,ForeArmRight +m_Catsuit_l_ForeArmLeft,ForeArmLeft +m_Catsuit_l_HandRight,HandRight +m_Catsuit_l_HandLeft,HandLeft +m_Catsuit_l_ForeHandRight,ForeHandRight +m_Catsuit_l_ForeHandLeft,ForeHandLeft +m_Catsuit_l_TorsoUpper,TorsoUpper +m_Catsuit_l_Chest,Chest +m_Catsuit_l_TorsoLower,TorsoLower +m_Catsuit_l_FootRight,FootRight +m_Catsuit_l_FootRightKneel,FootRightKneel +m_Catsuit_l_FootLeft,FootLeft +m_Catsuit_l_FootLeftHogtie,FootLeftHogtie +m_Catsuit_l_LegRight,LegRight +m_Catsuit_l_LegLeft,LegLeft +m_Catsuit_l_Butt,Butt +m_TransparentCatsuitUpper,TransparentCatsuitUpper +m_TransparentCatsuitUpper_l_ArmRight,ArmRight +m_TransparentCatsuitUpper_l_ArmLeft,ArmLeft +m_TransparentCatsuitUpper_l_ShoulderRight,ShoulderRight +m_TransparentCatsuitUpper_l_ShoulderLeft,ShoulderLeft +m_TransparentCatsuitUpper_l_ForeArmRight,ForeArmRight +m_TransparentCatsuitUpper_l_ForeArmLeft,ForeArmLeft +m_TransparentCatsuitUpper_l_HandRight,HandRight +m_TransparentCatsuitUpper_l_HandLeft,HandLeft +m_TransparentCatsuitUpper_l_ForeHandRight,ForeHandRight +m_TransparentCatsuitUpper_l_ForeHandLeft,ForeHandLeft +m_TransparentCatsuitUpper_l_TorsoUpper,TorsoUpper +m_TransparentCatsuitUpper_l_Chest,Chest +m_TransparentCatsuitUpperCropped,TransparentCatsuitUpperCropped +m_TransparentCatsuitUpperCropped_l_ArmRight,ArmRight +m_TransparentCatsuitUpperCropped_l_ArmLeft,ArmLeft +m_TransparentCatsuitUpperCropped_l_ShoulderRight,ShoulderRight +m_TransparentCatsuitUpperCropped_l_ShoulderLeft,ShoulderLeft +m_TransparentCatsuitUpperCropped_l_ForeArmRight,ForeArmRight +m_TransparentCatsuitUpperCropped_l_ForeArmLeft,ForeArmLeft +m_TransparentCatsuitUpperCropped_l_HandRight,HandRight +m_TransparentCatsuitUpperCropped_l_HandLeft,HandLeft +m_TransparentCatsuitUpperCropped_l_ForeHandRight,ForeHandRight +m_TransparentCatsuitUpperCropped_l_ForeHandLeft,ForeHandLeft +m_TransparentCatsuitUpperCropped_l_TorsoUpperCrop,TorsoUpperCrop +m_TransparentCatsuitUpperCropped_l_Chest,Chest +m_TransparentCatsuitLower,TransparentCatsuitLower +m_TransparentCatsuitLower_l_TorsoLower,TorsoLower +m_TransparentCatsuitLower_l_FootRight,FootRight +m_TransparentCatsuitLower_l_FootRightKneel,FootRightKneel +m_TransparentCatsuitLower_l_FootLeft,FootLeft +m_TransparentCatsuitLower_l_FootLeftHogtie,FootLeftHogtie +m_TransparentCatsuitLower_l_LegRight,LegRight +m_TransparentCatsuitLower_l_LegLeft,LegLeft +m_TransparentCatsuitLower_l_Butt,Butt +m_TransparentCatsuitLowerLowRise,TransparentCatsuitLowerLowRise +m_TransparentCatsuitLowerLowRise_l_TorsoLowerLowRise,TorsoLowerLowRise +m_TransparentCatsuitLowerLowRise_l_FootRight,FootRight +m_TransparentCatsuitLowerLowRise_l_FootRightKneel,FootRightKneel +m_TransparentCatsuitLowerLowRise_l_FootLeft,FootLeft +m_TransparentCatsuitLowerLowRise_l_FootLeftHogtie,FootLeftHogtie +m_TransparentCatsuitLowerLowRise_l_LegRight,LegRight +m_TransparentCatsuitLowerLowRise_l_LegLeft,LegLeft +m_TransparentCatsuitLowerLowRise_l_Butt,Butt +m_TransparentCatsuit_l_ArmRight,ArmRight +m_TransparentCatsuit_l_ArmLeft,ArmLeft +m_TransparentCatsuit_l_ShoulderRight,ShoulderRight +m_TransparentCatsuit_l_ShoulderLeft,ShoulderLeft +m_TransparentCatsuit_l_ForeArmRight,ForeArmRight +m_TransparentCatsuit_l_ForeArmLeft,ForeArmLeft +m_TransparentCatsuit_l_HandRight,HandRight +m_TransparentCatsuit_l_HandLeft,HandLeft +m_TransparentCatsuit_l_ForeHandRight,ForeHandRight +m_TransparentCatsuit_l_ForeHandLeft,ForeHandLeft +m_TransparentCatsuit_l_TorsoUpper,TorsoUpper +m_TransparentCatsuit_l_Chest,Chest +m_TransparentCatsuit_l_TorsoLower,TorsoLower +m_TransparentCatsuit_l_FootRight,FootRight +m_TransparentCatsuit_l_FootRightKneel,FootRightKneel +m_TransparentCatsuit_l_FootLeft,FootLeft +m_TransparentCatsuit_l_FootLeftHogtie,FootLeftHogtie +m_TransparentCatsuit_l_LegRight,LegRight +m_TransparentCatsuit_l_LegLeft,LegLeft +m_TransparentCatsuit_l_Butt,Butt +m_Labcoat_l_Shoulders,Shoulders +m_Labcoat_l_ShouldersHogtie,ShouldersHogtie +m_Labcoat_l_Coat,Coat +m_Labcoat_l_CoatHogtieFree,CoatHogtieFree +m_Labcoat_l_Cape,Cape +m_Cape_l_Shoulders,Shoulders +m_Cape_l_ShouldersHogtie,ShouldersHogtie +m_Cape_l_Cape,Cape +m_Pauldrons_l_Pauldrons,Pauldrons +m_Breastplate_l_Breastplate,Breastplate +m_PlateBoots_l_BootLeft,BootLeft +m_PlateBoots_l_BootRight,BootRight +m_PlateBoots_l_BootRightKneel,BootRightKneel +m_PlateBoots_l_BootLeftHogtie,BootLeftHogtie +m_GauntletLeft_l_GauntletLeft,GauntletLeft +m_GauntletRight_l_GauntletRight,GauntletRight +m_Gauntlets_l_GauntletRight,GauntletRight +m_Gauntlets_l_GauntletLeft,GauntletLeft +m_PlateArmor_l_Breastplate,Breastplate +m_PlateArmor_l_Pauldrons,Pauldrons +m_PlateArmor_l_BootLeft,BootLeft +m_PlateArmor_l_BootRight,BootRight +m_PlateArmor_l_BootRightKneel,BootRightKneel +m_PlateArmor_l_BootLeftHogtie,BootLeftHogtie +m_PlateArmor_l_GauntletRight,GauntletRight +m_PlateArmor_l_GauntletLeft,GauntletLeft +m_ChainShirt_l_Shirt,Shirt +m_ChainShirt_l_ShirtChest,ShirtChest +m_ChainSkirt_l_Skirt,Skirt +m_ChainArmor_l_Shirt,Shirt +m_ChainArmor_l_ShirtChest,ShirtChest +m_ChainArmor_l_Skirt,Skirt +m_BanditShorts_l_Shorts,Shorts +m_BanditShorts_l_ShortsLeft,ShortsLeft +m_BanditPouch_l_Pouch,Pouch +m_BanditKnee_l_Knee,Knee +m_BanditChoker_l_Choker,Choker +m_BanditLeftWrist_l_WristLeft,WristLeft +m_BanditRightWrist_l_WristRight,WristRight +m_BanditWrist_l_WristLeft,WristLeft +m_BanditWrist_l_WristRight,WristRight +m_BanditBoots_l_ShoeLeft,ShoeLeft +m_BanditBoots_l_ShoeRight,ShoeRight +m_BanditBoots_l_ShoeRightKneel,ShoeRightKneel +m_BanditBoots_l_ShoeLeftHogtie,ShoeLeftHogtie +m_BanditBreastplate_l_Breastplate,Breastplate +m_Bandit_l_Shorts,Shorts +m_Bandit_l_ShortsLeft,ShortsLeft +m_Bandit_l_Breastplate,Breastplate +m_Bandit_l_WristLeft,WristLeft +m_Bandit_l_WristRight,WristRight +m_Bandit_l_Pouch,Pouch +m_Bandit_l_Knee,Knee +m_Bandit_l_Choker,Choker +m_MaidSkirt_l_Skirt,Skirt +m_MaidSkirt_l_Stripe,Stripe +m_MaidSkirt_l_SkirtOver,SkirtOver +m_MaidSkirt_l_StripeOver,StripeOver +m_MaidApron_l_Apron,Apron +m_MaidBlouse_l_Blouse,Blouse +m_MaidBlouse_l_BlouseBust,BlouseBust +m_MaidBow_l_Bow,Bow +m_MaidCorset_l_Corset,Corset +m_MaidCorsetFull_l_Corset,Corset +m_MaidCorsetFull_l_CorsetStraps,CorsetStraps +m_StockingLeft_l_SockLeft,SockLeft +m_StockingLeft_l_FootSockLeftHogtie,FootSockLeftHogtie +m_StockingLeft_l_StripeSockLeft,StripeSockLeft +m_StockingRight_l_SockRight,SockRight +m_StockingRight_l_FootSockRightKneel,FootSockRightKneel +m_StockingRight_l_StripeSockRight,StripeSockRight +m_MaidSockLeft_l_SockLeft,SockLeft +m_MaidSockLeft_l_FootSockLeftHogtie,FootSockLeftHogtie +m_MaidSockLeft_l_StripeSockLeft,StripeSockLeft +m_MaidSockRight_l_SockRight,SockRight +m_MaidSockRight_l_FootSockRightKneel,FootSockRightKneel +m_MaidSockRight_l_StripeSockRight,StripeSockRight +m_MaidShoes_l_ShoeLeft,ShoeLeft +m_MaidShoes_l_ShoeRight,ShoeRight +m_MaidShoes_l_ShoeRightKneel,ShoeRightKneel +m_MaidShoes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Stockings_l_SockRight,SockRight +m_Stockings_l_FootSockRightKneel,FootSockRightKneel +m_Stockings_l_StripeSockRight,StripeSockRight +m_Stockings_l_SockLeft,SockLeft +m_Stockings_l_FootSockLeftHogtie,FootSockLeftHogtie +m_Stockings_l_StripeSockLeft,StripeSockLeft +m_MaidSocks_l_SockRight,SockRight +m_MaidSocks_l_FootSockRightKneel,FootSockRightKneel +m_MaidSocks_l_StripeSockRight,StripeSockRight +m_MaidSocks_l_SockLeft,SockLeft +m_MaidSocks_l_FootSockLeftHogtie,FootSockLeftHogtie +m_MaidSocks_l_StripeSockLeft,StripeSockLeft +m_Maid_l_Skirt,Skirt +m_Maid_l_Stripe,Stripe +m_Maid_l_SkirtOver,SkirtOver +m_Maid_l_StripeOver,StripeOver +m_Maid_l_Blouse,Blouse +m_Maid_l_BlouseBust,BlouseBust +m_Maid_l_Corset,Corset +m_Maid_l_CorsetStraps,CorsetStraps +m_Maid_l_SockRight,SockRight +m_Maid_l_FootSockRightKneel,FootSockRightKneel +m_Maid_l_StripeSockRight,StripeSockRight +m_Maid_l_SockLeft,SockLeft +m_Maid_l_FootSockLeftHogtie,FootSockLeftHogtie +m_Maid_l_StripeSockLeft,StripeSockLeft +m_Maid_l_ShoeLeft,ShoeLeft +m_Maid_l_ShoeRight,ShoeRight +m_Maid_l_ShoeRightKneel,ShoeRightKneel +m_Maid_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Maid_l_Bow,Bow +m_Maid_l_BowFrills,BowFrills +m_WitchBlouse_l_BlouseLeft,BlouseLeft +m_WitchBlouse_l_BlouseRight,BlouseRight +m_WitchBlouse_l_BlouseLiner,BlouseLiner +m_WitchBlouse_l_BlouseBust,BlouseBust +m_WitchCorset_l_Corset,Corset +m_WitchHat_l_WitchHat,WitchHat +m_WitchHat_l_WitchHatBack,WitchHatBack +m_ApprenticeHat_l_ApprenticeHat,ApprenticeHat +m_ApprenticeHat_l_ApprenticeHatPuff,ApprenticeHatPuff +m_WitchShoes_l_ShoeLeft,ShoeLeft +m_WitchShoes_l_ShoeRight,ShoeRight +m_WitchShoes_l_ShoeRightKneel,ShoeRightKneel +m_WitchShoes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_WitchSkirt_l_Skirt,Skirt +m_WitchSkirt_l_SkirtOver,SkirtOver +m_WitchSkirt_l_SkirtRuffleOver,SkirtRuffleOver +m_WitchSkirt_l_SkirtBelt,SkirtBelt +m_WitchSkirt_l_SkirtRuffle,SkirtRuffle +m_Witch_l_Skirt,Skirt +m_Witch_l_SkirtOver,SkirtOver +m_Witch_l_SkirtRuffleOver,SkirtRuffleOver +m_Witch_l_SkirtBelt,SkirtBelt +m_Witch_l_SkirtRuffle,SkirtRuffle +m_Witch_l_Corset,Corset +m_Witch_l_BlouseLeft,BlouseLeft +m_Witch_l_BlouseRight,BlouseRight +m_Witch_l_BlouseLiner,BlouseLiner +m_Witch_l_BlouseBust,BlouseBust +m_Witch_l_WitchHat,WitchHat +m_Witch_l_WitchHatBack,WitchHatBack +m_Witch_l_ShoeLeft,ShoeLeft +m_Witch_l_ShoeRight,ShoeRight +m_Witch_l_ShoeRightKneel,ShoeRightKneel +m_Witch_l_ShoeLeftHogtie,ShoeLeftHogtie +m_WarriorBoots_l_ShoeLeft,ShoeLeft +m_WarriorBoots_l_ShoeRight,ShoeRight +m_WarriorBoots_l_ShoeRightKneel,ShoeRightKneel +m_WarriorBoots_l_ShoeLeftHogtie,ShoeLeftHogtie +m_SportsBra_l_Bra,Bra +m_WarriorBustier_l_Bustier,Bustier +m_WarriorBustier_l_BustierChest,BustierChest +m_LeatherGloveLeft_l_GloveLeft,GloveLeft +m_LeatherGloveLeft_l_ForeGloveLeft,ForeGloveLeft +m_LeatherGloveLeft_l_RimGloveLeft,RimGloveLeft +m_LeatherGloveLeft_l_RimForeGloveLeft,RimForeGloveLeft +m_LeatherGloveLeft_l_BandGloveLeft,BandGloveLeft +m_LeatherGloveLeft_l_BandForeGloveLeft,BandForeGloveLeft +m_LeatherGloveRight_l_GloveRight,GloveRight +m_LeatherGloveRight_l_ForeGloveRight,ForeGloveRight +m_LeatherGloveRight_l_RimGloveRight,RimGloveRight +m_LeatherGloveRight_l_RimForeGloveRight,RimForeGloveRight +m_LeatherGloveRight_l_BandGloveRight,BandGloveRight +m_LeatherGloveRight_l_BandForeGloveRight,BandForeGloveRight +m_LeatherGloves_l_GloveLeft,GloveLeft +m_LeatherGloves_l_ForeGloveLeft,ForeGloveLeft +m_LeatherGloves_l_RimGloveLeft,RimGloveLeft +m_LeatherGloves_l_RimForeGloveLeft,RimForeGloveLeft +m_LeatherGloves_l_BandGloveLeft,BandGloveLeft +m_LeatherGloves_l_BandForeGloveLeft,BandForeGloveLeft +m_LeatherGloves_l_GloveRight,GloveRight +m_LeatherGloves_l_ForeGloveRight,ForeGloveRight +m_LeatherGloves_l_RimGloveRight,RimGloveRight +m_LeatherGloves_l_RimForeGloveRight,RimForeGloveRight +m_LeatherGloves_l_BandGloveRight,BandGloveRight +m_LeatherGloves_l_BandForeGloveRight,BandForeGloveRight +m_WarriorBelt_l_Belt,Belt +m_DragonNecklace_l_Necklace,Necklace +m_DragonArmband_l_Armband,Armband +m_DragonCollar_l_Collar,Collar +m_WarriorSkirt_l_Skirt,Skirt +m_WarriorSkirt_l_SkirtOver,SkirtOver +m_Dragonheart_l_Skirt,Skirt +m_Dragonheart_l_SkirtOver,SkirtOver +m_Dragonheart_l_Bustier,Bustier +m_Dragonheart_l_BustierChest,BustierChest +m_Dragonheart_l_Belt,Belt +m_Dragonheart_l_Bra,Bra +m_Dragonheart_l_ShoeLeft,ShoeLeft +m_Dragonheart_l_ShoeRight,ShoeRight +m_Dragonheart_l_ShoeRightKneel,ShoeRightKneel +m_Dragonheart_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Dragonheart_l_Collar,Collar +m_Dragonheart_l_Necklace,Necklace +m_Dragonheart_l_Armband,Armband +m_ZombieHat_l_ZombieHat,ZombieHat +m_ZombieHat_l_ZombieHatBand,ZombieHatBand +m_ZombieChestTalisman_l_ZombieChestTalisman,ZombieChestTalisman +m_ZombieTalisman_l_ZombieTalisman,ZombieTalisman +m_ZombieTalismanBent_l_ZombieTalismanBent,ZombieTalismanBent +m_Sandals_l_ShoeLeft,ShoeLeft +m_Sandals_l_ShoeRight,ShoeRight +m_Sandals_l_ShoeRightKneel,ShoeRightKneel +m_Sandals_l_ShoeLeftHogtie,ShoeLeftHogtie +m_RobeBra_l_Bra,Bra +m_RobeBra_l_Chest,Chest +m_RobeSleeveLeft_l_SleeveLeft,SleeveLeft +m_RobeSleeveRight_l_SleeveRight,SleeveRight +m_RobeSleeves_l_SleeveLeft,SleeveLeft +m_RobeSleeves_l_SleeveRight,SleeveRight +m_RobeSleeveDecoLeft_l_SleeveDecoLeft,SleeveDecoLeft +m_RobeSleeveDecoRight_l_SleeveDecoRight,SleeveDecoRight +m_RobeSleevesDeco_l_SleeveDecoLeft,SleeveDecoLeft +m_RobeSleevesDeco_l_SleeveDecoRight,SleeveDecoRight +m_Ribbon_l_RibbonBelt,RibbonBelt +m_Ribbon_l_RibbonBack,RibbonBack +m_Ribbon_l_RibbonFarBack,RibbonFarBack +m_RobeSkirt_l_Skirt,Skirt +m_RobeSkirt_l_SkirtOver,SkirtOver +m_Robes_l_ShoeLeft,ShoeLeft +m_Robes_l_ShoeRight,ShoeRight +m_Robes_l_ShoeRightKneel,ShoeRightKneel +m_Robes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Robes_l_SleeveLeft,SleeveLeft +m_Robes_l_SleeveRight,SleeveRight +m_Robes_l_SleeveDecoLeft,SleeveDecoLeft +m_Robes_l_SleeveDecoRight,SleeveDecoRight +m_Robes_l_Skirt,Skirt +m_Robes_l_SkirtOver,SkirtOver +m_Robes_l_Bra,Bra +m_Robes_l_Chest,Chest +m_Robes_l_RibbonBelt,RibbonBelt +m_Robes_l_RibbonBack,RibbonBack +m_Robes_l_RibbonFarBack,RibbonFarBack +m_KiguMask_l_Mask,Mask +m_KiguMask_l_Eyes,Eyes +m_KiguMask_l_Eyes2,Eyes2 +m_KiguMask_l_Lock,Lock +m_KiguMask_l_EyesWhites,EyesWhites +m_KiguMask_l_Mouth,Mouth +m_Swimsuit_l_Swimsuit,Swimsuit +m_Swimsuit_l_SwimsuitChest,SwimsuitChest +m_StrappyBra_l_ChestStrappy,ChestStrappy +m_VBikini_l_VBikini,VBikini +m_StrappyBikini_l_StrappyLower,StrappyLower +m_StrappyHarness_l_Strappy,Strappy +m_StrappySwimsuit_l_ChestStrappy,ChestStrappy +m_StrappySwimsuit_l_Strappy,Strappy +m_StrappySwimsuit_l_StrappyLower,StrappyLower +m_BunnySockLeft_l_SockLeft,SockLeft +m_BunnySockLeft_l_FootSockLeftHogtie,FootSockLeftHogtie +m_BunnySockRight_l_SockRight,SockRight +m_BunnySockRight_l_FootSockRightKneel,FootSockRightKneel +m_BunnySocks_l_SockRight,SockRight +m_BunnySocks_l_FootSockRightKneel,FootSockRightKneel +m_BunnySocks_l_SockLeft,SockLeft +m_BunnySocks_l_FootSockLeftHogtie,FootSockLeftHogtie +m_BunnySocksRestraint_l_SockRight,SockRight +m_BunnySocksRestraint_l_FootSockRightKneel,FootSockRightKneel +m_BunnySocksRestraint_l_SockLeft,SockLeft +m_BunnySocksRestraint_l_FootSockLeftHogtie,FootSockLeftHogtie +m_BunnyGloveLeft_l_GloveLeft,GloveLeft +m_BunnyGloveLeft_l_ForeGloveLeft,ForeGloveLeft +m_BunnyGloveRight_l_GloveRight,GloveRight +m_BunnyGloveRight_l_ForeGloveRight,ForeGloveRight +m_BunnyGloves_l_GloveLeft,GloveLeft +m_BunnyGloves_l_ForeGloveLeft,ForeGloveLeft +m_BunnyGloves_l_GloveRight,GloveRight +m_BunnyGloves_l_ForeGloveRight,ForeGloveRight +m_BunnyGlovesRestraint_l_GloveLeft,GloveLeft +m_BunnyGlovesRestraint_l_ForeGloveLeft,ForeGloveLeft +m_BunnyGlovesRestraint_l_GloveRight,GloveRight +m_BunnyGlovesRestraint_l_ForeGloveRight,ForeGloveRight +m_BunnyLeotard_l_Leotard,Leotard +m_BunnyLeotard_l_LeotardChest,LeotardChest +m_BunnyLeotardHigh,BunnyLeotardHigh +m_BunnyLeotardHigh_l_HighLeotard,HighLeotard +m_BunnyLeotardHigh_l_LeotardChest,LeotardChest +m_Bunny_l_Leotard,Leotard +m_Bunny_l_LeotardChest,LeotardChest +m_Bunny_l_GloveLeft,GloveLeft +m_Bunny_l_ForeGloveLeft,ForeGloveLeft +m_Bunny_l_GloveRight,GloveRight +m_Bunny_l_ForeGloveRight,ForeGloveRight +m_Bunny_l_SockRight,SockRight +m_Bunny_l_FootSockRightKneel,FootSockRightKneel +m_Bunny_l_SockLeft,SockLeft +m_Bunny_l_FootSockLeftHogtie,FootSockLeftHogtie +m_LaceCorset_l_LaceCorset,LaceCorset +m_LaceCorset_l_LaceCorsetHardware,LaceCorsetHardware +m_LaceCorset_l_LaceCorsetStripes,LaceCorsetStripes +m_LaceCorset_l_LaceCorsetCrystal,LaceCorsetCrystal +m_LaceBra_l_LaceChest,LaceChest +m_LaceBra_l_LaceChestCups,LaceChestCups +m_LaceBra_l_LaceChestStripes,LaceChestStripes +m_LaceBustier_l_LaceChest,LaceChest +m_LaceBustier_l_LaceChestCups,LaceChestCups +m_LaceBustier_l_LaceChestStripes,LaceChestStripes +m_LaceDeco_l_LaceChestDeco,LaceChestDeco +m_LaceDeco_l_LaceChestDecoCrystal,LaceChestDecoCrystal +m_LaceDeco_l_LaceChestDecoHardware,LaceChestDecoHardware +m_LaceBraDeco_l_LaceChest,LaceChest +m_LaceBraDeco_l_LaceChestCups,LaceChestCups +m_LaceBraDeco_l_LaceChestStripes,LaceChestStripes +m_LaceBraDeco_l_LaceChestDeco,LaceChestDeco +m_LaceBraDeco_l_LaceChestDecoCrystal,LaceChestDecoCrystal +m_LaceBraDeco_l_LaceChestDecoHardware,LaceChestDecoHardware +m_LaceCorsetRestraint_l_LaceCorset,LaceCorset +m_LaceCorsetRestraint_l_LaceCorsetHardware,LaceCorsetHardware +m_LaceCorsetRestraint_l_LaceCorsetStripes,LaceCorsetStripes +m_LaceCorsetRestraint_l_LaceCorsetCrystal,LaceCorsetCrystal +m_LaceBustierRestraint_l_LaceChest,LaceChest +m_LaceBustierRestraint_l_LaceChestCups,LaceChestCups +m_LaceBustierRestraint_l_LaceChestStripes,LaceChestStripes +m_LaceBraDecoRestraint_l_LaceChest,LaceChest +m_LaceBraDecoRestraint_l_LaceChestCups,LaceChestCups +m_LaceBraDecoRestraint_l_LaceChestStripes,LaceChestStripes +m_LaceBraDecoRestraint_l_LaceChestDeco,LaceChestDeco +m_LaceBraDecoRestraint_l_LaceChestDecoCrystal,LaceChestDecoCrystal +m_LaceBraDecoRestraint_l_LaceChestDecoHardware,LaceChestDecoHardware +m_BowCorsetBow_l_BowCorsetBow,BowCorsetBow +m_BowCorsetBust_l_BowCorsetBust,BowCorsetBust +m_BowCorsetBust_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetBustBow_l_BowCorsetBust,BowCorsetBust +m_BowCorsetBustBow_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetBustBow_l_BowCorsetBow,BowCorsetBow +m_BowCorset_l_BowCorset,BowCorset +m_BowCorset_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetLong_l_BowCorsetLong,BowCorsetLong +m_BowCorsetLong_l_BowCorsetLongRuffle,BowCorsetLongRuffle +m_BowCorsetOverbust_l_BowCorsetBust,BowCorsetBust +m_BowCorsetOverbust_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetOverbust_l_BowCorset,BowCorset +m_BowCorsetOverbust_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetLongOverbust_l_BowCorsetBust,BowCorsetBust +m_BowCorsetLongOverbust_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetLongOverbust_l_BowCorsetLong,BowCorsetLong +m_BowCorsetLongOverbust_l_BowCorsetLongRuffle,BowCorsetLongRuffle +m_BowCorsetOverbustBow_l_BowCorsetBust,BowCorsetBust +m_BowCorsetOverbustBow_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetOverbustBow_l_BowCorset,BowCorset +m_BowCorsetOverbustBow_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetOverbustBow_l_BowCorsetBow,BowCorsetBow +m_BowCorsetLongOverbustBow_l_BowCorsetBust,BowCorsetBust +m_BowCorsetLongOverbustBow_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetLongOverbustBow_l_BowCorsetLong,BowCorsetLong +m_BowCorsetLongOverbustBow_l_BowCorsetLongRuffle,BowCorsetLongRuffle +m_BowCorsetLongOverbustBow_l_BowCorsetBow,BowCorsetBow +m_BowCorsetRestraint_l_BowCorset,BowCorset +m_BowCorsetRestraint_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetBowRestraint_l_BowCorsetBow,BowCorsetBow +m_BowCorsetOverbustRestraint_l_BowCorsetBust,BowCorsetBust +m_BowCorsetOverbustRestraint_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetOverbustRestraint_l_BowCorset,BowCorset +m_BowCorsetOverbustRestraint_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetOverbustBowRestraint_l_BowCorsetBust,BowCorsetBust +m_BowCorsetOverbustBowRestraint_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetOverbustBowRestraint_l_BowCorset,BowCorset +m_BowCorsetOverbustBowRestraint_l_BowCorsetRuffle,BowCorsetRuffle +m_BowCorsetOverbustBowRestraint_l_BowCorsetBow,BowCorsetBow +m_BowCorsetLongOverbustRestraint_l_BowCorsetBust,BowCorsetBust +m_BowCorsetLongOverbustRestraint_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetLongOverbustRestraint_l_BowCorsetLong,BowCorsetLong +m_BowCorsetLongOverbustRestraint_l_BowCorsetLongRuffle,BowCorsetLongRuffle +m_BowCorsetLongOverbustBowRestraint_l_BowCorsetBust,BowCorsetBust +m_BowCorsetLongOverbustBowRestraint_l_BowCorsetBustRuffle,BowCorsetBustRuffle +m_BowCorsetLongOverbustBowRestraint_l_BowCorsetLong,BowCorsetLong +m_BowCorsetLongOverbustBowRestraint_l_BowCorsetLongRuffle,BowCorsetLongRuffle +m_BowCorsetLongOverbustBowRestraint_l_BowCorsetBow,BowCorsetBow +m_LatexCorset_l_HeavyCorset,HeavyCorset +m_LatexBra_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexBraStraps_l_StrapsHeavyCorset,StrapsHeavyCorset +m_LatexBraStrapsCross_l_CrossHeavyCorset,CrossHeavyCorset +m_LatexBustier_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFull_l_HeavyCorset,HeavyCorset +m_LatexCorsetFull_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetStrap_l_HeavyCorset,HeavyCorset +m_LatexCorsetStrap_l_StrapsHeavyCorset,StrapsHeavyCorset +m_LatexCorsetFullStrap_l_HeavyCorset,HeavyCorset +m_LatexCorsetFullStrap_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFullStrap_l_StrapsHeavyCorset,StrapsHeavyCorset +m_LatexCorsetCross_l_HeavyCorset,HeavyCorset +m_LatexCorsetCross_l_CrossHeavyCorset,CrossHeavyCorset +m_LatexCorsetFullCross_l_HeavyCorset,HeavyCorset +m_LatexCorsetFullCross_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFullCross_l_CrossHeavyCorset,CrossHeavyCorset +m_LatexCorsetRestraint_l_HeavyCorset,HeavyCorset +m_LatexBustierRestraint_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFullRestraint_l_HeavyCorset,HeavyCorset +m_LatexCorsetFullRestraint_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetStrapRestraint_l_HeavyCorset,HeavyCorset +m_LatexCorsetStrapRestraint_l_StrapsHeavyCorset,StrapsHeavyCorset +m_LatexCorsetCrossRestraint_l_HeavyCorset,HeavyCorset +m_LatexCorsetCrossRestraint_l_CrossHeavyCorset,CrossHeavyCorset +m_LatexCorsetFullStrapRestraint_l_HeavyCorset,HeavyCorset +m_LatexCorsetFullStrapRestraint_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFullStrapRestraint_l_StrapsHeavyCorset,StrapsHeavyCorset +m_LatexCorsetFullCrossRestraint_l_HeavyCorset,HeavyCorset +m_LatexCorsetFullCrossRestraint_l_ChestHeavyCorset,ChestHeavyCorset +m_LatexCorsetFullCrossRestraint_l_CrossHeavyCorset,CrossHeavyCorset +m_LacePanties_l_LaceCrotchPanel,LaceCrotchPanel +m_LacePanties_l_LaceCrotchPanelTrim,LaceCrotchPanelTrim +m_LacePanties_l_LaceCrotchPanelLace,LaceCrotchPanelLace +m_LaceCrotchPanel_l_LaceCrotchPanel,LaceCrotchPanel +m_LaceCrotchPanel_l_LaceCrotchPanelTrim,LaceCrotchPanelTrim +m_LaceCrotchPanel_l_LaceCrotchPanelLace,LaceCrotchPanelLace +m_DressSkirt_l_Skirt,Skirt +m_DressSkirt_l_SkirtOver,SkirtOver +m_BindingDress_l_LaceCorset,LaceCorset +m_BindingDress_l_LaceCorsetHardware,LaceCorsetHardware +m_BindingDress_l_LaceCorsetStripes,LaceCorsetStripes +m_BindingDress_l_LaceCorsetCrystal,LaceCorsetCrystal +m_BindingDress_l_Skirt,Skirt +m_BindingDress_l_SkirtOver,SkirtOver +m_BindingDress_l_LaceCrotchPanel,LaceCrotchPanel +m_BindingDress_l_LaceCrotchPanelTrim,LaceCrotchPanelTrim +m_BindingDress_l_LaceCrotchPanelLace,LaceCrotchPanelLace +m_BlouseCollar_l_BlouseCollar,BlouseCollar +m_DressBlouseBust_l_BlouseTorso,BlouseTorso +m_DressBlouseBust_l_BlouseSkirt,BlouseSkirt +m_DressBlouseBust_l_BlouseSkirtOverKneel,BlouseSkirtOverKneel +m_DressBlouseBust_l_BlouseBust,BlouseBust +m_DressBlouseBust_l_BlouseNeck,BlouseNeck +m_DressBlouseBust_l_BlouseCollar,BlouseCollar +m_DressBlouseBustCropped_l_CroppedBlouseTorso,CroppedBlouseTorso +m_DressBlouseBustCropped_l_BlouseBust,BlouseBust +m_DressBlouseBustCropped_l_BlouseNeck,BlouseNeck +m_DressBlouseBustCropped_l_BlouseCollar,BlouseCollar +m_DressBlouseSleeveLeft_l_BlouseArmLeft,BlouseArmLeft +m_DressBlouseSleeveLeft_l_BlouseForeArmLeft,BlouseForeArmLeft +m_DressBlouseSleeveRight_l_BlouseArmRight,BlouseArmRight +m_DressBlouseSleeveRight_l_BlouseForeArmRight,BlouseForeArmRight +m_DressBlouseSleeves_l_BlouseArmLeft,BlouseArmLeft +m_DressBlouseSleeves_l_BlouseForeArmLeft,BlouseForeArmLeft +m_DressBlouseSleeves_l_BlouseArmRight,BlouseArmRight +m_DressBlouseSleeves_l_BlouseForeArmRight,BlouseForeArmRight +m_DressBlouse_l_BlouseArmLeft,BlouseArmLeft +m_DressBlouse_l_BlouseForeArmLeft,BlouseForeArmLeft +m_DressBlouse_l_BlouseArmRight,BlouseArmRight +m_DressBlouse_l_BlouseForeArmRight,BlouseForeArmRight +m_DressBlouse_l_BlouseTorso,BlouseTorso +m_DressBlouse_l_BlouseSkirt,BlouseSkirt +m_DressBlouse_l_BlouseSkirtOverKneel,BlouseSkirtOverKneel +m_DressBlouse_l_BlouseBust,BlouseBust +m_DressBlouse_l_BlouseNeck,BlouseNeck +m_DressBlouse_l_BlouseCollar,BlouseCollar +m_Glasses_l_Glasses,Glasses +m_Glasses_l_GlassesLens,GlassesLens +m_MonocleLeft_l_MonocleLeft,MonocleLeft +m_MonocleLeft_l_MonocleLensLeft,MonocleLensLeft +m_MonocleRight_l_MonocleRight,MonocleRight +m_MonocleRight_l_MonocleLensRight,MonocleLensRight +m_DressShoes_l_ShoeLeft,ShoeLeft +m_DressShoes_l_ShoeRight,ShoeRight +m_DressShoes_l_ShoeRightKneel,ShoeRightKneel +m_DressShoes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Dress_l_Skirt,Skirt +m_Dress_l_SkirtOver,SkirtOver +m_Dress_l_BlouseArmLeft,BlouseArmLeft +m_Dress_l_BlouseForeArmLeft,BlouseForeArmLeft +m_Dress_l_BlouseArmRight,BlouseArmRight +m_Dress_l_BlouseForeArmRight,BlouseForeArmRight +m_Dress_l_BlouseTorso,BlouseTorso +m_Dress_l_BlouseSkirt,BlouseSkirt +m_Dress_l_BlouseSkirtOverKneel,BlouseSkirtOverKneel +m_Dress_l_BlouseBust,BlouseBust +m_Dress_l_BlouseNeck,BlouseNeck +m_Dress_l_BlouseCollar,BlouseCollar +m_Dress_l_LaceCrotchPanel,LaceCrotchPanel +m_Dress_l_LaceCrotchPanelTrim,LaceCrotchPanelTrim +m_Dress_l_LaceCrotchPanelLace,LaceCrotchPanelLace +m_Dress_l_LaceCorset,LaceCorset +m_Dress_l_LaceCorsetHardware,LaceCorsetHardware +m_Dress_l_LaceCorsetStripes,LaceCorsetStripes +m_Dress_l_LaceCorsetCrystal,LaceCorsetCrystal +m_Dress_l_LaceChest,LaceChest +m_Dress_l_LaceChestCups,LaceChestCups +m_Dress_l_LaceChestStripes,LaceChestStripes +m_LeatherMittenLeft_l_LeatherLeft,LeatherLeft +m_LeatherMittenLeft_l_BandLeft,BandLeft +m_LeatherMittenLeft_l_LockLeft,LockLeft +m_LeatherMittenRight_l_LeatherRight,LeatherRight +m_LeatherMittenRight_l_BandRight,BandRight +m_LeatherMittenRight_l_LockRight,LockRight +m_LeatherPawMittenLeft_l_LeatherLeft,LeatherLeft +m_LeatherPawMittenLeft_l_BandLeft,BandLeft +m_LeatherPawMittenLeft_l_LockLeft,LockLeft +m_LeatherPawMittenLeft_l_PawLeft,PawLeft +m_LeatherPawMittenRight_l_LeatherRight,LeatherRight +m_LeatherPawMittenRight_l_BandRight,BandRight +m_LeatherPawMittenRight_l_LockRight,LockRight +m_LeatherPawMittenRight_l_PawRight,PawRight +m_LatexMittenLeft_l_LatexLeft,LatexLeft +m_LatexMittenLeft_l_ZipperLeft,ZipperLeft +m_LatexMittenRight_l_LatexRight,LatexRight +m_LatexMittenRight_l_ZipperRight,ZipperRight +m_LeatherMittens_l_LeatherLeft,LeatherLeft +m_LeatherMittens_l_BandLeft,BandLeft +m_LeatherMittens_l_LockLeft,LockLeft +m_LeatherMittens_l_LeatherRight,LeatherRight +m_LeatherMittens_l_BandRight,BandRight +m_LeatherMittens_l_LockRight,LockRight +m_LeatherPawMittens_l_LeatherLeft,LeatherLeft +m_LeatherPawMittens_l_BandLeft,BandLeft +m_LeatherPawMittens_l_LockLeft,LockLeft +m_LeatherPawMittens_l_PawLeft,PawLeft +m_LeatherPawMittens_l_LeatherRight,LeatherRight +m_LeatherPawMittens_l_BandRight,BandRight +m_LeatherPawMittens_l_LockRight,LockRight +m_LeatherPawMittens_l_PawRight,PawRight +m_LatexMittens_l_LatexLeft,LatexLeft +m_LatexMittens_l_ZipperLeft,ZipperLeft +m_LatexMittens_l_LatexRight,LatexRight +m_LatexMittens_l_ZipperRight,ZipperRight +m_LongMittenLeft,LongMittenLeft +m_LongMittenLeft_l_LongLeft,LongLeft +m_LongMittenLeft_l_BandLeft,BandLeft +m_LongMittenLeft_l_LockLeft,LockLeft +m_LongMittenRight,LongMittenRight +m_LongMittenRight_l_LongRight,LongRight +m_LongMittenRight_l_BandRight,BandRight +m_LongMittenRight_l_LockRight,LockRight +m_LongMittens,LongMittens +m_LongMittens_l_LongLeft,LongLeft +m_LongMittens_l_BandLeft,BandLeft +m_LongMittens_l_LockLeft,LockLeft +m_LongMittens_l_LongRight,LongRight +m_LongMittens_l_BandRight,BandRight +m_LongMittens_l_LockRight,LockRight +m_ElfPanties_l_Panties,Panties +m_ElfTop_l_Chest,Chest +m_ElfTop_l_Bra,Bra +m_ElfBra_l_Chest,Chest +m_ElfBra_l_Bra,Bra +m_ElfCollar_l_Collar,Collar +m_ElfCollarRestraint_l_Collar,Collar +m_ElfCirclet_l_Circlet,Circlet +m_ElfCirclet_l_Gem,Gem +m_ElfSkirtBack_l_SkirtBack,SkirtBack +m_ElfSkirt_l_Skirt,Skirt +m_ElfSkirt_l_SkirtBand,SkirtBand +m_ElfSkirt_l_SkirtBack,SkirtBack +m_ElfShoes_l_ShoeLeft,ShoeLeft +m_ElfShoes_l_ShoeRight,ShoeRight +m_ElfShoes_l_ShoeRightKneel,ShoeRightKneel +m_ElfShoes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_ElfShoes_l_CrystalShoeLeft,CrystalShoeLeft +m_ElfShoes_l_CrystalShoeRight,CrystalShoeRight +m_ElfBandLeft_l_BandLeft,BandLeft +m_ElfBandRight_l_BandRight,BandRight +m_ElfBands_l_BandLeft,BandLeft +m_ElfBands_l_BandRight,BandRight +m_Elf_l_Skirt,Skirt +m_Elf_l_SkirtBand,SkirtBand +m_Elf_l_SkirtBack,SkirtBack +m_Elf_l_Chest,Chest +m_Elf_l_Bra,Bra +m_Elf_l_BandLeft,BandLeft +m_Elf_l_BandRight,BandRight +m_Elf_l_Circlet,Circlet +m_Elf_l_Gem,Gem +m_Elf_l_ShoeLeft,ShoeLeft +m_Elf_l_ShoeRight,ShoeRight +m_Elf_l_ShoeRightKneel,ShoeRightKneel +m_Elf_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Elf_l_CrystalShoeLeft,CrystalShoeLeft +m_Elf_l_CrystalShoeRight,CrystalShoeRight +m_Elf_l_Panties,Panties +m_Elf_l_Collar,Collar +m_SteelYoke_l_Steel,Steel +m_SteelYoke_l_SteelBar,SteelBar +m_RopeCrosstie1_l_ArmStrap,ArmStrap +m_RopeCrosstie1_l_Arm1,Arm1 +m_RopeCrosstie1_l_ForeArm1,ForeArm1 +m_RopeBoxtie1_l_ArmStrap,ArmStrap +m_RopeBoxtie1_l_Arm1,Arm1 +m_RopeBoxtie1_l_ForeArm1,ForeArm1 +m_RopeWristtie1_l_ArmStrap,ArmStrap +m_RopeWristtie1_l_Arm1,Arm1 +m_RopeWristtie1_l_ForeArm1,ForeArm1 +m_RopeChestStraps1_l_Arm1,Arm1 +m_RopeChestStraps1_l_Arm2,Arm2 +m_RopeChestStraps1_l_ForeArm2,ForeArm2 +m_RopeBoxtie2_l_ArmStrap,ArmStrap +m_RopeBoxtie2_l_Arm1,Arm1 +m_RopeBoxtie2_l_ForeArm1,ForeArm1 +m_RopeBoxtie2_l_Arm2,Arm2 +m_RopeBoxtie2_l_ForeArm2,ForeArm2 +m_RopeWristtie2_l_ArmStrap,ArmStrap +m_RopeWristtie2_l_Arm1,Arm1 +m_RopeWristtie2_l_ForeArm1,ForeArm1 +m_RopeWristtie2_l_Arm2,Arm2 +m_RopeWristtie2_l_ForeArm2,ForeArm2 +m_RopeChestStraps2_l_ArmHarness,ArmHarness +m_RopeChestStraps2_l_ArmStrapHarness,ArmStrapHarness +m_RopeChestStraps2_l_ArmHarnessUp,ArmHarnessUp +m_RopeBoxtie3_l_ArmStrap,ArmStrap +m_RopeBoxtie3_l_Arm1,Arm1 +m_RopeBoxtie3_l_ForeArm1,ForeArm1 +m_RopeBoxtie3_l_Arm2,Arm2 +m_RopeBoxtie3_l_ForeArm2,ForeArm2 +m_RopeBoxtie3_l_ArmHarness,ArmHarness +m_RopeBoxtie3_l_ArmStrapHarness,ArmStrapHarness +m_RopeBoxtie3_l_ArmHarnessUp,ArmHarnessUp +m_RopeWristtie3_l_ArmStrap,ArmStrap +m_RopeWristtie3_l_Arm1,Arm1 +m_RopeWristtie3_l_ForeArm1,ForeArm1 +m_RopeWristtie3_l_Arm2,Arm2 +m_RopeWristtie3_l_ForeArm2,ForeArm2 +m_RopeWristtie3_l_ArmHarness,ArmHarness +m_RopeWristtie3_l_ArmStrapHarness,ArmStrapHarness +m_RopeWristtie3_l_ArmHarnessUp,ArmHarnessUp +m_RopeCuffs_l_Cuffs,Cuffs +m_RopeBelt_l_Belt,Belt +m_RopeHarness_l_Harness,Harness +m_RopeHarness_l_HarnessLower,HarnessLower +m_RopeHarness_l_HarnessLowerStrap,HarnessLowerStrap +m_RopeCrotch_l_Crotchrope,Crotchrope +m_RopeCrotch_l_CrotchropeStrap,CrotchropeStrap +m_RopeToes_l_Toe,Toe +m_RopeFeet_l_Ankles,Ankles +m_RopeFeetHeavy_l_Ankles,Ankles +m_RopeFeetHeavy_l_Toe,Toe +m_RopeAnkles1_l_Calf1,Calf1 +m_RopeAnkles2_l_Calf1,Calf1 +m_RopeAnkles2_l_Calf2,Calf2 +m_RopeAnkles3_l_Calf1,Calf1 +m_RopeAnkles3_l_Calf2,Calf2 +m_RopeAnkles3_l_Calf3,Calf3 +m_RopeLegs1_l_Thigh1,Thigh1 +m_RopeLegs1_l_RightThigh1,RightThigh1 +m_RopeLegs2_l_Thigh1,Thigh1 +m_RopeLegs2_l_RightThigh1,RightThigh1 +m_RopeLegs2_l_Thigh2,Thigh2 +m_RopeLegs2_l_RightThigh2,RightThigh2 +m_RopeLegs3_l_Thigh1,Thigh1 +m_RopeLegs3_l_RightThigh1,RightThigh1 +m_RopeLegs3_l_Thigh2,Thigh2 +m_RopeLegs3_l_RightThigh2,RightThigh2 +m_RopeLegs3_l_Thigh3,Thigh3 +m_RopeLegs3_l_RightThigh3,RightThigh3 +m_RibbonCrosstie1_l_ArmStrap,ArmStrap +m_RibbonBoxtie1_l_Arm1,Arm1 +m_RibbonWristtie1_l_ForeArm1,ForeArm1 +m_RibbonChestStraps1_l_Arm2,Arm2 +m_RibbonChestStraps1_l_ForeArm2,ForeArm2 +m_RibbonBoxtie2_l_Arm1,Arm1 +m_RibbonBoxtie2_l_Arm2,Arm2 +m_RibbonBoxtie2_l_ForeArm2,ForeArm2 +m_RibbonWristtie2_l_ForeArm1,ForeArm1 +m_RibbonWristtie2_l_Arm2,Arm2 +m_RibbonWristtie2_l_ForeArm2,ForeArm2 +m_RibbonChestStraps2_l_ArmHarness,ArmHarness +m_RibbonChestStraps2_l_ArmHarnessUnderbust,ArmHarnessUnderbust +m_RibbonChestStraps2_l_ArmStrap,ArmStrap +m_RibbonChestStraps2_l_ArmHarnessUp,ArmHarnessUp +m_RibbonCuffs_l_Cuffs,Cuffs +m_RibbonBelt_l_Belt,Belt +m_RibbonHarness_l_Harness,Harness +m_RibbonHarness_l_HarnessMid,HarnessMid +m_RibbonHarness_l_HarnessLower,HarnessLower +m_RibbonHarness_l_HarnessLowerStrap,HarnessLowerStrap +m_RibbonCrotch_l_Crotch,Crotch +m_RibbonCrotch_l_CrotchStrap,CrotchStrap +m_RibbonToes_l_Toe,Toe +m_RibbonFeet_l_Feet,Feet +m_RibbonFeetHeavy_l_Feet,Feet +m_RibbonFeetHeavy_l_Toe,Toe +m_RibbonAnkles1_l_Calf1,Calf1 +m_RibbonAnkles2_l_Calf1,Calf1 +m_RibbonAnkles2_l_Calf2,Calf2 +m_RibbonAnkles3_l_Calf1,Calf1 +m_RibbonAnkles3_l_Calf2,Calf2 +m_RibbonAnkles3_l_Calf3,Calf3 +m_RibbonLegs1_l_Thigh1,Thigh1 +m_RibbonLegs1_l_RightThigh1,RightThigh1 +m_RibbonLegs2_l_Thigh1,Thigh1 +m_RibbonLegs2_l_RightThigh1,RightThigh1 +m_RibbonLegs2_l_Thigh2,Thigh2 +m_RibbonLegs2_l_RightThigh2,RightThigh2 +m_RibbonLegs3_l_Thigh1,Thigh1 +m_RibbonLegs3_l_RightThigh1,RightThigh1 +m_RibbonLegs3_l_Thigh2,Thigh2 +m_RibbonLegs3_l_RightThigh2,RightThigh2 +m_RibbonLegs3_l_Thigh3,Thigh3 +m_RibbonLegs3_l_RightThigh3,RightThigh3 +m_ShacklesWristLeft_l_WristLeft,WristLeft +m_ShacklesWristRight_l_WristRight,WristRight +m_ShacklesWrists_l_WristLeft,WristLeft +m_ShacklesWrists_l_WristRight,WristRight +m_ShacklesElbowLeft_l_ElbowLeft,ElbowLeft +m_ShacklesElbowRight_l_ElbowRight,ElbowRight +m_ShacklesElbows_l_ElbowLeft,ElbowLeft +m_ShacklesElbows_l_ElbowRight,ElbowRight +m_ShacklesArms_l_WristLeft,WristLeft +m_ShacklesArms_l_WristRight,WristRight +m_ShacklesArms_l_ElbowLeft,ElbowLeft +m_ShacklesArms_l_ElbowRight,ElbowRight +m_ShacklesAnklesLeft_l_AnkleLeft,AnkleLeft +m_ShacklesAnklesRight_l_AnkleRight,AnkleRight +m_ShacklesAnkles_l_AnkleRight,AnkleRight +m_ShacklesAnkles_l_AnkleLeft,AnkleLeft +m_ShacklesThighLeft_l_ThighLeft,ThighLeft +m_ShacklesThighRight_l_ThighRight,ThighRight +m_ShacklesThigh_l_ThighRight,ThighRight +m_ShacklesThigh_l_ThighLeft,ThighLeft +m_ThighLink_l_ThighLink,ThighLink +m_AnkleLink_l_AnkleLink,AnkleLink +m_IronCollar_l_Collar,Collar +m_SteelCollar_l_SteelCollar,SteelCollar +m_SteelCollarRunes_l_SteelCollar,SteelCollar +m_SteelCollarRunes_l_SteelCollarRunes,SteelCollarRunes +m_IronBelt_l_Belt,Belt +m_FashionIronCollar,FashionIronCollar +m_FashionIronCollar_l_Collar,Collar +m_FashionIronBelt,FashionIronBelt +m_FashionIronBelt_l_Belt,Belt +m_FashionSteelCollarRunes,FashionSteelCollarRunes +m_FashionSteelCollarRunes_l_SteelCollar,SteelCollar +m_FashionSteelCollarRunes_l_SteelCollarRunes,SteelCollarRunes +m_FashionSteelCollar,FashionSteelCollar +m_FashionSteelCollar_l_SteelCollar,SteelCollar +m_FashionShacklesWristLeft,FashionShacklesWristLeft +m_FashionShacklesWristLeft_l_WristLeft,WristLeft +m_FashionShacklesWristRight,FashionShacklesWristRight +m_FashionShacklesWristRight_l_WristRight,WristRight +m_FashionShacklesWrists,FashionShacklesWrists +m_FashionShacklesWrists_l_WristLeft,WristLeft +m_FashionShacklesWrists_l_WristRight,WristRight +m_FashionShacklesElbowLeft,FashionShacklesElbowLeft +m_FashionShacklesElbowLeft_l_ElbowLeft,ElbowLeft +m_FashionShacklesElbowRight,FashionShacklesElbowRight +m_FashionShacklesElbowRight_l_ElbowRight,ElbowRight +m_FashionShacklesElbows,FashionShacklesElbows +m_FashionShacklesElbows_l_ElbowLeft,ElbowLeft +m_FashionShacklesElbows_l_ElbowRight,ElbowRight +m_FashionShacklesArms,FashionShacklesArms +m_FashionShacklesArms_l_WristLeft,WristLeft +m_FashionShacklesArms_l_WristRight,WristRight +m_FashionShacklesArms_l_ElbowLeft,ElbowLeft +m_FashionShacklesArms_l_ElbowRight,ElbowRight +m_FashionShacklesAnklesLeft,FashionShacklesAnklesLeft +m_FashionShacklesAnklesLeft_l_AnkleLeft,AnkleLeft +m_FashionShacklesAnklesRight,FashionShacklesAnklesRight +m_FashionShacklesAnklesRight_l_AnkleRight,AnkleRight +m_FashionShacklesAnkles,FashionShacklesAnkles +m_FashionShacklesAnkles_l_AnkleRight,AnkleRight +m_FashionShacklesAnkles_l_AnkleLeft,AnkleLeft +m_FashionShacklesThighLeft,FashionShacklesThighLeft +m_FashionShacklesThighLeft_l_ThighLeft,ThighLeft +m_FashionShacklesThighRight,FashionShacklesThighRight +m_FashionShacklesThighRight_l_ThighRight,ThighRight +m_FashionShacklesThigh,FashionShacklesThigh +m_FashionShacklesThigh_l_ThighRight,ThighRight +m_FashionShacklesThigh_l_ThighLeft,ThighLeft +m_FashionThighLink,FashionThighLink +m_FashionThighLink_l_ThighLink,ThighLink +m_FashionAnkleLink,FashionAnkleLink +m_FashionAnkleLink_l_AnkleLink,AnkleLink +m_WolfPanties_l_Panties,Panties +m_WolfCollar_l_Collar,Collar +m_WolfCollar_l_CollarBand,CollarBand +m_WolfCollarTag_l_Collar,Collar +m_WolfCollarTag_l_CollarBand,CollarBand +m_WolfCollarTag_l_CollarHardware,CollarHardware +m_WolfCollarTag_l_CollarTag,CollarTag +m_WolfCollarSmall_l_FCollar,FCollar +m_WolfCollarSmall_l_FCollarBand,FCollarBand +m_WolfCollarSmallTag_l_FCollar,FCollar +m_WolfCollarSmallTag_l_FCollarBand,FCollarBand +m_WolfCollarSmallTag_l_FCollarHardware,FCollarHardware +m_WolfCollarSmallTag_l_FCollarTag,FCollarTag +m_WolfHarnessUpper_l_HarnessUpper,HarnessUpper +m_WolfHarnessUpper_l_HarnessBandUpper,HarnessBandUpper +m_WolfHarnessBelt_l_BeltMid,BeltMid +m_WolfHarnessBelt_l_BeltBandMid,BeltBandMid +m_WolfHarnessBelt_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarnessLower_l_BeltMid,BeltMid +m_WolfHarnessLower_l_BeltBandMid,BeltBandMid +m_WolfHarnessLower_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarnessLower_l_HarnessMid,HarnessMid +m_WolfHarnessLower_l_HarnessHardwareMid,HarnessHardwareMid +m_WolfHarnessLower_l_HarnessLower,HarnessLower +m_WolfHarnessLower_l_HarnessBandLower,HarnessBandLower +m_WolfHarnessLower_l_HarnessHardwareLower,HarnessHardwareLower +m_WolfHarness_l_BeltMid,BeltMid +m_WolfHarness_l_BeltBandMid,BeltBandMid +m_WolfHarness_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarness_l_HarnessUpper,HarnessUpper +m_WolfHarness_l_HarnessBandUpper,HarnessBandUpper +m_WolfHarness_l_HarnessMid,HarnessMid +m_WolfHarness_l_HarnessHardwareMid,HarnessHardwareMid +m_WolfHarness_l_HarnessLower,HarnessLower +m_WolfHarness_l_HarnessBandLower,HarnessBandLower +m_WolfHarness_l_HarnessHardwareLower,HarnessHardwareLower +m_WolfCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_WolfCuffsAnklesLeft_l_BandAnkleLeft,BandAnkleLeft +m_WolfCuffsAnklesRight_l_AnkleRight,AnkleRight +m_WolfCuffsAnklesRight_l_BandAnkleRight,BandAnkleRight +m_WolfCuffsAnkles_l_AnkleRight,AnkleRight +m_WolfCuffsAnkles_l_BandAnkleRight,BandAnkleRight +m_WolfCuffsAnkles_l_AnkleLeft,AnkleLeft +m_WolfCuffsAnkles_l_BandAnkleLeft,BandAnkleLeft +m_WolfCollarRestraint_l_Collar,Collar +m_WolfCollarRestraint_l_CollarBand,CollarBand +m_WolfCollarTagRestraint_l_Collar,Collar +m_WolfCollarTagRestraint_l_CollarBand,CollarBand +m_WolfCollarTagRestraint_l_CollarHardware,CollarHardware +m_WolfCollarTagRestraint_l_CollarTag,CollarTag +m_WolfCollarSmallRestraint_l_FCollar,FCollar +m_WolfCollarSmallRestraint_l_FCollarBand,FCollarBand +m_WolfCollarSmallTagRestraint_l_FCollar,FCollar +m_WolfCollarSmallTagRestraint_l_FCollarBand,FCollarBand +m_WolfCollarSmallTagRestraint_l_FCollarHardware,FCollarHardware +m_WolfCollarSmallTagRestraint_l_FCollarTag,FCollarTag +m_WolfPantiesRestraint_l_Panties,Panties +m_WolfHarnessLowerRestraint_l_BeltMid,BeltMid +m_WolfHarnessLowerRestraint_l_BeltBandMid,BeltBandMid +m_WolfHarnessLowerRestraint_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarnessLowerRestraint_l_HarnessMid,HarnessMid +m_WolfHarnessLowerRestraint_l_HarnessHardwareMid,HarnessHardwareMid +m_WolfHarnessLowerRestraint_l_HarnessLower,HarnessLower +m_WolfHarnessLowerRestraint_l_HarnessBandLower,HarnessBandLower +m_WolfHarnessLowerRestraint_l_HarnessHardwareLower,HarnessHardwareLower +m_WolfHarnessUpperRestraint_l_HarnessUpper,HarnessUpper +m_WolfHarnessUpperRestraint_l_HarnessBandUpper,HarnessBandUpper +m_WolfHarnessBeltRestraint_l_BeltMid,BeltMid +m_WolfHarnessBeltRestraint_l_BeltBandMid,BeltBandMid +m_WolfHarnessBeltRestraint_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarnessRestraint_l_BeltMid,BeltMid +m_WolfHarnessRestraint_l_BeltBandMid,BeltBandMid +m_WolfHarnessRestraint_l_BeltHardwareMid,BeltHardwareMid +m_WolfHarnessRestraint_l_HarnessUpper,HarnessUpper +m_WolfHarnessRestraint_l_HarnessBandUpper,HarnessBandUpper +m_WolfHarnessRestraint_l_HarnessMid,HarnessMid +m_WolfHarnessRestraint_l_HarnessHardwareMid,HarnessHardwareMid +m_WolfHarnessRestraint_l_HarnessLower,HarnessLower +m_WolfHarnessRestraint_l_HarnessBandLower,HarnessBandLower +m_WolfHarnessRestraint_l_HarnessHardwareLower,HarnessHardwareLower +m_WolfGloveLeft_l_GloveLeft,GloveLeft +m_WolfGloveLeft_l_ForeGloveLeft,ForeGloveLeft +m_WolfGloveLeft_l_RimGloveLeft,RimGloveLeft +m_WolfGloveLeft_l_RimForeGloveLeft,RimForeGloveLeft +m_WolfGloveLeft_l_BandGloveLeft,BandGloveLeft +m_WolfGloveLeft_l_BandForeGloveLeft,BandForeGloveLeft +m_WolfGloveRight_l_GloveRight,GloveRight +m_WolfGloveRight_l_ForeGloveRight,ForeGloveRight +m_WolfGloveRight_l_RimGloveRight,RimGloveRight +m_WolfGloveRight_l_RimForeGloveRight,RimForeGloveRight +m_WolfGloveRight_l_BandGloveRight,BandGloveRight +m_WolfGloveRight_l_BandForeGloveRight,BandForeGloveRight +m_WolfGloves_l_GloveLeft,GloveLeft +m_WolfGloves_l_ForeGloveLeft,ForeGloveLeft +m_WolfGloves_l_RimGloveLeft,RimGloveLeft +m_WolfGloves_l_RimForeGloveLeft,RimForeGloveLeft +m_WolfGloves_l_BandGloveLeft,BandGloveLeft +m_WolfGloves_l_BandForeGloveLeft,BandForeGloveLeft +m_WolfGloves_l_GloveRight,GloveRight +m_WolfGloves_l_ForeGloveRight,ForeGloveRight +m_WolfGloves_l_RimGloveRight,RimGloveRight +m_WolfGloves_l_RimForeGloveRight,RimForeGloveRight +m_WolfGloves_l_BandGloveRight,BandGloveRight +m_WolfGloves_l_BandForeGloveRight,BandForeGloveRight +m_WolfSockLeft_l_LegLeft,LegLeft +m_WolfSockRight_l_LegRight,LegRight +m_WolfSocks_l_LegRight,LegRight +m_WolfSocks_l_LegLeft,LegLeft +m_WolfSocksRestraint_l_LegRight,LegRight +m_WolfSocksRestraint_l_LegLeft,LegLeft +m_WolfTorsoLower_l_TorsoLower,TorsoLower +m_WolfTorsoUpper_l_Chest,Chest +m_WolfTorsoUpper_l_TorsoUpper,TorsoUpper +m_WolfHeels_l_ShoeLeft,ShoeLeft +m_WolfHeels_l_ShoeRight,ShoeRight +m_WolfHeels_l_ShoeRightKneel,ShoeRightKneel +m_WolfHeels_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Wolf_l_LegRight,LegRight +m_Wolf_l_LegLeft,LegLeft +m_Wolf_l_GloveLeft,GloveLeft +m_Wolf_l_ForeGloveLeft,ForeGloveLeft +m_Wolf_l_RimGloveLeft,RimGloveLeft +m_Wolf_l_RimForeGloveLeft,RimForeGloveLeft +m_Wolf_l_BandGloveLeft,BandGloveLeft +m_Wolf_l_BandForeGloveLeft,BandForeGloveLeft +m_Wolf_l_GloveRight,GloveRight +m_Wolf_l_ForeGloveRight,ForeGloveRight +m_Wolf_l_RimGloveRight,RimGloveRight +m_Wolf_l_RimForeGloveRight,RimForeGloveRight +m_Wolf_l_BandGloveRight,BandGloveRight +m_Wolf_l_BandForeGloveRight,BandForeGloveRight +m_Wolf_l_Chest,Chest +m_Wolf_l_TorsoUpper,TorsoUpper +m_Wolf_l_TorsoLower,TorsoLower +m_Wolf_l_ShoeLeft,ShoeLeft +m_Wolf_l_ShoeRight,ShoeRight +m_Wolf_l_ShoeRightKneel,ShoeRightKneel +m_Wolf_l_ShoeLeftHogtie,ShoeLeftHogtie +m_CuffsWristLeft_l_WristLeft,WristLeft +m_CuffsWristLeft_l_BandWristLeft,BandWristLeft +m_CuffsWristLeft_l_HardwareWristLeft,HardwareWristLeft +m_CuffsWristRight_l_WristRight,WristRight +m_CuffsWristRight_l_BandWristRight,BandWristRight +m_CuffsWristRight_l_HardwareWristRight,HardwareWristRight +m_CuffsWrists_l_WristLeft,WristLeft +m_CuffsWrists_l_BandWristLeft,BandWristLeft +m_CuffsWrists_l_HardwareWristLeft,HardwareWristLeft +m_CuffsWrists_l_WristRight,WristRight +m_CuffsWrists_l_BandWristRight,BandWristRight +m_CuffsWrists_l_HardwareWristRight,HardwareWristRight +m_CuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_CuffsElbowLeft_l_BandElbowLeft,BandElbowLeft +m_CuffsElbowLeft_l_HardwareElbowLeft,HardwareElbowLeft +m_CuffsElbowRight_l_ElbowRight,ElbowRight +m_CuffsElbowRight_l_BandElbowRight,BandElbowRight +m_CuffsElbowRight_l_HardwareElbowRight,HardwareElbowRight +m_CuffsElbows_l_ElbowLeft,ElbowLeft +m_CuffsElbows_l_BandElbowLeft,BandElbowLeft +m_CuffsElbows_l_HardwareElbowLeft,HardwareElbowLeft +m_CuffsElbows_l_ElbowRight,ElbowRight +m_CuffsElbows_l_BandElbowRight,BandElbowRight +m_CuffsElbows_l_HardwareElbowRight,HardwareElbowRight +m_CuffsArms_l_WristLeft,WristLeft +m_CuffsArms_l_BandWristLeft,BandWristLeft +m_CuffsArms_l_HardwareWristLeft,HardwareWristLeft +m_CuffsArms_l_WristRight,WristRight +m_CuffsArms_l_BandWristRight,BandWristRight +m_CuffsArms_l_HardwareWristRight,HardwareWristRight +m_CuffsArms_l_ElbowLeft,ElbowLeft +m_CuffsArms_l_BandElbowLeft,BandElbowLeft +m_CuffsArms_l_HardwareElbowLeft,HardwareElbowLeft +m_CuffsArms_l_ElbowRight,ElbowRight +m_CuffsArms_l_BandElbowRight,BandElbowRight +m_CuffsArms_l_HardwareElbowRight,HardwareElbowRight +m_CuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_CuffsAnklesLeft_l_BandAnkleLeft,BandAnkleLeft +m_CuffsAnklesLeft_l_HardwareAnkleLeft,HardwareAnkleLeft +m_CuffsAnklesRight_l_AnkleRight,AnkleRight +m_CuffsAnklesRight_l_BandAnkleRight,BandAnkleRight +m_CuffsAnklesRight_l_HardwareAnkleRight,HardwareAnkleRight +m_CuffsAnkles_l_AnkleRight,AnkleRight +m_CuffsAnkles_l_BandAnkleRight,BandAnkleRight +m_CuffsAnkles_l_HardwareAnkleRight,HardwareAnkleRight +m_CuffsAnkles_l_AnkleLeft,AnkleLeft +m_CuffsAnkles_l_BandAnkleLeft,BandAnkleLeft +m_CuffsAnkles_l_HardwareAnkleLeft,HardwareAnkleLeft +m_CuffsThighLeft_l_ThighLeft,ThighLeft +m_CuffsThighLeft_l_BandThighLeft,BandThighLeft +m_CuffsThighLeft_l_HardwareThighLeft,HardwareThighLeft +m_CuffsThighRight_l_ThighRight,ThighRight +m_CuffsThighRight_l_BandThighRight,BandThighRight +m_CuffsThighRight_l_HardwareThighRight,HardwareThighRight +m_CuffsThigh_l_ThighRight,ThighRight +m_CuffsThigh_l_BandThighRight,BandThighRight +m_CuffsThigh_l_HardwareThighRight,HardwareThighRight +m_CuffsThigh_l_ThighLeft,ThighLeft +m_CuffsThigh_l_BandThighLeft,BandThighLeft +m_CuffsThigh_l_HardwareThighLeft,HardwareThighLeft +m_LeatherCollar_l_Collar,Collar +m_LeatherCollar_l_BandCollar,BandCollar +m_LeatherCollar_l_HardwareCollar,HardwareCollar +m_LeatherCollarBell_l_Collar,Collar +m_LeatherCollarBell_l_BandCollar,BandCollar +m_LeatherCollarBell_l_HardwareCollar,HardwareCollar +m_LeatherCollarBell_l_BellCollar,BellCollar +m_LeatherCollarBow_l_Collar,Collar +m_LeatherCollarBow_l_BandCollar,BandCollar +m_LeatherCollarBow_l_HardwareCollar,HardwareCollar +m_LeatherCollarBow_l_BowBellCollar,BowBellCollar +m_LeatherCollarBow_l_BowCollar,BowCollar +m_LeatherBelt_l_Belt,Belt +m_LeatherBelt_l_BandBelt,BandBelt +m_LeatherBelt_l_HardwareBelt,HardwareBelt +m_FashionLeatherCollar,FashionLeatherCollar +m_FashionLeatherCollar_l_Collar,Collar +m_FashionLeatherCollar_l_BandCollar,BandCollar +m_FashionLeatherCollar_l_HardwareCollar,HardwareCollar +m_FashionLeatherBelt,FashionLeatherBelt +m_FashionLeatherBelt_l_Belt,Belt +m_FashionLeatherBelt_l_BandBelt,BandBelt +m_FashionLeatherBelt_l_HardwareBelt,HardwareBelt +m_FashionLeatherCollarBell,FashionLeatherCollarBell +m_FashionLeatherCollarBell_l_Collar,Collar +m_FashionLeatherCollarBell_l_BandCollar,BandCollar +m_FashionLeatherCollarBell_l_HardwareCollar,HardwareCollar +m_FashionLeatherCollarBell_l_BellCollar,BellCollar +m_FashionLeatherCollarBow,FashionLeatherCollarBow +m_FashionLeatherCollarBow_l_Collar,Collar +m_FashionLeatherCollarBow_l_BandCollar,BandCollar +m_FashionLeatherCollarBow_l_HardwareCollar,HardwareCollar +m_FashionLeatherCollarBow_l_BowBellCollar,BowBellCollar +m_FashionLeatherCollarBow_l_BowCollar,BowCollar +m_FashionCuffsWristLeft,FashionCuffsWristLeft +m_FashionCuffsWristLeft_l_WristLeft,WristLeft +m_FashionCuffsWristLeft_l_BandWristLeft,BandWristLeft +m_FashionCuffsWristLeft_l_HardwareWristLeft,HardwareWristLeft +m_FashionCuffsWristRight,FashionCuffsWristRight +m_FashionCuffsWristRight_l_WristRight,WristRight +m_FashionCuffsWristRight_l_BandWristRight,BandWristRight +m_FashionCuffsWristRight_l_HardwareWristRight,HardwareWristRight +m_FashionCuffsWrists,FashionCuffsWrists +m_FashionCuffsWrists_l_WristLeft,WristLeft +m_FashionCuffsWrists_l_BandWristLeft,BandWristLeft +m_FashionCuffsWrists_l_HardwareWristLeft,HardwareWristLeft +m_FashionCuffsWrists_l_WristRight,WristRight +m_FashionCuffsWrists_l_BandWristRight,BandWristRight +m_FashionCuffsWrists_l_HardwareWristRight,HardwareWristRight +m_FashionCuffsElbowLeft,FashionCuffsElbowLeft +m_FashionCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_FashionCuffsElbowLeft_l_BandElbowLeft,BandElbowLeft +m_FashionCuffsElbowLeft_l_HardwareElbowLeft,HardwareElbowLeft +m_FashionCuffsElbowRight,FashionCuffsElbowRight +m_FashionCuffsElbowRight_l_ElbowRight,ElbowRight +m_FashionCuffsElbowRight_l_BandElbowRight,BandElbowRight +m_FashionCuffsElbowRight_l_HardwareElbowRight,HardwareElbowRight +m_FashionCuffsElbows,FashionCuffsElbows +m_FashionCuffsElbows_l_ElbowLeft,ElbowLeft +m_FashionCuffsElbows_l_BandElbowLeft,BandElbowLeft +m_FashionCuffsElbows_l_HardwareElbowLeft,HardwareElbowLeft +m_FashionCuffsElbows_l_ElbowRight,ElbowRight +m_FashionCuffsElbows_l_BandElbowRight,BandElbowRight +m_FashionCuffsElbows_l_HardwareElbowRight,HardwareElbowRight +m_FashionCuffsArms,FashionCuffsArms +m_FashionCuffsArms_l_WristLeft,WristLeft +m_FashionCuffsArms_l_BandWristLeft,BandWristLeft +m_FashionCuffsArms_l_HardwareWristLeft,HardwareWristLeft +m_FashionCuffsArms_l_WristRight,WristRight +m_FashionCuffsArms_l_BandWristRight,BandWristRight +m_FashionCuffsArms_l_HardwareWristRight,HardwareWristRight +m_FashionCuffsArms_l_ElbowLeft,ElbowLeft +m_FashionCuffsArms_l_BandElbowLeft,BandElbowLeft +m_FashionCuffsArms_l_HardwareElbowLeft,HardwareElbowLeft +m_FashionCuffsArms_l_ElbowRight,ElbowRight +m_FashionCuffsArms_l_BandElbowRight,BandElbowRight +m_FashionCuffsArms_l_HardwareElbowRight,HardwareElbowRight +m_FashionCuffsAnklesLeft,FashionCuffsAnklesLeft +m_FashionCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_FashionCuffsAnklesLeft_l_BandAnkleLeft,BandAnkleLeft +m_FashionCuffsAnklesLeft_l_HardwareAnkleLeft,HardwareAnkleLeft +m_FashionCuffsAnklesRight,FashionCuffsAnklesRight +m_FashionCuffsAnklesRight_l_AnkleRight,AnkleRight +m_FashionCuffsAnklesRight_l_BandAnkleRight,BandAnkleRight +m_FashionCuffsAnklesRight_l_HardwareAnkleRight,HardwareAnkleRight +m_FashionCuffsAnkles,FashionCuffsAnkles +m_FashionCuffsAnkles_l_AnkleRight,AnkleRight +m_FashionCuffsAnkles_l_BandAnkleRight,BandAnkleRight +m_FashionCuffsAnkles_l_HardwareAnkleRight,HardwareAnkleRight +m_FashionCuffsAnkles_l_AnkleLeft,AnkleLeft +m_FashionCuffsAnkles_l_BandAnkleLeft,BandAnkleLeft +m_FashionCuffsAnkles_l_HardwareAnkleLeft,HardwareAnkleLeft +m_FashionCuffsThighLeft,FashionCuffsThighLeft +m_FashionCuffsThighLeft_l_ThighLeft,ThighLeft +m_FashionCuffsThighLeft_l_BandThighLeft,BandThighLeft +m_FashionCuffsThighLeft_l_HardwareThighLeft,HardwareThighLeft +m_FashionCuffsThighRight,FashionCuffsThighRight +m_FashionCuffsThighRight_l_ThighRight,ThighRight +m_FashionCuffsThighRight_l_BandThighRight,BandThighRight +m_FashionCuffsThighRight_l_HardwareThighRight,HardwareThighRight +m_FashionCuffsThigh,FashionCuffsThigh +m_FashionCuffsThigh_l_ThighRight,ThighRight +m_FashionCuffsThigh_l_BandThighRight,BandThighRight +m_FashionCuffsThigh_l_HardwareThighRight,HardwareThighRight +m_FashionCuffsThigh_l_ThighLeft,ThighLeft +m_FashionCuffsThigh_l_BandThighLeft,BandThighLeft +m_FashionCuffsThigh_l_HardwareThighLeft,HardwareThighLeft +m_SlimeMouth_l_FaceMouth,FaceMouth +m_SlimeEyes_l_FaceEyes,FaceEyes +m_SlimeHead_l_FaceFull,FaceFull +m_SlimeBoots_l_FootLeft,FootLeft +m_SlimeBoots_l_FootRight,FootRight +m_SlimeTorsoLower_l_TorsoLower,TorsoLower +m_SlimeThighs_l_LegLeft,LegLeft +m_SlimeThighs_l_LegRight,LegRight +m_SlimeLegs_l_LegLeft,LegLeft +m_SlimeLegs_l_LegRight,LegRight +m_SlimeLegs_l_TorsoLower,TorsoLower +m_SlimeFeet_l_AnkleLeft,AnkleLeft +m_SlimeFeet_l_AnkleRight,AnkleRight +m_SlimeArmLeft_l_ArmLeft,ArmLeft +m_SlimeArmRight_l_ArmRight,ArmRight +m_SlimeTorsoUpper_l_TorsoUpper,TorsoUpper +m_SlimeTorsoUpper_l_Chest,Chest +m_SlimeArms_l_ArmLeft,ArmLeft +m_SlimeArms_l_ArmRight,ArmRight +m_SlimeArms_l_TorsoUpper,TorsoUpper +m_SlimeArms_l_Chest,Chest +m_SlimeHandLeft_l_HandLeft,HandLeft +m_SlimeHandRight_l_HandRight,HandRight +m_SlimeHands_l_HandLeft,HandLeft +m_SlimeHands_l_HandRight,HandRight +m_RubberMouth_l_FaceMouth,FaceMouth +m_RubberEyes_l_FaceEyes,FaceEyes +m_RubberHead_l_FaceFull,FaceFull +m_RubberBoots_l_FootLeft,FootLeft +m_RubberBoots_l_FootRight,FootRight +m_RubberTorsoLower_l_TorsoLower,TorsoLower +m_RubberThighs_l_LegLeft,LegLeft +m_RubberThighs_l_LegRight,LegRight +m_RubberLegs_l_LegLeft,LegLeft +m_RubberLegs_l_LegRight,LegRight +m_RubberLegs_l_TorsoLower,TorsoLower +m_RubberFeet_l_AnkleLeft,AnkleLeft +m_RubberFeet_l_AnkleRight,AnkleRight +m_RubberArmLeft_l_ArmLeft,ArmLeft +m_RubberArmRight_l_ArmRight,ArmRight +m_RubberTorsoUpper_l_TorsoUpper,TorsoUpper +m_RubberTorsoUpper_l_Chest,Chest +m_RubberArms_l_ArmLeft,ArmLeft +m_RubberArms_l_ArmRight,ArmRight +m_RubberArms_l_TorsoUpper,TorsoUpper +m_RubberArms_l_Chest,Chest +m_RubberHandLeft_l_HandLeft,HandLeft +m_RubberHandRight_l_HandRight,HandRight +m_RubberHands_l_HandLeft,HandLeft +m_RubberHands_l_HandRight,HandRight +m_TapeMedBoots_l_Feet,Feet +m_TapeMedAnkles_l_Ankles,Ankles +m_TapeMedLegs_l_Legs,Legs +m_TapeMedLegs_l_RightLegs,RightLegs +m_TapeMedLegs_l_StrapCover,StrapCover +m_TapeMedArms_l_Top,Top +m_TapeMedArms_l_Chest,Chest +m_TapeMedArms_l_ArmLeft,ArmLeft +m_TapeMedArms_l_ArmRight,ArmRight +m_TapeFullArms_l_TopFull,TopFull +m_TapeFullArms_l_ChestFull,ChestFull +m_TapeFullArms_l_ArmFullLeft,ArmFullLeft +m_TapeFullArms_l_ArmFullRight,ArmFullRight +m_TapeMedHandLeft_l_HandLeft,HandLeft +m_TapeMedHandRight_l_HandRight,HandRight +m_TapeHeavyBoots_l_Feet,Feet +m_TapeHeavyAnkles_l_Ankles,Ankles +m_TapeHeavyLegs_l_Legs,Legs +m_TapeHeavyLegs_l_RightLegs,RightLegs +m_TapeHeavyLegs_l_StrapCover,StrapCover +m_TapeHeavyBottom_l_Bottom,Bottom +m_TapeHeavyBottomFull_l_Bottom,Bottom +m_TapeHeavyBottomFull_l_Legs,Legs +m_TapeHeavyBottomFull_l_RightLegs,RightLegs +m_TapeHeavyBottomFull_l_StrapCover,StrapCover +m_TapeHeavyArms_l_Top,Top +m_TapeHeavyArms_l_Chest,Chest +m_TapeHeavyArms_l_ArmLeft,ArmLeft +m_TapeHeavyArms_l_ArmRight,ArmRight +m_TapeHeavyArmsFull_l_Top,Top +m_TapeHeavyArmsFull_l_Chest,Chest +m_TapeHeavyArmsFull_l_ArmLeft,ArmLeft +m_TapeHeavyArmsFull_l_ArmRight,ArmRight +m_TapeHeavyArmsFull_l_TopFull,TopFull +m_TapeHeavyArmsFull_l_ChestFull,ChestFull +m_TapeHeavyArmsFull_l_ArmFullLeft,ArmFullLeft +m_TapeHeavyArmsFull_l_ArmFullRight,ArmFullRight +m_TapeHeavyHandLeft_l_HandLeft,HandLeft +m_TapeHeavyHandRight_l_HandRight,HandRight +m_TapeHeavyHands_l_HandLeft,HandLeft +m_TapeHeavyHands_l_HandRight,HandRight +m_TapeBoots_l_Feet,Feet +m_TapeAnkles_l_Ankles,Ankles +m_TapeLegs_l_Legs,Legs +m_TapeLegs_l_RightLegs,RightLegs +m_TapeTorsoUpper_l_Top,Top +m_TapeArmLeft_l_ArmLeft,ArmLeft +m_TapeArmRight_l_ArmRight,ArmRight +m_TapeArms_l_ArmLeft,ArmLeft +m_TapeArms_l_ArmRight,ArmRight +m_TapeArms_l_Top,Top +m_TapeStrapArms_l_TopStrap,TopStrap +m_TapeStrapArms_l_ChestStrap,ChestStrap +m_TapeStrapArms_l_ArmStrapLeft,ArmStrapLeft +m_TapeStrapArms_l_ArmStrapRight,ArmStrapRight +m_TapeStrappedArms_l_ArmLeft,ArmLeft +m_TapeStrappedArms_l_ArmRight,ArmRight +m_TapeStrappedArms_l_Top,Top +m_TapeStrappedArms_l_TopStrap,TopStrap +m_TapeStrappedArms_l_ChestStrap,ChestStrap +m_TapeStrappedArms_l_ArmStrapLeft,ArmStrapLeft +m_TapeStrappedArms_l_ArmStrapRight,ArmStrapRight +m_TapeHandLeft_l_HandLeft,HandLeft +m_TapeHandRight_l_HandRight,HandRight +m_LatexTop,LatexTop +m_LatexTop_l_BraProtoLining,BraProtoLining +m_LatexTop_l_BraProtoLiningMid,BraProtoLiningMid +m_LatexTop_l_BraProtoLiningRim,BraProtoLiningRim +m_LatexTop_l_BraProtoLiningMidRim,BraProtoLiningMidRim +m_LatexTopZip,LatexTopZip +m_LatexTopZip_l_BraProtoLiningZip,BraProtoLiningZip +m_LatexTopZip_l_BraProtoLiningMidZip,BraProtoLiningMidZip +m_LatexTopZip_l_BraProtoLiningZipRim,BraProtoLiningZipRim +m_LatexTopZip_l_BraProtoLiningMidZipRim,BraProtoLiningMidZipRim +m_BraProto_l_BraProto,BraProto +m_BraProto_l_BraProtoLining,BraProtoLining +m_BraProto_l_BraProtoLiningMid,BraProtoLiningMid +m_BraProto_l_BraProtoCups,BraProtoCups +m_BraProto_l_BraProtoDisplay,BraProtoDisplay +m_BraProto_l_BraProtoLock,BraProtoLock +m_BraCyber_l_BraCyber,BraCyber +m_BraCyber_l_BraCyberLining,BraCyberLining +m_BraCyber_l_BraCyberDisplay,BraCyberDisplay +m_BraCyber_l_BraCyberLock,BraCyberLock +m_ChastityBra_l_BraCups,BraCups +m_ChastityBra_l_BraLining,BraLining +m_ChastityBra_l_BraChain,BraChain +m_ChastityBra_l_BraLock,BraLock +m_HeartBelt_l_Belt,Belt +m_HeartBelt_l_BeltLining,BeltLining +m_HeartBelt_l_BeltLock,BeltLock +m_HeartBelt_l_BeltStrap,BeltStrap +m_HeartBelt_l_BeltStrapLining,BeltStrapLining +m_CyberBelt_l_Cyber,Cyber +m_CyberBelt_l_CyberLining,CyberLining +m_CyberBelt_l_CyberDisplay,CyberDisplay +m_CyberBelt_l_CyberPlug,CyberPlug +m_CyberBelt_l_CyberLock,CyberLock +m_ProtoBelt_l_Proto,Proto +m_ProtoBelt_l_ProtoLining,ProtoLining +m_ProtoBelt_l_ProtoDisplay,ProtoDisplay +m_ProtoBelt_l_ProtoPlug,ProtoPlug +m_ProtoBelt_l_ProtoLock,ProtoLock +m_SmoothArmbinder_l_BinderLeft,BinderLeft +m_SmoothArmbinder_l_BinderRight,BinderRight +m_Armbinder_l_BinderLeft,BinderLeft +m_Armbinder_l_BinderRight,BinderRight +m_Armbinder_l_StrapsLeft,StrapsLeft +m_Armbinder_l_StrapsRight,StrapsRight +m_ArmbinderCross_l_BinderLeft,BinderLeft +m_ArmbinderCross_l_BinderRight,BinderRight +m_ArmbinderCross_l_StrapsLeft,StrapsLeft +m_ArmbinderCross_l_StrapsRight,StrapsRight +m_ArmbinderCross_l_Cross,Cross +m_SmoothArmbinderCross_l_BinderLeft,BinderLeft +m_SmoothArmbinderCross_l_BinderRight,BinderRight +m_SmoothArmbinderCross_l_Cross,Cross +m_ArmbinderSecure_l_BinderLeft,BinderLeft +m_ArmbinderSecure_l_BinderRight,BinderRight +m_ArmbinderSecure_l_StrapsLeft,StrapsLeft +m_ArmbinderSecure_l_StrapsRight,StrapsRight +m_ArmbinderSecure_l_Secure,Secure +m_SmoothArmbinderSecure_l_BinderLeft,BinderLeft +m_SmoothArmbinderSecure_l_BinderRight,BinderRight +m_SmoothArmbinderSecure_l_Secure,Secure +m_ArmbinderGwen_l_BinderLeft,BinderLeft +m_ArmbinderGwen_l_BinderRight,BinderRight +m_ArmbinderGwen_l_StrapsLeft,StrapsLeft +m_ArmbinderGwen_l_StrapsRight,StrapsRight +m_ArmbinderGwen_l_Gwen,Gwen +m_SmoothArmbinderGwen_l_BinderLeft,BinderLeft +m_SmoothArmbinderGwen_l_BinderRight,BinderRight +m_SmoothArmbinderGwen_l_Gwen,Gwen +m_WolfArmbinder_l_BinderLeft,BinderLeft +m_WolfArmbinder_l_BinderRight,BinderRight +m_WolfArmbinder_l_StrapsLeft,StrapsLeft +m_WolfArmbinder_l_StrapsRight,StrapsRight +m_WolfArmbinder_l_WolfHarness,WolfHarness +m_JacketArmbinder_l_Arms,Arms +m_JacketArmbinder_l_BeltsArms,BeltsArms +m_Jacket_l_Arms,Arms +m_Jacket_l_BeltsArms,BeltsArms +m_Jacket_l_Chest,Chest +m_Jacket_l_BeltsChest,BeltsChest +m_JacketHeavy_l_Arms,Arms +m_JacketHeavy_l_BeltsArms,BeltsArms +m_JacketHeavy_l_Chest,Chest +m_JacketHeavy_l_BeltsChest,BeltsChest +m_JacketHeavy_l_BinderTorsoLower,BinderTorsoLower +m_JacketHeavy_l_BeltsTorsoLower,BeltsTorsoLower +m_JacketHeavy_l_Crotch,Crotch +m_JacketHeavy_l_CrotchBelts,CrotchBelts +m_JacketStraps_l_StrapsArms,StrapsArms +m_JacketStraps_l_StrapsChest,StrapsChest +m_JacketStraps_l_StrapsUnderbust,StrapsUnderbust +m_JacketArmbinderSecure_l_Arms,Arms +m_JacketArmbinderSecure_l_StrapsArms,StrapsArms +m_JacketArmbinderSecure_l_StrapsChest,StrapsChest +m_JacketArmbinderSecure_l_StrapsUnderbust,StrapsUnderbust +m_JacketBolero_l_Arms,Arms +m_JacketBolero_l_ChestBolero,ChestBolero +m_JacketBolero_l_StrapsArms,StrapsArms +m_JacketBolero_l_StrapsChest,StrapsChest +m_JacketBolero_l_StrapsUnderbust,StrapsUnderbust +m_JacketLeotard_l_Arms,Arms +m_JacketLeotard_l_ChestBolero,ChestBolero +m_JacketLeotard_l_StrapsArms,StrapsArms +m_JacketLeotard_l_StrapsChest,StrapsChest +m_JacketLeotard_l_StrapsUnderbust,StrapsUnderbust +m_JacketLeotard_l_LatexLower,LatexLower +m_JacketLeotard_l_LatexChest,LatexChest +m_JacketLeotard_l_LatexUpper,LatexUpper +m_Legbinder_l_Legbinder,Legbinder +m_Legbinder_l_LegLegbinder,LegLegbinder +m_Legbinder_l_RightLegbinder,RightLegbinder +m_Legbinder_l_LegRightLegbinder,LegRightLegbinder +m_Legbinder_l_LacesLegbinder,LacesLegbinder +m_TapeFace_l_Face,Face +m_ClothBlindfold_l_Cloth,Cloth +m_BlindfoldBasic_l_Basic,Basic +m_BlindfoldBasic_l_BasicRim,BasicRim +m_BlindfoldLeather_l_LeatherBase,LeatherBase +m_BlindfoldLeather_l_LeatherRim,LeatherRim +m_KittyBlindfold_l_LeatherBase,LeatherBase +m_KittyBlindfold_l_LeatherRim,LeatherRim +m_KittyBlindfold_l_KittyEyes,KittyEyes +m_BlindfoldTape_l_Tape,Tape +m_BalletHeels_l_BalletLeft,BalletLeft +m_BalletHeels_l_BalletRight,BalletRight +m_BalletHeels_l_BalletSoleLeft,BalletSoleLeft +m_BalletHeels_l_BalletSoleRight,BalletSoleRight +m_BalletHeels_l_BalletLaceLeft,BalletLaceLeft +m_BalletHeels_l_BalletLaceRight,BalletLaceRight +m_FlatBalletHeels_l_FlatBalletLeft,FlatBalletLeft +m_FlatBalletHeels_l_FlatBalletRight,FlatBalletRight +m_FlatBalletHeels_l_BalletSoleLeft,BalletSoleLeft +m_FlatBalletHeels_l_BalletSoleRight,BalletSoleRight +m_ShinyBalletHeels_l_ShinyBalletLeft,ShinyBalletLeft +m_ShinyBalletHeels_l_ShinyBalletRight,ShinyBalletRight +m_ShinyBalletHeels_l_BalletSoleLeft,BalletSoleLeft +m_ShinyBalletHeels_l_BalletSoleRight,BalletSoleRight +m_BalletHeelsRestraint_l_BalletLeft,BalletLeft +m_BalletHeelsRestraint_l_BalletRight,BalletRight +m_BalletHeelsRestraint_l_BalletSoleLeft,BalletSoleLeft +m_BalletHeelsRestraint_l_BalletSoleRight,BalletSoleRight +m_BalletHeelsRestraint_l_BalletLaceLeft,BalletLaceLeft +m_BalletHeelsRestraint_l_BalletLaceRight,BalletLaceRight +m_FlatBalletHeelsRestraint_l_FlatBalletLeft,FlatBalletLeft +m_FlatBalletHeelsRestraint_l_FlatBalletRight,FlatBalletRight +m_FlatBalletHeelsRestraint_l_BalletSoleLeft,BalletSoleLeft +m_FlatBalletHeelsRestraint_l_BalletSoleRight,BalletSoleRight +m_ShinyBalletHeelsRestraint_l_ShinyBalletLeft,ShinyBalletLeft +m_ShinyBalletHeelsRestraint_l_ShinyBalletRight,ShinyBalletRight +m_ShinyBalletHeelsRestraint_l_BalletSoleLeft,BalletSoleLeft +m_ShinyBalletHeelsRestraint_l_BalletSoleRight,BalletSoleRight +m_LeatherHeels_l_LeatherLeft,LeatherLeft +m_LeatherHeels_l_LeatherRight,LeatherRight +m_LeatherHeels_l_LeatherLegLeft,LeatherLegLeft +m_LeatherHeels_l_LeatherLegRight,LeatherLegRight +m_TallHeels_l_TallLeft,TallLeft +m_TallHeels_l_TallRight,TallRight +m_TallHeels_l_TallLegLeft,TallLegLeft +m_TallHeels_l_TallLegRight,TallLegRight +m_TallHeelsRestraint_l_TallLeft,TallLeft +m_TallHeelsRestraint_l_TallRight,TallRight +m_TallHeelsRestraint_l_TallLegLeft,TallLegLeft +m_TallHeelsRestraint_l_TallLegRight,TallLegRight +m_Legirons_l_LegironsLeft,LegironsLeft +m_Legirons_l_LegironsRight,LegironsRight +m_Irish8Ankle_l_Irish8AnkleLeft,Irish8AnkleLeft +m_Irish8Ankle_l_Irish8AnkleRight,Irish8AnkleRight +m_HandCuffs_l_CuffsLock,CuffsLock +m_HandCuffs_l_HandCuffs,HandCuffs +m_HingedCuffs_l_CuffsLock,CuffsLock +m_HingedCuffs_l_HingedCuffs,HingedCuffs +m_Irish8Cuffs_l_CuffsLock,CuffsLock +m_Irish8Cuffs_l_Irish8Cuffs,Irish8Cuffs +m_WolfCuffs_l_WolfCuffs,WolfCuffs +m_WolfCuffs_l_WolfCuffsChain,WolfCuffsChain +m_Thumbcuffs_l_Thumbcuffs,Thumbcuffs +m_HarnessTop_l_BeltsTop,BeltsTop +m_HarnessTop_l_HardwareTop,HardwareTop +m_HarnessMid_l_BeltsMid,BeltsMid +m_HarnessMid_l_HardwareMid,HardwareMid +m_HarnessStrap_l_BeltsStrap,BeltsStrap +m_HarnessStrap_l_HardwareStrap,HardwareStrap +m_Harness_l_BeltsTop,BeltsTop +m_Harness_l_HardwareTop,HardwareTop +m_Harness_l_BeltsOverbust,BeltsOverbust +m_Harness_l_BeltsUnderbust,BeltsUnderbust +m_Harness_l_HardwareUnderbustOver,HardwareUnderbustOver +m_Harness_l_HardwareUnderbust,HardwareUnderbust +m_Harness_l_BeltsMid,BeltsMid +m_Harness_l_HardwareMid,HardwareMid +m_Harness_l_BeltsStrap,BeltsStrap +m_Harness_l_HardwareStrap,HardwareStrap +m_FutureHarnessChest_l_StrapsChest,StrapsChest +m_FutureHarnessChest_l_DisplayChest,DisplayChest +m_FutureHarnessChest_l_MetalChest,MetalChest +m_FutureHarnessMid_l_StrapsMid,StrapsMid +m_FutureHarnessMid_l_DisplayMid,DisplayMid +m_FutureHarnessMid_l_MetalMid,MetalMid +m_FutureHarnessLower_l_StrapsLower,StrapsLower +m_FutureHarnessLower_l_DisplayLower,DisplayLower +m_FutureHarnessLower_l_MetalLower,MetalLower +m_FutureHarness_l_StrapsLower,StrapsLower +m_FutureHarness_l_DisplayLower,DisplayLower +m_FutureHarness_l_MetalLower,MetalLower +m_FutureHarness_l_StrapsMid,StrapsMid +m_FutureHarness_l_DisplayMid,DisplayMid +m_FutureHarness_l_MetalMid,MetalMid +m_FutureHarness_l_StrapsChest,StrapsChest +m_FutureHarness_l_DisplayChest,DisplayChest +m_FutureHarness_l_MetalChest,MetalChest +m_ClothCollar_l_Collar,Collar +m_ClothCollarTag_l_Collar,Collar +m_ClothCollarTag_l_CollarTag,CollarTag +m_ClothBelt_l_Belt,Belt +m_ClothBeltLines_l_Belt,Belt +m_ClothBeltLines_l_BeltLines,BeltLines +m_MaidGag_l_FrillyPanel,FrillyPanel +m_MaidGag_l_FrillyStraps,FrillyStraps +m_MaidGag_l_FrillyHardware,FrillyHardware +m_MaidGag_l_FrillyHighlights,FrillyHighlights +m_DusterGag_l_FrillyPanel,FrillyPanel +m_DusterGag_l_FrillyStraps,FrillyStraps +m_DusterGag_l_FrillyHardware,FrillyHardware +m_DusterGag_l_FrillyHighlights,FrillyHighlights +m_DusterGag_l_Duster,Duster +m_GhostGag_l_Ball,Ball +m_GhostGag_l_Strap,Strap +m_BallGag_l_Ball,Ball +m_BallGag_l_Strap,Strap +m_BallGagHarness_l_Ball,Ball +m_BallGagHarness_l_Strap,Strap +m_BallGagHarness_l_Harness,Harness +m_BallGagHarnessSecure_l_Ball,Ball +m_BallGagHarnessSecure_l_Strap,Strap +m_BallGagHarnessSecure_l_Harness,Harness +m_BallGagHarnessSecure_l_SideStrap,SideStrap +m_LargeBallGag_l_Ball,Ball +m_LargeBallGag_l_Strap,Strap +m_LargeBallGagHarness_l_Ball,Ball +m_LargeBallGagHarness_l_Strap,Strap +m_LargeBallGagHarness_l_Harness,Harness +m_LargeBallGagHarnessSecure_l_Ball,Ball +m_LargeBallGagHarnessSecure_l_Strap,Strap +m_LargeBallGagHarnessSecure_l_Harness,Harness +m_LargeBallGagHarnessSecure_l_SideStrap,SideStrap +m_PanelGag_l_Panel,Panel +m_PanelGag_l_Strap,Strap +m_PanelGagHarness_l_Panel,Panel +m_PanelGagHarness_l_Strap,Strap +m_PanelGagHarness_l_Harness,Harness +m_PanelGagHarnessSecure_l_Panel,Panel +m_PanelGagHarnessSecure_l_Strap,Strap +m_PanelGagHarnessSecure_l_Harness,Harness +m_PanelGagHarnessSecure_l_SideStrap,SideStrap +m_MuzzleGag_l_Muzzle,Muzzle +m_MuzzleGag_l_Strap,Strap +m_MuzzleGagHarness_l_Muzzle,Muzzle +m_MuzzleGagHarness_l_Strap,Strap +m_MuzzleGagHarness_l_Harness,Harness +m_MuzzleGagHarnessSecure_l_Muzzle,Muzzle +m_MuzzleGagHarnessSecure_l_Strap,Strap +m_MuzzleGagHarnessSecure_l_Harness,Harness +m_MuzzleGagHarnessSecure_l_SideStrap,SideStrap +m_PlugGagPlug_l_Plug,Plug +m_PlugMuzzleGag_l_Muzzle,Muzzle +m_PlugMuzzleGag_l_Strap,Strap +m_PlugMuzzleGag_l_Plug,Plug +m_PlugMuzzleGagHarness_l_Muzzle,Muzzle +m_PlugMuzzleGagHarness_l_Strap,Strap +m_PlugMuzzleGagHarness_l_Harness,Harness +m_PlugMuzzleGagHarness_l_Plug,Plug +m_PlugMuzzleGagHarnessSecure_l_Muzzle,Muzzle +m_PlugMuzzleGagHarnessSecure_l_Strap,Strap +m_PlugMuzzleGagHarnessSecure_l_Harness,Harness +m_PlugMuzzleGagHarnessSecure_l_SideStrap,SideStrap +m_PlugMuzzleGagHarnessSecure_l_Plug,Plug +m_PlugPanelGag_l_Panel,Panel +m_PlugPanelGag_l_Strap,Strap +m_PlugPanelGag_l_Plug,Plug +m_PlugPanelGagHarness_l_Panel,Panel +m_PlugPanelGagHarness_l_Strap,Strap +m_PlugPanelGagHarness_l_Harness,Harness +m_PlugPanelGagHarness_l_Plug,Plug +m_PlugPanelGagHarnessSecure_l_Panel,Panel +m_PlugPanelGagHarnessSecure_l_Strap,Strap +m_PlugPanelGagHarnessSecure_l_Harness,Harness +m_PlugPanelGagHarnessSecure_l_SideStrap,SideStrap +m_PlugPanelGagHarnessSecure_l_Plug,Plug +m_Stuffing_l_Stuffing,Stuffing +m_TapeFull_l_Full,Full +m_TapeWrap_l_Wrap,Wrap +m_TapeFullOver_l_Full,Full +m_TapeWrapOver_l_Wrap,Wrap +m_TapeCleave_l_Cleave,Cleave +m_ClothCleave_l_Cleave,Cleave +m_ClothCleaveThick_l_CleaveThick,CleaveThick +m_ClothKnot_l_Knot,Knot +m_ClothOTN_l_OTN,OTN +m_ClothOTM_l_OTM,OTM +m_GagLatex_l_OTN,OTN +m_GagLatexFlat_l_OTNFlat,OTNFlat +m_GagLatexFlatHarness_l_OTNFlat,OTNFlat +m_GagLatexFlatHarness_l_Harness,Harness +m_GagLatexFlatHarnessSecure_l_OTNFlat,OTNFlat +m_GagLatexFlatHarnessSecure_l_Harness,Harness +m_GagLatexFlatHarnessSecure_l_SideStrap,SideStrap +m_GagLatexPlug_l_OTNFlat,OTNFlat +m_GagLatexPlug_l_Plug,Plug +m_GagLatexPlugHarness_l_OTNFlat,OTNFlat +m_GagLatexPlugHarness_l_Plug,Plug +m_GagLatexPlugHarness_l_Harness,Harness +m_GagLatexPlugHarnessSecure_l_OTNFlat,OTNFlat +m_GagLatexPlugHarnessSecure_l_Plug,Plug +m_GagLatexPlugHarnessSecure_l_Harness,Harness +m_GagLatexPlugHarnessSecure_l_SideStrap,SideStrap +m_LatexNeckCorset_l_NeckCorset,NeckCorset +m_LatexNeckCorset_l_NeckCorsetRim,NeckCorsetRim +m_LatexNeckCorsetGag_l_NeckCorset,NeckCorset +m_LatexNeckCorsetGag_l_NeckCorsetRim,NeckCorsetRim +m_LatexNeckCorsetGag_l_OTNFlat,OTNFlat +m_LatexNeckCorsetRestraint_l_NeckCorset,NeckCorset +m_LatexNeckCorsetRestraint_l_NeckCorsetRim,NeckCorsetRim +m_LatexNeckCorsetGagRestraint_l_NeckCorset,NeckCorset +m_LatexNeckCorsetGagRestraint_l_NeckCorsetRim,NeckCorsetRim +m_LatexNeckCorsetGagRestraint_l_OTNFlat,OTNFlat +m_LatexNeckCorsetPlugGag_l_NeckCorset,NeckCorset +m_LatexNeckCorsetPlugGag_l_NeckCorsetRim,NeckCorsetRim +m_LatexNeckCorsetPlugGag_l_OTNFlat,OTNFlat +m_LatexNeckCorsetPlugGag_l_Plug,Plug +m_GagMetal_l_OTN,OTN +m_GagFabric_l_FabricMuzzle,FabricMuzzle +m_KittyMuzzle_l_FabricMuzzle,FabricMuzzle +m_KittyMuzzle_l_KittyMouth,KittyMouth +m_KittyMuzzle_l_Whiskers,Whiskers +m_KittyHarnessPanelGag_l_Panel,Panel +m_KittyHarnessPanelGag_l_Strap,Strap +m_KittyHarnessPanelGag_l_Harness,Harness +m_KittyHarnessPanelGag_l_SideStrap,SideStrap +m_KittyHarnessPanelGag_l_KittyMouth,KittyMouth +m_GagComfy_l_FabricMuzzle,FabricMuzzle +m_GagMetalRiveted_l_OTN,OTN +m_GagMetalRiveted_l_OTNRivets,OTNRivets +m_SmoothBallGag_l_Ball,Ball +m_SmoothBallGag_l_Strap,Strap +m_SmoothBallGagHarness_l_Ball,Ball +m_SmoothBallGagHarness_l_Strap,Strap +m_SmoothBallGagHarness_l_Harness,Harness +m_SmoothBallGagHarnessSecure_l_Ball,Ball +m_SmoothBallGagHarnessSecure_l_Strap,Strap +m_SmoothBallGagHarnessSecure_l_Harness,Harness +m_SmoothBallGagHarnessSecure_l_SideStrap,SideStrap +m_SmoothLargeBallGag_l_Ball,Ball +m_SmoothLargeBallGag_l_Strap,Strap +m_SmoothLargeBallGagHarness_l_Ball,Ball +m_SmoothLargeBallGagHarness_l_Strap,Strap +m_SmoothLargeBallGagHarness_l_Harness,Harness +m_SmoothLargeBallGagHarnessSecure_l_Ball,Ball +m_SmoothLargeBallGagHarnessSecure_l_Strap,Strap +m_SmoothLargeBallGagHarnessSecure_l_Harness,Harness +m_SmoothLargeBallGagHarnessSecure_l_SideStrap,SideStrap +m_SegmentedLargeBallGag_l_Ball,Ball +m_SegmentedLargeBallGag_l_Strap,Strap +m_SegmentedLargeBallGagHarness_l_Ball,Ball +m_SegmentedLargeBallGagHarness_l_Strap,Strap +m_SegmentedLargeBallGagHarness_l_Harness,Harness +m_SegmentedLargeBallGagHarnessSecure_l_Ball,Ball +m_SegmentedLargeBallGagHarnessSecure_l_Strap,Strap +m_SegmentedLargeBallGagHarnessSecure_l_Harness,Harness +m_SegmentedLargeBallGagHarnessSecure_l_SideStrap,SideStrap +m_SciFiBallGag_l_Ball,Ball +m_SciFiBallGag_l_Strap,Strap +m_SciFiBallGag_l_Harness,Harness +m_SciFiBallGag_l_TopRim,TopRim +m_SciFiBallGag_l_Display,Display +m_EnhancedSciFiBallGag_l_Ball,Ball +m_EnhancedSciFiBallGag_l_Strap,Strap +m_EnhancedSciFiBallGag_l_Harness,Harness +m_EnhancedSciFiBallGag_l_TopRim,TopRim +m_EnhancedSciFiBallGag_l_Display,Display +m_EnhancedSciFiBallGag_l_Mask,Mask +m_AdvancedSciFiBallGag_l_Ball,Ball +m_AdvancedSciFiBallGag_l_Strap,Strap +m_AdvancedSciFiBallGag_l_Harness,Harness +m_AdvancedSciFiBallGag_l_TopRim,TopRim +m_AdvancedSciFiBallGag_l_Display,Display +m_AdvancedSciFiBallGag_l_Mask,Mask +m_AdvancedSciFiBallGag_l_HarnessRim,HarnessRim +m_AdvancedSciFiBallGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiBallGag_l_Ball,Ball +m_UltimateSciFiBallGag_l_Strap,Strap +m_UltimateSciFiBallGag_l_Harness,Harness +m_UltimateSciFiBallGag_l_TopRim,TopRim +m_UltimateSciFiBallGag_l_Display,Display +m_UltimateSciFiBallGag_l_Mask,Mask +m_UltimateSciFiBallGag_l_HarnessRim,HarnessRim +m_UltimateSciFiBallGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiBallGag_l_Muzzle,Muzzle +m_UltimateSciFiBallGag2_l_Ball,Ball +m_UltimateSciFiBallGag2_l_Strap,Strap +m_UltimateSciFiBallGag2_l_Harness,Harness +m_UltimateSciFiBallGag2_l_TopRim,TopRim +m_UltimateSciFiBallGag2_l_Display,Display +m_UltimateSciFiBallGag2_l_Mask,Mask +m_UltimateSciFiBallGag2_l_HarnessRim,HarnessRim +m_UltimateSciFiBallGag2_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiBallGag2_l_Muzzle,Muzzle +m_SegmentedLargePanelGag_l_Panel,Panel +m_SegmentedLargePanelGag_l_Strap,Strap +m_SegmentedLargePanelGag_l_Mask,Mask +m_SegmentedLargePanelGagHarness_l_Panel,Panel +m_SegmentedLargePanelGagHarness_l_Strap,Strap +m_SegmentedLargePanelGagHarness_l_Mask,Mask +m_SegmentedLargePanelGagHarness_l_Harness,Harness +m_SegmentedLargePanelGagHarnessSecure_l_Panel,Panel +m_SegmentedLargePanelGagHarnessSecure_l_Strap,Strap +m_SegmentedLargePanelGagHarnessSecure_l_Mask,Mask +m_SegmentedLargePanelGagHarnessSecure_l_Harness,Harness +m_SegmentedLargePanelGagHarnessSecure_l_SideStrap,SideStrap +m_SciFiPanelGag_l_Panel,Panel +m_SciFiPanelGag_l_Strap,Strap +m_SciFiPanelGag_l_Mask,Mask +m_SciFiPanelGag_l_Harness,Harness +m_SciFiPanelGag_l_TopRim,TopRim +m_SciFiPanelGag_l_Display,Display +m_AdvancedSciFiPanelGag_l_Panel,Panel +m_AdvancedSciFiPanelGag_l_Strap,Strap +m_AdvancedSciFiPanelGag_l_Mask,Mask +m_AdvancedSciFiPanelGag_l_Harness,Harness +m_AdvancedSciFiPanelGag_l_TopRim,TopRim +m_AdvancedSciFiPanelGag_l_Display,Display +m_AdvancedSciFiPanelGag_l_HarnessRim,HarnessRim +m_AdvancedSciFiPanelGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPanelGag_l_Panel,Panel +m_UltimateSciFiPanelGag_l_Strap,Strap +m_UltimateSciFiPanelGag_l_Mask,Mask +m_UltimateSciFiPanelGag_l_Harness,Harness +m_UltimateSciFiPanelGag_l_TopRim,TopRim +m_UltimateSciFiPanelGag_l_Display,Display +m_UltimateSciFiPanelGag_l_HarnessRim,HarnessRim +m_UltimateSciFiPanelGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPanelGag_l_Muzzle,Muzzle +m_UltimateSciFiPanelGag2_l_Panel,Panel +m_UltimateSciFiPanelGag2_l_Strap,Strap +m_UltimateSciFiPanelGag2_l_Mask,Mask +m_UltimateSciFiPanelGag2_l_Harness,Harness +m_UltimateSciFiPanelGag2_l_TopRim,TopRim +m_UltimateSciFiPanelGag2_l_Display,Display +m_UltimateSciFiPanelGag2_l_HarnessRim,HarnessRim +m_UltimateSciFiPanelGag2_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPanelGag2_l_Muzzle,Muzzle +m_SegmentedPlugGag_l_Panel,Panel +m_SegmentedPlugGag_l_Strap,Strap +m_SegmentedPlugGag_l_Mask,Mask +m_SegmentedPlugGag_l_Plug,Plug +m_SegmentedPlugGagHarness_l_Panel,Panel +m_SegmentedPlugGagHarness_l_Strap,Strap +m_SegmentedPlugGagHarness_l_Mask,Mask +m_SegmentedPlugGagHarness_l_Plug,Plug +m_SegmentedPlugGagHarness_l_Harness,Harness +m_SegmentedPlugGagHarnessSecure_l_Panel,Panel +m_SegmentedPlugGagHarnessSecure_l_Strap,Strap +m_SegmentedPlugGagHarnessSecure_l_Mask,Mask +m_SegmentedPlugGagHarnessSecure_l_Plug,Plug +m_SegmentedPlugGagHarnessSecure_l_Harness,Harness +m_SegmentedPlugGagHarnessSecure_l_SideStrap,SideStrap +m_SciFiPlugGag_l_Panel,Panel +m_SciFiPlugGag_l_Strap,Strap +m_SciFiPlugGag_l_Mask,Mask +m_SciFiPlugGag_l_Plug,Plug +m_SciFiPlugGag_l_Harness,Harness +m_SciFiPlugGag_l_TopRim,TopRim +m_SciFiPlugGag_l_Display,Display +m_AdvancedSciFiPlugGag_l_Panel,Panel +m_AdvancedSciFiPlugGag_l_Strap,Strap +m_AdvancedSciFiPlugGag_l_Mask,Mask +m_AdvancedSciFiPlugGag_l_Plug,Plug +m_AdvancedSciFiPlugGag_l_Harness,Harness +m_AdvancedSciFiPlugGag_l_TopRim,TopRim +m_AdvancedSciFiPlugGag_l_Display,Display +m_AdvancedSciFiPlugGag_l_HarnessRim,HarnessRim +m_AdvancedSciFiPlugGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPlugGag_l_Panel,Panel +m_UltimateSciFiPlugGag_l_Strap,Strap +m_UltimateSciFiPlugGag_l_Mask,Mask +m_UltimateSciFiPlugGag_l_Plug,Plug +m_UltimateSciFiPlugGag_l_Harness,Harness +m_UltimateSciFiPlugGag_l_TopRim,TopRim +m_UltimateSciFiPlugGag_l_Display,Display +m_UltimateSciFiPlugGag_l_HarnessRim,HarnessRim +m_UltimateSciFiPlugGag_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPlugGag_l_Muzzle,Muzzle +m_UltimateSciFiPlugGag2_l_Panel,Panel +m_UltimateSciFiPlugGag2_l_Strap,Strap +m_UltimateSciFiPlugGag2_l_Mask,Mask +m_UltimateSciFiPlugGag2_l_Plug,Plug +m_UltimateSciFiPlugGag2_l_Harness,Harness +m_UltimateSciFiPlugGag2_l_TopRim,TopRim +m_UltimateSciFiPlugGag2_l_Display,Display +m_UltimateSciFiPlugGag2_l_HarnessRim,HarnessRim +m_UltimateSciFiPlugGag2_l_HarnessDisplay,HarnessDisplay +m_UltimateSciFiPlugGag2_l_Muzzle,Muzzle +m_SimpleSciFiMuzzle_l_HarnessRim,HarnessRim +m_SimpleSciFiMuzzle_l_HarnessDisplay,HarnessDisplay +m_SimpleSciFiMuzzle_l_Muzzle,Muzzle +m_AdvancedSciFiMuzzle_l_HarnessRim,HarnessRim +m_AdvancedSciFiMuzzle_l_HarnessDisplay,HarnessDisplay +m_AdvancedSciFiMuzzle_l_Muzzle,Muzzle +m_AdvancedSciFiMuzzle_l_Mask,Mask +m_SciFiPlugMuzzle_l_HarnessRim,HarnessRim +m_SciFiPlugMuzzle_l_HarnessDisplay,HarnessDisplay +m_SciFiPlugMuzzle_l_Muzzle,Muzzle +m_SciFiPlugMuzzle_l_Plug,Plug +m_AdvancedSciFiPlugMuzzle_l_HarnessRim,HarnessRim +m_AdvancedSciFiPlugMuzzle_l_HarnessDisplay,HarnessDisplay +m_AdvancedSciFiPlugMuzzle_l_Muzzle,Muzzle +m_AdvancedSciFiPlugMuzzle_l_Mask,Mask +m_AdvancedSciFiPlugMuzzle_l_Plug,Plug +m_SimpleSciFiMuzzle2_l_HarnessRim,HarnessRim +m_SimpleSciFiMuzzle2_l_HarnessDisplay,HarnessDisplay +m_SimpleSciFiMuzzle2_l_Muzzle,Muzzle +m_AdvancedSciFiMuzzle2_l_HarnessRim,HarnessRim +m_AdvancedSciFiMuzzle2_l_HarnessDisplay,HarnessDisplay +m_AdvancedSciFiMuzzle2_l_Muzzle,Muzzle +m_AdvancedSciFiMuzzle2_l_Mask,Mask +m_FashionGagMetal,FashionGagMetal +m_FashionGagMetal_l_OTN,OTN +m_FashionGagMetalRiveted,FashionGagMetalRiveted +m_FashionGagMetalRiveted_l_OTN,OTN +m_FashionGagMetalRiveted_l_OTNRivets,OTNRivets +m_FashionGagFabric,FashionGagFabric +m_FashionGagFabric_l_FabricMuzzle,FabricMuzzle +m_FashionKittyMuzzle,FashionKittyMuzzle +m_FashionKittyMuzzle_l_FabricMuzzle,FabricMuzzle +m_FashionKittyMuzzle_l_KittyMouth,KittyMouth +m_FashionKittyMuzzle_l_Whiskers,Whiskers +m_FashionSimpleSciFiMuzzle,FashionSimpleSciFiMuzzle +m_FashionSimpleSciFiMuzzle_l_HarnessRim,HarnessRim +m_FashionSimpleSciFiMuzzle_l_HarnessDisplay,HarnessDisplay +m_FashionSimpleSciFiMuzzle_l_Muzzle,Muzzle +m_FashionAdvancedSciFiMuzzle2,FashionAdvancedSciFiMuzzle2 +m_FashionAdvancedSciFiMuzzle2_l_HarnessRim,HarnessRim +m_FashionAdvancedSciFiMuzzle2_l_HarnessDisplay,HarnessDisplay +m_FashionAdvancedSciFiMuzzle2_l_Muzzle,Muzzle +m_FashionAdvancedSciFiMuzzle2_l_Mask,Mask +m_FashionAdvancedSciFiMuzzle,FashionAdvancedSciFiMuzzle +m_FashionAdvancedSciFiMuzzle_l_HarnessRim,HarnessRim +m_FashionAdvancedSciFiMuzzle_l_HarnessDisplay,HarnessDisplay +m_FashionAdvancedSciFiMuzzle_l_Muzzle,Muzzle +m_FashionAdvancedSciFiMuzzle_l_Mask,Mask +m_FashionSimpleSciFiMuzzle2,FashionSimpleSciFiMuzzle2 +m_FashionSimpleSciFiMuzzle2_l_HarnessRim,HarnessRim +m_FashionSimpleSciFiMuzzle2_l_HarnessDisplay,HarnessDisplay +m_FashionSimpleSciFiMuzzle2_l_Muzzle,Muzzle +m_BeltsArms1_l_Arms1,Arms1 +m_BeltsArms1_l_LeftArm1,LeftArm1 +m_BeltsArms1_l_RightArm1,RightArm1 +m_BeltsArms2_l_Arms2,Arms2 +m_BeltsArms2_l_LeftArm2,LeftArm2 +m_BeltsArms2_l_RightArm2,RightArm2 +m_BeltsArmsAll_l_Arms1,Arms1 +m_BeltsArmsAll_l_LeftArm1,LeftArm1 +m_BeltsArmsAll_l_RightArm1,RightArm1 +m_BeltsArmsAll_l_Arms2,Arms2 +m_BeltsArmsAll_l_LeftArm2,LeftArm2 +m_BeltsArmsAll_l_RightArm2,RightArm2 +m_BeltsLegs1_l_Legs1,Legs1 +m_BeltsLegs1_l_RightLegs1,RightLegs1 +m_BeltsLegs2_l_Legs2,Legs2 +m_BeltsLegs2_l_RightLegs2,RightLegs2 +m_BeltsLegsAll_l_Legs1,Legs1 +m_BeltsLegsAll_l_RightLegs1,RightLegs1 +m_BeltsLegsAll_l_Legs2,Legs2 +m_BeltsLegsAll_l_RightLegs2,RightLegs2 +m_BeltsFeet1_l_Feet1,Feet1 +m_BeltsFeet2_l_Feet2,Feet2 +m_BeltsFeetAll_l_Feet1,Feet1 +m_BeltsFeetAll_l_Feet2,Feet2 +m_Belt_l_Belt,Belt +m_ShadowHandsArms1_l_Arms1,Arms1 +m_ShadowHandsArms2_l_Arms2,Arms2 +m_ShadowHandsArms2_l_LeftArm2,LeftArm2 +m_ShadowHandsArmsAll_l_Arms1,Arms1 +m_ShadowHandsArmsAll_l_Arms2,Arms2 +m_ShadowHandsArmsAll_l_LeftArm2,LeftArm2 +m_ShadowHandsLegs1_l_Legs1,Legs1 +m_ShadowHandsLegs1_l_RightLegs1,RightLegs1 +m_ShadowHandsLegs2_l_Legs2,Legs2 +m_ShadowHandsLegs2_l_RightLegs2,RightLegs2 +m_ShadowHandsLegsAll_l_Legs1,Legs1 +m_ShadowHandsLegsAll_l_RightLegs1,RightLegs1 +m_ShadowHandsLegsAll_l_Legs2,Legs2 +m_ShadowHandsLegsAll_l_RightLegs2,RightLegs2 +m_ShadowHandsFeet_l_Feet1,Feet1 +m_ShadowHandsMouth_l_Mouth,Mouth +m_ShadowHandsEyes_l_Eyes,Eyes +m_ShadowHandsCrotch_l_Crotch,Crotch +m_ShadowHandsCrotch_l_CrotchStrap,CrotchStrap +m_Cage_l_CageFront,CageFront +m_Cage_l_CageBack,CageBack +m_Sarcophagus_l_SarcoFront,SarcoFront +m_Sarcophagus_l_SarcoWebs,SarcoWebs +m_Sarcophagus_l_SarcoBack,SarcoBack +m_Bed_l_Bed,Bed +m_LatexCube_l_LatexCube,LatexCube +m_LatexCube_l_LatexCubeBack,LatexCubeBack +m_Barrel_l_Barrel,Barrel +m_DisplayStand_l_DisplayFront,DisplayFront +m_OneBarPrison_l_OneBarFront,OneBarFront +m_OneBarPrison_l_OneBarBack,OneBarBack +m_StardustCollar_l_Collar,Collar +m_Leash_l_Leash,Leash +m_MikoCollar_l_DragonCollar,DragonCollar +m_MikoCollar_l_NeckCorset,NeckCorset +m_MikoCollar_l_NeckCorsetRim,NeckCorsetRim +m_FutureCollar_l_Future,Future +m_FutureCollar_l_FutureBand,FutureBand +m_FutureCollar_l_FutureDisplay,FutureDisplay +m_FutureCollar_l_FutureRim,FutureRim +m_FutureCollar_l_FutureLock,FutureLock +m_FutureCollarRestraint_l_Future,Future +m_FutureCollarRestraint_l_FutureBand,FutureBand +m_FutureCollarRestraint_l_FutureDisplay,FutureDisplay +m_FutureCollarRestraint_l_FutureRim,FutureRim +m_FutureCollarRestraint_l_FutureLock,FutureLock +m_ShockModule_l_Module,Module +m_ShockModule_l_ModuleDisplay,ModuleDisplay +m_TrackingModule_l_TrackingModule,TrackingModule +m_TrackingModule_l_TrackingModuleDisplay,TrackingModuleDisplay +m_Goggles_l_Dollmaker,Dollmaker +m_GogglesRestraint_l_Dollmaker,Dollmaker +m_FullVisor_l_DollmakerFull,DollmakerFull +m_FullVisorRim_l_DollmakerFull,DollmakerFull +m_FullVisorRim_l_DollmakerFullRim,DollmakerFullRim +m_FullVisorRestraint_l_DollmakerFull,DollmakerFull +m_FullVisorRimRestraint_l_DollmakerFull,DollmakerFull +m_FullVisorRimRestraint_l_DollmakerFullRim,DollmakerFullRim +m_GasMask_l_Mask,Mask +m_GasMask_l_Valves,Valves +m_GasMask_l_Center,Center +m_GasMask_l_Nose,Nose +m_GasMask_l_Plugs,Plugs +m_GasMaskRestraint_l_Mask,Mask +m_GasMaskRestraint_l_Valves,Valves +m_GasMaskRestraint_l_Center,Center +m_GasMaskRestraint_l_Nose,Nose +m_GasMaskRestraint_l_Plugs,Plugs +m_Petsuit_l_Arms,Arms +m_Petsuit_l_Legs,Legs +m_Petsuit_l_LeftLegs,LeftLegs + + + +m_Hairband2,Hairband2 +m_Hairband2_l_Hairband,Hairband +l_Hairband2_Hairband,Hairband +m_BraidCustom_l_BraidCustom,BraidCustom +m_BraidCustom_l_BraidCustom_Overstrap,BraidCustom_Overstrap +m_BraidCustomBack_l_BraidCustomBack,BraidCustomBack +m_BraidCustomBack_l_BraidCustomBraid,BraidCustomBraid +m_BraidCustomBackNoBraid_l_BraidCustomBack,BraidCustomBack +m_ShortCurlyBack_l_BackShortCurly,BackShortCurly +m_ShortCurlyBack_l_BackShortCurlyUnderlight,BackShortCurlyUnderlight +m_AuraHair,AuraHair +m_AuraHair_l_HairAura_Front,HairAura_Front +m_AuraHair_l_HairAura,HairAura +m_AuraBang_Left,AuraBang_Left +m_AuraBang_Left_l_HairAura_Left,HairAura_Left +m_AuraBang_Left_l_HairAura_LeftB,HairAura_LeftB +m_AuraBang_Right,AuraBang_Right +m_AuraBang_Right_l_HairAura_Right,HairAura_Right +m_AuraBang_Right_l_HairAura_RightB,HairAura_RightB +m_AuraBang_Left_Back,AuraBang_Left_Back +m_AuraBang_Left_Back_l_HairAura_Left,HairAura_Left +m_AuraBang_Left_Back_l_HairAura_LeftB,HairAura_LeftB +m_AuraBang_Right_Back,AuraBang_Right_Back +m_AuraBang_Right_Back_l_HairAura_Right,HairAura_Right +m_AuraBang_Right_Back_l_HairAura_RightB,HairAura_RightB +m_Hair2,Hair2 +m_Hair2_l_Hair2_Front,Hair2_Front +m_Hair2_l_Hair2_FrontB,Hair2_FrontB +m_Hair2_l_Hair2_FrontC,Hair2_FrontC +m_Hair2_LeftPuff,Hair2_LeftPuff +m_Hair2_LeftPuff_l_Hair2_Left,Hair2_Left +m_Hair2_RightPuff,Hair2_RightPuff +m_Hair2_RightPuff_l_Hair2_Right,Hair2_Right +m_Hair3,Hair3 +m_Hair3_l_Hair3_FrontA,Hair3_FrontA +m_Hair3_l_Hair3_FrontC,Hair3_FrontC +m_Hair3_l_Hair3_FrontD,Hair3_FrontD +m_Hair3_Short,Hair3_Short +m_Hair3_Short_l_Hair3_FrontA,Hair3_FrontA +m_Hair3_Short_l_Hair3_FrontC,Hair3_FrontC +m_Hair3_Short_l_Hair3_FrontD,Hair3_FrontD +m_Hair3_Bangs,Hair3_Bangs +m_Hair3_Bangs_l_Hair3_FrontE,Hair3_FrontE +m_Hair3Back,Hair3Back +m_Hair3Back_l_Hair3_Back,Hair3_Back +m_Hair4,Hair4 +m_Hair4_l_Hair4_Front,Hair4_Front +m_Hair4_l_Hair4_FrontB,Hair4_FrontB +m_Hair4_TailLeft,Hair4_TailLeft +m_Hair4_TailLeft_l_Hair4_Left,Hair4_Left +m_Hair4_TailLeft_l_Hair4_LeftB,Hair4_LeftB +m_Hair4_TailRight,Hair4_TailRight +m_Hair4_TailRight_l_Hair4_Right,Hair4_Right +m_Hair4_TailRight_l_Hair4_RightB,Hair4_RightB +m_Hair5,Hair5 +m_Hair5_l_Hair5_Front,Hair5_Front +m_Hair5_l_Hair5_FrontB,Hair5_FrontB +m_Hair5_l_Hair5_FrontC,Hair5_FrontC +m_Hair5_Highlight,Hair5_Highlight +m_Hair5_Highlight_l_Hair5_FrontD,Hair5_FrontD +m_Hair5_TailLeft,Hair5_TailLeft +m_Hair5_TailLeft_l_Hair5_Left,Hair5_Left +m_Hair5_TailRight,Hair5_TailRight +m_Hair5_TailRight_l_Hair5_Right,Hair5_Right +m_Hair6,Hair6 +m_Hair6_l_Hair6_Front,Hair6_Front +m_Hair6_l_Hair6_FrontB,Hair6_FrontB +m_Hair6_TailLeft,Hair6_TailLeft +m_Hair6_TailLeft_l_Hair6_Left,Hair6_Left +m_Hair6_TailRight,Hair6_TailRight +m_Hair6_TailRight_l_Hair6_Right,Hair6_Right +m_Body_l_Butt2,Butt2 +m_Body_l_Nipples,Nipples +m_DaskBrows_l_Brows,Brows +m_DaskBrows_l_Brows2,Brows2 +m_BunnyEars_l_EarsFront,EarsFront +m_CatsuitLowerLeotard,CatsuitLowerLeotard +m_CatsuitLowerLeotard_l_TorsoLowerLeotard,TorsoLowerLeotard +m_TransparentCatsuitLowerLeotard,TransparentCatsuitLowerLeotard +m_TransparentCatsuitLowerLeotard_l_TorsoLowerLeotard,TorsoLowerLeotard +m_ChainBikini,ChainBikini +m_ChainBikini_l_ShirtChest,ShirtChest +m_ChainSkirt2,ChainSkirt2 +m_ChainSkirt2_l_SkirtBelt,SkirtBelt +m_ChainSkirt2_l_SkirtBeltDeco,SkirtBeltDeco +m_ChainSkirt2_l_SkirtBeltRivets,SkirtBeltRivets +m_ChainSkirt2_l_Skirt2,Skirt2 +m_ChainSkirt_l_SkirtBelt,SkirtBelt +m_ChainSkirt_l_SkirtBeltDeco,SkirtBeltDeco +m_ChainSkirt_l_SkirtBeltRivets,SkirtBeltRivets +m_ChainSkirt_l_Skirt2,Skirt2 +m_ChainArmor_l_SkirtBelt,SkirtBelt +m_ChainArmor_l_SkirtBeltDeco,SkirtBeltDeco +m_ChainArmor_l_SkirtBeltRivets,SkirtBeltRivets +m_ChainArmor_l_Skirt2,Skirt2 +m_Bandit_l_ShoeLeft,ShoeLeft +m_Bandit_l_ShoeRight,ShoeRight +m_Bandit_l_ShoeRightKneel,ShoeRightKneel +m_Bandit_l_ShoeLeftHogtie,ShoeLeftHogtie +m_FashionKiguMask,FashionKiguMask +m_FashionKiguMask_l_Mask,Mask +m_FashionKiguMask_l_Eyes,Eyes +m_FashionKiguMask_l_Eyes2,Eyes2 +m_FashionKiguMask_l_Lock,Lock +m_FashionKiguMask_l_EyesWhites,EyesWhites +m_FashionKiguMask_l_Mouth,Mouth +m_SwimsuitUnder,SwimsuitUnder +m_SwimsuitUnder_l_Swimsuit,Swimsuit +m_SwimsuitUnder_l_SwimsuitChest,SwimsuitChest +m_BunnyLeotardUnder,BunnyLeotardUnder +m_BunnyLeotardUnder_l_Leotard,Leotard +m_BunnyLeotardUnder_l_LeotardChest,LeotardChest +m_BunnyLeotardHighUnder,BunnyLeotardHighUnder +m_BunnyLeotardHighUnder_l_HighLeotard,HighLeotard +m_BunnyLeotardHighUnder_l_LeotardChest,LeotardChest +m_LeatherLeotardTop,LeatherLeotardTop +m_LeatherLeotardTop_l_LeotardChest,LeotardChest +m_LeatherLeotardBottom,LeatherLeotardBottom +m_LeatherLeotardBottom_l_Leotard,Leotard +m_LeatherLeotardCorset,LeatherLeotardCorset +m_LeatherLeotardCorset_l_LeotardCorset,LeotardCorset +m_LeatherLeotardCorset_l_Laces,Laces +m_LeatherLeotard,LeatherLeotard +m_LeatherLeotard_l_LeotardChest,LeotardChest +m_LeatherLeotard_l_Leotard,Leotard +m_LeatherLeotard_l_LeotardCorset,LeotardCorset +m_LeatherLeotard_l_Laces,Laces +m_LeatherLeotardStrapsUpper,LeatherLeotardStrapsUpper +m_LeatherLeotardStrapsUpper_l_StrapsChest,StrapsChest +m_LeatherLeotardStrapsLower,LeatherLeotardStrapsLower +m_LeatherLeotardStrapsLower_l_StrapsLower,StrapsLower +m_LeatherLeotardStrapsLower_l_StrapsHardware,StrapsHardware +m_LeatherLeotardStrapsLowerClean,LeatherLeotardStrapsLowerClean +m_LeatherLeotardStrapsLowerClean_l_StrapsLowerClean,StrapsLowerClean +m_LeatherLeotardStrapsLowerClean_l_StrapsHardware,StrapsHardware +m_OperaGloveLeft,OperaGloveLeft +m_OperaGloveLeft_l_GloveLeft,GloveLeft +m_OperaGloveLeft_l_ForeGloveLeft,ForeGloveLeft +m_OperaGloveRight,OperaGloveRight +m_OperaGloveRight_l_GloveRight,GloveRight +m_OperaGloveRight_l_ForeGloveRight,ForeGloveRight +m_OperaGloves,OperaGloves +m_OperaGloves_l_GloveLeft,GloveLeft +m_OperaGloves_l_ForeGloveLeft,ForeGloveLeft +m_OperaGloves_l_GloveRight,GloveRight +m_OperaGloves_l_ForeGloveRight,ForeGloveRight +m_OperaGlovesRestraint,OperaGlovesRestraint +m_OperaGlovesRestraint_l_GloveLeft,GloveLeft +m_OperaGlovesRestraint_l_ForeGloveLeft,ForeGloveLeft +m_OperaGlovesRestraint_l_GloveRight,GloveRight +m_OperaGlovesRestraint_l_ForeGloveRight,ForeGloveRight +m_SailorCollar,SailorCollar +m_SailorCollar_l_Collar,Collar +m_SailorCollar_l_CollarStripe,CollarStripe +m_SailorCollarFull,SailorCollarFull +m_SailorCollarFull_l_Collar,Collar +m_SailorCollarFull_l_CollarStripe,CollarStripe +m_SailorCollarFull_l_Bust,Bust +m_SailorCollarFull_l_BustStripe,BustStripe +m_SailorBow,SailorBow +m_SailorBow_l_Ribbon,Ribbon +m_SailorTop,SailorTop +m_SailorTop_l_Shirt,Shirt +m_SailorTop_l_ShirtChest,ShirtChest +m_SailorSleeveLeft,SailorSleeveLeft +m_SailorSleeveLeft_l_SleeveLeft,SleeveLeft +m_SailorSleeveLeft_l_HemLeft,HemLeft +m_SailorSleeveRight,SailorSleeveRight +m_SailorSleeveRight_l_SleeveRight,SleeveRight +m_SailorSleeveRight_l_HemRight,HemRight +m_SailorSleeves,SailorSleeves +m_SailorSleeves_l_SleeveLeft,SleeveLeft +m_SailorSleeves_l_HemLeft,HemLeft +m_SailorSleeves_l_SleeveRight,SleeveRight +m_SailorSleeves_l_HemRight,HemRight +m_SailorShirt,SailorShirt +m_SailorShirt_l_SleeveLeft,SleeveLeft +m_SailorShirt_l_HemLeft,HemLeft +m_SailorShirt_l_SleeveRight,SleeveRight +m_SailorShirt_l_HemRight,HemRight +m_SailorShirt_l_Shirt,Shirt +m_SailorShirt_l_ShirtChest,ShirtChest +m_Sailor,Sailor +m_Sailor_l_SleeveLeft,SleeveLeft +m_Sailor_l_HemLeft,HemLeft +m_Sailor_l_SleeveRight,SleeveRight +m_Sailor_l_HemRight,HemRight +m_Sailor_l_Shirt,Shirt +m_Sailor_l_ShirtChest,ShirtChest +m_Sailor_l_Collar,Collar +m_Sailor_l_CollarStripe,CollarStripe +m_Sailor_l_Bust,Bust +m_Sailor_l_BustStripe,BustStripe +m_Sailor_l_Ribbon,Ribbon +m_DressSkirtSplitNoBelt,DressSkirtSplitNoBelt +m_DressSkirtSplitNoBelt_l_Skirt,Skirt +m_DressSkirtSplitNoBelt_l_SkirtSplit,SkirtSplit +m_DressSkirtSplitNoBelt_l_SkirtSplitOver,SkirtSplitOver +m_DressSkirtSplit,DressSkirtSplit +m_DressSkirtSplit_l_Skirt,Skirt +m_DressSkirtSplit_l_SkirtSplit,SkirtSplit +m_DressSkirtSplit_l_SkirtSplitOver,SkirtSplitOver +m_DressSkirtSplit_l_SkirtSplitBelt,SkirtSplitBelt +m_BlouseSkirt,BlouseSkirt +m_BlouseSkirt_l_BlouseSkirtLone,BlouseSkirtLone +m_BlouseSkirt_l_BlouseSkirtOverKneel,BlouseSkirtOverKneel +m_Sunglasses,Sunglasses +m_Sunglasses_l_Glasses,Glasses +m_Sunglasses_l_GlassesLens,GlassesLens +m_MageSkirt,MageSkirt +m_MageSkirt_l_MageSkirt,MageSkirt +m_MageSkirt_l_Band,Band +m_MageSkirt_l_MageSkirtOver,MageSkirtOver +m_MageCorset,MageCorset +m_MageCorset_l_MageCorset,MageCorset +m_MageCorset_l_MageCorsetStripes,MageCorsetStripes +m_MageBra,MageBra +m_MageBra_l_MageBra,MageBra +m_MageBra_l_MageBraStripes,MageBraStripes +m_MageTop,MageTop +m_MageTop_l_MageBra,MageBra +m_MageTop_l_MageBraStripes,MageBraStripes +m_MageTop_l_MageCorset,MageCorset +m_MageTop_l_MageCorsetStripes,MageCorsetStripes +m_MageCollar,MageCollar +m_MageCollar_l_MageCollar,MageCollar +m_MageCollar_l_MageCollarCrystal,MageCollarCrystal +m_MageCollar_l_MageCollarHardware,MageCollarHardware +m_MageCollar2,MageCollar2 +m_MageCollar2_l_MageCollar,MageCollar +m_MageCollar2_l_MageCollarCrystal,MageCollarCrystal +m_MageCollar2_l_MageCollarHardware,MageCollarHardware +m_MageCollar2_l_MageCollarTie,MageCollarTie +m_Mage,Mage +m_Mage_l_MageBra,MageBra +m_Mage_l_MageBraStripes,MageBraStripes +m_Mage_l_MageCorset,MageCorset +m_Mage_l_MageCorsetStripes,MageCorsetStripes +m_Mage_l_MageSkirt,MageSkirt +m_Mage_l_Band,Band +m_Mage_l_MageSkirtOver,MageSkirtOver +m_Mage_l_MageCollar,MageCollar +m_Mage_l_MageCollarCrystal,MageCollarCrystal +m_Mage_l_MageCollarHardware,MageCollarHardware +m_Mage_l_MageCollarTie,MageCollarTie +m_ChineseDress,ChineseDress +m_ChineseDress_l_Dress,Dress +m_ChineseDress_l_Bra,Bra +m_ChineseDress_l_Highlights,Highlights +m_ChineseDress_l_DressSkirt,DressSkirt +m_ChineseDress_l_DressSkirtOverKneel,DressSkirtOverKneel +m_ChineseBra,ChineseBra +m_ChineseBra_l_Bra,Bra +m_ChineseBra_l_Highlights,Highlights +m_ChineseTop,ChineseTop +m_ChineseTop_l_Bra,Bra +m_ChineseTop_l_Highlights,Highlights +m_BindingDress_l_SkirtSplit,SkirtSplit +m_BindingDress_l_SkirtSplitOver,SkirtSplitOver +m_BindingDress_l_SkirtSplitBelt,SkirtSplitBelt +m_BindingDress_l_MageBra,MageBra +m_BindingDress_l_MageBraStripes,MageBraStripes +m_BindingDress_l_MageCorset,MageCorset +m_BindingDress_l_MageCorsetStripes,MageCorsetStripes +m_BindingDress_l_MageCollar,MageCollar +m_BindingDress_l_MageCollarCrystal,MageCollarCrystal +m_BindingDress_l_MageCollarHardware,MageCollarHardware +m_BindingDress_l_MageCollarTie,MageCollarTie +m_YukataWaist,YukataWaist +m_YukataWaist_l_Waist,Waist +m_YukataWaist_l_WaistBand,WaistBand +m_YukataWaistPattern,YukataWaistPattern +m_YukataWaistPattern_l_WaistPattern,WaistPattern +m_YukataWaistPattern_l_WaistBand,WaistBand +m_YukataTop,YukataTop +m_YukataTop_l_Shirt,Shirt +m_YukataTop_l_ShirtChest,ShirtChest +m_YukataSleeveLeft,YukataSleeveLeft +m_YukataSleeveLeft_l_SleeveLeft,SleeveLeft +m_YukataSleeveRight,YukataSleeveRight +m_YukataSleeveRight_l_SleeveRight,SleeveRight +m_YukataSleeves,YukataSleeves +m_YukataSleeves_l_SleeveLeft,SleeveLeft +m_YukataSleeves_l_SleeveRight,SleeveRight +m_YukataShirt,YukataShirt +m_YukataShirt_l_Shirt,Shirt +m_YukataShirt_l_ShirtChest,ShirtChest +m_YukataShirt_l_SleeveLeft,SleeveLeft +m_YukataShirt_l_SleeveRight,SleeveRight +m_YukataSkirt,YukataSkirt +m_YukataSkirt_l_Skirt,Skirt +m_YukataSkirt_l_SkirtOver,SkirtOver +m_Yukata,Yukata +m_Yukata_l_Waist,Waist +m_Yukata_l_WaistBand,WaistBand +m_Yukata_l_Shirt,Shirt +m_Yukata_l_ShirtChest,ShirtChest +m_Yukata_l_SleeveLeft,SleeveLeft +m_Yukata_l_SleeveRight,SleeveRight +m_Yukata_l_Skirt,Skirt +m_Yukata_l_SkirtOver,SkirtOver +m_YukataPattern,YukataPattern +m_YukataPattern_l_WaistPattern,WaistPattern +m_YukataPattern_l_WaistBand,WaistBand +m_LongMittenLeft_l_LongMittenLeft,LongMittenLeft +m_LongMittenLeft_l_ForeLongMittenLeft,ForeLongMittenLeft +m_LongMittenRight_l_LongMittenRight,LongMittenRight +m_LongMittenRight_l_ForeLongMittenRight,ForeLongMittenRight +m_LongMittens_l_LongMittenLeft,LongMittenLeft +m_LongMittens_l_ForeLongMittenLeft,ForeLongMittenLeft +m_LongMittens_l_LongMittenRight,LongMittenRight +m_LongMittens_l_ForeLongMittenRight,ForeLongMittenRight +m_FashionLeatherMittens,FashionLeatherMittens +m_FashionLeatherMittens_l_LeatherLeft,LeatherLeft +m_FashionLeatherMittens_l_BandLeft,BandLeft +m_FashionLeatherMittens_l_LockLeft,LockLeft +m_FashionLeatherMittens_l_LeatherRight,LeatherRight +m_FashionLeatherMittens_l_BandRight,BandRight +m_FashionLeatherMittens_l_LockRight,LockRight +m_FashionLeatherPawMittens,FashionLeatherPawMittens +m_FashionLeatherPawMittens_l_LeatherLeft,LeatherLeft +m_FashionLeatherPawMittens_l_BandLeft,BandLeft +m_FashionLeatherPawMittens_l_LockLeft,LockLeft +m_FashionLeatherPawMittens_l_PawLeft,PawLeft +m_FashionLeatherPawMittens_l_LeatherRight,LeatherRight +m_FashionLeatherPawMittens_l_BandRight,BandRight +m_FashionLeatherPawMittens_l_LockRight,LockRight +m_FashionLeatherPawMittens_l_PawRight,PawRight +m_FashionLatexMittens,FashionLatexMittens +m_FashionLatexMittens_l_LatexLeft,LatexLeft +m_FashionLatexMittens_l_ZipperLeft,ZipperLeft +m_FashionLatexMittens_l_LatexRight,LatexRight +m_FashionLatexMittens_l_ZipperRight,ZipperRight +m_FashionLongMittens,FashionLongMittens +m_FashionLongMittens_l_LongMittenLeft,LongMittenLeft +m_FashionLongMittens_l_ForeLongMittenLeft,ForeLongMittenLeft +m_FashionLongMittens_l_BandLeft,BandLeft +m_FashionLongMittens_l_LockLeft,LockLeft +m_FashionLongMittens_l_LongMittenRight,LongMittenRight +m_FashionLongMittens_l_ForeLongMittenRight,ForeLongMittenRight +m_FashionLongMittens_l_BandRight,BandRight +m_FashionLongMittens_l_LockRight,LockRight +m_ElfCollarRestraint_l_CollarHardware,CollarHardware +m_HeavyYoke,HeavyYoke +m_HeavyYoke_l_HeavySteel,HeavySteel +m_HeavyYoke_l_HeavySteelPins,HeavySteelPins +m_HeavyYoke_l_HeavySteelLock,HeavySteelLock +m_HeavyYoke_l_HeavySteelHardware,HeavySteelHardware +m_HeavyFiddle,HeavyFiddle +m_HeavyFiddle_l_FiddleLines,FiddleLines +m_HeavyFiddle_l_FiddleBody,FiddleBody +m_HeavyFiddle_l_FiddleLock,FiddleLock +m_HeavyFiddle_l_BackFiddleLines,BackFiddleLines +m_HeavyFiddle_l_BackFiddleBody,BackFiddleBody +m_RopeSuspension,RopeSuspension +m_RopeSuspension_l_Suspension,Suspension +m_RopeSuspension_l_Belt,Belt +m_FashionRopeHarness,FashionRopeHarness +m_FashionRopeHarness_l_Harness,Harness +m_FashionRopeHarness_l_HarnessLower,HarnessLower +m_FashionRopeHarness_l_HarnessLowerStrap,HarnessLowerStrap +m_FashionRopeCrotch,FashionRopeCrotch +m_FashionRopeCrotch_l_Crotchrope,Crotchrope +m_FashionRopeCrotch_l_CrotchropeStrap,CrotchropeStrap +m_FashionRopeChestStraps2,FashionRopeChestStraps2 +m_FashionRopeChestStraps2_l_ArmHarness,ArmHarness +m_FashionRopeChestStraps2_l_ArmStrapHarness,ArmStrapHarness +m_FashionRopeChestStraps2_l_ArmHarnessUp,ArmHarnessUp +m_FashionRibbonHarness,FashionRibbonHarness +m_FashionRibbonHarness_l_Harness,Harness +m_FashionRibbonHarness_l_HarnessMid,HarnessMid +m_FashionRibbonHarness_l_HarnessLower,HarnessLower +m_FashionRibbonHarness_l_HarnessLowerStrap,HarnessLowerStrap +m_FashionRibbonCrotch,FashionRibbonCrotch +m_FashionRibbonCrotch_l_Crotch,Crotch +m_FashionRibbonCrotch_l_CrotchStrap,CrotchStrap +m_IronCollarClip,IronCollarClip +m_IronCollarClip_l_Collar,Collar +m_IronCollarClip_l_CollarHardware,CollarHardware +m_FashionIronCollarClip,FashionIronCollarClip +m_FashionIronCollarClip_l_Collar,Collar +m_FashionIronCollarClip_l_CollarHardware,CollarHardware +m_QuakeCollar,QuakeCollar +m_QuakeCollar_l_Collar,Collar +m_QuakeCollar_l_CollarTag,CollarTag +m_QuakeCollarRestraint,QuakeCollarRestraint +m_QuakeCollarRestraint_l_Collar,Collar +m_QuakeCollarRestraint_l_CollarTag,CollarTag +m_BuckleCorset,BuckleCorset +m_BuckleCorset_l_BuckleCorset,BuckleCorset +m_BuckleCorset_l_BuckleCorsetBuckles,BuckleCorsetBuckles +m_BuckleCorset_l_BuckleCorsetHardware,BuckleCorsetHardware +m_BuckleCorsetRestraint,BuckleCorsetRestraint +m_BuckleCorsetRestraint_l_BuckleCorset,BuckleCorset +m_BuckleCorsetRestraint_l_BuckleCorsetBuckles,BuckleCorsetBuckles +m_BuckleCorsetRestraint_l_BuckleCorsetHardware,BuckleCorsetHardware +m_StripedSkirt,StripedSkirt +m_StripedSkirt_l_StripedSkirt,StripedSkirt +m_StripedSkirt_l_StripedSkirtUnder,StripedSkirtUnder +m_StripedSkirt_l_StripedSkirtOver,StripedSkirtOver +m_StripedSkirt_l_StripedSkirtUnderOver,StripedSkirtUnderOver +m_ApronSkirt,ApronSkirt +m_ApronSkirt_l_MaidSkirt,MaidSkirt +m_ApronSkirt_l_ApronSkirt,ApronSkirt +m_ApronSkirt_l_MaidSkirtOver,MaidSkirtOver +m_ApronSkirt_l_ApronSkirtOver,ApronSkirtOver +m_WolfSockLeft_l_LegRimLeft,LegRimLeft +m_WolfSockLeft_l_LegBandLeft,LegBandLeft +m_WolfSockLeft_l_LegPadsLeft,LegPadsLeft +m_WolfSockRight_l_LegRimRight,LegRimRight +m_WolfSockRight_l_LegBandRight,LegBandRight +m_WolfSockRight_l_LegPadsRight,LegPadsRight +m_WolfSocks_l_LegRimRight,LegRimRight +m_WolfSocks_l_LegBandRight,LegBandRight +m_WolfSocks_l_LegPadsRight,LegPadsRight +m_WolfSocks_l_LegRimLeft,LegRimLeft +m_WolfSocks_l_LegBandLeft,LegBandLeft +m_WolfSocks_l_LegPadsLeft,LegPadsLeft +m_WolfSocksRestraint_l_LegRimRight,LegRimRight +m_WolfSocksRestraint_l_LegBandRight,LegBandRight +m_WolfSocksRestraint_l_LegPadsRight,LegPadsRight +m_WolfSocksRestraint_l_LegRimLeft,LegRimLeft +m_WolfSocksRestraint_l_LegBandLeft,LegBandLeft +m_WolfSocksRestraint_l_LegPadsLeft,LegPadsLeft +m_WolfTorsoLower_l_TorsoLowerRim,TorsoLowerRim +m_WolfTorsoLower_l_TorsoLowerBand,TorsoLowerBand +m_WolfTorsoUpper_l_TorsoUpperCups,TorsoUpperCups +m_WolfTorsoUpper_l_ChestRim,ChestRim +m_WolfTorsoUpper_l_ChestBand,ChestBand +m_WolfTorsoUpper_l_TorsoUpperBand,TorsoUpperBand +m_WolfTorsoUpper_l_TorsoUpperRim,TorsoUpperRim +m_Wolf_l_LegRimRight,LegRimRight +m_Wolf_l_LegBandRight,LegBandRight +m_Wolf_l_LegPadsRight,LegPadsRight +m_Wolf_l_LegRimLeft,LegRimLeft +m_Wolf_l_LegBandLeft,LegBandLeft +m_Wolf_l_LegPadsLeft,LegPadsLeft +m_Wolf_l_TorsoUpperCups,TorsoUpperCups +m_Wolf_l_ChestRim,ChestRim +m_Wolf_l_ChestBand,ChestBand +m_Wolf_l_TorsoUpperBand,TorsoUpperBand +m_Wolf_l_TorsoUpperRim,TorsoUpperRim +m_Wolf_l_TorsoLowerRim,TorsoLowerRim +m_Wolf_l_TorsoLowerBand,TorsoLowerBand +m_DivineCuffsWristLeft,DivineCuffsWristLeft +m_DivineCuffsWristLeft_l_WristLeft,WristLeft +m_DivineCuffsWristLeft_l_WristLeftDeco,WristLeftDeco +m_DivineCuffsWristLeft_l_WristLeftLock,WristLeftLock +m_DivineCuffsWristLeft_l_WristLeftLockPlate,WristLeftLockPlate +m_DivineCuffsWristLeft_l_WristLeftLockBand,WristLeftLockBand +m_DivineCuffsWristRight,DivineCuffsWristRight +m_DivineCuffsWristRight_l_WristRight,WristRight +m_DivineCuffsWristRight_l_WristRightDeco,WristRightDeco +m_DivineCuffsWristRight_l_WristRightLock,WristRightLock +m_DivineCuffsWristRight_l_WristRightLockPlate,WristRightLockPlate +m_DivineCuffsWristRight_l_WristRightLockBand,WristRightLockBand +m_DivineCuffsWrists,DivineCuffsWrists +m_DivineCuffsWrists_l_WristLeft,WristLeft +m_DivineCuffsWrists_l_WristLeftDeco,WristLeftDeco +m_DivineCuffsWrists_l_WristLeftLock,WristLeftLock +m_DivineCuffsWrists_l_WristLeftLockPlate,WristLeftLockPlate +m_DivineCuffsWrists_l_WristLeftLockBand,WristLeftLockBand +m_DivineCuffsWrists_l_WristRight,WristRight +m_DivineCuffsWrists_l_WristRightDeco,WristRightDeco +m_DivineCuffsWrists_l_WristRightLock,WristRightLock +m_DivineCuffsWrists_l_WristRightLockPlate,WristRightLockPlate +m_DivineCuffsWrists_l_WristRightLockBand,WristRightLockBand +m_DivineCuffsElbowLeft,DivineCuffsElbowLeft +m_DivineCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_DivineCuffsElbowLeft_l_ElbowLeftDeco,ElbowLeftDeco +m_DivineCuffsElbowLeft_l_ElbowLeftLock,ElbowLeftLock +m_DivineCuffsElbowLeft_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_DivineCuffsElbowLeft_l_ElbowLeftLockBand,ElbowLeftLockBand +m_DivineCuffsElbowRight,DivineCuffsElbowRight +m_DivineCuffsElbowRight_l_ElbowRight,ElbowRight +m_DivineCuffsElbowRight_l_ElbowRightDeco,ElbowRightDeco +m_DivineCuffsElbowRight_l_ElbowRightLock,ElbowRightLock +m_DivineCuffsElbowRight_l_ElbowRightLockPlate,ElbowRightLockPlate +m_DivineCuffsElbowRight_l_ElbowRightLockBand,ElbowRightLockBand +m_DivineCuffsElbows,DivineCuffsElbows +m_DivineCuffsElbows_l_ElbowLeft,ElbowLeft +m_DivineCuffsElbows_l_ElbowLeftDeco,ElbowLeftDeco +m_DivineCuffsElbows_l_ElbowLeftLock,ElbowLeftLock +m_DivineCuffsElbows_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_DivineCuffsElbows_l_ElbowLeftLockBand,ElbowLeftLockBand +m_DivineCuffsElbows_l_ElbowRight,ElbowRight +m_DivineCuffsElbows_l_ElbowRightDeco,ElbowRightDeco +m_DivineCuffsElbows_l_ElbowRightLock,ElbowRightLock +m_DivineCuffsElbows_l_ElbowRightLockPlate,ElbowRightLockPlate +m_DivineCuffsElbows_l_ElbowRightLockBand,ElbowRightLockBand +m_DivineCuffsArms,DivineCuffsArms +m_DivineCuffsArms_l_WristLeft,WristLeft +m_DivineCuffsArms_l_WristLeftDeco,WristLeftDeco +m_DivineCuffsArms_l_WristLeftLock,WristLeftLock +m_DivineCuffsArms_l_WristLeftLockPlate,WristLeftLockPlate +m_DivineCuffsArms_l_WristLeftLockBand,WristLeftLockBand +m_DivineCuffsArms_l_WristRight,WristRight +m_DivineCuffsArms_l_WristRightDeco,WristRightDeco +m_DivineCuffsArms_l_WristRightLock,WristRightLock +m_DivineCuffsArms_l_WristRightLockPlate,WristRightLockPlate +m_DivineCuffsArms_l_WristRightLockBand,WristRightLockBand +m_DivineCuffsArms_l_ElbowLeft,ElbowLeft +m_DivineCuffsArms_l_ElbowLeftDeco,ElbowLeftDeco +m_DivineCuffsArms_l_ElbowLeftLock,ElbowLeftLock +m_DivineCuffsArms_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_DivineCuffsArms_l_ElbowLeftLockBand,ElbowLeftLockBand +m_DivineCuffsArms_l_ElbowRight,ElbowRight +m_DivineCuffsArms_l_ElbowRightDeco,ElbowRightDeco +m_DivineCuffsArms_l_ElbowRightLock,ElbowRightLock +m_DivineCuffsArms_l_ElbowRightLockPlate,ElbowRightLockPlate +m_DivineCuffsArms_l_ElbowRightLockBand,ElbowRightLockBand +m_DivineCuffsAnklesLeft,DivineCuffsAnklesLeft +m_DivineCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_DivineCuffsAnklesLeft_l_AnkleLeftDeco,AnkleLeftDeco +m_DivineCuffsAnklesLeft_l_AnkleLeftLock,AnkleLeftLock +m_DivineCuffsAnklesLeft_l_AnkleLeftLockPlate,AnkleLeftLockPlate +m_DivineCuffsAnklesLeft_l_AnkleLeftLockBand,AnkleLeftLockBand +m_DivineCuffsAnklesRight,DivineCuffsAnklesRight +m_DivineCuffsAnklesRight_l_AnkleRight,AnkleRight +m_DivineCuffsAnklesRight_l_AnkleRightDeco,AnkleRightDeco +m_DivineCuffsAnklesRight_l_AnkleRightLock,AnkleRightLock +m_DivineCuffsAnklesRight_l_AnkleRightLockPlate,AnkleRightLockPlate +m_DivineCuffsAnklesRight_l_AnkleRightLockBand,AnkleRightLockBand +m_DivineCuffsAnkles,DivineCuffsAnkles +m_DivineCuffsAnkles_l_AnkleRight,AnkleRight +m_DivineCuffsAnkles_l_AnkleRightDeco,AnkleRightDeco +m_DivineCuffsAnkles_l_AnkleRightLock,AnkleRightLock +m_DivineCuffsAnkles_l_AnkleRightLockPlate,AnkleRightLockPlate +m_DivineCuffsAnkles_l_AnkleRightLockBand,AnkleRightLockBand +m_DivineCuffsAnkles_l_AnkleLeft,AnkleLeft +m_DivineCuffsAnkles_l_AnkleLeftDeco,AnkleLeftDeco +m_DivineCuffsAnkles_l_AnkleLeftLock,AnkleLeftLock +m_DivineCuffsAnkles_l_AnkleLeftLockPlate,AnkleLeftLockPlate +m_DivineCuffsAnkles_l_AnkleLeftLockBand,AnkleLeftLockBand +m_DivineCuffsThighLeft,DivineCuffsThighLeft +m_DivineCuffsThighLeft_l_ThighLeft,ThighLeft +m_DivineCuffsThighLeft_l_ThighLeftDeco,ThighLeftDeco +m_DivineCuffsThighLeft_l_ThighLeftLock,ThighLeftLock +m_DivineCuffsThighLeft_l_ThighLeftLockPlate,ThighLeftLockPlate +m_DivineCuffsThighLeft_l_ThighLeftLockBand,ThighLeftLockBand +m_DivineCuffsThighRight,DivineCuffsThighRight +m_DivineCuffsThighRight_l_ThighRight,ThighRight +m_DivineCuffsThighRight_l_ThighRightDeco,ThighRightDeco +m_DivineCuffsThighRight_l_ThighRightLock,ThighRightLock +m_DivineCuffsThighRight_l_ThighRightLockPlate,ThighRightLockPlate +m_DivineCuffsThighRight_l_ThighRightLockBand,ThighRightLockBand +m_DivineCuffsThigh,DivineCuffsThigh +m_DivineCuffsThigh_l_ThighRight,ThighRight +m_DivineCuffsThigh_l_ThighRightDeco,ThighRightDeco +m_DivineCuffsThigh_l_ThighRightLock,ThighRightLock +m_DivineCuffsThigh_l_ThighRightLockPlate,ThighRightLockPlate +m_DivineCuffsThigh_l_ThighRightLockBand,ThighRightLockBand +m_DivineCuffsThigh_l_ThighLeft,ThighLeft +m_DivineCuffsThigh_l_ThighLeftDeco,ThighLeftDeco +m_DivineCuffsThigh_l_ThighLeftLock,ThighLeftLock +m_DivineCuffsThigh_l_ThighLeftLockPlate,ThighLeftLockPlate +m_DivineCuffsThigh_l_ThighLeftLockBand,ThighLeftLockBand +m_DivineCollar,DivineCollar +m_DivineCollar_l_Collar,Collar +m_DivineCollar_l_CollarDeco,CollarDeco +m_DivineCollar_l_CollarLock,CollarLock +m_DivineCollar_l_CollarLockPlate,CollarLockPlate +m_DivineCollar_l_CollarLockBand,CollarLockBand +m_DivineBelt,DivineBelt +m_DivineBelt_l_BeltLines,BeltLines +m_DivineBelt_l_BeltMetal2,BeltMetal2 +m_DivineBelt_l_BeltMetal1,BeltMetal1 +m_DivineBelt_l_BeltBase,BeltBase +m_DivineBelt_l_BeltPin,BeltPin +m_DivineBelt_l_LockBeltLines,LockBeltLines +m_DivineBelt_l_LockBeltPlate,LockBeltPlate +m_DivineBelt_l_LockBeltShackle,LockBeltShackle +m_DivineBelt_l_LockBeltHighlight,LockBeltHighlight +m_FashionDivineCollar,FashionDivineCollar +m_FashionDivineCollar_l_Collar,Collar +m_FashionDivineCollar_l_CollarDeco,CollarDeco +m_FashionDivineCollar_l_CollarLock,CollarLock +m_FashionDivineCollar_l_CollarLockPlate,CollarLockPlate +m_FashionDivineCollar_l_CollarLockBand,CollarLockBand +m_FashionDivineBelt,FashionDivineBelt +m_FashionDivineBelt_l_BeltLines,BeltLines +m_FashionDivineBelt_l_BeltMetal2,BeltMetal2 +m_FashionDivineBelt_l_BeltMetal1,BeltMetal1 +m_FashionDivineBelt_l_BeltBase,BeltBase +m_FashionDivineBelt_l_BeltPin,BeltPin +m_FashionDivineBelt_l_LockBeltLines,LockBeltLines +m_FashionDivineBelt_l_LockBeltPlate,LockBeltPlate +m_FashionDivineBelt_l_LockBeltShackle,LockBeltShackle +m_FashionDivineBelt_l_LockBeltHighlight,LockBeltHighlight +m_FashionDivineCuffsWristLeft,FashionDivineCuffsWristLeft +m_FashionDivineCuffsWristLeft_l_WristLeft,WristLeft +m_FashionDivineCuffsWristLeft_l_WristLeftDeco,WristLeftDeco +m_FashionDivineCuffsWristLeft_l_WristLeftLock,WristLeftLock +m_FashionDivineCuffsWristLeft_l_WristLeftLockPlate,WristLeftLockPlate +m_FashionDivineCuffsWristLeft_l_WristLeftLockBand,WristLeftLockBand +m_FashionDivineCuffsWristRight,FashionDivineCuffsWristRight +m_FashionDivineCuffsWristRight_l_WristRight,WristRight +m_FashionDivineCuffsWristRight_l_WristRightDeco,WristRightDeco +m_FashionDivineCuffsWristRight_l_WristRightLock,WristRightLock +m_FashionDivineCuffsWristRight_l_WristRightLockPlate,WristRightLockPlate +m_FashionDivineCuffsWristRight_l_WristRightLockBand,WristRightLockBand +m_FashionDivineCuffsWrists,FashionDivineCuffsWrists +m_FashionDivineCuffsWrists_l_WristLeft,WristLeft +m_FashionDivineCuffsWrists_l_WristLeftDeco,WristLeftDeco +m_FashionDivineCuffsWrists_l_WristLeftLock,WristLeftLock +m_FashionDivineCuffsWrists_l_WristLeftLockPlate,WristLeftLockPlate +m_FashionDivineCuffsWrists_l_WristLeftLockBand,WristLeftLockBand +m_FashionDivineCuffsWrists_l_WristRight,WristRight +m_FashionDivineCuffsWrists_l_WristRightDeco,WristRightDeco +m_FashionDivineCuffsWrists_l_WristRightLock,WristRightLock +m_FashionDivineCuffsWrists_l_WristRightLockPlate,WristRightLockPlate +m_FashionDivineCuffsWrists_l_WristRightLockBand,WristRightLockBand +m_FashionDivineCuffsElbowLeft,FashionDivineCuffsElbowLeft +m_FashionDivineCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_FashionDivineCuffsElbowLeft_l_ElbowLeftDeco,ElbowLeftDeco +m_FashionDivineCuffsElbowLeft_l_ElbowLeftLock,ElbowLeftLock +m_FashionDivineCuffsElbowLeft_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_FashionDivineCuffsElbowLeft_l_ElbowLeftLockBand,ElbowLeftLockBand +m_FashionDivineCuffsElbowRight,FashionDivineCuffsElbowRight +m_FashionDivineCuffsElbowRight_l_ElbowRight,ElbowRight +m_FashionDivineCuffsElbowRight_l_ElbowRightDeco,ElbowRightDeco +m_FashionDivineCuffsElbowRight_l_ElbowRightLock,ElbowRightLock +m_FashionDivineCuffsElbowRight_l_ElbowRightLockPlate,ElbowRightLockPlate +m_FashionDivineCuffsElbowRight_l_ElbowRightLockBand,ElbowRightLockBand +m_FashionDivineCuffsElbows,FashionDivineCuffsElbows +m_FashionDivineCuffsElbows_l_ElbowLeft,ElbowLeft +m_FashionDivineCuffsElbows_l_ElbowLeftDeco,ElbowLeftDeco +m_FashionDivineCuffsElbows_l_ElbowLeftLock,ElbowLeftLock +m_FashionDivineCuffsElbows_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_FashionDivineCuffsElbows_l_ElbowLeftLockBand,ElbowLeftLockBand +m_FashionDivineCuffsElbows_l_ElbowRight,ElbowRight +m_FashionDivineCuffsElbows_l_ElbowRightDeco,ElbowRightDeco +m_FashionDivineCuffsElbows_l_ElbowRightLock,ElbowRightLock +m_FashionDivineCuffsElbows_l_ElbowRightLockPlate,ElbowRightLockPlate +m_FashionDivineCuffsElbows_l_ElbowRightLockBand,ElbowRightLockBand +m_FashionDivineCuffsArms,FashionDivineCuffsArms +m_FashionDivineCuffsArms_l_WristLeft,WristLeft +m_FashionDivineCuffsArms_l_WristLeftDeco,WristLeftDeco +m_FashionDivineCuffsArms_l_WristLeftLock,WristLeftLock +m_FashionDivineCuffsArms_l_WristLeftLockPlate,WristLeftLockPlate +m_FashionDivineCuffsArms_l_WristLeftLockBand,WristLeftLockBand +m_FashionDivineCuffsArms_l_WristRight,WristRight +m_FashionDivineCuffsArms_l_WristRightDeco,WristRightDeco +m_FashionDivineCuffsArms_l_WristRightLock,WristRightLock +m_FashionDivineCuffsArms_l_WristRightLockPlate,WristRightLockPlate +m_FashionDivineCuffsArms_l_WristRightLockBand,WristRightLockBand +m_FashionDivineCuffsArms_l_ElbowLeft,ElbowLeft +m_FashionDivineCuffsArms_l_ElbowLeftDeco,ElbowLeftDeco +m_FashionDivineCuffsArms_l_ElbowLeftLock,ElbowLeftLock +m_FashionDivineCuffsArms_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_FashionDivineCuffsArms_l_ElbowLeftLockBand,ElbowLeftLockBand +m_FashionDivineCuffsArms_l_ElbowRight,ElbowRight +m_FashionDivineCuffsArms_l_ElbowRightDeco,ElbowRightDeco +m_FashionDivineCuffsArms_l_ElbowRightLock,ElbowRightLock +m_FashionDivineCuffsArms_l_ElbowRightLockPlate,ElbowRightLockPlate +m_FashionDivineCuffsArms_l_ElbowRightLockBand,ElbowRightLockBand +m_FashionDivineCuffsAnklesLeft,FashionDivineCuffsAnklesLeft +m_FashionDivineCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_FashionDivineCuffsAnklesLeft_l_AnkleLeftDeco,AnkleLeftDeco +m_FashionDivineCuffsAnklesLeft_l_AnkleLeftLock,AnkleLeftLock +m_FashionDivineCuffsAnklesLeft_l_AnkleLeftLockPlate,AnkleLeftLockPlate +m_FashionDivineCuffsAnklesLeft_l_AnkleLeftLockBand,AnkleLeftLockBand +m_FashionDivineCuffsAnklesRight,FashionDivineCuffsAnklesRight +m_FashionDivineCuffsAnklesRight_l_AnkleRight,AnkleRight +m_FashionDivineCuffsAnklesRight_l_AnkleRightDeco,AnkleRightDeco +m_FashionDivineCuffsAnklesRight_l_AnkleRightLock,AnkleRightLock +m_FashionDivineCuffsAnklesRight_l_AnkleRightLockPlate,AnkleRightLockPlate +m_FashionDivineCuffsAnklesRight_l_AnkleRightLockBand,AnkleRightLockBand +m_FashionDivineCuffsAnkles,FashionDivineCuffsAnkles +m_FashionDivineCuffsAnkles_l_AnkleRight,AnkleRight +m_FashionDivineCuffsAnkles_l_AnkleRightDeco,AnkleRightDeco +m_FashionDivineCuffsAnkles_l_AnkleRightLock,AnkleRightLock +m_FashionDivineCuffsAnkles_l_AnkleRightLockPlate,AnkleRightLockPlate +m_FashionDivineCuffsAnkles_l_AnkleRightLockBand,AnkleRightLockBand +m_FashionDivineCuffsAnkles_l_AnkleLeft,AnkleLeft +m_FashionDivineCuffsAnkles_l_AnkleLeftDeco,AnkleLeftDeco +m_FashionDivineCuffsAnkles_l_AnkleLeftLock,AnkleLeftLock +m_FashionDivineCuffsAnkles_l_AnkleLeftLockPlate,AnkleLeftLockPlate +m_FashionDivineCuffsAnkles_l_AnkleLeftLockBand,AnkleLeftLockBand +m_FashionDivineCuffsThighLeft,FashionDivineCuffsThighLeft +m_FashionDivineCuffsThighLeft_l_ThighLeft,ThighLeft +m_FashionDivineCuffsThighLeft_l_ThighLeftDeco,ThighLeftDeco +m_FashionDivineCuffsThighLeft_l_ThighLeftLock,ThighLeftLock +m_FashionDivineCuffsThighLeft_l_ThighLeftLockPlate,ThighLeftLockPlate +m_FashionDivineCuffsThighLeft_l_ThighLeftLockBand,ThighLeftLockBand +m_FashionDivineCuffsThighRight,FashionDivineCuffsThighRight +m_FashionDivineCuffsThighRight_l_ThighRight,ThighRight +m_FashionDivineCuffsThighRight_l_ThighRightDeco,ThighRightDeco +m_FashionDivineCuffsThighRight_l_ThighRightLock,ThighRightLock +m_FashionDivineCuffsThighRight_l_ThighRightLockPlate,ThighRightLockPlate +m_FashionDivineCuffsThighRight_l_ThighRightLockBand,ThighRightLockBand +m_FashionDivineCuffsThigh,FashionDivineCuffsThigh +m_FashionDivineCuffsThigh_l_ThighRight,ThighRight +m_FashionDivineCuffsThigh_l_ThighRightDeco,ThighRightDeco +m_FashionDivineCuffsThigh_l_ThighRightLock,ThighRightLock +m_FashionDivineCuffsThigh_l_ThighRightLockPlate,ThighRightLockPlate +m_FashionDivineCuffsThigh_l_ThighRightLockBand,ThighRightLockBand +m_FashionDivineCuffsThigh_l_ThighLeft,ThighLeft +m_FashionDivineCuffsThigh_l_ThighLeftDeco,ThighLeftDeco +m_FashionDivineCuffsThigh_l_ThighLeftLock,ThighLeftLock +m_FashionDivineCuffsThigh_l_ThighLeftLockPlate,ThighLeftLockPlate +m_FashionDivineCuffsThigh_l_ThighLeftLockBand,ThighLeftLockBand +m_DivineCuffsCleanWristLeft,DivineCuffsCleanWristLeft +m_DivineCuffsCleanWristLeft_l_WristLeft,WristLeft +m_DivineCuffsCleanWristLeft_l_WristLeftDecoClean,WristLeftDecoClean +m_DivineCuffsCleanWristLeft_l_WristLeftLock,WristLeftLock +m_DivineCuffsCleanWristLeft_l_WristLeftLockPlate,WristLeftLockPlate +m_DivineCuffsCleanWristLeft_l_WristLeftLockBand,WristLeftLockBand +m_DivineCuffsCleanWristRight,DivineCuffsCleanWristRight +m_DivineCuffsCleanWristRight_l_WristRight,WristRight +m_DivineCuffsCleanWristRight_l_WristRightDecoClean,WristRightDecoClean +m_DivineCuffsCleanWristRight_l_WristRightLock,WristRightLock +m_DivineCuffsCleanWristRight_l_WristRightLockPlate,WristRightLockPlate +m_DivineCuffsCleanWristRight_l_WristRightLockBand,WristRightLockBand +m_DivineCuffsCleanWrists,DivineCuffsCleanWrists +m_DivineCuffsCleanWrists_l_WristLeft,WristLeft +m_DivineCuffsCleanWrists_l_WristLeftDecoClean,WristLeftDecoClean +m_DivineCuffsCleanWrists_l_WristLeftLock,WristLeftLock +m_DivineCuffsCleanWrists_l_WristLeftLockPlate,WristLeftLockPlate +m_DivineCuffsCleanWrists_l_WristLeftLockBand,WristLeftLockBand +m_DivineCuffsCleanWrists_l_WristRight,WristRight +m_DivineCuffsCleanWrists_l_WristRightDecoClean,WristRightDecoClean +m_DivineCuffsCleanWrists_l_WristRightLock,WristRightLock +m_DivineCuffsCleanWrists_l_WristRightLockPlate,WristRightLockPlate +m_DivineCuffsCleanWrists_l_WristRightLockBand,WristRightLockBand +m_DivineCuffsCleanElbowLeft,DivineCuffsCleanElbowLeft +m_DivineCuffsCleanElbowLeft_l_ElbowLeft,ElbowLeft +m_DivineCuffsCleanElbowLeft_l_ElbowLeftDecoClean,ElbowLeftDecoClean +m_DivineCuffsCleanElbowLeft_l_ElbowLeftLock,ElbowLeftLock +m_DivineCuffsCleanElbowLeft_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_DivineCuffsCleanElbowLeft_l_ElbowLeftLockBand,ElbowLeftLockBand +m_DivineCuffsCleanElbowRight,DivineCuffsCleanElbowRight +m_DivineCuffsCleanElbowRight_l_ElbowRight,ElbowRight +m_DivineCuffsCleanElbowRight_l_ElbowRightDecoClean,ElbowRightDecoClean +m_DivineCuffsCleanElbowRight_l_ElbowRightLock,ElbowRightLock +m_DivineCuffsCleanElbowRight_l_ElbowRightLockPlate,ElbowRightLockPlate +m_DivineCuffsCleanElbowRight_l_ElbowRightLockBand,ElbowRightLockBand +m_DivineCuffsCleanElbows,DivineCuffsCleanElbows +m_DivineCuffsCleanElbows_l_ElbowLeft,ElbowLeft +m_DivineCuffsCleanElbows_l_ElbowLeftDecoClean,ElbowLeftDecoClean +m_DivineCuffsCleanElbows_l_ElbowLeftLock,ElbowLeftLock +m_DivineCuffsCleanElbows_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_DivineCuffsCleanElbows_l_ElbowLeftLockBand,ElbowLeftLockBand +m_DivineCuffsCleanElbows_l_ElbowRight,ElbowRight +m_DivineCuffsCleanElbows_l_ElbowRightDecoClean,ElbowRightDecoClean +m_DivineCuffsCleanElbows_l_ElbowRightLock,ElbowRightLock +m_DivineCuffsCleanElbows_l_ElbowRightLockPlate,ElbowRightLockPlate +m_DivineCuffsCleanElbows_l_ElbowRightLockBand,ElbowRightLockBand +m_DivineCuffsCleanArms,DivineCuffsCleanArms +m_DivineCuffsCleanArms_l_WristLeft,WristLeft +m_DivineCuffsCleanArms_l_WristLeftDecoClean,WristLeftDecoClean +m_DivineCuffsCleanArms_l_WristLeftLock,WristLeftLock +m_DivineCuffsCleanArms_l_WristLeftLockPlate,WristLeftLockPlate +m_DivineCuffsCleanArms_l_WristLeftLockBand,WristLeftLockBand +m_DivineCuffsCleanArms_l_WristRight,WristRight +m_DivineCuffsCleanArms_l_WristRightDecoClean,WristRightDecoClean +m_DivineCuffsCleanArms_l_WristRightLock,WristRightLock +m_DivineCuffsCleanArms_l_WristRightLockPlate,WristRightLockPlate +m_DivineCuffsCleanArms_l_WristRightLockBand,WristRightLockBand +m_DivineCuffsCleanArms_l_ElbowLeft,ElbowLeft +m_DivineCuffsCleanArms_l_ElbowLeftDecoClean,ElbowLeftDecoClean +m_DivineCuffsCleanArms_l_ElbowLeftLock,ElbowLeftLock +m_DivineCuffsCleanArms_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_DivineCuffsCleanArms_l_ElbowLeftLockBand,ElbowLeftLockBand +m_DivineCuffsCleanArms_l_ElbowRight,ElbowRight +m_DivineCuffsCleanArms_l_ElbowRightDecoClean,ElbowRightDecoClean +m_DivineCuffsCleanArms_l_ElbowRightLock,ElbowRightLock +m_DivineCuffsCleanArms_l_ElbowRightLockPlate,ElbowRightLockPlate +m_DivineCuffsCleanArms_l_ElbowRightLockBand,ElbowRightLockBand +m_DivineCuffsCleanAnklesLeft,DivineCuffsCleanAnklesLeft +m_DivineCuffsCleanAnklesLeft_l_AnkleLeft,AnkleLeft +m_DivineCuffsCleanAnklesLeft_l_AnkleLeftDecoClean,AnkleLeftDecoClean +m_DivineCuffsCleanAnklesLeft_l_AnkleLeftLock,AnkleLeftLock +m_DivineCuffsCleanAnklesLeft_l_AnkleLeftLockPlate,AnkleLeftLockPlate +m_DivineCuffsCleanAnklesLeft_l_AnkleLeftLockBand,AnkleLeftLockBand +m_DivineCuffsCleanAnklesRight,DivineCuffsCleanAnklesRight +m_DivineCuffsCleanAnklesRight_l_AnkleRight,AnkleRight +m_DivineCuffsCleanAnklesRight_l_AnkleRightDecoClean,AnkleRightDecoClean +m_DivineCuffsCleanAnklesRight_l_AnkleRightLock,AnkleRightLock +m_DivineCuffsCleanAnklesRight_l_AnkleRightLockPlate,AnkleRightLockPlate +m_DivineCuffsCleanAnklesRight_l_AnkleRightLockBand,AnkleRightLockBand +m_DivineCuffsCleanAnkles,DivineCuffsCleanAnkles +m_DivineCuffsCleanAnkles_l_AnkleRight,AnkleRight +m_DivineCuffsCleanAnkles_l_AnkleRightDecoClean,AnkleRightDecoClean +m_DivineCuffsCleanAnkles_l_AnkleRightLock,AnkleRightLock +m_DivineCuffsCleanAnkles_l_AnkleRightLockPlate,AnkleRightLockPlate +m_DivineCuffsCleanAnkles_l_AnkleRightLockBand,AnkleRightLockBand +m_DivineCuffsCleanAnkles_l_AnkleLeft,AnkleLeft +m_DivineCuffsCleanAnkles_l_AnkleLeftDecoClean,AnkleLeftDecoClean +m_DivineCuffsCleanAnkles_l_AnkleLeftLock,AnkleLeftLock +m_DivineCuffsCleanAnkles_l_AnkleLeftLockPlate,AnkleLeftLockPlate +m_DivineCuffsCleanAnkles_l_AnkleLeftLockBand,AnkleLeftLockBand +m_DivineCuffsCleanThighLeft,DivineCuffsCleanThighLeft +m_DivineCuffsCleanThighLeft_l_ThighLeft,ThighLeft +m_DivineCuffsCleanThighLeft_l_ThighLeftDecoClean,ThighLeftDecoClean +m_DivineCuffsCleanThighLeft_l_ThighLeftLock,ThighLeftLock +m_DivineCuffsCleanThighLeft_l_ThighLeftLockPlate,ThighLeftLockPlate +m_DivineCuffsCleanThighLeft_l_ThighLeftLockBand,ThighLeftLockBand +m_DivineCuffsCleanThighRight,DivineCuffsCleanThighRight +m_DivineCuffsCleanThighRight_l_ThighRight,ThighRight +m_DivineCuffsCleanThighRight_l_ThighRightDecoClean,ThighRightDecoClean +m_DivineCuffsCleanThighRight_l_ThighRightLock,ThighRightLock +m_DivineCuffsCleanThighRight_l_ThighRightLockPlate,ThighRightLockPlate +m_DivineCuffsCleanThighRight_l_ThighRightLockBand,ThighRightLockBand +m_DivineCuffsCleanThigh,DivineCuffsCleanThigh +m_DivineCuffsCleanThigh_l_ThighRight,ThighRight +m_DivineCuffsCleanThigh_l_ThighRightDecoClean,ThighRightDecoClean +m_DivineCuffsCleanThigh_l_ThighRightLock,ThighRightLock +m_DivineCuffsCleanThigh_l_ThighRightLockPlate,ThighRightLockPlate +m_DivineCuffsCleanThigh_l_ThighRightLockBand,ThighRightLockBand +m_DivineCuffsCleanThigh_l_ThighLeft,ThighLeft +m_DivineCuffsCleanThigh_l_ThighLeftDecoClean,ThighLeftDecoClean +m_DivineCuffsCleanThigh_l_ThighLeftLock,ThighLeftLock +m_DivineCuffsCleanThigh_l_ThighLeftLockPlate,ThighLeftLockPlate +m_DivineCuffsCleanThigh_l_ThighLeftLockBand,ThighLeftLockBand +m_DivineCollarClean,DivineCollarClean +m_DivineCollarClean_l_Collar,Collar +m_DivineCollarClean_l_CollarDecoClean,CollarDecoClean +m_DivineCollarClean_l_CollarLock,CollarLock +m_DivineCollarClean_l_CollarLockPlate,CollarLockPlate +m_DivineCollarClean_l_CollarLockBand,CollarLockBand +m_DivineBeltClean,DivineBeltClean +m_DivineBeltClean_l_Belt,Belt +m_DivineBeltClean_l_BeltDecoClean,BeltDecoClean +m_DivineBeltClean_l_BeltLock,BeltLock +m_DivineBeltClean_l_BeltLockPlate,BeltLockPlate +m_DivineBeltClean_l_BeltLockBand,BeltLockBand +m_FashionDivineCollarClean,FashionDivineCollarClean +m_FashionDivineCollarClean_l_Collar,Collar +m_FashionDivineCollarClean_l_CollarDecoClean,CollarDecoClean +m_FashionDivineCollarClean_l_CollarLock,CollarLock +m_FashionDivineCollarClean_l_CollarLockPlate,CollarLockPlate +m_FashionDivineCollarClean_l_CollarLockBand,CollarLockBand +m_FashionDivineBeltClean,FashionDivineBeltClean +m_FashionDivineBeltClean_l_Belt,Belt +m_FashionDivineBeltClean_l_BeltDecoClean,BeltDecoClean +m_FashionDivineBeltClean_l_BeltLock,BeltLock +m_FashionDivineBeltClean_l_BeltLockPlate,BeltLockPlate +m_FashionDivineBeltClean_l_BeltLockBand,BeltLockBand +m_FashionDivineCuffsCleanWristLeft,FashionDivineCuffsCleanWristLeft +m_FashionDivineCuffsCleanWristLeft_l_WristLeft,WristLeft +m_FashionDivineCuffsCleanWristLeft_l_WristLeftDecoClean,WristLeftDecoClean +m_FashionDivineCuffsCleanWristLeft_l_WristLeftLock,WristLeftLock +m_FashionDivineCuffsCleanWristLeft_l_WristLeftLockPlate,WristLeftLockPlate +m_FashionDivineCuffsCleanWristLeft_l_WristLeftLockBand,WristLeftLockBand +m_FashionDivineCuffsCleanWristRight,FashionDivineCuffsCleanWristRight +m_FashionDivineCuffsCleanWristRight_l_WristRight,WristRight +m_FashionDivineCuffsCleanWristRight_l_WristRightDecoClean,WristRightDecoClean +m_FashionDivineCuffsCleanWristRight_l_WristRightLock,WristRightLock +m_FashionDivineCuffsCleanWristRight_l_WristRightLockPlate,WristRightLockPlate +m_FashionDivineCuffsCleanWristRight_l_WristRightLockBand,WristRightLockBand +m_FashionDivineCuffsCleanWrists,FashionDivineCuffsCleanWrists +m_FashionDivineCuffsCleanWrists_l_WristLeft,WristLeft +m_FashionDivineCuffsCleanWrists_l_WristLeftDecoClean,WristLeftDecoClean +m_FashionDivineCuffsCleanWrists_l_WristLeftLock,WristLeftLock +m_FashionDivineCuffsCleanWrists_l_WristLeftLockPlate,WristLeftLockPlate +m_FashionDivineCuffsCleanWrists_l_WristLeftLockBand,WristLeftLockBand +m_FashionDivineCuffsCleanWrists_l_WristRight,WristRight +m_FashionDivineCuffsCleanWrists_l_WristRightDecoClean,WristRightDecoClean +m_FashionDivineCuffsCleanWrists_l_WristRightLock,WristRightLock +m_FashionDivineCuffsCleanWrists_l_WristRightLockPlate,WristRightLockPlate +m_FashionDivineCuffsCleanWrists_l_WristRightLockBand,WristRightLockBand +m_FashionDivineCuffsCleanElbowLeft,FashionDivineCuffsCleanElbowLeft +m_FashionDivineCuffsCleanElbowLeft_l_ElbowLeft,ElbowLeft +m_FashionDivineCuffsCleanElbowLeft_l_ElbowLeftDecoClean,ElbowLeftDecoClean +m_FashionDivineCuffsCleanElbowLeft_l_ElbowLeftLock,ElbowLeftLock +m_FashionDivineCuffsCleanElbowLeft_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_FashionDivineCuffsCleanElbowLeft_l_ElbowLeftLockBand,ElbowLeftLockBand +m_FashionDivineCuffsCleanElbowRight,FashionDivineCuffsCleanElbowRight +m_FashionDivineCuffsCleanElbowRight_l_ElbowRight,ElbowRight +m_FashionDivineCuffsCleanElbowRight_l_ElbowRightDecoClean,ElbowRightDecoClean +m_FashionDivineCuffsCleanElbowRight_l_ElbowRightLock,ElbowRightLock +m_FashionDivineCuffsCleanElbowRight_l_ElbowRightLockPlate,ElbowRightLockPlate +m_FashionDivineCuffsCleanElbowRight_l_ElbowRightLockBand,ElbowRightLockBand +m_FashionDivineCuffsCleanElbows,FashionDivineCuffsCleanElbows +m_FashionDivineCuffsCleanElbows_l_ElbowLeft,ElbowLeft +m_FashionDivineCuffsCleanElbows_l_ElbowLeftDecoClean,ElbowLeftDecoClean +m_FashionDivineCuffsCleanElbows_l_ElbowLeftLock,ElbowLeftLock +m_FashionDivineCuffsCleanElbows_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_FashionDivineCuffsCleanElbows_l_ElbowLeftLockBand,ElbowLeftLockBand +m_FashionDivineCuffsCleanElbows_l_ElbowRight,ElbowRight +m_FashionDivineCuffsCleanElbows_l_ElbowRightDecoClean,ElbowRightDecoClean +m_FashionDivineCuffsCleanElbows_l_ElbowRightLock,ElbowRightLock +m_FashionDivineCuffsCleanElbows_l_ElbowRightLockPlate,ElbowRightLockPlate +m_FashionDivineCuffsCleanElbows_l_ElbowRightLockBand,ElbowRightLockBand +m_FashionDivineCuffsCleanArms,FashionDivineCuffsCleanArms +m_FashionDivineCuffsCleanArms_l_WristLeft,WristLeft +m_FashionDivineCuffsCleanArms_l_WristLeftDecoClean,WristLeftDecoClean +m_FashionDivineCuffsCleanArms_l_WristLeftLock,WristLeftLock +m_FashionDivineCuffsCleanArms_l_WristLeftLockPlate,WristLeftLockPlate +m_FashionDivineCuffsCleanArms_l_WristLeftLockBand,WristLeftLockBand +m_FashionDivineCuffsCleanArms_l_WristRight,WristRight +m_FashionDivineCuffsCleanArms_l_WristRightDecoClean,WristRightDecoClean +m_FashionDivineCuffsCleanArms_l_WristRightLock,WristRightLock +m_FashionDivineCuffsCleanArms_l_WristRightLockPlate,WristRightLockPlate +m_FashionDivineCuffsCleanArms_l_WristRightLockBand,WristRightLockBand +m_FashionDivineCuffsCleanArms_l_ElbowLeft,ElbowLeft +m_FashionDivineCuffsCleanArms_l_ElbowLeftDecoClean,ElbowLeftDecoClean +m_FashionDivineCuffsCleanArms_l_ElbowLeftLock,ElbowLeftLock +m_FashionDivineCuffsCleanArms_l_ElbowLeftLockPlate,ElbowLeftLockPlate +m_FashionDivineCuffsCleanArms_l_ElbowLeftLockBand,ElbowLeftLockBand +m_FashionDivineCuffsCleanArms_l_ElbowRight,ElbowRight +m_FashionDivineCuffsCleanArms_l_ElbowRightDecoClean,ElbowRightDecoClean +m_FashionDivineCuffsCleanArms_l_ElbowRightLock,ElbowRightLock +m_FashionDivineCuffsCleanArms_l_ElbowRightLockPlate,ElbowRightLockPlate +m_FashionDivineCuffsCleanArms_l_ElbowRightLockBand,ElbowRightLockBand +m_FashionDivineCuffsCleanAnklesLeft,FashionDivineCuffsCleanAnklesLeft +m_FashionDivineCuffsCleanAnklesLeft_l_AnkleLeft,AnkleLeft +m_FashionDivineCuffsCleanAnklesLeft_l_AnkleLeftDecoClean,AnkleLeftDecoClean +m_FashionDivineCuffsCleanAnklesLeft_l_AnkleLeftLock,AnkleLeftLock +m_FashionDivineCuffsCleanAnklesLeft_l_AnkleLeftLockPlate,AnkleLeftLockPlate +m_FashionDivineCuffsCleanAnklesLeft_l_AnkleLeftLockBand,AnkleLeftLockBand +m_FashionDivineCuffsCleanAnklesRight,FashionDivineCuffsCleanAnklesRight +m_FashionDivineCuffsCleanAnklesRight_l_AnkleRight,AnkleRight +m_FashionDivineCuffsCleanAnklesRight_l_AnkleRightDecoClean,AnkleRightDecoClean +m_FashionDivineCuffsCleanAnklesRight_l_AnkleRightLock,AnkleRightLock +m_FashionDivineCuffsCleanAnklesRight_l_AnkleRightLockPlate,AnkleRightLockPlate +m_FashionDivineCuffsCleanAnklesRight_l_AnkleRightLockBand,AnkleRightLockBand +m_FashionDivineCuffsCleanAnkles,FashionDivineCuffsCleanAnkles +m_FashionDivineCuffsCleanAnkles_l_AnkleRight,AnkleRight +m_FashionDivineCuffsCleanAnkles_l_AnkleRightDecoClean,AnkleRightDecoClean +m_FashionDivineCuffsCleanAnkles_l_AnkleRightLock,AnkleRightLock +m_FashionDivineCuffsCleanAnkles_l_AnkleRightLockPlate,AnkleRightLockPlate +m_FashionDivineCuffsCleanAnkles_l_AnkleRightLockBand,AnkleRightLockBand +m_FashionDivineCuffsCleanAnkles_l_AnkleLeft,AnkleLeft +m_FashionDivineCuffsCleanAnkles_l_AnkleLeftDecoClean,AnkleLeftDecoClean +m_FashionDivineCuffsCleanAnkles_l_AnkleLeftLock,AnkleLeftLock +m_FashionDivineCuffsCleanAnkles_l_AnkleLeftLockPlate,AnkleLeftLockPlate +m_FashionDivineCuffsCleanAnkles_l_AnkleLeftLockBand,AnkleLeftLockBand +m_FashionDivineCuffsCleanThighLeft,FashionDivineCuffsCleanThighLeft +m_FashionDivineCuffsCleanThighLeft_l_ThighLeft,ThighLeft +m_FashionDivineCuffsCleanThighLeft_l_ThighLeftDecoClean,ThighLeftDecoClean +m_FashionDivineCuffsCleanThighLeft_l_ThighLeftLock,ThighLeftLock +m_FashionDivineCuffsCleanThighLeft_l_ThighLeftLockPlate,ThighLeftLockPlate +m_FashionDivineCuffsCleanThighLeft_l_ThighLeftLockBand,ThighLeftLockBand +m_FashionDivineCuffsCleanThighRight,FashionDivineCuffsCleanThighRight +m_FashionDivineCuffsCleanThighRight_l_ThighRight,ThighRight +m_FashionDivineCuffsCleanThighRight_l_ThighRightDecoClean,ThighRightDecoClean +m_FashionDivineCuffsCleanThighRight_l_ThighRightLock,ThighRightLock +m_FashionDivineCuffsCleanThighRight_l_ThighRightLockPlate,ThighRightLockPlate +m_FashionDivineCuffsCleanThighRight_l_ThighRightLockBand,ThighRightLockBand +m_FashionDivineCuffsCleanThigh,FashionDivineCuffsCleanThigh +m_FashionDivineCuffsCleanThigh_l_ThighRight,ThighRight +m_FashionDivineCuffsCleanThigh_l_ThighRightDecoClean,ThighRightDecoClean +m_FashionDivineCuffsCleanThigh_l_ThighRightLock,ThighRightLock +m_FashionDivineCuffsCleanThigh_l_ThighRightLockPlate,ThighRightLockPlate +m_FashionDivineCuffsCleanThigh_l_ThighRightLockBand,ThighRightLockBand +m_FashionDivineCuffsCleanThigh_l_ThighLeft,ThighLeft +m_FashionDivineCuffsCleanThigh_l_ThighLeftDecoClean,ThighLeftDecoClean +m_FashionDivineCuffsCleanThigh_l_ThighLeftLock,ThighLeftLock +m_FashionDivineCuffsCleanThigh_l_ThighLeftLockPlate,ThighLeftLockPlate +m_FashionDivineCuffsCleanThigh_l_ThighLeftLockBand,ThighLeftLockBand +m_SteelCuffsWristLeft,SteelCuffsWristLeft +m_SteelCuffsWristLeft_l_WristLeft,WristLeft +m_SteelCuffsWristLeft_l_RimWristLeft,RimWristLeft +m_SteelCuffsWristRight,SteelCuffsWristRight +m_SteelCuffsWristRight_l_WristRight,WristRight +m_SteelCuffsWristRight_l_RimWristRight,RimWristRight +m_SteelCuffsWrists,SteelCuffsWrists +m_SteelCuffsWrists_l_WristLeft,WristLeft +m_SteelCuffsWrists_l_RimWristLeft,RimWristLeft +m_SteelCuffsWrists_l_WristRight,WristRight +m_SteelCuffsWrists_l_RimWristRight,RimWristRight +m_SteelCuffsElbowLeft,SteelCuffsElbowLeft +m_SteelCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_SteelCuffsElbowLeft_l_RimElbowLeft,RimElbowLeft +m_SteelCuffsElbowRight,SteelCuffsElbowRight +m_SteelCuffsElbowRight_l_ElbowRight,ElbowRight +m_SteelCuffsElbowRight_l_RimElbowRight,RimElbowRight +m_SteelCuffsElbows,SteelCuffsElbows +m_SteelCuffsElbows_l_ElbowLeft,ElbowLeft +m_SteelCuffsElbows_l_RimElbowLeft,RimElbowLeft +m_SteelCuffsElbows_l_ElbowRight,ElbowRight +m_SteelCuffsElbows_l_RimElbowRight,RimElbowRight +m_SteelCuffsArms,SteelCuffsArms +m_SteelCuffsArms_l_WristLeft,WristLeft +m_SteelCuffsArms_l_RimWristLeft,RimWristLeft +m_SteelCuffsArms_l_WristRight,WristRight +m_SteelCuffsArms_l_RimWristRight,RimWristRight +m_SteelCuffsArms_l_ElbowLeft,ElbowLeft +m_SteelCuffsArms_l_RimElbowLeft,RimElbowLeft +m_SteelCuffsArms_l_ElbowRight,ElbowRight +m_SteelCuffsArms_l_RimElbowRight,RimElbowRight +m_SteelCuffsAnklesLeft,SteelCuffsAnklesLeft +m_SteelCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_SteelCuffsAnklesLeft_l_RimAnkleLeft,RimAnkleLeft +m_SteelCuffsAnklesRight,SteelCuffsAnklesRight +m_SteelCuffsAnklesRight_l_AnkleRight,AnkleRight +m_SteelCuffsAnklesRight_l_RimAnkleRight,RimAnkleRight +m_SteelCuffsAnkles,SteelCuffsAnkles +m_SteelCuffsAnkles_l_AnkleRight,AnkleRight +m_SteelCuffsAnkles_l_RimAnkleRight,RimAnkleRight +m_SteelCuffsAnkles_l_AnkleLeft,AnkleLeft +m_SteelCuffsAnkles_l_RimAnkleLeft,RimAnkleLeft +m_SteelCuffsThighLeft,SteelCuffsThighLeft +m_SteelCuffsThighLeft_l_ThighLeft,ThighLeft +m_SteelCuffsThighLeft_l_RimThighLeft,RimThighLeft +m_SteelCuffsThighRight,SteelCuffsThighRight +m_SteelCuffsThighRight_l_ThighRight,ThighRight +m_SteelCuffsThighRight_l_RimThighRight,RimThighRight +m_SteelCuffsThigh,SteelCuffsThigh +m_SteelCuffsThigh_l_ThighRight,ThighRight +m_SteelCuffsThigh_l_RimThighRight,RimThighRight +m_SteelCuffsThigh_l_ThighLeft,ThighLeft +m_SteelCuffsThigh_l_RimThighLeft,RimThighLeft +m_NeoSteelCollar,NeoSteelCollar +m_NeoSteelCollar_l_Collar,Collar +m_NeoSteelCollar_l_RimCollar,RimCollar +m_NeoSteelBelt,NeoSteelBelt +m_NeoSteelBelt_l_Belt,Belt +m_NeoSteelBelt_l_RimBelt,RimBelt +m_FashionNeoSteelCollar,FashionNeoSteelCollar +m_FashionNeoSteelCollar_l_Collar,Collar +m_FashionNeoSteelCollar_l_RimCollar,RimCollar +m_FashionNeoSteelBelt,FashionNeoSteelBelt +m_FashionNeoSteelBelt_l_Belt,Belt +m_FashionNeoSteelBelt_l_RimBelt,RimBelt +m_FashionSteelCuffsWristLeft,FashionSteelCuffsWristLeft +m_FashionSteelCuffsWristLeft_l_WristLeft,WristLeft +m_FashionSteelCuffsWristLeft_l_RimWristLeft,RimWristLeft +m_FashionSteelCuffsWristRight,FashionSteelCuffsWristRight +m_FashionSteelCuffsWristRight_l_WristRight,WristRight +m_FashionSteelCuffsWristRight_l_RimWristRight,RimWristRight +m_FashionSteelCuffsWrists,FashionSteelCuffsWrists +m_FashionSteelCuffsWrists_l_WristLeft,WristLeft +m_FashionSteelCuffsWrists_l_RimWristLeft,RimWristLeft +m_FashionSteelCuffsWrists_l_WristRight,WristRight +m_FashionSteelCuffsWrists_l_RimWristRight,RimWristRight +m_FashionSteelCuffsElbowLeft,FashionSteelCuffsElbowLeft +m_FashionSteelCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_FashionSteelCuffsElbowLeft_l_RimElbowLeft,RimElbowLeft +m_FashionSteelCuffsElbowRight,FashionSteelCuffsElbowRight +m_FashionSteelCuffsElbowRight_l_ElbowRight,ElbowRight +m_FashionSteelCuffsElbowRight_l_RimElbowRight,RimElbowRight +m_FashionSteelCuffsElbows,FashionSteelCuffsElbows +m_FashionSteelCuffsElbows_l_ElbowLeft,ElbowLeft +m_FashionSteelCuffsElbows_l_RimElbowLeft,RimElbowLeft +m_FashionSteelCuffsElbows_l_ElbowRight,ElbowRight +m_FashionSteelCuffsElbows_l_RimElbowRight,RimElbowRight +m_FashionSteelCuffsArms,FashionSteelCuffsArms +m_FashionSteelCuffsArms_l_WristLeft,WristLeft +m_FashionSteelCuffsArms_l_RimWristLeft,RimWristLeft +m_FashionSteelCuffsArms_l_WristRight,WristRight +m_FashionSteelCuffsArms_l_RimWristRight,RimWristRight +m_FashionSteelCuffsArms_l_ElbowLeft,ElbowLeft +m_FashionSteelCuffsArms_l_RimElbowLeft,RimElbowLeft +m_FashionSteelCuffsArms_l_ElbowRight,ElbowRight +m_FashionSteelCuffsArms_l_RimElbowRight,RimElbowRight +m_FashionSteelCuffsAnklesLeft,FashionSteelCuffsAnklesLeft +m_FashionSteelCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_FashionSteelCuffsAnklesLeft_l_RimAnkleLeft,RimAnkleLeft +m_FashionSteelCuffsAnklesRight,FashionSteelCuffsAnklesRight +m_FashionSteelCuffsAnklesRight_l_AnkleRight,AnkleRight +m_FashionSteelCuffsAnklesRight_l_RimAnkleRight,RimAnkleRight +m_FashionSteelCuffsAnkles,FashionSteelCuffsAnkles +m_FashionSteelCuffsAnkles_l_AnkleRight,AnkleRight +m_FashionSteelCuffsAnkles_l_RimAnkleRight,RimAnkleRight +m_FashionSteelCuffsAnkles_l_AnkleLeft,AnkleLeft +m_FashionSteelCuffsAnkles_l_RimAnkleLeft,RimAnkleLeft +m_FashionSteelCuffsThighLeft,FashionSteelCuffsThighLeft +m_FashionSteelCuffsThighLeft_l_ThighLeft,ThighLeft +m_FashionSteelCuffsThighLeft_l_RimThighLeft,RimThighLeft +m_FashionSteelCuffsThighRight,FashionSteelCuffsThighRight +m_FashionSteelCuffsThighRight_l_ThighRight,ThighRight +m_FashionSteelCuffsThighRight_l_RimThighRight,RimThighRight +m_FashionSteelCuffsThigh,FashionSteelCuffsThigh +m_FashionSteelCuffsThigh_l_ThighRight,ThighRight +m_FashionSteelCuffsThigh_l_RimThighRight,RimThighRight +m_FashionSteelCuffsThigh_l_ThighLeft,ThighLeft +m_FashionSteelCuffsThigh_l_RimThighLeft,RimThighLeft +m_CyberCuffsWristLeft,CyberCuffsWristLeft +m_CyberCuffsWristLeft_l_WristLeft,WristLeft +m_CyberCuffsWristLeft_l_ScreenWristLeft,ScreenWristLeft +m_CyberCuffsWristLeft_l_DisplayWristLeft,DisplayWristLeft +m_CyberCuffsWristLeft_l_LockWristLeft,LockWristLeft +m_CyberCuffsWristRight,CyberCuffsWristRight +m_CyberCuffsWristRight_l_WristRight,WristRight +m_CyberCuffsWristRight_l_ScreenWristRight,ScreenWristRight +m_CyberCuffsWristRight_l_DisplayWristRight,DisplayWristRight +m_CyberCuffsWristRight_l_LockWristRight,LockWristRight +m_CyberCuffsWrists,CyberCuffsWrists +m_CyberCuffsWrists_l_WristLeft,WristLeft +m_CyberCuffsWrists_l_ScreenWristLeft,ScreenWristLeft +m_CyberCuffsWrists_l_DisplayWristLeft,DisplayWristLeft +m_CyberCuffsWrists_l_LockWristLeft,LockWristLeft +m_CyberCuffsWrists_l_WristRight,WristRight +m_CyberCuffsWrists_l_ScreenWristRight,ScreenWristRight +m_CyberCuffsWrists_l_DisplayWristRight,DisplayWristRight +m_CyberCuffsWrists_l_LockWristRight,LockWristRight +m_CyberCuffsElbowLeft,CyberCuffsElbowLeft +m_CyberCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_CyberCuffsElbowLeft_l_ScreenElbowLeft,ScreenElbowLeft +m_CyberCuffsElbowLeft_l_DisplayElbowLeft,DisplayElbowLeft +m_CyberCuffsElbowLeft_l_LockElbowLeft,LockElbowLeft +m_CyberCuffsElbowRight,CyberCuffsElbowRight +m_CyberCuffsElbowRight_l_ElbowRight,ElbowRight +m_CyberCuffsElbowRight_l_ScreenElbowRight,ScreenElbowRight +m_CyberCuffsElbowRight_l_DisplayElbowRight,DisplayElbowRight +m_CyberCuffsElbowRight_l_LockElbowRight,LockElbowRight +m_CyberCuffsElbows,CyberCuffsElbows +m_CyberCuffsElbows_l_ElbowLeft,ElbowLeft +m_CyberCuffsElbows_l_ScreenElbowLeft,ScreenElbowLeft +m_CyberCuffsElbows_l_DisplayElbowLeft,DisplayElbowLeft +m_CyberCuffsElbows_l_LockElbowLeft,LockElbowLeft +m_CyberCuffsElbows_l_ElbowRight,ElbowRight +m_CyberCuffsElbows_l_ScreenElbowRight,ScreenElbowRight +m_CyberCuffsElbows_l_DisplayElbowRight,DisplayElbowRight +m_CyberCuffsElbows_l_LockElbowRight,LockElbowRight +m_CyberCuffsArms,CyberCuffsArms +m_CyberCuffsArms_l_WristLeft,WristLeft +m_CyberCuffsArms_l_ScreenWristLeft,ScreenWristLeft +m_CyberCuffsArms_l_DisplayWristLeft,DisplayWristLeft +m_CyberCuffsArms_l_LockWristLeft,LockWristLeft +m_CyberCuffsArms_l_WristRight,WristRight +m_CyberCuffsArms_l_ScreenWristRight,ScreenWristRight +m_CyberCuffsArms_l_DisplayWristRight,DisplayWristRight +m_CyberCuffsArms_l_LockWristRight,LockWristRight +m_CyberCuffsArms_l_ElbowLeft,ElbowLeft +m_CyberCuffsArms_l_ScreenElbowLeft,ScreenElbowLeft +m_CyberCuffsArms_l_DisplayElbowLeft,DisplayElbowLeft +m_CyberCuffsArms_l_LockElbowLeft,LockElbowLeft +m_CyberCuffsArms_l_ElbowRight,ElbowRight +m_CyberCuffsArms_l_ScreenElbowRight,ScreenElbowRight +m_CyberCuffsArms_l_DisplayElbowRight,DisplayElbowRight +m_CyberCuffsArms_l_LockElbowRight,LockElbowRight +m_CyberCuffsAnklesLeft,CyberCuffsAnklesLeft +m_CyberCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_CyberCuffsAnklesLeft_l_ScreenAnkleLeft,ScreenAnkleLeft +m_CyberCuffsAnklesLeft_l_DisplayAnkleLeft,DisplayAnkleLeft +m_CyberCuffsAnklesLeft_l_LockAnkleLeft,LockAnkleLeft +m_CyberCuffsAnklesRight,CyberCuffsAnklesRight +m_CyberCuffsAnklesRight_l_AnkleRight,AnkleRight +m_CyberCuffsAnklesRight_l_ScreenAnkleRight,ScreenAnkleRight +m_CyberCuffsAnklesRight_l_DisplayAnkleRight,DisplayAnkleRight +m_CyberCuffsAnklesRight_l_LockAnkleRight,LockAnkleRight +m_CyberCuffsAnkles,CyberCuffsAnkles +m_CyberCuffsAnkles_l_AnkleRight,AnkleRight +m_CyberCuffsAnkles_l_ScreenAnkleRight,ScreenAnkleRight +m_CyberCuffsAnkles_l_DisplayAnkleRight,DisplayAnkleRight +m_CyberCuffsAnkles_l_LockAnkleRight,LockAnkleRight +m_CyberCuffsAnkles_l_AnkleLeft,AnkleLeft +m_CyberCuffsAnkles_l_ScreenAnkleLeft,ScreenAnkleLeft +m_CyberCuffsAnkles_l_DisplayAnkleLeft,DisplayAnkleLeft +m_CyberCuffsAnkles_l_LockAnkleLeft,LockAnkleLeft +m_CyberCuffsThighLeft,CyberCuffsThighLeft +m_CyberCuffsThighLeft_l_ThighLeft,ThighLeft +m_CyberCuffsThighLeft_l_ScreenThighLeft,ScreenThighLeft +m_CyberCuffsThighLeft_l_DisplayThighLeft,DisplayThighLeft +m_CyberCuffsThighLeft_l_LockThighLeft,LockThighLeft +m_CyberCuffsThighRight,CyberCuffsThighRight +m_CyberCuffsThighRight_l_ThighRight,ThighRight +m_CyberCuffsThighRight_l_ScreenThighRight,ScreenThighRight +m_CyberCuffsThighRight_l_DisplayThighRight,DisplayThighRight +m_CyberCuffsThighRight_l_LockThighRight,LockThighRight +m_CyberCuffsThigh,CyberCuffsThigh +m_CyberCuffsThigh_l_ThighRight,ThighRight +m_CyberCuffsThigh_l_ScreenThighRight,ScreenThighRight +m_CyberCuffsThigh_l_DisplayThighRight,DisplayThighRight +m_CyberCuffsThigh_l_LockThighRight,LockThighRight +m_CyberCuffsThigh_l_ThighLeft,ThighLeft +m_CyberCuffsThigh_l_ScreenThighLeft,ScreenThighLeft +m_CyberCuffsThigh_l_DisplayThighLeft,DisplayThighLeft +m_CyberCuffsThigh_l_LockThighLeft,LockThighLeft +m_NeoCyberCollar,NeoCyberCollar +m_NeoCyberCollar_l_Collar,Collar +m_NeoCyberCollar_l_ScreenCollar,ScreenCollar +m_NeoCyberCollar_l_DisplayCollar,DisplayCollar +m_NeoCyberCollar_l_LockCollar,LockCollar +m_CyberLinkCollar,CyberLinkCollar +m_CyberLinkCollar_l_LinkCollar,LinkCollar +m_CyberLinkCollar_l_ScreenLinkCollar,ScreenLinkCollar +m_CyberLinkCollar_l_DisplayLinkCollar,DisplayLinkCollar +m_CyberLinkCollar_l_LockLinkCollar,LockLinkCollar +m_NeoCyberBelt,NeoCyberBelt +m_NeoCyberBelt_l_Belt,Belt +m_NeoCyberBelt_l_ScreenBelt,ScreenBelt +m_NeoCyberBelt_l_DisplayBelt,DisplayBelt +m_NeoCyberBelt_l_LockBelt,LockBelt +m_FashionNeoCyberCollar,FashionNeoCyberCollar +m_FashionNeoCyberCollar_l_Collar,Collar +m_FashionNeoCyberCollar_l_ScreenCollar,ScreenCollar +m_FashionNeoCyberCollar_l_DisplayCollar,DisplayCollar +m_FashionNeoCyberCollar_l_LockCollar,LockCollar +m_FashionCyberLinkCollar,FashionCyberLinkCollar +m_FashionCyberLinkCollar_l_LinkCollar,LinkCollar +m_FashionCyberLinkCollar_l_ScreenLinkCollar,ScreenLinkCollar +m_FashionCyberLinkCollar_l_DisplayLinkCollar,DisplayLinkCollar +m_FashionCyberLinkCollar_l_LockLinkCollar,LockLinkCollar +m_FashionNeoCyberBelt,FashionNeoCyberBelt +m_FashionNeoCyberBelt_l_Belt,Belt +m_FashionNeoCyberBelt_l_ScreenBelt,ScreenBelt +m_FashionNeoCyberBelt_l_DisplayBelt,DisplayBelt +m_FashionNeoCyberBelt_l_LockBelt,LockBelt +m_FashionCyberCuffsWristLeft,FashionCyberCuffsWristLeft +m_FashionCyberCuffsWristLeft_l_WristLeft,WristLeft +m_FashionCyberCuffsWristLeft_l_ScreenWristLeft,ScreenWristLeft +m_FashionCyberCuffsWristLeft_l_DisplayWristLeft,DisplayWristLeft +m_FashionCyberCuffsWristLeft_l_LockWristLeft,LockWristLeft +m_FashionCyberCuffsWristRight,FashionCyberCuffsWristRight +m_FashionCyberCuffsWristRight_l_WristRight,WristRight +m_FashionCyberCuffsWristRight_l_ScreenWristRight,ScreenWristRight +m_FashionCyberCuffsWristRight_l_DisplayWristRight,DisplayWristRight +m_FashionCyberCuffsWristRight_l_LockWristRight,LockWristRight +m_FashionCyberCuffsWrists,FashionCyberCuffsWrists +m_FashionCyberCuffsWrists_l_WristLeft,WristLeft +m_FashionCyberCuffsWrists_l_ScreenWristLeft,ScreenWristLeft +m_FashionCyberCuffsWrists_l_DisplayWristLeft,DisplayWristLeft +m_FashionCyberCuffsWrists_l_LockWristLeft,LockWristLeft +m_FashionCyberCuffsWrists_l_WristRight,WristRight +m_FashionCyberCuffsWrists_l_ScreenWristRight,ScreenWristRight +m_FashionCyberCuffsWrists_l_DisplayWristRight,DisplayWristRight +m_FashionCyberCuffsWrists_l_LockWristRight,LockWristRight +m_FashionCyberCuffsElbowLeft,FashionCyberCuffsElbowLeft +m_FashionCyberCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_FashionCyberCuffsElbowLeft_l_ScreenElbowLeft,ScreenElbowLeft +m_FashionCyberCuffsElbowLeft_l_DisplayElbowLeft,DisplayElbowLeft +m_FashionCyberCuffsElbowLeft_l_LockElbowLeft,LockElbowLeft +m_FashionCyberCuffsElbowRight,FashionCyberCuffsElbowRight +m_FashionCyberCuffsElbowRight_l_ElbowRight,ElbowRight +m_FashionCyberCuffsElbowRight_l_ScreenElbowRight,ScreenElbowRight +m_FashionCyberCuffsElbowRight_l_DisplayElbowRight,DisplayElbowRight +m_FashionCyberCuffsElbowRight_l_LockElbowRight,LockElbowRight +m_FashionCyberCuffsElbows,FashionCyberCuffsElbows +m_FashionCyberCuffsElbows_l_ElbowLeft,ElbowLeft +m_FashionCyberCuffsElbows_l_ScreenElbowLeft,ScreenElbowLeft +m_FashionCyberCuffsElbows_l_DisplayElbowLeft,DisplayElbowLeft +m_FashionCyberCuffsElbows_l_LockElbowLeft,LockElbowLeft +m_FashionCyberCuffsElbows_l_ElbowRight,ElbowRight +m_FashionCyberCuffsElbows_l_ScreenElbowRight,ScreenElbowRight +m_FashionCyberCuffsElbows_l_DisplayElbowRight,DisplayElbowRight +m_FashionCyberCuffsElbows_l_LockElbowRight,LockElbowRight +m_FashionCyberCuffsArms,FashionCyberCuffsArms +m_FashionCyberCuffsArms_l_WristLeft,WristLeft +m_FashionCyberCuffsArms_l_ScreenWristLeft,ScreenWristLeft +m_FashionCyberCuffsArms_l_DisplayWristLeft,DisplayWristLeft +m_FashionCyberCuffsArms_l_LockWristLeft,LockWristLeft +m_FashionCyberCuffsArms_l_WristRight,WristRight +m_FashionCyberCuffsArms_l_ScreenWristRight,ScreenWristRight +m_FashionCyberCuffsArms_l_DisplayWristRight,DisplayWristRight +m_FashionCyberCuffsArms_l_LockWristRight,LockWristRight +m_FashionCyberCuffsArms_l_ElbowLeft,ElbowLeft +m_FashionCyberCuffsArms_l_ScreenElbowLeft,ScreenElbowLeft +m_FashionCyberCuffsArms_l_DisplayElbowLeft,DisplayElbowLeft +m_FashionCyberCuffsArms_l_LockElbowLeft,LockElbowLeft +m_FashionCyberCuffsArms_l_ElbowRight,ElbowRight +m_FashionCyberCuffsArms_l_ScreenElbowRight,ScreenElbowRight +m_FashionCyberCuffsArms_l_DisplayElbowRight,DisplayElbowRight +m_FashionCyberCuffsArms_l_LockElbowRight,LockElbowRight +m_FashionCyberCuffsAnklesLeft,FashionCyberCuffsAnklesLeft +m_FashionCyberCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_FashionCyberCuffsAnklesLeft_l_ScreenAnkleLeft,ScreenAnkleLeft +m_FashionCyberCuffsAnklesLeft_l_DisplayAnkleLeft,DisplayAnkleLeft +m_FashionCyberCuffsAnklesLeft_l_LockAnkleLeft,LockAnkleLeft +m_FashionCyberCuffsAnklesRight,FashionCyberCuffsAnklesRight +m_FashionCyberCuffsAnklesRight_l_AnkleRight,AnkleRight +m_FashionCyberCuffsAnklesRight_l_ScreenAnkleRight,ScreenAnkleRight +m_FashionCyberCuffsAnklesRight_l_DisplayAnkleRight,DisplayAnkleRight +m_FashionCyberCuffsAnklesRight_l_LockAnkleRight,LockAnkleRight +m_FashionCyberCuffsAnkles,FashionCyberCuffsAnkles +m_FashionCyberCuffsAnkles_l_AnkleRight,AnkleRight +m_FashionCyberCuffsAnkles_l_ScreenAnkleRight,ScreenAnkleRight +m_FashionCyberCuffsAnkles_l_DisplayAnkleRight,DisplayAnkleRight +m_FashionCyberCuffsAnkles_l_LockAnkleRight,LockAnkleRight +m_FashionCyberCuffsAnkles_l_AnkleLeft,AnkleLeft +m_FashionCyberCuffsAnkles_l_ScreenAnkleLeft,ScreenAnkleLeft +m_FashionCyberCuffsAnkles_l_DisplayAnkleLeft,DisplayAnkleLeft +m_FashionCyberCuffsAnkles_l_LockAnkleLeft,LockAnkleLeft +m_FashionCyberCuffsThighLeft,FashionCyberCuffsThighLeft +m_FashionCyberCuffsThighLeft_l_ThighLeft,ThighLeft +m_FashionCyberCuffsThighLeft_l_ScreenThighLeft,ScreenThighLeft +m_FashionCyberCuffsThighLeft_l_DisplayThighLeft,DisplayThighLeft +m_FashionCyberCuffsThighLeft_l_LockThighLeft,LockThighLeft +m_FashionCyberCuffsThighRight,FashionCyberCuffsThighRight +m_FashionCyberCuffsThighRight_l_ThighRight,ThighRight +m_FashionCyberCuffsThighRight_l_ScreenThighRight,ScreenThighRight +m_FashionCyberCuffsThighRight_l_DisplayThighRight,DisplayThighRight +m_FashionCyberCuffsThighRight_l_LockThighRight,LockThighRight +m_FashionCyberCuffsThigh,FashionCyberCuffsThigh +m_FashionCyberCuffsThigh_l_ThighRight,ThighRight +m_FashionCyberCuffsThigh_l_ScreenThighRight,ScreenThighRight +m_FashionCyberCuffsThigh_l_DisplayThighRight,DisplayThighRight +m_FashionCyberCuffsThigh_l_LockThighRight,LockThighRight +m_FashionCyberCuffsThigh_l_ThighLeft,ThighLeft +m_FashionCyberCuffsThigh_l_ScreenThighLeft,ScreenThighLeft +m_FashionCyberCuffsThigh_l_DisplayThighLeft,DisplayThighLeft +m_FashionCyberCuffsThigh_l_LockThighLeft,LockThighLeft +m_CrystalCuffsWristLeft,CrystalCuffsWristLeft +m_CrystalCuffsWristLeft_l_WristLeft,WristLeft +m_CrystalCuffsWristRight,CrystalCuffsWristRight +m_CrystalCuffsWristRight_l_WristRight,WristRight +m_CrystalCuffsWrists,CrystalCuffsWrists +m_CrystalCuffsWrists_l_WristLeft,WristLeft +m_CrystalCuffsWrists_l_WristRight,WristRight +m_CrystalCuffsElbowLeft,CrystalCuffsElbowLeft +m_CrystalCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_CrystalCuffsElbowRight,CrystalCuffsElbowRight +m_CrystalCuffsElbowRight_l_ElbowRight,ElbowRight +m_CrystalCuffsElbows,CrystalCuffsElbows +m_CrystalCuffsElbows_l_ElbowLeft,ElbowLeft +m_CrystalCuffsElbows_l_ElbowRight,ElbowRight +m_CrystalCuffsArms,CrystalCuffsArms +m_CrystalCuffsArms_l_WristLeft,WristLeft +m_CrystalCuffsArms_l_WristRight,WristRight +m_CrystalCuffsArms_l_ElbowLeft,ElbowLeft +m_CrystalCuffsArms_l_ElbowRight,ElbowRight +m_CrystalCuffsAnklesLeft,CrystalCuffsAnklesLeft +m_CrystalCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_CrystalCuffsAnklesRight,CrystalCuffsAnklesRight +m_CrystalCuffsAnklesRight_l_AnkleRight,AnkleRight +m_CrystalCuffsAnkles,CrystalCuffsAnkles +m_CrystalCuffsAnkles_l_AnkleRight,AnkleRight +m_CrystalCuffsAnkles_l_AnkleLeft,AnkleLeft +m_CrystalCuffsThighLeft,CrystalCuffsThighLeft +m_CrystalCuffsThighLeft_l_ThighLeft,ThighLeft +m_CrystalCuffsThighRight,CrystalCuffsThighRight +m_CrystalCuffsThighRight_l_ThighRight,ThighRight +m_CrystalCuffsThigh,CrystalCuffsThigh +m_CrystalCuffsThigh_l_ThighRight,ThighRight +m_CrystalCuffsThigh_l_ThighLeft,ThighLeft +m_CrystalCollar,CrystalCollar +m_CrystalCollar_l_Collar,Collar +m_CrystalBelt,CrystalBelt +m_CrystalBelt_l_Belt,Belt +m_FashionCrystalCollar,FashionCrystalCollar +m_FashionCrystalCollar_l_Collar,Collar +m_FashionCrystalBelt,FashionCrystalBelt +m_FashionCrystalBelt_l_Belt,Belt +m_FashionCrystalCuffsWristLeft,FashionCrystalCuffsWristLeft +m_FashionCrystalCuffsWristLeft_l_WristLeft,WristLeft +m_FashionCrystalCuffsWristRight,FashionCrystalCuffsWristRight +m_FashionCrystalCuffsWristRight_l_WristRight,WristRight +m_FashionCrystalCuffsWrists,FashionCrystalCuffsWrists +m_FashionCrystalCuffsWrists_l_WristLeft,WristLeft +m_FashionCrystalCuffsWrists_l_WristRight,WristRight +m_FashionCrystalCuffsElbowLeft,FashionCrystalCuffsElbowLeft +m_FashionCrystalCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_FashionCrystalCuffsElbowRight,FashionCrystalCuffsElbowRight +m_FashionCrystalCuffsElbowRight_l_ElbowRight,ElbowRight +m_FashionCrystalCuffsElbows,FashionCrystalCuffsElbows +m_FashionCrystalCuffsElbows_l_ElbowLeft,ElbowLeft +m_FashionCrystalCuffsElbows_l_ElbowRight,ElbowRight +m_FashionCrystalCuffsArms,FashionCrystalCuffsArms +m_FashionCrystalCuffsArms_l_WristLeft,WristLeft +m_FashionCrystalCuffsArms_l_WristRight,WristRight +m_FashionCrystalCuffsArms_l_ElbowLeft,ElbowLeft +m_FashionCrystalCuffsArms_l_ElbowRight,ElbowRight +m_FashionCrystalCuffsAnklesLeft,FashionCrystalCuffsAnklesLeft +m_FashionCrystalCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_FashionCrystalCuffsAnklesRight,FashionCrystalCuffsAnklesRight +m_FashionCrystalCuffsAnklesRight_l_AnkleRight,AnkleRight +m_FashionCrystalCuffsAnkles,FashionCrystalCuffsAnkles +m_FashionCrystalCuffsAnkles_l_AnkleRight,AnkleRight +m_FashionCrystalCuffsAnkles_l_AnkleLeft,AnkleLeft +m_FashionCrystalCuffsThighLeft,FashionCrystalCuffsThighLeft +m_FashionCrystalCuffsThighLeft_l_ThighLeft,ThighLeft +m_FashionCrystalCuffsThighRight,FashionCrystalCuffsThighRight +m_FashionCrystalCuffsThighRight_l_ThighRight,ThighRight +m_FashionCrystalCuffsThigh,FashionCrystalCuffsThigh +m_FashionCrystalCuffsThigh_l_ThighRight,ThighRight +m_FashionCrystalCuffsThigh_l_ThighLeft,ThighLeft +m_Hobbleskirt,Hobbleskirt +m_Hobbleskirt_l_LegLeft,LegLeft +m_Hobbleskirt_l_LegRight,LegRight +m_Hobbleskirt_l_TorsoLower,TorsoLower +m_Hobbleskirt_l_AnkleLeft,AnkleLeft +m_Hobbleskirt_l_AnkleRight,AnkleRight +m_TapeHeavyArms_l_Collar,Collar +m_TapeHeavyArmsFull_l_Collar,Collar +m_FashionBraProto,FashionBraProto +m_FashionBraProto_l_BraProto,BraProto +m_FashionBraProto_l_BraProtoLining,BraProtoLining +m_FashionBraProto_l_BraProtoLiningMid,BraProtoLiningMid +m_FashionBraProto_l_BraProtoCups,BraProtoCups +m_FashionBraProto_l_BraProtoDisplay,BraProtoDisplay +m_FashionBraProto_l_BraProtoLock,BraProtoLock +m_FashionBraCyber,FashionBraCyber +m_FashionBraCyber_l_BraCyber,BraCyber +m_FashionBraCyber_l_BraCyberLining,BraCyberLining +m_FashionBraCyber_l_BraCyberDisplay,BraCyberDisplay +m_FashionBraCyber_l_BraCyberLock,BraCyberLock +m_FashionChastityBra,FashionChastityBra +m_FashionChastityBra_l_BraCups,BraCups +m_FashionChastityBra_l_BraLining,BraLining +m_FashionChastityBra_l_BraChain,BraChain +m_FashionChastityBra_l_BraLock,BraLock +m_FashionHeartBelt,FashionHeartBelt +m_FashionHeartBelt_l_Belt,Belt +m_FashionHeartBelt_l_BeltLining,BeltLining +m_FashionHeartBelt_l_BeltLock,BeltLock +m_FashionHeartBelt_l_BeltStrap,BeltStrap +m_FashionHeartBelt_l_BeltStrapLining,BeltStrapLining +m_FashionCyberBelt,FashionCyberBelt +m_FashionCyberBelt_l_Cyber,Cyber +m_FashionCyberBelt_l_CyberLining,CyberLining +m_FashionCyberBelt_l_CyberDisplay,CyberDisplay +m_FashionCyberBelt_l_CyberPlug,CyberPlug +m_FashionCyberBelt_l_CyberLock,CyberLock +m_FashionProtoBelt,FashionProtoBelt +m_FashionProtoBelt_l_Proto,Proto +m_FashionProtoBelt_l_ProtoLining,ProtoLining +m_FashionProtoBelt_l_ProtoDisplay,ProtoDisplay +m_FashionProtoBelt_l_ProtoPlug,ProtoPlug +m_FashionProtoBelt_l_ProtoLock,ProtoLock +m_DivineBeltRunic,DivineBeltRunic +m_DivineBeltRunic_l_BeltLines,BeltLines +m_DivineBeltRunic_l_BeltMetalRunic2,BeltMetalRunic2 +m_DivineBeltRunic_l_BeltMetalRunic1,BeltMetalRunic1 +m_DivineBeltRunic_l_BeltBase,BeltBase +m_DivineBeltRunic_l_BeltPin,BeltPin +m_DivineBeltRunic_l_LockBeltLines,LockBeltLines +m_DivineBeltRunic_l_LockBeltPlate,LockBeltPlate +m_DivineBeltRunic_l_LockBeltShackle,LockBeltShackle +m_DivineBeltRunic_l_LockBeltHighlight,LockBeltHighlight +m_FashionDivineBeltRunic,FashionDivineBeltRunic +m_FashionDivineBeltRunic_l_BeltLines,BeltLines +m_FashionDivineBeltRunic_l_BeltMetalRunic2,BeltMetalRunic2 +m_FashionDivineBeltRunic_l_BeltMetalRunic1,BeltMetalRunic1 +m_FashionDivineBeltRunic_l_BeltBase,BeltBase +m_FashionDivineBeltRunic_l_BeltPin,BeltPin +m_FashionDivineBeltRunic_l_LockBeltLines,LockBeltLines +m_FashionDivineBeltRunic_l_LockBeltPlate,LockBeltPlate +m_FashionDivineBeltRunic_l_LockBeltShackle,LockBeltShackle +m_FashionDivineBeltRunic_l_LockBeltHighlight,LockBeltHighlight +m_DivineBra,DivineBra +m_DivineBra_l_BraLines,BraLines +m_DivineBra_l_BraBase1,BraBase1 +m_DivineBra_l_BraBase2,BraBase2 +m_DivineBra_l_BraMetal1,BraMetal1 +m_DivineBra_l_BraMetal2,BraMetal2 +m_DivineBra_l_BraPins,BraPins +m_DivineBra_l_BraStraps,BraStraps +m_DivineBra_l_LockBraLines,LockBraLines +m_DivineBra_l_LockBraPlate,LockBraPlate +m_DivineBra_l_LockBraShackle,LockBraShackle +m_DivineBra_l_LockBraHighlight,LockBraHighlight +m_FashionDivineBra,FashionDivineBra +m_FashionDivineBra_l_BraLines,BraLines +m_FashionDivineBra_l_BraBase1,BraBase1 +m_FashionDivineBra_l_BraBase2,BraBase2 +m_FashionDivineBra_l_BraMetal1,BraMetal1 +m_FashionDivineBra_l_BraMetal2,BraMetal2 +m_FashionDivineBra_l_BraPins,BraPins +m_FashionDivineBra_l_BraStraps,BraStraps +m_FashionDivineBra_l_LockBraLines,LockBraLines +m_FashionDivineBra_l_LockBraPlate,LockBraPlate +m_FashionDivineBra_l_LockBraShackle,LockBraShackle +m_FashionDivineBra_l_LockBraHighlight,LockBraHighlight +m_DivineBraRunic,DivineBraRunic +m_DivineBraRunic_l_BraLines,BraLines +m_DivineBraRunic_l_BraBase1,BraBase1 +m_DivineBraRunic_l_BraBase2,BraBase2 +m_DivineBraRunic_l_BraMetalRunic1,BraMetalRunic1 +m_DivineBraRunic_l_BraMetalRunic2,BraMetalRunic2 +m_DivineBraRunic_l_BraPins,BraPins +m_DivineBraRunic_l_BraStrapsRunic,BraStrapsRunic +m_DivineBraRunic_l_LockBraLines,LockBraLines +m_DivineBraRunic_l_LockBraPlate,LockBraPlate +m_DivineBraRunic_l_LockBraShackle,LockBraShackle +m_DivineBraRunic_l_LockBraHighlight,LockBraHighlight +m_FashionDivineBraRunic,FashionDivineBraRunic +m_FashionDivineBraRunic_l_BraLines,BraLines +m_FashionDivineBraRunic_l_BraBase1,BraBase1 +m_FashionDivineBraRunic_l_BraBase2,BraBase2 +m_FashionDivineBraRunic_l_BraMetalRunic1,BraMetalRunic1 +m_FashionDivineBraRunic_l_BraMetalRunic2,BraMetalRunic2 +m_FashionDivineBraRunic_l_BraPins,BraPins +m_FashionDivineBraRunic_l_BraStrapsRunic,BraStrapsRunic +m_FashionDivineBraRunic_l_LockBraLines,LockBraLines +m_FashionDivineBraRunic_l_LockBraPlate,LockBraPlate +m_FashionDivineBraRunic_l_LockBraShackle,LockBraShackle +m_FashionDivineBraRunic_l_LockBraHighlight,LockBraHighlight +m_SteelChastityBelt_Padlock,SteelChastityBelt_Padlock +m_SteelChastityBelt_Padlock_l_Belt,Belt +m_SteelChastityBelt_Padlock_l_BeltPadlock,BeltPadlock +m_SteelChastityBelt_Padlock_l_BeltPadlockPin,BeltPadlockPin +m_SteelChastityBelt_Radial,SteelChastityBelt_Radial +m_SteelChastityBelt_Radial_l_Belt,Belt +m_SteelChastityBelt_Radial_l_BeltRadial,BeltRadial +m_SteelChastityBelt_Segu,SteelChastityBelt_Segu +m_SteelChastityBelt_Segu_l_Belt,Belt +m_SteelChastityBelt_Segu_l_BeltSegu,BeltSegu +m_FashionSteelChastityBelt_Padlock,FashionSteelChastityBelt_Padlock +m_FashionSteelChastityBelt_Padlock_l_Belt,Belt +m_FashionSteelChastityBelt_Padlock_l_BeltPadlock,BeltPadlock +m_FashionSteelChastityBelt_Padlock_l_BeltPadlockPin,BeltPadlockPin +m_FashionSteelChastityBelt_Radial,FashionSteelChastityBelt_Radial +m_FashionSteelChastityBelt_Radial_l_Belt,Belt +m_FashionSteelChastityBelt_Radial_l_BeltRadial,BeltRadial +m_FashionSteelChastityBelt_Segu,FashionSteelChastityBelt_Segu +m_FashionSteelChastityBelt_Segu_l_Belt,Belt +m_FashionSteelChastityBelt_Segu_l_BeltSegu,BeltSegu +m_SteelChastityBra_Padlock,SteelChastityBra_Padlock +m_SteelChastityBra_Padlock_l_Bra,Bra +m_SteelChastityBra_Padlock_l_BraPadlock,BraPadlock +m_SteelChastityBra_Padlock_l_BraPadlockPin,BraPadlockPin +m_SteelChastityBra_Radial,SteelChastityBra_Radial +m_SteelChastityBra_Radial_l_Bra,Bra +m_SteelChastityBra_Radial_l_BraRadial,BraRadial +m_SteelChastityBra_Segu,SteelChastityBra_Segu +m_SteelChastityBra_Segu_l_Bra,Bra +m_SteelChastityBra_Segu_l_BraSegu,BraSegu +m_FashionSteelChastityBra_Padlock,FashionSteelChastityBra_Padlock +m_FashionSteelChastityBra_Padlock_l_Bra,Bra +m_FashionSteelChastityBra_Padlock_l_BraPadlock,BraPadlock +m_FashionSteelChastityBra_Padlock_l_BraPadlockPin,BraPadlockPin +m_FashionSteelChastityBra_Radial,FashionSteelChastityBra_Radial +m_FashionSteelChastityBra_Radial_l_Bra,Bra +m_FashionSteelChastityBra_Radial_l_BraRadial,BraRadial +m_FashionSteelChastityBra_Segu,FashionSteelChastityBra_Segu +m_FashionSteelChastityBra_Segu_l_Bra,Bra +m_FashionSteelChastityBra_Segu_l_BraSegu,BraSegu +m_JacketLowerStraps,JacketLowerStraps +m_JacketLowerStraps_l_BeltsTorsoLower,BeltsTorsoLower +m_JacketLowerStraps_l_CrotchBelts,CrotchBelts +m_JacketExtraStraps,JacketExtraStraps +m_JacketExtraStraps_l_StrapsTorsoLowerExtra,StrapsTorsoLowerExtra +m_JacketExtraStraps_l_CrotchBeltExtra,CrotchBeltExtra +m_JacketExtraStraps_l_StrapsChestExtra,StrapsChestExtra +m_JacketHeavyStraps,JacketHeavyStraps +m_JacketHeavyStraps_l_StrapsArms,StrapsArms +m_JacketHeavyStraps_l_StrapsChest,StrapsChest +m_JacketHeavyStraps_l_StrapsUnderbust,StrapsUnderbust +m_JacketHeavyStraps_l_BeltsTorsoLower,BeltsTorsoLower +m_JacketHeavyStraps_l_CrotchBelts,CrotchBelts +m_Jacket_l_StrapsArms,StrapsArms +m_Jacket_l_StrapsChest,StrapsChest +m_Jacket_l_StrapsUnderbust,StrapsUnderbust +m_JacketLower,JacketLower +m_JacketLower_l_BinderTorsoLower,BinderTorsoLower +m_JacketLower_l_Crotch,Crotch +m_JacketHeavy_l_StrapsArms,StrapsArms +m_JacketHeavy_l_StrapsChest,StrapsChest +m_JacketHeavy_l_StrapsUnderbust,StrapsUnderbust +m_JacketExtra,JacketExtra +m_JacketExtra_l_StrapsArms,StrapsArms +m_JacketExtra_l_StrapsChest,StrapsChest +m_JacketExtra_l_StrapsUnderbust,StrapsUnderbust +m_JacketExtra_l_Arms,Arms +m_JacketExtra_l_Chest,Chest +m_JacketExtra_l_BinderTorsoLower,BinderTorsoLower +m_JacketExtra_l_Crotch,Crotch +m_JacketExtra_l_BeltsTorsoLower,BeltsTorsoLower +m_JacketExtra_l_CrotchBelts,CrotchBelts +m_JacketExtra_l_StrapsTorsoLowerExtra,StrapsTorsoLowerExtra +m_JacketExtra_l_CrotchBeltExtra,CrotchBeltExtra +m_JacketExtra_l_StrapsChestExtra,StrapsChestExtra +m_JacketHeavyArmbinder,JacketHeavyArmbinder +m_JacketHeavyArmbinder_l_Arms,Arms +m_JacketHeavyArmbinder_l_StrapsArms,StrapsArms +m_JacketHeavyArmbinder_l_StrapsChest,StrapsChest +m_JacketHeavyArmbinder_l_StrapsUnderbust,StrapsUnderbust +m_JacketHeavyArmbinder_l_BeltsTorsoLower,BeltsTorsoLower +m_JacketHeavyArmbinder_l_CrotchBelts,CrotchBelts +m_JacketExtraArmbinder,JacketExtraArmbinder +m_JacketExtraArmbinder_l_Arms,Arms +m_JacketExtraArmbinder_l_StrapsArms,StrapsArms +m_JacketExtraArmbinder_l_StrapsChest,StrapsChest +m_JacketExtraArmbinder_l_StrapsUnderbust,StrapsUnderbust +m_JacketExtraArmbinder_l_BeltsTorsoLower,BeltsTorsoLower +m_JacketExtraArmbinder_l_CrotchBelts,CrotchBelts +m_JacketExtraArmbinder_l_StrapsTorsoLowerExtra,StrapsTorsoLowerExtra +m_JacketExtraArmbinder_l_CrotchBeltExtra,CrotchBeltExtra +m_JacketExtraArmbinder_l_StrapsChestExtra,StrapsChestExtra +m_JacketHeavyBolero,JacketHeavyBolero +m_JacketHeavyBolero_l_Arms,Arms +m_JacketHeavyBolero_l_ChestBolero,ChestBolero +m_JacketHeavyBolero_l_StrapsArms,StrapsArms +m_JacketHeavyBolero_l_StrapsChest,StrapsChest +m_JacketHeavyBolero_l_StrapsUnderbust,StrapsUnderbust +m_JacketHeavyBolero_l_BinderTorsoLower,BinderTorsoLower +m_JacketHeavyBolero_l_Crotch,Crotch +m_JacketHeavyBolero_l_BeltsTorsoLower,BeltsTorsoLower +m_JacketHeavyBolero_l_CrotchBelts,CrotchBelts +m_JacketExtraBolero,JacketExtraBolero +m_JacketExtraBolero_l_Arms,Arms +m_JacketExtraBolero_l_ChestBolero,ChestBolero +m_JacketExtraBolero_l_StrapsArms,StrapsArms +m_JacketExtraBolero_l_StrapsChest,StrapsChest +m_JacketExtraBolero_l_StrapsUnderbust,StrapsUnderbust +m_JacketExtraBolero_l_BinderTorsoLower,BinderTorsoLower +m_JacketExtraBolero_l_Crotch,Crotch +m_JacketExtraBolero_l_BeltsTorsoLower,BeltsTorsoLower +m_JacketExtraBolero_l_CrotchBelts,CrotchBelts +m_JacketExtraBolero_l_StrapsTorsoLowerExtra,StrapsTorsoLowerExtra +m_JacketExtraBolero_l_CrotchBeltExtra,CrotchBeltExtra +m_JacketExtraBolero_l_StrapsChestExtra,StrapsChestExtra +m_JacketHeavyLeotard,JacketHeavyLeotard +m_JacketHeavyLeotard_l_Arms,Arms +m_JacketHeavyLeotard_l_ChestBolero,ChestBolero +m_JacketHeavyLeotard_l_StrapsArms,StrapsArms +m_JacketHeavyLeotard_l_StrapsChest,StrapsChest +m_JacketHeavyLeotard_l_StrapsUnderbust,StrapsUnderbust +m_JacketHeavyLeotard_l_LatexLower,LatexLower +m_JacketHeavyLeotard_l_LatexChest,LatexChest +m_JacketHeavyLeotard_l_LatexUpper,LatexUpper +m_JacketHeavyLeotard_l_BeltsTorsoLower,BeltsTorsoLower +m_JacketHeavyLeotard_l_CrotchBelts,CrotchBelts +m_JacketExtraLeotard,JacketExtraLeotard +m_JacketExtraLeotard_l_Arms,Arms +m_JacketExtraLeotard_l_ChestBolero,ChestBolero +m_JacketExtraLeotard_l_StrapsArms,StrapsArms +m_JacketExtraLeotard_l_StrapsChest,StrapsChest +m_JacketExtraLeotard_l_StrapsUnderbust,StrapsUnderbust +m_JacketExtraLeotard_l_LatexLower,LatexLower +m_JacketExtraLeotard_l_LatexChest,LatexChest +m_JacketExtraLeotard_l_LatexUpper,LatexUpper +m_JacketExtraLeotard_l_BeltsTorsoLower,BeltsTorsoLower +m_JacketExtraLeotard_l_CrotchBelts,CrotchBelts +m_JacketExtraLeotard_l_StrapsTorsoLowerExtra,StrapsTorsoLowerExtra +m_JacketExtraLeotard_l_CrotchBeltExtra,CrotchBeltExtra +m_JacketExtraLeotard_l_StrapsChestExtra,StrapsChestExtra +m_Legbinder_l_RightLacesLegbinder,RightLacesLegbinder +m_Legbinder_l_LegLacesLegbinder,LegLacesLegbinder +m_FashionClothBlindfold,FashionClothBlindfold +m_FashionClothBlindfold_l_Cloth,Cloth +m_FashionBlindfoldBasic,FashionBlindfoldBasic +m_FashionBlindfoldBasic_l_Basic,Basic +m_FashionBlindfoldBasic_l_BasicRim,BasicRim +m_FashionBlindfoldLeather,FashionBlindfoldLeather +m_FashionBlindfoldLeather_l_LeatherBase,LeatherBase +m_FashionBlindfoldLeather_l_LeatherRim,LeatherRim +m_FashionKittyBlindfold,FashionKittyBlindfold +m_FashionKittyBlindfold_l_LeatherBase,LeatherBase +m_FashionKittyBlindfold_l_LeatherRim,LeatherRim +m_FashionKittyBlindfold_l_KittyEyes,KittyEyes +m_FashionBlindfoldTape,FashionBlindfoldTape +m_FashionBlindfoldTape_l_Tape,Tape +m_SmoothHeels,SmoothHeels +m_SmoothHeels_l_Left,Left +m_SmoothHeels_l_Right,Right +m_SmoothHeels_l_LegLeft,LegLeft +m_SmoothHeels_l_LegRight,LegRight +m_TallBalletHeels,TallBalletHeels +m_TallBalletHeels_l_TallLeft,TallLeft +m_TallBalletHeels_l_TallRight,TallRight +m_TallBalletHeels_l_TallLegLeft,TallLegLeft +m_TallBalletHeels_l_TallLegRight,TallLegRight +m_TallBalletHeelsRestraint,TallBalletHeelsRestraint +m_TallBalletHeelsRestraint_l_TallLeft,TallLeft +m_TallBalletHeelsRestraint_l_TallRight,TallRight +m_TallBalletHeelsRestraint_l_TallLegLeft,TallLegLeft +m_TallBalletHeelsRestraint_l_TallLegRight,TallLegRight +m_CyberBalletHeels,CyberBalletHeels +m_CyberBalletHeels_l_ShinyBalletLeft,ShinyBalletLeft +m_CyberBalletHeels_l_ShinyBalletRight,ShinyBalletRight +m_CyberBalletHeels_l_GlowBalletLeft,GlowBalletLeft +m_CyberBalletHeels_l_GlowBalletRight,GlowBalletRight +m_CyberBalletHeelsRestraint,CyberBalletHeelsRestraint +m_CyberBalletHeelsRestraint_l_ShinyBalletLeft,ShinyBalletLeft +m_CyberBalletHeelsRestraint_l_ShinyBalletRight,ShinyBalletRight +m_CyberBalletHeelsRestraint_l_GlowBalletLeft,GlowBalletLeft +m_CyberBalletHeelsRestraint_l_GlowBalletRight,GlowBalletRight +m_FashionHarnessTop,FashionHarnessTop +m_FashionHarnessTop_l_BeltsTop,BeltsTop +m_FashionHarnessTop_l_HardwareTop,HardwareTop +m_FashionHarnessMid,FashionHarnessMid +m_FashionHarnessMid_l_BeltsMid,BeltsMid +m_FashionHarnessMid_l_HardwareMid,HardwareMid +m_FashionHarnessStrap,FashionHarnessStrap +m_FashionHarnessStrap_l_BeltsStrap,BeltsStrap +m_FashionHarnessStrap_l_HardwareStrap,HardwareStrap +m_FashionHarness,FashionHarness +m_FashionHarness_l_BeltsTop,BeltsTop +m_FashionHarness_l_HardwareTop,HardwareTop +m_FashionHarness_l_BeltsOverbust,BeltsOverbust +m_FashionHarness_l_BeltsUnderbust,BeltsUnderbust +m_FashionHarness_l_HardwareUnderbustOver,HardwareUnderbustOver +m_FashionHarness_l_HardwareUnderbust,HardwareUnderbust +m_FashionHarness_l_BeltsMid,BeltsMid +m_FashionHarness_l_HardwareMid,HardwareMid +m_FashionHarness_l_BeltsStrap,BeltsStrap +m_FashionHarness_l_HardwareStrap,HardwareStrap +m_FutureHarnessChest_l_LockChest,LockChest +m_FutureHarnessMid_l_LockMid,LockMid +m_FutureHarnessLower_l_LockLower,LockLower +m_FutureHarness_l_LockLower,LockLower +m_FutureHarness_l_LockMid,LockMid +m_FutureHarness_l_LockChest,LockChest +m_FashionFutureHarnessLower,FashionFutureHarnessLower +m_FashionFutureHarnessLower_l_StrapsLower,StrapsLower +m_FashionFutureHarnessLower_l_DisplayLower,DisplayLower +m_FashionFutureHarnessLower_l_LockLower,LockLower +m_FashionFutureHarnessLower_l_MetalLower,MetalLower +m_FashionFutureHarnessMid,FashionFutureHarnessMid +m_FashionFutureHarnessMid_l_StrapsMid,StrapsMid +m_FashionFutureHarnessMid_l_DisplayMid,DisplayMid +m_FashionFutureHarnessMid_l_LockMid,LockMid +m_FashionFutureHarnessMid_l_MetalMid,MetalMid +m_FashionFutureHarnessChest,FashionFutureHarnessChest +m_FashionFutureHarnessChest_l_StrapsChest,StrapsChest +m_FashionFutureHarnessChest_l_DisplayChest,DisplayChest +m_FashionFutureHarnessChest_l_LockChest,LockChest +m_FashionFutureHarnessChest_l_MetalChest,MetalChest +m_FashionFutureHarness,FashionFutureHarness +m_FashionFutureHarness_l_StrapsLower,StrapsLower +m_FashionFutureHarness_l_DisplayLower,DisplayLower +m_FashionFutureHarness_l_LockLower,LockLower +m_FashionFutureHarness_l_MetalLower,MetalLower +m_FashionFutureHarness_l_StrapsMid,StrapsMid +m_FashionFutureHarness_l_DisplayMid,DisplayMid +m_FashionFutureHarness_l_LockMid,LockMid +m_FashionFutureHarness_l_MetalMid,MetalMid +m_FashionFutureHarness_l_StrapsChest,StrapsChest +m_FashionFutureHarness_l_DisplayChest,DisplayChest +m_FashionFutureHarness_l_LockChest,LockChest +m_FashionFutureHarness_l_MetalChest,MetalChest +m_ClothTop,ClothTop +m_ClothTop_l_TopChest,TopChest +m_ClothTop_l_TopShoulders,TopShoulders +m_ClothTop_l_Top,Top +m_ClothBra,ClothBra +m_ClothBra_l_TopChest,TopChest +m_ClothBra_l_Top,Top +m_ClothTopBand,ClothTopBand +m_ClothTopBand_l_TopChest,TopChest +m_ClothTopBand_l_TopShoulders,TopShoulders +m_ClothTopBand_l_Top,Top +m_ClothTopBand_l_TopBandChest,TopBandChest +m_ClothTopBand_l_TopBandRimChest,TopBandRimChest +m_ClothTopBand_l_TopBand,TopBand +m_ClothTopBand_l_TopBandRim,TopBandRim +m_ClothBraBand,ClothBraBand +m_ClothBraBand_l_TopChest,TopChest +m_ClothBraBand_l_Top,Top +m_ClothBraBand_l_TopBandChest,TopBandChest +m_ClothBraBand_l_TopBandRimChest,TopBandRimChest +m_ClothBraBand_l_TopBand,TopBand +m_ClothBraBand_l_TopBandRim,TopBandRim +m_NinjaSkirt,NinjaSkirt +m_NinjaSkirt_l_Skirt,Skirt +m_NinjaSkirt_l_SkirtBand,SkirtBand +m_NinjaSkirt_l_SkirtOver,SkirtOver +m_NinjaSkirt_l_SkirtBandOver,SkirtBandOver +m_NinjaSockLeft,NinjaSockLeft +m_NinjaSockLeft_l_SockLeft,SockLeft +m_NinjaSockRight,NinjaSockRight +m_NinjaSockRight_l_SockRight,SockRight +m_NinjaThighLeft,NinjaThighLeft +m_NinjaThighLeft_l_ThighLeft,ThighLeft +m_NinjaThighRight,NinjaThighRight +m_NinjaThighRight_l_ThighRight,ThighRight +m_NinjaKneeLeft,NinjaKneeLeft +m_NinjaKneeLeft_l_KneeLeft,KneeLeft +m_NinjaKneeRight,NinjaKneeRight +m_NinjaKneeRight_l_KneeRight,KneeRight +m_NinjaSocks,NinjaSocks +m_NinjaSocks_l_SockLeft,SockLeft +m_NinjaSocks_l_SockRight,SockRight +m_NinjaThighs,NinjaThighs +m_NinjaThighs_l_ThighLeft,ThighLeft +m_NinjaThighs_l_ThighRight,ThighRight +m_NinjaKnees,NinjaKnees +m_NinjaKnees_l_KneeLeft,KneeLeft +m_NinjaKnees_l_KneeRight,KneeRight +m_NinjaShoes,NinjaShoes +m_NinjaShoes_l_ShoeLeft,ShoeLeft +m_NinjaShoes_l_ShoeRight,ShoeRight +m_NinjaShoes_l_ShoeRightKneel,ShoeRightKneel +m_NinjaShoes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_Ninja,Ninja +m_Ninja_l_TopChest,TopChest +m_Ninja_l_TopShoulders,TopShoulders +m_Ninja_l_Top,Top +m_Ninja_l_TopBandChest,TopBandChest +m_Ninja_l_TopBandRimChest,TopBandRimChest +m_Ninja_l_TopBand,TopBand +m_Ninja_l_TopBandRim,TopBandRim +m_Ninja_l_Skirt,Skirt +m_Ninja_l_SkirtBand,SkirtBand +m_Ninja_l_SkirtOver,SkirtOver +m_Ninja_l_SkirtBandOver,SkirtBandOver +m_Ninja_l_Collar,Collar +m_Ninja_l_CollarTag,CollarTag +m_Ninja_l_Belt,Belt +m_Ninja_l_BeltLines,BeltLines +m_Ninja_l_ThighLeft,ThighLeft +m_Ninja_l_ThighRight,ThighRight +m_Ninja_l_KneeLeft,KneeLeft +m_Ninja_l_KneeRight,KneeRight +m_Ninja_l_SockLeft,SockLeft +m_Ninja_l_SockRight,SockRight +m_Ninja_l_ShoeLeft,ShoeLeft +m_Ninja_l_ShoeRight,ShoeRight +m_Ninja_l_ShoeRightKneel,ShoeRightKneel +m_Ninja_l_ShoeLeftHogtie,ShoeLeftHogtie +m_FashionMaidGag,FashionMaidGag +m_FashionMaidGag_l_FrillyPanel,FrillyPanel +m_FashionMaidGag_l_FrillyStraps,FrillyStraps +m_FashionMaidGag_l_FrillyHardware,FrillyHardware +m_FashionMaidGag_l_FrillyHighlights,FrillyHighlights +m_FashionDusterGag,FashionDusterGag +m_FashionDusterGag_l_FrillyPanel,FrillyPanel +m_FashionDusterGag_l_FrillyStraps,FrillyStraps +m_FashionDusterGag_l_FrillyHardware,FrillyHardware +m_FashionDusterGag_l_FrillyHighlights,FrillyHighlights +m_FashionDusterGag_l_Duster,Duster +m_FashionBallGag,FashionBallGag +m_FashionBallGag_l_Ball,Ball +m_FashionBallGag_l_Strap,Strap +m_FashionBallGagHarness,FashionBallGagHarness +m_FashionBallGagHarness_l_Ball,Ball +m_FashionBallGagHarness_l_Strap,Strap +m_FashionBallGagHarness_l_Harness,Harness +m_FashionBallGagHarnessSecure,FashionBallGagHarnessSecure +m_FashionBallGagHarnessSecure_l_Ball,Ball +m_FashionBallGagHarnessSecure_l_Strap,Strap +m_FashionBallGagHarnessSecure_l_Harness,Harness +m_FashionBallGagHarnessSecure_l_SideStrap,SideStrap +m_FashionPanelGag,FashionPanelGag +m_FashionPanelGag_l_Panel,Panel +m_FashionPanelGag_l_Strap,Strap +m_FashionPanelGagHarness,FashionPanelGagHarness +m_FashionPanelGagHarness_l_Panel,Panel +m_FashionPanelGagHarness_l_Strap,Strap +m_FashionPanelGagHarness_l_Harness,Harness +m_FashionPanelGagHarnessSecure,FashionPanelGagHarnessSecure +m_FashionPanelGagHarnessSecure_l_Panel,Panel +m_FashionPanelGagHarnessSecure_l_Strap,Strap +m_FashionPanelGagHarnessSecure_l_Harness,Harness +m_FashionPanelGagHarnessSecure_l_SideStrap,SideStrap +m_FashionMuzzleGag,FashionMuzzleGag +m_FashionMuzzleGag_l_Muzzle,Muzzle +m_FashionMuzzleGag_l_Strap,Strap +m_FashionMuzzleGagHarness,FashionMuzzleGagHarness +m_FashionMuzzleGagHarness_l_Muzzle,Muzzle +m_FashionMuzzleGagHarness_l_Strap,Strap +m_FashionMuzzleGagHarness_l_Harness,Harness +m_FashionMuzzleGagHarnessSecure,FashionMuzzleGagHarnessSecure +m_FashionMuzzleGagHarnessSecure_l_Muzzle,Muzzle +m_FashionMuzzleGagHarnessSecure_l_Strap,Strap +m_FashionMuzzleGagHarnessSecure_l_Harness,Harness +m_FashionMuzzleGagHarnessSecure_l_SideStrap,SideStrap +m_FashionPlugMuzzleGag,FashionPlugMuzzleGag +m_FashionPlugMuzzleGag_l_Muzzle,Muzzle +m_FashionPlugMuzzleGag_l_Strap,Strap +m_FashionPlugMuzzleGag_l_Plug,Plug +m_FashionPlugMuzzleGagHarness,FashionPlugMuzzleGagHarness +m_FashionPlugMuzzleGagHarness_l_Muzzle,Muzzle +m_FashionPlugMuzzleGagHarness_l_Strap,Strap +m_FashionPlugMuzzleGagHarness_l_Harness,Harness +m_FashionPlugMuzzleGagHarness_l_Plug,Plug +m_FashionPlugMuzzleGagHarnessSecure,FashionPlugMuzzleGagHarnessSecure +m_FashionPlugMuzzleGagHarnessSecure_l_Muzzle,Muzzle +m_FashionPlugMuzzleGagHarnessSecure_l_Strap,Strap +m_FashionPlugMuzzleGagHarnessSecure_l_Harness,Harness +m_FashionPlugMuzzleGagHarnessSecure_l_SideStrap,SideStrap +m_FashionPlugMuzzleGagHarnessSecure_l_Plug,Plug +m_FashionPlugPanelGag,FashionPlugPanelGag +m_FashionPlugPanelGag_l_Panel,Panel +m_FashionPlugPanelGag_l_Strap,Strap +m_FashionPlugPanelGag_l_Plug,Plug +m_FashionPlugPanelGagHarness,FashionPlugPanelGagHarness +m_FashionPlugPanelGagHarness_l_Panel,Panel +m_FashionPlugPanelGagHarness_l_Strap,Strap +m_FashionPlugPanelGagHarness_l_Harness,Harness +m_FashionPlugPanelGagHarness_l_Plug,Plug +m_FashionPlugPanelGagHarnessSecure,FashionPlugPanelGagHarnessSecure +m_FashionPlugPanelGagHarnessSecure_l_Panel,Panel +m_FashionPlugPanelGagHarnessSecure_l_Strap,Strap +m_FashionPlugPanelGagHarnessSecure_l_Harness,Harness +m_FashionPlugPanelGagHarnessSecure_l_SideStrap,SideStrap +m_FashionPlugPanelGagHarnessSecure_l_Plug,Plug +m_FashionTapeCleave,FashionTapeCleave +m_FashionTapeCleave_l_Cleave,Cleave +m_FashionClothKnot,FashionClothKnot +m_FashionClothKnot_l_Knot,Knot +m_FashionClothCleaveThick,FashionClothCleaveThick +m_FashionClothCleaveThick_l_CleaveThick,CleaveThick +m_FashionClothCleave,FashionClothCleave +m_FashionClothCleave_l_Cleave,Cleave +m_FashionClothOTN,FashionClothOTN +m_FashionClothOTN_l_OTN,OTN +m_FashionClothOTM,FashionClothOTM +m_FashionClothOTM_l_OTM,OTM +m_GagLatexMute,GagLatexMute +m_GagLatexMute_l_OTNFlat,OTNFlat +m_GagLatexMute_l_MuteLogo,MuteLogo +m_GagLatexMuteHarness,GagLatexMuteHarness +m_GagLatexMuteHarness_l_OTNFlat,OTNFlat +m_GagLatexMuteHarness_l_MuteLogo,MuteLogo +m_GagLatexMuteHarness_l_Harness,Harness +m_GagLatexMuteHarnessSecure,GagLatexMuteHarnessSecure +m_GagLatexMuteHarnessSecure_l_OTNFlat,OTNFlat +m_GagLatexMuteHarnessSecure_l_MuteLogo,MuteLogo +m_GagLatexMuteHarnessSecure_l_Harness,Harness +m_GagLatexMuteHarnessSecure_l_SideStrap,SideStrap +m_FashionGagLatex,FashionGagLatex +m_FashionGagLatex_l_OTN,OTN +m_FashionGagLatexFlat,FashionGagLatexFlat +m_FashionGagLatexFlat_l_OTNFlat,OTNFlat +m_FashionGagLatexFlatHarness,FashionGagLatexFlatHarness +m_FashionGagLatexFlatHarness_l_OTNFlat,OTNFlat +m_FashionGagLatexFlatHarness_l_Harness,Harness +m_FashionGagLatexFlatHarnessSecure,FashionGagLatexFlatHarnessSecure +m_FashionGagLatexFlatHarnessSecure_l_OTNFlat,OTNFlat +m_FashionGagLatexFlatHarnessSecure_l_Harness,Harness +m_FashionGagLatexFlatHarnessSecure_l_SideStrap,SideStrap +m_FashionGagLatexMute,FashionGagLatexMute +m_FashionGagLatexMute_l_OTNFlat,OTNFlat +m_FashionGagLatexMute_l_MuteLogo,MuteLogo +m_FashionGagLatexMuteHarness,FashionGagLatexMuteHarness +m_FashionGagLatexMuteHarness_l_OTNFlat,OTNFlat +m_FashionGagLatexMuteHarness_l_MuteLogo,MuteLogo +m_FashionGagLatexMuteHarness_l_Harness,Harness +m_FashionGagLatexMuteHarnessSecure,FashionGagLatexMuteHarnessSecure +m_FashionGagLatexMuteHarnessSecure_l_OTNFlat,OTNFlat +m_FashionGagLatexMuteHarnessSecure_l_MuteLogo,MuteLogo +m_FashionGagLatexMuteHarnessSecure_l_Harness,Harness +m_FashionGagLatexMuteHarnessSecure_l_SideStrap,SideStrap +m_FashionGagLatexPlug,FashionGagLatexPlug +m_FashionGagLatexPlug_l_OTNFlat,OTNFlat +m_FashionGagLatexPlug_l_Plug,Plug +m_FashionGagLatexPlugHarness,FashionGagLatexPlugHarness +m_FashionGagLatexPlugHarness_l_OTNFlat,OTNFlat +m_FashionGagLatexPlugHarness_l_Plug,Plug +m_FashionGagLatexPlugHarness_l_Harness,Harness +m_FashionGagLatexPlugHarnessSecure,FashionGagLatexPlugHarnessSecure +m_FashionGagLatexPlugHarnessSecure_l_OTNFlat,OTNFlat +m_FashionGagLatexPlugHarnessSecure_l_Plug,Plug +m_FashionGagLatexPlugHarnessSecure_l_Harness,Harness +m_FashionGagLatexPlugHarnessSecure_l_SideStrap,SideStrap +m_FashionLatexNeckCorsetPlugGag,FashionLatexNeckCorsetPlugGag +m_FashionLatexNeckCorsetPlugGag_l_NeckCorset,NeckCorset +m_FashionLatexNeckCorsetPlugGag_l_NeckCorsetRim,NeckCorsetRim +m_FashionLatexNeckCorsetPlugGag_l_OTNFlat,OTNFlat +m_FashionLatexNeckCorsetPlugGag_l_Plug,Plug +m_FashionKittyHarnessPanelGag,FashionKittyHarnessPanelGag +m_FashionKittyHarnessPanelGag_l_Panel,Panel +m_FashionKittyHarnessPanelGag_l_Strap,Strap +m_FashionKittyHarnessPanelGag_l_Harness,Harness +m_FashionKittyHarnessPanelGag_l_SideStrap,SideStrap +m_FashionKittyHarnessPanelGag_l_KittyMouth,KittyMouth +m_FashionSmoothBallGag,FashionSmoothBallGag +m_FashionSmoothBallGag_l_Ball,Ball +m_FashionSmoothBallGag_l_Strap,Strap +m_FashionSegmentedLargePanelGag,FashionSegmentedLargePanelGag +m_FashionSegmentedLargePanelGag_l_Panel,Panel +m_FashionSegmentedLargePanelGag_l_Strap,Strap +m_FashionSegmentedLargePanelGag_l_Mask,Mask +m_FashionSegmentedLargePanelGagHarness,FashionSegmentedLargePanelGagHarness +m_FashionSegmentedLargePanelGagHarness_l_Panel,Panel +m_FashionSegmentedLargePanelGagHarness_l_Strap,Strap +m_FashionSegmentedLargePanelGagHarness_l_Mask,Mask +m_FashionSegmentedLargePanelGagHarness_l_Harness,Harness +m_FashionSciFiPanelGag,FashionSciFiPanelGag +m_FashionSciFiPanelGag_l_Panel,Panel +m_FashionSciFiPanelGag_l_Strap,Strap +m_FashionSciFiPanelGag_l_Mask,Mask +m_FashionSciFiPanelGag_l_Harness,Harness +m_FashionSciFiPanelGag_l_TopRim,TopRim +m_FashionSciFiPanelGag_l_Display,Display +m_FashionAdvancedSciFiPanelGag,FashionAdvancedSciFiPanelGag +m_FashionAdvancedSciFiPanelGag_l_Panel,Panel +m_FashionAdvancedSciFiPanelGag_l_Strap,Strap +m_FashionAdvancedSciFiPanelGag_l_Mask,Mask +m_FashionAdvancedSciFiPanelGag_l_Harness,Harness +m_FashionAdvancedSciFiPanelGag_l_TopRim,TopRim +m_FashionAdvancedSciFiPanelGag_l_Display,Display +m_FashionAdvancedSciFiPanelGag_l_HarnessRim,HarnessRim +m_FashionAdvancedSciFiPanelGag_l_HarnessDisplay,HarnessDisplay +m_FashionUltimateSciFiPanelGag,FashionUltimateSciFiPanelGag +m_FashionUltimateSciFiPanelGag_l_Panel,Panel +m_FashionUltimateSciFiPanelGag_l_Strap,Strap +m_FashionUltimateSciFiPanelGag_l_Mask,Mask +m_FashionUltimateSciFiPanelGag_l_Harness,Harness +m_FashionUltimateSciFiPanelGag_l_TopRim,TopRim +m_FashionUltimateSciFiPanelGag_l_Display,Display +m_FashionUltimateSciFiPanelGag_l_HarnessRim,HarnessRim +m_FashionUltimateSciFiPanelGag_l_HarnessDisplay,HarnessDisplay +m_FashionUltimateSciFiPanelGag_l_Muzzle,Muzzle +m_FashionUltimateSciFiPanelGag2,FashionUltimateSciFiPanelGag2 +m_FashionUltimateSciFiPanelGag2_l_Panel,Panel +m_FashionUltimateSciFiPanelGag2_l_Strap,Strap +m_FashionUltimateSciFiPanelGag2_l_Mask,Mask +m_FashionUltimateSciFiPanelGag2_l_Harness,Harness +m_FashionUltimateSciFiPanelGag2_l_TopRim,TopRim +m_FashionUltimateSciFiPanelGag2_l_Display,Display +m_FashionUltimateSciFiPanelGag2_l_HarnessRim,HarnessRim +m_FashionUltimateSciFiPanelGag2_l_HarnessDisplay,HarnessDisplay +m_FashionUltimateSciFiPanelGag2_l_Muzzle,Muzzle +m_FashionSegmentedPlugGag,FashionSegmentedPlugGag +m_FashionSegmentedPlugGag_l_Panel,Panel +m_FashionSegmentedPlugGag_l_Strap,Strap +m_FashionSegmentedPlugGag_l_Mask,Mask +m_FashionSegmentedPlugGag_l_Plug,Plug +m_FashionSciFiPlugMuzzle,FashionSciFiPlugMuzzle +m_FashionSciFiPlugMuzzle_l_HarnessRim,HarnessRim +m_FashionSciFiPlugMuzzle_l_HarnessDisplay,HarnessDisplay +m_FashionSciFiPlugMuzzle_l_Muzzle,Muzzle +m_FashionSciFiPlugMuzzle_l_Plug,Plug +m_FashionAdvancedSciFiPlugMuzzle,FashionAdvancedSciFiPlugMuzzle +m_FashionAdvancedSciFiPlugMuzzle_l_HarnessRim,HarnessRim +m_FashionAdvancedSciFiPlugMuzzle_l_HarnessDisplay,HarnessDisplay +m_FashionAdvancedSciFiPlugMuzzle_l_Muzzle,Muzzle +m_FashionAdvancedSciFiPlugMuzzle_l_Mask,Mask +m_FashionAdvancedSciFiPlugMuzzle_l_Plug,Plug +m_DivineGag,DivineGag +m_DivineGag_l_Ball,Ball +m_DivineGag_l_Teeth,Teeth +m_DivineGag_l_Harness,Harness +m_DivineGag_l_Gold,Gold +m_DivineGag_l_Metallic,Metallic +m_FashionDivineGag,FashionDivineGag +m_FashionDivineGag_l_Ball,Ball +m_FashionDivineGag_l_Teeth,Teeth +m_FashionDivineGag_l_Harness,Harness +m_FashionDivineGag_l_Gold,Gold +m_FashionDivineGag_l_Metallic,Metallic +m_DivineGagClean,DivineGagClean +m_DivineGagClean_l_Ball,Ball +m_DivineGagClean_l_Teeth,Teeth +m_DivineGagClean_l_Harness,Harness +m_DivineGagClean_l_GoldClean,GoldClean +m_DivineGagClean_l_Metallic,Metallic +m_FashionDivineGagClean,FashionDivineGagClean +m_FashionDivineGagClean_l_Ball,Ball +m_FashionDivineGagClean_l_Teeth,Teeth +m_FashionDivineGagClean_l_Harness,Harness +m_FashionDivineGagClean_l_GoldClean,GoldClean +m_FashionDivineGagClean_l_Metallic,Metallic +m_DivineMuzzle,DivineMuzzle +m_DivineMuzzle_l_Muzzle,Muzzle +m_DivineMuzzle_l_MuzzleRim,MuzzleRim +m_DivineMuzzle_l_MuzzleGold,MuzzleGold +m_DivineMuzzle_l_MuzzleHarness,MuzzleHarness +m_DivineMuzzle_l_MuzzleCollar,MuzzleCollar +m_FashionDivineMuzzle,FashionDivineMuzzle +m_FashionDivineMuzzle_l_Muzzle,Muzzle +m_FashionDivineMuzzle_l_MuzzleRim,MuzzleRim +m_FashionDivineMuzzle_l_MuzzleGold,MuzzleGold +m_FashionDivineMuzzle_l_MuzzleHarness,MuzzleHarness +m_FashionDivineMuzzle_l_MuzzleCollar,MuzzleCollar +m_DivineMuzzleClean,DivineMuzzleClean +m_DivineMuzzleClean_l_Muzzle,Muzzle +m_DivineMuzzleClean_l_MuzzleRim,MuzzleRim +m_DivineMuzzleClean_l_MuzzleGoldClean,MuzzleGoldClean +m_DivineMuzzleClean_l_MuzzleHarness,MuzzleHarness +m_DivineMuzzleClean_l_MuzzleCollar,MuzzleCollar +m_FashionDivineMuzzleClean,FashionDivineMuzzleClean +m_FashionDivineMuzzleClean_l_Muzzle,Muzzle +m_FashionDivineMuzzleClean_l_MuzzleRim,MuzzleRim +m_FashionDivineMuzzleClean_l_MuzzleGoldClean,MuzzleGoldClean +m_FashionDivineMuzzleClean_l_MuzzleHarness,MuzzleHarness +m_FashionDivineMuzzleClean_l_MuzzleCollar,MuzzleCollar +m_FutureBox,FutureBox +m_FutureBox_l_Rim,Rim +m_FutureBox_l_Display,Display +m_FutureBox_l_Lock,Lock +m_FutureBox_l_Door,Door +m_FutureBox_l_DoorWindow,DoorWindow +m_FutureBox_l_DoorNumeral,DoorNumeral +m_FutureBox_l_BackFade,BackFade +m_FutureBox_l_Back,Back +m_CrystalEncase,CrystalEncase +m_CrystalEncase_l_EncaseOver,EncaseOver +m_CrystalEncase_l_EncaseUnder,EncaseUnder +m_FashionLeash,FashionLeash +m_FashionLeash_l_Leash,Leash +m_Petsuit_l_ArmsBelts,ArmsBelts +m_Petsuit_l_LegsBelts,LegsBelts +m_Petsuit_l_LeftLegsBelts,LeftLegsBelts +m_ElitePetsuit,ElitePetsuit +m_ElitePetsuit_l_Arms,Arms +m_ElitePetsuit_l_ArmsBelts,ArmsBelts +m_ElitePetsuit_l_ArmsLaces,ArmsLaces +m_ElitePetsuit_l_ArmsHardware,ArmsHardware +m_ElitePetsuit_l_Legs,Legs +m_ElitePetsuit_l_LegsLaces,LegsLaces +m_ElitePetsuit_l_LegsHardware,LegsHardware +m_ElitePetsuit_l_LegsBelts,LegsBelts +m_ElitePetsuit_l_LeftLegs,LeftLegs +m_ElitePetsuit_l_LeftLegsBelts,LeftLegsBelts +m_ElitePetsuit_l_LeftLegsLaces,LeftLegsLaces +m_ElitePetsuit_l_LeftLegsHardware,LeftLegsHardware +m_CyberPetsuit,CyberPetsuit +m_CyberPetsuit_l_Arms,Arms +m_CyberPetsuit_l_ArmsBelts,ArmsBelts +m_CyberPetsuit_l_DisplayArms,DisplayArms +m_CyberPetsuit_l_Legs,Legs +m_CyberPetsuit_l_DisplayLegs,DisplayLegs +m_CyberPetsuit_l_LegsBelts,LegsBelts +m_CyberPetsuit_l_LeftLegs,LeftLegs +m_CyberPetsuit_l_LeftLegsBelts,LeftLegsBelts +m_CyberPetsuit_l_DisplayLeftLegs,DisplayLeftLegs +m_NippleClamps,NippleClamps +m_NippleClamps_l_Clamps,Clamps +m_NippleClamps_l_ClampsBullet,ClampsBullet +m_NippleClampsRestraint,NippleClampsRestraint +m_NippleClampsRestraint_l_Clamps,Clamps +m_NippleClampsRestraint_l_ClampsBullet,ClampsBullet +m_RingVibes,RingVibes +m_RingVibes_l_Rings,Rings +m_RingVibes_l_RingsBullet,RingsBullet +m_RingVibesRestraint,RingVibesRestraint +m_RingVibesRestraint_l_Rings,Rings +m_RingVibesRestraint_l_RingsBullet,RingsBullet +m_NippleWeights,NippleWeights +m_NippleWeights_l_Weights,Weights +m_NippleWeightsRestraint,NippleWeightsRestraint +m_NippleWeightsRestraint_l_Weights,Weights +m_VibePiercings,VibePiercings +m_VibePiercings_l_VibePiercings,VibePiercings +m_VibePiercings_l_VibePiercingsBullet,VibePiercingsBullet +m_VibePiercings_l_Clamps,Clamps +m_VibePiercings_l_ClampsBullet,ClampsBullet +m_VibePiercingsRestraint,VibePiercingsRestraint +m_VibePiercingsRestraint_l_VibePiercings,VibePiercings +m_VibePiercingsRestraint_l_VibePiercingsBullet,VibePiercingsBullet +m_VibePiercingsRestraint_l_Clamps,Clamps +m_VibePiercingsRestraint_l_ClampsBullet,ClampsBullet +m_PostureCollarBasic,PostureCollarBasic +m_PostureCollarBasic_l_PostureCollar,PostureCollar +m_PostureCollarBasic_l_PostureCollarRim,PostureCollarRim +m_PostureCollar,PostureCollar +m_PostureCollar_l_PostureCollar,PostureCollar +m_PostureCollar_l_PostureCollarRim,PostureCollarRim +m_PostureCollar_l_PostureCollarLoop,PostureCollarLoop +m_PostureCollar_l_PostureCollarHardware,PostureCollarHardware +m_FashionPostureCollarBasic,FashionPostureCollarBasic +m_FashionPostureCollarBasic_l_PostureCollar,PostureCollar +m_FashionPostureCollarBasic_l_PostureCollarRim,PostureCollarRim +m_FashionPostureCollar,FashionPostureCollar +m_FashionPostureCollar_l_PostureCollar,PostureCollar +m_FashionPostureCollar_l_PostureCollarRim,PostureCollarRim +m_FashionPostureCollar_l_PostureCollarLoop,PostureCollarLoop +m_FashionPostureCollar_l_PostureCollarHardware,PostureCollarHardware +m_ReverseBinder,ReverseBinder +m_ReverseBinder_l_ReverseBinderLeft,ReverseBinderLeft +m_ReverseBinder_l_ReverseBinderRight,ReverseBinderRight +m_ReverseBinder_l_ReverseBinderStraps,ReverseBinderStraps +m_ReverseBinder_l_ReverseBinderHardware,ReverseBinderHardware +m_NightWhip,NightWhip +m_NightWhip_l_NightWhip,NightWhip +m_NightWhip_l_NightWhipLight,NightWhipLight +m_LatexWhip,LatexWhip +m_LatexWhip_l_LatexWhip,LatexWhip +m_KittyLatexEar,KittyLatexEar +m_KittyLatexEar_l_KittyLatexEar,KittyLatexEar +m_KittyLatexEar_l_KittyLatexEarLight,KittyLatexEarLight +m_KittyLatexEar_l_KittyLatexEarMuff,KittyLatexEarMuff +m_KittyLatexEar_l_KittyLatexEarMuffLight2,KittyLatexEarMuffLight2 +m_KittyLatexEar_l_KittyLatexEarMuffLight1,KittyLatexEarMuffLight1 +m_KittyLatexTail,KittyLatexTail +m_KittyLatexTail_l_KittyLatexTail,KittyLatexTail +m_KittyLatexTail_l_KittyLatexTailLight,KittyLatexTailLight +m_KittyLatexTail2,KittyLatexTail2 +m_KittyLatexTail2_l_KittyLatexTail,KittyLatexTail +m_KittyLatexTail2_l_KittyLatexTail2,KittyLatexTail2 +m_KittyLatexTail2_l_KittyLatexTailLight,KittyLatexTailLight +m_KittyLatexTail2_l_KittyLatexTail2Light,KittyLatexTail2Light +m_KittyLatex,KittyLatex +m_KittyLatex_l_KittyLatexEar,KittyLatexEar +m_KittyLatex_l_KittyLatexEarLight,KittyLatexEarLight +m_KittyLatex_l_KittyLatexEarMuff,KittyLatexEarMuff +m_KittyLatex_l_KittyLatexEarMuffLight2,KittyLatexEarMuffLight2 +m_KittyLatex_l_KittyLatexEarMuffLight1,KittyLatexEarMuffLight1 +m_KittyLatex_l_KittyLatexTail,KittyLatexTail +m_KittyLatex_l_KittyLatexTailLight,KittyLatexTailLight +m_KittyLatex_l_KittyLatexTail2,KittyLatexTail2 +m_KittyLatex_l_KittyLatexTail2Light,KittyLatexTail2Light +m_SuccubusWing,SuccubusWing +m_SuccubusWing_l_SuccubusWingBase,SuccubusWingBase +m_SuccubusWing_l_SuccubusWingBack,SuccubusWingBack +m_SuccubusWing_l_SuccubusWingLight,SuccubusWingLight +m_SuccubusHorn,SuccubusHorn +m_SuccubusHorn_l_SuccubusHornRight,SuccubusHornRight +m_SuccubusHorn_l_SuccubusHornLeft,SuccubusHornLeft +m_SuccubusHorn_l_SuccubusHornLight,SuccubusHornLight +m_SuccubusTail,SuccubusTail +m_SuccubusTail_l_SuccubusTail,SuccubusTail +m_SuccubusTail_l_SuccubusTailLight,SuccubusTailLight +m_SuccubusClaws,SuccubusClaws +m_SuccubusClaws_l_SuccubusClawLeft,SuccubusClawLeft +m_SuccubusClaws_l_SuccubusClawRight,SuccubusClawRight +m_SuccubusFeet,SuccubusFeet +m_SuccubusFeet_l_SockLeft,SockLeft +m_SuccubusFeet_l_FootSockLeftHogtie,FootSockLeftHogtie +m_SuccubusFeet_l_SockRight,SockRight +m_SuccubusFeet_l_FootSockRightKneel,FootSockRightKneel +m_Succubus,Succubus +m_Succubus_l_SuccubusHornRight,SuccubusHornRight +m_Succubus_l_SuccubusHornLeft,SuccubusHornLeft +m_Succubus_l_SuccubusHornLight,SuccubusHornLight +m_Succubus_l_SuccubusTail,SuccubusTail +m_Succubus_l_SuccubusTailLight,SuccubusTailLight +m_Succubus_l_SuccubusWingBase,SuccubusWingBase +m_Succubus_l_SuccubusWingBack,SuccubusWingBack +m_Succubus_l_SuccubusWingLight,SuccubusWingLight +m_Succubus_l_SuccubusClawLeft,SuccubusClawLeft +m_Succubus_l_SuccubusClawRight,SuccubusClawRight +m_Succubus_l_SockLeft,SockLeft +m_Succubus_l_FootSockLeftHogtie,FootSockLeftHogtie +m_Succubus_l_SockRight,SockRight +m_Succubus_l_FootSockRightKneel,FootSockRightKneel +m_Bubble,Bubble +m_Bubble_l_Bubble,Bubble +m_SlimeBubble,SlimeBubble +m_SlimeBubble_l_Bubble,Bubble +m_BubbleSquishy,BubbleSquishy +m_BubbleSquishy_l_BubbleSquishy,BubbleSquishy +m_BubbleSquishy_l_BubbleSquishyBack,BubbleSquishyBack +m_LatexSphere,LatexSphere +m_LatexSphere_l_LatexSphere,LatexSphere +m_LatexSphere_l_LatexSphereCutaway,LatexSphereCutaway +m_LatexSphere_l_LatexSphereCutawayBack,LatexSphereCutawayBack +m_BallSuit,BallSuit +m_BallSuit_l_BallSuit,BallSuit +m_BubbleHead,BubbleHead +m_BubbleHead_l_Head,Head +m_FashionBubbleHead,FashionBubbleHead +m_FashionBubbleHead_l_Head,Head +m_BubbleArms,BubbleArms +m_BubbleArms_l_Arms,Arms +m_BubbleLegs,BubbleLegs +m_BubbleLegs_l_Legs,Legs +m_FashionBubbleLegs,FashionBubbleLegs +m_FashionBubbleLegs_l_Legs,Legs + + +m_Hair5_Highlight_l_Hair5_FrontE,Hair5_FrontE +m_BlankEyes,BlankEyes +m_BlankEyes_l_Eyes,Eyes +m_BlankEyes_l_Eyes2,Eyes2 +m_BlankEyes_l_Whites,Whites +m_BlankEyes_l_Whites2,Whites2 +m_DaiBrows1,DaiBrows1 +m_DaiBrows1_l_Brows,Brows +m_DaiBrows1_l_Brows2,Brows2 +m_DaiBrows2,DaiBrows2 +m_DaiBrows2_l_Brows,Brows +m_DaiBrows2_l_Brows2,Brows2 +m_Glabella,Glabella +m_Glabella_l_Ridge,Ridge +m_Bra,Bra +m_Bra_l_Bra,Bra +m_Bra_l_BraRim,BraRim +m_Bra_l_InnerLines,InnerLines +m_Bra_l_BraUnder,BraUnder +m_Bra_l_BraUnderRim,BraUnderRim +m_BraStriped,BraStriped +m_BraStriped_l_Bra,Bra +m_BraStriped_l_BraRim,BraRim +m_BraStriped_l_InnerLines,InnerLines +m_BraStriped_l_BraUnder,BraUnder +m_BraStriped_l_BraUnderRim,BraUnderRim +m_BraStriped_l_Stripes,Stripes +m_BraCherry,BraCherry +m_BraCherry_l_Bra,Bra +m_BraCherry_l_BraRim,BraRim +m_BraCherry_l_InnerLines,InnerLines +m_BraCherry_l_BraUnder,BraUnder +m_BraCherry_l_BraUnderRim,BraUnderRim +m_BraCherry_l_Cherry,Cherry +m_BraRose,BraRose +m_BraRose_l_Bra,Bra +m_BraRose_l_BraRim,BraRim +m_BraRose_l_InnerLines,InnerLines +m_BraRose_l_BraUnder,BraUnder +m_BraRose_l_BraUnderRim,BraUnderRim +m_BraRose_l_Rose,Rose +m_BraInvertedRose,BraInvertedRose +m_BraInvertedRose_l_Bra,Bra +m_BraInvertedRose_l_BraRim,BraRim +m_BraInvertedRose_l_InnerLines,InnerLines +m_BraInvertedRose_l_BraUnder,BraUnder +m_BraInvertedRose_l_BraUnderRim,BraUnderRim +m_BraInvertedRose_l_InvertedRose,InvertedRose +m_BraStraps,BraStraps +m_BraStraps_l_Straps,Straps +m_Panties,Panties +m_Panties_l_Base,Base +m_Panties_l_Lines,Lines +m_PantiesBow,PantiesBow +m_PantiesBow_l_Bow,Bow +m_PantiesStriped,PantiesStriped +m_PantiesStriped_l_Base,Base +m_PantiesStriped_l_Lines,Lines +m_PantiesStriped_l_Stripes,Stripes +m_PantiesInvertedRose,PantiesInvertedRose +m_PantiesInvertedRose_l_Base,Base +m_PantiesInvertedRose_l_Lines,Lines +m_PantiesInvertedRose_l_InvertedRose,InvertedRose +m_PantiesCherry,PantiesCherry +m_PantiesCherry_l_Base,Base +m_PantiesCherry_l_Lines,Lines +m_PantiesCherry_l_Cherry,Cherry +m_PantiesBowStriped,PantiesBowStriped +m_PantiesBowStriped_l_Base,Base +m_PantiesBowStriped_l_Lines,Lines +m_PantiesBowStriped_l_Bow,Bow +m_PantiesBowStriped_l_Stripes,Stripes +m_PantiesHigh,PantiesHigh +m_PantiesHigh_l_Base,Base +m_PantiesHigh_l_Lines,Lines +m_PantiesHighStriped,PantiesHighStriped +m_PantiesHighStriped_l_Base,Base +m_PantiesHighStriped_l_Lines,Lines +m_PantiesHighStriped_l_Stripes,Stripes +m_SwimsuitRestraint,SwimsuitRestraint +m_SwimsuitRestraint_l_Swimsuit,Swimsuit +m_SwimsuitRestraint_l_SwimsuitChest,SwimsuitChest +m_DressBlouseSleeveRight_l_BlouseShoulderRight,BlouseShoulderRight +m_DressBlouseSleeves_l_BlouseShoulderRight,BlouseShoulderRight +m_DressBlouse_l_BlouseShoulderRight,BlouseShoulderRight +m_Dress_l_BlouseShoulderRight,BlouseShoulderRight +m_SlayerCollar,SlayerCollar +m_SlayerCollar_l_CapeCollar,CapeCollar +m_SlayerCollar_l_CapeCollarButton,CapeCollarButton +m_SlayerCollar_l_CapeCollarRim,CapeCollarRim +m_SlayerCape,SlayerCape +m_SlayerCape_l_CapeCollar,CapeCollar +m_SlayerCape_l_CapeCollarButton,CapeCollarButton +m_SlayerCape_l_CapeCollarRim,CapeCollarRim +m_SlayerCape_l_CapeCollarInner,CapeCollarInner +m_SlayerCape_l_Cape,Cape +m_SlayerCape_l_CapeStripe,CapeStripe +m_SlayerCape_l_CapeShoulderLeft,CapeShoulderLeft +m_SlayerCape_l_CapeShoulderRight,CapeShoulderRight +m_SlayerCape_l_CapeShoulderLeftButton,CapeShoulderLeftButton +m_SlayerCape_l_CapeShoulderRightButton,CapeShoulderRightButton +m_SlayerCape_l_CapeBack,CapeBack +m_LeatherMask,LeatherMask +m_LeatherMask_l_Hood,Hood +m_LeatherMask_l_Gag,Gag +m_LeatherMask_l_Blindfold,Blindfold +m_FashionLeatherMask,FashionLeatherMask +m_FashionLeatherMask_l_Hood,Hood +m_FashionLeatherMask_l_Gag,Gag +m_FashionLeatherMask_l_Blindfold,Blindfold +m_LeatherHood,LeatherHood +m_LeatherHood_l_Hood,Hood +m_LeatherHood_l_Gag,Gag +m_LeatherHood_l_Blindfold,Blindfold +m_LeatherHood_l_WolfEars,WolfEars +m_LeatherHood_l_KittyEars,KittyEars +m_LeatherHood_l_BunnyEars,BunnyEars +m_FashionLeatherHood,FashionLeatherHood +m_FashionLeatherHood_l_Hood,Hood +m_FashionLeatherHood_l_Gag,Gag +m_FashionLeatherHood_l_Blindfold,Blindfold +m_FashionLeatherHood_l_WolfEars,WolfEars +m_FashionLeatherHood_l_KittyEars,KittyEars +m_FashionLeatherHood_l_BunnyEars,BunnyEars +m_CyberLongMittenLeft,CyberLongMittenLeft +m_CyberLongMittenLeft_l_CapForeLongMittenLeft,CapForeLongMittenLeft +m_CyberLongMittenLeft_l_CapLongMittenLeft,CapLongMittenLeft +m_CyberLongMittenLeft_l_LongMittenLeft,LongMittenLeft +m_CyberLongMittenLeft_l_ForeLongMittenLeft,ForeLongMittenLeft +m_CyberLongMittenLeft_l_CuffForeLongMittenLeft,CuffForeLongMittenLeft +m_CyberLongMittenLeft_l_CuffLongMittenLeft,CuffLongMittenLeft +m_CyberLongMittenLeft_l_DisplayForeLongMittenLeft,DisplayForeLongMittenLeft +m_CyberLongMittenLeft_l_DisplayLongMittenLeft,DisplayLongMittenLeft +m_CyberLongMittenLeft_l_LockForeLongMittenLeft,LockForeLongMittenLeft +m_CyberLongMittenLeft_l_LockLongMittenLeft,LockLongMittenLeft +m_CyberLongMittenLeft_l_GlowForeLongMittenLeft,GlowForeLongMittenLeft +m_CyberLongMittenLeft_l_GlowLongMittenLeft,GlowLongMittenLeft +m_CyberLongMittenLeft_l_StrapsForeLongMittenLeft,StrapsForeLongMittenLeft +m_CyberLongMittenLeft_l_StrapsLongMittenLeft,StrapsLongMittenLeft +m_CyberLongMittenLeft_l_UpperCuffLongMittenLeft,UpperCuffLongMittenLeft +m_CyberLongMittenLeft_l_UpperDisplayLongMittenLeft,UpperDisplayLongMittenLeft +m_CyberLongMittenLeft_l_UpperLockLongMittenLeft,UpperLockLongMittenLeft +m_CyberLongMittenLeft_l_UpperGlowLongMittenLeft,UpperGlowLongMittenLeft +m_CyberLongMittenRight,CyberLongMittenRight +m_CyberLongMittenRight_l_CapForeLongMittenRight,CapForeLongMittenRight +m_CyberLongMittenRight_l_CapLongMittenRight,CapLongMittenRight +m_CyberLongMittenRight_l_LongMittenRight,LongMittenRight +m_CyberLongMittenRight_l_ForeLongMittenRight,ForeLongMittenRight +m_CyberLongMittenRight_l_CuffForeLongMittenRight,CuffForeLongMittenRight +m_CyberLongMittenRight_l_CuffLongMittenRight,CuffLongMittenRight +m_CyberLongMittenRight_l_DisplayForeLongMittenRight,DisplayForeLongMittenRight +m_CyberLongMittenRight_l_DisplayLongMittenRight,DisplayLongMittenRight +m_CyberLongMittenRight_l_LockForeLongMittenRight,LockForeLongMittenRight +m_CyberLongMittenRight_l_LockLongMittenRight,LockLongMittenRight +m_CyberLongMittenRight_l_GlowForeLongMittenRight,GlowForeLongMittenRight +m_CyberLongMittenRight_l_GlowLongMittenRight,GlowLongMittenRight +m_CyberLongMittenRight_l_StrapsForeLongMittenRight,StrapsForeLongMittenRight +m_CyberLongMittenRight_l_StrapsLongMittenRight,StrapsLongMittenRight +m_CyberLongMittenRight_l_UpperCuffLongMittenRight,UpperCuffLongMittenRight +m_CyberLongMittenRight_l_UpperDisplayLongMittenRight,UpperDisplayLongMittenRight +m_CyberLongMittenRight_l_UpperLockLongMittenRight,UpperLockLongMittenRight +m_CyberLongMittenRight_l_UpperGlowLongMittenRight,UpperGlowLongMittenRight +m_CyberLongMittens,CyberLongMittens +m_CyberLongMittens_l_CapForeLongMittenLeft,CapForeLongMittenLeft +m_CyberLongMittens_l_CapLongMittenLeft,CapLongMittenLeft +m_CyberLongMittens_l_LongMittenLeft,LongMittenLeft +m_CyberLongMittens_l_ForeLongMittenLeft,ForeLongMittenLeft +m_CyberLongMittens_l_CuffForeLongMittenLeft,CuffForeLongMittenLeft +m_CyberLongMittens_l_CuffLongMittenLeft,CuffLongMittenLeft +m_CyberLongMittens_l_DisplayForeLongMittenLeft,DisplayForeLongMittenLeft +m_CyberLongMittens_l_DisplayLongMittenLeft,DisplayLongMittenLeft +m_CyberLongMittens_l_LockForeLongMittenLeft,LockForeLongMittenLeft +m_CyberLongMittens_l_LockLongMittenLeft,LockLongMittenLeft +m_CyberLongMittens_l_GlowForeLongMittenLeft,GlowForeLongMittenLeft +m_CyberLongMittens_l_GlowLongMittenLeft,GlowLongMittenLeft +m_CyberLongMittens_l_StrapsForeLongMittenLeft,StrapsForeLongMittenLeft +m_CyberLongMittens_l_StrapsLongMittenLeft,StrapsLongMittenLeft +m_CyberLongMittens_l_UpperCuffLongMittenLeft,UpperCuffLongMittenLeft +m_CyberLongMittens_l_UpperDisplayLongMittenLeft,UpperDisplayLongMittenLeft +m_CyberLongMittens_l_UpperLockLongMittenLeft,UpperLockLongMittenLeft +m_CyberLongMittens_l_UpperGlowLongMittenLeft,UpperGlowLongMittenLeft +m_CyberLongMittens_l_CapForeLongMittenRight,CapForeLongMittenRight +m_CyberLongMittens_l_CapLongMittenRight,CapLongMittenRight +m_CyberLongMittens_l_LongMittenRight,LongMittenRight +m_CyberLongMittens_l_ForeLongMittenRight,ForeLongMittenRight +m_CyberLongMittens_l_CuffForeLongMittenRight,CuffForeLongMittenRight +m_CyberLongMittens_l_CuffLongMittenRight,CuffLongMittenRight +m_CyberLongMittens_l_DisplayForeLongMittenRight,DisplayForeLongMittenRight +m_CyberLongMittens_l_DisplayLongMittenRight,DisplayLongMittenRight +m_CyberLongMittens_l_LockForeLongMittenRight,LockForeLongMittenRight +m_CyberLongMittens_l_LockLongMittenRight,LockLongMittenRight +m_CyberLongMittens_l_GlowForeLongMittenRight,GlowForeLongMittenRight +m_CyberLongMittens_l_GlowLongMittenRight,GlowLongMittenRight +m_CyberLongMittens_l_StrapsForeLongMittenRight,StrapsForeLongMittenRight +m_CyberLongMittens_l_StrapsLongMittenRight,StrapsLongMittenRight +m_CyberLongMittens_l_UpperCuffLongMittenRight,UpperCuffLongMittenRight +m_CyberLongMittens_l_UpperDisplayLongMittenRight,UpperDisplayLongMittenRight +m_CyberLongMittens_l_UpperLockLongMittenRight,UpperLockLongMittenRight +m_CyberLongMittens_l_UpperGlowLongMittenRight,UpperGlowLongMittenRight +m_CyberMittenLeft,CyberMittenLeft +m_CyberMittenLeft_l_MittenLeft,MittenLeft +m_CyberMittenLeft_l_ForeMittenLeft,ForeMittenLeft +m_CyberMittenLeft_l_CuffForeLongMittenLeft,CuffForeLongMittenLeft +m_CyberMittenLeft_l_CuffLongMittenLeft,CuffLongMittenLeft +m_CyberMittenLeft_l_DisplayForeLongMittenLeft,DisplayForeLongMittenLeft +m_CyberMittenLeft_l_DisplayLongMittenLeft,DisplayLongMittenLeft +m_CyberMittenLeft_l_LockForeLongMittenLeft,LockForeLongMittenLeft +m_CyberMittenLeft_l_LockLongMittenLeft,LockLongMittenLeft +m_CyberMittenLeft_l_GlowForeLongMittenLeft,GlowForeLongMittenLeft +m_CyberMittenLeft_l_GlowLongMittenLeft,GlowLongMittenLeft +m_CyberMittenLeft_l_CapForeLongMittenLeft,CapForeLongMittenLeft +m_CyberMittenLeft_l_CapLongMittenLeft,CapLongMittenLeft +m_CyberMittenRight,CyberMittenRight +m_CyberMittenRight_l_MittenRight,MittenRight +m_CyberMittenRight_l_ForeMittenRight,ForeMittenRight +m_CyberMittenRight_l_CuffForeLongMittenRight,CuffForeLongMittenRight +m_CyberMittenRight_l_CuffLongMittenRight,CuffLongMittenRight +m_CyberMittenRight_l_DisplayForeLongMittenRight,DisplayForeLongMittenRight +m_CyberMittenRight_l_DisplayLongMittenRight,DisplayLongMittenRight +m_CyberMittenRight_l_LockForeLongMittenRight,LockForeLongMittenRight +m_CyberMittenRight_l_LockLongMittenRight,LockLongMittenRight +m_CyberMittenRight_l_GlowForeLongMittenRight,GlowForeLongMittenRight +m_CyberMittenRight_l_GlowLongMittenRight,GlowLongMittenRight +m_CyberMittenRight_l_CapForeLongMittenRight,CapForeLongMittenRight +m_CyberMittenRight_l_CapLongMittenRight,CapLongMittenRight +m_CyberMittens,CyberMittens +m_CyberMittens_l_MittenLeft,MittenLeft +m_CyberMittens_l_ForeMittenLeft,ForeMittenLeft +m_CyberMittens_l_CuffForeLongMittenLeft,CuffForeLongMittenLeft +m_CyberMittens_l_CuffLongMittenLeft,CuffLongMittenLeft +m_CyberMittens_l_DisplayForeLongMittenLeft,DisplayForeLongMittenLeft +m_CyberMittens_l_DisplayLongMittenLeft,DisplayLongMittenLeft +m_CyberMittens_l_LockForeLongMittenLeft,LockForeLongMittenLeft +m_CyberMittens_l_LockLongMittenLeft,LockLongMittenLeft +m_CyberMittens_l_GlowForeLongMittenLeft,GlowForeLongMittenLeft +m_CyberMittens_l_GlowLongMittenLeft,GlowLongMittenLeft +m_CyberMittens_l_CapForeLongMittenLeft,CapForeLongMittenLeft +m_CyberMittens_l_CapLongMittenLeft,CapLongMittenLeft +m_CyberMittens_l_MittenRight,MittenRight +m_CyberMittens_l_ForeMittenRight,ForeMittenRight +m_CyberMittens_l_CuffForeLongMittenRight,CuffForeLongMittenRight +m_CyberMittens_l_CuffLongMittenRight,CuffLongMittenRight +m_CyberMittens_l_DisplayForeLongMittenRight,DisplayForeLongMittenRight +m_CyberMittens_l_DisplayLongMittenRight,DisplayLongMittenRight +m_CyberMittens_l_LockForeLongMittenRight,LockForeLongMittenRight +m_CyberMittens_l_LockLongMittenRight,LockLongMittenRight +m_CyberMittens_l_GlowForeLongMittenRight,GlowForeLongMittenRight +m_CyberMittens_l_GlowLongMittenRight,GlowLongMittenRight +m_CyberMittens_l_CapForeLongMittenRight,CapForeLongMittenRight +m_CyberMittens_l_CapLongMittenRight,CapLongMittenRight +m_CyberArmLeft,CyberArmLeft +m_CyberArmLeft_l_ArmLongMittenLeft,ArmLongMittenLeft +m_CyberArmLeft_l_ForeLongMittenLeft,ForeLongMittenLeft +m_CyberArmLeft_l_CuffForeLongMittenLeft,CuffForeLongMittenLeft +m_CyberArmLeft_l_CuffLongMittenLeft,CuffLongMittenLeft +m_CyberArmLeft_l_DisplayForeLongMittenLeft,DisplayForeLongMittenLeft +m_CyberArmLeft_l_DisplayLongMittenLeft,DisplayLongMittenLeft +m_CyberArmLeft_l_LockForeLongMittenLeft,LockForeLongMittenLeft +m_CyberArmLeft_l_LockLongMittenLeft,LockLongMittenLeft +m_CyberArmLeft_l_GlowForeLongMittenLeft,GlowForeLongMittenLeft +m_CyberArmLeft_l_GlowLongMittenLeft,GlowLongMittenLeft +m_CyberArmLeft_l_StrapsForeLongMittenLeft,StrapsForeLongMittenLeft +m_CyberArmLeft_l_StrapsLongMittenLeft,StrapsLongMittenLeft +m_CyberArmLeft_l_UpperCuffLongMittenLeft,UpperCuffLongMittenLeft +m_CyberArmLeft_l_UpperDisplayLongMittenLeft,UpperDisplayLongMittenLeft +m_CyberArmLeft_l_UpperLockLongMittenLeft,UpperLockLongMittenLeft +m_CyberArmLeft_l_UpperGlowLongMittenLeft,UpperGlowLongMittenLeft +m_CyberArmRight,CyberArmRight +m_CyberArmRight_l_ArmLongMittenRight,ArmLongMittenRight +m_CyberArmRight_l_ForeLongMittenRight,ForeLongMittenRight +m_CyberArmRight_l_CuffForeLongMittenRight,CuffForeLongMittenRight +m_CyberArmRight_l_CuffLongMittenRight,CuffLongMittenRight +m_CyberArmRight_l_DisplayForeLongMittenRight,DisplayForeLongMittenRight +m_CyberArmRight_l_DisplayLongMittenRight,DisplayLongMittenRight +m_CyberArmRight_l_LockForeLongMittenRight,LockForeLongMittenRight +m_CyberArmRight_l_LockLongMittenRight,LockLongMittenRight +m_CyberArmRight_l_GlowForeLongMittenRight,GlowForeLongMittenRight +m_CyberArmRight_l_GlowLongMittenRight,GlowLongMittenRight +m_CyberArmRight_l_StrapsForeLongMittenRight,StrapsForeLongMittenRight +m_CyberArmRight_l_StrapsLongMittenRight,StrapsLongMittenRight +m_CyberArmRight_l_UpperCuffForeLongMittenRight,UpperCuffForeLongMittenRight +m_CyberArmRight_l_UpperCuffLongMittenRight,UpperCuffLongMittenRight +m_CyberArmRight_l_UpperDisplayLongMittenRight,UpperDisplayLongMittenRight +m_CyberArmRight_l_UpperLockLongMittenRight,UpperLockLongMittenRight +m_CyberArmRight_l_UpperGlowLongMittenRight,UpperGlowLongMittenRight +m_CyberArms,CyberArms +m_CyberArms_l_ArmLongMittenLeft,ArmLongMittenLeft +m_CyberArms_l_ForeLongMittenLeft,ForeLongMittenLeft +m_CyberArms_l_CuffForeLongMittenLeft,CuffForeLongMittenLeft +m_CyberArms_l_CuffLongMittenLeft,CuffLongMittenLeft +m_CyberArms_l_DisplayForeLongMittenLeft,DisplayForeLongMittenLeft +m_CyberArms_l_DisplayLongMittenLeft,DisplayLongMittenLeft +m_CyberArms_l_LockForeLongMittenLeft,LockForeLongMittenLeft +m_CyberArms_l_LockLongMittenLeft,LockLongMittenLeft +m_CyberArms_l_GlowForeLongMittenLeft,GlowForeLongMittenLeft +m_CyberArms_l_GlowLongMittenLeft,GlowLongMittenLeft +m_CyberArms_l_StrapsForeLongMittenLeft,StrapsForeLongMittenLeft +m_CyberArms_l_StrapsLongMittenLeft,StrapsLongMittenLeft +m_CyberArms_l_UpperCuffLongMittenLeft,UpperCuffLongMittenLeft +m_CyberArms_l_UpperDisplayLongMittenLeft,UpperDisplayLongMittenLeft +m_CyberArms_l_UpperLockLongMittenLeft,UpperLockLongMittenLeft +m_CyberArms_l_UpperGlowLongMittenLeft,UpperGlowLongMittenLeft +m_CyberArms_l_ArmLongMittenRight,ArmLongMittenRight +m_CyberArms_l_ForeLongMittenRight,ForeLongMittenRight +m_CyberArms_l_CuffForeLongMittenRight,CuffForeLongMittenRight +m_CyberArms_l_CuffLongMittenRight,CuffLongMittenRight +m_CyberArms_l_DisplayForeLongMittenRight,DisplayForeLongMittenRight +m_CyberArms_l_DisplayLongMittenRight,DisplayLongMittenRight +m_CyberArms_l_LockForeLongMittenRight,LockForeLongMittenRight +m_CyberArms_l_LockLongMittenRight,LockLongMittenRight +m_CyberArms_l_GlowForeLongMittenRight,GlowForeLongMittenRight +m_CyberArms_l_GlowLongMittenRight,GlowLongMittenRight +m_CyberArms_l_StrapsForeLongMittenRight,StrapsForeLongMittenRight +m_CyberArms_l_StrapsLongMittenRight,StrapsLongMittenRight +m_CyberArms_l_UpperCuffForeLongMittenRight,UpperCuffForeLongMittenRight +m_CyberArms_l_UpperCuffLongMittenRight,UpperCuffLongMittenRight +m_CyberArms_l_UpperDisplayLongMittenRight,UpperDisplayLongMittenRight +m_CyberArms_l_UpperLockLongMittenRight,UpperLockLongMittenRight +m_CyberArms_l_UpperGlowLongMittenRight,UpperGlowLongMittenRight +m_FashionCyberLongMittens,FashionCyberLongMittens +m_FashionCyberLongMittens_l_CapForeLongMittenLeft,CapForeLongMittenLeft +m_FashionCyberLongMittens_l_CapLongMittenLeft,CapLongMittenLeft +m_FashionCyberLongMittens_l_LongMittenLeft,LongMittenLeft +m_FashionCyberLongMittens_l_ForeLongMittenLeft,ForeLongMittenLeft +m_FashionCyberLongMittens_l_CuffForeLongMittenLeft,CuffForeLongMittenLeft +m_FashionCyberLongMittens_l_CuffLongMittenLeft,CuffLongMittenLeft +m_FashionCyberLongMittens_l_DisplayForeLongMittenLeft,DisplayForeLongMittenLeft +m_FashionCyberLongMittens_l_DisplayLongMittenLeft,DisplayLongMittenLeft +m_FashionCyberLongMittens_l_LockForeLongMittenLeft,LockForeLongMittenLeft +m_FashionCyberLongMittens_l_LockLongMittenLeft,LockLongMittenLeft +m_FashionCyberLongMittens_l_GlowForeLongMittenLeft,GlowForeLongMittenLeft +m_FashionCyberLongMittens_l_GlowLongMittenLeft,GlowLongMittenLeft +m_FashionCyberLongMittens_l_StrapsForeLongMittenLeft,StrapsForeLongMittenLeft +m_FashionCyberLongMittens_l_StrapsLongMittenLeft,StrapsLongMittenLeft +m_FashionCyberLongMittens_l_UpperCuffLongMittenLeft,UpperCuffLongMittenLeft +m_FashionCyberLongMittens_l_UpperDisplayLongMittenLeft,UpperDisplayLongMittenLeft +m_FashionCyberLongMittens_l_UpperLockLongMittenLeft,UpperLockLongMittenLeft +m_FashionCyberLongMittens_l_UpperGlowLongMittenLeft,UpperGlowLongMittenLeft +m_FashionCyberLongMittens_l_CapForeLongMittenRight,CapForeLongMittenRight +m_FashionCyberLongMittens_l_CapLongMittenRight,CapLongMittenRight +m_FashionCyberLongMittens_l_LongMittenRight,LongMittenRight +m_FashionCyberLongMittens_l_ForeLongMittenRight,ForeLongMittenRight +m_FashionCyberLongMittens_l_CuffForeLongMittenRight,CuffForeLongMittenRight +m_FashionCyberLongMittens_l_CuffLongMittenRight,CuffLongMittenRight +m_FashionCyberLongMittens_l_DisplayForeLongMittenRight,DisplayForeLongMittenRight +m_FashionCyberLongMittens_l_DisplayLongMittenRight,DisplayLongMittenRight +m_FashionCyberLongMittens_l_LockForeLongMittenRight,LockForeLongMittenRight +m_FashionCyberLongMittens_l_LockLongMittenRight,LockLongMittenRight +m_FashionCyberLongMittens_l_GlowForeLongMittenRight,GlowForeLongMittenRight +m_FashionCyberLongMittens_l_GlowLongMittenRight,GlowLongMittenRight +m_FashionCyberLongMittens_l_StrapsForeLongMittenRight,StrapsForeLongMittenRight +m_FashionCyberLongMittens_l_StrapsLongMittenRight,StrapsLongMittenRight +m_FashionCyberLongMittens_l_UpperCuffLongMittenRight,UpperCuffLongMittenRight +m_FashionCyberLongMittens_l_UpperDisplayLongMittenRight,UpperDisplayLongMittenRight +m_FashionCyberLongMittens_l_UpperLockLongMittenRight,UpperLockLongMittenRight +m_FashionCyberLongMittens_l_UpperGlowLongMittenRight,UpperGlowLongMittenRight +m_FashionCyberMittens,FashionCyberMittens +m_FashionCyberMittens_l_MittenLeft,MittenLeft +m_FashionCyberMittens_l_ForeMittenLeft,ForeMittenLeft +m_FashionCyberMittens_l_CuffForeLongMittenLeft,CuffForeLongMittenLeft +m_FashionCyberMittens_l_CuffLongMittenLeft,CuffLongMittenLeft +m_FashionCyberMittens_l_DisplayForeLongMittenLeft,DisplayForeLongMittenLeft +m_FashionCyberMittens_l_DisplayLongMittenLeft,DisplayLongMittenLeft +m_FashionCyberMittens_l_LockForeLongMittenLeft,LockForeLongMittenLeft +m_FashionCyberMittens_l_LockLongMittenLeft,LockLongMittenLeft +m_FashionCyberMittens_l_GlowForeLongMittenLeft,GlowForeLongMittenLeft +m_FashionCyberMittens_l_GlowLongMittenLeft,GlowLongMittenLeft +m_FashionCyberMittens_l_CapForeLongMittenLeft,CapForeLongMittenLeft +m_FashionCyberMittens_l_CapLongMittenLeft,CapLongMittenLeft +m_FashionCyberMittens_l_MittenRight,MittenRight +m_FashionCyberMittens_l_ForeMittenRight,ForeMittenRight +m_FashionCyberMittens_l_CuffForeLongMittenRight,CuffForeLongMittenRight +m_FashionCyberMittens_l_CuffLongMittenRight,CuffLongMittenRight +m_FashionCyberMittens_l_DisplayForeLongMittenRight,DisplayForeLongMittenRight +m_FashionCyberMittens_l_DisplayLongMittenRight,DisplayLongMittenRight +m_FashionCyberMittens_l_LockForeLongMittenRight,LockForeLongMittenRight +m_FashionCyberMittens_l_LockLongMittenRight,LockLongMittenRight +m_FashionCyberMittens_l_GlowForeLongMittenRight,GlowForeLongMittenRight +m_FashionCyberMittens_l_GlowLongMittenRight,GlowLongMittenRight +m_FashionCyberMittens_l_CapForeLongMittenRight,CapForeLongMittenRight +m_FashionCyberMittens_l_CapLongMittenRight,CapLongMittenRight +m_CyberThighLink,CyberThighLink +m_CyberThighLink_l_ThighLink,ThighLink +m_CyberThighLink_l_GlowThighLink,GlowThighLink +m_CyberAnkleLink,CyberAnkleLink +m_CyberAnkleLink_l_AnkleLink,AnkleLink +m_CyberAnkleLink_l_GlowAnkleLink,GlowAnkleLink +m_FashionCyberThighLink,FashionCyberThighLink +m_FashionCyberThighLink_l_ThighLink,ThighLink +m_FashionCyberThighLink_l_GlowThighLink,GlowThighLink +m_FashionCyberAnkleLink,FashionCyberAnkleLink +m_FashionCyberAnkleLink_l_AnkleLink,AnkleLink +m_FashionCyberAnkleLink_l_GlowAnkleLink,GlowAnkleLink +m_CyberPanties,CyberPanties +m_CyberPanties_l_CyberPanties,CyberPanties +m_CyberPanties_l_CyberPantiesLining,CyberPantiesLining +m_TallSmoothHeels,TallSmoothHeels +m_TallSmoothHeels_l_TallLeft,TallLeft +m_TallSmoothHeels_l_TallRight,TallRight +m_TallSmoothHeels_l_TallLegLeft,TallLegLeft +m_TallSmoothHeels_l_TallLegRight,TallLegRight +m_TallSmoothHeelsRestraint,TallSmoothHeelsRestraint +m_TallSmoothHeelsRestraint_l_TallLeft,TallLeft +m_TallSmoothHeelsRestraint_l_TallRight,TallRight +m_TallSmoothHeelsRestraint_l_TallLegLeft,TallLegLeft +m_TallSmoothHeelsRestraint_l_TallLegRight,TallLegRight +m_NeckCorset,NeckCorset +m_NeckCorset_l_NeckCorset2,NeckCorset2 +m_NeckCorset_l_NeckCorsetRim2,NeckCorsetRim2 +m_ShinyLatexMuzzle,ShinyLatexMuzzle +m_ShinyLatexMuzzle_l_NeckCorsetGag2,NeckCorsetGag2 +m_ShinyLatexMuzzle_l_NeckCorsetGagRim2,NeckCorsetGagRim2 +m_NeckCorsetGag,NeckCorsetGag +m_NeckCorsetGag_l_NeckCorset2,NeckCorset2 +m_NeckCorsetGag_l_NeckCorsetRim2,NeckCorsetRim2 +m_NeckCorsetGag_l_NeckCorsetGag2,NeckCorsetGag2 +m_NeckCorsetGag_l_NeckCorsetGagRim2,NeckCorsetGagRim2 +m_ShinyLatexMuzzleRestraint,ShinyLatexMuzzleRestraint +m_ShinyLatexMuzzleRestraint_l_NeckCorsetGag2,NeckCorsetGag2 +m_ShinyLatexMuzzleRestraint_l_NeckCorsetGagRim2,NeckCorsetGagRim2 +m_NeckCorsetRestraint,NeckCorsetRestraint +m_NeckCorsetRestraint_l_NeckCorset2,NeckCorset2 +m_NeckCorsetRestraint_l_NeckCorsetRim2,NeckCorsetRim2 +m_NeckCorsetGagRestraint,NeckCorsetGagRestraint +m_NeckCorsetGagRestraint_l_NeckCorset2,NeckCorset2 +m_NeckCorsetGagRestraint_l_NeckCorsetRim2,NeckCorsetRim2 +m_NeckCorsetGagRestraint_l_NeckCorsetGag2,NeckCorsetGag2 +m_NeckCorsetGagRestraint_l_NeckCorsetGagRim2,NeckCorsetGagRim2 +m_LatexPetsuit,LatexPetsuit +m_LatexPetsuit_l_Arms,Arms +m_LatexPetsuit_l_Legs,Legs +m_LatexPetsuit_l_LeftLegs,LeftLegs +m_LatexPetsuitGlow,LatexPetsuitGlow +m_LatexPetsuitGlow_l_Arms,Arms +m_LatexPetsuitGlow_l_Legs,Legs +m_LatexPetsuitGlow_l_LeftLegs,LeftLegs +m_LatexPetsuitGlow_l_GlowArms,GlowArms +m_LatexPetsuitGlow_l_GlowTorso,GlowTorso +m_LatexPetsuitGlow_l_GlowLegs,GlowLegs +m_LatexPetsuitGlow_l_GlowLeftLegs,GlowLeftLegs +m_MiniCape,MiniCape +m_MiniCape_l_Cape,Cape +m_Epaulettes,Epaulettes +m_Epaulettes_l_Pauldrons,Pauldrons +m_TheRobeOfChastity,TheRobeOfChastity +m_TheRobeOfChastity_l_Base,Base +m_TheRobeOfChastity_l_ChestBase,ChestBase +m_TheRobeOfChastity_l_Frill,Frill +m_TheRobeOfChastity_l_ChestFrill,ChestFrill +m_TheRobeOfChastity_l_Gold,Gold +m_TheRobeOfChastity_l_ChestGold,ChestGold +m_TheRobeOfChastity_l_Plate,Plate +m_TheRobeOfChastity_l_ChestPlate,ChestPlate +m_TheRobeOfChastity_l_GoldBase,GoldBase +m_TheRobeOfChastity_l_ChestGoldBase,ChestGoldBase +m_TheRobeOfChastity_l_Fabric,Fabric +m_TheRobeOfChastity_l_ChestFabric,ChestFabric +m_TheRobeOfChastity_l_Cape,Cape +m_TheRobeOfChastity_l_Pauldrons,Pauldrons +m_TheRobeOfChastityRestraint,TheRobeOfChastityRestraint +m_TheRobeOfChastityRestraint_l_Base,Base +m_TheRobeOfChastityRestraint_l_ChestBase,ChestBase +m_TheRobeOfChastityRestraint_l_Frill,Frill +m_TheRobeOfChastityRestraint_l_ChestFrill,ChestFrill +m_TheRobeOfChastityRestraint_l_Gold,Gold +m_TheRobeOfChastityRestraint_l_ChestGold,ChestGold +m_TheRobeOfChastityRestraint_l_Plate,Plate +m_TheRobeOfChastityRestraint_l_ChestPlate,ChestPlate +m_TheRobeOfChastityRestraint_l_GoldBase,GoldBase +m_TheRobeOfChastityRestraint_l_ChestGoldBase,ChestGoldBase +m_TheRobeOfChastityRestraint_l_Fabric,Fabric +m_TheRobeOfChastityRestraint_l_ChestFabric,ChestFabric +m_TheRobeOfChastityRestraint_l_Cape,Cape +m_TheRobeOfChastityRestraint_l_Pauldrons,Pauldrons +m_Spats,Spats +m_Spats_l_Spats,Spats +m_GothicSkirt,GothicSkirt +m_GothicSkirt_l_Skirt,Skirt +m_GothicSkirt_l_WaistbandClips,WaistbandClips +m_GothicSkirt_l_Buttons,Buttons +m_GothicSkirt_l_Lines,Lines +m_GothicSkirt_l_HemLower,HemLower +m_GothicSkirt_l_HemLowerBack,HemLowerBack +m_GothicSkirt_l_HemUpper,HemUpper +m_GothicSkirtLace,GothicSkirtLace +m_GothicSkirtLace_l_Skirt,Skirt +m_GothicSkirtLace_l_WaistbandClips,WaistbandClips +m_GothicSkirtLace_l_Buttons,Buttons +m_GothicSkirtLace_l_Lines,Lines +m_GothicSkirtLace_l_HemLower,HemLower +m_GothicSkirtLace_l_HemLowerBack,HemLowerBack +m_GothicSkirtLace_l_HemUpper,HemUpper +m_GothicSkirtLace_l_LaceLower,LaceLower +m_GothicSkirtLace_l_LaceUpper,LaceUpper +m_LightMaidKnight_Dress,LightMaidKnight_Dress +m_LightMaidKnight_Dress_l_Dress,Dress +m_LightMaidKnight_Dress_l_DressChest,DressChest +m_LightMaidKnight_Dress_l_DressSkirt,DressSkirt +m_LightMaidKnight_Dress_l_DressDeco,DressDeco +m_LightMaidKnight_Dress_l_DressDecoBack,DressDecoBack +m_LightMaidKnight_Bra,LightMaidKnight_Bra +m_LightMaidKnight_Bra_l_DressChest,DressChest +m_LightMaidKnight_Top,LightMaidKnight_Top +m_LightMaidKnight_Top_l_DressChest,DressChest +m_LightMaidKnight_SleeveLeft,LightMaidKnight_SleeveLeft +m_LightMaidKnight_SleeveLeft_l_ArmLeft,ArmLeft +m_LightMaidKnight_SleeveLeft_l_ForeArmLeft,ForeArmLeft +m_LightMaidKnight_SleeveRight,LightMaidKnight_SleeveRight +m_LightMaidKnight_SleeveRight_l_ArmRight,ArmRight +m_LightMaidKnight_SleeveRight_l_ForeArmRight,ForeArmRight +m_LightMaidKnight_SleeveRight_l_ShoulderRight,ShoulderRight +m_LightMaidKnight_Sleeves,LightMaidKnight_Sleeves +m_LightMaidKnight_Sleeves_l_ArmLeft,ArmLeft +m_LightMaidKnight_Sleeves_l_ForeArmLeft,ForeArmLeft +m_LightMaidKnight_Sleeves_l_ArmRight,ArmRight +m_LightMaidKnight_Sleeves_l_ForeArmRight,ForeArmRight +m_LightMaidKnight_Sleeves_l_ShoulderRight,ShoulderRight + +m_LightMaidKnightHairband,LightMaidKnightHairband +m_LightMaidKnightHairband_l_Headband,Headband +m_LightMaidKnightHairband_l_HeadbandFrill,HeadbandFrill +m_LightMaidKnightHairband_l_HeadbandRibbon,HeadbandRibbon +m_PlateBoots_l_FootBootLeftHogtie,FootBootLeftHogtie +m_PlateArmor_l_FootBootLeftHogtie,FootBootLeftHogtie +m_WarriorBoots_l_FootShoeLeftHogtie,FootShoeLeftHogtie +m_Dragonheart_l_FootShoeLeftHogtie,FootShoeLeftHogtie +m_GagNecklace,GagNecklace +m_GagNecklace_l_GagNecklaceBall,GagNecklaceBall +m_GagNecklace_l_GagNecklace,GagNecklace +m_FashionGagNecklace,FashionGagNecklace +m_FashionGagNecklace_l_GagNecklaceBall,GagNecklaceBall +m_FashionGagNecklace_l_GagNecklace,GagNecklace +m_BondageBed,BondageBed +m_BondageBed_l_Bed,Bed +m_BondageBed_l_BedStraps,BedStraps +m_BondageBed_l_BedStrapsHogtie,BedStrapsHogtie +m_LightMaidKnight_Apron,LightMaidKnight_Apron +m_LightMaidKnight_Apron_l_ApronChest,ApronChest +m_LightMaidKnight_Apron_l_Apron,Apron +m_LightMaidKnight_Apron_l_ApronBack,ApronBack +m_LightMaidKnight_Flower,LightMaidKnight_Flower +m_LightMaidKnight_Flower_l_Flower,Flower +m_LightMaidKnight_SockRight,LightMaidKnight_SockRight +m_LightMaidKnight_SockRight_l_SockLeft,SockLeft +m_LightMaidKnight_SockRight_l_FootSockLeftHogtie,FootSockLeftHogtie +m_LightMaidKnight_SockLeft,LightMaidKnight_SockLeft +m_LightMaidKnight_SockLeft_l_SockRight,SockRight +m_LightMaidKnight_SockLeft_l_FootSockRightKneel,FootSockRightKneel +m_LightMaidKnight_Socks,LightMaidKnight_Socks +m_LightMaidKnight_Socks_l_SockRight,SockRight +m_LightMaidKnight_Socks_l_FootSockRightKneel,FootSockRightKneel +m_LightMaidKnight_Socks_l_SockLeft,SockLeft +m_LightMaidKnight_Socks_l_FootSockLeftHogtie,FootSockLeftHogtie +m_LightMaidKnight_GloveLeft,LightMaidKnight_GloveLeft +m_LightMaidKnight_GloveLeft_l_GloveLeft,GloveLeft +m_LightMaidKnight_GloveRight,LightMaidKnight_GloveRight +m_LightMaidKnight_GloveRight_l_GloveRight,GloveRight +m_LightMaidKnight_Gloves,LightMaidKnight_Gloves +m_LightMaidKnight_Gloves_l_GloveLeft,GloveLeft +m_LightMaidKnight_Gloves_l_GloveRight,GloveRight +m_LightMaidKnight_GuardLeft,LightMaidKnight_GuardLeft +m_LightMaidKnight_GuardLeft_l_GuardLeft,GuardLeft +m_LightMaidKnight_GuardLeft_l_GuardCuffLeft,GuardCuffLeft +m_LightMaidKnight_GuardLeft_l_GuardCuff2Left,GuardCuff2Left +m_LightMaidKnight_GuardRight,LightMaidKnight_GuardRight +m_LightMaidKnight_GuardRight_l_GuardRight,GuardRight +m_LightMaidKnight_GuardRight_l_GuardCuffRight,GuardCuffRight +m_LightMaidKnight_GuardRight_l_GuardCuff2Right,GuardCuff2Right +m_LightMaidKnight_Guards,LightMaidKnight_Guards +m_LightMaidKnight_Guards_l_GuardLeft,GuardLeft +m_LightMaidKnight_Guards_l_GuardCuffLeft,GuardCuffLeft +m_LightMaidKnight_Guards_l_GuardCuff2Left,GuardCuff2Left +m_LightMaidKnight_Guards_l_GuardRight,GuardRight +m_LightMaidKnight_Guards_l_GuardCuffRight,GuardCuffRight +m_LightMaidKnight_Guards_l_GuardCuff2Right,GuardCuff2Right +m_LightMaidKnight_Boots,LightMaidKnight_Boots +m_LightMaidKnight_Boots_l_BootLeft,BootLeft +m_LightMaidKnight_Boots_l_BootRight,BootRight +m_LightMaidKnight_Boots_l_BootRightKneel,BootRightKneel +m_LightMaidKnight_Boots_l_FootBootLeftHogtie,FootBootLeftHogtie +m_LightMaidKnight_Pauldron,LightMaidKnight_Pauldron +m_LightMaidKnight_Pauldron_l_PauldronLeft,PauldronLeft +m_LightMaidKnight_Pauldron_l_PauldronStrap,PauldronStrap +m_LightMaidKnight,LightMaidKnight +m_LightMaidKnight_l_Dress,Dress +m_LightMaidKnight_l_DressChest,DressChest +m_LightMaidKnight_l_DressSkirt,DressSkirt +m_LightMaidKnight_l_DressDeco,DressDeco +m_LightMaidKnight_l_DressDecoBack,DressDecoBack +m_LightMaidKnight_l_ArmLeft,ArmLeft +m_LightMaidKnight_l_ForeArmLeft,ForeArmLeft +m_LightMaidKnight_l_ArmRight,ArmRight +m_LightMaidKnight_l_ForeArmRight,ForeArmRight +m_LightMaidKnight_l_ShoulderRight,ShoulderRight +m_LightMaidKnight_l_ApronChest,ApronChest +m_LightMaidKnight_l_Apron,Apron +m_LightMaidKnight_l_ApronBack,ApronBack +m_LightMaidKnight_l_Flower,Flower +m_LightMaidKnight_l_PauldronLeft,PauldronLeft +m_LightMaidKnight_l_PauldronStrap,PauldronStrap +m_LightMaidKnight_l_SockRight,SockRight +m_LightMaidKnight_l_FootSockRightKneel,FootSockRightKneel +m_LightMaidKnight_l_SockLeft,SockLeft +m_LightMaidKnight_l_FootSockLeftHogtie,FootSockLeftHogtie +m_LightMaidKnight_l_BootLeft,BootLeft +m_LightMaidKnight_l_BootRight,BootRight +m_LightMaidKnight_l_BootRightKneel,BootRightKneel +m_LightMaidKnight_l_FootBootLeftHogtie,FootBootLeftHogtie +m_LightMaidKnight_l_GuardLeft,GuardLeft +m_LightMaidKnight_l_GuardCuffLeft,GuardCuffLeft +m_LightMaidKnight_l_GuardCuff2Left,GuardCuff2Left +m_LightMaidKnight_l_GuardRight,GuardRight +m_LightMaidKnight_l_GuardCuffRight,GuardCuffRight +m_LightMaidKnight_l_GuardCuff2Right,GuardCuff2Right +m_LightMaidKnight_l_Headband,Headband +m_LightMaidKnight_l_HeadbandFrill,HeadbandFrill +m_LightMaidKnight_l_HeadbandRibbon,HeadbandRibbon + +m_HeavyMaidKnightHairband,HeavyMaidKnightHairband +m_HeavyMaidKnightHairband_l_Headband,Headband +m_HeavyMaidKnightHairband_l_HeadbandFrill,HeadbandFrill +m_HeavyMaidKnightHairband_l_HeadbandRibbon,HeadbandRibbon +m_HeavyMaidKnightHairband_l_HeadbandRibbonBack,HeadbandRibbonBack +m_LightMaidKnight_Flower_l_FlowerLeaves,FlowerLeaves +m_LightMaidKnight_l_FlowerLeaves,FlowerLeaves +m_HeavyMaidKnight_Dress,HeavyMaidKnight_Dress +m_HeavyMaidKnight_Dress_l_Dress,Dress +m_HeavyMaidKnight_Dress_l_DressChest,DressChest +m_HeavyMaidKnight_Dress_l_DressSkirt,DressSkirt +m_HeavyMaidKnight_Dress_l_DressSkirtHem,DressSkirtHem +m_HeavyMaidKnight_Dress_l_DressSkirtStripe,DressSkirtStripe +m_HeavyMaidKnight_SleeveLeft,HeavyMaidKnight_SleeveLeft +m_HeavyMaidKnight_SleeveLeft_l_SleeveLeft,SleeveLeft +m_HeavyMaidKnight_SleeveLeft_l_SleeveLeftStripe,SleeveLeftStripe +m_HeavyMaidKnight_SleeveLeft_l_ArmLeft,ArmLeft +m_HeavyMaidKnight_SleeveLeft_l_ForeArmLeft,ForeArmLeft +m_HeavyMaidKnight_SleeveRight,HeavyMaidKnight_SleeveRight +m_HeavyMaidKnight_SleeveRight_l_SleeveRight,SleeveRight +m_HeavyMaidKnight_SleeveRight_l_SleeveRightStripe,SleeveRightStripe +m_HeavyMaidKnight_SleeveRight_l_ArmRight,ArmRight +m_HeavyMaidKnight_SleeveRight_l_ForeArmRight,ForeArmRight +m_HeavyMaidKnight_SleeveRight_l_ShoulderRight,ShoulderRight +m_HeavyMaidKnight_ChestArmor,HeavyMaidKnight_ChestArmor +m_HeavyMaidKnight_ChestArmor_l_ChestArmor,ChestArmor +m_HeavyMaidKnight_GloveLeft,HeavyMaidKnight_GloveLeft +m_HeavyMaidKnight_GloveLeft_l_GloveLeft,GloveLeft +m_HeavyMaidKnight_GloveRight,HeavyMaidKnight_GloveRight +m_HeavyMaidKnight_GloveRight_l_GloveRight,GloveRight +m_HeavyMaidKnight_Gloves,HeavyMaidKnight_Gloves +m_HeavyMaidKnight_Gloves_l_GloveLeft,GloveLeft +m_HeavyMaidKnight_Gloves_l_GloveRight,GloveRight +m_HeavyMaidKnight_GauntletLeft,HeavyMaidKnight_GauntletLeft +m_HeavyMaidKnight_GauntletLeft_l_GauntletLeft,GauntletLeft +m_HeavyMaidKnight_GauntletRight,HeavyMaidKnight_GauntletRight +m_HeavyMaidKnight_GauntletRight_l_GauntletRight,GauntletRight +m_HeavyMaidKnight_Gauntlets,HeavyMaidKnight_Gauntlets +m_HeavyMaidKnight_Gauntlets_l_GauntletLeft,GauntletLeft +m_HeavyMaidKnight_Gauntlets_l_GauntletRight,GauntletRight +m_HeavyMaidKnight_PauldronLeft,HeavyMaidKnight_PauldronLeft +m_HeavyMaidKnight_PauldronLeft_l_PauldronLeft,PauldronLeft +m_HeavyMaidKnight_PauldronLeft_l_PauldronLeftStraps,PauldronLeftStraps +m_HeavyMaidKnight_PauldronLeft_l_PauldronLeftHardware,PauldronLeftHardware +m_HeavyMaidKnight_PauldronRight,HeavyMaidKnight_PauldronRight +m_HeavyMaidKnight_PauldronRight_l_PauldronRight,PauldronRight +m_HeavyMaidKnight_PauldronRight_l_PauldronRightStraps,PauldronRightStraps +m_HeavyMaidKnight_Pauldrons,HeavyMaidKnight_Pauldrons +m_HeavyMaidKnight_Pauldrons_l_PauldronLeft,PauldronLeft +m_HeavyMaidKnight_Pauldrons_l_PauldronLeftStraps,PauldronLeftStraps +m_HeavyMaidKnight_Pauldrons_l_PauldronLeftHardware,PauldronLeftHardware +m_HeavyMaidKnight_Pauldrons_l_PauldronRight,PauldronRight +m_HeavyMaidKnight_Pauldrons_l_PauldronRightStraps,PauldronRightStraps +m_HeavyMaidKnight_SideArmor,HeavyMaidKnight_SideArmor +m_HeavyMaidKnight_SideArmor_l_SideArmor,SideArmor +m_HeavyMaidKnight_Corset,HeavyMaidKnight_Corset +m_HeavyMaidKnight_Corset_l_Corset,Corset +m_HeavyMaidKnight_CorsetRestraint,HeavyMaidKnight_CorsetRestraint +m_HeavyMaidKnight_CorsetRestraint_l_Corset,Corset +m_HeavyMaidKnight_Sleeves,HeavyMaidKnight_Sleeves +m_HeavyMaidKnight_Sleeves_l_SleeveLeft,SleeveLeft +m_HeavyMaidKnight_Sleeves_l_SleeveLeftStripe,SleeveLeftStripe +m_HeavyMaidKnight_Sleeves_l_ArmLeft,ArmLeft +m_HeavyMaidKnight_Sleeves_l_ForeArmLeft,ForeArmLeft +m_HeavyMaidKnight_Sleeves_l_SleeveRight,SleeveRight +m_HeavyMaidKnight_Sleeves_l_SleeveRightStripe,SleeveRightStripe +m_HeavyMaidKnight_Sleeves_l_ArmRight,ArmRight +m_HeavyMaidKnight_Sleeves_l_ForeArmRight,ForeArmRight +m_HeavyMaidKnight_Sleeves_l_ShoulderRight,ShoulderRight +m_HeavyMaidKnight_ApronBottom,HeavyMaidKnight_ApronBottom +m_HeavyMaidKnight_ApronBottom_l_Apron,Apron +m_HeavyMaidKnight_ApronBottom_l_ApronBelt,ApronBelt +m_HeavyMaidKnight_ApronBottom_l_ApronMiniBow,ApronMiniBow +m_HeavyMaidKnight_ApronBottom_l_ApronCross,ApronCross +m_HeavyMaidKnight_ApronBottom_l_ApronStripe,ApronStripe +m_HeavyMaidKnight_ApronBottom_l_ApronPattern,ApronPattern +m_HeavyMaidKnight_ApronTop,HeavyMaidKnight_ApronTop +m_HeavyMaidKnight_ApronTop_l_ApronChest,ApronChest +m_HeavyMaidKnight_ApronTop_l_ApronChestRuffles,ApronChestRuffles +m_HeavyMaidKnight_ApronTop_l_ApronChestBelts,ApronChestBelts +m_HeavyMaidKnight_Apron,HeavyMaidKnight_Apron +m_HeavyMaidKnight_Apron_l_ApronChest,ApronChest +m_HeavyMaidKnight_Apron_l_ApronChestRuffles,ApronChestRuffles +m_HeavyMaidKnight_Apron_l_ApronChestBelts,ApronChestBelts +m_HeavyMaidKnight_Apron_l_Apron,Apron +m_HeavyMaidKnight_Apron_l_ApronBelt,ApronBelt +m_HeavyMaidKnight_Apron_l_ApronMiniBow,ApronMiniBow +m_HeavyMaidKnight_Apron_l_ApronCross,ApronCross +m_HeavyMaidKnight_Apron_l_ApronStripe,ApronStripe +m_HeavyMaidKnight_Apron_l_ApronPattern,ApronPattern +m_HeavyMaidKnight_WaistBelts,HeavyMaidKnight_WaistBelts +m_HeavyMaidKnight_WaistBelts_l_Belts,Belts +m_HeavyMaidKnight_WaistBelts_l_BeltsHardware,BeltsHardware +m_HeavyMaidKnight_WaistPouches,HeavyMaidKnight_WaistPouches +m_HeavyMaidKnight_WaistPouches_l_Pouches,Pouches +m_HeavyMaidKnight_Waist,HeavyMaidKnight_Waist +m_HeavyMaidKnight_Waist_l_Pouches,Pouches +m_HeavyMaidKnight_Waist_l_Belts,Belts +m_HeavyMaidKnight_Waist_l_BeltsHardware,BeltsHardware +m_HeavyMaidKnight_Boots,HeavyMaidKnight_Boots +m_HeavyMaidKnight_Boots_l_BootLeft,BootLeft +m_HeavyMaidKnight_Boots_l_BootRight,BootRight +m_HeavyMaidKnight_Boots_l_BootRightKneel,BootRightKneel +m_HeavyMaidKnight_Boots_l_FootBootLeftHogtie,FootBootLeftHogtie +m_HeavyMaidKnight_Boots_l_BootLegLeft,BootLegLeft +m_HeavyMaidKnight_Boots_l_BootLegRight,BootLegRight +m_HeavyMaidKnight_PantyhoseShorts,HeavyMaidKnight_PantyhoseShorts +m_HeavyMaidKnight_PantyhoseShorts_l_Pantyhose,Pantyhose +m_HeavyMaidKnight_SockRight,HeavyMaidKnight_SockRight +m_HeavyMaidKnight_SockRight_l_SockLeft,SockLeft +m_HeavyMaidKnight_SockRight_l_FootSockLeftHogtie,FootSockLeftHogtie +m_HeavyMaidKnight_SockLeft,HeavyMaidKnight_SockLeft +m_HeavyMaidKnight_SockLeft_l_SockRight,SockRight +m_HeavyMaidKnight_SockLeft_l_FootSockRightKneel,FootSockRightKneel +m_Pantyhose,Pantyhose +m_Pantyhose_l_Pantyhose,Pantyhose +m_Pantyhose_l_SockRight,SockRight +m_Pantyhose_l_FootSockRightKneel,FootSockRightKneel +m_Pantyhose_l_SockLeft,SockLeft +m_Pantyhose_l_FootSockLeftHogtie,FootSockLeftHogtie +m_HeavyMaidKnight,HeavyMaidKnight +m_HeavyMaidKnight_l_Dress,Dress +m_HeavyMaidKnight_l_DressChest,DressChest +m_HeavyMaidKnight_l_DressSkirt,DressSkirt +m_HeavyMaidKnight_l_DressSkirtHem,DressSkirtHem +m_HeavyMaidKnight_l_DressSkirtStripe,DressSkirtStripe +m_HeavyMaidKnight_l_SleeveLeft,SleeveLeft +m_HeavyMaidKnight_l_SleeveLeftStripe,SleeveLeftStripe +m_HeavyMaidKnight_l_ArmLeft,ArmLeft +m_HeavyMaidKnight_l_ForeArmLeft,ForeArmLeft +m_HeavyMaidKnight_l_SleeveRight,SleeveRight +m_HeavyMaidKnight_l_SleeveRightStripe,SleeveRightStripe +m_HeavyMaidKnight_l_ArmRight,ArmRight +m_HeavyMaidKnight_l_ForeArmRight,ForeArmRight +m_HeavyMaidKnight_l_ShoulderRight,ShoulderRight +m_HeavyMaidKnight_l_Apron,Apron +m_HeavyMaidKnight_l_ApronBelt,ApronBelt +m_HeavyMaidKnight_l_ApronMiniBow,ApronMiniBow +m_HeavyMaidKnight_l_ApronCross,ApronCross +m_HeavyMaidKnight_l_ApronStripe,ApronStripe +m_HeavyMaidKnight_l_ApronPattern,ApronPattern +m_HeavyMaidKnight_l_ApronChest,ApronChest +m_HeavyMaidKnight_l_ApronChestRuffles,ApronChestRuffles +m_HeavyMaidKnight_l_ApronChestBelts,ApronChestBelts +m_HeavyMaidKnight_l_PauldronLeft,PauldronLeft +m_HeavyMaidKnight_l_PauldronLeftStraps,PauldronLeftStraps +m_HeavyMaidKnight_l_PauldronLeftHardware,PauldronLeftHardware +m_HeavyMaidKnight_l_PauldronRight,PauldronRight +m_HeavyMaidKnight_l_PauldronRightStraps,PauldronRightStraps +m_HeavyMaidKnight_l_GauntletLeft,GauntletLeft +m_HeavyMaidKnight_l_GauntletRight,GauntletRight +m_HeavyMaidKnight_l_Pouches,Pouches +m_HeavyMaidKnight_l_Belts,Belts +m_HeavyMaidKnight_l_BeltsHardware,BeltsHardware +m_HeavyMaidKnight_l_SideArmor,SideArmor +m_HeavyMaidKnight_l_ChestArmor,ChestArmor +m_HeavyMaidKnight_l_Corset,Corset +m_HeavyMaidKnight_l_BootLeft,BootLeft +m_HeavyMaidKnight_l_BootRight,BootRight +m_HeavyMaidKnight_l_BootRightKneel,BootRightKneel +m_HeavyMaidKnight_l_FootBootLeftHogtie,FootBootLeftHogtie +m_HeavyMaidKnight_l_BootLegLeft,BootLegLeft +m_HeavyMaidKnight_l_BootLegRight,BootLegRight +m_HeavyMaidKnight_l_Pantyhose,Pantyhose +m_HeavyMaidKnight_l_SockRight,SockRight +m_HeavyMaidKnight_l_FootSockRightKneel,FootSockRightKneel +m_HeavyMaidKnight_l_SockLeft,SockLeft +m_HeavyMaidKnight_l_FootSockLeftHogtie,FootSockLeftHogtie +m_HeavyMaidKnight_l_Headband,Headband +m_HeavyMaidKnight_l_HeadbandFrill,HeadbandFrill +m_HeavyMaidKnight_l_HeadbandRibbon,HeadbandRibbon +m_HeavyMaidKnight_l_HeadbandRibbonBack,HeadbandRibbonBack + +m_BlondeFront,BlondeFront +m_BlondeFront_l_BlondeFront,BlondeFront +m_BlondeFront_l_BlondeBangs,BlondeBangs +m_BlondeBack,BlondeBack +m_BlondeBack_l_BlondeBack,BlondeBack +m_FangMouth_Double,FangMouth_Double +m_FangMouth_Double_l_Mouth,Mouth +m_LeatherMask_l_HoodCollar,HoodCollar +m_FashionLeatherMask_l_HoodCollar,HoodCollar +m_LeatherHood_l_HoodCollar,HoodCollar +m_FashionLeatherHood_l_HoodCollar,HoodCollar +m_LargeBallGag_l_BigBallTeethFang,BigBallTeethFang +m_LargeBallGagHarness_l_BigBallTeethFang,BigBallTeethFang +m_LargeBallGagHarnessSecure_l_BigBallTeethFang,BigBallTeethFang +m_SmoothLargeBallGag_l_BigBallTeethFang,BigBallTeethFang +m_SmoothLargeBallGagHarness_l_BigBallTeethFang,BigBallTeethFang +m_SmoothLargeBallGagHarnessSecure_l_BigBallTeethFang,BigBallTeethFang +m_MilitaryJacket_Sleeveless,MilitaryJacket_Sleeveless +m_MilitaryJacket_Sleeveless_l_Dress,Dress +m_MilitaryJacket_Sleeveless_l_DressChest,DressChest +m_MilitaryJacket_Sleeveless_l_DressSkirt,DressSkirt +m_MilitaryUniform_SleeveLeft,MilitaryUniform_SleeveLeft +m_MilitaryUniform_SleeveLeft_l_SleeveLeft,SleeveLeft +m_MilitaryUniform_SleeveLeft_l_ArmLeft,ArmLeft +m_MilitaryUniform_SleeveLeft_l_ForeArmLeft,ForeArmLeft +m_MilitaryUniform_SleeveRight,MilitaryUniform_SleeveRight +m_MilitaryUniform_SleeveRight_l_SleeveRight,SleeveRight +m_MilitaryUniform_SleeveRight_l_ArmRight,ArmRight +m_MilitaryUniform_SleeveRight_l_ForeArmRight,ForeArmRight +m_MilitaryUniform_SleeveRight_l_ShoulderRight,ShoulderRight +m_MilitaryUniform_Sleeves,MilitaryUniform_Sleeves +m_MilitaryUniform_Sleeves_l_SleeveLeft,SleeveLeft +m_MilitaryUniform_Sleeves_l_ArmLeft,ArmLeft +m_MilitaryUniform_Sleeves_l_ForeArmLeft,ForeArmLeft +m_MilitaryUniform_Sleeves_l_SleeveRight,SleeveRight +m_MilitaryUniform_Sleeves_l_ArmRight,ArmRight +m_MilitaryUniform_Sleeves_l_ForeArmRight,ForeArmRight +m_MilitaryUniform_Sleeves_l_ShoulderRight,ShoulderRight +m_MilitaryJacket,MilitaryJacket +m_MilitaryJacket_l_SleeveLeft,SleeveLeft +m_MilitaryJacket_l_ArmLeft,ArmLeft +m_MilitaryJacket_l_ForeArmLeft,ForeArmLeft +m_MilitaryJacket_l_SleeveRight,SleeveRight +m_MilitaryJacket_l_ArmRight,ArmRight +m_MilitaryJacket_l_ForeArmRight,ForeArmRight +m_MilitaryJacket_l_ShoulderRight,ShoulderRight +m_MilitaryJacket_l_Dress,Dress +m_MilitaryJacket_l_DressChest,DressChest +m_MilitaryJacket_l_DressSkirt,DressSkirt +m_WhiteGloveLeft,WhiteGloveLeft +m_WhiteGloveLeft_l_GloveLeft,GloveLeft +m_WhiteGloveLeft_l_ForeGloveLeft,ForeGloveLeft +m_WhiteGloveRight,WhiteGloveRight +m_WhiteGloveRight_l_GloveRight,GloveRight +m_WhiteGloveRight_l_ForeGloveRight,ForeGloveRight +m_WhiteGloves,WhiteGloves +m_WhiteGloves_l_GloveLeft,GloveLeft +m_WhiteGloves_l_ForeGloveLeft,ForeGloveLeft +m_WhiteGloves_l_GloveRight,GloveRight +m_WhiteGloves_l_ForeGloveRight,ForeGloveRight +m_UniformShirt_Sleeveless,UniformShirt_Sleeveless +m_UniformShirt_Sleeveless_l_Dress,Dress +m_UniformShirt_Sleeveless_l_DressChest,DressChest +m_UniformShirt_SleeveLeft,UniformShirt_SleeveLeft +m_UniformShirt_SleeveLeft_l_SleeveLeft,SleeveLeft +m_UniformShirt_SleeveLeft_l_ForeArmLeft,ForeArmLeft +m_UniformShirt_SleeveRight,UniformShirt_SleeveRight +m_UniformShirt_SleeveRight_l_SleeveRight,SleeveRight +m_UniformShirt_SleeveRight_l_ForeArmRight,ForeArmRight +m_UniformShirt_SleeveRight_l_ShoulderRight,ShoulderRight +m_UniformShirt_Sleeves,UniformShirt_Sleeves +m_UniformShirt_Sleeves_l_SleeveLeft,SleeveLeft +m_UniformShirt_Sleeves_l_ForeArmLeft,ForeArmLeft +m_UniformShirt_Sleeves_l_SleeveRight,SleeveRight +m_UniformShirt_Sleeves_l_ForeArmRight,ForeArmRight +m_UniformShirt_Sleeves_l_ShoulderRight,ShoulderRight +m_UniformShirt,UniformShirt +m_UniformShirt_l_SleeveLeft,SleeveLeft +m_UniformShirt_l_ForeArmLeft,ForeArmLeft +m_UniformShirt_l_SleeveRight,SleeveRight +m_UniformShirt_l_ForeArmRight,ForeArmRight +m_UniformShirt_l_ShoulderRight,ShoulderRight +m_UniformShirt_l_Dress,Dress +m_UniformShirt_l_DressChest,DressChest +m_MilitaryUniform_Hat,MilitaryUniform_Hat +m_MilitaryUniform_Hat_l_Hat,Hat +m_MilitaryUniform_Hat_l_HatRim,HatRim +m_MilitaryUniform_Hat_l_HatCap,HatCap +m_MilitaryUniform_Hat_l_HatGloriousInsignia,HatGloriousInsignia +m_MilitaryUniform_Hat_l_HatGloriousInsigniaHS,HatGloriousInsigniaHS +m_MilitaryUniform_Earphones,MilitaryUniform_Earphones +m_MilitaryUniform_Earphones_l_Headgear,Headgear +m_MilitaryUniform_Earphones_l_HeadgearUnit,HeadgearUnit +m_MilitaryUniform_Earphones_l_HeadgearEars,HeadgearEars +m_MilitaryUniform_Earphones_l_HeadgearEarsInner,HeadgearEarsInner +m_MilitaryUniform_Earphones_l_HeadgearBack,HeadgearBack +m_MilitaryUniform_Searchlight,MilitaryUniform_Searchlight +m_MilitaryUniform_Searchlight_l_SearchlightPouch,SearchlightPouch +m_MilitaryUniform_Searchlight_l_Searchlight,Searchlight +m_MilitaryUniform_Searchlight_l_SearchlightBase,SearchlightBase +m_MilitaryUniform_Searchlight_l_SearchlightLens,SearchlightLens +m_MilitaryUniform_BeltPouch,MilitaryUniform_BeltPouch +m_MilitaryUniform_BeltPouch_l_BeltPouch,BeltPouch +m_MilitaryUniform_BeltPouch_l_BeltPouchRim,BeltPouchRim +m_MilitaryUniform_Webbing,MilitaryUniform_Webbing +m_MilitaryUniform_Webbing_l_Webbing,Webbing +m_MilitaryUniform_Webbing_l_WebbingSide,WebbingSide +m_MilitaryUniform_Webbing_l_WebbingHardware,WebbingHardware +m_MilitaryUniform_Webbing_l_WebbingName,WebbingName +m_MilitaryUniform_Webbing_l_WebbingUnderbust,WebbingUnderbust +m_MilitaryUniform_Webbing_l_WebbingUnderbustHardware,WebbingUnderbustHardware +m_MilitaryUniform_Skirt,MilitaryUniform_Skirt +m_MilitaryUniform_Skirt_l_Skirt,Skirt +m_MilitaryUniform_Skirt_l_SkirtBand,SkirtBand +m_MilitaryUniform_Shoes,MilitaryUniform_Shoes +m_MilitaryUniform_Shoes_l_ShoeLeft,ShoeLeft +m_MilitaryUniform_Shoes_l_ShoeRight,ShoeRight +m_MilitaryUniform_Shoes_l_ShoeRightKneel,ShoeRightKneel +m_MilitaryUniform_Shoes_l_ShoeLeftHogtie,ShoeLeftHogtie +m_MilitaryUniform_TightsShorts,MilitaryUniform_TightsShorts +m_MilitaryUniform_TightsShorts_l_Pantyhose,Pantyhose +m_MilitaryUniform_SockLeft,MilitaryUniform_SockLeft +m_MilitaryUniform_SockLeft_l_SockLeft,SockLeft +m_MilitaryUniform_SockLeft_l_FootSockLeftHogtie,FootSockLeftHogtie +m_MilitaryUniform_SockRight,MilitaryUniform_SockRight +m_MilitaryUniform_SockRight_l_SockRight,SockRight +m_MilitaryUniform_SockRight_l_FootSockRightKneel,FootSockRightKneel +m_Tights,Tights +m_Tights_l_Pantyhose,Pantyhose +m_Tights_l_SockLeft,SockLeft +m_Tights_l_FootSockLeftHogtie,FootSockLeftHogtie +m_Tights_l_SockRight,SockRight +m_Tights_l_FootSockRightKneel,FootSockRightKneel +m_MilitaryUniform_Hairpin,MilitaryUniform_Hairpin +m_MilitaryUniform_Hairpin_l_Hairpin,Hairpin +m_MilitaryUniform,MilitaryUniform +m_MilitaryUniform_l_SleeveLeft,SleeveLeft +m_MilitaryUniform_l_ArmLeft,ArmLeft +m_MilitaryUniform_l_ForeArmLeft,ForeArmLeft +m_MilitaryUniform_l_SleeveRight,SleeveRight +m_MilitaryUniform_l_ArmRight,ArmRight +m_MilitaryUniform_l_ForeArmRight,ForeArmRight +m_MilitaryUniform_l_ShoulderRight,ShoulderRight +m_MilitaryUniform_l_Dress,Dress +m_MilitaryUniform_l_DressChest,DressChest +m_MilitaryUniform_l_DressSkirt,DressSkirt +m_MilitaryUniform_l_ShirtSleeveLeft,ShirtSleeveLeft +m_MilitaryUniform_l_ShirtForeArmLeft,ShirtForeArmLeft +m_MilitaryUniform_l_ShirtSleeveRight,ShirtSleeveRight +m_MilitaryUniform_l_ShirtForeArmRight,ShirtForeArmRight +m_MilitaryUniform_l_ShirtShoulderRight,ShirtShoulderRight +m_MilitaryUniform_l_ShirtDress,ShirtDress +m_MilitaryUniform_l_ShirtDressChest,ShirtDressChest +m_MilitaryUniform_l_GloveLeft,GloveLeft +m_MilitaryUniform_l_ForeGloveLeft,ForeGloveLeft +m_MilitaryUniform_l_GloveRight,GloveRight +m_MilitaryUniform_l_ForeGloveRight,ForeGloveRight +m_MilitaryUniform_l_Pantyhose,Pantyhose +m_MilitaryUniform_l_SockLeft,SockLeft +m_MilitaryUniform_l_FootSockLeftHogtie,FootSockLeftHogtie +m_MilitaryUniform_l_SockRight,SockRight +m_MilitaryUniform_l_FootSockRightKneel,FootSockRightKneel +m_MilitaryUniform_l_ShoeLeft,ShoeLeft +m_MilitaryUniform_l_ShoeRight,ShoeRight +m_MilitaryUniform_l_ShoeRightKneel,ShoeRightKneel +m_MilitaryUniform_l_ShoeLeftHogtie,ShoeLeftHogtie +m_MilitaryUniform_l_Skirt,Skirt +m_MilitaryUniform_l_SkirtBand,SkirtBand +m_MilitaryUniform_l_Hairpin,Hairpin +m_MilitaryUniform_l_SearchlightPouch,SearchlightPouch +m_MilitaryUniform_l_Searchlight,Searchlight +m_MilitaryUniform_l_SearchlightBase,SearchlightBase +m_MilitaryUniform_l_SearchlightLens,SearchlightLens +m_MilitaryUniform_l_BeltPouch,BeltPouch +m_MilitaryUniform_l_BeltPouchRim,BeltPouchRim +m_MilitaryUniform_l_Hat,Hat +m_MilitaryUniform_l_HatRim,HatRim +m_MilitaryUniform_l_HatCap,HatCap +m_MilitaryUniform_l_HatGloriousInsignia,HatGloriousInsignia +m_MilitaryUniform_l_HatGloriousInsigniaHS,HatGloriousInsigniaHS +m_MilitaryUniform_l_Headgear,Headgear +m_MilitaryUniform_l_HeadgearUnit,HeadgearUnit +m_MilitaryUniform_l_HeadgearEars,HeadgearEars +m_MilitaryUniform_l_HeadgearEarsInner,HeadgearEarsInner +m_MilitaryUniform_l_HeadgearBack,HeadgearBack +m_MilitaryUniform_l_Webbing,Webbing +m_MilitaryUniform_l_WebbingSide,WebbingSide +m_MilitaryUniform_l_WebbingHardware,WebbingHardware +m_MilitaryUniform_l_WebbingName,WebbingName +m_MilitaryUniform_l_WebbingUnderbust,WebbingUnderbust +m_MilitaryUniform_l_WebbingUnderbustHardware,WebbingUnderbustHardware + +m_RubyNecklace,RubyNecklace +m_RubyNecklace_l_RubyChain,RubyChain +m_RubyNecklace_l_RubyRing,RubyRing +m_RubyNecklace_l_RubyGem,RubyGem +m_RubyNecklaceRestraint,RubyNecklaceRestraint +m_RubyNecklaceRestraint_l_RubyChain,RubyChain +m_RubyNecklaceRestraint_l_RubyRing,RubyRing +m_RubyNecklaceRestraint_l_RubyGem,RubyGem +m_SigilNecklace,SigilNecklace +m_SigilNecklace_l_SigilChain,SigilChain +m_SigilNecklace_l_SigilDisc,SigilDisc +m_SigilNecklaceRestraint,SigilNecklaceRestraint +m_SigilNecklaceRestraint_l_SigilChain,SigilChain +m_SigilNecklaceRestraint_l_SigilDisc,SigilDisc +m_MetalNecklace,MetalNecklace +m_MetalNecklace_l_MetalChain,MetalChain +m_MetalNecklace_l_MetalDisc,MetalDisc +m_MetalNecklaceRestraint,MetalNecklaceRestraint +m_MetalNecklaceRestraint_l_MetalChain,MetalChain +m_MetalNecklaceRestraint_l_MetalDisc,MetalDisc +m_DragonNecklace_l_NecklaceCharm,NecklaceCharm +m_DragonNecklaceRestraint,DragonNecklaceRestraint +m_DragonNecklaceRestraint_l_Necklace,Necklace +m_DragonNecklaceRestraint_l_NecklaceCharm,NecklaceCharm +m_Dragonheart_l_NecklaceCharm,NecklaceCharm +m_ElfCollar_l_CollarHardware,CollarHardware +m_Elf_l_CollarHardware,CollarHardware +m_SteelCollar_l_CollarHardware,CollarHardware +m_SteelCollarRunes_l_CollarHardware,CollarHardware +m_FashionSteelCollarRunes_l_CollarHardware,CollarHardware +m_FashionSteelCollar_l_CollarHardware,CollarHardware +m_BallGag_l_BallTeeth,BallTeeth +m_BallGagHarness_l_BallTeeth,BallTeeth +m_BallGagHarnessSecure_l_BallTeeth,BallTeeth +m_FashionBallGag_l_BallTeeth,BallTeeth +m_FashionBallGagHarness_l_BallTeeth,BallTeeth +m_FashionBallGagHarnessSecure_l_BallTeeth,BallTeeth +m_CrystalBallGag,CrystalBallGag +m_CrystalBallGag_l_Ball,Ball +m_CrystalBallGag_l_Strap,Strap +m_CrystalBallGagSmooth,CrystalBallGagSmooth +m_CrystalBallGagSmooth_l_Ball,Ball +m_CrystalBallGagSmooth_l_Strap,Strap +m_GagMetalRivetedStrap,GagMetalRivetedStrap +m_GagMetalRivetedStrap_l_OTN,OTN +m_GagMetalRivetedStrap_l_OTNRivets,OTNRivets +m_GagMetalRivetedStrap_l_OTNStrap,OTNStrap +m_GagMetalRivetedStrap_l_OTNStrapRivets,OTNStrapRivets +m_FashionGagMetalRivetedStrap,FashionGagMetalRivetedStrap +m_FashionGagMetalRivetedStrap_l_OTN,OTN +m_FashionGagMetalRivetedStrap_l_OTNRivets,OTNRivets +m_FashionGagMetalRivetedStrap_l_OTNStrap,OTNStrap +m_FashionGagMetalRivetedStrap_l_OTNStrapRivets,OTNStrapRivets +m_SmoothBallGag_l_BallTeeth,BallTeeth +m_SmoothBallGagHarness_l_BallTeeth,BallTeeth +m_SmoothBallGagHarnessSecure_l_BallTeeth,BallTeeth +m_FashionSmoothBallGag_l_BallTeeth,BallTeeth +m_CrystalGagNecklace,CrystalGagNecklace +m_CrystalGagNecklace_l_CrystalGagNecklaceBall,CrystalGagNecklaceBall +m_CrystalGagNecklace_l_GagNecklace,GagNecklace +m_FashionCrystalGagNecklace,FashionCrystalGagNecklace +m_FashionCrystalGagNecklace_l_CrystalGagNecklaceBall,CrystalGagNecklaceBall +m_FashionCrystalGagNecklace_l_GagNecklace,GagNecklace +m_Leash_l_LeashCollar,LeashCollar +m_Leash_l_LeashCollarHardware,LeashCollarHardware +m_FashionLeash_l_LeashCollar,LeashCollar +m_FashionLeash_l_LeashCollarHardware,LeashCollarHardware +m_HeavyMaidKnight_Boots_l_BootShoeLeft,BootShoeLeft +m_HeavyMaidKnight_Boots_l_BootShoeRight,BootShoeRight +m_HeavyMaidKnight_SockLeft_l_SockLeft,SockLeft +m_HeavyMaidKnight_SockLeft_l_FootSockLeftHogtie,FootSockLeftHogtie +m_HeavyMaidKnight_SockRight_l_SockRight,SockRight +m_HeavyMaidKnight_SockRight_l_FootSockRightKneel,FootSockRightKneel +m_HeavyMaidKnight_l_BootShoeLeft,BootShoeLeft +m_HeavyMaidKnight_l_BootShoeRight,BootShoeRight + +m_Fear,Fear +m_Fear_l_Fear,Fear +m_RubyNecklace_l_RubyHardware,RubyHardware +m_RubyNecklaceRestraint_l_RubyHardware,RubyHardware +m_KiguMaskSmile,KiguMaskSmile +m_KiguMaskSmile_l_Mask,Mask +m_KiguMaskSmile_l_Eyes,Eyes +m_KiguMaskSmile_l_Eyes2,Eyes2 +m_KiguMaskSmile_l_Lock,Lock +m_KiguMaskSmile_l_EyesWhites,EyesWhites +m_KiguMaskSmile_l_MouthSmile,MouthSmile +m_FashionKiguMaskSmile,FashionKiguMaskSmile +m_FashionKiguMaskSmile_l_Mask,Mask +m_FashionKiguMaskSmile_l_Eyes,Eyes +m_FashionKiguMaskSmile_l_Eyes2,Eyes2 +m_FashionKiguMaskSmile_l_Lock,Lock +m_FashionKiguMaskSmile_l_EyesWhites,EyesWhites +m_FashionKiguMaskSmile_l_MouthSmile,MouthSmile + +m_OneBarPrison_l_OneBarTop,OneBarTop +m_OneBarPrisonLatex,OneBarPrisonLatex +m_OneBarPrisonLatex_l_OneBarTop,OneBarTop +m_OneBarPrisonLatex_l_OneBarFront,OneBarFront +m_OneBarPrisonLatex_l_OneBarBack,OneBarBack + + +m_FangMouth,FangMouth +m_FangMouth_l_Mouth,Mouth +m_FanglessMouth,FanglessMouth +m_FanglessMouth_l_Mouth,Mouth +m_SantaHat,SantaHat +m_SantaHat_l_Hat,Hat +m_SantaHat_l_HatBack,HatBack +m_SantaHat_l_Fluff,Fluff +m_SantaHat_l_Orb,Orb +m_FestiveArmbinder,FestiveArmbinder +m_FestiveArmbinder_l_BinderLeft,BinderLeft +m_FestiveArmbinder_l_BinderRight,BinderRight +m_FestiveArmbinder_l_BinderStrapLeft,BinderStrapLeft +m_FestiveArmbinder_l_BinderFluffLeft,BinderFluffLeft +m_FestiveHarnessTop,FestiveHarnessTop +m_FestiveHarnessTop_l_StrapTop,StrapTop +m_FestiveHarnessTop_l_ButtonsTop,ButtonsTop +m_FestiveHarnessTop_l_FuzzTop,FuzzTop +m_FestiveHarnessMid,FestiveHarnessMid +m_FestiveHarnessMid_l_StrapMid,StrapMid +m_FestiveHarnessMid_l_ButtonsMid,ButtonsMid +m_FestiveHarnessMid_l_FuzzMid,FuzzMid +m_FestiveHarnessStrap,FestiveHarnessStrap +m_FestiveHarnessStrap_l_StrapBot,StrapBot +m_FestiveHarnessStrap_l_ButtonsBot,ButtonsBot +m_FestiveHarnessStrap_l_FuzzBot,FuzzBot +m_FestiveHarness,FestiveHarness +m_FestiveHarness_l_StrapTop,StrapTop +m_FestiveHarness_l_ButtonsTop,ButtonsTop +m_FestiveHarness_l_FuzzTop,FuzzTop +m_FestiveHarness_l_StrapOverbust,StrapOverbust +m_FestiveHarness_l_StrapUnderbust,StrapUnderbust +m_FestiveHarness_l_ButtonsUnderbustOver,ButtonsUnderbustOver +m_FestiveHarness_l_ButtonsUnderbust,ButtonsUnderbust +m_FestiveHarness_l_FuzzUnderbustOver,FuzzUnderbustOver +m_FestiveHarness_l_FuzzUnderbust,FuzzUnderbust +m_FestiveHarness_l_StrapMid,StrapMid +m_FestiveHarness_l_ButtonsMid,ButtonsMid +m_FestiveHarness_l_FuzzMid,FuzzMid +m_FestiveHarness_l_StrapBot,StrapBot +m_FestiveHarness_l_ButtonsBot,ButtonsBot +m_FestiveHarness_l_FuzzBot,FuzzBot +m_FashionFestiveHarnessTop,FashionFestiveHarnessTop +m_FashionFestiveHarnessTop_l_StrapTop,StrapTop +m_FashionFestiveHarnessTop_l_ButtonsTop,ButtonsTop +m_FashionFestiveHarnessTop_l_FuzzTop,FuzzTop +m_FashionFestiveHarnessMid,FashionFestiveHarnessMid +m_FashionFestiveHarnessMid_l_StrapMid,StrapMid +m_FashionFestiveHarnessMid_l_ButtonsMid,ButtonsMid +m_FashionFestiveHarnessMid_l_FuzzMid,FuzzMid +m_FashionFestiveHarnessStrap,FashionFestiveHarnessStrap +m_FashionFestiveHarnessStrap_l_StrapBot,StrapBot +m_FashionFestiveHarnessStrap_l_ButtonsBot,ButtonsBot +m_FashionFestiveHarnessStrap_l_FuzzBot,FuzzBot +m_FashionFestiveHarness,FashionFestiveHarness +m_FashionFestiveHarness_l_StrapTop,StrapTop +m_FashionFestiveHarness_l_ButtonsTop,ButtonsTop +m_FashionFestiveHarness_l_FuzzTop,FuzzTop +m_FashionFestiveHarness_l_StrapOverbust,StrapOverbust +m_FashionFestiveHarness_l_StrapUnderbust,StrapUnderbust +m_FashionFestiveHarness_l_ButtonsUnderbustOver,ButtonsUnderbustOver +m_FashionFestiveHarness_l_ButtonsUnderbust,ButtonsUnderbust +m_FashionFestiveHarness_l_FuzzUnderbustOver,FuzzUnderbustOver +m_FashionFestiveHarness_l_FuzzUnderbust,FuzzUnderbust +m_FashionFestiveHarness_l_StrapMid,StrapMid +m_FashionFestiveHarness_l_ButtonsMid,ButtonsMid +m_FashionFestiveHarness_l_FuzzMid,FuzzMid +m_FashionFestiveHarness_l_StrapBot,StrapBot +m_FashionFestiveHarness_l_ButtonsBot,ButtonsBot +m_FashionFestiveHarness_l_FuzzBot,FuzzBot + +m_FrillyHeadband,FrillyHeadband +m_FrillyHeadband_l_Headband,Headband +m_FrillyHeadband_l_HeadbandFrill,HeadbandFrill +m_FrillyHeadband_l_HeadbandBand,HeadbandBand +m_FrillyHeadband_l_HeadbandBow,HeadbandBow +m_BowHeadband,BowHeadband +m_BowHeadband_l_BowHeadband,BowHeadband +m_BowHeadband_l_BowHeadbandFrill,BowHeadbandFrill +m_BackHime,BackHime +m_BackHime_l_HimeBack,HimeBack +m_BackShort,BackShort +m_BackShort_l_BackShort,BackShort +m_BackFlat,BackFlat +m_BackFlat_l_BackFlat,BackFlat +m_Bob,Bob +m_Bob_l_Bob,Bob +m_Bob_l_BobFront,BobFront +m_FrontStraight2,FrontStraight2 +m_FrontStraight2_l_FrontStraight2,FrontStraight2 +m_FrontStraight2_l_FrontStraight2_Front,FrontStraight2_Front +m_FrontStraight2_l_FrontStraight2_Overstrap,FrontStraight2_Overstrap +m_FrontSwept,FrontSwept +m_FrontSwept_l_FrontSwept,FrontSwept +m_FrontSwept_l_FrontSweptSide,FrontSweptSide +m_Vents,Vents +m_Vents_l_VentL,VentL +m_Vents_l_VentR,VentR +m_Vents_l_VentsInnerR,VentsInnerR +m_Vents_l_VentsInnerL,VentsInnerL +m_Vents_l_VentsFront,VentsFront +m_BigBraidBack,BigBraidBack +m_BigBraidBack_l_BigBraidBack,BigBraidBack +m_CurlyPonytail,CurlyPonytail +m_CurlyPonytail_l_CurlyPonytail,CurlyPonytail +m_DrillLeft,DrillLeft +m_DrillLeft_l_DrillLeft,DrillLeft +m_DrillRight,DrillRight +m_DrillRight_l_DrillRight,DrillRight +m_Twindrills,Twindrills +m_Twintails,Twintails +m_Twindrills_l_DrillLeft,DrillLeft +m_Twindrills_l_DrillRight,DrillRight +m_PointyAhoge,PointyAhoge +m_PointyAhoge_l_Ahoge,Ahoge +m_RoundHat,RoundHat +m_RoundHat_l_Hat,Hat +m_RoundHat_l_HatTop,HatTop +m_RoundHat_l_Ribbon,Ribbon +m_RoundHat_l_HatBack,HatBack +m_TopHatSmall,TopHatSmall +m_TopHatSmall_l_TopHatSmall,TopHatSmall +m_TopHatSmall_l_TopHatSmallBow,TopHatSmallBow +m_BlondeFront_l_BlondeFrontM,BlondeFrontM +m_BlondeFront_l_BlondeBangsM,BlondeBangsM +m_BlondeFront_l_Hairpin,Hairpin +m_BlondeBack_l_BlondeBackM,BlondeBackM +m_Mascara,Mascara +m_Mascara_l_MascaraL,MascaraL +m_Mascara_l_MascaraR,MascaraR +m_Scar,Scar +m_Scar_l_Scar,Scar +m_PointyAntennae,PointyAntennae +m_PointyAntennae_l_AnthenaL,AnthenaL +m_PointyAntennae_l_AnthenaR,AnthenaR +m_PointyHorns,PointyHorns +m_PointyHorns_l_HornL,HornL +m_PointyHorns_l_HornR,HornR +m_PointyTail,PointyTail +m_PointyTail_l_Tail,Tail +m_WolfEars2,WolfEars2 +m_WolfEars2_l_EarLeft,EarLeft +m_WolfEars2_l_EarRight,EarRight +m_HairclipDual,HairclipDual +m_HairclipDual_l_HairclipLower,HairclipLower +m_HairclipDual_l_HairclipUpper,HairclipUpper +m_ChainPanties,ChainPanties +m_ChainPanties_l_Panties,Panties +m_ChainPanties_l_PantiesChain,PantiesChain +m_ChainPanties2,ChainPanties2 +m_ChainPanties2_l_Panties,Panties +m_ChainPanties2_l_PantiesChain,PantiesChain +m_ChainPanties2_l_Skirt,Skirt +m_CyberArmLeft_l_LongMittenLeft,LongMittenLeft +m_CyberArmRight_l_LongMittenRight,LongMittenRight +m_CyberArms_l_LongMittenLeft,LongMittenLeft +m_CyberArms_l_LongMittenRight,LongMittenRight +m_KittyPetCuffsWristLeft,KittyPetCuffsWristLeft +m_KittyPetCuffsWristLeft_l_WristLeft,WristLeft +m_KittyPetCuffsWristLeft_l_BandWristLeft,BandWristLeft +m_KittyPetCuffsWristRight,KittyPetCuffsWristRight +m_KittyPetCuffsWristRight_l_WristRight,WristRight +m_KittyPetCuffsWristRight_l_BandWristRight,BandWristRight +m_KittyPetCuffsWrists,KittyPetCuffsWrists +m_KittyPetCuffsWrists_l_WristLeft,WristLeft +m_KittyPetCuffsWrists_l_BandWristLeft,BandWristLeft +m_KittyPetCuffsWrists_l_WristRight,WristRight +m_KittyPetCuffsWrists_l_BandWristRight,BandWristRight +m_KittyPetCuffsElbowLeft,KittyPetCuffsElbowLeft +m_KittyPetCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_KittyPetCuffsElbowLeft_l_BandElbowLeft,BandElbowLeft +m_KittyPetCuffsElbowRight,KittyPetCuffsElbowRight +m_KittyPetCuffsElbowRight_l_ElbowRight,ElbowRight +m_KittyPetCuffsElbowRight_l_BandElbowRight,BandElbowRight +m_KittyPetCuffsElbows,KittyPetCuffsElbows +m_KittyPetCuffsElbows_l_ElbowLeft,ElbowLeft +m_KittyPetCuffsElbows_l_BandElbowLeft,BandElbowLeft +m_KittyPetCuffsElbows_l_ElbowRight,ElbowRight +m_KittyPetCuffsElbows_l_BandElbowRight,BandElbowRight +m_KittyPetCuffsArms,KittyPetCuffsArms +m_KittyPetCuffsArms_l_WristLeft,WristLeft +m_KittyPetCuffsArms_l_BandWristLeft,BandWristLeft +m_KittyPetCuffsArms_l_WristRight,WristRight +m_KittyPetCuffsArms_l_BandWristRight,BandWristRight +m_KittyPetCuffsArms_l_ElbowLeft,ElbowLeft +m_KittyPetCuffsArms_l_BandElbowLeft,BandElbowLeft +m_KittyPetCuffsArms_l_ElbowRight,ElbowRight +m_KittyPetCuffsArms_l_BandElbowRight,BandElbowRight +m_KittyPetCuffsAnklesLeft,KittyPetCuffsAnklesLeft +m_KittyPetCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_KittyPetCuffsAnklesLeft_l_BandAnkleLeft,BandAnkleLeft +m_KittyPetCuffsAnklesRight,KittyPetCuffsAnklesRight +m_KittyPetCuffsAnklesRight_l_AnkleRight,AnkleRight +m_KittyPetCuffsAnklesRight_l_BandAnkleRight,BandAnkleRight +m_KittyPetCuffsAnkles,KittyPetCuffsAnkles +m_KittyPetCuffsAnkles_l_AnkleRight,AnkleRight +m_KittyPetCuffsAnkles_l_BandAnkleRight,BandAnkleRight +m_KittyPetCuffsAnkles_l_AnkleLeft,AnkleLeft +m_KittyPetCuffsAnkles_l_BandAnkleLeft,BandAnkleLeft +m_KittyPetCuffsThighLeft,KittyPetCuffsThighLeft +m_KittyPetCuffsThighLeft_l_ThighLeft,ThighLeft +m_KittyPetCuffsThighLeft_l_BandThighLeft,BandThighLeft +m_KittyPetCuffsThighRight,KittyPetCuffsThighRight +m_KittyPetCuffsThighRight_l_ThighRight,ThighRight +m_KittyPetCuffsThighRight_l_BandThighRight,BandThighRight +m_KittyPetCuffsThigh,KittyPetCuffsThigh +m_KittyPetCuffsThigh_l_ThighRight,ThighRight +m_KittyPetCuffsThigh_l_BandThighRight,BandThighRight +m_KittyPetCuffsThigh_l_ThighLeft,ThighLeft +m_KittyPetCuffsThigh_l_BandThighLeft,BandThighLeft +m_KittyPetCuffsCollar,KittyPetCuffsCollar +m_KittyPetCuffsCollar_l_Collar,Collar +m_KittyPetCuffsCollar_l_BandCollar,BandCollar +m_FashionKittyPetCuffsCollar,FashionKittyPetCuffsCollar +m_FashionKittyPetCuffsCollar_l_Collar,Collar +m_FashionKittyPetCuffsCollar_l_BandCollar,BandCollar +m_FashionKittyPetCuffsWristLeft,FashionKittyPetCuffsWristLeft +m_FashionKittyPetCuffsWristLeft_l_WristLeft,WristLeft +m_FashionKittyPetCuffsWristLeft_l_BandWristLeft,BandWristLeft +m_FashionKittyPetCuffsWristRight,FashionKittyPetCuffsWristRight +m_FashionKittyPetCuffsWristRight_l_WristRight,WristRight +m_FashionKittyPetCuffsWristRight_l_BandWristRight,BandWristRight +m_FashionKittyPetCuffsWrists,FashionKittyPetCuffsWrists +m_FashionKittyPetCuffsWrists_l_WristLeft,WristLeft +m_FashionKittyPetCuffsWrists_l_BandWristLeft,BandWristLeft +m_FashionKittyPetCuffsWrists_l_WristRight,WristRight +m_FashionKittyPetCuffsWrists_l_BandWristRight,BandWristRight +m_FashionKittyPetCuffsElbowLeft,FashionKittyPetCuffsElbowLeft +m_FashionKittyPetCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_FashionKittyPetCuffsElbowLeft_l_BandElbowLeft,BandElbowLeft +m_FashionKittyPetCuffsElbowRight,FashionKittyPetCuffsElbowRight +m_FashionKittyPetCuffsElbowRight_l_ElbowRight,ElbowRight +m_FashionKittyPetCuffsElbowRight_l_BandElbowRight,BandElbowRight +m_FashionKittyPetCuffsElbows,FashionKittyPetCuffsElbows +m_FashionKittyPetCuffsElbows_l_ElbowLeft,ElbowLeft +m_FashionKittyPetCuffsElbows_l_BandElbowLeft,BandElbowLeft +m_FashionKittyPetCuffsElbows_l_ElbowRight,ElbowRight +m_FashionKittyPetCuffsElbows_l_BandElbowRight,BandElbowRight +m_FashionKittyPetCuffsArms,FashionKittyPetCuffsArms +m_FashionKittyPetCuffsArms_l_WristLeft,WristLeft +m_FashionKittyPetCuffsArms_l_BandWristLeft,BandWristLeft +m_FashionKittyPetCuffsArms_l_WristRight,WristRight +m_FashionKittyPetCuffsArms_l_BandWristRight,BandWristRight +m_FashionKittyPetCuffsArms_l_ElbowLeft,ElbowLeft +m_FashionKittyPetCuffsArms_l_BandElbowLeft,BandElbowLeft +m_FashionKittyPetCuffsArms_l_ElbowRight,ElbowRight +m_FashionKittyPetCuffsArms_l_BandElbowRight,BandElbowRight +m_FashionKittyPetCuffsAnklesLeft,FashionKittyPetCuffsAnklesLeft +m_FashionKittyPetCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_FashionKittyPetCuffsAnklesLeft_l_BandAnkleLeft,BandAnkleLeft +m_FashionKittyPetCuffsAnklesRight,FashionKittyPetCuffsAnklesRight +m_FashionKittyPetCuffsAnklesRight_l_AnkleRight,AnkleRight +m_FashionKittyPetCuffsAnklesRight_l_BandAnkleRight,BandAnkleRight +m_FashionKittyPetCuffsAnkles,FashionKittyPetCuffsAnkles +m_FashionKittyPetCuffsAnkles_l_AnkleRight,AnkleRight +m_FashionKittyPetCuffsAnkles_l_BandAnkleRight,BandAnkleRight +m_FashionKittyPetCuffsAnkles_l_AnkleLeft,AnkleLeft +m_FashionKittyPetCuffsAnkles_l_BandAnkleLeft,BandAnkleLeft +m_FashionKittyPetCuffsThighLeft,FashionKittyPetCuffsThighLeft +m_FashionKittyPetCuffsThighLeft_l_ThighLeft,ThighLeft +m_FashionKittyPetCuffsThighLeft_l_BandThighLeft,BandThighLeft +m_FashionKittyPetCuffsThighRight,FashionKittyPetCuffsThighRight +m_FashionKittyPetCuffsThighRight_l_ThighRight,ThighRight +m_FashionKittyPetCuffsThighRight_l_BandThighRight,BandThighRight +m_FashionKittyPetCuffsThigh,FashionKittyPetCuffsThigh +m_FashionKittyPetCuffsThigh_l_ThighRight,ThighRight +m_FashionKittyPetCuffsThigh_l_BandThighRight,BandThighRight +m_FashionKittyPetCuffsThigh_l_ThighLeft,ThighLeft +m_FashionKittyPetCuffsThigh_l_BandThighLeft,BandThighLeft +m_KittyPawCuffsWristLeft,KittyPawCuffsWristLeft +m_KittyPawCuffsWristLeft_l_WristLeft,WristLeft +m_KittyPawCuffsWristLeft_l_BandWristLeft,BandWristLeft +m_KittyPawCuffsWristLeft_l_LockWristLeft,LockWristLeft +m_KittyPawCuffsWristRight,KittyPawCuffsWristRight +m_KittyPawCuffsWristRight_l_WristRight,WristRight +m_KittyPawCuffsWristRight_l_BandWristRight,BandWristRight +m_KittyPawCuffsWristRight_l_LockWristRight,LockWristRight +m_KittyPawCuffsWrists,KittyPawCuffsWrists +m_KittyPawCuffsWrists_l_WristLeft,WristLeft +m_KittyPawCuffsWrists_l_BandWristLeft,BandWristLeft +m_KittyPawCuffsWrists_l_LockWristLeft,LockWristLeft +m_KittyPawCuffsWrists_l_WristRight,WristRight +m_KittyPawCuffsWrists_l_BandWristRight,BandWristRight +m_KittyPawCuffsWrists_l_LockWristRight,LockWristRight +m_KittyPawCuffsElbowLeft,KittyPawCuffsElbowLeft +m_KittyPawCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_KittyPawCuffsElbowLeft_l_BandElbowLeft,BandElbowLeft +m_KittyPawCuffsElbowLeft_l_LockElbowLeft,LockElbowLeft +m_KittyPawCuffsElbowRight,KittyPawCuffsElbowRight +m_KittyPawCuffsElbowRight_l_ElbowRight,ElbowRight +m_KittyPawCuffsElbowRight_l_BandElbowRight,BandElbowRight +m_KittyPawCuffsElbowRight_l_LockElbowRight,LockElbowRight +m_KittyPawCuffsElbows,KittyPawCuffsElbows +m_KittyPawCuffsElbows_l_ElbowLeft,ElbowLeft +m_KittyPawCuffsElbows_l_BandElbowLeft,BandElbowLeft +m_KittyPawCuffsElbows_l_LockElbowLeft,LockElbowLeft +m_KittyPawCuffsElbows_l_ElbowRight,ElbowRight +m_KittyPawCuffsElbows_l_BandElbowRight,BandElbowRight +m_KittyPawCuffsElbows_l_LockElbowRight,LockElbowRight +m_KittyPawCuffsArms,KittyPawCuffsArms +m_KittyPawCuffsArms_l_WristLeft,WristLeft +m_KittyPawCuffsArms_l_BandWristLeft,BandWristLeft +m_KittyPawCuffsArms_l_LockWristLeft,LockWristLeft +m_KittyPawCuffsArms_l_WristRight,WristRight +m_KittyPawCuffsArms_l_BandWristRight,BandWristRight +m_KittyPawCuffsArms_l_LockWristRight,LockWristRight +m_KittyPawCuffsArms_l_ElbowLeft,ElbowLeft +m_KittyPawCuffsArms_l_BandElbowLeft,BandElbowLeft +m_KittyPawCuffsArms_l_LockElbowLeft,LockElbowLeft +m_KittyPawCuffsArms_l_ElbowRight,ElbowRight +m_KittyPawCuffsArms_l_BandElbowRight,BandElbowRight +m_KittyPawCuffsArms_l_LockElbowRight,LockElbowRight +m_KittyPawCuffsAnklesLeft,KittyPawCuffsAnklesLeft +m_KittyPawCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_KittyPawCuffsAnklesLeft_l_BandAnkleLeft,BandAnkleLeft +m_KittyPawCuffsAnklesLeft_l_LockAnkleLeft,LockAnkleLeft +m_KittyPawCuffsAnklesRight,KittyPawCuffsAnklesRight +m_KittyPawCuffsAnklesRight_l_AnkleRight,AnkleRight +m_KittyPawCuffsAnklesRight_l_BandAnkleRight,BandAnkleRight +m_KittyPawCuffsAnklesRight_l_LockAnkleRight,LockAnkleRight +m_KittyPawCuffsAnkles,KittyPawCuffsAnkles +m_KittyPawCuffsAnkles_l_AnkleRight,AnkleRight +m_KittyPawCuffsAnkles_l_BandAnkleRight,BandAnkleRight +m_KittyPawCuffsAnkles_l_LockAnkleRight,LockAnkleRight +m_KittyPawCuffsAnkles_l_AnkleLeft,AnkleLeft +m_KittyPawCuffsAnkles_l_BandAnkleLeft,BandAnkleLeft +m_KittyPawCuffsAnkles_l_LockAnkleLeft,LockAnkleLeft +m_KittyPawCuffsThighLeft,KittyPawCuffsThighLeft +m_KittyPawCuffsThighLeft_l_ThighLeft,ThighLeft +m_KittyPawCuffsThighLeft_l_BandThighLeft,BandThighLeft +m_KittyPawCuffsThighLeft_l_LockThighLeft,LockThighLeft +m_KittyPawCuffsThighRight,KittyPawCuffsThighRight +m_KittyPawCuffsThighRight_l_ThighRight,ThighRight +m_KittyPawCuffsThighRight_l_BandThighRight,BandThighRight +m_KittyPawCuffsThighRight_l_LockThighRight,LockThighRight +m_KittyPawCuffsThigh,KittyPawCuffsThigh +m_KittyPawCuffsThigh_l_ThighRight,ThighRight +m_KittyPawCuffsThigh_l_BandThighRight,BandThighRight +m_KittyPawCuffsThigh_l_LockThighRight,LockThighRight +m_KittyPawCuffsThigh_l_ThighLeft,ThighLeft +m_KittyPawCuffsThigh_l_BandThighLeft,BandThighLeft +m_KittyPawCuffsThigh_l_LockThighLeft,LockThighLeft +m_FashionKittyPawCuffsWristLeft,FashionKittyPawCuffsWristLeft +m_FashionKittyPawCuffsWristLeft_l_WristLeft,WristLeft +m_FashionKittyPawCuffsWristLeft_l_BandWristLeft,BandWristLeft +m_FashionKittyPawCuffsWristLeft_l_LockWristLeft,LockWristLeft +m_FashionKittyPawCuffsWristRight,FashionKittyPawCuffsWristRight +m_FashionKittyPawCuffsWristRight_l_WristRight,WristRight +m_FashionKittyPawCuffsWristRight_l_BandWristRight,BandWristRight +m_FashionKittyPawCuffsWristRight_l_LockWristRight,LockWristRight +m_FashionKittyPawCuffsWrists,FashionKittyPawCuffsWrists +m_FashionKittyPawCuffsWrists_l_WristLeft,WristLeft +m_FashionKittyPawCuffsWrists_l_BandWristLeft,BandWristLeft +m_FashionKittyPawCuffsWrists_l_LockWristLeft,LockWristLeft +m_FashionKittyPawCuffsWrists_l_WristRight,WristRight +m_FashionKittyPawCuffsWrists_l_BandWristRight,BandWristRight +m_FashionKittyPawCuffsWrists_l_LockWristRight,LockWristRight +m_FashionKittyPawCuffsElbowLeft,FashionKittyPawCuffsElbowLeft +m_FashionKittyPawCuffsElbowLeft_l_ElbowLeft,ElbowLeft +m_FashionKittyPawCuffsElbowLeft_l_BandElbowLeft,BandElbowLeft +m_FashionKittyPawCuffsElbowLeft_l_LockElbowLeft,LockElbowLeft +m_FashionKittyPawCuffsElbowRight,FashionKittyPawCuffsElbowRight +m_FashionKittyPawCuffsElbowRight_l_ElbowRight,ElbowRight +m_FashionKittyPawCuffsElbowRight_l_BandElbowRight,BandElbowRight +m_FashionKittyPawCuffsElbowRight_l_LockElbowRight,LockElbowRight +m_FashionKittyPawCuffsElbows,FashionKittyPawCuffsElbows +m_FashionKittyPawCuffsElbows_l_ElbowLeft,ElbowLeft +m_FashionKittyPawCuffsElbows_l_BandElbowLeft,BandElbowLeft +m_FashionKittyPawCuffsElbows_l_LockElbowLeft,LockElbowLeft +m_FashionKittyPawCuffsElbows_l_ElbowRight,ElbowRight +m_FashionKittyPawCuffsElbows_l_BandElbowRight,BandElbowRight +m_FashionKittyPawCuffsElbows_l_LockElbowRight,LockElbowRight +m_FashionKittyPawCuffsArms,FashionKittyPawCuffsArms +m_FashionKittyPawCuffsArms_l_WristLeft,WristLeft +m_FashionKittyPawCuffsArms_l_BandWristLeft,BandWristLeft +m_FashionKittyPawCuffsArms_l_LockWristLeft,LockWristLeft +m_FashionKittyPawCuffsArms_l_WristRight,WristRight +m_FashionKittyPawCuffsArms_l_BandWristRight,BandWristRight +m_FashionKittyPawCuffsArms_l_LockWristRight,LockWristRight +m_FashionKittyPawCuffsArms_l_ElbowLeft,ElbowLeft +m_FashionKittyPawCuffsArms_l_BandElbowLeft,BandElbowLeft +m_FashionKittyPawCuffsArms_l_LockElbowLeft,LockElbowLeft +m_FashionKittyPawCuffsArms_l_ElbowRight,ElbowRight +m_FashionKittyPawCuffsArms_l_BandElbowRight,BandElbowRight +m_FashionKittyPawCuffsArms_l_LockElbowRight,LockElbowRight +m_FashionKittyPawCuffsAnklesLeft,FashionKittyPawCuffsAnklesLeft +m_FashionKittyPawCuffsAnklesLeft_l_AnkleLeft,AnkleLeft +m_FashionKittyPawCuffsAnklesLeft_l_BandAnkleLeft,BandAnkleLeft +m_FashionKittyPawCuffsAnklesLeft_l_LockAnkleLeft,LockAnkleLeft +m_FashionKittyPawCuffsAnklesRight,FashionKittyPawCuffsAnklesRight +m_FashionKittyPawCuffsAnklesRight_l_AnkleRight,AnkleRight +m_FashionKittyPawCuffsAnklesRight_l_BandAnkleRight,BandAnkleRight +m_FashionKittyPawCuffsAnklesRight_l_LockAnkleRight,LockAnkleRight +m_FashionKittyPawCuffsAnkles,FashionKittyPawCuffsAnkles +m_FashionKittyPawCuffsAnkles_l_AnkleRight,AnkleRight +m_FashionKittyPawCuffsAnkles_l_BandAnkleRight,BandAnkleRight +m_FashionKittyPawCuffsAnkles_l_LockAnkleRight,LockAnkleRight +m_FashionKittyPawCuffsAnkles_l_AnkleLeft,AnkleLeft +m_FashionKittyPawCuffsAnkles_l_BandAnkleLeft,BandAnkleLeft +m_FashionKittyPawCuffsAnkles_l_LockAnkleLeft,LockAnkleLeft +m_FashionKittyPawCuffsThighLeft,FashionKittyPawCuffsThighLeft +m_FashionKittyPawCuffsThighLeft_l_ThighLeft,ThighLeft +m_FashionKittyPawCuffsThighLeft_l_BandThighLeft,BandThighLeft +m_FashionKittyPawCuffsThighLeft_l_LockThighLeft,LockThighLeft +m_FashionKittyPawCuffsThighRight,FashionKittyPawCuffsThighRight +m_FashionKittyPawCuffsThighRight_l_ThighRight,ThighRight +m_FashionKittyPawCuffsThighRight_l_BandThighRight,BandThighRight +m_FashionKittyPawCuffsThighRight_l_LockThighRight,LockThighRight +m_FashionKittyPawCuffsThigh,FashionKittyPawCuffsThigh +m_FashionKittyPawCuffsThigh_l_ThighRight,ThighRight +m_FashionKittyPawCuffsThigh_l_BandThighRight,BandThighRight +m_FashionKittyPawCuffsThigh_l_LockThighRight,LockThighRight +m_FashionKittyPawCuffsThigh_l_ThighLeft,ThighLeft +m_FashionKittyPawCuffsThigh_l_BandThighLeft,BandThighLeft +m_FashionKittyPawCuffsThigh_l_LockThighLeft,LockThighLeft +m_KittyPetLeotardUnder,KittyPetLeotardUnder +m_KittyPetLeotardUnder_l_Leotard,Leotard +m_KittyPetLeotardUnder_l_LeotardStripes,LeotardStripes +m_KittyPetLeotardUnder_l_LeotardChest,LeotardChest +m_KittyPetLeotardUnder_l_LeotardChestStripes,LeotardChestStripes +m_KittyPetLeotard,KittyPetLeotard +m_KittyPetLeotard_l_Leotard,Leotard +m_KittyPetLeotard_l_LeotardStripes,LeotardStripes +m_KittyPetLeotard_l_LeotardChest,LeotardChest +m_KittyPetLeotard_l_LeotardChestStripes,LeotardChestStripes +m_KittyPetLeotardRestraint,KittyPetLeotardRestraint +m_KittyPetLeotardRestraint_l_Leotard,Leotard +m_KittyPetLeotardRestraint_l_LeotardStripes,LeotardStripes +m_KittyPetLeotardRestraint_l_LeotardChest,LeotardChest +m_KittyPetLeotardRestraint_l_LeotardChestStripes,LeotardChestStripes +m_KittyPetUniformCollar,KittyPetUniformCollar +m_KittyPetUniformCollar_l_LeotardChestCollar,LeotardChestCollar +m_KittyPetUniformCollar_l_LeotardChestCollarLeft,LeotardChestCollarLeft +m_KittyPetUniformCollar_l_LeotardChestCollarStripes,LeotardChestCollarStripes +m_KittyPetUniformCollar_l_LeotardChestCollarStripesLeft,LeotardChestCollarStripesLeft +m_KittyPetUniformCollar_l_CollarDeco,CollarDeco +m_KittyPetUniformCollar_l_CollarDecoSymbol,CollarDecoSymbol +m_KittyPetUniformCollar_l_ShoulderCuffLeft,ShoulderCuffLeft +m_KittyPetUniformCollar_l_ShoulderCuffStripeLeft,ShoulderCuffStripeLeft +m_KittyPetUniformCollar_l_ShoulderCuffRight,ShoulderCuffRight +m_KittyPetUniformCollar_l_ShoulderCuffStripeRight,ShoulderCuffStripeRight +m_KittyPetTail,KittyPetTail +m_KittyPetTail_l_Tail,Tail +m_KittyPetTail_l_TailStripe,TailStripe +m_KittyPetBlindfold,KittyPetBlindfold +m_KittyPetBlindfold_l_BlindfoldRim,BlindfoldRim +m_KittyPetBlindfold_l_Blindfold,Blindfold +m_KittyPetBlindfold_l_BlindfoldBrow,BlindfoldBrow +m_FashionKittyPetBlindfold,FashionKittyPetBlindfold +m_FashionKittyPetBlindfold_l_BlindfoldRim,BlindfoldRim +m_FashionKittyPetBlindfold_l_Blindfold,Blindfold +m_FashionKittyPetBlindfold_l_BlindfoldBrow,BlindfoldBrow +m_KittyPetSteelCollar,KittyPetSteelCollar +m_KittyPetSteelCollar_l_Collar,Collar +m_KittyPetSteelCollar_l_CollarStripe,CollarStripe +m_FashionKittyPetSteelCollar,FashionKittyPetSteelCollar +m_FashionKittyPetSteelCollar_l_Collar,Collar +m_FashionKittyPetSteelCollar_l_CollarStripe,CollarStripe +m_KittyPetMittenLeft,KittyPetMittenLeft +m_KittyPetMittenLeft_l_GloveLeft,GloveLeft +m_KittyPetMittenLeft_l_GloveLeftPaw,GloveLeftPaw +m_KittyPetMittenLeft_l_ForeGloveLeft,ForeGloveLeft +m_KittyPetMittenLeft_l_ForeGloveLeftPaw,ForeGloveLeftPaw +m_KittyPetMittenLeft_l_WristLeft,WristLeft +m_KittyPetMittenLeft_l_BandWristLeft,BandWristLeft +m_KittyPetMittenLeft_l_LockWristLeft,LockWristLeft +m_KittyPetMittenLeft_l_ElbowLeft,ElbowLeft +m_KittyPetMittenLeft_l_BandElbowLeft,BandElbowLeft +m_KittyPetMittenLeft_l_LockElbowLeft,LockElbowLeft +m_KittyPetMittenRight,KittyPetMittenRight +m_KittyPetMittenRight_l_GloveRight,GloveRight +m_KittyPetMittenRight_l_GloveRightPaw,GloveRightPaw +m_KittyPetMittenRight_l_ForeGloveRight,ForeGloveRight +m_KittyPetMittenRight_l_ForeGloveRightPaw,ForeGloveRightPaw +m_KittyPetMittenRight_l_WristRight,WristRight +m_KittyPetMittenRight_l_BandWristRight,BandWristRight +m_KittyPetMittenRight_l_LockWristRight,LockWristRight +m_KittyPetMittenRight_l_ElbowRight,ElbowRight +m_KittyPetMittenRight_l_BandElbowRight,BandElbowRight +m_KittyPetMittenRight_l_LockElbowRight,LockElbowRight +m_KittyPetMittens,KittyPetMittens +m_KittyPetMittens_l_GloveLeft,GloveLeft +m_KittyPetMittens_l_GloveLeftPaw,GloveLeftPaw +m_KittyPetMittens_l_ForeGloveLeft,ForeGloveLeft +m_KittyPetMittens_l_ForeGloveLeftPaw,ForeGloveLeftPaw +m_KittyPetMittens_l_WristLeft,WristLeft +m_KittyPetMittens_l_BandWristLeft,BandWristLeft +m_KittyPetMittens_l_LockWristLeft,LockWristLeft +m_KittyPetMittens_l_ElbowLeft,ElbowLeft +m_KittyPetMittens_l_BandElbowLeft,BandElbowLeft +m_KittyPetMittens_l_LockElbowLeft,LockElbowLeft +m_KittyPetMittens_l_GloveRight,GloveRight +m_KittyPetMittens_l_GloveRightPaw,GloveRightPaw +m_KittyPetMittens_l_ForeGloveRight,ForeGloveRight +m_KittyPetMittens_l_ForeGloveRightPaw,ForeGloveRightPaw +m_KittyPetMittens_l_WristRight,WristRight +m_KittyPetMittens_l_BandWristRight,BandWristRight +m_KittyPetMittens_l_LockWristRight,LockWristRight +m_KittyPetMittens_l_ElbowRight,ElbowRight +m_KittyPetMittens_l_BandElbowRight,BandElbowRight +m_KittyPetMittens_l_LockElbowRight,LockElbowRight +m_FashionKittyPetMittenLeft,FashionKittyPetMittenLeft +m_FashionKittyPetMittenLeft_l_GloveLeft,GloveLeft +m_FashionKittyPetMittenLeft_l_GloveLeftPaw,GloveLeftPaw +m_FashionKittyPetMittenLeft_l_ForeGloveLeft,ForeGloveLeft +m_FashionKittyPetMittenLeft_l_ForeGloveLeftPaw,ForeGloveLeftPaw +m_FashionKittyPetMittenLeft_l_WristLeft,WristLeft +m_FashionKittyPetMittenLeft_l_BandWristLeft,BandWristLeft +m_FashionKittyPetMittenLeft_l_LockWristLeft,LockWristLeft +m_FashionKittyPetMittenLeft_l_ElbowLeft,ElbowLeft +m_FashionKittyPetMittenLeft_l_BandElbowLeft,BandElbowLeft +m_FashionKittyPetMittenLeft_l_LockElbowLeft,LockElbowLeft +m_FashionKittyPetMittenRight,FashionKittyPetMittenRight +m_FashionKittyPetMittenRight_l_GloveRight,GloveRight +m_FashionKittyPetMittenRight_l_GloveRightPaw,GloveRightPaw +m_FashionKittyPetMittenRight_l_ForeGloveRight,ForeGloveRight +m_FashionKittyPetMittenRight_l_ForeGloveRightPaw,ForeGloveRightPaw +m_FashionKittyPetMittenRight_l_WristRight,WristRight +m_FashionKittyPetMittenRight_l_BandWristRight,BandWristRight +m_FashionKittyPetMittenRight_l_LockWristRight,LockWristRight +m_FashionKittyPetMittenRight_l_ElbowRight,ElbowRight +m_FashionKittyPetMittenRight_l_BandElbowRight,BandElbowRight +m_FashionKittyPetMittenRight_l_LockElbowRight,LockElbowRight +m_FashionKittyPetMittens,FashionKittyPetMittens +m_FashionKittyPetMittens_l_GloveLeft,GloveLeft +m_FashionKittyPetMittens_l_GloveLeftPaw,GloveLeftPaw +m_FashionKittyPetMittens_l_ForeGloveLeft,ForeGloveLeft +m_FashionKittyPetMittens_l_ForeGloveLeftPaw,ForeGloveLeftPaw +m_FashionKittyPetMittens_l_WristLeft,WristLeft +m_FashionKittyPetMittens_l_BandWristLeft,BandWristLeft +m_FashionKittyPetMittens_l_LockWristLeft,LockWristLeft +m_FashionKittyPetMittens_l_ElbowLeft,ElbowLeft +m_FashionKittyPetMittens_l_BandElbowLeft,BandElbowLeft +m_FashionKittyPetMittens_l_LockElbowLeft,LockElbowLeft +m_FashionKittyPetMittens_l_GloveRight,GloveRight +m_FashionKittyPetMittens_l_GloveRightPaw,GloveRightPaw +m_FashionKittyPetMittens_l_ForeGloveRight,ForeGloveRight +m_FashionKittyPetMittens_l_ForeGloveRightPaw,ForeGloveRightPaw +m_FashionKittyPetMittens_l_WristRight,WristRight +m_FashionKittyPetMittens_l_BandWristRight,BandWristRight +m_FashionKittyPetMittens_l_LockWristRight,LockWristRight +m_FashionKittyPetMittens_l_ElbowRight,ElbowRight +m_FashionKittyPetMittens_l_BandElbowRight,BandElbowRight +m_FashionKittyPetMittens_l_LockElbowRight,LockElbowRight +m_KittyPetEars1,KittyPetEars1 +m_KittyPetEars1_l_Ears1L,Ears1L +m_KittyPetEars1_l_Ears1R,Ears1R +m_KittyPetEars1_l_Ears1InnerL,Ears1InnerL +m_KittyPetEars1_l_Ears1InnerR,Ears1InnerR +m_KittyPetEars2,KittyPetEars2 +m_KittyPetEars2_l_Ears2L,Ears2L +m_KittyPetEars2_l_Ears2R,Ears2R +m_KittyPetEars2_l_Ears2InnerL,Ears2InnerL +m_KittyPetEars2_l_Ears2InnerR,Ears2InnerR +m_KittyPetEarmuffs,KittyPetEarmuffs +m_KittyPetEarmuffs_l_Band,Band +m_KittyPetEarmuffs_l_EarmuffersL,EarmuffersL +m_KittyPetEarmuffs_l_EarmuffersR,EarmuffersR +m_KittyPetEarmuffsRestraint,KittyPetEarmuffsRestraint +m_KittyPetEarmuffsRestraint_l_Band,Band +m_KittyPetEarmuffsRestraint_l_EarmuffersL,EarmuffersL +m_KittyPetEarmuffsRestraint_l_EarmuffersR,EarmuffersR +m_KittyPetEars1Restraint,KittyPetEars1Restraint +m_KittyPetEars1Restraint_l_Ears1L,Ears1L +m_KittyPetEars1Restraint_l_Ears1R,Ears1R +m_KittyPetEars1Restraint_l_Ears1InnerL,Ears1InnerL +m_KittyPetEars1Restraint_l_Ears1InnerR,Ears1InnerR +m_KittyPetEars2Restraint,KittyPetEars2Restraint +m_KittyPetEars2Restraint_l_Ears2L,Ears2L +m_KittyPetEars2Restraint_l_Ears2R,Ears2R +m_KittyPetEars2Restraint_l_Ears2InnerL,Ears2InnerL +m_KittyPetEars2Restraint_l_Ears2InnerR,Ears2InnerR +m_KittyPetGag,KittyPetGag +m_KittyPetGag_l_Gag,Gag +m_KittyPetGag_l_GagCollar,GagCollar +m_KittyPetGagSeamless,KittyPetGagSeamless +m_KittyPetGagSeamless_l_GagSeamless,GagSeamless +m_KittyPetGagSeamless_l_GagCollar,GagCollar +m_KittyPetGagMouth,KittyPetGagMouth +m_KittyPetGagMouth_l_GagMouth,GagMouth +m_KittyPetGagMouth_l_GagCollar,GagCollar +m_KittyPetGagMouthSeamless,KittyPetGagMouthSeamless +m_KittyPetGagMouthSeamless_l_GagMouthSeamless,GagMouthSeamless +m_KittyPetGagMouthSeamless_l_GagCollar,GagCollar +m_FashionKittyPetGag,FashionKittyPetGag +m_FashionKittyPetGag_l_Gag,Gag +m_FashionKittyPetGag_l_GagCollar,GagCollar +m_FashionKittyPetGagSeamless,FashionKittyPetGagSeamless +m_FashionKittyPetGagSeamless_l_GagSeamless,GagSeamless +m_FashionKittyPetGagSeamless_l_GagCollar,GagCollar +m_FashionKittyPetGagMouth,FashionKittyPetGagMouth +m_FashionKittyPetGagMouth_l_GagMouth,GagMouth +m_FashionKittyPetGagMouth_l_GagCollar,GagCollar +m_FashionKittyPetGagMouthSeamless,FashionKittyPetGagMouthSeamless +m_FashionKittyPetGagMouthSeamless_l_GagMouthSeamless,GagMouthSeamless +m_FashionKittyPetGagMouthSeamless_l_GagCollar,GagCollar +m_KittyPetsuit,KittyPetsuit +m_KittyPetsuit_l_Arms,Arms +m_KittyPetsuit_l_ArmsPaws,ArmsPaws +m_KittyPetsuit_l_Legs,Legs +m_KittyPetsuit_l_LeftLegs,LeftLegs +m_KittyPetsuit_l_LeftLegsPaws,LeftLegsPaws +m_KittyPetsuit_l_FootRightKneel,FootRightKneel +m_KittyPetsuit_l_FootLeftHogtie,FootLeftHogtie +m_KittyPetsuit_l_FootLeftHogtiePaws,FootLeftHogtiePaws +m_KittyPetsuit_l_Leotard,Leotard +m_KittyPetsuit_l_LeotardChest,LeotardChest +m_KittyPetsuit_l_Collar,Collar +m_KittyPetSockLeft,KittyPetSockLeft +m_KittyPetSockLeft_l_SockLeft,SockLeft +m_KittyPetSockLeft_l_SockLeftPaws,SockLeftPaws +m_KittyPetSockLeft_l_FootLeftHogtie,FootLeftHogtie +m_KittyPetSockLeft_l_FootLeftHogtiePaws,FootLeftHogtiePaws +m_KittyPetSockRight,KittyPetSockRight +m_KittyPetSockRight_l_SockRight,SockRight +m_KittyPetSockRight_l_FootRightKneel,FootRightKneel +m_KittyPetSocks,KittyPetSocks +m_KittyPetSocks_l_SockRight,SockRight +m_KittyPetSocks_l_FootRightKneel,FootRightKneel +m_KittyPetSocks_l_SockLeft,SockLeft +m_KittyPetSocks_l_SockLeftPaws,SockLeftPaws +m_KittyPetSocks_l_FootLeftHogtie,FootLeftHogtie +m_KittyPetSocks_l_FootLeftHogtiePaws,FootLeftHogtiePaws +m_KittyPetSocksRestraint,KittyPetSocksRestraint +m_KittyPetSocksRestraint_l_SockRight,SockRight +m_KittyPetSocksRestraint_l_FootRightKneel,FootRightKneel +m_KittyPetSocksRestraint_l_SockLeft,SockLeft +m_KittyPetSocksRestraint_l_SockLeftPaws,SockLeftPaws +m_KittyPetSocksRestraint_l_FootLeftHogtie,FootLeftHogtie +m_KittyPetSocksRestraint_l_FootLeftHogtiePaws,FootLeftHogtiePaws +m_KittyPetPawLeft,KittyPetPawLeft +m_KittyPetPawLeft_l_SockLeft,SockLeft +m_KittyPetPawLeft_l_SockLeftPaws,SockLeftPaws +m_KittyPetPawLeft_l_FootLeftHogtie,FootLeftHogtie +m_KittyPetPawLeft_l_FootLeftHogtiePaws,FootLeftHogtiePaws +m_KittyPetPawLeft_l_ThighLeft,ThighLeft +m_KittyPetPawLeft_l_BandThighLeft,BandThighLeft +m_KittyPetPawLeft_l_LockThighLeft,LockThighLeft +m_KittyPetPawLeft_l_AnkleLeft,AnkleLeft +m_KittyPetPawLeft_l_BandAnkleLeft,BandAnkleLeft +m_KittyPetPawLeft_l_LockAnkleLeft,LockAnkleLeft +m_KittyPetPawRight,KittyPetPawRight +m_KittyPetPawRight_l_SockRight,SockRight +m_KittyPetPawRight_l_FootRightKneel,FootRightKneel +m_KittyPetPawRight_l_ThighRight,ThighRight +m_KittyPetPawRight_l_BandThighRight,BandThighRight +m_KittyPetPawRight_l_LockThighRight,LockThighRight +m_KittyPetPawRight_l_AnkleRight,AnkleRight +m_KittyPetPawRight_l_BandAnkleRight,BandAnkleRight +m_KittyPetPawRight_l_LockAnkleRight,LockAnkleRight +m_KittyPetPaws,KittyPetPaws +m_KittyPetPaws_l_SockRight,SockRight +m_KittyPetPaws_l_FootRightKneel,FootRightKneel +m_KittyPetPaws_l_ThighRight,ThighRight +m_KittyPetPaws_l_BandThighRight,BandThighRight +m_KittyPetPaws_l_LockThighRight,LockThighRight +m_KittyPetPaws_l_AnkleRight,AnkleRight +m_KittyPetPaws_l_BandAnkleRight,BandAnkleRight +m_KittyPetPaws_l_LockAnkleRight,LockAnkleRight +m_KittyPetPaws_l_SockLeft,SockLeft +m_KittyPetPaws_l_SockLeftPaws,SockLeftPaws +m_KittyPetPaws_l_FootLeftHogtie,FootLeftHogtie +m_KittyPetPaws_l_FootLeftHogtiePaws,FootLeftHogtiePaws +m_KittyPetPaws_l_ThighLeft,ThighLeft +m_KittyPetPaws_l_BandThighLeft,BandThighLeft +m_KittyPetPaws_l_LockThighLeft,LockThighLeft +m_KittyPetPaws_l_AnkleLeft,AnkleLeft +m_KittyPetPaws_l_BandAnkleLeft,BandAnkleLeft +m_KittyPetPaws_l_LockAnkleLeft,LockAnkleLeft +m_KittyPetPawsRestraint,KittyPetPawsRestraint +m_KittyPetPawsRestraint_l_SockRight,SockRight +m_KittyPetPawsRestraint_l_FootRightKneel,FootRightKneel +m_KittyPetPawsRestraint_l_ThighRight,ThighRight +m_KittyPetPawsRestraint_l_BandThighRight,BandThighRight +m_KittyPetPawsRestraint_l_LockThighRight,LockThighRight +m_KittyPetPawsRestraint_l_AnkleRight,AnkleRight +m_KittyPetPawsRestraint_l_BandAnkleRight,BandAnkleRight +m_KittyPetPawsRestraint_l_LockAnkleRight,LockAnkleRight +m_KittyPetPawsRestraint_l_SockLeft,SockLeft +m_KittyPetPawsRestraint_l_SockLeftPaws,SockLeftPaws +m_KittyPetPawsRestraint_l_FootLeftHogtie,FootLeftHogtie +m_KittyPetPawsRestraint_l_FootLeftHogtiePaws,FootLeftHogtiePaws +m_KittyPetPawsRestraint_l_ThighLeft,ThighLeft +m_KittyPetPawsRestraint_l_BandThighLeft,BandThighLeft +m_KittyPetPawsRestraint_l_LockThighLeft,LockThighLeft +m_KittyPetPawsRestraint_l_AnkleLeft,AnkleLeft +m_KittyPetPawsRestraint_l_BandAnkleLeft,BandAnkleLeft +m_KittyPetPawsRestraint_l_LockAnkleLeft,LockAnkleLeft +m_KittyPetPawShortLeft,KittyPetPawShortLeft +m_KittyPetPawShortLeft_l_SockLeft,SockLeft +m_KittyPetPawShortLeft_l_SockLeftPaws,SockLeftPaws +m_KittyPetPawShortLeft_l_FootLeftHogtie,FootLeftHogtie +m_KittyPetPawShortLeft_l_FootLeftHogtiePaws,FootLeftHogtiePaws +m_KittyPetPawShortRight,KittyPetPawShortRight +m_KittyPetPawShortRight_l_SockRight,SockRight +m_KittyPetPawShortRight_l_FootRightKneel,FootRightKneel +m_KittyPetPawsShort,KittyPetPawsShort +m_KittyPetPawsShort_l_SockRight,SockRight +m_KittyPetPawsShort_l_FootRightKneel,FootRightKneel +m_KittyPetPawsShort_l_SockLeft,SockLeft +m_KittyPetPawsShort_l_SockLeftPaws,SockLeftPaws +m_KittyPetPawsShort_l_FootLeftHogtie,FootLeftHogtie +m_KittyPetPawsShort_l_FootLeftHogtiePaws,FootLeftHogtiePaws +m_KittyPetPawsShortRestraint,KittyPetPawsShortRestraint +m_KittyPetPawsShortRestraint_l_SockRight,SockRight +m_KittyPetPawsShortRestraint_l_FootRightKneel,FootRightKneel +m_KittyPetPawsShortRestraint_l_SockLeft,SockLeft +m_KittyPetPawsShortRestraint_l_SockLeftPaws,SockLeftPaws +m_KittyPetPawsShortRestraint_l_FootLeftHogtie,FootLeftHogtie +m_KittyPetPawsShortRestraint_l_FootLeftHogtiePaws,FootLeftHogtiePaws + +KDHideItems,Hide Items +KDSortItems,Sort Items +KDDropItems,Drop Items +KDFilterItems,Filter Items +KDItemFilterRarity,Rarity +KDItemFilter_Restraint_Latex,Latex +KDItemFilter_Restraint_Slime,Slime +KDItemFilter_Restraint_Rope,Rope +KDItemFilter_Restraint_Ribbon,Ribbon +KDItemFilter_Restraint_Cloth,Cloth +KDItemFilter_Restraint_Leather,Leather +KDItemFilter_Restraint_Metal,Metal +KDItemFilter_Restraint_Cyber,Cyber +KDItemFilter_Restraint_Armor,Armor +KDItemFilter_Restraint_Special,Special +KDItemFilter_Restraint_Ancient,Ancient +KDItemFilter_Weapon_Physical,Physical +KDItemFilter_Weapon_Magic,Magical +KDItemFilter_Weapon_Utility,Utility +KDItemFilter_Weapon_Knives,Knives +KDItemFilter_Consumable_Potion,Potions +KDItemFilter_Consumable_Restoration,Restoration +KDItemFilter_Consumable_Power,Power +KDFindInInventory,Find In Inventory + +KinkyDungeonTrapSpawnLatexCube,"A huge rubber cube rises up out of the floor!" +NameLatexCube,Latex Cube +KillLatexCube,"The latex cube hardens into a solid, harmless entity." +AttackLatexCube,"The latex cube slowly engulfs you! (DamageTaken)" +AttackLatexCubeBind,"The latex cube touches you, spreading latex restraints across your body! (+RestraintAdded)" + +KinkyDungeonTrapSpawnLatexCubeSmall,"A small rubber cube rises up out of the floor!" +NameLatexCubeSmall,Mini Latex Cube +KillLatexCubeSmall,"The mini latex cube hardens into a solid, harmless entity." +AttackLatexCubeSmall,"The mini latex cube sticks to you! (DamageTaken)" +AttackLatexCubeSmallBind,"The mini latex cube expands across your body, taking the form of restraints! (+RestraintAdded)" + +NameSlimeKraken,Gigantic Slime +KillSlimeKraken,"The gigantic slime fizzles as its body becomes unstable!" +AttackSlimeKrakenBind,"The gigantic slime stretches a pseudopod and engulfs you! (+RestraintAdded)" +AttackSlimeKraken,"The gigantic slime slowly engulfs you! (DamageTaken)" +KinkyDungeonSummonMultiSmallSlime,A group of slimes jump out! +KinkyDungeonSummonSingleSmallSlime,A slime jumps out! +KinkyDungeonSummonMultiSmallSlimeLeaper,A group of speedy slimes jump out! +KinkyDungeonSummonSingleSmallSlimeLeaper,A speedy slime jumps out! + +KinkyDungeonInventoryItemChainSword,Chain Sword +KinkyDungeonInventoryItemChainSwordDesc,"Cut through their defenses and tie them up in the process!" +KinkyDungeonInventoryItemChainSwordDesc2,"Deals slash damage. Adds 10 metal binding." +ItemPickupChainSword,"You pick up sword with a bunch of chains attached." + +KinkyDungeonInventoryItemSlimeSword,Slime Sword +KinkyDungeonInventoryItemSlimeSwordDesc,"It wiggles as you move it around." +KinkyDungeonInventoryItemSlimeSwordDesc2,"Deals glue damage. Adds 25 slime binding." +ItemPickupSlimeSword,"You pick up slime-covered sword." + +KinkyDungeonInventoryItemFrostSword,Frost Blade +KinkyDungeonInventoryItemFrostSwordDesc,"As cold as its creator." +KinkyDungeonInventoryItemFrostSwordDesc2,"Deals 20 bonus ice damage and briefly slows the target." +ItemPickupFrostSword,"You pick up an icy sword." + +KinkyDungeonInventoryItemShield,Targe +KinkyDungeonInventoryItemShieldDesc,"Hide behind it while you still can." +KinkyDungeonInventoryItemShieldDesc2,"+60 Block. Deals crush damage and stuns for 4 turns. Offhand: Gives the same block bonus. Offhand bonuses from shields do not stack with a currently equipped shield." +ItemPickupShield,"You pick up a wooden shield." + +KinkyDungeonInventoryItemShieldTower,Tower Shield +KinkyDungeonInventoryItemShieldTowerDesc,"Now with more leg room." +KinkyDungeonInventoryItemShieldTowerDesc2,"Slows you down by 1 level. +120 Block, +30 Physical Armor. Deals crush damage and stuns for 7 turns. Offhand: Slows you and gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield." +ItemPickupShieldTower,"You pick up a metal tower shield." + +KinkyDungeonInventoryItemShieldReinforced,Reinforced Shield +KinkyDungeonInventoryItemShieldReinforcedDesc,"New and improved, but also clumsier." +KinkyDungeonInventoryItemShieldReinforcedDesc2,"+80 Block, +15 Physical Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield." +ItemPickupShieldReinforced,"You pick up a reinforced shield." + +KinkyDungeonInventoryItemShieldMagic,Runic Shield +KinkyDungeonInventoryItemShieldMagicDesc,"For when you've been tied up one too many times..." +KinkyDungeonInventoryItemShieldMagicDesc2,"+80 Block, +20 Magic Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield." +ItemPickupShieldMagic,"You pick up a runic shield." + +KinkyDungeonSpellGreaterInvisibility,Vanish +KinkyDungeonSpellTargetGreaterInvisibility,Select which creature to buff +KinkyDungeonSpellDescriptionGreaterInvisibility,"Make the targeted creature invisible, making you totally invisible for Duration turns. Attacking and casting spells reveals your presence but you are still harder to see." +KinkyDungeonSpellCastGreaterInvisibility,You snap your fingers! + +KinkyDungeonSlimeSpreadSuit,"The slime dissolves your clothing, leaving nothing but rubber against your skin..." + + +KinkyDungeonSpellRiposte,Riposte +KinkyDungeonSpellDescriptionRiposte,"Blocking an enemy attack makes them vulnerable and stuns them briefly." +KinkyDungeonSpellParry,Parry +KinkyDungeonSpellDescriptionParry,"+15 Block while holding a weapon." +KinkyDungeonSpellDaggerParry,Dagger Parry +KinkyDungeonSpellDescriptionDaggerParry,"+15 Block while holding a light weapon such as a knife or dagger." +KinkyDungeonSpellWillParry,Steadfast Guard +KinkyDungeonSpellDescriptionWillParry,"+5 Block for each 100 max willpower you have, while holding a non-light weapon." +KinkyDungeonSpellSteelParry,The Power of Steel +KinkyDungeonSpellDescriptionSteelParry,"+5 Block for each 100 max willpower you have, while holding a weapon that deals physical damage." +KinkyDungeonSpellGuardBoost,Secure Defense +KinkyDungeonSpellDescriptionGuardBoost,"+15-30 Block, based on your percentage of Willpower." + +KinkyDungeonAttackBlock,You block the EnemyName attack! +KinkyDungeonSpellBindBlock,You block EnemyName! +KinkyDungeonSpellBindMiss,You dodge EnemyName! +KinkyDungeonSpellBlock,You block the EnemyName! +KinkyDungeonSpellMiss,You dodge the EnemyName! + +KinkyDungeonSpell,Spell + +KDBondageResistBlockTotal,"You resist being bound!" + +KinkyDungeonStatSelfBondage,"Self Bondage Enthusiast" +KinkyDungeonStatDescSelfBondage,"Start with a basic self-bondage kit." + +KinkyDungeonStatStunBondage,"Apprehended" +KinkyDungeonStatDescStunBondage,"When you are bound by an enemy attack or spell, you are stunned 1 turn per restraint added." +KinkyDungeonStatEnemyArmor,"Feeble Attacks" +KinkyDungeonStatDescEnemyArmor,"All enemies gain 20 physical and magic armor." +KinkyDungeonStatEnemyDamage,"Glass Cannon" +KinkyDungeonStatDescEnemyDamage,"The effects of you taking damage are increased by 150%." +KinkyDungeonStatEnemyResist,"The Wand is Mightier" +KinkyDungeonStatDescEnemyResist,"Enemies have 30% more hp; Tease damage multiplier to bound targets is increased by 85%." +KDCategoryCommon,Kinky Armory + +NameChef,Chef +KillChef,"You defeat the chef and claim her prize." +AttackChefLock,"The chef makes sure you'll never steal again! (DamageTaken)" +AttackChefBind,"The chef makes sure you'll never steal again! (+RestraintAdded)" +AttackChef,"The chef spanks you with her frying pan! (DamageTaken)" + +KDSpawnChef,"As you eat, you look up and notice that someone is not very happy with you." + +ItemPickupBrownies,"You find some delicious brownies!" +KinkyDungeonInventoryItemBrownies,Double Fudge Brownie +KinkyDungeonInventoryItemBrowniesUse,"You enjoy the brownie one soft, delicious bite at a time." +KinkyDungeonInventoryItemBrowniesDesc,"A decadent blend of butter and chocolate topped with fudge and baked to perfection." +KinkyDungeonInventoryItemBrowniesDesc2,"Restores 30% willpower. Takes a few turns to eat." + +KinkyDungeonBuffHaunted,A playful ghost now accompanies you on your journey. +KDHaunting,"The ghost haunting you decides to have a little fun! (+RestraintAdded)" + +RestraintRopeSnakeRaw,Hemp Rope +RestraintRopeSnakeRawDesc,"The most common type of bondage rope." +RestraintRopeSnakeRawDesc2,"Soft and comfy. Great for casual wear!" + +RestraintRopeSnakeArmsBoxtie,Boxtie +RestraintRopeSnakeArmsBoxtieDesc,"A box tie keeping your arms secured behind your back." +RestraintRopeSnakeArmsBoxtieDesc2,"The ropes squeeze you gently." +RestraintRopeSnakeCuffs,Rope Cuffs +RestraintRopeSnakeCuffsDesc,"A quick tie for apprehending prisoners." +RestraintRopeSnakeCuffsDesc2,"It's not very secure." +RestraintRopeSnakeCuffsAdv,Chest Straps +RestraintRopeSnakeCuffsAdvDesc,"A quick tie for apprehending prisoners." +RestraintRopeSnakeCuffsAdvDesc2,"It's not very secure." +RestraintRopeSnakeCuffsAdv2,Chest Harness +RestraintRopeSnakeCuffsAdv2Desc,"The finishing touch on a tight and strict piece of ropework." +RestraintRopeSnakeCuffsAdv2Desc2,"It's not very secure." +RestraintRopeSnakeHogtie,Rope Hogtie +RestraintRopeSnakeHogtieDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintRopeSnakeHogtieDesc2,"It holds you strictly in a boxtie. You tug on the rope connecting your feet and struggle." +RestraintRopeSnakeHogtieLink,Rope Hogtie +RestraintRopeSnakeHogtieLinkDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintRopeSnakeHogtieLinkDesc2,"It holds you strictly with your back arched. You tug on the rope connecting your feet and struggle." +RestraintRopeSnakeBelt,Rope Belt +RestraintRopeSnakeBeltDesc,"A harness acting as a handle to pull you around" +RestraintRopeSnakeBeltDesc2,"The ropes squeeze you gently." +RestraintRopeSnakeHarness,Rope Harness +RestraintRopeSnakeHarnessDesc,"A harness that secures your other restraints and makes them tighter." +RestraintRopeSnakeHarnessDesc2,"The ropes squeeze you gently." +RestraintRopeSnakeCrotch,Crotch Rope +RestraintRopeSnakeCrotchDesc,"A tight rope impressing upon your most private areas..." +RestraintRopeSnakeCrotchDesc2,"The ropes squeeze you gently." +RestraintRopeSnakeArmsWrist,Wrist Rope +RestraintRopeSnakeArmsWristDesc,"A wrist and elbow tie keeping your arms secured behind your back." +RestraintRopeSnakeArmsWristDesc2,"The ropes squeeze you gently." +RestraintRopeSnakeLegs,Upper Knee Ropes +RestraintRopeSnakeLegsDesc,"A tie that hobbles your knees together.." +RestraintRopeSnakeLegsDesc2,"The ropes squeeze you gently." +RestraintRopeSnakeLegs2,Thigh Ropes +RestraintRopeSnakeLegs2Desc,"A tie that hobbles your legs together.." +RestraintRopeSnakeLegs2Desc2,"The ropes squeeze you gently." +RestraintRopeSnakeLegs3,Upper Thigh Ropes +RestraintRopeSnakeLegs3Desc,"A tie that hobbles your thighs together.." +RestraintRopeSnakeLegs3Desc2,"The ropes squeeze you gently." +RestraintRopeSnakeFeet,Ankle Ropes +RestraintRopeSnakeFeetDesc,"A tie keeping your feet secured together." +RestraintRopeSnakeFeetDesc2,"The ropes squeeze you gently." +RestraintRopeSnakeFeet2,Lower Leg Ropes +RestraintRopeSnakeFeet2Desc,"A tie keeping your feet secured together." +RestraintRopeSnakeFeet2Desc2,"The ropes squeeze you gently." +RestraintRopeSnakeFeet3,Lower Knee Ropes +RestraintRopeSnakeFeet3Desc,"A tie keeping your knees secured together." +RestraintRopeSnakeFeet3Desc2,"The ropes squeeze you gently." +RestraintRopeSnakeToes,Toe Rope +RestraintRopeSnakeToesDesc,"A tie keeping your toes tightly together." +RestraintRopeSnakeToesDesc2,"The ropes squeeze you gently." +RestraintRopeSnakeCollar,Living Rope Collar +RestraintRopeSnakeCollarDesc,"This collar is designed to make sure its wearer does not escape their ropes." +RestraintRopeSnakeCollarDesc2,"It will occasionally cause ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you." + + +KinkyDungeonInventoryItemLore,"Notebook Page" + +KinkyDungeonJailerDomLeashTime,"You're going to stay with me for a while~" +KinkyDungeonJailerDomLeashed,"That's better! Now stay close to me~" +KinkyDungeonJailerDomLeashEndSoon,"Looks like our time is coming to an end..." +KinkyDungeonJailerDomLeashEndReturn,"Time to bring you back to your place~" +KinkyDungeonJailerDomLeashEndNow,"You've been quite adorable! Until next time~" + +KinkyDungeonJailerSubLeashTime,"It's time for your walk, miss." +KinkyDungeonJailerSubLeashed,"Now let's see, where to go..." +KinkyDungeonJailerSubLeashEndSoon,"I think we've reached a stopping point." +KinkyDungeonJailerSubLeashEndReturn,"I have to put you back now~" +KinkyDungeonJailerSubLeashEndNow,"It's been fun playing with you miss!" + +KinkyDungeonJailerGaggedLeashTime,"(reaches for your leash)" +KinkyDungeonJailerGaggedLeashed,"(holds your leash firmly)" +KinkyDungeonJailerGaggedLeashEndSoon,"Mmmmph~" +KinkyDungeonJailerGaggedLeashEndReturn,"(giggles)" +KinkyDungeonJailerGaggedLeashEndNow,"(waves goodbye)" + +KinkyDungeonJailerLeashTime,"Why don't we go for a walk?" +KinkyDungeonJailerLeashed,"That's better! Now come along~" +KinkyDungeonJailerLeashEndSoon,"This has been lots of fun!" +KinkyDungeonJailerLeashEndReturn,"I have to go return you~" +KinkyDungeonJailerLeashEndNow,"Good girl~ Let's go again later~" + +KinkyDungeonJailerBratLeashTime,"It's time for walkies!" +KinkyDungeonJailerBratLeashed,"That's a good girl!" +KinkyDungeonJailerBratLeashEndSoon,"I want to keep you longer, but I've got things to do." +KinkyDungeonJailerBratLeashEndReturn,"It's time to go back to your little house~" +KinkyDungeonJailerBratLeashEndNow,"(pats you on the head)" + +KinkyDungeonJailerRobotLeashTime,"It is time for your mandatory exercise." +KinkyDungeonJailerRobotLeashed,"Please maintain proximity." +KinkyDungeonJailerRobotLeashEndSoon,"Progress Level: 90%" +KinkyDungeonJailerRobotLeashEndReturn,"Exercise complete. Returning to storage." +KinkyDungeonJailerRobotLeashEndNow,"Uploading logs to database. Error... no connection." + +NameMimicLatex,Latex Mimic +KillMimicLatex,"The latex mimic melts into a shiny puddle." +AttackMimicLatexBind,"The latex mimic spits out a glob of rubber at you! (+RestraintAdded)" +AttackMimicLatexPull,"The latex mimic stretches out an appendage and pulls you toward it! (DamageTaken)" +AttackMimicLatex,"The latex mimic engulfs you in sticky rubber! (DamageTaken)" + + +KDWardrobeBackToMenu,Back to Menu + +KinkyDungeonItemsUnderneathTotal,"Item Stack:" + +KDFilterFiltersAncient,Ancient +KDFilterFiltersCursed,Cursed +KDFilterFiltersHeavy,Heavy +KDFilterFiltersMage,Mage +KDFilterFiltersLight,Light +KDFilterFiltersAccessory,Accessory +KDFilterFiltersRestraint,Restraint +KDFilterFiltersArmor,Armor +KDFilterFiltersSpecial,Special +KDFilterFiltersEnchanted,Enchanted +KDFilterFiltersMundane,Mundane +KDFilterFiltersDisassemble,Can Disassemble +KDFilterFiltersRaw,Raw Material +KDFilterFiltersRope,Rope +KDFilterFiltersMetal,Metal +KDFilterFiltersLatex,Latex +KDFilterFiltersLeather,Leather +KDFilterFiltersArmbinders,Armbinders +KDFilterFiltersLegbinders,Legbinders +KDFilterFiltersBoxbinders,Boxbinders +KDFilterFiltersDevices,Devices +KDFilterFiltersVibes,Toys +KDFilterFiltersCollars,Collars +KDFilterFiltersStraitjackets,Jackets +KDFilterFiltersBindingDress,Dresses +KDFilterFiltersTies,Ties +KDFilterFiltersBelts,Belts +KDFilterFiltersWrapping,Wrapping +KDFilterFiltersCuffs,Cuffs +KDFilterFiltersChains,Chains +KDFilterFiltersCorsets,Corsets +KDFilterFiltersGags,Gags +KDFilterFiltersHarnesses,Harnesses +KDFilterFiltersMittens,Mittens +KDFilterFiltersBoots,Boots +KDFilterFiltersToys,Toys +KDFilterFiltersChastityBelts,C. Belts +KDFilterFiltersChastityBras,C. Bras +KDFilterFiltersCyber,Cyber +KDFilterFiltersMaid,Maid +KDFilterFiltersGood,Utility +KDFilterFiltersEnchanted,Enchanted +KDFilterFiltersUnlocked,Unlocked +KDFilterFiltersLocked,Locked +KDFilterFiltersUnblocked,Accessible +KDFilterFiltersBlocked,Inaccessible +KDFilterFiltersQuickBind,Quick-Bind +KDFilterFiltersTape,Tape + +KDFilterFiltersHead,Head + +KDFilterFiltersNeck,Neck +KDFilterFiltersArms,Arms + +KDFilterFiltersGloves,Gloves +KDFilterFiltersChest,Chest + +KDFilterFiltersTorso,Torso +KDFilterFiltersPanties,Panties + +KDFilterFiltersLegs,Lower +KDFilterFiltersAnkles,Ankles +KDFilterFiltersBoots,Boots + +RestraintStrongMagicRopeRaw,Spellbound Rope +RestraintStrongMagicRopeRawDesc,"An enchanted rope with a powerful sealing spell. It cannot be cut by mundane means." +RestraintStrongMagicRopeRawDesc2,"It almost has a kinky mind of its own." + +RestraintStrongMagicRopeArmsBoxtie,Spellbound Boxtie +RestraintStrongMagicRopeArmsBoxtieDesc,"A box tie keeping your arms secured behind your back." +RestraintStrongMagicRopeArmsBoxtieDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeCuffs,Spellbound Rope Cuffs +RestraintStrongMagicRopeCuffsDesc,"A quick tie for apprehending prisoners." +RestraintStrongMagicRopeCuffsDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeCuffsAdv,Spellbound Ropework +RestraintStrongMagicRopeCuffsAdvDesc,"A quick tie for apprehending prisoners, looped through buckles on the hand restraints." +RestraintStrongMagicRopeCuffsAdvDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeCuffsAdv2,Strict Spellbound Ropework +RestraintStrongMagicRopeCuffsAdv2Desc,"The finishing touches on a tight and strict piece of ropework." +RestraintStrongMagicRopeCuffsAdv2Desc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeHogtie,Spellbound Hogtie +RestraintStrongMagicRopeHogtieDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintStrongMagicRopeHogtieDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeHogtieLink,Spellbound Hogtie +RestraintStrongMagicRopeHogtieLinkDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintStrongMagicRopeHogtieLinkDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeBelt,Spellbound Rope Belt +RestraintStrongMagicRopeBeltDesc,"A harness acting as a handle to pull you around" +RestraintStrongMagicRopeBeltDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeHarness,Spellbound Harness +RestraintStrongMagicRopeHarnessDesc,"A harness that secures your other restraints and makes them tighter." +RestraintStrongMagicRopeHarnessDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeCrotch,Spellbound Crotch Rope +RestraintStrongMagicRopeCrotchDesc,"A tight rope impressing upon your most private areas..." +RestraintStrongMagicRopeCrotchDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeArmsWrist,Spellbound Wrist Tie +RestraintStrongMagicRopeArmsWristDesc,"A wrist and elbow tie keeping your arms secured behind your back." +RestraintStrongMagicRopeArmsWristDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeLegs,Spellbound Knees +RestraintStrongMagicRopeLegsDesc,"A tie that hobbles your knees together.." +RestraintStrongMagicRopeLegsDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeLegs2,Spellbound Thighs +RestraintStrongMagicRopeLegs2Desc,"A tie that holds your legs together.." +RestraintStrongMagicRopeLegs2Desc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeLegs3,Spellbound Upper Thighs +RestraintStrongMagicRopeLegs3Desc,"A tie that holds your thighs together.." +RestraintStrongMagicRopeLegs3Desc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeFeet,Spellbound Ankles +RestraintStrongMagicRopeFeetDesc,"A tie keeping your feet secured together." +RestraintStrongMagicRopeFeetDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeFeet2,Spellbound Lower Legs +RestraintStrongMagicRopeFeet2Desc,"A tie keeping your legs secured together." +RestraintStrongMagicRopeFeet2Desc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeFeet3,Spellbound Lower Knees +RestraintStrongMagicRopeFeet3Desc,"A tie keeping your knees secured together." +RestraintStrongMagicRopeFeet3Desc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeToes,Spellbound Toe Rope +RestraintStrongMagicRopeToesDesc,"A tie keeping your toes secured together." +RestraintStrongMagicRopeToesDesc2,"The knots appear to tie themselves together again, making them impossible to undo!" +RestraintStrongMagicRopeCollar,Living Spellbound Rope Collar +RestraintStrongMagicRopeCollarDesc,"This collar is designed to make sure its wearer does not escape their ropes." +RestraintStrongMagicRopeCollarDesc2,"It will occasionally cause spellbound ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you." + + + +RestraintWeakMagicRopeRaw,Magic Rope +RestraintWeakMagicRopeRawDesc,"A novice-level enchanted rope, relatively trivial to untie but resistant to mundane tools." +RestraintWeakMagicRopeRawDesc2,"Faintly glows with traces of devious thoughts." + +RestraintWeakMagicRopeArmsBoxtie,Magic Boxtie +RestraintWeakMagicRopeArmsBoxtieDesc,"A box tie keeping your arms secured behind your back." +RestraintWeakMagicRopeArmsBoxtieDesc2,"They glow with a trace of magic." +RestraintWeakMagicRopeCuffs,Magic Rope Cuffs +RestraintWeakMagicRopeCuffsDesc,"A quick tie for apprehending prisoners." +RestraintWeakMagicRopeCuffsDesc2,"It's not very secure." +RestraintWeakMagicRopeCuffsAdv,Magic Ropework +RestraintWeakMagicRopeCuffsAdvDesc,"A quick tie for apprehending prisoners, looped through buckles on the hand restraints." +RestraintWeakMagicRopeCuffsAdvDesc2,"It's not very secure." +RestraintWeakMagicRopeCuffsAdv2,Strict Magic Ropework +RestraintWeakMagicRopeCuffsAdv2Desc,"The finishing touches on a tight and strict piece of ropework." +RestraintWeakMagicRopeCuffsAdv2Desc2,"It's not very secure." +RestraintWeakMagicRopeHogtie,Magic Hogtie +RestraintWeakMagicRopeHogtieDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintWeakMagicRopeHogtieDesc2,"It's very secure. You tug on the rope connecting your feet and struggle." +RestraintWeakMagicRopeHogtieLink,Magic Hogtie +RestraintWeakMagicRopeHogtieLinkDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintWeakMagicRopeHogtieLinkDesc2,"It's very secure. You tug on the rope connecting your feet and struggle." +RestraintWeakMagicRopeBelt,Magic Rope Belt +RestraintWeakMagicRopeBeltDesc,"A harness acting as a handle to pull you around" +RestraintWeakMagicRopeBeltDesc2,"They glow with a trace of magic." +RestraintWeakMagicRopeHarness,Magic Harness +RestraintWeakMagicRopeHarnessDesc,"A harness that secures your other restraints and makes them tighter." +RestraintWeakMagicRopeHarnessDesc2,"They glow with a trace of magic." +RestraintWeakMagicRopeCrotch,Magic Crotch Rope +RestraintWeakMagicRopeCrotchDesc,"A tight rope impressing upon your most private areas..." +RestraintWeakMagicRopeCrotchDesc2,"They glow with a trace of magic." +RestraintWeakMagicRopeArmsWrist,Magic Wrist Tie +RestraintWeakMagicRopeArmsWristDesc,"A wrist and elbow tie keeping your arms secured behind your back." +RestraintWeakMagicRopeArmsWristDesc2,"They glow with a trace of magic." +RestraintWeakMagicRopeLegs,Magic Knee Tie +RestraintWeakMagicRopeLegsDesc,"A tie that hobbles your knees together.." +RestraintWeakMagicRopeLegsDesc2,"They glow with a trace of magic." +RestraintWeakMagicRopeLegs2,Magic Thigh Ropes +RestraintWeakMagicRopeLegs2Desc,"A tie that hobbles your legs together.." +RestraintWeakMagicRopeLegs2Desc2,"They glow with a trace of magic." +RestraintWeakMagicRopeLegs3,Magic Upper Thigh Ropes +RestraintWeakMagicRopeLegs3Desc,"A tie that hobbles your thighs together.." +RestraintWeakMagicRopeLegs3Desc2,"They glow with a trace of magic." +RestraintWeakMagicRopeFeet,Magic Ankle Tie +RestraintWeakMagicRopeFeetDesc,"A tie keeping your feet secured together." +RestraintWeakMagicRopeFeetDesc2,"They glow with a trace of magic." +RestraintWeakMagicRopeFeet2,Magic Lower Leg Tie +RestraintWeakMagicRopeFeet2Desc,"A tie keeping your legs secured together." +RestraintWeakMagicRopeFeet2Desc2,"They glow with a trace of magic." +RestraintWeakMagicRopeFeet3,Magic Lower Knee Tie +RestraintWeakMagicRopeFeet3Desc,"A tie keeping your knees secured together." +RestraintWeakMagicRopeFeet3Desc2,"They glow with a trace of magic." +RestraintWeakMagicRopeToes,Magic Toe Rope +RestraintWeakMagicRopeToesDesc,"A tie keeping your toes secured together." +RestraintWeakMagicRopeToesDesc2,"They glow with a trace of magic." +RestraintWeakMagicRopeCollar,Living Magic Rope Collar +RestraintWeakMagicRopeCollarDesc,"This collar is designed to make sure its wearer does not escape their ropes." +RestraintWeakMagicRopeCollarDesc2,"It will occasionally cause magic ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you." + + +RestraintCelestialRopeRaw,Celestial Rope +RestraintCelestialRopeRawDesc,"Rope that has been exposed to solar energies." +RestraintCelestialRopeRawDesc2,"Squeezes the wearer if she tries to escape, so that she knows her place." + +RestraintCelestialRopeArmsBoxtie,Holy Boxtie +RestraintCelestialRopeArmsBoxtieDesc,"A box tie keeping your arms secured behind your back." +RestraintCelestialRopeArmsBoxtieDesc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeCuffs,Holy Rope Cuffs +RestraintCelestialRopeCuffsDesc,"A quick tie for apprehending prisoners." +RestraintCelestialRopeCuffsDesc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeCuffsAdv,Holy Ropework +RestraintCelestialRopeCuffsAdvDesc,"A quick tie for apprehending prisoners, looped through buckles on the hand restraints." +RestraintCelestialRopeCuffsAdvDesc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeCuffsAdv2,Strict Holy Ropework +RestraintCelestialRopeCuffsAdv2Desc,"The finishing touches on a tight and strict piece of ropework." +RestraintCelestialRopeCuffsAdv2Desc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeHogtie,Holy Hogtie +RestraintCelestialRopeHogtieDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintCelestialRopeHogtieDesc2,"It holds you strictly in a boxtie. You tug on the rope connecting your feet and struggle." +RestraintCelestialRopeHogtieLink,Holy Hogtie +RestraintCelestialRopeHogtieLinkDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintCelestialRopeHogtieLinkDesc2,"It holds you strictly with your back arched. You tug on the rope connecting your feet and struggle." +RestraintCelestialRopeBelt,Holy Rope Belt +RestraintCelestialRopeBeltDesc,"A harness acting as a handle to pull you around" +RestraintCelestialRopeBeltDesc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeHarness,Holy Rope Harness +RestraintCelestialRopeHarnessDesc,"A harness that secures your other restraints and makes them tighter." +RestraintCelestialRopeHarnessDesc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeCrotch,Holy Crotch Rope +RestraintCelestialRopeCrotchDesc,"A tight rope impressing upon your most private areas..." +RestraintCelestialRopeCrotchDesc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeArmsWrist,Holy Wrist Rope +RestraintCelestialRopeArmsWristDesc,"A wrist and elbow tie keeping your arms secured behind your back." +RestraintCelestialRopeArmsWristDesc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeLegs,Holy Upper Knee Ropes +RestraintCelestialRopeLegsDesc,"A tie that hobbles your knees together.." +RestraintCelestialRopeLegsDesc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeLegs2,Holy Thigh Ropes +RestraintCelestialRopeLegs2Desc,"A tie that hobbles your legs together.." +RestraintCelestialRopeLegs2Desc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeLegs3,Holy Upper Thigh Ropes +RestraintCelestialRopeLegs3Desc,"A tie that holds your thighs together.." +RestraintCelestialRopeLegs3Desc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeFeet,Holy Ankle Ropes +RestraintCelestialRopeFeetDesc,"A tie keeping your feet secured together." +RestraintCelestialRopeFeetDesc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeFeet2,Holy Lower Leg Ropes +RestraintCelestialRopeFeet2Desc,"A tie keeping your legs secured together." +RestraintCelestialRopeFeet2Desc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeFeet3,Holy Lower Knee Ropes +RestraintCelestialRopeFeet3Desc,"A tie keeping your knees secured together." +RestraintCelestialRopeFeet3Desc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeToes,Holy Toe Rope +RestraintCelestialRopeToesDesc,"A tie keeping your toes secured together." +RestraintCelestialRopeToesDesc2,"A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body." +RestraintCelestialRopeCollar,Living Holy Rope Collar +RestraintCelestialRopeCollarDesc,"This collar is designed to make sure its wearer does not escape their ropes." +RestraintCelestialRopeCollarDesc2,"It will occasionally cause holy ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you." + + + +RestraintMithrilRopeRaw,Mithril Rope +RestraintMithrilRopeRawDesc,"Rope made from silver thread, exposed to lunar energies." +RestraintMithrilRopeRawDesc2,"Lightweight yet unyielding. Truly a high class rope." + + +RestraintMithrilRopeArmsBoxtie,Mithril Boxtie +RestraintMithrilRopeArmsBoxtieDesc,"A box tie keeping your arms secured behind your back." +RestraintMithrilRopeArmsBoxtieDesc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeCuffs,Mithril Rope Cuffs +RestraintMithrilRopeCuffsDesc,"A quick tie for apprehending prisoners." +RestraintMithrilRopeCuffsDesc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeCuffsAdv,Mithril Ropework +RestraintMithrilRopeCuffsAdvDesc,"A quick tie for apprehending prisoners, looped through buckles on the hand restraints." +RestraintMithrilRopeCuffsAdvDesc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeCuffsAdv2,Strict Mithril Ropework +RestraintMithrilRopeCuffsAdv2Desc,"The finishing touches on a tight and strict piece of ropework." +RestraintMithrilRopeCuffsAdv2Desc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeHogtie,Mithril Hogtie +RestraintMithrilRopeHogtieDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintMithrilRopeHogtieDesc2,"It holds you strictly in a boxtie. You tug on the rope connecting your feet and struggle." +RestraintMithrilRopeHogtieLink,Mithril Hogtie +RestraintMithrilRopeHogtieLinkDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintMithrilRopeHogtieLinkDesc2,"It holds you strictly with your back arched. You tug on the rope connecting your feet and struggle." +RestraintMithrilRopeBelt,Mithril Rope Belt +RestraintMithrilRopeBeltDesc,"A harness acting as a handle to pull you around" +RestraintMithrilRopeBeltDesc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeHarness,Mithril Rope Harness +RestraintMithrilRopeHarnessDesc,"A harness that secures your other restraints and makes them tighter." +RestraintMithrilRopeHarnessDesc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeCrotch,Mithril Crotch Rope +RestraintMithrilRopeCrotchDesc,"A tight rope impressing upon your most private areas..." +RestraintMithrilRopeCrotchDesc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeArmsWrist,Mithril Wrist Rope +RestraintMithrilRopeArmsWristDesc,"A wrist and elbow tie keeping your arms secured behind your back." +RestraintMithrilRopeArmsWristDesc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeLegs,Mithril Lower Knee Ropes +RestraintMithrilRopeLegsDesc,"A tie that hobbles your knees together.." +RestraintMithrilRopeLegsDesc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeLegs2,Mithril Thigh Ropes +RestraintMithrilRopeLegs2Desc,"A tie that hobbles your thighs together.." +RestraintMithrilRopeLegs2Desc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeLegs3,Mithril Upper Thigh Ropes +RestraintMithrilRopeLegs3Desc,"A tie that holds your thighs together.." +RestraintMithrilRopeLegs3Desc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeFeet,Mithril Ankle Ropes +RestraintMithrilRopeFeetDesc,"A tie keeping your feet secured together." +RestraintMithrilRopeFeetDesc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeFeet2,Mithril Lower Leg Ropes +RestraintMithrilRopeFeet2Desc,"A tie keeping your legs secured together." +RestraintMithrilRopeFeet2Desc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeFeet3,Mithril Lower Knee Ropes +RestraintMithrilRopeFeet3Desc,"A tie keeping your knees secured together." +RestraintMithrilRopeFeet3Desc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeToes,Mithril Toe Ropes +RestraintMithrilRopeToesDesc,"A tie keeping your toes secured together." +RestraintMithrilRopeToesDesc2,"A lightweight rope made out of woven mithril, smooth yet nearly unbreakable." +RestraintMithrilRopeCollar,Living Mithril Rope Collar +RestraintMithrilRopeCollarDesc,"This collar is designed to make sure its wearer does not escape their ropes." +RestraintMithrilRopeCollarDesc2,"It will occasionally cause mithril ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you." + + +KDEffectTileTooltipPortals/DarkPortal,Dark Portal +KDEffectTileTooltipPortals/DarkPortalDesc,"They are trying to take you somewhere!" + +KDEffectTileTooltipDistractionMote,Essence Mote +KDEffectTileTooltipDistractionMoteDesc,"A trainee can use this to focus." +KDEffectTileTooltipDistractionMoteContact,Essence Mote +KDEffectTileTooltipDistractionMoteContactDesc,"Pick this up to gain decaying miscast reduction." +KDEffectTileTooltipSealSigil,Seal Sigil +KDEffectTileTooltipSealSigilDesc,"Walk over it to erase it and unlock the next floor." + +NameDemonEye,The Shadow +KillDemonEye,"The Shadow is exorcised... for now." +AttackDemonEyeBind,"The Shadow overwhelms you with its power... (+RestraintAdded)" +AttackDemonEye,"The Shadow welcomes you to your new future. (DamageTaken)" +AttackDemonEyeLock,"The Shadow cackles as your restraints are sealed! (DamageTaken)" +KDObserverVanishFail,"The Shadow smiles and vanishes." +KDObserverVanishSucceed,"The Shadow smiles and vanishes, leaving you locked in a mysterious RNAME..." + +NameObserver,Observer +KillObserver,The observer is banished into the aether. + +KinkyDungeonFactionObserver,From the Beyond + +KinkyDungeonTrapSpawnLatexCubeMetal,"You briefly spot your reflection as a reflective cube appears!" +NameLatexCubeMetal,Mini Metal Cube +KillLatexCubeMetal,"The liquid metal cube shatters into glittering dust." +AttackLatexCubeMetal,"The liquid metal cube sticks to you and hardens! (DamageTaken)" +AttackLatexCubeMetalBind,"The liquid metal cube expands across your body and hardens, taking the form of restraints! (+RestraintAdded)" + + +RestraintLiquidMetalRaw,Liquid Metal +RestraintLiquidMetalRawDesc,"Primordial latex infused with mineral form." +RestraintLiquidMetalRawDesc2,"Heavy and weighs the wearer down." + +RestraintLiquidMetalBoots,Liquid Metal (Feet) +RestraintLiquidMetalBootsDesc,"A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity." +RestraintLiquidMetalBootsDesc2,"Forming a skintight layer, it will be quite difficult to escape this." +RestraintLiquidMetalFeet,Liquid Metal (Ankles) +RestraintLiquidMetalFeetDesc,"A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity." +RestraintLiquidMetalFeetDesc2,"Forming a skintight layer, it will be quite difficult to escape this." +RestraintLiquidMetalLegs,Liquid Metal (Legs) +RestraintLiquidMetalLegsDesc,"A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity." +RestraintLiquidMetalLegsDesc2,"Forming a skintight layer, it will be quite difficult to escape this." +RestraintLiquidMetalArms,Liquid Metal (Arms) +RestraintLiquidMetalArmsDesc,"A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity." +RestraintLiquidMetalArmsDesc2,"Forming a skintight layer, it will be quite difficult to escape this." +RestraintLiquidMetalHands,Liquid Metal (Hands) +RestraintLiquidMetalHandsDesc,"A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity." +RestraintLiquidMetalHandsDesc2,"Forming a skintight layer, it will be quite difficult to escape this." +RestraintLiquidMetalMouth,Liquid Metal (Mouth) +RestraintLiquidMetalMouthDesc,"A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity." +RestraintLiquidMetalMouthDesc2,"Forming a skintight layer, it will be quite difficult to escape this." +RestraintLiquidMetalHead,Liquid Metal (Head) +RestraintLiquidMetalHeadDesc,"A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity." +RestraintLiquidMetalHeadDesc2,"Forming a skintight layer, it will be quite difficult to escape this." +RestraintLiquidMetalCollar,Living Liquid Metal Collar +RestraintLiquidMetalCollarDesc,"This collar is designed to make sure its wearer does not escape the metal." +RestraintLiquidMetalCollarDesc2,"It will occasionally cause liquid metal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of liquid metal you have on you." + + +KDRandomStairTeleportFail,"The stairs dissolve right before you!" +KDRandomStairTeleport,"The stairs dissolve as you step onto them, pulling you with them to somewhere else." + +KDObserverCurseApply,"A dark energy enters your body... (DamageDealt)" +KinkyDungeonBuffCursed,"A dark energy lurks within you." +KDObserverCursed,"You succumb to a dark desire... (+RestraintAdded)" + +KinkyDungeonSpellObserverBeamBeam,Observer's Gaze + +KinkyDungeonInventoryItemStaffTape,Industrial Tape Wand +KinkyDungeonInventoryItemStaffTapeDesc,"A non-magical tape wand used for creating tight little packages." +KinkyDungeonInventoryItemStaffTapeDesc2,"Deals chain damage. 200% binding efficiency. Hitting an enemy applies the Taped debuff for 12 turns, increasing Chain damage to them by 15%. Deal 10 chain damage to adjacent Taped enemies while moving." +ItemPickupStaffTape,"You pick up a staff of chains. You have fond memories..." + + +KinkyDungeonInventoryItemBagOfGoodies,Bag of Goodies +KinkyDungeonInventoryItemBagOfGoodiesDesc,"Someone's secret stash." +KinkyDungeonInventoryItemBagOfGoodiesDesc2,"Deals charm damage. Applies a toy to targets hit for 40 turns. Offhand: Applies a toy to targets you hit." +ItemPickupBagOfGoodies,"You find a bag filled with various toys and vibrators..." +KinkyDungeonPlaySelfBagOfGoodies,"You play with yourself using some of the toys in the bag..." + +KinkyDungeonInventoryItemVibeRemote,Magic Remote +KinkyDungeonInventoryItemVibeRemoteDesc,"The key to absolute power." +KinkyDungeonInventoryItemVibeRemoteDesc2,"Triggers long-duration edging on basic attack if the target has a toy. Offhand: Applies short-duration teasing to targets you hit." +ItemPickupVibeRemote,"You find a bag filled with various toys and vibrators..." + +KinkyDungeonSpellCommandVibrateVibeRemote,Vibrator Remote +KinkyDungeonSpellTargetCommandVibrateVibeRemote,Select an area +KinkyDungeonSpellCastCommandVibrateVibeRemote,"You click the remote and hear a buzzing noise!" +KinkyDungeonSpecialVibeRemote,"15 charge to powerfully activate vibrators in an area for 15 turns." + +KinkyDungeonSpellCommandVibrateBagOfGoodies,Vibrator Remote +KinkyDungeonSpellTargetCommandVibrateBagOfGoodies,Select an area +KinkyDungeonSpellCastCommandVibrateBagOfGoodies,"You click the remote and hear a buzzing noise!" +KinkyDungeonSpecialBagOfGoodies,"10 charge to activate vibrators in an area for 15 turns." + +LootChestAncientCoreSingle,"You find a golden crystal. It glows faintly." +LootChestAncientCoreSingleSpent,"You find a dull, gold-tinted crystal." + +KDQuickLoadoutSave,"Save Loadout" + +KinkyDungeonInventoryItemDildoBat,Rubber Stick +KinkyDungeonInventoryItemDildoBatDesc,"A rubber cylinder without any lewd intentions whatsoever." +KinkyDungeonInventoryItemDildoBatDesc2,"Deals grope damage. " +ItemPickupDildoBat,"You pick up a flexible rubber stick." + +KinkyDungeonInventoryItemDildoBatPlus,"Blade of Ejahl" +KinkyDungeonInventoryItemDildoBatPlusDesc,"A piece of prized ancient equipment. Magical energy causes it to vibrate intensely. What could it have been used for?" +KinkyDungeonInventoryItemDildoBatPlusDesc2,"Deals grope damage. Can spend 40 charge to add charm damage per hit for 10 turns." +ItemPickupDildoBatPlus,"You retrieve the Blade of Ejahl." + +KinkyDungeonBuffDildoBatBuff,"Intense Vibrations: The Blade of Ejahl deals bonus charm damage!!!" +KinkyDungeonSpellCastDildoBatBuff,"The Blade of Fla-peh buzzes with great power!" +KinkyDungeonSpecialDildoBatPlus,"40 charge to deal 30 charm damage per hit for 10 turns." + +KinkyDungeonInventoryItemMagicRope,Enchanted Rope +KinkyDungeonInventoryItemMagicRopeDesc,"She who lives by the rope, is tied up by the rope." +KinkyDungeonInventoryItemMagicRopeDesc2,"Deals chain damage and applies 50 points of rope binding. Draws 10 mana per hit to apply 50 extra points of magical binding. If you don't have mana, you fail to control the rope..." +ItemPickupMagicRope,"You find some enchanted rope." +KDMagicRopeBackfire,"Without mana to control it, the enchanted rope springs back upon you!" + +KinkyDungeonInventoryItemBow,Light Bow +KinkyDungeonInventoryItemBowDesc,"Pointy stick delivery system." +KinkyDungeonInventoryItemBowDesc2,"Reload time: None. Deals crush damage on melee. Draws 10 charge and 20 stamina to fire an ordinary arrow, dealing 30 pierce damage." +ItemPickupBow,"You find a wooden bow." +KinkyDungeonSpecialBow,"10 charge to fire an arrow. Deals 30 pierce damage." +KinkyDungeonSpellTargetArrowNormal,Choose projectile path +KinkyDungeonSpellArrowNormal,Arrow +KinkyDungeonSpellCastArrowNormal,"You loose an arrow!" + +KinkyDungeonSpellArrowFireSpell,Fire Arrows +KinkyDungeonSpellDescriptionArrowFireSpell,"Converts arrows to fire arrows for 30 extra charge, which deal the arrow damage plus 20 as fire damage in a 3x3 area and stuns briefly." +KDSwitchArrowFireSpell,"You switch to using fire arrows." +KinkyDungeonSpellArrowFire,Fire Arrow + +KinkyDungeonSpellArrowVineSpell,Vine Arrows +KinkyDungeonSpellDescriptionArrowVineSpell,"Converts arrows to all-natural organic versions for 20 extra charge, which apply 80 binding to the target and deal chain damage instead." +KDSwitchArrowVineSpell,"You switch to using vine arrows." +KinkyDungeonSpellArrowVine,Vine Arrow +KinkyDungeonSpellArrowVineBind,"A sudden burst of vines overtakes you as you find yourself wrapped up tightly!" + +LootArcheryKit,"You find a bow and a glowing crystal. The bow is scribed with runes of duplication." + +KinkyDungeonInventoryItemCrossbow,Crossbow +KinkyDungeonInventoryItemCrossbowDesc,"Watch where you're pointing that thing!" +KinkyDungeonInventoryItemCrossbowDesc2,"Reload time: 3 stationary turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 65 pierce damage." +ItemPickupCrossbow,"You find a crossbow." +KinkyDungeonSpecialCrossbow,"20 charge to fire a bolt. Deals 65 pierce damage." +KinkyDungeonSpellTargetArrowBolt,Choose projectile path +KinkyDungeonSpellArrowBolt,Bolt +KinkyDungeonSpellCastArrowBolt,"You pull the trigger!" + +KDIceMelt,"Your RestraintName melts off!" +KDIceMeltProgress,"Your RestraintName melts faster with the application of fire!" +KDIceMeltCancelProgress,"Your RestraintName hardens with the application of frost!" + +KinkyDungeonSpellNull,Unique +KDdmg,dmg + +KDVariableModifier_Evasion,"AMNT Evasion" +KDVariableModifier_Accuracy,"AMNT% Accuracy" +KDVariableModifier_SpellWard,"AMNT Magic Armor" +KDVariableModifier_Armor,"AMNT Physical Armor" +KDVariableModifier_BondageResist,"AMNT Bondage Resist" +KDVariableModifier_DamageResist,"AMNT TYPE Resist" +KDVariableModifier_DamageBuff,"AMNT% TYPE Damage" +KDVariableModifier_BaseDamageBuffMelee,"AMNT% weapon phys. dmg" +KDVariableModifier_BaseDamageBuffMagic,"AMNT% weapon magic dmg" +KDVariableModifier_ElementalEcho,"Infuse weapon AMNT% TYPE" +KDVariableModifier_ElementalDmg,"AMNT TYPE on attack" +KDVariableModifier_ManaCost,"AMNT Mana Efficiency" +KDVariableModifier_ManaCostSpecific,"AMNT TYPE Mana Efficiency" +KDVariableModifier_ManaRegen,"AMNT% regen from mana pool" +KDVariableModifier_ManaRegenOnKill,"AMNT mana pool on capture" +KDVariableModifier_Sneak,"AMNT% Visibility Reduction" +KDVariableModifier_DPDecay,"AMNT Distraction Decay" +KDVariableModifier_DPGain,"AMNT Distraction Per Turn" +KDVariableModifier_DPGainWhenAttacked,"AMNT AP from attacks" + +KDModifierCondition_OnTease,"After attacking with a teasing weapon:" + +KDModifierEffect_SpellDamageBuff,"Gain AMNT% Spell Damage for DRTN turns" + +KDVariableModifier_AntiMagic,"Drains mana from the wearer." + +KDVariableModifier_,"AMNT Stat" + +KinkyDungeonDrop,Drop On Floor + +KinkyDungeonRemove,Remove +KinkyDungeonUnlock,Unlock +KinkyDungeonStruggle,Struggle + +KinkyDungeonInventoryItemLeylineMap,Leyline Map + +RestraintPanelPlugGagHarness,Harness Plug Gag +RestraintPanelPlugGagHarnessDesc,"A gag meant to keep people quiet by forcing a plug into their mouth and securing it in place with a strict harness." +RestraintPanelPlugGagHarnessDesc2,"It is difficult to pull off and though it is made from supple, heavy duty leather." + + +KDCurseTransformNew,"Your OLDITM transforms into NEWITM!" +KDCurseTransform,"Your OLDITM gains new properties!" + + +NameEpicenterCursed,Moon-Cursed Epicenter +KillEpicenterCursed,"The cursed epicenter disperses into black stardust." +KDEpicenterAbortNoCurse_EpicenterCursed,"The cursed epicenter retreats as you remove the last of your cursed restraints!" +KDEpicenterAbortInvalid_EpicenterCursed,"The cursed epicenter retreats as you are claimed by something else!" +KDEpicenterCurseDamage,"The cursed epicenter assaults your mind with its presence! (DamageDealt)" +KDEpicenterCurseEffectStart,"You feel your cursed items turn cold to the touch!" +KDEpicenterCurseEffectEnd,"An cursed collar appears around your neck, feeling cold to the touch." +KinkyDungeonSpellCursingCircle,Cursing Sigil +KinkyDungeonSpellCastCursingCircle,"A cursing sigil appears on the ground!" +KinkyDungeonBuffCursingCircle,"You are being cursed!!!" + +NameEpicenterCursed2,Star-Cursed Epicenter +KillEpicenterCursed2,"The cursed epicenter disperses into black stardust." +KDEpicenterAbortNoCurse_EpicenterCursed2,"The cursed epicenter retreats as you remove the last of your cursed restraints!" +KDEpicenterAbortInvalid_EpicenterCursed2,"The cursed epicenter retreats as you are claimed by something else!" +KinkyDungeonSpellCursingCircle2,Cursing Sigil +KinkyDungeonSpellCastCursingCircle2,"A cursing sigil appears on the ground!" + +RestraintCursedCollar,Moondust Collar +RestraintCursedCollarDesc,"'You thought you could run forever, didn't you? Fate has a way of always catching up to you...'" +RestraintCursedCollarDesc2,"Cannot be removed while you are wearing other Star Cursed items." +RestraintCursedCollar2,Stardust Collar +RestraintCursedCollar2Desc,"'You thought you could run forever, didn't you? Fate has a way of always catching up to you...'" +RestraintCursedCollar2Desc2,"Cannot be removed while you are wearing other Star Cursed items." + +KinkyDungeonCurseUnlockCursedDamage,"The cursed seal on the RestraintName vanishes into a brief veil of stardust." +KinkyDungeonCurseInfoCursedDamage,"Take AMNT damage to weaken the curse. Excludes shadow, psychic, charm, or damage taken at 0 WP." +KinkyDungeonCurseStruggleCursedDamage,"You struggle uselessly, sealed in your fate." +KDcurseDamageDamage,"You feel your restraints starting to weaken..." + +KinkyDungeonCurseUnlockCursedCollar,"The cursed collar falls off, awaiting its next victim..." +KinkyDungeonCurseInfoCursedCollar,"You must remove all other Star Cursed items before removing the collar." +KinkyDungeonCurseStruggleCursedCollar,"You struggle uselessly, sealed in your fate." + +curseInfoCursedTransformation,"Transformation: Items with generic curses transform into Star Cursed items." +KDCursedTransformation,"With a burst of dark energy, your OLDITM gains new properties!" +KDCursedTransformationNew,"With a burst of dark energy, your OLDITM transforms into a NEWITM!" + +curseInfoCursedHeal,"Restoration: While distracted, your Star Cursed restraints regain strength." +KDCursedHeal,"With the rush of pleasure, you feel your cursed restraints tighten and strengthen!" + +curseInfoCursedCorruption,"Corruption: While in the shadows, you slowly gain corruption." +KinkyDungeonBuffCorrupted,"Your willpower gain and struggle power is less effective due to your corruption." + +curseInfoCursedDistract,"Seduction: Gain distraction after taking damage." +KDCursedDistractActivate,"Taking damage fills your minds with cursed thoughts..." +KinkyDungeonBuffCursedDistract,"Having taken damage, your distraction is increasing..." + +curseInfoCursedPunishment,"Punishment: When you defeat an enemy, you are stunned briefly and enemies are attracted." +KDCursedPunishment,"Dark Voice: You are supposed to be a slave!" + +curseInfoCursedSubmission,"Submission: At 0 WP, you are restrained if you leave the presence of a hostile." +KDCursedSubmission,"Dark Voice: Kneel before your mistress." +KinkyDungeonBuffForcedSubmission,"You must submit! Moving away from an enemy at 0 WP will bind you!" + +curseInfoCursedDenial,"Denial: -10 WP when you try to Let Go. At 0 WP you cannot orgasm." +KDCursedDenialDeny0,"Dark Voice: Not yet." +KDCursedDenialDeny1,"Dark Voice: Your squirming pleases us." +KDCursedDenialDeny2,"Dark Voice: It is not your choice to make~" +KDCursedDenialAllow0,"Dark Voice: You may enjoy yourself, for now~" +KDCursedDenialAllow1,"Dark Voice: Yes, take in the pleasure..." +KDCursedDenialAllow2,"Dark Voice: Enjoy a gift, dear~" +KDRobeOfChastityFail0,"As you let go of yourself, the Robe of Chastity loses all effects!" +KDRobeOfChastityFail1,"The magic in the Robe of Chastity fades... for now." +KDRobeOfChastityFail2,"You have failed to keep the principles of the Paladins... for now." + +KDRobeOfChastityArouse0,"You feel vibrations in your leotard as the magically conductive fabric channels your power." +KDRobeOfChastityArouse1,"Your leotard produces a tingling full-body sensation as it channels your magic!" +KDRobeOfChastityArouse2,"A tingling sensation serves to remind you of your leotard's magic properties." + +KDVariableModifier_CursedBarrier1,"Star: -20 Charm/Psychic Resist" +KDVariableModifier_CursedBarrier2,"Star: +40 all other resists" + +KinkyDungeonSpellMithrilBolt,Mithril Orb +KinkyDungeonMithrilBolt,Shining strings encircle your body! + +KDSummonCurse,"Your cursed items have attracted a powerful cursed spirit!" + +KDRemoveOnDmgTypeChill,"The seal on your RESTRAINTNAME is weakening." + +NameAdventurer_Brat_Fighter,Fighter +KillAdventurer_Brat_Fighter,"The fighter pouts and runs away!" +AttackAdventurer_Brat_FighterBind,"The fighter knocks you to the ground and binds you! (+RestraintAdded)" +AttackAdventurer_Brat_Fighter,"The fighter strikes you with her weapon! (DamageTaken)" +AttackAdventurer_Brat_FighterStun,"The fighter takes you down with the back of her weapon! (DamageTaken)" +AttackAdventurer_Brat_FighterLock,"The fighter puts you in a hold and manages to slip on a lock! (DamageTaken)" +AttackAdventurer_Brat_FighterDash,"The fighter vanishes and ends up behind you!" + + + +NameAdventurer_Sub_Fighter,Fighter +KillAdventurer_Sub_Fighter,"The fighter moans loudly and rolls around on the floor!" +AttackAdventurer_Sub_FighterBind,"The fighter wraps her arms around you with bindings in hand! (+RestraintAdded)" +AttackAdventurer_Sub_Fighter,"The fighter pins you with her weapon and grabs your breast! (DamageTaken)" +AttackAdventurer_Sub_FighterStun,"The fighter enchants her weapon and strikes you! (DamageTaken)" +AttackAdventurer_Sub_FighterLock,"The fighter smiles lasciviously as she dangles a lock in front of you! (DamageTaken)" +AttackAdventurer_Sub_FighterDash,"The fighter enchants her weapon and flies forward!" + + +NameAdventurer_Dom_Fighter,Fighter +KillAdventurer_Dom_Fighter,"The fighter drops her weapon and admits defeat!" +AttackAdventurer_Dom_FighterBind,"The fighter knocks you to the ground and binds you! (+RestraintAdded)" +AttackAdventurer_Dom_Fighter,"The fighter feints and strikes, slapping you with the flat of her blade! (DamageTaken)" +AttackAdventurer_Dom_FighterStun,"The fighter takes you down with the back of her weapon! (DamageTaken)" +AttackAdventurer_Dom_FighterLock,"The fighter proudly clicks on a lock! (DamageTaken)" +AttackAdventurer_Dom_FighterDash,"The fighter briefly vanishes and ends up behind you!" + +NameAdventurer_Switch_Fighter,Fighter +KillAdventurer_Switch_Fighter,"The fighter falls on her knees and begs!" +AttackAdventurer_Switch_FighterBind,"The fighter throws an enchanted binding ring at you! (+RestraintAdded)" +AttackAdventurer_Switch_Fighter,"The fighter throws her weapon at you! (DamageTaken)" +AttackAdventurer_Switch_FighterLock,"The fighter puts you in a hold and manages to slip on a lock! (DamageTaken)" +AttackAdventurer_Switch_FighterDash,"The fighter vanishes and ends up behind you!" + +KDCasting,"Casting SPNME" +KDClimbUpTrapped,"The door suddenly locks behind you!" + +KDInventoryActionBondage,"Apply To Target" +KDInventoryActionRemoveCurseOrHex,"Purify" + + +KDBondageFailNoTarget,You need to target an NPC +KDBondageFailInvalidTarget,Target must be bindable and disabled. +KDBondageTarget,Target acquired! +KinkyDungeonSpellBondage,"Truss em up!" +KinkyDungeonSpellTargetBondage,"Choose target to bind" +KinkyDungeonSpellCastBondage,"Target Acquired!" +KinkyDungeonSpellDescriptionBondage,"Designates the target for bondage and allows you to apply items from the inventory. Can only be applied to entities that are willing or disabled. Some items require higher levels of incapacitation to be applied" + +DungeonNameShopStart,"The Shoppe" +DungeonNameJourneyFloor,"Journey Selection" +DungeonNamePerkRoom,"Shrine" +DungeonNameJail,"High-Security Prison" +DungeonNameDollRoom,"Doll Sorting Station" +DungeonNameshoppe,"The Shoppe" + +KDCursedChestEquipCursed,"A cursed NEWITM flies out of the chest and latches tightly to you!" +KDCursedChestEquip,"With a puff of magic, a NEWITM appears on your body!" + +KDManaRecharge_Success,"You draw upon chaotic energies, restoring mana!" +KDManaRecharge_Mixed,"You draw upon chaotic energies, but your mind is unable to hold back the arcane forces!" +KDManaRecharge_Fail,"Your attempt to call upon chaotic energies fails." +KDArcaneRecharge_No,"You are already at max mana." + +KDForcedOrgasmMin,"The vibrator holds at full power to drive you over the edge!" + +KDPrereqFailLoaded,"The weapon needs to be loaded to fire." + + +KinkyDungeonInventoryItemBowRecurve,Recurve Bow +KinkyDungeonInventoryItemBowRecurveDesc,"Curvy, just like its user." +KinkyDungeonInventoryItemBowRecurveDesc2,"Reload time: 1 turn. Deals crush damage on melee. Draws 14 charge and 35 stamina to fire an ordinary arrow, dealing 40 pierce damage." +ItemPickupBowRecurve,"You find a recurve bow." +KinkyDungeonSpecialBowRecurve,"14 charge to fire an arrow. Deals 40 pierce damage." +KinkyDungeonSpellTargetArrowRecurve,Choose projectile path +KinkyDungeonSpellArrowRecurve,Recurve Bow Arrow +KinkyDungeonSpellCastArrowRecurve,"You loose a strong arrow!" + +KinkyDungeonInventoryItemLongbow,Longbow +KinkyDungeonInventoryItemLongbowDesc,"Great for building both empires and muscle." +KinkyDungeonInventoryItemLongbowDesc2,"Reload time: 2 turns. Deals crush damage on melee. Draws 18 charge and 60 stamina to fire an ordinary arrow, dealing 60 pierce damage." +ItemPickupLongbow,"You find a huge longbow." +KinkyDungeonSpecialLongbow,"18 charge to fire an arrow. Deals 60 pierce damage." +KinkyDungeonSpellTargetArrowLongbow,Choose projectile path +KinkyDungeonSpellArrowLongbow,Longbow Arrow +KinkyDungeonSpellCastArrowLongbow,"You loose a mighty arrow!" + +KinkyDungeonInventoryItemCrossbowPistol,Pistol Crossbow +KinkyDungeonInventoryItemCrossbowPistolDesc,"Lethal. Sustainable. Portable." +KinkyDungeonInventoryItemCrossbowPistolDesc2,"Reload time: 3 turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 45 pierce damage." +ItemPickupCrossbowPistol,"You find a pistol crossbow." +KinkyDungeonSpecialCrossbowPistol,"20 charge to fire a bolt. Deals 45 pierce damage." +KinkyDungeonSpellTargetArrowBoltPistol,Choose projectile path +KinkyDungeonSpellArrowBoltPistol,Pistol Bolt +KinkyDungeonSpellCastArrowBoltPistol,"You pull the trigger!" + +KinkyDungeonInventoryItemCrossbowHeavy,Arbalest +KinkyDungeonInventoryItemCrossbowHeavyDesc,"At this point why not just use a gun?" +KinkyDungeonInventoryItemCrossbowHeavyDesc2,"Reload time: 5 stationary turns. Deals crush damage on melee. Draws 25 charge and no stamina to fire an ordinary arrow, dealing 70 pierce damage, passing through units." +ItemPickupCrossbowHeavy,"You find an arbalest." +KinkyDungeonSpecialCrossbowHeavy,"25 charge to fire a bolt. Deals 100 pierce damage." +KinkyDungeonSpellTargetArrowBoltHeavy,Choose projectile path +KinkyDungeonSpellArrowBoltHeavy,Heavy Bolt +KinkyDungeonSpellCastArrowBoltHeavy,"You pull the trigger!" + +KinkyDungeonRemoveCuffsNoLock,"The RSTNME is removed as the lock comes off." +KDConvertToHandcuffsKey,"You save the key in your inventory for future use." + +ItemPickupCuffKeys,"You pick up a simple key for the simplest of locks." +KinkyDungeonInventoryItemCuffKeys,Simple Keys +KinkyDungeonInventoryItemCuffKeysUse,"You twirl the keys around your finger." +KinkyDungeonInventoryItemCuffKeysDesc,"A handy key for getting out of common handcuffs and shackles." +KinkyDungeonInventoryItemCuffKeysDesc2,"It's not sophisticated enough to work on higher-quality locks, but can be used many times." + +KinkyDungeonInventoryItemRedKeyUse,"You twirl a key around your finger." +KinkyDungeonInventoryItemBlueKeyUse,"You twirl a magic key around your finger. Careful not to lose it!" +KinkyDungeonInventoryItemPickUse,"You fidget with a lockpick." + + +ItemPickupDiscPick,"You pick up a tool for picking disc detainer locks." +KinkyDungeonInventoryItemDiscPick,Disc Lock Tool +KinkyDungeonInventoryItemDiscPickUse,"You examine the tool. It has a replaceable tip for picking disc detainer locks." +KinkyDungeonInventoryItemDiscPickDesc,"A handy tool for picking disc detainer locks, popularized by a certain pair of professionals." +KinkyDungeonInventoryItemDiscPickDesc2,"Features a replaceable head in case an unskilled user breaks it. Requires lockpicks to use." + + +KDRep,Rep +KDJourneyMap,Journey + +KDMagicWeapon,Magical Weapon + +KDRepDescriptionGhost,"Your Submissiveness determines how easily your character can resist the temptations of bondage." +KDRepDescriptionPrisoner,"Your Security Level is based on your history, and reputation with the MNFCTN." +KDRepDescriptionPassion,"Your Passion determines how likely you are to lose control of yourself involuntarily." +KDRepDescriptionFrustration,"Your Frustration affects how quickly your Passion grows. More Frustration = More Passion" + +KDRepDescriptionLeather,"Nivah, Goddess of Dragons" +KDRepDescriptionLatex,"Minivir, Goddess of Alchemy" +KDRepDescriptionRope,"Akasha, Goddess of Magic" +KDRepDescriptionMetal,"Oriel, Goddess of Technology" + +KDRepDescriptionWill,"Ninril, Giver of Life" +KDRepDescriptionElements,"Matah, Architect of Reality" +KDRepDescriptionConjure,"Aether, Keeper of the Cosmos" +KDRepDescriptionIllusion,"Oblivion, Keeper of Secrets" + +KinkyDungeonBuffArcaneEnergy,"Arcane Energy is stored by casting spells, up to 100% Max mana." +KinkyDungeonBuffBattleRhythm,"Battle Rhythm is gained by spending stamina through attacks, up to 40 total." + +KinkyDungeonSpellArcaneBlast,Arcane Blast +KinkyDungeonSpellDescriptionArcaneBlast,"When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. Casting this spell consumes it to deal up 25% Max Mana as Arcane damage. Pierces enemies and walls." +KinkyDungeonSpellCastArcaneBlast,Your eyes glow as energy surges from within! +KinkyDungeonSpellTargetArcaneBlast,Choose aim direction + +KDCritical,Critical Hit! +KDRogueCritical,Super Critical! +KDBindCritical,Surprise Bondage! +KDArcaneEnergy,Arcane Energy +KDBattleRhythm,Rhythm +KDBattleRhythmDodge,You avoid the attack in a flurry of impressive maneuvers! + +KinkyDungeonSpellArcaneBarrier,Arcane Barrier +KinkyDungeonSpellDescriptionArcaneBarrier,"When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. When enabled, slowly convert Arcane Energy into a shield at a 1:2 ratio. Max shield is equal to 10% Max Mana." + +KinkyDungeonBuffHighValueFound,You sense that a high value target is near. + +KDLimitSurge_Success,You push yourself beyond physical limits! +KDLimitSurge_Fail,You try to push yourself beyond your capabilities and falter... +KDLimitSurge_No,You are already at max stamina. + + +KinkyDungeonSpellRogueStudy,Did the Research +KinkyDungeonSpellDescriptionRogueStudy,"Unlocks advanced tooltips for enemies showing their weaknesses. Also improves hearing by a small amount." + +KinkyDungeonSpellRogueTraps2,Well-Placed Traps +KinkyDungeonSpellDescriptionRogueTraps2,"Trap spells always critically strike." + +KinkyDungeonSpellRogueEscape,Hard to Catch +KinkyDungeonSpellDescriptionRogueEscape,"Adjacent NPCs count as corners/hooks for purposes of escaping. After being restrained, escape speed and power is increased for 12 turns (escape power is increased by +20% plus 2% of Bondage Resist). Removed if you restrain yourself." + +KinkyDungeonBuffRogueEscape,Struggling is improved and escape is quicker! + +KinkyDungeonSpellAkashicConflux,Akashic Conflux +KinkyDungeonSpellDescriptionAkashicConflux,"Costs 100 Arcane Energy and refunds 100 Mana. Bringing memories to life, you call upon your magical knowledge to ignore arm, leg, and verbal spell components for 3 turns." +KinkyDungeonBuffAkashicConflux,"You can ignore Arm, Leg, and Verbal components!" +KDAkashicConflux_Yes,"Magical whisperings circle around you, enabling you to cast spells without components!" +KDAkashicConflux_No,"You don't have enough Arcane Energy. You need AMNT." + + +KinkyDungeonSpellChaoticOverflow,Chaotic Overflow +KinkyDungeonSpellDescriptionChaoticOverflow,"Draw upon 35 WP to ignore spell components for Duration turns and fully restore your mana. The energy is uncontrollable, so there will be consequences..." +KDChaoticOverflow_Yes,"Chaotic energy flows through you!!!" +KDChaoticOverflow_NoBind,"You try to call forth the chaotic energy, but it isn't interested in you anymore..." +KDChaoticOverflow_No,"You don't have enough Willpower. You need at least 25%." +KDChaoticOverflow_Already,"You are already full of chaotic energy!" +KDChaoticOverflow_End,"Chaotic energy overtakes you, crystallizing into physical form..." + +KinkyDungeonBuffChaoticOverflow,"Chaotic energy flows through you! You have a bad feeling about this..." + + +ItemPickupDivineTear,"You find a shimmering macaron." +KinkyDungeonInventoryItemDivineTear,Heavenly Crunch Macaron +KinkyDungeonInventoryItemDivineTearUse,"You feel holy energy neutralizing the cursed magic permanently." +KinkyDungeonInventoryItemDivineTearDesc,"Some say it comes from a bakery in heaven itself. Others say it is simply made from lab-grade materials, and actually tastes awful." +KinkyDungeonInventoryItemDivineTearDesc2,"Purifies and unlocks a cursed item and/or removes all curses from one currently worn item of your choice." + +rCommercePortal,"Congratulations! Your continued patronage has earned you|one (1) round trip to the nearest affiliated shop!|Simply step into the portal to continue...|(the Goddess is not responsible for any mishaps or fraud pertaining to the use of this portal)" +rCommercePortalGo,"(You step through the portal. An unperturbed shopkeeper greets you.)|Another visitor? Oh, it's just you~" +dCommercePortal_Go,"(Enter the portal)" + +rCommercePortalReturn,"(It's the return portal)" +rCommercePortalReturnGo,"(You step through the portal and return to your adventure)" +dCommercePortalReturn_Go,"(Enter the portal)" + +KDRemoveCurseOrHex,Select a restraint to remove the curse from +KDRemoveCurseOrHexFail,You don't have any restraints that can be removed + +KinkyDungeonBuffInnerPowerArcaneStore,"As you are low on mana, you are unable to store Arcane Energy." +KinkyDungeonBuffManaRegenSuspend,"You are recharging your next mana cost reduction." + + + +KinkyDungeonSpellManaRegenFast,Fast Recharge I +KinkyDungeonSpellDescriptionManaRegenFast,"Inner power now recharges after 10 turns instead of 16." + +KinkyDungeonSpellManaRegenFast2,Fast Recharge II +KinkyDungeonSpellDescriptionManaRegenFast2,"Inner power now recharges after 6 turns instead of 16." + + +KinkyDungeonSpellRogueTargets,"Precise Targeting" +KinkyDungeonSpellDescriptionRogueTargets,"Your first critical hit on a target is 1.5x more powerful." + +KinkyDungeonSpellRogueBind,"Surprise Bondage" +KinkyDungeonSpellDescriptionRogueBind,"Binding from critical hits is 40% stronger" + +KinkyDungeonStatHighProfile,"High Profile" +KinkyDungeonStatDescHighProfile,"Several enemies on each map will be high value, rewarding more gold and items for defeating them but increasing their strength." + + +KDTieUpEnemy,"You apply the RSTR to the ENNME! (AMNT% bound)" +KDTieUpEnemyNegative,"You untie the ENNME! (AMNT% bound)" +KDTieUp,+AMNT Bondage! +KDIsBound,"TargetEnemy receives AMNT binding!" +KDDisabledBonus,"TargetEnemy is disabled and receives an increased AMNT binding!" +KDUnflinchingPenalty,"TargetEnemy resists bondage and receives a reduced AMNT binding!" + +KDDisguiseFailNoTarget,You need to target an NPC +KDDisguiseFailInvalidTarget,Target must be helpless. +KDDisguiseTarget,You steal the target's disguise! +KDDisguiseRelease,You remove your disguise. +KDDisguiseFailSameDisguise,You are already wearing that faction's disguise. +KinkyDungeonSpellDisguise,"Steal Disguise" +KinkyDungeonSpellTargetDisguise,"Choose target to steal from" +KinkyDungeonSpellCastDisguise,"You steal the target's disguise!" +KinkyDungeonSpellDescriptionDisguise,"Steal's a helpless enemy's clothes, adding a great deal of distraction to her and stealing her disguise for yourself. Until you recast this on yourself, you gain a stealth bonus against members of the same faction." + + + +KDunstoppable,"Unstoppable (Ignore status/bondage)" +KDunflinching,"Unflinching (Resist status/bondage)" +KDrelentless,"Relentless (Stun resist when stunned)" +KDBulwark,"Bulwark (Blocks some explosions)" +KDBlindsight,Blindsight (See through walls) + + +KinkyDungeonSpellManaHarvesting,Mana Harvesting +KinkyDungeonSpellDescriptionManaHarvesting,"Defeating or capturing a spellcaster-type enemy recovers 10 arcane energy, reduced to 1 for other humanoids." + +KDEnemyWindBlast,A powerful wind pushes you away!!! + +KinkyDungeonInventoryItemStaffRope,Staff of Ropes +KinkyDungeonInventoryItemStaffRopeDesc,"An enchanted rope kept in check by a magical seal. Surely this won't backfire..." +KinkyDungeonInventoryItemStaffRopeDesc2,"+20% rope bindings applied. Deals chain damage. Active: Spend 25 mana to unleash the ropes in a wide AoE." +ItemPickupStaffRope,"You pick up a staff of ropes. Finally, a way to contain its power!" + +KinkyDungeonInventoryItemStaffBelts,Staff of Belts +KinkyDungeonInventoryItemStaffBeltsDesc,"Belts within belts, a fractal belt pattern buckled into oblivion." +KinkyDungeonInventoryItemStaffBeltsDesc2,"+20% leather bindings applied. Leather spells apply debuffs for 30% longer. Deals chain damage. Active: Pull an enemy toward you and apply a small amount of bondage." +ItemPickupStaffBelts,"You pick up a staff of belts wrapped tightly in leather." + +KinkyDungeonSpellLockBullet,"Binding Lock" +KinkyDungeonLockBullet,"A LKTYP lock clasps on to one of your restraints!" +KinkyDungeonLockBulletFail,"You are caught in a constricting field! (Dmgdlt)" + +RestraintResin,Resin Coating +RestraintResinDesc,"A layer of transparent resin derived from Green Latex. Unlike other forms of latex, this one is solid and fixes you in place." +RestraintResinDesc2,"It's like you're an art piece! If only you had some way to blast it off..." + +KDWindup,"You hear a motor whirring..." +KDLatexBubbleEngulf,"A bubble of latex surrounds you and inflates, sealing you in!" +KDLatexBubble,A bubble of latex envelops you! +KDLatexBallEngulf,"A ball of latex surrounds you and inflates, sealing around your neck!" +KDLatexBall,A ball of latex envelops you! +KinkyDungeonBuffLatexBubble,"The latex around you dampens your attacks, reducing physical damage by 30% and lowering your sight range." +KinkyDungeonBuffLatexBall,"The latex around you dampens your attacks, reducing physical damage by 30% and lowering your sight range." + +KinkyDungeonSpellLatexBall,Latex Ball + +NamePinkLabAssistant,...Lab Assistant? +KillPinkLabAssistant,You rescue the lab assistant. +AttackPinkLabAssistantBind,"The assistant restrains you! (+RestraintAdded)" +AttackPinkLabAssistant,"The assistant gropes you playfully! (DamageTaken)" +AttackPinkLabAssistantLock,"The assistant applies a lock! (DamageTaken)" +AttackPinkLabAssistantBlind,"The assistant splashes a solvent in your face, blinding you! (DamageTaken)" +NamePinkGlueTechnician,...Glue Technician? +KillPinkGlueTechnician,You rescue the glue technician. +AttackPinkGlueTechnicianBind,"The technician slaps adhesive restraints onto your body! (+RestraintAdded)" +AttackPinkGlueTechnician,"The technician polishes your restraints thoroughly! (DamageTaken)" +AttackPinkGlueTechnicianSlow,"The technician pours glue on you to make you stay still! (DamageTaken)" +AttackPinkGlueTechnicianLocks,"The technician inspects your restraints and adds a lock to spec! (DamageTaken)" + + +NameLabAssistant,Lab Assistant +KillLabAssistant,"The assistant envelops herself in her own bubble for protection." +AttackLabAssistantBind,"The assistant restrains you! (+RestraintAdded)" +AttackLabAssistant,"The assistant gropes you playfully! (DamageTaken)" +AttackLabAssistantLock,"The assistant applies a lock! (DamageTaken)" +AttackLabAssistantBlind,"The assistant splashes a solvent in your face, blinding you! (DamageTaken)" + +KinkyDungeonSpellGlueBomb,Glue Bomb + +NameGlueTechnician,Glue Technician +KillGlueTechnician,"The technician trips and glues herself to the floor." +AttackGlueTechnicianBind,"The technician slaps adhesive restraints onto your body! (+RestraintAdded)" +AttackGlueTechnician,"The technician polishes your restraints thoroughly! (DamageTaken)" +AttackGlueTechnicianSlow,"The technician pours glue on you to make you stay still! (DamageTaken)" +AttackGlueTechnicianLocks,"The technician inspects your restraints and adds a lock to spec! (DamageTaken)" + +KDEffectTileTooltipCMDGlue,"Quite sticky, innit?" + +KDWeaponTag_bow,Bow +KDWeaponTagD_bow,"Bow: This is a ranged weapon with a weapon ability." +KDWeaponTag_magic,Magic +KDWeaponTagD_magic,"Magic: Ignores evasion of ghost type enemies, can be used with abilities that require magic weapons." +KDWeaponTag_light,Light +KDWeaponTagD_light,"Light: Can be used to cut even with bound arms. 50% reduced accuracy penalty from being bound. Can be held in mouth." +KDWeaponTag_offhand,Offhand +KDWeaponTagD_offhand,"Offhand: This weapon can be dual-wielded by some classes." +KDWeaponTag_clumsy,2 Handed +KDWeaponTagD_clumsy,"2 Handed: While wielding this as your primary weapon, you cannot wield an offhand weapon. Also this weapon can't be used while arms are tied." +KDWeaponTag_stamPenType_Staff,Magical Focus +KDWeaponTagD_stamPenType_Staff,"Magical Focus: Instead of losing accuracy, the stamina cost is increased when distracted." +KDWeaponTag_precision,Precision +KDWeaponTagD_precision,"Precision: Your arms need to be free to use this weapon." +KDWeaponTag_noHands,Hands-Free +KDWeaponTagD_noHands,"Hands-Free: Weapon can be used without free hands." +KDWeaponTag_shield,Shield +KDWeaponTagD_shield,"Shield: This weapon is intended for defensive use." +KDWeaponTag_heavy,Heavy +KDWeaponTagD_heavy,"Heavy: This weapon takes +1 turns to switch to. Cannot be reduced to 0 by perks or upgrades." +KDWeaponTag_massive,Massive +KDWeaponTagD_massive,"Massive: This weapon either stuns or slows you after attacking with it. Handle with care!" +KDWeaponTag_illum,Illumination +KDWeaponTagD_illum,"Illumination: This weapon is a light source." + +KinkyDungeonSpellOffhand,"Dual Wield" +KinkyDungeonSpellDescriptionOffhand,"Designate an Offhand weapon to gain passive effects such as a light source, armor, or extra crit damage.|(Must equip Dual Wield spell to equip an offhand weapon)" + +KDInventoryActionOffhand,"Equip Offhand" +KDInventoryActionRemoveOffhand,"Remove Offhand" + +KinkyDungeonSpecialSpear,Make a ranged attack with the spear. +KinkyDungeonSpecialMagicSpear,Make a ranged attack with the spear. +KinkyDungeonSpecialPike,Make a ranged attack with the pike. + +KinkyDungeonSpellWeaponAttack,Ranged Attack + + +KinkyDungeonSpellCombatTraining,"Combat Training" +KinkyDungeonSpellDescriptionCombatTraining,"Your training has granted a number of bonuses:|-Weapon stamina cost is reduced by 1% per 10 current WP, up to a max of 40%.|-Slow effects wear off more quickly.|-While you are above 0 WP you gain 1 slow resist." + +KDoffhandTooltip,This is your current offhand weapon. +KDoffhandOldTooltip,You are unable to wield this weapon offhand at the moment. +KDoffhand2Tooltip,This is your previously held weapon. Click to switch to it. + +KDCantWield,You can't hold the WPN in your current state. + +KinkyDungeonSpellCharge,"Charge!" +KinkyDungeonSpellDescriptionCharge,"Dash and make an attack attack against a target within 2 tiles. If it deals 20% of their current hp in damage, you knock them back and take their place, otherwise they take +15% max hp crush damage from hitting the wall. If the attack misses, you still dash. Costs stamina equal to your sprint cost plus your attack cost." +KinkyDungeonSpellCastCharge,You charge at the target! +KinkyDungeonSpellTargetCharge,Choose a target. + +KDChargeFail_NoTarget,You need to target an enemy. +KDChargeFail_NoStamina,You don't have enough stamina. +KDChargeFail_NoSprint,You need to be able to sprint. +KDChargeFail_NoAttack,You need to be able to attack. +KDChargeFail_NoSpace,There is no room to dash! +KDChargeFail_AttackMiss,You missed! + +KinkyDungeonSpellToolsOfTheTrade,"Tools of the Trade" +KinkyDungeonSpellDescriptionToolsOfTheTrade,"Allows you to craft bombs, smoke bombs, flash bombs, and invisibility potions." + +rToolsOfTheTrade,"(You start having crafty thoughts...)|(Gunpowder can be obtained from chests or Alchemists)|(Ectoplasm can be obtained from ghosts)" +rToolsOfTheTradeSmokeBomb,"(You craft a Smoke Bomb)" +rToolsOfTheTradeFlashBomb,"(You craft 3 Flash Bombs)" +rToolsOfTheTradeBomb,"(You craft a Bomb)" +rToolsOfTheTradePotionInvisibility,"(You craft an Invisibility Potion)" +rToolsOfTheTradeFail,"(You don't have the required material)" +dToolsOfTheTrade_SmokeBomb,(Use 1 Gunpowder to make a Smoke Bomb) +dToolsOfTheTrade_FlashBomb,(Use 1 Gunpowder and one Ancient Crystal to make 3 Flash Bombs) +dToolsOfTheTrade_Bomb,(Use 2 Gunpowder to make a Bomb) +dToolsOfTheTrade_PotionInvisibility,(Use 3 Ectoplasm to make an Invisibility Potion) + +KinkyDungeonSpellGunpowder,Gunpowder +KinkyDungeonInventoryItemGunpowder,Gunpowder +KinkyDungeonInventoryItemGunpowderUse,"You toss some gunpowder on the floor! No picking it back up now..." +KinkyDungeonInventoryItemGunpowderDesc,"Highly flammable. Do not eat." +KinkyDungeonInventoryItemGunpowderDesc2,"Creates gunpowder tiles on the target area, which can be ignited." +ItemPickupGunpowder,"You pick up a sack of gunpowder." +KinkyDungeonSpellCastGunpowder,You toss some gunpowder on the floor! + +KinkyDungeonSpellRogueOffhand,"Dual Wield (Rogue)" +KinkyDungeonSpellDescriptionRogueOffhand,"Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or extra crit damage.|Rogues cannot wield heavy or massive weapons in the offhand unless they are multiclass.|(Equip Dual Wield spell to equip an offhand weapon, or use the Items menu)" + +KinkyDungeonSpellWizardOffhand,"Dual Wield (Wizard)" +KinkyDungeonSpellDescriptionWizardOffhand,"Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or spell damage bonuses.|Wizards can only wield magic weapons in the offhand unless they are multiclass, and receive +1 slow level if they wield a 2-handed, heavy, or massive magical weapon in the offhand.|(Must equip Dual Wield spell to equip an offhand weapon)" + +KinkyDungeonInventoryItemArcaneTome,Arcane Tome +KinkyDungeonInventoryItemArcaneTomeDesc,"Contains advanced formulas and thrilling tales of thirsty wizards. Can not critically strike." +KinkyDungeonInventoryItemArcaneTomeDesc2,"+5% magic damage. Offhand: Applies passive bonus." +ItemPickupArcaneTome,"You find a magical tome." +KinkyDungeonSpecialArcaneTome,"Open the book. What can go wrong?" + +KinkyDungeonInventoryItemBondageTome,Tome of Bondage +KinkyDungeonInventoryItemBondageTomeDesc,"Contains a malevolent spirit that wishes only to tie up damsels. Can not critically strike." +KinkyDungeonInventoryItemBondageTomeDesc2,"+10% binding effectiveness. Offhand: Applies passive bonus." +ItemPickupBondageTome,"You find a magical tome with a sealed padlock on it." +KinkyDungeonSpecialBondageTome,"Open the book. What can go wrong?" + +KinkyDungeonSpellManaPoolUp,Leyline Map +KinkyDungeonSpellDescriptionManaPoolUp,You know the location of ancient leylines and can draw upon 100 additional mana. + +KDPrereqFailHasWill,"You don't want to open the book... (need willpower)" +KinkyDungeonSpellTomeBondage,Chain Spirit +KinkyDungeonSpellCastTomeBondage,You open the book and suddenly a binding aura surrounds you! +KinkyDungeonSpellTomeArcane,Mathematical Error +KinkyDungeonSpellCastTomeArcane,You open the book to an unfinished page and the magic ink short-circuits! + +KDShatterProgress,"Cracks begin to form in your RestraintName!" +KDShatter,"Your RestraintName shatters and falls off!" + +KinkyDungeonLoadConfig,"Load Hotbar " +KinkyDungeonSaveConfig,"Save Hotbar " +KinkyDungeonClearConfig,"Clear Hotbar" + +KDConfirmSpellsClear,Confirm clearing hotbar? + +KDAddToHotbar,Add to Hotbar +KDBack,Back + +KinkyDungeonBuffNoWP,"Surrender: Your willpower is 0, giving huge penalties to struggling, Block, Evasion, and Bondage Resist." + +KDKeysNoBound,"Unbound Keybindings! -->" +KDKeysNoBoundEasterEgg,"You've not enough keys!!! -->" +KDKeysUpdate,"Update your Keybindings!!! -->" +KDKeysUpdateEasterEgg,"I have altered the keybindings. Pray I do not alter them further." + +NameBarricade,Barricade +KillBarricade,"You knock over the barricade!" + +NameBarricadeRobot,Anti-Damsel Barrier +KillBarricadeRobot,"You disable the barrier!" + +NameBarricadeConcrete,Barrier +KillBarricadeConcrete,"You shatter the barrier!" + +NameBarricadeMagic,Magical Barrier +KillBarricadeMagic,"You destroy the barrier!" + +NameBarricadeShadow,Mass of Shadow Hands +KillBarricadeShadow,"You banish the shadow hands!" +AttackBarricadeShadow,"The shadow hands caress you and latch on! (DamageTaken)" +AttackBarricadeShadowBind,"The shadow hands caress you and latch on! (+RestraintAdded)" + +NameBarricadeShadowMetal,Shadow Chains +KillBarricadeShadowMetal,"You break through the chains!" +NameBarricadeMetal,Conjured Chains +KillBarricadeMetal,"You break through the chains!" + +KDFilterFiltersMagic,Magic +KDFilterFiltersDivine,Divine +KDFilterFiltersMagical,Magic Damage +KDFilterFiltersPhysical,Physical Damage +KDFilterFiltersAbility,Special Ability +KDFilterFiltersRanged,Ranged +KDFilterFiltersMelee,Melee +KDFilterFiltersStaff,Staff +KDFilterFiltersShield,Shield +KDFilterFiltersToy,Toy +KDFilterFiltersBondage,Bondage +KDFilterFiltersTease,Teasing + +KinkyDungeonMagicRope,"A rope trap springs upon you!" +KinkyDungeonMagicRibbon,"A ribbon trap springs upon you!" +KinkyDungeonMagicChain,"A chain trap springs upon you!" +KinkyDungeonMagicVine,"Magical vines wrap around you suddenly!" +KinkyDungeonMagicBelt,"A belt trap springs upon you!" +KinkyDungeonMagicLeather,"You find yourself suddenly bound tightly by magic gear!" +KinkyDungeonMagicRubber,"Magical rubber emerges from the floor and encases you!" +KinkyDungeonMagicSlime,"Slime appears at your feet and starts encasing you!" +KinkyDungeonMagicLatex,"You find yourself suddenly bound tightly in latex gear!" +KinkyDungeonMagicVacCube,"A rubber cube rushes out of the floor and engulfs you!" + +KinkyDungeonStatClaws,"Sharp Claws" +KinkyDungeonStatDescClaws,"While your hands aren't covered, your attacks deal 10 bonus slash damage on hit and you can cut restraints." + +KinkyDungeonStatBite,"Powerful Bite" +KinkyDungeonStatDescBite,"Gain access to the Bite spell." + +KinkyDungeonStatSlimeGirl,"Slime Girl" +KinkyDungeonStatDescSlimeGirl,"You are a shapeshifting slime, granting +100 Glue Resist and can squeeze thru bars. Escaping is easy, but your powers are sealed while wearing cursed or magic restraints." +KinkyDungeonStatCybernetic,"Cybernetic" +KinkyDungeonStatDescCybernetic,"You have mechanical parts, granting +10 Physical Armor, +15 Block, and +10% base physical damage. -100 Electric Resist." +KinkyDungeonStatMagicBlood,"Magic Blood" +KinkyDungeonStatDescMagicBlood,"You come from a magical lineage, granting +10 Magic Armor and +10% magic damage." +KinkyDungeonStatBeastGirl,"Beast Girl" +KinkyDungeonStatDescBeastGirl,"You have animalistic features such as a bite spell, -10% attack stamina cost, and 10 slash damage on hit while hands are free. -100 Charm Resist." +KinkyDungeonStatDemonGirl,"Demon Girl" +KinkyDungeonStatDescDemonGirl,"You are related to eldritch entities, granting +50% shadow damage and the ability to teleport between shadows. You are weak to holy restraints and bright light." +KinkyDungeonStatAngelic,"Angelic" +KinkyDungeonStatDescAngelic,"You are a minor angel sent to perform a specific task. You are forced to wear a full set of divine restraints, but gain an infinite mana pool, +20 Magic Armor, and +25% magic damage." +KinkyDungeonStatElf,"Elven Ancestry" +KinkyDungeonStatDescElf,"You were blessed with immortality by Ninril, Goddess of Restoration, granting -50% sprint cost and -30 Physical Resist. While your WP is above 0, you regenerate WP and heal nearby allies." +KinkyDungeonStatMummy,"Bast's Blessing" +KinkyDungeonStatDescMummy,"You were granted undead immortality by Bast, granting a bite, claws, catlike senses, and stamina regen scaling with your current WP. Your WP gain is halved and you get -100 Fire Resist." + + +KinkyDungeonStatFortify_Trap,"Minefield" +KinkyDungeonStatDescFortify_Trap,"Booby traps set by enemies are much more common." +KinkyDungeonStatFortify_Barricade,"Fortified" +KinkyDungeonStatDescFortify_Barricade,"Barricades set up by enemies do not expire, and enemies set them up even when not alerted." + + +KDFocusControlsAutoPassHelplessAllies,"Pass thru helpless allies" +KDFocusControlsAutoPassHelplessEnemies,"Pass thru helpless enemies" +KDFocusControlsAutoPassAllies,"Pass thru allies" +KDFocusControlsAutoPassNeutral,"Pass thru neutrals" +KDFocusControlsAutoPassSummons,"Pass thru summons" +KDFocusControlsAutoPassShop,"Pass thru shopkeepers" +KDFocusControlsAutoPassSpecial,"Pass thru special NPCs" + +KDFocusControlsAutoPathSuppressBeforeCombat,"Stop when enemies are first sighted" +KDFocusControlsAutoPathSuppressDuringCombat,"Suppress during combat" +KDFocusControlsAutoPathStepDuringCombat,"Step during combat" + +KDFocusControlsAutoWaitFast,"0.1s/turn" +KDFocusControlsAutoWaitSlow,"1.5s/turn" +KDFocusControlsAutoWaitNormal,"0.5s/turn" +KDFocusControlsAutoWaitVeryFast,"0.01s/turn" + +KinkyDungeonSpellShadowGrasp,Shadowy Grasp + + +NameBarricadeAir,Magical Tornado +AttackBarricadeAir,"The tornado blasts you with powerful winds! (DamageTaken)" +KillBarricadeAir,"You dispel the tornado!" +NameBarricadeFire,Shield of Flame +KillBarricadeFire,"You dispel the shield!" +NameBarricadeVine,Overgrowth +KillBarricadeVine,"You cut through the overgrowth!" +NameBarricadeWater,Wall of Water +KillBarricadeWater,"You dispel the water wall!" +NameBarricadeIce,Ice Spikes +KillBarricadeIce,"You break through the ice!" +NameBarricadeEarth,Earth Monoliths +KillBarricadeEarth,"You shatter the monoliths!" +KinkyDungeonSpellGravityPullEarth,Gravitational Pull +KinkyDungeonSpellCastGravityPullEarth,"The earth emits a deep hum below your feet..." +NameBarricadeElectric,Electrified Sphere +KillBarricadeElectric,"You smash the electrified sphere!" +AttackBarricadeElectric,"A bolt of lightning arcs to you! (DamageTaken)" + +NameKeeperEarth,Earth Keeper +KillKeeperEarth,"The earth keeper sinks into the wall." +AttackKeeperEarthBind,"The earth keeper conjures restraints on your body! (+RestraintAdded)" +AttackKeeperEarthLock,"The earth keeper locks a restraint!" +AttackKeeperEarthSlow,"The earth keeper knocks you away with a powerful kick!" +AttackKeeperEarth,"The earth keeper massages you gently! (DamageTaken)" +KDKeeperKick,"The earth keeper knocks you away with a strong kick! (DamageTaken)" + +NameKeeperFire,Flame Keeper +KillKeeperFire,"The flame keeper steps away into a fiery portal." +AttackKeeperFireBind,"The flame keeper grabs you, and volcanic restraints emerge from her armor! (+RestraintAdded)" +AttackKeeperFireLock,"The flame keeper locks a restraint!" +AttackKeeperFireDash,"The flame keeper flanks you!" +AttackKeeperFire,"The flame keeper offers a painful caress! (DamageTaken)" +KDKeeperFlameDash,"The flame keeper rides forth on a wave of fire!" + +KinkyDungeonSpellFlameTrail,Smoldering Trail +KinkyDungeonSpellFlameKeeperBlade,Fiery Greatsword + + +KinkyDungeonSpellVineexp,Tangling Vines +KinkyDungeonSpellBubbleexp,Enchanted Bubble +KDWaterBubble,A bubble of magic water starts forming around you! +KDWaterBubbleEngulf,"The gap in the bubble closes, and you are fully sealed within the bubble!" +KinkyDungeonBuffWaterBubble,"Magical water reduces your accuracy and slows you significantly!" +KinkyDungeonBuffBattleTrance,You attack twice! +KinkyDungeonBuffCombatManeuver,You gain a free move from Combat Maneuvers! + +KDDoorAccessDenied0,"Access denied." +KDDoorAccessDenied1,"Facility is under lockdown." +KDDoorAccessDenied2,"Please scan ID to continue." + +NameBarricadeSecurityDoor,Security Door +KillBarricadeSecurityDoor,"You break through the security door!" + +NameBarricadeHighSecurityDoor,High Security Door +KillBarricadeHighSecurityDoor,"You knock down the security door!" + +NameBarricadeBlastDoor,Blast Door +KillBarricadeBlastDoor,"You knock down the blast door!" + +KDSell,You sell the ITM for VLU gp. +KDSellBulk,You sell #x ITM for VLU gp. +KDSellExcess,You sell #x ITM for VLU gp. + + +KinkyDungeonStatDirectionVision,"Directional Vision" +KinkyDungeonStatDescDirectionVision,"Your vision is reduced except in the direction you are facing." +KinkyDungeonStatDirectionSlow,"Inertia" +KinkyDungeonStatDescDirectionSlow,"Turning 180 degrees while moving requires an extra turn" +KinkyDungeonStatDirectionSlow2,"Heavy Inertia" +KinkyDungeonStatDescDirectionSlow2,"Turning 90 degrees while moving requires an extra turn" + +KDTurn1,You turn. +KDTurn2,You turn around. + +KinkyDungeonSpellAllyCommand,Take Command +KinkyDungeonSpellDescriptionAllyCommand,Unlocks several spells for commanding allies. + +KinkyDungeonSpellAllyAttention,Attention! +KinkyDungeonSpellTargetAllyAttention,Select allies in an area +KinkyDungeonSpellDescriptionAllyAttention,Designate allies in a 3x3 area to follow orders. +KinkyDungeonSpellCastAllyAttention,You select the units. + +KinkyDungeonSpellAllyDeselect,Deselect +KinkyDungeonSpellTargetAllyDeselect,Select allies in an area +KinkyDungeonSpellDescriptionAllyDeselect,Deselect allies in a 3x3 area +KinkyDungeonSpellCastAllyDeselect,You deselect the units. + +KinkyDungeonSpellAllyToggle,Toggle Selection +KinkyDungeonSpellTargetAllyToggle,Select ally +KinkyDungeonSpellDescriptionAllyToggle,Toggle an allied unit's selection status. +KinkyDungeonSpellCastAllyToggle,You toggle the unit's selection. + +KinkyDungeonSpellAllyMove,Maneuver +KinkyDungeonSpellTargetAllyMove,Select target location +KinkyDungeonSpellDescriptionAllyMove,Order all selected units to move to the targeted point. +KinkyDungeonSpellCastAllyMove,You order your units to move! + +KinkyDungeonSpellAllyHold,Hold Position +KinkyDungeonSpellDescriptionAllyHold,Selected units do not pursue enemies. +KinkyDungeonSpellAllyCancelHold,Free Movement +KinkyDungeonSpellDescriptionAllyCancelHold,Cancels Hold Position on selected units. + +KinkyDungeonSpellAllyDeselectAll,Deselect All +KinkyDungeonSpellDescriptionAllyDeselectAll,Deselects all selected units. +KinkyDungeonSpellAllyOnMe,On Me! +KinkyDungeonSpellDescriptionAllyOnMe,All selected units start following you +KinkyDungeonSpellAllyDisperse,Disperse +KinkyDungeonSpellDescriptionAllyDisperse,All selected units stop following you +KinkyDungeonSpellAllyDefensive,Defensive Order +KinkyDungeonSpellDescriptionAllyDefensive,All selected units switch to Defensive mode +KinkyDungeonSpellAllyAggressive,Aggressive Order +KinkyDungeonSpellDescriptionAllyAggressive,All selected units switch to Aggressive mode + +KinkyDungeonSpellsPageCommand,"Command" +KinkyDungeonSpellsPageClass,"Unique" + +KDInventoryActionRemoveMagicLock,Unlock using magic + +KDQuickLoadout_Weapon,Include Weapons +KDQuickLoadout_Merge,Merge Armor + +KDNeedDiscPick,You need a special tool to pick this kind of lock. + +KDNotEnoughMoneyVendor,The NPC does not have enough money left! + +KDOrderOnMe,You order the ENMY to come to you. +KDOrderDisperse,You order the ENMY to disperse. +KDOrderSelect,You deselect all allies and select only the ENMY. +KDOrderRemove,You remove the ENMY from your party. + +KDVarPrefAntiMagic,Anti-Magic +KDVarPrefEnchanted,Enchanted +KDVarPrefCursed,Cursed + +KDIntroScene1,"Long ago, war raged across the globe.|Countless lives were lost fighting over pieces of rock in a vast ocean.|People turned to science, religion, and magic, anything to escape this cruel fate." +KDIntroScene2,"Then the archmagus, Sariel Vinlaga, discovered the secret of immortality.|Sharing her research across the globe, she laid the groundwork for an era of peace.|A great civilization arose, where magic and technology flourished." +KDIntroScene3,"But in the end, Sariel's experiments left her weakened and unable to save herself from death.|Without a leader, the Old Civilization collapsed into tyranny as warlords enslaved thousands.|Refugees fled across the sea in search of a new life, and in time the old empire was forgotten." +KDIntroScene4,"Hundreds of years later, a group of adventurers found a lost island full of ancient technology.|Countless visitors now flock to the ruins in search of wealth and wisdom...|...Unaware of the devious secrets sealed within long ago." + +KinkyDungeonBuffSpellDamageBuff,An item has increased your spell damage! + +KDVariableModifier_AoEDamageFrozen,"AMNT ice damage/turn vs. Frozen" +KDVariableModifier_ShadowBleed,"AMNT shadow bleed (10 turns)" + +KinkyDungeonSpellFuukaOrb,Sealing Talisman +KinkyDungeonFuukaOrb1,"You were hit by one of Fuuka's talismans. Fuuka's magic begins sealing your power!" +KinkyDungeonFuukaOrb2,"You were hit by one of Fuuka's talismans. Fuuka's magic makes you sluggish!!" +KinkyDungeonFuukaOrb3,"You were hit by one of Fuuka's talismans. Fuuka's magic renders you helpless!!!" +KinkyDungeonBuffFuukaOrb,"You were hit by one of Fuuka's talisman projectiles. Fuuka's magic is restricting you!" + +KinkyDungeonSpellShadowGraspMulti,Sealing Shadows +KinkyDungeonBuffShadowSeal,"Shadowy magic is restricting you!" +KDShadowSeal,"A powerful seal holds you in place temporarily!!!" + +KDSelfLock,You lock yourself in magical locks! +KinkyDungeonRemoveCollarModule,A collar module comes off with the collar! + +RestraintShockModule,Shock Module +RestraintShockModuleDesc,"A sinister device used to keep unruly wolfgirls in check." +RestraintShockModuleDesc2,"If it works on them, it sure as heck works on you. It has a warning label that says: 'CAUTION: NOT WATERPROOF'" +RestraintTrackingModule,Tracking Module +RestraintTrackingModuleDesc,"A homing device used to track unruly pets that wander too far." +RestraintTrackingModuleDesc2,"It has a warning label that says: 'CAUTION: NOT WATERPROOF'" + +KDDamageModule,"Your RestraintName stops working due to water damage!" +KDDamageModuleProgress,"Your RestraintName sustains water damage from the high-pressure water!" +KDDamageTether,"The RestraintName fizzles out!" +KDDamageTetherProgress,"Your RestraintName short-circuits briefly from the electrical damage!" + +KDExit,Quit Game + +KDShrineUnlockWiggle,"Your RSTRNT glows and its seal vanishes as the shrine's energy fills the air." + +KDRemoveOnEdgePartial,"The seal on your RESTRAINTNAME weakens as you simmer just below the edge." +KDRemoveOnEdge,"Through your determination, you suprress the seal on your RESTRAINTNAME!!!" +KDRemoveOnEdgeSucceedPartial,"The seal on your RESTRAINTNAME weakens as you maintain your composure." +KDRemoveOnEdgeSucceed,"Through your determination, you suprress the seal on your RESTRAINTNAME." +KDRemoveOnEdgeFailPartial,"You lose focus and the seal on your RESTRAINTNAME strengthens!" +KinkyDungeonCurseStruggleOrgasmResist,"The item refuses to budge as you try to take it off." +KinkyDungeonCurseUnlockOrgasmResist,"" +KinkyDungeonCurseInfoOrgasmResist,"The item bears a seal of dark pleasure. You can suppress it by edging yourself." + +KDRemoveOnOrgasmPartial,"The seal on your RESTRAINTNAME weakens as you simmer just below the edge." +KDRemoveOnOrgasm,"Through your determination, you suprress the seal on your RESTRAINTNAME!!!" +KDRemoveOnOrgasmSucceedPartial,"The seal on your RESTRAINTNAME weakens as you maintain your composure." +KDRemoveOnOrgasmSucceed,"Through your determination, you suprress the seal on your RESTRAINTNAME." +KDRemoveOnOrgasmFailPartial,"You lose focus and the seal on your RESTRAINTNAME strengthens!" +KinkyDungeonCurseStruggleOrgasmForced,"The item refuses to budge as you try to take it off." +KinkyDungeonCurseUnlockOrgasmForced,"" +KinkyDungeonCurseInfoOrgasmForced,"The item bears a seal of dark pleasure. You can suppress it by edging yourself." + +KDLabelSaved,Saved Outfits +KDManageOutfits,Manage this Outfit +KDChangePose,Change Pose +KDQuickColor,Quick Color Palette +KDFilters,Item Color +KDItemMenu,Item Catalog +KDLayers,Layers: +KDColorHex,Hex Code: + +KDHideRest,Toggle Struggle UI Mode +KDSetPose,Change Character Pose +KDBulletTransparency,Make Bullets Transparent +KDXRay,X-Ray Vision +KDQuickInv,Show Quick Inventory +KDToggleSkipTutorial,Skip Tutorial +KDToggleModCompat,Mod Compat Mode (requires reload) + +rTutorial,"Welcome to Kinky Dungeon! It looks like this is your first time,|Would you like a brief walkthrough of the interface?" +dTutorial_LeaveAndDisable,(Leave and Disable Tutorial) +dTutorial_Continue,(Yes Please!) +dTutorial_HandsOn,(It'd like a hands-on lesson) + +rTutorialHandsOn,"Sure! I can lead you through some excercises in a safe and controlled environment.|This way you can figure things out at your own pace.|To start, choose one of the lessons below:" +dTutorialHandsOn_Rope,"(Give me some rope lessons)" +dTutorialHandsOn_Leather,"(Give me a nice leather outfit)" +dTutorialHandsOn_Metal,"(I enjoy the cold embrace of steel)" +dTutorialHandsOn_Latex,"(I love rubber!)" +dTutorialHandsOn_No,"(On second thought, maybe not)" + +dHandsOn,"(About that hands-on lesson...)" + +rTutorialContinue,"This is you.|Over the course of the game, you will probably get tied up.|The controls to escape are located over your character.|Simply hover the mouse over your character to see them." +rTutorialContinue_Continue,"There are four main ways to escape restraints:|Struggling, which is effective against flexible and weaker restraints,|Cutting, which depends on your held weapon and the item's properties,|Unbuckle/Untying, which depends on having free hands,|And Unlocking, which is required before you can Unbuckle." +rTutorialContinue_Continue_Continue,"These are options for how to display your character.|You don't have to worry about them for now,|but when your character is tied up you may find them useful|...or enjoyable." +rTutorialContinue_Continue_Continue_Continue,"This is the buffs bar.|It shows various values and buffs relating to your character.|You can click the gold triangle to expand it,|Showing additional info about your character." +rTutorialContinue_Continue_Continue_Continue_Continue,"These are the action buttons.|You can use them to perform various actions like closing doors or sprinting.|You can also toggle various settings such as automatically passing|through allies or auto-pathing when there are no enemies nearby.|You can also swap between recently used weapons." +rTutorialContinue_Continue_Continue_Continue_Continue_Continue,"These are various submenus.|Your Inventory is used to brows items and use or equip them.|The Journal contains lore, notes, and hints gathered along your journey.|The Journal also contains info on available quests,|and your reputation with various factions." +rTutorialContinue_Continue_Continue_Continue_Continue_Continue_Continue,"This is the status bar, which gives info on your base stats.|Distraction determines how easy it is to cast spells and resist teasing.|Stamina is required to sprint and attack with a weapon.|Mana is used to cast spells. You have what is called a 'Mana Pool,'|which is excess mana that slowly refills you mana bar until it runs out.|Finally, running out of Willpower makes it much harder to escape bondage." +rTutorialContinue_Continue_Continue_Continue_Continue_Continue_Continue_Continue,"This is the hotbar.|Here you will find various spells and customizable actions.|You can customize it through the Spells submenu by clicking on a spell.|You can also add items, armor, and consumables to it from the Inventory." +rTutorialContinue_Continue_Continue_Continue_Continue_Continue_Continue_Continue_Continue,"Finally, this is where the message log will be.|It provides a written record of what happened the last few turns.|You can click the 'Log' button to expand the log,|Allowing you to look much further back." +rTutorialContinue_Continue_Continue_Continue_Continue_Continue_Continue_Continue_Continue_Continue,"Thats it for the UI.|If you want a more hands on tutorial, enter the portal to the top right,|near the training dummies.|You can click on NPCs (such as the ghosts in this room) to talk to them." + +KDNavGame,Game +KDNavQuit,Menu + + +KDInvFilter,Search ITMNS: +KDInvFilterQ,Search Items: +KDMagicFilter,Search Spells: + +KDFree,Free +KDDisarmed,Disarmed!!! +KDExpandBuffs,Show Buffs and Stats + +KinkyDungeonQuest,Quests + +KDShrineActionChampionRemove,Remove Devotion +KDShrineActionChampion,Devote Yourself +KDShrineActionPray,Pray for Assistance +KDShrineActionQuest,This shrine bears a request carved in stone: +KDShrineActionQuestAccept,Accept the Quest + +KDShrineQuestAccepted,You accept the goddess' quest. +KDShrineQuestAcceptedFail,You cannot accept that quest right now. + +KDShrineActionDescChampionRemove,"Removes your devotion from this goddess." +KDShrineActionDescChampionRemoveFail,You are not devoted to this goddess. +KDShrineActionDescChampion,"Guarantees a quest from this goddess on every floor." +KDShrineActionDescChampionFail,You are already a devotee of this goddess. +KDShrineActionDescOffer,Offer gold in exchange for help. Destroys the shrine. +KDShrineActionDescPray,Ask for help without offering gold. +KDShrineActionDescPrayFail,You have already prayed at this shrine. +KDShrineActionDescQuest,Listen to what the Goddess asks of you. +KDShrineActionDescQuestAccept,Accept the Goddess' quest. +KDShrineActionDescDrink,Drink the mana in the shrine. Can be done once. +KDShrineActionDescBottle,Bottle the mana in the shrine for later. Can be done once. + +KDQuestListCancel,Cancel Quest +KDQuestListDescCancel,Cancels the quest. You will not be penalized. +KDQuestListDescCancelFail,You can't cancel this quest. +KDNoQuests,You have no quests currently. + +KDNewQuest,A new quest has been added to your Journal. + +KDQuest_DressmakerQuest,Find the dressmaker's prized dress and wear it in front of her. +KDQuest_BanditQuest,Rescue the bandit from false imprisonment. +KDQuest_MaidforceQuest,Teach some unruly maids a lesson. +KDQuest_DragonheartQuest,Defeat a rebel leader and show them their place. +KDQuest_ApprenticeQuest,Help the student acquire a scroll! +KDQuest_WolfgirlHunters,You are being chased by a band of relentless poachers. + +KDQuest_RopeQuest,Slay the Rope Kraken. +KDQuestFail_RopeQuest,You did not do your quest! The Goddess has decided to punish you. +KDQuestSucceed_RopeQuest,You have pleased the Goddess. +KDQuestSucceedSub_RopeQuest,The Goddess calls you a good girl. +KDQuest_LatexQuest,Rescue some alchemists from their own experiment. +KDQuestFail_LatexQuest,You did not do your quest! The Goddess has decided to punish you. +KDQuestSucceed_LatexQuest,You have pleased the Goddess. +KDQuestSucceedSub_LatexQuest,The Goddess calls you a good girl. +KDQuest_LeatherQuest,Stop rebels from making a pact with primordial beings. +KDQuestFail_LeatherQuest,You did not do your quest! The Goddess has decided to punish you. +KDQuestSucceed_LeatherQuest,You have pleased the Goddess. +KDQuestSucceedSub_LeatherQuest,You have pleased the Goddess. +KDQuest_MetalQuest,Decommission some malfunctioning drones. +KDQuestFail_MetalQuest,You did not do your quest! The Goddess has decided to punish you. +KDQuestSucceed_MetalQuest,You have pleased the Goddess. +KDQuestSucceedSub_MetalQuest,The Goddess calls you a good girl. + +KDQuest_WillQuest,Resolve a dispute between elves and catgirls by tying up both sides. +KDQuestFail_WillQuest,You did not do your quest! The Goddess has decided to punish you. +KDQuestSucceed_WillQuest,You have pleased the Goddess. +KDQuestSucceedSub_WillQuest,The Goddess calls you a good girl. +KDQuest_ElementsQuest,Repel a planar incursion by a dangerous demon. +KDQuestFail_ElementsQuest,You did not do your quest! The Goddess has decided to punish you. +KDQuestSucceed_ElementsQuest,You have pleased the Goddess. +KDQuestSucceedSub_ElementsQuest,The Goddess calls you a good girl. +KDQuest_ConjureQuest,Stop some witches from performing a dubious summoning ritual. +KDQuestFail_ConjureQuest,You did not do your quest! The Goddess has decided to punish you. +KDQuestSucceed_ConjureQuest,You have pleased the Goddess. +KDQuestSucceedSub_ConjureQuest,The Goddess calls you a good girl. +KDQuest_IllusionQuest,Defeat a congregation of the Shadow Clan. +KDQuestFail_IllusionQuest,You did not do your quest! The Goddess has decided to punish you. +KDQuestSucceed_IllusionQuest,You have pleased the Goddess. +KDQuestSucceedSub_IllusionQuest,The Goddess calls you a good girl. + + + +KDGoddessQuestReward_Spell,"The Goddess grants you knowledge of SpellLearned!" +KDGoddessQuestReward_SpellPoints,"You Goddess grants you +AMOUNT spell points!" +KDGoddessQuestReward_Weapon,"The Goddess bestows a WeaponAcquired on you!" +KDGoddessQuestReward_Armor,"The Goddess grants you a ArmorAcquired!" +KDGoddessQuestReward_Macaron,The Goddess gives you a heavenly pastry. +KDGoddessQuestReward_MistressKey,The Goddess awards you an ancient key of great importance. + +KDDiffTab_Diff,Game Setup +KDDiffTab_Challenge,Challenge Settings + + + +KinkyDungeonChallenge,Challenge Settings: + +KDColorPickerSimple,Simple +KDColorPickerAdvanced,Advanced +KDColorPickerProperties,Expert Tools + +KDEscapeMinimap_Fail_Key,Exits locked!|Find NUMBER keys! +KDEscapeMinimap_Pass_Key,Got the keys! +KDEscapeMethod_Key,Key Hunt +KDEscapeMethodDesc_Key,Find the keys hidden in the level. Enemies can steal the keys if you aren't careful. +KDEscapeDoor_Key,There seems to be a locked high-security door. Looks like you need keys to open it. +KDEscapeMinimap_Fail_Lever,Exits locked!|Find a lever! +KDEscapeMinimap_Pass_Lever,Exits unlocked! +KDEscapeMethod_Lever,Lever Hunt +KDEscapeMethodDesc_Lever,Find the lever hidden in the level to unlock the door. +KDEscapeDoor_Lever,There seems to be a locked high-security door. Looks like you need to pull a lever to open it. +KDEscapeMinimap_Fail_Panel,Exits locked!|Find control panel! +KDEscapeMinimap_Pass_Panel,Exits unlocked! +KDEscapeMethod_Panel,Panel Hunt +KDEscapeMethodDesc_Panel,Find the control panel hidden in the level to unlock the door. +KDEscapeDoor_Panel,There seems to be a locked high-security door. Looks like you need find a control panel to open it. +KDEscapeMinimap_Fail_Boss,BOSS ROOM +KDEscapeMinimap_Pass_Boss,BOSS ROOM CLEARED! +KDEscapeMethod_Boss,Boss +KDEscapeMethodDesc_Boss,Defeat the boss to unlock the door. You can also unlock it by losing to the boss and being penalized. +KDEscapeDoor_Boss,There seems to be a locked high-security door. Looks like you need to defeat the boss to open it. +KDEscapeMinimap_Fail_Kill,Exits locked!|Defeat NUMBER TYPE! +KDEscapeMinimap_Pass_Kill,Quota Reached! +KDEscapeMethod_Kill,Bounty +KDEscapeMethodDesc_Kill,Defeat the specified targets to unlock the door. +KDEscapeDoor_Kill,There seems to be a locked high-security door. Looks like you need to defeat the targetted enemies to open it. +KDEscapeMinimap_Fail_Miniboss,Exits locked!|Defeat TYPE! +KDEscapeMinimap_Pass_Miniboss,Miniboss defeated! +KDEscapeMethod_Miniboss,Dangerous Bounty +KDEscapeMethodDesc_Miniboss,Defeat the specified strong enemy to unlock the door. +KDEscapeDoor_Miniboss,There seems to be a locked high-security door. Looks like you need to defeat the miniboss to open it. +KDEscapeMinimap_Fail_Chest,Exits locked!|Open NUMBER Chests! +KDEscapeMinimap_Pass_Chest,Quota Reached! +KDEscapeMethod_Chest,Chest Hunt +KDEscapeMethodDesc_Chest,Unlock the specified number of chests to unlock the door. +KDEscapeDoor_Chest,There seems to be a locked high-security door. Looks like you need to open more chests to open it. +KDEscapeMinimap_Fail_Quest,Exits locked!|Accept NUMBER Quests! +KDEscapeMinimap_Pass_Quest,Quota Reached! +KDEscapeMethod_Quest,Quest Hunt +KDEscapeMethodDesc_Quest,Accept the specified number of goddess quests to unlock the door. +KDEscapeDoor_Quest,There seems to be a locked high-security door. Looks like you need to accept more quests to open it. +KDEscapeMinimap_Fail_Trap,Exits locked!|Trigger NUMBER Traps! +KDEscapeMinimap_Pass_Trap,Quota Reached! +KDEscapeMethod_Trap,Trap Hunt +KDEscapeMethodDesc_Trap,Trigger the specified number of traps to unlock the door. +KDEscapeDoor_Trap,There seems to be a locked high-security door. Looks like you need to trigger more traps to open it. +KDEscapeMinimap_Fail_None,Room bugged. Please Report. +KDEscapeMinimap_Pass_None,"" +KDEscapeMethod_None,None +KDEscapeDoor_None,This door failed to load and cannot be opened. Please report this bug to Ada with a save code. +KDEscapeMethod_,None +KDEscapeDoor_,This door failed to load and cannot be opened. Please report this bug to Ada with a save code. + + +KDEscapeMinimap_Fail_SealSigil,Exit sealed!|Find the lair! +KDEscapeMinimap_Pass_SealSigil,Sigils erased! +KDEscapeMinimap_PassKill_SealSigil,Dragon defeated! +KDEscapeMethod_SealSigil,Draconic Seal +KDEscapeMethodDesc_SealSigil,"A dragon has sealed the entrance. Defeat the dragon, or erase the sigil from her lair." +KDEscapeDoor_SealSigil,"A draconic spell keeps the door sealed. You will have to confront its owner." + + +KDEscapeMinimap_Fail_WolfServer,Exits locked!|Destroy NUMBER Servers! +KDEscapeMinimap_Pass_WolfServer,Security System Compromised! +KDEscapeMinimap_Bypass_WolfServer,Clearance Granted! +KDEscapeMethod_WolfServer,Destroy Nevermere Servers +KDEscapeMethodDesc_WolfServer,Destroy Nevermere servers to unlock the door. +KDEscapeDoor_WolfServer,Nevermere Inc. placed a computerized lock on the door. Destroy the security servers to pass. +NameWolfServer,Nevermere Server +KillWolfServer,Server smashed! + +KDEscapeMinimap_Fail_DroneNode,Exits locked!|Destroy NUMBER Servers! +KDEscapeMinimap_Pass_DroneNode,Security System Compromised! +KDEscapeMinimap_Bypass_DroneNode,Clearance Granted! +KDEscapeMethod_DroneNode,Destroy Drone Servers +KDEscapeMethodDesc_DroneNode,Destroy Drone Node Servers to unlock the door. +KDEscapeDoor_DroneNode,The path forward is controlled by several ancient Drone Servers. Destroy them. +NameDroneNode,Drone Server Node +KillDroneNode,Drone node destroyed! +NameOldDroneNode,Rusty Server Node +KillOldDroneNode,Drone node destroyed! +KDAmbSound_NodeHum,loud beeping... + +KDVarSuffCursed,(Cursed) +KDVarSuffPurified,(Purified) +KDVarPrefPurified,(Purified) +KDVarSuffEvasion,of Agility +KDVarPrefAccuracy,Precise +KDVarPrefSneak,Silent +KDVarPrefAoEDamageFrozen,Blizzard +KDVarSuffSpellWard,of Warding +KDVarSuffBondageResist,of Freedom +KDVarSuffDamageResist,of Resistance +KDVarSuffDamageBuff,of Power +KDVarPrefManaCost,Arcane +KDVarPrefManaCostSpecific,Entuned +KDVarPrefManaRegenOnKill,Draining +KDVarSuffElementalEcho,of Echoes +KDVarPrefElementalDmg,Infused +KDVarPrefElementalDmg_stun,Explosive +KDVarPrefElementalDmg_fire,Flaming +KDVarPrefElementalDmg_cold,Shadow +KDVarPrefManaRegen,Focusing +KDVarSuffBaseDamageBuffMelee,of Empowerment +KDVarSuffBaseDamageBuffMagic,of Destruction + + +KinkyDungeonSpellQuickness,Phase Dance +KinkyDungeonSpellDescriptionQuickness,"For 4 turns, your movement does not advance time. Attacking or casting counts as one move and passes time as normal." +KinkyDungeonBuffQuickness,"You are F A S T" + +KinkyDungeonSpellQuickness2,Double Accel +KinkyDungeonSpellDescriptionQuickness2,"Slow down time by 1/2 for 10 turns (world time). Stamina regens 50% slower." +KinkyDungeonBuffQuickness2,"Time is slowed by 2x" +KinkyDungeonSpellQuickness3,Triple Accel +KinkyDungeonSpellDescriptionQuickness3,"Slow down time by 1/3 for 10 turns (world time). Stamina regens 75% slower." +KinkyDungeonBuffQuickness3,"Time is slowed by 3x" +KinkyDungeonSpellQuickness4,Quad Accel +KinkyDungeonSpellDescriptionQuickness4,"Slow down time by 1/4 for 10 turns (world time). Stamina does not regen." +KinkyDungeonBuffQuickness5,"Time is slowed by 4x" +KinkyDungeonSpellQuickness5,Total Accel +KinkyDungeonSpellDescriptionQuickness5,"Stop time 10 turns (world time). Stamina does not regen." +KinkyDungeonBuffQuickness5,"Time has come to a halt..." + +KDQuickness2_Yes,"Time slows down by 2x!" +KDQuickness2_Floater,"Double Accel!" +KDQuickness3_Yes,"Time slows down by 3x!" +KDQuickness3_Floater,"Triple Accel!" +KDQuickness4_Yes,"Time slows down by 4x!" +KDQuickness4_Floater,"Quad Accel!" +KDQuickness5_Yes,"Time has ceased to pass." +KDQuickness5_Floater,"Total Accel!" + +KDQuickness_Yes,"You begin to move at lightning speed!" +KDQuickness_Floater,"ACCEL BEGIN!" +KDQuickness_NoMana,"Not enough mana." +KDQuickness_NoComp,"You need to free your legs." + + +KinkyDungeonSpellSwap,Swap +KinkyDungeonSpellDescriptionSwap,"Choose a target with a clear line of sight to you and switch places with them." +KinkyDungeonSpellCastSwap,You point at the target and swap places with them! +KinkyDungeonSpellCastPartialSwap,"You point at the target and try tp swap places, but they resist!" +KinkyDungeonSpellCastFailSwap,"You point at the target and try tp swap places, but they resist and the spell fails!" +KinkyDungeonSpellTargetSwap,Choose target to swap with + +KDEnemyBlockSuccess,"The ENMY blocked your attack, negating it entirely!" +KDEnemyBlockPartial,"The ENMY blocked your attack, reducing the damage by PCNT%!" +KDEnemyBlockSuccessMulti,"The ENMY remains unscathed after putting up a strong defense!" +KDEnemyBlockPartialMulti,"The ENMY puts up surprising resistance, reducing the damage by PCNT%." + +KDNoDamage,no damage + + +KinkyDungeonSpellRaiseDefenses,Raise Defenses +KinkyDungeonSpellDescriptionRaiseDefenses,"Spend 90 stamina to shield yourself from damage equal to your Block. Lasts 10 turns or until you attack." +KinkyDungeonSpellEvasiveManeuvers,Evasive Maneuvers +KinkyDungeonSpellDescriptionEvasiveManeuvers,"While active, you evade almost all attacks, but your stamina is drained by 50 per turn plus 10 per slow level. The base stamina cost is reduced by your Evasion." +KinkyDungeonSpellBreakFree,Break Free +KinkyDungeonSpellDescriptionBreakFree,"Consume 20 Battle Rhythm to increase escape power by +20% plus 1% of Bondage Resist. Lasts 60 turns or until your willpower reaches 0." +KinkyDungeonSpellProblemSolving,Problem Solving +KinkyDungeonSpellDescriptionProblemSolving,"While active, struggling takes an additional 10 turns, but escape power bonuses from tools and buffs is increased by +(25 + 20% Bondage Resist)%" + + +KDEvasiveManeuversEnd,You run out of strength to keep dodging... +KDEvasiveManeuversFail,You can't muster the strength to dodge right now... +KDEvasiveManeuversStart,You prepare to dodge!!! + +KinkyDungeonSpellProblemSolvingMsg,Your expertise and skill provides you with additional tool effectiveness! (+AMOUNT%) + +KDRaiseDefensesFail,You don't have enough stamina. +KDRaiseDefensesSuccess,You raise your defences! +KinkyDungeonBuffRaiseDefenses,Your defenses are raised! + + +KDBreakFreeFailWP,You don't have the will to break free. +KDBreakFreeFail,You don't have enough Battle Rhythm. You need 20. +KDBreakFreeSuccess,"You channel your fighting spirit into your desire for freedom!" +KinkyDungeonBuffBreakFree,Your struggle power is greatly increased!!! + +KDTeleportNearby,"The teleportation partially succeeds due to an obstruction, placing you near the intended point." +KDTeleportFail,"The teleportation fizzles due to obstruction." +KDConfirm,Confirm +KDConfirmREALLY,Confirm and OVERWRITE SAVE +KDName,What is your name? + +KinkyDungeonSpellEnrage,"Enrage" +KinkyDungeonSpellDescriptionEnrage,"Scream loudly, causing nearby enemies to investigate and increasing Battle Rhythm by 10. Has a 100 turn cooldown." + +KDEnrageSuccess,You shout loudly and shake your fist at the sky! (+10 BR) +KDEnrageFailGagged,Mmmph! (You can't shout while gagged) +KDEnrageFailCooldown,You are plenty mad enough as is. +KDEnrageFail,You are too tired to rage. Perhaps try a warm cozy bed instead? + +KDTurns,turns + +KDShieldAbsorb,Your shield absorbed AMNT damage. +KDStatShield,You are currently shielded from damage and some spells. +KDoffhandMissingTooltip,No offhand weapon set. Activate the spell in your hotbar to set one. + + + +KinkyDungeonSpellBlink,Flash Portal +KinkyDungeonSpellDescriptionBlink,"After channeling for 2 turns, teleport to a nearby location (including into darkness). All adjacent creatures are teleported with you, in random order." +KinkyDungeonSpellCastBlink,You call upon a misty portal to transport you and nearby creatures! +KinkyDungeonSpellTargetBlink,Choose target location + +KinkyDungeonSpellTransportationPortal,Transportation Portal +KinkyDungeonSpellDescriptionTransportationPortal,"After channeling for 3 turns, teleport to a nearby location (including into darkness). Transports only allies, but they are stunned for the duration." +KinkyDungeonSpellCastTransportationPortal,You call upon a misty portal to transport you and your allies! +KinkyDungeonSpellTargetTransportationPortal,Choose target location + +KinkyDungeonSpellBanishPortal,Banishing Portal +KinkyDungeonSpellDescriptionBanishPortal,"After channeling for 3 turns, teleport all adjacent creatures to a point you can see. Does not teleport yourself." +KinkyDungeonSpellCastBanishPortal,You call upon a misty portal to transport those around you! +KinkyDungeonSpellTargetBanishPortal,Choose target location + +KinkyDungeonSpellRift,Rift +KinkyDungeonSpellDescriptionRift,"Tearing a rift in space, you teleport to a location (including into darkness). Leaves behind a rift for 4 turns, which enemies can follow you through." +KinkyDungeonSpellCastRift,You tear open a hole in space and step through! +KinkyDungeonSpellTargetRift,Choose target location + +KinkyDungeonSpellShadowDance,Shadow Dance +KinkyDungeonSpellDescriptionShadowDance,"While standing in a shadowed location, you can teleport to a nearby shadowed location. You can also teleport adjacent to shadow creatures." +KinkyDungeonSpellCastShadowDance,You slip between the shadows... +KinkyDungeonSpellTargetShadowDance,Choose a shadow + +KinkyDungeonSpellTeleportationCircleA,Teleportation Circle A +KinkyDungeonSpellDescriptionTeleportationCircleA,"When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. When learned, unlocks teleportation circle B and C as well." +KinkyDungeonSpellCastTeleportationCircleA,You begin a teleportation ritual... +KinkyDungeonSpellTargetTeleportationCircleA,"Choose a location to put a teleportation circle, or yourself to teleport to the created circle." +KinkyDungeonSpellTeleportationCircleB,Teleportation Circle B +KinkyDungeonSpellDescriptionTeleportationCircleB,"When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle." +KinkyDungeonSpellCastTeleportationCircleB,You begin a teleportation ritual... +KinkyDungeonSpellTargetTeleportationCircleB,"Choose a location to put a teleportation circle, or yourself to teleport to the created circle." +KinkyDungeonSpellTeleportationCircleC,Teleportation Circle C +KinkyDungeonSpellDescriptionTeleportationCircleC,"When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle." +KinkyDungeonSpellCastTeleportationCircleC,You begin a teleportation ritual... +KinkyDungeonSpellTargetTeleportationCircleC,"Choose a location to put a teleportation circle, or yourself to teleport to the created circle." + + +NameNatureSpirit,Nature Spirit +KillNatureSpirit,"The nature spirit returns to the earth from whence it came." + +KinkyDungeonSpellNatureMoteBolt,Vine Bolt + + +KinkyDungeonSpellGunslinger,"Gunslinger" +KinkyDungeonSpellDescriptionGunslinger,"Weapons abilities and other abilities that cost charge contribute 20% of their cost to Battle Rhythm." +KinkyDungeonSpellBattleCost,"Effortless Assault" +KinkyDungeonSpellDescriptionBattleCost,"Weapon stamina cost is reduced by a percentage equal to your Battle Rhythm." + +KinkyDungeonBuffPhaseEvasion,+50 Evasion from using Phase + +KinkyDungeonSpellBladeDance,Blade Dance +KinkyDungeonSpellDescriptionBladeDance,"Costs 60 stamina to dash to an adjacent spot. If you are holding a physical weapon, deals cleave damage to nearby enemies equal to 50% weapon damage. If you have a Light offhand weapon, deal 75% of its damage as well." +KinkyDungeonSpellCastBladeDance,"You spin towards a location, slashing at nearby enemies!" +KinkyDungeonSpellTargetBladeDance,Choose target location + +KinkyDungeonSpellTheShadowWithin,The Shadow Within +KinkyDungeonSpellDescriptionTheShadowWithin,"Shadow Dance no longer requires you to be in shadow in order to dash to another shadow, but the mana cost is doubled when doing so." + + + +KinkyDungeonSpellHolyOrb,Summon Holy Orb +KinkyDungeonSpellTargetHolyOrb,Select where to put the holy orb (cannot place on occupied squares) +KinkyDungeonSpellDescriptionHolyOrb,"Create a stationary holy orb that lasts indefinitely and heals allies. It also fires blinding bolts at enemies within its aura. If you let go of yourself near a holy orb you are immediately punished. Should not be placed within 8 tiles of each other." +KinkyDungeonSummonSingleHolyOrb,"A holy orb descends, blessing you with its roundness." +KinkyDungeonSpellCastHolyOrb,You call upon the root of all enlightenment! + +NameHolyOrb,Holy Orb +KillHolyOrb,The holy orb returns to its place in the sky. + +KinkyDungeonSpellAllyHolyBolt,Holy Bolt + +KDHolyOrbPunish,"The holy orb observes your lack of discipline, and issues a punishment." + + +RestraintDivineBelt,Divine Chastity Belt +RestraintDivineBeltDesc2,"A chastity belt forged in holy light. Only a Goddess' will can release you." +RestraintDivineBeltDesc,"There is no way even an angel can free herself. Its divine aura causes vibrators to cease right before you go over the edge." +KDDivineBeltDeny,Your Divine Chastity Belt causes the vibrators to stop. + + +KinkyDungeonInventoryItemDivineBelt,Divine Chastity Belt +KinkyDungeonInventoryItemDivineBeltDesc,"A chastity belt forged in holy light. Only the will of a Goddess will release you!" +KinkyDungeonInventoryItemDivineBeltDesc2,"There is no way even an angel can free herself. Its divine aura causes vibrators to cease right before you go over the edge." + +KinkyDungeonLootDivineBelt,You find a heavenly chastity belt. Who could it be for? + +RestraintDivineBra,Divine Chastity Bra +RestraintDivineBraDesc2,"A chastity bra forged in holy light. Only a Goddess' will can release you." +RestraintDivineBraDesc,"There is no way even an angel can free herself. Its divine aura prevents you from pleasuring yourself." +KDDivineBraDeny,Your Divine Chastity Bra causes your whole body to go numb. + +KinkyDungeonInventoryItemDivineBra,Divine Chastity Bra +KinkyDungeonInventoryItemDivineBraDesc,"A chastity bra forged in holy light. Only the will of a Goddess will release you!" +KinkyDungeonInventoryItemDivineBraDesc2,"There is no way even an angel can free herself. Its divine aura prevents you from pleasuring yourself." + +KinkyDungeonLootDivineBra,You find a heavenly chastity bra. Who could it be for? + +RestraintDivineBelt2,Heavenly Chastity Belt +RestraintDivineBelt2Desc2,"A chastity belt forged in holy light. Only a Goddess' will can release you." +RestraintDivineBelt2Desc,"There is no way even an angel can free herself. Its divine aura causes vibrators to dampen right before you go over the edge." +KDDivineBelt2Deny,Your Divine Chastity Belt magically dampens the vibrations just enough to edge you. + +KinkyDungeonInventoryItemDivineBelt2,Heavenly Chastity Belt +KinkyDungeonInventoryItemDivineBelt2Desc,"A chastity belt forged in holy light. Only the will of a Goddess will release you!" +KinkyDungeonInventoryItemDivineBelt2Desc2,"There is no way even an angel can free herself. Its divine aura causes vibrators to dampen right before you go over the edge." + +KinkyDungeonLootDivineBelt2,You find a heavenly chastity belt. Who could it be for? + +RestraintDivineBra2,Heavenly Chastity Bra +RestraintDivineBra2Desc2,"A chastity bra forged in holy light. Only a Goddess' will can release you." +RestraintDivineBra2Desc,"There is no way even an angel can free herself. Its divine aura converts self-pleasure to stamina." +KDDivineBra2Deny,The divine aura drains the pleasure from your self-pleasuring and converts it to stamina. + +KinkyDungeonInventoryItemDivineBra2,Heavenly Chastity Bra +KinkyDungeonInventoryItemDivineBra2Desc,"A chastity bra forged in holy light. Only the will of a Goddess will release you!" +KinkyDungeonInventoryItemDivineBra2Desc2,"There is no way even an angel can free herself. Its divine aura converts self-pleasure to stamina." + +KinkyDungeonLootDivineBra2,You find a heavenly chastity bra. Who could it be for? + + + +RestraintMagicBeltArms,Magic Arm Belts +RestraintMagicBeltArmsDesc,"Highly secure belts enchanted with magic." +RestraintMagicBeltArmsDesc2,"Lockable and fully adjustable to ensure snugness." +RestraintMagicBeltLegs,Magic Leg Belts +RestraintMagicBeltLegsDesc,"Highly secure belts enchanted with magic." +RestraintMagicBeltLegsDesc2,"Lockable and fully adjustable to ensure snugness." +RestraintMagicBeltFeet,Magic Ankle Belts +RestraintMagicBeltFeetDesc,"Highly secure belts enchanted with magic." +RestraintMagicBeltFeetDesc2,"Lockable and fully adjustable to ensure snugness." +KinkyDungeonLiquidMetal,The Liquid Metal starts engulfing you! +KinkyDungeonLiquidMetalEngulf,"The Liquid Metal explodes and covers you!" +KinkyDungeonLiquidMetalSlowEngulf,The Liquid Metal takes advantage of your status and engulfs you! + + +KinkyDungeonSpellLiquidMetalBurst,Silver Burst +KinkyDungeonSpellTargetLiquidMetalBurst,Select a liquid metal tile +KinkyDungeonSpellDescriptionLiquidMetalBurst,"Target a liquid metal tile. After 3 turns, it erupts, spreading more liquid metal and engulfing any nearby creatures. Deals DamageDealt crush damage and applies 80 points of metallic binding." +KinkyDungeonSpellCastLiquidMetalBurst,A powerful explosion simmers beneath the surface...' + +KinkyDungeonTrapSpawnLiquidMetalCube,"The ground shakes as a huge wall of liquid metal approaches!" +NameLiquidMetalCube,Liquid Metal Cube +KillLiquidMetalCube,"The liquid metal cube dissolves into a huge pile of glittering dust." +AttackLiquidMetalCube,"The liquid metal cube engulfs you and squeezes tightly! (DamageTaken)" +AttackLiquidMetalCubeBind,"The liquid metal cube engulfs your body and hardens, taking the form of restraints! (+RestraintAdded)" + + +NameSkeletonArcher,Skeleton Archer +KillSkeletonArcher,"The Skeleton falls to pieces." +AttackSkeletonArcherBind,"The Skeleton restrains you! (+RestraintAdded)" +AttackSkeletonArcher,"The Skeleton tackles you! (DamageTaken)" + +KinkyDungeonSpellCursedArrow,Cursed Arrow + +KDKick,"Because your hands are unavailable, you kick the target instead." + + + +KDQuest_ElementalSlave,"Your former owners are looking for you across the seven planes." + +KDQuest_LatexDoll,"A local business is missing one of their models, and will stop at nothing to find her." +KinkyDungeonFactionDollShoppe,The Doll Shoppe +KinkyDungeonFactionOwners,Elemental Slavers + +KDQuest_MaidSweeper,"Your duty as a maid is to keep the place clear of dirt and other hazards." +NameDirtPile,Dirt Pile +KillDirtPile,You clear out the dirt pile +KDDirtPileSurprise,A ENMY was lurking inside the dirt pile! +KDNotEnoughDirtPiles,"You skipped your duty and left some dirt missing in the last level!" + +KDQuest_EscapedDoll,"The Dollmaker does not take no for an answer." +KDQuest_FuukaPet,"Fuuka's shrine maidens would like to have a word with you." +KDQuest_Nawashi,"Your instructor will meet with you at regular intervals for further training." + +KinkyDungeonStatHogtied,"Hogtied!" +KinkyDungeonStatDescHogtied,"Experience a comprehensive rope bondage experience." + + + +KDBondageOptionPerk,"Receive the following restraints: " +KDBondageOptionPerkHidden,"You will be bound with some form of restraint." + +KDVarPrefShadowBleed,Shadow + +NameGagGeist,Gag Geist +KillGagGeist,"The gag geist goes silent." +AttackGagGeist,"The gag geist teases you playfully!! (DamageTaken)" +AttackGagGeistBind,"The gag geist gags the girl with a ghastly grimace! (+RestraintAdded)" + +NamePoltergeist,Poltergeist +KillPoltergeist,"The poltergeist goes silent." +AttackPoltergeist,"The poltergeist gropes and teases you playfully, exhausting your stamina! (DamageTaken)" +AttackPoltergeistBind,"The poltergeist binds you with... something? (+RestraintAdded)" + +RestraintInvisibleGag,Invisible Gag +RestraintInvisibleGagDesc,"It's a gag, but invisible!" +RestraintInvisibleGagDesc2,"You wonder what color it is." + +RestraintInvisibleBlindfold,Invisible Blindfold +RestraintInvisibleBlindfoldDesc,"It's a blindfold, but invisible!" +RestraintInvisibleBlindfoldDesc2,"How exactly is this supposed to work?" + +RestraintInvisibleArmbinder,Invisible Armbinder +RestraintInvisibleArmbinderDesc,"It's an armbinder, but invisible!" +RestraintInvisibleArmbinderDesc2,"You wonder what color it is." + +RestraintInvisibleLegbinder,Invisible Legbinder +RestraintInvisibleLegbinderDesc,"It's an legbinder, but invisible!" +RestraintInvisibleLegbinderDesc2,"This is starting to get cruel..." + + +KinkyDungeonTrapSpawnSummonedZombie,Strangely dressed zombies start approaching you!! +KinkyDungeonTrapSpawnGag,A floating gag appears and starts flying toward you! +KinkyDungeonTrapSpawnAnimBlindfold,A floating blindfold appears and starts flying toward you! +KinkyDungeonTrapSpawnAnimYoke,A floating yoke appears and starts flying toward you! +KinkyDungeonTrapSpawnAnimChastity,A floating chastity item appears and starts flying toward you! +KinkyDungeonTrapSpawnAnimStraitjacket,A floating straitjacket appears and starts flying toward you! +KinkyDungeonTrapSpawnAnimHarness,A floating harness appears and starts flying toward you! +KinkyDungeonTrapSpawnAnimArmbinder,A floating harness appears and starts flying toward you! +KinkyDungeonTrapSpawnCuffs,A set of shackles opens wide and starts going for your wrists! +KinkyDungeonTrapSpawnMummyCursed,You hear moaning as the statues start to move... +KinkyDungeonTrapSpawnBookBondage,Devious tomes emerge from the bookshelves! +KinkyDungeonTrapSpawnMushy,Armed mushrooms emerge from the ground to defend their home! +KinkyDungeonTrapSpawnPoltergeist,"Playful ghosts slip through the walls, giggling to themselves!" +KinkyDungeonTrapSpawnOldDrones,"Ancient drones drop from the ceiling and come to life!" +KinkyDungeonTrapSpawnObserver,"You were always being watched..." + +LootChestGunpowder,You find a store of gunpowder! + +KinkyDungeonSpellExplosiveBarrel,Explosive Barrel + +NameExplosiveBarrel,Explosive Barrel +KillExplosiveBarrel,The explosive barrel falls apart and drops its gunpowder. +KDExplosiveBarrelExplode,The explosive barrel catches fire and explodes! + +KinkyDungeonCurseInfoSacrificeMage,"The item demands copious mana, more than you can supply. You'll have to tie up a mage." +KinkyDungeonCurseStruggleSacrificeMage,"The cursed seal glows and pulsates as you struggle fruitlessly." +KDRemoveSacrificeMage,The curse has been lifted through judicious application of spellcasters. +KDRemoveSacrificeMagePartial,The cursed item drains all of the caster's mana. It demands more. + + +RestraintWolfPetsuit,Punishment Suit +RestraintWolfPetsuitDesc,"A tool used by Nevermere on the most difficult and recalcitrant wolfgirls." +RestraintWolfPetsuitDesc2,"Designed to contain superhuman strength, struggling out of this would be a major feat." + +KinkyDungeonSpellDistractionShield,Shield of (un)Clarity +KinkyDungeonSpellDescriptionDistractionShield,"Channel your clarity of mind into a powerful shield, filling your distraction bar completely and granting a temporary shield equal to 50% of the DP generated. 10% of the DP gained is gained as Desire, which prevents DP decaying below a certain point." +KDDistractionShield_Yes,"You form a... distracting mental barrier, shielding yourself for AMNT damage!!!" +KDDistractionShield_No,"You are too distracted to form a mental barrier..." +KDDistractionShield_NoMana,"You have the mental clarity but not the magical clarity! (not enough mana)" + +KinkyDungeonBuffDistractionShield,"You have formed a mental barrier..." + + +KinkyDungeonSpellDistractionBurst,Desire Burst +KinkyDungeonSpellDescriptionDistractionBurst,"Overload Essence motes in an area, costing 10% max DP worth of Desire each. They explode, dealing (10 + 20% max DP) charm damage to enemies hit. If you don't have enough desire, the damage is reduced proportionally.||(Desire is the heart-shaped meter below your DP bar, and is gained slowly by being distracted)" +KDDistractionBurst_Yes,"You channel your distraction into the mote, overloading it!" +KDDistractionBurst_YesP,"You channel your distraction into the motes, overloading them!" +KDDistractionBurst_No,"You don't have enough of a desire to do that." +KDDistractionBurst_NoMote,"You must target at least one Essence Mote." +KDDistractionBurst_NoMana,"You have the desire but not the mana!" + + + +KDDivineLockReminder,Your divine-locked restraints can only be removed by completing a shrine quest. + +KDCursedGoddess,The Goddess hates you. That won't work. + + +KinkyDungeonSpellHarvest,Harvest +KinkyDungeonSpellDescriptionHarvest,"Requires a slashing weapon equipped. Activate to harvest all adjacent vine tiles, with a 25% chance per tile to obtain a seed.|Seeds can be planted to form gardens, which will grow in 100 turns to become vegetables, which can be eaten to restore WP or sold to the shopkeeper." +KDHarvest_Yes,"You twirl your weapon, harvesting AMNT seeds!" +KDHarvest_No,"There is nothing to harvest." + +KinkyDungeonSpellFloatingWeapon,Telekinesis 101 +KinkyDungeonSpellDescriptionFloatingWeapon,"Unlocks telekinetic abilities. Toggle on to equip weapons while bound, but at 0% accuracy. Learn Recover Object." + + +KinkyDungeonSpellRecoverObject,Recover Object +KinkyDungeonSpellDescriptionRecoverObject,"Use telekinesis to pick up items and open chests from a distance. Refunds 75% of mana cost if not used to open a chest." +KinkyDungeonSpellCastRecoverObject,The items float to you! +KinkyDungeonSpellCastFailRecoverObject,There's nothing to pick up. +KinkyDungeonSpellCastFailLockRecoverObject,The chest is locked. +KinkyDungeonSpellCastFailObstacleRecoverObject,There's an obstacle in the way! +KinkyDungeonSpellTargetRecoverObject,Select a tile with items + + +KinkyDungeonSpellRecoverObject2,Enhanced Recovery +KinkyDungeonSpellDescriptionRecoverObject2,"Upcast to increase range and recover objects in an area." +KinkyDungeonSpellCastRecoverObject2,The items float to you! +KinkyDungeonSpellCastFailRecoverObject2,There's nothing to pick up. +KinkyDungeonSpellCastFailLockRecoverObject2,That container is locked! +KinkyDungeonSpellTargetRecoverObject2,Select an area with items + + +KinkyDungeonSpellTelekineticSlash,Kinetic Slash +KinkyDungeonSpellDescriptionTelekineticSlash,"Swing an equipped weapon (not unarmed or hands free) in a line, slashing enemies in the way with 20 + 80% weapon damage. Counts as an attack. +10 mana cost if wielding a Heavy weapon." +KinkyDungeonSpellCastTelekineticSlash,You swing! +KinkyDungeonSpellTargetTelekineticSlash,Choose where to swing (must not be unarmed or hands free weapon) + + +KinkyDungeonSpellKineticLance,Kinetic Lance +KinkyDungeonSpellDescriptionKineticLance,"Propel your weapon at devastating speed, piercing enemies for 30+160% Weapon Damage and dropping it at the end of the trajectory. Counts as an attack. +15 mana cost if wielding a Heavy weapon." +KinkyDungeonSpellCastKineticLance,You propel your weapon forward! +KinkyDungeonSpellTargetKineticLance,Choose where to launch your weapon. + + +KinkyDungeonSpellSagitta,Sagitta +KinkyDungeonSpellDescriptionSagitta,"Fire a projectile. If this projectile hits an enemy, make one attack against an enemy for 10+40% weapon damage. +5 mana cost if wielding a Heavy weapon." +KinkyDungeonSpellCastSagitta,You unleash a deadly projectile! +KinkyDungeonSpellTargetSagitta,Choose aim direction. + + +KinkyDungeonSpellSagittaAssault,Sagitta Assault +KinkyDungeonSpellDescriptionSagittaAssault,"After casting Sagitta, you can recast it up to three more times without advancing time." + +KinkyDungeonSpellPsychokinesis,Psychokinesis +KinkyDungeonSpellDescriptionPsychokinesis,"You can ignore components for telekinetic spells, however spells generate distraction (based on mana cost) when cast this way due to the mental strain. Unable to use at 100% DP." + +KinkyDungeonSpellKineticMastery,Kinetic Mastery +KinkyDungeonSpellDescriptionKineticMastery,"Negates the penalty for 2-handed weapons. Also gain the following effects:|-Kinetic spells and Sagitta cost 30% less while wielding a Light weapon.|-Kinetic spells and Sagitta gain +15 base damage when wielding a Heavy weapon." + +KinkyDungeonSpellGrasp,Grasp +KinkyDungeonSpellDescriptionGrasp,"Cast on an enemy to snare them for 20 turns, or until you leave range/are incapacitated. Cast on a point to throw the grasped enemy in that direction, dealing 40 crush damage if they hit a wall or another enemy." +KinkyDungeonSpellCastGrasp,You grab the ENMY using telekinesis and hold them in place! +KinkyDungeonSpellCastThrowGrasp,You throw the ENMY! +KinkyDungeonSpellTargetGrasp,Choose a target or a location (if a target is currently grasped) + + +KinkyDungeonInventoryItemRock,Rock +KinkyDungeonInventoryItemRockDesc,"Perfect for a lifestyle of love and peace." +KinkyDungeonInventoryItemRockDesc2,"Deals crush damage. Stuns on critical. Ouch!" +ItemPickupRock,"You pick up a particularly nice rock." + + +ItemPickupSnuffer,"You pick up a device for snuffing out candles and torches." +KinkyDungeonInventoryItemSnuffer,Candle Snuffer +KinkyDungeonInventoryItemSnufferUse,"You put out the torch." +KinkyDungeonInventoryItemSnufferDesc,"A handy device for putting out torches and lanterns." +KinkyDungeonInventoryItemSnufferDesc2,"But why would you want to do that? You hidin' something?" + +ItemPickupSackOfSacks,"You find a bag full of sacks. Or is it a sack full of bags?" +KinkyDungeonInventoryItemSackOfSacks,Recursive Bag +KinkyDungeonInventoryItemSackOfSacksUse,"You cover the light source." +KinkyDungeonInventoryItemSackOfSacksDesc,"Bags inside a bag of bags inside a bag of bags" +KinkyDungeonInventoryItemSackOfSacksDesc2,"Can be placed over light sources to cover them." + +KDNotSnuffable,The snuffer doesn't work on that light source. +KDNotBaggable,The bag can't cover that light source. +KDUnbag,You remove the bag from its light source and place it back inside your bag. + +KDCombatLine_YoureFinished_Dom0,There. Now it's time to have some fun~ +KDCombatLine_YoureFinished_Dom1,How utterly helpless~ +KDCombatLine_YoureFinished_Dom2,Let's see how long you last. + +KDCombatLine_YoureFinished_0,I've got you! Now let's have some fun! +KDCombatLine_YoureFinished_1,"I think I'll help myself to you for a bit~" +KDCombatLine_YoureFinished_2,"Gosh, you're so cute like that!" + +KDCombatLine_YoureFinished_Sub0,"I'm going to have to search you, miss~" +KDCombatLine_YoureFinished_Sub1,"Let's check your restraints." +KDCombatLine_YoureFinished_Sub2,"You look so cute like that, miss!" + +KDCombatLine_YoureFinished_Brat0,All nice and tight. Certainly no longer a threat~ +KDCombatLine_YoureFinished_Brat1,"I'm going to make sure you're nice and tight~" +KDCombatLine_YoureFinished_Brat2,"Surely nothing can happen now!" + +NameElementalRubber,Rubber Elemental +KillElementalRubber,"The rubber elemental's restraints snap onto her and she falls over hogtied." +AttackElementalRubberBind,"The rubber elemental molds itself into restraints! (+RestraintAdded)" +AttackElementalRubber,"The rubber elemental squeezes you with its appendages! (DamageTaken)" +AttackElementalRubberLock,"The rubber elemental forms rubber locks around all your restraints! (DamageTaken)" + +KDEnchantRope1,Your ropes are enchanted with a lesser spell! +KDEnchantRope2,Your ropes are enchanted with a magic spell! +KDEnchantRope3,Your ropes are enchanted with a powerful spell! +KDEnchantRope4,Your ropes are enchanted with a peerless spell! + + +NameWitchShibari,Shibari Witch +KillWitchShibari,"The shibari witch blows a kiss and says goodbye." +AttackWitchShibariBind,"The shibari witch ties you tight! (+RestraintAdded)" +AttackWitchShibariLock,"The witch dangles a lock in front of you before putting it on! (DamageTaken)" +AttackWitchShibari,"The witch rubs your body sensually! (DamageTaken)" +KDWitchShibariDisrobe,The Shibari Witch takes your clothes off! + + +KinkyDungeonStat,"" +KinkyDungeonStatDesc,"" + +KinkyDungeonStatAHardPlace,"A Hard Place" +KinkyDungeonStatDescAHardPlace,"While your willpower is 0, your mana pool slowly drains and your max stamina regen point is reduced by 30%." + +KinkyDungeonStatSparkOfMagic,"The Spark of Magic" +KinkyDungeonStatDescSparkOfMagic,"When your mana pool is exhausted, your attacks deal 50% reduced base damage." + +KinkyDungeonStat,"" +KinkyDungeonStatDesc,"" + +KinkyDungeonStatBurnedOut,"Burned Out" +KinkyDungeonStatDescBurnedOut,"Casting spells reduces willpower based on how little distraction you have, also you cannot play with yourself." + +KinkyDungeonStatWinded,"Winded" +KinkyDungeonStatDescWinded,"While below 10% stamina, evasion is severely reduced and your slow level is increased by 1." + +NameTimeGhost,Lost One +KillTimeGhost,"The being vanishes in front of you." +AttackTimeGhost,"The being grabs you, causing your body parts to freeze in time!!! (DamageTaken)" +AttackTimeGhostBind,"The being has already bound you! (+RestraintAdded)" + +NameTimekeeper,The Timekeeper +KillTimekeeper,"The Timekeeper releases her grip on the timeline." +AttackTimekeeper,"The Timekeeper takes the time to enjoy herself with you... (DamageTaken)" +AttackTimekeeperBind,"The Timekeeper enacts judgement for disrupting time! (+RestraintAdded)" + +KinkyDungeonBuffAnalyze,Analysis + +ItemPickupSlimethrower,You pick up a latex projector + +KinkyDungeonStatCantTouchThat,"Can't Touch That" +KinkyDungeonStatDescCantTouchThat,"When both arms and hands are severely bound, you can no longer pick up items without an ally nearby." +KDCantTouchThat,You can't pick that up without help. +KinkyDungeonStatGrounded,"Grounded" +KinkyDungeonStatDescGrounded,"When arms are tied and feet are linked, you cannot get up from a kneeling position without help or a wall." +KDKneelSlow,You take more time getting up due to your bindings. +KDKneelCannot,You can't get up without help. +KDGetUpAlly,Your ally helps you back up. +KDGetUpCorner,You get back up using the corner. +KDGetUpWall,You get up to your knees using the wall. +KDCantCloseDoor,You're too tied up to close the door. +KDAutoChest,The chest opens on its own. + +KDMouthGround,"You can't use your hands for that, but you can crouch to use your mouth." + +KinkyDungeonStatHeelTraining,"Heel Training" +KinkyDungeonStatDescHeelTraining,"Start locked in a pair of heels with no heel training." +KinkyDungeonStatGagTraining,"Gag Training" +KinkyDungeonStatDescGagTraining,"Start locked in a gag with no gag training." +KinkyDungeonStatCorsetTraining,"Corset Training" +KinkyDungeonStatDescCorsetTraining,"Start locked in a corset with no corset training." +KinkyDungeonStatSensesTraining,"Sensory Training" +KinkyDungeonStatDescSensesTraining,"Start locked in a blindfold and headphones with no Sensory training." + +KinkyDungeonStatMasteryHeels,"Hard to Master: Heels" +KinkyDungeonStatDescMasteryHeels,"Heel training is significantly slower." +KinkyDungeonStatMasteryGags,"Hard to Master: Gags" +KinkyDungeonStatDescMasteryGags,"Gag training is significantly slower." +KinkyDungeonStatMasteryCorsets,"Hard to Master: Corsets" +KinkyDungeonStatDescMasteryCorsets,"Corset training is significantly slower." +KinkyDungeonStatMasterySenses,"Hard to Master: Sensory" +KinkyDungeonStatDescMasterySenses,"Sensory training is significantly slower." + +KinkyDungeonStatHeadStartHeels,"Head Start: Heels" +KinkyDungeonStatDescHeadStartHeels,"Start at Heel training level 5." +KinkyDungeonStatHeadStartGags,"Head Start: Gags" +KinkyDungeonStatDescHeadStartGags,"Start at Gag training level 5." +KinkyDungeonStatHeadStartCorsets,"Head Start: Corsets" +KinkyDungeonStatDescHeadStartCorsets,"Start at Corset training level 5." +KinkyDungeonStatHeadStartSenses,"Head Start: Sensory" +KinkyDungeonStatDescHeadStartSenses,"Start at Sensory training level 5." + +KinkyDungeonStatClassicHeels,"Classic Heels" +KinkyDungeonStatDescClassicHeels,"Removes Heel Training and tripping mechanic. Restraining heels slow instead." +KinkyDungeonStatTrustFall,"Trust Fall" +KinkyDungeonStatDescTrustFall,"Hides the balance meter while wearing heels and/or unsteady." + +KinkyDungeonStatPoorBalance,"Poor Balance" +KinkyDungeonStatDescPoorBalance,"You take longer to get up and are less skilled at wearing high heels." + +KDBalance,"Balance: AMNT%" +KDBalanceNoSprint,"Balance: AMNT% (Sprinting Disabled!!!)" +KDTrip,You lose your balance and fall over!!! +KDBalanceTraining,Training Level: AMNT + +KDInventoryActionUse,Use One +KDInventoryActionEquip,Equip +KDInventoryActionUnequip,Unequip +KDInventoryActionFavorite,Favorite +KDInventoryActionUnfavorite,Unfavorite +KDInventoryActionHotbar,Add to Hotbar +KDInventoryActionDrop,Drop +KDInventoryActionAttach,Attach +KDAttached,Attached + +KDInventoryActionQuickSlot1,Add to Quick Slot 1 +KDInventoryActionQuickSlot2,Add to Quick Slot 2 +KDInventoryActionQuickSlot3,Add to Quick Slot 3 +KDInventoryActionQuickSlot4,Add to Quick Slot 4 + +KDInventoryActionCut,Try to Cut +KDInventoryActionStruggle,Struggle! +KDInventoryActionUnlock,Try to Unlock +KDInventoryActionLock,Add a Lock +KDInventoryActionRemove,Try to Remove +KDInventoryActionPick,Try to Pick +KDInventoryActionCurseInfo,Examine the Curse +KDInventoryActionCurseRemove,Remove the Curse +KDInventoryActionFood,Feed this to her +KDInventoryActionSell,Sell for VLU gp +KDInventoryActionSellBulk,Sell ALL for VLU gp +KDInventoryActionSellExcess,Sell all but one for VLU gp + +KDGiveFood,"You feed the RSTR to the ENNME! (AMNT1/AMNT2 hp)" +KDFoodTarget,"Choose a food item or willpower potion" + +KinkyDungeonSpellRuneTrap_Rope,Rope Rune +KinkyDungeonSpellRuneTrap_Chain,Chain Rune +KinkyDungeonSpellRuneTrap_Ribbon,Ribbon Rune +KinkyDungeonSpellRuneTrap_Vine,Nature Rune +KinkyDungeonSpellRuneTrap_Belt,Belt Rune +KinkyDungeonSpellRuneTrap_Leather,Leather Rune +KinkyDungeonSpellRuneTrap_Latex,Latex Rune +KinkyDungeonSpellRuneTrap_VacCube,Latex Cube Rune +KinkyDungeonSpellRuneTrap_SlimeBubble,Slime Bubble Rune +KinkyDungeonSpellRuneTrap_Bubble,Bubble Rune +KinkyDungeonSpellRuneTrap_LatexSphere,Spherical Rune +KinkyDungeonSpellRuneTrap_LatexBall,Ball Rune +KinkyDungeonSpellRuneTrap_Rubber,Rubber Rune +KinkyDungeonSpellRuneTrap_Slime,Slime Rune + +KDGP,"+AMNT gp" +KDLocked,Locked + +KDEnemyLetGo,"ENMY lets go of herself for AMNT damage!" + +KinkyDungeonSpellSonar,Sonar +KinkyDungeonSpellDescriptionSonar,Emit a ping to highlight floors and tiles in a large radius. The ping is audible and attracts enemies to your position. + +KDSonar_Yes,"You emit a loud noise and listen for echoes..." +KDSonar_NoComp,"Your mouth is too heavily stuffed!" +KDSonar_NoMana,"You don't have the mana to cast Sonar!" +KDNippleWeights,The weights swing around and tug on your nipples! + + +KinkyDungeonStatMoreKinkyFurniture,"More Kinky Furniture" +KinkyDungeonStatDescMoreKinkyFurniture,"Replaces 60% of cages with a different kind of kinky furniture such as display stands." + +KinkyDungeonKeyCollection,Collection +KinkyDungeonCollection,Collection +KinkyDungeonFacilities,Facilities +KinkyDungeonTraining,Training + +KDPrisonersCurrent,Storage +KDPrisonersManagement,Management +KDPrisonersNoManagement,You don't have anywhere to manage your prisoners! Yet... + +KDCollectionEmpty,Your collection is empty. Use binding attacks to tie up and capture damsels! + +KDPrisonerStat_Personality,Personality +KDPersonality,Switch +KDPersonalitySub,Submissive +KDPersonalityDom,Dominant +KDPersonalityBrat,Bratty +KDPersonalityRobot,Drone +KDPersonalityCorrupt,Corrupted +KDPersonalityFeral,Feral + +KDPrisonerStat_Status,Status +KDPrisonerStatus,Prisoner +KDPrisonerStatusGuest,Guest +KDPrisonerStatusServant,Servant +KDPrisonerStatusManager,Manager + +KDPrisonerStat_Opinion,Opinion +KDPrisonerStat_Training,Training +KDPrisonerStat_Willpower,Willpower + +KDPrisonerNum_,Prisoner #NUMR/TTL +KDPrisonerNum_Guest,Guest #NUMR/TTL + + +KDCollectionSelect,Select a character to examine +KDFormerFaction,"Former Faction: " + + +KDPalette,None +KDPaletteJail,Prisoner +KDPaletteMiku,Miku +KDPaletteNevermere,Nevermere +KDPaletteBountyhunter,Bounty Hunter +KDPaletteDressmaker,Dressup Co. +KDPaletteDollsmith,Dollmaker +KDPaletteLatex,Latex +KDPaletteRubber,Rubber +KDPaletteSlime,Slime +KDPaletteAlchemist,Alchemist +KDPaletteApprentice,Scholarly +KDPaletteWitch,Witch's Coven +KDPaletteWarden,Warden +KDPaletteCurse,Curse +KDPaletteAncientRobot,Old Guardians +KDPaletteMushy,Fungal +KDPaletteBast,Bast +KDPaletteBandit,Bandit +KDPaletteElf,Elven +KDPaletteGoddess,Divine +KDPaletteMaidforce,Maid +KDPaletteElemental,Elemental +KDPaletteElemental2,Royal + +KDSelectPalette,Choose default outfit palette: + +KDAutoLoadMods,Auto Load Mods +KDModVirus,SUSPICIOUS MOD DETECTED + +KDVisionBlind,The bright light hurts your dark-adjusted eyes! + +KinkyDungeonSpellUnconventionalWarfare,"Unconventional Warfare" +KinkyDungeonSpellDescriptionUnconventionalWarfare,"Select a weapon to attach it to your body. You can have one attached weapon at a time. Attaching it takes 5 turns.|An attached weapon can be equipped without hands and maintains 60% accuracy as long as you have arms or legs unbound." + +KinkyDungeonSpellGuerillaFighting,"Guerilla Fighting" +KinkyDungeonSpellDescriptionGuerillaFighting,"Light weapons can be wielded if you have your mouth free, at 75% accuracy." + + +KDToughArmor,"Tough Armor (1/2 crit mult while aware)" +KDAbsoluteArmor,"Absolute Armor (1/2 crit mult)" + +KDDressNPC,Change Outfit +KDRenameNPC,Rename +KDRenameOrigNPC,Reset to NME +KDZoomNPC,Enlarged View +KDBackToGame,Back to Game + + +KDServants,Servants +KDPrisoners,Prisoners + +KDPromoteNPC,Promote to Servant +KDDemoteNPC,Demote +KDKickOutGuest,Delete Guest +KDKickOutGuestConfirm,Really Delete Guest? + +KDTeaseAttackResist_LeashGrab,The ENMY tries to grab you! + +KDTeaseAttack_SquishBreast,The ENMY reaches out and gives your breast a squeeze! (DMGDLT) +KDTeaseAttack_SquishBreastCast,The ENMY squeezes your breasts as you raise your arms for a spell! (DMGDLT) +KDTeaseAttackResist_SquishBreast,"The ENMY reaches for you and fails!" +KDTeaseAttack_SpankButt,The ENMY gives your butt a light slap as you cast! (DMGDLT) +KDTeaseAttack_SpankButtSprint,The ENMY gives your butt a good slap as you sprint past! (DMGDLT) +KDTeaseAttackResist_SpankButt,"The ENMY tries to spank you but misses!" +KDTeaseAttack_SqueezeButt,The ENMY gives your butt a squeeze! (DMGDLT) +KDTeaseAttack_SqueezeButtCast,The ENMY gives your butt a squeeze during your cast! (DMGDLT) +KDTeaseAttack_SqueezeButtBehind,The ENMY gives your butt a squeeze from behind! (DMGDLT) +KDTeaseAttack_SqueezeButtMove,The ENMY gives your butt a squeeze as you pass by! (DMGDLT) +KDTeaseAttackResist_SqueezeButt,"The ENMY reaches for you but misses!" +KDTeaseAttack_TickleArmpits,The ENMY tickles your armpits! (DMGDLT) +KDTeaseAttack_TickleArmpitsRaised,The ENMY tickles under your raised arms! (DMGDLT) +KDTeaseAttackResist_TickleArmpits,"The ENMY tries to tickle you!" +KDTeaseAttack_TickleFeet,The ENMY tickles your feet! (DMGDLT) +KDTeaseAttackResist_TickleFeet,"The ENMY tries to tickle you!" +KDTeaseAttack_TickleFeetRemove,The ENMY takes off your shoes and tickles your feet! (DMGDLT) +KDTeaseAttack_Headpat,The ENMY pats you gently on the head. (DMGDLT) +KDTeaseAttack_HeadpatCast,The ENMY pats you gently on the head as you fail your spell... (DMGDLT) +KDTeaseAttackResist_Headpat,"The ENMY tries to pat you on the head but decides not to." +KDTeaseAttack_ShoulderMassage,The ENMY behind you gives your shoulders a nice massage! (DMGDLT) +KDTeaseAttackResist_ShoulderMassage,"The ENMY reaches for your shoulders but you slip free!" +KDTeaseAttack_Praise,The ENMY calls you cute! (DMGDLT) +KDTeaseAttackResist_Praise,"The ENMY blushes at your cuteness!" +KDTeaseAttack_Insult,The ENMY makes fun of you! (DMGDLT) +KDTeaseAttackResist_Insult,"The ENMY struggles to find words!" +KDTeaseAttack_VibeToy,The ENMY buzzes you with her VTY! (DMGDLT) +KDTeaseAttack_VibeToySlow,The ENMY catches you and teases you with her VTY! (DMGDLT) +KDTeaseAttackResist_VibeToy,"The ENMY reaches for her VTY!" +KDTeaseAttack_InsertToy,The ENMY sticks a VTY into you! (DMGDLT) +KDTeaseAttackResist_InsertToy,"The ENMY reaches for her VTY!" +KDTeaseAttack_AddStuffing,The ENMY sticks a stuffing into your open mouth! (DMGDLT) +KDTeaseAttackResist_AddStuffing,"The ENMY reaches for your mouth and fails!" +KDTeaseAttack_AddGag,The ENMY takes advantage of the gag around your neck~ (DMGDLT) +KDTeaseAttackResist_AddGag,"The ENMY reaches for the gag around your neck!" +KDTeaseAttack_AddCarabiner,The ENMY pulls your hands together and sticks a clip between them! (DMGDLT) +KDTeaseAttackResist_AddCarabiner,"The ENMY grabs your wrists but you pull away!" +KDTeaseAttack_Disarm,The ENMY pulls your weapon away! +KDTeaseAttackResist_Disarm,The ENMY tries to pull your weapon away but you maintain your grip! +KDTeaseAttackResist_Pickpocket,The ENMY reaches for your inventory but can't quite reach it! + + +KinkyDungeonStatMore_Armbinders,"More Armbinders" +KinkyDungeonStatDescMore_Armbinders,"Armbinders are favored over other heavy bondage." +KinkyDungeonStatLess_Armbinders,"Less Armbinders" +KinkyDungeonStatDescLess_Armbinders,"Armbinders are less favored over other heavy bondage." +KinkyDungeonStatMore_Boxbinders,"More Boxbinders" +KinkyDungeonStatDescMore_Boxbinders,"Boxbinders are favored over other heavy bondage." +KinkyDungeonStatLess_Boxbinders,"Less Boxbinders" +KinkyDungeonStatDescLess_Boxbinders,"Boxbinders are less favored over other heavy bondage." +KinkyDungeonStatMore_Jackets,"More Straitjackets" +KinkyDungeonStatDescMore_Jackets,"Straitjackets are favored over other heavy bondage." +KinkyDungeonStatLess_Jackets,"Less Straitjackets" +KinkyDungeonStatDescLess_Jackets,"Straitjackets are less favored over other heavy bondage." +KinkyDungeonStatMore_Yokes,"More Yokes" +KinkyDungeonStatDescMore_Yokes,"Yokes are favored over other heavy bondage." +KinkyDungeonStatLess_Yokes,"Less Yokes" +KinkyDungeonStatDescLess_Yokes,"Yokes are less favored over other heavy bondage." + + +ResistTypeBlock," (blocked!)" +ResistTypeDodge," (dodged!)" +ResistType,"" + +KDPetsuitCrawl,"You crouch and move slowly." + +KDChestTooltip,"Owned by: " + +RestraintWardenBelt,Warden's Belt +RestraintWardenBeltDesc,"You may go on your way, but only as long your freedom is useful to her." +RestraintWardenBeltDesc2,"A golden belt that enforces respect for the Goddesses. Breaking spell orbs results in a punishment." + +RestraintWardenBelt2,Belt of Privilege +RestraintWardenBelt2Desc,"You've defeated the Warden, proving that you are worthy to take what you want." +RestraintWardenBelt2Desc2,"A golden belt that marks you as a person of great import. -50% rep penalty for breaking orbs." + +NameWardenArcher,"Sharpshooter" +KillWardenArcher,"You teach the warden's servant a lesson." +AttackWardenArcherBind,"The sharpshooter pulls your arms behind your back! (+RestraintAdded)" +AttackWardenArcher,"The sharpshooter takes advantage of your weakness and squeezes your breast! (DamageTaken)" +AttackWardenArcherLock,"The sharpshooter smiles and clicks a lock on you! (DamageTaken)" + +NameWardenFighter,"Gladiator" +KillWardenFighter,"You teach the warden's servant a lesson." +AttackWardenFighterBind,"The gladiator puts you in a hold and binds you! (+RestraintAdded)" +AttackWardenFighter,"The gladiator chuckles as she spanks your butt! (DamageTaken)" +AttackWardenFighterLock,"The gladiator smiles and clicks a lock on you! (DamageTaken)" + +NameWardenMage,"Magician" +KillWardenMage,"You teach the warden's servant a lesson." +AttackWardenMageBind,"The magician conjures some restraints on you! (+RestraintAdded)" +AttackWardenMage,"The magician summons tickling hands to tease you! (DamageTaken)" +AttackWardenMageLock,"The magician conjures some locks on you! (DamageTaken)" + +NameTheWarden1,"The Warden" +KillTheWarden1,"The Warden disappears into a trapdoor!" +AttackTheWarden1Bind,"The Warden forces you to kneel, and presents you with a restraint! (+RestraintAdded)" +AttackTheWarden1,"The Warden whips you with a belt! (DamageTaken)" +AttackTheWarden1Lock,"The Warden tosses some enchanted locks at you! (DamageTaken)" + + +NameTheWarden2,"The Warden" +KillTheWarden2,"The Warden falls flat on the ground, exhausted!" +AttackTheWarden2Bind,"The Warden forces you to kneel, and presents you with a restraint! (+RestraintAdded)" +AttackTheWarden2,"The Warden strikes you with her whip! (DamageTaken)" +AttackTheWarden2Lock,"The Warden swings her enchanted whip and conjures locks on your body! (DamageTaken)" + + + + + + +rTheWarden,"(The Warden glances at you)|Oh? What do we have here?|An adventurer?|You're not in my records..." +dTheWarden_Aggressive,"Cut to the chase. Do I have to fight you or not?" +dTheWarden_AggressiveGag,"(Growl at her)" +rTheWardenAggressive,"(She chuckles)|Oh my~|I hope your skills are on the same level as your attitude.|I don't have time for mere troublemakers~" +dTheWardenAggressive_Question,Quite a boast for someone who's about to lose. +rTheWardenAggressive_Question,"(SPEAKER grins)|I look forward to testing those claims~" +dTheWardenAggressive_Question_Brat,I defeated Fuuka. Now you're next! +rTheWardenAggressive_Question_Brat,"(SPEAKER shrugs)|You beat that zombie girl?|She's the weakest of the paladins.|She loves to boast about how she's special,|But she's really just a spoiled brat." +dTheWardenAggressive_Question_Brat_Question,"...Zombie girl?" +rTheWardenAggressive_Question_Brat_Question,"(SPEAKER tilts her head)|Yes, she was around before Vinlaga.|Her magic was gifted to her by the Goddess,|it is only natural that it works on her too." +dTheWardenAggressive_Question_Brat_Question2,"...Paladins?" +rTheWardenAggressive_Question_Brat_Question2,"(SPEAKER nods happily)|Divinely-appointed judges, presiding over mortals.|Unlike you, our immortality is earned.|Myself, I captured many defilers long ago.|Is it not fitting that I get to keep them for myself?" +dTheWardenAggressive_Question_Brat_Proceed,"(...)" +dTheWardenAggressive_Question_Brat_Question_Proceed,"(...)" +dTheWardenAggressive_Question_Brat_Question2_Proceed,"(...)" +dTheWardenAggressive_Question_Proceed,"(...)" +dTheWardenAggressive_Proceed,It is an honor to fight a worthy opponent. +dTheWardenAggressive_ProceedGag,Mmmmph. +rTheWardenAggressive_ProceedGag,"(SPEAKER giggles)|That gag suits you nicely~" +dTheWardenAggressive_ProceedGag_Proceed,"(...)" +rTheWardenAggressive_Brat,"(SPEAKER grins)|I look forward to it!" +dTheWardenAggressive_Brat,You will see soon enough. +dTheWardenAggressive_Brat_Proceed,"Indeed!" +dTheWardenAggressive_Brat_ProceedGag,"(...)" +dTheWardenAggressive_Brat_Proceed2,"(...)" +dTheWarden_Defensive,"What is this place?" +dTheWarden_DefensiveGag,"Mmmmm... (Blush)" +rTheWardenDefensive,"(She smiles)|Why, this is my private prison.|I bring only my prettiest toys to stay here with me.|You can see them up there.|(She motions to the north)" +dTheWardenDefensive_Question,Tell me about your collection +rTheWardenDefensive_Question,"(SPEAKER smiles pleasantly)|Its a fitting reward, isn't it?|Long ago, this mountain was home to a vicious empire.|Machines went out to sea, bringing back countless prisoners.|As commander of the invasion, I earned this title!" +rTheWardenDefensive_Question_Question,"(SPEAKER grins)|When we stormed the prisons, we encountered many fierce defenders.|Many of them now reside in these halls, earning their rightful punishment." +dTheWardenDefensive_Question_Question,"Who are the prisoners, anyway?" +rTheWardenDefensive_Question_Question2,"(SPEAKER folds her arms)|Is it not holy and just to bring down tyrants?" +dTheWardenDefensive_Question_Question2,"Why did the Goddesses intervene?" +rTheWardenDefensive_Question_Question_Question,"(SPEAKER shrugs)|Most of them had already been... conditioned.|It will take centuries to undo centuries of training.|After all, we have plenty of time." +dTheWardenDefensive_Question_Question_Question,"What about the former prisoners?" +rTheWardenDefensive_Question_Question_Question2,"(SPEAKER looks to the side)|The leader was nowhere to be found.|The coward fled deeper underground.|Her robot guardians protect her, to this day." +dTheWardenDefensive_Question_Question_Question2,"Can I see the leader of this old civilization?" +dTheWardenDefensive_Question_Question_Proceed,"(...)" +rTheWardenDefensive_Question_Question_Question_Question,"(SPEAKER smirks)|What's the point of going deeper?|The tyrant lost control of her petty empire.|Now the world is safe from her." +dTheWardenDefensive_Question_Question_Question_Question,"So you stopped at the upper floors?" +rTheWardenDefensive_Question_Question_Question_Question2,"(SPEAKER frowns)|Absolutely not.|They are under my strict supervision." +dTheWardenDefensive_Question_Question_Question_Question2,"Can I talk to the former prisoners?" +rTheWardenDefensive_Question_Question_Question_Question3,"(SPEAKER grins)|Very funny.|I heard rumors of an up-and-coming adventurer stirring up trouble.|It seems my intuitions were correct." +dTheWardenDefensive_Question_Question_Question_Question3,"I hope you don't mind me looting the lower levels~" +rTheWardenDefensive_Question_Question_Question_Question_Question,"(SPEAKER grins)|Oh please.|Only this era's finest warriors can be part of my collection~|My subordinates take care of the rest." +dTheWardenDefensive_Question_Question_Question_Question_Question,"Sounds like you have an impressive collection" +rTheWardenDefensive_Question_Question_Question_Question_Question2,"(SPEAKER frowns)|It's easy to take for granted the peace you didn't work for." +dTheWardenDefensive_Question_Question_Question_Question_Question2,"Must be comfy living up here then" +rTheWardenDefensive_Question_Question_Question_Question_Question_Question,"(SPEAKER scoffs at you)|Adventurers are always like this.|Ever since your kind started prying,|I've had no choice but to enact my own kind of discipline~" +dTheWardenDefensive_Question_Question_Question_Question_Question_Question,"What makes you any better than the old rulers?" +rTheWardenDefensive_Question_Question_Question_Question_Question_Question2,"(SPEAKER smirks at you)|If that were so, then perhaps it would be best not to pry...|Forbidden knowledge has its price, after all." +dTheWardenDefensive_Question_Question_Question_Question_Question_Question2,"It sounds like the gods are trying to hide something" +rTheWardenDefensive_Question_Question_Question_Question_Question_Question3,"(SPEAKER folds her arms)|And what makes you think an old myth would be relevant here?|Would the Archmagus herself lead a rebellion against the divine?" +dTheWardenDefensive_Question_Question_Question_Question_Question_Question3,"Was Sariel Vinlaga the leader of the old civilization?" +rTheWardenDefensive_Question_Question_Question_Question_Question_Question3_Question,"(SPEAKER frowns)|You don't trust me? That's too bad..." +dTheWardenDefensive_Question_Question_Question_Question_Question_Question3_Question,"It's the way you keep dodging questions." +rTheWardenDefensive_Question_Question_Question_Question_Question_Question3_Question2,"(SPEAKER scoffs)|I'd love to have a word with your sources~" +dTheWardenDefensive_Question_Question_Question_Question_Question_Question3_Question2,"I have it good authority that Vinlaga is here." +rTheWardenDefensive_Question_Question_Question_Question_Question_Question3_Question3,"(SPEAKER smirks)|Don't believe everything you hear~" +dTheWardenDefensive_Question_Question_Question_Question_Question_Question3_Question3,"Maybe you're right." +rTheWardenDefensive_Question_Question_Question_Question_Question_Question3_Question3_Proceed,"(SPEAKER pouts)|Old?|Grrr..." +dTheWardenDefensive_Question_Question_Question_Question_Question_Question3_Question3_Proceed,"Says an old woman under the mountain..." +dTheWardenDefensive_Question_Proceed,"(...)" +dTheWardenDefensive_Proceed,I am indeed an adventurer. +dTheWardenDefensive_ProceedGag,Mmmmph. +rTheWardenDefensive_ProceedGag,"(SPEAKER smiles)|Fascinating. Do keep explaining." +dTheWardenDefensive_ProceedGag_Proceed,"(...)" +rTheWardenDefensive_Brat,"(SPEAKER frowns)|That is not the attitude I appreciate from my guests." +dTheWardenDefensive_Brat,I forge my own path. +dTheWardenDefensive_Brat_Proceed,"Why should I listen to you?" +dTheWardenDefensive_Brat_ProceedGag,"(Pout)" +dTheWardenDefensive_Brat_Proceed2,"(...)" +dTheWarden_Brat,"That's a shame about your records, I'll be going now." +dTheWarden_BratGag,"Mmpphgh? (Go to pass her)" +rTheWardenBrat,"(She smirks)|Not so fast, dear~|You'll have to wear a special collar to pass." +dTheWardenBrat_Question,I won't wear anyone's collar! +rTheWardenBrat_Question,"(She smirks)|Tsk tsk. Then you won't pass." +rTheWardenBrat_Question_Collar,"(She giggles)|How cute!|You're so used to yours that you forgot about it~" +dTheWardenBrat_Question_Proceed,"(...)" +dTheWardenBrat_Proceed,Why don't you wear it yourself? +dTheWardenBrat_ProceedGag,Hmmph. (Scoff at her) +rTheWardenBrat_ProceedGag,"(She frowns)|Watch your tongue~" +dTheWardenBrat_ProceedGag_Proceed,"(Shake your head)" +rTheWardenBrat_Brat,"(She frowns)|I do not wear collars." +dTheWardenBrat_Brat,You'd be better off wearing mine instead. +dTheWardenBrat_Brat_Proceed,"You're missing out~" +dTheWardenBrat_Brat_ProceedGag,"(Giggle)" +dTheWardenBrat_Brat_Proceed2,"(...)" +dTheWarden_Dom,"This is a nice place you got here." +dTheWarden_DomGag,"(Admire the locale)" +rTheWardenDom,"(SPEAKER smiles and nods)|It has existed for a thousand years,|and it shall exist for another thousand.|No thanks, of course, to the adventurers who storm through here,|breaking the orbs as if it all belongs to them..." +dTheWardenDom_Question,What are these orbs for anyway? +rTheWardenDom_Question,"(SPEAKER looks puzzled)|You don't know? Surely you must be joking?" +rTheWardenDom_Question_Question,"(SPEAKER shrugs)|They are important because...|Wait, you're stalling for time, aren't you?" +dTheWardenDom_Question_Question,"I do not know." +dTheWardenDom_Question_Question_Proceed,"(Sigh)" +dTheWardenDom_Question_Proceed,"Of course I know..." +dTheWardenDom_Proceed,You can trust me. +dTheWardenDom_ProceedGag,Mmmph! (Nod eagerly) +rTheWardenDom_ProceedGag,"(SPEAKER laughs)|Do you think I will trust you just like that?" +dTheWardenDom_ProceedGag_Proceed,"(...)" +rTheWardenDom_Brat,"(SPEAKER frowns)|You do not know who you're dealing with.|I'll make sure to teach you a lesson." +dTheWardenDom_Brat,Why don't I make you wear it? +dTheWardenDom_BratGag,Hmmph. (Scoff into your gag) +dTheWardenDom_Brat_Proceed,"You can try~" +dTheWardenDom_Brat_ProceedGag,"(Giggle)" +dTheWardenDom_Brat_Proceed2,"(...)" +dTheWarden_Sub,"There must be a mistake. Sign me up!" +dTheWarden_SubGag,"Mmmpphh~ (Moan and wiggle seductively)" +rTheWardenSub,"(She smiles)|Eager are we?|I don't just record anyone though.|I only care about the strongest adventurers~" +dTheWardenSub_Question,I am the strongest. +rTheWardenSub_Question,"(SPEAKER chuckles)|Then why don't I test your skills?" +rTheWardenSub_Question_Question,"(SPEAKER grins)|How about trial by combat?" +dTheWardenSub_Question_Question,"A test? What kind?" +dTheWardenSub_Question_Question_Proceed,"...You're on!" +dTheWardenSub_Question_Proceed,"Let's do it!" +dTheWardenSub_Proceed,You will see how strong I am! +dTheWardenSub_ProceedGag,Mmmmph~ +rTheWardenSub_ProceedGag,"(SPEAKER giggles)|We'll see about that!" +dTheWardenSub_ProceedGag_Proceed,"(...)" +dTheWardenSub_Brat,"On second thought, maybe not..." +rTheWardenSub_Brat,"(SPEAKER giggles)|Not so confident, are we?" +dTheWardenSub_BratGag,(Give her a puzzled look and shake your head) +dTheWardenSub_Brat_Proceed,"I didn't think it would involve a test..." +dTheWardenSub_Brat_ProceedGag,"(Shake your head)" +dTheWardenSub_Brat_Proceed2,"(Sigh and shrug)" +dTheWarden_Attack,(Attack her without saying anything) + +rTheWardenPostIntro,"(SPEAKER readies her whip)|Allow me to introduce myself properly.|I am The Warden, divinely appointed judge and enforcer.|Those who enter this mountain do so under my watchful eye.|To ensure this, I have crafted a special collar.|It will ensure that you do not defile the holy places.|I can let you through if you accept it~" +dTheWardenPostIntro_Brat,"I will never be collared by you!" +dTheWardenPostIntro_BratGag,"(Shake your head and scoff)" +rTheWardenPostIntro_Brat,"(SPEAKER folds her arms)|So be it." +dTheWardenPostIntro_Zombie,"Tell me about your collection." +dTheWardenPostIntro_Dom,"I'm in charge of my own path." +dTheWardenPostIntro_DomGag,"Hmmph. (Stand proudly)" +rTheWardenPostIntro_Dom,"(SPEAKER grins)|Let's see how long you can keep up that attitude~" +dTheWardenPostIntro_Sub,"That won't be necessary, miss." +dTheWardenPostIntro_SubGag,"Mmph! (Shake your head)" +rTheWardenPostIntro_Sub,"(SPEAKER smiles)|Oh, it's quite necessary~|Why don't I show you?" +dTheWardenPostIntro_Normal,"I would rather fight you." +dTheWardenPostIntro_NormalGag,"(Fight her)" +rTheWardenPostIntro_Normal,"(SPEAKER shrugs)|Straight and to the point, eh?" + +dTheWardenFight_Fight1,"Ready yourself!" +dTheWardenFight_Fight1Gag,"Hmmmph!" +dTheWardenFight_Fight2,"Let's go!" +dTheWardenFight_Fight2Gag,"Mmmmmghh!" +dTheWardenFight_Fight3,"I guess I have no choice..." +dTheWardenFight_Fight3Gag,"Mmmmph..." + +rTheWardenLose,"(SPEAKER grins)|Very impressive.|You may have lost the battle, but you performed admirably~" +rTheWardenLoseAccept,"(SPEAKER smiles)|I will let you pass so long as you wear my collar.|(She snaps her fingers and conjures a glowing ring)" +rTheWardenLoseDeny,"(SPEAKER giggles)|Then your journey ends.|I assume you don't want that.|Now then, as for your collar~|(She snaps her fingers and conjures a glowing ring)" +rTheWardenLoseMagic,"(SPEAKER chuckles)|Of course it was magic~|Who said a commander had to be defenseless?|(She snaps her fingers and conjures a glowing ring)" +dTheWardenLose_Magic,"Was that magic?" +dTheWardenLose_Accept,"I've lost. Now what?" +dTheWardenLose_AcceptGag,"Mmmph. (Submit)" +dTheWardenLose_Deny,"I won't submit to you!" +dTheWardenLose_DenyGag,"Mmmph! (Struggle weakly)" +dTheWardenLose_Continue1,"(Sigh and accept your fate)" +dTheWardenLose_Continue2,"(Accept the collar eagerly)" +dTheWardenLose_Continue3,"(Accept the collar begrudgingly)" +rTheWardenLoseFinish,"(SPEAKER presents you with your collar...)|(It closes around your neck seamlessly)|Now... you'll be allowed to go free,|but only once you've been sufficiently trained." + +rTheWardenStage2,"(SPEAKER blocks you with a web of metal bars)|Very impressive!|But did you really think it would be that easy?" + +rTheWardenWin,"(SPEAKER crouches down)|Most impressive...|It is not often I lose to an adventurer...|I'd love to get my hands on you eventually~" +rTheWardenWinAccept,"(SPEAKER looks surprised)|I did not expect you to be so... compliant.|(She snaps your fingers and tosses you a glowing belt)|This is a special one, reserved for those with divine privilege.|You've earned it." +dTheWardenWin_Accept,"(Wear her belt anyway)" +rTheWardenWinGag,"(SPEAKER shakes her head as you force a gag into her mouth)|MMMMMPH!" +dTheWardenWin_Gag,"(Gag her)" + +KDDisarmFlag,"The ENMY weakens your grip on your weapon! Enemies may disarm you if you stand too close..." + + +dGenericAllyFlirt_LinkRequestArms,"Can you link my arm cuffs?" +dGenericAllyFlirt_LinkRequestArmsGag,"(Hold out your arm cuffs)" +rGenericAllyFlirt_LinkRequestArms,"(The SPEAKER smiles)|Why sure, sweetie, I can help you with that~" +rGenericAllyFlirt_LinkRequestArmsDom,"(The SPEAKER grins)|What a good girl!" +rGenericAllyFlirt_LinkRequestArmsSub,"(The SPEAKER blushes)|Those look like fun!" +rGenericAllyFlirt_LinkRequestArmsBrat,"(The SPEAKER smirks)|Sure thing~" +rGenericAllyFlirt_LinkRequestArmsRobot,"(The SPEAKER beeps)|+10 social credit" + +dGenericAllyFlirt_LinkRequestLegs,"Can you link my leg cuffs?" +dGenericAllyFlirt_LinkRequestLegsGag,"(Hold out your leg cuffs)" +rGenericAllyFlirt_LinkRequestLegs,"(The SPEAKER smiles)|Why sure, sweetie, I can help you with that~" +rGenericAllyFlirt_LinkRequestLegsDom,"(The SPEAKER grins)|What a good girl!" +rGenericAllyFlirt_LinkRequestLegsSub,"(The SPEAKER blushes)|Those look like fun!" +rGenericAllyFlirt_LinkRequestLegsBrat,"(The SPEAKER smirks)|Sure thing~" +rGenericAllyFlirt_LinkRequestLegsRobot,"(The SPEAKER beeps)|+10 social credit" + + +RestraintSunglasses,Sunglasses +RestraintSunglassesDesc,"Cool people wear these indoors." +RestraintSunglassesDesc2,"+25 holy resist. Reduces blind effects. Prevents blinding from light adjustment." +KinkyDungeonInventoryItemSunglasses,Sunglasses +KinkyDungeonInventoryItemSunglassesDesc,"Cool people wear these indoors." +KinkyDungeonInventoryItemSunglassesDesc2,"+25 holy resist. Reduces blind effects. Prevents blinding from light adjustment." +LootSunglasses,"You find a pair of stylish shades." + + +RestraintSunglasses2,Shades +RestraintSunglasses2Desc,"Cool people wear these indoors." +RestraintSunglasses2Desc2,"+25 holy resist. Reduces blind effects. Prevents blinding from light adjustment." +KinkyDungeonInventoryItemSunglasses2,Sunglasses +KinkyDungeonInventoryItemSunglasses2Desc,"Cool people wear these indoors." +KinkyDungeonInventoryItemSunglasses2Desc2,"+25 holy resist. Reduces blind effects. Prevents blinding from light adjustment." +LootSunglasses2,"You find a pair of stylish shades." + +KDBackgroundColor,Player Background Color + +KDBubbleBounce,An attack causes you to bounce... + +KinkyDungeonMagicBubble,You find yourself enveloped in a bubble! +KinkyDungeonMagicLatexSphere,"A sphere of latex coalesces around you, trapping you and inflating until tight!" +KinkyDungeonMagicLatexBall,"A sphere of latex coalesces around you, trapping you and sealing around your neck!" +KinkyDungeonMagicSlimeBubble,You find yourself enveloped in a slime bubble! + + +KDDamageBubble,"Your RestraintName pops with a loud bang!" +KDDamageModuleBubble,"Your RestraintName starts leaking air! Very, very slowly..." + +KDNoDamage,no damage + +NameAquaSlime,Aqua Slime +KillAquaSlime,"The aqua slime melts into a wet puddle." +AttackAquaSlime,"The aqua slime splashes against you! (DamageTaken)" +AttackAquaSlimeBind,"The aqua slime expands into a bubble and throws itself at you! (+RestraintAdded)" + +RestraintBubbleHead,Aqua Bubble (Head) +RestraintBubbleHeadDesc,A squishy bubble made of a gelatinous substance! +RestraintBubbleHeadDesc2,"You can pop it with a sharp enough edge, if you can get your tool in the position..." + +RestraintBubbleArms,Aqua Bubble (Arms) +RestraintBubbleArmsDesc,A squishy bubble made of a gelatinous substance! +RestraintBubbleArmsDesc2,"You can pop it with a sharp enough edge, if you can get your tool in the position..." + +RestraintBubbleLegs,Aqua Bubble (Legs) +RestraintBubbleLegsDesc,A squishy bubble made of a gelatinous substance! +RestraintBubbleLegsDesc2,"You can pop it with a sharp enough edge, if you can get your tool in the position..." + +KDBubbleCombine,The bubbles on you combine into one big bubble! + +KDStairsLocked,The stairs have been locked down for NMB more turns. + +curseInfoTightness,"Curse of Increasing Tightness: Your restraints get tighter over time." +curseInfoLethargy,"Curse of Lethargy: Reduce distraction over time, but miscast chance is increased by AMNT%." +curseInfoMute,"Curse of Mute: You cannot converse, and verbal spells cost AMNT% more mana." +curseInfoClumsy,"Curse of Clumsiness: After casting an arm spell, you drop your currently held weapon." +curseInfoDeflection,"Curse of Deflection: 50% chance for an attack to be redirected against an adjacent hostile target." + +KDItemMode,"Loot Recovery:" + +KinkyDungeonItemMode0,Enabled +KinkyDungeonItemMode1,Disabled +KinkyDungeonItemMode2,Partial +KinkyDungeonItemModeDesc0,You recover important items when you advance floors. +KinkyDungeonItemModeDesc1,"Once items are lost, they are gone for good." +KinkyDungeonItemModeDesc2,"Each item has a 25% chance of appearing in the chest between floors." +LootCacheLostClothes,You find a familiar adventuring outfit! + + +KDManaStationDrain1,"You feel energy flow out of you, activating the floor below!" +KDManaStationDrain2,"You feel energy flow out of you, lighting up a circle on the floor!" +KDManaStationFail,"The floor beneath you drains your mana, but you don't have enough to satisfy it." +KDManaStationCharged,"The ground beneath you glows with magical energy!" + +KDEffectTileTooltipRadiance,"Radiant Light" +KDEffectTileTooltipRadianceDesc,"Banishment of the shadow." +KDEffectTileTooltipShadow,"Living Shadow" +KDEffectTileTooltipShadowDesc,"Engulfs the tile in darkness." + +KDEffectTileTooltipTeleportPlate,"Planar Focus" +KDEffectTileTooltipTeleportPlateDesc,"Absorbs teleportation energies." + +KDEffectTileTooltipNoTeleportPlate,"Planar Diffractor" +KDEffectTileTooltipNoTeleportPlateDesc,"Diffuses teleportation energies." + +KDEffectTileTooltipTeleportPlateMana,"Planar Focusing Crystal" +KDEffectTileTooltipTeleportPlateManaDesc,"Amplifies teleportation energies." + +KDEffectTileTooltipManaEmpty,"Mysterious Plate" +KDEffectTileTooltipManaEmptyDesc,"What could it be?" +KDEffectTileTooltipManaPartial,"Mana-Charged Plate" +KDEffectTileTooltipManaPartialDesc,"It seems like it needs more power..." +KDEffectTileTooltipManaFull,"Mana-Charged Plate" +KDEffectTileTooltipManaFullDesc,"It's giving off a strange energy!" + +KDEffectTileTooltipMotionLamp,"Glass Plate" +KDEffectTileTooltipMotionLampDesc,"Looks like it has lighting elements inside." + +KDEffectTileTooltipSpikeTrap,"???" +KDEffectTileTooltipSpikeTrapDesc,"???" +KDEffectTileTooltipSpikeTrapSeen,"???" +KDEffectTileTooltipSpikeTrapSeenDesc,"???" + +KinkyDungeonSpellOneBarMissileBind,Many bars come out of the ground and restrain you! +KinkyDungeonSpellOneBarMissile,One Bar Missile +KinkyDungeonSpellRestrainingBolt,Restraining Bolt +KinkyDungeonSpellSealingBolt,Sealing Bolt +KinkyDungeonSpellMagicMissile,Bondage Blast +KinkyDungeonSpellMagicMissile2,Magic Missile +KinkyDungeonSpellWardenCage,Warden's Cage + +NameOneBar,Restricting Bars +KillOneBar,The bars retract into the ground. + +NameFuukaPillar,Sealing Pillar +KillFuukaPillar,"The pillar collapses, causing zombies to rise up!" + +KinkyDungeonStatNoHelp,"Safeword Please" +KinkyDungeonStatDescNoHelp,"Allies don't help you unless you ask first." +KinkyDungeonStatLivingCollars,"Living Collars" +KinkyDungeonStatDescLivingCollars,"When you get jailed, you may get a living collar that applies further restraints on you." + + + +KDWardenCage,The Warden's cage falls atop you and attaches to the floor with a click. + +KDRestrainingBoltHit,The restraining bolt emits binding energies! +KDRestrainingBoltKnockback,The restraining bolt flashes and pushes you backward! +KDRestrainingBoltBind,The restraining bolt transforms into cuffs on impact! +KDRestrainingBoltPin,The restraining bolt pins your cuffs to the wall! + +KDMagicMissileHit,The spell explodes into restraining energy! +KDMagicMissileStun,The spell explodes and stuns you! +KDMagicMissileBind,The spell congeals into restraints! + +KinkyDungeonSpellCastMagicMissileChannel,The mage starts channeling her energy! + + +RestraintWardenArmCuffs,Warden Cuffs +RestraintWardenArmCuffsDesc,"A pair of cuffs that make it easy to restrain you." +RestraintWardenArmCuffsDesc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonLinkWardenArmCuffs,"The enemy attaches your wrist cuffs together!" + +RestraintWardenArmCuffs2,Wrist Chain +RestraintWardenArmCuffs2Desc,"A pair of cuffs keeping your arms behind your back." +RestraintWardenArmCuffs2Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonUnLinkWardenArmCuffs2,"Your cuffs detatch!" +KinkyDungeonLinkWardenArmCuffs2,"The enemy attaches your elbow cuffs together!" + +RestraintWardenArmCuffs3,Cuffs Chain +RestraintWardenArmCuffs3Desc,"A full set of cuffs keeping your arms in a strict elbow tie!" +RestraintWardenArmCuffs3Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonUnLinkWardenArmCuffs3,"Your wrists detatch, leaving your elbows still bound!" + +RestraintWardenArmCuffs4,Elbow Chain +RestraintWardenArmCuffs4Desc,"A pair of cuffs keeping your elbows locked together!" +RestraintWardenArmCuffs4Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonUnLinkWardenArmCuffs4,"Your elbows detatch!" +KinkyDungeonLinkWardenArmCuffs4,"The enemy attaches your wrist cuffs back together!" + +RestraintWardenLegCuffs,Warden Leg Cuffs +RestraintWardenLegCuffsDesc,"A pair of cuffs on your legs." +RestraintWardenLegCuffsDesc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonLinkWardenLegCuffs,"The enemy attaches your leg cuffs together!" +RestraintWardenLegCuffs2,Thigh Chain +RestraintWardenLegCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintWardenLegCuffs2Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonUnLinkWardenLegCuffs2,"The leg cuff chain detaches!" + +RestraintWardenAnkleCuffs,Warden Ankle Cuffs +RestraintWardenAnkleCuffsDesc,"A pair of cuffs on your ankles." +RestraintWardenAnkleCuffsDesc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonLinkWardenAnkleCuffs,"The enemy attaches your ankle cuffs together!" +RestraintWardenAnkleCuffs2,Ankle Chain +RestraintWardenAnkleCuffs2Desc,"A pair of cuffs chaining your legs together." +RestraintWardenAnkleCuffs2Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonUnLinkWardenAnkleCuffs2,"The ankle cuff chain detaches!" +KinkyDungeonLinkWardenAnkleCuffs2,"Your ankle cuff chain is tightened and pulls your feet together!" +RestraintWardenAnkleCuffs3,Short Ankle Chain +RestraintWardenAnkleCuffs3Desc,"A pair of cuffs chaining your feet tightly together." +RestraintWardenAnkleCuffs3Desc2,"They feel like they aren't even there, but the material is rigid and unyielding." +KinkyDungeonUnLinkWardenAnkleCuffs3,"Your ankle cuff chain loosens!" + + +KinkyDungeonTaunted,"Your buttons have been pushed, and not in a pleasant way!" +KinkyDungeonBuffTaunted,"Defeat all taunting enemies or stay within the tiles to avoid shame!" +KinkyDungeonSpellTaunt,Degradating Taunts +KDTauntPunishment,You failed to come up with a proper comeback! + +KDSleetDmg,The zone of frost damages you as you are chilled! +KDNavMapConfirm,Confirm Path + + +KDNavMap,Navigation Map +KDNavMap_Info,Choose a path to take by clicking on a highlighted room. +KDNavMap_Info2,Other paths will become inaccessible. +KDNavMap_Floor,Floor NMB +KDNavMap_Tileset,"Tileset:" +KDNavMap_MapMod,"Map Modifier:" +KDNavMap_RoomType,"Layout:" +KDNavMap_Faction,"Controlling Faction:" +KDNavMap_EscapeMethod,"Main Objective:" +KDNavMap_SideRooms,"Points of Interest:" + +KDSideRoom_Lair_Witch,"Magical Study" +KDSideRoom_Lair_Hall,"Maintenance Hall" +KDSideRoom_GoldChest,"Ancient Chest" +KDSideRoom_ElevatorRoom,"Elevator Hall" +KDSideRoom_ElevatorEgyptian,"Dark Passageway" +KDSideRoom_ElevatorEgyptian2,"Dark Passageway" +KDSideRoom_Caldera,"Caldera Passage" +KDSideRoom_GoldVault,"Ancient Vault" +KDSideRoom_AuctionHall,"Auction Hall" +KDSideRoom_DemonShrine,"Dark Altar" +KDSideRoom_BanditFort,"Bandit Hideout" +KDSideRoom_DemonTransition,"Dimensional Rift" +KDSideRoom_DragonCave,"Hoard" +KDSideRoom_DragonLair,"Dragon's Lair" + +KDMapMod_,"None" +KDMapMod_None,"None" +KDMapMod_Witch,"Witch's Lair" +KDMapMod_Mold,"Mold Infestation" +KDMapMod_Bandit,"Bandit Raid" +KDMapMod_Dragon,"Dragon Sighting" +KDMapMod_Plant,"Overgrown" +KDMapMod_Slime,"Slime Infestation" +KDMapMod_Wolf,"Wolfgirl Training" +KDMapMod_Robot,"Drone Patrol" + +KDRoomType_,"Normal" +KDRoomType_ShopStart,"Shop" +KDRoomType_Chamber,"Chamber" +KDRoomType_Warden,"Prison" +KDRoomType_Dollmaker,"Sorting Room" +KDRoomType_Jail,"Prison" +KDRoomType_DragonLair,"Lair" + +KDHotbarTutorial,"Click a hotbar slot to assign the current item to it.|You can click the swap button on the right|to switch between your five hotbars.||You can also save and load presets for your hotbar.|These are shared between runs." + +KDUseFootAffinity,You step on the item and tug to pull it taut... +KDUseTugAffinity,"You tug furiously against the leash, pulling it taut!" + +DungeonNamesilenthill,Silenced Hall + +KDWaterIsWet,The waist-deep water slows you! + + +RestraintSarielPanties,Sariel Vinlaga's Panties +RestraintSarielPantiesDesc,"Legend has it that these were worn by the legendary archmagus herself." +RestraintSarielPantiesDesc2,"If you keep them in your mouth, your verbal spells have -50% miscast chance. +10% spell damage." +KinkyDungeonInventoryItemSarielPanties,Sariel Vinlaga's Panties +KinkyDungeonInventoryItemSarielPantiesDesc,"Legend has it that these were worn by the legendary archmagus herself." +KinkyDungeonInventoryItemSarielPantiesDesc2,"If you keep them in your mouth, your verbal spells have -50% miscast chance. +10% spell damage." +LootSarielPanties,"You find a pair of black panties with pink trim, scrunched up in a ball." + + +RestraintElvenPanties,Elven Panties +RestraintElvenPantiesDesc,"In faraway lands, they often say that less is more..." +RestraintElvenPantiesDesc2,"+11% sprint efficiency" +KinkyDungeonInventoryItemElvenPanties,Elven Panties +KinkyDungeonInventoryItemElvenPantiesDesc,"In faraway lands, they often say that less is more..." +KinkyDungeonInventoryItemElvenPantiesDesc2,"+11% sprint efficiency" +LootElvenPanties,"You find a pair of elven panties." + + + +RestraintFluffothHood,Hood of Fluffoth +RestraintFluffothHoodDesc,"Worn by devotees to Fluffoth, demonic ruler of the plush abyss." +RestraintFluffothHoodDesc2,"When distraction reaches 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 40 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown." +KinkyDungeonInventoryItemFluffothHood,Hood of Fluffoth +KinkyDungeonInventoryItemFluffothHoodDesc,"Worn by devotees to Fluffoth, demonic ruler of the plush abyss." +KinkyDungeonInventoryItemFluffothHoodDesc2,"When distraction is over 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 30 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown." +LootFluffothHood,"You find a sinister hood made of soft plush." + + +RestraintEjahlLeotard,Ceremonial Leotard +RestraintEjahlLeotardDesc,"An article worn by the servants of state in the short-lived kingdom of Ejahl. Its locking mechanism and clothes-dissolving enchantments ensure the wearer understands her role as an extension of the state." +RestraintEjahlLeotardDesc2,"Its soul crystals harden the mind and dampen changes in willpower, reducing all willpower changes by 25%." +KinkyDungeonInventoryItemEjahlLeotard,Ceremonial Leotard +KinkyDungeonInventoryItemEjahlLeotardDesc,"An article worn by the servants of state in the short-lived kingdom of Ejahl. Its locking mechanism and clothes-dissolving enchantments ensure the wearer understands her role as an extension of the state." +KinkyDungeonInventoryItemEjahlLeotardDesc2,"Its soul crystals harden the mind and dampen changes in willpower, reducing all willpower changes by 25%." +LootEjahlLeotard,"You find a ceremonial leotard." + + +RestraintRobeOfChastity,The Robe of Chastity +RestraintRobeOfChastityDesc,"A magical leotard whose power infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it." +RestraintRobeOfChastityDesc2,"It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire." +KinkyDungeonInventoryItemRobeOfChastity,The Robe of Chastity +KinkyDungeonInventoryItemRobeOfChastityDesc,"A magical leotard infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it." +KinkyDungeonInventoryItemRobeOfChastityDesc2,"It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire." +LootRobeOfChastity,"You retrieve an interesting article dubbed 'the Robe of Chastity." + +KDTook,"Took " + +rDragonQueenCrystal,"(As you slay the dragon, it begins shapeshifting into human form!)" +rDragonQueenPoison,"(As you slay the dragon, it begins shapeshifting into human form!)" +rDragonQueenIce,"(As you slay the dragon, it begins shapeshifting into human form!)" +rDragonQueenShadow,"(As you slay the dragon, it begins shapeshifting into human form!)" + +NameDragonQueenCrystal,Crystal Dragon Queen +KillDragonQueenCrystal,The crystal dragon shapeshifts back to human form! +AttackDragonQueenCrystal,The crystal dragon strikes you with its claws! (DamageTaken) +AttackDragonQueenCrystalBind,"The crystal dragon breaths a sparkling dust, which hardens into crystal! (+RestraintAdded)" +AttackDragonQueenCrystalDash,"The crystal dragon takes flight and swoops toward you!" +AttackDragonQueenCrystalStun,"The crystal dragon takes flight and slams into you! (Stunned!)" +NameDragonGirlCrystal,Crystal Dragon Girl +KillDragonGirlCrystal,The dragon girl submits to you! +AttackDragonGirlCrystal,The dragon girl slams you with several hurled crystals! (DamageTaken) +AttackDragonGirlCrystalBind,"The dragon girl conjures a cloud of crystals that solidify! (+RestraintAdded)" +AttackDragonGirlCrystalLock,"The dragon girl conjures crystalline locks on you! (+RestraintAdded)" + + +NameDragonQueenPoison,Poison Dragon Queen +KillDragonQueenPoison,The poison dragon shapeshifts back to human form! +AttackDragonQueenPoison,The poison dragon strikes you with its claws! (DamageTaken) +AttackDragonQueenPoisonBind,"The poison dragon extends many vines from its wings! (+RestraintAdded)" +AttackDragonQueenPoisonDash,"The poison dragon takes flight and swoops toward you!" +AttackDragonQueenPoisonStun,"The poison dragon takes flight and slams into you! (Stunned!)" +NameDragonGirlPoison,Poison Dragon Girl +KillDragonGirlPoison,The dragon girl submits to you! +AttackDragonGirlPoison,The dragon girl slashes you with her venomous nails! (DamageTaken) +AttackDragonGirlPoisonBind,"The dragon girl raises vines out of the ground to bind you! (+RestraintAdded)" +AttackDragonGirlPoisonLock,"The dragon girl holds you in place and locks your restraints! (+RestraintAdded)" + + + +NameDragonQueenIce,Ice Dragon Queen +KillDragonQueenIce,The ice dragon shapeshifts back to human form! +AttackDragonQueenIce,The ice dragon strikes you with its claws! (DamageTaken) +AttackDragonQueenIceBind,"The ice dragon catches you in its icy breath! (+RestraintAdded)" +NameDragonGirlIce,Ice Dragon Girl +KillDragonGirlIce,The dragon girl submits to you! +AttackDragonGirlIce,The dragon girl slams you with several chunks of ice! (DamageTaken) +AttackDragonGirlIceBind,"The dragon girl splashes you with instantly freezing ice! (+RestraintAdded)" +AttackDragonGirlIceLock,"The dragon girl conjures magical locks on you! (+RestraintAdded)" + + + +NameDragonQueenShadow,Shadow Dragon Queen +KillDragonQueenShadow,The shadow dragon shapeshifts back to human form! +AttackDragonQueenShadow,The shadow dragon slashes directly at your mind! (DamageTaken) +AttackDragonQueenShadowBind,"The shadow dragon wraps itself around you many times! (+RestraintAdded)" +NameDragonGirlShadow,Shadow Dragon Girl +KillDragonGirlShadow,The dragon girl submits to you! +AttackDragonGirlShadow,The dragon girl stares into your eyes! (DamageTaken) +AttackDragonGirlShadowBind,"The dragon girl reaches out with a shadowy grip! (+RestraintAdded)" +AttackDragonGirlShadowLock,"The dragon girl reaches out and locks your restraints! (+RestraintAdded)" + + + +KDCageDrop,A cage falls from the ceiling on top of you! +KDCrystalEncase,Crystals grow across your body and encase you! +KDIceEncase,You are encased in a solid block of ice! +KDShadowEncase,A shadowy sphere rises from the ground and wraps over you tightly! +KDShadowBall,Shadows coalesce themselves around you in spherical form! + +RestraintCrystal,Crystal Encasement +RestraintCrystalDesc,"An overgrowth of magical crystals. Their chaotic energies flood into your mind and displace your thoughts!" +RestraintCrystalDesc2,"Being brittle, it will eventually crack and fail. Just keep wiggling..." +RestraintIceCrystal,Ice Encasement +RestraintIceCrystalDesc,"A huge ice cube. It's quite cold in there." +RestraintIceCrystalDesc2,"It will eventually melt! Eventually..." + +KDWardenMelt,The Warden's restraints release you... for now. + +RestraintChainHogtieLink,Chain Hogtie +RestraintChainHogtieLinkDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintChainHogtieLinkDesc2,"A metal chain holds your back in an arched position." + + +RestraintThighLink,Thigh Chain +RestraintThighLinkDesc,"A chain connecting your thigh cuffs together. You can still walk, albeit slower than usual." +RestraintThighLinkDesc2,It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. + + +RestraintAnkleLink,Ankle Chain +RestraintAnkleLinkDesc,"A chain connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual." +RestraintAnkleLinkDesc2,It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. +RestraintAnkleLinkShort,Ankle Chain (Short) +RestraintAnkleLinkShortDesc,"A short chain connecting your ankle cuffs together. You can barely separate your legs with this on." +RestraintAnkleLinkShortDesc2,It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. + +RestraintElbowLink,Elbow Chain +RestraintElbowLinkDesc,A very short chain connecting your elbow cuffs together. It is quite awkward to remove by yourself. +RestraintElbowLinkDesc2,It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. +RestraintWristLink,Wrist Chain +RestraintWristLinkDesc,A very short chain connecting your wrist cuffs together. +RestraintWristLinkDesc2,It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. + + +NameDragonVinePlant,Vine Pod +KillDragonVinePlant,"The vine pod explodes into dust!" +AttackDragonVinePlant,"The vine pod wraps you in vines and squeezes! (DamageTaken)" +AttackDragonVinePlantBind,"The vine pod launches several vines at you in quick succession! (+RestraintAdded)" + +NameDragonFlower,Sleep Flower +KillDragonFlower,"The sleep flower explodes into dust!" +AttackDragonFlower,"The sleep flower sprays pollen into your face! Achoo! (DamageTaken)" +AttackDragonFlowerBind,"The sleep flower launches several vines at you in quick succession! (+RestraintAdded)" + +KinkyDungeonSummonMultiDragonVinePlant,Several vine pods sprout out of the ground! +KinkyDungeonSummonSingleDragonVinePlant,A vine pod sprouts out of the ground! +KinkyDungeonSummonMultiDragonFlower,Several flowers sprout out of the ground! +KinkyDungeonSummonSingleDragonFlower,A magical flower sprouts out of the ground! +KinkyDungeonSummonSingleIceWall,A wall of ice rises from the ground! +KinkyDungeonSummonMultiIceWall,A wall of ice rises from the ground! +KDPoisonBreath,The dragon's breath poisons you! +KDPoisonSlash,The dragon girl strikes you with poisonous razor leaves! +KDDragonFlowerSpores,The flower releases soporific spores! +KinkyDungeonSpellCastDragonFlowerSpores,The flower releases soporific spores! +KinkyDungeonSpellPoisonBreath,Poison Breath + +KDVineSuspend,Vines reach from the ceiling and lift you into the air! + +RestraintVineSuspension,Vine Suspension +RestraintVineSuspensionDesc,"Vines linked to your bindings that keep you suspended!" +RestraintVineSuspensionDesc2,"You are left dangling! Maybe if you swing hard enough you can tear the vines..." + +slimy_science_1.ogg,Darkstar Studios - Slimy Science +GENERIC-DOLLRACK.ogg,Kocaeli - Doll Storage +factory_ambient.ogg,Kocaeli - Factory +AAA.ogg,Kocaeli - AAA +DD.ogg,Kocaeli - DD +Ada18980_PlayingWithFire.ogg,Ada18980 - Playing with fire +Ada18980_SmokingIsBadForYou.ogg,Ada18980 - Smoking is bad for you +AREA1-GRAVEYARD.ogg,Kocaeli - Graveyard +AREA2-ANCIENTTOMBS.ogg,Kocaeli - Ancient Tombs +AREA4-MAGICLIBRARY.ogg,Kocaeli - Magic Library +black_cat.ogg,Kocaeli - Black Cat +black_cat_angry.ogg,Kocaeli - Black Cat 2 +AREA5-UNDERGROUNDJUNGLE.ogg,Kocaeli - Underground Jungle +UntitledRobot.ogg,Kocaeli - Untitled +AREA7-LOSTTEMPLE.ogg,Kocaeli - Lost Temple +AREA8-ORRERY.ogg,Kocaeli - Orrery +AREA9-BELLOWS.ogg,Kocaeli - Bellows +AREA10-WEEPINGGARDEN.ogg,Kocaeli - Orrery +AREA12-DOLLSTORAGE.ogg,Kocaeli - Rubber Facility +EDGEOFREALITY.ogg,Kocaeli - Edge of Reality +Shopping.ogg,Kocaeli - 1 + +NameIceWall,Icy Barrier +KilliceWall,The wall of ice shatters! + +KinkyDungeonSpellDragonIceBolt,Icy Breath +KinkyDungeonSpellEnemyWinterblast,Ice Orb +KinkyDungeonSpellCastIceBreathChannel,"The EnemyName breaths in deeply, causing the air around you to chill..." + +KinkyDungeonSpellShadowBubble,Shadow Bubble +KinkyDungeonSpellShadowBubbleBind,"The projectile explodes into tight shadow latex, stretching all across your body!" +KDDragonTeleport,The dragon dances through the shadows! + +KDBallsuitTip,"You tip over as you try to roll yourself! (oof!)" + +KinkyDungeonShadowDrain,"The shadowy energies surrounding you drain away your mana..." + +RestraintShadowBallSuit,Shadow Sphere +RestraintShadowBallSuitDesc,A giant shadow latex sphere that leaves you rolling around... +RestraintShadowBallSuitDesc2,"Your movement is severely hampered, limited to feeble wiggling..." + +KinkyDungeonSpellCastShadowShroud,Dark magics fill the air! +KinkyDungeonSpellCastShadowShroudGirl,Dark magics fill the air! + +RestraintShadowLatexGagCollar,Shadow Posture Collar +RestraintShadowLatexGagCollarDesc,"A strict collar that seals your mouth tightly." +RestraintShadowLatexGagCollarDesc2,"It is made of shadow latex, tougher to cut than normal latex." + +KDTeleportsBehindYou0,*scoffs* Amateur. +KDTeleportsBehindYou1,Nothing personal. +KDTeleportsBehindYou2,Not bad... you made me use 10% of my power. + +KDElevatorBroken,"It's a defunct elevator, likely from the Old Civilization." + +rElevator,"(The elevator beeps and roars to life)|(Its control panel displays a list of options)" +dElevator_0,(Go to floor 0) +dElevator_1,(Go to floor 1) +dElevator_2,(Go to floor 2) +dElevator_3,(Go to floor 3) +dElevator_4,(Go to floor 4) +dElevator_5,(Go to floor 5) +dElevator_6,(Go to floor 6) +dElevator_7,(Go to floor 7) +dElevator_8,(Go to floor 8) +dElevator_9,(Go to floor 9) +dElevator_10,(Go to floor 10) +dElevator_11,(Go to floor 11) +dElevator_12,(Go to floor 12) +dElevator_13,(Go to floor 13) +dElevator_14,(Go to floor 14) +dElevator_15,(Go to floor 15) +dElevator_16,(Go to floor 16) +dElevator_17,(Go to floor 17) +dElevator_18,(Go to floor 18) +dElevator_19,(Go to floor 19) +dElevator_20,(Go to floor 20) + +rOriel,"(The viewscreen depicts a face)|Why hello there adventurer! What brings you?" + +dOriel_WhoAreYouGag,"Hmmmphgm?" +rOrielWhoAreYouGag,"(The face giggles)|Sadly my language processing systems aren't that good.|Try removing your gag first?" +dOriel_WhoAreYou,"Who are you?" +rOrielWhoAreYou,"(The face smiles)|I am the Facility's vessel, of course!|Sariel called me Oriel, but I don't see her much these days..." + +dOriel_GoddessGag,"Gffmmphmm?" +rOrielGoddessGag,"(Oriel smiles)|Ah, it's you again!|It seems like you've found a new toy as well?|I can't understand you, silly~" +dOriel_Goddess,"Oriel? As in the goddess of technology?" +rOrielGoddess,"'Goddess'? That seems like an outdated term.|Regardless, I am only a vessel, not the facility itself." + +dOriel_ControlGag,"Mmmph?" +rOrielControlGag,"(Oriel giggles)|Sweetie, I can't understand you." +dOriel_Control,"Can you control the facility?" +rOrielControl,"(Oriel frowns)|Adventurers seem to keep asking me that.|In my current state I don't have control over much at all.|But I'm always here to talk!" + +dOriel_ElevatorGag,"Mmmph!" +rOrielElevatorGag,"(Oriel giggles)|Sweetie, I can't understand you." +dOriel_Elevator,"Can you turn on the elevator?" +rOrielElevator,"I'm sorry, adventurer. I can't do that.|But maybe if you can get rid of all the nearby threats...|They've been under lockdown for a long time.|Just push the button again if it hasn't updated yet." + +dOriel_HelpGag,"Mmmph mmm! (Help me!)" +rOrielHelpGag,"(Oriel chuckles)|What was that again?|Sorry~" +dOriel_Help,"Can you help me out?" +rOrielHelp,"(Oriel giggles)|I can't do anything for you right now~" + +dOriel_HelloGag,"Mmmmm..." +rOrielHelloGag,"(Oriel smiles)|It's always fun to see you like that~" +dOriel_Hello,"How are you doing?" +rOrielHello,"(Oriel smiles)|Good!|I miss Sariel, though..." + +KDPersonalizedRoom,RMNME of CHTRNME the ENMYNME + +KDItemsTightness,"The item is TTT, and will get looser as you progress." + +KDTightness0,somewhat tight +KDTightness2,rather tight +KDTightness4,quite tight +KDTightness6,especially tight +KDTightness8,extremely tight +KDTightness10,incredibly tight + +KDTightnessSecure0,somewhat secure +KDTightnessSecure2,secure +KDTightnessSecure4,quite secure +KDTightnessSecure6,highly secure +KDTightnessSecure8,extremely secure +KDTightnessSecure10,incredibly secure + +KDTightnessThick0,somewhat thick +KDTightnessThick2,rather thick +KDTightnessThick4,quite thick +KDTightnessThick6,highly thick +KDTightnessThick8,extremely thick +KDTightnessThick10,incredibly thick + +KDNeedQuestFirst,You must first accept the quest before offering at the shrine. + +KinkyDungeonSpellZeroResistance,"Zero Resistance" +KinkyDungeonSpellDescriptionZeroResistance,"Toggle this to set bondage resist, evasion, and block to 0. While enabled, using the 'wait until interrupted' button will not be interrupted when hit or bound." + +KDTightnessFade,The RSTRT feels a little looser! + +RestraintCrystalArmbinder,Crystal Armbinder +RestraintCrystalArmbinderDesc,"A growth of crystals fusing your arms together. Chaotic energies radiate in all directions, causing you to slowly lose control over your desires." +RestraintCrystalArmbinderDesc2,"Crystals are tough but not unbreakable." + +RestraintCrystalBallGag,Crystal Ball Gag +RestraintCrystalBallGagDesc,"A growth of crystals inside your mouth. It emits a strange, pleasurable sensation." +RestraintCrystalBallGagDesc2,"Crystals are tough but not unbreakable." + +RestraintCrystalGagNecklace,Crystal Gag Necklace +RestraintCrystalGagNecklaceDesc,"An arousing accessory made of solid crystal!" +RestraintCrystalGagNecklaceDesc2,"Simply popping it out of your mouth isn't enough to negate its effects entirely~" + + + +KinkyDungeonCurseInfoSpellLock1,"The lock is protected by a seal of repentance. To unlock it you must pay 1 spell point." +KinkyDungeonCurseStruggleSpellLock1,"The restraint won't budge." +KinkyDungeonCurseUnlockSpellLock1,"You perform a ritual to unlock the item!" + + +KinkyDungeonCurseInfoSpellLock8,"The lock is protected by a seal of repentance. To unlock it you must pay AMNT spell points!" +KinkyDungeonCurseStruggleSpellLock8,"The restraint won't budge." +KinkyDungeonCurseUnlockSpellLock8,"You perform a grand ritual to unlock the item!" + + +RestraintWardenThighLink,Warden's Thigh Chain +RestraintWardenThighLinkDesc,"A chain connecting your thigh cuffs together. You can still walk, albeit slower than usual." +RestraintWardenThighLinkDesc2,You've stolen something of great value. Now you must give it back. + +RestraintWardenAnkleLink,Warden's Ankle Chain +RestraintWardenAnkleLinkDesc,"A chain connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual." +RestraintWardenAnkleLinkDesc2,You've stolen something of great value. Now you must give it back. +RestraintWardenAnkleLinkShort,Warden's Ankle Link +RestraintWardenAnkleLinkShortDesc,"A short chain connecting your ankle cuffs together. You can barely separate your legs with this on." +RestraintWardenAnkleLinkShortDesc2,"An intense, albeit temporary punishment for breaking the rules." + +RestraintWardenElbowLink,Warden's Elbow Chain +RestraintWardenElbowLinkDesc,A very short chain connecting your elbow cuffs together. It is quite awkward to remove by yourself. +RestraintWardenElbowLinkDesc2,You've stolen something of great value. Now you must give it back. +RestraintWardenWristLink,Warden's Wrist Chain +RestraintWardenWristLinkDesc,A very short chain connecting your wrist cuffs together. +RestraintWardenWristLinkDesc2,"An intense, albeit temporary punishment for breaking the rules." + + +KDItemDifficulty,ESCP Difficulty: AMNT +KDItemStruggleStruggle,ESCP Power: AMNT +KDItemStruggleRemove,ESCP Power: AMNT +KDItemStrugglePick,ESCP Ability: AMNT +KDItemStruggleUnlock,ESCP Ability: AMNT +KDItemStruggleCut,Max ESCP Depth: AMNT% + +KDEscapeStruggle,Struggle +KDEscapeRemove,Remove +KDEscapeUnlock,Unlock +KDEscapePick,Pick +KDEscapeCut,Cut + +KDQuakeCollar,"Your collar channels the vigor of excitement into magical energy!" +KDQuakeCollarFail,"The collar has already squeezed what it can out of you. Clear your mind first!" + +NameForceFieldGuardian,Force Field Projector +KillForceFieldGuardian,"The forcefield erupts into a shower of blue sparks!" +KinkyDungeonSummonSingleForceFieldGuardian,"The guardian deploys a forcefield!" +KinkyDungeonSummonMultiForceFieldGuardian,"The guardian deploys a set of forcefields!" + +NameDroneGuardian,Guardian Drone +KillDroneGuardian,"The drone fizzles and falls to the ground!" +AttackDroneGuardianStun,"The drone zaps you with a restraining energy ray! (DamageTaken)" +AttackDroneGuardian,"The drone uses a short-ranged electric attack! (DamageTaken)" +AttackDroneGuardianBind,"The drone attaches to you! (+RestraintAdded)" + +NameCyborgGuardian,Cyber Guardian +KillCyborgGuardian,"The cyber warden's suit goes into lockdown, leaving her wiggling helplessly!" +AttackCyborgGuardianLock,"The cyber warden applies an advanced locking technology!" +AttackCyborgGuardianBind,"The cyber warden grabs you and applies a self-tightening restraint! (+RestraintAdded)" +AttackCyborgGuardian,"The cyber warden's touch applies a series of quick electrical shocks! (DamageTaken)" +AttackCyborgGuardianStun,"The cyber warden's touch applies a series of quick electrical shocks!" + +NameEnforcerBotGuardian,Auto Enforcer Guardian +KillEnforcerBotGuardian,"The enforcer unit releases magic smoke and explodes." +AttackEnforcerBotGuardian,"The enforcer unit fires many cables that squeeze you! (DamageTaken)" +AttackEnforcerBotGuardianBind,"The enforcer fires off restraints that wrap around your body and apprehend you! (+RestraintAdded)" +AttackEnforcerBotGuardianLock,"The enforcer releases small drones which lock onto your restraints! (DamageTaken)" + + + + + +KDDollStorageDial_UniformAdd,"Time to get you into your uniform~" +KDDollStorageDial_UniformRemove,"You won't be needing any of this." +KDDollStorageDial_UniformDone,"There we go, all ready for training!" + +RestraintFutureBox,Cyber Storage +RestraintFutureBoxDesc,"An all-purpose metal crate equipped with a polycarbonate blast door and steel reinforcement." +RestraintFutureBoxDesc2,"Used throughout the reign of the Old Civilization to store slaves and prisoners." + + +KDLatexIntegration0,"The liquid latex sticks to your skin, forcing an airtight layer!" +KDLatexIntegration1,"The latex starts to build up layers, forcing a protective coating..." +KDLatexIntegration2,"The latex starts adhering to your skin, becoming extremely difficult to remove..." +KDLatexIntegration3,"The latex seals you in, rendering escape impossible without alchemical methods." +KDLatexIntegration4,"The liquid latex spray slows you down!" + +NameLatexSprayer,Latex Sprayer +KillLatexSprayer,"The turret deactivates after taking too much damage!" +AttackLatexSprayer,"The turret defends itself with a spray of sticky liquid latex! (DamageTaken)" + +KDLatexIntegrationDebuff0,"Your latex layer adheres to latex, making struggling more difficult!" +KDLatexIntegrationDebuff1,"The item sticks to your rubber layer, making it harder to pull off..." +KDLatexIntegrationDebuff2,"The item hugs your layer tightly, adhering firmly!" +KinkyDungeonBuffLatexIntegrationStat,"Your skin is covered in a layer of latex, making escape from cyber restraints harder!" + +KinkyDungeonStatExclusionsApply,"Some Exclusions Apply" +KinkyDungeonStatDescExclusionsApply,"Goddess shrines do not remove non-binding restraints such as harnesses and cuffs." + +KinkyDungeonStatMeleeSpec,"Melee Specialization" +KinkyDungeonStatDescMeleeSpec,"Gain 25% base physical damage, but your spells do 50% less damage." +KinkyDungeonStatWeaponExpert,"Melee Expert" +KinkyDungeonStatDescWeaponExpert,"Gain +20 Accuracy and +10% base physical damage." + +KinkyDungeonStatMagicSpec,"Magic Specialization" +KinkyDungeonStatDescMagicSpec,"Gain 25% spell damage, but your attacks are delayed by 1 turn when attacking." +KinkyDungeonStatMagicExpert,"Spell Expert" +KinkyDungeonStatDescMagicExpert,"Gain -10% miscast chance and +10% spell damage." + +KinkyDungeonStatRangedSpec,"Ranged Specialization" +KinkyDungeonStatDescRangedSpec,"You deal 20% more damage to enemies further than 2 tiles away, but enemies adjacent to you take 60% reduced damage." +KinkyDungeonStatRangedExpert,"Ranged Weapon Expert" +KinkyDungeonStatDescRangedExpert,"Bows, guns, and other projectile weapons do 10% more damage and consume 10% less charge." + + + +KDModifierCondition_OnElementalCast,"After casting a DMG spell:" +KDModifierEffect_ElementalBuff,"Gain AMNT% DMG Damage for DRTN turns" +KDModifierEffect_ElementalResist,"Gain AMNT DMG Resist for DRTN turns" +KinkyDungeonBuffElementalBuff,Your elemental damage is increased! +KinkyDungeonBuffElementalResist,Your elemental resistance is increased! + +KinkyDungeonShrineHeart,Overgrown + +KDStatBuy1,"The overgrown monolith contains an ancient blessing." +KDStatBuy2,"Choose a stat to increase below." + +KDStatBuyConfirm,"Confirm Choice" +KDStatBuyAP,Distraction +KDStatBuySP,Stamina +KDStatBuyMP,Mana +KDStatBuyWP,Willpower + +KDStatBuyAPDesc,Increase max distraction by AMNT%. +KDStatBuyAPDesc2,DP decays faster and more SP is safe from damage. +KDStatBuySPDesc,Increase max stamina by AMNT. +KDStatBuyMPDesc,Increase max mana by AMNT. +KDStatBuyWPDesc,Increase max willpower by AMNT. +KDStatBuyWPDesc2,Gain +AMNT SP regen/turn. + +KDStatBuyTemplate,AMNT1 -> AMNT2 +KDStatBuyMax,AMNT1 (max) + +KinkyDungeonHeartIntro,"You found a magical amulet! Choose one of the following to determine its benefits:" +KinkyDungeonHeartIntro1,"Focus: +50% max distraction and faster decay. +5% stamina protected from damage (base: 30%)." +KinkyDungeonHeartIntro2,"Stamina: +50 max stamina." +KinkyDungeonHeartIntro3,"Magic: +50 max mana." +KinkyDungeonHeartIntro4,"Willpower: +50 max willpower. +1 stamina regen/turn." + +KinkyDungeonObjectOrb,"A mystical orb stands before you." +KinkyDungeonObjectOrbBreak,"You break the orb and gain its secrets." + +KDStunResist,Stun Resistance! + +KinkyDungeonSpellNegateRune,Negate Rune +KinkyDungeonSpellDescriptionNegateRune,"Removes a rune on the target tile. If cast on self, removes all runes you've created instead. Casting on an enemy rune restores 10 mana instead." +KinkyDungeonSpellCastNegateRune,You scribe a negation rune! +KinkyDungeonSpellTargetNegateRune,"Target a single rune, or yourself to negate all your runes." +KDNegateRuneNoMana,You don't have enough mana +KDNegateRuneEnemy,The enemy rune is wiped clean. +KDNegateRuneFail,"You pour negation magic into the ground, but nothing happens." +KDNegateRuneSelf,All of your runes have been removed. + + +KinkyDungeonStatEstim,"E-Stimulation" +KinkyDungeonStatDescEstim,"Replaces most instances of painful electric shocks with stimulating effects instead." + +KDRobotEstim,The energy bolt hits you and sends stimulating energies through you! + +ItemPickupKeyCard,"You steal a key card." +KinkyDungeonInventoryItemKeyCard,Key Card +KinkyDungeonInventoryItemKeyCardUse,"The keycard's shiny surface reflects the light in a mesmerizing way." +KinkyDungeonInventoryItemKeyCardDesc,"A piece of identification that contains an access code." +KinkyDungeonInventoryItemKeyCardDesc2,"You can use it to unlock certain doors." +KDCyberHostileKeyCard,"Your keycard blinks red as the facility remotely locks it!" +KDLockout,"Your keycard blinks red as the facility remotely locks it! System Security: 100%" +KDLockoutTick,"Unauthorized removal detected. System Security: AMNT%" +KDLockoutTickEnd,"Security breach. Initiating remote lockout. System Security: AMNT%" + +ItemPickupFlashBomb,"You pick up a flash bomb." +ItemPickupFlashbang,"You pick up a flashbang grenade." + +KDLogFilterCombat,Combat +KDLogFilterAction,Actions +KDLogFilterSelf,Self +KDLogFilterDialogue,Dialogue +KDLogFilterAmbient,Ambient +KDLogFilterStruggle,Struggle +KDLogFilterItems,Items +KDLogFilterKills,Kills + +KDAttack,You attack TargetEnemy for DamageDealt total damage. +KDAttackBind,You attack TargetEnemy for DamageDealt damage / BondageDealt binding. +KDAttackMiss,You attack TargetEnemy but don't do any damage. +KDShoutHelp,ENMY calls for help! + +dElevator_Summit,(Go to The Summit) + +KDSummitIntro,The Summit is a safe area. Items can be left here without fear of losing them. + +KinkyDungeonSpellLeashSpell,Leash +KinkyDungeonSpellDescLeashSpell,"Target an NPC to attach a leash. Enemies and unwilling allies must be tied up to 50% first. Target self to release all leashes, or target a leashed NPC to unleash them." +KinkyDungeonSpellTargetLeashSpell,"Target an NPC to leash, or self to unleash all." + +KinkyDungeonSpellLeashSkill,Brat Handler +KinkyDungeonSpellDescriptionLeashSkill,"Target an NPC with an equipped leash restraint (via Truss'em'up) to attach a leash. Target self to release all leashes, or target a leashed NPC to unleash them." +KinkyDungeonSpellTargetLeashSkill,"Target an NPC to leash, or self to unleash all." + +KinkyDungeonInventoryItemLeashItem,Clip-On Leash +KinkyDungeonInventoryItemLeashItemDesc,"A beloved favorite of pets and trainers alike." +KinkyDungeonInventoryItemLeashItemUse,"You ready the leash..." +KinkyDungeonInventoryItemLeashItemDesc2,"Target an NPC to attach a leash. Enemies and unwilling allies must be tied up to 50% first. Target self to release all leashes, or target a leashed NPC to unleash them." +ItemPickupLeashItem,"You pick up a leash." + +KDLeashSpellCant,You are not in a condition to use a leash on her. +KDLeashSpellMustTie,She refuses to be leashed unless you tie her up! +KDLeashSpell,You attach a leash to ENMY. +KDLeashSpellRemove,You remove your leash from ENMY. +KDLeashSpellRemoveAll,You let go of all leashes. + + +KinkyDungeonInventoryItemC4,Plastic Explosive +KinkyDungeonInventoryItemC4Desc2,"Has a 60 turn timer, but can be detonated by other explosives. Deals 210 blast damage in a huge radius and leaves behind a huge field of rubble. Enemies hit have their armor reduced by 50 BEFORE taking damage." +KinkyDungeonInventoryItemC4Desc,"It's totally harmless! Probably." +KinkyDungeonInventoryItem2C4Desc2,"Has a 60 turn timer, but can be detonated by other explosives. Deals 210 blast damage in a huge radius and leaves behind a huge field of rubble. Enemies hit have their armor reduced by 50 BEFORE taking damage." +KinkyDungeonInventoryItem2C4Desc,"It's totally harmless! Probably." +KinkyDungeonInventoryItemC4Use,You set the clock ticking... + +KinkyDungeonInventoryItemDynamite,Dynamite +KinkyDungeonInventoryItemDynamiteDesc2,"10 turn fuse with a 25% chance each turn to detonate prematurely. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage." +KinkyDungeonInventoryItemDynamiteDesc,"Arguably more dangerous to the user than the target." +KinkyDungeonInventoryItem2DynamiteDesc2,"10 turn fuse with a 25% chance each turn to detonate. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage." +KinkyDungeonInventoryItem2DynamiteDesc,"Arguably more dangerous to the user than the target." +KinkyDungeonInventoryItemDynamiteUse,You light the fuse and pray it doesn't blow up in your face. + +KDTooManyLeashes,You are holding too many leashes! + +KDAddCorruption,You feel a corrupting influence... (+AMNT Corruption) +KDRemoveCorruption,You feel a restoring influence! (-AMNT Corruption) +KDAddLatexIntegration,Sticky latex fuses itself to your skin! (+AMNT LatexIntegration) +KDRemoveLatexIntegration,The latex starts to detach from your skin... (-AMNT Latex Integration) + +tut_AccuracyClose1,"While you have an evasion penalty, even clumsy enemies..." +tut_AccuracyClose2,"... will get an accuracy bonus against you in melee range." + +KinkyDungeonBuffCorruptionStat,You are more likely to succumb to curses. + +KDPropField_XOffset,X Offset +KDPropField_YOffset,Y Offset +KDPropField_XScale,X Scale +KDPropField_YScale,Y Scale +KDPropField_XPivot,X Pivot +KDPropField_YPivot,Y Pivot +KDPropField_Rotation,Rotation +KDPropField_LayerBonus,Layer Bonus +KDPropField_SuppressDynamic,NoDynamicArmor (0/1) +KDPropField_AddPose,AddPose +KDPropField_HideOverridden,HideOverridden (0/1) +KDPropField_NoOverride,NoOverride (0/1) +KDPropField_ExtraHidePoses,Hide Pose (e.g. Xray) +KDPropField_ExtraRequirePoses,Require Pose (e.g. ChestArmor) +KDPropField_ExtraHidePrefixPose,Hide Prefix (e.g Encase) +KDPropField_ExtraHidePrefixPoseSuffix,Hide Suffix (e.g TorsoUpper) +KDPropField_Protected,Protected +KDPropField_DisplaceAmount,Displace Amount +KDPropField_EraseAmount,Erase Amount + +KinkyDungeonLoadFromFile,Load from File +KinkyDungeonSaveToFile,Save to File + +KDLatexHelp1,Tip: Slime/Latex tiles only affect entities with less than 45 Glue Resist. +KDLatexHelp2,Being drenched in water also prevents slime/latex from sticking to you. +KDBedHelp,Use the interact tool in the bottom right HUD to sleep in a bed. + +KinkyDungeonStatClearVision,"Clear Vision" +KinkyDungeonStatDescClearVision,"Blindfolds are much rarer." +KinkyDungeonStatFreeBoob1,"Free the Boob" +KinkyDungeonStatDescFreeBoob1,"Chastity bras are rarer unless you are wearing nipple toys." +KinkyDungeonStatFreeBoob2,"Liberate the Boob" +KinkyDungeonStatDescFreeBoob2,"Chastity bras are much rarer." + +KDFacilitiesLocked,Find an elevator to the Summit in order to access facilities. +KDFacilityLocal,Visit the Summit to allow additional interactions with this facility. +KDFacilityLocal2,Must visit the Summit or be in a perk shrine to recycle restraints. + +KDFacilityInfo_Training,"+AMNT% Training/Tick" +KDFacilityInfo_Opinion,"+AMNT% Opinion/Tick" +KDFacilityInfo_Productivity,"+AMNT% Productivity" +KDFacilityInfo_Prisoners,"AMNT/MAXX Prisoners Assigned" +KDFacilityInfo_Servants,"AMNT/MAXX Servants Assigned" + +KDFacility_Management,Management +KDFacilityDesc_Management,"Assign servants as managers to boost the production of other facilities.|Appointing new management results in a loss of efficiency until the next cycle." +KDFacility_TrainingDojo,Bondage Dojo +KDFacilityDesc_TrainingDojo,"Assign servants to perfect the art of walking in heels,wearing tight corsets,|communicating while gagged, and overall flexibility." +KDFacility_RescueTeam,Rescue Operations +KDFacilityDesc_RescueTeam,"Assign servants to train squads of rescue maids, which you can call in times of need." +KDFacility_AlchemyLab,Alchemy Lab +KDFacilityDesc_AlchemyLab,"Assign servants to produce potions from base ingredients you acquire in your adventures." +KDFacility_Recycler,Recycler +KDFacilityDesc_Recycler,"Convert low tier restraints into raw materials and output higher quality restraints.|Adding more servants increase the conversion speed." +KDFacility_CuddleLounge,Cuddle Lounge +KDFacilityDesc_CuddleLounge,"Assign prisoners to the lounge in order to improve servant and prisoner opinion." +KDFacility_Warden,Warden +KDFacilityDesc_Warden,"Appoint a warden to keep prisoners in check and automatically bind using restraints from storage." + +KDRecycleButton,Recycle Restraints + +KDInventoryActionRecycle,Recycle One +KDInventoryActionRecycleBulk,Recycle ALL! +KDInventoryActionRecycleExcess,Recycle all but one + +KDRecycle,You recycle a ITM +KDRecycleBulk,You recycle #x ITM +KDRecycleExcess,You recycle #x ITM + +KDDisassembleExcess,You disassemble #x ITM into $x PRD +KDDisassemble,You disassemble #x ITM into $x PRD +KDInventoryActionDisassemble,Disassemble all but one +KDInventoryActionDisassembleOne,Disassemble one + +KDDialogue_StepAside,"You're blocking me." +KDDialogue_StepAsideBrat,"You're in my way!" +KDDialogue_StepAsideSub,"Miss, you're blocking me..." +KDDialogue_StepAsideDom,"Step aside~" +KDDialogue_StepAsideRobot,"Path blocked by citizen." +KDDialogue_StepAsideGagged,"*Bumps into you*" + + + +RestraintCyberHogtieLink,Cyber Hogtie Tether +RestraintCyberHogtieLinkDesc,"A very strict and tight hogtie, good for subduing unruly captives." +RestraintCyberHogtieLinkDesc2,It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. + + +RestraintCyberThighLink,Cyber Thigh Tether +RestraintCyberThighLinkDesc,"An energy tether connecting your thigh cuffs together. You can still walk, albeit slower than usual." +RestraintCyberThighLinkDesc2,It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. + + +RestraintCyberAnkleLink,Cyber Ankle Tether +RestraintCyberAnkleLinkDesc,"An energy tether connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual." +RestraintCyberAnkleLinkDesc2,It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. +RestraintCyberAnkleLinkShort,Ankle Chain (Short) +RestraintCyberAnkleLinkShortDesc,"A short energy tether connecting your ankle cuffs together. You can barely separate your legs with this on." +RestraintCyberAnkleLinkShortDesc2,It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. + +RestraintCyberElbowLink,Cyber Elbow Tether +RestraintCyberElbowLinkDesc,A very short energy tether connecting your elbow cuffs together. It is quite awkward to remove by yourself. +RestraintCyberElbowLinkDesc2,It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. +RestraintCyberWristLink,Cyber Wrist Tether +RestraintCyberWristLinkDesc,A very short energy tether connecting your wrist cuffs together. +RestraintCyberWristLinkDesc2,It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. + +KinkyDungeonSpellDesperateStruggle,Desperate Struggle +KinkyDungeonSpellDescriptionDesperateStruggle,"Spend 20 WP to shake around violently. Has a chance to loosen restraints you are wearing, based on existing struggle progress. Spreading the effect over multiple restraints reduces the chance of loosening.|Requires 25% or more WP to activate." +KDDesperateStruggle_NoRestraints,"None of your restraints will budge." +KDDesperateStruggle_Yes,"You thrash around with all your might." +KDDesperateStruggle_NoWill,"You don't have the willpower left to struggle..." + + +KDRecycleOutput_Rope,f +KDRecycleOutput_Latex,x +KDRecycleOutput_Leather,L +KDRecycleOutput_Metal,m +KDRecycleOutput_Rune,R + +KDOwned,Owned: AMNT + + +KDRecycleResource_Rope,Fiber +KDRecycleResource_Latex,Latex +KDRecycleResource_Leather,Leather +KDRecycleResource_Metal,Metal +KDRecycleResource_Rune,Runes + +RecycleResStrIntroRecycler_,"Stock: " +RecycleResStrIntroRecyclerInput_,"Inputs: " + +KDSummitSafeguard,"You slip off the conveyor!" +DungeonNameSummit,The Summit + +KDRestrainNPCBack,Back to Collection +KDRestrainNPC,Edit Restraints + +KDDrawSelectedTab_Restrain,Editing Restraints +KDDrawSelectedTab_Imprison,Imprison in Furniture +KDDrawSelectedTab_Dropoff,Dropoff Prisoner + +KDBindNPCSlot_ModuleUtility,Module (Utility) +KDBindNPCSlot_CollarTag,Leash +KDBindNPCSlot_ModulePunish,Module (Punishment) +KDBindNPCSlot_Collar,~~~ Collar ~~~ +KDBindNPCSlot_InnerHead,Blindfold / Earplugs +KDBindNPCSlot_InterHead,Blindfold +KDBindNPCSlot_OuterHead,Blindfold +KDBindNPCSlot_Hood,Mask/Hood +KDBindNPCSlot_InnerGag,Gag / Stuffing +KDBindNPCSlot_InterGag,Gag +KDBindNPCSlot_OuterGag,Flat Gag +KDBindNPCSlot_Muzzle,Muzzle +KDBindNPCSlot_Wrists,Wrists +KDBindNPCSlot_HeavyBondage,Bondage +KDBindNPCSlot_Secure,Chest Harness +KDBindNPCSlot_ArmEncase,Encasement +KDBindNPCSlot_InnerHands,Mittens +KDBindNPCSlot_InterHands,Mittens / Tape +KDBindNPCSlot_OuterHands,Gloves / Tape +KDBindNPCSlot_HandEncase,Encasement +KDBindNPCSlot_Piercings,Piercings +KDBindNPCSlot_NippleWeight,Weights +KDBindNPCSlot_NippleVibe,Vibes +KDBindNPCSlot_ChastityBra,Chastity Bra +KDBindNPCSlot_Suits,Catsuit / Leotard +KDBindNPCSlot_HarnessExtra,Harness +KDBindNPCSlot_Harness,Harness +KDBindNPCSlot_Corset,Corset +KDBindNPCSlot_RearPlug,Rear Plug +KDBindNPCSlot_FrontPlug,Front Plug +KDBindNPCSlot_Vibe,Vibrator +KDBindNPCSlot_ChastityBelt,Chastity Belt +KDBindNPCSlot_ThighCuffs,Thigh Cuffs +KDBindNPCSlot_ThighBinds,Leg Bondage +KDBindNPCSlot_Legbinder,Legbinder +KDBindNPCSlot_LegEncase,Encasement +KDBindNPCSlot_AnkleCuffs,Ankles +KDBindNPCSlot_Shins,Shins +KDBindNPCSlot_Knees,Knees +KDBindNPCSlot_FeetEncase,Encasement +KDBindNPCSlot_ToeCuffs,Toe Cuffs +KDBindNPCSlot_ToeTies,Toe Tie +KDBindNPCSlot_Heels,Heels +KDBindNPCSlot_BootsEncase,Encasement + +KDCurrentItem,"Equipped: " +KDCurrentItem2,"Click to Add " +KDCurrentItem3,"Apply " +KDCurrentItemRaw,"Raw Material: " + +KDFreePrisoner,Free Prisoner + +KDPerkUnlockedToast,"Perk Unlocked: " + +KinkyDungeonInventoryItemUniversalSolvent,Latex Solvent +KinkyDungeonInventoryItemUniversalSolventUse,You ready the bottle of Latex Solvent. +KinkyDungeonInventoryItemUniversalSolventDesc,"A potent acid, capable of dissolving slime and latex." +KinkyDungeonInventoryItemUniversalSolventDesc2,"Deal 90 acid damage to target. Adds a 10% debuff to the cut and struggle resistance of latex restraints currently worn." + +KDVariableModifier_UniversalSolvent,Weakened by Latex Solvent (10%) +KDUniversalSolventSucceedSelf,You spill the solvent on yourself and loosen your latex bonds! +KDUniversalSolventSucceedEnemy,You splash the ENMY with latex solvent! + +KinkyDungeonSpellUniversalSolvent,Latex Solvent + +KDUniversalSolventFail,You can't use solvents on targets other than yourself while bound. + +KDRandom,Random + +KDSetRestraintPalette,Choose Palette +KDSetRestraintGeneric,Use Raw Material +KDSetRestraintPaletteSelect,Restraint Palette +KDSetRestraintPaletteReturn,Choose Restraint + +KDSetDefaultNPCPalette,"Def. Palette: " +KDSetNPCPaletteAll,"Set All Palette" + +KDCollectionTabStatusOption_,Prisoners +KDCollectionTabStatusOption_Guest,Guests + +KDCollectionAssign,"Assign to " +KDCollectionRemove,"Remove from " +KDCollectionCant,"Can't assign to " +KDCollectionCantParty,"Remove from party to assign " +KDImprison,Imprison + +KDNPCOpinion,"Opinion: " +KDLastNPCLocation,"Last Seen on Floor FLR, LOC" +KDLastNPCLocationSame,"Present in current level" +KDLastNPCLocationCaptured,"Captured by FCTN" +KDLastNPCLocationCapturedNone,"Captured by enemies" + +KDCantFree,Use 'Truss'em'Up' to edit restraints on this NPC +KDNeedsTighten,"The NPC needs tightening, but is unavailable right now" +KDTightenRestraint,Tighten non-conjured restraints + + +KDNPCEscaped,NPC has escaped! +KDNPCEscapeGrace,NPC is likely to escape. +KDNPCStruggle,NPC has managed to loosen her bonds. + +KDCollectionFilter,"Any" +KDCollectionFilterOpinion,"NPC Opinion: " +KDCollectionFilterEscape,"NPC Escape Status: " +KDCollectionFilterBinding,"NPC Binding: " +KDCollectionFilterAvailability,"NPC Availability: " +KDCollectionFilterFavorites,"Favorited: " +KDCollectionFilterRank,"Rank: " +KDCollectionFilterRank0,"Minor" +KDCollectionFilterRank1,"Normal" +KDCollectionFilterRank2,"Elite" +KDCollectionFilterRank3,"Miniboss" +KDCollectionFilterRank4,"Boss" +KDCollectionFilterRank5,"Legendary" + + +KDCollectionFilterBound,"Bound" +KDCollectionFilterFree,"Free" +KDCollectionFilterSafe,"Secure" +KDCollectionFilterEscapeRisk,"At Risk" +KDCollectionFilterEscaped,"Escaped" +KDCollectionFilterImprisoned,"Imprisoned" +KDCollectionFilterPositive,"Positive" +KDCollectionFilterNegative,"Negative" +KDCollectionFilterFavorite,"Favorite" +KDCollectionFilterNonFavorite,"Non-Favorite" + +KDCollectionFilterAvailable,"Present" +KDCollectionFilterUnavailable,"Unavailable" + +KDCollectionTab_AutoBind,Auto Bind Interface +KDDrawSelectedTab_AutoBind,AutoBind + +KDCollectionTab_FacilityQuick,Assign to Facility +KDDrawSelectedTab_FacilityQuick,Assign to Facility + +KDAutoBindCopy,Copy Restraints +KDAutoBindPaste,Paste Restraints from NME +KDAutoBindPasteNone,No restraints left in inventory +KDAutoBindPasteAll,Paste to All! +KDAutoBindPasteAllOver,OVERWRITE All! + +KDPromoteNotEnough,Need Positive Opinion to Promote +KDPromoteRemoveFromParty,Remove From Party Before Promoting? + +KDCuddleLounge1,Servant Cuddle Points: AMNT (+OPN opinion/cycle) +KDCuddleLounge2,Prisoner Cuddle Points: AMNT (+OPN opinion/cycle) +KDCuddleLoungeInfo,Submissive prisoners and dominant servants add different amounts of opinion per cycle + + +KDCollectionTab_Release,Release Prisoners +KDDrawSelectedTab_Release,Release + +KDSummonServant,Summon +KDSummonServantAlreadyPresent,Already present in summit +KDSummonServantUnavailable,NPC is unavailable +KDSummonServantSummit,Only available in the Summit + + +KDReleaseMark,Mark +KDReleaseUnmark,Unmark +KDReleaseMarkAll,Mark ALL +KDReleaseUnMarkAll,Cancel Selection +KDReleaseRelease,Release Marked Prisoners! +KDReleaseRansom,Ransom Marked Prisoners for GP! +KDRansomValue,Ransom Value: GP +KDCurrentGold,Current Gold: GP +KDNA,n/a + +KDTrainingLevelHeels,"[EXP: AMNT/LMT, +NXT next floor] Heel training reduces balance loss from heels." + +KinkyDungeonBuffQuickness,Phase Dance active. Your next move is instant. +KinkyDungeonBuffCombatManeuverQuick,Combat Maneuver active. Your next move is instant. + +KDOccupied,"The furniture space is occupied" +KDCombatManeuver,"Combat Maneuver: Your next move is instant." + + +KDManagement1,Appointing managers increases the efficiency of other facilities. +KDManagement2,Total Efficiency Boost: AMNT% +Idle,idle + +rMummyElevator,"(As you approach the statue, you hear a crumbling sound)|(The stone crumbles along the statue's slender frame)|(...revealing inside a beautiful, and extremely angry catgirl)|Who dares disturb my slumber?|I shall see to it that you receive your punishment!" + +NameMummyElevator,Mysterious Statue + +KDSelectABindingSlot,Select a Binding Slot + +KDCost,"Cost: " + +ZoomSet,Zoom set to PCNT% +KDBondageFailComponents,You need free arms to tie others! +KDBondageFailNoSelect,You can use the quick inventory to bind yourself or others +KDBondageFailError,Error. Please screenshot and report. +KDBondageFailCantAdd,"You can't wear that item, regrettably." + +KDBondageCondition_HeavyBondage,Must be stunned 3+ turns or fully bound +KDBondageCondition_Extra,Depends on another item to be added first + +KDConjuredRestraintVanish,The conjured RSTN vanishes as you remove it. + +KDAlreadyBound,No free slots to bind in + +KinkyDungeonSpellCommandRange,Reaching Authority +KinkyDungeonSpellDescriptionCommandRange,"If arm components are unavailable, you can now apply bindings with verbal components only. Increases range of Truss em Up by 2 and all CMD spells by 1" + +KDSaveSlotButton,"Save Slot " +PlayGameWithCurrentCode,"Load Game" +LoadFromCodeButton,"Load Code" +LoadFromCodeButton0,"Load Slot 0" +LoadFromFileButton,"Load File" +KDSaveFromCode,Save From Code + +KDDelete,Delete? +KDImport,Import to Slot +KDInvalid,Invalid Data +KDNoData,No Data + + +rJourneyNone,"This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall." +rJourneyHarder,"This is the alternate entrance to the ancient tombs.|It's harder than the normal entrance." +rJourneyRandom,"This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random." +rJourneyExplorer,"Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure!" +rJourneyDoll,"You've gotten lost in an ancient doll processing facility.|This journey features mostly lategame tilesets." +rJourneyTemple,"You've gotten lost inside an ancient temple to a kinky goddess.|Will you find your way out, or will you find yourself trapped even deeper?" +rJourneyLost,"You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed!" + +KDHardMode0, +KDHardMode1," (Hard)" +KDHardMode2," (Extreme)" + +KDChooseSlot,Choose Save Slot: + +KDJourneyNone,Standard Route +KDJourneyHarder,Alternate Route +KDJourneyTemple,Temple Route +KDJourneyExplorer,Jungle Route +KDJourneyDoll,Factory Route +KDJourneyLost,Reverse Route +KDJourneyRandom,Chaos Route +KDMapSeed,"Map Seed: " +KDWillOverride,Will Overwrite NME! + +KDPlayWithSlot,"Play Slot " +KDPlayWithoutSlot,Play (NO SLOT!) + +KDCallForHelpHint,"Looks like you might be stuck. Try calling for help (bottom right of UI)" + +KDBackupOutfits,Backup +KDLoadOutfits,Restore +KDSetPalette,Extra Options +KDVisualOpt_HideArmorWardrobe,Preview without Armor + +KinkyDungeonStatMC_Mage,"Wizard" + +KDSlotLocFormat,"FLR-DGN" +KDSlotLocNG," (NG+AMNT)" + + +KDBondageFailInvalidTargetHandcuffs,Target must be vulnerable. +KDBondageFailInvalidTargetStuffing,Target must be vulnerable or have casted a verbal spell. +KDBondageFailInvalidTargetTapeGag,Target must be vulnerable. +KDBondageFailInvalidTargetTapeBlindfold,Target must be vulnerable. +KDBondageFailInvalidTargetBallGag,Target must have casted a verbal spell. + + +KinkyDungeonSpellPickaxe,"Diggy diggy hole" +KinkyDungeonSpellTargetPickaxe,"Select a cracked wall." +KinkyDungeonSpellCastPickaxe,"You strike the earth!" + +KDPickaxeFailNoTarget,"Must select a cracked wall." +KDPickaxeFailNoComp,"Your arms aren't free to swing the axe!" +KDPickaxeFailNoOpen,"You strike the earth, but it is nothing but solid wall on the other side." +KDPickaxeSucceed,"You strike the earth! It crumbles before you!" +KDWallAttemptToMine,"Click again to automatically mine the wall with your pickaxe." + +KDTeleportPlateReact,The planar focus resonates with the teleportation magic! +KDTeleportPlateManaReact,"The planar focusing crystal activates! Mana is drained, and turns into bindings!" +KDNoTeleportPlateReact,The planar diffractor blocks the teleportation! + +KDSetCharacterPalette,Set Character Palette + +KDResetKeys,Reset all Keybindings + +KDStruggleBlocked,That item is blocked! You can't remove it. + +KDMin," min." +KDMax," max." +KDBonus," bonus" +KDPenalty," penalty" + +KinkyDungeonCurseStruggleMistressKeyQuakeCollar,"You put it on, why would you want to take it off?~" +KinkyDungeonCurseInfoMistressKeyQuakeCollar,"You'll need an ancient key to unlock the ancient-made collar." + + +NameCuffedGirl,Ancient Worshipper +KillCuffedGirl,The ancient worshipper repents of her ways. +AttackCuffedGirlBind,"The ancient worshipper's crystal restraints spread to you! (+RestraintAdded)" +AttackCuffedGirlLock,"Crystals start to grow on one of your restraints! (DamageTaken)" +AttackCuffedGirl,"The ancient worshipper mumbles at you for assistance! (DamageTaken)" + +NameCuffedGirl2,Ancient Congregant +KillCuffedGirl2,The ancient congregant repents of her ways. +AttackCuffedGirl2Bind,"The ancient congregant's crystal restraints spread to you! (+RestraintAdded)" +AttackCuffedGirl2Lock,"Crystals start to grow on your restraints! (DamageTaken)" +AttackCuffedGirl2,"The ancient congregant mumbles at you for assistance! (DamageTaken)" + +NameCuffedGirl3,Ancient Hierophant +KillCuffedGirl3,The ancient hierophant repents of her ways. +AttackCuffedGirl3Bind,"The ancient hierophant's crystal restraints spread to you! (+RestraintAdded)" +AttackCuffedGirl3Lock,"Crystals start to grow on your restraints! (DamageTaken)" +AttackCuffedGirl3,"The ancient hierophant mumbles at you for assistance! (DamageTaken)" + +KDCrystalUnlock,"The crystals break off, revealing a keyhole and weakening the item." +KDCrystalLock,"Your distraction causes the crystals to grow back, encasing the lock again!" + +KDGagNecklaceOn,"After popping the gag out of your mouth, it hangs loose around your neck." +KDGagNecklaceOff,"The gag is now in your mouth." + +KDErrorMods,ERROR: Restraint does not exist. Did you forget to load mods? + +RestraintGagNecklace,Gag Necklace +RestraintGagNecklaceDesc,A cute accessory for those who wish to (not) make a statement. +RestraintGagNecklaceDesc2,Functions as a collar. + +KDNoModJSON,No mod info! +KDModOutdated,Wrong patch +KDModOutdated2,VERY Outdated! +KDModOutdated3,Outdated! +KDModDependency,Check dependencies! +KDModIncompatible,Check compatibility! +KDModMiscError,Misc Error +KDModVer," v" + +KDLivingCollarSuspendDisenchant,Magical disenchantment suspends your living collar for AMNT turns + +KDBindingAdd,"(will add AMNT TPE binding)" +KDBindType_Energy,Hardlight +KDBindType_Magic,Magic +KDBindType_Leather,Leather +KDBindType_Null,Knocked Out +KDBindType_Latex,Latex +KDBindType_Rope,Rope +KDBindType_MagicRope,Magic Rope +KDBindType_Metal,Metal +KDBindType_Slime,Slime +KDBindType_Tape,Tape +KDBindType_Vine,Vine +KDBindType_Ice,Ice +KDBindType_Furniture,Furniture +KDBindType_Wrapping,Wrapping + +KDSaving,Saving... +KDSaved,Game Saved + +KDNPCEscapeRemove,ENMY escapes from the ITMN! +KDNPCEscapeConjuredRemove,"ENMY escapes from the ITMN and the item vanishes." +KDNPCEscapeUnlock,ENMY unlocks the ITMN! +KDConjuredItemVanish,The conjured ITMN vanishes as it comes off. + +KDWardenTightened,AMNT restraints added since last tick~ +KDWardenConfiscate,AMNT restraints confiscated since last tick~ +KDWardenNoRestraints,You have no restraints in storage. Go to the Summit to deposit restraints. + +KDContainerBack_Facilities,Back to Facilities +KDContainerBack_Game,Back to Game + +KDContainerType_Self,Your Inventory +KDContainerType_Chest,Chest +KDContainerType_,Chest +KDContainerType_WardenChest,Warden's Storage + +KDAdd1,Store 1 ITMN +KDTake1,Take 1 ITMN +KDAdd5,Store 5 ITMN +KDTake5,Take 5 ITMN +KDAddAll,Store ALL ITMN +KDTakeAll,Take ALL ITMN +KDAddAll1,Store ALL-1 ITMN +KDTakeAll1,Take ALL-1 ITMN +KDTakeEverything,Take Everything +KDDepositEverything,Deposit All + +KDAutoLoot,"Auto-loot found " +KDNotPickedUp," (not picked up)" + +KDToggleFlipPlayerAuto,Automatically Flip When Moving + +KDWardenNeedSummit,Go to the summit to deposit restraints + + +KDStamDmgBonus,AMNTx damage when SP is over 50% + +KinkyDungeonSpellManyOrbs,"Barrage of Barrier Orb" +KinkyDungeonSpellZombieOrb,"Barrier Orb" +KinkyDungeonSpellFuukaOrbMulti,"Barrage of Sealing Talisman" +KinkyDungeonSpellFuukaOrb,"Sealing Talisman" +KinkyDungeonSpellEnemyCM_self,"Self Unlock" +KinkyDungeonSpellCrystalBoltMany,"Crystal Storm" + +KinkyDungeonSpellDarkTele,Shadow Walk + +KDPerkGagSizeIncrease,Your ITMN1 inflates inside your mouth to become a ITMN2! +KinkyDungeonStatBiggerGags,Bigger Ball Gags +KinkyDungeonStatDescBiggerGags,Smaller ball gags are replaced by their larger versions. +KDToggleOScreenFilter,Screen effect when letting go +KDToggleDistractScreenFilter,Screen flash when distracted + + +KinkyDungeonSpellWitchRopeBoltLaunchMany,Ropestorm +KinkyDungeonSpellAmpuleBlue,Essentia Aliquam +KinkyDungeonSpellLatexBubble,Aliquam Orbis +KinkyDungeonSpellAmpuleGreen,Potio Requiem +KinkyDungeonSpellAmpuleYellow,Ultimate Glue no. 91 +KinkyDungeonSpellBubbleBurstSlime,Slime Encapsulation +KinkyDungeonSpellCelestialBolt,Judgement Bolt +KinkyDungeonSpellHeatBolt,Flame Bolt +KinkyDungeonSpellWitchElectrify,Electrification +KinkyDungeonSpellZombieOrb,Charming Orb +KinkyDungeonSpellZombieOrbIce,Freezing Orb +KinkyDungeonSpellMinigun,Heavy Ordnance +KinkyDungeonSpellShadowStrike,Shadow Strike +KinkyDungeonSpellEntangle,Entangle +KinkyDungeonSpellMummyBolt,Blessed Orb +KinkyDungeonSpellVineSlimeBall,Slimy Sphere +KinkyDungeonSpellAmpuleRed,Rubberization Protocol +KinkyDungeonSpellBubbleBurstLatex,Latex Encapsulation +KinkyDungeonSpellRedSlime,Red Slime Experiment +KinkyDungeonSpellEncaseBoltDrone,Encasement Protocol +KinkyDungeonSpellEncaseBolt,Encasement Protocol +KinkyDungeonSpellWolfCrackle,Electrical Discharge +KinkyDungeonSpellSlimePuddle,Slime Blast +KinkyDungeonSpellWitchIcebolt,Icebolt +KinkyDungeonSpellWitchWaterBall,Water Ball +KinkyDungeonSpellBubbleBurst,Bubble Burst +KinkyDungeonSpellWitchElectricOrb,Electric Orb +KinkyDungeonSpellWitchChainBolt,Chain Bolt +KinkyDungeonSpellSummonSkeleton,Skeleton Minion +KinkyDungeonSpellSummonSkeletons,Skeleton Minions +KinkyDungeonSpellHighBolt,Flummoxing Orb +KinkyDungeonSpellSpores,Spores +KinkyDungeonSpellCrystalPuff,Crystallize +KinkyDungeonSpellNurseBola,Capture Device +KinkyDungeonSpellNurseSyringe,Sedative +KinkyDungeonSpellManySlimes,Slime Barrage +KinkyDungeonSpellFuukaOrbMulti,Seal of the 5th Era + + + +KinkyDungeonSpellOrbHeal,Healing Flash +KinkyDungeonSpellZombieBuff,Undead Frenzy +KinkyDungeonSpellEnemyCM1,Command Word +KinkyDungeonSpellRopeAttack,Rope Ambush +KinkyDungeonSpellParasolBuff,Defensive Charm +KinkyDungeonSpellShieldTheWitch,Shield the Witch +KinkyDungeonSpellEnemyFlashBomb,Flashbang +KinkyDungeonSpellMinigunWindup,Tracer Rounds +KinkyDungeonSpellGhostAttack,The Spookening +KinkyDungeonSpellGagGeistAttack,The Muffling +KinkyDungeonSpellSummonTickleHand,Conjure Tickle Hands +KinkyDungeonSpellSummonEnemyGag2,Conjure Gags +KinkyDungeonSpellSummonBookChain,Scriptum Ferri +KinkyDungeonSpellSummonBookBelt,Scrimptum Habena +KinkyDungeonSpellSummonBookRope,Scriptum Ligni +KinkyDungeonSpellAreaElectrify,Electric Storm +KinkyDungeonSpellIceSlowPrepare,Icy Breath +KinkyDungeonSpellIceDragonBreathPrepare,Icy Breath +KinkyDungeonSpellDragonVine,Vine Pod +KinkyDungeonSpellDragonFlowerSpores,Flower Spores +KinkyDungeonSpellSummonLatexElemental,Magnum Opus +KinkyDungeonSpellLatexSpray,Latex Integrator +KinkyDungeonSpellSummonForceFields,Forcefield Protocol +KinkyDungeonSpellNevermereBoost,Motivation +KinkyDungeonSpellSummonWolfDrone,Drone Assault +KinkyDungeonSpellSummonWolfTapeDrone,Tape Drone Assault +KinkyDungeonSpellSummonSlimeMold,*summon slime mold* +KinkyDungeonSpellSummonDragonVinePlant,Vine Growth +KinkyDungeonSpellSummonDragonFlower,Flower Growth +KinkyDungeonSpellDragonSlash,Thorn Whip +KinkyDungeonSpellCrystalShockBolt,Crystal Surge +KinkyDungeonSpellShadowShroud,Shadow Shroud +KinkyDungeonSpellShadowShroudTele,Shadow Step +KinkyDungeonSpellShadowShroudGirl,Shadow Shroud +KinkyDungeonSpellSummonIceWall,Ice Wall +KinkyDungeonSpellSummonIceWall2,Ice Wall +KinkyDungeonSpellIceBreathChannel,Ice Breath +KinkyDungeonSpellArmorUpArea,Armor Up +KinkyDungeonSpellSummonCrystals,Crystal Growth +KinkyDungeonSpellShadowOrb,Shadow Orb +KinkyDungeonSpellArmorUp,Armor Up +KinkyDungeonSpellEarthfield,Earthfield +KinkyDungeonSpellMonolithBeam,Soul Beam +KinkyDungeonSpellSummonShadowHand,Summon Shadows +KinkyDungeonSpellObserverBeam,Observation +KinkyDungeonSpellEnemySummonLatexArmbinder,Conjure Latex Armbinder +KinkyDungeonSpellEnemySummonLatexLegbinder,Conjure Latex Legbinder +KinkyDungeonSpellEnemySummonLatexGag,Conjure Latex Gag +KinkyDungeonSpellEnemySummonLatexRestraint,Conjure Latex Restraint +KinkyDungeonSpellEnemyEnchantRope3,Rope Sealing +KinkyDungeonSpellSummonRopeTentacle,Rope Tentacle +KinkyDungeonSpellSummonSlimeMinion,Slime Minion +KinkyDungeonSpellSummonSarcoTentacle,Magical Wrappings +KinkyDungeonSpellRubberBolt,Capture Bolt +KinkyDungeonSpellDollConvert,Training Protocol +KinkyDungeonSpellDollBoost,Motivation Protocol +KinkyDungeonSpellSummonSingleTickleHand,Conjure Tickle Hand +KinkyDungeonSpellSummonEnemyGag,Conjure Gag +KinkyDungeonSpellSummonLock,Conjure Locks +KinkyDungeonSpellSummonCuff,Conjure Cuffs +KinkyDungeonSpellManyChains,Chainstorm +KinkyDungeonSpellSummonChainWalls,Chain Wall +KinkyDungeonSpellRibbons,Binding Ribbons +KinkyDungeonSpellSummonBookSlime,Scriptum Limus +KinkyDungeonSpellSummonBookIce,Scriptum Glacis +KinkyDungeonSpellSummonBookNature,Scriptim Vinea +KinkyDungeonSpellSummonBookForbidden,Scriptum Infernus +KinkyDungeonSpellSummonBookArcane,Scriptum Arcanum +KinkyDungeonSpellSummonBookCelestial,Scriptum Celeste +KinkyDungeonSpellSummonBookElectric,Scriptum Electri +KinkyDungeonSpellClericBeam,Blessed Rays +KinkyDungeonSpellSummonMikoGhosts,Ghostly Pets +KinkyDungeonSpellSummonZombies,Zombie Pets +KinkyDungeonSpellMagicMissileChannel,Bondage Blast +KinkyDungeonSpellSummonDrones,Drone Support +KinkyDungeonSpellDollConvertMany,Doll Training +KinkyDungeonSpellSummonCaptureDrones,Capture Drone +KinkyDungeonSpellManyCables,Full Capture +KinkyDungeonSpellManyShadowHands,Shadow Hands +KinkyDungeonSpellManyObsidianBolts,Obsidian Orbs +KinkyDungeonSpellManyMithrilBolts,Mithril Orbs + + + + +rTheWardenFuuka,"(The Warden perks an eyebrow at the sight of you,|before a wide grin overtakes her face)|Ahhh Fuuka. Chosen by the Goddess?|How does it feel to once again be under a leash?" +dTheWardenFuuka_AggressiveF,"Fuuka, take her down." +dTheWardenFuuka_AggressiveFGag,"(Send Fuuka to fight her)" +dTheWardenFuuka_Aggressive,"That is none of your business. Now kneel." +dTheWardenFuuka_AggressiveGag,"(Fight without listening.)" + + +KinkyDungeonSpellHexWrapping,Blessed Hex +KinkyDungeonSpellHexOrb,Hexing Orb +KinkyDungeonSpellHexLatexExplosion,Hexed Latex Engulf +KinkyDungeonSpellHexWrappingBind,Hex Binding + +KDLoreTextCover,"Here you will find various scraps of documents and lore you've recovered throughout your adventures." +KDLoreTitleCover,"Your Journal" +KDLoreLabelCover,"Cover" +KDLoreTextCath0,"I am writing this journal in the off chance that I do not come return from the Agarthan ruins. If you find this, please make an effort to deliver it back to the surface for the good of all the women lured in by its secrets." +KDLoreTitleCath0,"Catherine Willows' Journal (preface)" +KDLoreLabelCath0,"Willows 0" +KDLoreTextCathGrv1,"As I scaled the mountain, I came across a massive graveyard above the treeline, a grand memorial to those who died before the Great Work. This graveyard extends into the mouth of the cave, and the guards told me not to deface any of the graves, or else the ghosts will come and get me. It would be easier to follow their instructions if there weren't so much treasure still hidden here! After all, most of us are deep in the red after sailing all this way." +KDLoreTitleCathGrv1,"Catherine Willows' Journal (pg. 7)" +KDLoreLabelCathGrv1,"Willows 7" +KDLoreTextCathGrv2,"It's hard to imagine I'm in a cave. Everything is so decorated and well-preserved, it's almost as if decades of adventurers never found their way to this island. In the distant future when every last piece of treasure has been hauled out of here, I imagine they'll set this place up as a tourist attraction." +KDLoreTitleCathGrv2,"Catherine Willows' Journal (pg. 8)" +KDLoreLabelCathGrv2,"Willows 8" +KDLoreTextCathGrv3,"I spoke with a few locals while resupplying at the port. Apparently the village up here is far older than the twenty-some years the Adventurer's Guild has been on the island. The locals call the mountain 'Ejahl,' but the consensus is that this is the site of the legendary city Agartha where the Archmagus herself made her discovery.|(The page is dated about fifty years ago)" +KDLoreTitleCathGrv3,"Catherine Willows' Journal (pg. 14)" +KDLoreLabelCathGrv3,"Willows 14" +KDLoreTextCathCat1,"I made it to a deeper floor today, and was greeted by a skeleton trying to tie me up. Great.|I've looked into the local name for this mountain, 'Ejahl,' and found a footnote in the history books talking about some petty kingdom that laid siege to Agartha. There's no record of them actually winning the siege, though. I've heard there's a massive library somewhere down here, maybe I'll find answers there." +KDLoreTitleCathCat1,"Catherine Willows' Journal (pg. 17)" +KDLoreLabelCathCat1,"Willows 17" +KDLoreTextCathCat2,"There was a warrior in the catacombs today. She appears to have mastered the art of witty comebacks, as I truly could not come up with anything to say that did not further humiliate myself. Fortunately her insults came at her companions' expense, and they allowed me to defeat her in a solitary duel." +KDLoreTitleCathCat2,"Catherine Willows' Journal (pg. 20)" +KDLoreLabelCathCat2,"Willows 20" +KDLoreTextCathCat3,"I almost found myself the recipient of a powerful binding arrow enchanted with force runes. Had I been hit, I would have been knocked back against the walls with my arms pinned by glowing conjured cuffs. Fortunately, this projectile hit a skeleton that was attacking me instead, and I was able to retreat." +KDLoreTitleCathCat3,"Catherine Willows' Journal (pg. 21)" +KDLoreLabelCathCat3,"Willows 21" +KDLoreTextCathTmb,"In my travels I encountered a curious tomb filled with the scent of incense and herbs. Strange statues lined the halls on stone pedestals, standing as an intimidating reminder of what happens to those who disturb the locals...|I encountered resistance from the locals, who seemed to regard outsiders as 'cursed' and sought to capture me in an effort to give me a 'blessing.' I highly doubt that anyone has been truly blessed by their efforts, well-intentioned or not." +KDLoreTitleCathTmb,"Catherine Willows' Journal (pg. 24)" +KDLoreLabelCathTmb,"Willows 24" +KDLoreTextCathTmb2,"This 'blessing' of theirs appears to be an old ritual for immortality. I believe these peoples are older than the Great Work, based on the ancient dialect they speak and the outdated script they use.|Whatever the case may be, their method seems inexact and prone to failure, as demonstrated by their near maniacal devotion to 'bless' every adventurer they come across." +KDLoreTitleCathTmb2,"Catherine Willows' Journal (pg. 25)" +KDLoreLabelCathTmb2,"Willows 25" +KDLoreTextCathTmb3,"There are two 'castes' in the Bast cult. The first are the 'blessed,' and the second are their watchful guardians. The unintuitive bit is that the 'blessed' are the ones wrapped up and sealed away inside statues, sarcophagi, and anything else the guardians can stick a person into. The free ones wandering around grabbing people? They're the ones who weren't 'blessed' apparently." +KDLoreTitleCathTmb3,"Catherine Willows' Journal (pg. 26)" +KDLoreLabelCathTmb3,"Willows 26" +KDLoreTextCathLib1,"I've found it! The Archmagus' library! Much to my chagrin, however, the place has been ransacked by witches and a curious group of mages in search of inspiration from ancient fashion choices." +KDLoreTitleCathLib1,"Catherine Willows' Journal (pg. 30)" +KDLoreLabelCathLib1,"Willows 30" +KDLoreTextCathLib2,"It appears someone got to the Archmagus' writings before I could. Nonetheless, I will continue my search for Vinlaga's personal study. Perhaps her research materials and drafts might shed some light on my condition." +KDLoreTitleCathLib2,"Catherine Willows' Journal (pg. 31)" +KDLoreLabelCathLib2,"Willows 31" +KDLoreTextCathLib3,"I have learned of an ancient artifact, called the Mistress' Staff. Its history and owner are hotly debated, with some attributing it to the Archmagus herself, while others say it was developed by the magical warlords that followed. Most all sources agree that its signature feature is the ability to reverse the effects of the Great Work on any person." +KDLoreTitleCathLib3,"Catherine Willows' Journal (pg. 36)" +KDLoreLabelCathLib3,"Willows 33" +KDLoreTextCathLib4,"There is a treasure trove of ancient history here that the blasted Dressmakers had no use for. I found a map from the 'Kingdom of Ejahl,' with sketches of many islands including this one. Like most of the warlord states, they failed to make a lasting impact on the architecture of the island, but it appears the island was uninhabited for some time between the fall of Agartha and its resettlement by Ejahl." +KDLoreTitleCathLib4,"Catherine Willows' Journal (pg. 41)" +KDLoreLabelCathLib4,"Willows 41" +KDLoreTextCathLib5,"...I must find it.|They are looking for it.|They CANNOT be allowed to have it." +KDLoreTitleCathLib5,"Catherine Willows' Journal (pg. 47)" +KDLoreLabelCathLib5,"Willows 37" +KDLoreTextCathJng1,"I saw my reflection in a pool of water today. My hair looked much more silver than I remember it. I hope this isn't a side effect of all the magic I'd used to make it to this point." +KDLoreTitleCathJng1,"Catherine Willows' Journal (pg. 50)" +KDLoreLabelCathJng1,"Willows 50" +KDLoreTextCathJng2,"I heard the bandits are looking for the Mistress' Staff. I'm not too worried--they wouldn't know what to do with it. It's that damned witch I'm worried about.|If my astute reader has come this far, you should beware the Silver Witch. She is working with forces that cannot be trusted." +KDLoreTitleCathJng2,"Catherine Willows' Journal (pg. 51)" +KDLoreLabelCathJng2,"Willows 51" +KDLoreTextSW10,"It seems I am not alone in my search for the Staff. To whom it may concern: the Great Work is a lie, and it will doom us all. If you care for your soul, you need to break the cycle, and for that we need a key: the Mistress' Staff." +KDLoreTitleSW10,"Silver Witch's Notes #10" +KDLoreLabelSW10,"Silver 10" +KDLoreTextSW2,"I met an adventurer who managed to erase weeks of golem research in the blink of an eye. This is why we Summoners have to scatter our works far and wide... if only they knew what we are working towards." +KDLoreTitleSW2,"Silver Witch's Notes #2" +KDLoreLabelSW2,"Silver 2" +KDLoreTextSW3,"The dimensional rift is especially active today. I spoke with some of the voices the other night, they offered me immortality in exchange for material wealth. They must have called the wrong universe or something..." +KDLoreTitleSW3,"Silver Witch's Notes #3" +KDLoreLabelSW3,"Silver 3" +KDLoreTextSW18,"My new golem project did not go as expected. I'd expected the primordial one to answer once I'd opened the gate, but there was nothing but a horde of star demons which I quickly dispatched. Could this mean the source of primordial latex is not outside this universe, as I had thought, but inside? I must investigate further." +KDLoreTitleSW18,"Silver Witch's Notes #18" +KDLoreLabelSW18,"Silver 18" +KDLoreTextSW15,"She did it again. Barged in on my work and called me a 'purveyor of evil magics,' whatever that means. Magic isn't evil, it was given to us directly by the gods! At least I hid my new golem in a different study of mine..." +KDLoreTitleSW15,"Silver Witch's Notes #15" +KDLoreLabelSW15,"Silver 15" +KDLoreTextSW4,"Throughout my studies I have chased after the existence of a being I call 'the Primordial One.' My theories stem from the following observations:|1)Slimes were not present in ancient history, and appeared during my lifetime as a force of nature.|2)Slime can be transmuted into almost any known material, like a Prima Materia of sorts.|3) A fragment of Sariel's notes, one of my most guarded possessions, discusses the existence of slimes long before they were first observed in the world.|Based on this, I believe the world must have been created through the influence of some primordial being who then left, but must be returning somehow.|I'm sure this being holds the key to repairing our bodies." +KDLoreTitleSW4,"Silver Witch's Notes on the Primordial One" +KDLoreLabelSW4,"Silver 4" +KDLoreTextSW7,"Blast. An adventurer stole one of my notebooks, and now I'm encountering various cultists and weirdos trying to summon the Primordial One themselves. This is why I never bother to publish my works..." +KDLoreTitleSW7,"Silver Witch's Notes #7" +KDLoreLabelSW7,"Silver 7" +KDLoreTextSW106,"I haven't heard of that adventurer in decades. Perhaps her nosiness finally caught up to her?" +KDLoreTitleSW106,"Silver Witch's Notes #106" +KDLoreLabelSW106,"Silver 106" +KDLoreTextSW117,"There is a new presence in the mountain. An opportunist that calls herself 'the Dollmaker.' Claims to be the lost heir to the Kingdom of Ejahl. Please~.|I've seen those hackjobs and reprogrammed wrecks. If there even was a Kingdom of Ejahl, surely their army would consist of more than just scrapped combat drones?" +KDLoreTitleSW117,"Silver Witch's Notes #117" +KDLoreLabelSW117,"Silver 117" +KDLoreTextEJ1,"The Kingdom of Ejahl appeared in Agartha 170 years after the death of Sariel Vinlaga. It had three* rulers who vied for the throne at different times:|Diana, Princess of Machinery|Emer, the Warsage|And the Dollmaker, High General of the Kingdom||*Some manuscripts read 'two'" +KDLoreTitleEJ1,"The Chronicles of Ejahl" +KDLoreLabelEJ1,"Ejahl 1" +KDLoreTextEJ2,"The Kingdom of Ejahl ruled the island of Agartha for 30 years before its collapse. During the last war, an unknown figure captured the majority of its army and the majority of the population fled by boat. No one was left on the island." +KDLoreTitleEJ2,"The Fall of Ejahl" +KDLoreLabelEJ2,"Ejahl 2" +KDLoreTexten.BlindZombie,"Danger Level: Nearly Harmless|A reanimated corpse from before the Great Work. I can't tell if the original soul still inhabits the body, since it can barely speak let alone explain its identity.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.BlindZombie,"Zombie" +KDLoreLabelen.BlindZombie,"Zombie" +KDLoreTexten.FastZombie,"Danger Level: Normal|These zombies are more motivated than the others. Their behavior is similar to that of vengeful spirits I've encountered in the depths.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.FastZombie,"Angry Zombie" +KDLoreLabelen.FastZombie,"Fast Z." +KDLoreTexten.MageZombie,"Danger Level: Normal|A zombie that can use magic. It doesn't look like any magic I've seen outside the ruins, which makes me think that it was taught to use magic. Some of them have tattoos associated with magic in the old times. Since magic comes from the soul, I assume there is some hint of the original soul still present.|-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.MageZombie,"Mage Zombie" +KDLoreLabelen.MageZombie,"Mage Z." +KDLoreTexten.SamuraiZombie,"Danger Level: High|A zombie with impeccable sword technique. I've never seen an undead handle a sword so smoothly. Probably buried with their weapons and gear, since most of it is aged. Even their binding techniques resemble those in the textbooks rather than modern ropework.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.SamuraiZombie,"Warrior Zombie" +KDLoreLabelen.SamuraiZombie,"Warrior Z." +KDLoreTexten.TalismanZombie,"Danger Level: High|A zombie that uses sealing charms and healing magic. Irony aside, I've seen these with rope marks and gag strap marks on their skin and face. It seems like someone is playing with them. Who could that be?||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.TalismanZombie,"Talisman Zombie" +KDLoreLabelen.TalismanZombie,"Talisman Z." +KDLoreTexten.Ghost,"Danger Level: Annoying|A playful spirit residing in the dungeon, taking advantage of any adventurers they come across. They can pass through walls, and most physical weapons go right through them. Using a magical weapon seems to banish them for some time, at least.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.Ghost,"Ghost" +KDLoreLabelen.Ghost,"Ghost" +KDLoreTexten.Poltergeist,"Danger Level: Very Annoying|It is said that ghosts are the spirits of pre-Great Work humans whose souls are bound to this world by unfinished dreams and ambitions. But I don't believe a word of that. These little guys care about nothing except humiliating people. Ask me how I know.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.Poltergeist,"Poltergeist" +KDLoreLabelen.Poltergeist,"Poltergeist" +KDLoreTexten.TickleTerror,"Danger Level: Medium|A very playful ghost with a penchant for teasing. It even carries spectral restraints of its own for use in 'games,' which tend to consist of tickling tied up girls.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.TickleTerror,"Tickle Terror" +KDLoreLabelen.TickleTerror,"Tickle Terror" +KDLoreTexten.GreedyGhast,"Danger Level: Low|The feelings of a person who desired wealth in life. While it is unable to claim any physical wealth for itself, it nonetheless will rummage through your pockets and possessions if it gets a chance.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.GreedyGhast,"Greedy Ghast" +KDLoreLabelen.GreedyGhast,"Greedy Ghast" +KDLoreTexten.HugHorror,"Danger Level: High|A constricting mass of negative thoughts. According to local myths, the other ghosts attempt to cheer this one up by hugging it, but its wails end up attracting them to your position. Be prepared to take it down lest you find yourself a plaything for the beyond.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.HugHorror,"Hug Horror" +KDLoreLabelen.HugHorror,"Hug Horror" +KDLoreTexten.Witches,"Danger Level: High|While most wizards spend literal centuries mastering the art of magic, there are those lacking the patience or discipline to study magic the old fashioned way. Driven by a need for power, these individuals make contracts with otherworldly beings and become Witches.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.Witches,"The Witches' Coven" +KDLoreLabelen.Witches,"Witches" +KDLoreTexten.Conjure,"Danger Level: Extreme|A witch gifted in the arts of conjuration. Backed by an army of animated spectral hands and devious tomes, this variety of witch is extremely dangerous. Her close range attacks are slow and unwieldy, but take care not to get surrounded.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.Conjure,"Master Conjurer" +KDLoreLabelen.Conjure,"Conjurer" +KDLoreTexten.mummy,"Danger Level: High|They appear to be influential figures in the ancient Bast cult. Not only are they able to wield explosive magics, they can conjure magical wrappings at close range.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.mummy,"Bast Mummy" +KDLoreLabelen.mummy,"Mummy" +KDLoreTexten.meleecleric,"Danger Level: Medium|Worshippers of the Cat Goddess. Devoted to the sole task of defending the tombs from outsiders, they are rarely willing to negotiate. Some maintain peak physical prowess, while others can even cast spells.||-Denizens of the Dungeon by Catherine Willows" +KDLoreTitleen.meleecleric,"Bast Clerics" +KDLoreLabelen.meleecleric,"Mummy" +RestraintBreastplate,"Breastplate" +RestraintBreastplateDesc,"Rock-solid and form-fitting." +RestraintBreastplateDesc2,"Provides minor protection against enemy attacks. Decreases stealth." +RestraintBreastplateCommon,"Breastplate" +RestraintBreastplateCommonDesc,"Rock-solid and form-fitting." +RestraintBreastplateCommonDesc2,"Provides minor protection against enemy attacks. Decreases stealth." +RestraintBustier,"Adventuring Corset" +RestraintBustierDesc,"Protects your organs and your sense of style." +RestraintBustierDesc2,"Provides minor protection against enemy attacks at the cost of flexibility." +RestraintBustierCommon,"Adventuring Corset" +RestraintBustierCommonDesc,"Protects your organs and your sense of style." +RestraintBustierCommonDesc2,"Provides minor protection against enemy attacks at the cost of flexibility." +RestraintSwimsuit,"Swimsuit" +RestraintSwimsuitDesc,"The best uniform. Has a (lockable) zipper in the back for convenience!" +RestraintSwimsuitDesc2,"Removes excess clothing and adds +10 Evasion. +20 Soap and Glue resist, and being drenched dries faster." +RestraintSwimsuitCommon,"Swimsuit" +RestraintSwimsuitCommonDesc,"The best uniform. Has a (lockable) zipper in the back for convenience!" +RestraintSwimsuitCommonDesc2,"Removes excess clothing and adds +10 Evasion. +20 Soap and Glue resist, and being drenched dries faster." +RestraintRobeOfChastity,"Robe of Chastity" +RestraintRobeOfChastityDesc,"A magical leotard whose power stems directly from the divine. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it." +RestraintRobeOfChastityDesc2,"It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire." +RestraintRobeOfChastityCommon,"Robe of Chastity" +RestraintRobeOfChastityCommonDesc,"A magical leotard whose power stems directly from the divine. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it." +RestraintRobeOfChastityCommonDesc2,"It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire." +RestraintChainTunic,"Chainmail Tank Top" +RestraintChainTunicDesc,"Cumbersome, but effective!" +RestraintChainTunicDesc2,"Provides +10 armor and protection against enemy attacks. Decreases stealth/evasion and makes struggling harder." +RestraintChainTunicCommon,"Chainmail Tank Top" +RestraintChainTunicCommonDesc,"Cumbersome, but effective!" +RestraintChainTunicCommonDesc2,"Provides +10 armor and protection against enemy attacks. Decreases stealth/evasion and makes struggling harder." +RestraintChainBikini,"Chainmail Bikini" +RestraintChainBikiniDesc,"Covers the important bits, anyway." +RestraintChainBikiniDesc2,"+20 Bondage Resist. Conducts electricity." +RestraintChainBikiniCommon,"Chainmail Bikini" +RestraintChainBikiniCommonDesc,"Covers the important bits, anyway." +RestraintChainBikiniCommonDesc2,"+20 Bondage Resist. Conducts electricity." +RestraintSteelArmor,"Light Plate Armor" +RestraintSteelArmorDesc,"Knight in shining rest-err, armor!" +RestraintSteelArmorDesc2,"Provides +5 armor and high protection. No impact to stealth or evasion" +RestraintSteelArmorCommon,"Light Plate Armor" +RestraintSteelArmorCommonDesc,"Knight in shining rest-err, armor!" +RestraintSteelArmorCommonDesc2,"Provides +5 armor and high protection. No impact to stealth or evasion" +RestraintMageArmor,"Wizard's Robe" +RestraintMageArmorDesc,"I have the power!" +RestraintMageArmorDesc2,"+30% spell damage and +10 spell ward" +RestraintMageArmorCommon,"Wizard's Robe" +RestraintMageArmorCommonDesc,"I have the power!" +RestraintMageArmorCommonDesc2,"+30% spell damage and +10 spell ward" +RestraintSteelSkirt2,"Chain Skirt" +RestraintSteelSkirt2Desc,"A defensive garment providing optimal coverage to the lower torso." +RestraintSteelSkirt2Desc2,"Provides medium protection. No impact to stealth or evasion" +RestraintSteelSkirt2Common,"Chain Skirt" +RestraintSteelSkirt2CommonDesc,"A defensive garment providing optimal coverage to the lower torso." +RestraintSteelSkirt2CommonDesc2,"Provides medium protection. No impact to stealth or evasion" +RestraintSteelSkirt,"Armored Skirt" +RestraintSteelSkirtDesc,"Knight in shining rest-err, armor!" +RestraintSteelSkirtDesc2,"Provides +5 armor and high protection. No impact to stealth or evasion" +RestraintSteelSkirtCommon,"Armored Skirt" +RestraintSteelSkirtCommonDesc,"Knight in shining rest-err, armor!" +RestraintSteelSkirtCommonDesc2,"Provides +5 armor and high protection. No impact to stealth or evasion" +RestraintGauntlets,"Gauntlets" +RestraintGauntletsDesc,"Gloves with an iron grip." +RestraintGauntletsDesc2,"Provides +5 armor and minor protection against enemy attacks. Makes noise when attacking." +RestraintGauntletsCommon,"Gauntlets" +RestraintGauntletsCommonDesc,"Gloves with an iron grip." +RestraintGauntletsCommonDesc2,"Provides +5 armor and minor protection against enemy attacks. Makes noise when attacking." +RestraintLeatherGloves,"Leather Gloves" +RestraintLeatherGlovesDesc,"Protecting you in style." +RestraintLeatherGlovesDesc2,"Provides minor protection against enemy attacks." +RestraintLeatherGlovesCommon,"Leather Gloves" +RestraintLeatherGlovesCommonDesc,"Protecting you in style." +RestraintLeatherGlovesCommonDesc2,"Provides minor protection against enemy attacks." +RestraintBracers,"Steel Pauldrons" +RestraintBracersDesc,"Dependable protection for the average adventurer." +RestraintBracersDesc2,"Provides minor protection against enemy attacks." +RestraintBracersCommon,"Steel Pauldrons" +RestraintBracersCommonDesc,"Dependable protection for the average adventurer." +RestraintBracersCommonDesc2,"Provides minor protection against enemy attacks." +RestraintCape,"Ranger's Cape" +RestraintCapeDesc,"Inbued with the powers of moss and ferns and stuff." +RestraintCapeDesc2,"+25 Evasion. Increases stealth slightly." +RestraintCapeCommon,"Ranger's Cape" +RestraintCapeCommonDesc,"Inbued with the powers of moss and ferns and stuff." +RestraintCapeCommonDesc2,"+25 Evasion. Increases stealth slightly." +RestraintMagicArmbands,"Oracle's Armbands" +RestraintMagicArmbandsDesc,"Armbands made of a slightly magical material." +RestraintMagicArmbandsDesc2,"+5% spell damage. +5 Magic Armor." +RestraintMagicArmbandsCommon,"Oracle's Armbands" +RestraintMagicArmbandsCommonDesc,"Armbands made of a slightly magical material." +RestraintMagicArmbandsCommonDesc2,"+5% spell damage. +5 Magic Armor." +RestraintSteelBoots,"Armored Boots" +RestraintSteelBootsDesc,"Noisy, but fashionable!" +RestraintSteelBootsDesc2,"Provides +5 armor and protection against enemy attacks. Decreases stealth." +RestraintSteelBootsCommon,"Armored Boots" +RestraintSteelBootsCommonDesc,"Noisy, but fashionable!" +RestraintSteelBootsCommonDesc2,"Provides +5 armor and protection against enemy attacks. Decreases stealth." +RestraintLeatherBoots,"Hide Boots" +RestraintLeatherBootsDesc,"For stepping into all kinds of trouble!" +RestraintLeatherBootsDesc2,"Provides minor protection against enemy attacks." +RestraintLeatherBootsCommon,"Hide Boots" +RestraintLeatherBootsCommonDesc,"For stepping into all kinds of trouble!" +RestraintLeatherBootsCommonDesc2,"Provides minor protection against enemy attacks." + +KDGenMap,Generating Map... + +KinkyDungeonSpellHexWrappingDamage,Mystic wrappings constrict around your body! +KinkyDungeonSpellOneBarMissile,One Bar Missile + +KDTut_Cut,You'll need a sharp object to cut items. Look for a knife or a piece of scrap on the floor. +KDTut_CutCrack,"If you can't get your knife into place, try sitting next to a crack on the wall." +KDTut_CutCrack2,"Your character will automatically try to lodge the knife into the wall." +KDTut_CutMagic,"You'll need to find a cutting weapon with the magic tag to cut magic items." +KDTut_CutMagicHas,"You need to equip your magic cutting weapon to cut magic items." +KDTut_Surr,You can surrender in the menu if you want to be treated more gently. + +KDTut_HelpGhost,That ghost looks less aggressive than the others. Maybe she can help? +KDTut_HelpAlly,Need help? Try asking a neutral NPC for assistance! + +KDTut_TeleCrit,You flanked the enemy! Now attack its weak point for massive damage! +KDTut_Vulnerable2,Enemies that miss an attack become vulnerable for a turn. +KDTut_Vulnerable,Attack them for a guaranteed critical hit! +KDTut_Dodge,before the attack lands! You can tell the difference by the border of the tiles. +KDTut_Dodge2,"Enemy attacks take time to hit. Make sure to step out of the warning tiles," +KDTut_Projec,You can dodge out of the way of most projectiles. Avoid the marked tiles. +KDTut_Charge,'Charge' is a unified ammunition for all of your weapons. Recharge it with ancient crystals. +KDTut_Charge2,"Spent crystals can slot into some light fixtures to recharge them, but it requires 100 gold." +KDTut_Elevator,"There is an elevator in this room, but it won't function until you defeat major enemies on this level." +KDTut_Bondage,"If you can't escape from a restraint, try offering gold at a shrine devoted to its goddess." + +KDTut_WPOnKill2,Defeating enemies recovers some willpower. +KDTut_WPOnKill,"Temporary enemies and summons don't restore anything, however." +KDTut_Capture2,"Attacking a helpless enemy captures her and sends her to your Collection." +KDTut_Capture,"You can access the Collection in the Items screen, 2nd tab." + +KinkyDungeonSpellMakeEssenceMote,Conjure Essence Mote +KinkyDungeonSpellDescriptionMakeEssenceMote,Spend 50 DP to conjure a mote of pure spell essence. The mana cost of this spell is decreased based on your maximum DP.|Can only be cast while you have less than 100% DP. +KinkyDungeonSpellCastMakeEssenceMote,You channel your distraction into a tangible orb! +KinkyDungeonSpellFailMakeEssenceMote,You don't have enough distraction! +KinkyDungeonSpellNoRoomMakeEssenceMote,Choose an open space. +KinkyDungeonSpellTargetMakeEssenceMote,Choose a tile with no existing mote. +KinkyDungeonSpellTooDistractedMakeEssenceMote,You're too distracted to concentrate your distraction! + +KDDistractionBurstEffect,The burst of desire overwhelms you! + +KinkyDungeonSpellPsychicLink,Psychic Link +KinkyDungeonSpellDescriptionPsychicLink,"Deals 20 Psychic damage, then creates a psychic link between you and a single target for 50 turns, splitting distraction gain between the two of you. Requires that you and the target be able to see each other." +KinkyDungeonSpellTargetPsychicLink,Target a non-blinded enemy. +KinkyDungeonSpellCastPsychicLink,"You briefly lock eyes with the target, forming a psychic link!" +KDPsychicLinkBreak,"The psychic link ends between you and the ENMY." + +KinkyDungeonSpellShockCollar,Shock Collar +KinkyDungeonSpellDescriptionShockCollar,"Condense your aroused thoughts into stimulating electricity, consuming 30 DP to zap anyone that's currently holding your leash for 40 e-stim damage. 25% chance to stun for a long time, otherwise stuns briefly. Subsequent uses cost 2x the DP." +KDShockCollarNotLeashed,You must be leashed by someone to use this. +KDShockCollarNoDistraction,You don't have enough distraction. +KDShockCollarHit,You zap your leasher! + +KinkyDungeonBuffPsychicLink,You are psychically connected! +KinkyDungeonBuffShockCollarCD,You've used Shock Collar recently and it costs more DP. + + +RestraintEssenceNecklace,Essence Crystal +RestraintEssenceNecklaceDesc,"When you miscast, 50% chance to emit a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time." +RestraintEssenceNecklaceDesc2,"A necklace designed for mages who are novices or easily distracted. It helps recover magical essence lost during miscast." +KinkyDungeonInventoryItemEssenceNecklace,Potion Absorber +KinkyDungeonInventoryItemEssenceNecklaceDesc,"When you miscast, the necklace emits a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time." +KinkyDungeonInventoryItemEssenceNecklaceDesc2,"A necklace designed for mages who are novices or easily distracted. It helps recover magical essence lost during miscast." + +KDSealSigilContact,You erase the seal sigil. +KDEssenceMoteContact,"You absorb the mote, granting miscast reduction." +KDEssenceNecklaceCreate,Your necklace emits a mote as a result of miscasting. + +KDManaBurstActivate,"Your distraction reaches a critical point! -100% miscast chance." +KinkyDungeonSpellManaBurst,"Mana Burst" +KinkyDungeonSpellDescriptionManaBurst,"While at 100% distraction, you gain -100% miscast chance, but spending too much mana at once may cause you to go over the edge." +KinkyDungeonBuffManaBurst,"-100% miscast chance, but casting spells can send you over the edge." +KDOrgasmPsychicLinkAttempt,"The psychic link conducts away some of the intensity..." +KDOrgasmPsychicLinkEnemy,"Your linked target lets go of herself, transmitting a wave of pleasure to yourself..." + +KDOutpostName,FCTN RMTPE +KDLairName,PTRN's RMTPE + +KDLeadsTo,Leads to PLCE +KDUnknown,??? + +rWardenCourier,"(You find a girl clad in a pink catsuit and restrained with straps.)|(She wears a backpack with a note attached to it.)|'My pet here can pick up and deliver restraints for you~'|'Try opening the Facilities tab and depositing restraints!'|'Signed: Your Loyal Warden'" + +KinkyDungeonDragonLairDefeat1,It becomes hard to resist the dragon's fury... +KinkyDungeonDragonLairDefeat2,The dragon overwhelms you with sheer force... +KinkyDungeonDragonLairDefeat3,Your strength begins to fade... + +KDMinimapLabel_Ghost,Ghost +KDMinimapLabel_Orb,Orb +KDMinimapLabel_S,>Entrance +KDMinimapLabel_s,>Exit +KDMinimapLabel_H,>Stairs +KDMinimapLabel_ShrineQuest,Quest(GDSNM) +KDMinimapLabel_Shrine,[GDSNM] +KDMinimapLabel_+,"" +KDMinimapLabel_=,"" +KDMinimapLabel_Bed,Bed! +KDMinimapLabel_BedFail,Bed +KDMinimapLabel_Tablet,Tablet +KDMinimapLabel_C_undefined,Chest +KDMinimapLabel_C_chest,Chest +KDMinimapLabel_C_silver,Silver +KDMinimapLabel_C_gold,Gold +KDMinimapLabel_C_lessergold,Gold +KDMinimapLabel_C_shadow,Shadow +KDMinimapLabel_C_lessershadow,Shadow +KDMinimapLabel_C_kitty,Kitty +KDMinimapLabel_C_wizard,Chest +KDMinimapLabel_C_robot,Mecha +KDMinimapLabel_C_pearl,Holy +KDMinimapLabel_C_storage,Chest +KDMinimapLabel_C_blue,Blue +KDMinimapLabel_C_tutorial1,chest +KDMinimapLabel_C_magicWeapon,Chest +KDMinimapLabel_C_pair,Chest +KDMinimapLabel_C_lost_items,Lost Items +KDMinimapLabel_C_cache,Cache +KDMinimapLabel_C_magicrestraint,Chest +KDMinimapLabel_C_,Chest +KDMinimapLabel_C_kinky,Toy Chest +KDMMLocked,"(L)" + + +rPrisonerLatex,"(The SPEAKER sits encased in skintight rubber up to her nose.|Though the latex over her mouth is smooth and flat,|you know from her whimpering moans that her mouth|is totally filled with a gag, useless like the rest of her body.|Some sort of stand affixes her to the floor.)" +rPrisonerLatexNoKeys,"(You don't have any solvents that work on latex)" +rPrisonerLatexUnlockHandsBound,"(You can't help her, bound as tightly as you are...)" +rPrisonerLatexUnlockSlow,"(You dissolve her restraints, fumbling around for a while with your bound hands)" +rPrisonerLatexUnlock,"(You rescue the SPEAKER)|Thank you!|Let's get out of here!" +rPrisonerLatexUnlockGagged,"(You rescue the SPEAKER)|Mmmmph!|(She wants to keep her gag...)" +rPrisonerLatexNoCut,"(You are not holding a cutting tool)" +rPrisonerLatexCutHandsBound,"(You can't pick the lock with your hands bound)" +rPrisonerLatexCutSlow,"(You cut her restraints, fumbling around for a while with your bound hands)" +rPrisonerLatexCut,"(After a while, you free the SPEAKER)|Thank you!|Let's get moving!" +rPrisonerLatexCutGagged,"(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...)" +rPrisonerLatexWordNoMana,"(You don't have enough mana for Remove Slime)" +rPrisonerLatexWordNoSpeak,"(Try as you might, your mouth is sealed tight)" +rPrisonerLatexWord,"(You utter a word of release to free the SPEAKER)|Many thanks!|Let's go!" +rPrisonerLatexWordGagged,"(You utter a word of release to free the SPEAKER)|Mmmmph!|(She locks her gag back on...)" + +dPrisonerLatex_Unlock,Dissolve the latex with a SLVNT +dPrisonerLatex_Cut,Cut her out with a sharp tool +dPrisonerLatex_Word,Use Remove Slime to unlock her + +KDLocalSaves,Local Saves +KDCloudSaves,Cloud Saves + +KDLatexSolvent,solvent + +RestraintLatexDollStand,Latex Doll Stand +RestraintLatexDollStandDesc,"A stand for your latex dolls, coated in a smooth rubber coating." +RestraintLatexDollStandDesc2,"Has a flange for propping up even dolls wearing chastity belts." + + +rStripSearch,"(The SPEAKER strokes a hand over your body)|It looks like you're carrying some dangerous goods.|Prisoners shouldn't be carrying what doesn't belong to them~" +rStripSearchSub,"(The SPEAKER folds her hands together)|Miss, I was instructed to make sure you don't have|anything dangerous. I'm going to search you now." +rStripSearchDom,"(The SPEAKER looks at you plainly)|Did you think you were going to sneak in with all of that?" +rStripSearchBrat,"(The SPEAKER smiles)|Let's see, what loot do we have here...|(SPEAKER is going to search you)" +rStripSearchRobot,"(The SPEAKER scans you with a red light)|Enumerating contraband...|Please comply for removal." +dStripSearch_Accept,"Yes, miss... (Begin search and confiscation)" +dStripSearch_AcceptGag,"Mmph... (Nod politely) (Begin search and confiscation)" +dStripSearchDeny,"No, I refuse! (Fight)" +dStripSearchDenyGag,"Mmph! (Shake your head and fight)" + +KDTextGrayNeedWP,Option not available at 0 WP + +rStripSearchAccept_1,"(The SPEAKER starts by removing most of your clothes...)" +rStripSearchAccept_1_2,"(Next, the SPEAKER looks through your weapons)" +rStripSearchAccept_1_2_3,"(Finally, the SPEAKER opens the rest of your bag)" +rStripSearchAccept_1_2_3_End,"(The search is complete)|There! Now let's get you situated~" +rStripSearchAccept_1_2_3_EndSub,"(The search is complete)|Alright miss, please behave, okay?" + + + +KDItemConfiscated,Confiscated AMNTx ITMN! +KDItemNotConfiscated,Kept AMNTx ITMN. +KDItemNotConfiscatedSneak,Sneaked in AMNTx ITMN! + +KinkyDungeonSpellAim_MaidKnightLight,GUN +KinkyDungeonSpellCastAim_MaidKnightLight,The room echoes with the sound of a rubber bullet being fired! + +KinkyDungeonSpellRubberSniper,Tactical Rubber Bullet +KinkyDungeonRubberSniper,A powerful rubber bullet bounces you to the ground! +KinkyDungeonRubberSniperAttach,The powerful rubber bullet knocks you down and congeals into Capture Foam! + + + +RestraintCaptureFoamBoots,Capture Foam (Feet) +RestraintCaptureFoamBootsDesc,"A sticky foam that spreads quickly and hardens into a tight rubbery layer." +RestraintCaptureFoamBootsDesc2,"A knife won't cut it, it simply reforms around the cut." +RestraintCaptureFoamFeet,Capture Foam (Ankles) +RestraintCaptureFoamFeetDesc,"A sticky foam that spreads quickly and hardens into a tight rubbery layer." +RestraintCaptureFoamFeetDesc2,"A knife won't cut it, it simply reforms around the cut." +RestraintCaptureFoamLegs,Capture Foam (Legs) +RestraintCaptureFoamLegsDesc,"A sticky foam that spreads quickly and hardens into a tight rubbery layer." +RestraintCaptureFoamLegsDesc2,"A knife won't cut it, it simply reforms around the cut." +RestraintCaptureFoamArms,Capture Foam (Arms) +RestraintCaptureFoamArmsDesc,"A sticky foam that spreads quickly and hardens into a tight rubbery layer." +RestraintCaptureFoamArmsDesc2,"A knife won't cut it, it simply reforms around the cut." +RestraintCaptureFoamHands,Capture Foam (Hands) +RestraintCaptureFoamHandsDesc,"A sticky foam that spreads quickly and hardens into a tight rubbery layer." +RestraintCaptureFoamHandsDesc2,"A knife won't cut it, it simply reforms around the cut." +RestraintCaptureFoamMouth,Capture Foam (Mouth) +RestraintCaptureFoamMouthDesc,"A sticky foam that spreads quickly and hardens into a tight rubbery layer." +RestraintCaptureFoamMouthDesc2,"A knife won't cut it, it simply reforms around the cut." +RestraintCaptureFoamHead,Capture Foam (Head) +RestraintCaptureFoamHeadDesc,"A sticky foam that spreads quickly and hardens into a tight rubbery layer." +RestraintCaptureFoamHeadDesc2,"A knife won't cut it, it simply reforms around the cut." +RestraintCaptureFoamCollar,Capture Foam Dispenser +RestraintCaptureFoamCollarDesc,"This collar is designed to make sure its wearer does not escape at all costs." +RestraintCaptureFoamCollarDesc2,"It will occasionally cause Capture Foam to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of Capture Foam you have on you." + + +RestraintHardCaptureFoamRaw,Tactical Rubber +RestraintHardCaptureFoamRawDesc,"An alchemical substance made to be stretchy and more resilient than natural rubber." +RestraintHardCaptureFoamRawDesc2,"Developed by kinky alchemists and marketed to PMCs across the islands." + +RestraintCaptureFoamRaw,Capture Foam +RestraintCaptureFoamRawDesc,"A restraining weapon used to apprehend difficult targets." +RestraintCaptureFoamRawDesc2,"Developed by kinky alchemists and marketed to PMCs across the islands." + +RestraintHardCaptureFoamBoots,Tactical Rubber (Feet) +RestraintHardCaptureFoamBootsDesc,"The end result of capture foam. Strict. Sustainable. Affordable." +RestraintHardCaptureFoamBootsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." +RestraintHardCaptureFoamFeet,Tactical Rubber (Ankles) +RestraintHardCaptureFoamFeetDesc,"The end result of capture foam. Strict. Sustainable. Affordable." +RestraintHardCaptureFoamFeetDesc2,"There's no struggling out now, but since it's solid it may be cuttable." +RestraintHardCaptureFoamLegs,Tactical Rubber (Legs) +RestraintHardCaptureFoamLegsDesc,"The end result of capture foam. Strict. Sustainable. Affordable." +RestraintHardCaptureFoamLegsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." +RestraintHardCaptureFoamArms,Tactical Rubber (Arms) +RestraintHardCaptureFoamArmsDesc,"The end result of capture foam. Strict. Sustainable. Affordable." +RestraintHardCaptureFoamArmsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." +RestraintHardCaptureFoamHands,Tactical Rubber (Hands) +RestraintHardCaptureFoamHandsDesc,"The end result of capture foam. Strict. Sustainable. Affordable." +RestraintHardCaptureFoamHandsDesc2,"There's no struggling out now, but since it's solid it may be cuttable." +RestraintHardCaptureFoamMouth,Tactical Rubber (Mouth) +RestraintHardCaptureFoamMouthDesc,"The end result of capture foam. Strict. Sustainable. Affordable." +RestraintHardCaptureFoamMouthDesc2,"There's no struggling out now, but since it's solid it may be cuttable." +RestraintHardCaptureFoamHead,Tactical Rubber (Head) +RestraintHardCaptureFoamHeadDesc,"The end result of capture foam. Strict. Sustainable. Affordable." +RestraintHardCaptureFoamHeadDesc2,"There's no struggling out now, but since it's solid it may be cuttable." +RestraintHardCaptureFoamCollar,Tactical Rubber Collar +RestraintHardCaptureFoamCollarDesc,"This collar is designed to make sure its wearer does not escape their rubber." +RestraintHardCaptureFoamCollarDesc2,"It will occasionally cause tactical rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you." + + +KinkyDungeonSpellHeavySlash,Sweeping Strike +KinkyDungeonSpellSelfCharge,Headlong Rush + + +NameMaidKnightLight,Maid Squire +NameMaidKnightHeavy,Maid Knight +KillMaidKnightLight,You humiliate the Maid Squire! +KillMaidKnightHeavy,You defeat the Maid Knight! For now... she swears revenge. +AttackMaidKnightLightBind,The Squire zips you up in comfy leather gear! +AttackMaidKnightHeavyBind,The Maid Knight places you in strict bondage! +AttackMaidKnightLightLock,The Squire secures your restraints! +AttackMaidKnightHeavyLock,The Maid Knight secures your restraints! +AttackMaidKnightLight,The Squire dusts you with her duster plug. +AttackMaidKnightHeavy,The Maid Knight sweeps you with her cleaning halberd! + +KDMaidKnightRetreat,The EnemyName retreats! +KDMaidKnightRetreatBound,The EnemyName manages to squirm out of sight! + + +KDAmbSound_ServerHum,servers humming... +KDAmbSound_Slime,bouncy noises +KDAmbSound_SlimeLarge,goopy noises +KDAmbSound_SlimeLarge2,bubbling noise +KDAmbSound_Rubber,rubber squeaking +KDAmbSound_ServerAlarm,blaring siren + +ItemPickupSweeper,"You claim the Sweeper." +KinkyDungeonInventoryItemSweeper,The Sweeper +KinkyDungeonInventoryItemSweeperDesc,"Foe of the unclean. Bringer of neat and tidy workspaces." +KinkyDungeonInventoryItemSweeperDesc2,"Deals slash damage. Also deals 30 tickle damage in an area. Has a ranged attack." +KinkyDungeonSpecialSweeper,Make a ranged attack with the Sweeper. + +ItemPickupPersuader,"You claim the Persuader." +KinkyDungeonInventoryItemPersuader,The Persuader +KinkyDungeonInventoryItemPersuaderDesc,"Military forces sought a solution with higher stopping power after the Great Work made brute force obsolete. Capture Foam rounds are now the standard." +KinkyDungeonInventoryItemPersuaderDesc2,"Equipped with a duster plug, it deals tickle damage on melee. Can fire a high caliber rubber bullet to deal 80 glue damage from a distance. Takes 3 turns to reload." +KinkyDungeonSpecialPersuader,Make a ranged attack with the Persuader for 25 charge. Deals 80 glue damage. + +KinkyDungeonSpellPlayerRubberSniper,Persuader Round +KinkyDungeonSpellCastPlayerRubberSniper,You fire the Persuader! + +KDUnknown,??? +KDSaveBusy,Wait for current save to finish... + +KDSaveBusyMenu,"Please wait for save to finish..." + +KinkyDungeonSpelldebugDefeat,"Debug Defeat" +KinkyDungeonSpellCastdebugDefeat,"You cast devastating ASCII glyphs!" +KinkyDungeonSpelldebugBind,"Debug Bind" +KinkyDungeonSpellCastdebugBind,"You cast bondage ASCII glyphs!" + +KDEmpty,Empty Slot +KDFloor,", Floor AMNT" + +KDInventoryActionRecolor,Recolor + +KDAutoRelease_NonNotable,"Only collect notable" +KDAutoRelease_Escaped,"Autorelease escaped" + +KDAutoReleased_NonNotable,NME is not notable enough for your collection. +KDAutoReleased_Escaped,Auto-released NME due to Escape. + +KDMimicCurseTransform,Your ITMN1 was cursed and transforms into a ITMN2! + +KDDelayedAction_EquipRestraint,Equipping Restraint... +KDDelayedAction_Armor,Equipping Armor... +KDDelayedAction_Consumable,Using Consumable... +KDDelayedAction_Struggle,Struggling... + +KDMimicCleanse,The ITMN1 is purified and returns to being a ITMN2! +KDInvTooltip_MimicHolyGlow,Reverts if purified with item. +KDInvTooltip_SkimpyCurse,...smaller than expected. +KDInvTooltip_ShibariCurse,Comes with an artistic flair. + +KDWToolsButton1,Set Pivot +KDWToolsButton2,"Toggle click & drag" +KDWToolsButton3,Settings +KDWToolsToggleScrollModeText,"Scroll Controls: " +KDWToolsLayerAbbrText,"Layer Text: " \ No newline at end of file diff --git a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_CN.txt b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_CN.txt index 115479051..925c42610 100644 --- a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_CN.txt +++ b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_CN.txt @@ -1,19 +1,25 @@ +By Strait-Laced Games +由 Strait-Laced Games 呈现 + + Credits -致谢(素材) +贡献者 Patrons -致谢(资助者) +赞助者 News and Updates 新闻和更新 Support @ Patreon -资助@Patreon -Thank you to the following awesome people for supporting me at :|Alexthymia (for CN translation!)|Song (bound enemy graphics!)|cyberjoel|Samantha Lear|Kara|The-Fisher-King|selly-grim|Dex♪|Churro|Gamefan|Shogo|X27|Blox|Slacker|Nikos S.|WATA|Flame|Alexis Octavia|Finn|Dmitri S.|Noxgarm|Siegfried K.|Hellgete -感谢以下杰出的人在中支持我:|Alexthymia (for CN translation!)|Song (bound enemy graphics!)|cyberjoel|Samantha Lear|Kara|The-Fisher-King|selly-grim|Dex♪|Churro|Gamefan|Shogo|X27|Blox|Slacker|Nikos S.|WATA|Flame|Alexis Octavia|Finn|Dmitri S.|Noxgarm|Siegfried K.|Hellgete +赞助@Patreon +Thank you to the following awesome people for supporting me at patreon.com/ada18980 +感谢以下用户在 patreon.com/ada18980 上慷慨赞助了我 Back 后退 Next -下一个 -Audio:|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi|Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz -音频:|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi|Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz +下一页 +Music: kocaeli, Darkstar Studios|Bound enemy graphics: Song|RU Translation: Osiris|CN Translation: Alexthymia, Mitki, Timeline|KR, JP Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Art: Kjus, Quakehoof, Lumpychan, Kertasu, Koirin, Lightning Rook, Daikinbakuju, Sigma Overlord, dask3|Plasmadragon, GoldieKitsune, SMoonlightM, PureWind, Wyatt Wintersoul|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi +音乐: kocaeli, Darkstar Studios|Bound enemy graphics: Song|RU Translation: Osiris|CN Translation: Alexthymia, Mitki, Timeline|KR, JP Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Art: Kjus, Quakehoof, Lumpychan, Kertasu, Koirin, Lightning Rook, Daikinbakuju, Sigma Overlord, dask3|Plasmadragon, GoldieKitsune, SMoonlightM, PureWind, Wyatt Wintersoul|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi +### Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|AlaskaRobotics - duct tape unroll 3, duct tape unroll 1|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators + Language 语言 English @@ -22,262 +28,1742 @@ Chinese 简体中文 Korean 韩语 +Japanese +日语 +Spanish +西班牙语 +French +法语 +Russian +俄语 +Mods +模组 Mods Loaded. -已加载 Mods -Kinky Dungeon v3.91 -变态地牢 v3.91 +模组已载入 + + +Version +版本号 +Kinky Dungeon +淫荡地牢 +By Ada18980 +由 Ada18980 制作 You are an adventurer descending into an ancient underground city of magic. -你是一个冒险家,前往了一个古老的地下魔法城市。 +你是一名冒险家,前往了一个古老的地下魔法城市探险。 Beneath its depths lies the Mistress' Staff, an artifact of untold power. -在它的深处隐藏着女主人的法杖,这是一件拥有无穷力量的神器。 +在它的深处隐藏着女主人的法杖,一件拥有无穷力量的神器。 Will you prevail against forces unknown, or succumb to its dark secrets? 你会战胜未知的力量,还是屈服于它的黑暗秘密? -(This game does not contain spiders or any carnivorous creatures/plants) -(本游戏不包含蜘蛛或任何食肉生物/植物) -(Check out the latest standalone version at the deviantart link below!) -(在下面的 deviantart 链接中查看最新的独立版本!) -Enable Sounds -启用声音 -Enable Drool/Tears -启用流口水/眼泪 +(This game does not contain spiders) +( 本游戏中没有蜘蛛 ) + + +GFX +图像特效 +Character +角色 +Main +主要 +UI +界面 +Controls +控制 +Keybindings +按键绑定 + + +Show Enemy Binding as % +敌方捆绑显示为百分比 +Auto-wait Through Delayed Actions +自动等待通过延迟操作 + + +Show Minimap Labels +显示小地图标签 +Auto loot all from chests +自动从箱子中拾取所有物品 +Use Palette regardless of Outfit +无论衣着如何,都可以使用调色板。 + + +Apply palettes to Restraints +将调色应用于束缚 +Apply palettes to transforms +将调色应用于变化 + + +Don't use character palette +不使用角色调色板 +Always use character palette +始终使用角色调色板 +Use character palette for default outfit +默认装备使用角色调色板 + + +Show Background Art +显示背景 +Experimental Rendering (unstable) +实验渲染(不稳定) + + +Mute when Minimized +最小化时静音 +Show DP instead of % +显示具体的性奋值 +Quick Inv only equips to self +快速背包物品仅对自己使用 +Override Outfit when Loading Save +加载存档时覆盖服装 +Save Outfits within Save Files +将服装数据附加到存档内 +Show free characters on map +在地图上显示自由的角色 +Detailed jailed NPCs (experimental) +被监禁的 NPC 细节 ( 实验性 ) +Show Struggle Bars +显示挣脱进度 +Allow Suspicious Mods +允许可疑模组 +Auto Load Mods (offline only) +自动加载模组 ( 仅离线版 ) +Classic Inventory Background +古典物品页面背景 +Skip Intro +跳过序言 +No Forced Greetings +不强迫问候 +Show Zoom Buttons +显示缩放按钮 +Show Restraint Info on Escape Hover +悬停在挣扎按钮时显示束缚信息 +Always Show Warnings +总是显示警告 +Always Show Minimap +总是显示小地图 +Enable Sound +启用音效 +Drool/Tears +流口水/眼泪 +Draw Armor +渲染盔甲 +Enable Music +启用音乐 +Async Rendering (beta) +异步渲染 ( 测试版 ) +Bloom & Glow +曝光 & 发光 +Transparent UI +透明 UI +Turn Counter +回合计数器 +Flash Screen on Stun +眩晕时闪屏 +Map Particles +地图粒子效果 +Distraction Particles +性奋粒子 +Vibration Particles +震动粒子 +Gag Particle FX +堵嘴粒子特效 +Show NPC Status +显示NPC状态 +Show Spell Range +显示法术范围 +Trim Edge Walls +对齐墙壁边缘 +Fog Shader +启用雾着色器 +Light Shader +启用灯光着色器 +Intense 'Let Go' VFX +强烈高潮视效 +Enable Toy SFX +高级玩具特效 Enable Fullscreen 启用全屏 +Hi-Res Distortion (Needs Restart) +高分辨率失真 ( 需重启 ) +Hi-Res Model (no restart needed) +高分辨率模型 ( 无需重启 ) High Quality Animations 高品质动画 -Draw Armor -绘制子弹 -Wait Quickly -快速等待 +Enemy Animations +敌人动画 +One-Click Move (when slowed) +单击移动 ( 当速度减慢时 ) +Latch Shift Key +冲刺按键模式切换 +Crotch Rope under panties +股绳显示在内裤之下 +Chastity over Panties +贞操带显示在内裤之上 +Chastity over Harness +贞操带显示在束衣之上 +Chastity Bra over Bras +贞操文胸显示在胸罩之上 +Simple Color Picker +简易取色器 +Center Player +玩家为中心 +Draw Buffs on Side +在屏幕一侧绘制增益效果 +Show Trajectory on Auto-Path +预览自动路径轨迹 +Show Player Facing +显示玩家朝向 +Show more learnable spells +显示更多可学习的法术 +Show Player Buff Auras +显示玩家增益光环 +Show Enemy Buff Auras +显示敌人增益光环 +Minimalist Enemy Auras +极简敌人光环 +Pixelated GFX (needs restart) +像素化图像特效 ( 需重启 ) +Auto-Crouch when Tripped +绊倒时自动蹲下 +Retro Animations +复古动画 +Flip Status Bars +状态条翻转显示 +Reduce Accidental Wall Clicks +减少意外点击墙壁的次数 +Enable Nipples +启用乳头 +Show Nipple Toys Over Bras +乳头玩具显示在胸罩之上 +Hide Nipple Clamps +隐藏乳头夹 +Hide Nipple Piercings +隐藏乳头穿孔 +Use default palette when no outfit is worn +当未穿着衣物时使用默认调色 +Flip Player Display +翻转玩家显示 +Grayscale when Blind +失明时视野变成黑白 +Faster Floater Fade +漂浮物更快消散 +No Damage Floaters +无伤漂浮物 +Dynamic Armor (must hide armor) +动态盔甲 ( 必须隐藏盔甲 ) +Hide floating weapon display +隐藏浮动武器显示 +Automatically Take All from Chests +自动从箱子中全部拿走 Helpless! 无助! Evaded! 闪避! Blocked! -阻挡! +格挡! +Resisted Bondage! +反抗束缚! + + You bump into a wall. 你撞到了一堵墙。 + + +Game Resolution: +游戏分辨率 :‎ +Resolution (needs reload): +分辨率 ( 需要重载 ) :‎ Toy Volume: -玩具音量: +玩具音量 :‎ Music Volume: -音乐音量: -Animation Speed: -动画速度: -Save my current progress. -保存当前进度 -Give up & delete save -放弃并删除存档 -Yes,jail me! -是的,囚禁我 -Yes,delete my save file! -是的,删除我的存档文件! -See Perks -查看技能 +音乐音量 :‎ +SFX Volume: +特效音量 :‎ +Animation Time: +动画时间 :‎ +Map Brightness: +地图亮度 :‎ +Game Font: +游戏字体 :‎ +Button Font: +按钮字体 :‎ +### Journey + Select a journey. This will determine the ordering of game areas. 选择旅程。这将决定游戏区域的顺序。 Standard: The intended experience -标准:预期体验 +标准: ‎预期体验 Random: A chaotic journey -随机:混乱的旅程 +随机: ‎混乱的旅程 Harder: A more difficult journey -更难:更困难的旅程 -Select your character's background. You cannot change these in the future. -选择角色的背景。您将来无法更改这些。 -Advanced start (choose perks) -高级启动(选择额外选项) -Confirm and start playing! -确认并开始游戏! +更难: ‎更困难的旅程 + + Select perks to start with. 选择初始技能 Having 10+ spare points will trigger Hard Mode, granting unique loot. 可用积分大于10将进入困难模式,可获得独特的战利品 -(HARD MODE ENABLED) -(困难模式启用) + (HARD MODE ENABLED) +( 困难模式启用 ) +Advanced start (choose perks) +高级启动 ( 选择额外技能 ) +Kinky start +变态启动 +Normal start +正常启动 + + Point Cost: AMOUNT -积分成本:AMOUNT +点数消耗 : ‎AMOUNT Points Available: AMOUNT -可用积分:AMOUNT +可用点数 : ‎AMOUNT + + +Resilient Foes +顽强之敌 +Enemies have 30% more hp. +敌人的生命值增加 30%。 + + +Strong +强健 +Boosts the Struggle option when escaping. +提升挣扎效果。 +Helpless +虚弱 +You are physically weak. Struggling is much less effective. +你的身体虚弱,挣扎效果减弱。 + + +Flexible +灵活 +Slightly boosts the Remove/Unlock option, escaping is 1.5x as fast except picking, and your feet can use items/buckles. +略微加强移除/解锁束缚速度,除了撬锁之外,挣脱速度提升至 1.5 倍,并且你的脚可以使用物品/钩子。 +Inflexible +笨重 +You get a penalty to the Remove and Unlock action, and escaping is 0.75x as fast. +减慢移除/解锁束缚速度,挣脱速度降低至 0.75 倍。 + + +Locksmith +撬锁达人 +You get a bonus to lockpicking, allowing you to pick some high-security locks previously impossible. +你获得撬锁加成,并且允许撬一些以前不可能撬开的高安全性锁具。 +Clueless +撬锁新手 +You have no idea how to pick locks. Picking is 0.5x as fast and you can't pick most advanced locks. +你不知道如何撬锁,撬锁速度削弱至 0.5 倍,而且无法撬开最先进的锁具。 + + +Psychic +灵能 +You no longer drop keys and picks, can unlock yourself with bound hands, and don't need hands for items/potions. +你身上的钥匙和撬锁工具将不会掉落,可以用被束缚的手解锁自己,并且不需要手来使用物品/药水。 Novice -新手 +初学者 All spells above 1st level cost 2x as many spell points. 所有 1 级以上的法术花费 2 倍的法术点数。 + + Blessed 祝福 You can drink mana from the shrine fountains once per floor without chance of punishment. -您可以在每层第一次饮用神泉恢复法力时不可能受到任何惩罚。 +你在每层第一次饮用神泉恢复法力时不受到任何惩罚。 +Cursed +诅咒 +Goddess reputations can never exceed 25. +女神的声望永远不会超过25。 + + +Submissive +顺从者 +Your submissiveness starts at 100 and cannot go below 70. +开局顺从级别变为 100 ,并且在游戏中顺从级别不会低于 70。 +Wanted +通缉犯 +Your security level starts at 100 and cannot go below 70. +开局安全级别变为 100 ,并且在游戏中安全级别不会低于 70。 + + +Studious +学识渊博 +You start the game with +1 spell point. Your first two spell categories are free. +开局后技能点+1。可以不消耗技能点学习额外两个法术类别。 Meditation 冥想 You slowly regenerate mana, up to a maximum of 50. -你缓慢地恢复法力值,最多 50 点。 +你缓慢地恢复法力值 ,最多可恢复50 点。 + + Willpower 坚毅 -50% stamina drain from being at high arousal. 因为高潮流失的体力减少50%。 -Purity -纯洁 -You cannot play with yourself, but gain a flat 0.25 distraction decay per turn. -你不能自慰,但每回合干扰值会下降0.25。 -Unchaste -不贞的 -Your distraction decay is 0.25x while wearing a chastity belt instead of 0.5x. -佩戴贞操带时干扰值衰减为 0.25 倍,而不是 0.5 倍。 +Bondage Lover +束缚爱好 +Attempting to escape arouses you. +试图挣脱会提高你的性奋值。 + + +Focused Dodge +集中闪避 +While your miscast chance is 0%, you gain +40 Evasion. +施法失败率为 0% 时,闪避 +40。 +Distracted +心烦意乱 ++15% miscast chance (at all times) +增加 15% 施法失败几率 ( 始终 ) + + +Brawler +格斗大师 +Unarmed attacks deal +10 damage and being bound does not decrease unarmed damage. +徒手攻击额外造成10伤害并且被束缚不会减少徒手伤害。 + + +Way of the Squish +轻抚之手 +Unarmed attacks deal grope damage against humans. +徒手攻击会对人类造成抚摸伤害。 +Way of the Spank +疼痛之手 +Unarmed attacks deal pain damage against humans. +徒手攻击会对人类造成疼痛伤害。 +Way of the Feather +搔痒之手 +Unarmed attacks deal tickle damage against humans. +徒手攻击会对人类造成挠痒伤害。 + + +Harmless +手脚无力 +Unarmed attacks deal half damage and cost 2x as much stamina. +徒手攻击仅造成一半伤害并消耗 2 倍的体力。 + + +Clumsy +笨手笨脚 +0.7x base accuracy +基础命中率降至0.7倍。 + + +Unfocused +目光迷离 +Accuracy multiplied by 0.9x above 10% distraction, down to 0.6x at 90% distraction. +当性奋值超过10%时,命中率将降低至0.9倍,随性奋值的升高命中率将持续降低,最高在性奋值达到90%时降低至0.6倍。 + + +Focused Strikes +专注打击 +90% less accuracy penalty on swung weapons due to distraction. +减少 90% 由于分心而导致挥舞武器的准确度损失。 +Focused Power +专注力量 +90% less stamina cost penalty on staves and similar weapons distraction. +减少 90% 法杖和类似武器分心时所消耗的体力惩罚。 + + +Pristine +质朴 +There are significantly less shiny loot objects in the dungeon. +地牢高价值的战利品数量明显下降。 +Lost Technology +失落技术 +Ancient power cores break with use, and cannot be recharged. +远古的能量核心会随着使用而损坏,并且无法充能。 + + +Unchained +金属无碍 +Start with high Metal reputation, and all metal restraints are easier to escape from. +开局金属声望更高,所有金属拘束更容易逃脱。 +Damsel in Chains +铁链少女 +Metal restraints are harder to escape from. +金属拘束更难逃脱。 + + +Forgetful +健忘 +You don't remember where you've been in the level. 30 turn timer. +你不记得你在地牢中的位置,持续 30 回合。 + + +Cursed Locks +禁锢诅咒 +Those without keys shall face the Wrath of the Lock. Locked items cannot be cut and are harder to struggle. +没有钥匙的人将受到禁锢诅咒,锁住的物品不能被切割,且更难挣扎。 +The magical warding from the lock protects the item. +魔法锁保护着物品。 +Undeniable +无可争辩 +Born with an intense submissive desire, you cannot refuse bondage from dialogues. +你生来就有强烈的顺从欲望,无法在对话时拒绝束缚请求。 + + +Frantic Struggle +疯狂挣扎 +Your escaping is 3 times as fast, but less efficient in terms of stamina. +你的挣扎速度是原来的 3 倍,但消耗更多体力。 + + +Escape Artist +绳艺大师 +Start with high Rope reputation, and all rope restraints are easier to escape from. +开局绳索声望更高,所有绳索拘束更容易逃脱。 +Rope Bunny +绳模女郎 +Rope restraints are harder to escape from. +绳索拘束更难逃脱。 + + +Slippery +肤如凝胶 +Start with high Latex reputation, and all latex restraints are easier to escape from. +开局乳胶声望更高,所有乳胶拘束更容易摆脱。 +Latex Doll +乳胶娃娃 +Latex restraints are harder to escape from. +乳胶拘束更难逃脱。 + + +Escapee +皮革专家 +Start with high Leather reputation, and all leather restraints are easier to escape from. +开局皮革声望更高,所有皮革束缚更容易逃脱。 +Leather-Bound +皮革绑缚 +Leather restraints are harder to escape from. +皮革拘束更难逃脱。 + + +Slayer +元素法师 +You can cast Elemental spells without having the components, at twice the cost. Start w/ Firebolt. +你可以以两倍法力消耗为代价无视施法条件使用元素法术。开局获得技能 火焰箭。 +Conjurer +咒术法师 +You can cast Conjuration spells without having the components, at twice the cost. Start w/ Conjure Chain. +你可以以两倍法力消耗为代价无视施法条件使用咒术。开局获得技能 召唤锁链。 +Magician +幻术法师 +You can cast Illusion spells without having the components, at twice the cost. Start w/ Shadow Dagger. +你可以以两倍法力消耗为代价无视施法条件使用幻术。开局获得技能 暗影匕首。 + + +Narcoleptic +嗜睡症 You slowly lose stamina over time. 随着时间的推移,你会慢慢失去体力。 -Free Spirit -自由精神 -Most chastity belts can be struggled out of, but distraction decay is heavily reduced. -大多数贞操带都可以通过挣扎解除,但干扰值衰减大大减少。 -Deprived -失贞 -Vibrators no longer appear, but you gain distraction while chaste. -振动器(跳蛋等)不再出现,但你在贞洁时会获得额外干扰值。 + + +Stealth Mission +隐匿任务 +You are harder to detect and there are more chests, but enemies have 50% more HP, are more evasive, and drop no gold. +你将更难被敌人发现,且地图上的宝箱会更多。但敌人将会提高 50% 的血量和更高的闪避,并且不会掉落金币。 +Edging Lovers +寸止之恋 +All humanoids that can bind you also apply edging toys. +所有可束缚你的人形生物可以使用寸止玩具。 +Denial Lovers +拒绝之恋 +All humanoids that can bind you also apply denial toys. +所有可束缚你的人形生物可以使用拒绝玩具。 +Pleasure Lovers +快感之恋 +All humanoids that can bind you also apply pleasurable toys. +所有可束缚你的人形生物可以使用快感玩具。 +Teasing Lovers +戏弄之恋 +All humanoids that can bind you also apply teasing toys. +所有可束缚你的人形生物可以使用戏弄玩具。 +Latex Lovers +乳胶之恋 +All humanoids that can bind you also apply latex restraints. +所有可束缚你的人形生物可以使用乳胶束缚。 +Leather Lovers +皮革之恋 +All humanoids that can bind you also apply leather restraints. +所有可束缚你的人形生物可以使用皮革束缚。 +Wolfgirl Lovers +狼娘之恋 +All humanoids that can bind you also apply wolfgirl restraints. +所有可束缚你的人形生物可以使用狼娘束缚。 +Maid Lovers +女仆之恋 +All humanoids that can bind you also apply maid restraints. +所有可束缚你的人形生物可以使用女仆束缚。 +Dress Lovers +连衣之恋 +All humanoids that can bind you also apply dress restraints. +所有可束缚你的人形生物可以使用连衣裙束缚。 +Kitty Lovers +猫咪之恋 +All humanoids that can bind you also apply kitty restraints. +所有可束缚你的人形生物可以使用猫咪束缚。 +Adv Latex Lovers +高级乳胶之恋 +All humanoids that can bind you also apply advanced latex restraints. +所有可束缚你的人形生物可以使用高级乳胶束缚。 +Conspicuous +显眼 +Enemies detect you more easily. +敌人更容易发现你。 + + +Bound Power +拘束之力 +Your damage and evasion increases based on the number of restraints worn, up to +40% when thoroughly bound. +你的伤害和闪避会根据佩戴的束缚数量增加,完全束缚时最多 +40%。 +Kill Squad +杀戮小队 +Enemies gain increased blindsight and vision radius. +敌人的盲视能力和视野半径增加。 + + Supermarket 超市 -Commerce shrines are more commmon, and the shop contains 5 more items than usual. -商业神泉更常见,商店里的物品比平时多 5 件。 +Commerce shrines can appear in levels and have slightly more items. +商业神殿各层均可出现,并拥有更多的物品。 Price Gouging 敲竹杠 Items are 5x as expensive in the shop. 商店里的商品价格是原来的 5 倍。 + + +High Security +高安全性 +Picks are weaker, and randomly generated locks are harsher. +开锁工具变得更加脆弱,且随机生成的锁具将更难撬开。 Shoddy Knives 劣质刀 Knives break more easily. 刀更容易折断。 +Oppression +压抑 +Ghosts are less likely to help you. +幽灵不愿意帮助你。 Search Party -搜查队伍 +搜查队 More enemies spawn during sleep. -更多的敌人在睡眠期间生成。 +睡眠期间会有更多的敌人生成。 + + +No Way Out +无路可逃 +Enemies will always use the tightest restraints possible regardless of willpower. +10 Security level. +无论意志力如何,敌人总是会使用最严格的拘束具来完全束缚你。+10 安全等级。 +Deft Footwork +健步如飞 +You ignore some consequences of being mildly slowed from heels or slime, and you can cast Leg spells while slowed significantly at 50% miscast chance. +你无视了高跟鞋或粘液所导致的轻微减速,但是你可以在减速等级较高的情况下以50%成功率施放腿部的法术 +Poor Form +踉踉跄跄 +Slowing effects on you are amplified. +减速效果对你的影响会被放大。 +Poor Coordination +呆若木鸡 +You must have both fingers and arms free to cast arm spells. Hand restraints are more effective on you. +你的手指和手臂均未被束缚时候才能施展手臂法术。双手拘束对你更有效。 +Deft Fingering +得心应手 +You can cast arm spells using just your fingers, as long as your hands aren't bound. +只要你的手没有被束缚,你就可以只用手指施展手臂的法术。 + + +Well-Equipped +设备精良 +Restraints and traps that are limited by level appear sooner, and enemies stack more restraints in general. +10 security level. +有楼层数限制的拘束具和陷阱会更早出现,并且敌人通常会储备更多的拘束具。+10 安全等级。 + + +Quick-Draw +快速拔刀 +Switching weapons and spells does not take a turn. +切换武器和法术无需等待一回合。 Quick-Scribe 高速咏唱 Switching spells and casting from spellbook does not take a turn. 从法术书切换法术和施法不再需要等待一回合。 -Fuuka's Pet -Fuuka的宠物 -Start with Fuuka's collar. -开局时佩戴Fuuka的项圈。 -Vengeance -复仇 -Defeating an enemy greatly distracts you. -击败敌人会极大地提高你的干扰值。 -Panic sets in! (Stunned 2 turns) -恐慌!(眩晕2回合) -Copy to Clipboard -复制到剪贴板 -Copy (clipboard) -复制 (粘贴板) -Paste (clipboard) -粘贴 (粘贴板) -Ignited!!! -点燃!!! -The air around you is ablaze! (-DamageDealt SP) -你周围的空气在燃烧! (-DamageDealt SP) -Arcane Power -神秘强化 -Arcane Protection -神秘保护 -Arcane Explosion -神秘爆炸 -Arcane Cunning -诡计多端 -Slime Form -史莱姆形态 -Protection -防护 -FULL POWER -充满电 -Graceful -优美 -Sleepy -困 -Verbal spells allowed! -允许使用口头法术! -Arm spells allowed! -允许使用手臂咒语! -Leg spells allowed! -允许使用腿部法术! + + +Disorganized +杂乱无章 +Switching weapons, learning/choosing spells, and casting from spellbook takes 3 turns. +切换武器、学习/选择法术和从法术书中施放需要 3 个回合。 +Savour the Taste +细细品味 +Drinking a potion takes 2 turns +喝一瓶药水需要 2 回合。 + + +Magic Hands +魔法之手 +Enemies can add restraints underneath existing restraints. +敌人可以透过外层拘束具添加内层拘束。 + + +Fully Integrated +完全集成 +Start with your body sealed in an adhesive layer of latex. +开局时将你的身体密封在一层粘合乳胶层中。 + + +Doll Processing +玩偶工厂 +Start atop a conveyor on your way to be sealed away inside the Facility. +从传送带顶部开始,被封闭在设施内。 +Cyber Doll +赛博娃娃 +Start in full Cyber restraints. +开局时穿戴全套赛博束缚。 +Fuuka's Pet +风香(Fuuka)的宠物 +Start with Fuuka's collar and a few restraints. +开局时穿戴风香(Fuuka)的项圈和一些别的束缚。 +Fuuka Fan Club +风香(Fuuka)粉丝俱乐部 +All humanoids that can bind you also apply Fuuka's special restraints. +所有可束缚你的人形生物可以使用风香(Fuuka)特制的拘束具。 +Collected +搜集 +Start with The Warden's special belt which punishes you for defiling spell orbs. +开局时穿戴典狱长的特殊贞操带,它会在你玷污宝珠时惩罚你。 +Enforcers +执法者 +All humanoids that can bind you also apply The Warden's cuffs. +所有能够束缚你的人形生物也会使用典狱长的手铐。 +Dollmaker's Minions +玩偶师的宠儿 +All humanoids that can bind you also apply Cyber Doll restraints. +所有可束缚你的人形生物可以使用赛博拘束具。 +Doll Hunter V +玩偶猎人 V +You start with the Dollmaker's Visor. +开局时穿戴玩偶师的目镜 +Doll Hunter M +玩偶猎人 M +You start with the Dollmaker's Mask. +开局时穿戴玩偶师的面罩 +Persisting Desires +欲壑难填‌ +Your dark desires are endless. +你黑暗的欲望是无止境的。 + + +Sugar Rush +糖果快跑 +Consuming sweets makes you hyperactive, decreasing stamina costs and granting free moves. +食用糖果会让你变得异常活跃,减少体力消耗并获得自由移动。 + + +Vengeance +满足复仇 +Defeating an enemy greatly distracts you. +击败敌人会极大地提高你的性奋值。 +Berserker Rage +狂暴之怒 +Melee attacks distract you, but melee (including chain) damage increases by up to 30% at max distraction. +近战攻击会提高你的性奋值,且性奋值达到最大时,近战 ( 包括锁链 ) 伤害可增加 30%。 +Unstable Magic +混沌魔法 +Spells do up to 60% additional damage based on distraction or miscast chance, whichever is higher. +根据性奋值或施法失败的几率,法术最多可造成 60% 的额外伤害,以最高者为准。 +Absolute Focus +绝对专注 +Miscast chance is doubled. +施法失败几率翻倍。 + + +Bound Crusader +束缚十字军 +Goddesses will equip restraints upon acceptance of a quest. +在接受女神任务后会强制装备拘束具。 + + +Nowhere is Safe +草木皆兵 +Beds and furniture are often trapped. +床和场景家具通常会是陷阱。 + + +Quakehoof Associate +震蹄助手 +Start with the Epsilon Collar, which regenerates mana when you play with yourself. +开局穿戴能量子项圈,当你自慰时会恢复法力。 +Epsilon Collar +能量子项圈 +A collar reserved for the most prestigious of submissives. +这是专为最尊贵的顺从者准备的项圈。 +Restores mana when you play with yourself, but increases the distraction given. Only works when Desire is below the limit. +自慰时可恢复法力,但会提高增加性奋值的程度。仅当欲望低于上限时有效。 + + +Bullet Hell +子弹地狱 +Hides warning lines for non-AoE bullets and projectiles. +隐藏非范围攻击子弹和射弹的警告线。 +Bullet Armageddon +子弹末日 +Hides warning lines for AoE spells, bullets, and projectiles. +隐藏范围攻击法术、子弹和射弹的警告线。 + + +I have... needs +欲罢不能 +Distraction builds up over time. +性奋值随时间累计。 + + +Hopeless +绝望 +Willpower decays over time. +意志力会随着时间的推移而衰减。 + + +Quickness +迅疾闪现 +Grants Quickness after not moving for 4 turns. Quickness lets you move 1 space without ticking the clock. +4回合不动后获得"敏捷","敏捷"状态下可以瞬间移动 1 格。 + + +Expansive Halls +宽敞之牢 +Increases the size of maps by 3 in the long dimension. Maps will be less dense. +地图尺寸增加 3 点长度。地图密度将降低。 +Gargantuan Halls +广阔之牢 +Increases the size of maps by 6 in the long dimension. Maps will have a mix of tunnels and dead ends. +地图尺寸长度增加 6 倍。地图上将混有隧道和死胡同。 +Labyrinthine Halls +辽阔之牢 +Increases the size of maps by 9 in the long dimension. Maps will be mostly tunnels. +地图尺寸长度增加 9 倍。地图将主要由隧道组成。 +Absurdly Huge Maps +超大的地图 +(Experimental) Make the maps really really big. Probably breaks the game. +(实验性)地图生成的将会非常的大。可能会破坏游戏行为。 + + +Rigger +索具装配工 +Binding on enemies is 30% stronger. +对敌人的拘束力提高 30%。 +Pacifist +和平主义者 +All damage dealt to humanoid enemies is reduced by 90% except teasing damage and pain/grope/tickle/charm/psychic/chain/glue. +对人形敌人造成的所有伤害都会降低 90%,但挑逗和疼痛/抚摸/挠痒/魅惑/灵能/锁链/胶体伤害除外。 +Curse Seeker +诅咒探索者 +When you pick up cursed armor or restraints from chests, they equip automatically if able. +从箱子中拿起被诅咒的盔甲或拘束具时,符合条件的情况下会被自动装备。 + + +Burning Desire +焚心欲火 +While above 70% distraction, you ignite nearby objects and gain +25% fire damage. +当性奋值超过 70% 时,自身造成的火焰伤害提高 25%,并且你会点燃附近的物体。 +Frigid Personality +冰清玉洁 +While below 10% distraction, you gain +10% ice damage and can walk on ice without penalties. +当性奋值低于 10% 时,自身造成的寒冰伤害提高 10%,并且可以在冰上无惩罚的行走。 + + +Grounded in Reality +现实锚定 +While at max mana, your attacks deal an additional 30% of their base damage as electric damage. +当法力值最大时,攻击可造成额外 30% 基础伤害的电击伤害。 +Like the Wind +风之旋律 +While above 95% stamina, you gain +30 Evasion and your slow level is reduced by 1. +当体力超过 95 %时,闪避 +30,并且减速等级-1。 + + +Immovable Object +坚不可摧 +While above 90% willpower, you gain +150 Bondage Resist and Earth buff spells cost half mana. +当意志力超过 90% 时, 束缚抗性 +150,并且岩属性增益法术的法力消耗减半。 +Path of Least Resistance +腐蚀之盾 +While at 0 WP, you gain +35 Evasion and deal 20% of your max WP as soap damage when enemies restrain you. +当意志力为 0 时,闪避 +35,并在被束缚时对敌人造成最大意志力 20% 的皂化伤害。 + + +Sticky Situation +粘滞窘境 +You take 40% more glue damage. +你受到的胶体伤害增加 40%。 +Breathless +气喘吁吁 +Taking chain, poison, and crush damage makes you dizzy. +受到锁链、毒素和碾压伤害会让你眩晕。 + + + + +Kinky Prisoner +变态囚犯 +Guards won't remove restraints unless they have something tighter. +10 Security level. +警卫不会移除你的束缚,除非他们使用更紧的束缚。+10 安全等级。 + + +Unfair Doors +沉重门闩 +Doors are harder to open while your hands are bound. +当你的手被束缚时,门更难打开。 +You rattle the doorknob uselessly and end up banging on the door. +你无力地拨动着门把手,结果最终却只是敲了敲门。 +You can't quite get a grip on the doorknob. +你几乎抓不住门把手。 +Someone hears you banging and opens the door from the other side! +有人听到你的敲门声,然后从另一边打开了门! +Someone notices you fiddling with the door and opens it from the other side! +有人注意到你在尝试开门,然后从另一边打开了门! +The door squeaks open as the latch wasn't fully engaged. +门因为没有完全锁上而吱嘎吱嘎地打开了。 +You grab the doorknob with your wrists and flex it open. +你成功地用手腕抓住门把手并用力扭动,将门打开。 +You use your flexible feet to open the door. +你利用灵活的双脚打开了门。 + + +Poor Technique +技巧欠佳 +Instead of fizzling, most miscasted projectiles and AoE spells will target you instead. +施法失败的射击以及范围攻击魔法大多不会失效,而是转而将你为目标。 + + + + + + +Ticklish +怕痒 +You take 50% more tickle damage. +你受到的挠痒伤害增加 50%。 +Stoic +忍耐 +You gain +82 tickle resist. +自身挠痒抗性 +82 点。 + + +Lascivious +好色 +You take 50% more grope damage. +你受到的抚摸伤害增加 50%。 +Unperturbed +冰洁 +You gain +82 grope resist. +自身抚摸抗性 +82 点。 + + +Masochist +受虐 +Pain is strongly arousing. +疼痛会使你强烈地性奋。 +Pain Tolerance +坚韧 +You gain +200 pain resist. +自身疼痛抗性 +200 点。 + + +Fashionable +时尚之星 +When you are jailed, you keep your outfit. +入狱可保留你的服装。 + + +Futile Struggles +无力挣扎 +Lose 2 WP every time you remove a non-trivial restraint. +每次移除特殊拘束时消耗 2 意志力。 + + +Second Wind +再生之风 +Regenerate WP when unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, gag, or slows. (Upgrade available in spell tree) +完好无损时恢复意志力,最高可达意志力上限的10%。完好无损意味着没有手臂、手、腿、眼睛被蒙住、被堵住或减速。 ( 可在技能树中升级 ) +Second Wind Perk +再生之风技能 +Regenerate WP when you are unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, or gag bondage, and no slows. +当你完好无损时恢复意志力,最高可达意志力上限的 10%。完好无损意味着没有手臂、手、腿、眼睛被蒙住、被堵住或减速。 +Triumphant Wind +凯旋之风 +Second Wind now regenerates up to 25% of your max WP +再生之风现在可以恢复你意志力上限的 25% +Mental Defiance +精神抵抗 +Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While below 25% WP, quickly convert 'Defiance' into WP. +被动:通过临界高潮、高潮或挑逗损失的WP会储存为“抵抗”,最高上限为你缺失的DP值。切换:当WP低于25%时,快速将“抵抗”转化为WP。 +Mental Fortitude +坚韧的意志 +Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While above 75% WP but below 100%, quickly convert 'Defiance' into WP. Exclusive with Mental Defiance. +被动:通过临界高潮、高潮或挑逗损失的WP会储存为“抵抗”,上限为你的缺失DP值。切换:当WP超过75%但低于100%时,迅速将抵抗值转换为WP。与精神抵抗互斥。 + + +Locked Up +禁锢 +While wearing a chastity belt, your Desire lowers when you perform actions such as defeating enemies, opening chests, and breaking orbs. (Upgrades available in spell tree) +佩戴贞操带时,当你执行击败敌人、打开宝箱和打破宝珠等动作时,你的欲望会降低。 ( 可在技能树中升级 ) +Locked Up Perk +禁锢技能 +While wearing a chastity belt, your Desire lowers when you perform actions such as capturing, opening chests, and breaking orbs. +佩戴贞操带时,每当你击败敌人、打开宝箱和打破宝珠等动作,你的欲望会降低。 +Controlled Urges +抑制冲动 +Locked Up is 150% effective. Gain +70 psychic/charm resist from a chastity belt and +30 from a chastity bra. While not wearing a chastity belt, your Desire increases slowly. +“禁锢”技能有效率提高至150%。 佩戴贞操带可获得 +70 灵能/魅惑抗性,佩戴贞操文胸可获得 +30 灵能/魅惑抗性。在你没有佩戴贞操带时会慢慢增加欲望。 +Ready for Training +准备训练 +Locked Up is 200% effective. +25% stamina regen per 100 current DP. Playing with yourself is less effective while vibrators are off or set to edge. Slow level is increased by 1 when you aren't wearing any chastity. +“禁锢”技能有效率提高至200%。每 100 当前性奋值可恢复 +25% 体力。当振动器关闭或设置为边缘时,自慰的效果会降低。当你未佩戴任何贞操带时,减速等级会+1。 +Efficient Denial +有效拒绝 +Locked Up is 300% effective. When Locked Up triggers, you gain -30% mana costs and +25% physical damage for 7 turns (35 when opening a chest or breaking orbs). You cannot orgasm unless you are wearing a chastity belt, and slow level is increased by 2. +“禁锢”技能效率提高至300%。当该技能触发时,你获得-30%法力消耗和+25%的物理伤害的增益,持续7回合 ( 打开箱子或打破宝珠时为35 ) 。在未佩戴贞操带时,你将无法达到高潮,并且减速等级+2 +Recalcitrant +冥顽不化 +Relinquish the Locked Up perk. One time only. If you take the perk again, there is no going back. +放弃“禁锢”技能树。一次性选项,如果你再点出“禁锢”技能树,就无法放弃了。 + + +Novice Pet +宠物初学者 +You can now sprint while wearing a petsuit. (Upgrades available in spell tree) +你现在可以穿着宠物服冲刺了。 ( 可在技能树中升级 ) +Novice Pet Training +宠物服训练 +You can now sprint while wearing a petsuit. +你现在可以穿着宠物服冲刺了。 +Eager Pet +宠物服训练(初窥门径) ++1 slow reduction while wearing a petsuit, but sprint costs are increased by 30% when not wearing a petsuit. +穿着宠物服时减速等级-1,但不穿着宠物服时冲刺消耗增加 30%。 +Experienced Pet +宠物服训练(登堂入室) ++2 slow reduction total while wearing a petsuit (from +1), but sprint costs are increased by 100% (from 30%) when not wearing a petsuit and slow level is increased by +1. +穿着宠物套装时,减速等级总计-2 ( 原为-1 ) ,但不穿宠物服时,冲刺消耗增加100% ( 从30%开始 ) ,并且减速等级增加+1。 +Devoted Pet +宠物服训练(炉火纯青) ++3 slow reduction total while wearing a petsuit (from +2), but you cannot sprint (from +100% cost) when not wearing a petsuit and slow level is increased by +2 (from +1). +穿着宠物套装时,减速等级总计-3 ( 原为-2 ) ,但不穿宠物服时,你无法冲刺 ( 从+100%开始 ) ,并且减速等级增加+2 ( 原为+1 ) 。 +Bad Pet +坏宠物 +Relinquish the Novice Pet perk. One time only. If you take the perk again, there is no going back. +放弃“宠物初学者”技能树。只有这一次。如果你再点出这项技能,就没有回头路了。 +You are an expert in wearing a petsuit and your mobility is increased. +你是穿着宠物服的专家,你的灵活度也得到了提高。 +You are too used to wearing petsuits! Sprinting is impaired. +你已经穿惯宠物服了!短跑能力受损。 +You are a disobedient pet. You should put on a petsuit! +你是个不听话的宠物。你应该穿上宠物服! + + +Dominant +支配者 +They're trapped here with you. Ghosts are more helpful, and you can bind enemies that confront you about bondage. +“他们和你一起被困在这里。” 现在幽灵提供更有力帮助,同时面对试图向你提供拘束的敌人你可以反向束缚她。 + + +Stranger +异乡人 +Randomizes your relationship to most factions. +随机化你与大多数派系的关系。 +Wrong Neighborhood +邻里不和 +All factions are hostile and united against you. +所有派系都对你敌对并联合起来反对你。 +Bandit +强盗 +Start friendly to bandits, and hostile to most other factions. +开局与强盗派系友好,但是其他大多数派系会对你充满敌意。 + + +Trespasser +入侵者 +You lose reputation with the goddesses every time you advance a floor. +每次你进入下一层楼时,你会失去女神们的声望。 + + +Prisoner +囚犯 +Start the game as a submissive prisoner wandering the halls. +作为一个在大厅里游荡的顺从囚犯开始游戏。 + + +Rusty Bolts +生锈螺栓 +Most traps have a 25% misfire chance each time you step on them. +大多数陷阱在每次触发它们的时候有 25% 的失效几率。 + + +Not a Pet +我不是宠物! +Petsuits occur less often. +宠物服出现的概率较低。 +Unmasked +无面罩 +Hoods and full-face covering masks do not appear, but blindfolds are more powerful. Does not include kigurumi masks. +头罩和全脸面具将不会出现,但眼罩的效果更强。不包括 kigurumi 面具。 +No Kigurumi Masks +没有KIG面具 +Removes face-mimicking masks from the game. +取消游戏中的仿脸面具。 +No Hoods +无头套 +Removes hoods from the game. +移除游戏中所有头套 +No Sense Deprivation +无感觉剥夺 +Removes sensory deprivation hood/mask from the game. +移除游戏中所有感觉剥夺头套和面罩 +Blackout +屏蔽护目 +Blindfolds are stronger. While blindfolded you can only see enemies next to you. +眼罩变得更强,当佩戴眼罩时,你只能看到身边的敌人。 +No Blindfolds +不愿蒙眼 +In most cases you will not get blindfolded, except for cloth blindfolds which can be escaped easily. +在大多数情况下,你不会被蒙上眼睛,但布眼罩除外,因为布眼罩很容易逃脱。 + + +Total Blackout +阴影护目 +Blindfolds are extremely punishing. +眼罩变得非常令人痛苦。 +Poor Vision +视力障碍 +Vision radius is significantly reduced. +可视范围显著减小。 +Keen Hearing +顺风耳 +You can more easily hear enemies and their movements through walls. +你可以更容易地透过墙壁听到敌人和他们的行动。 +Archer's Eye +千里眼 ++2 vision radius. ++2 可视范围. +Night Owl +猫头鹰 +Your vision in dark areas is improved. +你在黑暗区域的视力得到增强。 +Fear of the Dark +黑暗恐惧症 +Your vision in dark areas is reduced. +你在黑暗区域的视力将会降低。 + + +Mutually Assured Darkness +与暗同行 +Darkness is twice as effective in hiding from enemies, but your night vision is also reduced. +在黑暗中躲避敌人的效果提高至两倍,但是你的夜视能力也会降低。 +Stalker +潜行者 +Darkness is twice as effective in hiding from enemies. +躲避敌人时,在黑暗中会给予你双倍的隐蔽效果 + + +Not a Doll +我不是玩偶! +You may still enter Doll Terminals, but enemies will not force you onto doll stands. +你仍然可以进入玩偶终端,但敌人不会强迫你站在玩偶架上。 +No Nurses +无护士 +Nurses will not appear in the game. +护士将不再出现在游戏中。 +No Police +无警察 +Police-based bounty hunters will not appear in the game. +警方的赏金猎人不会出现在游戏中。 +No Brats +安静宝宝 +Submissive enemies won't run away from you. +顺从的敌人不会从你身边逃跑。 +Brats Only +淘气宝宝 +Submissive enemies will always be bratty and force you to catch them. +顺从的敌人总是令人讨厌,迫使你去抓他们。 + + +More Tape +更多胶带 +Tape-wielding enemies (such as Tape Bots) occur more frequently. +胶带系敌人 ( 例如胶带机器人 ) 会更频繁地出现。 +Less Tape +减少胶带 +Fewer tape-related enemies will appear, although this does not remove tape entirely. +与胶带有关的敌人将较少出现,但胶带系的拘束不会完全消失。 + + +No Tape Bots +无胶带机器人 +The old civilization did not use tape-based restraints in their capture robots. +旧文明并没有在他们的捕捉机器人中加入使用胶带束缚的能力。 +Less Cable Bots +减少钢索机器人 +The old civilization used significantly less cable-based restraints in their capture robots. +旧文明仅在少数的捕捉机器人中加入了使用钢索束缚的能力。 +No Resin Bots +没有固化机器人 +The old civilization did not use crystal resin-based restraints in their capture robots. +旧文明没有在他们的捕获机器人中使用水晶树脂基的束缚。 +Lexx Latex Bots +减少乳胶机器人 +The old civilization used significantly less latex-based restraints in their capture robots. +旧文明仅在少数的捕捉机器人中加入了使用乳胶束缚的能力。 + + +More Encasement +更多包裹 +Enemies that encase you (e.g slimes, latex cubes) will appear more frequently. +包裹系的敌人 ( 例如史莱姆、乳胶块 ) 会更频繁地出现。 +Less Encasement +减少包裹 +Fewer encasement-related enemies will appear, although this does not remove them entirely. +包裹系的敌人会减少出现,但这不会使它们完全消失。 + + +More Bubbles +更多泡泡 +Enemies that use bubbles (e.g. aqua slimes, water witches) will appear more frequently. +使用泡泡的敌人 ( 如水生史莱姆、水巫师 ) 会更频繁地出现。 +Less Bubbles +减少泡泡 +Fewer bubble-related enemies will appear, although this does not remove them entirely. +与泡泡有关的敌人将会减少,但这并不能完全移除他们。 + + + + +Trainee +练习生 +Your training has given you access to the powers of the Trainee class. (Aroused mode only) +你的训练使你能够获得练习生职业的能力。 ( 仅限性欲模式 ) +Fighter +战士 +Your training has given you access to the powers of the Fighter class. +你的训练使你能够获得战士职业的能力。 +Rogue +盗贼 +Your training has given you access to the powers of the Rogue class. +你的训练使你能够获得盗贼职业的能力。 +Wizard +法师 +Your training has given you access to the powers of the Wizard class. +你的训练使你能够获得法师职业的能力。 +Peasant +农民 +You possess the agricultural mastery of the Peasant class. +你掌握了农民阶级的农业知识。 + + +Panic! (Chests) +惊恐! ( 箱子 ) +When you open a trapped chest, you are stunned for 2 turns. +当你开启陷阱箱时,你会晕眩2回合。 + + +Panic! (Traps) +惊恐! ( 陷阱 ) +When you step on a trap, you are stunned for 2 turns. +当你踩到陷阱时,你会晕眩2回合。 +Panic sets in! (Stunned 2 turns) +陷入恐慌! ( 眩晕2回合 ) + + +Butterfingers +黄油手指 +Having arms bound prevents you from using your hands to struggle or unlock yourself. +手臂被束缚会阻止你用手挣扎或解锁。 + + +Weak Grip +弱式握杆 +Having arms bound prevents you from holding weapons or potions. +被束缚的手臂无法持有武器或药剂。 + + +You kneel down so you can reach the potion with your mouth... +你跪了下来,这样你就能用嘴巴够到药水了... + + +Can't Hear You! +哑口无言 +Being gagged blocks you from casting verbal spells regardless of gag power. +无论等级如何,堵嘴类装备都会阻止你施放言语类咒语。 +Smooth Talker +油嘴滑舌 +Being gagged does not increase your miscast chance for verbal spells unless fully gagged, and reduces gag power by 20%. +除非你的嘴被完全堵住,否则堵嘴不会增加你念错咒语的几率,并且会降低 20% 堵嘴的强度。 + + +Hoods and full-face covering masks do not appear, but blindfolds are more powerful. +头套和全覆盖面罩将不会出现,但眼罩更强大。 + + +Ball Gag Lover +口球爱好者 +Increase occurrence of ball gags, decrease occurrence of muzzles. +增加口球的出现频率,减少口套的出现频率。 +Muzzle Lover +口套爱好者 +Greatly increases the occurrence of muzzles. +增加口套的出现频率。 + + +Armbinder Lover +单手套爱好者 +More armbinders, less straitjackets. +增加单手套的出现频率,减少拘束衣的出现频率。 + + +Jacket Lover +拘束衣爱好者 +More straitjackets, less armbinders. +增加拘束衣的出现频率,减少单手套的出现频率。 + + + + +Maid Sweeper +可爱女仆 +Start in a magically locked maid outfit. +开局时穿戴使用魔法锁住的女仆装。 +Wolf Trainee +受训狼娘 +Start in a uniform of a naughty wolfgirl. +开局时穿戴狼娘的制服。 +Latex Toy +乳胶玩具 +Start bound in lovely latex restraints. +开局时穿戴一整套可爱的乳胶拘束。 +Elemental Slave +精灵奴隶 +Start in a full set of magically locked obsidian cuffs. +开局时穿戴被魔法锁住的全套黑曜石铐。 + + +Mana Burst +能量爆发 +While at 100% distraction, you get -100% miscast chance but spending too much mana at once may cause you to go over the edge. +当性奋值为 100% 时,施法失败概率 -100%,但一次消耗过多的法力值可能会导致高潮。 +Arousing Magic +催情魔法 +Your magic is powered by otherworldly distracting energies. Casting spells increases distraction based on the mana spent. +你的魔法由超凡脱俗的催情能量驱动,施法时会根据消耗的法力增加性奋值。 +Clearheaded +冷静之术 +Magic puts you in a clear state of mind. Casting spells successfully reduces your distraction. +魔法可以让你头脑清醒,成功施法时可以减少性奋值。 + + +Unidentified Wear +身份不明的装备 +Enchanted (and cursed) wearables and weapons are unidentified until the item is used. +被附魔(和诅咒)的拘束具和武器在使用之前无法被识别出。 +### Unknown + +Copy (clipboard) +复制 ( 到剪贴板 ) +Paste (clipboard) +粘贴 ( 从剪贴板 ) + + +DAMAGEDEALT electric damage conducts to you!!! +DAMAGEDEALT 点电击伤害传导到你身上! +The pressure fans the flames on you, dealing bonus DAMAGEDEALT fire damage! +压力助长了你身上的火焰,你额外造成 DAMAGEDEALT 点火焰伤害! +The RestraintName comes off more easily in the presence of water! +在水的存在下,RestraintName更容易解开! +You slip on the floor! +你在地板上滑倒了! +The air around you is ablaze! (-DamageDealt SP) +你周围的空气在燃烧! (-DamageDealt SP) +The Goddess of Illusions shrouds you in shadows! +幻术女神将你笼罩在阴影中! +You struggle against your bonds, but a magical force resists! +你努力挣扎着摆脱束缚,但有一股魔力阻碍着你! The ropes squeeze you tighter and tighter... 绳索越来越紧…… Your body sinks deeper into a sea of bindings... 你的身体更深地沉入了束缚的海洋…… You struggle to breath as you are buried alive in squirming ropes... -当你被活埋在蠕动的绳索中时,你呼吸困难…… +你被活埋在蠕动的绳索中,你呼吸困难…… +The slime stretches out over your body... +黏液慢慢伸展开来,覆盖着你的身体... +The slime continues to engulf you, blocking out your vision... +黏液继续包裹着你,遮挡了你的视野... +The slime starts to harden, sealing you inside a rubbery prison... +黏液开始变硬,将你封闭在一个橡胶般的牢笼中... +You feel a force compelling you to stop resisting... +你感受到一股力量驱使你停止抵抗... +Your body struggles to move as you feel a power sealing you! +你感到一股力量将你的身体束缚,使你难以移动! +The sarcophagus' door slides open as you are slowly pulled inside... +石棺的门滑开,你被缓慢地拉进去... +The hands squeeze you tightly as a shadowy portal appears... +当一个阴暗的传送门出现时,那双手紧紧地挤压着你…… +More hands clasp over your body as they pull you toward the portal... +更多的手抓住你的身体,将你拉向传送门…… +You struggle to breath as you are pulled into the mass of shadow hands... +你被拉入一团影之手中,呼吸困难... The world goes dark... 世界变暗了…… You wake up in a different place... -你在不同的地方醒来... -Charging... -收费... -Choose game mode: -选择游戏模式: -Beginner: Get a save code every 3 levels -初学者:每3层获得一个保存代码 +你在陌生的地方醒来... + + +Arcane Explosion +奥术爆发 + + +EnemyName says something incomprehensible! Her spell miscasts! +EnemyName说了一些难以理解的话!她的法术施放失败了! +EnemyName fumbles her next move! +EnemyName在下一个动作中搞砸了! +The EnemyName utters a command word on the TargetName! +EnemyName对TargetName念出了一个口令! + + +Nipples +乳头 +Breasts +胸 +Panties +内裤 +Front +正面 +Rear +后部 +Feet +脚 +Everywhere! +任何位置! + + +Physical Armor: +物理防御: +Magic Armor: +魔法防御: +In the Shadows: You are harder to see. +处在阴影中 : ‎你更难被敌人察觉。 +Invisible: You are very difficult to see. +隐形 : ‎你非常难以被敌人察觉。 +Quickness: Your next movement is so fast it doesn't advance a turn. +迅捷 : ‎你的下一个动作极其迅速,不消耗回合时间。 +All Damage Reduction: +全部伤害减免 : ‎ +You take PERCENT1 DAMAGETYPE damage, based on PERCENT2 DAMAGETYPE resist and PERCENT3 DAMAGECATEGORY modifier. +你受到的DAMAGETYPE伤害COUNTPERCENT [基于 PERCENT2 DAMAGETYPE抗性和 PERCENT3 DAMAGECATEGORY修正] +You deal PERCENT more DAMAGETYPE damage. +你造成的DAMAGETYPE伤害增加了 PERCENT +Your bindings are PERCENT more effective. +你的束缚效果提高了 PERCENT +Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage, for a stamina cost of STMNA. +你的基础攻击可花费 STMNA 点体力造成 DAMAGEDEALT 点DAMAGETYPE伤害 +Plugged! +被插入! +Plugged up!!! +被完全插入! +Denied! You won't be getting off that easy~ +不行!不会让你这么容易就出来的~ +Teasing vibrations... +挑逗的震动... +Gentle vibrations... +温和的震动... +Mild vibrations... +轻微的震动... +Strong vibrations! +强烈的震动! +Intense vibrations!! +剧烈的震动 +Torturous vibrations!!! +折磨般的震动! + + +Your restraints are restrictive! Struggling is less effective without help. +你的束缚太严格了!无人帮助时挣扎效果减弱。 +Stunned! You can't move! +你被晕眩,无法移动! +Your vision is impaired! +你的视野受到影响! +Arms are bound! +你的手臂被束缚! +Hands are useless! +你的双手无法使用! +Hands are impaired! Some tasks will be harder... +你的双手受到束缚!一些操作会更加困难... +Slow Level 2: Movement significantly impaired! +减速 2 级 : 行动能力显著降低! +Slow Level 1: Movement slightly impaired. +减速 1 级 : 行动能力降低。 +Slow Level 3: Movement severely impaired! +减速 3 级 : 行动能力严重降低! +Slow Level 4+: Movement is almost impossible. Sprinting and hopping are disabled. +减速 4 级以上 : 几乎无法移动。冲刺和跳跃均被禁用。 +Slow Level 10+: Immobilized! +减速 10 级以上 : 完全无法动弹! +Your mouth is free for potion-drinking and spellcasting activities. +你的嘴巴可以自由饮用药剂和施放法术。 +Your vision is clear. +你的视野十分清晰。 +Your hands are unobstructed. +你的双手没有被阻碍。 +Your arms are free to move as you please. +你的手臂可以自由伸展。 +Your legs are free and unimpeded. +你的双腿自由而无阻。 +You are gagged! Verbal miscast chance is increased and your potions are less effective! +你的嘴巴被口球堵住了,施放言语法术的失败几率增加,而且药剂的效果减弱! +Your mouth is totally filled! You can't drink potions and cant cast verbal spells! +你的嘴巴被堵的死死的,无法施放言语法术和饮用药剂! + + +Spell Empowerment! +法术强化! + + +Let there be light! +要有光! + + +You're seeing things... +你看到了一些东西... + + +You've been poisoned! +你中毒了! + + +-50% MP Cost (Latex) +乳胶法术的法力消耗减少 50% [ ⁧[ +-50% MP Cost (Leather) +皮革法术的法力消耗减少 50% [ ⁧[ +-50% MP Cost (Metal) +金属法术的法力消耗减少 50% [ ⁧[ +-50% MP Cost (Rope) +绳索法术的法力消耗减少 50% [ ⁧[ +Regeneration +再生能力 +-50% MP Cost (Elements) +元素法术的法力消耗减少 50% [ ⁧[ +-50% MP Cost (Conjuration) +咒术的法力消耗减少 50% [ ⁧[ +-50% MP Cost (Illusion) +幻术的法力消耗减少 50% [ ⁧[ + + +Conductive: When you or an enemy takes electric damage, the other takes half of it as well! +导电 : ‎当你或敌人受到电击伤害时,另一方也会承受被攻击个体受到的50%电击伤害! +Lightning Rod: Gain significantly boosted electric resist. +避雷针 : ‎大幅增加电击抗性 +Drenched: Grants fire resist, ice/electric weakness, and makes you conductive. +潮湿 : ‎提高火焰抗性,但降低对寒冰和电击的抗性,并获得导电 + + +Chilled: The cold makes it hard to move! You are slowed. +寒冷 : ‎寒冷使得移动变得困难,降低移动速度 +Slimed: It's sticky and dense! You are slowed and 30% more vulnerable to glue damage. +粘液覆盖 : ‎浓稠而又黏糊糊粘液覆盖在你身上,降低 30% 胶体抗性和移动速度 +Unsteady: You're on loose footing. You are easier to hit and are slowed. +不稳定 : ‎你站在不牢固的地面上,降低移动速度,且更容易被击中 +Ignore Ice Tiles +忽略寒冰效果 + + +Ignited: You are dealing fire damage to yourself and nearby enemies! +燃烧 : ‎你对自己和附近的敌人造成火焰伤害 +You are on fire and taking damage! +你正在燃烧并受到伤害! + + +Divine Punishment: Deals bonus damage when you hit an enemy. +狂暴状态 : ‎当你击中敌人时,造成额外的伤害 +Divine Protection: Automatically blocks the next 3 times an enemy tries to bind you. +神圣守护 : 自动阻挡敌人接下来三次试图束缚你的攻击。 +Divine Cunning: You turn invisible briefly after attacking. +神圣之灵 : ‎你在攻击后短暂变得隐形 + + +-MP Cost (Fire) +减少火焰法术的 MP 消耗 +-MP Cost (Air) +减少风法术的 MP 消耗 +-MP Cost (Water) +减水法术的 MP 消耗 +-MP Cost (Earth) +减少岩法术的 MP 消耗 + + +Slime Form: You gain bonuses and can slip through bars! +粘液形态 : ‎你获得一些加成,并能穿过栅栏 +Shroud: Visibility decreased, evasion increased. +影雾 : ‎降低可见度,增加闪避 +Camoflage: While next to a wall, you are very hard to see. +伪装 : ‎靠近墙壁时,你很难被其他生物察觉到 +Stone Skin: Increased armor. +石肤 : ‎增加护甲 +Darkblade: Increased damage. +暗影之刃 : ‎增加伤害 +Runic Ward: Increased Magic Armor. +符文盾 : ‎增加魔法护甲 +Great Invisibility: It is impossible for enemies to see you. +高级隐形 : ‎敌人无法看到你 +Invisibility: It is very difficult for enemies to see you. +隐形 : ‎敌人很难看到你 +Lesser Invisibility: It is harder for enemies to see you. +次级隐身 : ‎敌人较难看到你 +FULL POWER: Cutting power increased. +充满能量 : ‎切割能力提高 +Graceful: Struggling power increased. +优雅 : ‎挣扎能力提高 +Iron Blood: Reduced melee cost, increased mana costs. +铁血 : ‎减少近战体力消耗,但增加施放法术的法力消耗 +Sleepy: You are sluggish and have a hard time keeping your eyes open. +疲倦 : ‎你感到疲倦,难以保持清醒 +Afterimage: Evasion greatly increased. +残像 : ‎闪避大幅增加 +We did it! We made ourselves invisible--mmmmph!!! +我们做到了!我们让自己隐形了--mmmmph!!! +You are not currently attempting to disguise yourself. Click to reenable. +你目前并没有试图伪装自己。点击以重新启用。 +Your restraints are disenchanted, treating them as nonmagical for purposes of cutting. +你的身上的拘束具被祛魔了,它们在解除时被视为非魔法物品。 +You can launch another leather restraint instantly! +你可以立即发射另一件皮革束缚! +You can launch another Sagitta instantly! +你可以立即发射另一支箭! + + +You have stored willpower. +你储备了意志力。 +You have consumed a mote of essence, granting miscast chance reduction. +你消耗了一颗精华微粒,减少了施法失误概率。 +You recapture an essence mote and concentrate on its essence! +你重新捕捉到一个精华尘埃,并集中于它的精华! +Choose an essence mote to absorb. +选择一个精华尘埃来吸收。 + + +Locked Down: Struggling power is greatly reduced. +锁定 : ‎挣扎能力大幅降低 + + +Verbose: You can cast verbal spells while gagged. +言灵无碍 : ‎你可以在佩戴口球的情况下施放言语法术 +Dextrous: You can cast arm spells while tied up. +手法巧妙: 你可以在手臂被捆绑的情况下施放需要手臂的法术 +Spell Dance: You can cast leg spells while tied up. +舞步神通 : ‎你可以在双腿被捆绑的情况下施放需要腿部的法术 + + +Bondage Buster: Lazor is charging... +束缚破坏者: ‎激光正在充能中... +Katana: Patience is key... +武士刀: ‎耐心是关键... +Stormbreaker: You have the Power. +风暴克星 : ‎你拥有力量 + + +Game Setup: +游戏设置 +Beginner: Get a save code every 3 levels, autosave after each floor +初学者 : ‎每3层获得一个保存代码 Roguelike: No save codes, only autosave -Roguelike:没有保存代码,只有自动保存 +Roguelike : ‎没有保存代码,只有自动保存 Exciting: Orbs give random spells -令人兴奋的:魔法水晶提供随机法术 +令人兴奋 : ‎魔法水晶提供随机法术 Kinky: No save codes, orbs give random spells, start with very little -Kinky:没有保存代码,魔法水晶提供随机法术,开始时很少 -Log +变态 : ‎没有保存代码,魔法水晶提供随机法术,开始时很少 + + +Journal 日志 + + Change Outfit 换装 -Reset Outfit -重置外观 -Code -代码 +Reset to Default +重置至默认 +Outfit Code +服装代码 Confirm Reset? 确认重置? -(Copy the code above and save it on your computer to load later) -(复制上面的代码并将其保存在您的计算机上以供以后加载) -You come across a black monolith with its face inscribed in runes. -你会看到一个黑色的石碑,上面刻着符文。 -You study them, but can't come up with an interpretation. -你研究它们,但无法做出解释。 -They may still prove useful to future adventurers should you get caught... -如果你被抓住,它们可能仍然对未来的冒险者有用...... -(Your game has been saved automatically, but you can save the code for later) -(您的游戏已自动保存,但您可以保存代码以备后用) -Write them down. (+5 submissiveness) -记下来。 (+5 顺从) -I will not be caught! (-5 submissiveness) -我不会被抓的! (-5 顺从) + + +(Your game has been saved) +( 您的游戏已保存 ) +(Copy the code above and save it on your computer to backup) +( 复制以上代码并保存到电脑上以备份存档 ) + + +Continue... +继续 + + Menu 菜单 + + I will simply wait to see what happens. 我会等着看会发生什么。 -Give up (Clears save file) -放弃(清除保存文件) +Save my current progress. +保存当前进度 +Give up & delete save +放弃并删除存档 +Yes, delete my save file! +是的,删除我的存档文件 Actually, I will let the enemy capture me instead. 实际上,我要让敌人俘虏我 +Yes, jail me! +是的,囚禁我 No, I wish to press on 不,我想继续 -See Background -查看背景 +See Perks +查看技能 + + +This chest belongs to the FACTION +这个箱子属于 FACTION +This belongs to the FACTION +这属于 FACTION + + Devious Dungeon Challenge is enabled. Devious Dungeon Challenge 已启用。 Waiting for game data... 等待游戏数据... -You have surrendered to the dungeon and become its prisoner. -你已经向地牢投降并成为它的囚犯。 -Day and night, you wait that rescue may come some day. -日日夜夜,你等待救援可能有一天会到来。 -Better luck next time! -下次好运! + + + + + + You have reached the end of the playable portion. 您已到达可游玩部分的末尾。 Come back later for new dungeons! 请以后再来游玩全新的地牢! -Got the keys! -拿到钥匙了! + + +Got the keys! Find the stairs to go to the next floor. +找到了钥匙!找到楼梯前往下一层。 +You haven't found the keys for this floor yet. +你还没有找到本层的钥匙。 Missing key 未找到钥匙 -Miscast: Percent -施法失败:Percent -Evasion: Percent% -闪避: Percent% +You are protected from damage and can't be bound until the shield is broken! +你将受到保护,免受伤害,并且在护盾被打破之前无法被束缚! +Chance for a spell to fizzle: +施法失败几率 : ‎ +Dodge Chance: Percent%, based on EVASIONSUM Evasion and EVASIONPENALTY% penalty. +闪避率 : ‎Percent% [基于 EVASIONSUM 点闪避值和 EVASIONPENALTY% 闪避值惩罚] +Block Chance: Percent%, based on BLOCKSUM Block and BLOCKPENALTY% penalty. +格挡率 : ‎Percent% [基于 BLOCKSUM 点格挡值和 BLOCKPENALTY% 格挡值惩罚] +Chance to resist a level 10 restraint: AMNT1%, based on AMNT2 Bondage Resist and RESBLKPENALTY penalty. +抵抗 10 级束缚的几率 : AMNT1%,基于 AMNT2 束缚抵抗和 RESBLKPENALTY 惩罚。 Sight Range: RADIUS -视距: RADIUS +视距 : ‎RADIUS Speed: SPD -速度: SPD +速度 : ‎SPD Normal 正常 Stunned! @@ -289,99 +1775,167 @@ Very Slow Immobile 无法移动 DP: PERCENT% -干扰值: PERCENT% +性奋值 : ‎PERCENT% +DP: CURRENT/MAX (PERCENT% Desire) +性奋值 : ‎CURRENT/MAX ( PERCENT% 欲望程度 ) SP: CURRENT/MAX -体力值: CURRENT/MAX +体力值 : ‎CURRENT/MAX Willpower: CURRENT/MAX -体力值: CURRENT/MAX +意志值 : ‎CURRENT/MAX MP: CURRENT/MAX -魔力值:CURRENT/MAX +法力值 : ‎CURRENT/MAX +Mana slowly recovers from a pool equal to POOLMANA. Drink potions to restore the pool. +法力从有着 POOLMANA 点储备法力的储备池中缓慢恢复,喝药水可以恢复储备池。 +Your Desire is the baseline Distraction you decay toward, and is increased by distracting things. +你的欲望程度是你性奋值增加的基准,并且会因性奋的事物而增加。 +Stamina recovers more quickly when you aren't spending it. +当你休息时,体力恢复得更快。 +Willpower is restored by food, sleep, and potions. Without willpower, it becomes very difficult to escape. +意志力通过食物、睡眠和药剂恢复。没有意志力,就很难逃脱。 +Charge is used to power various magic items and weapons. +充能用于为各种魔法物品和武器提供能量。 WP: CURRENT/MAX 意志力: CURRENT/MAX Charge: PERCENT -电荷: PERCENT +充能: PERCENT Use Potion 使用药水 MP -魔力 -Mana slowly recovers from a pool equal to 4x your max mana. Drink potions to restore the pool. -法力从一个相当于你最大法力4倍的池中缓慢恢复。喝药水恢复池。 -Your minimum distraction increases over time as you encounter distracting things. -当你遇到分心的事情时,你的最小干扰值会随着时间的推移而增加。 -Stamina recovers more quickly when you aren't spending it. -当你休息时,耐力恢复得更快。 -Willpower is restored by food, sleep, and potions. Without willpower, it becomes very difficult to escape. -意志力通过食物、睡眠和药剂恢复。没有意志力,就很难逃脱。 -Charge is used to power various magic items and weapons. -电荷用于为各种魔法物品和武器提供能量。 +法力值 Go to sleep 睡觉 -Make noise! -制造噪音! +Call for help! +呼救! +Play with yourself +自慰 +Let go... +高潮... + + +Call for Help!!! +呼救!!! Wait until interrupted 等待至被打断 Auto-struggle 自动尝试挣脱 Auto-path 自动寻路 -Play with yourself -自慰 -Let go... -高潮... +Quick-Swap Weapon +快速切换武器 +Inspect +检查 +Pass NPCs +绕过 NPC +Interact +交互 +Sprint/Hop +疾跑/跳跃 +Crouch +蹲伏 + + +### ~ah~ + +### ~mmm~ + +### ~ngh~ + +### ~oh~ + +(Heavy breathing) +( 沉重喘息 ) +(Soft moaning) +( 轻声呻吟 ) +(Incoherent mumbling) +( 含糊不清的咕哝 ) +(Loud moans) +( 大声呻吟 ) +(Deep breaths) +( 深呼吸 ) +(Uncontrollable moaning) +( 无法自控地呻吟 ) +(Horny noises) +( 淫荡的声音 ) + + +### ~mm~ + +### ~mmph~ + +### ~nnn~ + +### ~mmmmm~ + You wait. 等待。 -Your legs tremble as you wait. -等待时,你的腿在颤抖。 -You tremble and moan as you wait. -你在等待时颤抖和呻吟。 -You are exhausted. -你已经筋疲力尽了。 -You are panting in frustration. -你沮丧地喘着粗气。 -You are shaking in frustration. -你沮丧地颤抖着。 +You wait, legs trembling with arousal. +你等待着,双腿颤抖,脑中充满奇怪的想法。 +You wait, trembling and moaning. +你等待着,颤抖着发出呻吟声。 +You wait to regain your strength. +你等待着体力恢复。 +You wait to regain your composure, panting with frustration. +你等待着恢复镇定,沮丧地喘息着。 +You wait to regain your composure, shaking with frustration. +你等待着恢复镇定,颤抖着表达沮丧之情。 You are exhausted from spellcasting. 你因施法而筋疲力尽。 + + You are feeling tired. 你感觉很累。 You feel exhausted... 你感到筋疲力尽... You feel like you are going to pass out... 你感觉自己快要昏倒了…… + + Start New Game 开始新游戏 New Game+ 新游戏+ Continue Last Save 继续上次游戏 -Load From Code -从代码加载 -Save Outfit (overwrites!) -保存服装(覆盖!) +Load Saved Game +加载已保存的游戏 +Save Outfit (overwrite!) +保存服装 ( 覆盖! ) +Save Outfit (Clothes Only!) +保存服装 ( 仅衣物! ) Save Keybindings 保存键位 Cancel Changes 取消修改 -Change Keybindings -更改键位 +Return +返回 +Game Options +游戏选项 + + Load from code 从代码加载 -Start Playing -开始游玩 Back to main menu 返回主菜单 +Load Mod .zip +加载模组压缩文件 +Delete Mod +移除模组 Clear Perks 清除词条 -Config +Config 配置 -Load Mod -加载 Mod -Delete Mod -移除 Mod +Cancel +取消 +Filter +筛选 + + DANGER: Loading a mod will execute ARBITRARY CODE on your machine. -【危险】:加载 Mod 将在你的计算机上肆意执行任意代码。 +【警告】加载模组具有危险性,因为模组可在你的计算机上执行任何代码, Like connecting to a server, etc. Only load mods from a TRUSTED source. -就如同连接到不可信的服务器一样。请仅仅只加载来源可信赖的 Mod 。 +比如连接到未知服务器等,请只加载来源可信赖的模组。 + + Up 向上 Down @@ -412,64 +1966,160 @@ Spell 6 法术 6 Spell 7 法术 7 +Spell 8 +法术 8 +Spell 9 +法术 9 +Spell 10 +法术 10 +Load Hotbar 1 +加载热键1 +Load Hotbar 2 +加载热键2 +Load Hotbar 3 +加载热键3 +Load Loadout 1 +加载装备槽1 +Load Loadout 2 +加载装备槽1 +Load Loadout 3 +加载装备槽1 Cycle Spell Page 循环法术页面 -Last Held Weapon -最后持有的武器 -Ranged Attack -远程攻击 +Upcast Spells +凝聚法力 +Cancel Upcast +停止凝聚 +Swap Weapon 1 +切换武器 1 +Swap Weapon 2 +切换武器 2 +Swap Weapon 3 +切换武器 3 +Swap Weapon 4 +切换武器 4 +Weapon Ability +武器能力 Wait 等待 -Cancel/Return +Cancel/Back 取消/返回 +Enter +进入 +Expand Minimap +展开小地图 +Zoom Out +缩小 +Zoom In +放大 +Wait till Interrupted +等待直到中断 +Make Noise +制造噪音 +Play with Self +自慰 + + +Message Log +消息日志 +Pass thru allies +绕过盟友 +Auto-Struggle +自动尝试挣脱 +Auto-Pathfind +自动寻路 +Hide Bullets +隐藏子弹 + + +Quick Inventory +快速物品栏 +Inventory +背包 +Reputation +声望 +Journey Map +旅程地图 +Quests +任务 +Spell List +法术列表 +Pause Menu +暂停页面 +Facilities +设施 + + Current Key Pressed 当前按键 Press a key, then press a button to set that key -按下一个键,然后按一个按钮来设置该键 +按下一个按键,然后按一个按钮来设置该按键 + + Floor FLOORNUMBER: DUNGEONNAME -楼层 FLOORNUMBER: DUNGEONNAME -Lockpicks: -撬锁工具: -Keys: -钥匙: -Magic Keys: -魔法钥匙: -Knife: -刀: -Mag. Knife: -魔力刀: -You climb down to the next level -你进入新的一层。 +楼层 FLOORNUMBER : DUNGEONNAME + + +Lockpicks: +撬锁工具 : ‎ +Keys: +钥匙 +Magic Keys: +魔法钥匙 +Knife: +刀 +Mag. Knife: +魔法刀 + + +You climb down the stairs. The passage closes behind you. +你进入了下一层。通道在你的身后关闭。 +You climb back up the stairs. +你爬回了楼梯。 You can't climb down until you get out of this leash... 在你摆脱牵绳之前,你不能进入下一层...... You climb down and find yourself in a strange new place. -你发现自己在一个陌生的新地方。 +你进入了下一层,发现自己身处在一个陌生的新地方。 + + plus XXX -加XXX +增加XXX + + Graveyard 墓地 Catacombs 地下墓穴 -Underground Jungle -地下丛林 +Overgrown Ruins +杂草丛生的遗迹 Lost Temple 失落神殿 The Bellows 风箱 Rundown Laboratory -破败实验室 +破败的实验室 Forgotten Garden 被遗忘的花园 +Coastal Grotto +海岸石窟 Kingdom of Ice 冰之王国 + + + + The Mansion 豪宅 + + Ancient Tombs 古墓 Magic Library 魔法图书馆 Crystal Cave -水晶洞 +结晶洞 +### Cavern + Orrery 天文钟 Training Center @@ -477,15 +2127,51 @@ Training Center Rubber Facility 橡胶设施 Wizards' Den -巫师的基地 +法师的基地 Marble Halls 大理石大厅 Doll Storage -娃娃收纳 +玩偶容器 + + +Processing +玩偶工厂 +Bandit Hideout +盗贼藏身处 +Ancient Vault +远古宝库 +Ancient Halls +古代大厅 +Slave Market +奴隶市场 +Elevator Hall +电梯厅 +Dark Passageway +黑暗通道 +Caldera Beach +火山口沙滩 +Temple of Air +空气神殿 +Temple of Fire +火焰神殿 +Temple of Water +流水神殿 +Temple of Ice +寒冰神殿 +Temple of Storms +风暴神殿 +Temple of Earth +大地神殿 +The Edge of Reality +现实边缘 +Dark Dimension +黑暗次元 +### Lair + You search through the debris but find nothing of note 你在碎片中寻找,但没有发现任何值得注意的东西 You find some gold coins in a corner (+XXX gold) -你在角落里发现了一些金币(+XXX 金币) +你在角落里发现了一些金币 ( +XXX 金币 ) You find a lockpick in a crack between the tiles 你在瓷砖之间的裂缝中发现了一个撬锁工具 You find a rusty knife among the rocks @@ -498,44 +2184,36 @@ You find a bola, crafted by bandits 你找到了一条由强盗制作的投石索 You find some unexploded ordnance. 你发现了一些未爆炸的弹药 + + You find a key lying atop an open tome! -您发现一个钥匙躺在敞开的书籍上! +你发现一个钥匙躺在敞开的书籍上! You find a magical key lying atop an open tome! -您发现一个魔法钥匙躺在一个敞开的书籍上! +你发现一个魔法钥匙躺在一个敞开的书籍上! You find a useful scroll wedged between some treatises! -您在一些论文之间发现有一个有用的卷轴! +你在一些论文之间发现有一个有用的卷轴! You find a glowing book containing a binding spell! -您发现一本发光的书中包含捆绑法术! -You find a golden key surrounded by strange golden crystals. -您发现一个被奇怪的金色晶体包围的金钥匙。 -You find a set of strange golden crystals. -您发现一组奇怪的金色晶体。 -You find a pack of scrolls used for spellcasting, and some strange golden crystals. -您发现一包用于施法的卷轴和一些奇怪的金色晶体。 -You find a pack of scrolls used for spellcasting. -您发现一包用于施法的卷轴。 -You find a glowing scroll of purity. -您发现纯净的卷轴。 -You find a key on the shelf! -你在架子上找到一把钥匙! -You find a useful scroll in between the books! -您在两本书之间找到有用的卷轴! -You find a glowing book, which magically binds you as soon as you open it! -你发现一本发光的书,打开它就会捆绑你! +你发现一本发光的书中包含捆绑法术! + + +You discover a golden cookie, wrapped in foil. Beside it are two power crystals. +你发现了一块用箔纸包裹的金色饼干。旁边还有两颗能量晶体。 You find a golden key surrounded by strange golden crystals. -你发现一把金钥匙,周围放着一些奇怪的金色水晶。 +你发现一个被奇怪的金色晶体包围的金钥匙。 You find a set of strange golden crystals. -你发现一组奇怪的金色水晶。 +你发现一组奇怪的金色晶体。 You find a pack of scrolls used for spellcasting, and some strange golden crystals. -你会发现一包用于施法的卷轴,以及一些奇怪的金色水晶。 +你发现一包用于施法的卷轴和一些奇怪的金色晶体。 You find a pack of scrolls used for spellcasting. -你找到一包用于施法的卷轴。 +你发现一包用于施法的卷轴。 You find a glowing scroll of purity. -你会发现一个发光的纯洁卷轴。 +你发现纯净的卷轴。 + + The chest contains gold! (+XXX gold) 箱子内有金币! (+XXX 金币) -The chest contains a glowing magical knife that can turn invisible on your body! -箱子内有一把发光的魔法刀,放在你身上时会隐形! +The chest contains a glowing magical knife! +这个箱子里有一把发光的魔法刀! The chest contains a keyring with a glowing magic key! 箱子里有一个带有发光魔法钥匙的钥匙圈! Someone left their keys here... @@ -545,61 +2223,79 @@ You found some bolas left by bandits. You found some high explosives! 你发现了一些烈性炸药! You find a magic scroll, which you place in your spellbook. (+SpellLearned) -你找到一个魔法卷轴,你把它放在你的法术书中。 (+习得法术) +你找到一个魔法卷轴,你把它放在你的法术书中。 ( +习得法术 ) You find an orb containing magical knowledge! (+AMOUNT spell points) -你找到了一个包含魔法知识的球体! (+AMOUNT 法术点数) +你找到了一个包含魔法知识的球体! ( +AMOUNT 法术点数 ) You find a weapon! (+WeaponAcquired) -你找到了一个武器! (+WeaponAcquired) +你找到了一个武器! ( +WeaponAcquired ) You find a wearable item! (+ArmorAcquired) -你找到了一个拘束具! (+ArmorAcquired) +你找到了一个拘束具! ( +ArmorAcquired ) You find gold and a magic trap! (+RestraintType) (+XXX gold) -你找到了金币和一个魔法陷阱! (+RestrainType) (+XXX gold) +你找到了金币和一个魔法陷阱!(+RestraintType) (+XXX 金币) Swirling belts emerge from the chest and leave you bound! (+RestraintType) -皮带从箱子中涌出,将你束缚! (+RestraintType) +皮带从箱子中涌出,将你束缚! ( +RestraintType ) You find gold and a chastity belt that locks around your waist! (+RestraintType) (+XXX gold) -你发现了金币,同时一条贞操带锁在了你的腰间! (+RestrainType) (+XXX gold) +你发现了金币,同时一条贞操带锁在了你的腰间! (+RestraintType) (+XXX 金币) You find gold and a tormenting magical trap! (+RestraintType) (+XXX gold) -你找到了黄金和一个折磨人的魔法陷阱! (+RestrainType) (+XXX gold) +你找到了金币和一个折磨人的魔法陷阱! (+RestraintType) (+XXX 金币) You find gold, plus a filling and tormenting magical trap! (+RestraintType) (+XXX gold) -你找到了金币,外加一个充满且折磨人的魔法陷阱! (+RestrainType) (+XXX gold) +你找到了金币,外加一个充满折磨的魔法陷阱! (+RestraintType) (+XXX 金币) You find gold, plus a devious magical trap! (+RestraintType) (+XXX gold) -你找到了黄金,外加一个狡猾的魔法陷阱! (+RestrainType) (+XXX gold) -Magical runes glow as animated restraints fly out of the chest! -拘束具随着魔法符文的动画而发着光从箱子中飞出! +你找到了金币,外加一个狡猾的魔法陷阱! (+RestraintType) (+XXX 金币) +Magical runes glow as a trap activates inside the chest! +魔法符文在箱子里闪烁,一个陷阱被触发了! You find a special collar that lets you absorb energy from potions. -你会发现一个特殊的项圈,可以让你从药水中直接吸收能量。 +你发现一个特殊的项圈,可以让你从药水中直接吸收能量。 You find a pair of garish pink high heels with a slippery surface. -你会发现一双华丽的粉红色高跟鞋,表面很光滑。 +你发现一双华丽的粉红色高跟鞋,表面很光滑。 +You find a special gag with a feather duster. +你发现一个带有鸡毛掸子的特殊堵嘴器。 +You find a gas mask suitable for filtering gases. +你发现一个适合过滤气体的防毒面具。 The pearly chest contains a divine gift! (+ITEMGET) -珍贵的宝箱里有一份神圣的礼物! (+得到道具) +珍贵的宝箱里有一份神圣的礼物! ( +ITEMGET ) Smoke fills the air around you! 烟雾弥漫在你周围! +You find a magical necklace that seems to concentrate magic. +你找到一个似乎集中魔法的魔法项链。 + + + + You recover some of your lost items! -您找回了一些丢失的物品! +你找回了一些丢失的物品! + + You find a red potion with a sweet scent. 你找到了一种带有甜味的红色药水。 You find a blue potion that glows with magical essence. -你找到了一种散发着魔力的蓝色药水。 -You find several health potions. -你找到了几种恢复药水。 +你找到了一种散发着法力的蓝色药水。 +You find a glowing orb, filled with untapped mana. +你发现一个发光的球体,里面充满了未使用的法力。 +You find three mana orbs strung together! +你找到了三个连接在一起的法力宝珠! +You find several willpower potions. +你找到了几瓶意志力药水。 You find several mana potions. -你找到了几种魔力药水。 +你找到了几种法力药水。 You find a green potion, glowing warm with energy. 你找到了一种绿色药水,散发着温暖的能量。 You find a snow-like potion that's cold to the touch. 你会发现一种摸起来很冷的雪状药水。 You find a medley of potions. 你会发现一堆药水。 -Rarity: -稀有度: + + +Rarity: +稀有度 : Lesser -无价值的 +无价值 Common -常见的 +常见 Uncommon 罕见 Rare -稀有的 +稀有 Very Rare 很稀少 Epic @@ -607,75 +2303,157 @@ Epic Legendary 传奇 Supreme -传奇+ +至高 Mythic 神话 Angelic -天国 +天使 Divine -神圣的 +神圣 + + Quantity: -数量: -Use Item (Consumes 1) -使用物品(消耗 1 个) -Knife -刀 -Wizard's Outfit -巫师装束 +数量 : ‎ +Use One +使用一个 + + +way of the fist +拳法之道 +Lockpick +撬锁工具 +Exit Keys +[离开的钥匙] + + +Adventurer's Outfit +冒险家装束 Your favorite outfit for adventuring. 你最喜欢的冒险服装。 -Your original outfit. No bonuses -你原来的衣服。没有额外效果。 +Your original outfit. No bonuses, no penalties. +你原来的服装。没有奖励,没有惩罚。 + + +Tactical Catsuit +战术紧身衣 +A sleek catsuit worn by stealth operatives. No frills, no nonsense. +一种由秘密特工穿着的时尚紧身衣。简洁无华,毫无累赘。 +Increases stealth by 10% in the dark. +处在黑暗中时,隐藏能力增加 10%。 + + Jail Uniform 监狱制服 The prisoners are kept in revealing outfits to keep them from hiding things. 囚犯们穿着暴露的衣服,以防止他们隐藏东西。 -A prisoner's 'outfit'. No bonuses, no penalties. -囚徒的“装束”。没有奖励,没有惩罚。 +Designed to make it hard to conceal weapons. Makes you more visible and vulnerable to the cold. +使武器难以隐藏。并让你更容易受到寒冷的影响。 + + Wolfgirl Suit -狼女套装 -An advanced suit designed for sport -专为运动而设计的高级套装 -No bonuses, no penalties. -没有奖励,没有惩罚。 -Maid Outfit -女仆装 +狼娘套装 +An advanced suit designed for sport, breathable and also warm. +专为运动而设计的高级套装,透气且保暖。 +Made of latex. Resistant to electricity but does not insulate well. +由乳胶制成。耐电但绝缘性能不佳。 + + +Maid Uniform +女仆制服 An elegant dress meant to denote a maid's status. 象征女仆身份的优雅礼服。 -No bonuses, no penalties. -没有奖励,没有惩罚。 -Prisoner Uniform -囚服 -The uniform of choice for girls captured by the dragonhearts. -被龙之心抓住的少女们的制服。 -Designed to make it hard to conceal weapons. No bonuses, no penalties. -其设计使得武器难以苍翼。没有奖励,没有惩罚。 +Massively increases accuracy against slime mold. +攻击黏菌时,命中率大幅提高。 + + +Harem Outfit +后宫制服 +A skimpy outfit with antiquated connotations. +带有过时内涵的轻薄服装。 +Harkening back to an old era. +让人回想起旧时代。 + + +Combat Bikini +战斗比基尼 +A minimalist albeit chilly outfit designed for ease of use. +简约但寒冷的服装,专为易用性而设计。 +Or perhaps it's just sexy... +或许只是因为性感…… +Lingerie +内衣 +A minimalist yet aesthetically pleasing outfit. +简约而又美观的服装。 +No bonuses. +没有奖励。 + + +Dragonheart Uniform +龙之心制服 +The uniform of choice for dragonheart of all ranks. +各级龙之心的首选制服。 +It's made of fire-resistant leather, and provides +5 armor. +它由防火皮革制成,并提供 +5 护甲值。 + + Scientific Uniform 科幻制服 An outfit designed to leave little to the imagination. 一套设计成几乎没有想象空间的服装。 -No bonuses, no penalties. -没有奖励,没有惩罚。 +Resistant to electricity but does not insulate well. Provides significant acid and glue protection for scientific purposes. +耐电但绝缘性能不佳。但因科学目的所以拥有重要的酸蚀和胶体保护。 + + +Latex Catsuit +乳胶紧身衣 +An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. +由经过高度加工的粘液制成的服装。天然丝滑,触感顺滑。 + + +Doll Catsuit +玩偶紧身衣 +Resistant to electricity but does not insulate well. +耐电但绝缘性不佳。 + + +Cyber Doll Suit +赛博玩偶制服 +A technologically advanced suit designed for long term wear. Despite being watertight and skintight it has cleaning and ventilation ports that plug directly into doll storage fixtures. +这是一套专为长时间穿着而设计的先进技术服装。不仅紧密贴合和防水,而且它具有直接连接到玩偶存储装置的清洁和通风插口。 + + Shadow Latex Dress 暗影乳胶连衣裙 A minidress made from shadow latex, a favorite of otherwordly patrons. 由暗影乳胶制成的迷你裙,是其他顾客的最爱。 -No bonuses, no penalties. -没有奖励,没有惩罚。 +Resistant to the elements, but is infused with crystals that amplify psychic damage to yourself. +能够抵御各种元素,但注入的水晶会放大对自己的灵能伤害。 + + +Elemental Slave Dress +精灵奴隶连衣裙 +A minidress made to adorn mortal slaves in the elemental planes. +一种迷你裙,用来装饰精灵的凡人奴隶。 + + Elven Dress 精灵连衣裙 A regal minidress worn by visitors to the forest. 给来客穿的豪华迷你裙。 -No bonuses, no penalties. -没有奖励,没有惩罚。 +Not very good at insulating you from the cold or from touchy fingers. Its elven aura improves accuracy and evasion by +10. +对于抵御寒冷效果较差。它的精灵光环提高了 +10 的命中率和闪避。 + + Scroll of Sleight 诡计卷轴 The scroll makes your memories of arm movements clear as day! -卷轴让您对手臂运动的记忆清晰如初! +卷轴让你对手臂运动的记忆清晰如初! A scroll used by thieves to make their plays in secret. 盗贼用来偷偷玩弄的卷轴。 Allows you to cast Arm spells without components for 12 turns. -允许您在 12 回合内使用需要手臂释放的法术。 +允许你在 12 回合内使用需要手臂释放的法术。 + + Scroll of Purity 纯洁卷轴 The scroll circles around your body and you feel... empty now. @@ -683,107 +2461,107 @@ The scroll circles around your body and you feel... empty now. A scroll used to enforce chastity within religious orders. 用于在宗教秩序中强制执行贞操的卷轴。 Removes all vibrators from your body. -从您的身体移除所有振动器。 +从你的身体移除所有振动器。 + + Scroll of Speech 语言卷轴 The scroll makes your gagged speech slightly more intelligible! -卷轴使您的堵嘴讲话更容易理解! +卷轴使你被堵嘴时讲的话更容易理解! A scroll used to help translate different languages. 用于帮助翻译不同语言的卷轴。 Allows you to cast Verbal spells without components for 12 turns. -允许您在 12 回合内使用需要语言释放的法术。 +允许你在 12 回合内使用需要语言释放的法术。 + + Scroll of Sauntering 漫步卷轴 The scroll lets you move your body in swift and accurate ways! -卷轴让您以快速准确的方式移动您的身体! +卷轴让你以快速准确的方式移动你的身体! A scroll used by dancers to upgrade their moves. -舞者用来升级动作的卷轴。 +舞者用来开展轻巧动作的卷轴。 Allows you to cast Leg spells without components for 12 turns. -允许您在 12 回合内使用需要腿部释放的法术。 +允许你在 12 回合内使用需要腿部释放的法术。 + + Ancient Key 远古钥匙 Perhaps it has something to do with ancient restraints? 也许这与远古的拘束具有关? An ancient key plated in gold. It doesnt look like it can open anything... 一把古老的镀金钥匙。好像什么都打不开…… +You pick up a shining golden key. +你拿起了一把闪亮的金色钥匙。 + + +You pick up a ReplaceValue. +你拿起了ReplaceValue。 + + Power Crystal 能量水晶 You hold the crystal and the power flows into you. 你拿着水晶,力量流入到你的体内。 You're not sure how they charged these... -你不知道他们是如何充能... +你不知道他们是如何充能的... A mysterious device used by the old civilization, powering their ancient devices. 古老文明使用的神秘装置,为他们古老的装置提供动力。 + + You are already full of ancient power. 你已经充满了远古的力量。 + + Spent Power Crystal -使用过的能量水晶 +耗尽的能量水晶 You touch the spent crystal and it siphons 100 gold from your bag! -你触摸用过的水晶,它从你的包里吸走了 100 金! +你触摸耗尽的水晶,它从你的包里吸走了 100 金币! You are not sure how to charge this back up. -您不知道如何给它们充能。 -You're not sure how they charged these... -你不知道他们是如何给这些东西充能的... +你不知道如何给它们充能。 A mysterious device used by the old civilization, now depleted. -旧文明使用的神秘装置,现已耗尽。 +旧文明使用的神秘装置,现已耗尽充能。 + + +Gold +金币 Key 钥匙 -A key with traces of magic that fades with one use. -一把带有魔法痕迹的钥匙,一次使用就会消失。 -Can be used to unlock a restraint, door, or chest. -可用于解锁拘束具、门或箱子。 +A key. You wonder who it's for? +一把钥匙 你想知道是给谁的吗? +Can be used to unlock one simple or standard-locked restraint, door, or chest. +可以用来打开一个简单或标准上锁的拘束具、门或箱子。 Magic Key 魔法钥匙 A glowing key enchanted with magic that fades with one use. -一把带有魔法的发光钥匙,使用一次就会消失。 -Can be used to unlock a blue lock. -可用于解锁蓝色锁。 -Magic Key -魔法钥匙 +一把充盈着发光魔力的魔法钥匙,使用一次就会消失。 +Can be used to unlock a runic lock. +可用于解开符文锁。 A magical key with the power to open blue locks. 一把能打开蓝色锁的魔法钥匙。 Blue locks can't be otherwise picked. 蓝色锁不能被撬开。 Magic Knife -魔刀 -A magical blade which can be hidden on your body. -可以隐藏在你身上的魔法刀刃。 -Can cut enchanted ropes. -可以切割附魔绳索。 +魔法刀 +A magical blade, suitable against ghosts. +一把适用于对抗幽灵的魔法之剑。 +Deals shadow damage. Can cut enchanted ropes. Offhand: Increase base crit of all magic damage by 20% +造成暗影伤害,可以切断魔法绳索。副手 : ‎所有魔法伤害基础暴击增加20% Bola 投石索 A pair of weights attached to a rope. Can be thrown. 一对重物连接在绳索的两端。可以投掷。 -Deals 9 points of binding, 40 chain damage, and rooting a target for 4 turns. -造成 9 点束缚伤害,40 点锁链伤害,并使目标定身 4 回合。 -A pair of weights attached to a rope. Can be thrown. -一对重物连接在绳索的两端。可以投掷。 -Deals 9 points of binding, 40 chain damage, and rooting a target for 4 turns. -造成 9 点束缚伤害,40 点锁链伤害,并使目标定身 4 回合。 -Not a toy! -不是玩具! -After a 6 turn fuse, deals 100 fire damage in a 3x3 area. -延迟 6 回合后,在 3x3 区域内造成 100 点火焰伤害。 +Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. +造成 90 点束缚伤害和 40 点锁链伤害,并固定被攻击目标 4 回合。 +Bomb +炸弹 +After a 5 turn fuse, deals 100 blast damage in a 3x3 area. +5 回合后引爆,在 3x3 范围内造成 100 点爆炸伤害。 Not a toy! 不是玩具! You light the fuse! -你点燃了引信!! -Potion Applicator -药水接收器 -An ancient device that allows direct use of potions even while gagged or bound. Costs 5% max ancient energy to use a potion this way. -一种古老的装置,即使在被塞住或被束缚时也可以直接使用药水。以这种方式使用药水会消耗 5% 最大值的远古能量。 -Also allows fitting of a leash. -还允许安装牵绳。 -Slime Walkers -史莱姆靴子 -A pair of heels coated in a nonstick material. -一双涂有不粘材料的高跟鞋。 -They will slow you down, but you can walk on slime without getting stuck! -它们会减慢您的速度,但您可以在史莱姆上行走而不会被困住! +你点燃了引线!! Knife 刀 -Lockpick -撬锁工具 A tool used to pick locks. 用来撬锁的工具。 Doesn't last forever, but can help in a pinch. @@ -796,14 +2574,26 @@ Bola x3 投石索 x3 Bomb x3 炸弹 x3 +Dynamite x2 +甘油炸药 x2 +Plastic Explosive x2 +塑胶炸药 x2 Mana Potion -魔力药水 +法力药水 You sip the mana potion and feel empowered. -你啜饮着魔力药水,感到充满力量。 +你啜饮着法力药水,感到充满力量。 A rare essence used by mages to recover their strength. 法师用来恢复力量的稀有精华。 -Restores 100% of mana instantly. -立即恢复 100% 的法力值。 +Restores 50% max MP instantly. Excess mana goes into the mana pool. +立即恢复 50% 最大法力。多余的法力将被存入储备池中。 +Mana Orb +法力宝珠 +You clutch the mana orb and feel its energy. +你紧握着法力宝珠,感受着它蕴含的能量。 +Mystical energies swirl inside a glass form. +神秘的能量在玻璃内旋转。 +Adds 200 MP to your mana pool. Requires no hands to use. +增加 200 点法力到你的储备池中,且无需手即可使用。 Stamina Potion 体力药水 You drink the stamina potion and feel invigorated. @@ -811,39 +2601,73 @@ You drink the stamina potion and feel invigorated. A potion brimming with heat and energy. 充满热量和能量的药水。 Restores 50% stamina and 250% more over 25 turns. Effect does not stack. -立即恢复50%最大耐力,并在接下来12回合中恢复67%耐力。效果不能叠加。 +立即恢复50%最大体力,并在接下来25回合中恢复250%体力。效果不能叠加。 Willpower Potion 意志力药水 You drink the willpower potion and feel motivated. 你喝了意志力药水,感觉到了动力。 A sweet potion, brimming with determination. 充满决心的甜蜜药水 -Restores 25% willpower instantly. -立即恢复25%的意志力。 +Restores 25% willpower instantly. Can be used while gagged. +立刻回复 25% 意志力,可以在佩戴口塞的情况下使用。 Frigid Potion -寒冰药水 +冰心药水 You chug the concoction and your senses numb, helping you concentrate. 你喝下混合物,感觉变得麻木,你的注意力开始集中。 -A freezing cold bottle with a bitter scent. -一个冰冷的瓶子,带着苦涩的气味。 -Reduces distraction by 100% instantly and grants additional Distraction decay for 50 turns. -立即减少100%的干扰值,并允许额外的干扰值衰减50回合。 +Like bottled snow. Helps to get your mind on track. +就像瓶装雪一样。有助于让你的思维步入正轨。 +Reduces distraction to 0 and grants additional decay for 50 turns. Can be used while gagged. +将性奋值减少至 0,并对性奋值给予额外衰减 50 回合,可以在佩戴口塞的情况下使用。 Smoke Bomb 烟雾弹 -You toss the smoke bomb and it explodes in your location! -你抛出烟雾弹,它在你的位置爆炸! -A type of pyrotechnic often employed by saboteurs. Can be used without hands. -一种经常被破坏者使用的烟火。无需双手即可使用。 +You toss the smoke bomb and it starts emitting a deep haze! +你抛出烟雾弹,它开始散发出浓浓的烟雾! +You ready a smoke bomb... +你准备好烟雾弹... +A type of pyrotechnic often employed by saboteurs. Can be rolled and used without hands. +一种经常被破坏者使用的烟火。无需用手即可卷起和使用。 Creates a smoke screen lasting 8 turns. You are harder to see while inside the smoke. 制造持续 8 回合的烟幕。在烟雾中时你更难看到。 +Smoke Bomb x3 +三枚烟雾弹 +Flash Bomb +闪光弹 +Flash Bomb x3 +3 枚闪光弹 +Flashbang x3 +3 枚闪光震爆弹 +You toss the flash bomb and the fuse starts ticking... +你抛出闪光弹,导火索开始滴答作响…… +You ready a flash bomb... +你准备好闪光弹... +A type of explosive used by agents. Blinds nearby targets without causing significant injury. +一种经常被特工使用的爆炸物。致盲附近目标而不造成重大伤害。 +Blinds for 20 turns in a 3x3 area. +在 3x3 区域内致盲 20 回合。 + + +Flashbang +闪光震爆弹 +You toss the flashbang and the fuse starts ticking... +你抛出闪光震爆弹,保险丝开始滴答作响...... +You ready a flashbang... +你准备好闪光震爆弹... +A piece of rare special forces equipment. The secrets of its manufacture are strictly kept by the Alchemist's Guild. +一件稀有的特种部队装备。其制造秘密由炼金术士公会严格保守。 +Blinds for 24 turns in a 3x3 area. Also Slows and Silences them for half the duration. +在 3x3 区域内造成 24 回合的致盲。也会让他们在一半的时间内减速和沉默。 +Blinds for 24 turns in a 3x3 area. And also Slows and Silences them for half the duration. +在 3x3 区域内造成 24 回合的致盲。也会让他们在一半的时间内减速和沉默。 + + Invisibility Potion 隐形药水 You chug the concoction and see your body fading away. 你喝下混合物,看到你的身体逐渐消失。 You feel liquid inside, but you can't see it! 你感觉里面有液体,但你看不到它! -Casts Invisibility on yourself. -使自己不可见。 +Casts Vanish on yourself. +对自己施放隐身术。 Ectoplasm 灵浆 Like a moisturizing cream, except it's made from coagulated souls. @@ -858,36 +2682,92 @@ You smash the rune in front of you, and glowing rocks rise from the earth. 你粉碎了你面前的符文,发光的岩石从大地升起。 It feels unsettling to look at. 看着就让人不安。 -Creates a 3x3 area of +2 armor centered on yourself for 9 turns. -以自己为中心创建一个 3x3 的 +2 护甲区域,持续 9 回合。 +Creates a 3x3 area of +20 armor centered on yourself for 9 turns. +以你为中心创造一个 3x3 的 +20 护甲的区域,持续 9 回合 Water Rune -水符文 +流水符文 You crush the rune in your hand, and it turns into water that coats the floor 你捏碎手中的符文,它变成了覆盖在地板上的水 It feels slimmy. 感觉很滑。 -Creates a 3x3 area on you for 9 turns. Gives +100% magic resist to friendlies, halves enemy speed. -在你身上创造一个 3x3 的区域,持续 9 回合。为友军提供 +100% 魔法抗性,使敌人速度减半。 +Creates a 3x3 area on you for 9 turns. Gives +30 Magic Armor to friendlies, halves enemy speed. +在你的身上创造一个 3x3 的区域,友军在区域内 +30 魔法护甲,敌人速度减半,持续 9 回合。 Ice Rune -冰符文 +寒冰符文 You smash the rune in front of you, and icicles pierce through the floor! 你砸碎你面前的符文,冰柱刺穿地板! It feels cold to the touch. 摸起来感觉很冷。 Creates icicles around you for 5-8 turns. They deal 40 damage and freeze for 3 turns. 在你周围制造冰柱,持续 5-8 回合。他们造成 40 点伤害并冻结 3 回合。 + + +You steal the doll's identification card. +你偷了娃娃们的身份卡。 +Doll ID +玩偶ID +You apply a clever trick to reset your visor cooldown. +你使用一个巧妙的技巧重置了你的面罩的冷却时间。 +A chip used to identify dolls. She must have dropped it. Either way it contains valuable tech... +这是一个用于识别娃娃的芯片。有人可能遗失了它,无论如何,里面蕴含着有价值的技术…… +With enough, it can be used to remove Dollmaker's headwear. +如果有足够的量,它可以用来摘掉玩偶制造者的头饰。 + + + + +Heart Amulet +心形护身符 + + +You find a donut with sprinkles! +你发现一个带有彩色糖粒的甜甜圈! +Donut (Sprinkles) +甜甜圈 ( 彩色糖粒 ) +You enjoy the donut and relish in its sweet delights. +你享受着甜甜圈,陶醉在它甜蜜的美味中。 +A delicious fried snack, covered in a sugary glaze and topped with sprinkles. +这是一种美味的小吃,覆盖着糖霜,并撒上彩色糖粒。 +Restores 10% willpower. Takes a few turns to eat. +恢复 10% 意志力,需要几个回合的时间吃掉。 + + +You pick up a sugar cookie slathered in pink frosting! +你拿起了一块涂满粉色糖霜的糖饼! +Good-Girl Gift +乖巧女孩的礼物 +You slowly eat the cookie, savoring its fluffy texture. +你慢慢地品尝着这块饼干,享受着它蓬松的口感。 +It tempts you with sweet promises, but something about it feels off... +它诱惑着你,带来甜蜜,但同时你感觉有些不对劲…… +Restores 15% willpower and adds +5 submissiveness. Takes a few turns to eat. +恢复 15% 意志力并 +5 服从度,需要几个回合的时间吃掉。 + + +You find a chocolate-chip cookie! +你发现一块巧克力曲奇饼! +Cookie (Chocolate Chip) +曲奇饼 ( 巧克力豆 ) +You enjoy the cookie one chocolatey bite at a time. +你一口一口地享受着这个饼干,品味着其中的巧克力味道。 +A delicious baked good made with butter, sugar, and chocolate chips, baked until golden brown. +这是一种美味的烘焙食品,用黄油、糖和巧克力豆制成,烘烤至金黄色。 + + The potion was less effective due to your gag! 由于你的嘴被堵住,药水没那么有效了! -Amulet of Grace -恩典丝带 -You feel the restraints become loose on your skin! -你觉得束缚在你的皮肤上变得松散了! -It glows with the power of sylvan grace. -它散发着森林优雅的力量。 -Makes you slippery for 10 turns, boosting all forms of struggling. -让您在 10 回合内更加柔滑,增强各种形式的挣扎。 + + +Elven Soap +精灵肥皂 You feel the restraints become loose on your skin! 你觉得束缚在你的皮肤上变得松散了! +The secret to elven cosmetics and blemish-free skin. +精灵化妆和无瑕肌肤的秘密。 +Makes you slippery for 100 turns, boosting all forms of struggling. +让你在 100 回合内变得很光滑,增强各种形式的挣扎。 + + Enchanted Grinder 魔法切割机 The grinder starts spinning for a short time! Its cutting power is immense! @@ -896,248 +2776,442 @@ The cutting disc is shining and very sharp. 切割盘闪闪发光,非常锋利。 Grants significantly increased cutting power for a short time. 可在短时间内显着提高切割功率。 -The grinder starts spinning for a short time! Its cutting power is immense! -切割机开始旋转一小段时间!它的切割能力是巨大的! + + Dollmaker's Staff 玩偶师法杖 You remember this being used on someone else. -你记得这被用在别人身上。 -Deals soul damage. Fully bound enemies captured with this weapon become latex dolls which fight with you. -造成灵魂伤害。用这种武器捕获的完全拘束的敌人会变成为你战斗的乳胶娃娃。 -Staff of Flame -烈焰法杖 -A magical weapon made for novices to use. -供新手使用的魔法武器。 -Deals fire damage. Enemies take 20% more fire damage -造成火焰伤害。敌人受到的火焰伤害增加 20% +你记得这曾被用在别人身上。 ++15% glue damage. Deals psychic damage. Fully bound enemies captured with this weapon become latex dolls which fight with you. ++15% 胶体伤害.造成灵能伤害。被这把武器完全束缚的敌人将变成与你一起战斗的乳胶娃娃。 +You are unable to control more than 3 dolls. The new doll is protesting and remains bound. +你无法控制超过3个娃娃,新的娃娃正在挣扎并保持束缚状态。 + + +Staff of Incineration +燃烧法杖 +A magical weapon made for intermediates to use. +专供老手使用的魔杖。 ++25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. Offhand: Applies %fire damage bonus. ++25% 火焰伤害,造成火焰伤害。燃烧的敌人每回合受到额外 5 点火焰伤害。副手 : ‎应用火焰伤害加成。 Staff of Storms 风暴法杖 -A magical weapon made for intermediates to use. -专供中级使用的魔法武器。 -Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. -造成电击伤害。受到电击伤害的敌人会在 5x5 区域内额外反射 15 点电击伤害。 ++20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. Offhand: Applies electric damage bonus. ++20% 电击伤害,造成电击伤害。受到电击伤害的敌人会在 5x5 范围内受到额外 15点电击伤害。副手 : ‎应用电击伤害加成。 Staff of Frostbite -冰冻法杖 -A magical weapon with a 33% chance to freeze the target for 4 turns. -魔法武器,有 33% 的几率冻结目标 4 回合。 -Deals ice damage. Frozen enemies take 5 ice damage per turn. -造成冰伤害。冰冻的敌人每回合受到 5 点冰伤害。 -Staff of Permafrost -冻土法杖 +极寒法杖 A magical weapon with a 33% chance to freeze the target for 4 turns. -魔法武器,有 33% 的几率冻结目标 4 回合。 -Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration) -造成冰伤害。将敌人冻结效果的持续时间乘以 1.5 倍(最小 +1 持续时间) +一件魔杖,有 33% 的几率冻结目标 4 回合。 ++20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. Offhand: Applies ice damage bonus. ++20% 寒冰伤害,造成寒冰伤害。被冰冻的敌人每回合受到额外 5 点寒冰伤害。副手 : ‎应用寒冰伤害加成。 Staff of Binding 束缚法杖 A magical weapon made to use on novices. 适合新手使用的魔法武器。 -+20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. -锁链伤害+20%并定身4回合。绑定效率为150%。 ++20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. Offhand: Applies chain damage bonus. +锁链伤害+20%并定身4回合。绑缚效率为150%。副手 : ‎应用锁链伤害加成。 + + Arcane Orb -神秘球 +奥术法球 Look into my eyes... 看着我的眼睛。。。 -Deals shadow damage. Can be used without hands. Does not benefit from enemies being vulnerable. -造成暗影伤害。使用时无需双手。不从敌人的影响中受益。 +Deals arcane damage. Can be used without hands. Can not critically strike. +造成奥术伤害。使用时无需双手。无法暴击。 +You find a purple crystal. You feel your mystic powers flood into it. +你找到了一个紫色水晶。你感受到自己的法力涌入其中。 +Staff of Flame +火焰法杖 +A magical weapon made for novices to use. +供新手使用的魔杖。 ++15% fire damage. Deals fire damage. Offhand: Applies passive bonus. ++15% 火焰伤害,造成火焰伤害。副手 : ‎应用被动伤害加成。 +Staff of Slime +粘液法杖 +A slimy and magical implement.. +一把又黏又神奇的工具。 ++10% glue damage. Deals glue damage. Offhand: Applies passive bonus. ++10% 胶体伤害,造成胶体伤害。副手 : ‎应用被动伤害加成。 +Staff of Shocking +电击法杖 ++10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. Offhand: Applies electric damage bonus. ++10% 电击伤害,造成电击伤害。有 10% 的几率目标眩晕 3 回合。副手 : ‎应用电击伤害加成。 +Staff of Permafrost +冰冻法杖 +A magical weapon with a 15% chance to freeze the target for 4 turns. +一把有着 15% 冻结目标 4 回合的神奇武器。 ++10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration). Offhand: Applies ice damage bonus. ++10%寒冰伤害.造成寒冰伤害且将敌人的冰冻效果持续时间提升至 1.5 倍 ( 最低增加一回合 ) 。副手 : ‎应用寒冰伤害加成。 +Staff of Chains +锁链法杖 +A magical weapon made for novices in the art of bondage. +一把专为新手设计的用于束缚艺术的魔法武器。 ++10% chain damage. Deals chain damage. 150% binding efficiency. Offhand: Applies chain damage bonus. ++10%锁链伤害.造成锁链伤害,绑缚效率变为 150% 。副手 : ‎应用锁链伤害加成。 +You pick up a staff of chains. You have fond memories... +你拿起一把锁链法杖。你回想起了美好的记忆... + + +You pick up a staff of binding. You remember these from wizard school... +你拿起一根束缚法杖。你你记得在法师学校见过这些…… +You pick up a staff of the storm. Your hair stands on end. +你拿起一把风暴法杖。你的头发竖了起来。 +You pick up a staff of incineration. It rumbles with molten fury. +你拿起一把燃烧法杖。它隆隆作响,充满了炽热的愤怒。 +You pick up a staff with a name on it: DOLLMAKER +你拿起一把法杖,上面有个名字 : ‎玩偶师 +You pick up a staff of frostbite. Your hand feels numb just reaching for it. +你拿起一把极寒法杖。你的手在触碰它时感到麻木。 + + +You pick up a staff of the storm. It tingles. +你拿起风暴之杖。它刺痛了你。 +You pick up a staff of flames. It feels warm. +你拿起一根火焰法杖。感觉很温暖。 +You pick up a staff of slime. +你拿起一把粘液法杖。 +You pick up a staff of permafrost. It feels icy to the touch. +你拿起一把冰冻法杖。触感冰冷。 + + +Crop +鞭子 +For those unruly subs. +专为那些反抗的人而设计 +Deals pain damage. Highly distracting. Offhand: +5 pain damage on attack for 3 stamina. +对目标造成疼痛伤害,并使其极具性奋。副手 : ‎攻击时 +5 疼痛伤害,持续 3 点体力。 +You pick up a riding crop. +你拾起一根鞭子。 + + +Scissors +剪刀 +Safety first! +安全第一! +Deals slash damage. Better than a knife for cutting restraints. +造成斩击伤害。剪断拘束具比刀更好用。 +You pick up a pair of scissors. +你拾起一把剪刀。 + + +Dagger +匕首 +Designed with subterfuge in mind. +设计用于秘密行动。 +Deals slash damage. Deals 40 pierce damage instead on unaware targets, before crit modifiers. Offhand: +10% Base Weapon Crit +造成斩击伤害。在暴击修正之前,对于没有发现你的目标造成40点穿刺伤害。副手 : ‎+10% 基础武器暴击 +You pick up a dagger. +你拾起一把匕首。 + + +Katana +武士刀 +She who strikes first, hits second. +先发制人,后发制于人。 +Deals slash damage. Deals up to 50 bonus damage by waiting 10 turns between attacks. +造成斩击伤害。在攻击之间等待最多10回合可额外造成最高50点伤害。 +You pick up a katana. +你捡起一把武士刀。 + + +Shadow's Edge +暗影之刃 +For those who truly devote themselves to the cause. +为那些真正献身于事业的人而用。 +Deals shadow damage. Damage is doubled against enemies that are in shadow. +造成暗影伤害。对处于暗影中的敌人伤害翻倍。 +You pick up Shadow's Edge. +你拾起了一把暗影之刃。 + + +Stormbreaker +风暴之锤 +I have the power! Taking electric damage charges you (1 turn/10dmg). +我拥有了力量!受到电击伤害会充能 ( 每1回合/10点伤害 ) 。 +Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. Gives +100 Electric Resist when held. (can be wielded offhand to apply the Electric Resist) +造成碾压伤害。充能后,在范围内造成额外最高 40 点电击伤害,装备时提供+100电击抗性。( 可以副手装备以应用电击抗性 ) +You pick up Stormbreaker. +你拿起了风暴之锤。 + + + + +Rapier +迅捷剑 +For the ostentatious and flashy duelist. +给那些张扬浮夸的决斗者。 +Deals slash damage. Deals 50 pierce damage instead on vulnerable targets. +造成斩击伤害。对易受伤害的目标造成 50 点穿刺伤害。 +You pick up some kind of pretentious sword. +你拾起了某种自负的剑。 + + +Foil +花剑 +En garde! +准备好了! +Deals pierce damage. Deals 30 damage instead on vulnerable targets. +造成穿刺伤害。对易受伤害的目标造成 30 点伤害。 +You pick up a fencing sword. +你拾起了一把花剑。 + + +Sledgehammer +大锤 +Do you have what it takes? +你够格吗? +Deals heavy crush damage and knocks the target back 2 spaces. Deals bonus damage to most solid barricades. +造成碾压伤害并将目标击退 2 格。对大多数坚固路障造成额外伤害。 +You pick up a heavy sledgehammer. +你拿起重型大锤。 + + Hammer 锤子 -A rather simplistic bludgeoning weapon. -一种相当简单的钝器。 +A crude way of fixing your problems. +这是解决问题的粗鲁方法。 Deals crush damage and knocks the target back. 造成碾压伤害并将目标击退。 Flail 流星锤 -A ball on a chain. Very fast and hard to dodge. -一个球连接在所脸上。速度非常快,难以躲避。 +Very fast and hard to dodge as long as you know what you're doing. +攻速非常快且难以躲避,只要你知道该怎么使用。 Also deals 10 damage to targets next to you. Deals crush damage. 还会对你旁边的单位造成 10 点伤害。造成碾压伤害。 Spear 矛 Speak softly and carry a pointy stick. -说话要轻声细语,并拿起一根尖锐的棍子。 -Deals pierce damage to the target and one square behind it. -对目标及其后方一格造成穿刺伤害。 +说话轻声细语,随身带着尖棍。 +Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 2 tiles away. +对目标和目标后方一个方格造成刺破伤害。可以在2格外进行远程攻击。 +Pike +长矛 +An 11 foot pole, for things you wouldn't want to touch with a 10 foot pole. +一根11英尺长的杆子,用于你不想用10英尺长的棍子碰的东西。 +Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 3 tiles away. +对目标和目标后方一个方格造成刺破伤害。可以在3格外进行远程攻击。 Bolt Cutters 断线钳 -A cutting tool useful as a bludgeon, and also for cutting locks and chains. -一种可以当做大棒用的切割工具,也可用于切割锁和链条。 +The universal key. +万能钥匙。 Also assists in cutting restraints when equipped. 配备时还有助于切割拘束。 A go-to for travelers and adventurers. 旅行者和冒险家的首选。 -When you don't have any knives, your attacks deal 20 damage instead, halved if feet are bound. -当你没有任何刀具时,你的攻击会造成 20 点伤害,如果脚被束缚则减半。 +Deals slash damage. Offhand: +10 Block +造成斩击伤害。副手: +10 格挡 +Flashlight +手电筒 +A weapon of mass illumination. +大规模照明的武器。 +Provides a highly directional light source. +提供高度定向的光源。 +You pick up a flashlight. +你拿起手电筒。 +Torch +火把 +Second only to the mighty towel in usefulness. +在实用性上仅次于强力毛巾 +Deals fire damage. Provides light. +造成火焰伤害。可以提供光亮。 +Unarmed +徒手 +Fight with your hands and feet. Counts as teasing if arms are free. 50% chance to stun target if the target is disarmed. +以手部和脚部攻击。如果手臂未被束缚,则视为妩媚伤害。如果目标处于缴械状态,有50%的几率使其眩晕。 +Deals unarmed damage. +造成徒手伤害。 Sword 剑 -The blade is strong, its edge sharp. -刀刃坚固,刃口锋利。 +the steel is strong, and the blade true. +钢坚刃利 A fast and accurate weapon that deals slash damage. -一种快速而准确的武器,可造成斩击伤害。 +一种快速而精准的武器,可造成斩击伤害。 Flamberge -炎剑 -A blade forged in a magical fire. +焰形剑 +A blade forged in magic fire. 用魔法之火锻造的刀刃。 -Deals 20 bonus fire damage on hit. -击中时造成 20 点额外火焰伤害。 +Deals 20 bonus slash damage on hit. Offhand: Produces light. +击中时额外造成 20 点斩击伤害。副手 : ‎产生光亮。 Escort Drone 护航无人机 A semi-autonomous drone with a personal defense beam. Does not require hands to equip. -带有个人防御光束的半自主无人机。不需要双手装备。 +带有个人防御光束的半自主无人机。不用手也可装备。 Deals electric damage. 33% chance to stun for 4 turns. 造成电击伤害。有 33% 的几率眩晕目标 4 回合。 Magic Wand -魔法棒 +神奇妙妙棒 Its powers extend beyond the traditional schools of magic. 它的力量超越了传统的魔法。 -Deals charm damage (50% effectiveness vs. most enemies). 50% chance to stun the target for 1 turn. -造成魅惑伤害(对大多数敌人的效果为 50%)。有 50% 的几率使目标眩晕 1 回合。 -Feather -羽毛 -A feather useful for tickling. -用于挠痒痒的羽毛。 -Deals tickle damage (50% effectiveness vs. most enemies). Drains low stamina. -造成挠痒痒伤害(对大多数敌人的效果为 50%)。消耗很少的耐力。 +Deals charm damage. 20% chance to stun the target for 2 turns. Offhand: +5 charm damage on attack for 3 stamina. +造成魅惑伤害,有 20% 的几率使目标眩晕 2 回合。副手 : ‎攻击时造成 +5 魅惑伤害,消耗 3 点体力。 Ice Cube 冰块 A magical cube of ice that never melts. Convenient! 一块永远不会融化的神奇冰块。很方便! -Deals 10 ice damage with a 10% chance to freeze for 3 turns. -造成 10 点冰属性伤害,并有 10% 的几率冻结 3 回合。 +Deals 10 ice damage with a 10% chance to freeze for 1 turn. Slows targets on hit. Offhand: Slows the target. +造成 10 点寒冰伤害,并有 10% 的几率冻结 1 回合。击中目标时减慢速度。副手 : ‎减慢目标速度 Rope 绳索 A kidnapper's most versatile tool. 绑匪最通用的工具。 -Deals 5 chain damage and applies 4 points of binding. -造成 5 点锁链伤害并施加 4 点束缚。 -Enchanted Sword -附魔剑 +Deals chain damage and applies 50 points of binding. +造成锁链伤害并增加 50 点束缚。 +Magic Sword +魔法剑 Slices through ghosts with ease! -轻松穿过鬼魂! +轻松穿过幽灵! A sword that guides itself toward its target, making it easy to hit with. 将自身导向目标的剑,使其易于击打。 Dragonslaver -驯龙者 +”驯龙者“ A powerful weapon with an ancient mechanism that launches binding belts. -一种强大的武器,具有发射捆绑带的古老机制。 -Deals slash damage. Drains 0.75% ancient energy to fire a line of belts that deal 40 chain damage and 4 extra binding. -造成斩击伤害。消耗 0.75% 的远古能量来发射一条造成 40 点连锁伤害和 4 点额外束缚的皮带。 +一种强大的武器,具有古老的机制,可以发射束缚带。 +Deals slash damage. Can make ranged attacks.. Drains 0.75% ancient energy to fire a line of belts that deal 40 chain damage and 40 binding. +造成斩击伤害,可以远程攻击。消耗 0.75% 远古能量来发射一连串的皮带,造成 40 点锁链伤害并增加 40 点束缚。 Metamorphosis -变形法杖 -You can enter slime form for 25 turns, which lets you pass thru bars, +50% evasion, and deals 25 glue damage when attacked. -你可以进入史莱姆形态 25 回合,这让你可以通过栅栏,+50% 闪避,并在受到攻击时造成 25 点胶水伤害。 -Deals glue damage. Roots targets for 2 turns on a hit. -造成胶水伤害。定身目标 2 回合。 -Bondage Buster -束缚破坏者 -Can fire a beam (1 turn channel) that deals 15 electric damage, but charges when not fired, for up to 85 bonus damage over 10 turns. -可以发射光束(1 回合通道),造成 15 点电伤害,但未发射时会充能,在 10 回合后最多造成 85 点额外伤害。 -Melee mode deals tickle damage and marks enemies as vulnerable for 6 turns. -近战模式造成挠痒痒伤害并将敌人标记为易伤 6 回合。 +“变形者” +You can enter slime form for 25 turns, which lets you pass thru bars, +50 Evasion, and deals 25 glue damage when attacked. +你可以进入粘液形态,持续25回合。在粘液形态下,你可以穿过栅栏,增加 50 点闪避,并在受到攻击时对攻击你的目标造成 25 点胶体伤害。 +Deals glue damage. Roots targets for 2 turns on a hit. Offhand: Roots targets on hit. +造成胶体伤害。固定目标 2 回合。副手 : ‎命中时定身目标。 +Four Seasons +“四季” +Activate to reduce the cost of your next fire, water/ice, air/lightning, and earth spell by 50, once per element. +激活后,你的下一个火/水/冰/风/雷/岩属性法术的消耗降低50,但每个元素仅生效一次。 +Deals shadow damage. +25% fire, ice, soap, crush, electric, blast damage. Offhand: Applies passive bonus. +造成暗影伤害,+25% 火/冰/皂化/风/雷/岩/碾压/爆炸伤害。副手 : ‎应用被动加成。 +The Arbiter +“仲裁者” +I have altered the rules. Pray I do not alter them further. +我已改变规则,祈祷我不会再进一步改变它们。 +Deals chain damage with 125% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Weapon Ability: Disarm +以 125% 束缚效率造成连锁伤害,对召唤物造成 +40 暗影伤害。+25% 胶体和锁链伤害。武器能力 : ‎缴械 +Bondage Buster EX +“束缚破坏者 EX” +Can fire a beam (1 turn channel) that deals 30 electric damage and applies an equal amount of energy bondage. Charges when not fired, dealing 90 total damage at 10 turns of charge. +可以发射一道光束 ( 引导1回合 ) ,造成 30 点电击伤害,并施加等量的能量束缚。未发射时会充能,充能 10 回合可造成 90 点总伤害。 +Melee mode deals tickle damage and marks enemies as vulnerable for 4 turns. +近战模式造成挠痒伤害,并且标记敌人为易受攻击状态,持续 4 回合。 +Bondage Buster MK II +”束缚破坏者 MK II“ +Can fire a beam (3 turn channel) that deals 35 electric damage in an area and applies an equal amount of energy bondage. While charge is below 50%, has a 10% chance to misfire. +可以发射一道光束 ( 引导3回合 ),对一定范围内造成 35 点电击伤害,并施加等量的能量束缚。当能量低于 50% 时,有 10% 的几率会射不中。 +Melee mode deals tickle damage and marks enemies as vulnerable for 2 turns. +近战模式会造成挠痒伤害,并且标记敌人为易受攻击状态,持续 2 回合。 +Nevermere Blaster +“奈文米尔爆能枪“ +Can fire a blast that deals 25 electric damage. +可以发射一道造成 25 点电击伤害的冲击波。 +Melee mode deals tickle damage. +近战模式造成挠痒伤害。 +Blaster Shot +爆能射击 +You set your blaster to stun and fire! +你设置爆破枪为击晕状态,并开火射击! +Messenger of Love +”爱之使者“ +Love shines in many ways... +爱以多种方式闪耀... +Can fire an arrow that makes an enemy extremely lustful, causing them to attack others. Lasts forever on lesser enemies, 30 turns on high-level enemies, and 10 turns on bosses. +可以发射一支箭,使敌人精虫上脑,导致他们攻击其他人。对较低级别的敌人持续时间永久,对高级敌人持续30回合,对首领持续10回合。 Moirai's Scissors -Moirai的剪刀 -Can enter a frenzy for 10 turns to attack twice per turn. -可以进入狂暴状态10回合,每回合攻击2次。 -Deals slashing damage. Consumes binding on a target, converting it to Soul damage at a 1:1 ratio. -造成挥砍伤害。消耗对目标的束缚,以 1:1 的比例将其转化为灵魂伤害。 +“命运女神之剪” +Cutting the threads of fate. +隔断命运的丝线。 +Deals slash damage. Ignores up to 100 Magic and Physical armor. Active ability: Spend 50 charge to free all nearby allies and disrobe enemies, increasing charm damage on them by 100% and applying the armor shred. +造成斩击伤害。忽略最多 100 点魔法和物理护甲。主动能力 : ‎花费 50 点能量来释放附近所有盟友并脱去敌人的衣服,使他们受到的魅惑伤害提高 100% 并施加破甲。 +With a single snip of the magic scissors, everyone's clothes fall off. +魔法剪刀一剪,所有人的衣服都掉了下来。 +No eligible targets within 4 tiles +4 个方格内没有符合条件的目标 Latex Projector 乳胶投射器 Deals crush damage. Can be used to spray a '+' shaped pool of slime. -造成碾压伤害。可用于喷洒“+”形史莱姆池。 -Drains 1.5% ancient energy to create a pool of slime that deals 35 glue damage per tile and slows enemies. -消耗 1.5% 的远古能量来制造一个史莱姆池,每格造成 35 点胶水伤害并减速敌人。 -Enchanted Axe +造成碾压伤害。可用于喷洒“+”形粘液池。 +Spend 15 charge to create a pool of slime that deals 35 glue damage per tile and slows enemies. +花费 15 点能量来制造一滩粘液,每块造成 35 点胶体伤害并减缓敌人的速度。 +Magic Axe 魔法斧 Sick and vile, like the hearts of your enemies. -病态和卑鄙,就像你敌人的心。 -Deals shadow damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns. -对目标造成暗影伤害,对身边的敌人造成20点暗影伤害。减速3回合。 +病态且卑鄙,就像你敌人的心思。 +Deals slash damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns and applies 60 shadow damage bleed over time to enemies around you. +对目标造成斩击伤害,对身边的敌人造成20点暗影伤害。减速3回合。 Pickaxe 镐 Used for drilling holes in rock and armor. 用于在岩石和盔甲上钻孔。 Deals pierce damage. Reduces enemy armor by 15 for 6 turns. 造成穿刺伤害。减少敌人15点护甲,持续6回合。 -Enchanted Flail +Magic Flail 魔法流星锤 A blessed censer that distributes pain equally. -一个用于平等地分配伤害的受祝福的香炉。 -Deals crush damage to the target and all enemies near the target. -对目标和目标附近的所有敌人造成碾压伤害。 -Enchanted Spear +一个能平等分配痛苦的祝福香炉。 +Deals crush damage. Deals 20 bonus holy damage to the target and enemies near the target. +造成碾压伤害。对目标和目标附近的敌人造成20点额外的神圣伤害。 +Magic Spear 附魔长矛 Seeks and pierces hearts with ease. 轻松地寻找和刺穿心脏。 -Deals pierce damage to the target and two squares behind it. -对目标及其后面的两个方格造成穿刺伤害。 -Enchanted Hammer +Deals pierce damage to the target and two squares behind it. Can be used to make a ranged attack. +对目标及其后面的两个方格造成穿刺伤害。可用于进行远程攻击。 +Magic Hammer 魔法锤 Made of a magical, resonant material. 由神奇的共振材料制成。 Deals crush damage and knocks the target back. Helps to bash open restraints while cutting. 造成碾压伤害并将目标击退。有助于在切割时猛击打开的拘束。 -IceBreaker +Icebreaker 破冰锤 -A frigid lightweight hammer with a spike on the end. -一把冰冷的轻锤,末端有钉子。 -Deals crush damage. Deals 2.5x damage to frozen targets instead of 2x. Triggers Shatter. -造成碾压伤害。对冻结的目标造成 2.5 倍的伤害,而不是 2 倍。触发粉碎。 +A frigid magical hammer useful for both climbing up and destroying ice. +一把冰冷的魔法锤子,可以用来攀爬或破冰。 +Deals crush damage. Deals 3x damage to frozen targets instead of 2x. Triggers Shatter. +造成碾压伤害,对冰冻的目标造成 3 倍而不是 2 倍伤害,触发粉碎。 +Dreamcatcher +”逐梦者“ +Forged in nightmares, woven in steel. Summons a Shadow Warrior on unaware targets for 2% ancient energy. +与噩梦中铸造,用钢铁来编织。消耗 2% 的古代能量,在未察觉的目标身上召唤一个暗影武士。 +Deals shadow damage. Deals up to 30 bonus psychic damage on unaware (100%) or vulnerable (50%) targets. +造成暗影伤害。对未察觉(100%)或易受伤害(50%)的目标造成高达 30 的额外灵能伤害。 Axe 斧头 -Popular among raiders and lumberjacks. -在袭击者和伐木工人中很受欢迎。 +Great for cutting trees that happen to be underground. +对于地下的树木也非常有效。 Also deals 20 damage to enemies next to you. Deals slash damage. 同时对你旁边的敌人造成 20 点伤害。造成斩击伤害。 -Knife -刀 -Unarmed -徒手 -Hit Chance: -命中几率: -No Exit Keys -没有离开的钥匙 +Accuracy: +命中率 : ‎ +Crit Multiplier: +暴击倍率 : ‎ +Bind Crit Multiplier: +束缚暴击倍率 : ‎ Find the keys.. 寻找钥匙... Find the exit! 寻找出口! -Found something sharp! -找到了锋利的东西! -Found a corner! -找到一个角落! -Found a crack! -找到一条裂缝! -Found something sticky! -发现了一些黏糊糊的东西! -Receiving Help... -正在接受帮助... -Found a hook! -找到了一个钩子! -Found an edge! -找到了边缘! -Evasion: -闪避: -Visibility: -可见度: -Armor: -盔甲: -Spell Ward: -法术抗性: -In the Shadows -在阴影中 -Invisible! -隐身! -Quickness!!! -敏捷!!! -Shield: -护盾: -DAMAGETYPE Mod: -受伤类型 Mod: -Released from Jail -出狱 -On the Run! -快跑! -Prisoner -囚犯 +You are receiving help from a friendly ally. +你得到了友好盟友的帮助 +You found a hook you can use to pull on straps and loops. +你找到了一个钩子,可以用来拉动带子和环扣 +You have access to something sharp and can attempt to Cut restraints, or Remove more effectively. +你可以使用锋利的工具来尝试切断拘束具,其可更有效地解除束缚 +You found a corner to help manipulate buckles and snaps with. +你找到了一个角落,可以帮助你操纵带扣和卡扣 +You found a crack and could maybe wedge a knife or tool into it to keep it still. +你找到了一个缝隙,可以将刀或工具塞进去,让它保持稳定 +You found something sticky and might be able to pull off fabrics. +你找到了一些黏糊糊的东西,也许可以用它来撕掉布料 +Evasion: +闪避 : ‎ +Visibility: +可见度 : ‎ + + +Submissive: Enemies won't attack you, but they will try to play with you. +顺从者 : ‎敌人不会尝试攻击你,但他们会尝试对你做一些奇妙的互动。 +On the Run! Enemies are hostile. +逃亡!敌人对你怀着敌意。 +Prisoner: Enemies won't attack you unless you are out of jail. +囚犯 : ‎敌人不会攻击你,除非你越狱。 Freedom 自由 Crawling slowly! @@ -1152,64 +3226,40 @@ Immobile! 无法移动! Enclosed! 附上! -Plugged! -插上! -Filled! -填充! -Denied! -拒绝! -Teasing... -戏弄... -Vibrating Gently! -轻轻振动! -Vibrating! -振动! -Vibrating Intensely! -强烈振动! -Vibrating Powerfully! -有力地振动! -Vibrating Torturously! -令人痛苦的振动! -Nipples -乳头 -Nipples -乳头 -Breasts -胸 -Panties -内裤 -Panties -内裤 -Front -正面 -Rear -后部 -Feet -脚 -Everywhere! -任何位置! + + You feel a gentle buzz... 你感觉到了轻轻的振动... Your toys tease you gently... -玩具正在轻轻地逗弄你…… +玩具正在轻轻地挑逗你…… Your toys are vibrating. 你的玩具在振动。 Your toys are buzzing strongly! -你的玩具发出强烈的嗡嗡声! +你的玩具嗡嗡作响! Your toys vibrate intensely! 你的玩具剧烈振动! The vibration is torturous! -震动令你感到痛苦! +痛苦的震动 + + Edged! -极限! -Satisfied~ -满意~ -Damage: -伤害: -Accuracy: -准确度: -SP Cost: -SP费用: +高潮边缘! +Satisfied. Miscast chance is reduced. +满足。减少失误的概率 + + +Damage: +基础伤害 : +Bind: +束缚值 : +Crit: +暴击倍率 : +SP Cost: +SP 消耗 : +Cut PWR: AMNT% +力量削减 : ‎AMNT% + + It appears to be a receptacle 它似乎是一个容器 Place live crystal @@ -1217,21 +3267,29 @@ Place live crystal Take the crystal 拿走水晶 You place the crystal into the receptacle and it lights up! -您将水晶放入容器中,它亮起了! +你将水晶放入容器中,它亮起了! You take the crystal from the receptacle and all goes dark. 你从容器中取出水晶,一切都变黑了。 +You try to take the crystal but the cage around it is secured with a magic purple lock. +你试图拿走水晶,但水晶周围的笼子被一把紫色的魔法锁锁住了。 Place spent crystal 放置用过的水晶 VALUE gold vanishes from your satchel as the receptacle explodes and your crystal is recharged! -VALUE 黄金从你的书包中消失,同时容器爆炸并且你的水晶充能了! +VALUE 黄金从你的背包中消失,在容器爆炸的同时你的水晶充能了! Nothing seems to happen 似乎什么都没有发生 + + The EnemyName grabs you by the RestraintName and keeps you in place! EnemyName 通过 RestraintName 抓住你,让你留在原地! The EnemyName grabs you and pulls you!!! EnemyName 抓住你,并拉着你!!! The EnemyName misses you! EnemyName 没有命中你! +You duck under the EnemyName's attack! +你蹲下躲过了 EnemyName 的攻击! + + You hear a door creak open nearby! 你听到附近的门吱吱作响! You hear the faint sound of a door opening. @@ -1240,32 +3298,52 @@ You hear a door slam shut nearby! 你听到附近有砰的关门声! You hear a door being shut in the distance. 你听到远处有一扇门被关上了。 + + The slime is spreading over your body!!! -史莱姆在你的身体上蔓延!!! +粘液在你的身体上蔓延!!! The slime starts to harden over your skin... -史莱姆开始在你的皮肤上变硬...... -Angel Courier -天使信使 -You oneshotted her. What kind of devil are you??? -你一击打倒了她。你是什么魔鬼??? -The angel decides to toy with you while you are trussed up. -当你被绑起来时,天使决定玩弄你。 -The angel snaps her fingers and divine restraints appear on your body! -天使打了个响指,神圣的束缚出现在你的身上! -Angel Courier -天使信使 +粘液开始在你的皮肤上变硬...... + + +The RESTRAINTNAME creates more bindings out of thin air! (+RestraintAdded) +RESTRAINTNAME 凭空创建了更多束缚! ( +RestraintAdded ) +A RESTRAINTNAME has appeared around your neck! Beware of additional restraints! +一个 RESTRAINTNAME 出现在你的脖子上!当心额外的束缚! +The RESTRAINTNAME has run out of bindings to add and has gone dormant for a period of time. +RESTRAINTNAME 已用尽可添加的束缚,并且已闲置了一段时间。 + + +Angel +天使 You subdue the angel! 你捕获了天使! -The angel decides to toy with you while you are trussed up. -当你被绑起来时,天使决定玩弄你。 -The angel snaps her fingers and divine restraints appear on your body! -天使打了个响指,神圣的束缚出现在你的身上! +The angel decides to toy with you while you are trussed up. (DamageTaken) +当你被捆绑时,天使决定玩弄你。 ( DamageTaken ) +The angel snaps her fingers and divine restraints appear on your body! (+RestraintAdded) +天使弹指一挥,神圣束缚就出现在了你的身上! ( +RestraintAdded ) +The angel snaps her fingers and glowing locks appear on your body! +天使弹指一挥,闪亮的锁就锁在你的身上! + + +Holy Construct +神圣结构体 +You banish the holy construct! +你放逐了神圣结构体! +The holy construct emits a searing light! (DamageTaken) +神圣结构体发出灼热的光芒! ( DamageTaken ) +The holy construct emits a blinding light! (DamageTaken) +神圣构造体发出耀眼的光芒! ( DamageTaken ) +The holy construct emits a Binding light! (+RestraintAdded) +神圣构造体发出束缚之光! ( +RestraintAdded ) + + Be not afraid! I am the courier of a local shrine, and I have come to take your offering. 不要害怕!我是当地神社的信使,来接你的供品。 Hold still and I will take the offering... 保持不动,我会接受供品... (She takes the gold) -(她拿起了金币) +( 她拿起了金币 ) Peace be with you! Goodbye! 祝你平安!再见! You don't have the gold, do you? @@ -1276,142 +3354,220 @@ For I will first have a little fun... 因为我会先享受一点乐趣..... You have brought this upon yourself, after all. 毕竟,这是你自作自受。 + + The angel frowns as you attack her, and glowing rings appear. 当你攻击她时,天使皱起眉头,并出现发光的戒指。 + + Angel: MMMMMPHH!!! -天使:呜呜呜!!! +天使 : ‎呜呜呜!!! + + (The angel looks puzzled and unlocks your divine restraints) -(天使一脸疑惑,解开你的神圣束缚) +( 天使一脸疑惑,解开你的神圣束缚 ) + + +The EnemyName pulls away your ArmorName!!! +EnemyName 夺走了你的 ArmorName!!! +There was a bug removing your ArmorName. Please report! +移除你的 ArmorName 时出现错误。请报告! +The EnemyName bypasses your security to add the RestraintName! +EnemyName 绕过你的安全措施添加了 RestrictName! +The EnemyName tries to restrain you, but you resist the bondage! +EnemyName 试图束缚你,但被你抵抗了! +Resist! +抵抗! + + Mystic Lock -神秘锁 +魔力锁 The mystic lock fades, allowing you to pass once more. -神秘锁消失,让你再次通过。 -As you cross the threshold, a mystical lock appears to prevent you from stepping back! -当你跨过门槛时,一个神秘的锁会出现,阻止你返回! +魔力锁消失,让你再次通过。 As you cross the threshold, a mystical lock appears to prevent you from stepping back! 当你跨过门槛时,一个神秘的锁会出现,阻止你返回! + + +Metal Shield +金属盾牌 +The shield falls to the floor. +盾牌掉落在地板上。 +A metal shield blocks your way! +金属盾牌挡住了你的路! +Several metal shields block your way! +几个金属盾牌挡住了你的路! + + Illusion 幻术 -Misc -通用 The illusion vanishes into thin air. 幻象消失得无影无踪。 Wall 墙 The wall shatters into pieces, which fade away slowly. 墙壁破碎成碎片,慢慢消失。 +Locked Door +锁定的门 +The door lock shatters into pieces. +门锁碎成了碎片。 +Earthen Monolith +泥土巨石 +The monolith recedes into the ground. +巨石逐渐沉入地下。 +Static Sphere +静态球体 +The sphere shrinks back into the storm dimension. +球体收缩回风暴维度。 Familiar 小精灵 The familiar dissolves into spectral ash. 小精灵溶解成灰烬。 -Latex Doll -乳胶娃娃 The doll gives in to her desires and squirms around on the ground. 娃娃屈服于她的欲望,在地上扭来扭去。 Storm Crystal 风暴水晶 The storm crystal shatters into many crackling pieces. 风暴水晶破碎成许多噼啪作响的碎片。 -Fire Elemental -火元素 -The fire elemental dissolves into ash. -火元素溶解成灰烬。 +Fire Mote +火星 +The fire mote is extinguished. +火星渐熄 +Air Mote +气尘 +The air mote returns to dust. +气尘渐散。 +Water Mote +水滴 +The water mote turns into a puddle. +水滴渐溶. +Earth Mote +土粒 +The earth mote crumbles. +土粒渐碎. Shadow Warrior -影子勇士 +暗影武士 The shadow warrior screeches as it vanishes into mist. -影子勇士尖叫着消失在雾中。 +暗影武士尖叫着消失在雾中。 Allied Golem -友方石魔像 +协约魔像 The words vanish from the golem's forehead as it crashes down. -石魔像坠落的时候,咒语从他的额头消失了。 +魔像坠落的时候,咒语从他的额头消失了。 + + +Shopkeeper +店主 +You have done a terrible deed. +你做了一件可怕的事。 + + Crystal Monolith 水晶巨石 The crystal fades from the monolith. 水晶从巨石上消失。 + + Orb Guardian -水晶守卫 +宝球守卫 The Orb Guardian dissolves into sand and bone dust. -水晶守卫溶解成沙子和骨灰。 +宝球守卫溶解成沙子和骨灰。 + + + + You feel like you have made a grave mistake. 你觉得你犯了一个严重的错误。 + + Zombie 僵尸 The zombie moans and collapses to the ground. 僵尸呻吟着倒在地上。 The zombie's charms attach to your body (+RestraintAdded) -僵尸的绷带附在你的身上(+RestraintAdded) +僵尸的绷带附在你的身上 ( +RestraintAdded ) The zombie caresses your body! (DamageTaken) 僵尸爱抚你的身体! (DamageTaken) + + Maidforce Recruit -女佣招募 +女仆招募 The maid does a fumbled retreat. 女仆手忙脚乱地撤退。 The maid uses a fast-binding technique! (+RestraintAdded) -女仆使用快速绑定技术! (+RestraintAdded) +女仆使用快速绑缚技术! ( +RestraintAdded ) The maid snaps a lock on one of your restraints! (DamageTaken) 女仆锁住了你的一个拘束具! (DamageTaken) The maid tickles you with her feather duster! (DamageTaken) 女仆用她的鸡毛掸子逗你! (DamageTaken) + + M.F. 'Unseen Blade' -M.F. "隐秘之刃" +女.仆.'隐秘之刃' The maid runs back to the shadows. 女仆逃回阴影中。 The maid uses secure restraints on you! (+RestraintAdded) -女仆对你进行严密的拘束! (+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -女仆锁住了你的一个拘束具! (DamageTaken) +女仆对你进行严密的拘束! ( +RestraintAdded ) The maid stealthily rubs your sensitive areas! (DamageTaken) -女仆偷偷摸摸你的敏感部位! (DamageTaken) +女仆偷偷摸你的敏感部位! (DamageTaken) + + The maid throws a smoke bomb at the ground! 女仆向地面投掷烟雾弹! -M.F. 'Unseen Blade' -M.F. "隐秘之刃" -The maid does a fumbled retreat. -女仆手忙脚乱地撤退。 + + The maid rubs you from many angles! (DamageTaken) 女仆从多个角度爱抚你的身体! (DamageTaken) + + M.F. 'Going Loud' -M.F.“大声” -The maid does a fumbled retreat. -女仆手忙脚乱地撤退。 -The maid uses secure restraints on you! (+RestraintAdded) -女仆对你进行严密的拘束! (+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -女仆锁住了你的一个拘束具! (DamageTaken) +女.仆. '花哨' The maid lands a kick and stuns you! (DamageTaken) 女仆一脚踢晕了你! (DamageTaken) The maid slaps you with a scornful expression! (DamageTaken) 女仆一脸不屑的打你! (DamageTaken) + + +Heavy Weapons Maid +重武女仆 +The maid drops her weapon and runs. +女仆丢下武器就跑。 +The maid bonks you with her weapon! (DamageTaken) +女仆用她的武器打你! ( DamageTaken ) + + M.F. 'Parasol' -M.F. 帕拉索尔 +女.仆. '遮阳伞' The maid leaps out of sight. 女仆跳出视线。 -The maid uses secure restraints on you! (+RestraintAdded) -女仆对你进行严密的拘束! (+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -女仆锁住了你的一个拘束具! (DamageTaken) The maid caresses your breasts with a smile! (DamageTaken) 女仆微笑着抚摸你的乳房! (DamageTaken) + + M.F. 'Master Plan' -MF“总体规划” +女.仆. '女仆长' The head maid surrenders gracefully. 女仆长优雅地投降。 The head maid suddenly whips out a restraint and locks it on! (+RestraintAdded) -女仆长突然抽出拘束具,将其锁在你身上! (+RestraintAdded) -The head maid snaps her fingers and locks your restraints! (DamageTaken) -女仆长打了个响指,锁住了你们的拘束具! (DamageTaken) +女仆长突然抽出拘束具,将其锁在你身上!(+RestraintAdded) +The head maid snaps her fingers and you find your restraints locked! (DamageTaken) +女仆长打了个响指,你发现你的束缚被锁住了!(DamageTaken) The head maid tickles you strategically! (DamageTaken) -女仆长有策略地逗你! (DamageTaken) +女仆长有策略地逗你!(DamageTaken) +You are distracted for a moment and suddenly you find yourself in chastity! +你一时心神不宁,突然发现自己在贞洁带里! + + Fire Elemental -火元素 +火精灵 The fire elemental dissolves into ash. -火元素溶解成灰烬。 +火精灵化为灰烬。 The fire elemental conjures forged restraints around your limbs! (+RestraintAdded) -火元素在你的四肢周围召唤出锻造的束缚! (+RestraintAdded) +火精灵在你的四肢上固定了其锻造的束缚! ( +RestraintAdded ) The fire elemental places a heavy lock on your restraint! (DamageTaken) -火元素重重地锁住了你的拘束具! (DamageTaken) +火精灵将你的拘束具牢牢地锁住了! (DamageTaken) The fire elemental touches you with her burning finger! (DamageTaken) -火元素用她燃烧的手指触碰你! (DamageTaken) +火精灵用她燃烧的手指触碰你! (DamageTaken) + + Ranger of the Wild 荒野游侠 The ranger disappears into the environment. @@ -1419,843 +3575,1643 @@ The ranger disappears into the environment. The ranger gropes your chest with a smile on her face! (DamageTaken) 游侠带着微笑摸着你的胸膛! (DamageTaken) The ranger surprises you and binds you! (+RestraintAdded) -游侠偷袭了你并绑住了你! (+RestraintAdded) +游侠偷袭了你并绑住了你! ( +RestraintAdded ) +The ranger slips a lock onto one of your restraints! (DamageTaken) +游侠在你的拘束具上滑上了一把锁!(DamageTaken) + + Druid of the Wild 野性德鲁伊 The druid calls forth vines to mask her retreat. 德鲁伊召唤出藤蔓来掩护她撤退。 -The druid calls forth vines to mask her retreat. -德鲁伊召唤出藤蔓来掩护的撤退。 The druid holds your face and kisses you! (DamageTaken) 德鲁伊捧着你的脸亲吻你! (DamageTaken) The druid binds you with mithril restraints! (+RestraintAdded) -德鲁伊用秘银拘束具束缚你! (+RestraintAdded) +德鲁伊用秘银拘束具束缚你! ( +RestraintAdded ) +The druid tosses a lock from her cloak! It finds you and fastens with a click. (DamageTaken) +德鲁伊从斗篷中扔出一把锁!它找到了你,咔哒一声锁上了。(DamageTaken) + + Water Elemental -水元素 +水精灵 The water elemental melts into a pool of water. -水元素融化成一滩水。 +水精灵化成一滩水。 The water elemental's song compels you to be bound! (+RestraintAdded) -水元素的歌声强迫你被束缚! (+RestraintAdded) +水精灵发出的歌声使你被束缚! ( +RestraintAdded ) +The water elemental sings a song of helplessness. (DamageTaken) +水精灵唱着一首无助之歌。 ( DamageTaken ) The water elemental's song compels you to step forward and receive a binding! -水元素的歌声让你走过去被束缚! +水精灵的歌声迫使你向前走去,接受其的束缚! The water elemental sings an arousing song! (DamageTaken) -水元素唱起挑逗的歌! (DamageTaken) +水精灵唱起挑逗的歌曲! (DamageTaken) + + Ice Elemental -冰元素 +冰精灵 The ice elemental melts into a pool of water. -冰元素融化成一滩水。 +冰精灵融化成一滩水。 The ice elemental touches you, forming tendrils of ice! (+RestraintAdded) -冰元素接触到你,用冰拘束了你! (+RestraintAdded) +冰精灵触摸了你,你的身上形成了冰制束缚!(+RestraintAdded) The ice elemental creates icy locks on your restraints! -冰元素在你的拘束具上形成冰锁! +冰精灵用冰制成的锁将你的拘束具锁上了! The ice elemental gives a chilling touch to your body! (DamageTaken) -冰元素给你的身体带来冰冷的触感! (DamageTaken) +冰精灵给你的身体带来了寒冷的触感!(DamageTaken) + + Earth Elemental -土元素 +土精灵 The earth elemental sinks into the ground. -土元素沉入地下。 +土精灵沉入地下。 The earth elemental pins you and slaps on some restraints! (+RestraintAdded) -土元素抓住了你,并把你塞进拘束具中! (+RestraintAdded) +土精灵抓住了你,并用拘束具将你绑起来! ( +RestraintAdded ) The earth elemental locks a restraint! -土元素锁了一个拘束具! +土精灵将一个束缚锁住了! The earth elemental dashes through the earth! -土元素冲破大地! -The earth elemental gives you a heavy massage! (DamageTaken) -土元素重重地按压你! (DamageTaken) +土精灵冲破大地! +The earth elemental gives you a soft massage! (DamageTaken) +土元素给你轻轻按摩!(DamageTaken) + + + + Air Elemental -风元素 +风精灵 There is no more elemental. Must have been just the wind. -不再有元素的存在。应该只是风。 +不再有精灵的存在,也许只是风吧。 The air elemental sneakily slips a restraint on! (+RestraintAdded) -风元素鬼鬼祟祟地束缚了你! (+RestraintAdded) +风精灵偷偷地束缚了你! ( +RestraintAdded ) The air elemental blinks to your position! -气元素闪烁到你的位置! -The air elemental slips a lock on! -气元素锁上了一个拘束具! +风精灵眨眼间出现在你的位置! +The air elemental slips a lock on! (DamageTaken) +风精灵锁住了你! ( DamageTaken ) The air elemental spanks you playfully! (DamageTaken) -气元素玩弄地拍打你! (DamageTaken) +风精灵调皮地打了你一下屁股!(DamageTaken) + + Angry Zombie -愤怒的僵尸 -The zombie screams and tumbles to the floor. -僵尸尖叫着摔倒在地。 -The zombie swiftly wraps you in charms! (+RestraintAdded) -僵尸迅速将你包裹在绷带中! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -僵尸摸索着你的身体! (DamageTaken) -Zombie -僵尸 +愤怒僵尸 The zombie screams and tumbles to the floor. 僵尸尖叫着摔倒在地。 The zombie swiftly wraps you in charms! (+RestraintAdded) -僵尸迅速将你包裹在绷带中! (+RestraintAdded) +僵尸迅速将你包裹在绷带中! ( +RestraintAdded ) The zombie gropes your body! (DamageTaken) 僵尸摸索着你的身体! (DamageTaken) -Skillful Zombie -熟练的僵尸 + + +Support Drone +支援无人机 +The support drone retreats to recharge its weapon! +支援无人机撤退为其武器充能! +The support drone zaps you! (DamageTaken) +支援无人机轰炸你! ( DamageTaken ) +The Dollmaker commands a drone to attack you! +玩偶师命令无人机攻击你! +The Dollmaker commands her drones to attack you! +玩偶师命令她的无人机攻击你! + + +Capture Drone +捕获无人机 +The capture drone's latex core overloads! +捕获无人机的乳胶核心超载! +The capture drone grapples you! (DamageTaken) +捕获无人机抓住你了! ( DamageTaken ) +The capture drone wraps you in advanced cables! (+RestraintAdded) +捕获无人机将你包裹在先进的缆绳中! ( +RestraintAdded ) +The Dollmaker commands a drone to capture you! +玩偶师命令无人机来捕捉你! +The Dollmaker commands her drones to capture you! +玩偶师命令她的无人机来捕捉你! + + +Artistic Zombie +艺术僵尸 The zombie smiles as it collapses to the ground. 丧尸微笑着倒在地上。 The zombie swiftly ties you! (+RestraintAdded) -僵尸迅速地束缚了你! (+RestraintAdded) +僵尸迅速地束缚了你! ( +RestraintAdded ) +The zombie is somehow dextrous enough to lock your restraint! (DamageTaken) +僵尸灵巧地锁住了你的束缚! ( DamageTaken ) The zombie cuddles with your body! (DamageTaken) -僵尸拥抱你的身体! (DamageTaken) +僵尸拥抱你的身体! ( DamageTaken ) + + Mage Zombie -法师僵尸 +魔法僵尸 The zombie frowns and disappears in a puff of ice and ribbons. -僵尸皱起眉头,消失在一阵冰和丝带中。 +僵尸皱起眉头,消失在一阵冰和绷带中。 The zombie smiles as she wraps you in charms! (+RestraintAdded) -僵尸在用绷带包裹你时微笑! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -僵尸摸索着你的身体! (DamageTaken) +僵尸在用绷带包裹你时微笑! ( +RestraintAdded ) +The zombie's ribbons form magical locks on your body! (DamageTaken) +僵尸的绷带在你身上形成了神奇的锁! ( DamageTaken ) + + Talisman Zombie -丝带僵尸 +护符僵尸 The zombie pouts and puts up a shield to let her retreat. 僵尸撅着嘴,竖起盾牌让她撤退。 The zombie giggles as she wraps you in charms! (+RestraintAdded) -当她用绷带包裹你时,僵尸会咯咯地笑! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -僵尸摸索着你的身体! (DamageTaken) +当她用绷带包裹你时,僵尸会咯咯地笑! ( +RestraintAdded ) +The zombie uses a sealing spell to create magical locks! (DamageTaken) +僵尸使用封印咒语创造出魔法锁! ( DamageTaken ) + + Warrior Zombie 战士僵尸 -The Warrior zombie yells and falls cinematically. -战士僵尸在电影中大喊大叫并摔倒。 -The Warrior zombie uses a traditional binding technique (+RestraintAdded) -战士僵尸使用传统的绑定技术(+RestraintAdded) -The Warrior zombie strikes you with her wooden sword! (+STUN) -战士僵尸用她的木剑攻击你! (+眩晕) -The Warrior zombie runs its fingers along your body! (DamageTaken) -战士僵尸的手指沿着你的身体移动! (DamageTaken) +The warrior zombie yells and falls cinematically. +战士僵尸在大喊大叫中倒下。 +The warrior zombie uses a traditional binding technique (+RestraintAdded) +战士僵尸使用传统的束缚技术 ( +RestraintAdded ) +The warrior zombie strikes you with her wooden sword! (+STUN) +僵尸战士用她的木剑攻击你! ( +眩晕 ) +The warrior zombie runs its fingers along your body! (DamageTaken) +僵尸战士用手指抚摸你的身体! ( DamageTaken ) +The warrior zombie fights using the way of Sword and Lock. (DamageTaken) +战士僵尸使用剑和锁的方式进行战斗。 ( DamageTaken ) + + Rope Artist 绳艺师 The rope artist frowns and walks away, looking defeated. 绳艺师皱着眉头走开了,看起来很泄气。 The rope artist performs an intricate technique! (+RestraintAdded) -绳索艺术家表演了一项复杂的技术! (+RestraintAdded) +绳索艺术家表演了一项复杂的技术! ( +RestraintAdded ) +The rope artist sneaks a lock onto you while you weren't looking! (DamageTaken) +绳索艺术家会趁你不注意的时候偷偷给你上了锁! ( DamageTaken ) The rope artist smiles and tickles your feet! (DamageTaken) 绳艺师微笑着挠你的脚! (DamageTaken) + + +Deputy +副警长 +The deputy surrenders her donuts. +副警长交出了她的甜甜圈。 +The deputy slaps on some cuffs! (+RestraintAdded) +副警长拍了拍手铐! ( +RestraintAdded ) +The deputy tases you! (Stunned!) +副警长用电击枪电你! ( Stunned! ) +The deputy conducts a strip search! (DamageTaken) +副警长进行脱衣搜身! ( DamageTaken ) +The deputy performs a security enhancement procedure! (DamageTaken) +副警长执行安全强化程序! ( DamageTaken ) + + Ninja Warrior 忍者战士 -The warrior retreats into the shadows. -战士退入阴影中。 -The warrior uses a traditional binding technique (+RestraintAdded) -战士使用传统的绑定技术(+RestraintAdded) -The warrior tosses a shuriken and hits you! (Stunned!) -战士扔手里剑,打你! (眩晕!) -The warrior uses a subduing technique! (DamageTaken) -武者使用了捆绑之术! (DamageTaken) +The ninja warrior retreats into the shadows. +忍者战士退到阴影中。 +The ninja warrior uses a traditional binding technique (+RestraintAdded) +忍者战士使用传统的束缚技术 ( +RestraintAdded ) +The ninja warrior tosses a shuriken and hits you! (Stunned!) +忍者战士扔出手里剑并攻击你! ( Stunned! ) +The ninja warrior uses a lock to give herself the upper hand! (DamageTaken) +忍者战士用一把锁让自己占据了上风! ( DamageTaken ) +The ninja warrior uses a subduing technique! (DamageTaken) +忍者战士使用制服术! ( DamageTaken ) + + Ninja Assassin 忍者刺客 The assassin retreats into the shadows. 刺客撤退到阴影中。 The assassin uses a traditional binding technique (+RestraintAdded) -刺客使用传统的捆绑技术(+RestraintAdded) +刺客使用传统的捆绑技术 ( +RestraintAdded ) The assassin uses a subduing technique! (DamageTaken) -刺客使用了捆绑技术! (DamageTaken) +刺客使用了捆绑技术! ( DamageTaken ) +The assassin stealthily locks your restraint! (DamageTaken) +刺客悄悄锁住你的束缚! ( DamageTaken ) + + Animated Armor 活化盔甲 The Animated Armor falls into pieces. 活化盔甲碎成碎片。 The Animated Armor restrains you with shackles (+RestraintAdded) -活化盔甲用镣铐束缚你(+RestraintAdded) +活化盔甲用镣铐束缚你 ( +RestraintAdded ) The Animated Armor hugs your body with an iron grip! (DamageTaken) 活化盔甲包裹着你的身体! (DamageTaken) + + Mimic 宝箱怪 The mimic spills out its contents. 宝箱怪吐出了它的内容。 The mimic spits out a restraint which latches onto you! (+RestraintAdded) -宝箱怪吐出一个拘束具并束缚住了你! (+RestraintAdded) +宝箱怪吐出一个拘束具并束缚住了你! ( +RestraintAdded ) The mimic tickles you with its tongue! (DamageTaken) 模仿者用它的舌头逗你! (DamageTaken) + + Skeleton 骷髅 The Skeleton falls to pieces. 骷髅碎了。 The Skeleton restrains you! (+RestraintAdded) -骷髅束缚了你! (+RestraintAdded) +骷髅束缚了你! ( +RestraintAdded ) The Skeleton tackles you! (DamageTaken) 骷髅在攻击你! (DamageTaken) + + Dragonheart Initiate 龙心新手 The Dragonheart Initiate retreats hurriedly. 龙心新手连忙撤退。 The Dragonheart Initiate apprehends you! (+RestraintAdded) -龙心新手逮捕了你! (+RestraintAdded) +龙心新手逮捕了你! ( +RestraintAdded ) The Dragonheart Initiate squeezes your body! (DamageTaken) 龙心新手在揉捏你的身体! (DamageTaken) +The Dragonheart locks your restraint! (DamageTaken) +龙心新手锁上了你的拘束具! + + Dragonheart Shield 龙心之盾 The Dragonheart Shield makes a tactical retreat. 龙心之盾进行战术撤退。 The Dragonheart Shield apprehends you! (+RestraintAdded) -龙心之盾逮捕了你! (+RestraintAdded) +龙心之盾逮捕了你! ( +RestraintAdded ) The Dragonheart Shield bonks you! (DamageTaken) 龙心之盾在撞击你! (DamageTaken) The Dragonheart Shield squeezes your body! (DamageTaken) 龙心之盾压迫你的身体! (DamageTaken) + + Ice Dragonheart -冰龙之心 +寒冰龙心 The Ice Dragonheart retreats in a blast of snow. -冰龙之心在一阵暴雪中撤退。 +寒冰龙心在一阵暴雪中撤退。 The Ice Dragonheart apprehends you! (+RestraintAdded) -冰龙之心逮捕了你! (+RestraintAdded) +寒冰龙心逮捕了你! ( +RestraintAdded ) The Ice Dragonheart gives your body a cold touch! (DamageTaken) -冰龙之心给你的身体带来冰冷的触感! (DamageTaken) +寒冰龙心给你的身体带来冰冷的触感! (DamageTaken) +The Dragonheart uses an icy lock on your restraint! (DamageTaken) +寒冰龙心在你的拘束具上使用了冰锁!(DamageTaken) + + Poison Dragonheart -毒龙心 +剧毒龙心 The Poison Dragonheart retreats in a green mist. -毒龙心在一片绿雾中退去。 +剧毒龙心在一片绿雾中退去。 The Poison Dragonheart apprehends you! (+RestraintAdded) -毒龙心逮捕了你! (+RestraintAdded) +剧毒龙心逮捕了你! ( +RestraintAdded ) The Poison Dragonheart smacks you with her axe! (DamageTaken) -毒龙心用她的斧头砸你! (DamageTaken) +剧毒龙心用她的斧头砸你! (DamageTaken) The Poison Dragonheart thrums her claws across your figure! (DamageTaken) -毒龙心用爪子划过你的身体! (DamageTaken) +剧毒龙心用爪子划过你的身体! (DamageTaken) +The Dragonheart locks your restraint using natural magics! (DamageTaken) +剧毒龙心使用自然魔法锁定了的拘束具!(DamageTaken) + + Crystal Dragonheart -水晶龙心 +结晶龙心 The Crystal Dragonheart screams and falls to the ground dramatically. -水晶龙心惨叫一声,剧烈的倒在了地上。 +结晶龙心惨叫一声,剧烈的倒在了地上。 The Crystal Dragonheart apprehends you! (+RestraintAdded) -水晶龙心逮捕了你! (+RestraintAdded) +结晶龙心逮捕了你! ( +RestraintAdded ) The Crystal Dragonheart squeezes you in a big hug! (DamageTaken) -水晶龙之心紧紧拥抱你! (DamageTaken) +结晶龙心紧紧拥抱你! (DamageTaken) +The Dragonheart grows a crystalline lock on your restraints! (DamageTaken) +结晶龙心在你的拘束具上生长出结晶锁!(DamageTaken) + + Many crystals rise up out of the ground! -许多水晶从地下升起! +许多结晶从地下升起! A crystal rises up out of the ground! -一颗水晶从地底升起! +一颗结晶从地底升起! + + + + Statue 雕像 The statue topples over! 雕像倒塌! -Statue -雕像 -The statue topples over and reveals a mechanism! -雕像倒塌,露出一个机械装置! -Statue -雕像 The statue topples over and reveals a mechanism! 雕像倒塌,露出一个机械装置! The statue shoves a gag into your mouth, which inflates to fill the space! (+RestraintAdded) -雕像将一个口球塞进你的嘴里,口球膨胀并塞满了你的嘴! (+RestraintAdded) +雕像将一个口球塞进你的嘴里,口球膨胀并塞满了你的嘴! ( +RestraintAdded ) The statue kisses your gag! (DamageTaken) 雕像亲吻你的口球! (DamageTaken) + + Chaotic Crystal -混沌水晶 +混沌结晶 The crystal shatters! -水晶碎了! -The chaotic crystal leeches willpower from you! (DamageTaken) -混沌水晶从你身上汲取体力! (DamageTaken) +结晶碎了! +The chaotic crystal leeches energy from you! (DamageTaken) +混沌结晶汲取你的能量!(DamageTaken) + + Grand Chaotic Crystal -大混沌水晶 +大型混沌结晶 The grand crystal shatters! -大水晶碎裂! -The grand crystal leeches willpower from you! (DamageTaken) -大水晶从你身上汲取体力! (DamageTaken) +大型结晶碎裂! +The grand crystal leeches energy from you! (DamageTaken) +大型结晶汲取了你的能量! (DamageTaken) Crystals erupt from the ground and slowly grow around your limbs! (+RestraintAdded) -水晶从地下喷涌而出,在你的四肢周围慢慢生长! (+RestraintAdded) +结晶从地下喷涌而出,在你的四肢周围慢慢生长! ( +RestraintAdded ) + + Soul Crystal -灵魂水晶 +灵魂结晶 The crystal shatters into a puff of soul dust! -水晶碎成一团魂尘! -The soul crystal leeches willpower from you! (DamageTaken) -灵魂水晶吸取你的体力! (DamageTaken) +结晶碎成一团魂尘! +The soul crystal leeches strength from you! (DamageTaken) +灵魂结晶汲取你的能量! (DamageTaken) Active Soul Crystal -活化灵魂水晶 -The crystal shatters into a puff of soul dust! -水晶碎成一团魂尘! -The soul crystal leeches willpower from you! (DamageTaken) -灵魂水晶在吸取你的体力! (DamageTaken) +活化灵魂结晶 + + Shadow Dragonheart -影龙心 +暗影龙心 The Shadow Dragonheart frowns and runs away. -影龙心蹙眉,转身逃走。 +暗影龙心蹙眉,转身逃走。 The Shadow Dragonheart apprehends you! (+RestraintAdded) -暗影龙心逮捕了你! (+RestraintAdded) +暗影龙心逮捕了你! ( +RestraintAdded ) +The Shadow Dragonheart conjures a shadowly lock! (DamageTaken) +暗影龙心变化出一把暗影锁!(DamageTaken) The Shadow Dragonheart extends her scythe and pulls you closer!!! -影龙心伸出她的镰刀,把你拉近了!!! +暗影龙心伸出她的镰刀,把你拉近了!!! The Shadow Dragonheart catches you with her scythe! (DamageTaken) 暗影龙心用她的镰刀抓住了你! (DamageTaken) + + + + + + Dragonheart Leader 龙心领袖 -The Dragonheart Leader retreats hurriedly. -龙心首领急忙后退。 +The Dragonheart Leader admits defeat. +龙心领袖承认了她的失败 The Dragonheart Leader apprehends you! (+RestraintAdded) -龙心领袖逮捕了你! (+RestraintAdded) +龙心领袖逮捕了你! ( +RestraintAdded ) The Dragonheart Leader dashes to you! 龙心领袖正在冲向你! The Dragonheart Leader squeezes your body! (DamageTaken) 龙心首领揉捏你的身体! (DamageTaken) +The Dragonheart Leader uses a lock on you! (DamageTaken) +龙心首领用一把锁锁住了你! (DamageTaken) + + +Rebel Scum! +龙心叛军 +The Dragonheart Rebel admits defeat. +龙心叛军认输 +The Dragonheart Rebel apprehends you! (+RestraintAdded) +龙心叛军逮捕你!(+RestraintAdded) +'En garde!' +“预备~~” +The Dragonheart Rebel squeezes your body! (DamageTaken) +龙心叛军挤压你的身体!(DamageTaken) + + Dryad 树妖 The dryad sinks into the ground. 树妖沉入地下。 The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) -树妖伸出一只手臂,用藤蔓缠绕着你! (+RestraintAdded) -The dryad sings a song that mesmerizes you! (DamageTaken) -树妖唱起了一首催眠之歌! (DamageTaken) -The dryad tickles you with a leaf! (DamageTaken) -树精在用一片叶子逗你! (DamageTaken) -Dryad -树妖 -The dryad sinks into the ground. -树妖沉入地下。 -The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) -树妖伸出一只手臂,用藤蔓缠绕着你! (+RestraintAdded) +树妖伸出一只手臂,用藤蔓缠绕着你! ( +RestraintAdded ) The dryad sings a song that mesmerizes you! (DamageTaken) 树妖唱起了一首催眠之歌! (DamageTaken) The dryad tickles you with a leaf! (DamageTaken) 树精在用一片叶子逗你! (DamageTaken) + + + + +Highly-Motivated Doll +积极的玩偶 +The doll falls to the ground, moaning loudly. +玩偶倒在地上,发出巨大的呻吟声。 +The doll rubs her body against yours. You can feel the conduction. (DamageTaken) +玩偶用她的身体摩擦你的身体。你可以感觉到传导。 ( DamageTaken ) +The doll tackles you and squeezes you with her trembling legs! (DamageTaken) +玩偶抓住你并用她颤抖的双腿挤压你! ( DamageTaken ) + + +Dollsmith +玩偶工匠 +The dollsmith's suit locks her wrists together and renders her helpless. +玩偶工匠的套装将她的手腕锁在一起,让她变得无助。 +The dollsmith runs a latex-covered finger across your vulnerable body! (DamageTaken) +玩偶工匠用一根被乳胶覆盖的手指抚摸你脆弱的身体! ( DamageTaken ) +The dollsmith grabs you and applies her favorite doll restraints! (+RestraintAdded) +玩偶工匠抓住你并使用她最喜欢的玩偶拘束具! ( +RestraintAdded ) +The dollsmith slaps a lock onto your restraints! (DamageTaken) +玩偶工匠锁上了你的拘束具! ( DamageTaken ) +The dollsmith splashes a red latex concoction onto you! (+RestraintAdded) +玩偶工匠将红色乳胶混合物泼到你身上! ( +RestraintAdded ) + + +Dollmaker's Apprentice +玩偶师学徒 +The dollmaker apprentice's suit becomes rigid and locks her limbs in place. +玩偶师学徒的套装变得坚硬,将她的四肢锁定在适当的位置。 +The dollmaker's apprentice squeezes your body with her gloved hands! (DamageTaken) +玩偶师学徒用戴着手套的双手揉捏你的身体! ( DamageTaken ) +The dollmaker's apprentice uses her staff to encase you in doll restraints! (+RestraintAdded) +玩偶师学徒用她的手杖将你束缚在玩偶束缚中! ( +RestraintAdded ) +The dollmaker's apprentice slips a lock onto your restraints! (DamageTaken) +玩偶师学徒给你的拘束具上了一把锁! ( DamageTaken ) +The dollmaker's apprentice unleashes a powerful latex blast! (+RestraintAdded) +玩偶师学徒释放出强大的乳胶爆炸! ( +RestraintAdded ) + + + + +...Alchemist? +…炼金术士? +You rescue the alchemist. +你救下了炼金术士。 +The Alchemist restrains you! (+RestraintAdded) +炼金术士拘束了你! ( +RestraintAdded ) +The alchemist hugs you in a rubbery embrace! (DamageTaken) +炼金术士橡胶般的拥抱了你! ( DamageTaken ) +The alchemist uses an ornate-looking lock! (DamageTaken) +炼金术士使用一把看起来华丽的锁! ( DamageTaken ) + + Alchemist 炼金术士 The alchemist screams and runs. 炼金术士尖叫着跑了。 -The Alchemist restrains you! (+RestraintAdded) -炼金术士拘束了你! (+RestraintAdded) -The alchemist hugs you in a rubbery embrace! (DamageTaken) -炼金术士用橡胶般的拥抱了你! (DamageTaken) + + Alchemist's Pet 炼金术士的宠物 The wolfgirl escapes! -狼女逃了! -The wolfgirl lunges at you with a powerful kick! -狼女强力地向你踢来! +狼娘逃了! The wolfgirl lunges at you with a powerful kick! -狼女强力地向你踢来! +狼娘强力地向你踢来! The wolfgirl cuddles with you! (DamageTaken) -狼女抱住了你! (DamageTaken) +狼娘抱住了你! (DamageTaken) + + Wolfgirl -狼女 -The wolfgirl escapes! -狼女逃了! -The wolfgirl lunges at you with a powerful kick! -狼女强力地向你踢来! -The wolfgirl lunges at you with a powerful kick! -狼女强力地向你踢来! -The wolfgirl cuddles with you! (DamageTaken) -狼女抱住了你! (DamageTaken) +狼娘 + + +Wolfguard +狼卫士 +The wolfguard's suit punishes her for poor performance! +狼卫士的套装惩罚了她糟糕的表现! +The wolfguard lunges at you and strikes you! +狼卫士向你扑来并攻击你! +The wolfguard's escort drones shock you! (DamageTaken) +狼卫士的护航无人机让你震惊! ( DamageTaken ) +The wolfguard's escort drones deploy some restraints! (+RestraintAdded) +狼卫的护卫无人机部署了一些束缚! ( +RestraintAdded ) + + Wolfgirl Trainer -狼女训练师 +狼娘训练师 The trainer retreats! 训练师撤退! The wolfgirl trainer squeezes your breasts playfully! (DamageTaken) -狼女训练师玩弄地挤你的胸! (DamageTaken) +狼娘训练师玩弄地挤你的胸! (DamageTaken) The wolfgirl trainer secures you in training gear! (+RestraintAdded) -狼女训练师给你穿上了训练装备! (+RestraintAdded) -The wolfgirl trainer pins you and skillfully locks all of your restraints. -狼女训练师将您固定并巧妙地锁定您的所有拘束具。 -Ancient Drone -远古无人机 +狼娘训练师给你穿上了训练装备! ( +RestraintAdded ) +The wolfgirl trainer pins you and skillfully locks all of your restraints! +狼娘训练师将你钉住,并巧妙地锁住你所有的拘束具! + + +Nevermere Operative +“奈文米尔” 特工 +The operative does a fumbled retreat! +特工笨手笨脚地撤退! +The Nevermere Operative smiles and gropes your body! (DamageTaken) +“奈文米尔” 特工微笑着抚摸你的身体! ( DamageTaken ) +The Nevermere Operative apprehends you with training gear! (+RestraintAdded) +“奈文米尔” 特工用训练装备逮捕了你! ( +RestraintAdded ) +The Nevermere Operative pins you and skillfully locks all of your restraints! +“奈文米尔” 特工将你钉住并巧妙地锁住你所有的拘束具! + + +Trainer's Apprentice +训练师学徒 +The trainer's apprentice escapes! +训练师学徒逃跑了! +The trainer's apprentice rubs her claws across your chest playfully! (DamageTaken) +训练师学徒用爪子顽皮地摩擦着你的胸! ( DamageTaken ) +The trainer's apprentice secures you in training gear! (+RestraintAdded) +训练师学徒为你提供训练装备! ( +RestraintAdded ) +The trainer's apprentice adds a lock to your restraints. +训练师学徒给你的拘束具加了一把锁。 + + +The Executive +执行官 +The executive surrenders gracefully. +执行官优雅地投降。 +The Executive makes a persuasive argument! (DamageTaken) +执行官的提出了一个很有说服力的论点! ( DamageTaken ) +The Executive's drones apprehend you! (+RestraintAdded) +执行官的无人机逮捕了你! ( +RestraintAdded ) +The Executive's drones apply high-security locks to your restraints! +执行官的无人机会对你的拘束具施加高安全性锁! + + +Wolf Instructor +训狼导师 +The instructor deploys active camoflague and retreats! +导师部署主动迷彩并撤退! +The instructor disciplines you! (DamageTaken) +导师管教你! ( DamageTaken ) +The instructor applies advanced training gear! (+RestraintAdded) +导师使用先进的训练装备! ( +RestraintAdded ) +The instructor adds a lock to your restraints. +导师给你的拘束具加了一把锁。 + + +Nevermere Drone +“奈文米尔”无人机 +The drone loses power and falls to the ground! +无人机失去动力坠落地面! +A Nevermere Drone takes off! +一架“奈文米尔”无人机起飞了! +You hear buzzing as several Nevermere Drones take to the air! +当几架“奈文米尔”无人机升空时,你会听到嗡嗡声! + + +Swarm of Tape Drones +成群的胶带无人机 +The tape drones lose control and crash all over the place! +胶带无人机失去控制,坠落得满地都是! +A swarm of tape drones takes flight! +一大群胶带无人机起飞了! +The air fills with buzzing as dozens of tiny drones lift off! +当数十架小型无人机升空时,空气中充满了嗡嗡声! +The tape drones attach additional sticky layers! (DamageTaken) +胶带无人机附加了额外的粘性层! ( DamageTaken ) +The tape drones circle around you, wrapping you in tape! (+RestraintAdded) +胶带无人机在你周围盘旋,将你包裹在胶带中! ( +RestraintAdded ) + + +Shield Drone +护盾无人机 +The drone's power source explodes. +无人机的电源爆炸。 +A Shield Drone takes off! +护盾无人机起飞! +Several Shield Drones take flight, their shields interlinking. +几架护盾无人机起飞,它们的护盾相互连接。 +Drone Explosion +无人机爆炸 + + +Rusty Drone +生锈的无人机 +The drone's mechanisms grind to a halt. +无人机的机械装置逐渐停止。 +The drone uses a short-ranged electric attack! (DamageTaken) +无人机使用短距离电击! ( DamageTaken ) +The drone disassembles itself, revealing a set of restraining cables! (+RestraintAdded) +无人机自行拆卸,露出一组捆绑绳! ( +RestraintAdded ) + + +Rusty Auto Taper +生锈的自动胶带机 +The auto taper's mechanisms grind to a halt. +自动胶带机构逐渐停止。 +The auto taper wraps additional layers of sticky tape! (DamageTaken) +自动胶带机装备了多层胶带! ( DamageTaken ) +The wraps you in many layers of tape! (+RestraintAdded) +它用多层胶带将你包裹起来! ( +RestraintAdded ) + + +Rubber Blaster +橡胶炮塔 +The turret enters an unstable state, about to spread rubber all over! +炮塔进入不稳定状态,快要沾满橡胶了! +The turret defends itself with a close-range electric attack! (DamageTaken) +炮塔以近距离电击自卫! ( DamageTaken ) +Rubber Launcher +橡胶发射器 + + +Auto Capture Unit +自动捕捉装置 +The capture unit releases magic smoke and explodes. +捕捉装置释放出魔法烟雾并爆炸。 +The capture unit grabs you securely! (DamageTaken) +捕捉装置牢牢地抓住你! ( DamageTaken ) +The capture unit extends its appendages and wraps them around you! (+RestraintAdded) +捕捉装置伸出它的附肢并将它们包裹在你周围! ( +RestraintAdded ) +The capture unit releases small drones which lock onto your restraints! (DamageTaken) +捕获装置释放小型无人机锁定你的拘束具! ( DamageTaken ) + + +Auto Tape Unit +自动胶带装置 +The tape unit releases magic smoke and explodes. +胶带装置释放出魔法烟雾并爆炸。 +The tape unit applies many layers of tape! (DamageTaken) +胶带装置使用多层胶带! ( DamageTaken ) +The tape unit fires off many layers of sticky tape! (+RestraintAdded) +胶带装置释放出多层胶带! ( +RestraintAdded ) +The tape unit releases small drones which lock onto your restraints! (DamageTaken) +胶带装置释放小型无人机锁定你的拘束具! ( DamageTaken ) + + +Force Field Unit +力场装置 +The forcefield unit releases magic smoke and explodes. +力场装置释放出魔法烟雾并爆炸。 +The forcefield unit zaps you! (DamageTaken) +力场装置攻击了你! ( DamageTaken ) +The forcefield unit extends its appendages and wraps them around you! (+RestraintAdded) +力场装置伸出它的附肢并将它们包裹在你周围! ( +RestraintAdded ) +The forcefield unit releases small drones which lock onto your restraints! (DamageTaken) +力场装置释放小型无人机锁定你的拘束具! ( DamageTaken ) + + +Force Field Projector +力场投影仪 +The forcefield erupts into a shower of blue sparks! +力场爆发出蓝色火花! +The robot deploys a forcefield! +机器人部署了力场! +The robot deploys a set of forcefields! +机器人部署了一组力场! +Drone +无人机 The drone fizzles and falls to the ground! 无人机发出嘶嘶声并掉到地上! The drone zaps you with a restraining energy ray! (DamageTaken) -无人机用抑制能量射线击杀你! (DamageTaken) -The drone uses a short-ranged electrocution attack! (DamageTaken) -无人机使用短程电击攻击! (DamageTaken) -The drone deconstructs itself into a set of bindings! -无人机将自己解构为一组绑定! -Ancient Patrol Unit -远古巡逻队 -The patrol unit releases magic smoke and explodes. -巡逻队释放魔法烟雾并爆炸。 -The patrol unit uses a short-ranged electrocution attack! (DamageTaken) -巡逻队使用近距离电击! (DamageTaken) -The patrol unit extends its appendages and wraps them around you! -巡逻队伸出它的附属物并将它们缠在你周围! -Ancient Enforcer Unit -远古执行者 +无人机用抑制能量射线击中你! (DamageTaken) +The drone attaches to you! (+RestraintAdded) +无人机附着在你身上! (+RestraintAdded) + + +Cyber Warden +赛博管理员 +The cyber warden's suit goes into lockdown, leaving her wiggling helplessly! +赛博管理员的套装被锁住了,让她无助地扭动着身体! +The cyber warden applies an advanced locking technology! +赛博管理员采用了先进的锁定技术! +The cyber warden grabs you and applies a self-tightening restraint! (+RestraintAdded) +赛博管理员抓住你并施加自紧束缚! ( +RestraintAdded ) +The cyber warden's touch applies a series of quick electrical shocks! (DamageTaken) +赛博管理员的触摸会产生一系列快速的电击! ( DamageTaken ) +The cyber warden's touch applies a series of quick electrical shocks! +赛博管理员的触摸会产生一系列快速的电击! + + +Auto Enforcer Unit +自动执法器单元 The enforcer unit releases magic smoke and explodes. -执行者释放魔法烟雾并爆炸。 +执法器释放魔法烟雾并爆炸。 The enforcer unit fires many cables that squeeze you! (DamageTaken) -执法者发射了许多压迫你的电缆! (DamageTaken) -The enforcer fires off restraints that wrap around your body and apprehend you! -执法者发射拘束具束缚在你身上,并逮捕了你! +执法器发射了许多压迫你的缆绳! (DamageTaken) +The enforcer fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) +执法器发射出束缚包裹在你身上并逮捕了你! ( +RestraintAdded ) +The enforcer releases small drones which lock onto your restraints! (DamageTaken) +执法器释放小型无人机锁定你的拘束具! ( DamageTaken ) + + +Artillery Unit +火炮单元 +The artillery unit releases magic smoke and explodes. +火炮单元释放魔法烟雾并爆炸。 +The artillery unit fires many cables that squeeze you! (DamageTaken) +火炮单元发射出许多缆绳挤压着你! ( DamageTaken ) +The artillery fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) +火炮单元发射出束缚包裹在你身上并逮捕了你! ( +RestraintAdded ) +The artillery releases small drones which lock onto your restraints! (DamageTaken) +火炮单元释放小型无人机锁定你的拘束具! ( DamageTaken ) + + The energy bolt hits you and paralyzes you! -能量螺栓击中你并麻痹你! +能量箭击中你并麻痹你! Energy Bolt -能量螺栓 +能量箭 + + Alkahestor 万能炼金士 The alkahestor resigns to her fate. -宗师炼金师听天由命。 -The Alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded) -宗师炼金师释放一小瓶液体,并包裹住您! (+RestraintAdded) +万能炼金士听天由命。 +The alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded) +万能炼金士释放出一小瓶液体包裹在你周围! ( +RestraintAdded ) +The alkahestor uses an ornate-looking lock! (DamageTaken) +万能炼金士使用了一把看起来华丽的锁! ( DamageTaken ) The alkahestor shoves you! (DamageTaken) -宗师炼金师推了你! (DamageTaken) -Latex Elemental -乳胶元素 -The latex elemental melts into sticky rubber. -乳胶元素融化成粘性橡胶。 -The latex elemental molds itself into restraints! (+RestraintAdded) -乳胶元素将自己塑造成拘束具! (+RestraintAdded) -The latex elemental slaps you with its appendages! (DamageTaken) -乳胶元素用它的附肢拍打你! (DamageTaken) +万能炼金士推了你! ( DamageTaken ) +...Alkahestor? +...万能炼金士? +You rescue the Alkahestor +你救下了万能炼金士。 + + +Latex Homonculus +乳胶生命体 +The latex homonculus melts into sticky rubber. +乳胶生命体融化成粘性橡胶。 +The latex homonculus molds itself into restraints! (+RestraintAdded) +乳胶生命体将自己塑造成束缚!(+RestraintAdded) +The latex homonculus slaps you with its appendages! (DamageTaken) +乳胶生命体用它的附肢拍打你!(DamageTaken) + + Rope Elemental -绳元素 +绳索精灵 The rope elemental gets knotted and falls to the floor, inert. -绳元素打结并掉到地板上,失去了活性。 +绳索精灵的身体打结并倒在地板上,失去了活性。 The rope elemental's limbs lash out at you, wrapping themselves around your body! (+RestraintAdded) -绳元素的触手向你扑来,缠绕在你的身体上! (+RestraintAdded) +绳索精灵的触手向你扑来,缠绕在你的身体上! ( +RestraintAdded ) The rope elemental squeezes you tightly! (DamageTaken) -绳元素紧紧地压迫着你! (DamageTaken) +绳索精灵紧紧地绑着你! ( DamageTaken ) + + Leather Elemental -皮革元素 +皮革精灵 The leather elemental sits down and sulks. -皮革元素坐下来闷闷不乐。 +皮革精灵坐下来闷闷不乐。 The leather elemental wraps her long extremities around your body! (+RestraintAdded) -皮革元素将她修长的四肢包裹在你的身体周围! (+RestraintAdded) +皮革精灵使用她修长的四肢将你的身体捆绑起来! ( +RestraintAdded ) The leather elemental strikes you with her leather belts! (DamageTaken) -皮革元素用她的皮带打动你! (DamageTaken) +皮革精灵用她的皮带鞭打你! (DamageTaken) +The leather elemental clicks a lock onto your restraints! (DamageTaken) +皮革精灵咔哒一声锁上了你的拘束具! ( DamageTaken ) + + Slime Enthusiast -史莱姆爱好者 +粘液狂热者 The slime enthusiast screams and runs. -史莱姆爱好者尖叫着奔跑。 +粘液狂热者尖叫着奔跑。 The slime enthusiast restrains you! (+RestraintAdded) -史莱姆爱好者拘束了你! (+RestraintAdded) -The Slime Enthusiast hugs you in a rubbery embrace! (DamageTaken) -史莱姆爱好者橡胶般的拥抱你! (DamageTaken) +粘液狂热者拘束了你! ( +RestraintAdded ) +The slime enthusiast hugs you in a rubbery embrace! (DamageTaken) +粘液狂热者用橡皮般的拥抱抱住了你! ( DamageTaken ) +The slime enthusiast looks happy to make sure your restraints are secure! (DamageTaken) +这位粘液狂热者看起来很高兴你的拘束具是安全的! ( DamageTaken ) + + Miner 矿工 The bandit tosses her pick to the ground and complains about her pay. 强盗把她的镐扔在地上,抱怨她的薪水。 The miner restrains you! (+RestraintAdded) -矿工拘束了你! (+RestraintAdded) +矿工拘束了你! ( +RestraintAdded ) The miner pins you with the haft of her pickaxe! (DamageTaken) 矿工用她的镐柄钉住你! (DamageTaken) +The miner pins you with the haft of her pickaxe and adds a lock! (DamageTaken) +矿工用她的镐柄钉住你并加了一把锁! ( DamageTaken ) + + You hear a fuse going off... 你听到引线在燃烧... Miner Bomb 矿工炸弹 -Bandit -盗贼 + + +The bandit cries. You should feel bad. +强盗哭了。你应该感到难过。 + + The bandit collapses. 盗贼崩溃了。 The bandit restrains you! (+RestraintAdded) -盗贼拘束了你! (+RestraintAdded) +盗贼束缚了你! ( +RestraintAdded ) +The bandit smiles and applies a lock! (DamageTaken) +盗贼微笑着上了锁! ( DamageTaken ) The bandit caresses your restrained body! (DamageTaken) -强盗抚摸着你被束缚的身体! (DamageTaken) +盗贼抚摸着你被束缚的身体! ( DamageTaken ) + + +Shady Dealer +黑市商人 +The dealer flees, leaving her goods behind. +黑商逃跑了,留下了她的货物。 +The dealer uses some high-quality restraints on you! (+RestraintAdded) +黑商对你使用了一些高质量的束缚! ( +RestraintAdded ) +The dealer smiles and applies a lock! (DamageTaken) +黑商微笑着上了锁! ( DamageTaken ) +The dealer kisses and gropes your body! (DamageTaken) +黑商亲吻并抚摸你的身体! ( DamageTaken ) +That dagger was laced with something... +那把匕首上镶着什么东西…… +You hear a shattering of glass, suddenly the air around you feels thick and moist... +你听到玻璃破碎的声音,突然周围的空气变得粘稠而潮湿…… +Poison Dagger +毒匕首 +Lust Bomb +性欲炸弹 + + +Bandit Guard +盗贼守卫 +The bandit guard collapses and calls for help. +盗贼守卫倒下并呼救。 +The bandit guard restrains you! (+RestraintAdded) +盗贼守卫束缚了你! ( +RestraintAdded ) +The bandit rubs and caresses your restrained body! (DamageTaken) +盗贼摩挲、爱抚着你被束缚的身体! ( DamageTaken ) +The bandit scoffs and applies a lock! (DamageTaken) +盗贼嗤之以鼻,上了锁! ( DamageTaken ) + + Bandit Chief 盗贼头领 The bandit scoffs and retreats until next time. 盗贼嗤之以鼻,撤退了。 The bandit restrains you tightly! (+RestraintAdded) -强盗紧紧地束缚了你! (+RestraintAdded) +盗贼紧紧地束缚了你! ( +RestraintAdded ) The bandit runs her hands all along your restrained body! (DamageTaken) -强盗的双手顺着你拘束的身体摸来摸去! (DamageTaken) +盗贼的双手顺着你拘束的身体摸来摸去! ( DamageTaken ) +The bandit chuckles and applies a lock! (DamageTaken) +盗贼嘿嘿一笑,上了锁! ( DamageTaken ) + + Bandit Pet 盗贼的宠物 The bandit blushes and runs away. 盗贼脸红了,跑了。 The girl nervously restrains you! (+RestraintAdded) -女孩紧张地拘束了你! (+RestraintAdded) -The bandit tickes you nervously! (DamageTaken) -强盗紧张地对你挠痒! (DamageTaken) +女孩紧张地拘束了你! ( +RestraintAdded ) +The bandit tickles you nervously! (DamageTaken) +盗贼紧张地对你挠痒! ( DamageTaken ) +The bandit pet applies a lock! (DamageTaken) +强盗宠物上了锁!(受到伤害) + + Bandit Hunter 盗贼猎人 The bandit hunter retreats. 盗贼猎人撤退。 The bandit hunter restrains you! (+RestraintAdded) -盗贼猎人拘束了你! (+RestraintAdded) +盗贼猎人拘束了你! ( +RestraintAdded ) The bandit hunter caresses your restrained body! (DamageTaken) -盗贼猎人爱抚你拘束住的身体! (DamageTaken) +盗贼猎人爱抚你拘束住的身体! ( DamageTaken ) +The bandit hunter calls you an amateur and applies a lock! (DamageTaken) +盗贼猎人称你为业余爱好者并应用锁! ( DamageTaken ) + + Bandit Grappler 盗贼格斗家 The bandit grappler retreats. 盗贼擒抱者撤退。 The bandit grappler loops her chains around you! (+RestraintAdded) -盗贼格斗家将她的锁链缠绕在你身上! (+RestraintAdded) +盗贼格斗家将她的锁链缠绕在你身上! ( +RestraintAdded ) The bandit grappler caresses your restrained body! (DamageTaken) -强盗擒抱者爱抚你拘束住的身体! (DamageTaken) +强盗擒抱者爱抚你拘束住的身体! ( DamageTaken ) +The bandit giggles and applies a lock! (DamageTaken) +强盗咯咯地笑着,上了锁! ( DamageTaken ) The bandit grappler hooks you closer!!! -强盗抓钩将您钩了过去! +强盗抓钩将你钩了过去! + + Mummy 木乃伊 The Mummy collapses and her body vanishes. 木乃伊倒下了,她的身体消失了。 The Mummy conjures a mystic wrapping! (+RestraintAdded) -木乃伊变出了神秘的包层! (+RestraintAdded) +木乃伊变出了神秘的包层! ( +RestraintAdded ) +The Mummy conjures a magical lock upon you! (DamageTaken) +木乃伊在你身上召唤了一把魔法锁!(DamageTaken) The Mummy punishes you with a blow from her staff! (DamageTaken) -木乃伊用她的法杖惩罚了你! (DamageTaken) +木乃伊用她的法杖惩罚了你! ( DamageTaken ) + + +Cursed One +被诅咒者 +The Cursed One is drawn into an eldritch portal. +被诅咒者被吸入一扇可怕的传送门。 +The Cursed One's bindings transfer to you! (+RestraintAdded) +被诅咒者的束缚转移给你了! ( +RestraintAdded ) +The Cursed One's bindings emit a strange aura... (DamageTaken) +被诅咒者的束缚散发出奇怪的光环...... ( DamageTaken ) + + +Floating Wrapping +浮动包裹物 +The wrapping falls to the floor, its magic spent. +包裹物掉落在地板上,它的魔力已经耗尽。 +The floating wrappings attach to you! (+RestraintAdded) +浮动的包裹物附着在你身上! ( +RestraintAdded ) +The wrappings grip you tightly and squeeze you! (DamageTaken) +包裹物紧紧地抓在你身上并挤压你! ( DamageTaken ) + + +Animated Sarcophagus +活动石棺 +The sarcophagus falls to the ground and crumbles. +石棺掉落在地上碎了。 +The sarcophagus emits long wrappings that pull you closer! (+RestraintAdded) +石棺发出长长的包裹物,将你拉得更近! ( +RestraintAdded ) +The sarcophagus emanates a strange power! (DamageTaken) +石棺散发着奇异的力量! ( DamageTaken ) + + Bast Warrior -Bast战士 +猫女神战士 The Bast Warrior collapses and meows loudly. -Bast战士倒地并大声喵喵叫。 +猫女神战士倒地并大声喵喵叫。 The Bast Warrior restrains you! (+RestraintAdded) -Bast战士拘束了你! (+RestraintAdded) +猫女神战士拘束了你! ( +RestraintAdded ) The Bast Warrior tickles you with her claws! (DamageTaken) -Bast战士用她的爪子逗你! (DamageTaken) +猫女神战士用她的爪子逗你! ( DamageTake ) +The Bast Warrior pulls out a lock and slips it on! (DamageTaken) +猫女神战士拔出一把锁并把它锁上! ( DamageTaken ) + + + + +Bast High Cleric +猫女神高级祭司 +The Bast High Cleric vanishes into a puff of ribbons. +猫女神高级祭司消失在了飞舞的丝带中。 +A ray of light shoots out and paralyzes you! (DamageTaken) +一道光芒射出,让你麻痹! ( DamageTaken ) +The Bast Cleric conjures wrappings upon you! (+RestraintAdded) +猫女神祭司对你释放了束缚法术!( +RestraintAdded ) +The Bast Cleric conjures a lock and slips it onto you! (DamageTaken) +猫女神祭司召唤出一把锁并锁在你身上!( DamageTaken ) + + Bast Cleric -Bast牧师 +猫女神祭司 The Bast Cleric collapses and meows softly. -Bast牧师倒下,轻轻地喵喵叫。 -A ray of light shoots out and paralyzes you! (DamageTaken) -一道光芒射出,让你麻痹! (DamageTaken) -A ray of light shoots out and paralyzes you! (DamageTaken) -一道光芒射出,让你麻痹! (DamageTaken) -Skeleton -骷髅 +猫女神祭司倒下,轻轻地喵喵叫。 +The Bast Cleric restrains you! (+RestraintAdded) +猫女神祭司拘束了你! ( +RestraintAdded ) +The Bast Cleric pulls out a lock and slips it on! (DamageTaken) +猫女神祭司拔出一把锁并把它锁上! ( DamageTaken ) + + +High Cleric +高阶祭司 +The High Cleric locks herself in ritual bondage as punishment for failure. +高阶祭司将自己锁在束缚仪式中,作为对失败的惩罚。 +The High Cleric holds up her staff and you feel intense vibrations throughout your body! (DamageTaken) +高阶祭司举起她的法杖,你会感觉到全身强烈的振动! ( DamageTaken ) +The High Cleric summons animated restraints to bind you! (+RestraintAdded) +高阶祭司召唤强有力的束缚来束缚你! ( +RestraintAdded ) +A flurry of mummy wrappings encase you and stun you! (DamageTaken) +一堆木乃伊包裹物包裹着你,让你目瞪口呆! ( DamageTaken ) +The High Cleric smiles as she conjures many locks on your restraints! (DamageTaken) +高阶祭司微笑着,她在你的束缚上召唤出许多锁! ( DamageTaken ) + + The skeleton falls to pieces. 骷髅碎了。 -The Skeleton restrains you! (+RestraintAdded) -骷髅束缚了你! (+RestraintAdded) -The Skeleton tackles you! (DamageTaken) -骷髅在拍打你! (DamageTaken) + + Ghost 幽灵 The ghost vanishes. 幽灵消失了。 The Ghost restrains you! (+RestraintAdded) -幽灵束缚了你! (+RestraintAdded) -The Ghost tickles you! (DamageTaken) -鬼在对你挠痒! (DamageTaken) +幽灵束缚了你! ( +RestraintAdded ) +The Ghost enters your clothing and vanishes! +幽灵进入了你的衣服然后消失! + + Revenant 亡魂 The revenant pouts as it vanishes. 亡魂生气的消失了。 The revenant restrains you! (+RestraintAdded) -亡灵束缚了你! (+RestraintAdded) -The revenant squeezes your breasts! (DamageTaken) -亡魂在揉捏你的胸! (DamageTaken) +亡魂束缚了你! ( +RestraintAdded ) +The revenant squeezes your breasts and slows you! (DamageTaken) +亡魂在揉捏你的胸并减慢你的速度! ( DamageTaken ) The revenant grabs you and caresses your tummy! (DamageTaken) -亡魂抓住了你,抚摸你的肚子! (DamageTaken) +亡魂抓住了你并抚摸你的肚子! ( DamageTaken ) + + Skeleton Warrior 骷髅战士 The skeleton warrior collapses and falls into pieces. 骷髅战士倒地,摔成碎片。 The Skeleton lands a wide, crippling blow! (DamageTaken) -骷髅对周围进行了致命一击! (DamageTaken) +骷髅对周围进行了致命一击! ( DamageTaken ) The Skeleton leashes you! 骷髅牵着你! + + Skeleton Knight 骷髅骑士 The skeleton knight collapses and falls into pieces. 骷髅骑士倒下,化为碎片。 The skeleton apprehends you and pins you with the haft of its axe! (DamageTaken) -骷髅抓住了你,并用它的斧柄钉住了你! (DamageTaken) +骷髅抓住了你,并用它的斧柄钉住了你! ( DamageTaken ) The skeleton grabs you and slips a black cuff on! (+RestraintAdded) -骷髅抓住你并套上黑色手铐! (+RestraintAdded) +骷髅抓住你并套上黑色手铐! ( +RestraintAdded ) + + Vine Plant 藤蔓 The plant leaks purple juices everywhere as it wilts. 这种植物在枯萎紫色汁液流的到处都是。 The vine plant whips you with its tendrils! (DamageTaken) -藤本植物用它的卷须鞭打你! (DamageTaken) +藤本植物用它的卷须鞭打你! ( DamageTaken ) The vine plant wraps its tendrils around you! (+RestraintAdded) -藤蔓植物将卷须缠绕在您周围! (+RestraintAdded) +藤蔓植物将卷须缠绕在你周围! ( +RestraintAdded ) The vine plant grips you tightly! (DamageTaken) -藤本植物紧紧抓住你! (DamageTaken) +藤本植物紧紧抓住你! ( DamageTaken ) + + +Vine Spitter +藤蔓喷吐者 +The vine spitter leaks purple juices everywhere as it wilts. +藤蔓喷吐者枯萎了,紫色的汁液会泄漏到各处。 +The vine spitter slaps you with its tendrils! (DamageTaken) +藤蔓喷吐者用它的卷须打你! ( DamageTaken ) +The vine spitter wraps its tendrils around you! (+RestraintAdded) +藤蔓喷吐者用它的卷须缠绕着你! ( +RestraintAdded ) +The vine spitter grips you tightly! (DamageTaken) +藤蔓喷吐者紧紧地抓住你! ( DamageTaken ) + + Bramble 荆棘 The brambles are hacked away. 荆棘被砍掉了。 The bramble snares you! (DamageTaken) -荆棘缠住了你! (DamageTaken) +荆棘缠住了你! ( DamageTaken ) + + The red liquid bubbles and several round slimes pop out! -红色的液体开始冒泡,几个圆形的史莱姆跳了出来! +红色的液体开始冒泡,几团圆形的粘液团跳了出来! The red liquid bubbles and a round slime pops out! -红色的液体开始冒泡,一个史莱姆跳了出来! +红色的液体开始冒泡,一团粘液团跳了出来! A revenant appears! -一个亡灵出现了! +一个亡魂出现了! Fuuka uses a talisman to call forth the spirits of her pets! -Fuuka使用丝带召唤她的宠物的灵魂! +风香(Fuuka)使用护符召唤她宠物的灵魂! + + A pool of latex bubbles and a twisted elemental appears! -一池乳胶冒出气泡,一个扭曲的元素出现了! -Red Slime -红色史莱姆 -Latex Elemental -乳胶元素 -Latex Elemental -乳胶元素 +一池乳胶冒出气泡,一个扭曲的精灵出现了! + + +Latex Homunculus +乳胶生命体 + + Red Slime -红色史莱姆 +红粘液团 The red slime bounces away. -红色史莱姆弹走了。 +红色粘液团弹跳着离开了。 The red slime bounces off you! (DamageTaken) -红色史莱姆撞在你身上! (DamageTaken) +红色粘液团撞到了你身上! ( DamageTaken ) The slime shoves itself into your mouth! (+RestraintAdded) -史莱姆自己塞进了你的嘴里! (+RestraintAdded) +粘液自己塞进了你的嘴里! ( +RestraintAdded ) + + +Slime Mold +粘菌 +The slime mold explodes into small puffs. +粘菌爆炸成小泡。 +The slime mold is sticky and gross! (DamageTaken) +粘菌又粘又恶心! ( DamageTaken ) +The slime mold attaches itself to your body! (+RestraintAdded) +粘菌附着在你的身上! ( +RestraintAdded ) + + +Mold Puff +霉菌泡芙 +The mold puff explodes into small puffs. +霉菌泡芙爆炸成小泡芙。 +The mold puff is sticky and gross! (DamageTaken) +霉菌泡芙又粘又恶心! ( DamageTaken ) +The mold puff leaps through the air! +霉菌泡芙在空中跳跃! +The mold puff attaches itself to your body! (+RestraintAdded) +霉菌泡芙自动附着在你的身上! ( +RestraintAdded ) + + +Slime Mold Nest +粘菌巢 +The slime mold nest erupts into a shower of black particles! +粘菌巢爆发出一阵黑色粒子! + + +Many small pieces of slime mold break off! +许多小粘菌碎片脱落! +A mobile cyst emerges from the slime mold nest! +一个可移动的囊肿从粘菌巢中出现! + + +Factory Doll +工厂玩偶 +The doll is subdued. +玩偶被制服了。 +Freed Doll +自由玩偶 +The doll returns to her place. +玩偶回到她的住处。 + + +Encased Adventurer +被包裹的冒险家 +The encased adventurer loses hope. +被包裹的冒险家失去了希望。 +The encased adventurer moans as she throws herself against you for help! (DamageTaken) +被包裹的冒险家一边呻吟一边扑向你寻求帮助! ( DamageTaken ) +The encased adventurer sticks to you as she mumbles incoherently! (DamageTaken) +被包裹的冒险家粘在你身上,语无伦次地咕哝着! ( DamageTaken ) +The encased adventurer pleads for help as her slime spreads to you! (+RestraintAdded) +被困住的冒险家向你寻求帮助,她的粘液蔓延到了你的身上! ( +RestraintAdded ) + + Slime -史莱姆 +粘液 The slime melts into a puddle. -史莱姆融化成了一摊水。 +粘液融化成了一摊水。 The sticky slime splashes against you! (DamageTaken) -粘稠的史莱姆泼到你身上! (DamageTaken) +粘稠的粘液泼到你身上! ( DamageTaken ) The slime attaches itself to your body! (+RestraintAdded) -史莱姆附着在你的身体上! (+RestraintAdded) +粘液附着在你的身体上! ( +RestraintAdded ) + + +Bouncy Slime +弹力粘液 +The bouncy slime splashes against you! (DamageTaken) +粘稠的粘液泼到你身上! ( DamageTaken ) +The bouncy slime leaps to you! +弹力粘液向你扑来! +The bouncy slime attaches itself to your body! (+RestraintAdded) +弹力粘液附着在你的身体上! ( +RestraintAdded ) + + Fast Slime -快速史莱姆 -The slime melts into a puddle. -史莱姆融化成水坑。 +疾速粘液团 The sticky slime leaps and splashes against you! (DamageTaken) -粘稠的史莱姆跳跃并溅到你身上! (DamageTaken) +粘稠的粘液跳跃并溅到你身上! ( DamageTaken ) The slime leaps and attaches itself to your body! (+RestraintAdded) -史莱姆跳跃并附着在你的身体上! (+RestraintAdded) +粘液跳跃并附着在你的身体上! ( +RestraintAdded ) + + Large Slime -大史莱姆 +大粘液团 The large slime splits apart! -巨大的史莱姆裂开了! -The sticky slime splashes against you! (DamageTaken) -粘稠的史莱姆溅到你身上! (DamageTaken) +巨大的粘液团裂开了! The slime spreads to your body! (+RestraintAdded) -史莱姆扩散到你的身体! (+RestraintAdded) +粘液扩散到你的身体! ( +RestraintAdded ) + + The slime splits into many smaller droplets! -史莱姆分裂成许多更小的液滴! -Skeleton -骷髅 +粘液分裂成许多更小的水滴! + + The Skeleton falls into pieces. 骷髅碎成了碎片。 -The Skeleton restrains you! (+RestraintAdded) -骷髅会束缚你! (+RestraintAdded) The Skeleton latches onto you! 骷髅锁在你身上! + + Rope Tentacle 绳索触手 The rope kraken retreats its tentacle. 绳妖收回了它的触手。 The rope kraken squeezes you with one of its tentacles! (DamageTaken) 绳妖用它的一根触手压迫你! (DamageTaken) + + Rope Kraken 绳妖 The rope kraken devolves into a bundle of premium bondage rope. 绳妖演变成一束优质束缚绳索。 The rope kraken tightly cinches itself around your body! (DamageTaken) 绳妖的绳子紧紧地缠绕在你的身体上! (DamageTaken) + + Magic Rope 魔绳 The magic rope returns to being a normal rope. 魔绳变回普通绳索。 The magic rope wraps itself tightly around your body! (+RestraintAdded) -魔绳紧紧地缠绕在你的身体上! (+RestraintAdded) +魔绳紧紧地缠绕在你的身体上! ( +RestraintAdded ) The magic rope wriggles into your outfit! (DamageTaken) -魔绳蠕动到你的衣服里! (DamageTaken) +魔绳蠕动到你的衣服里! ( DamageTaken ) + + Cloud of Feathers 一团羽毛 The feathers fall to the floor. 羽毛掉到地上。 The feathers tickle you mercilessly! (DamageTaken) -羽毛无情地挠你痒痒! (DamageTaken) +羽毛无情地挠你痒痒! ( DamageTaken ) + + Cloud of Scarves 一团围巾 The scarves become knotted and fall to the floor. 围巾打结并掉到地板上。 The scarves wrap themselves around you! (+RestraintAdded) -围巾包裹了你! (+RestraintAdded) -The scarves rub against your body, tickling you! (DamageTaken) -围巾摩擦你的身体,让你发痒! (DamageTaken) +围巾包裹了你! ( +RestraintAdded ) +The scarves rub against your body, wrapping you in fluffy fabric! (DamageTaken) +围巾摩擦着你的身体,用蓬松的布料包裹着你! ( DamageTaken ) + + Cloud of Ribbons 一团丝带 The ribbons knot themselves in a bow and fall to the floor. 丝带结成蝴蝶结,掉到地上。 The ribbons wrap themselves around you! (+RestraintAdded) -丝带包裹了你! (+RestraintAdded) +丝带包裹了你! ( +RestraintAdded ) The ribbons wrap themselves around you! (DamageTaken) -丝带包裹了你! (DamageTaken) +丝带包裹了你! ( DamageTaken ) + + Gravitating Gag 诱惑的口球 The gag buckles itself in place and falls. 口球停在原地并掉在地上。 The gravitating gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) -诱惑的口球牢牢地塞进你的嘴里,然后自己扣住! (+RestraintAdded) -The gravitating gag rubs itself against your gagged lips! (DamageTaken) -诱惑的口球在你的嘴唇上摩擦! (DamageTaken) +诱惑的口球牢牢地塞进你的嘴里,然后自己扣住! ( +RestraintAdded ) +The gravitating gag rubs itself against your lips! (DamageTaken) +诱惑的口球在你的嘴唇上摩擦! ( DamageTaken ) +The gag dashes to you! +口球冲向你! + + Seductive Shackles 诱惑的镣铐 The shackles' chain breaks as they fall to the floor. 镣铐的链子掉到地上,断了。 The shackles force themselves around your limbs and click tightly! (+RestraintAdded) -镣铐将自己强行缠绕在您的四肢上并紧紧地咔哒一声锁住了! (+RestraintAdded) +镣铐将自己强行缠绕在你的四肢上并紧紧地咔哒一声锁住了! ( +RestraintAdded ) The shackles click seductively in your face... (DamageTaken) -镣铐在你面前咔哒咔哒作响……(-DamageTaken SP) +镣铐在你面前咔哒咔哒作响…… ( DamageTaken ) +The shackles dash to you! +镣铐冲向你! + + Lurid Legbinder 可怕的绑腿 The legbinder unravels. 绑腿解开了。 The legbinder zips itself around your legs and squeezes them together! (+RestraintAdded) -绑腿会自动拉合住你的双腿,并将它们挤压在一起!(+RestraintAdded) +绑腿会自动拉合住你的双腿,并将它们挤压在一起! ( +RestraintAdded ) The legbinder wraps around and squeezes your body! (DamageTaken) -绑腿包裹并挤压你的身体! (DamageTaken) +绑腿包裹并挤压你的身体! ( DamageTaken ) + + Bratty Blindfold 顽皮的眼罩 The blindfold floats to the floor. 眼罩飘到地板上。 The blindfold buckles itself tightly around your head! (+RestraintAdded) -眼罩紧紧地扣在你的头上! (+RestraintAdded) +眼罩紧紧地扣在你的头上!(+RestraintAdded) The blindfold crawls over your helpless face! (DamageTaken) -眼罩在你无助的脸上爬行! (DamageTaken) +眼罩在你无助的脸上爬行! ( DamageTaken ) +The blindfold dashes to you! +眼罩冲向你! + + Amorous Armbinder -色情的绑臂 +色情的单手套 The armbinder flops to the floor. -绑臂扑通一声倒在地板上。 +单手套扑通一声倒在地板上。 The armbinder slips itself around your arms and pushes your elbows together! (+RestraintAdded) -绑臂会绕着你的手臂滑动,并将你的肘部挤压到一起! (+RestraintAdded) +单手套会绕着你的手臂滑动,并将你的肘部挤压到一起! ( +RestraintAdded ) The armbinder rubs itself all over your body! (DamageTaken) -绑臂在你身上摩擦!(DamageTaken) +单手套在你身上摩擦! ( DamageTaken ) + + Stringent Straitjacket -严格的紧身衣 +严格的拘束衣 The straitjacket falls apart. -紧身衣散开了。 +拘束衣散开了。 The straitjacket slips itself on over your head and pulls your arms close to your body! (+RestraintAdded) -紧身衣会在你的头上滑动,并将你的手臂拉到身体附近! (+RestraintAdded) +拘束衣会在你的头上滑动,并将你的手臂拉到身体附近! ( +RestraintAdded ) The straitjacket squeezes you tightly! (DamageTaken) -紧身衣把你挤得紧紧的! (DamageTaken) -Lurid Chastity Belt -可怕的贞操带 +拘束衣把你挤得紧紧的! ( DamageTaken ) + + +Brusque Belt +粗暴的贞操带 The chastity belt falls to the floor with a clang. 贞操带哐当一声掉在地上。 The chastity belt secures itself around your waist! (+RestraintAdded) -贞操带系在了你的腰上!(+RestraintAdded) +贞操带系在了你的腰上! ( +RestraintAdded ) The chastity belt buzzes against your body alluringly! (DamageTaken) -贞操带在你诱人的身体上发出了嗡嗡声!(DamageTaken) +贞操带在你诱人的身体上发出了嗡嗡声! ( DamageTaken ) + + +Yammering Yoke +咆哮的枷锁 +The yoke falls to the floor with a loud clang. +枷锁掉落在地板上,发出一声巨响。 +The yoke clasps your arms tightly and forces them to the sides! (+RestraintAdded) +枷锁紧紧地扣住你的手臂,迫使它们向两侧移动 ( +RestraintAdded ) +The yoke makes alluring clicking noises! (DamageTaken) +枷锁发出诱人的咔哒声! ( DamageTaken ) + + Haughty Harness 傲慢的束衣 The harness unravels. 束衣解开了。 The harness buckles itself tightly around your body! (+RestraintAdded) -束衣紧紧地扣在你身上! (+RestraintAdded) +束衣紧紧地扣在你身上! ( +RestraintAdded ) +The harness dashes to you! +束衣向你冲来! The harness wraps itself around your body and squeezes! (DamageTaken) -束衣缠绕在你的身体上并挤压! (DamageTaken) +束衣缠绕在你的身体上并挤压! ( DamageTaken ) + + Levitating Locks 悬浮锁 The locks and chains fall to the floor in a loud crash. 锁和锁链掉到地上,发出一声巨响。 A lock clicks itself onto one of your restraints! (+RestraintAdded) -一把锁自动锁在了在你的一个拘束具上! (+RestraintAdded) +一把锁自动锁在了在你的一个拘束具上! ( +RestraintAdded ) A chain locks itself in place on your body! (DamageTaken) -一条铁链将自己锁定在您的身体上! (DamageTaken) +一条铁链将自己锁定在你的身体上! ( DamageTaken ) +The lock dashes to you! +锁向你冲来! The floating locks and chains rub themselves across your body! (DamageTaken) -浮动锁和链条在您的身体上摩擦! (DamageTaken) +浮动锁和链条在你的身体上摩擦! ( DamageTaken ) + + +Masterful Lock +大师锁 +The lock falls to the floor, disenchanted. +锁掉在地板上,心灰意冷。 +The Masterful Lock clicks seductively in your face! (DamageTaken) +大师锁在你脸上发出诱人的咔哒声! ( DamageTaken ) +The Masterful Lock conjures a lock onto one of your restraints! (DamageTaken) +大师锁为你的一个拘束具上一把锁! ( DamageTaken ) + + Conjured Gag 咒术口球 The conjured gag buckles itself in place and falls. 被咒术口球卡在原地并掉了下来。 The gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) -口球牢牢地塞进你的嘴里,然后自己扣住! (+RestraintAdded) +口球牢牢地塞进你的嘴里,然后自己扣住! ( +RestraintAdded ) The gag rubs itself against you! (DamageTaken) -口球在你身上摩擦! (DamageTaken) +口球在你身上摩擦! ( DamageTaken ) + + Learned Rope -学习绳索 +学徒绳索 The learned rope untangles into a mess of rope. 绳索解开成一堆乱七八糟的绳索。 The magic rope wraps itself intricately around your body! (+RestraintAdded) -魔绳错综复杂地缠绕在你的身体上! (+RestraintAdded) -The magic rope wriggles into your outfit! (DamageTaken) -魔绳蠕动到你的衣服里! (DamageTaken) +魔绳错综复杂地缠绕在你的身体上! ( +RestraintAdded ) +The rope dashes to you! +绳子向你冲来! + + Unforseen Rope 袭击绳索 The unforseen rope is gone... or is it? 袭击绳索消失了……是吗? The unforseen rope wraps itself clandestinely around your body! (+RestraintAdded) -袭击绳索悄悄地缠绕在你的身体上! (+RestraintAdded) +袭击绳索悄悄地缠绕在你的身体上! ( +RestraintAdded ) The unforseen rope wriggles into your outfit! (DamageTaken) -袭击绳索会蠕动到你的装备中! (DamageTaken) +袭击绳索会蠕动到你的装备中! ( DamageTaken ) + + Monster Rope 怪物绳索 The monster rope bundle collapses into a pile of ropes. 怪物绳束坍塌成一堆绳索。 The magic rope wraps itself overwhelmingly around your body! (+RestraintAdded) -魔绳以压倒性的方式缠绕在你的身体上! (+RestraintAdded) -The magic rope wriggles into your outfit! (DamageTaken) -魔绳蠕动到你的衣服里! (DamageTaken) +魔绳以压倒性的方式缠绕在你的身体上! ( +RestraintAdded ) + + Shock Witch 电击女巫 The shock witch vanishes into a cloud of thunder, leaving behind a keyring. 电击女巫消失在雷云中,留下一个钥匙圈。 -The witch clips a restraint around your neck! -女巫在你的脖子上装上了一个拘束具! -The witch slaps you playfully! -女巫开玩弄地扇你耳光! -Witch's Apprentice -女巫的学徒 +The witch restrains you! (+RestraintAdded) +女巫束缚了你! ( +RestraintAdded ) +The witch dangles a lock in front of you before putting it on! (DamageTaken) +女巫在你面前晃了晃锁,然后把你锁上! ( DamageTaken ) +The witch slaps you playfully! (DamageTaken) +女巫顽皮地打你一巴掌! ( DamageTaken ) + + +Flame Witch +火焰女巫 +The flame witch vanishes into a pile of ash. +火焰女巫消失在一堆灰烬中。 + + +Earth Witch +大地女巫 +The earth witch vanishes into a pile of ash. +火焰女巫消失在一堆灰烬中。 + + +Water Witch +水之女巫 +The water witch vanishes into a pile of ash. +水之女巫消失在一堆灰烬中。 + + +Aqua Witch +水之女巫 +The aqua witch vanishes into a pile of ash. +水之女巫化为一堆灰烬消失了。 + + +Ice Witch +冰之女巫 +The ice witch vanishes into a pile of ash. +冰之女巫消失在一堆灰烬中。 + + + + +Magic Stone +魔法石 +Ice Bolt +冰箭 +Waterblast +水压 + + +Rope Witch +绳索女巫 +The rope witch retreats as her animated ropes chase her. +绳索女巫和她的绳索们一起撤退了。 + + +Magnet Witch +磁力女巫 +The witch is pulled away by an unseen force. +女巫被一股看不见的力量拉走了。 +The witch's restraints fly out and attach themselves to you! (+RestraintAdded) +女巫的束缚飞出并附着在你身上!(+RestraintAdded) +The witch's lightning causes your body to tingle! (DamageTaken) +女巫的闪电让你的身体感到刺痛! ( DamageTaken ) + + +Mage's Apprentice +魔法学徒 The apprentice runs off and cries in a corner. 学徒跑掉了,在角落里哭了起来。 -The apprentice animates restraints to wrap around you! -学徒活化拘束具包裹在你的身上! -The apprentice slaps you playfully! -学徒玩弄地打你一巴掌! +The apprentice animates restraints to wrap around you! (+RestraintAdded) +学徒使用束缚将你包裹起来!(+RestraintAdded) +The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) +学徒紧张地拿出一把锁,让你戴上! ( DamageTaken ) +The apprentice slaps you playfully! (DamageTaken) +学徒顽皮地打你一巴掌! ( DamageTaken ) + + Summoner's Apprentice 召唤师学徒 -The apprentice runs off and cries in a corner. -学徒跑掉了,在角落里哭了起来。 -The apprentice summons a restraint onto you! -学徒在你身上召唤了拘束具! -The apprentice tickles you playfully! -学徒玩弄地对你挠痒! +The apprentice summons a restraint onto you! (+RestraintAdded) +学徒召唤对你的束缚!(+RestraintAdded) +The apprentice tickles you playfully! (DamageTaken) +学徒顽皮地挠你! ( DamageTaken ) + + +Witch's Apprentice +女巫的学徒 +The witch's apprentice confidently admits defeat. +女巫的学徒自信地承认失败。 +The witch's apprentice conjures magic bindings on you! (+RestraintAdded) +女巫的学徒对你施加了魔法束缚! (+束缚已添加) +The witch's apprentice smiles and summons a lock onto you! (DamageTaken) +女巫的学徒微笑着召唤了一个锁链向你袭来!(受到伤害) +The witch's apprentice smiles as she squeezes your chest! (DamageTaken) +女巫的学徒笑着捏了捏你的胸部!(受到伤害) + + Latex Apprentice 乳胶学徒 -The apprentice runs off and cries in a corner. -学徒跑掉了,在角落里哭了起来。 -The apprentice attaches a sticky restraint! -学徒对你使用粘性束缚! -The apprentice caresses you playfully! -学徒玩弄地地爱抚你! +The apprentice attaches a sticky restraint! (+RestraintAdded) +学徒对你附上了粘性束缚!(+RestraintAdded) +The apprentice caresses you playfully! (DamageTaken) +学徒顽皮爱抚你! ( DamageTaken ) + + Chain Witch 锁链女巫 The chain witch vanishes into a pile of metal dust, leaving behind a keyring. 锁链女巫消失在一堆金属尘埃中,留下一个钥匙圈。 The chain witch locks all of your restraints! 锁链女巫锁住了你所有的拘束具! -The witch clips a restraint around your neck! -女巫在你的脖子上装上了一个拘束具! -The chain witch tugs sensually at your restraints! -锁链女巫色眯眯地拉扯你的拘束具! +The witch's bindings wrap themselves around you! (+RestraintAdded) +女巫的束缚将你包裹起来! ( +RestraintAdded ) +The chain witch tugs sensually at your restraints! (DamageTaken) +锁链女巫性感地拉扯你的束缚! ( DamageTaken ) + + +Metal Witch +金属女巫 +The metal witch vanishes into a pile of metal dust, leaving behind a keyring. +金属女巫消失在一堆金属粉尘中,留下一个钥匙圈。 +The metal witch locks all of your restraints! +金属女巫锁住了你所有的拘束具! +The metal's bindings wrap themselves around you! (+RestraintAdded) +金属的束缚将你包裹起来! ( +RestraintAdded ) +The metal witch tugs sensually at your restraints! (DamageTaken) +金属女巫性感地拉扯你的束缚! ( DamageTaken ) + + Slime Witch -史莱姆女巫 +粘液女巫 The slime witch vanishes into a pool of pink slime, leaving behind a keyring. -史莱姆女巫消失在粉红色的史莱姆池中,留下一个钥匙圈。 -The witch clips a restraint around your neck! -女巫在你的脖子上装上了一个拘束具! -The witch squeezes your body playfully! -女巫玩弄地地压迫你的身体! +粘液女巫消失在粉红色的粘液池中,留下一个钥匙圈。 +The witch touches her with her sticky grasp! (+RestraintAdded) +女巫用她那粘粘的手掌触碰了你! ( +RestraintAdded ) +The witch creates a magical lock made of hardened latex! (DamageTaken) +女巫创造了一把由硬化乳胶制成的神奇锁! ( DamageTaken ) +The witch squeezes your body playfully! (DamageTaken) +女巫顽皮地揉捏你的身体! ( DamageTaken ) + + 'High' Wizard -“高阶”巫师 +“高阶”法师 The wizard falls asleep. -巫师睡着了。 -The wizard clips a restraint around your neck! -巫师在你的脖子上装上了一个拘束具! -The wizard laughs maniacally as she tickles you! -巫师一边狂笑一边对你挠痒! +法师睡着了。 +The wizard clips a restraint around your neck! (+RestraintAdded) +法师将束缚带绑在你的脖子上! ( +RestraintAdded ) +The wizard clips a lock to your restraints! (DamageTaken) +法师在你的束缚上加了一把锁! ( DamageTaken ) +The wizard laughs maniacally as she tickles you! (DamageTaken) +法师在给你挠痒痒的时候疯狂地大笑! ( DamageTaken ) + + FunGal 真菌 The fun-gal retreats into the ground. 真菌后退到地下。 -The fun-gal clips a restraint around your neck! -真菌在你脖子上夹了一个束缚! -The fun-gal rubs your chest with her long, slender fingers! -真菌用她细长的手指摩擦你的胸部! -Crystal Glyph -水晶雕文 +The fun-gal clips a restraint around your neck! (+RestraintAdded) +真菌在你的脖子上绑了一条束缚带! (+RestraintAdded) +The fun-gal produces a magical lock on all your restraints! (DamageTaken) +真菌会对你所有的束缚加上魔法锁! ( DamageTaken ) +The fun-gal rubs your chest with her long, slender fingers! (DamageTaken) +真菌用她修长的手指摩擦你的胸部! ( DamageTaken ) +Crystal Slash +结晶斩击 +Crystal Bolt +结晶箭 + + Tailor 裁缝 -You murder the tailor! -你杀了裁缝! +You rob the tailor! +你抢了裁缝! + + Student 学生 -You murder the student! -你杀了学生! +You rob the student! +你抢了学生! + + Tactician 战术家 -You murder the tactician! -你杀了战术家! +You rob the tactician! +你抢了战术家! + + Informant 线人 -You murder the informant! -你杀了线人! +You rob the informant! +你抢了线人! + + Thug 恶棍 -You murder the thug! -你杀了恶棍! +You rob the thug! +你抢了恶棍! + + +Antique Merchant +古董商人 +You smash the antique merchant! +你砸了古董商! Blacksmith 铁匠 -You murder the blacksmith! -你杀了铁匠! +You rob the blacksmith! +你抢了铁匠 +Armorer +防具师 +You rob the armorer! +你抢了防具师! +Bowyer +制弓师 +You rob the bowyer! +你抢了制弓师! +Not a Kidnapper +不是绑匪 +You bring the kidnapper to justice! +你把绑匪绳之以法! + + Dressmaker 裁缝 The dressmaker storms out in a rage. 裁缝生气地逃走了。 The dressmaker has you try on one of her new accessories! (+RestraintAdded) -裁缝让你试穿她的一件新配饰! (+RestraintAdded) +裁缝让你试穿她的一件新配饰! ( +RestraintAdded ) The dressmaker adds a lock 'just to complete the look, you know?' 裁缝加了一把锁,“只是为了完成造型,你知道吗?” The dressmaker cuddles your helpless body~ (DamageTaken) 裁缝拥抱你无助的身体~(DamageTaken) + + Nurse 护士 The Nurse checks her notes and runs off. @@ -2266,6 +5222,8 @@ The Nurse adds a lock to keep you from hurting the staff. 护士加了一把锁,防止你伤害工作人员。 The Nurse assures you it's going to be alright~ (DamageTaken) 护士向你保证一切都会好起来的~ (DamageTaken) + + Librarian 图书管理员 The librarian gets angry and retreats. @@ -2276,36 +5234,60 @@ The librarian snaps her fingers and sends a lock flying at you! 图书管理员啪的一声,一把锁朝你飞来! The librarian whispers seductively into your ear! (DamageTaken) 图书管理员在你耳边诱人地低语! (DamageTaken) + + +Stone Door +石门 +The stone door crumbles! +石门轰然崩塌! +Steel Door +铁门 +The stone door crumples inward! +石门向内塌陷! +Control Room Door +控制室门 +The door flies open as the Dollmaker chuckles at you! +当玩偶师对你咯咯笑时,门突然打开了! + + Giant Mushroom -巨型蘑菇 -The giant mushroom explodes into a cloud of spores!!! -巨型的蘑菇爆炸,留下了一片孢子云!!! -Mushy -蘑糊 +巨型菇 The giant mushroom explodes into a cloud of spores!!! -巨大的蘑菇爆炸成孢子云!!! -The giant mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) -巨大的蘑菇将孢子吐到您的脸上,并在您干扰值时将您绑起来! (+RestraintAdded) -The giant mushroom spits spores into your face and tries to tie you! -巨大的蘑菇将孢子吐到你的脸上并试图绑住你! -The giant mushroom emits soporific spores! (DamageTaken) -巨型蘑菇散发出催眠孢子! (DamageTaken) -Happy Mushy -快乐蘑糊 -The giant mushroom explodes into a cloud of spores!!! -巨大的蘑菇爆炸成孢子云!!! -The giant mushroom tickles you silly! -巨大的蘑菇让你发痒! -The giant mushroom tickles you silly! (DamageTaken) -巨大的蘑菇让你发痒! (DamageTaken) -Infected Mushy -受感染的蘑姑 -The giant mushroom explodes into a cloud of spores!!! -巨大的蘑菇爆炸成孢子云!!! -The giant mushroom gives you a crushing hug! -巨型蘑菇给你一个破碎的拥抱! -The giant mushroom gives you a crushing hug! (DamageTaken) -巨型蘑菇给你一个破碎的拥抱! (DamageTaken) +巨型菇爆炸,留下了一片孢子云!!! + + +Army Mushroom +军团菇 +The army mushroom explodes into a cloud of spores!!! +军团菇爆炸成一团孢子!!! +The army mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) +军团菇把孢子吐到你脸上,并在你性奋时,把你绑起来!(+RestraintAdded) +The army mushroom spits spores into your face and tries to tie you! +军团菇把孢子吐到你脸上,试图把你绑起来! +The army mushroom emits soporific spores! (DamageTaken) +军团菇散发出令人昏昏欲睡的孢子!(DamageTaken) + + +Delicious Mushroom +美味菇 +The delicious mushroom explodes into a cloud of spores!!! +美味菇爆炸成一团孢子!!! +The delicious mushroom tickles you silly! +美味菇挠痒痒让你傻笑! +The delicious mushroom tickles you silly! (DamageTaken) +美味菇挠痒痒让你不断的笑!( DamageTaken ) + + +Infected Mushroom +感染菇 +The infected mushroom explodes into a cloud of spores!!! +感染菇爆炸成一团孢子!!! +The infected mushroom gives you a crushing hug! +感染菇给了你一个沉重的拥抱! +The infected mushroom gives you a crushing hug! (DamageTaken) +感染菇给了你一个沉重的拥抱!( DamageTaken ) + + Jailer 狱卒 The jailer passes out and drops her possessions! @@ -2313,41 +5295,45 @@ The jailer passes out and drops her possessions! The jailer locks your restraints! 狱卒锁住了你的拘束具! The jailer places some restraints on you! (+RestraintAdded) -狱卒对你施加了一些拘束! (+RestraintAdded) +狱卒对你施加了一些拘束! ( +RestraintAdded ) The jailer plays with you, groping and rubbing your body! 狱卒玩弄你,摸索揉捏你的身体! + + The guard checks your restraints to make sure they are secure. -警卫检查您的拘束具以确保它们是牢固的。 +警卫检查你的拘束具以确保它们是牢固的。 + + Guard 警卫 The guard passes out and drops her possessions! -守卫昏倒了,丢了她的财物! +警卫昏倒了,丢了她的财物! The guard locks your restraints! -守卫锁住你的拘束具! -The jailer places some restraints on you! (+RestraintAdded) -狱卒对你施加了一些拘束具! (+RestraintAdded) +警卫锁住你的拘束具! The guard places a NewRestraintName on you -警卫在你身上放置了一个 NewRestraintName +警卫在你身上放置了一个新的 RestraintName The guard plays with you, groping and rubbing your body! -守卫玩弄你,摸索揉你的身体! +警卫玩弄你,摸索揉弄你的身体! + + Armed Guard 武装警卫 The armed guard retreats, but drops a keyring! 武装警卫撤退,但丢了一个钥匙圈! -The guard locks your restraints! -守卫锁住你的拘束具! The guard shocks you and slaps on some restraints! (+RestraintAdded) -守卫电击了你并使用了一些拘束具! (+RestraintAdded) -The guard electrocutes you with her taser!!! +警卫电击了你并使用了一些拘束具! ( +RestraintAdded ) +The guard shocks you with her taser!!! 警卫用她的电击枪电击你!!! -The guard electrocutes you with her taser!!! -警卫用她的电击枪电击你!!! -The EnemyName replaces your OldRestraintName with a NewRestraintName -EnemyName 将您的 OldRestraintName 替换为 NewRestraintName + + +The EnemyName applies a NewRestraintName over your OldRestraintName +EnemyName 在你的 OldRestraintName 上束缚了 NewRestraintName The EnemyName removes your OldRestraintName -EnemyName 移除了您的 OldRestraintName +EnemyName 移除了你身上的 OldRestraintName The EnemyName restrains you with a NewRestraintName EnemyName 用 NewRestraintName 拘束你 + + Master Conjurer 咒术宗师 The conjurer retreats into a portal! @@ -2357,17 +5343,9 @@ The master conjurer waves a hand, and locks appear on all your restraints! The master conjurer summons a restraint directly onto you! 咒术宗师直接在你身上召唤了一个拘束具! The master conjurer tickles you playfully! -魔术师会玩弄地对你挠痒! -Master Conjurer -咒术宗师 -The conjurer retreats into a portal! -咒术师撤退到传送门中! -The master conjurer waves a hand, and locks appear on all your restraints! -咒术宗师挥了一下手,你所有的拘束具都上锁了! -The master conjurer summons a restraint directly onto you! -咒术宗师直接在你身上召唤了一个拘束具! -The master conjurer tickles you playfully! -魔术师会玩弄地对你挠痒! +咒术宗师会玩弄地对你挠痒! + + Frog 青蛙 The frog jumps away! @@ -2376,6 +5354,8 @@ The frog pulls you with its tongue!!! 青蛙用舌头拉扯你!!! The frog licks you! 青蛙在舔你! + + Toad 蟾蜍 The toad jumps away! @@ -2384,12 +5364,128 @@ The toad pulls you with its tongue!!! 蟾蜍用舌头拉扯你!!! The toad licks you! 蟾蜍在舔你! + + +Shadow Hand +影之手 +The shadow hand retreats into the darkness... +影之手退入黑暗之中…… +The shadow hand latches onto you!! (+RestraintAdded) +影之手抓住了你!! ( +RestraintAdded ) +The shadow hand stretches its fingers across your body! (DamageTaken) +影之手将手指伸过你的身体! ( DamageTaken ) +A dark hand stretches out beyond the shadows... +一只漆黑的手从阴影中伸出…… +Several dark hands emerge from the shadows! +几只漆黑的手从阴影中浮现出来! + + +Corrupted Adventurer +堕落冒险家 +The corrupted adventurer falls into a deep sleep. +堕落冒险家陷入了沉睡。 +The corrupted aventurer's many arms latch onto you! (+RestraintAdded) +堕落冒险家伸出许多手臂抓住了你! ( +RestraintAdded ) +The corrupted aventurer clicks a lock on from behind you! (DamageTaken) +堕落冒险家从你身后锁上了一把锁! ( DamageTaken ) +The corrupted adventurer drags her chilling fingers across your vulnerable skin! (DamageTaken) +堕落冒险家用她冰冷的手指划过你脆弱的皮肤! ( DamageTaken ) + + +Shadowy Ghast +阴暗恶魂 +The shadowy ghast screeches and disappears... +阴暗的恶魂尖叫一声,消失了…… +The shadowy ghast latches onto you with its long arms! (+RestraintAdded) +阴暗的恶魂用长长的手臂抓住了你! ( +RestraintAdded ) +The shadowy ghast grips you in its chilling embrace! (DamageTaken) +阴暗的恶魂用冰冷的怀抱紧紧抓住你! ( DamageTaken ) + + +Corrupted Elemental +腐蚀精灵 +The corrupted elemental dissolves into shadows. +腐蚀精灵溶解成阴影。 +The corrupted elemental reaches out and touches you, forming metallic restraints! (+RestraintAdded) +腐蚀精灵伸出手来触碰你,形成金属束缚! ( +RestraintAdded ) +The corrupted elemental uses its chains to lock your restraints! (DamageTaken) +腐蚀精灵用它的链子锁住你的束缚!(DamageTaken) +The corrupted elemental grips you and drains your willpower! (DamageTaken) +腐蚀精灵抓住你并耗尽你的意志力! ( DamageTaken ) + + +Star Demon +星魔 +The star demon is exorcised. +星魔被驱除。 +The star demon places you in shining, starry restraints. (+RestraintAdded) +星魔将你置于闪亮的星光束缚之中。 ( +RestraintAdded ) +The demon giggles as it locks your restraints! (DamageTaken) +恶魔咯咯地笑着锁住了你的束缚! ( DamageTaken ) +The star demon places you under its curse! (DamageTaken) +星魔将你置于它的诅咒之下! ( DamageTaken ) +The strings of fate glisten and wrap around you! +命运之线闪闪发光,缠绕着你! +Many shining strings surround you! +许多闪亮的丝线围绕着你! +Stepping outside of the indicated tiles will result in punishment! +走出指定的方块将会受到惩罚! +Bindings of Fate +命运的束缚 + + +Moon Demon +月魔 +The moon demon is exorcised. +月魔已被驱除。 +The moon demon places you in shining, starry restraints. (+RestraintAdded) +月魔将你置于闪亮、繁星的束缚之中。 ( +RestraintAdded ) +The moon demon places you under its curse! (DamageTaken) +月魔将你置于它的诅咒之下! ( DamageTaken ) +The weight of inescapable bondage falls upon you! (DamageTaken) +无法避免的束缚的重量落在你身上! ( DamageTaken ) +Crushing Fate +粉碎的命运 + + +Void Demon +虚空恶魔 +The void demon is exorcised. +虚空恶魔已被驱除。 +The void demon places you in dark, glassy restraints. (+RestraintAdded) +虚空恶魔将你置于黑暗、玻璃般的束缚之中。 ( +RestraintAdded ) +The void demon places you under its curse! (DamageTaken) +虚空恶魔将你置于它的诅咒之下! ( DamageTaken ) +You are sucked in by a powerful gravitational force!!! (DamageTaken) +你被强大的引力吸住了!!! ( DamageTaken ) +You are sucked in by a powerful gravitational force!!! +你被强大的引力吸住了!!! +The demon cracks its knuckles as it locks your restraints! (DamageTaken) +恶魔一边咔咔地捏响指关节,一边锁住你的束缚时! ( DamageTaken ) +Cosmic Force +宇宙的力量 + + +Demon +恶魔 +The demon is exorcised. +恶魔已被驱除。 +The demon places you in dark, glassy restraints. (+RestraintAdded) +恶魔将你置于黑暗、玻璃般的束缚之中。 ( +RestraintAdded ) +The demon caresses you gently with her sharp nails! (DamageTaken) +恶魔用她锋利的指甲温柔地抚摸着你! ( DamageTaken ) +The demon stuns you with her heavy mace! (+STUN) +恶魔用她沉重的狼牙棒将你击晕! ( +STUN ) + + Tickle Hand 挠痒痒的手 The hand vanishes! 手不见了! The hand tickles you! (DamageTaken) 手在挠你! (DamageTaken) + + Tickle Terror 挠痒恶魂 The tickle terror vanishes... for now @@ -2397,73 +5493,65 @@ The tickle terror vanishes... for now The monstrous spirit tickles you mercilessly!!! (DamageTaken) 恶灵在无情地挠你!!! (DamageTaken) The monstrous spirit binds you to make you more vulnerable! (+RestraintAdded) -恶灵拘束了你,并让你更加脆弱! (+RestraintAdded) +恶灵束缚了你,并让你更加脆弱! ( +RestraintAdded ) + + Hug Horror 拥抱恶魂 The hug horror vanishes... for now 拥抱恶魂消失了……暂时 The monstrous spirit gives a crushing hug!!! (DamageTaken) -恶魂给了一个重压的拥抱!!! (DamageTaken) -The monstrous spirit gives a crushing hug!!! (DamageTaken) -恶魂给了一个重压的拥抱!!! (DamageTaken) +恶魂给了你一个重重的拥抱!!! ( DamageTaken ) +The monstrous spirit envelops you in tightness, holding you in place! (DamageTaken) +恶魂将你紧紧的包裹住,把你固定在原地! ( DamageTaken ) The monstrous spirit's chains latch on! (+RestraintAdded) -恶魂的锁链锁住了! (+RestraintAdded) +恶魂的锁链锁上了! ( +RestraintAdded ) + + Greedy Ghast 贪婪的恶魂 The ghast vanishes... for now 恶魂消失了……暂时 -The moaning spirit gropes your body!!! (DamageTaken) -呻吟的灵魂摸索着你的身体!!! (DamageTaken) -Tickle Hand -挠痒痒的手 -The hand vanishes! -手不见了! -The hand tickles you! (DamageTaken) -手在挠你! (DamageTaken) +The moaning spirit runs its hands all across your body!!! (DamageTaken) +呻吟的幽灵抚摸着你的身体!!! ( DamageTaken ) + + + + Tome of Chains 锁链之书 The floating tome burns into ashes! 漂浮的巨著燃烧成灰烬! +Tome of Belts +绑带之书 +Tome of Ropes +绳索之书 +Tome of Bondage +束缚之书 Tome of Light -光之书 -The floating tome burns into ashes! -漂浮的巨著燃烧成灰烬! +光芒之书 Tome of Magic -魔法书 -The floating tome burns into ashes! -漂浮的巨著燃烧成灰烬! +魔法之书 Tome of Ice -冰之书 -The floating tome burns into ashes! -漂浮的巨著燃烧成灰烬! +寒冰之书 Tome of the Abyss 深渊之书 -The floating tome burns into ashes! -漂浮的巨著燃烧成灰烬! Tome of Nature 自然之书 -The floating tome burns into ashes! -漂浮的巨著燃烧成灰烬! Tome of Thunder 雷霆之书 -The floating tome burns into ashes! -漂浮的巨著燃烧成灰烬! Tome of Latex 乳胶之书 -The floating tome burns into ashes! -漂浮的巨著燃烧成灰烬! Tome of Laughs 欢笑之书 -The floating tome burns into ashes! -漂浮的巨著燃烧成灰烬! -A guard appears to check on you. -一名警卫出现并准备检查你。 -The guard leaves and locks the cell behind her. -守卫离开并锁住她身后的牢门。 + + You are grabbed and led to a prison... 你被抓住并被带到监狱...... Perhaps they may release you if you behave... 如果你表现得很好,也许他们会释放你…… + + Necromancer 死灵法师 The necromancer faints. Ironic that she couldn't save herself. @@ -2473,491 +5561,701 @@ The necromancer locks all of your restraints! The necromancer prepares you for transport! 死灵法师准备带走你了! The necromancer rubs your body sensually! -死灵法师在色眯眯地摩擦你的身体! +死灵法师在色眯眯地抚摸你的身体! + + Filthy Rat -肮脏的老鼠 +肮脏老鼠 The rat skitters back into a hole in the wall. 老鼠飞快地跑回墙上的一个洞里。 The filthy rat nibbles at you! (DamageTaken) -肮脏的老鼠在咬你! (DamageTaken) +肮脏老鼠在咬你! ( DamageTaken ) + + Annoying Bat -烦人的蝙蝠 +烦人蝙蝠 You stomp the bat into the ground to make sure it's dead. 你把蝙蝠踩在地上,以确保它已经死了。 The bat nibbles incessantly at you! (DamageTaken) -蝙蝠不停地啃咬你! (DamageTaken) +蝙蝠不停地啃咬你! ( DamageTaken ) + + Pixie 小精灵 The pixie huffs and floats away. 小精灵气呼呼地飘走了。 The pixie tickles you with a feather! (DamageTaken) -小精灵用羽毛逗你! (DamageTaken) +小精灵用羽毛逗你! ( DamageTaken ) + + Orb of Light 光球 The orb vanishes in a flash of light. 球体在一道闪光中消失。 The orb blinds you with its intense light!!! (DamageTaken) -球体以其强烈的光芒让你失明!!! (DamageTaken) -A light restores the health of its allies! -一道光可以恢复了周围敌人的生命! -You do not have enough resources to cast the spell! (Consider pleading with a goddess) -你没有足够的资源来施法! (考虑向女神请求) +球体以其强烈的光芒让你失明!!! ( DamageTaken ) +A light restores the will of its allies! +一道光恢复了盟友的意志! + + You do not have enough resources to cast the spell! -您没有足够的资源来施放咒语! -You AttackName TargetEnemy for DamageDealt DamageType damage! -你 AttackName TargetEnemy 造成 DamageDealt 点 DamageType 伤害! -You AttackName TargetEnemy for a decreased DamageDealt DamageType damage! -你 AttackName TargetEnemy 造成了少量的 DamageDealt 点 DamageType 伤害! -You AttackName TargetEnemy for an increased DamageDealt DamageType damage! -你 AttackName TargetEnemy 造成大量的 DamageDealt 点 DamageType 伤害! -You AttackName TargetEnemy for a devastating DamageDealt DamageType damage! -你 AttackName TargetEnemy 造成毁灭性的 DamageDealt 点 DamageType 伤害! -You AttackName TargetEnemy, but your DamageType weapon has no effect! -你 AttackName TargetEnemy,但你的武器没有效果! -You AttackName TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! -你 AttackName TargetEnemy 造成 DamageDealt 点 DamageType 伤害!减少了它的魔法抗性! +你没有足够的资源来施放咒语! AttackName hits TargetEnemy for DamageDealt DamageType damage! -AttackName 击中 TargetEnemy 造成 DamageDealt 点 DamageType 伤害! +AttackName 命中 TargetEnemy 造成了 DamageDealt 点 DamageType 伤害! +AttackName hits TargetEnemy for a decreased DamageDealt DamageType damage! +AttackName 命中 TargetEnemy 造成了 DamageDealt 点少量的 DamageType 伤害! +AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! +AttackName 命中 TargetEnemy 造成了 DamageDealt 点大量的 DamageType 伤害! +AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! +AttackName 命中 TargetEnemy 造成了 DamageDealt 点毁灭性的 DamageType 伤害! +AttackName hits TargetEnemy, but your DamageType weapon has no effect! +AttackName 命中 TargetEnemy, 但你的 DamageType 武器似乎没有任何效果! +AttackName hits TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! +AttackName 命中 TargetEnemy 造成了 DamageDealt 点 DamageType 伤害! 减少了它的魔法抗性! AttackName hits TargetEnemy for a reduced DamageDealt DamageType damage! AttackName 击中 TargetEnemy 造成了少量的 DamageDealt 点 DamageType 伤害! AttackName hits TargetEnemy but DamageType damage doesn't have any effect! AttackName 击中了 TargetEnemy,但是 DamageType 伤害没有作用! -AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! -AttackName 击中 TargetEnemy 以大量的 DamageDealt 点 DamageType 伤害! AttackName hits TargetEnemy for DamageDealt DamageType damage, reduced by an anti-magic ward! AttackName 击中 TargetEnemy 造成 DamageDealt 点 DamageType 伤害,减少了它的魔法抗性! -AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! -AttackName 击中 TargetEnemy 造成毁灭性的 DamageDealt 点 DamageType 伤害! +Your attack +你的攻击 +An effect +效果 You miss the TargetEnemy! 你没有命中目标敌人! Your attack is too feeble to hurt the TargetEnemy! 你的攻击太弱了,无法伤害目标敌人! +Your attack was absorbed by the TargetEnemy's shield! +你的攻击 TargetRestraint 的护盾吸收了! You try to pull the TargetRestraint off... -您尝试将 TargetRestraint 扯下... +你尝试将 TargetRestraint 扯下... You try to squirm and moan out of the TargetRestraint... 你在 TargetRestraint 中蠕动和呻吟…… You tug on the TargetRestraint with increased power... 你用更大的力量扯动 TargetRestraint…… -The ghost helps you try to pull the TargetRestraint off... -幽灵会帮助您尝试将 TargetRestraint 扯下... +Your ally helps you try to pull the TargetRestraint off... +你的盟友帮你试着解除 TargetRestraint…… You work on picking the TargetRestraint... 你在撬开 TargetRestraint 的锁... Your trembling hands work on picking the TargetRestraint... -你颤抖的双手在撬开 TargetRestraint 的锁…… +你双手颤抖着撬开 TargetRestraint 的锁…… You work on picking the TargetRestraint with your powers... 你正在用力撬开 TargetRestraint 的锁…… -The ghost tries to pick the lock on your TargetRestraint... -幽灵试图撬开你的 TargetRestraint 的锁…… +Your ally tries to pick the lock on your TargetRestraint... +你的盟友试图打开你的 TargetRestraint 的锁... You try to pick open the TargetRestraint but break your lockpick. -您尝试撬开 TargetRestraint 但损坏了撬锁工具。 -You work on picking the TargetRestraint... -你在撬开 TargetRestraint 的锁... -You work on picking the TargetRestraint... -你在撬开 TargetRestraint 的锁... -Your trembling hands work on picking the TargetRestraint... -你颤抖的双手在撬开 TargetRestraint 的锁…… -You work on picking the TargetRestraint with your powers... -你正在用力撬开 TargetRestraint 的锁…… -The ghost tries to pick the lock on your TargetRestraint... -幽灵试图撬开你的 TargetRestraint 的锁…… +你尝试撬开 TargetRestraint 但损坏了撬锁工具。 You break your lockpick trying to open the TargetRestraint. 你在试图撬开 TargetRestraint 的锁时损坏了你的撬锁工具。 You try to remove the TargetRestraint... -您尝试解开 TargetRestraint ... +你尝试解开 TargetRestraint ... You shakily try to remove the TargetRestraint... -您摇摇晃晃地尝试解开 TargetRestraint ...... +你摇摇晃晃地尝试解开 TargetRestraint ...... You try to remove the TargetRestraint with a tool... -您尝试使用工具解开 TargetRestraint ...... -The ghost helps you remove the TargetRestraint... -幽灵帮您解开 TargetRestraint... +你尝试使用工具解开 TargetRestraint ...... +Your ally helps you remove the TargetRestraint... +你的盟友帮你移除 TargetRestraint... You try to cut the TargetRestraint... 你试图切断 TargetRestraint ...... You tremble as you try to cut the TargetRestraint... -当你颤抖着,试图切断 TargetRestraint …… +你颤抖的双手正在试图切断 TargetRestraint…… You try to cut the TargetRestraint using your tools... -您尝试使用您的工具切断 TargetRestraint... +你尝试使用你的工具切断 TargetRestraint... You try to cut the TargetRestraint with help... -您尝试在帮助下切断 TargetRestraint ...... +你尝试在帮助下切断 TargetRestraint ...... You break your knife trying to cut the TargetRestraint. 你在试图切断 TargetRestraint 时折断了你的刀。 -You try to cut the TargetRestraint... -你试图切断 TargetRestraint ...... You fiddle with the key on the TargetRestraint... 你在 TargetRestraint 上尝试插入钥匙…… Your jittering hands fumble with the key on the TargetRestraint... 你颤抖的手在 TargetRestraint 上尝试插入钥匙…… You concentrate on unlocking the TargetRestraint... -你专注于解锁 TargetRestrain... +你专注于解锁 TargetRestraint... You work on unlocking the TargetRestraint with help... -您在帮助下解锁 TargetRestraint... -You fiddle with the key on the TargetRestraint... -你在 TargetRestraint 上尝试插入钥匙…… +你在帮助下成功解锁 TargetRestraint... + + The lock requires a key. -锁需要一把钥匙。 -The green padlock only accepts green keys. -绿色锁只接受绿色钥匙。 -The yellow padlock requires a red and a green key. -黄色锁需要一把红色和一把绿色钥匙。 -The magical lock only accepts blue keys and can't be picked. -魔法锁只接受蓝色钥匙,不能被撬开。 +这把锁需要一把钥匙。 +The lock can only be opened with a key. +这把锁只能用钥匙打开。 +The magical lock only accepts magical keys and can't be picked. +魔法锁只接受魔法钥匙,不能被撬开。 The magical lock is guarded with powerful magic. You'll have to wait for it to wear off... 魔法锁被强大的魔法守护着。你得等它消退... -This lock requires a Command Word to unlock. It doesn't have a keyhole. -此锁需要命令咒语才能解锁。它没有钥匙孔。 +The item is cybernetically locked. You will need a key card to unlock it. +该项目被控制锁定。你需要一张钥匙卡才能解锁它。 +This lock requires a command word to unlock. It doesn't have a keyhole. +此锁需要指令才能解锁。它没有钥匙孔。 You don't have a key for this lock. 你没有这把锁的钥匙。 The lock seems to be magical and rejects all picking attempts! 这把锁似乎很神奇,拒绝所有的撬锁尝试! The lock is definitely magical and forces your pick out! -锁绝对是神奇的,其迫使您必须撬锁! +锁绝对是神奇的,其迫使你必须撬锁! +The lock is divine. A mortal shouldn't even try to pick it. +锁是神圣的。一个凡人不应该试图去摘它。 +You must perform your quest! Don't even think of unlocking it... +你必须完成你的任务!否则就别想解锁…… +You're not sure a key for this even exists in the mortal realm. +你甚至不确定人间是否存在这把钥匙。 +The lock is made of solid rubber. You can't pick that. +锁由实心橡胶制成。你解不开它。 +You need something sharp to cut the lock. +你需要一些锋利的东西来切断锁。 The lock doesn't even have a keyhole to pick! 这锁甚至连钥匙孔都没有! +You need a special tool to pick this kind of lock. +你需要一个特殊的工具来撬开这种锁。 +The lock is technological and does not use a key. +这把锁是科技锁,不需要钥匙。 +The lock is brimming with security features and is nigh impossible to pick! +这把锁充满了安全特征,几乎不可能被撬开! + + +The lock is encased in magical crystals that block the keyhole. +锁被包裹在魔法结晶中,挡住了钥匙孔。 +Your distraction makes the crystals regrow immediately after breaking them off. +你的性奋使晶体在断裂后立即再生。 + + +The crystal fragments in the lock make it difficult to pick. +锁里的结晶碎片使得它很难撬开。 +You need a key to actually unlock the ex-crystallized lock. +你需要一把钥匙才能真正解锁结晶联锁 + + The key sticks in the lock and jams, mangling the key! -钥匙卡在锁里,卡住了,把钥匙弄坏了! +钥匙在锁里被卡住了,钥匙坏了! + + You unlock the TargetRestraint. -您解锁了 TargetRestraint。 +你成功解锁了 TargetRestraint。 You manage to squeeze out of the TargetRestraint! 你设法脱出了 TargetRestraint! You pick the lock on the TargetRestraint! -您正在撬铠 TargetRestraint 上的锁! -You pick the lock on the TargetRestraint! -您正在撬开 TargetRestraint 上的锁! +你正在尝试撬开 TargetRestraint 上的锁! You free yourself from the TargetRestraint! -您从 TargetRestrain 中逃脱了出来! +你从 TargetRestraint 中逃脱了出来! You damage the TargetRestraint enough to escape! 你对 TargetRestraint 造成了足够的损坏,并逃脱了出来! + + The TargetRestraint is destroyed by your attempts. TargetRestraint 在你的尝试中被破坏。 -You've reached the limits of your strength. Maybe it's loose enough to remove... -你已经达到了你的力量极限。也许它已经足够松了,可以直接移除了。。。 -The item is too tight. You'll need to loosen it somehow first... -拘束具太紧了。您需要先以某种方式使它松动一点.. -The item is to tight to get your tool into position. You'll have to first make it looser. -该拘束具太紧,使你难以让工具对上。你得先让它松一点。 -You can't quite get your pick into position. Maybe if you loosened the item first... -你不能正确地撬锁。也许假如你能让拘束具松动一点...... -You can't reach the lock. You'll have to loosen the item somehow first... -你够不着锁。您必须先以某种方式让它松动一点... +The TargetRestraint comes off before taking serious damage. +TargetRestraint 在受到严重伤害后脱落。 + + +This is as far as you can struggle. You'll have to remove the TargetRestraint some other way. +这是你能挣扎的极限了。你必须以其他方式挣脱 TargetRestraint。 +The item is too tight. You'll need to loosen the TargetRestraint somehow first... +这个物品太紧了。你需要以某种方式先让 TargetRestraint 松一松... +The item is to tight to get your tool into position. You'll have to first make the TargetRestraint looser. +你的工具因为这个物品太紧无法放到需要的位置。你必须先让 TargetRestraint 变得更宽松。 +You can't quite get your pick into position. Maybe if you loosened the TargetRestraint first... +你无法完全让你的撬锁器放到需要的位置。也许如果你先松一松 TargetRestraint... +The TargetRestraint's lock is tucked in securely under straps. You'll have to get it out from under there... +TargetRestraint 的锁牢牢地塞在带子下方。你必须把它先从下面拿出来...... + + +After many failed attempts to unlock the TargetRestraint, you realize this lock is more than you can handle. +经过多次尝试解锁TargetRestraint后,你意识到这个锁超出了你的能力范围。 + + +You can feel some ply but can't quite make any progress against the TargetRestraint... +你可以感觉到一些压力,但无法在 TargetRestraint 上取得任何进展...... +The TargetRestraint's mechanism lies barely out of reach... +TargetRestraint 的锁扣几乎遥不可及...... +Your tool leaves only a scratch against the TargetRestraint... +你的工具仅在 TargetRestraint 上留下划痕... +The lock on the TargetRestraint is just above your skill level... +TargetRestraint 上的锁刚好超出了你的技能水平... +The keyholes on the TargetRestraint are just barely out of reach... +TargetRestraint 上的锁孔几乎够不到...... + + You unlock the TargetRestraint and sigh with relief. 你解锁 TargetRestraint 并松了一口气。 You give out a huge moan as you squeeze out of the TargetRestraint! -当你脱出 TargetRestraint 时,你发出一声巨大的呻吟! -You pick the lock on the TargetRestraint with a sigh of relief! -您松了一口气,撬开了 TargetRestraint 上的锁! +你终于脱出 TargetRestraint ,不禁发出一声长长的呻吟! You pick the lock on the TargetRestraint with a sigh of relief! -您松了一口气,撬开了 TargetRestraint 上的锁! +你松了一口气,撬开了 TargetRestraint 上的锁! Trembling, you free yourself from the TargetRestraint! 你一边颤抖着一边将自己从 TargetRestraint 中解放出来! You damage the TargetRestraint enough to wiggle out! 你对 TargetRestraint 造成的损坏足以让你挣扎出来! -The item is too secure to struggle out. -该拘束具太牢固了,无法挣扎。 -You groan in frustration as you realize the item is too tight to escape. -您意识到这件物品太紧而无法逃脱。您沮丧地呻吟着。 -The item tightens itself as you try to squeeze out! -当您尝试挣扎脱出时,该拘束具会自动收紧! -You will need someone's help to squeeze out. -你需要有人帮助才能解脱出来。 -You pull and tug but something is keeping it in place. -你拉扯它,但有什么东西让它保持在原位。 -You groan and tug uselessly. Something is keeping it item strapped in place! -你无用地呻吟和拉扯。有东西将它固定在适当的位置! -You are too tightly bound to have a chance. -你被束缚得太紧,没有机会脱出。 -You shake and moan as you realize your struggles are futile. -你意识到你的挣扎是徒劳的。你开始颤抖和呻吟。 -You can't find a keyhole! -你找不到钥匙孔! -You sigh as you give up trying to find any kind of keyhole. -当你放弃寻找任何类型的钥匙孔时,你叹了口气。 -The item can't be unlocked without a special command! -没有特殊咒语无法解锁该物品! -You can't reach the keyhole by yourself! -你自己是够不到钥匙孔的! -You can't hold the key to unlock this with. -你不能拿着钥匙来解锁它。 -Your bound and shaking hands can't even hold the key. -你束缚住的颤抖的手甚至无法握住钥匙。 -You try, but something is keeping your hands away. -你尝试,但有些东西让你的手远离。 -You flail the key around uselessly but a strap is preventing you! -您无用地挥动钥匙,但皮带阻止了您! -This lock is beyond your skill level! -这把锁超出了你的撬锁技术! -You whimper as you realize the lock is far too secure. -您呜咽着,意识到锁过于安全了。 -There is no visible locking mechanism. -没有可见的锁定机制。 -You can't pick this by yourself, you'll need help. -你不能自己撬开这个锁,你需要帮助。 -You can't maneuver the lockpick well enough to unlock it. -你不能很好地操纵撬锁工具来解锁它。 -You let out a frustrated sigh as your quivering pick makes no progress. -你发出了一声沮丧的叹息,因为你颤抖着尝试了很久的撬锁缺毫无作用。 -You try to start picking, but the lock is secured by something else. -你试图开始撬锁,但锁由别的东西加固了。 -You whimper as you realize the lock is shielded by another strap. -你呜咽起来,因为你意识到锁被另一条带子遮挡住了。 -You wiggle uselessly. Maybe you need some kind of corner or edge... -你徒劳地扭动。也许你需要某种角落或边缘...... -You rub your body against the floor to no avail, and sigh. -你在地板上摩擦你的身体无济于事,叹了口气。 -You contort your body but you don't have leverage. Maybe you need some kind of tool... -你扭曲你的身体,但没有影响。也许你需要某种工具。。。 -You wiggle madly, trying to push against the restraint. You need more leverage... -你疯狂地扭动身体,试图反抗束缚。你需要更多的工具... -That doesn't seem to work. Maybe something else will. -这似乎不起作用。也许会有别的事情发生。 -You squirm helplessly against the furniture. Maybe something else will help more. -你无助地在附属品上蠕动。也许其他的东西会更有用。 -You twist your body trying to use the furniture, but it doesn't seem to work. Try something else. -你扭动身体试图使用附属品,但似乎不起作用。试试别的。 -You wiggle and squirm, trying to use the furniture to no avail. Try something else. -你扭动和蠕动,试图使用附属品但是没有任何作用。试试别的。 -You need something sharp to loosen the fasteners. -你需要一些锋利的东西来松开紧固件。 -This is not a job for your fingers right now. You need something sharp. -这不是你手现在需要的工作。你需要锋利的东西。 -There's no way to loosen it without some kind of sharp tool... -没有锋利的工具就无法松开它... -You sigh as the material resists all your attempts at breaking through. -你叹了口气,因为材料抵抗了你所有的突破尝试。 -You need some kind of corner for leverage. -你需要一些角落的工具。 -You flail about but cant get any leverage without an edge or corner. -你四处挥舞,但没有边缘或角落就无法获得任何工具。 -You need something rough to get the item loose. -你需要一些锋利的东西才能把这个东西弄松。 -You squirm against the smooth floor to no avail. Maybe if you had some kind of corner... -你在光滑的地板上扭动也没有用。也许如果你有一个角落... -You need some kind of tool to pull at the knots. -你需要某种工具来解开绳结。 -You struggle fruitlessly against the knots, but they're too tight. -你徒劳地尝试从绳结中挣脱,但绳结太紧了。 -You don't have any grip or hook to tug at your restraints with. -你没有任何东西可以来拉动你的拘束具。 -You cant tug at your restraints with them tightly wrapped against your body. -你不能用紧紧包裹在身体上的拘束具来拉扯。 -You need a way to stick the tool in place... -你需要一种方法来将工具固定到位... -Your trembling hands cant grip anything as they are. -你颤抖的手抓不住任何东西。 -You need something grippy... -你需要一些有力的东西... -You rub yourself against the floor to no avail. Maybe if you had something adhesive... -你把自己擦在地板上没有用。也许如果你有粘合剂。。。 -The fastenings are tightly secured! -扣子被牢固固定住了! -You roll around tryng to loosen the item to no avail. -你滚动试图松开拘束具但无济于事。 -The item tightens itself as you try to undo it! -当您尝试解开它时,它会自动收紧! -You can't reach it by yourself! -你自己是摸不到的! -You are too tightly bound to manipulate that item. -你被束缚得太紧,无法操作那个扣子。 -Your futile struggles do nothing to loosen the fasteners. -你徒劳的挣扎无助于松开。 -You try to undo the fasteners, but they are blocked by other straps! -您试图解开紧扣子,但它们被其他带子挡住了! -You rub your body uselessly as you find another strap securing the item. -当你发现另一条固定物品的带子时,你无用地摩擦你的身体。 -The item is too durable to cut. -该物品太坚韧而无法切割。 -Your hopeless attempts fail to even leave a scratch. -你绝望的尝试甚至没有留下划痕。 -You fail to leave even a scratch! -你连划痕都留不下! -You can't get any leverage to cut it with... -你无法获得任何手段来切断它...... -You can't hold a knife, let alone cut the thing. -你连刀都拿不住,更不用说切东西了。 -You cry out in your bindings as the knife bounces around uselessly. -你不断地抱怨着,因为刀毫无作用地被弹开了。 -Your arms are kept from having leverage due to another item. -由于另一个拘束具,你的手臂没法起到作用。 -You fiddle with the tool, but your arms lack leverage due to another item -您摆弄工具,但由于另一个拘束具,您的手臂无法发挥作用。 -You pry at the hands... -你在用手撬动... -You moan as the hands squeeze you tightly... -你呻吟着,双手紧紧地握着你…… -There's no way they are just letting go! -他们不可能只是放手! -You whimper as you realize the hands won't let go no matter what... -当你意识到手无论如何都不会放开时,你呜咽着…… -You hear dark laughter as you realize the hands won't let go... -当你意识到双手不会放开时,你听到了黑暗的笑声…… -You hear a dark giggle as fruitlessly try to wiggle free! -当徒劳地试图自由摆动时,你会听到黑暗的咯咯笑声! -You try to pull away! -你试图扯开! -You blush and try to escape the hands' grip! -你脸红了,试图逃脱双手的控制! -Their grip is too strong... -他们的抓地力太强了…… -Their grip is too strong... it's hopeless. -他们的抓地力太强了……没救了。 -You're bound too tight to have a chance. -你太紧了,没有机会。 -You whimper as you realize you're too tightly bound to have a chance. -当你意识到你被束缚得太紧而没有机会时,你呜咽起来。 -You work to unlace the corset... -你努力解开束身衣... -You hurriedly try to unlace the corset... -你急忙试着解开束身衣…… -The corset has no laces to loosen! -束身衣没有可以松开的带子! -You sigh as you can't find any laces to loosen. -你叹了口气,因为你找不到任何可以松开的带子。 -The laces are tied tight! -带子系得很紧! -You hopelessly try to untie the lacing but it's just too tight! -你绝望地试图解开带子,但它太紧了! -You grasp at the slime, trying to peel it off... -你抓着粘液,试图将其剥去... -You wiggle madly as you try to peel off the slime! -你疯狂地蠕动试图摆脱史莱姆! -The slime reforms as you scoop it away! -当您将其铲去时,史莱姆变成皮革了! -You can't get the slime off at all! -您根本无法摆脱史莱姆! -The slime is too fast at reforming! -史莱姆太快变成皮革了! -The slime reforms too quickly as you try to squirm it off... -当您试图蠕动时,史莱姆变化得更快了... -You start peeling off the wrapping... -你开始剥掉外衣... -You scratch at the wrapping furiously... -你愤怒地抓着外衣…… -The material clings to your skin too tightly! -材料紧贴在你的皮肤上! -You groan in frustration as you try to peel it off but realize it's too sticky. -当你试图把它剥下来时,你沮丧地呻吟着,意识到它太粘了。 -You can't grip the edges to peel it off! -你不能抓住边缘剥掉它! -You make a futile attempt to rub it off. -你徒劳地试图揉捏它。 -You try to wiggle off the chains... -你试着挣脱锁链... -You squirm trying to get the chains to fall off... -你扭动着试图让锁链脱落…… -The chains are magical and wrap themselves back around you of their own accord. -锁链很神奇,会自动缠绕在你身上。 -The chains squeeze you tighter as you try to shake them off. -当您试图摆脱它们时,链条将您压迫得更紧。 -The chains have you bound hopelessly tight! -锁链把你绑得紧紧的! -You sigh and moan as the chains aren't getting any looser. -你叹息和呻吟,因为锁链没有松动。 -You try to untie the ropes... -你试着解开绳索... -You contort yourself trying to reach the knots... -你扭曲自己试图摸到绳结... -The knot ties itself back again as soon as you get it loose! -一旦你松开它,绳结就会重新系起来! -The knots tighten themselves as soon as you reach them, keeping you tight and secure. -一旦你到达它们,绳结就会收紧,保持紧绷和牢固。 -You can't reach the knots! -你无法摸到绳结! -Your squirming is in vain as you can't even reach the knots. -你的扭动是徒劳的,因为你连绳结都摸不到。 -You try to pull off the clamps... -你试着拔掉夹子... -You tug on your clamps trying to get them off! -你拉着你的夹子试图把它们弄下来! + + +You stick the knife into a crack in the wall! +你把刀插进墙上的裂缝里! +You use your feet to place the knife into a crack! +你用脚将刀放入裂缝中! +You glare at the crack in the wall as you realize you couldn't maneuver the knife if you tried. +你瞪着墙上的裂缝,意识到即使你尝试再多次也无法操纵这把刀。 +You can't hold your knife like this... +你不能这样握刀... + + +The TargetRestraint is too secure to struggle out. +TargetRestraint 安全性太高了,无法挣脱。 +You groan in frustration as you realize the TargetRestraint is too tight to escape. +你意识到 TargetRestraint 太紧而无法挣脱,你沮丧地呻吟着。 +The TargetRestraint tightens itself as you try to squeeze out! +TargetRestraint 会在你尝试挣脱时自动收紧! +You will need someone's help to squeeze out of the TargetRestraint. +你需要有人的帮助才能挣脱 TargetRestraint。 +The TargetRestraint flashes magically as the Goddess' curse resists your efforts! +TargetRestraint 闪烁着奇异的光芒,它在女神诅咒加持下无情地抵消你的挣脱! +The TargetRestraint holds firm against your attempts, held back by your restrictions. +TargetRestraint坚定地阻止你的尝试,因为你的束缚阻碍了你。 +You pull and tug but your other restraints keep the TargetRestraint securely in place! +你又拉又拽,但你的其他拘束具将 TargetRestraint 牢牢地固定在适当的位置! +You groan and tug but nothing budges on the TargetRestraint. You're bound too tightly by something else. +你呻吟着,用力拉扯,但 TargetRestraint 上一点动静也没有。 你被其他东西束缚得太紧了。 +You are too tightly bound to have a chance against the TargetRestraint. +你被束缚得太紧了,没有机会尝试挣脱 TargetRestraint。 +You shake and moan as you realize your struggles against the TargetRestraint are futile. +你意识到对 TargetRestraint 的挣扎是徒劳的,你开始害怕地颤抖和呻吟。 +You can't find a keyhole on the TargetRestraint! +你在 TargetRestraint 上找不到锁孔! +You sigh as you give up trying to find any kind of keyhole on the TargetRestraint. +你叹了口气,最终放弃在 TargetRestraint 上寻找任何类型的锁孔。 +The TargetRestraint can't be unlocked without a special command! +如果没有特殊命令就无法解锁 TargetRestraint ! +You can't reach the keyhole on the TargetRestraint by yourself! +你自己够不到 TargetRestraint 上的锁孔! +You can't hold the key to unlock the TargetRestraint with. +你无法拿起钥匙来解锁 TargetRestraint。 +Your bound and shaking hands can't even hold the key for the TargetRestraint. +你被束缚的双手颤抖着,甚至拿不住 TargetRestraint 的钥匙。 +The goddess punishes you for trying to unlock the TargetRestraint! +女神会因为你试图解锁 TargetRestraint 而惩罚你! +You are too restricted to get the key into place! +你受太多束缚了,无法把钥匙插进去! +You try, but something is keeping your hands away from the TargetRestraint. +你尝试这么做,但有一股神秘力量让你的手无法靠近 TargetRestraint。 +You flail the key around uselessly but a strap is preventing you from unlocking the TargetRestraint! +你徒劳地挥动钥匙,但一条带子阻止你解锁 TargetRestraint! +This lock on the TargetRestraint is beyond your skill level! +TargetRestraint 上的锁超出了你的技能水平! +You whimper as you realize the lock on the TargetRestraint is far too secure. +当你意识到 TargetRestraint 上的锁安全性太高时,你呜咽起来。 +There is no visible locking mechanism on the TargetRestraint. +TargetRestraint 上没有可见的锁扣。 +You can't pick the TargetRestraint by yourself, you'll need help. +你自己解不开 TargetRestraint,你需要帮助。 +You can't maneuver the lockpick well enough to unlock the TargetRestraint. +你无法很好地操纵撬锁器来解锁 TargetRestraint。 +You let out a frustrated sigh as your quivering pick makes no progress on the TargetRestraint. +当你颤抖的尝试撬开 TargetRestraint 时没有进展时,你发出了沮丧的叹息。 +You try to start picking, but the lock on the TargetRestraint is secured by something else. +你尝试开始撬锁,但 TargetRestraint 上的锁已被其他东西保护。 +You whimper as you realize the lock on the TargetRestraint is shielded by another strap. +当你意识到 TargetRestraint 上的锁被另一条带子挡住时,你呜咽起来。 +You are distracted from the TargetRestraint by mental images of yourself remaining in bondage... +你的注意力会被自己仍处于束缚状态的心理所分散,无法关注 TargetRestraint…… +Your restrictions ruin your dexterity. You can't pick the TargetRestraint. +你的拘束毁了你的灵巧。您不能拆下 TargetRestraint。 + + +You wiggle uselessly in the TargetRestraint. Maybe you need some kind of tool... +你在 TargetRestraint 中无用地摆动。 也许你需要某种工具...... +You rub your body against the floor to no avail, and sigh as the TargetRestraint stays secure. +你用身体在地板上摩擦,但没有效果,当 TargetRestraint 保持安全时,你叹了口气。 +You contort your body but you don't have leverage on the TargetRestraint. Maybe you need some kind of tool... +你扭曲着身体,但对 TargetRestraint 无任何效果。 也许你需要某种工具...... +You struggle madly, trying to push against the TargetRestraint. You need more leverage... +你疯狂地挣扎,试图从 TargetRestraint 抽出。你需要更多的外力作用... + + +That doesn't seem to work. Maybe something else will help with the TargetRestraint. +这似乎不起作用。 也许其他东西会对解开 TargetRestraint 有所帮助。 +You squirm helplessly against the furniture. Maybe something else will help with the TargetRestraint. +你无助地靠在家具上蠕动。也许其他东西会对解开 TargetRestraint 有所帮助。 +You twist your body trying to use the furniture, but it doesn't seem to work. The TargetRestraint remains tight. +你扭动着身体试图使用家具,但似乎不起作用。 TargetRestraint 仍然很紧。 +You wiggle and squirm, trying to use the furniture to no avail. The TargetRestraint remains tight. +你扭动身体,试图使用家具,但无济于事。 TargetRestraint 仍然很紧。 + + +You need something sharper to get at the TargetRestraint. +你需要更锋利的东西切开 TargetRestraint。 +This is not a job for your trembling fingers right now. +你现在颤抖的手指无法胜任这个工作。 +Tugging on the TargetRestraint is useless. Maybe if you had something sharp... +拉扯 TargetRestraint 是没有用的。也许如果你有锋利的东西... +You sigh as the TargetRestraint resists all your attempts at breaking through. +你叹了口气, TargetRestraint 抵御了你所有的挣脱尝试。 + + +You fidget with the TargetRestraint but can't reach the clasps without some kind of edge. +你很想挣脱 TargetRestraint ,但如果不借助某种边沿你就无法够到扣子。 +You flail about but your hands are unable to reach the TargetRestraint. +你尝试挥动双手去够它,但够不到 TargetRestraint。 +You can't reach the clasps on the TargetRestraint. If only you had some other way... +你够不到 TargetRestraint 的扣子。如果有其他办法就好了…… +You squirm around, rubbing the TargetRestraint against the smooth floor to no avail... +你扭动身体,在光滑的地板上摩擦着 TargetRestraint,但无济于事...... + + +The knots on the TargetRestraint are too tight to pull apart without a hook. +TargetRestraint 上的结太紧,如果没有钩子你拉不开它。 +You struggle fruitlessly against the knots on the TargetRestraint, but they're too tight. +你想挣脱 TargetRestraint 的绳结,但这是徒劳的,它们太紧了。 +The TargetRestraint is too tight against your body. You'll need more leverage to pull it off. +TargetRestraint 在你的身体上太紧了。你需要更多的外力作用才能成功。 +You shake yourself around trying to rub off the TargetRestraint, but it's hopeless. +你摇晃身体试图摆脱 TargetRestraint,但这是没有希望的。 + + +You need more grip to peel off the TargetRestraint... +你需要更多的抓力才能挣脱 TargetRestraint... +Your trembling hands cant grip anything as they are, let alone undo the TargetRestraint. +你颤抖的双手根本抓不住任何东西,更不用说挣脱 TargetRestraint 了。 +You rub yourself against the floor to no avail... +你在地板上蹭了蹭,但无济于事…… + + +The fastenings are too tight and secure on the TargetRestraint! +TargetRestraint 上的锁扣过于紧固! +You roll around tryng to loosen the TargetRestraint to no avail. +你翻滚着试图松开 TargetRestraint,但无济于事。 +The TargetRestraint tightens itself as you try to undo it! +当你尝试挣脱 TargetRestraint 时,它会自行收紧! +You can't reach the TargetRestraint by yourself! +你自己无法触碰 TargetRestraint! +You are too tightly bound to manipulate the TargetRestraint. +你被束缚得太紧而无法控制 TargetRestraint。 +Your futile struggles do nothing to loosen the fasteners on the TargetRestraint. +你的挣扎对于松开 TargetRestraint 上的锁扣毫无作用。 +You try to undo the fasteners on the TargetRestraint, but they are blocked by other straps! +你尝试松开 TargetRestraint 上的锁扣,但它们被其他带子挡住了! +You rub your body uselessly as you find another strap securing the TargetRestraint. +你摩擦自己的身体试图挣脱,但当你发现另一条固定 TargetRestraint 的带子时,你意识到之前所有努力都是徒劳。 +You feel the Goddess' hand keeping the TargetRestraint tightly secured! +你会感觉到女神的手紧紧地抓住了 TargetRestraint! +The TargetRestraint is too well-secured to take off with your level of restriction. +TargetRestraint 的安全性太强,无法在你的当前束缚等级下取下。 +The TargetRestraint is too durable to cut. +TargetRestraint 耐久太高,无法切割。 +Your hopeless attempts fail to even leave a scratch on the TargetRestraint. +你无望的尝试甚至未能在 TargetRestraint 上留下任何划痕。 +You fail to leave even a scratch on the TargetRestraint! +你甚至无法在 TargetRestraint 上留下任何划痕! +You can't get any leverage to cut the TargetRestraint with... +你无法获得任何外力作用来减少 TargetRestraint 的束缚程度... +You can't hold the knife firmly enough to cut the TargetRestraint. +你无法用足够牢固的刀来切割 TargetRestraint。 +You cry out in your bindings as the knife bounces against the TargetRestraint uselessly. +刀徒劳地在 TargetRestraint 上弹开,你在束缚中无奈大喊。 +Your arms are kept from having leverage on the TargetRestraint due to another item. +由于其他物品,你的手臂无法对 TargetRestraint 施加外力作用。 +You fiddle with the tool, but your arms lack leverage on the TargetRestraint due to another item +你摆弄着工具,但由于另一个项目,你的手臂缺乏对 TargetRestraint 的外力作用 +Your restrictions limit your cutting power, unable to hurt the TargetRestraint. +你的束缚限制了你的切割能力,无法伤害 TargetRestraint。 + + +You pry at the TargetRestraint... +你撬动 TargetRestraint... +You moan as the TargetRestraint squeeze you tightly... +当 TargetRestraint 紧紧地挤压你时,你呻吟着...... +There's no way the TargetRestraint are just letting go! +TargetRestraint 不可能就这样解开! +You whimper as you realize the TargetRestraint won't let go no matter what... +当你意识到 TargetRestraint 无论如何都无法解开时,你呜咽起来…… +You hear dark laughter as you realize the TargetRestraint won't let go... +当你意识到 TargetRestraint 无论如何都无法解开时,你听到了阴暗的笑声...... +You hear a dark giggle as fruitlessly try to wiggle free from the TargetRestraint! +当你徒劳地尝试挣脱 TargetRestraint 时,你听到一声阴暗的咯咯笑声! + + +You try to pull away from the TargetRestraint! +你尝试挣脱 TargetRestraint! +You blush and try to escape the TargetRestraint's grip! +你脸红了,试图挣脱 TargetRestraint 的束缚! +The TargetRestraint's grip is too strong... +TargetRestraint 的抓力太强了…… +The TargetRestraint's grip is too strong... it's hopeless. +TargetRestraint 的抓力太强了……毫无希望。 +You're bound too tight to have a chance at shaking off the TargetRestraint. +你被束缚得太紧了,没有机会挣脱 TargetRestraint。 +You whimper as you give up struggling against the TargetRestraint. +当你放弃从 TargetRestraint 挣脱时,你呜咽着。 + + +You wiggle around trying to get the TargetRestraint out... +你扭动身体试图将 TargetRestraint 取出来…… +You squirm around trying to dislodge the TargetRestraint... +你扭动着试图摆脱 TargetRestraint...... +The TargetRestraint is in too deeply, it won't come out. +TargetRestraint 陷得太深,出不来。 +You feel the TargetRestraint slide around inside but it won't come out! +你感觉 TargetRestraint 在里面滑动,但它出不来! +Your bondage keeps the TargetRestraint firmly in place. +你的束缚将 TargetRestraint 牢牢固定在适当的位置。 +Your struggling does nothing but shift the TargetRestraint's position inside of you. +你的挣扎只会改变 TargetRestraint 在你体内的位置。 + + +The TargetRestraint won't come out. +TargetRestraint 不会出来。 +You feel the TargetRestraint slide around but it won't come out! +你感觉 TargetRestraint 四处滑动,但它却出不来! +Your bondage keeps the TargetRestraint secure in place. +你的束缚使 TargetRestraint 固定在适当的位置。 +Your struggling does nothing to dislodge the TargetRestraint. +你的挣扎并不能摆脱 TargetRestraint。 + + +You work to unlace the TargetRestraint... +你努力解开 TargetRestraint... +You hurriedly try to unlace the TargetRestraint... +你匆忙地试图解开 TargetRestraint... +The TargetRestraint has no laces to loosen! +TargetRestraint 没有需要松开的带子! +You sigh as you can't find any laces to loosen on the TargetRestraint. +你叹了口气,因为在 TargetRestraint 上找不到任何可以松开的带子。 +The laces of the TargetRestraint are tied tight! +TargetRestraint 的带子已系紧! +You hopelessly try to untie the lacing on the TargetRestraint, but it's just too tight! +你绝望地尝试解开 TargetRestraint 上的带子,但它太紧了! + + +You grasp at the TargetRestraint, trying to peel it off... +你抓住 TargetRestraint,试图将其剥离...... +You wiggle madly as you try to peel off the TargetRestraint! +当你试图剥离 TargetRestraint 时,你疯狂地扭动! +The TargetRestraint reforms as you scoop it away! +TargetRestraint 在你尝试剥离它的时候发生了变化! +You can't get the TargetRestraint off at all! +你根本无法让 TargetRestraint 停下来! +The TargetRestraint is too fast at reforming! +TargetRestraint 改变的速度太快了! +The TargetRestraint reforms too quickly as you try to squirm it off... +当你试图将其扭开时,TargetRestraint 的改变速度加快了...... + + +You grasp around, looking for a seam on the TargetRestraint... +你四处抓握,寻找 TargetRestraint 上的接缝。 +You wiggle and squirm, looking for something to pull at on the TargetRestraint... +你扭动着身体,寻找可以拉动 TargetRestraint 的东西…… +The TargetRestraint encases you in a solid layer! +TargetRestraint 将你包裹在坚固的固体层中! +Try as you might, the TargetRestraint hugs you completely without any seams! +无论你如何尝试,TargetRestraint 都会完全包裹住你,没有任何接缝! +The TargetRestraint is too tight to get any traction... +TargetRestraint 太紧,无法获得任何牵引力...... +The TargetRestraint squeezes your body too tightly to get any sort of ply... +TargetRestraint 将你的身体挤压得太紧,无法获得任何拘束具层数... + + +You start peeling off the TargetRestraint... +你开始剥离 TargetRestraint... +You scratch at the TargetRestraint furiously... +你疯狂地抓挠 TargetRestraint... +The TargetRestraint clings to your skin too tightly! +TargetRestraint 与你的皮肤贴得太紧! +You groan in frustration as you try to peel the TargetRestraint off but realize it's too sticky. +当你尝试剥离 TargetRestraint 时,你沮丧地呻吟着,因为它太粘了。 +You can't grip the edges to peel the TargetRestraint off! +你无法抓住边缘来剥离 TargetRestraint! +You make a futile attempt to rub the TargetRestraint off. +你徒劳地尝试摩擦掉 TargetRestraint。 + + +You try to wiggle off the TargetRestraint... +你尝试挣脱 TargetRestraint... +You squirm trying to get the TargetRestraint to fall off... +你蠕动着试图让 TargetRestraint 掉落...... +The TargetRestraint are magical and wrap themselves back around you of their own accord. +TargetRestraint 非常神奇,它们会自动将你包裹起来。 +The TargetRestraint squeeze you tighter as you try to shake them off. +当你试图挣脱它们时,TargetRestraint 将你挤压得更紧。 +The TargetRestraint have you bound hopelessly tight! +TargetRestraint 将你牢牢地束缚住! +You sigh and moan as the TargetRestraint aren't getting any looser. +当 TargetRestraint 没有松开一点时,你叹了口气并呻吟道。 + + + + +You look around for a fastener on the TargetRestraint... +你正在四处寻找 TargetRestraint 上的锁扣…… +Shivering, you look for a fastener on the TargetRestraint... +你瑟瑟发抖,在 TargetRestraint 上寻找锁扣…… +The TargetRestraint has no fastener!!! +TargetRestraint 上没有锁扣! +The TargetRestraint is sealed around your body, with no fasteners to speak of! +TargetRestraint 密封在你的身体周围,无需任何锁扣! +The TargetRestraint is firmly sealed around your body. +TargetRestraint 牢牢地密封在你的身体周围。 +You are sealed in ice. There is no escape. +你被封印在冰中。跑不了的。 + + +You try to untie the TargetRestraint... +你尝试解开 TargetRestraint... +You contort yourself trying to reach the knots on the TargetRestraint... +你扭曲自己试图触及 TargetRestraint 上的绳结... +The TargetRestraint's knot ties itself back again as soon as you get it loose! +一旦松开,TargetRestraint 的绳结就会自动重新打结! +The knots tighten themselves as soon as you reach them, keeping you trapped in the TargetRestraint. +一旦你碰到它们,绳结就会收紧,让你被困在 TargetRestraint 中。 +You can't reach the knots on the TargetRestraint! +你无法碰到 TargetRestraint 上的绳结! +Your squirming is in vain as you can't even reach the knots on the TargetRestraint. +你的蠕动是徒劳的,因为你甚至无法碰到 TargetRestraint 上的绳结。 + + +You try to pull off the TargetRestraint... +你尝试挣脱 TargetRestraint... +You tug on your TargetRestraint trying to get them off! +你拉动 TargetRestraint 试图将它们脱下来! That would really hurt... 那真的会很痛... You realize that would really hurt... 你知道那真的很痛... -The clamps tug on your nipples as you squirm! -当你蠕动时,夹子会拉扯你的乳头! -The clamps tug on your nipples as you squirm! -当你蠕动时,夹子会拉扯你的乳头! +The TargetRestraint tug on your nipples as you squirm! +你蠕动时,TargetRestraint 会强行拉动你的乳头! + + + + +You paw at the TargetRestraint from inside, hoping to find an opening... +你从里面摸索 TargetRestraint,希望找到一个开口…… +You flail around inside the TargetRestraint... +你在 TargetRestraint 里面挥舞着…… +The TargetRestraint is completely seamless! +TargetRestraint 完全无缝! +The TargetRestraint is completely seamless! This is hopeless. +TargetRestraint 完全无缝!这是没有希望的。 +You are too weak to poke your hand through the TargetRestraint... +你太虚弱了,无法将手伸进 TargetRestraint…… + + +You stretch yourself out inside the TargetRestraint! +你在 TargetRestraint 里面舒展身体! +You bounce around inside the TargetRestraint! +你在 TargetRestraint 里面蹦蹦跳跳! +The TargetRestraint stretches to accomodate your movements... +TargetRestraint 会伸展以适应你的动作...... +The TargetRestraint tips slightly as you squirm around... +当你扭动身体时,TargetRestraint 会稍微倾斜…… +You are too weak to make even a small dent in the TargetRestraint... +你太弱了,甚至无法对 TargetRestraint 造成一点伤害…… +The TargetRestraint is unyielding despite your attempts... +尽管你做出了各种尝试,但 TargetRestraint 依然没有屈服...... + + +You try to puncture the TargetRestraint... +你尝试刺穿 TargetRestraint…… +You poke around at the TargetRestraint... +你在 TargetRestraint 周围探索…… +The TargetRestraint is too durable to pop... +TargetRestraint 太耐用了,不会破…… +The TargetRestraint is too strong despite your best efforts... +尽管你尽了最大努力,但 TargetRestraint 仍然太强了…… +You can't quite get enough force to pop the TargetRestraint... +你无法获得足够的力量来扎破 TargetRestraint... +Your attempts to pop the TargetRestraint are futile due to your restraints... +由于你的束缚,你试图扎破 TargetRestraint 的尝试是徒劳的...... + + The chest is too smooth to help. Maybe if you opened it? -表面太光滑了。也许你可以打开它? +箱子表面太光滑了。也许你可以打开它? + + Lockable 可上锁 Non-Lockable 不可上锁 + + Unlocked -解锁的 -Lock Type: -锁类型: -Red -红色的 +已解锁 +Lock: +锁 :‎ Simple -简单的 -Green -绿色 -Blue -蓝色 -Purple -紫色 -Gold -金色 -Gold -金币 -Yellow -黄色 -Red Lock -红锁 +简单 +Standard +标准 +Secure +安全 +Disc +圆盘 +Rubber +橡胶 +Crystal +结晶 +Runic +符文 +Magic +魔法 +Cyber +赛博 +Integrated Cyber +赛博 ( 集成 ) +Advanced Cyber +赛博 ( 先进 ) +Ancient +古代 Simple Lock 简易锁 -Green Lock -绿锁 -Blue Lock -蓝锁 -Purple Lock -紫锁 -Yellow Lock -黄锁 -(G) -(G) -(S) -(S) -(B) -(乙) -(G) -(G) -(P) -(P) -(?) -(?) -(Y) -(Y) -You can't drink that while gagged! -堵嘴的时候不能喝掉它! +Standard Lock +标准锁 +Secure Lock +安全锁 +Disc Lock +圆盘锁 +Rubber Lock +橡胶锁 +Divine Lock +神圣锁 +Crystal Lock +结晶锁 +Runic Lock +符文锁 +Magic Lock +魔法锁 +Cyber Lock +赛博锁 +Integrated Cyber Lock +赛博锁 ( 集成 ) +Advanced Cyber Lock +赛博锁 ( 先进 ) + + +You can't use that while gagged! +你不能在嘴被堵住的时候使用它! You can't use that without your fingers! -没有你的手指你不能使用它! +你不能在无法使用手指的时候使用它! You struggle against your bindings but it's too strict!. -你与你的拘束作斗争,但它太严苛了! +你在你的拘束具中挣扎,但它太严密了! You drop the pick due to your bound hands! -由于您的双手被束缚,您放弃了撬锁! +由于你的双手被束缚,你放弃了撬锁! You drop your knife due to your bound hands! -刀从你缚住的手中掉了出去! +刀从你被缚住的手中掉了出去! You drop the precious knife due to your bound hands! -珍贵的刀从你缚住的手中掉了出去! +珍贵的刀从你被缚住的手中掉了出去! You drop the key due to your bound hands! -钥匙从你缚住的手中掉了出去! +钥匙从你被缚住的手中掉了出去! You drop the magic key due to your bound hands! -魔法钥匙从你缚住的手中掉了出去! -You drop the magic key due to your bound hands! -魔法钥匙刀从你缚住的手中掉了出去! -Logbook -日志 -Logbook (N) -日志 (N) +魔法钥匙从你被缚住的手中掉了出去! +You insert the card the wrong way and the reader ejects it onto the floor! +你将卡插错了方向,阅读器把它弹到了地上! + + +Journal (N) +日记 (N) Passing... 通过中... -Pass NPCs -通过 NPC Closing... 关门中... Close door 关门 -Close Door -关门 Sprinting!!! 疾跑中!!! Sprint! @@ -2966,24 +6264,58 @@ Hopping!!! 跳跃中!!! Hop! 跳跃! +You run! +你正在跑! +You hop desperately! +你正在拼命地跳! +Close Door +关门 Unlock 开锁 Command 命令 -You utter a command word and release the door! -你说出一个命令然后释放门! -You mumble a command word but the door opens! -你咕哝了一个命令,但门打开了! -You mumble a command word, but the lock on the door stays put! -你咕哝着一个命令词,但门上的锁没动! +You utter a command word and release the lock! +你说出命令词并释放锁! +You mutter an unintelligible command word and your locks do not open. +你咕哝着一个难以理解的命令词,但你的锁却打不开。 +You mumble a command word but the lock opens! +你咕哝了一个命令,但锁打开了! +You mess up saying the command word. The lock stays put! +你说命令词时搞砸了。锁纹丝不动! +Swipe Keycard +刷卡 +You swipe your keycard and the lock releases with a hiss! +你刷了一下钥匙卡,门锁发出了 “嘶嘶 ”声! +You swipe your keycard and the lock beeps 'Access Denied'! +你刷了一下钥匙卡,门锁发出 “拒绝访问 ”的提示音! +You don't have any card to scan in the slot. +你没有任何卡可以扫描。 +Use Retinal Scanner +使用视网膜扫描仪 +You scan your eye pattern and the lock releases with a hiss! +门锁扫描了你的眼睛图案,发出 “嘶嘶 ”声! +The lock rejects you, citing your lack of authority. +门锁以你没有权限为由拒绝了你。 +You are blindfolded, so the scanner can't even see your eye! +你被蒙住了眼睛,所以扫描仪根本看不到你的眼睛! +Hack +黑入 +You bypass the lock's cyber defenses and release it with a hiss! +你绕过了锁的网络防御系统,在 “嘶嘶 ”声中打开了锁! +The lock beeps as its security blocks your attempts at release. +锁发出哔哔声,因为它的安全系统阻止了你的释放尝试。 +You have no way to hack the locking system. +你无法黑进锁的系统。 Pick 撬锁 (No way to open) -(没办法打开) +( 没办法打开 ) (She cannot help you) -(她帮不了你) +( 她帮不了你 ) Offer XXXg 上供 XXXg +Offer +提供 You do not have enough for a proper offering. 你没有足够的钱来提供正确的供品。 The goddess removes some of your restraints! @@ -2991,29 +6323,37 @@ The goddess removes some of your restraints! The goddess restores your mental and physical state! 女神恢复你的身心状态! The goddess teaches you the secrets of SCHOOL. (+1 level) -女神教你 SCHOOL 的秘密。 (+1 级) -The goddess of SCHOOL appreciates your offering. -SCHOOL 女神感谢您的奉献。 +女神教你 SCHOOL 的秘密。 ( +1 级 ) +The goddess of SCHOOL grants you destructive spellcasting! +SCHOOL 女神赋予你毁灭性的施法能力! +The goddess of SCHOOL grants you invisibility on attacks! +SCHOOL 女神让你在受到攻击时隐形! +The goddess of SCHOOL grants you protection and retaliation! +SCHOOL 女神给予你保护和报复! You leave the coins on the altar and they transform into a ItemBought! 你把硬币留在祭坛上,它们变成了一个 ItemBought! object 目标 + + It appears to be a receptacle for an ancient crystal. 它似乎是一个古老水晶的容器。 It's a pile of slag emitting a strange magic smoke... 那是一堆散发着奇异魔气的炉渣…… -That object is locked -目标已上锁 -A shrine to the goddess of TYPE. A pool of mana glimmers below. -TYPE 女神的神泉。一池法力在下方闪烁。 +That object is locked with a LKTP. +目标被 LKTP 上锁。 A shrine to the goddess of TYPE. TYPE 女神的神泉。 That door is open. Do you want to close it? 那扇门是开着的。你想关闭它吗? You slam the door and jam it shut! 你砰的一声关上门! +Passion +激情 +Frustration +懊恼 Submissiveness -顺从度 +顺从级别 Security Level 安全级别 Undead @@ -3037,13 +6377,57 @@ Illusions Commerce 商业 Shrine of SHRINETYPE -SHRINETYPE神泉 -Allies: -盟友: -Enemies: -敌人: +SHRINETYPE 神泉 +Tablet of +的碑 + + +Goddess: +女神 : ‎ +Goddess Blessing: +女神祝福 : ‎ +Goddess Curse: +女神诅咒 : ‎ +Mana Bonus: +法力值加成 : ‎ +Lack of Mana Penalty: +缺乏法力惩罚 : ‎ +Your excess mana helps you suppress the enchantment! +你多余的法力可以帮助你抵抗附魔! +Your mana is too weak to fight the magical enchantment... +你的法力太弱,无法对抗魔法附魔。。。 + + +Curses +诅咒 + + +A tablet inscribed with runes of TYPE. +刻有 TYPE 符文的石碑。 +SHRINETYPE Tablet +SHRINETYPE 石碑 +Decypher +解密 +You read the runes and they fill you with power! +你阅读符文,它们就会让你充满力量! +These runes are meant for someone with less willpower. +这些符文是为意志力较弱的人准备的。 +You try to read the runes but cannot understand them. +你尝试阅读符文,但无法理解它们。 + + +Allies: +盟友 : ‎ +Enemies: +敌人 : ‎ +Favorable: +好感度 : ‎ + + +None +无 Nevermere Trainers -Nevermere 训练师 +“奈文米尔”训练师 DressUp Co. 装扮公司 Bounty Hunters Guild @@ -3052,8 +6436,6 @@ Bandits 盗贼 Constructs 结构体 -Witches' Coven -女巫集会 School of Magic 魔法学校 Old Guardians @@ -3061,267 +6443,611 @@ Old Guardians Cult of the Wild 自然教会 Cult of Bast -Bast教会 +猫女神教会 Alchemists 炼金术士 Elementals -元素 +精灵 Dragonheart Order 龙心教团 MaidForce 女仆势力 Fungal Kingdom 真菌王国 -Wanted -通缉犯 -Delinquent -违法者 Nature 自然界 + + +Witches' Coven +女巫集会 +Love Crafters +爱之匠 +Velvet Pact +天鹅绒公约 +Knights Errant +流浪骑士 +Scavengers +拾荒者 +Fae Tricksters +恶作剧者 +Zora's Crew +Zora的船员 + + +Rope Dojo +绳道场 +Doll Shoppe +玩偶商店 +Fuuka's Shrine +风香(Fuuka)的神龛 +The Collectors +收藏家 +Dollmaker Inc. +玩偶制造有限公司 + + +Adventurer +冒险家 +Cursed Spirit +诅咒之灵 +Delinquent +违法者 +Computer Virus +电脑病毒 +Extraplanar Entity +外域实体 +Dubious Witch +可疑的女巫 +Shadow Clan +暗影族 +Illegal Poacher +非法偷猎者 +Very Angry +很生气 Surprise! 惊喜! +Fierce Debater +激烈的辩手 + + Angels 天使 Demons 恶魔 + + You sense that the chest contains a trap and a lot of gold. 你感觉到箱子里有一个陷阱和很多金币。 You sense that the chest is safe to open. 你感觉到箱子可以安全打开。 + + Drink 喝 Bottle 瓶子 +You have no restraints to 'offer' to the goddess. +你可以毫无限制地向女神“献祭”。 +This shrine's mana pool is empty. +该神泉的魔法池已空。 +You drink from the pool and and absorb its energies. +你饮用池中的水并吸收池中的能量。 +You absorb the pool's energies through your face. +你通过脸部吸收泉水的能量。 +You collect what mana you can in a bottle. +你可以在瓶子里收集尽可能多的法力。 You drink from the pool and your mana is restored. 你从池子里喝下泉水,你的法力就会恢复。 You drink again, but you feel as if you are trespassing. 你再次喝下泉水,但你觉得你好像在冒犯。 You drink again, knowing the risk this may entail... -你又喝了,知道这可能带来风险...... +你又喝了一次,知道这可能带来风险...... You have angered the goddess of TYPE!!! 你惹怒了TYPE女神!!! The slime washes off in the fountain!!! -史莱姆在喷泉中被冲洗掉了!!! +粘液在喷泉中被冲洗掉了!!! +The goddess of TYPE is enraged and curses you with a divine punishment! (+RESTRAINT) +TYPE女神非常愤怒,用神圣的惩罚诅咒你!( +RESTRAINT ) + + The goddess offers a ItemTraded for ItemCost (NumCurrent/NumMax) 女神提供了一个 ItemTraded for ItemCost (NumCurrent/NumMax) Next Offer 下一个交易 -Buy -买 +Buy (press right) +购买 (press right ) Cost: ItemCostgp -花费:ItemCostgp +花费 : ‎ItemCostgp +Owned: AMNT +所属: AMNT + + +You climb down to the next level +你进入新的一层。 + + Level RestraintLevel (Rarity) -等级 拘束等级(稀有度) +等级 RestraintLevel ( Rarity ) + + +All +全部 Consumable 消耗品 -Equipped -已装备 +Worn +佩戴中 Weapons 武器 Outfits 服装 -Wearable -可穿戴物 +Restraints +拘束 Miscellaneous 杂项 +Armor +盔甲 + + +The terrain makes noise as you rush across it... +你冲过去时,地板会发出噪音...... + + +You can't reach the cuffs on your elbows, the chain is too short... +你够不到手肘处的手铐,链条太短了 +You contort your arms trying to reach the cuffs on your elbows, to no avail... +你扭曲手臂试图触及肘部的手铐,但无济于事...... +Your elbows are kept together by the elbow cuffs, and you can't reach them. +你的胳膊肘被手铐固定在一起,你够不着它们。 + + +The strict chain on the cuffs keeps you from reaching them easily. +手铐上的严格链条可防止你轻易触及它们。 +The cuffs limit your range of motion, making it harder to remove them. +手铐限制了你的活动范围,让你更难摘下它们。 +It's hard to take off the cuffs with your wrists linked together... +手腕连在一起,手铐很难解开…… + + +You feel drained of energy... +你感觉筋疲力尽... +Your collar tingles and suddenly you feel weaker... +你的项圈一阵刺痛,你突然感觉浑身无力…… +Your collar drains your energy as you struggle... +你挣扎时,你的项圈会耗尽你的能量…… + + +The rope between your legs keeps the toy secure... +你两腿之间的绳子可以保证玩具的安全...... +Try as you might, the toy is held in place tight. +尽管你尽力了,但是玩具还是被紧紧地固定在适当的位置。 +The toy won't wiggle loose. It's kept in place by your restraints. +玩具不会松动。它被你的束缚固定在适当的位置。 + + +Your catsuit adheres to latex, making struggling more difficult! +你的紧身衣粘在乳胶上,让挣扎变得更加困难! +The item sticks to your rubber catsuit, making it harder to pull off... +这件衣服粘在你的橡胶紧身衣上,很难脱下来... +The item hugs your catsuit tightly, adhering firmly! +这件衣服紧紧地拥抱着你的紧身衣,牢牢地粘在一起! + + +Your RSTRN holds you securely, making your struggling ineffectual... +你的 RSTRN 牢牢地束缚着你,使你的挣扎毫无效果…… +Your RSTRN holds you tight, making it harder to move... +你的 RSTRN 将你紧紧抱住,让你难以移动…… +Your RSTRN keeps you tied tight, making it harder to escape... +你的 RSTRN 将你紧紧束缚,让你更难逃脱…… + + +The bright light weakens the shadow hands! +明亮的光线削弱了影之手! + + You hear an ominous click, but nothing seems to happen. Looks like a misfire! 你听到不祥的咔哒声,但似乎什么也没发生。好像失效了! + + Barrel Trap 桶陷阱 A booby-trapped barrel with a spring-loaded lid designed to trap you inside! -带有弹簧盖的陷阱桶,旨在将您困在里面! +带有弹簧盖的陷阱桶,旨在将你困在里面! You can push the lid off with enough force... 你可以用足够的力推开盖子... The lid of the barrel suddenly snaps shut as you hide inside!!! 当你躲在里面时,桶盖突然关上!!! -Cage Trap -笼式陷阱 -A booby-trapped cage! -一个陷阱笼子! -Fit for a pretty toy like you~ -适合你这样漂亮的玩具~ + + + + +Sarcophagus +石棺 +A glass-walled chamber sealed with enchanting magic. +一个用迷人魔法密封的玻璃墙房间。 +Time feels like it's going by quickly outside... +外面的时间感觉过得很快…… + + +Metal Cage +金属笼 +A metal cage with rigid bars, too narrow to put your head through. +一个带有刚性杆的金属笼子,太窄而无法让你的头穿过去。 +Made for a pretty toy like you~ +专为像你这样的漂亮玩具而设计~ +Display Stand +展示架 +A display stand, fit for only the prettiest of trophies! +展示架,只适合放置最漂亮的奖杯! +Your arms are pinned behind your back and you can barely move! +你的手臂被反扣在背后,几乎无法动弹! You hear a click as the door shuts behind you... 你听到门在你身后关上的咔哒声... +The display stand suddenly locks into place around you! +展示架突然在你周围锁定! + + +Doll Stand +玩偶架 +A mobile display stand for dolls to keep them in place. +一个用于固定玩偶的移动展示架。 +As long as it's... inserted, you won't be going anywhere! +只要它插入……那里,你就哪儿也去不了! + + +One Bar Prison +一道封条 +A devious way to immobilize people. +一种使人动弹不得的狡猾方法。 + + +Metal Stand +金属支架 +As long as it's locked around you, you won't be going anywhere! +只要被锁住,你就别想走了! + + +As long as it's attached, you won't be going anywhere! +只要它附在身上,你就哪儿也去不了! + + You're not fooling anyone... 你骗不到任何人... You might be able to fool someone like this... 你也许能像这样骗到某些人... You look like you're right at home! 你看起来就在家里! + + Restraining Bed 拘束床 A bed with a booby trap designed to trap you on top of it! -带有拘束装置的床,旨在将您困在上面! +带有拘束装置的床,旨在将你困在上面! You have to get out somehow... -你必须以某种方式离开...... +你得个想办法逃脱...... Belts emerge from underneath the bed and wrap around you, strapping you down tightly! 腰带从床底下出来,缠绕在你身上,把你紧紧地绑起来! + + Binding Dress 捆绑连衣裙 -A devious dress that forces the arms into an elbows-touching position. -一种连衣裙,迫使手臂在背后保持胳膊接触的位置。 -It is extremely strict but it is only fabric. The lacing is intricate and will take a long time to remove. -它非常严苛,但它只是织物。绑带很复杂,需要很长时间才能去除。 +It's a devious dress! I hope your elbows are flexible~ +这是一件不寻常的衣服!希望你的手肘足够柔韧~ +So many laces! It would take quite a while to put this on normally. That's what magic is for! +很多系带!正常穿这个要很长的时间。这就是魔法的用途! Ornamental Corset -观赏紧身胸衣 +装饰束胸 Your figure looks gorgeous in this~ 你的身材看起来真漂亮〜 It's so tight you won't be able to undo the laces yourself, dear! -亲爱的,这太紧了,你将无法自己解开系带! +哎呀!这个绑带太紧了,你自己解不开! + + Fancy Ball Gag 精致口球 A cute ball gag that fills your mouth right up! -一个可爱的口球,你的塞满嘴! +一个可爱的口球,塞满你的嘴! What's this? it seems to have a magic spell protecting it from harm! 这是什么? 它似乎有一个神奇的法术保护它免受伤害! Fancy Muzzle 精致口套 A muzzle to keep you from spitting out what's underneath. -口套可防止您吐出下面的东西。 +口套可防止你吐出底下的东西。 Sorry dear, there's a mystic seal on there to keep it on nice and tight. 对不起,亲爱的,那里有一个神秘的封印,可以使其保持良好且紧密。 -Red Binding Dress -红色捆绑连衣裙 + + +Ornamental Dress +装饰连衣裙 A devious dress that forces the arms into an elbows-touching position. 一种连衣裙,迫使手臂在背后保持胳膊接触的位置。 It is extremely strict but it is only fabric. The lacing is intricate and will take a long time to remove. -它非常严苛,但它只是织物。绑带很复杂,需要很长时间才能去除。 -Panel Plug Gag -镶嵌堵嘴 -A gag meant to keep people quiet by forcing a dildo into their mouth. -一种堵嘴,旨在通过将假阳具塞入他们的嘴里来让人保持安静。 -It is difficult to pull off and though it is made from supple, heavy duty leather. -它很难取出,尽管它是由柔软的厚皮革制成的。 +它非常严密,但它只是织物。绑带很复杂,需要很长时间才能去除。 + + Ornamental Gag 装饰堵嘴 -A gag meant to keep servants of the Resurrection Temple quiet by forcing a dildo into their mouth. -一种堵嘴,旨在通过将假阳具塞入他们的嘴里来让恢复神殿的仆人保持安静。 +A gag meant to keep servants of the Resurrection Temple quiet by forcing a plug into their mouth. +一种堵嘴装置,旨在通过将塞子塞进复活神殿的仆人嘴里来让他们保持安静。 It is difficult to pull off and though it is made from white leather, a magic enchantment protects it from cutting. -很难扯下,虽然它是用白色皮革制成的,一个魔法结界保护它不被切割。 +很难扯下,虽然它是用白色皮革制成的,但是有一个魔法结界保护它不被切割。 + + +Panel Plug Gag +镶嵌堵嘴 +A gag meant to keep people quiet by forcing a plug into their mouth. +一种堵嘴装置,旨在通过将塞子塞进人们的嘴里来让人们保持安静。 +It is difficult to pull off and though it is made from supple, heavy duty leather. +虽然它是由柔软的重型皮革制成,但很难脱下来。 + + Fuuka's Collar -Fuuka的项圈 +风香(Fuuka)的项圈 A collar enchanted with ghastly energy. 一个被可怕能量附魔的项圈。 It seems to react with a pulse of energy whenever a nearby enemy is defeated. 每当附近的敌人被击败时,它似乎都会以能量脉冲作出反应。 Your collar pulses, and a revenant appears to avenge the enemy you defeated! 你的项圈跳动,一个亡魂出现,为你击败的敌人报仇! + + +Fuuka's Pet Collar +风香(Fuuka)的宠物项圈 +A collar enchanted with beneficial ghastly energy. +被赋予了有益的可怕能量的项圈。 +Your collar pulses, and a revenant appears to assist you! +你的项圈跳动,一个亡魂出现来帮助你! + + Dress Bustier 连衣裙紧身胸衣 A deceptively cruel device, making it impossible to reach your nipples. 一种看起来很残酷的装备,让你无法触及你的乳头。 Reinforced with steel plates, this will need bolt cutters to take off. 用钢板加固,这需要断线钳才能取下。 -Nipple Massagers -乳头按摩器 -A pair of little teasers. -一对小振动器。 -They will make for some great fun! -他们会带来一些很大的乐趣! + + +Massagers +按摩器 +A pair of little motion-activated teasers. They trigger when you swing your body for an attack. +一对通过动作激活的挑逗器。当你摆动身体进行攻击时,它们就会触发。 +They will make for some great fun! Type: Edging +他们会带来很多乐趣! 类型 : ‎寸止 +Advanced Massagers +高级按摩器 +A pair of sensitive motion-activated teasers. They trigger when you attack or struggle. +一对较为敏感通过动作激活的挑逗器。当你摆动身体进行攻击或挣扎时,它们就会触发。 +Nipple Weights +乳头砝码 +A pair of dense weights dangling from your sensitive bits. +一对沉重的砝码悬挂在你的敏感部位上。 +They tend to swing around when attacking or casting arm spells. +他们在攻击或施展手臂法术时往往会左右摇摆。 +Hi-Tech Massagers +高科技按摩器 +A pair of highly-sensitive motion-activated teasers. They detect most forms of motion, including sprinting and hopping. +一对高度敏感通过动作激活的挑逗器。它们可以检测大多数形式的运动,包括冲刺和跳跃。 + + Control Harness 控制束衣 An advanced harness for controlling high-security prisoners. 一种用于控制高安全性囚犯的先进绑带。 It seems to be made of flexible steel plates. 它似乎是由高延展性钢板制成的。 -Tracking Collar -追踪项圈 -An advanced collar for tracking high-security prisoners. -用于追踪高度安全的囚犯的高级项圈。 + + +Cyber Collar +赛博项圈 +An advanced collar for registering prisoners into the facility network. +用于将囚犯登记到设施网络中的高级项圈。 It seems to be made of flexible steel plates, and it has a high-security lock. 它似乎由柔性钢板制成,并且具有高安全性锁。 -Harness Ball Gag -马具式球口塞 -A gag that stuffs your mouth with a large silicone ball. -一个塞满您嘴的大硅胶球口塞。 + + Latex Ball Gag -乳胶口塞 -A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. -一种看起来像口塞的装备,但内部有一个能填满嘴的棒。 +乳胶口球 +A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +一种看起来像口球的装备,但内部有一个能填满嘴的棒。可以以一半的强度应用于脆弱的目标或上一回合施展过口头咒语的人。 The strap is made of a durable but flexible material -表带由耐用但柔韧的材料制成 +带子由耐用但柔韧的材料制成 +Large Latex Ball Gag +大号乳胶口球 +A devious device that looks like a large ball gag, but absolutely fills your mouth with a rubber cylinder. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +一种看起来像大口球的装备,但内部有一个能填满嘴的橡胶棒。可以以一半的强度应用于脆弱的目标或上一回合施展过口头咒语的人。 + + +Latex Mask +乳胶面具 +A slick layer of blue latex stretched over the mouth. +一层光滑的蓝色乳胶覆盖在嘴巴上。 +It's very tight and makes it hard to move your mouth. +它非常紧,让你的嘴很难移动。 + + +Secure Latex Mask +安全乳胶面具 +A slick layer of blue latex stretched over the mouth. It has a lockable strap which prevents it from being removed. +一层光滑的蓝色乳胶覆盖在嘴巴上。它有一条可锁定的带子,可防止其被移除。 + + +Rubberized Gloves +橡胶手套 +A mass of alchemical latex stretched over your arms, then hardened to the point that you can barely move your fingers! +一团炼金乳胶在你的手臂上生长,然后硬化到你几乎无法移动手指的程度! +Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! +与典型的橡胶不同,这种材料耐用、柔韧,而且有点粘! + + +Rubberized Socks +橡胶袜子 +A mass of alchemical latex stretched over your legs, then hardened. +一团炼金乳胶在你的腿上生长,然后变硬。 + + +Rubberized Mask +橡胶面具 +A mass of alchemical latex stretched over your entire face, then hardened. +一团炼金乳胶铺满了你的整张脸,然后变硬。 + + +Rubberized Ball Gag +橡胶口球 +A mass of alchemical latex inflated to fill your mouth, then hardened. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +大量炼金乳胶膨胀并填满你的嘴,然后变硬。可以以一半的强度应用于脆弱的目标或上一回合施展过口头咒语的人。 + + +Rubberized OTN Mask +橡胶覆嘴式面具 +A mass of alchemical latex stretched over your mouth, then hardened. +一团炼金乳胶在你的嘴上伸展,然后变硬。 + + Wolf Panties -狼内裤 +训狼内裤 A set of vibrating panties designed to help subdue unruly wolfgirls. -一套振动内裤,旨在帮助制服不守规矩的狼女。 +一套振动内裤,旨在帮助制服不守规矩的狼娘。 It's incredibly tight and difficult to remove once it's clipped on, but the material is rubber. 它非常紧,一旦夹上就很难取下,但材料是橡胶。 -Latex Boxtie Binder -乳胶盒带活页夹 + + +You can't equip that. +你不能装备它。 + + +Experimental Boxtie Binder +实验性后手缚捆扎带 A secure but comfortable binder meant for long-term wear by the alchemists' pets. -一种安全而舒适的活页夹,适合炼金术士的宠物长期佩戴。 +一种安全而舒适的捆扎带,适合炼金术士的宠物长期佩戴。 Made from imbued latex, it will be hard to cut but not impossible. 由灌输乳胶制成,很难切割,但并非不可能。 -Binder Straps Cincher -活页夹带束紧器 -A tight cincher attached to a binder used to ensure restraints will not come off. -连接到用于确保约束不会脱落的活页夹上的紧束带。 +Binder Harness +包扎带束衣 +A tight harness attached to a binder used to ensure restraints will not come off. +连接到用于确保拘束具不会脱落的紧束带。 It's tied in the back and reinforced with steel boning. 它系在背面,并用钢骨加固。 -Blacksteel Ankle Cuffs -黑钢脚铐 -Highly durable cuffs that can withstand even powerful acid. -高度耐用的手铐,甚至可以承受强酸。 -They are not coming off without the key. -没有钥匙,他们就不会离开。 -The enemy attaches your ankle cuffs together! -敌人将你的脚铐绑在一起! -Cuffs Chain -链式黑钢手铐 -Highly durable cuffs that can withstand even powerful acid. -高度耐用的手铐,甚至可以承受强酸。 -They are not coming off without the key. -没有钥匙,他们就不会离开。 -The ankle cuff chain detaches! -脚铐链脱落! Latex Posture Collar 乳胶姿势项圈 A strict collar that makes it tougher to escape from other items. 一个严苛的项圈,使从其他物品中逃脱变得更加困难。 It has steel boning but could be cut with enough care. 它有钢骨,但可以小心切割。 -Metal Ballet Heels -金属芭蕾高跟鞋 +Latex Ballet Heels +乳胶芭蕾高跟鞋 A pair of strict boots for making pets more manageable. A skilled person can still walk in these. 一双严格的靴子,让宠物更易于管理。熟练的人仍然可以行走。 -They are reinforced with metal and impossible to remove with a knife. -它们用金属加固,无法用刀去除。 +They are reinforced with top-quality hardened latex. +它们采用硬化乳胶加固。 + + + + High-Security Armbinder -高安全性束手套 -An mythril armbinder enclosing your hands and arms completely, making your hands useless. -一个秘银束手套将你的双手和手臂完全包裹起来,让你的双手无法使用。 +高安全性单手套 +An armbinder enclosing your hands and arms completely, making your hands useless. +单手套将你的手和手臂完全包住,使你的手变得毫无用处。 Made of a flexible, yet durable material, it's going to be really tough to escape. -由灵活但耐用的材料制成,很难逃脱。 +它由灵活而耐用的材料制成,很难逃脱。 +High-Security Boxbinder +高安全性盒式单手套 +A boxbinder enclosing your hands and arms completely, making your hands useless. +盒式单手套将你的手和手臂完全包住,使你的手变得毫无用处。 +High-Security Straitjacket +高安全性拘束衣 +A straitjacket enclosing your hands and arms completely, making your hands useless. +紧身衣将你的手和手臂完全包住,使你的手变得毫无用处。 +High-Security Lockdown Jacket +高安全性锁定拘束衣 +This jacket made with extra straps can even be used on top of another jacket for extra security. +这件带有额外带子的拘束衣甚至可以套在另一件拘束衣上面,以增加安全性。 High-Security Legbinder 高安全性束腿套 An mythril legbinder enclosing your legs, making it difficult to move. -一个秘银束腿套,包裹住你的双腿,使其难以移动。 -Made of a flexible, yet durable material, it's going to be really tough to escape. -由灵活但耐用的材料制成,很难逃脱。 +束腿套包裹着你的双腿,使其难以移动。 + + High-Security Shackles 高安全性脚镣 -A pair of mythril shackles around your feet. -一对秘银脚镣铐在你的脚上。 +A pair of hardened steel shackles around your feet. +一对硬化脚镣铐在你的脚上。 Nearly indestructable, you are at the mercy of its lock. -几乎坚不可摧,你任由它的锁摆布。 -High-Security BallGag +几乎坚不可摧,你只能受其锁的支配。 +High-Security Ball Gag 高安全性口球 A rubber gag shoved tightly between your lips. 一个橡胶口球紧紧地塞在你的嘴唇之间。 -The mythril straps are nigh-unbreakable, keeping you securely silenced. -秘银带几乎牢不可破,让您保持安静。 -Potion Applicator -药水涂抹器 -An ancient device that allows direct use of potions even while gagged or bound. Costs 5% max ancient energy to use a potion this way. -一种古老的装置,即使在被嘴塞住或被束缚时也可以直接使用药水。以这种方式使用药水消耗 5% 最大值的远古能量。 +The cable-reinforced straps are nigh-unbreakable, keeping you securely silenced. +钢索加固后几乎牢不可破,让你安全的保持安静。 +High-Security Muzzle +高安全性口套 +A secure muzzle made with cable-reinforced straps. +由钢索加固制成的安全口套。 +It is especially effective at keeping in other gags. +它对于保持其他堵嘴物尤其有效。 + + +Potion Absorber +药水吸收器 +An ancient device that allows direct use of potions even while gagged or bound. +一种古老的装置,即使在被堵住嘴或被束缚的情况下也可以直接饮用药水。 Also allows fitting of a leash. -还允许安装皮带。 +还可以安装牵绳。 Slime Walkers -史莱姆靴子 +粘液行者 A pair of heels coated in a nonstick material. -一双涂有不粘材料的高跟鞋。 +一双涂有不粘胶或粘液材料的高跟鞋。 They will slow you down, but you can walk on slime without getting stuck! -它们会减慢您的速度,但您可以在史莱姆上行走而不会卡住! +它们会减慢你的速度,但你可以在粘液上行走而不会被黏住! + + +Duster Gag +掸子口塞 +A special gag designed for maids to be useful even while tied up! It's self-locking too! +专为女仆设计的特殊口塞,即使在被绑着的情况下也能打扫卫生!并且会自动锁定! +Deals 0.5 tickle damage on attack and adds +30 distraction. Bonus damage vs dirt and mold. +攻击时造成 0.5 点挠痒伤害,并增加 30 性奋值。对抗污垢和霉菌会造成额外伤害。 +Deals 0.5 tickle damage on attack and adds +30 distraction. +攻击时造成 0.5 点挠痒伤害,并增加 30 性奋值。 + + +Gas Mask +防毒面具 +A respirator designed to protect the wearer from noxious fumes. +旨在保护佩戴者免受有毒烟雾侵害的呼吸器。 ++50 Poison resist. Protects against dizziness caused by sleep gas. Affects speech. ++50 毒素抗性。防止睡眠气体引起的头晕。影响言语。 + + +The curse on the RestraintName is lifted! +对 RestraintName 的诅咒解除了! +Press RIGHT to confirm buy! +按 RIGHT 确认购买! + + + + + + + + +You find +你找到了… + + + + + + + + + + + + + + + + Collar 项圈 A classy leather collar. @@ -3332,20 +7058,22 @@ Slave Collar 奴隶项圈 A high-security steel collar befitting of a slave. 适合奴隶的高安全性钢项圈。 -Allows fitting of a leash. -允许安装牵绳。 Enchanted Collar 魔法项圈 A collar made with magically enchanted materials. It is difficult to cut off. 用魔法材料制成的项圈。很难切断。 -Allows fitting of a leash. -允许安装牵绳。 +Kitty Collar +猫咪项圈 +A collar made with magically enchanted materials. It is protected by the blessing of Bast. +用魔法材料制成的项圈。 它受到Bast祝福的保护。 Leash 牵绳 A leash made from a strong material. 由坚固的材料制成的牵绳。 Functions as a handle for moving unruly prisoners. 用于控制和移动不守规矩的囚犯。 + + Prisoner Plug 囚犯塞 A teaser to keep you occupied. @@ -3359,359 +7087,387 @@ A chastity belt to protect prisoners from themselves. Made of a highly durable material. 由高度耐用的材料制成。 Blacksteel Chastity Belt -黑钢贞操腰带 -A chastity belt to protect prisoners from themselves. -保护囚犯免受自身伤害的贞操带。 -Made of a highly durable material. -由高度耐用的材料制成。 +黑钢贞操带 + + Charms (Arms) -丝带(手臂) +绷带 ( 手臂 ) A band of faintly magic ribbon wrapped tight around your arms. -一条微弱的魔法丝带紧紧地缠绕在你的手臂上。 +一条被赋予微弱魔法的绷带紧紧缠绕在你的手臂上。 It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +像是有生命一般的缠绕住,但似乎对其切割或者拉扯很容易将其撕开。 Charms (Legs) -丝带(腿) +绷带 ( 腿 ) A band of faintly magic ribbon wrapped tight around your thighs. -一条微弱的魔法丝带紧紧地缠绕在你的大腿上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +一条被赋予微弱魔法的绷带紧紧缠绕在你的大腿上。 Charms (Feet) -丝带(脚) +绷带 ( 脚 ) A band of faintly magic ribbon wrapped tight around your ankles. -一条微弱的魔法丝带紧紧地缠绕在你的脚踝上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +一条被赋予微弱魔法的丝带紧紧缠绕在你的脚踝上。 Charms (Head) -丝带(头) -A band of faintly magic ribbon wrapped tight around your eyes. -一条淡淡的魔法丝带紧紧地缠绕在你的眼睛上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +绷带 ( 头 ) +A band of faintly magic ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. +一条被赋予微弱魔法的绷带紧紧缠绕在你的眼睛上。可用于快速库存或快捷栏中的脆弱对象。 Charm Gag 绷带堵嘴 -A band of faintly magic ribbon wrapped tight around your mouth. -一条微弱的魔法丝带紧紧地缠绕在你的嘴边。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +A band of faintly magic ribbon wrapped tight over the mouth. Can be used on vulnerable targets from quick inventory or hotbar. +一条被赋予微弱魔法的绷带紧紧缠绕在你的嘴边。可用于快速库存或快捷栏中的脆弱对象。 Charm Wrapping (Toes) -丝带包裹(脚趾) +绷带包裹 ( 脚趾 ) A layer of faintly magic ribbon wrapped tight around your feet. -一层淡淡的魔法丝带紧紧的缠绕在你的脚边。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +一条被赋予微弱魔法的绷带紧紧的缠绕在你的脚边。 Charm Wrapping (Head) -丝带包裹(头) +绷带包裹 ( 头 ) A layer of faintly magic ribbon wrapped tight around your face. -一层淡淡的魔法丝带紧紧的缠绕在你的脸上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +一条被赋予微弱魔法的绷带紧紧的缠绕在你的脸上。 Charm Wrapping (Arms) -丝带包裹(手臂) +绷带包裹 ( 手臂 ) A layer of faintly magic ribbon wrapped tight around your body. -一层淡淡的魔法丝带紧紧的缠绕在你的身上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +一条被赋予微弱魔法的绷带紧紧的缠绕在你的身上。 Charm Wrapping (Feet) -丝带包裹(脚) +绷带包裹 ( 脚 ) A layer of faintly magic ribbon wrapped tight around your shins. -一层淡淡的魔法丝带紧紧的缠绕在你的小腿上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +一条被赋予微弱魔法的绷带紧紧的缠绕在你的小腿上。 Charm Wrapping (Legs) -丝带包裹(腿) +绷带包裹 ( 腿 ) A layer of faintly magic ribbon wrapped tight around your thighs. -一层淡淡的魔法丝带紧紧的缠绕在你的大腿上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +一条被赋予微弱魔法的绷带紧紧的缠绕在你的大腿上。 +Living Charm Collar +活体绷带项圈 +This collar is designed to make sure its wearer does not escape their charms. +这枚项圈的设计是为了确保佩戴者不会从绷带中逃脱。 +It will occasionally cause charms to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of charms you have on you. +它偶尔会突然出现符咒,并束缚佩戴者。效果的速度增加取决于你身上的符咒数量。 + + Leather Panel Gag -皮革面板堵嘴 +口罩型皮革口塞 A gag that seals your lips tightly and stuffs your mouth with a ball. -一个堵住你的嘴唇并用一个球塞住你的嘴的堵嘴。 +把你的嘴唇紧紧地封住,并用一个球塞进你的嘴里。 +Keep your mouth to yourself! +管好自己的嘴吧! +Harness Panel Gag +口罩型马具口球 The harness is comprehensive and it's locked in place. 束带很全面,并且锁定到位。 +Harness Ball Gag +马具式口球 +A gag that stuffs your mouth with a large silicone ball. +一个塞满你嘴的硅胶大口球。 + + Bast Gag -Bast堵嘴 +猫女神堵嘴 A gag used to silence new initiates of the Bast cult. -用来让巴斯特教新信徒闭嘴的堵嘴。 -The harness is comprehensive and it's locked in place. -束带很全面,并且锁定到位。 +用来让 猫女神教新信徒闭嘴的堵嘴。 Bast Muzzle -Bast口套 +猫女神口套 A muzzle used to keep a Bast gag secure. -一个用来固定 Bast 堵嘴的口套。 +一个用来固定猫女神堵嘴的口套。 The leather panel is tough and tight. 皮革面板坚韧而紧密。 Bast Blindfold -Bast眼罩 +猫女神眼罩 A blindfold used to aid in meditation. 用于帮助冥想的眼罩。 It is padded but still lets some light through. 它是填充的,但仍然可以让一些光线通过。 Bast Paws -Bast爪子 +猫女神爪套 Leather mittens used to pacify new initiates of the Bast cult. -皮手套用来安抚Bast教的新信徒。 +皮手套用来安抚猫女神教的新信徒。 They make it hard to manipulate anything at all, but aren't the toughest material. 它们使操作任何东西都变得困难,但不是最坚硬的材料。 Bast Suit -Bast套装 -Leather suit used on unruly initiates of the Bast cult. -用于不守规矩的Bast教信徒的皮革套装。 +猫女神套装 +A skintight suit used on unruly initiates of the Bast cult. +猫女神教派不守规矩的新信徒穿的紧身衣。 It's nearly impossible to escape without help once locked inside. -一旦被锁在里面,几乎不可能在没有帮助的情况下逃脱。 +一旦被锁在里面,没有帮助几乎不可能逃脱。 Bast Petsuit -bast宠物套装 +猫女神宠物套装 Enhanced suit used for select members of the Bast cult. -用于巴斯特教派特定成员的增强套装。 -It's nearly impossible to escape without help once locked inside. -一旦被锁在里面,几乎不可能在没有帮助的情况下逃脱。 +用于猫女神教派特定成员的增强套装。 + + +Magic Petsuit +魔法宠物套装 +A set of straps and buckles enchanted with a powerful spell to render you helpless. +一套带有强大咒语的带子和带扣,让你束手无策。 +It's warded against cutting by nonmagic blades. +它可以防止非魔法刀片的切割。 + + +Latex Petsuit +乳胶宠物服 +A skintight suit that encases you in a tight rubber embrace. +一件紧身衣,将你包裹在紧紧的乳胶怀抱中。 +The thick latex is resistant to even the most determined struggles. +厚厚的乳胶能抵御最顽强的挣扎。 + + Blessed Wrappings (Head) -祝福丝带包裹(头) -A band of magic embalming ribbon wrapped tight around your eyes. -一条神奇的防腐丝带紧紧地缠绕在你的眼睛上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +祝福丝带包裹 ( 头 ) +A band of magic embalming ribbon wrapped tight around your face. +一条神奇的祝福丝带紧紧地缠绕在你的脸上。 +Blessed Wrappings (Eyes) +祝福丝带包裹 ( 眼睛 ) +A band of magic embalming ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. +一条神奇的祝福丝带紧紧地缠绕在你的眼睛上。可用于快速库存或快捷栏中的脆弱对象。 Blessed Wrappings (Gag) -祝福丝带包裹(堵嘴) -A band of magic embalming ribbon wrapped tight around your mouth. -一条神奇的防腐丝带紧紧地缠在你的嘴上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +祝福丝带包裹 ( 堵嘴 ) +A band of magic embalming ribbon wrapped tight over mouth. Can be used on vulnerable targets from quick inventory or hotbar. +一条神奇的祝福丝带紧紧地缠在你的嘴上。可用于快速库存或快捷栏中的脆弱对象。 Blessed Wrappings (Arms) -祝福丝带包裹(手臂) +祝福丝带包裹 ( 手臂 ) A layer of magic embalming ribbon wrapped tight around your body. -一层神奇的防腐丝带紧紧地缠绕在你的身上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +一层神奇的祝福丝带紧紧地缠绕在你的身上。 Blessed Wrappings (Feet) -祝福丝带包裹(脚) +祝福丝带包裹 ( 脚 ) A layer of magic embalming ribbon wrapped tight around your shins. -一层神奇的防腐丝带紧紧地缠绕在你的小腿上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +一层神奇的祝福丝带紧紧地缠绕在你的小腿上。 Blessed Wrappings (Toes) -祝福丝带包裹(脚趾) +祝福丝带包裹 ( 脚趾 ) A layer of magic embalming ribbon wrapped tight around your feet. -一层神奇的防腐丝带紧紧地缠绕在你的脚上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 +一层神奇的祝福丝带紧紧地缠绕在你的脚上。 +Blessed Wrappings (Hands) +祝福丝带包裹 ( 手 ) +A layer of magic embalming ribbon wrapped tight around your hands. +一层神奇的祝福丝带紧紧地缠绕在你的手上。 Blessed Wrappings (Legs) -祝福丝带包裹(腿) +祝福丝带包裹 ( 腿 ) A layer of magic embalming ribbon wrapped tight around your thighs. -一层神奇的防腐丝带紧紧地缠绕在你的大腿上。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -它几乎是自发地紧贴着它,但似乎很容易受到切割和拉扯的影响。 -Autotape (Head) -自动胶带(头) +一层神奇的祝福丝带紧紧地缠绕在你的大腿上。 +Living Blessed Wrappings Collar +活体祝福丝带项圈 +This collar is designed to make sure its wearer does not escape their wrappings. +这款项圈的设计是为了确保佩戴者不会逃脱活体祝福丝带。 +It will occasionally cause blessed wrappings to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of blessed wrappings you have on you. +它偶尔会使幸祝福丝带突然出现,并束缚佩戴者。根据你身上祝福丝带的数量,速度的效果会增加。 + + +Tape (Hands) +胶带(手) +Sleek and shiny tape for the bondage enthusiast. +光滑闪亮的胶带,适合捆绑爱好者使用。 +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +这是一种有弹性的防水胶带,只能粘在自己身上。因此,它可以安全地贴在人身上或从人身上取下而不会引起不适。它的伸缩性使其可以卷得特别紧,而且即使被挣扎也不会断裂。 +Tape (Arms) +胶带(手臂) +Tape (Legs) +胶带(腿) +Tape (Feet) +胶带(脚) +Tape (Head) +胶带(头) +Sleek and shiny tape for the bondage enthusiast. Can be used on vulnerable targets from quick inventory or hotbar. +光滑闪亮的胶带,适合捆绑爱好者使用。可用于快速库存或快捷栏中的脆弱对象。 +Tape Gag +胶带口塞 +Tape Mouth Wrap +胶带口罩 +Tape Wrapping (Toes) +胶带包裹(脚趾) +Tape Wrapping (Head) +胶带包裹(头) +Tape Wrapping (Arms) +胶带包裹(手臂) +Tape Wrapping (Feet) +胶带包裹(脚) +Tape Wrapping (Legs) +胶带包裹(腿) +Living Tape Collar +活体胶带项圈 +This collar is designed to make sure its wearer does not escape their tape. +这款项圈的设计是为了确保佩戴者不会逃脱胶带的束缚。 +It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. +它偶尔会使胶带突然出现并束缚佩戴者。效果会根据身上胶带的数量而加快。 + + +Autotape +自动胶带 +Comes in convenient cartridges for machine loading. +装在方便机器装载的盒式磁带里。 +A specialized tape used for capturing purposes during the time of the Old Civilization. Despite its appearance, it contains a gas-permeable membrane that allows ventilation, while its hydrophobic properties resist solvents that would otherwise disrupt the adhesive bond. The adhesive layer is special in that it activates only in contact with other auto-tape, making it safer to use and remove. +旧文明时期用于捕捉目的的专用胶带。尽管它的外观与普通胶带不同,但它含有一层透气膜,可以透气,同时它的疏水特性可以抵御溶剂,否则溶剂会破坏粘合剂的粘合。粘合层的特殊之处在于,它只有在与其他自动胶带接触时才会激活,因此使用和清除起来都更安全。 + + +Rubberized Tape +橡胶胶带 + + +Magic Charms +魔法符咒 +Magical charms from the ancient graveyard. +来自古老墓地的魔法符咒。 +Its magic is not enough to protect it from damage, but it is surprisingly effective at restraining both intruders and cursed entities. +它的魔力不足以保护它不受伤害,但在抑制入侵者和受诅咒的实体方面却出奇地有效。 + + +Blessed Wrapping +受祝福的丝带 +A layer of magic embalming ribbon. +一条神奇的防腐丝带 +It clings of its own accord to intruders and naughty catgirls. +它会主动粘住入侵者和淘气的猫娘。 + + +Autotape (Hands) +自动胶带 ( 手 ) Sticky tape made from a metallic material. Used to great effect in police situations. 由金属材料制成的胶带。在警察情况下使用效果很好。 +It's very sticky and seals your hands tightly, making any struggling ineffective. +它非常粘,将你的手紧紧封住,使任何挣扎都无效。 +Autotape (Head) +自动胶带 ( 头 ) +Sticky tape made from a metallic material. Used to great effect in police situations. Can be used on vulnerable targets from quick inventory or hotbar. +由金属材料制成的粘性胶带。在警用场合使用效果极佳。可用于快速库存或快捷栏中的脆弱对象。 It's very sticky and tough but you could probably get a knife through it. -它非常粘稠且坚韧,但您可以用刀解决它。 +它非常粘稠且坚韧,但你可以用刀解决它。 Autotape (Arms) -自动胶带(手臂) -Sticky tape made from a metallic material. Used to great effect in police situations. -由金属材料制成的胶带。在警察情况下使用效果很好。 -It's very sticky and tough but you could probably get a knife through it. -它非常粘稠且坚韧,但您可以用刀解决它。 +自动胶带 ( 手臂 ) Autotape (Legs) -自动胶带(腿) -Sticky tape made from a metallic material. Used to great effect in police situations. -由金属材料制成的胶带。在警察情况下使用效果很好。 -It's very sticky and tough but you could probably get a knife through it. -它非常粘稠且坚韧,但您可以用刀解决它。 +自动胶带 ( 腿 ) Autotape (Ankles) -自动胶带(脚踝) -Sticky tape made from a metallic material. Used to great effect in police situations. -由金属材料制成的胶带。在警察情况下使用效果很好。 -It's very sticky and tough but you could probably get a knife through it. -它非常粘稠且坚韧,但您可以用刀解决它。 +自动胶带 ( 脚踝 ) Autotape (Feet) -自动胶带(足) -Sticky tape made from a metallic material. Used to great effect in police situations. -由金属材料制成的胶带。在警察情况下使用效果很好。 -It's very sticky and tough but you could probably get a knife through it. -它非常粘稠且坚韧,但您可以用刀解决它。 +自动胶带 ( 足 ) Autotape (Mouth) -自动胶带(嘴) -Sticky tape made from a metallic material. Used to great effect in police situations. -由金属材料制成的胶带。在警察情况下使用效果很好。 -It's very sticky and tough but you could probably get a knife through it. -它非常粘稠且坚韧,但您可以用刀解决它。 +自动胶带 ( 嘴 ) +Autotape (Mouth Wrap) +自动胶带 (口罩) +Living Auto Tape Collar +活体自动胶带项圈 +It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. +它偶尔会使胶带突然出现并束缚佩戴者。速度的提高效果取决于你身上的胶带数量。 + + Stuffing 布团口塞 -A stuffing of cloth. -一块布团。 +A stuffing of cloth. Can be applied on vulnerable targets or those who casted a verbal spell last turn. +一块布团。可以用于脆弱的目标或上一回合施展过口头咒语的人。 You could spit it out easily, provided nothing's covering it. 你可以很容易地把它吐出来,只要没有东西覆盖它。 -Arm Ropes -手臂绳缚 -Faintly glowing ropes from a magic trap. -来自魔法陷阱的微弱发光的绳索。 -I wonder who was responsible? -我想知道谁负责? -Leg Ropes -腿部绳缚 -Faintly glowing ropes from a magic trap. -来自魔法陷阱的微弱发光的绳索。 -I wonder who was responsible? -我想知道谁负责? -Magic Hogtie -驷马(附魔) -It pulls your wrists up to your ankles! So tight! -它把你的手腕拉到你的脚踝!好紧! -The knots appear to tie themselves together again, making them impossible to undo! -结似乎再次将自己绑在一起,使它们无法解开! -Magic Arm Rope -手臂绳缚(附魔) -Strongly glowing ropes. -强烈发光的绳索。 -The knots appear to tie themselves together again, making them impossible to undo! -结似乎再次将自己绑在一起,使它们无法解开! -Magic Rope Cuffs -绳手铐(附魔) -Strongly glowing ropes. -强烈发光的绳索。 -The knots appear to tie themselves together again, making them impossible to undo! -结似乎再次将自己绑在一起,使它们无法解开! -Magic Ropework -绳索(附魔) -Strongly glowing ropes tied in an intricate pattern, making hand restraints more secure. -强烈发光的绳索以复杂的方式捆绑起来,使束手更加可靠。 -Magic Leg Rope -腿部绳缚(附魔) -Strongly glowing ropes. -强烈发光的绳索。 -The knots appear to tie themselves together again, making them impossible to undo! -结似乎再次将自己绑在一起,使它们无法解开! -Magic Ankle Rope -脚部绳缚(附魔) -Strongly glowing ropes. -强烈发光的绳索。 -The knots appear to tie themselves together again, making them impossible to undo! -结似乎再次将自己绑在一起,使它们无法解开! -Magic Crotch Rope -下体绳缚(附魔) -Strongly glowing ropes. -强烈发光的绳索。 -The knots appear to tie themselves together again, making them impossible to undo! -结似乎再次将自己绑在一起,使它们无法解开! -Magic Toe Rope -脚趾绳缚(附魔) -Strongly glowing ropes. -强烈发光的绳索。 -The knots appear to tie themselves together again, making them impossible to undo! -结似乎再次将自己绑在一起,使它们无法解开! -Mithril Hogtie -驷马(秘银) -It pulls your wrists up to your ankles! So tight! -它把你的手腕拉到你的脚踝!这么紧! -Made of woven mithril and enchanted to require magic blades to cut! -由编织秘银制成,附魔需要魔法刀片才能切割! -Mithril Arm Rope -手臂绳缚(秘银) -Strongly shining ropes. -强烈闪亮的绳索。 -Made of woven mithril and enchanted to require magic blades to cut! -由编织秘银制成,附魔需要魔法刀片才能切割! -Mithril Leg Rope -腿部绳缚(秘银) -Strongly shining ropes. -强烈闪亮的绳索。 -Made of woven mithril and enchanted to require magic blades to cut! -由编织秘银制成,附魔需要魔法刀片才能切割! -Mithril Ankle Rope -脚踝绳缚(秘银) -Strongly shining ropes. -强烈闪亮的绳索。 -Made of woven mithril and enchanted to require magic blades to cut! -由编织秘银制成,附魔需要魔法刀片才能切割! -Mithril Crotch Rope -下体绳缚(秘银) -Strongly shining ropes. -强烈闪亮的绳索。 -Made of woven mithril and enchanted to require magic blades to cut! -由编织秘银制成,附魔需要魔法刀片才能切割! -Mithril Rope Harness -绳衣(秘银) -Strongly shining ropes. -强烈闪亮的绳索。 -Made of woven mithril and enchanted to require magic blades to cut! -由编织秘银制成,附魔需要魔法刀片才能切割! -Mithril Toe Rope -脚趾绳缚(秘银) -Strongly shining ropes. -强烈闪亮的绳索。 -Made of woven mithril and enchanted to require magic blades to cut! -由编织秘银制成,附魔需要魔法刀片才能切割! + + + + +Living Mithril Collar +活体秘银项圈 +A collar made from an almost-weightless alloy that adjusts itself to your neck. +由几乎没有重量的合金制成的项圈,可以自行调整以贴合你的颈部。 +It will occasionally cause mithril to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of mithril you have on you. +它偶尔会使秘银突然出现并束缚佩戴者。速度的效果增加基于你身上的秘银数量。 + + Mithril Collar 秘银项圈 A collar made from an almost-weightless alloy.. -由几乎失重的合金制成的项圈。 +由几乎没有重量的合金制成的项圈。 It feels comfortable but it's also really hard. 感觉很舒服,但也真的很硬。 + + Mithril Cuffs 秘银手铐 A pair of cuffs that make it easy to restrain you. -一对手铐,让你轻松束缚。 +一对手铐,非常轻松的束缚你。 They feel like they aren't even there, but the material is rigid and unyielding. 他们觉得他们甚至不在那里,但材料是刚性和不屈不挠的。 The enemy attaches your wrist cuffs together! 敌人将你的手腕铐在一起! -Linked Mithril Cuffs -链接秘银手铐 + + +Wrist Chain +腕链 A pair of cuffs keeping your arms behind your back. -一对手铐将您的手臂束缚在背后。 -They feel like they aren't even there, but the material is rigid and unyielding. -他们觉得他们甚至不在那里,但材料是坚硬和坚韧的的。 +一对手铐将你的手臂束缚在背后。 Your cuffs detatch! 你的手铐松了! The enemy attaches your elbow cuffs together! 敌人将你的肘部用手铐绑在一起! -Linked Mithril Elbow Cuffs -链接秘银手肘手铐 -A pair of cuffs keeping your arms in a strict elbow tie! -一对手铐使您的手臂保持严格的肘部捆绑! -They feel like they aren't even there, but the material is rigid and unyielding. -他们觉得他们甚至不在那里,但材料是刚性和不屈不挠的。 + + +Cuffs Chain +链式手铐 +A full set of cuffs keeping your arms in a strict elbow tie! +全套手铐将你的手臂严格地绑在肘部! Your wrists detatch, leaving your elbows still bound! 你的手腕松开了,你的手肘仍然被束缚着! -Mithril Elbow Cuffs -秘银手肘手铐 -A pair of cuffs keeping your elbows locked together!. -一对手铐将您的肘部固定在一起! -They feel like they aren't even there, but the material is rigid and unyielding. -他们觉得他们甚至不在那里,但材料是刚性和不屈不挠的。 + + +Elbow Chain +肘链 +A pair of cuffs keeping your elbows locked together! +一对手铐将你的肘部固定在一起! Your elbows detatch! -你的肘部手铐断开了! +你的肘部分开了! The enemy attaches your wrist cuffs back together! 敌人将你的手腕重新绑在一起! + + Mithril Leg Cuffs -秘银腿袖 +秘银腿铐 +A pair of cuffs on your legs. +你的腿上有一对手铐。 +The enemy attaches your leg cuffs together! +敌人将你的腿铐绑在一起! +Thigh Chain +大腿链 A pair of cuffs chaining your legs together. 一对手铐将你的双腿拴在一起。 -They feel like they aren't even there, but the material is rigid and unyielding. -他们觉得他们甚至不在那里,但材料是刚性和不屈不挠的。 +The leg cuff chain detaches! +腿铐链条脱落! + + Mithril Ankle Cuffs 秘银脚铐 -A pair of cuffs chaining your legs together. -一对手铐将你的双腿拴在一起。 -They feel like they aren't even there, but the material is rigid and unyielding. -他们觉得他们甚至不在那里,但材料是刚性和不屈不挠的。 +A pair of cuffs on your ankles. +有一对脚铐戴在你的脚踝上。 The enemy attaches your ankle cuffs together! 敌人将你的脚铐绑在一起! -Linked Mithril Cuffs -链接秘银手铐 -A pair of cuffs chaining your legs together. -一对手铐将你的双腿拴在一起。 -They feel like they aren't even there, but the material is rigid and unyielding. -他们觉得他们甚至不在那里,但材料是刚性和不屈不挠的。 +Ankle Chain +踝链 The ankle cuff chain detaches! 脚铐链脱落! +Your ankle cuff chain is tightened and pulls your feet together! +你的脚踝铐链已收紧,并将你的双脚拉在一起! +Short Ankle Chain +短踝链 +A pair of cuffs chaining your feet tightly together. +一对手铐将你的双脚紧紧地拴在一起。 +Your ankle cuff chain loosens! +你的脚踝铐链松了! + + +Living Leather Collar +活体皮革项圈 +A collar made of tough leather that adjusts itself to your neck. +由坚韧的皮革制成的项圈,可以自行调整以贴合你的颈部。 +It will occasionally cause leather to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of leather you have on you. +它偶尔会导致使突然出现并束缚佩戴者。速度的增加效果取决于你身上的皮革数量 + + +Leather Cuffs +皮革铐 +Made of tough leather. +由坚韧的皮革制成。 + + + + +Leather Leg Cuffs +皮革腿铐 + + +Leather Ankle Cuffs +皮革踝铐 + + Sticky Slime -粘性史莱姆 +粘性粘液 A sticky layer of slime keeping you anchored to the ground. -一层粘稠的史莱姆让你固定在地面上。 +一层粘稠的粘液将你固定在地面上。 It will slow you for a single turn. 它会让你延迟一轮行动。 Leather Mittens @@ -3719,81 +7475,153 @@ Leather Mittens A pair of tight leather mittens enclosing your hands. 一副紧绷的皮手套包住你的双手。 They make it almost impossible to manipulate keys and tools. Keep your hands to yourself! -它们使操作按键和工具几乎成为不可能。把手留给自己! +令你几乎不可能操纵钥匙和工具,保持你的手紧握! +Leather Legbinder +皮革束腿套 +A tight leather legbinder that keeps your feet glued together. +一款紧身皮革束腿套,可将双脚绑在一起。 +It's quite snug and the laces are secured with a lockable panel. Getting at them requires picking the lock. +它非常舒适,绳结由可锁定的面板遮挡并固定。想要触碰它们就需要先解开锁。 Leather Armbinder -皮革束手套 +皮革单手套 A tight leather armbinder enclosing your hands and arms completely. -一个紧身的皮革束手套完全包住您的手和手臂。 +一个紧身的皮革单手套完全包住你的手和手臂。 It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible. 它非常舒适,并由背面的可锁扣固定。自己开锁是不可能的。 +Leather Boxbinder +皮革盒式单手套 +A secure but comfortable binder meant for long-term wear. +一种安全而舒适的盒式单手套,适合长期佩戴。 Leather Armbinder Harness -皮革束手套束衣 +皮革单手套束衣 Leather belts securing your armbinder tightly. 皮带紧紧地固定着你的束手袋。 It's quite tight and secured by lockable buckles on your sides. -它非常紧,并由您两侧的可上锁带扣固定。 +它非常紧,并由你两侧的可上锁带扣固定。 The armbinder harness comes off with the armbinder. -会随着束手套一起挣脱。 +会随着单手套一起挣脱。 +The energy link between your ankle cuffs fizzles into nothing. +踝铐之间的能量链条逐渐消失。 +The energy link between your arm cuffs fizzles into nothing. +臂铐之间的能量链条逐渐消失。 +The energy link between your thigh cuffs fizzles into nothing. +大腿铐之间的能量链接逐渐消失。 +The cuff chains come off with the cuffs. +拷绑链条随拷绑一起脱落 +The hogtie link comes off. +驷马链接脱落 Handcuffs 手铐 -A pair of steel cuffs locked securely around your wrists. -一对钢制手铐牢固地锁在您的手腕上。 +A pair of steel cuffs locked securely around your wrists. Can be applied on vulnerable targets if targeted from inventory or hotbar. +一对钢制手铐牢固地锁在你的手腕上。如果在库存或快捷栏中锁定,则可对脆弱对象使用。 The lock doesn't seem very complicated. 锁似乎不是很复杂。 Steel Yoke -钢杆 +钢枷锁 A steel bar clamped firmly around your wrists and neck, leaving you in a helpless position. -钢杆牢牢地夹在您的手腕和脖子上,使您处于无助的位置。 -This is not something you can pick by yourself... -这不是您自己可以选择的东西... +钢枷锁牢牢地夹在你的手腕和脖子上,使你处于无助的位置。 +The awkward position makes it difficult to get out of alone. +尴尬的处境让人很难独自走出来。 +Heavy Yoke +重型枷锁 +A series of armor-grade plates cut with precision machining, sandwiched into an unbreakable layer that clasps firmly in place around your neck and wrists. +一系列经过精密加工切割的装甲级板材,夹在牢不可破的层中,可以牢牢地固定在你的颈部和手腕上。 +Steel Fiddle +颈手枷 +A steel fixture keeping your hands in an awkward and submissive position. +钢制固定装置使你的手处于尴尬且顺从的姿势。 +The awkward position prevents you from easily reaching the lock. +这种尴尬的位置使得你无法轻易够到锁。 Leather Harness 皮革束衣 A leather harness of tight straps buckled around your torso. -一条由紧身带制成的皮革背带扣在您的躯干上。 +一条由紧身带制成的皮革背带扣在你的躯干上。 It provides an anchor point for enemies to grab onto! 它为敌人提供了一个可以抓住的地方! +Rubberized Harness +橡胶束衣 +A harness made of latex polymer, resistant to most solvents and corrosion. +由乳胶聚合物制成的束衣,可抵抗大多数溶剂和腐蚀。 +Can be worn all day! Also convenient to hold. +可以穿一整天!握持也方便。 Ball Gag 口球 -A gag made of a red squishy material. -一种由红色柔软材料制成的堵嘴物。 +A gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +一种由红色柔软材料制成的堵嘴物。可以以一半的强度应用于脆弱的目标或上一回合施展过口头咒语的人。 You can't seem to enunciate your spells properly with this in. -有了这个,你似乎无法正确地念出你的咒语。 +佩戴上后,你似乎无法正确地念出你的咒语。 +Large Ball Gag +大号口球 +A mouth-filling gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +一种由红色软质材料制成的口塞。可以以一半的强度应用于脆弱的目标或上一回合施展过口头咒语的人。 Tight Ball Gag -紧扣的口球 -A gag made of a red squishy material, buckled as tight as it will go. -一个由红色柔软材料制成的堵嘴物,扣得尽可能紧。 -You can't seem to enunciate your spells properly with this in. -有了这个,你似乎无法正确地念出你的咒语。 +紧致口球 +A gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +一个由红色柔软材料制成的口球,被扣的很紧。可以以一半的强度应用于脆弱的目标或上一回合施展过口头咒语的人。 +Huge Ball Gag +巨大号口球 +A massive gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +一个巨大的口球,由红色软材料制成,被扣的很紧。可以以一半的强度应用于脆弱的目标或上一回合施展过口头咒语的人。 +You absolutely can't enunciate your spells properly with this in. +佩戴上后,你绝对无法正确地念出你的咒语。 Magic Ball Gag 附魔口球 -A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. -一个被魔法迷住的插科打诨。它会长到填满你的嘴巴,所以你几乎不能说话。 +A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +一个被附魔的口球。它会长到填满你的嘴巴,所以你几乎不能说话。可以以一半的强度应用于脆弱的目标或上一回合施展过口头咒语的人。 It's brimming with conjured energy. A normal knife won't work here! 它充满了魔法能量。普通的刀在这里是行不通的! +Anti-Magic Gag +反魔法口塞 +A gag designed to cripple mages. It's made of a squishy rubbery material. +旨在削弱法师的口塞。它由柔软的橡胶材料制成。 +It's sealed with a magical spell that rapidly absorbs mana! When it drains 40 mana it will transform into an ordinary gag and inflate. +它被封印着快速吸收法力的魔法咒语!当它耗尽 40 点法力时,它会变成一个普通的口塞并膨胀。 +Anti-Mage Gag +反法师口塞 +A gag designed to cripple experienced spellcasters. It's made of a magic-absorbing rubber. +旨在削弱经验丰富的法师的口塞。它是由吸魔橡胶制成的。 +You feel the energy flowing out of you! When it drains 100 mana it will transform into an ordinary gag and inflate. +你感觉到能量从你身上流出!当它耗尽 100 点法力时,它会变成一个普通的口塞并膨胀。 Ballet Heels 芭蕾高跟鞋 A pair of shoes with heels so tall it forces you on your toes. 一双鞋跟太高,会迫使你踮起脚尖。 These will take some getting used to. 这些需要一些时间来适应。 +Training Heels +训练高跟鞋 +A pair of unreasonably high heels owned by you personally. +你个人拥有的一双高得离谱的高跟鞋。 Leg Irons 钢腿铐 A pair of solid steel cuffs connecting your ankles inescapably. 一双实心钢制手铐不可避免地连接着你的脚踝。 -The lock doesn't seem very complicated. -锁似乎不是很复杂。 Blindfold 眼罩 A leather strap secured onto your face and blocking vision. -一条皮带固定在您的脸上并阻挡视线。 +一条皮带固定在你的脸上并阻挡视线。 You can still see through the gap around your nose. -您仍然可以通过鼻子周围的缝隙看到。 +你仍然可以通过鼻子周围的缝隙看到。 + + +Magic Chastity Belt +魔法贞操带 +A belt protected by a magic seal. +被魔法封印保护贞操带。 +The shields will open up to accept new toys, but won't let them out... +会打开并接受新玩具,但不会让它们出来...... Steel Chastity Belt 钢制贞操带 A cruel device used for locking magical vibrators in place. 用于锁定魔法振动器的残忍装置。 -The shields will open up to accept new toys, but won't let them out... -会打开并接受新玩具,但不会让它们出来...... +Blacksteel Belt +黑钢贞操带 +Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. +黑钢是旧文明使用的金属。划伤都非常困难,更不用说切割了。 +Blacksteel Bra +黑钢文胸 +A cruel device used for locking magical massagers in place. +用于锁定魔法按摩器的残忍装置。 Prototype Belt 原型贞操带 A strange device built using unknown technology. @@ -3802,22 +7630,16 @@ The lock is extremely advanced, and the ports at the bottom readily accept toys 锁非常先进,底部的端口很容易接受玩具但不会让它们出来...... Steel Chastity Bra 钢制贞操文胸 -A cruel device used for locking magical massagers in place. -用于锁定魔法按摩器的残忍装置。 It won't stop the dungeon's little curses, but will keep you from removing them. 它不会阻止地牢的小诅咒,但会阻止你移除它们。 Ornate Chastity Belt -华丽贞操腰带 -A cruel device used for locking magical vibrators in place. -用于锁定魔法振动器的残忍装置。 +华丽贞操带 The lock won't come off until the magic wears off in time... 直到魔法消退,锁才会解开…… Ornate Chastity Bra 华丽贞操文胸 -A cruel device used for locking magical massagers in place. -用于锁定魔法按摩器的残忍装置。 -The lock won't come off until the magic wears off in time... -直到魔法及时消退,锁才会解开…… + + Maid Chastity Belt 女仆贞操带 A chastity belt used to maintain control over initiate maids. @@ -3828,170 +7650,146 @@ Magic Egg 附魔跳蛋 An energetic little friend that likes to tease you. 一个喜欢挑逗你的带有能量的小玩具。 -It is charged by residual magic from your spells. -它由你的法术残留的魔法充电。 +It is charged by residual magic from your spells. Type: Teasing +它由你的法术残留的魔力充电。类型 : ‎戏弄 Prototype Egg 原型跳蛋 A teaser that periodically vibrates. 周期性振动的小玩具。 -High efficiency mana conversion means longer tease duration. -高效率法力转换意味着更长的振动持续时间。 +High efficiency mana conversion means longer tease duration. Type: Teasing, Pleasure, Edging +高效率魔力转换意味着更长的振动持续时间。类型 : ‎戏弄、快感、寸止 Vibrating Plug 振动塞 A sizeable plug that makes you happy... a little too happy. 一个让你开心的大插头……有点太开心了。 -It vibrates periodically and allows orgasms. -它会定期振动并允许性高潮。 +It vibrates periodically and adds distraction when moving. Type: Pleasure +它会定期振动并在移动时提高性奋值。类型 : ‎快感 Teaser Plug 逗弄塞 A sizeable plug that will tease you but never let you go... -一个相当大的插头,会挑逗你,但永远不会让你高潮...... -It vibrates weakly periodically. -它周期性地微弱振动。 +一个相当大的肛塞,会挑逗你,但永远不会让你高潮...... +It vibrates weakly periodically. Type: Teasing, Denial +它周期性地微弱振动。类型 : ‎戏弄、拒绝 Torment Plug 折磨塞 A sizeable plug that will make your life unbearably pleasurable... -一个相当大的插头,会让你的生活变得难以忍受...... -It vibrates strongly periodically and has a denial setting. -它周期性地强烈振动并具有拒绝设置。 +一个相当大的塞子,会让你的生活变得难以忍受...... +It vibrates strongly periodically and has a denial setting. Type: Denial +它周期性地强烈振动并具有拒绝设置。类型 : ‎拒绝 +Thundering Plug +雷霆塞 +Enjoy it while you can. Type: Pleasure, Edging +当你有空的时候好好享受它。类型 : ‎快感、寸止 +Intense Training Plug +强化训练塞 +An energetic plug that will make your life unbearably pleasurable... +一个震动幅度相当大的塞子,会让你的生活变得难以忍受...... +You're going to have the time of your life. Type: Pleasure, and lots of it +你将会度过一生中最美好的时光。类型 : ‎快感,而且很多 + + +Rear Vibrating Plug +后庭振动塞 +A device that attacks from multiple angles. +从多个角度攻击的装置。 +An enjoyable experience. Type: Edging +一次愉快的经历。 类型 : ‎寸止 + + Maid Egg 女仆跳蛋 An energetic little friend that likes to tease you and takes orders from the head maid. 精力充沛的小伙伴,会挑逗你,听从女仆长的吩咐。 -It is charged by residual magic from your spells. -它由你的法术残留的魔法充电。 +It is charged by residual magic from your spells. Type: Teasing, Edging +它由你的法术残留的魔力充电。类型 : ‎戏弄、寸止 + + +Stainless Plug (F) +不锈钢塞子 (F) +A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... +一个不会振动的沉重塞子,但你肯定会注意到它在你体内四处活动...... +This one goes in the front. +这个塞在前面。 +Stainless Plug (R) +不锈钢塞子 (R) +This one goes in the back. +这个塞在后面。 + + Shadow Hand Gag -影之手口球 +影之手口塞 It clasps tightly over the mouth and prevents you from casting your spells! 它紧紧地扣在嘴上,阻止你施法! You have no choice but to struggle. 你别无选择,只能挣扎。 -Wrist Rope -腕部绳缚 -A box tie keeping your arms secured behind your back. -将您的手臂牢牢固定在背后。 -The ropes squeeze you gently. -绳索轻轻地压迫你。 -Rope Cuffs -绳手铐 -A quick tie for apprehending prisoners. -用于逮捕囚犯的快速捆绑。 -It's not very secure. -这不是很牢固。 -Rope Hogtie -驷马 -A very strict and tight hogtie, good for subduing unruly captives. -一种非常严苛和牢固的捆绑,适合制服不守规矩的俘虏。 -It's very secure. You tug on the rope connecting your feet and struggle. -这是非常安全的。你需要首先挣扎开连接你腿的绳子。 -Rope Belt -绳衣 -A harness acting as a handle to pull you around -能使你被拉住的绳衣 -The ropes squeeze you gently. -绳索轻轻地压迫你。 -Crotch Rope -下体绳缚 -A tight rope impressing upon your most private areas... -一条紧绷的绳索压迫在您最私密的区域...... -The ropes squeeze you gently. -绳索轻轻地压迫你。 -Wrist Rope -手腕绳缚 -A wrist and elbow tie keeping your arms secured behind your back. -手腕和肘部系带将您的手臂固定在背后。 -The ropes squeeze you gently. -绳索轻轻地压迫你。 -Leg Ropes -腿部绳缚 -A tie that hobbles your legs together.. -一条能把你的腿绑在一起的捆绑。。 -The ropes squeeze you gently. -绳索轻轻地压迫你。 -Ankle Ropes -脚踝绳缚 -A tie keeping your feet secured together. -一条将双脚固定在一起的捆绑。 -The ropes squeeze you gently. -绳索轻轻地压迫你。 -Holy Wrist Rope -手腕绳缚(神圣) -A box tie keeping your arms secured behind your back. -将您的手臂咯老固定在背后。 -They are aware of your movements... -它会对你的动作产生反应... -Holy Rope Cuffs -绳手铐(神圣) -A quick tie for apprehending prisoners. -用于逮捕囚犯的快速捆绑。 -They are aware of your movements... -它会对你的动作产生反应... -Holy Rope Belt -绳衣(神圣) -A harness acting as a handle to pull you around -能使你被拉住的绳衣 -They are aware of your movements... -它会对你的动作产生反应... -Holy Crotch Rope -下体绳缚(神圣) -A tight rope impressing upon your most private areas... -一条紧绷的绳索压迫在您最私密的区域...... -They are aware of your movements... -它会对你的动作产生反应... -Holy Wrist Rope -手腕绳缚(神圣) -A wrist and elbow tie keeping your arms secured behind your back. -手腕和肘部系带将您的手臂固定在背后。 -They are aware of your movements... -它会对你的动作产生反应... -Holy Leg Ropes -腿部绳缚(神圣) -A tie that hobbles your legs together.. -一条能把你的腿绑在一起的绳缚。。 -They are aware of your movements... -它会对你的动作产生反应... -Holy Ankle Ropes -脚踝绳缚(神圣) -A tie keeping your feet secured together. -一条将双脚固定在一起的捆绑。 -They are aware of your movements... -它会对你的动作产生反应... +Shadow Hand Eyes +影之手 ( 眼 ) +Shadow hands clasped over your eyes, making it hard to see. +影之手捂住你的眼睛,让你看不清任何事物。 + + +Shadow Hands (Legs) +影之手 ( 腿 ) +They are wrapped around your legs! +它们缠绕在你的腿上! + + +Shadow Hands (Arms) +影之手 ( 手臂 ) +They are squeezing you tightly! +它们紧紧地压着你! + + +Shadow Hands (Feet) +影之手 ( 脚 ) +They are holding your feet together! +它们把你的脚并在一起! + + +Shadow Hands... +影之手…… +They are holding your... uh... +它们抓住你的……呃…… + + Wrist Vines 手腕藤蔓捆绑 A box tie keeping your arms secured behind your back. -一条盒子捆绑,将您的手臂固定在背后。 +将你的手臂牢牢固定在背后。 The vines twitch as they try to wrap around tighter. 藤蔓在试图缠绕得更紧时抽搐。 Vine Harness 藤制绳衣 A harness acting as a handle to pull you around 能使你被拉住的绳衣 -The vines twitch as they try to wrap around tighter. -藤蔓在试图缠绕得更紧时抽搐。 Leg Vines 腿部藤蔓捆绑 A tie that hobbles your legs together.. -把你的腿绑在一起。。。 -The vines twitch as they try to wrap around tighter. -藤蔓在试图缠绕得更紧时抽搐。 +一条带子将你的双腿束缚在一起。 Ankle Vines 脚踝藤蔓捆绑 A tie keeping your feet secured together. -一条将双脚固定在一起的捆绑。 -The vines twitch as they try to wrap around tighter. -藤蔓在试图缠绕得更紧时抽搐。 -Quik-Bind Cuffs -快速绑定手铐 -A set of high-security cuffs that are both restrictive and quick to apply. -一套高度安全的手铐,既具有限制性又可以快速应用。 -It uses a twelve-disc detainer lock. -它使用一个十二盘扣锁。 +束带将双脚固定在一起。 + + +High-Security Cuffs +高安全性手铐 +A set of irish-8-style cuffs that are both restrictive and quick to apply. Can be applied on vulnerable targets if targeted from inventory or hotbar. +一套爱尔兰 8 式手铐,既具有束缚性又可快速佩戴。如果在库存或快捷栏中锁定,则可对脆弱对象使用。 +It uses a standard lock rather than a simple one. +它使用标准锁而不是简单锁。 Wolfbinder -狼之束手套 +狼之单手套 A sophisticated training system used to keep wolfgirls from scratching their owners. -一个复杂的训练系统,用来防止狼女抓挠他们的主人。 +一个复杂的训练系统,用来防止狼娘抓挠他们的主人。 Despite the harsh position, it is padded, breathable, and suitable for long term wear. 尽管十分严苛,但它具有衬垫、透气性,适合长期佩戴。 +Wolf Queenbinder +狼娘王单手套 +This was made to be used during a coup attempt. Unfortunately, its creator ended up wearing it instead, after the coup's failure. +这枚戒指原本是为政变准备的。不幸的是,政变失败后,它的创造者反而戴上了它。 +Designed to hold the queen of wolves helpless for an indefinite period of time. +目的是让狼娘王无限期地陷入无助状态。 Smart Training Cuffs 智能训练手铐 Cuffs with a feature to punish the wearer if they act aggressively. @@ -4000,38 +7798,52 @@ They are solid metal and will be hard to remove without the key. 它们是实心金属,没有钥匙就很难取下。 Linked Smart Cuffs 链接智能手铐 -Cuffs with a feature to punish the wearer if they act aggressively. -手铐的特点是如果穿着者表现出侵略性,就会受到惩罚。 Looks like you got yourself in trouble. 看来你给自己惹了麻烦。 Training Harness 训练束衣 A harness that keeps a wolfgirl's suit together. It makes escaping more difficult. -将狼女的装备固定在一起的束带。这让逃跑变得更加困难。 +将狼娘的装备固定在一起的束带。这让逃跑变得更加困难。 While it is weatherproof and rugged, its straps are merely nylon. 虽然它防风雨且坚固耐用,但它的表带只是尼龙材质。 +Training Mittens +训练手套 +When wolfgirls won't keep those pesky claws in line, these will make sure she can't cause too much trouble. +当狼娘不肯控制住那些讨厌的爪子时,这些会确保她不会造成太多麻烦。 +Made from strong reinforced fabric, your claws won't do anything to these mittens. +这款手套采用坚固的加固织物制成,你的爪子不会对这些手套造成任何伤害。 Training Gag 训练口球 A gag used to prevent wolfgirls from biting their owners. -用来防止狼女咬主人的口球。 +用来防止狼娘咬主人的口球。 It is reinforced with steel cables, so getting it off will be tricky. 它是用钢索加固的,所以要把它取下来会很棘手。 Training Collar 训练项圈 -A collar used to keep unruly wolfgirls in check. -用来控制不守规矩的狼女的项圈。 -If it works on them, it sure as heck works on you. -如果它对他们有效,那么它肯定对你有效。 +A collar with a decorative tag used to identify wolfgirls. +带有装饰标签的项圈,用于识别狼娘。 +Also good for identifying people in general. What a great idea! +也有助于识别一般人。真是个好主意! Training Leash 训练牵绳 A leash used for training pets. 用于训练宠物的牵绳。 It is a steel cable with a weatherproof rubber coating, and a convenient handle. 它是一种带有防风雨橡胶涂层的钢缆和一个方便的手柄。 +Magical Leash +魔法牵引绳 +A leash made of magical energy, linked to a submissive's collar. +魔法能量做成的牵引绳 与臣服者的项圈相连 +Very difficult to break unless you have a strong magical blade. +除非你有一把强大的魔法刀,否则很难挣脱。 + + Your ankle cuffs snap together on their own! -您的脚铐会自行扣合! +你的脚铐会自行扣合! Your ankle cuffs detach! 你的脚铐脱落! + + Asylum Muzzle 安全口套 The nurses use this on noisy patients! @@ -4039,9 +7851,9 @@ The nurses use this on noisy patients! It's sturdy leather... 它由坚固的皮革制成... Asylum Jacket -安全夹克 +精神病拘束衣 A straitjacket that keeps patients out of trouble. -一种使患者摆脱麻烦的紧身衣。 +一种使患者摆脱麻烦的拘束衣。 It has many straps and is very difficult to escape. 它有许多皮带,很难逃脱。 Asylum Legbinder @@ -4050,20 +7862,60 @@ This legbinder will keep the patient from kicking the nurses. 该腿套将阻止患者踢护士。 It has both laces and straps. 它既有鞋带和皮带。 + + Asylum Ankle Cuffs 安全脚铐 A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -一双由增强皮革制成的链式袖口。 他们使患者更容易捕获。 +一双由增强皮革制成的链式铐。 他们使患者更容易捕获。 They can be thrown from long distances. -它们可以从长距离扔掉。 -The enemy attaches your ankle cuffs together! -敌人将您的链式脚铐固定在一起! -Cuffs Chain -安全链式脚踝铐 -The ankle cuff chain detaches! -链式脚踝铐脱离! +它们可以从长距离扔出。 + + Asylum Leg Cuffs 安全足拷 + + +They are made of a steel alloy. +它们是用钢合金制成的。 + + +Transport Jacket +运输拘束衣 +This jacket goes over a straitjacket to keep the arms trapped. +这件拘束衣套在拘束衣外面,可以锁住胳膊。 +It makes it extraordinarily difficult to escape the jacket it covers. +这使得摆脱它所覆盖的外壳变得极其困难。 + + +Living Asylum Collar +活体安全项圈 +A collar made of tough cowhide that adjusts itself to your neck. +由坚韧的牛皮制成的项圈,可以自行调整以贴合你的颈部。 +It will occasionally cause asylum gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of asylum gear you have on you. +它偶尔会使得安全装备突然出现并束缚佩戴者。效果的速度增加取决于你身上的安全装备数量。 + + +Asylum Cuffs +安全铐 +A pair of leather cuffs that make it easy to restrain you. +一对皮革铐,可以轻松束缚您。 +They're made of tough cowhide. +它们由坚韧的牛皮制成。 + + +A pair of leather cuffs keeping your arms behind your back. +一对皮革手铐将你的手臂束缚在背后。 + + +A full set of leather cuffs keeping your arms in a strict elbow tie! +全套皮革手铐,将你的手臂严格地绑在肘部! + + +A pair of leather cuffs keeping your elbows locked together!. +一对皮革手铐将你的肘部固定在一起! + + Comfy Muzzle 舒适口套 A lovely muzzle that's extraordinarily comfy! @@ -4076,680 +7928,784 @@ A straitjacket that is padded on the inside. 里面有衬垫的拘束衣。 It feels tight but is actually made of an ethereal material... 它感觉很紧,但实际上是由一种空灵的材料制成的…… + + Latex Jacket -乳胶夹克 -A tight jacket that holds your arms completely useless. -一件紧身夹克,让你的手臂完全无法移动。 -It has too much grip to struggle out of -它过于贴合,无法挣脱 +乳胶拘束衣 +A tight jacket that keeps your arms completely useless. +一件拘束衣,让你的手臂完全无法移动。 +It has too much grip to struggle out of, but is made of a fragile material. +它的抓力太大,难以挣脱,但它是由易碎材料制成的。 +Secure Latex Jacket +安全乳胶拘束衣 +This straitjacket has extra straps and buckles to make sure you won't be struggling out of it. +这件拘束衣有额外的带子和扣子,确保你不会通过挣扎而脱下它。 Latex Armbinder -乳胶束手套 -A tight armbinder that pins your arms tightly behind your back -一个紧绷的束手套,将你的手臂紧紧地固定在你的背后 -It has too much grip to struggle out of -它过于贴合,无法挣脱 +乳胶单手套 +A tight armbinder that pins your arms tightly behind your back, enclosed completely. +一种紧密的单手套,将你的手臂紧紧地固定在背后,完全封闭。 +Latex Boxbinder +乳胶盒式单手套 Latex Legbinder 乳胶束腿套 A tight legbinder that keeps your legs together! 一个紧绷的束腿套,让你的双腿保持在一起! -It has too much grip to struggle out of -它过于贴合,无法挣脱 Latex Boots 乳胶靴 A tight pair of boots that makes it difficult to walk! 一双紧脚的靴子,走路都难受! -It has too much grip to struggle out of -它过于贴合,无法挣脱 Heavy Latex Corset 重型乳胶束胸 -An excruciatingly tight corset that hugs your body -相当紧的胸衣,紧贴您的身体 -It has too much grip to struggle out of -它过于贴合,无法挣脱 -Blue Latex Catsuit -蓝色乳胶束胸 +An excruciatingly tight corset that hugs your body, with straps securing your other restraints. +紧紧收缩的束胸,并用带子固定您的其他拘束具。 A skintight suit that's stretched on tight. It adheres to latex restraints making struggling more difficult. -紧紧收缩的束胸。 乳胶约束的粘附性使挣扎变得更加困难。 +紧紧收缩的束胸。乳胶拘束的粘附性使挣扎变得更加困难。 Blue latex is silky smooth, very stretchy, and very good at adhering to itself. 蓝色乳胶丝滑光滑,非常弹性,并且非常擅长粘附。 +Heavy Latex Catsuit +厚重乳胶紧身衣 +A skintight suit that's stretched on tight and made of thick latex. It adheres to latex restraints making struggling more difficult. +紧身衣,紧绷绷的,由厚厚的乳胶制成。它紧贴乳胶束缚带,使挣扎更加困难。 +Blue latex is silky smooth, very stretchy, and very good at adhering to itself. Its thickness makes it particularly resistant to cutting. +蓝色乳胶光滑如丝,弹性十足,粘性极佳。其厚度使其特别耐切割。 +Latex Mittens +乳胶手套 +A pair of mittens keep your hands out of trouble. They adhere to latex restraints making struggling more difficult. +一副手套可以保护你的手不惹麻烦。它们紧贴乳胶束缚带,使挣扎更加困难。 + + +Latex Cube +乳胶立方体 +A gelatinous cube that engulfed you at some point in the past. +一个凝胶状的立方体,在过去的某个时刻吞没了你。 +It seems quite content staying where it is. +它在原地似乎很满足。 +Slime Bubble +粘液泡泡 +A squishy and sticky bubble that you can't get out of! +一个又软又粘的泡泡,你无法挣脱! +It will slow you down severely but can be popped if you can reach a knife... +它会严重减慢你的速度,但如果你能拿到刀,它就会从你身体弹出...... +Latex Sphere +乳胶球 +A giant inflatable sphere that compresses you and leaves you helpless... +一个巨大的充气球体压缩你并让你无助...... +You can't see out of it nor can you control its movement. If only you could puncture it! +你既看不到它,也无法控制它的运动。要是你能刺穿它就好了! +Latex Ball Suit +乳胶球服 +A giant inflatable sphere that leaves you rolling around... +一个巨大的充气球,让你滚来滚去...... +Your movement is severely hampered, limited to feeble wiggling... +你的行动受到严重阻碍,只能进行微弱的扭动...... +Bubble +泡泡 +A squishy bubble that you can't get out of! +一个软软的泡沫,你无法挣脱! + + +Scale Boxtie Binder +鳞片后手缚捆扎带 +A secure but comfortable binder meant for long-term wear by long-term prisoners of the Dragonhearts. +一种安全而舒适的捆扎带,适合龙之心的囚犯长期佩戴。 +It is made from durable dragonscale, but secured with ordinary buckles. +它由耐用的龙鳞制成,但用普通带扣固定。 Dragonscale Straps 龙鳞绑带 A set of straps buckling tightly around your body and secured at the wrists. -一组带子紧紧地扣在您的身体上并固定在手腕上。 +一组带子紧紧地扣在你的身体上并固定在手腕上。 It's made from hard-to-cut dragonscale!!! 它是由难以切割的龙鳞制成的!!! +Dragon Queen Straps +龙女皇背带 +A sturdy harness completely immobilizes your arms and torso. Made to be used on a queen of dragons. +一个坚固的安全带可以完全固定你的手臂和躯干。用于龙之女皇。 +It's made from reinforced dragonscale!!! +它是由强化龙鳞制成的!!! Scale Leg Cuffs -龙鳞腿袖 -Scale Ankle Cuffs -龙鳞脚铐 -Scale Cuffs Chain -链式龙鳞脚铐 -Dragonscale Cuffs -龙鳞铐 -A pair of chained cuffs made of dragonscale. They slow your stride. -一对龙鳞制成的锁链铐。他们减慢你的步伐。 -It's made from hard-to-cut dragonscale!!! -它是由难以切割的龙鳞制成的!!! -Dragonscale Cuffs -龙鳞铐 +鳞片腿铐 A pair of chained cuffs made of dragonscale. They slow your stride. 一对龙鳞制成的锁链铐。他们减慢你的步伐。 -It's made from hard-to-cut dragonscale!!! -它是由难以切割的龙鳞制成的!!! -The enemy attaches your ankle cuffs together! -敌人将你的脚铐绑在一起! -Linked Scale Cuffs -连接鳞片手铐 -A pair of chained cuffs made of dragonscale. They slow your stride. -一对龙鳞制成的锁链手铐。他们减慢你的步伐。 -It's made from hard-to-cut dragonscale!!! -它是由难以切割的龙鳞制成的!!! -The ankle cuff chain detaches! -脚铐链脱落! +Scale Ankle Cuffs +鳞片脚铐 +Scale Cuffs Chain +链式鳞片脚铐 Dragonscale Boots 龙鳞长靴 A pair of extremely high heels lined with dragonscale. They are hard to walk in. 一双镶有龙鳞的极高高跟鞋。穿着它很难行走。 -It's made from hard-to-cut dragonscale!!! -它是由难以切割的龙鳞制成的!!! Dragonscale Gag 龙鳞口塞 A gag made of a squishy material and secured with dragonscale straps. 一个由柔软的材料制成并用龙鳞带固定的口塞。 -It's made from hard-to-cut dragonscale!!! -它是由难以切割的龙鳞制成的!!! Dragonscale Muzzle 龙鳞口套 A muzzle to keep ball gags pressed firmly into the mouth. 一个口套,可将口球牢牢地压入嘴里。 -It's made from hard-to-cut dragonscale!!! -它是由难以切割的龙鳞制成的!!! Dragon Collar 龙项圈 A collar owned by the Dragonhearts, an order of dragonslayers. -龙之心:屠龙骑士团拥有的项圈。 -It's made from hard-to-cut dragonscale!!! -它是由难以切割的龙鳞制成的!!! -Leather Ankle Cuffs -皮革踝铐 -Leather Leg Cuffs -皮革腿铐 -A pair of chained cuffs made of leather. They make it trickier to run away. -一双由皮革制成的链式腿铐。 他们使逃跑变得更棘手。 -Leather Cuffs -皮革铐 -A pair of cuffs that make it easy to restrain you. -一对铐,易于束缚。 -They're made of tough cowhide. -它们由坚韧的牛皮制成。 -The enemy attaches your wrist cuffs together! -敌人将你的手腕铐在一起! -Lthr Wrist Chain -链接皮革手铐 -A pair of cuffs keeping your arms behind your back. -一对手铐将您的手臂束缚在背后。 -They're made of tough cowhide. -它们由坚韧的牛皮制成。 -Your cuffs detatch! -你的手铐松了! -The enemy attaches your elbow cuffs together! -敌人将你的肘部手铐绑在一起! -Lthr Wrist Chain -链接皮革肘部手铐 -A pair of cuffs keeping your arms in a strict elbow tie! -一对手铐使您的手臂保持严格的肘部捆绑! -They're made of tough cowhide. -它们由坚韧的牛皮制成。 -Your wrists detatch, leaving your elbows still bound! -你的手腕松开了,你的手肘仍然被束缚着! -Lthr Elbow Chain -皮革肘部手铐 -A pair of cuffs keeping your elbows locked together!. -一对手铐将您的肘部固定在一起! -They're made of tough cowhide. -它们由坚韧的牛皮制成。 -Your elbows detatch! -你的手肘处手铐断开了! -The enemy attaches your wrist cuffs back together! -敌人将你的手腕重新绑在一起! -Scale Wrist Chain -鳞片手铐 -A pair of cuffs that make it easy to restrain you. -一对手铐,易于束缚。 -They're made of dragonscale. -它们是由龙鳞制成的。 -The enemy attaches your wrist cuffs together! -敌人将你的手腕铐在一起! -Scale Wrist Chain -鳞片手铐 -A pair of cuffs keeping your arms behind your back. -一对手铐将您的手臂放在背后。 -They're made of dragonscale. -它们是由龙鳞制成的。 -Your cuffs detatch! -你的手铐松了! -The enemy attaches your elbow cuffs together! -敌人将你的肘部手铐绑在一起! -Scale Elbow Chain -连接鳞片肘部手铐 -A pair of cuffs keeping your arms in a strict elbow tie! -一对手铐使您的手臂保持严格的肘部捆绑! -They're made of dragonscale. -它们是由龙鳞制成的。 -Your wrists detatch, leaving your elbows still bound! -你的手腕松开了,你的手肘仍然被束缚着! -Scale Elbow Cuffs -鳞片肘部手铐 -A pair of cuffs keeping your elbows locked together!. -一对手铐将您的肘部固定在一起! -They're made of dragonscale. -它们是由龙鳞制成的。 -Your elbows detatch! -你的手肘手铐断开了! -The enemy attaches your wrist cuffs back together! -敌人将你的手腕重新绑在一起! -Latex Jacket -乳胶夹克 +龙心教团拥有的项圈 ,一个‎屠龙组织。 + + +Steel Cuffs +钢铐 +A pair of steel cuffs that make it easy to restrain you. +一对钢制手铐,可以轻松束缚你。 +They're made of shining steel. +它们由闪亮的钢制成。 + + +Steel Wrist Chain +钢腕链 +A pair of steel cuffs keeping your arms behind your back. +一对钢手铐将你的手臂固定在背后。 + + +Magnetic Cuffs +磁性铐 +A pair of bulky cuffs with coils visible on the inside... +一对笨重的铐子,里面有线圈可见...... +They have no visible attachment points... +它们没有可见的附着点... +The electric damage causes your cuffs to attach together! +受到电击伤害会导致你的铐子绑在一起! + + +Magnetic Link +磁性链接 +The magnetic cuffs are rigidly attached! +磁性铐牢牢固定! +They won't budge! There's a button to release them but it's hard to reach... +它们不会松动!有一个按钮可以解开它们,但很难够到...... + + +Magnetic Ankle Cuffs +磁性踝铐 +A pair of bulky leg irons with coils visible on the inside. +一对笨重的脚镣,内部可见线圈。 +The electric damage causes your ankle cuffs to snap together! +受到电击伤害会导致你的踝铐绑在一起! + + +Your ankle cuffs detatch! +你的脚铐脱落了! + + + + +Living Blacksteel Collar +活体黑钢项圈 +A collar made of a hardened steel alloy, chemically treated as to be stainless that adjusts itself to your neck. +一种由硬化钢合金制成的项圈,经过化学处理,可以适应你的颈部。 +It will occasionally cause blacksteel to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of blacksteel you have on you. +它偶尔会使得黑钢突然出现,并束缚佩戴者。效果增加的速度基于你身上的黑钢数量。 + + +Blacksteel Cuffs +黑钢铐 +They are made of a hardened steel alloy, chemically treated as to be stainless. +它们由硬化钢合金制成,经过化学处理成为不锈钢。 + + + + +Blacksteel Leg Cuffs +黑钢腿铐 + + +Blacksteel Ankle Cuffs +黑钢踝铐 + + + + + + + + +Dragonscale Cuffs +龙鳞铐 +They are made from leather cured from the hide of dragons. +它们是由龙皮腌制而成的皮革制成。 + + + + +Dragonscale Leg Cuffs +龙鳞腿铐 + + +Dragonscale Ankle Cuffs +龙鳞脚铐 + + + + +Maid Jacket +女仆拘束衣 A bolero jacket keeping your arms pinned snugly. You can't even move them. -一件波莱罗夹克,让你的手臂紧紧地固定在一起。你甚至不能移动它们。 +一件波莱罗拘束衣,让你的手臂紧紧地固定在一起。你甚至不能移动它们。 There is no hope of struggling out. Better hope you can cut it... 没有挣扎的希望。最好希望你能切开它... -Maid Jacket -女仆夹克 -A bolero jacket keeping your arms pinned snugly. You can't even move them. -一件布洛罗夹克,保持双臂紧密地钉住。 您甚至无法移动它们。 +Maid Punishment Jacket +女仆惩罚拘束衣 +A bolero straitjacket made for unruly maids. It is extra secure and locked tightly. +为不守规矩的女仆做的一件紧身拘束衣。它特别安全,且锁得很紧。 +There is no hope of struggling out. Better get back to work... +没有挣扎的希望。最好回去工作。。。 Devious Maid Costume -狡猾的女仆服装 +阴险的女仆服装 A devious maid outfit that forces the arms into an elbows-touching position. -一个狡猾的女仆服装,迫使手臂进入肘部接触的姿势。 +一套阴险的女仆装,强迫手臂处于手肘相互紧贴的姿势。 Makes sure you focus on your work and not fooling around. -确保您专注于工作而不是欺骗。 +确保你专注于你的工作而不是闲逛。 Reinforced Leather Belt 强化皮革绑带 A leather belt used to keep your legs hobbled. 用来保持双腿跛行的皮带。 It's made of a very tough reinforced leather. It will take some time to cut. -它由非常坚韧的强化皮革制成。需要一些时间来削减。 -Steel Cuffs -钢铐 +它由非常坚韧的强化皮革制成。切开它需要一些时间。 +Maid Cuffs +女仆铐 A pair of steel cuffs used by the Maidforce. 女仆势力使用的一对钢铐。 They are made of solid steel. 它们由实心钢制成。 -The enemy attaches your ankle cuffs together! -敌人将你的脚铐绑在一起! -Linked Steel Cuffs -连接钢铐 -A pair of steel cuffs used by the Maidforce. -Maidforce 使用的一对钢制铐。 -They are made of solid steel. -它们由实心钢制成。 -The ankle cuff chain detaches! -脚铐链脱落! +Maid Cuff Link +连接女仆铐 + + Maid Collar 女仆项圈 A collar for operatives of the Maidforce, a group of covert saboteurs. 女仆势力特工的项圈,一群隐蔽的破坏者。 It's reinforced with metal and guarded with an expert-level lock. 它采用金属加固,并配有专家级锁。 -Plug Gag -塞子口塞 +Maid Gag +女仆口塞 A gag with a long, mouth-filling plug that muffles speech completely. -一种带有长长的塞子的塞子,可以完全抑制讲话。 -It's made of a very tough reinforced leather. It will take some time to cut. -它由非常坚韧的强化皮革制成。需要一些时间来削减。 +一种带有长长的塞子的口塞,可以让佩戴者完全说不出话。 +Maid Security Gag +女仆安全口塞 +A muzzle with a long, mouth-filling plug that muffles speech completely. +一种带有长长的塞子的口套,可以让佩戴者完全说不出话。 +Reinforced and secured with a disc lock to ensure unruly maids don't skip their duty. +用圆盘锁加固和固定,以确保不守规矩的女仆不会玩忽职守。 + + +Suspicious Mask +可疑的面具 +A well-fitted mask, covering your entire head neatly and locking in place. +一款合身的面罩,整齐地覆盖你的整个头部并锁定到位。 +It has eyeholes for you to somewhat see out of, but blocks access to the face. +它有眼孔供你向外看,但挡住了接触脸部的通道。 + + +Happy Face +高兴的脸 +Just put on a happy face and enjoy it. +戴上笑脸,好好享受吧。 + + +Sensory Hood +感官丧失头罩 +A well-fitted hood that covers your head and muffles sounds. +一个合身的头罩,可以遮住你的脸并掩盖声音。 +No eyeholes. Integrated blindfold and gag. Total darkness. +没有任何洞孔。集成眼罩和口塞。完全黑暗 + + +Sensory Mask +感官丧失面具 +A well-fitted mask that covers your face and muffles sounds. +一个合身的面具,可以遮住你的脸并掩盖声音。 + + +Shadow Heels +暗影高跟鞋 +A set of impractical heels that clasp around your ankles. They make it hard to walk. +一套不切实际的高跟鞋,紧箍着你的脚踝。它们使行走变得困难 +The material is stronger than leather, and flexes to make struggling difficult. +这种材料比皮革更坚固,并且可以弯曲,使挣扎变得困难。 +Shadow Jacket +暗影拘束衣 +A tight straitjacket made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +由超凡材料制成的拘束衣。它闪亮且反光,当你观察自己的困境时,你可以看到星星在闪烁。 +Its grip encases you tightly, but the material is weaker than most metals. +它的握力将你紧紧包裹住,但其材料比大多数金属都脆弱。 +Black Hole Jacket +黑洞拘束衣 +Like a black hole, anything that is caught in this jacket has no chance to escape its grasp. +就像黑洞一样,任何被夹在这件拘束衣里的东西都没有机会逃脱它的控制。 +Shadow Armbinder +暗影单手套 +A tight armbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +由超凡材料制成的单手套。它闪亮且反光,当你观察自己的困境时,你可以看到星星在闪烁。 +Black Hole Armbinder +黑洞单手套 +Like a black hole, anything that is caught in this armbinder has no chance to escape its grasp. +就像黑洞一样,任何被夹在这个单手套里的东西都没有机会逃脱它的控制 +Shadow Boxbinder +暗影盒式单手套 +A tight boxbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +由超凡材料制成的盒式单手套。它闪亮且反光,当你观察自己的困境时,你可以看到星星在闪烁。 +Black Hole Boxbinder +黑洞盒式单手套 +Like a black hole, anything that is caught in this boxbinder has no chance to escape its grasp. +就像黑洞一样,任何被夹在这个束手套里的东西都没有机会逃脱它的控制 +Shadow Legbinder +暗影束腿套 +A tight legbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +由超凡材料制成的束腿套。它闪亮且反光,当你观察自己的困境时,你可以看到星星在闪烁。 +Shadow Latex Petsuit +暗影乳胶宠物套装 +A tight petsuit made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +由超凡材料制成的宠物套装。它闪亮且反光,当你观察自己的困境时,你可以看到星星在闪烁。 +Obsidian Yoke +黑曜石枷锁 +A yoke made from shining obsidian, stars glittering in the darkness. It pins your arms uselessly at your sides. +由闪亮的黑曜石制成的枷锁,星星在黑暗中闪闪发光。它将你无用的手臂固定在身体两侧。 +It's made of a dark, glistening volcanic metal. +它是由一种深色的、闪闪发光的火山金属制成的。 + + Obsidian Muzzle 黑曜石口套 A muzzle made from segmented metal pieces, fitting securely over your face. -由分段金属片制成的口套,牢固地贴在您的脸上。 -It's made of a dark, glistening volcanic metal. -它是由一种深色的、闪闪发光的火山金属制成的。 +由分段金属片制成的口套,牢固地贴在你的脸上。 + + Obsidian Collar 黑曜石项圈 A collar made from a warm, shining alloy. 由温暖、闪亮的合金制成的项圈。 -It's made of a dark, glistening volcanic metal. -它是由一种深色的、闪闪发光的火山金属制成的。 + + +Living Obsidian Collar +活体黑曜石项圈 +A collar made of a dark, shiny metal that adjusts itself to your neck. You can't help but hear whispering since it is so tight. +一种由深色、有光泽的金属制成的项圈,可以根据你的脖子进行调整。由于太紧,你不禁会听到窃窃私语。 +It will occasionally cause obsidian to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of obsidian you have on you. +它偶尔使得黑曜石突然出现并束缚佩戴者。效果的速度增加基于你身上的黑曜石数量。 + + Obsidian Cuffs 黑曜石手铐 -A pair of cuffs that make it easy to restrain you. -一对手铐,让你轻松束缚。 -It's made of a dark, glistening volcanic metal. -它是由一种深色的、闪闪发光的火山金属制成的。 -The enemy attaches your wrist cuffs together! -敌人将你的手腕铐在一起! -Obs. Wrist Chain -连接黑曜石手铐 -A pair of cuffs keeping your arms behind your back. -一对手铐将您的手臂绑在背后。 -It's made of a dark, glistening volcanic metal. -它是由一种深色的、闪闪发光的火山金属制成的。 -Your cuffs detatch! -你的手铐松了! -The enemy attaches your elbow cuffs together! -敌人将你的肘部手铐绑在一起! -Obs. Wrist Chain -连接黑曜石肘部手铐 -A pair of cuffs keeping your arms in a strict elbow tie! -一对手铐使您的手臂保持严格的肘部捆绑! -It's made of a dark, glistening volcanic metal. -它是由一种深色的、闪闪发光的火山金属制成的。 -Your wrists detatch, leaving your elbows still bound! -你的手腕松开了,你的手肘仍然被束缚着! -Obs. Elbow Chain -黑曜石肘部手铐 -A pair of cuffs keeping your elbows locked together!. -一对手铐将您的肘部固定在一起! -It's made of a dark, glistening volcanic metal. -它是由一种深色的、闪闪发光的火山金属制成的。 -Your elbows detatch! -你的手肘手铐断开了! -The enemy attaches your wrist cuffs back together! -敌人将你的手腕重新绑在一起! +It's made of a dark, shiny metal. If you hold it close you hear whispering. +它是由一种深色的、闪闪发光的金属制成的。如果你靠近它,你会听到一阵窃窃私语。 + + + + Obsidian Leg Cuffs 黑曜石腿铐 -A pair of cuffs chaining your legs together. -一对手铐将你的双腿拴在一起。 -It's made of a dark, glistening volcanic metal. -它是由一种深色的、闪闪发光的火山金属制成的。 + + Obsidian Ankle Cuffs 黑曜石脚铐 -A pair of cuffs chaining your legs together. -一对手铐将你的双腿拴在一起。 -It's made of a dark, glistening volcanic metal. -它是由一种深色的、闪闪发光的火山金属制成的。 -The enemy attaches your ankle cuffs together! -敌人将你的脚铐绑在一起! -Cuffs Chain -链式黑曜石脚铐 -A pair of cuffs chaining your legs together. -一对手铐将你的双腿拴在一起。 -It's made of a dark, glistening volcanic metal. -它是由一种深色的、闪闪发光的火山金属制成的。 -The ankle cuff chain detaches! -脚铐链脱落! + + +Living Crystal Collar +活体结晶项圈 +A collar made of a glowing, brittle material that adjusts itself to your neck. You feel your energy flowing into it... +一种由发光的脆性材料制成的项圈,可以根据你的脖子进行调整。你感觉到你的能量流入其中... +It will occasionally cause crystal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of crystal you have on you. +它偶尔会使得结晶突然出现并束缚佩戴者。效果的速度增加取决于你身上的结晶数量。 + + Crystal Cuffs -水晶手铐 -A pair of cuffs that make it easy to restrain you. -一对手铐,让你轻松束缚。 -It's made of a glowing, brittle material. -它由发光的易碎材料制成。 -The enemy attaches your wrist cuffs together! -敌人将你的手腕铐在一起! -Linked Crystal Cuffs -链接水晶手铐 -A pair of cuffs keeping your arms behind your back. -一对手铐将您的手臂放在背后。 -It's made of a glowing, brittle material. -它由发光的易碎材料制成。 -Your cuffs detatch! -你的手铐松了! -The enemy attaches your elbow cuffs together! -敌人将你的肘部手铐绑在一起! -Linked Crystal Elbow Cuffs -链接水晶肘形手铐 -A pair of cuffs keeping your arms in a strict elbow tie! -一对手铐使您的手臂保持严格的肘部捆绑! -It's made of a glowing, brittle material. -它由发光的易碎材料制成。 -Your wrists detatch, leaving your elbows still bound! -你的手腕松开了,你的手肘仍然被束缚着! -Crystal Elbow Cuffs -水晶肘形手铐 -A pair of cuffs keeping your elbows locked together!. -一对手铐将您的肘部固定在一起! -It's made of a glowing, brittle material. +结晶手铐 +It's made of a glowing, brittle material. You feel your energy flowing into it... 它由发光的易碎材料制成。 -Your elbows detatch! -你的肘部手铐断开了! -The enemy attaches your wrist cuffs back together! -敌人将你的手腕重新绑在一起! + + + + Crystal Leg Cuffs -水晶腿手铐 -A pair of cuffs chaining your legs together. -一对手铐将你的双腿拴在一起。 -It's made of a glowing, brittle material. -它由发光的易碎材料制成。 +结晶腿铐 + + Crystal Ankle Cuffs -水晶脚铐 -A pair of cuffs chaining your legs together. -一对手铐将你的双腿拴在一起。 -It's made of a glowing, brittle material. -它由发光的易碎材料制成。 -The enemy attaches your ankle cuffs together! -敌人将你的脚铐绑在一起! -Linked Crystal Cuffs -链接水晶手铐 -A pair of cuffs chaining your legs together. -一对手铐将你的双腿拴在一起。 -It's made of a glowing, brittle material. -它由发光的易碎材料制成。 -The ankle cuff chain detaches! -脚铐链脱落! +结晶脚铐 + + +Living Ice Collar +活体冰项圈 +A collar made of enchanted ice that adjusts itself to your neck. It won't melt on their own, and the ice chills you to the bone... +一个由魔法冰制成的项圈,可以根据你的脖子进行调整。它不会自己融化,冰会让你彻骨发冷... +It will occasionally cause ice to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ice you have on you. +它偶尔会使得冰突然出现并束缚佩戴者。速度的增加效果取决于你身上的冰拘束具的数量。 + + +Ice Cuffs +冰铐 +They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... +它们是由魔法冰制成的。它们不会自行融化,但冰确实会让你感到寒冷刺骨…… + + + + +A pair of cuffs keeping your elbows locked together!. +一对手铐将你的肘部固定在一起! + + +Ice Leg Cuffs +冰腿铐 + + +Ice Ankle Cuffs +冰脚铐 + + +Living Slave Collar +活体奴隶项圈 +A collar made of a gold-tinted metal with a magical enchantment that adjusts itself to your neck. +一个由金色金属制成的项圈,带有一种神奇的魅力,可以根据你的脖子进行调整。 +It will occasionally cause slave gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slave gear you have on you. +它偶尔会使得奴隶装备突然出现并束缚佩戴者。速度的增加效果取决于你身上的奴隶装备数量。 + + +Slave Cuffs +奴隶铐 +It's made of a gold-tinted metal with a magical enchantment. +它由具有神奇魔力的金色金属制成。 + + +Slave Wrist Chain +奴隶手铐 + + +Slave Elbow Chain +奴隶肘铐 + + +Slave Leg Cuffs +奴隶腿铐 +Slave Ankle Cuffs +奴隶脚铐 +Slave Cuffs Chain +链式奴隶手铐 + + High-Tech Gag 高科技口球 A gag with a soft and filling mouthpiece, reinforced with a metallized strap. -带有柔软填充喉舌的堵嘴,并用金属化表带加固。 +带有柔软喉舌填充物的口塞,并用金属化系带加固。 It will be impossible to force it out or cut it with just a knife. -只用一把刀就不可能把它强行取出或切开。 +仅凭一把刀做不到把它强行取出或切开。 + + +Nylon Plug Gag +尼龙塞子口塞 +A gag with a soft and filling mouthpiece, kept in place by an adjustable nylon strap. +一种带有柔软填充嘴的堵嘴器,通过可调节尼龙带固定到位。 +It will be impossible to force it out, but can be cut. +强行拔除是不可能的,但可以切断。 + + High-Tech Cables (Arms) -高科技电缆(臂) -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -由高科技金属化多纤维制成的电缆。不受钢边的影响! +高科技缆绳 ( 手臂 ) +Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! +缆绳由自紧金属化多纤维制成。不受锋利物品的影响! They are wrapped methodically around your body! -它们有条不紊地包裹在您的身体上! +它们有条不紊地包裹在你的身体上! High-Tech Cables (Legs) -高科技电缆(腿) -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -由高科技金属化多纤维制成的电缆。不受钢边的影响! -They are wrapped methodically around your body! -它们有条不紊地包裹在您的身体上! +高科技缆绳 ( 腿 ) High-Tech Cables (Harness) -高科技电缆(束衣) -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -由高科技金属化多纤维制成的电缆。不受钢边的影响! -They are wrapped methodically around your body! -它们有条不紊地包裹在您的身体上! +高科技缆绳 ( 束衣 ) + + +Nylon Cables (Arms) +尼龙缆绳 ( 手臂 ) +Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. +由尼龙聚合物制成的缆绳。非常坚固且自紧,但容易受到锋利物品的影响。 +Nylon Cables (Legs) +尼龙缆绳 ( 腿 ) +Nylon Cables (Harness) +尼龙缆绳 ( 束衣 ) + + +Magic Ribbons +魔法丝带 +Magically sealed ribbons to teach intruders a lesson. +用魔法密封的丝带给入侵者一个教训。 +The magic is powerful enough to ward off most blades, creating a true predicament for one who is trapped by these. +魔力足够强大,可以抵挡大多数刀刃,为这些被抓住的人创造了一个真正的困境。 + + Magic Ribbons (Arms) -魔法丝带(手臂) -Ribbons enchanted with powerful magic. They can't be cut without a magic implement! -丝带附有强大的魔法。没有魔法工具是无法切割的! -They are wrapped tightly around your body with a bow knot! -它们用蝴蝶结紧紧地包裹在你的身体上! +魔法丝带 ( 手臂 ) +Those ribbons will hold you tight~ +这些丝带会紧紧地束缚着你~ +I've put a magic seal in that bow-knot to keep it secure! +我在那个蝴蝶结里施了一个魔法封印以保证它的安全! Magic Ribbons (Legs) -魔术丝带(腿) -Ribbons enchanted with powerful magic. They can't be cut without a magic implement! -丝带附有强大的魔法。没有魔法工具是无法切割的! -They are wrapped tightly around your body with a bow knot! -它们用蝴蝶结紧紧地包裹在你的身体上! +魔法丝带 ( 腿 ) Magic Ribbons (Feet) -魔术丝带(脚) -Ribbons enchanted with powerful magic. They can't be cut without a magic implement! -丝带附有强大的魔法。没有魔法工具是无法切割的! -They are wrapped tightly around your body with a bow knot! -它们用蝴蝶结紧紧地包裹在你的身体上! +魔法丝带 ( 脚 ) Magic Ribbons (Harness) -魔法丝带(束衣) -Ribbons enchanted with powerful magic. They can't be cut without a magic implement! -丝带附有强大的魔法。没有魔法工具是无法切割的! -They are wrapped tightly around your body with a bow knot! -它们用蝴蝶结紧紧地包裹在你的身体上! +魔法丝带 ( 束衣 ) Magic Ribbons (Pelvis) -魔术丝带(下体) -Ribbons enchanted with powerful magic. They can't be cut without a magic implement! -丝带附有强大的魔法。没有魔法工具是无法切割的! -They are wrapped tightly around your body with a bow knot! -它们用蝴蝶结紧紧地包裹在你的身体上! +魔法丝带 ( 下体 ) Magic Ribbons (Mittens) -魔术丝带(手套) -Ribbons enchanted with powerful magic. They can't be cut without a magic implement! -丝带附有强大的魔法。没有魔法工具是无法切割的! +魔法丝带 ( 手套 ) They are wrapped tightly around your hands with a bow knot! 它们用蝴蝶结紧紧地缠绕在你的手上! Magic Ribbons (Gag) -魔法丝带(堵嘴) -Ribbons enchanted with powerful magic. They can't be cut without a magic implement! -丝带附有强大的魔法。没有魔法工具是无法切割的! +魔法丝带 ( 堵嘴 ) They are wrapped tightly around your mouth with a bow knot! 它们用蝴蝶结紧紧地包裹在你的嘴上! +Living Ribbon Collar +活体丝带项圈 +This collar is designed to make sure its wearer does not escape the ribbons. +这个项圈的设计是为了确保佩戴者不会脱离缎带。 +It will occasionally cause ribbons to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ribbons you have on you. +它偶尔会使得丝带突然出现并束缚佩戴者。速度的效果增加取决于你身上的丝带数量。 + + Ice (Arms) -冰(手臂) +冰 ( 手臂 ) Frigid restraints made out of ice. 冰冷的束缚。 There's no way to remove it without breaking it off. 如果不将其打碎,就无法将其移除。 Ice (Mouth) -冰(嘴) -Frigid restraints made out of ice. -冰冷的束缚。 -There's no way to remove it without breaking it off. -如果不将其打碎,就无法将其移除。 +冰 ( 嘴 ) +Ice Ball Gag (Mouth) +冰口球( 嘴 ) +A cold sphere of magic ice lodged firmly in your mouth. +一块冰冷的魔法冰牢牢地卡在你嘴里。 +The work of a kinky elemental. It will melt! Eventually. +古怪元素的作品。它会融化的!最终。 Ice (Body) -冰(身体) -Frigid restraints made out of ice. -冰冷的束缚。 -There's no way to remove it without breaking it off. -如果不将其打碎,就无法将其移除。 +冰 ( 身体 ) Ice (Legs) -冰(腿) -Frigid restraints made out of ice. -冰冷的束缚。 -There's no way to remove it without breaking it off. -如果不将其打碎,就无法将其移除。 +冰 ( 腿 ) + + Glue (Feet) -胶水(脚) +胶体 ( 脚 ) A latex-derived glue that attaches you to the floor! It's very stretchy. -一种乳胶衍生的胶水,可将您固定在地板上!它非常有弹性。 +一种乳胶衍生的胶体,可将你固定在地板上!它非常有弹性。 Just touching it makes it stick all over... 随便摸一下,就浑身黏糊糊的了…… Glue (Ankles) -胶水(脚踝) -A latex-derived glue that attaches you to the floor! It's very stretchy. -一种乳胶衍生的胶水,可将您固定在地板上!它非常有弹性。 -Just touching it makes it stick all over... -随便摸一下,就浑身黏糊糊的了…… +胶体 ( 脚踝 ) Glue (Legs) -胶水(腿) -A latex-derived glue that attaches you to the floor! It's very stretchy. -一种乳胶衍生的胶水,可将您固定在地板上!它非常有弹性。 -Just touching it makes it stick all over... -随便摸一下,就浑身黏糊糊的了…… +胶体( 腿 ) + + Slime (Feet) -史莱姆(脚) +粘液 ( 脚 ) Sticky slime that adheres to your body. It reacts negatively to mana... -粘在身上的史莱姆。它对法力产生负面反应... +粘在身上的粘液。它对法力产生负面反应... It is an organic material that reforms around every cut you make! -它是一种有机材料,可以对您所做的每一次切割行为进行变化! +它是一种有机材料,可以对你所做的每一次切割行为进行变化! Slime (Ankles) -史莱姆(脚踝) -Sticky slime that adheres to your body. It reacts negatively to mana... -粘在身上的史莱姆。它对法力产生负面反应... -It is an organic material that reforms around every cut you make! -它是一种有机材料,可以对您所做的每一次切割行为进行变化! +粘液 ( 脚踝 ) Slime (Legs) -史莱姆(腿) -Sticky slime that adheres to your body. It reacts negatively to mana... -粘在身上的史莱姆。它对法力产生负面反应... -It is an organic material that reforms around every cut you make! -它是一种有机材料,可以对您所做的每一次切割行为进行变化! +粘液 ( 腿 ) Slime (Arms) -史莱姆(手臂) -Sticky slime that adheres to your body. It reacts negatively to mana... -粘在身上的史莱姆。它对法力产生负面反应... -It is an organic material that reforms around every cut you make! -它是一种有机材料,可以对您所做的每一次切割行为进行变化! +粘液 ( 手臂 ) Slime (Hands) -史莱姆(手) -Sticky slime that adheres to your body. It reacts negatively to mana... -粘在身上的史莱姆。它对法力产生负面反应... -It is an organic material that reforms around every cut you make! -它是一种有机材料,可以对您所做的每一次切割行为进行变化! +粘液 ( 手 ) Slime (Mouth) -史莱姆(嘴) +粘液 ( 嘴 ) Slime (Head) -史莱姆(头) -Sticky slime that adheres to your body. It reacts negatively to mana... -粘在身上的史莱姆。它对法力产生负面反应... -It is an organic material that reforms around every cut you make! -它是一种有机材料,可以对您所做的每一次切割行为进行变化! -Proto-Slime (Feet) -黏菌史莱姆(脚) -It seems to be a precursor to the slimes everyone is familiar with? -这似乎是每个人熟悉的史莱姆的先驱? -It is an organic material that reforms around every cut you make! -这是一种有机材料,可以对您所做的每一次切割行为进行变化! -Proto-Slime (Ankles) -黏菌史莱姆(脚踝) -Proto-Slime (Legs) -黏菌史莱姆(腿) -Proto-Slime (Arms) -黏菌史莱姆(手臂) -Proto-Slime (Hands) -黏菌史莱姆(手) -Proto-Slime (Mouth) -黏菌史莱姆(嘴) -Proto-Slime (Head) -黏菌史莱姆(头) +粘液 ( 头 ) +Living Slime Collar +活体粘液项圈 +This collar is designed to make sure its wearer does not escape their slime. +这个项圈的设计是为了确保佩戴者不会逃离粘液。 +It will occasionally cause slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slime you have on you. +它偶尔会使得黏液突然出现并束缚佩戴者。效果增加的速度取决于你身上的黏液量。 + + +Made from hardened slime. +由硬化的粘液制成。 +The classic smooth, shiny material for full encasement. +经典的光滑闪亮材料,可实现全面包裹。 + + +A semi-organic substance of alchemical origin. +炼金术起源的半有机物质。 +It has a mind of its own, and tends to spread if not properly contained. +它有自己的想法,如果控制不当,可能会传播。 + + +Proto Rubber +黏菌橡胶 +Made from hardened proto rubber. +由硬化的原型橡胶制成。 +A hardened form of the essence of latex. +乳胶精华的硬化形式。 + + +Proto Slime +原始粘液 +Alchemical rubber in its simplest form. Amorphous. +最简单的炼金术橡胶。无定形。 +Often forms strange growths, seeking damsels to encase. +经常形成奇怪的赘生物,寻找雌性来包裹。 + + Rubber (Feet) -橡胶(脚) -Sticky rubber that has fused itself into a shell around your body. -粘性橡胶,已经融合成您身体周围的外壳。 +橡胶 ( 脚 ) +Sticky rubber that has fused itself into a skintight layer. +粘性橡胶已自身融合成一层紧密的外壳。 There's no struggling out now, but since it's solid it may be cuttable. -现在不可能挣脱了,但由于它是坚固的,它可能是可切割的。 +现在不可能挣脱了,但由于它是固体的,也许可以切开它。 Rubber (Ankles) -橡胶(脚踝) -Sticky rubber that has fused itself into a shell around your body. -粘性橡胶,已经融合成您身体周围的外壳。 -There's no struggling out now, but since it's solid it may be cuttable. -现在没有挣扎了,但由于它是坚固的,它可能是可切割的。 +橡胶 ( 脚踝 ) Rubber (Legs) -橡胶(腿) -Sticky rubber that has fused itself into a shell around your body. -粘性橡胶,已经融合成您身体周围的外壳。 -There's no struggling out now, but since it's solid it may be cuttable. -现在没有挣扎了,但由于它是坚固的,它可能是可切割的。 +橡胶 ( 腿 ) Rubber (Arms) -橡胶(手臂) -Sticky rubber that has fused itself into a shell around your body. -粘性橡胶,已经融合成您身体周围的外壳。 -There's no struggling out now, but since it's solid it may be cuttable. -现在没有挣扎了,但由于它是坚固的,它可能是可切割的。 +橡胶 ( 手臂 ) Rubber (Hands) -橡胶(手) -Sticky rubber that has fused itself into a shell around your body. -粘性橡胶,已经融合成您身体周围的外壳。 -There's no struggling out now, but since it's solid it may be cuttable. -现在没有挣扎了,但由于它是坚固的,它可能是可切割的。 +橡胶 ( 手 ) Rubber (Mouth) -橡胶(嘴) +橡胶 ( 嘴 ) Rubber (Head) -橡胶(头) -Sticky rubber that has fused itself into a shell around your body. -粘性橡胶,已经融合成您身体周围的外壳。 -There's no struggling out now, but since it's solid it may be cuttable. -现在没有挣扎了,但由于它是坚固的,它可能是可切割的。 +橡胶 ( 头 ) +Living Rubber Collar +活体橡胶项圈 +This collar is designed to make sure its wearer does not escape their rubber. +这个项圈的设计是为了确保佩戴者不会脱离橡胶。 +It will occasionally cause rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. +它偶尔会使得橡胶突然出现并束缚佩戴者。速度的效果增加取决于你身上的橡胶量。 + + + + +Proto-Slime (Feet) +黏菌 ( 脚 ) +It seems to be a precursor to the slimes everyone is familiar with? +这似乎是每个人都熟悉的粘液团的前身? +Proto-Slime (Ankles) +黏菌 ( 脚踝 ) +Proto-Slime (Legs) +黏菌 ( 腿 ) +Proto-Slime (Arms) +黏菌 ( 手臂 ) +Proto-Slime (Hands) +黏菌 ( 手 ) +Proto-Slime (Mouth) +黏菌 ( 嘴 ) +Proto-Slime (Head) +黏菌 ( 头 ) +Living Proto-Slime Collar +活体黏菌项圈 +This collar is designed to make sure its wearer does not escape the slime. +这个项圈的设计是为了确保佩戴者不会逃离黏菌。 +It will occasionally cause proto-slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-slime you have on you. +它偶尔会使得黏菌突然出现并束缚佩戴者。效果增加的速度取决于你身上的黏菌量。 + + Proto-Rubber (Feet) -黏菌橡胶(脚) +黏菌橡胶 ( 脚 ) +Sticky slime that has fused itself into a skintight layer. +粘稠的粘液已经融合成一层紧贴皮肤的外壳。 Proto-Rubber (Ankles) -黏菌橡胶(脚踝) +黏菌橡胶 ( 脚踝 ) Proto-Rubber (Legs) -黏菌橡胶(腿) +黏菌橡胶 ( 腿 ) Proto-Rubber (Arms) -黏菌橡胶(手臂) +黏菌橡胶 ( 手臂 ) Proto-Rubber (Hands) -黏菌橡胶(手) +黏菌橡胶 ( 手 ) Proto-Rubber (Mouth) -黏菌橡胶(嘴) +黏菌橡胶 ( 嘴 ) Proto-Rubber (Head) -黏菌橡胶(头) +黏菌橡胶 ( 头 ) +Living Proto-Rubber Collar +活体黏菌橡胶项圈 +This collar is designed to make sure its wearer does not escape the rubber. +这个项圈的设计是为了确保佩戴者不会脱离黏菌橡胶。 +It will occasionally cause proto-rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-rubber you have on you. +它偶尔会使得黏菌橡胶突然出现并束缚佩戴者。速度的增加效果取决于你身上的黏菌橡胶数量。 + + +Sticky Tape +粘性胶带 +Extra-strength utility tape, for your secure packaging needs. +迫使你的手握成拳头然后包裹住的胶带! +It's quite sticky, the adhesive requires some force to get off. +没有某种摩擦很难摆脱! + + Tape Mittens 胶带手套 Sticky tape that holds your hands into a fist! -将您的手握成拳头覆盖住的胶带! +迫使你的手握成拳头然后包裹住的胶带! It's tough to get out of without some kind of grip! 没有某种摩擦很难摆脱! + + Arm Chains 臂链 Heavy chains keeping your arms securely behind your back. -沉重的链条将您的手臂牢牢固定在背后。 +沉重的链条将你的手臂牢牢固定在背后。 It doesn't look like a knife is up to the task... 看来一把刀不能胜任这项任务…… Leg Chains 腿链 Heavy chains keeping your legs firmly hobbled. 沉重的锁链让你的双腿牢牢地蹒跚而行。 -It doesn't look like a knife is up to the task... -看来一把刀不能胜任这项任务…… Ankle Chains 踝链 Heavy chains keeping your feet bound together. 沉重的链条将你的双脚绑在一起。 -It doesn't look like a knife is up to the task... -看来一把刀不能胜任这项任务…… Crotch Chain -下体链 +股链 Heavy chains that serve as an anchor point around your waist. 作为腰部锚点的重型链条。 -It doesn't look like a knife is up to the task... -看来一把刀不能胜任这项任务…… + + Magic Arm Chains -臂链 -Magic chains keeping your arms securely behind your back. -魔术链将您的手臂牢牢固定在背后。 -It doesn't look like a knife is up to the task... -看来一把刀不能胜任这项任务…… +臂链 ( 附魔 ) +Magic chains keeping your arms securely behind your back. +魔法链将你的手臂牢牢固定在背后。 Magic Leg Chains -腿链 +腿链 ( 附魔 ) Magic chains keeping your legs firmly hobbled. 让你的双腿牢牢踉跄的魔法锁链。 -It doesn't look like a knife is up to the task... -看来一把刀不能胜任这项任务…… Magic Ankle Chains -踝链 +踝链 ( 附魔 ) Magic chains keeping your feet bound together. 将双脚绑在一起的魔法锁链。 -It doesn't look like a knife is up to the task... -看来一把刀不能胜任这项任务…… Magic Crotch Chain -胯链 +股链 ( 附魔 ) Magic chains that serve as an anchor point around your waist. -作为腰部锚点的魔法链。 -It doesn't look like a knife is up to the task... -看来一把刀不能胜任这项任务…… +作为腰部锚点的魔法锁链。 + + Shadow Chains (Arms) -暗影锁链(手臂) +暗影锁链 ( 手臂 ) Black chains for those who cross the divines 穿越神界者的黑链 -It doesn't look like a knife is up to the task... -看来一把刀不能胜任这项任务…… Shadow Chains (Legs) -暗影锁链(腿) -Black chains for those who cross the divines -穿越神界者的黑链 -It doesn't look like a knife is up to the task... -看来一把刀不能胜任这项任务…… +暗影锁链 ( 腿 ) Shadow Chains (Ankles) -暗影链(脚踝) -Black chains for those who cross the divines -穿越神界者的黑链 -It doesn't look like a knife is up to the task... -看来一把刀不能胜任这项任务…… +暗影链 ( 脚踝 ) Shadow Chain 暗影影链 -Black chains for those who cross the divines -穿越神界者的黑链 -It doesn't look like a knife is up to the task... -看来一把刀不能胜任这项任务…… + + Ectoplasmic Chains (Arms) -灵界链(手臂) +灵界链 ( 手臂 ) Ghostly chains from a ghost that just doesn't want to let go. 来自一个不想放手的幽灵的幽灵锁链。 It's made of an ethereal substance. 它是由一种空灵的物质制成的。 Ectoplasmic Chains (Legs) -灵界链(腿) -Ghostly chains from a ghost that just doesn't want to let go. -来自一个不想放手的幽灵的幽灵锁链。 -It's made of an ethereal substance. -它是由一种空灵的物质制成的。 +灵界链 ( 腿 ) Ectoplasmic Chains (Ankles) -灵界链(脚踝) -Ghostly chains from a ghost that just doesn't want to let go. -来自一个不想放手的幽灵的幽灵锁链。 -It's made of an ethereal substance. -它是由一种空灵的物质制成的。 +灵界链 ( 脚踝 ) Ectoplasmic Chain 灵界链 -Ghostly chains from a ghost that just doesn't want to let go. -来自一个不想放手的幽灵的幽灵锁链。 -It's made of an ethereal substance. -它是由一种空灵的物质制成的。 -Divine Cuffs -神圣手铐 -It is said that even heaven has its hierarchies... -都说天堂也有等级…… -Shining cuffs made of holy metal. Nothing can touch it. -由圣洁金属制成的闪亮手铐。什么都不能碰它。 + + Divine Cuffs 神圣手铐 It is said that even heaven has its hierarchies... @@ -4757,133 +8713,167 @@ It is said that even heaven has its hierarchies... Shining cuffs made of holy metal. Nothing can touch it. 由圣洁金属制成的闪亮手铐。什么都不能碰它。 Divine Muzzle -神圣的口套 -It is said that even heaven has its hierarchies... -都说天堂也有等级…… +神圣口套 +Keep those lips sealed. +保持沉默。 A shining muzzle made of holy metal. Nothing can touch it. -由圣金属制成的闪亮口套。什么都不能碰它。 -Blindfold -眼罩 +由神圣金属制成的闪闪发光的口套。没有什么能影响到它。 +Divine Gag +神圣口塞 +A shining gag made of holy metal. Nothing can touch it. +由神圣的金属制成的闪亮口塞。没有什么能影响到它。 + + A piece of cloth secured onto your face and blocking vision. -一块布固定在您的脸上并挡住视线。 -You can still see through the gap around your nose. -您仍然可以通过鼻子周围的缝隙看到。 +一块布固定在你的脸上并挡住视线。 +Cleave Gag +顺切堵嘴 +A piece of cloth forced between your lips. +将一块布塞在双唇之间。 +On its own it's not very restrictive. +就其本身而言,它不是很严格。 +Thick Cleave Gag +厚的顺切堵嘴 +A piece of cloth that makes it hard to speak. +一块让人难以言语的布。 +It's somewhat effective. +是有点效果的。 Knotted Cloth Gag 打结的布口塞 +A piece of cloth tied in a knot and tied over your mouth. +一块布打成一个结并绑在你的嘴上。 +It's pretty effective at keeping you quiet. +这对于让你保持安静非常有效。 OTN Cloth Gag 覆嘴式布口塞 A piece of cloth tightened over your mouth. 一块布紧紧地捂在你的嘴上。 -On its own it's not very restrictive. -就其本身而言,它不是很严格。 -Blindfold -眼罩 A scarf secured onto your face and blocking vision. 一条围巾固定在你的脸上,挡住了视线。 -You can still see through the gap around your nose. -您仍然可以通过鼻子周围的缝隙看到。 Scarf Gag 围巾堵嘴 A scarf tightened over your mouth. 一条围巾在你的嘴上收紧。 -On its own it's not very restrictive. -就其本身而言,它不是很严格。 Scarf Tie 围巾捆绑 A scarf wrapped around your body. 一条围巾裹在你的身上。 -On its own it's not very restrictive. -就其本身而言,它不是很严格。 Scarf Leg Tie 围巾绑腿 -A scarf wrapped around your body. -一条围巾裹在你的身上。 -On its own it's not very restrictive. -就其本身而言,它不是很严格。 Scarf Ankle Tie 围巾踝带 -A scarf wrapped around your body. -一条围巾裹在你的身上。 -On its own it's not very restrictive. -就其本身而言,它不是很严格。 + + Arm Belts 手臂绑带 A ludicrous amount of belts secured with a buckle. -用一些扣子固定的一些滑稽的皮带。 +用皮带扣固定的数量惊人的皮带。 Lockable and fully adjustable to ensure snugness. -可上锁且完全可调,以确保舒适。 +可上锁且完全可调节,以确保舒适。 Leg Belts 腿部绑带 -A ludicrous amount of belts secured with a buckle. -用一些扣子固定的一些滑稽的皮带。 -Lockable and fully adjustable to ensure snugness. -可上锁且完全可调,以确保舒适。 Ankle Belts 脚踝绑带 -A ludicrous amount of belts secured with a buckle. -用一些扣子固定的一些滑稽的皮带。 -Lockable and fully adjustable to ensure snugness. -可上锁且完全可调,以确保舒适。 -Wrist Cuffs -手腕手铐 -Heavy shackles with a rudimentary lock. -带有简陋锁的重型镣铐。 + + +Iron Cuffs +铁铐 +Tough shackles with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. +带有简陋锁的坚固镣铐。如果在库存或快捷栏中锁定,则可对脆弱对象使用。 You could pick these with a hairpin. 你可以用发夹撬开这些锁锁。 -Shackles -镣铐 -Heavy shackles with a rudimentary lock. -带有简陋锁的重型镣铐。 -You could pick these with a hairpin. -你可以用发夹撬开这些锁。 -Leg Shackles -脚铐 -Heavy shackles with a rudimentary lock. -带有简陋锁的重型镣铐。 -You could pick these with a hairpin. -你可以用发夹撬开这些锁。 -Ankle Shackles -脚踝镣铐 +Iron Shackles +铁枷锁 +Tough shackles with a rudimentary lock. +带有简陋锁的坚固镣铐。 +Tough to walk in. +很难进去。 + + +Thumbcuffs +指铐 +Interferes with the use of your hands. +阻碍双手的使用。 +Another layer of restriction. +又一层限制。 +Hinged Handcuffs +铰链手铐 +Hinged cuffs with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. +铰链手铐带有简易锁。如果在库存或快捷栏中锁定,则可对脆弱对象使用。 +Difficult to unlock, let alone pick by yourself. +解锁都困难,更不用说撬开了。 + + +Heavy Handcuffs +沉重的手铐 +A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. +一套爱尔兰 8 式镣铐,配有基本锁。如果在库存或快捷栏中锁定,则可对脆弱对象使用。 +The position is too awkward to free yourself, even with a key... +锁的位置令人难堪,即使有钥匙也无法自己解锁...... + + +Heavy Leg Irons +重型脚镣 +A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. +一套爱尔兰 8 式镣铐,配有基本锁。 +The position is awkward, but it's on your feet so you can remove them yourself if you have free hands. +锁的位置令人难堪,但它在你的脚上,所以如果你有时间的话,你可以自己把它们解开。 + + +Thigh Shackles +大腿镣铐 Heavy shackles with a rudimentary lock. -带有简陋锁的重型镣铐。 -You could pick these with a hairpin. -你可以用发夹撬开这些锁。 +带有简陋锁的沉重枷锁。 +The enemy attaches your leg shackles together! +敌人把你的脚镣连在一起! +Linked Thigh Shackles +链接的大腿镣铐 +The leg shackles chain detaches! +脚镣链条脱落! + + Ankle Shackles 脚踝镣铐 -The enemy attaches your ankle cuffs together! -敌人将你的脚铐绑在一起! -Heavy shackles with a rudimentary lock. -带有简陋锁的重型镣铐。 -You could pick these with a hairpin. -你可以用发夹撬开这些锁。 -The ankle cuff chain detaches! -脚铐链脱落! +Linked Ankle Shackles +链接的脚踝镣铐 +The enemy attaches your ankle shackles together! +敌人将你的脚镣绑在一起! +The ankle shackles chain detaches! +脚镣链铐脱落! + + Steel Muzzle 钢口套 A heavy muzzle with a rudimentary lock. 一个带有基本锁的沉重口套。 You could pick this with a hairpin. 你可以用发夹撬开这些锁。 +Blacksteel Muzzle +黑钢口套 +A heavy duty steel muzzle with a flexible metal locking pin and straps. +一种重型钢制口套,带有柔性金属锁销和带子 +Perfect for sealing away those unruly lips. +非常适合封住那些不守规矩的嘴唇。 + + + + Cursed Collar 诅咒项圈 A cold steel collar locked tightly on your neck. 一个冰冷的钢领紧紧地锁在你的脖子上。 It appears to attract additional enemies to its wearer. 它似乎会为佩戴者吸引更多的敌人。 + + Face 脸 Head 头 Mouth 嘴 -Mouth -嘴 -Mouth -嘴 Ears 耳朵 -Collar -项圈 Neck 脖子 Arms @@ -4899,147 +8889,203 @@ Belt Plug 塞 Vibe -氛围 +震动 Piercings 穿孔 -Nipples -乳头 Butt Plug 肛塞 Legs 腿 Ankles 脚踝 -Feet -脚 Device -设备 -You picked up XXX gold. -你捡到了 XXX 金币。 +装置 + + +You found an item that was too small to see! +你发现了一个因为太小而看不见的物品! + + +You pick up XXX gold. +你获得了 XXX 金币。 You retrieve an ancient power crystal. 你取回了一块远古能量水晶。 +You retrieve a spent ancient power crystal. +你取回了一块用过的古代能量水晶。 You pick up a magical amulet and use it to boost your stats. 你拿起一个神奇的护身符并用它来提高你的统计数据。 -You picked up a knife. +You pick up a Leyline Map. +你拿起一张地脉地图。 +You pick up a knife. 你拿起了一把刀。 + + +You pick up a torch. +你拿起了火把。 You found a bundle of discarded knives! 你发现了一堆废弃的刀具! -You picked up an enchanted knife. -你拿起了一把魔法刀。 -You picked up a magic knife. +You pick up a magic knife. 你拿起了一把魔法刀。 -You picked up a lockpick. -你拿起了一个撬锁工具。 -You picked up a normal key. -你拿起一把普通的钥匙。 -You picked up a green key. +You pick up a lockpick. +你拿起了一把撬锁工具。 +You pick up a normal key. +你拿起了一把普通钥匙。 +You pick up a green key. 你拿起了一把绿色钥匙。 -You picked up a blue key. -你拿起了一把蓝色的钥匙。 -You picked up a willpower potion. -你捡到了体力药水。 -You picked up a glowing blue mana potion. -你捡起一瓶发光的蓝色法力药水。 -You picked up an invisibility potion. -你捡到了隐形药水。 -You picked up a handful of ectoplasm. -你捡起一些灵浆。 -You picked up a green stamina potion. -你捡到了绿色的体力药水。 -You picked up a frigid white potion. -你拿起一瓶冰冷的白色药水。 +You pick up a blue key. +你拿起了一把蓝色钥匙。 +You pick up a willpower potion. +你拿起了一瓶意志力药水。 +You pick up a glowing blue mana potion. +你拿起一瓶发光的蓝色法力药水。 +You pick up a glowing blue orb. +你拿起一个发光的蓝色球体。 +You pick up an invisibility potion. +你拿起了一种隐身药水。 +You pick up a handful of ectoplasm. +你拿起了一把灵浆。 +You pick up a green stamina potion. +你拿起了一瓶绿色的体力药水。 +You pick up a frigid white potion. +你拿起了一瓶冰冷的白色药水。 You found a peculiar note on the ground and keep it in your journal. 你在地上发现了一张奇特的便条,并记在日记里。 You found an uninteresting note on the ground. 你在地上发现了一张无趣的便条。 You pick up a heavy hammer. -你拿起一把重锤。 +你拿起了一把重锤。 You pick up a set of bolt cutters. -你拿起一套断线钳。 +你拿起了一套断线钳。 You pick up a sharp sword. -你拿起一把锋利的剑。 +你拿起了一把锋利的剑。 You pick up a flamberge. -你拿起一个火焰剑。 +你拿起了一个炎型剑。 You recover your escort drone. 你收回你的护航无人机。 You pick up a 'magic' wand... -你拿起一根“魔法”魔杖... +你拿起了一根“魔法”魔杖... You pick up a magical ice cube. -你拿起一个神奇的冰块。 +你拿起了一个神奇的冰块。 You find some treated hemp rope. 你找到了一些经过处理的麻绳。 + + +Feather +羽毛 +A feather taken from some large fluffy being. +从一些毛茸茸的大动物上取下的羽毛。 +Deals tickle damage. Greatly distracting. Offhand: +1 tickle damage on attack for 3 stamina. Greatly distracting. +造成挠痒伤害,极大地分散注意力。副手 : ‎攻击时 +1 挠痒伤害,消耗 3 点体力。极大地分散注意力。 You pick up a feather. -你捡起一根羽毛。 +你捡起了一根羽毛。 + + +Maid's Feather Duster +女仆的鸡毛掸子 +An instrument used extensively by maidforce agents carrying out their duties. +女仆特工在履行职责时广泛使用的一种工具。 +Deals tickle damage. Distracts enemies. Offhand: +15 distraction on attack for 1 stamina. +造成挠痒伤害。使敌人性奋。副手 : ‎攻击时+15 性奋伤害,消耗 1 点体力。 +You pick up a feather duster. +你拿起鸡毛掸子。 + + + + +Rope Rune +绳索符文 +You smash the rune in front of you, and a flash of light enchants nearby ropes! +你打碎了面前的符文,一道闪光对附近的绳子施了魔法! +It feels tantalizing to look at. +让人看着就觉得很诱人。 +Allows you to enchant ropes into more powerful restraints. +允许你将绳索附魔成更强大的束缚。 +You pick up a kinky trinket with a glowing red sigil. +你拿起一个带有发光红色印记的古怪饰品。 + + You pick up a heavy flail. -你拿起沉重的流星锤。 +你拿起了沉重的流星锤。 You pick up a shortspear. -你拿起短矛。 -You pick up a staff of binding. You remember these from wizard school... -你拿起一根捆绑法杖。你你记得在巫师学校见过这些…… -You pick up a staff of the storm. It tingles. -你拿起风暴之杖。它刺痛了你。 -You pick up a staff of flames. It feels warm. -你拿起一根火焰法杖。感觉很温暖。 -You pick up a staff with a name on it: DOLLMAKER -你拿起一个上面有名字的工作人员:人偶师 -You pick up a staff of frostbite. It feels chilling to the touch. -你拿起一根冻伤法杖。摸起来感觉很冷。 -You pick up a staff of permafrost. Your hand feels numb just reaching for it. -你拿起永久冻土法杖。你的手刚拿起来就感觉麻木了。 +你拿起了一根短矛。 +You pick up a long spear. +你拿起一支长矛。 You pick up a pickaxe. -你拿起镐。 +你拿起了一把镐子。 You pick up an enchanted sword. -你拿起一把附魔剑。 +你拿起了一把附魔剑。 You pick up an enchanted axe. -你拿起一把魔法斧头。 +你拿起了一把魔法斧头。 You pick up an enchanted hammer. -你拿起一把附魔锤。 +你拿起了一把附魔锤。 You pick up a light hammer that's inscribed 'IceBreaker'. -你拿起一个刻有“破冰者”字样的轻锤。 +你拿起了一个刻有“破冰者”字样的轻锤。 You pick up an enchanted spear. -你拿起一把附魔长矛。 +你拿起了一把附魔长矛。 You pick up an enchanted flail. -你拿起一个魔法流星锤。 +你拿起了一个魔法流星锤。 You pick up a powerful axe. -你拿起一把强大的斧头。 +你拿起了一把强大的斧头。 You pick up a consumable smoke bomb. -你拿起一个消耗性烟雾弹。 -You picked up a stone trinket with a glowing red sigil. -你捡起一个带有发光红色印记的石头饰品。 -You picked up a wet rock with some kind of symbol on it. -你捡起一块湿石头,上面有某种符号。 -You picked up a crystal beautiful as the moon. -你捡起一颗美丽如月亮的水晶。 -You picked up a strange device with a sharpened razor disc. -你拿起了一个带有锋利刀盘的奇怪设备。 +你拿起了一个消耗性烟雾弹。 +You pick up a stone trinket with a glowing red sigil. +你拿起一个带有发光红色印记的石头饰品。 +You pick up a wet rock with some kind of symbol on it. +你拿起一块湿石头,上面有某种符号。 +You pick up a crystal beautiful as the moon. +你拾起一颗如月亮般美丽的水晶。 +You pick up a strange device with a sharpened razor disc. +你拿起一个奇怪的装置,里面有一个锋利的剃须刀盘。 You find a strange ancient device with a sharp cutting blade. -你会发现一个奇怪的古老装置,带有锋利的切割刀片。 -You picked up a stone trinket with a glowing blue sigil. -你捡起一个带有发光蓝色印记的石头饰品。 +你发现了一个奇怪的古老装置,带有锋利的切割刀片。 +You pick up a stone trinket with a glowing blue sigil. +你拿起一个带有发光蓝色印记的石头饰品。 You pick up a bola. -你拿起一个投石索。 +你拿起了一个投石索。 You pick up a bomb! -你拿起炸弹! +你拿起了炸弹! You pick up Dragonslaver. -你拿起驯龙者。 -You pick up the Encaser. -你拿起Encaser。 -You retrieve the Bondage Buster. -你拿回束缚破坏者。 +你拿起了“驯龙者”。 +You pick up Metamorphosis. +你拿起了”变形者“。 +You pick up Four Seasons. +你拿起了”四季“。 +You pick up The Arbiter. +你拿起了”仲裁者“。 +You pick up Dreamcatcher. +你拿起了”逐梦者“. +You retrieve the Bondage Buster EX. +你取回了”束缚破坏者 EX“。 +You salvage a Bondage Buster MK II. +你修复了一台”束缚破坏者 MK II“. +You retrieve a Nevermere Blaster Mark IV. +你取回了一架“奈文米尔”爆能枪 Mark IV。 +You retrieve the Messenger of Love. +你取回了”爱之使者“ You retrieve Moirai's scissors. -你取回了Moirai的剪刀。 +你取回了“命运女神之剪”。 + + You pick up a bunch of scrolls! -你拿起一堆卷轴! +你拿起了一堆卷轴! You pick up a Scroll of Sleight. -你拿起一个诡计卷轴。 +你拿起了一个诡计卷轴。 You pick up a Scroll of Purity. -你拿起一个纯洁卷轴。 +你拿起了一个纯洁卷轴。 You pick up a Scroll of Speech. -你拿起一个语音卷轴。 +你拿起了一个语音卷轴。 You pick up a Scroll of Sauntering. -你拿起一个漫步卷轴。 -As you strike again, your weapon is pulled out of your grasp! -你再次袭击时,你的武器从你手中脱离! +你拿起了一个漫步卷轴。 + + +Your weapon is pulled out of your grasp!!! +你的武器被拔出了!!! +Your weapon is pulled out of your hand and tossed away by your captor! +你的武器被抓获者从你手中夺走并扔掉! +Your weapon slips out of your hand as you try to cut with it... +当你试图用它切割时,你的武器从你手中滑落...... + + You put away the WEAPONNAME 你收起 WEAPONNAME You equip the WEAPONNAME @@ -5049,9 +9095,195 @@ Unequip Equip 装备 Equipped -已配备 -Ars Pyrotecnica +已装备 + + + + +Unlit Torch +熄灭火把 +Can be lit +可以点亮 +Provides light +提供光线 +Lantern +灯笼 +Magic Lantern +魔法灯笼 +Unlit Lantern +熄灭灯笼 +Wall Sconce +壁灯 +Broken Wall Sconce +破损的壁灯 +It is beyond repair. +它已经无法修理了。 +Light Portal +光门 +Empty Portal +虚空门 +Stare into the void... +凝视着虚空。。。 +Liquid Latex +液态乳胶 +Engulfs creatures +吞噬生物 +Engulfs pets (like you) +全包宠物(比如你) +Slows creatures +减慢生物速度 +Glue +胶体 +Ice +寒冰 +Chilling and slippery +又冷又滑 +Water +水 +A concentration of moisture. +湿气的浓度。 +Looking for a new wearer +寻找新的佩戴者 +Chains +链条 +Broken pieces of chain +链条碎片 +Belts +皮带 +Pieces of straps and leather +皮带和皮革 +Vines +藤蔓 +Fierce plantlife +凶猛的植物 +Ribbons +丝带 +Empowered with magic +被赋予了魔法 +Blessed Wrappings +祝福丝带 +Enchanted wrappings +魔法包裹物 +Summoning Runes +召唤符文 +Mystical runes used for summoning +用于召唤的神秘符文 +Casting Runes +铸造符文 +Mystical runes used for casting spells +用于施展法术的神秘符文 +Suspicious Mechanism +可疑装置 +A suspicious mechanism that seems to have been hastily put together. +一个可疑的装置,似乎是匆忙拼凑起来的。 +Suspicious Runes +可疑符文 +A suspicious magic circle that was scrawled recently. +最近被涂写的可疑魔法阵。 +Embers +余烬 +Ignition source. Blocks vision. +着火源。阻挡视线。 +Inferno +地狱 +Deals DAMAGEDEALT fire damage per turn +每回合造成 DAMAGEDEALT 点火焰伤害 +Steam +蒸汽 +Blocks vision +阻挡视野 +Smoke +烟雾 +Cracked Earth +裂开的大地 +Makes creatures unsteady +使生物不稳定 +Rubble +瓦砾 +You don't think insurance will cover this. +你不认为保险会涵盖这个。 +No putting that back together. +不要再把它放在一起了。 + + +Can be controlled using CMD spells +可以使用 CMD 法术进行控制 +Can be controlled using Rubbermancy +可以使用 Rubbermancy 控制 + + +Floor +地板 +Object +目标 +Brickwork +砖结构 +Doodad +小装置 +Furniture +木桶 +Table +桌子 +Shrine +神泉 +Closed Door +关门 +Open Door +开门 +Bed +床 +Bars +栅栏 +Ruined Shrine +毁坏的神泉 +Orb Altar +宝球祭坛 +Empty Altar +虚空祭坛 +Chest +箱子 +Faction Chest +派系宝箱 +Open Chest +开箱子 +Shiny Object +闪闪发光的物体 +Cracked Wall +开裂的墙壁 +Hook +钩子 +Entrance +入口 +Exit Stairs +出口楼梯 +Mysterious Stairs +神秘的楼梯 +Ghostly Adventurer +幽灵冒险家 +Button +按钮 +Conveyor +传送带 +Safety Conveyor +安全运输 +Doll Terminal +玩偶终端 +Doll Supply +玩偶供应 +Bondage Machine +束缚机器 +Empty Fixture +空置装置 +Filled Fixture +填充装置 +### Tablet + + + + + Ars Pyrotecnica +Ars烟火 Codex Imaginus 想像法典 Clavicula Romantica @@ -5062,236 +9294,2008 @@ A book about conjuration 一本关于咒术的书 A book of manipulative spells 一本操纵咒语的书 -Components: -施法部位 + + Verbal -口头 +言语 +### Vision + +Components: +释放部位 Arm Movements 手臂动作 Leg Gestures 腿部姿势 -The incantation comes out as a garbled mess! -咒语说变成了乱七八糟的嘟哝! -You can't raise your arms to cast the spell! -你不能举起手臂来施法! -Your feet are too clumsy to perform the magic gesture! +You mumble incoherently trying to cast the spell... +你语无伦次地咕哝着试图施展咒语…… +You wiggle uselessly trying to cast the spell... +你徒劳地扭动着身体试图施展咒语...... +Your feet are too clumsy to perform the magic gesture... 你的脚太笨拙了,无法施展魔法! +You are unable to see, so you can't target this spell... +你无法看清,所以无法瞄准这个法术... + + Next Page 下一页 Last Page 最后一页 +### >>> + +### <<< + Random Page (your hands are tied) -随机页面(你的双手被束缚) +随机页面 ( 你的双手被束缚 ) + + +Misc +杂项 +Other +其它 +Strength +力量 +Dexterity +灵巧 +Intelligence +智力 + + +Unique +独特 +Active +积极 +Upgrades +升级 + + +Learnable +可学习 +Unlearned +不可学习 +Learned +已学习 +Excl. Upgrades +排除进阶 +Passive +被动 +Upcast +进阶 +Buffs +增益 +DoT +持续伤害 +Projectiles +抛射物 +Melee +近战 +Area Damage +范围伤害 +Area Denial +区域封锁 +Offense +进攻 +Defense +防御 +Fire +火焰 +Earth +岩 +Air +风 +Lightning +电 +Teleport +传送术 +Physics +物理 +Summoning +召唤 +Binding +捆绑 +Stealth +隐形 +Projection +预测 +Alteration +变化 +Light +光 +Shadow +阴影 +Knowledge +知识 +Archery +箭术 +Utility +实用 +Spell Tree +技能树 +Stamina +体力 +Damage +攻击 +Distraction +性奋 + + +Empower to upcast spells +积蓄法力 +Cancel empowerment +释放法力 +You channel mana through your body! Empowerment level: LEVEL +你通过你的身体来积蓄法力!充能级别 : ‎LEVEL +You are already at the maximum empowerment level! +你已经达到了最高充能级别! +You don't have any upcast spells yet. +你没有任何可蓄力法术 +Upcast from SPELL +SPELL蓄力 + + You fail to concentrate on the spell and it fizzles! 你没有专注于咒语,未能成功施法! Your gag causes you to mispronounce the magic words! 你的堵嘴让你念错了魔法词! +You are too clumsy to perform the leg movements! +你的腿部动作太笨拙了! +You can't get a good look at the target! +你无法清楚地看到目标! +You trip up while casting the spell! +你施咒时绊倒了! +You miscast the spell because of a bug. Please report. +你因为一个BUG而误施了咒语。请报告。 +You wave your arms around and make the wrong symbol with your hands! +你挥舞着双臂,用手做出了错误的符号! +Your restrained fingers can't make the magic glyphs in time! +你拘谨的手指不能及时画出魔法符! + + + + The ice drains your concentration! Your mana and stamina are slipping away! 冰会消耗你的体力!你的法力和体力正在流失! A strange, chaotic energy flows into you! Your will is weakened and your mana fades! 一股奇异的、混沌的能量涌入你的体内!你的体力被削弱,你的法力在消逝! +Something gently, constantly tickles you! +有什么东西温柔地、不断地挠你的痒痒! + + The ampule shatters on impact! -安瓿一碰就碎了! +安瓿瓶一碰就碎了! The gas ampule shatters on impact! -气瓶一碰就碎了! +气体安瓿瓶一碰就碎了! The glue ampule shatters on impact! -胶水安瓿在撞击时破碎! +胶体安瓿瓶在撞击时破碎! The rubber ampule shatters on impact! -橡胶安瓿一碰就碎了! +橡胶安瓿瓶一碰就碎了! The latex ampule shatters on impact and forms a restraint! -乳胶安瓿在撞击时破碎并形成了拘束! +乳胶安瓿瓶在撞击时破碎并形成了拘束! The latex ampule shatters on impact and coats your body! -乳胶安瓿在撞击中破碎并覆盖您的身体! +乳胶安瓿瓶在撞击中破碎并覆盖您的身体! The latex ampule shatters on impact and sticks to you! -乳胶安瓿在撞击中破碎并粘在您身上! -Gas Ampule -气体安瓿 -Glue Ampule -胶安瓿 -Rubber Ampule -橡胶安瓿 -Latex Ampule -乳胶安瓿 +乳胶安瓿瓶在撞击中破碎并粘在你身上! + + Shadowy chains appear from a rift in space! 暗影锁链从空间裂缝中出现! -Glue -胶水 -The glue attaches to your legs as you try to move through! -当你试图穿过时,胶水会粘在你的腿上! +The roaring inferno deals 10 damage to you! +咆哮的地狱对你造成 10 点伤害! + + +The Reaping +收获 ++20% damage to plants ++20% 对植物的伤害 + + +Magically Iliterate +魔法盲 +You've never read a magic book. Elemental, Conjuration, and Illusion spells cost 3x as many spell points. +你从来没有读过魔法书。元素、咒法和幻象法术的法术点数是原来的 3 倍。 + + +Magical Spark +魔法火花 +Reduce the penalty from Magically Iliterate to 2x. +将魔法盲的惩罚减少为 2 倍。 +Magical Training +魔法训练 +Remove the penalty from Magically Iliterate. +取消魔法盲的惩罚。 + + +Reap What You Sow +种瓜得瓜,种豆得豆 +Defeating a non-humanoid enemy causes vines to sprout on their space temporarily. +击败非人形敌人会导致藤蔓在其空间内暂时发芽。 + + +Battle Rhythm +战斗节拍 +Stores 10% of the stamina cost of attacks as Rhythm, up to a total of 40. While you have over 10 Rhythm, you gain +10 Block and Evasion. Enemy base accuracy against you is decreased by a % equal to your Rhythm. If an attack misses or is blocked because of this, reduce Rhythm by 25% of the enemy attack power. Decays when not attacking. +将攻击消耗的体力的 10%储存为节拍,最多储存 40 个节拍。当你的节拍超过 10 时,你会获得 +10 格挡和闪避。此外。敌人对你的基本准确度会降低相当于你的节拍的百分比。如果攻击因此而未命中或被格挡,将消耗数值为敌人攻击力的 25% 的节拍值。不攻击时节拍 衰减。 + + +Limit Surge +限制浪涌 +Spend 40 WP to fully restore Stamina, also stamina gain is increased by 30% for 20 turns. If your Willpower ends up 0 because of this, you are stunned for 2 turns. +花费 40 意志力 即可完全恢复体力,并且体力增益增加 30%,持续 20 回合。 如果你的意志力因此而变为 0,你将被眩晕 2 回合。 + + +Battle Trance +战斗回响 +While at 40 Battle Rhythm, you attack twice per turn. +当战斗节拍达到 40 时,你每回合可以攻击两次。 + + +Combat Maneuver +战斗机动 +When Battle Trance is active, you gain a free move if the target is defeated before the second attack hits. +当战斗回响激活时,如果目标在第二次攻击命中之前被击败,你将获得一次自由移动。 + + + + + + +Devious Ingenuity +邪恶的独创性 +Trap-type spells and consumables no longer require you to channel them, but still have a delay before arming. +陷阱类法术和消耗品不再需要你引导它们,但在装备之前仍然有延迟。 + + + + + + +Essence Motes +精华尘埃 +When you miscast a spell, you gain an Essence Mote which appears in a random space next to you. You can consume this mote to gain -100% miscast chance decaying over 10 turns. Walking over the mote also consumes it. +当你施法失败时,你会获得一颗精华微粒,它会出现在你旁边的随机位置。你可以消耗这颗微粒来获得-100%的施法失误概率减免,效果在10回合内逐渐衰减。走过这颗微粒也会将其消耗。 + + +Inner Power +内在能力 +As a wizard, you are able to draw upon mystical sources of energy that others can't even see. After 16 turns of not casting a spell or attacking, your next spell's mana cost is reduced by 20% of your max mana BEFORE multipliers. Toggled passive spells apply half the cooldown. +作为一名巫师,你能够利用其他人甚至看不到的神秘能量源。在 16 回合未施展法术或攻击后,你下一个法术的法力消耗将在乘数计算之前减少相当于你最大法力值的 20%。 切换被动法术的冷却时间减半。 + + +Battlemage +战斗法师 +Inner Power cooldown is no longer reset after attacking. +攻击后内在能力冷却时间不再重置。 + + +Relentless Casting +无情施法 +While on cooldown, Inner Power cooldown is no longer reset after casting spells. +在冷却时,施展法术后内在能力冷却时间不再重置。 + + +Arcane Recharge +奥术充能 +Calling upon chaotic energies, your willpower is assaulted in exchange for power. Deals 80 psychic damage to self and drains 10% of your max Willpower to fully restore mana. Does not refill the mana pool. +召唤混乱的能量,以意志力会受到伤害为代价,以换取力量。对自己造成 80 点灵能伤害,并消耗你意志力上限的 10% 以完全恢复法力。不会补充法力池。 + + +Way of Pleasure +愉悦之路 +You have chosen the path of absolute pleasure. After letting go of yourself, you restore 50 mana, which can refill the mana pool if you have spare willpower. Blocks Way of Discipline. +你选择了极乐之路。高潮后,你将恢复 50 法力、如果你有多余的意志力,还能重新填满法力池。无法选择 “戒律之路”。 + + +Intense Power +强劲动力 +After letting go of yourself, you feel an immense surge of power, increasing magic damage by 40% for 8 turns after you regain control, and by 10% while you remain satisfied. +高潮后,你会感受到一股巨大的力量涌动,恢复控制后 8 回合内魔法伤害增加 40%,满足时增加 10%。 + + +Pleasure Training I +快乐训练 I +You remain satisfied for much less time after letting go. Letting go costs 50% less stamina. +高潮后,你保持满足感的时间就会少得多。高潮时消耗的体力减少 50% 。 +Pleasure Training II +快乐训练 II +You are quite difficult to satisfy. Letting go costs 50% less stamina (75% total) and 50% less willpower. +你很难满足。 高潮时消耗的体力会降低 50% ( 总计 75% ) 和 意志力消耗降低50% 。 + + +Mental Resistance +心理抵抗 ++100 Psychic and Charm Resist. You can no longer let go involuntarily while your WP is above 10% or you are shielded, and willpower drains 70% slower while edged. (click the buff to toggle) ++100精神与魅力抗性。除非你的意志力高于10%或被屏蔽,否则你无法不自觉地高潮(点击增益效果可切换)。在处于“高潮边缘”状态时,意志力消耗速度减慢70%。 +Mental Resistance: You cannot orgasm except by choice or below 25% WP. Click to toggle. +坚定意志 : 除非自愿或意志力为25%以下,否则无法高潮。点击以切换。 +Mental Resistance: You are allowing yourself to let go. Click to toggle. +坚定意志 : 你随意允许自己高潮。点击以切换。 + + +Way of Discipline +戒律之路 +You have chosen the path of absolute discipline. Being in an Edged state increases passive mana recovery and you regenerate 0.5 mana per turn, restoring the same amount to the Mana Pool if you have willpower to spare. Blocks Way of Pleasure. +你选择了克己之路。处于即将高潮的边缘时会增加被动法力恢复,并且每回合可再生 0.5 法力,如果你有多余的意志力,则可以将相同数量的法力恢复到法力池中。无法选择 “愉悦之路”。 + + +Way of Denial +拒绝之道 +Harnessing your mental discipline, you regenerate 20 mana each time you are denied, restoring the same amount to the Mana Pool if you have willpower to spare. +利用你的心理纪律,每次你被拒绝高潮时,你都会再生 20 点法力,如果你有多余的意志力,则将相同数量的法力恢复到法力池中。 + + +Flame Novice +基础火法术 +Unlocks fire spells. Learn Firebolt. +允许学习火法术 并习得元素法术 “火焰箭” +Lightning Novice +基础电法术 +Unlocks electrice spells. Learn Electrify. Gain increased resistance to blinding from bright lights. +允许学习电法术 并习得元素法术 “落雷”。增强对强光致盲的抵抗力。 +Water Novice +基础水法术 +Unlocks water spells. Learn Water Ball. +允许学习水法术 并习得元素法术“水球” +Ice Novice +基础冰法术 +Unlocks ice spells. Learn Freeze. +允许学习冰法术 并习得元素法术“冻结” +Earth Novice +基础岩法术 +Unlocks earth spells. Learn Stone Skin. +允许学习岩法术 并习得元素法术“石肤术” +Air Novice +基础风法术 +Unlocks air spells. Learn Wind Blast. +允许学习风法术 并习得元素法术 “暴风” + + +Latex 101 +乳胶 101 +Unlocks latex spells. Learn Slime Ball. +允许学习乳胶咒术 并习得咒术 “粘液球” +Metal 101 +金属 101 +Unlocks metal spells. Learn Conjure Cuffs. +允许学习金属咒术 并习得咒术 “召唤手铐” +Rope 101 +绳索 101 +Unlocks rope spells. Learn Conjure Ropes. +允许学习绳索咒术 并习得咒术 “召唤绳索” +Leather 101 +皮革 101 +Unlocks leather spells. Learn Conjure Gag. +允许学习皮革咒术 并习得咒术 “召唤口球” +Physics 101 +物理 101 +Unlocks teleportation and spatial manipulation spells. Learn Wall. +允许学习空间、传送和控制咒术。并习得咒术 “墙” +Summoning 101 +召唤 101 +Unlocks summoning spells. Learn Summon Familiar. +允许学习召唤咒术 并习得咒术 “召唤魔宠” + + +Blessing of Shadow +暗影祝福 +Unlocks shadow spells. Learn Shadow Dagger. +允许学习暗影幻术 并习得幻术 “暗影匕首” +Blessing of Light +光之祝福 +Unlocks light spells. Learn Flash. Gain significantly increased resistance to blinding from bright lights. +允许学习光芒幻术 并习得幻术 “光芒”。显著提高对强光致盲的抵抗力。 +Blessing of Obscurity +隐身祝福 +Unlocks invisibility spells. Learn Camouflage. +允许学习隐形幻术 并习得幻术 “拟态” +Projection Magic +投影魔法 +Unlocks illusory spells. Learn Summon Decoy. +允许学习投影幻术 并习得幻术 “召唤诱饵” +Alteration Magic +变化魔法 +Unlocks alteration spells. Learn Confuse. +解锁变化魔法。并习得幻术“迷惑”。 +Arcane Knowledge +奥术知识 +Unlocks knowledge and critical-strike spells. Learn True Steel, and unlocks advanced tooltips for enemies. +允许学习知识和暴击幻术 解锁对敌人的高级工具提示 并习得幻术 “共析钢” + + +The glue sticks to you and engulfs your legs! +胶体粘在你身上,吞没了你的腿! The glue slows you down! -胶水让你慢下来! +胶体让你慢下来! The glue slows you down! (-DamageDealt SP) -胶水让你慢下来! (-DamageDealt SP) +胶体让你慢下来! (-DamageDealt SP) + + +Firebolt +火焰箭 Elemental's Firebolt -元素的火焰弹 -Knife -刀 -Throw one of your knives DamageDealt damage. Lands in the target's tile +猛火炎箭 +Elemental's Gust +元素之风 +Gust +阵风 +A ball of flame that does DamageDealt damage to one target. +投出一个火焰球,对第一个目标造成 DamageDealt 点火焰伤害。 +You a hurl a firebolt! +你投掷了火焰箭! +Choose aim direction +选择发射方向 + + +Windblast +暴风 +Three scattered puffs of wind that do DamageDealt blast damage at close range, stun briefly, and push targets back. +三股分散的风,在小范围内造成 DamageDealt 点爆炸伤害,短暂眩晕目标并将它们击退。 +You press your wrists together and conjure a blast of wind! +你并拢手腕召唤出暴风! +Three puffs of wind in a tight cone that deal DamageDealt blast damage and push targets back. +朝着一个方向吹出三股风,造成 DamageDealt 点爆炸伤害并将目标击退。 +You exhale a mighty wind! +你呼出一股强大的风! + + +Throw one of your knives DamageDealt damage. Lands in the target's tile, but is recoverable afterward. 投掷你的一把刀,造成 DamageDealt 伤害,并落在命中目标的格子中。 You a throw a knife! 你扔出一把刀! -Portal Walk -进入传送门 -Teleport to a nearby location (including into darkness) after DelayTime turns. -在 DelayTime 回合后传送到一个地点(可以是黑暗的)。 -You call upon a misty portal to transport you! -你打开了一个迷雾传送门来传送你! + + +Shadow Dagger +暗影匕首 +A cold shadowy blade that deals DamageDealt damage and pierces all in its path. +一把冰冷的暗影之刃,对路径上所有格子造成DamageDealt贯穿伤害。 +You a hurl a shadowy dagger! +你投出一把暗影匕首! + + +Shadow Slash +暗影斩 +Shadow Scythe +暗影镰刀 +Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. Deals 50% more damage when you are attacking from the shadows. +切开你面前的区域,在一个区域内造成延迟的 DamageDealt 伤害并短暂减速。当你在阴影中攻击时,造成的伤害提高 50%。 +You create a tear in space with your finger! +你用你的手指撕裂了前方的空间! + + +Blink +闪现 +Instantly teleport to an adjacent position and gain +50 evasion for 3 turns. Unlocks Blink and Warp when learned. +瞬间传送到邻近位置,并获得 +50 闪避,持续 3 回合。学习后解锁闪现和扭曲。 +You teleport! +传送! +Choose target location (1 tile range) +选择施放位置 ( 1 格范围 ) +Blink II +闪现 +Instantly teleport up to 2 tiles away. Must have vision of the target point. Stuns an enemy if you teleport behind them. +立即传送至 2 格之外。目标位置必须可视。如果你传送到敌人身后,则会击晕敌人。 +Choose target location (2 tile range) +选择施放位置 ( 2 格范围 ) +Blink III +扭曲 +Instantly teleport up to 3 tiles away. Must have vision of the target point. +立即传送至 2 格之外。目标位置必须可视。 +Choose target location (3 tile range) +选择施放位置 ( 3 格范围 ) + + +Ice Shard +冰枪术 +A shard of ice that does DamageDealt damage and slows for Duration turns. Freezes if already slowed or drenched. +投掷一个造成 DamageDealt 寒冰伤害并在 Duration 回合内造成减速的冰枪。冻结减速或潮湿的目标。 +You a hurl a shard of ice! +你投出一杆冰枪! + + +Ice Lance +冰矛 +A quick-moving shard of ice that does DamageDealt damage and slows for Duration turns and passes through enemies. Freezes if already slowed or drenched. +发射一个高速冰矛,造成 DamageDealt 寒冰伤害并减速 Duration 回合,冻结减速或潮湿的目标。 +You conjure a mighty spear of ice and hurl it forward! +你召唤出一把强大的冰矛并将它向前投掷! + + +Snowball +雪球 +A fast orb that leaves behind a frigid cloud of ice. Enemies walking in the cloud take DamageDealt ice damage per tile and are slowed. +发射一个雪球,雪球将在路径上留下寒冰云。在寒冰云中的敌人每移动一格都会受到 DamageDealt 点寒冰伤害并被减速。 +You a hurl a snowy blast! +你掷出一团雪! + + +Winterblast +凛冽寒流 +A piercing orb that leaves a trail of ice. Deals DamageDealt ice damage to enemies hit. +发射一个贯穿整个路径并留下冰痕的严寒结晶。对击中的敌人造成 DamageDealt 点寒冰伤害。 +You a hurl a frigid orb! +你掷出一个严寒结晶! + + +Freeze +冻结 +Chill an adjacent target for DamageDealt ice damage and slows for Duration turns. Freezes if already slowed or drenched. +使身边的一个目标变得冰冷,造成 DamageDealt 寒冰伤害,并减速 Duration 回合。如果该目标已被淋湿或减速,使其冻结 +You utter dark words of ice-cold truths. +你说出冰封的黑暗咒语。 Choose a target to freeze 选择要冻结的目标 -Binding Chains -捆绑锁链 -Bola -投石索 + + +Flash Frost +霜闪 +Deal DamageDealt ice damage in a 3x3 area. Drenched creatures are frozen for 8 turns. +在3x3范围内造成 DamageDealt 点寒冰伤害,被潮湿的个体被冻结 8 回合。 +You recite a frigid poem... +你吟诵一首冰冷之诗... +Choose a 3x3 area to freeze +选择要冻结区域 ( 3x3 ) + + +Shatter +冰爆 +When a frozen target thaws or dies, deals DamageDealt ice damage to nearby targets and slow for 4 turns.. +当被冻结的目标解冻或死亡时,对附近的目标造成 DamageDealt 寒冰伤害,并减速 4 回合。 + + +Ignite +点燃 +Ignite a friendly target for Duration turns, dealing DamageDealt fire damage per turn to it and nearby targets. +点燃一个友方单位 Duration 回合,每回合对其及附近单位造成 DamageDealt 点火焰伤害。 +You spin in a circle, inscribing flames with your feet! +你旋转一圈,用你的脚产生火焰! +Choose a friendly target to ignite +选择一个友方目标来点燃 + + +Conjure Chain +召唤锁链 +Magic Chain +魔法锁链 +Magic Belt +魔法绑带 +Witch's Chain +女巫的锁链 +Throws a chain that does DamageDealt chain damage. Targets with 50% or more binding take 50 crush damage and are slowed for 4 turns. +投掷一条造成 DamageDealt 点锁链伤害的链条。对束缚值 50% 及以上的目标造成 50 点碾压伤害并减速 4 回合。 +You a hurl a strand of chain! +你投掷出一条锁链! + + +Enchant Rope +附魔绳索 +Rope Enchantment +绳索魔法 +Spellbinding +诱惑 +Convert rope binding on a target into magical bindings, which are much more powerful. Deals a small amount of arcane damage. +将目标上的绳索束缚转化为魔法束缚,威力更加强大。造成少量奥术伤害。 +You whisper an enchanting tale of rope bondage... +你低声地对着绳索束缚施着魔法…… +Choose targets to tighten the ropes of +选择目标来收紧绳索 + + +Conjure Ropes +召唤绳索 +Animated Rope +活化绳索 +Launch 3 ropes that deal DamageDealt chain damage each and add 32 rope binding. +发射 3 根绳索,每根绳索造成 DamageDealt 点锁链伤害,并增加 32 点绳索束缚。 +You animate a bunch of ropes! +你让一堆绳子动了起来! + + +Ropestorm +绳索风暴 +Launch 9 ropes that deal DamageDealt chain damage each and add 32 rope binding. Best in open spaces. +发射 9 根绳索,每根绳索都会造成 DamageDealt 锁链伤害,并添加 32 根绳索束缚。最好在空旷的空间下使用。 +You animate a sizeable quantity of ropes! +你活化了大量的绳索! + + +Steel Torrent +钢铁洪流 +Steel Rain +钢之雨 +The plug hits you! (DamageDealt) +插入物击中了你! ( 造成 DamageDealt 点伤害 ) +The plug directs itself between your legs! +插入物直接插进了你的两腿之间! +Fire 4 Steel Rain in quick succession toward the target point. Best in open spaces. +向目标点快速连续发射 4 片“钢之雨”,最好在空旷的地方施放。 +Fires a steel plug that deals DamageDealt piercing damage. Bound targets are Plugged, which increases Distraction over time. +发射一个造成 DamageDealt 点穿刺伤害的钢制插入物。被束缚的目标会被插入,随着时间的推移会增加性奋值。 +You raise your hand and a steel projectile appears! +你举起手,一枚钢弹出现了! +You raise your hand and several steel projectiles appear! +你举起手,数枚钢弹出现! +Choose target point +选择目标点 + + + + Restraining Device 拘束装置 The thrown restraining device latches onto you as you struggle to get it off!!! -当您努力挣脱时,抛出的拘束装置缠在了您身上!!! +当你挣扎着想从被抛出的约束装置挣脱出来时,它却牢牢地缠住了你!!! The restraining device wraps many elastic cables around you!!! -拘束装置将许多弹性绳索缠绕在您的周围!!! -Bola -投石索 +拘束装置将许多弹性缆绳缠绕在您周围! + + +Shadowy Grip +暗影控制 +A dark hand latches onto you and holds you tight! +一只深色的手抓住了你,紧紧地握住你! +You are snugly wrapped in glowing ropes! +你被紧紧地裹在发光的绳子里! +Obsidian Orb +黑曜宝珠 +Metallic restraints encircle your body! +金属束缚包围着你的身体! +The latex spreads across your limbs and rubberizes, forming a tough barrier! +乳胶遍布你的四肢并橡胶化,形成坚韧的屏障! +The latex spreads across your limbs and hardens, forming a stretchy layer! +乳胶遍布你的四肢并变硬,形成弹性层! +The latex clings to you and slows you down, making you vulnerable to the barrage! +乳胶会粘在你身上并减慢你的速度,使你容易受到弹幕攻击! +The latex expands rapidly and slows you down as it hardens into a stretchy layer! +乳胶会迅速膨胀,并在硬化成弹性层时减慢你的速度! + + You throw a bola! 你扔一个投石索! You ready a bola! 你准备好一个投石索! + + You are feeling drowsy... 你感觉昏昏欲睡…… + + Shadow Strike -暗影打击 +暗袭 Shadow Heel -暗影脚 -Shield -护盾 -Gives a creature a magic shield, reducing incoming damage by 25 up to 3 times (5 for the player). Expires after 50 turns. -给一个生物一个魔法护盾,将接下来三次(玩家为五次)受到的伤害降低 25 。 50回合后失效。 -You create a temporary shield! -你创造了一个临时的护盾! -Choose shielded creature -选择被保护的生物 -Analyze -分析 -Cast on Chest: Detect if there is a trap. Cast on Enemy: Show weaknesses on mouseover, and the next 3 hits it takes deal +30% damage. -对宝箱释放:检测是否有陷阱。对敌人施放:鼠标悬停时显示弱点,接下来的 3 次命中造成 +30% 伤害。 -Barrier -屏障 -Creates a shield that blocks BlockAmount damage from projectiles for DelayTime turns. -创建一个护盾,在 DelayTime 回合中阻挡来自射弹的 BlockAmount 伤害。 -You create a temporary shield! -你创造了一个临时的盾牌! -Choose shield location -选择屏蔽位置 -Witch's Electricity -女巫的落雷 +暗影高跟鞋 + + +Runic Ward +符文盾 +Gives yourself or a creature a magic shield for 50 turns, granting +30 Magic Armor. +对自身或其他个体施加魔法护盾,持续 50 回合,获得 +30 魔法护甲。 +You whisper a word of protection! +你轻声吟唱守护之咒! +Choose creature to shield +选择施加护盾的个体 + + +Afterimage +残像 +Massively increases a creature's evasion for 5 attacks. Expires after 25 turns. +大幅增加个体下 5 次被攻击时的闪避。 25回合后失效。 +Your movements intensify! +你的动作加快了! +Choose creature to buff +选择要buff的生物 + + +Magical Sight +魔之眼 +Highlight the location of interesting magical phenomena for 20 turns +突出有趣的魔法现象,持续 20 回合。 +You analyze the target! +你分析了目标! +Choose object to analyze +选择要分析的对象 + + +Barrier Runes +符文屏障 +Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns, but doesn't block movement. +创造一个 1x1 的可通过的巨石屏障,在 DelayTime 回合内阻挡来自投射物的 BlockAmount 点伤害。 +You raise a field of runes with a command word! +你轻声吟唱屏障之咒,创造出一片巨石屏障! +Choose barrier location +选择障碍位置 + + +Electric Field +静电场 +Creates a conductive area for Duration turns. Makes all entities in the area Conductive, forcing them to share 50% electric damage. +创造一个持续 Duration 回合的导电区域,使区域内个体导电。在导电区域内个体被电击伤害时,使区域内其他所有个体同时承受被攻击个体的 50% 电击伤害。 +You energize the targeted area! +你为区域注入能量! +Choose target 3x3 area +选择施放区域 ( 3x3 ) + + +Firey Explosion +火焰爆炸 +Icey Explosion +冰冷爆炸 Witch's Electric Orb 女巫的雷电球 Witch's Electric Burst 女巫的电击 -Ice Storm -暴风雪 -Swirling frost that deals DamageDealt damage per turn for LifeTime turns and slows enemies within. 5x5 area. You are unaffected. -旋转的冰霜在 LifeTime 回合内,每回合造成 DamageDealt 伤害。 5x5 区域。你不受影响。 -A bolt of lightning that does DamageDealt damage to enemies in a 4-range line and briefly stuns. -一道闪电对 4 格内的敌人造成穿透伤害并短暂眩晕。 + + +Electrify +落雷 +A delayed shock that deals DamageDealt damage and stuns for Duration turns. +释放一道造成 DamageDealt 电击伤害和 Duration 回合眩晕的延迟雷击。 +You charge up a burst of electricty! +你召唤了落雷! +Choose target location +选择施放位置 + + +The elemental channels the force of the storm! +元素引导风暴之力! + + +Fireball +炎爆术 +A slow moving ball of flame that explodes for DamageDealt fire damage in a wide area. +释放一个缓慢的大火球,击中一个敌人后在其所在区域造成 DamageDealt 点火焰伤害。 +You a hurl a massive fireball! +你投出了一个巨大的火球! + + +Fireblast +火球术 +A bolt of flame that explodes for DamageDealt fire damage in an area. +释放一个火球,击中敌人后在一个小范围区域造成 DamageDealt 火焰伤害。 +You a hurl a blast of flame! +你扔出一道冲击波! + + +Incinerate +焚风 +A tornado of flame that does DamageDealt damage per turn for LifeTime turns. +释放火焰龙卷风,持续 LifeTime 回合,每回合造成 DamageDealt 点火伤害。 +You conjure a gout of flame! +你召唤出一团火焰! +Choose target AoE location +选择施放位置 + + +Hailstorm +冰雹 +A cloud of falling ice that does DamageDealt damage per turn for LifeTime turns and slows. +降下一道冰雹,持续 LifeTime 回合,每回合造成 DamageDealt 点寒冰伤害和减速。 +You conjure a flurry of frost! +你召唤了冰雹! + + +Raincloud +雨云 +After 3 turns, rain falls, creating a 3x3 grid of water and dealing DamageDealt acid damage to enemies within. +创造一个持续 3 个回合 3x3 的酸雨团,对敌人造成 DamageDealt 点酸蚀伤害,3 回合后形成 3x3 的积水。 +You create a stormy cloud! +你召唤出暴风雨! + + +Field of Frost +天寒地冻 +Freezes a 5x5 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. +冻结 5x5 的区域并附加减速。 该区域中的敌人每回合受到 DamageDealt 点伤害,持续 LifeTime 回合。 +You stomp your foot and call forth the blizzard! +你跺脚召来暴风雪! +Choose target AoE location (5x5) +选择施放区域 (5x5) +Zone of Frost +透骨奇寒 +Freezes a 3x3 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. +冻结3x3的区域并施加。该区域的敌人收到 DamageDealt 点伤害,持续LifeTime回合。 +You sweep your foot and call forth the storm! +你跺脚召来风暴! +Choose target AoE location (3x3) +选择施放区域 (3x3) +Cold Feet +寒气逼人 +Freezes a single tile (ice slows entities). Any enemy standing on the tile takes take DamageDealt damage per turn for LifeTime turns. +冻结单个区域并施加减速。该区域的敌人收到 DamageDealt 点伤害,持续LifeTime回合。 +You tap your foot and call forth the frost! +你跺脚召来寒霜! +Choose target location (1x1) +选择施放区域 (1x1) + + +Healing Light +治愈之光 +Channel to heal 15 hitpoints per turn to summoned allies within a 5x5 area. +为 5x5 区域内的召唤盟友回复 15HP ( 不包括你自己 ) +You conjure a healing light! +你召唤出治愈之光! + + +Crackle +暴雷 +Storm Bolt +风暴之箭 +A bolt of lightning that does DamageDealt electric damage to enemies in a 4-range line and briefly stuns. +召唤一道闪电,对施法方向 4 格内的敌人造成 DamageDealt 点电击伤害,附加短暂眩晕。 +Lightning erupts from your fingertips! +闪电从指尖爆发! +Choose line direction (max range 4 tiles) +选择直线区域 ( 最大范围 4 个格 ) + + +Tremor +震颤 +Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. Creates a slowing field after. +在 Duration 回合内向目标区域中的敌人施加脆弱和减速,并造成 DamageDealt 点碾压伤害。并创建一个减速场。 +You call forth the rage of the earth. +你唤起了大地之怒。 +Choose AoE +选择施放位置 + + +Earthquake +地震术 +Channel for 5 turns to send 2 tremors per turn in target area. +持续 5 回合,每回合在目标区域施放两次“震颤” +You channel the fury of the earth!!! +你引导着大地之怒!!! + + +Shock Orb +冲击之球 +A slow-moving orb that deals DamageDealt electric damage to an adjacent enemy each turn. +召唤一个缓慢移动的球体,每回合对相邻敌人造成 DamageDealt 点电击伤害。 +You hurl a charged orb! +你召唤了一个带电的球体! +Choose aim direction (max range 4 tiles) +选择发射方向 ( 最大射程 4 格 ) + + +Lightning Rune +闪电符文 +A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 3 turns to setup. 200% crit multiplier. +可造成电击伤害并眩晕 4 个回合的陷阱。设置需要 3 个回合。200% 碰撞倍增器。 +You conjure a charged trap! +你设置了一个闪电陷阱! +Choose location for trap +选择放置陷阱的位置 + + +Freeze Rune +霜冻符文 +A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 3 turns to setup. 200% crit multiplier. +放置一个暴击倍率为 200% 的霜冻陷阱,可对敌人造成 DamageDealt 点寒冰伤害并冻结 30 个回合。需要 3 个回合来设置。 +You conjure an icy trap! +你设置了一个霜冻陷阱! + + +Flame Rune +火焰符文 +A trap that deals DamageDealt fire damage in an area. Takes 3 turns to setup. 200% crit multiplier. +设置一个触发后对该方格敌人造成 DamageDealt 点火焰伤害的陷阱。设置后需要 3 个回合才能生效。暴击伤害为 200%。 +You conjure an incendiary trap! +你设置了一个火焰陷阱! + + +Conjure a sphere for Duration turns that makes nearby entities Conductive and each turn deals DamageDealt electric damage to one of them. +召唤一个球体 Duration 回合,使相邻的个体导电,且每回合对其中一个个体造成 DamageDealt 电击伤害。 +You summon a grey, featureless sphere adorned by static! +你召唤了一个由静电环绕的暗淡无光的球体! +Choose sphere location +选择球体位置 + + +Fissure +熔岩裂缝 +Lava Fissure +熔岩裂缝 +A great fissure erupts from the earth, dealing 70 fire damage to enemies in a 4-range line and dealing 15 damage/turn for 6 turns. +使大地崩裂喷出熔岩,对 4 格范围内的敌人造成 70 点火焰伤害,接下来每回合造成 15 点火焰伤害,持续6回合。 +You stomp the ground and the earth opens its gaping maw! +你重踏大地,地面出现了无底洞! + + +Lightning Bolt +闪电箭 +A bolt of lightning that does DamageDealt damage to enemies in an infinite line and briefly stuns. +召唤一道闪电,对施法方向上所有的敌人造成 DamageDealt 点电击伤害,附加短暂眩晕。 +You unleash a bolt of lightning! +你释放出一道闪电! +Choose line direction +选择直线区域 + + +Corona +电晕 Binding Light 束缚之光 Chaos Beam 混沌光束 +Mystic Beam +神秘光束 +Mystic Barrage +魔法弹幕 +A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt holy damage to the first target hit. Blinds for 12 turns. 150% crit multiplier. +引导一束光束 2 回合 ( 让你短暂眩晕 ) ,然后立即对第一个击中的目标造成 DamageDealt 点神圣伤害。致盲 12 回合。150% 暴击倍数。 +You charge a powerful beam attack!!! +你蓄力释放强大的光束攻击!!! + + +Icicles +冰柱 +Icicle +冰柱 +Channel 3 turns to fire 3 icicles that deal DamageDealt ice damage and slow for 4 turns, freezing slowed/drenched targets for 3 turns. +在 3 回合内发射 3 根造成 DamageDealt 点寒冰伤害并减速 4 回合的冰柱,冻结减速或潮湿的目标 3 回合。 +You raise a hand and icicles fly forward! +你举起手,冰柱开始出现! + + +Volcanism +火山爆发 +An area of summoned rocks becomes explosive. Deal fire damage to them to ignite, dealing DamageDealt fire damage to adjacent targets. +引爆一块召唤出的岩石。引燃相邻目标并造成 DamageDealt 火焰伤害。 +You stomp your foot and magma wells up beneath the ground! +你跺了跺脚,岩浆从巨石中喷涌而出! +Choose monoliths to enchant +选择要附魔的巨石 + + +Coalesce +聚合 +Gathers slime and slimed enemies into a central point. Deals DamageDealt glue damage per square of slime and Encases slimed enemies. Costs half mana if there is only slime. +将粘液和粘液包裹的敌人聚集到一个中心点。 每块粘液造成 DamageDealt 点胶体伤害并包裹粘液中的敌人。如果目标只有粘液则只消耗一半法力值。 +You command the slime to draw enemies in! +你命令粘液包裹敌人! +Choose area containing slime +选择含有粘液的区域 + + +Animate Slime +粘液团 +Summons up to 3 slimes on slime tiles in an AoE. The slimes are friendly to you. +在目标区域的粘液上召唤最多 3 个友好粘液团。 +You concentrate magical energy into the slime, giving it a will of it's own... +你把魔法能量集中到黏液中,让它有自己的意志… + + +Animate Large Slime +大型粘液团 +Target an area with at least 3 slime tiles. Summons a large slime that is friendly to you. +在目标区域的粘液上召唤 1 个大型友好粘液团 ( 至少 3 格粘液瓷砖 ) 。 + + +Latex Puppet +乳胶木偶 +Target an area containing helpless encased enemies. Transforms up to 3 of them into latex dolls that serve you for a while. +瞄准包含完全束缚的敌人的区域,将最多 3 个完全束缚的敌人变成乳胶娃娃,使其为你服务一段时间。 +You concentrate magical energy into your victim's bindings, forcing them to move... +你将魔法能量注入到受害者的束缚中,迫使他们移动...... +Choose area containing encased helpless enemies. +选择含有被完全束缚的敌人的区域。 + + +Solidify +固化 +Solidifies slime in the area into Latex. Latex adheres to enemies and slowly binds them, escasing them when they are fully bound. +将区域内的粘液凝固成乳胶。 乳胶会粘附在敌人身上并慢慢地束缚他们,当他们完全被束缚时彻底转化。 +You inscribe a transmutation circle on the floor. +你在地板上释放了转化魔法。 +LiquidMetal +液态金属 +Solidifies Latex in the area into Liquid Metal. Liquid Metal is slippery, but also adheres to enemies and slowly binds them in metallic bonds. Enemies encased in liquid metal are more susceptible to knockback due to the slippery nature. +将区域内的乳胶固化成液态金属。液态金属很滑,但也会粘附在敌人身上,并慢慢地将他们束缚在金属中。由于其湿滑特性,包裹在液态金属中的敌人更容易被击退。 +Choose area containing Latex +选择含有乳胶的区域 + + +Slime Repulsion +粘液排斥 +Gain +50 glue resist. (Having 45 or more Glue Resist negates many negative effects from slime) +增加 50 点胶体抗性。 ( 具有 45 或更高的胶体抗性可以消除粘液的许多负面影响 ) + + +Spread +增殖 +Slime in the target area expands by 1 unit in the four cardinal directions. Refreshes duration to 12-20 turns. +目标区域中的粘液会在四个主要方向上扩展 1 个单位。粘液持续 12-20 回合。 +The slime spreads! +粘液蔓延开来! + + +Wall of Slime +粘液墙 +Unlocks horizontal and vertical slime walls that traps enemies who try to pass through. +解锁水平和垂直粘液墙,困住试图穿过的敌人。 + + +Wall of Slime (Vert) +粘液墙 ( 垂直 ) +Creates a vertical wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. +创造一堵垂直的粘液墙,持续 20 回合。 穿过的敌人会卡在墙上并变得黏糊糊的。 +You tap your foot and a wall of slime slowly raises out of the ground. +你轻踮脚尖,一堵粘液墙慢慢地从地上升起。 +Choose vertical wall origin (5 tiles high) +选择垂直墙原点 ( 5 格高 ) + + +Wall of Slime (Horiz) +粘液墙 ( 水平 ) +Creates a horizontal wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. +创造一面水平的粘液墙,持续 20 回合。 穿过的敌人会卡在墙上并变得黏糊糊的。 +Choose horizontal wall origin (5 tiles wide) +选择水平墙原点 ( 5 格宽 ) + + +Wall of Latex +乳胶墙 +Unlocks horizontal and vertical latex walls that encase enemies that walk through. +解锁水平和垂直乳胶墙,包裹试图穿过的敌人。 + + +Wall of Latex (Vert) +乳胶墙 ( 垂直 ) +Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. +创造一堵可持续 20 个回合的垂直乳胶墙,穿过的目标将被乳胶包裹;如果没有被包裹,将受到 50 点胶体伤害并获得致盲效果。 +You tap your foot and a wall of latex stretches out across the corridor. +你轻踮脚尖,一堵乳胶墙慢慢地从地上升起。 + + +Wall of Latex (Horiz) +乳胶墙 ( 水平 ) +Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. +创造一堵可持续 20 个回合的水平乳胶墙,穿过的目标将被乳胶包裹;如果没有被包裹,将受到 50 点胶体伤害并获得致盲效果。 + + +Earthshape +地形转变 +Unlocks 3 spells that allow creating mounds, rings, or lines of 50hp, 25 armor rocks. +解锁 3 个法术,分别允许创造以方形、环形和直线形的分布的巨石,巨石具有 50HP 和 25 点护甲。 +Earthen monoliths rise from the ground! +巨石拔地而起! +An earthen monolith rises from the ground! +一块巨石拔地而起! + + +Earthshape (Ring) +地型转变 ( 环形 ) +Create a large ring of Earthen Monoliths. They have 50 hitpoints and 25 armor. +创造以环形分布的巨石。巨石具有 50 点生命值 和 25 点护甲。 +You stomp your foot and monoliths emerge in a ring around you! +你跺了跺脚,巨石在你周围拔地而起! +Choose ring origin +选择环形区域 + + +Earthshape (Mound) +地型转变 ( 方形 ) +Create a 3x3 field of Earthen Monoliths. They have 50 hitpoints and 25 armor. +创造以 3x3 方形分布的巨石。巨石具有 50 点生命值 和 25 点护甲。 +You stomp your foot and monoliths emerge from the ground! +你跺了跺脚,巨石拔地而起! +Choose mound origin +选择方形区域 + + +Earthshape (Line) +地型转变 ( 直线形 ) +Create a 4-tile line of Earthen Monoliths. They have 50 hitpoints and 25 armor. +创造以 4 格线形分布的巨石。巨石具有 50 点生命值 和 25 点护甲。 + + +Earthshape (Arc) +塑造大地 ( 弧形 ) +Create a 5-wide arc of Earthen Monoliths. They have 50 hitpoints and 25 armor. +创建一个 5 宽的土制巨石弧。他们有 50 点生命值和 25 点护甲。 + + +Rock +巨石 +Channel 1 turn to launch a rock that deals DamageDealt crush damage and slows for 4 turns. Blocks up to 80 damage. +消耗 1 回合发射一块岩石,造成 DamageDealt 点碾压伤害并减速 4 回合,阻挡最多 80 点伤害。 +You raise a stone from the ground and kick it forward! +你用魔法从地上剥离出一块岩石并向前发射! + + +Earth Kick +巨石飞射 +Stone Projectile +巨石飞弹 +Kick a summoned rock to turn it into a projectile. Deals DamageDealt crush damage in a 3x3 area and slows for 4 turns. +射出一块召唤出的巨石。 在 3x3 区域内造成 DamageDealt 点碾压伤害并减速 4 回合。 +With a solid kick, you launch one of your monoliths forward! +你射出一块召唤巨石! +Choose a monolith to kick +选择要发射的巨石 + + +Boulder +巨岩 +Channel 1 turn to launch a huge slow rock that deals DamageDealt crush damage and slows for 8 turns. AoE, collides with summoned rocks. Blocks up to 200 damage. +消耗 1 回合发射一块巨大但缓慢的岩石,造成 DamageDealt 碾压伤害并减速 8 回合。范围攻击会被巨岩抵挡,阻挡最多 200 点伤害。 +You raise a massive boulder from the ground and kick it forward! +你用魔法从地上剥离出一块巨石并向前发射! + + Stamina Up I -耐力提升 I -Increases maximum SP by 12 -最大 SP 增加 12 -Stamina Up II -耐力提升 II +体力提升 I Increases maximum SP by 12 -最大 SP 增加 12 -Stamina Up III -耐力提升 III -Increases maximum SP by 12 -最大 SP 增加 12 +体力值上限增加 12 + + +Iron Will +钢铁意志 +While you have 100 current willpower or more, regain an additional 4 stamina per turn. +当你当前意志力达到 100 点或更多时,每回合额外恢复 4 点体力。 +Defiance +蔑视 +For each 10 current willpower you have over 50, gain +5 Bondage Resist. +当前意志力超过 50 点,每 10 点,获得 +5 束缚抗性。 +Willful Struggle +自由意志 +For each 10 current willpower you have over 50, gain +1% struggle power. +当前意志力超过 50 点,每增加 10 点,挣脱能力就会增加 1%。 +Your willpower provides you with additional strength! (+AMOUNT%) +你的意志力为你提供额外的力量! ( +AMOUNT% ) +Athlete +体育健将 +Sprinting costs 40% less stamina. +冲刺消耗的体力减少 40%。 +Sneaky +影于暗处 +You are harder to see when waiting. +你在等待时很难被发现。 +Vault +腾跃 +You can sprint under flying enemies and through vulnerable, slowed, or disabled enemies. Does not work on immobile enemies such as doors and turrets. +你可以在飞行的敌人下方冲刺,也可以冲过脆弱、缓慢或残疾的敌人。对门和炮塔等不动的敌人不起作用。 +Improved Vault +改进的腾跃 +You can dash through enemies that aren't immobile. +你可以冲过不动的敌人。 +Dodge I +闪避 I ++10 Evasion ++10 闪避 +Dodge II +闪避 II ++15 Evasion (25 total) ++15 闪避 ( 总计 25 ) +Dodge III +闪避 III ++25 Evasion (50 total) ++25 闪避 ( 总计 50 ) + + +Strength Up +力量提升 ++20% Physical Damage ++20% 物理伤害 + + +Deadly Aim +致命瞄准 +Increases crit multiplier by a % equal to your Battle Rhythm. +将暴击倍数提高等于你的战斗节拍的百分比。 + + +Accuracy I +精准 I ++10 Accuracy ++10 命中率 +Accuracy II +精准 II ++15 Accuracy (25 total) ++15 命中率 ( 总计 25 ) +Accuracy III +精准 III ++25 Accuracy (50 total) ++25 命中率 ( 总计 50 ) + + +Martial Arts I +武术 I +Unarmed strikes gain 15% accuracy and -10% stamina cost. +徒手攻击提高 15% 命中率并且 -10% 的体力消耗。 +Martial Arts II +武术 II +Unarmed strikes gain 20% accuracy (35% total) and -15% stamina cost (25% total). +徒手攻击提高 20% 命中率 ( 总计 35% ) 并且 -15% 的体力消耗 ( 总计 25% ) 。 +Martial Arts III +武术 III +Unarmed strikes gain 25% accuracy (60% total) and -25% stamina cost (50% total). +徒手攻击提高 25% 命中率 ( 总计 60% ) 并且 -25% 的体力消耗 ( 总计 50% ) 。 + + +Precise Critical +精准暴击 +When landing a critical strike with physical damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. +当造成物理伤害的暴击时,超过 100% 的命中率将以 50% 的效率转化为额外暴击倍数。 +Precise Magic +精准魔法 +When landing a critical strike with magic damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. +当造成魔法伤害的暴击时,超过 100% 的命中率会以 50% 的效率转化为额外暴击倍数。 +Magical Overload +魔法超载 +When landing a critical strike with magic damage, crit multiplier is increased by 25% of your current DP. +当造成魔法伤害的暴击时,暴击倍数增加当前 性奋值 的 25%。 + + +Brute Force +蛮力攻击 +When enabled, your attacks deal 10% of your willpower as additional crush damage but cost 10 more stamina. +启用后,你的攻击会造成意志力上限10%的额外碾压伤害,但会多消耗 10 点体力。 + + +One With Slime +粘液一体 +While standing on slime/latex, you can cast rubber spells without components. +当你站在黏液/乳胶上时,你可以在施法部位被限制时释放橡胶法术。 + + +Convincing Disguise +令人信服的伪装 +While standing still on slime, or fully bound with at least one latex item, you are harder to notice. Each latex restraint you are wearing increases this amount. Can be toggled off by clicking the buff icon. +当你站在粘液上或与至少一件乳胶物品完全结合时,你就很难被注意到。你佩戴的每个乳胶束缚都会增加此量。可以通过单击 buff 图标来关闭。 + + +Magical Implements +魔法武器精通 +While holding a magical weapon like a staff or magic knife, your mana costs are reduced by 20%. +手持法杖或魔法刀等魔法武器时,法力消耗降低20%。 +Mage Circuits +魔法电路 +Increases the size of the passive mana pool by +400. +使被动法力池增加 400 点。 +Archmage +大魔法师 +Upcasted spells cost 25% less mana. +减少进阶法术 25% 法力消耗。 + + +Temperature Play +冰火两重天 +Fire and Ice damage do 30% more damage to fully bound enemies. +对被完全束缚的敌人造成额外 30% 火焰或寒冰伤害。 +Fire Hazard +危险之火 +Fire damage ignites enemies for 5 damage per turn for 6 turns. +火焰伤害可使敌人进入燃烧状态 6 回合,每回合造成 5 点伤害。 +Frozen Prison +寒冰牢狱 +Freezing an enemy applies 10 binding per turn of freeze added, plus brings the enemy to a minimum of 20% binding. +冻结敌人,使敌人的拘束值至少达到 20%,每冻结一回合还会增加 10% 束缚。 +Lightning Rod +避雷针 +After casting an Air or Storm spell that costs mana, become Conductive and gain 300% electric resist for 3 turns. +在施放消耗法力的风或电法术后,变得导电并获得 300% 的电击抗性,持续 3 回合。 +When enabled, enemies in chastity become angry Frustrated Pets when becoming helpless. +启用后,处在贞操带中的敌人变得无助时会成为愤怒沮丧的宠物。 + + Mana Up I 法力上升 I Increases maximum MP by 12 -最大 MP 增加 12 +法力值上限增加 12 Mana Up II 法力上升 II -Increases maximum MP by 12 -最大 MP 增加 12 Mana Up III 法力上升 III -Increases maximum MP by 12 -最大 MP 增加 12 + + Strong Mind I 意志坚定 I Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -将最大干扰值提高基础值的 33% ,干扰值每回合降低0.1 +将最性奋值上限提高基础值的 33% ,性奋值每回合降低0.1 Strong Mind II 意志坚定 II -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -将最大干扰值提高基础值的 33% ,干扰值每回合降低0.1 Strong Mind III 意志坚定 III -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -将最大干扰值提高基础值的 33% ,干扰值每回合降低 -0.1 + + Expert Wizard 专业法师 Gives you an additional spell choice slot 给你一个额外的法术选择槽 Master Wizard 大师级法师 -Gives you an additional spell choice slot -给你一个额外的法术选择槽 Legendary Wizard 传奇法师 -Gives you an additional spell choice slot -给你一个额外的法术选择槽 -Forbidden Ropes -禁忌之绳 -Abyssal ropes deal DamageDealt chain damage in a 3x3 AoE and apply 9 points of binding. Roots briefly. -深渊之绳在 3x3 范围内造成伤害造成锁链伤害并施加 9 点束缚值。定身。 -Smoke Bomb -烟雾弹 + + +More Summons +专家召唤师 +Increases the permanent summon cap by +2 (from 2 to 4) +召唤上限永久增加 +2 ( 从 2 增加到 4 ) +Many Summons +传奇召唤师 +Increases the permanent summon cap by +2 (from 4 to 6) +召唤上限永久增加 +2 ( 从 4 增加到 6 ) + + +Summon Bomb +召唤炸弹 +Channel for 1 turn for a bomb that does DamageDealt blast damage in an area after DelayTime turns. +消耗1回合,放置一个 DelayTime 回合后在一个区域内造成 DamageDealt 点爆炸伤害的炸弹。 +Fire in the hole! +小心炸弹! + + +An AoE trap on the ground that deals 25 chain damage, roots for 8 turns, and applies 80 points of binding. Takes 3 turns to setup. 200% crit multiplier. +施放在地面上的陷阱,造成 25 点锁链伤害,在地面存在 8 回合,并施加 80 点束缚。需要 3 回合才能完成放置。200% 暴击倍数。 +You conjure a rope trap! +你召唤了一个绳索陷阱! + + +Rope Burst +绳索爆发 +An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 50 points of rope binding. Snares for Duration turns. +使绳索在 3x3 区域内爆发,造成 DamageDealt 点锁链伤害,增加 50 点绳索束缚,并拘束 Duration 回合。 +You call forth ropes from the abyss! +你从深渊中召唤绳索! +Select center of a a 3x3 AoE +选择施放区域 ( 3x3 ) + + +Leather Package +皮革包裹 +After conjuring a leather restraint, you can conjure up to three more without advancing time. +在召唤出皮革拘束具后,可在同一回合内继续召唤 3 个拘束具。 + + +Conjure Leather Cuffs +召唤皮革铐 +Conjured Leather Cuffs +魔法皮革铐 +The leather cuffs clasp your wrists and pull them tightly! +皮革铐紧紧扣住了你的手腕! +The leather cuffs hit you! (DamageDealt) +皮革铐击中了你! ( 造成 DamageDealt 点伤害 ) +Summons a pair of cuffs which deals DamageDealt chain damage and adds 40 binding. Until the target struggles free, attacking the target disarms them for 3 turns. +召唤一个造成 DamageDealt 点锁链伤害并增加 40 点束缚的皮革铐。在目标挣脱之前,攻击目标会使他们缴械 3 回合。 +You conjure leather cuffs! +你召唤出皮革铐! +The cuffs will appear next to you and fly toward the target point. +皮革铐出现在你身边并飞向目标点。 + + +Conjure Blindfold +召唤眼罩 +Conjured Blindfold +魔法眼罩 +The blindfold wraps around your head and buckles tightly! +眼罩缠绕在你的头上并扣紧! +The blindfold hits you! (DamageDealt) +眼罩击中了你! ( 造成 DamageDealt 点伤害 ) +Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not blinded. +召唤眼罩来捆绑目标,对目标造成 DamageDealt 点锁链伤害,并使其致盲 20 个回合;如果没有致盲,则增加目标 40 点束缚。 +You conjure a blindfold! +你召唤出眼罩! +The blindfold will appear next to you and fly toward the target point. +眼罩出现在你身边并飞向目标点。 + + +Conjure Cuffs +召唤手铐 +Conjured Cuffs +魔法手铐 +The cuffs pull your wrists together and click tightly! +手铐将你的手腕拉在一起并紧紧地锁住! +The cuffs hit you! (DamageDealt) +手铐击中了你! ( 造成 DamageDealt 点伤害 ) +Summons a pair of cuffs which deals DamageDealt chain damage and disarms for 5 turns. +40 binding if target is not disarmed. +召唤一对造成 DamageDealt 点锁链伤害并缴械 5 回合的手铐,对目标未缴械增加 40 点束缚。 +You conjure a pair of cuffs! +你召唤了一对手铐! + + +Conjure Gag +召唤口塞 +The gag forces itself into your mouth and buckles tightly! +口塞自动塞入你的嘴巴并紧紧扣住! +The gag hits you! (DamageDealt) +口塞击中了你! ( 造成 DamageDealt 点伤害 ) +Summons a gag which deals DamageDealt chain damage and silences for 8 turns. +40 binding if target is not silenced. +召唤一个口球,造成 DamageDealt 连锁伤害,并沉默8回合。如果目标未被捆绑+40束缚。 +You conjure a gag! +你召唤出口塞! +The gag will appear next to you and fly toward the target point. +口塞出现在你旁边并飞向目标点。 + + +Conjure Anti-Magic Gag +召唤反魔法口球 +Conjured Anti-Magic Gag +召唤出反魔法口球 +The anti-magic gag forces itself into your mouth and buckles tightly! +反魔法口球强行塞进你的嘴里,然后紧紧地扣上! +The anti-magic gag hits you! (DamageDealt) +反魔法口球击中了你! ( DamageDealt ) +Summons a magic-absorbing gag which deals DamageDealt teasing arcane damage and silences for 15 turns. Applies a debuff that increases miscast chance by 50%. +召唤一个吸收魔法的口球,造成 DamageDealt 挑逗奥术伤害并沉默15回合。施加一个增加50%失误几率的减益效果。 +You conjure an anti-magic gag! +你召唤出了一个反魔法的口球! + + +Conjure Armbinder +召唤单手套 +Conjured Armbinder +魔法单手套 +The armbinder slips itself around your arms and buckles itself tightly! +单手套自动套在你的手臂上并紧紧包住了你的手臂! +The armbinder hits you! (DamageDealt) +单手套击中了你! ( 造成 DamageDealt 点伤害 ) +Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Cannot be blocked. +召唤单手套来捆绑目标,对目标造成 DamageDealt 点锁链伤害,并在 13 个回合内缴械目标,不可阻挡。 +You conjure a armbinder! +你召唤出单手套! +The armbinder will appear next to you and fly toward the target point. +单手套出现在你旁边并飞向目标点。 + + +Conjure Legbinder +召唤束腿套 +Conjured Legbinder +魔法束腿套 +The legbinder slips itself around your legs and buckles itself tightly! +束腿套自动套在你的腿上并紧紧包住了你的腿! +The legbinder hits you! (DamageDealt) +束腿套击中了你! ( 造成 DamageDealt 点伤害 ) +Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. +召唤一个造成 DamageDealt 点锁链伤害的束腿套,并拘束 10 回合。对未拘束个体增加 50 点束缚。不可阻挡。 +You conjure a legbinder! +你召唤出束腿套! +The legbinder will appear next to you and fly toward the target point. +束腿套出现在你旁边并飞向目标点。 + + +Conjure Latex Gag +召唤乳胶口塞 +Conjured Latex Gag +魔法乳胶口塞 +Latex Gag +乳胶口塞 +Latex Glob +乳胶球 +The gag forces itself into your mouth and snaps on tightly! +口塞自动塞入你的嘴里并紧紧地扣住! +The amorphous rubber stretches out into a restraint on your body! +不规则的橡胶伸展开来,形成对你身体的束缚! +The amorphous rubber sticks to you! (DamageDealt) +不规则的橡胶粘在了你的身上! ( DamageDealt ) +Summons a gag which deals DamageDealt glue damage and silences for 15 turns. +40 binding if target is not silenced. +召唤一个口塞,造成 DamageDealt 胶体伤害并沉默 15 回合。如果目标没有被沉默,则 +40 束缚。 + + +Conjure Latex Armbinder +召唤乳胶单手套 +Conjured Latex Armbinder +魔法乳胶单手套 +The armbinder slips itself around your arms and snaps on tightly! +单手套自动滑入你的手臂上并紧紧包住了你的手臂! +Summons an armbinder which deals DamageDealt glue damage and disarms for 13 turns. Cannot be blocked. +召唤一件单手套,造成 DamageDealt 胶体伤害并解除武装,持续 13 回合。不可阻挡。 + + +Conjure Latex Legbinder +召唤乳胶束腿套 +Conjured Latex Legbinder +魔法乳胶束腿套 +The legbinder slips itself around your legs and snaps on tightly! +束腿套自动滑入你的腿上并紧紧包住了你的腿! +Summons a legbinder which deals DamageDealt glue damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. +召唤束腿套,造成 DamageDealt 胶体伤害并召唤陷阱,持续 10 回合。如果目标没有被诱捕,则 +50 束缚。不可阻挡。 + + +Conjure Straitjacket +召唤拘束衣 +Conjured Straitjacket +魔法拘束衣 +The straitjacket slips itself around your body and pulls your arms into its sleeves! +拘束衣紧紧包住了你的身体,把你的手臂拉入了袖口! +The straitjacket hits you! (DamageDealt) +拘束衣击中了你! ( 造成 DamageDealt 点伤害 ) +Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. Cannot be blocked. +召唤一件造成 DamageDealt 点束缚的拘束衣,并降低挣扎速度 14 回合。不可阻挡。 +You conjure a straitjacket! +你召唤了出拘束衣! +The straitjacket will appear next to you and fly toward the target point. +拘束衣出现在你身边并飞向目标点。 + + +Conjure Harness +召唤束衣 +Conjured Harness +魔法束衣 +The harness slips itself around your torso and squeezes tightly as each buckle secures itself one by one! +束衣围在你身体周围并收紧,紧接着带扣一个个地被固定住! +The harness hits you! (DamageDealt) +束衣击中了你! ( 造成 DamageDealt 点伤害 ) +Summons a harness which deals DamageDealt chain damage. Adds +50 binding per 25% binding level on target, up to +200. +召唤一个造成 DamageDealt 锁链伤害的束衣。目标每增加 25% 束缚等级就额外增加 50 点束缚,最多增加 200 点。 +You conjure a harness! +你召唤了束衣! +The harness will appear next to you and fly toward the target point. +束衣将出现在你旁边并飞向目标点。 + + +Firecracker +迸裂火花 +A small delayed explosion that deals DamageDealt fire damage. +造成 DamageDealt 点火伤害小型的延时爆炸, 。 +You shout an incendiary retort! +你丢出一团燃烧的炸药! +Choose AoE location +选择施放位置 + + +Feather Burst +羽翼破乱 +After a brief delay, a small cloud of feathers tickles enemies for DamageDealt damage and +60 distraction for 3 turns. +短暂延迟后,一小团羽毛将使敌人发痒,给敌人造成 DamageDealt 点挠痒伤害和 60 点性奋值。 +You conjure a burst of frenetic feathers! +你召唤了一阵疯狂的羽毛! + + +Tickle Cloud +挠痒云 +For 10 turns, disembodied hands tickle a target location for DamageDealt tickle damage. +在 10 回合内,看不见的手对目标位置造成 DamageDealt 挠痒伤害。 +A swarm of hands holding feathers appears! +一群拿着羽毛的看不见的手出现了! +Choose location +选择位置 + + +Frustrated Pet +沮丧的宠物 +The pet collapses in frustration. +宠物沮丧地瘫倒在地。 + + +Mana Pet +法力宠物 +The enemy steals your pet from you! +敌人偷走了你的宠物! + + +Display Doll +展示玩偶 +The enemy steals your doll from you! +敌人偷走了你的玩偶! + + +Conjure Petsuit +召唤宠物服 +Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery from mana pool. +仅可对完全束缚的敌人施放。将它们变成跟随你的宠物,并增加你从法力池中的被动法力恢复。 +You conjure an enchanted petsuit which wraps around your target, forcing her to follow you! +你召唤出的魔法宠物服,紧紧包住了你瞄准的目标,使她不得不跟着你! +You watch in horror as your own creation lunges toward you, binding your hands and feet! +你惊恐地看着你自己的造物冲向了你,束缚了你的手脚! +Choose a helpless target +选择一个完全束缚的目标 + + +Conjure Display Stand +召唤展示架 +Target only Helpless enemies. Creates a fixture that increases passive mana recovery from mana pool, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. +仅可对完全束缚的敌人施放。创建一个装置,可以增加法力池中的被动法力恢复,恢复 50 点能量,并使附近的敌人受到 50% 的魅惑/灵能伤害。 +You conjure a fixture to hold your helpless target in place! +你召唤出一个装置来束缚完全束缚的目标! +You watch in horror as your own creation encircles you, locking you in place with a hefty click! +你惊恐地看着你自己的创造物束缚着你,用沉重的锁将你固定在了原地! + + +Lesser Flash +光芒 +Sparkles! +闪耀! +Mirror Image +镜像 + + +A flash of light which renders anyone caught within blind for 7 turns +一道闪光,使受到影响的所有人在7回合内陷入失明 +You charge up a bright flash! +你发出一道闪光! +Select where to center the flash (SpellArea radius) +选择闪光的中心位置 ( SpellArea 半径 ) + + +Ring +回声 +A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged with a 3 turn delay. +会在 Duration 回合内眩晕并吸引敌人。远距离释放。 +You point and a noise emanates from the location! +你手指一挥,一阵噪音从该位置发出! +Select where to center the noise (SpellArea radius) +选择噪声的中心位置 ( SpellArea 半径 ) + + +Holy Blaze +圣光闪耀 +Call down a 3x3 area of DamageDealt holy damage. Blinds enemies for 3 turns (and also yourself). +召唤一个3x3的伤害区域,造成神圣伤害。使敌人(以及你自己)失明3回合。 +You summon a divine aura! +你召唤出神圣的光环! +Select where to center the blast (SpellArea radius) +选择爆炸的中心位置 (SpellArea radius) + + +Greater Flash +光芒四射 +A massive flash of light which renders anyone caught within blind for 16 turns and stuns briefly. +一道巨大的闪光,使受到影响的所有人在16回合内陷入失明并短暂眩晕。 + + +Focused Flash +光耀夺目 +A focused flash of light which renders anyone caught within blind for 30 turns and stuns for Duration turns. +一道聚焦的闪光,使受到影响的所有人在30回合内陷入失明,并在 Duration 回合内眩晕 +You slowly charge up a powerful flash! +你缓慢地释放出一道强力的闪光! + + +Shroud +影雾 Sleep Gas 睡眠气体 +Select where to center the shroud (SpellArea radius) +选择影雾的中心位置 ( SpellArea 半径 ) +Creates a cloud for Duration turns that buffs evasion for all creatures. You are temporarily invisible for 8 turns after leaving. +在 Duration 回合内创造一片雾,增强所有生物的闪避。离开后你会暂时隐身 8 回合。 +You exhale a misty shroud +你呼出一层朦胧的雾 + + +Invisibility +隐形 +Select which creature to buff +选择要增强的生物 +Make the targeted creature invisible, increasing stealth for Duration turns +使目标生物隐形,增加持续时间回合的隐身性 +You snap your fingers! +你打了个响指! + + +CMD: Lock +指令 : ‎锁定 +Select which creature to lock +选择要锁定的个体 +Magically locks down a target, preventing them from struggling below the current level of binding until freed by an enemy spellcaster (max 100% binding). +神奇地锁定一个目标,防止目标在当前束缚等级下挣扎,直到被敌方法师释放。 ( 最大 100% 束缚 ) +You say a command word, and magical locks bind your target! +你念出咒语,目标被魔法锁束缚! + + +Chastity +贞操带 +Select which creature to lock in a belt +选择要锁定在贞操带中的个体 +Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs/toys, and distracts constantly. +对完全束缚的敌人释放,增加 DamageDealt 点束缚,并装备贞操带以阻止目标移除插入的物体或玩具,并不断增加性奋值。 +You conjure a chastity belt, which latches onto your target! +你召唤出贞操带,它将佩戴在你的目标身上! +Your own spell locks you in chastity! +你念出的咒语将你自己锁在贞操带中! +Something fun enters your body... +一些有趣的东西进入了你的身体...... + + +Zone of Purity +纯洁区 +Select an area +选择一个区域 +Creates an area which applies Chastity constantly to any enemy over with any amount of binding that steps inside. +创建一个区域,对踏入该区域的任何敌人持续装备贞操带。 +You conjure a realm of absolute purity. +召唤出一个绝对纯洁的区域。 + + +Zone of Excitement +敏感区 +Creates an area which adds a conjured vibrating toy to enemies that step inside. Toy lasts 30 turns. +创造一个区域,为进入区域的个体装备魔法震动玩具,持续 30 回合。 +You conjure a realm of absolute fun! +你创造出一个充满趣味的区域! + + +CMD: Capture +指令 : ‎捕捉 +Select which creature to bind +选择要束缚的个体 +Commands nearby restraints to bind a target, dealing DamageDealt chain damage, +50 binding. Ropes snare 3 turns/rope, belts +20 binding/belt, chains deal +15 crush dmg/chain. +命令附近的拘束具束缚一个目标,造成 25 点锁链伤害并增加 50 点束缚。每个绳索束缚 3 回合,每个皮带增加 20 点束缚,每个链条增加 30 点碾压伤害。 +You say a command word, and the bindings on the ground do your bidding! +你念出咒语,地面上的拘束具开始按照你的指令行动! + + +CMD: Disenchant +指令 : ‎附魔解除 +Target a large area. Permanently slows constructs, reduces attack speed by 50%, and deals 30 shadow damage. Refunds 50% mana at 3 or more targets. Cast on self to disenchant bindings. +瞄准范围大。永久减慢构造体速度,降低攻击速度 50%,并造成 30 点暗影伤害。到达 3 个或更多目标时退还 50% 的法力值。对自身施放以分解束缚。 +You say a command word, siphoning the magic from nearby constructs! +你念出咒语,开始从附近的构装体中抽取魔力! + + +CMD: Vibrate +指令 : ‎震动 +Target a large area. Enemies with plugs or toys are teased for Duration turns, taking charm damage each turn. +对大范围内带有插入具或玩具的敌人玩弄 Duration 回合,每回合造成魅惑伤害。 +You say a command word, causing all toys in the area to vibrate! +你念出咒语,范围内所有玩具开始震动! + + +CMD: Explosive Finish +指令 : ‎激烈释放 +Explosive Finish +激烈释放 +Target a large area. Consumes enemy distraction to deal up to DamageDealt charm damage, twice if at 90% distraction or more. +消耗大范围内敌人的性奋值以造成高达 DamageDealt 魅惑伤害,如果敌人的性奋值处于 90% 或以上则造成双倍伤害。 +You say a command word, resulting in a surge of energy entering your targets! +你念出咒语,一股奇妙能量涌入目标的身体! + + +CMD: Release +指令 : ‎解放 +Target bound (but unlocked) targets in a 3x3 area, reducing binding by 100. Removes unlocked restraints on player that are removable. +以 3x3 区域内被束缚 ( 但未解锁 ) 的单位为目标,减少 100 点束缚。移除可移除并已解锁的束缚。 +You say a command word, causing restraints to loosen! +你念出咒语,身上的束缚解除了! +You say a command word, but your restraints remain tight! +你念出咒语,但身上的束缚仍然很紧! + + +Remove Slime +移除粘液 +Select a creature or yourself +选择一个个体 +Remove Slime and Encasement from target creatures in an area. Also removes slime from self. +移除区域内目标身上的粘液包裹物。 同时去除自身的粘液。 +You issue a command to the slime! +你向粘液发出指令! +You whisper a command word, but the slime is already hardened and won't budge... +你低声说出指令,但粘液已经变硬了,纹丝不动... + + +Binding Vines +捆绑藤蔓 +Binding Ropes +捆绑绳 +Binding Chains +捆绑锁链 +Binding Belts +捆绑带 +Vines rise from the ground and squeeze you! +藤蔓从地上爬起,挤压着你! +Ropes encircle your body and tighten! +绳索环绕你的身体并收紧! +Chains wrap around you! +锁链缠绕着你! +A web of belts buckles in place around your body! +一个皮带扣在你的身体周围的地方! +Vines rise from the ground and squeeze you! (DamageDealt) +藤蔓从地上爬起,挤压着你!(DamageDealt) +Ropes encircle your body and tighten! (DamageDealt) +绳索环绕你的身体并收紧!(DamageDealt) +Chains wrap around you! (DamageDealt) +锁链缠绕着你!(DamageDealt) +A web of belts buckles in place around your body! (DamageDealt) +一个皮带扣在你的身体周围的地方!(DamageDealt) + + +Awaken +唤醒 +The slime awakens and turns on you!!! +粘液被激活并开始攻击你!!! +Select area to awaken +选择唤醒区域 +Activates the slime in an area, causing it to deal 25 glue damage. Encases fully bound targets. +唤醒指定区域内的粘液,使其对区域内的目标造成 25 点胶体伤害,并将完全束缚的目标包裹起来。 +You command the slime to draw in targets! +你命令粘液包裹目标! + + +CMD: Bind +指令 : ‎束缚 +Select area to bind +选择施放位置 +Commands nearby restraints to bind targets standing on them. Rope: 30 chain dmg/5 turn snare. Chain: 30 crush dmg/8 turn disarm. Belts: 50 binding/3 turns vulnerability. +命令附近的拘束具束缚站在其上的目标。绳索 : 造成 30 锁链伤害并束缚 5 回合,皮带 : 增加 50 点束缚并脆弱 3 回合,锁链 : 增加 30 点碾压伤害并缴械 8 回合。 + + +CMD: Unlock +指令 : ‎解锁 Select which creature to unlock 选择要解锁的生物 -Enhance Power -增强力量 -When enabled: Struggling is more powerful, and attacks deal +2 crush damage -启用时:挣扎更强力,攻击造成+2碾压伤害 +On yourself: Removes one purple (magical) lock. On a creature: Reduces the target's binding by 20 points. +对你自己 : ‎移除一个紫色魔法锁。对生物 : ‎减少目标束缚 20 点。 +You speak a command word! +你念出指令! +None of the locks you are wearing respond to your magic. +你身上的所有锁都没有对你的咒语做出反应。 +You can't help her with this. +你帮不了她 +You must target yourself, an enemy, or a locked object. +你必须以自己、敌人或被锁定的对象为目标。 +The command is intricate and you are unable to enunciate it properly! +指令很复杂,你根本无法正确说出来! + + +CMD: Greater Unlock +指令 : ‎强大解锁 +On yourself: Removes all purple (magical) locks. On a creature: Reduces the target's binding by 100 points. +对你自己 : ‎移除所有紫色魔法锁。对生物 : ‎减少目标束缚 100 点。 +You speak a powerful command word! +你的命令铿锵有力! + + +Lesser Invisibility +次级隐形 +You become semitransparent! +你变得半透明! + + +Camouflage +拟态 +Select yourself +选择自己 +Enemies have a harder time noticing you for Duration turns. Cancels if you move (unless you are near a wall), cast, or sleep. +在持续时间回合中,敌人很难注意到你。但如果你移动、施法或睡眠 ( 除非你靠近墙壁 ) ,则会失效。 +You pose in a clandestine manner. +你摆出了一个隐秘的姿势。 + + +Darkblade +暗影之刃 +Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks, whichever is lower. +使目标生物在 Duration 回合内或下 5 次攻击中伤害增加 20。 +You call forth dark runes on your weapon and arms! +你在你的武器和手臂上召唤出黑暗符文! + + +Heal +治愈 +Select which creature to heal +选择要治疗的生物 +Restore 45 hitpoints to an allied creature. +为一个友方生物恢复 45 点生命值 ( 不包括你自己 ) 。 +You utter a word of healing. +你咏唱治愈的咒语。 + + +Flame Blade +火焰之刃 +When enabled: Melee weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. +启用后近战武器攻击消耗法力值并造成火焰伤害,对相邻目标造成 30 点火焰伤害。 + + +Tentacle Slap +触手拍击 +You have the power to make tentacles out of slime when you attack. When enabled: Your attacks deal +10 glue damage and create slime. 150% bind efficiency. +你有能力在攻击时将黏液变成触手。启用后 : ‎你的攻击造成 +10 胶体伤害并产生黏液。150% 束缚效率。 + + +Chain Strike +锁链攻击 +You have the power to summon chains when you attack. When enabled: Your attacks deal +10 chain damage and create chains. 125% bind efficiency. +你拥有在攻击时召唤锁链的力量。启用后 : ‎你的攻击造成 +10 锁链伤害并制造锁链。125% 束缚效率。 + + +Ropework +结绳术 +You have the power to weave ropes between your attacks. When enabled: Your attacks deal +10 chain damage and create ropes. 400% bind efficiency. +你有能力在攻击之间编织绳索。启用后 : ‎你的攻击造成 +10 连锁伤害并制造绳索。400% 束缚效率。 + + +Leather Whip +皮鞭 +You have the power to strike with conjured belts when you attack. When enabled: Your attacks deal +10 pain damage and create belts. 250% bind efficiency. +你有能力在攻击时使用魔法皮带进行攻击。启用后 : ‎你的攻击造成 +10 痛苦伤害并制造皮带。250% 束缚效率。 + + +Super Strength +超级力量 +When enabled: Struggling is more powerful, and your melee attack damage is increased by +20 if your weapon deals physical damage. +启用时 : ‎挣扎更加强大,如果你的武器造成物理伤害,你的近战攻击力会提高20。 Your body glows with magical energy! 你的身体散发着神奇的能量! + + Enhance Will 增强意志 When enabled: Miscast chance is halved -启用时:施法失败几率减半 +启用时 : ‎施法失败几率减半 You focus intently! 你集中了注意力! -Cat's Grace -猫之优雅 -When enabled and above 0 stamina: Drain 0.5 MP per step to reduce slow level by 1 (if above 1), and 2 mana (total) to ignore a temporary slow effect. -启用且耐力高于 0 时:每步消耗 0.5 MP 以将减速等级降低 1(如果高于 1),并消耗 2 法力(总计)以忽略暂时的减速效果。 -Your graceful footsteps avoid setting off a trap! -你优雅的脚步,避免引爆陷阱! -You recover gracefully from the slowdown! -你优雅地从减速中恢复过来! -You walk gracefully with reduced effect from bindings. -你优雅地行走,减少了束缚的影响。 -The EnemyName gains increased armor! -EnemyName 获得更高的护甲! -The EnemyName buffs the armor of her allies! -EnemyName 增强了她盟友的盔甲! + + +Truesight +真实视野 +When enabled: Drain mana every turn to see through walls and increase accuracy by 40%. +启用时 : ‎每回合消耗法力以透视墙壁并将命中率提高 40%。 + + +Echolocation +声波定位 +Close your eyes to dramatically improve your hearing and locate enemies through walls. +闭上眼睛时大大提高你的听力,并透过墙壁找到敌人。 + + +Produce a bright light for Duration turns. Has no effect in dark rooms. +产生持续 Duration 回合的亮光,在黑暗房间内没有效果。 + + +Levitate +漂浮 +When enabled and above 0 stamina: Drain 5 mana per step to reduce slow level by 1 (if above 1), or 20 mana to ignore a temporary slow effect. +在体力大于0时激活 : 每走一步消耗5点法力值,可将减速等级降低1级(如果减速等级大于1),或者消耗20点法力值来无视一次临时减速效果。 +You levitate over the trap! +你漂浮在陷阱上! +You snag a tripwire while floating! +你在漂浮时钩住了绊网! +You levitate forward despite being slowed! +尽管速度减慢,你还是向前漂浮! +You hover with reduced effect from bindings. +您悬停时捆绑的效果会减弱。 + + +Iron Blood +铁血 +Channel 4 turns: Halves SP cost of melee attacks by 50%, but increases MP cost of spells by 25%. Ends on sleep or recast. +引导4回合 : 近战攻击体力消耗 -50%,但释放法术时法力消耗 +25%,睡眠或再次使用时停止。 +Your skin glows a pale red! +你的皮肤发出淡红色的光芒! + + +Stone Skin +石肤术 +Make the targeted creature (or yourself) gain +20 armor for Duration turns +使自身或目标生物在 Duration 回合内获得 +20 物理护甲。 +Your skin takes on the appearance of cracked earth! +你的皮肤开始变得如裂开的土地一样! + + +The EnemyName gains increased physical armor! +EnemyName 获得更高的物理防御! +The EnemyName buffs the physical armor of her allies! +EnemyName 增强了盟友的物理防御! +The EnemyName deploys an energy shield to allies! +EnemyName 为盟友部署能量护盾! +The EnemyName activates the vibrators of nearby wolfgirls, greatly motivating them! +EnemyName 激活了附近的狼娘振动器,极大地激励她们! +The EnemyName activates the vibrators of nearby dolls, greatly motivating them! +EnemyName 激活了附近的玩偶的振动器,极大地激励他们! The EnemyName creates a zone of increased defense! EnemyName 创造了一个增加防御的区域! -EnemyName uses a charm to buff an enemy's spell resist, and evasion! -EnemyName 使用绷带来增强敌人的法术抗性和闪避! -EnemyName uses a glowing talisman to buff an undead's armor and speed! -EnemyName 使用发光的丝带来增强不死生物的盔甲和速度! +EnemyName uses a charm to buff an enemy's Magic Armor and Evasion! +EnemyName 使用魅惑来增强敌人的魔法护甲和闪避! +EnemyName supports a witch with a magical shield! +EnemyName 支持一个拥有魔法护盾的女巫! +Shield the Witch! +护盾女巫! +EnemyName uses a glowing talisman to buff an undead's physical armor and speed! +EnemyName 使用发光护身符来增强不死生物的物理护甲和速度! You create a zone of increased defense! 你创造了一个增加防御的区域! You create a protective zone! 你创造了一个保护区! You create a fan of icicles! 你创造了一个冰柱! + + +Select where to put the wall (cannot place on occupied squares) +选择放置墙壁的位置 ( 不能放置在占用的区域上 ) +Create a stationary wall for Duration turns. It takes 20% damage from spells. Cast on an open door to close it and give it additional armor. +创造一堵可持续 Duration 个回合的墙,法术对其仅能造成 20% 伤害。在开启的门上释放可将门封闭,并为其提供额外护甲。 +A wall starts to form! +一堵墙开始形成! +You create a line on the ground. +你在地面上创建一堵墙。 + + True Steel 共析钢 Choose a target. @@ -5300,82 +11304,268 @@ A melee strike that deals DamageDealt slash damage, x2.5 against unaware humanoi 造成 DamageDealt 斩击伤害的近战攻击,对失去意识的人型敌人造成2.5倍伤害。 You slash with an ethereal blade! 你用空灵的刀刃砍杀! -Familiar -小精灵 + + +Summon Familiar +召唤魔宠 Select where to put the familiar (cannot place on occupied squares) -选择放置小精灵的位置(不能放置在已占用的方格上) +选择放置小精灵的位置 ( 不能放置在已占用的方格上 ) Create a familiar that fights by your side for the rest of the level 创造一个在接下来与你并肩作战的魔宠 A familiar appears! 一个小精灵出现了! You create a circle on the ground with your foot! 你用脚在地上画了一个圆圈! -Fire Elemental -火元素 -Select where to put the fire elemental (cannot place on occupied squares) -选择放置火元素的位置(不能放置在已被占用的方格上) -Create a fire elemental that attacks using firebolt for the rest of the level -创建一个火元素,接下来会使用火焰弹攻击 + + +Summon Storm Crystal +召唤风暴水晶 +Select where to put the storm crystal (cannot place on occupied squares) +选择放置风暴水晶的位置 ( 不能放置在被占用的方块上 ) +Create a stationary crystal that casts Crackle on nearby targets for Duration turns. Can be healed to extend duration. +创造一个静止的水晶,在 Duration 回合内对附近的目标施放暴雷。可以通过治愈以延长持续时间。 +A crackling crystal emerges from the ground! +一块劈里啪啦作响的水晶从地下钻了出来! +You stomp and the ground shakes! +你用脚绘出咒文,地面开始震动! + + +Summon Fire Mote +召唤火晶尘 +Select where to put the fire mote (cannot place on occupied squares) +选择放置火晶尘的位置 ( 不能放置在被占用的方块上 ) +Create an orb of fire that follows you and attacks using firebolt. +创造一个跟随着你并用火焰箭进行攻击的火晶尘。 A flaming spirit answers your call! 一个燃烧的灵魂回应你的召唤! -You call upon the planes of fire! -你在火焰之上进行召唤! +You call upon the plane of Fire! +你向火之位面呼唤! + + +Summon Earth Mote +召唤岩晶尘 +Select where to put the earth mote (cannot place on occupied squares) +选择放置岩晶尘的位置 ( 不能放置在被占用的方块上 ) +Create an animated stone that attacks using a strong but slow crush attack. +创造一个跟随着你并用自身造成强大但缓慢的碾压攻击的岩晶尘。 +A rocky spirit rushes forth from the ground! +一个岩之精灵破土而出! +You call upon the plane of Earth! +你向岩之位面呼唤! + + +Summon Air Mote +召唤风晶尘 +Select where to put the air mote (cannot place on occupied squares) +选择放置风晶尘的位置 ( 不能放置在被占用的方块上 ) +Create a dusty mote that attacks using gusts of wind. +创造一个跟随着你并用阵风攻击的风晶尘。 +A dust devil arises in front of you! +一个风晶尘在你的面前形成! +You call upon the plane of Air! +你向风之位面呼唤! + + +Summon Water Mote +召唤水晶尘 +Select where to put the water mote (cannot place on occupied squares) +选择放置水晶尘的位置 ( 不能放置在被占用的方块上 ) +Create a watery serpent which stuns enemies with its melee attack. +创造一个跟随着你并可击晕敌人的水晶尘。 +A watery spirit bubbles up from the ground! +水之精灵从地面涌现! +You call upon the plane of Water! +你向水之位面呼唤! + + +Summon Shadow Warrior +召唤暗影武士 +Select where to put the shadow warrior (cannot place on occupied squares) +选择放置暗影武士的位置 ( 不能放置在已被占用的方格上 ) +Call forth a shadow warrior for 16 turns who deals DamageDealt damage every other turn. +召唤一名持续 16 回合的暗影武士,每隔一回合造成 DamageDealt 点伤害。 +...and the abyss answers! +……深渊的答案! +You call... +你召唤了... + + +Summon Nature Spirit +召唤自然精灵 +Select where to put the nature spirit (cannot place on occupied squares) +选择放置自然精灵的位置 ( 不能放置在已占用的方块上 ) +Create a natural spirit that fires vine projectiles and has a healing aura that restores HP to allies and regenerates your stamina. +创建一个发射藤蔓射弹的自然精灵,并具有治疗光环,可以为盟友恢复生命值并恢复你的体力。 +A healing wisp appears! +治愈之光出现! +You call upon the powers of nature! +你呼唤自然的力量! + + + + + + +Summon Golem +召唤傀儡 +Select where to put the golem (cannot place on occupied squares) +选择放置傀儡的位置 ( 不能放置在被占用的方块上 ) +Create a slow but powerful golem to fight by your side +创造一个与你并肩作战的缓慢但又强大的傀儡。 +A golem arises! +傀儡出现了! +You stomp your foot and draw the words of life on the floor! +你用脚在地板上绘出生命之咒! + + +Summon Decoy +召唤诱饵 +Select where to create an illusion (cannot place on occupied squares) +选择创建幻象的位置 ( 不能放置在已被占用的方格上 ) +Create a decoy for Duration turns. It attracts enemy attention and triggers traps. +创造一个持续 Duration 回合的诱饵。它会吸引敌人的注意力并触发陷阱。 +A shadow of yourself materializes! +自己的影子出现了! +You create a line on the ground and toss in a lock of your hair! +你在地上画了一条线,然后扔进你的一绺头发! + + Feather Explosion 羽毛爆炸 -Conjure Slime -召唤史莱姆粘液 -Apprentice's Slime -学徒的史莱姆 + + +Elastic Grip +弹性控制 +A latex hand reaches out and pulls an enemy close to you! Base pull strength: 4 +伸出一只乳胶手,把敌人拉到你身边!基础拉力:4 +You extend a rubbery hand and grab a foe! +你伸出一只乳胶手抓住了一个敌人! +There's an obstacle in the way! +路上有障碍! +Select a target to pull +选择要抓取的个体 + + +Slime Blast +粘液爆炸 Witch's Slime -女巫的史莱姆 +女巫的粘液团 +Rubber Explosion +橡胶爆炸 Witch's Slime Ball -女巫的史莱姆球 -Select where the slime will start (SpellArea radius) -选择起始的位置(SpellArea 半径) -Zombie Orb -僵尸宝珠 -Lesser Zombie Orb -小型僵尸宝珠 -Freezing Zombie Orb -冰冻僵尸宝珠 -Mystic Bolt -神秘闪电 -The mummy's bolt paralyzes you! -木乃伊的闪电使你麻痹! +女巫的粘液球 +Robotic Arm +机械臂 +A pool of slime deals DamageDealt glue damage to enemies on impact and covers the area in temporary slime. +召唤一滩在撞击时造成 DamageDealt 点胶体伤害的粘液,并用粘液覆盖该区域。 +You conjure a pool of slime! +你召唤了一滩粘液! +Select where the slime will appear +选择粘液出现的位置 + + +Slime Eruption +粘液喷发 +A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them briefly. +巨大的粘液爆炸会造成伤害,对进入的敌人造成胶体伤害并短暂束缚他们。 +You conjure an explosion of slime! +你使粘液喷发! + + +Slime Splash +粘液飞溅 +After one turn, deals DamageDealt glue damage in a small area and spreads slime. +在一回合后在小范围内召唤一滩造成 DamageDealt 点胶体伤害的粘液。 +You conjure a small amount of slime! +你召唤了少量的粘液! + + +Water Ball +水球 +Fast projectile. Deals DamageDealt soap damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. +发射一个高速水球并造成 DamageDealt 点皂化伤害。潮湿的目标承受 +35% 电击/寒冰伤害 -42% 火焰伤害,并传导 50% 的电击伤害。 +You hurl a ball of water! +你掷出一个水球! + + +Tidal Sphere +潮汐球 +Slow moving projectile, deals DamageDealt soap damage to enemies it passes thru. Leaves a large amount of water in its wake. +发射一个缓慢移动的水团,对其经过的敌人造成 DamageDealt 点皂化伤害。在它的身后留下大量的水。 +You raise a huge mass of water! +你掷出大型水团! + + +The boulder knocks you to the ground! +巨石把你撞倒在地! +The water covers you and drenches you! +水把你淹没了! +You step in water and become wet. +你踩在水里就会淋湿。 + + +Ice Breath +冰霜吐息 +A field of icicles that deals DamageDealt damage on a hit and stuns briefly. +生成一片冰柱,冰柱可造成 DamageDealt 点寒冰伤害并造成短暂眩晕。 +You breath out a chilling frost! +你呼出一股令人毛骨悚然的冰霜! +Select where to put the icicles (SpellArea radius) +选择放置冰柱的位置 ( SpellArea 半径 ) + + +The mummy's curse paralyzes you! +木乃伊的诅咒使你瘫痪! + + Rubber Bullets 橡皮子弹 You are hit by a fusilade of rubber bullets! 你被一连串的橡皮子弹击中! The rubber bullets congeal into a slimy material on your body! 橡皮子弹在你身上凝结成黏糊糊的物质! + + Nature Blast 自然爆炸 Raging Vines 肆虐的藤蔓 -Magic Ribbons -魔术丝带 + + Magic Belts -魔术束带 -Slime -史莱姆 -Slime -史莱姆 +魔法束带 You project a pool of sticky slime! -你投射出一滩粘稠的史莱姆! -Bondage Buster -束缚破坏者 +你投射出一滩粘稠的粘液! +Arrow of Love +爱之箭 +You loose a glowing arrow! +你射出了一支发光的箭! +Blaster +爆能枪 You charge up a beam and fire it! 你充能并发射了一道光束! +You swing your weapon and pull away the target's equipment! +你挥动武器,拖走目标的装备! You swing Dragonslaver and it lashes out in a whip-like fashion! 你挥动驯龙者,它像鞭子一样猛烈攻击! The slime from your staff coats your body, granting you strange powers! -法杖上的史莱姆覆盖在你的身体上,赋予你奇怪的力量! +法杖上的粘液覆盖在你的身体上,赋予你奇怪的力量! +The power of the four elements flows through your veins! +你的血管里流淌着四大元素的力量! An explosion knocks you to the ground! 爆炸将你击倒在地! + + Curious Spell 好奇的咒语 You have been flummoxed! 你陷入了混乱! + + +You feel a prick as a small syringe hits you, and you start feeling drowsy... +当一个小型注射器击中你时,你会感到刺痛,然后你开始感到昏昏欲睡…… +The thrown cuffs snap shut around your ankles and slow you down!!! +抛出的手铐会卡住你的脚踝,让你慢下来! Ribbon Burst 丝带爆裂 Spores @@ -5390,24 +11580,30 @@ The spores make you feel excited! 孢子让你感到兴奋! The toxic spores make you feel faint... 有毒的孢子让你感到头晕目眩…… + + Magic Hairpin 魔法发夹 The magic hairpin goes for your eyes and forces you to blink! 神奇的发夹会撞到你的眼睛,迫使你眨眼! + + Ice Storm 暴风雪 + + Icy Aura 冰霜之环 -Icy Aura -冰霜之环 + + Slime Ball -史莱姆球 -Witch's Slime Ball -女巫的史莱姆球 -A ball of slime leaves a trail of sticky slime (40 damage when stepped on). It deals DamageDealt glue damage on a hit. -一团史莱姆会留下粘糊糊的痕迹(踩到时造成 40 伤害)。它在击中时造成 DamageDealt 点胶水伤害。 +粘液球 +A ball of slime leaves a trail of sticky slime (20 damage when stepped on). It deals DamageDealt glue damage on a hit. +一团粘液会留下粘糊糊的痕迹 ( 踩到时造成 20 伤害 ) 。它在击中时造成 DamageDealt 点胶体伤害。 You hurl a ball of slime! -你扔出一个史莱姆球! +你扔出一个粘液球! + + Summon Skeleton 召唤骷髅 Mass Summon Skeleton @@ -5415,57 +11611,135 @@ Mass Summon Skeleton A skeleton arises from bones on the floor! 一具骷髅从地板上的骨头中升起! A gang of SummonCount skeletons forms around you! - SummonCount 只骷髅在你周围形成! +SummonCount 只骷髅在你周围形成! A gang of SummonCount zombies emerges from the floor! - SummonCount 只僵尸从地板上出现! +SummonCount 只僵尸从地板上出现! A bunch of gags fly out from your satchel! -一堆口球从你的背包里飞出来! +一堆口塞从你的背包里飞出来! + + A floating hand appears and cracks its knuckles! -一只漂浮的手出现了,它的指节咔咔作响! +一只漂浮的手出现了,它的指关节咔咔作响! A floating gag appears and starts flying toward you! -一个漂浮的口球出现并开始向你飞来! +一件漂浮的口塞出现并开始向你飞来! +A floating blindfold appears and starts flying toward you! +一件漂浮的眼罩出现并开始向你飞来! +A floating yoke appears and starts flying toward you! +一件漂浮的枷锁出现并开始向你飞来! +A floating armbinder appears and starts flying toward you! +一件漂浮的单手套出现并开始向你飞来! +A floating straitjacket appears and starts flying toward you! +一件漂浮的拘束衣出现并开始向你飞来! +A floating harness appears and starts flying toward you! +一件漂浮的束衣出现并开始向你飞来! A set of shackles opens wide and starts going for your wrists! -一套镣铐张开,并开始锁在你的手腕上! +一件镣铐张开,并开始锁在你的手腕上! A swarm of shackles approaches you! -一群镣铐向你靠近! +一堆镣铐向你靠近! +A swarm of gags approaches you! +一堆口塞向你逼近! A cloud of locks and chains clatters as it levitates toward you! 一团锁和锁链在咔哒咔哒地向你飘来! A huge cloud of locks and chains clatters as it levitates toward you! 一大片锁和锁链在咔哒咔哒地向你飘来! Floating hands appear by the conjurer's side as she points her staff! 当她指向她的法杖时,浮动的手出现在咒术师的身边! -Floating books appear near the conjurer as she points her staff! -当她指向她的法杖时,浮动书籍出现在魔术师附近! -Your restraints rub you in sensitive places as you walk... -当你走路时,你的束缚在敏感的地方摩擦你…… + + +Floating books appear near the caster! +漂浮的书籍出现在施法者附近! +Dusty tomes appear near the caster! +布满灰尘的书卷出现在施法者附近! +Magical books appear near the caster! +魔法书出现在施法者附近! +Sinister books appear near the caster! +邪恶的书出现在施法者附近! +Crackling books appear near the caster! +正在噼啪作响的书出现在施法者附近! +Glowing books appear near the caster! +正在发光的书出现在施法者附近! +Rubber-stained books appear near the caster! +涂满橡胶的书出现在施法者附近! +Flaming books appear near the caster! +正在燃烧的书出现在施法者附近! +Frigid books appear near the caster! +冰冷的书出现在施法者附近! +Devilish books appear near the caster! +恶毒的书出现在施法者附近! + + +A floating book appears near the caster! +一本正在漂浮的书出现在施法者附近! +A dusty tome appears near the caster! +一本布满灰尘的书本出现在施法者附近! +A magical book appears near the caster! +一本魔法书出现在施法者附近! +A sinister book appears near the caster! +一本邪恶的书出现在施法者附近! +A crackling book appears near the caster! +一本正在噼啪作响的书出现在施法者附近! +A glowing book appears near the caster! +一本正在发光的书出现在施法者附近! +A rubber-stained book appears near the caster! +一本涂满橡胶的书出现在施法者附近! +A flaming book appears near the caster! +一本正在燃烧的书出现在施法者附近! +A frigid book appears near the caster! +一本冰冷的书出现在施法者附近! +A devilish book appears near the caster! +一本魔书出现在施法者附近! + + +Your struggling leaves you aroused because of the RestraintName... +你的挣扎让你因为 RestraintName 性奋起来...... You feel your restraints squeeze you and tingle with painful sensations! 你会感觉到你的束缚压迫你,并伴随着痛苦的感觉而刺痛! 'Do not resist,' whispers a voice in your head... “不要抗拒,”一个声音在你的脑海里低语…… Your restraints squeeze you painfully without mercy! -你的束缚无情地痛苦地压迫着你! +你的束缚痛苦且无情地压迫着你! The crystals emit a powerful energy! -水晶散发出强大的能量! +结晶散发出强大的能量! You feel your body overflow with energy... 你感觉你的身体充满了能量...... The crystals react to your struggle attempts with a strange energy! -水晶会以一种奇怪的能量对你的挣扎尝试做出反应! +结晶会以一种奇怪的能量对你的挣扎尝试做出反应! + + Cast Spell (XXX turn delay) -施法(XXX 回合延迟) +施法 ( XXX 回合延迟 ) + + You feel the vibrations leaving your body... -你感觉到振动离开你的身体...... +你感觉到振动正在离开你的身体...... You feel your toys start to buzz... 你觉得你的玩具开始嗡嗡作响…… You your toys continue to buzz... 你的玩具继续嗡嗡作响…… -The EnemyName remotely causes your toys to to buzz!!! +The EnemyName remotely causes your toys to buzz!!! EnemyName 远程使您的玩具嗡嗡作响!!! You feel the plugs inside you while walking. 走路时你会感觉到你体内的塞子。 +Your toys pulse and tingle occasionally. +你的玩具偶尔阵阵脉动和刺痒。 +Your toys tease you and buzz gently... +你的玩具在逗弄你,轻声嗡嗡作响…… +Your vibrating toys are difficult to ignore... +你震动的玩具难以忽视…… +Your toys buzz strongly, making it difficult to concentrate! +你的玩具嗡嗡作响,很难集中注意力! +You tremble as the toys give off intense vibrations! +你颤抖着,玩具发出强烈的震动! +Your toys torture you with intense pulsations! +你的玩具用强烈的脉动来折磨你! +Your whole body resonates with the intense stimulation! +你的全身都在强烈的刺激下产生共鸣! +The stimulation is so intense you can hardly breath! +你因为如此强烈的刺激几乎无法呼吸! Your toys stop vibrating. 你的玩具停止振动。 -You feel slightly full as you walk... -走路的时候感觉有点被填满了... +You feel slightly full as you move... +当你移动时,你会感到有点饱…… Your movement disturbs the plugs inside of you... 你的动作扰乱了你体内的塞子...... The large plugs shift(s) around inside of you... @@ -5477,17 +11751,25 @@ Your movements are hobbled. Your hobbled movement disturbs the plugs inside of you. 你蹒跚的动作扰乱了你体内的塞子。 The large plugs shift(s) around inside of you from your hobbled movement... -大塞子因您蹒跚的动作而在您体内移动... +大塞子因你蹒跚的动作而在你体内移动... The massive plugs rub(s) around inside of you as you hobble forward... 当你蹒跚前行时,巨大的塞子在你体内摩擦…… You hop forward! 你往前跳了一步! You hop and feel the plugs shifting around inside your body. -您跳跃并感觉到塞子在您体内移动。 +你跳跃并感觉到塞子在你体内移动。 The plugs shift in and out with each hop... 塞子随着每一跳而进进出出…… -The massive plugs slide in and out mercilessly as you hop... -当你跳跃时,巨大的插头无情地出入…… +The massive plugs slide in and out sensually as you hop... +当你跳跃时,巨大的塞子会性感地滑入和滑出...... +You crawl forward! +你向前爬行! +You crawl and feel the plugs shifting around inside your body. +你爬行并感觉到塞子在你体内移动。 +The plugs shift in and out as you crawl... +当你爬行时,塞子会滑入和滑出…… +The massive plugs slide in and out sensually as you crawl... +当你爬行时,巨大的塞子会性感地滑入和滑出...... You inch forward slowly! 你慢慢向前挪动! You inch forward, feeling the movement of your plugs. @@ -5514,32 +11796,110 @@ You wriggle uselessly, tormented by the massive plugs inside of you! 你无用地扭动着,被你体内的巨大塞子折磨着! You climb into the grate 你爬进隔间 + + +### Mmmph... + +### Mmmmmmmmm... + +### Hhmmpphh... + +### Gghhhh!!! + +### Mmmmmphh!!! + +### Mmm... + +### MMM!!! + +### Mmmmmm. + +### Mmmaaaaahhh... + +### Mmmmmmmmm~ + +### Unnnghhh... + +### Mmmmmmmphhh.. + +### Mmmmmphh~ + +### Mmm~ + +### Mmmmm~~ + +### Mmmmmm~~~ + + + +### Mmph... + +### Mmmm! + +### Hmmph. + +### Mmmm... + +### Mmmph. + +### Mmmmmmph!!! + +### Gmmmmph! + +### Hmmmmph~!! + You are blinded! 你失明了! -You took DamageDealt damage! -你受到了DamageDealt点伤害! -Your own rope trap springs upon you! -你自己的绳索陷阱涌现到你身上! +You took DamageTaken damage! +你受到了 DamageTaken 点伤害! You get caught in sticky slime! -你陷入粘稠的史莱姆中! +你陷入粘稠的粘液中! +You get caught in a sticky slime bubble! +你被粘糊糊的黏液泡困住了! The slime ball sticks to you! -史莱姆球粘在你身上! +粘液球粘在你身上! The slime ball sticks to you and slows you! -史莱姆球粘在你身上并减慢你的速度! +粘液球粘在你身上并减慢你的速度! You feel a powerful sensation run through your body! -你会感觉到一种强烈的感觉贯穿你的身体! +你感到一种强烈的感觉贯穿你的全身! +You feel a pleasurable sensation run through your body! +您感到一种愉悦的感觉贯穿你的全身! Beams of light wrap around your body and feel warm on your skin! -光束环绕您的身体,让您的皮肤感到温暖! -Crystals begin to form around your limbs and trap you! -水晶开始在你的四肢周围形成并困住你! +光束环绕你的身体,让你的皮肤感到温暖! +Crystals begin to form around your limbs! +晶体开始在你的四肢周围形成! A magic chain secures itself around your body! -一条魔链固定在您的身体上! -A rope wraps itself around your body and slows you down! -一根绳子缠绕在你的身体上,让你减速! +一条魔链固定在你的身体上! +An animated chain secures itself around your body! +一条活化链固定在你的身体上! +A magic rope secures itself around your body! +一条魔绳固定在你的身体上! +A magic belt secures itself around your body! +一条魔法绑带固定在你的身体上! +A rope wraps itself around your body! +一根绳子缠绕在你的身上! +A ribbon animates and becomes entwined around you! +一条丝带充满活力并缠绕在你周围! +A belt buckles itself tightly around your body! +一条皮带紧紧地扣在你的身上! +A vine slithers across your body and tightens! +一根藤蔓滑过你的身体并收紧! The spell hits you and slows you down! 咒语击中你并减慢你的速度! +Witch's Rope +女巫的绳索 Rope Tendrils 绳卷须 +The Blessing +祝福 +A long tendril emerges from the kraken's body! +一条长长的卷须从海妖的身体里浮现出来! +Coiled ropes spring up from the floor! +盘绕的绳子从地板上弹起来! +Several glowing wrappings emerge! +几条发光的包裹物出现了! +A glowing wrapping emerges and starts moving toward you! +一个发光的包裹物出现并开始向你移动! Rope Strike 绳击 Animated Vines @@ -5551,21 +11911,29 @@ Elven Arrow The elven arrow flashes and wraps you in mithril ropes! 精灵之箭闪烁,将你包裹在秘银绳中! Ropes wrap themselves around your body from all sides! -绳索从四面八方缠绕在您的身体上! -Ropes wrap themselves around your body from all sides! -绳索从四面八方缠绕在您的身体上! -Nature magic causes vines to sprout around you! -自然魔法使藤蔓在你周围发芽! +绳索从四面八方缠绕在你的身体上! +Wrappings appear and wrap you head to toe! +包裹物出现,将你从头到脚包裹起来! +A spell transforms your wrappings into hexed latex! +一个魔法将你的拘束变成了被诅咒的乳胶! +A spell engulfs you in wrappings! +一个魔法将你包裹在拘束里! +Vines sprout around you and grab hold of your limbs! +藤蔓在你周围萌芽并抓住你的四肢! Your clothes are stripped and replaced! 你的衣服被剥光和更换! Vines tear off your clothes! 藤蔓撕掉了你的衣服! Restraints materialize on your body! 拘束具在你的身体上出现! + + The orb explodes into a burst of ribbons! -水晶爆裂成一道道丝带! +宝珠爆裂成一道道丝带! The orb tears off your clothes! -水晶撕裂了你的衣服! +宝珠撕裂了你的衣服! + + Charm Trap 绷带陷阱 Ribbon Trap @@ -5576,22 +11944,32 @@ Mummy Trap 木乃伊陷阱 Rope Trap 绳陷阱 -Rope Trap -绳陷阱 +Holy Rope Trap +神圣绳陷阱 Belt Trap 束带陷阱 Cable Trap 钢索陷阱 Slime Trap -史莱姆陷阱 +粘液陷阱 Chain Trap 锁链陷阱 +Shadow Latex Trap +暗影乳胶陷阱 +Demonic Sigil +恶魔封印 +Unstable Crystals +不稳定晶体 Gas Trap 气体陷阱 +Latex Engulfment +乳胶吞噬 +Latex Spherification +乳胶球化 Sleep Dart 睡眠镖 -Sleep Dart -睡眠镖 + + A talisman on the floor explodes, sending a cloud of charms flying around you! 地板上的符箓炸开,一团丝带在你身边飞舞! Magical binding ribbons emerge from the walls! @@ -5604,18 +11982,36 @@ Ropes slither out towards you from between the bricks! 绳索从砖块之间滑向你! Ropes fall on you from all sides! 绳索从四面八方落在你身上! +A constellation of ropes surrounds you! +一堆绳索围绕着你! Leather restraints start appearing around you! 皮革拘束具开始出现在你身边! high-tech cables come out from the floor! 高科技钢缆从地板上出来! Slimes pours out from the walls and ceiling! -史莱姆从墙壁和天花板上倾泻而出! +粘液从墙壁和天花板上倾泻而出! Ethereal chains appear all around you! 灵界锁链出现在你身边! +Shadows constrict around you! +暗影在你周围收缩! +An otherworldly sigil appears below you! +一个超凡脱俗的印记出现在你的下方! +Crystals rise up around you! +结晶在你周围升起! +Something shiny seems to be stretched out over the floor! +地板上似乎有一些闪亮的东西伸展开来! +A rubber bubble starts forming around you! +一个橡胶泡泡开始在你周围形成! +A rubber ball starts forming around you! +一个橡胶球开始在你周围形成! You hear the sound of glass breaking, and a cloud of pink gas rises around you! 你听到玻璃破碎的声音,一团粉红色的气体在你周围升起! +You hear the sound of glass breaking, and a cloud of green gas rises around you! +你听到玻璃破碎的声音,一团绿色的气体在你周围升起! The charms stick themselves all over your body! 绷带遍布全身! +A metal pole catches you from below! +一根金属杆从下面固定住你! The ribbons tie themselves tightly around your body and won't let go! 丝带紧紧地系在你的身体上,不会松开! Shackles close themselves over your limbs! @@ -5626,52 +12022,60 @@ The ropes wrap themselves around your body! 绳索缠绕在你的身体上! The ropes wrap themselves tightly around your body! 绳索紧紧地缠绕在你的身体上! +The holy ropes secure themselves upon your body! +神圣之绳将自己固定在你的身上! The leather restraints attach themselves to your body! -皮革拘束具附着在您的身体上! +皮革拘束具附着在你的身体上! The high-tech cables wrap themselves over your body! -高科技钢缆将自己包裹在您的身体上! +高科技钢缆将自己包裹在你的身体上! The slime pours all over you! -史莱姆洒在你身上! +粘液洒在你身上! +A giant cube of latex engulfs you! +一个巨大的乳胶立方体吞没了你! +A giant bubble of latex engulfs you and inflates, sealing you in! +一个巨大的乳胶泡泡吞噬你并膨胀,把你封闭在里面! +A giant latex ball swallows you and inflates, sealing around your neck! +一个巨大的乳胶球吞噬你并膨胀,密封在你的脖子上! +A sinister power wraps itself around you and solidifies! +一股邪恶的力量将你包裹并凝固! +Dark magics swirl around you and solidify into shiny rubber! +黑暗魔法在你周围盘旋,并凝固成闪亮的橡胶! +Crystals grow and spread across your limbs! +晶体生长并遍布你的四肢! The magic chains wrap themselves around your body! 魔链缠绕在你的身体上! Your clothes are getting ripped away! 你的衣服被扯掉了! You feel a prick as a small dart hits you, and you start feeling drowsy... -当一个小飞镖击中您时,您感到刺痛,并且您开始感到昏昏欲睡…… +当一个小飞镖击中你时,你感到刺痛,并且你开始感到昏昏欲睡…… You breathe in the gas, and a wave of pleasure hits your whole body. 你吸入了气体,一阵快感袭上你的全身。 You breathe in the gas, and feel lethargic... -你吸入了气体,您开始感到昏昏欲睡…… -Message Log -消息日志 -Pass thru allies -通过盟友 -Auto-Struggle -自动尝试挣脱 -Auto-Pathfind -自动寻路 -Sprint/Hop -疾跑/跳跃 -Quick Inventory -快速物品栏 -Inventory -背包 -Reputation +你吸入了气体,你开始感到昏昏欲睡…… +You hear a mechanism trip... +你听到了机械装置跳闸的声音…… + + +Items +物品 +Rep 声望 -Spell List -法术列表 Spells 法术 Learn New Spells 学习新法术 Click a spell to replace SPELLNAME with. 单击要替换 SPELLNAME 的咒语。 -(Empty slot) -(空位) +Empty Slot +空槽 Back to Spellbook 回到法术书 Return to Game 返回游戏 + + +Known Abilities +已知能力 Elemental Spells 元素法术 Conjuration Spells @@ -5684,38 +12088,44 @@ Perks II 词条 II Perks III 词条 III -pg. -页数: -Next Page -下一页 -Previous Page -上一页 -Spell Points: SPELLPOINTS --- Elementalist lvELEMLEVEL --- Conjuration lvCONJLEVEL --- Illusionist lvILLULEVEL -法术点数: SPELLPOINTS --- 元素法术师 lvELEMLEVEL --- 咒术师 lvCONJLEVEL --- 幻术师 lvILLULEVEL + + +pg. NUM/TOTAL +页. 数/总 +### > + +### < + +Spell Points: SPELLPOINTS +技能点 : ‎SPELLPOINTS You need a higher level in SCHOOL magic to learn this spell. -您需要更高级别的 SCHOOL 魔法才能学习此法术。 +你需要更高级别的 SCHOOL 魔法才能学习此法术。 You need more spell points. -你需要更多的法术点数。 -School: -流派: -Elements -元素法术 -Conjuration -咒术 -Illusion -幻术 -Any School -任何流派 +你需要更多的技能点。。 +You don't have enough maximum mana to cast this spell! +您没有足够的最大法力值来施放这个法术! +School: +学校 : ‎ +Generic +通用 +Upgrade +升级 +Special +特别 Learn Spell 学习法术 -Spell Points: -法术点数: -Level: -等级: -Spell Point Cost: -法术点数消耗: - Mana Cost: -法力消耗: +Spell Points: +法术点 + + +Level: +等级 : ‎ +Spell Point Cost: +需求法术点 : ‎ +Mana Cost: +法力消耗 + + Remove Spell 1 移除法术 1 Remove Spell 2 @@ -5726,6 +12136,10 @@ Remove Spell 4 移除法术 4 Remove Spell 5 移除法术 5 +Remove Spell 6 +移除法术 6 +Remove Spell 7 +移除法术 7 Replace Spell 1 替换法术 1 Replace Spell 2 @@ -5736,124 +12150,152 @@ Replace Spell 4 替换法术 4 Replace Spell 5 替换法术 5 - Current Spell 1: -当前法术1: - Current Spell 2: -当前法术2: - Current Spell 3: -当前法术3: - Current Spell 4: -当前法术4: - Current Spell 5: -当前法术 5: +Replace Spell 6 +替换法术 6 +Replace Spell 7 +替换法术 7 +Current Spell 1: +当前法术 1 +Current Spell 2: +当前法术 2 : ‎ +Current Spell 3: +当前法术 3 : ‎ +Current Spell 4: +当前法术 4 : ‎ +Current Spell 5: +当前法术 5 : ‎ +Current Spell 6: +当前法术 6 : ‎ +Current Spell 7: +当前法术 7 : ‎ + + ??? ??? Unfiled 空的 +Adventuring 101 +冒险家 101 +History +历史 Bondage Witchery 束缚巫术 Enemy Notes 敌人图鉴 -Graveyard -墓地 -Catacombs -地下墓穴 -Jungle -丛林 +Overgrown +杂草丛生 Temple -寺庙 -Graveyard -墓地 -Graveyard -墓地 -Graveyard -墓地 -Graveyard -墓地 -Graveyard -墓地 -Graveyard -墓地 -Mansion -宅邸 +神殿 Tombs 坟墓 Library 图书馆 -Crystal Cave -水晶洞 -Graveyard -墓地 -Graveyard -墓地 -Graveyard -墓地 -Graveyard -墓地 -Graveyard -墓地 -Graveyard -墓地 -Graveyard -墓地 +Bellows +风箱 +Coast +海岸 +Ejahl +埃亚尔 + + +(A page from the Book of Aeons)|The 'Graveyard' is a peculiar place. Long ago, human beings lived and died just like the animals. When the Old Civilization existed, they would come to bury their dead in the Graveyard. It remains a mystery why so many of the former dead seem to be alive. Some say that when the Old Civilization cast the spell that spell which overcame Death, even those buried in their graves would rise again. Others simply say that there is a powerful necromancer who lives here, toying with the dead as if they were pets... +( 《万古之书》中的一页 ) |'墓地' 是一个奇特的地方。很久以前,人类和动物一样生、死。当旧文明存在的时候,他们会来墓地埋葬死者。为什么这么多死者似乎还活着,仍然是一个谜。有人说,当旧文明施展战胜死亡的咒语时,即使是那些埋在坟墓里的人也会复活。还有人干脆说这里住着一个强大的死灵法师,把死人当作宠物一样玩弄…… +(A page from the Book of Aeons)|Beneath the Graveyard lies a relic of a former age, a network of tombs inhabited by the immortal followers of Bast. Very few were graced with this gift of immortality before the great archmagus, Sariel Vinlaga, stole this power from the gods and granted all humans with the power of immortality. The Bast followers are still set in their ways, hoping for a time when their Goddess will return and rebuild their glorious civilization. +( 《万古之书》中的一页 ) |墓地下方躺着一座上古时代的遗迹,一个由猫女神的不朽追随者居住的墓穴网络。在伟大的大法师萨里尔·文拉加(Sariel Vinlaga)从众神那里窃取了这种不朽的力量并授予所有人类不朽的力量之前,很少有人获得过这种不朽的天赋。猫女神的追随者仍然固执己见,希望有一天他们的女神能够回归并重建他们辉煌的文明。 +(A page from the Book of Aeons)|Some say the 'Catacombs' are older than time itself. When the Old Civilization began to study immortality, no one knew if it would be possible to bring back those who already died. The Catacombs therefore were used to store all of the remains of former humans, so that they too could be revived when the archmagus would finally make her breakthrough. +( 《万古之书》中的一页 ) |有人说 '地下墓穴' 比时间本身还要古老。当旧文明开始研究永生时,没有人知道是否有可能让那些已经死去的人复活。因此,地下墓穴被用来储存前人类的所有遗骸,以便当大法师最终取得突破时,他们也可以复活。 +(A page from the Book of Aeons)|They say that Archmagus Sariel Vinlaga studied in this very library. Having gathered together all of human knowledge, magical, spiritual, technological, she tasked her twelve lesser magi with the job of sorting and collating the wealth of knowledge she had acquired. No one knows why she suddenly abandoned it, or why it remains in such disrepair today. +( 《万古之书》中的一页 ) |据说大法师萨里尔·文拉加(Sariel Vinlaga)就在这个图书馆学习过。在收集了所有人类知识 ( 魔法、精神、技术 ) 后,她指派十二位次级贤者负责整理和整理她所获得的知识财富。没有人知道她为什么突然放弃它,或者为什么它至今仍如此年久失修。 +(A page from the Book of Aeons)|The Overgown Ruins remain a puzzle to scholars. Hardly any light comes through the cracks in the ceiling, and yet the area teems with life. It is known that the regenerative powers that keep humans from dying relies on an individual's own mana supply. So how do plants and beasts without mana survive? The devout say it is the Goddess of Restoration who preserves the jungle, but could it be that the Old Civilization developed a means of sustaining life underground? +( 《万古之书》中的一页 ) |长袍遗址仍然是学者们的一个谜。天花板的裂缝里几乎没有光线,但这个地区充满了生机。众所周知,使人类免于死亡的再生能力依赖于个人自身的法力供应。那么,没有魔法的植物和动物是如何生存的呢?虔诚的信徒们说,是恢复女神保护了丛林,但旧文明是否开发了一种维持地下生命的方法? +(A page from the Book of Aeons)|The problem of Energy has plagued civilization for millenia. Before the leylines were discovered, humankind relied on natural sources of power such as rivers and firewood. When the Crystal Caves were discovered, a great revolution occurred. No longer reliant on natural sources, civilizations could tap the wellsprings of chaotic energy underground to power machinery like never seen before. +( 《万古之书》中的一页 ) |能源问题已经困扰了文明数千年。在地脉被发现之前,人类依赖河流和木柴等自然资源。当结晶洞被发现时,发生了一场伟大的革命。文明不再依赖自然资源,可以利用地下混沌能量的源泉为机械提供前所未有的动力。 +(A page from the Book of Aeons)|The 'Lost Temple' as they call it, is a subject of great speculation. It seems that its creators worshipped only four creator goddesses, rather than all the Eight. It was perhaps abandoned several hundred years ago when a flood caused great panic, and it seems that this must have occurred before humanity was made immortal by the archmagus, as there are many remains still found inside. +( 《万古之书》中的一页 ) |他们所说的 '失落的神殿',是一个饱受猜测的对象。看来它的创造者只崇拜四位造物主女神,而不是所有的八女神。它可能是几百年前被遗弃的,当时一场洪水引起了巨大的恐慌,这似乎发生在大法师使人类永生之前,因为里面仍然发现了许多遗骸。 +(A page from the Book of Aeons)|The Stars have been a mystery to scholars since the beginning of time. At one point, humans believed that every star was a god, and they made offerings by throwing sugar into the night, thinking that as the stars were innumerable, so were the grains of sugar that pleased humans so much. Religion has moved past that, but the Orrery remains a relic from a time when humanity worshipped the stars rather than the Eight. +( 《万古之书》中的一页 ) |自古以来,星星对于学者来说一直是个谜。曾几何时,人类相信每一颗星星都是一位神,他们通过向黑夜中投掷糖来供奉,认为星星无数,而令人类高兴的糖粒也数不胜数。宗教已经超越了这一点,但太阳系仪仍然是人类崇拜星星而不是八星时代的遗迹。 +(A page from the Book of Aeons)|The 'Bellows' is the nickname given to the primitive facilities of the Old Civilization, buried deep beneath the ground. While much of it remains in disrepair, many of the Old Civilization's successors have attempted to keep it in good working order, as the technology is precious and impossible to replicate with modern methods. It seems that many of these successors have fallen prey to some delusions about its purpose, as much of the equipment preserved has little use aside from collecting prisoners. +( 《万古之书》中的一页 ) |'风箱'是旧文明深埋在地下的原始设施的昵称。虽然其中大部分仍年久失修,但许多旧文明的继承者都试图使其保持良好的工作状态,因为这项技术非常珍贵,而且不可能用现代方法复制。 似乎这些继承者中的许多人都对其目的产生了一些错觉,因为保留下来的大部分设备除了收集囚犯之外几乎没有什么用处。 + + (Preface from the journal of Catherine Willows, well-known explorer who vanished in the dungeon 30 years ago) I am writing this journal in the off chance that I do not come back in my search for the Mistress' staff. If you find this, please make an effort to deliver it back to the surface for the good of all the young women lured by its secrets. -(凯瑟琳·威洛斯(Catherine Willows)的日记前言,她是 30 年前在地牢中消失的著名探险家)我写这本日记是因为我没有回来寻找女主人的工作人员。如果你发现了这个,为了所有被它的秘密引诱的年轻女性的利益,请努力把它送回地面。 +( 凯瑟琳·韦罗斯 ( Catherine Willows ) 的日记前言,她是 30 年前在地牢中消失的著名探险家 ) 我写这本日记是因为我没有回来寻找女主人的工作人员。如果你发现了这个,为了所有被它的秘密引诱的年轻女性的利益,请努力把它送回地面。 (Pg. 24 from Catherine Willows' journal) Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?' -(凯瑟琳·威洛斯(Catherine Willows)杂志的第 24 页)许多铲平女主人墓上层的人经常反问:“为什么有奇怪的古怪陷阱守卫着宝箱?如果目的是劝阻入侵者,为什么不设置真正的、致命的陷阱呢? +( 凯瑟琳·韦罗斯 ( Catherine Willows ) 日记第 24 页 ) 许多铲平女主人墓上层的人经常反问 : ‎“为什么有奇怪的古怪陷阱守卫着宝箱?如果目的是劝阻入侵者,为什么不设置真正的、致命的陷阱呢? (Pg. 25 from Catherine Willows' journal) ...They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence. -(Catherine Willows 日记中的第 25 页)......他们犯了一个重大错误:宝箱没有被困住。相反,它们充满了黄金。而且我们知道黄金是神所喜悦的:我们的经济在它上面运行,神只干预我们的日常事务,因为我们给了他们黄金。被称为精灵的小神也喜欢黄金,但与我们所知道的神不同的是,这些小精灵不能像众神一样一举消耗祭坛上的黄金。因此,他们需要实际居住在黄金所在的地方,慢慢地抽干它令人愉悦的本质。 -(Pg. 26 from Catherine Willows' journal) So the question is not why did somebody lay these traps. The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. -(Catherine Willows 杂志的第 26 页)所以问题不在于为什么有人设置这些陷阱。答案是它们根本不是陷阱。我推测楼上曾经是祭祀死者的地方。而当古老的文明消亡,整个建筑群沉入地下时,再也没有人可以驱散这些灵魂,阻止它们在楼上居住。至于为什么有这么多一般的约束,而不是你典型的精神……好吧,我们知道女主人周围是什么。 +( 凯瑟琳·韦罗斯 ( Catherine Willows ) 日记第 25 页 ) ......他们犯了一个重大错误 : ‎宝箱里没有陷阱;相反,它们充满了黄金。而且我们知道黄金是神所喜悦的 : ‎我们的经济在它上面运行,神只干预我们的日常事务,因为我们给了他们黄金。被称为精灵的小神也喜欢黄金,但与我们所知道的神不同的是,这些小精灵不能像众神一样一举消耗祭坛上的黄金。因此,他们需要实际居住在黄金所在的地方,慢慢地抽干它令人愉悦的本质。 +(Pg. 26 from Catherine Willows' journal) So the question is not 'why did somebody lay these traps.' The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. +( 凯瑟琳·韦罗斯 ( Catherine Willows ) 日记第 26 页 ) 因此,问题不是 '为什么有人要设置这些陷阱'。答案是它们根本不是陷阱。我推测楼上曾经是祭祀死者的地方。当旧文明消亡,整个建筑群沉入地下时,就不再有人驱赶鬼魂,阻止它们居住在楼上。至于为什么会有这么多的束缚,而不是你典型的那种心理……我们知道女主人周围是什么。 (The note starts with a drawing of a witch with many chains hanging from her body) She can block melee attacks with her chains. However, they conduct lightning and heat directly to her body, and I was able to take out her chains with bolt cutters. -(笔记开始于一个女巫的图画,她身上挂着许多锁链)她可以用她的锁链阻挡近战攻击。但是,它们将闪电和热量直接传导到她的身体,我能够用断线钳将她的锁链取出。 +( 笔记开始于一个女巫的图画,她身上挂着许多锁链 ) 她可以用她的锁链格挡近战攻击。但是,它们将闪电和热量直接传导到她的身体,我能够用断线钳将她的锁链取出。 (The note starts with a drawing of a witch with lightning crackling from her fingertips) Water will cause her to short-circuit. I can't seem to hit her with lightning, though. She always redirects it. -(纸条的开头是一幅指尖发出闪电劈啪作响的女巫)水会使她短路。不过,我似乎无法用闪电击中她。她总是重定向它。 +( 纸条的开头是一幅指尖发出闪电劈啪作响的女巫 ) 水会使她短路。不过,我似乎无法用闪电击中她。她总是重定向它。 (The note starts with a drawing of a witch whose body is partly gelatinous) The slime is non-flammable and my attacks pass right through her body... Lightning and ice seem to be effective! -(笔记开头画的是一个身体部分呈凝胶状的女巫)史莱姆是不易燃的,我的攻击直接穿过她的身体……闪电和冰似乎很有效! +( 笔记开头画的是一个身体部分呈凝胶状的女巫 ) 粘液是不易燃的,我的攻击直接穿过她的身体……闪电和冰似乎很有效! (The note is from a famous escape artist) Many restraints are applied quite tightly by a skilled rigger. Even removing it will be tough without thrashing around a bit to loosen it. -(笔记来自一位著名的逃生艺术家)许多束缚都是由熟练的装配工非常严格地施加的。即使将其移除也会很困难,而无需稍微扭动以松开它。 +( 笔记来自一位著名的逃生艺术家 ) 许多束缚都是由熟练的装配工非常严格地施加的。即使将其移除也会很困难,而无需稍微扭动以松开它。 (The note is from a famous escape artist) Anything can be unbuckled with enough patience. Having a finger extension such as a lockpick will help. Ultimately, though, what matters is that you have a calm state of mind, free from distraction and hopelessness. -(笔记来自一位著名的逃脱艺术家)只要有足够的耐心,任何事情都可以解开。有一个手指延伸,如撬锁工具会有所帮助。但最终,重要的是你有一个平静的心态,没有干扰值和绝望。 -(The note is from a famous cartographer) It has been observed that the dungeon spirits lurking in chests are more active even after the regular inhabitants such as zombies or skeletons are cleared out. My hypothesis is that the spirits are too afraid to come out in the presence of a more powerful, embodied spirit. -(笔记来自著名的制图师)据观察,即使僵尸或骷髅等常规居民被清除后,潜伏在箱子中的地牢精神也会更加活跃。我的假设是,这些灵魂太害怕在一个更强大、更具体的灵魂面前出现。 +( 笔记来自一位著名的逃脱艺术家 ) 只要有足够的耐心,任何事情都可以解开。有一个手指延伸,如撬锁工具会有所帮助。但最终,重要的是你有一个平静的心态,没有性奋和绝望。 +(The note is from a famous cartographer) In my lapse of judgement, I decided to borrow some mana from the nearby shrine to the Latex goddess. While there was no immediate response to my faux pas, I soon found myself pursued by a swarm of slimes! +( 笔记来自一位著名的制图师)由于我的判断失误,我决定从附近的乳胶女神神龛借用一些法力。虽然我的失礼没有立即得到回应,但我很快就发现自己被一群黏虫追了起来! (A letter between bandit leaders) One of my subordinates has been reporting a girl bound in heavy leather restraints running around. I told her that this is normal, people keep all kinds of servants around here. But definitely keep an eye out for intruders! Don't let them fool you! -(土匪首领之间的一封信)我的一个下属报告了一个被沉重的皮革束缚束缚的女孩四处奔跑。我告诉她,这很正常,人们在这里养着各种各样的仆人。但一定要留意入侵者!不要让他们愚弄你! +( 土匪首领之间的一封信 ) 我的一个下属报告了一个被沉重的皮革束缚束缚的女孩四处奔跑。我告诉她,这很正常,人们在这里养着各种各样的仆人。但一定要留意入侵者!不要让他们愚弄你! (The note is a letter from the school of conjuration) We really would like to know... why did you summon a frog in the laboratory? People are wondering, you know. One of the student's projects got eaten. -(纸条是魔法学院的一封信)我们真的很想知道……你为什么在实验室里召唤了一只青蛙?人们想知道,你知道的。学生的一个项目被吃掉了。 +( 纸条是一封来自魔法学校的信 ) 我们真的很想知道……你为什么在实验室里召唤了一只青蛙?人们想知道,你知道的。学生的一个项目被吃掉了。 (You find a carving on the floor, a half-finished magic circle of celestial conjuration. Perhaps a cleric wished to call forth an angel for guidance, before realizing there was a shrine a short walk away, where she could contact the heavens much more easily.) -(你在地板上发现了一个雕刻,一个半完成的天界咒法法阵。也许一个牧师想召唤一个天使来指导,然后才意识到不远处有一座神殿,她可以在那里更多地接触天堂容易地。) +( 你在地板上发现了一个雕刻,一个半完成的天界咒法法阵。也许一个祭司想召唤一个天使来指导,然后才意识到不远处有一座神殿,她可以在那里更多地接触天堂容易地。 ) (It looks like a... receipt) Thank you for your offering to CELESTIAL COMMERCE. Please accept this fine-quality steel blade as compensation for your continued devotion and selflessness. -(看起来像……收据)感谢您向 CELESTIAL COMMERCE 提供的服务。请接受这把优质钢刀片作为对您持续奉献和无私的补偿。 -(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter than she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. -(草书纸条) 对袭击我们的信使并将他们绑在此处的人: 幻象女神的神殿不得以这种方式使用。如果你想要一个用于你下流实验的主题,请尝试在其中一个当地人身上这样做,看在上帝的份上,不要打电话给天使信使,这样你就可以把她绑起来。不管她是否同意,您是否支付,我们的快递员都有他们必须承担的责任。签名:HERONA,幻象女神的执行者。 +( 看起来像……收据 ) 感谢您向 CELESTIAL COMMERCE 提供的服务。请接受这把优质钢刀片作为对您持续奉献和无私的补偿。 +(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter that she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. +(用草书写的便条)致那些袭击我们的信使并把他们绑在这里的人 : 幻象女神的神殿不能以这种方式使用。如果你想要一个对象来做你的下流实验,请尝试在一个当地人身上这样做,看在神的份上,不要为了把她绑起来而传信给天使信使。她同意与否,你付钱与否都不重要,我们的信使有他们必须履行的责任。签名 : 赫罗娜,幻象女神的执行者。 (From an essay titled 'On Celestial Supply Chains') It is known that the heavens seek gold. We do not know why it is that the heavens seek it, but we do know that the Goddesses grant us fragments of their limitless power in exchange for this otherwise-useless metal we dredge up from the earth. They care about it so much that shrines are commonplace, each hosting an angelic courier lying in wait for any adventurer willing to part with hers. -(摘自一篇题为《论天上供应链》的文章)众所周知,天上求金。我们不知道为什么上天会寻找它,但我们知道女神赐予我们无限力量的碎片,以换取我们从地球上挖出的这种原本无用的金属。他们非常关心它,以至于神社司空见惯,每个神社都有一个天使信使,等待任何愿意与她分手的冒险者。 -They thought they stripped me down and checked everywhere. They didn't know about one of the first tricks we learned in wizard school: how to make an enchanted knife disappear! -他们以为他们剥了我的衣服,到处检查。他们不知道我们在巫师学校学到的第一个技巧:如何让附魔刀消失! -They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Blink out of jail and into the bandit's cache where they kept all of my things! -他们以为他们可以拥有我的传奇之剑……但是傻瓜忘记了绑我的腿!我能够闪现出监狱,进入强盗的藏匿处,他们把我所有的东西都放在那里! +( 摘自一篇题为《论天上供应链》的文章 ) 众所周知,天上求金。我们不知道为什么上天会寻找它,但我们知道女神赐予我们无限力量的碎片,以换取我们从地球上挖出的这种原本无用的金属。他们非常关心它,以至于神龛司空见惯,每个神龛都有一个天使信使,等待任何愿意与她分享的冒险者。 +They say that the maiden who safeguards the graveyard is kind to her pets... +据说守护墓园的少女会善待她的宠物... +They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Portal out of jail and into the hallway where they kept all my things! +他们以为他们可以拥有我的传奇刀刃...但那些傻瓜忘了绑我的腿!我得以走出监狱,进入他们存放我所有东西的走廊 I am writing this from inside prison. Who would have known they cared so much about me using a shrine? Sheesh. -我是在监狱里写这篇文章的。谁能知道他们对我使用神社如此关心?嘘。 +我是在监狱里写这篇文章的。谁能知道他们对我使用神泉如此关心?嘘。 + + (A drawing of a bunch of zombies, ordered by danger level. Of note are a zombie surrounded by charms, a zombie surrounded by talismans, a zombie warrior with a sword, and... some kind of shrine maiden that you've never seen before) -(一组僵尸的图画,按危险等级排序。值得注意的是一个被符咒包围的僵尸,一个被丝带包围的僵尸,一个拿着剑的僵尸战士,还有……某种你从未见过的巫女以前看过) -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE) The first thing to understand is that tying someone up is difficult if they are not in a vulnerable position. If your opponent is vulnerable, then binding will be twice as effective! -(摘自 BONDAGE WITCHERY: A STUDENT'S GUIDE) 首先要理解的是,如果某人不处于弱势地位,将其捆绑起来是很困难的。如果你的对手很脆弱,那么捆绑的效果会翻倍! -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE) Once your opponent is nicely trussed up, you can break their will by ticking them with a Feather, Ice Cube, or Magic Wand. -(摘自 BONDAGE WITCHERY:学生指南)一旦你的对手被很好地束缚,你可以用羽毛、冰块或魔杖打勾来打破他们的意志。 -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE) Bigger and more resilient opponents are much more effective at breaking out of your binds. Try to deal some damage to them to decrease the speed at which they struggle out of your restraints. -(摘自 BONDAGE WITCHERY: A STUDENT'S GUIDE)更大、更有弹性的对手在突破你的束缚方面更有效。尝试对他们造成一些伤害,以降低他们挣脱束缚的速度。 +( 一组僵尸的图画,按危险等级排序。值得注意的是一个被符咒包围的僵尸,一个被丝带包围的僵尸,一个拿着剑的僵尸战士,还有……某种你从未见过的巫女以前看过 ) + + +(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|The first thing to understand is that tying someone up is difficult if they are not in a vulnerable position. If your opponent is vulnerable, then binding will be twice as effective! +( 摘自束缚巫术 : ‎学生指南 ) |首先要明白的是,如果某人不处于弱势,那么将其捆绑起来是很困难的。如果你的对手很脆弱,那么束缚的效果会加倍! +(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by tickling them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage. +( 摘自束缚巫术 : ‎学生指南 ) |一旦你的对手被很好地束缚起来,你就可以通过用羽毛、冰块或魔杖打他们来打破他们的意志。这会造成额外伤害。 +(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Bigger and more resilient opponents are much more effective at breaking out of your binds. Try to deal some damage to them to decrease the speed at which they struggle out of your restraints. +( 摘自束缚巫术 : ‎学生指南 ) |更强壮、更有韧性的对手更能有效地突破你造成的束缚。尝试对他们造成一些伤害,以降低他们挣脱你的束缚的速度。 +(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Many mages utilize magical runes to set traps. If you want to check for traps, try learning the spell 'Magical Sight' in the Illusion school. +( 摘自束缚巫术 : ‎学生指南 ) |许多法师利用魔法符文来设置陷阱。如果你想检查陷阱,可以尝试在幻术学院学习法术'魔之眼'。 + + +From Adventuring 101: A guide to combat|Your opponent will become vulnerable in many ways, such as missing you with an attack. You can also teleport to the other side of them when they are attacking you, and this will confuse them briefly.|Vulnerable enemies take extra damage, and are easier to tie up! +摘自《冒险101 : ‎战斗指南》|你的对手会在很多方面变得脆弱,比如在攻击中错过你。当他们攻击你时,你也可以传送到他们的另一边,这会让他们短暂迷惑。|脆弱的敌人会受到额外伤害,并且更容易被束缚! +From Adventuring 101: A guide to combat|Drenching your opponents makes them more vulnerable to ice and electricity, but may increase their resistance to fire. +摘自《冒险101 : ‎战斗指南》|淋湿你的对手会让他们更容易受到冰和电的伤害,但可能会增加他们的火抗性。 +From Adventuring 101: A guide to combat|Hitting enemies with melee damage while they are frozen will break the ice, but this also doubles the damage dealt by the attack. +摘自《冒险101 : ‎战斗指南》|在敌人被冰冻时用近战伤害击中敌人会打破冰冻,但这也会使攻击造成的伤害翻倍。 +From Adventuring 101: A guide to combat|Did you know that hitting enemies with fire while they are frozen is extra powerful? Enemies take 40% additional damage from fire while frozen, although fire will rapidly unfreeze them. +摘自《冒险101 : ‎战斗指南》|你知道吗,在敌人被冰冻的时候用火攻击他们会带来额外的威力?敌人在冰冻状态下会受到 40% 的额外火焰伤害,但火焰会迅速解冻他们。 +From Adventuring 101: A guide to combat|When you're in a bind, try to play along and look for an opportunity to escape. Fighting back will only make your enemies want to tighten your restraints. +摘自《冒险101 : ‎战斗指南》|当你陷入困境时,尝试配合敌人并寻找逃脱的机会。反击只会让敌人更想收紧你的束缚。 + + (A drawing of a suit of armor. It reads: DO NOT TRUST) -(一套盔甲的图纸。上面写着:不要相信) +( 一套盔甲的图纸。上面写着 : ‎不要相信 ) (The note starts with a drawing of a witch in dark robes with bright pink hair) A necromancer. Powerful spellcaster, weak up close. -(纸条开头描绘了一个穿着深色长袍、头发亮粉色的女巫)死灵法师。强大的施法者,近身弱。 +( 纸条开头描绘了一个穿着深色长袍、头发亮粉色的女巫 ) 死灵法师。强大的施法者,近身弱。 I can't count how many skeletons I've bashed with my hammer today. They seem so fragile... 我数不清今天用我的锤子敲了多少骷髅。他们看起来很脆弱... (The note is scrawled with wiggling lines) IT SEES ME. I SHOULDN'T HAVE DEFILED THE ROPE GODDESS' ALTAR! -(纸条上写满了摆动的线条)它看到了我。我不应该玷污绳女神的祭坛! +( 纸条上写满了摆动的线条 ) 它看到了我。我不应该玷污绳女神的祭坛! It is said that fire and water are opposite planes, but I've noticed that the relation is more lopsided than 'equal and opposite' when they physically manifest. Water elementals resist fire, obviously, but fire elementals are weak to water! It is almost as if the abundance of water in this world causes the fire elementals to become weaker than in their home plane... 据说火和水是相反的平面,但我注意到当它们物理表现时,这种关系比“平等和相反”更不平衡。很明显,水元素抵抗火,但火元素对水很弱!就好像这个世界上丰富的水使火元素变得比他们的家乡更弱...... A drawing of many icicles around pools of water. It instructs you to avoid the pools of water and you can see a figure surrounded by ice shards in the distance being set on fire and smashed with a hammer. -水池周围有许多冰柱的图画。它指示您避开水池,您可以看到远处被冰块包围的人物被点燃并被锤子砸碎。 +水池周围有许多冰柱的图画。它指示你避开水池,你可以看到远处被冰块包围的人物被点燃并被锤子砸碎。 The shadow spirits' touch is cold as ice... I have wondered if this temperature property applies to their destructive effects on other types of beings. Unfortunately, I found out the hard way when I tried to summon a shadow creature against an ice elemental... 影灵的触感像冰一样冰冷……我想知道这种温度特性是否适用于它们对其他类型生物的破坏作用。不幸的是,当我试图召唤一个暗影生物对抗冰元素时,我发现了一个艰难的方法...... I was being chased by something fast and heavy, and it was about to crush me when I tossed an Ice Shard behind me. It stopped and I didn't care to look back. @@ -5865,237 +12307,463 @@ SOMEBODY STABBED MY FROG AND I AM PISSED. I don't think it's neccessary to tell people that dragons resist fire... right? 我认为没有必要告诉人们龙抗火……对吧? I've been studying the dragonheart's weaknesses. So far I've found that the ones bearing the powers of ice dragons are actually weak to fire unlike the others, and the ones who summon crystals to block attacks are nonetheless unable to grab a spear to stop it from reaching them. -我一直在研究龙之心的弱点。到现在我发现,拥有冰龙之力的人,其实跟其他人不一样,开火能力很弱,而召唤水晶格挡攻击的人,却是连长矛都拿不到。 +我一直在研究龙之心的弱点。到现在我发现,拥有冰龙之力的人,其实跟其他人不一样,不怕火,而那些召唤结晶来格挡攻击的人却无法抓住长矛来阻止它。 + + They say a ninja can catch a sword in her hands, but can she stop a spear? Ha, thought not! -都说忍者能拿剑,但能挡住长矛吗?哈,没想到! +都说忍者能拿剑,但能挡住长矛吗?哈,没想到吧! (Pg. 54 from Catherine Willows' journal): The post-collapse civilization sought immortality, but they knew that the technologies of the old civilization were a danger to them. So they turned to another school of thought: Magic. -(Catherine Willows 杂志第 54 页):崩溃后的文明寻求永生,但他们知道旧文明的技术对他们来说是危险的。所以他们转向了另一种思想流派:魔法。 -(Pg. 55 from Catherine Willows' journal): Mummy wrappings, enchanted with ten-thousand magic words per piece of ribbon, were suffucient to protect their bodies from ageing for millenia. What they didn't realize was that the magic didn't protect their souls. -(Catherine Willows 日记中的第 55 页):木乃伊包裹物,每条丝带都附有一万个魔法词,足以保护他们的身体免于衰老数千年。他们没有意识到魔法并不能保护他们的灵魂。 -(Pg. 56 from Catherine Willows' journal): The mummies have no clue what they are doing anymore. To them, this is just another one of their ten-thousand dreams they've had. They cannot tell reality from imagination. -(Catherine Willows 杂志的第 56 页):木乃伊不知道他们在做什么了。对他们来说,这只是他们一万个梦想中的又一个。他们无法分辨现实与想象。 +( 凯瑟琳·韦罗斯 ( Catherine Willows ) 日记第 54 页 ) : ‎崩溃后的文明寻求永生,但他们知道旧文明的技术对他们来说是危险的。所以他们转向了另一种思想流派 : ‎魔法。 +(Pg. 55 from Catherine Willows' journal): Silk wrappings, enchanted with ten-thousand microscopic runes per cubit, were suffucient to protect their bodies from ageing for millenia. What they didn't realize was that the magic didn't protect their souls. +( 凯瑟琳·韦罗斯 ( Catherine Willows ) 日记第 55 页 ) : 丝绸裹巾,每腕尺刻有一万个微小的符文,足以保护他们的身体在千年之内免于衰老。他们没有意识到的是,魔法并不能保护他们的灵魂。 +(Pg. 56 from Catherine Willows' journal): They have no clue what they are doing anymore. To them, this is just another one of their ten-thousand dreams across the aeons. They can no longer tell reality from imagination. +( 凯瑟琳·韦罗斯 ( Catherine Willows ) 日记第 56 页 ) : ‎他们不再知道自己在做什么。对于他们来说,这不过是他们千古万劫中的又一个梦想而已。他们不再能够区分现实和想象。 Ninjas aren't so tough to fight when their hands are tied behind their back. Good thing I had my pet slime with me~ -当他们的双手被绑在背后时,忍者并不那么难以战斗。还好我有我的宠物史莱姆~ +当他们的双手被绑在背后时,忍者并不那么难以战斗。还好我有我的宠物粘液团 +(Pg. 12 from Catherine Willows' addendum): After studying the ancient race of catlike people, I have come to the conclusion that their race met a dual fate. All of them received eternal life in some form or another. To one half it manifested as a blessing, allowing them to walk the halls. To the other it became a curse to them, trapping them in runic wrappings for all eternity. +( 凯瑟琳·韦罗斯 ( Catherine Willows ) 附录的第 12 页 ) : ‎在研究了古代的猫人种族之后,我得出的结论是,他们的种族遇到了双重命运。他们所有人都以某种形式获得了永生。对一半人来说,这表现为一种祝福,允许他们在大厅里行走。对于另一个人来说,它成为了他们的诅咒,将他们永远困在符文包裹中。 +(Pg. 13 from Catherine Willows' addendum): I must issue a correction to the statements written in my journal. The ancients knew what they were doing. Those that were cursed, are blessed, and those who were blessed, are cursed. +( 凯瑟琳·韦罗斯 ( Catherine Willows ) 附录第 13 页 ) : ‎我必须对日记中所写的陈述进行更正。古人知道他们在做什么。那些被咒诅的人是有福的,那些被祝福的人是被咒诅的。 +(It's a copy of an ancient illustration, depicting a cat goddess, an elven goddess, and two groups of catgirls. One group is smiling and standing on pedestals. The other group is frowning and wearing armor meant for war. It looks unfinished, like the author was suddenly grabbed from behind while drawing it) +( 这是一幅古代插图的复制品,描绘了一位猫女神,一位精灵女神和两组猫女。一组微笑着站在基座上,另一组皱着眉头穿着战争用的盔甲。它看起来未完成,就像作者在画的时候突然被人从后面抱住 ) +(It's a interlinear translation of an ancient letter) Your highness, I have delivered to you the prisoners that you have asked. They are the worst of the worst--thieves, slanderers, sorcerers and seducers. But I must inquire, why is it that we must wrap them in silken scarves, worth twenty gold pieces each? Surely they are being handed over to be disciplined, not to be anointed? +( 这是一封古信的行间翻译 ) 殿下,您所要求的囚犯我已经交给您了。他们是最坏中的最坏的人——小偷、诽谤者、巫师和诱惑者。但我要问,为什么一定要给他们裹上每条价值二十金币的丝巾呢?难道他们被交给人是为了接受纪律,而不是为了受膏抹吗? +(It's a record of an interview)|ME: Why are you like this?|MUMMY: Because we are blessed!|ME: Blessed? You've been wrapped up for thousands of years!|MUMMY: A thousand years is nothing compared to the glory that will come!|ME: Why do you have to be wrapped up? There are plenty of you who aren't...|MUMMY: The chosen ones will inherit the land when the goddess returns. +(采访记录)|我 : 你为什么这样?木乃伊 : 因为我们被祝福了!|我:祝福吗?你被包裹了几千年!木乃伊 : 与即将到来的荣耀相比,千年不算什么!我 : 你为什么要裹得严严实实的?你们中有很多人不是……木乃伊 : 当女神回来时,被选中的人将继承土地。 +(It's a record of an interview)|ME: Which goddess are you referring to? The goddess of restoration?|MUMMY: The blessed kitty.. she was promised to rule over the lesser goddesses.|ME: Lesser goddesses? Which ones?|MUMMY: YOUR goddesses. The ones you humans created that should not be. Ours is the true offspring of the creators, a goddess created to rule! +( 采访记录 ) |我 : ‎你指的是哪位女神? 恢复女神?|木乃伊 : ‎受祝福的小猫..她被许诺统治小女神。|我 : ‎小女神?哪些?|MUMMY : ‎你的女神。你们人类创造的那些不应该是的。我们是造物主的真正后代,是为统治而生的女神! +(It's a record of an interview)|ME: What of the elves? Don't they talk about a 'kingdom' too?|MUMMY: Who are the elves?|ME: You know, pointy ears, green hair, a heck of an attitude... they seem in tune with nature.|MUMMY: They sound arrogant.|ME: They are.|MUMMY: Perhaps they know nothing of the promise between our goddess and theirs. +( 采访记录 ) |我 : ‎精灵呢?他们不是也在谈论 '王国' 吗?|木乃伊 : ‎精灵是谁?|我 : ‎你知道,尖尖的耳朵,绿色的头发,一种奇怪的态度......他们似乎与自然融为一体。|木乃伊 : ‎ 他们听起来很傲慢。|我 : ‎他们确实很傲慢。|木乃伊 : ‎也许他们对我们的女神和他们的女神之间的承诺一无所知。 +(It's a medical record) Patient seems stable... application of the enchanted cloth seems to have stopped the bleeding. It appears that the ancient magic suppresses all forms of injury, even in humans, until it is taken off. +( 这是一份医疗记录 ) 病人看起来很稳定……使用魔法布似乎已经止血了。看来古老的魔法可以抑制所有形式的伤害,甚至对人类来说也是如此,直到它被解除为止。 + + +(A record of an ancient... transaction)||The elemental offered us the following from her personal estate:|-one magical lantern that requires no fuel, and can light up the night as if it were day|-one crystal that burns red-hot when kept near metal, providing heat to warm a house|-three enchanted swords imbued with flame|-a hollow glass crystal, used for communication||In exchange, we gave her three wolfgirls we had captured on the surface. +( 一项古老的……交易的记录 ) ||精灵从她的个人财产中向我们提供了以下内容 : ‎|-一盏不需要燃料的神奇灯笼,可以照亮黑夜,就像白天一样|-一颗水晶 靠近金属时会燃烧成红热,为房屋提供热量|-三把充满火焰的魔法剑|-空心玻璃晶体,用于通讯||作为交换,我们给了她我们在地表捕获的三个狼娘。 +I had heard that ancient humans prayed to the stars here, in an effort to find favor when the Eight had forsaken them. So I went and prayed... and let me tell you, it was a lie, an absolute lie. There are only monsters out there. +我听说远古人类在这里向星星祈祷,试图在八神抛弃他们后寻求庇护。所以我去祈祷……让我告诉你,这是一个谎言,一个绝对的谎言。那里只有怪物。 +(It is a set of instructions for creating a magic circle to unlock a sealed portal. There are markings in many languages that give conflicting descriptions, claiming that the circle will transmute material to gold, or bring good fortune...) +( 这是一组创建魔法阵以解锁密封传送门的说明。许多语言的标记给出了相互矛盾的描述,声称魔法阵可以将材料转化为黄金,或者带来好运...... ) + + +(Two schematic diagrams of ancient drones taken from records. The first is unmodified, and the second has several annotations written in what looks like pink lipstick...) +( 从记录中截取的两张古代无人机的示意图。第一个是未修改的,第二个有几个看起来像粉红色唇膏的注释...... ) + + Those damn slimes! They're so sticky and gross... fortunately, I washed myself in the fountain the last time I got caught by one. It came right off! -那些该死的史莱姆!它们又粘又恶心……幸运的是,上次我被一个人抓住时,我在喷泉里洗了自己。它马上就来了! +那些该死的粘液团!它们又粘又恶心……幸运的是,上次我被一个人抓住时,我在喷泉里洗了自己。它马上就来了! The dragonhearts were a group of dragonslayers, named for their ritual that imbues them with the fiery power and resistance of dragons they've slain. Now they work as mercenaries, and some of them serve a certain Leather goddess. 龙心是一群屠龙者,以他们的仪式命名,这种仪式赋予他们所杀死的龙的炽热力量和抵抗力。现在他们以雇佣兵的身份工作,其中一些人服务于某个皮革女神。 -Yes! I've done it! I have created another red slime! I shall call him Fred, yes, Fred... after the slime I lost in a Shield-related accident a while back... poor Fred... I miss him. -是的!我已经做到了!我创造了另一个红色史莱姆!我将称他为 Fred,是的,Fred……在不久前我在与 Shield 相关的事故中丢失的史莱姆之后……可怜的 Fred……我想念他。 -(Pg. 70 from Catherine Willows' journal): The underground jungle is a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through? -(Catherine Willows 杂志的第 70 页):地下丛林是一种奇怪的现象。尽管如此,从天花板的裂缝中倾泻而下的光线还是太稀少,无法维持植物的生命。然而,恢复女神,以其古老的智慧,决定保护这个地方。在她意识到我只是路过之前,我必须刺穿或烧掉多少她的树精? +Yes! I've done it! I have created another red slime! I shall call him Fred, yes, Fred. After the red slime I lost in a shield-related accident a while back... |Poor Fred... I miss him. +是的! 我已经做到了!我又创造了一种红色史莱姆!我会叫他弗雷德 ( Fred ) ,是的,弗雷德 ( Fred ) 。不久前,我在一次与盾牌相关的事故中失去了红色史莱姆之后……|可怜的弗雷德 ( Fred ) ……我想念他。 +(Pg. 70 from Catherine Willows' journal): The overgrown ruins are a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through? +( 凯瑟琳·韦罗斯 ( Catherine Willows ) 日记第 70 页 ) : ‎杂草丛生的遗迹是一种奇怪的现象。尽管如此,从天花板的裂缝中倾泻而下的光线还是太稀少,无法维持植物的生命。 然而,恢复女神,以其古老的智慧,决定保护这个地方。在她意识到我只是路过之前,我必须刺穿或烧掉多少她的树精? The unseen maid is the deadliest. 看不见的女仆是最致命的。 + + (The note is blank) -(注释为空白) +( 注释为空白 ) The note reads: Mmmmmmmph! Mmmm! MMMMMPH!!!!-- (The entire note is just gagged mumblings...) -纸条上写着:嗯嗯嗯!嗯! MMMMMPH !!!!-- (整张纸条只是被堵嘴的喃喃自语……) +纸条上写着 : ‎嗯嗯嗯!嗯! MMMMMPH !!!!-- ( 整张纸条只是被堵嘴的喃喃自语…… ) (The note is illegible) -(注释难以辨认) +( 注释难以辨认 ) (The note contains a map of a previous floor) -(笔记包含上一层的地图) +( 笔记包含上一层的地图 ) (The note is smeared with some kind of liquid) -(纸条上涂有某种液体) +( 纸条上涂有某种液体 ) (The note contains a cryptic riddle that makes no sense) -(该笔记包含一个没有意义的神秘谜语) +( 该笔记包含一个没有意义的神秘谜语 ) (The note contains a list of the writer's likes/dislikes and hard limits) -(注释包含作者的喜欢/不喜欢和硬限制的列表) +( 注释包含作者的喜欢/不喜欢和硬限制的列表 ) The note reads: Please take this beautiful doll somewhere and play with her~ -纸条上写着:请把这个漂亮的娃娃带到某个地方和她一起玩~ +纸条上写着 : ‎请把这个漂亮的娃娃带到某个地方和她一起玩~ (The note contains a manual on fencing. You have always been a terrible fencer) -(笔记中有一本关于击剑的手册。你一直是个糟糕的击剑手) +( 笔记中有一本关于击剑的手册。你一直是个糟糕的击剑手 ) (The note contains a magic spell you were taught never to cast under any circumstances) -(笔记包含一个你被教导在任何情况下都不要施放的魔法咒语) +( 笔记包含一个你被教导在任何情况下都不要施放的魔法咒语 ) + + The item requires 5 keys and free hands to remove 该项目需要 5 把钥匙和空闲的双手才能移除 The item is extremely secure with five separate keyholes. 该物品具有五个独立的钥匙孔,非常安全。 You insert your 5 keys into the lock and the item finally comes off. -您将 5 把钥匙插入锁中,物品最终脱落。 -The lock is protected by a revanent seal. You'll need 25 ectoplasm to disenchant it. -锁由 revanent 密封保护。你需要 25 个灵浆来打开它。 +你将 5 把钥匙插入锁中,物品最终脱落。 + + +### [RNAME] + +Magic-Draining: This item drains your mana quickly up to a limit, then slowly after. +耗魔诅咒 : ‎该物品会快速消耗你的法力直至一定上限,然后慢慢耗尽 + + +Curse of Tickling: This item is tickling you without end! +挠痒诅咒 : ‎这个物品会不停地挠你 +Curse of Punishment: Inflicts psychic damage when you attack or cast a spell. +惩罚诅咒 : ‎当你攻击或施展法术时对你造成灵能伤害 +Curse of Illumination: Produces light and makes you easier to see. +照明诅咒 : ‎产生光并让你更容易被敌人看到 +Curse of Attraction: Women find you irresistable. +吸引力诅咒 : ‎女人觉得你无法抗拒 +Curse of Animation: Causes loose restraints to animate and attack you! +活力诅咒 : ‎松动的束缚会活跃起来并攻击你 +Curse of Sensitivity: Makes it easier to lose control of yourself. +敏感诅咒 : ‎使人更容易失去对自己的控制 +Curse of Distraction: Multiplies DP gain by 1.5x. +性奋诅咒 : ‎将性奋值增益提高至1.5 倍 +Curse of Exhaustion: -25% Stamina regen cap. +疲劳诅咒 : 体力值上限-25%。 +Curse of Futility: Multiplies WP gain by 0.5x. +徒劳诅咒 : ‎将意志力增益降低至0.5 倍 +Curse of Submission: Gain submissiveness when you lose control of yourself... +屈服诅咒 : ‎你会在你失去对自己的控制时屈服...... +The curse is dormant, waiting for the time to strike... +诅咒正处于休眠状态,等待着降临的时刻…… +Your RESTRAINTNAME glows pink as you feel your mind attacked by hypnotic forces! +当你感觉自己的思想受到催眠力量攻击时,你的 RESTRAINTNAME 会发出粉红色的光芒! + + +The item is cursed! Several restraints appear on your body! +该物品被诅咒了!你的身上出现了数道束缚! +The item is cursed, but you are so trussed up you hear only sinister laughter... +该物品被诅咒了,但你被绑得太紧,只能听到邪恶的笑声...... + + +The item is sealed with an icy lock. Perhaps you can melt it somehow? +该物品被冰冷的锁封住。也许能以某种方式融化它? +The cursed seal flashes brightly as you struggle fruitlessly against it. +当你徒劳地反抗它时,被诅咒的封印会发出明亮的光芒。 +The item is sealed with a smoldering lock. Perhaps you just need to put out that fire... +该物品用阴燃的锁密封。也许你只需要把火给弄灭...... +The cursed seal glows faintly as you struggle fruitlessly against it. +当你徒劳地挣扎被诅咒的封印时,它会发出微弱的光芒。 +The item contains technological markings. Perhaps applying some electricity will affect it? +该物品包含科技标记。也许施加一些电会有所影响? +The cursed seal gives off sparks as you struggle fruitlessly against it. +当你与被诅咒的封印进行徒劳的挣扎时,它会发出火花。 +The item contains an alchemical seal. Perhaps Glue damage will overload it? +该物品包含一个炼金印章。也许胶体伤害会导致其过载? +The item stretches as you tug on it, but snaps back to its original place. +当你拉动该物品时,它会拉伸,但会弹回到原来的位置。 +The item is covered in markings of chains. Perhaps you need to take Chain damage? +该物品上覆盖着锁链标记。 也许你需要造成锁链伤害? +The item squeezes you tighter as you try to take it off. +当你试图将其脱下时,该物品将你挤压得更紧。 +The item is protected by holy magic. There is nothing you can do to it. +该物品受到神圣魔法的保护。你对此无能为力。 +You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? +你向女神祈祷,印记就会消失!也许你归还了本该属于她的东西? +This item bears the sigil of the Goddess of Restoration. Perhaps she can help? +该物品带有恢复女神的印记。也许她能帮忙? +The item is protected by a magical seal. There is nothing you can do to it. +该物品受到魔法封印的保护。你对此无能为力。 +This item bears the sigil of the Goddess of Conjuration. Perhaps she can help? +该物品带有咒术女神的印记。也许她能帮忙? +The item is protected by dark secrets. There is nothing you can do to it. +该物品受到神秘的黑暗保护。你对此无能为力。 +This item bears the sigil of the Goddess of Illusions. Perhaps she can help? +该物品带有幻术女神的印记。也许她能帮忙? +This item bears the sigil of the Goddess of Elements. Perhaps she can help? +该物品带有元素女神的印记。也许她能帮忙? +The item is protected by an elemental seal. There is nothing you can do to it. +该物品受到元素封印的保护。你对此无能为力。 +You hold the key to the item and it comes loose, draining the key's energy. +你拿着物品的钥匙,它松开了,但是钥匙的能量耗尽了。 +The item is incribed with mystical runes. Maybe you need a powerful key to unlock it. +该物品刻有神秘符文。也许你需要一把强大的钥匙来解锁它。 +The lock-shaped rune flashes as you realize struggling is pointless. +当你意识到挣扎毫无意义时,锁形符文就会闪烁。 + + +You overload the magical seal, causing it to vanish and release the item. +你使魔法封印过载,导致它消失并解开该物品。 +The item is magically sealed, requiring 200 mana to unlock it (includes mana from mana pool). +该物品被魔法封印,需要 200 点法力才能解锁 ( 包括法力池中的法力 ) 。 +You tug on the item, but the magic can't be broken with anything other than brute force. +你拉扯着物品,但除了蛮力之外,任何其他力量都无法打破魔法。 + + + + + + +The item is sealed with a locking spell! You will need a key to dispel the magic. +该物品已用锁定咒语密封!你需要一把钥匙来驱散魔法。 +You tug on the item but it is magically sealed to your body! +你拉扯该物品,但它神奇地密封在你的身体上! +You insert your magic key into the lock and the item finally comes off! +你将魔法钥匙插入锁中,物品终于脱落了! + + +The item is protected by a seal of Determination. You must have maximum willpower to remove it. +该物品受到决心封印的保护。你必须有最大的意志力才能将其删除。 +You are unable to muster the willpower to bypass the seal... +你无法鼓起意志力绕过封印…… +Feeling determined, you override the seal and release the item! +下定决心后,你破除了封印并解开了该物品! + + +The lock is protected by a revenant seal. You'll need 25 ectoplasm to disenchant it. +这把锁由永久性密封件保护。你需要 25 个灵浆来打开它。 Your fingers pass right through the collar. Pity your neck doesn't pass through it. 你的手指直接穿过项圈。可惜你的脖子不能穿过它。 You channel ghastly energy into the lock and break the seal!!! 你将可怕的能量引导到锁中并打破密封!!! + + +It would take many lifetimes to crack the code. You'll have to find another way to break the program... +破解密码需要好几辈子的时间。你必须找到另一种方法来破坏程序...... +You tug against the straps to no avail. +你用力拉动带子,但无济于事。 +One of your Doll IDs seems to have had corrupted data on it, causing the program to crash and unlock. +你的一个娃娃 ID 上的数据似乎已损坏,导致程序崩溃并锁定。 + + The item seems to drain divine energy from shrines. Maybe that has something to do with it. 该物品似乎从神殿中汲取了神圣能量。也许这与它有关。 The collar is enchanted with multiple layers of magical seals. 项圈附有多层魔法封印。 The collar has absorbed enough energy and pops off! 项圈吸收了足够的能量,然后打开! + + That item cant be used. 那个道具不能使用。 +You're not sure how to use this key. +你不确定如何使用这个钥匙。 +As soon as you touch the key, all of your gold locks fade to blue! +一旦你触摸钥匙,你所有的金锁就会褪成蓝色! + + You realize there is no keyhole on the device, simply a lock-shaped sigil. 你意识到装备上没有钥匙孔,只是一个锁形的印记。 The item loosens and falls off, but you see a red sigil flash and the key suddenly teleports away! 物品松动脱落,但你看到红色印记闪烁,钥匙突然消失不见了! You have in your possession KeyAmount magical, ornate key(s). You might as well try... -您拥有 KeyAmount 有魔力的、华丽的钥匙。你也许可以试试... +你拥有 KeyAmount 有魔力的、华丽的钥匙。你也许可以试试... You have KeyAmount key(s) for this item. -您有 KeyAmount 把钥匙对此物品使用。 +你有 KeyAmount 钥匙对此物品使用。 + + The angel helps you struggle and use items 天使帮你挣扎和使用物品 The ghost helps you struggle and use items -幽灵帮助你挣扎和使用物品 +幽灵会帮助你挣扎和使用物品 The ghost is unhelpful 幽灵不想帮你 + + Angel: Greetings! -天使:你好! +天使 : ‎你好! Angel: Perhaps I can assist with those! -天使:也许我可以帮上忙! +天使 : ‎也许我可以帮上忙! + + Adventurer's Ghost: Well met, traveler! -冒险者之魂:很高兴见到你,旅行者! +冒险家之魂 : ‎很高兴见到你,旅行者! Adventurer's Ghost: Hello again, traveler (giggles). -冒险者的灵魂:很高兴再次见面,旅行者(咯咯笑)。 +冒险家之魂 : ‎很高兴再次见面,旅行者 ( 咯咯笑 ) 。 Adventurer's Ghost: Having fun, girl? -冒险者的灵魂:玩得开心吗,姑娘? +冒险家之魂 : ‎玩得开心吗,姑娘? Adventurer's Ghost: Looking for some trouble, slave? -冒险者的灵魂:你是在给自己找麻烦吗,奴隶? +冒险家之魂 : ‎你是在给自己找麻烦吗,奴隶? Adventurer's Ghost: I see you, naughty little slave! -冒险者的灵魂:我看见你了,淘气的小奴隶! +冒险家之魂 : ‎我看见你了,淘气的小奴隶! + + Ghost: I can try to help with those, traveler. -幽灵:我可以尝试帮助解决这些问题,旅行者。 +幽灵 : ‎我可以尝试帮助解决这些问题,旅行者。 Ghost: Aww, you look like you're having fun... -幽灵:哦,你看起来很享受…… +幽灵 : ‎哦,你看起来很享受…… + + Ghost: You look great in those, hehe~ -幽灵:你现在这个样挺好的,嘿嘿~ +幽灵 : ‎你现在这个样挺好的,嘿嘿~ Ghost: Please don't bother me. -幽灵:请不要打扰我。 +幽灵 : ‎请不要打扰我。 Ghost: A good slave doesn't complain. -幽灵:一个优秀的奴隶不会抱怨。 +幽灵 : ‎一个优秀的奴隶不会抱怨。 + + Ghost: What's that? I don't understand. -幽灵:那是什么?我不明白。 +幽灵 : ‎那是什么?我不明白。 Ghost: Silence is golden. -幽灵:沉默是金。 +幽灵 : ‎沉默是金。 Ghost: A good slave doesn't speak until addressed. -幽灵:一个好的奴隶在被允许之前不会说话。 +幽灵 : ‎一个好的奴隶在被允许之前不会说话。 Ghost: Aww, so helpless~ -幽灵:哇哦,好无助~ +幽灵 : ‎哇哦,好无助~ Ghost: Trussed up like a good girl~ -幽灵:像个好姑娘一样被绑起来~ +幽灵 : ‎像个好姑娘一样被绑起来~ Ghost: You're going to stay that way for a good while. -幽灵:你将保持这种状态很长一段时间。 +幽灵 : ‎你将保持这种状态很长一段时间。 Ghost: I love watching you hop around, it's funny! -幽灵:我喜欢看你跳来跳去,这很有趣! +幽灵 : ‎我喜欢看你跳来跳去,这很有趣! Ghost: Just sit there like a good girl~ -幽灵:像个好女孩一样坐在那里,姑娘~ +幽灵 : ‎像个好女孩一样坐在那里,姑娘~ Ghost: I want to see you kneel~ -幽灵:我想看你跪下~ +幽灵 : ‎我想看你跪下~ Ghost: Aww, feeling frustrated? -幽灵:噢,沮丧了? +幽灵 : ‎噢,沮丧了? Ghost: Looks like someone's been naughty~ -幽灵:看来有人调皮了~ +幽灵 : ‎看来有人调皮了~ Ghost: How's it feel to be under lock and key? -幽灵:被锁住是什么感觉? +幽灵 : ‎被锁住是什么感觉? + + You step on a pressure plate and a number of skeletons rise up! 你踩到一个压力板上,许多骷髅站了起来! You are ambushed by bandits! 你被盗贼伏击了! Armed skeletons appear from passages in the walls! -武装的骷髅从墙上的通道中出现! +武装骷髅从墙上的通道中出现! +An armed skeleton drops down from the ceiling! +武装骷髅从天花板上掉了下来! A wall panel falls down, and an armored skeleton appears! -一块墙板倒下,出现了一个装甲骷髅! +一块墙板倒下,出现了一个武装骷髅! +You feel a chill down your spine... +你感到脊背发凉。。。 +You feel a constricting presence... +你感觉到一种压抑的存在。。。 +You feel a titillating presence... +你感觉到一种令人性奋的存在。。。 You are ambushed by ninjas! 你被忍者伏击了! A large, wriggling mess of ropes fall from the ceiling! 一大堆扭动的绳索从天花板上掉下来! +A rune of growth causes several plants to quickly sprout nearby. +一股生长的气息会使附近的几株植物迅速发芽。 You are ambushed by dragonhearts! 你被龙之心伏击了! -You are ambushed by dragonhearts! -你被龙之心伏击了! -A group of drones surround you! -一群无人机围绕着你! +A pack of drones descends from the ceiling! +一群无人机从天花板上飞了下来! +You hear sirens as a group of robots closes in! +当一群机器人逼近时,你会听到警报声! +You stumble upon a group of mages wanting to play dress-up! +你偶然发现一群法师想要玩装扮游戏! +You step on an open book, only to find a furious librarian staring you down! +你踩在一本打开的书上,却发现一位愤怒的图书管理员正盯着你! You are ambushed by wolfgirls! -你被狼女伏击了! +你被狼娘伏击了! You are ambushed by an alkahestor! 你被一个宗师炼金师伏击了! Small blobs of slime fall from the ceiling! -一小块史莱姆从天花板上掉下来! +一小块粘液团从天花板上掉下来! You are ambushed by slime researchers! -你被史莱姆研究人员伏击了! +你被粘液研究员伏击了! A large blob of slime falls from the ceiling! -一大块史莱姆从天花板上掉下来! +一大块粘液团从天花板上掉下来! In a puff of smoke, a group of fire elementals appear around you! -在一阵烟雾中,一群火元素出现在你身边! +在一阵烟雾中,一群火精灵出现在你身边! In a flash of fog a group of ice elementals appear around you! -在一阵迷雾中,一群冰元素出现在你周围! +在一阵迷雾中,一群冰精灵出现在你周围! In a burst of mist, a group of water elementals appear around you! -一阵雾气中,一群水元素出现在你身边! +在一阵雾气中,一群水精灵出现在你身边! A group of earth elementals rise out of the ground! -一群土元素从地里出现! -You hear pouring liquid and a group of latex elementals come out of the walls! -你听到倒出液体的声音,一群乳胶元素从墙上冒出来! +一群大地精灵从地里出现! +You hear pouring liquid and a group of rubber elementals come out of the walls! +你听到倒出液体的声音,一群橡胶精灵从墙上冒出来! In a flash of light, a group of air elementals appear around you! -光芒一闪,一群气元素出现在你身边! +光芒一闪,一群风精灵出现在你身边! Several ethereal hands appear all around you! 几只空灵的手出现在你身边! You have stumbled upon a conjurer's study! 你偶然发现了一个魔术师的研究! -You have stumbled upon a conjurer's study! -你偶然发现了一个魔术师的研究! -You are ambushed by a group of maids! -你被一群女仆埋伏了! -You are ambushed by a group of maids! -你被一群女仆埋伏了! You are ambushed by a group of maids! 你被一群女仆埋伏了! The Head Maid corners you! 女仆长把你逼入死角! A vine crawls from the ground, already wrapping around your feet! 一根藤蔓从地上爬了出来,已经缠住了你的脚! -You have broken a magic orb, gaining a Spell Point and angering a goddess. -你打破了一个魔法球,获得了一个法术点数并激怒了一位女神。 -You have broken a magic orb, gaining a random spell and angering a goddess. -你打破了一个魔法球,获得了一个随机法术并激怒了一位女神。 -Choose one. She will send her minions after you. -选择一位女神。她会派她的爪牙追击你。 + + +You find a magic orb, containing a Spell Point. However, a Goddess owns this artifact.. +你发现了一个宝珠,里面有一个技能点。然而,女神拥有这件神器。 +You find a magic orb, containing the SHCL spell 'SPLNME' and angering a goddess. +你发现了一个宝珠,里面有一个SHCL咒语“SPLNME”,激怒了一位女神。 +You find a magic orb, containing a random spell and angering a goddess. +你发现了一个宝珠,其中包含一个随机法术并激怒了一位女神。 +Should you break it, she will send her minions after you. Which Goddess will you anger? +如果你打破了它,她就会派出她的奴仆追杀你。你会激怒哪位女神呢? + + +An altar stands before you, bestowing a heavenly contract. +一座祭坛矗立在你面前,授予你一份神圣的契约。 +Do you choose to accept its terms? +你选择接受契约吗? + + +Are you sure? This choice is final. +你确定吗?选择后无法反悔。 + + +Yes, I will accept. +是的,我接受。 +(Accept the contract) +( 接受契约 ) +I'll think about it. +我得考虑一下。 + + You are frozen! 你被冻住了! You are chilled! 你感到寒冷! Shadowy tendrils wrap around your feet, rooting you in place!!! 阴暗的卷须缠绕在你的脚上,将你固定在原地!!! + + You get the feeling that someone is searching for you... 感觉有人在寻找你…… You hear movements all around as you realize you are surrounded!!! 你听到周围的动静,意识到你已经被包围了!!! + + There is another restraint underneath! -底下还有一种束缚具! +底下还有一种拘束具! + + +Your restraints rub you in sensitive places as you move... +你的束缚在你移动时摩擦到你敏感的地方…… + + Indifferent 漠不关心 Angered 恼怒 Enraged 暴怒 -Cursed -诅咒 Thankful 感谢 Pleased 愉快 -Blessed -祝福 -Interested -感兴趣 + + +Neutral +中立 Annoyed 恼怒 Hostile 敌对 -Wanted -通缉 -Favorable -喜欢 Friendly 友好 Allied 结盟 +Favorable +喜欢 + + You run up against the TETHER pulling you back. 你逃跑的同时 TETHER 在把你拉回来。 You are yanked back by the TETHER! 你被 TETHER 拉了回来! We will be going for a walk. Follow me. 我们要去散步。跟我来。 +Don't get comfortable. Im taking you to a new cell. Follow me. +不要太安逸。我带你去一个新牢房。跟我来。 +We're going to have some fun. Follow me. +我们要找点乐子。跟我来。 I told you to follow me! 我让你跟我来! I said, FOLLOW ME! @@ -6104,6 +12772,8 @@ I won't repeat myself 我不想再重复一遍 Then let's put you back in your cell! 那么你就滚回牢房里吧! + + I hope you learned your lesson. Now get your butt out of here. 我希望你吸取教训。现在滚出去。 You've been a good girl. I hope you don't make the same mistake again. You can leave. @@ -6111,7 +12781,9 @@ You've been a good girl. I hope you don't make the same mistake again. You can l That's a good girl. Now behave yourself, okay? You're free to go. 做得很好。现在规矩点,好吗?你可以走了。 Looks like you got yourself in a bind! (she pats your butt playfully) Go make the others happy! -看起来你绑的很好! (她开戏谑地拍拍你的屁股)去让别人开心吧! +看起来你绑的很好! ( 她开戏谑地拍拍你的屁股 ) 去让别人开心吧! + + Good girl. 好姑娘。 You'll be making others happy in no time. @@ -6124,6 +12796,14 @@ It seems your training is going well. 看来你的训练进行得很顺利。 Perhaps you are enjoying this, hehe. 也许你很享受这个,呵呵。 + + +You've been very good this walk. Here is your reward. +这次散步你表现得很好。这是你的奖励。 +The EnemyName gives you a ItemName +EnemyName 给你 ItemName + + The EnemyName starts adding a RestraintName! EnemyName 开始添加 RestraintName! You're missing part of your uniform. @@ -6133,99 +12813,133 @@ EnemyName 开始移除你的 RestraintName! The EnemyName starts to lock your RestraintName! EnemyName 开始给你的 RestraintName 上锁! The EnemyName locks your RestraintName with a LockType! -EnemyName 使用 LockType 锁上了您的 RestraintName! +EnemyName 使用 LockType 锁上了你的 RestraintName! I am going to change your restraints. Hold still! 我要更换你的拘束具。站好了! -Looks like somebody forgot to lock those~ -好像有人忘记给你上锁了~ +Just need to add a little security~ +只需要增加一点安全感即可~ + + +Got yourself in trouble, eh? +给自己惹上麻烦了,嗯? +Looks like you're shaping up to be a good girl~ +看来你是一个好女孩啊~ +Oh! Looks like I've made a mistake... +哦! 看来我犯了一个错误... +404 prisoner not found. Releasing tether. +404 囚犯未找到。释放系链。 + + +### A EnemyName approaches you in your cell. + +A EnemyName appears to check on you. +EnemyName 出现来检查你。 +The EnemyName leaves and locks the cell behind her. +EnemyName 离开并锁上了她身后的牢房。 + + Layered underneath: -下方隐藏的拘束具: +下方隐藏的拘束具 : ‎ +Layered with: +隐藏的拘束具 : ‎ Increased strictness due to: -由于以下装备增加了挣扎难度: +由于以下束具增加了挣扎难度 : ‎ + + Mana -魔力 +法力 Bondage 束缚 Ask for Aid 请求帮助 Become a Champion -成为卫士 +成为冠军 Ask 问 Ask for Rescue 寻求救援 -Offer -提供 Offer Penance 忏悔 Current Champion -现任卫士 +现任冠军 Switch Champion -切换卫士 -Become the champion of this goddess. Capturing bound enemies will restore 3 mana per enemy and grant +1 rep. -成为这位女神的卫士。每捕获一位捆绑住的敌人将为恢复 3 点法力值并获得 +1 声望。 +切换冠军 + + +Become the champion of this goddess. Capturing bound enemies will grant +1 rep. +成为这位女神的冠军。捕获被束缚的敌人将获得 +1 声望。 You are now the champion of the Goddess of GODDESS. -你现在是 GODDESS 女神的卫士。 +你现在是 GODDESS 女神的冠军。 + + For 3 rep the goddess will grant you slipperiness, boosting your struggling. -消耗 3 声望,女神将促进您的挣扎。 +消耗 3 点声望,女神赐予祝福助力你的挣扎。 For 3 rep the goddess will grant you a key. -消耗 3 声望,女神授予你一把钥匙。 -For 3 rep the goddess will grant you -消耗 3 声望,女神将授予你 -For 3 rep the goddess -消耗 3 声望,女神 -For 3 rep the goddess -消耗 3 声望,女神 -For 3 rep the goddess -消耗 3 声望,女神 +消耗 3 点声望,女神赐予你一把钥匙。 +For 3 rep the goddess will grant you +消耗 3 点声望,女神将赐予你 For 3 rep the goddess -消耗 3 声望,女神 -undefined -未定义的 +消耗 3 点声望 +For 3 rep the goddess +消耗 3 点声望 + + The goddess will fully restore your mana in exchange for AMOUNT rep -女神会以 AMOUNT 点声望为代价完全恢复你的魔力 +女神会以 AMOUNT 点声望为代价完全恢复你的法力 The goddess will enjoy seeing you struggle in her bonds (raises submissiveness) -女神很享受你在她的束缚中挣扎的过程(提高顺从度) +女神很享受你在她的束缚中挣扎的过程 ( 提高顺从度 ) + + The Goddess may decide to send an angel to help you struggle, in exchange for 10 rep 女神可能会以10点声望为代价决定派一个天使来帮助你挣扎 + + The Goddess will expect you to pay AMOUNT gold for +5 rep 女神会期望你为 +5 声望支付 AMOUNT 金币 + + The Goddess hears your plea! 女神听到你的请求了! The Goddess hears your plea but has decided not to care. 女神听到了你的请求,但决定不理会。 The Goddess fills your mind with heavenly images as she channels energy through your veins. 当女神通过你的血管引导能量时,她会用天堂般的画面填满你的脑海。 + + Time stops as an angel of heaven appears to collect your payment. -时间停止了,天堂的天使出现来收取您的款项。 +时间停止了,天堂的天使出现来收取你的款项。 + + You shudder and tremble as a wave of pleasure washes over you! 当一阵快感冲刷在你身上时,你不寒而栗! You lose control of yourself as you convulse in pleasurable bliss! -当您在愉悦的幸福中抽搐时,您失去了对自己的控制! +当你在愉悦的幸福中抽搐时,你失去了对自己的控制! You let out a moan as you feel the ecstasy of pleasure! 当你感受到快感时,你发出了一声呻吟! You finally let out a deep breath as you get what you've waited for! 当你得到你一直在等待的东西时,你终于深吸了一口气! Your whole body thrashes about as you experience long-awaited pleasure! -当您体验到期待已久的快感时,您的整个身体都在颤抖! +当你体验到期待已久的快感时,你的整个身体都在颤抖! Your release comes with a bang as your body rocks back and forth! 当你的身体前后摇晃时,你的释放伴随着一声巨响! You wiggle your hips in ecstasy as you experience pure bliss! -当您体验纯粹的幸福时,您会在狂喜中扭动臀部! +当你体验纯粹的幸福时,你会在狂喜中扭动臀部! You are left gasping for air as you receive your long-awaited orgasm! -当您获得期待已久的高潮时,您几乎喘不过气来! +当你获得期待已久的高潮时,你几乎喘不过气来! You finally are left rocking your body wildly in sheer pleasure! 你终于在纯粹的快乐中疯狂地摇晃着你的身体! A powerful wave of pleasure comes over you as you convulse in ecstasy. 当你在快乐中抽搐时,一股强大的快感涌向你。 Your breathing intensifies as you lose control of yourself! 当你失去对自己的控制时,你的呼吸会变得更加强烈! + + You close your eyes and breath rapidly in anticipation... 你闭上眼睛,急切地呼吸着期待…… You tilt your head back and moan as your heart beats faster... 当你的心跳加快时,你将头向后仰并呻吟…… You groan with pleasure as you approach the edge... -当你接近边缘时,你高兴地呻吟着…… +当你接近高潮时,你兴奋地呻吟着…… You whimper as you rub your legs together furiously... 当你愤怒地摩擦双腿时,你呜咽着…… You feel frustrated as the stimulation isn't quite enough... @@ -6233,15 +12947,17 @@ You feel frustrated as the stimulation isn't quite enough... Your whole body shakes, but you don't quite go over the edge... 你的整个身体都在颤抖,但你完全没有达到高潮...... This is starting to feel like torture... -这开始感觉像是折磨…… +这开始让人感觉像是一种折磨…… You let out a frustrated scream as the torment continues... 随着折磨的继续,你发出了一声沮丧的尖叫…… You simmer just under the edge, heart racing, breathing quickly... -你在边缘沸腾,心跳加速,呼吸急促...... +你即将在高潮中爆发,心跳加速,呼吸急促...... You let out an anguished moan as release dances just out of reach... -你发出一声痛苦的呻吟,释放的舞蹈就在你够不着的地方…… +你发出一声痛苦的呻吟,高潮之舞遥不可及…… You squirm helplessly as your futile struggles simply arouse you more... -你无助地蠕动,因为你徒劳的挣扎只会让你更加兴奋...... +你无助地蠕动,因为你徒劳的挣扎只会让你更加性奋...... + + The vibration suddenly weakens. 震动突然减弱。 Your toys cease vibrating abruptly. @@ -6251,7 +12967,7 @@ The vibrators cut off suddenly, leaving you wanting. The toys turn off at the last moment, cutting you off. 玩具在最后一刻关闭,中断了你的高潮。 The toys leave you without pleasure as they turn off. -当它们关闭时,这些玩具让您感到不愉快。 +这些玩具关掉后,你就没有乐趣了。 You are left feeling empty as the toys stop vibrating. 当玩具停止振动时,你感到空虚。 You stomp your foot on the ground in frustration as the vibration ceases. @@ -6264,6 +12980,8 @@ The toys stop just before you lose yourself. 玩具在你迷失之前停止。 The toys deny you a chance to finish. 玩具剥夺了你高潮的机会。 + + You try to pleasure yourself, but your chastity belt prevents you! 你试图取悦自己,但你的贞操带阻止了你! You play with yourself... @@ -6274,134 +12992,192 @@ You squirm your hips and whimper in your bindings... 你扭动你的臀部,在你的束缚中呜咽…… Your instincts are getting the better of you... 你的本能逐渐侵蚀着你的理智... -Your body moves of its own accord... -你的身体不由自主地移动…… +Your body shudders briefly from pleasure... +你的身体因快感而短暂颤抖…… +You are unable to control yourself. +你无法控制自己。 You play with yourself using the magic wand... 你用魔杖自慰…… You would never do such a thing. 你永远不会做这样的事情。 You try to rub your erogenous zones by squirming your legs... -你试图通过蠕动你的腿来摩擦你的敏感带...... +你试图通过蠕动你的腿来摩擦你的敏感带…… Your will is draining as you crave release, but can't quite get there without help... -当你渴望释放时,你的意志正在枯竭,但没有帮助就无法完全实现。。。 +当你渴望释放时,你的意志正在枯竭,但没有帮助就无法完全实现…… +Your will is draining as your heart beats faster and your body trembles... +你的意志在耗尽,你的心跳加速,身体颤抖…… +Your will is draining as you simmer just under the edge... +当你在高潮边缘酝酿时,你的意志正在耗尽...... Your will is draining as you crave release, and the toys continue to vibrate... -当你渴望释放时,你的意志正在枯竭,玩具继续振动。。。 +当你渴望释放时,你的意志正在枯竭,玩具继续振动…… +Your will is draining as the toys continue buzzing... +当玩具继续嗡嗡作响时,你的意志正在耗尽...... +Your will is draining as you are tormented by vibrations... +当你受到振动的折磨时,你的意志正在耗尽...... + + A buzzing vibration wakes you up! -嗡嗡的振动将您唤醒! +嗡嗡的振动将你唤醒! + + +Your RestraintName constricts, warning you not to misbehave! +你的 RestraintName 收紧,警告你不要行为不端! +Your RestraintName tightens painfully to punish your misbehavior! +你的 RestraintName 痛苦地收紧以惩罚你的不当行为! Your RestraintName punishes you for your behavior! 你的 RestraintName 因为你的行为而惩罚你! Your RestraintName punishes you and warns you with a harsh beep! -您的 RestraintName 惩罚你并用刺耳的哔哔声警告您! +你的 RestraintName 惩罚你并用刺耳的哔哔声警告你! +Your RestraintName emits a red flash, causing you to feel faint! +你的 RestraintName 发出红色闪光,让你感到晕眩! +Your armor makes noise as you move around! +当你四处走动时,你的盔甲会发出噪音! Your RestraintName lets out an alert! -您的 RestraintName 发出警报! +你的 RestraintName 发出警报! + + +Your RestraintName stimulates you to hinder your efforts! +你的 RestraintName 会刺激你以阻碍你的努力! +Your RestraintName stimulates you and beeps loudly! +你的 RestraintName 会刺激你并发出大声的哔哔声! + + A golden lock fades into a blue lock on one of your restraints! 金色锁在你的一个拘束具上逐渐变成蓝色锁! -Your command word is heard and the purple lock(s) click and fall off! -听到您的命令咒语,紫色锁扣咔哒一声脱落! +Your command word is heard and the magic lock(s) click and fall off! +听到你的命令咒语,魔法锁扣咔哒一声脱落! +Your command word is heard and the charger unlocks! +听到你的命令咒语,充电器解锁! + + Are you sure you want to attack? 你确定要攻击吗? Are you sure you want to go to the next level? (Click self to confirm) -您确定要进入下一层吗? (点击自己确认) +你确定要进入下一层吗? ( 点击自己确认 ) + + You shudder as you apply the RestraintName to yourself... 当你给自己装备 RestraintName 时,你不寒而栗…… You insert the RestraintName and close your belt's shield over it, with a click as it locks in place. -你将 RestraintName 插入并在其上关闭您的贞操带的防护,听到它锁定到位时发出咔嚓一声。 +你将 RestraintName 插入并将你的贞操带的护罩合上,它锁定到位时发出咔哒一声。 You attack the RestraintName and close your bra's shield over it, with a click as it locks in place. -你放入 RestraintName 并关闭你的胸罩护罩,当它锁定到位时发出咔嚓一声。 +你放入 RestraintName 并合上你的胸罩护罩,它锁定到位时发出咔哒一声。 You slowly put on the RestraintName, amazed at how it seems to mold to your size... 你慢慢穿上 RestraintName,惊讶于它似乎是如何适应你的体型的…… + + + + You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! 你的挣扎毫无作用。它没有钥匙孔,而且材料几乎牢不可破! + + Ancient Chastity Belt -上古贞操带 +远古贞操带 You find a chastity belt, glowing magnificently, along with a strange crystal next to it. 你发现了一条贞操带,闪闪发光,旁边还有一块奇怪的水晶。 A chastity belt of sleek, ancient design. While powered, it gives -30% miscast chance due to distraction and slowly regenerates stamina. -古老而简约的贞操带。充能时,基于干扰值,它会降低 30% 的施法失败几率,并缓慢恢复体力。 +古老而简约的贞操带。充能时,基于性奋值,它会降低 30% 的施法失败几率,并缓慢恢复体力。 'Belt of the devoted' -'忠诚的腰带' +'忠诚的贞操带' You tug at your chastity belt, but you can't even stick a finger inside because it's so tight... 你拉扯着你的贞操带,但你连一根手指都插不进去,因为它太紧了…… + + Ancient Chastity Bra 远古贞操文胸 You find a chastity bra, glowing magnificently, along with a strange crystal next to it. 你会发现一件贞操文胸,闪闪发光,旁边还有一个奇怪的水晶。 -A chastity bra of sleek, ancient design. While powered, it reduces incoming damage by 1. -古老而简约的贞操文胸。充能时,它会减少 1 点受到的伤害。 +A chastity bra of sleek, ancient design. While powered, it reduces incoming damage from attacks by 20. +设计时尚、古老的贞操胸罩。充能后,它能减少受到 20 的攻击伤害。 'Shield of the chaste' '贞洁之盾' You rub your hands along your breasts but feel only hard, unbreakable metal. 你用手抚摸着你的乳房,但只感觉到坚硬、牢不可破的金属。 + + Ancient Heels 远古高跟鞋 You find a set of glowing heels, glowing magnificently, along with a strange crystal next to it. 你发现一双发光的高跟鞋,闪闪发光,旁边还有一个奇怪的水晶。 A pair of towering heels, enchanted with combat magic. When powered, they reduce slow level by 1, and deal 25 shadow damage on-hit with brief slow. -一双高耸的高跟鞋,刻满了战斗魔法。充能后,它们会降低 1 级减速等级,并在击中时造成 25 点暗影伤害并带有短暂减速。 +一双高耸的高跟鞋,刻满了战斗魔法。充能后,它们会降低 1 级减速等级,并在命中时造成 25 点暗影伤害并带有短暂减速。 'Shoes of the graceful' '优雅之鞋' You can barely stand in these heels. They are rigid, metallic, and unbreakable, yet padded on the inside. -你几乎不能穿着这些高跟鞋站立。它们是刚性的、金属的、牢不可破的,但内部有衬垫。 +穿着这双高跟鞋你都站不稳了。它们牢不可破,由坚硬金属打造,但内部有衬垫。 + + Ancient Blindfold 远古眼罩 -You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. -你是一个带衬垫的金属眼罩,闪闪发光,旁边还有一个奇怪的水晶。 +You find a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. +你发现一个带衬垫的金属眼罩,闪闪发光,旁边还有一个奇怪的水晶。 A full-blackout mask. When powered, it negates accuracy penalties due to vision, boosts accuracy by +100%, and boosts melee damage by +10. -完全遮光的面具。充能后,它可以消除视觉造成的准确度损失,将准确度提高 +100%,并将近战伤害提高 +10。 +完全遮光的面具。充能后,它可以消除视觉造成的命中率损失,将命中率提高 +100%,并将近战伤害提高 +10。 'Mask of the Warrior' -《战士的面具》 +《战士的面罩》 You tug at the mask but it won't come off. It's molded so close to your face that no light shines through! -你拉扯面具,但它不会脱落。它的模制非常贴近您的脸,没有光线透过! +你用力拉面具,但它就是取不下来。它被塑造得离你的脸很近,没有光线照进来! + + Ancient Muzzle 远古口套 You find a muzzle with a long rubbery plug on the inside, glowing magnificently, along with a strange crystal next to it. -你会发现一个口套,里面有一个长长的橡胶塞子,发出华丽的光芒,旁边还有一个奇怪的水晶。 +你发现里面有一个长长的橡胶棒,闪闪发光,旁边还有一个奇怪的水晶。 A muzzle that seals over the face tightly. When powered, it regenerates mana, boosts sneak, and multiplies damage dealt to unaware enemies by 2.5x. -一个紧紧地盖在脸上的口套。充能后,它会恢复法力值,提高潜行能力,并对失去意识的敌人造成的伤害增加 2.5 倍。 +一个紧紧地盖在脸上的口套。充能后,它会恢复法力值,提高潜行能力,并对失去意识的敌人造成的伤害提升至 2.5 倍。 'Muzzle of the Saboteur' '破坏者的口套' You claw at your face, but not only does the soft plug fill your mouth completely, the muzzle itself is nigh-unbreakable! 你抓着自己的脸,但软塞不仅完全填满了你的嘴,而且口套本身几乎牢不可破! + + Ancient Gag 远古口塞 You find a ball gag harness with a long rubbery plug instead of a ball, glowing magnificently, along with a strange crystal next to it. -你会发现一个带有长橡胶塞而不是球的口塞,它发出华丽的光芒,旁边还有一个奇怪的水晶。 +你会发现一个带有长橡胶棒而不是球的口塞,它发出华丽的光芒,旁边还有一个奇怪的水晶。 A gag that fills the mouth. When powered, regens mana, reduces miscast by 30%, and boosts damage to enemies that are stunned, frozen, bound, or slowed by 30%. 塞满嘴巴的堵嘴。充能后,恢复法力,减少 30% 的施法失败几率,并使对被击晕、冰冻、束缚或减速的敌人造成的伤害提高 30%。 'Gag of the Focused' '专注的口塞' You tug on the straps at your cheeks, but the straps are so tight the plug doesn't even move! -你拉着脸颊上的带子,但带子太紧了,口塞甚至一动不动! +你拉扯着脸颊上的口塞束带,但束带太紧了,口塞甚至一动不动! + + Ancient Rear Plug 远古肛塞 You find a huge, flexible, segmented plug, along with a strange crystal next to it. 你会发现一个巨大的、灵活的、分段的肛塞,旁边还有一个奇怪的水晶。 A plug that shocks the wearer when someone disciplines them, after orgasm, and mildly when spellcasting. When powered, reduces miscast chance by 30%. -当有人鞭笞使用者,在性高潮之后,以及在施法时温和地电击使用者。充能后,减少 30% 的施法失败几率。 +当受到鞭打,正在性高潮,以及在施法时肛塞会释放电击。充能后,减少 30% 的施法失败几率。 'Plug of the Obedient' '顺从者的肛塞' You realize the magical plug has expanded inside your body. It won't come out. 你意识到神奇的塞子已经在你体内膨胀了。它拔不出来。 + + Ancient Plug -远古假阳具 +远古塞子 You find a huge, ribbed plug, along with a strange crystal next to it. 你会发现一个巨大的有棱纹的假阳具,旁边还有一个奇怪的水晶。 A plug that denies the wearer constantly and only rarely grants release. When powered, it grants +70% magic resistance (about 40% reduction). -一个不断拒绝使用者高潮并且很少允许释放的塞子。充能后,它提供 +70% 魔法抗性(约 40% 减少)。 +一个不断拒绝使用者高潮并且很少允许释放的塞子。充能后,它提供 +70% 魔法抗性 ( 减少约 40% ) 。 'Plug of the Perseverant' -'坚毅者的假阳具' -You realize the magical plug has expanded inside your body. It won't come out. -你意识到充满魔力的阳具已经在你体内膨胀了。它不会出来。 +'坚毅者的塞子' + + Ancient Stimulator 远古刺激器 You find a flat, round device with a hole on one side, along with a strange crystal next to it. 你会发现一个扁平的圆形装置,一侧有一个洞,旁边还有一个奇怪的水晶。 A device that teases the wearer for casting spells and attacking. When powered, it reduces mana and stamina costs for casting spells and attacking. -在穿戴者攻击或者施法时会挑弄使用者。充能后,它会降低施法和攻击的法力和体力消耗。 +在穿戴者攻击或者施法时会挑弄使用者。充能后,它会降低施法法力消耗和攻击体力消耗。 'The Persuader' '说服者' You realize the magical device has attached to your body using suction. It won't come off! 你意识到魔法装置已经通过吸力附着在你的乳头上。它不会脱落! + + Ancient Mittens 远古手套 You find a pair of shining gloves, glowing magnificently, along with a strange crystal next to it. @@ -6412,68 +13188,84 @@ Tight mittens that force the hands into fists. When powered, they increase all m '爆破手套' You rub your mittens together, but they are unfazed by anything you do to them and your hands are clasped tight. 你反复揉搓手套,但它们对你对它们做的任何事情都没有反应,你的手紧紧地握着。 + + Ancient Armbinder -远古束手套 +远古单手套 You find a monoglove, glowing magnificently, along with a strange crystal next to it. 你会发现一只单手套,闪闪发光,旁边还有一块奇怪的水晶。 An extremely strict armbinder. When powered, reduces miscast chance by 30%, increases all magic damage to enemies by 40%, and increases spell range by 50%. -一个极其严格的束手套。充能后,施法错误率降低30%,对敌人的所有魔法伤害提高40%,施法距离提高50%。 +一个极其严厉的单手套。充能后,施法失误率降低30%,对敌人的所有魔法伤害提高40%,施法距离提高50%。 'Armbinder of the Artillerist' -'炮手的束手套' +'炮手的单手套' You try to wiggle your arms, but they can barely move in this position and are clasped tight. Your arms are sealed. 你试图摆动你的手臂,但在这个位置上它们几乎不能移动并且被紧紧地抓住。你的手臂被封住了。 + + Ancient Ankle Cuffs 远古脚铐 You find a pair of glowing cuffs, glowing magnificently, along with a strange crystal next to it. -你会发现一对发光的脚铐,闪闪发光,旁边还有一个奇怪的水晶。 -A pair of cuffs designed for summoners. Heals nearby summons by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power. -一对为召唤师设计的手铐。每回合为附近的召唤物治疗 15 点,并使你的闪避提高 50%(至 2/3 次)。充能时会变成脚镣,无充能时则会连起来。 +你发现一对发光的脚铐,闪闪发光,旁边还有一个奇怪的水晶。 +A pair of cuffs designed for summoners. Heals nearby allies by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power. +一对为召唤师设计的脚铐。每回合为附近的盟友治疗 15 点,并使你的闪避提高 50% ( 至 2/3 次 ) 。充能时会变成脚镣,无充能时则会连起来。 'Anklets of the Faithful Friend' '忠实朋友的脚链' You jingle the chains around and realize that these unbreakable restraints won't be coming off. -你叮当晃动锁链,并意识到这些牢不可破的束缚不会脱落。 -Ancient Ankle Cuffs -远古脚铐 +你把锁链弄的叮当作响,意识到这些牢不可破的束缚是不会解开的。 ...when powered down, they snap together, rendering the wearer immobile. ...无充能时脚镣会连起来,阻碍行动。 'Anklets of the Unfaithful Friend' '不忠朋友的脚链' -You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! -你徒劳地挣扎。没有钥匙孔,材料几乎牢不可破! + + + + You search for your ancient keys but it seems they were taken away for good. 你寻找你的古老钥匙,但似乎它们被永远拿走了。 -Random (reduces penalty by 1) -随机(减少 1 点惩罚) + + +Random (-10% rep loss) +随机 ( -10% 代表损失 ) + + You don't have any valid targets on your body for that. 你身上没有任何有效的目标。 + + The air swirls with traces of pleasing magic... 空气中弥漫着令人愉悦的魔法痕迹…… The spores make you feel sleepy... 孢子让你感到疲劳... + + +Physical Block: AMOUNT +物理抵抗 : ‎AMOUNT +Magic Block: AMOUNT +魔法抵抗 : ‎AMOUNT + + DAMAGETYPE: MULTIPLIERx modifier -DAMAGETYPE:MULTIPLIERx 修正 -Base Physical Armor: AMOUNT -基础物理装甲:AMOUNT -Base Magic Armor: AMOUNT -基础魔术装甲:AMOUNT -Base Evasion: AMOUNT% -基础逃避:AMOUNT% -Deals DAMAGETYPE damage -造成 DAMAGETYPE 的伤害 -Armor: AMOUNT -护甲:AMOUNT -Base Chance to Hit: AMOUNT% -基础命中率:AMOUNT% +DAMAGETYPE : ‎MULTIPLIERx 修正 +Physical Armor: AMOUNT +物理护甲 : ‎AMOUNT +Magic Armor: AMOUNT +魔法护甲 : ‎AMOUNT +Evasion: AMOUNT% +逃避 : ‎AMOUNT% Deals DAMAGETYPE damage 造成 DAMAGETYPE 伤害 +AMNT% chance to hit you +AMNT% 的概率击中你 Can disarm (chance: DISARMCHANCE%) -可以解除武装(概率:DISARMCHANCE%) +可以解下 ( 概率 : ‎DISARMCHANCE% ) Resistances: -抵抗: -HP: -生命值: -Binding: -捆绑: +抗性 : ‎ +HP: +生命值 : ‎ +### Shield: + +Binding: +束缚值 : ‎ Ambivalent 矛盾 Likes you @@ -6494,88 +13286,142 @@ Aware of you! 发现你了! Pursuing you! 正在追击你! -Slightly suspicious -感到有点可疑 -Saw something... -看到一些可疑迹象... +Ignoring you! +无视你! +Investigating! +调查中! +Suspicious +可疑 Notices you! 注意到你了! Unaware 没发现你 Items carried: -携带的物品: +携带的物品 : ‎ +Items worn: +穿戴的物品: ...and NUMBER more ...还有 NUMBER 个 -Disappears if the caster is stunned -如果敌人受到惊吓,就会消失 +Takes damage if the caster is stunned +如果施法者被击晕,则会受到伤害 Disappears if the caster is defeated 如果敌人被击溃,就会消失 Caster: ENEMYNAME 敌人: ENEMYNAME -Demise immanent -灭亡 -Shadow -暗影 -Ice -寒冰 -Fire -火焰 +Demise imminent +即将灭亡 + + +Vulnerable +虚弱 +Stunned +痴呆 +Snared +受困 +Silenced +沉默 +Disarmed +缴械 +Blinded +致盲 +Apprehended! +被捕! +Restrained! +受缚! +Restricted! +束缚! +Fully Bound! +完全束缚! +Trussed up! +捆起来了! +Tightly Secured! +严密保护! +Inescapably +无法避免 +Belted +束带 +Wearing a toy +戴着玩具 +Vibed! +震动中! +Flying +飞行中 +Distracted! +性奋! + + +Soap +皂化 +Acid +酸蚀 +Holy +神圣 +Arcane +奥术 Poison -毒物 +毒素 +Poison Gas +剧毒气体 Charm -绷带 +魅惑 Tickle 挠痒 Grope 抚摸 Crush 碾压 +Gravity +重力 Pierce 刺穿 Slash 劈砍 Pain 疼痛 -Soul -灵魂 -Mana Drain -法力流失 +Spirit Draining +精神汲取 +Mana Draining +法力消耗 Electric -电 -Stun -眩晕 -Binding -捆绑 -Lust -情欲 -Glue -胶水 -Unarmed -徒手 -Melee -近战 -Magic -魔法 +电击 +### E-Stim + +Shock +震撼 +Plush +绒织 +Blast +爆炸 +Chain +锁链 +Gas +气体 +Physical +物理 +Spell +咒语 Unstoppable 势不可挡 Unflinching 坚定不移 -You found a heart amulet! Choose one of the following stats to improve: -你找到了心形护身符!选择以下统计数据之一进行改进: -Distraction: Increases max distraction by +12 and decay by 0.05/turn. -干扰值:最大干扰值+12,以及衰减0.05/回合。 -Stamina: Increases max stamina by +6. -耐力:最大体力+6。 -Mana: Increases max mana by +12. -法力:最大法力+12。 -+12 Max Distraction -+12 最大干扰值 -+6 Max Stamina -+6 最大耐力 -+12 Max Mana -+12 最大法力 -The enemy is vulnerable and takes an extra AMOUNT damage! -敌人很脆弱,会受到额外的 AMOUNT 伤害! + + ++Focus ++专注 ++Stamina ++体力 ++Willpower ++意志 ++Magic ++魔法 +Discard (destroys it permanently!) +丢弃 ( 永久销毁它! ) + + +You crit the vulnerable EnemyName for AMOUNT extra damage! +你暴击了脆弱的 EnemyName 造成了 AMOUNT 点额外伤害! +You crit the unsuspecting EnemyName for AMOUNT extra damage! +你暴击了毫无戒心的 EnemyName 造成了额外的 AMOUNT 点伤害! The enemy steals a pick from you! 敌人从你那里偷了一个撬锁工具! The enemy takes away your knife! @@ -6583,7 +13429,7 @@ The enemy takes away your knife! The enemy steals a key from your body! 敌人从你身上偷走了一把钥匙! The enemy wrests away your magical knife! -敌人夺走了你的魔力刀! +敌人夺走了你的魔法刀! The enemy takes away your precious magic key! 敌人夺走了你宝贵的魔法钥匙! The enemy steals one ITEMSTOLEN from you! @@ -6592,110 +13438,594 @@ You get your stolen items back. 你拿回你被盗的物品。 The EnemyName manages to retreat with your items! EnemyName 设法带着你的物品撤退! + + The orb contains knowledge of SPELL. -该水晶包含 SPELL 的知识。 -You capture the EnemyName. You can become a champion in the Reputation screen. -你捕获了 EnemyName。您可以在声望界面成为卫士。 +该宝珠包含 SPELL 的知识。 You capture the EnemyName. 你捕获了 EnemyName。 You capture the EnemyName in the name of the goddess of GODDESS. 你以 GODDESS 女神的名义捕获了 EnemyName。 You capture the EnemyName, but the goddess of GODDESS would prefer that you be in uniform (wear her restraint). -你俘获了 EnemyName,但 GODDESS 的女神更喜欢你穿制服(穿上她的拘束具)。 +你俘获了 EnemyName,但 GODDESS 的女神更喜欢你穿制服 ( 穿上她的拘束具 ) 。 You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! 你俘获了 EnemyName,但 GODDESS 的女神要求你戴上几个束缚! You capture the EnemyName, but the goddess of GODDESS would prefer that you wear some restraints. 你俘获了 EnemyName,但 GODDESS 的女神更希望你戴上一些束缚。 -You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! -你俘获了 EnemyName,但 GODDESS 的女神要求你戴上几个束缚! You capture the EnemyName, but have reached the limit for rewards this floor. -您捕获了敌人,但已达到本层奖励的上限。 +你捕获了敌人,但已达到本层奖励的上限。 + + The spirit inside the restraint is vengeful and emerges to wreak havoc on the world! 禁锢内的灵魂是报复性的,并出现对世界造成严重破坏! + + You hide inside the container... 你躲在容器里... +You hide inside the chest... +你躲在箱子里... It's a crumpled piece of scrap metal with a sharp edge. -这是一块皱巴巴的废金属,但是边缘很锋利。 +这是一块扭曲的废金属,但是边缘很锋利。 You use the scrap to try and cut the item. 你试着用废料切割物品。 You rub the item against the broken object's sharp edges... 你把物品擦在破碎物体的锋利边缘上。。。 A hook hangs at shoulder height. -一个钩子挂在肩上。 -You can't reach that with the hook! -你用钩子够不到的! +一个钩子挂在肩高处。 +The hook is too high up! You can't reach it... +钩子太高了!你够不到它... There's a hook on the wall. 墙上有个钩子。 The wall is cracked. 墙裂了。 +You rub yourself on the corner... +你在角落里摩擦自己…… + + Many ropes emerge around you, removing weaker ropes from your body and binding enemies! 许多绳索出现在你周围,从你的身体上移除较弱的绳索并束缚敌人! -Distracted -干扰 + + +Choose Class: +选择类别 : ‎ + + +Distraction Mode: +性奋模式 : ‎ + + +Progression Mode: +进展模式 : ‎ +Key Hunt +寻找钥匙 +Random +随机 +Selected +选择 +You will need to find the key to proceed to the next floor. +你需要找到钥匙才能进入下一层。 +Each floor will have a random task to unlock the stairs. +每个楼层都会有一个随机任务,你需要完成它才能进入下一层。 +You will select your task for each floor before you enter. Requires Perk Progression. +在进入之前,你可以自行选择楼层的任务。需要技能: 进度。 + + +Perks Mode: +技能模式 : ‎ +Extra +更多 +Less +较少 +Much Less +非常少 +No pain, no gain. +一分耕耘,一分收获 +Gain 20 extra perk points, to give you a false sense of security. +获得 20 项额外点数,给你一种虚假的安全感 +Lose 20 perk points, just to keep things interesting. +失去 20个点数,只是为了增加趣味性 +Lose 50 perk points, making things very interesting. +失去 50个点数,让事情变得更有趣点吧 + + +Perk Progression Mode: +技能进展模式 : ‎ +Disabled +关闭 +Optional +随意 +Mandatory +强制 +Debuffs Only +仅减益效果 +No perks between floors. +楼层中没有技能 +The standard mode. You may choose between one of three perk altars between floors. +标准模式,你可以在楼层之间的三个技能神泉中选择一个 +A twist on the standard mode. You must choose before progressing. +标准模式的一个变型,在前往下一层之前必须选择一个 +You must pick a debuff between floors before progressing. +在前往下一层之前,必须在楼层之间选择一个减益效果 + + +Perk Shrine Bondage: +技能神泉束缚 : ‎ +Never +永不 +Sometimes +偶尔 +Always +总是 +Perk shrines will not offer bondage as part of the deal. +技能神泉不会提供束缚 +Bondage will sometimes be offered alongside perks. +有时,束缚会与技能一起提供 +Perk shrines are always accompanied by bondage. +技能神泉总会提供束缚 + + +Perk Shrine Bondage Info: +技能神泉束缚信息 : ‎ +Hidden +隐藏 +Partial +部分 +Full +完全 +You do not know if a perk shrine will apply bondage. +你不知道技能神泉是否会施加束缚 +You know that a perk shrine will apply bondage, but not what kind. +你知道技能神泉会施加束缚,但不知道是什么样的 +You know the exact restraints a perk shrine will apply. +你知道技能神泉会施加什么拘束具 + + +### Difficulty: + +Normal Mode +正常模式 +Hard Mode +困难模式 +Extreme Mode +极限模式 +A supposedly reasonable difficulty curve. +合理的难度曲线 +Play the game the way it was intended. Cruel and restrictive. +以游戏的本意进行游玩 : 残酷且充满限制。 +Play at your own peril. Unlocked by double-clicking the Hard Mode button. +你将自食其果,该难度通过双击“困难模式”按钮解锁 + + Aroused 性欲 Removes all chastity belts, vibrating restraints, plugs, and removes the option to play with yourself. -移除所有贞操带、振动拘束、塞子,并移除自慰的选项。 +移除所有贞操带、振动拘束、塞子,并移除自慰的选项 Includes all that good stuff. -包括所有的好东西。 +包括所有的好东西 +Allow Front Plugs +允许阴塞 Allow Rear Plugs 允许肛塞 Allow Piercings 允许穿孔 -Fighter -战士 -Start with 200 willpower and 2 spell points, good for escaping and taking blows. -从200点意志力和2点法术点开始,有利于逃跑和打击。 -Rogue -流氓 -Start with 200 stamina and 2 spell points, good for sprinting around. -从200点耐力和2点咒语开始,有利于短跑。 -Mage -法师 -Start with 200 mana and 3 spell points, good for casting spells. -从200点法力和3点法术点开始,适合施法。 -Peasant -普通人 + + +Start with 150 willpower and Iron Will, good at melee and blocking attacks. +战士擅长近战攻击和格挡,开始游戏时将意志力上限提升到 150 点,并学得钢铁意志技能 +Start with 150 stamina and Sneaky, good at stealth and evasive gameplay. +盗贼擅长潜行和躲避,开始游戏时将体力上限提升到 150 点,并学得潜行技能 +Start with 150 mana and Magical Sight, good at casting spells. +法师擅长施法,开始游戏时将法力上限提升到 150 点,并学得魔之眼技能 Start with nothing to your name. For those who want a challenge. -从你的名字开始。对于那些想要挑战的人。 +适用于那些想要挑战的人,开始游戏时一无所有 +You are a mage, but haven't finished your formal 'training'. Requires Aroused mode. +你是一名法师,不过没有完成正式的“训练”。需要以性欲模式游玩 + + +Spell Choice: +技能选择 : ‎ + + Choose Spells 选择法术 Random Spells 随机法术 Break orbs. Get points. Buy spells. It's that simple. -打破水晶。获得积分。购买法术。就是这么简单。 +打破宝珠,获得技能点,购买法术,就是这么简单 Break orbs and pray you get something good. -打破水晶,祈祷你能得到好东西。 +打破宝珠,祈祷你能得到好东西 + + +Save Mode: +存档模式 : ‎ + + Save Codes 存档码 Roguelike -单人 -Grants you a save code every 5 floors you can write down elsewhere. -每 5 个楼层授予您一个保存代码,您可以在其他地方写下。 -No save codes. You are in it to win it. -没有保存代码。你参与其中是为了获胜。 +肉鸽游戏 +Grants a save code every floor you can write down. Autosaves only on floor start. +每当你到达新的楼层时会给予你一个存档码,你可以将其记下。当你进入下一层时存档会自动存档 +No save codes, forced autosaves. You are in it to win it. +没有存档码,只会自动存档。你来到这里只是为了赢 + + +Prison Strictness: +监狱安全性 : ‎ + + +Easy +简单 +Strict +严格 +If you get captured, you might get rescued if you have good relations. +当你被抓后,如果你与派系有良好的关系,你可能会获救 +If you get captured, you will always get rescued and pay a fee. +当你被抓后,你总是会被营救,但需要支付一笔费用 +If you get captured, you are totally on your own. +当你被抓后,你就只能靠自己了 + + +Start Playing +开始游玩 Lock your settings in, nice and tight. -锁定您的设置,又好又紧。 +锁定你的设置,享受紧缚 +Start with some perks that increase strictness and immersion. +从一些增加严格性和沉浸感的奖励开始 Choose some perks to spice up your run. -选择一些额外选项,为您的游玩增添趣味。 +选择一些额外技能,为你的游玩增添趣味 + + This game engages in safe and consensual analytics. -该游戏涉及安全和自愿的数据分析。 +该游戏涉及安全和自愿的数据分析 It sends data about spell choices, levels reached, etc, to help balance and improve the game. -它发送有关法术选择、达到的等级等的数据,以帮助平衡和改进游戏。 +它发送有关法术选择、达到的等级等的数据,以帮助平衡和改进游戏 No personal data is sent or stored. -不会发送或存储任何个人数据。 +不会发送或存储任何个人数据 Accept 接受 Don't Track Me 不要追踪我的数据 +Proceed +继续 + + Your key to the stairs is taken away! 你的楼梯钥匙被拿走了! -Exit Keys -[离开的钥匙] You found a keyring to the stairs! Now you just need to get there. 你找到了楼梯的钥匙圈!现在你只需要到达那里。 -There seems to be a locked high-security door. Looks like you need a key. -似乎有一扇锁着的高安全门。看来你需要一把钥匙。 + + +Behold my SPL! +你看我的 SPL! +### Mmmph... SPL... + +Oh noes... +哦不…… +Ueeee! +呃呃! +I don't want to be your slave! +我不想成为你的奴隶! +Catch me if you can! +如果可以的话来抓我吧! +I've been naughty, looks like I need to be punished... +我太调皮了,看来我需要受到惩罚…… +I've been a bad girl, won't you do something about it? +我是个坏女孩,你能做点什么吗? +Mmmph... maybe I talk too much... +嗯嗯……可能是我说太多了…… +Well well, what have we got here? +好了好了,看看这是什么? +You're not here to take away my pets, are you? +你不是来带走我的宠物的,对吧? +You'd make a lovely pet... +你会成为一只可爱的宠物…… +Daww, you're so cute when you're struggling! +呜哇,你挣扎的时候真可爱! +Let's take you back to your space~ +带你回到你的空间吧~ +You need to be bound tight! +你需要被绑得更紧! +Cleaning up for me, huh? +为我打扫卫生,嗯? +Uh uh, give that back! +呃呃,把那个还给我! +What do we have here? An intruder? Or a future pet? +我们有什么在这里? 入侵者? 还是未来的宠物? +I see how it is. +我明白了。 +I've taken on hundreds of adventurers like you. +我已经对付了数百个像你这样的冒险者。 +You don't stand a chance. +你没有机会。 +Your magic is nothing compared to mine! +与我相比,你的魔法根本不值一提! +I've been a master wizard for over a thousand years! +我已经是一千多年的巫术大师了! +You call that a spell? +你管这叫咒语? +My spells are far superior! +我的法术远超一流! +She won't help you! +她不会帮助你的! +Not yours! +不是你的! +Oh, that's not going to help~ +哦,那可没用~ +Let's play a game! +我们来玩个游戏吧! +Didn't think you would get away, did you? +没想到你会逃脱,是吗? +Oh ho~ +哦豁~ +'Tis but a scratch! +'这只是擦伤! +You'll be my pet soon~ +你很快就会成为我的宠物~ +Cute~ +可爱捏~ +Don't even try~ +不要尝试~ +It's over~ +结束了~ +Get over here! +过来! +Not so slippery now! +现在不那么滑了! +I'll be taking that~ +我会拿走那个~ +'Click!' +'咔哒!' +In the name of PTRN, I order you to kneel! +以 PTRN 的名义,我命令你跪下! +You're in my way. +你挡住了我的路。 +Step aside, pet. +靠边站吧,宠物。 +Get her, my pets! +抓住她,我的宠物们! +Hey! Don't touch that! +嘿!别碰那个! +Why you... +为什么你... +You can't do that! +你不能那样做! +Leave them alone! +别管他们了! +Hey, stop that! +嘿,别这样! +Why do I hire these people... +为什么我要雇用这些人... + + + + +Activate SPL protocol. +激活 SPL 协议。 +What do you mean 'access denied'??? +你说“拒绝访问”是什么意思? +Release me at once. +赶紧放开我。 +This is unacceptable! +这是无法接受的! +Guards! Guards... Guards? Well drat. +警卫!警卫……警卫? 好吧,该死。 +You'll never get away with this! +你永远逃脱不了这个! +Look, another one of my dolls~ +看,我的又一个玩偶~ +Come to me, my lovely thing~ +来找我吧,我的小可爱~ +I want to hear you moan~ +想听你呻吟~ +Perhaps we need to make things tighter? +也许我们需要弄得更紧? +Come with me, dear~ +跟我来吧,亲爱的~ +You've had too much freedom. +你已经拥有了太多的自由。 +Leave that for the cleaning robots. +把它留给清洁机器人吧。 +Skulking around, are we? +我们在周围乱跑? +I see you. +看见你了。 +There's no point in fighting. +战斗没有意义。 +How ineffectual. +多么无效啊。 +That's cute. +那很可爱。 +Your magical potential is impressive~ +你的魔法潜力令人印象深刻~ +A magnificent display of magic! +一场华丽的魔法展示! +You would make a great mana source~ +你会成为一个很棒的魔力来源~ +Did you think you could outsmart me? +你以为你能比我聪明吗? +I am the only goddess you need. +我是你唯一需要的女神。 +Dolls shouldn't mess with things they don't understand. +玩偶不应该乱搞他们不理解的东西。 +Let's take you somewhere safe~ +带你去安全的地方吧~ +You won't be getting away. +你不会逃脱的。 +Did you think that would work? +你认为这会起作用吗? +Let's put those hands of yours away~ +让我们放手吧~ +You are mine. +你是我的。 +You're a fast one. +你的速度很快。 +Your antics amuse me~ +你滑稽的动作让我很开心~ +It's time for your makeover! +是时候让你改头换面了! +Come to me. +到我这来。 +A shame it ends here. +可惜到这里就结束了。 +You won't be needing that. +你不需要那个。 +Tsk Tsk. I'll be keeping the keys. +啧啧。我会保管好钥匙的。 +I used to be an adventurer like you~ My name was PTRN... +我曾经也是和你一样的冒险家~ 我的名字是 PTRN... +You don't know who you're messing with. +你不知道你在招惹谁。 +You won't be allowed to make that mistake twice. +你不允许犯第二次同样的错误。 +I'll punish you myself. +我会亲自惩罚你。 +Hands off my property. +放开我的财产。 +Know your place, girl! +知道你的位置,女孩! +You've had your chance. +你有机会了。 +Fine, then. +那么好吧。 +Know your place! +知道你的位置! +*sighs* +*叹气* + + + + +### Hmmph~ + +My mistake~ +我的错~ +This wasn't supposed to happen. +这不应该发生。 +The Collector has become the Collected. +收集者变成了被收集者。 +Fine, you win! +行了,你赢了! +Cover me you brats! +掩护我,你们这些小家伙! +She's coming for me! +她来找我了! +Stay away! +离远点! +Time for a taste of my own medicine... +是时候尝尝我自己的药了... +I wonder how many days we'll get to spend together! +我想知道我们能在一起度过多少天! +You look so pretty as always, and forevermore~ +你看起来像往常一样漂亮,而且永远保持下去~ +Time for an inspection~ +检查时间~ +There's no use in struggling, dear! I've made sure it's extra tight. +亲爱的,挣扎是没有用的!我确保它紧的不得了。 +Playtime is over, back to your cell~ +游戏时间结束了,回你的牢房吧~ +Why aren't you wearing your restraints? +你为什么不穿着你的拘束具? +I did not order you to clean~ +我没有命令你打扫~ +What's that you've got there? +你那里有什么? +Found you! +找到你了! +I've been waiting for this~ +我一直在等这个~ +Show me your moves. +让我看看你的动作。 +You'll make for a fine servant! +你会成为一个好仆人的! +Very impressive. +令人印象非常深刻。 +Yes, yes, show me what you've got! +是的,是的,给我看看你有什么! +I've always wanted another mage. +我一直想要另一个法师。 +Tsk tsk, no silly tricks~ +哎呀,别耍傻把戏~ +Now now, you don't have permission to do that~ +哦哦~现在,你没有权限这样做~ +What do you think you're doing? +你认为你在干什么? +Typical adventurers~ +经典的冒险家~ +Oh, you got out? +哦,你出来了? +Too bad~ +真糟~ +That thing is dangerous, my dear~ +宝贝,那东西很危险~ +A feisty one, aren't you~ +你很有活力,不是吗~ +Playtime's over~ +游戏时间结束了~ +Very nice. +非常好。 +Most impressive! +最令我印象深刻! +You need more training! +你需要更多的训练! +Come along now~ +来吧~ +Come closer, I want to see your face~ +靠近点,我想看看你的脸~ +What a shame. +真害羞。 +What's this? +这是什么 +See if you can get out of that! +看看你能不能弄掉它! +I am the Warden. All things in this dungeon are subject to me. +我是典狱长。这个地牢里的一切都服从我。 +Hands off my pet~ +别碰我的宠物~ +Careful what you ask for~ +注意你的要求~ +Be gentle with her~ +对她温柔点~ +That's my property~ +那是我的东西~ +You've made some enemies, haven't you? +你树敌了,是吗? +I should teach you to be a nice girl. +我应该教你做一个好女孩。 +You need to learn some manners~ +你需要学习一些礼仪~ +This will be entertaining. +这将很有趣。 +Show me what you've got~ +给我看看你有什么~ +I'll watch~ +我会注视的~ + + +Submit to my SPL! +服从我的 SPL! +### Hmmmph... SPL-- + +Fine then! Have it your way. +行吧!随你便。 +You'll be sorry you didn't listen to me~ +你会后悔没听我哒~ +Why must you be so difficult! +你为什么这么难相处! +They're coming for me! +他们来找我了! +Do you know of the Dollmaker? I've got a proposal for you and I... +你知道玩偶师吗?我有个提议给你,我... + + +I cast SPL! +我释放 SPL! +That wasn't supposed to happen! +这是不应该发生的! +This is too tight... +这太紧了... +I can't get free! +我无法获得自由! Hey! Where do you think you're going? 喂!你以为你能去哪里? You look like you're having fun! @@ -6706,6 +14036,8 @@ What do you think you're doing with that? 你以为你在做什么? Looks like you found my keys! Hand them over. 看来你找到了我的钥匙!给我。 +Alert! +警报! You look like a good girl. Come on~ 你看起来像个好女孩。过来吧~ Come here, let's play! @@ -6728,10 +14060,6 @@ Watch it! 注意! Don't touch that! 别碰那个! -Don't touch that! -别碰那个! -Don't touch that! -别碰那个! We have an escapee! 有逃犯! Not so fast! @@ -6748,36 +14076,168 @@ Missed me! 错过我! You're coming with me! 你跟我来! -Get over here! -过来! -Not so slippery now! -现在不那么滑了! Hand it over. 把它交出来。 Nice and tight! -又好又紧! +绑的很紧! +The name's PTRN. +名字是 PTRN。 +What the-- +什么--鬼 +You won't get away with this! +你不会逃脱这个惩罚的! +I'm coming! +我来咯! +I can't let you do that! +我不能让你这么做! +You'll pay for this! +你将为此付出代价! +That was a mistake! +那是个错误! +I'm joining in! +我要加入! +Hand on, I'm coming! +快点,我来了! +I'm here! +我在这! +Here I come! +我来了! +Come and get me! +来接我吧! +You'll never escape! +你永远也逃不掉! + + +### Mmmphh! + +### Mmmm! Mmmmmmm! + +### Mmmmph!!! + +### Mmmmm~ + +### Mmmgh! + +### Mmmmmm <3 + +### Mmmmmm~ + +### Mmmph~ + *looks at you nervously* *紧张地看着你* -*groans* -*呻吟* *giggles* *咯咯地笑* -*rubs her hands together eagerly* -*急切地搓着她的手* +*giggles eagerly* +*急切地咯咯笑* +### Mmmph? + +### Mmmghgh!!! + +### Mmmmph! + +Mmmmph... +嗯…… +### Hhhhmph! + +Mmmph! +呜呜! +### Nngghhh! + +### Gggghh!!! + +### Mmmaaghthh! + +### Wwwmmmthhh! + +### Mmmmmph! + *looks at you suspiciously* *怀疑地看着你* *looks at you angrily* *愤怒地看着你* +*jumps up and down excitedly* +*兴奋地跳上跳下* +*groans* +*呻吟* +*does a happy dance* +*跳起快乐的舞蹈* +### Mmmph!!! + +### Mmm-hmmm. + +### Mmmmmmm~ + +*Her nametag says 'PTRN'* +*她的名牌上写着 'PTRN'* +### Mmmph!! + +### Mmmm--! + +Mmmmph. +嗯。 +### Mmmmmmmgh! + +### Mmph! + +### Mmmmmmmph... + +### MMMMMPH!!! + + + + + +*focuses intently* +*专心致志地* +*appears distracted* +*开始性奋* +### *Mmmmmm~* + +*muffled giggle* +*低沉的笑声* +### Mmmm~ + +*glows with anger* +*因愤怒而发光* +*Her headpiece says 'PTRN'* +*她的头饰上写着 'PTRN'* + + + + +Watch out for my SPL! +小心我的 SPL! +Whoops! +唉呀! +You won't get me like this! +你不会这样得到我的! +You'll never catch me! +你永远抓不到我! +Where'd you come from? +你从哪里来? +No! Definitely don't like... tie me up and punish me! +不!绝对不喜欢……把我绑起来惩罚我! +I've come to turn myself in~ +我是来自首的~ +Won't you 'apprehend' me? +你不会 '逮捕' 我吗? +I've been a bad girl~ +我曾经是个坏女孩~ Hey! You should know your place. 喂!你应该知道你自己什么地位。 -I'm gonna teach you a lesson, girl. -我要给你一个教训,姑娘。 +Look who's enjoying herself~ +看看谁玩得开心~ +Let's put you up for auction! +我们把你拿去拍卖吧! What are you rummaging around for? 你在翻什么? Oh no you don't! 哦不,你不能这么做! +You're not supposed to be here... +你不应该在这里... I'm gonna teach you a lesson, girl. -我要给你一个教训,女孩。 +我要给你一个教训,姑娘。 I'm gonna miss you when we find you a nice master... 当我们找到你一个好主人时,我会想念你的...... Looks like you need some training, girl. @@ -6789,13 +14249,11 @@ Never should have come here. I used to be an adventurer like you. 我曾经和你一样是冒险者。 You must be one of those wizards. -你一定是那些巫师之一。 +你一定是那些法师之一。 The mages sell real well... 法师卖得真好…… Mage! Stop her! 法师!阻止她! -Watch it! -小心! Not on my watch. 不是我的收藏品。 That's my stash... @@ -6804,24 +14262,60 @@ You'll fetch a pretty penny from that goddess you just pissed off. 你会从你刚刚惹怒的那个女神那里赚到一大笔钱。 Hah! Found ya! 哈!找到你了! -Got you! -抓住你了! *scoffs* Amateur. *嘲笑* 业余。 -Do your worst! -尽你最大的努力! Hmph. Get back here! -Hmph。 回来! +嗯。回来! +Why won't you surrender! +你为什么不投降! +Not a chance! +没有机会! Boss! We got another one! 老板!我们还有一个! -Get over here! -过来! Caught ya~ 抓住你~ Dibs on this one! 这里有一个零钱! Gotta make sure no one gets to you~ 要确保没有人接近你~ +I'm PTRN. And who might you be? +我是 PTRN。你可能是谁? +Bad time to party, girl~ +女孩,聚会的时机不好~ +You've got nerve showing your face around here. +你居然敢在这里露面。 +Don't think you can get away~ +别以为你能逃脱~ +Trying to fight your way out? +试图摆脱困境? +Well, looks like I'm having fun today. +嗯,看来我今天玩得很开心。 +Hey girls, got room for one more? +嘿姑娘们,还有空位吗? +We work for the highest bidder. +我们为出价最高者工作。 +Nothing personal. +无关个人。 +Sorry, it's just the way things work. +抱歉,事情就是这样的。 +You're mine. +你是我的。 +You can't get away. +你无法逃脱。 + + +*extends an arm* +*伸出手臂* +*miscast* +*施法失误* +*wiggles* +*摇晃* +*struggles* +*挣扎* +*rattles* +*惊恐* +This is a bug, please report +这是一个漏洞,请反馈 *starts chasing you* *开始追击你* *won't leave you be!* @@ -6832,12 +14326,12 @@ Gotta make sure no one gets to you~ *冲着你跑* *notices you!* *注意到你了!* +*claps loudly* +*大声鼓掌* *wants to socialize* *想要社交* *sends shivers down your spine* *让你脊背发凉* -*runs at you* -*冲着你跑* *is rattled* *惊慌失措* *scrabbles slowly by* @@ -6864,36 +14358,178 @@ Gotta make sure no one gets to you~ *抓住你* *disarms* *解除武装* -*is rattled* -*紧张* *rattles excitedly* *兴奋地嘎嘎作响* *misses* *错过* +*flails uselessly* +*毫无用处的连枷* *trembles* *颤抖* -*rattles* -*嘎嘎作响* -*rattles excitedly* -*兴奋地嘎嘎作响* +*tugs on leash* +*拉扯皮带* +*Wears a sign saying 'PTRN'* +*佩戴 'PTRN' 名牌* +!!! +!!! +! +! + + +*marches* +*游荡* + + +Engaging SPL! +迷人的 SPL! +A-Access denied!? +访问拒绝! ? +This... this unit is doing a good job! I swear! +这……这个小队干得很好!我发誓! +It's just business as usual, nothing to see here... +一切如常,没什么可看的…… +It's not like I need reconfiguring or anything... +这不像我需要重新配置或任何东西...... +You! I require... reconfiguring. +你!我需要...重新配置。 +Oh no! Looks like I need repairs~ +不好了!看来需要维修了~ +I've violated my parameters. Please discipline me. +我违反了我的参数。请管教我。 +Stop! You're not wearing the required uniform~ +停下!你没有穿规定的制服~ +Are your restraints too loose? Do I need to tighten them? +你的束缚是不是太松了?我需要收紧它们吗? +Transferring to a secure location. +转移到安全位置。 +You've violated your parameters. +你违反了你的参数。 +Insufficient security clearance. Hand it over. +安全许可不足。把它交出来。 +Please present your identification! +请出示你的身份证明! +Hello doll. Do your settings need adjustment? +你好玩偶。你的设置需要调整吗? +Looks like you've had too much time to yourself~ +看来你独处的时间太多了~ +A good doll needs routine maintenance~ +一个好的玩偶需要日常的保养~ +Ehh! The dolls aren't supposed to fight back! +呃!玩偶不应该反击! +In-initiating corrective action! +正在启动纠正措施! +Alert! Inmate has gone rogue! +警报!囚犯行为异常! +Who gave you permission to use magic? +谁允许你使用魔法的? +Unauthorized use of magic is grounds for increased security. +未经授权使用魔法是提高安全性的理由。 +Magic users require extra security! +魔法用户需要额外的安全保障! +Subduing assailant! +制服袭击者! +You're not allowed to contact the goddesses. Please meditate on this in your cell. +你不可以和女神接触。请在你的牢房里沉思这一点。 +Behavior exceeds parameters. Please submit to arrest. +行为超出参数。请服从逮捕。 +Alert! Inmate has escaped! +警报!囚犯越狱了! +Don't you want to be trained? +你不想接受调教吗? +Aren't you a violent one! +你这不是暴力分子吗! +Ouch! That hurt... +哎哟! 那真痛... +That'll be all from you! +这一切都将由你来完成! +Your brat quotient is off the charts. +你的真是聪明得离谱。 +Please stop and submit to arrest. +请停下并服从逮捕。 +Subject captured! +捕获对象! +Come back, doll! +回来吧,玩偶! +Deploying capture device. +部署捕获设备。 +I'll be confiscating that! +我会把它没收的! +How'd you slip through security? +你是怎么通过安检的? +I'm PTRN, and today I shall be taking care of you~ +我是 PTRN,今天就由我来照顾你吧~ +Enemy spotted! +发现敌人! +Target in my sights! +目标在我的视线里! +Red alert! +红色警报! +Lay down your weapons! +放下你的武器! +Surrender and I'll be gentle! Relatively speaking... +投降吧,我会温柔的!相对而言... +Give up or I'll call reinforcements! +投降,不然我就要呼叫增援了! +Ack! We have an unruly subject! +确认!我们这里有一个不守规矩的对象! +Target needs retraining... +目标需要重新调教... +Sorry, rules are rules~ +抱歉,规矩就是规矩~ +Moving to assist! +正在移动以提供帮助! +My orders are to shut you down~ +我的命令是让你闭嘴~ +Defenses online! +防御网络! + + +SPL armed. +SPL 武装。 +An exception has occurred while trying to run SPL. Retry? +尝试运行 SPL 时发生异常。重试? +Error in citizen ID registration. Please submit to processing. +公民ID登记错误。请提交处理。 +Does not compute. +无法计算。 +Some kind of miscalculation has occurred. +发生了某种误算。 +This was unforseen. +这是出乎意料的。 +Unit is retreating. +小队正在撤退。 +Activating self-preservation instincts. +激活自我保护的本能。 +Commence tactical withdrawal. +开始战术撤退。 +Maintenance needed. +需要维护。 +Unit needs repair. +装置需要维修。 +Commence transfer of power protocol. +开始电力传输协议。 Insufficient bindings. Commence submission protocol. 束缚不足。开始提交协议。 -Struggling detected. Commence inspection. -检测到挣扎。开始检查。 +Commence routine inspection. +开始例行检查。 +Inmate is out of containment. Transferring. +囚犯已经失控了。正在转移。 Theft detected. This is a warning. 检测到盗窃。这是一个警告。 Confiscating item. 没收物品。 +Unknown subject detected. Presuming hostile. +检测到未知对象。假定怀有敌意。 Inmate detected. Commence training protocol. -检测到犯人。开始培训协议。 +检测到犯人。开启调教协议。 Inmate detected. Commence routine inspection. 检测到犯人。开始例行检查。 Inmate detected. Commence submission training. 检测到犯人。开始提交培训。 Violence detected. Subduing assailant. 检测到暴力。制服袭击者。 -Damage detected. Initiating combat routine -检测到伤害。启动战斗程序 +Damage detected. Initiating combat routine. +检测到伤害。开始例行战斗。 Unruly inmate detected. Performing corrective action. 检测到不守规矩的囚犯。执行纠正措施。 Magic detected. Subduing assailant. @@ -6902,24 +14538,208 @@ Energy spike detected. Preparing shields. 检测到能量峰值。准备防护。 Unlawful use of magic. Please submit to arrest. 非法使用魔法。请提交逮捕。 -Violence detected. Subduing assailant. -检测到暴力。制服袭击者。 Unlawful conduct. Please submit to arrest. 非法行为。请提交逮捕。 Theft detected. Please submit to arrest. 检测到盗窃。请提交逮捕。 -Unlawful conduct. Please submit to arrest. -非法行为。请提交逮捕。 Inmate has escaped. Commence capture protocol. 犯人逃跑了。开始捕获协议。 -Look! A fine specimen! -看!很好的标本! +Error, subject is attempting to escape. +错误,对象正试图逃跑。 +Target is violent. Disarming subject. +目标是暴力的。缴械对象。 +Target is violent. Increase alert level. +目标是暴力的。提高警戒级别。 +Dispensing restraints. +解除束缚。 +Target flees. Revising strategy. +目标逃跑。修改策略。 +Target resists. Revising tactics. +目标反抗。修改战术。 +Target skill below expected level. Revising strategy. +目标技能低于预期水平。修改策略。 +Target skill below expected level. Revising tactics. +目标技能低于预期水平。修改战术。 +Subject captured. Returning to processing. +捕获对象。返回处理。 +Apply takedown protocol. +应用拆解协议。 +Aggressive target detected. Deploying countermeasures. +检测到攻击性目标。部署对策。 +Contraband detected. Confiscating. +发现违禁品。没收。 +Increasing strictness level. +严格程度不断提高。 +Unit PTRN identifying. +单位 PTRN 识别。 +Red alert. Joining combat. +红色警报。加入战斗。 +Battle stations. +作战站。 +Target identified. +目标已确定。 +Offering support. +提供支持。 +New target identified. Engaging. +已确定新目标。进行纠正。 +Combat detected. Engaging in corrective action. +检测到战斗。采取纠正行动。 +Updating target registry. Proceed to attack. +更新目标注册表。继续攻击。 +Target updated. +目标已更新。 +New target detected. Please submit to detainment. +检测到新目标。请服从拘捕。 +Moving to assist. +正在移动以提供帮助。 +Moving to capture. +正在移动以提供抓捕。 +Forming blockade. +形成屏障。 + + +### SPL(); + +throw new Error(SPL); +抛出新的错误(SPL); +query([ID]); >ERROR; transport([UNKNOWN], [DOLL]) +查询([ID]);>错误;传输([UNKNOWN], [DOLL] +Does not compute; +无法评估; +Some kind of miscalculation has occurred; +出现了某种判断失误; +This was unforseen; +这是没有预料到的; +Unit is retreating; +部队正在撤退; +Activating self-preservation instincts; +激活自我保护本能; +Commence tactical withdrawal; +开始战术撤退; +Maintenance needed; +需要维护; +Unit needs repair; +机组需要维修; +Commence transfer of power protocol; +开始移交电力规程; +Insufficient bindings; Commence submission protocol; +束缚不足;开始提交规程; +Commence routine inspection; +开始例行检查; +Inmate is out of containment; Transferring; +囚犯已脱离控制;正在传输; +Theft detected; This is a warning; +检测到盗窃;这是一个警告; +Confiscating item; +没收物品; +Unknown subject detected; Presuming hostile; +检测到未知对象;设定敌对; +Inmate detected; Commence training protocol; +发现囚犯;开始培训规程; +Inmate detected; Commence routine inspection; +发现囚犯;开始例行检查; +Inmate detected; Commence submission training; +发现囚犯;开始提交培训; +Violence detected; Subduing assailant; +发现暴力行为;制服袭击者; +Damage detected; Initiating combat routine; +检测到损伤;启动战斗程序; +Unruly inmate detected; Performing corrective action; +发现逾矩的囚犯;执行纠正措施; +Magic detected; Subduing assailant; +检测到魔法;制服袭击者; +Energy spike detected; Preparing shields; +检测到能量尖峰;准备防护罩 +Unlawful use of magic; Please submit to arrest; +非法使用魔法;请接受逮捕; +Unlawful conduct; Please submit to arrest; +非法行为;请接受逮捕; +Theft detected; Please submit to arrest; +检测到盗窃;请接受逮捕; +Inmate has escaped; Commence capture protocol; +犯人脱逃;启动捕获协议; +Error, subject is attempting to escape; +错误,主体试图逃跑; +Target is violent; Disarming subject; +目标是暴力的;解除主体武装; +Target is violent; Increase alert level; +目标是暴力的;提高警戒级别; +Dispensing restraints; +解除限制; +Target flees; Revising strategy; +目标逃跑;修订战略; +Target resists; Revising tactics; +目标抵抗;修改战术; +Target skill below expected level; Revising strategy; +目标技能低于预期水平;修订战略; +Target skill below expected level; Revising tactics; +目标技能低于预期水平;修改战术; +Subject captured; Returning to processing; +捕获对象;返回处理; +Apply takedown protocol; +应用拆卸协议; +Aggressive target detected; Deploying countermeasures; +检测到攻击性目标;部署对策; +Contraband detected; Confiscating; +检测到违禁品;没收; +increase_strictness(1); +增加_严密性(1); +query([SELF]); >PTRN; +查询([SELF]);>PTRN; +Red alert; Joining combat; +红色预警;加入战斗 +Battle stations; +战斗派遣; +Target identified; +目标已确定; +Offering support; +提供支持; +New target identified; Engaging; +确定新目标;参与中; +Combat detected; Engaging in corrective action; +发现战斗;采取纠正措施; +Updating target registry; Proceed to attack; +更新目标注册表;继续进攻; +Target updated; +目标已更新; +New target detected; Please submit() to detainment; +检测到新目标;请将()提交拘留 +defend([ALLY]); +保护([ALLY]); +capture([CITIZEN]); +捕获([CITIZEN]); +defend([POINT]); +保护([POINT]); + + +Behold my creation! SPL! +看我的创造物!SPL! +No! Not like this! +不!不是这样的! +Looks like I'm up to no good... better stop me! +看来我要做坏事了…… 最好阻止我! +Careful where you point that thing! +小心你指向的地方! +Containment breach! +收容突破! +What if I'm the assistant, for a change? +如果我换个助理怎么办? +Hey, could you test this on... me? +嘿,你能在我身上测试一下吗? +I'm willing to do anything for science! +为了科学我愿意做任何事! +You're a fine specimen! +你真是一个很好的标本! +I should take you to my office~ +我应该带你去我的办公室~ You'd look good in some latex! 你穿上乳胶会很好看! Hey! That's mine! 喂!那是我的! You're not supposed to have that! 你不应该有那个! +Oh? +哦? You'll make a fine test subject... 你会成为一个很好的测试对象...... Come here, I want to perform some tests! @@ -6948,24 +14768,96 @@ That's off-limits! 那是禁区! You're not supposed to be here! 你不应该在这里! +Now now, you won't be going anywhere~ +现在,你哪儿也去不了~ +A calculated success! +精心策划的成功! +Watch the vials! +注意小瓶! +I've caught you! +我抓住你了! +I can't believe I missed... +我不敢相信我错过了... +That's not fair! +这不公平! +I knew you would do that! +我就知道你会这么做! +Experiment was a success! +实验成功了! +Gotchya! +抓住你了! +There we go! +我们开始吧! +Ooh, you've got some useful stuff~ +呵呵,你有一些有用的东西~ +I won't let you go that easily! +我不会那么轻易放过你的! +I am PTRN, the great scientist! +我是 PTRN,伟大的科学家! +Do I have to? Fine... +我一定要吗?好吧... +Okay okay, I'm helping! +好吧好吧,我来帮忙! +Where's my assistant when you need them... +当你需要他们的时候,我的助理在哪里... +I will offer my support! +我会提供我的支持! +You're really gonna make me do this? +你真的要让我这么做吗? +I hate having to clean up after others. +我讨厌在别人之后打扫卫生。 +Eh, whatever, I'll help. +呃,不管怎样,我都会帮忙的。 +You're ruining my experiment! +你毁了我的实验! +Sheesh, what a pest! +我的天,真是个害虫! +Need an assistant? +需要助理吗? +I smell an opportunity! +我嗅到了机会! +Do I have to? +我一定要吗? + + +Let me introduce you to SPL~ +让我给你介绍一下 SPL~ +No! My SPL! +不!我的 SPL ! +Oh my, looks like I'm in trouble! +哎呀,看来我遇到麻烦了! +What a shame it would be if I got caught~ +万一被抓到就太可惜了~ +Looks like I'd better get going~ +看来还是先出发吧~ +What if I became the victim of my own inventions... +如果我成为自己发明的受害者怎么办? +Oh my, looks like I'm in trouble~ +哦,天哪,看来我有麻烦了~ +Won't you help me get dressed? +为什么你不帮我试衣? You look just gorgeous, dear... 你看起来真漂亮,亲爱的…… Why don't you try these on? 你为什么不试试这些? You'll make a fine addition to my collection! 你会为我的收藏锦上添花! -You'd be more elegant if you weren't moving around... -如果你不四游荡,你会更优雅…… +Such jaw-dropping beauty! +真是美得令人瞠目结舌! +You belong on a display stand! +你属于展示架! We should put away those grasping hands of yours~ 我们应该收起你那紧握的手~ That belongs to someone else. 那是属于别人的。 Oh no you don't, sweetie! 哦,不,别这样,亲爱的! +You're a pretty one! Why don't you come here~ +你是一个漂亮的人!为何不来这里呢~ Oof! Looks like you need to be taught a lesson! 哎呀!看来你需要被教训一顿了! We better put away those hands of yours. -我们最好收起你的手。 +我认为你应该收手。 Why don't you just give up and pose for us~ 你为什么不放弃并为我们摆姿势呢~ Oh my, that's dangerous! @@ -6984,6 +14876,1776 @@ You shouldn't break things with such dainty hands~ 你不应该用这么精致的手来破坏东西~ I knew something was amiss! 我知道有些不对劲! +You won't be getting away that easily, dear~ +亲爱的,你不会那么轻易逃脱的~ +Won't be needing this~ +不需要这个~ +Hey, you'll damage my dress! +嘿,你会弄坏我的衣服的! +I'm so excited! +我太激动了! +A slippery one, aren't you? +你真是个棘手的人,不是吗? +A brave one, aren't you? +你真是个勇敢的人,不是吗? +Tsk tsk. You can do better, dear~ +啧啧。亲爱的,你可以做得更好~ +I can't wait to dress you up! +我等不及要给你打扮打扮了! +So nice of you to join me! +很高兴你能加入我! +Now let's see, what kind of dress... +现在让我们看看,什么样的衣服... +A gift? Thank you so much! +一份礼物?太感谢了! +You won't be getting out of that any time soon! +你短期内无法摆脱这种困境! +I'm PTRN. Have you heard of my dresses?~ +我是 PTRN。你听说过我的衣服吗?~ +That won't do! +那不行! +I'd like to have you myself! +我自己也想拥有你! +Oooh, a cute one! +哦哦,好可爱的一个! +*sigh* how improper... +*叹气* 多么不合适...... +Inelegant! You need some teaching! +太不雅了!你需要被教育! +*snaps her fingers* Looks like you'll need some punishment~ +*打响指* 看来你需要一些惩罚~ +That one is pretty. May I have her instead? +那个很漂亮。我可以代替她吗? +I'd like to place a bid too~ +我也想出价~ +Oooh, that one's mine! +哦,那个是我的! + + + + + + +### SPL. + +### ... + +No! I don't want to read your magazines! +不!我才不想看你的杂志! +No, I don't want to learn about Shibari! +不,我才不想了解日式绑缚! +No, I don't want to learn about your toys! +不,我才不想了解你的玩具! +I found this book about Shibari... is it yours? +我找到了这本关于日式绑缚的书...是你的吗? +I'm so clumsy... maybe you can fix that. +我太蠢了...也许你可以解决这个问题。 +Gee, looks like I can't keep my mouth shut... +天啊,看起来我的嘴闭不上了... +Shhhhh. +嘘.... +Be quiet. +安静。 +Keep your hands off my books. +别把你的手放我书上。 +Heh. Serves you right. +呵呵。服务你是对的。 +Time to lock you away. +是时候把你锁起来了。 +Don't get your paws on anything important. +别把你的爪子放在任何重要的东西上。 +I was reading that! +我正在读那个! +You're not supposed to have that. +你不应该有那个。 +You. Stop. +你。停下。 +Who are you? +你是谁? +You're entering my personal space. +你正在擅自闯入我的私人空间。 +I'm going to ask you to leave +我要请你离开 +You're ruining the books! +你毁了这书! +Do you need a gag? +想要被堵嘴吗? +Shut up. +闭嘴。 +Put that back! +把它放回去! +There's nothing to learn from that, you ignorant buffon. +你个无知的小丑,从中没什么可以学习到的。 +Don't dive into someone else's belongings! +不要潜入别人的东西里去! +You've destroyed an ancient artifact, imbecile! +你毁掉了一件古老的神器,白痴! +I wish you'd just stay out of trouble... +我希望你远离麻烦... +Gotchya. +明白了。 +You're going to hurt someone with that. +你这样做会伤害到别人。 +My books! +我的书! +Stay down. +趴下。 +Get back here-- +回来-- +Just give it up. +放弃吧。 +Time for you to stay out of trouble. +是时候让你远离麻烦了。 +Come along. +一起来。 +Stay put! +留在原地! +I'll be taking that back. +我收回那句话。 +Click. +咔哒。 +If you really want to know, my name is PTRN. I am the keeper of this place. +如果你真的想知道的话,我的名字是 PTRN。是这个地方的守护者。 +Typical. +不出所料。 +*sighs* Another one... +*叹气* 另一个... +Keep the damage under control! +控制伤害! +Stop fighting, you guys! +别打架了,伙计们! +You'll ruin the books! +你会毁掉这些书的! +Stop making a mess! +别再添乱了! +You're too dangerous to have around. +你太危险了,不能在身边。 +I don't care what happens to you as long as you're out of here. +只要你离开这里,我不在乎你会发生什么。 +Get out of my library! +从我的图书馆滚出去! + + + + +Deploying SPL! +部署 SPL ! +What was I supposed to do again? Oh right! +那我该怎么做呢?哦,对! +No! I didn't do anything wrong... +不!我没有做错什么... +Don't punish me! Please! +别惩罚我!求你了! +It's not my fault! +这不是我的错! +It's your turn, dear~ +轮到你了,亲爱的~ +Looks like I'm the patient now~ +看来我现在是病人了~ +I've been an unruly nurse... +我曾经是一个不守规矩的护士... +It's time for your shot... +是时候开枪了... +Why are you out of your cell? +你为什么离开牢房? +You need my help! +你需要我的帮助! +Those are supposed to keep you still you know... +你知道的,这些应该能让你安静下来...... +You've got an appointment scheduled. +你已经预约好了。 +Lets get you back in your jacket~ +穿上你的拘束衣吧~ +Patients are not allowed to have toys. +患者不允许拥有玩具。 +Oh my~ +天哪~ +You can be cured if you just give up. +只要你放弃,你就会被治愈。 +You're going to ruin your progress~ +你会毁掉你的进度的~ +Patients are forbidden from casting spells! +病人不允许施展法术! +Silly girl, your illness can't be cured by a prayer. +傻姑娘,你的病不是靠祈祷就能痊愈的。 +You shouldn't break things, you know~ +你不应该破坏东西,你知道的~ +Hey, who said you could do that! +嘿,谁说你可以这么做的! +Now now, you can't just resist like that~ +现在,你不能反抗了~ +Lets get you back to your cell! +让我们带你回到你的牢房! +Now let's see, good patients should be still... +现在我们看看,我们的好病人应该还……在 +Nurse PTRN, reporting for duty! +护士 PTRN,报到啦! +Someone call security! +有人叫保安! +I will try to subdue them~ +我会努力制服他们的~ +Code Gray! +格雷码! +Hold her down! I'll get the jacket! +按住她!我去拿拘束衣! +Moving in to support! +去提供帮助! +Let's mediate things, shall we? +让我们调解一下,好吗? +Why don't you calm down so we can talk. Or not~ +你为什么不冷静下来,这样我们就可以谈谈了。或者你不愿意~ +Now now, what do we have here? +现在,我们有什么? + + + + + + +I'll need another SPL, stat! +我需要另一个 SPL,马上! +A p-professional mistake. +一个职业错误。 +I did what the manual said! +我是按照说明书说的做的! +I seem to have caught something, won't you help? +我好像发现了什么东西,你能帮帮我吗? +It's time for your daily dose of cuddling~ +又到了每日拥抱的时间了~ +I diagose you with excessive subbiness. +我诊断你过于卑鄙。 +Seems like you've caught a case of female hysteria... +看来你得了女性歇斯底里症…… +I diagnose you with a case of bratty behavior... +我诊断你有一种顽皮的行为... +Have you had your daily cuddles yet? +你每天都拥抱过吗? +It's time for your edging treatment~ +是时候进行寸止治疗了~ +Sexual health is physical health, my dear~ +性健康就是身体健康,亲爱的~ +PTRN MD here. Let's see what we've got... +PTRN MD 在这里。让我们看看我们有什么... +Security! +安全! +What's this disturbance... +这是什么扰乱…… +Must I do everything myself... +一切都必须我自己做吗... +Settle down. +安家。 +I didn't want to get my hands dirty. +我不想弄脏我的手。 +Looks like the gloves are off~ +看起来手套脱了~ +Let me get my tools. +让我去拿我的工具。 +I'll take a look. +我会看一看。 + + + + +### SPL + +SPL failed +SPL 失败 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +### PTRN + + + + + + + + + + + + + + + +### SPL! + +That w-was supposed to be a SPL! +那应该是 SPL的! +Ooh, a shiny rock… +哦,一块闪闪发光的石头… +I wonder what's over here? +我想知道这里是什么? +I'm bored, bye! +我好无聊,拜拜! +Pay more attention to me! +再多看我一眼啊! +Tell me I'm pretty! +说我好看! +I'm not a bottom, I'm a scary dom! +我不是低等的东西,我是个可怕的家伙! +You seem stressed, how about I help you take a break? +你看起来压力很大,我帮你放松一下怎么样? +Here's some powerful loot that will help you win! Let me help you try it on… +这里有一些强大的战利品,可以帮助你获胜!让我帮你试穿一下… +Aaah, I can't help it, you're just too cute to keep my hands off! +啊,我忍不住了,你太可爱了,我的手都拿不开! +Cuddle pillows aren't supposed to be able to move! +抱枕不应该动! +C'mon, c'mon, I wanna show you a fun place~ +来,来,我想带你去一个有趣的地方~ +Hey I called dibs on that! +嘿,那是我的! +You're cute! I'm gonna make you my pillow! +你真可爱!我要把你当我的枕头! +No fair! +不公平! +You're not supposed to fight back! +你不该打回去! +### Eep! + +Cool magic! +好酷的魔法! +Magic is cheating! +魔法是作弊的! +A cutie casting cute spells~ +一个施展可爱咒语的小可爱~ + + +No trying to leave the comfy room! +不要试图离开这么舒适的房间! +Cuddle time! +拥抱时间! +You dropped something, cutie~ +你东西掉了,小可爱~ +I just wanna make you a pillow! +我只是想把你做成枕头! +Wow, I actually dodged something! +哇,我居然躲过了什么! +Stop dodging so I can bundle you up! >_< +别躲了,这样我就可以把你捆起来了!>_< +You're not supposed to dodge, no fair! +你不许躲,不公平! +You're not supposed to block, no fair! +你不许抵抗,不公平! + + +Look, a distracting thing! Hehehe… +看,一件令人性奋的东西!嘻嘻嘻… +This is just to make sure your clothes don't fall off, don't worry! +这只是为了确保你的衣服不会掉下来,别担心! +My name's Melissa! I know I'm pretty, but try not to stare too much~ +我叫梅丽莎!我知道我很漂亮,但尽量不要盯着看~ + + + + + + + + + + + + + + +Let me show you how it's done: SPL! +让我来告诉你怎么做 : SPL! +You've just narrowly avoided my SPL~ +你差一点就躲过了我的 SPL +Kya~ I have no mana, I'm so defenseless right now~ +呀~我没有法力了,我现在毫无还手之力~ +I have all this bondage gear on me, I sure hope nobody ties me up with it~! +我身上带着所有这些束缚装备,我当然希望没有人把我绑在上面~! +Oh no, how will I ever find my way out of here~ +哦,不,我怎么能找到离开这里的路~ +If I focus really hard, I can make my blade go on fire! +如果我真的很努力地集中注意力,我可以让我的刀刃着火! +I ran out of mana, but I'm sure I can find the exit before long! +我的法力用完了,但我相信我很快就能找到出口! +Hey, be careful with my enchanted rope! +嘿,小心我的魔法绳! +Hey, you wouldn't happen to have a mana potion, would you? +嘿,你不会碰巧有法力药水吧? +Say, I happen to know a thing or two about knots~ +喂,我碰巧对绳结略知一二~ +I am an artist with rope... in more ways than one. +我是个绳缚艺术家...不止一种方式。 +*blushes jealously* +*嫉妒地脸红* +I'm out of practice... you wouldn't mind helping me, right? +我没练过...你不介意帮帮我吧? +Thank you for cleaning up! I can take that off your hands~ +谢谢你打扫!我可以把它从你手里拿开~ +Oooh, I wonder where that key leads! +哦,我想知道那把钥匙通向哪里! +Hey you! Where do you think you're going? +嘿!你想去哪儿! +Kya~! I challenge you! +喝呀~!我要挑战你! +What say you to a duel? +你对决斗有什么看法? +Let's fight! For honor and cuddles! +让我们战斗!为了荣誉和拥抱! +It's time for a battle between masters--wait, I'm low on mana... +是时候进行一场大师之间的战斗了——等等,我的法力值不够了... +Give me a second to chug a mana potion... +给我时间喝点法力药水... +Why don't you try that again~ +你为什么不再试一次呢~ +I'll get you for that! +我会抓住你的! +Hey you can't do that! It's not like I do it too or anything... +嘿,你不能这么做!我又不是这么做的…… +That was m- I mean... you can't steal things like that! +那是……我是说……你不能偷那样的东西! +That was m- I mean... you can't steal sacred artifacts! +那是……我是说……你不能偷圣物! +Kya~ What have we here? +呀~我们这里有什么? +I got you! +我抓到你了! +Watch where you're pointing that thing~ +小心你指的地方~ +Kya... I mean, ouch!!! +呀...我的意思是,哎哟!! +Take that!!! +尝尝这个!! +### Whaaa- + +### Hmmph! + +Hah! Can't hit me! +哈!不能击中我! +It'll take more than that to bring me down! +需要更多的东西才能把我打倒! +What a shame. If only you weren't such a pushover... +真可惜。要是你不是那么容易上当就好了... +Kya! Take that! +呀!试试那个! +Nice loot! I'll take it~ +不错的战利品!我接受~ +Can never be too sure! +永远不要太自信! +You wouldn't happen to have a mana potion or 3 would you? +你不会碰巧有一瓶或三瓶法力药水吧? +Looks like it's time for me to shine! +看来是时候让我大放异彩了! +Stand down, or I won't go easy on you! +站住,否则我不会对你手软的! +Help is on the way! +救援即将到来! +You really want to get tied up, don't you? +你真的想被绑,是不是? +Hmph, looks like I need to help after all! +哼,看来我终究需要帮忙! +You asked for it! +你说要的! +Me? Help? Alright! +我?帮忙?好吧! +Sorry miss, I'm on an escort mission. +对不起,小姐,我在执行护送任务。 +There goes my nice, relaxing day... +我美好而放松的一天就这样过去了... + + + + + + +Behold, my true power! Wait... ack... +看,我真正的力量!等等……ack…… +I wonder what to do with all these cuffs... +我想知道这些手铐该怎么办... +I have made a huge mistake... +我犯了个大错... +I'll just be going... +我要走了... +Please hold me~ +请抱抱我~ +Please punish me! Please!!! +请惩罚我!拜托!!! +I want... pain... +我想...痛一点... +Let's spend some time together under the moonlight~ +让我们在月光下共度时光~ +I'll take you to my place tonight~ +今晚我带你去我家~ +I'm so blessed to find you! +我很幸运能找到你! +Yes, enjoy yourself... +是的,玩得开心... +Come with me~ +跟我来~ +Don't you want to feel the tight embrace of leather? +你不想感受皮革的紧缚吗? +You won't need that. +你不需要那个。 +It's time to get acquainted with the night~ +是时候熟悉夜晚了~ +*moans loudly* +*大声呻吟 * +Yes... more! +是的...还要! +Please keep doing that to me~ +请继续这样对我~ +Two can play at that game! +两个人可以玩的游戏! +I call upon the shadows! +我呼唤阴影! +Have a taste of my spear! +尝尝我的矛! +A curious item~ +一件奇特的物品~ +The shadows will consume all... eventually. +阴影终将吞噬一切... +Put it back... +放回去... +I was supposed to do that... not you. +我本该这么做的...而不是你。 +What do we have here... +我们这有什么… +I've got you! Now I can make you do anything I want... +我抓住你了!现在我可以让你做任何我想做的事... +What was that? +那是什么? +Ah, yes!!! +啊,是的!!! +You'll counterattack, won't you? +你会反击的,是吗? +You're not trying hard enough! +你不够努力! +More! MORE! +更多!更!多! +Yes, now hit me back! +是的,现在回击我! +Come now... let's go together. +过来...我们一起去吧. +Get over here~ +过来~ +Pierce the darkness. +穿过黑暗。 +Oh? What's this? +哦?这是什么? +Hmmm... that's better. +嗯……这样好多了。 +My name? My name... oh, I'm PTRN... +我的名字?我的名字...哦,我是 PTRN... +Hey! Look over here! +嘿!看这里! +*points* Look, a distraction! +*手指着* 看,一个令人性奋的东西! +Kya~! I'll help! +呀~!我会帮忙的! +Mind if I join? +介意我加入吗? +Mmmph~ You two look like you're having fun! +嗯~你们俩看起来玩得很开心! +Hey miss, I'm going to have to stop you now~ +嘿,小姐,我现在得阻止你了~ +Why don't you fight ME instead~ +你为什么不和我战斗~ +What kind of trouble are we getting into today? +我们今天会遇到什么样的麻烦? +Oooh, fun! +哦,好玩! + + + + + + +Face my SPL! +我面对你的挑战! +SPL-whoops... +SPL-哎呦…… +Give me another chance! +再给我一次机会! +No! Wait! I can explain... +不!等等!我可以解释... +I'll be right back... +我马上回来... +Okay, so I MAY have exaggerated my credentials... +好吧,所以我可能夸大了我的资历... +I'm not in trouble, am I? +我没有麻烦,是吗? +I've been looking for... a mentor of sorts. +我一直在找...某种意义上的导师. +Aren't you the prettiest thing... +不是最漂亮的东西吗... +I've met a lot of cuties, but you're something special! +我见过很多可爱的人,但你很特别! +You'd look good in something tight and inescapable! +你穿上紧身且脱不掉的衣服很好看! +Enjoying yourself? Let's have some fun~ +玩得开心吗?让我们玩得开心点~ +You seem like you're having fun! Why don't we go for a walk~ +你看起来很开心!我们为什么不去散步呢~ +Wouldn't it be more interesting if... +如果这样的话...那岂不是更有趣... +What have you got there? +你那里有什么? +Oooh, a key for my collection? +哦,我收藏的钥匙? +What's that noise? I guess it's just another adventurer... +那是什么声音?我想这只是另一个冒险家... +Ah! So you do have some fight left in you... +啊!所以,你确实还有一些斗志... +A little help over here! +帮帮忙! +I can take you! +我可以带你去! +M-magic? +魔-魔法? +I, uh, also learned a few cantrips... a while ago... +我,嗯,还学了一些咒语…前不久…… +Okay, that was cool... +好吧,这很酷... +I've got enchanted rings and you don't~ +我有魔法戒指,你没有~ +I don't think you're allowed to do that... +我不认为你可以这么做... +I think I deserve it instead~ +我觉得这是我应得的~ +That's not okay... +这不好... +I'm surprised you got this far! +我很惊讶你走了这么远! +### Aha! + +Do you even know what you're doing? +你知道自己在做什么吗? +Okay, I may have exaggerated a bit... +好吧,我可能有点夸张了... +Please tell me it's not already over? +请告诉我这还没结束? +Ah hold still... +啊,别动... +Coward! +胆小鬼! +As expected of an inferior duelist. +不愧是低劣的决斗者。 +Is that all? +就这? +A well-deserved victory on my part~ +这是我应得的胜利~ +I've... got you? +我已经…得到你了吗? +Are you finished? That's too bad... +说完了吗?太糟糕了... +...what were you planning to do with this? +...你打算怎么处理这个? +Oh... that's too bad~ +哦...太糟糕了~ +My name is PTRN, A-rank adventurer. You? +我叫 PTRN,A级冒险家。你呢? +In the end, only one of us will be tied up! Wait a minute... +最后,我们中只有一个人会被捆起来!等一下... +Heh, watch this~ +嘿,看这个~ +*readies weapon* time to get to work... +*准备好武器*上班时间到了... +I thought we could reason with her. Oh well... +我想我们可以跟她讲道理。哦,好吧... +I see negotiations have broken down. +我看到谈判破裂了。 +I'm the one you should worry about. +我才是你应该担心的人。 +I've got orders to take you down. +我接到命令要干掉你。 +There's a bounty on your head~ +你头上有赏金~ +The bounty will be mine... +赏金将归我所有... + + + + + + +You can't hope to match my SPL~ +你别指望能比得上我的 SPL~ +SPL! No wait, not like that! +SPL !不,等等,不是那样的! +Be nice! +乖一点! +No! Be gentle! +不!温柔点! +### Ahhhh! + +Headpats please... +请温暖地拍... +*purrs* +*呼噜声* +Nyah, I've been a bad kitty... +嗯,我一直是个坏猫... +You're a cute one~ +你真可爱~ +It's about time I got someone to play with~ +是时候找个人一起玩了~ +Let's take you for a walk~ +我们带你去散步吧~ +Having fun there~? +在那里玩得开心~? +It's time for walkies~ +是时候散步了~ +Don't you want to play? +你不想玩吗? +Whatchya doing? +你在干什么? +Tsk tsk, hand it over! +哎呀,把它交出来! +A challenger approaches! +一位挑战者登场! +Prepare to face my skill! +准备好接下我的技能! +I've mastered the blade for decades! +我已经握了这把剑几十年了! +I'm invincible! +我是无敌的! +Nyah! What was that!? +啊!那是什么!? +Your spells won't hurt me. +你的咒语伤不到我的。 +Magic? That's... +魔法?那真是... +Stupid tricks won't work on me! +愚蠢的把戏对我行不通! +Praying won't help you~ +祈祷帮不了你~ +That's not yours you know~ +你知道,那不是你的~ +Nyah! You'll pay for that! +呢啊!你会为此付出代价的! +An escapee? I'm on it. +逃犯?我正在处理 +Come here you~ +过来~ +Checkmate~ +将军~ +Nya~! No fair... +Nya~!不公平... +Aren't you a little out of your league? +你是不是有点力不从心? +I'll get you next time! +下次我会抓住你! +Nice one! It won't work twice! +不错!它不会有用第二次! +*smiles* It's okay, you tried~ +*微笑*没关系,你试过了~ +*CLANG* En garde! +*CLANG*当心! +It looks like I've won~ +看来我赢了~ +Nyah~! +喵~! +What's this, nya? +这是什么,啊? +Let's make it a bit tighter, shall we? +让我们把它收紧一点,好吗? +They call me PTRN, the legendary blademaster! +他们叫我PTRN,传说中的剑术大师! +I'LL take it from here. +我从这里开始。 +It's me you should worry about! +你应该担心的是我! +Pfft. Amateurs. +噗。业余。 +Did you think I wasn't looking? +你以为我没注意吗? +Nice try, girl~ +不错的尝试,女孩~ +You've made a mistake attacking my client. +你攻击我的客户是个错误。 +Capture her? Fine, but I expect payment. +抓住她?好吧,但我希望获得报酬。 +I just follow the money, miss~ +我只是跟钱走,小姐~ +Can't let you have all the fun, can I? +我不能让你享受所有的乐趣,对吧? + + + + +Time for SPL! +SPL时间到了! +*tsk* +叹气声*tsk* +Let's play all night! +让我们玩一整晚! +We can take our time. +我们可以慢慢来。 +I bet you won't last long! +我打赌你活不了多久! +You won't be getting out tonight! +你今晚出不去的! +I found my new pet for the day! +今天我找到了我的新宠物! +Not a clock? Useless! +不是瞬间吗?没用! +It's not time to go. +现在还不是离开的时候。 +Why are you attacking me this time? +你为什么要在这时攻击我? +I'll make this quick. +我会尽快完成。 +I've mastered this spell last night! +我昨晚掌握了这个咒语! +Hey! No getting out before midnight! +嘿!午夜前不准出门! +Let's dance under the moonlight. +让我们在月光下跳舞吧。 +Do you have time to take it back? +你有时间把它拿回去吗? +I can do this all day! +我能做这个一整天! +It's only a matter of time before I get you. +我找到你只是时间问题。 +It's too bright here... +这里太亮了... +It seems you have nyctalopia... +看来你有夜盲症... +It's time for you to give up. +你该放弃了。 +Give me a moment~ +给我一点时间~ +Give me your watch! +直面我! +Here's a clock without the 'C'. +这是一个没有“C”的钟。 +Hello stranger. Do you know what time it is? +你好,陌生人。你知道现在几点了吗? +This'll be over in an instant. +这马上就结束了。 +Time to wrap this up. +是时候结束了。 +Playtime's over! +游戏时间结束了! +Hold on a minute! +等一下! +Tick tock, what a shock... +滴答,真是令人震惊... +Time for me to intervene... +是时候让我介入了... +Don't balk! Your time was up anyways~ +别犹豫!反正你的时间到了~ + + +Calling in a SPL! +呼叫 SPL! +A-assistance required! +需-需要援助! +You'll have to try harder if you want to discipline me, ma'am. +如果你想管教我,你必须更加努力,女士。 +I... don't have time for training right now, ma'am... +我…现在没有时间训练,女士... +Did I do something wrong? +我做错什么了? +So you're the new boss, huh? +所以你是新老板,嗯? +Time for some 'training?' +是时候进行一些“培训”了吗? +Wanna to have a chat? +想聊聊吗? +Looks like you've had too much time to yourself. +看来你有太多时间独处了。 +Why don't you come with me for a sec? +你为什么不跟我来一会儿? +Let me see your ID... +让我看看你的ID... +You have the right to remain silent. +你有权保持沉默。 +Let's have a chat. +我们聊聊吧。 +Who set you loose? +谁放你出来的? +I'll be confiscating that. +我会没收的。 +Aye, you're gonna need clearance for that, missy. +是的,小姐,你需要得到许可。 +Halt! +站住! +You just made a big mistake. +你刚刚犯了一个大错误。 +Need backup! +需要支援! +You're under arrest! +你被捕了! +Magic use is restricted pursuant to IDC section 3 article 21a. +根据IDC第3节第21a条,魔法使用受到限制。 +Magic? That's where I draw the line. +魔法?这就是我要划清界限的地方。 +I've got an extra comfy cell for mages. +我为法师们准备了一个额外舒适的牢房。 +That's off limits for you! +这对你来说是禁区! +Resorting to petty theft? How crude. +竟然采取小偷小摸的手段?太粗鲁了。 +The goddesses have property rights too, you know. +你知道,女神们也有财产权。 +I'm gonna ask you to turn yourself in. +我要你自首。 +Keep your hands where I can see 'em. +把手放在我能看到的地方。 +That's a weapons violation. +这是违反武器规定的。 +Assaulting an officer is a crime! +袭击警察是犯罪! +You're coming with me. +你跟我来。 +Resisting arrest won't get you anywhere. +拒捕对你没有任何好处。 +Is that all you got? +你只有这些吗? +Hands behind your back. +双手放在背后。 +I will conduct a more thorough search later on. +我稍后会进行更彻底的搜查。 +Suspect is secure. +嫌疑人已确保安全。 +Officer PTRN, reporting for duty! +警官 PTRN ,报到! +Halt! You're under arrest! +站住!你被捕了! +You seeing what I'm seeing? +你看到我看到的了吗? +I'll have to finish my donut later... +我稍后必须吃完我的甜甜圈... +Backup is here! +增援在这! +Hands up! Don't move! +举起手来!别动! +Lay down your weapons and don't move! +放下武器,别动! +I have a warrant for your arrest... +我有逮捕令... +You're a wanted girl. +你是个被通缉的女孩。 +You're under arrest. +你被捕了。 +Backup has arrived. +增援抵达。 +Requesting backup! +正在请求增援! +Calling in a blockade! +呼叫封锁! + + +Hidden technique: SPL! +隐藏技巧 : SPL! +I practiced a thousand times... for this!? +我练习了一千次……对于这个! ? +I'm not hiding anything, if you know what I mean... +我没有隐瞒任何事情,如果你明白我的意思... +Who are you looking for? Me? +你在找谁?我? +So... wanna hang out? +所以…想出去玩吗? +It's not like I... LIKE you or something... +这并不是说我……喜欢你或诸如此类的…… +I'm not following you! I'm just... +我没有跟着你!我只是... +You look suspicious. +你看起来很可疑。 +You've got a nice pair of wrists~ +你的手腕很漂亮~ +You there! Let's have a talk. +你在那里!我们谈谈吧。 +Looks like you're rusty. Haven't you ever done escape training? +看起来你已经生疏了。你没做过逃生训练吗 +I'm going to have some fun with you~ +我要和你玩点好玩的~ +Watch yourself, girl~ +小心点,妹妹~ +Nice find. I'll take it. +不错的发现。我会接受的。 +This place is off-limits for you. +这个地方对你来说是禁区。 +Target is in my sights. +目标在我的视线中。 +Let's see how you like my special move! +看看你喜欢不喜欢我的特别动作! +That's nothing compared to my technique! +与我的技术相比,这算不了什么! +You're in for it now! +你现在就要上场了! +It's time for a display of skill! +是时候展示真正的技术了! +Fancy tricks? That's nothing. +花哨的把戏?那没什么。 +Let me show you a real move... +让我给你看一个真正的动作... +True skill comes from the heart. Not something you hold in your hand. +真正的技术来自内心。不是你手里拿着的东西。 +She's not going to be happy about that... +她不会为此高兴的... +Stop right there, criminal scum! +站住,人渣! +Do you know what you've just done? +你知道你刚刚做了什么吗? +Finally, I've tracked you down! +我终于找到你了! +It's over. I've already won. +结束了。我已经赢了。 +Wrong move, buddy. +错了,伙计。 +I can't believe it... +我简直不敢相信... +You're too slow. +你太慢了。 +...she's fast. +...她真快。 +...she's strong. +...她真厉害。 +This battle is over. +这场战斗结束了。 +Too slow! +太慢了! +I'll be taking that. +我会接受的。 +There's no way out. +没门。 +The name's PTRN. Don't forget it. +我叫PTRN,别忘了。 +There's a juicy bounty on your head and I want it! +你头上有丰厚的赏金,而且我要了! +Hmph. This battle is already over. +哼。这场战斗已经结束了。 +Time for some target practice. +是时候进行一些目标练习了。 +Didn't expect me, did ya? +没想到我会来,是嘛? +Boo! Ha, scared ya~ +Boo!哈,吓到你了~ +What, did you think I'd just stand here? +什么,你以为我会站在这里吗? +There's a bounty on your head, miss. +小姐,你头上有赏金。 +I won't let you get away. That bounty is mine. +我不会让你逃脱的。那笔赏金是我的。 +Didn't expect me to show up, did you? +你没想到我会出现,是吗? +Need backup? +需要支援? +Time for a test of skill. +是时候进行技能测试了。 +I'll get you! Eventually... +我抓住你了!终于... + + +Let's see how you like my SPL! +看看你喜欢不喜欢我的 SPL! +Wait, wrong button! Aaahh~ +等等,按钮错了!Aaahh~ +Hey~! Let's have a talk. +嘿~!我们谈谈吧。 +Looks like you need additional training. +看来你需要额外的训练。 +I spy a cute one! +我发现一个小可爱! +Bad pet! +坏宠物! +Looks like you're gonna need the extra special treatment~ +看来你需要额外的特殊待遇~ +Now you've done it! +现在你做到了! +Magic? Hah... +魔法?哈... +Such outdated practices... +这种老掉牙的做法... +Your spells are nothing compared to technology. +与科技相比,你的咒语微不足道。 +Quit messing around. +别闹了。 +Don't even think about appealing to your goddess! +想都别想去找你的女神! +Stop right there! +站在这! +It'll take you quite a while to pay off those damages! +你要花很长时间才能还清这些损失! +Now there, good girl! +好了,好姑娘! +Wrong move! +走错了! +Get your paws off me! +把你的爪子从我身上拿开! +*scoffs* Could use some work~ +*嘲笑*可能需要一些工作~ +Such speed! +这么快! +Clever! +聪明! +PTRN, Nevermere associate. Here's my card. +PTRN,“奈文米尔”的一员。这是我的名片。 +I run a legitimate business, I promise! +我保证,我经营的是合法的生意! +Is it the tax collectors? Oh, no, it's just you... +是税务员吗?哦,不是,只有你... +Looks like you landed on the wrong side of the coin~ +看来你选错了方向~ +A deal's a deal, my friend. +交易就是交易,我的朋友。 +Excuse me, you just attacked my client. +对不起,你刚刚攻击了我的客户。 +Hey! We were just talking! No sketchy underground dealings, nope. +嘿!我们只是在聊天!没有粗略的地下交易,没有。 +I'll help capture her! For a 50% share that is~ +我会帮你抓住她的!只需50%的分成~ +We deal in the finest products... like you, if you catch my drift~ +我们经营最好的产品...像你这种,如果你明白我的意思~ +I smell a shady business opportunity~ +我嗅到了一个可疑的商机~ +*growls menacingly* +*威胁性地大叫* +Let's make this fun~ +让我们玩得开心~ +What's that about backup? +增援是怎么回事? + + +Wait no, wrong button! +等等,不,按钮错了! +Catch me. If you can, that is. +抓住我,如果可以的话。 +I double dare you. +我向你发起双重挑战。 +Weren't you chasing me? +你不是在追我吗? +I've got somethin nice for ya. +我有件好东西给你。 +Be a good girl for me, will ya? +做个好女孩,好嘛? +You need to show some restraint. +你需要克制一些。 +Stay where you belong, you naughty girl. +呆在属于你的地方,你这个淘气的女孩。 +Let's go somewhere more private. +我们去更私密的地方吧。 +Ready or not, here I come. +无论你是否准备好,我来了。 +Those sticky fingers belong in a pair of mittens. +那些黏糊糊的手指应该放在手套里。 +All units. Apprehend convict with extreme prejudice. +所有单位。不要犹豫给我逮捕罪犯。 +You're going nowhere. +你哪儿也去不了。 +Come on. This wasn't your only weapon, was it? +拜托,这不是你唯一的武器,对吧? +A tank, huh. +一辆坦克,嗯。 +Mine now. +现在是我的了。 +Just keeping you safe from yourself. +只是保护你免受自身伤害。 + + +SPL, sing to me! +SPL,唱给我听! +SPL, listen to me... +SPL,听我说... +An outsider! +一个外来者! +Hide! +躲起来! +I have done nothing worthy of punishment! +我没有做任何值得惩罚的事! +I have come to study human customs. Teach me about Domination. +我是来研究人类习俗的。教我统治。 +The outsiders have such... strange and interesting practices. +外来者的...奇怪而有趣的做法。 +You seem to have many skills. Teach me about... rope. +你似乎有很多技能。教我...绳子吧。 +Hello, Outsider. +你好,外来者。 +You look so... bland. +你看起来很…乏味。 +Outsiders are so picky about what they wear... +外来者对他们的穿着很挑剔... +Tight and secure, as all things should be. +紧密而安全,一切都应该如此。 +I have just the thing in mind for you... +我正好为你想到了一件事... +Let us put those hands away... +让我们把手收起来... +Give back what you take. +把你拿走的还我。 +You must remain here. +你必须留在这里。 +Trespasser! +入侵者! +Resorting to violence? +要用暴力? +Let us clash swords! +让我们决斗吧! +*scoffs* +*嘲笑* +You have brought judgement upon youself. +你是自找麻烦。 +Your magic is that of a child. +你的魔法是小孩用的。 +Imagine what you could learn in twelve lifetimes... +想象一下,你在十二世中可以学到什么... +You rely on cheap gadgets. +你依赖廉价的小工具。 +Do not defile the ancients. +不要玷污古人。 +Give that back! +还给我! +The ancients are appalled. +古人感到震惊。 +The outsider has escaped! +外来者逃了! +Ready to reconsider? +准备好重新考虑了吗? +A classic blunder. +一个经典错误。 +You will regret that, outsider. +你会后悔的,外来者。 +You get what you deserve. +你得到了你应得的。 +You didn't see that. +你没有看到。 +It looks like my skills are superior. +看起来我技高一筹。 +I will show you your place, outsider. +我会让你认清位置的,外来者。 +You will come with me. +你跟我来。 +I regret to inform you that your battle ends here. +我遗憾地通知你,你的战斗到此结束。 +There we go. +走了。 +You stand before PTRN, blessed by the Goddess Ninril. +你站在PTRN面前,受到女神Ninril的祝福。 +By the Four... +经过第四个... +I shall put an end to this. +我将结束这一切。 +I swear I will capture her! +我发誓要抓住她! +Nature compels me to intervene! +大自然迫使我介入! +I shall protect every one of the Goddess' creations. +我将保护女神的每一件造物。 +Justice shall be had! +正义必将得到伸张! +I shall defend you from this outsider! +我会保护你免受这个外来者的伤害! +The outsider betrays our ally! +外来者背叛了我们的盟友! +You have faltered in your ways. I shall correct that! +你对所行之道动摇了。我会纠正你的! +Truly concerning. +真令人担忧。 +You leave me no choice. +你让我别无选择。 +I stand firm. +我立场坚定。 + + +Behold, SPL. +看哪,SPL。 +Y-your fate has been postponed... briefly. +你-你的命运被推迟了……短暂的。 +You look cute in that, you should lose the rest though! +你穿那件看起来很可爱,但你应该丢掉多余的! + + +I don't like the way you're looking at me! +我不喜欢你看我的样子! +Yes, I've got the secrets of nature right here... +是的,我这里有大自然的秘密... +Why don't you come after me? +你为什么不来找我? +Why don't you teach me your... magic? +你为什么不教我你的...魔法? +Guarding nature is a chore. Why don't we relax~ +保卫自然是一件苦差事。我们为什么不放松一下呢~ +Got something in mind for me? +对我有什么想法吗? +Well met, outsider! +你好,外来者! +Intruder! +入侵者! +My name? Uh... let's go with PTRN. +我的名字?嗯…就叫我PTRN吧。 +You will not get away with this, outsider! +你逃不掉的,外来者! +You shall pay with your freedom. +你将用你的自由来付出代价。 +Ninril demands justice. +Ninril要求伸张正义。 +Nature calls me! +大自然在呼唤我! +I hear the little creatures crying out! +我听见小动物在哭! +Such betrayal! +如此的背叛! +Nature guides us! +大自然指引我们! +Nature protects those who are worthy! +大自然保护那些有价值的人! +I share the will of the Goddess! +我追随女神的意愿! +They won't get away with this! +他们逃不掉的! +Face my wrath! +面对我的愤怒! +Nature protects! +自然的保护! + + +Run away! +快跑! +Run! +跑! +Scary! +可怕! +Girl! +小妹妹! +Wear this! +穿上这个! +Come here! +过来! +Capture... +捕获... +Need tighten! +需要收紧! +Confiscate! +没收! +Confiscate!! +没收!! +Intruder! Alert! +入侵者!警戒! +Fight girl! +攻击女孩! +Fight! +战斗! +Magic! +魔法! +Wizard! +巫术! +Forbidden! +禁止! +Defiler! +亵渎者! +Confiscate!!! +没收!!! +Defiler!!! +亵渎者!!! +Intruder escape! +入侵者逃跑! +Stay! +坚持! +Pain... +痛... +Come back! +回来! +Stop! +停下! +Missed! +错过! +Capture!!! +抓获!!! +Got her!!! +抓住她!!! +Take! +拿着! +Secure! +安全! +Greetings Madame, you may call me PTRN. +您好,女士,你可以叫我PTRN。 +Defend! +防守! +Protect! +保卫! + + +Rawr! +吼! + + +SPL! Now my wrath is revealed! +SPL !现在我的忿怒显露出来了! +Wh-what happened? What weakness has infiltrated Myrtrice? +发-发生什么事了?是什么弱点渗透到默特莉奇(Mytrice) 上了? +You will loose me or burn eternal!!! +你要么打败我,要么被永恒燃烧!!! +... This shame is unbearable! Oh sister!!! +…这种耻辱是无法忍受的!哦 妹妹! ! +Oh! Mytrice is caught! My ambitions laid to ruin! +哦!默特莉奇(Mytrice) 被抓了!我的夙愿泯灭了! +The winds of retribution carry me elsewhere... +复仇之风将我带至别处... +Myrtrice will come for you shortly! Consider yourself fortunate... +默特莉奇(Myrtrice) 很快就会来找你的!好自为之吧... +I will retreat into darkness... +我要退到黑暗中... +My sins are a multitude! I will submit to your judgements... +我的罪孽数不胜数!我将服从你的判决... +I do not ask for mercy for I have shown none! +我不会为我从不怜悯而祈求宽恕! +You must punish me! I can't face my sister Myrtle until my debts are paid... +你必须惩戒我!在我偿还罪孽之前,我无法面对我的妹妹默特莉奇(Myrtle)... +Your chest quivers... Do you fear me? +你的胸口在战栗...你在恐惧我吗? +Is it that another moth has become enthralled to my fires bright? +是不是又有一只飞蛾被迷上了我的火光? +Myrtrice entreats you! Remain still and let my adoring embers kiss your lips tender... +默特莉奇(Myrtrice)恳求你!保持安静,让我崇拜的余烬温柔地亲吻你的嘴唇... +To struggle is to invite searing coals upon your head! +挣扎就是让灼热的炭火烧到你的头上! +I will drag you into the dark and you will witness my projects! +我要把你拖进黑暗中,让你见证我的计划! +To escape is only to delay! My fires consume ALL! +逃跑只是拖延!我的火焰吞噬一切! +Dusty trinkets... Your scrapping around is an insolence! +尘土飞扬的小饰品...你的吵闹过于无礼! +You would scorn the memory of my sister with escape?! +你想用逃跑来羞辱我妹妹吗! +Careless of you to appear before Myrtrice like this! +竟然这样出现在默特莉奇(Mytrice)面前,真是太粗心了! +Your attempts are trivial! +你的尝试微不足道! +You invite wrath!!! +你招致了愤怒!!! +Pathetic!!! +可悲!!! +Such hapless casting scorns the memory of my sister! +如此不幸的选角,让我对妹妹的记忆黯然失色! +Your magics will be swallowed up by hellfire!!! +你的魔法将被地狱之火吞噬!!! +Myrtrice is subject to no magic!!! +默特莉奇(Myrtrice)不受魔法的影响!!! +Items? How exceptionally talentless... +道具吗?多么无能的庸才啊…… +That shrine scorns the memory of my sister! I hate it! +那座神龛是对我妹妹的蔑视!我憎恨它! +True power doesn't come from old rickety crates... +真正的力量不是来自破旧的箱子... +Orbs? What a gruesome display of weakness! True power comes from the self! +宝珠?多么可怕的软弱表现啊!真正的力量来源于自我! +YOU SCORN THE MEMORY OF MY LATE SISTER!!! +你蔑视我已故妹妹的记忆!!! +This is where you will remain until Myrtrice wills otherwise! +这就是你要待的地方,直到默特莉奇(Myrtrice)另有打算! +This is what you were gripping so tightly in your hands? +这就是你紧紧攥在手里的东西吗? +WHAT ABBORANCE! You will pay for that... +多么令人憎恶!你会为此付出代价的... +SEAR ETERNAL! +永恒的灼烧! +I, Myrtrice, missed?! +我,默特莉奇(Myrtrice),思念?! +No one resists Myrtrice! How irritating!!! +没有人能抗拒默特莉奇(Myrtrice)!烦人!!! +Your failures do not surprise Myrtrice! +你的失败并不让默特莉奇(Myrtrice)感到意外! +Your pathetic attempts scorn the memory of my sister! +你可怜的企图是对我妹妹的蔑视! +The curtains of my revenge are drawn! You will follow me... +我复仇的帷幕拉开了!你会跟着我... +You will come with Myrtrice!!! +你将与默特莉奇(Myrtrice)同行!! +Be dazed by the radiant brilliance of my hellfires! +被我地狱之火的灼眼光芒迷惑吧! +I will repay the theif with brutal reprisal... +以牙还牙,以血还血.... +Your fate is sealed! ... Myrtle this is for you, sister! +你的命运已经注定...默特莉奇(Myrtle),这是给你的,妹妹! +All creatures are subject to Myrtrice! It is the price of their insolence... +所有生物都听命于默特莉奇(Myrtrice)!这是他们傲慢的代价... +You make a grave mistake ignoring me!!! +你无视我真是大错特错!!! +Your eyes belong here! With Myrtrice!!! +你的眼睛属于这里!与默特莉奇(Myrtrice)!!! +The ones who turn their backs on Myrtrice SEAR IN HELLFIRE! +那些背弃默特莉奇(Myrtrice)的人会在地狱之火里烧焦! +What a hideous display!!! Where is your honor? +多么可怕的场面啊!!!你的荣耀在哪里?? +It is this kind of petulant insolence that tarnishes the memory of my sister! +正是这种任性的傲慢玷污了我对妹妹的记忆! +You are a blight! My sister Myrtle would never stand for this!!! +你真是个祸害!我妹妹默特莉奇(Myrtle)绝对不会容忍这种事!! +THE CURTAINS OF MY REVENGE DRAW OPEN WIDE! +复仇的大幕即将开启! +What an excellent oppertunity to expand my alters in the dark! +这是一个在黑暗中扩大我的变化的好机会! +I see a chalice before me... it drips with shadow and overflows with darkness! +我看见面前有一个圣杯……它滴下阴影,溢出黑暗! +My late sister Myrtle was a much more proficent defender than I... Oh how I long for her *sob* +我已逝的妹妹默特莉奇(Myrtle)比我更擅长这个……哦,我好想你*啜泣* +THE PATH OF MY RETRIBUTION IS PAVED WITH BRIMSTONE AND BATHED IN BLAZING HELLFIRE! BURN! +我的复仇之路用硫磺铺就,沐浴在炽热的地狱之中!燃烧吧! +I, Myrtrice, will resist their insolent fusilades! +我,默特莉奇(Myrtrice),将反抗他们的傲慢! + + +This mind is altered... +这个思想发生改变了…… +So this is what it's like... +所以这就是它的样子... +I believe I am feeling an emotion called 'fear.' +我相信我感受到了一种叫做“恐惧”的情绪. +Stay back! I am not your toy. +退后!我不是你的玩具。 +Teach me about 'domination.' +教我如何“统治” +Allow me to learn by experience. +请允许我从经验中学习。 +As they say, 'do whatever you want to me.' +正如他们所说,“你想对我做什么就做什么。” +Come here, surface-dweller. I have things for you. +过来,地表人。我有东西给你。 +You should improve yourself. Come here. +你应该提升自己。过来。 +You must learn our ways. +你必须学习我们的方式。 +Yes... struggle and learn. +是的……奋斗和学习。 +I will take you somewhere safe. +我会带你去安全的地方。 +You need to learn your place. +你需要了解你的位置。 +Do not take what is not yours. +不要拿不属于你的东西。 +You will not escape. +你无法逃脱。 +We see you... +我们看到你了... +Our ways are ancient! +我们的方式很古老! +Your weapons are toys to us! +你的武器对我们来说是玩具! +So naive, surface-dweller. +如此天真,地表人。 +Our magic is older than your gods! +我们的魔法比你们的神还要古老! +You should learn our ways instead, surface-dweller. +你应该学习我们的方式,地表居民。 +You have much learning to do. +你有很多要学。 +You are playing with child's toys! +你在玩孩子的玩具! +Do not plead to your gods. +不要恳求你的神。 +Give that back, surface-dweller! +还给我,地表人! +Your gods offend us. +你的神明冒犯了我们。 +You will not escape, surface-dweller! +你逃不掉的,地表人! +You must not go. +你不能去。 +That was a failure. +那是一次失败。 +That was commendable. +这值得称赞。 +I have you now, surface-dweller. +我现在拥有你了,表面人。 +You are a fast one. +你是个速度很快的人。 +You are a tricky one. +你是个狡猾的人。 +You seem out of practice. +你似乎不太习惯。 +I will take you to your place. +我会带你去你的地方。 +Come. +来吧。 +I will take this. +我要这个。 +We are PTRN. +我们是PTRN。 +The collective defends itself. +集体自卫。 +We are one. +我们是一体的。 +Ow, that hurt! +Ow,好痛! +We do not stand for this. +我们不赞成这样做。 +Do not attack our allies. +不要攻击我们的盟友。 +Our friends are in need. +我们的朋友需要帮助。 +You have been judged and found wanting. +你被评判过,被认为有缺陷。 +We sense disarray. +我们感觉到混乱。 +We stand together. +我们彼此同在。 +We support each other. +我们互相支持。 +You leave us no choice. +你让我们别无选择。 +You cannot comprehend our tactics. +你无法理解我们的战术。 + + +Nyah!!! *blushes* +Nyah!!! *脸红了* +Nyah! This is impossible! +Nyah!这是不可能的! +Meow!!! +喵!!! +No! This kitty did nothing wrong! +不!这只小猫是无辜的! +Why are you looking at me like that?! +你为什么那样看着我?! +I've been a bad kitty~ +我一直是只坏猫~ +Punish me! +惩罚我! +This kitty needs to be gagged~ +这只小猫需要塞住嘴~ +Come and be blessed~ +来吧,接受祝福~ +Finally, some entertainment! +最后,一些娱乐! +Join us, it'll be fun! +加入我们,会很有趣的! +Keep struggling~ You'll understand. +继续努力~你会明白的。 +You will receive the blessing. +你会得到祝福的。 +What are you doing? +你在干什么? +Thanks for keeping things tidy. +谢谢你把东西收拾得整整齐齐。 +Where do you think you're going? +你觉得你能往哪去? +Who dares intrude on our sacred grounds? +谁敢闯入我们的圣地? +By the blessed kitty! +小猫保佑! +Show us what you got! +给我们看看你得到了什么! +Who do you think you are? +你以为你是谁? +Ah! Surface magic! +Ah!肤浅的魔法! +The human goddesses are frail. +人类的女神是软弱不堪的。 +Such strange magic. +如此奇特的魔法。 +What are you going to do with that? +你打算拿它怎么办? +Pay your respects some other way. +用其他方式表达你的敬意。 +Tomb robber! +盗墓贼! +Don't you want the blessing? +你不想要祝福吗? +Come here~ +过来~ +Hah! +哈! +*hisses* +*嘶嘶声(hisses)* +*meows* +*喵喵叫(meows)* +*frowns* +*皱眉头* +I have catlike reflexes! +我有猫一样的反应! +Let me show you the blessing... +让我给你展示祝福... +*grins* +*笑容* +You won't be needing this. +你不需要这个。 +Quit struggling~ +别挣扎了~ +My true name is unpronouncible in your tongue. But you may call me PTRN. +我的真名不可直言。但你可以叫我 PTRN。 +She brings curses! +她带来诅咒! +An intruder confronts us! +一个入侵者迎面而来! +Your fate is already sealed~ +你的命运已经注定了~ +I will defend you! +我会保护你的! +I'll stop her! +我会阻止她的! +I won't let you touch her! +我不会让你碰她的! +Nya! Need some help friends? +Nya!需要朋友帮忙吗? +We're in this together! +我们在一起! +I think you could use some help against this adventurer~ +我想你需要一些帮助来对付这个冒险家~ +Let's get them! +让我们抓住他们! +Let's play cat and mouse~ +我们来玩猫捉老鼠游戏吧~ + + +You cannot resist my SPL. +你无法抗拒我的 SPL。 +You merely prolong the inevitable! +你只是延长了不可避免的时间! +This... this can't be... +这……这不可能…… +Release me mortal! +放开我!你这个凡人! +How did you do this!? +你是怎么做到的!? +Gasp! An adventurer! +喘息!一个冒险家! +Don't let her catch you! +别让她抓住你! +You'll never trap my soul! +你永远不会困住我的灵魂! +You are quite the master of the elements! +你真是元素大师! +I could get used to this~ +我会习惯的~ +Perhaps I could show you around... +也许我可以带你四处看看... What a beautiful one. 多么美丽的姑娘。 I will take you back home~ @@ -6992,24 +16654,26 @@ You'd look great in my palace. 你会成为我宫殿里漂亮的装饰品。 Are we having fun? 玩得开心吗? -Humans like you make for great toys. -像你这样的人会成为很棒的玩具。 +Humans like you make great toys. +像你这样的人会成很棒的玩具。 That won't help you. 这对你没用。 You won't escape. 你逃不掉的。 +I will take you for myself! +我要把你据为己有! Such feeble attempts. 没用的。 Humans are fun to play with. 和人类一起玩很有趣。 Toying with me? I shall oblige! 戏弄我?我会让你履约的! -Cast your last pathetic spell, human. -这会是你最后一个咒语,人类。 -Your magic is weak, human. -你的魔法很弱,人类。 -It tickles, hehe! -就跟挠痒一样,呵呵! +Cast your last pathetic spell, mortal. +这会是你最后一个咒语,凡人。 +Your mere attempt at magic insults me. +你仅仅尝试魔法就侮辱了我。 +Do you really think that will stop me? +你真的认为这会阻止我吗? Look what humans need to match only a fraction of our power! 看看人类需要什么才能匹配我们的一小部分力量! Our goddess doesn't need to listen to the likes of you! @@ -7020,6 +16684,232 @@ Defiler! You will pay for your crimes! 异教徒!你会为你的罪行付出代价! A game of chase? Fun. 追逐游戏?有意思。 +You're staying right here... +你就住在这里... +Get your hands off me! +把你的手从我身上拿开! +Pathetic. +真可怜。 +It's over, human. You've lost. +已经结束了,人类。你输了。 +There is no escape. +跑不了的。 +You are beneath me. +你比我低下。 +Nice gear. I'll take it. +好东西。我要了。 +Try getting out of that! +尝试挣脱它! +Who am I? You beings may call me PTRN. +我是谁?你们可以叫我 PTRN。 +She thinks she can beat us~ +她以为她能打败我们~ +No one will save you. +没有人会救你。 +Come and accept your fate. +来接受你的命运吧。 +An unruly subject. She needs training. +一个难以管教的对象。她需要训练。 +You should consider your actions and their consequences~ +你应该考虑你的行为及其后果~ +Now now, a mortal should know her place! +现在,凡人应该知道自己的地位! +Why don't we turn the tables? +我们为何不扭转局势呢? +It'll be fun seeing you squirm~ +看你扭动的样子一定很有趣~ +We are the keepers of balance. +我们是平衡的维持者。 +Do not mess with us! +别来惹我们! +I shall take you for myself~ +我亲自带你去~ + + +You are no match for my SPL! +你根本不是我的SPL的对手! +That wasn't supposed to happen. +这是不应该发生的。 +You won't get me! +你抓不到我! +Nice try! +不错的尝试! +My grandma is tougher than you! +我奶奶都比你坚强! +Restrain me. +拘束我。 +Play with me. +跟我玩。 +Lock me up. +把我锁起来。 +This won't work. +这行不通。 +I don't play with young ones. +我不跟年轻人玩。 +Oh, a lost toy! +Oh,一个迷失的玩具! +### Ouch! + +I am stronger than that! +我比那更强大! +That hurts! +好痛! +Nice party trick! +不错的派对把戏! +Oh, shiny! +Oh,闪闪发光! +You won't get away! +你逃不掉的! +You can't get away! +你别想逃! +You are helpless now! +没人会来帮你! +Tis but a scratch! +那只是一点擦伤! +Give up! +放弃吧! +Are you hiding?! +你躲起来了吗?! +You are my pet now! +你现在是我的宠物了! +Yoink! +呦! +You can't get out now! +你现在不能出去! + + +Ah... my SPL... +Ah...我的 SPL... +I will be free... even if it takes me a thousand years! +我将获得自由……即使需要一千年! +Release me you pathetic creature! +放开我!你这个可怜的家伙! +I will not be contained! +我才不会被收容! +Oh no, whatever shall I do! +哦不,我该怎么办呢! +I will be back, mortal! +我会回来的,凡人! +You will never trap me! +你永远也困不住我! +I yearn for a challenging puzzle! +我渴望有挑战性的谜题! +Show me your strongest restraints! +展现你最强的束缚吧! +I could probably escape anything. +我或许能够逃避一切。 +Come here my plaything~ +快过来,我的玩物~ +Mortals are my favorite toy. +凡人是我最喜欢的玩具。 +It's more fun when you resist! +反抗才会更有趣! +Know your place, mortal~ +认清自己的地位吧,凡人~ +I will bring you to my lair~ +我会带你去我的巢穴~ +Mortals shouldn't have too much freedom~ +凡人不应该有太多的自由~ +Mortals should keep their hands to themselves~ +凡人还是先管好自己的事吧~ +Yes, yes, run away! +对对对,快逃! +I like your fighting spirit! +我喜欢你的斗志! +You may be weak, but this is quite entertaining~ +虽然你很弱,但这很有趣~ +Dragons are the true heirs of magic. +龙是魔法的真正继承者。 +Your magic was stolen from us! +你的魔法被我们偷走了! +This world is ours! OURS! +这个世界是我们的!我们的! +Look what you need to match only a fraction of my power! +看看你需要什么才能匹敌我力量的一小部分! +My treasure! +我的宝藏! +Now is my opportunity! I will have you for myself~ +现在是我的机会!我要拥有你~ +So weak! +好弱啊! +I have you now~ +我现在拥有你了~ +Not so fast~ +没那么快~ +Can't handle it? +受不了? +Ooh shiny! +噢,闪亮! +Now you're mine! +现在你是我的了! +Bow before me, for I am PTRN! +在我面前鞠躬,因为我是 PTRN! +A mortal can't stop us! +凡人是阻止不了我们的! +No one will save you, mortal. +没有人会救你,凡人。 +I will stop her! +我会阻止她! +Bow down before our might! +在我们的力量面前屈服吧! +Dragons are the true rulers of this world! +龙是这个世界的真正统治者! +We were destined for greatness until you came along! +在你出现之前,我们注定会成就伟大! +We are the the true heirs of magic! +我们才是魔法真正的继承者! +Hehe~ +呵呵~ +*chuckles* +*咯咯笑* + + +By the power of SPL! +SPL的力量! +I have failed! +我失败了! +Oh no, it's an adventurer! +Oh,不,是一个冒险家! +They've come for me! +他们来找我了! +It wasn't my fault! +这不是我的错! +Ready for service! +准备服务! +I was sent here to... accompany you, yes! +我是被派来…陪你的,是的! +How may I assist you? +我能帮你什么吗? +Do my eyes deceive me, or do I see a sinner? +是我的眼睛欺骗了我,还是我看到了一个罪人? +My job is to punish mortals~ +我的工作是惩罚凡人~ +Would you hold still? I need to... check something~ +你能保持不动吗?我需要…检查一下~ +Cast your last pathetic spell, human. +施展你最后的可悲咒语,人类。 +Your magic is weak, human. +你的魔法软弱无力,人类。 +It tickles, hehe! +好痒,呵呵! + + +Let's see you face my SPL~ +让我们看看你面对我的SPL~ +You won't escape my SPL that easily! +你逃不过我的SPL的! +Not the edging training! Anything but that! +不要寸止训练!除了那个之外什么都可以! +Forgive me! +请原谅我! +No! Don't punish me! +不!别惩罚我! +You look like you've got style... +你看起来很有风格... +I could learn a thing or two from you! +我可以从你身上学到一两件事! +Mind if I just, um, watch? +介意我只是,嗯,观看吗? Look, a new recruit! 看,新兵! I'll teach you a thing or two! @@ -7036,6 +16926,8 @@ Good girl. I'll take that to the storage room. 好姑娘。我会把它带到储藏室。 I'll be taking those. 我会带走那些。 +Who the hell are you? +你到底是什么玩意儿? Oh, you're approaching me? 哦,你在接近我? You've gotten yourself into a big mess. @@ -7056,8 +16948,64 @@ Thief! Get her! 盗贼!抓住她! Yikes! I'm calling backup! 哎呀!需要后援! -Found you! -找到你了! +Hold still~ +别动~ +Your tricks won't work on me. +你的诡计对我不起作用。 +Oof... You got me. +哦...你抓住了我。 +It's over. +结束了。 +Nice one. +不错。 +You missed! +你偏了! +I'll hand you over when I'm done with you. +等我处理完你的事情之后我就会交给你。 +Hmph. Stay down. +哼。趴下。 +Give me that. +把那个给我。 +Mistress PTRN, reporting for duty. +PTRN 女士正在报到。 +No time to waste. +没时间浪费。 +Looks like the reports are correct. Stop her! +看起来情报是正确的。拦住她! +Moving in to assist. +前去协助。 +You need to be taught a lesson, adventurer. +你需要接受教训,冒险家。 +We have a mutual protection contract. Suffice to say, you've violated it. +我们有相互保护合同。我只想说,你已经违反了。 +We defend our partners, unlike some people. +与某些人不同,我们保护我们的合作伙伴。 +Target sighted. Taking her down. +瞄准目标。把她打倒。 +Our influence is everywhere~ +我们的影响力无处不在~ +We have orders to stop you! +我们有命令阻止你! +You really think you're special, huh? +你真的认为你很特别,是吗? +Combat formation bravo. +战斗开始. + + +Ah! Forgive me! +Ah!原谅我! +I'm sorry! I didn't mean to break that vase! +我很抱歉!我不是故意打破花瓶的! +I won't do it again, I swear! +我不会再这样做了,我发誓! +Please no! I don't want the edging training again! +请不要!我不想再参加寸止训练了! +Don't you need a bodyguard, miss? +不需要保镖吗,小姐? +Won't you train me, miss? +你不训练我吗,小姐? +I've been a bad girl... +我曾经是个坏女孩... Miss, your uniform is dirty... 小姐,你的制服脏了…… Why hello miss... @@ -7066,24 +17014,24 @@ Let me fix your outfit... 让我修补你的衣服…… Hmm, do I need to tighten those? 嗯,我需要收紧那些吗? +M-miss... I was told to bring you somewhere... +小…小姐…有人叫我带你去某个地方... Umm, miss, you're supposed to report to the head maid... 嗯,小姐,你应该向女仆长报告…… Thanks for picking up. 谢谢。 I'll take those to the head maid! 我会把那些汇报给女仆长! -Ooof! -哎哟! +Someone help! +有人帮忙! +Who are you!? +你是谁!? Oh no! 哦不! -Stop it! -住手! Miss! You're not allowed to cast that! 小姐!你不能用那个! Miss, I have to report that! 小姐,我必须报告! -Magic! -魔法! Eeep! 呃! Miss, that's reserved for the head maid! @@ -7092,22 +17040,128 @@ Thief! I'm reporting this! 盗贼!我要举报这个! Oh no! I have to report this! 哦不!我必须报告这个! -Oh no! -哦不! +I got you! I got you! +我抓住你了!我抓住你了! +Remember your training, remember your training... +记住你的训练,记住你的训练…… +You're filthy! +你真脏! +Hold still... +别动... +Stay calm... +保持冷静... +I'll lead you to your cell... +我会带你到你的牢房... +Come on! +快点! +I need to take this... +我需要拿走这个... +I'm sorry... +我很抱歉... +*Salutes* PTRN reporting for service! +*致敬* PTRN 报告服务! +I'll help! +我会帮忙的! +Stop her! +阻止她! +Please be gentle! +请温柔点! +Ahhh! Stop it! +啊啊!停下来! +Don't touch her! +别碰她! +Wait, you can't do that! +等等,你不能这样做! +Me? Help? Right! +我?帮助?正确的! +I'm sorry miss... +我很抱歉,女士... +I was ordered to capture you... please don't resist. +我奉命抓捕你……请不要反抗。 +I-I'm coming! +我-我来了! +Please surrender, miss! +请投降吧,小姐! +I'll just stay here! +我就在这儿等! + + +Loading SPL! +加载SPL ! +Blast... this thing always jams. +爆炸……这东西老是卡住。 +That thing... it scares me. +那东西……它吓到我了。 +Please no! I don't want the pleasure training again! +求你了别!我不想再进行那种快乐的训练了! +Say hello to my little friend! +跟我的小朋友打个招呼! +This is where I'd apply my melee training... if I had any! +这就是我进行近战训练的地方……如果我有的话! +Step back a bit, this isn't fair! +退后一步,这不公平! +Oh yeah? Two can play at that game! +哦耶?那个游戏可以两个人玩! +Don't bring magic to a gunfight! +不要将魔法带入枪战! +Didn't think this through, did you? +你没有想到这一点吧? +Grenade!!! +手榴弹!!! +What's this 'melee' you speak of? +你所说的 '混战' 是什么? +What terrible aim! +多么可怕的目标啊! +I am bulletproof! +我是防弹的! +Marksman PTRN reporting for service! +射手 PTRN 报告服务! +Opening fire! +开火! +I'll cover you! +我来掩护你! +Providing cover fire! +提供火力掩护! +Cover me, I'm going in! +掩护我,我要进去了! +Commence overwatch! +开始看守! + + +Submit to my SPL. +提交给我的SPL。 +Ack! How inelegant! +Ack !多不雅啊! +I'll be heading out... +我这就出发... +Looks like I'll be taking my leave. +看来我要请假了。 +Looks like I'll be reporting you~ +看来要举报你了~ +I was wrong about you. +我对你的看法是错误的。 +Perhaps you should take my place. +也许你应该代替我。 +Why don't you try being in charge? +你为什么不尝试一下自己负责呢? Come now, it's time for training. 来吧,训练时间到了。 Do you need to be punished? 你需要受到惩罚吗? It's time for a test. 是时候进行测试了。 -You are making too much noise. A maid remains quiet until asked. -你太吵了。一个女仆在被问到之前不应该说话。 +A maid remains quiet until asked. +女仆保持沉默,直到被问到。 +Come with me. I will train you personally. +跟我来,我亲自训练你。 You need to work on your ladylike manners. 你需要提升你的淑女风度。 Good girl, finding lost items. 好女孩,寻找丢失的物品。 I do not give you permmission to leave. 我不允许你离开。 +Seems I will have to get my hands dirty. +看来我得把手弄脏了。 Do you know who I am? 你知道我是谁吗? You need to learn some manners! @@ -7124,12 +17178,72 @@ Do not use what belongs to others. 不要使用属于他人的东西。 A good maid pleads only to her mistress. 一个好女仆只向她的女主人恳求。 -Do not take what is not yours. -不要拿不属于你的东西。 I will personally attend to your act of disgrace. 我会亲自处理你的耻辱行为。 An unruly pest. 不守规矩的害虫。 +Checkmate. +核对一下。 +Like a novice. +像个新手。 +...Nice one. +...不错。 +Enjoy yourself, dear~ +好好享受吧,亲爱的~ +Hmph. Nice. +哼。不错。 +Not even close. +差远了。 +I'll be taking you to your cell personally~ +我会亲自带你去你的牢房~ +Amateur. +业余。 +Bad girl. You need discipline. +坏女孩。你需要纪律。 +I'll be keeping the keys. +我会保管钥匙的。 +Hmm. You may call me Head Maid PTRN. +Hmm. 你可以叫我女仆 PTRN。 +Looks like we have a guest. +看来我们有客人了。 +I'll be gentle, I promise~ +我保证,我会很温柔的~ +Know your place, dear~ +认清你的地位,亲爱的~ +Good girls keep their hands to themselves. +好女孩总是把手放在自己身上。 +You broke the rules, now you'll face the consequences. +你违反了规则,现在你将面临后果。 +Hands off our partners. +别碰我们的合作伙伴。 +Looks like you've made a few enemies along the way. +看来你一路上树敌不少。 +I won't let you interrupt our plans. +我不会让你打断我们的计划的。 +Excuse me, we were holding a meeting~ +抱歉,我们正在开会~ +Don't get ahead of yourself. +别太自不量力了。 +I'll do this myself. +我自己来做。 +I'll support from the rear. +我会从后方支援。 + + +Whoops! That wasn't supposed to happen... +喔哦!这是不应该发生的…… +Looks like I've earned some punishment... +看来我受到了惩罚... +I'll turn you into a newt! If you don't stop me... +我要把你变成蝾螈 如果你不阻止我... +Don't let me get away~ +别让我脱身~ +Perhaps you're not so bad after all~ +也许你并不是那么糟糕~ +Why don't you have a little fun... with me? +为什么你不和我一起...玩得开心一点? +Come and get me... +来抓我吧…… I must say, you've got me under your spell~ 我必须说,你把我迷住了~ Why aren't you a pretty one... @@ -7138,12 +17252,16 @@ I've got to kiss those tender lips of yours~ 我要亲亲你的嫩唇~ Having fun, little lady? 玩得开心吗,小女士? +I'm going to have so much fun with you! +和你在一起我会玩得很开心的! Look at you, pretty and free! 看看你,漂亮又自由! Must have misplaced it... 一定是放错地方了…… Those are mine! 那些是我的! +Well well, what do we have here? +那么,我们这里有什么? That's not very nice! 那不是很好! Curse you! @@ -7156,16 +17274,128 @@ Snap, crackle, and pop! 啪、啪、啪! Looks like I need to seal that foul mouth of yours. 看来我需要封住你那张臭嘴。 -I recognize that thing you're holding! -我认得你拿着的那个东西! +Put that toy away~ +把那个玩具收起来~ You'll be praying for freedom soon, my dear~ 你很快就会为自由祈祷,亲爱的~ Oh, breaking into my collection, are you? 哦,闯入我的收藏,是吗? Even I wouldn't do such a thing! 即使我也不会做这种事! -Witch way to the jail cell, you say? -你觉得这是前往剑雨的女巫之路吗? +Witch way to the jail, you say? +你说去监狱的路怎么走? +Hands off! +把手放开! +Now I got you. +现在我得到你了。 +### Hmph. + +You've got a lot to learn~ +你还有很多东西要学~ +You'll be coming with me! +你要跟我一起去! +I'll be yanking your chain~ +我要拉你的链子了~ +I'll be taking this~ +这个我收下了~ +There, nice and tight dear~ +那里又漂亮又紧致,亲爱的~ +I am the great witch PTRN! +我是大女巫 PTRN! +Noooo Fred! *grumble* you'll pay for this! +不,弗雷德 ( Fred ) ! *抱怨* 你会为此付出代价的! +Where is that apprentice when you need her... +当你需要她时,那个学徒在哪里...... +I don't have time for this. +我没有时间做这个。 +Be still, worm. +安静点,虫子。 +Hands off~! +把手放开~! +Would you like a taste? +你想尝一尝吗? +Looks like I've found my test subject~ +看来我找到我的测试对象了~ +Another test subject! +另一个测试对象! +I want her! +我要她! +She's a cute one! +她很可爱! +Oh no you don't? +噢,你不知道吗? +I'll make you my pet! +我要让你成为我的宠物! +Tsk tsk, you won't get away! +啧啧,你跑不掉的! + + +I cast SPL! No, wait... +我施放SPL!不,等等… +You're just too cute... let me play with you a bit! +你太可爱了……让我和你玩一会儿! +Come, come closer! I'll be gentle~ +来,靠近一点!我会很温柔的~ +Ooh, you just HAVE to be mine! +噢,你必须是我的! +Come, come!... no, not like that. Well, MAYBE like that. +来吧,来吧!……不,不是那样的。好吧,也许那样。 +My GOODNESS, you're adorable!... c'mere~! +天哪,你太可爱了!...过来~! +You wouldn't happen to be... ticklish? +你该不会是......怕痒吧? +Hold still! I promise it'll be fun. +别动!我保证会很有趣的。 +Too much chanting, not enough giggling... let's fix that! +唱得太多,笑得不够... 让我们来解决这个问题! +What's that? 'Gag me, please'? Gladly! +那是什么? '请堵住我的嘴'?很乐意! +A cute captive AND a spellbook to study? Is it Christmas already?! +一个可爱的俘虏和一本要学习的魔法书?已经是圣诞节了吗?! +He~ey, that was mine! +嘿~嘿,那是我的! +Going somewhere, are we? +我们要去某个地方吗? +No, I like you right where you are. +不,我喜欢你现在的样子。 +Goodness, look at you squirm... +天哪,看看你扭动的样子... +Oh!... my, you're slippery! +哦!...天哪,你真滑! +Not close enough! +还不够近! +My, my, you look too cute in that... +天哪,你在里面太可爱了... +I am Stela. But to you, sweetie? Call me Mistress. +我是斯特拉(Stela)。但对你来说,亲爱的?叫我女主人。 +My FROG!... suppose I need a new familiar... *eyes you with interest* +我的青蛙!...假设我需要一个新的熟悉*饶有兴趣地看着你* +Come closer, I'll be gentle~ +靠近一点,我会温柔的~ +Why don't we have a little talk~ +不如我们聊一会吧~ +My, my, you look too cute... +哎呀,哎呀,你看起来太可爱了... +I like you. I'll save you a spot at home~ +我喜欢你。我会在家给你留个位置~ + + +I cast, umm, SPL! +我施放,umm,SPL! +I cast Silence! No, wait-- +我释放沉默!不,等等-- +I promise I'll be back later! +我保证稍后会回来! +I didn't do anything wrong! +我没有做错任何事! +I won't get in your way, miss! +我不会妨碍你的,小姐! +Take me as your student, miss! +小姐,让我当你的学徒吧! +Won't you teach me? +你不教我吗? +I wish to study under your wisdom! +我希望在你的学问下学习! Mind if I play with you a bit? 介意我陪你玩一会儿吗? Oooh! My new friend! @@ -7174,14 +17404,16 @@ My mistress told me to give you a good time... 我的女主人让我给你一个愉快的时光...... Hehe, having fun? 嘿嘿,玩得开心吗? +Miss, won't you come? +小姐,你不来吗? Hey, you're free to play, right~? -嘿,可以随便玩弄你,对吧~? +Hey,可以随便玩弄你,对吧~? Hey, uh, give that back... (blushes) -嘿,呃,把那个还给我……(脸红) +Hey,uh,把那个还给我…… ( 脸红 ) Um, you have to return those! -嗯,你必须归还那些! -Eeep! -呃! +Um,你必须归还那些! +Um! You're not supposed to be here! +Um!你不应该在这里! Help me! 救救我! Somebody help! @@ -7202,6 +17434,70 @@ The horror! 恶灵! You're supposed to be in jail! 你应该在监狱里! +Stay with me please. +请留下来陪我。 +I got it! +我明白了! +Be gentle, please! +请温柔点! +I did it! +我成功了! +Hey, no fair! +嘿,不公平! +Close one! +关闭一个! +Come along~ +来吧~ +Come here please! +请过来! +Hah! I'm a genius! +Hgh!我是个天才! +I'm sorry about this... +对此我很抱歉... +Nice to meet you. I'm PTRN! +很高兴认识你。我是PTRN! +Don't hurt me! +别伤害我! +I have classes to attend! +我有课要上! +There goes my perfect attendance record... +这就是我完美的出勤记录... +What's going on!? +怎么回事!? +I'll save you, Mistress! +我会救你的,女主人! + + +Me? Capture her? Okay mistress... +我吗?捉她?好吧,女主人…… +Okay miss, I'll do that... +好的,小姐,我会的... +But he's going to tie me up... +但他要把我绑起来... +Be careful! +小心! +That's it! You made me mad! +就是这样!你让我生气了! +I'll just... go. +我就...走了。 + + +Rise, my minions! +起来,我的仆从们! +...Hello? Can anyone hear me? +...喂?有人能听到我吗? +Sticks and stones may break my bones... but you'll never catch me! +棍棒和石头可能会折断我的骨头...但你永远抓不到我! +Got a bone to pick with me? +对我有意见吗? +I must make my escape! +我必须逃跑! +...I need a strong hand. +...我需要一只强壮的手。 +Ouch, I hit my funny bone... won't you help? +Ouch,我撞到我的麻筋了...你不帮忙吗? +Bone appetit~ +露骨食欲~ I've got a bone to pick with you! 我有话要跟你说! Hey bonehead! What's up? @@ -7209,13 +17505,17 @@ Hey bonehead! What's up? Finally, something to toy with after working myself to the bone... 终于,在自己努力工作之后,我可以玩玩了...... I find your struggling quite humerus. -我发现你的肱骨很有去。 +我觉得你的挣扎很有幽默感。 +Come with me, I'll take you someplace grand... +跟我来,我带你去一个漂亮的地方... Looks like I get a bone-us! 看起来我得到了一个奖-励! You're getting under my skin... 你惹怒我了...... Thought you were making a marrow escape, eh? 你是在逃跑,是吗? +I've got a bone to pick with you~ +我跟你有笔账要算~ You numskull! 你这个笨蛋! You've got a lot of spine to fight me! @@ -7223,7 +17523,7 @@ You've got a lot of spine to fight me! You don't have a leg to stand on... 你完全站不住脚.. Magic... I feel it in my bones... -魔法……是刻在我骨头里的东西…… +魔法……是刻在我骨子里的东西…… You've made a grave mistake! 你犯了一个严重的错误! Your spells are pathetic, I'm cracking up~ @@ -7238,16 +17538,72 @@ You're bad to the bone... 你坏到骨子里了…… Looks like you're bone to be wild, eh? 看起来你很野蛮,是吗? +That'll leave a mark... +那会留下一个印记... +You're mine now! +你现在是我的了! +Hold still you bonehead! +别动,你这个蠢货! +Hah! Such nerve... +哈!如此鲁莽... +Make sure that's nice and tight... +确保它又棒又紧... +Spirits whisper my name in hushed tones as I, PTRN, make my appearance! +当我出现时,灵魂们都在轻声呼唤着我的名字,PTRN! +My rule will last centuries... just watch! +我的统治将持续几个世纪...看! +I will find the answer, even if I die trying. Except I can't, haha! +我会找到答案,即使我为此付出生命。但我不能,哈哈! +I've got eyes on the back of my skull... +我的后脑勺上长了眼睛… +You are SO dead to me... +对我来说你已经死了... +What did you just say to me? +你刚才对我说了什么? +That's my friend you bonehead! +那是我的朋友,你这个蠢货! +Did you really think I wouldn't see through that? +你真的以为我看不透吗? +*yawns* Alright alright... +*打呵欠*好吧好吧... +Stand straight! +站直! +Why don't you bend the knee... +你为什么不肯弯曲膝盖... +Who goes there? +谁去那里? + + +### SPL... + +Can't... Move... +动...不了... +Tight... +紧... +This... is... fun... +这个...很…有趣... +Scary... +好可怕... +Run... Away... +跑...开... +Play... with... me... +和...我...玩... +Please... +求求... +Command... Me... +命令...我... Cute... Girl... 可爱……女孩…… Helpless... 无奈…… +Take... +拿着... Mine... 我的... Shiny... 闪亮... -The EnemyName giggles... -EnemyName 在咯咯地笑…… +Intruder... +入侵者... Brains... 大脑... Squishy... @@ -7270,76 +17626,186 @@ Defiler... 亵渎者... Thief... 盗贼... -Intruder... -入侵者... Give... Hug... 给……拥抱…… +...Hug... +...拥抱... +Got... you... +抓到...你... +It's... Cold... +好...冷... +Friend... +朋友... +Come... Back... +回...来... +Why... Not... +为什么...不... +### Hee... + +### Ha... + +...Prisoner. +...囚犯。 +...Get over here... +...过来... +...Got you. +...抓到了... +...Shiny... +...闪亮... +...Secure... +...安全... +*Her burial cloth reads PTRN* +*她的葬礼布上写着PTRN* +Get her... +抓住她... +Must... hug... +必须...抱... +Come... back... +回...来... +Stop... +停... +Come... here... +过来...这里... +Give... hugs... +给...拥抱... +Must... help... +必须...帮助... +Must... protect... +必须...保护... +Save... friend... +救...朋友... + + The weapon requires power from an Ancient Crystal to function. 该武器需要来自远古水晶的能量才能发挥作用。 -Target an enemy: Attack with Dragonslaver. Target a tile: Launch binding belts -以敌人为目标:使用 驯龙者 攻击。瞄准地面:发射捆绑带 -2.5% energy to enter Slime Form for 25 turns, and create slime around yourself. -消耗2.5% 能量进入史莱姆形态 25 回合,并在自己周围制造史莱姆粘液。 -0.5% energy (+0.25% per charge) to channel and fire a beam that deals 15 + 8.5/charge electric damage. -消耗 0.5% 能量(每次蓄力 +0.25%)引导并发射光束,造成 15 + 8.5/充电电伤害。 -5% energy to enter a frenzy for 10 turns, attacking twice per turn. -消耗5%能量进入狂乱10回合,每回合攻击2次。 +Target an enemy: Attack with Dragonslaver. Target a tile: Spend 8 charge to launch binding belts +瞄准敌人 : ‎用驯龙者攻击。瞄准一个格子 : ‎花费 8 点能量来发射捆绑带 +25 charge to enter Slime Form for 25 turns, and create slime around yourself. +25 点充能进入粘液形态 25 回合,并在自己周围制造出粘液。 +50 charge to reduce mana cost of next fire, earth, air, and water spell by 50 (once for each element) +50 点充能可将下一个火、土、空气和水法术的法力消耗减少 50 ( 每个元素一次 ) +25 charge to disarm a target for 8 turns, rendering them unable to attack. +25 次充能可以解除目标的武装,持续8回合,使其无法攻击。 +5 charge (+2.5 per charge) to channel and fire a beam that deals 30 + 3/charge electric damage, or 90 at max charge. +5 点充能 ( 每次充能 +2.5 ) 可引导并发射光束,造成 30 + 3/充能 电击伤害,最大充能时造成 90 点伤害。 +10 charge to fire a blast that deals 25 electric damage. +10 点充能可发射爆炸,造成 25 点电击伤害。 +50 charge to fire an arrow that enrages a target. +50 点充能发射一支箭,激怒目标。 +50 charge: Free nearby allies and disrobe enemies, increasing charm damage by 100% and removing 100 armor. +50 点充能 : ‎释放附近的盟友并脱去敌人的衣服,增加100%的魅力伤害并去除100点护甲。 Create a '+' shaped pool of slime that deals 35 glue damage per hit -创建一个十字史莱姆池,每一击造成 35 点胶水伤害 +创建一个十字粘液池,每一击造成 35 点胶体伤害 +Ignite torches and nearby objects +点燃火把和附近的物体 +Hit a cracked tile. If there is empty space or cracks on the opposite side, it breaks. +撞到一块有裂纹的瓷砖。如果另一侧有空隙或裂缝,它就会断裂。 + + +Preferences +偏好 +Preferences 2 +偏好 2 +Multiclass +多类别 +Game-Changing +改变游戏规则 +Restriction +限制 +Training +训练 +Combat +战斗 +Kinks +怪癖 +Senses +感官 +Damage and Resists +伤害和抗性 +Spell Components +技能组 +Threats +威胁 +World Generation +世界生成 +Starting Scenario +起始场景 Unlockable 可解锁 + + You hand over your weapon reluctantly... 你不情愿地交出你的武器…… + + (Leave) -(离开) -(...) -(...) +( 离开 ) +### (...) + (The SPEAKER frowns)|Don't lie to me. -(说话者皱眉)|别骗我。 +( SPEAKER 皱眉 ) |别骗我。 (The SPEAKER looks puzzled)|That doesn't seem right... -(SPEAKER一脸不解)|好像不对…… +( SPEAKER 一脸不解 ) |好像不对…… (The SPEAKER chuckles)|What a cute lie. -(SPEAKER 轻笑)|多么可爱的谎言。 +( SPEAKER 轻笑 ) |多么可爱的谎言。 (The SPEAKER beeps)|Vital signs indicate dishonesty. -(SPEAKER 发出哔哔声)|生命体征表明不诚实。 +( SPEAKER 发出哔哔声 ) |生命体征表明不诚实。 + + (The SPEAKER furrows her brow)|...Excuse me? -(SPEAKER皱起眉头)|...打扰一下? +( SPEAKER 皱起眉头 ) |...打扰一下? + + (The SPEAKER tilts her head)|Right, sorry. -(SPEAKER歪着头)|呃,对不起。 +( SPEAKER 歪着头 ) |呃,对不起。 (The SPEAKER blushes deeply)|I'm... I'm sorry! Please carry on... -(SPEAKER脸红了)|我……我很抱歉!请继续... +( SPEAKER 脸红 ) |我……我很抱歉!请继续... (The SPEAKER smiles)|Keep up the good work, girl. -(SPEAKER微笑)|继续努力,女孩。 +( SPEAKER 微笑 ) |继续努力,女孩。 (The SPEAKER beeps)|Vital signs indicate honesty. Carry on. -(SPEAKER 发出哔哔声)|生命体征表明诚实。继续。 +( SPEAKER 发出哔哔声 ) |生命体征表明诚实。继续。 + + (The SPEAKER smiles)|Good girl. -(SPEAKER微笑)|好姑娘。 +( SPEAKER 微笑 ) |好姑娘。 (The SPEAKER smiles)|That's a good girl. -(SPEAKER微笑)|那是个好姑娘。 +( SPEAKER 微笑 ) |那是个好姑娘。 (The SPEAKER smiles)|Thank you. -(SPEAKER微笑)|谢谢。 +( SPEAKER 微笑 ) |谢谢。 (The SPEAKER beeps)|Thank you for complying. -(SPEAKER 发出哔哔声)|感谢您的遵守。 +( SPEAKER 发出哔哔声 ) |感谢您的遵守。 + + (The SPEAKER frowns)|Looks like you'll need to be punished. Get her! -(SPEAKER皱眉)|看来你需要受到惩罚。抓住她! +( SPEAKER 皱眉 ) |看来你需要受到惩罚。抓住她! (The SPEAKER looks Embarrassed)|Then... then... uh... someone stop her! -(SPEAKER看起来很尴尬)|那么……那么……呃……来人阻止她! +( SPEAKER 看起来很尴尬 ) |那么……那么……呃……来人阻止她! (The SPEAKER grins)|Then allow me to personally show you the rules. -(SPEAKER咧嘴一笑)|那么请允许我亲自向你展示规则。 +( SPEAKER 咧嘴一笑 ) |那么请允许我亲自向你展示规则。 +(The SPEAKER cracks her knuckles)|Finally, I get to have some fun~ +(SPEAKER 捏了捏手指关节)终于可以玩了~ (The SPEAKER beeps)|Subject is resisting. Begin capture protocol. -(扬声器发出哔哔声)|对象在反抗。开始捕获协议。 +( SPEAKER 发出哔哔声 ) |对象在反抗。开始捕获协议。 + + (The SPEAKER calls at you)|You're not supposed to be carrying a weapon.|Hand it over. -(说话者向你喊话)|你不应该带着武器。|把它交出来。 +( SPEAKER 向你喊话 ) |你不应该带着武器。|把它交出来。 (The SPEAKER approaches you)|Contraband detected. Initiating confiscation.|Please comply. -(扬声器靠近您)|检测到违禁品。开始没收。|请遵守。 +( SPEAKER 靠近你 ) |检测到违禁品。开始没收。|请遵守。 +(The SPEAKER blushes)|Umm, miss, I see that you have a weapon there,|could you maybe hand it over? +(SPEAKER 脸红了)|嗯,小姐,我看见你那里有武器,|你能把它交出来吗? +(The SPEAKER smiles at you)|Be a good girl and hand that weapon over,|would you? +(SPEAKER 对你微笑)|做个好女孩,把武器交出来,|好吗? +(The SPEAKER grins and cracks her knuckles)|Are you planning to fight anybody with that?|Or are you gonna hand it over? +(SPEAKER 咧嘴笑着,掰着指关节)|你打算用它和别人打架吗?|或者你要把它交出去? Yes, miss... (Currently held weapon will be lost) -是的,小姐……(目前持有的武器将会丢失) +是的,小姐…… ( 目前持有的武器将会丢失 ) Mmph... (Nod politely) (Currently held weapon will be lost) -嗯……(礼貌地点头)(当前持有的武器会丢失) +嗯…… ( 礼貌地点头 ) ( 当前持有的武器会丢失 ) No, I refuse! 不,我拒绝! Mmph! (Shake your head) -嗯! (摇头) +嗯! ( 摇头 ) The Head Maid asked me to retrieve it. 女仆长让我把它找回来。 My mistress needs it for a special spell. @@ -7350,666 +17816,2730 @@ It's just a prop for a costume. 它只是服装的道具。 Are you questioning me? I'm a dragonslayer. 你是在质疑我吗?我是屠龙者。 + + (Continue...) -(继续...) +( 继续... ) + + (The SPEAKER approaches you in your cell)|Well well, what do we have here? A new guest?|Perhaps I should give you a rundown of your new life~ -(SPEAKER 在你的牢房里接近你)|好吧,我们这里有什么?新来的客人?|或许我该给你介绍一下你的新生活~ +( SPEAKER 在你的牢房里接近你 ) |好吧,我们这里有什么?新来的客人?|或许我该给你介绍一下你的新生活~ + + (The SPEAKER chuckles)|Don't tell me you seriously think we're letting you go?|You broke the rules, ignored the warnings.|Your new job is to make the people here happy. -(SPEAKER轻笑)|不会真的认为我们会放你走吧?|你已经违反了规则,无视了警告。|你的新工作是让这里的人们开心。 +( SPEAKER轻笑 ) |不会真的认为我们会放你走吧?|你已经违反了规则,无视了警告。|你的新工作是让这里的人们开心。 (The SPEAKER chuckles)|Hah, looks like you've got lots of training ahead of you.|Soon you'll have too much pleasure for your own good~ -(SPEAKER轻笑)|哈,看来你有很多训练要等着你。|很快你就会有很多的乐趣了~ +( SPEAKER轻笑 ) |哈,看来你有很多训练要等着你。|很快你就会有很多的乐趣了~ (The SPEAKER giggles)|Don't worry, you'll come to enjoy it soon enough. -(SPEAKER咯咯笑)|别担心,你马上就要去享受它了。 +( SPEAKER咯咯笑 ) |别担心,你马上就要去享受它了。 (The SPEAKER smiles)|Heh, looks like you'll be fitting right in. -(SPEAKER 微笑)|嘿嘿,看来你很快就适应了。 +( SPEAKER 微笑 ) |嘿嘿,看来你很快就适应了。 + + (The SPEAKER chuckles)|You're probably wondering what's in store for you.|It's simple: You behave and do as you're told.|Eventually you will get to roam around.|Don't you dare try to steal anything. -(SPEAKER轻笑)|你可能想知道为你准备了什么。|很简单:你按照别人的吩咐行事和做事。|最终你可以四处欧东。|别想着尝试偷东西. -(The SPEAKER chuckles)|Babe, you're going to be locked up for a looooong time. -(SPEAKER轻笑)|宝贝,你将会被关很长一段时间。 +( SPEAKER轻笑 ) |你可能想知道为你准备了什么。|很简单 : ‎你按照别人的吩咐行事和做事。|最终你可以四处欧东。|别想着尝试偷东西. +(The SPEAKER chuckles)|Feisty, aren't you?|Looks like it's going to be an extended stay for you~ +( SPEAKER 轻笑 ) |挺有活力,不是吗?|看起来你会待很长时间~ (The SPEAKER giggles and returns to her work) -(SPEAKER 咯咯笑着会去工作了) -(The SPEAKER smiles)|Wonderful. You'll be meeting your new friends soon! -(SPEAKER微笑)|太好了。你很快就会见到你的新朋友! +( SPEAKER 咯咯笑着回去工作了 ) +(The SPEAKER smiles)|Looks like you'll get the hang of it pretty quickly! +( SPEAKER 微笑 ) |看起来你很快就能掌握窍门了! + + (New life?) -(新生活?) +( 新生活? ) (Let her continue) -(让她继续) +( 让她继续 ) + + (Pout at her) -(对她噘嘴) +( 对她噘嘴 ) You can't make me do that! 你不能让我那样做! (Scream into your gag) -(隔着口塞大叫) +( 隔着口塞大叫 ) That sounds alright... 听起来不错... (Moan into your gag and giggle) -(在你的口塞中呻吟和轻笑) +( 在你的口塞中呻吟和轻笑 ) + + (Glare at her) -(瞪着她) +( 瞪着她 ) Let me out this instant! 马上让我出去! (Scream into your gag uselessly) -(无用地隔着堵嘴大叫) +( 无用地隔着堵嘴大叫 ) I will be a good girl! 我会做个好女孩的! (Giggle and wiggle your body) -(咯咯笑着扭动你的身体) +( 咯咯笑着扭动你的身体 ) + + + + (The SPEAKER approaches you in your cell)|Back again, are we? Silly girl.|You know we don't take no for an answer. -(SPEAKER 在你的牢房里接近你)|又回来了,是吗?傻丫头。|你知道我们不会停你的回答的。 -(The SPEAKER smiles back)|Oh, this is a game to you?|Then perhaps I should make it funner.|(She leaves and returns with some toys...)|Now hold still! -(SPEAKER回以微笑)|哦,这对你来说是个游戏?|那也许我应该让它更有趣。|(她带着一些玩具离开并回来......)|现在别动! +( SPEAKER 在你的牢房里接近你 ) |又回来了,是吗?傻丫头。|你知道我们不会停你的回答的。 + + +(The SPEAKER smiles back)|Oh, this is a game to you?|Then perhaps I should make it funner for you...|(She leaves and returns with some toys...)|Now hold still! +( SPEAKER 回以微笑 ) |哦,这对你来说是一个游戏?|那么也许我应该让你觉得更有趣...| ( 她离开并带着一些玩具回来... ) |现在别动! +(The SPEAKER frowns)|I know exactly what you need... +( SPEAKER 皱起眉头 ) |我清楚地知道你需要什么...... (The SPEAKER smiles back)|I'm glad you're enjoying yourself.|However, your behavior is still unacceptable.|You need to learn some respect. -(SPEAKER回以微笑)|我很高兴你玩得开心。|但是,你的行为仍然是不可接受的。|你需要学会尊重。 +( SPEAKER 回以微笑 ) |我很高兴你玩得开心。|但是,你的行为仍然是不可接受的。|你需要学会尊重。 (The SPEAKER chuckles)|Looks like you're enjoying your restraints?|Let's make them tighter, shall we? -(SPEAKER轻笑)|看起来你很享受你的束缚?|让我们把它们收紧,好吗? +( SPEAKER 轻笑 ) |看起来你很享受你的束缚?|让我们把它们收紧,好吗? (The SPEAKER shrugs)|Well, I hope you learn. -(SPEAKER耸了耸肩)|好吧,我希望你得到了应有的教训。 +( SPEAKER 耸了耸肩 ) |好吧,我希望你得到了应有的教训。 +(The SPEAKER looks greedy)|Oh, you have an idea? +( SPEAKER 看起来很贪婪 ) |哦,你有主意吗? +(The SPEAKER nods)|I'll put in a good word with you~ +( SPEAKER 点头 ) |我会帮你说好话的~ +(The SPEAKER shakes her head)|Babe, you know who's going to be blamed|if a max-security prisoner escapes? +( SPEAKER 摇头 ) |宝贝,你知道如果一个最高安全级别的囚犯逃跑|谁会受到指责吗? +(The SPEAKER shakes her head)|I'll be honest with you, you're not worth the risk.|It'd help if you had more change~ +( SPEAKER 摇头 ) |老实说,你不值得冒这个险。|如果你有更多的金币就会有帮助~ + + (Giggle and smile) -(傻笑和微笑) +( 傻笑和微笑 ) +Don't you mean 'more fun'? +你不是说'更多乐趣'吗? (Giggle and moan) -(傻笑和呻吟) +( 傻笑和呻吟 ) (Struggle in your bindings) -(在你的绑定中挣扎) +( 在你的束缚中挣扎 ) (Pout and glare at her) -(噘嘴瞪着她) +( 噘嘴瞪着她 ) +(Point to the Jailer's coin pouch) +( 指向狱卒的钱袋 ) +(Give her BRIBECOST gold) +( 给她 BRIBECOST 金币 ) + + + + Why don't you wear it instead? (OFFPERC chance, may aggro) -你自己为什么不穿它呢? (OFFPERC 机会,可能会引起敌对) +你为什么不自己穿它呢? ( OFFPERC 几率成功,可能会引起敌对 ) (Point to her instead) (OFFPERC chance, may aggro) -(指向她)(OFFPERC 机会,可能会引起敌对) -(The SPEAKER resists and defends herself!) -(说话者拒绝并开始防卫!) +( 指向她 ) ( OFFPERC 几率成功,可能会引起敌对 ) +(The SPEAKER resists and fights back!) +( SPEAKER 抵抗并反击! ) (The SPEAKER blushes and accepts) -(说话人脸红了接受) +( SPEAKER 脸红并接受 ) + + + + +(The SPEAKER looks at you curiously)|Oh, you'd be perfect!|Would you please model my latest design? +( SPEAKER 好奇地看着你 ) |哦,你好完美!|你能为我的最新设计做模特吗? +(The SPEAKER holds up a restrictive outfit)|This RESTRAINT might be a tight fit|so hold still while I lace it~ +( SPEAKER 举起了一件有着束缚性的衣服 ) |这件 RESTRAINT 可能会很紧|所以在我束紧它时请保持不动~ +(The SPEAKER giggles)|It looks even better than I thought!|Thank you girl~ +( SPEAKER 咯咯笑 ) |看起来比我想象的还要好!|谢谢你,女孩~ +(The SPEAKER sighs and moves away)|Such a shame... +( SPEAKER 叹了口气,走开 ) |真可惜…… +(The SPEAKER looks disappointed)|Guess I'll find someone else then... +( SPEAKER 看起来很失望 ) |我想我会去找其他人...... +(The SPEAKER pouts)|But I just have to see how you look in it! +( SPEAKER 撅起嘴 ) |但我只是想看看你穿起来是什么样子嘛! +(The SPEAKER smiles)|Maybe you'll change your mind when it's on~ +( SPEAKER 微笑 ) |也许当它开启时你会改变主意的哦~ +(The SPEAKER grumbles)|...fine, but you'd look cute~ +( SPEAKER 嘟囔 ) |...好吧,但你看起来很可爱嘛~ +(The SPEAKER looks bemused)|Changed your mind?|It does look good on you though~ +( SPEAKER 一脸困惑 ) |改变主意了?|不过你穿起来确实不错~ +(The SPEAKER snaps her fingers)|(You feel the RESTRAINT magically appear on you)|Aha! Wonderful! You can go now~ +( SPEAKER 打了个响指 ) | ( 你感觉到 RESTRAINT 神奇地出现在你身上 ) |啊哈!真精彩!你可以走了~ + + +Yes please! +是的! +(Nod enthusiastically) +( 热情点头 ) +(Shake your head) +( 摇头 ) + + +Of course miss. +当然,小姐。 +(Nod again) +( 再次点头 ) +Actually, I'd rather not. +事实上,我宁愿不。 + + +Fine, I guess. +好吧,我想。 +(Giggle and nod) +( 咯咯笑并点头 ) +Wait! That's too much! (PERCENT chance to avoid) +等等!这太过分了! ( 有 PERCENT 的机会避开 ) +(Shake your head and moan) (PERCENT chance to avoid) +( 摇头并呻吟 ) ( 有 PERCENT 的机会避开 ) + + + + +(The SPEAKER looks at you with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed? +( SPEAKER 用一种哲学的眼光看着你 ) |你有没有想过你想要……|转变? +(The SPEAKER takes a strange mask from her satchel)|Well, I have the answer right here... +( SPEAKER 从她的跨包里拿出一个奇怪的面具 ) |好吧,我这里有答案...... +(The SPEAKER nods seriously)|My hypothesis was correct... +( SPEAKER 认真点头 ) |我的假设是正确的...... +(The SPEAKER frowns)|Such a philistine. Begone. +( SPEAKER 皱起眉头 ) |真庸俗。滚吧。 +(The SPEAKER turns away and thinks deeply) +( SPEAKER 转过身去沉思 ) +(The SPEAKER is lost deep in thought)|Like... become someone else? +( SPEAKER 陷入沉思 ) |就像……变成另一个人? +(The SPEAKER smiles)|You can be someone else... +( SPEAKER 微笑 ) |你可以成为别人...... +(The SPEAKER turns around and keeps pondering)|Hmmm... +( SPEAKER 转身继续沉思 ) |嗯…… +(The SPEAKER nods)|I see you are a truth seeker after all. +( SPEAKER 点头 ) |我知道你毕竟是个寻求真理的人。 +(The SPEAKER lets you go. But then...)|(You feel her clip a RESTRAINT on you from behind!)|There... I shall now observe your behavior. +( SPEAKER 让你走了。但是... ) | ( 你感觉到她从后面往你身上绑了 RESTRAINT! ) |那里...我现在将观察你的行为。 + + +Um, sure? +嗯,当然? +(Nod seriously) +( 认真点头 ) +...What? +...啥? + + +Show me the truth. +让我看看真相。 +That's just creepy. +这真是令人毛骨悚然。 + + +Fine, you've convinced me. +好吧,你说服了我。 +I don't have time for this. (PERCENT chance to avoid) +我没有时间做这个。 ( PERCENT 的概率避开 ) + + + + +(The SPEAKER smiles as she hides her hands behind her back)|Have you heard of 'sensory deprivation'? +( SPEAKER 微笑着把手藏在背后)|你听说过“感官剥夺”吗? +(The SPEAKER presents a RESTRAINT)|Well, I have just the thing for you!|It's nice and comfy, and it has earmuffs built in! +( SPEAKER 提出了一个RESTRAINT)|好吧,我正好有东西给你|它很舒服,而且内置了耳罩! +(The SPEAKER starts pulling the hood over your head)|Let's get you laced in! +( SPEAKER 开始把头套拉到你头上)|我们给你系上安全带吧! +(The SPEAKER giggles)|Alrighty.|You don't know what you're missing out on~ +( SPEAKER 咯咯地笑了起来)|好吧|你不知道你错过了什么~ +(The SPEAKER doesn't seem to hear you) +( SPEAKER 似乎听不见你说话) +(The SPEAKER looks at you with a devious grin)|Oh, but it's so much fun!|You can run around bumping into things!|It's the ultimate adventure! +( SPEAKER 狡黠地笑着看着你)|哦,但这太有趣了|你可以到处乱跑,撞到东西|这是终极冒险! +(The SPEAKER chuckles)|Truth be told, I wasn't asking~|Now why don't you kneel for me... +( SPEAKER 轻笑)|说实话,我不是在请求~|现在你为什么不为我跪下... +(The SPEAKER pouts)|I thought it would be fun... +( SPEAKER 撅嘴)|我以为会很有趣... +(The SPEAKER surprises you with a crop to the thigh)|(You involuntarily kneel in front of her)|That's better~|Now why don't you say good night~ +( SPEAKER 突然鞭打了你的腿)|(你不由自主地跪在她面前)|这样好多了~~现在你为什么不说晚安呢~ + + +Of course! I love it! +当然!我爱这个! +(Nod eagerly) +( 急切地点头 ) +I prefer 'situational awareness'. +我更喜欢“环境感知”。 +(Shake your head in alarm) +(惊恐地摇头) + + +Doll me up! +快打扮我! +Actually, that sounds stifling... +事实上,这听起来令人窒息... + + +That doesn't sound that bad actually... +这听起来其实没那么糟糕... +(Shake your head and groan) (PERCENT chance to avoid) +( 摇头并呻吟 ) ( 有 PERCENT 的机会避开 ) + + + + +(The SPEAKER smiles and looks down at you deviously)|Hey there, I have a 'job' for you! +( SPEAKER 微笑并狡猾地低头看着你 ) |嘿,我有一份 '工作' 给你! +(The SPEAKER takes a duster gag from her satchel)|Such a good girl!|So here's what I have for you~|It's a special tool to help keep the place clean. +( SPEAKER 从书包里拿出一个掸子口塞 ) |真是个好女孩!|这就是我给你的东西~|这是一个帮助保持地方卫生的特殊工具。 +(The SPEAKER grins)|I'm glad we could come to an understanding~|(She takes out a duster gag from her satchel)|Now then, this place is filthy.|Why don't you put this on to help? +( SPEAKER 笑了 ) |很高兴我们能达成共识~| ( 她从书包里拿出一个掸子口塞 ) |现在,这个地方很脏。|你为什么不戴上这个来帮忙呢? +(The SPEAKER frowns)|Fair enough.|Perhaps you should reconsider your life choices~ +( SPEAKER 皱起眉头 ) |很公平。|也许你应该重新考虑一下你的人生选择~ +(The SPEAKER shrugs)|I'll find someone else... +( SPEAKER 耸耸肩 ) |那我去找其他人吧...... +(The SPEAKER reaches out to grab you)|Now now,|You shouldn't skip out on your duties~|(She pulls out a duster gag from her satchel and grins) +( SPEAKER 伸手抓住你 ) |现在,|你不应该逃避你的职责~| ( 她从书包里拿出一个掸子口塞并笑了笑 ) +(The SPEAKER smiles)|Don't be afraid!|(She turns the gag with the round mouth ball clearly visible)|Now open up... +( SPEAKER 微笑 ) |别害怕!| ( 她转动口塞,圆形口球清晰可见 ) |现在打开…… +(The SPEAKER shrugs)|Fine, I'll get someone else to clean up. +( SPEAKER 耸耸肩 ) |好吧,那我去找其他人来清理。 +(The SPEAKER places the gag in your mouth)|(She then buckles up the straps.)|(You feel a locking mechanism pull the straps in tight...)|Good maid! +( SPEAKER 将口塞放入你的嘴里 ) | ( 然后她扣上带子。 ) | ( 你感觉到一个锁紧装置把束带拉得紧紧的...... ) |好女仆! +(The SPEAKER catches you and forces the gag on you)|(You feel it tighten as it locks on securely...)|I don't want to hear it!|Now go and do your job~ +( SPEAKER 抓住你并强行塞住你的嘴 ) | ( 当它牢牢锁定时,你会感觉到它收紧了...... ) |我不想听!|现在去做你的工作吧~ + + +I'll do it! +我会做的! +I don't like the sound of this. +听起来我并不喜欢。 + + +Yes miss! +是的,女士! +Actually, maybe not... +事实上,也许我不想... + + +Okay okay... I'll do it. +好吧好吧…… 我会做的。 +That gag is far too big! (PERCENT chance to avoid) +这口塞也太大了吧! ( PERCENT 的概率避开 ) + + + + +(The SPEAKER swings an imaginary sword around)|En guar- Oh, you're unarmored!|Do you want to borrow some of mine? +( SPEAKER 挥舞着一把想象中的剑 ) |嗯哈- 哦,你没有盔甲!|你想从我这借一些吗? +(The SPEAKER holds up a RESTRAINT)|I found this near an old suit of armor.|I think it's a helmet or something... +( SPEAKER 举起一个 RESTRAINT ) |我在一套旧盔甲附近发现了这个。|我认为它是头盔或其他东西...... +(The SPEAKER winks and locks it on)|I feel much safer already~ +( SPEAKER 眨眼并锁定 ) |我感觉你安全多了~ +(The SPEAKER pouts)|Aww, spoilsport!|(She returns to fighting her imaginary enemies) +( SPEAKER 撅起嘴 ) |哇哦,扫兴!| ( 她又开始与她幻想的敌人作战 ) +(The SPEAKER shrugs)|Your loss~ +( SPEAKER 耸耸肩 ) |这是你的损失~ +(The SPEAKER grins deviously)|So? It might help...|(The SPEAKER dives at you suddenly!) +( SPEAKER 狡猾地一笑 ) |所以呢?这可能会有所帮助...| ( SPEAKER 突然冲向你! ) +(The SPEAKER giggles)|Close enough, right?|Come on, there's enemies to fight! +( SPEAKER 咯咯地笑 ) |足够接近了,对吧?|来吧,你现在有敌人要战斗! +(The SPEAKER trips over the floor)|AHHHHH!|Maybe I need more protection... +( SPEAKER 被地板绊倒 ) |啊哈哈哈!|也许我需要更多的保护...... +(The SPEAKER locks it in place quickly)|There, all set for battle now!|(The SPEAKER giggles, cheekily winking at you) +( SPEAKER 迅速将其锁定到位 ) |好了,现在一切准备就绪!| ( SPEAKER 咯咯地笑,厚着脸皮地向你眨眼 ) +(The SPEAKER tightly fastens the muzzle on)|Safe and secure~|(You whimper as the SPEAKER spanks you goodbye) +(SPEAKER 紧紧地固定你的口套)|安全又可靠~| ( 当 SPEAKER 打你屁股告别时,你呜咽着 ) + + +Extra defense can't hurt... +额外的防御不会造成伤害... +(Nod cautiously) +( 小心地点点头 ) +I'm safe enough. +我已经足够安全了。 + + +A gag? Sounds fun~ +一个口塞?听起来很有趣~ +That's not a helmet! +这不是头盔! + + +Well, it might... +嗯,也许... +(Dodge her lunge) (PERCENT chance to avoid) +( 躲开她的冲刺 ) ( PERCENT 的概率避开 ) + + + + +(A smirking SPEAKER bumps into you)|So, you're with us now, huh?|I think you need a welcome gift. +( 一个傻笑的 SPEAKER 撞到了你 ) |那么,你现在和我们在一起了,是吧?|我想你需要一份欢迎礼物。 +Mmhmm, a gift~|(The SPEAKER leans forward to whisper in your ear)|Is it cold in here, or is it just you? +嗯哼哼,一份礼物~| ( SPEAKER 倾身在你耳边低语 ) |这里冷吗,还是只有你一个人冷? +(You shiver as everything gets colder)|(RESTRAINT forms around you!)|(The SPEAKER blows you a kiss and giggles) +( 一切都变冷了,你瑟瑟发抖 ) | ( RESTRAINT 围绕在你周围! ) | ( SPEAKER 给你一个飞吻并咯咯地笑 ) +(The SPEAKER thinks for a moment)|I really wanted to try this too...|(Sighing, the SPEAKER walks away) +( SPEAKER 想了一会儿 ) |我真的很想尝试这个...| ( 叹气,SPEAKER 走开 ) +(The SPEAKER scowls)|How boring. +( SPEAKER 皱起眉头 ) |真无聊。 +(The SPEAKER laughs at your protest)|It's so much fun though~|(You feel the temperature drop suddenly) +( SPEAKER 嘲笑你的抗议 ) |不过还是很有趣~| ( 你感觉温度突然下降 ) +(The SPEAKER thinks for a moment)|Well, I want to try this anyway~|(You feel the temperature drop suddenly) +( SPEAKER 想了一会儿 ) |好吧,我还是想试试这个~| ( 你感觉温度突然下降了 ) +(The temperature returns to normal)|(The SPEAKER seems surprised)|Hmm, that wasn't meant to happen. +( 温度恢复正常 ) | ( SPEAKER 似乎很惊讶 ) |嗯,这不是故意的。 +(RESTRAINT solidifies on you as the SPEAKER grins)|It worked! I did it!|Thanks for your, uh, help~ +( 当 SPEAKER 咧嘴一笑时,RESTRAINT 已经固定在你身上了 ) |成功了!我做到了!|谢谢你的,呃,帮助~ +(RESTRAINT solidifies on you as the SPEAKER smiles)|Yes! Finally! How's that feel?|(The SPEAKER admires your restraints) +( 当 SPEAKER 微笑时,RESTRAINT 已经固定在你身上了 ) |是的!最后!感觉怎么样?| ( SPEAKER 很欣赏你的束缚 ) + + +A gift? +一份礼物? +(Nod warily) +( 警惕地点点头 ) +No thanks. +不,谢谢。 + + +Umm... just me? +嗯……只有我吗? +Wait, don't make it colder! +等等,别让温度变冷! + + +(Shiver and watch as the ice covers you) +( 颤抖着看着冰覆盖着你 ) +(Mutely whimper as the ice covers you) +( 当冰覆盖你时默默地呜咽 ) +Ah! T-That's freezing! (PERCENT chance to avoid) +啊! 太-太冷了! ( PERCENT 的概率避开 ) +(Wriggle to warm up) (PERCENT chance to avoid) +( 蠕动着尝试热身 ) ( PERCENT 的概率避开 ) + + + + +(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? +( 机器人 SPEAKER 走近 ) |查询 : ‎发现好女孩 : ‎|想要被束缚吗? +(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? +( SPEAKER 发出嘟嘟声和呼呼声 ) |SPEAKER 将添加 RESTRAINT。|可以接受吗? +(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. +( SPEAKER 绕着你旋转,释放胶带 ) |RESTRAINT 已释放至目标。|祝你有美好的一天。 +(The SPEAKER buzzes)|Understood. Proceding back to duty. +( SPEAKER 嗡嗡作响 ) |明白。继续执行任务。 +(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. +( SPEAKER 发出咔嗒声并发出蜂鸣声 ) |已注意到拒绝。|SPEAKER 将返回巡逻。 +(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. +( SPEAKER 发出嗡嗡声 ) |错误 : ‎答案自相矛盾。|声明 : ‎SPEAKER 将添加 RESTRAINT。 +ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. +错误 : ‎预计接受。|声明 : ‎SPEAKER 将添加 RESTRAINT。 +(The SPEAKER makes a whirring noise)|ERROR: SPEAKER out of tape.|Returning to routine. +( SPEAKER 发出呼呼声 ) |错误 : ‎SPEAKER 中的胶带已用完。|返回常规状态。 +(The SPEAKER launches tape which catches you as you run)|RESTRAINT dispensed.|Have a nice day. +( 在你奔跑时 SPEAKER 发射出胶带抓住你 ) |RESTRAINT 已释放至目标。|祝你有美好的一天。 + + +Uh, affirmative? +呃,肯定? +(Nod) +( 点头 ) +Negative. +否定。 + + +Very acceptable! +非常满意! +No, I don't want that. +不,我不想那样。 + + +If you have to... +如果你必须... +Go away robot! (PERCENT chance to avoid) +滚开啊机器人! ( PERCENT 的概率避开 ) +(Shake your head rapidly) (PERCENT chance to avoid) +( 快速摇头 ) ( 有 PERCENT 的机会避开 ) + + + + +(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. +( SPEAKER 向你发射缆绳 ) |RESTRAINT 已释放至目标。|祝你有美好的一天。 +(The SPEAKER makes a whirring noise)|ERROR: SPEAKER cable jammed.|Returning to routine. +( SPEAKER 发出呼呼声 ) |错误 : ‎SPEAKER 中的缆绳被卡住。|返回常规状态。 + + + + + + +(A happy SPEAKER looks at you)|Hey there cutie~|Want to try some scarf bondage? +( 一个高兴的 SPEAKER 看着你 ) |嘿,小可爱~|想尝试被一些围巾束缚吗? +(The SPEAKER holds up some scarves)|If you want to try, I've got a few here.|I could give you a RESTRAINT? +( SPEAKER 举起一些围巾 ) |如果你想尝试一下,我这里有一些。|我可以往你身上绑 RESTRAINT 吗? +(The SPEAKER smiles gently at you as she ties)|I love the silky feeling~|(The SPEAKER tightens all her knots) +( SPEAKER 在捆绑时对你温柔地微笑 ) |我喜欢丝滑的感觉~| ( SPEAKER 拉紧所有的结 ) +(The SPEAKER looks away and nods)|Well... maybe next time. +( SPEAKER 移开视线并点头 ) |好的……也许下次吧。 +(The SPEAKER shuffles awkwardly)|Oh... well...|Come back if you change your mind~ +( SPEAKER 尴尬地拖着脚步 ) |哦……好吧……|如果你改变主意了就回来吧~ +(The SPEAKER scowls)|Hey, don't back out!|I promise I'll make it comfortable! +( SPEAKER 皱起眉头 ) |嘿,别后退!|我保证我会让它很舒服的! +(The SPEAKER frowns)|Too bad, I want to tie someone! +( SPEAKER 皱起眉头 ) |太糟糕了,我想绑一个人! +(The SPEAKER drops her scarves)|Aww, really?|I'll go find someone else then... +( SPEAKER 放下围巾 ) |哇,真的吗?|那我就去找别人了…… +(The SPEAKER beams a smile)|Yay, thank you!|Feels nice, right? +( SPEAKER 微笑 ) |耶,谢谢!|感觉很好,对吧? +(The SPEAKER tosses a scarf around you like a lasso)|Not so fast! You cannot escape the fluff! +( SPEAKER 像套索一样把围巾扔在你身上 ) |别跑那么快!你逃不了的! + + +Sounds good! +听起来不错! +(Nod quickly) +( 连忙点头 ) +Not really. +并不真。 + + +Please do! +请这样做! +(Nod and giggle) +( 点头并咯咯笑 ) +Not right now. +现在不行。 + + +Well... sure then. +嗯...当然可以。 +Hey! Stop! (PERCENT chance to avoid) +嘿!停下! ( PERCENT 的概率避开 ) +(Shake your head and whine) (PERCENT chance to avoid) +( 摇头并发出呜呜声 ) ( 有 PERCENT 的机会避开 ) + + +(An excited SPEAKER turns to you)|Eureka, I've done it!|Do you want to see? +( 兴奋的 SPEAKER 转向你 ) |我发现了,我已经做到了!|你想看吗? +(The SPEAKER pulls out a pressurized flask)|Behold! A gaseous form of latex!|I've coated the interior with a layer of inert slime to keep it secure.|Here, have a look!|(She holds out the container) +( SPEAKER 拿出一个加压瓶 ) |看哪!气态乳胶!|我在内部涂了一层惰性粘液以保持其安全。|这边,看,看!| ( 她拿出容器 ) +(The flask springs a leak)|Oh no! That wasn't supposed to happen!|(The gas crystalizes into a RESTRAINT across your body) +( 瓶体漏气 ) |哦不!这是不应该发生的!| ( 气体在你的身体上结晶成 RESTRAINT ) +(The SPEAKER scoffs)|You'll see... you'll all see! +( SPEAKER 嘲笑 ) |你们会看到的……你们都会看到的! +(The SPEAKER sighs)|So hard to find good help out here... +( SPEAKER 叹了口气 ) |这里很难找到好的帮助...... +(The SPEAKER frowns)|What, do you doubt my results? See for yourself!|(She unscrews the cap) +( SPEAKER 皱起眉头 ) |什么,你怀疑我的结果吗?你自己看看吧!| ( 她拧开盖子 ) +(The green gas starts leaking)|Oh no! It wasn't supposed to do that! +( 绿色气体开始泄漏 ) |哦不!不应该这样! +(You push her out of the way, but she frowns)|Hmph. This is your fault. +( 你把她推开,她却皱起了眉头 ) |哼。这是你的错。 +(You push her out of the way, but get caught in the cloud yourself)|(The gas crystalizes into a RESTRAINT across your body)|Oh no, that could have been me! +( 你把她推开,但你自己却被困在雾里 ) | ( 气体在你的身体上结晶成 RESTRAINT ) |哦不,那本来应该在我身上发生! +(The gas moves toward you, as if by its own will)|(The gas crystalizes into a RESTRAINT across your body)|That wasn't supposed to happen... +( 气体向你移动,仿佛按照自己的意志一样 ) | ( 气体在你的身体上结晶成 RESTRAINT ) |那不应该发生...... + + +Seems interesting! +看起来很有趣! +(Nod slowly) +( 缓缓点头 ) +Seems boring. +看起来很无聊。 + + +Are you sure this is a good idea? +你确定这是个好主意吗? +Keep that away from me! +让那玩意离我远点! + + +I'll stop it! +我会阻止它! +(Run toward her to help) +( 跑向她帮忙 ) +(Run away!) (PERCENT chance to avoid) +( 逃跑! ) ( PERCENT 的概率避开 ) + + + + +(A messy looking SPEAKER turns to you)|Hmm, curious. Very curious.|Can you help me with an experiment? +( 一个看起来凌乱的 SPEAKER 转向你 ) |嗯,好奇。很好奇|你能帮我做个实验吗? +(The SPEAKER pulls out a flask)|I isolated some slime, but it's inert.|Would you let me spill some on you? +( SPEAKER 拿出一个烧瓶 ) |我分离出了一些粘液,但它是惰性的。|你能让我洒一些在你身上吗? +(The SPEAKER tips out the entire flask)|Aha! It's growing again! Fascinating.|(Sticky RESTRAINT clings to you) +( SPEAKER 将整个烧瓶倒出 ) |啊哈!它又长大了!令人着迷。| ( 粘性 RESTRAINT 粘在你身上 ) +(The SPEAKER tuts disapprovingly)|Not one for chemistry, eh? +( SPEAKER 不以为然地哼了一声 ) |不是化学专业的,嗯? +(The SPEAKER glares at you)|You've got no sense of adventure!|For science! +( SPEAKER 瞪着你 ) |你没有冒险精神!|为了科学! +Ah, but it'll be quick!|(The SPEAKER begins tipping the flask)|See? It's already moving toward you! +啊,但它会很快|!| ( SPEAKER 开始倾斜烧瓶 ) |看到了吗?它已经向你走来了! +(The SPEAKER tosses the slime on you)|(The slime flops off limply)|Ah. Back to the drawing board. +( SPEAKER 把粘液扔到你身上 ) | ( 粘液软软地滑了下来 ) |啊。从头再来。 +(The SPEAKER pours the slime onto you)|That's the spirit girl!|(Sticky RESTRAINT clings to you) +( SPEAKER 将粘液倒在你身上 ) |这就是精灵女孩!| ( 粘性 RESTRAINT 粘在你身上 ) +(The SPEAKER tosses the slime on you)|Ha, look, it's alive!|(Sticky RESTRAINT clings to you) +( SPEAKER 把粘液扔到你身上 ) |哈,看,它是活的!| ( 粘性 RESTRAINT 粘在你身上 ) + + +Sure. +当然。 +Absolutely not. +绝对不。 + + +On me? Sounds fun~ +包裹在我身上?听起来很有趣~ +Nope. Not doing that. +不。别这样做。 + + +Okay, for science... +好吧,为了科学... +Ah! Don't you dare! (PERCENT chance to avoid) +啊! 你不敢! ( 有 PERCENT 的机会避开 ) +(Shake your head and whimper) (PERCENT chance to avoid) +( 摇头并呜咽 ) ( 有 PERCENT 的机会避开 ) + + + + +(A SPEAKER whispers to you)|Ever wonder how wolfgirls feel?|Or why they're so obedient? +( SPEAKER 对你轻声细语 ) |有没有想过狼娘们的感受|或者他们为什么这么听话? +(The SPEAKER grins)|I've got a RESTRAINT here~|Wanna give it a try? +( SPEAKER 咧嘴一笑 ) |我这里有一件RESTRAINT~|想尝试一下吗? +(The SPEAKER puts on the RESTRAINT)|Perfect. Better behave now~|(The SPEAKER pats your butt) +( SPEAKER 为你佩戴 RESTRAINT ) |完美。现在乖一点吧~| ( SPEAKER 拍了拍你的屁股 ) +(The SPEAKER rolls her eyes)|You've seen wolfgirls, right?|Ah, whatever, go have fun~ +( SPEAKER 翻白眼 ) |你见过狼娘吧?|啊,不管怎样,玩去吧~ +(The SPEAKER nods glumly)|Not a fan?|Shame, I am~ +( SPEAKER 闷闷不乐地点点头 ) |不是粉丝?|耻辱,我是~ +(The SPEAKER grabs you quickly)|Oh, it's very strict~|And great for being trained... +( SPEAKER 迅速地抓住你 ) |哦,很严格~|而且非常适合接受训练... +(The SPEAKER looks at you deviously)|You're going to wear this RESTRAINT,|if you want to or not~ +( SPEAKER 阴险地看着你 ) |你要佩戴上这个RESTRAINT,|无论你是否愿意~ +(The SPEAKER sulks)|Have it your way then. +( SPEAKER 生闷气 ) |那就随你吧。 +(The SPEAKER adds the RESTRAINT)|(You feel her tighten everything before locking it)|Good girl~ +( SPEAKER 添加了 RESTRAINT ) | ( 你感觉到她在上锁之前收紧了所有束缚 ) |好女孩~ +(The SPEAKER pushes you to the ground)|I'll make it extra tight for you~|(The RESTRAINT locks tightly onto you) +(SPEAKER 将你推倒在地)|我会让你更紧~|(RESTRAINT 紧紧地锁住你) + + +Maybe a little~ +或许有一点~ +(Nod excitedly) +( 兴奋地点头 ) +Don't know, don't care. +不知道,不在乎。 + + +Yes! So much! +是的!太好了! +That looks too strict! +这看起来太严格了! + + +I- Well- O-Okay~ +我- 嗯- 好-好吧~ +(Moan and squirm) +( 呻吟和蠕动 ) +I don't want to get stuck! (PERCENT chance to avoid) +我不想被绑住! ( 有 PERCENT 的机会避开 ) +(Shake your head worriedly) (PERCENT chance to avoid) +( 担心地摇头 ) ( 有 PERCENT 的机会避开 ) + + + + +(A SPEAKER gracefully gestures to you)|So good to see a friendly face~|Care to see some elven goods? +( SPEAKER 优雅地向你打手势 ) |很高兴看到一张友好的面孔~|想看看一些精灵商品吗? +(The SPEAKER holds up a RESTRAINT)|These are some of our strictest.|Want to try? +( SPEAKER 举起 RESTRAINT ) |这些是我们最严格的拘束具。|想试试吗? +(The SPEAKER smiles sweetly)|Such a good girl~|(The RESTRAINT locks with a loud click) +( SPEAKER 甜甜地笑 ) |真是个好女孩~| ( '咔哒' 一声,RESTRAINT 锁上了 ) +(The SPEAKER sagely nods)|As you wish~ +( SPEAKER 睿智地点点头 ) |如你所愿~ +(The SPEAKER frowns briefly)|I understand~ +( SPEAKER 皱起眉头 ) |我明白了~ +(The SPEAKER leans closer)|Then you can test their escapability!|(The SPEAKER dives towards you!) +( SPEAKER 靠得更近 ) |然后你可以测试他们的逃脱能力!| ( SPEAKER 俯冲向你! ) +(The SPEAKER shifts her weight back)|I'm afraid I must insist.|(She's gripping a RESTRAINT)|(The SPEAKER dives towards you!) +( SPEAKER 将她的体重向后转移 ) |恐怕我必须坚持。| ( 她抓住了一件 RESTRAINT ) | ( SPEAKER 向你扑来! ) +(The SPEAKER rolls past harmlessly)|Oh! So fast~ +( SPEAKER 无害地滚过去 ) |哦!真快~ +(The SPEAKER snaps the RESTRAINT on)|There, much better.|Now squirm for me cutie~ +( SPEAKER 打开了 RESTRAINT ) |好了,好多了。|现在为我蠕动吧,小可爱~ +(The SPEAKER trips you over)|(Before you can move, the RESTRAINT closes firmly)|Strict, isn't it?~ +( SPEAKER 绊倒了你 ) | ( 你还没来得及移动,RESTRAINT 就牢牢地关闭了 ) |严格吧?~ + + +Of course! +当然! +(Nod happily) +( 高兴地点头 ) +No, thanks. +不,谢谢。 + + +Pretty please~ +美人请~ + + +Fine... +好吧... +(Moan and giggle) +( 呻吟和傻笑 ) +Stop! (PERCENT chance to avoid) +停! ( 有 PERCENT 的机会避开 ) + + + + +(A SPEAKER plays with silvery rope)|Hmm, I need to get better with this.|Can I practice on you? +( SPEAKER 在玩银色的绳子 ) |嗯,我需要在这方面做得更好。|我可以在你身上练习吗? +(The SPEAKER grins happily)|Thank you girl~|I'll tie with RESTRAINT then~ +( SPEAKER 开心地笑 ) |谢谢你,女孩~|那我就为你绑上 RESTRAINT 了~ +(The SPEAKER binds you tightly)|(The rope is tight, and she's clearly an expert.)|Mmm, not too bad~ +( SPEAKER 把你绑得紧紧的 ) | ( 绳子很紧,她的思路清晰又熟练。 ) |嗯,还不错~ +(The SPEAKER pouts indignantly)|Why say yes then?!|(The SPEAKER walks off grumbling) +( SPEAKER 愤怒地撅起嘴 ) |那为什么要说'是'?!| ( SPEAKER 抱怨着走开 ) +(The SPEAKER sighs)|Very well then~ +( SPEAKER 叹了口气 ) |那好吧~ +(The SPEAKER pouts indignantly)|Oh no, you don't get out that easy.|You said you'd help! +( SPEAKER 愤怒地撅起嘴 ) |哦不,你没那么容易出去。|你说过你会帮忙的! +(The SPEAKER smirks)|Ooh, a chance to practice against resistance~|I can't pass that up! +( SPEAKER 傻笑 ) |哦,一个练习对抗束缚的机会~|我不能错过! +(The SPEAKER can't keep the knots tight)|(Eventually, she gives up)|S-Stupid human... +( SPEAKER 无法把结打紧 ) | ( 最终,她放弃了 ) |愚-愚蠢的人类...... +(The SPEAKER strictly ties you up)|(You can feel she's done this many times)|(She smirks at you as she departs) +( SPEAKER 严格的把你绑起来 ) | ( 你能感觉到她已经这样做过很多次了 ) | ( 她离开时对你傻笑 ) +(The SPEAKER strictly ties you up)|(There's no slack anywhere!)|(She makes a face at you as she leaves) +( SPEAKER 严格的把你绑起来 ) | ( 任何地方都不能松懈! ) | ( 她离开时对你做了个鬼脸 ) + + +Any time~ +随时~ +I'd rather you didn't. +你最好不要。 + + +Sounds great! +听起来很棒! +Actually, I don't want that. +事实上,我不想这样。 + + +I'll play along then~ +那我们就一起玩吧~ +(Struggle against her) (PERCENT chance to avoid) +( 与她斗争 ) ( 有 PERCENT 的机会避开 ) + + + + +(The SPEAKER quickly motions to you)|Hey! Over here!| I got something to show you! +( SPEAKER 快速向你示意 ) |嘿!这里!| 我有东西要给你看! +(The SPEAKER giggles)|You'll be wearing this~|(A RESTRAINT is in her hands) +( SPEAKER 咯咯笑 ) |你穿这个吧~| ( RESTRAINT 在她手中 ) +(The SPEAKER looks surprised)|Oh, uh, sure!|(They quickly add the RESTRAINT) +( SPEAKER 看起来很惊讶 ) |哦,呃,当然!| ( 他们很快添加了 RESTRAINT ) +(The SPEAKER grins sneakily)|I thought you might say that~|But- ahh!|(They drop the item and you slip away) +( SPEAKER 偷偷地笑 ) |我以为你会这么说~|但是-啊!| ( 他们扔掉了物品,你溜走了 ) +(The SPEAKER looks angry)|Hey! HEY! I'm talking to-|Ah, forget it. +( SPEAKER 看起来很生气 ) |嘿!嘿!我正在和-|啊,算了。 +(The SPEAKER grins sneakily)|I thought you might say that~|But it wasn't a choice... +( SPEAKER 偷偷地笑 ) |我以为你会这么说~|但这不是一个选择...... +(The SPEAKER follows you)|Not so fast there~|(She blocks your path) +( SPEAKER 跟着你 ) |别走那么快啊~| ( 她挡住了你的路 ) +(The SPEAKER fumbles with the RESTRAINT)|C-Come on, open-|(You quickly walk away) +( SPEAKER 摸索着使用 RESTRAINT ) |来-来吧,打开-| ( 你快步走开 ) +(The SPEAKER adds the RESTRAINT)|Good luck with that one~|(She sounds like she's gloating...) +( SPEAKER 添加了 RESTRAINT ) |祝那个人好运~| ( 她听起来像是在幸灾乐祸…… ) +(The SPEAKER roughly forces you down)|(Pushing your head down, the RESTRAINT slides on)|(The SPEAKER tugs your hair, then walks away) +( SPEAKER 粗暴地将你压倒 ) | ( 将你的头压低,RESTRAINT 滑动 ) | ( SPEAKER 拉扯你的头发,然后走开 ) + + +(Walk over, curiously) +( 好奇地走过去 ) +(Don't approach). +( 不靠近 ) 。 +(Don't approach) +( 不靠近 ) + + +Sure! +当然! +W-What? No way! +什-什么?决不! + + +(Let her add the restraint) +( 让她绑上拘束具 ) +(Moan and nod) +( 呻吟和点头 ) + + + + +(The SPEAKER walks over)|You'd make a cute catgirl~|Want help becoming one? +( SPEAKER 走过来)|你会成为一个可爱的猫娘~~需要帮助吗? +(The SPEAKER grins)|Here, I've got this RESTRAINT.|That'll help! +( SPEAKER 咧嘴一笑)|在这里,我有这个 RESTRAINT.|那会很有帮助的! +(The SPEAKER gleefully comes closer)|(The RESTRAINT fits snugly)|So adorable! +( SPEAKER 高兴地走近)|(RESTRAINT很合身)|太可爱了! +(The SPEAKER nods disappointed)|Fair enough~ +( SPEAKER 叹了口气)|也许下次吧~ +(The SPEAKER sighs)|Maybe another time~ +( SPEAKER 失望地点了点头)~ +(The SPEAKER titters)|It's going on, kitty~ +( SPEAKER 咯咯地笑)|事情还在继续,小猫~ +(The SPEAKER giggles)|Let's see if you can get away then~|(You see a RESTRAINT in her hand) +( SPEAKER 咯咯地笑了起来)|那我们看看你能不能逃走~~(你看到她手里拿着一个 RESTRAINT) +(The SPEAKER whimpers and drops it)|Owwww!|I hit my knee! +( SPEAKER 呜咽着扔掉了它)|哇|我撞到膝盖了! +(The SPEAKER wiggles happily)|Oh, you're so cute!|Enjoy it~ +( SPEAKER 高兴地扭动身体)|哦,你真可爱|享受吧~ +(The SPEAKER traps you)|(You feel the RESTRAINT being forced on)|Meow~ +( SPEAKER 困住了你)|(你感觉到被强加了RESTRAINT)|喵喵叫~ + + +No, not today. +不,不是今天。 + + +Yay! +耶! +Not like that! +不是这样的! + + +Y-Yes miss~ +是-是的小姐~ +(Duck out the way) (PERCENT chance to avoid) +( 闪开 ) ( 有 PERCENT 的机会避开 ) + + + + +(A SPEAKER winks at you)|You look like a girl who likes feeling|like a prisoner, am I right? +( SPEAKER 对你眨眼 ) |你看起来像一个喜欢|囚禁感的女孩,对吗? +(The SPEAKER nods happily)|I knew it! Well, it's your lucky day.|I've got some RESTRAINT for you~ +( SPEAKER 高兴地点点头 ) |我就知道! 好吧,今天是你的幸运日。|我给你准备了 RESTRAINT~ +(The SPEAKER spins you around)|(You hear the cold metal click shut)|Nice and submissive~ +( SPEAKER 让你转了一圈 ) | ( 你听到冰冷的金属咔哒声 ) |乖乖顺从~ +(The SPEAKER shrugs)|It's not for everyone, I guess~ +( SPEAKER 耸耸肩 ) |我想这并不适合所有人~ +(The SPEAKER frowns)|Really?|I was so sure... +( SPEAKER 皱起眉头 ) |真的吗?|我非常确定…… +(The SPEAKER grins maliciously)|I like seeing prisoners though~|And you're right here... +( SPEAKER 恶意一笑 ) |不过我喜欢看到囚犯~|而你就在这里...... +(The SPEAKER giggles)|I'm gonna make you one anyway~|(You see a RESTRAINT in her hand) +( SPEAKER 咯咯地笑 ) |无论如何我都会给你做一个~| ( 你看到她手里有 RESTRAINT ) +(The SPEAKER gulps)|M-Maybe I won't then! +( SPEAKER 咽了咽口水 ) |也-也许我不会! +(The SPEAKER adds the RESTRAINT)|You're blushing dear~|She doth protest too much? +( SPEAKER 添加了 RESTRAINT ) |亲爱的你脸红了~|她抗议太多了? +(The SPEAKER giggles as she catches you and slaps on the cuffs)|No so fast, dear~ +( 说话者咯咯笑着抓住你并拍了拍手铐 ) |别那么快,亲爱的~ + + +Maybe a bit~ +或许有一点~ +Not at all. +一点也不。 + + +(Wiggle excitedly) +( 兴奋地扭动 ) +Not like that. +不是这样的。 + + +O-Okay... +好-好的... +(Moan and shiver) +( 呻吟和颤抖 ) +Don't even try. (PERCENT chance to avoid) +我不想尝试。 ( 有 PERCENT 的机会避开 ) + + + + +(A SPEAKER is looking at something)|So comfy... but how?|Hey, you! Come see this! +( SPEAKER 正在看着某样东西 ) |好舒服……但是怎么才能?|嘿,你!快来看看这个! +(The SPEAKER holds up a RESTRAINT)|It's so soft, but so strict~|Want to give it a try? +( SPEAKER 举起了 RESTRAINT ) |很软,但又很严格~|想尝试一下吗? +(The SPEAKER quickly fastens it on)|(A wave of comfort passes over you)|(The SPEAKER looks on enviously) +( SPEAKER 迅速将其扣上 ) | ( 一股舒适感笼罩着你 ) | ( SPEAKER 羡慕地看着 ) +(The SPEAKER shrugs)|Eh, alright then. +( SPEAKER 耸耸肩 ) |呃,好吧。 +(The SPEAKER shrugs)|Up to you. +( SPEAKER 耸耸肩 ) |随你。 +(The SPEAKER frowns)|But it's so comfy!|Here, look, I'll show you... +( SPEAKER 皱起眉头 ) |但是它真的好舒服!|在这里,看,我会告诉你...... +(The SPEAKER approaches)|Hey, see this RESTRAINT?|I'm going to put it on you~ +( SPEAKER 走近 ) |嘿,看到 RESTRAINT 了吗?|我要把它戴在你身上~ +(The SPEAKER looks startled)|Oh! Uh, I guess you're right... +( SPEAKER 看上去很吃惊 ) |哦!呃,我想你是对的... +(The RESTRAINT is buckled firmly in place)|See? Good, huh?|(You sink into the comforting feeling) +( RESTRAINT 牢固地扣在适当的位置 ) |看到了吗? 很好吧?| ( 你陷入了前所未有的舒适感 ) +(The SPEAKER ignores you)|(The RESTRAINT is buckled firmly in place)|(A wave of comfort passes over you) +( SPEAKER 无视你 ) | ( RESTRAINT 牢牢地扣在适当的位置 ) | ( 一股舒适感传遍你全身 ) + + +(Approach) +( 靠近 ) +(Keep your distance) +( 保持距离 ) + + +Nope. +不要。 + + +It does look comfortable~ +看上去确实很舒服~ +(Squirm and bow your head) +( 扭动并低下头 ) +It looks too strict! (PERCENT chance to avoid) +看起来太严格了! ( 有 PERCENT 的机会避开 ) + + + + +(The SPEAKER brushes past hurriedly)|Careful girl!|Else I'll lock you away~ +( SPEAKER 急匆匆地从你身边擦身而过 ) |小心点姑娘!|不然我就把你锁起来了~ +(The SPEAKER looks at you intrigued)|Aren't you something...|How about wearing this RESTRAINT? +( SPEAKER 好奇地看着你 ) |你不是……|戴上 RESTRAINT 怎么样? +(The SPEAKER grins and locks it on)|Maybe I should bump into you more~ +( SPEAKER 微笑并锁定 ) |也许我应该碰见更多的你~ +(The SPEAKER rolls her eyes)|Run along then girl~ +( SPEAKER 翻白眼 ) |姑娘,赶紧跑吧~ +(The SPEAKER nods)|Didn't think so~|Oh, and, uh, sorry for the bump. +( SPEAKER 点头 ) |没想到~|哦,呃,抱歉打扰了。 +(The SPEAKER shakes her head)|You don't get off that lightly.|These are going on. +( SPEAKER 摇头 ) |你不能轻易离开|这些都在继续。 +(The SPEAKER frowns)|I think I should.|You'll just bother someone else.|(She holds up a RESTRAINT) +( SPEAKER 皱起眉头 ) |我想我应该这样做。|你只会打扰别人。| ( 她举起了 RESTRAINT ) +(The SPEAKER sighs)|I'll let you off then.|Oh, and, uh, sorry for the bump. +( SPEAKER 叹了口气 ) |那么我就放过你了。|哦,还有,呃,很抱歉撞到你了。 +(The SPEAKER adds the RESTRAINT)|(As she's locking it, she giggles)|You're really cute actually~ +( SPEAKER 加了 RESTRAINT ) | ( 当她将拘束具锁住时,她咯咯地笑 ) |其实你真的很可爱~ +(The SPEAKER stumbles and grimaces)|Ugh! Fine, you can go then.|D-Didn't want to see you tied anyway... +( SPEAKER 踉踉跄跄,做了个鬼脸 ) |呃! 好吧,那你可以走了。|无-无论如何也不想看到你被绑着...... + + +That doesn't sound bad... +听起来不错…… +(Giggle into your gag) +( 咯咯地笑 ) +That won't be necessary. +那是没有必要的。 + + +I'd love to! +我喜欢! + + +M-Maybe you should then~ +或-或许你应该这样~ +You ran into me! (PERCENT chance to avoid) +你撞到我了! ( 有 PERCENT 的机会避开 ) + + + + +(A SPEAKER gives you a small curtsy)|Good day.|Care to try part of our uniform? +( SPEAKER 向您行了一个小小的屈膝礼 ) |美好的一天。|想尝试一下我们的制服吗? +(The SPEAKER looks content)|We can offer you this RESTRAINT.|It's a snug fit... +( SPEAKER 看起来很满意 ) |我们可以为您提供 RESTRAINT。|它非常合身...... +(The SPEAKER buckles it strictly)|All maids wear this at sometime.|You'd fit right in! +( SPEAKER 严格扣上它 ) |所有女仆有时都会穿这个。|你很适合! +(The SPEAKER frowns for a second)|Ah, I see.|As you were then. +( SPEAKER 皱起了眉头 ) |啊,我明白了。|就像你当时一样。 +(The SPEAKER nods)|We hope to see you again nonetheless. +( SPEAKER 点头 ) |尽管如此,我们还是希望再次见到您。 +(The SPEAKER glares)|We urge you to reconsider. +( SPEAKER 怒视 ) |我们敦促你重新考虑。 +(The SPEAKER has a twinkle in her eye)|We will offer you this RESTRAINT.|You should accept. +( SPEAKER 眼中闪烁着光芒 ) |我们将为您提供 RESTRAINT。|您应该接受。 +(The SPEAKER pulls an odd smile)|Very well. +( 说话者露出一个奇怪的微笑 ) |很好。 +(The SPEAKER smugly nods)|(With surprising speed, the RESTRAINT locks in place)|Excellent, a good fit. +( SPEAKER 得意地点点头 ) | ( RESTRAINT 以惊人的速度锁定到位 ) |太棒了,非常合适。 +(The SPEAKER covers your mouth with her hand)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly) +( SPEAKER 用手捂住你的嘴 ) |嘘,别再做出错误的决定了。| ( 你感觉到她严厉地扣住了束缚 ) + + +No, thank you. +不,谢谢。 + + +I accept~ +我接受~ + + +I-I accept... +我-我接受... +(Moan and nod slowly) +( 呻吟着慢慢点头 ) +No way! (PERCENT chance to avoid) +决不! ( 有 PERCENT 的机会避开 ) + + + + +(The SPEAKER looks at you inquisitively)|(Wordlessly, they motion at your body)|(They seem to be asking about restraints) +( SPEAKER 好奇地看着你 ) | ( 他们一声不吭地向你的身体移动 ) | ( 他们似乎在询问束缚 ) +(The SPEAKER nods understandingly)|(RESTRAINT appears in their hand)|(They tilt their head at you) +( SPEAKER 理解地点点头 ) | ( RESTRAINT 出现在他们的手中 ) | ( 他们向你歪着头 ) +(The SPEAKER spins around you)|(You feel the oddly cold restraint lock in place)|(The SPEAKER nods and moves away) +( SPEAKER 在你周围旋转 ) | ( 你感觉到奇怪的冰冷的束缚锁定到位 ) | ( SPEAKER 点头并走开 ) +(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) +( SPEAKER 盯着你 ) | ( 他们收起 RESTRAINT 并离开 ) +(The SPEAKER leaves you alone) +( SPEAKER 留下你独自一人 ) +(The SPEAKER seems to frown)|(RESTRAINT appears in their hand)|(They rapidly approach) +( SPEAKER 似乎皱起了眉头 ) | ( RESTRAINT 出现在他们的手中 ) | ( 他们迅速接近 ) +(The SPEAKER tilts their head)|(RESTRAINT appears in their hand)|(They come closer) +( SPEAKER 歪着他们的头 ) | ( RESTRAINT 出现在他们的手中 ) | ( 他们走近 ) +(The SPEAKER holds you in place)|(You hear the oddly cold material locking)|(They nod at you) +( SPEAKER 将你固定在原地 ) | ( 你听到奇怪的冰冷材料被锁住了 ) | ( 他们向你点头 ) +(The SPEAKER firmly grabs you)|(The RESTRAINT locks onto your body tightly)|(The oddly cold material makes you shiver) +( SPEAKER 牢牢地抓住你 ) | ( RESTRAINT 紧紧地锁住你的身体 ) | ( 奇怪的冰冷的材料让你瑟瑟发抖 ) + + +Y-Yes? +是-是? +(Nod back) +( 点头回应 ) +No thank you. +不,谢谢。 + + +(Smile and prepare yourself) +( 微笑并做好准备 ) +(Nod and prepare yourself) +( 点头并做好准备 ) +No, not that. +不,不是那样。 + + +W-Whoa! S-Sure... +哇-哇! 当-当然…… + + + + +(A SPEAKER giggles and calls to you)|Hey there~|Fancy seeing some nature?~ +( SPEAKER 咯咯地笑着向你喊话 ) |嘿那边的人~|想看看大自然吗?~ +(The SPEAKER motions with her hands)|(Vines rise from the floor and twirl)|These will bind you nicely... +( SPEAKER 用手示意 ) | ( 藤蔓从地板上升起并旋转 ) |这些会很好地束缚你...... +(The SPEAKER grins and motions again)|(The plants wrap around you quickly)|(You wriggle against the RESTRAINT) +( SPEAKER 咧嘴一笑,再次做了个动作 ) | ( 植物迅速包围了你 ) | ( 你扭动着抵抗 RESTRAINT ) +(The SPEAKER pouts)|Aww... +( SPEAKER 撅起嘴 ) |哇... +(The SPEAKER frowns)|Not even a little? +( SPEAKER 皱起眉头 ) |一点都不? +(The SPEAKER smirks)|That wasn't a question~ +( SPEAKER 傻笑 ) |这不是问题~ +(The SPEAKER giggles again)|(Vines begin to move around your feet)|Hold still dear~ +( SPEAKER 再次咯咯地笑 ) | ( 藤蔓开始在你脚边移动 ) |亲爱的,坚持住~ +(The SPEAKER sighs and nods)|(The vines retreat from you)|Fiiine, you can go~ +( SPEAKER 叹了口气,点头 ) | ( 藤蔓从你身边撤退 ) |好--吧,你可以走了~ +(The vines move much faster)|(You feel the RESTRAINT as you squirm)|A gift, from me~ +( 藤蔓移动得更快 ) | ( 你扭动时感觉到了 RESTRAINT ) |一份礼物,来自我~ +(The SPEAKER giggles loudly)|(The vines catch up and pin you down)|(When they let go, you're left with a RESTRAINT) +( SPEAKER 咯咯大笑 ) | ( 藤蔓追上并把你压住 ) | ( 当它们松开时,你就只剩下 RESTRAINT 了 ) + + +Always! +肯定啊! + + +That sounds exciting! +听起来让人兴奋不已! +Wait, not like this! +等等,不是这样的! + + +W-Well- o-okay... +嗯-好- 好-好吧... +Don't! (PERCENT chance to avoid) +不! ( PERCENT 的概率避开 ) +(Shake your head) (PERCENT chance to avoid) +( 摇头 ) ( PERCENT 的概率避开 ) + + + + +(A SPEAKER approaches)|Nothing quite beats a strong metal|chain, right? +( SPEAKER 走近 ) |没有什么比坚固的金属|锁链更胜一筹了,对吧? +(The SPEAKER nods happily)|Exactly!|Want one for yourself? +( SPEAKER 高兴地点点头 ) |完全正确!|想要给自己一个吗? +(The SPEAKER wraps a long chain around you)|This should do the trick~|(RESTRAINT settles in place) +( SPEAKER 将一条长链缠绕在你身上 ) |这样应该就可以了~| ( RESTRAINT 就位 ) +(The SPEAKER sighs)|Ah well. +( SPEAKER 叹了口气 ) |啊,好吧。 +(The SPEAKER frowns sadly)|But they make the best noise! +( SPEAKER 悲伤地皱起眉头 ) |但他们发出的声音是最好听的! +(The SPEAKER rolls her eyes)|Tough luck then~|You're getting one! +( SPEAKER 翻了个白眼 ) |那就倒霉了~|你得了一个! +(The SPEAKER grins)|See how you feel when|you're wearing one! +( SPEAKER 笑了 ) |看看当你戴着它时|你的感觉如何! +(The SPEAKER sighs)|Maybe another time then. +( SPEAKER 叹了口气 ) |也许下次吧。 +(The SPEAKER wraps a long chain around you)|(RESTRAINT hugs your body closely)|(You shiver as the cold metal touches you) +( SPEAKER 用一条长链将你缠住 ) | ( RESTRAINT 紧紧地拥抱住你的身体 ) | ( 当冰冷的金属接触到你时,你颤抖起来 ) +(The SPEAKER grins as she binds your body)|(RESTRAINT digs into you a little)|Enjoy, cutie~ +( SPEAKER 在束缚你的身体时咧嘴一笑 ) | ( RESTRAINT 对你有一点影响 ) |享受吧,小可爱~ + + +I love chains! +我喜欢锁链! +Plenty beats it. +太多了。 + + +Absolutely~ +绝对的~ + + +I-If I have to... +如-如果我必须…… +Ah! Cold! (PERCENT chance to avoid) +啊! 好冷! ( 有 PERCENT 的机会避开 ) + + + + (The SPEAKER nervously walks up to you)|Excuse me miss...|Are you a fan of latex by chance? -(SPEAKER紧张地走到你面前)|请问小姐……|你是不是乳胶爱好者? +( SPEAKER 紧张地走到你面前 ) |请问小姐……|你是不是乳胶爱好者? (The SPEAKER blushes deeply)|Then would you like to try on this RESTRAINT? -(SPEAKER脸红了)|那你要不要试试这个RESTRAINT? +( SPEAKER 脸红了 ) |那你要不要试试这个RESTRAINT? (The SPEAKER smiles)|You look so good in that! -(SPEAKER笑了)|你穿那个很好看! +( SPEAKER 笑了 ) |你穿那个很好看! (The SPEAKER frowns)|Aww... -(SPEAKER皱眉)|哇…… +( SPEAKER 皱眉 ) |哇…… (The SPEAKER blushes)|Okay... sorry I asked. -(SPEAKER脸红了)|好吧……很抱歉。 +( SPEAKER 脸红了 ) |好吧……很抱歉。 (The SPEAKER grins and reaches for a RESTRAINT)|Well, too bad-- -(说话者咧嘴一笑,伸手拿来 RESTRAINT )|好吧,太糟糕了—— +( SPEAKER 咧嘴一笑,伸手拿来 RESTRAINT ) |好吧,太糟糕了—— (The SPEAKER grins)|I wasn't offering you a choice...|I was asking if you would LIKE it, hehe~ -(SPEAKER笑)|我没有给你选择...|我只是问你是否喜欢,呵呵~ +( SPEAKER 笑 ) |我没有给你选择...|我只是问你是否喜欢,呵呵~ (The SPEAKER frowns)|...You're fast! -(SPEAKER皱眉)|...好快! +( SPEAKER 皱眉 ) |...好快! (The SPEAKER smiles)|That's right~ -(SPEAKER微笑)|这就对了~ -(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight! -(SPEAKER 束缚住你并上锁)|好!又好又紧! +( SPEAKER 微笑 ) |这就对了~ +(The SPEAKER restrains you and clicks a lock on)|There! Nice and tight! +( SPEAKER 束缚了你并上了锁 ) |瞧瞧!美妙的束缚! + + Why of course! 当然!怎么了? -(Nod happily) -(高兴地点头) -Not really. -不。 -(Shake your head) -(摇头) + + That sounds fun! 这听起来很有趣! -(Nod again) -(再次点头) No, I don't want that! 不,我不想要! -(Shake your head) -(摇头) + + Okay, fine... 好的... -(Moan and giggle) -(呻吟和傻笑) Wait, what? (PERCENT chance to avoid) -等等,什么? (PERCENT 的概率闪避) -(Shake your head and moan) (PERCENT chance to avoid) -(摇头呻吟)(PERCENT 的概率闪避) +等等,什么? ( PERCENT 的概率避开 ) + + +(The SPEAKER steps up to you)|Hey girl~|You happen to be a fan of latex? +( SPEAKER 走近你)|嘿,女孩~~你恰好是乳胶迷吗? +(The SPEAKER smiles)|Then would you like to try on this RESTRAINT? +( SPEAKER 微笑)|那么你想试试这个 RESTRAINT 吗? +(The SPEAKER chuckles)|Tight and shiny! +( SPEAKER 轻笑)|又紧又亮! +(The SPEAKER shrugs)|Alright. Sorry I asked. +( SPEAKER 耸耸肩)|好吧。很抱歉我唐突了。 + + + + +(The SPEAKER walks up to you)|Say, would you be interested in some 'protection?' +( SPEAKER 走到你面前 ) |嘿,你要不要来点“保护”? +(The SPEAKER grins)|Wonderful! You see, I've just recently acquired one of these...|(She shows you a loose RESTRAINT)|I'm not too interested in wearing one myself,|but I thought you'd be a good fit for it? +( SPEAKER 轻笑 ) |太棒了!你看,我最近刚买了一个……(她给你展示了一件宽松的RESTRAINT)|我自己对穿它不太感兴趣,|但我觉得你会很适合它? +(The SPEAKER blushes as she locks the belt around your waist)|I'm enjoying this more than I thought I would~ +( SPEAKER 把束带锁在你的腰上时脸红了 ) |我比想象中更享受这一切 +(The SPEAKER smiles)|Enjoy your freedom while it lasts~ +(SPEAKER 微笑)|趁自由还在,好好享受吧~ +(The SPEAKER shrugs)|That's okay, just thought I'd ask. +(SPEAKER 耸了耸肩)|没关系,我只是想问问。 +(The SPEAKER rubs the smooth metal seductively)|Are you sure?|Adventurers need to take care of themselves.|You don't want to lose control of yourself and run into some curse,|do you? +(SPEAKER 诱惑地摩擦光滑的金属)|你确定吗?|冒险家需要照顾好自己。|你不想失去控制,陷入某种诅咒,|是吗? +(The SPEAKER gives an evil smile)|What if I wasn't asking? +(SPEAKER 露出邪恶的微笑)|如果我不是请求呢? +(The SPEAKER sighs)|I'll find some other cutie to wear it, I guess~ +( SPEAKER 叹了口气)|我想我会找其他可爱的人来穿它~ +(The SPEAKER blushes as she locks the RESTRAINT onto you)|There we go~ +(The SPEAKER 把RESTRAINT锁定在你身上时脸红了)|好了~ +(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Whoops! I guess I acted too soon.|Ah well~ +(当你转身时,SPEAKER让你大吃一惊)|(你听到腰间的咔哒声)|唉呀!我想我行动太快了。|Ah, 好了~ +(The lock on the RESTRAINT starts glowing...) +( RESTRAINT 上的锁开始发光…… ) + + +Protection? Certainly! +保护吗?当然! +Nah, I'm good. +不,我很好。 + + +I would love to wear it! +我很想穿它! +(Nod again, excited) +( 再次点头,兴奋 ) +...No thank you. +…不用了,谢谢。 +(Shake your head, puzzled) +( 摇头,疑惑 ) + + +Fine. I need the protection anyway. +好吧。反正我也需要保护。 +I refuse. (PERCENT chance to avoid) +我拒绝。(PERCENT 的概率躲开) + + +(Look at your belt...) +( 看你的贞操带…… ) + + + + (The SPEAKER nervously walks up to you)|Excuse me miss...|Can you help me out? -(SPEAKER紧张地走到你面前)|请问小姐……|你能帮帮我吗? -(The SPEAKER blushes deeply)|I managed to unlock my RESTRAINT,|but my mistress expects me to wear it!|Do you mind wearing it instead? -(说话的人脸红了)|我设法解开了我的 RESTRAINT ,|但我的女主人希望我戴上它!|你介意戴上它吗? +( SPEAKER 紧张地走到你面前 ) |请问小姐……|你能帮帮我吗? +(The SPEAKER blushes deeply)|I found this cursed RESTRAINT and I can't let go of it!|Could you... wear it for me? +( SPEAKER 深深地脸红了 ) |我设法解开了我的 RESTRAINT,|但我的女主人希望我戴上它!|你能为我戴上它吗? (The SPEAKER smiles)|Thank you so much, miss! -(SPEAKER微笑)|非常感谢您,小姐! -(The SPEAKER frowns)|I'm going to get in trouble... -(SPEAKER皱眉)|我要惹麻烦了…… +( SPEAKER 微笑 ) |非常感谢您,小姐! +(The SPEAKER frowns)|...That does seem rather far-fetched of me to ask. +(SPEAKER 皱眉)|...…我这样问确实有点牵强。 (The SPEAKER blushes)|Oh... okay. -(SPEAKER脸红了)|哦……好吧。 -(The SPEAKER frowns angrily)|Look, I know you're in trouble around here.|Just do me a favor. Please.|I need you to wear this RESTRAINT. -(SPEAKER愤怒地皱起眉头)|看,我知道你在这附近有麻烦。|帮我一个忙。拜托。|我需要你戴上这个 RESTRAINT 。 -(The SPEAKER pleads with you)|My mistress is a magician!|She put a spell on it that senses if it's being worn.|Please, you have to hurry! -(说话者恳求你)|我的女主人是个魔术师!|她在上面施了一个咒语,可以感知它是否被戴着。|求求你了,你得快点! +( SPEAKER 脸红了 ) |哦……好吧。 +(The SPEAKER frowns angrily)|Look, we all know how much you enjoy being restrained~|Do me a favor and wear the RESTRAINT, okay? +SPEAKER 愤怒地皱起眉头 ) |听着,我们都知道你有多喜欢被束缚~|帮我个忙,戴上这个 RESTRAINT ,好吗? +(The SPEAKER pleads with you)|...point taken. But still!|I'll end up stuck in it for a really long time... +(The SPEAKER 恳求你)|... 明白了.但!|我最终会被困在里面很长一段时间…… (The SPEAKER sighs and wears it herself)|(The lock starts glowing brightly...) -(SPEAKER叹了口气,自己戴上)|(锁开始发光……) +( SPEAKER 叹了口气,自己戴上 ) | ( 锁开始发光…… ) (The SPEAKER looks relieved)|Thank you so much miss!|I won't forget you! -(SPEAKER松了口气)|非常感谢!|我不会忘记你的! -(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Hmmph! Serves you right!| -(当你转身时,SPEAKER 让你大吃一惊)|(你听到腰部咔哒一声)|嗯!很适合你! -(The lock on the RESTRAINT starts glowing...) -(RESTRAINT 上的锁开始发光……) +( SPEAKER 松了口气 ) |非常感谢!|我不会忘记你的! +(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|I'm sorry miss! It was my only choice~ +(当你转身, SPEAKER 让你大吃一惊)|(你听到腰部咔哒一声)|对不起,小姐!这是我唯一的选择~ + + I would love to help! 我很乐意提供帮助! -(Nod eagerly) -(急切地点头) -Go find someone else. -去找别人。 -(Shake your head) -(摇头) +You're asking me to get cursed? +你想要我被诅咒? + + That sounds like a tempting offer. 这听起来像是一个诱人的提议。 -(Nod again, excited) -(再次点头,兴奋) ...What? Why would I need to wear it? ...什么?为什么我需要穿它? -(Shake your head, puzzled) -(摇头,疑惑) + + Fine. I'll do it because you asked. 好。为了你,我会这样做。 -(Moan and nod slowly) -(呻吟着慢慢点头) I won't help you. Wear it yourself. (PERCENT chance to avoid) -我不会帮你的。自己穿。 (PERCENT 的概率闪避) -(Shake your head) (PERCENT chance to avoid) -(摇头)(PERCENT 的概率闪避) -(Look at your belt...) -(看你的腰带……) +我不会帮你的。自己穿。 ( PERCENT 的概率避开 ) + + + + (The SPEAKER walks up to you)|We don't get a lot of visitors.|I take it that you enjoy bondage? -(SPEAKER向你走来)|访客可是很少见的。|你喜欢束缚吗? +( SPEAKER 向你走来 ) |少见的访客。|我猜你喜欢被束缚? (The SPEAKER tilts her head)|Well, I have a RESTRAINT lying around,|and I figured you'd enjoy it. -(SPEAKER歪着头)|嗯,我这里有一个 RESTRAINT 放在这里,|我觉得你会喜欢的。 +( SPEAKER 歪着头 ) |嗯,我这里有一个 RESTRAINT ,|我觉得你会喜欢的。 (The SPEAKER smiles)|I'm glad you like it! -(SPEAKER微笑)|很高兴你喜欢! +( SPEAKER 微笑 ) |很高兴你喜欢! (The SPEAKER frowns)|I guess I'll have to find someone else to wear it. -(SPEAKER 皱眉)|我想我得找别人穿了。 +( SPEAKER 皱眉 ) |我想我得找别人穿了。 (The SPEAKER looks disappointed)|Oh well. -(SPEAKER看起来很失望)|哦好吧。 +( SPEAKER 看起来很失望 ) |哦好吧。 (The SPEAKER grins and reaches toward you!)|Well, I think it'd look great on you! -(SPEAKER 咧嘴一笑,朝你伸出手!)|嗯,我觉得你穿起来会很好看! +( SPEAKER 咧嘴一笑,朝你伸出手! ) |嗯,我觉得你穿起来会很好看! (The SPEAKER grins)|You don't have a choice, dear~ -(SPEAKER笑)|你别无选择,亲爱的~ +( SPEAKER 笑 ) |你别无选择,亲爱的~ (The SPEAKER frowns)|Darn it! Missed my chance. -(SPEAKER皱眉)|该死!错过了我的机会。 +( SPEAKER 皱眉 ) |该死!错过了我的机会。 (The SPEAKER smiles)|Good, good~ -(SPEAKER微笑)|不错,不错~ -(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight! -(SPEAKER 束缚住你并点击锁定)|好!又好又紧! -Why of course! -当然!怎么了? -(Nod happily) -(高兴地点头) -Not really. -不。 -(Shake your head) -(摇头) -That sounds fun! -这听起来很有趣! -(Nod again) -(再次点头) -No, I don't want that! -不,我不想! -(Shake your head) -(摇头) -Okay, fine... -好吧... -(Moan and giggle) -(呻吟和傻笑) -Wait, what? (PERCENT chance to avoid) -等等,什么? ( PERCENT 的概率闪避ER) -(Shake your head and moan) (PERCENT chance to avoid) -(摇头呻吟)( PERCENT 的概率闪避ER) +( SPEAKER 微笑 ) |不错,不错~ + + + + + + + + (The SPEAKER grins as she sees you)|Hey there sweetie~|I think you'd look good in some ropes! -(SPEAKER 看到你就笑了)|嘿,亲爱的~|我觉得绳子在你身上很好看! +( SPEAKER 看到你就笑了 ) |嘿,亲爱的~|我觉得绳子在你身上很好看! (The SPEAKER looks at your bound body)|I've got some more ropes for you, babe! -(说话的人看着你被捆绑的身体)|我给你准备了更多的绳子,宝贝! +( SPEAKER 看着你被捆绑的身体 ) |我给你准备了更多的绳子,宝贝! (The SPEAKER smiles)|Okay, hold still while I get you rigged up~ -(SPEAKER微笑)|好吧,请等等,让我给你绑好~ +( SPEAKER 微笑 ) |好吧,请等等,让我给你绑好~ (The SPEAKER slaps your butt as she ties the last knot)|All trussed up~ -(SPEAKER在打最后一个结时拍拍你的屁股)|全部绑好了~ +( SPEAKER 在打最后一个结时拍拍你的屁股 ) |全部绑好了~ (The SPEAKER looks disappointed and packs her rope away) -(说话者看起来很失望,把她的绳子收起来) +( SPEAKER 看起来很失望,把她的绳子收起来 ) (The SPEAKER frowns)|Aw. What a missed opportunity! -(SPEAKER皱眉)|噢。多么难得的机会! +( SPEAKER 皱眉 ) |噢。多么难得的机会! (The SPEAKER grins and reaches for her satchel)|Well, too bad-- -(说话者咧嘴一笑,伸手去拿她的包)|好吧,太糟糕了—— +( SPEAKER 咧嘴一笑,伸手去拿她的包 ) |好吧,太糟糕了—— (The SPEAKER grins)|But I've already brought so much rope with me~ -(SPEAKER笑着)|可是我已经带了这么多绳子了~ +( SPEAKER 笑着 ) |可是我已经带了这么多绳子了~ (The SPEAKER frowns)|Suit yourself. -(SPEAKER皱眉)|随你便。 +( SPEAKER 皱眉 ) |随你便。 (The SPEAKER smiles)|Good girl~ -(SPEAKER微笑)|好姑娘~ +( SPEAKER 微笑 ) |好姑娘~ (The SPEAKER takes you down and trusses you up tightly)|That'll teach you~ -(SPEAKER把你拉下来,把你绑得紧紧的)|给你长个教训~ +( SPEAKER 把你拉下来,把你绑得紧紧的 ) |给你长个教训~ + + I think so too! 我也这么认为! -(Nod excitedly) -(兴奋地点头) I don't think so. 我不这么认为。 -(Shake your head) -(摇头) -Yes miss! -是的,女士! + + (Wiggle in place happily) -(开心地在原地扭动) +( 开心地在原地扭动 ) Actually, I'm having second thoughts... 其实我在思考... (Shake your head nervously) -(紧张地摇头) +( 紧张地摇头 ) + + Fine. You win. -美好的。你赢了。 -(Moan and giggle) -(呻吟和傻笑) +好吧。你赢了。 Go away! (PERCENT chance to avoid) -离开! ( PERCENT 的概率闪避) -(Shake your head and moan) (PERCENT chance to avoid) -(摇头呻吟)( PERCENT 的概率闪避) +离开! ( PERCENT 的概率闪避 ) + + + + (The SPEAKER perks her ears as she sees you)|You've got a nice body.|I think it'll do better with some training! -(SPEAKER一看到你就竖起耳朵)|你的体型很完美。|我想通过一些训练会做得更好! +( SPEAKER 一看到你就竖起耳朵 ) |你的体型很完美。|我想通过一些训练会做得更好! (The SPEAKER grins and hands you a paper)|Nevermere Training is always looking for new recruits!|I'll just have you sign here... -(SPEAKER 咧嘴笑着递给你一张纸)|Nevermere Training 一直在寻找新人!|你只需要在这里签字…… +( SPEAKER 咧嘴笑着递给你一张纸 ) |Nevermere 训练师一直在寻找新人!|你只需要在这里签字…… (The SPEAKER gets you suited up)|There you go! Now go be a good girl! -(SPEAKER让你穿上衣服)|你去!现在去做一个好女孩吧! +( SPEAKER 让你穿上衣服 ) |现在去!去做一个好女孩吧! (The SPEAKER scoffs)|That's what they all say. -(SPEAKER 嗤笑)|他们都是这么说的。 +( SPEAKER 嗤笑 ) |他们都是这么说的。 (The SPEAKER frowns)|What a shame. -(SPEAKER皱眉)|真可惜。 +( SPEAKER皱眉 ) |真可惜。 (The SPEAKER grins and reaches for her baton)|No? Well, I heard you have some debts to pay~ -(SPEAKER咧嘴一笑,伸手接过她的指挥棒)|不是吗?嗯,听说你有些欠债了~ +( SPEAKER 咧嘴一笑,伸手接过她的指挥棒 ) |不是吗?嗯,听说你有些欠债了~ (The SPEAKER grins)|I promise you it's a good deal~ -(SPEAKER咧嘴一笑)|我向你保证很划算~ +( SPEAKER 咧嘴一笑 ) |我向你保证很划算~ (The SPEAKER frowns)|Fine. I'll look for other candidates. -(SPEAKER皱眉)|好吧。我会寻找其他候选人。 +( SPEAKER 皱眉 ) |好吧。我会寻找其他候选人。 (The SPEAKER smiles)|That's right. Your name, please? -(SPEAKER微笑)|没错。请你告诉我你的名字? +( SPEAKER 微笑 ) |没错。请你告诉我你的名字? (The SPEAKER zaps you and places you in restrictive gear)|Hmph. Unruly girls need training! -(SPEAKER 对你进行电击并将你置于限制性装备中)|哼。不守规矩的女孩需要训练! +( SPEAKER 对你进行电击并将你置于限制性装备中 ) |哼。不守规矩的女孩需要训练! + + This sounds like an interesting opportunity. 这听起来像是一个有趣的机会。 -(Nod excitedly) -(兴奋地点头) No thanks, I know what that entails... 不,谢谢,我知道那意味着什么... -(Shake your head) -(摇头) + + I'll sign it! 我会签的! -(Accept the contract) -(接受合同) A contract? No way. -合同?没门。 +契约?没门。 (Refuse the contract) -(拒绝合同) +( 拒绝契约 ) + + Fine. I'll sign it... 好吧。我会签... -(Moan and nod) -(呻吟和点头) Never! (PERCENT chance to avoid) -绝不! ( PERCENT 的概率闪避) +绝不! ( PERCENT 的概率避开 ) (Shake your head and frown) (PERCENT chance to avoid) -(摇头皱眉)( PERCENT 的概率闪避) +( 摇头皱眉 ) ( PERCENT 的概率避开 ) + + (The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(SPEAKER看到你,做了一个简短的鞠躬)|你好。|你似乎拥有我们想要的品质。|我很乐意为你提供一个职位…… +( SPEAKER 看到你,做了一个简短的鞠躬 ) |你好。|你似乎拥有我们想要的品质。|我很乐意为你提供一个职位…… (The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(说话者在清清嗓子前微微一笑)|太棒了!|我这里有你的制服…… +( SPEAKER 在清清嗓子前微微一笑 ) |太棒了!|我这里有你的制服…… (The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(SPEAKER 将你扣上,将系带拉得特别紧……)|(你听到几道锁扣的咔哒声……)|太棒了。你的首要任务是清理这层地板。|祝你好运。 +( SPEAKER 将你扣上,将系带拉得特别紧…… ) | ( 你听到几道锁扣的咔哒声…… ) |太棒了。你的首要任务是清理这层地板。|祝你好运。 (The SPEAKER tilts her head and shrugs)|We are always prepared... -(SPEAKER歪着头耸了耸肩)|我们时刻准备着…… +( SPEAKER 歪着头耸了耸肩 ) |我们时刻准备着…… (The SPEAKER nods)|Fair enough. -(SPEAKER点头)|很公平。 +( SPEAKER 点头 ) |很公平。 (The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(SPEAKER咧嘴一笑,扯出一件轻薄的裙子)|我可以提醒你一下,你已经结交了不少……敌人?|如果你遇到其中一个,那就太可惜了…… +( SPEAKER 咧嘴一笑,扯出一件轻薄的裙子 ) |我可以提醒你一下,你已经结交了不少……敌人?|如果你遇到其中一个,那就太可惜了…… (The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(SPEAKER得意地点点头)|我们愿意对我们的记录做些修改~ +( SPEAKER 得意地点点头 ) |我们愿意对我们的记录做些修改~ (The SPEAKER frowns)|You won't know what hit you. -(SPEAKER皱眉)|你不会知道是什么影响了你。 +( SPEAKER 皱眉 ) |你不会知道是什么影响了你。 (The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(SPEAKER微笑)|我很高兴你做出了正确的决定。|现在,你的首要任务是清理这层地板。|祝你好运。 +( SPEAKER 微笑 ) |我很高兴你做出了正确的决定。|现在,你的首要任务是清理这层地板。|祝你好运。 (The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(SPEAKER 突然移动的速度超出了你的反应)|(当你被压在地上时,你感到一只脚踩在你的背上)|(她给你穿上制服并锁紧......)|你需要额外的训练, 我想... -This sounds like an interesting opportunity. -这听起来像是一个有趣的机会。 -(Nod excitedly) -(兴奋地点头) -No thanks, I know what that entails... -不,谢谢,我知道那意味着什么... -(Shake your head) -(摇头) +( SPEAKER 突然移动的速度超出了你的反应 ) | ( 当你被压在地上时,你感到一只脚踩在你的背上 ) | ( 她给你穿上制服并锁紧...... ) |你需要额外的训练, 我想... + + Gladly! 乐意! -(Accept the contract) -(接受合同) W-where did you get that uniform? (Refuse) -你、你从哪儿弄来的那件制服? (拒绝) -(Refuse the contract) -(拒绝合同) -Fine. I'll sign it... -好吧。我会签... -(Moan and nod) -(呻吟和点头) -Never! (PERCENT chance to avoid) -绝不! ( PERCENT 的概率闪避) -(Shake your head and frown) (PERCENT chance to avoid) -(摇头皱眉)( PERCENT 的概率闪避) -(The SPEAKER approaches you with an offer)|Greetings! I am a potion trader.|Give me your strongest potions!|I pay cash! -(SPEAKER 向您提出要约)|您好!我是魔药商。|请给我你最强的魔药!|我付现金! +你、你从哪儿弄来的那件制服? ( 拒绝 ) + + + + + + + + + + + + +(The SPEAKER perks her ears as she sees you)|Glory to the blessed kitty!|Are you prepared to join us? +( SPEAKER 看到你时竖起耳朵)|荣耀归于这只被祝福的可爱小猫|你准备好加入我们了吗? +(The SPEAKER nods happily)|Fantastic! You just need to agree to be nice to cats.|And also we own you now. +( SPEAKER 高兴地点了点头)|太棒了!你只需要同意对猫好一点.|而现在我们拥有你。 +(The SPEAKER jumps happily)|Wonderful! Here's your collar! +( SPEAKER 高兴地跳了起来)|太棒了!这是你的颈圈! +(The SPEAKER whimpers and looks at you)|How mean! +( SPEAKER 呜咽着看着你)|真卑鄙! +(The SPEAKER's ears flop)|Aww... we thought you were cute. +( SPEAKER 耳朵噗地立起)|哇...我们觉得你很可爱。 +(The SPEAKER frowns)|Oh? Well, I guess I'll tell the others~ +( SPEAKER 皱着眉头)|哦?好吧,我想我会告诉其他人的~ +(The SPEAKER grins slyly)|You wouldn't hurt the kitties, would you? +( SPEAKER 狡黠地笑着)|你不会伤害小猫吧? +(The SPEAKER frowns)|Then we'll have to make sure you don't come to harm anyone! +( SPEAKER 皱着眉头)|那我们就得确保你不会来伤害任何人! +(The SPEAKER smiles proudly)|I knew you would pull through! +( SPEAKER 骄傲地笑了)|我就知道你会挺过去的! + + +Yes! I love the blessed kity! +是的!我爱被祝福的可爱小猫! +No, you guys are a bunch of weirdos. +不,你们是一群怪人。 + + +Yes! I will be nice to the kitties! +是的!我会对小猫好的! +(Join them) +(加入他们) +Wait, I didn't agree to that! (Refuse) +等等,我不同意!(拒绝) +(Refuse) +(拒绝) + + +Okay fine... I won't hurt the kitties. (Join them) +好吧...我不会伤害小猫的。(加入他们) + + + + + + +(The SPEAKER does a curtsy)|Why hello there!|You have a wonderful bod-er, book!|Would you like to help me? +( SPEAKER 行了个屈膝礼)|你好|你有一个很棒的身亻,书|你愿意帮我吗? +(The SPEAKER smiles briefly)|You have an opportunity to model for me!|I need someone to wear all of my wonderful inventions! +( SPEAKER 微微一笑)|你有机会为我做模特|我需要有人穿上我所有的精彩发明! +(The SPEAKER laces you up in the tight fabric...)|(You hear the click of a few locks going on...)|Oh my goodness... So pretty!|You'll make a fine assistant! +( SPEAKER 把你绑在紧身织物上…)|(你听到几把锁的咔嗒声…)|天哪...太漂亮了|你会成为一名出色的助手! +(The SPEAKER frowns)|Aw... +( SPEAKER 皱着眉头)|噢... +(The SPEAKER clenches her fist to the ceiling)|Nooooo!!! +(SPEAKER 握紧拳头对着天花板)|不!!! +(The SPEAKER grins and pulls out a frilly dress)|Don't knock it till you try it!|Trust me, it'll be fun! +( SPEAKER 咧嘴一笑,拿出一件褶边连衣裙)|除非你试穿,否则别碰它|相信我,这会很有趣的! +(The SPEAKER furrows her brow)|Watch your tongue there, little lady.|Or I'll have to plug it for you... +( SPEAKER 皱起眉头)|小女士,说话要小心|否则我就得帮你把插头插进去…… +(The SPEAKER folds her arms as ribbons rise up around her)|Suit yourself, hehe~ +( SPEAKER 双臂交叉,丝带在她周围飘扬)|随你便,呵呵~ +(The SPEAKER smiles)|Yes! Yes! Wonderful! +( SPEAKER 微笑)|是的!是的!漂亮极了! + + +Sign me up! +给我报名! +(Accept the position) +(接受该职位) +And wear tacky clothes all the time? +一直穿俗气的衣服吗? +(Refuse the position) +(拒绝该职位) + + +Fine... sign me up. +好吧...给我报名。 +Why don't you try it on yourself! (PERCENT chance to avoid) +你为什么不自己试试呢!( PERCENT 的概率避开 ) + + + + + + + + +(The SPEAKER runs up to you)|Wow! You make a fine specimen-er, I mean...|Nice to meet you! +( SPEAKER 向你跑来)|哇!你是个很好的标本-呃,我的意思是|很高兴认识你! +(The SPEAKER smiles)|Now, I have something wonderful in store for you.|(She takes out a blue catsuit)|I'd like you to be my assistant! +( SPEAKER 微笑着)|现在,我有一些很棒的东西等着你|(她拿出一件蓝色的连体紧身衣)|我想让你做我的助手! +(The SPEAKER looks excited)|Awesome! Let me help you get in uniform... +( SPEAKER 看起来很兴奋)|太棒了!让我帮你穿上制服... +(The SPEAKER shrugs)|It was worth a shot... +( SPEAKER 耸耸肩)|值得一试... +(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|There's just... a lot to do.|That's why I need an assistant. +( SPEAKER 看起来很沮丧)|我不是...我的工作并不疯狂|只是...有很多事要做。|这就是为什么我需要一个助手。 +(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|We seek only knowledge! +( SPEAKER 看起来很沮丧)|不...我的工作并不疯狂|我们只追求知识! +(The SPEAKER frowns)|Time for a test run! +( SPEAKER 皱着眉头)|是时候进行试运行了! +(The SPEAKER looks happy again)|Thank you! I'm super grateful! +( SPEAKER 看起来又高兴了)|谢谢!我非常感激! +(The SPEAKER tilts her head)|Fine then. You win.|(As you leave, you hear a 'just kidding' as she breaks a glass vial)|(A suit of blue latex envelops you!) +( SPEAKER 歪着头)|那好吧。你赢了|(当你离开时,你听到她打碎了一个小玻璃瓶,她说 : “开个玩笑。”)|(一套蓝色乳胶套装包裹着你!) + + +...Hello? +...你好? +You guys are crazy. +你们疯了。 + + +(Accept the offer) +(接受提议) +(Refuse the offer) +(拒绝提议) + + +Fine. I'll be your assistant. +好吧。我将成为你的助手。 +Go find someone else. (PERCENT chance to avoid) +去找别人。( PERCENT 的概率避开 ) + + + + + + + + +(The SPEAKER greets you)|Normally we don't meddle in mortal affairs.|But you, Outsider, are different.|Let's have a conversation. +( SPEAKER 问候你)|通常我们不会干涉世俗事务|但你,外来者,是不同的|我们来聊聊。 +(The SPEAKER smiles warmly)|Outsiders have a lower rank in our society.|But it is a rank all the same.|You will be above your mortal peers.|What do you say? +( SPEAKER 热情地微笑)|外来者在我们的社会中地位较低|但这仍然是一个等级|你将超越你的凡人同类|你说呢? +(The SPEAKER clasps some 'jewelry' around your limbs)|You look beautiful, my dear.|I will leave you to your own affairs until we meet again. +( SPEAKER 在你的四肢上扣了一些“珠宝”)|亲爱的,你看起来很漂亮|在我们再次见面之前,我会把你的事情留给你自己处理。 +(The SPEAKER turns her head away)|Hmph. I offer you a bargain and you refuse. +( SPEAKER 转过头去)|哼。我给你一笔交易,然而你拒绝了。 +(The SPEAKER turns her head away)|Hmph. As expected. +( SPEAKER 转过头去)|哼。正如预期的那样。 +(The SPEAKER folds her arms)|If you are not with us, then you are against us.|You shall face the wrath of the wild. +( SPEAKER 双手合十)|如果你不与我们同在,那么你就是在反对我们。|你将面临野性的愤怒。 +(The SPEAKER frowns)|Hardly slavery!|A mere slave would not be allowed to even set foot in our society. +( SPEAKER 皱着眉头)|几乎没有奴隶|一个奴隶甚至不允许踏入我们的社会。 +(The SPEAKER frowns)|We will meet again. +( SPEAKER 皱着眉头)|我们还会再见面的。 +(The SPEAKER nods and smiles)|(She decorates your body with 'jewelry')|I am glad you had a change of heart. +( SPEAKER 点头微笑)|(她用“珠宝”装饰你的身体)|我很高兴你改变了主意。 +(The SPEAKER scoffs)|(Her magic suddenly binds you tightly in glowing ropes)|Amateur. +( SPEAKER 嘲笑)|(她的魔法突然把你紧紧地绑在发光的绳子里)|业余。 + + +I'm interested. (Talk with her) +我很感兴趣。(与她交谈) + + +I accept your gracious offer! +我接受你的盛情提议! +(Accept) +(接受) +I won't be a slave to you. +我不会成为你的奴隶。 + + +Fine, fine... I will accept. +好吧,好吧...我会接受的。 +No way. (PERCENT chance to avoid) +不可能。( PERCENT 的概率避开 ) + + + + + + +(The SPEAKER smiles at you)|Mortal. +( SPEAKER 对你微笑)|凡人。 +(The SPEAKER points to the ground)|Kneel before me and accept your collar. +(SPEAKER指着地面)|跪在我面前,接受你的项圈。 +(The SPEAKER snaps her fingers)|(A collar of cold black metal materializes around your neck)|A girl who knows her place! Wonderful... +(SPEAKER打了个响指)|(冰冷的黑色金属项圈出现在你的脖子上)|一个知道自己位置的女孩!棒极了… +(The SPEAKER scoffs)|Hmmph. Mortals... +(SPEAKER 嘲笑)|哼. 凡人... +(The SPEAKER folds her arms)|Well, look who doesn't know her place~ +(SPEAKER抱起双臂)|唔,看看谁不知道自己的位置 +(The SPEAKER folds her arms)|I didn't offer you a choice in the matter.|You're mine, I've decided that. +( SPEAKER 抱起双臂)|在这件事上我没有给你选择的余地。|你是我的,我已经决定了。 +(The SPEAKER's eyes begin to glow)|Looks like we'll do this the fun way! +(SPEAKER的眼睛开始发光)|看起来我们要用有趣的方式来做这件事! +(The SPEAKER smiles)|Wonderful~|Now come along, my pet! +(The SPEAKER 微笑)|好极了~|来吧,我的宠物! +(The SPEAKER scoffs and snaps her fingers)|(Metallic restraints come at you from all angles and snap in place tightly)|(A gag forces itself into your mouth)|Now then, what were we saying? +( SPEAKER 嘲笑并捏手指)|(金属拘束束装置从各个角度向你扑来,紧紧地扣到位)|(一个塞子强行塞进你的嘴里)|现在,我们在说什么? + + +Yes? +什么事? +I don't talk to monsters! +我不跟怪物说话! + + +O-okay. (Kneel) +好-好吧。(下跪) +(Kneel) +(下跪) +I refuse! +我拒绝! + + +Then it looks like I have no choice. (Join her) +那么,我似乎别无选择。(加入她) +I will never bow to you! (PERCENT chance to avoid) +我永远不会向你鞠躬!( PERCENT 的概率避开 ) + + + + + + +(The SPEAKER waves)|You seem like an exceptional individual.|What do you think of joining the Guild? +( SPEAKER 挥手)|你看起来是个与众不同的人|你觉得加入公会怎么样? +(The SPEAKER smiles)|Excellent! I'll put in a word with the Guild.|Do note: this will affect your reputation with certain bad actors. +( SPEAKER 微笑)|太棒了!我会和公会谈谈的|请注意 : 这会影响你在某些坏角色面前的声誉。 +(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. +( SPEAKER 拿出一个魔法卷轴并签名)|(卷轴消失在以太中)|祝你好运,自由职业者。 +(The SPEAKER nods)|Fair enough. Guild work is not for everyone. +( SPEAKER 点了点头)|够公平的。工会工作并不适合所有人。 +(The SPEAKER nods)|Very well, then I won't bother you. +( SPEAKER 点点头)|好吧,那我就不打扰你了。 +(The SPEAKER looks dubious)|You know, there's quite a bounty on your head.|I'm sure we could do something about it. +( SPEAKER 看起来很可疑)|你知道,你头上有很多赏金|我相信我们可以做点什么。 +(The SPEAKER tilts her head)|Haha, very funny.|We both know that you're not one of those... right? +( SPEAKER 歪着头)|哈哈,很好笑|我们都知道你不是那种人...对吗? +(The SPEAKER frowns and readies for battle)|My instincts were right. +( SPEAKER 皱着眉头,准备战斗)|我的直觉是对的 +(The SPEAKER suddenly strikes you to the floor)|(You feel a foot on your back as she ties you in a strict rope hogtie...)|(She dusts off her hands)|We'll have a talk when you get out of that, okay? +( SPEAKER 突然把你撞倒在地)|(当她把你绑在一个严密的绳圈里时,你感觉有只脚在你背上……)|(她掸掉手上的灰尘)|等你出来,我们再聊,好吗? + + +I have no interest in joining the guild. +我对加入公会没有兴趣。 + + +What if I am one of those bad actors? (Refuse) +如果我是那种坏角色呢?(拒绝) + + +Fine... (Join) +好吧...(加入) +Go away. (PERCENT chance to avoid) +走开。(PERCENT 的机会避开) +(Frown at her) (PERCENT chance to avoid) +(对她皱眉头)(PERCENT 的机会避开) + + + + + + + + +(The SPEAKER beeps)|Prisoner 74121 identified.|Subject not registered in database. +( SPEAKER 发出嘟嘟声 ) |囚犯 74121 已识别。|对象未在数据库中注册。 +(The SPEAKER beeps)|Confirming database entry.|Say 'I will be a good girl' to enter database. +( SPEAKER 发出嘟嘟声 ) |正在确认数据库条目。|说 '我会成为一个好女孩' 以进入数据库。 +(The SPEAKER beeps and applies tracking gear)|(The metallic cables click into place with a soft beep)|Prisoner 74121 registered. Good girl. +( SPEAKER 发出蜂鸣声并启用跟踪装置 ) | ( 金属缆绳卡入到位,发出柔和的蜂鸣声 ) | 囚犯 74121 已注册。好女孩。 +(The SPEAKER beeps)|Acknowledged. Be warned:|Lost contact with Sections 98, 97, 96, 95...|(The list goes on...) +( SPEAKER 发出嘟嘟声 ) |已确认。请注意 : ‎|与第 98、97、96、95 条失去联系...| ( 这样的例子不胜枚举... ) +(The SPEAKER beeps)|Acknowledged. Updating records. +( SPEAKER 发出嘟嘟声 ) |已确认。 更新记录。 +(The SPEAKER beeps and flashes its lights)|Target acquired. +( SPEAKER 发出蜂鸣声并闪烁灯光 ) |已获取目标。 +(The SPEAKER beeps and flashes its lights)|Target has complied. Supplying uniform. +( SPEAKER 发出蜂鸣声并闪烁灯光 ) |目标已遵守。提供制服。 +(The SPEAKER beeps and flashes its lights)|Engaging capture protocol. +( SPEAKER 发出蜂鸣声并闪烁灯光 ) |启用捕获协议。 +(The SPEAKER beeps and flashes its lights)| +( SPEAKER 发出蜂鸣声并闪烁灯光 ) | +(The SPEAKER blasts you with a stunning ray and captures you)|Target neutralized. +( SPEAKER 用令人惊叹的射线攻击你并捕获你 ) |目标被压制。 + + +Please register me. +请注册我。 +(Stop to talk to the robot) +( 停止和机器人说话 ) +Prisoner 74121? You must be mistaken... +囚犯 74121? 你一定是弄错了... +(Avoid the robot) +( 避开机器人 ) + + +Prisoner 74121 reporting. I will be a good girl. +囚犯 74121 报告。我会是一个好女孩。 +Actually, I am an administrator. (Refuse) +事实上,我是一名管理员。 ( 拒绝 ) + + +I'm sorry, I will be a good girl! +对不起,我会做一个好女孩! +What? (PERCENT chance to avoid) +什么? ( PERCENT 的概率避开 ) + + + + + + +(The SPEAKER smiles)|I used to be an adventurer like you.|Then I joined up with the Dragonhearts! +( SPEAKER 笑了)|我以前和你一样是个冒险家|然后我加入了龙之心! +(The SPEAKER clears her throat)|Well, we're actually recruiting!|You're free to join us if you agree to fight for justice! +( SPEAKER 清了清嗓子)|好吧,我们实际上是在招募人手|如果你同意为正义而战,你就可以自由加入我们! +(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! +( SPEAKER 坚定地与你握手)|欢迎加入姐妹会,冒险家! +(The SPEAKER tilts her head and shrugs)|Ah well. +( SPEAKER 歪着头耸耸肩)|哎,好吧。 +(The SPEAKER frowns)|What is it?|You're not an enemy of justice, are you? +( SPEAKER 皱着眉头)|这是什么|你不是正义的敌人,是吗? +(The SPEAKER frowns)|...If you won't fight for justice, that makes you an enemy of justice. +( SPEAKER 皱着眉头)|...如果你不为正义而战,那你就是正义的敌人。 +(The SPEAKER frowns and cracks her knuckles)|Looks like my suspicions were right!|Looks like you and I are going to have a little chat... +( SPEAKER 皱着眉头,掰着指关节)|看来我的怀疑是对的|看来你和我要聊一会儿... +(The SPEAKER giggles)|Hehe, just messin' with ya.|Anyway, welcome to the sisterhood! +(SPEAKER 咯咯地笑了起来)|呵呵,跟你捣乱|不管怎样,欢迎加入姐妹会! +(The SPEAKER grabs you and ties you up)|You won't be making trouble like that any time soon. +( SPEAKER 抓住你,把你绑起来)|你很快就不会那样惹麻烦了。 + + +I wish I could join you. +我希望我能加入你们。 +Please go away. +请离开。 +(Back away) +(后退) + + +Great! Sign me up! +太棒了给我报名! +(Join) +(加入) +Fight for justice? Sounds restrictive... +为正义而战?听起来限制太大... + + +Actually, justice doesn't sound bad! +事实上,正义听起来并不坏! +What are you going to do about it? (PERCENT chance to avoid) +你打算怎么办? ( PERCENT 的概率避开 ) + + + + +(The SPEAKER waves and calls you over)|Looks like you've made a name for yourself.|What do you say to a little agreement? +( SPEAKER 挥手叫你过来)|看来你已经出名了|你觉得达成一个小协议怎么样? +(The SPEAKER clears her throat)|Well, you're currently on our turf.|But we're willing to cut you some slack.|You just have to agree not to attack any of us. +( SPEAKER 清了清嗓子)|好吧,你现在在我们的地盘上。|但我们愿意让你放松一下|你只需要同意不攻击我们任何人。 +(The SPEAKER frowns)|Criminals? Girl, we ARE the law around these parts~ +( SPEAKER 皱着眉头)|罪犯?女孩,我们是这些地方的法律~ +(The SPEAKER grins)|I like your spunk, girl.|But you're kidding, right? +( SPEAKER 咧嘴一笑)|我喜欢你的勇气,女孩|但你在开玩笑,对吧? +(The SPEAKER raises her fists and smiles)|You're on! +( SPEAKER 举起拳头微笑)|你来了! +(The SPEAKER chuckles)|Here's a toast to a new partnership! +( SPEAKER 轻笑)|为新的合作伙伴关系干杯! +(The SPEAKER catches you and trusses you up)|Maybe we'll just have to find you an owner, then!|Hehe. +( SPEAKER 抓住你,把你捆起来)|也许我们只需要给你找个主人就行了|呵呵。 + + +I'm all ears. +我洗耳恭听。 +(Listen closely) +(仔细听) +I don't deal with criminals. +我不与罪犯打交道。 + + +It's a deal! +成交了! +(Mumble in agreement) +(咕哝着同意) +You don't understand. This is MY turf. +你不明白。这是我的地盘。 +(Scoff at her through your gag) +(透过你的口塞嘲笑她) + + +Haha, just kidding. I'm with you. +哈哈,开玩笑的。我和你同在。 +Put 'em up! (PERCENT chance to avoid) +举起手来!( PERCENT 的概率避开 ) + + + + + + + + + + +(The SPEAKER stops walking and speaks)|You there!|It seems your attunement with magic is high.|Join us. +( SPEAKER 停下脚步说话)|你在那儿|看来你对魔法的调谐很高|加入我们。 +(The SPEAKER nods calmly)|We will use some special equipment to increase your attunement.|Put these on. +( SPEAKER 平静地点了点头)|我们将使用一些特殊设备来增强你的调谐|穿上这些。 +(The 'equipment' locks in place)|Excellent. Soon you will be much more powerful. +(“equipment”锁定到位)|太好了。很快你就会变得更强大。 +(The SPEAKER stops talking and walks away.) +( SPEAKER 停止说话,走开了。) +(The SPEAKER walks away like nothing happened.) +( SPEAKER 若无其事地走开了。) +(The SPEAKER frowns slightly)|We are prepared to use force if need be... +( SPEAKER 微微皱了皱眉)|如果需要,我们准备使用武力... +(The SPEAKER stares at you)|Why? Did you not say you wanted to join us? +( SPEAKER 盯着你看)|为什么?你不是说你想加入我们吗? +(The SPEAKER frowns)|We have failed to convince the human. +( SPEAKER 皱着眉头)|我们没能说服人类。 +(The SPEAKER nods.)|You have made a wise decision. +( SPEAKER 点了点头。)|你做了一个明智的决定。 +(The SPEAKER uses magic to force you.)|There. Try not to succumb to your desires too much. +( SPEAKER 用魔法强迫你。)|好了。尽量不要太屈从于你的欲望。 + + +Um... sure? +呃…确定吗? +Get away from me! +离我远点! + + +Shiny... (Put them on) +好闪亮...(穿上它们) +(Let her put them on you) +(让她给你穿上) +What? No way! (Refuse) +什么?不行!(拒绝) + + +Okay, I will wear them... +好的,我会穿上它们…… +Monster! (PERCENT chance to avoid) +怪物! ( PERCENT 的概率避开 ) + + + + +(The SPEAKER does a short bow as she sees you)|Um... hi!|I have a letter for you... +( SPEAKER 看到你时鞠了一躬 ) |嗯...你好!|我有一封信给你... +(The letter is a contract from the College)|(They want you to sign up as an instructor for apprentices)|(The SPEAKER looks at you nervously.) +( 这封信是学院的一份合同 ) | ( 他们想让你报名当一名学徒教员 ) | ( SPEAKER 紧张地看着你。 ) +(The SPEAKER sighs in relief)|That's good...|(You sign the contract and it vanishes into the aether) +( SPEAKER 松了一口气 ) |那太好了……| ( 在你签署了合同后他就消失在了以太中 ) +(The SPEAKER whimpers)|What will I tell them... +( SPEAKER 呜咽道 ) |我该怎么告诉他们呢…… +(The SPEAKER glares at you)|It's an important message concerning your standing!|With the College! +( SPEAKER 怒视着你 ) |这是有关你的地位的重要信息!|与学院一起! +(The SPEAKER blushes)|Well...|I was told we would make changes to your academic record,|should you refuse... +( SPEAKER 脸红了 ) |嗯……|我被告知我们会更改你的学业记录,|如果你拒绝…… +(The SPEAKER frowns)|They told me to make sure you sign...|by any means necessary! +( SPEAKER 皱起眉头 ) |他们告诉我要确保你签字……|不惜一切代价! +(The SPEAKER nods and smiles)|Thank you so much!|I don't know what I would have done if you said no... +( SPEAKER 点头微笑 ) |非常感谢!|如果您说不,我真的就不知道我该怎么办了…… +(The SPEAKER frowns and waves her wand)|(A bunch of ropes come out of the ground and restrain you)|Hmmph. I'll tell them you signed it anyway.|I can't go back empty handed. +( SPEAKER 皱起眉头,挥动魔杖 ) | ( 一堆绳子从地上冒出来,束缚住了你 ) |哼。不管怎样,我都会告诉他们你签了字。|我不能空手而归。 + + +Thank you for delivering it. (Read it) +谢谢你送来。 ( 读一下 ) +(Read the letter) +( 阅读信件 ) +There's nothing good inside that letter. +那封信里没有什么好东西。 + + +Great! Wonderful! +当然!太棒了! +There is no way I'd accept. +我绝对不会接受。 + + +Fine. I'll read it. (Join the College as an instructor) +好的。我会读的。 ( 以讲师身份加入学院 ) +This is unethical! I refuse! (PERCENT chance to avoid) +这是不道德的!我拒绝! ( PERCENT 的概率避开 ) + + + + + + + + + + + + + + +(The SPEAKER waves)|Greetings,|I manufacture all sorts of weapons.|Would you like to buy some? +( SPEAKER 挥手 ) |你好,|我制造各种武器。|你想买一些吗? +(The SPEAKER drops her hammer and cracks her knuckles)|Put em up! +( SPEAKER 放下锤子,指关节吱吱作响 ) |把手举起来! +(The SPEAKER looks at you.)|But you already have one? +( SPEAKER 看着你。 ) |但是你已经有了一个? +(The SPEAKER folds her arms)|I don't do charity, ma'am. +( SPEAKER 交叉双臂 ) |我不做慈善事业,女士。 +(The SPEAKER smirks)|Another adventurer found this lying around.|I wonder who it's for~ +( SPEAKER 傻笑 ) |另一位冒险家发现了这个。|我想知道它是给谁的~ +(The SPEAKER smiles)|Now don't be up to no good~|Or else I'll have to put you in cuffs... +( SPEAKER 微笑 ) |现在别做坏事~|不然我就得给你戴上手铐了…… +(The SPEAKER nods)|A versatile weapon. One of my favorites. +( SPEAKER 点头 ) |一种多功能武器。我最喜欢的武器之一。 +(The SPEAKER nods)|Keep your friends close, and your enemies far away. +( SPEAKER 点头 ) |让你的朋友亲近,让你的敌人远离。 +(The SPEAKER nods)|Handy to have one of these around. +( SPEAKER 点头 ) |身边有这样一个就很方便了。 +(The SPEAKER nods)|The best defense is a good offense. +( SPEAKER 点头 ) |进攻是最好的防守。 +(The SPEAKER nods)|Speak softly and carry a big hammer. +( SPEAKER 点点头 ) |轻声细语,手持重锤。 +(The SPEAKER smiles)|Can never be too prepared~ +( SPEAKER 微笑 ) |准备永远不嫌多~ + + +(The SPEAKER waves)|Hi.|I make armor. Only the finest.|I don't sell it cheap, unlike my twin. +( SPEAKER 挥手 ) |嗨。|我只做最好的盔甲。|我与我的孪生兄弟不同,我卖的盔甲可不便宜。 +(The SPEAKER looks at you.)|Do you have a dealer's license? +( SPEAKER 看着你。 ) |您有经销商执照吗? +(The SPEAKER folds her arms)|I don't do charity, girl. +( SPEAKER 交叉双臂 ) |我不做慈善事业,小姑娘。 +(The SPEAKER nods)|The most high-impact of sports bras. +( SPEAKER 点点头 ) |最具冲击力的运动胸罩。 +(The SPEAKER nods)|These aren't for hiking, just so you know. +( SPEAKER 点点头 ) |这些不是用来徒步旅行的,只是先告诉你一下。 +(The SPEAKER nods)|I've been thinking about making a lockable version... +( SPEAKER 点点头 ) |我一直在考虑制作一个可上锁的版本... +(The SPEAKER nods)|These are sensibly sized, unlike those you see in movies. +( SPEAKER 点点头 ) |它们的大小很合理,不像你在电影里看到的那样。 +(The SPEAKER nods)|Sometimes you just have to be flexible. +( SPEAKER 点点头 ) |有时候,你必须灵活变通。 +(The SPEAKER nods)|For when you value style over protection... +( SPEAKER 点点头 ) |当你重视款式而非保护时... +(The SPEAKER nods)|You can never be too careful. +( SPEAKER 点头 ) |小心无大错。 +(The SPEAKER chuckles)|I hear female adventurers like to wear these for protection.|Or something like that. +( SPEAKER 轻笑 ) |我听说女性冒险家喜欢穿这个来保护自己。|或者类似的东西。 + + +(The SPEAKER waves)|Hello miss!|What brings you here today? +( SPEAKER 挥手 ) |你好啊小姐!|什么风把您吹到这来了 +(The SPEAKER folds her arms)|That's not very nice! +( SPEAKER 交叉双臂 ) |那样做可不好哦! +(The SPEAKER looks at you and smiles.)|Don't you already have one? +( SPEAKER 微笑着看着你 ) |你不是已经有一个了吗? +(The SPEAKER folds her arms)|I don't do charity, miss. +( SPEAKER 交叉双臂 ) |我不做慈善事业,小姐。 +(The SPEAKER nods)|Could use a higher heel... +( SPEAKER 点点头 ) |鞋跟或许可以再高一点... +(The SPEAKER nods)|Back to the basics. +( SPEAKER 点点头 ) |传统搭配 +(The SPEAKER smiles)|I see you have good taste! +( SPEAKER 微笑 ) |看来你很有品位! +(The SPEAKER nods)|It's a classic!|What's not to like? +( SPEAKER 点点头 ) |这是经典之作!|有什么理由不爱呢? +(The SPEAKER smiles)|It's an upgrade for your best friend! +( SPEAKER 微笑 ) |这是你最好朋友的升级版! +(The SPEAKER shrugs)|It's big and bulky, but I guess it has its uses. +( SPEAKER 耸耸肩 ) |它又大又笨重,但我想它还是有用处的。 +(The SPEAKER giggles)|Smile for the camera! +( SPEAKER 咯咯笑 ) |对着镜头微笑! +(The SPEAKER nods)|It's like mana, but much more portable!|It powers duplication runes so you don't run out of arrows. +( SPEAKER 点点头 ) |它就像法力,但更便于携带!它能为复制符文提供能量,这样你就不会缺箭了。 +(The SPEAKER giggles)|I like to include these as a gift with every purchase~ +( SPEAKER 咯咯笑 ) |我喜欢在每次成交时附上这个作为礼物~ + + +(The SPEAKER whispers in a hushed tone)|Welcome.|I'm not supposed to be here, so|if you don't want to do business, get out.|I only sell in packs of 10, by the way. +( SPEAKER 用沙哑的嗓音说道 ) |欢迎|我本来不该在这里,|如果你不想做交易,就赶紧出去。|顺便一提我卖的东西都是一组十个的 +(The SPEAKER tries to get away)|Damn! +( SPEAKER 试图逃跑 ) |该死! +(The SPEAKER looks you over and shrugs)|Don't joke around. +( SPEAKER 看看你并耸了耸肩 ) |不要开玩笑。 +(The SPEAKER folds her arms)|Don't have money? Better go find some. +( SPEAKER 交叉双臂 ) |没有钱?那你最好去找点来。 +(The SPEAKER produces a bag of stuffings)|Quite the staple. +( SPEAKER 制作了一包填充物 ) |相当重要 +(The SPEAKER produces a bundle of rope)|Aren't you quite the artist.|That was rhetorical. +( SPEAKER 拿出一捆绳子)|你真是个艺术家|这是修辞。 +(The SPEAKER produces some bondage tape)|It only sticks to itself, doesn't leave residue.|Gotta be responsible, you know? +( SPEAKER 制作了一些束缚带)|它只会粘在自己身上,不会留下残留物|你必须负责,你知道吗? +(The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally... +( SPEAKER 拿出一袋布塞)|这真的是品味问题|不,我不是字面意思... +(The SPEAKER produces a bag of cloth strips)|How tight you tie it depends on how bratty your target is. +( SPEAKER 拿出一袋布条)|你系得有多紧取决于你的目标有多淘气。 + + + + +(The SPEAKER rattles as she waves)|Heya!|Looking to buy some ancient treasures?|My antiques shop has just what you need! +(SPEAKER 挥手时,身体发出嘎吱声)|嗨!|想买一些古代珍宝吗?|我的古董店有你需要的东西! +(The SPEAKER cracks her exposed knuckles)|So you've seen through my disguise... +(SPEAKER 敲击着她的指节)|那么你已经看穿了我的伪装... +(The SPEAKER looks at you.)|Yours is just fine, dear. +(SPEAKER 看着你)|你的就很好,亲爱的。 +(The SPEAKER chuckles)|You don't have enough gold for that, dear.|Try coming back after a good round of looting! +(SPEAKER 笑着说)|你没有足够的金币,亲爱的。|等你洗劫一空再回来吧! +(The SPEAKER nods)|My great grandmother used to wear these. +(SPEAKER 点点头)|我的曾祖母曾经戴过这个。 +(The SPEAKER nods)|Adventurers used to love a good burlap sack.|Nowadays they've got that newfangled magic instead... +(SPEAKER 点点头)|冒险家们过去喜欢麻布袋,|如今他们用新式魔术袋代替了麻布袋... +(The SPEAKER nods)|Back in my day, they used candles for light!|These let you put them out to save wax. +(SPEAKER 点点头)|在我那个年代,人们用蜡烛来照明!|这些可以让你把它们熄灭,以节省蜡。 +(The SPEAKER giggles)|I had all sorts of use for this back on the farm. +(SPEAKER 咯咯地笑着)|我在农场的时候,这个东西有各种用途。 + + +(Select an item to buy from the SPEAKER) +( 选择你要从 SPEAKER 购买的商品 ) +(Attack the SPEAKER?) +( 攻击 SPEAKER? ) +(Buy ITM# for IC# gp) (Owned: AMNT#) +( 以 IC# 金币购买 ITM# ) ( 所属: AMNT# ) +(The SPEAKER sells you the item) +( SPEAKER 向你出售该物品 ) +(The SPEAKER shakes her head)|I think you'd be better off without that~ +( SPEAKER 摇头 ) |我认为没有那个你会更好~ +(The SPEAKER looks embarassed)|I can't sell you that, miss... +( SPEAKER 看上去很尴尬 ) |我不能把这个卖给你,小姐…… +(The SPEAKER blushes)|Actually, I was saving that for myself... +( SPEAKER 脸红了 ) |其实,我是为自己留下的…… +(The SPEAKER grins)|Good girls don't need one of those~ +( SPEAKER 笑 ) |好女孩不需要这些~ +(The SPEAKER buzzes)|Error, insufficient access privileges. +( SPEAKER 发出嗡嗡声 ) |错误,访问权限不足。 +(The SPEAKER giggles at your empty pockets)|You can't afford such things, silly~ +( SPEAKER 对着你空空的口袋咯咯笑 ) |你买不起这东西的,傻瓜~ +(The SPEAKER pauses nervously)|Um miss, I don't think you can afford that... +( SPEAKER 紧张地停顿 ) |嗯,小姐,我认为你负担不起…… +(The SPEAKER frowns)|What does this look like, a charity? +( SPEAKER 皱起眉头 ) |你觉得我看起来像什么,慈善机构? +(The SPEAKER smules)|You'll have to secure that by other means, I think~ +( SPEAKER 微笑 ) |我想你必须通过其他方式来确保这一点~ +(The SPEAKER beeps)|Insufficient currency. +( SPEAKER 发出蜂鸣声 ) |货币不足。 + + +(Look at what she wants to buy) +( 看看她想买什么 ) +You're giving me everything you have. +把你所有东西都交给我。 +(Flail threateningly at her) +( 威胁性地殴打她 ) +(Do it) +( 来吧 ) +(Back off) +( 退后 ) + + +(The SPEAKER approaches you with an offer)|Greetings! I am the potion seller.|I buy and sell only the strongest potions!| +( SPEAKER 向你提出邀约 ) |你好!我是魔药商。|我只买卖最强的药水!| (The SPEAKER doesn't look surprised)|Okay, just let me set these down real quick... -(SPEAKER 看起来并不惊讶)|好吧,让我快速设置这些... +( SPEAKER 看起来并不惊讶 ) |好吧,让我快速地把这些写下来...... (The SPEAKER smiles)|A spellcaster will have great use for this! -(SPEAKER微笑)|施法者会需要这些的! +( SPEAKER 微笑 ) |施法者会需要这些的! +(The SPEAKER smiles)|Wow! That's a lot of mana!|It requires a skilled mage to tap into, though... +( SPEAKER 微笑)|哇!这是很多魔法|它需要一个熟练的法师来挖掘,不过... +(The SPEAKER smiles)|It fills me with... determination. +( SPEAKER 微笑)|这让我充满了...决心。 (The SPEAKER smiles)|Refreshing! -(SPEAKER微笑)|耳目一新! +( SPEAKER 微笑 ) |耳目一新! (The SPEAKER smiles)|They say a bitter tea cures all ails... -(SPEAKER笑)|据说苦茶能治百病…… +( SPEAKER 笑 ) |据说苦茶能治百病…… (The SPEAKER smiles)|An empty flask?|...Oh. -(SPEAKER微笑)|一个空烧瓶?|...哦。 -(The SPEAKER approaches you)|I greet you!|My throat is parched and I seek the bounties of nature.|Do you have what I seek? -(说话者走近你)|你好!|我的喉咙很干,我寻求大自然的恩惠。|你有我所寻求的吗? +( SPEAKER 微笑 ) |一个空烧瓶?|...哦。 + + +(The SPEAKER approaches you)|My greetings, Outsider!|My throat is parched and I seek the bounties of nature.|Do you have what I seek? +( SPEAKER 走近你 ) |我的问候,外来者!|我的喉咙干渴,我寻求大自然的恩赐。|你有我想要的东西吗? (The SPEAKER doesn't look surprised)|Then let us have a battle of wits! -(SPEAKER一脸不惊讶)|那我们就斗智斗勇吧! +( SPEAKER 一脸不惊讶 ) |那我们就开战吧! (The SPEAKER thanks you)|A kind offering! You have my thanks. -(SPEAKER谢谢你)|好心的奉献!你有我的谢意。 -rElfCrystalSellElfCrystal,(The SPEAKER tilts her head)|...where did you get this? -rElfCrystalSellElfCrystal,(SPEAKER 歪着头)|...你从哪里弄来的这个? +( SPEAKER 感谢你 ) |好心的奉献!你有我的谢意。 +(The SPEAKER thanks you)|A magnificent offering! You have my thanks. +( SPEAKER 感谢你 ) |一个伟大的奉献!我对你表示感谢。 +(The SPEAKER tilts her head)|...where did you get this? +( SPEAKER 歪着头 ) |...你从哪里得到这个的? (The SPEAKER thanks you)|A fine trinket!|I will enjoy meditating upon it. -(SPEAKER 谢谢你)|一个精美的小饰品!|我会喜欢冥想它。 -rElfCrystalSellWaterRune,(The SPEAKER thanks you)|I sense its flowing essence.|You have my thanks. -rElfCrystalSellWaterRune,(SPEAKER 谢谢你)|我感觉到它流动的本质。|谢谢你。 +( SPEAKER 感谢你 ) |一个精美的小饰品!|我会喜欢冥想它。 +(The SPEAKER thanks you)|I sense its flowing essence.|You have my thanks. +( SPEAKER 感谢你 ) |我感受到它流动的本质。|我对你表示感谢。 (The SPEAKER thanks you)|I can feel a great sadness emanating from it.|It calls for warmth. -(SPEAKER谢谢你)|我能感觉到一种巨大的悲伤。|它需要温暖。 +( SPEAKER 感谢你 ) |我能感觉到一种巨大的悲伤。|它需要温暖。 + + +(The SPEAKER munches on a donut)|Gee I'm starving!|You wouldn't have something to eat, would you? +( SPEAKER 嚼着甜甜圈 ) |哎呀我饿了!|你没有东西吃,是吗? +(The SPEAKER throws a donut in your face)|Ha! Take that! +( SPEAKER 把一个甜甜圈扔到你脸上 ) |哈!拿着它! +(The SPEAKER smiles)|Yum! Thank you! +( SPEAKER 微笑 ) |美味!谢谢你! +(The SPEAKER smiles)|Crunchy! My favorite! +( SPEAKER 微笑 ) |脆脆的!我的最爱! +(The SPEAKER tilts her head)|It smells funny...|Still, it'd be a shame for it to go to waste! +(SPEAKER 倾斜着头) | 这气味有点奇怪... | 但是,让它浪费了就太可惜了! + + (The SPEAKER approaches you with an offer)|Hello!|I am searching for magical scrolls.|Would you happen to have any? -(SPEAKER 向你提议)|你好!|我正在寻找魔法卷轴。|你有吗? +( SPEAKER 向你提议 ) |你好!|我正在寻找魔法卷轴。|你有吗? (The SPEAKER doesn't look surprised)|Rude! -(SPEAKER看起来并不惊讶)|粗鲁! -(The SPEAKER smiles)|Thank you! -(SPEAKER微笑)|谢谢! +( SPEAKER 看起来并不惊讶 ) |粗鲁! (The SPEAKER smiles)|Thank you! -(SPEAKER微笑)|谢谢! -(The SPEAKER smiles)|Thank you! -(SPEAKER微笑)|谢谢! +( SPEAKER 微笑 ) |谢谢! (The SPEAKER raises a brow)|Thank you! This one is rare! -(SPEAKER挑眉)|谢谢!这个难得! +( SPEAKER 挑眉 ) |谢谢!这个很难得! + + +(The SPEAKER invites you to a friendly chat)|Back in my day I used to go visit dungeons all the time|But these days I get so lost in my studies...|Say, you don't happen to have some magic supplies on you? +( SPEAKER 邀请你有好的进行聊天 ) |以前我经常去地牢|但是这些天我在学习中迷失了...|说,你不碰巧有一些魔法物资在身上吗? +(The SPEAKER shrugs)|I guess that's how it is. +( SPEAKER 耸耸肩 ) |我想事情就是这样。 +(The SPEAKER smiles)|Always nice to have some of these! +( SPEAKER 微笑 ) |拥有这些总是很高兴! +(The SPEAKER smiles)|I can never get enough of these. +( SPEAKER 微笑 ) |我永远都不会嫌这些东西多。 +(The SPEAKER smiles)|Elemental magic, interesting stuff. +( SPEAKER 微笑 ) |魔法元素,有趣的东西。 +(The SPEAKER tilts her head)|Why is it wet? +( SPEAKER 歪着头 ) |为什么是湿的? +(The SPEAKER smiles)|Gladly, this will be useful to my studies. +( SPEAKER 微笑 ) |很高兴,这对我的学习很有用。 +(The SPEAKER smiles)|My legs don't carry me like they used to~ +( SPEAKER 微笑 ) |我的腿不再像以前那样支撑我了~ +(The SPEAKER smiles)|Always good to have somebody to talk to. +( SPEAKER 微笑着 ) |有人倾诉总是很好的。 +(The SPEAKER giggles)|Living dangerously, I see~ +( SPEAKER 咯咯笑 ) |生活很危险,我明白了~ + + (The SPEAKER approaches you with an offer)|Hey girl~|You seem like the explorer type.|Happen to have any good finds? -(SPEAKER向你提出要约)|嘿姑娘~|你看起来像探险家。|碰巧有什么好发现吗? +( SPEAKER 向你提出邀约 ) |嘿姑娘~|你看起来像探险家。|碰巧有什么好发现吗? (The SPEAKER frowns)|Well then. -(SPEAKER皱眉)|那么好吧。 +( SPEAKER 皱眉 ) |那么好吧。 (The SPEAKER grins)|Are you willing to part with this? -(SPEAKER笑)|你愿意放弃它吗? +( SPEAKER 笑 ) |你愿意放弃它吗? (The SPEAKER smiles)|Aha!|Fantastic. -(SPEAKER微笑)|啊哈!|太棒了。 +( SPEAKER 微笑 ) |啊哈!|太棒了。 (The SPEAKER frowns)|I'll take it, I guess... -(SPEAKER皱眉)|我会接受的,大概…… +( SPEAKER 皱眉 ) |我会接受的,大概…… (The SPEAKER smiles)|Oooh~!|I love technology! -(SPEAKER微笑)|Oooh~!|我爱科技! +( SPEAKER 微笑 ) |Oooh~!|我爱科技! +(The SPEAKER nods)|A rare find! +( SPEAKER 点头 ) |难得的发现! + + (The SPEAKER surprises you)|Greetings, traveler.|I am looking for tools to aid in my mission. -(SPEAKER 让你大吃一惊)|你好,旅行者。|我正在寻找工具来帮助我完成任务。 +( SPEAKER 让你大吃一惊 ) |你好,旅行者。|我正在寻找工具来帮助我完成任务。 (The SPEAKER doesn't look surprised)|That's how it is, then. -(SPEAKER 看起来并不惊讶)|那就这样吧。 +( SPEAKER 看起来并不惊讶 ) |那就这样吧。 (The SPEAKER bows)|Always be prepared. -(SPEAKER鞠躬)|时刻准备着。 +( SPEAKER 鞠躬 ) |时刻准备着。 +(The SPEAKER bows)|Always be extra prepared. +( SPEAKER 鞠躬) |永远做好充分准备。 (The SPEAKER bows)|A bit dangerous, but I'll take it. -(SPEAKER鞠躬)|有点危险,但我会接受的。 +( SPEAKER 鞠躬 ) |有点危险,但我会接受的。 (The SPEAKER bows)|A tool of the trade. -(SPEAKER鞠躬)|交易工具。 +( SPEAKER 鞠躬 ) |交易工具。 (The SPEAKER bows)|A most valuable find. -(SPEAKER鞠躬)|最有价值的发现。 +( SPEAKER 鞠躬 ) |最有价值的发现。 + + +(The SPEAKER tilts her shades)|I like to think of myself as a dealer in quality tools. +( SPEAKER 倾斜了她的窗帘 ) |我喜欢将自己视为优质工具的经销商。 +(The SPEAKER reaches for her hip)|I'd think twice if I were you... +( SPEAKER 伸手抚摸她的臀部 ) |如果我是你,我会三思而后行...... +(The SPEAKER smiles)|Nevermere keeps a tight grip on their blueprints.|Thank you. +( SPEAKER 微笑 ) |Nevermere 紧紧抓住他们的蓝图。|谢谢。 +(The SPEAKER smiles)|There's always a buyer.|That's just the way things are. +( SPEAKER 微笑 ) |总会有买家的。|事情就是这样。 +(The SPEAKER smiles)|Portable. Sustainable. A smart choice. +( SPEAKER 微笑 ) |便携式。可持续。一个明智的选择。 +(The SPEAKER smiles)|That's what I'm talking about. +( SPEAKER 微笑 ) |这就是我所说的。 +(The SPEAKER nods)|Yeah... that'll do. +( SPEAKER 点头 ) |是的……就这样。 + + +(The SPEAKER looks somewhat crazed)|I'm looking for some heavy ordnance in order to...|...add to my collection.|Anyway, got any bombs? +( SPEAKER 看起来有点疯狂 ) |我正在寻找一些重火力,以便...|...添加到我的收藏中。|无论如何,有炸弹吗? +(The SPEAKER reaches for her backpack)|I'll blow you away! +( SPEAKER 伸手去拿她的背包 ) |我会把你炸飞! +(The SPEAKER shrugs)|Cute fireworks, I suppose... +( SPEAKER 耸耸肩 ) |可爱的烟花,我想…… +(The SPEAKER giggles)|That's what I'm talking about! +( SPEAKER 咯咯地笑了)|这就是我说的! +(The SPEAKER rubs her hands together)|Excellent... +( SPEAKER 搓着手 ) |非常好...... +(The SPEAKER smiles)|Yes! I can make more bombs! +( SPEAKER 微笑 ) |是的! 我可以制造更多炸弹! + + +(The SPEAKER takes a whiff of her cigar)|Hey friend. Im in the market for some 'tools,'|...if you catch my frift. +( SPEAKER 吸了一口雪茄 ) |嘿朋友。我正在市面上寻找一些'工具',|...如果你明白我的意思的话。 +(The SPEAKER pulls out a knife)|Thought so. You won't take me that easily! +( SPEAKER 拔出一把刀 ) |我想是的。你不会那么轻易带走我的! +(The SPEAKER nods)|Could help out in a bind. +( SPEAKER 点头 ) |可以帮忙解决束缚。 +(The SPEAKER chuckles)|Lights out, eh... +( SPEAKER 轻笑 ) |熄灯,呃…… +(The SPEAKER nods)|I could use one of these! +( SPEAKER 点头 ) |我可以使用其中之一! +(The SPEAKER smiles)|For when things go south... +( SPEAKER 微笑着 ) |当事情恶化的时候。。。 +(The SPEAKER smiles)|You can never be too safe. +( SPEAKER 微笑)|你永远不会太安全。 + + +(A distracted SPEAKER munches on a cookie) +( SPEAKER 心烦意乱地嚼着一块曲奇 ) +(The SPEAKER continues eating her snack) +( SPEAKER 继续吃着零食 ) +(The SPEAKER plucks the cookie out of your hand)|My favorite! +( SPEAKER 从你手中夺走饼干 ) |我的最爱! +(The SPEAKER eats the brownies slowly, savoring every bite)|Kind of dense, but really good! +( 说话者慢慢地吃布朗尼蛋糕,细细品味每一口 ) |有点稠,但真的很好吃! +(The SPEAKER takes a bite out of the donut)|A bit heavy on the sprinkles... +( SPEAKER 咬了一口甜甜圈 ) |糖粉有点重…… +(The SPEAKER blushes)|This is... my new favorite. +( SPEAKER 脸红了 ) |这是……我新的最爱。 +(The SPEAKER's eyes widen as she wolfs down the golden cookie)|Truly divine... +( SPEAKER 狼吞虎咽地吃下金色曲奇时睁大了眼睛 ) |真正的神…… + + + + +(The SPEAKER is reading a kinky fashion magazine)|Why hello gorgeous~|You seem like you know your way around fashion.|Say, I've been on the hunt for unique designs... +( SPEAKER 正在读一本淫荡的时尚杂志 ) |为什么你好漂亮~|你看起来对时尚很了解。|老实说,我一直在寻找一种独特的设计...... +(The SPEAKER pouts)|I don't like your attitude. +( SPEAKER 撅起嘴 ) |我不喜欢你的态度。 +(The SPEAKER smiles)|Classic vintage!|I approve~ +( SPEAKER 微笑 ) |经典复古!|我赞成~ +(The SPEAKER giggles)|A girls best friend, eh? +( SPEAKER 咯咯笑 ) |女孩最好的朋友,嗯? +(The SPEAKER gasps)|What an amazing find!!! +( SPEAKER 喘着粗气 ) |真是一个惊人的发现! + + (The SPEAKER runs up to you)|Hello!|You wouldn't happen to have seen any ghosts lately?|I'm gathering evidence! -(说话的人跑到你面前)|你好!|你最近有没有碰巧看到任何鬼魂?|我正在收集证据! +( SPEAKER 跑到你面前 ) |你好!|你最近有没有碰巧看到任何幽灵?|我正在收集证据! (The SPEAKER gasps)|You wouldn't! -(SPEAKER喘息)|你不会的! +( SPEAKER 喘息 ) |你不会的! (The SPEAKER shakes your hand)|Ah! Ghosts love these! -(SPEAKER与你握手)|啊!鬼喜欢这些! +( SPEAKER 与你握手 ) |啊!鬼喜欢这些! (The SPEAKER smiles)|This looks like strong evidence for my investigation! -(SPEAKER笑)|这似乎是我调查的有力证据! +( SPEAKER 笑 ) |这似乎是我调查的有力证据! (The SPEAKER grins)|Woah! That's so cool! -(SPEAKER咧嘴一笑)|哇!这太酷了! -You're giving me everything you have. -把你所有东西都交给我。 -(Flail threateningly at her) -(威胁她) -(Do it) -(答应) -(Back off) -(后退) -(Sell Item0 for ItemCost0 gp) -(以 ItemCost0 gp 出售 Item0) -(Sell Item1 for ItemCost1 gp) -(以 ItemCost1 gp 出售 Item1) -(Sell Item2 for ItemCost2 gp) -(以 ItemCost2 gp 出售 Item2) -(Sell Item3 for ItemCost3 gp) -(以 ItemCost3 gp 出售 Item3) -(Sell Item4 for ItemCost4 gp) -(以 ItemCost4 gp 出售 Item4) -(Sell Item5 for ItemCost5 gp) -(以 ItemCost5 gp 出售 Item5) -(Sell Item6 for ItemCost6 gp) -(以 ItemCost6 gp 出售 Item6) -(Sell Item7 for ItemCost7 gp) -(以 ItemCost7 gp 出售 Item7) -(Sell Item8 for ItemCost8 gp) -(以 ItemCost8 gp 出售 Item8) -(Sell Item9 for ItemCost9 gp) -(以 ItemCost9 gp 出售 Item9) +( SPEAKER 咧嘴一笑 ) |哇!这太酷了! + + +(Look at what she has to sell) +( 看看她都卖什么 ) +(Sell Item0 for ItemCost0 gp) (Owned: AMNT0) +( 以 ItemCost0 gp 出售 Item0 ) ( 所属: AMNT0 ) +(Sell Item1 for ItemCost1 gp) (Owned: AMNT1) +( 以 ItemCost1 gp 出售 Item1 ) ( 所属: AMNT1 ) +(Sell Item2 for ItemCost2 gp) (Owned: AMNT2) +( 以 ItemCost2 gp 出售 Item2 ) ( 所属: AMNT2 ) +(Sell Item3 for ItemCost3 gp) (Owned: AMNT3) +( 以 ItemCost3 gp 出售 Item3 ) ( 所属: AMNT3 ) +(Sell Item4 for ItemCost4 gp) (Owned: AMNT4) +( 以 ItemCost4 gp 出售 Item4 ) ( 所属: AMNT4 ) +(Sell Item5 for ItemCost5 gp) (Owned: AMNT5) +( 以 ItemCost5 gp 出售 Item5 ) ( 所属: AMNT5 ) +(Sell Item6 for ItemCost6 gp) (Owned: AMNT6) +( 以 ItemCost6 gp 出售 Item6 ) ( 所属: AMNT6 ) +(Sell Item7 for ItemCost7 gp) (Owned: AMNT7) +( 以 ItemCost7 gp 出售 Item7 ) ( 所属: AMNT7 ) +(Sell Item8 for ItemCost8 gp) (Owned: AMNT8) +( 以 ItemCost8 gp 出售 Item8 ) ( 所属: AMNT8 ) +(Sell Item9 for ItemCost9 gp) (Owned: AMNT9) +( 以 ItemCost9 gp 出售 Item9 ) ( 所属: AMNT9 ) + + +(Buy Item0 for ItemCost0 gp) (Owned: AMNT0) +( 以 ItemCost0 gp 购入 Item0 ) ( 所属: AMNT0 ) +(Buy Item1 for ItemCost1 gp) (Owned: AMNT1) +( 以 ItemCost1 gp 购入 Item1 ) ( 所属: AMNT1 ) +(Buy Item2 for ItemCost2 gp) (Owned: AMNT2) +( 以 ItemCost2 gp 购入 Item2 ) ( 所属: AMNT2 ) +(Buy Item3 for ItemCost3 gp) (Owned: AMNT3) +( 以 ItemCost3 gp 购入 Item3 ) ( 所属: AMNT3 ) +(Buy Item4 for ItemCost4 gp) (Owned: AMNT4) +( 以 ItemCost4 gp 购入 Item4 ) ( 所属: AMNT4 ) +(Buy Item5 for ItemCost5 gp) (Owned: AMNT5) +( 以 ItemCost5 gp 购入 Item5 ) ( 所属: AMNT5 ) +(Buy Item6 for ItemCost6 gp) (Owned: AMNT6) +( 以 ItemCost6 gp 购入 Item6 ) ( 所属: AMNT6 ) +(Buy Item7 for ItemCost7 gp) (Owned: AMNT7) +( 以 ItemCost7 gp 购入 Item7 ) ( 所属: AMNT7 ) +(Buy Item8 for ItemCost8 gp) (Owned: AMNT8) +( 以 ItemCost8 gp 购入 Item8 ) ( 所属: AMNT8 ) +(Buy Item9 for ItemCost9 gp) (Owned: AMNT9) +( 以 ItemCost9 gp 购入 Item9 ) ( 所属: AMNT9 ) + + (The SPEAKER appears in a flash of light)|I come in the name of the Goddess.|I presume you need my aid?|(She will remain and help you with restraints for 50 turns) -(SPEAKER在闪光中出现)|我是以女神的名义来的。|我想你需要我的帮助?|(她会留下来在50回合内帮你解开束缚) +( SPEAKER在闪光中出现 ) |我是以女神的名义来的。|我想你需要我的帮助?| ( 她会留下来在50回合内帮你解开束缚 ) (The SPEAKER gives you two knives)|Don't hurt yourself with these, okay? -(SPEAKER给你两把刀)|别伤到自己,好吗? +( SPEAKER给你两把刀 ) |别伤到自己,好吗? (The SPEAKER gives you three picks)|I don't know how you plan to use these... -(SPEAKER给你三个选择)|我不知道你打算怎么用这些…… -(The SPEAKER reluctantly gives you a magic key)|Okay, these don't grow on trees... -(SPEAKER不情愿地给了你一把魔法钥匙)|好吧,这些可不是从树上长出来的…… +( SPEAKER给你三个选择 ) |我不知道你打算怎么用这些…… +(The SPEAKER reluctantly gives you a magic key)|Okay, but remember that these are rare and valuable. +( SPEAKER 不情愿地给了你一把魔法钥匙)|好吧,但请记住,这些钥匙很稀有,很有价值。 +(The SPEAKER looks impressed with your predicament)|No angel can remove these without a divine blessing.|Perhaps you should apply for one? *snickers* +( SPEAKER 似乎对你的困境印象深刻)|没有神圣的祝福,任何天使都无法消除这些|也许你应该申请一个*窃笑* +(The SPEAKER looks impressed with your predicament)|I won't get between you and your quest duties! +( SPEAKER 似乎对你的困境印象深刻)|我不会妨碍你和你的任务! +(The SPEAKER looks impressed with your predicament)|Since you are Blessed by a goddess, I can help you.|(She performs a short prayer and a random divine lock comes off) +( SPEAKER 似乎对你的困境印象深刻)|既然你受到女神的祝福,我可以帮助你|(她做了一个简短的祷告,一把随机的神锁就掉了) + + (Ask for 2 knives) -(要2把刀) +( 要2把刀 ) (Ask for 3 lockpicks) -(要 3 个撬锁工具) +( 要 3 个撬锁工具 ) (Ask for a magic key) -(要一把魔法钥匙) +( 要一把魔法钥匙 ) +(Ask for help with a divine lock) +(请求帮助解锁神圣锁) + + There is no valid space next to you! -您旁边没有有效空间! +你旁边没有有效空间! + + (You approach the SPEAKER) -(你走近 SPEAKER) +( 你走近 SPEAKER ) (Threaten) -(威胁) +( 威胁 ) (Really attack?) -(真的要攻击?) +( 真的要攻击? ) (Attack her) -(攻击她) +( 攻击她 ) (Never mind...) -(没关系...) +( 算了... ) (You decide not to) -(你决定不这么做) -(Walk past) -(通过交换位置经过) -(Walk past) -(通过交换位置经过) -(Walk past multiple allies) -(经过多个盟友) -(Never mind...) -(算了...) -(Confirm? You will walk through her for a few turns) -(确认?你会在接下来几回合中可以穿过他) -(Stop following me) -(停止跟着我) +( 你决定不这么做 ) + + +(Retaliate) +( 报复 ) +(Really attack? You will be justified and won't take an immediate rep penalty) +( 真的要攻击?你会被证明是正当防卫,不会受到声望惩罚 ) | ( 如果你抓住她,你仍然会失去声望 ) + + +(Sneak Attack) +( 偷袭 ) +(Really attack? Target is unaware and will be stunned 1 turn.) +( 真的要攻击?目标浑然不觉,晕眩1回合。 ) + + +(Let me through!!) +( 让我过去!! ) +(Walk past this unit) +( 走过这个小队 ) +(Walk past all units) +( 走过所有小队 ) +(Confirm? You will move through her for a few turns) +( 确认吗?你在接下来几回合中可以穿过他 ) + + (Stop following me) -(停止跟着我) -(Never mind...) -(算了...) +( 停止跟着我 ) (Confirm? You will have to find the SPEAKER again.) -(确认?您将需要再次找到 SPEAKER。) +( 确认?你将需要再次找到 SPEAKER。 ) (You decide you still need the help) -(你认为你仍然需要帮助) +( 你认为你仍然需要帮助 ) (The SPEAKER refuses to follow your orders) -(SPEAKER 拒绝听从您的命令) -(Follow me) -(跟我来) +( SPEAKER 拒绝听从你的命令 ) + + +(Remove BINDAMNT binding from her) UNTIETURNS +解除BINDAMNT束缚从她身上 UNTIETURNS +(You remove BINDANTPREV binding from the SPEAKER, excluding actual bindings)|(Use the 'Truss em Up' skill to remove bindings) +(你从 SPEAKER 移除了 BINDANTPREV 的绑定,但不包括实际的绑定)|(使用'Truss em Up'技能移除绑定) +(Give her a restoration item) +( 给她一个恢复物品 ) +(The SPEAKER appreciates the thought!) +( SPEAKER 很欣赏这个想法! ) +Must have HP to untie. +必须有HP才能解开。 +### (AMNT turns) + +### (AMNT turn) + (Follow me) -(跟我来) -(Never mind...) -(没关系...) +( 跟我来 ) (The SPEAKER starts following you) -(SPEAKER 开始跟随你) +( SPEAKER 开始跟随你 ) (You decide you don't need the help) -(你认为你不需要帮助) -(The SPEAKER refuses to follow your orders) -(SPEAKER 拒绝听从您的命令) -(Stay here) -(待在这里) -(Stay here) -(待在这里) -(Never mind...) -(没关系...) +( 你认为你不需要帮助 ) + + +(Hold still) +( 静止不动 ) (The SPEAKER follows your orders) -(SPEAKER 听从您的命令) -(The SPEAKER refuses to follow your orders) -(SPEAKER 拒绝听从您的命令) -(Don't stay here) -(不要留在这里) +( SPEAKER 听从你的命令 ) + + (Don't stay here) -(不要留在这里) -(Never mind...) -(没关系...) +( 不要留在这里 ) (Confirm?) -(确认?) +( 确认? ) (You decide you would rather the SPEAKER stay put) -(您决定让 SPEAKER 留在原地) -(The SPEAKER refuses to follow your orders) -(SPEAKER 拒绝听从您的命令) +( 你决定让 SPEAKER 留在原地 ) + + (Switch to Aggressive) -(切换到侵略模式) +( 切换到侵略模式 ) (The SPEAKER will now pursue enemies) -( SPEAKER 现在将追击敌人) +( SPEAKER 现在将追击敌人 ) + + (Switch to Defensive) -(切换到防御模式) +( 切换到防御模式 ) (The SPEAKER will stay close to you or its assigned position) -( SPEAKER 将跟随您或待在指定位置) -(Ask her for help) -(向她寻求帮助) +( SPEAKER 将跟随你或待在指定位置 ) + + +(Flirting) +( 调情 ) +(The SPEAKER smiles)|This will be fun! +( SPEAKER 微笑 ) |这会很有趣! +(The SPEAKER grins)|I will make sure you enjoy yourself~ +( SPEAKER 笑 ) |我一定会让你玩得开心~ +(The SPEAKER blushes)|Mmm~ Let's do this! +( SPEAKER 脸红了 ) |嗯~我们就这么做吧! +(The SPEAKER backs up)|I'm not in trouble, am I? +( SPEAKER 后退 ) |我没有遇到麻烦,不是吗? +(The SPEAKER beeps)|This unit does not know how to respond... +( SPEAKER 发出蜂鸣声 ) |本机器不知道如何响应... +(The SPEAKER moans)|Mmmmmph~ +( SPEAKER 呻吟 ) |嗯嗯呜呜~ +(The SPEAKER appears too busy to discuss with you) +( SPEAKER 似乎太忙了,无法与您讨论) + + + + + + + + + + + + +End of line. +行尾。 + + +*slaps your butt* +*拍打你的屁股* + + + + +Error. Subject not complying? +错误。受试者不遵守? + + + + +Got yourself locked up, huh? Better go be good now~ +把自己关起来了,是吗?最好现在就去好好表现~ +*she bumps up against your chastity and sighs* +*她碰到你的贞操带,叹了口气* +Pleasure controls detected. +检测到愉悦控制 +You've been a bad girl, haven't you? *taps on your chastity gear* +你一直是个坏女孩,不是吗*轻敲你的贞操装备* +Such a naughty girl, getting yourself all locked up like that! +这么淘气的女孩,把自己关起来了! +I-I know you want release, but you're in this gear for a reason~ +我知道你想要解脱,但你穿这种衣服是有原因的~ + + + + + + + + + + +Had fun?~ +玩得开心吗~ +*turns the toy off and giggles* +*关掉玩具,咯咯地笑* + + + + + + + + + + +Don't I look quite cuddly? +我看起来不是很可爱吗? +(Move closer, attempting to cuddle) +(靠近一点,试图拥抱) +(The SPEAKER smiles)|You do, in fact!|(She inches closer) +( SPEAKER 笑了)|事实上,你做到了|(她凑近一点) +(The SPEAKER smiles gently)|Aren't you precious~ +( SPEAKER 轻轻一笑)|你不珍贵吗~ +(The SPEAKER looks flustered)|Well, it's been a long day...|I could use a hug... +( SPEAKER 看起来有些慌乱)|好吧,今天真是漫长的一天|我需要一个拥抱... +(The SPEAKER smirks and reaches for your body) +( SPEAKER 傻笑着伸手去摸你的身体) +(The SPEAKER makes a beeping noise)|Loading cuddle module... +( SPEAKER 发出嘟嘟声)|正在加载拥抱模块... + + +Got something for me? +有东西给我吗? +(Present your body to her~) +( 向她展示你的身体~ ) +(The SPEAKER smiles)|Am I thinking what you're thinking? +( SPEAKER 微笑 ) |咱俩想的一样吗? +(The SPEAKER grins)|Why yes, I have just the thing~ +( SPEAKER 笑 ) |为什么是的,我正好有这个东西~ +(The SPEAKER blushes)|Oh... let me check. +( SPEAKER 脸红了 ) |哦……让我检查一下。 +(The SPEAKER smirks)|Be careful what you ask for~ +( SPEAKER 傻笑 ) |小心你的要求~ +(The SPEAKER pauses)|Calculating strictness threshold... +( SPEAKER 停顿 ) |正在计算严格阈值... +Yes please! (Hold out your wrists) +是的,请! ( 伸出手腕 ) +(Nod and blush) +( 点头并脸红 ) +Maybe not... +也许不... + + +Why don't we have a little fun? +我们为什么不找点乐子呢? +(Play with her) +( 和她一起玩 ) +(The SPEAKER giggles)|Mmmph~ +( SPEAKER 咯咯地笑着 ) |Mmmph~ + + +You look quite distracted... +你看起来很性奋... +(Help her with her distraction) +( 帮她娱乐 ) +(The SPEAKER nervously smiles)|H-how'd you know? +( SPEAKER 紧张地笑了)|你-你怎么知道的? +(The SPEAKER smiles)|Indeed I am... Won't you assist me? +( SPEAKER 微笑 ) |确实是...你不愿意帮助我吗? +(The SPEAKER wiggles excitedly)|Y-yes miss! +( SPEAKER 兴奋地扭动着身体 ) |是-是的,小姐! +(The SPEAKER shakes her head while blushing)|W-what makes you think that? +( SPEAKER 脸红了,摇了摇头 ) |你怎么会这么想? +(The SPEAKER computes something)|Error... +( SPEAKER 计算某事 ) |错误... +(The SPEAKER nods)|Mmmph! +( SPEAKER 点头 ) |Mmmph! +(Give her release with a magic wand) +( 用魔杖释放她 ) +(Set her toys to high for a while) +( 将她的玩具调高一段时间 ) +(Cuddle with her for 2 turns) +( 与她拥抱 2 回合 ) +(The SPEAKER trembles with pleasure) +( SPEAKER 高兴得浑身颤抖 ) +(The SPEAKER struggles to let go due to her chastity belt) +( 由于贞操带的存在,SPEAKER 很难高潮 ) + + + + +Let's go for a walk! +让我们出去走走! +(Jump excitedly, presenting your collar for a leash) +( 兴奋地跳起来,露出你项圈上的牵绳 ) +(The SPEAKER smiles)|Sure! I'll take you for a walk, but only if you behave. +( SPEAKER 微笑 ) |当然!我会带你去散步,但前提是你要乖一点。 +(The SPEAKER smiles)|Yes, I haven't had a nice walk in a while~ +( SPEAKER 微笑 ) |是的,我已经有一段时间没有好好散步了~ +(The SPEAKER blushes)|Sure! I'll make sure you don't get into trouble~ +( SPEAKER 脸红了 ) |当然!我保证你不会遇到麻烦~ +(The SPEAKER giggles)|Time for walkies! +( SPEAKER 咯咯地笑着 ) |该走了! +(The SPEAKER calculates)|Routing coordinates... +( SPEAKER 计算中 ) |路径坐标... + + (Ask her for help) -(向她寻求帮助) -(Never mind...) -(没关系...) +( 向她寻求帮助 ) (Are you sure? She might see you as being submissive) -(你确定吗?她可能认为你是顺从的) +( 你确定吗?她可能认为你是顺从的 ) (The SPEAKER prefers you the way you are) -(SPEAKER 更喜欢你保持现状) +( SPEAKER 更喜欢你保持现状 ) (The SPEAKER will help you out of your restraints) -(SPEAKER 将帮助您摆脱束缚) +( SPEAKER 将帮助你摆脱束缚 ) (You decide to deal with your problems yourself.) -(你决定自己处理你的问题。) +( 你决定自己处理你的问题。 ) +(Plead with her to unlock you with a Command Word) +( 恳求她用指令解锁你 ) +(Yes!) +( 是的! ) +(The SPEAKER would rather 'conserve her mana') +( SPEAKER 宁愿“保存她的法力” ) +(The SPEAKER utters a command word on you) +( SPEAKER 对你发出指令 ) +(Your magical locks continue to restrain you.) +( 你的魔法锁继续束缚着你。 ) +(Plead with her to unlock your restraints) +( 恳求她松开你的束缚 ) +(The SPEAKER would rather not give up a magic key) +( SPEAKER 不想为了你使用魔法钥匙 ) +(The SPEAKER doesn't have any keys) +( SPEAKER 没有任何钥匙 ) +(The SPEAKER giggles and gives you a key) +( SPEAKER 咯咯地笑并给了你一把钥匙 ) +(You remain locked tight.) +( 你仍然被锁得紧紧的。 ) (Stop receiving help) -(停止接受帮助) +( 停止接受帮助 ) (Confirm? You will have to ask again to get help.) -(确认?您将不得不再次询问以获得帮助。) -(Stop receiving help) -(停止接受帮助) -(Never mind...) -(没关系...) +( 确定吗?你将不得不再次询问以获得帮助。 ) (The SPEAKER will no longer help you.) -(SPEAKER 将不再帮助您。) +( SPEAKER 将不再帮助你。 ) (You sigh as you realize you really need her help.) -(当你意识到你真的需要她的帮助时,你叹了口气。) -(Offer some of your supplies) -(提供一些你的用品) -(Check shop offerings) -(查看商店) -Fuuka +( 当你意识到你真的需要她的帮助时,你叹了口气。 ) +(Kick her out of your party) +( 把她踢出你的队伍 ) +(Confirm? She will stop following you) +( 确认吗?她将不再会跟随你 ) +(Remove from party) +( 从队伍中移除 ) +(The SPEAKER understands.) +( SPEAKER 明白。 ) +(You decide to keep her.) +( 你决定留下她。 ) +(Add her to your party) +( 将她添加到你的队伍中 ) +(Confirm? She will follow you across floors. You can only have 3 party members) +( 确认?她会跟着你穿过楼层。你只能有3名队员 ) +(Add to party) +( 添加到队伍 ) +(The SPEAKER is happy to join you) +( SPEAKER 很高兴加入你 ) +(You decide not to.) +( 你决定不这样做。 ) + + +(Sell items) +( 出售物品 ) +(Buy items) +( 购买物品 ) + + +(Pick up her leash) +(牵起她的皮带) +(Release her leash) +(松开她的皮带) + + +Dollmaker +玩偶师 +The Dollmaker throws a device to the ground, teleporting her instantly! +玩偶师将一个装置扔到地上,她立马就被传送走了! +The Dollmaker's necklace flashes as you find yourself suddenly restrained! (+RestraintAdded) +当你发现自己突然被束缚时,玩偶师的项链会闪烁! ( +RestraintAdded ) +The Dollmaker's overbearing presence captivates you~ (DamageTaken) +玩偶师的霸气让你着迷~ ( DamageTaken ) +The Dollmaker snaps her fingers as you find yourself locked! (DamageTaken) +玩偶师打了个响指,你所有的拘束具都被锁定了! ( DamageTaken ) + + +The Dollmaker sinks into a pool of latex! +玩偶师掉进了乳胶池里! +The Dollmaker suggests that you surrender. (DamageTaken) +玩偶师建议你投降。 ( DamageTaken ) + + +DOLLMAKER +玩偶师 +The Dollmaker falls kneeling to the floor, admitting defeat! +玩偶师跪倒在地,认输了! +The Dollmaker snaps her fingers, and many robotic arms restrain you! (+RestraintAdded) +玩偶师打了个响指,许多机械臂前来束缚你! ( +RestraintAdded ) +The Dollmaker orders you to KNEEL! (DamageTaken) +玩偶师命令你跪下! ( DamageTaken ) + + Fuuka +风香(Fuuka) Fuuka surrounds herself in defensive talismans! -Fuuka将自己包围在防御丝带中! +风香(Fuuka)将自己包围在防御丝带中! Fuuka wraps you tightly in restraints! (+RestraintAdded) -Fuuka将你紧紧包裹在束缚中! (+RestraintAdded) +风香(Fuuka)将你紧紧包裹在束缚中! ( +RestraintAdded ) Fuuka squeezes your breasts and smiles! (DamageTaken) -Fuuka一边捏着你的胸一边微笑! (DamageTaken) -Angry Fuuka -愤怒的Fuuka +风香(Fuuka)一边捏着你的胸一边微笑! ( DamageTaken ) +Fuuka snaps her fingers and all your restraints are locked! (DamageTaken) +风香(Fuuka)打了个响指,你所有的拘束具都被锁定了! ( DamageTaken ) + + Fuuka surrounds herself in defensive talismans one more time! -Fuuka再一次用防御丝带包围自己! +风香(Fuuka)再一次用防御丝带包围自己! Fuuka wraps you furiously in restraints! (+RestraintAdded) -Fuuka用狂怒地将你包裹起来! (+RestraintAdded) +风香(Fuuka)狂怒地将你包裹起来! ( +RestraintAdded ) Fuuka pouts as she tickles you relentlessly! (DamageTaken) -Fuuka 一边噘嘴一边无情地给你挠痒痒! (DamageTaken) -Well well, what have we got here? -好了好了,看看这是什么? -You're not here to take away my pets, are you? -你不是来带走我的宠物的,对吧? -You'd make a lovely pet... -你会成为一只可爱的宠物…… -Daw, you're so cute when you're struggling! -Daw,你挣扎的时候真可爱! -You need to be bound tight! -你需要被绑紧! -Cleaning up for me, huh? -为我打扫卫生,嗯? -Uh uh, give that back! -呃呃,把那个还给我! -I see how it is. -我明白了。 -I've taken on hundreds of adventurers like you. -我已经对付了数百个像你这样的冒险者。 -You don't stand a chance/ -你没有机会/ -Your magic is nothing compared to mine! -与我相比,你的魔法根本不值一提! -I've been a master wizard for over a thousand years! -我已经是一千多年的巫术大师了! -You call that a spell? -你管这叫咒语? -My spells are far superior! -我的法术远超一流! -She won't help you! -她不会帮助你的! -Not yours! -不是你的! -Oh, that's not going to help~ -哦,那可没用~ -Let's play a game! -我们来玩个游戏吧! -Didn't think you would get away, did you? -没想到你会逃脱,是吗? -Oh ho~ -呵呵~ -'Tis but a scratch! -'这只是擦伤! -You'll be my pet soon~ -你很快就会成为我的宠物~ -Cute~ -可爱捏~ -Don't even try~ -不要尝试~ -It's over~ -结束了~ -Get over here! -过来! -Not so slippery now! -现在不那么滑了! -I'll be taking that~ -我会拿走那个~ -'Click!' -'咔哒!' +风香(Fuuka) 一边噘嘴一边无情地给你挠痒痒! ( DamageTaken ) + + (You find a girl wearing an ornate dress)|(She glances at you)|And who might you be? -(你发现一个穿着华丽衣服的女孩)|(她瞥了你一眼)|你是谁? +( 你发现一个穿着华丽衣服的女孩 ) | ( 她瞥了你一眼 ) |你是谁? I should be asking the same of you. 这是我要问的。 (Growl at her) -(对她咆哮) +( 对她咆哮 ) (She smiles)|My name is Fuuka, with the letters for Wind and Song.|Are you going to introduce yourself? -(笑)|我叫Fuuka,是风和歌的字母组合|你要介绍一下自己吗? +( 笑 ) |我叫风香(Fuuka),包含“风”和“歌”的字母|你要介绍一下自己吗? What kind of name is that? 那是什么名字? (SPEAKER frowns)|It means Windsong!|I bet yours isn't anywhere nearly as cool. -(SPEAKER皱眉)|这意味着风之歌!|我敢打赌你的没有任何地方那么酷。 +( SPEAKER 皱眉 ) |这意味着风之歌!|我敢打赌你的没有任何地方那么酷。 (SPEAKER looks enraged)|Because names and meanings are different things!|My name uses the script from the Old Civilization!|You're just a poser! -(SPEAKER看起来很生气)|因为名字和含义是不同的东西!|我的名字使用了旧文明的脚本!|你只是一个装腔作势的人! +( SPEAKER 看起来很生气 ) |因为名字和意义是不同的东西!|我的名字使用了古代文明的文字!|你个不学无术之徒! Why not just call yourself Windsong? -为什么不直接称自己为风歌? +为什么不直接称自己为风之歌? I am an adventurer. 我是冒险家。 -Mmmmph. -嗯。 (SPEAKER blushes)|Ah, right then... -(SPEAKER脸红了)|啊,那么…… +( SPEAKER 脸红了 ) |啊,那么…… (SPEAKER giggles)|Very well. I don't really care who you are. -(SPEAKER咯咯笑)|很好。我真的不在乎你是谁。 +( SPEAKER 咯咯笑 ) |很好。我真的不在乎你是谁。 I do not need to introduce myself. 我不需要自我介绍。 Neither do I. @@ -8017,217 +20547,473 @@ Neither do I. I'm an adventurer. And who are you? 我是冒险家。你是谁? Mmmmm... (Blush) -嗯嗯……(脸红) +嗯嗯…… ( 脸红 ) (She grins)|My name is Fuuka, with the letters for Wind and Song.|The reincarnated ones call me Windsong,|they aren't very bright though. -(笑)|我叫风花,风和歌两个字。|转生的人叫我风歌,|虽然不太亮。 +( 笑 ) |我叫风香(Fuuka),包含“风”和“歌”的字母。|转生的人叫我风之歌,|虽然他们脑袋不太灵光。 Reincarnated ones? 转世的? (SPEAKER tilts her head)|I believe the term is 'Zombie' in the common tongue. -(SPEAKER歪着头)|我相信这个词在普通话中是“僵尸”。 -(SPEAKER enjoys the discussion)|Normally, spirits pass on to the next life.|But with the right tricks, one can keep them here.|I plan to make them all proper bodies...|Eventually. -(说话者喜欢讨论)|通常情况下,灵魂会传递到下辈子。|但只要有正确的技巧,人们就可以将它们留在这里。|我打算让它们成为真正的身体……|最终。 -But... reincarnated? -但是……转世了? -I am an adventurer. -我是冒险家。 -Mmmmph. -嗯。 +( SPEAKER 歪着头 ) |我相信这个词在普通话中是“僵尸”。 +(SPEAKER enjoys the discussion)|When most people die, their spirits pass on to the next life.|But some stay in this world, and with the right blessings,|one can grant them a second chance!|I plan to give them all proper bodies...|Eventually. +( SPEAKER 很享受讨论 ) |当大多数人去世时,他们的灵魂会传递到来世。|但有些人留在这个世界上,只要有正确的祝福,|人们可以给他们第二次机会!|我计划给他们所有人合适的身体...|最终。 +How do they get reincarnated? +他们如何转世? +(SPEAKER enjoys the discussion)|No, they're people!|People who died long ago.|Now they live a new life, safeguarded by my Resurrection Arts! +( SPEAKER 很享受讨论 ) |不,他们是人!|很久以前就死了的人。|现在他们过上了新的生活,受到我的复活术的保护! +Aren't they dolls? They can barely speak. +她们不是玩偶吗?他们几乎不能说话。 +(SPEAKER pouts)|Why you...|Long ago, I made a contract with Ninril to guide lost souls back to her.|Do you doubt her blessing?! +( SPEAKER 撅起嘴 ) |为什么你...|很久以前,我与宁瑞尔 ( Ninril ) 签订了契约,引导迷失的灵魂回到她身边。|你在怀疑她的祝福吗?! +Your Resurrection Arts don't seem very effective. +你的复活术似乎不太有效。 +(SPEAKER looks puzzled)|People don't die anymore, but there are still lots of souls out there.|Whenever they stumble into the dungeon, searching for answers,|I'm still here, waiting! +( SPEAKER 看起来很困惑 ) |人们不再会死了,但仍然有很多灵魂在那里。|每当他们跌跌撞撞地进入地牢,寻找答案时,|我还在这里等待! +What do you do now that people don't die? +现在人们不死,你该怎么办? +(SPEAKER chortles)|So you've noticed!|As you can see, Ninril is very powerful~ +(SPEAKER 咯咯笑)|原来你已经注意到了!|如你所见,宁瑞尔 ( Ninril ) 非常强大~ +You don't look very old yourself. +你自己看起来并不老。 +(SPEAKER frowns)|Divine blessings shouldn't be used for such silly things! +( SPEAKER 皱起眉头 ) |神圣的祝福不应该用于这种愚蠢的事情! +Can you resurrect my back? It kind of hurts right now... +你能复活我的背吗? 现在有点痛... +(SPEAKER smiles)|Those latex-clad idiots don't understand a thing.|Science can only get you so far!|Worship is where it's at! +( SPEAKER 微笑 ) |那些穿着乳胶的白痴什么也不懂。|科学只能让你走这么远!|崇拜就在于此! +The Alchemists are always looking for a youth potion. +炼金术士们一直在寻找青春药剂。 +(SPEAKER folds her arms)|Oh ho ho~|That's none of your business, for it is also part of my contract|to keep outsiders from interfering with the catacombs below! +( SPEAKER 抱起双臂 ) |哦吼吼~|这不关你的事,因为这也是我契约的一部分|防止外人干涉下面的地下墓穴! +Do you know what's on the next floor? +你知道下一层有什么吗? +(SPEAKER blushes)|Nope, nothing at all!|In fact, whatever it is, you won't find it down here!|Now, would you like to become my pet? +( SPEAKER 脸红了 ) |不,什么都没有!|事实上,无论它是什么,你都不会在这里找到它!|现在,你想成为我的宠物吗? +Do you know anything about the Old Civilization? +你了解旧文明吗? +(SPEAKER shrugs)|Oh really...|Must be the fey playing tricks, hehe... +( SPEAKER 耸耸肩 ) |哦,真的……|一定是妖精在搞鬼,呵呵…… +I've seen a few robots running around! +我看到有几个机器人在跑来跑去! +(SPEAKER looks nervous)|Oh yeah? Where'd you hear that?|The 'adventurer's guild,' huh?|Why don't you just leave the dead to rest~ +( SPEAKER 看起来很紧张 ) |哦,是吗? 你从哪里听来的?|‘冒险家公会’吧?|你为什么不让死人安息呢~ +I heard there was an ancient facility on this island. +听说这个岛上有一个古老的设施。 +(SPEAKER sighs)|Look, the Goddess doesn't tell me everything.|Now then, I have a job to do and some pets to manage.|Please stop asking questions! +(SPEAKER 叹气)|看,女神并没有告诉我一切|现在,我有工作要做,还有一些宠物要管理|请停止提问! +Is Sariel Vinlaga down here? +萨里尔·文拉加(Sariel Vinlaga)在这儿吗? +(SPEAKER frowns)|What's with all the questions!|There totally isn't some kind of doll processing facility here!|Perhaps you're a brainwashed doll yourself? +( SPEAKER 皱起眉头 ) |这么多问题是怎么回事!|这里完全没有某种玩偶加工设施!|也许你自己就是一个被洗脑的玩偶? +Does DressUp Co. get their 'cyber doll' products from here? +装扮公司的'赛博玩偶'产品是从这里获得的吗? +(SPEAKER chuckles)|I smell a hint of jealousy~ +( SPEAKER 轻笑 ) |我闻到了一丝嫉妒的味道~ +I don't want to be a pet, so you'll have to force me. +我不想当宠物,所以你必须强迫我。 +(SPEAKER jumps up and down)|You would!?|That's wonderful~|My resurrection magic can make you young again forever!|All you have to do is pledge your soul to Nirin, the Goddess of Restoration! +( SPEAKER 上蹦下跳 ) |你愿意!?|太棒了~|我的复活魔法可以让你永远年轻!|你所要做的就是将你的灵魂许诺给恢复女神宁瑞尔 ( Ninrin ) ! +I'd love to be your pet! +我很想成为你的宠物! +(SPEAKER pouts)|Hmmph. Suit yourself. +( SPEAKER 撅起嘴 ) |嗯。你自便。 +Pledge my soul? That changes things... +以我的灵魂为誓? 这改变了事情...... (SPEAKER giggles)|Hehe... you sound interested. -(SPEAKER 咯咯笑)|呵呵……你听起来很感兴趣。 +( SPEAKER 咯咯笑 ) |呵呵……你听起来很感兴趣。 (SPEAKER frowns)|Never ask a woman about her age! -(SPEAKER皱眉)|永远不要问女人的年龄! +( SPEAKER 皱眉 ) |永远不要问女人的年龄! I take it you're the hag in charge? -我猜你是女主? +我猜你是负责人? You are in charge, right? -你负责,对吧? +你是负责人,对吧? (Giggle) -(傻笑) +( 傻笑 ) Don't mess with me, little girl. 别烦我,小姑娘。 Mmpphgh? (Pout at her) -嗯? (对她噘嘴) +嗯? ( 对她噘嘴 ) (She smirks)|So you're that kind of visitor, huh? -(她笑了起来)|所以你是那种访客,对吧? +( 她笑了起来 ) |所以你是那种访客,对吧? That's right. How powerful are you? 这是正确的。你有多厉害? (She cracks her knuckles)|I have been practicing the resurrection arts for a thousand years. -(她捏着指关节)|我修炼复活术已经有一千年了。 +( 她捏着指关节 ) |我修炼复活术已经有一千年了。 (She smiles)|All the zombies you seee in the Graveyard?|They are my pets, and I care for each and every one of them. -(她笑)|你在墓地里看到的所有僵尸?|它们是我的宠物,我关心每一只。 +( 她笑 ) |你在墓地里看到的所有僵尸?|它们是我的宠物,我关心每一只。 What the heck are 'Resurrection Arts'? “复活术”到底是什么鬼? It's time for a true display of skill! 是时候展现真正的技能了! Hmmph. (Look away) -嗯。 (移开视线) +呜嗯。 ( 移开视线 ) (She grins)|We'll wipe that pout off your face soon enough... -(她笑了)|我很快就会把你撅着的嘴抹平的…… -(Shake your head) -(摇头) +( 她笑了 ) |我很快就会把你撅着的嘴抹平的…… (She frowns)|Well, you will soon. -(她皱眉)|好吧,你很快就会的。 +( 她皱眉 ) |好吧,你很快就会的。 Pfff. Never heard of it. 噗。从来没有听说过。 I bet I could do better. 我敢打赌我可以做得更好。 -(Giggle) -(傻笑) Why does that matter to you? 为什么这对你很重要? (Stare at her silently, maintaining your posture) -(静静地盯着她,保持你的姿势) +( 静静地盯着她,保持你的姿势 ) (She grins)|I am in charge of this place.|Everything that goes through here goes through me.|You may address me as Fuuka Windsong. -(她咧嘴一笑)|这里由我负责。|这里的一切都经过我。|你可以称呼我为风歌Fuuka。 +( 她咧嘴一笑 ) |这里由我负责。|这里的一切都经过我。|你可以称呼我为风香(Fuuka)·风之歌。 By what authority? 凭什么? (SPEAKER tilts her head)|Ummmm.... uh...|The Old Civilization! Of course!|I've been keeping their traditions for centuries. -(SPEAKER歪着头)|嗯嗯……呃……|古老的文明!当然!|几个世纪以来我一直保持着他们的传统。 +( SPEAKER歪着头 ) |嗯嗯……呃……|古老的文明!当然!|几个世纪以来我一直保持着他们的传统。 (SPEAKER blushes)|Umm... That's because...|Oh shut up! -(SPEAKER脸红了)|嗯……那是因为……|哦闭嘴! +( SPEAKER脸红了 ) |嗯……那是因为……|哦闭嘴! You don't sound too confident. 你听起来不太自信。 Who are you anyway? 你到底是谁? -Who are you anyway? -你到底是谁? Fair enough. I am an adventurer. 很公平。我是冒险家。 -Hmmph. -嗯。 (SPEAKER giggles)|Is that a challenge? -(SPEAKER咯咯笑)|这是一个挑战吗? +( SPEAKER咯咯笑 ) |这是一个挑战吗? (Nod calmly) -(平静地点头) +( 平静地点头 ) (SPEAKER grins)|Is that a challenge? -(SPEAKER 咧嘴一笑)|这是一个挑战吗? +( SPEAKER 咧嘴一笑 ) |这是一个挑战吗? We'll see about that. 我们会看到的。 Hmmph. (Scoff into your gag) -嗯。 (隔着你的口塞嘲笑) +呜嗯。 ( 隔着你的口塞嘲笑 ) It is indeed! 确实! -(Giggle) -(傻笑) I'm an adventurer, miss. 我是冒险家,小姐。 Mmmpphh~ (Moan and wiggle seductively) -Mmmpphh~(呻吟和诱惑地扭动) +Mmmpphh~ ( 呻吟和诱惑地扭动 ) (She grins)|Oh look at you!|I'm going to dress you up and make you my pet!|You can have all the scritches and snuggles you want!|My name's Fuuka! -(她咧嘴笑)|哦,看看你的样子!|我要好好地打扮你,然后把你变成我的宠物!|你想要的任何东西都可以!|我叫Fuuka! +( 她咧嘴笑 ) |哦,看看你的样子!|我要好好地打扮你,然后把你变成我的宠物!|你想要的任何东西都可以!|我叫风香(Fuuka)! A pet? What kind? 宠物?哪一种? (SPEAKER hops up and down excitedly)|Oh I've got dresses!|And all sorts of fun gear!|Maybe even this huge gag for you to chew on! -(SPEAKER 兴奋地跳上跳下)|哦,我有裙子!|还有各种有趣的装备!|甚至是这个巨大的口球让你咀嚼! +( SPEAKER 兴奋地跳上跳下 ) |哦,我有裙子!|还有各种有趣的装备!|甚至是这个巨大的口球让你咀嚼! (SPEAKER grins)|Having second thoughts? -(SPEAKER 咧嘴一笑)|有别的想法吗? +( SPEAKER 咧嘴一笑 ) |有别的想法吗? That sounds... harsh. -听起来……刺耳。 +听起来……好严厉。 ...Maybe ...也许 Exciting! 令人兴奋! That sounds great. But who are you miss? -这听起来很不错。但您是谁? +这听起来很不错。但你是谁? +### Mmmmph~ + (SPEAKER giggles)|Hehe... We will have so much fun~ -(SPEAKER咯咯笑)|呵呵……我们会玩得很开心的~ +( SPEAKER咯咯笑 ) |呵呵……我们会玩得很开心的~ (SPEAKER giggles)|You don't have to consent, dear~ -(SPEAKER咯咯笑)|不需要你的同意,亲爱的~ +( SPEAKER咯咯笑 ) |不需要你的同意,亲爱的~ I never said I consented to being a pet! 我从来没有说过我同意做宠物! (Give her a puzzled look and shake your head) -(给她一个疑惑的眼神,然后摇头) +( 给她一个疑惑的眼神,然后摇头 ) No way! 没门! -(Shake your head) -(摇头) (Sigh and shrug) -(叹气和耸肩) +( 叹气和耸肩 ) (Attack her without saying anything) -(二话不说就攻击她) -(SPEAKER clears her throat)|I am the one tasked with keeping this graveyard pure and holy.|All who roam this place do so under my express permission.|But what of you? I do not remember striking a deal with you.|Are you here to challenge me? -(说话者清了清嗓子)|我是负责保持这个墓地纯净和神圣的人。|所有在这个地方漫游的人都在我的明确许可下这样做。|但是你呢?我不记得和你有过交易。|你是来挑战我的吗? +( 二话不说就攻击她 ) + + +(SPEAKER clears her throat)|I am the one tasked with keeping this graveyard pure and holy.|The reincarnated ones who roam this place do so with my permission.|But what of you? I do not remember striking a deal with you.|Are you here to challenge me? +( SPEAKER 清了清喉咙 ) |我的任务是保持这个墓地的纯洁和神圣。|在这个地方漫步的转世者在我的允许下这样做。|但是你呢? 我不记得和你达成过任何协议。|你是来挑战我的吗? I do what I want. 我想干什么就干什么。 (Glare at her and scoff) -(瞪着她并嗤之以鼻) +( 瞪着她并嗤之以鼻 ) (SPEAKER makes a big grin)|I take that you wish to challenge me?|Very well!|Come at me! -(SPEAKER咧嘴一笑)|我知道你想挑战我?|很好!|来吧! +( SPEAKER 咧嘴一笑 ) |我知道你想挑战我?|很好!|来吧! +About those 'reincarnated ones'... +至于那些'转世者'…… You have no power over me 你可没权力干涉我 Hmmph. (Stand proudly) -嗯。 (骄傲地站着) +呜嗯。 ( 骄傲地站着 ) (SPEAKER smiles)|Then let us fight!|If I win, I will make you my pet.|If you win, I will let you pass. -(SPEAKER笑)|那我们打吧!|如果我赢了,我会让你成为我的宠物。|如果你赢了,我会让你过去。 +( SPEAKER 笑 ) |那我们开打吧!|如果我赢了,你就得成为我的宠物。|如果你赢了,我会让你过去。 I don't want to fight, miss... 我不想打架,小姐... Mmph! (Shake your head frantically) -嗯! (疯狂地摇头) +嗯! ( 疯狂地摇头 ) (SPEAKER giggles)|Come now, I want to see how good you are! -(SPEAKER咯咯笑)|来吧,我要看看你有多厉害! +( SPEAKER 咯咯笑 ) |来吧,我要看看你有多厉害! Yes, I am here to fight you. 是的,我是来和你战斗的。 -(Nod) -(点头) (SPEAKER smiles)|Then what are we waiting for? -(SPEAKER笑)|那我们还在等什么? +( SPEAKER笑 ) |那我们还在等什么? + + You're on! 轮到你了! Hmmmph! -哼! +哼嗯嗯! Let us duel! 让我们决斗吧! Mmmmmghh! -嗯嗯! +嗯嗯呜! I suppose... 大概吧... -Mmmmph... -嗯…… + + (SPEAKER smiles as she stands over you)|Well well. Look who won. -(SPEAKER站在你面前微笑)|好吧好吧。看看谁赢了。 -(SPEAKER nods)|Absolutely. Now allow me to make my conditions clear.|You will wear my collar from now on.|Then you will be allowed to go. -(SPEAKER点头)|当然。现在请允许我把我的条件说清楚。|从现在开始你就戴上我的项圈。|然后你就可以走了。 -(SPEAKER giggles)|You're not in a position to resist.|Now then, let me make myself clear.|I will let you go... but only wearing my collar. -(SPEAKER咯咯笑)|你没有能力反抗。|现在,让我说清楚。|我会让你走……但只戴上我的项圈。 +( SPEAKER站在你面前微笑 ) |好吧好吧。看看谁赢了。 +(SPEAKER nods and giggles)|Absolutely.|Allow me to present to you, my prized pet collar!|I save it only for my favorite pets.|That's right! You're my favorite pet now~ +( SPEAKER 点头并咯咯笑 ) |当然。|请允许我向您介绍我最珍贵的宠物项圈!|我只把它留给我最喜欢的宠物。|没错!你现在是我最喜欢的宠物~ +(SPEAKER giggles)|You're not in a position to resist.|Now then, where did I put that collar... +( SPEAKER 咯咯笑 ) |你没有资格反抗。|那么,我把那个项圈放在哪里了…… +(SPEAKER smiles)|It's a magical spell that seals your power temporarily~|I use it for my pets when they're being unruly...|(She brandishes a collar) Now including you! +( SPEAKER 微笑 ) |这是一个神奇的诅咒,可以暂时封印你的力量~|我会在当我宠物不守规矩的时候使用它......| ( 她挥舞着项圈 ) 现在包括你! +What's this weird magic? +这是什么奇怪的魔法? You beat me fair and square. 你公平地打败了我。 Mmmph. (Submit) -嗯。 (顺从) +嗯。 ( 顺从 ) You cheated! 你作弊! Mmmph! (Struggle weakly) -嗯! (弱弱地挣扎) +嗯! ( 弱弱地挣扎 ) (Sigh and accept your fate) -(叹息接受你的命运) +( 叹息接受你的命运 ) (Accept the collar eagerly) -(急切地接受项圈) +( 急切地接受项圈 ) (Accept the collar begrudgingly) -(勉强接受项圈) -(SPEAKER presents you with her collar...)|(She locks it around your neck)|You are free to go now, dear! -(SPEAKER把她的项圈送给你……)|(她把它锁在你的脖子上)|你现在可以走了,亲爱的! +( 勉强接受项圈 ) +(SPEAKER presents you with your collar...)|(She locks it around your neck)|You are free to go now, dear! +( SPEAKER 给你展示了你的项圈... ) | ( 她将其锁在你的脖子上 ) |你现在可以走了,亲爱的! + + (SPEAKER puts up a wall of talismans to regain her strength)|I'm... I'm not finished yet! -(SPEAKER竖起一堵符墙恢复体力)|我……我还没结束完呢! +( SPEAKER竖起一堵符墙恢复体力 ) |我……我还没结束完呢! + + (SPEAKER is out of breath)|I... can't... believe... it...|She drops her keys... -(SPEAKER气喘吁吁)|我……不敢……相信……它……|她的钥匙掉了…… +( SPEAKER气喘吁吁 ) |我……不敢……相信……它……|她的钥匙掉了…… (SPEAKER looks flabbergasted)|R-really? Okay... I'll give you a reward then... -(SPEAKER 看起来大吃一惊)|真-真的吗?好吧……那我给你奖励…… -(Submit to her anyway) -(总之服从于她) +( SPEAKER 看起来大吃一惊 ) |真-真的吗?好吧……那我给你奖励…… +(Submit to her anyway) (Gain a special collar) +( 服从于她 ) ( 获得特殊项圈 ) (SPEAKER resists but ultimately you force a gag into her mouth)|MMMMMPH! -(SPEAKER 反抗,但最终你把堵嘴塞进她的嘴里)|MMMMPH! +( SPEAKER 反抗,但最终你把堵嘴塞进她的嘴里 ) |MMMMPH! (Gag her) -(堵住她的嘴) +( 堵住她的嘴 ) + + + + (This ghost had something to say,|but it appears you've run into a bug instead)|Please report this to Ada18980 on deviantart! -(这个幽灵有话要说,|但似乎你遇到了一个bug)|请将此报告给deviantart上的Ada18980! +( 这个幽灵有话要说,|但似乎你遇到了一个bug ) |请将此报告给deviantart上的Ada18980! + + (Continue) -(继续) +( 继续 ) (Make a smug face as you walk past) -(走过时摆出一副沾沾自喜的样子) +( 走过时摆出一副沾沾自喜的样子 ) Thank you! 谢谢你! -Mmmph! -呜呜! I don't need your advice, strange ghostly person. 我不需要你的建议,一个奇怪的幽灵。 + + +Oh, those people that locked you up?|I dealt with them.|Now come along, there's no time to waste! +噢,那些把你关起来的人?|我已经对付了他们。|现在走吧,没有时间可以浪费了! +(The SPEAKER giggles)|Treasure? The treasure isn't going anywhere.|Plus, I made a few enemies on the way.|We better not wait till they come back. +( SPEAKER 咯咯笑 ) |宝藏? 宝藏不会去任何地方。|另外,我在路上树敌了。|我们最好不要等到他们回来。 +But what about the treasure!? +但是宝藏呢!? +(The SPEAKER ponders your question)|I think we'll have to talk about compensation|AFTER we get out of here. +( SPEAKER 思考你的问题 ) |我想我们得先离开这里|之后我们再讨论赔偿问题。 +So how much is this going to cost me? +那么这要花多少钱? + + +(You hear footsteps. It's the SPEAKER!)|Why look at you!|Well you seem to be in a bind, don't you? +( 你听到脚步声。是 SPEAKER! ) |为什么看着你!|好吧,你似乎陷入了困境,不是吗? +Not to worry! I'll get you out of here! +不用担心! 我会带你离开这里的! +Hehe, alright! If that's what you want~ +呵呵,好吧! 如果这就是你想要的~ + + +(Shake your head and refuse rescue) +( 摇头拒绝救援 ) +Actually I was having fun... +其实我玩得很开心... + + +(The SPEAKER, your longtime friend, smiles)|Well well, if it isn't you again!|I see that you've decided to challenge the dungeon again.|Don't forget to bring some gold back with you,|there's a fee for rescue~ +( SPEAKER,你的老朋友,微笑 ) |好吧好吧,如果不是你的话!|我看到你决定再次挑战地牢。|别忘了带一些金币回来,| 救援是要收费的~ + + +Can you help with these restraints? +你能帮助挣脱这些束缚吗? +Pfffmmm hhmmph mmph... (Please Help Me) +呜呜呜 哼嗯嗯 嗯嗯嗯... ( 请帮帮我 ) +No can do! Even I can't get those off of you. +没办法啊! 就连我也无法把它们从你身上拿走。 + + +Caught by...? +被……抓住了? +Hah!|You've been here a million times!|You obviously know how dangerous it is, yes? +哈!|你已经来过这里一百万次了!|你显然知道这里有多危险,是吗? +F-fee? There's a fee? +收-收费?这要收费吗? +Yep! It'll cost ya!|Quite worth it if you ask me.|Unless you'd like to spend the rest of your life in chains! +是的!这需要你付出代价!|如果你问我的话,那是非常值得的。|除非你想在枷锁中度过余生! +Will you buy my loot? +你会买我的战利品吗? +(Show her your loot) +( 向她展示你的战利品 ) +Absolutely! I offer the standard market rate for anything.|I'll take enchanted items too!|I've got plenty of volunteers to check for curses~ +肯定的呀!我提供任何东西的标准市场价格。|我也会带一些有附魔的物品!|我还有很多志愿者来帮我检查诅咒~ +Got something you want to show me? +有什么东西想给我看吗? +(Sell Items) +( 出售物品 ) +(Sell Whole Stacks of Items) +( 出售整堆物品 ) +Daww! What a cutie!|(She smiles and pats your head gently) +呜哇!好可爱啊OwO!| ( 微笑着轻轻拍拍你的头 ) + + +Do you have anything for sale? +你们有东西卖吗? +(Look around for items to buy) +( 四处寻找可以购买的物品 ) +I'm sorry sweetie, I don't sell merchandise here.|Who would set up a shop inside a dungeon? That's crazy!|But you adventurers bring in a steady supply of loot,|so if you've got something to sell me, I'll take it off your hands~|You can also talk to my guests, perhaps they have something for you. +亲爱的,很抱歉,我这里不卖商品。|谁会在地牢里开设商店呢?那太疯狂了!|不过,你们冒险者们总是带来稳定的战利品,|所以如果你有什么东西要卖,我可以帮你处理掉~|你也可以和我的客人交谈,也许他们有你需要的东西。 + + +(Return) +( 返回 ) + + +(The SPEAKER brings you safely back to her shop)|There! Nice and safe.|Now, as for my fee...|That'll be RESCUECOST gold pieces! +( SPEAKER 带你安全回到她的商店 ) |那里! 又好又安全。|现在,至于我的费用...|那将是 RESCUECOST 金币! + + +Right! Here's RESCUECOST gp. +当然!这里是 RESCUECOST 金币。 +Mmmph. (Nod your head and pay RESCUECOST gp) +呜。 ( 点头并支付 RESCUECOST 金币 ) +(The SPEAKER smiles)|Pleasure doing business with ya~ +( SPEAKER 微笑 ) |很高兴与你做生意~ + + +Mind adding it to my tab? +介意把它加到我的账单上吗? +(Shake your head regrettably.) +( 遗憾地摇摇头。 ) +(The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|But I won't be letting you out of those restraints~ +( SPEAKER 揉着下巴 ) |啊……嗯,好吧……|我想这次我会放过你的。|但我不会帮你挣脱这些束缚的~ +(The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|You're a good customer, after all. +( SPEAKER 揉着下巴 ) |啊……嗯,好吧……|我想这次我会放过你的。|毕竟你是个好顾客。 +(The SPEAKER folds her arms)|Come on now, I can hear the gold jingling in your pocket! +( SPEAKER 交叉双臂 ) |哎呀 来吧,我都能听到你口袋里的金币在叮当作响! + + +Pretty please? I promise I'll pay you back. +求求你了?我保证会还你的。 +(Be insistent) +( 坚持 ) +(The SPEAKER rubs her chin)|Fine, I believe you.|But I won't be letting you out of those restraints! +( SPEAKER 揉着下巴 ) |好吧,我相信你。|但我不会帮你挣脱这些束缚的! +(The SPEAKER sighs)|Fine, I believe you.|You better believe I won't forget, though! +( SPEAKER 叹了口气 ) |好吧,我相信你。|不过你最好相信我不会忘记! + + +(The SPEAKER folds her arms)|Your adventures have cost me a pretty penny.|I can't stay in business if my clients keep running off without paying.|Look, I'll cut you a deal, you help me, I help you. Fair? +( SPEAKER 抱起双臂 ) |你的冒险让我损失了一大笔钱。|如果我的客户不付钱就逃跑,我就无法继续做生意。|听着,我会和你做一笔交易,你 帮我,我 帮你。公平吧? + + +(Help her test cursed armors) +( 帮助她测试被诅咒的盔甲 ) +(Add cursed restraints as collateral) +( 穿上被诅咒的拘束具作为抵押 ) +(Wear a collar to help advertise her business) +( 戴上项圈以帮助宣传她的生意 ) +(Wear a catsuit to help advertise her business) +( 穿上紧身衣来帮助宣传她的生意 ) +(Actually... just pay her the RESCUECOST gold) +( 其实……只要付给她 RESCUECOST 金币就可以了 ) + + +(The SPEAKER holds up a RESTRAINTNAME)|I've bought some armors from an adventurer lately,|but I don't know if they're safe to wear.|Why don't you try it on for me?|I'll postpone your debt for a later time. +( SPEAKER 举起一件 RESTRAINTNAME ) |我最近从冒险家那里买了一些盔甲,|但我不知道它们是否可以安全穿着。|你为什么不帮我试穿一下呢?|我想我会推迟你的债务。 +(The SPEAKER holds up a RESTRAINTNAME)|I need to make sure you won't go running off again.|This RESTRAINTNAME here has a special seal on it.|I can get you out of it, of course, but you'll have to pay up first. +( SPEAKER 举起一件 RESTRAINTNAME ) |我需要确保你不会再逃单。|这个 RESTRAINTNAME 上面有一个特殊的印章。|当然,我可以让你解开它,但你必须先把欠我的钱付给我。 +(The SPEAKER holds up a RESTRAINTNAME)|Your captors are quite the market for high-security restraints.|If you get captured by them, maybe they'll see my logo on this collar!|It's quite comfy and secure,|you'll end up feeling more submissive the more your wear it. +( SPEAKER 举起一件 RESTRAINTNAME ) |抓捕你的人是高安全性拘束具的销售。|如果你被他们抓获,也许他们会在这个项圈上看到我的标志!|它非常舒适和安全,|你你穿得越多,最终会感觉更加顺从。 +(The SPEAKER holds up a RESTRAINTNAME)|Your body looks like a great billboard!|This suit will make you so attractive that nobody will be able to resist!|And in the process of, ahem, examining you,|They'll be sure to see my logo! +( SPEAKER 举起一个 RESTRAINTNAME ) |你的身体看起来就像一个巨大的广告牌!|这套衣服会让你如此有吸引力,没有人能够抗拒!|在,咳咳,检查你的过程中,|他们会..一定会看到我的logo! +(The SPEAKER folds her arms and nods)|Good girl! I knew you would come clean~ +( SPEAKER 抱起双臂点头 ) |好女孩!我就知道你会坦白的~ + + +Sure! I accept! +当然!我接受! +(Nod in approval) +( 点头同意 ) +How about something else? +再来点别的怎么样? + + +Excellent! Please hold still~|(She fits the RESTRAINTNAME on and a seal awakens)|Whoops! Good thing I didn't sell that one!|I'll let you keep it, it's my treat~ +太棒了!请保持不动~| ( 她为你戴上 RESTRAINTNAME,封印出现 ) |哎呀! 还好我没卖掉那个!|这个让你留着吧,我请客~ +Excellent! Please hold still~|(She fits the RESTRAINTNAME on and nothing happens)|We have a winner!|You can't have it though, not until you pay up~ +太棒了!请保持不动~| ( 她为你戴上 RESTRAINTNAME,什么也没发生 ) |我们赢了!|不过你不能得到它,除非你付钱~ +Wonderful. I look forward to seeing you being delivered, er, coming back,|Lots of treasure in hand!|(She places the RESTRAINTNAME on you and the seal activates. There is no keyhole.) +太美妙了。我期待着看到你被释放,呃,回来的时候,|手中有很多宝藏!| ( 她将 RESTRAINTNAME 戴在你身上,封印直接激活了。没有锁孔。 ) +Alright! Why don't you hold still~|(She lifts your hair out of the way and buckles the collar on)|Now go out there and find me some treasure~ +好吧!站稳点~|( 她把你的头发撩开,扣上项圈 )|现在出去给我找点宝物吧~ +You're gonna like it, I guarantee it~|(She pulls out the catsuit from a drawer, dusts it off, and helps you in it)|(There is no zipper or fastener, just a very stretchy neck hole)|(Once it's on and well-fitted, you feel the neck grow less loose...)|(...and pulling the rubber away from your skin becomes impossible)|Beautiful. I'm going to let you go now.|I'm sure your new look will attract many customers! +你一定会喜欢的,我保证~|( 她从抽屉里拿出紧身衣,掸去灰尘,然后帮你穿上 )|( 没有拉链或扣件,只有一个非常有弹性的颈孔 )|( 一旦戴上并正确贴合,你会感觉颈部不再那么松弛...... ) | ( ......并且将橡胶从皮肤上拉开根本不可能 ) |真美。我该就放你走了。|我相信你的新面貌会吸引很多顾客的! + + +No? That's alright.|I'm sure I'll find someone else to test these on, huehue. +不?没关系。|我确信我会找到其他人来测试这些的,呵呵呵。 +Up to you!|You'll still have to pay me eventually~ +就看你了!|反正最后还是要付钱给我的~ +Your choice~|I am open to further negotiations. +你的选择~|我愿意进一步谈判。 +Your choice~|Not everyone is up to putting themselves on display like that~ +你的选择~|不是每个人都适合这样展示自己的~ + + + + +(The SPEAKER pats you down and makes sure you're okay)|I can definitely help with those!|But as you know, I help a lot of adventurers just like you.|You know what, I'll give you a discount!|That'll be RESCUECOST gold pieces! +( SPEAKER 拍拍你并确保你没事 ) |我绝对可以帮助你!|但如你所知,我帮助了很多像你一样的冒险家。|你知道吗,我会给你折扣!|这将是 RESCUECOST 金币! + + +(The SPEAKER rubs her chin)|Sorry miss!|Cost of doing business, you know?|Why don't you come back with some of that delicious, shiny gold~ +( SPEAKER 揉着下巴 ) |不好意思小姐!|但是做生意的成本,你知道吗?|你为什么不带一些诱人的、闪闪发光的金币回来呢~ +(The SPEAKER folds her arms)|Business is business, miss~ +( SPEAKER 交叉双臂 ) |生意归生意,小姐~ + + +(The SPEAKER rubs her chin)|No can do.|Rules are rules~ +( SPEAKER 摸着下巴 ) |没办法。|规则就是规则~ +(The SPEAKER sighs)|Business is business, miss~ +( SPEAKER 叹了口气 ) |生意就是生意,小姐~ + + +(The SPEAKER reluctantly frees you)|...Fine, I'll cut you a deal.|You help me, I help you. Fair? +( SPEAKER 不情愿地释放了你 ) |...好吧,那我就跟你做个交易。|你 帮我,我 帮你。公平吧? + + + + + + The next floor is a normal floor. 下一层是普通层。 This floor is suffering from a slime mold infestation.|Maids have been deployed to deal with the problem.|They could use a hand. @@ -8243,2056 +21029,13611 @@ The next floor is overgrown.|I'd watch your feet if I were you. Slimes, slimes EVERYWHERE!|Fortunately there's a slime-harvesting|operation going on. 粘液,到处都是粘液|幸运的是,有一个黏液收集|手术正在进行。 The trainers are taking their wolfgirls out for a walk.|I'd steer clear.|Unless you want to become one of their pets~ -训练师们带着她们的狼女出去散步|我会避开的|除非你想成为她们的宠物~ +训练师们带着她们的狼娘出去散步|我会避开的|除非你想成为她们的宠物~ Rumor has it that one of the cyber-dolls escaped.|Their handlers are looking for her.|They're catching every young girl they can find! -有传言说其中一个网络娃娃逃走了|她们的处理人员正在寻找她|她们抓住了所有能找到的年轻女孩! +有传言说其中一个赛博娃娃逃走了|她们的处理人员正在寻找她|她们抓住了所有能找到的年轻女孩! This is totally a normal floor.|No doubt about it. 这完全是正常的楼层|毫无疑问。 + + +This is a debug mode journey for testing the latest region. +这是用于测试最新区域的调试模式旅程。 + + +These are the stairs to the tutorial hall. +这是通往新手教程的楼梯。 + + +Congratulations! You've completed the tutorial!|Now get in there and stay out of trouble~ +祝贺您已经完成了教程|现在进去,别惹麻烦~ + + +Welcome to the dungeon!|Don't panic, this is a turn-based game,|and nothing will happen until you move.|On your left you'll see your character,|displayed with all of the bondage they don't have.|Don't worry, you'll find some soon! +欢迎来到地牢|不要惊慌,这是一个回合制游戏,|除非你移动,否则什么都不会发生|在您的左侧,您将看到您的角色,显示了她们没有的所有束缚|别担心,你很快就会找到的! + + +You might be wondering what all these barrels are for.|Don't worry, they're, uh, totally safe!|When you are inside one you can click on yourself to wait.|Enemies have a hard time seeing you inside a barrel,|so you can wait until they pass by you. +你可能想知道这些桶是干什么用的|别担心,他们完全安全|当你在里面时,你可以点击自己等待|敌人很难在桶里看到你,所以你可以等到他们从你身边经过。 + + +On the right you'll see your stats and spells slots.|Your DP, SP, MP, and WP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon. +在右侧,您会看到您的统计数据和法术槽。|您的 SP、MP、WP 和 DP 都显示在那里,我们将介绍它们的作用。|在下面,您会看到您当前的消耗品,|您的金币,以及你当前装备的武器。 +Your WP, or willpower, is an important resource.|Without it, escaping from restraints is more difficult.|There is a willpower potion on the floor up there. Go get it! +你的WP或意志力是一个重要的资源|没有它,摆脱束缚更加困难|前面的地板上有一种意志力药剂。去拿着吧! +Oh no! That trap reduced your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack). +哦,不!那个陷阱削弱了你的意志力!|幸运的是你有药水。|你可以通过单击意志力旁边的“+”图标来饮用|您还可以在底部栏中查看你的背包|还有一个快速图标 ( 背包 ) 。 +Another trap!|You'll notice that the trap also drained your stamina considerably, preventing you from sprinting or attacking.|(Note: you can toggle sprinting using the '>>' button on the bottom bar)|You can protect yourself while your stamina regenerates by retreating into the room above.|Close the door by clicking the Close Door button in the bottom bar.| +另一个陷阱!|你会注意到,这个陷阱会大量消耗你的体力,阻止你冲刺或攻击。| ( 注意 : ‎你可以使用底部栏上的“>>”按钮切换冲刺 ) |你可以在保护自己的同时 退回到上面的房间即可恢复你的体力。|点击底部栏中的“关门”按钮关上门。| + + +Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the right menu, then navigate to the Spell Tree.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1. +你的MP,或者叫法力,是用来施法的|为了施展法术,你需要学习一种|单击右侧菜单中的“法术”按钮,然后导航到“法术树”|然后点击火焰学徒,学习解锁火焰箭|然后,按空格键返回,然后按向右键切换页面|点击Firebolt,学习它,然后将其分配到法术1。 +On the right you'll see your stats and spells slots.|You can click on a spell slot or hit 1-4 on your keyboard to cast a spell|then click on the map for where you want to aim it.|The small wrench icon above them will let you|swap them out for another spell from your spellbook. +在右边,你会看到你的统计数据和法术插槽|你可以点击一个法术槽,或者点击键盘上的1-4来施放一个法术|然后在地图上点击你想要瞄准的地方|它们上面的小扳手图标可以让你|将它们换成法术书中的另一个法术。 +There's a zombie over there!|Fortunately zombies are weak to fire.|Firebolt has a very long range,|so simply cast firebolt and click on the zombie.|Repeat until it is dead. +那边有个僵尸|幸运的是,僵尸的火力很弱|火焰弹射程很长|所以只需施放火焰箭并点击僵尸即可|重复,直到它死去。 +Mana potions restore mana, allowing you to cast spells.|Youll notice that your mana also regenerates slowly.|This mana comes from your mana pool,|which is a thin line displayed under the mana bar.|When that runs out, you can't cast spells anymore! +法力药水可以恢复法力,让你能够施展法术。|你会注意到你的法力也会缓慢恢复。|恢复的法力来自你的法力池,|它是法力条下方显示的一条细线。|当法力耗尽时,你就不能施展法术了! + + +Your DP, or Distraction, is a measure of...|How much you are enjoying things.|These sorts of thoughts cloud your mind,|so spellcasting is more difficult when you are distracted.|Go grab the potion over there. +你的DP,或者叫性奋值,是一个标准…|衡量你享受的程度|这些想法让你的头脑变得模糊,所以当你性奋时,施法会更加困难|去那边拿药水。 +Did you like that?|Anyway, there's a zombie over there. You should drink that potion.|It will clear your mind so you can cast again.|Hurry, or it will get you! +你喜欢吗|不管怎样,那边有个僵尸。你应该喝那种药水|它会让你头脑清醒,这样你就可以再次施展|快点,不然它会抓住你的! + + +That wasn't so hard, was it?|Now then, there's a treasure chest over here. Why don't you open it? +这并不难,是吗|现在,这里有一个宝箱。你为什么不打开它? +Yikes, looks like you're in a bind!|No worries, though. There's a key to those cuffs over there.|Simply hover over the cuffs item test on the left side.|Then, click the lock icon to remove the lock.|Finally, click the buckle to remove the cuffs. +哎呀,看来你陷入困境了|不过,别担心。那边有一把钥匙|只需将鼠标悬停在左侧的手铐上|然后,单击锁图标以移除锁|最后,单击带扣以卸下手铐。 +I think we all know what's in the next chest.|It's important to understand the different ways you can escape.|You can struggle, which costs the most stamina|but makes other struggle methods faster.|You can cut, which requires a knife in hand.|You can remove, which represents untying or unbuckling. +我想我们都知道下一个箱子里有什么|重要的是要了解你可以逃避的不同方式|你可以挣扎,这会消耗最多的体力|但比其他脱身方法更快|你可以切割,这需要手里拿着刀|您可以语出,这表示松开或解除绑定。 +Ouch, that looked tight...|Sometimes you won't be able to struggle out of things.|You'll have to find some other way to take it off... +哎哟,看起来很紧…|有时候你无法摆脱困境|你得想办法把它取下来... +There's a few zombies up ahead.|Fight your way through and claim the treasure! +前面有几个僵尸|奋力拼搏,夺回宝藏! + + +You're not feeling it... +你没有感觉... +You close your eyes but the vibrations keep you from dozing off... +你闭上眼睛,但振动器让你无法休息。。。 + + +(A SPEAKER lies hogtied in front of you)|(She looks at you with pleading eyes,)|(and mumbles incoherently through her gag) +( SPEAKER 躺在你面前 ) | ( 她用恳求的眼神看着你, ) | ( 并通过她被堵住的嘴语无伦次地咕哝着。 ) +(A SPEAKER lies hogtied in front of you)|(She looks at you, mumbling and giggling into her gag) +( SPEAKER 躺在你面前 ) | ( 她看着你,嘴里咕哝着,咯咯笑着 ) +(SPEAKER looks grateful)|Thank you so much|I shall join your party. +( SPEAKER 看起来很感激 ) |非常感谢|我会加入你的队伍。 +(SPEAKER looks grateful)|Thank you so much miss!|I owe you everything. +( SPEAKER 看起来很感激 ) |非常感谢您,小姐!|我欠您一切。 +(SPEAKER groans and wriggles around uselessly) +( SPEAKER 呻吟着,毫无用处地扭动着。 ) +(SPEAKER moans and rolls around, blushing deeply) +( SPEAKER 呻吟着,转过身来,脸红得很厉害 ) +Untie her +解开她 +Make sure she is tight and secure +确保她安全可靠 + + +(A SPEAKER bumps into you while immersed in her thoughts)|Oh! Hello!|Say, you look adorable...|Do you mind helping me find something? +( SPEAKER 沉浸在她的思想中时撞到了你 ) |噢!你好!|喂,你看起来很可爱…|你介意帮我找点东西吗? +(The SPEAKER jumps up and down)|Ah, wonderful!|I've misplaced one of my dresses.|If you could find one, wear it, and bring it to me,|I'd greatly appreciate it! Thanks! +( SPEAKER 跳上跳下 ) |啊,太棒了|我把一件衣服放错地方了|如果你能找到一个,戴上它,带给我,我将非常感激!谢谢! +(The SPEAKER stares at you like a rabid animal)|Wowie! You look gorgeous!|Thank you so much!|(She snaps a photo of you using a magic crystal) +( SPEAKER 像一只疯狂的动物一样盯着你 ) |哇!你看起来真漂亮|非常感谢!| ( 她用魔法水晶给你拍了张照片。 ) +(The SPEAKER giggles)|I never said I'd take it off, did I? +( SPEAKER 咯咯地笑 ) |我从没说过我会把它拿下来,不是吗? +(The SPEAKER smiles)|Sure thing! +( SPEAKER 笑了 ) |当然! +(Show interest) +( 表示感兴趣 ) +I found your dress... +我找到了你的裙子。。。 +Mmmph... (Found the dress!) +呜呜呜… ( 找到裙子了! ) +Great! Can you take it off? +太棒了!你能把它拿下来吗? +Mmmmm! (Struggle) +呜呜呜呜! ( 挣扎 ) + + +(A SPEAKER clutching her books approaches you)|Miss adventurer!|I happen to need a magic scroll of any kind.|It's for my studies. +( SPEAKER 抓着她的书走近你 ) |冒险家小姐|我碰巧需要任何一种魔法卷轴|这是为了我的学习。 +(The SPEAKER smiles)|Yes, thank you so much!|It's been so difficult to get them lately.|The magic library is closed off these days,|and there are mean people trying to get the scrolls back... +( SPEAKER 微笑 ) |是的,非常感谢|最近很难找到它们|魔法图书馆最近关闭了|还有一些卑鄙的人试图拿回卷轴... +(The SPEAKER is happy)|Thank you so much! +( SPEAKER 很高兴 ) |非常感谢! +Give her a Scroll of Sauntering +给她一卷闲置的卷轴 +Give her a Scroll of Sleight +给她一卷狡猾的卷轴 +Give her a Scroll of Speech +给她一卷演讲的卷轴 +Give her a Scroll of Purity +给她一卷纯洁的卷轴 + + +(A SPEAKER looks distraught)|Well met, adventurer!|We have a problem... +( SPEAKER 看起来心烦意乱 ) |很好,冒险家|我们有个问题... +(The SPEAKER folds her arms)|A rebel has been causing us problems lately...|If you run into her, give her all you got!|She needs to be brought to justice. +( SPEAKER 交叉双臂 ) |最近一个叛军给我们带来了麻烦…|如果你碰到她,尽你所能!|她需要被绳之以法。 + + +(A SPEAKER scoffs in your direction)|Well? You lookin' for work or no? +( SPEAKER 朝着你笑 ) |好吧?你在找工作吗,或者不是? +(The SPEAKER grins)|A bunch of delinquents stormed out recently.|They're looking for a way out of their belts.|Someone oughta show em their place,|if you catch what I'm saying. +( SPEAKER 咧嘴笑 ) |最近一群违法者暴跳如雷|他们正在寻找摆脱困境的方法|应该有人带他们去他们的地方,|如果你明白我说的话。 + + +(A SPEAKER approaches you in your cell)|Since you've been a bad girl,|we're taking you to the high-security prison. +( SPEAKER 在你的牢房里走近你 ) |既然你是个坏女孩,|我们就把你带到高度戒备的监狱。 +(The SPEAKER folds her arms)|Want to or not, you're going. +( SPEAKER 交叉双臂 ) |不管你想不想,你都要去。 +(Resist) +( 抵抗 ) +(Submit) +( 顺从 ) + + +(A SPEAKER approaches you in your cell)|Looks like you're not in the System.|I'm going to have to take you to sorting. +( SPEAKER 在你的牢房里接近你)|看起来你不在系统中|我得带你去分类了。 +(The SPEAKER grins as her systems glow)|I love my job sometimes~ +( SPEAKER 咧嘴一笑,她的系统闪闪发光)|有时我喜欢我的工作~ +(The SPEAKER grins)|It means you'll get nicely packaged,|so that we can sort you through the System. +( SPEAKER 咧嘴一笑)|这意味着你会得到很好的包装,|这样我们就可以在系统中对你进行分类。 +W-what does that entail? +这-这意味着什么? +(The SPEAKER giggles)|That means we'll get to package you up and|decide what to do with you, silly~ +( SPEAKER 咯咯地笑了起来)|这意味着我们可以把你打包起来,然后|决定怎么处理你,傻瓜~ +Hmmmph? Mmmm! (Act worried and whimper) +Hmmmph? Mmmm!(表现出担忧和呜咽) +(The SPEAKER folds her arms)|Mistress Oriel's orders +( SPEAKER 双臂交叉)|这是女主人奥莉尔的命令 +Not in the 'System'? +不在“系统”中? +(The SPEAKER giggles)|Don't worry, we'll get you sorted out soon.|After all, everyone has a place in the System. +( SPEAKER 咯咯地笑了起来)|别担心,我们很快就会解决你的问题|毕竟,每个人在系统中都有一席之地。 +Mmmph? (Act confused) +Mmmph? (行为混乱) +(The SPEAKER folds her arms)|Mistress Oriel's orders were clear:|Anyone not logged in the System shall be entered into the System. +(SPEAKER 将双臂交叉) | 奥里尔夫人下达的命令非常明确: | 系统中未注册的任何人将被录入系统。 +(The SPEAKER pauses for a moment, then speaks)|I'm am just following Mistress Oriel's orders.|I'm sure she will have time to speak with you if you want to ask her. +( SPEAKER 停顿了一会儿,然后说话)|我只是在听从奥丽尔夫人的命令|如果你想问她,我相信她会有时间和你谈谈的。 +But why??? +但是为什么呢??? +(The SPEAKER frowns)|You should be thankful.|Without Mistress Oriel, we'd all be dead!|Probably... +( SPEAKER 皱着眉头)|你应该心存感激|没有奥里尔夫人,我们都会死的|可能... +Who is Mistress Oriel? +奥丽尔夫人是谁? +(The SPEAKER pauses for a moment, then answers)|Well, only a few hundred years ago, I think?|This is a bit longer of a downtime than usual,|But all of us are waiting patiently~ +( SPEAKER 停顿了一下,然后回答)|好吧,我想,就在几百年前吧|停机时间比平时长一点,但我们所有人都在耐心等待~ +When are these orders from? +这些订单是什么时候来的? +(You anger the SPEAKER. She gags you.)|Unlike you, we were trained not to complain about orders given to us.|So until you receive your training, why don't you be nice and quiet? +(你激怒了 SPEAKER 。她让你哑口无言。)|与你不同,我们受过训练,不会抱怨别人给我们的命令。|所以,在你接受训练之前,你为什么不友好而安静呢? +The facility is in ruins! This is pointless! +设施已成废墟!这毫无意义! + + +(A SPEAKER crosses her arms)|Who you lookin' at?|Oh, it's an adventurer.|Say, you wouldn't be interested|in working with us, would ya? +( SPEAKER 交叉双臂 ) |你在看什|哦,是个冒险家|喂,你不会感兴趣的|和我们一起工作,好吗? +(The SPEAKER smiles)|That's more like it.|Here's the scoop: One of ours was captured on the next floor.|We need you to go get her out. +( SPEAKER 微笑 ) |更像是这样|独家报道 : ‎我们其中一人在下一层被抓获|我们需要你去把她救出来。 + + +(The SPEAKER sits bound in high-security manacles.|You'll need to open the lock to get her out.) +( SPEAKER 戴着高安全性的手铐坐着|你需要打开锁才能让她解开... ) +(You don't have any keys that work on the lock) +( 你没有锁的钥匙。 ) +(You can't help her, bound as tightly as you are...) +( 你帮不了她,像你一样紧紧地绑着… ) +(You unlock her, fumbling around for a while with your bound hands) +( 你解开了她的锁,用绑着的手摸索了一会儿。 ) +(You unlock the SPEAKER)|Thank you!|Let's get out of here! +( 你解开了 SPEAKER ) |谢谢|我们从这里出去吧! +(You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...) +( 你解开了 SPEAKER ) |呜呜呜!| ( 她想保持自己的堵嘴… ) +(You don't have any lockpicks) +( 您没有任何撬锁器。 ) +(You try to pick the lock...)|(Click! A safety shield locks securely into place!)|(Looks like the SPEAKER will be staying here for a while...) +( 你试图撬开锁... ) | ( 咔哒!安全护盾牢固地锁定到位! ) | ( 看起来 SPEAKER 将在这里呆一段时间了... ) +(You can't pick the lock with your hands bound) +( 你不能用在手被绑住的时候撬锁。 ) +(After a while, you free the SPEAKER)|Thank you!|Let's get moving! +( 过了一会儿,你解开了 SPEAKER ) |谢谢|让我们开始行动! +(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...) +( 过了一会儿,你解开了 SPEAKER)|呜呜呜!|( 她在你给她解开堵嘴时摇头... ) +(You don't have enough mana for a command word) +( 你没有足够的法力来写命令词。 ) +(Try as you might, your mouth is sealed tight) +( 你尽你所能,你的嘴封得很紧 ) +(You utter a command word to free the SPEAKER)|Many thanks!|Let's go! +( 你发出命令释放 SPEAKER ) |非常感谢|走吧! +(You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) +( 你发出命令释放 SPEAKER ) |呜呜呜!|( 她把堵嘴又锁上了... ) +(The SPEAKER is locked in high-security manacles.|The safety shield has been triggered, making it impossible to help her.) +( SPEAKER 戴着高安全性的手铐。|安全护盾已被触发,无法帮助她。 ) + + +Use a key to unlock her +用钥匙解开她 +Try to pick her restraints (JAMPERCENT jam chance) +试着解开她的束缚 ( JAMPERCENT 几率 ) +Use CMD: Unlock +CMD: 解锁 +Apologize profusely! +深深地道歉! + + +### (The SPEAKER sits bound in mysterious ASCII glyphs)|(She is bugged and needs your help to get out) + +### (Unlock her and file a bug report to Ada) + + + +### (This SPEAKER is a sub, but not YOUR sub!) + + + +(The SPEAKER sits restrained by your own hand.|Only someone with keys can let her out.) +( SPEAKER 坐在那里,被你束缚住了。|只有有钥匙的人才能让她出去。) + + +Try to pick her restraints +试着解开她的束缚 +Return her to your collection +把她放回你的收藏 +Use a command word +使用命令词 +Flip her around +翻转她 +You spin her right round! +你把她转了个圈! + + + + +An enemy found you while you were busy! +敌人在你正忙的时候发现了你! + + +(A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door) +( SPEAKER 砰的一声把你吵醒 ) |醒醒!让我们离开这里| ( 她设法撬开了你牢房门上的锁。 ) +(A SPEAKER wakes you up by melting the door with acid)|These guys were a piece of cake.|Now let's discover a way out of here! +( SPEAKER 通过酸融化了门后叫醒你 ) |这些家伙真是小菜一碟。|现在让我们办法离开这里吧! +(You wake up to find a SPEAKER creeping up outside the door)|You've been marked as a person of interest.|We are here to escort you out of this place. +( 你醒来发现门外有一位 SPEAKER ) |你已被标记为感兴趣的人。|我们来这里是为了护送你离开这个地方。 +(A SPEAKER wakes you up by banging on the bars)|Hey wake up!|You should join me and my pals here~|Maybe you'll join them once we're out of here? +( SPEAKER 通过敲击栅栏来叫醒你 ) |嘿醒来!|你应该加入我和我的朋友们这里〜|也许我们离开这里后你会加入他们? +(A SPEAKER wakes you up by banging on the bars)|I have been sent to inform you...|...that you are of good standing with the Council.|That being said, I'm only doing this because of procedure. +( SPEAKER 通过敲击栅栏来叫醒你 ) |我被派来通知你...|...你在理事会中享有良好的声誉。|话虽这么说,我这样做只是因为走个程序。 +(A SPEAKER wakes you up by banging on the bars)|Greetings, follower of the blessed kitty!|Because of your faith, we have been sent to rescue you! +( SPEAKER 通过敲击栏杆将您叫醒 ) |您好,受祝福的小猫的追随者!|因为您的信仰,我们被派来营救您! +(You sense a presence nearby and look up to see a SPEAKER)|Because you are one, we have come to free you.|Do not take this as an excuse|to get yourself into further trouble. +( 你感觉到附近有人,抬头看到 SPEAKER ) |因为你是我们其中一员,所以我们来释放你。|不要以此为借口|让自己陷入进一步的麻烦。 +(A SPEAKER wakes you up with the sound of copious fabric rustling)|Oh why hello there!|Would you be interested in a trial run of my latest product?|Of course, we'll have to get you out of here first... +( SPEAKER 用大量织物的沙沙声将您吵醒 ) |哦,为什么你好!|您有兴趣试用我的最新产品吗?|当然,我们必须先带您离开这里... +(A SPEAKER wakes you up by banging on the bars)|Hello my pretty~|I thought to myself I'd rather have you than these folk.|Now why don't you come along and follow me... +( SPEAKER 通过敲击栅栏把你吵醒 ) |你好我的甜心~|我心想我宁愿拥有你而不是这些人。|现在你为什么不来跟着我...... +(A SPEAKER wakes you up by banging on the bars)|Um... hello!|I received a quest to help you out of here!|Now, where do we go... +( SPEAKER 通过敲击栅栏来叫醒你 ) |嗯...你好!|我收到了一个任务,要帮助你离开这里!|现在,我们要去哪里... +(You wake up to find a SPEAKER whispering to you)|Greetings.|We've been sent to free you.|Let's get moving. +( 你醒来发现 SPEAKER 在对你窃窃私语 ) |向你问好。|我们被派来释放你。|让我们行动起来吧。 +(A SPEAKER wakes you up by banging loudly)|Hey! Good news!|My friends and I came to rescue you! +( SPEAKER 通过大声敲打来叫醒你 ) |嘿! 好消息!|我和我的朋友们来救你了! +(A SPEAKER wakes you up by knocking on the bars)|Hey, wake up.|I happen to like you, so we're going to get you out of here. +( SPEAKER 通过敲击栏杆将你叫醒 ) |嘿,醒醒。|我碰巧喜欢你,所以我们要带你离开这里。 +(A SPEAKER flashes a bright light in your direction)|Prisoner 74121 located. Commence transfer to different location. +( SPEAKER 向您的方向发出强光 ) |囚犯 74121 已找到。开始转移到其他地点。 +(A SPEAKER wakes you up)|We came to rescue you. Come on! +( SPEAKER 把你叫醒 ) |我们是来救你的。来吧! + + +(The bed looks comfy and inviting)|(Napping here will restore up to half of your willpower and 100% of your max mana)|(You can only sleep once per floor, unless jailed) +( 床看起来舒服又诱人 )|( 在这里小憩可以恢复你一半的意志力和 100% 的最大法力 )|( 每层楼只能睡一次,除非入狱 ) +(You lay in the bed and doze off...) +( 你躺在床上打瞌睡… ) +(Lie down and sleep) +( 躺下睡觉 ) + + +(There is a pole sticking out of the ground)|(A footrest rises from the floor on either side of the pole)|(This seems like an automated binding system for prisoners...) +( 有一根杆子从地上伸出来 ) | ( 杆子两侧的地板上升起一个脚踏板 ) | ( 这看起来像是囚犯的自动捆绑系统… ) +(The pole rises and immobilizes you!) +( 杆子升起并把你制服! ) +(Stand over it and place your feet in the footrests) +( 站在上面并将脚放在脚踏板上 ) +(Drop off a prisoner from your collection) +(从你的收藏中放下一名囚犯) +(Put NME on the stand) (PRCNT% Chance) +(把 NME 放在看台上)(PRCNT% 几率) +(Put NME on the stand) +(将 NME 放在支架上) +(This is a piece of bondage furniture) +(这是一件束缚家具) +(You lock yourself in the furniture!) +(你把自己锁在家具里了!) +(The SPEAKER slips out of your grip|before you can lock her in place!) +( SPEAKER 从你手中溜走了|你还没来得及把她锁好!) +(Display one of your prisoners) +(展示你的一名囚犯) +(Lock yourself inside) +(把自己锁在里面) +(Check the occupant) +检查住客 + + +(Try to lock NME into the furniture) (PRCNT% Chance) +(尝试将 NME 锁定在家具中)(PRCNT% 几率) +(You close the furniture around your unfortunate victim!) +(你把不幸受害者周围的家具关上!) +Stun or disable her first. +先让她昏迷或致残。 +Area isn't clear. +区域不清晰。 +(Secure NME into the furniture) +(将 NME 固定到家具中) +(You lock her into the furniture so that she stays in place) +(你把她锁在家具里,这样她就不会动了) + + +FOODMSG|(It invites you to partake in its culinary delights) +FOODMSG| ( 它邀请你分享它的美食 ) +(You eat the food and feel your willpower rising) +( 吃完食物你感觉到你的意志力在上升 ) +(Being gagged as you are you cannot enjoy the food) +( 被塞住嘴的时候无法享受食物 ) +(You steal the food, hoping nobody will notice...) +( 你偷食物,希望没人会注意到...... ) +(Eat it to restore AMOUNT% WP) +( 吃掉它可以恢复 AMOUNT% 意志力 ) +(Take it!) +( 拿走! ) + + +(Someone left their cookies unattended) +( 有人留下了他们的曲奇无人看管 ) +(You smell delicious pizza) +( 你闻到美味的披萨的味道 ) +Cookie +曲奇 +Pizza +披萨 + + +(There is a button on a control panel here.) +( 这里的控制面板上有一个按钮。 ) +(You touch the button and it glows, releasing a pulse of energy!) +( 当你触摸按钮时,它会发光,并释放能量脉冲! ) +(PUSH THE BUTTON) +( 按按钮 ) + + +(You find a map of the local leylines.)|(Committing these to memory will allow you to harness additional mana.) +( 你找到当地地脉的地图。 ) | ( 将这些记入记忆将使你能够利用额外的法力。 ) +(Are you sure?)|(This decision is permanent.) +( 你确定吗? ) | ( 此决定是永久性的。 ) +(Gain +100 to Max Mana Pool) +( 最大法力池 +100 ) +(I don't want to.) +( 我不想。 ) +(No really, I don't want it!) +( 真的,我不想要! ) + + +(You find a strange elevator with a control panel inside)|(You get the impression this will take you somewhere.) +( 你发现一个奇怪的电梯,里面有一个控制面板 ) | ( 你觉得这会带你去某个地方。 ) +(Are you sure?)|(This seems like a bad idea!) +( 你确定吗? ) | ( 这似乎是个坏主意! ) +(You activate the control panel and begin to descend...) +( 您激活控制面板并开始下降...... ) +(Take me down!) +( 带我下去! ) +(I know what I'm doing!) +( 我知道我在做什么! ) + + +(The conveyor pulls you into a strange elevator)|(A whir of motors suggests this elevator is about to start...) +( 传送带把你拉进陌生的电梯 ) | ( 一阵马达的呼呼声表明这台电梯即将启动…… ) +(You manage to scramble out the door!)|(It closes violently behind you...) +( 你成功地爬出了门! ) | ( 门在你身后猛烈地关上…… ) +(The door slams in front of you before you are able to escape!)|(A purple light turns on, revealing a padded interior)|(You feel the elevator begin to descend...) +( 你还没来得及逃走,门就在你面前关上! ) | ( 紫色的灯光亮起,露出里面的软垫 ) | ( 你感觉到电梯开始下降…… ) +(There's no point in fighting when you can't win)|(You wait patiently as the elevator descends) +( 当你赢不了的时候,战斗是没有意义的 ) | ( 你耐心地等待电梯下降 ) +(Try to get out! RESISTCHANCE% success chance) +( 尝试逃脱!RESISTCHANCE% 成功率 ) +(Give up and let it take me) +( 放弃并让它带走我 ) +(Wait it out) +( 等待 ) + + +(Mystic energies spring forth from the ground)|(Standing here will fully replenish your passive mana pool)|(One use only) +( 神秘能量从地面涌出 ) | ( 站在这里将完全补充你的被动法力池 ) | ( 仅限一次使用 ) +(You step on the magical fissue and its energies absorb into you)|(Afterward, the ground crackles and fizzles, but no energy is left.) +( 你踩到魔法的石头,它的能量吸收到你身上 ) | ( 之后,地面噼啪作响,但没有留下任何能量。 ) +(Recharge your mana pool) +( 补充你的法力池 ) + + +Upcast Level LEVEL +LEVEL 级 +Prerequisite +前置条件 +Unlocks: +解锁 : ‎ +You need to learn REQUIREDSPELL before you can learn this one. +你需要先学习 REQUIREDSPELL 才能学习这个。 + + +You no longer have the will to struggle. +你不再有挣扎的意志。 + + +Help yourself! +请随意 +You eat the delicious food and feel your will restored. +你吃了美味的食物,感觉你的意志恢复了。 +Your gag prevents you from eating... +你的堵嘴物阻止你进食... +It's a table. +这是一张桌子。 +It's a table, with evidence of a grisly deed. +这是一张桌子,有恐怖行为的证据。 + + +You call for help! +你呼救! +You let out a garbled cry! +你乱叫了一声! +Your screams are muffled by your gag! +你的尖叫声被你的堵嘴掩盖了! +You can hardly make a noise... +你几乎不能发出声音... + + +*clink* +*叮当声* + + +You yelp as the EnemyName activates your RestraintName +当 EnemyName 激活你的 RestraintName 时你会大叫 +You shudder as the EnemyName activates your RestraintName +当 EnemyName 激活你的 RestraintName 时你会浑身颤抖 + + +That should slow you down! +那应该会减慢你的速度! +Try running away now~ +现在就尝试逃跑吧~ +Initiating prisoner lockdown protocol--Unknown hardware detected +正在启动囚犯锁定协议——检测到未知硬件 +What's this do? +这是干什么的? +That harness you're wearing is quite convenient for me~ +你穿的那条安全带对我来说很方便~ +Initiating prisoner lockdown protocol +启动囚犯封锁协议 +Your RestraintName suddenly snap together as the EnemyName activates them! +你的RestraintName突然被EnemyName激活了! +Your harness projects energy tethers between your cuffs EnemyName activates it! +你的束具在你的手铐之间投射能量绳索, EnemyName 会激活它! + + +Turn Count: +回合计数 : ‎ + + +The Shopkeeper leashes you! +店主正在牵着你! +You are brought into the Shopkeeper's establishment... +你被带进了店主的店里...... + + +It seems to be working! The seal on your RESTRAINTNAME is weakened. +它似乎正在发挥作用! 你 RESTRAINTNAME 上的封印被削弱了。 +The cursed seal on your RESTRAINTNAME disappears. +你的 RESTRAINTNAME 上的诅咒封印消失了。 +You are moved along by the conveyor... +你被传送带移动着...... +Strange machinery begins sealing you in shiny latex! +奇怪的机器开始用闪闪发光的乳胶密封你! +Metallic arms insert something into you! +金属臂将一些东西插入了你的体内! +Metallic arms attach a chastity belt over your waist! +金属臂将贞操带戴在你的腰上! +Metallic arms wrap you in tape! +金属臂用胶带包裹你! +Metallic arms wrap you in strict restraints! +金属臂将你牢牢束缚! +Metallic arms install various cybernetic restraints! +金属臂安装了各种拘束具! + + +You've sprung a trap! You've been stunned. +你陷入了陷阱了! 受到了惊吓。 +The bandit leaves behind a sneaky trap... +强盗留下了一个狡猾的陷阱...... +Damsel Trap +少女陷阱 + + +The ENEMYNAME transforms nearby dolls into her subjects! +ENEMYNAME 将附近的玩偶变成了她的臣民! + + +You wriggle around while struggling... +你一边挣扎一边扭动…… + + +The missile explodes into a shower of latex that covers you! +导弹爆炸成乳胶雨,包裹住你! +Rubber Missile Direct Hit +橡胶导弹直接命中 +Rubber Missile +橡胶导弹 +Rubber Nuke Direct Hit +橡胶核弹直接命中 +Rubber Nuke +橡胶核弹 + + +(In the center of the room stands a woman wearing a latex dress)|(Around her are robotic servants, obeying her without a word)|(She has been watching you this entire time) +( 房间中央站着一个穿着乳胶裙的女人 ) | ( 她周围是机器人仆人,一言不发地服从着她 ) | ( 她一直在盯着你 ) +And who might you be? +那么你是谁? +(Tilt your head) +( 歪着头 ) +(The woman's mask reflects the harsh industrial light)|You don't know who I am?|Hmmph, and I suppose my servants haven't told you...|They call me the Dollmaker. +( 女人的面具反射着刺眼的工业光 ) |你不知道我是谁?|嗯,看来我的仆人还没有告诉你……|他们叫我玩偶师。 +So you're the one they talked about. +所以你就是他们谈论的那个人。 +(Nod and continue) +( 点头继续 ) +(Tuck your staff behind your back...) +( 把你的手杖藏在背后…… ) +(The Dollmaker points at you)|Is that--? +( 玩偶师指着你 ) |那是——? +(Panic!) +( 惊恐! ) +You must be the Dollmaker. +你一定是玩偶师。 +(The woman chuckles)|Correct.|And you must be the adventurer causing the recent troubles. +( 女子轻笑 ) |没错。|而你一定就是最近经常惹出麻烦的冒险者。 +I'm famous! +我很出名! +Indeed. And I'm here to bring you down. +的确。 我是来打倒你的。 +(Scoff at her) +( 嘲笑她 ) + + +(The Dollmaker folds her arms)|In any case, your journey ends here.|I do not appreciate scoundrels poking around in my domain.|I will personally lead you to your new future as a doll. +( 玩偶师抱起双臂 ) |无论如何,你的旅途到此结束。|我不喜欢无赖在我的领域里闲逛。|我将亲自带领你走向作为玩偶的新未来。 +Do you have the Mistress' Staff? +你有女主人的法杖吗? +(The Dollmaker chuckles)|That trinket?|So that's what you're after!|As a matter of fact, I do not have it.|It belongs to a certain Archmagus. +( 玩偶师轻笑 ) |那个小饰品?|这就是你要找的东西!|事实上,我没有它。|它属于某位大魔法师。 +Then you are of no use to me. +那你对我就没什么用了。 +(The Dollmaker summons a drone to her side)|Such arrogance! I'll have to teach you some manners! +( 玩偶师召唤一架无人机到她身边 ) |真傲慢!看来我得教你一些礼仪! +What a bother. +真麻烦啊。 +Who? +谁? +(The Dollmaker explains)|Archmagus Sariel Vinlaga. I'm surprised you didn't know.|Not that it matters for a future doll like you. +( 玩偶师解释 ) |大魔法师萨里尔·文拉加(Sariel Vinlaga)。 我很惊讶你竟然不知道。|当然这对于像你这样的未来玩偶来说并不重要。 +...Sariel Vinlaga. +...萨里尔·文拉加(Sariel Vinlaga) +(The Dollmaker nods)|Yes. She is down here.|But this information is irrelevant to your future as a doll. +( 玩偶师点头 ) |是的。 她就在这里。|但是这些信息与你作为玩偶的未来无关。 +The Staff will be mine. +权杖将是我的。 +Fair enough. Let's fight! +很公平。让我们来战斗吧! +We'll see about that! +我们拭目以待吧! +Feel free to try. +请随意尝试。 +Sounds fun... but I really need to get going. +听起来很有趣……但我真的需要开始了。 + + +(The Dollmaker folds her arms as she walks over)|All tight and shiny!|You'll be my prized possession~ +( 玩偶师走过去时双臂交叉 ) |全身紧绷且闪闪发光!|你将是我最珍贵的财产~ +(The Dollmaker nods)|Already eager to obey!|So beautiful... +( 玩偶师点头 ) |已经迫不及待地服从我了!|太美丽了…… +(The Dollmaker chuckles)|Oh, but I already have~ +( 玩偶师笑 ) |哦,但我已经有了~ +I have no choice but to submit. +我别无选择,只能屈服。 +You will never get away with this! +你永远逃脱不了这个! +(Sigh and be forced to wear her visor) +( 叹了口气,被迫戴上目镜 ) +(Sigh and be forced to wear her mask) +( 叹了口气,被迫戴上面罩 ) +(Sigh and be forced to wear whatever she chooses) +( 叹了口气,被迫穿她选择的任何衣服 ) +(The Dollmaker places her visor over your face)|(With a click, you feel its fasteners lock around your head)|Now... as it stands, I have a task for you, doll.|You see, some dolls have been escaping my realm.|I want you to go capture them. +( 玩偶师将她的面罩放在你的脸上 ) | ( 咔哒一声,你感觉到它紧紧地锁在了你的头上 ) |现在......就目前情况而言,我有一个任务要交给你,我的玩偶。|你看,有些玩偶已经逃离我的领域。|我要你去抓住他们。 + + +(The Dollmaker suddenly teleports away)|Hmmph. Looks like I will have to use my heavy firepower. +( 玩偶师突然传送离开 ) |嗯。看来我不得不动用我的重型火力。 +(The Dollmaker sinks into a puddle of slime and emerges nearby)|(Robotic arms sprout from her back as she storms toward you!) +( 玩偶师沉入一滩粘液中,然后出现在附近 ) | ( 当她冲向你时,机械臂从她的背后长出来! ) + + +(The Dollmaker concedes defeat)|You have defeated me.|I... I... will let you pass.|(The door exit door unlocks with an audible click) +( 玩偶师认输 ) |你打败了我。|我...我...会让你通过。| ( 出口处的门解锁了,并且发出咔哒声 ) +(SPEAKER looks confused)|What are you... Okay, you can have it... +( SPEAKER 看起来很困惑 ) |你要干什... 好吧,你可以拥有它... +(Wear a doll visor) +( 戴上玩偶目镜 ) +(Wear a doll mask) +( 戴上玩偶面罩 ) +(You lift up the dollmaker's mask, revealing a pouting young woman inside)|What are you--|(You insert a gag into her open mouth and she starts mumbling angrily) +( 你掀起玩偶师的面具,里面是一个撅着嘴的年轻女子 ) |你要干什——| ( 你把一个口塞塞入她张开的嘴里,她开始愤怒地咕哝 ) + + +The Dollmaker calls in drone reinforcements! +玩偶师呼叫无人机增援! +The Dollmaker releases many drones with robotic arms to capture you! +玩偶师释放了许多带有机械臂的无人机来捕捉你! +Zombies emerge from the ground! +僵尸从地底冒了出来! + + +Cyber Ankle Cuffs +赛博脚铐 +Ankle cuffs of exquisite quality, bearing all the marks of Old Civilization technology. +脚铐品质精美,带有旧文明技术的所有痕迹。 +Though made of ultra-tough metal, they feel light on your ankles... +虽然它们由超坚韧的金属制成,但戴在脚踝上却感觉很轻...... +An energy link appears, linking your ankles close together! +一条能量链条出现,将你的脚踝紧密地连接在一起! + + +Energy Link +能量链条 +An energy link connecting your ankle cuffs together. +将脚铐链接在一起的能量链条。 +It's powered by a chaos-resonance matrix, which can be overloaded by cutting the field. +它由混沌共振矩阵提供动力,可以通过切割磁场来使其过载。 +The energy link disappears, freeing your ankles! +能量链条消失,你的脚踝自由了! +Your ankles snap together as the cuffs activate! +当铐子激活时,你的脚踝会扣在一起! + + +Cyber Cuffs Chain +链式赛博手铐 +A magnetic link keeping your ankles tightly connected. +磁力链接使你的脚踝保持紧密连接。 +The cuffs are closely attached, so you can't cut the link apart. +手铐紧密相连,因此你无法将链条切断。 +The ankle cuffs detach with a beep! +脚铐随着 '嘟' 的一声解开了! + + +Cyber Leg Cuffs +赛博腿铐 +Thigh cuffs of exquisite quality, bearing all the marks of Old Civilization technology. +腿铐品质精美,带有旧文明技术的所有痕迹。 +Though made of ultra-tough metal, they feel light on your legs... +虽然它们由超坚韧的金属制成的,但戴在腿上却感觉很轻...... +An energy link appears, linking your thighs close together! +一条能量链条出现,将你的大腿紧紧地连接在一起! + + +An energy link connecting your leg cuffs together. +将双腿链接在一起的能量链条。 +The energy link disappears, freeing your legs! +能量链条消失,你的腿自由了! + + +Cyber Cuffs +赛博手铐 +Wrist and elbow cuffs of exquisite quality, bearing all the marks of Old Civilization technology. +手腕和肘部手铐品质精美,带有旧文明技术的所有痕迹。 +Though made of ultra-tough metal, they feel light on your wrists... +虽然它们由超坚韧的金属制成,但戴在手腕上却感觉很轻...... +Your wrists are pulled together as the cuffs activate! +当铐子启动时,你的手腕被拉到一起! + + +Cyber Wrist Link +赛博腕链 +A magnetic link keeping your wrists secured together. +磁力链条将你的手腕固定在一起。 +Your cuffs detatch with a beep! +铐子随着 '嘟' 的一声解开了! +Your elbows snap together as the cuffs engage fully! +当铐子完全链接时,你的肘部会被锁在一起! + + +Cyber Connection +赛博链接 +A magnetic link keeping your wrists and elbows inescapably secured. +磁力链条使你的手腕和肘部牢牢固定。 +Your wrists detatch with a beep, leaving your elbows still bound! +随着 '嘟' 的一声,你的手腕自由了,但你的肘部仍然被束缚着! +Your arms snap fully together as the cuffs activate! +当铐子激活时,你的手臂会完全合拢! + + +Cyber Elbow Link +赛博肘链 +A magnetic link keeping your elbows pressed tightly together! +磁力链条将你的肘部紧紧地压在一起! +Your elbows detatch with a beep! +肘部随着 '嘟' 的一声解开了! + + +Doll Gag +玩偶口塞 +A soft ball pressed against your lips and held in place with metallic straps. +一个柔软的球压在你的嘴唇上,并用金属带固定到位。 +The straps are made of a flexible metal with no visible seams along the straps. +带子由柔性金属制成,带子上没有可见的接缝。 + + +Doll Plug Gag +玩偶塞子口塞 +A soft, flexible plug pressed into your mouth and held in place with a metal shield. +将柔软、灵活的塞子压入你的嘴中,并用金属罩固定到位。 + + +Doll Muzzle +玩偶口套 +A metallic shield preventing you from removing any gags underneath. +金属罩阻止你移除下面的任何塞子。 +It's made of exquisite Old Civilization metals, resistant to almost all forms of damage. +它由精致的古代文明金属制成,可以抵抗几乎所有形式的损坏。 + + +Cyber Mittens +赛博手套 +These mittens force your hands into fists, keeping you from using them to do anything useful. +这些手套迫使你的手握成拳头,使你无法用它们做任何有用的事情。 +It is made of a strong mesh of ancient metallic fiber, kept in place with a metal band. +它由古老金属纤维制成的坚固网状物制成,并用金属带固定。 +Cyber Lockdown Mitts +赛博封锁手套 +These long mittens force your hands into fists, keeping you from using them to do anything useful. +这些长手套迫使你的手握成拳头,使你无法用它们做任何有用的事情。 +It is made of a strong mesh of ancient metallic fiber, wrapped snugly around your arms to make removal by yourself impossible. +它由古老的金属纤维制成的坚固网状物,紧紧缠绕在你的手臂上,让你无法自行脱下。 + + +Doll Heels +玩偶高跟鞋 +A pair of tall heels used to improve the aesthetics and controllability of dolls. +一双高跟鞋用来提高玩偶的美观度和操控性。 + + +Cyber Doll Belt +赛博玩偶贞操带 +A chastity belt created by the Old Civilization. Truly a marvel of science! +旧文明制造的贞操带。真是科学奇迹! +It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with a advanced form of latex designed for permanent wear. +它由精致的旧文明金属制成,可以抵抗几乎所有形式的损坏,并填充有专为永久磨损而设计的高级乳胶。 +Cyber Doll Bra +赛博玩偶贞操文胸 +A chastity bra created by the Old Civilization. Truly a marvel of science! The flexible material over the breasts hardens when squeezed, unless allowed for by the program. +旧文明制造的贞操文胸。真是科学奇迹!乳房上的柔性材料在挤压时会变硬,除非程序允许。 +It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with an advanced form of latex designed for permanent wear. +它由精致的旧文明金属制成,可以抵抗几乎所有形式的损坏,并填充有专为永久磨损而设计的高级乳胶。 + + +Doll Jacket +玩偶拘束衣 +A jacket used to secure particularly unruly dolls. +用于束缚特别不守规矩玩偶的拘束衣。 +The material is somehow both stretchy yet hard enough to chip a knife on. The pinnacle of Old Civilization materials science. +这种材料既有弹性又坚硬,足以用刀划破。旧文明材料科学的顶峰。 + + +Dollmaker's Visor +玩偶师的目镜 +A visor used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. +玩偶师用来给她的玩偶分配任意任务的面罩。除非你履行捕捉玩偶的职责,否则下一关的大门不会打开。 +It's made of metallic glass, almost indestructible. Fortunately, it's still possible to see through. +它由金属玻璃制成,几乎坚不可摧。幸好,还是可以看穿的。 +Dollmaker's Mask +玩偶师的面罩 +A mask used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. +玩偶师用来给她的玩偶分配任意任务的面罩。除非你履行捕捉玩偶的职责,否则下一关的大门不会打开。 + + +Detected new hardware. +检测到新硬件。 +[Restriction Protocol] Detected new hardware: RESTRAINTNAME. Install progress: PERCENT% +[限制协议] 检测到新硬件 : ‎RESTRAINTNAME。安装进度 : ‎PERCENT% +[Restriction Protocol] Installation complete. Completing uniform. +[限制协议]安装完成。完成统一。 +[Punishment] Engage mobility restrictions. +[惩罚]限制行动。 + + +[Training Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% +[训练协议] 检测到硬件 : ‎RESTRAINTNAME。安装进度 : ‎PERCENT% +Supplemental Stimulation +补充刺激 +Endurance Training +耐力训练 +Frustration Tolerance +挫折容忍度 +[Training Protocol] Installation complete. Engage training mode: CHASTITYMODE +[训练协议] 安装完成。参与训练模式 : ‎CHASTITYMODE +You feel your belt insert new toys into your body... +你感觉你的贞操带将新玩具插入你的身体...... + + +[Sensory Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% +[感官协议] 检测到硬件 : ‎RESTRAINTNAME。安装进度 : ‎PERCENT% +[Sensory Protocol] Installation complete. Engage sensory restrictions. +[感官协议] 安装完成。参与感官限制。 + + +[Tracking Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% +[追踪协议] 检测到硬件 : ‎RESTRAINTNAME。安装进度 : ‎PERCENT% +[Tracking Protocol] Installation complete. Engage tracing system. +[追踪协议] 安装完成。启用追踪系统。 + + +Your visor dims to help you focus on your task. +你的面罩变暗,以帮助你专注于你的任务。 + + +Escaped Doll +逃跑的玩偶 +You return the doll to her rightful owner. +你把玩偶归还给她的合法主人。 + + +Your movement sets off your [RESTRAINTNAME] +你的动作引发了你的 [RESTRAINTNAME] +Your struggling sets off your [RESTRAINTNAME] +你的挣扎引发了你的 [RESTRAINTNAME] +Your attack sets off your [RESTRAINTNAME] +你的攻击引发了你的 [RESTRAINTNAME] + + +The straps on your gag prevent you from loosening the blindfold! +口塞上的带子可以防止眼罩松动! +The straps on your gag keep your blindfold securely in place! +口塞上的带子可将眼罩牢牢固定住! + + +Revert +重置 +Confirm Revert? +确认重置? +Save +保存 +Save Changes? +保存更改? +Back to Menu +返回菜单 +Back to Wardrobe +返回衣柜 +Confirm Strip? +确认要脱衣服? +Strip! +‎ 脱光 +Export Outfit +导出衣服 +Export AlwaysDress +导出强制着装 +Export Hair +导出发型 +Export Face +导出脸部 +Export Cosplay +导出 Cosplay + + +Gamma +伽马值 +Original Color +原色 +Contrast +对比度 +Brightness +亮度 +Red +红 +Green +绿 +Blue +蓝 +Transparency +透明度 +Reset Layer! +重置图层! +Reset Properties! +重置属性! +Export All Layers +导出所有图层 +Export All Props +导出所有属性 +Copy +复制 +Paste +粘贴 + + +Items on Ground: +地面物品 : ‎ + + +Preloading Character Assets: +预加载角色资产 : ‎ + + +### Currently Worn + +Uniforms +制服 +Suits +套装 +Underwear +内衣 +Bras +胸罩 +Bodysuits +连体衣 +Socks +袜子 +Shoes +鞋 +Tops +上衣 +Sleeves +袖子 +Corsets +束胸 +Skirts +裙子 +Pants +短衬裤 +Accessories +配饰 +Fashion Restraints +装饰性束缚 +Hats +帽子 +Toys and Piercings +玩具和穿孔 +Hairstyles +发型 +Eyes +眼 +Body +身体 +Gloves +手套 +'Cosplay' +Cosplay + + +Cat Eyes +猫眼 +Right Eye +右眼 +Left Eye +左眼 +Cat Brows +猫眉 +Right Brow +右眉 +Left Brow +左眉 +Simple Mouth +简单嘴 +Simple Blush +简单腮红 +Blush +腮红 +Braid +发辫 +Braid Front +发辫(前) +Braid Back +发辫(后) +Bangs Only +仅刘海 +Bangs +刘海 +Braid+Back +发辫(后+) +Braid Upper +发辫(上) +Braid Lower +发辫(下) +Back Only +仅后部 +Ahoge +呆毛 +Catsuit +连体紧身衣 +Torso Lower +躯干下部 +Torso Upper +躯干上部 +Labcoat +实验服 +Shoulders +肩膀 +ShouldersHogtie +肩部捆绑 +Coat +外套 +### CoatHogtieFree + +Cape +披肩 +Pauldrons +肩甲 +Breastplate +胸铠 +PlateBoots +平底靴 +BootLeft +左侧靴子 +BootRight +右侧靴子 +BootRightKneel +右侧靴子(跪姿) +### BootLeftHogtie + +Gauntlets +金属手甲 +GauntletLeft +左侧护腕 +GauntletRight +右侧护腕 +PlateArmor +板甲 +ChainShirt +锁链衫 +### ShirtChest + +Shirt +衬衫 +ChainSkirt +链甲战裙 +Skirt +裙子 +ChainArmor +链甲 +BanditShorts +强盗短裤 +Shorts +短裤 +BanditLeftWrist +强盗护腕(左) +WristLeft +手腕(左) +BanditRightWrist +强盗护腕(右) +WristRight +手腕(右) +BanditWrist +强盗短裤 +BanditBoots +强盗靴子 +ShoeLeft +鞋(左) +ShoeRight +鞋(右) +### ShoeRightKneel + +### ShoeLeftHogtie + +BanditBreastplate +强盗胸甲 +Striped Skirt +条纹短裙 +MaidApron +女仆围裙 +Apron +围裙 +MaidBlouse +女仆衬衫 +Blouse +短上衣 +### BlouseBust + +MaidBow +女仆领带 +Bow +弓 +MaidCorset +女仆束胸 +Corset +束胸 +MaidCorsetFull +女仆束胸(全) +### CorsetStraps + +MaidSockLeft +左侧女仆袜 +SockLeft +左侧袜 +MaidSockRight +右侧女仆袜 +SockRight +袜子(右) +MaidShoes +女仆鞋 +MaidSocks +女仆长袜 +Maidforce Agent +女仆特工 +Elven +精灵 +Bunny Suit +兔女郎 +Dress +礼服 +WitchBlouse +女巫衬衫 +BlouseLiner +衬垫 +WitchCorset +女巫束胸 +WitchHat +女巫帽 +### WitchHatBack + +ApprenticeHat +学徒帽 +### ApprenticeHatPuff + +WitchShoes +女巫鞋 +WitchSkirt +女巫长裙 +SkirtBelt +裙铃 +### SkirtRuffle + +Witch +女巫 +WarriorBoots +战士靴 +SportsBra +运动内衣 +WarriorBustier +战士束胸 +### BustierChest + +Bustier +紧身胸衣 +WarriorBelt +战士腰带 +DragonNecklace +龙项链 +### Necklace + +DragonArmband +龙臂章 +Armband +袖标 +DragonCollar +龙项圈 +WarriorSkirt +战士短裙 +Dragonheart +龙之心 +ZombieHat +僵尸帽 +ZombieHatBand +符咒(右眼) +ZombieChestTalisman +僵尸胸部护身符 +ZombieTalisman +僵尸护身符 +ZombieTalismanBent +僵尸护身符(弯) +Sandals +凉鞋 +RobeBra +死灵胸罩 +RobeSleeveLeft +袍袖(左) +SleeveLeft +袖子(左) +RobeSleeveRight +袍袖(右) +SleeveRight +袖子(右) +RobeSleeves +死灵长袖 +RobeSleeveDecoLeft +飘带(左) +### SleeveDecoLeft + +RobeSleeveDecoRight +飘带(右) +### SleeveDecoRight + +RobeSleevesDeco +死灵长袖带 +Ribbon +丝带 +RibbonBelt +丝带绳衣 +### RibbonBack + +RobeSkirt +死灵短裙 +Robes +死灵 +Arm Ropes +手臂绳缚 +Upper Chest Strap +上胸绳 +Shoulder Straps +肩绳 +Lower Chest Straps +下胸绳 +Arm Straps +手臂绳 + + +HairBow +蝴蝶结(发) +Bow‎ +蝴蝶结 +HairBowFrilly +蝴蝶结褶边(发) +BowFrills +蝴蝶结褶边 +Hairband +发带 +MaidHairband +女仆发带 +MaidFrill +女仆发带褶边 +BackStraight +后直发 +Curly +卷发 +### Curly_Overstrap + +Fluffy +蓬松的 +Fuzzy +蓬松 +### Fuzzy_Overstrap + +FrontStraight +前直发 +### FrontStraight_Overstrap + +Straight +直发 +### Straight_Overstrap + +### Long Straight + +StraightBangs +直刘海 +### StraightBangs_Overstrap + +Curly Back +卷发(后) +Messy +凌乱 +MessyBackShort +凌乱(后短) +Short Messy +凌乱(短) +Underlight +打光 +CurlyBack +卷发(后) +Ponytail +马尾辫 +FluffyPonytail +蓬松马尾辫 +Ponytail2 +马尾辫2 +TwintailLeft +双马尾(左) +TwintailRight +双马尾(右) +ArmRight +右臂 +ArmLeft +左臂 +ShoulderRight +右肩 +ShoulderLeft +左肩 +ForeArmRight +右前臂 +ForeArmLeft +左前臂 +HandRight +手(右) +HandLeft +手(左) +### ForeHandRight + +### ForeHandLeft + +LegLeft +腿(左) +### FootRightKneel + +### FootLeftHogtie + +LegRight +右腿 +### Butt + +Eyes2 +眼睛2 +Whites +眼白 +Whites2 +眼白2 +HumanEyes +人眼 +Brows +眉毛 +Brows2 +眉毛2 +KjusEyes +Kjus眼 +KjusBrows +Kjus眉 +KjusMouth +Kjus嘴 +KjusBlush +Kjus腮红 +Hikimayu +黛眉 +DaskEyes +Dask眼 +ElfEars +精灵耳 +ElfFront +精灵耳(前) +ElfBack +精灵耳(后) +ElfEarsLong +精灵长耳 +ElfLongFront +精灵长耳(前) +ElfLongBack +精灵长耳(后) +ElfEarsFloppy +精灵垂耳 +ElfFloppyFront +精灵垂耳(前) +ElfFloppyBack +精灵垂耳(后) +ElfEarrings +精灵耳环 +ElfEarringsFront +精灵耳环(前) +ElfEarringsBack +精灵耳环(后) +Earrings +耳环 +EarringsBack +耳环(后) +BunnyEars +兔耳 +EarsInner +耳内 +KittyEars +猫耳 +Kitty +猫 +KittyInner +猫(内) +WolfEars +狼耳 +Wolf +狼 +WolfInner +狼(内) +FoxEars +狐耳 +Fox +狐 +FoxInner +狐(内) +WolfTail +狼尾 +KittyTail +猫尾 +Kitty2Tail +猫尾2 +Kitty2 +猫2 +FoxTail +狐尾 +Fox2Tail +狐尾2 +Fox2 +狐2 +Fox3Tail +狐尾3 +Fox3 +狐3 +Fox4Tail +狐尾4 +Fox4 +狐4 +Fox5Tail +狐尾5 +Fox5 +狐5 +Fox6Tail +狐尾6 +Fox6 +狐6 +Fox7Tail +狐尾7 +Fox7 +狐7 +CatsuitLower +紧身连衣裤 +TorsoLower +下体 +FootRight +右脚 +FootLeft +左脚 +CatsuitUpper +紧身连衣裤上衣 +TorsoUpper +上体 +TransparentCatsuit +透明紧身连衣裤 +ShortsLeft +短裤(左) +BanditPouch +强盗腿环 +Pouch +袋子 +BanditKnee +强盗膝盖 +Knee +膝盖 +BanditChoker +盗贼项圈 +Choker +项圈 +Stripe +条纹 +SkirtOver +裙摆 +StripeOver +条纹围裙 +StockingLeft +袜子(左) +FootSockLeftHogtie +袜子(左)(驷马) +StripeSockLeft +条纹袜子(左) +StockingRight +袜子(右) +FootSockRightKneel +袜子(右)(跪姿) +StripeSockRight +条纹袜子(右) +Stockings +丝袜 +BlouseLeft +衬衫(左) +BlouseRight +衬衫(右) +SkirtRuffleOver +裙子褶边 +LeatherGloveLeft +皮手套(左) +GloveLeft +手套(左) +### ForeGloveLeft + +### RimGloveLeft + +### RimForeGloveLeft + +BandGloveLeft +绑带手套(左) +### BandForeGloveLeft + +LeatherGloveRight +皮手套(右) +GloveRight +手套(右) +### ForeGloveRight + +### RimGloveRight + +### RimForeGloveRight + +BandGloveRight +绑带手套(右) +### BandForeGloveRight + +LeatherGloves +皮手套 +RibbonFarBack +后背丝带(远) +KiguMask +kigurumi面具 +Mask +面具 +Lock +锁 +EyesWhites +眼白 +Swimsuit +学院泳衣 +SwimsuitChest +学院泳衣胸 +StrappyBra +系带文胸 +ChestStrappy +胸带 +VBikini +V比基尼 +StrappyBikini +系带比基尼 +StrappyLower +背带裤 +StrappyHarness +系带 +Strappy +带 +StrappySwimsuit +系带泳衣 +BunnySockLeft +兔女郎袜子左 +BunnySockRight +兔女郎袜子右 +BunnySocks +兔女郎丝袜 +BunnySocksRestraint +兔子束缚袜子 +BunnyGloveLeft +兔女郎手套(左) +BunnyGloveRight +兔女郎手套(右) +BunnyGloves +兔女郎手套 +BunnyGlovesRestraint +兔子束缚手套 +BunnyLeotard +兔女郎紧身衣 +Leotard +紧身衣 +LeotardChest +紧身胸衣 +LaceCorset +蕾丝束胸 +### LaceCorsetHardware + +### LaceCorsetStripes + +### LaceCorsetCrystal + +LaceBra +蕾丝胸罩 +### LaceChest + +### LaceChestCups + +### LaceChestStripes + +LaceBustier +蕾丝胸罩 +LaceDeco +蕾丝装饰 +### LaceChestDeco + +### LaceChestDecoCrystal + +### LaceChestDecoHardware + +LaceBraDeco +蕾丝胸罩装饰 +### LaceCorsetRestraint + +### LaceBustierRestraint + +### LaceBraDecoRestraint + +### BowCorsetBow + +### BowCorsetBust + +### BowCorsetBustRuffle + +### BowCorsetBustBow + +BowCorset +蝴蝶结束胸 +### BowCorsetRuffle + +### BowCorsetLong + +### BowCorsetLongRuffle + +### BowCorsetOverbust + +### BowCorsetLongOverbust + +### BowCorsetOverbustBow + +### BowCorsetLongOverbustBow + +### BowCorsetRestraint + +### BowCorsetBowRestraint + +### BowCorsetOverbustRestraint + +### BowCorsetOverbustBowRestraint + +### BowCorsetLongOverbustRestraint + +### BowCorsetLongOverbustBowRestraint + +LatexCorset +乳胶束胸 +### HeavyCorset + +LatexBra +乳胶文胸 +ChestHeavyCorset +厚重乳胶束胸 +LatexBraStraps +乳胶束胸带 +### StrapsHeavyCorset + +### LatexBraStrapsCross + +### CrossHeavyCorset + +LatexBustier +乳胶紧身胸衣 +LatexCorsetFull +全乳胶紧身衣 +LatexCorsetStrap +乳胶紧身束带 +LatexCorsetFullStrap +乳胶紧身全束带 +### LatexCorsetCross + +### LatexCorsetFullCross + +LatexCorsetRestraint +乳胶束缚紧身衣 +LatexBustierRestraint +乳胶束缚胸衣 +LatexCorsetFullRestraint +全身乳胶束缚紧身衣 +LatexCorsetStrapRestraint +乳胶绑带束缚紧身衣 +LatexCorsetCrossRestraint +乳胶交叉式紧身胸衣 +LatexCorsetFullStrapRestraint +全身乳胶绑带束缚紧身衣 +LatexCorsetFullCrossRestraint +全身乳胶交叉束缚紧身衣 +LacePanties +蕾丝内裤 +LaceCrotchPanel +蕾丝裆部翼片 +LaceCrotchPanelTrim +蕾丝裆部翼片镶边 +### LaceCrotchPanelLace + +DressSkirt +礼服裙 +BindingDress +束缚连衣裙 +BlouseCollar +衬衫领子 +DressBlouseBust +连衣裙衬衫(胸) +BlouseTorso +衬衫(躯干) +BlouseSkirt +衬衫裙子 +BlouseSkirtOverKneel +衬衫过膝裙 +### BlouseNeck + +### DressBlouseBustCropped + +### CroppedBlouseTorso + +### DressBlouseSleeveLeft + +### BlouseArmLeft + +### BlouseForeArmLeft + +### DressBlouseSleeveRight + +### BlouseArmRight + +### BlouseForeArmRight + +### DressBlouseSleeves + +### DressBlouse + +Glasses +眼镜 +### GlassesLens + +MonocleLeft +单片眼镜(左) +MonocleLensLeft +单片眼镜(左) +MonocleRight +单片眼镜(右) +MonocleLensRight +单片眼镜(右) +DressShoes +礼服鞋 +LeatherMittenLeft +皮革手套(左) +### LeatherLeft + +### BandLeft + +### LockLeft + +LeatherMittenRight +皮革手套(右) +### LeatherRight + +### BandRight + +### LockRight + +LatexMittenLeft +乳胶手套(左) +### LatexLeft + +ZipperLeft +拉链(左) +LatexMittenRight +乳胶手套(右) +### LatexRight + +ZipperRight +拉链(右) +### LeatherPawMittenLeft + +### PawLeft + +### LeatherPawMittenRight + +### PawRight + +LeatherMittens +皮革手套 +### LeatherPawMittens + +LatexMittens +乳胶手套 + + +LongMittenLeft +长手套(左) +### LongLeft + +### LongMittenRight + +### LongRight + +LongMittens +长手套 +ElfPanties +精灵内裤 +ElfTop +精灵上衣 +ElfBra +精灵文胸 +ElfCollar +精灵项圈 +ElfCollarRestraint +精灵束缚项圈 +ElfCirclet +精灵头环 +Circlet +头环 +Gem +宝石 +### ElfSkirtBack + +### SkirtBack + +ElfSkirt +精灵裙 +### SkirtBand + +ElfShoes +精灵鞋 +CrystalShoeLeft +左侧水晶鞋 +CrystalShoeRight +右侧水晶鞋 +### ElfBandLeft + +### ElfBandRight + +### ElfBands + +### SteelYoke + +### Steel + +### SteelBar + +### RopeCrosstie1 + +### ArmStrap + +### Arm1 + +### ForeArm1 + +### RopeBoxtie1 + +### RopeWristtie1 + +### RopeChestStraps1 + +### Arm2 + +### ForeArm2 + +### RopeBoxtie2 + +### RopeWristtie2 + +### RopeChestStraps2 + +### ArmHarness + +### ArmStrapHarness + +### ArmHarnessUp + +### RopeBoxtie3 + +### RopeWristtie3 + +### RopeCuffs + +Cuffs +铐 +### RopeBelt + +### RopeHarness + +Harness +束衣 +### HarnessLower + +### HarnessLowerStrap + +### RopeCrotch + +### Crotchrope + +### CrotchropeStrap + +### RopeToes + +Toe +脚趾 +### RopeFeet + +### RopeFeetHeavy + +### RopeAnkles1 + +### Calf1 + +### RopeAnkles2 + +### Calf2 + +### RopeAnkles3 + +### Calf3 + +### RopeLegs1 + +### Thigh1 + +### RightThigh1 + +### RopeLegs2 + +### Thigh2 + +### RightThigh2 + +### RopeLegs3 + +### Thigh3 + +### RightThigh3 + +### RibbonCrosstie1 + +### RibbonBoxtie1 + +### RibbonWristtie1 + +### RibbonChestStraps1 + +### RibbonBoxtie2 + +### RibbonWristtie2 + +### RibbonChestStraps2 + +### ArmHarnessUnderbust + +### RibbonCuffs + +### RibbonHarness + +### HarnessMid + +### RibbonCrotch + +### Crotch + +### CrotchStrap + +### RibbonToes + +### RibbonFeet + +### RibbonFeetHeavy + +### RibbonAnkles1 + +### RibbonAnkles2 + +### RibbonAnkles3 + +### RibbonLegs1 + +### RibbonLegs2 + +### RibbonLegs3 + +### ShacklesWristLeft + +### ShacklesWristRight + +### ShacklesWrists + +### ShacklesElbowLeft + +### ElbowLeft + +### ShacklesElbowRight + +### ElbowRight + +### ShacklesElbows + +### ShacklesArms + +### ShacklesAnklesLeft + +### AnkleLeft + +### ShacklesAnklesRight + +### AnkleRight + +### ShacklesAnkles + +### ShacklesThighLeft + +### ThighLeft + +### ShacklesThighRight + +### ThighRight + +### ShacklesThigh + +### ThighLink + +### AnkleLink + +### IronCollar + +### SteelCollar + +### SteelCollarRunes + +### IronBelt + +WolfPanties +狼内裤 +WolfCollar +狼女项圈 +### CollarBand + +### WolfCollarTag + +### CollarHardware + +### CollarTag + +### WolfCollarSmall + +### FCollar + +### FCollarBand + +### WolfCollarSmallTag + +### FCollarHardware + +### FCollarTag + +### WolfHarnessUpper + +### HarnessUpper + +### HarnessBandUpper + +### WolfHarnessBelt + +### BeltMid + +### BeltBandMid + +### BeltHardwareMid + +WolfHarnessLower +狼女束衣(下部) +### HarnessHardwareMid + +### HarnessBandLower + +### HarnessHardwareLower + +### WolfHarness + +### WolfCuffsAnklesLeft + +### BandAnkleLeft + +### WolfCuffsAnklesRight + +### BandAnkleRight + +### WolfCuffsAnkles + +### WolfCollarRestraint + +### WolfCollarTagRestraint + +### WolfCollarSmallRestraint + +### WolfCollarSmallTagRestraint + +### WolfPantiesRestraint + +### WolfHarnessLowerRestraint + +### WolfHarnessUpperRestraint + +### WolfHarnessBeltRestraint + +### WolfHarnessRestraint + +### WolfGloveLeft + +### WolfGloveRight + +### WolfGloves + +### WolfSockLeft + +### WolfSockRight + +### WolfSocks + +### WolfSocksRestraint + +### WolfTorsoLower + +### WolfTorsoUpper + +### WolfHeels + +### CuffsWristLeft + +### BandWristLeft + +### HardwareWristLeft + +### CuffsWristRight + +### BandWristRight + +### HardwareWristRight + +### CuffsWrists + +### CuffsElbowLeft + +### BandElbowLeft + +### HardwareElbowLeft + +### CuffsElbowRight + +### BandElbowRight + +### HardwareElbowRight + +### CuffsElbows + +### CuffsArms + +### CuffsAnklesLeft + +### HardwareAnkleLeft + +### CuffsAnklesRight + +### HardwareAnkleRight + +### CuffsAnkles + +### CuffsThighLeft + +### BandThighLeft + +### HardwareThighLeft + +### CuffsThighRight + +### BandThighRight + +### HardwareThighRight + +### CuffsThigh + +### LeatherCollar + +### BandCollar + +### HardwareCollar + +### LeatherCollarBell + +### BellCollar + +### LeatherCollarBow + +### BowBellCollar + +### BowCollar + +### LeatherBelt + +### BandBelt + +### HardwareBelt + +### SlimeMouth + +### FaceMouth + +### SlimeEyes + +### FaceEyes + +### SlimeHead + +### FaceFull + +### SlimeBoots + +### SlimeTorsoLower + +### SlimeThighs + +### SlimeLegs + +### SlimeFeet + +### SlimeArmLeft + +### SlimeArmRight + +### SlimeTorsoUpper + +### SlimeArms + +### SlimeHandLeft + +### SlimeHandRight + +### SlimeHands + +RubberMouth +嘴部橡胶 +RubberEyes +眼部橡胶 +RubberHead +头部橡胶 +RubberBoots +橡胶鞋 +### RubberTorsoLower + +### RubberThighs + +RubberLegs +腿部橡胶 +RubberFeet +脚部橡胶 +RubberArmLeft +左臂橡胶 +RubberArmRight +右臂橡胶 +### RubberTorsoUpper + +### RubberArms + +### RubberHandLeft + +### RubberHandRight + +### RubberHands + +### TapeMedBoots + +### TapeMedAnkles + +### TapeMedLegs + +### RightLegs + +### StrapCover + +### TapeMedBottom + +### TapeMedArms + +### Top + +### TapeFullArms + +### TopFull + +### ChestFull + +### ArmFullLeft + +### ArmFullRight + +### TapeMedHandLeft + +### TapeMedHandRight + +### TapeHeavyBoots + +### TapeHeavyAnkles + +### TapeHeavyLegs + +### TapeHeavyBottom + +### Bottom + +### TapeHeavyBottomFull + +### TapeHeavyArms + +### TapeHeavyArmsFull + +### TapeHeavyHandLeft + +### TapeHeavyHandRight + +### TapeHeavyHands + +### TapeBoots + +### TapeAnkles + +### TapeLegs + +### TapeBottom + +### TapeTorsoUpper + +### TapeArmLeft + +### TapeArmRight + +### TapeArms + +### TapeStrapArms + +### TopStrap + +### ChestStrap + +### ArmStrapLeft + +### ArmStrapRight + +### TapeStrappedArms + +### TapeHandLeft + +### TapeHandRight + +### BraProto + +### BraProtoLining + +### BraProtoLiningMid + +### BraProtoCups + +### BraProtoDisplay + +### BraProtoLock + +BraCyber +赛博文胸 +### BraCyberLining + +### BraCyberDisplay + +### BraCyberLock + +### ChastityBra + +### BraCups + +### BraLining + +### BraChain + +### BraLock + +### HeartBelt + +### BeltLining + +### BeltLock + +### BeltStrap + +### BeltStrapLining + +### CyberBelt + +### CyberLining + +### CyberDisplay + +### CyberPlug + +### CyberLock + +### ProtoBelt + +### Proto + +### ProtoLining + +### ProtoDisplay + +### ProtoPlug + +### ProtoLock + +### SmoothArmbinder + +### BinderLeft + +### BinderRight + +### Armbinder + +### StrapsLeft + +### StrapsRight + +### ArmbinderCross + +### Cross + +### SmoothArmbinderCross + +### ArmbinderSecure + +### SmoothArmbinderSecure + +### ArmbinderGwen + +### Gwen + +### SmoothArmbinderGwen + +### WolfArmbinder + +### JacketArmbinder + +### BeltsArms + +Jacket +拘束衣 +### BeltsChest + +### JacketHeavy + +### BinderTorsoLower + +### BeltsTorsoLower + +### CrotchBelts + +### JacketStraps + +### StrapsArms + +### StrapsChest + +### StrapsUnderbust + +### JacketArmbinderSecure + +### JacketBolero + +### ChestBolero + +### JacketLeotard + +### LatexLower + +### LatexChest + +### LatexUpper + +Legbinder +绑腿 +### LegLegbinder + +### RightLegbinder + +### LegRightLegbinder + +### LacesLegbinder + +### TapeFace + +### ClothBlindfold + +### Cloth + +### BlindfoldBasic + +### Basic + +### BasicRim + +### BlindfoldLeather + +### LeatherBase + +### LeatherRim + +### KittyBlindfold + +KittyEyes +猫眼 +BlindfoldTape +胶带蒙眼 +Tape +胶带 +BalletHeels +芭蕾高跟鞋 +BalletLeft +芭蕾高跟鞋(左) +BalletRight +芭蕾高跟鞋(右) +### BalletSoleLeft + +### BalletSoleRight + +### BalletLaceLeft + +### BalletLaceRight + +FlatBalletHeels +芭蕾平底鞋 +FlatBalletLeft +芭蕾平底鞋(左) +FlatBalletRight +芭蕾平底鞋(右) +ShinyBalletHeels +闪亮芭蕾高跟鞋 +ShinyBalletLeft +闪亮芭蕾高跟鞋(左) +ShinyBalletRight +闪亮芭蕾高跟鞋(右) +BalletHeelsRestraint +芭蕾拘束高跟鞋 +FlatBalletHeelsRestraint +芭蕾束缚平底鞋 +ShinyBalletHeelsRestraint +闪亮芭蕾拘束高跟鞋 +LeatherHeels +皮革高跟鞋 +LeatherLegLeft +皮革(左腿) +LeatherLegRight +皮革(右腿) +TallHeels +高跟鞋 +TallLeft +高跟鞋(左) +TallRight +高跟鞋(右) +### TallLegLeft + +### TallLegRight + +TallHeelsRestraint +束缚高跟鞋 +Legirons +腿铐 +LegironsLeft +腿铐(左) +LegironsRight +腿铐(右) +### Irish8Ankle + +### Irish8AnkleLeft + +### Irish8AnkleRight + +HandCuffs +手铐 +CuffsLock +腕链 +HingedCuffs +铰链铐 +### Irish8Cuffs + +### WolfCuffs + +### WolfCuffsChain + +### HarnessTop + +### BeltsTop + +### HardwareTop + +### BeltsMid + +### HardwareMid + +### HarnessStrap + +### BeltsStrap + +### HardwareStrap + +### BeltsOverbust + +### BeltsUnderbust + +### HardwareUnderbustOver + +### HardwareUnderbust + +### FutureHarnessChest + +### DisplayChest + +### MetalChest + +### FutureHarnessMid + +### StrapsMid + +### DisplayMid + +### MetalMid + +### FutureHarnessLower + +### StrapsLower + +### DisplayLower + +### MetalLower + +### FutureHarness + +### ClothCollar + +### ClothCollarTag + +### ClothBelt + +### ClothBeltLines + +### BeltLines + +### MaidGag + +### FrillyPanel + +### FrillyStraps + +### FrillyHardware + +### FrillyHighlights + +### DusterGag + +### Duster + +### GhostGag + +### Ball + +### Strap + +### BallGag + +### BallGagHarness + +### BallGagHarnessSecure + +### SideStrap + +### LargeBallGag + +### LargeBallGagHarness + +### LargeBallGagHarnessSecure + +### PanelGag + +### Panel + +### PanelGagHarness + +### PanelGagHarnessSecure + +### MuzzleGag + +Muzzle +口套 +### MuzzleGagHarness + +### MuzzleGagHarnessSecure + +### PlugGagPlug + +### PlugMuzzleGag + +### PlugMuzzleGagHarness + +### PlugMuzzleGagHarnessSecure + +### PlugPanelGag + +### PlugPanelGagHarness + +### PlugPanelGagHarnessSecure + +### TapeFull + +### TapeWrap + +### Wrap + +### TapeFullOver + +### TapeWrapOver + +### TapeCleave + +### Cleave + +### ClothCleave + +### ClothCleaveThick + +### CleaveThick + +### ClothKnot + +### Knot + +### ClothOTN + +### OTN + +### ClothOTM + +### OTM + +GagLatex +乳胶口球 +### GagLatexFlat + +### OTNFlat + +### GagLatexFlatHarness + +### GagLatexFlatHarnessSecure + +### GagLatexPlug + +### GagLatexPlugHarness + +### GagLatexPlugHarnessSecure + +### LatexNeckCorset + +### NeckCorset + +### NeckCorsetRim + +### LatexNeckCorsetGag + +### LatexNeckCorsetRestraint + +### LatexNeckCorsetGagRestraint + +### LatexNeckCorsetPlugGag + +### GagMetal + +### GagFabric + +### FabricMuzzle + +### KittyMuzzle + +### KittyMouth + +### Whiskers + +### KittyHarnessPanelGag + +### GagComfy + +### GagMetalRiveted + +### OTNRivets + +### SmoothBallGag + +### SmoothBallGagHarness + +### SmoothBallGagHarnessSecure + +### SmoothLargeBallGag + +### SmoothLargeBallGagHarness + +### SmoothLargeBallGagHarnessSecure + +### SegmentedLargeBallGag + +### SegmentedLargeBallGagHarness + +### SegmentedLargeBallGagHarnessSecure + +### SciFiBallGag + +### TopRim + +### Display + +### EnhancedSciFiBallGag + +### AdvancedSciFiBallGag + +### HarnessRim + +### HarnessDisplay + +### UltimateSciFiBallGag + +### UltimateSciFiBallGag2 + +### SegmentedLargePanelGag + +### SegmentedLargePanelGagHarness + +### SegmentedLargePanelGagHarnessSecure + +### SciFiPanelGag + +### AdvancedSciFiPanelGag + +### UltimateSciFiPanelGag + +### UltimateSciFiPanelGag2 + +### SegmentedPlugGag + +### SegmentedPlugGagHarness + +### SegmentedPlugGagHarnessSecure + +### SciFiPlugGag + +### AdvancedSciFiPlugGag + +### UltimateSciFiPlugGag + +### UltimateSciFiPlugGag2 + +### SimpleSciFiMuzzle + +### AdvancedSciFiMuzzle + +### SciFiPlugMuzzle + +### AdvancedSciFiPlugMuzzle + +### SimpleSciFiMuzzle2 + +### AdvancedSciFiMuzzle2 + +### BeltsArms1 + +### Arms1 + +### LeftArm1 + +### RightArm1 + +### BeltsArms2 + +### Arms2 + +### LeftArm2 + +### RightArm2 + +### BeltsArmsAll + +### BeltsLegs1 + +### Legs1 + +### RightLegs1 + +### BeltsLegs2 + +### Legs2 + +### RightLegs2 + +### BeltsLegsAll + +### BeltsFeet1 + +### Feet1 + +### BeltsFeet2 + +### Feet2 + +### BeltsFeetAll + +### ShadowHandsArms1 + +### ShadowHandsArms2 + +### ShadowHandsArmsAll + +### ShadowHandsLegs1 + +### ShadowHandsLegs2 + +### ShadowHandsLegsAll + +### ShadowHandsFeet + +### ShadowHandsMouth + +### ShadowHandsEyes + +### ShadowHandsCrotch + +### Cage + +### CageFront + +### CageBack + +### SarcoFront + +### SarcoWebs + +### SarcoBack + +### LatexCube + +### LatexCubeBack + +### Barrel + +### DisplayStand + +### DisplayFront + +### OneBarPrison + +### OneBarFront + +### OneBarBack + +### StardustCollar + +### MikoCollar + +### FutureCollar + +### Future + +### FutureBand + +### FutureDisplay + +### FutureRim + +### FutureLock + +### FutureCollarRestraint + +### ShockModule + +### Module + +### ModuleDisplay + +### TrackingModule + +### TrackingModuleDisplay + +Goggles +护目镜 +### GogglesRestraint + +FullVisor +全面罩 +### DollmakerFull + +FullVisorRim +全面罩(边框) +### DollmakerFullRim + +### FullVisorRestraint + +### FullVisorRimRestraint + +GasMask +防毒面具 +### Valves + +### Center + +### Nose + +### Plugs + +### GasMaskRestraint + +Petsuit +宠物服 +### LeftLegs + + + +### Braid_Overstrap + +### BraidBack + +### BackShortMessy + +### BackShortMessyUnderlight + +KjusEyes2 +Kjus眼2 +KjusEyes3 +Kjus眼3 +KjusEyes4 +Kjus眼4 +### CatsuitLowerLowRise + +### TorsoLowerLowRise + +### SleevelessCatsuitUpper + +### SleevelessTorsoUpper + +CatsuitTop +紧身胸衣 +### SleevelessTop + +### SleevelessTopChest + +CatsuitTopV +V型紧身胸衣 +### SleevelessTopV + +### SleevelessTopVChest + +### CatsuitUpperCropped + +### TorsoUpperCrop + +### TransparentCatsuitUpper + +### TransparentCatsuitUpperCropped + +### TransparentCatsuitLower + +### TransparentCatsuitLowerLowRise + +### BunnyLeotardHigh + +### HighLeotard + +### FashionIronCollar + +### FashionIronBelt + +### FashionSteelCollarRunes + +### FashionSteelCollar + +### FashionShacklesWristLeft + +### FashionShacklesWristRight + +### FashionShacklesWrists + +### FashionShacklesElbowLeft + +### FashionShacklesElbowRight + +### FashionShacklesElbows + +### FashionShacklesArms + +### FashionShacklesAnklesLeft + +### FashionShacklesAnklesRight + +### FashionShacklesAnkles + +### FashionShacklesThighLeft + +### FashionShacklesThighRight + +### FashionShacklesThigh + +### FashionThighLink + +### FashionAnkleLink + +### FashionLeatherCollar + +### FashionLeatherBelt + +### FashionLeatherCollarBell + +### FashionLeatherCollarBow + +### FashionCuffsWristLeft + +### FashionCuffsWristRight + +### FashionCuffsWrists + +### FashionCuffsElbowLeft + +### FashionCuffsElbowRight + +### FashionCuffsElbows + +### FashionCuffsArms + +### FashionCuffsAnklesLeft + +### FashionCuffsAnklesRight + +### FashionCuffsAnkles + +### FashionCuffsThighLeft + +### FashionCuffsThighRight + +### FashionCuffsThigh + +LatexTop +乳胶胸衣 +### BraProtoLiningRim + +### BraProtoLiningMidRim + +LatexTopZip +拉链乳胶胸衣 +### BraProtoLiningZip + +### BraProtoLiningMidZip + +### BraProtoLiningZipRim + +### BraProtoLiningMidZipRim + +### FashionGagMetal + +### FashionGagMetalRiveted + +### FashionGagFabric + +### FashionKittyMuzzle + +### FashionSimpleSciFiMuzzle + +### FashionAdvancedSciFiMuzzle2 + +### FashionAdvancedSciFiMuzzle + +### FashionSimpleSciFiMuzzle2 + + + +Hairband2 +发带2 +### BraidCustom + +### BraidCustom_Overstrap + +### BraidCustomBack + +### BraidCustomBraid + +### BackShortCurly + +### BackShortCurlyUnderlight + +AuraHair +Aura发型 +HairAura_Front +Aura发型(前) +### HairAura + +AuraBang_Left +Aura刘海(左) +HairAura_Left +Aura发型(左) +HairAura_LeftB +Aura发型(左B) +AuraBang_Right +Aura刘海(右) +HairAura_Right +Aura发型(右) +HairAura_RightB +Aura发型(右B) +AuraBang_Left_Back +Aura刘海(左后) +AuraBang_Right_Back +Aura刘海(右后) +Hair2 +发型2 +Hair2_Front +发型2(前) +Hair2_FrontB +发型2(前B) +Hair2_FrontC +发型2(前C) +Hair2_LeftPuff +发型2(蓬松左) +Hair2_Left +发型2(左) +Hair2_RightPuff +发型2(蓬松右) +Hair2_Right +发型2(右) +Hair3 +发型3 +Hair3_FrontA +发型3(前A) +Hair3_FrontC +发型3(前C) +Hair3_FrontD +发型3(前D) +Hair3_Short +发型3(短) +### Hair3_Bangs + +### Hair3_FrontE + +### Hair3Back + +### Hair3_Back + +Hair4 +发型4 +### Hair4_Front + +### Hair4_FrontB + +Hair4_TailLeft +发型4(马尾左) +### Hair4_Left + +### Hair4_LeftB + +Hair4_TailRight +发型4(马尾右) +### Hair4_Right + +### Hair4_RightB + +Hair5 +发型5 +### Hair5_Front + +### Hair5_FrontB + +### Hair5_FrontC + +Hair5_Highlight +发型5(高光) +### Hair5_FrontD + +Hair5_TailLeft +发型5(马尾左) +### Hair5_Left + +Hair5_TailRight +发型5(马尾右) +### Hair5_Right + +Hair6 +发型6 +### Hair6_Front + +### Hair6_FrontB + +Hair6_TailLeft +发型6(马尾左) +### Hair6_Left + +Hair6_TailRight +发型6(马尾右) +### Hair6_Right + +### Butt2 + +### EarsFront + +### CatsuitLowerLeotard + +### TorsoLowerLeotard + +### TransparentCatsuitLowerLeotard + +### ChainBikini + +### ChainSkirt2 + +### SkirtBeltDeco + +### SkirtBeltRivets + +### Skirt2 + +### FashionKiguMask + +### SwimsuitUnder + +BunnyLeotardUnder +兔女郎紧身衣(底) +### BunnyLeotardHighUnder + +LeatherLeotardTop +胸衣 +LeatherLeotardBottom +内裤 +LeatherLeotardCorset +束腰 +LeotardCorset +皮革束腰 +Laces +蕾丝 +LeatherLeotard +皮革紧身内衣 +LeatherLeotardStrapsUpper +胸衣系带 +LeatherLeotardStrapsLower +束腰系带 (松) +### StrapsHardware + +LeatherLeotardStrapsLowerClean +束腰系带 (紧) +### StrapsLowerClean + +### OperaGloveLeft + +### OperaGloveRight + +### OperaGloves + +### OperaGlovesRestraint + +SailorCollar +水手领 +### CollarStripe + +### SailorCollarFull + +### Bust + +### BustStripe + +SailorBow +水手结 +SailorTop +水手服(顶) +### SailorSleeveLeft + +### HemLeft + +### SailorSleeveRight + +### HemRight + +SailorSleeves +水手服袖 +SailorShirt +水手服 +Sailor +水手服 +### DressSkirtSplitNoBelt + +### SkirtSplit + +### SkirtSplitOver + +DressSkirtSplit +礼服裙(开叉) +### SkirtSplitBelt + +### BlouseSkirtLone + +Sunglasses +太阳镜 +MageSkirt +法师裙 +### Band + +### MageSkirtOver + +### MageCorset + +### MageCorsetStripes + +MageBra +法师文胸 +MageBraStripes +条纹法师文胸 +MageTop +法师(顶) +### MageCollar + +### MageCollarCrystal + +### MageCollarHardware + +### MageCollar2 + +### MageCollarTie + +Mage +法师 +ChineseDress +旗袍 +### Highlights + +### DressSkirtOverKneel + +ChineseBra +旗袍(胸) +ChineseTop +旗袍(顶) +YukataWaist +浴衣腰围 +### Waist + +### WaistBand + +YukataWaistPattern +浴衣束腰 +WaistPattern +束腰 +YukataTop +浴衣上衣 +YukataSleeveLeft +浴衣袖(左) +YukataSleeveRight +浴衣袖(右) +YukataSleeves +浴衣袖 +YukataShirt +浴衣衬 +YukataSkirt +浴衣裙 +Yukata +浴衣 +YukataPattern +浴衣腰围图案 +### ForeLongMittenLeft + +### ForeLongMittenRight + +FashionLeatherMittens +装饰性皮革手套 +### FashionLeatherPawMittens + +FashionLatexMittens +装饰性乳胶手套 +FashionLongMittens +装饰性长手套 +HeavyYoke +重型枷锁 +### HeavySteel + +### HeavySteelPins + +### HeavySteelLock + +### HeavySteelHardware + +HeavyFiddle +重型提琴 +### FiddleLines + +### FiddleBody + +### FiddleLock + +### BackFiddleLines + +### BackFiddleBody + +### RopeSuspension + +### Suspension + +### FashionRopeHarness + +### FashionRopeCrotch + +### FashionRopeChestStraps2 + +### FashionRibbonHarness + +### FashionRibbonCrotch + +### IronCollarClip + +### FashionIronCollarClip + +### QuakeCollar + +### QuakeCollarRestraint + +### BuckleCorset + +### BuckleCorsetBuckles + +### BuckleCorsetHardware + +### BuckleCorsetRestraint + +### StripedSkirt + +### StripedSkirtUnder + +### StripedSkirtOver + +### StripedSkirtUnderOver + +### ApronSkirt + +### MaidSkirt + +### MaidSkirtOver + +### ApronSkirtOver + +### LegRimLeft + +### LegBandLeft + +### LegPadsLeft + +### LegRimRight + +### LegBandRight + +### LegPadsRight + +### TorsoLowerRim + +### TorsoLowerBand + +### TorsoUpperCups + +### ChestRim + +### ChestBand + +### TorsoUpperBand + +### TorsoUpperRim + +### DivineCuffsWristLeft + +### WristLeftDeco + +### WristLeftLock + +### WristLeftLockPlate + +### WristLeftLockBand + +### DivineCuffsWristRight + +### WristRightDeco + +### WristRightLock + +### WristRightLockPlate + +### WristRightLockBand + +### DivineCuffsWrists + +### DivineCuffsElbowLeft + +### ElbowLeftDeco + +### ElbowLeftLock + +### ElbowLeftLockPlate + +### ElbowLeftLockBand + +### DivineCuffsElbowRight + +### ElbowRightDeco + +### ElbowRightLock + +### ElbowRightLockPlate + +### ElbowRightLockBand + +### DivineCuffsElbows + +### DivineCuffsArms + +### DivineCuffsAnklesLeft + +### AnkleLeftDeco + +### AnkleLeftLock + +### AnkleLeftLockPlate + +### AnkleLeftLockBand + +### DivineCuffsAnklesRight + +### AnkleRightDeco + +### AnkleRightLock + +### AnkleRightLockPlate + +### AnkleRightLockBand + +### DivineCuffsAnkles + +### DivineCuffsThighLeft + +### ThighLeftDeco + +### ThighLeftLock + +### ThighLeftLockPlate + +### ThighLeftLockBand + +### DivineCuffsThighRight + +### ThighRightDeco + +### ThighRightLock + +### ThighRightLockPlate + +### ThighRightLockBand + +### DivineCuffsThigh + +### DivineCollar + +### CollarDeco + +### CollarLock + +### CollarLockPlate + +### CollarLockBand + +### DivineBelt + +### BeltMetal2 + +### BeltMetal1 + +### BeltBase + +### BeltPin + +### LockBeltLines + +### LockBeltPlate + +### LockBeltShackle + +### LockBeltHighlight + +### FashionDivineCollar + +### FashionDivineBelt + +### FashionDivineCuffsWristLeft + +### FashionDivineCuffsWristRight + +### FashionDivineCuffsWrists + +### FashionDivineCuffsElbowLeft + +### FashionDivineCuffsElbowRight + +### FashionDivineCuffsElbows + +### FashionDivineCuffsArms + +### FashionDivineCuffsAnklesLeft + +### FashionDivineCuffsAnklesRight + +### FashionDivineCuffsAnkles + +### FashionDivineCuffsThighLeft + +### FashionDivineCuffsThighRight + +### FashionDivineCuffsThigh + +### DivineCuffsCleanWristLeft + +### WristLeftDecoClean + +### DivineCuffsCleanWristRight + +### WristRightDecoClean + +### DivineCuffsCleanWrists + +### DivineCuffsCleanElbowLeft + +### ElbowLeftDecoClean + +### DivineCuffsCleanElbowRight + +### ElbowRightDecoClean + +### DivineCuffsCleanElbows + +### DivineCuffsCleanArms + +### DivineCuffsCleanAnklesLeft + +### AnkleLeftDecoClean + +### DivineCuffsCleanAnklesRight + +### AnkleRightDecoClean + +### DivineCuffsCleanAnkles + +### DivineCuffsCleanThighLeft + +### ThighLeftDecoClean + +### DivineCuffsCleanThighRight + +### ThighRightDecoClean + +### DivineCuffsCleanThigh + +### DivineCollarClean + +### CollarDecoClean + +### DivineBeltClean + +### BeltDecoClean + +### BeltLockPlate + +### BeltLockBand + +### FashionDivineCollarClean + +### FashionDivineBeltClean + +### FashionDivineCuffsCleanWristLeft + +### FashionDivineCuffsCleanWristRight + +### FashionDivineCuffsCleanWrists + +### FashionDivineCuffsCleanElbowLeft + +### FashionDivineCuffsCleanElbowRight + +### FashionDivineCuffsCleanElbows + +### FashionDivineCuffsCleanArms + +### FashionDivineCuffsCleanAnklesLeft + +### FashionDivineCuffsCleanAnklesRight + +### FashionDivineCuffsCleanAnkles + +### FashionDivineCuffsCleanThighLeft + +### FashionDivineCuffsCleanThighRight + +### FashionDivineCuffsCleanThigh + +### SteelCuffsWristLeft + +### RimWristLeft + +### SteelCuffsWristRight + +### RimWristRight + +### SteelCuffsWrists + +### SteelCuffsElbowLeft + +### RimElbowLeft + +### SteelCuffsElbowRight + +### RimElbowRight + +### SteelCuffsElbows + +### SteelCuffsArms + +### SteelCuffsAnklesLeft + +### RimAnkleLeft + +### SteelCuffsAnklesRight + +### RimAnkleRight + +### SteelCuffsAnkles + +### SteelCuffsThighLeft + +### RimThighLeft + +### SteelCuffsThighRight + +### RimThighRight + +### SteelCuffsThigh + +### NeoSteelCollar + +### RimCollar + +### NeoSteelBelt + +### RimBelt + +### FashionNeoSteelCollar + +### FashionNeoSteelBelt + +### FashionSteelCuffsWristLeft + +### FashionSteelCuffsWristRight + +### FashionSteelCuffsWrists + +### FashionSteelCuffsElbowLeft + +### FashionSteelCuffsElbowRight + +### FashionSteelCuffsElbows + +### FashionSteelCuffsArms + +### FashionSteelCuffsAnklesLeft + +### FashionSteelCuffsAnklesRight + +### FashionSteelCuffsAnkles + +### FashionSteelCuffsThighLeft + +### FashionSteelCuffsThighRight + +### FashionSteelCuffsThigh + +### CyberCuffsWristLeft + +### ScreenWristLeft + +### DisplayWristLeft + +### LockWristLeft + +### CyberCuffsWristRight + +### ScreenWristRight + +### DisplayWristRight + +### LockWristRight + +### CyberCuffsWrists + +### CyberCuffsElbowLeft + +### ScreenElbowLeft + +### DisplayElbowLeft + +### LockElbowLeft + +### CyberCuffsElbowRight + +### ScreenElbowRight + +### DisplayElbowRight + +### LockElbowRight + +### CyberCuffsElbows + +### CyberCuffsArms + +### CyberCuffsAnklesLeft + +### ScreenAnkleLeft + +### DisplayAnkleLeft + +### LockAnkleLeft + +### CyberCuffsAnklesRight + +### ScreenAnkleRight + +### DisplayAnkleRight + +### LockAnkleRight + +### CyberCuffsAnkles + +### CyberCuffsThighLeft + +### ScreenThighLeft + +### DisplayThighLeft + +### LockThighLeft + +### CyberCuffsThighRight + +### ScreenThighRight + +### DisplayThighRight + +### LockThighRight + +### CyberCuffsThigh + +### NeoCyberCollar + +### ScreenCollar + +### DisplayCollar + +### LockCollar + +### CyberLinkCollar + +### LinkCollar + +### ScreenLinkCollar + +### DisplayLinkCollar + +### LockLinkCollar + +### NeoCyberBelt + +### ScreenBelt + +### DisplayBelt + +### LockBelt + +### FashionNeoCyberCollar + +### FashionCyberLinkCollar + +### FashionNeoCyberBelt + +### FashionCyberCuffsWristLeft + +### FashionCyberCuffsWristRight + +### FashionCyberCuffsWrists + +### FashionCyberCuffsElbowLeft + +### FashionCyberCuffsElbowRight + +### FashionCyberCuffsElbows + +### FashionCyberCuffsArms + +### FashionCyberCuffsAnklesLeft + +### FashionCyberCuffsAnklesRight + +### FashionCyberCuffsAnkles + +### FashionCyberCuffsThighLeft + +### FashionCyberCuffsThighRight + +### FashionCyberCuffsThigh + +### CrystalCuffsWristLeft + +### CrystalCuffsWristRight + +### CrystalCuffsWrists + +### CrystalCuffsElbowLeft + +### CrystalCuffsElbowRight + +CrystalCuffsElbows +水晶肘铐 +### CrystalCuffsArms + +### CrystalCuffsAnklesLeft + +### CrystalCuffsAnklesRight + +### CrystalCuffsAnkles + +### CrystalCuffsThighLeft + +### CrystalCuffsThighRight + +CrystalCuffsThigh +水晶腿铐 +CrystalCollar +水晶项圈 +### CrystalBelt + +FashionCrystalCollar +装饰性水晶项圈 +### FashionCrystalBelt + +### FashionCrystalCuffsWristLeft + +### FashionCrystalCuffsWristRight + +### FashionCrystalCuffsWrists + +### FashionCrystalCuffsElbowLeft + +### FashionCrystalCuffsElbowRight + +### FashionCrystalCuffsElbows + +FashionCrystalCuffsArms +装饰性水晶臂铐 +### FashionCrystalCuffsAnklesLeft + +FashionCrystalCuffsAnklesRight +装饰性水晶踝铐(右) +FashionCrystalCuffsAnkles +装饰性水晶踝铐 +FashionCrystalCuffsThighLeft +装饰性水晶腿铐(左) +FashionCrystalCuffsThighRight +装饰性水晶腿铐(右) +FashionCrystalCuffsThigh +装饰性水晶腿铐 +### Hobbleskirt + +### FashionBraProto + +FashionBraCyber +时尚赛博胸罩 +### FashionChastityBra + +### FashionHeartBelt + +### FashionCyberBelt + +### FashionProtoBelt + +### DivineBeltRunic + +### BeltMetalRunic2 + +### BeltMetalRunic1 + +### FashionDivineBeltRunic + +### DivineBra + +### BraLines + +### BraBase1 + +### BraBase2 + +### BraMetal1 + +### BraMetal2 + +### BraPins + +BraStraps +肩带 +### LockBraLines + +### LockBraPlate + +### LockBraShackle + +### LockBraHighlight + +### FashionDivineBra + +### DivineBraRunic + +### BraMetalRunic1 + +### BraMetalRunic2 + +### BraStrapsRunic + +### FashionDivineBraRunic + +### SteelChastityBelt_Padlock + +### BeltPadlock + +### BeltPadlockPin + +### SteelChastityBelt_Radial + +### BeltRadial + +### SteelChastityBelt_Segu + +### BeltSegu + +### FashionSteelChastityBelt_Padlock + +### FashionSteelChastityBelt_Radial + +### FashionSteelChastityBelt_Segu + +### SteelChastityBra_Padlock + +### BraPadlock + +### BraPadlockPin + +### SteelChastityBra_Radial + +### BraRadial + +### SteelChastityBra_Segu + +### BraSegu + +### FashionSteelChastityBra_Padlock + +### FashionSteelChastityBra_Radial + +### FashionSteelChastityBra_Segu + +### JacketLowerStraps + +### JacketExtraStraps + +### StrapsTorsoLowerExtra + +### CrotchBeltExtra + +### StrapsChestExtra + +### JacketHeavyStraps + +### JacketLower + +### JacketExtra + +### JacketHeavyArmbinder + +### JacketExtraArmbinder + +### JacketHeavyBolero + +### JacketExtraBolero + +### JacketHeavyLeotard + +### JacketExtraLeotard + +### RightLacesLegbinder + +### LegLacesLegbinder + +### FashionClothBlindfold + +### FashionBlindfoldBasic + +### FashionBlindfoldLeather + +### FashionKittyBlindfold + +### FashionBlindfoldTape + +### SmoothHeels + +### TallBalletHeels + +### TallBalletHeelsRestraint + +CyberBalletHeels +赛博芭蕾高跟鞋 +### GlowBalletLeft + +### GlowBalletRight + +### CyberBalletHeelsRestraint + +### FashionHarnessTop + +### FashionHarnessMid + +### FashionHarnessStrap + +### FashionHarness + +### LockChest + +### LockMid + +### LockLower + +### FashionFutureHarnessLower + +### FashionFutureHarnessMid + +### FashionFutureHarnessChest + +### FashionFutureHarness + +### ClothTop + +### TopChest + +### TopShoulders + +### ClothBra + +### ClothTopBand + +### TopBandChest + +### TopBandRimChest + +### TopBand + +### TopBandRim + +### ClothBraBand + +NinjaSkirt +忍者短裙 +### SkirtBandOver + +NinjaSockLeft +忍者短袜 (左) +NinjaSockRight +忍者短袜 (右) +NinjaThighLeft +忍者长袜 (左) +NinjaThighRight +忍者长袜 (右) +NinjaKneeLeft +忍者护膝 (左) +KneeLeft +忍者护膝 (左) +NinjaKneeRight +忍者护膝 (右) +KneeRight +忍者护膝 (右) +NinjaSocks +忍者袜 +NinjaThighs +忍者长袜 +NinjaKnees +忍者护膝 +NinjaShoes +忍者鞋 +Ninja +忍者 +### FashionMaidGag + +### FashionDusterGag + +### FashionBallGag + +### FashionBallGagHarness + +### FashionBallGagHarnessSecure + +### FashionPanelGag + +### FashionPanelGagHarness + +### FashionPanelGagHarnessSecure + +### FashionMuzzleGag + +### FashionMuzzleGagHarness + +### FashionMuzzleGagHarnessSecure + +### FashionPlugMuzzleGag + +### FashionPlugMuzzleGagHarness + +### FashionPlugMuzzleGagHarnessSecure + +### FashionPlugPanelGag + +### FashionPlugPanelGagHarness + +### FashionPlugPanelGagHarnessSecure + +### FashionTapeCleave + +### FashionClothKnot + +### FashionClothCleaveThick + +### FashionClothCleave + +### FashionClothOTN + +### FashionClothOTM + +### GagLatexMute + +### MuteLogo + +### GagLatexMuteHarness + +### GagLatexMuteHarnessSecure + +### FashionGagLatex + +### FashionGagLatexFlat + +### FashionGagLatexFlatHarness + +### FashionGagLatexFlatHarnessSecure + +### FashionGagLatexMute + +### FashionGagLatexMuteHarness + +### FashionGagLatexMuteHarnessSecure + +### FashionGagLatexPlug + +### FashionGagLatexPlugHarness + +### FashionGagLatexPlugHarnessSecure + +### FashionLatexNeckCorsetPlugGag + +### FashionKittyHarnessPanelGag + +### FashionSmoothBallGag + +### FashionSegmentedLargePanelGag + +### FashionSegmentedLargePanelGagHarness + +### FashionSciFiPanelGag + +### FashionAdvancedSciFiPanelGag + +### FashionUltimateSciFiPanelGag + +### FashionUltimateSciFiPanelGag2 + +### FashionSegmentedPlugGag + +### FashionSciFiPlugMuzzle + +### FashionAdvancedSciFiPlugMuzzle + +### DivineGag + +### Teeth + +### Metallic + +### FashionDivineGag + +### DivineGagClean + +### GoldClean + +### FashionDivineGagClean + +### DivineMuzzle + +### MuzzleRim + +### MuzzleGold + +### MuzzleHarness + +### MuzzleCollar + +### FashionDivineMuzzle + +### DivineMuzzleClean + +### MuzzleGoldClean + +### FashionDivineMuzzleClean + +### FutureBox + +### Rim + +### Door + +### DoorWindow + +### DoorNumeral + +### BackFade + +### CrystalEncase + +### EncaseOver + +### EncaseUnder + +### FashionLeash + +### ArmsBelts + +### LegsBelts + +### LeftLegsBelts + +### ElitePetsuit + +### ArmsLaces + +### ArmsHardware + +### LegsLaces + +### LegsHardware + +### LeftLegsLaces + +### LeftLegsHardware + +CyberPetsuit +赛博宠物制服 +### DisplayArms + +### DisplayLegs + +### DisplayLeftLegs + +NippleClamps +乳头穿孔 +### Clamps + +### ClampsBullet + +### NippleClampsRestraint + +RingVibes +乳环 +### Rings + +### RingsBullet + +### RingVibesRestraint + +NippleWeights +乳头砝码 +Weights +砝码 +### NippleWeightsRestraint + +VibePiercings +震动穿孔 +### VibePiercingsBullet + +### VibePiercingsRestraint + +### PostureCollarBasic + +### PostureCollar + +### PostureCollarRim + +### PostureCollarLoop + +### PostureCollarHardware + +### FashionPostureCollarBasic + +### FashionPostureCollar + +### ReverseBinder + +### ReverseBinderLeft + +### ReverseBinderRight + +### ReverseBinderStraps + +### ReverseBinderHardware + +NightWhip +夜之鞭 +### NightWhipLight + +LatexWhip +乳胶鞭 +KittyLatexEar +胶猫耳 +### KittyLatexEarLight + +### KittyLatexEarMuff + +### KittyLatexEarMuffLight2 + +### KittyLatexEarMuffLight1 + +KittyLatexTail +胶猫尾 +KittyLatexTailLight +猫尾(乳胶) +KittyLatexTail2 +胶猫尾2 +### KittyLatexTail2Light + +KittyLatex +胶猫 +SuccubusWing +魅魔之翼 +### SuccubusWingBase + +### SuccubusWingBack + +### SuccubusWingLight + +SuccubusHorn +魅魔之角 +### SuccubusHornRight + +### SuccubusHornLeft + +SuccubusHornLight +魅魔角反光 +SuccubusTail +魅魔之尾 +SuccubusTailLight +魅魔尾巴反光 +SuccubusClaws +魅魔之手 +SuccubusClawLeft +左魅魔爪 +SuccubusClawRight +右魅魔爪 +SuccubusFeet +魅魔之足 +Succubus +魅魔 +SlimeBubble +粘液泡泡 +BubbleSquishy +粘泡泡 +BubbleSquishyBack +粘泡泡背部 +LatexSphere +乳胶球 +LatexSphereCutaway +乳胶球切面 +LatexSphereCutawayBack +乳胶球切面背 +BallSuit +球服 +BubbleHead +泡泡头 +FashionBubbleHead +装饰性泡泡(头) +BubbleArms +泡泡胳膊 +BubbleLegs +泡泡腿 +FashionBubbleLegs +装饰性泡泡(腿) + + +### Hair5_FrontE + +BlankEyes +无瞳孔 +DaiBrows1 +眉毛1 +DaiBrows2 +眉毛2 +### Glabella + +### Ridge + +### BraRim + +### InnerLines + +### BraUnder + +### BraUnderRim + +BraStriped +条纹 +### Stripes + +BraCherry +樱花 +### Cherry + +BraRose +玫瑰 +### Rose + +BraInvertedRose +反色玫瑰 +### InvertedRose + +### Straps + +### Base + +### Lines + +### PantiesBow + +### PantiesStriped + +### PantiesInvertedRose + +### PantiesCherry + +### PantiesBowStriped + +### PantiesHigh + +### PantiesHighStriped + +SwimsuitRestraint +泳衣拘束 +### BlouseShoulderRight + +### SlayerCollar + +### CapeCollar + +### CapeCollarButton + +### CapeCollarRim + +### SlayerCape + +CapeCollarInner +斗篷领内衬 +CapeStripe +斗篷条纹 +CapeShoulderLeft +斗篷左肩 +CapeShoulderRight +斗篷右肩 +CapeShoulderLeftButton +斗篷左肩扣 +CapeShoulderRightButton +斗篷右肩扣 +CapeBack +斗篷背 +LeatherMask +皮革面罩 +Hood +头套 +Gag +口塞 +FashionLeatherMask +装饰性皮革面具 +LeatherHood +皮革帽 +FashionLeatherHood +装饰性皮革头套 +CyberLongMittenLeft +赛博左长手套 +### CapForeLongMittenLeft + +### CapLongMittenLeft + +### CuffForeLongMittenLeft + +### CuffLongMittenLeft + +### DisplayForeLongMittenLeft + +### DisplayLongMittenLeft + +### LockForeLongMittenLeft + +LockLongMittenLeft +上锁的长束手套(左侧) +### GlowForeLongMittenLeft + +### GlowLongMittenLeft + +### StrapsForeLongMittenLeft + +### StrapsLongMittenLeft + +### UpperCuffLongMittenLeft + +### UpperDisplayLongMittenLeft + +### UpperLockLongMittenLeft + +### UpperGlowLongMittenLeft + +### CyberLongMittenRight + +### CapForeLongMittenRight + +### CapLongMittenRight + +### CuffForeLongMittenRight + +### CuffLongMittenRight + +### DisplayForeLongMittenRight + +### DisplayLongMittenRight + +### LockForeLongMittenRight + +### LockLongMittenRight + +### GlowForeLongMittenRight + +### GlowLongMittenRight + +### StrapsForeLongMittenRight + +### StrapsLongMittenRight + +### UpperCuffLongMittenRight + +### UpperDisplayLongMittenRight + +### UpperLockLongMittenRight + +### UpperGlowLongMittenRight + +CyberLongMittens +赛博长手套 +CyberMittenLeft +赛博手套左 +MittenLeft +手套(左) +### ForeMittenLeft + +CyberMittenRight +赛博右手套 +### MittenRight + +### ForeMittenRight + +CyberMittens +赛博束手套 +### CyberArmLeft + +### ArmLongMittenLeft + +CyberArmRight +赛博右臂 +### ArmLongMittenRight + +### UpperCuffForeLongMittenRight + +CyberArms +赛博臂 +FashionCyberLongMittens +装饰性赛博长手套 +FashionCyberMittens +时尚赛博手套 +CyberThighLink +赛博腿部连接 +### GlowThighLink + +CyberAnkleLink +赛博脚踝绑带 +### GlowAnkleLink + +FashionCyberThighLink +时尚赛博腿部绑带 +FashionCyberAnkleLink +时尚赛博脚踝绑带 +CyberPanties +赛博内裤 +CyberPantiesLining +赛博内裤 +### TallSmoothHeels + +### TallSmoothHeelsRestraint + +### NeckCorset2 + +### NeckCorsetRim2 + +### ShinyLatexMuzzle + +### NeckCorsetGag2 + +### NeckCorsetGagRim2 + +### NeckCorsetGag + +### ShinyLatexMuzzleRestraint + +### NeckCorsetRestraint + +### NeckCorsetGagRestraint + +LatexPetsuit +乳胶宠物衣 +LatexPetsuitGlow +发光乳胶宠物衣 +GlowArms +发光臂 +GlowTorso +发光躯干 +GlowLegs +发光腿 +GlowLeftLegs +发光左腿 +### MiniCape + +### Epaulettes + +TheRobeOfChastity +贞操长袍 +### ChestBase + +### Frill + +### ChestFrill + +### ChestGold + +### Plate + +### ChestPlate + +### GoldBase + +### ChestGoldBase + +### Fabric + +### ChestFabric + +### TheRobeOfChastityRestraint + +### Spats + +### GothicSkirt + +### WaistbandClips + +Buttons +按钮 +### HemLower + +### HemLowerBack + +### HemUpper + +### GothicSkirtLace + +### LaceLower + +### LaceUpper + +### LightMaidKnight_Dress + +### DressChest + +DressDeco +连衣裙装饰 +DressDecoBack +连衣裙后背装饰 +LightMaidKnight_Bra +轻装女仆骑士_胸罩 +LightMaidKnight_Top +轻装女仆骑士_上衣 +LightMaidKnight_SleeveLeft +轻装女仆骑士_左袖 +LightMaidKnight_SleeveRight +轻装女仆骑士_右袖 +LightMaidKnight_Sleeves +轻装女仆骑士_袖子 + + +LightMaidKnightHairband +轻装女仆骑士头部绑带 +Headband +头部绑带 +HeadbandFrill +褶边头部绑带 +HeadbandRibbon +丝带头部绑带 +FootBootLeftHogtie +左长筒靴捆绑 +FootShoeLeftHogtie +左鞋捆绑 +GagNecklace +堵嘴项圈 +GagNecklaceBall +口球项圈 +FashionGagNecklace +装饰性口球项圈 +BondageBed +束缚床 +BedStraps +床陷阱 +BedStrapsHogtie +束缚床陷阱 +LightMaidKnight_Apron +轻装女仆骑士_围裙 +ApronChest +胸围裙 +ApronBack +围裙后背 +LightMaidKnight_Flower +轻装女仆骑士_花 +Flower +花 +LightMaidKnight_SockRight +轻装女仆骑士_右袜子 +LightMaidKnight_SockLeft +轻装女仆骑士_左袜子 +LightMaidKnight_Socks +轻装女仆骑士_袜子 +LightMaidKnight_GloveLeft +轻装女仆骑士_左手套 +LightMaidKnight_GloveRight +轻装女仆骑士_右手套 +LightMaidKnight_Gloves +轻装女仆骑士_手套 +LightMaidKnight_GuardLeft +轻装女仆骑士_左防护 +GuardLeft +左防护 +GuardCuffLeft +左袖口防护 +GuardCuff2Left +左袖口防护2 +LightMaidKnight_GuardRight +轻装女仆骑士_右防护 +GuardRight +右防护 +GuardCuffRight +右袖口防护 +GuardCuff2Right +右袖口防护2 +LightMaidKnight_Guards +轻装女仆骑士_防护 +LightMaidKnight_Boots +轻装女仆骑士_靴子 +LightMaidKnight_Pauldron +轻装女仆骑士_肩甲 +PauldronLeft +左肩甲 +PauldronStrap +肩甲带 +LightMaidKnight +轻装女仆骑士 + + +HeavyMaidKnightHairband +重装女仆骑士头绑带 +HeadbandRibbonBack +头部丝带后背 +FlowerLeaves +花叶 +HeavyMaidKnight_Dress +重装女仆骑士_裙子 +DressSkirtHem +连衣裙边 +DressSkirtStripe +连衣裙条纹 +HeavyMaidKnight_SleeveLeft +重装女仆骑士_左袖 +SleeveLeftStripe +左袖条纹 +HeavyMaidKnight_SleeveRight +重装女仆骑士_右袖子 +SleeveRightStripe +右袖条纹 +HeavyMaidKnight_ChestArmor +重装女仆骑士_胸甲 +ChestArmor +胸甲 +HeavyMaidKnight_GloveLeft +重装女仆骑士_左手套 +HeavyMaidKnight_GloveRight +重装女仆骑士_右手套 +HeavyMaidKnight_Gloves +重装女仆骑士_手套 +HeavyMaidKnight_GauntletLeft +重装女仆骑士_左金属手套 +HeavyMaidKnight_GauntletRight +重装女仆骑士_右金属手套 +HeavyMaidKnight_Gauntlets +重装女仆骑士_金属手套 +HeavyMaidKnight_PauldronLeft +重装女仆骑士_左肩甲 +PauldronLeftStraps +左肩甲带 +PauldronLeftHardware +左肩甲硬件 +HeavyMaidKnight_PauldronRight +重装女仆骑士_右肩甲 +PauldronRight +右肩甲 +PauldronRightStraps +右肩甲带 +HeavyMaidKnight_Pauldrons +重装女仆骑士_肩甲 +HeavyMaidKnight_SideArmor +重装女仆骑士_侧甲 +SideArmor +侧边护甲 +HeavyMaidKnight_Corset +重装女仆骑士_紧身内衣 +HeavyMaidKnight_CorsetRestraint +重装女仆骑士_紧身内衣拘束 +HeavyMaidKnight_Sleeves +重装女仆骑士_袖子 +HeavyMaidKnight_ApronBottom +重装女仆骑士_围裙底 +ApronBelt +围裙带 +ApronMiniBow +围裙迷你蝴蝶结 +ApronCross +围裙十字章 +ApronStripe +围裙条纹 +ApronPattern +围裙图案 +HeavyMaidKnight_ApronTop +重装女仆骑士_围裙顶 +ApronChestRuffles +围裙胸褶 +ApronChestBelts +围裙胸带 +HeavyMaidKnight_Apron +重装女仆骑士_围裙 +HeavyMaidKnight_WaistBelts +重装女仆骑士_腰带 +BeltsHardware +设备腰带 +HeavyMaidKnight_WaistPouches +重装女仆骑士_腰包 +Pouches +荷包 +HeavyMaidKnight_Waist +重装女仆骑士_腰 +HeavyMaidKnight_Boots +重装女仆骑士_靴子 +BootLegLeft +左靴腿 +BootLegRight +右靴腿 +HeavyMaidKnight_PantyhoseShorts +重装女仆骑士_连裤袜 +Pantyhose +连裤袜 +HeavyMaidKnight_SockRight +重装女仆骑士_右袜 +HeavyMaidKnight_SockLeft +重装女仆骑士_左袜 +HeavyMaidKnight +重装女仆骑士 + + +### BlondeFront + +### BlondeBangs + +### BlondeBack + +### FangMouth_Double + +### HoodCollar + +### BigBallTeethFang + +### MilitaryJacket_Sleeveless + +### MilitaryUniform_SleeveLeft + +### MilitaryUniform_SleeveRight + +### MilitaryUniform_Sleeves + +### MilitaryJacket + +### WhiteGloveLeft + +### WhiteGloveRight + +### WhiteGloves + +### UniformShirt_Sleeveless + +### UniformShirt_SleeveLeft + +### UniformShirt_SleeveRight + +### UniformShirt_Sleeves + +### UniformShirt + +### MilitaryUniform_Hat + +### Hat + +### HatRim + +### HatCap + +### HatGloriousInsignia + +### HatGloriousInsigniaHS + +### MilitaryUniform_Earphones + +### Headgear + +### HeadgearUnit + +### HeadgearEars + +### HeadgearEarsInner + +### HeadgearBack + +### MilitaryUniform_Searchlight + +### SearchlightPouch + +### Searchlight + +### SearchlightBase + +### SearchlightLens + +### MilitaryUniform_BeltPouch + +### BeltPouch + +### BeltPouchRim + +### MilitaryUniform_Webbing + +### Webbing + +### WebbingSide + +### WebbingHardware + +### WebbingName + +### WebbingUnderbust + +### WebbingUnderbustHardware + +### MilitaryUniform_Skirt + +### MilitaryUniform_Shoes + +### MilitaryUniform_TightsShorts + +### MilitaryUniform_SockLeft + +### MilitaryUniform_SockRight + +### Tights + +### MilitaryUniform_Hairpin + +### Hairpin + +### MilitaryUniform + +### ShirtSleeveLeft + +### ShirtForeArmLeft + +### ShirtSleeveRight + +### ShirtForeArmRight + +### ShirtShoulderRight + +### ShirtDress + +### ShirtDressChest + +### RubyNecklace + +### RubyChain + +### RubyRing + +### RubyGem + +### RubyNecklaceRestraint + +### SigilNecklace + +### SigilChain + +### SigilDisc + +### SigilNecklaceRestraint + +### MetalNecklace + +### MetalChain + +### MetalDisc + +### MetalNecklaceRestraint + +### NecklaceCharm + +### DragonNecklaceRestraint + +### BallTeeth + +### CrystalBallGag + +### CrystalBallGagSmooth + +### GagMetalRivetedStrap + +### OTNStrap + +### OTNStrapRivets + +### FashionGagMetalRivetedStrap + +### CrystalGagNecklace + +### CrystalGagNecklaceBall + +### FashionCrystalGagNecklace + +### LeashCollar + +### LeashCollarHardware + +### BootShoeLeft + +### BootShoeRight + +### Fear + +### RubyHardware + +### KiguMaskSmile + +### MouthSmile + +### FashionKiguMaskSmile + +### OneBarTop + +### OneBarPrisonLatex + + + +### FangMouth + +### FanglessMouth + +### SantaHat + +### HatBack + +### Fluff + +### Orb + +### FestiveArmbinder + +### BinderStrapLeft + +### BinderFluffLeft + +### FestiveHarnessTop + +### StrapTop + +### ButtonsTop + +### FuzzTop + +### FestiveHarnessMid + +### StrapMid + +### ButtonsMid + +### FuzzMid + +### FestiveHarnessStrap + +### StrapBot + +### ButtonsBot + +### FuzzBot + +### FestiveHarness + +### StrapOverbust + +### StrapUnderbust + +### ButtonsUnderbustOver + +### ButtonsUnderbust + +### FuzzUnderbustOver + +### FuzzUnderbust + +### FashionFestiveHarnessTop + +### FashionFestiveHarnessMid + +### FashionFestiveHarnessStrap + +### FashionFestiveHarness + +### FrillyHeadband + +### HeadbandBand + +### HeadbandBow + +### BowHeadband + +### BowHeadbandFrill + +### BackHime + +### HimeBack + +### BackShort + +### BackFlat + +### Bob + +### BobFront + +### FrontStraight2 + +### FrontStraight2_Front + +### FrontStraight2_Overstrap + +### FrontSwept + +### FrontSweptSide + +### Vents + +### VentL + +### VentR + +### VentsInnerR + +### VentsInnerL + +### VentsFront + +### BigBraidBack + +### CurlyPonytail + +### DrillLeft + +### DrillRight + +### Twindrills + +### Twintails + +### PointyAhoge + +### RoundHat + +### HatTop + +### TopHatSmall + +### TopHatSmallBow + +### BlondeFrontM + +### BlondeBangsM + +### BlondeBackM + +### Mascara + +### MascaraL + +### MascaraR + +### Scar + +### PointyAntennae + +### AnthenaL + +### AnthenaR + +### PointyHorns + +### HornL + +### HornR + +### PointyTail + +### Tail + +### WolfEars2 + +### EarLeft + +### EarRight + +### HairclipDual + +### HairclipLower + +### HairclipUpper + +### ChainPanties + +### PantiesChain + +### ChainPanties2 + +### KittyPetCuffsWristLeft + +### KittyPetCuffsWristRight + +### KittyPetCuffsWrists + +### KittyPetCuffsElbowLeft + +### KittyPetCuffsElbowRight + +### KittyPetCuffsElbows + +### KittyPetCuffsArms + +### KittyPetCuffsAnklesLeft + +### KittyPetCuffsAnklesRight + +### KittyPetCuffsAnkles + +### KittyPetCuffsThighLeft + +### KittyPetCuffsThighRight + +### KittyPetCuffsThigh + +### KittyPetCuffsCollar + +### FashionKittyPetCuffsCollar + +### FashionKittyPetCuffsWristLeft + +### FashionKittyPetCuffsWristRight + +### FashionKittyPetCuffsWrists + +### FashionKittyPetCuffsElbowLeft + +### FashionKittyPetCuffsElbowRight + +### FashionKittyPetCuffsElbows + +### FashionKittyPetCuffsArms + +### FashionKittyPetCuffsAnklesLeft + +### FashionKittyPetCuffsAnklesRight + +### FashionKittyPetCuffsAnkles + +### FashionKittyPetCuffsThighLeft + +### FashionKittyPetCuffsThighRight + +### FashionKittyPetCuffsThigh + +### KittyPawCuffsWristLeft + +### KittyPawCuffsWristRight + +### KittyPawCuffsWrists + +### KittyPawCuffsElbowLeft + +### KittyPawCuffsElbowRight + +### KittyPawCuffsElbows + +### KittyPawCuffsArms + +### KittyPawCuffsAnklesLeft + +### KittyPawCuffsAnklesRight + +### KittyPawCuffsAnkles + +### KittyPawCuffsThighLeft + +### KittyPawCuffsThighRight + +### KittyPawCuffsThigh + +### FashionKittyPawCuffsWristLeft + +### FashionKittyPawCuffsWristRight + +### FashionKittyPawCuffsWrists + +### FashionKittyPawCuffsElbowLeft + +### FashionKittyPawCuffsElbowRight + +### FashionKittyPawCuffsElbows + +### FashionKittyPawCuffsArms + +### FashionKittyPawCuffsAnklesLeft + +### FashionKittyPawCuffsAnklesRight + +### FashionKittyPawCuffsAnkles + +### FashionKittyPawCuffsThighLeft + +### FashionKittyPawCuffsThighRight + +### FashionKittyPawCuffsThigh + +### KittyPetLeotardUnder + +### LeotardStripes + +### LeotardChestStripes + +### KittyPetLeotard + +### KittyPetLeotardRestraint + +### KittyPetUniformCollar + +### LeotardChestCollar + +### LeotardChestCollarLeft + +### LeotardChestCollarStripes + +### LeotardChestCollarStripesLeft + +### CollarDecoSymbol + +### ShoulderCuffLeft + +### ShoulderCuffStripeLeft + +### ShoulderCuffRight + +### ShoulderCuffStripeRight + +### KittyPetTail + +### TailStripe + +### KittyPetBlindfold + +### BlindfoldRim + +### BlindfoldBrow + +### FashionKittyPetBlindfold + +### KittyPetSteelCollar + +### FashionKittyPetSteelCollar + +### KittyPetMittenLeft + +### GloveLeftPaw + +### ForeGloveLeftPaw + +### KittyPetMittenRight + +### GloveRightPaw + +### ForeGloveRightPaw + +### KittyPetMittens + +### FashionKittyPetMittenLeft + +### FashionKittyPetMittenRight + +### FashionKittyPetMittens + +### KittyPetEars1 + +### Ears1L + +### Ears1R + +### Ears1InnerL + +### Ears1InnerR + +### KittyPetEars2 + +### Ears2L + +### Ears2R + +### Ears2InnerL + +### Ears2InnerR + +### KittyPetEarmuffs + +### EarmuffersL + +### EarmuffersR + +### KittyPetEarmuffsRestraint + +### KittyPetEars1Restraint + +### KittyPetEars2Restraint + +### KittyPetGag + +### GagCollar + +### KittyPetGagSeamless + +### GagSeamless + +### KittyPetGagMouth + +### GagMouth + +### KittyPetGagMouthSeamless + +### GagMouthSeamless + +### FashionKittyPetGag + +### FashionKittyPetGagSeamless + +### FashionKittyPetGagMouth + +### FashionKittyPetGagMouthSeamless + +### KittyPetsuit + +### ArmsPaws + +### LeftLegsPaws + +### FootLeftHogtiePaws + +### KittyPetSockLeft + +### SockLeftPaws + +### KittyPetSockRight + +### KittyPetSocks + +### KittyPetSocksRestraint + +### KittyPetPawLeft + +### KittyPetPawRight + +### KittyPetPaws + +### KittyPetPawsRestraint + +### KittyPetPawShortLeft + +### KittyPetPawShortRight + +### KittyPetPawsShort + +### KittyPetPawsShortRestraint + +Hide Items +隐藏项目 +Sort Items +排序项目 +Drop Items +删除项目 +Filter Items +筛选项目 +Rarity +稀有性 +Magical +魔法 +Knives +刀具 +Potions +药剂 +Power +能源 +Find In Inventory +在背包中查找 + + +A huge rubber cube rises up out of the floor! +一个巨大的橡胶立方体从地板上升起! +The latex cube hardens into a solid, harmless entity. +乳胶立方体硬化成固体、无害的实体。 +The latex cube slowly engulfs you! (DamageTaken) +乳胶立方体正在慢慢吞没你! ( DamageTaken ) +The latex cube touches you, spreading latex restraints across your body! (+RestraintAdded) +乳胶立方体接触你,将乳胶束缚散布到你的全身! ( +RestraintAdded ) + + +A small rubber cube rises up out of the floor! +一个小橡胶立方体从地板上升起! +Mini Latex Cube +迷你乳胶立方体 +The mini latex cube hardens into a solid, harmless entity. +迷你乳胶立方体硬化成固体、无害的实体。 +The mini latex cube sticks to you! (DamageTaken) +迷你乳胶立方体粘在你身上! ( DamageTaken ) +The mini latex cube expands across your body, taking the form of restraints! (+RestraintAdded) +迷你乳胶立方体在你的身体上扩展,形成束缚! ( +RestraintAdded ) + + +Gigantic Slime +巨型史莱姆 +The gigantic slime fizzles as its body becomes unstable! +巨型史莱姆随着身体变得不稳定而嘶嘶作响! +The gigantic slime stretches a pseudopod and engulfs you! (+RestraintAdded) +巨型史莱姆伸展出伪足,将你吞没! ( +添加约束 ) +The gigantic slime slowly engulfs you! (DamageTaken) +巨型史莱姆正在慢慢吞没你! ( DamageTaken ) +A group of slimes jump out! +一群史莱姆跳了出来! +A slime jumps out! +一条史莱姆跳了出来! +A group of speedy slimes jump out! +一群速度极快的史莱姆跳了出来! +A speedy slime jumps out! +一条速度极快的史莱姆跳了出来! + + +Chain Sword +链剑 +Cut through their defenses and tie them up in the process! +在此过程中突破他们的防御并捆绑他们! +Deals slash damage. Adds 10 metal binding. +造成斩击伤害。添加 10 金属束缚。 +You pick up sword with a bunch of chains attached. +你拿起附有一堆链条的剑。 + + +Slime Sword +粘液剑 +It wiggles as you move it around. +当你移动它时它也会摆动。 +Deals glue damage. Adds 25 slime binding. +造成胶体伤害。添加 25 粘液束缚。 +You pick up slime-covered sword. +你拿起沾满粘液的剑。 + + +Frost Blade +冰霜之刃 +As cold as its creator. +和它的锻造者一样冷酷。 +Deals 20 bonus ice damage and briefly slows the target. +造成 20 点额外冰冻伤害并短暂减慢目标速度。 +You pick up an icy sword. +你拿起一把冰冷的剑。 + + +Targe +圆盾 +Hide behind it while you still can. +还可以躲在它后面。 ++60 Block. Deals crush damage and stuns for 4 turns. Offhand: Gives the same block bonus. Offhand bonuses from shields do not stack with a currently equipped shield. ++60 格挡。造成碾压伤害并眩晕 4 回合。副手 : ‎提供相同的格挡加成。盾牌的副手奖励不会与当前装备的盾牌叠加。 +You pick up a wooden shield. +你拿起一个木盾。 + + +Tower Shield +塔盾 +Now with more leg room. +在腿部空间更大。 +Slows you down by 1 level. +120 Block, +30 Physical Armor. Deals crush damage and stuns for 7 turns. Offhand: Slows you and gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. ++120 格挡,+30 物理护甲。减速等级提高 1 级。造成碾压伤害并眩晕 7 回合。副手 : ‎提供相同的格挡和护甲加成。盾牌的副手奖励不会与当前装备的盾牌叠加。 +You pick up a metal tower shield. +你拿起一个金属塔盾。 + + +Reinforced Shield +强化盾 +New and improved, but also clumsier. +改进后的现代化盾牌,但也更笨拙。 ++80 Block, +15 Physical Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. ++80 格挡,+15 物理护甲。造成碾压伤害并眩晕 5 回合。副手 : ‎‎提供相同的格挡和护甲加成。盾牌的副手加成不会与当前装备的盾牌叠加。 +You pick up a reinforced shield. +你拿起一个强化盾牌。 + + +Runic Shield +符文盾 +For when you've been tied up one too many times... +因为当你被束缚太多次时... ++80 Block, +20 Magic Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. ++80 格挡,+20 魔法护甲。造成碾压伤害并眩晕 5 回合。副手 : ‎‎提供相同的格挡和护甲加成。盾牌的副手加成不会与当前装备的盾牌叠加。 +You pick up a runic shield. +你拿起一个符文盾牌。 + + +Vanish +消失 +Make the targeted creature invisible, making you totally invisible for Duration turns. Attacking and casting spells reveals your presence but you are still harder to see. +使目标生物隐形,使你在持续时间内完全隐形。攻击和施法会暴露你的存在,但你仍然更难被发现。 + + +The slime dissolves your clothing, leaving nothing but rubber against your skin... +粘液会溶解你的衣服,只留下橡胶贴在你的皮肤上...... + + +Riposte +还击 +Blocking an enemy attack makes them vulnerable and stuns them briefly. +格挡敌人的攻击会使他们变得脆弱并短暂地眩晕他们。 +Parry +招架 ++15 Block while holding a weapon. +持有武器时 +15 格挡。 +Dagger Parry +匕首招架 ++15 Block while holding a light weapon such as a knife or dagger. +持有小刀或匕首等轻武器时 +15 格挡。 +Steadfast Guard +坚定的守卫 ++5 Block for each 100 max willpower you have, while holding a non-light weapon. +当你持有非轻型武器时,每拥有 100 点最大意志力时 +5 格挡。 +The Power of Steel +钢铁般的力量 ++5 Block for each 100 max willpower you have, while holding a weapon that deals physical damage. +当你持有造成物理伤害的武器时,每拥有 100 点最大意志力时 +5 格挡。 +Secure Defense +安全防御 ++15-30 Block, based on your percentage of Willpower. ++15-30 格挡,基于你的意志力百分比。 + + +You block the EnemyName attack! +你挡住了 EnemyName 的攻击! +You block EnemyName! +你挡住了 EnemyName! +You dodge EnemyName! +你躲开了 EnemyName! +You block the EnemyName! +你挡住了 EnemyName! +You dodge the EnemyName! +你躲开了 EnemyName! + + +You resist being bound! +你抗拒被束缚! + + +Self Bondage Enthusiast +自缚爱好者 +Start with a basic self-bondage kit. +从一个基础自缚套装开始。 + + +Apprehended +逮捕 +When you are bound by an enemy attack or spell, you are stunned 1 turn per restraint added. +当你被敌人的攻击或法术束缚时,每增加一个束缚,你就会眩晕1回合。 +Feeble Attacks +虚弱的攻击 +All enemies gain 20 physical and magic armor. +所有敌人获得20件物理和魔法护甲。 +Glass Cannon +玻璃大炮 +The effects of you taking damage are increased by 150%. +你受到伤害的效果会增加150%。 +The Wand is Mightier +魔杖更强大 +Enemies have 30% more hp; Tease damage multiplier to bound targets is increased by 85%. +敌人的生命值增加 30%;对束缚目标的挑逗伤害倍数增加 85%。 +Kinky Armory +变态盔甲 + + +Chef +厨师 +You defeat the chef and claim her prize. +你击败了厨师并获得了她的奖品。 +The chef makes sure you'll never steal again! (DamageTaken) +厨师确保你再也不会偷东西了! ( DamageTaken ) +The chef makes sure you'll never steal again! (+RestraintAdded) +厨师确保你再也不会偷东西了! ( +RestraintAdded ) +The chef spanks you with her frying pan! (DamageTaken) +厨师用煎锅打你屁股! ( DamageTaken ) + + +As you eat, you look up and notice that someone is not very happy with you. +完成后,你抬起头,发现有人对你不太满意。 + + +You find some delicious brownies! +你发现了一些美味的布朗尼蛋糕! +Double Fudge Brownie +双层软糖布朗尼 +You enjoy the brownie one soft, delicious bite at a time. +你喜欢一口一口的吃松软可口的布朗尼。 +A decadent blend of butter and chocolate topped with fudge and baked to perfection. +一种由黄油和巧克力混合而成的颓废混合物,上面涂有软糖,烤得恰到好处。 +Restores 30% willpower. Takes a few turns to eat. +恢复30%意志力。需要几回合食用。 + + +A playful ghost now accompanies you on your journey. +现在,一个顽皮的幽灵将陪伴你踏上旅程。 +The ghost haunting you decides to have a little fun! (+RestraintAdded) +困扰你的幽灵决定找点乐子! ( +RestraintAdded ) + + +Hemp Rope +麻绳 +The most common type of bondage rope. +最常见的捆绑绳。 +Soft and comfy. Great for casual wear! +柔软舒适。作为休闲装很合适 + + +Boxtie +后手缚捆扎带 +The ropes squeeze you gently. +绳索轻轻地压迫你。 +Rope Cuffs +绳手铐 +A quick tie for apprehending prisoners. +用于逮捕囚犯的快速捆绑。 +It's not very secure. +这不是很牢固。 +Chest Straps +胸绳 +Chest Harness +胸束衣 +The finishing touch on a tight and strict piece of ropework. +最后的收尾工作是对一根紧密而严厉的绳索进行最后的修饰。 +Rope Hogtie +驷马 +A very strict and tight hogtie, good for subduing unruly captives. +非常严格且紧密的捆绑,适合制服不守规矩的俘虏。 +It holds you strictly in a boxtie. You tug on the rope connecting your feet and struggle. +它把你严格地束缚在后手缚捆扎带里。你需要首先挣扎开连接腿部的绳子。 +It holds you strictly with your back arched. You tug on the rope connecting your feet and struggle. +它强迫你背部弓起并严格束缚住。你需要首先挣扎开连接腿部的绳子。 +Rope Belt +绳衣 +Rope Harness +绳束衣 +A harness that secures your other restraints and makes them tighter. +一种安全带,可固定你的其他束缚并使它们更紧。 +Crotch Rope +股缚 +A tight rope impressing upon your most private areas... +一条紧绷的绳索压迫在你最私密的区域...... +Wrist Rope +腕部绳缚 +A wrist and elbow tie keeping your arms secured behind your back. +手腕和肘部系带将你的手臂固定在背后。 +Upper Knee Ropes +上膝绳缚 +A tie that hobbles your knees together.. +一条绳带将你的膝盖绑在一起。 +Thigh Ropes +大腿绳缚 +Upper Thigh Ropes +上腿绳缚 +A tie that hobbles your thighs together.. +一条绳带将你的大腿绑在一起。 +Ankle Ropes +脚踝绳缚 +Lower Leg Ropes +小腿绳缚 +Lower Knee Ropes +下膝绳缚 +A tie keeping your knees secured together. +一条绳带将你的膝盖绑在一起。 +Toe Rope +趾绳 +A tie keeping your toes tightly together. +一条将脚趾头固定在一起的捆绑 +Living Rope Collar +活体绳项圈 +This collar is designed to make sure its wearer does not escape their ropes. +这个项圈的设计是为了确保佩戴者不会逃脱绳索。 +It will occasionally cause ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +它偶尔会使得绳索突然出现并束缚佩戴者。速度的效果增加取决于你身上的绳索数量。 + + +Notebook Page +笔记本页 + + +You're going to stay with me for a while~ +你就陪我一段时间吧~ +That's better! Now stay close to me~ +这样更好! 现在就靠近我吧~ +Looks like our time is coming to an end... +看来属于我们的时间即将结束了…… +Time to bring you back to your place~ +是时候带你回到原处了~ +You've been quite adorable! Until next time~ +你真是太可爱了!下次见~ + + +It's time for your walk, miss. +小姐,该散步了。 +Now let's see, where to go... +现在让我们看看,该去哪里…… +I think we've reached a stopping point. +我想我们已经到了终点。 +I have to put you back now~ +我现在必须把你带回去了~ +It's been fun playing with you miss! +和你一起玩很有趣,小姐! + + +(reaches for your leash) +( 伸手去拉你的牵绳 ) +(holds your leash firmly) +( 牢牢握住你的牵绳 ) +(giggles) +( 咯咯笑 ) +(waves goodbye) +( 挥手告别 ) + + +Why don't we go for a walk? +我们为什么不去散步呢? +That's better! Now come along~ +这样更好!现在来吧~ +This has been lots of fun! +这真是太有趣了! +I have to go return you~ +我得去还你~ +Good girl~ Let's go again later~ +好女孩~ 我们一会儿再去吧~ + + +It's time for walkies! +该走了! +That's a good girl! +真是个好女孩! +I want to keep you longer, but I've got things to do. +我想让你多待一会儿,但我还有事要做。 +It's time to go back to your little house~ +是时候回你的小房子了~ +(pats you on the head) +( 拍拍你的头 ) + + +It is time for your mandatory exercise. +是时候进行强制性锻炼了。 +Please maintain proximity. +请保持距离。 +Progress Level: 90% +进度水平 : ‎90% +Exercise complete. Returning to storage. +练习完毕。返回存储。 +Uploading logs to database. Error... no connection. +正在将日志上传到数据库。错误...没有连接。 + + +Latex Mimic +乳胶模仿者 +The latex mimic melts into a shiny puddle. +乳胶仿品融化成闪亮的水坑。 +The latex mimic spits out a glob of rubber at you! (+RestraintAdded) +乳胶模仿者向你吐出一团橡胶! ( +RestraintAdded ) +The latex mimic stretches out an appendage and pulls you toward it! (DamageTaken) +乳胶模仿者伸出一个附肢并将你拉向它! ( DamageTaken ) +The latex mimic engulfs you in sticky rubber! (DamageTaken) +乳胶模仿者将你包裹在粘稠的橡胶中! ( DamageTaken ) + + + + +Item Stack: +物品堆栈 : ‎ + + +Heavy +重 +Accessory +配饰 +Restraint +拘束具 +Enchanted +附魔的 +Mundane +平凡 +Can Disassemble +可拆卸的 +Raw Material +基本材料 +Armbinders +单手套 +Legbinders +束腿套 +Boxbinders +盒式单手套 +Devices +装置 +Toys +玩具 +Collars +项圈 +Jackets +拘束衣 +Dresses +裙子 +Ties +捆扎带 +Wrapping +包裹物 +Gags +堵嘴物 +Harnesses +安全带 +Mittens +连指手套 +Boots +靴子 +C. Belts +C.皮带 +C. Bras +C.胸罩 +Maid +女仆 +Locked +已锁定 +Accessible +可访问 +Inaccessible +不可访问 +Quick-Bind +快速安装 + + + + + + +Lower +低部 + + +Spellbound Rope +绳子 ( 符咒 ) +An enchanted rope with a powerful sealing spell. It cannot be cut by mundane means. +带有强大封印咒语的魔法绳索。无法用一般方法切断。 +It almost has a kinky mind of its own. +它就快要有一些自己的怪癖了。 + + +Spellbound Boxtie +后手缚 ( 符咒 ) +The knots appear to tie themselves together again, making them impossible to undo! +结似乎再次将自己绑在一起,使它们无法解开! +Spellbound Rope Cuffs +绳手铐 ( 符咒 ) +Spellbound Ropework +绳索 ( 符咒 ) +A quick tie for apprehending prisoners, looped through buckles on the hand restraints. +用于逮捕囚犯的快速捆绑,穿过手部束缚装置上的带扣。 +Strict Spellbound Ropework +严密的绳索 ( 符咒 ) +The finishing touches on a tight and strict piece of ropework. +最后加工在一条紧绷而严密的绳索上。 +Spellbound Hogtie +驷马 ( 符咒 ) +Spellbound Rope Belt +绳衣 ( 符咒 ) +Spellbound Harness +绳束衣 ( 符咒 ) +Spellbound Crotch Rope +股绳 ( 符咒 ) +Spellbound Wrist Tie +手腕缚带 ( 符咒 ) +Spellbound Knees +膝盖缚带 ( 符咒 ) +Spellbound Thighs +大腿缚带 ( 符咒 ) +A tie that holds your legs together.. +绳带将你的双腿束缚在一起。 +Spellbound Upper Thighs +上腿缚带 ( 符咒 ) +A tie that holds your thighs together.. +绳带将你的大腿束缚在一起。 +Spellbound Ankles +脚踝缚带 ( 符咒 ) +Spellbound Lower Legs +小腿束带 ( 符咒 ) +A tie keeping your legs secured together. +绳带将双腿固定在一起。 +Spellbound Lower Knees +下膝束带 ( 符咒 ) +Spellbound Toe Rope +脚趾绳缚 ( 符咒 ) +A tie keeping your toes secured together. +束带将双脚固定在一起。 +Living Spellbound Rope Collar +活体符咒绳项圈 +It will occasionally cause spellbound ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +它偶尔会使得符咒绳索突然出现并将佩戴者捆绑起来。速度的效果增加取决于你身上的符咒绳索数量。 + + + + +A novice-level enchanted rope, relatively trivial to untie but resistant to mundane tools. +新手级别的附魔绳索,解绳比较简单,但对普通工具有抵抗力。 +Faintly glows with traces of devious thoughts. +微弱的光芒闪烁着狡猾的思想痕迹。 + + +Magic Boxtie +后手缚 ( 附魔 ) +They glow with a trace of magic. +它们散发着一丝魔法的光芒。 +Magic Rope Cuffs +绳手铐 ( 附魔 ) +Magic Ropework +绳索 ( 附魔 ) +Strict Magic Ropework +严密的绳索 ( 附魔 ) +Magic Hogtie +驷马 ( 附魔 ) +It's very secure. You tug on the rope connecting your feet and struggle. +这是非常安全的。你需要首先挣扎开连接你腿的绳子。 +Magic Rope Belt +绳衣 ( 附魔 ) +Magic Harness +束衣 ( 附魔 ) +Magic Crotch Rope +股绳 ( 附魔 ) +Magic Wrist Tie +手腕束带 ( 附魔 ) +Magic Knee Tie +膝盖缚带 ( 附魔 ) +Magic Thigh Ropes +大腿绳缚 ( 附魔 ) +Magic Upper Thigh Ropes +上腿绳缚 ( 附魔 ) +Magic Ankle Tie +脚踝束带 ( 附魔 ) +Magic Lower Leg Tie +小腿缚带 ( 附魔 ) +Magic Lower Knee Tie +下膝缚带 ( 附魔 ) +Magic Toe Rope +脚趾绳缚 ( 附魔 ) +Living Magic Rope Collar +活体附魔绳项圈 +It will occasionally cause magic ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +它偶尔会使得附魔绳索突然出现并将佩戴者捆绑起来。速度的效果增加取决于你身上的附魔绳索数量。 + + +Celestial Rope +天绳 +Rope that has been exposed to solar energies. +暴露在太阳能下的绳索。 +Squeezes the wearer if she tries to escape, so that she knows her place. +如果佩戴者试图逃跑,它就会挤压她并让她知道自己的处境。 + + +Holy Boxtie +神圣后手缚捆扎带 +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +一组散发出平静、舒缓气息的绳索。它们神奇地伸展以贴合你的身体。 +Holy Rope Cuffs +神圣绳手铐 +Holy Ropework +神圣绳索 +Strict Holy Ropework +严密的神圣绳索 +Holy Hogtie +神圣驷马 +Holy Rope Belt +神圣绳衣 +Holy Rope Harness +神圣绳束衣 +Holy Crotch Rope +神圣股绳 +Holy Wrist Rope +神圣手腕绳缚 +Holy Upper Knee Ropes +神圣上膝绳缚 +Holy Thigh Ropes +神圣大腿腿绳缚 +Holy Upper Thigh Ropes +神圣上腿绳缚 +Holy Ankle Ropes +神圣脚踝绳缚 +Holy Lower Leg Ropes +神圣小腿绳缚 +Holy Lower Knee Ropes +神圣下膝绳缚 +Holy Toe Rope +神圣脚趾绳缚 +Living Holy Rope Collar +活体神圣绳项圈 +It will occasionally cause holy ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +它偶尔会使得神圣绳索突然出现并束缚佩戴者。速度的效果增加取决于你身上的神圣绳索数量。 + + + + +Mithril Rope +秘银绳索 +Rope made from silver thread, exposed to lunar energies. +用银线制成的绳索,暴露在月球能量之下。 +Lightweight yet unyielding. Truly a high class rope. +轻巧而坚韧。真正的高级绳索。 + + +Mithril Boxtie +秘银后手缚捆扎带 +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +由秘银编织而成的轻质绳索,光滑且几乎牢不可破。 +Mithril Rope Cuffs +绳手铐 ( 秘银 ) +Mithril Ropework +绳索 ( 秘银 ) +Strict Mithril Ropework +严密的绳索 ( 秘银 ) +Mithril Hogtie +驷马 ( 秘银 ) +Mithril Rope Belt +绳衣 ( 秘银 ) +Mithril Rope Harness +绳束衣 ( 秘银 ) +Mithril Crotch Rope +股绳 ( 秘银 ) +Mithril Wrist Rope +腕绳 ( 秘银 ) +Mithril Lower Knee Ropes +下膝绳缚 ( 秘银 ) +Mithril Thigh Ropes +大腿绳缚 ( 秘银 ) +Mithril Upper Thigh Ropes +上腿绳缚 ( 秘银 ) +Mithril Ankle Ropes +脚踝绳缚 ( 秘银 ) +Mithril Lower Leg Ropes +小腿绳缚 ( 秘银 ) +Mithril Toe Ropes +脚趾绳缚 ( 秘银 ) +Living Mithril Rope Collar +活体秘银绳项圈 +It will occasionally cause mithril ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +它偶尔会使得秘银绳突然出现并将佩戴者捆绑起来。速度的效果增加取决于你身上的秘银绳索数量。 + + +Dark Portal +黑暗之门 +They are trying to take you somewhere! +他们正试图带你去某个地方! + + +Essence Mote +精华尘埃 +A trainee can use this to focus. +学员可以用这个来集中注意力。 +### Pick this up to gain decaying miscast reduction. + +Seal Sigil +封印符文 +Walk over it to erase it and unlock the next floor. +跨过去擦掉它并解锁下一楼层。 + + +The Shadow +暗影 +The Shadow is exorcised... for now. +暗影已被驱除……暂时。 +The Shadow overwhelms you with its power... (+RestraintAdded) +暗影以其力量压倒你...... ( +RestraintAdded ) +The Shadow welcomes you to your new future. (DamageTaken) +暗影欢迎你来到你的新未来。 ( DamageTaken ) +The Shadow cackles as your restraints are sealed! (DamageTaken) +当你的束缚被封印时,暗影咯咯地笑了起来! ( DamageTaken ) +The Shadow smiles and vanishes. +暗影微笑着消失了。 +The Shadow smiles and vanishes, leaving you locked in a mysterious RNAME... +暗影微笑着消失,把你锁在一个神秘的 RNAME 中…… + + +Observer +观察者 +The observer is banished into the aether. +观察者被放逐到以太中。 + + +From the Beyond +来自彼岸 + + +You briefly spot your reflection as a reflective cube appears! +当一个反光立方体出现时,你短暂地发现了自己的倒影! +Mini Metal Cube +迷你金属立方体 +The liquid metal cube shatters into glittering dust. +液态金属立方体碎裂成闪闪发光的灰尘。 +The liquid metal cube sticks to you and hardens! (DamageTaken) +液态金属立方体粘在你身上并变硬! ( DamageTaken ) +The liquid metal cube expands across your body and hardens, taking the form of restraints! (+RestraintAdded) +液态金属立方体在你的身体上膨胀并变硬,以束缚的形式出现! ( +RestraintAdded ) + + +Liquid Metal +液态金属 +Primordial latex infused with mineral form. +注入矿物形态的原始乳胶。 +Heavy and weighs the wearer down. +很重,穿戴者会觉得很累。 + + +Liquid Metal (Feet) +液态金属 ( 脚 ) +A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. +一种既柔软又坚硬的金属物质。它会减轻你的负担,降低闪避,并导电。 +Forming a skintight layer, it will be quite difficult to escape this. +形成一层紧密的外壳,逃脱这个是相当困难的。 +Liquid Metal (Ankles) +液态金属 ( 脚踝 ) +Liquid Metal (Legs) +液态金属 ( 腿 ) +Liquid Metal (Arms) +液态金属 ( 手臂 ) +Liquid Metal (Hands) +液态金属 ( 手 ) +Liquid Metal (Mouth) +液态金属 ( 嘴 ) +Liquid Metal (Head) +液态金属 ( 头 ) +Living Liquid Metal Collar +活体液态金属项圈 +This collar is designed to make sure its wearer does not escape the metal. +这个项圈的设计是为了确保佩戴者不会脱离金属。 +It will occasionally cause liquid metal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of liquid metal you have on you. +它偶尔会使得液态金属突然出现并束缚佩戴者。速度的效果增加取决于你身上的液态金属量。 + + +The stairs dissolve right before you! +楼梯就在你面前消失了! +The stairs dissolve as you step onto them, pulling you with them to somewhere else. +当你踏上楼梯时,楼梯就会消失,将你拉到其他地方。 + + +A dark energy enters your body... (DamageDealt) +黑暗能量进入你的身体...... ( DamageDealt ) +A dark energy lurks within you. +一股黑暗能量潜伏在你的内心。 +You succumb to a dark desire... (+RestraintAdded) +你屈服于黑暗的欲望...... ( +RestraintAdded ) + + +Observer's Gaze +观察者的目光 + + +Industrial Tape Wand +工业胶带杖 +A non-magical tape wand used for creating tight little packages. +一种非魔法胶带杖,用于创建紧密的小包装。 +Deals chain damage. 200% binding efficiency. Hitting an enemy applies the Taped debuff for 12 turns, increasing Chain damage to them by 15%. Deal 10 chain damage to adjacent Taped enemies while moving. +造成连锁伤害。 200% 束缚效率。击中敌人会施加胶带减益效果,持续 12 回合,使其受到的锁链伤害提高 15%。 移动时对相邻的被胶带缠住的敌人造成 10 点锁链伤害。 + + +Bag of Goodies +一袋好东西 +Someone's secret stash. +某人的秘密藏匿处。 +Deals charm damage. Applies a toy to targets hit for 40 turns. Offhand: Applies a toy to targets you hit. +造成魅惑伤害。对击中的目标装备玩具,持续 40 回合。副手 : ‎将玩具装备到你击中的目标上。 +You find a bag filled with various toys and vibrators... +你发现一个袋子里装满了各种玩具和振动器...... +You play with yourself using some of the toys in the bag... +你用袋子里的一些玩具玩自己…… + + +Magic Remote +魔法遥控器 +The key to absolute power. +绝对权力的按键。 +Triggers long-duration edging on basic attack if the target has a toy. Offhand: Applies short-duration teasing to targets you hit. +如果目标有玩具,则在基本攻击时触发长时间的寸止。 副手 : ‎对你击中的目标进行短暂的玩弄。 + + +Vibrator Remote +振动器遥控器 +You click the remote and hear a buzzing noise! +你按下遥控器并听到嗡嗡声! +15 charge to powerfully activate vibrators in an area for 15 turns. +15 点充能可强力激活某个区域内的振动器,持续 15 回合。 + + +10 charge to activate vibrators in an area for 15 turns. +10 点充能可激活区域内的振动器 15 回合。 + + +You find a golden crystal. It glows faintly. +你发现一颗金色的水晶。它发出微弱的光芒。 +You find a dull, gold-tinted crystal. +你发现一颗暗淡的金色晶体。 + + +Save Loadout +保存加载 + + +Rubber Stick +橡胶棒 +A rubber cylinder without any lewd intentions whatsoever. +一个没有任何猥亵意图的橡胶圆棒。 +Deals grope damage. +造成抚摸伤害。 +You pick up a flexible rubber stick. +你拿起一根柔软的橡胶棒。 + + +Blade of Ejahl +“埃贾尔”之刃 +A piece of prized ancient equipment. Magical energy causes it to vibrate intensely. What could it have been used for? +一件珍贵的古代装备。魔力使其剧烈振动。它可以用来做什么? +Deals grope damage. Can spend 40 charge to add charm damage per hit for 10 turns. +造成抚摸伤害。每次击中可花费 40 点能量来增加魅惑伤害,持续 10 回合。 +You retrieve the Blade of Ejahl. +你取回了“埃贾尔”之刃。 + + +Intense Vibrations: The Blade of Ejahl deals bonus charm damage!!! +强烈振动 : ‎火焰之刃造成额外的魅惑伤害!!! +The Blade of Fla-peh buzzes with great power! +火焰之刃嗡嗡作响,威力巨大! +40 charge to deal 30 charm damage per hit for 10 turns. +40 点充能,每次击中造成 30 点魅惑伤害,持续 10 回合。 + + +Enchanted Rope +附魔绳 +She who lives by the rope, is tied up by the rope. +靠绳索生存的她,被绳索束缚着。 +Deals chain damage and applies 50 points of rope binding. Draws 10 mana per hit to apply 50 extra points of magical binding. If you don't have mana, you fail to control the rope... +造成锁链伤害并施加 50 点绳索束缚。每次击中吸取 10 点法力以施加 50 点额外的魔法束缚。如果你没有法力,你就无法控制绳子...... +You find some enchanted rope. +你找到一些附魔绳子。 +Without mana to control it, the enchanted rope springs back upon you! +如果没有魔力来控制它,魔法绳子就会弹回到你身上! + + +Light Bow +轻弓 +Pointy stick delivery system. +尖棒输送系统。 +Reload time: None. Deals crush damage on melee. Draws 10 charge and 20 stamina to fire an ordinary arrow, dealing 30 pierce damage. +装弹时间 : ‎无。近战造成碾压伤害。消耗 10 点冲力和 20 点体力来发射普通箭,造成 30 点穿透伤害。 +You find a wooden bow. +你找到一把木弓。 +10 charge to fire an arrow. Deals 30 pierce damage. +10 点充能即可发射箭。造成 30 点穿刺伤害。 +Choose projectile path +选择弹丸路径 +Arrow +箭矢 +You loose an arrow! +你射出了一支箭矢! + + +Fire Arrows +火焰箭矢 +Converts arrows to fire arrows for 30 extra charge, which deal the arrow damage plus 20 as fire damage in a 3x3 area and stuns briefly. +将箭转换为火焰箭矢,需要 30 点额外充能,在 3x3 区域内造成箭伤害加上 20 点火焰伤害,并短暂眩晕。 +You switch to using fire arrows. +你切换到使用火焰箭矢。 +Fire Arrow +火焰箭 + + +Vine Arrows +藤蔓箭矢 +Converts arrows to all-natural organic versions for 20 extra charge, which apply 80 binding to the target and deal chain damage instead. +将箭转换为纯天然有机版本,需要 20 点额外充能,这会对目标施加 80 点束缚并造成锁链伤害。 +You switch to using vine arrows. +你切换到使用藤蔓箭。 +Vine Arrow +藤蔓箭矢 +A sudden burst of vines overtakes you as you find yourself wrapped up tightly! +当你发现自己被紧紧包裹时,突然爆发的藤蔓向你袭来! + + +You find a bow and a glowing crystal. The bow is scribed with runes of duplication. +你发现了一把弓和一块发光的水晶。弓上刻有复制符文。 + + +Crossbow +弩 +Watch where you're pointing that thing! +注意你把那个东西指向哪里! +Reload time: 3 stationary turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 65 pierce damage. +装弹时间 : ‎3 静止回合。近战造成碾压伤害。需要 15 点充能且没有体力来发射普通箭,造成 65 点穿透伤害。 +You find a crossbow. +你找到一把弩。 +20 charge to fire a bolt. Deals 65 pierce damage. +20 点充能可发射箭矢。造成 65 点穿刺伤害。 +Bolt +箭矢 +You pull the trigger! +你扣动了扳机! + + +Your RestraintName melts off! +你的 RestraintName 融化了! +Your RestraintName melts faster with the application of fire! +你的 RestraintName 在火的作用下融化得更快! +Your RestraintName hardens with the application of frost! +你的 RestraintName 会因霜冻而变硬! + + +dmg +伤害 + + +AMNT Evasion +AMNT 闪避 +AMNT% Accuracy +AMNT% 命中率 +AMNT Magic Armor +AMNT 魔法防御 +AMNT Physical Armor +AMNT 物理防御 +AMNT Bondage Resist +AMNT 束缚抗性 +AMNT TYPE Resist +AMNT TYPE 抗性 +AMNT% TYPE Damage +AMNT% TYPE 伤害 +AMNT% weapon phys. dmg +AMNT% 武器物理伤害 +AMNT% weapon magic dmg +AMNT% 武器魔法伤害 +Infuse weapon AMNT% TYPE +注入武器 AMNT% TYPE +AMNT TYPE on attack +AMNT TYPE 在攻击时 +AMNT Mana Efficiency ++AMNT 法力效率 +AMNT TYPE Mana Efficiency ++AMNT TYPE 法力效率 +AMNT% regen from mana pool +来自法力池 AMNT% 的回复 +AMNT mana pool on capture +AMNT 捕获时的法力池 +AMNT% Visibility Reduction +AMNT% 可见度降低 +AMNT Distraction Decay +AMNT 性奋衰减 +AMNT Distraction Per Turn +AMNT 每回合性奋 +AMNT AP from attacks +AMNT AP 遭受攻击 + + +After attacking with a teasing weapon: +用挑逗性武器攻击后 : ‎ + + +Gain AMNT% Spell Damage for DRTN turns +在 DRTN 回合内造成 AMNT% 法术伤害 + + +Drains mana from the wearer. +吸取佩戴者的法力。 + + +AMNT Stat +AMNT 统计 + + +Drop On Floor +丢弃至地面 + + +Remove +移除 +Struggle +挣扎 + + +Leyline Map +地脉地图 + + +Harness Plug Gag +马具塞子口塞 +A gag meant to keep people quiet by forcing a plug into their mouth and securing it in place with a strict harness. +一种堵嘴装置,旨在通过将塞子强行塞入人们的嘴中并用严格的安全带将其固定到位来保持人们的安静。 + + +Your OLDITM transforms into NEWITM! +你的 OLDITM 转变为 NEWITM! +Your OLDITM gains new properties! +你的 OLDITM 获得新特性! + + +Moon-Cursed Epicenter +月咒核心 +The cursed epicenter disperses into black stardust. +诅咒核心消散成黑色星尘。 +The cursed epicenter retreats as you remove the last of your cursed restraints! +当你移除最后的被诅咒的束缚时,诅咒核心就会撤退! +The cursed epicenter retreats as you are claimed by something else! +诅咒核心正在撤退,因为你已被别的东西占据! +The cursed epicenter assaults your mind with its presence! (DamageDealt) +诅咒核心以其存在来攻击你的思想! ( DamageDealt ) +You feel your cursed items turn cold to the touch! +你感觉你被诅咒的物品摸起来变冷了! +An cursed collar appears around your neck, feeling cold to the touch. +你的脖子上出现了一个被诅咒的项圈,摸起来很冷。 +Cursing Sigil +诅咒符印 +A cursing sigil appears on the ground! +地面上出现了一道诅咒符印! +You are being cursed!!! +你被诅咒了!!! + + +Star-Cursed Epicenter +星咒核心 + + +Moondust Collar +月尘项圈 +'You thought you could run forever, didn't you? Fate has a way of always catching up to you...' +'你以为你可以永远奔跑,不是吗? 命运总有办法追上你……' +Cannot be removed while you are wearing other Star Cursed items. +当你穿着其他星咒物品时无法移除。 +Stardust Collar +星尘项圈 + + +The cursed seal on the RestraintName vanishes into a brief veil of stardust. +RestraintName 上的诅咒印记消失在短暂的星尘面纱中。 +Take AMNT damage to weaken the curse. Excludes shadow, psychic, charm, or damage taken at 0 WP. +承受 AMNT 伤害来削弱诅咒。不包括暗影、灵能、魅惑或 0 意志力时 受到的伤害。 +You struggle uselessly, sealed in your fate. +你徒劳地挣扎,被命运所封印。 +You feel your restraints starting to weaken... +你感觉你的束缚开始减弱...... + + +The cursed collar falls off, awaiting its next victim... +被诅咒的项圈脱落,等待着下一位受害者…… +You must remove all other Star Cursed items before removing the collar. +在移除项圈之前,你必须移除所有其他的星咒物品。 + + +Transformation: Items with generic curses transform into Star Cursed items. +转变 : ‎带有普通诅咒的物品会转变为星咒物品。 +With a burst of dark energy, your OLDITM gains new properties! +随着黑暗能量的爆发,你的 OLDITM 获得了新的特性! +With a burst of dark energy, your OLDITM transforms into a NEWITM! +随着黑暗能量的爆发,你的 OLDITM 转变为 NEWITM! + + +Restoration: While distracted, your Star Cursed restraints regain strength. +恢复 : ‎在性奋时,你的星咒束缚会恢复力量。 +With the rush of pleasure, you feel your cursed restraints tighten and strengthen! +随着快感的涌动,你感受到你那被诅咒的束缚收紧、加强! + + +Corruption: While in the shadows, you slowly gain corruption. +堕落 : ‎在阴影中,你会慢慢得堕落。 +Your willpower gain and struggle power is less effective due to your corruption. +你的意志力增益和挣脱能力会因为你的腐化而变得不那么有效。 + + +Seduction: Gain distraction after taking damage. +诱惑 : ‎受到伤害后开始性奋。 +Taking damage fills your minds with cursed thoughts... +受到伤害会让你的脑海中充满被诅咒的想法...... +Having taken damage, your distraction is increasing... +受到伤害后,你的注意力越来越分散...... + + +Punishment: When you defeat an enemy, you are stunned briefly and enemies are attracted. +惩罚 : ‎当你击败敌人时,你会短暂昏迷并吸引敌人。 +Dark Voice: You are supposed to be a slave! +黑暗之声 : ‎你应该是奴隶! + + +Submission: At 0 WP, you are restrained if you leave the presence of a hostile. +屈服 : ‎在 0 意志力时,如果你离开敌方存在,你就会受到束缚。 +Dark Voice: Kneel before your mistress. +黑暗之声 : ‎跪在你的女主人面前。 +You must submit! Moving away from an enemy at 0 WP will bind you! +你必须屈服!0 意志力时逃离敌人将会束缚你! + + +Denial: -10 WP when you try to Let Go. At 0 WP you cannot orgasm. +拒绝 : ‎当你尝试高潮时 -10 意志力。 意志力为 0 时你将无法达到性高潮。 +Dark Voice: Not yet. +黑暗之声 : ‎还不行。 +Dark Voice: Your squirming pleases us. +黑暗之声 : ‎你的蠕动让我们很高兴。 +Dark Voice: It is not your choice to make~ +黑暗之声 : ‎这不是你可以选择的~ +Dark Voice: You may enjoy yourself, for now~ +黑暗之声 : ‎你现在尽情享受吧~ +Dark Voice: Yes, take in the pleasure... +黑暗之声 : ‎是的,享受快乐…… +Dark Voice: Enjoy a gift, dear~ +黑暗之声 : ‎亲爱的,享受礼物吧~ +As you let go of yourself, the Robe of Chastity loses all effects! +当你释放自己时,贞洁长袍就会失去所有效果! +The magic in the Robe of Chastity fades... for now. +贞洁长袍的魔力暂时消失了。 +You have failed to keep the principles of the Paladins... for now. +你没有遵守圣骑士的原则......暂时没有。 + + +You feel vibrations in your leotard as the magically conductive fabric channels your power. +你会感觉到紧身衣在震动,因为神奇的导电织物会引导你的力量。 +Your leotard produces a tingling full-body sensation as it channels your magic! +你的紧身衣在传导你的法力时,会产生全身刺痛的感觉! +A tingling sensation serves to remind you of your leotard's magic properties. +刺痛感会提醒你紧身衣的神奇功效。 + + +Star: -20 Charm/Psychic Resist +星星 : ‎-20 魅惑/灵能 抗性 +Star: +40 all other resists +星星 : ‎+40 所有其他抗性 + + +Mithril Orb +秘银宝珠 +Shining strings encircle your body! +闪亮的绳子环绕着你的身体! + + +Your cursed items have attracted a powerful cursed spirit! +你的诅咒物品吸引了强大的诅咒之灵! + + +The seal on your RESTRAINTNAME is weakening. +你 RESTRAINTNAME 上的封印正在减弱。 + + +The fighter pouts and runs away! +战士撅起嘴,逃跑了! +The fighter knocks you to the ground and binds you! (+RestraintAdded) +战士将你击倒在地并绑住你! ( +RestraintAdded ) +The fighter strikes you with her weapon! (DamageTaken) +战士用她的武器攻击你! ( DamageTaken ) +The fighter takes you down with the back of her weapon! (DamageTaken) +战士用她的武器从背后把你打倒! ( DamageTaken ) +The fighter puts you in a hold and manages to slip on a lock! (DamageTaken) +战士将你困住并设法上锁! ( DamageTaken ) +The fighter vanishes and ends up behind you! +战士消失了,随后出现在你身后! + + + + +The fighter moans loudly and rolls around on the floor! +战士大声呻吟,在地板上打滚! +The fighter wraps her arms around you with bindings in hand! (+RestraintAdded) +战士用手绑住你的胳膊! ( +RestraintAdded ) +The fighter pins you with her weapon and grabs your breast! (DamageTaken) +战士用她的武器压住你并抓住你的胸部! ( DamageTaken ) +The fighter enchants her weapon and strikes you! (DamageTaken) +战士给她的武器附魔并攻击你! ( DamageTaken ) +The fighter smiles lasciviously as she dangles a lock in front of you! (DamageTaken) +战士在你面前挂一把锁,并露出淫荡的微笑! ( DamageTaken ) +The fighter enchants her weapon and flies forward! +战士使她的武器附魔并向前飞行! + + +The fighter drops her weapon and admits defeat! +战士丢下武器并承认失败! +The fighter feints and strikes, slapping you with the flat of her blade! (DamageTaken) +战士佯装攻击,用她的刀刃击打你! ( DamageTaken ) +The fighter proudly clicks on a lock! (DamageTaken) +战士自豪地锁了一把锁! ( DamageTaken ) +The fighter briefly vanishes and ends up behind you! +战士短暂消失并出现在你身后! + + +The fighter falls on her knees and begs! +战士跪下哀求! +The fighter throws an enchanted binding ring at you! (+RestraintAdded) +战士向你扔出一个附魔的束缚环! ( +RestraintAdded ) +The fighter throws her weapon at you! (DamageTaken) +战士将武器扔向你! ( DamageTaken ) + + +Casting SPNME +发射 SPNME +The door suddenly locks behind you! +门突然在你身后锁上了! + + +Apply To Target +应用于目标 +Purify +净化 + + +You need to target an NPC +你需要瞄准一个NPC +Target must be bindable and disabled. +目标必须可以被绑架并且已禁用。 +Target acquired! +目标达成! +Truss em up! +束缚术 +Choose target to bind +选择要捆绑的目标 +Target Acquired! +目标达成! +Designates the target for bondage and allows you to apply items from the inventory. Can only be applied to entities that are willing or disabled. Some items require higher levels of incapacitation to be applied +指定目标将其束缚并允许你应用背包中的物品。以这种方式使用的物品无法恢复,只能应用于被击晕、完全束缚或以其他方式丧失能力的敌人。 + + +The Shoppe +商店 +Journey Selection +旅程选择 +High-Security Prison +高戒备监狱 +Doll Sorting Station +玩偶分拣站 + + +A cursed NEWITM flies out of the chest and latches tightly to you! +一只被诅咒的 NEWITM 从箱子里飞出,紧紧地抓住你! +With a puff of magic, a NEWITM appears on your body! +随着一股魔力,NEWITM 出现在你的身上! + + +You draw upon chaotic energies, restoring mana! +你汲取混沌能量,恢复法力! +You draw upon chaotic energies, but your mind is unable to hold back the arcane forces! +你吸取了混沌能量,但你的思想却无法阻挡神秘的力量! +Your attempt to call upon chaotic energies fails. +你召唤混沌能量的尝试失败了。 +You are already at max mana. +你已经达到最大法力值了。 + + +The vibrator holds at full power to drive you over the edge! +振动器保持最大功率,让你到达绝顶! + + +The weapon needs to be loaded to fire. +武器需要装弹才能开火。 + + +Recurve Bow +反曲弓 +Curvy, just like its user. +曲线优美,就像它的使用者一样。 +Reload time: 1 turn. Deals crush damage on melee. Draws 14 charge and 35 stamina to fire an ordinary arrow, dealing 40 pierce damage. +装弹时间 : ‎1 回合。近战造成碾压伤害。需要 14 点充能和 35 点体力来发射普通箭,造成 40 点穿透伤害。 +You find a recurve bow. +你找到一把反曲弓。 +14 charge to fire an arrow. Deals 40 pierce damage. +14 点充能即可发射射箭。造成 40 点穿刺伤害。 +Recurve Bow Arrow +反曲弓箭 +You loose a strong arrow! +你射出了一支强箭! + + +Longbow +长弓 +Great for building both empires and muscle. +非常适合建立帝国和肌肉。 +Reload time: 2 turns. Deals crush damage on melee. Draws 18 charge and 60 stamina to fire an ordinary arrow, dealing 60 pierce damage. +装弹时间 : ‎2 回合。近战造成碾压伤害。需要 18 点充能和 60 点体力来发射普通箭,造成 60 点穿透伤害。 +You find a huge longbow. +你发现一把巨大的长弓。 +18 charge to fire an arrow. Deals 60 pierce damage. +18 点充能即可发射箭。造成 60 点穿刺伤害。 +Longbow Arrow +长弓箭 +You loose a mighty arrow! +你射出了一支强大的箭! + + +Pistol Crossbow +手枪弩 +Lethal. Sustainable. Portable. +致命。可持续。便携。 +Reload time: 3 turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 45 pierce damage. +装弹时间 : ‎3 回合。近战造成碾压伤害。需要 15 点充能且无需体力即可发射普通箭,造成 45 点穿刺伤害。 +You find a pistol crossbow. +你找到一把手枪弩。 +20 charge to fire a bolt. Deals 45 pierce damage. +20 点充能即可发射箭矢。造成 45 点穿刺伤害。 +Pistol Bolt +手枪弩箭 + + +Arbalest +强弩 +At this point why not just use a gun? +这个时候为什么不直接用枪呢? +Reload time: 5 stationary turns. Deals crush damage on melee. Draws 25 charge and no stamina to fire an ordinary arrow, dealing 70 pierce damage, passing through units. +装弹时间 : ‎静止 5 回合。近战造成碾压伤害。消耗 25 点冲力且无需体力来发射普通箭,造成 70 点穿透伤害,穿过小队。 +You find an arbalest. +你找到了一把强弩。 +25 charge to fire a bolt. Deals 100 pierce damage. +25 回合充能即可发射弩箭。造成 100 点穿刺伤害。 +Heavy Bolt +重型弩箭 + + +The RSTNME is removed as the lock comes off. +RSTNME 在被锁打开后移除。 +You save the key in your inventory for future use. +你将钥匙保存在背包中以供将来使用。 + + +You pick up a simple key for the simplest of locks. +你拿起一把简单的钥匙就能打开最简单的锁。 +Simple Keys +简单的钥匙 +You twirl the keys around your finger. +你用手指转动钥匙。 +A handy key for getting out of common handcuffs and shackles. +一把摆脱常见手铐和脚镣的简易钥匙。 +It's not sophisticated enough to work on higher-quality locks, but can be used many times. +它不够复杂,无法用于更高质量的锁,但可以多次使用。 + + +You twirl a key around your finger. +你用指尖轻转钥匙。 +You twirl a magic key around your finger. Careful not to lose it! +你用手指旋转魔法钥匙。小心别弄掉了 +You fidget with a lockpick. +你盘弄着开锁器 + + +You pick up a tool for picking disc detainer locks. +你拿起一个工具来撬开圆盘固定器锁。 +Disc Lock Tool +圆盘锁工具 +You examine the tool. It has a replaceable tip for picking disc detainer locks. +你检查该工具。它有一个可更换的尖端,用于撬开圆盘锁的固定。 +A handy tool for picking disc detainer locks, popularized by a certain pair of professionals. +一种用于撬开圆盘锁的便捷工具,受到某些专业人士的喜爱。 +Features a replaceable head in case an unskilled user breaks it. Requires lockpicks to use. +具有可更换的头部,以防不熟练的用户损坏它。需要有开锁器才能使用。 + + + + +Magical Weapon +魔法武器 + + +Your Submissiveness determines how easily your character can resist the temptations of bondage. +你的顺从等级决定了你的角色抵御束缚诱惑的难易程度。 +Your Security Level is based on your history, and reputation with the MNFCTN. +你的安全等级基于你的历史,和在 MNFCTN 的声誉。 +Your Passion determines how likely you are to lose control of yourself involuntarily. +你的激情决定了你有多大可能不由自主地失去对自己的控制。 +Your Frustration affects how quickly your Passion grows. More Frustration = More Passion +你的懊恼会影响你激情增长的速度。更多的懊恼=更多的激情 + + +Nivah, Goddess of Dragons +Nivah, 龙之女神 +Minivir, Goddess of Alchemy +Minivir, 炼金术女神 +Akasha, Goddess of Magic +Akasha, 魔法女神 +Oriel, Goddess of Technology +Oriel, 科技女神 + + +Ninril, Giver of Life +Ninril, 生命的赐予者 +Matah, Architect of Reality +Matah, 现实铸造者 +Aether, Keeper of the Cosmos +Aether, 宇宙的守护者 +Oblivion, Keeper of Secrets +Oblivion, 秘密的守护者 + + +Arcane Energy is stored by casting spells, up to 100% Max mana. +奥术能量可通过施展法术来储存,奥术能量上限为 100% 法力值上限 +Battle Rhythm is gained by spending stamina through attacks, up to 40 total. +战斗节拍是通过攻击消耗体力来获得的,总共最多 40 点 + + +Arcane Blast +奥术冲击 +When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. Casting this spell consumes it to deal up 25% Max Mana as Arcane damage. Pierces enemies and walls. +当你通过施法消耗法力时,将法力转化储存为 40% 奥术能量,奥术能量上限为 100% 法力值上限。施放此法术会消耗奥术能量,它可造成最多 25% 法力值上限的奥术伤害,能穿透敌人和墙壁。 +Your eyes glow as energy surges from within! +当能量从内部涌动时,你的眼睛会发光! + + +Critical Hit! +暴击! +Super Critical! +超级暴击! +Surprise Bondage! +突袭束缚! +Arcane Energy +奥术能量 +Rhythm +节奏 +You avoid the attack in a flurry of impressive maneuvers! +你在一系列令人印象深刻的动作中避开了攻击! + + +Arcane Barrier +奥术屏障 +When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. When enabled, slowly convert Arcane Energy into a shield at a 1:2 ratio. Max shield is equal to 10% Max Mana. +当你通过施法消耗法力时,将法力转化储存为 40% 奥术能量,奥术能量上限为 100% 法力值上限。启用此法术后,奥术能量将以 1:2 的比例缓慢转化为等于 10% 法力值上限的护盾。 + + +You sense that a high value target is near. +你感觉到一个高价值目标正在靠近。 + + +You push yourself beyond physical limits! +你超越了身体的极限! +You try to push yourself beyond your capabilities and falter... +你试图超越自己的极限,却步履蹒跚…… +You are already at max stamina. +你已经达到最大体力了。 + + +Did the Research +进行研究 +Unlocks advanced tooltips for enemies showing their weaknesses. Also improves hearing by a small amount. +解锁高级提示工具,让敌人显示出他们的弱点。听力也能小幅提高。 + + +Well-Placed Traps +精心布置的陷阱 +Trap spells always critically strike. +陷阱法术总是会造成暴击。 + + +Hard to Catch +难以捕捉 +Adjacent NPCs count as corners/hooks for purposes of escaping. After being restrained, escape speed and power is increased for 12 turns (escape power is increased by +20% plus 2% of Bondage Resist). Removed if you restrain yourself. +相邻的NPC被视为用于逃生的角落/钩子。被束缚后,逃跑速度和力量增加12回合 ( 挣脱能力增加+20%,加上2%的束缚抗性 ) 。如果你自缚的话,就会被移除。 + + +Struggling is improved and escape is quicker! +挣扎能力提升,逃跑速度更快! + + +Akashic Conflux +以太超流 +Costs 100 Arcane Energy and refunds 100 Mana. Bringing memories to life, you call upon your magical knowledge to ignore arm, leg, and verbal spell components for 3 turns. +花费 100 奥术能量并返还 100 法力。将记忆带入生活,无需手臂、腿和言语即可进行施法,持续 3 回合。 +You can ignore Arm, Leg, and Verbal components! +你可以忽略手臂、腿和言语部分! +Magical whisperings circle around you, enabling you to cast spells without components! +魔法低语围绕在你周围,使你能够在无法进行任何行动的情况下施展法术! +You don't have enough Arcane Energy. You need AMNT. +你没有足够的奥术能量。你需要 AMNT。 + + +Chaotic Overflow +混沌溢出 +Draw upon 35 WP to ignore spell components for Duration turns and fully restore your mana. The energy is uncontrollable, so there will be consequences... +利用35 WP,忽略持续时间内的法术组件,并完全恢复你的魔力。能量无法控制,因此会有后果…… +Chaotic energy flows through you!!! +混乱的能量流过你的身体!!! +You try to call forth the chaotic energy, but it isn't interested in you anymore... +你试图召唤混沌能量,但它对你不再感兴趣了…… +You don't have enough Willpower. You need at least 25%. +你的意志力不够。至少需要25%。 +You are already full of chaotic energy! +你已经充满了混沌能量! +Chaotic energy overtakes you, crystallizing into physical form... +混乱的能量笼罩着你,结晶成物理形态…… + + +Chaotic energy flows through you! You have a bad feeling about this... +混乱的能量在你体内流动!你有一种不好的预感…… + + +You find a shimmering macaron. +你发现了一个闪闪发光的马卡龙。 +Heavenly Crunch Macaron +神圣脆脆马卡龙 +You feel holy energy neutralizing the cursed magic permanently. +你感觉到神圣的能量永久地中和了被诅咒的魔法。 +Some say it comes from a bakery in heaven itself. Others say it is simply made from lab-grade materials, and actually tastes awful. +有人说它来自天堂的面包店。其他人则说它只是由实验室材料制成,实际上味道很糟糕。 +Purifies and unlocks a cursed item and/or removes all curses from one currently worn item of your choice. +净化并解除一个被诅咒的物品和/或移除你当前穿着的某件物品上的所有诅咒。 + + +Congratulations! Your continued patronage has earned you|one (1) round trip to the nearest affiliated shop!|Simply step into the portal to continue...|(the Goddess is not responsible for any mishaps or fraud pertaining to the use of this portal) +恭喜! 你的持续惠顾为您赢得了|一 ( 1 ) 次往返最近的附属商店的机会!|只需进入传送门即可继续...| ( 女神对与使用此传送门有关的任何事故或欺诈概不负责 ) +(You step through the portal. An unperturbed shopkeeper greets you.)|Another visitor? Oh, it's just you~ +( 你跨过传送门。一位泰然自若的店主向你打招呼。 ) |又一位访客?哦,原来是你啊~ +(Enter the portal) +( 进入传送门 ) + + +(It's the return portal) +( 这是用于返回的传送门 ) +(You step through the portal and return to your adventure) +( 你穿过传送门并返回你的冒险 ) + + +Select a restraint to remove the curse from +选择要解除诅咒的束缚 +You don't have any restraints that can be removed +你没有任何可以解除的束缚 + + +As you are low on mana, you are unable to store Arcane Energy. +由于你的法力不足,你无法储存奥术能量。 +You are recharging your next mana cost reduction. +你正在为下一次的法力消耗减少充能。 + + + + +Fast Recharge I +快速充能 I +Inner power now recharges after 10 turns instead of 16. +现在内在能力会在 10 回合 ( 而不是 16 回合 ) 后恢复。 + + +Fast Recharge II +快速充能 II +Inner power now recharges after 6 turns instead of 16. +现在内在能力会在 6 回合 ( 而不是 16 回合 ) 后恢复。 + + +Precise Targeting +精确定位 +Your first critical hit on a target is 1.5x more powerful. +你对目标的第一次暴击威力将提高至 1.5 倍。 + + +Surprise Bondage +突袭束缚 +Binding from critical hits is 40% stronger +束缚的暴击强度提高40% + + +High Profile +高调 +Several enemies on each map will be high value, rewarding more gold and items for defeating them but increasing their strength. +每张地图上的几个敌人都会有很高的价值,击败他们会奖励更多的金币和物品,同时也会增强他们的力量。 + + +You apply the RSTR to the ENNME! (AMNT% bound) +你将 RSTR 应用到 ENNME! ( AMNT% 束缚 ) +You untie the ENNME! (AMNT% bound) +你解开了 ENNME! ( AMNT% 束缚 ) ++AMNT Bondage! ++AMNT 束缚 +TargetEnemy receives AMNT binding! +TargetEnemy 受到 AMNT 捆绑! +TargetEnemy is disabled and receives an increased AMNT binding! +TargetEnemy 被禁用并收到附加的 AMNT 捆绑! +TargetEnemy resists bondage and receives a reduced AMNT binding! +TargetEnemy 抵抗捆绑并减少受到的 AMNT 捆绑! + + +Target must be helpless. +目标必须得是完全束缚的。 +You steal the target's disguise! +你窃取了目标的伪装! +You remove your disguise. +你卸下了你的窃取。 +You are already wearing that faction's disguise. +你已经穿上了该派系的伪装。 +Steal Disguise +窃取伪装 +Choose target to steal from +选择要窃取的目标 +Steal's a helpless enemy's clothes, adding a great deal of distraction to her and stealing her disguise for yourself. Until you recast this on yourself, you gain a stealth bonus against members of the same faction. +窃取完全束缚的敌人的衣服,给她增添了很大的性奋值,并窃取了她的伪装。直到你对自己重新施展此技能之前,你对同一阵营的成员都会获得隐身加成。 + + + + +Unstoppable (Ignore status/bondage) +势不可挡 ( 无视状态/束缚 ) +Unflinching (Resist status/bondage) +坚定不移 ( 抵抗状态/束缚 ) +Relentless (Stun resist when stunned) +无情 ( 眩晕时抵抗眩晕 ) +Bulwark (Blocks some explosions) +壁垒 ( 阻挡一些爆炸 ) +Blindsight (See through walls) +盲视 ( 看穿墙壁 ) + + +Mana Harvesting +法力收获 +Defeating or capturing a spellcaster-type enemy recovers 10 arcane energy, reduced to 1 for other humanoids. +击败或捕获施法者类型的敌人可恢复 10 点奥术能量,而其他类人生物则减少至 1 点。 + + +A powerful wind pushes you away!!! +一阵强风把你吹走了!!! + + +Staff of Ropes +绳索权杖 +An enchanted rope kept in check by a magical seal. Surely this won't backfire... +一根被魔法封印控制住的魔法绳子。这肯定不会适得其反... ++20% rope bindings applied. Deals chain damage. Active: Spend 25 mana to unleash the ropes in a wide AoE. ++20% 绳索束缚添加。造成连锁伤害。主动 : ‎花费 25 点法力在大范围内释放绳索。 +You pick up a staff of ropes. Finally, a way to contain its power! +你拿起一根绳子。 终于找到了遏制其力量的方法! + + +Staff of Belts +皮带权杖 +Belts within belts, a fractal belt pattern buckled into oblivion. +皮带套着皮带,一种分形的皮带图案被遗忘了。 ++20% leather bindings applied. Leather spells apply debuffs for 30% longer. Deals chain damage. Active: Pull an enemy toward you and apply a small amount of bondage. ++20% 皮革束缚添加。皮革法术施加减益效果的时间延长 30%。造成连锁伤害。主动 : ‎将敌人拉向你并施加少量束缚。 +You pick up a staff of belts wrapped tightly in leather. +你拿起一根用皮革紧紧包裹的皮带。 + + +Binding Lock +拘束具锁 +A LKTYP lock clasps on to one of your restraints! +LKTYP 锁锁在了你的一个拘束具上! +You are caught in a constricting field! (Dmgdlt) +你陷入了一个狭窄的区域! ( Dmgdlt ) + + +Resin Coating +树脂固化 +A layer of transparent resin derived from Green Latex. Unlike other forms of latex, this one is solid and fixes you in place. +一层源自绿色乳胶的透明树脂。与其他形式的乳胶不同,这种乳胶是固体的,可以将你固定到位。 +It's like you're an art piece! If only you had some way to blast it off... +就像你是一件艺术品!要是你有办法把它炸掉就好了…… + + +You hear a motor whirring... +你听到马达嗡嗡作响... +A bubble of latex surrounds you and inflates, sealing you in! +一个乳胶球围绕着你并膨胀起来,将你密封在里面! +A bubble of latex envelops you! +乳胶泡泡包裹着你! +A ball of latex surrounds you and inflates, sealing around your neck! +一个乳胶球包围着你并膨胀起来,密封住你的脖子! +A ball of latex envelops you! +一个乳胶球包围着你! +The latex around you dampens your attacks, reducing physical damage by 30% and lowering your sight range. +你周围的乳胶会限制你的攻击,减少 30% 的物理伤害并降低你的可视范围。 + + +Latex Ball +乳胶球 + + +...Lab Assistant? +...实验室助理? +You rescue the lab assistant. +你救下了实验室助理。 +The assistant restrains you! (+RestraintAdded) +助理束缚了你! ( +RestraintAdded ) +The assistant gropes you playfully! (DamageTaken) +助理调皮地抚摸你! ( DamageTaken ) +The assistant applies a lock! (DamageTaken) +助理为你上了锁! ( DamageTaken ) +The assistant splashes a solvent in your face, blinding you! (DamageTaken) +助理把溶剂泼到你的脸上,让你致盲了! ( DamageTaken ) +...Glue Technician? +…胶水技师? +You rescue the glue technician. +你救下了胶水技师。 +The technician slaps adhesive restraints onto your body! (+RestraintAdded) +技师将将胶水拘束具粘在了你的身上! ( +RestraintAdded ) +The technician polishes your restraints thoroughly! (DamageTaken) +技师彻底打磨你的拘束具! ( DamageTaken ) +The technician pours glue on you to make you stay still! (DamageTaken) +技师将胶水倒在你身上,让你无法动弹! ( DamageTaken ) +The technician inspects your restraints and adds a lock to spec! (DamageTaken) +技师检查你的拘束具并按规格添加锁! ( DamageTaken ) + + +Lab Assistant +实验室助理 +The assistant envelops herself in her own bubble for protection. +助理将自己包裹在自己的泡泡中以求保护。 + + +Glue Bomb +胶水炸弹 + + +Glue Technician +胶水技师 +The technician trips and glues herself to the floor. +技师绊倒并把自己粘在地板上。 + + +Quite sticky, innit? +很粘,不是吗? + + +Bow: This is a ranged weapon with a weapon ability. +弓 : ‎这是一种具有武器能力的远程武器。 +Magic: Ignores evasion of ghost type enemies, can be used with abilities that require magic weapons. +魔法 : ‎无视幽灵类敌人的躲避,可以与需要魔法武器的技能一起使用。 +Light: Can be used to cut even with bound arms. 50% reduced accuracy penalty from being bound. Can be held in mouth. +轻便 : ‎即使手臂被束缚也可以用来切割。因被束缚而造成的准确度损失降低 50%。可以含在嘴里。 +Offhand +副手 +Offhand: This weapon can be dual-wielded by some classes. +副手 : ‎某些职业可以双持该武器。 +2 Handed +双手 +2 Handed: While wielding this as your primary weapon, you cannot wield an offhand weapon. Also this weapon can't be used while arms are tied. +双手 : ‎当你使用它作为你的主要武器时,你不能使用副手武器。此外,当手臂被绑住时,该武器无法使用。 +Magical Focus +魔法专注 +Magical Focus: Instead of losing accuracy, the stamina cost is increased when distracted. +魔法专注:在分心时,耐力消耗会增加,而不是命中率降低。 +Precision +精确 +Precision: Your arms need to be free to use this weapon. +精确 : ‎你的手臂需要能够自由地使用此武器。 +Hands-Free +双手自由 +Hands-Free: Weapon can be used without free hands. +双手自由 : ‎无需空出双手即可使用武器。 +Shield +盾 +Shield: This weapon is intended for defensive use. +盾牌 : ‎该武器用于防御。 +Heavy: This weapon takes +1 turns to switch to. Cannot be reduced to 0 by perks or upgrades. +重型 : ‎该武器需要 +1 回合才能切换。无法通过技能或升级将其减少至 0。 +Massive +巨大 +Massive: This weapon either stuns or slows you after attacking with it. Handle with care! +巨大 : ‎此武器在攻击后会击晕或减慢你的速度。小心轻放! +Illumination +照明 +Illumination: This weapon is a light source. +照明 : ‎该武器是一个光源。 + + +Dual Wield +双持 +Designate an Offhand weapon to gain passive effects such as a light source, armor, or extra crit damage.|(Must equip Dual Wield spell to equip an offhand weapon) +指定副手武器以获得光源、护甲或额外暴击伤害等被动效果。| ( 必须装备双持法术才能装备副手武器 ) + + +Equip Offhand +装备副手 +Remove Offhand +移除副手 + + +Make a ranged attack with the spear. +用矛进行远程攻击。 +Make a ranged attack with the pike. +用长矛进行远程攻击。 + + +Ranged Attack +远程攻击 + + +Combat Training +战斗训练 +Your training has granted a number of bonuses:|-Weapon stamina cost is reduced by 1% per 10 current WP, up to a max of 40%.|-Slow effects wear off more quickly.|-While you are above 0 WP you gain 1 slow resist. +你的训练给予了许多加成 : ‎|-每 10 点当前意志力,武器消耗体力减少 1%,最多 40%。|-减速效果消失得更快。|-当你的意志力高于 0 时,你将获得 1 点减速抵抗力。 + + +This is your current offhand weapon. +这是你当前副手的武器。 +You are unable to wield this weapon offhand at the moment. +你目前无法立即使用此武器。 +This is your previously held weapon. Click to switch to it. +这是你之前持有的武器。点击即可切换到它。 + + +You can't hold the WPN in your current state. +你无法在当前状态下握住 WPN。 + + +Charge! +冲锋! +Dash and make an attack attack against a target within 2 tiles. If it deals 20% of their current hp in damage, you knock them back and take their place, otherwise they take +15% max hp crush damage from hitting the wall. If the attack misses, you still dash. Costs stamina equal to your sprint cost plus your attack cost. +冲锋并对 2 格内的目标进行攻击。如果它造成了他们当前生命值 20% 的伤害,你会将他们击退并取代他们的位置,否则他们会因撞墙而受到 +15% 最大生命值碾压伤害。如果攻击未命中,你仍然会冲刺。体力消耗等于你的冲刺消耗加上你的攻击消耗。 +You charge at the target! +你向目标冲刺! + + +You need to target an enemy. +你需要瞄准敌人。 +You don't have enough stamina. +你的体力不够。 +You need to be able to sprint. +你需要能够疾跑。 +You need to be able to attack. +你需要能够攻击。 +There is no room to dash! +没有冲刺的余地! + + +Tools of the Trade +专业工具 +Allows you to craft bombs, smoke bombs, flash bombs, and invisibility potions. +允许你制作炸弹、烟雾弹、闪光弹和隐形药水。 + + +(You start having crafty thoughts...)|(Gunpowder can be obtained from chests or Alchemists)|(Ectoplasm can be obtained from ghosts) +( 你开始有了制造的想法... ) | ( 火药可以从箱子或炼金术士那里获得 ) | ( 灵质可以从幽灵那里获得 ) +(You craft a Smoke Bomb) +( 你制作了烟雾弹 ) +(You craft 3 Flash Bombs) +( 你制作了 3 个闪光弹 ) +(You craft a Bomb) +( 你制作了一个炸弹 ) +(You craft an Invisibility Potion) +( 你制作了一瓶隐形药水 ) +(You don't have the required material) +( 你没有所需的材料 ) +(Use 1 Gunpowder to make a Smoke Bomb) +( 使用 1 个火药制作烟雾弹 ) +(Use 1 Gunpowder and one Ancient Crystal to make 3 Flash Bombs) +( 使用 1 个火药和 1 个远古水晶制作 3 个闪光弹 ) +(Use 2 Gunpowder to make a Bomb) +( 使用 2 个火药制作炸弹 ) +(Use 3 Ectoplasm to make an Invisibility Potion) +( 使用 3 个灵质制作隐形药水 ) + + +Gunpowder +火药 +You toss some gunpowder on the floor! No picking it back up now... +你把一些火药丢到地板上!现在没办法再捡起来了... +Highly flammable. Do not eat. +高度易燃。不要吃。 +Creates gunpowder tiles on the target area, which can be ignited. +在目标区域创建火药方块,可以将其点燃。 +You pick up a sack of gunpowder. +你拿起一袋火药。 +You toss some gunpowder on the floor! +你把一些火药扔到地板上! + + +Dual Wield (Rogue) +双持 ( 盗贼 ) +Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or extra crit damage.|Rogues cannot wield heavy or massive weapons in the offhand unless they are multiclass.|(Equip Dual Wield spell to equip an offhand weapon, or use the Items menu) +将其装备到快捷栏并施放,以指定副手武器,从而获得被动效果,例如光源或额外的暴击伤害。|盗贼不能在副手使用重型或巨型武器,除非他们具备多职业技能。|(装备双持法术以装备副手武器,或使用物品菜单。) + + +Dual Wield (Wizard) +双持 ( 法师 ) +Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or spell damage bonuses.|Wizards can only wield magic weapons in the offhand unless they are multiclass, and receive +1 slow level if they wield a 2-handed, heavy, or massive magical weapon in the offhand.|(Must equip Dual Wield spell to equip an offhand weapon) +装备到快捷栏并施放以指定副手武器以获得被动效果,例如光源或法术伤害加成。|巫师只能在副手使用魔法武器,除非他们是多职业的,如果他们挥舞双手,则获得 +1 缓慢等级 副手的大型魔法武器。| ( 必须装备双持法术才能装备副手武器 ) + + +Arcane Tome +奥术之书 +Contains advanced formulas and thrilling tales of thirsty wizards. Can not critically strike. +包含高级咒语和饥渴魔法师的惊险故事。普通攻击无法暴击。 ++5% magic damage. Offhand: Applies passive bonus. ++5% 魔法伤害。副手 : ‎应用被动伤害加成。 +You find a magical tome. +你找到了一本神奇的书。 +Open the book. What can go wrong? +打开这本书。会出现什么问题? + + +Contains a malevolent spirit that wishes only to tie up damsels. Can not critically strike. +蕴含着只想捆绑少女的恶灵。无法暴击。 ++10% binding effectiveness. Offhand: Applies passive bonus. ++10% 束缚效率。副手 : ‎应用被动伤害加成。 +You find a magical tome with a sealed padlock on it. +你发现一本魔法书,上面有一把密封的挂锁。 + + +You know the location of ancient leylines and can draw upon 100 additional mana. +你知道远古地脉的位置,并且可以额外利用 100 点法力。 + + +You don't want to open the book... (need willpower) +你不想打开这本书... ( 需要意志力 ) +Chain Spirit +锁链精神 +You open the book and suddenly a binding aura surrounds you! +你打开书,突然一股束缚的光环包围了你! +Mathematical Error +数学错误 +You open the book to an unfinished page and the magic ink short-circuits! +你打开书,还未读完一页,魔法墨水就短路了! + + +Cracks begin to form in your RestraintName! +你的 RestraintName 开始出现裂缝! +Your RestraintName shatters and falls off! +你的 RestraintName 破碎并掉落! + + +Load Hotbar +加载热键 +Save Hotbar +保存热键 +Clear Hotbar +清空快捷栏 + + +Confirm clearing hotbar? +确定要清空快捷栏吗? + + +Add to Hotbar +添加至快捷栏 + + +Surrender: Your willpower is 0, giving huge penalties to struggling, Block, Evasion, and Bondage Resist. +投降 : ‎你的意志力为0,对挣扎、阻挡、闪避、束缚抵抗给予巨额惩罚。 + + +Unbound Keybindings! --> +存在未绑定的按键! --> +You've not enough keys!!! --> +你没有这么多按键!!! --> +Update your Keybindings!!! --> +你绑定的按键需要更新!!! --> +I have altered the keybindings. Pray I do not alter them further. +我修改了按键绑定。祈祷我不要再次修改它们。 + + +Barricade +路障 +You knock over the barricade! +你把路障推倒了! + + +Anti-Damsel Barrier +防少女屏障 +You disable the barrier! +你关闭了屏障! + + +Barrier +屏障 +You shatter the barrier! +你打破了屏障! + + +Magical Barrier +魔法屏障 +You destroy the barrier! +你破坏了屏障! + + +Mass of Shadow Hands +大量影之手 +You banish the shadow hands! +你驱逐了影之手! +The shadow hands caress you and latch on! (DamageTaken) +影之手爱抚你并紧紧地抓住你! ( DamageTaken ) +The shadow hands caress you and latch on! (+RestraintAdded) +影之手爱抚你并紧紧地抓住你! ( RestraintAdded ) + + +Shadow Chains +暗影锁链 +You break through the chains! +你破坏了锁链! +Conjured Chains +召唤锁链 + + +Magic Damage +魔法伤害 +Physical Damage +物理伤害 +Special Ability +特殊能力 +Ranged +远程 +Staff +权杖 +Toy +玩具 +Teasing +挑逗 + + +A rope trap springs upon you! +绳子陷阱向你袭来! +A ribbon trap springs upon you! +丝带陷阱向你袭来! +A chain trap springs upon you! +锁链陷阱向你袭来! +Magical vines wrap around you suddenly! +魔法藤蔓突然将你缠绕! +A belt trap springs upon you! +皮带陷阱向你袭来! +You find yourself suddenly bound tightly by magic gear! +你发现自己突然被魔法装备紧紧束缚住了! +Magical rubber emerges from the floor and encases you! +神奇的橡胶从地板上冒出来,包裹住你! +Slime appears at your feet and starts encasing you! +粘液出现在你的脚边并开始包裹你! +You find yourself suddenly bound tightly in latex gear! +你发现自己突然被乳胶装备紧紧束缚住了! +A rubber cube rushes out of the floor and engulfs you! +一个橡胶立方体从地板上冲出来,吞没了你! + + +Sharp Claws +锋利的爪子 +While your hands aren't covered, your attacks deal 10 bonus slash damage on hit and you can cut restraints. +当你的手没有被覆盖时,你的攻击击中时会造成 10 点额外的斩击伤害,并且你可以切断束缚。 + + +Powerful Bite +强力咬合 +Gain access to the Bite spell. +获得咬伤法术。 + + +Slime Girl +粘液少女 +You are a shapeshifting slime, granting +100 Glue Resist and can squeeze thru bars. Escaping is easy, but your powers are sealed while wearing cursed or magic restraints. +你是一个变形的粘液,提供 +100 胶体抗性,并且可以穿过栅栏。逃脱很容易,但当你戴着诅咒或魔法拘束具时,你的力量会被封印。 +Cybernetic +控制 +You have mechanical parts, granting +10 Physical Armor, +15 Block, and +10% base physical damage. -100 Electric Resist. +你拥有机械部件,可提供 +10 物理护甲、+15 格挡和 +10% 基础物理伤害。 -100 电击抗性。 +Magic Blood +魔法血脉 +You come from a magical lineage, granting +10 Magic Armor and +10% magic damage. +你来自魔法世家,获得 +10 魔法防御和 +10% 魔法伤害。 +Beast Girl +野兽少女 +You have animalistic features such as a bite spell, -10% attack stamina cost, and 10 slash damage on hit while hands are free. -100 Charm Resist. +你拥有兽性特征,例如咬伤法术、-10% 攻击体力消耗以及在双手空闲时击中时造成 10 次斩击伤害。 -100 魅惑抗性。 +Demon Girl +恶魔少女 +You are related to eldritch entities, granting +50% shadow damage and the ability to teleport between shadows. You are weak to holy restraints and bright light. +你与可怕的实体有联系,给予 +50% 的暗影伤害和在暗影之间传送的能力。你对神圣的束缚和明亮的光芒无能为力。 +You are a minor angel sent to perform a specific task. You are forced to wear a full set of divine restraints, but gain an infinite mana pool, +20 Magic Armor, and +25% magic damage. +你是一位小天使,被派去执行特定任务。你被迫穿戴全套神圣束缚,但获得无限法力池、+20 魔法防御和 +25% 魔法伤害。 +Elven Ancestry +精灵血统 +You were blessed with immortality by Ninril, Goddess of Restoration, granting -50% sprint cost and -30 Physical Resist. While your WP is above 0, you regenerate WP and heal nearby allies. +恢复女神 Ninril 祝福你永生,给予 -50% 冲刺消耗和 -30 物理防御。当你的意志力高于 0 时,你会恢复意志力并治疗附近的盟友。 +Bast's Blessing +猫女神的祝福 +You were granted undead immortality by Bast, granting a bite, claws, catlike senses, and stamina regen scaling with your current WP. Your WP gain is halved and you get -100 Fire Resist. +猫女神赋予你不死不朽的能力,赋予你咬、爪、猫之感官,并根据你当前的意志力调整体力恢复。 你的意志力增益减半并且你获得 -100 火焰抗性。 + + +Minefield +雷区 +Booby traps set by enemies are much more common. +敌人设置的诡雷陷阱要常见得多。 +Fortified +强化的 +Barricades set up by enemies do not expire, and enemies set them up even when not alerted. +敌人设置的路障不会过期,即使没有警报,敌人也会设置路障。 + + +Pass thru helpless allies +绕过完全束缚的盟友 +Pass thru helpless enemies +绕过完全束缚的敌人 +Pass thru neutrals +绕过中立实体 +Pass thru summons +绕过召唤师 +Pass thru shopkeepers +绕过店主 +Pass thru special NPCs +绕过特殊NPC + + +Stop when enemies are first sighted +第一眼看到敌人时停止 +Suppress during combat +战斗中压制 +Step during combat +战斗中的步骤 + + +### 0.1s/turn + +### 1.5s/turn + +### 0.5s/turn + +### 0.01s/turn + +Shadowy Grasp +暗影之握 + + +Magical Tornado +魔法龙卷风 +The tornado blasts you with powerful winds! (DamageTaken) +龙卷风用强大的风吹向你! ( DamageTaken ) +You dispel the tornado! +你驱散了龙卷风! +Shield of Flame +烈焰之盾 +You dispel the shield! +你驱散了盾牌! +Overgrowth +过度生长 +You cut through the overgrowth! +你切断了过度生长! +Wall of Water +水墙 +You dispel the water wall! +你驱散了水墙! +Ice Spikes +冰刺 +You break through the ice! +你冲破坚冰! +Earth Monoliths +大地巨石 +You shatter the monoliths! +你粉碎了巨石! +Gravitational Pull +重力牵引 +The earth emits a deep hum below your feet... +你脚下的大地发出低沉的嗡嗡声…… +Electrified Sphere +带电球体 +You smash the electrified sphere! +你粉碎了带电球体! +A bolt of lightning arcs to you! (DamageTaken) +一道闪电向你射来! ( DamageTaken ) + + +Earth Keeper +大地守护者 +The earth keeper sinks into the wall. +大地守护者沉入墙壁。 +The earth keeper conjures restraints on your body! (+RestraintAdded) +大地守护者召唤出对你身体的束缚! ( +RestraintAdded ) +The earth keeper locks a restraint! +大地守护者锁上了束缚! +The earth keeper knocks you away with a powerful kick! +大地守护者用强力一脚将你踢飞! +The earth keeper massages you gently! (DamageTaken) +大地守护者温柔地为你按摩! ( DamageTaken ) +The earth keeper knocks you away with a strong kick! (DamageTaken) +大地守护者用力一脚将你踢飞! ( DamageTaken ) + + +Flame Keeper +烈焰守护者 +The flame keeper steps away into a fiery portal. +烈焰守护者走开,进入一个炽热的大门。 +The flame keeper grabs you, and volcanic restraints emerge from her armor! (+RestraintAdded) +烈焰守护者抓住你,火焰束缚从她的盔甲中显现出来! ( +RestraintAdded ) +The flame keeper locks a restraint! +烈焰守护者锁上了束缚! +The flame keeper flanks you! +烈焰守护者在你的侧面! +The flame keeper offers a painful caress! (DamageTaken) +烈焰守护者提供了痛苦的爱抚! ( DamageTaken ) +The flame keeper rides forth on a wave of fire! +烈焰守护者乘着火浪前行! + + +Smoldering Trail +阴燃小径 +Fiery Greatsword +炽热巨剑 + + +Tangling Vines +缠结藤蔓 +Enchanted Bubble +魔法泡泡 +A bubble of magic water starts forming around you! +一团神奇的水开始在你周围形成! +The gap in the bubble closes, and you are fully sealed within the bubble! +气泡中的缝隙闭合,你完全密封在气泡中! +Magical water reduces your accuracy and slows you significantly! +魔法水会降低你的命中率并显着减慢你的速度! +You attack twice! +你攻击了两次! +You gain a free move from Combat Maneuvers! +你可以通过战斗机动获得一次自由行动! + + +Access denied. +拒绝访问。 +Facility is under lockdown. +设施已被封锁。 +Please scan ID to continue. +请扫描 ID 以继续。 + + +Security Door +安全门 +You break through the security door! +你破坏了安全门! + + +High Security Door +高安全门 +You knock down the security door! +你把高安全门撞坏了! + + +Blast Door +防爆门 +You knock down the blast door! +你把防爆门撞坏了! + + +You sell the ITM for VLU gp. +你以 VLU gp 的价格出售 ITM。 +You sell #x ITM for VLU gp. +你以 VLU gp 的价格出售 #x ITM。 + + +Directional Vision +定向视觉 +Your vision is reduced except in the direction you are facing. +你只能看见你面对的方向。 +Inertia +惯性 +Turning 180 degrees while moving requires an extra turn +移动时转动180度需要额外的回合 +Heavy Inertia +重型惯性 +Turning 90 degrees while moving requires an extra turn +移动时转动90度需要额外的回合 + + +You turn. +到你了。 +You turn around. +你转身。 + + +Take Command +获取指令 +Unlocks several spells for commanding allies. +解锁几个命令盟友的咒语。 + + +Attention! +注意! +Select allies in an area +选择一个区域中的盟友 +Designate allies in a 3x3 area to follow orders. +指定 3x3 区域内的盟友会遵守命令。 +You select the units. +你选择小队。 + + +Deselect +取消选择 +Deselect allies in a 3x3 area +取消选择 3x3 区域中的盟友 +You deselect the units. +你取消选择小队。 + + +Toggle Selection +切换选择 +Select ally +选择盟友 +Toggle an allied unit's selection status. +切换盟友队伍的选择状态。 +You toggle the unit's selection. +你切换了队伍的选择。 + + +Maneuver +演习 +Select target location +选择目标位置 +Order all selected units to move to the targeted point. +命令所有选定的队伍移动到目标点。 +You order your units to move! +你命令你的小队移动! + + +Hold Position +保持位置 +Selected units do not pursue enemies. +选定的队伍不会追击敌人。 +Free Movement +自由移动 +Cancels Hold Position on selected units. +取消选定队伍的保持位置。 + + +Deselect All +取消全选 +Deselects all selected units. +取消选择所有选定的队伍。 +On Me! +跟我! +All selected units start following you +所有选定的队伍开始跟随你 +Disperse +散开 +All selected units stop following you +所有选定的队伍停止跟随你 +Defensive Order +防御令 +All selected units switch to Defensive mode +所有选定的队伍切换到防御模式 +Aggressive Order +侵略令 +All selected units switch to Aggressive mode +所有选定的队伍切换到侵略模式 + + +Unlock using magic +使用魔法解锁 + + +Include Weapons +包括武器 +Merge Armor +合并盔甲 + + +The NPC does not have enough money left! +NPC 没有足够的钱了! + + +You order the ENMY to come to you. +你命令 ENMY 来找你。 +You order the ENMY to disperse. +你命令 ENMY 离开。 +You deselect all allies and select only the ENMY. +你取消选择所有盟友,只选择 ENMY。 +You remove the ENMY from your party. +你将 ENMY 从你的队伍中移除。 + + +Anti-Magic +反魔法 + + +Long ago, war raged across the globe.|Countless lives were lost fighting over pieces of rock in a vast ocean.|People turned to science, religion, and magic, anything to escape this cruel fate. +很久以前,战争无处不在。|无数人为了争夺茫茫大海中的一块石头而丧生。|人们求助于科学、宗教和魔法,任何一切只为逃避这种残酷的命运。 +Then the archmagus, Sariel Vinlaga, discovered the secret of immortality.|Sharing her research across the globe, she laid the groundwork for an era of peace.|A great civilization arose, where magic and technology flourished. +然后,大法师萨里尔·文拉加 ( Sariel Vinlaga ) 发现了永生的秘密。|她将她的研究成果公之于众,为一个和平的时代奠定了基础。|一个伟大的文明诞生了,魔法和技术在那里蓬勃发展。 +But in the end, Sariel's experiments left her weakened and unable to save herself from death.|Without a leader, the Old Civilization collapsed into tyranny as warlords enslaved thousands.|Refugees fled across the sea in search of a new life, and in time the old empire was forgotten. +但最终,萨里尔 ( Sariel ) 的实验让她变得虚弱无力,无法将自己从死亡中拯救出来。|在没有领袖的统治下,旧文明陷入暴政,军阀奴役了数千人。|难民们漂洋过海寻找新生活,且随着时间的推移,旧帝国被遗忘了。 +Hundreds of years later, a group of adventurers found a lost island full of ancient technology.|Countless visitors now flock to the ruins in search of wealth and wisdom...|...Unaware of the devious secrets sealed within long ago. +数百年后,一群冒险家发现了一座充满古老科技的失落岛屿。|现在,无数外来者涌入废墟寻找财富和智慧...|...却对很久以前被封印在里面的狡猾秘密一无所知。 + + +An item has increased your spell damage! +一件物品增加了你的法术伤害! + + +AMNT ice damage/turn vs. Frozen +AMNT 冰冻伤害/回合 vs. 冰冻 +AMNT shadow bleed (10 turns) +AMNT 暗影吸血 ( 10回合 ) + + +Sealing Talisman +封印符 +You were hit by one of Fuuka's talismans. Fuuka's magic begins sealing your power! +你被 风香(Fuuka)的一枚护身符击中了。 风香(Fuuka)的魔法开始封印你的力量! +You were hit by one of Fuuka's talismans. Fuuka's magic makes you sluggish!! +你被 风香(Fuuka)的一枚护身符击中了。Fuuka 的魔法让你变得迟钝!! +You were hit by one of Fuuka's talismans. Fuuka's magic renders you helpless!!! +你被 风香(Fuuka) 的一枚护身符击中了。 风香(Fuuka) 的魔法让你束手无策!!! +You were hit by one of Fuuka's talisman projectiles. Fuuka's magic is restricting you! +你被 风香(Fuuka) 的一枚护身符射中了。 风香(Fuuka) 的魔法束缚了你! + + +Sealing Shadows +封印暗影 +Shadowy magic is restricting you! +暗影魔法正在束缚你! +A powerful seal holds you in place temporarily!!! +强大的封印将你暂时固定在原地!!! + + +You lock yourself in magical locks! +你把自己锁在魔法锁里! +A collar module comes off with the collar! +项圈模块随项圈一起脱落! + + +Shock Module +电击模块 +A sinister device used to keep unruly wolfgirls in check. +一个邪恶的装置,用来控制不守规矩的狼娘。 +If it works on them, it sure as heck works on you. It has a warning label that says: 'CAUTION: NOT WATERPROOF' +如果它对他们有效,那么对你也同样有效。它有一个警告标签,上面写着 : ‎'注意 : ‎不防水' +Tracking Module +追踪模块 +A homing device used to track unruly pets that wander too far. +一种追踪装置,用于追踪那些不守规矩的宠物防止她们走得太远。 +It has a warning label that says: 'CAUTION: NOT WATERPROOF' +它有一个警告标签,上面写着 : ‎'注意 : ‎不防水' + + +Your RestraintName stops working due to water damage! +你的 RestraintName 由于水导致损坏而停止工作! +Your RestraintName sustains water damage from the high-pressure water! +你的 RestraintName 因高压水而受到水损害! +The RestraintName fizzles out! +RestraintName 失效了! +Your RestraintName short-circuits briefly from the electrical damage! +你的 RestraintName 因电气损坏而短暂短路! + + +Quit Game +退出游戏 + + +Your RSTRNT glows and its seal vanishes as the shrine's energy fills the air. +当神泉的能量充满空气时,你的 RSTRNT 就会发光,它的封印也会消失。 + + +The seal on your RESTRAINTNAME weakens as you simmer just below the edge. +当你在边缘下方小火慢煮时,RESTRAINTNAME 上的密封会减弱。 +Through your determination, you suprress the seal on your RESTRAINTNAME!!! +过你的决心,你压制了 RESTRAINTNAME 上的封印! +The seal on your RESTRAINTNAME weakens as you maintain your composure. +当你保持冷静时,你 RESTRAINTNAME 上的封印就会减弱。 +Through your determination, you suprress the seal on your RESTRAINTNAME. +通过你的决心,你削减了 RESTRAINTNAME 上的封印。 +You lose focus and the seal on your RESTRAINTNAME strengthens! +你失去了注意力,你的 RESTRAINTNAME 上的封印加强了! +The item refuses to budge as you try to take it off. +当你尝试将其取下时,该物品不愿意移动。 + + +The item bears a seal of dark pleasure. You can suppress it by edging yourself. +该物品带有黑暗愉悦的印记。你可以通过让自己处与高潮边缘来抑制它。 + + + + +Saved Outfits +已保存的服装 +Manage this Outfit +管理服装 +Change Pose +改变姿势 +Quick Color Palette +快速调色板 +Item Color +物品颜色 +Item Catalog +物品目录 +Layers: +层 : ‎ +Hex Code: +十六进制颜色码 : ‎ + + +Toggle Struggle UI Mode +切换挣扎 UI 模式 +Change Character Pose +改变角色姿势 +Make Bullets Transparent +使子弹透明 +X-Ray Vision +视觉透视 +Show Quick Inventory +显示快速背包 +Skip Tutorial +跳过教程 +Mod Compat Mode (requires reload) +模组兼容模式 + + +Welcome to Kinky Dungeon! It looks like this is your first time,|Would you like a brief walkthrough of the interface? +欢迎来到淫荡地牢!您似乎是第一次来到这里,|您想了解一下界面的简要介绍吗? +(Leave and Disable Tutorial) +( 离开并关闭教程 ) +(Yes Please!) +( 是的,请! ) +(It'd like a hands-on lesson) +( 想要上一堂实践课 ) + + +Sure! I can lead you through some excercises in a safe and controlled environment.|This way you can figure things out at your own pace.|To start, choose one of the lessons below: +当然!我可以引导您在安全可控的环境中完成一些练习。|这样您就可以按照自己的节奏解决问题。|首先,请选择以下课程之一 : ‎ +(Give me some rope lessons) +( 教我一些有关绳索的课程 ) +(Give me a nice leather outfit) +( 给我一套漂亮的皮衣 ) +(I enjoy the cold embrace of steel) +( 我喜欢钢铁冰冷的拥抱 ) +(I love rubber!) +( 我喜欢橡胶! ) +(On second thought, maybe not) +( 转念一想,也许不需要 ) + + +(About that hands-on lesson...) +( 关于那个实践课...... ) + + +This is you.|Over the course of the game, you will probably get tied up.|The controls to escape are located over your character.|Simply hover the mouse over your character to see them. +这就是你。|在游戏过程中,你可能会被绑住。|逃跑的按钮位于你的角色周围。|只需将鼠标悬停在你的角色上即可看到它们。 +There are four main ways to escape restraints:|Struggling, which is effective against flexible and weaker restraints,|Cutting, which depends on your held weapon and the item's properties,|Unbuckle/Untying, which depends on having free hands,|And Unlocking, which is required before you can Unbuckle. +逃脱束缚有四种主要方法 : ‎|挣扎,这对灵活且较弱的限制有效,|切割,这取决于您持有的武器和物品的属性,|解开扣子/解开,这取决于您是否有可以正常使用的双手,|还有解锁,这是您解开安全扣之前所必需的。 +These are options for how to display your character.|You don't have to worry about them for now,|but when your character is tied up you may find them useful|...or enjoyable. +这些是如何显示您的角色的选项。|您现在不必担心它们,|但是当您的角色被束缚时,您可能会发现它们很有用|...或享受。 +This is the buffs bar.|It shows various values and buffs relating to your character.|You can click the gold triangle to expand it,|Showing additional info about your character. +这是增益栏。|它显示与您的角色相关的各种值和增益。|您可以单击金色三角形将其展开,|显示有关您的角色的其他信息。 +These are the action buttons.|You can use them to perform various actions like closing doors or sprinting.|You can also toggle various settings such as automatically passing|through allies or auto-pathing when there are no enemies nearby.|You can also swap between recently used weapons. +这些是动作按钮。|您可以使用它们执行各种动作,例如关门或冲刺。|您还可以切换各种设置,例如自动穿过队友或在附近没有敌人时自动寻路。|您还可以交换最近使用过的武器。 +These are various submenus.|Your Inventory is used to brows items and use or equip them.|The Journal contains lore, notes, and hints gathered along your journey.|The Journal also contains info on available quests,|and your reputation with various factions. +这些是各种子菜单。|您的背包用于浏览物品并使用或装备它们。|日记包含您在旅程中收集的知识、笔记和提示。|日记还包含有关可用任务的信息,|以及您在各种方面的声誉以及派系。 +This is the status bar, which gives info on your base stats.|Distraction determines how easy it is to cast spells and resist teasing.|Stamina is required to sprint and attack with a weapon.|Mana is used to cast spells. You have what is called a 'Mana Pool,'|which is excess mana that slowly refills you mana bar until it runs out.|Finally, running out of Willpower makes it much harder to escape bondage. +这是状态栏,提供有关您的基本统计数据的信息。|性奋值决定了施放法术和抵抗戏弄的难易程度。|冲刺和使用武器攻击需要体力。|法力用于施放法术。你有所谓的'法力池',|这是多余的法力,它会慢慢地补充你的法力条,直到耗尽。|最后,意志力耗尽会让你更难逃脱束缚。 +This is the hotbar.|Here you will find various spells and customizable actions.|You can customize it through the Spells submenu by clicking on a spell.|You can also add items, armor, and consumables to it from the Inventory. +这是热栏。|在这里您可以找到各种咒语和可自定义的操作。|您可以通过单击咒语通过咒语子菜单对其进行自定义。|您还可以从背包中向其添加物品、盔甲和消耗品。 +Finally, this is where the message log will be.|It provides a written record of what happened the last few turns.|You can click the 'Log' button to expand the log,|Allowing you to look much further back. +最后,这是消息日志所在的位置。|它提供了最近几轮发生的情况的书面记录。|您可以单击 '日志' 按钮来展开日志,|允许您查看更久之前的内容。 +Thats it for the UI.|If you want a more hands on tutorial, enter the portal to the top right,|near the training dummies.|You can click on NPCs (such as the ghosts in this room) to talk to them. +UI 就是这样。|如果您想要更多的实践教程,请进入右上角的门户,|靠近训练假人。|您可以单击 NPC ( 例如这个房间里的鬼魂 ) 与他们交谈。 + + +Game +游戏 + + +Search ITMNS: +搜索 ITMNS : ‎ +Search Items: +搜索物品 : ‎ +Search Spells: +搜索法术 : ‎ + + +Free +免费 +Disarmed!!! +缴械!!! +Show Buffs and Stats +显示增益和统计数据 + + +Remove Devotion +停止奉献 +Devote Yourself +全心投入 +Pray for Assistance +祈求帮助 +This shrine bears a request carved in stone: +这座神泉的石碑上刻着这样的祈求 : ‎ +Accept the Quest +接受任务 + + +You accept the goddess' quest. +你接受了女神的任务。 +You cannot accept that quest right now. +你现在不能接受此任务。 + + +Removes your devotion from this goddess. +不再对这位女神奉献自己。 +You are not devoted to this goddess. +你并不忠诚于这位女神。 +Guarantees a quest from this goddess on every floor. +保证每层都有这位女神的任务。 +You are already a devotee of this goddess. +你已经忠诚于这位女神了。 +Offer gold in exchange for help. Destroys the shrine. +提供金币以换取帮助。会破坏神泉。 +Ask for help without offering gold. +寻求帮助而不提供金币。 +You have already prayed at this shrine. +你已经在这座神泉祈祷过。 +Listen to what the Goddess asks of you. +听听女神对你的要求。 +Accept the Goddess' quest. +接受女神的任务。 +Drink the mana in the shrine. Can be done once. +喝神泉里的法力。可以喝一次。 +Bottle the mana in the shrine for later. Can be done once. +将法力装在神泉中以供稍后使用。可以做一次。 + + +Cancel Quest +取消任务 +Cancels the quest. You will not be penalized. +取消这个任务。你不会受到处罚。 +You can't cancel this quest. +你无法取消此任务。 +You have no quests currently. +你目前还没有任务。 + + +A new quest has been added to your Journal. +一个新任务已添加到你的日记中。 + + +Find the dressmaker's prized dress and wear it in front of her. +找到裁缝师最珍视的裙子并在她面前穿上。 +Rescue the bandit from false imprisonment. +将强盗从非法监禁中解救出来。 +Teach some unruly maids a lesson. +教训一下那些不守规矩的女仆。 +Defeat a rebel leader and show them their place. +击败叛军领袖并向他们展示自己的地位。 +Help the student acquire a scroll! +帮助学生获得卷轴! +You are being chased by a band of relentless poachers. +你正被一群无情的偷猎者追赶。 + + +Slay the Rope Kraken. +杀死绳妖。 +You did not do your quest! The Goddess has decided to punish you. +你没有完成你的任务!女神决定惩罚你。 +You have pleased the Goddess. +你取悦了女神。 +The Goddess calls you a good girl. +女神夸你是个好女孩。 +Rescue some alchemists from their own experiment. +从他们自己的实验中拯救一些炼金术士。 +Stop rebels from making a pact with primordial beings. +阻止叛乱分子与原始生物签订契约。 +Decommission some malfunctioning drones. +停用一些出现故障的无人机。 + + +Resolve a dispute between elves and catgirls by tying up both sides. +通过捆绑双方来解决精灵和猫女之间的争端。 +Repel a planar incursion by a dangerous demon. +击退危险恶魔的外域入侵。 +Stop some witches from performing a dubious summoning ritual. +阻止一些女巫进行可疑的召唤仪式。 +Defeat a congregation of the Shadow Clan. +击败暗影族的教徒。 + + + + +The Goddess grants you knowledge of SpellLearned! +女神授予你法术学习知识! +You Goddess grants you +AMOUNT spell points! +你女神授赐予你 +AMOUNT 法术点! +The Goddess bestows a WeaponAcquired on you! +女神赐予你一件 WeaponAcquired! +The Goddess grants you a ArmorAcquired! +女神赐予你一件 ArmorAcquired! +The Goddess gives you a heavenly pastry. +女神给了你一份天堂般的糕点。 +The Goddess awards you an ancient key of great importance. +女神授予你一把非常重要的古老钥匙。 + + +Game Setup +游戏设置 +Challenge Settings +挑战设置 + + + + +Challenge Settings: +挑战设置 : ‎ + + +Advanced +高级 +Expert Tools +专家工具 + + +Exits locked!|Find NUMBER keys! +出口锁上了|找到 NUMBER 把钥匙! +Got the keys! +拿到钥匙了! +Find the keys hidden in the level. Enemies can steal the keys if you aren't careful. +找到隐藏在关卡中的钥匙。敌人可能会在你不注意的时候偷走钥匙。 +There seems to be a locked high-security door. Looks like you need keys to open it. +似乎有一扇被锁住的高安全门。看来你需要钥匙才能打开它。 +Exits locked!|Find a lever! +出口锁上了|找到一个拉杆! +Exits unlocked! +出口已解锁! +Lever Hunt +寻找拉杆 +Find the lever hidden in the level to unlock the door. +找到隐藏在关卡中的拉杆来解锁下一层的门。 +There seems to be a locked high-security door. Looks like you need to pull a lever to open it. +似乎有一扇被锁住的高安全门。看起来你需要拉动拉杆才能打开它。 +Exits locked!|Find control panel! +出口锁上了|找到控制面板! +Panel Hunt +逃生方法 : ‎寻找面板 +Find the control panel hidden in the level to unlock the door. +逃生方法 : ‎找到隐藏在关卡中的控制面板来解锁下一层的门。 +There seems to be a locked high-security door. Looks like you need find a control panel to open it. +似乎有一扇被锁住的高安全门。看来你需要找到一个控制面板才能打开它。 +BOSS ROOM +BOSS 房 +BOSS ROOM CLEARED! +BOSS 房已清空! +### Boss + +Defeat the boss to unlock the door. You can also unlock it by losing to the boss and being penalized. +击败Boss即可打开门。你也可以通过输给Boss并受到惩罚来解锁它。 +There seems to be a locked high-security door. Looks like you need to defeat the boss to open it. +似乎有一扇被锁住的高安全门。看来你需要击败Boss才能打开。 +Exits locked!|Defeat NUMBER TYPE! +出口已锁定!|需击败 NUMBER 名 TYPE! +Quota Reached! +已达到要求! +Bounty +赏金 +Defeat the specified targets to unlock the door. +击败指定目标即可解锁下一层的门。 +There seems to be a locked high-security door. Looks like you need to defeat the targetted enemies to open it. +似乎有一扇被锁住的高安全门。看来你需要击败目标敌人才能打开它。 +Exits locked!|Defeat TYPE! +出口已锁定!|需击败 TYPE! +Miniboss defeated! +小型boss已击败! +Dangerous Bounty +危险的赏金 +Defeat the specified strong enemy to unlock the door. +击败指定强敌即可解锁下一层的门。 +There seems to be a locked high-security door. Looks like you need to defeat the miniboss to open it. +似乎有一扇被锁住的高安全门。看来你需要击败小型Boss才能打开它。 +Exits locked!|Open NUMBER Chests! +出口已锁定!|需要打开 NUMBER 个宝箱! +Chest Hunt +寻找宝藏 +Unlock the specified number of chests to unlock the door. +解锁指定数量的宝藏即可解锁下一层的门。 +There seems to be a locked high-security door. Looks like you need to open more chests to open it. +似乎有一扇被锁住的高安全门。看来你需要打开更多的箱子才能打开它。 +Exits locked!|Accept NUMBER Quests! +出口已锁定!|需要接受 NUMBER 个任务! +Quest Hunt +寻找任务 +Accept the specified number of goddess quests to unlock the door. +接受指定数量的女神任务即可解锁下一层的门。 +There seems to be a locked high-security door. Looks like you need to accept more quests to open it. +似乎有一扇被锁住的高安全门。看来你需要接受更多的任务才能打开它。 +Exits locked!|Trigger NUMBER Traps! +出口已锁定!|需要触发 NUMBER 个陷阱! +Trap Hunt +寻找陷阱 +Trigger the specified number of traps to unlock the door. +触发指定数量的陷阱即可解锁下一层的门。 +There seems to be a locked high-security door. Looks like you need to trigger more traps to open it. +似乎有一扇被锁住的高安全门。看来你需要触发更多陷阱才能打开它。 +Room bugged. Please Report. +房间出现问题。请反馈。 + + +This door failed to load and cannot be opened. Please report this bug to Ada with a save code. +此门加载失败,无法打开。请向 Ada 报告此错误及存档码。 + + +Exit sealed!|Find the lair! +出口封死了!|找到巢穴! +Sigils erased! +符文被抹去了! +Dragon defeated! +龙战败了! +Draconic Seal +龙之封印 +A dragon has sealed the entrance. Defeat the dragon, or erase the sigil from her lair. +一条巨龙封死了入口。击败巨龙,或者擦除她巢穴中的符文。 +A draconic spell keeps the door sealed. You will have to confront its owner. +一条龙的咒语将门封住了。你必须面对它的主人。 + + +Exits locked!|Destroy NUMBER Servers! +出口被锁上了!|摧毁NUMBER服务器! +Security System Compromised! +安全系统被攻破了! +Clearance Granted! +批准通过! +Destroy Nevermere Servers +摧毁Nevermere服务器 +Destroy Nevermere servers to unlock the door. +摧毁Nevermere服务器以解锁门。 +Nevermere Inc. placed a computerized lock on the door. Destroy the security servers to pass. +Nevermere Inc. 在门口安装了一个电子锁。摧毁安全服务器以通过。 +Nevermere Server +Nevermere 服务器 +Server smashed! +服务器崩溃了! + + +Destroy Drone Servers +摧毁无人机服务器 +Destroy Drone Node Servers to unlock the door. +摧毁无人机节点服务器以解锁大门。 +The path forward is controlled by several ancient Drone Servers. Destroy them. +前进的道路掌握在几个古老的Drone服务器手中。摧毁它们。 +Drone Server Node +无人机服务器节点 +Drone node destroyed! +无人机节点被摧毁! +Rusty Server Node +生锈的服务器节点 +loud beeping... +尖叫声... + + +(Cursed) +( 诅咒 ) +(Purified) +( 净化 ) +of Agility +敏捷 +Precise +精确 +Silent +沉默 +Blizzard +风暴 +of Warding +守卫 +of Freedom +自由 +of Resistance +挣扎 +of Power +力量 +Entuned +协调 +Draining +排空 +of Echoes +回声 +Infused +注入 +### Explosive + +### Flaming + +Focusing +专注 +of Empowerment +赋权 +of Destruction +毁灭 + + +Phase Dance +相位之舞 +For 4 turns, your movement does not advance time. Attacking or casting counts as one move and passes time as normal. +在 4 回合内,你的移动不会使时间提前。攻击或施法算作一招,并正常流逝时间。 +You are F A S T +你 超 越 了 光 速 + + +Double Accel +双重加速 +Slow down time by 1/2 for 10 turns (world time). Stamina regens 50% slower. +时间减慢 1/2,持续 10 回合 ( 世界时间 ) 。体力恢复速度减慢 50%。 +Time is slowed by 2x +时间减慢了 2 倍 +Triple Accel +三重加速 +Slow down time by 1/3 for 10 turns (world time). Stamina regens 75% slower. +时间减慢 1/3,持续 10 回合 ( 世界时间 ) 。体力恢复速度减慢 75%。 +Time is slowed by 3x +时间减慢了 3 倍 +Quad Accel +四重加速 +Slow down time by 1/4 for 10 turns (world time). Stamina does not regen. +时间减慢 1/4,持续 10 回合 ( 世界时间 ) 。体力不会恢复。 +Time is slowed by 4x +时间减慢了 4 倍 +Total Accel +完全加速 +Stop time 10 turns (world time). Stamina does not regen. +在 10 回合内暂停时间 ( 世界时间 ) 。体力不会恢复 +Time has come to a halt... +时间已经静止了…… + + +Time slows down by 2x! +时间慢了 2 倍! +Double Accel! +双重加速 +Time slows down by 3x! +时间慢了 3 倍! +Triple Accel! +三重加速! +Time slows down by 4x! +时间慢了 4 倍! +Quad Accel! +四重加速! +Time has ceased to pass. +时间已经停止流逝。 +Total Accel! +完全加速! + + +You begin to move at lightning speed! +你开始以闪电般的速度移动! +ACCEL BEGIN! +加速开始! +Not enough mana. +法力不够。 +You need to free your legs. +你需要先让你的腿可以自由活动。 + + +Swap +交换 +Choose a target with a clear line of sight to you and switch places with them. +选择一个视野清晰的目标并与他交换位置。 +You point at the target and swap places with them! +你指向目标并与他交换位置! +You point at the target and try tp swap places, but they resist! +你指向目标并尝试交换位置,但他拦截了! +You point at the target and try tp swap places, but they resist and the spell fails! +你指向目标并尝试交换位置,但他们抵抗并且咒语失败! +Choose target to swap with +选择要交换的目标 + + +The ENMY blocked your attack, negating it entirely! +ENMY 格挡了你的攻击,将其完全抵消! +The ENMY blocked your attack, reducing the damage by PCNT%! +ENMY 格挡了你的攻击,使伤害减少了 PCNT%! +The ENMY remains unscathed after putting up a strong defense! +ENMY 顽强防御后毫发无伤! +The ENMY puts up surprising resistance, reducing the damage by PCNT%. +ENMY表现出惊人的抵抗力,将伤害减少了 PCNT%。 + + +no damage +无伤 + + +Raise Defenses +提高防御 +Spend 90 stamina to shield yourself from damage equal to your Block. Lasts 10 turns or until you attack. +花费 90 点体力来保护自己免受等同于格挡的伤害。持续10回合或直到你攻击为止。 +Evasive Maneuvers +机动躲避 +While active, you evade almost all attacks, but your stamina is drained by 50 per turn plus 10 per slow level. The base stamina cost is reduced by your Evasion. +开启时,你可以躲避几乎所有攻击,但你的体力每回合会消耗 50 点,加每减速等级 10 点。基础体力消耗会因躲避而减少。 +Break Free +挣脱 +Consume 20 Battle Rhythm to increase escape power by +20% plus 1% of Bondage Resist. Lasts 60 turns or until your willpower reaches 0. +消耗20个战斗节拍,挣脱能力+20%,束缚抵抗增加1%。持续60回合或直到你的意志力达到0。 +Problem Solving +解决问题 +While active, struggling takes an additional 10 turns, but escape power bonuses from tools and buffs is increased by +(25 + 20% Bondage Resist)% +启用时,挣扎需要额外10回合,但来自工具和增益的挣脱能力加成会获得+(25+20%束缚抵抗)% + + +You run out of strength to keep dodging... +你已经没有力气继续躲避了…… +You can't muster the strength to dodge right now... +你现在还没有力气躲闪…… +You prepare to dodge!!! +你准备躲避!!! + + +Your expertise and skill provides you with additional tool effectiveness! (+AMOUNT%) +你的专业知识和技能为您提供了额外的工具效率! ( +AMOUNT% ) + + +You raise your defences! +你提高防御! +Your defenses are raised! +你的防御力提高了! + + +You don't have the will to break free. +你没有挣脱束缚的意志。 +You don't have enough Battle Rhythm. You need 20. +你的战斗节拍还不够。你需要20。 +You channel your fighting spirit into your desire for freedom! +你将你的战斗精神转化为你对自由的渴望! +Your struggle power is greatly increased!!! +你的挣脱能力大大增强!!! + + +The teleportation partially succeeds due to an obstruction, placing you near the intended point. +由于阻碍,传送部分成功,使你接近预定地点。 +The teleportation fizzles due to obstruction. +由于阻碍,传送失败。 +Confirm +确认 +Confirm and OVERWRITE SAVE +确认并覆盖存档 +What is your name? +你叫什么名字? + + +Enrage +狂暴 +Scream loudly, causing nearby enemies to investigate and increasing Battle Rhythm by 10. Has a 100 turn cooldown. +大声怒吼,使附近的敌人调查并增加10的战斗节拍。有100回合的冷却时间。 + + +You shout loudly and shake your fist at the sky! (+10 BR) +你大声喊叫,对着天空挥舞着拳头! ( +10 BR ) +Mmmph! (You can't shout while gagged) +Mmmph! ( 塞住嘴时不能大声喊叫 ) +You are plenty mad enough as is. +你已经够疯狂的了。 +You are too tired to rage. Perhaps try a warm cozy bed instead? +你太累了,气不起来。也许可以换一张温暖舒适的床? + + +turns +回合 + + +Your shield absorbed AMNT damage. +你的护盾吸收了 AMNT 的伤害。 +You are currently shielded from damage and some spells. +你目前被保护免受伤害和一些法术的伤害。 +No offhand weapon set. Activate the spell in your hotbar to set one. +没有副手武器组。激活快捷栏中的咒语来设置一个。 + + + + +Flash Portal +闪光传送门 +After channeling for 2 turns, teleport to a nearby location (including into darkness). All adjacent creatures are teleported with you, in random order. +引导 2 回合后,传送到附近的位置 ( 包括进入黑暗 ) 。所有相邻的生物都会以随机顺序与你一起传送。 +You call upon a misty portal to transport you and nearby creatures! +你召唤一个迷雾传送门来传送你和附近的生物! + + +Transportation Portal +运输传送门 +After channeling for 3 turns, teleport to a nearby location (including into darkness). Transports only allies, but they are stunned for the duration. +引导 3 回合后,传送到附近的位置 ( 包括进入黑暗 ) 。只传送盟友,但他们会在持续时间内被眩晕。 +You call upon a misty portal to transport you and your allies! +你召唤一个迷雾传送门来传送你和你的盟友! + + +Banishing Portal +放逐传送门 +After channeling for 3 turns, teleport all adjacent creatures to a point you can see. Does not teleport yourself. +引导 3 回合后,将所有相邻生物传送到你可以看到的位置。不会传送自己。 +You call upon a misty portal to transport those around you! +你召唤一个迷雾传送门来传送你周围的人! + + +Rift +裂缝 +Tearing a rift in space, you teleport to a location (including into darkness). Leaves behind a rift for 4 turns, which enemies can follow you through. +撕裂空间裂缝,你传送到一个位置 ( 包括进入黑暗 ) 。留下一条裂缝 4 回合,敌人可以跟踪你穿过裂缝。 +You tear open a hole in space and step through! +你撕裂了一个空间裂缝并跨了过去! + + +Shadow Dance +阴影之舞 +While standing in a shadowed location, you can teleport to a nearby shadowed location. You can also teleport adjacent to shadow creatures. +站在阴影位置时,您可以传送到附近的阴影位置。你还可以传送到暗影生物附近。 +You slip between the shadows... +你在阴影之间滑行…… +Choose a shadow +选择阴影 + + +Teleportation Circle A +传送圈 A +When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. When learned, unlocks teleportation circle B and C as well. +当施放于某个点时,会创建一个传送圈。当对自己施放时,引导 10 回合,将自己和附近的盟友传送到传送圈。可通过学习解锁传送圈 B 和 C。 +You begin a teleportation ritual... +你开始了传送仪式…… +Choose a location to put a teleportation circle, or yourself to teleport to the created circle. +选择放置传送圈的位置,或者选择传送到你自己创建的圆圈。 +Teleportation Circle B +传送圈 B +When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. +当施放于某个点时,会创建一个传送圈。当对自己施放时,引导 10 回合,将自己和附近的盟友传送到传送圈。 +Teleportation Circle C +传送圈 C + + +Nature Spirit +自然精灵 +The nature spirit returns to the earth from whence it came. +自然精灵回到了它所来的大地。 + + +Vine Bolt +藤蔓箭 + + +Gunslinger +枪手 +Weapons abilities and other abilities that cost charge contribute 20% of their cost to Battle Rhythm. +将武器和其他技能消耗的体力的 20% 转化为战斗节拍。 +Effortless Assault +连招 +Weapon stamina cost is reduced by a percentage equal to your Battle Rhythm. +战斗节拍将等比例减少武器攻击所需要的体力。 + + ++50 Evasion from using Phase +使用相位时 +50 闪避 + + +Blade Dance +剑舞 +Costs 60 stamina to dash to an adjacent spot. If you are holding a physical weapon, deals cleave damage to nearby enemies equal to 50% weapon damage. If you have a Light offhand weapon, deal 75% of its damage as well. +冲向邻近地点并消耗 60 点体力。如果你持有物理武器,会对附近的敌人造成相当于 50% 武器伤害的劈砍伤害。如果你有一把轻型副手武器,也会造成 75% 的伤害。 +You spin towards a location, slashing at nearby enemies! +你冲向一个位置,猛击附近的敌人! + + +The Shadow Within +阴影附身 +Shadow Dance no longer requires you to be in shadow in order to dash to another shadow, but the mana cost is doubled when doing so. +阴影之舞不再需要你处于阴影中才能冲向另一个阴影,但这样做时法力消耗会加倍。 + + + + +Summon Holy Orb +召唤神圣球体 +Select where to put the holy orb (cannot place on occupied squares) +选择放置神圣球体的位置 ( 不能放置在已占用的方块上 ) +Create a stationary holy orb that lasts indefinitely and heals allies. It also fires blinding bolts at enemies within its aura. If you let go of yourself near a holy orb you are immediately punished. Should not be placed within 8 tiles of each other. +创建一个永久持续并治愈盟友的固定神圣球体。它还会向其光环内的敌人发射致盲箭矢。如果你在圣球附近高潮,你会立即受到惩罚。彼此之间不应放置在 8 格以内。 +A holy orb descends, blessing you with its roundness. +一颗神圣的球体降临,赐予你圆满的祝福。 +You call upon the root of all enlightenment! +你召唤一切觉悟的根源! + + +Holy Orb +神圣球体 +The holy orb returns to its place in the sky. +神圣球体回到了天空中的位置。 + + +Holy Bolt +圣箭 + + +The holy orb observes your lack of discipline, and issues a punishment. +神圣球体观察到你缺乏纪律,并发出惩罚。 + + +Divine Chastity Belt +神圣贞操带 +A chastity belt forged in holy light. Only a Goddess' will can release you. +圣光锻造的贞操带。只有女神才能释放你。 +There is no way even an angel can free herself. Its divine aura causes vibrators to cease right before you go over the edge. +即使是天使也无法解脱。它神圣的光环会让振动器在你失控前停止。 +Your Divine Chastity Belt causes the vibrators to stop. +你的神圣贞操带会使振动器停止。 + + +A chastity belt forged in holy light. Only the will of a Goddess will release you! +圣光锻造的贞操带。只有女神才能释放你! + + +You find a heavenly chastity belt. Who could it be for? +你找到了一条天堂贞操带。可是给谁呢? + + +Divine Chastity Bra +神圣贞操文胸 +A chastity bra forged in holy light. Only a Goddess' will can release you. +圣光锻造的贞操文胸。只有女神才能释放你。 +There is no way even an angel can free herself. Its divine aura prevents you from pleasuring yourself. +即使是天使也不可能解放自己。它的神圣光环让你无法取悦自己。 +Your Divine Chastity Bra causes your whole body to go numb. +你的神圣贞操文胸会让你整个身体变得麻木。 + + +A chastity bra forged in holy light. Only the will of a Goddess will release you! +圣光锻造的贞操文胸。只有女神才能释放你! + + +You find a heavenly chastity bra. Who could it be for? +你找到了一件天堂般的贞操文胸。可以给谁呢? + + +Heavenly Chastity Belt +天堂贞操带 +There is no way even an angel can free herself. Its divine aura causes vibrators to dampen right before you go over the edge. +即使是天使也无法解脱。它神圣的光环会让振动器在你失控前停止。 +Your Divine Chastity Belt magically dampens the vibrations just enough to edge you. +你的神圣贞操带神奇地减弱振动,足以让你感到紧张。 + + + + +Heavenly Chastity Bra +天堂贞操文胸 +There is no way even an angel can free herself. Its divine aura converts self-pleasure to stamina. +即使是天使也无法解脱。它的神圣光环将自我愉悦转化为体力。 +The divine aura drains the pleasure from your self-pleasuring and converts it to stamina. +神圣的光环会耗尽你自慰的快乐,并将其转化为体力。 + + + + + + +Magic Arm Belts +手臂束带 ( 附魔 ) +Highly secure belts enchanted with magic. +高度安全的束带,带有魔法。 +Magic Leg Belts +腿部束带 ( 附魔 ) +Magic Ankle Belts +脚踝束带 ( 附魔 ) +The Liquid Metal starts engulfing you! +液态金属开始吞噬你! +The Liquid Metal explodes and covers you! +液态金属爆开并包裹住你! +The Liquid Metal takes advantage of your status and engulfs you! +液态金属正在吞噬你! + + +Silver Burst +金属爆发 +Select a liquid metal tile +选择液态金属块 +Target a liquid metal tile. After 3 turns, it erupts, spreading more liquid metal and engulfing any nearby creatures. Deals DamageDealt crush damage and applies 80 points of metallic binding. +对液体金属生物释放,3 回合后它将爆发,扩散出更多液态金属并吞噬附近的任何生物。造成 DamageDealt 点碾压伤害并增加 80 点金属拘束。 +A powerful explosion simmers beneath the surface...' +地表下酝酿着一场强烈的爆炸……” + + +The ground shakes as a huge wall of liquid metal approaches! +随着一堵巨大的液态金属墙的逼近,地面开始震动! +Liquid Metal Cube +液态金属方块 +The liquid metal cube dissolves into a huge pile of glittering dust. +液态金属方块溶解成一大堆闪闪发光的灰尘。 +The liquid metal cube engulfs you and squeezes tightly! (DamageTaken) +液态金属方块将你吞没并紧紧挤压! ( DamageTaken ) +The liquid metal cube engulfs your body and hardens, taking the form of restraints! (+RestraintAdded) +液态金属方块吞没你的身体并变硬,变成束缚的形式! ( +RestraintAdded ) + + +Skeleton Archer +骷髅射手 + + +Cursed Arrow +诅咒之箭 + + +Because your hands are unavailable, you kick the target instead. +因为你的手无法正常活动,所以你只能踢目标。 + + + + +Your former owners are looking for you across the seven planes. +你的前主人正在七界寻找你。 + + +A local business is missing one of their models, and will stop at nothing to find her. +当地一家企业失去了一名模特,并且会不惜一切代价寻找她。 +The Doll Shoppe +娃娃店 +Elemental Slavers +精灵奴隶 + + +Your duty as a maid is to keep the place clear of dirt and other hazards. +作为女仆,你的职责是保持这个地方没有污垢和其他危险。 +Dirt Pile +土堆 +You clear out the dirt pile +你将土堆清理干净 +A ENMY was lurking inside the dirt pile! +土堆里潜伏着一名 ENMY! +You skipped your duty and left some dirt missing in the last level! +你玩忽职守,在最后一个楼层中遗漏了一些泥土忘记清理! + + +The Dollmaker does not take no for an answer. +玩偶师不会接受 '不' 的回答。 +Fuuka's shrine maidens would like to have a word with you. +风香(Fuuka)的巫女们想和你说句话。 +Your instructor will meet with you at regular intervals for further training. +你的导师将定期与你会面以进行进一步训练。 + + +Hogtied! +捆绑 +Experience a comprehensive rope bondage experience. +体验全面的绳索束缚体验。 + + + + +Receive the following restraints: +受以下拘束 : ‎ +You will be bound with some form of restraint. +你将受到某种形式的束缚。 + + +Gag Geist +恶作剧幽灵 +The gag geist goes silent. +恶作剧幽灵沉默了。 +The gag geist teases you playfully!! (DamageTaken) +恶作剧幽灵顽皮地逗你!! ( DamageTaken ) +The gag geist gags the girl with a ghastly grimace! (+RestraintAdded) +恶作剧幽灵做了一个可怕的鬼脸,堵住了女孩的嘴! ( +RestraintAdded ) + + +Poltergeist +鬼怪 +The poltergeist goes silent. +捣蛋鬼沉默了。 +The poltergeist gropes and teases you playfully, exhausting your stamina! (DamageTaken) +捣蛋鬼顽皮地摸索和戏弄你,耗尽你的体力! ( DamageTaken ) +The poltergeist binds you with... something? (+RestraintAdded) +捣蛋鬼用……什么东西把你束缚住了? ( +RestraintAdded ) + + +Invisible Gag +隐形口塞 +It's a gag, but invisible! +这是个口塞,但是是隐形的! +You wonder what color it is. +你很好奇它是什么颜色。 + + +Invisible Blindfold +隐形眼罩 +It's a blindfold, but invisible! +这是个眼罩,但是是隐形的! +How exactly is this supposed to work? +这究竟是如何做到的? + + +Invisible Armbinder +隐形单手套 +It's an armbinder, but invisible! +这是个单手套,但是是隐形的! + + +Invisible Legbinder +隐形束腿套 +It's an legbinder, but invisible! +这是个束腿套,但是是隐形的! +This is starting to get cruel... +这一切开始变得残酷…… + + +Strangely dressed zombies start approaching you!! +穿着奇异的僵尸开始向你靠近!! +A floating chastity item appears and starts flying toward you! +一个漂浮的贞洁物品出现并开始朝你飞来! +You hear moaning as the statues start to move... +当雕像开始移动时,你会听到呻吟声…… +Devious tomes emerge from the bookshelves! +书架上出现了狡猾的书籍! +Armed mushrooms emerge from the ground to defend their home! +武装菇从地底冒出来保卫家园! +Playful ghosts slip through the walls, giggling to themselves! +顽皮的幽灵穿过墙壁,咯咯地笑! +Ancient drones drop from the ceiling and come to life! +古老的无人机从天花板上掉下来并重新开始运作! +You were always being watched... +你一直被人注视着... + + +You find a store of gunpowder! +你发现了一堆火药! + + +Explosive Barrel +炸药桶 + + +The explosive barrel falls apart and drops its gunpowder. +炸药桶散开,里面的火药掉了出来。 +The explosive barrel catches fire and explodes! +炸药桶着火并爆炸! + + +The item demands copious mana, more than you can supply. You'll have to tie up a mage. +该物品需要大量法力,超出了你的供应能力。你必须绑住一个法师。 +The cursed seal glows and pulsates as you struggle fruitlessly. +当你徒劳地挣扎时,被诅咒的封印会发光并脉动。 +The curse has been lifted through judicious application of spellcasters. +通过施法者的明智运用,诅咒已被解除。 +The cursed item drains all of the caster's mana. It demands more. +被诅咒的物品会耗尽施法者的所有法力。它需要更多。 + + +Punishment Suit +惩罚服 +A tool used by Nevermere on the most difficult and recalcitrant wolfgirls. +“奈文米尔”用来对付最难对付、最顽固狼娘的工具。 +Designed to contain superhuman strength, struggling out of this would be a major feat. +旨在容纳超人的力量,从中挣扎出来将是一项伟大的壮举。 + + +Shield of (un)Clarity +(不)清晰之盾 +Channel your clarity of mind into a powerful shield, filling your distraction bar completely and granting a temporary shield equal to 50% of the DP generated. 10% of the DP gained is gained as Desire, which prevents DP decaying below a certain point. +将你清晰的头脑转化为强大的护盾,完全填满你的性奋栏,并授予相当于所生成性奋值50% 的临时护盾。 生成性奋值的10% 作为欲望值获得,这可以防止性奋值衰减到某个点以下。 +You form a... distracting mental barrier, shielding yourself for AMNT damage!!! +你形成了一个...性奋不已的精神屏障,保护自己免受 AMNT 点伤害! +You are too distracted to form a mental barrier... +你性奋值太高,无法形成精神屏障…… +You have the mental clarity but not the magical clarity! (not enough mana) +你的精神很清晰,但对魔法却很迷茫! ( 法力值不足 ) + + +You have formed a mental barrier... +你已经形成了一个精神屏障... + + +Desire Burst +欲望爆发 +Overload Essence motes in an area, costing 10% max DP worth of Desire each. They explode, dealing (10 + 20% max DP) charm damage to enemies hit. If you don't have enough desire, the damage is reduced proportionally.||(Desire is the heart-shaped meter below your DP bar, and is gained slowly by being distracted) +在区域内超载精华尘埃,消耗10%最大DP值的欲望。它们爆炸,对击中的敌人造成(10 + 20%最大DP)魅惑伤害。如果你欲望不足,伤害会相应减少。||(欲望是位于你DP条下的心形计量器,被分散注意力会逐渐增加) +You channel your distraction into the mote, overloading it! +你将注意力转移到尘埃上,将其彻底淹没! +You channel your distraction into the motes, overloading them! +将注意力转移到尘埃上,过载它们! +You don't have enough of a desire to do that. +你没有足够的欲望去做这件事。 +You must target at least one Essence Mote. +你必须针对至少一个精华尘埃。 +You have the desire but not the mana! +你性欲充足,但法力不足! + + + + +Your divine-locked restraints can only be removed by completing a shrine quest. +你的神圣锁束缚只能通过完成神泉的任务来解开。 + + +The Goddess hates you. That won't work. +女神讨厌你。那是行不通的。 + + +Harvest +收获 +Requires a slashing weapon equipped. Activate to harvest all adjacent vine tiles, with a 25% chance per tile to obtain a seed.|Seeds can be planted to form gardens, which will grow in 100 turns to become vegetables, which can be eaten to restore WP or sold to the shopkeeper. +需要装备斩击武器。激活以收割所有相邻几格内的藤蔓,每格有 25% 的几率获得种子。|种子可以种植形成花园,花园会在 100 回合内生长成为蔬菜,可以食用以恢复意志力或出售给店主。 +You twirl your weapon, harvesting AMNT seeds! +你转动你的武器,收获 AMNT 粒种子! +There is nothing to harvest. +没有什么可收获的。 + + +Telekinesis 101 +灵能 101 +Unlocks telekinetic abilities. Toggle on to equip weapons while bound, but at 0% accuracy. Learn Recover Object. +解锁灵能能力,可以在被束缚的时候切换武器,但是命中率为 0%,并习得咒术“隔空取物” + + +Recover Object +隔空取物 +Use telekinesis to pick up items and open chests from a distance. Refunds 75% of mana cost if not used to open a chest. +使用念动力从远处拾取物品并打开箱子。如果不用于打开箱子,则退还 75% 的法力消耗。 +The items float to you! +物品飘向了你! +There's nothing to pick up. +没有什么能捡到的。 +The chest is locked. +箱子是锁住的。 +Select a tile with items +选择包含物品的位置 + + +Enhanced Recovery +强化取物 +Upcast to increase range and recover objects in an area. +增加施法范围并获得较大范围内的物体。 +That container is locked! +那个容器已被锁定! +Select an area with items +选择有物品的区域 + + +Kinetic Slash +念动斩 +Swing an equipped weapon (not unarmed or hands free) in a line, slashing enemies in the way with 20 + 80% weapon damage. Counts as an attack. +10 mana cost if wielding a Heavy weapon. +命令装备的武器在一个直线区域挥击,对途中的敌人造成 20 + 80% 的武器伤害。视为普攻。如果使用重型武器,+10 法力消耗。 +You swing! +你命令武器攻击! +Choose where to swing (must not be unarmed or hands free weapon) +选择挥动的位置 ( 不得使用徒手武器或无需通过手臂即可使用的武器 ) + + +Kinetic Lance +念动投掷 +Propel your weapon at devastating speed, piercing enemies for 30+160% Weapon Damage and dropping it at the end of the trajectory. Counts as an attack. +15 mana cost if wielding a Heavy weapon. +命令你的武器以毁灭性的速度发射出去,刺穿敌人并造成 30+160% 武器伤害,武器掉落在轨迹末端。视为普攻。如果使用重型武器,+15 法力消耗。 +You propel your weapon forward! +你命令武器飞速向前! +Choose where to launch your weapon. +选择发射武器的方向。 + + +Sagitta +天剑 +Fire a projectile. If this projectile hits an enemy, make one attack against an enemy for 10+40% weapon damage. +5 mana cost if wielding a Heavy weapon. +召唤并一柄天剑并向指定方向踢出。造成10 + 40%的武器伤害。视为普攻。如果使用重型武器,+5 法力消耗。 +You unleash a deadly projectile! +你踢出了一枚致命的天剑! +Choose aim direction. +选择目标方向。 + + +Sagitta Assault +天剑阵 +After casting Sagitta, you can recast it up to three more times without advancing time. +在召唤天剑后,你可以在该回合再多施放三次。 + + +Psychokinesis +念力 +You can ignore components for telekinetic spells, however spells generate distraction (based on mana cost) when cast this way due to the mental strain. Unable to use at 100% DP. +你可以忽略心灵感应需要的法术的成分,但是当以这种方式施放法术时,由于精神过载,法术会让你产生性奋 ( 基于法力消耗 ) 。无法在 100% 性奋值 下使用。 + + +Kinetic Mastery +灵能大师 +Negates the penalty for 2-handed weapons. Also gain the following effects:|-Kinetic spells and Sagitta cost 30% less while wielding a Light weapon.|-Kinetic spells and Sagitta gain +15 base damage when wielding a Heavy weapon. +取消对双手武器的惩罚。还获得以下效果 : ‎|-挥舞轻型武器时,念动法术和天剑消耗降低 30%。-挥舞重型武器时,|念动法术和天剑获得 +15 基础伤害。 + + +Grasp +抓握 +Cast on an enemy to snare them for 20 turns, or until you leave range/are incapacitated. Cast on a point to throw the grasped enemy in that direction, dealing 40 crush damage if they hit a wall or another enemy. +对敌人施放以诱捕他们 20 回合,或直到你离开范围/丧失行动能力。对某个点施放,将抓住的敌人扔向该方向,如果他们被扔到墙壁或其他敌人上,则会造成 40 点碾压伤害。 +You grab the ENMY using telekinesis and hold them in place! +你可以使用心灵感应抓住敌人并将他们固定在原地! +You throw the ENMY! +你投掷了 ENMY! +Choose a target or a location (if a target is currently grasped) +选择一个目标或位置 ( 如果当前已抓住目标 ) + + +Perfect for a lifestyle of love and peace. +非常适合爱与和平的生活方式。 +Deals crush damage. Stuns on critical. Ouch! +造成碾压伤害。暴击会施加眩晕。哎哟! +You pick up a particularly nice rock. +你捡到一块非常漂亮的石头。 + + +You pick up a device for snuffing out candles and torches. +你拿起一个用来熄灭蜡烛和火把的装置。 +Candle Snuffer +灭烛器 +You put out the torch. +你熄灭了火把。 +A handy device for putting out torches and lanterns. +一种用于熄灭火把和灯笼的简易装置。 +But why would you want to do that? You hidin' something? +但你为什么要这么做呢?你想隐藏什么吗? + + +You find a bag full of sacks. Or is it a sack full of bags? +你发现一个装满麻袋的袋子。或者说,这是一个装满包的袋子? +Recursive Bag +递归包 +You cover the light source. +你遮住光源。 +Bags inside a bag of bags inside a bag of bags +袋子里面有个袋子里面有个袋子里面有个袋子 +Can be placed over light sources to cover them. +可以放置在光源上方以遮住它们。 + + +The snuffer doesn't work on that light source. +灭烛器对该光源不起作用。 +The bag can't cover that light source. +袋子遮不住那个光源。 +You remove the bag from its light source and place it back inside your bag. +你将袋子从光源上取下,然后将其放回袋子内。 + + +There. Now it's time to have some fun~ +那样。现在是时候好好享受一下了~ +How utterly helpless~ +真是无能为力啊~ +Let's see how long you last. +让我看看你能坚持多久。 + + +I've got you! Now let's have some fun! +你是我的了!现在让我们一起开心的玩吧! +I think I'll help myself to you for a bit~ +我想我会帮你一点忙的~ +Gosh, you're so cute like that! +天哪,你真是太可爱了! + + +I'm going to have to search you, miss~ +我得去找你了,小姐~ +Let's check your restraints. +让我检查一下你的束缚。 +You look so cute like that, miss! +你这样看起来真可爱,小姐! + + +All nice and tight. Certainly no longer a threat~ +绑的严严实实,你不再是个威胁了~ +I'm going to make sure you're nice and tight~ +我会把你绑的严严实实~ +Surely nothing can happen now! +现在肯定什么都不会发生了! + + +Rubber Elemental +橡胶精灵 +The rubber elemental's restraints snap onto her and she falls over hogtied. +橡胶精灵的束缚突然卡在了她身上,她被绑住了。 +The rubber elemental molds itself into restraints! (+RestraintAdded) +橡胶精灵将自身塑造成拘束具! ( +RestraintAdded ) +The rubber elemental squeezes you with its appendages! (DamageTaken) +橡胶精灵用它的附肢揉捏你! ( DamageTaken ) +The rubber elemental forms rubber locks around all your restraints! (DamageTaken) +橡胶精灵在你的所有拘束具周围形成橡胶锁! ( DamageTaken ) + + +Your ropes are enchanted with a lesser spell! +你的绳索被附上了一些魔力! +Your ropes are enchanted with a magic spell! +你的绳索被附上了魔力! +Your ropes are enchanted with a powerful spell! +你的绳索被附上了强大的魔力! +Your ropes are enchanted with a peerless spell! +你的绳索被附上了超乎想象的魔力! + + +Shibari Witch +绑缚女巫 +The shibari witch blows a kiss and says goodbye. +绑缚女巫飞吻道别。 +The shibari witch ties you tight! (+RestraintAdded) +绑缚女巫把你绑得紧紧的! ( +RestraintAdded ) +The witch rubs your body sensually! (DamageTaken) +女巫性感地摩擦你的身体! ( DamageTaken ) +The Shibari Witch takes your clothes off! +绑缚女巫脱去了你的衣服! + + + + + + +A Hard Place +艰难之地 +While your willpower is 0, your mana pool slowly drains and your max stamina regen point is reduced by 30%. +当你的意志力为0时,你的法力池会慢慢耗尽,你的体力再生效率会降低30%。 + + +The Spark of Magic +魔力火花 +When your mana pool is exhausted, your attacks deal 50% reduced base damage. +当你的法力池耗尽时,你的攻击造成的基础伤害减少 50%。 + + + + +Burned Out +筋疲力尽 +Casting spells reduces willpower based on how little distraction you have, also you cannot play with yourself. +施放法术会根据你性奋的程度降低意志力,而且你也不能自慰。 + + +Winded +气喘吁吁 +While below 10% stamina, evasion is severely reduced and your slow level is increased by 1. +当体力低于10%时,躲避能力会严重降低,你的减速等级会提高1级。 + + +Lost One +迷失者 +The being vanishes in front of you. +生物在你面前消失了。 +The being grabs you, causing your body parts to freeze in time!!! (DamageTaken) +生物抓住了你,让你身体的部位被瞬间冻结!!! ( DamageTaken ) +The being has already bound you! (+RestraintAdded) +生物已经将你束缚了! ( +RestraintAdded ) + + +The Timekeeper +计时员 +The Timekeeper releases her grip on the timeline. +计时员松开了对时间线的控制。 +The Timekeeper takes the time to enjoy herself with you... (DamageTaken) +计时员会花时间和你一起享受时光...... ( DamageTaken ) +The Timekeeper enacts judgement for disrupting time! (+RestraintAdded) +计时员对扰乱时间做出判决! ( +RestraintAdded ) + + +Analysis +分析 + + +You pick up a latex projector +你拿起一台乳胶投射仪 + + +Can't Touch That +碰不到 +When both arms and hands are severely bound, you can no longer pick up items without an ally nearby. +当双臂和双手都被严重束缚时,如果附近没有盟友,你将无法再拾取物品。 +You can't pick that up without help. +如果没有帮助,你就无法拿起它。 +Grounded +地面限制 +When arms are tied and feet are linked, you cannot get up from a kneeling position without help or a wall. +当手臂被绑住,且双脚相连时,如果没有帮助或墙壁,你就无法从跪着的姿势站起来。 +You take more time getting up due to your bindings. +由于束缚,你起身需要更多时间。 +You can't get up without help. +没有帮助你就无法站起来。 +Your ally helps you back up. +你的盟友会帮助你起身。 +You get back up using the corner. +你可以利用角落重新站起来。 +You get up to your knees using the wall. +你靠着墙站起来。 +You're too tied up to close the door. +你被束缚的太紧了,无法关门。 +The chest opens on its own. +箱子会自动打开。 + + +You can't use your hands for that, but you can crouch to use your mouth. +你不能用手来做这件事,但你可以蹲下来用嘴。 + + +Heel Training +高跟鞋训练 +Start locked in a pair of heels with no heel training. +在没有进行高跟鞋训练的情况下开始时穿戴一双锁定的高跟鞋。 +Gag Training +堵嘴训练 +Start locked in a gag with no gag training. +在没有进行堵嘴训练的情况下开始时佩戴一件锁定的口塞。 +Corset Training +束胸训练 +Start locked in a corset with no corset training. +在没有进行束胸训练的情况下开始时穿戴一件锁定的束胸。 +Sensory Training +感官训练 +Start locked in a blindfold and headphones with no Sensory training. +在没有进行感官训练的情况下开始时佩戴一件锁定的耳罩和耳机。 + + +Hard to Master: Heels +难以掌握 : ‎高跟鞋 +Heel training is significantly slower. +高跟鞋训练进度明显变慢。 +Hard to Master: Gags +难以掌握 : ‎堵嘴 +Gag training is significantly slower. +堵嘴训练进度明显变慢。 +Hard to Master: Corsets +难以掌握 : ‎束胸 +Corset training is significantly slower. +束胸训练进度明显变慢。 +Hard to Master: Sensory +难以掌握 : ‎感官 +Sensory training is significantly slower. +感官训练进度明显变慢。 + + +Head Start: Heels +领先优势 : ‎高跟鞋 +Start at Heel training level 5. +开始时高跟鞋训练等级为 5 级。 +Head Start: Gags +领先优势 : ‎堵嘴 +Start at Gag training level 5. +开始时堵嘴训练等级为 5 级。 +Head Start: Corsets +领先优势 : ‎束胸 +Start at Corset training level 5. +开始时束胸训练等级为 5 级。 +Head Start: Sensory +领先优势 : ‎感官 +Start at Sensory training level 5. +开始时感官训练等级为 5 级。 + + +Classic Heels +经典高跟鞋 +Removes Heel Training and tripping mechanic. Restraining heels slow instead. +移除高跟鞋训练和绊倒机制。相反,束缚脚跟的速度会变慢。 +Trust Fall +信任下降 +Hides the balance meter while wearing heels and/or unsteady. +穿高跟鞋或站不稳时隐藏平衡计。 + + +Poor Balance +平衡不佳 +You take longer to get up and are less skilled at wearing high heels. +你起身需要更长的时间,并且穿高跟鞋的技巧较差。 + + +Balance: AMNT% +平衡 : ‎AMNT% +Balance: AMNT% (Sprinting Disabled!!!) +平衡 : ‎AMNT% ( 冲刺已禁用!!! ) +You lose your balance and fall over!!! +你失去平衡摔倒了! +Training Level: AMNT +训练等级 : ‎AMNT + + +Favorite +喜欢 +Unfavorite +不喜欢 +Drop +丢弃 +Attach +附着 +Attached +已附着 + + +Add to Quick Slot 1 +添加到快捷栏 1 +Add to Quick Slot 2 +添加到快捷栏 2 +Add to Quick Slot 3 +添加到快捷栏 3 +Add to Quick Slot 4 +添加到快捷栏 4 + + +Try to Cut +尝试切断 +Struggle! +挣扎! +Try to Unlock +尝试解锁 +Add a Lock +上锁 +Try to Remove +尝试移除 +Try to Pick +尝试撬开 +Examine the Curse +检查诅咒 +Remove the Curse +移除诅咒 +Feed this to her +把这个喂给她 +Sell for VLU gp +以 VLU 金币出售 +Sell ALL for VLU gp +以 VLU 金币出售所有 +Sell all but one for VLU gp +出售除一件以外的所有物品以换取 VLU 金币 + + +You feed the RSTR to the ENNME! (AMNT1/AMNT2 hp) +你将 RSTR 喂给 ENNME! (AMNT1/AMNT2 血量) +Choose a food item or willpower potion +选择一种食物或意志力药水 + + +Chain Rune +锁链符文 +Ribbon Rune +丝带符文 +Nature Rune +自然符文 +Belt Rune +贞操带符文 +Leather Rune +皮革符文 +Latex Rune +乳胶符文 +Latex Cube Rune +乳胶立方体符文 +Slime Bubble Rune +粘液泡泡符文 +Bubble Rune +泡泡符文 +Spherical Rune +球形符文 +Ball Rune +球符文 +Rubber Rune +橡胶符文 +Slime Rune +粘液符文 + + ++AMNT gp ++AMNT 金币 + + +ENMY lets go of herself for AMNT damage! +ENMY 因 AMNT 伤害而放弃了自己! + + +Sonar +声纳 +Emit a ping to highlight floors and tiles in a large radius. The ping is audible and attracts enemies to your position. +发出 ping 信号以突出显示大半径范围内的地板和瓷砖。发出的声音会吸引敌人到你的位置。 + + +You emit a loud noise and listen for echoes... +你发出巨大的噪音并聆听回声...... +Your mouth is too heavily stuffed! +你的嘴被塞得太严实了! +You don't have the mana to cast Sonar! +你没有法力来施放声纳! +The weights swing around and tug on your nipples! +砝码会左右摆动并拉扯你的乳头! + + +More Kinky Furniture +更多古怪的家具 +Replaces 60% of cages with a different kind of kinky furniture such as display stands. +用不同种类的古怪场景家具 ( 例如展示架 ) 取代 60% 的笼子。 + + +Collection +收藏 + + +Storage +存储 +Management +管理 +You don't have anywhere to manage your prisoners! Yet... +你没有地方可以管理你的囚犯!但是... + + +Your collection is empty. Use binding attacks to tie up and capture damsels! +你的收藏是空的,使用束缚攻击来捆绑并捕获少女! + + +Personality +性格 +Switch +转变 +Bratty +不顺从 +Corrupted +已损坏 +Feral +野性 + + +Status +状态 +Guest +客人 +Servant +仆人 +Manager +管家 + + +Opinion +观点 + + +Prisoner #NUMR/TTL +囚犯 #NUMR/TTL +Guest #NUMR/TTL +客人 #NUMR/TTL + + +Select a character to examine +选择要检查的角色 +Former Faction: +前派系 : ‎ + + +Miku +未来(Miku) +Nevermere +“奈文米尔” +Bounty Hunter +赏金猎人 +Dressup Co. +装扮公司 +Scholarly +学术 +Witch's Coven +女巫团 +Warden +典狱长 +Curse +诅咒 +Fungal +真菌 +Bast +猫女神 +Elemental +元素 +Royal +皇家 + + +Choose default outfit palette: +选择装备默认调色: + + +Auto Load Mods +自动加载模组 +SUSPICIOUS MOD DETECTED +检测到可疑模组 + + +The bright light hurts your dark-adjusted eyes! +明亮的光线会伤害你适应黑暗的眼睛! + + +Unconventional Warfare +非常规作战 +Select a weapon to attach it to your body. You can have one attached weapon at a time. Attaching it takes 5 turns.|An attached weapon can be equipped without hands and maintains 60% accuracy as long as you have arms or legs unbound. +选择一件武器,将其附在身上。你同时只能拥有一件附加武器。需要 5 个回合来装备。|附加武器可以不用手来装备,只要你的手臂或腿没有被束缚,就能保持 60% 的准确度。 + + +Guerilla Fighting +游击战 +Light weapons can be wielded if you have your mouth free, at 75% accuracy. +如果你的嘴巴可以自由活动,就可以使用轻型武器,命中率为 75%。 + + +Tough Armor (1/2 crit mult while aware) +坚韧护甲 ( 意识状态下暴击倍数为 1/2 ) +Absolute Armor (1/2 crit mult) +绝对护甲 ( 1/2 暴击倍率 ) + + +### Rename + +Reset to NME +重置为NME +Enlarged View +扩大视野 +Back to Game +返回游戏 + + +Servants +仆人 +Prisoners +囚犯 + + +Promote to Servant +晋升为仆人 +Demote +降职 +Delete Guest +删除客人 +Really Delete Guest? +确定要删除客人吗? + + +The ENMY tries to grab you! +ENMY 试图抓住你! + + +The ENMY reaches out and gives your breast a squeeze! (DMGDLT) +ENMY 伸出手来揉捏你的乳房!(DMGDLT) +The ENMY squeezes your breasts as you raise your arms for a spell! (DMGDLT) +当你举起手臂施展咒语时,敌人会揉捏你的乳房!(DMGDLT) +The ENMY reaches for you and fails! +ENMY 向你伸出手,但失败了! +The ENMY gives your butt a light slap as you cast! (DMGDLT) +当你施法时,ENMY 会轻轻拍打你的屁股!(DMGDLT) +The ENMY gives your butt a good slap as you sprint past! (DMGDLT) +当你冲过的时候,ENMY 狠狠地对着你的屁股打了一巴掌!(DMGDLT) +The ENMY tries to spank you but misses! +ENMY 试图打你的屁股,但没有打中! +The ENMY gives your butt a squeeze! (DMGDLT) +ENMY 揉捏你的屁股!(DMGDLT) +The ENMY gives your butt a squeeze during your cast! (DMGDLT) +ENMY 会在你施法时揉捏你的屁股!(DMGDLT) +The ENMY gives your butt a squeeze from behind! (DMGDLT) +ENMY 从后面揉捏你的屁股!(DMGDLT) +The ENMY gives your butt a squeeze as you pass by! (DMGDLT) +当你经过时,ENMY 会揉捏你的屁股!(DMGDLT) +The ENMY reaches for you but misses! +ENMY 向你伸手,但没有摸中! +The ENMY tickles your armpits! (DMGDLT) +ENMY 挠你的腋窝!(DMGDLT) +The ENMY tickles under your raised arms! (DMGDLT) +ENMY 在你举起的手臂时挠你的痒痒!(DMGDLT) +The ENMY tries to tickle you! +ENMY 试图挠你痒痒! +The ENMY tickles your feet! (DMGDLT) +ENMY 正在挠你的脚!(DMGDLT) +The ENMY takes off your shoes and tickles your feet! (DMGDLT) +ENMY 脱掉你的鞋子并挠你的脚!(DMGDLT) +The ENMY pats you gently on the head. (DMGDLT) +ENMY 轻轻地拍了拍你的头。(DMGDLT) +The ENMY pats you gently on the head as you fail your spell... (DMGDLT) +当你的咒语失败时,敌人轻轻地拍了拍你的头... (DMGDLT) +The ENMY tries to pat you on the head but decides not to. +ENMY 试图拍拍你的头,但想了想还是算了。 +The ENMY behind you gives your shoulders a nice massage! (DMGDLT) +你身后的 ENMY 给你的肩膀做了一次很好的按摩!(DMGDLT) +The ENMY reaches for your shoulders but you slip free! +ENMY 伸手抓住你的肩膀,但你却逃脱了! +The ENMY calls you cute! (DMGDLT) +ENMY 称赞你很可爱!(DMGDLT) +The ENMY blushes at your cuteness! +ENMY 因为你太可爱而脸红! +The ENMY makes fun of you! (DMGDLT) +ENMY 取笑你!(DMGDLT) +The ENMY struggles to find words! +ENMY 努力寻找词语! +The ENMY buzzes you with her VTY! (DMGDLT) +ENMY 拿她嗡嗡作响的振动玩具走向你!(DMGDLT) +The ENMY catches you and teases you with her VTY! (DMGDLT) +ENMY抓住你,用她的嗡嗡作响的振动玩具戏弄你!(DMGDLT) +The ENMY reaches for her VTY! +ENMY 伸手去拿她的振动玩具! +The ENMY sticks a VTY into you! (DMGDLT) +ENMY 将震动玩具插入你的体内!(DMGDLT) +The ENMY sticks a stuffing into your open mouth! (DMGDLT) +ENMY 将填充物塞入你张开的嘴里!(DMGDLT) +The ENMY reaches for your mouth and fails! +ENMY 将手伸向你的嘴,但失败了! +The ENMY takes advantage of the gag around your neck~ (DMGDLT) +ENMY利用了你脖子上的塞口物~ (DMGDLT) +The ENMY reaches for the gag around your neck! +ENMY伸手去拿你脖子上的塞口物! +The ENMY pulls your hands together and sticks a clip between them! (DMGDLT) +ENMY 将你们的双手拉到一起,并在你的双手之间夹上一个绑带!(DMGDLT) +The ENMY grabs your wrists but you pull away! +ENMY 抓住你的手腕,但你却挣脱了! +The ENMY pulls your weapon away! +ENMY 拿走了你的武器! +The ENMY tries to pull your weapon away but you maintain your grip! +ENMY 试图拿走你的武器,但是被你紧紧抓住了! +The ENMY reaches for your inventory but can't quite reach it! +ENMY 伸手去拿你的物品,但无法完全够到! + + +More Armbinders +更多单手套 +Armbinders are favored over other heavy bondage. +与其他重型的束缚相比,单手套更受欢迎。 +Less Armbinders +减少单手套 +Armbinders are less favored over other heavy bondage. +与其他重型束缚相比,单手套更不受欢迎。 +More Boxbinders +更多盒式单手套 +Boxbinders are favored over other heavy bondage. +与其他重型束缚相比,盒式单手套更不受欢迎。 +Less Boxbinders +减少盒式单手套 +Boxbinders are less favored over other heavy bondage. +与其他重型束缚相比,盒式单手套似乎不太受青睐。 +More Straitjackets +更多拘束衣 +Straitjackets are favored over other heavy bondage. +与其他重型束缚相比,拘束衣更受青睐。 +Less Straitjackets +减少拘束衣 +Straitjackets are less favored over other heavy bondage. +与其他重型束缚相比,拘束衣似乎不太受青睐。 +More Yokes +更多枷锁 +Yokes are favored over other heavy bondage. +与其他沉重的束缚相比,枷锁更受青睐。 +Less Yokes +减少枷锁 +Yokes are less favored over other heavy bondage. +与其他沉重的束缚相比,枷锁似乎不太受青睐。 + + + (blocked!) +(格挡!) + (dodged!) +(闪避!) + + +You crouch and move slowly. +你蹲下并缓慢移动。 + + +Owned by: +拥有者 : ‎ + + +Warden's Belt +典狱长的贞操带 +You may go on your way, but only as long your freedom is useful to her. +你可以继续走你的路,但前提是你的自由对她有用。 +A golden belt that enforces respect for the Goddesses. Breaking spell orbs results in a punishment. +一条金色腰带,用来表达对女神的敬意。破坏宝珠会受到惩罚。 + + +Belt of Privilege +特权腰带 +You've defeated the Warden, proving that you are worthy to take what you want. +你已经打败了典狱长,证明你有资格得到你想要的东西。 +A golden belt that marks you as a person of great import. -50% rep penalty for breaking orbs. +一条金腰带,标志着您是一位重要人物。打破宝珠的声誉惩罚 -50%。 + + +Sharpshooter +神射手 +You teach the warden's servant a lesson. +你给监狱长的仆人一个教训。 +The sharpshooter pulls your arms behind your back! (+RestraintAdded) +神射手将你的手臂拉到身后! ( +RestraintAdded ) +The sharpshooter takes advantage of your weakness and squeezes your breast! (DamageTaken) +神射手利用你的弱点,揉捏你的胸部! ( DamageTaken ) +The sharpshooter smiles and clicks a lock on you! (DamageTaken) +神射手微笑着将你锁定! ( DamageTaken ) + + +Gladiator +角斗士 +The gladiator puts you in a hold and binds you! (+RestraintAdded) +角斗士抓住了你并把你绑住了! ( +RestraintAdded ) +The gladiator chuckles as she spanks your butt! (DamageTaken) +角斗士拍打你的屁股时咯咯笑! ( DamageTaken ) +The gladiator smiles and clicks a lock on you! (DamageTaken) +角斗士微笑着,将你锁定! ( DamageTaken ) + + +The magician conjures some restraints on you! (+RestraintAdded) +魔术师对你施展了一些束缚! ( +RestraintAdded ) +The magician summons tickling hands to tease you! (DamageTaken) +魔术师召唤出挠痒痒的手来戏弄你! ( DamageTaken ) +The magician conjures some locks on you! (DamageTaken) +魔术师在你身上变出了一些锁! ( DamageTaken ) + + +The Warden +典狱长 +The Warden disappears into a trapdoor! +典狱长消失在活板门中! +The Warden forces you to kneel, and presents you with a restraint! (+RestraintAdded) +典狱长强迫你跪下,并向你施以束缚! ( +RestraintAdded ) +The Warden whips you with a belt! (DamageTaken) +典狱长用皮带抽打你! ( DamageTaken ) +The Warden tosses some enchanted locks at you! (DamageTaken) +典狱长向你扔了一些魔法锁! ( DamageTaken ) + + +The Warden falls flat on the ground, exhausted! +典狱长筋疲力尽地倒在地上! +The Warden strikes you with her whip! (DamageTaken) +典狱长用鞭子抽你! ( DamageTaken ) +The Warden swings her enchanted whip and conjures locks on your body! (DamageTaken) +典狱长挥动着她那施了魔法的鞭子,把锁锁在你的身上! ( DamageTaken ) + + + + + + +(The Warden glances at you)|Oh? What do we have here?|An adventurer?|You're not in my records... +( 典狱长看了你一眼 ) |哦?我们这里有什么?|一名冒险家?|我的记录里没有你啊…… +Cut to the chase. Do I have to fight you or not? +直入主题。我到底要不要跟你打架? +(She chuckles)|Oh my~|I hope your skills are on the same level as your attitude.|I don't have time for mere troublemakers~ +( 她笑了 ) |哦,天哪~|我希望你的技能和你的态度一样好。|我没有时间陪那些制造麻烦的人~ +Quite a boast for someone who's about to lose. +对于一个即将失败的人来说,这真是太夸张了。 +(SPEAKER grins)|I look forward to testing those claims~ +( 发言人笑了 ) |我期待着验证这些说法~ +I defeated Fuuka. Now you're next! +我打败了风香(Fuuka)。现在轮到你了! +(SPEAKER shrugs)|You beat that zombie girl?|She's the weakest of the paladins.|She loves to boast about how she's special,|But she's really just a spoiled brat. +( SPEAKER 耸耸肩 ) |你打败了那个僵尸女孩?|她是最弱的圣骑士。|她喜欢吹嘘自己的特别之处,|但她实际上只是一个被宠坏的孩子。 +...Zombie girl? +...僵尸女孩? +(SPEAKER tilts her head)|Yes, she was around before Vinlaga.|Her magic was gifted to her by the Goddess,|it is only natural that it works on her too. +( SPEAKER 歪着头 ) |是的,她在文拉加(Vinlaga)之前就存在了。|她的魔法是女神赐予她的,|很自然地,它也对她有效。 +...Paladins? +...圣骑士? +(SPEAKER nods happily)|Divinely-appointed judges, presiding over mortals.|Unlike you, our immortality is earned.|Myself, I captured many defilers long ago.|Is it not fitting that I get to keep them for myself? +( SPEAKER 高兴地点头 ) |神授法官,审判凡人。|与你不同,我们的永生是靠自己挣来的。|我自己很久以前就抓获了许多亵渎者。|把他们留给我自己难道不合适吗? +It is an honor to fight a worthy opponent. +能与值得尊敬的对手战斗是我的荣幸。 +(SPEAKER giggles)|That gag suits you nicely~ +( SPEAKER 咯咯笑 ) |这个笑话很适合你~ +(SPEAKER grins)|I look forward to it! +( SPEAKER 笑着 ) |我很期待! +You will see soon enough. +你很快就会看到。 +Indeed! +的确! +What is this place? +这是什么地方? +(She smiles)|Why, this is my private prison.|I bring only my prettiest toys to stay here with me.|You can see them up there.|(She motions to the north) +( 她笑了 ) |为什么,这是我的私人监狱。|我只带着我最漂亮的玩具留在这里。|你可以在那里看到它们。| ( 她向北示意 ) +Tell me about your collection +告诉我你的收藏 +(SPEAKER smiles pleasantly)|Its a fitting reward, isn't it?|Long ago, this mountain was home to a vicious empire.|Machines went out to sea, bringing back countless prisoners.|As commander of the invasion, I earned this title! +( SPEAKER 愉快地微笑 ) |这是一个合适的奖励,不是吗?|很久以前,这座山是一个邪恶帝国的家园。|机器出海,带回了无数的囚犯。|作为入侵的指挥官,我赢得了这个头衔! +(SPEAKER grins)|When we stormed the prisons, we encountered many fierce defenders.|Many of them now reside in these halls, earning their rightful punishment. +( SPEAKER 笑了 ) |当我们袭击监狱时,我们遇到了许多凶猛的防守者。|他们中的许多人现在住在这些大厅里,接受应有的惩罚。 +Who are the prisoners, anyway? +那么囚犯到底是谁? +(SPEAKER folds her arms)|Is it not holy and just to bring down tyrants? +( SPEAKER 交叉双臂 ) |推翻暴君难道不是神圣而正义的吗? +Why did the Goddesses intervene? +女神们为何要干预? +(SPEAKER shrugs)|Most of them had already been... conditioned.|It will take centuries to undo centuries of training.|After all, we have plenty of time. +( SPEAKER 耸耸肩 ) |他们中的大多数已经......被训练过了。|要撤销几个世纪的训练需要几个世纪的时间。|毕竟,我们有足够的时间。 +What about the former prisoners? +那么那些前囚犯呢? +(SPEAKER looks to the side)|The leader was nowhere to be found.|The coward fled deeper underground.|Her robot guardians protect her, to this day. +( SPEAKER 看向一侧 ) |领袖无处可寻。|懦夫逃到了更深的地下。|直到今天,她的机器人守护者仍在保护着她。 +Can I see the leader of this old civilization? +我能见见这个古老文明的领袖吗? +(SPEAKER smirks)|What's the point of going deeper?|The tyrant lost control of her petty empire.|Now the world is safe from her. +( SPEAKER 冷笑 ) |进一步深入有什么意义?|暴君失去了对她的小帝国的控制。|现在世界已经安全地摆脱了她的威胁。 +So you stopped at the upper floors? +所以你就停在楼上了吗? +(SPEAKER frowns)|Absolutely not.|They are under my strict supervision. +( SPEAKER 皱眉 ) |绝对不行。|他们受到我的严格监督。 +Can I talk to the former prisoners? +我可以和前囚犯谈谈吗? +(SPEAKER grins)|Very funny.|I heard rumors of an up-and-coming adventurer stirring up trouble.|It seems my intuitions were correct. +( SPEAKER 笑了 ) |非常有趣。|我听到有传言说,一位崭露头角的冒险家正在制造麻烦。|看来我的直觉是正确的。 +I hope you don't mind me looting the lower levels~ +希望大家不要介意我掠夺较低等级的物品~ +(SPEAKER grins)|Oh please.|Only this era's finest warriors can be part of my collection~|My subordinates take care of the rest. +( SPEAKER 笑着 ) |哦,拜托了。|只有这个时代最优秀的战士才能成为我的收藏品~|我的下属会处理剩下的事情。 +Sounds like you have an impressive collection +听起来你的收藏很令人印象深刻 +(SPEAKER frowns)|It's easy to take for granted the peace you didn't work for. +( SPEAKER 皱眉 ) |你很容易把自己没有努力争取到的和平视为理所当然。 +Must be comfy living up here then +那么住在这里一定很舒服 +(SPEAKER scoffs at you)|Adventurers are always like this.|Ever since your kind started prying,|I've had no choice but to enact my own kind of discipline~ +( SPEAKER 嘲笑你 ) |冒险者总是这样。|自从你们开始窥探以来,|我别无选择,只能实施我自己的纪律~ +What makes you any better than the old rulers? +你们比过去的统治者好在哪里? +(SPEAKER smirks at you)|If that were so, then perhaps it would be best not to pry...|Forbidden knowledge has its price, after all. +( SPEAKER 对你冷笑 ) |如果是这样,那么最好不要打探……|毕竟,禁忌知识是有代价的。 +It sounds like the gods are trying to hide something +听起来好像众神在试图隐藏什么 +(SPEAKER folds her arms)|And what makes you think an old myth would be relevant here?|Would the Archmagus herself lead a rebellion against the divine? +( SPEAKER 交叉双臂 ) |是什么让你认为一个古老的神话与此有关?|大法师本人会领导一场反抗神的叛乱吗? +Was Sariel Vinlaga the leader of the old civilization? +萨里尔·文拉加(Sariel Vinlaga)是旧文明的领袖吗? +(SPEAKER frowns)|You don't trust me? That's too bad... +( SPEAKER 皱眉 ) |你不相信我?太糟糕了…… +It's the way you keep dodging questions. +这是你不断回避问题的方式。 +(SPEAKER scoffs)|I'd love to have a word with your sources~ +( SPEAKER 嘲笑 ) |我很想和你的消息来源谈谈~ +I have it good authority that Vinlaga is here. +我有充分的证据证明 文拉加(Vinlaga) 就在这里。 +(SPEAKER smirks)|Don't believe everything you hear~ +( SPEAKER 笑了 ) |不要相信你听到的一切~ +Maybe you're right. +也许你是对的。 +(SPEAKER pouts)|Old?|Grrr... +( SPEAKER 撅嘴 ) |旧?|Grrr…… +Says an old woman under the mountain... +山下一位老妇人说道…… +I am indeed an adventurer. +我确实是一个冒险家。 +(SPEAKER smiles)|Fascinating. Do keep explaining. +( SPEAKER 微笑 ) |真有趣。请继续解释。 +(SPEAKER frowns)|That is not the attitude I appreciate from my guests. +( SPEAKER 皱眉 ) |我并不喜欢客人有这样的态度。 +I forge my own path. +我开辟了自己的道路。 +Why should I listen to you? +我为什么要听你的? +(Pout) +( 噘嘴 ) +That's a shame about your records, I'll be going now. +你的记录太糟糕了,我现在要走了。 +Mmpphgh? (Go to pass her) +Mmpphgh? ( 从她身边走过 ) +(She smirks)|Not so fast, dear~|You'll have to wear a special collar to pass. +( 她笑了 ) |别那么快,亲爱的~|你得戴上特殊的项圈才能通过。 +I won't wear anyone's collar! +我不会戴任何人的项圈! +(She smirks)|Tsk tsk. Then you won't pass. +( 她笑了 ) |啧啧,那你就过不了关了。 +(She giggles)|How cute!|You're so used to yours that you forgot about it~ +( 她咯咯地笑 ) |好可爱!|你已经习惯了你自己,以至于忘记了这件事~ +Why don't you wear it yourself? +你自己咋不穿呢? +Hmmph. (Scoff at her) +Hmmph. ( 嘲笑她 ) +(She frowns)|Watch your tongue~ +( 她皱眉 ) |注意你的言辞~ +(She frowns)|I do not wear collars. +( 她皱起眉头 ) |我不戴项圈。 +You'd be better off wearing mine instead. +你最好还是穿我的。 +You're missing out~ +你错过了~ +This is a nice place you got here. +这是个不错的地方。 +(Admire the locale) +( 欣赏现场风光 ) +(SPEAKER smiles and nods)|It has existed for a thousand years,|and it shall exist for another thousand.|No thanks, of course, to the adventurers who storm through here,|breaking the orbs as if it all belongs to them... +( SPEAKER 微笑着点头 ) |它已经存在了一千年,|它还将再存在一千年。|当然,对于那些冲过这里的冒险者来说,|他们不会心存感激,|他们打破了这些球体,好像它们都是属于他们的一样…… +What are these orbs for anyway? +这些球体到底有什么用处? +(SPEAKER looks puzzled)|You don't know? Surely you must be joking? +( SPEAKER 一脸疑惑 ) |你不知道?你肯定在开玩笑吧? +(SPEAKER shrugs)|They are important because...|Wait, you're stalling for time, aren't you? +( SPEAKER 耸耸肩 ) |它们很重要,因为……|等等,你在拖延时间,不是吗? +I do not know. +我不知道。 +(Sigh) +( 叹气 ) +Of course I know... +我当然知道... +You can trust me. +你可以相信我。 +Mmmph! (Nod eagerly) +Mmmph! ( 热切地点头 ) +(SPEAKER laughs)|Do you think I will trust you just like that? +( SPEAKER 笑 ) |你认为我就会这样相信你吗? +(SPEAKER frowns)|You do not know who you're dealing with.|I'll make sure to teach you a lesson. +( SPEAKER 皱眉 ) |你不知道你在和谁打交道。|我一定会给你一个教训。 +Why don't I make you wear it? +我为什么不让你穿上它? +You can try~ +可以试一试哦~ +There must be a mistake. Sign me up! +肯定是搞错了。帮我报名吧! +(She smiles)|Eager are we?|I don't just record anyone though.|I only care about the strongest adventurers~ +( 她笑了 ) |我们很热切吗?|但我不会随便记录任何人。|我只关心最强大的​​冒险者~ +I am the strongest. +我是最强的。 +(SPEAKER chuckles)|Then why don't I test your skills? +( SPEAKER 笑 ) |那我为什么不测试一下你的技能呢? +(SPEAKER grins)|How about trial by combat? +(SPEAKER 笑)通过战斗进行审判怎么样? +A test? What kind? +测试?什么类型的? +...You're on! +...轮到你了! +Let's do it! +我们开始吧! +You will see how strong I am! +你会看到我有多强! +(SPEAKER giggles)|We'll see about that! +( SPEAKER 咯咯笑 ) |我们会看到的! +On second thought, maybe not... +再想想,也许不...... +(SPEAKER giggles)|Not so confident, are we? +( SPEAKER 咯咯笑 ) |我们不那么自信,是吗? +I didn't think it would involve a test... +我不认为这会涉及测试... + + +(SPEAKER readies her whip)|Allow me to introduce myself properly.|I am The Warden, divinely appointed judge and enforcer.|Those who enter this mountain do so under my watchful eye.|To ensure this, I have crafted a special collar.|It will ensure that you do not defile the holy places.|I can let you through if you accept it~ +( SPEAKER 准备好鞭子)|请允许我做一个正式的自我介绍|我是守护者,神圣任命的法官和执行者|那些进入这座山的人都是在我的监视下进入的|为了确保这一点,我制作了一个特殊的项圈|这将确保你不会玷污圣地|如果你接受,我可以让你通过~ +I will never be collared by you! +我永远不会被你套牢! +(Shake your head and scoff) +(摇头嘲笑) +(SPEAKER folds her arms)|So be it. +( SPEAKER 双臂交叉)|就这样吧。 +Tell me about your collection. +告诉我你的收藏。 +I'm in charge of my own path. +我负责自己的道路。 +(SPEAKER grins)|Let's see how long you can keep up that attitude~ +( SPEAKER 笑了 ) |让我们看看你能保持这种态度多久~ +That won't be necessary, miss. +没必要,小姐。 +(SPEAKER smiles)|Oh, it's quite necessary~|Why don't I show you? +( SPEAKER 耸耸肩)|直截了当,对吧? +I would rather fight you. +我宁愿和你战斗。 +(Fight her) +(和她战斗) +(SPEAKER shrugs)|Straight and to the point, eh? +( SPEAKER 微笑)|哦,这很有必要~~我为什么不给你看呢? + + +Ready yourself! +准备好了! +Let's go! +我们走! +I guess I have no choice... +我想我别无选择... + + +(SPEAKER grins)|Very impressive.|You may have lost the battle, but you performed admirably~ +( SPEAKER 笑了 ) |非常令人印象深刻。|虽然你输掉了这场战斗,但你的表现令人钦佩~ +(SPEAKER smiles)|I will let you pass so long as you wear my collar.|(She snaps her fingers and conjures a glowing ring) +( SPEAKER 微笑 ) |只要你戴上我的项圈,我就会让你过去。| ( 她打了个响指,变出一枚发光的戒指 ) +(SPEAKER giggles)|Then your journey ends.|I assume you don't want that.|Now then, as for your collar~|(She snaps her fingers and conjures a glowing ring) +( SPEAKER 咯咯笑 ) |然后你的旅程就结束了。|我想你不想要那样。|现在,至于你的项圈~| ( 她打了个响指,变出了一枚发光的戒指 ) +(SPEAKER chuckles)|Of course it was magic~|Who said a commander had to be defenseless?|(She snaps her fingers and conjures a glowing ring) +( SPEAKER 笑了 ) |当然是魔法~|谁说指挥官就必须毫无防御能力?| ( 她打了个响指,变出了一枚发光的戒指 ) +Was that magic? +那是魔法吗? +I've lost. Now what? +我输了。现在该怎么办? +I won't submit to you! +我不会向你屈服的! +(SPEAKER presents you with your collar...)|(It closes around your neck seamlessly)|Now... you'll be allowed to go free,|but only once you've been sufficiently trained. +( SPEAKER 向你展示你的项圈…… ) | ( 它无缝地围绕着你的脖子 ) |现在……你将被允许自由行动,|但前提是你接受了足够的训练。 + + +(SPEAKER blocks you with a web of metal bars)|Very impressive!|But did you really think it would be that easy? +( SPEAKER 用金属栅栏网挡住你 ) |非常令人印象深刻!|但你真的认为会那么容易吗? + + +(SPEAKER crouches down)|Most impressive...|It is not often I lose to an adventurer...|I'd love to get my hands on you eventually~ +( SPEAKER 蹲下 ) |最令人印象深刻...|我很少输给冒险者...|我很想最终得到你~ +(SPEAKER looks surprised)|I did not expect you to be so... compliant.|(She snaps your fingers and tosses you a glowing belt)|This is a special one, reserved for those with divine privilege.|You've earned it. +( SPEAKER 看起来很惊讶 ) |我没想到你会如此……顺从。| ( 她打了个响指,扔给你一条发光的贞操带 ) |这是一条特殊的贞操带,专为那些拥有神圣特权的人保留。|你赢得了它。 +(Wear her belt anyway) +( 无论如何都要戴上她的贞操带 ) +(SPEAKER shakes her head as you force a gag into her mouth)|MMMMMPH! +( 当你强行想要堵住她的嘴巴时,SPEAKER 摇了摇头 ) |MMMMMPH! + + +The ENMY weakens your grip on your weapon! Enemies may disarm you if you stand too close... +ENMY 削弱了你对武器的控制力!如果你站得太近,敌人可能会使你缴械…… + + +Can you link my arm cuffs? +你能把我的臂铐连起来吗? +(Hold out your arm cuffs) +(伸出你的臂铐) +(The SPEAKER smiles)|Why sure, sweetie, I can help you with that~ +(SPEAKER微笑)|当然,甜心,我可以帮你~ +(The SPEAKER grins)|What a good girl! +(SPEAKER咧嘴一笑)|多好的女孩啊! +(The SPEAKER blushes)|Those look like fun! +(SPEAKER脸红了)|那些看起来很有趣! +(The SPEAKER smirks)|Sure thing~ +(SPEAKER笑了一下)|当然~ +(The SPEAKER beeps)|+10 social credit +( SPEAKER 嘟嘟声)|+10社会信用 + + +Can you link my leg cuffs? +你能帮我系上腿铐吗? +(Hold out your leg cuffs) +(伸出你的腿铐) + + +Cool people wear these indoors. +很酷的人即使在室内也戴着这个。 ++25 holy resist. Reduces blind effects. Prevents blinding from light adjustment. ++25 神圣抗性。减少致盲效果。防止光线调整导致的致盲。 +You find a pair of stylish shades. +你找到了一副时尚的墨镜。 + + +Shades +墨镜 + + +Player Background Color +玩家背景颜色 + + +An attack causes you to bounce... +一次攻击会让你反弹...... + + +You find yourself enveloped in a bubble! +你发现自己被泡泡包裹着! +A sphere of latex coalesces around you, trapping you and inflating until tight! +一个乳胶球在你的周围凝聚,将你困住并充气直至绷紧! +A sphere of latex coalesces around you, trapping you and sealing around your neck! +一个乳胶球在你的周围凝聚,将你困住并封住你的脖子! +You find yourself enveloped in a slime bubble! +你发现自己被一个粘液泡泡包裹了! + + +Your RestraintName pops with a loud bang! +你的 RestraintName 会发出巨响! +Your RestraintName starts leaking air! Very, very slowly... +你的 RestraintName 开始漏气!非常非常慢…… + + +Aqua Slime +水生粘液 +The aqua slime melts into a wet puddle. +水生粘液融化成一滩湿水。 +The aqua slime splashes against you! (DamageTaken) +水生粘液溅到你身上! ( DamageTaken ) +The aqua slime expands into a bubble and throws itself at you! (+RestraintAdded) +水生粘液膨胀成泡泡并朝你扑来! ( +RestraintAdded ) + + +Aqua Bubble (Head) +水生泡泡 ( 头部 ) +A squishy bubble made of a gelatinous substance! +由胶状物质构成的柔软泡泡! +You can pop it with a sharp enough edge, if you can get your tool in the position... +如果你能将工具放到正确的位置,你就可以用足够锋利的物品戳破它... + + +Aqua Bubble (Arms) +水生泡泡 ( 手臂 ) + + +Aqua Bubble (Legs) +水生泡泡 ( 腿 ) + + +The bubbles on you combine into one big bubble! +你身上的泡泡合并成一个大泡泡! + + +The stairs have been locked down for NMB more turns. +楼梯已被锁定 NMB 个回合。 + + +Curse of Increasing Tightness: Your restraints get tighter over time. +愈发紧密的诅咒 : ‎随着时间的推移,你的束缚会变得越来越紧。 +Curse of Lethargy: Reduce distraction over time, but miscast chance is increased by AMNT%. +嗜睡诅咒 : ‎随着时间推移减少性奋值,但施法错误的可能性增加 AMNT%。 +Curse of Mute: You cannot converse, and verbal spells cost AMNT% more mana. +哑巴诅咒 : ‎你无法交谈,并且言语类咒语会消耗 AMNT% 以上的法力。 +Curse of Clumsiness: After casting an arm spell, you drop your currently held weapon. +笨拙诅咒 : ‎施展手臂法术后,你会当前持有的武器会掉落。 +Curse of Deflection: 50% chance for an attack to be redirected against an adjacent hostile target. +偏转诅咒 : ‎有 50% 的几率将攻击转移到相邻的敌对目标。 + + +Loot Recovery: +战利品恢复 : ‎ + + +Enabled +开启 +You recover important items when you advance floors. +当你前进楼层时,你重要的物品会恢复 +Once items are lost, they are gone for good. +物品一旦丢失,就再也没有了 +Each item has a 25% chance of appearing in the chest between floors. +每件物品都有 25% 的概率出现在楼层之间的箱子里 +You find a familiar adventuring outfit! +你找到了熟悉的冒险服装! + + +You feel energy flow out of you, activating the floor below! +你感觉到能量从你身上流出,激活了下面的地板! +You feel energy flow out of you, lighting up a circle on the floor! +你感觉到能量从你身上流出,照亮了地板上的一个圆圈! +The floor beneath you drains your mana, but you don't have enough to satisfy it. +你脚下的地板会消耗你的魔法,但你没有足够的魔法来满足它。 +The ground beneath you glows with magical energy! +你脚下的大地闪耀着神奇的能量! + + +Radiant Light +灿烂光芒 +Banishment of the shadow. +驱除阴影 +Living Shadow +活体阴影 +Engulfs the tile in darkness. +瓷砖陷入黑暗。 + + +Planar Focus +平面焦点 +Absorbs teleportation energies. +吸收传送能量。 + + +Planar Diffractor +平面衍射仪 +Diffuses teleportation energies. +扩散传送能量。 + + +Planar Focusing Crystal +平面聚焦晶体 +Amplifies teleportation energies. +放大传送能量。 + + +Mysterious Plate +神秘板块 +What could it be? +可能是什么? +Mana-Charged Plate +法术充能板 +It seems like it needs more power... +它似乎需要更多的动力... +It's giving off a strange energy! +它释放出一种奇怪的能量! + + +Glass Plate +玻璃板 +Looks like it has lighting elements inside. +看起来里面有照明元素。 + + +Many bars come out of the ground and restrain you! +许多笼子从地上冒出来束缚你! +One Bar Missile +单杠投射物 +Restraining Bolt +束缚闪电 +Sealing Bolt +密封闪电 +Bondage Blast +捆绑冲击波 +Magic Missile +魔法投射物 +Warden's Cage +典狱长的笼子 + + +Restricting Bars +束缚笼 +The bars retract into the ground. +笼子缩回地面。 + + +Sealing Pillar +密封柱子 +The pillar collapses, causing zombies to rise up! +柱子倒塌了,使僵尸站了起来! + + +Safeword Please +请说安全词 +Allies don't help you unless you ask first. +除非你先开口,否则盟友是不会帮你的。 +Living Collars +活体项圈 +When you get jailed, you may get a living collar that applies further restraints on you. +当你入狱时,你可能会被佩戴一个活体项圈,对你施加进一步的束缚。 + + + + +The Warden's cage falls atop you and attaches to the floor with a click. +典狱长的笼子落在你上方,并发出 '咔' 的一声固定在地板上。 + + +The restraining bolt emits binding energies! +束缚闪电释放出束缚能! +The restraining bolt flashes and pushes you backward! +束缚闪电闪烁并将你向后推! +The restraining bolt transforms into cuffs on impact! +当你被束缚闪电劈中时会变成手铐! +The restraining bolt pins your cuffs to the wall! +束缚闪电将你的铐钉在墙上! + + +The spell explodes into restraining energy! +法术爆发出束缚能量! +The spell explodes and stuns you! +法术爆发并让你眩晕! +The spell congeals into restraints! +法术凝结成束缚! + + +The mage starts channeling her energy! +法师开始引导她的能量! + + +Warden Cuffs +典狱长铐 + + + + +Warden Leg Cuffs +典狱长腿铐 + + +Warden Ankle Cuffs +典狱长踝铐 + + +Your buttons have been pushed, and not in a pleasant way! +你的按钮已经被按下了,而且是以一种不愉快的方式! +Defeat all taunting enemies or stay within the tiles to avoid shame! +击败所有嘲讽的敌人或留在方格内以避免被羞辱! +Degradating Taunts +侮辱性嘲讽 +You failed to come up with a proper comeback! +你没能想出合适的反击方式! + + +The zone of frost damages you as you are chilled! +冰霜区域会让你因寒冷而受到伤害! +Confirm Path +确认路径 + + +Navigation Map +导航地图 +Choose a path to take by clicking on a highlighted room. +通过单击突出显示的房间来选择要采取的路径。 +Other paths will become inaccessible. +其他路径将变得无法通行。 +Floor NMB +层级 NMB +Tileset: +地形设置: +Map Modifier: +地图改动: +Layout: +布局: +Controlling Faction: +控制派系: +Main Objective: +主要目标: +Points of Interest: +兴趣点: + + +Magical Study +魔法研究 +Maintenance Hall +保养大厅 +Ancient Chest +远古宝箱 +Caldera Passage +火山口通道 +Auction Hall +拍卖厅 +Dark Altar +黑暗祭坛 +Dimensional Rift +次元裂隙 +Hoard +宝库 +Dragon's Lair +龙的宝藏 + + +Witch's Lair +女巫巢穴 +Mold Infestation +霉菌感染 +Bandit Raid +盗贼袭击 +Dragon Sighting +龙 sighting +Slime Infestation +黏液侵袭 +Wolfgirl Training +狼娘训练 +Drone Patrol +无人机巡逻 + + +Shop +店铺 +Chamber +寝室 +Prison +监狱 +Sorting Room +分拣室 + + +Click a hotbar slot to assign the current item to it.|You can click the swap button on the right|to switch between your five hotbars.||You can also save and load presets for your hotbar.|These are shared between runs. +点击快捷栏位置,即可将项目分配到该槽。|您可以点击右侧的交换按钮,在三个热栏之间进行切换。||您还可以为您的快捷栏保存和加载预设。|这些预设在运行时共享。 + + +You step on the item and tug to pull it taut... +你踩在物品上并用力拉紧它...... +You tug furiously against the leash, pulling it taut! +你猛力拉扯皮带,把它拉紧! + + +Silenced Hall +寂静大厅 + + +The waist-deep water slows you! +齐腰深的水让你行动缓慢! + + +Sariel Vinlaga's Panties +萨里尔·文拉加(Sariel Vinlaga) 的内裤 +Legend has it that these were worn by the legendary archmagus herself. +据传说,这是传奇大法师本人所佩戴的。 +If you keep them in your mouth, your verbal spells have -50% miscast chance. +10% spell damage. +如果你将它塞在嘴里,你的口头咒语的施法失误概率将 -50%。+10%法术伤害。 +You find a pair of black panties with pink trim, scrunched up in a ball. +你发现了一条带有粉色镶边的黑色内裤,蜷缩成一团。 + + +Elven Panties +精灵内裤 +In faraway lands, they often say that less is more... +在遥远的国度,人们常说少即是多…… ++11% sprint efficiency ++11% 冲刺效率 +You find a pair of elven panties. +你找到了一条精灵内裤。 + + + + +Hood of Fluffoth +弗拉弗斯(Fluffoth) 的兜帽 +Worn by devotees to Fluffoth, demonic ruler of the plush abyss. +毛绒深渊的恶魔统治者 弗拉弗斯(Fluffoth) 的信徒们佩戴的。 +When distraction reaches 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 40 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. +当性奋值达到 90% 时,发射一波柔和的能量波,覆盖 5x5 范围内的目标。造成 40 点绒织伤害并持续 3 回合。干扰低于 50% 时重新充能。 5 回合体内冷却。 +When distraction is over 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 30 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. +当性奋值超过 90% 时,发射一波柔和的能量波,覆盖 5x5 范围内的目标。造成 30 点绒织伤害并持续 3 回合。干扰低于 50% 时重新充能。 5 回合体内冷却。 +You find a sinister hood made of soft plush. +你发现了一个由柔软的毛绒制成的阴险头套 + + +Ceremonial Leotard +礼仪紧身衣 +An article worn by the servants of state in the short-lived kingdom of Ejahl. Its locking mechanism and clothes-dissolving enchantments ensure the wearer understands her role as an extension of the state. +在短暂的埃加赫王国,国家公务员所佩戴的物品。它的锁定机制和衣物溶解魔法确保佩戴者理解她作为国家的延续。 +Its soul crystals harden the mind and dampen changes in willpower, reducing all willpower changes by 25%. +它的灵魂水晶使头脑变得坚硬,抑制意志力的变化,使所有意志力的改变减少25%。 +You find a ceremonial leotard. +你找到了一件礼仪紧身衣。 + + +The Robe of Chastity +贞洁长袍 +A magical leotard whose power infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. +一件充满神力却又人工的魔力紧身衣,其力量蕴含一种类似于神的力,但却是人工的。由一种织法制成,能够将穿戴者的深层能量转化为强大的能量,只要没有其他衣物覆盖在它之上。 +It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire. +据说,凡是遵循圣骑士贞洁原则的人都将获得 -1%的欲望程度衰减/40回合 和2(+3%已损失性奋值)神圣伤害/回合 的光环。光环仅影响进入近战范围的敌人。此外,魔力传导布料具有相当的刺激性,可使所有来源的性奋值增益提高 50%,并将消耗的法力值的 8% 转化为欲望。 +A magical leotard infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. +充满神性却人工的魔法紧身衣。由一种织物制成,这种织物能够将穿戴者的深层能量转化为强大的能量,只要没有其他衣物覆盖在上面。 +You retrieve an interesting article dubbed 'the Robe of Chastity. +您检索到一篇题为 “贞洁长袍 ”的有趣文章。 + + +### Took + +(As you slay the dragon, it begins shapeshifting into human form!) +(当你杀死龙时,它开始变形为人形! ) + + +Crystal Dragon Queen +结晶龙女皇 +The crystal dragon shapeshifts back to human form! +结晶龙变回人形! +The crystal dragon strikes you with its claws! (DamageTaken) +结晶龙用爪子攻击你! ( DamageTaken ) +The crystal dragon breaths a sparkling dust, which hardens into crystal! (+RestraintAdded) +结晶龙喷出闪闪发光的粉末,粉末凝固后便变成了水晶! ( +RestraintAdded ) +The crystal dragon takes flight and swoops toward you! +结晶龙飞起来并向你俯冲过来! +The crystal dragon takes flight and slams into you! (Stunned!) +结晶龙飞起来撞向你! ( Stunned! ) +Crystal Dragon Girl +结晶龙娘 +The dragon girl submits to you! +龙娘臣服于你! +The dragon girl slams you with several hurled crystals! (DamageTaken) +龙娘向你投掷数颗结晶! ( DamageTaken ) +The dragon girl conjures a cloud of crystals that solidify! (+RestraintAdded) +龙娘召唤出一团凝固的结晶云! ( +RestraintAdded ) +The dragon girl conjures crystalline locks on you! (+RestraintAdded) +龙女在你身上召唤出了水晶般的发丝!(+束缚增加) + + +Poison Dragon Queen +毒龙女皇 +The poison dragon shapeshifts back to human form! +毒龙变回人形! +The poison dragon strikes you with its claws! (DamageTaken) +毒龙用爪子攻击你! ( DamageTaken ) +The poison dragon extends many vines from its wings! (+RestraintAdded) +毒龙的翅膀上长出了许多藤蔓! ( +RestraintAdded ) +The poison dragon takes flight and swoops toward you! +毒龙飞起并向你扑来! +The poison dragon takes flight and slams into you! (Stunned!) +毒龙飞起来撞向你! (Stunned! ) +Poison Dragon Girl +毒龙娘 +The dragon girl slashes you with her venomous nails! (DamageTaken) +龙娘用她有毒的指甲砍你! ( DamageTaken ) +The dragon girl raises vines out of the ground to bind you! (+RestraintAdded) +龙娘从地面伸出藤蔓来束缚你! ( +RestraintAdded ) +The dragon girl holds you in place and locks your restraints! (+RestraintAdded) +龙娘将你牢牢地固定在原地,并锁住你的束缚!(+RestraintAdded) + + + + +Ice Dragon Queen +冰龙女皇 +The ice dragon shapeshifts back to human form! +冰龙变回人形! +The ice dragon strikes you with its claws! (DamageTaken) +冰龙用爪子攻击你! ( DamageTaken ) +The ice dragon catches you in its icy breath! (+RestraintAdded) +冰龙用它冰冷的气息抓住了你! ( +RestraintAdded ) +Ice Dragon Girl +冰龙娘 +The dragon girl slams you with several chunks of ice! (DamageTaken) +龙娘用几块冰砸向你! ( DamageTaken ) +The dragon girl splashes you with instantly freezing ice! (+RestraintAdded) +The dragon girl conjures magical locks on you! (+RestraintAdded) +The dragon girl conjures magical locks on you! (+RestraintAdded) +龙娘对你施展魔法锁!(+RestraintAdded) + + + + +Shadow Dragon Queen +暗影龙女皇 +The shadow dragon shapeshifts back to human form! +暗影龙变回人形! +The shadow dragon slashes directly at your mind! (DamageTaken) +暗影龙直击你的心灵! ( DamageTaken ) +The shadow dragon wraps itself around you many times! (+RestraintAdded) +暗影龙多次缠绕你! ( +RestraintAdded ) +Shadow Dragon Girl +暗影龙娘 +The dragon girl stares into your eyes! (DamageTaken) +龙娘凝视着你的眼睛! ( DamageTaken ) +The dragon girl reaches out with a shadowy grip! (+RestraintAdded) +龙娘伸出阴影般的手! ( +RestraintAdded ) +The dragon girl reaches out and locks your restraints! (+RestraintAdded) +龙女伸出手来锁住了你的束缚!(+RestraintAdded) + + + + +A cage falls from the ceiling on top of you! +一个笼子从天花板上掉下来砸中了你! +Crystals grow across your body and encase you! +结晶在你的身体上生长并包裹住你! +You are encased in a solid block of ice! +你被包裹在一块坚固的冰块里! +A shadowy sphere rises from the ground and wraps over you tightly! +一个模糊的球体从地上升起,并紧紧地包裹在你身上! +Shadows coalesce themselves around you in spherical form! +阴影以球的形式在你周围聚结! + + +Crystal Encasement +结晶封印 +An overgrowth of magical crystals. Their chaotic energies flood into your mind and displace your thoughts! +魔法结晶过度生长。它们的混乱能量涌入你的脑海,扰乱你的思维! +Being brittle, it will eventually crack and fail. Just keep wiggling... +由于易碎,它最终会破裂并失效。只需继续扭动即可…… +Ice Encasement +冰封 +A huge ice cube. It's quite cold in there. +好大一块冰块,里面挺冷的。 +It will eventually melt! Eventually... +它最终会融化!最终…… + + +The Warden's restraints release you... for now. +典狱长的束缚暂时释放了你…… + + +Chain Hogtie +链式驷马 +A metal chain holds your back in an arched position. +金属链将你的背部固定于拱起的位置。 + + +A chain connecting your thigh cuffs together. You can still walk, albeit slower than usual. +一条将大腿铐连接在一起的链条。你仍然可以行走,但是速度比平时慢。 +It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. +它是钢制的,且用锁固定。解锁后会丢失。 + + +A chain connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. +一条将脚踝铐连接在一起的链条。它为你提供了足够的走动空间,但是速度比平时慢。 +Ankle Chain (Short) +踝链 ( 短 ) +A short chain connecting your ankle cuffs together. You can barely separate your legs with this on. +一条短链将你的脚踝铐连接在一起。戴上它,你的双腿几乎无法分开。 + + +A very short chain connecting your elbow cuffs together. It is quite awkward to remove by yourself. +一条很短的链条,将你的肘铐连接在一起。自己取下来很不方便。 +A very short chain connecting your wrist cuffs together. +一条非常短的链条,将你的手腕铐连接在一起。 + + +Vine Pod +藤荚 +The vine pod explodes into dust! +藤荚爆炸成灰尘! +The vine pod wraps you in vines and squeezes! (DamageTaken) +藤荚将你包裹在藤蔓中并挤压! ( DamageTaken ) +The vine pod launches several vines at you in quick succession! (+RestraintAdded) +藤蔓荚会快速连续地向你发射几根藤蔓! ( +RestraintAdded ) + + +Sleep Flower +睡眠花 +The sleep flower explodes into dust! +睡眠花爆炸成灰尘! +The sleep flower sprays pollen into your face! Achoo! (DamageTaken) +睡眠花将花粉喷到你脸上!阿嚏! ( DamageTaken ) +The sleep flower launches several vines at you in quick succession! (+RestraintAdded) +睡眠花快速连续向你发射几根藤蔓! ( +RestraintAdded ) + + +Several vine pods sprout out of the ground! +数颗藤蔓破土而出! +A vine pod sprouts out of the ground! +一颗藤蔓破土而出! +Several flowers sprout out of the ground! +几朵花从地上发芽! +A magical flower sprouts out of the ground! +一个神奇的花朵从地上萌芽! +A wall of ice rises from the ground! +一道冰墙从地底升起! +The dragon's breath poisons you! +龙息让你中毒! +The dragon girl strikes you with poisonous razor leaves! +龙娘用有毒的剃须叶攻击你! +The flower releases soporific spores! +花释放催眠孢子! +Poison Breath +毒息 + + +Vines reach from the ceiling and lift you into the air! +藤蔓从天花板伸出,将你带到空中! + + +Vine Suspension +藤蔓悬挂 +Vines linked to your bindings that keep you suspended! +藤蔓与你的束缚相连,让你悬浮! +You are left dangling! Maybe if you swing hard enough you can tear the vines... +你悬空了!也许你挥动得足够用力,你就能震破藤蔓...... + + +Darkstar Studios - Slimy Science +Darkstar Studios -《黏糊糊的科学》 +Kocaeli - Doll Storage +Kocaeli - 《玩偶柜》 +Kocaeli - Factory +Kocaeli - 工厂 +Kocaeli - AAA +Kocaeli - 《AAA》 +Kocaeli - DD +Kocaeli - 《DD》 +Ada18980 - Playing with fire +Ada18980 - 《玩火》 +Ada18980 - Smoking is bad for you +Ada18980 - 《烟有害》 +Kocaeli - Graveyard +Kocaeli - 《沉眠地》 +Kocaeli - Ancient Tombs +Kocaeli - 《古墓》 +Kocaeli - Magic Library +Kocaeli - 《魔法图书馆》 +Kocaeli - Black Cat +Kocaeli - 黑猫 +Kocaeli - Black Cat 2 +Kocaeli - 黑猫2 +Kocaeli - Underground Jungle +Kocaeli - 《地下丛林》 +Kocaeli - Untitled +Kocaeli - 无标题 +Kocaeli - Lost Temple +Kocaeli - 《失落的神殿》 +Kocaeli - Orrery +Kocaeli - 《天文钟》 +Kocaeli - Bellows +Kocaeli -《风箱》 +Kocaeli - Rubber Facility +Kocaeli - 《橡胶工厂》 +Kocaeli - Edge of Reality +Kocaeli - 《现实边缘》 +Kocaeli - 1 +Kocaeli - 《1》 + + +Icy Barrier +冰冷屏障 +The wall of ice shatters! +冰墙破碎! + + +Icy Breath +冰冷呼吸 +Ice Orb +冰珠 +The EnemyName breaths in deeply, causing the air around you to chill... +EnemyName 深呼吸,让你周围的空气变得寒冷... + + +Shadow Bubble +暗影泡泡 +The projectile explodes into tight shadow latex, stretching all across your body! +射弹爆炸成紧密的暗影乳胶,伸展到你的全身! +The dragon dances through the shadows! +龙在阴影中舞动! + + +You tip over as you try to roll yourself! (oof!) +当你试图翻身时你会被磕到! ( 哎哟! ) + + +The shadowy energies surrounding you drain away your mana... +你周围的阴暗能量会耗尽你的法力...... + + +Shadow Sphere +暗影球体 +A giant shadow latex sphere that leaves you rolling around... +一个巨大的阴影乳胶球,让你滚来滚去...... + + +Dark magics fill the air! +空气中弥漫着黑暗魔法! + + +Shadow Posture Collar +影姿项圈 +A strict collar that seals your mouth tightly. +严格的项圈可以紧紧地封住你的嘴。 +It is made of shadow latex, tougher to cut than normal latex. +它由阴影乳胶制成,比普通乳胶更难切割。 + + +Not bad... you made me use 10% of my power. +还不赖…… 你让我用了百分之十的力量。 + + +It's a defunct elevator, likely from the Old Civilization. +这是一部废弃的电梯,可能来自旧文明。 + + +(The elevator beeps and roars to life)|(Its control panel displays a list of options) +( 电梯发出嘟嘟声和轰鸣声 ) | ( 其控制面板显示选项列表 ) +(Go to floor 0) +( 前往第 0 层 ) +(Go to floor 1) +( 前往第 1 层 ) +(Go to floor 2) +( 前往第 2 层 ) +(Go to floor 3) +( 前往第 3 层 ) +(Go to floor 4) +( 前往第 4 层 ) +(Go to floor 5) +( 前往第 5 层 ) +(Go to floor 6) +( 前往第 6 层 ) +(Go to floor 7) +( 前往第 7 层 ) +(Go to floor 8) +( 前往第 8 层 ) +(Go to floor 9) +( 前往第 9 层 ) +(Go to floor 10) +( 前往第 10 层 ) +(Go to floor 11) +( 前往第 11 层 ) +(Go to floor 12) +( 前往第 12 层 ) +(Go to floor 13) +( 前往第 13 层 ) +(Go to floor 14) +( 前往第 14 层 ) +(Go to floor 15) +( 前往第 15 层 ) +(Go to floor 16) +( 前往第 16 层 ) +(Go to floor 17) +( 前往第 17 层 ) +(Go to floor 18) +( 前往第 18 层 ) +(Go to floor 19) +( 前往第 19 层 ) +(Go to floor 20) +( 前往第 20 层 ) + + +(The viewscreen depicts a face)|Why hello there adventurer! What brings you? +( 屏幕上描绘了一张脸 ) |你好,冒险家!什么风把你吹过来啦? + + +### Hmmmphgm? + +(The face giggles)|Sadly my language processing systems aren't that good.|Try removing your gag first? +( 脸上咯咯地笑 ) |可悲的是我的语言处理系统不太好。|先试着去掉你的口塞? +(The face smiles)|I am the Facility's vessel, of course!|Sariel called me Oriel, but I don't see her much these days... +( 脸上微笑 ) |当然,我是设施的容器!|萨里尔(Sariel)叫我奥丽尔(Oriel),但这些天我很少见到她...... + + +### Gffmmphmm? + +(Oriel smiles)|Ah, it's you again!|It seems like you've found a new toy as well?|I can't understand you, silly~ +( 奥丽尔(Oriel)笑 ) |啊,又是你!|你好像找到了新玩具?|我听不懂你在说什么,笨蛋~ +Oriel? As in the goddess of technology? +奥丽尔(Oriel)?就像科技女神里的那样? +'Goddess'? That seems like an outdated term.|Regardless, I am only a vessel, not the facility itself. +'女神'?这似乎是一个过时的术语。|无论如何,我只是个容器,而不是设施本身。 + + +(Oriel giggles)|Sweetie, I can't understand you. +( 奥丽尔(Oriel)咯咯笑 ) |亲爱的,我听不懂你在说什么。 +Can you control the facility? +你能控制设施吗? +(Oriel frowns)|Adventurers seem to keep asking me that.|In my current state I don't have control over much at all.|But I'm always here to talk! +( 奥丽尔(Oriel)皱眉 ) |冒险家们似乎一直在问我这个问题。|在我目前的状态下,我根本无法控制太多。|但我总是在这里说话! + + +Can you turn on the elevator? +你能打开电梯吗? +I'm sorry, adventurer. I can't do that.|But maybe if you can get rid of all the nearby threats...|They've been under lockdown for a long time.|Just push the button again if it hasn't updated yet. +对不起,冒险家。我做不到。|但也许如果你能摆脱所有附近的威胁...|它们已经被锁定很长时间了。|如果尚未更新,请再次按下按钮。 + + +Mmmph mmm! (Help me!) +Mmmph mmm! (帮帮我!) +(Oriel chuckles)|What was that again?|Sorry~ +( 奥丽尔(Oriel)轻笑 ) |那又是什么?|抱歉~ +Can you help me out? +你能帮我吗? +(Oriel giggles)|I can't do anything for you right now~ +( 奥丽尔(Oriel)咯咯笑 ) |我现在帮不了你什么~ + + +### Mmmmm... + +(Oriel smiles)|It's always fun to see you like that~ +( 奥丽尔(Oriel)微笑 ) |看到你这样总是很开心~ +How are you doing? +你还好吗? +(Oriel smiles)|Good!|I miss Sariel, though... +( 奥丽尔(Oriel)微笑 ) |好!|我想念萨里尔(Sariel),不过…… + + +RMNME of CHTRNME the ENMYNME +ENMYNME CHTRNME 的 RMNME + + +The item is TTT, and will get looser as you progress. +此物品TTT,随着你的进度会变得更宽松。 + + +somewhat tight +有点紧 +rather tight +相当紧 +quite tight +很紧 +especially tight +特别紧 +extremely tight +非常紧 +incredibly tight +极其紧 + + +somewhat secure +有点安全 +secure +安全 +quite secure +很安全 +highly secure +高度安全 +extremely secure +非常安全 +incredibly secure +极其安全 + + +somewhat thick +有点厚 +rather thick +相当厚 +quite thick +很厚 +highly thick +非常厚 +extremely thick +极厚 +incredibly thick +难以置信的厚 + + +You must first accept the quest before offering at the shrine. +你必须先接受任务,然后才能到神泉献祭。 + + +Zero Resistance +放弃反抗 +Toggle this to set bondage resist, evasion, and block to 0. While enabled, using the 'wait until interrupted' button will not be interrupted when hit or bound. +切换此选项可将束缚抵抗、躲避和格挡设置为0。启用后,当点击或绑定时,使用“等待中断”按钮将不会中断。 + + +The RSTRT feels a little looser! +你感到 RSTRT 有点松! + + +Crystal Armbinder +结晶单手套 +A growth of crystals fusing your arms together. Chaotic energies radiate in all directions, causing you to slowly lose control over your desires. +生长的结晶将你的手臂融合在一起。混乱的能量向各个方向辐射,导致你慢慢失去对欲望的控制。 +Crystals are tough but not unbreakable. +结晶很坚硬,但并非牢不可破。 + + +Crystal Ball Gag +结晶口球 +A growth of crystals inside your mouth. It emits a strange, pleasurable sensation. +你嘴里长出了结晶。它散发出一种奇怪的、愉悦的感觉。 + + +Crystal Gag Necklace +结晶口球项链 +An arousing accessory made of solid crystal! +一个由固体结晶制成的令人兴奋的配件! +Simply popping it out of your mouth isn't enough to negate its effects entirely~ +简单地把它从嘴里拿出来并不足以完全消除它的影响~ + + + + +The lock is protected by a seal of repentance. To unlock it you must pay 1 spell point. +这把锁被忏悔封印保护着。若要解锁它,你必须支付 1 技能点。 +The restraint won't budge. +束缚不会动摇。 +You perform a ritual to unlock the item! +你执行了一个仪式来解锁该物品! + + +The lock is protected by a seal of repentance. To unlock it you must pay AMNT spell points! +这把锁被忏悔封印保护着。若要解锁它,你必须支付 AMNT 技能点! +You perform a grand ritual to unlock the item! +你执行一个盛大的仪式来解锁该物品! + + +Warden's Thigh Chain +典狱长的大腿链 +You've stolen something of great value. Now you must give it back. +你偷了一些很有价值的东西。现在你必须把它还回去。 + + +Warden's Ankle Chain +典狱长的踝链 +Warden's Ankle Link +典狱长的踝短链 +An intense, albeit temporary punishment for breaking the rules. +对违反规则的行为给予严厉的惩罚,不过是暂时的。 + + +Warden's Elbow Chain +典狱长的肘链 +Warden's Wrist Chain +典狱长腕链 + + +ESCP Difficulty: AMNT +ESCP 难度 : ‎AMNT +ESCP Power: AMNT +ESCP 力量 : ‎AMNT +ESCP Ability: AMNT +ESCP 能力: AMNT +Max ESCP Depth: AMNT% +最大 ESCP 深度: AMNT% + + +Cut +切 + + +Your collar channels the vigor of excitement into magical energy! +你的项圈将兴奋的活力转化为神奇的能量! +The collar has already squeezed what it can out of you. Clear your mind first! +项圈已经把你挤得喘不过气来了。集中精神! + + +The guardian deploys a forcefield! +守护者部署了一个力场! +The guardian deploys a set of forcefields! +守护者部署了一组力场! + + +Guardian Drone +守护者无人机 + + +Cyber Guardian +赛博守护者 + + +Auto Enforcer Guardian +自行执法守护者 + + + + + + +Time to get you into your uniform~ +该穿上制服了~ +You won't be needing any of this. +你不需要这些。 +There we go, all ready for training! +好了, 一切准备就绪, 可以进行训练了! + + +Cyber Storage +赛博容器 +An all-purpose metal crate equipped with a polycarbonate blast door and steel reinforcement. +多功能金属箱,配备有聚碳酸酯防爆门和钢筋。 +Used throughout the reign of the Old Civilization to store slaves and prisoners. +在整个古代文明统治时期,它被用来关押奴隶和囚犯。 + + +The liquid latex sticks to your skin, forcing an airtight layer! +液态乳胶会粘在你的皮肤上,形成一层气密层! +The latex starts to build up layers, forcing a protective coating... +乳胶开始分层,施加保护涂层... +The latex starts adhering to your skin, becoming extremely difficult to remove... +乳胶开始附着在你的皮肤上,变得非常难以去除... +The latex seals you in, rendering escape impossible without alchemical methods. +乳胶把你密封起来,如果没有炼金术的方法,是不可能逃脱的。 +The liquid latex spray slows you down! +液体乳胶喷雾会减缓你的速度! + + +Latex Sprayer +乳胶喷雾炮塔 +The turret deactivates after taking too much damage! +炮塔在受到大量伤害后会失效! +The turret defends itself with a spray of sticky liquid latex! (DamageTaken) +炮塔用一股粘稠的液体乳胶来保护自己!(DamageTaken) + + +Your latex layer adheres to latex, making struggling more difficult! +你的乳胶层会粘在乳胶上,让挣扎变得更加困难! +The item sticks to your rubber layer, making it harder to pull off... +该物品会粘在你的橡胶层上,使其更难拔出... +The item hugs your layer tightly, adhering firmly! +该物品紧紧地包裹着你的表层,粘得很牢固! +Your skin is covered in a layer of latex, making escape from cyber restraints harder! +你的皮肤上覆盖着一层乳胶,让你更难摆脱赛博拘束! + + +Some Exclusions Apply +有限移除 +Goddess shrines do not remove non-binding restraints such as harnesses and cuffs. +女神神殿不会移除非拘束性束缚,如束衣和手铐。 + + +Melee Specialization +近战专精 +Gain 25% base physical damage, but your spells do 50% less damage. +获得25%的基础物理伤害,但你的法术造成的伤害减少50%。 +Melee Expert +近战专家 +Gain +20 Accuracy and +10% base physical damage. +获得+20精度和+10%基础物理伤害。 + + +Magic Specialization +魔法专精 +Gain 25% spell damage, but your attacks are delayed by 1 turn when attacking. +获得25%的法术伤害,但攻击时你的攻击会延迟1回合。 +Spell Expert +施法专家 +Gain -10% miscast chance and +10% spell damage. +获得-10%口头咒语的施法失误概率和+10%法术伤害。 + + +Ranged Specialization +远程专精 +You deal 20% more damage to enemies further than 2 tiles away, but enemies adjacent to you take 60% reduced damage. +你对距离超过2个格子的敌人造成的伤害增加20%,但与你相邻的敌人受到的伤害减少60%。 +Ranged Weapon Expert +远程武器专家 +Bows, guns, and other projectile weapons do 10% more damage and consume 10% less charge. +弓、枪和其他投射性武器造成的伤害增加10%,消耗的能量减少10% + + + + +After casting a DMG spell: +施展 DMG 法术后: +Gain AMNT% DMG Damage for DRTN turns +DRTN 回合获得 AMNT% DMG 伤害 +Gain AMNT DMG Resist for DRTN turns +DRTN 回合获得 AMNT DMG 抗性 +Your elemental damage is increased! +你的元素伤害增加了! +Your elemental resistance is increased! +你的元素抵抗增加了! + + +The overgrown monolith contains an ancient blessing. +这块杂草丛生的巨石蕴含着古老的祝福。 +Choose a stat to increase below. +选择下面要增加的统计数据。 + + +Confirm Choice +确认选择 + + +Increase max distraction by AMNT%. +性奋值上限增加 AMNT%。 +DP decays faster and more SP is safe from damage. +性奋值衰减得更快,更多的体力值免受损害。 +Increase max stamina by AMNT. +体力值上限增加 AMNT 点。 +Increase max mana by AMNT. +法力值上限增加 AMNT 点。 +Increase max willpower by AMNT. +意志力上限增加 AMNT 点。 +Gain +AMNT SP regen/turn. +每回合恢复 +AMNT 点体力。 + + +### AMNT1 -> AMNT2 + +AMNT1 (max) +AMNT1 (最大) + + +You found a magical amulet! Choose one of the following to determine its benefits: +你发现了一个神奇的护身符! 你可以在以下选项中选择一种加成 : ‎ +Focus: +50% max distraction and faster decay. +5% stamina protected from damage (base: 30%). +专注 : ‎+50% 性奋值上限和更快的衰减。 +5% 体力伤害保护 ( 基础 : ‎30% ) 。 +Stamina: +50 max stamina. +体力 : +50‎体力值上限。 +Magic: +50 max mana. +魔法 : ‎+50 法力值上限。 +Willpower: +50 max willpower. +1 stamina regen/turn. +意志力 : ‎+50意志力上限。每回合体力恢复 +1。 + + +A mystical orb stands before you. +一个神秘的宝珠出现在你面前。 +You break the orb and gain its secrets. +你打破了宝珠并获得了它的秘密。 + + +Stun Resistance! +眩晕抗性! + + +Negate Rune +否定符文 +Removes a rune on the target tile. If cast on self, removes all runes you've created instead. Casting on an enemy rune restores 10 mana instead. +移除目标方块上的符文。如果对自己施放,则改为移除你创建的所有符文。如果对敌方符文施放,则改为恢复 10 点法力。 +You scribe a negation rune! +你写下了一个否定符文! +Target a single rune, or yourself to negate all your runes. +瞄准单个符文或自己来否定所有符文。 +You don't have enough mana +你没有足够的法力 +The enemy rune is wiped clean. +敌方符文已被清除干净。 +You pour negation magic into the ground, but nothing happens. +你把否定魔法灌注到地面,但什么也没有发生。 +All of your runes have been removed. +你的所有符文都已被移除。 + + +E-Stimulation +刺激电流 +Replaces most instances of painful electric shocks with stimulating effects instead. +用刺激效果代替大多数痛苦的电击。 + + +The energy bolt hits you and sends stimulating energies through you! +能量束击中你并向你体内传送刺激能量! + + +You steal a key card. +你偷了一张钥匙卡。 +Key Card +钥匙卡 +The keycard's shiny surface reflects the light in a mesmerizing way. +钥匙卡闪亮的表面以迷人的方式反射光线。 +A piece of identification that contains an access code. +一段包含访问代码的标识。 +You can use it to unlock certain doors. +你可以用它来解锁某些门。 +Your keycard blinks red as the facility remotely locks it! +当设备远程锁定时,你的钥匙卡会闪烁红色! +Your keycard blinks red as the facility remotely locks it! System Security: 100% +当设施远程锁定时,你的钥匙卡会闪烁红光!系统安全性 : 100% +Unauthorized removal detected. System Security: AMNT% +检测到未经授权的删除。系统安全性 : AMNT% +Security breach. Initiating remote lockout. System Security: AMNT% +安全漏洞。启动远程锁定。系统安全性 : AMNT% + + +You pick up a flash bomb. +你拿起了一颗闪光弹。 +You pick up a flashbang grenade. +你拿起了一颗闪光震爆弹。 + + +Actions +行动 +Self +自身 +Dialogue +对话 +Ambient +环境 +Kills +击杀 + + +You attack TargetEnemy for DamageDealt total damage. +你攻击了 TargetEnemy, 造成 DamageDealt 点伤害。 +You attack TargetEnemy for DamageDealt damage / BondageDealt binding. +你攻击了 TargetEnemy, 造成 DamageDealt 点伤害并施加 BondageDealt 束缚。 +You attack TargetEnemy but don't do any damage. +你攻击了 TargetEnemy,但没有造成任何伤害。 +ENMY calls for help! +ENMY 请求帮助! + + +(Go to The Summit) +( 前往顶部设施 ) + + +The Summit is a safe area. Items can be left here without fear of losing them. +顶部设施是一个安全地区。物品可以放在这里,不用担心丢失。 + + +Target an NPC to attach a leash. Enemies and unwilling allies must be tied up to 50% first. Target self to release all leashes, or target a leashed NPC to unleash them. +以NPC为目标绑上皮带。敌人和不情愿的盟友必须首先被捆绑到50%。以自身为目标释放所有的束缚,或者以一个被束缚的NPC为目标释放它们。 +Target an NPC to leash, or self to unleash all. +以NPC为目标进行束缚,或以自我为目标进行释放。 + + +Brat Handler +顽童处理员 +Target an NPC with an equipped leash restraint (via Truss'em'up) to attach a leash. Target self to release all leashes, or target a leashed NPC to unleash them. +以装备了牵引绳束缚装置的 NPC 为目标 ( 通过'把他们捆起来!'动作 ) 来系上牵引绳。以自己为目标来松开所有牵引绳,或以被牵引的 NPC 为目标来解开它们。 + + +Clip-On Leash +夹子皮带 +A beloved favorite of pets and trainers alike. +宠物和训练师的最爱。 +You ready the leash... +你准备好了皮带... +You pick up a leash. +你拿起一条皮带。 + + +You are not in a condition to use a leash on her. +你不能用皮带拴住她。 +She refuses to be leashed unless you tie her up! +除非你把她绑起来,否则她不能被拴住! +You attach a leash to ENMY. +你给 ENMY 系上皮带。 +You remove your leash from ENMY. +你把皮带从 ENMY 上取下来。 +You let go of all leashes. +你松开了所有的皮带。 + + +Plastic Explosive +塑胶炸弹 +Has a 60 turn timer, but can be detonated by other explosives. Deals 210 blast damage in a huge radius and leaves behind a huge field of rubble. Enemies hit have their armor reduced by 50 BEFORE taking damage. +有一个60回合的计时器,但可以被其他炸药引爆。在巨大的半径范围内造成210处爆炸破坏,并留下一大片瓦砾。被击中的敌人在受到伤害之前减少50护甲。 +It's totally harmless! Probably. +这完全无害!可能吧。 +You set the clock ticking... +你让时钟滴答作响... + + +Dynamite +甘油炸药 +10 turn fuse with a 25% chance each turn to detonate prematurely. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. +10回合的引信,每回合有25%的几率提前引爆。在大范围内造成140点爆炸伤害。被击中的敌人在受到伤害之前减少20护甲。 +Arguably more dangerous to the user than the target. +可以说,对用户来说比目标更危险。 +10 turn fuse with a 25% chance each turn to detonate. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. +10回合的引信,每回合有25%的几率引爆。在大范围内造成140点爆炸伤害。被击中的敌人在受到伤害之前减少20护甲。 +You light the fuse and pray it doesn't blow up in your face. +你点燃保险丝,祈祷它不要在你脸上爆炸。 + + +You are holding too many leashes! +你的皮带太多了! + + +You feel a corrupting influence... (+AMNT Corruption) +你受到了一些腐化... (+AMNT Corruption) +You feel a restoring influence! (-AMNT Corruption) +你受到了一些恢复! (-AMNT Corruption) +Sticky latex fuses itself to your skin! (+AMNT LatexIntegration) +粘性乳胶与你的皮肤融合到一起了!(+AMNT LatexIntegration) +The latex starts to detach from your skin... (-AMNT Latex Integration) +乳胶开始从你的皮肤上脱落... (-AMNT Latex Integration) + + +While you have an evasion penalty, even clumsy enemies... +虽然你有逃避惩罚,但即使是笨拙的敌人...... +... will get an accuracy bonus against you in melee range. +... 将在近战范围内对你的准确度获得加成。 + + +You are more likely to succumb to curses. +你更容易被诅咒。 + + +X Offset +X 补偿 +Y Offset +Y 补偿 +X Scale +X 比例 +Y Scale +Y 比例 +X Pivot +X 轴 +Y Pivot +Y 轴 +Rotation +旋转 +Layer Bonus +图层补偿 +NoDynamicArmor (0/1) +无动态护甲(0或1) +### AddPose + +HideOverridden (0/1) +隐藏覆盖(0或1) +NoOverride (0/1) +无覆盖(0或1) +Hide Pose (e.g. Xray) +造型隐藏(例如X射线) +Require Pose (e.g. ChestArmor) +造型显示(例如ChestArmor) +Hide Prefix (e.g Encase) +隐藏前缀(例如 Encase) +Hide Suffix (e.g TorsoUpper) +隐藏后缀(例如TorsoUpper) +Protected +受保护的 +### Displace Amount + +### Erase Amount + +Load from File +从文件载入 +Save to File +保存至文件 + + +Tip: Slime/Latex tiles only affect entities with less than 45 Glue Resist. +提示 : ‎粘液/乳胶块仅影响胶体抗性低于 45 的实体。 +Being drenched in water also prevents slime/latex from sticking to you. +浸湿在水中还可以防止粘液/乳胶粘在你身上。 +Use the interact tool in the bottom right HUD to sleep in a bed. +使用右下角 HUD 中的交互工具在床上睡觉。 + + +Clear Vision +视野通透 +Blindfolds are much rarer. +眼罩将会很少见。 +Free the Boob +胸部自由 +Chastity bras are rarer unless you are wearing nipple toys. +除非你穿着乳头玩具,否则贞操文胸将会很少见。 +Liberate the Boob +解放胸部 +Chastity bras are much rarer. +贞操文胸将会很少见。 + + +Find an elevator to the Summit in order to access facilities. +找到通往顶部设施的电梯以便使用设施。 +Visit the Summit to allow additional interactions with this facility. +参观顶部设施可以与该设施进行更多互动。 +Must visit the Summit or be in a perk shrine to recycle restraints. +必须去峰顶或者在强化神殿中回收束缚。 + + ++AMNT% Training/Tick ++AMNT% 训练/刻 ++AMNT% Opinion/Tick ++AMNT% 观点/刻 ++AMNT% Productivity ++AMNT% 生产力 +AMNT/MAXX Prisoners Assigned +AMNT/MAXX 囚犯分配 +AMNT/MAXX Servants Assigned +AMNT/MAXX 仆从分配 + + +Assign servants as managers to boost the production of other facilities.|Appointing new management results in a loss of efficiency until the next cycle. +指派仆人担任管理者,提高其他设施的生产效率。|任命新的管理人员会导致效率下降,直到下一个周期。 +Bondage Dojo +束缚道场 +Assign servants to perfect the art of walking in heels,wearing tight corsets,|communicating while gagged, and overall flexibility. +指派仆人完善穿高跟鞋、紧身胸衣走路的艺术、|堵住嘴交流的艺术,以及整体的灵活性。 +Rescue Operations +救援行动 +Assign servants to train squads of rescue maids, which you can call in times of need. +指派仆人训练救援女仆小队,以便在需要时可以呼叫她们。 +Alchemy Lab +炼金实验室 +Assign servants to produce potions from base ingredients you acquire in your adventures. +指派仆人使用你在冒险中获得的基本材料制作药水。 +Recycler +回收者 +Convert low tier restraints into raw materials and output higher quality restraints.|Adding more servants increase the conversion speed. +将低等级的拘束具转化为原材料,产出更高等级的拘束具。|添加更多仆人可以增加转化速度。 +Cuddle Lounge +拥抱休息室 +Assign prisoners to the lounge in order to improve servant and prisoner opinion. +将囚犯分配到休息室以提高仆人和囚犯对你的观点。 +Appoint a warden to keep prisoners in check and automatically bind using restraints from storage. +任命一名狱卒来维持囚犯的秩序,并可自动使用拘束具将他们捆绑起来。 + + +Recycle Restraints +回收拘束具 + + +Recycle One +回收一个 +Recycle ALL! +回收所有! +Recycle all but one +除一个外全部回收 + + +You recycle a ITM +你回收了 ITM +You recycle #x ITM +你回收了 #x ITM + + +You disassemble #x ITM into $x PRD +你将 #x ITM 拆解为 $x PRD +Disassemble all but one +拆除所有但留下一个 +Disassemble one +拆开一个 + + +You're blocking me. +你挡住我了。 +You're in my way! +你挡住我的路了! +Miss, you're blocking me... +小姐,你挡住我了…… +Step aside~ +请让开~ +Path blocked by citizen. +道路被市民阻挡。 +*Bumps into you* +*撞到你* + + + + +Cyber Hogtie Tether +赛博驷马束带 +It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. +它由你电子手铐内的投影仪维持。能量可以排斥任何力量,即使多次试图破坏它,它似乎也不会减弱。 + + +Cyber Thigh Tether +赛博大腿束带 +An energy tether connecting your thigh cuffs together. You can still walk, albeit slower than usual. +一条能量绳将你的大腿袖口连接在一起。你仍然可以行走,尽管速度比平时慢。 + + +Cyber Ankle Tether +赛博脚踝束带 +An energy tether connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. +一条能量绳将你的脚踝铐连接在一起。它为你提供了足够的走动空间,尽管走动速度比平时要慢。 +A short energy tether connecting your ankle cuffs together. You can barely separate your legs with this on. +一条短能量绳,将你的脚踝铐连接在一起。戴上它,你的双腿几乎无法分开。 + + +Cyber Elbow Tether +赛博肘部束带 +A very short energy tether connecting your elbow cuffs together. It is quite awkward to remove by yourself. +一根很短的能量绳将你的肘铐连接在一起。自己取下它会很不方便。 +Cyber Wrist Tether +赛博手腕绑带 +A very short energy tether connecting your wrist cuffs together. +一条非常短的能量绳将你的手腕铐连接在一起。 + + +Desperate Struggle +绝望的挣扎 +Spend 20 WP to shake around violently. Has a chance to loosen restraints you are wearing, based on existing struggle progress. Spreading the effect over multiple restraints reduces the chance of loosening.|Requires 25% or more WP to activate. +消耗 20 意志力剧烈晃动。根据现有的挣扎进度,有机会松开绑在你身上的束缚。将效果分散到多个束缚上可降低松动的几率。|需要 25% 或更多意志力才能使用。 +None of your restraints will budge. +任何束缚都不会松动。 +You thrash around with all your might. +你用尽全身的力气挣扎。 +You don't have the willpower left to struggle... +你没有足够的意志力去挣扎…… + + +f +纤 +x +胶 +L +革 +m +金 +R +符 + + + + +Fiber +纤维 +Runes +符文 + + +### Stock: + +### Inputs: + +You slip off the conveyor! +你从传送带上滑下来了! +The Summit +顶部设施 + + +Back to Collection +返回收藏页面 +Edit Restraints +修改束缚 + + +Editing Restraints +正在修改束缚 +Imprison in Furniture +囚禁在家具中 +Dropoff Prisoner +被释放的囚犯 + + +Module (Utility) +模块 ( 实用程序 ) +Module (Punishment) +模块 ( 惩罚 ) +~~~ Collar ~~~ +~~~ 项圈 ~~~ +Blindfold / Earplugs +眼罩 / 耳塞 +Mask/Hood +面罩/头套 +Gag / Stuffing +口塞 / 填充 +Flat Gag +扁平口球 +Wrists +腕部 +Encasement +包裹 +Mittens / Tape +连指手套 / 胶带 +Gloves / Tape +手套 / 胶带 +Vibes +震动 +Chastity Bra +贞操文胸 +Catsuit / Leotard +紧身连体衣 / 紧身衣 +Rear Plug +肛塞 +Front Plug +阴塞 +Vibrator +震动棒 +Chastity Belt +贞操带 +Thigh Cuffs +大腿镣铐 +Leg Bondage +腿部束缚 +Shins +小腿 +Knees +膝盖 +Toe Cuffs +脚趾铐 +Toe Tie +脚趾绑带 +Heels +高跟鞋 + + +Equipped: +已装备 : ‎ +Click to Add +点击以添加 +Apply +应用 +Raw Material: +基本材料 : ‎ + + +Free Prisoner +释放囚犯 + + +Perk Unlocked: +已解锁技能 : ‎ + + +Latex Solvent +乳胶溶剂 +You ready the bottle of Latex Solvent. +你准备好了一瓶乳胶溶剂。 +A potent acid, capable of dissolving slime and latex. +一种强酸,能够溶解粘液和乳胶。 +Deal 90 acid damage to target. Adds a 10% debuff to the cut and struggle resistance of latex restraints currently worn. +对目标造成 90 点酸蚀伤害。为当前穿戴的乳胶拘束具的切割和挣扎抵抗力添加 10% 的减益效果。 + + +Weakened by Latex Solvent (10%) +被乳胶溶剂削弱 (10%) +You spill the solvent on yourself and loosen your latex bonds! +你将溶剂洒在自己身上,乳胶束缚松动! +You splash the ENMY with latex solvent! +你将乳胶溶剂泼向 ENMY! + + +You can't use solvents on targets other than yourself while bound. +被束缚时,你不能对除自己之外的目标使用溶剂。 + + +Choose Palette +选择调色板 +Use Raw Material +使用基本材料 +Restraint Palette +束缚调色板 +Choose Restraint +选择束缚 + + +Def. Palette: +调色板 +Set All Palette +设置所有调色板 + + +Guests +客人 + + +Assign to +分配给 +Remove from +移除于 +Can't assign to +无法分配给 +Remove from party to assign +将其从队伍中移除以进行分配。 +Imprison +监禁 + + +Opinion: +观点 : ‎ +Last Seen on Floor FLR, LOC +最后出现在楼层 FLR 的 LOC 位置 +Present in current level +存在于当前层级 +Captured by FCTN +由 FCTN 捕获 +Captured by enemies +由敌人捕获 + + +Use 'Truss'em'Up' to edit restraints on this NPC +使用 '把他们捆起来!' 修改此 NPC 的束缚 +The NPC needs tightening, but is unavailable right now +NPC 需要收紧束缚,但目前无法做到 +Tighten non-conjured restraints +加强非魔法拘束 + + +NPC has escaped! +NPC 已逃脱! +NPC is likely to escape. +NPC 很有可能逃脱。 +NPC has managed to loosen her bonds. +NPC 已成功解开她的束缚。 + + +Any +全部 +NPC Opinion: +NPC 观点 : +NPC Escape Status: +NPC 逃脱状态 : +NPC Binding: +NPC 束缚状态 : +NPC Availability: +NPC 可用性 : +### Favorited: + +Rank: +等级 : +Minor +低级 +Elite +精英 +Miniboss +小型Boss + + +Bound +拘束 +At Risk +面临风险 +Escaped +已逃脱 +Imprisoned +已监禁 +Positive +积极 +Negative +消极 +Non-Favorite +不受欢迎 + + +Present +可用 +Unavailable +不可用 + + +Auto Bind Interface +自动拘束选项 +AutoBind +自动拘束 + + +Assign to Facility +分配给设施 + + +Copy Restraints +复制束缚 +Paste Restraints from NME +从 NME 粘贴束缚 +No restraints left in inventory +背包中没有任何束缚 +Paste to All! +粘贴到全部! +OVERWRITE All! +覆盖所有! + + +Need Positive Opinion to Promote +需要更正面的评价来擢升 +Remove From Party Before Promoting? +晋升前先退出队伍? + + +Servant Cuddle Points: AMNT (+OPN opinion/cycle) +仆人拥抱点 : AMNT (+OPN 观点/周期) +Prisoner Cuddle Points: AMNT (+OPN opinion/cycle) +囚犯拥抱点 : AMNT (+OPN 观点/周期) +Submissive prisoners and dominant servants add different amounts of opinion per cycle +顺从的囚犯和占主导地位的仆人每周期增加不同的好感度 + + +Release Prisoners +释放囚犯 +Release +释放 + + +### Summon + +Already present in summit +已经站在峰顶。 +NPC is unavailable +NPC 不可用 +Only available in the Summit +仅在峰顶可用 + + +Mark +标记 +Unmark +取消标记 +Mark ALL +标记所有 +Cancel Selection +取消选中 +Release Marked Prisoners! +释放选中的囚犯! +Ransom Marked Prisoners for GP! +使用 GP 赎金来赎回囚犯! +Ransom Value: GP +赎金: GP +Current Gold: GP +当前金币: GP +### n/a + +[EXP: AMNT/LMT, +NXT next floor] Heel training reduces balance loss from heels. +[经验 : AMNT/LMT][进入下一层 +NXT 经验] 高跟鞋训练可以提高你的平衡能力,防止你摔倒 + + +Phase Dance active. Your next move is instant. +相位舞蹈激活。你的下一步动作是即时的。 +Combat Maneuver active. Your next move is instant. +战斗机动激活。你的下一步行动是即时的。 + + +The furniture space is occupied +家具空间被占用 +Combat Maneuver: Your next move is instant. +战斗机动: 你的下一步行动是即时的。 + + +Appointing managers increases the efficiency of other facilities. +任命管理人员可以提高其他设施的效率。 +Total Efficiency Boost: AMNT% +总效率提升 : AMNT% +idle +闲置 + + +(As you approach the statue, you hear a crumbling sound)|(The stone crumbles along the statue's slender frame)|(...revealing inside a beautiful, and extremely angry catgirl)|Who dares disturb my slumber?|I shall see to it that you receive your punishment! +(当你走近雕像时,你会听到一阵碎裂的声音)|(石头沿着雕像纤细的框架碎裂)|(......露出里面一个美丽而又极其愤怒的猫娘)|谁敢打扰我的沉睡? + + +Mysterious Statue +神秘雕像 + + +Select a Binding Slot +选择一个绑定插槽 + + +Cost: +花费 : ‎ + + +Zoom set to PCNT% +缩放设置为 PCNT% +You need free arms to tie others! +你需要自由的手臂来捆绑他人! +You can use the quick inventory to bind yourself or others +你可以用快速清单绑住自己或他人 +Error. Please screenshot and report. +错误。请截图并报告。 +You can't wear that item, regrettably. +很遗憾,你不能穿戴该物品。 + + +Must be stunned 3+ turns or fully bound +必须眩晕 3 个以上回合或完全捆绑 +Depends on another item to be added first +取决于先添加另一件物品 + + +The conjured RSTN vanishes as you remove it. +变出的 RSTN 会在你移除它时消失。 + + +No free slots to bind in +没有空闲槽位可以绑定 + + +Reaching Authority +语威延伸 +If arm components are unavailable, you can now apply bindings with verbal components only. Increases range of Truss em Up by 2 and all CMD spells by 1 +在手臂被限制的情况下,你仍可以通过嘴来说出口头咒语来施展束缚。“束缚术”的作用范围提升 2 格,且所有命令法术的作用范围增加 1 格。 + + +Save Slot +存档槽 +Load Game +加载游戏 +Load Code +加载代码 +Load Slot 0 +加载代码 +Load File +加载文件 +Save From Code +从代码中导入 + + +Delete? +删除? +Import to Slot +导入到槽位 +Invalid Data +无效的数据 +No Data +无数据 + + This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall. 这是地牢的正常入口|教程在大厅的开头。 -This is the entrance to the ancient tombs.|It's harder than the normal entrance. -这是古墓的入口|这比正常的入口更难。 +This is the alternate entrance to the ancient tombs.|It's harder than the normal entrance. +这是通往古墓的另一个入口|比一般的入口难。 This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random. 地牢的这一部分被混沌女神改变了|你要经过的区域顺序完全是随机的。 -These are the stairs to the tutorial hall. -这是通往新手教程的楼梯。 -Congratulations! You've completed the tutorial!|Now get in there and stay out of trouble~ -祝贺您已经完成了教程|现在进去,别惹麻烦~ -Welcome to the dungeon!|Don't panic, this is a turn-based game,|and nothing will happen until you move.|On your left you'll see your character,|displayed with all of the bondage they don't have.|Don't worry, you'll find some soon! -欢迎来到地牢|不要惊慌,这是一个回合制游戏,|除非你移动,否则什么都不会发生|在您的左侧,您将看到您的角色,显示了她们没有的所有束缚|别担心,你很快就会找到的! -You might be wondering what all these barrels are for.|Don't worry, they're, uh, totally safe!|When you are inside one you can click on yourself to wait.|Enemies have a hard time seeing you inside a barrel,|so you can wait until they pass by you. -你可能想知道这些桶是干什么用的|别担心,他们完全安全|当你在里面时,你可以点击自己等待|敌人很难在桶里看到你,所以你可以等到他们从你身边经过。 -On the right you'll see your stats and spells slots.|Your DP, SP, and MP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon.|Below that, two icons allow you to toggle automatic escape and movement modes. -在右边,你会看到你的统计数据和法术插槽|您的DP、SP和MP显示在那里,我们将了解它们的作用|在下面,您将看到您当前的消耗品、|黄金和当前装备的武器|在此下方,两个图标允许您切换自动逃生和移动模式。 -Your WP, or willpower, is an important resource.|Without it, escaping from restraints is more difficult.|There is a willpower potion on the floor up there. Go get it! -你的WP或意志力是一个重要的资源|没有它,摆脱束缚更加困难|前面的地板上有一种意志力药剂。去拿着吧! -Oh no! That trap wiped out all your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack). -哦,不!那个陷阱把你的意志力都消灭了|幸运的是你有药水|您可以通过单击意志力旁边的“+”图标来饮用|您还可以在底部栏中查看您的库存|还有一个快速库存图标(背包)。 -Another trap!|You'll notice that the trap also drained your stamina considerably, forcing you to kneel.|You can protect yourself while your stamina regenerates by retreating into the room above.|Close the door by clicking the Close Door button in the bottom bar.| -又是一个陷阱|你会注意到陷阱也消耗了你的体力,迫使你跪下|当你的耐力恢复时,你可以退到上面的房间里保护自己|单击底部栏中的“关门”按钮关闭门| -Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the bottom right.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1. -你的MP,或法力,用来施法|为了施展法术,你需要学习一种|点击右下角的咒语按钮|然后点击火焰学徒,学习解锁火焰弹|然后,按空格键返回,然后按向右键切换页面|点击Firebolt,学习它,然后将其分配到法术1。 -On the right you'll see your stats and spells slots.|You can click on a spell slot or hit 1-4 on your keyboard to cast a spell|then click on the map for where you want to aim it.|The small wrench icon above them will let you|swap them out for another spell from your spellbook. -在右边,你会看到你的统计数据和法术插槽|你可以点击一个法术槽,或者点击键盘上的1-4来施放一个法术|然后在地图上点击你想要瞄准的地方|它们上面的小扳手图标可以让你|将它们换成法术书中的另一个法术。 -There's a zombie over there!|Fortunately zombies are weak to fire.|Firebolt has a very long range,|so simply cast firebolt and click on the zombie.|Repeat until it is dead. -那边有个僵尸|幸运的是,僵尸的火力很弱|火焰弹射程很长|所以只需施放火焰弹并点击僵尸即可|重复,直到它死去。 -Mana potions restore your mana fully. -法力药剂完全恢复了你的法力。 -Your DP, or Distraction, is a measure of...|How much you are enjoying things.|These sorts of thoughts cloud your mind,|so spellcasting is more difficult when you are distracted.|Go grab the potion over there. -你的DP,或干扰值,是标准…|你享受事物的程度|这些想法让你的头脑变得模糊,所以当你分心时,施法会更加困难|去那边拿药水。 -Did you like that?|Anyway, there's a zombie over there. You should drink that potion.|It will clear your mind so you can cast again.|Hurry, or it will get you! -你喜欢吗|不管怎样,那边有个僵尸。你应该喝那种药水|它会让你头脑清醒,这样你就可以再次施展|快点,不然它会抓住你的! -That wasn't so hard, was it?|Now then, there's a treasure chest over here. Why don't you open it? -这并不难,是吗|现在,这里有一个宝箱。你为什么不打开它? -Yikes, looks like you're in a bind!|No worries, though. There's a key to those cuffs over there.|Simply hover over the cuffs item test on the left side.|Then, click the lock icon to remove the lock.|Finally, click the buckle to remove the cuffs. -哎呀,看来你陷入困境了|不过,别担心。那边有一把钥匙|只需将鼠标悬停在左侧的手铐上|然后,单击锁图标以移除锁|最后,单击带扣以卸下手铐。 -I think we all know what's in the next chest.|It's important to understand the different ways you can escape.|You can struggle, which costs the most stamina|but makes other struggle methods faster.|You can cut, which requires a knife in hand.|You can remove, which represents untying or unbuckling. -我想我们都知道下一个箱子里有什么|重要的是要了解你可以逃避的不同方式|你可以挣扎,这会消耗最多的耐力|但使其他挣扎方法更快|你可以切割,这需要手里拿着刀|您可以语出,这表示松开或解除绑定。 -Ouch, that looked tight...|Sometimes you won't be able to struggle out of things.|You'll have to find some other way to take it off... -哎哟,看起来很紧…|有时候你无法摆脱困境|你得想办法把它取下来... -There's a few zombies up ahead.|Fight your way through and claim the treasure! -前面有几个僵尸|奋力拼搏,夺回宝藏! -You're not feeling it... -你没有感觉... -You close your eyes but the vibrations keep you from dozing off... -你闭上眼睛,但振动器让你无法休息。。。 -(A SPEAKER lies hogtied in front of you)|(She looks at you with pleading eyes,)|(and mumbles incoherently through her gag) -(SPEAKER 躺在你面前)|(她用恳求的眼神看着你,)|(并通过她被堵住的嘴语无伦次地咕哝着。) -(A SPEAKER lies hogtied in front of you)|(She looks at you, mumbling and giggling into her gag) -(SPEAKER 躺在你面前)|(她看着你,嘴里咕哝着,咯咯笑着) -(SPEAKER looks grateful)|Thank you so much|I shall join your party. -(SPEAKER 看起来很感激)|非常感谢|我会加入你的队伍。 -(SPEAKER looks grateful)|Thank you so much miss!|I owe you everything. -(SPEAKER 看起来很感激)|非常感谢您,小姐!|我欠您一切。 -(SPEAKER groans and wriggles around uselessly) -(SPEAKER 呻吟着,毫无用处地扭动着。) -(SPEAKER moans and rolls around, blushing deeply) -(SPEAKER 呻吟着,转过身来,脸红得很厉害) -Untie her -解开她 -Make sure she is tight and secure -确保她安全可靠 -(A SPEAKER bumps into you while immersed in her thoughts)|Oh! Hello!|Say, you look adorable...|Do you mind helping me find something? -(SPEAKER 沉浸在她的思想中时撞到了你)|噢!你好!|喂,你看起来很可爱…|你介意帮我找点东西吗? -(The SPEAKER jumps up and down)|Ah, wonderful!|I've misplaced one of my dresses.|If you could find one, wear it, and bring it to me,|I'd greatly appreciate it! Thanks! -(SPEAKER 跳上跳下)|啊,太棒了|我把一件衣服放错地方了|如果你能找到一个,戴上它,带给我,我将非常感激!谢谢! -(The SPEAKER stares at you like a rabid animal)|Wowie! You look gorgeous!|Thank you so much!|(She snaps a photo of you using a magic crystal) -(SPEAKER 像一只疯狂的动物一样盯着你)|哇!你看起来真漂亮|非常感谢!|(她用魔法水晶给你拍了张照片。) -(The SPEAKER giggles)|I never said I'd take it off, did I? -(SPEAKER 咯咯地笑)|我从没说过我会把它拿下来,不是吗? -(The SPEAKER smiles)|Sure thing! -(SPEAKER 笑了)|当然! -(Show interest) -(表示感兴趣) -I found your dress... -我找到了你的裙子。。。 -Mmmph... (Found the dress!) -呜呜呜…(找到裙子了!) -Great! Can you take it off? -太棒了!你能把它拿下来吗? -Mmmmm! (Struggle) -呜呜呜呜!(挣扎) -(A SPEAKER clutching her books approaches you)|Miss adventurer!|I happen to need a magic scroll of any kind.|It's for my studies. -(SPEAKER 抓着她的书走近你)|冒险家小姐|我碰巧需要任何一种魔法卷轴|这是为了我的学习。 -(The SPEAKER smiles)|Yes, thank you so much!|It's been so difficult to get them lately.|The magic library is closed off these days,|and there are mean people trying to get the scrolls back... -(SPEAKER 微笑)|是的,非常感谢|最近很难找到它们|魔法图书馆最近关闭了|还有一些卑鄙的人试图拿回卷轴... -(The SPEAKER is happy)|Thank you so much! -(SPEAKER 很高兴)|非常感谢! -Give her a Scroll of Sauntering -给她一卷闲置的卷轴 -Give her a Scroll of Sleight -给她一卷狡猾的卷轴 -Give her a Scroll of Speech -给她一卷演讲的卷轴 -Give her a Scroll of Purity -给她一卷纯洁的卷轴 -(A SPEAKER looks distraught)|Well met, adventurer!|We have a problem... -(SPEAKER 看起来心烦意乱)|很好,冒险家|我们有个问题... -(The SPEAKER folds her arms)|A rebel has been causing us problems lately...|If you run into her, give her all you got!|She needs to be brought to justice. -(SPEAKER 交叉双臂)|最近一个叛军给我们带来了麻烦…|如果你碰到她,把你所有的东西都给她|她需要被绳之以法。 -(A SPEAKER scoffs in your direction)|Well? You lookin' for work or no? -(SPEAKER 朝着你笑)|好吧?你在找工作吗,或者不是? -(The SPEAKER grins)|A bunch of delinquents stormed out recently.|They're looking for a way out of their belts.|Someone oughta show em their place,|if you catch what I'm saying. -(演讲者咧嘴笑)|最近一群违法者暴跳如雷|他们正在寻找摆脱困境的方法|应该有人带他们去他们的地方,|如果你明白我说的话。 -(Nod) -(点头) -(A SPEAKER approaches you in your cell)|Since you've been a bad girl,|we're taking you to the high-security prison. -(SPEAKER 在你的牢房里走近你)|既然你是个坏女孩,|我们就把你带到高度戒备的监狱。 -(The SPEAKER folds her arms)|Want to or not, you're going. -(SPEAKER 交叉双臂)|不管你想不想,你都要去。 -(Resist) -(抵抗) -(Submit) -(顺从) -(A SPEAKER crosses her arms)|Who you lookin' at?|Oh, it's an adventurer.|Say, you wouldn't be interested|in working with us, would ya? -(SPEAKER 交叉双臂)|你在看什|哦,是个冒险家|喂,你不会感兴趣的|和我们一起工作,好吗? -(The SPEAKER smiles)|That's more like it.|Here's the scoop: One of ours was captured on the next floor.|We need you to go get her out. -(SPEAKER 微笑)|更像是这样|独家报道:我们其中一人在下一层被抓获|我们需要你去把她救出来。 -(The SPEAKER sits bound in high-security manacles)|You'll need to open the lock to get her out... -(SPEAKER 戴着高安全性的手铐坐着)|你需要打开锁才能让她出来... -(You don't have any keys that work on the lock) -(你没有锁的钥匙。) -(You can't help her, bound as tightly as you are...) -(你帮不了她,像你一样紧紧地绑着…) -(You unlock her, fumbling around for a while with your bound hands) -(你解开了她的锁,用绑着的手摸索了一会儿。) -(You unlock the SPEAKER)|Thank you!|Let's get out of here! -(你解开了 SPEAKER)|谢谢|我们从这里出去吧! -(You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...) -(你解开了 SPEAKER)|呜呜呜!|(她想保持自己的堵嘴…) -(You don't have any lockpicks) -(您没有任何撬锁器。) -(You can't pick the lock with your hands bound) -(你不能用在手被绑住的时候撬锁。) -(After a while, you free the SPEAKER)|Thank you!|Let's get moving! -(过了一会儿,你解开了 SPEAKER)|谢谢|让我们开始行动! -(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...) -(过了一会儿,你解开了 SPEAKER)|呜呜呜!|(她在你给她解开堵嘴时摇头...) -(You don't have enough mana for a command word) -(你没有足够的法力来写命令词。) -(Try as you might, your mouth is sealed tight) -(你尽你所能,你的嘴封得很紧) -(You utter a command word to free the SPEAKER)|Many thanks!|Let's go! -(你发出命令释放 SPEAKER)|非常感谢|走吧! -(You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) -(你发出命令释放 SPEAKER)|呜呜呜!|(她把堵嘴又锁上了...) -Use a key to unlock her -用钥匙解开她 -Try to pick her restraints -试着解开她的束缚 -Use a command word -使用命令词 -An enemy found you while you were busy! -敌人在你忙的时候发现了你! -(A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door) -(SPEAKER 砰的一声把你吵醒)|醒醒!让我们离开这里|(她设法撬开了你牢房门上的锁。) -(A SPEAKER wakes you up)|We came to rescue you. Come on! -(SPEAKER 把你叫醒)|我们是来救你的。来吧! -(The bed looks comfy and inviting)|(Napping here will restore half of your willpower)|(You can only sleep once per floor) -(这张床看起来既舒适又诱人)|(在这里小睡会恢复你一半的意志力)|(每层只能睡一次) -(You lay in the bed and doze off...) -(你躺在床上打瞌睡…) -(Lie down and sleep) -(躺下睡觉) -(Mystic energies spring forth from the ground)|(Standing here will fully replenish your passive mana pool)|(One use only) -(神秘能量从地面涌出)|(站在这里将完全补充你的被动法力池)|(仅限一次使用) -(You step on the magical fissue and its energies absorb into you)|(Afterward, the ground crackles and fizzles, but no energy is left.) -(你踩到魔法的石头,它的能量吸收到你身上)|(之后,地面噼啪作响,但没有留下任何能量。) -(Recharge your mana pool) -(补充你的法力池) -Prerequisite -前置条件 -Unlocks: -解锁: -You need to learn REQUIREDSPELL before you can learn this one. -你需要先学习 REQUIREDSPELL 才能学习这个。 -You no longer have the will to struggle. -你不再有挣扎的意志。 -Help yourself! -请随意 -You eat the delicious food and feel your will restored. -你吃了美味的食物,感觉你的意志恢复了。 -Your gag prevents you from eating... -你的堵嘴物阻止你进食... -It's a table. -这是一张桌子。 -It's a table, with evidence of a grisly deed. -这是一张桌子,有恐怖行为的证据。 -Someone left their cookies unattended. -有人把饼干放在无人看管的地方。 -You smell delicious pizza. -你闻到了美味的比萨饼。 -You call for help! -你呼救! -You let out a garbled cry! -你乱叫了一声! -Your screams are muffled by your gag! -你的尖叫声被你的堵嘴掩盖了! -You can hardly make a noise... -你几乎不能发出声音... -Grants a save code every few floors you can write down. Saves only on exit and floor start. -每隔几层提供存档。存档仅在每层开始和结束时生效。 Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure! -传说在广阔的丛林中有一座神庙。戴好你的装备,去寻找宝藏吧! -You stomp your foot and call forth the storm! -你跺脚召来寒冰风暴! -Your body glows with magical energy! -你的身体散发着神奇的能量! -Magic Chain -魔法锁链 -Witch's Chain -女巫的锁链 -Apprentice's Slime -学徒的史莱姆 -Witch's Slime -女巫的史莱姆 -Witch's Slime Ball -女巫的史莱姆球 -You take PERCENT1 DAMAGETYPE damage, based on PERCENT2 DAMAGETYPE resist and PERCENT3 DAMAGECATEGORY modifier. -你受到 PERCENT1 DAMAGETYPE 伤害,基于 PERCENT2 DAMAGETYPE 抗性和 PERCENT3 DAMAGECATEGORY 修正 -Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage. -你的基础攻击可造成 DAMAGEDEALT 点 DAMAGETYPE 伤害 -Empower to upcast spells -积蓄魔力 -Cancel empowerment -释放魔力 -You channel mana through your body! Empowerment level: LEVEL -你通过你的身体来积蓄魔力!充能级别:LEVEL -You are already at the maximum empowerment level! -你已经达到了最高充能级别! -You don't have any upcast spells yet. -你没有任何高级法术。 -attack -攻击 -damage -伤害 -damage -攻击 -Damage -攻击 +传说在广阔的丛林中有一座神殿。戴好你的装备,去寻找宝藏吧! +You've gotten lost in an ancient doll processing facility.|This journey features mostly lategame tilesets. +你在一个古老的玩偶工厂迷路了|这段旅程主要包含游戏后期的图块集。 +You've gotten lost inside an ancient temple to a kinky goddess.|Will you find your way out, or will you find yourself trapped even deeper? +你在一座古老的神殿里迷失了方向,被一位变态的女神所迷失。|你会找到出路,还是会发现自己被困得更深? +You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed! +你在废墟中迷失了方向。|图块顺序颠倒了! + + + (Hard) +( 困难 ) + (Extreme) +( 极端 ) + + +Choose Save Slot: +选择保存到的槽位: + + +Standard Route +标准路线 ‎ +Alternate Route +变种路线 ‎ +Temple Route +神殿路线 ‎ +Jungle Route +丛林路线 ‎ +Factory Route +工厂路线 ‎ +Reverse Route +颠倒路线 ‎ +Chaos Route +混沌路线 ‎ +Map Seed: +地图种子 : ‎ +Will Overwrite NME! +这会覆盖 NME! + + +Play Slot +加载存档 +Play (NO SLOT!) +加载 ( 未选择存档! ) + + +Looks like you might be stuck. Try calling for help (bottom right of UI) +看来你可能被卡住了,尝试呼叫帮助(界面右下角) + + +Backup +备份 +Restore +恢复 +Extra Options +额外选项 +Preview without Armor +无盔预览 + + +### FLR-DGN + +### (NG+AMNT) + + + +Target must be vulnerable. +目标必须是脆弱的。 +Target must be vulnerable or have casted a verbal spell. +目标必须是脆弱的或已释放语言法术 +Target must have casted a verbal spell. +目标必须已释放语言法术 + + +Diggy diggy hole +挖洞 +Select a cracked wall. +选择有裂缝的墙壁。 +You strike the earth! +你向环境发起攻击 + + +Must select a cracked wall. +必须选择裂开的墙壁 +Your arms aren't free to swing the axe! +你的手臂无法自由挥动斧头! +You strike the earth, but it is nothing but solid wall on the other side. +你向环境发起攻击,但另一边却是坚固的墙壁。 +You strike the earth! It crumbles before you! +你向环境发起攻击!它在你面前崩塌 +Click again to automatically mine the wall with your pickaxe. +再次点击以自动用你的铁镐挖掘墙壁。 + + +The planar focus resonates with the teleportation magic! +平面聚焦与传送魔法产生共鸣 +The planar focusing crystal activates! Mana is drained, and turns into bindings! +平面聚焦水晶启动!法力耗尽,化为束缚 +The planar diffractor blocks the teleportation! +平面衍射器阻挡了传送! + + +Set Character Palette +设置角色调色板 + + +Reset all Keybindings +重置所有按键绑定 + + +That item is blocked! You can't remove it. +那个物品被挡住了! 你不能移除它。 + + +### min. + +### max. + bonus +奖励 + penalty +惩罚 -###法术### -Spell Points: -技能点: -Spell Points: SPELLPOINTS -技能点:SPELLPOINTS -Upcast from SPELL -SPELL 进阶 -Upcast Level LEVEL -LEVEL 级 -Learnable -可学习 -Unlearned -不可学习 -Excl. Upgrades -排除进阶 -Upcast -进阶 -Passive -被动 -Projectiles -抛射物 -Area Damage -范围伤害 -DoT -持续伤害 -Offense -进攻 -Defense -防御 -Utility -实用 -Upgrades -升级 -Spell Tree -技能树 -Earth -岩 -Lightning -电 -Air -风 -Water -水 -Rubber -橡胶 -Summoning -召唤 -Physics -物理 -Stealth -隐形 -Light -光芒 -Stamina -耐力 -Knowledge -知识 -Other -其它 -pressure -压力 -Strength -耐力 -Dexterity -灵巧 -Intelligence -智力 -##技能树## -Flame Novice -基础火法术 -Unlocks fire spells. Learn Firebolt. -允许学习火法术 并习得元素法术 “火焰弹” -Lightning Novice -基础电法术 -Unlocks electrice spells. Learn Electrify. -允许学习电法术 并习得元素法术 “落雷” -Air Novice -基础风法术 -Unlocks air spells. Learn Wind Blast. -允许学习风法术 并习得元素法术 “暴风” -Ice Novice -基础冰法术 -Unlocks ice spells. Learn Freeze. -允许学习冰法术 并习得元素法术“冻结” -Water Novice -基础水法术 -Unlocks water spells. Learn Water Ball. -允许学习水法术 并习得元素法术“水球” -Earth Novice -基础岩法术 -Unlocks earth spells. Learn Stone Skin. -允许学习岩法术 并习得元素法术“石肤术” -Rope 101 -绳索 101 -Unlocks rope spells. Learn Conjure Ropes. -允许学习绳索咒术 并习得咒术 “召唤绳索” -Leather 101 -皮革 101 -Unlocks leather spells. Learn Conjure Gag. -允许学习皮革咒术 并习得咒术 “召唤口球” -Metal 101 -金属 101 -Unlocks metal spells. Learn Conjure Cuffs. -允许学习金属咒术 并习得咒术 “召唤手铐” -Latex 101 -乳胶 101 -Unlocks latex spells. Learn Slime Ball. -允许学习乳胶咒术 并习得咒术 “史莱姆球” -Physics 101 -物理 101 -Unlocks teleportation and physical manipulation spells. Learn Wall. -允许学习物理、传送和控制咒术 并习得咒术 “墙” -Summoning 101 -召唤 101 -Unlocks summoning spells. Learn Summon Familiar. -允许学习召唤咒术 并习得咒术 “召唤魔宠” -Blessing of Light -光之祝福 -Unlocks light spells. Learn Flash. -允许学习光芒幻术 并习得幻术 “小闪电” -Blessing of Shadow -暗之祝福 -Unlocks shadow spells. Learn Shadow Dagger. -允许学习暗影幻术 并习得幻术 “暗影匕首” -Blessing of Obscurity -影之祝福 -Unlocks invisibility spells. Learn Camouflage. -允许学习隐形幻术 并习得幻术 “拟态” -Projection Magic -投影幻术 -Unlocks illusory spells. Learn Summon Decoy. -允许学习投影幻术 并习得幻术 “召唤诱饵” -Arcane Knowledge -秘密知识 -Unlocks knowledge and critical-strike spells. Learn True Steel, and unlocks advanced tooltips for enemies. -允许学习知识和暴击幻术 解锁对敌人的高级工具提示 并习得幻术 “共析钢” +You put it on, why would you want to take it off?~ +你戴上它了,干嘛要摘下来呢?~ +You'll need an ancient key to unlock the ancient-made collar. +你需要一把古老的钥匙来解开古老的项圈。 -##元素法术## -#基础火法术# -Firecracker -迸裂火花 -A small delayed explosion that deals DamageDealt fire damage. -造成 DamageDealt 点火伤害小型的延时爆炸, 。 -You shout an incendiary retort! -你丢出一团燃烧的炸药! -Incinerate -焚风 -A tornado of flame that does DamageDealt damage per turn for LifeTime turns. -释放火焰龙卷风,持续 LifeTime 回合,每回合造成 DamageDealt 点火伤害。 -You conjure a gout of flame! -你召唤出一团火焰! +Ancient Worshipper +古代追随者 +The ancient worshipper repents of her ways. +古代追随者对自己的行为悔恨不已。 +The ancient worshipper's crystal restraints spread to you! (+RestraintAdded) +古代追随者的水晶束缚扩散到你身上!(+束缚已添加) +Crystals start to grow on one of your restraints! (DamageTaken) +结晶开始在你的一拘束具上上生长!(受到伤害) +The ancient worshipper mumbles at you for assistance! (DamageTaken) +古代追随者喃喃地向你求助!(受到伤害) -Firebolt -火焰弹 -A ball of flame that does DamageDealt damage. -释放造成 DamageDealt 点火焰伤害的火焰弹。 -You a hurl a firebolt! -你投掷了火焰弹! -Fireball -火球 -A slow moving ball of flame that explodes for 120 fire damage to the target and DamageDealt damage to surrounding enemies. -释放缓慢移动的爆炸火球,对目标造成 120 点火焰伤害,并对其附近单位造成 DamageDealt 点火焰伤害。 -You a hurl a fireball! -你投掷了火球! +Ancient Congregant +古代教徒 +The ancient congregant repents of her ways. +古代教徒悔悟了 +The ancient congregant's crystal restraints spread to you! (+RestraintAdded) +古代教徒的结晶束缚扩散到你身上!(+束缚增加) +Crystals start to grow on your restraints! (DamageTaken) +结晶开始在你的一拘束具上上生长!(受到伤害) +The ancient congregant mumbles at you for assistance! (DamageTaken) +古代教徒喃喃地向你求助!(受到伤害) -Ignite -点燃 -Ignite a friendly target for Duration turns, dealing DamageDealt fire damage per turn to it and nearby targets. -点燃一个友方单位 Duration 回合,每回合对其及附近单位造成 DamageDealt 点火焰伤害。 -You spin in a circle, inscribing flames with your feet! -你旋转一圈,用你的脚产生火焰! -Choose a friendly target to ignite -选择一个友方目标来点燃 -Flame Rune -火焰符文 -A trap that deals DamageDealt fire damage in an area. Takes 5 turns to setup. -设置一个陷阱,陷阱可造成 DamageDealt 点范围性火焰伤害。 需要 5 回合进行设置。 -You conjure an incendiary trap! -你设置了一个火焰陷阱! +Ancient Hierophant +古代祭司 +The ancient hierophant repents of her ways. +古代祭司悔悟了 +The ancient hierophant's crystal restraints spread to you! (+RestraintAdded) +古代祭司的结晶束缚扩散到你身上!(+束缚增加) +The ancient hierophant mumbles at you for assistance! (DamageTaken) +古代祭司喃喃地向你求助!(受到伤害) -Fissure -熔岩裂缝 -Lava Fissure -熔岩裂缝 -A great fissure erupts from the earth, dealing 70 fire damage to enemies in a 4-range line and dealing 15 damage/turn for 6 turns. -使大地崩裂喷出熔岩,对 4 格范围内的敌人造成 70 点火焰伤害,接下来每回合造成 15 点火焰伤害,持续6回合。 -You stomp the ground and the earth opens its gaping maw! -你重踏大地,地面出现了无底洞! -Flame Blade -火焰之刃 -When enabled: Weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. -启用后武器攻击消耗法力值并造成火焰伤害,对相邻目标造成 30 点火焰伤害。 -Fire Hazard -危险之火 -Fire damage ignites enemies for 5 damage per turn for 6 turns. -火焰伤害可使敌人进入燃烧状态 6 回合,每回合造成 5 点伤害。 -Temperature Play -温度Play -Fire and Ice damage do 30% more damage to fully bound enemies. -对被完全束缚的敌人造成额外 30% 火焰或寒冰伤害。 +The crystals break off, revealing a keyhole and weakening the item. +结晶断裂,露出一个钥匙孔,削弱了锁的强度。 +Your distraction causes the crystals to grow back, encasing the lock again! +你的性奋让结晶重新长出,再次把锁包住! -#基础雷法术# -Electrify -落雷 -A delayed shock that deals DamageDealt damage and stuns for Duration turns. -释放一道造成 DamageDealt 电击伤害和 Duration 回合眩晕的延迟雷击。 -You charge up a burst of electricty! -你召唤了落雷! -The elemental channels the force of the storm! -元素引导风暴之力! -Electric Field -电场 -Creates a conductive area for Duration turns. Makes all entities in the area Conductive, forcing them to share 50% electric damage. -创造一个持续 Duration 回合的导电区域,使区域内个体导电。在导电区域内个体被电击伤害时,使区域内其他所有个体同时承受被攻击个体的 50% 电击伤害。 -You energize the targeted area! -你为区域注入能量! +After popping the gag out of your mouth, it hangs loose around your neck. +从你嘴里取出塞子后,它松松垮垮地挂在你脖子上。 +The gag is now in your mouth. +塞子现在在你嘴里。 -Static Sphere -静态球体 -Conjure a sphere for Duration turns that makes nearby entities Conductive and each turn deals DamageDealt electric damage to one of them. -召唤一个球体 Duration 回合,使相邻的个体导电,且每回合对其中一个个体造成 DamageDealt 电击伤害。 -You summon a grey, featureless sphere adorned by static! -你召唤了一个由静电环绕的暗淡无光的球体! -Shock Orb -冲击之球 -A slow-moving orb that deals DamageDealt electric damage to an adjacent enemy each turn. -召唤一个缓慢移动的球体,每回合对相邻敌人造成 DamageDealt 点电击伤害。 -You hurl a charged orb! -你召唤了一个带电的球体! +ERROR: Restraint does not exist. Did you forget to load mods? +错误: 拘束具不存在。你是否忘记了加载模组? -Crackle -暴雷 -Stun Blast -冲击波 -Storm Bolt -风暴之箭 -A bolt of lightning that does DamageDealt electric damage to enemies in a 4-range line and briefly stuns. -召唤一道闪电,对施法方向 4 格内的敌人造成 DamageDealt 点电击伤害,附加短暂眩晕。 -Lightning erupts from your fingertips! -闪电从指尖爆发! -Lightning Bolt -闪电箭 -A bolt of lightning that does DamageDealt damage to enemies in an infinite line and briefly stuns. -召唤一道闪电,对施法方向上所有的敌人造成 DamageDealt 点电击伤害,附加短暂眩晕。 -You unleash a bolt of lightning! -你释放出一道闪电! -Lightning Rune -闪电符文 -A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 5 turns to setup. -设置一个陷阱,陷阱可造成 DamageDealt 点电击伤害并眩晕 4 回合。需要 5 回合进行设置。 -You conjure a charged trap! -你设置了一个闪电陷阱! +Gag Necklace +口塞项链 +A cute accessory for those who wish to (not) make a statement. +对于那些(不)想发表任何言论的人来说,这是一个可爱的配饰。 +Functions as a collar. +用作项圈。 -Lightning Rod -避雷针 -After casting an Air or Storm spell that costs mana, become Conductive and gain 300% electric resist for 3 turns. -在施放消耗法力的风或雷法术后,变得导电并获得 300% 的电击抗性,持续 3 回合。 -#基础风法术# -Windblast -暴风 -Three puffs of wind that do DamageDealt pressure damage, stun briefly, and push targets back. -召唤三道风压造成 DamageDealt 点压力伤害,附加短暂眩晕和击退。 -You press your wrists together and conjure a blast of wind! -你并拢手腕召唤出暴风! +No mod info! +无模组信息! +Wrong patch +错误的路径 +VERY Outdated! +太过时了! +Outdated! +过时! +Check dependencies! +请检查依赖! +Check compatibility! +请检查兼容性! +Misc Error +其他错误 +### v + +Magical disenchantment suspends your living collar for AMNT turns +魔法解除魔咒会在 AMNT 回合内让你的活体项圈无效化 + + +(will add AMNT TPE binding) +(将添加 AMNT TPE 束缚) +Hardlight +强光 +Knocked Out +击倒 +Vine +藤曼 + + +Saving... +保存中... +Game Saved +游戏已保存 + + +ENMY escapes from the ITMN! +ENMY 从 ITMN 逃脱! +ENMY escapes from the ITMN and the item vanishes. +ENMY 从 ITMN 中逃脱,物品消失了。 +ENMY unlocks the ITMN! +ENMY 解开了 ITMN 的锁! +The conjured ITMN vanishes as it comes off. +被召唤的 ITMN 在脱落时消失了。 + + +AMNT restraints added since last tick~ +自上个周期以来增加了 AMNT 拘束具~ +AMNT restraints confiscated since last tick~ +自上个周期以没收的 AMNT 拘束具~ +You have no restraints in storage. Go to the Summit to deposit restraints. +您的仓库中没有拘束具。前往顶部设施存放拘束具。 + + +Back to Facilities +返回设施 + + +Your Inventory +你的库存 +Warden's Storage +典狱长储藏室 + + +Store 1 ITMN +储存 1 ITMN +Take 1 ITMN +拿取 1 ITMN +Store 5 ITMN +储存 5 ITMN +Take 5 ITMN +拿取 5 ITMN +Store ALL ITMN +储存 全部 ITMN +Take ALL ITMN +拿取 全部 ITMN +Store ALL-1 ITMN +储存 全部-1 ITMN +Take ALL-1 ITMN +拿取 全部-1 ITMN +Take Everything +拿取全部 +Deposit All +全部存入 + + +Auto-loot found +自动拾取战利品 + (not picked up) +(未拾取) + + +Automatically Flip When Moving +在移动时自动翻转 + + +Go to the summit to deposit restraints +前往顶部存放拘束具 + + +AMNTx damage when SP is over 50% +在体力值超过50%时造成 AMNTx 伤害 + + +Barrage of Barrier Orb +障碍宝珠弹幕 +Barrier Orb +障碍宝珠 +Barrage of Sealing Talisman +封印护身符弹幕 +Self Unlock +自我解锁 +Crystal Storm +结晶风暴 + + +Shadow Walk +阴影步 + + +Your ITMN1 inflates inside your mouth to become a ITMN2! +你的 ITMN1 在口腔内膨胀成为 ITMN2! +Bigger Ball Gags +更大的口球 +Smaller ball gags are replaced by their larger versions. +较小的口球被较大的口球所取代。 +Screen effect when letting go +放弃时的画面效果 +Screen flash when distracted +性奋时屏幕闪烁 + + +Essentia Aliquam +乳胶要素 +Aliquam Orbis +乳胶宝珠 +Potio Requiem +安魂曲药水 +Ultimate Glue no. 91 +91号终极胶水 +Slime Encapsulation +粘液封装 +Judgement Bolt +裁决箭 +Flame Bolt +火焰箭 +Electrification +电气化 +Charming Orb +魅惑宝珠 +Freezing Orb +冰霜宝珠 +Heavy Ordnance +重型军械 +Entangle +缠绕 +Blessed Orb +祝福宝珠 +Slimy Sphere +粘液球 +Rubberization Protocol +橡胶化协议 +Latex Encapsulation +乳胶封装 +Red Slime Experiment +红色黏液实验 +Encasement Protocol +包装协议 +Electrical Discharge +放电 +Icebolt +冰箭 +Bubble Burst +泡沫破裂 +Electric Orb +电能球 +Chain Bolt +锁链箭 +Skeleton Minion +骷髅奴仆 +Skeleton Minions +骷髅奴仆 +Flummoxing Orb +困惑宝珠 +Crystallize +结成晶体 +Capture Device +捕捉设备 +Sedative +镇静剂 +Slime Barrage +粘液弹幕 +Seal of the 5th Era +第五纪元封印 + + + + +Healing Flash +治愈闪光 +Undead Frenzy +狂热亡灵 +Command Word +命令词 +Rope Ambush +绳索伏击 +Defensive Charm +魅惑防御 +Shield the Witch +护盾女巫 +Tracer Rounds +追踪弹 +The Spookening +惊悚时刻 +The Muffling +窒息 +Conjure Tickle Hands +召唤挠痒手 +Conjure Gags +调戏 +Scriptum Ferri +铁之誓 +Scrimptum Habena +剧本控 +Scriptum Ligni +木之书 +Electric Storm +闪电风暴 +Flower Spores +花孢子 +Magnum Opus +巅峰之作 +Latex Integrator +乳胶集成者 +Forcefield Protocol +力场协议 +Motivation +动力 +Drone Assault +无人机袭击 +Tape Drone Assault +胶带无人机袭击 +*summon slime mold* +*召唤黏菌* +Vine Growth +藤蔓生长 +Flower Growth +花朵生长 +Thorn Whip +荆棘之鞭 +Crystal Surge +晶体浪涌 +Shadow Shroud +阴影雾 +Shadow Step +阴影步 +Ice Wall +冰墙 +Armor Up +穿上盔甲 +Crystal Growth +晶体生长 +Shadow Orb +阴影球 +### Earthfield + +Soul Beam +灵魂光束 +Summon Shadows +召唤阴影 +Observation +观察 +Conjure Latex Restraint +召唤乳胶束缚 +Rope Sealing +偷取绳索 +Slime Minion +粘液仆从 +Magical Wrappings +魔力丝带 +Capture Bolt +捕获之箭 +Training Protocol +调教协议 +Motivation Protocol +动力协议 +Conjure Tickle Hand +召唤挠痒痒的手 +Conjure Locks +召唤锁 +Chainstorm +锁链风暴 +Chain Wall +锁链之墙 +Binding Ribbons +捆绑丝带 +Scriptum Limus +泥浆文书 +Scriptum Glacis +冰之书 +Scriptim Vinea +经文之藤 +Scriptum Infernus +地狱文书 +Scriptum Arcanum +秘密文书 +Scriptum Celeste +天之书 +Scriptum Electri +电气文书 +Blessed Rays +祝福射线 +Ghostly Pets +幽灵宠物 +Zombie Pets +僵尸宠物 +Drone Support +无人机支援 +Doll Training +玩偶训练 +Full Capture +完全捕获 +Shadow Hands +影之手 +Obsidian Orbs +黑耀宝珠 +Mithril Orbs +秘银宝珠 + -#基础冰法术# -Freeze -冻结 -Freeze an adjacent target for Duration turns. -冻结一个相邻的目标 Duration 回合。 -You utter dark words of ice-cold truths. -你说出冰封的黑暗咒语。 -Flash Frost -霜闪 -Deal DamageDealt ice damage in a 3x3 area. Drenched creatures are frozen for 8 turns. -在3x3范围内造成 DamageDealt 点寒冰伤害,被潮湿的个体被冻结 8 回合。 -You recite a frigid poem... -你吟诵一首冰冷之诗... -Hailstorm -冰雹 -A cloud of falling ice that does DamageDealt damage per turn for LifeTime turns and slows. -降下一道冰雹,持续 LifeTime 回合,每回合造成 DamageDealt 点寒冰伤害和减速。 -You conjure a flurry of frost! -你召唤了冰雹! +(The Warden perks an eyebrow at the sight of you,|before a wide grin overtakes her face)|Ahhh Fuuka. Chosen by the Goddess?|How does it feel to once again be under a leash? +(监狱长一看到你就扬起眉毛,|然后咧嘴一笑)|啊,风香(Fuuka)。被女神选中?|再次被束缚的感觉如何? +Fuuka, take her down. +风香(Fuuka),带她下来。 +(Send Fuuka to fight her) +(派风香(Fuuka)和她战斗) +That is none of your business. Now kneel. +那不关你的事,现在跪下。 +(Fight without listening.) +(不听任何话就开战) -Ice Breath -冰霜吐息 -A field of icicles that deals DamageDealt damage on a hit and stuns briefly. -生成一片冰柱,冰柱可造成 DamageDealt 点寒冰伤害并造成短暂眩晕。 -You breath out a chilling frost! -你呼出一股令人毛骨悚然的冰霜! -Ice Shard -冰枪术 -A shard of ice that does DamageDealt damage and slows for Duration turns. Freezes if already slowed or drenched. -投掷一个造成 DamageDealt 寒冰伤害并在 Duration 回合内造成减速的冰枪。冻结减速或潮湿的目标。 -You a hurl a shard of ice! -你投出一杆冰枪! +Blessed Hex +祝福之妖术 +Hexing Orb +妖术宝珠 +Hexed Latex Engulf +妖术乳胶吞噬 +Hex Binding +妖术捆绑 -Snowball -雪球 -A fast orb that leaves behind a frigid cloud of ice. Enemies walking in the cloud take DamageDealt ice damage per tile and are slowed. -发射一个雪球,雪球将在路径上留下寒冰云。在寒冰云中的敌人每移动一格都会受到 DamageDealt 点寒冰伤害并被减速。 -You a hurl a snowy blast! -你掷出一团雪! -Winterblast -凛冽寒流 -A piercing orb that leaves a trail of ice. Deals DamageDealt ice damage to enemies hit. -发射一个贯穿整个路径并留下冰痕的严寒结晶。对击中的敌人造成 DamageDealt 点寒冰伤害。 -You a hurl a frigid orb! -你掷出一个严寒结晶! +Here you will find various scraps of documents and lore you've recovered throughout your adventures. +在这里可以翻阅你在冒险过程中找到的各种碎片化文档和传说。 +Your Journal +你的旅记 +Cover +扉页 +I am writing this journal in the off chance that I do not come return from the Agarthan ruins. If you find this, please make an effort to deliver it back to the surface for the good of all the women lured in by its secrets. +我写下这篇日记是为了防止我没能从阿加莎废墟回来。如果有人发现了这本日记,请努力将它送回地面,以造福所有被地下城的秘密所诱惑的女性。 +Catherine Willows' Journal (preface) +凯瑟琳·韦罗斯的日记(序言) +Willows 0 +条 0 +As I scaled the mountain, I came across a massive graveyard above the treeline, a grand memorial to those who died before the Great Work. This graveyard extends into the mouth of the cave, and the guards told me not to deface any of the graves, or else the ghosts will come and get me. It would be easier to follow their instructions if there weren't so much treasure still hidden here! After all, most of us are deep in the red after sailing all this way. +当我翻过这座山时,我在树丛上方看到了一个巨大的墓地,这是对那些在伟大成就之前死去的人的隆重纪念。这个墓地一直延伸到洞口,守卫告诉我不要破坏任何坟墓,否则鬼魂会来抓我。如果不是这里还藏着这么多宝藏,我倒是很愿意听从他们的指示!毕竟一路航行下来,我们中的大多数人都早已身无分文。 +Catherine Willows' Journal (pg. 7) +凯瑟琳·韦罗斯的日记(第 7 页) +Willows 7 +条 7 +It's hard to imagine I'm in a cave. Everything is so decorated and well-preserved, it's almost as if decades of adventurers never found their way to this island. In the distant future when every last piece of treasure has been hauled out of here, I imagine they'll set this place up as a tourist attraction. +很难想象我只是在一个山洞里。这里的一切都装饰得如此精美,保存得如此完好,就像数十年来所有的冒险家从未曾找到这座小岛一样。在遥远的将来,当所有的宝藏都被运走后,我想他们会把这里建成一个旅游景点。 +Catherine Willows' Journal (pg. 8) +凯瑟琳·韦罗斯的日记(第 8 页) +Willows 8 +条 8 +I spoke with a few locals while resupplying at the port. Apparently the village up here is far older than the twenty-some years the Adventurer's Guild has been on the island. The locals call the mountain 'Ejahl,' but the consensus is that this is the site of the legendary city Agartha where the Archmagus herself made her discovery.|(The page is dated about fifty years ago) +在港口补给的时候,我和几个当地人聊了聊。显然,这里的村庄比岛上二十多年历史的冒险者公会要悠久得多。当地人称这座山为'埃亚尔(Ejahl)',但大家一致认为这里就是传说中的阿加莎城所在地,大魔导师就是在这里完成了她的发现。|(本页落款日期约为五十年前) +Catherine Willows' Journal (pg. 14) +凯瑟琳·韦罗斯的日记(第 14 页) +Willows 14 +条 14 +I made it to a deeper floor today, and was greeted by a skeleton trying to tie me up. Great.|I've looked into the local name for this mountain, 'Ejahl,' and found a footnote in the history books talking about some petty kingdom that laid siege to Agartha. There's no record of them actually winning the siege, though. I've heard there's a massive library somewhere down here, maybe I'll find answers there. +今天我来到了更深的一层,迎接我的是一具想把我绑起来的骷髅。好极了。|我查了一下这座山在当地的名字埃亚尔(Ejahl),在史书中发现了一个脚注,说的是某个小王国围攻了阿加莎。但没有任何记录表明他们真的赢得了围攻。我听说这下面有个巨大的图书馆,也许我能在那里找到答案。 +Catherine Willows' Journal (pg. 17) +凯瑟琳·韦罗斯的日记(第 17 页) +Willows 17 +条 17 +There was a warrior in the catacombs today. She appears to have mastered the art of witty comebacks, as I truly could not come up with anything to say that did not further humiliate myself. Fortunately her insults came at her companions' expense, and they allowed me to defeat her in a solitary duel. +今天,地下墓穴里来了一位勇士。她似乎已经掌握了机智回应的艺术,使我实在想不出说什么话能不进一步羞辱自己。幸运的是,她的辱骂是以她的同伴为代价的,他们让我在一次单独决斗中打败了她。 +Catherine Willows' Journal (pg. 20) +凯瑟琳·韦罗斯的日记(第 20 页) +Willows 20 +条 20 +I almost found myself the recipient of a powerful binding arrow enchanted with force runes. Had I been hit, I would have been knocked back against the walls with my arms pinned by glowing conjured cuffs. Fortunately, this projectile hit a skeleton that was attacking me instead, and I was able to retreat. +我差点就中了一支附有力量符文的强力束缚箭。如果我被击中,就会被钉到墙边,然后双臂被发光的魔法手铐夹住。幸运的是,这支箭击中了一个正在攻击我的骷髅,并使我得以撤退。 +Catherine Willows' Journal (pg. 21) +凯瑟琳·韦罗斯的日记(第 21 页) +Willows 21 +条 21 +In my travels I encountered a curious tomb filled with the scent of incense and herbs. Strange statues lined the halls on stone pedestals, standing as an intimidating reminder of what happens to those who disturb the locals...|I encountered resistance from the locals, who seemed to regard outsiders as 'cursed' and sought to capture me in an effort to give me a 'blessing.' I highly doubt that anyone has been truly blessed by their efforts, well-intentioned or not. +在旅途中,我遇到了一座充满香火和草药气味的奇特坟墓。奇怪的雕像在大厅里的石座上鳞次栉比,令人生畏地提醒着我,那些打扰了当地人的人的下场......我遇到了当地人的抵抗,他们似乎把外来者视为 “被诅咒的人”,并试图抓住我,给我 “祝福”。我非常怀疑是否有人真的因为他们的努力而得到了祝福,不管他们是否出于好意。 +Catherine Willows' Journal (pg. 24) +凯瑟琳·韦罗斯的日记(第 24 页) +Willows 24 +条 24 +This 'blessing' of theirs appears to be an old ritual for immortality. I believe these peoples are older than the Great Work, based on the ancient dialect they speak and the outdated script they use.|Whatever the case may be, their method seems inexact and prone to failure, as demonstrated by their near maniacal devotion to 'bless' every adventurer they come across. +他们的这种 “祝福 ”似乎是一种古老的长生不老仪式。根据他们说的古老方言和使用的过时文字,我相信这些人的历史比伟大成就还要悠久。|无论如何,他们的方法似乎并不精确,而且很容易失败,这一点从他们近乎疯狂地 “祝福 ”他们遇到的每一个冒险者就可见一斑。 +Catherine Willows' Journal (pg. 25) +凯瑟琳·韦罗斯的日记(第 25 页) +Willows 25 +条 25 +There are two 'castes' in the Bast cult. The first are the 'blessed,' and the second are their watchful guardians. The unintuitive bit is that the 'blessed' are the ones wrapped up and sealed away inside statues, sarcophagi, and anything else the guardians can stick a person into. The free ones wandering around grabbing people? They're the ones who weren't 'blessed' apparently. +在猫女神教会中有两种阶级。第一种是 “受祝福者”,第二种是他们的守护者。反直觉的一点是,“受祝福者”是那些被包裹起来,封印在雕像、石棺或被守护者塞到任何可以塞得进去的地方的人。那些自由自在到处抓人的?他们显然是那些“未受祝福者”。 +Catherine Willows' Journal (pg. 26) +凯瑟琳·韦罗斯的日记(第 26 页) +Willows 26 +条 26 +I've found it! The Archmagus' library! Much to my chagrin, however, the place has been ransacked by witches and a curious group of mages in search of inspiration from ancient fashion choices. +我终于找到了!大法师的图书馆!然而令我懊恼的是,这里已经被女巫和一群好奇的法师洗劫一空,她们想从古代装饰中寻找灵感 +Catherine Willows' Journal (pg. 30) +凯瑟琳·韦罗斯的日记(第 30 页) +Willows 30 +条 30 +It appears someone got to the Archmagus' writings before I could. Nonetheless, I will continue my search for Vinlaga's personal study. Perhaps her research materials and drafts might shed some light on my condition. +看来有人比我先拿到了大魔导师的著作。不过,我会继续寻找文拉加的个人研究。也许她的研究资料和草稿会对我的状况有所启发。 +Catherine Willows' Journal (pg. 31) +凯瑟琳·韦罗斯的日记(第 31 页) +Willows 31 +条 31 +I have learned of an ancient artifact, called the Mistress' Staff. Its history and owner are hotly debated, with some attributing it to the Archmagus herself, while others say it was developed by the magical warlords that followed. Most all sources agree that its signature feature is the ability to reverse the effects of the Great Work on any person. +我了解到有一件古老的神器叫做女魔杖。它的历史和拥有者众说纷纭,有人说是大魔导师本人所为,也有人说是由后来的魔法军阀研制的。大多数消息来源都认为,它的标志性特征是能够逆转伟大成就对任何人的影响。 +Catherine Willows' Journal (pg. 36) +凯瑟琳·韦罗斯的日记(第 36 页) +Willows 33 +条 33 +There is a treasure trove of ancient history here that the blasted Dressmakers had no use for. I found a map from the 'Kingdom of Ejahl,' with sketches of many islands including this one. Like most of the warlord states, they failed to make a lasting impact on the architecture of the island, but it appears the island was uninhabited for some time between the fall of Agartha and its resettlement by Ejahl. +这里有一个古代历史的宝藏,而那该死的裁缝师们没有用得上。我发现了一张 “埃亚尔王国 ”的地图,上面有许多岛屿的草图,包括这座岛屿。和大多数军阀割据的国家一样,他们没能对这座岛屿的建筑产生持久的影响,但从阿加莎沦陷到埃亚尔人重返这座岛屿之间的一段时间里,这里似乎一直无人居住。 +Catherine Willows' Journal (pg. 41) +凯瑟琳·韦罗斯的日记(第 41 页) +Willows 41 +条 41 +...I must find it.|They are looking for it.|They CANNOT be allowed to have it. +......我必须找到它。|他们也在寻找|不能让他们得到它 +Catherine Willows' Journal (pg. 47) +凯瑟琳·韦罗斯的日记(第 47 页) +Willows 37 +条 37 +I saw my reflection in a pool of water today. My hair looked much more silver than I remember it. I hope this isn't a side effect of all the magic I'd used to make it to this point. +今天,我在一池清水中看到了自己的倒影。我的头发看起来比我记忆中的银色多了。我希望这不是我用魔法产生的副作用。 +Catherine Willows' Journal (pg. 50) +凯瑟琳·韦罗斯的日记(第 50 页) +Willows 50 +条 50 +I heard the bandits are looking for the Mistress' Staff. I'm not too worried--they wouldn't know what to do with it. It's that damned witch I'm worried about.|If my astute reader has come this far, you should beware the Silver Witch. She is working with forces that cannot be trusted. +我听说强盗们在找女主人的法杖。我不太担心--她们不知道该怎么使用它。我担心的是那个该死的魔女。|如果读着这段文字的聪明人走到这一步,你更应该小心银发魔女。她在与不可信任的力量合作。 +Catherine Willows' Journal (pg. 51) +凯瑟琳·韦罗斯的日记(第 51 页) +Willows 51 +条 51 +It seems I am not alone in my search for the Staff. To whom it may concern: the Great Work is a lie, and it will doom us all. If you care for your soul, you need to break the cycle, and for that we need a key: the Mistress' Staff. +看来,我不是一个人在寻找这把法杖。伟大成就是一个谎言,它将毁灭我们所有人。如果你关心自己的灵魂,就必须打破这个循环,为此我们需要一把钥匙 : 女魔杖。 +Silver Witch's Notes #10 +银发魔女的笔记 #10 +Silver 10 +银 10 +I met an adventurer who managed to erase weeks of golem research in the blink of an eye. This is why we Summoners have to scatter our works far and wide... if only they knew what we are working towards. +我遇到过一个冒险者,他在眨眼间就抹去了数周的傀儡研究成果。这就是为什么我们召唤师要把我们的作品散播的越远越好......如果他们知道我们为什么这么努力就好了。 +Silver Witch's Notes #2 +银发魔女的笔记 #2 +Silver 2 +银 2 +The dimensional rift is especially active today. I spoke with some of the voices the other night, they offered me immortality in exchange for material wealth. They must have called the wrong universe or something... +维度裂缝今天特别活跃。那天晚上我和一些声音交谈了 他们用永生来交换物质财富 他们一定是拨通了错误的宇宙电话之类的...... +Silver Witch's Notes #3 +银发魔女的笔记 #3 +Silver 3 +银 3 +My new golem project did not go as expected. I'd expected the primordial one to answer once I'd opened the gate, but there was nothing but a horde of star demons which I quickly dispatched. Could this mean the source of primordial latex is not outside this universe, as I had thought, but inside? I must investigate further. +我的傀儡计划并不尽如人意。我本以为一打开大门,原始乳胶就会回应我,但除了一大群被我迅速驱散的星魔之外,什么也没有。这是否意味着原始乳胶的源头并不像我想象的那样在宇宙之外,而是在宇宙之内?我必须进一步调查。 +Silver Witch's Notes #18 +银发魔女的笔记 #18 +Silver 18 +银 18 +She did it again. Barged in on my work and called me a 'purveyor of evil magics,' whatever that means. Magic isn't evil, it was given to us directly by the gods! At least I hid my new golem in a different study of mine... +她又来了。闯进我的工作间,说我是'邪恶魔法的传播者',不管她是什么意思。魔法并不邪恶 它是神直接赐予我们的,不过至少我把的新傀儡藏起来了。在我的另一间书房里...... +Silver Witch's Notes #15 +银发魔女的笔记 #15 +Silver 15 +银 15 +Throughout my studies I have chased after the existence of a being I call 'the Primordial One.' My theories stem from the following observations:|1)Slimes were not present in ancient history, and appeared during my lifetime as a force of nature.|2)Slime can be transmuted into almost any known material, like a Prima Materia of sorts.|3) A fragment of Sariel's notes, one of my most guarded possessions, discusses the existence of slimes long before they were first observed in the world.|Based on this, I believe the world must have been created through the influence of some primordial being who then left, but must be returning somehow.|I'm sure this being holds the key to repairing our bodies. +在我的研究过程中,我一直在追寻一种我称之为'原初之神'的存在。我的理论源于以下观察 : |1)粘液在古代历史中并不存在,在我有生之年作为一种自然力量出现了。|2)粘液几乎可以转化成任何已知的材料,就像一种原始材料。|3)萨瑞尔笔记的一个片段是我最珍视的财产之一,其中讨论了史莱姆的存在,这比人们第一次在世界上观察到史莱姆要早得多。| |基于这一点,我相信这个世界一定是在某个原始生命的影响下被创造出来的。|我相信这个生物掌握着修复我们身体的关键。 +Silver Witch's Notes on the Primordial One +银发魔女的原始者笔记 +Silver 4 +银 4 +Blast. An adventurer stole one of my notebooks, and now I'm encountering various cultists and weirdos trying to summon the Primordial One themselves. This is why I never bother to publish my works... +哈。一个冒险家偷了我的一本笔记 所以现在我遇到的各种邪教徒和怪人,他们都想自己召唤出原始之神。这就是为什么我从不费心出版我的作品... +Silver Witch's Notes #7 +银发魔女的笔记 #7 +Silver 7 +银 7 +I haven't heard of that adventurer in decades. Perhaps her nosiness finally caught up to her? +我已经几十年没听说过那个冒险家了。也许她因为她的爱管闲事得到报应了? +Silver Witch's Notes #106 +银发魔女的笔记 #106 +Silver 106 +银 106 +There is a new presence in the mountain. An opportunist that calls herself 'the Dollmaker.' Claims to be the lost heir to the Kingdom of Ejahl. Please~.|I've seen those hackjobs and reprogrammed wrecks. If there even was a Kingdom of Ejahl, surely their army would consist of more than just scrapped combat drones? +山中出现了一个新的存在。一个自称'玩偶制造者'的投机分子。自称是埃亚尔王国失落的继承人。拜托!|我见过那些黑客和重新编程的残骸 如果真有埃贾尔王国,他们的军队肯定不只是由报废的战斗无人机组成吧? +Silver Witch's Notes #117 +银发魔女的笔记 #117 +Silver 117 +银 117 +The Kingdom of Ejahl appeared in Agartha 170 years after the death of Sariel Vinlaga. It had three* rulers who vied for the throne at different times:|Diana, Princess of Machinery|Emer, the Warsage|And the Dollmaker, High General of the Kingdom||*Some manuscripts read 'two' +萨瑞尔-文拉加死后 170 年,埃亚尔王国出现在阿加莎。它有三位*统治者,他们在不同时期争夺王位 : |机械公主戴安娜|战争之王埃玛尔|玩偶制造者,王国的高级将领||| *有些手稿上写的是 “两个”。 +The Chronicles of Ejahl +埃亚尔王国编年史 +Ejahl 1 +埃亚尔 1 +The Kingdom of Ejahl ruled the island of Agartha for 30 years before its collapse. During the last war, an unknown figure captured the majority of its army and the majority of the population fled by boat. No one was left on the island. +埃亚尔王国统治阿加莎岛30余年直至其灭亡。在最后的战争中,一个不知名的人物俘虏了其大部分军队,大部分人口乘船逃离。岛上一个人也没有留下。 +The Fall of Ejahl +埃亚尔王国的覆灭 +Ejahl 2 +埃亚尔 2 +Danger Level: Nearly Harmless|A reanimated corpse from before the Great Work. I can't tell if the original soul still inhabits the body, since it can barely speak let alone explain its identity.||-Denizens of the Dungeon by Catherine Willows +危险等级: 几乎无害|一具伟大工程之前复活的尸体。我无法判断这具躯体中是否还居住着最初的灵魂,因为它几乎不会说话,更不用说解释自己的身份了。||《地下城居民》————凯瑟琳·韦罗斯 +Danger Level: Normal|These zombies are more motivated than the others. Their behavior is similar to that of vengeful spirits I've encountered in the depths.||-Denizens of the Dungeon by Catherine Willows +危险等级 : 正常|这些僵尸比其他僵尸更有动机。它们的行为类似于我在深渊中遇到的复仇之灵。||《地下城居民》————凯瑟琳·韦罗斯 +Fast Z. +愤怒僵尸 Z +Danger Level: Normal|A zombie that can use magic. It doesn't look like any magic I've seen outside the ruins, which makes me think that it was taught to use magic. Some of them have tattoos associated with magic in the old times. Since magic comes from the soul, I assume there is some hint of the original soul still present.|-Denizens of the Dungeon by Catherine Willows +危险等级 : 普通|会使用魔法的僵尸。它看起来不像我在废墟外见过的任何魔法,这让我觉得它是被教会使用魔法的。有些僵尸身上的纹身与旧时代的魔法有关。因为魔法来自灵魂,所以我认为他们身上还残留着一些原始灵魂的影子。||《地下城居民》————凯瑟琳·韦罗斯 +Mage Z. +魔法僵尸 Z +Danger Level: High|A zombie with impeccable sword technique. I've never seen an undead handle a sword so smoothly. Probably buried with their weapons and gear, since most of it is aged. Even their binding techniques resemble those in the textbooks rather than modern ropework.||-Denizens of the Dungeon by Catherine Willows +危险等级 : 高|一个有着高超剑术的僵尸。我从没见过一个亡灵能把剑用得如此顺手。可能是他们的武器和装备被埋没了,因为大部分都已经老化。甚至他们的捆绑技术也很像教科书上的,而不是现代的绳索。||《地下城居民》————凯瑟琳·韦罗斯 +Warrior Z. +战士僵尸 Z +Danger Level: High|A zombie that uses sealing charms and healing magic. Irony aside, I've seen these with rope marks and gag strap marks on their skin and face. It seems like someone is playing with them. Who could that be?||-Denizens of the Dungeon by Catherine Willows +危险等级 : 高|使用封印符咒和治疗魔法的僵尸。除了讽刺之外,我还见过这些僵尸的皮肤和脸上有绳子和塞口带的痕迹。好像有人在玩弄他们。会是谁呢?||《地下城居民》————凯瑟琳·韦罗斯 +Talisman Z. +护符僵尸 Z +Danger Level: Annoying|A playful spirit residing in the dungeon, taking advantage of any adventurers they come across. They can pass through walls, and most physical weapons go right through them. Using a magical weapon seems to banish them for some time, at least.||-Denizens of the Dungeon by Catherine Willows +危险等级 : 令人讨厌|居住在地牢中的嬉戏精灵,会利用遇到的冒险者。它们可以穿墙而过,大多数物理武器都能直接穿过它们。使用魔法武器似乎能驱逐它们一段时间。||《地下城居民》————凯瑟琳·韦罗斯 +Danger Level: Very Annoying|It is said that ghosts are the spirits of pre-Great Work humans whose souls are bound to this world by unfinished dreams and ambitions. But I don't believe a word of that. These little guys care about nothing except humiliating people. Ask me how I know.||-Denizens of the Dungeon by Catherine Willows +危险等级 : 非常令人讨厌|据说鬼魂是伟大成就之前人类的灵魂,他们的灵魂被未完成的梦想和抱负束缚在这个世界上。但我一点也不相信。这些小家伙除了羞辱人,什么都不在乎。问问我是怎么知道的||《地下城居民》————凯瑟琳·韦罗斯 +Danger Level: Medium|A very playful ghost with a penchant for teasing. It even carries spectral restraints of its own for use in 'games,' which tend to consist of tickling tied up girls.||-Denizens of the Dungeon by Catherine Willows +危险等级 : 中 | 喜欢捉弄人的调皮鬼魂,尤其喜欢骚弄被绑住的女孩子们。它们往往在“游戏”中使用自带的透明束缚物。|| —《地牢中的居民》 凯瑟琳·威洛斯 著 +Danger Level: Low|The feelings of a person who desired wealth in life. While it is unable to claim any physical wealth for itself, it nonetheless will rummage through your pockets and possessions if it gets a chance.||-Denizens of the Dungeon by Catherine Willows +危险等级 : 低|一个人生前所渴望财富的情感,虽然他无法获得任何实际的财物,但是他依然会翻找你的口袋。||——《地牢里的居民》 凯瑟琳·威洛斯 著 +Danger Level: High|A constricting mass of negative thoughts. According to local myths, the other ghosts attempt to cheer this one up by hugging it, but its wails end up attracting them to your position. Be prepared to take it down lest you find yourself a plaything for the beyond.||-Denizens of the Dungeon by Catherine Willows +危险等级 : 高 | 一团压迫感强烈的负面思维。根据当地的传说,其他幽灵试图通过拥抱来安慰它,但它的哀号最终会将它们吸引到你的身边。准备好击败它,否则你可能会成为来自异界存在的玩物。 ||《地牢中的居民》凯瑟琳·威洛斯 著 +Danger Level: High|While most wizards spend literal centuries mastering the art of magic, there are those lacking the patience or discipline to study magic the old fashioned way. Driven by a need for power, these individuals make contracts with otherworldly beings and become Witches.||-Denizens of the Dungeon by Catherine Willows +危险等级 : 高|虽然大多数魔法师会用数个世纪的时间来练习,精通自己的魔法技术,但也有一些人缺乏耐心,不去按传统方式学习魔法。为了追求力量,这些人会与其他世界的存在签订契约,成为女巫。||-《地牢中的居民》 凯瑟琳·威洛斯 著 +The Witches' Coven +女巫集会 +Witches +女巫 +Danger Level: Extreme|A witch gifted in the arts of conjuration. Backed by an army of animated spectral hands and devious tomes, this variety of witch is extremely dangerous. Her close range attacks are slow and unwieldy, but take care not to get surrounded.||-Denizens of the Dungeon by Catherine Willows +危险等级 : 极高 | 一位擅长召唤术的女巫。她有一支由影之手和魔法书组成的军队,如此类型的女巫极其危险。她的近战攻击动作缓慢且笨拙,但要小心不要被包围。||——《地牢中的居民》凯瑟琳·威洛斯 著 +Danger Level: High|They appear to be influential figures in the ancient Bast cult. Not only are they able to wield explosive magics, they can conjure magical wrappings at close range.||-Denizens of the Dungeon by Catherine Willows +危险等级 : 高|他们似乎是古代Bast邪教中颇具影响力的人物。他们不仅能施展爆炸魔法,还能在近距离变出魔法包裹。||《地下城居民》————凯瑟琳·韦罗斯 +Bast Mummy +猫女神木乃伊 +Danger Level: Medium|Worshippers of the Cat Goddess. Devoted to the sole task of defending the tombs from outsiders, they are rarely willing to negotiate. Some maintain peak physical prowess, while others can even cast spells.||-Denizens of the Dungeon by Catherine Willows +危险等级 : 中等 | 猫女神的信徒。仅致力于唯一的任务——保护墓地不受外人侵犯,她们很少愿意谈判。有些信徒有着极高的身体素质,而另一些则能施展魔法。||——《地牢中的居民》 凯瑟琳·威洛斯 著 +Bast Clerics +猫女神祭司 +Rock-solid and form-fitting. +坚如磐石,贴身舒适。 +Provides minor protection against enemy attacks. Decreases stealth. +提供轻微保护,抵御敌人攻击。降低隐身效果。 +Adventuring Corset +冒险紧身胸衣 +Protects your organs and your sense of style. +保护你的器官和时尚感。 +Provides minor protection against enemy attacks at the cost of flexibility. +提供轻微的保护,抵御敌人的攻击,但会降低灵活性。 +The best uniform. Has a (lockable) zipper in the back for convenience! +最好的制服。背部有(可锁)拉链,方便使用! +Removes excess clothing and adds +10 Evasion. +20 Soap and Glue resist, and being drenched dries faster. +可脱掉多余的衣服,并增加 +10 的闪避。肥皂和胶体抗性+20,被淋湿后干得更快。 +Robe of Chastity +贞洁长袍 +A magical leotard whose power stems directly from the divine. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. +一件神奇的紧身衣,它的力量直接源自神性。它由一种编织物制成,只要不穿衣服,就能将穿着者的深层能量转化为强大的能量。 +Chainmail Tank Top +链甲背心 +Cumbersome, but effective! +笨重但有效! +Provides +10 armor and protection against enemy attacks. Decreases stealth/evasion and makes struggling harder. +提供 +10 护甲,抵御敌人攻击。降低隐身/闪避效果,增加挣扎难度。 +Chainmail Bikini +链甲比基尼 +Covers the important bits, anyway. +无论如何,它至少能覆盖重要部位。 ++20 Bondage Resist. Conducts electricity. ++20 捆绑抗性。导电。 +Light Plate Armor +轻型板甲 +Knight in shining rest-err, armor! +穿着闪亮盔甲的骑士! +Provides +5 armor and high protection. No impact to stealth or evasion +提供 +5 护甲和高等级防护。不影响隐身或闪避 +Wizard's Robe +魔法师长袍 +I have the power! +我拥有力量 ++30% spell damage and +10 spell ward ++30% 法术伤害和 +10 法术防护 +Chain Skirt +链甲裙 +A defensive garment providing optimal coverage to the lower torso. +为下半身提供最佳防护的防御性服装。 +Provides medium protection. No impact to stealth or evasion +提供中等防护。不影响隐身或闪避 +Armored Skirt +金属裙甲 +Gloves with an iron grip. +坚硬的手套。 +Provides +5 armor and minor protection against enemy attacks. Makes noise when attacking. +提供 +5 护甲和轻微防护。攻击时会发出声音。 +Leather Gloves +皮质手套 +Protecting you in style. +为你提供时尚保护。 +Provides minor protection against enemy attacks. +提供轻微防护,抵御敌人攻击。 +Steel Pauldrons +钢铁护肩 +Dependable protection for the average adventurer. +为普通冒险者提供可靠的保护。 +Ranger's Cape +游侠披风 +Inbued with the powers of moss and ferns and stuff. +注入苔藓和蕨类植物的力量。 ++25 Evasion. Increases stealth slightly. +闪避+25。略微增强隐藏能力。 +Oracle's Armbands +神谕臂章 +Armbands made of a slightly magical material. +由略带魔法的材料制成的臂章。 ++5% spell damage. +5 Magic Armor. ++5% 法术伤害。+5 魔法护甲。 +Armored Boots +金属靴甲 +Noisy, but fashionable! +吵闹,但时尚! +Provides +5 armor and protection against enemy attacks. Decreases stealth. +提供 +5 护甲,抵御敌人攻击。降低隐藏效果。 +Hide Boots +皮质长靴 +For stepping into all kinds of trouble! +用于躲避各种麻烦! -Icicles -冰柱 -Icicle -冰柱 -Channel 3 turns to fire 3 icicles that deal DamageDealt ice damage and slow for 4 turns, freezing slowed/drenched targets for 3 turns. -在 3 回合内发射 3 根造成 DamageDealt 点寒冰伤害并减速 4 回合的冰柱,冻结减速或潮湿的目标 3 回合。 -You raise a hand and icicles fly forward! -你举起手,冰柱开始出现! -Ice Lance -冰矛 -A quick-moving shard of ice that does DamageDealt damage and slows for Duration turns and passes through enemies. Freezes if already slowed or drenched. -发射一个高速冰矛,造成 DamageDealt 寒冰伤害并减速 Duration 回合,冻结减速或潮湿的目标。 -You conjure a mighty spear of ice and hurl it forward! -你召唤出一把强大的冰矛并将它向前投掷! +Generating Map... +生成地图中... -Field of Frost -冰霜领域 -Freezes a 5x5 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. -冻结 5x5 的区域并附加减速。 该区域中的敌人每回合受到 DamageDealt 点伤害,持续 LifeTime 回合。 -You stomp your foot and call forth the storm! -你重踏大地,并召唤了风暴! -Freeze Rune -霜冻符文 -A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 5 turns to setup. -设置一个陷阱,陷阱可造成 DamageDealt 点寒冰伤害并冰冻 30 回合。 需要 5 回合进行设置。 -You conjure an icy trap! -你设置了一个霜冻陷阱! +Mystic wrappings constrict around your body! +神秘的丝带紧紧包裹了你的身体! -Shatter -冰爆 -When a frozen target thaws or dies, deals DamageDealt ice damage to nearby targets and slow for 4 turns.. -当被冻结的目标解冻或死亡时,对附近的目标造成 DamageDealt 寒冰伤害,并减速 4 回合。 -Frozen Prison -寒冰牢狱 -Freezing an enemy applies 10% of the enemy's max hp in binding, plus 10 per turn of freeze. -冻结敌人并施加敌人最大生命值 10% 的束缚,每冻结一回合增加 10 点。 -#基础水法术# -Raincloud -雨云 -After 3 turns, rain falls, creating a 3x3 grid of water and dealing DamageDealt acid damage to enemies within. -创造一个持续 3 个回合 3x3 的酸雨团,对敌人造成 DamageDealt 点酸蚀伤害,3 回合后形成 3x3 的积水。 -You create a stormy cloud! -你召唤出暴风雨! +You'll need a sharp object to cut items. Look for a knife or a piece of scrap on the floor. +你需要一个锋利的物体来切割物品。在地板上寻找一把刀或一块废料。 +If you can't get your knife into place, try sitting next to a crack on the wall. +如果你无法将刀放到位,请尝试坐在墙壁裂缝旁边。 +Your character will automatically try to lodge the knife into the wall. +你的角色会自动尝试将刀插入墙壁。 +You'll need to find a cutting weapon with the magic tag to cut magic items. +你需要找到带有魔法标签的切割武器来切割魔法物品。 +You need to equip your magic cutting weapon to cut magic items. +你需要装备魔法切割武器来切割魔法物品。 +You can surrender in the menu if you want to be treated more gently. +如果你希望得到更温和的待遇,你可以在菜单中投降。 -Water Ball -水球 -Fast projectile. Deals DamageDealt acid damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. -发射一个高速水球并造成 DamageDealt 点酸蚀伤害。潮湿的目标承受 +35% 电击/寒冰伤害 -42% 火焰伤害,并造成 50% 的电击伤害。 -You hurl a ball of water! -你掷出一个水球! -Tidal Sphere -潮汐球 -Slow moving projectile, deals DamageDealt acid damage to enemies it passes thru. Leaves a large amount of water in its wake. -发射一个缓慢移动的水团,对其经过的敌人造成 DamageDealt 点酸蚀伤害。在它的身后留下大量的水。 -You raise a huge mass of water! -你掷出大型水团! -#基础岩法术# -Tremor -震颤 -Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. -在 Duration 回合内向目标区域中的敌人施加脆弱和减速,并造成 DamageDealt 点碾压伤害。 -You call forth the rage of the earth. -你唤起了大地之怒。 +That ghost looks less aggressive than the others. Maybe she can help? +那具鬼魂看起来比其他鬼魂不那么咄咄逼人。或许她能帮上忙? +Need help? Try asking a neutral NPC for assistance! +需要帮助?试着向一个中立的NPC求助! -Earthquake -地震术 -Channel for 5 turns to send 2 tremors per turn in target area. -持续 5 回合,每回合在目标区域施放两次“震颤” -You channel the fury of the earth!!! -你引导着大地之怒!!! -Runic Ward -符文盾 -Gives yourself or a creature a magic shield for 50 turns, granting +30 Magic Armor. -对自身或其他个体施加魔法护盾,持续 50 回合,获得 +30 魔法护甲。 -You whisper a word of protection! -你轻声吟唱守护之咒! +You flanked the enemy! Now attack its weak point for massive damage! +你从侧翼进攻了敌人!现在攻击敌人的弱点即可造成巨大的伤害! +Enemies that miss an attack become vulnerable for a turn. +错过攻击的敌人会在一个回合内变得脆弱。 +Attack them for a guaranteed critical hit! +攻击他们以确保造成致命一击! +before the attack lands! You can tell the difference by the border of the tiles. +在攻击到来之前!你可以通过瓷砖的边界来区分。 +Enemy attacks take time to hit. Make sure to step out of the warning tiles, +敌人攻击需要时间才能命中。确保步出警告方块, +You can dodge out of the way of most projectiles. Avoid the marked tiles. +你可以躲开大多数投射物。避开被标记的方块。 +'Charge' is a unified ammunition for all of your weapons. Recharge it with ancient crystals. +“冲锋”是你的所有武器的统一弹药。用古老的晶体给它充能。 +Spent crystals can slot into some light fixtures to recharge them, but it requires 100 gold. +耗尽的水晶可以插入一些灯具中为其充电,但需要100金币。 +There is an elevator in this room, but it won't function until you defeat major enemies on this level. +这个房间里有一个电梯,但直到你在这个级别击败主要敌人,它才会正常工作。 +If you can't escape from a restraint, try offering gold at a shrine devoted to its goddess. +如果无法摆脱束缚,可以尝试向供奉其女神的神社献金。 -Barrier Runes -符文障 -Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns -创造一个 1x1 的可通过的巨石屏障,在 DelayTime 回合内阻挡来自投射物的 BlockAmount 点伤害。 -You raise a field of runes with a command word! -你轻声吟唱屏障之咒,创造出一片巨石屏障! -Iron Blood -铁血 -Channel 4 turns: Halves SP cost of melee attacks by 50%, but increases MP cost of spells by 25%. Ends on sleep or recast. -近战攻击SP消耗 -50%,但法术MP消耗 +25%,睡眠或再次使用时停止。 -Your skin glows a pale red! -你的皮肤发出淡红色的光芒! +Defeating enemies recovers some willpower. +击败敌人可以恢复一些意志力。 +Temporary enemies and summons don't restore anything, however. +然而,临时敌人和召唤并不会恢复任何东西。 +Attacking a helpless enemy captures her and sends her to your Collection. +攻击一个无助的敌人会捕获她并将她送到你的收藏中 +You can access the Collection in the Items screen, 2nd tab. +你可以在物品界面的第二个标签中访问收藏。 -Stone Skin -石肤术 -Make the targeted creature (or yourself) gain +20 armor for Duration turns -使自身或目标生物在 Duration 回合内获得 +20 物理护甲。 -Your skin takes on the appearance of cracked earth! -你的皮肤开始变得如裂开的土地一样! -Rock -岩石 -Channel 1 turn to launch a rock that deals DamageDealt crush damage and slows for 4 turns. Blocks up to 80 damage. -消耗 1 回合发射一块岩石,造成 DamageDealt 点碾压伤害并减速 4 回合,阻挡最多 80 点伤害。 -You raise a stone from the ground and kick it forward! -你用魔法从地上剥离出一块岩石并向前发射! -Boulder -巨石 -Channel 1 turn to launch a huge slow rock that deals DamageDealt crush damage and slows for 8 turns. AoE, collides with summoned rocks. Blocks up to 200 damage. -消耗 1 回合发射一块巨大但缓慢的岩石,造成 DamageDealt 碾压伤害并减速 8 回合。范围攻击会被巨岩抵挡,阻挡最多 200 点伤害。 -You raise a massive boulder from the ground and kick it forward! -你用魔法从地上剥离出一块巨石并向前发射! +Conjure Essence Mote +召唤精华微粒 +Spend 50 DP to conjure a mote of pure spell essence. The mana cost of this spell is decreased based on your maximum DP.|Can only be cast while you have less than 100% DP. +花费 50 性奋值召唤一粒纯净的法术精华。此法术的法力消耗会根据你的最大性奋值而减少。|仅当你的性奋值低于 100% 时才可施放。 +You channel your distraction into a tangible orb! +你将分心集中到有形的球体上! +You don't have enough distraction! +你还不够分心! +Choose an open space. +选择一处开阔的空间。 +Choose a tile with no existing mote. +选择没有微粒的地方。 +You're too distracted to concentrate your distraction! +你太分心了,无法集中注意力! -Earthshape -地形转变 -Unlocks 3 spells that allow creating mounds, rings, or lines of 50hp, 25 armor rocks. -解锁 3 个法术,分别允许创造以方形、环形和直线形的分布的巨石,巨石具有 50HP 和 25 点护甲。 -Earthen monoliths rise from the ground! -巨石拔地而起! -An earthen monolith rises from the ground! -一块巨石拔地而起! -Earthshape (Ring) -地型转变 (环形) -Create a large ring of Earthen Monoliths. They have 50 hitpoints and 25 armor. -创造以环形分布的巨石。巨石具有 50HP 和 25 点护甲。 -You stomp your foot and monoliths emerge in a ring around you! -你跺了跺脚,巨石在你周围拔地而起! -Earthshape (Mound) -地型转变 (方形) -Create a 3x3 field of Earthen Monoliths. They have 50 hitpoints and 25 armor. -创造以 3x3 方形分布的巨石。巨石具有 50HP 和 25 点护甲。 -Earthshape (Line) -地型转变 (直线形) -Create a 4-tile line of Earthen Monoliths. They have 50 hitpoints and 25 armor. -创造以 4 格线形分布的巨石。巨石具有 50HP 和 25 点护甲。 -You stomp your foot and monoliths emerge from the ground! -你跺了跺脚,巨石拔地而起! -Earth Kick -巨石飞射 -Stone Projectile -巨石飞弹 -Kick a summoned rock to turn it into a projectile. Deals DamageDealt crush damage in a 3x3 area and slows for 4 turns. -射出一块召唤出的巨石。 在 3x3 区域内造成 DamageDealt 点碾压伤害并减速 4 回合。 -With a solid kick, you launch one of your monoliths forward! -你射出一块召唤巨石! +The burst of desire overwhelms you! +欲望的爆发将你淹没! -Volcanism -火山爆发 -An area of summoned rocks becomes explosive. Deal fire damage to them to ignite, dealing DamageDealt fire damage to adjacent targets. -引爆一块召唤出的岩石。引燃相邻目标并造成 DamageDealt 火焰伤害。 -You stomp your foot and magma wells up beneath the ground! -你跺了跺脚,岩浆从巨石中喷涌而出! -Strengthen -强化 -When enabled: Struggling is more powerful, and your attack damage is increased by +20 if your weapon deals physical damage. -激活时可快速挣扎 +20 点物理武器伤害。 +Psychic Link +心灵链接 +Deals 20 Psychic damage, then creates a psychic link between you and a single target for 50 turns, splitting distraction gain between the two of you. Requires that you and the target be able to see each other. +施放20点精神伤害,然后在你和一个目标之间建立一个精神链接,持续50回合,伤害分摊给双方。要求你和目标必须能互相看到。 +Target a non-blinded enemy. +瞄准未失明的敌人。 +You briefly lock eyes with the target, forming a psychic link! +你与目标短暂对视,形成了一个心理链接! +The psychic link ends between you and the ENMY. +你与ENMY的精神连接结束了。 -##咒术## -#指令# -CMD: Unlock -指令:解锁 -On yourself: Removes all purple locks. On a creature: Reduces the target's binding by 20 points. -对你自己:移除所有紫色锁。对生物:减少目标束缚20点。 -You speak a command word! -你念出解锁咒语! -None of the locks you are wearing respond to your magic. -你身上的所有锁都没有对你的咒语做出反应。 -You can't help her with this. -你帮不了她 -You must target yourself, an enemy, or a locked object. -你必须以自己、敌人或被锁定的对象为目标。 -CMD: Disenchant -指令:附魔解除 -Target a large area. Permanently slows constructs, reduces attack speed by 50%, and deals 30 shadow damage. Refunds 50% mana at 3 or more targets. Makes magic bindings easier. -在大范围内永久减慢构装体速度,降低 50% 攻击速度,并造成 30 点暗影伤害。 命中 3 个或更多目标时返还 50% 法力值。 使魔法拘束更容易。 -You say a command word, siphoning the magic from nearby constructs! -你念出咒语,开始从附近的构装体中抽取魔力! +Shock Collar +电击项圈 +Condense your aroused thoughts into stimulating electricity, consuming 30 DP to zap anyone that's currently holding your leash for 40 e-stim damage. 25% chance to stun for a long time, otherwise stuns briefly. Subsequent uses cost 2x the DP. +将你的亢奋思绪凝聚成刺激的电流,消耗30 DP对任何当前握着你链条的人发出电击,造成40点电刺激伤害。25%的几率使其长时间眩晕,否则短暂眩晕。后续使用成本为2倍的DP。 +You must be leashed by someone to use this. +你必须被某人牵着才能使用此功能。 +You don't have enough distraction. +你的分心值还不够。 +You zap your leasher! +你挣脱了牵引者! -CMD: Release -指令:解放 -Target bound (but unlocked) targets in a 3x3 area, reducing binding by 100. Removes unlocked restraints on player that are removable. -以 3x3 区域内被束缚(但未解锁)的单位为目标,减少 100 点束缚。移除可移除并已解锁的束缚。 -You say a command word, causing restraints to loosen! -你念出咒语,身上的束缚解除了! -You say a command word, but your restraints remain tight! -你念出咒语,但身上的束缚仍然很紧! -CMD: Lock -指令:锁定 -Magically locks down a target, preventing them from struggling below the current level of binding until freed by an enemy spellcaster (max 100% binding). -神奇地锁定一个目标,防止目标在当前束缚等级下挣扎,直到被敌方法师释放。(最大 100% 束缚) -You say a command word, and magical locks bind your target! -你念出咒语,目标被魔法锁束缚! +You are psychically connected! +你们有心灵感应! +You've used Shock Collar recently and it costs more DP. +你最近使用了电击项圈,它现在将会消耗更多的性奋值。 -CMD: Capture -指令:捕捉 -Commands nearby restraints to bind a target, dealing DamageDealt chain damage, +50 binding. Ropes snare 3 turns/rope, belts +20 binding/belt, chains deal +15 crush dmg/chain. -命令附近的束缚具束缚一个目标,造成 25 点锁链伤害并增加 50 点束缚。每个绳索束缚 3 回合,每个皮带增加 20 点束缚,每个链条增加 30 点碾压伤害。 -CMD: Bind -指令:绑定 -Commands nearby restraints to bind targets standing on them. Rope: 30 chain dmg/5 turn snare. Chain: 30 crush dmg/8 turn disarm. Belts: 50 binding/3 turns vulnerability. -命令附近的束缚具束缚站在其上的目标。每个绳索造成 30 锁链伤害并束缚 5 回合,每个皮带增加 50 点束缚并脆弱 3 回合,每个链条增加 30 点碾压伤害并缴械 8 回合。 -You say a command word, and the bindings on the ground do your bidding! -你念出咒语,地面上的束缚具开始按照你的指令行动! -CMD: Vibrate -指令:震动 -Target a large area. Enemies with plugs or toys are teased for Duration turns, taking charm damage each turn. -对大范围内带有插入具或玩具的敌人玩弄 Duration 回合,每回合造成魅惑伤害。 -You say a command word, causing all toys in the area to vibrate! -你念出咒语,范围内所有玩具开始震动! +Essence Crystal +精华水晶 +When you miscast, 50% chance to emit a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. +当你施法失误时,有50%的概率生成一个尘埃,你可以走过去吸收。它能在短时间内大大减少施法失误的概率。 +A necklace designed for mages who are novices or easily distracted. It helps recover magical essence lost during miscast. +这是一条专为新手或容易分心的法师设计的项链。它有助于恢复在施法失误期间损失的魔法精华。 +When you miscast, the necklace emits a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. +当你施法失误时,项链会生成一个尘埃,你可以走过去吸收。它在短时间内大大减少施法失误的概率。 -CMD: Explosive Finish -指令:激烈释放 -Explosive Finish -激烈释放 -Target a large area. Consumes enemy distraction to deal up to DamageDealt charm damage, twice if at 90% distraction or more. -消耗大范围内敌人的干扰值以造成高达 DamageDealt 的魅惑伤害,如果干扰值处于 90% 或以上则造成双倍伤害。 -You say a command word, resulting in a surge of energy entering your targets! -你念出咒语,一股奇妙能量涌入目标的身体! -Zone of Excitement -敏感区 -Creates an area which adds a conjured vibrating toy to enemies that step inside. Toy lasts 30 turns. -创造一个区域,为进入区域的个体装备魔法震动玩具,持续 30 回合。 -You conjure a realm of absolute fun! -你创造出一个充满趣味的区域! +You erase the seal sigil. +你抹去了封印符文。 +You absorb the mote, granting miscast reduction. +你吸收了光点,获得了施法失误的减少效果。 +Your necklace emits a mote as a result of miscasting. +由于施法失误,你的项链生成一个尘埃。 -#绳索# -Conjure Ropes -召唤绳索 -Animated Rope -移动的绳索 -Launch 3 ropes that deal DamageDealt chain damage each and add 22 rope binding. -发射 3 根绳索,每根绳索造成 DamageDealt 点锁链伤害,并增加 22 点绳索束缚。 -You animate a bunch of ropes! -你让一堆绳子动了起来! -Rope Burst -绳索爆发 -An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 40 points of rope binding. Snares for Duration turns. -使绳索在 3x3 区域内爆发,造成 DamageDealt 点锁链伤害,增加 40 点绳索束缚,并拘束 Duration 回合。 -You call forth ropes from the abyss! -你从深渊中召唤绳索! +Your distraction reaches a critical point! -100% miscast chance. +你的分心达到了临界点!-100%施法失误概率。 +While at 100% distraction, you gain -100% miscast chance, but spending too much mana at once may cause you to go over the edge. +在100%分心时,你获得-100%施法失误概率,但一次性消耗过多的魔力可能会导致你失控。 +-100% miscast chance, but casting spells can send you over the edge. +-100%施法失误概率,但施法可能会让你失控。 +The psychic link conducts away some of the intensity... +心灵链接减轻了一些强度…… +Your linked target lets go of herself, transmitting a wave of pleasure to yourself... +你链接的目标放弃了自我,向你传递了一阵愉悦的波动…… -Rope Snare -绳索陷阱 -An invisible trap on the ground that stuns anyone who walks on it for Duration turns and applies 150 points of binding. -在地面上放置一个隐形陷阱,在 Duration 回合内使任何在其上行走的个体眩晕,并增加 150 点束缚。 -You set an invisible trap! -你设置了一个无形的陷阱! -#橡胶# -Conjure Gag -召唤口球 -Conjured Gag -魔法口球 -Summons a gag which deals DamageDealt chain damage and silences for 15 turns. +40 binding if target is not silenced. -召唤一个造成 DamageDealt 点锁链伤害并沉默 15 回合的口球。对沉默个体增加 40 点束缚。 -You conjure a gag! -你召唤出口球! -The gag will appear next to you and fly toward the target point. -口球出现在你旁边并飞向目标点。 -The gag forces itself into your mouth and buckles tightly! -口球自动进入你的嘴巴并紧紧扣住! -The gag hits you! (DamageDealt) -口球击中了你!(造成 DamageDealt 点伤害) +### FCTN RMTPE -Conjure Blindfold -召唤眼罩 -Conjured Blindfold -魔法眼罩 -Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not silenced. -召唤一个造成 DamageDealt 点锁链伤害并致盲 20 回合的眼罩。对沉默个体增加 +40 束缚。 -You conjure a blindfold! -你召唤出眼罩! -The blindfold will appear next to you and fly toward the target point. -眼罩出现在你身边并飞向目标点。 -The blindfold wraps around your head and buckles tightly! -眼罩缠绕在你的头上并扣紧! -The blindfold hits you! (DamageDealt) -眼罩击中了你!(造成 DamageDealt 点伤害) +### PTRN's RMTPE -Conjure Leather Cuffs -召唤皮革铐 -Conjured Leather Cuffs -魔法皮革铐 -Summons a pair of cuffs which deals DamageDealt chain damage and adds 40 binding. Until the target struggles free, attacking the target disarms them for 3 turns. -召唤一个造成 DamageDealt 点锁链伤害并增加 40 点束缚的皮革铐。在目标挣脱之前,攻击目标会使他们缴械 3 回合。 -You conjure leather cuffs! -你召唤出皮革铐! -The cuffs will appear next to you and fly toward the target point. -皮革铐出现在你身边并飞向目标点。 -The leather cuffs clasp your wrists and pull them tightly! -皮革铐紧紧扣住了你的手腕! -The leather cuffs hit you! (DamageDealt) -皮革铐击中了你!(造成 DamageDealt 点伤害) +### Leads to PLCE -Conjure Armbinder -召唤束手套 -Conjured Armbinder -魔法束手套 -Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Blinded/Silenced targets are silenced/blinded for the same time. -召唤一个造成 DamageDealt 点锁链伤害并缴械 13 回合的束手套。被沉默/致盲的目标会被同时附加沉默/致盲。 -You conjure a armbinder! -你召唤出束手套! -The armbinder will appear next to you and fly toward the target point. -束手套出现在你旁边并飞向目标点。 -The armbinder slips itself around your arms and buckles itself tightly! -束手套紧紧包住了你的手臂! -The armbinder hits you! (DamageDealt) -束手套击中了你!(造成 DamageDealt 点伤害) +(You find a girl clad in a pink catsuit and restrained with straps.)|(She wears a backpack with a note attached to it.)|'My pet here can pick up and deliver restraints for you~'|'Try opening the Facilities tab and depositing restraints!'|'Signed: Your Loyal Warden' +(你发现一个穿着粉色连体衣并被绑带束缚的女孩。)|(她背着一个附有便条的背包。)'我这里的宠物可以为你拿取和递送束缚器~'|'试着打开设施标签并存入束缚器!'|'签名:你忠实的监护人' -Conjure Straitjacket -召唤拘束衣 -Conjured Straitjacket -魔法拘束衣 -Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. -召唤一件造成 DamageDealt 点束缚的拘束衣,并降低挣扎速度 14 回合。 -You conjure a straitjacket! -你召唤了出拘束衣! -The straitjacket will appear next to you and fly toward the target point. -拘束衣出现在你身边并飞向目标点。 -The straitjacket slips itself around your body and pulls your arms into its sleeves! -拘束衣紧紧包住了你的身体,把你的手臂拉入了袖口! -The straitjacket hits you! (DamageDealt) -拘束衣击中了你!(造成 DamageDealt 点伤害) -Conjure Legbinder -召唤束腿套 -Conjured Legbinder -魔法束腿套 -Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. -召唤一个造成 DamageDealt 点锁链伤害的束腿套,并拘束 10 回合。对未拘束个体增加 50 点束缚。 -You conjure a legbinder! -你召唤出束腿套! -The legbinder will appear next to you and fly toward the target point. -束腿套出现在你旁边并飞向目标点。 -The legbinder slips itself around your legs and buckles itself tightly! -束腿套紧紧包住了你的腿! -The legbinder hits you! (DamageDealt) -束腿套击中了你!(造成 DamageDealt 点伤害) +It becomes hard to resist the dragon's fury... +抵抗龙的愤怒变得困难…… +The dragon overwhelms you with sheer force... +龙以强大的力量压倒了你…… +Your strength begins to fade... +你的力量开始减弱…… + -Conjure Harness -召唤束衣 -Conjured Harness -魔法束衣 -Summons a harness which deals DamageDealt crush damage. Adds +50 binding per 25% binding level on target, up to +200. -召唤一个造成 DamageDealt 碾压伤害的束衣。目标每增加 25% 束缚级就增加 50 点束缚,最多增加 200 点。 -You conjure a harness! -你召唤了束衣! -The harness will appear next to you and fly toward the target point. -束衣将出现在你旁边并飞向目标点。 -The harness slips itself around your torso and squeezes tightly as each buckle secures itself one by one! -束衣围在你身体周围并收紧,紧接着带扣一个个地被固定住! -The harness hits you! (DamageDealt) -束衣击中了你!(造成 DamageDealt 点伤害) +>Entrance +>入口 +>Exit +>出口 +>Stairs +>楼梯 +Quest(GDSNM) +任务(GDSNM) +### [GDSNM] -Conjure Petsuit -召唤宠物服 -Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana regen. -对无助的敌人释放。将它们变成跟随你的宠物并增加你的被动法力回复。 -You conjure an enchanted petsuit which wraps around your target, forcing her to follow you! -你召唤出的魔法宠物服,紧紧包住了你瞄准的目标,使她不得不跟着你! -You watch in horror as your own creation lunges toward you, binding your hands and feet! -你惊恐地看着你自己的造物冲向了你,束缚了你的手脚! -Leather Package -皮革包裹 -After conjuring a leather restraint, you can conjure up to three more without advancing time. -在召唤出皮革拘束具后,可在同一回合内继续召唤 3 个拘束具。 -#金属# -Chastity -贞操 -Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs and distracts constantly. -对无助的敌人释放,增加 DamageDealt 点束缚,并装备贞操带以阻止目标移除插入的物体和干扰值变化。 -You conjure a chastity belt, which latches onto your target! -你召唤出贞操带,它将佩戴在你的目标身上! -Your own spell locks you in chastity! -你念出的咒语将你自己锁在贞操带中! -Something fun enters your body... -一些有趣的东西进入了你的身体...... +Bed! +床! +### Silver -Zone of Purity -纯洁区 -Creates an area which applies Chastity constantly to any enemy over 50% bondage that steps inside. -创造一个区域,为进入区域且束缚超过 50% 的个体装备贞操带。 -You conjure a realm of absolute purity. -召唤出一个绝对纯洁的区域。 +Mecha +机械人 +chest +箱子 +Lost Items +遗失物品 +Cache +缓存 +Toy Chest +玩具箱 +### (L) -Conjure Chain -召唤锁链 -Magic Chain -魔链 -Witch's Chain -女巫之链 -Throws a chain that does DamageDealt chain damage. Targets with 50% or more binding take 50 crush damage and are slowed for 4 turns. -投掷一条造成 DamageDealt 点锁链伤害的链条。对束缚值 50% 及以上的目标造成 50 点碾压伤害并减速 4 回合。 -You a hurl a strand of chain! -你投掷出一条锁链! -Steel Rain -钢之雨 -Steel Torrent -钢铁洪流 -Fires a steel plug that deals DamageDealt piercing damage. Bound targets are Plugged, which increases Distraction over time. -发射一个造成 DamageDealt 点穿刺伤害的钢制插入物。被束缚的目标会被插入,随着时间的推移会增加干扰值。 -You a hurl a strand of chain! -你扔出了一根锁链! -The plug hits you! (DamageDealt) -插入物击中了你!(造成 DamageDealt 点伤害) -The plug directs itself between your legs! -插入物直接插进了你的两腿之间! -Fire 4 Steel Rain in quick succession toward the target point. Best in open spaces. -向目标点快速连续发射 4 片“钢之雨”,最好在空旷的地方施放。 -You raise your hand and a steel projectile appears! -你举起手,一枚钢弹出现了! -You raise your hand and several steel projectiles appear! -你举起手,数枚钢弹出现! -Conjure Display Stand -召唤展示架 -Target only Helpless enemies. Creates a fixture that increases passive mana regen, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. -对无助的敌人释放。创造一个增加被动法力恢复的装置,回复 50 点电荷,并使附近的敌人受到额外 50% 的魅惑/精神伤害。 -You conjure a fixture to hold your helpless target in place! -你召唤出一个装置来束缚无助的目标! -You watch in horror as your own creation surrounds you, locking you in place with a hefty click! -你惊恐地看着你自己的创造物束缚着你,用沉重的锁将你固定在了原地! +(The SPEAKER sits encased in skintight rubber up to her nose.|Though the latex over her mouth is smooth and flat,|you know from her whimpering moans that her mouth|is totally filled with a gag, useless like the rest of her body.|Some sort of stand affixes her to the floor.) +(SPEAKER 坐在紧身橡胶中,直到鼻子。|虽然她嘴上的乳胶光滑平坦,|但你从她微微的哀鸣中知道,她的嘴|完全被一个塞子填满,就像她身体的其他部分一样无用。|某种支架将她固定在地板上。) +(You don't have any solvents that work on latex) +(你没有任何可以在乳胶上起作用的溶剂) +(You dissolve her restraints, fumbling around for a while with your bound hands) +(你溶解了她的约束,手被绑住的你摸索了一会儿) +(You rescue the SPEAKER)|Thank you!|Let's get out of here! +(你救了 SPEAKER )|谢谢你!|我们快走吧! +(You rescue the SPEAKER)|Mmmmph!|(She wants to keep her gag...) +(你救了 SPEAKER )|嗯嗯!|(她想保持她的口塞...) +(You are not holding a cutting tool) +(你没有拿剪切工具) +(You cut her restraints, fumbling around for a while with your bound hands) +(手被绑住的你摸索了一会儿才切断了她的约束) +(You don't have enough mana for Remove Slime) +(你没有足够的法力来施展去除史莱姆) +(You utter a word of release to free the SPEAKER)|Many thanks!|Let's go! +(你说出解锁的咒语,释放了 SPEAKER )|非常感谢!|我们走吧! +(You utter a word of release to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) +(你说出解锁的咒语,释放了 SPEAKER)|嗯嗯!|(她又重新锁上了她的口塞...) -Conjure Cuffs -召唤手铐 -Conjured Cuffs -魔法手铐 -Summons a pair of cuffs which deals DamageDealt chain damage and disarms for 5 turns. +40 binding if target is not disarmed. -召唤一对造成 DamageDealt 点锁链伤害并缴械 5 回合的手铐,对目标未缴械增加 40 点束缚。 -You conjure a pair of cuffs! -你召唤了一对手铐! -The cuffs will appear next to you and fly toward the target point. -手铐出现在你身边并飞向目标点。 -The cuffs pull your wrists together and click tightly! -手铐将你的手腕拉在一起并紧紧地锁住! -The cuffs hit you! (DamageDealt) -手铐击中了你!(造成 DamageDealt 点伤害) -Frustration -懊恼 -When enabled, enemies in chastity become angry Frustrated Pets when becoming helpless. -启用后,处在贞操带中的敌人变得无助时会成为愤怒沮丧的宠物。 +Dissolve the latex with a SLVNT +用 SLVNT 溶解乳胶 +Cut her out with a sharp tool +用锐利的工具切她出来 +Use Remove Slime to unlock her +使用去除史莱姆来解锁她 -#乳胶# -Remove Slime -移除粘液 -Remove Slime and Encasement from target creatures in an area. Also removes slime from self. -移除区域内目标身上的粘液包裹物。 同时去除自身的粘液。 -You issue a command to the slime! -你向粘液发出指令! -You whisper a command word, but the slime is already hardened and won't budge... -你低声说出指令,但粘液已经变硬了,纹丝不动... -Spread -增殖 -Slime in the target area expands by 1 unit in the four cardinal directions. Refreshes duration to 12-20 turns. -目标区域中的粘液会在四个主要方向上扩展 1 个单位。粘液持续 12-20 回合。 -The slime spreads! -粘液蔓延开来! +Local Saves +本地存档 +Cloud Saves +云存档 -Awaken -唤醒 -Activates the slime in an area, causing it to deal DamageDealt glue damage. Encases fully bound targets. -激活目标区域的粘液,使其对站在粘液上方的个体造成 DamageDealt 点胶水伤害并包裹完全束缚的目标。 -The slime awakens and turns on you!!! -粘液被激活并开始攻击你!!! -You command the slime to draw in targets! -你命令粘液包裹目标! -Animate Slime -史莱姆 -Summons up to 3 slimes on slime tiles in an AoE. The slimes are friendly to you. -在目标区域的粘液上召唤最多 3 个友好史莱姆。 -Animate Large Slime -大型史莱姆 -Target an area with at least 3 slime tiles. Summons a large slime that is friendly to you. -在目标区域的粘液上召唤 1 个大型友好史莱姆(至少 3 格粘液瓷砖)。 +solvent +溶剂 -Latex Puppet -乳胶娃娃 -Target an area containing helpless encased enemies. Transforms up to 3 of them into latex dolls that serve you for a while. -瞄准包含无助的敌人的区域,将最多 3 个无助的敌人变成乳胶娃娃,使其为你服务一段时间。 -You concentrate magical energy into your victim's bindings, forcing them to move... -你将魔法能量注入到受害者的束缚中,迫使他们移动...... -Coalesce -聚合 -Gathers slime and slimed enemies into a central point. Deals DamageDealt glue damage per square of slime and Encases slimed enemies. Costs half mana if there is only slime. -将粘液和粘液包裹的敌人聚集到一个中心点。 每块粘液造成 DamageDealt 点胶水伤害并包裹粘液中的敌人。如果目标只有粘液则只消耗一半法力值。 -You command the slime to draw enemies in! -你命令粘液包裹敌人! +Latex Doll Stand +乳胶玩偶支架 +A stand for your latex dolls, coated in a smooth rubber coating. +一个为你的乳胶玩偶提供的支架,涂有光滑的橡胶涂层。 +Has a flange for propping up even dolls wearing chastity belts. +有一个法兰,用于支撑穿着贞操带的玩偶。 -Elastic Grip -弹性控制 -A latex hand reaches out and pulls an enemy close to you! Base pull strength: 4 -伸出一只乳胶手,把敌人拉到你身边!基础拉力:4 -You extend a rubbery hand and grab a foe! -你伸出一只乳胶手抓住了一个敌人! -There's an obstacle in the way! -路上有障碍! -Slime Splash -粘液飞溅 -After one turn, deals DamageDealt glue damage in a small area and spreads slime. -在一回合后在小范围内召唤一滩造成 DamageDealt 点胶水伤害的粘液。 -You conjure a small amount of slime! -你召唤了少量的粘液! -Slime Blast -粘液爆炸 -A pool of slime deals DamageDealt glue damage to enemies on impact and covers the area in temporary slime. -召唤一滩在撞击时造成 DamageDealt 点胶水伤害的粘液,并用粘液覆盖该区域。 -You conjure a pool of slime! -你召唤了一滩粘液! -Slime Eruption -粘液喷发 -A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them friefly. -使巨大粘液喷发,对敌人造成 DamageDealt 点胶水伤害,并轻松将其束缚。 -You conjure an explosion of slime! -你令粘液喷发! +(The SPEAKER strokes a hand over your body)|It looks like you're carrying some dangerous goods.|Prisoners shouldn't be carrying what doesn't belong to them~ +(SPEAKER 用手抚摸着你的身体)|看起来你携带了一些危险品。|囚犯不应该携带不属于他们的东西~ +(The SPEAKER folds her hands together)|Miss, I was instructed to make sure you don't have|anything dangerous. I'm going to search you now. +(SPEAKER 双手合并)|小姐,我接到指示,确保你没有|任何危险的东西。我要开始搜查你了。 +(The SPEAKER looks at you plainly)|Did you think you were going to sneak in with all of that? +(SPEAKER 平静地看着你)|你以为你能带着那些东西悄悄溜进来吗? +### (The SPEAKER smiles)|Let's see, what loot do we have here...|(SPEAKER is going to search you) -Wall of Slime -粘液墙 -Unlocks horizontal and vertical slime walls that traps enemies who try to pass through. -解锁水平和垂直粘液墙,困住试图穿过的敌人。 -Wall of Slime (Vert) -粘液墙(垂直) -Creates a vertical wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. -创造一堵垂直的粘液墙,持续 20 回合。 穿过的敌人会卡在墙上并变得黏糊糊的。 -Wall of Slime (Horiz) -粘液墙(水平) -Creates a horizontal wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. -创造一面水平的粘液墙,持续 20 回合。 穿过的敌人会卡在墙上并变得黏糊糊的。 -You tap your foot and a wall of slime slowly raises out of the ground. -你轻踮脚尖,一堵粘液墙慢慢地从地上升起。 -Wall of Latex -乳胶墙 -Unlocks horizontal and vertical latex walls that encase enemies that walk through. -解锁水平和垂直乳胶墙,包裹试图穿过的敌人。 -Wall of Latex (Vert) -乳胶墙(垂直) -Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased, take DamageDealt glue damage if not encased, and blinded. -创造一面垂直的乳胶墙,持续 20 回合。 穿过的敌人将被包裹,如果没有被包裹,则造成 DamageDealt 点胶水伤害。 -Wall of Latex (Horiz) -乳胶墙(水平) -Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased, take DamageDealt glue damage if not encased, and blinded. -创造一面水平的乳胶墙,持续 20 回合。 穿过的敌人将被包裹,如果没有被包裹,则造成 DamageDealt 点胶水伤害。 -You tap your foot and a wall of latex stretches out across the corridor. -你轻踮脚尖,一堵乳胶墙慢慢地从地上升起。 -Choose vertical wall origin (5 tiles high) -选择垂直墙原点(5 格高) -Choose horizontal wall origin (5 tiles wide) -选择水平墙原点(5 格宽) +(The SPEAKER scans you with a red light)|Enumerating contraband...|Please comply for removal. +(SPEAKER 用红光扫描你)|正在列举违禁品...|请配合以便移除。 +Yes, miss... (Begin search and confiscation) +是的,小姐...(开始搜索和没收) +Mmph... (Nod politely) (Begin search and confiscation) +嗯...(礼貌地点头)(开始搜索和没收) +No, I refuse! (Fight) +不,我拒绝!(反抗) +Mmph! (Shake your head and fight) +嗯!(摇头反抗) -Solidify -固化 -Solidifies slime in the area into Latex. Latex adheres to enemies and slowly binds them, escasing them when they are fully bound. -将区域内的粘液凝固成乳胶。 乳胶会粘附在敌人身上并慢慢地束缚他们,当他们完全被束缚时彻底转化。 -You inscribe a transmutation circle on the floor. -你在地板上释放了转化魔法。 -One With Slime -粘液一体 -While standing on slime/latex, you can cast rubber spells without components. -当你站在黏液/乳胶上时,你可以在施法部位被限制时释放橡胶法术。 -Slime Repulsion -粘液排斥 -Gain +50 glue resist. -增加 50 点胶水抗性。 -Convincing Disguise -令人信服的伪装 -While completely covered in slime and not moving, your visibility is reduced considerably. -当完全被粘液覆盖时你的能见度将大大降低。 -Engulf -吞噬 -When enabled: Your melee attacks deal +20 glue damage and create slime. -启用时:你的近战攻击额外造成 20 点胶水伤害并制造粘液。 - -#物理# -Blink -闪现 -Instantly teleport to a location you can see. -立即传送到你可以看到的位置。 -You teleport! -传送! +Option not available at 0 WP +当前WP为0,此选项不可用 -Portal -传送门 -Teleport to a nearby location (including into darkness) with twice the range. -立刻传送到你附近的位置(包括黑暗),范围是“闪现”的两倍。 -You call upon a misty portal to transport you! -你召唤传送门来传送你! -Wall -墙 -Create a stationary wall for Duration turns. It takes 20% damage from spells. -放置一堵持续 Duration 回合的墙,它受到 20% 的法术伤害。 -A wall starts to form! -一堵墙开始形成! -You create a line on the ground. -您在地面上创建一堵墙。 +(The SPEAKER starts by removing most of your clothes...) +(SPEAKER 首先脱掉了你大部分的衣服...) +(Next, the SPEAKER looks through your weapons) +(接下来,SPEAKER 查看了你的武器) +(Finally, the SPEAKER opens the rest of your bag) +(最后,SPEAKER 打开了你包里的其他东西) +(The search is complete)|There! Now let's get you situated~ +(搜索完成)|好了!现在让我们让你就位吧~ +(The search is complete)|Alright miss, please behave, okay? +(搜索完成)|好的,小姐,请乖乖的,好吗? -Floating Weapon -漂浮武器 -When enabled: While hands are bound, you can still use weapons, but attacks cost mana. -启用后:当双手被束缚时,你仍然可以使用武器,但攻击需要消耗法力。 -#召唤# -Healing Light -治愈之光 -Channel to heal 15 hitpoints per turn to summoned allies within a 5x5 area. -为 5x5 区域内的召唤盟友回复 15HP(不包括你自己) -You conjure a healing light! -你召唤出治愈之光! -Heal -治愈 -Restore 45 hitpoints to an allied creature. -为一个友方生物恢复 45 点生命值(不包括你自己)。 -Select which creature to heal -选择要治疗的生物 -You utter a word of healing. -你咏唱治愈的咒语。 -Bomb -炸弹 -Channel for 1 turn for a bomb that does DamageDealt fire damage in an area after DelayTime turns. -消耗1回合,放置一个 DelayTime 回合后在一个区域内造成 DamageDealt 点火焰伤害的炸弹。 -Fire in the hole! -小心炸弹! +Confiscated AMNTx ITMN! +没收的AMNTx ITMN! +Kept AMNTx ITMN. +保存的AMNTx ITMN. +Sneaked in AMNTx ITMN! +偷偷带入AMNTx ITMN! -Summon Fire Mote -召唤火晶尘 -Create an orb of fire that follows you and attacks using firebolt. -创造一个跟随着你并用火焰箭进行攻击的火晶尘。 -Select where to put the fire mote (cannot place on occupied squares) -选择放置火晶尘的位置(不能放置在被占用的方块上) -You call upon the plane of Fire! -你向火之位面呼唤! -A flaming spirit answers your call! -一个燃烧的灵魂响应你的呼唤! -Summon Earth Mote -召唤岩晶尘 -Create an animated stone that attacks using a strong but slow crush attack. -创造一个跟随着你并用自身造成强大但缓慢的碾压攻击的岩晶尘。 -Select where to put the earth mote (cannot place on occupied squares) -选择放置岩晶尘的位置(不能放置在被占用的方块上) -You call upon the plane of Earth! -你向岩之位面呼唤! -A rocky spirit rushes forth from the ground! -一个岩之精灵破土而出! +GUN +枪 +The room echoes with the sound of a rubber bullet being fired! +房间回响着橡胶子弹被发射的声音! -Summon Air Mote -召唤风晶尘 -Create a dusty mote that attacks using gusts of wind. -创造一个跟随着你并用阵风攻击的风晶尘。 -Select where to put the air mote (cannot place on occupied squares) -选择放置风晶尘的位置(不能放置在被占用的方块上) -You call upon the plane of Air! -你向风之位面呼唤! -A dust devil arises in front of you! -一个风晶尘在你的面前形成! -Summon Water Mote -召唤水晶尘 -Create a watery serpent which stuns enemies with its melee attack. -创造一个跟随着你并可击晕敌人的水晶尘。 -Select where to put the water mote (cannot place on occupied squares) -选择放置水晶尘的位置(不能放置在被占用的方块上) -You call upon the plane of Water! -你向水之位面呼唤! -A watery spirit bubbles up from the ground! -水之精灵从地面涌现! +Tactical Rubber Bullet +战术橡胶子弹 +A powerful rubber bullet bounces you to the ground! +一颗强力橡胶子弹将你击倒在地! +The powerful rubber bullet knocks you down and congeals into Capture Foam! +这颗强力橡胶子弹将你击倒并凝结成捕获泡沫! -Summon Familiar -召唤魔宠 -Create a familiar that fights by your side for the rest of the level -创造一个你并肩作战的魔宠。 -Select where to put the familiar (cannot place on occupied squares) -选择放置魔宠的位置(不能放置在被占用的方块上) -A familiar appears! -魔宠出现了! -You create a circle on the ground with your foot! -你用脚在地上画了一个圈! -Summon Golem -召唤傀儡 -Create a slow but powerful golem to fight by your side -创造一个与你并肩作战的缓慢但又强大的傀儡。 -Select where to put the golem (cannot place on occupied squares) -选择放置傀儡的位置(不能放置在被占用的方块上) -A golem arises! -傀儡出现了! -You stomp your foot and draw the words of life on the floor! -你用脚在地板上绘出生命之咒! -Summon Storm Crystal -召唤风暴水晶 -Create a stationary crystal that casts Crackle on nearby targets for Duration turns. Can be healed to extend duration. -创造一个静止的水晶,在 Duration 回合内对附近的目标施放暴雷。可以通过治愈以延长持续时间。 -Select where to put the storm crystal (cannot place on occupied squares) -选择放置风暴水晶的位置(不能放置在被占用的方块上) -A crackling crystal emerges from the ground! -一块劈里啪啦作响的水晶从地下钻了出来! -You stomp and the ground shakes! -你用脚绘出咒文,地面开始震动! -Tickle Cloud -挠痒云 -For 10 turns, disembodied hands tickle a target location for DamageDealt tickle damage. -在 10 回合内,看不见的手对目标位置造成 DamageDealt 挠痒伤害。 -A swarm of hands holding feathers appears! -一群拿着羽毛的看不见的手出现了! -Feather Burst -羽毛破裂 -After a brief delay, a small cloud of feathers tickles enemies for DamageDealt damage and +60 distraction for 3 turns. -短暂延迟后,一小团羽毛将使敌人发痒,给敌人造成 DamageDealt 点挠痒伤害和增加 60 点干扰值。 +Capture Foam (Feet) +捕获泡沫(脚) +A sticky foam that spreads quickly and hardens into a tight rubbery layer. +一种粘性的泡沫迅速扩散并硬化成紧密的橡胶层。 +A knife won't cut it, it simply reforms around the cut. +一刀切不进去,只是在伤口周围重新形成。 +Capture Foam (Ankles) +捕获泡沫(脚踝) +Capture Foam (Legs) +捕获泡沫(腿) +Capture Foam (Arms) +捕获泡沫(手臂) +Capture Foam (Hands) +捕获泡沫(手) +Capture Foam (Mouth) +捕获泡沫(嘴) +Capture Foam (Head) +捕获泡沫(头) +Capture Foam Dispenser +捕获泡沫分配器 +This collar is designed to make sure its wearer does not escape at all costs. +这个项圈的设计目的是保证佩戴者在任何情况下都无法逃脱。 +It will occasionally cause Capture Foam to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of Capture Foam you have on you. +它会偶尔无缘无故地产生泡沫捕捉并束缚佩戴者。效果根据你身上的泡沫捕捉量而增加。 + + +Tactical Rubber +战术橡胶 +An alchemical substance made to be stretchy and more resilient than natural rubber. +一种经过炼金术处理的物质,具有可伸展性和比天然橡胶更强的韧性。 +Developed by kinky alchemists and marketed to PMCs across the islands. +由好色的炼金术士开发,并在各个岛屿的私人军事公司中销售。 + + +Capture Foam +捕获泡沫 +A restraining weapon used to apprehend difficult targets. +一种用于抓捕难以对付目标的约束武器。 + + +Tactical Rubber (Feet) +战术橡胶(脚) +The end result of capture foam. Strict. Sustainable. Affordable. +捕获泡沫的最终结果。严格。可持续。经济实惠。 +Tactical Rubber (Ankles) +战术橡胶(脚踝) +Tactical Rubber (Legs) +战术橡胶(腿) +Tactical Rubber (Arms) +战术橡胶(手臂) +Tactical Rubber (Hands) +战术橡胶(手) +Tactical Rubber (Mouth) +战术橡胶(嘴) +Tactical Rubber (Head) +战术橡胶(头) +Tactical Rubber Collar +战术橡胶项圈 +It will occasionally cause tactical rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. +偶尔会突然出现战术橡胶并束缚穿戴者。效果根据你身上的橡胶量而增加。 -##幻术## -#光之祝福# -Lesser Flash -小闪光 -A flash of light which renders anyone caught within blind for Duration turns -一道闪光,使受到影响的所有人在 Duration 回合内陷入失明 -Greater Flash -大闪光 -A massive flash of light which renders anyone caught within blind for Duration turns -一道巨大的闪光,使受到影响的所有人在 Duration 回合内陷入失明 -Focused Flash -聚焦闪光 -A focused flash of light which renders anyone caught within blind for Duration turns -一道聚焦的闪光,使受到影响的所有人在 Duration 回合内陷入失明 -Select where to center the flash (SpellArea radius) -选择闪光的中心位置(SpellArea 半径) -You charge up a bright flash! -你发出一道闪光! -You slowly charge up a powerful flash! -你缓慢地释放出一道强力的闪光! -Ring -光环 -A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged. -会在 Duration 回合内眩晕并吸引敌人。远距离释放。 -You point and a noise emanates from the location! -你手指一挥,一阵噪音从该位置发出! -Select where to center the noise (SpellArea radius) -选择噪声的中心位置(SpellArea 半径) +Sweeping Strike +横扫攻击 +Headlong Rush +全力冲锋 -Light -光芒 -Produce a bright light for Duration turns. Has no effect in dark rooms. -产生持续 Duration 回合的亮光,在黑暗房间内没有效果。 -Corona -电晕 -A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt fire damage to the first target hit. -引导一束光束 2 回合(让你短暂眩晕),然后立即对击中的第一个目标造成 DamageDealt 点火焰伤害。 -You charge a powerful beam attack!!! -你蓄力释放强大的光束攻击!!! +Maid Squire +女仆侍卫 +Maid Knight +女仆骑士 +You humiliate the Maid Squire! +你羞辱了女仆侍卫! +You defeat the Maid Knight! For now... she swears revenge. +你暂时击败了女仆骑士!她发誓要报仇。 +The Squire zips you up in comfy leather gear! +侍卫把你装进舒适的皮革装备里! +The Maid Knight places you in strict bondage! +女仆骑士把你放入严格的束缚中! +The Squire secures your restraints! +侍卫固定你的束缚装置! +The Maid Knight secures your restraints! +女仆骑士固定你的束缚装置! +The Squire dusts you with her duster plug. +侍卫用她的除尘塞给你除尘。 +The Maid Knight sweeps you with her cleaning halberd! +女仆骑士用她的清洁长矛扫你! -#暗之祝福# -Summon Shadow Warrior -召唤影子武士 -Select where to put the shadow warrior (cannot place on occupied squares) -选择放置影子武士的位置(不能放置在已被占用的方格上) -Call forth a shadow warrior for 16 turns who deals DamageDealt damage every other turn. -召唤一名持续 16 回合的暗影武士,每隔一回合造成 DamageDealt 点伤害。 -...and the abyss answers! -……深渊的答案! -You call... -你召唤了... +The EnemyName retreats! +EnemyName 撤退了! +The EnemyName manages to squirm out of sight! +EnemyName 设法逃出了视线! -Shroud -影雾 -Creates a cloud for Duration turns that buffs evasion for all creatures. You are temporarily invisible for 8 turns after leaving. -在 Duration 回合内创造一片雾,增强所有生物的闪避。离开后你会暂时隐身 8 回合。 -Select where to center the shroud (SpellArea radius) -选择影雾的中心位置(SpellArea 半径) -You exhale a misty shroud -你呼出一层朦胧的雾 -Darkblade -暗影之刃 -Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks -使目标生物在 Duration 回合内或下 5 次攻击中伤害增加 20。 -You call forth dark runes on your weapon and arms! -你在你的武器和手臂上召唤出黑暗符文! +servers humming... +服务器嗡嗡作响... +bouncy noises +有弹性的声音 +goopy noises +黏糊糊的声音 +bubbling noise +冒泡声 +rubber squeaking +橡胶 squeaking声 +blaring siren +刺耳的警报声 -Shadow Slash -暗影斩 -Shadow Scythe -暗影镰刀 -Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. -切开你面前的区域,在一个区域内造成延迟的 DamageDealt 伤害并短暂减速。 -You create a tear in space with your finger! -你用你的手指撕裂了前方的空间! -Shadow Dagger -暗影匕首 -A cold shadowy blade that deals DamageDealt damage and pierces all in its path. -一把冰冷的暗影之刃,对路径上所有格子造成DamageDealt贯穿伤害。 -You a hurl a shadowy dagger! -你投出一把暗影匕首! +You claim the Sweeper. +你获得了扫帚。 +The Sweeper +扫帚 +Foe of the unclean. Bringer of neat and tidy workspaces. +不洁之物的敌人。带来整洁工作空间的使者。 +Deals slash damage. Also deals 30 tickle damage in an area. Has a ranged attack. +造成斩击伤害。同时在一个区域内造成30点搔痒伤害。拥有远程攻击。 +Make a ranged attack with the Sweeper. +用扫帚进行远程攻击。 -#影之祝福# -Invisibility -隐形 -Make the targeted creature invisible -使目标生物隐形。 -You snap your fingers! -你打了一个响指! -Lesser Invisibility -次级隐形 -You become semitransparent! -你变得半透明! -Afterimage -残像 -Massively increases a creature's evasion for 5 attacks. Expires after 25 turns. -大幅增加个体下 5 次被攻击时的闪避。 25回合后失效。 -Your movements intensify! -你的动作加快了! +You claim the Persuader. +你获得了劝说者。 +The Persuader +劝说者 +Military forces sought a solution with higher stopping power after the Great Work made brute force obsolete. Capture Foam rounds are now the standard. +军队寻求一种更强制止能力的解决方案,因为伟大的工作使粗暴的力量变得过时。捕获泡沫子弹现在是标准配置。 +Equipped with a duster plug, it deals tickle damage on melee. Can fire a high caliber rubber bullet to deal 80 glue damage from a distance. Takes 3 turns to reload. +配有除尘塞,它在近战中造成搔痒伤害。可以发射高口径橡胶子弹,从远处造成80点粘合剂伤害。需要3个回合重新装载。 +Make a ranged attack with the Persuader for 25 charge. Deals 80 glue damage. +用劝说者进行一次25点充能的远程攻击。造成80点粘合剂伤害。 -Camouflage -拟态 -Enemies have a harder time noticing you for Duration turns. Cancels if you move, cast, or sleep. -在持续时间回合中,敌人很难注意到你。但如果你移动、施法或睡眠,则会失效。 -You pose in a clandestine manner. -你摆出了一个隐秘的姿势。 -#投影幻术# -Summon Decoy -召唤诱饵 -Select where to create an illusion (cannot place on occupied squares) -选择创建幻象的位置(不能放置在已被占用的方格上) -Create a decoy for Duration turns. It attracts enemy attention and triggers traps. -创造一个持续 Duration 回合的诱饵。它会吸引敌人的注意力并触发陷阱。 -A shadow of yourself materializes! -自己的影子出现了! -You create a line on the ground and toss in a lock of your hair! -你在地上画了一条线,然后扔进你的一绺头发! +Persuader Round +劝说者子弹 +You fire the Persuader! +你发射了劝说者! -#秘密知识# -Magical Sight -魔之眼 -Highlight the location of interesting magical phenomena for 20 turns -突出有趣的魔法现象,持续 20 回合。 -You analyze the target! -你分析了目标! -Choose object to analyze -选择要分析的对象 -Truesight -真实视野 -When enabled: Drain mana every turn to see through walls and increase accuracy by 40%. -启用时:每回合消耗法力以透视墙壁并将准确度提高 40%。 -Heartsense -心灵感应 -Highlight the locations of enemies through walls on the map for 4 turns. -在地图上通过墙壁突出显示敌人的位置 4 回合。 +### Wait for current save to finish... +### Please wait for save to finish... -##升级## -Iron Will -钢铁意志 -While you have 100 willpower or more, regain an additional 4 stamina per turn. -当你具有 100 点或更多意志力时,每回合将额外恢复 4 点体力。 -Athlete -体育健将 -Sprinting costs 40% less stamina. -疾跑消耗的耐力减少 40%。 -Sneaky -影于暗处 -You are harder to see when waiting. -你在等待时很难被发现。 -Dodge I -闪避 I -+10% evasion -+10% 闪避率 -Dodge II -闪避 II -+15% evasion (25 total) -+15% 闪避率 (共 25%) -Dodge III -闪避 III -+25% evasion (50 total) -+25% 闪避率 (共 50%) -More Summons -专家召唤师 -Increases the permanent summon cap by +1 (from 2 to 3) -召唤上限永久增加 +1(从 2 增加到 3) -Many Summons -召唤师大师 -Increases the permanent summon cap by +1 (from 3 to 4) -召唤上限永久增加 +1(从 3 增加到 4) -Magical Implements -魔法武器精通 -While holding a magical weapon like a staff or enchanted knife, your mana costs are reduced by 20%. -手持法杖或附魔刀等魔法武器时,法力消耗降低20%。 -Mage Circuits -魔法电路 -Increases the size of the passive mana pool by +100. -使被动法力池增加 100 点。 -Archmage -大魔法师 -Upcasted spells cost 25% less mana. -减少进阶法术 25% MP消耗。 -Critical Strike -致命一击 -Excess accuracy (over 100%) is converted to bonus physical damage percentage at 50% efficiency. -超额准确度(超过 100%)会以 50% 的效率转化为额外的物理伤害百分比。 +### Debug Defeat -Flash Bomb -闪光弹 -Mirror Image -镜像 -Select area to bind -选择施放位置 -Choose AoE -选择施放位置 -Choose AoE location -选择施放位置 -Choose target AoE location -选择施放位置 -Choose target location -选择施放位置 -Choose target 3x3 area -选择施放区域(3x3) -Select center of a a 3x3 AoE -选择施放区域(3x3) -Choose target AoE location (5x5) -选择施放区域 (5x5) -Choose line direction -选择直线区域 -Choose ring origin -选择环形区域 -Choose mound origin -选择方形区域 -Select an area -选择一个区域 -Choose area containing slime -选择含有粘液的区域 -Choose target point -选择目标点 -Choose aim direction -选择发射方向 -Choose a monolith to kick -选择要发射的巨石 -Choose monoliths to enchant -选择要附魔的巨石 -Choose aim direction (max range 4 tiles) -选择发射方向(最大射程 4 格) -Choose location for trap -选择放置陷阱的位置 -Select where to put the trap (it will be invisible) -选择放置陷阱的位置(它将不可见) -Choose line direction (max range 4 tiles) -选择直线区域(最大范围 4 个格) -Choose a 3x3 area to freeze -选择要冻结区域(3x3) -Choose sphere location -选择球体位置 -Choose creature to shield -选择施加护盾的个体 -Choose barrier location -选择障碍位置 -Choose area containing encased helpless enemies. -选择含有被束缚的无助的敌人的区域。 -Select where to put the icicles (SpellArea radius) -选择放置冰柱的位置(SpellArea 半径) -Select which creature to buff -选择要增益的个体 -Select yourself -选择自己 -Choose location -选择位置 -Select which creature to bind -选择要束缚的个体 -Select which creature to lock -选择要锁定的个体 -Select which creature to lock in a belt -选择要锁定在贞操带中的个体 -Choose a helpless target -选择一个无助的个体 -Select a creature or yourself -选择一个个体 -Select area to awaken -选择唤醒区域 -Select a target to pull -选择要抓取的个体 -Select where the slime will appear -选择粘液出现的位置 -Select where to put the wall (cannot place on occupied squares) -选择放置墙壁的位置(不能放置在占用的区域上) +### You cast devastating ASCII glyphs! -#初始技能# -Toggles -切换 -Unmasked -无面罩 -Hoods and full-face covering masks do not appear, but blindfolds are more powerful. -头套和全覆盖面罩将不会出现,但眼罩更强大。 -No Nurses -无护士 -Nurses will not appear in the game. -护士将不再出现在游戏中。 -Brats Only -淘气宝宝 -Submissive enemies will always be bratty and force you to catch them. -顺从的敌人总是令人讨厌,迫使你去抓他们。 -No Brats -安静宝宝 -Submissive enemies won't run away from you. -顺从的敌人不会从你身边逃跑。 +### Debug Bind -Locks and Restraints -锁具和拘束具 -Second Wind -再生之气 -Gain 2 WP every time you remove a non-trivial restraint. -每次移除特殊拘束时获得 2 WP。 -Futile Struggles -无力挣扎 -Lose 2 WP every time you remove a non-trivial restraint. -每次移除特殊拘束时消耗 2 WP。 -Strong -强健 -Boosts the Struggle option when escaping. -挣扎效果提升。 -Helpless -无助 -You are physically weak. Struggling is much less effective. -你的身体虚弱,挣扎效果要差得多。 -Flexible -灵活 -Slightly boosts the Remove/Unlock option, escaping is 1.5x as fast except picking, and your feet can use items/buckles. -略微加速移除/解锁的速度,除了撬锁之外,逃脱速度变为原先的 1.5 倍,并且你的脚可以使用物品/扣环。 -Inflexible -笨重 -You get a penalty to the Remove and Unlock action, and escaping is 0.75x as fast. -减慢移除/解锁的速度,逃脱速度变为原先的 0.75 倍。 -Locksmith -锁匠 -You get a bonus to lockpicking, allowing you to pick some high-security locks previously impossible. -你可以获得撬锁奖励,并且允许撬一些以前不可能撬开的高安全性锁具。 -Clueless -一头雾水 -You have no idea how to pick locks. Picking is 0.5x as fast and you can't pick most advanced locks. -你不知道如何撬锁,撬锁速度变为原来的 0.5 倍,而且您无法撬开最先进的锁具。 -Frantic Struggle -疯狂挣扎 -Your struggling is 3 times as fast, but less efficient in terms of stamina. -你的挣扎速度变为原来的 3 倍,但提高挣扎时的体力消耗。 -Psychic -超凡之力 -You no longer drop keys and picks, can unlock yourself with bound hands, and don't need hands for items/potions. -你不将会掉落钥匙和镐,可以用拘束住的手解锁自己,并且不需要手来使用物品/药水。 -High Security -高安全性 -Picks are weaker, and randomly generated locks are harsher. -开锁工具变得更加脆弱,且随机生成的锁具将更难撬开。 -No Way Out -无法挣脱 -Enemies will always use the tightest restraints possible and fully bind you. -敌人将始终使用最严格的拘束具来完全束缚你。 -Well-Equipped -设备精良 -Restraints and traps that are limited by level appear sooner, and enemies will stack many restraints. -限制在一定层数后出现的拘束具和陷阱会更早的出现,并且敌人会堆叠更多的束缚。 -Magic Hands -魔法之手 -Enemies can add restraints underneath existing restraints. -敌人可以在现有拘束具上添加额外拘束。 -Cursed Locks -禁锢诅咒 -Those without keys shall face the Wrath of the Lock. Locked items cannot be cut and are harder to struggle. -没有钥匙的人将受到禁锢的诅咒,锁定的物品不能被切割,且更难挣扎。 -Butterfingers -黄油手指 -Having arms bound prevents you from using your hands to struggle or unlock yourself. -被束缚的手臂会阻止你用手挣扎或解锁自己。 -Weak Grip -弱式握杆 -Having arms bound prevents you from holding weapons or potions. -被束缚的手臂无法持有武器或药剂。 +### You cast bondage ASCII glyphs! + +### , Floor AMNT + +### Recolor + +### Only collect notable + +### Autorelease escaped -Kinks and Preferences -怪癖和偏好 -Unchained -无拘无束 -Start with high Metal reputation, and all metal restraints are easier to escape from. -开局金属声望更高,所有金属拘束更容易逃脱。 -Damsel in Chains -锁链少女 -Metal restraints are harder to escape from. -金属拘束更难逃脱。 -Escape Artist -逃脱大师 -Start with high Rope reputation, and all rope restraints are easier to escape from. -开局绳索声望更高,所有绳索拘束更容易逃脱。 -Rope Bunny -绳模 -Rope restraints are harder to escape from. -绳索拘束更难逃脱。 -Slippery -滑溜溜 -Start with high Latex reputation, and all latex restraints are easier to escape from. -开局乳胶声望更高,所有乳胶拘束更容易摆脱。 -Latex Doll -乳胶娃娃 -Latex restraints are harder to escape from. -乳胶拘束更难逃脱。 -Escapee -流亡者 -Start with high Leather reputation, and all leather restraints are easier to escape from. -开局皮革声望更高,所有皮革束缚更容易逃脱。 -Leather-Bound -皮革拘束 -Leather restraints are harder to escape from. -皮革拘束更难逃脱。 -Submissive -温顺小甜心 -Your submissiveness starts at 100 and cannot go below 70. -开局服从度变为 100 ,且游戏中不能低于 70。 -Wanted -通缉逃犯 -Your security level starts at 100 and cannot go below 70. -开局安全级别变为 100 ,且游戏中不能低于 70。 -Fashionable -时尚之星 -When you are jailed, you keep your outfit. -入狱可保留你的衣物。 -Bondage Lover -束缚爱好 -Attempting to escape arouses you. -试图挣脱会提高你的干扰值。 -Undeniable -无可争辩 -Born with an intense submissive desire, you cannot refuse bondage from dialogues. -你生来就有强烈的顺从欲望,无法在对话时拒绝束缚请求。 -I have... needs -我...想要... -Distraction builds up over time. -干扰值随时间累计。 -Bound Crusader -束缚十字军 -Goddesses will expect you to wear their restraints as their champion. -女神会期望你作为她们的卫士时穿戴她们的拘束具。 +### NME is not notable enough for your collection. -Damage and Resists -伤害和抵抗 -Stoic -忍耐 -You gain 82% tickle resist. -你获得 82% 挠痒抗性。 -Ticklish -怕痒 -You take 50% more tickle damage. -你受到的挠痒伤害增加 50%。 -Unperturbed -冰洁 -You gain 82% grope resist. -你获得 82% 抚摸抗性。 -Lascivious -好色 -You take 50% more grope damage. -你受到的抚摸伤害增加 50%。 -Pain Tolerance -坚韧 -You gain 200% pain resist. -你获得 200% 疼痛抗性。 -Masochist -受虐 -Pain is strongly arousing. -疼痛会使你强烈地兴奋。 -Rigger -索具装配工 -Chain and glue damage increased by 20%. Binding on enemies is 30% stronger. -提高 20% 锁链/胶水伤害,并提高对敌人的拘束强度 30%。 -Pacifist -和平主义者 -All non-glue, non-chain, or non-teasing damage dealt to humanoid enemies is reduced by 90%. -对人形敌人造成的所有非胶水、非锁链或非戏弄伤害降低 90%。 -Burning Desire -焚心望火 -While above 70% distraction, you ignite nearby objects and gain +40% fire damage. -当干扰值超过 70% 时,你会点燃附近的物体并提高 40% 火焰伤害。 -Frigid Personality -冰清玉洁 -While at 0% distraction, you gain +10% ice damage and can walk on ice without penalties. -当干扰值为 0% 时,提高 10% 寒冰伤害并且可以无惩罚的在冰上行走。 -Grounded in Reality -现实之源 -While at max mana, your attacks deal an additional 30% of their base damage as electric damage. -当法力值最大时,攻击可造成额外 30% 基础伤害的电击伤害。 -Like the Wind -风之旋律 -While above 95% stamina, you gain +30% evasion and your slow level is reduced by 1. -当耐力大于 95% 时,获得 30% 闪避并且减速等级降低 1。 -Immovable Object -坚不可摧 -While above 90% willpower, you gain +150 Restraint Block and Earth buff spells cost half mana. -当意志力大于 90% 时,获得 150 点拘束阻挡,且岩系增益法术仅需消耗一半的法力值。 -Path of Least Resistance -腐蚀之盾 -While at 0 willpower, you gain +35% evasion and deal 20% of your max willpower as acid damage when restrained. -当意志力为 0 时,获得 35% 的闪避,并在受到拘束时造成相当于你最大意志力 20% 的酸蚀伤害。 -Sticky Situation -粘滞窘境 -You take 40% more glue damage. -你受到的胶水伤害增加 40%。 -Breathless -气喘吁吁 -Taking chain, poison, and crush damage makes you dizzy. -受到锁链、毒物和碾压伤害会让你头晕目眩。 +### Auto-released NME due to Escape. -General Combat -一般战斗 -Focused Dodge -集中闪避 -While your miscast chance is 0%, your base evasion is 25% (multiplicative). -施法失败率为 0% 时,获得额外 25% 闪避率(乘算)。 -Quick-Draw -快速拔刀 -Switching weapons and spells does not take a turn. -切换武器和法术无需等待一回合。 -Brawler -格斗大师 -Unarmed attacks deal +10 damage. -徒手攻击额外造成10伤害。 -Graceful Walk -优雅步伐 -You don't lose stamina when walking with one slowing item, unless it binds your legs together. -带着一件减速物品走路时不会失去耐力,除非你的腿被绑在一起。 -Bound Power -拘束之力 -Your damage and evasion increases based on the number of restraints worn, up to +40% when thoroughly bound. -你的伤害和闪避会根据佩戴的束缚数量增加,完全束缚时最多 +40%。 -Berserker Rage -狂暴之怒 -Melee attacks distract you, but melee (including chain) damage increases by up to 30% at max distraction. -近战攻击会提高你的干扰值,但在干扰值达到最大值时,近战(包括锁链)伤害最多增加 30%。 -Quickness -迅疾闪现 -Grants Quickness after not moving for 4 turns. Quickness lets you move 1 space without ticking the clock. -4回合不动后获得"敏捷","敏捷"状态下可以瞬间移动 1 格。 -Distracted -心神不定 -+15% miscast chance (at all times) -增加 15% 施法失败几率(始终) -Disorganized -杂乱无章 -Switching weapons, learning/choosing spells, and casting from spellbook takes 3 turns. -切换武器、学习/选择法术和从法术书中施放需要 3 个回合。 -Clumsy -笨手笨脚 -0.7x melee hit chance -0.7x 近战命中率 -Savour the Taste -细细品味 -Drinking a potion takes 2 turns -喝一瓶药水需要 2 回合。 -Blackout -屏蔽护目 -Blindfolds are stronger. While blindfolded you can only see enemies next to you. -眼罩变得更强,当佩戴眼罩时,你只能看到身边的敌人。 -Total Blackout -暗影护目 -Blindfolds are extremely punishing and you can't see explored areas while blindfolded. -眼罩变得非常痛苦,当佩戴眼罩时,你看不到已探索区域。 +Your ITMN1 was cursed and transforms into a ITMN2! +您的ITMN1被诅咒并转变为ITMN2! -Wizardry and Sorcery -魔法和巫术 -Slayer -元素法师 -You can cast Elemental spells without having the components, at twice the cost. Start w/ Firebolt. -你可以以两倍魔力消耗为代价无视施法条件使用元素法术。开局获得技能 火焰弹。 -Conjurer -咒术法师 -You can cast Conjuration spells without having the components, at twice the cost. Start w/ Conjure Chain. -你可以以两倍魔力消耗为代价无视施法条件使用咒术。开局获得技能 咒术。 -Magician -幻术法师 -You can cast Illusion spells without having the components, at twice the cost. Start w/ Shadow Dagger. -你可以以两倍魔力消耗为代价无视施法条件使用幻术。开局获得技能 暗影匕首。 -Studious -学识渊博 -You start the game with +3 additional spell points. -开局额外获得3点法术点数。 -Mana Burst -法力冲击 -While at 100% distraction, you get -100% miscast chance but spending too much mana at once may cause you to go over the edge. -当干扰值为 100% ,施法失败几率 -100%,但一次消耗过多的法力值可能会导致高潮。 -Clearheaded -冷静之术 -Magic puts you in a clear state of mind. Casting spells successfully reduces your distraction. -魔法可以让你头脑清醒,成功施法时可以减少干扰值。 -Unstable Magic -混沌魔法 -Spells do up to 60% additional damage based on distraction or miscast chance, whichever is higher. -根据干扰值或施法失败的几率,法术最多可造成 60% 的额外伤害,以较高者为准。 -Arousing Magic -催化魔法 -Your magic is powered by otherworldly distracting energies. Casting spells increases distraction based on the mana spent. -你的魔法由超凡脱俗的催情能量驱动,施法时会根据消耗的法力增加干扰值。 -Absolute Focus -绝对专注 -Miscast chance is doubled. -施法失败几率翻倍。 -Can't Hear You! -听不见你说话! -Being gagged blocks you from casting verbal spells regardless of gag power. -堵嘴会阻止你施放言语咒语,无论堵嘴的等级如何。 -Devious Threats -狡猾的威胁 -Stranger -未知实体 -Randomizes your relationship to most factions. -随机化你与大多数派系的关系。 -Stealth Mission -隐匿任务 -You are harder to detect and there are more chests, but enemies are harder and drop no gold. -你将更难被发现,且会刷新更多的箱子,但敌人更难并且不会掉落金币。 -Wrong Neighborhood -敌意实体 -All factions are hostile and united against you. -所有派系都对你敌对并联合起来反对你。 -Resilient Foes -顽强之敌 -Enemies take 30% less damage. -敌人受到的伤害减少 30%。 -Kill Squad -杀戮小队 -Enemies see you through walls and at greater distance. -敌人透过墙壁和更远的距离看到你。 -Conspicuous -显眼 -Enemies detect you more easily. -敌人更容易发现你。 -Cursed -诅咒 -Goddess reputations start at 0 and can never exceed 25. -所有女神的声望从0开始,永远不能超过25。 -Nowhere is Safe -草木皆兵 -Beds and furniture are often trapped. -床和木桶经常会是陷阱。 -Maid Lovers -女仆之恋 -All humanoids that can bind you also apply maid restraints. -所有可束缚你的人形生物可以使用女仆束缚。 -Latex Lovers -乳胶之恋 -All humanoids that can bind you also apply latex restraints. -所有可束缚你的人形生物可以使用乳胶束缚。 -Leather Lovers -皮革之恋 -All humanoids that can bind you also apply leather restraints. -所有可束缚你的人形生物可以使用皮革束缚。 -Adv Latex Lovers -高级乳胶之恋 -All humanoids that can bind you also apply advanced latex restraints. -所有可束缚你的人形生物可以使用高级乳胶束缚。 -Dress Lovers -连衣之恋 -All humanoids that can bind you also apply dress restraints. -所有可束缚你的人形生物可以使用连衣裙束缚。 -Wolfgirl Lovers -狼女之恋 -All humanoids that can bind you also apply wolfgirl restraints. -所有可束缚你的人形生物可以使用狼女束缚。 -Kitty Lovers -猫咪之恋 -All humanoids that can bind you also apply kitty restraints. -所有可束缚你的人形生物可以使用猫咪束缚。 +Equipping Restraint... +装备束缚... +Equipping Armor... +装备防具... +Using Consumable... +使用消耗品... +Struggling... +挣扎中... -World Generation -世界生成 -Dominant -支配者 -They're trapped here with you. Ghosts are more helpful, and you can bind enemies that confront you about bondage. -他们和你一起被困在这里。鬼魂更有帮助,你可以束缚与你对抗的敌人。 -Supermarket -超市 -Commerce shrines can appear in levels and have slightly more items. -商业神殿可以出现在不同的层次上,并拥有更多的物品。 -Rusty Bolts -生锈螺栓 -Most traps have a 25% misfire chance. -大多数陷阱有 25% 的失效几率。 -Expansive Halls -宽敞之牢 -Increases the size of maps by 1 in each direction. -将每个方向的地图大小增加 1。 -Gargantuan Halls -广阔之牢 -Increases the size of maps by 2 in each direction. -将每个方向的地图大小增加 2。 -Labyrinthine Halls -辽阔之牢 -Increases the size of maps by 3 in each direction. -将每个方向的地图大小增加 3。 -Oppression -压抑 -Ghosts are less likely to help you. -鬼魂不愿意帮助你。 -Price Gouging -敲竹杠 -Items are 5x as expensive in the shop. -商店里的商品价格是原来的 5 倍。 -Pristine -质朴 -There are no shiny loot objects in the dungeon. -地牢中没有闪亮的战利品。 -Lost Technology -遗落之术 -Ancient power cores break with use, and cannot be recharged. -远古的能量核心会随着使用而损坏,并且无法充能。 -Panic!!! -惊恐 -When you step on a trap, you are stunned for 2 turns. -当你踩到陷阱时,你会晕眩2回合。 -Forgetful -健忘 -You don't remember where you've been in the level. -你不记得你在地牢中的位置。 -Trespasser -入侵者 -You lose reputation with the goddesses every time you advance a floor. -每次你进入下一层楼时,你会失去女神们的声誉。 -Kinky Prisoner -变态囚犯 -Guards never remove restraints you are already wearing, unless they are applying something tighter. -警卫永远不会移除您已经佩戴的束缚,除非他们使用更严格的束缚。 -Unfair Doors -困难的门 -Doors are harder to open while your hands are bound. -当你的手被束缚时,门更难打开。 -Starting Scenario -起始场景 -Prisoner -囚犯 -Start the game as a submissive prisoner wandering the halls. -作为一个在大厅里游荡的顺从囚犯开始游戏。 -Hogtied! -捆绑 -Start the game trussed up in tight ropes. -开始游戏时被绳索捆绑。 -Maid Sweeper -可爱女仆 -Start in a magically locked maid outfit. -开局时穿戴使用魔法锁住的女仆装。 -Wolf Trainee -受训狼女 -Start in a uniform of a naughty wolfgirl. -开局时穿戴狼女的衣服。 -Latex Mannequin -乳胶娃娃 -Start bound in latex restraints. -开局时穿戴一整套乳胶拘束。 -Iron Slave -钢铁奴隶 -Start in a full set of magically locked obsidian cuffs. -开局时穿戴被魔法锁住的全套黑曜石铐。 +The ITMN1 is purified and returns to being a ITMN2! +ITMN1被净化,恢复为ITMN2! +Reverts if purified with item. +如果使用物品净化,将会恢复。 +...smaller than expected. +意料之中的。 +Comes with an artistic flair. +具有艺术气息。 + + +### Set Pivot + +### Toggle click & drag + +### Settings + +### Scroll Controls: + +### Layer Text: diff --git a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_DE.txt b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_DE.txt index aa870254f..bc0a278ad 100644 --- a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_DE.txt +++ b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_DE.txt @@ -1,15869 +1,31005 @@ +### By Strait-Laced Games -Credits -Credits -Patrons -Patrons -News and Updates -News and Updates -Support @ Patreon -Support @ Patreon -Thank you to the following awesome people for supporting me at patreon.com/ada18980|cyberjoel|Samantha Lear|Kara|The-Fisher-King|Laioken|Finn|selly-grim|Dex♪|Churro|Gamefan|Shogo|X27|Blox|Slacker|Nikos S.|Flame|Alexis Octavia|Dmitri S.|Noxgarm|Siegfried K.|Hellgete -Thank you to the following awesome people for supporting me at patreon.com/ada18980|cyberjoel|Samantha Lear|Kara|The-Fisher-King|Laioken|Finn|selly-grim|Dex♪|Churro|Gamefan|Shogo|X27|Blox|Slacker|Nikos S.|Flame|Alexis Octavia|Dmitri S.|Noxgarm|Siegfried K.|Hellgete -|nuzzles|Rest|LoudestQuietPerson|Violet EverGardner|BoopleDoopleson|Dazman1234|WATA|linlizheng|Mechio|Vikingberserker|PWMRM|devan|LukeB|atetete|Aussie895|0xA4C1B842|Rika|Physicsphail|Loony|Jeremy P.|ItsYahboi9 -|nuzzles|Rest|LoudestQuietPerson|Violet EverGardner|BoopleDoopleson|Dazman1234|WATA|linlizheng|Mechio|Vikingberserker|PWMRM|devan|LukeB|atetete|Aussie895|0xA4C1B842|Rika|Physicsphail|Loony|Jeremy P.|ItsYahboi9 -|AlexisTheFlame|Chen Yu|Sinohisaki|nnm711|Ron lsrp|Miro|Anthony R.|John T.|Geng114514|塵狐|kamil|Iaysakuya|tsang|Somprad|Thatguu|damit damit|Victor|Hjake2|anton A.|Dakra|CuvyanTaylor| -|AlexisTheFlame|Chen Yu|Sinohisaki|nnm711|Ron lsrp|Miro|Anthony R.|John T.|Geng114514|塵狐|kamil|Iaysakuya|tsang|Somprad|Thatguu|damit damit|Victor|Hjake2|anton A.|Dakra|CuvyanTaylor| -|hanhan|The_rogue1|Tatsuya S.|James K.|Misa|eddy z.|theshrimpyone|Eislobo|OTKTamashii|Michael M.|Jose G.|Minescence|HanQing Z.|hanhan|Shakymunch|Crimson|Arentios|Vini J.|Treemen555|Lordfabricator|ML -|hanhan|The_rogue1|Tatsuya S.|James K.|Misa|eddy z.|theshrimpyone|Eislobo|OTKTamashii|Michael M.|Jose G.|Minescence|HanQing Z.|hanhan|Shakymunch|Crimson|Arentios|Vini J.|Treemen555|Lordfabricator|ML -Hannes|Isaiah L.|darklink11|Cerb|Diablo200|RNFRaptor|CMDR Salen|daniel C.|NDW|Sewdah N.|Sylicix|Wossa|ComradeArmtyom|逗比 徐|Null Fame|zipidyzap|Mister Mythe|Yagami Yami|Phoenix|Kritsanapong J.|Pyron|Tobi -Hannes|Isaiah L.|darklink11|Cerb|Diablo200|RNFRaptor|CMDR Salen|daniel C.|NDW|Sewdah N.|Sylicix|Wossa|ComradeArmtyom|逗比 徐|Null Fame|zipidyzap|Mister Mythe|Yagami Yami|Phoenix|Kritsanapong J.|Pyron|Tobi -Traynfreek|森 韩|Meekohi|GRASS|Heavy Blues|Girador|Sinohisaki|Nymjii|Linex|werty989898|John H.|Hideki H.|Izzzzzz|Zhenyu G.|Animi|Hungvipbcsok|uiy|Joecoolzx -Traynfreek|森 韩|Meekohi|GRASS|Heavy Blues|Girador|Sinohisaki|Nymjii|Linex|werty989898|John H.|Hideki H.|Izzzzzz|Zhenyu G.|Animi|Hungvipbcsok|uiy|Joecoolzx -Back -Back -Next -Next -Music: kocaeli|Bound enemy graphics: Song|CN Translation: Alexthymia|KR Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Audio:|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi -Music: kocaeli|Bound enemy graphics: Song|CN Translation: Alexthymia|KR Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Audio:|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi -Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators -Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators -undefined -undefined -Language -Language -English -English -Chinese -Chinese -Korean -Korean -Mods -Mods -Mods Loaded. -Mods Loaded. -Restart required! -Restart required! -需要重启! -需要重启! -재시작 필요! -재시작 필요! -Kinky Dungeon v4.1 -Kinky Dungeon v4.1 -You are an adventurer descending into an ancient underground city of magic. -You are an adventurer descending into an ancient underground city of magic. -Beneath its depths lies the Mistress' Staff, an artifact of untold power. -Beneath its depths lies the Mistress' Staff, an artifact of untold power. -Will you prevail against forces unknown, or succumb to its dark secrets? -Will you prevail against forces unknown, or succumb to its dark secrets? -(This game does not contain spiders or any carnivorous creatures/plants) -(This game does not contain spiders or any carnivorous creatures/plants) -(Check out the latest standalone version at the News and Updates link below!) -(Check out the latest standalone version at the News and Updates link below!) -Enable Sound -Enable Sound -Enable Drool/Tears -Enable Drool/Tears -Draw Armor -Draw Armor -Enable Music -Enable Music -Turn Counter -Turn Counter -Flash Screen on Stun -Flash Screen on Stun -Intense 'Let Go' VFX -Intense 'Let Go' VFX -Enable Toy SFX -Enable Toy SFX -Enable Fullscreen -Enable Fullscreen -High Quality Animations -High Quality Animations -Wait Quickly -Wait Quickly -Helpless! -Helpless! -Evaded! -Evaded! -Blocked! -Blocked! -Blocked restraint! -Blocked restraint! -You bump into a wall. -You bump into a wall. -Toy Volume: -Toy Volume: -Music Volume: -Music Volume: -SFX Volume: -SFX Volume: -Animation Time: -Animation Time: -Select a journey. This will determine the ordering of game areas. -Select a journey. This will determine the ordering of game areas. -Standard: The intended experience -Standard: The intended experience -Random: A chaotic journey -Random: A chaotic journey -Harder: A more difficult journey -Harder: A more difficult journey -Select perks to start with. -Select perks to start with. -Having 10+ spare points will trigger Hard Mode, granting unique loot. -Having 10+ spare points will trigger Hard Mode, granting unique loot. - (HARD MODE ENABLED) - (HARD MODE ENABLED) -Advanced start (choose perks) -Advanced start (choose perks) -Confirm and start playing! -Confirm and start playing! -Point Cost: AMOUNT -Point Cost: AMOUNT -Points Available: AMOUNT -Points Available: AMOUNT -Resilient Foes -Resilient Foes -Enemies take 30% less damage. -Enemies take 30% less damage. -Strong -Strong -Boosts the Struggle option when escaping. -Boosts the Struggle option when escaping. -Helpless -Helpless -You are physically weak. Struggling is much less effective. -You are physically weak. Struggling is much less effective. -Flexible -Flexible -Slightly boosts the Remove/Unlock option, escaping is 1.5x as fast except picking, and your feet can use items/buckles. -Slightly boosts the Remove/Unlock option, escaping is 1.5x as fast except picking, and your feet can use items/buckles. -Inflexible -Inflexible -You get a penalty to the Remove and Unlock action, and escaping is 0.75x as fast. -You get a penalty to the Remove and Unlock action, and escaping is 0.75x as fast. -Locksmith -Locksmith -You get a bonus to lockpicking, allowing you to pick some high-security locks previously impossible. -You get a bonus to lockpicking, allowing you to pick some high-security locks previously impossible. -Clueless -Clueless -You have no idea how to pick locks. Picking is 0.5x as fast and you can't pick most advanced locks. -You have no idea how to pick locks. Picking is 0.5x as fast and you can't pick most advanced locks. -Psychic -Psychic -You no longer drop keys and picks, can unlock yourself with bound hands, and don't need hands for items/potions. -You no longer drop keys and picks, can unlock yourself with bound hands, and don't need hands for items/potions. -Novice -Novice -All spells above 1st level cost 2x as many spell points. -All spells above 1st level cost 2x as many spell points. -Blessed -Blessed -You can drink mana from the shrine fountains once per floor without chance of punishment. -You can drink mana from the shrine fountains once per floor without chance of punishment. -Cursed -Cursed -Goddess reputations start at 0 and can never exceed 25. -Goddess reputations start at 0 and can never exceed 25. -Submissive -Submissive -Your submissiveness starts at 100 and cannot go below 70. -Your submissiveness starts at 100 and cannot go below 70. -Wanted -Wanted -Your security level starts at 100 and cannot go below 70. -Your security level starts at 100 and cannot go below 70. -Studious -Studious -You start the game with +3 additional spell points. -You start the game with +3 additional spell points. -Meditation -Meditation -You slowly regenerate mana, up to a maximum of 50. -You slowly regenerate mana, up to a maximum of 50. -Willpower -Willpower --50% stamina drain from being at high arousal. --50% stamina drain from being at high arousal. -Bondage Lover -Bondage Lover -Attempting to escape arouses you. -Attempting to escape arouses you. -Focused Dodge -Focused Dodge -While your miscast chance is 0%, you gain +40 Evasion. -While your miscast chance is 0%, you gain +40 Evasion. -Distracted -Distracted -+15% miscast chance (at all times) -+15% miscast chance (at all times) -Brawler -Brawler -Unarmed attacks deal +10 damage. -Unarmed attacks deal +10 damage. -Clumsy -Clumsy -0.7x base accuracy -0.7x base accuracy -Unfocused -Unfocused -Accuracy multiplied by 0.9x above 10% distraction, down to 0.6x at 90% distraction. -Accuracy multiplied by 0.9x above 10% distraction, down to 0.6x at 90% distraction. -Pristine -Pristine -There are no shiny loot objects in the dungeon. -There are no shiny loot objects in the dungeon. -Lost Technology -Lost Technology -Ancient power cores break with use, and cannot be recharged. -Ancient power cores break with use, and cannot be recharged. -Unchained -Unchained -Start with high Metal reputation, and all metal restraints are easier to escape from. -Start with high Metal reputation, and all metal restraints are easier to escape from. -Damsel in Chains -Damsel in Chains -Metal restraints are harder to escape from. -Metal restraints are harder to escape from. -Forgetful -Forgetful -You don't remember where you've been in the level. -You don't remember where you've been in the level. -Cursed Locks -Cursed Locks -Those without keys shall face the Wrath of the Lock. Locked items cannot be cut and are harder to struggle. -Those without keys shall face the Wrath of the Lock. Locked items cannot be cut and are harder to struggle. -The magical warding from the lock protects the item. -The magical warding from the lock protects the item. -Undeniable -Undeniable -Born with an intense submissive desire, you cannot refuse bondage from dialogues. -Born with an intense submissive desire, you cannot refuse bondage from dialogues. -Frantic Struggle -Frantic Struggle -Your struggling is 3 times as fast, but less efficient in terms of stamina. -Your struggling is 3 times as fast, but less efficient in terms of stamina. -Escape Artist -Escape Artist -Start with high Rope reputation, and all rope restraints are easier to escape from. -Start with high Rope reputation, and all rope restraints are easier to escape from. -Rope Bunny -Rope Bunny -Rope restraints are harder to escape from. -Rope restraints are harder to escape from. -Slippery -Slippery -Start with high Latex reputation, and all latex restraints are easier to escape from. -Start with high Latex reputation, and all latex restraints are easier to escape from. -Latex Doll -Latex Doll -Latex restraints are harder to escape from. -Latex restraints are harder to escape from. -Hogtied! -Hogtied! -Start the game trussed up in tight ropes. -Start the game trussed up in tight ropes. -Escapee -Escapee -Start with high Leather reputation, and all leather restraints are easier to escape from. -Start with high Leather reputation, and all leather restraints are easier to escape from. -Leather-Bound -Leather-Bound -Leather restraints are harder to escape from. -Leather restraints are harder to escape from. -Slayer -Slayer -You can cast Elemental spells without having the components, at twice the cost. Start w/ Firebolt. -You can cast Elemental spells without having the components, at twice the cost. Start w/ Firebolt. -Conjurer -Conjurer -You can cast Conjuration spells without having the components, at twice the cost. Start w/ Conjure Chain. -You can cast Conjuration spells without having the components, at twice the cost. Start w/ Conjure Chain. -Magician -Magician -You can cast Illusion spells without having the components, at twice the cost. Start w/ Shadow Dagger. -You can cast Illusion spells without having the components, at twice the cost. Start w/ Shadow Dagger. -Narcoleptic -Narcoleptic -You slowly lose stamina over time. -You slowly lose stamina over time. -Stealth Mission -Stealth Mission -You are harder to detect and there are more chests, but enemies take 30% less damage, are more evasive, and drop no gold. -You are harder to detect and there are more chests, but enemies take 30% less damage, are more evasive, and drop no gold. -Latex Lovers -Latex Lovers -All humanoids that can bind you also apply latex restraints. -All humanoids that can bind you also apply latex restraints. -Leather Lovers -Leather Lovers -All humanoids that can bind you also apply leather restraints. -All humanoids that can bind you also apply leather restraints. -Wolfgirl Lovers -Wolfgirl Lovers -All humanoids that can bind you also apply wolfgirl restraints. -All humanoids that can bind you also apply wolfgirl restraints. -Maid Lovers -Maid Lovers -All humanoids that can bind you also apply maid restraints. -All humanoids that can bind you also apply maid restraints. -Dress Lovers -Dress Lovers -All humanoids that can bind you also apply dress restraints. -All humanoids that can bind you also apply dress restraints. -Kitty Lovers -Kitty Lovers -All humanoids that can bind you also apply kitty restraints. -All humanoids that can bind you also apply kitty restraints. -Adv Latex Lovers -Adv Latex Lovers -All humanoids that can bind you also apply advanced latex restraints. -All humanoids that can bind you also apply advanced latex restraints. -Conspicuous -Conspicuous -Enemies detect you more easily. -Enemies detect you more easily. -Bound Power -Bound Power -Your damage and evasion increases based on the number of restraints worn, up to +40% when thoroughly bound. -Your damage and evasion increases based on the number of restraints worn, up to +40% when thoroughly bound. -Kill Squad -Kill Squad -Enemies see you through walls and at greater distance. -Enemies see you through walls and at greater distance. -Supermarket -Supermarket -Commerce shrines can appear in levels and have slightly more items. -Commerce shrines can appear in levels and have slightly more items. -Price Gouging -Price Gouging -Items are 5x as expensive in the shop. -Items are 5x as expensive in the shop. -Supermarket -Supermarket -Commerce shrines can appear in levels and have slightly more items. -Commerce shrines can appear in levels and have slightly more items. -Price Gouging -Price Gouging -Items are 5x as expensive in the shop. -Items are 5x as expensive in the shop. -High Security -High Security -Picks are weaker, and randomly generated locks are harsher. -Picks are weaker, and randomly generated locks are harsher. -Shoddy Knives -Shoddy Knives -Knives break more easily. -Knives break more easily. -Oppression -Oppression -Ghosts are less likely to help you. -Ghosts are less likely to help you. -Search Party -Search Party -More enemies spawn during sleep. -More enemies spawn during sleep. -No Way Out -No Way Out -Enemies will always use the tightest restraints possible and fully bind you. -Enemies will always use the tightest restraints possible and fully bind you. -Graceful Walk -Graceful Walk -You don't lose stamina when walking with one slowing item, unless it binds your legs together. -You don't lose stamina when walking with one slowing item, unless it binds your legs together. -Well-Equipped -Well-Equipped -Restraints and traps that are limited by level appear sooner, and enemies will stack many restraints. -Restraints and traps that are limited by level appear sooner, and enemies will stack many restraints. -Quick-Draw -Quick-Draw -Switching weapons and spells does not take a turn. -Switching weapons and spells does not take a turn. -Quick-Scribe -Quick-Scribe -Switching spells and casting from spellbook does not take a turn. -Switching spells and casting from spellbook does not take a turn. -Disorganized -Disorganized -Switching weapons, learning/choosing spells, and casting from spellbook takes 3 turns. -Switching weapons, learning/choosing spells, and casting from spellbook takes 3 turns. -Savour the Taste -Savour the Taste -Drinking a potion takes 2 turns -Drinking a potion takes 2 turns -Magic Hands -Magic Hands -Enemies can add restraints underneath existing restraints. -Enemies can add restraints underneath existing restraints. -Fuuka's Pet -Fuuka's Pet -Start with Fuuka's collar and a few restraints. -Start with Fuuka's collar and a few restraints. -Fuuka Fan Club -Fuuka Fan Club -All humanoids that can bind you also apply Fuuka's special restraints. -All humanoids that can bind you also apply Fuuka's special restraints. -Vengeance -Vengeance -Defeating an enemy greatly distracts you. -Defeating an enemy greatly distracts you. -Berserker Rage -Berserker Rage -Melee attacks distract you, but melee (including chain) damage increases by up to 30% at max distraction. -Melee attacks distract you, but melee (including chain) damage increases by up to 30% at max distraction. -Unstable Magic -Unstable Magic -Spells do up to 60% additional damage based on distraction or miscast chance, whichever is higher. -Spells do up to 60% additional damage based on distraction or miscast chance, whichever is higher. -Absolute Focus -Absolute Focus -Miscast chance is doubled. -Miscast chance is doubled. -Bound Crusader -Bound Crusader -Goddesses will expect you to wear their restraints as their champion. -Goddesses will expect you to wear their restraints as their champion. -Nowhere is Safe -Nowhere is Safe -Beds and furniture are often trapped. -Beds and furniture are often trapped. -I have... needs -I have... needs -Distraction builds up over time. -Distraction builds up over time. -Hopeless -Hopeless -Willpower decays over time. -Willpower decays over time. -Quickness -Quickness -Grants Quickness after not moving for 4 turns. Quickness lets you move 1 space without ticking the clock. -Grants Quickness after not moving for 4 turns. Quickness lets you move 1 space without ticking the clock. -Expansive Halls -Expansive Halls -Increases the size of maps by 1 in each direction. -Increases the size of maps by 1 in each direction. -Gargantuan Halls -Gargantuan Halls -Increases the size of maps by 2 in each direction. -Increases the size of maps by 2 in each direction. -Labyrinthine Halls -Labyrinthine Halls -Increases the size of maps by 3 in each direction. -Increases the size of maps by 3 in each direction. -Rigger -Rigger -Chain and glue damage increased by 20%. Binding on enemies is 30% stronger. -Chain and glue damage increased by 20%. Binding on enemies is 30% stronger. -Pacifist -Pacifist -All non-glue, non-chain, or non-teasing damage dealt to humanoid enemies is reduced by 90%. -All non-glue, non-chain, or non-teasing damage dealt to humanoid enemies is reduced by 90%. -Burning Desire -Burning Desire -While above 70% distraction, you ignite nearby objects and gain +40% fire damage. -While above 70% distraction, you ignite nearby objects and gain +40% fire damage. -Frigid Personality -Frigid Personality -While at 0% distraction, you gain +10% ice damage and can walk on ice without penalties. -While at 0% distraction, you gain +10% ice damage and can walk on ice without penalties. -Grounded in Reality -Grounded in Reality -While at max mana, your attacks deal an additional 30% of their base damage as electric damage. -While at max mana, your attacks deal an additional 30% of their base damage as electric damage. -Like the Wind -Like the Wind -While above 95% stamina, you gain +30 Evasion and your slow level is reduced by 1. -While above 95% stamina, you gain +30 Evasion and your slow level is reduced by 1. -Immovable Object -Immovable Object -While above 90% willpower, you gain +150 Restraint Block and Earth buff spells cost half mana. -While above 90% willpower, you gain +150 Restraint Block and Earth buff spells cost half mana. -Path of Least Resistance -Path of Least Resistance -While at 0 willpower, you gain +35 Evasion and deal 20% of your max willpower as acid damage when restrained. -While at 0 willpower, you gain +35 Evasion and deal 20% of your max willpower as acid damage when restrained. -Sticky Situation -Sticky Situation -You take 40% more glue damage. -You take 40% more glue damage. -Breathless -Breathless -Taking chain, poison, and crush damage makes you dizzy. -Taking chain, poison, and crush damage makes you dizzy. -Kinky Prisoner -Kinky Prisoner -Guards never remove restraints you are already wearing, unless they are applying something tighter. -Guards never remove restraints you are already wearing, unless they are applying something tighter. -Unfair Doors -Unfair Doors -Doors are harder to open while your hands are bound. -Doors are harder to open while your hands are bound. -You rattle the doorknob uselessly and end up banging on the door. -You rattle the doorknob uselessly and end up banging on the door. -You can't quite get a grip on the doorknob. -You can't quite get a grip on the doorknob. -Someone hears you banging and opens the door from the other side! -Someone hears you banging and opens the door from the other side! -Someone notices you fiddling with the door and opens it from the other side! -Someone notices you fiddling with the door and opens it from the other side! -The door squeaks open as the latch wasn't fully engaged. -The door squeaks open as the latch wasn't fully engaged. -You grab the doorknob with your wrists and flex it open. -You grab the doorknob with your wrists and flex it open. -You use your flexible feet to open the door. -You use your flexible feet to open the door. -Poor Technique -Poor Technique -Instead of fizzling, most miscasted projectiles and AoE spells will target you instead. -Instead of fizzling, most miscasted projectiles and AoE spells will target you instead. - - - - -Ticklish -Ticklish -You take 50% more tickle damage. -You take 50% more tickle damage. -Stoic -Stoic -You gain 82% tickle resist. -You gain 82% tickle resist. -Lascivious -Lascivious -You take 50% more grope damage. -You take 50% more grope damage. -Unperturbed -Unperturbed -You gain 82% grope resist. -You gain 82% grope resist. -Masochist -Masochist -Pain is strongly arousing. -Pain is strongly arousing. -Pain Tolerance -Pain Tolerance -You gain 200% pain resist. -You gain 200% pain resist. -Fashionable -Fashionable -When you are jailed, you keep your outfit. -When you are jailed, you keep your outfit. -Futile Struggles -Futile Struggles -Lose 2 WP every time you remove a non-trivial restraint. -Lose 2 WP every time you remove a non-trivial restraint. -Second Wind -Second Wind -Gain 2 WP every time you remove a non-trivial restraint. Destroys restraints on removal. -Gain 2 WP every time you remove a non-trivial restraint. Destroys restraints on removal. -Dominant -Dominant -They're trapped here with you. Ghosts are more helpful, and you can bind enemies that confront you about bondage. -They're trapped here with you. Ghosts are more helpful, and you can bind enemies that confront you about bondage. -Stranger -Stranger -Randomizes your relationship to most factions. -Randomizes your relationship to most factions. -Wrong Neighborhood -Wrong Neighborhood -All factions are hostile and united against you. -All factions are hostile and united against you. -Trespasser -Trespasser -You lose reputation with the goddesses every time you advance a floor. -You lose reputation with the goddesses every time you advance a floor. -Prisoner -Prisoner -Start the game as a submissive prisoner wandering the halls. -Start the game as a submissive prisoner wandering the halls. -Rusty Bolts -Rusty Bolts -Most traps have a 25% misfire chance. -Most traps have a 25% misfire chance. -Unmasked -Unmasked -Hoods and full-face covering masks do not appear, but blindfolds are more powerful. -Hoods and full-face covering masks do not appear, but blindfolds are more powerful. -Blackout -Blackout -Blindfolds are stronger. While blindfolded you can only see enemies next to you. -Blindfolds are stronger. While blindfolded you can only see enemies next to you. -Total Blackout -Total Blackout -Blindfolds are extremely punishing and you can't see explored areas while blindfolded. -Blindfolds are extremely punishing and you can't see explored areas while blindfolded. -Not a Doll -Not a Doll -You may still enter Doll Terminals, but enemies will not force you onto doll stands. -You may still enter Doll Terminals, but enemies will not force you onto doll stands. -No Nurses -No Nurses -Nurses will not appear in the game. -Nurses will not appear in the game. -No Brats -No Brats -Submissive enemies won't run away from you. -Submissive enemies won't run away from you. -Brats Only -Brats Only -Submissive enemies will always be bratty and force you to catch them. -Submissive enemies will always be bratty and force you to catch them. -More Tape -More Tape -Tape-wielding enemies (such as Tape Bots) occur more frequently. -Tape-wielding enemies (such as Tape Bots) occur more frequently. -Less Tape -Less Tape -Fewer tape-related enemies will appear, although this does not remove tape entirely. -Fewer tape-related enemies will appear, although this does not remove tape entirely. -Trainee -Trainee -Your training has given you access to the spells of the Trainee class. (Aroused mode only) -Your training has given you access to the spells of the Trainee class. (Aroused mode only) -Warrior -Warrior -Your training has given you access to the spells of the Warrior class. -Your training has given you access to the spells of the Warrior class. -Rogue -Rogue -Your training has given you access to the spells of the Rogue class. -Your training has given you access to the spells of the Rogue class. -Wizard -Wizard -Your training has given you access to the spells of the Wizard class. -Your training has given you access to the spells of the Wizard class. -Panic!!! -Panic!!! -When you step on a trap, you are stunned for 2 turns. -When you step on a trap, you are stunned for 2 turns. -Panic sets in! (Stunned 2 turns) -Panic sets in! (Stunned 2 turns) -Butterfingers -Butterfingers -Having arms bound prevents you from using your hands to struggle or unlock yourself. -Having arms bound prevents you from using your hands to struggle or unlock yourself. -Weak Grip -Weak Grip -Having arms bound prevents you from holding weapons or potions. -Having arms bound prevents you from holding weapons or potions. -You kneel down so you can reach the potion with your mouth... -You kneel down so you can reach the potion with your mouth... -Can't Hear You! -Can't Hear You! -Being gagged blocks you from casting verbal spells regardless of gag power. -Being gagged blocks you from casting verbal spells regardless of gag power. -Ball Gag Lover -Ball Gag Lover -Increase occurrence of ball gags, decrease occurrence of muzzles. -Increase occurrence of ball gags, decrease occurrence of muzzles. -Muzzle Lover -Muzzle Lover -Greatly increases the occurrence of muzzles. -Greatly increases the occurrence of muzzles. -Armbinder Lover -Armbinder Lover -More armbinders, less straitjackets. -More armbinders, less straitjackets. -Jacket Lover -Jacket Lover -More straitjackets, less armbinders. -More straitjackets, less armbinders. -Maid Sweeper -Maid Sweeper -Start in a magically locked maid outfit. -Start in a magically locked maid outfit. -Wolf Trainee -Wolf Trainee -Start in a uniform of a naughty wolfgirl. -Start in a uniform of a naughty wolfgirl. -Latex Doll -Latex Doll -Start bound in latex restraints. -Start bound in latex restraints. -Iron Slave -Iron Slave -Start in a full set of magically locked obsidian cuffs. -Start in a full set of magically locked obsidian cuffs. -Mana Burst -Mana Burst -While at 100% distraction, you get -100% miscast chance but spending too much mana at once may cause you to go over the edge. -While at 100% distraction, you get -100% miscast chance but spending too much mana at once may cause you to go over the edge. -Arousing Magic -Arousing Magic -Your magic is powered by otherworldly distracting energies. Casting spells increases distraction based on the mana spent. -Your magic is powered by otherworldly distracting energies. Casting spells increases distraction based on the mana spent. -Clearheaded -Clearheaded -Magic puts you in a clear state of mind. Casting spells successfully reduces your distraction. -Magic puts you in a clear state of mind. Casting spells successfully reduces your distraction. -Copy (clipboard) -Copy (clipboard) -Paste (clipboard) -Paste (clipboard) -DAMAGEDEALT electric damage conducts to you!!! -DAMAGEDEALT electric damage conducts to you!!! -The pressure fans the flames on you, dealing bonus DAMAGEDEALT fire damage! -The pressure fans the flames on you, dealing bonus DAMAGEDEALT fire damage! -The RestraintName comes off more easily in the presence of water! -The RestraintName comes off more easily in the presence of water! -You slip on the ice! -You slip on the ice! -The air around you is ablaze! (-DamageDealt SP) -The air around you is ablaze! (-DamageDealt SP) -The Goddess of Illusions shrouds you in shadows! -The Goddess of Illusions shrouds you in shadows! -You struggle against your bonds, but a magical force resists! -You struggle against your bonds, but a magical force resists! -The ropes squeeze you tighter and tighter... -The ropes squeeze you tighter and tighter... -Your body sinks deeper into a sea of bindings... -Your body sinks deeper into a sea of bindings... -You struggle to breath as you are buried alive in squirming ropes... -You struggle to breath as you are buried alive in squirming ropes... -You feel a force compelling you to stop resisting... -You feel a force compelling you to stop resisting... -Your body struggles to move as you feel a power sealing you! -Your body struggles to move as you feel a power sealing you! -The sarcophagus' door slides open as you are slowly pulled inside... -The sarcophagus' door slides open as you are slowly pulled inside... -The hands squeeze you tightly... -The hands squeeze you tightly... -More hands clasp over your body... -More hands clasp over your body... -You struggle to breath as you are pulled into the mass of shadow hands... -You struggle to breath as you are pulled into the mass of shadow hands... -The world goes dark... -The world goes dark... -You wake up in a different place... -You wake up in a different place... -Arcane Explosion -Arcane Explosion -EnemyName says something incomprehensible! Her spell miscasts! -EnemyName says something incomprehensible! Her spell miscasts! -EnemyName fumbles her next move! -EnemyName fumbles her next move! -The EnemyName utters a command word on the TargetName! -The EnemyName utters a command word on the TargetName! -Nipples -Nipples -Nipples -Nipples -Breasts -Breasts -Panties -Panties -Panties -Panties -Front -Front -Rear -Rear -Feet -Feet -Everywhere! -Everywhere! -Physical Armor: -Physical Armor: -Magic Armor: -Magic Armor: -In the Shadows: You are harder to see. -In the Shadows: You are harder to see. -Invisible: You are very difficult to see. -Invisible: You are very difficult to see. -Quickness: Your next movement is so fast it doesn't advance a turn. -Quickness: Your next movement is so fast it doesn't advance a turn. -All Damage Reduction: -All Damage Reduction: -You take PERCENT1 DAMAGETYPE damage, based on PERCENT2 DAMAGETYPE resist and PERCENT3 DAMAGECATEGORY modifier. -You take PERCENT1 DAMAGETYPE damage, based on PERCENT2 DAMAGETYPE resist and PERCENT3 DAMAGECATEGORY modifier. -You deal PERCENT more DAMAGETYPE damage. -You deal PERCENT more DAMAGETYPE damage. -Your bindings are PERCENT more effective. -Your bindings are PERCENT more effective. -Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage. -Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage. -Plugged! -Plugged! -Plugged up!!! -Plugged up!!! -Denied! You won't be getting off that easy~ -Denied! You won't be getting off that easy~ -Teasing vibrations... -Teasing vibrations... -Gentle vibrations... -Gentle vibrations... -Mild vibrations... -Mild vibrations... -Strong vibrations! -Strong vibrations! -Intense vibrations!! -Intense vibrations!! -Torturous vibrations!!! -Torturous vibrations!!! -Stunned! You can't move! -Stunned! You can't move! -Your vision is impaired! -Your vision is impaired! -Arms are bound! -Arms are bound! -Hands are useless! -Hands are useless! -Movement significantly impaired! -Movement significantly impaired! -Movement slightly impaired. -Movement slightly impaired. -Movement severely impaired! -Movement severely impaired! -Immobilized! -Immobilized! -Your mouth is free for potion-drinking and spellcasting activities. -Your mouth is free for potion-drinking and spellcasting activities. -Your vision is clear. -Your vision is clear. -Your hands are unobstructed. -Your hands are unobstructed. -Your arms are free to move as you please. -Your arms are free to move as you please. -Your legs are free and unimpeded. -Your legs are free and unimpeded. -You are gagged! Verbal miscast chance is increased and your potions are less effective! -You are gagged! Verbal miscast chance is increased and your potions are less effective! -Your mouth is totally filled! You can't drink potions and cant cast verbal spells! -Your mouth is totally filled! You can't drink potions and cant cast verbal spells! -Spell Empowerment! -Spell Empowerment! -Let there be light! -Let there be light! -You're seeing things... -You're seeing things... -You've been poisoned! -You've been poisoned! --50% MP Cost (Latex) --50% MP Cost (Latex) --50% MP Cost (Leather) --50% MP Cost (Leather) --50% MP Cost (Metal) --50% MP Cost (Metal) --50% MP Cost (Rope) --50% MP Cost (Rope) -Regeneration -Regeneration --50% MP Cost (Elements) --50% MP Cost (Elements) --50% MP Cost (Conjuration) --50% MP Cost (Conjuration) --50% MP Cost (Illusion) --50% MP Cost (Illusion) -Conductive: When you or an enemy takes electric damage, the other takes half of it as well! -Conductive: When you or an enemy takes electric damage, the other takes half of it as well! -Lightning Rod: Gain significantly boosted electric resist. -Lightning Rod: Gain significantly boosted electric resist. -Drenched: Grants fire resist, ice weakness, and makes you conductive. -Drenched: Grants fire resist, ice weakness, and makes you conductive. -Chilled: The cold makes it hard to move! You are slowed. -Chilled: The cold makes it hard to move! You are slowed. -Slimed: It's sticky and dense! You are slowed and 30% more vulnerable to glue damage. -Slimed: It's sticky and dense! You are slowed and 30% more vulnerable to glue damage. -Unsteady: You're on loose footing. You are easier to hit and are slowed. -Unsteady: You're on loose footing. You are easier to hit and are slowed. -Unsteady: You're on loose footing. You are easier to hit and are slowed. -Unsteady: You're on loose footing. You are easier to hit and are slowed. -Ignore Ice Tiles -Ignore Ice Tiles -Ignited: You are dealing fire damage to yourself and nearby enemies! -Ignited: You are dealing fire damage to yourself and nearby enemies! -You are on fire and taking damage! -You are on fire and taking damage! -Arcane Power: Deals bonus damage when you hit an enemy. -Arcane Power: Deals bonus damage when you hit an enemy. -Arcane Protection: Reduces damage taken, and deals retaliation damage. -Arcane Protection: Reduces damage taken, and deals retaliation damage. -Arcane Cunning: You turn invisible briefly after attacking. -Arcane Cunning: You turn invisible briefly after attacking. --MP Cost (Fire) --MP Cost (Fire) --MP Cost (Air) --MP Cost (Air) --MP Cost (Water) --MP Cost (Water) --MP Cost (Earth) --MP Cost (Earth) -Slime Form: You gain bonuses and can slip through bars! -Slime Form: You gain bonuses and can slip through bars! -Shroud: Visibility decreased, evasion increased. -Shroud: Visibility decreased, evasion increased. -Camoflage: While holding still, you are very hard to see. -Camoflage: While holding still, you are very hard to see. -Stone Skin: Increased armor. -Stone Skin: Increased armor. -Darkblade: Increased damage. -Darkblade: Increased damage. -Runic Ward: Increased Magic Armor. -Runic Ward: Increased Magic Armor. -Invisibility: It is very difficult for enemies to see you. -Invisibility: It is very difficult for enemies to see you. -Lesser Invisibility: It is harder for enemies to see you. -Lesser Invisibility: It is harder for enemies to see you. -FULL POWER: Cutting power increased. -FULL POWER: Cutting power increased. -Graceful: Struggling power increased. -Graceful: Struggling power increased. -Iron Blood: Reduced melee cost, increased mana costs. -Iron Blood: Reduced melee cost, increased mana costs. -Sleepy: You are sluggish and have a hard time keeping your eyes open. -Sleepy: You are sluggish and have a hard time keeping your eyes open. -Afterimage: Evasion greatly increased. -Afterimage: Evasion greatly increased. -We did it! We made outselves invisible--mmmmph!!! -We did it! We made outselves invisible--mmmmph!!! -Your restraints are disenchanted, treating them as nonmagical for purposes of cutting. -Your restraints are disenchanted, treating them as nonmagical for purposes of cutting. -You can launch another leather restraint instantly! -You can launch another leather restraint instantly! -Your motivation is powerful enough your spells cannot be stopped! -Your motivation is powerful enough your spells cannot be stopped! -Locked Down: Struggling power is greatly reduced. -Locked Down: Struggling power is greatly reduced. -Locked Down: Struggling power is greatly reduced. -Locked Down: Struggling power is greatly reduced. -Verbose: You can cast verbal spells while gagged. -Verbose: You can cast verbal spells while gagged. -Dextrous: You can cast arm spells while tied up. -Dextrous: You can cast arm spells while tied up. -Spell Dance: You can cast leg spells while tied up. -Spell Dance: You can cast leg spells while tied up. -Bondage Buster: Lazor is charging... -Bondage Buster: Lazor is charging... -Katana: Patience is key... -Katana: Patience is key... -Stormbreaker: You have the Power. -Stormbreaker: You have the Power. -Game Setup: -Game Setup: -Beginner: Get a save code every 3 levels -Beginner: Get a save code every 3 levels -Roguelike: No save codes, only autosave -Roguelike: No save codes, only autosave -Exciting: Orbs give random spells -Exciting: Orbs give random spells -Kinky: No save codes, orbs give random spells, start with very little -Kinky: No save codes, orbs give random spells, start with very little -Log -Log -Change Outfit -Change Outfit -Reset Outfit -Reset Outfit -Code -Code -Confirm Reset? -Confirm Reset? -(Copy the code above and save it on your computer to load later) -(Copy the code above and save it on your computer to load later) -You come across a black monolith with its face inscribed in runes. -You come across a black monolith with its face inscribed in runes. -You study them, but can't come up with an interpretation. -You study them, but can't come up with an interpretation. -They may still prove useful to future adventurers should you get caught... -They may still prove useful to future adventurers should you get caught... -(Your game has been saved automatically, but you can save the code for later) -(Your game has been saved automatically, but you can save the code for later) - - -Continue... -Continue... -Menu -Menu - - -I will simply wait to see what happens. -I will simply wait to see what happens. -Save my current progress. -Save my current progress. -Give up & delete save -Give up & delete save -Yes, delete my save file! -Yes, delete my save file! -Actually, I will let the enemy capture me instead. -Actually, I will let the enemy capture me instead. -Yes, jail me! -Yes, jail me! -No, I wish to press on -No, I wish to press on -See Perks -See Perks -This chest belongs to the FACTION -This chest belongs to the FACTION -Devious Dungeon Challenge is enabled. -Devious Dungeon Challenge is enabled. -Waiting for game data... -Waiting for game data... -You have surrendered to the dungeon and become its prisoner. -You have surrendered to the dungeon and become its prisoner. -Day and night, you wait that rescue may come some day. -Day and night, you wait that rescue may come some day. -Better luck next time! -Better luck next time! -You have reached the end of the playable portion. -You have reached the end of the playable portion. -Come back later for new dungeons! -Come back later for new dungeons! - - -Got the keys! Find the stairs to go to the next floor. -Got the keys! Find the stairs to go to the next floor. -You haven't found the keys for this floor yet. -You haven't found the keys for this floor yet. -Missing key -Missing key -Chance for a spell to fizzle: -Chance for a spell to fizzle: -Dodge Chance: Percent%, based on EVASIONSUM Evasion, -EVASIONPENALTY penalty from bindings -Dodge Chance: Percent%, based on EVASIONSUM Evasion, -EVASIONPENALTY penalty from bindings -Chance to block a level 10 restraint: Percent% -Chance to block a level 10 restraint: Percent% -Sight Range: RADIUS -Sight Range: RADIUS -Speed: SPD -Speed: SPD -Normal -Normal -Stunned! -Stunned! -Slowed -Slowed -Very Slow -Very Slow -Immobile -Immobile -DP: PERCENT% -DP: PERCENT% -SP: CURRENT/MAX -SP: CURRENT/MAX -Willpower: CURRENT/MAX -Willpower: CURRENT/MAX -MP: CURRENT/MAX -MP: CURRENT/MAX -Mana slowly recovers from a pool equal to POOLMANA. Drink potions to restore the pool. -Mana slowly recovers from a pool equal to POOLMANA. Drink potions to restore the pool. -Your minimum distraction increases over time as you encounter distracting things. -Your minimum distraction increases over time as you encounter distracting things. -Stamina recovers more quickly when you aren't spending it. -Stamina recovers more quickly when you aren't spending it. -Willpower is restored by food, sleep, and potions. Without willpower, it becomes very difficult to escape. -Willpower is restored by food, sleep, and potions. Without willpower, it becomes very difficult to escape. -Charge is used to power various magic items and weapons. -Charge is used to power various magic items and weapons. -WP: CURRENT/MAX -WP: CURRENT/MAX -Charge: PERCENT -Charge: PERCENT -Use Potion -Use Potion - MP - MP -Go to sleep -Go to sleep -Call for help! -Call for help! -Play with yourself -Play with yourself -Let go... -Let go... -Let go... -Let go... -Play with yourself -Play with yourself -Go to sleep -Go to sleep -Make noise! -Make noise! -Wait until interrupted -Wait until interrupted -Auto-struggle -Auto-struggle -Auto-path -Auto-path -Quick-Swap Weapon -Quick-Swap Weapon -Inspect -Inspect -Pass NPCs -Pass NPCs -Close a Door -Close a Door -Sprint/Hop -Sprint/Hop -Ahh! -Ahh! -Mmm... -Mmm... -Nnngh... -Nnngh... -Ooooh... -Ooooh... -(Breaths heavily) -(Breaths heavily) -(Moans softly) -(Moans softly) -(Incoherent mumbling) -(Incoherent mumbling) -(Moans loudly) -(Moans loudly) -(Heavy breathing) -(Heavy breathing) -(Moaning uncontrollably) -(Moaning uncontrollably) -(Shudders with pleasure) -(Shudders with pleasure) -You wait. -You wait. -You wait, legs trembling with arousal. -You wait, legs trembling with arousal. -You wait, trembling and moaning. -You wait, trembling and moaning. -You wait to regain your strength. -You wait to regain your strength. -You wait to regain your composure, panting with frustration. -You wait to regain your composure, panting with frustration. -You wait to regain your composure, shaking with frustration. -You wait to regain your composure, shaking with frustration. -You are exhausted from spellcasting. -You are exhausted from spellcasting. -You are feeling tired. -You are feeling tired. -You feel exhausted... -You feel exhausted... -You feel like you are going to pass out... -You feel like you are going to pass out... -Start New Game -Start New Game -New Game+ -New Game+ -Continue Last Save -Continue Last Save -Load From Code -Load From Code -Save Outfit (overwrites!) -Save Outfit (overwrites!) -Save Keybindings -Save Keybindings -Cancel Changes -Cancel Changes -Return -Return -Keybindings -Keybindings -Game Options -Game Options -Load from code -Load from code -Back to main menu -Back to main menu -Load Mod -Load Mod -Delete Mod -Delete Mod -Clear Perks -Clear Perks -Config -Config -Cancel -Cancel -Filter -Filter -DANGER: Loading a mod will execute ARBITRARY CODE on your machine. -DANGER: Loading a mod will execute ARBITRARY CODE on your machine. -Like connecting to a server, etc. Only load mods from a TRUSTED source. -Like connecting to a server, etc. Only load mods from a TRUSTED source. -Up -Up -Down -Down -Left -Left -Right -Right -Up Left -Up Left -Up Right -Up Right -Down Left -Down Left -Down Right -Down Right -Spell 1 -Spell 1 -Spell 2 -Spell 2 -Spell 3 -Spell 3 -Spell 4 -Spell 4 -Spell 5 -Spell 5 -Spell 6 -Spell 6 -Spell 7 -Spell 7 -Cycle Spell Page -Cycle Spell Page -Upcast Spells -Upcast Spells -Cancel Upcast -Cancel Upcast -Swap Weapon -Swap Weapon -Ranged Attack -Ranged Attack -Wait -Wait -Cancel/Back -Cancel/Back -Enter -Enter -Message Log -Message Log -Close Door -Close Door -Pass thru allies -Pass thru allies -Auto-Struggle -Auto-Struggle -Auto-Pathfind -Auto-Pathfind -Sprint/Hop -Sprint/Hop -Inspect -Inspect -Quick Inventory -Quick Inventory -Inventory -Inventory -Reputation -Reputation -Spell List -Spell List -Logbook -Logbook -Current Key Pressed -Current Key Pressed -Press a key, then press a button to set that key -Press a key, then press a button to set that key -Floor FLOORNUMBER: DUNGEONNAME -Floor FLOORNUMBER: DUNGEONNAME - - -Lockpicks: -Lockpicks: -Keys: -Keys: -Magic Keys: -Magic Keys: -Knife: -Knife: -Mag. Knife: -Mag. Knife: -You climb down to the next level -You climb down to the next level -You can't climb down until you get out of this leash... -You can't climb down until you get out of this leash... -You climb down and find yourself in a strange new place. -You climb down and find yourself in a strange new place. - plus XXX - plus XXX -Graveyard -Graveyard -Catacombs -Catacombs -Underground Jungle -Underground Jungle -Lost Temple -Lost Temple -The Bellows -The Bellows -Rundown Laboratory -Rundown Laboratory -Forgotten Garden -Forgotten Garden -Kingdom of Ice -Kingdom of Ice - - - - -The Mansion -The Mansion -Ancient Tombs -Ancient Tombs -Magic Library -Magic Library -Crystal Cave -Crystal Cave -Orrery -Orrery -Training Center -Training Center -Rubber Facility -Rubber Facility -Wizards' Den -Wizards' Den -Marble Halls -Marble Halls -Doll Storage -Doll Storage - - -You search through the debris but find nothing of note -You search through the debris but find nothing of note -You find some gold coins in a corner (+XXX gold) -You find some gold coins in a corner (+XXX gold) -You find a lockpick in a crack between the tiles -You find a lockpick in a crack between the tiles -You find a rusty knife among the rocks -You find a rusty knife among the rocks -You find an ordinary key -You find an ordinary key -You find a blue key, glowing with magic -You find a blue key, glowing with magic -You find a bola, crafted by bandits -You find a bola, crafted by bandits -You find some unexploded ordnance. -You find some unexploded ordnance. -You find a key lying atop an open tome! -You find a key lying atop an open tome! -You find a magical key lying atop an open tome! -You find a magical key lying atop an open tome! -You find a useful scroll wedged between some treatises! -You find a useful scroll wedged between some treatises! -You find a glowing book containing a binding spell! -You find a glowing book containing a binding spell! -You find a golden key surrounded by strange golden crystals. -You find a golden key surrounded by strange golden crystals. -You find a set of strange golden crystals. -You find a set of strange golden crystals. -You find a pack of scrolls used for spellcasting, and some strange golden crystals. -You find a pack of scrolls used for spellcasting, and some strange golden crystals. -You find a pack of scrolls used for spellcasting. -You find a pack of scrolls used for spellcasting. -You find a glowing scroll of purity. -You find a glowing scroll of purity. -The chest contains gold! (+XXX gold) -The chest contains gold! (+XXX gold) -The chest contains a glowing magical knife! -The chest contains a glowing magical knife! -The chest contains a keyring with a glowing magic key! -The chest contains a keyring with a glowing magic key! -Someone left their keys here... -Someone left their keys here... -You found some bolas left by bandits. -You found some bolas left by bandits. -You found some high explosives! -You found some high explosives! -You find a magic scroll, which you place in your spellbook. (+SpellLearned) -You find a magic scroll, which you place in your spellbook. (+SpellLearned) -You find an orb containing magical knowledge! (+AMOUNT spell points) -You find an orb containing magical knowledge! (+AMOUNT spell points) -You find a weapon! (+WeaponAcquired) -You find a weapon! (+WeaponAcquired) -You find a wearable item! (+ArmorAcquired) -You find a wearable item! (+ArmorAcquired) -You find gold and a magic trap! (+RestraintType) (+XXX gold) -You find gold and a magic trap! (+RestraintType) (+XXX gold) -Swirling belts emerge from the chest and leave you bound! (+RestraintType) -Swirling belts emerge from the chest and leave you bound! (+RestraintType) -You find gold and a chastity belt that locks around your waist! (+RestraintType) (+XXX gold) -You find gold and a chastity belt that locks around your waist! (+RestraintType) (+XXX gold) -You find gold and a tormenting magical trap! (+RestraintType) (+XXX gold) -You find gold and a tormenting magical trap! (+RestraintType) (+XXX gold) -You find gold, plus a filling and tormenting magical trap! (+RestraintType) (+XXX gold) -You find gold, plus a filling and tormenting magical trap! (+RestraintType) (+XXX gold) -You find gold, plus a devious magical trap! (+RestraintType) (+XXX gold) -You find gold, plus a devious magical trap! (+RestraintType) (+XXX gold) -Magical runes glow as a trap activates inside the chest! -Magical runes glow as a trap activates inside the chest! -You find a special collar that lets you absorb energy from potions. -You find a special collar that lets you absorb energy from potions. -You find a pair of garish pink high heels with a slippery surface. -You find a pair of garish pink high heels with a slippery surface. -The pearly chest contains a divine gift! (+ITEMGET) -The pearly chest contains a divine gift! (+ITEMGET) -Smoke fills the air around you! -Smoke fills the air around you! -You recover some of your lost items! -You recover some of your lost items! -You find a red potion with a sweet scent. -You find a red potion with a sweet scent. -You find a blue potion that glows with magical essence. -You find a blue potion that glows with magical essence. -You find a glowing orb, filled with untapped mana. -You find a glowing orb, filled with untapped mana. -You find three mana orbs strung together! -You find three mana orbs strung together! -You find several willpower potions. -You find several willpower potions. -You find several mana potions. -You find several mana potions. -You find a green potion, glowing warm with energy. -You find a green potion, glowing warm with energy. -You find a snow-like potion that's cold to the touch. -You find a snow-like potion that's cold to the touch. -You find a medley of potions. -You find a medley of potions. -Rarity: -Rarity: -Lesser -Lesser -Common -Common -Uncommon -Uncommon -Rare -Rare -Very Rare -Very Rare -Epic -Epic -Legendary -Legendary -Supreme -Supreme -Mythic -Mythic -Angelic -Angelic -Divine -Divine -Quantity: -Quantity: -Use Item (Consumes 1) -Use Item (Consumes 1) -way of the fist -way of the fist -Lockpick -Lockpick -Exit Keys -Exit Keys -Wizard's Outfit -Wizard's Outfit -Your favorite outfit for adventuring. -Your favorite outfit for adventuring. -Your original outfit. No bonuses -Your original outfit. No bonuses -Jail Uniform -Jail Uniform -The prisoners are kept in revealing outfits to keep them from hiding things. -The prisoners are kept in revealing outfits to keep them from hiding things. -A prisoner's 'outfit'. No bonuses, no penalties. -A prisoner's 'outfit'. No bonuses, no penalties. -Wolfgirl Suit -Wolfgirl Suit -An advanced suit designed for sport -An advanced suit designed for sport -No bonuses, no penalties. -No bonuses, no penalties. -Maid Uniform -Maid Uniform -An elegant dress meant to denote a maid's status. -An elegant dress meant to denote a maid's status. -Massively increases accuracy against slime mold. -Massively increases accuracy against slime mold. -Maid Uniform -Maid Uniform -An elegant dress meant to denote a maid's status. -An elegant dress meant to denote a maid's status. -Massively increases accuracy against slime mold. -Massively increases accuracy against slime mold. -Prisoner Uniform -Prisoner Uniform -The uniform of choice for girls captured by the dragonhearts. -The uniform of choice for girls captured by the dragonhearts. -Designed to make it hard to conceal weapons. No bonuses, no penalties. -Designed to make it hard to conceal weapons. No bonuses, no penalties. -Scientific Uniform -Scientific Uniform -An outfit designed to leave little to the imagination. -An outfit designed to leave little to the imagination. -No bonuses, no penalties. -No bonuses, no penalties. -Latex Catsuit -Latex Catsuit -An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. -An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. -No bonuses, no penalties. -No bonuses, no penalties. -Shadow Latex Dress -Shadow Latex Dress -A minidress made from shadow latex, a favorite of otherwordly patrons. -A minidress made from shadow latex, a favorite of otherwordly patrons. -No bonuses, no penalties. -No bonuses, no penalties. -Elven Dress -Elven Dress -A regal minidress worn by visitors to the forest. -A regal minidress worn by visitors to the forest. -No bonuses, no penalties. -No bonuses, no penalties. -Scroll of Sleight -Scroll of Sleight -The scroll makes your memories of arm movements clear as day! -The scroll makes your memories of arm movements clear as day! -A scroll used by thieves to make their plays in secret. -A scroll used by thieves to make their plays in secret. -Allows you to cast Arm spells without components for 12 turns. -Allows you to cast Arm spells without components for 12 turns. -Scroll of Purity -Scroll of Purity -The scroll circles around your body and you feel... empty now. -The scroll circles around your body and you feel... empty now. -A scroll used to enforce chastity within religious orders. -A scroll used to enforce chastity within religious orders. -Removes all vibrators from your body. -Removes all vibrators from your body. -Scroll of Speech -Scroll of Speech -The scroll makes your gagged speech slightly more intelligible! -The scroll makes your gagged speech slightly more intelligible! -A scroll used to help translate different languages. -A scroll used to help translate different languages. -Allows you to cast Verbal spells without components for 12 turns. -Allows you to cast Verbal spells without components for 12 turns. -Scroll of Sauntering -Scroll of Sauntering -The scroll lets you move your body in swift and accurate ways! -The scroll lets you move your body in swift and accurate ways! -A scroll used by dancers to upgrade their moves. -A scroll used by dancers to upgrade their moves. -Allows you to cast Leg spells without components for 12 turns. -Allows you to cast Leg spells without components for 12 turns. -Ancient Key -Ancient Key -Perhaps it has something to do with ancient restraints? -Perhaps it has something to do with ancient restraints? -An ancient key plated in gold. It doesnt look like it can open anything... -An ancient key plated in gold. It doesnt look like it can open anything... -You pick up a shining golden key. -You pick up a shining golden key. -You pick up a ReplaceValue. -You pick up a ReplaceValue. -Power Crystal -Power Crystal -You hold the crystal and the power flows into you. -You hold the crystal and the power flows into you. -You're not sure how they charged these... -You're not sure how they charged these... -A mysterious device used by the old civilization, powering their ancient devices. -A mysterious device used by the old civilization, powering their ancient devices. -You are already full of ancient power. -You are already full of ancient power. -Spent Power Crystal -Spent Power Crystal -You touch the spent crystal and it siphons 100 gold from your bag! -You touch the spent crystal and it siphons 100 gold from your bag! -You are not sure how to charge this back up. -You are not sure how to charge this back up. -You're not sure how they charged these... -You're not sure how they charged these... -A mysterious device used by the old civilization, now depleted. -A mysterious device used by the old civilization, now depleted. -Gold -Gold -Key -Key -A key with traces of magic that fades with one use. -A key with traces of magic that fades with one use. -Can be used to unlock a restraint, door, or chest. -Can be used to unlock a restraint, door, or chest. -Magic Key -Magic Key -A glowing key enchanted with magic that fades with one use. -A glowing key enchanted with magic that fades with one use. -Can be used to unlock a blue lock. -Can be used to unlock a blue lock. -Magic Key -Magic Key -A magical key with the power to open blue locks. -A magical key with the power to open blue locks. -Blue locks can't be otherwise picked. -Blue locks can't be otherwise picked. -Magic Knife -Magic Knife -A magical blade, suitable against ghosts. -A magical blade, suitable against ghosts. -Deals shadow damage. Can cut enchanted ropes. -Deals shadow damage. Can cut enchanted ropes. -Bola -Bola -A pair of weights attached to a rope. Can be thrown. -A pair of weights attached to a rope. Can be thrown. -Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. -Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. -A pair of weights attached to a rope. Can be thrown. -A pair of weights attached to a rope. Can be thrown. -Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. -Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. -Bomb -Bomb -After a 5 turn fuse, deals 100 fire damage in a 3x3 area. -After a 5 turn fuse, deals 100 fire damage in a 3x3 area. -Not a toy! -Not a toy! -After a 6 turn fuse, deals 100 fire damage in a 3x3 area. -After a 6 turn fuse, deals 100 fire damage in a 3x3 area. -Not a toy! -Not a toy! -You light the fuse! -You light the fuse! -Knife -Knife -Lockpick -Lockpick -A tool used to pick locks. -A tool used to pick locks. -Doesn't last forever, but can help in a pinch. -Doesn't last forever, but can help in a pinch. -lockpick x2 -lockpick x2 -lockpicks x4 -lockpicks x4 -Bola x3 -Bola x3 -Bomb x3 -Bomb x3 -Mana Potion -Mana Potion -You sip the mana potion and feel empowered. -You sip the mana potion and feel empowered. -A rare essence used by mages to recover their strength. -A rare essence used by mages to recover their strength. -Restores 50% max MP instantly. Excess mana goes into the mana pool. -Restores 50% max MP instantly. Excess mana goes into the mana pool. -Mana Orb -Mana Orb -You clutch the mana orb and feel its energy. -You clutch the mana orb and feel its energy. -Mystical energies swirl inside a glass form. -Mystical energies swirl inside a glass form. -Adds 200 MP to your mana pool. Requires no hands to use. -Adds 200 MP to your mana pool. Requires no hands to use. -Stamina Potion -Stamina Potion -You drink the stamina potion and feel invigorated. -You drink the stamina potion and feel invigorated. -A potion brimming with heat and energy. -A potion brimming with heat and energy. -Restores 50% stamina and 250% more over 25 turns. Effect does not stack. -Restores 50% stamina and 250% more over 25 turns. Effect does not stack. -Willpower Potion -Willpower Potion -You drink the willpower potion and feel motivated. -You drink the willpower potion and feel motivated. -A sweet potion, brimming with determination. -A sweet potion, brimming with determination. -Restores 25% willpower instantly. Can be used while gagged. -Restores 25% willpower instantly. Can be used while gagged. -Frigid Potion -Frigid Potion -You chug the concoction and your senses numb, helping you concentrate. -You chug the concoction and your senses numb, helping you concentrate. -A freezing cold bottle with a bitter scent. -A freezing cold bottle with a bitter scent. -Reduces distraction to 0 and grants additional decay for 50 turns. Can be used while gagged. -Reduces distraction to 0 and grants additional decay for 50 turns. Can be used while gagged. -Smoke Bomb -Smoke Bomb -You toss the smoke bomb and it explodes in your location! -You toss the smoke bomb and it explodes in your location! -A type of pyrotechnic often employed by saboteurs. Can be used without hands. -A type of pyrotechnic often employed by saboteurs. Can be used without hands. -Creates a smoke screen lasting 8 turns. You are harder to see while inside the smoke. -Creates a smoke screen lasting 8 turns. You are harder to see while inside the smoke. -Invisibility Potion -Invisibility Potion -You chug the concoction and see your body fading away. -You chug the concoction and see your body fading away. -You feel liquid inside, but you can't see it! -You feel liquid inside, but you can't see it! -Casts Invisibility on yourself. -Casts Invisibility on yourself. -Ectoplasm -Ectoplasm -Like a moisturizing cream, except it's made from coagulated souls. -Like a moisturizing cream, except it's made from coagulated souls. -Can be used without hands. Just apply directly to the forehead! -Can be used without hands. Just apply directly to the forehead! -Makes you harder to see for 10 turns. -Makes you harder to see for 10 turns. -Earth Rune -Earth Rune -You smash the rune in front of you, and glowing rocks rise from the earth. -You smash the rune in front of you, and glowing rocks rise from the earth. -It feels unsettling to look at. -It feels unsettling to look at. -Creates a 3x3 area of +20 armor centered on yourself for 9 turns. -Creates a 3x3 area of +20 armor centered on yourself for 9 turns. -Water Rune -Water Rune -You crush the rune in your hand, and it turns into water that coats the floor -You crush the rune in your hand, and it turns into water that coats the floor -It feels slimmy. -It feels slimmy. -Creates a 3x3 area on you for 9 turns. Gives +30 Magic Armor to friendlies, halves enemy speed. -Creates a 3x3 area on you for 9 turns. Gives +30 Magic Armor to friendlies, halves enemy speed. -Ice Rune -Ice Rune -You smash the rune in front of you, and icicles pierce through the floor! -You smash the rune in front of you, and icicles pierce through the floor! -It feels cold to the touch. -It feels cold to the touch. -Creates icicles around you for 5-8 turns. They deal 40 damage and freeze for 3 turns. -Creates icicles around you for 5-8 turns. They deal 40 damage and freeze for 3 turns. -The potion was less effective due to your gag! -The potion was less effective due to your gag! -Elven Soap -Elven Soap -You feel the restraints become loose on your skin! -You feel the restraints become loose on your skin! -The secret to elven cosmetics and blemish-free skin. -The secret to elven cosmetics and blemish-free skin. -Makes you slippery for 10 turns, boosting all forms of struggling. -Makes you slippery for 10 turns, boosting all forms of struggling. -You feel the restraints become loose on your skin! -You feel the restraints become loose on your skin! -Enchanted Grinder -Enchanted Grinder -The grinder starts spinning for a short time! Its cutting power is immense! -The grinder starts spinning for a short time! Its cutting power is immense! -The cutting disc is shining and very sharp. -The cutting disc is shining and very sharp. -Grants significantly increased cutting power for a short time. -Grants significantly increased cutting power for a short time. -The grinder starts spinning for a short time! Its cutting power is immense! -The grinder starts spinning for a short time! Its cutting power is immense! -Dollmaker's Staff -Dollmaker's Staff -You remember this being used on someone else. -You remember this being used on someone else. -+15% glue damage. Deals psychic damage. Fully bound enemies captured with this weapon become latex dolls which fight with you. -+15% glue damage. Deals psychic damage. Fully bound enemies captured with this weapon become latex dolls which fight with you. -You are unable to control more than 3 dolls. The new doll is protesting and remains bound. -You are unable to control more than 3 dolls. The new doll is protesting and remains bound. -Staff of Incineration -Staff of Incineration -A magical weapon made for intermediates to use. -A magical weapon made for intermediates to use. -+25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. -+25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. -Staff of Storms -Staff of Storms -A magical weapon made for intermediates to use. -A magical weapon made for intermediates to use. -+20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. -+20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. -Staff of Frostbite -Staff of Frostbite -A magical weapon with a 33% chance to freeze the target for 4 turns. -A magical weapon with a 33% chance to freeze the target for 4 turns. -+20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. -+20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. -Staff of Binding -Staff of Binding -A magical weapon made to use on novices. -A magical weapon made to use on novices. -+20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. -+20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. -Arcane Orb -Arcane Orb -Look into my eyes... -Look into my eyes... -Deals shadow damage. Can be used without hands. Does not benefit from enemies being vulnerable. -Deals shadow damage. Can be used without hands. Does not benefit from enemies being vulnerable. -Staff of Flame -Staff of Flame -A magical weapon made for novices to use. -A magical weapon made for novices to use. -+15% fire damage. Deals fire damage. -+15% fire damage. Deals fire damage. -Staff of Slime -Staff of Slime -A slimy and magical implement.. -A slimy and magical implement.. -+10% glue damage. Deals glue damage. -+10% glue damage. Deals glue damage. -Staff of Shocking -Staff of Shocking -A magical weapon made for novices to use. -A magical weapon made for novices to use. -+10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. -+10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. -Staff of Permafrost -Staff of Permafrost -A magical weapon with a 15% chance to freeze the target for 4 turns. -A magical weapon with a 15% chance to freeze the target for 4 turns. -+10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration) -+10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration) -Staff of Chains -Staff of Chains -A magical weapon made for novices in the art of bondage. -A magical weapon made for novices in the art of bondage. -+10% chain damage. Deals chain damage. 150% binding efficiency. -+10% chain damage. Deals chain damage. 150% binding efficiency. -You pick up a staff of binding. You remember these from wizard school... -You pick up a staff of binding. You remember these from wizard school... -You pick up a staff of the storm. Your hair stands on end. -You pick up a staff of the storm. Your hair stands on end. -You pick up a staff of incineration. It rumbles with molten fury. -You pick up a staff of incineration. It rumbles with molten fury. -You pick up a staff with a name on it: DOLLMAKER -You pick up a staff with a name on it: DOLLMAKER -You pick up a staff of frostbite. Your hand feels numb just reaching for it. -You pick up a staff of frostbite. Your hand feels numb just reaching for it. -You pick up a staff of chains. You have fond memories... -You pick up a staff of chains. You have fond memories... -You pick up a staff of the storm. It tingles. -You pick up a staff of the storm. It tingles. -You pick up a staff of flames. It feels warm. -You pick up a staff of flames. It feels warm. -You find a purple crystal. You feel your mystic powers flood into it. -You find a purple crystal. You feel your mystic powers flood into it. -You pick up a staff of slime. -You pick up a staff of slime. -You pick up a staff of permafrost. It feels icy to the touch. -You pick up a staff of permafrost. It feels icy to the touch. -Crop -Crop -For those unruly subs. -For those unruly subs. -Deals pain damage. Highly distracting. -Deals pain damage. Highly distracting. -You pick up a riding crop. -You pick up a riding crop. -Scissors -Scissors -Safety first! -Safety first! -Deals slash damage. Better than a knife for cutting restraints. -Deals slash damage. Better than a knife for cutting restraints. -You pick up a pair of scissors. -You pick up a pair of scissors. -Dagger -Dagger -Designed with subterfuge in mind. -Designed with subterfuge in mind. -Deals slash damage. Deals 55 pierce damage instead on unaware targets. -Deals slash damage. Deals 55 pierce damage instead on unaware targets. -You pick up a dagger. -You pick up a dagger. -Katana -Katana -She who strikes first, hits second. -She who strikes first, hits second. -Deals slash damage. Deals up to 50 bonus damage by waiting 10 turns between attacks. -Deals slash damage. Deals up to 50 bonus damage by waiting 10 turns between attacks. -You pick up a katana. -You pick up a katana. -Shadow's Edge -Shadow's Edge -For those who truly devote themselves to the cause. -For those who truly devote themselves to the cause. -Deals shadow damage. Damage is doubled against enemies that are in shadow. -Deals shadow damage. Damage is doubled against enemies that are in shadow. -You pick up Shadow's Edge. -You pick up Shadow's Edge. -Stormbreaker -Stormbreaker -I have the power! Taking electric damage charges you (1 turn/10dmg). -I have the power! Taking electric damage charges you (1 turn/10dmg). -Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. -Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. -You pick up Stormbreaker. -You pick up Stormbreaker. -Rapier -Rapier -For the ostentatious and flashy duelist. -For the ostentatious and flashy duelist. -Deals slash damage. Deals 50 pierce damage instead on vulnerable targets. -Deals slash damage. Deals 50 pierce damage instead on vulnerable targets. -You pick up some kind of pretentious sword. -You pick up some kind of pretentious sword. -Foil -Foil -En garde! -En garde! -Deals pierce damage. Deals 30 damage instead on vulnerable targets. -Deals pierce damage. Deals 30 damage instead on vulnerable targets. -You pick up a fencing sword. -You pick up a fencing sword. -Hammer -Hammer -A rather simplistic bludgeoning weapon. -A rather simplistic bludgeoning weapon. -Deals crush damage and knocks the target back. -Deals crush damage and knocks the target back. -Flail -Flail -A ball on a chain. Very fast and hard to dodge. -A ball on a chain. Very fast and hard to dodge. -Also deals 10 damage to targets next to you. Deals crush damage. -Also deals 10 damage to targets next to you. Deals crush damage. -Spear -Spear -Speak softly and carry a pointy stick. -Speak softly and carry a pointy stick. -Deals pierce damage to the target and one square behind it. -Deals pierce damage to the target and one square behind it. -Bolt Cutters -Bolt Cutters -A cutting tool useful as a bludgeon, and also for cutting locks and chains. -A cutting tool useful as a bludgeon, and also for cutting locks and chains. -Also assists in cutting restraints when equipped. -Also assists in cutting restraints when equipped. -A go-to for travelers and adventurers. -A go-to for travelers and adventurers. -Deals slash damage. -Deals slash damage. -Torch -Torch -Second only to the mighty towel in usefulness. -Second only to the mighty towel in usefulness. -Deals fire damage. Provides light. -Deals fire damage. Provides light. -Unarmed -Unarmed -Fight with your hands and feet. -Fight with your hands and feet. -Deals unarmed damage. -Deals unarmed damage. -Sword -Sword -The blade is strong, its edge sharp. -The blade is strong, its edge sharp. -A fast and accurate weapon that deals slash damage. -A fast and accurate weapon that deals slash damage. -Flamberge -Flamberge -A blade forged in a magical fire. -A blade forged in a magical fire. -Deals 20 bonus fire damage on hit. -Deals 20 bonus fire damage on hit. -Escort Drone -Escort Drone -A semi-autonomous drone with a personal defense beam. Does not require hands to equip. -A semi-autonomous drone with a personal defense beam. Does not require hands to equip. -Deals electric damage. 33% chance to stun for 4 turns. -Deals electric damage. 33% chance to stun for 4 turns. -Magic Wand -Magic Wand -Its powers extend beyond the traditional schools of magic. -Its powers extend beyond the traditional schools of magic. -Deals charm damage (50% effectiveness vs. non-vulnerable enemies). 20% chance to stun the target for 2 turns. -Deals charm damage (50% effectiveness vs. non-vulnerable enemies). 20% chance to stun the target for 2 turns. -Feather -Feather -A feather useful for tickling. -A feather useful for tickling. -Deals tickle damage (50% effectiveness vs. non-vulnerable enemies). Distracts enemies. -Deals tickle damage (50% effectiveness vs. non-vulnerable enemies). Distracts enemies. -Ice Cube -Ice Cube -A magical cube of ice that never melts. Convenient! -A magical cube of ice that never melts. Convenient! -Deals 10 ice damage with a 10% chance to freeze for 3 turns. -Deals 10 ice damage with a 10% chance to freeze for 3 turns. -Rope -Rope -A kidnapper's most versatile tool. -A kidnapper's most versatile tool. -Deals chain damage and applies 50 points of binding. -Deals chain damage and applies 50 points of binding. -Enchanted Sword -Enchanted Sword -Slices through ghosts with ease! -Slices through ghosts with ease! -A sword that guides itself toward its target, making it easy to hit with. -A sword that guides itself toward its target, making it easy to hit with. -Dragonslaver -Dragonslaver -A powerful weapon with an ancient mechanism that launches binding belts. -A powerful weapon with an ancient mechanism that launches binding belts. -Deals slash damage. Can make ranged attacks.. Drains 0.75% ancient energy to fire a line of belts that deal 40 chain damage and 40 binding. -Deals slash damage. Can make ranged attacks.. Drains 0.75% ancient energy to fire a line of belts that deal 40 chain damage and 40 binding. -Metamorphosis -Metamorphosis -You can enter slime form for 25 turns, which lets you pass thru bars, +50 Evasion, and deals 25 glue damage when attacked. -You can enter slime form for 25 turns, which lets you pass thru bars, +50 Evasion, and deals 25 glue damage when attacked. -Deals glue damage. Roots targets for 2 turns on a hit. -Deals glue damage. Roots targets for 2 turns on a hit. -Four Seasons -Four Seasons -Activate to reduce the cost of your next fire, water/ice, air/lightning, and earth spell by 50, once per element. -Activate to reduce the cost of your next fire, water/ice, air/lightning, and earth spell by 50, once per element. -Deals shadow damage. +25% fire, ice, acid, crush, electric, pressure damage. -Deals shadow damage. +25% fire, ice, acid, crush, electric, pressure damage. -The Arbiter -The Arbiter -I have altered the rules. Pray I do not alter them further. -I have altered the rules. Pray I do not alter them further. -Deals chain damage with 110% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Ranged attack: Disarm -Deals chain damage with 110% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Ranged attack: Disarm -Bondage Buster -Bondage Buster -Can fire a beam (1 turn channel) that deals 30 electric damage, but charges when not fired, dealing 90 total damage at 10 turns of charge. -Can fire a beam (1 turn channel) that deals 30 electric damage, but charges when not fired, dealing 90 total damage at 10 turns of charge. -Melee mode deals tickle damage and marks enemies as vulnerable for 4 turns. -Melee mode deals tickle damage and marks enemies as vulnerable for 4 turns. -Nevermere Blaster -Nevermere Blaster -Can fire a blast that deals 25 electric damage. -Can fire a blast that deals 25 electric damage. -Melee mode deals tickle damage. -Melee mode deals tickle damage. -Blaster Shot -Blaster Shot -You set your blaster to stun and fire! -You set your blaster to stun and fire! -Messenger of Love -Messenger of Love -Love shines in many ways... -Love shines in many ways... -Can fire an arrow that makes an enemy extremely lustful, causing them to attack others. Lasts forever on lesser enemies, 30 turns on high-level enemies, and 10 turns on bosses. -Can fire an arrow that makes an enemy extremely lustful, causing them to attack others. Lasts forever on lesser enemies, 30 turns on high-level enemies, and 10 turns on bosses. -Moirai's Scissors -Moirai's Scissors -Safety first! -Safety first! -Deals slash damage. Adds up to 30 bonus psychic damage her hit by converting binding into damage. Drains 5 charge to attack twice. -Deals slash damage. Adds up to 30 bonus psychic damage her hit by converting binding into damage. Drains 5 charge to attack twice. -Latex Projector -Latex Projector -Deals crush damage. Can be used to spray a '+' shaped pool of slime. -Deals crush damage. Can be used to spray a '+' shaped pool of slime. -Drains 1.5% ancient energy to create a pool of slime that deals 35 glue damage per tile and slows enemies. -Drains 1.5% ancient energy to create a pool of slime that deals 35 glue damage per tile and slows enemies. -Enchanted Axe -Enchanted Axe -Sick and vile, like the hearts of your enemies. -Sick and vile, like the hearts of your enemies. -Deals shadow damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns. -Deals shadow damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns. -Pickaxe -Pickaxe -Used for drilling holes in rock and armor. -Used for drilling holes in rock and armor. -Deals pierce damage. Reduces enemy armor by 15 for 6 turns. -Deals pierce damage. Reduces enemy armor by 15 for 6 turns. -Enchanted Flail -Enchanted Flail -A blessed censer that distributes pain equally. -A blessed censer that distributes pain equally. -Deals crush damage to the target and all enemies near the target. -Deals crush damage to the target and all enemies near the target. -Enchanted Spear -Enchanted Spear -Seeks and pierces hearts with ease. -Seeks and pierces hearts with ease. -Deals pierce damage to the target and two squares behind it. -Deals pierce damage to the target and two squares behind it. -Enchanted Hammer -Enchanted Hammer -Made of a magical, resonant material. -Made of a magical, resonant material. -Deals crush damage and knocks the target back. Helps to bash open restraints while cutting. -Deals crush damage and knocks the target back. Helps to bash open restraints while cutting. -IceBreaker -IceBreaker -A frigid lightweight hammer with a spike on the end. -A frigid lightweight hammer with a spike on the end. -Deals crush damage. Deals 3x damage to frozen targets instead of 2x. Triggers Shatter. -Deals crush damage. Deals 3x damage to frozen targets instead of 2x. Triggers Shatter. -Dreamcatcher -Dreamcatcher -Forged in nightmares, woven in steel. Summons a Shadow Warrior on unaware targets for 2% ancient energy. -Forged in nightmares, woven in steel. Summons a Shadow Warrior on unaware targets for 2% ancient energy. -Deals shadow damage. Deals up to 30 bonus psychic damage on unaware (100%) or vulnerable (50%) targets. -Deals shadow damage. Deals up to 30 bonus psychic damage on unaware (100%) or vulnerable (50%) targets. -Axe -Axe -Great for cutting trees that happen to be underground. -Great for cutting trees that happen to be underground. -Also deals 20 damage to enemies next to you. Deals slash damage. -Also deals 20 damage to enemies next to you. Deals slash damage. -Knife -Knife -Unarmed -Unarmed -Accuracy: -Accuracy: -Find the keys.. -Find the keys.. -Find the exit! -Find the exit! -You are receiving help from a friendly ally. -You are receiving help from a friendly ally. -You found a hook you can use to pull on straps and loops. -You found a hook you can use to pull on straps and loops. -You have access to something sharp and can attempt to cut restraints. -You have access to something sharp and can attempt to cut restraints. -You found a corner to help manipulate buckles and snaps with. -You found a corner to help manipulate buckles and snaps with. -You found a crack and could maybe wedge a knife or tool into it to keep it still. -You found a crack and could maybe wedge a knife or tool into it to keep it still. -You found something sticky and might be able to pull off fabrics. -You found something sticky and might be able to pull off fabrics. -Evasion: -Evasion: -Visibility: -Visibility: -Submissive: Enemies won't attack you, but they will try to play with you. -Submissive: Enemies won't attack you, but they will try to play with you. -On the Run! Enemies are hostile. -On the Run! Enemies are hostile. -Prisoner: Enemies won't attack you unless you are out of jail. -Prisoner: Enemies won't attack you unless you are out of jail. -Freedom -Freedom -Crawling slowly! -Crawling slowly! -Inching slowly! -Inching slowly! -Hopping slowly! -Hopping slowly! -Slowed! -Slowed! -Immobile! -Immobile! -Enclosed! -Enclosed! -You feel a gentle buzz... -You feel a gentle buzz... -Your toys tease you gently... -Your toys tease you gently... -Your toys are vibrating. -Your toys are vibrating. -Your toys are buzzing strongly! -Your toys are buzzing strongly! -Your toys vibrate intensely! -Your toys vibrate intensely! -The vibration is torturous! -The vibration is torturous! -Edged! -Edged! -Satisfied~ -Satisfied~ -Damage: -Damage: -Accuracy: -Accuracy: -SP Cost: -SP Cost: -It appears to be a receptacle -It appears to be a receptacle -Place live crystal -Place live crystal -Take the crystal -Take the crystal -You place the crystal into the receptacle and it lights up! -You place the crystal into the receptacle and it lights up! -You take the crystal from the receptacle and all goes dark. -You take the crystal from the receptacle and all goes dark. -You try to take the crystal but the cage around it is secured with a purple lock. -You try to take the crystal but the cage around it is secured with a purple lock. -Place spent crystal -Place spent crystal -VALUE gold vanishes from your satchel as the receptacle explodes and your crystal is recharged! -VALUE gold vanishes from your satchel as the receptacle explodes and your crystal is recharged! -Nothing seems to happen -Nothing seems to happen -The EnemyName grabs you by the RestraintName and keeps you in place! -The EnemyName grabs you by the RestraintName and keeps you in place! -The EnemyName grabs you and pulls you!!! -The EnemyName grabs you and pulls you!!! -The EnemyName misses you! -The EnemyName misses you! -You hear a door creak open nearby! -You hear a door creak open nearby! -You hear the faint sound of a door opening. -You hear the faint sound of a door opening. -You hear a door slam shut nearby! -You hear a door slam shut nearby! -You hear a door being shut in the distance. -You hear a door being shut in the distance. -The slime is spreading over your body!!! -The slime is spreading over your body!!! -The slime starts to harden over your skin... -The slime starts to harden over your skin... -Angel -Angel -You subdue the angel! -You subdue the angel! -The angel decides to toy with you while you are trussed up. (DamageTaken) -The angel decides to toy with you while you are trussed up. (DamageTaken) -The angel snaps her fingers and divine restraints appear on your body! (+RestraintAdded) -The angel snaps her fingers and divine restraints appear on your body! (+RestraintAdded) -The angel snaps her fingers and glowing locks appear on your body! -The angel snaps her fingers and glowing locks appear on your body! -Holy Construct -Holy Construct -You banish the holy construct! -You banish the holy construct! -The holy construct emits a searing light! (DamageTaken) -The holy construct emits a searing light! (DamageTaken) -The holy construct emits a blinding light! (DamageTaken) -The holy construct emits a blinding light! (DamageTaken) -The holy construct emits a Binding light! (+RestraintAdded) -The holy construct emits a Binding light! (+RestraintAdded) -Be not afraid! I am the courier of a local shrine, and I have come to take your offering. -Be not afraid! I am the courier of a local shrine, and I have come to take your offering. -Hold still and I will take the offering... -Hold still and I will take the offering... -(She takes the gold) -(She takes the gold) -Peace be with you! Goodbye! -Peace be with you! Goodbye! -You don't have the gold, do you? -You don't have the gold, do you? -But do not fear, we will keep this between you and I... -But do not fear, we will keep this between you and I... -For I will first have a little fun... -For I will first have a little fun... -You have brought this upon yourself, after all. -You have brought this upon yourself, after all. -The angel frowns as you attack her, and glowing rings appear. -The angel frowns as you attack her, and glowing rings appear. -Angel: MMMMMPHH!!! -Angel: MMMMMPHH!!! -(The angel looks puzzled and unlocks your divine restraints) -(The angel looks puzzled and unlocks your divine restraints) -Your ArmorName blocks the EnemyName's attack, falling off in the process. -Your ArmorName blocks the EnemyName's attack, falling off in the process. -The EnemyName bypasses your security to add the RestraintName! -The EnemyName bypasses your security to add the RestraintName! -The EnemyName attacks you, but you block the attack! -The EnemyName attacks you, but you block the attack! -Blocked! -Blocked! -Mystic Lock -Mystic Lock -The mystic lock fades, allowing you to pass once more. -The mystic lock fades, allowing you to pass once more. -As you cross the threshold, a mystical lock appears to prevent you from stepping back! -As you cross the threshold, a mystical lock appears to prevent you from stepping back! -As you cross the threshold, a mystical lock appears to prevent you from stepping back! -As you cross the threshold, a mystical lock appears to prevent you from stepping back! -Metal Shield -Metal Shield -The shield falls to the floor. -The shield falls to the floor. -A metal shield blocks your way! -A metal shield blocks your way! -Several metal shields block your way! -Several metal shields block your way! -Illusion -Illusion -The illusion vanishes into thin air. -The illusion vanishes into thin air. -Wall -Wall -The wall shatters into pieces, which fade away slowly. -The wall shatters into pieces, which fade away slowly. -Earthen Monolith -Earthen Monolith -The monolith recedes into the ground. -The monolith recedes into the ground. -Static Sphere -Static Sphere -The sphere shrinks back into the storm dimension. -The sphere shrinks back into the storm dimension. -Familiar -Familiar -The familiar dissolves into spectral ash. -The familiar dissolves into spectral ash. -Latex Doll -Latex Doll -The doll gives in to her desires and squirms around on the ground. -The doll gives in to her desires and squirms around on the ground. -Storm Crystal -Storm Crystal -The storm crystal shatters into many crackling pieces. -The storm crystal shatters into many crackling pieces. -Fire Mote -Fire Mote -The fire mote is extinguished. -The fire mote is extinguished. -Air Mote -Air Mote -The air mote returns to dust. -The air mote returns to dust. -Water Mote -Water Mote -The water mote turns into a puddle. -The water mote turns into a puddle. -Earth Mote -Earth Mote -The earth mote crumbles. -The earth mote crumbles. -Shadow Warrior -Shadow Warrior -The shadow warrior screeches as it vanishes into mist. -The shadow warrior screeches as it vanishes into mist. -Allied Golem -Allied Golem -The words vanish from the golem's forehead as it crashes down. -The words vanish from the golem's forehead as it crashes down. -Shopkeeper -Shopkeeper -You have done a terrible deed. -You have done a terrible deed. -Shopkeeper -Shopkeeper -You have done a terrible deed. -You have done a terrible deed. -Crystal Monolith -Crystal Monolith -The crystal fades from the monolith. -The crystal fades from the monolith. -Orb Guardian -Orb Guardian -The Orb Guardian dissolves into sand and bone dust. -The Orb Guardian dissolves into sand and bone dust. -You feel like you have made a grave mistake. -You feel like you have made a grave mistake. -Zombie -Zombie -The zombie moans and collapses to the ground. -The zombie moans and collapses to the ground. -The zombie's charms attach to your body (+RestraintAdded) -The zombie's charms attach to your body (+RestraintAdded) -The zombie caresses your body! (DamageTaken) -The zombie caresses your body! (DamageTaken) -Maidforce Recruit -Maidforce Recruit -The maid does a fumbled retreat. -The maid does a fumbled retreat. -The maid uses a fast-binding technique! (+RestraintAdded) -The maid uses a fast-binding technique! (+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -The maid snaps a lock on one of your restraints! (DamageTaken) -The maid tickles you with her feather duster! (DamageTaken) -The maid tickles you with her feather duster! (DamageTaken) -M.F. 'Unseen Blade' -M.F. 'Unseen Blade' -The maid runs back to the shadows. -The maid runs back to the shadows. -The maid uses secure restraints on you! (+RestraintAdded) -The maid uses secure restraints on you! (+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -The maid snaps a lock on one of your restraints! (DamageTaken) -The maid stealthily rubs your sensitive areas! (DamageTaken) -The maid stealthily rubs your sensitive areas! (DamageTaken) -The maid throws a smoke bomb at the ground! -The maid throws a smoke bomb at the ground! -M.F. 'Unseen Blade' -M.F. 'Unseen Blade' -The maid does a fumbled retreat. -The maid does a fumbled retreat. -The maid rubs you from many angles! (DamageTaken) -The maid rubs you from many angles! (DamageTaken) -M.F. 'Going Loud' -M.F. 'Going Loud' -The maid does a fumbled retreat. -The maid does a fumbled retreat. -The maid uses secure restraints on you! (+RestraintAdded) -The maid uses secure restraints on you! (+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -The maid snaps a lock on one of your restraints! (DamageTaken) -The maid lands a kick and stuns you! (DamageTaken) -The maid lands a kick and stuns you! (DamageTaken) -The maid slaps you with a scornful expression! (DamageTaken) -The maid slaps you with a scornful expression! (DamageTaken) -M.F. 'Parasol' -M.F. 'Parasol' -The maid leaps out of sight. -The maid leaps out of sight. -The maid uses secure restraints on you! (+RestraintAdded) -The maid uses secure restraints on you! (+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -The maid snaps a lock on one of your restraints! (DamageTaken) -The maid caresses your breasts with a smile! (DamageTaken) -The maid caresses your breasts with a smile! (DamageTaken) -M.F. 'Master Plan' -M.F. 'Master Plan' -The head maid surrenders gracefully. -The head maid surrenders gracefully. -The head maid suddenly whips out a restraint and locks it on! (+RestraintAdded) -The head maid suddenly whips out a restraint and locks it on! (+RestraintAdded) -The head maid snaps her fingers and you find your restraints locked! (DamageTaken) -The head maid snaps her fingers and you find your restraints locked! (DamageTaken) -The head maid tickles you strategically! (DamageTaken) -The head maid tickles you strategically! (DamageTaken) -You are distracted for a moment and suddenly you find yourself in chastity! -You are distracted for a moment and suddenly you find yourself in chastity! -Fire Elemental -Fire Elemental -The fire elemental dissolves into ash. -The fire elemental dissolves into ash. -The fire elemental conjures forged restraints around your limbs! (+RestraintAdded) -The fire elemental conjures forged restraints around your limbs! (+RestraintAdded) -The fire elemental places a heavy lock on your restraint! (DamageTaken) -The fire elemental places a heavy lock on your restraint! (DamageTaken) -The fire elemental touches you with her burning finger! (DamageTaken) -The fire elemental touches you with her burning finger! (DamageTaken) -Ranger of the Wild -Ranger of the Wild -The ranger disappears into the environment. -The ranger disappears into the environment. -The ranger gropes your chest with a smile on her face! (DamageTaken) -The ranger gropes your chest with a smile on her face! (DamageTaken) -The ranger surprises you and binds you! (+RestraintAdded) -The ranger surprises you and binds you! (+RestraintAdded) -The ranger slips a lock onto one of your restraints! (DamageTaken) -The ranger slips a lock onto one of your restraints! (DamageTaken) -Druid of the Wild -Druid of the Wild -The druid calls forth vines to mask her retreat. -The druid calls forth vines to mask her retreat. -The druid calls forth vines to mask her retreat. -The druid calls forth vines to mask her retreat. -The druid holds your face and kisses you! (DamageTaken) -The druid holds your face and kisses you! (DamageTaken) -The druid binds you with mithril restraints! (+RestraintAdded) -The druid binds you with mithril restraints! (+RestraintAdded) -The druid tosses a lock from her cloak! It finds you and fastens with a click. (DamageTaken) -The druid tosses a lock from her cloak! It finds you and fastens with a click. (DamageTaken) -Water Elemental -Water Elemental -The water elemental melts into a pool of water. -The water elemental melts into a pool of water. -The water elemental's song compels you to be bound! (+RestraintAdded) -The water elemental's song compels you to be bound! (+RestraintAdded) -The water elemental sings a song of helplessness. (DamageTaken) -The water elemental sings a song of helplessness. (DamageTaken) -The water elemental's song compels you to step forward and receive a binding! -The water elemental's song compels you to step forward and receive a binding! -The water elemental sings an arousing song! (DamageTaken) -The water elemental sings an arousing song! (DamageTaken) -Ice Elemental -Ice Elemental -The ice elemental melts into a pool of water. -The ice elemental melts into a pool of water. -The ice elemental touches you, forming tendrils of ice! (+RestraintAdded) -The ice elemental touches you, forming tendrils of ice! (+RestraintAdded) -The ice elemental creates icy locks on your restraints! -The ice elemental creates icy locks on your restraints! -The ice elemental gives a chilling touch to your body! (DamageTaken) -The ice elemental gives a chilling touch to your body! (DamageTaken) -Earth Elemental -Earth Elemental -The earth elemental sinks into the ground. -The earth elemental sinks into the ground. -The earth elemental pins you and slaps on some restraints! (+RestraintAdded) -The earth elemental pins you and slaps on some restraints! (+RestraintAdded) -The earth elemental locks a restraint! -The earth elemental locks a restraint! -The earth elemental dashes through the earth! -The earth elemental dashes through the earth! -The earth elemental gives you a heavy massage! (DamageTaken) -The earth elemental gives you a heavy massage! (DamageTaken) -Air Elemental -Air Elemental -There is no more elemental. Must have been just the wind. -There is no more elemental. Must have been just the wind. -The air elemental sneakily slips a restraint on! (+RestraintAdded) -The air elemental sneakily slips a restraint on! (+RestraintAdded) -The air elemental blinks to your position! -The air elemental blinks to your position! -The air elemental slips a lock on! (DamageTaken) -The air elemental slips a lock on! (DamageTaken) -The air elemental spanks you playfully! (DamageTaken) -The air elemental spanks you playfully! (DamageTaken) -Angry Zombie -Angry Zombie -The zombie screams and tumbles to the floor. -The zombie screams and tumbles to the floor. -The zombie swiftly wraps you in charms! (+RestraintAdded) -The zombie swiftly wraps you in charms! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -The zombie gropes your body! (DamageTaken) -Zombie -Zombie -The zombie screams and tumbles to the floor. -The zombie screams and tumbles to the floor. -The zombie swiftly wraps you in charms! (+RestraintAdded) -The zombie swiftly wraps you in charms! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -The zombie gropes your body! (DamageTaken) -Artistic Zombie -Artistic Zombie -The zombie smiles as it collapses to the ground. -The zombie smiles as it collapses to the ground. -The zombie swiftly ties you! (+RestraintAdded) -The zombie swiftly ties you! (+RestraintAdded) -The zombie is somehow dextrous enough to lock your restraint! (DamageTaken) -The zombie is somehow dextrous enough to lock your restraint! (DamageTaken) -The zombie cuddles with your body! (DamageTaken) -The zombie cuddles with your body! (DamageTaken) -Mage Zombie -Mage Zombie -The zombie frowns and disappears in a puff of ice and ribbons. -The zombie frowns and disappears in a puff of ice and ribbons. -The zombie smiles as she wraps you in charms! (+RestraintAdded) -The zombie smiles as she wraps you in charms! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -The zombie gropes your body! (DamageTaken) -The zombie's ribbons form magical locks on your body! (DamageTaken) -The zombie's ribbons form magical locks on your body! (DamageTaken) -Talisman Zombie -Talisman Zombie -The zombie pouts and puts up a shield to let her retreat. -The zombie pouts and puts up a shield to let her retreat. -The zombie giggles as she wraps you in charms! (+RestraintAdded) -The zombie giggles as she wraps you in charms! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -The zombie gropes your body! (DamageTaken) -The zombie uses a sealing spell to create magical locks! (DamageTaken) -The zombie uses a sealing spell to create magical locks! (DamageTaken) -Warrior Zombie -Warrior Zombie -The warrior zombie yells and falls cinematically. -The warrior zombie yells and falls cinematically. -The warrior zombie uses a traditional binding technique (+RestraintAdded) -The warrior zombie uses a traditional binding technique (+RestraintAdded) -The warrior zombie strikes you with her wooden sword! (+STUN) -The warrior zombie strikes you with her wooden sword! (+STUN) -The warrior zombie runs its fingers along your body! (DamageTaken) -The warrior zombie runs its fingers along your body! (DamageTaken) -The warrior zombie fights using the way of Sword and Lock. (DamageTaken) -The warrior zombie fights using the way of Sword and Lock. (DamageTaken) -Rope Artist -Rope Artist -The rope artist frowns and walks away, looking defeated. -The rope artist frowns and walks away, looking defeated. -The rope artist performs an intricate technique! (+RestraintAdded) -The rope artist performs an intricate technique! (+RestraintAdded) -The rope artist sneaks a lock onto you while you weren't looking! (DamageTaken) -The rope artist sneaks a lock onto you while you weren't looking! (DamageTaken) -The rope artist smiles and tickles your feet! (DamageTaken) -The rope artist smiles and tickles your feet! (DamageTaken) -Deputy -Deputy -The deputy surrenders her donuts. -The deputy surrenders her donuts. -The deputy slaps on some cuffs! (+RestraintAdded) -The deputy slaps on some cuffs! (+RestraintAdded) -The deputy tases you! (Stunned!) -The deputy tases you! (Stunned!) -The deputy conducts a strip search! (DamageTaken) -The deputy conducts a strip search! (DamageTaken) -The deputy performs a security enhancement procedure! (DamageTaken) -The deputy performs a security enhancement procedure! (DamageTaken) -Ninja Warrior -Ninja Warrior -The ninja warrior retreats into the shadows. -The ninja warrior retreats into the shadows. -The ninja warrior uses a traditional binding technique (+RestraintAdded) -The ninja warrior uses a traditional binding technique (+RestraintAdded) -The ninja warrior tosses a shuriken and hits you! (Stunned!) -The ninja warrior tosses a shuriken and hits you! (Stunned!) -The ninja warrior uses a lock to give herself the upper hand! (DamageTaken) -The ninja warrior uses a lock to give herself the upper hand! (DamageTaken) -The ninja warrior uses a subduing technique! (DamageTaken) -The ninja warrior uses a subduing technique! (DamageTaken) -Ninja Assassin -Ninja Assassin -The assassin retreats into the shadows. -The assassin retreats into the shadows. -The assassin uses a traditional binding technique (+RestraintAdded) -The assassin uses a traditional binding technique (+RestraintAdded) -The assassin uses a subduing technique! (DamageTaken) -The assassin uses a subduing technique! (DamageTaken) -The assassin stealthily locks your restraint! (DamageTaken) -The assassin stealthily locks your restraint! (DamageTaken) -Animated Armor -Animated Armor -The Animated Armor falls into pieces. -The Animated Armor falls into pieces. -The Animated Armor restrains you with shackles (+RestraintAdded) -The Animated Armor restrains you with shackles (+RestraintAdded) -The Animated Armor hugs your body with an iron grip! (DamageTaken) -The Animated Armor hugs your body with an iron grip! (DamageTaken) -Mimic -Mimic -The mimic spills out its contents. -The mimic spills out its contents. -The mimic spits out a restraint which latches onto you! (+RestraintAdded) -The mimic spits out a restraint which latches onto you! (+RestraintAdded) -The mimic tickles you with its tongue! (DamageTaken) -The mimic tickles you with its tongue! (DamageTaken) -Skeleton -Skeleton -The Skeleton falls to pieces. -The Skeleton falls to pieces. -The Skeleton restrains you! (+RestraintAdded) -The Skeleton restrains you! (+RestraintAdded) -The Skeleton tackles you! (DamageTaken) -The Skeleton tackles you! (DamageTaken) -Dragonheart Initiate -Dragonheart Initiate -The Dragonheart Initiate retreats hurriedly. -The Dragonheart Initiate retreats hurriedly. -The Dragonheart Initiate apprehends you! (+RestraintAdded) -The Dragonheart Initiate apprehends you! (+RestraintAdded) -The Dragonheart Initiate squeezes your body! (DamageTaken) -The Dragonheart Initiate squeezes your body! (DamageTaken) -The Dragonheart locks your restraint! (DamageTaken) -The Dragonheart locks your restraint! (DamageTaken) -Dragonheart Shield -Dragonheart Shield -The Dragonheart Shield makes a tactical retreat. -The Dragonheart Shield makes a tactical retreat. -The Dragonheart Shield apprehends you! (+RestraintAdded) -The Dragonheart Shield apprehends you! (+RestraintAdded) -The Dragonheart Shield bonks you! (DamageTaken) -The Dragonheart Shield bonks you! (DamageTaken) -The Dragonheart Shield squeezes your body! (DamageTaken) -The Dragonheart Shield squeezes your body! (DamageTaken) -The Dragonheart locks your restraint! (DamageTaken) -The Dragonheart locks your restraint! (DamageTaken) -Ice Dragonheart -Ice Dragonheart -The Ice Dragonheart retreats in a blast of snow. -The Ice Dragonheart retreats in a blast of snow. -The Ice Dragonheart apprehends you! (+RestraintAdded) -The Ice Dragonheart apprehends you! (+RestraintAdded) -The Ice Dragonheart gives your body a cold touch! (DamageTaken) -The Ice Dragonheart gives your body a cold touch! (DamageTaken) -The Dragonheart uses an icy lock on your restraint! (DamageTaken) -The Dragonheart uses an icy lock on your restraint! (DamageTaken) -Poison Dragonheart -Poison Dragonheart -The Poison Dragonheart retreats in a green mist. -The Poison Dragonheart retreats in a green mist. -The Poison Dragonheart apprehends you! (+RestraintAdded) -The Poison Dragonheart apprehends you! (+RestraintAdded) -The Poison Dragonheart smacks you with her axe! (DamageTaken) -The Poison Dragonheart smacks you with her axe! (DamageTaken) -The Poison Dragonheart thrums her claws across your figure! (DamageTaken) -The Poison Dragonheart thrums her claws across your figure! (DamageTaken) -The Dragonheart locks your restraint! (DamageTaken) -The Dragonheart locks your restraint! (DamageTaken) -Crystal Dragonheart -Crystal Dragonheart -The Crystal Dragonheart screams and falls to the ground dramatically. -The Crystal Dragonheart screams and falls to the ground dramatically. -The Crystal Dragonheart apprehends you! (+RestraintAdded) -The Crystal Dragonheart apprehends you! (+RestraintAdded) -The Crystal Dragonheart squeezes you in a big hug! (DamageTaken) -The Crystal Dragonheart squeezes you in a big hug! (DamageTaken) -The Dragonheart locks your restraint! (DamageTaken) -The Dragonheart locks your restraint! (DamageTaken) -Many crystals rise up out of the ground! -Many crystals rise up out of the ground! -A crystal rises up out of the ground! -A crystal rises up out of the ground! -Statue -Statue -The statue topples over! -The statue topples over! -Statue -Statue -The statue topples over and reveals a mechanism! -The statue topples over and reveals a mechanism! -Statue -Statue -The statue topples over and reveals a mechanism! -The statue topples over and reveals a mechanism! -The statue shoves a gag into your mouth, which inflates to fill the space! (+RestraintAdded) -The statue shoves a gag into your mouth, which inflates to fill the space! (+RestraintAdded) -The statue kisses your gag! (DamageTaken) -The statue kisses your gag! (DamageTaken) -Chaotic Crystal -Chaotic Crystal -The crystal shatters! -The crystal shatters! -The chaotic crystal leeches willpower from you! (DamageTaken) -The chaotic crystal leeches willpower from you! (DamageTaken) -Grand Chaotic Crystal -Grand Chaotic Crystal -The grand crystal shatters! -The grand crystal shatters! -The grand crystal leeches willpower from you! (DamageTaken) -The grand crystal leeches willpower from you! (DamageTaken) -Crystals erupt from the ground and slowly grow around your limbs! (+RestraintAdded) -Crystals erupt from the ground and slowly grow around your limbs! (+RestraintAdded) -Soul Crystal -Soul Crystal -The crystal shatters into a puff of soul dust! -The crystal shatters into a puff of soul dust! -The soul crystal leeches willpower from you! (DamageTaken) -The soul crystal leeches willpower from you! (DamageTaken) -Active Soul Crystal -Active Soul Crystal -The crystal shatters into a puff of soul dust! -The crystal shatters into a puff of soul dust! -The soul crystal leeches willpower from you! (DamageTaken) -The soul crystal leeches willpower from you! (DamageTaken) -Shadow Dragonheart -Shadow Dragonheart -The Shadow Dragonheart frowns and runs away. -The Shadow Dragonheart frowns and runs away. -The Shadow Dragonheart apprehends you! (+RestraintAdded) -The Shadow Dragonheart apprehends you! (+RestraintAdded) -The Shadow Dragonheart extends her scythe and pulls you closer!!! -The Shadow Dragonheart extends her scythe and pulls you closer!!! -The Shadow Dragonheart catches you with her scythe! (DamageTaken) -The Shadow Dragonheart catches you with her scythe! (DamageTaken) -Dragonheart Leader -Dragonheart Leader -The Dragonheart Leader admits defeat. -The Dragonheart Leader admits defeat. -The Dragonheart Leader apprehends you! (+RestraintAdded) -The Dragonheart Leader apprehends you! (+RestraintAdded) -The Dragonheart Leader dashes to you! -The Dragonheart Leader dashes to you! -The Dragonheart Leader squeezes your body! (DamageTaken) -The Dragonheart Leader squeezes your body! (DamageTaken) -The Dragonheart Leader uses a lock on you! (DamageTaken) -The Dragonheart Leader uses a lock on you! (DamageTaken) -Rebel Scum! -Rebel Scum! -The Dragonheart Rebel admits defeat. -The Dragonheart Rebel admits defeat. -The Dragonheart Rebel apprehends you! (+RestraintAdded) -The Dragonheart Rebel apprehends you! (+RestraintAdded) -'En garde!' -'En garde!' -The Dragonheart Rebel squeezes your body! (DamageTaken) -The Dragonheart Rebel squeezes your body! (DamageTaken) -The Dragonheart Leader uses a lock on you! (DamageTaken) -The Dragonheart Leader uses a lock on you! (DamageTaken) -Dryad -Dryad -The dryad sinks into the ground. -The dryad sinks into the ground. -The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) -The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) -The dryad sings a song that mesmerizes you! (DamageTaken) -The dryad sings a song that mesmerizes you! (DamageTaken) -The dryad tickles you with a leaf! (DamageTaken) -The dryad tickles you with a leaf! (DamageTaken) -Dryad -Dryad -The dryad sinks into the ground. -The dryad sinks into the ground. -The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) -The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) -The dryad sings a song that mesmerizes you! (DamageTaken) -The dryad sings a song that mesmerizes you! (DamageTaken) -The dryad tickles you with a leaf! (DamageTaken) -The dryad tickles you with a leaf! (DamageTaken) -Highly-Motivated Doll -Highly-Motivated Doll -The doll falls to the ground, moaning loudly. -The doll falls to the ground, moaning loudly. -The doll rubs her body against yours. You can feel the conduction. (DamageTaken) -The doll rubs her body against yours. You can feel the conduction. (DamageTaken) -The doll tackles you and squeezes you with her trembling legs! (DamageTaken) -The doll tackles you and squeezes you with her trembling legs! (DamageTaken) -Dollsmith -Dollsmith -The dollsmith's suit locks her wrists together and renders her helpless. -The dollsmith's suit locks her wrists together and renders her helpless. -The dollsmith runs a latex-covered finger across your vulnerable body! (DamageTaken) -The dollsmith runs a latex-covered finger across your vulnerable body! (DamageTaken) -The dollsmith grabs you and applies her favorite doll restraints! (+RestraintAdded) -The dollsmith grabs you and applies her favorite doll restraints! (+RestraintAdded) -The dollsmith slaps a lock onto your restraints! (DamageTaken) -The dollsmith slaps a lock onto your restraints! (DamageTaken) -Alchemist -Alchemist -The alchemist screams and runs. -The alchemist screams and runs. -The Alchemist restrains you! (+RestraintAdded) -The Alchemist restrains you! (+RestraintAdded) -The alchemist hugs you in a rubbery embrace! (DamageTaken) -The alchemist hugs you in a rubbery embrace! (DamageTaken) -The alchemist uses an ornate-looking lock! (DamageTaken) -The alchemist uses an ornate-looking lock! (DamageTaken) -Alchemist's Pet -Alchemist's Pet -The wolfgirl escapes! -The wolfgirl escapes! -The wolfgirl lunges at you with a powerful kick! -The wolfgirl lunges at you with a powerful kick! -The wolfgirl lunges at you with a powerful kick! -The wolfgirl lunges at you with a powerful kick! -The wolfgirl cuddles with you! (DamageTaken) -The wolfgirl cuddles with you! (DamageTaken) -Wolfgirl -Wolfgirl -The wolfgirl escapes! -The wolfgirl escapes! -The wolfgirl lunges at you with a powerful kick! -The wolfgirl lunges at you with a powerful kick! -The wolfgirl lunges at you with a powerful kick! -The wolfgirl lunges at you with a powerful kick! -The wolfgirl cuddles with you! (DamageTaken) -The wolfgirl cuddles with you! (DamageTaken) -Wolfguard -Wolfguard -The wolfguard's suit punishes her for poor performance! -The wolfguard's suit punishes her for poor performance! -The wolfguard lunges at you and strikes you! -The wolfguard lunges at you and strikes you! -The wolfguard's escort drones electrocute you! (DamageTaken) -The wolfguard's escort drones electrocute you! (DamageTaken) -The wolfguard's escort drones deploy some restraints! (+RestraintAdded) -The wolfguard's escort drones deploy some restraints! (+RestraintAdded) -Wolfgirl Trainer -Wolfgirl Trainer -The trainer retreats! -The trainer retreats! -The wolfgirl trainer squeezes your breasts playfully! (DamageTaken) -The wolfgirl trainer squeezes your breasts playfully! (DamageTaken) -The wolfgirl trainer secures you in training gear! (+RestraintAdded) -The wolfgirl trainer secures you in training gear! (+RestraintAdded) -The wolfgirl trainer pins you and skillfully locks all of your restraints! -The wolfgirl trainer pins you and skillfully locks all of your restraints! -Nevermere Operative -Nevermere Operative -The operative does a fumbled retreat! -The operative does a fumbled retreat! -The Nevermere Operative smiles and gropes your body! (DamageTaken) -The Nevermere Operative smiles and gropes your body! (DamageTaken) -The Nevermere Operative apprehends you with training gear! (+RestraintAdded) -The Nevermere Operative apprehends you with training gear! (+RestraintAdded) -The Nevermere Operative pins you and skillfully locks all of your restraints! -The Nevermere Operative pins you and skillfully locks all of your restraints! -Trainer's Apprentice -Trainer's Apprentice -The trainer's apprentice escapes! -The trainer's apprentice escapes! -The trainer's apprentice rubs her claws across your chest playfully! (DamageTaken) -The trainer's apprentice rubs her claws across your chest playfully! (DamageTaken) -The trainer's apprentice secures you in training gear! (+RestraintAdded) -The trainer's apprentice secures you in training gear! (+RestraintAdded) -The trainer's apprentice adds a lock to your restraints. -The trainer's apprentice adds a lock to your restraints. -The Executive -The Executive -The executive surrenders gracefully. -The executive surrenders gracefully. -The Executive makes a persuasive argument! (DamageTaken) -The Executive makes a persuasive argument! (DamageTaken) -The Executive's drones apprehend you! (+RestraintAdded) -The Executive's drones apprehend you! (+RestraintAdded) -The Executive's drones apply high-security locks to your restraints! -The Executive's drones apply high-security locks to your restraints! -Wolf Instructor -Wolf Instructor -The instructor deploys active camoflague and retreats! -The instructor deploys active camoflague and retreats! -The instructor disciplies you! (DamageTaken) -The instructor disciplies you! (DamageTaken) -The instructor applies advanced training gear! (+RestraintAdded) -The instructor applies advanced training gear! (+RestraintAdded) -The instructor adds a lock to your restraints. -The instructor adds a lock to your restraints. -Nevermere Drone -Nevermere Drone -The drone loses power and falls to the ground! -The drone loses power and falls to the ground! -A Nevermere Drone takes off! -A Nevermere Drone takes off! -You hear buzzing as several Nevermere Drones take to the air! -You hear buzzing as several Nevermere Drones take to the air! -Swarm of Tape Drones -Swarm of Tape Drones -The tape drones lose control and crash all over the place! -The tape drones lose control and crash all over the place! -A swarm of tape drones takes flight! -A swarm of tape drones takes flight! -The air fills with buzzing as dozens of tiny drones lift off! -The air fills with buzzing as dozens of tiny drones lift off! -The tape drones attach additional sticky layers! (DamageTaken) -The tape drones attach additional sticky layers! (DamageTaken) -The tape drones circle around you, wrapping you in tape! (+RestraintAdded) -The tape drones circle around you, wrapping you in tape! (+RestraintAdded) -Shield Drone -Shield Drone -The drone's power source explodes. -The drone's power source explodes. -A Shield Drone takes off! -A Shield Drone takes off! -Several Shield Drones take flight, their shields interlinking. -Several Shield Drones take flight, their shields interlinking. -Drone Explosion -Drone Explosion -Rusty Drone -Rusty Drone -The drone's mechanisms grind to a halt. -The drone's mechanisms grind to a halt. -The drone uses a short-ranged electrocution attack! (DamageTaken) -The drone uses a short-ranged electrocution attack! (DamageTaken) -The drone disassembles itself, revealing a set of restraining cables! (+RestraintAdded) -The drone disassembles itself, revealing a set of restraining cables! (+RestraintAdded) -Drone -Drone -The drone fizzles and falls to the ground! -The drone fizzles and falls to the ground! -The drone zaps you with a restraining energy ray! (DamageTaken) -The drone zaps you with a restraining energy ray! (DamageTaken) -The drone uses a short-ranged electrocution attack! (DamageTaken) -The drone uses a short-ranged electrocution attack! (DamageTaken) -The drone attaches to you! (+RestraintAdded) -The drone attaches to you! (+RestraintAdded) -Auto Capture Unit -Auto Capture Unit -The capture unit releases magic smoke and explodes. -The capture unit releases magic smoke and explodes. -The capture unit grabs you securely! (DamageTaken) -The capture unit grabs you securely! (DamageTaken) -The capture unit extends its appendages and wraps them around you! (+RestraintAdded) -The capture unit extends its appendages and wraps them around you! (+RestraintAdded) -The capture unit releases small drones which lock onto your restraints! (DamageTaken) -The capture unit releases small drones which lock onto your restraints! (DamageTaken) -Auto Tape Unit -Auto Tape Unit -The tape unit releases magic smoke and explodes. -The tape unit releases magic smoke and explodes. -The tape unit applies many layers of tape! (DamageTaken) -The tape unit applies many layers of tape! (DamageTaken) -The tape unit fires off many layers of sticky tape! (+RestraintAdded) -The tape unit fires off many layers of sticky tape! (+RestraintAdded) -The tape unit releases small drones which lock onto your restraints! (DamageTaken) -The tape unit releases small drones which lock onto your restraints! (DamageTaken) -Force Field Unit -Force Field Unit -The forcefield unit releases magic smoke and explodes. -The forcefield unit releases magic smoke and explodes. -The forcefield electrocutes you! (DamageTaken) -The forcefield electrocutes you! (DamageTaken) -The forcefield unit extends its appendages and wraps them around you! (+RestraintAdded) -The forcefield unit extends its appendages and wraps them around you! (+RestraintAdded) -The forcefield unit releases small drones which lock onto your restraints! (DamageTaken) -The forcefield unit releases small drones which lock onto your restraints! (DamageTaken) -Force Field Projector -Force Field Projector -The forcefield erupts into a shower of blue sparks! -The forcefield erupts into a shower of blue sparks! -The robot deploys a forcefield! -The robot deploys a forcefield! -The robot deploys a set of forcefields! -The robot deploys a set of forcefields! -Auto Enforcer Unit -Auto Enforcer Unit -The enforcer unit releases magic smoke and explodes. -The enforcer unit releases magic smoke and explodes. -The enforcer unit fires many cables that squeeze you! (DamageTaken) -The enforcer unit fires many cables that squeeze you! (DamageTaken) -The enforcer fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) -The enforcer fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) -The enforcer releases small drones which lock onto your restraints! (DamageTaken) -The enforcer releases small drones which lock onto your restraints! (DamageTaken) -The energy bolt hits you and paralyzes you! -The energy bolt hits you and paralyzes you! -Energy Bolt -Energy Bolt -Alkahestor -Alkahestor -The alkahestor resigns to her fate. -The alkahestor resigns to her fate. -The alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded) -The alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded) -The alkahestor uses an ornate-looking lock! (DamageTaken) -The alkahestor uses an ornate-looking lock! (DamageTaken) -The alkahestor shoves you! (DamageTaken) -The alkahestor shoves you! (DamageTaken) -Latex Elemental -Latex Elemental -The latex elemental melts into sticky rubber. -The latex elemental melts into sticky rubber. -The latex elemental molds itself into restraints! (+RestraintAdded) -The latex elemental molds itself into restraints! (+RestraintAdded) -The latex elemental slaps you with its appendages! (DamageTaken) -The latex elemental slaps you with its appendages! (DamageTaken) -Rope Elemental -Rope Elemental -The rope elemental gets knotted and falls to the floor, inert. -The rope elemental gets knotted and falls to the floor, inert. -The rope elemental's limbs lash out at you, wrapping themselves around your body! (+RestraintAdded) -The rope elemental's limbs lash out at you, wrapping themselves around your body! (+RestraintAdded) -The rope elemental squeezes you tightly! (DamageTaken) -The rope elemental squeezes you tightly! (DamageTaken) -Leather Elemental -Leather Elemental -The leather elemental sits down and sulks. -The leather elemental sits down and sulks. -The leather elemental wraps her long extremities around your body! (+RestraintAdded) -The leather elemental wraps her long extremities around your body! (+RestraintAdded) -The leather elemental strikes you with her leather belts! (DamageTaken) -The leather elemental strikes you with her leather belts! (DamageTaken) -The leather elemental clicks a lock onto your restraints! (DamageTaken) -The leather elemental clicks a lock onto your restraints! (DamageTaken) -Slime Enthusiast -Slime Enthusiast -The slime enthusiast screams and runs. -The slime enthusiast screams and runs. -The slime enthusiast restrains you! (+RestraintAdded) -The slime enthusiast restrains you! (+RestraintAdded) -The slime enthusiast hugs you in a rubbery embrace! (DamageTaken) -The slime enthusiast hugs you in a rubbery embrace! (DamageTaken) -The slime enthusiast looks happy to make sure your restraints are secure! (DamageTaken) -The slime enthusiast looks happy to make sure your restraints are secure! (DamageTaken) -Miner -Miner -The bandit tosses her pick to the ground and complains about her pay. -The bandit tosses her pick to the ground and complains about her pay. -The miner restrains you! (+RestraintAdded) -The miner restrains you! (+RestraintAdded) -The miner pins you with the haft of her pickaxe! (DamageTaken) -The miner pins you with the haft of her pickaxe! (DamageTaken) -The miner pins you with the haft of her pickaxe and adds a lock! (DamageTaken) -The miner pins you with the haft of her pickaxe and adds a lock! (DamageTaken) -You hear a fuse going off... -You hear a fuse going off... -Miner Bomb -Miner Bomb -Bandit -Bandit -The bandit cries. You should feel bad. -The bandit cries. You should feel bad. -Bandit -Bandit -The bandit collapses. -The bandit collapses. -The bandit restrains you! (+RestraintAdded) -The bandit restrains you! (+RestraintAdded) -The bandit smiles and applies a lock! (DamageTaken) -The bandit smiles and applies a lock! (DamageTaken) -The bandit caresses your restrained body! (DamageTaken) -The bandit caresses your restrained body! (DamageTaken) -Shady Dealer -Shady Dealer -The dealer flees, leaving her goods behind. -The dealer flees, leaving her goods behind. -The dealer uses some high-quality restraints on you! (+RestraintAdded) -The dealer uses some high-quality restraints on you! (+RestraintAdded) -The dealer smiles and applies a lock! (DamageTaken) -The dealer smiles and applies a lock! (DamageTaken) -The dealer kisses and gropes your body! (DamageTaken) -The dealer kisses and gropes your body! (DamageTaken) -That dagger was laced with something... -That dagger was laced with something... -You hear a shattering of glass, suddenly the air around you feels thick and moist... -You hear a shattering of glass, suddenly the air around you feels thick and moist... -Poison Dagger -Poison Dagger -Lust Bomb -Lust Bomb -Bandit Guard -Bandit Guard -The bandit guard collapses and calls for help. -The bandit guard collapses and calls for help. -The bandit guard restrains you! (+RestraintAdded) -The bandit guard restrains you! (+RestraintAdded) -The bandit rubs and caresses your restrained body! (DamageTaken) -The bandit rubs and caresses your restrained body! (DamageTaken) -The bandit scoffs and applies a lock! (DamageTaken) -The bandit scoffs and applies a lock! (DamageTaken) -Bandit Chief -Bandit Chief -The bandit scoffs and retreats until next time. -The bandit scoffs and retreats until next time. -The bandit restrains you tightly! (+RestraintAdded) -The bandit restrains you tightly! (+RestraintAdded) -The bandit runs her hands all along your restrained body! (DamageTaken) -The bandit runs her hands all along your restrained body! (DamageTaken) -The bandit chuckles and applies a lock! (DamageTaken) -The bandit chuckles and applies a lock! (DamageTaken) -Bandit Pet -Bandit Pet -The bandit blushes and runs away. -The bandit blushes and runs away. -The girl nervously restrains you! (+RestraintAdded) -The girl nervously restrains you! (+RestraintAdded) -The bandit tickes you nervously! (DamageTaken) -The bandit tickes you nervously! (DamageTaken) -Bandit Hunter -Bandit Hunter -The bandit hunter retreats. -The bandit hunter retreats. -The bandit hunter restrains you! (+RestraintAdded) -The bandit hunter restrains you! (+RestraintAdded) -The bandit hunter caresses your restrained body! (DamageTaken) -The bandit hunter caresses your restrained body! (DamageTaken) -The bandit hunter calls you an amateur and applies a lock! (DamageTaken) -The bandit hunter calls you an amateur and applies a lock! (DamageTaken) -Bandit Grappler -Bandit Grappler -The bandit grappler retreats. -The bandit grappler retreats. -The bandit grappler loops her chains around you! (+RestraintAdded) -The bandit grappler loops her chains around you! (+RestraintAdded) -The bandit grappler caresses your restrained body! (DamageTaken) -The bandit grappler caresses your restrained body! (DamageTaken) -The bandit giggles and applies a lock! (DamageTaken) -The bandit giggles and applies a lock! (DamageTaken) -The bandit grappler hooks you closer!!! -The bandit grappler hooks you closer!!! -Mummy -Mummy -The Mummy collapses and her body vanishes. -The Mummy collapses and her body vanishes. -The Mummy conjures a mystic wrapping! (+RestraintAdded) -The Mummy conjures a mystic wrapping! (+RestraintAdded) -The Mummy punishes you with a blow from her staff! (DamageTaken) -The Mummy punishes you with a blow from her staff! (DamageTaken) -Cursed One -Cursed One -The Cursed One is drawn into an eldritch portal. -The Cursed One is drawn into an eldritch portal. -The Cursed One's bindings transfer to you! (+RestraintAdded) -The Cursed One's bindings transfer to you! (+RestraintAdded) -The Cursed One's bindings emit a strange aura... (DamageTaken) -The Cursed One's bindings emit a strange aura... (DamageTaken) -Floating Wrapping -Floating Wrapping -The wrapping falls to the floor, its magic spent. -The wrapping falls to the floor, its magic spent. -The floating wrappings attach to you! (+RestraintAdded) -The floating wrappings attach to you! (+RestraintAdded) -The wrappings grip you tightly and squeeze you! (DamageTaken) -The wrappings grip you tightly and squeeze you! (DamageTaken) -Animated Sarcophagus -Animated Sarcophagus -The sarcophagus falls to the ground and crumbles. -The sarcophagus falls to the ground and crumbles. -The sarcophagus emits long wrappings that pull you closer! (+RestraintAdded) -The sarcophagus emits long wrappings that pull you closer! (+RestraintAdded) -The sarcophagus emanates a strange power! (DamageTaken) -The sarcophagus emanates a strange power! (DamageTaken) -Bast Warrior -Bast Warrior -The Bast Warrior collapses and meows loudly. -The Bast Warrior collapses and meows loudly. -The Bast Warrior restrains you! (+RestraintAdded) -The Bast Warrior restrains you! (+RestraintAdded) -The Bast Warrior tickles you with her claws! (DamageTaken) -The Bast Warrior tickles you with her claws! (DamageTaken) -The Bast Warrior pulls out a lock and slips it on! (DamageTaken) -The Bast Warrior pulls out a lock and slips it on! (DamageTaken) -Bast Cleric -Bast Cleric -The Bast Cleric collapses and meows softly. -The Bast Cleric collapses and meows softly. -A ray of light shoots out and paralyzes you! (DamageTaken) -A ray of light shoots out and paralyzes you! (DamageTaken) -The Bast Cleric restrains you! (+RestraintAdded) -The Bast Cleric restrains you! (+RestraintAdded) -A ray of light shoots out and paralyzes you! (DamageTaken) -A ray of light shoots out and paralyzes you! (DamageTaken) -The Bast Cleric pulls out a lock and slips it on! (DamageTaken) -The Bast Cleric pulls out a lock and slips it on! (DamageTaken) -Skeleton -Skeleton -The skeleton falls to pieces. -The skeleton falls to pieces. -The Skeleton restrains you! (+RestraintAdded) -The Skeleton restrains you! (+RestraintAdded) -The Skeleton tackles you! (DamageTaken) -The Skeleton tackles you! (DamageTaken) -Ghost -Ghost -The ghost vanishes. -The ghost vanishes. -The Ghost restrains you! (+RestraintAdded) -The Ghost restrains you! (+RestraintAdded) -The Ghost tickles you! (DamageTaken) -The Ghost tickles you! (DamageTaken) -Revenant -Revenant -The revenant pouts as it vanishes. -The revenant pouts as it vanishes. -The revenant restrains you! (+RestraintAdded) -The revenant restrains you! (+RestraintAdded) -The revenant squeezes your breasts! (DamageTaken) -The revenant squeezes your breasts! (DamageTaken) -The revenant grabs you and caresses your tummy! (DamageTaken) -The revenant grabs you and caresses your tummy! (DamageTaken) -Skeleton Warrior -Skeleton Warrior -The skeleton warrior collapses and falls into pieces. -The skeleton warrior collapses and falls into pieces. -The Skeleton lands a wide, crippling blow! (DamageTaken) -The Skeleton lands a wide, crippling blow! (DamageTaken) -The Skeleton leashes you! -The Skeleton leashes you! -Skeleton Knight -Skeleton Knight -The skeleton knight collapses and falls into pieces. -The skeleton knight collapses and falls into pieces. -The skeleton apprehends you and pins you with the haft of its axe! (DamageTaken) -The skeleton apprehends you and pins you with the haft of its axe! (DamageTaken) -The skeleton grabs you and slips a black cuff on! (+RestraintAdded) -The skeleton grabs you and slips a black cuff on! (+RestraintAdded) -Vine Plant -Vine Plant -The plant leaks purple juices everywhere as it wilts. -The plant leaks purple juices everywhere as it wilts. -The vine plant whips you with its tendrils! (DamageTaken) -The vine plant whips you with its tendrils! (DamageTaken) -The vine plant wraps its tendrils around you! (+RestraintAdded) -The vine plant wraps its tendrils around you! (+RestraintAdded) -The vine plant grips you tightly! (DamageTaken) -The vine plant grips you tightly! (DamageTaken) -Bramble -Bramble -The brambles are hacked away. -The brambles are hacked away. -The bramble snares you! (DamageTaken) -The bramble snares you! (DamageTaken) -The red liquid bubbles and several round slimes pop out! -The red liquid bubbles and several round slimes pop out! -The red liquid bubbles and a round slime pops out! -The red liquid bubbles and a round slime pops out! -A revenant appears! -A revenant appears! -Fuuka uses a talisman to call forth the spirits of her pets! -Fuuka uses a talisman to call forth the spirits of her pets! -A pool of latex bubbles and a twisted elemental appears! -A pool of latex bubbles and a twisted elemental appears! -Red Slime -Red Slime -Latex Elemental -Latex Elemental -Latex Elemental -Latex Elemental -Red Slime -Red Slime -The red slime bounces away. -The red slime bounces away. -The red slime bounces off you! (DamageTaken) -The red slime bounces off you! (DamageTaken) -The slime shoves itself into your mouth! (+RestraintAdded) -The slime shoves itself into your mouth! (+RestraintAdded) -Slime Mold -Slime Mold -The slime mold explodes into small puffs. -The slime mold explodes into small puffs. -The slime mold is sticky and gross! (DamageTaken) -The slime mold is sticky and gross! (DamageTaken) -The slime mold attaches itself to your body! (+RestraintAdded) -The slime mold attaches itself to your body! (+RestraintAdded) -Mold Puff -Mold Puff -The mold puff explodes into small puffs. -The mold puff explodes into small puffs. -The mold puff is sticky and gross! (DamageTaken) -The mold puff is sticky and gross! (DamageTaken) -The mold puff leaps through the air! -The mold puff leaps through the air! -The mold puff attaches itself to your body! (+RestraintAdded) -The mold puff attaches itself to your body! (+RestraintAdded) -Slime Mold Nest -Slime Mold Nest -The slime mold nest erupts into a shower of black particles! -The slime mold nest erupts into a shower of black particles! -Many small pieces of slime mold break off! -Many small pieces of slime mold break off! -A mobile cyst emerges from the slime mold nest! -A mobile cyst emerges from the slime mold nest! -Factory Doll -Factory Doll -The doll is subdued. -The doll is subdued. -Encased Adventurer -Encased Adventurer -The encased adventurer loses hope. -The encased adventurer loses hope. -The encased adventurer moans as she throws herself against you for help! (DamageTaken) -The encased adventurer moans as she throws herself against you for help! (DamageTaken) -The encased adventurer sticks to you as she mumbles incoherently! (DamageTaken) -The encased adventurer sticks to you as she mumbles incoherently! (DamageTaken) -The encased adventurer (+RestraintAdded) -The encased adventurer (+RestraintAdded) -Slime -Slime -The slime melts into a puddle. -The slime melts into a puddle. -The sticky slime splashes against you! (DamageTaken) -The sticky slime splashes against you! (DamageTaken) -The slime attaches itself to your body! (+RestraintAdded) -The slime attaches itself to your body! (+RestraintAdded) -Bouncy Slime -Bouncy Slime -The slime melts into a puddle. -The slime melts into a puddle. -The bouncy slime splashes against you! (DamageTaken) -The bouncy slime splashes against you! (DamageTaken) -The bouncy slime leaps to you! -The bouncy slime leaps to you! -The bouncy slime attaches itself to your body! (+RestraintAdded) -The bouncy slime attaches itself to your body! (+RestraintAdded) -Fast Slime -Fast Slime -The slime melts into a puddle. -The slime melts into a puddle. -The sticky slime leaps and splashes against you! (DamageTaken) -The sticky slime leaps and splashes against you! (DamageTaken) -The slime leaps and attaches itself to your body! (+RestraintAdded) -The slime leaps and attaches itself to your body! (+RestraintAdded) -Large Slime -Large Slime -The large slime splits apart! -The large slime splits apart! -The sticky slime splashes against you! (DamageTaken) -The sticky slime splashes against you! (DamageTaken) -The slime spreads to your body! (+RestraintAdded) -The slime spreads to your body! (+RestraintAdded) -The slime splits into many smaller droplets! -The slime splits into many smaller droplets! -Skeleton -Skeleton -The Skeleton falls into pieces. -The Skeleton falls into pieces. -The Skeleton restrains you! (+RestraintAdded) -The Skeleton restrains you! (+RestraintAdded) -The Skeleton latches onto you! -The Skeleton latches onto you! -Rope Tentacle -Rope Tentacle -The rope kraken retreats its tentacle. -The rope kraken retreats its tentacle. -The rope kraken squeezes you with one of its tentacles! (DamageTaken) -The rope kraken squeezes you with one of its tentacles! (DamageTaken) -Rope Kraken -Rope Kraken -The rope kraken devolves into a bundle of premium bondage rope. -The rope kraken devolves into a bundle of premium bondage rope. -The rope kraken tightly cinches itself around your body! (DamageTaken) -The rope kraken tightly cinches itself around your body! (DamageTaken) -Magic Rope -Magic Rope -The magic rope returns to being a normal rope. -The magic rope returns to being a normal rope. -The magic rope wraps itself tightly around your body! (+RestraintAdded) -The magic rope wraps itself tightly around your body! (+RestraintAdded) -The magic rope wriggles into your outfit! (DamageTaken) -The magic rope wriggles into your outfit! (DamageTaken) -Cloud of Feathers -Cloud of Feathers -The feathers fall to the floor. -The feathers fall to the floor. -The feathers tickle you mercilessly! (DamageTaken) -The feathers tickle you mercilessly! (DamageTaken) -Cloud of Scarves -Cloud of Scarves -The scarves become knotted and fall to the floor. -The scarves become knotted and fall to the floor. -The scarves wrap themselves around you! (+RestraintAdded) -The scarves wrap themselves around you! (+RestraintAdded) -The scarves rub against your body, tickling you! (DamageTaken) -The scarves rub against your body, tickling you! (DamageTaken) -Cloud of Ribbons -Cloud of Ribbons -The ribbons knot themselves in a bow and fall to the floor. -The ribbons knot themselves in a bow and fall to the floor. -The ribbons wrap themselves around you! (+RestraintAdded) -The ribbons wrap themselves around you! (+RestraintAdded) -The ribbons wrap themselves around you! (DamageTaken) -The ribbons wrap themselves around you! (DamageTaken) -Gravitating Gag -Gravitating Gag -The gag buckles itself in place and falls. -The gag buckles itself in place and falls. -The gravitating gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) -The gravitating gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) -The gravitating gag rubs itself against your gagged lips! (DamageTaken) -The gravitating gag rubs itself against your gagged lips! (DamageTaken) -Seductive Shackles -Seductive Shackles -The shackles' chain breaks as they fall to the floor. -The shackles' chain breaks as they fall to the floor. -The shackles force themselves around your limbs and click tightly! (+RestraintAdded) -The shackles force themselves around your limbs and click tightly! (+RestraintAdded) -The shackles click seductively in your face... (DamageTaken) -The shackles click seductively in your face... (DamageTaken) -Lurid Legbinder -Lurid Legbinder -The legbinder unravels. -The legbinder unravels. -The legbinder zips itself around your legs and squeezes them together! (+RestraintAdded) -The legbinder zips itself around your legs and squeezes them together! (+RestraintAdded) -The legbinder wraps around and squeezes your body! (DamageTaken) -The legbinder wraps around and squeezes your body! (DamageTaken) -Bratty Blindfold -Bratty Blindfold -The blindfold floats to the floor. -The blindfold floats to the floor. -The blindfold buckles itself tightly around your head! (+RestraintAdded) -The blindfold buckles itself tightly around your head! (+RestraintAdded) -The blindfold crawls over your helpless face! (DamageTaken) -The blindfold crawls over your helpless face! (DamageTaken) -Amorous Armbinder -Amorous Armbinder -The armbinder flops to the floor. -The armbinder flops to the floor. -The armbinder slips itself around your arms and pushes your elbows together! (+RestraintAdded) -The armbinder slips itself around your arms and pushes your elbows together! (+RestraintAdded) -The armbinder rubs itself all over your body! (DamageTaken) -The armbinder rubs itself all over your body! (DamageTaken) -Stringent Straitjacket -Stringent Straitjacket -The straitjacket falls apart. -The straitjacket falls apart. -The straitjacket slips itself on over your head and pulls your arms close to your body! (+RestraintAdded) -The straitjacket slips itself on over your head and pulls your arms close to your body! (+RestraintAdded) -The straitjacket squeezes you tightly! (DamageTaken) -The straitjacket squeezes you tightly! (DamageTaken) -Brusque Belt -Brusque Belt -The chastity belt falls to the floor with a clang. -The chastity belt falls to the floor with a clang. -The chastity belt secures itself around your waist! (+RestraintAdded) -The chastity belt secures itself around your waist! (+RestraintAdded) -The chastity belt buzzes against your body alluringly! (DamageTaken) -The chastity belt buzzes against your body alluringly! (DamageTaken) -Yammering Yoke -Yammering Yoke -The yoke falls to the floor with a loud clang. -The yoke falls to the floor with a loud clang. -The yoke clasps your arms tightly and forces them to the sides! (+RestraintAdded) -The yoke clasps your arms tightly and forces them to the sides! (+RestraintAdded) -The yoke makes alluring clicking noises! (DamageTaken) -The yoke makes alluring clicking noises! (DamageTaken) -Haughty Harness -Haughty Harness -The harness unravels. -The harness unravels. -The harness buckles itself tightly around your body! (+RestraintAdded) -The harness buckles itself tightly around your body! (+RestraintAdded) -The harness wraps itself around your body and squeezes! (DamageTaken) -The harness wraps itself around your body and squeezes! (DamageTaken) -Levitating Locks -Levitating Locks -The locks and chains fall to the floor in a loud crash. -The locks and chains fall to the floor in a loud crash. -A lock clicks itself onto one of your restraints! (+RestraintAdded) -A lock clicks itself onto one of your restraints! (+RestraintAdded) -A chain locks itself in place on your body! (DamageTaken) -A chain locks itself in place on your body! (DamageTaken) -The floating locks and chains rub themselves across your body! (DamageTaken) -The floating locks and chains rub themselves across your body! (DamageTaken) -Conjured Gag -Conjured Gag -The conjured gag buckles itself in place and falls. -The conjured gag buckles itself in place and falls. -The gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) -The gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) -The gag rubs itself against you! (DamageTaken) -The gag rubs itself against you! (DamageTaken) -Learned Rope -Learned Rope -The learned rope untangles into a mess of rope. -The learned rope untangles into a mess of rope. -The magic rope wraps itself intricately around your body! (+RestraintAdded) -The magic rope wraps itself intricately around your body! (+RestraintAdded) -The magic rope wriggles into your outfit! (DamageTaken) -The magic rope wriggles into your outfit! (DamageTaken) -Unforseen Rope -Unforseen Rope -The unforseen rope is gone... or is it? -The unforseen rope is gone... or is it? -The unforseen rope wraps itself clandestinely around your body! (+RestraintAdded) -The unforseen rope wraps itself clandestinely around your body! (+RestraintAdded) -The unforseen rope wriggles into your outfit! (DamageTaken) -The unforseen rope wriggles into your outfit! (DamageTaken) -Monster Rope -Monster Rope -The monster rope bundle collapses into a pile of ropes. -The monster rope bundle collapses into a pile of ropes. -The magic rope wraps itself overwhelmingly around your body! (+RestraintAdded) -The magic rope wraps itself overwhelmingly around your body! (+RestraintAdded) -The magic rope wriggles into your outfit! (DamageTaken) -The magic rope wriggles into your outfit! (DamageTaken) -Shock Witch -Shock Witch -The shock witch vanishes into a cloud of thunder, leaving behind a keyring. -The shock witch vanishes into a cloud of thunder, leaving behind a keyring. -The witch restraints you! (+RestraintAdded) -The witch restraints you! (+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -Flame Witch -Flame Witch -The flame witch vanishes into a pile of ash. -The flame witch vanishes into a pile of ash. -The witch restraints you! (+RestraintAdded) -The witch restraints you! (+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -Earth Witch -Earth Witch -The earth witch vanishes into a pile of ash. -The earth witch vanishes into a pile of ash. -The witch restraints you! (+RestraintAdded) -The witch restraints you! (+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -Water Witch -Water Witch -The water witch vanishes into a pile of ash. -The water witch vanishes into a pile of ash. -The witch restraints you! (+RestraintAdded) -The witch restraints you! (+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -Ice Witch -Ice Witch -The ice witch vanishes into a pile of ash. -The ice witch vanishes into a pile of ash. -The witch restraints you! (+RestraintAdded) -The witch restraints you! (+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -Magic Stone -Magic Stone -Ice Bolt -Ice Bolt -Waterblast -Waterblast -Rope Witch -Rope Witch -The rope witch retreats as her animated ropes chase her. -The rope witch retreats as her animated ropes chase her. -The witch restraints you! (+RestraintAdded) -The witch restraints you! (+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -Magnet Witch -Magnet Witch -The witch is pulled away by an unseen force. -The witch is pulled away by an unseen force. -The witch's restraints fly out and attach themselves to you! (+RestraintAdded) -The witch's restraints fly out and attach themselves to you! (+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -The witch's lightning causes your body to tingle! (DamageTaken) -The witch's lightning causes your body to tingle! (DamageTaken) -Witch's Apprentice -Witch's Apprentice -The apprentice runs off and cries in a corner. -The apprentice runs off and cries in a corner. -The apprentice animates restraints to wrap around you! (+RestraintAdded) -The apprentice animates restraints to wrap around you! (+RestraintAdded) -The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) -The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) -The apprentice slaps you playfully! (DamageTaken) -The apprentice slaps you playfully! (DamageTaken) -Summoner's Apprentice -Summoner's Apprentice -The apprentice runs off and cries in a corner. -The apprentice runs off and cries in a corner. -The apprentice summons a restraint onto you! (+RestraintAdded) -The apprentice summons a restraint onto you! (+RestraintAdded) -The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) -The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) -The apprentice tickles you playfully! (DamageTaken) -The apprentice tickles you playfully! (DamageTaken) -Latex Apprentice -Latex Apprentice -The apprentice runs off and cries in a corner. -The apprentice runs off and cries in a corner. -The apprentice attaches a sticky restraint! (+RestraintAdded) -The apprentice attaches a sticky restraint! (+RestraintAdded) -The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) -The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) -The apprentice caresses you playfully! (DamageTaken) -The apprentice caresses you playfully! (DamageTaken) -Chain Witch -Chain Witch -The chain witch vanishes into a pile of metal dust, leaving behind a keyring. -The chain witch vanishes into a pile of metal dust, leaving behind a keyring. -The chain witch locks all of your restraints! -The chain witch locks all of your restraints! -The witch's bindings wrap themselves around you! (+RestraintAdded) -The witch's bindings wrap themselves around you! (+RestraintAdded) -The chain witch tugs sensually at your restraints! (DamageTaken) -The chain witch tugs sensually at your restraints! (DamageTaken) -Metal Witch -Metal Witch -The metal witch vanishes into a pile of metal dust, leaving behind a keyring. -The metal witch vanishes into a pile of metal dust, leaving behind a keyring. -The metal witch locks all of your restraints! -The metal witch locks all of your restraints! -The metal's bindings wrap themselves around you! (+RestraintAdded) -The metal's bindings wrap themselves around you! (+RestraintAdded) -The metal witch tugs sensually at your restraints! (DamageTaken) -The metal witch tugs sensually at your restraints! (DamageTaken) -Slime Witch -Slime Witch -The slime witch vanishes into a pool of pink slime, leaving behind a keyring. -The slime witch vanishes into a pool of pink slime, leaving behind a keyring. -The witch touches her with her sticky grasp! (+RestraintAdded) -The witch touches her with her sticky grasp! (+RestraintAdded) -The witch creates a magical lock made of hardened latex! (DamageTaken) -The witch creates a magical lock made of hardened latex! (DamageTaken) -The witch squeezes your body playfully! (DamageTaken) -The witch squeezes your body playfully! (DamageTaken) -'High' Wizard -'High' Wizard -The wizard falls asleep. -The wizard falls asleep. -The wizard clips a restraint around your neck! (+RestraintAdded) -The wizard clips a restraint around your neck! (+RestraintAdded) -The wizard clips a lock to your restraints! (DamageTaken) -The wizard clips a lock to your restraints! (DamageTaken) -The wizard laughs maniacally as she tickles you! (DamageTaken) -The wizard laughs maniacally as she tickles you! (DamageTaken) -FunGal -FunGal -The fun-gal retreats into the ground. -The fun-gal retreats into the ground. -The fun-gal clips a restraint around your neck! (+RestraintAdded) -The fun-gal clips a restraint around your neck! (+RestraintAdded) -The fun-gal produces a magical lock on all your restraints! (DamageTaken) -The fun-gal produces a magical lock on all your restraints! (DamageTaken) -The fun-gal rubs your chest with her long, slender fingers! (DamageTaken) -The fun-gal rubs your chest with her long, slender fingers! (DamageTaken) -Crystal Glyph -Crystal Glyph -Tailor -Tailor -You murder the tailor! -You murder the tailor! -Student -Student -You murder the student! -You murder the student! -Tactician -Tactician -You murder the tactician! -You murder the tactician! -Informant -Informant -You murder the informant! -You murder the informant! -Thug -Thug -You murder the thug! -You murder the thug! -Blacksmith -Blacksmith -You murder the blacksmith! -You murder the blacksmith! -Dressmaker -Dressmaker -The dressmaker storms out in a rage. -The dressmaker storms out in a rage. -The dressmaker has you try on one of her new accessories! (+RestraintAdded) -The dressmaker has you try on one of her new accessories! (+RestraintAdded) -The dressmaker adds a lock 'just to complete the look, you know?' -The dressmaker adds a lock 'just to complete the look, you know?' -The dressmaker cuddles your helpless body~ (DamageTaken) -The dressmaker cuddles your helpless body~ (DamageTaken) -Nurse -Nurse -The Nurse checks her notes and runs off. -The Nurse checks her notes and runs off. -The Nurse tries to pacify this rowdy patient! (+RestraintAdded) -The Nurse tries to pacify this rowdy patient! (+RestraintAdded) -The Nurse adds a lock to keep you from hurting the staff. -The Nurse adds a lock to keep you from hurting the staff. -The Nurse assures you it's going to be alright~ (DamageTaken) -The Nurse assures you it's going to be alright~ (DamageTaken) -Librarian -Librarian -The librarian gets angry and retreats. -The librarian gets angry and retreats. -The librarian shushes you as she brandishes a restraint! (+RestraintAdded) -The librarian shushes you as she brandishes a restraint! (+RestraintAdded) -The librarian snaps her fingers and sends a lock flying at you! -The librarian snaps her fingers and sends a lock flying at you! -The librarian whispers seductively into your ear! (DamageTaken) -The librarian whispers seductively into your ear! (DamageTaken) -Stone Door -Stone Door -The stone door crumbles! -The stone door crumbles! -Stone Door -Stone Door -The stone door crumples inward! -The stone door crumples inward! -Giant Mushroom -Giant Mushroom -The giant mushroom explodes into a cloud of spores!!! -The giant mushroom explodes into a cloud of spores!!! -Animated Mushroom -Animated Mushroom -The animated mushroom explodes into a cloud of spores!!! -The animated mushroom explodes into a cloud of spores!!! -The animated mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) -The animated mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) -The animated mushroom spits spores into your face and tries to tie you! -The animated mushroom spits spores into your face and tries to tie you! -The animated mushroom emits soporific spores! (DamageTaken) -The animated mushroom emits soporific spores! (DamageTaken) -Happy Mushroom -Happy Mushroom -The happy mushroom explodes into a cloud of spores!!! -The happy mushroom explodes into a cloud of spores!!! -The happy mushroom tickles you silly! -The happy mushroom tickles you silly! -The happy mushroom tickles you silly! (DamageTaken) -The happy mushroom tickles you silly! (DamageTaken) -Infected Mushroom -Infected Mushroom -The infected mushroom explodes into a cloud of spores!!! -The infected mushroom explodes into a cloud of spores!!! -The infected mushroom gives you a crushing hug! -The infected mushroom gives you a crushing hug! -The infected mushroom gives you a crushing hug! (DamageTaken) -The infected mushroom gives you a crushing hug! (DamageTaken) -Jailer -Jailer -The jailer passes out and drops her possessions! -The jailer passes out and drops her possessions! -The jailer locks your restraints! -The jailer locks your restraints! -The jailer places some restraints on you! (+RestraintAdded) -The jailer places some restraints on you! (+RestraintAdded) -The jailer plays with you, groping and rubbing your body! -The jailer plays with you, groping and rubbing your body! -The guard checks your restraints to make sure they are secure. -The guard checks your restraints to make sure they are secure. -Guard -Guard -The guard passes out and drops her possessions! -The guard passes out and drops her possessions! -The guard locks your restraints! -The guard locks your restraints! -The jailer places some restraints on you! (+RestraintAdded) -The jailer places some restraints on you! (+RestraintAdded) -The guard places a NewRestraintName on you -The guard places a NewRestraintName on you -The guard plays with you, groping and rubbing your body! -The guard plays with you, groping and rubbing your body! -Armed Guard -Armed Guard -The armed guard retreats, but drops a keyring! -The armed guard retreats, but drops a keyring! -The guard locks your restraints! -The guard locks your restraints! -The guard shocks you and slaps on some restraints! (+RestraintAdded) -The guard shocks you and slaps on some restraints! (+RestraintAdded) -The guard electrocutes you with her taser!!! -The guard electrocutes you with her taser!!! -The guard electrocutes you with her taser!!! -The guard electrocutes you with her taser!!! -The EnemyName replaces your OldRestraintName with a NewRestraintName -The EnemyName replaces your OldRestraintName with a NewRestraintName -The EnemyName removes your OldRestraintName -The EnemyName removes your OldRestraintName -The EnemyName restrains you with a NewRestraintName -The EnemyName restrains you with a NewRestraintName -Master Conjurer -Master Conjurer -The conjurer retreats into a portal! -The conjurer retreats into a portal! -The master conjurer waves a hand, and locks appear on all your restraints! -The master conjurer waves a hand, and locks appear on all your restraints! -The master conjurer summons a restraint directly onto you! -The master conjurer summons a restraint directly onto you! -The master conjurer tickles you playfully! -The master conjurer tickles you playfully! -Master Conjurer -Master Conjurer -The conjurer retreats into a portal! -The conjurer retreats into a portal! -The master conjurer waves a hand, and locks appear on all your restraints! -The master conjurer waves a hand, and locks appear on all your restraints! -The master conjurer summons a restraint directly onto you! -The master conjurer summons a restraint directly onto you! -The master conjurer tickles you playfully! -The master conjurer tickles you playfully! -Frog -Frog -The frog jumps away! -The frog jumps away! -The frog pulls you with its tongue!!! -The frog pulls you with its tongue!!! -The frog licks you! -The frog licks you! -Toad -Toad -The toad jumps away! -The toad jumps away! -The toad pulls you with its tongue!!! -The toad pulls you with its tongue!!! -The toad licks you! -The toad licks you! -Shadow Hand -Shadow Hand -The shadow hand retreats into the darkness... -The shadow hand retreats into the darkness... -The shadow hand latches onto you!! (+RestraintAdded) -The shadow hand latches onto you!! (+RestraintAdded) -The shadow hand stretches its fingers across your body! (DamageTaken) -The shadow hand stretches its fingers across your body! (DamageTaken) -A dark hand stretches out beyond the shadows... -A dark hand stretches out beyond the shadows... -Several dark hands emerge from the shadows! -Several dark hands emerge from the shadows! -Corrupted Adventurer -Corrupted Adventurer -The corrupted adventurer falls into a deep sleep. -The corrupted adventurer falls into a deep sleep. -The corrupted aventurer's many arms latch onto you! (+RestraintAdded) -The corrupted aventurer's many arms latch onto you! (+RestraintAdded) -The corrupted adventurer drags her chilling fingers across your vulnerable skin! (DamageTaken) -The corrupted adventurer drags her chilling fingers across your vulnerable skin! (DamageTaken) -Shadowy Ghast -Shadowy Ghast -The shadowy ghast screeches and disappears... -The shadowy ghast screeches and disappears... -The shadowy ghast latches onto you with its long arms! (+RestraintAdded) -The shadowy ghast latches onto you with its long arms! (+RestraintAdded) -The shadowy ghast grips you in its chilling embrace! (DamageTaken) -The shadowy ghast grips you in its chilling embrace! (DamageTaken) -Obsidian Construct -Obsidian Construct -The obsidian construct stops moving, its spirit departed. -The obsidian construct stops moving, its spirit departed. -The obsidian construct reaches out and touches you, forming metallic restraints! (+RestraintAdded) -The obsidian construct reaches out and touches you, forming metallic restraints! (+RestraintAdded) -The obsidian construct uses its chains to lock your restraints! (DamageTaken) -The obsidian construct uses its chains to lock your restraints! (DamageTaken) -The obsidian construct grips you and drains your willpower! (DamageTaken) -The obsidian construct grips you and drains your willpower! (DamageTaken) -Star Demon -Star Demon -The star demon is exorcised. -The star demon is exorcised. -The star demon places you in shining, starry restraints. (+RestraintAdded) -The star demon places you in shining, starry restraints. (+RestraintAdded) -The demon giggles as it locks your restraints! (DamageTaken) -The demon giggles as it locks your restraints! (DamageTaken) -The star demon places you under its curse! (DamageTaken) -The star demon places you under its curse! (DamageTaken) -The strings of fate glisten and wrap around you! -The strings of fate glisten and wrap around you! -Many shining strings surround you! -Many shining strings surround you! -Stepping outside of the indicated tiles will result in punishment! -Stepping outside of the indicated tiles will result in punishment! -Bindings of Fate -Bindings of Fate -Moon Demon -Moon Demon -The moon demon is exorcised. -The moon demon is exorcised. -The moon demon places you in shining, starry restraints. (+RestraintAdded) -The moon demon places you in shining, starry restraints. (+RestraintAdded) -The moon demon places you under its curse! (DamageTaken) -The moon demon places you under its curse! (DamageTaken) -The weight of inescapable bondage falls upon you! (DamageTaken) -The weight of inescapable bondage falls upon you! (DamageTaken) -The demon giggles as it locks your restraints! (DamageTaken) -The demon giggles as it locks your restraints! (DamageTaken) -Crushing Fate -Crushing Fate -Void Demon -Void Demon -The void demon is exorcised. -The void demon is exorcised. -The void demon places you in dark, glassy restraints. (+RestraintAdded) -The void demon places you in dark, glassy restraints. (+RestraintAdded) -The demon giggles as it locks your restraints! (DamageTaken) -The demon giggles as it locks your restraints! (DamageTaken) -The void demon places you under its curse! (DamageTaken) -The void demon places you under its curse! (DamageTaken) -Demon -Demon -The demon is exorcised. -The demon is exorcised. -The demon places you in dark, glassy restraints. (+RestraintAdded) -The demon places you in dark, glassy restraints. (+RestraintAdded) -The demon giggles as it locks your restraints! (DamageTaken) -The demon giggles as it locks your restraints! (DamageTaken) -The demon whacks you with its mace! (DamageTaken) -The demon whacks you with its mace! (DamageTaken) -Tickle Hand -Tickle Hand -The hand vanishes! -The hand vanishes! -The hand tickles you! (DamageTaken) -The hand tickles you! (DamageTaken) -Tickle Terror -Tickle Terror -The tickle terror vanishes... for now -The tickle terror vanishes... for now -The monstrous spirit tickles you mercilessly!!! (DamageTaken) -The monstrous spirit tickles you mercilessly!!! (DamageTaken) -The monstrous spirit binds you to make you more vulnerable! (+RestraintAdded) -The monstrous spirit binds you to make you more vulnerable! (+RestraintAdded) -Hug Horror -Hug Horror -The hug horror vanishes... for now -The hug horror vanishes... for now -The monstrous spirit gives a crushing hug!!! (DamageTaken) -The monstrous spirit gives a crushing hug!!! (DamageTaken) -The monstrous spirit gives a crushing hug!!! (DamageTaken) -The monstrous spirit gives a crushing hug!!! (DamageTaken) -The monstrous spirit's chains latch on! (+RestraintAdded) -The monstrous spirit's chains latch on! (+RestraintAdded) -Greedy Ghast -Greedy Ghast -The ghast vanishes... for now -The ghast vanishes... for now -The moaning spirit gropes your body!!! (DamageTaken) -The moaning spirit gropes your body!!! (DamageTaken) -Tickle Hand -Tickle Hand -The hand vanishes! -The hand vanishes! -The hand tickles you! (DamageTaken) -The hand tickles you! (DamageTaken) -Tome of Chains -Tome of Chains -The floating tome burns into ashes! -The floating tome burns into ashes! -Tome of Light -Tome of Light -The floating tome burns into ashes! -The floating tome burns into ashes! -Tome of Magic -Tome of Magic -The floating tome burns into ashes! -The floating tome burns into ashes! -Tome of Ice -Tome of Ice -The floating tome burns into ashes! -The floating tome burns into ashes! -Tome of the Abyss -Tome of the Abyss -The floating tome burns into ashes! -The floating tome burns into ashes! -Tome of Nature -Tome of Nature -The floating tome burns into ashes! -The floating tome burns into ashes! -Tome of Thunder -Tome of Thunder -The floating tome burns into ashes! -The floating tome burns into ashes! -Tome of Latex -Tome of Latex -The floating tome burns into ashes! -The floating tome burns into ashes! -Tome of Laughs -Tome of Laughs -The floating tome burns into ashes! -The floating tome burns into ashes! -You are grabbed and led to a prison... -You are grabbed and led to a prison... -Perhaps they may release you if you behave... -Perhaps they may release you if you behave... -Necromancer -Necromancer -The necromancer faints. Ironic that she couldn't save herself. -The necromancer faints. Ironic that she couldn't save herself. -The necromancer locks all of your restraints! -The necromancer locks all of your restraints! -The necromancer prepares you for transport! -The necromancer prepares you for transport! -The necromancer rubs your body sensually! -The necromancer rubs your body sensually! -Filthy Rat -Filthy Rat -The rat skitters back into a hole in the wall. -The rat skitters back into a hole in the wall. -The filthy rat nibbles at you! (DamageTaken) -The filthy rat nibbles at you! (DamageTaken) -Annoying Bat -Annoying Bat -You stomp the bat into the ground to make sure it's dead. -You stomp the bat into the ground to make sure it's dead. -The bat nibbles incessantly at you! (DamageTaken) -The bat nibbles incessantly at you! (DamageTaken) -Pixie -Pixie -The pixie huffs and floats away. -The pixie huffs and floats away. -The pixie tickles you with a feather! (DamageTaken) -The pixie tickles you with a feather! (DamageTaken) -Orb of Light -Orb of Light -The orb vanishes in a flash of light. -The orb vanishes in a flash of light. -The orb blinds you with its intense light!!! (DamageTaken) -The orb blinds you with its intense light!!! (DamageTaken) -A light restores the will of its allies! -A light restores the will of its allies! -You do not have enough resources to cast the spell! -You do not have enough resources to cast the spell! -You AttackName TargetEnemy for DamageDealt DamageType damage! -You AttackName TargetEnemy for DamageDealt DamageType damage! -You AttackName TargetEnemy for a decreased DamageDealt DamageType damage! -You AttackName TargetEnemy for a decreased DamageDealt DamageType damage! -You AttackName TargetEnemy for an increased DamageDealt DamageType damage! -You AttackName TargetEnemy for an increased DamageDealt DamageType damage! -You AttackName TargetEnemy for a devastating DamageDealt DamageType damage! -You AttackName TargetEnemy for a devastating DamageDealt DamageType damage! -You AttackName TargetEnemy, but your DamageType weapon has no effect! -You AttackName TargetEnemy, but your DamageType weapon has no effect! -You AttackName TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! -You AttackName TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! -AttackName hits TargetEnemy for DamageDealt DamageType damage! -AttackName hits TargetEnemy for DamageDealt DamageType damage! -AttackName hits TargetEnemy for a reduced DamageDealt DamageType damage! -AttackName hits TargetEnemy for a reduced DamageDealt DamageType damage! -AttackName hits TargetEnemy but DamageType damage doesn't have any effect! -AttackName hits TargetEnemy but DamageType damage doesn't have any effect! -AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! -AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! -AttackName hits TargetEnemy for DamageDealt DamageType damage, reduced by an anti-magic ward! -AttackName hits TargetEnemy for DamageDealt DamageType damage, reduced by an anti-magic ward! -AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! -AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! -attack -attack -damage -damage -You miss the TargetEnemy! -You miss the TargetEnemy! -Your attack is too feeble to hurt the TargetEnemy! -Your attack is too feeble to hurt the TargetEnemy! -You try to pull the TargetRestraint off... -You try to pull the TargetRestraint off... -You try to squirm and moan out of the TargetRestraint... -You try to squirm and moan out of the TargetRestraint... -You tug on the TargetRestraint with increased power... -You tug on the TargetRestraint with increased power... -Your ally helps you try to pull the TargetRestraint off... -Your ally helps you try to pull the TargetRestraint off... -You work on picking the TargetRestraint... -You work on picking the TargetRestraint... -Your trembling hands work on picking the TargetRestraint... -Your trembling hands work on picking the TargetRestraint... -You work on picking the TargetRestraint with your powers... -You work on picking the TargetRestraint with your powers... -Your ally tries to pick the lock on your TargetRestraint... -Your ally tries to pick the lock on your TargetRestraint... -You try to pick open the TargetRestraint but break your lockpick. -You try to pick open the TargetRestraint but break your lockpick. -You work on picking the TargetRestraint... -You work on picking the TargetRestraint... -You work on picking the TargetRestraint... -You work on picking the TargetRestraint... -Your trembling hands work on picking the TargetRestraint... -Your trembling hands work on picking the TargetRestraint... -You work on picking the TargetRestraint with your powers... -You work on picking the TargetRestraint with your powers... -Your ally tries to pick the lock on your TargetRestraint... -Your ally tries to pick the lock on your TargetRestraint... -You break your lockpick trying to open the TargetRestraint. -You break your lockpick trying to open the TargetRestraint. -You try to remove the TargetRestraint... -You try to remove the TargetRestraint... -You shakily try to remove the TargetRestraint... -You shakily try to remove the TargetRestraint... -You try to remove the TargetRestraint with a tool... -You try to remove the TargetRestraint with a tool... -Your ally helps you remove the TargetRestraint... -Your ally helps you remove the TargetRestraint... -You try to cut the TargetRestraint... -You try to cut the TargetRestraint... -You tremble as you try to cut the TargetRestraint... -You tremble as you try to cut the TargetRestraint... -You try to cut the TargetRestraint using your tools... -You try to cut the TargetRestraint using your tools... -You try to cut the TargetRestraint with help... -You try to cut the TargetRestraint with help... -You break your knife trying to cut the TargetRestraint. -You break your knife trying to cut the TargetRestraint. -You try to cut the TargetRestraint... -You try to cut the TargetRestraint... -You fiddle with the key on the TargetRestraint... -You fiddle with the key on the TargetRestraint... -Your jittering hands fumble with the key on the TargetRestraint... -Your jittering hands fumble with the key on the TargetRestraint... -You concentrate on unlocking the TargetRestraint... -You concentrate on unlocking the TargetRestraint... -You work on unlocking the TargetRestraint with help... -You work on unlocking the TargetRestraint with help... -You fiddle with the key on the TargetRestraint... -You fiddle with the key on the TargetRestraint... -The lock requires a key. -The lock requires a key. -The lock requires a key. -The lock requires a key. -The lock requires a key. -The lock requires a key. -The green padlock only accepts green keys. -The green padlock only accepts green keys. -The yellow padlock requires a red and a green key. -The yellow padlock requires a red and a green key. -The magical lock only accepts blue keys and can't be picked. -The magical lock only accepts blue keys and can't be picked. -The magical lock is guarded with powerful magic. You'll have to wait for it to wear off... -The magical lock is guarded with powerful magic. You'll have to wait for it to wear off... -This lock requires a command word to unlock. It doesn't have a keyhole. -This lock requires a command word to unlock. It doesn't have a keyhole. -You don't have a key for this lock. -You don't have a key for this lock. -The lock seems to be magical and rejects all picking attempts! -The lock seems to be magical and rejects all picking attempts! -The lock is definitely magical and forces your pick out! -The lock is definitely magical and forces your pick out! -The lock doesn't even have a keyhole to pick! -The lock doesn't even have a keyhole to pick! -The key sticks in the lock and jams, mangling the key! -The key sticks in the lock and jams, mangling the key! -You unlock the TargetRestraint. -You unlock the TargetRestraint. -You manage to squeeze out of the TargetRestraint! -You manage to squeeze out of the TargetRestraint! -You pick the lock on the TargetRestraint! -You pick the lock on the TargetRestraint! -You pick the lock on the TargetRestraint! -You pick the lock on the TargetRestraint! -You free yourself from the TargetRestraint! -You free yourself from the TargetRestraint! -You damage the TargetRestraint enough to escape! -You damage the TargetRestraint enough to escape! -The TargetRestraint is destroyed by your attempts. -The TargetRestraint is destroyed by your attempts. -This is as far as you can struggle. You'll have to remove it some other way. -This is as far as you can struggle. You'll have to remove it some other way. -The item is too tight. You'll need to loosen it somehow first... -The item is too tight. You'll need to loosen it somehow first... -The item is to tight to get your tool into position. You'll have to first make it looser. -The item is to tight to get your tool into position. You'll have to first make it looser. -After numerous failed attempts, you realize that this lock is more than you can handle. -After numerous failed attempts, you realize that this lock is more than you can handle. -The lock is tucked in securely under straps. You'll have to get it out from under there... -The lock is tucked in securely under straps. You'll have to get it out from under there... -You can feel some ply but can't quite make any progress... -You can feel some ply but can't quite make any progress... -It's just barely out of reach... -It's just barely out of reach... -Your tool leaves only a scratch... -Your tool leaves only a scratch... -The lock is just above your skill level... -The lock is just above your skill level... -The keyholes are just barely out of reach... -The keyholes are just barely out of reach... -You unlock the TargetRestraint and sigh with relief. -You unlock the TargetRestraint and sigh with relief. -You give out a huge moan as you squeeze out of the TargetRestraint! -You give out a huge moan as you squeeze out of the TargetRestraint! -You pick the lock on the TargetRestraint with a sigh of relief! -You pick the lock on the TargetRestraint with a sigh of relief! -You pick the lock on the TargetRestraint with a sigh of relief! -You pick the lock on the TargetRestraint with a sigh of relief! -Trembling, you free yourself from the TargetRestraint! -Trembling, you free yourself from the TargetRestraint! -You damage the TargetRestraint enough to wiggle out! -You damage the TargetRestraint enough to wiggle out! -You stick the knife into a crack in the wall! -You stick the knife into a crack in the wall! -You use your feet to place the knife into a crack! -You use your feet to place the knife into a crack! -You glare at the crack in the wall as you realize you couldn't maneuver the knife if you tried. -You glare at the crack in the wall as you realize you couldn't maneuver the knife if you tried. -You can't hold your knife like this... -You can't hold your knife like this... -The item is too secure to struggle out. -The item is too secure to struggle out. -You groan in frustration as you realize the item is too tight to escape. -You groan in frustration as you realize the item is too tight to escape. -The item tightens itself as you try to squeeze out! -The item tightens itself as you try to squeeze out! -You will need someone's help to squeeze out. -You will need someone's help to squeeze out. -The restraint flashes magically as the Goddess' curse resists your efforts! -The restraint flashes magically as the Goddess' curse resists your efforts! -You pull and tug but your other restraints keep it securely in place! -You pull and tug but your other restraints keep it securely in place! -You groan and tug but nothing budges. You're bound too tightly by something else. -You groan and tug but nothing budges. You're bound too tightly by something else. -You are too tightly bound to have a chance. -You are too tightly bound to have a chance. -You shake and moan as you realize your struggles are futile. -You shake and moan as you realize your struggles are futile. -You can't find a keyhole! -You can't find a keyhole! -You sigh as you give up trying to find any kind of keyhole. -You sigh as you give up trying to find any kind of keyhole. -The item can't be unlocked without a special command! -The item can't be unlocked without a special command! -You can't reach the keyhole by yourself! -You can't reach the keyhole by yourself! -You can't hold the key to unlock this with. -You can't hold the key to unlock this with. -Your bound and shaking hands can't even hold the key. -Your bound and shaking hands can't even hold the key. -The goddess punishes you for trying to unlock her restraint! -The goddess punishes you for trying to unlock her restraint! -You try, but something is keeping your hands away. -You try, but something is keeping your hands away. -You flail the key around uselessly but a strap is preventing you! -You flail the key around uselessly but a strap is preventing you! -This lock is beyond your skill level! -This lock is beyond your skill level! -You whimper as you realize the lock is far too secure. -You whimper as you realize the lock is far too secure. -There is no visible locking mechanism. -There is no visible locking mechanism. -You can't pick this by yourself, you'll need help. -You can't pick this by yourself, you'll need help. -You can't maneuver the lockpick well enough to unlock it. -You can't maneuver the lockpick well enough to unlock it. -You let out a frustrated sigh as your quivering pick makes no progress. -You let out a frustrated sigh as your quivering pick makes no progress. -You try to start picking, but the lock is secured by something else. -You try to start picking, but the lock is secured by something else. -You whimper as you realize the lock is shielded by another strap. -You whimper as you realize the lock is shielded by another strap. -You are distracted by mental images of yourself remaining in bondage... -You are distracted by mental images of yourself remaining in bondage... -You wiggle uselessly. Maybe you need some kind of tool... -You wiggle uselessly. Maybe you need some kind of tool... -You rub your body against the floor to no avail, and sigh. -You rub your body against the floor to no avail, and sigh. -You contort your body but you don't have leverage. Maybe you need some kind of tool... -You contort your body but you don't have leverage. Maybe you need some kind of tool... -You wiggle madly, trying to push against the restraint. You need more leverage... -You wiggle madly, trying to push against the restraint. You need more leverage... -That doesn't seem to work. Maybe something else will. -That doesn't seem to work. Maybe something else will. -You squirm helplessly against the furniture. Maybe something else will help more. -You squirm helplessly against the furniture. Maybe something else will help more. -You twist your body trying to use the furniture, but it doesn't seem to work. Try something else. -You twist your body trying to use the furniture, but it doesn't seem to work. Try something else. -You wiggle and squirm, trying to use the furniture to no avail. Try something else. -You wiggle and squirm, trying to use the furniture to no avail. Try something else. -You need something sharp to loosen the fasteners. -You need something sharp to loosen the fasteners. -This is not a job for your fingers right now. You need something sharp. -This is not a job for your fingers right now. You need something sharp. -There's no way to loosen it without some kind of sharp tool... -There's no way to loosen it without some kind of sharp tool... -You sigh as the material resists all your attempts at breaking through. -You sigh as the material resists all your attempts at breaking through. -You need some kind of corner for leverage. -You need some kind of corner for leverage. -You flail about but cant get any leverage without an edge or corner. -You flail about but cant get any leverage without an edge or corner. -You need something rough to get the item loose. -You need something rough to get the item loose. -You squirm against the smooth floor to no avail. Maybe if you had some kind of corner... -You squirm against the smooth floor to no avail. Maybe if you had some kind of corner... -You need some kind of tool to pull at the knots. -You need some kind of tool to pull at the knots. -You struggle fruitlessly against the knots, but they're too tight. -You struggle fruitlessly against the knots, but they're too tight. -You don't have any grip or hook to tug at your restraints with. -You don't have any grip or hook to tug at your restraints with. -You cant tug at your restraints with them tightly wrapped against your body. -You cant tug at your restraints with them tightly wrapped against your body. -You need a way to stick the tool in place... -You need a way to stick the tool in place... -Your trembling hands cant grip anything as they are. -Your trembling hands cant grip anything as they are. -You need something grippy... -You need something grippy... -You rub yourself against the floor to no avail. Maybe if you had something adhesive... -You rub yourself against the floor to no avail. Maybe if you had something adhesive... -The fastenings are too tight and secured! -The fastenings are too tight and secured! -You roll around tryng to loosen the item to no avail. -You roll around tryng to loosen the item to no avail. -The item tightens itself as you try to undo it! -The item tightens itself as you try to undo it! -You can't reach it by yourself! -You can't reach it by yourself! -You are too tightly bound to manipulate that item. -You are too tightly bound to manipulate that item. -Your futile struggles do nothing to loosen the fasteners. -Your futile struggles do nothing to loosen the fasteners. -You try to undo the fasteners, but they are blocked by other straps! -You try to undo the fasteners, but they are blocked by other straps! -You rub your body uselessly as you find another strap securing the item. -You rub your body uselessly as you find another strap securing the item. -You feel the Goddess' hand keeping the restraint tightly secured! -You feel the Goddess' hand keeping the restraint tightly secured! -The item is too durable to cut. -The item is too durable to cut. -Your hopeless attempts fail to even leave a scratch. -Your hopeless attempts fail to even leave a scratch. -You fail to leave even a scratch! -You fail to leave even a scratch! -You can't get any leverage to cut it with... -You can't get any leverage to cut it with... -You can't hold the knife firmly enough to cut. -You can't hold the knife firmly enough to cut. -You cry out in your bindings as the knife bounces around uselessly. -You cry out in your bindings as the knife bounces around uselessly. -Your arms are kept from having leverage due to another item. -Your arms are kept from having leverage due to another item. -You fiddle with the tool, but your arms lack leverage due to another item -You fiddle with the tool, but your arms lack leverage due to another item -The restraint flashes magically as the Goddess' curse resists your efforts! -The restraint flashes magically as the Goddess' curse resists your efforts! -You pry at the hands... -You pry at the hands... -You moan as the hands squeeze you tightly... -You moan as the hands squeeze you tightly... -There's no way they are just letting go! -There's no way they are just letting go! -You whimper as you realize the hands won't let go no matter what... -You whimper as you realize the hands won't let go no matter what... -You hear dark laughter as you realize the hands won't let go... -You hear dark laughter as you realize the hands won't let go... -You hear a dark giggle as fruitlessly try to wiggle free! -You hear a dark giggle as fruitlessly try to wiggle free! -You try to pull away! -You try to pull away! -You blush and try to escape the hands' grip! -You blush and try to escape the hands' grip! -Their grip is too strong... -Their grip is too strong... -Their grip is too strong... it's hopeless. -Their grip is too strong... it's hopeless. -You're bound too tight to have a chance. -You're bound too tight to have a chance. -You whimper as you realize you're too tightly bound to have a chance. -You whimper as you realize you're too tightly bound to have a chance. -You work to unlace the corset... -You work to unlace the corset... -You hurriedly try to unlace the corset... -You hurriedly try to unlace the corset... -The corset has no laces to loosen! -The corset has no laces to loosen! -You sigh as you can't find any laces to loosen. -You sigh as you can't find any laces to loosen. -The laces are tied tight! -The laces are tied tight! -You hopelessly try to untie the lacing but it's just too tight! -You hopelessly try to untie the lacing but it's just too tight! -You grasp at the slime, trying to peel it off... -You grasp at the slime, trying to peel it off... -You wiggle madly as you try to peel off the slime! -You wiggle madly as you try to peel off the slime! -The slime reforms as you scoop it away! -The slime reforms as you scoop it away! -You can't get the slime off at all! -You can't get the slime off at all! -The slime is too fast at reforming! -The slime is too fast at reforming! -The slime reforms too quickly as you try to squirm it off... -The slime reforms too quickly as you try to squirm it off... -You grasp around, looking for a seam... -You grasp around, looking for a seam... -You wiggle and squeeze yourself in various places, looking for a lead... -You wiggle and squeeze yourself in various places, looking for a lead... -The rubber encases you in a solid layer! -The rubber encases you in a solid layer! -Try as you might, the rubber hugs you completely without any seams! -Try as you might, the rubber hugs you completely without any seams! -The rubber is too tight to get any traction... -The rubber is too tight to get any traction... -The rubber squeezes your body too tightly to get any sort of ply... -The rubber squeezes your body too tightly to get any sort of ply... -You start peeling off the wrapping... -You start peeling off the wrapping... -You scratch at the wrapping furiously... -You scratch at the wrapping furiously... -The material clings to your skin too tightly! -The material clings to your skin too tightly! -You groan in frustration as you try to peel it off but realize it's too sticky. -You groan in frustration as you try to peel it off but realize it's too sticky. -You can't grip the edges to peel it off! -You can't grip the edges to peel it off! -You make a futile attempt to rub it off. -You make a futile attempt to rub it off. -You try to wiggle off the chains... -You try to wiggle off the chains... -You squirm trying to get the chains to fall off... -You squirm trying to get the chains to fall off... -The chains are magical and wrap themselves back around you of their own accord. -The chains are magical and wrap themselves back around you of their own accord. -The chains squeeze you tighter as you try to shake them off. -The chains squeeze you tighter as you try to shake them off. -The chains have you bound hopelessly tight! -The chains have you bound hopelessly tight! -You sigh and moan as the chains aren't getting any looser. -You sigh and moan as the chains aren't getting any looser. -You try to untie the ropes... -You try to untie the ropes... -You contort yourself trying to reach the knots... -You contort yourself trying to reach the knots... -The knot ties itself back again as soon as you get it loose! -The knot ties itself back again as soon as you get it loose! -The knots tighten themselves as soon as you reach them, keeping you tight and secure. -The knots tighten themselves as soon as you reach them, keeping you tight and secure. -You can't reach the knots! -You can't reach the knots! -Your squirming is in vain as you can't even reach the knots. -Your squirming is in vain as you can't even reach the knots. -You try to pull off the clamps... -You try to pull off the clamps... -You tug on your clamps trying to get them off! -You tug on your clamps trying to get them off! -That would really hurt... -That would really hurt... -You realize that would really hurt... -You realize that would really hurt... -The clamps tug on your nipples as you squirm! -The clamps tug on your nipples as you squirm! -The clamps tug on your nipples as you squirm! -The clamps tug on your nipples as you squirm! -The chest is too smooth to help. Maybe if you opened it? -The chest is too smooth to help. Maybe if you opened it? -Lockable -Lockable -Non-Lockable -Non-Lockable -Unlocked -Unlocked -Lock Type: -Lock Type: -Red -Red -Red -Red -Red -Red -Simple -Simple -Green -Green -Blue -Blue -Purple -Purple -Gold -Gold -Yellow -Yellow -Red Lock -Red Lock -Red Lock -Red Lock -Red Lock -Red Lock -Simple Lock -Simple Lock -Green Lock -Green Lock -Blue Lock -Blue Lock -Purple Lock -Purple Lock -Yellow Lock -Yellow Lock - - - - - - -(G) -(G) -(S) -(S) -(B) -(B) -(G) -(G) -(P) -(P) -(?) -(?) -(Y) -(Y) -You can't drink that while gagged! -You can't drink that while gagged! -You can't use that without your fingers! -You can't use that without your fingers! -You struggle against your bindings but it's too strict!. -You struggle against your bindings but it's too strict!. -You drop the pick due to your bound hands! -You drop the pick due to your bound hands! -You drop your knife due to your bound hands! -You drop your knife due to your bound hands! -You drop the precious knife due to your bound hands! -You drop the precious knife due to your bound hands! -You drop the key due to your bound hands! -You drop the key due to your bound hands! -You drop the magic key due to your bound hands! -You drop the magic key due to your bound hands! -You drop the magic key due to your bound hands! -You drop the magic key due to your bound hands! -Logbook -Logbook -Logbook (N) -Logbook (N) -Passing... -Passing... -Pass NPCs -Pass NPCs -Closing... -Closing... -Close door -Close door -Sprinting!!! -Sprinting!!! -Sprint! -Sprint! -Hopping!!! -Hopping!!! -Hop! -Hop! -You run! -You run! -You hop desperately! -You hop desperately! -Close Door -Close Door -Unlock -Unlock -Command -Command -You utter a command word and release the lock! -You utter a command word and release the lock! -You mutter an unintelligible command word and your locks do not open. -You mutter an unintelligible command word and your locks do not open. -You mumble a command word but the lock opens! -You mumble a command word but the lock opens! -You mess up saying the command word. The lock stays put! -You mess up saying the command word. The lock stays put! -Pick -Pick -(No way to open) -(No way to open) -(She cannot help you) -(She cannot help you) -Offer XXXg -Offer XXXg -Offer -Offer -You do not have enough for a proper offering. -You do not have enough for a proper offering. -The goddess removes some of your restraints! -The goddess removes some of your restraints! -The goddess restores your mental and physical state! -The goddess restores your mental and physical state! -The goddess teaches you the secrets of SCHOOL. (+1 level) -The goddess teaches you the secrets of SCHOOL. (+1 level) -The goddess of SCHOOL grants you destructive spellcasting! -The goddess of SCHOOL grants you destructive spellcasting! -The goddess of SCHOOL grants you invisibility on attacks! -The goddess of SCHOOL grants you invisibility on attacks! -The goddess of SCHOOL grants you protection and retaliation! -The goddess of SCHOOL grants you protection and retaliation! -You leave the coins on the altar and they transform into a ItemBought! -You leave the coins on the altar and they transform into a ItemBought! -object -object -It appears to be a receptacle for an ancient crystal. -It appears to be a receptacle for an ancient crystal. -It's a pile of slag emitting a strange magic smoke... -It's a pile of slag emitting a strange magic smoke... -That object is locked -That object is locked -A shrine to the goddess of TYPE. A pool of mana glimmers below. -A shrine to the goddess of TYPE. A pool of mana glimmers below. -A shrine to the goddess of TYPE. -A shrine to the goddess of TYPE. -That door is open. Do you want to close it? -That door is open. Do you want to close it? -You slam the door and jam it shut! -You slam the door and jam it shut! -Submissiveness -Submissiveness -Security Level -Security Level -Undead -Undead -Latex -Latex -Leather -Leather -Metal -Metal -Ropes -Ropes -Restoration -Restoration -Elements -Elements -Conjuration -Conjuration -Illusions -Illusions -Commerce -Commerce -Shrine of SHRINETYPE -Shrine of SHRINETYPE -Teachings of SHRINETYPE -Teachings of SHRINETYPE -Goddess Blessing: -Goddess Blessing: -Goddess Curse: -Goddess Curse: -Curses -Curses -Willpower -Willpower -A tablet inscribed with runes of TYPE. -A tablet inscribed with runes of TYPE. -Decypher -Decypher -You read the runes and they imbue you with power! -You read the runes and they imbue you with power! -You try to read the runes but cannot understand them. -You try to read the runes but cannot understand them. -Allies: -Allies: -Enemies: -Enemies: -Nevermere Trainers -Nevermere Trainers -DressUp Co. -DressUp Co. -Bounty Hunters Guild -Bounty Hunters Guild -Bandits -Bandits -Constructs -Constructs -Witches' Coven -Witches' Coven -School of Magic -School of Magic -Old Guardians -Old Guardians -Cult of the Wild -Cult of the Wild -Cult of Bast -Cult of Bast -Alchemists -Alchemists -Elementals -Elementals -Dragonheart Order -Dragonheart Order -MaidForce -MaidForce -Fungal Kingdom -Fungal Kingdom -Wanted -Wanted -Delinquent -Delinquent -Illegal Poacher -Illegal Poacher -Nature -Nature -Surprise! -Surprise! -Angels -Angels -Demons -Demons -You sense that the chest contains a trap and a lot of gold. -You sense that the chest contains a trap and a lot of gold. -You sense that the chest is safe to open. -You sense that the chest is safe to open. -Drink -Drink -Bottle -Bottle -You have no restraints to 'offer' to the goddess. -You have no restraints to 'offer' to the goddess. -This shrine's mana pool is empty. -This shrine's mana pool is empty. -You drink from the pool and and absorb its energies. -You drink from the pool and and absorb its energies. -You absorb the pool's energies through your face. -You absorb the pool's energies through your face. -You collect what mana you can in a bottle. -You collect what mana you can in a bottle. -You drink from the pool and your mana is restored. -You drink from the pool and your mana is restored. -You drink again, but you feel as if you are trespassing. -You drink again, but you feel as if you are trespassing. -You drink again, knowing the risk this may entail... -You drink again, knowing the risk this may entail... -You have angered the goddess of TYPE!!! -You have angered the goddess of TYPE!!! -The slime washes off in the fountain!!! -The slime washes off in the fountain!!! -The goddess offers a ItemTraded for ItemCost (NumCurrent/NumMax) -The goddess offers a ItemTraded for ItemCost (NumCurrent/NumMax) -Next Offer -Next Offer -Buy (press right) -Buy (press right) -Cost: ItemCostgp -Cost: ItemCostgp -Level RestraintLevel (Rarity) -Level RestraintLevel (Rarity) -Consumable -Consumable -Equipped -Equipped -Weapons -Weapons -Outfits -Outfits -Wearable -Wearable -Miscellaneous -Miscellaneous -The terrain makes noise as you rush across it... -The terrain makes noise as you rush across it... -You can't reach the cuffs on your elbows, the chain is too short... -You can't reach the cuffs on your elbows, the chain is too short... -You contort your arms trying to reach the cuffs on your elbows, to no avail... -You contort your arms trying to reach the cuffs on your elbows, to no avail... -Your elbows are kept together by the elbow cuffs, and you can't reach them. -Your elbows are kept together by the elbow cuffs, and you can't reach them. -The strict chain on the cuffs keeps you from reaching them easily. -The strict chain on the cuffs keeps you from reaching them easily. -The cuffs limit your range of motion, making it harder to remove them. -The cuffs limit your range of motion, making it harder to remove them. -It's hard to take off the cuffs with your wrists linked together... -It's hard to take off the cuffs with your wrists linked together... -You feel drained of energy... -You feel drained of energy... -Your collar tingles and suddenly you feel weaker... -Your collar tingles and suddenly you feel weaker... -Your collar drains your energy as you struggle... -Your collar drains your energy as you struggle... -The rope between your legs keeps the toy secure... -The rope between your legs keeps the toy secure... -Try as you might, the toy is held in place tight. -Try as you might, the toy is held in place tight. -The toy won't wiggle loose. It's kept in place by your restraints. -The toy won't wiggle loose. It's kept in place by your restraints. -Your catsuit adheres to latex, making struggling more difficult! -Your catsuit adheres to latex, making struggling more difficult! -The item sticks to your rubber catsuit, making it harder to pull off... -The item sticks to your rubber catsuit, making it harder to pull off... -The item hugs your catsuit tightly, adhering firmly! -The item hugs your catsuit tightly, adhering firmly! -The bright light weakens the shadow hands! -The bright light weakens the shadow hands! -You hear an ominous click, but nothing seems to happen. Looks like a misfire! -You hear an ominous click, but nothing seems to happen. Looks like a misfire! -Barrel Trap -Barrel Trap -A booby-trapped barrel with a spring-loaded lid designed to trap you inside! -A booby-trapped barrel with a spring-loaded lid designed to trap you inside! -You can push the lid off with enough force... -You can push the lid off with enough force... -The lid of the barrel suddenly snaps shut as you hide inside!!! -The lid of the barrel suddenly snaps shut as you hide inside!!! -Sarcophagus -Sarcophagus -A glass-walled chamber sealed with enchanting magic. -A glass-walled chamber sealed with enchanting magic. -Time feels like it's going by quickly outside... -Time feels like it's going by quickly outside... -Cage Trap -Cage Trap -A booby-trapped cage! -A booby-trapped cage! -Fit for a pretty toy like you~ -Fit for a pretty toy like you~ -Display Stand -Display Stand -A display stand, fit for only the prettiest of trophies! -A display stand, fit for only the prettiest of trophies! -Your arms are pinned behind your back and you can barely move! -Your arms are pinned behind your back and you can barely move! -You hear a click as the door shuts behind you... -You hear a click as the door shuts behind you... -Doll Stand -Doll Stand -A mobile display stand for dolls to keep them in place. -A mobile display stand for dolls to keep them in place. -As long as it's... inserted, you won't be going anywhere! -As long as it's... inserted, you won't be going anywhere! -Doll Stand -Doll Stand -A mobile display stand for dolls to keep them in place. -A mobile display stand for dolls to keep them in place. -As long as it's attached, you won't be going anywhere! -As long as it's attached, you won't be going anywhere! -You're not fooling anyone... -You're not fooling anyone... -You might be able to fool someone like this... -You might be able to fool someone like this... -You look like you're right at home! -You look like you're right at home! -Restraining Bed -Restraining Bed -A bed with a booby trap designed to trap you on top of it! -A bed with a booby trap designed to trap you on top of it! -You have to get out somehow... -You have to get out somehow... -Belts emerge from underneath the bed and wrap around you, strapping you down tightly! -Belts emerge from underneath the bed and wrap around you, strapping you down tightly! -Binding Dress -Binding Dress -It's a devious dress! I hope your elbows are flexible~ -It's a devious dress! I hope your elbows are flexible~ -So many laces! It would quite a while to put this on normally. That's what magic is for! -So many laces! It would quite a while to put this on normally. That's what magic is for! -Ornamental Corset -Ornamental Corset -Your figure looks gorgeous in this~ -Your figure looks gorgeous in this~ -It's so tight you won't be able to undo the laces yourself, dear! -It's so tight you won't be able to undo the laces yourself, dear! -Fancy Ball Gag -Fancy Ball Gag -A cute ball gag that fills your mouth right up! -A cute ball gag that fills your mouth right up! -What's this? it seems to have a magic spell protecting it from harm! -What's this? it seems to have a magic spell protecting it from harm! -Fancy Muzzle -Fancy Muzzle -A muzzle to keep you from spitting out what's underneath. -A muzzle to keep you from spitting out what's underneath. -Sorry dear, there's a mystic seal on there to keep it on nice and tight. -Sorry dear, there's a mystic seal on there to keep it on nice and tight. -Red Binding Dress -Red Binding Dress -A devious dress that forces the arms into an elbows-touching position. -A devious dress that forces the arms into an elbows-touching position. -It is extremely strict but it is only fabric. The lacing is intricate and will take a long time to remove. -It is extremely strict but it is only fabric. The lacing is intricate and will take a long time to remove. -Ornamental Gag -Ornamental Gag -A gag meant to keep servants of the Resurrection Temple quiet by forcing a dildo into their mouth. -A gag meant to keep servants of the Resurrection Temple quiet by forcing a dildo into their mouth. -It is difficult to pull off and though it is made from white leather, a magic enchantment protects it from cutting. -It is difficult to pull off and though it is made from white leather, a magic enchantment protects it from cutting. -Panel Plug Gag -Panel Plug Gag -A gag meant to keep people quiet by forcing a dildo into their mouth. -A gag meant to keep people quiet by forcing a dildo into their mouth. -It is difficult to pull off and though it is made from supple, heavy duty leather. -It is difficult to pull off and though it is made from supple, heavy duty leather. -Fuuka's Collar -Fuuka's Collar -A collar enchanted with ghastly energy. -A collar enchanted with ghastly energy. -It seems to react with a pulse of energy whenever a nearby enemy is defeated. -It seems to react with a pulse of energy whenever a nearby enemy is defeated. -Your collar pulses, and a revenant appears to avenge the enemy you defeated! -Your collar pulses, and a revenant appears to avenge the enemy you defeated! -Dress Bustier -Dress Bustier -A deceptively cruel device, making it impossible to reach your nipples. -A deceptively cruel device, making it impossible to reach your nipples. -Reinforced with steel plates, this will need bolt cutters to take off. -Reinforced with steel plates, this will need bolt cutters to take off. -Nipple Massagers -Nipple Massagers -A pair of little teasers. -A pair of little teasers. -They will make for some great fun! -They will make for some great fun! -Control Harness -Control Harness -An advanced harness for controlling high-security prisoners. -An advanced harness for controlling high-security prisoners. -It seems to be made of flexible steel plates. -It seems to be made of flexible steel plates. -Tracking Collar -Tracking Collar -An advanced collar for tracking high-security prisoners. -An advanced collar for tracking high-security prisoners. -It seems to be made of flexible steel plates, and it has a high-security lock. -It seems to be made of flexible steel plates, and it has a high-security lock. -Latex Ball Gag -Latex Ball Gag -A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. -A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. -The strap is made of a durable but flexible material -The strap is made of a durable but flexible material -Latex Mask -Latex Mask -A slick layer of blue latex stretched over the mouth. -A slick layer of blue latex stretched over the mouth. -It's very tight and makes it hard to move your mouth. -It's very tight and makes it hard to move your mouth. -Rubberized Gloves -Rubberized Gloves -A mass of alchemical latex stretched over your arms, then hardened. -A mass of alchemical latex stretched over your arms, then hardened. -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -Rubberized Socks -Rubberized Socks -A mass of alchemical latex stretched over your legs, then hardened. -A mass of alchemical latex stretched over your legs, then hardened. -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -Rubberized Mask -Rubberized Mask -A mass of alchemical latex stretched over your entire face, then hardened. -A mass of alchemical latex stretched over your entire face, then hardened. -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -Rubberized Ball Gag -Rubberized Ball Gag -A mass of alchemical latex inflated to fill your mouth, then hardened. -A mass of alchemical latex inflated to fill your mouth, then hardened. -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -Rubberized OTN Mask -Rubberized OTN Mask -A mass of alchemical latex stretched over your mouth, then hardened. -A mass of alchemical latex stretched over your mouth, then hardened. -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -Wolf Panties -Wolf Panties -A set of vibrating panties designed to help subdue unruly wolfgirls. -A set of vibrating panties designed to help subdue unruly wolfgirls. -It's incredibly tight and difficult to remove once it's clipped on, but the material is rubber. -It's incredibly tight and difficult to remove once it's clipped on, but the material is rubber. -You don't meet the conditions to equip that. -You don't meet the conditions to equip that. -Latex Boxtie Binder -Latex Boxtie Binder -A secure but comfortable binder meant for long-term wear by the alchemists' pets. -A secure but comfortable binder meant for long-term wear by the alchemists' pets. -Made from imbued latex, it will be hard to cut but not impossible. -Made from imbued latex, it will be hard to cut but not impossible. -Binder Straps Cincher -Binder Straps Cincher -A tight cincher attached to a binder used to ensure restraints will not come off. -A tight cincher attached to a binder used to ensure restraints will not come off. -It's tied in the back and reinforced with steel boning. -It's tied in the back and reinforced with steel boning. -Blacksteel Ankle Cuffs -Blacksteel Ankle Cuffs -Highly durable cuffs made from top-quality ancient metal. -Highly durable cuffs made from top-quality ancient metal. -They're made of Blacksteel, a metal used by the Old Civilization. -They're made of Blacksteel, a metal used by the Old Civilization. -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Blacksteel Cuffs Chain -Blacksteel Cuffs Chain -Highly durable cuffs made from top-quality ancient metal. -Highly durable cuffs made from top-quality ancient metal. -They're made of Blacksteel, a metal used by the Old Civilization. -They're made of Blacksteel, a metal used by the Old Civilization. -The ankle cuff chain detaches! -The ankle cuff chain detaches! -Latex Posture Collar -Latex Posture Collar -A strict collar that makes it tougher to escape from other items. -A strict collar that makes it tougher to escape from other items. -It has steel boning but could be cut with enough care. -It has steel boning but could be cut with enough care. -Blacksteel Ballet Heels -Blacksteel Ballet Heels -A pair of strict boots for making pets more manageable. A skilled person can still walk in these. -A pair of strict boots for making pets more manageable. A skilled person can still walk in these. -They are reinforced with top-quality ancient metal. -They are reinforced with top-quality ancient metal. -Blacksteel Leg Cuffs -Blacksteel Leg Cuffs -A pair of chained cuffs made of Blacksteel, designed to slow the wearer. -A pair of chained cuffs made of Blacksteel, designed to slow the wearer. -They're made of Blacksteel, a metal used by the Old Civilization. -They're made of Blacksteel, a metal used by the Old Civilization. -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Blacksteel Cuffs -Blacksteel Cuffs -A pair of Blacksteel cuffs that make it easy to restrain you. -A pair of Blacksteel cuffs that make it easy to restrain you. -They're made of Blacksteel, a metal used by the Old Civilization. -They're made of Blacksteel, a metal used by the Old Civilization. -The enemy attaches your wrist cuffs together! -The enemy attaches your wrist cuffs together! -Blacksteel Wrist Chain -Blacksteel Wrist Chain -A pair of Blacksteel cuffs keeping your arms behind your back. -A pair of Blacksteel cuffs keeping your arms behind your back. -They're made of Blacksteel, a metal used by the Old Civilization. -They're made of Blacksteel, a metal used by the Old Civilization. -Your cuffs detatch! -Your cuffs detatch! -The enemy attaches your elbow cuffs together! -The enemy attaches your elbow cuffs together! -Blacksteel Wrist Chain -Blacksteel Wrist Chain -A full set of Blacksteel cuffs keeping your arms in a strict elbow tie! -A full set of Blacksteel cuffs keeping your arms in a strict elbow tie! -They're made of Blacksteel, a metal used by the Old Civilization. -They're made of Blacksteel, a metal used by the Old Civilization. -Your wrists detatch, leaving your elbows still bound! -Your wrists detatch, leaving your elbows still bound! -Blacksteel Elbow Chain -Blacksteel Elbow Chain -A pair of Blacksteel cuffs keeping your elbows locked together!. -A pair of Blacksteel cuffs keeping your elbows locked together!. -They're made of Blacksteel, a metal used by the Old Civilization. -They're made of Blacksteel, a metal used by the Old Civilization. -Your elbows detatch! -Your elbows detatch! -The enemy attaches your wrist cuffs back together! -The enemy attaches your wrist cuffs back together! -High-Security Armbinder -High-Security Armbinder -An mythril armbinder enclosing your hands and arms completely, making your hands useless. -An mythril armbinder enclosing your hands and arms completely, making your hands useless. -Made of a flexible, yet durable material, it's going to be really tough to escape. -Made of a flexible, yet durable material, it's going to be really tough to escape. -High-Security Legbinder -High-Security Legbinder -An mythril legbinder enclosing your legs, making it difficult to move. -An mythril legbinder enclosing your legs, making it difficult to move. -Made of a flexible, yet durable material, it's going to be really tough to escape. -Made of a flexible, yet durable material, it's going to be really tough to escape. -High-Security Shackles -High-Security Shackles -A pair of mythril shackles around your feet. -A pair of mythril shackles around your feet. -Nearly indestructable, you are at the mercy of its lock. -Nearly indestructable, you are at the mercy of its lock. -High-Security BallGag -High-Security BallGag -A rubber gag shoved tightly between your lips. -A rubber gag shoved tightly between your lips. -The mythril straps are nigh-unbreakable, keeping you securely silenced. -The mythril straps are nigh-unbreakable, keeping you securely silenced. -Potion Absorber -Potion Absorber -An ancient device that allows direct use of potions even while gagged or bound. -An ancient device that allows direct use of potions even while gagged or bound. -Also allows fitting of a leash. -Also allows fitting of a leash. -Potion Absorber -Potion Absorber -An ancient device that allows direct use of potions even while gagged or bound. -An ancient device that allows direct use of potions even while gagged or bound. -Also allows fitting of a leash. -Also allows fitting of a leash. -Slime Walkers -Slime Walkers -A pair of heels coated in a nonstick material. -A pair of heels coated in a nonstick material. -They will slow you down, but you can walk on slime without getting stuck! -They will slow you down, but you can walk on slime without getting stuck! -Slime Walkers -Slime Walkers -A pair of heels coated in a nonstick material. -A pair of heels coated in a nonstick material. -They will slow you down, but you can walk on slime without getting stuck! -They will slow you down, but you can walk on slime without getting stuck! -Gloves of Dexterity -Gloves of Dexterity -A pair of gloves that makes your hits strike with elven grace--and force. -A pair of gloves that makes your hits strike with elven grace--and force. -Increases accuracy by +50. Reduces melee damage by 30%. -Increases accuracy by +50. Reduces melee damage by 30%. -Gloves of Dexterity -Gloves of Dexterity -A pair of gloves that makes your hits strike with elven grace--and force. -A pair of gloves that makes your hits strike with elven grace--and force. -Increases accuracy by +50. Reduces melee damage by 30%. -Increases accuracy by +50. Reduces melee damage by 30%. -You find a pair of leather gloves with a magic rune. -You find a pair of leather gloves with a magic rune. -Bracers of Roaring Tides -Bracers of Roaring Tides -A pair of bracers that conjures a mighty wave upon attacking. -A pair of bracers that conjures a mighty wave upon attacking. -Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage. -Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage. -Bracers of Roaring Tides -Bracers of Roaring Tides -A pair of bracers that conjures a mighty wave upon attacking. -A pair of bracers that conjures a mighty wave upon attacking. -Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage. -Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage. -You find a pair of bracers that are transparent like water. -You find a pair of bracers that are transparent like water. -The curse on the RestraintName is lifted! -The curse on the RestraintName is lifted! -Press RIGHT to confirm buy! -Press RIGHT to confirm buy! - - - - - - - - - - - - -You find -You find -Collar -Collar -A classy leather collar. -A classy leather collar. -Allows fitting of a leash. -Allows fitting of a leash. -Slave Collar -Slave Collar -A high-security steel collar befitting of a slave. -A high-security steel collar befitting of a slave. -Allows fitting of a leash. -Allows fitting of a leash. -Enchanted Collar -Enchanted Collar -A collar made with magically enchanted materials. It is difficult to cut off. -A collar made with magically enchanted materials. It is difficult to cut off. -Allows fitting of a leash. -Allows fitting of a leash. -Kitty Collar -Kitty Collar -A collar made with magically enchanted materials. It is protected by the blessing of Bast. -A collar made with magically enchanted materials. It is protected by the blessing of Bast. -Allows fitting of a leash. -Allows fitting of a leash. -Leash -Leash -A leash made from a strong material. -A leash made from a strong material. -Functions as a handle for moving unruly prisoners. -Functions as a handle for moving unruly prisoners. -Prisoner Plug -Prisoner Plug -A teaser to keep you occupied. -A teaser to keep you occupied. -Buzzes on spellcast, and periodically as well. -Buzzes on spellcast, and periodically as well. -High-Security Chastity Belt -High-Security Chastity Belt -A chastity belt to protect prisoners from themselves. -A chastity belt to protect prisoners from themselves. -Made of a highly durable material. -Made of a highly durable material. -Blacksteel Chastity Belt -Blacksteel Chastity Belt -A chastity belt to protect prisoners from themselves. -A chastity belt to protect prisoners from themselves. -Made of a highly durable material. -Made of a highly durable material. -Charms (Arms) -Charms (Arms) -A band of faintly magic ribbon wrapped tight around your arms. -A band of faintly magic ribbon wrapped tight around your arms. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Charms (Legs) -Charms (Legs) -A band of faintly magic ribbon wrapped tight around your thighs. -A band of faintly magic ribbon wrapped tight around your thighs. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Charms (Feet) -Charms (Feet) -A band of faintly magic ribbon wrapped tight around your ankles. -A band of faintly magic ribbon wrapped tight around your ankles. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Charms (Head) -Charms (Head) -A band of faintly magic ribbon wrapped tight around your eyes. -A band of faintly magic ribbon wrapped tight around your eyes. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Charm Gag -Charm Gag -A band of faintly magic ribbon wrapped tight around your mouth. -A band of faintly magic ribbon wrapped tight around your mouth. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Charm Wrapping (Toes) -Charm Wrapping (Toes) -A layer of faintly magic ribbon wrapped tight around your feet. -A layer of faintly magic ribbon wrapped tight around your feet. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Charm Wrapping (Head) -Charm Wrapping (Head) -A layer of faintly magic ribbon wrapped tight around your face. -A layer of faintly magic ribbon wrapped tight around your face. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Charm Wrapping (Arms) -Charm Wrapping (Arms) -A layer of faintly magic ribbon wrapped tight around your body. -A layer of faintly magic ribbon wrapped tight around your body. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Charm Wrapping (Feet) -Charm Wrapping (Feet) -A layer of faintly magic ribbon wrapped tight around your shins. -A layer of faintly magic ribbon wrapped tight around your shins. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Charm Wrapping (Legs) -Charm Wrapping (Legs) -A layer of faintly magic ribbon wrapped tight around your thighs. -A layer of faintly magic ribbon wrapped tight around your thighs. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Leather Panel Gag -Leather Panel Gag -A gag that seals your lips tightly and stuffs your mouth with a ball. -A gag that seals your lips tightly and stuffs your mouth with a ball. -The harness is comprehensive and it's locked in place. -The harness is comprehensive and it's locked in place. -Harness Ball Gag -Harness Ball Gag -A gag that stuffs your mouth with a large silicone ball. -A gag that stuffs your mouth with a large silicone ball. -The harness is comprehensive and it's locked in place. -The harness is comprehensive and it's locked in place. -Bast Gag -Bast Gag -A gag used to silence new initiates of the Bast cult. -A gag used to silence new initiates of the Bast cult. -The harness is comprehensive and it's locked in place. -The harness is comprehensive and it's locked in place. -Bast Muzzle -Bast Muzzle -A muzzle used to keep a Bast gag secure. -A muzzle used to keep a Bast gag secure. -The leather panel is tough and tight. -The leather panel is tough and tight. -Bast Blindfold -Bast Blindfold -A blindfold used to aid in meditation. -A blindfold used to aid in meditation. -It is padded but still lets some light through. -It is padded but still lets some light through. -Bast Paws -Bast Paws -Leather mittens used to pacify new initiates of the Bast cult. -Leather mittens used to pacify new initiates of the Bast cult. -They make it hard to manipulate anything at all, but aren't the toughest material. -They make it hard to manipulate anything at all, but aren't the toughest material. -Bast Suit -Bast Suit -A skintight suit used on unruly initiates of the Bast cult. -A skintight suit used on unruly initiates of the Bast cult. -It's nearly impossible to escape without help once locked inside. -It's nearly impossible to escape without help once locked inside. -Bast Petsuit -Bast Petsuit -Enhanced suit used for select members of the Bast cult. -Enhanced suit used for select members of the Bast cult. -It's nearly impossible to escape without help once locked inside. -It's nearly impossible to escape without help once locked inside. -Magic Petsuit -Magic Petsuit -A set of straps and buckles enchanted with a powerful spell to render you helpless. -A set of straps and buckles enchanted with a powerful spell to render you helpless. -It's warded against cutting by nonmagic blades. -It's warded against cutting by nonmagic blades. -Blessed Wrappings (Head) -Blessed Wrappings (Head) -A band of magic embalming ribbon wrapped tight around your eyes. -A band of magic embalming ribbon wrapped tight around your eyes. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Blessed Wrappings (Gag) -Blessed Wrappings (Gag) -A band of magic embalming ribbon wrapped tight around your mouth. -A band of magic embalming ribbon wrapped tight around your mouth. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Blessed Wrappings (Arms) -Blessed Wrappings (Arms) -A layer of magic embalming ribbon wrapped tight around your body. -A layer of magic embalming ribbon wrapped tight around your body. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Blessed Wrappings (Feet) -Blessed Wrappings (Feet) -A layer of magic embalming ribbon wrapped tight around your shins. -A layer of magic embalming ribbon wrapped tight around your shins. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Blessed Wrappings (Toes) -Blessed Wrappings (Toes) -A layer of magic embalming ribbon wrapped tight around your feet. -A layer of magic embalming ribbon wrapped tight around your feet. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Blessed Wrappings (Legs) -Blessed Wrappings (Legs) -A layer of magic embalming ribbon wrapped tight around your thighs. -A layer of magic embalming ribbon wrapped tight around your thighs. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Autotape (Hands) -Autotape (Hands) -Sticky tape made from a metallic material. Used to great effect in police situations. -Sticky tape made from a metallic material. Used to great effect in police situations. -It's very sticky and seals your hands tightly, making any struggling ineffective. -It's very sticky and seals your hands tightly, making any struggling ineffective. -Autotape (Head) -Autotape (Head) -Sticky tape made from a metallic material. Used to great effect in police situations. -Sticky tape made from a metallic material. Used to great effect in police situations. -It's very sticky and tough but you could probably get a knife through it. -It's very sticky and tough but you could probably get a knife through it. -Autotape (Arms) -Autotape (Arms) -Sticky tape made from a metallic material. Used to great effect in police situations. -Sticky tape made from a metallic material. Used to great effect in police situations. -It's very sticky and tough but you could probably get a knife through it. -It's very sticky and tough but you could probably get a knife through it. -Autotape (Legs) -Autotape (Legs) -Sticky tape made from a metallic material. Used to great effect in police situations. -Sticky tape made from a metallic material. Used to great effect in police situations. -It's very sticky and tough but you could probably get a knife through it. -It's very sticky and tough but you could probably get a knife through it. -Autotape (Ankles) -Autotape (Ankles) -Sticky tape made from a metallic material. Used to great effect in police situations. -Sticky tape made from a metallic material. Used to great effect in police situations. -It's very sticky and tough but you could probably get a knife through it. -It's very sticky and tough but you could probably get a knife through it. -Autotape (Feet) -Autotape (Feet) -Sticky tape made from a metallic material. Used to great effect in police situations. -Sticky tape made from a metallic material. Used to great effect in police situations. -It's very sticky and tough but you could probably get a knife through it. -It's very sticky and tough but you could probably get a knife through it. -Autotape (Mouth) -Autotape (Mouth) -Sticky tape made from a metallic material. Used to great effect in police situations. -Sticky tape made from a metallic material. Used to great effect in police situations. -It's very sticky and tough but you could probably get a knife through it. -It's very sticky and tough but you could probably get a knife through it. -Stuffing -Stuffing -A stuffing of cloth. -A stuffing of cloth. -You could spit it out easily, provided nothing's covering it. -You could spit it out easily, provided nothing's covering it. -Arm Ropes -Arm Ropes -Faintly glowing ropes from a magic trap. -Faintly glowing ropes from a magic trap. -I wonder who was responsible? -I wonder who was responsible? -Leg Ropes -Leg Ropes -Faintly glowing ropes from a magic trap. -Faintly glowing ropes from a magic trap. -I wonder who was responsible? -I wonder who was responsible? -Magic Hogtie -Magic Hogtie -It pulls your wrists up to your ankles! So tight! -It pulls your wrists up to your ankles! So tight! -The knots appear to tie themselves together again, making them impossible to undo! -The knots appear to tie themselves together again, making them impossible to undo! -Magic Arm Rope -Magic Arm Rope -Strongly glowing ropes. -Strongly glowing ropes. -The knots appear to tie themselves together again, making them impossible to undo! -The knots appear to tie themselves together again, making them impossible to undo! -Magic Rope Cuffs -Magic Rope Cuffs -Strongly glowing ropes. -Strongly glowing ropes. -The knots appear to tie themselves together again, making them impossible to undo! -The knots appear to tie themselves together again, making them impossible to undo! -Magic Ropework -Magic Ropework -Strongly glowing ropes tied in an intricate pattern, making hand restraints more secure. -Strongly glowing ropes tied in an intricate pattern, making hand restraints more secure. -The knots appear to tie themselves together again, making them impossible to undo! -The knots appear to tie themselves together again, making them impossible to undo! -Magic Leg Rope -Magic Leg Rope -Strongly glowing ropes. -Strongly glowing ropes. -The knots appear to tie themselves together again, making them impossible to undo! -The knots appear to tie themselves together again, making them impossible to undo! -Magic Ankle Rope -Magic Ankle Rope -Strongly glowing ropes. -Strongly glowing ropes. -The knots appear to tie themselves together again, making them impossible to undo! -The knots appear to tie themselves together again, making them impossible to undo! -Magic Crotch Rope -Magic Crotch Rope -Strongly glowing ropes. -Strongly glowing ropes. -The knots appear to tie themselves together again, making them impossible to undo! -The knots appear to tie themselves together again, making them impossible to undo! -Magic Toe Rope -Magic Toe Rope -Strongly glowing ropes. -Strongly glowing ropes. -The knots appear to tie themselves together again, making them impossible to undo! -The knots appear to tie themselves together again, making them impossible to undo! -Mithril Hogtie -Mithril Hogtie -It pulls your wrists up to your ankles! So tight! -It pulls your wrists up to your ankles! So tight! -Made of woven mithril and enchanted to require magic blades to cut! -Made of woven mithril and enchanted to require magic blades to cut! -Mithril Arm Rope -Mithril Arm Rope -Strongly shining ropes. -Strongly shining ropes. -Made of woven mithril and enchanted to require magic blades to cut! -Made of woven mithril and enchanted to require magic blades to cut! -Mithril Leg Rope -Mithril Leg Rope -Strongly shining ropes. -Strongly shining ropes. -Made of woven mithril and enchanted to require magic blades to cut! -Made of woven mithril and enchanted to require magic blades to cut! -Mithril Ankle Rope -Mithril Ankle Rope -Strongly shining ropes. -Strongly shining ropes. -Made of woven mithril and enchanted to require magic blades to cut! -Made of woven mithril and enchanted to require magic blades to cut! -Mithril Crotch Rope -Mithril Crotch Rope -Strongly shining ropes. -Strongly shining ropes. -Made of woven mithril and enchanted to require magic blades to cut! -Made of woven mithril and enchanted to require magic blades to cut! -Mithril Rope Harness -Mithril Rope Harness -Strongly shining ropes. -Strongly shining ropes. -Made of woven mithril and enchanted to require magic blades to cut! -Made of woven mithril and enchanted to require magic blades to cut! -Mithril Toe Rope -Mithril Toe Rope -Strongly shining ropes. -Strongly shining ropes. -Made of woven mithril and enchanted to require magic blades to cut! -Made of woven mithril and enchanted to require magic blades to cut! -Mithril Collar -Mithril Collar -A collar made from an almost-weightless alloy.. -A collar made from an almost-weightless alloy.. -It feels comfortable but it's also really hard. -It feels comfortable but it's also really hard. -Mithril Cuffs -Mithril Cuffs -A pair of cuffs that make it easy to restrain you. -A pair of cuffs that make it easy to restrain you. -They feel like they aren't even there, but the material is rigid and unyielding. -They feel like they aren't even there, but the material is rigid and unyielding. -The enemy attaches your wrist cuffs together! -The enemy attaches your wrist cuffs together! -Cuffs Wrist Chain -Cuffs Wrist Chain -A pair of cuffs keeping your arms behind your back. -A pair of cuffs keeping your arms behind your back. -They feel like they aren't even there, but the material is rigid and unyielding. -They feel like they aren't even there, but the material is rigid and unyielding. -Your cuffs detatch! -Your cuffs detatch! -The enemy attaches your elbow cuffs together! -The enemy attaches your elbow cuffs together! -Cuffs Wrist Chain -Cuffs Wrist Chain -A full set of cuffs keeping your arms in a strict elbow tie! -A full set of cuffs keeping your arms in a strict elbow tie! -They feel like they aren't even there, but the material is rigid and unyielding. -They feel like they aren't even there, but the material is rigid and unyielding. -Your wrists detatch, leaving your elbows still bound! -Your wrists detatch, leaving your elbows still bound! -Elbow Cuffs Chain -Elbow Cuffs Chain -A pair of cuffs keeping your elbows locked together!. -A pair of cuffs keeping your elbows locked together!. -They feel like they aren't even there, but the material is rigid and unyielding. -They feel like they aren't even there, but the material is rigid and unyielding. -Your elbows detatch! -Your elbows detatch! -The enemy attaches your wrist cuffs back together! -The enemy attaches your wrist cuffs back together! -Mithril Leg Cuffs -Mithril Leg Cuffs -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -They feel like they aren't even there, but the material is rigid and unyielding. -They feel like they aren't even there, but the material is rigid and unyielding. -Mithril Ankle Cuffs -Mithril Ankle Cuffs -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -They feel like they aren't even there, but the material is rigid and unyielding. -They feel like they aren't even there, but the material is rigid and unyielding. -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Cuffs Chain -Cuffs Chain -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -They feel like they aren't even there, but the material is rigid and unyielding. -They feel like they aren't even there, but the material is rigid and unyielding. -The ankle cuff chain detaches! -The ankle cuff chain detaches! -Sticky Slime -Sticky Slime -A sticky layer of slime keeping you anchored to the ground. -A sticky layer of slime keeping you anchored to the ground. -It will slow you for a single turn. -It will slow you for a single turn. -Leather Mittens -Leather Mittens -A pair of tight leather mittens enclosing your hands. -A pair of tight leather mittens enclosing your hands. -They make it almost impossible to manipulate keys and tools. Keep your hands to yourself! -They make it almost impossible to manipulate keys and tools. Keep your hands to yourself! -Leather Armbinder -Leather Armbinder -A tight leather armbinder enclosing your hands and arms completely. -A tight leather armbinder enclosing your hands and arms completely. -It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible. -It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible. -Leather Armbinder Harness -Leather Armbinder Harness -Leather belts securing your armbinder tightly. -Leather belts securing your armbinder tightly. -It's quite tight and secured by lockable buckles on your sides. -It's quite tight and secured by lockable buckles on your sides. -The armbinder harness comes off with the armbinder. -The armbinder harness comes off with the armbinder. -The cuff chains come off with the cuffs. -The cuff chains come off with the cuffs. -Handcuffs -Handcuffs -A pair of steel cuffs locked securely around your wrists. -A pair of steel cuffs locked securely around your wrists. -The lock doesn't seem very complicated. -The lock doesn't seem very complicated. -Steel Yoke -Steel Yoke -A steel bar clamped firmly around your wrists and neck, leaving you in a helpless position. -A steel bar clamped firmly around your wrists and neck, leaving you in a helpless position. -This is not something you can pick by yourself... -This is not something you can pick by yourself... -Leather Harness -Leather Harness -A leather harness of tight straps buckled around your torso. -A leather harness of tight straps buckled around your torso. -It provides an anchor point for enemies to grab onto! -It provides an anchor point for enemies to grab onto! -Ball Gag -Ball Gag -A gag made of a red squishy material. -A gag made of a red squishy material. -You can't seem to enunciate your spells properly with this in. -You can't seem to enunciate your spells properly with this in. -Tight Ball Gag -Tight Ball Gag -A gag made of a red squishy material, buckled as tight as it will go. -A gag made of a red squishy material, buckled as tight as it will go. -You can't seem to enunciate your spells properly with this in. -You can't seem to enunciate your spells properly with this in. -Magic Ball Gag -Magic Ball Gag -A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. -A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. -It's brimming with conjured energy. A normal knife won't work here! -It's brimming with conjured energy. A normal knife won't work here! -Ballet Heels -Ballet Heels -A pair of shoes with heels so tall it forces you on your toes. -A pair of shoes with heels so tall it forces you on your toes. -These will take some getting used to. -These will take some getting used to. -Leg Irons -Leg Irons -A pair of solid steel cuffs connecting your ankles inescapably. -A pair of solid steel cuffs connecting your ankles inescapably. -The lock doesn't seem very complicated. -The lock doesn't seem very complicated. -Blindfold -Blindfold -A leather strap secured onto your face and blocking vision. -A leather strap secured onto your face and blocking vision. -You can still see through the gap around your nose. -You can still see through the gap around your nose. -Magic Chastity Belt -Magic Chastity Belt -A belt protected by a magic seal. -A belt protected by a magic seal. -The shields will open up to accept new toys, but won't let them out... -The shields will open up to accept new toys, but won't let them out... -Steel Chastity Belt -Steel Chastity Belt -A cruel device used for locking magical vibrators in place. -A cruel device used for locking magical vibrators in place. -The shields will open up to accept new toys, but won't let them out... -The shields will open up to accept new toys, but won't let them out... -Blacksteel Belt -Blacksteel Belt -A cruel device used for locking magical vibrators in place. -A cruel device used for locking magical vibrators in place. -Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. -Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. -Blacksteel Bra -Blacksteel Bra -A cruel device used for locking magical massagers in place. -A cruel device used for locking magical massagers in place. -Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. -Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. -Prototype Belt -Prototype Belt -A strange device built using unknown technology. -A strange device built using unknown technology. -The lock is extremely advanced, and the ports at the bottom readily accept toys but won't let them out... -The lock is extremely advanced, and the ports at the bottom readily accept toys but won't let them out... -Steel Chastity Bra -Steel Chastity Bra -A cruel device used for locking magical massagers in place. -A cruel device used for locking magical massagers in place. -It won't stop the dungeon's little curses, but will keep you from removing them. -It won't stop the dungeon's little curses, but will keep you from removing them. -Ornate Chastity Belt -Ornate Chastity Belt -A cruel device used for locking magical vibrators in place. -A cruel device used for locking magical vibrators in place. -The lock won't come off until the magic wears off in time... -The lock won't come off until the magic wears off in time... -Ornate Chastity Bra -Ornate Chastity Bra -A cruel device used for locking magical massagers in place. -A cruel device used for locking magical massagers in place. -The lock won't come off until the magic wears off in time... -The lock won't come off until the magic wears off in time... -Maid Chastity Belt -Maid Chastity Belt -A chastity belt used to maintain control over initiate maids. -A chastity belt used to maintain control over initiate maids. -Made of hardened steel. The lock is high-security. -Made of hardened steel. The lock is high-security. -Magic Egg -Magic Egg -An energetic little friend that likes to tease you. -An energetic little friend that likes to tease you. -It is charged by residual magic from your spells. -It is charged by residual magic from your spells. -Prototype Egg -Prototype Egg -A teaser that periodically vibrates. -A teaser that periodically vibrates. -High efficiency mana conversion means longer tease duration. -High efficiency mana conversion means longer tease duration. -Vibrating Plug -Vibrating Plug -A sizeable plug that makes you happy... a little too happy. -A sizeable plug that makes you happy... a little too happy. -It vibrates periodically and allows orgasms. -It vibrates periodically and allows orgasms. -Teaser Plug -Teaser Plug -A sizeable plug that will tease you but never let you go... -A sizeable plug that will tease you but never let you go... -It vibrates weakly periodically. -It vibrates weakly periodically. -Torment Plug -Torment Plug -A sizeable plug that will make your life unbearably pleasurable... -A sizeable plug that will make your life unbearably pleasurable... -It vibrates strongly periodically and has a denial setting. -It vibrates strongly periodically and has a denial setting. -Thundering Plug -Thundering Plug -A sizeable plug that will make your life unbearably pleasurable... -A sizeable plug that will make your life unbearably pleasurable... -You're going to have the time of your life. -You're going to have the time of your life. -Maid Egg -Maid Egg -An energetic little friend that likes to tease you and takes orders from the head maid. -An energetic little friend that likes to tease you and takes orders from the head maid. -It is charged by residual magic from your spells. -It is charged by residual magic from your spells. -Stainless Plug -Stainless Plug -A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... -A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... -This one goes in the front. -This one goes in the front. -Stainless Plug -Stainless Plug -A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... -A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... -This one goes in the back. -This one goes in the back. -Shadow Hand Gag -Shadow Hand Gag -It clasps tightly over the mouth and prevents you from casting your spells! -It clasps tightly over the mouth and prevents you from casting your spells! -You have no choice but to struggle. -You have no choice but to struggle. -Shadow Hands (Legs) -Shadow Hands (Legs) -They are wrapped around your legs! -They are wrapped around your legs! -You have no choice but to struggle. -You have no choice but to struggle. -Shadow Hands (Legs) -Shadow Hands (Legs) -They are wrapped around your legs! -They are wrapped around your legs! -You have no choice but to struggle. -You have no choice but to struggle. -Shadow Hands (Arms) -Shadow Hands (Arms) -They are squeezing you tightly! -They are squeezing you tightly! -You have no choice but to struggle. -You have no choice but to struggle. -Shadow Hands (Arms) -Shadow Hands (Arms) -They are squeezing you tightly! -They are squeezing you tightly! -You have no choice but to struggle. -You have no choice but to struggle. -Shadow Hands (Feet) -Shadow Hands (Feet) -They are holding your feet together! -They are holding your feet together! -You have no choice but to struggle. -You have no choice but to struggle. -Shadow Hands... -Shadow Hands... -They are holding your... uh... -They are holding your... uh... -You have no choice but to struggle. -You have no choice but to struggle. -Wrist Rope -Wrist Rope -A box tie keeping your arms secured behind your back. -A box tie keeping your arms secured behind your back. -The ropes squeeze you gently. -The ropes squeeze you gently. -Rope Cuffs -Rope Cuffs -A quick tie for apprehending prisoners. -A quick tie for apprehending prisoners. -It's not very secure. -It's not very secure. -Intricate Ropework -Intricate Ropework -A quick tie for apprehending prisoners, looped through buckles on the hand restraints. -A quick tie for apprehending prisoners, looped through buckles on the hand restraints. -It's not very secure. -It's not very secure. -Rope Hogtie -Rope Hogtie -A very strict and tight hogtie, good for subduing unruly captives. -A very strict and tight hogtie, good for subduing unruly captives. -It's very secure. You tug on the rope connecting your feet and struggle. -It's very secure. You tug on the rope connecting your feet and struggle. -Rope Belt -Rope Belt -A harness acting as a handle to pull you around -A harness acting as a handle to pull you around -The ropes squeeze you gently. -The ropes squeeze you gently. -Rope Harness -Rope Harness -A harness that secures your other restraints and makes them tighter. -A harness that secures your other restraints and makes them tighter. -The ropes squeeze you gently. -The ropes squeeze you gently. -Crotch Rope -Crotch Rope -A tight rope impressing upon your most private areas... -A tight rope impressing upon your most private areas... -The ropes squeeze you gently. -The ropes squeeze you gently. -Wrist Rope -Wrist Rope -A wrist and elbow tie keeping your arms secured behind your back. -A wrist and elbow tie keeping your arms secured behind your back. -The ropes squeeze you gently. -The ropes squeeze you gently. -Leg Ropes -Leg Ropes -A tie that hobbles your legs together.. -A tie that hobbles your legs together.. -The ropes squeeze you gently. -The ropes squeeze you gently. -Ankle Ropes -Ankle Ropes -A tie keeping your feet secured together. -A tie keeping your feet secured together. -The ropes squeeze you gently. -The ropes squeeze you gently. -Holy Wrist Rope -Holy Wrist Rope -A box tie keeping your arms secured behind your back. -A box tie keeping your arms secured behind your back. -They are aware of your movements... -They are aware of your movements... -Holy Rope Cuffs -Holy Rope Cuffs -A quick tie for apprehending prisoners. -A quick tie for apprehending prisoners. -They are aware of your movements... -They are aware of your movements... -Holy Ropework -Holy Ropework -A quick tie for apprehending prisoners, looped through buckles and fasteners. -A quick tie for apprehending prisoners, looped through buckles and fasteners. -They are aware of your movements... -They are aware of your movements... -Holy Rope Belt -Holy Rope Belt -A harness acting as a handle to pull you around -A harness acting as a handle to pull you around -They are aware of your movements... -They are aware of your movements... -Holy Crotch Rope -Holy Crotch Rope -A tight rope impressing upon your most private areas... -A tight rope impressing upon your most private areas... -They are aware of your movements... -They are aware of your movements... -Holy Wrist Rope -Holy Wrist Rope -A wrist and elbow tie keeping your arms secured behind your back. -A wrist and elbow tie keeping your arms secured behind your back. -They are aware of your movements... -They are aware of your movements... -Holy Leg Ropes -Holy Leg Ropes -A tie that hobbles your legs together.. -A tie that hobbles your legs together.. -They are aware of your movements... -They are aware of your movements... -Holy Ankle Ropes -Holy Ankle Ropes -A tie keeping your feet secured together. -A tie keeping your feet secured together. -They are aware of your movements... -They are aware of your movements... -Wrist Vines -Wrist Vines -A box tie keeping your arms secured behind your back. -A box tie keeping your arms secured behind your back. -The vines twitch as they try to wrap around tighter. -The vines twitch as they try to wrap around tighter. -Vine Harness -Vine Harness -A harness acting as a handle to pull you around -A harness acting as a handle to pull you around -The vines twitch as they try to wrap around tighter. -The vines twitch as they try to wrap around tighter. -Leg Vines -Leg Vines -A tie that hobbles your legs together.. -A tie that hobbles your legs together.. -The vines twitch as they try to wrap around tighter. -The vines twitch as they try to wrap around tighter. -Ankle Vines -Ankle Vines -A tie keeping your feet secured together. -A tie keeping your feet secured together. -The vines twitch as they try to wrap around tighter. -The vines twitch as they try to wrap around tighter. -Quik-Bind Cuffs -Quik-Bind Cuffs -A set of high-security cuffs that are both restrictive and quick to apply. -A set of high-security cuffs that are both restrictive and quick to apply. -It uses a twelve-disc detainer lock. -It uses a twelve-disc detainer lock. -Wolfbinder -Wolfbinder -A sophisticated training system used to keep wolfgirls from scratching their owners. -A sophisticated training system used to keep wolfgirls from scratching their owners. -Despite the harsh position, it is padded, breathable, and suitable for long term wear. -Despite the harsh position, it is padded, breathable, and suitable for long term wear. -Smart Training Cuffs -Smart Training Cuffs -Cuffs with a feature to punish the wearer if they act aggressively. -Cuffs with a feature to punish the wearer if they act aggressively. -They are solid metal and will be hard to remove without the key. -They are solid metal and will be hard to remove without the key. -Linked Smart Cuffs -Linked Smart Cuffs -Cuffs with a feature to punish the wearer if they act aggressively. -Cuffs with a feature to punish the wearer if they act aggressively. -Looks like you got yourself in trouble. -Looks like you got yourself in trouble. -Training Harness -Training Harness -A harness that keeps a wolfgirl's suit together. It makes escaping more difficult. -A harness that keeps a wolfgirl's suit together. It makes escaping more difficult. -While it is weatherproof and rugged, its straps are merely nylon. -While it is weatherproof and rugged, its straps are merely nylon. -Training Gag -Training Gag -A gag used to prevent wolfgirls from biting their owners. -A gag used to prevent wolfgirls from biting their owners. -It is reinforced with steel cables, so getting it off will be tricky. -It is reinforced with steel cables, so getting it off will be tricky. -Training Collar -Training Collar -A collar used to keep unruly wolfgirls in check. -A collar used to keep unruly wolfgirls in check. -If it works on them, it sure as heck works on you. -If it works on them, it sure as heck works on you. -Training Leash -Training Leash -A leash used for training pets. -A leash used for training pets. -It is a steel cable with a weatherproof rubber coating, and a convenient handle. -It is a steel cable with a weatherproof rubber coating, and a convenient handle. -Your ankle cuffs snap together on their own! -Your ankle cuffs snap together on their own! -Your ankle cuffs detach! -Your ankle cuffs detach! -Asylum Muzzle -Asylum Muzzle -The nurses use this on noisy patients! -The nurses use this on noisy patients! -It's sturdy leather... -It's sturdy leather... -Asylum Jacket -Asylum Jacket -A straitjacket that keeps patients out of trouble. -A straitjacket that keeps patients out of trouble. -It has many straps and is very difficult to escape. -It has many straps and is very difficult to escape. -Asylum Legbinder -Asylum Legbinder -This legbinder will keep the patient from kicking the nurses. -This legbinder will keep the patient from kicking the nurses. -It has both laces and straps. -It has both laces and straps. -Asylum Ankle Cuffs -Asylum Ankle Cuffs -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -They can be thrown from long distances. -They can be thrown from long distances. -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Cuffs Chain -Cuffs Chain -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -They can be thrown from long distances. -They can be thrown from long distances. -The ankle cuff chain detaches! -The ankle cuff chain detaches! -Asylum Leg Cuffs -Asylum Leg Cuffs -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -They can be thrown from long distances. -They can be thrown from long distances. -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Transport Jacket -Transport Jacket -This jacket goes over a straitjacket to keep the arms trapped. -This jacket goes over a straitjacket to keep the arms trapped. -It makes it extraordinarily difficult to escape the jacket it covers. -It makes it extraordinarily difficult to escape the jacket it covers. -Asylum Cuffs -Asylum Cuffs -A pair of leather cuffs that make it easy to restrain you. -A pair of leather cuffs that make it easy to restrain you. -They're made of tough cowhide. -They're made of tough cowhide. -The enemy attaches your wrist cuffs together! -The enemy attaches your wrist cuffs together! -Wrist Chain -Wrist Chain -A pair of leather cuffs keeping your arms behind your back. -A pair of leather cuffs keeping your arms behind your back. -They're made of tough cowhide. -They're made of tough cowhide. -Your cuffs detatch! -Your cuffs detatch! -The enemy attaches your elbow cuffs together! -The enemy attaches your elbow cuffs together! -Wrist Chain -Wrist Chain -A full set of leather cuffs keeping your arms in a strict elbow tie! -A full set of leather cuffs keeping your arms in a strict elbow tie! -They're made of tough cowhide. -They're made of tough cowhide. -Your wrists detatch, leaving your elbows still bound! -Your wrists detatch, leaving your elbows still bound! -Elbow Chain -Elbow Chain -A pair of leather cuffs keeping your elbows locked together!. -A pair of leather cuffs keeping your elbows locked together!. -They're made of tough cowhide. -They're made of tough cowhide. -Your elbows detatch! -Your elbows detatch! -The enemy attaches your wrist cuffs back together! -The enemy attaches your wrist cuffs back together! -Comfy Muzzle -Comfy Muzzle -A lovely muzzle that's extraordinarily comfy! -A lovely muzzle that's extraordinarily comfy! -It's made of an ethereal material... -It's made of an ethereal material... -Comfy Straitjacket -Comfy Straitjacket -A straitjacket that is padded on the inside. -A straitjacket that is padded on the inside. -It feels tight but is actually made of an ethereal material... -It feels tight but is actually made of an ethereal material... -Latex Jacket -Latex Jacket -A tight jacket that holds your arms completely useless. -A tight jacket that holds your arms completely useless. -It has too much grip to struggle out of -It has too much grip to struggle out of -Latex Armbinder -Latex Armbinder -A tight armbinder that pins your arms tightly behind your back -A tight armbinder that pins your arms tightly behind your back -It has too much grip to struggle out of -It has too much grip to struggle out of -Latex Legbinder -Latex Legbinder -A tight legbinder that keeps your legs together! -A tight legbinder that keeps your legs together! -It has too much grip to struggle out of -It has too much grip to struggle out of -Latex Boots -Latex Boots -A tight pair of boots that makes it difficult to walk! -A tight pair of boots that makes it difficult to walk! -It has too much grip to struggle out of -It has too much grip to struggle out of -Heavy Latex Corset -Heavy Latex Corset -An excruciatingly tight corset that hugs your body -An excruciatingly tight corset that hugs your body -It has too much grip to struggle out of -It has too much grip to struggle out of -Blue Latex Catsuit -Blue Latex Catsuit -A skintight suit that's stretched on tight. It adheres to latex restraints making struggling more difficult. -A skintight suit that's stretched on tight. It adheres to latex restraints making struggling more difficult. -Blue latex is silky smooth, very stretchy, and very good at adhering to itself. -Blue latex is silky smooth, very stretchy, and very good at adhering to itself. -Scale Boxtie Binder -Scale Boxtie Binder -A secure but comfortable binder meant for long-term wear by long-term prisoners of the Dragonhearts. -A secure but comfortable binder meant for long-term wear by long-term prisoners of the Dragonhearts. -It is made from durable dragonscale, but secured with ordinary buckles. -It is made from durable dragonscale, but secured with ordinary buckles. -Dragonscale Straps -Dragonscale Straps -A set of straps buckling tightly around your body and secured at the wrists. -A set of straps buckling tightly around your body and secured at the wrists. -It's made from hard-to-cut dragonscale!!! -It's made from hard-to-cut dragonscale!!! -Scale Leg Cuffs -Scale Leg Cuffs -A pair of chained cuffs made of dragonscale. They slow your stride. -A pair of chained cuffs made of dragonscale. They slow your stride. -It's made from hard-to-cut dragonscale!!! -It's made from hard-to-cut dragonscale!!! -Scale Ankle Cuffs -Scale Ankle Cuffs -A pair of chained cuffs made of dragonscale. They slow your stride. -A pair of chained cuffs made of dragonscale. They slow your stride. -It's made from hard-to-cut dragonscale!!! -It's made from hard-to-cut dragonscale!!! -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Scale Cuffs Chain -Scale Cuffs Chain -A pair of chained cuffs made of dragonscale. They slow your stride. -A pair of chained cuffs made of dragonscale. They slow your stride. -It's made from hard-to-cut dragonscale!!! -It's made from hard-to-cut dragonscale!!! -The ankle cuff chain detaches! -The ankle cuff chain detaches! -Dragonscale Boots -Dragonscale Boots -A pair of extremely high heels lined with dragonscale. They are hard to walk in. -A pair of extremely high heels lined with dragonscale. They are hard to walk in. -It's made from hard-to-cut dragonscale!!! -It's made from hard-to-cut dragonscale!!! -Dragonscale Gag -Dragonscale Gag -A gag made of a squishy material and secured with dragonscale straps. -A gag made of a squishy material and secured with dragonscale straps. -It's made from hard-to-cut dragonscale!!! -It's made from hard-to-cut dragonscale!!! -Dragonscale Muzzle -Dragonscale Muzzle -A muzzle to keep ball gags pressed firmly into the mouth. -A muzzle to keep ball gags pressed firmly into the mouth. -It's made from hard-to-cut dragonscale!!! -It's made from hard-to-cut dragonscale!!! -Dragon Collar -Dragon Collar -A collar owned by the Dragonhearts, an order of dragonslayers. -A collar owned by the Dragonhearts, an order of dragonslayers. -It's made from hard-to-cut dragonscale!!! -It's made from hard-to-cut dragonscale!!! -Steel Cuffs -Steel Cuffs -A pair of steel cuffs that make it easy to restrain you. -A pair of steel cuffs that make it easy to restrain you. -They're made of shining steel. -They're made of shining steel. -The enemy attaches your wrist cuffs together! -The enemy attaches your wrist cuffs together! -Steel Wrist Chain -Steel Wrist Chain -A pair of steel cuffs keeping your arms behind your back. -A pair of steel cuffs keeping your arms behind your back. -They're made of shining steel. -They're made of shining steel. -Your cuffs detatch! -Your cuffs detatch! -The enemy attaches your elbow cuffs together! -The enemy attaches your elbow cuffs together! -Magnetic Cuffs -Magnetic Cuffs -A pair of bulky cuffs with coils visible on the inside... -A pair of bulky cuffs with coils visible on the inside... -They have no visible attachment points... -They have no visible attachment points... -The electric damage causes your cuffs to attach together! -The electric damage causes your cuffs to attach together! -Magnetic Link -Magnetic Link -The magnetic cuffs are rigidly attached! -The magnetic cuffs are rigidly attached! -They won't budge! There's a button to release them but it's hard to reach... -They won't budge! There's a button to release them but it's hard to reach... -Your cuffs detatch! -Your cuffs detatch! -Magnetic Ankle Cuffs -Magnetic Ankle Cuffs -A pair of bulky leg irons with coils visible on the inside. -A pair of bulky leg irons with coils visible on the inside. -They have no visible attachment points... -They have no visible attachment points... -The electric damage causes your ankle cuffs to snap together! -The electric damage causes your ankle cuffs to snap together! -Magnetic Link -Magnetic Link -The magnetic cuffs are rigidly attached! -The magnetic cuffs are rigidly attached! -They won't budge! There's a button to release them but it's hard to reach... -They won't budge! There's a button to release them but it's hard to reach... -Your ankle cuffs detatch! -Your ankle cuffs detatch! -Leather Ankle Cuffs -Leather Ankle Cuffs -A pair of chained cuffs made of leather. They make it trickier to run away. -A pair of chained cuffs made of leather. They make it trickier to run away. -They're made of tough cowhide. -They're made of tough cowhide. -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Cuffs Chain -Cuffs Chain -A pair of chained cuffs made of leather. They make it trickier to run away. -A pair of chained cuffs made of leather. They make it trickier to run away. -They're made of tough cowhide. -They're made of tough cowhide. -The ankle cuff chain detaches! -The ankle cuff chain detaches! -Leather Leg Cuffs -Leather Leg Cuffs -A pair of chained cuffs made of leather. They make it trickier to run away. -A pair of chained cuffs made of leather. They make it trickier to run away. -They're made of tough cowhide. -They're made of tough cowhide. -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Leather Cuffs -Leather Cuffs -A pair of leather cuffs that make it easy to restrain you. -A pair of leather cuffs that make it easy to restrain you. -They're made of tough cowhide. -They're made of tough cowhide. -The enemy attaches your wrist cuffs together! -The enemy attaches your wrist cuffs together! -Lthr Wrist Chain -Lthr Wrist Chain -A pair of leather cuffs keeping your arms behind your back. -A pair of leather cuffs keeping your arms behind your back. -They're made of tough cowhide. -They're made of tough cowhide. -Your cuffs detatch! -Your cuffs detatch! -The enemy attaches your elbow cuffs together! -The enemy attaches your elbow cuffs together! -Lthr Wrist Chain -Lthr Wrist Chain -A full set of leather cuffs keeping your arms in a strict elbow tie! -A full set of leather cuffs keeping your arms in a strict elbow tie! -They're made of tough cowhide. -They're made of tough cowhide. -Your wrists detatch, leaving your elbows still bound! -Your wrists detatch, leaving your elbows still bound! -Lthr Elbow Chain -Lthr Elbow Chain -A pair of leather cuffs keeping your elbows locked together!. -A pair of leather cuffs keeping your elbows locked together!. -They're made of tough cowhide. -They're made of tough cowhide. -Your elbows detatch! -Your elbows detatch! -The enemy attaches your wrist cuffs back together! -The enemy attaches your wrist cuffs back together! -Dragonscale Cuffs -Dragonscale Cuffs -A pair of cuffs that make it easy to restrain you. -A pair of cuffs that make it easy to restrain you. -They're made of dragonscale. -They're made of dragonscale. -The enemy attaches your wrist cuffs together! -The enemy attaches your wrist cuffs together! -Scale Wrist Chain -Scale Wrist Chain -A pair of cuffs keeping your arms behind your back. -A pair of cuffs keeping your arms behind your back. -They're made of dragonscale. -They're made of dragonscale. -Your cuffs detatch! -Your cuffs detatch! -The enemy attaches your elbow cuffs together! -The enemy attaches your elbow cuffs together! -Scale Wrist Chain -Scale Wrist Chain -A full set of cuffs keeping your arms in a strict elbow tie! -A full set of cuffs keeping your arms in a strict elbow tie! -They're made of dragonscale. -They're made of dragonscale. -Your wrists detatch, leaving your elbows still bound! -Your wrists detatch, leaving your elbows still bound! -Scale Elbow Chain -Scale Elbow Chain -A pair of cuffs keeping your elbows locked together!. -A pair of cuffs keeping your elbows locked together!. -They're made of dragonscale. -They're made of dragonscale. -Your elbows detatch! -Your elbows detatch! -The enemy attaches your wrist cuffs back together! -The enemy attaches your wrist cuffs back together! -Maid Jacket -Maid Jacket -A bolero jacket keeping your arms pinned snugly. You can't even move them. -A bolero jacket keeping your arms pinned snugly. You can't even move them. -There is no hope of struggling out. Better hope you can cut it... -There is no hope of struggling out. Better hope you can cut it... -Devious Maid Costume -Devious Maid Costume -A devious maid outfit that forces the arms into an elbows-touching position. -A devious maid outfit that forces the arms into an elbows-touching position. -Makes sure you focus on your work and not fooling around. -Makes sure you focus on your work and not fooling around. -Reinforced Leather Belt -Reinforced Leather Belt -A leather belt used to keep your legs hobbled. -A leather belt used to keep your legs hobbled. -It's made of a very tough reinforced leather. It will take some time to cut. -It's made of a very tough reinforced leather. It will take some time to cut. -Steel Cuffs -Steel Cuffs -A pair of steel cuffs used by the Maidforce. -A pair of steel cuffs used by the Maidforce. -They are made of solid steel. -They are made of solid steel. -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Linked Steel Cuffs -Linked Steel Cuffs -A pair of steel cuffs used by the Maidforce. -A pair of steel cuffs used by the Maidforce. -They are made of solid steel. -They are made of solid steel. -The ankle cuff chain detaches! -The ankle cuff chain detaches! -Maid Collar -Maid Collar -A collar for operatives of the Maidforce, a group of covert saboteurs. -A collar for operatives of the Maidforce, a group of covert saboteurs. -It's reinforced with metal and guarded with an expert-level lock. -It's reinforced with metal and guarded with an expert-level lock. -Plug Gag -Plug Gag -A gag with a long, mouth-filling plug that muffles speech completely. -A gag with a long, mouth-filling plug that muffles speech completely. -It's made of a very tough reinforced leather. It will take some time to cut. -It's made of a very tough reinforced leather. It will take some time to cut. -Suspicious Mask -Suspicious Mask -You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. -You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. -A well-fitted mask, covering your entire head neatly and locking in place. -A well-fitted mask, covering your entire head neatly and locking in place. -It has eyeholes for you to see out of, but blocks access to the face. -It has eyeholes for you to see out of, but blocks access to the face. -Obsidian Muzzle -Obsidian Muzzle -A muzzle made from segmented metal pieces, fitting securely over your face. -A muzzle made from segmented metal pieces, fitting securely over your face. -It's made of a dark, glistening volcanic metal. -It's made of a dark, glistening volcanic metal. -Obsidian Collar -Obsidian Collar -A collar made from a warm, shining alloy. -A collar made from a warm, shining alloy. -It's made of a dark, glistening volcanic metal. -It's made of a dark, glistening volcanic metal. -Obsidian Cuffs -Obsidian Cuffs -A pair of cuffs that make it easy to restrain you. -A pair of cuffs that make it easy to restrain you. -It's made of a dark, glistening volcanic metal. -It's made of a dark, glistening volcanic metal. -The enemy attaches your wrist cuffs together! -The enemy attaches your wrist cuffs together! -Obs. Wrist Chain -Obs. Wrist Chain -A pair of cuffs keeping your arms behind your back. -A pair of cuffs keeping your arms behind your back. -It's made of a dark, glistening volcanic metal. -It's made of a dark, glistening volcanic metal. -Your cuffs detatch! -Your cuffs detatch! -The enemy attaches your elbow cuffs together! -The enemy attaches your elbow cuffs together! -Obs. Wrist Chain -Obs. Wrist Chain -A full set of cuffs keeping your arms in a strict elbow tie! -A full set of cuffs keeping your arms in a strict elbow tie! -It's made of a dark, glistening volcanic metal. -It's made of a dark, glistening volcanic metal. -Your wrists detatch, leaving your elbows still bound! -Your wrists detatch, leaving your elbows still bound! -Obs. Elbow Chain -Obs. Elbow Chain -A pair of cuffs keeping your elbows locked together!. -A pair of cuffs keeping your elbows locked together!. -It's made of a dark, glistening volcanic metal. -It's made of a dark, glistening volcanic metal. -Your elbows detatch! -Your elbows detatch! -The enemy attaches your wrist cuffs back together! -The enemy attaches your wrist cuffs back together! -Obsidian Leg Cuffs -Obsidian Leg Cuffs -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -It's made of a dark, glistening volcanic metal. -It's made of a dark, glistening volcanic metal. -Obsidian Ankle Cuffs -Obsidian Ankle Cuffs -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -It's made of a dark, glistening volcanic metal. -It's made of a dark, glistening volcanic metal. -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Cuffs Chain -Cuffs Chain -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -It's made of a dark, glistening volcanic metal. -It's made of a dark, glistening volcanic metal. -The ankle cuff chain detaches! -The ankle cuff chain detaches! -Crystal Cuffs -Crystal Cuffs -A pair of cuffs that make it easy to restrain you. -A pair of cuffs that make it easy to restrain you. -It's made of a glowing, brittle material. -It's made of a glowing, brittle material. -The enemy attaches your wrist cuffs together! -The enemy attaches your wrist cuffs together! -Crystal Wrist Chain -Crystal Wrist Chain -A pair of cuffs keeping your arms behind your back. -A pair of cuffs keeping your arms behind your back. -It's made of a glowing, brittle material. -It's made of a glowing, brittle material. -Your cuffs detatch! -Your cuffs detatch! -The enemy attaches your elbow cuffs together! -The enemy attaches your elbow cuffs together! -Crystal Wrist Chain -Crystal Wrist Chain -A full set of cuffs keeping your arms in a strict elbow tie! -A full set of cuffs keeping your arms in a strict elbow tie! -It's made of a glowing, brittle material. -It's made of a glowing, brittle material. -Your wrists detatch, leaving your elbows still bound! -Your wrists detatch, leaving your elbows still bound! -Crystal Elbow Chain -Crystal Elbow Chain -A pair of cuffs keeping your elbows locked together!. -A pair of cuffs keeping your elbows locked together!. -It's made of a glowing, brittle material. -It's made of a glowing, brittle material. -Your elbows detatch! -Your elbows detatch! -The enemy attaches your wrist cuffs back together! -The enemy attaches your wrist cuffs back together! -Crystal Leg Cuffs -Crystal Leg Cuffs -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -It's made of a glowing, brittle material. -It's made of a glowing, brittle material. -Crystal Ankle Cuffs -Crystal Ankle Cuffs -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -It's made of a glowing, brittle material. -It's made of a glowing, brittle material. -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Cuffs Chain -Cuffs Chain -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -It's made of a glowing, brittle material. -It's made of a glowing, brittle material. -The ankle cuff chain detaches! -The ankle cuff chain detaches! -Slave Cuffs -Slave Cuffs -A pair of cuffs that make it easy to restrain you. -A pair of cuffs that make it easy to restrain you. -It's made of a gold-tinted metal with a magical enchantment. -It's made of a gold-tinted metal with a magical enchantment. -The enemy attaches your wrist cuffs together! -The enemy attaches your wrist cuffs together! -Slave Wrist Chain -Slave Wrist Chain -A pair of cuffs keeping your arms behind your back. -A pair of cuffs keeping your arms behind your back. -It's made of a gold-tinted metal with a magical enchantment. -It's made of a gold-tinted metal with a magical enchantment. -Your cuffs detatch! -Your cuffs detatch! -The enemy attaches your elbow cuffs together! -The enemy attaches your elbow cuffs together! -Slave Wrist Chain -Slave Wrist Chain -A full set of cuffs keeping your arms in a strict elbow tie! -A full set of cuffs keeping your arms in a strict elbow tie! -It's made of a gold-tinted metal with a magical enchantment. -It's made of a gold-tinted metal with a magical enchantment. -Your wrists detatch, leaving your elbows still bound! -Your wrists detatch, leaving your elbows still bound! -Slave Elbow Chain -Slave Elbow Chain -A pair of cuffs keeping your elbows locked together!. -A pair of cuffs keeping your elbows locked together!. -It's made of a gold-tinted metal with a magical enchantment. -It's made of a gold-tinted metal with a magical enchantment. -Your elbows detatch! -Your elbows detatch! -The enemy attaches your wrist cuffs back together! -The enemy attaches your wrist cuffs back together! -Slave Leg Cuffs -Slave Leg Cuffs -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -It's made of a gold-tinted metal with a magical enchantment. -It's made of a gold-tinted metal with a magical enchantment. -Slave Ankle Cuffs -Slave Ankle Cuffs -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -It's made of a gold-tinted metal with a magical enchantment. -It's made of a gold-tinted metal with a magical enchantment. -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Slave Cuffs Chain -Slave Cuffs Chain -A pair of cuffs chaining your legs together. -A pair of cuffs chaining your legs together. -It's made of a gold-tinted metal with a magical enchantment. -It's made of a gold-tinted metal with a magical enchantment. -The ankle cuff chain detaches! -The ankle cuff chain detaches! -High-Tech Gag -High-Tech Gag -A gag with a soft and filling mouthpiece, reinforced with a metallized strap. -A gag with a soft and filling mouthpiece, reinforced with a metallized strap. -It will be impossible to force it out or cut it with just a knife. -It will be impossible to force it out or cut it with just a knife. -High-Tech Cables (Arms) -High-Tech Cables (Arms) -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -They are wrapped methodically around your body! -They are wrapped methodically around your body! -High-Tech Cables (Legs) -High-Tech Cables (Legs) -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -They are wrapped methodically around your body! -They are wrapped methodically around your body! -High-Tech Cables (Harness) -High-Tech Cables (Harness) -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -They are wrapped methodically around your body! -They are wrapped methodically around your body! -Magic Ribbons (Arms) -Magic Ribbons (Arms) -Those ribbons will hold you tight~ -Those ribbons will hold you tight~ -I've put a magic seal in that bow-knot to keep it secure! -I've put a magic seal in that bow-knot to keep it secure! -Magic Ribbons (Legs) -Magic Ribbons (Legs) -Those ribbons will hold you tight~ -Those ribbons will hold you tight~ -I've put a magic seal in that bow-knot to keep it secure! -I've put a magic seal in that bow-knot to keep it secure! -Magic Ribbons (Feet) -Magic Ribbons (Feet) -Those ribbons will hold you tight~ -Those ribbons will hold you tight~ -I've put a magic seal in that bow-knot to keep it secure! -I've put a magic seal in that bow-knot to keep it secure! -Magic Ribbons (Harness) -Magic Ribbons (Harness) -Those ribbons will hold you tight~ -Those ribbons will hold you tight~ -I've put a magic seal in that bow-knot to keep it secure! -I've put a magic seal in that bow-knot to keep it secure! -Magic Ribbons (Pelvis) -Magic Ribbons (Pelvis) -Those ribbons will hold you tight~ -Those ribbons will hold you tight~ -I've put a magic seal in that bow-knot to keep it secure! -I've put a magic seal in that bow-knot to keep it secure! -Magic Ribbons (Mittens) -Magic Ribbons (Mittens) -Those ribbons will hold you tight~ -Those ribbons will hold you tight~ -They are wrapped tightly around your hands with a bow knot! -They are wrapped tightly around your hands with a bow knot! -Magic Ribbons (Gag) -Magic Ribbons (Gag) -Those ribbons will hold you tight~ -Those ribbons will hold you tight~ -They are wrapped tightly around your mouth with a bow knot! -They are wrapped tightly around your mouth with a bow knot! -Ice (Arms) -Ice (Arms) -Frigid restraints made out of ice. -Frigid restraints made out of ice. -There's no way to remove it without breaking it off. -There's no way to remove it without breaking it off. -Ice (Mouth) -Ice (Mouth) -Frigid restraints made out of ice. -Frigid restraints made out of ice. -There's no way to remove it without breaking it off. -There's no way to remove it without breaking it off. -Ice (Body) -Ice (Body) -Frigid restraints made out of ice. -Frigid restraints made out of ice. -There's no way to remove it without breaking it off. -There's no way to remove it without breaking it off. -Ice (Legs) -Ice (Legs) -Frigid restraints made out of ice. -Frigid restraints made out of ice. -There's no way to remove it without breaking it off. -There's no way to remove it without breaking it off. -Glue (Feet) -Glue (Feet) -A latex-derived glue that attaches you to the floor! It's very stretchy. -A latex-derived glue that attaches you to the floor! It's very stretchy. -Just touching it makes it stick all over... -Just touching it makes it stick all over... -Glue (Ankles) -Glue (Ankles) -A latex-derived glue that attaches you to the floor! It's very stretchy. -A latex-derived glue that attaches you to the floor! It's very stretchy. -Just touching it makes it stick all over... -Just touching it makes it stick all over... -Glue (Legs) -Glue (Legs) -A latex-derived glue that attaches you to the floor! It's very stretchy. -A latex-derived glue that attaches you to the floor! It's very stretchy. -Just touching it makes it stick all over... -Just touching it makes it stick all over... -Slime (Feet) -Slime (Feet) -Sticky slime that adheres to your body. It reacts negatively to mana... -Sticky slime that adheres to your body. It reacts negatively to mana... -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Slime (Ankles) -Slime (Ankles) -Sticky slime that adheres to your body. It reacts negatively to mana... -Sticky slime that adheres to your body. It reacts negatively to mana... -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Slime (Legs) -Slime (Legs) -Sticky slime that adheres to your body. It reacts negatively to mana... -Sticky slime that adheres to your body. It reacts negatively to mana... -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Slime (Arms) -Slime (Arms) -Sticky slime that adheres to your body. It reacts negatively to mana... -Sticky slime that adheres to your body. It reacts negatively to mana... -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Slime (Hands) -Slime (Hands) -Sticky slime that adheres to your body. It reacts negatively to mana... -Sticky slime that adheres to your body. It reacts negatively to mana... -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Slime (Mouth) -Slime (Mouth) -Sticky slime that adheres to your body. It reacts negatively to mana... -Sticky slime that adheres to your body. It reacts negatively to mana... -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Slime (Head) -Slime (Head) -Sticky slime that adheres to your body. It reacts negatively to mana... -Sticky slime that adheres to your body. It reacts negatively to mana... -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Rubber (Feet) -Rubber (Feet) -Sticky rubber that has fused itself into a shell around your body. -Sticky rubber that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Rubber (Ankles) -Rubber (Ankles) -Sticky rubber that has fused itself into a shell around your body. -Sticky rubber that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Rubber (Legs) -Rubber (Legs) -Sticky rubber that has fused itself into a shell around your body. -Sticky rubber that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Rubber (Arms) -Rubber (Arms) -Sticky rubber that has fused itself into a shell around your body. -Sticky rubber that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Rubber (Hands) -Rubber (Hands) -Sticky rubber that has fused itself into a shell around your body. -Sticky rubber that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Rubber (Mouth) -Rubber (Mouth) -Sticky rubber that has fused itself into a shell around your body. -Sticky rubber that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Rubber (Head) -Rubber (Head) -Sticky rubber that has fused itself into a shell around your body. -Sticky rubber that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Proto-Slime (Feet) -Proto-Slime (Feet) -It seems to be a precursor to the slimes everyone is familiar with? -It seems to be a precursor to the slimes everyone is familiar with? -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Proto-Slime (Ankles) -Proto-Slime (Ankles) -It seems to be a precursor to the slimes everyone is familiar with? -It seems to be a precursor to the slimes everyone is familiar with? -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Proto-Slime (Legs) -Proto-Slime (Legs) -It seems to be a precursor to the slimes everyone is familiar with? -It seems to be a precursor to the slimes everyone is familiar with? -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Proto-Slime (Arms) -Proto-Slime (Arms) -It seems to be a precursor to the slimes everyone is familiar with? -It seems to be a precursor to the slimes everyone is familiar with? -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Proto-Slime (Hands) -Proto-Slime (Hands) -It seems to be a precursor to the slimes everyone is familiar with? -It seems to be a precursor to the slimes everyone is familiar with? -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Proto-Slime (Mouth) -Proto-Slime (Mouth) -It seems to be a precursor to the slimes everyone is familiar with? -It seems to be a precursor to the slimes everyone is familiar with? -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Proto-Slime (Head) -Proto-Slime (Head) -It seems to be a precursor to the slimes everyone is familiar with? -It seems to be a precursor to the slimes everyone is familiar with? -It is an organic material that reforms around every cut you make! -It is an organic material that reforms around every cut you make! -Proto-Rubber (Feet) -Proto-Rubber (Feet) -Sticky slime that has fused itself into a shell around your body. -Sticky slime that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Proto-Rubber (Ankles) -Proto-Rubber (Ankles) -Sticky slime that has fused itself into a shell around your body. -Sticky slime that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Proto-Rubber (Legs) -Proto-Rubber (Legs) -Sticky slime that has fused itself into a shell around your body. -Sticky slime that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Proto-Rubber (Arms) -Proto-Rubber (Arms) -Sticky slime that has fused itself into a shell around your body. -Sticky slime that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Proto-Rubber (Hands) -Proto-Rubber (Hands) -Sticky slime that has fused itself into a shell around your body. -Sticky slime that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Proto-Rubber (Mouth) -Proto-Rubber (Mouth) -Sticky slime that has fused itself into a shell around your body. -Sticky slime that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Proto-Rubber (Head) -Proto-Rubber (Head) -Sticky slime that has fused itself into a shell around your body. -Sticky slime that has fused itself into a shell around your body. -There's no struggling out now, but since it's solid it may be cuttable. -There's no struggling out now, but since it's solid it may be cuttable. -Tape Mittens -Tape Mittens -Sticky tape that holds your hands into a fist! -Sticky tape that holds your hands into a fist! -It's tough to get out of without some kind of grip! -It's tough to get out of without some kind of grip! -Arm Chains -Arm Chains -Heavy chains keeping your arms securely behind your back. -Heavy chains keeping your arms securely behind your back. -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Leg Chains -Leg Chains -Heavy chains keeping your legs firmly hobbled. -Heavy chains keeping your legs firmly hobbled. -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Ankle Chains -Ankle Chains -Heavy chains keeping your feet bound together. -Heavy chains keeping your feet bound together. -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Crotch Chain -Crotch Chain -Heavy chains that serve as an anchor point around your waist. -Heavy chains that serve as an anchor point around your waist. -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Magic Arm Chains -Magic Arm Chains -Magic chains keeping your arms securely behind your back. -Magic chains keeping your arms securely behind your back. -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Magic Leg Chains -Magic Leg Chains -Magic chains keeping your legs firmly hobbled. -Magic chains keeping your legs firmly hobbled. -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Magic Ankle Chains -Magic Ankle Chains -Magic chains keeping your feet bound together. -Magic chains keeping your feet bound together. -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Magic Crotch Chain -Magic Crotch Chain -Magic chains that serve as an anchor point around your waist. -Magic chains that serve as an anchor point around your waist. -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Shadow Chains (Arms) -Shadow Chains (Arms) -Black chains for those who cross the divines -Black chains for those who cross the divines -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Shadow Chains (Legs) -Shadow Chains (Legs) -Black chains for those who cross the divines -Black chains for those who cross the divines -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Shadow Chains (Ankles) -Shadow Chains (Ankles) -Black chains for those who cross the divines -Black chains for those who cross the divines -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Shadow Chain -Shadow Chain -Black chains for those who cross the divines -Black chains for those who cross the divines -It doesn't look like a knife is up to the task... -It doesn't look like a knife is up to the task... -Ectoplasmic Chains (Arms) -Ectoplasmic Chains (Arms) -Ghostly chains from a ghost that just doesn't want to let go. -Ghostly chains from a ghost that just doesn't want to let go. -It's made of an ethereal substance. -It's made of an ethereal substance. -Ectoplasmic Chains (Legs) -Ectoplasmic Chains (Legs) -Ghostly chains from a ghost that just doesn't want to let go. -Ghostly chains from a ghost that just doesn't want to let go. -It's made of an ethereal substance. -It's made of an ethereal substance. -Ectoplasmic Chains (Ankles) -Ectoplasmic Chains (Ankles) -Ghostly chains from a ghost that just doesn't want to let go. -Ghostly chains from a ghost that just doesn't want to let go. -It's made of an ethereal substance. -It's made of an ethereal substance. -Ectoplasmic Chain -Ectoplasmic Chain -Ghostly chains from a ghost that just doesn't want to let go. -Ghostly chains from a ghost that just doesn't want to let go. -It's made of an ethereal substance. -It's made of an ethereal substance. -Divine Cuffs -Divine Cuffs -It is said that even heaven has its hierarchies... -It is said that even heaven has its hierarchies... -Shining cuffs made of holy metal. Nothing can touch it. -Shining cuffs made of holy metal. Nothing can touch it. -Divine Cuffs -Divine Cuffs -It is said that even heaven has its hierarchies... -It is said that even heaven has its hierarchies... -Shining cuffs made of holy metal. Nothing can touch it. -Shining cuffs made of holy metal. Nothing can touch it. -Divine Muzzle -Divine Muzzle -It is said that even heaven has its hierarchies... -It is said that even heaven has its hierarchies... -A shining muzzle made of holy metal. Nothing can touch it. -A shining muzzle made of holy metal. Nothing can touch it. -Blindfold -Blindfold -A piece of cloth secured onto your face and blocking vision. -A piece of cloth secured onto your face and blocking vision. -You can still see through the gap around your nose. -You can still see through the gap around your nose. -Knotted Cloth Gag -Knotted Cloth Gag -A piece of cloth tied in a knot and tied over your mouth. -A piece of cloth tied in a knot and tied over your mouth. -On its own it's not very restrictive. -On its own it's not very restrictive. -OTN Cloth Gag -OTN Cloth Gag -A piece of cloth tightened over your mouth. -A piece of cloth tightened over your mouth. -On its own it's not very restrictive. -On its own it's not very restrictive. -Blindfold -Blindfold -A scarf secured onto your face and blocking vision. -A scarf secured onto your face and blocking vision. -You can still see through the gap around your nose. -You can still see through the gap around your nose. -Scarf Gag -Scarf Gag -A scarf tightened over your mouth. -A scarf tightened over your mouth. -On its own it's not very restrictive. -On its own it's not very restrictive. -Scarf Tie -Scarf Tie -A scarf wrapped around your body. -A scarf wrapped around your body. -On its own it's not very restrictive. -On its own it's not very restrictive. -Scarf Leg Tie -Scarf Leg Tie -A scarf wrapped around your body. -A scarf wrapped around your body. -On its own it's not very restrictive. -On its own it's not very restrictive. -Scarf Ankle Tie -Scarf Ankle Tie -A scarf wrapped around your body. -A scarf wrapped around your body. -On its own it's not very restrictive. -On its own it's not very restrictive. -Arm Belts -Arm Belts -A ludicrous amount of belts secured with a buckle. -A ludicrous amount of belts secured with a buckle. -Lockable and fully adjustable to ensure snugness. -Lockable and fully adjustable to ensure snugness. -Leg Belts -Leg Belts -A ludicrous amount of belts secured with a buckle. -A ludicrous amount of belts secured with a buckle. -Lockable and fully adjustable to ensure snugness. -Lockable and fully adjustable to ensure snugness. -Ankle Belts -Ankle Belts -A ludicrous amount of belts secured with a buckle. -A ludicrous amount of belts secured with a buckle. -Lockable and fully adjustable to ensure snugness. -Lockable and fully adjustable to ensure snugness. -Wrist Cuffs -Wrist Cuffs -Heavy shackles with a rudimentary lock. -Heavy shackles with a rudimentary lock. -You could pick these with a hairpin. -You could pick these with a hairpin. -Shackles -Shackles -Heavy shackles with a rudimentary lock. -Heavy shackles with a rudimentary lock. -You could pick these with a hairpin. -You could pick these with a hairpin. -Leg Shackles -Leg Shackles -Heavy shackles with a rudimentary lock. -Heavy shackles with a rudimentary lock. -You could pick these with a hairpin. -You could pick these with a hairpin. -Ankle Shackles -Ankle Shackles -Heavy shackles with a rudimentary lock. -Heavy shackles with a rudimentary lock. -You could pick these with a hairpin. -You could pick these with a hairpin. -Ankle Shackles -Ankle Shackles -The enemy attaches your ankle cuffs together! -The enemy attaches your ankle cuffs together! -Heavy shackles with a rudimentary lock. -Heavy shackles with a rudimentary lock. -You could pick these with a hairpin. -You could pick these with a hairpin. -The ankle cuff chain detaches! -The ankle cuff chain detaches! -Steel Muzzle -Steel Muzzle -A heavy muzzle with a rudimentary lock. -A heavy muzzle with a rudimentary lock. -You could pick this with a hairpin. -You could pick this with a hairpin. -Cursed Collar -Cursed Collar -A cold steel collar locked tightly on your neck. -A cold steel collar locked tightly on your neck. -It appears to attract additional enemies to its wearer. -It appears to attract additional enemies to its wearer. -Face -Face -Head -Head -Mouth -Mouth -Mouth -Mouth -Mouth -Mouth -Ears -Ears -Collar -Collar -Neck -Neck -Arms -Arms -Hands -Hands -Torso -Torso -Bra -Bra -Belt -Belt -Plug -Plug -Vibe -Vibe -Piercings -Piercings -Nipples -Nipples -Butt Plug -Butt Plug -Legs -Legs -Ankles -Ankles -Feet -Feet -Device -Device -You found an item that was too small to see! -You found an item that was too small to see! -You picked up XXX gold. -You picked up XXX gold. -You retrieve an ancient power crystal. -You retrieve an ancient power crystal. -You retrieve a spent ancient power crystal. -You retrieve a spent ancient power crystal. -You pick up a magical amulet and use it to boost your stats. -You pick up a magical amulet and use it to boost your stats. -You picked up a knife. -You picked up a knife. -You picked up a torch. -You picked up a torch. -You found a bundle of discarded knives! -You found a bundle of discarded knives! -You picked up an enchanted knife. -You picked up an enchanted knife. -You picked up a magic knife. -You picked up a magic knife. -You picked up a lockpick. -You picked up a lockpick. -You picked up a normal key. -You picked up a normal key. -You picked up a green key. -You picked up a green key. -You picked up a blue key. -You picked up a blue key. -You picked up a willpower potion. -You picked up a willpower potion. -You picked up a glowing blue mana potion. -You picked up a glowing blue mana potion. -You picked up a glowing blue orb. -You picked up a glowing blue orb. -You picked up an invisibility potion. -You picked up an invisibility potion. -You picked up a handful of ectoplasm. -You picked up a handful of ectoplasm. -You picked up a green stamina potion. -You picked up a green stamina potion. -You picked up a frigid white potion. -You picked up a frigid white potion. -You found a peculiar note on the ground and keep it in your journal. -You found a peculiar note on the ground and keep it in your journal. -You found an uninteresting note on the ground. -You found an uninteresting note on the ground. -You pick up a heavy hammer. -You pick up a heavy hammer. -You pick up a set of bolt cutters. -You pick up a set of bolt cutters. -You pick up a sharp sword. -You pick up a sharp sword. -You pick up a flamberge. -You pick up a flamberge. -You recover your escort drone. -You recover your escort drone. -You pick up a 'magic' wand... -You pick up a 'magic' wand... -You pick up a magical ice cube. -You pick up a magical ice cube. -You find some treated hemp rope. -You find some treated hemp rope. -You pick up a feather. -You pick up a feather. -You pick up a heavy flail. -You pick up a heavy flail. -You pick up a shortspear. -You pick up a shortspear. -You pick up a pickaxe. -You pick up a pickaxe. -You pick up an enchanted sword. -You pick up an enchanted sword. -You pick up an enchanted axe. -You pick up an enchanted axe. -You pick up an enchanted hammer. -You pick up an enchanted hammer. -You pick up a light hammer that's inscribed 'IceBreaker'. -You pick up a light hammer that's inscribed 'IceBreaker'. -You pick up an enchanted spear. -You pick up an enchanted spear. -You pick up an enchanted flail. -You pick up an enchanted flail. -You pick up a powerful axe. -You pick up a powerful axe. -You pick up a consumable smoke bomb. -You pick up a consumable smoke bomb. -You picked up a stone trinket with a glowing red sigil. -You picked up a stone trinket with a glowing red sigil. -You picked up a wet rock with some kind of symbol on it. -You picked up a wet rock with some kind of symbol on it. -You picked up a crystal beautiful as the moon. -You picked up a crystal beautiful as the moon. -You picked up a strange device with a sharpened razor disc. -You picked up a strange device with a sharpened razor disc. -You find a strange ancient device with a sharp cutting blade. -You find a strange ancient device with a sharp cutting blade. -You picked up a stone trinket with a glowing blue sigil. -You picked up a stone trinket with a glowing blue sigil. -You pick up a bola. -You pick up a bola. -You pick up a bomb! -You pick up a bomb! -You pick up Dragonslaver. -You pick up Dragonslaver. -You pick up Metamorphosis. -You pick up Metamorphosis. -You pick up Four Seasons. -You pick up Four Seasons. -You pick up The Arbiter. -You pick up The Arbiter. -You pick up Dreamcatcher. -You pick up Dreamcatcher. -You retrieve the Bondage Buster. -You retrieve the Bondage Buster. -You retrieve a Nevermere Blaster Mark IV. -You retrieve a Nevermere Blaster Mark IV. -You retrieve the Messenger of Love. -You retrieve the Messenger of Love. -You retrieve Moirai's scissors. -You retrieve Moirai's scissors. -You pick up a bunch of scrolls! -You pick up a bunch of scrolls! -You pick up a Scroll of Sleight. -You pick up a Scroll of Sleight. -You pick up a Scroll of Purity. -You pick up a Scroll of Purity. -You pick up a Scroll of Speech. -You pick up a Scroll of Speech. -You pick up a Scroll of Sauntering. -You pick up a Scroll of Sauntering. -As you strike again, your weapon is pulled out of your grasp! -As you strike again, your weapon is pulled out of your grasp! -Your weapon slips out of your hand as you try to cut with it... -Your weapon slips out of your hand as you try to cut with it... -You put away the WEAPONNAME -You put away the WEAPONNAME -You equip the WEAPONNAME -You equip the WEAPONNAME -Unequip -Unequip -Equip -Equip -Equipped -Equipped - - - - -Unlit Torch -Unlit Torch -Can be lit -Can be lit -Torch -Torch -Provides light -Provides light -Lantern -Lantern -Provides light -Provides light -Magic Lantern -Magic Lantern -Provides light -Provides light -Unlit Lantern -Unlit Lantern -Can be lit -Can be lit -Wall Sconce -Wall Sconce -Provides light -Provides light -Broken Wall Sconce -Broken Wall Sconce -It is beyond repair. -It is beyond repair. -Liquid Latex -Liquid Latex -Engulfs creatures -Engulfs creatures -Slime -Slime -Slows creatures -Slows creatures -Ice -Ice -Chilling and slippery -Chilling and slippery -Ropes -Ropes -Looking for a new wearer -Looking for a new wearer -Chains -Chains -Broken pieces of chain -Broken pieces of chain -Belts -Belts -Pieces of straps and leather -Pieces of straps and leather -Vines -Vines -Fierce plantlife -Fierce plantlife -Ribbons -Ribbons -Empowered with magic -Empowered with magic -Blessed Wrappings -Blessed Wrappings -Enchanted wrappings -Enchanted wrappings -Summoning Runes -Summoning Runes -Mystical runes used for summoning -Mystical runes used for summoning -Casting Runes -Casting Runes -Mystical runes used for casting spells -Mystical runes used for casting spells -Embers -Embers -Ignition source. Blocks vision. -Ignition source. Blocks vision. -Inferno -Inferno -Deals DAMAGEDEALT fire damage per turn -Deals DAMAGEDEALT fire damage per turn -Steam -Steam -Blocks vision -Blocks vision -Smoke -Smoke -Blocks vision -Blocks vision -Cracked Earth -Cracked Earth -Makes creatures unsteady -Makes creatures unsteady -Can be controlled using CMD spells -Can be controlled using CMD spells -Can be controlled using Rubbermancy -Can be controlled using Rubbermancy -Floor -Floor -Wall -Wall -Brickwork -Brickwork -Doodad -Doodad -Furniture -Furniture -Table -Table -Shrine -Shrine -Closed Door -Closed Door -Open Door -Open Door -Closed Door -Closed Door -Open Door -Open Door -Bed -Bed -Bars -Bars -Ruined Shrine -Ruined Shrine -Orb Altar -Orb Altar -Empty Altar -Empty Altar -Chest -Chest -Empty Chest -Empty Chest -Shiny Object -Shiny Object -Shiny Object -Shiny Object -Cracked Wall -Cracked Wall -Hook -Hook -Entrance -Entrance -Exit Stairs -Exit Stairs -Mysterious Stairs -Mysterious Stairs -Ghostly Adventurer -Ghostly Adventurer -Button -Button -Conveyor -Conveyor -Doll Terminal -Doll Terminal -Doll Supply -Doll Supply -Bondage Machine -Bondage Machine -Ars Pyrotecnica -Ars Pyrotecnica -Codex Imaginus -Codex Imaginus -Clavicula Romantica -Clavicula Romantica -A book of elemental magic -A book of elemental magic -A book about conjuration -A book about conjuration -A book of manipulative spells -A book of manipulative spells -Components: -Components: -Verbal -Verbal -Arm Movements -Arm Movements -Leg Gestures -Leg Gestures -The incantation comes out as a garbled mess! -The incantation comes out as a garbled mess! -You can't raise your arms to cast the spell! -You can't raise your arms to cast the spell! -Your feet are too clumsy to perform the magic gesture! -Your feet are too clumsy to perform the magic gesture! -Next Page -Next Page -Last Page -Last Page ->>> ->>> -<<< -<<< -Random Page (your hands are tied) -Random Page (your hands are tied) -Verbal -Verbal -Arms -Arms -Legs -Legs -Misc -Misc -Elements -Elements -Conjuration -Conjuration -Illusion -Illusion -Other -Other -Strength -Strength -Dexterity -Dexterity -Intelligence -Intelligence -Misc -Misc -Learnable -Learnable -Unlearned -Unlearned -Excl. Upgrades -Excl. Upgrades -Passive -Passive -Upcast -Upcast -Buffs -Buffs -DoT -DoT -Projectiles -Projectiles -Melee -Melee -Area Damage -Area Damage -Area Denial -Area Denial -Offense -Offense -Defense -Defense -Fire -Fire -Ice -Ice -Earth -Earth -Air -Air -Lightning -Lightning -Water -Water -Rubber -Rubber -Teleport -Teleport -Physics -Physics -Conjuration -Conjuration -Summoning -Summoning -Binding -Binding -Metal -Metal -Rope -Rope -Leather -Leather -Stealth -Stealth -Projection -Projection -Alteration -Alteration -Light -Light -Shadow -Shadow -Knowledge -Knowledge -Utility -Utility -Upgrades -Upgrades -Spell Tree -Spell Tree -Willpower -Willpower -Stamina -Stamina -Magic -Magic -Damage -Damage -Distraction -Distraction -Empower to upcast spells -Empower to upcast spells -Cancel empowerment -Cancel empowerment -You channel mana through your body! Empowerment level: LEVEL -You channel mana through your body! Empowerment level: LEVEL -You are already at the maximum empowerment level! -You are already at the maximum empowerment level! -You don't have any upcast spells yet. -You don't have any upcast spells yet. -Upcast from SPELL -Upcast from SPELL -You fail to concentrate on the spell and it fizzles! -You fail to concentrate on the spell and it fizzles! -Your gag causes you to mispronounce the magic words! -Your gag causes you to mispronounce the magic words! -The ice drains your concentration! Your mana and stamina are slipping away! -The ice drains your concentration! Your mana and stamina are slipping away! -A strange, chaotic energy flows into you! Your will is weakened and your mana fades! -A strange, chaotic energy flows into you! Your will is weakened and your mana fades! -Something gently, constantly tickles you! -Something gently, constantly tickles you! -The ampule shatters on impact! -The ampule shatters on impact! -The gas ampule shatters on impact! -The gas ampule shatters on impact! -The glue ampule shatters on impact! -The glue ampule shatters on impact! -The rubber ampule shatters on impact! -The rubber ampule shatters on impact! -The latex ampule shatters on impact and forms a restraint! -The latex ampule shatters on impact and forms a restraint! -The latex ampule shatters on impact and coats your body! -The latex ampule shatters on impact and coats your body! -The latex ampule shatters on impact and sticks to you! -The latex ampule shatters on impact and sticks to you! -Gas Ampule -Gas Ampule -Glue Ampule -Glue Ampule -Rubber Ampule -Rubber Ampule -Latex Ampule -Latex Ampule -Shadowy chains appear from a rift in space! -Shadowy chains appear from a rift in space! -The roaring inferno deals 10 damage to you! -The roaring inferno deals 10 damage to you! -Mana Burst -Mana Burst -As a trainee, you have learned the technique of inducing clarity via a trance-like state at 100% distraction. However, this state is precarious, and casting spells may cause you to lose focus... -As a trainee, you have learned the technique of inducing clarity via a trance-like state at 100% distraction. However, this state is precarious, and casting spells may cause you to lose focus... -Flame Novice -Flame Novice -Unlocks fire spells. Learn Firebolt. -Unlocks fire spells. Learn Firebolt. -Lightning Novice -Lightning Novice -Unlocks electrice spells. Learn Electrify. -Unlocks electrice spells. Learn Electrify. -Water Novice -Water Novice -Unlocks water spells. Learn Water Ball. -Unlocks water spells. Learn Water Ball. -Ice Novice -Ice Novice -Unlocks ice spells. Learn Freeze. -Unlocks ice spells. Learn Freeze. -Earth Novice -Earth Novice -Unlocks earth spells. Learn Stone Skin. -Unlocks earth spells. Learn Stone Skin. -Air Novice -Air Novice -Unlocks air spells. Learn Wind Blast. -Unlocks air spells. Learn Wind Blast. -Latex 101 -Latex 101 -Unlocks latex spells. Learn Slime Ball. -Unlocks latex spells. Learn Slime Ball. -Metal 101 -Metal 101 -Unlocks metal spells. Learn Conjure Cuffs. -Unlocks metal spells. Learn Conjure Cuffs. -Rope 101 -Rope 101 -Unlocks rope spells. Learn Conjure Ropes. -Unlocks rope spells. Learn Conjure Ropes. -Leather 101 -Leather 101 -Unlocks leather spells. Learn Conjure Gag. -Unlocks leather spells. Learn Conjure Gag. -Physics 101 -Physics 101 -Unlocks teleportation and physical manipulation spells. Learn Wall. -Unlocks teleportation and physical manipulation spells. Learn Wall. -Summoning 101 -Summoning 101 -Unlocks summoning spells. Learn Summon Familiar. -Unlocks summoning spells. Learn Summon Familiar. -Blessing of Shadow -Blessing of Shadow -Unlocks shadow spells. Learn Shadow Dagger. -Unlocks shadow spells. Learn Shadow Dagger. -Blessing of Light -Blessing of Light -Unlocks light spells. Learn Flash. -Unlocks light spells. Learn Flash. -Blessing of Obscurity -Blessing of Obscurity -Unlocks invisibility spells. Learn Camouflage. -Unlocks invisibility spells. Learn Camouflage. -Projection Magic -Projection Magic -Unlocks illusory spells. Learn Summon Decoy. -Unlocks illusory spells. Learn Summon Decoy. -Alteration Magic -Alteration Magic -Unlocks alteration spells. Learn Confuse. -Unlocks alteration spells. Learn Confuse. -Arcane Knowledge -Arcane Knowledge -Unlocks knowledge and critical-strike spells. Learn True Steel, and unlocks advanced tooltips for enemies. -Unlocks knowledge and critical-strike spells. Learn True Steel, and unlocks advanced tooltips for enemies. -Glue -Glue -The glue attaches to your legs as you try to move through! -The glue attaches to your legs as you try to move through! -The glue slows you down! -The glue slows you down! -The glue slows you down! (-DamageDealt SP) -The glue slows you down! (-DamageDealt SP) -Firebolt -Firebolt -Elemental's Firebolt -Elemental's Firebolt -Elemental's Gust -Elemental's Gust -A ball of flame that does DamageDealt damage. -A ball of flame that does DamageDealt damage. -You a hurl a firebolt! -You a hurl a firebolt! -Choose aim direction -Choose aim direction -Windblast -Windblast -Three puffs of wind that do DamageDealt pressure damage, stun briefly, and push targets back. -Three puffs of wind that do DamageDealt pressure damage, stun briefly, and push targets back. -You press your wrists together and conjure a blast of wind! -You press your wrists together and conjure a blast of wind! -Choose aim direction -Choose aim direction -Knife -Knife -Throw one of your knives DamageDealt damage. Lands in the target's tile -Throw one of your knives DamageDealt damage. Lands in the target's tile -You a throw a knife! -You a throw a knife! -Choose aim direction -Choose aim direction -Shadow Dagger -Shadow Dagger -A cold shadowy blade that deals DamageDealt damage and pierces all in its path. -A cold shadowy blade that deals DamageDealt damage and pierces all in its path. -You a hurl a shadowy dagger! -You a hurl a shadowy dagger! -Choose aim direction -Choose aim direction -Shadow Slash -Shadow Slash -Shadow Scythe -Shadow Scythe -Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. -Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. -You create a tear in space with your finger! -You create a tear in space with your finger! -Choose aim direction -Choose aim direction -Portal -Portal -Teleport to a nearby location (including into darkness) with twice the range. -Teleport to a nearby location (including into darkness) with twice the range. -You call upon a misty portal to transport you! -You call upon a misty portal to transport you! -Choose target location -Choose target location -Blink -Blink -Instantly teleport to a location you can see. -Instantly teleport to a location you can see. -You teleport! -You teleport! -Choose target location -Choose target location -Ice Shard -Ice Shard -A shard of ice that does DamageDealt damage and slows for Duration turns. Freezes if already slowed or drenched. -A shard of ice that does DamageDealt damage and slows for Duration turns. Freezes if already slowed or drenched. -You a hurl a shard of ice! -You a hurl a shard of ice! -Choose aim direction -Choose aim direction -Ice Lance -Ice Lance -A quick-moving shard of ice that does DamageDealt damage and slows for Duration turns and passes through enemies. Freezes if already slowed or drenched. -A quick-moving shard of ice that does DamageDealt damage and slows for Duration turns and passes through enemies. Freezes if already slowed or drenched. -You conjure a mighty spear of ice and hurl it forward! -You conjure a mighty spear of ice and hurl it forward! -Choose aim direction -Choose aim direction -Snowball -Snowball -A fast orb that leaves behind a frigid cloud of ice. Enemies walking in the cloud take DamageDealt ice damage per tile and are slowed. -A fast orb that leaves behind a frigid cloud of ice. Enemies walking in the cloud take DamageDealt ice damage per tile and are slowed. -You a hurl a snowy blast! -You a hurl a snowy blast! -Choose aim direction -Choose aim direction -Winterblast -Winterblast -A piercing orb that leaves a trail of ice. Deals DamageDealt ice damage to enemies hit. -A piercing orb that leaves a trail of ice. Deals DamageDealt ice damage to enemies hit. -You a hurl a frigid orb! -You a hurl a frigid orb! -Choose aim direction -Choose aim direction -Freeze -Freeze -Freeze an adjacent target for Duration turns. -Freeze an adjacent target for Duration turns. -You utter dark words of ice-cold truths. -You utter dark words of ice-cold truths. -Choose a target to freeze -Choose a target to freeze -Flash Frost -Flash Frost -Deal DamageDealt ice damage in a 3x3 area. Drenched creatures are frozen for 8 turns. -Deal DamageDealt ice damage in a 3x3 area. Drenched creatures are frozen for 8 turns. -You recite a frigid poem... -You recite a frigid poem... -Choose a 3x3 area to freeze -Choose a 3x3 area to freeze -Shatter -Shatter -Shatter -Shatter -When a frozen target thaws or dies, deals DamageDealt ice damage to nearby targets and slow for 4 turns.. -When a frozen target thaws or dies, deals DamageDealt ice damage to nearby targets and slow for 4 turns.. -Ignite -Ignite -Ignite -Ignite -Ignite a friendly target for Duration turns, dealing DamageDealt fire damage per turn to it and nearby targets. -Ignite a friendly target for Duration turns, dealing DamageDealt fire damage per turn to it and nearby targets. -You spin in a circle, inscribing flames with your feet! -You spin in a circle, inscribing flames with your feet! -Choose a friendly target to ignite -Choose a friendly target to ignite -Conjure Chain -Conjure Chain -Magic Chain -Magic Chain -Witch's Chain -Witch's Chain -Throws a chain that does DamageDealt chain damage. Targets with 50% or more binding take 50 crush damage and are slowed for 4 turns. -Throws a chain that does DamageDealt chain damage. Targets with 50% or more binding take 50 crush damage and are slowed for 4 turns. -You a hurl a strand of chain! -You a hurl a strand of chain! -Choose aim direction -Choose aim direction -Conjure Ropes -Conjure Ropes -Animated Rope -Animated Rope -Launch 3 ropes that deal DamageDealt chain damage each and add 22 rope binding. -Launch 3 ropes that deal DamageDealt chain damage each and add 22 rope binding. -You animate a bunch of ropes! -You animate a bunch of ropes! -Choose aim direction -Choose aim direction -Steel Torrent -Steel Torrent -Steel Rain -Steel Rain -The plug hits you! (DamageDealt) -The plug hits you! (DamageDealt) -The plug directs itself between your legs! -The plug directs itself between your legs! -Fire 4 Steel Rain in quick succession toward the target point. Best in open spaces. -Fire 4 Steel Rain in quick succession toward the target point. Best in open spaces. -Fires a steel plug that deals DamageDealt piercing damage. Bound targets are Plugged, which increases Distraction over time. -Fires a steel plug that deals DamageDealt piercing damage. Bound targets are Plugged, which increases Distraction over time. -You raise your hand and a steel projectile appears! -You raise your hand and a steel projectile appears! -You raise your hand and several steel projectiles appear! -You raise your hand and several steel projectiles appear! -Choose aim direction -Choose aim direction -Choose target point -Choose target point -Bola -Bola -Restraining Device -Restraining Device -The thrown restraining device latches onto you as you struggle to get it off!!! -The thrown restraining device latches onto you as you struggle to get it off!!! -The restraining device wraps many elastic cables around you!!! -The restraining device wraps many elastic cables around you!!! -Shadowy Grip -Shadowy Grip -A dark hand latches onto you and holds you tight! -A dark hand latches onto you and holds you tight! -Celestial Orb -Celestial Orb -You are snugly wrapped in glowing ropes! -You are snugly wrapped in glowing ropes! -Obsidian Orb -Obsidian Orb -Metallic restraints encircle your body! -Metallic restraints encircle your body! -Rubber Bolt -Rubber Bolt -The latex spreads across your limbs and rubberizes, forming a tough barrier! -The latex spreads across your limbs and rubberizes, forming a tough barrier! -Bola -Bola -Choose aim direction -Choose aim direction -You throw a bola! -You throw a bola! -You ready a bola! -You ready a bola! -You are feeling drowsy... -You are feeling drowsy... -Shadow Strike -Shadow Strike -Shadow Heel -Shadow Heel -Runic Ward -Runic Ward -Gives yourself or a creature a magic shield for 50 turns, granting +30 Magic Armor. -Gives yourself or a creature a magic shield for 50 turns, granting +30 Magic Armor. -You whisper a word of protection! -You whisper a word of protection! -Choose creature to shield -Choose creature to shield -Afterimage -Afterimage -Massively increases a creature's evasion for 5 attacks. Expires after 25 turns. -Massively increases a creature's evasion for 5 attacks. Expires after 25 turns. -Your movements intensify! -Your movements intensify! -Choose creature to buff -Choose creature to buff -Magical Sight -Magical Sight -Highlight the location of interesting magical phenomena for 20 turns -Highlight the location of interesting magical phenomena for 20 turns -You analyze the target! -You analyze the target! -Choose object to analyze -Choose object to analyze -Barrier Runes -Barrier Runes -Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns -Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns -You raise a field of runes with a command word! -You raise a field of runes with a command word! -Choose barrier location -Choose barrier location -Electric Field -Electric Field -Creates a conductive area for Duration turns. Makes all entities in the area Conductive, forcing them to share 50% electric damage. -Creates a conductive area for Duration turns. Makes all entities in the area Conductive, forcing them to share 50% electric damage. -You energize the targeted area! -You energize the targeted area! -Choose target 3x3 area -Choose target 3x3 area -Witch's Electricity -Witch's Electricity -Witch's Electric Orb -Witch's Electric Orb -Witch's Electric Burst -Witch's Electric Burst -Electrify -Electrify -A delayed shock that deals DamageDealt damage and stuns for Duration turns. -A delayed shock that deals DamageDealt damage and stuns for Duration turns. -You charge up a burst of electricty! -You charge up a burst of electricty! -Choose target location -Choose target location -The elemental channels the force of the storm! -The elemental channels the force of the storm! -Fireball -Fireball -A slow moving ball of flame that explodes for 120 fire damage to the target and DamageDealt damage to surrounding enemies. -A slow moving ball of flame that explodes for 120 fire damage to the target and DamageDealt damage to surrounding enemies. -You a hurl a fireball! -You a hurl a fireball! -Choose aim direction -Choose aim direction -Incinerate -Incinerate -A tornado of flame that does DamageDealt damage per turn for LifeTime turns. -A tornado of flame that does DamageDealt damage per turn for LifeTime turns. -You conjure a gout of flame! -You conjure a gout of flame! -Choose target AoE location -Choose target AoE location -Hailstorm -Hailstorm -A cloud of falling ice that does DamageDealt damage per turn for LifeTime turns and slows. -A cloud of falling ice that does DamageDealt damage per turn for LifeTime turns and slows. -You conjure a flurry of frost! -You conjure a flurry of frost! -Choose target AoE location -Choose target AoE location -Raincloud -Raincloud -After 3 turns, rain falls, creating a 3x3 grid of water and dealing DamageDealt acid damage to enemies within. -After 3 turns, rain falls, creating a 3x3 grid of water and dealing DamageDealt acid damage to enemies within. -You create a stormy cloud! -You create a stormy cloud! -Choose target AoE location -Choose target AoE location -Field of Frost -Field of Frost -Freezes a 5x5 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. -Freezes a 5x5 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. -You stomp your foot and call forth the storm! -You stomp your foot and call forth the storm! -Choose target AoE location (5x5) -Choose target AoE location (5x5) -Healing Light -Healing Light -Channel to heal 15 hitpoints per turn to summoned allies within a 5x5 area. -Channel to heal 15 hitpoints per turn to summoned allies within a 5x5 area. -You conjure a healing light! -You conjure a healing light! -Choose target AoE location (5x5) -Choose target AoE location (5x5) -Crackle -Crackle -Stun Blast -Stun Blast -Storm Bolt -Storm Bolt -A bolt of lightning that does DamageDealt electric damage to enemies in a 4-range line and briefly stuns. -A bolt of lightning that does DamageDealt electric damage to enemies in a 4-range line and briefly stuns. -Lightning erupts from your fingertips! -Lightning erupts from your fingertips! -Choose line direction (max range 4 tiles) -Choose line direction (max range 4 tiles) -Tremor -Tremor -Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. -Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. -You call forth the rage of the earth. -You call forth the rage of the earth. -Choose AoE -Choose AoE -Earthquake -Earthquake -Channel for 5 turns to send 2 tremors per turn in target area. -Channel for 5 turns to send 2 tremors per turn in target area. -You channel the fury of the earth!!! -You channel the fury of the earth!!! -Choose AoE -Choose AoE -Shock Orb -Shock Orb -Shock Orb -Shock Orb -A slow-moving orb that deals DamageDealt electric damage to an adjacent enemy each turn. -A slow-moving orb that deals DamageDealt electric damage to an adjacent enemy each turn. -You hurl a charged orb! -You hurl a charged orb! -Choose aim direction (max range 4 tiles) -Choose aim direction (max range 4 tiles) -Lightning Rune -Lightning Rune -Lightning Rune -Lightning Rune -A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 5 turns to setup. -A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 5 turns to setup. -You conjure a charged trap! -You conjure a charged trap! -Choose location for trap -Choose location for trap -Freeze Rune -Freeze Rune -Freeze Rune -Freeze Rune -A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 5 turns to setup. -A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 5 turns to setup. -You conjure an icy trap! -You conjure an icy trap! -Choose location for trap -Choose location for trap -Flame Rune -Flame Rune -Flame Rune -Flame Rune -A trap that deals DamageDealt fire damage in an area. Takes 5 turns to setup. -A trap that deals DamageDealt fire damage in an area. Takes 5 turns to setup. -You conjure an incendiary trap! -You conjure an incendiary trap! -Choose location for trap -Choose location for trap -Static Sphere -Static Sphere -Static Sphere -Static Sphere -Conjure a sphere for Duration turns that makes nearby entities Conductive and each turn deals DamageDealt electric damage to one of them. -Conjure a sphere for Duration turns that makes nearby entities Conductive and each turn deals DamageDealt electric damage to one of them. -You summon a grey, featureless sphere adorned by static! -You summon a grey, featureless sphere adorned by static! -You summon a grey, featureless sphere adorned by static! -You summon a grey, featureless sphere adorned by static! -Choose sphere location -Choose sphere location -Fissure -Fissure -Lava Fissure -Lava Fissure -A great fissure erupts from the earth, dealing 70 fire damage to enemies in a 4-range line and dealing 15 damage/turn for 6 turns. -A great fissure erupts from the earth, dealing 70 fire damage to enemies in a 4-range line and dealing 15 damage/turn for 6 turns. -You stomp the ground and the earth opens its gaping maw! -You stomp the ground and the earth opens its gaping maw! -Choose line direction (max range 4 tiles) -Choose line direction (max range 4 tiles) -Lightning Bolt -Lightning Bolt -A bolt of lightning that does DamageDealt damage to enemies in an infinite line and briefly stuns. -A bolt of lightning that does DamageDealt damage to enemies in an infinite line and briefly stuns. -You unleash a bolt of lightning! -You unleash a bolt of lightning! -Choose line direction -Choose line direction -Corona -Corona -Corona -Corona -Binding Light -Binding Light -Binding Light -Binding Light -Chaos Beam -Chaos Beam -Mystic Beam -Mystic Beam -A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt fire damage to the first target hit. -A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt fire damage to the first target hit. -You charge a powerful beam attack!!! -You charge a powerful beam attack!!! -Choose line direction -Choose line direction -Icicles -Icicles -Icicle -Icicle -Channel 3 turns to fire 3 icicles that deal DamageDealt ice damage and slow for 4 turns, freezing slowed/drenched targets for 3 turns. -Channel 3 turns to fire 3 icicles that deal DamageDealt ice damage and slow for 4 turns, freezing slowed/drenched targets for 3 turns. -You raise a hand and icicles fly forward! -You raise a hand and icicles fly forward! -Choose line direction -Choose line direction -Volcanism -Volcanism -An area of summoned rocks becomes explosive. Deal fire damage to them to ignite, dealing DamageDealt fire damage to adjacent targets. -An area of summoned rocks becomes explosive. Deal fire damage to them to ignite, dealing DamageDealt fire damage to adjacent targets. -You stomp your foot and magma wells up beneath the ground! -You stomp your foot and magma wells up beneath the ground! -Choose monoliths to enchant -Choose monoliths to enchant -Coalesce -Coalesce -Gathers slime and slimed enemies into a central point. Deals DamageDealt glue damage per square of slime and Encases slimed enemies. Costs half mana if there is only slime. -Gathers slime and slimed enemies into a central point. Deals DamageDealt glue damage per square of slime and Encases slimed enemies. Costs half mana if there is only slime. -You command the slime to draw enemies in! -You command the slime to draw enemies in! -Choose area containing slime -Choose area containing slime -Animate Slime -Animate Slime -Summons up to 3 slimes on slime tiles in an AoE. The slimes are friendly to you. -Summons up to 3 slimes on slime tiles in an AoE. The slimes are friendly to you. -You concentrate magical energy into the slime, giving it a will of it's own... -You concentrate magical energy into the slime, giving it a will of it's own... -Choose area containing slime -Choose area containing slime -Animate Large Slime -Animate Large Slime -Target an area with at least 3 slime tiles. Summons a large slime that is friendly to you. -Target an area with at least 3 slime tiles. Summons a large slime that is friendly to you. -You concentrate magical energy into the slime, giving it a will of it's own... -You concentrate magical energy into the slime, giving it a will of it's own... -Choose area containing slime -Choose area containing slime -Latex Puppet -Latex Puppet -Target an area containing helpless encased enemies. Transforms up to 3 of them into latex dolls that serve you for a while. -Target an area containing helpless encased enemies. Transforms up to 3 of them into latex dolls that serve you for a while. -You concentrate magical energy into your victim's bindings, forcing them to move... -You concentrate magical energy into your victim's bindings, forcing them to move... -Choose area containing encased helpless enemies. -Choose area containing encased helpless enemies. -Solidify -Solidify -Solidifies slime in the area into Latex. Latex adheres to enemies and slowly binds them, escasing them when they are fully bound. -Solidifies slime in the area into Latex. Latex adheres to enemies and slowly binds them, escasing them when they are fully bound. -You inscribe a transmutation circle on the floor. -You inscribe a transmutation circle on the floor. -Choose area containing slime -Choose area containing slime -Slime Repulsion -Slime Repulsion -Gain +50 glue resist. -Gain +50 glue resist. -Spread -Spread -Slime in the target area expands by 1 unit in the four cardinal directions. Refreshes duration to 12-20 turns. -Slime in the target area expands by 1 unit in the four cardinal directions. Refreshes duration to 12-20 turns. -The slime spreads! -The slime spreads! -Choose area containing slime -Choose area containing slime -Wall of Slime -Wall of Slime -Unlocks horizontal and vertical slime walls that traps enemies who try to pass through. -Unlocks horizontal and vertical slime walls that traps enemies who try to pass through. -Wall of Slime (Vert) -Wall of Slime (Vert) -Creates a vertical wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. -Creates a vertical wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. -You tap your foot and a wall of slime slowly raises out of the ground. -You tap your foot and a wall of slime slowly raises out of the ground. -Choose vertical wall origin (5 tiles high) -Choose vertical wall origin (5 tiles high) -Wall of Slime (Horiz) -Wall of Slime (Horiz) -Creates a horizontal wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. -Creates a horizontal wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. -You tap your foot and a wall of slime slowly raises out of the ground. -You tap your foot and a wall of slime slowly raises out of the ground. -Choose horizontal wall origin (5 tiles wide) -Choose horizontal wall origin (5 tiles wide) -Wall of Latex -Wall of Latex -Unlocks horizontal and vertical latex walls that encase enemies that walk through. -Unlocks horizontal and vertical latex walls that encase enemies that walk through. -Wall of Latex (Vert) -Wall of Latex (Vert) -Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased -Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased -You tap your foot and a wall of latex stretches out across the corridor. -You tap your foot and a wall of latex stretches out across the corridor. -Choose vertical wall origin (5 tiles high) -Choose vertical wall origin (5 tiles high) -Wall of Latex (Horiz) -Wall of Latex (Horiz) -Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased -Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased -You tap your foot and a wall of latex stretches out across the corridor. -You tap your foot and a wall of latex stretches out across the corridor. -Choose horizontal wall origin (5 tiles wide) -Choose horizontal wall origin (5 tiles wide) -Earthshape -Earthshape -Unlocks 3 spells that allow creating mounds, rings, or lines of 50hp, 25 armor rocks. -Unlocks 3 spells that allow creating mounds, rings, or lines of 50hp, 25 armor rocks. -Earthen monoliths rise from the ground! -Earthen monoliths rise from the ground! -An earthen monolith rises from the ground! -An earthen monolith rises from the ground! -Earthshape (Ring) -Earthshape (Ring) -Create a large ring of Earthen Monoliths. They have 50 hitpoints and 25 armor. -Create a large ring of Earthen Monoliths. They have 50 hitpoints and 25 armor. -You stomp your foot and monoliths emerge in a ring around you! -You stomp your foot and monoliths emerge in a ring around you! -Choose ring origin -Choose ring origin -Earthshape (Mound) -Earthshape (Mound) -Create a 3x3 field of Earthen Monoliths. They have 50 hitpoints and 25 armor. -Create a 3x3 field of Earthen Monoliths. They have 50 hitpoints and 25 armor. -You stomp your foot and monoliths emerge from the ground! -You stomp your foot and monoliths emerge from the ground! -Choose mound origin -Choose mound origin -Earthshape (Line) -Earthshape (Line) -Create a 4-tile line of Earthen Monoliths. They have 50 hitpoints and 25 armor. -Create a 4-tile line of Earthen Monoliths. They have 50 hitpoints and 25 armor. -You stomp your foot and monoliths emerge from the ground! -You stomp your foot and monoliths emerge from the ground! -Choose line direction -Choose line direction -Rock -Rock -Rock -Rock -Channel 1 turn to launch a rock that deals DamageDealt crush damage and slows for 4 turns. Blocks up to 80 damage. -Channel 1 turn to launch a rock that deals DamageDealt crush damage and slows for 4 turns. Blocks up to 80 damage. -You raise a stone from the ground and kick it forward! -You raise a stone from the ground and kick it forward! -Choose line direction -Choose line direction -Earth Kick -Earth Kick -Stone Projectile -Stone Projectile -Kick a summoned rock to turn it into a projectile. Deals DamageDealt crush damage in a 3x3 area and slows for 4 turns. -Kick a summoned rock to turn it into a projectile. Deals DamageDealt crush damage in a 3x3 area and slows for 4 turns. -With a solid kick, you launch one of your monoliths forward! -With a solid kick, you launch one of your monoliths forward! -Choose a monolith to kick -Choose a monolith to kick -Boulder -Boulder -Boulder -Boulder -Channel 1 turn to launch a huge slow rock that deals DamageDealt crush damage and slows for 8 turns. AoE, collides with summoned rocks. Blocks up to 200 damage. -Channel 1 turn to launch a huge slow rock that deals DamageDealt crush damage and slows for 8 turns. AoE, collides with summoned rocks. Blocks up to 200 damage. -You raise a massive boulder from the ground and kick it forward! -You raise a massive boulder from the ground and kick it forward! -Choose line direction -Choose line direction -Stamina Up I -Stamina Up I -Increases maximum SP by 12 -Increases maximum SP by 12 -Iron Will -Iron Will -While you have 100 current willpower or more, regain an additional 4 stamina per turn. -While you have 100 current willpower or more, regain an additional 4 stamina per turn. -Steadfast Guard -Steadfast Guard -For each 10 current willpower you have over 50, gain +5 Restraint Block. -For each 10 current willpower you have over 50, gain +5 Restraint Block. -Willful Struggle -Willful Struggle -For each 10 current willpower you have over 50, gain +1% struggle effectiveness. -For each 10 current willpower you have over 50, gain +1% struggle effectiveness. -Your willpower provides you with additional strength! (+AMOUNT%) -Your willpower provides you with additional strength! (+AMOUNT%) -Athlete -Athlete -Sprinting costs 40% less stamina. -Sprinting costs 40% less stamina. -Sneaky -Sneaky -You are harder to see when waiting. -You are harder to see when waiting. -Dodge I -Dodge I -+10 Evasion -+10 Evasion -Dodge II -Dodge II -+15 Evasion (25 total) -+15 Evasion (25 total) -Dodge III -Dodge III -+25 Evasion (50 total) -+25 Evasion (50 total) -Critical Strike -Critical Strike -Excess accuracy (over 100%) is converted to bonus physical damage percentage at 50% efficiency. -Excess accuracy (over 100%) is converted to bonus physical damage percentage at 50% efficiency. -Brute Force -Brute Force -When enabled, your attacks deal 10% of your willpower as additional crush damage but cost 10 more stamina. -When enabled, your attacks deal 10% of your willpower as additional crush damage but cost 10 more stamina. -One With Slime -One With Slime -While standing on slime/latex, you can cast rubber spells without components. -While standing on slime/latex, you can cast rubber spells without components. -Convincing Disguise -Convincing Disguise -While completely covered in slime and not moving, your visibility is reduced considerably. -While completely covered in slime and not moving, your visibility is reduced considerably. -Magical Implements -Magical Implements -While holding a magical weapon like a staff or enchanted knife, your mana costs are reduced by 20%. -While holding a magical weapon like a staff or enchanted knife, your mana costs are reduced by 20%. -Mage Circuits -Mage Circuits -Increases the size of the passive mana pool by +100. -Increases the size of the passive mana pool by +100. -Archmage -Archmage -Upcasted spells cost 25% less mana. -Upcasted spells cost 25% less mana. -Temperature Play -Temperature Play -Fire and Ice damage do 30% more damage to fully bound enemies. -Fire and Ice damage do 30% more damage to fully bound enemies. -Fire Hazard -Fire Hazard -Fire damage ignites enemies for 5 damage per turn for 6 turns. -Fire damage ignites enemies for 5 damage per turn for 6 turns. -Frozen Prison -Frozen Prison -Freezing an enemy applies 10% of the enemy's max hp in binding, plus 10 per turn of freeze. -Freezing an enemy applies 10% of the enemy's max hp in binding, plus 10 per turn of freeze. -Lightning Rod -Lightning Rod -After casting an Air or Storm spell that costs mana, become Conductive and gain 300% electric resist for 3 turns. -After casting an Air or Storm spell that costs mana, become Conductive and gain 300% electric resist for 3 turns. -Frustration -Frustration -When enabled, enemies in chastity become angry Frustrated Pets when becoming helpless. -When enabled, enemies in chastity become angry Frustrated Pets when becoming helpless. -Mana Up I -Mana Up I -Increases maximum MP by 12 -Increases maximum MP by 12 -Mana Up II -Mana Up II -Increases maximum MP by 12 -Increases maximum MP by 12 -Mana Up III -Mana Up III -Increases maximum MP by 12 -Increases maximum MP by 12 -Strong Mind I -Strong Mind I -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -Strong Mind II -Strong Mind II -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -Strong Mind III -Strong Mind III -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -Expert Wizard -Expert Wizard -Gives you an additional spell choice slot -Gives you an additional spell choice slot -Master Wizard -Master Wizard -Gives you an additional spell choice slot -Gives you an additional spell choice slot -Legendary Wizard -Legendary Wizard -Gives you an additional spell choice slot -Gives you an additional spell choice slot -More Summons -More Summons -Increases the permanent summon cap by +1 (from 2 to 3) -Increases the permanent summon cap by +1 (from 2 to 3) -Many Summons -Many Summons -Increases the permanent summon cap by +1 (from 3 to 4) -Increases the permanent summon cap by +1 (from 3 to 4) -Bomb -Bomb -Channel for 1 turn for a bomb that does DamageDealt fire damage in an area after DelayTime turns. -Channel for 1 turn for a bomb that does DamageDealt fire damage in an area after DelayTime turns. -Fire in the hole! -Fire in the hole! -Choose target AoE location -Choose target AoE location -Rope Snare -Rope Snare -An invisible trap on the ground that stuns anyone who walks on it for Duration turns and applies 150 points of binding. -An invisible trap on the ground that stuns anyone who walks on it for Duration turns and applies 150 points of binding. -You set an invisible trap! -You set an invisible trap! -Select where to put the trap (it will be invisible) -Select where to put the trap (it will be invisible) -Rope Burst -Rope Burst -An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 40 points of rope binding. Snares for Duration turns. -An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 40 points of rope binding. Snares for Duration turns. -You call forth ropes from the abyss! -You call forth ropes from the abyss! -Select center of a a 3x3 AoE -Select center of a a 3x3 AoE -Leather Package -Leather Package -After conjuring a leather restraint, you can conjure up to three more without advancing time. -After conjuring a leather restraint, you can conjure up to three more without advancing time. -Conjure Gag -Conjure Gag -Conjured Gag -Conjured Gag -The gag forces itself into your mouth and buckles tightly! -The gag forces itself into your mouth and buckles tightly! -The gag hits you! (DamageDealt) -The gag hits you! (DamageDealt) -Summons a gag which deals DamageDealt chain damage and silences for 15 turns. +40 binding if target is not silenced. -Summons a gag which deals DamageDealt chain damage and silences for 15 turns. +40 binding if target is not silenced. -You conjure a gag! -You conjure a gag! -The gag will appear next to you and fly toward the target point. -The gag will appear next to you and fly toward the target point. -Conjure Armbinder -Conjure Armbinder -Conjured Armbinder -Conjured Armbinder -The armbinder slips itself around your arms and buckles itself tightly! -The armbinder slips itself around your arms and buckles itself tightly! -The armbinder hits you! (DamageDealt) -The armbinder hits you! (DamageDealt) -Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Blinded/Silenced targets are silenced/blinded for the same time. -Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Blinded/Silenced targets are silenced/blinded for the same time. -You conjure a armbinder! -You conjure a armbinder! -The armbinder will appear next to you and fly toward the target point. -The armbinder will appear next to you and fly toward the target point. -Conjure Leather Cuffs -Conjure Leather Cuffs -Conjured Leather Cuffs -Conjured Leather Cuffs -The leather cuffs clasp your wrists and pull them tightly! -The leather cuffs clasp your wrists and pull them tightly! -The leather cuffs hit you! (DamageDealt) -The leather cuffs hit you! (DamageDealt) -Summons a pair of cuffs which deals DamageDealt chain damage and adds 40 binding. Until the target struggles free, attacking the target disarms them for 3 turns. -Summons a pair of cuffs which deals DamageDealt chain damage and adds 40 binding. Until the target struggles free, attacking the target disarms them for 3 turns. -You conjure leather cuffs! -You conjure leather cuffs! -The cuffs will appear next to you and fly toward the target point. -The cuffs will appear next to you and fly toward the target point. -Conjure Blindfold -Conjure Blindfold -Conjured Blindfold -Conjured Blindfold -The blindfold wraps around your head and buckles tightly! -The blindfold wraps around your head and buckles tightly! -The blindfold hits you! (DamageDealt) -The blindfold hits you! (DamageDealt) -Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not silenced. -Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not silenced. -You conjure a blindfold! -You conjure a blindfold! -The blindfold will appear next to you and fly toward the target point. -The blindfold will appear next to you and fly toward the target point. -Conjure Cuffs -Conjure Cuffs -Conjured Cuffs -Conjured Cuffs -The cuffs pull your wrists together and click tightly! -The cuffs pull your wrists together and click tightly! -The cuffs hit you! (DamageDealt) -The cuffs hit you! (DamageDealt) -Summons a pair of cuffs which deals DamageDealt chain damage and disarms for 5 turns. +40 binding if target is not disarmed. -Summons a pair of cuffs which deals DamageDealt chain damage and disarms for 5 turns. +40 binding if target is not disarmed. -You conjure a pair of cuffs! -You conjure a pair of cuffs! -The cuffs will appear next to you and fly toward the target point. -The cuffs will appear next to you and fly toward the target point. -Conjure Legbinder -Conjure Legbinder -Conjured Legbinder -Conjured Legbinder -The legbinder slips itself around your legs and buckles itself tightly! -The legbinder slips itself around your legs and buckles itself tightly! -The legbinder hits you! (DamageDealt) -The legbinder hits you! (DamageDealt) -Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. -Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. -You conjure a legbinder! -You conjure a legbinder! -The legbinder will appear next to you and fly toward the target point. -The legbinder will appear next to you and fly toward the target point. -Conjure Straitjacket -Conjure Straitjacket -Conjured Straitjacket -Conjured Straitjacket -The straitjacket slips itself around your body and pulls your arms into its sleeves! -The straitjacket slips itself around your body and pulls your arms into its sleeves! -The straitjacket hits you! (DamageDealt) -The straitjacket hits you! (DamageDealt) -Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. -Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. -You conjure a straitjacket! -You conjure a straitjacket! -The straitjacket will appear next to you and fly toward the target point. -The straitjacket will appear next to you and fly toward the target point. -Conjure Harness -Conjure Harness -Conjured Harness -Conjured Harness -The harness slips itself around your torso and squeezes tightly as each buckle secures itself one by one! -The harness slips itself around your torso and squeezes tightly as each buckle secures itself one by one! -The harness hits you! (DamageDealt) -The harness hits you! (DamageDealt) -Summons a harness which deals DamageDealt crush damage. Adds +50 binding per 25% binding level on target, up to +200. -Summons a harness which deals DamageDealt crush damage. Adds +50 binding per 25% binding level on target, up to +200. -You conjure a harness! -You conjure a harness! -The harness will appear next to you and fly toward the target point. -The harness will appear next to you and fly toward the target point. -Firecracker -Firecracker -A small delayed explosion that deals DamageDealt fire damage. -A small delayed explosion that deals DamageDealt fire damage. -You shout an incendiary retort! -You shout an incendiary retort! -Choose AoE location -Choose AoE location -Feather Burst -Feather Burst -After a brief delay, a small cloud of feathers tickles enemies for DamageDealt damage and +60 distraction for 3 turns. -After a brief delay, a small cloud of feathers tickles enemies for DamageDealt damage and +60 distraction for 3 turns. -You conjure a burst of frenetic feathers! -You conjure a burst of frenetic feathers! -Choose AoE location -Choose AoE location -Tickle Cloud -Tickle Cloud -For 10 turns, disembodied hands tickle a target location for DamageDealt tickle damage. -For 10 turns, disembodied hands tickle a target location for DamageDealt tickle damage. -A swarm of hands holding feathers appears! -A swarm of hands holding feathers appears! -Choose location -Choose location -Frustrated Pet -Frustrated Pet -The pet collapses in frustration. -The pet collapses in frustration. -Mana Pet -Mana Pet -The enemy steals your pet from you! -The enemy steals your pet from you! -Display Doll -Display Doll -The enemy steals your doll from you! -The enemy steals your doll from you! -Conjure Petsuit -Conjure Petsuit -Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery. -Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery. -You conjure an enchanted petsuit which wraps around your target, forcing her to follow you! -You conjure an enchanted petsuit which wraps around your target, forcing her to follow you! -You watch in horror as your own creation lunges toward you, binding your hands and feet! -You watch in horror as your own creation lunges toward you, binding your hands and feet! -Choose a helpless target -Choose a helpless target -Conjure Display Stand -Conjure Display Stand -Target only Helpless enemies. Creates a fixture that increases passive mana recovery, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. -Target only Helpless enemies. Creates a fixture that increases passive mana recovery, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. -You conjure a fixture to hold your helpless target in place! -You conjure a fixture to hold your helpless target in place! -You watch in horror as your own creation surrounds you, locking you in place with a hefty click! -You watch in horror as your own creation surrounds you, locking you in place with a hefty click! -Choose a helpless target -Choose a helpless target -Lesser Flash -Lesser Flash -Ring -Ring -Flash Bomb -Flash Bomb -Sparkles! -Sparkles! -Mirror Image -Mirror Image - - -A flash of light which renders anyone caught within blind for Duration turns -A flash of light which renders anyone caught within blind for Duration turns -You charge up a bright flash! -You charge up a bright flash! -Select where to center the flash (SpellArea radius) -Select where to center the flash (SpellArea radius) -A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged. -A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged. -You point and a noise emanates from the location! -You point and a noise emanates from the location! -Select where to center the noise (SpellArea radius) -Select where to center the noise (SpellArea radius) -Greater Flash -Greater Flash -A massive flash of light which renders anyone caught within blind for Duration turns -A massive flash of light which renders anyone caught within blind for Duration turns -You charge up a bright flash! -You charge up a bright flash! -Select where to center the flash (SpellArea radius) -Select where to center the flash (SpellArea radius) -Focused Flash -Focused Flash -Select where to center the flash (SpellArea radius) -Select where to center the flash (SpellArea radius) -A focused flash of light which renders anyone caught within blind for Duration turns -A focused flash of light which renders anyone caught within blind for Duration turns -You slowly charge up a powerful flash! -You slowly charge up a powerful flash! -Shroud -Shroud -Smoke Bomb -Smoke Bomb -Sleep Gas -Sleep Gas -Select where to center the shroud (SpellArea radius) -Select where to center the shroud (SpellArea radius) -Creates a cloud for Duration turns that buffs evasion for all creatures. You are temporarily invisible for 8 turns after leaving. -Creates a cloud for Duration turns that buffs evasion for all creatures. You are temporarily invisible for 8 turns after leaving. -You exhale a misty shroud -You exhale a misty shroud -Invisibility -Invisibility -Select which creature to buff -Select which creature to buff -Make the targeted creature invisible -Make the targeted creature invisible -You snap your fingers! -You snap your fingers! -CMD: Lock -CMD: Lock -Select which creature to lock -Select which creature to lock -Magically locks down a target, preventing them from struggling below the current level of binding until freed by an enemy spellcaster (max 100% binding). -Magically locks down a target, preventing them from struggling below the current level of binding until freed by an enemy spellcaster (max 100% binding). -You say a command word, and magical locks bind your target! -You say a command word, and magical locks bind your target! -Chastity -Chastity -Select which creature to lock in a belt -Select which creature to lock in a belt -Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs and distracts constantly. -Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs and distracts constantly. -You conjure a chastity belt, which latches onto your target! -You conjure a chastity belt, which latches onto your target! -Your own spell locks you in chastity! -Your own spell locks you in chastity! -Something fun enters your body... -Something fun enters your body... -Zone of Purity -Zone of Purity -Select an area -Select an area -Creates an area which applies Chastity constantly to any enemy over 50% bondage that steps inside. -Creates an area which applies Chastity constantly to any enemy over 50% bondage that steps inside. -You conjure a realm of absolute purity. -You conjure a realm of absolute purity. -Zone of Excitement -Zone of Excitement -Select an area -Select an area -Creates an area which adds a conjured vibrating toy to enemies that step inside. Toy lasts 30 turns. -Creates an area which adds a conjured vibrating toy to enemies that step inside. Toy lasts 30 turns. -You conjure a realm of absolute fun! -You conjure a realm of absolute fun! -CMD: Capture -CMD: Capture -Select which creature to bind -Select which creature to bind -Commands nearby restraints to bind a target, dealing DamageDealt chain damage, +50 binding. Ropes snare 3 turns/rope, belts +20 binding/belt, chains deal +15 crush dmg/chain. -Commands nearby restraints to bind a target, dealing DamageDealt chain damage, +50 binding. Ropes snare 3 turns/rope, belts +20 binding/belt, chains deal +15 crush dmg/chain. -You say a command word, and the bindings on the ground do your bidding! -You say a command word, and the bindings on the ground do your bidding! -CMD: Disenchant -CMD: Disenchant -Select an area -Select an area -Target a large area. Permanently slows constructs, reduces attack speed by 50%, and deals 30 shadow damage. Refunds 50% mana at 3 or more targets. Cast on self to disenchant bindings. -Target a large area. Permanently slows constructs, reduces attack speed by 50%, and deals 30 shadow damage. Refunds 50% mana at 3 or more targets. Cast on self to disenchant bindings. -You say a command word, siphoning the magic from nearby constructs! -You say a command word, siphoning the magic from nearby constructs! -CMD: Vibrate -CMD: Vibrate -Select an area -Select an area -Target a large area. Enemies with plugs or toys are teased for Duration turns, taking charm damage each turn. -Target a large area. Enemies with plugs or toys are teased for Duration turns, taking charm damage each turn. -You say a command word, causing all toys in the area to vibrate! -You say a command word, causing all toys in the area to vibrate! -CMD: Explosive Finish -CMD: Explosive Finish -Explosive Finish -Explosive Finish -Select an area -Select an area -Target a large area. Consumes enemy distraction to deal up to DamageDealt charm damage, twice if at 90% distraction or more. -Target a large area. Consumes enemy distraction to deal up to DamageDealt charm damage, twice if at 90% distraction or more. -You say a command word, resulting in a surge of energy entering your targets! -You say a command word, resulting in a surge of energy entering your targets! -CMD: Release -CMD: Release -Select an area -Select an area -Target bound (but unlocked) targets in a 3x3 area, reducing binding by 100. Removes unlocked restraints on player that are removable. -Target bound (but unlocked) targets in a 3x3 area, reducing binding by 100. Removes unlocked restraints on player that are removable. -You say a command word, causing restraints to loosen! -You say a command word, causing restraints to loosen! -You say a command word, but your restraints remain tight! -You say a command word, but your restraints remain tight! -Remove Slime -Remove Slime -Select a creature or yourself -Select a creature or yourself -Remove Slime and Encasement from target creatures in an area. Also removes slime from self. -Remove Slime and Encasement from target creatures in an area. Also removes slime from self. -You issue a command to the slime! -You issue a command to the slime! -You whisper a command word, but the slime is already hardened and won't budge... -You whisper a command word, but the slime is already hardened and won't budge... -Binding Vines -Binding Vines -Binding Ropes -Binding Ropes -Binding Chains -Binding Chains -Binding Belts -Binding Belts -Vines rise from the ground and squeeze you! -Vines rise from the ground and squeeze you! -Ropes encircle your body and tighten! -Ropes encircle your body and tighten! -Chains wrap around you! -Chains wrap around you! -A web of belts buckles in place around your body! -A web of belts buckles in place around your body! -Vines rise from the ground and squeeze you! (DamageDealt) -Vines rise from the ground and squeeze you! (DamageDealt) -Ropes encircle your body and tighten! (DamageDealt) -Ropes encircle your body and tighten! (DamageDealt) -Chains wrap around you! (DamageDealt) -Chains wrap around you! (DamageDealt) -A web of belts buckles in place around your body! (DamageDealt) -A web of belts buckles in place around your body! (DamageDealt) -Awaken -Awaken -Awaken -Awaken -The slime awakens and turns on you!!! -The slime awakens and turns on you!!! -Select area to awaken -Select area to awaken -Activates the slime in an area, causing it to deal DamageDealt glue damage. Encases fully bound targets. -Activates the slime in an area, causing it to deal DamageDealt glue damage. Encases fully bound targets. -You command the slime to draw in targets! -You command the slime to draw in targets! -CMD: Bind -CMD: Bind -Select area to bind -Select area to bind -Commands nearby restraints to bind targets standing on them. Rope: 30 chain dmg/5 turn snare. Chain: 30 crush dmg/8 turn disarm. Belts: 50 binding/3 turns vulnerability. -Commands nearby restraints to bind targets standing on them. Rope: 30 chain dmg/5 turn snare. Chain: 30 crush dmg/8 turn disarm. Belts: 50 binding/3 turns vulnerability. -You say a command word, and the bindings on the ground do your bidding! -You say a command word, and the bindings on the ground do your bidding! -CMD: Unlock -CMD: Unlock -Select which creature to unlock -Select which creature to unlock -On yourself: Removes all purple locks. On a creature: Reduces the target's binding by 20 points. -On yourself: Removes all purple locks. On a creature: Reduces the target's binding by 20 points. -You speak a command word! -You speak a command word! -None of the locks you are wearing respond to your magic. -None of the locks you are wearing respond to your magic. -You can't help her with this. -You can't help her with this. -You must target yourself, an enemy, or a locked object. -You must target yourself, an enemy, or a locked object. -Lesser Invisibility -Lesser Invisibility -Select which creature to buff -Select which creature to buff -Make the targeted creature invisible -Make the targeted creature invisible -You become semitransparent! -You become semitransparent! -Camouflage -Camouflage -Select yourself -Select yourself -Enemies have a harder time noticing you for Duration turns. Cancels if you move, cast, or sleep. -Enemies have a harder time noticing you for Duration turns. Cancels if you move, cast, or sleep. -You pose in a clandestine manner. -You pose in a clandestine manner. -Darkblade -Darkblade -Select which creature to buff -Select which creature to buff -Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks -Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks -You call forth dark runes on your weapon and arms! -You call forth dark runes on your weapon and arms! -Heal -Heal -Select which creature to heal -Select which creature to heal -Restore 45 hitpoints to an allied creature. -Restore 45 hitpoints to an allied creature. -You utter a word of healing. -You utter a word of healing. -Flame Blade -Flame Blade -When enabled: Weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. -When enabled: Weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. -Flame Blade -Flame Blade -Engulf -Engulf -When enabled: Your melee attacks deal +20 glue damage and create slime. -When enabled: Your melee attacks deal +20 glue damage and create slime. -Strengthen -Strengthen -When enabled: Struggling is more powerful, and your attack damage is increased by +20 if your weapon deals physical damage. -When enabled: Struggling is more powerful, and your attack damage is increased by +20 if your weapon deals physical damage. -Your body glows with magical energy! -Your body glows with magical energy! -Enhance Will -Enhance Will -When enabled: Miscast chance is halved -When enabled: Miscast chance is halved -You focus intently! -You focus intently! -Truesight -Truesight -When enabled: Drain mana every turn to see through walls and increase accuracy by 40%. -When enabled: Drain mana every turn to see through walls and increase accuracy by 40%. -Heartsense -Heartsense -Highlight the locations of enemies through walls on the map for 12 turns. -Highlight the locations of enemies through walls on the map for 12 turns. -Light -Light -Produce a bright light for Duration turns. Has no effect in dark rooms. -Produce a bright light for Duration turns. Has no effect in dark rooms. -Floating Weapon -Floating Weapon -When enabled: While hands are bound, you can still use weapons, but attacks cost mana. -When enabled: While hands are bound, you can still use weapons, but attacks cost mana. -Levitate -Levitate -When enabled and above 0 stamina: Drain 5 mana per step to reduce slow level by 1 (if above 1), or 20 mana to ignore a temporary slow effect. -When enabled and above 0 stamina: Drain 5 mana per step to reduce slow level by 1 (if above 1), or 20 mana to ignore a temporary slow effect. -You levitate over the trap! -You levitate over the trap! -You snag a tripwire while floating! -You snag a tripwire while floating! -You levitate forward despite being slowed! -You levitate forward despite being slowed! -You hover with reduced effect from bindings. -You hover with reduced effect from bindings. -Iron Blood -Iron Blood -Select yourself -Select yourself -Channel 4 turns: Halves SP cost of melee attacks by 50%, but increases MP cost of spells by 25%. Ends on sleep or recast. -Channel 4 turns: Halves SP cost of melee attacks by 50%, but increases MP cost of spells by 25%. Ends on sleep or recast. -Your skin glows a pale red! -Your skin glows a pale red! -Stone Skin -Stone Skin -Select which creature to buff -Select which creature to buff -Make the targeted creature (or yourself) gain +20 armor for Duration turns -Make the targeted creature (or yourself) gain +20 armor for Duration turns -Your skin takes on the appearance of cracked earth! -Your skin takes on the appearance of cracked earth! -The EnemyName gains increased physical armor! -The EnemyName gains increased physical armor! -The EnemyName buffs the physical armor of her allies! -The EnemyName buffs the physical armor of her allies! -The EnemyName deploys an energy shield to allies! -The EnemyName deploys an energy shield to allies! -The EnemyName activates the vibrators of nearby wolfgirls, greatly motivating them! -The EnemyName activates the vibrators of nearby wolfgirls, greatly motivating them! -The EnemyName creates a zone of increased defense! -The EnemyName creates a zone of increased defense! -EnemyName uses a charm to buff an enemy's Magic Armor and Evasion! -EnemyName uses a charm to buff an enemy's Magic Armor and Evasion! -EnemyName uses a glowing talisman to buff an undead's physical armor and speed! -EnemyName uses a glowing talisman to buff an undead's physical armor and speed! -You create a zone of increased defense! -You create a zone of increased defense! -You create a protective zone! -You create a protective zone! -You create a fan of icicles! -You create a fan of icicles! -Wall -Wall -Select where to put the wall (cannot place on occupied squares) -Select where to put the wall (cannot place on occupied squares) -Create a stationary wall for Duration turns. It takes 20% damage from spells. -Create a stationary wall for Duration turns. It takes 20% damage from spells. -A wall starts to form! -A wall starts to form! -You create a line on the ground. -You create a line on the ground. -True Steel -True Steel -Choose a target. -Choose a target. -A melee strike that deals DamageDealt slash damage, x2.5 against unaware humanoid enemies. -A melee strike that deals DamageDealt slash damage, x2.5 against unaware humanoid enemies. -You slash with an ethereal blade! -You slash with an ethereal blade! -Summon Familiar -Summon Familiar -Select where to put the familiar (cannot place on occupied squares) -Select where to put the familiar (cannot place on occupied squares) -Create a familiar that fights by your side for the rest of the level -Create a familiar that fights by your side for the rest of the level -A familiar appears! -A familiar appears! -You create a circle on the ground with your foot! -You create a circle on the ground with your foot! -Summon Storm Crystal -Summon Storm Crystal -Select where to put the storm crystal (cannot place on occupied squares) -Select where to put the storm crystal (cannot place on occupied squares) -Create a stationary crystal that casts Crackle on nearby targets for Duration turns. Can be healed to extend duration. -Create a stationary crystal that casts Crackle on nearby targets for Duration turns. Can be healed to extend duration. -A crackling crystal emerges from the ground! -A crackling crystal emerges from the ground! -You stomp and the ground shakes! -You stomp and the ground shakes! -Summon Fire Mote -Summon Fire Mote -Select where to put the fire mote (cannot place on occupied squares) -Select where to put the fire mote (cannot place on occupied squares) -Create an orb of fire that follows you and attacks using firebolt. -Create an orb of fire that follows you and attacks using firebolt. -A flaming spirit answers your call! -A flaming spirit answers your call! -You call upon the plane of Fire! -You call upon the plane of Fire! -Summon Earth Mote -Summon Earth Mote -Select where to put the earth mote (cannot place on occupied squares) -Select where to put the earth mote (cannot place on occupied squares) -Create an animated stone that attacks using a strong but slow crush attack. -Create an animated stone that attacks using a strong but slow crush attack. -A rocky spirit rushes forth from the ground! -A rocky spirit rushes forth from the ground! -You call upon the plane of Earth! -You call upon the plane of Earth! -Summon Air Mote -Summon Air Mote -Select where to put the air mote (cannot place on occupied squares) -Select where to put the air mote (cannot place on occupied squares) -Create a dusty mote that attacks using gusts of wind. -Create a dusty mote that attacks using gusts of wind. -A dust devil arises in front of you! -A dust devil arises in front of you! -You call upon the plane of Air! -You call upon the plane of Air! -Summon Water Mote -Summon Water Mote -Select where to put the water mote (cannot place on occupied squares) -Select where to put the water mote (cannot place on occupied squares) -Create a watery serpent which stuns enemies with its melee attack. -Create a watery serpent which stuns enemies with its melee attack. -A watery spirit bubbles up from the ground! -A watery spirit bubbles up from the ground! -You call upon the plane of Water! -You call upon the plane of Water! -Summon Shadow Warrior -Summon Shadow Warrior -Select where to put the shadow warrior (cannot place on occupied squares) -Select where to put the shadow warrior (cannot place on occupied squares) -Call forth a shadow warrior for 16 turns who deals DamageDealt damage every other turn. -Call forth a shadow warrior for 16 turns who deals DamageDealt damage every other turn. -...and the abyss answers! -...and the abyss answers! -You call... -You call... -Summon Golem -Summon Golem -Select where to put the golem (cannot place on occupied squares) -Select where to put the golem (cannot place on occupied squares) -Create a slow but powerful golem to fight by your side -Create a slow but powerful golem to fight by your side -A golem arises! -A golem arises! -You stomp your foot and draw the words of life on the floor! -You stomp your foot and draw the words of life on the floor! -Summon Decoy -Summon Decoy -Select where to create an illusion (cannot place on occupied squares) -Select where to create an illusion (cannot place on occupied squares) -Create a decoy for Duration turns. It attracts enemy attention and triggers traps. -Create a decoy for Duration turns. It attracts enemy attention and triggers traps. -A shadow of yourself materializes! -A shadow of yourself materializes! -You create a line on the ground and toss in a lock of your hair! -You create a line on the ground and toss in a lock of your hair! -Feather Explosion -Feather Explosion -Elastic Grip -Elastic Grip -A latex hand reaches out and pulls an enemy close to you! Base pull strength: 4 -A latex hand reaches out and pulls an enemy close to you! Base pull strength: 4 -You extend a rubbery hand and grab a foe! -You extend a rubbery hand and grab a foe! -There's an obstacle in the way! -There's an obstacle in the way! -Select a target to pull -Select a target to pull -Slime Blast -Slime Blast -Apprentice's Slime -Apprentice's Slime -Witch's Slime -Witch's Slime -Witch's Slime Ball -Witch's Slime Ball -A pool of slime deals DamageDealt glue damage to enemies on impact and covers the area in temporary slime. -A pool of slime deals DamageDealt glue damage to enemies on impact and covers the area in temporary slime. -You conjure a pool of slime! -You conjure a pool of slime! -Select where the slime will appear -Select where the slime will appear -Slime Eruption -Slime Eruption -A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them friefly. -A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them friefly. -You conjure an explosion of slime! -You conjure an explosion of slime! -Select where the slime will appear -Select where the slime will appear -Slime Splash -Slime Splash -After one turn, deals DamageDealt glue damage in a small area and spreads slime. -After one turn, deals DamageDealt glue damage in a small area and spreads slime. -You conjure a small amount of slime! -You conjure a small amount of slime! -Select where the slime will appear -Select where the slime will appear -Water Ball -Water Ball -Fast projectile. Deals DamageDealt acid damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. -Fast projectile. Deals DamageDealt acid damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. -You hurl a ball of water! -You hurl a ball of water! -Choose aim direction -Choose aim direction -Tidal Sphere -Tidal Sphere -Slow moving projectile, deals DamageDealt acid damage to enemies it passes thru. Leaves a large amount of water in its wake. -Slow moving projectile, deals DamageDealt acid damage to enemies it passes thru. Leaves a large amount of water in its wake. -You raise a huge mass of water! -You raise a huge mass of water! -Choose aim direction -Choose aim direction -The boulder knocks you to the ground! -The boulder knocks you to the ground! -The water covers you and drenches you! -The water covers you and drenches you! -You step in water and become wet. -You step in water and become wet. -Ice Breath -Ice Breath -A field of icicles that deals DamageDealt damage on a hit and stuns briefly. -A field of icicles that deals DamageDealt damage on a hit and stuns briefly. -You breath out a chilling frost! -You breath out a chilling frost! -Select where to put the icicles (SpellArea radius) -Select where to put the icicles (SpellArea radius) -Zombie Orb -Zombie Orb -Lesser Zombie Orb -Lesser Zombie Orb -Freezing Zombie Orb -Freezing Zombie Orb -Mystic Bolt -Mystic Bolt -The mystic bolt paralyzes you! -The mystic bolt paralyzes you! -Rubber Bullets -Rubber Bullets -You are hit by a fusilade of rubber bullets! -You are hit by a fusilade of rubber bullets! -The rubber bullets congeal into a slimy material on your body! -The rubber bullets congeal into a slimy material on your body! -Nature Blast -Nature Blast -Raging Vines -Raging Vines -Magic Ribbons -Magic Ribbons -Magic Belts -Magic Belts -Slime -Slime -Slime -Slime -You project a pool of sticky slime! -You project a pool of sticky slime! -Arrow of Love -Arrow of Love -You loose a glowing arrow! -You loose a glowing arrow! -Bondage Buster -Bondage Buster -Blaster -Blaster -You charge up a beam and fire it! -You charge up a beam and fire it! -You swing your weapon and pull away the target's equipment! -You swing your weapon and pull away the target's equipment! -You swing Dragonslaver and it lashes out in a whip-like fashion! -You swing Dragonslaver and it lashes out in a whip-like fashion! -The slime from your staff coats your body, granting you strange powers! -The slime from your staff coats your body, granting you strange powers! -The power of the four elements flows through your veins! -The power of the four elements flows through your veins! -Firebolt -Firebolt -An explosion knocks you to the ground! -An explosion knocks you to the ground! -Curious Spell -Curious Spell -You have been flummoxed! -You have been flummoxed! -Cuff Bola -Cuff Bola -Throw Syringe -Throw Syringe -You feel a prick as a small syringe hits you, and you start feeling drowsy... -You feel a prick as a small syringe hits you, and you start feeling drowsy... -The thrown cuffs snap shut around your ankles and slow you down!!! -The thrown cuffs snap shut around your ankles and slow you down!!! -Ribbon Burst -Ribbon Burst -Spores -Spores -Noxious Spores -Noxious Spores -Enticing Spores -Enticing Spores -You inhale some spores, and feel a bit sleepy... -You inhale some spores, and feel a bit sleepy... -The spores make you feel excited! -The spores make you feel excited! -The toxic spores make you feel faint... -The toxic spores make you feel faint... -Magic Hairpin -Magic Hairpin -The magic hairpin goes for your eyes and forces you to blink! -The magic hairpin goes for your eyes and forces you to blink! -Ice Storm -Ice Storm -Icy Aura -Icy Aura -Icy Aura -Icy Aura -Slime Ball -Slime Ball -Witch's Slime Ball -Witch's Slime Ball -A ball of slime leaves a trail of sticky slime (40 damage when stepped on). It deals DamageDealt glue damage on a hit. -A ball of slime leaves a trail of sticky slime (40 damage when stepped on). It deals DamageDealt glue damage on a hit. -You hurl a ball of slime! -You hurl a ball of slime! -Choose aim direction -Choose aim direction -Summon Skeleton -Summon Skeleton -Mass Summon Skeleton -Mass Summon Skeleton -A skeleton arises from bones on the floor! -A skeleton arises from bones on the floor! -A gang of SummonCount skeletons forms around you! -A gang of SummonCount skeletons forms around you! -A gang of SummonCount zombies emerges from the floor! -A gang of SummonCount zombies emerges from the floor! -A bunch of gags fly out from your satchel! -A bunch of gags fly out from your satchel! -A floating hand appears and cracks its knuckles! -A floating hand appears and cracks its knuckles! -A floating gag appears and starts flying toward you! -A floating gag appears and starts flying toward you! -A set of shackles opens wide and starts going for your wrists! -A set of shackles opens wide and starts going for your wrists! -A swarm of shackles approaches you! -A swarm of shackles approaches you! -A cloud of locks and chains clatters as it levitates toward you! -A cloud of locks and chains clatters as it levitates toward you! -A huge cloud of locks and chains clatters as it levitates toward you! -A huge cloud of locks and chains clatters as it levitates toward you! -Floating hands appear by the conjurer's side as she points her staff! -Floating hands appear by the conjurer's side as she points her staff! -Floating books appear near the caster! -Floating books appear near the caster! -Dusty tomes appear near the caster! -Dusty tomes appear near the caster! -Magical books appear near the caster! -Magical books appear near the caster! -Sinister books appear near the caster! -Sinister books appear near the caster! -Crackling books appear near the caster! -Crackling books appear near the caster! -Glowing books appear near the caster! -Glowing books appear near the caster! -Rubber-stained books appear near the caster! -Rubber-stained books appear near the caster! -Flaming books appear near the caster! -Flaming books appear near the caster! -Frigid books appear near the caster! -Frigid books appear near the caster! -Devilish books appear near the caster! -Devilish books appear near the caster! -A floating book appears near the caster! -A floating book appears near the caster! -A dusty tome appears near the caster! -A dusty tome appears near the caster! -A magical book appears near the caster! -A magical book appears near the caster! -A sinister book appears near the caster! -A sinister book appears near the caster! -A crackling book appears near the caster! -A crackling book appears near the caster! -A glowing book appears near the caster! -A glowing book appears near the caster! -A rubber-stained book appears near the caster! -A rubber-stained book appears near the caster! -A flaming book appears near the caster! -A flaming book appears near the caster! -A frigid book appears near the caster! -A frigid book appears near the caster! -A devilish book appears near the caster! -A devilish book appears near the caster! -Your restraints rub you in sensitive places as you move... -Your restraints rub you in sensitive places as you move... -You feel your restraints squeeze you and tingle with painful sensations! -You feel your restraints squeeze you and tingle with painful sensations! -'Do not resist,' whispers a voice in your head... -'Do not resist,' whispers a voice in your head... -Your restraints squeeze you painfully without mercy! -Your restraints squeeze you painfully without mercy! -The crystals emit a powerful energy! -The crystals emit a powerful energy! -You feel your body overflow with energy... -You feel your body overflow with energy... -The crystals react to your struggle attempts with a strange energy! -The crystals react to your struggle attempts with a strange energy! -Cast Spell (XXX turn delay) -Cast Spell (XXX turn delay) -You feel the vibrations leaving your body... -You feel the vibrations leaving your body... -You feel your toys start to buzz... -You feel your toys start to buzz... -You your toys continue to buzz... -You your toys continue to buzz... -The EnemyName remotely causes your toys to to buzz!!! -The EnemyName remotely causes your toys to to buzz!!! -You feel the plugs inside you while walking. -You feel the plugs inside you while walking. -Your toys stop vibrating. -Your toys stop vibrating. -You feel slightly full as you move... -You feel slightly full as you move... -Your movement disturbs the plugs inside of you... -Your movement disturbs the plugs inside of you... -The large plugs shift(s) around inside of you... -The large plugs shift(s) around inside of you... -The huge plugs rub(s) around constantly inside of you... -The huge plugs rub(s) around constantly inside of you... -Your movements are hobbled. -Your movements are hobbled. -Your hobbled movement disturbs the plugs inside of you. -Your hobbled movement disturbs the plugs inside of you. -The large plugs shift(s) around inside of you from your hobbled movement... -The large plugs shift(s) around inside of you from your hobbled movement... -The massive plugs rub(s) around inside of you as you hobble forward... -The massive plugs rub(s) around inside of you as you hobble forward... -You hop forward! -You hop forward! -You hop and feel the plugs shifting around inside your body. -You hop and feel the plugs shifting around inside your body. -The plugs shift in and out with each hop... -The plugs shift in and out with each hop... -The massive plugs slide in and out mercilessly as you hop... -The massive plugs slide in and out mercilessly as you hop... -You inch forward slowly! -You inch forward slowly! -You inch forward, feeling the movement of your plugs. -You inch forward, feeling the movement of your plugs. -You wiggle your hips inching forward, feeling the plugs inside you... -You wiggle your hips inching forward, feeling the plugs inside you... -You wiggle forward, the massive plugs inside you digging in and out... -You wiggle forward, the massive plugs inside you digging in and out... -You crawl helplessly! -You crawl helplessly! -You crawl helplessly, feeling the plugs shifting around inside you. -You crawl helplessly, feeling the plugs shifting around inside you. -You crawl and feel the plugs inside you rub around teasingly... -You crawl and feel the plugs inside you rub around teasingly... -You crawl helplessly, tormented by the massive plugs inside you... -You crawl helplessly, tormented by the massive plugs inside you... -You are unable to move! -You are unable to move! -You wriggle uselessly, feeling the plugs shift inside you! -You wriggle uselessly, feeling the plugs shift inside you! -You wriggle uselessly, aroused by the plugs inside you! -You wriggle uselessly, aroused by the plugs inside you! -You wriggle uselessly, tormented by the massive plugs inside of you! -You wriggle uselessly, tormented by the massive plugs inside of you! -You climb into the grate -You climb into the grate -Mmmph... -Mmmph... -Mmmmmmmmm... -Mmmmmmmmm... -Hhmmpphh... -Hhmmpphh... -Gghhhh!!! -Gghhhh!!! -Mmmmmphh!!! -Mmmmmphh!!! -Mmm... -Mmm... -MMM!!! -MMM!!! -Mmmmmm. -Mmmmmm. -Mmmaaaaahhh... -Mmmaaaaahhh... -Mmmmmmmmm~ -Mmmmmmmmm~ -Unnnghhh... -Unnnghhh... -Mmmmmmmphhh.. -Mmmmmmmphhh.. -Mmmmmphh~ -Mmmmmphh~ -Mmm~ -Mmm~ -Mmmmm~~ -Mmmmm~~ -Mmmmmm~~~ -Mmmmmm~~~ -You are blinded! -You are blinded! -You took DamageDealt damage! -You took DamageDealt damage! -Your own rope trap springs upon you! -Your own rope trap springs upon you! -You get caught in sticky slime! -You get caught in sticky slime! -The slime ball sticks to you! -The slime ball sticks to you! -The slime ball sticks to you and slows you! -The slime ball sticks to you and slows you! -You feel a powerful sensation run through your body! -You feel a powerful sensation run through your body! -Beams of light wrap around your body and feel warm on your skin! -Beams of light wrap around your body and feel warm on your skin! -Crystals begin to form around your limbs! -Crystals begin to form around your limbs! -A magic chain secures itself around your body! -A magic chain secures itself around your body! -A rope wraps itself around your body! -A rope wraps itself around your body! -A ribbon animates and becomes entwined around you! -A ribbon animates and becomes entwined around you! -A belt buckles itself tightly around your body! -A belt buckles itself tightly around your body! -A vine slithers across your body and tightens! -A vine slithers across your body and tightens! -The spell hits you and slows you down! -The spell hits you and slows you down! -Rope -Rope -Rope Tendrils -Rope Tendrils -Blessed Wrappings -Blessed Wrappings -The Blessing -The Blessing -A long tendril emerges from the kraken's body! -A long tendril emerges from the kraken's body! -Coiled ropes spring up from the floor! -Coiled ropes spring up from the floor! -A long tendril emerges from the kraken's body! -A long tendril emerges from the kraken's body! -Several glowing wrappings emerge! -Several glowing wrappings emerge! -A glowing wrapping emerges and starts moving toward you! -A glowing wrapping emerges and starts moving toward you! -Rope Strike -Rope Strike -Animated Vines -Animated Vines -Soul-binding Sigil -Soul-binding Sigil -Elven Arrow -Elven Arrow -The elven arrow flashes and wraps you in mithril ropes! -The elven arrow flashes and wraps you in mithril ropes! -Ropes wrap themselves around your body from all sides! -Ropes wrap themselves around your body from all sides! -Wrappings appear and wrap you head to toe! -Wrappings appear and wrap you head to toe! -Ropes wrap themselves around your body from all sides! -Ropes wrap themselves around your body from all sides! -Nature magic causes vines to sprout around you! -Nature magic causes vines to sprout around you! -Your clothes are stripped and replaced! -Your clothes are stripped and replaced! -Your clothes are stripped and replaced! -Your clothes are stripped and replaced! -Vines tear off your clothes! -Vines tear off your clothes! -Restraints materialize on your body! -Restraints materialize on your body! -The orb explodes into a burst of ribbons! -The orb explodes into a burst of ribbons! -The orb tears off your clothes! -The orb tears off your clothes! -Charm Trap -Charm Trap -Ribbon Trap -Ribbon Trap -Shackle Trap -Shackle Trap -Mummy Trap -Mummy Trap -Rope Trap -Rope Trap -Rope Trap -Rope Trap -Holy Rope Trap -Holy Rope Trap -Belt Trap -Belt Trap -Cable Trap -Cable Trap -Slime Trap -Slime Trap -Chain Trap -Chain Trap -Gas Trap -Gas Trap -Gas Trap -Gas Trap -Sleep Dart -Sleep Dart -Sleep Dart -Sleep Dart -A talisman on the floor explodes, sending a cloud of charms flying around you! -A talisman on the floor explodes, sending a cloud of charms flying around you! -Magical binding ribbons emerge from the walls! -Magical binding ribbons emerge from the walls! -The ceiling opens, letting a lot of shackles fall on you! -The ceiling opens, letting a lot of shackles fall on you! -Bands of glowing wrappings start flying in from all sides! -Bands of glowing wrappings start flying in from all sides! -Ropes slither out towards you from between the bricks! -Ropes slither out towards you from between the bricks! -Ropes fall on you from all sides! -Ropes fall on you from all sides! -A constellation of ropes surrounds you! -A constellation of ropes surrounds you! -Leather restraints start appearing around you! -Leather restraints start appearing around you! -high-tech cables come out from the floor! -high-tech cables come out from the floor! -Slimes pours out from the walls and ceiling! -Slimes pours out from the walls and ceiling! -Ethereal chains appear all around you! -Ethereal chains appear all around you! -You hear the sound of glass breaking, and a cloud of green gas rises around you! -You hear the sound of glass breaking, and a cloud of green gas rises around you! -You hear the sound of glass breaking, and a cloud of pink gas rises around you! -You hear the sound of glass breaking, and a cloud of pink gas rises around you! -The charms stick themselves all over your body! -The charms stick themselves all over your body! -The ribbons tie themselves tightly around your body and won't let go! -The ribbons tie themselves tightly around your body and won't let go! -Shackles close themselves over your limbs! -Shackles close themselves over your limbs! -The wrappings close in over your body! -The wrappings close in over your body! -The ropes wrap themselves around your body! -The ropes wrap themselves around your body! -The ropes wrap themselves tightly around your body! -The ropes wrap themselves tightly around your body! -The holy ropes secure themselves upon your body! -The holy ropes secure themselves upon your body! -The leather restraints attach themselves to your body! -The leather restraints attach themselves to your body! -The high-tech cables wrap themselves over your body! -The high-tech cables wrap themselves over your body! -The slime pours all over you! -The slime pours all over you! -The magic chains wrap themselves around your body! -The magic chains wrap themselves around your body! -Your clothes are getting ripped away! -Your clothes are getting ripped away! -You feel a prick as a small dart hits you, and you start feeling drowsy... -You feel a prick as a small dart hits you, and you start feeling drowsy... -You breathe in the gas, and a wave of pleasure hits your whole body. -You breathe in the gas, and a wave of pleasure hits your whole body. -You breathe in the gas, and feel lethargic... -You breathe in the gas, and feel lethargic... -Inventory -Inventory -Reputation -Reputation -Spells -Spells -Learn New Spells -Learn New Spells -Click a spell to replace SPELLNAME with. -Click a spell to replace SPELLNAME with. -Empty Slot -Empty Slot -Back to Spellbook -Back to Spellbook -Return to Game -Return to Game -Spell Tree -Spell Tree -Elemental Spells -Elemental Spells -Conjuration Spells -Conjuration Spells -Illusion Spells -Illusion Spells -Upgrades -Upgrades -Perks -Perks -Perks II -Perks II -Perks III -Perks III -pg. NUM/TOTAL -pg. NUM/TOTAL -> -> -< -< ->>> ->>> -<<< -<<< -Spell Points: SPELLPOINTS -Spell Points: SPELLPOINTS -You need a higher level in SCHOOL magic to learn this spell. -You need a higher level in SCHOOL magic to learn this spell. -You need more spell points. -You need more spell points. -You don't have enough maximum mana to cast this spell! -You don't have enough maximum mana to cast this spell! -School: -School: -Elements -Elements -Conjuration -Conjuration -Illusion -Illusion -Generic -Generic -Learn Spell -Learn Spell -Spell Points: -Spell Points: -Level: -Level: -Spell Point Cost: -Spell Point Cost: - Mana Cost: - Mana Cost: - - -Remove Spell 1 -Remove Spell 1 -Remove Spell 2 -Remove Spell 2 -Remove Spell 3 -Remove Spell 3 -Remove Spell 4 -Remove Spell 4 -Remove Spell 5 -Remove Spell 5 -Remove Spell 6 -Remove Spell 6 -Remove Spell 7 -Remove Spell 7 -Replace Spell 1 -Replace Spell 1 -Replace Spell 2 -Replace Spell 2 -Replace Spell 3 -Replace Spell 3 -Replace Spell 4 -Replace Spell 4 -Replace Spell 5 -Replace Spell 5 -Replace Spell 6 -Replace Spell 6 -Replace Spell 7 -Replace Spell 7 - Current Spell 1: - Current Spell 1: - Current Spell 2: - Current Spell 2: - Current Spell 3: - Current Spell 3: - Current Spell 4: - Current Spell 4: - Current Spell 5: - Current Spell 5: - Current Spell 6: - Current Spell 6: - Current Spell 7: - Current Spell 7: -??? -??? -Unfiled -Unfiled -Adventuring 101 -Adventuring 101 -Bondage Witchery -Bondage Witchery -Enemy Notes -Enemy Notes -Graveyard -Graveyard -Catacombs -Catacombs -Jungle -Jungle -Temple -Temple -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Mansion -Mansion -Tombs -Tombs -Library -Library -Crystal Cave -Crystal Cave -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -Graveyard -(Preface from the journal of Catherine Willows, well-known explorer who vanished in the dungeon 30 years ago) I am writing this journal in the off chance that I do not come back in my search for the Mistress' staff. If you find this, please make an effort to deliver it back to the surface for the good of all the young women lured by its secrets. -(Preface from the journal of Catherine Willows, well-known explorer who vanished in the dungeon 30 years ago) I am writing this journal in the off chance that I do not come back in my search for the Mistress' staff. If you find this, please make an effort to deliver it back to the surface for the good of all the young women lured by its secrets. -(Pg. 24 from Catherine Willows' journal) Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?' -(Pg. 24 from Catherine Willows' journal) Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?' -(Pg. 25 from Catherine Willows' journal) ...They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence. -(Pg. 25 from Catherine Willows' journal) ...They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence. -(Pg. 26 from Catherine Willows' journal) So the question is not why did somebody lay these traps. The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. -(Pg. 26 from Catherine Willows' journal) So the question is not why did somebody lay these traps. The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. -(The note starts with a drawing of a witch with many chains hanging from her body) She can block melee attacks with her chains. However, they conduct lightning and heat directly to her body, and I was able to take out her chains with bolt cutters. -(The note starts with a drawing of a witch with many chains hanging from her body) She can block melee attacks with her chains. However, they conduct lightning and heat directly to her body, and I was able to take out her chains with bolt cutters. -(The note starts with a drawing of a witch with lightning crackling from her fingertips) Water will cause her to short-circuit. I can't seem to hit her with lightning, though. She always redirects it. -(The note starts with a drawing of a witch with lightning crackling from her fingertips) Water will cause her to short-circuit. I can't seem to hit her with lightning, though. She always redirects it. -(The note starts with a drawing of a witch whose body is partly gelatinous) The slime is non-flammable and my attacks pass right through her body... Lightning and ice seem to be effective! -(The note starts with a drawing of a witch whose body is partly gelatinous) The slime is non-flammable and my attacks pass right through her body... Lightning and ice seem to be effective! -(The note is from a famous escape artist) Many restraints are applied quite tightly by a skilled rigger. Even removing it will be tough without thrashing around a bit to loosen it. -(The note is from a famous escape artist) Many restraints are applied quite tightly by a skilled rigger. Even removing it will be tough without thrashing around a bit to loosen it. -(The note is from a famous escape artist) Anything can be unbuckled with enough patience. Having a finger extension such as a lockpick will help. Ultimately, though, what matters is that you have a calm state of mind, free from distraction and hopelessness. -(The note is from a famous escape artist) Anything can be unbuckled with enough patience. Having a finger extension such as a lockpick will help. Ultimately, though, what matters is that you have a calm state of mind, free from distraction and hopelessness. -(The note is from a famous cartographer) In my lapse of judgement, I decided to borrow some mana from the nearby shrine to the Latex goddess. While there was no immediate response to my faux pas, I soon found myself pursued by a swarm of slimes! -(The note is from a famous cartographer) In my lapse of judgement, I decided to borrow some mana from the nearby shrine to the Latex goddess. While there was no immediate response to my faux pas, I soon found myself pursued by a swarm of slimes! -(A letter between bandit leaders) One of my subordinates has been reporting a girl bound in heavy leather restraints running around. I told her that this is normal, people keep all kinds of servants around here. But definitely keep an eye out for intruders! Don't let them fool you! -(A letter between bandit leaders) One of my subordinates has been reporting a girl bound in heavy leather restraints running around. I told her that this is normal, people keep all kinds of servants around here. But definitely keep an eye out for intruders! Don't let them fool you! -(The note is a letter from the school of conjuration) We really would like to know... why did you summon a frog in the laboratory? People are wondering, you know. One of the student's projects got eaten. -(The note is a letter from the school of conjuration) We really would like to know... why did you summon a frog in the laboratory? People are wondering, you know. One of the student's projects got eaten. -(You find a carving on the floor, a half-finished magic circle of celestial conjuration. Perhaps a cleric wished to call forth an angel for guidance, before realizing there was a shrine a short walk away, where she could contact the heavens much more easily.) -(You find a carving on the floor, a half-finished magic circle of celestial conjuration. Perhaps a cleric wished to call forth an angel for guidance, before realizing there was a shrine a short walk away, where she could contact the heavens much more easily.) -(It looks like a... receipt) Thank you for your offering to CELESTIAL COMMERCE. Please accept this fine-quality steel blade as compensation for your continued devotion and selflessness. -(It looks like a... receipt) Thank you for your offering to CELESTIAL COMMERCE. Please accept this fine-quality steel blade as compensation for your continued devotion and selflessness. -(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter than she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. -(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter than she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. -(From an essay titled 'On Celestial Supply Chains') It is known that the heavens seek gold. We do not know why it is that the heavens seek it, but we do know that the Goddesses grant us fragments of their limitless power in exchange for this otherwise-useless metal we dredge up from the earth. They care about it so much that shrines are commonplace, each hosting an angelic courier lying in wait for any adventurer willing to part with hers. -(From an essay titled 'On Celestial Supply Chains') It is known that the heavens seek gold. We do not know why it is that the heavens seek it, but we do know that the Goddesses grant us fragments of their limitless power in exchange for this otherwise-useless metal we dredge up from the earth. They care about it so much that shrines are commonplace, each hosting an angelic courier lying in wait for any adventurer willing to part with hers. -They say that the maiden who safeguards the graveyard is kind to her pets... -They say that the maiden who safeguards the graveyard is kind to her pets... -They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Blink out of jail and into the hallway where they kept all my things! -They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Blink out of jail and into the hallway where they kept all my things! -I am writing this from inside prison. Who would have known they cared so much about me using a shrine? Sheesh. -I am writing this from inside prison. Who would have known they cared so much about me using a shrine? Sheesh. -(A drawing of a bunch of zombies, ordered by danger level. Of note are a zombie surrounded by charms, a zombie surrounded by talismans, a zombie warrior with a sword, and... some kind of shrine maiden that you've never seen before) -(A drawing of a bunch of zombies, ordered by danger level. Of note are a zombie surrounded by charms, a zombie surrounded by talismans, a zombie warrior with a sword, and... some kind of shrine maiden that you've never seen before) -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|The first thing to understand is that tying someone up is difficult if they are not in a vulnerable position. If your opponent is vulnerable, then binding will be twice as effective! -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|The first thing to understand is that tying someone up is difficult if they are not in a vulnerable position. If your opponent is vulnerable, then binding will be twice as effective! -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by ticking them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage. -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by ticking them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage. -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Bigger and more resilient opponents are much more effective at breaking out of your binds. Try to deal some damage to them to decrease the speed at which they struggle out of your restraints. -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Bigger and more resilient opponents are much more effective at breaking out of your binds. Try to deal some damage to them to decrease the speed at which they struggle out of your restraints. -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Many mages utilize magical runes to set traps. If you want to check for traps, try learning the spell 'Magical Sight' in the Illusion school. -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Many mages utilize magical runes to set traps. If you want to check for traps, try learning the spell 'Magical Sight' in the Illusion school. -From Adventuring 101: A guide to combat|Your opponent will become vulnerable in many ways, such as missing you with an attack. You can also teleport to the other side of them when they are attacking you, and this will confuse them briefly.|Vulnerable enemies take extra damage, and are easier to tie up! -From Adventuring 101: A guide to combat|Your opponent will become vulnerable in many ways, such as missing you with an attack. You can also teleport to the other side of them when they are attacking you, and this will confuse them briefly.|Vulnerable enemies take extra damage, and are easier to tie up! -From Adventuring 101: A guide to combat|Drenching your opponents makes them more vulnerable to ice and electricity, but may increase their resistance to fire. -From Adventuring 101: A guide to combat|Drenching your opponents makes them more vulnerable to ice and electricity, but may increase their resistance to fire. -From Adventuring 101: A guide to combat|Hitting enemies with melee damage while they are frozen will break the ice, but this also doubles the damage dealt by the attack. -From Adventuring 101: A guide to combat|Hitting enemies with melee damage while they are frozen will break the ice, but this also doubles the damage dealt by the attack. -From Adventuring 101: A guide to combat|Did you know that hitting enemies with fire while they are frozen is extra powerful? Enemies take 40% additional damage from fire while frozen, although fire will rapidly unfreeze them. -From Adventuring 101: A guide to combat|Did you know that hitting enemies with fire while they are frozen is extra powerful? Enemies take 40% additional damage from fire while frozen, although fire will rapidly unfreeze them. -From Adventuring 101: A guide to combat|When you're in a bind, try to play along and look for an opportunity to escape. Fighting back will only make your enemies want to tighten your restraints. -From Adventuring 101: A guide to combat|When you're in a bind, try to play along and look for an opportunity to escape. Fighting back will only make your enemies want to tighten your restraints. -(A drawing of a suit of armor. It reads: DO NOT TRUST) -(A drawing of a suit of armor. It reads: DO NOT TRUST) -(The note starts with a drawing of a witch in dark robes with bright pink hair) A necromancer. Powerful spellcaster, weak up close. -(The note starts with a drawing of a witch in dark robes with bright pink hair) A necromancer. Powerful spellcaster, weak up close. -I can't count how many skeletons I've bashed with my hammer today. They seem so fragile... -I can't count how many skeletons I've bashed with my hammer today. They seem so fragile... -(The note is scrawled with wiggling lines) IT SEES ME. I SHOULDN'T HAVE DEFILED THE ROPE GODDESS' ALTAR! -(The note is scrawled with wiggling lines) IT SEES ME. I SHOULDN'T HAVE DEFILED THE ROPE GODDESS' ALTAR! -It is said that fire and water are opposite planes, but I've noticed that the relation is more lopsided than 'equal and opposite' when they physically manifest. Water elementals resist fire, obviously, but fire elementals are weak to water! It is almost as if the abundance of water in this world causes the fire elementals to become weaker than in their home plane... -It is said that fire and water are opposite planes, but I've noticed that the relation is more lopsided than 'equal and opposite' when they physically manifest. Water elementals resist fire, obviously, but fire elementals are weak to water! It is almost as if the abundance of water in this world causes the fire elementals to become weaker than in their home plane... -A drawing of many icicles around pools of water. It instructs you to avoid the pools of water and you can see a figure surrounded by ice shards in the distance being set on fire and smashed with a hammer. -A drawing of many icicles around pools of water. It instructs you to avoid the pools of water and you can see a figure surrounded by ice shards in the distance being set on fire and smashed with a hammer. -The shadow spirits' touch is cold as ice... I have wondered if this temperature property applies to their destructive effects on other types of beings. Unfortunately, I found out the hard way when I tried to summon a shadow creature against an ice elemental... -The shadow spirits' touch is cold as ice... I have wondered if this temperature property applies to their destructive effects on other types of beings. Unfortunately, I found out the hard way when I tried to summon a shadow creature against an ice elemental... -I was being chased by something fast and heavy, and it was about to crush me when I tossed an Ice Shard behind me. It stopped and I didn't care to look back. -I was being chased by something fast and heavy, and it was about to crush me when I tossed an Ice Shard behind me. It stopped and I didn't care to look back. -I was walking in the library when I got attacked by a magic book! Fortunately my sword seemed to disapatch it quickly, and I used my spear to stab another one shortly after. -I was walking in the library when I got attacked by a magic book! Fortunately my sword seemed to disapatch it quickly, and I used my spear to stab another one shortly after. -SOMEBODY STABBED MY FROG AND I AM PISSED. -SOMEBODY STABBED MY FROG AND I AM PISSED. -I don't think it's neccessary to tell people that dragons resist fire... right? -I don't think it's neccessary to tell people that dragons resist fire... right? -I've been studying the dragonheart's weaknesses. So far I've found that the ones bearing the powers of ice dragons are actually weak to fire unlike the others, and the ones who summon crystals to block attacks are nonetheless unable to grab a spear to stop it from reaching them. -I've been studying the dragonheart's weaknesses. So far I've found that the ones bearing the powers of ice dragons are actually weak to fire unlike the others, and the ones who summon crystals to block attacks are nonetheless unable to grab a spear to stop it from reaching them. -They say a ninja can catch a sword in her hands, but can she stop a spear? Ha, thought not! -They say a ninja can catch a sword in her hands, but can she stop a spear? Ha, thought not! -(Pg. 54 from Catherine Willows' journal): The post-collapse civilization sought immortality, but they knew that the technologies of the old civilization were a danger to them. So they turned to another school of thought: Magic. -(Pg. 54 from Catherine Willows' journal): The post-collapse civilization sought immortality, but they knew that the technologies of the old civilization were a danger to them. So they turned to another school of thought: Magic. -(Pg. 55 from Catherine Willows' journal): Silk wrappings, enchanted with ten-thousand microscopic runes per cubit, were suffucient to protect their bodies from ageing for millenia. What they didn't realize was that the magic didn't protect their souls. -(Pg. 55 from Catherine Willows' journal): Silk wrappings, enchanted with ten-thousand microscopic runes per cubit, were suffucient to protect their bodies from ageing for millenia. What they didn't realize was that the magic didn't protect their souls. -(Pg. 56 from Catherine Willows' journal): They have no clue what they are doing anymore. To them, this is just another one of their ten-thousand dreams across the aeons. They can no longer tell reality from imagination. -(Pg. 56 from Catherine Willows' journal): They have no clue what they are doing anymore. To them, this is just another one of their ten-thousand dreams across the aeons. They can no longer tell reality from imagination. -Ninjas aren't so tough to fight when their hands are tied behind their back. Good thing I had my pet slime with me~ -Ninjas aren't so tough to fight when their hands are tied behind their back. Good thing I had my pet slime with me~ -(Pg. 12 from Catherine Willows' addendum): After studying the ancient race of catlike people, I have come to the conclusion that their race met a dual fate. All of them received eternal life in some form or another. To one half it manifested as a blessing, allowing them to walk the halls. To the other it became a curse to them, trapping them in runic wrappings for all eternity. -(Pg. 12 from Catherine Willows' addendum): After studying the ancient race of catlike people, I have come to the conclusion that their race met a dual fate. All of them received eternal life in some form or another. To one half it manifested as a blessing, allowing them to walk the halls. To the other it became a curse to them, trapping them in runic wrappings for all eternity. -(Pg. 13 from Catherine Willows' addendum): I must issue a correction to the statements written in my journal. The ancients knew what they were doing. Those that were cursed, are blessed, and those who were blessed, are cursed. -(Pg. 13 from Catherine Willows' addendum): I must issue a correction to the statements written in my journal. The ancients knew what they were doing. Those that were cursed, are blessed, and those who were blessed, are cursed. -(It's a copy of an ancient illustration, depicting a cat goddess, an elven goddess, and two groups of catgirls. One group is smiling and standing on pedestals. The other group is frowning and wearing armor meant for war. It looks unfinished, like the author was suddenly grabbed from behind while drawing it) -(It's a copy of an ancient illustration, depicting a cat goddess, an elven goddess, and two groups of catgirls. One group is smiling and standing on pedestals. The other group is frowning and wearing armor meant for war. It looks unfinished, like the author was suddenly grabbed from behind while drawing it) -(It's a interlinear translation of an ancient letter) Your highness, I have delivered to you the prisoners that you have asked. They are the worst of the worst--thieves, slanderers, sorcerers and seducers. But I must inquire, why is it that we must wrap them in silken scarves, worth twenty gold pieces each? Surely they are being handed over to be disciplined, not to be anointed? -(It's a interlinear translation of an ancient letter) Your highness, I have delivered to you the prisoners that you have asked. They are the worst of the worst--thieves, slanderers, sorcerers and seducers. But I must inquire, why is it that we must wrap them in silken scarves, worth twenty gold pieces each? Surely they are being handed over to be disciplined, not to be anointed? -(It's a record of an interview)|ME: Why are you like this?|MUMMY: Because we are blessed!|ME: Blessed? You've been wrapped up for thousands of years!|MUMMY: A thousand years is nothing compared to the glory that will come!|ME: Why do you have to be wrapped up? There are plenty of you who aren't...|MUMMY: The chosen ones will inherit the land when the goddess returns. -(It's a record of an interview)|ME: Why are you like this?|MUMMY: Because we are blessed!|ME: Blessed? You've been wrapped up for thousands of years!|MUMMY: A thousand years is nothing compared to the glory that will come!|ME: Why do you have to be wrapped up? There are plenty of you who aren't...|MUMMY: The chosen ones will inherit the land when the goddess returns. -(It's a record of an interview)|ME: Which goddess are you referring to? The goddess of restoration?|MUMMY: The blessed kitty.. she was promised to rule over the lesser goddesses.|ME: Lesser goddesses? Which ones?|MUMMY: YOUR goddesses. The ones you humans created that should not be. Ours is the true offspring of the creators, a goddess created to rule! -(It's a record of an interview)|ME: Which goddess are you referring to? The goddess of restoration?|MUMMY: The blessed kitty.. she was promised to rule over the lesser goddesses.|ME: Lesser goddesses? Which ones?|MUMMY: YOUR goddesses. The ones you humans created that should not be. Ours is the true offspring of the creators, a goddess created to rule! -(It's a record of an interview)|ME: What of the elves? Don't they talk about a 'kingdom' too?|MUMMY: Who are the elves?|ME: You know, pointy ears, green hair, a heck of an attitude... they seem in tune with nature.|MUMMY: They sound arrogant.|ME: They are.|MUMMY: Perhaps they know nothing of the promise between our goddess and theirs. -(It's a record of an interview)|ME: What of the elves? Don't they talk about a 'kingdom' too?|MUMMY: Who are the elves?|ME: You know, pointy ears, green hair, a heck of an attitude... they seem in tune with nature.|MUMMY: They sound arrogant.|ME: They are.|MUMMY: Perhaps they know nothing of the promise between our goddess and theirs. -(It's a medical record) Patient seems stable... application of the enchanted cloth seems to have stopped the bleeding. It appears that the ancient magic suppresses all forms of injury, even in humans, until it is taken off. -(It's a medical record) Patient seems stable... application of the enchanted cloth seems to have stopped the bleeding. It appears that the ancient magic suppresses all forms of injury, even in humans, until it is taken off. -Those damn slimes! They're so sticky and gross... fortunately, I washed myself in the fountain the last time I got caught by one. It came right off! -Those damn slimes! They're so sticky and gross... fortunately, I washed myself in the fountain the last time I got caught by one. It came right off! -The dragonhearts were a group of dragonslayers, named for their ritual that imbues them with the fiery power and resistance of dragons they've slain. Now they work as mercenaries, and some of them serve a certain Leather goddess. -The dragonhearts were a group of dragonslayers, named for their ritual that imbues them with the fiery power and resistance of dragons they've slain. Now they work as mercenaries, and some of them serve a certain Leather goddess. -Yes! I've done it! I have created another red slime! I shall call him Fred, yes, Fred... after the slime I lost in a Shield-related accident a while back... poor Fred... I miss him. -Yes! I've done it! I have created another red slime! I shall call him Fred, yes, Fred... after the slime I lost in a Shield-related accident a while back... poor Fred... I miss him. -(Pg. 70 from Catherine Willows' journal): The underground jungle is a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through? -(Pg. 70 from Catherine Willows' journal): The underground jungle is a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through? -The unseen maid is the deadliest. -The unseen maid is the deadliest. -(The note is blank) -(The note is blank) -The note reads: Mmmmmmmph! Mmmm! MMMMMPH!!!!-- (The entire note is just gagged mumblings...) -The note reads: Mmmmmmmph! Mmmm! MMMMMPH!!!!-- (The entire note is just gagged mumblings...) -(The note is illegible) -(The note is illegible) -(The note contains a map of a previous floor) -(The note contains a map of a previous floor) -(The note is smeared with some kind of liquid) -(The note is smeared with some kind of liquid) -(The note contains a cryptic riddle that makes no sense) -(The note contains a cryptic riddle that makes no sense) -(The note contains a list of the writer's likes/dislikes and hard limits) -(The note contains a list of the writer's likes/dislikes and hard limits) -The note reads: Please take this beautiful doll somewhere and play with her~ -The note reads: Please take this beautiful doll somewhere and play with her~ -(The note contains a manual on fencing. You have always been a terrible fencer) -(The note contains a manual on fencing. You have always been a terrible fencer) -(The note contains a magic spell you were taught never to cast under any circumstances) -(The note contains a magic spell you were taught never to cast under any circumstances) -The item requires 5 keys and free hands to remove -The item requires 5 keys and free hands to remove -The item is extremely secure with five separate keyholes. -The item is extremely secure with five separate keyholes. -You insert your 5 keys into the lock and the item finally comes off. -You insert your 5 keys into the lock and the item finally comes off. -Curse of Tickling: This item is tickling you without end! -Curse of Tickling: This item is tickling you without end! -Curse of Punishment: Inflicts psychic damage when you attack or cast a spell. -Curse of Punishment: Inflicts psychic damage when you attack or cast a spell. -Curse of Illumination: Produces light and makes you easier to see. -Curse of Illumination: Produces light and makes you easier to see. -Curse of Attraction: Other women find you even more irresistable. -Curse of Attraction: Other women find you even more irresistable. -Curse of Animation: Causes loose restraints to animate and attack you! -Curse of Animation: Causes loose restraints to animate and attack you! -Curse of Sensitivity: Makes it easier to lose control of yourself. -Curse of Sensitivity: Makes it easier to lose control of yourself. -Curse of Distraction: Multiplies DP gain by 1.5x. -Curse of Distraction: Multiplies DP gain by 1.5x. -Curse of Breathlessness: Multiplies SP gain by 0.6x. -Curse of Breathlessness: Multiplies SP gain by 0.6x. -Curse of Futility: Multiplies WP gain by 0.25x. -Curse of Futility: Multiplies WP gain by 0.25x. -Curse of Submission: Gain submissiveness when you lose control of yourself... -Curse of Submission: Gain submissiveness when you lose control of yourself... -Your RESTRAINTNAME glows pink as you feel your mind attacked by hypnotic forces! -Your RESTRAINTNAME glows pink as you feel your mind attacked by hypnotic forces! -The item is cursed! Several restraints appear on your body! -The item is cursed! Several restraints appear on your body! -The item is cursed, but you are so trussed up you hear only sinister laughter... -The item is cursed, but you are so trussed up you hear only sinister laughter... -The item is sealed with an icy lock. Perhaps you can melt it somehow? -The item is sealed with an icy lock. Perhaps you can melt it somehow? -The cursed seal flashes brightly as you struggle fruitlessly against it. -The cursed seal flashes brightly as you struggle fruitlessly against it. -The item is sealed with a smoldering lock. Perhaps you just need to put out that fire... -The item is sealed with a smoldering lock. Perhaps you just need to put out that fire... -The cursed seal glows faintly as you struggle fruitlessly against it. -The cursed seal glows faintly as you struggle fruitlessly against it. -The item contains technological markings. Perhaps applying some electricity will affect it? -The item contains technological markings. Perhaps applying some electricity will affect it? -The cursed seal gives off sparks as you struggle fruitlessly against it. -The cursed seal gives off sparks as you struggle fruitlessly against it. -The item contains an alchemical seal. Perhaps Glue damage will overload it? -The item contains an alchemical seal. Perhaps Glue damage will overload it? -The item stretches as you tug on it, but snaps back to its original place. -The item stretches as you tug on it, but snaps back to its original place. -The item is covered in markings of chains. Perhaps you need to take Chain damage? -The item is covered in markings of chains. Perhaps you need to take Chain damage? -The item squeezes you tighter as you try to take it off. -The item squeezes you tighter as you try to take it off. -The item is protected by holy magic. There is nothing you can do to it. -The item is protected by holy magic. There is nothing you can do to it. -You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? -You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? -This item bears the sigil of the Goddess of Restoration. Perhaps she can help? -This item bears the sigil of the Goddess of Restoration. Perhaps she can help? -The item is protected by an arcane seal. There is nothing you can do to it. -The item is protected by an arcane seal. There is nothing you can do to it. -You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? -You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? -This item bears the sigil of the Goddess of Conjuration. Perhaps she can help? -This item bears the sigil of the Goddess of Conjuration. Perhaps she can help? -The item is protected by dark secrets. There is nothing you can do to it. -The item is protected by dark secrets. There is nothing you can do to it. -You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? -You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? -This item bears the sigil of the Goddess of Illusions. Perhaps she can help? -This item bears the sigil of the Goddess of Illusions. Perhaps she can help? -You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? -You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? -This item bears the sigil of the Goddess of Elements. Perhaps she can help? -This item bears the sigil of the Goddess of Elements. Perhaps she can help? -The item is protected by powerful energies. There is nothing you can do to it. -The item is protected by powerful energies. There is nothing you can do to it. -You hold the key to the item and it comes loose, draining the key's energy. -You hold the key to the item and it comes loose, draining the key's energy. -The item is incribed with mystical runes. Maybe you need a powerful key to unlock it. -The item is incribed with mystical runes. Maybe you need a powerful key to unlock it. -You tug on the item, but the runes glow brighter as you realize struggling is pointless. -You tug on the item, but the runes glow brighter as you realize struggling is pointless. - - - - - - -The item is sealed with a locking spell! You will need a key to dispel the magic. -The item is sealed with a locking spell! You will need a key to dispel the magic. -You tug on the item but it is magically sealed to your body! -You tug on the item but it is magically sealed to your body! -You insert your magic key into the lock and the item finally comes off! -You insert your magic key into the lock and the item finally comes off! -The item is protected by a seal of Determination. You must have maximum willpower to remove it. -The item is protected by a seal of Determination. You must have maximum willpower to remove it. -You are unable to muster the willpower to bypass the seal... -You are unable to muster the willpower to bypass the seal... -Feeling determined, you override the seal and release the item! -Feeling determined, you override the seal and release the item! -The lock is protected by a revanent seal. You'll need 25 ectoplasm to disenchant it. -The lock is protected by a revanent seal. You'll need 25 ectoplasm to disenchant it. -Your fingers pass right through the collar. Pity your neck doesn't pass through it. -Your fingers pass right through the collar. Pity your neck doesn't pass through it. -You channel ghastly energy into the lock and break the seal!!! -You channel ghastly energy into the lock and break the seal!!! -The item seems to drain divine energy from shrines. Maybe that has something to do with it. -The item seems to drain divine energy from shrines. Maybe that has something to do with it. -The collar is enchanted with multiple layers of magical seals. -The collar is enchanted with multiple layers of magical seals. -The collar has absorbed enough energy and pops off! -The collar has absorbed enough energy and pops off! -That item cant be used. -That item cant be used. -You're not sure how to use this key. -You're not sure how to use this key. -As soon as you touch the key, all of your gold locks fade to blue! -As soon as you touch the key, all of your gold locks fade to blue! -You realize there is no keyhole on the device, simply a lock-shaped sigil. -You realize there is no keyhole on the device, simply a lock-shaped sigil. -The item loosens and falls off, but you see a red sigil flash and the key suddenly teleports away! -The item loosens and falls off, but you see a red sigil flash and the key suddenly teleports away! -You have in your possession KeyAmount magical, ornate key(s). You might as well try... -You have in your possession KeyAmount magical, ornate key(s). You might as well try... -You have KeyAmount key(s) for this item. -You have KeyAmount key(s) for this item. -The angel helps you struggle and use items -The angel helps you struggle and use items -The ghost helps you struggle and use items -The ghost helps you struggle and use items -The ghost is unhelpful -The ghost is unhelpful -Angel: Greetings! -Angel: Greetings! -Angel: Perhaps I can assist with those! -Angel: Perhaps I can assist with those! -Adventurer's Ghost: Well met, traveler! -Adventurer's Ghost: Well met, traveler! -Adventurer's Ghost: Hello again, traveler (giggles). -Adventurer's Ghost: Hello again, traveler (giggles). -Adventurer's Ghost: Having fun, girl? -Adventurer's Ghost: Having fun, girl? -Adventurer's Ghost: Looking for some trouble, slave? -Adventurer's Ghost: Looking for some trouble, slave? -Adventurer's Ghost: I see you, naughty little slave! -Adventurer's Ghost: I see you, naughty little slave! -Ghost: I can try to help with those, traveler. -Ghost: I can try to help with those, traveler. -Ghost: Aww, you look like you're having fun... -Ghost: Aww, you look like you're having fun... -Ghost: You look great in those, hehe~ -Ghost: You look great in those, hehe~ -Ghost: Please don't bother me. -Ghost: Please don't bother me. -Ghost: A good slave doesn't complain. -Ghost: A good slave doesn't complain. -Ghost: What's that? I don't understand. -Ghost: What's that? I don't understand. -Ghost: Silence is golden. -Ghost: Silence is golden. -Ghost: A good slave doesn't speak until addressed. -Ghost: A good slave doesn't speak until addressed. -Ghost: Aww, so helpless~ -Ghost: Aww, so helpless~ -Ghost: Trussed up like a good girl~ -Ghost: Trussed up like a good girl~ -Ghost: You're going to stay that way for a good while. -Ghost: You're going to stay that way for a good while. -Ghost: I love watching you hop around, it's funny! -Ghost: I love watching you hop around, it's funny! -Ghost: Just sit there like a good girl~ -Ghost: Just sit there like a good girl~ -Ghost: I want to see you kneel~ -Ghost: I want to see you kneel~ -Ghost: Aww, feeling frustrated? -Ghost: Aww, feeling frustrated? -Ghost: Looks like someone's been naughty~ -Ghost: Looks like someone's been naughty~ -Ghost: How's it feel to be under lock and key? -Ghost: How's it feel to be under lock and key? -You step on a pressure plate and a number of skeletons rise up! -You step on a pressure plate and a number of skeletons rise up! -You are ambushed by bandits! -You are ambushed by bandits! -Armed skeletons appear from passages in the walls! -Armed skeletons appear from passages in the walls! -An armed skeleton drops down from the ceiling! -An armed skeleton drops down from the ceiling! -A wall panel falls down, and an armored skeleton appears! -A wall panel falls down, and an armored skeleton appears! -You feel a chill down your spine... -You feel a chill down your spine... -You feel a constricting presence... -You feel a constricting presence... -You feel a titillating presence... -You feel a titillating presence... -You are ambushed by ninjas! -You are ambushed by ninjas! -A large, wriggling mess of ropes fall from the ceiling! -A large, wriggling mess of ropes fall from the ceiling! -You are ambushed by dragonhearts! -You are ambushed by dragonhearts! -You are ambushed by dragonhearts! -You are ambushed by dragonhearts! -A pack of drones descends from the ceiling! -A pack of drones descends from the ceiling! -You hear sirens as a group of robots closes in! -You hear sirens as a group of robots closes in! -You stumble upon a group of mages wanting to play dress-up! -You stumble upon a group of mages wanting to play dress-up! -You step on an open book, only to find a furious librarian staring you down! -You step on an open book, only to find a furious librarian staring you down! -You are ambushed by wolfgirls! -You are ambushed by wolfgirls! -You are ambushed by an alkahestor! -You are ambushed by an alkahestor! -Small blobs of slime fall from the ceiling! -Small blobs of slime fall from the ceiling! -You are ambushed by slime researchers! -You are ambushed by slime researchers! -A large blob of slime falls from the ceiling! -A large blob of slime falls from the ceiling! -In a puff of smoke, a group of fire elementals appear around you! -In a puff of smoke, a group of fire elementals appear around you! -In a flash of fog a group of ice elementals appear around you! -In a flash of fog a group of ice elementals appear around you! -In a burst of mist, a group of water elementals appear around you! -In a burst of mist, a group of water elementals appear around you! -A group of earth elementals rise out of the ground! -A group of earth elementals rise out of the ground! -You hear pouring liquid and a group of latex elementals come out of the walls! -You hear pouring liquid and a group of latex elementals come out of the walls! -In a flash of light, a group of air elementals appear around you! -In a flash of light, a group of air elementals appear around you! -Several ethereal hands appear all around you! -Several ethereal hands appear all around you! -You have stumbled upon a conjurer's study! -You have stumbled upon a conjurer's study! -You have stumbled upon a conjurer's study! -You have stumbled upon a conjurer's study! -You are ambushed by a group of maids! -You are ambushed by a group of maids! -You are ambushed by a group of maids! -You are ambushed by a group of maids! -You are ambushed by a group of maids! -You are ambushed by a group of maids! -The Head Maid corners you! -The Head Maid corners you! -A vine crawls from the ground, already wrapping around your feet! -A vine crawls from the ground, already wrapping around your feet! -You have broken a magic orb, gaining a Spell Point and angering a goddess. -You have broken a magic orb, gaining a Spell Point and angering a goddess. -You have broken a magic orb, gaining a random spell and angering a goddess. -You have broken a magic orb, gaining a random spell and angering a goddess. -Choose one. She will send her minions after you. -Choose one. She will send her minions after you. -An altar stands before you, bestowing a heavenly contract. -An altar stands before you, bestowing a heavenly contract. -Do you choose to accept its terms? -Do you choose to accept its terms? -Are you sure? This choice is final. -Are you sure? This choice is final. -Yes, I will accept. -Yes, I will accept. -(Accept the contract) -(Accept the contract) -I'll think about it. -I'll think about it. -You are frozen! -You are frozen! -You are chilled! -You are chilled! -Shadowy tendrils wrap around your feet, rooting you in place!!! -Shadowy tendrils wrap around your feet, rooting you in place!!! -You get the feeling that someone is searching for you... -You get the feeling that someone is searching for you... -You hear movements all around as you realize you are surrounded!!! -You hear movements all around as you realize you are surrounded!!! -There is another restraint underneath! -There is another restraint underneath! -Indifferent -Indifferent -Angered -Angered -Enraged -Enraged -Cursed -Cursed -Thankful -Thankful -Pleased -Pleased -Blessed -Blessed -Neutral -Neutral -Annoyed -Annoyed -Hostile -Hostile -Wanted -Wanted -Friendly -Friendly -Allied -Allied -Favorable -Favorable -You run up against the TETHER pulling you back. -You run up against the TETHER pulling you back. -You are yanked back by the TETHER! -You are yanked back by the TETHER! -We will be going for a walk. Follow me. -We will be going for a walk. Follow me. -Don't get comfortable. Im taking you to a new cell. Follow me. -Don't get comfortable. Im taking you to a new cell. Follow me. -We're going to have some fun. Follow me. -We're going to have some fun. Follow me. -I told you to follow me! -I told you to follow me! -I said, FOLLOW ME! -I said, FOLLOW ME! -I won't repeat myself -I won't repeat myself -Then let's put you back in your cell! -Then let's put you back in your cell! -I hope you learned your lesson. Now get your butt out of here. -I hope you learned your lesson. Now get your butt out of here. -You've been a good girl. I hope you don't make the same mistake again. You can leave. -You've been a good girl. I hope you don't make the same mistake again. You can leave. -That's a good girl. Now behave yourself, okay? You're free to go. -That's a good girl. Now behave yourself, okay? You're free to go. -Looks like you got yourself in a bind! (she pats your butt playfully) Go make the others happy! -Looks like you got yourself in a bind! (she pats your butt playfully) Go make the others happy! -Good girl. -Good girl. -You'll be making others happy in no time. -You'll be making others happy in no time. -You're shaping up to be a good slave. -You're shaping up to be a good slave. -I wish I could take you to my room... -I wish I could take you to my room... -It seems your training is going well. -It seems your training is going well. -Perhaps you are enjoying this, hehe. -Perhaps you are enjoying this, hehe. -The EnemyName starts adding a RestraintName! -The EnemyName starts adding a RestraintName! -You're missing part of your uniform. -You're missing part of your uniform. -The EnemyName starts to remove your RestraintName! -The EnemyName starts to remove your RestraintName! -The EnemyName starts to lock your RestraintName! -The EnemyName starts to lock your RestraintName! -The EnemyName locks your RestraintName with a LockType! -The EnemyName locks your RestraintName with a LockType! -I am going to change your restraints. Hold still! -I am going to change your restraints. Hold still! -Looks like somebody forgot to lock those~ -Looks like somebody forgot to lock those~ -Got yourself in trouble, eh? -Got yourself in trouble, eh? -Looks like you're shaping up to be a good girl~ -Looks like you're shaping up to be a good girl~ -Oh! Looks like I've made a mistake... -Oh! Looks like I've made a mistake... -404 prisoner not found. Releasing tether. -404 prisoner not found. Releasing tether. -A EnemyName appears to check on you. -A EnemyName appears to check on you. -The EnemyName leaves and locks the cell behind her. -The EnemyName leaves and locks the cell behind her. -Layered underneath: -Layered underneath: -Increased strictness due to: -Increased strictness due to: -Mana -Mana -Bondage -Bondage -Ask for Aid -Ask for Aid -Become a Champion -Become a Champion -Ask -Ask -Ask for Rescue -Ask for Rescue -Offer -Offer -Offer Penance -Offer Penance -Current Champion -Current Champion -Switch Champion -Switch Champion -Become the champion of this goddess. Capturing bound enemies will grant +1 rep. -Become the champion of this goddess. Capturing bound enemies will grant +1 rep. -You are now the champion of the Goddess of GODDESS. -You are now the champion of the Goddess of GODDESS. -For 3 rep the goddess will grant you slipperiness, boosting your struggling. -For 3 rep the goddess will grant you slipperiness, boosting your struggling. -For 3 rep the goddess will grant you a key. -For 3 rep the goddess will grant you a key. -For 3 rep the goddess will grant you -For 3 rep the goddess will grant you -For 3 rep the goddess -For 3 rep the goddess -For 3 rep the goddess -For 3 rep the goddess -For 3 rep the goddess -For 3 rep the goddess -For 3 rep the goddess -For 3 rep the goddess -For 3 rep the goddess -For 3 rep the goddess -The goddess will fully restore your mana in exchange for AMOUNT rep -The goddess will fully restore your mana in exchange for AMOUNT rep -The goddess will enjoy seeing you struggle in her bonds (raises submissiveness) -The goddess will enjoy seeing you struggle in her bonds (raises submissiveness) -The Goddess may decide to send an angel to help you struggle, in exchange for 10 rep -The Goddess may decide to send an angel to help you struggle, in exchange for 10 rep -The Goddess will expect you to pay AMOUNT gold for +5 rep -The Goddess will expect you to pay AMOUNT gold for +5 rep -The Goddess hears your plea! -The Goddess hears your plea! -The Goddess hears your plea but has decided not to care. -The Goddess hears your plea but has decided not to care. -The Goddess fills your mind with heavenly images as she channels energy through your veins. -The Goddess fills your mind with heavenly images as she channels energy through your veins. -Time stops as an angel of heaven appears to collect your payment. -Time stops as an angel of heaven appears to collect your payment. -You shudder and tremble as a wave of pleasure washes over you! -You shudder and tremble as a wave of pleasure washes over you! -You lose control of yourself as you convulse in pleasurable bliss! -You lose control of yourself as you convulse in pleasurable bliss! -You let out a moan as you feel the ecstasy of pleasure! -You let out a moan as you feel the ecstasy of pleasure! -You finally let out a deep breath as you get what you've waited for! -You finally let out a deep breath as you get what you've waited for! -Your whole body thrashes about as you experience long-awaited pleasure! -Your whole body thrashes about as you experience long-awaited pleasure! -Your release comes with a bang as your body rocks back and forth! -Your release comes with a bang as your body rocks back and forth! -You wiggle your hips in ecstasy as you experience pure bliss! -You wiggle your hips in ecstasy as you experience pure bliss! -You are left gasping for air as you receive your long-awaited orgasm! -You are left gasping for air as you receive your long-awaited orgasm! -You finally are left rocking your body wildly in sheer pleasure! -You finally are left rocking your body wildly in sheer pleasure! -A powerful wave of pleasure comes over you as you convulse in ecstasy. -A powerful wave of pleasure comes over you as you convulse in ecstasy. -Your breathing intensifies as you lose control of yourself! -Your breathing intensifies as you lose control of yourself! -You close your eyes and breath rapidly in anticipation... -You close your eyes and breath rapidly in anticipation... -You tilt your head back and moan as your heart beats faster... -You tilt your head back and moan as your heart beats faster... -You groan with pleasure as you approach the edge... -You groan with pleasure as you approach the edge... -You whimper as you rub your legs together furiously... -You whimper as you rub your legs together furiously... -You feel frustrated as the stimulation isn't quite enough... -You feel frustrated as the stimulation isn't quite enough... -Your whole body shakes, but you don't quite go over the edge... -Your whole body shakes, but you don't quite go over the edge... -This is starting to feel like torture... -This is starting to feel like torture... -You let out a frustrated scream as the torment continues... -You let out a frustrated scream as the torment continues... -You simmer just under the edge, heart racing, breathing quickly... -You simmer just under the edge, heart racing, breathing quickly... -You let out an anguished moan as release dances just out of reach... -You let out an anguished moan as release dances just out of reach... -You squirm helplessly as your futile struggles simply arouse you more... -You squirm helplessly as your futile struggles simply arouse you more... -The vibration suddenly weakens. -The vibration suddenly weakens. -Your toys cease vibrating abruptly. -Your toys cease vibrating abruptly. -The vibrators cut off suddenly, leaving you wanting. -The vibrators cut off suddenly, leaving you wanting. -The toys turn off at the last moment, cutting you off. -The toys turn off at the last moment, cutting you off. -The toys leave you without pleasure as they turn off. -The toys leave you without pleasure as they turn off. -You are left feeling empty as the toys stop vibrating. -You are left feeling empty as the toys stop vibrating. -You stomp your foot on the ground in frustration as the vibration ceases. -You stomp your foot on the ground in frustration as the vibration ceases. -The toys leave you in agony as they cease vibrating. -The toys leave you in agony as they cease vibrating. -The toys torture you by stopping at the last moment. -The toys torture you by stopping at the last moment. -The toys stop just before you lose yourself. -The toys stop just before you lose yourself. -The toys deny you a chance to finish. -The toys deny you a chance to finish. -You try to pleasure yourself, but your chastity belt prevents you! -You try to pleasure yourself, but your chastity belt prevents you! -You play with yourself... -You play with yourself... -You let your hands wander for a moment... -You let your hands wander for a moment... -You squirm your hips and whimper in your bindings... -You squirm your hips and whimper in your bindings... -Your instincts are getting the better of you... -Your instincts are getting the better of you... -Your body shudders briefly from pleasure... -Your body shudders briefly from pleasure... -You are unable to control yourself. -You are unable to control yourself. -You play with yourself using the magic wand... -You play with yourself using the magic wand... -You would never do such a thing. -You would never do such a thing. -You try to rub your erogenous zones by squirming your legs... -You try to rub your erogenous zones by squirming your legs... -Your will is draining as you crave release, but can't quite get there without help... -Your will is draining as you crave release, but can't quite get there without help... -Your will is draining as your heart beats faster and your body trembles... -Your will is draining as your heart beats faster and your body trembles... -Your will is draining as you simmer just under the edge... -Your will is draining as you simmer just under the edge... -Your will is draining as you crave release, and the toys continue to vibrate... -Your will is draining as you crave release, and the toys continue to vibrate... -Your will is draining as the toys continue buzzing... -Your will is draining as the toys continue buzzing... -Your will is draining as you are tormented by vibrations... -Your will is draining as you are tormented by vibrations... -A buzzing vibration wakes you up! -A buzzing vibration wakes you up! -Your RestraintName constricts, warning you not to misbehave! -Your RestraintName constricts, warning you not to misbehave! -Your RestraintName tightens painfully to punish your misbehavior! -Your RestraintName tightens painfully to punish your misbehavior! -Your RestraintName punishes you for your behavior! -Your RestraintName punishes you for your behavior! -Your RestraintName punishes you and warns you with a harsh beep! -Your RestraintName punishes you and warns you with a harsh beep! -Your RestraintName emits a red flash, causing you to feel faint! -Your RestraintName emits a red flash, causing you to feel faint! -Your armor makes noise as you move around! -Your armor makes noise as you move around! -Your RestraintName lets out an alert! -Your RestraintName lets out an alert! -A golden lock fades into a blue lock on one of your restraints! -A golden lock fades into a blue lock on one of your restraints! -Your command word is heard and the purple lock(s) click and fall off! -Your command word is heard and the purple lock(s) click and fall off! -Your command word is heard and the charger unlocks! -Your command word is heard and the charger unlocks! -Are you sure you want to attack? -Are you sure you want to attack? -Are you sure you want to go to the next level? (Click self to confirm) -Are you sure you want to go to the next level? (Click self to confirm) -You shudder as you apply the RestraintName to yourself... -You shudder as you apply the RestraintName to yourself... -You insert the RestraintName and close your belt's shield over it, with a click as it locks in place. -You insert the RestraintName and close your belt's shield over it, with a click as it locks in place. -You attack the RestraintName and close your bra's shield over it, with a click as it locks in place. -You attack the RestraintName and close your bra's shield over it, with a click as it locks in place. -You slowly put on the RestraintName, amazed at how it seems to mold to your size... -You slowly put on the RestraintName, amazed at how it seems to mold to your size... -You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! -You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! -Ancient Chastity Belt -Ancient Chastity Belt -You find a chastity belt, glowing magnificently, along with a strange crystal next to it. -You find a chastity belt, glowing magnificently, along with a strange crystal next to it. -A chastity belt of sleek, ancient design. While powered, it gives -30% miscast chance due to distraction and slowly regenerates stamina. -A chastity belt of sleek, ancient design. While powered, it gives -30% miscast chance due to distraction and slowly regenerates stamina. -'Belt of the devoted' -'Belt of the devoted' -You tug at your chastity belt, but you can't even stick a finger inside because it's so tight... -You tug at your chastity belt, but you can't even stick a finger inside because it's so tight... -Ancient Chastity Bra -Ancient Chastity Bra -You find a chastity bra, glowing magnificently, along with a strange crystal next to it. -You find a chastity bra, glowing magnificently, along with a strange crystal next to it. -A chastity bra of sleek, ancient design. While powered, it reduces incoming damage by 1. -A chastity bra of sleek, ancient design. While powered, it reduces incoming damage by 1. -'Shield of the chaste' -'Shield of the chaste' -You rub your hands along your breasts but feel only hard, unbreakable metal. -You rub your hands along your breasts but feel only hard, unbreakable metal. -Ancient Heels -Ancient Heels -You find a set of glowing heels, glowing magnificently, along with a strange crystal next to it. -You find a set of glowing heels, glowing magnificently, along with a strange crystal next to it. -A pair of towering heels, enchanted with combat magic. When powered, they reduce slow level by 1, and deal 25 shadow damage on-hit with brief slow. -A pair of towering heels, enchanted with combat magic. When powered, they reduce slow level by 1, and deal 25 shadow damage on-hit with brief slow. -'Shoes of the graceful' -'Shoes of the graceful' -You can barely stand in these heels. They are rigid, metallic, and unbreakable, yet padded on the inside. -You can barely stand in these heels. They are rigid, metallic, and unbreakable, yet padded on the inside. -Ancient Blindfold -Ancient Blindfold -You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. -You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. -A full-blackout mask. When powered, it negates accuracy penalties due to vision, boosts accuracy by +100%, and boosts melee damage by +10. -A full-blackout mask. When powered, it negates accuracy penalties due to vision, boosts accuracy by +100%, and boosts melee damage by +10. -'Mask of the Warrior' -'Mask of the Warrior' -You tug at the mask but it won't come off. It's molded so close to your face that no light shines through! -You tug at the mask but it won't come off. It's molded so close to your face that no light shines through! -Ancient Muzzle -Ancient Muzzle -You find a muzzle with a long rubbery plug on the inside, glowing magnificently, along with a strange crystal next to it. -You find a muzzle with a long rubbery plug on the inside, glowing magnificently, along with a strange crystal next to it. -A muzzle that seals over the face tightly. When powered, it regenerates mana, boosts sneak, and multiplies damage dealt to unaware enemies by 2.5x. -A muzzle that seals over the face tightly. When powered, it regenerates mana, boosts sneak, and multiplies damage dealt to unaware enemies by 2.5x. -'Muzzle of the Saboteur' -'Muzzle of the Saboteur' -You claw at your face, but not only does the soft plug fill your mouth completely, the muzzle itself is nigh-unbreakable! -You claw at your face, but not only does the soft plug fill your mouth completely, the muzzle itself is nigh-unbreakable! -Ancient Gag -Ancient Gag -You find a ball gag harness with a long rubbery plug instead of a ball, glowing magnificently, along with a strange crystal next to it. -You find a ball gag harness with a long rubbery plug instead of a ball, glowing magnificently, along with a strange crystal next to it. -A gag that fills the mouth. When powered, regens mana, reduces miscast by 30%, and boosts damage to enemies that are stunned, frozen, bound, or slowed by 30%. -A gag that fills the mouth. When powered, regens mana, reduces miscast by 30%, and boosts damage to enemies that are stunned, frozen, bound, or slowed by 30%. -'Gag of the Focused' -'Gag of the Focused' -You tug on the straps at your cheeks, but the straps are so tight the plug doesn't even move! -You tug on the straps at your cheeks, but the straps are so tight the plug doesn't even move! -Ancient Rear Plug -Ancient Rear Plug -You find a huge, flexible, segmented plug, along with a strange crystal next to it. -You find a huge, flexible, segmented plug, along with a strange crystal next to it. -A plug that shocks the wearer when someone disciplines them, after orgasm, and mildly when spellcasting. When powered, reduces miscast chance by 30%. -A plug that shocks the wearer when someone disciplines them, after orgasm, and mildly when spellcasting. When powered, reduces miscast chance by 30%. -'Plug of the Obedient' -'Plug of the Obedient' -You realize the magical plug has expanded inside your body. It won't come out. -You realize the magical plug has expanded inside your body. It won't come out. -Ancient Plug -Ancient Plug -You find a huge, ribbed plug, along with a strange crystal next to it. -You find a huge, ribbed plug, along with a strange crystal next to it. -A plug that denies the wearer constantly and only rarely grants release. When powered, it grants +70% magic resistance (about 40% reduction). -A plug that denies the wearer constantly and only rarely grants release. When powered, it grants +70% magic resistance (about 40% reduction). -'Plug of the Perseverant' -'Plug of the Perseverant' -You realize the magical plug has expanded inside your body. It won't come out. -You realize the magical plug has expanded inside your body. It won't come out. -Ancient Stimulator -Ancient Stimulator -You find a flat, round device with a hole on one side, along with a strange crystal next to it. -You find a flat, round device with a hole on one side, along with a strange crystal next to it. -A device that teases the wearer for casting spells and attacking. When powered, it reduces mana and stamina costs for casting spells and attacking. -A device that teases the wearer for casting spells and attacking. When powered, it reduces mana and stamina costs for casting spells and attacking. -'The Persuader' -'The Persuader' -You realize the magical device has attached to your body using suction. It won't come off! -You realize the magical device has attached to your body using suction. It won't come off! -Ancient Mittens -Ancient Mittens -You find a pair of shining gloves, glowing magnificently, along with a strange crystal next to it. -You find a pair of shining gloves, glowing magnificently, along with a strange crystal next to it. -Tight mittens that force the hands into fists. When powered, they increase all magic damage to enemies by 40%. -Tight mittens that force the hands into fists. When powered, they increase all magic damage to enemies by 40%. -'Mittens of Blasting' -'Mittens of Blasting' -You rub your mittens together, but they are unfazed by anything you do to them and your hands are clasped tight. -You rub your mittens together, but they are unfazed by anything you do to them and your hands are clasped tight. -Ancient Armbinder -Ancient Armbinder -You find a monoglove, glowing magnificently, along with a strange crystal next to it. -You find a monoglove, glowing magnificently, along with a strange crystal next to it. -An extremely strict armbinder. When powered, reduces miscast chance by 30%, increases all magic damage to enemies by 40%, and increases spell range by 50%. -An extremely strict armbinder. When powered, reduces miscast chance by 30%, increases all magic damage to enemies by 40%, and increases spell range by 50%. -'Armbinder of the Artillerist' -'Armbinder of the Artillerist' -You try to wiggle your arms, but they can barely move in this position and are clasped tight. Your arms are sealed. -You try to wiggle your arms, but they can barely move in this position and are clasped tight. Your arms are sealed. -Ancient Ankle Cuffs -Ancient Ankle Cuffs -You find a pair of glowing cuffs, glowing magnificently, along with a strange crystal next to it. -You find a pair of glowing cuffs, glowing magnificently, along with a strange crystal next to it. -A pair of cuffs designed for summoners. Heals nearby summons by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power. -A pair of cuffs designed for summoners. Heals nearby summons by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power. -'Anklets of the Faithful Friend' -'Anklets of the Faithful Friend' -You jingle the chains around and realize that these unbreakable restraints won't be coming off. -You jingle the chains around and realize that these unbreakable restraints won't be coming off. -Ancient Ankle Cuffs -Ancient Ankle Cuffs -...when powered down, they snap together, rendering the wearer immobile. -...when powered down, they snap together, rendering the wearer immobile. -'Anklets of the Unfaithful Friend' -'Anklets of the Unfaithful Friend' -You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! -You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! -You search for your ancient keys but it seems they were taken away for good. -You search for your ancient keys but it seems they were taken away for good. -Random (reduces penalty by 1) -Random (reduces penalty by 1) -You don't have any valid targets on your body for that. -You don't have any valid targets on your body for that. -The air swirls with traces of pleasing magic... -The air swirls with traces of pleasing magic... -The spores make you feel sleepy... -The spores make you feel sleepy... -DAMAGETYPE: MULTIPLIERx modifier -DAMAGETYPE: MULTIPLIERx modifier -Base Physical Armor: AMOUNT -Base Physical Armor: AMOUNT -Base Magic Armor: AMOUNT -Base Magic Armor: AMOUNT -Base Evasion: AMOUNT% -Base Evasion: AMOUNT% -Deals DAMAGETYPE damage -Deals DAMAGETYPE damage -Can disarm (chance: DISARMCHANCE%) -Can disarm (chance: DISARMCHANCE%) -Resistances: -Resistances: -HP: -HP: -Binding: -Binding: -Ambivalent -Ambivalent -Likes you -Likes you -Loves you -Loves you -Adores you -Adores you -Dislikes you -Dislikes you -Hates you -Hates you -Despises you -Despises you -Talking to you -Talking to you -Aware of you! -Aware of you! -Pursuing you! -Pursuing you! -Slightly suspicious -Slightly suspicious -Saw something... -Saw something... -Notices you! -Notices you! -Unaware -Unaware -Items carried: -Items carried: -...and NUMBER more -...and NUMBER more -Disappears if the caster is stunned -Disappears if the caster is stunned -Disappears if the caster is defeated -Disappears if the caster is defeated -Caster: ENEMYNAME -Caster: ENEMYNAME -Demise immanent -Demise immanent -Vulnerable -Vulnerable -Stunned -Stunned -Snared -Snared -Slowed -Slowed -Silence -Silence -Disarmed -Disarmed -Blinded -Blinded -Restrained! -Restrained! -Restricted! -Restricted! -Immobilized! -Immobilized! -Fully Bound! -Fully Bound! -Trussed up! -Trussed up! -Tightly Secured! -Tightly Secured! -Inescapably -Inescapably -Trussed up! -Trussed up! -Trussed up! -Trussed up! -Helpless! -Helpless! -Belted -Belted -Wearing a toy -Wearing a toy -Vibed! -Vibed! -Acid -Acid -Shadow -Shadow -Ice -Ice -Ice -Ice -Fire -Fire -Poison -Poison -Charm -Charm -Tickle -Tickle -Grope -Grope -Crush -Crush -Gravity -Gravity -Pierce -Pierce -Slash -Slash -Pain -Pain -Psychic -Psychic -Psychic -Psychic -Psychic -Psychic -Electric -Electric -Pressure -Pressure -Chain -Chain -Charm -Charm -Glue -Glue -Unarmed -Unarmed -Melee -Melee -Magic -Magic -Spell -Spell -Unstoppable -Unstoppable -Unflinching -Unflinching -You found a magical amulet! Choose one of the following to determine its benefits: -You found a magical amulet! Choose one of the following to determine its benefits: -Focus: +50% max distraction, increased distraction decay. +5% stamina protected from damage (base: 30%). -Focus: +50% max distraction, increased distraction decay. +5% stamina protected from damage (base: 30%). -Vigour: +50 max stamina, +50% stamina potion effectiveness. -Vigour: +50 max stamina, +50% stamina potion effectiveness. -Wisdom: +50 max mana. +50% mana potion effectiveness. -Wisdom: +50 max mana. +50% mana potion effectiveness. -Fortitude: +50 max willpower, +50% willpower potion effectiveness. +1 stamina regen/turn. -Fortitude: +50 max willpower, +50% willpower potion effectiveness. +1 stamina regen/turn. -+Distraction -+Distraction -+Stamina -+Stamina -+Willpower -+Willpower -+Mana -+Mana -Discard (destroys it permanently!) -Discard (destroys it permanently!) -The EnemyName is vulnerable and took an extra AMOUNT damage! -The EnemyName is vulnerable and took an extra AMOUNT damage! -The EnemyName isn't aware of you and took an extra AMOUNT damage! -The EnemyName isn't aware of you and took an extra AMOUNT damage! -The enemy steals a pick from you! -The enemy steals a pick from you! -The enemy takes away your knife! -The enemy takes away your knife! -The enemy steals a key from your body! -The enemy steals a key from your body! -The enemy wrests away your magical knife! -The enemy wrests away your magical knife! -The enemy takes away your precious magic key! -The enemy takes away your precious magic key! -The enemy steals one ITEMSTOLEN from you! -The enemy steals one ITEMSTOLEN from you! -You get your stolen items back. -You get your stolen items back. -The EnemyName manages to retreat with your items! -The EnemyName manages to retreat with your items! -The orb contains knowledge of SPELL. -The orb contains knowledge of SPELL. -You capture the EnemyName. You can become a champion in the Reputation screen. -You capture the EnemyName. You can become a champion in the Reputation screen. -You capture the EnemyName. -You capture the EnemyName. -You capture the EnemyName in the name of the goddess of GODDESS. -You capture the EnemyName in the name of the goddess of GODDESS. -You capture the EnemyName, but the goddess of GODDESS would prefer that you be in uniform (wear her restraint). -You capture the EnemyName, but the goddess of GODDESS would prefer that you be in uniform (wear her restraint). -You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! -You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! -You capture the EnemyName, but the goddess of GODDESS would prefer that you wear some restraints. -You capture the EnemyName, but the goddess of GODDESS would prefer that you wear some restraints. -You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! -You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! -You capture the EnemyName, but have reached the limit for rewards this floor. -You capture the EnemyName, but have reached the limit for rewards this floor. -The spirit inside the restraint is vengeful and emerges to wreak havoc on the world! -The spirit inside the restraint is vengeful and emerges to wreak havoc on the world! -You hide inside the container... -You hide inside the container... -It's a crumpled piece of scrap metal with a sharp edge. -It's a crumpled piece of scrap metal with a sharp edge. -You use the scrap to try and cut the item. -You use the scrap to try and cut the item. -You rub the item against the broken object's sharp edges... -You rub the item against the broken object's sharp edges... -A hook hangs at shoulder height. -A hook hangs at shoulder height. -You can't reach that with the hook! -You can't reach that with the hook! -There's a hook on the wall. -There's a hook on the wall. -The wall is cracked. -The wall is cracked. -You rub yourself on the corner... -You rub yourself on the corner... -Many ropes emerge around you, removing weaker ropes from your body and binding enemies! -Many ropes emerge around you, removing weaker ropes from your body and binding enemies! -Choose Class: -Choose Class: -Distraction Mode: -Distraction Mode: -Distracted -Distracted -Aroused -Aroused -Removes all chastity belts, vibrating restraints, plugs, and removes the option to play with yourself. -Removes all chastity belts, vibrating restraints, plugs, and removes the option to play with yourself. -Includes all that good stuff. -Includes all that good stuff. -Allow Rear Plugs -Allow Rear Plugs -Allow Piercings -Allow Piercings -Fighter -Fighter -Start with 200 willpower and Iron Will, good at melee and blocking attacks. -Start with 200 willpower and Iron Will, good at melee and blocking attacks. -Rogue -Rogue -Start with 200 stamina and Sneaky, good at stealth and evasive gameplay. -Start with 200 stamina and Sneaky, good at stealth and evasive gameplay. -Wizard -Wizard -Start with 200 mana and Magical Sight, good at casting spells. -Start with 200 mana and Magical Sight, good at casting spells. -Peasant -Peasant -Start with nothing to your name. For those who want a challenge. -Start with nothing to your name. For those who want a challenge. -Trainee -Trainee -You are a mage, but haven't finished your formal 'training'. Requires Aroused mode. -You are a mage, but haven't finished your formal 'training'. Requires Aroused mode. -Spell Choice: -Spell Choice: -Choose Spells -Choose Spells -Random Spells -Random Spells -Break orbs. Get points. Buy spells. It's that simple. -Break orbs. Get points. Buy spells. It's that simple. -Break orbs and pray you get something good. -Break orbs and pray you get something good. -Save Mode: -Save Mode: -Save Codes -Save Codes -Roguelike -Roguelike -Grants a save code every floor you can write down. Autosaves only on floor start. -Grants a save code every floor you can write down. Autosaves only on floor start. -No save codes, forced autosaves. You are in it to win it. -No save codes, forced autosaves. You are in it to win it. -Prison Strictness: -Prison Strictness: -Normal -Normal -Easy -Easy -Strict -Strict -If you get captured, you might get rescued if you have good relations. -If you get captured, you might get rescued if you have good relations. -If you get captured, you will always get rescued and pay a fee. -If you get captured, you will always get rescued and pay a fee. -If you get captured, you are totally on your own. -If you get captured, you are totally on your own. -Start Playing -Start Playing -Lock your settings in, nice and tight. -Lock your settings in, nice and tight. -Choose some perks to spice up your run. -Choose some perks to spice up your run. -This game engages in safe and consensual analytics. -This game engages in safe and consensual analytics. -It sends data about spell choices, levels reached, etc, to help balance and improve the game. -It sends data about spell choices, levels reached, etc, to help balance and improve the game. -No personal data is sent or stored. -No personal data is sent or stored. -Accept -Accept -Don't Track Me -Don't Track Me -Your key to the stairs is taken away! -Your key to the stairs is taken away! -You found a keyring to the stairs! Now you just need to get there. -You found a keyring to the stairs! Now you just need to get there. -There seems to be a locked high-security door. Looks like you need a key. -There seems to be a locked high-security door. Looks like you need a key. -This is a bug. Bosses shouldn't submit -This is a bug. Bosses shouldn't submit -This is a bug. Bosses shouldn't submit -This is a bug. Bosses shouldn't submit -This is a bug. Bosses shouldn't submit -This is a bug. Bosses shouldn't submit - - - - - - -Well well, what have we got here? -Well well, what have we got here? -You're not here to take away my pets, are you? -You're not here to take away my pets, are you? -You'd make a lovely pet... -You'd make a lovely pet... -Daww, you're so cute when you're struggling! -Daww, you're so cute when you're struggling! -Let's take you back to your space~ -Let's take you back to your space~ -You need to be bound tight! -You need to be bound tight! -Cleaning up for me, huh? -Cleaning up for me, huh? -Uh uh, give that back! -Uh uh, give that back! -I see how it is. -I see how it is. -I've taken on hundreds of adventurers like you. -I've taken on hundreds of adventurers like you. -You don't stand a chance. -You don't stand a chance. -Your magic is nothing compared to mine! -Your magic is nothing compared to mine! -I've been a master wizard for over a thousand years! -I've been a master wizard for over a thousand years! -You call that a spell? -You call that a spell? -My spells are far superior! -My spells are far superior! -She won't help you! -She won't help you! -Not yours! -Not yours! -Oh, that's not going to help~ -Oh, that's not going to help~ -Let's play a game! -Let's play a game! -Didn't think you would get away, did you? -Didn't think you would get away, did you? -Oh ho~ -Oh ho~ -'Tis but a scratch! -'Tis but a scratch! -You'll be my pet soon~ -You'll be my pet soon~ -Cute~ -Cute~ -Don't even try~ -Don't even try~ -It's over~ -It's over~ -Get over here! -Get over here! -Not so slippery now! -Not so slippery now! -I'll be taking that~ -I'll be taking that~ -'Click!' -'Click!' -Catch me if you can! -Catch me if you can! -You'll never get away with this! -You'll never get away with this! -I don't want to be your slave! -I don't want to be your slave! -I've been naughty, looks like I need to be punished... -I've been naughty, looks like I need to be punished... -I've been a bad girl, won't you do something about it? -I've been a bad girl, won't you do something about it? -Mmmph... maybe I talk too much... -Mmmph... maybe I talk too much... -Hey! Where do you think you're going? -Hey! Where do you think you're going? -You look like you're having fun! -You look like you're having fun! -I have somewhere else in mind for you~ -I have somewhere else in mind for you~ -What do you think you're doing with that? -What do you think you're doing with that? -Looks like you found my keys! Hand them over. -Looks like you found my keys! Hand them over. -You look like a good girl. Come on~ -You look like a good girl. Come on~ -Come here, let's play! -Come here, let's play! -*grins and starts walking toward you* -*grins and starts walking toward you* -Hey! Play nice! -Hey! Play nice! -Stop that! Guards! -Stop that! Guards! -You're mine! -You're mine! -Sorceress! -Sorceress! -Get her! -Get her! -She's a mage! Stop her! -She's a mage! Stop her! -Watch it! -Watch it! -Don't touch that! -Don't touch that! -Don't touch that! -Don't touch that! -Don't touch that! -Don't touch that! -We have an escapee! -We have an escapee! -Not so fast! -Not so fast! -Try that again! -Try that again! -Do your worst! -Do your worst! -Got you! -Got you! -Get back here! -Get back here! -Missed me! -Missed me! -You're coming with me! -You're coming with me! -Get over here! -Get over here! -Not so slippery now! -Not so slippery now! -Hand it over. -Hand it over. -Nice and tight! -Nice and tight! -Mmmmph!!! -Mmmmph!!! -Mmmmm~ -Mmmmm~ -Mmmgh! -Mmmgh! -Mmmmmm <3 -Mmmmmm <3 -Mmmmmm~ -Mmmmmm~ -Mmmph~ -Mmmph~ -*looks at you nervously* -*looks at you nervously* -*giggles* -*giggles* -*giggles eagerly* -*giggles eagerly* -Mmmph? -Mmmph? -Mmmghgh!!! -Mmmghgh!!! -Mmmmph... -Mmmmph... -Hhhhmph! -Hhhhmph! -Mmmmmmmmm... -Mmmmmmmmm... -Mmmph! -Mmmph! -Nngghhh! -Nngghhh! -Gggghh!!! -Gggghh!!! -Mmmaaghthh! -Mmmaaghthh! -Wwwmmmthhh! -Wwwmmmthhh! -Mmmmmph! -Mmmmmph! -Mmmph. -Mmmph. -Mmmph! -Mmmph! -*looks at you suspiciously* -*looks at you suspiciously* -*looks at you angrily* -*looks at you angrily* -Mmmmph!!! -Mmmmph!!! -Mmmmph! -Mmmmph! -*jumps up and down excitedly* -*jumps up and down excitedly* -*groans* -*groans* -*does a happy dance* -*does a happy dance* -Mmmph!!! -Mmmph!!! -*giggles* -*giggles* -Mmmph. -Mmmph. -Nngghhh! -Nngghhh! -Mmm-hmmm. -Mmm-hmmm. -Mmmmmmm~ -Mmmmmmm~ -Mmmph~ -Mmmph~ -Mmmmph!!! -Mmmmph!!! -Mmmmm~ -Mmmmm~ -Mmmgh! -Mmmgh! -Mmmmmm <3 -Mmmmmm <3 -Mmmmmm~ -Mmmmmm~ -Mmmph~ -Mmmph~ -*Mmmmmm~* -*Mmmmmm~* -*muffled giggle* -*muffled giggle* -Mmmm~ -Mmmm~ -Mmmph? -Mmmph? -Mmmghgh!!! -Mmmghgh!!! -Mmmmph... -Mmmmph... -Hhhhmph! -Hhhhmph! -Mmmmmmmmm... -Mmmmmmmmm... -Mmmph! -Mmmph! -Nngghhh! -Nngghhh! -Gggghh!!! -Gggghh!!! -Mmmaaghthh! -Mmmaaghthh! -Wwwmmmthhh! -Wwwmmmthhh! -Mmmmmph! -Mmmmmph! -Mmmph. -Mmmph. -Mmmph! -Mmmph! -Mmmph? -Mmmph? -*glows with anger* -*glows with anger* -Mmmmph!!! -Mmmmph!!! -Mmmmph! -Mmmmph! -*muffled giggle* -*muffled giggle* -*groans* -*groans* -*muffled giggle* -*muffled giggle* -Mmmph!!! -Mmmph!!! -*muffled giggle* -*muffled giggle* -Mmmph. -Mmmph. -Nngghhh! -Nngghhh! -Mmm-hmmm. -Mmm-hmmm. -Mmmmmmm~ -Mmmmmmm~ -Mmmph~ -Mmmph~ -You'll never catch me! -You'll never catch me! -Where'd you come from? -Where'd you come from? -No! Definitely don't like... tie me up and punish me! -No! Definitely don't like... tie me up and punish me! -I've come to turn myself in~ -I've come to turn myself in~ -Won't you 'apprehend' me? -Won't you 'apprehend' me? -I've been a bad girl~ -I've been a bad girl~ -Hey! You should know your place. -Hey! You should know your place. -Look who's enjoying herself~ -Look who's enjoying herself~ -Let's put you up for auction! -Let's put you up for auction! -What are you rummaging around for? -What are you rummaging around for? -Oh no you don't! -Oh no you don't! -I'm gonna teach you a lesson, girl. -I'm gonna teach you a lesson, girl. -I'm gonna miss you when we find you a nice master... -I'm gonna miss you when we find you a nice master... -Looks like you need some training, girl. -Looks like you need some training, girl. -You picked a bad time to get lost, friend. -You picked a bad time to get lost, friend. -Never should have come here. -Never should have come here. -I used to be an adventurer like you. -I used to be an adventurer like you. -You must be one of those wizards. -You must be one of those wizards. -The mages sell real well... -The mages sell real well... -Mage! Stop her! -Mage! Stop her! -Watch it! -Watch it! -Not on my watch. -Not on my watch. -That's my stash... -That's my stash... -You'll fetch a pretty penny from that goddess you just pissed off. -You'll fetch a pretty penny from that goddess you just pissed off. -Hah! Found ya! -Hah! Found ya! -Got you! -Got you! -*scoffs* Amateur. -*scoffs* Amateur. -Do your worst! -Do your worst! -Got you! -Got you! -Hmph. Get back here! -Hmph. Get back here! -Missed me! -Missed me! -Boss! We got another one! -Boss! We got another one! -Get over here! -Get over here! -Caught ya~ -Caught ya~ -Dibs on this one! -Dibs on this one! -Gotta make sure no one gets to you~ -Gotta make sure no one gets to you~ -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -*starts chasing you* -*starts chasing you* -*won't leave you be!* -*won't leave you be!* -*tugs at your body!* -*tugs at your body!* -*runs at you* -*runs at you* -*notices you!* -*notices you!* -*wants to socialize* -*wants to socialize* -*sends shivers down your spine* -*sends shivers down your spine* -*runs at you* -*runs at you* -*is rattled* -*is rattled* -*scrabbles slowly by* -*scrabbles slowly by* -*shrieks* -*shrieks* -*wants to shock your soul* -*wants to shock your soul* -*comes to seal your doom* -*comes to seal your doom* -*shouts a startling shrilling scream!* -*shouts a startling shrilling scream!* -*walks toward you with arms outstretched* -*walks toward you with arms outstretched* -*defending the goddess* -*defending the goddess* -*defends its cache* -*defends its cache* -*lets out a shriek* -*lets out a shriek* -*tries to catch you* -*tries to catch you* -*grabs you* -*grabs you* -*disarms* -*disarms* -*is rattled* -*is rattled* -*rattles excitedly* -*rattles excitedly* -*misses* -*misses* -*trembles* -*trembles* -*tugs on leash* -*tugs on leash* -*rattles* -*rattles* -*rattles excitedly* -*rattles excitedly* -*rattles excitedly* -*rattles excitedly* -*rattles* -*rattles* -Bug -Bug -Bug -Bug -Bug -Bug -Maintenance needed. -Maintenance needed. -Unit needs repair. -Unit needs repair. -Commence transfer of power protocol. -Commence transfer of power protocol. -Insufficient bindings. Commence submission protocol. -Insufficient bindings. Commence submission protocol. -Commence routine inspection. -Commence routine inspection. -Inmate is out of containment. Transferring. -Inmate is out of containment. Transferring. -Theft detected. This is a warning. -Theft detected. This is a warning. -Confiscating item. -Confiscating item. -Inmate detected. Commence training protocol. -Inmate detected. Commence training protocol. -Inmate detected. Commence routine inspection. -Inmate detected. Commence routine inspection. -Inmate detected. Commence submission training. -Inmate detected. Commence submission training. -Violence detected. Subduing assailant. -Violence detected. Subduing assailant. -Damage detected. Initiating combat routine -Damage detected. Initiating combat routine -Unruly inmate detected. Performing corrective action. -Unruly inmate detected. Performing corrective action. -Magic detected. Subduing assailant. -Magic detected. Subduing assailant. -Energy spike detected. Preparing shields. -Energy spike detected. Preparing shields. -Unlawful use of magic. Please submit to arrest. -Unlawful use of magic. Please submit to arrest. -Violence detected. Subduing assailant. -Violence detected. Subduing assailant. -Unlawful conduct. Please submit to arrest. -Unlawful conduct. Please submit to arrest. -Theft detected. Please submit to arrest. -Theft detected. Please submit to arrest. -Unlawful conduct. Please submit to arrest. -Unlawful conduct. Please submit to arrest. -Inmate has escaped. Commence capture protocol. -Inmate has escaped. Commence capture protocol. -Error, subject is attempting to escape. -Error, subject is attempting to escape. -Target is violent. Disarming subject. -Target is violent. Disarming subject. -Target is violent. Increase alert level. -Target is violent. Increase alert level. -Dispensing restraints. -Dispensing restraints. -Target resists. Revising strategy. -Target resists. Revising strategy. -Target combat skills below expected level. Revising estimates. -Target combat skills below expected level. Revising estimates. -Subject captured. Returning to processing. -Subject captured. Returning to processing. -Apply takedown protocol. -Apply takedown protocol. -Aggressive target detected. Deploying countermeasures. -Aggressive target detected. Deploying countermeasures. -Contraband detected. Confiscating. -Contraband detected. Confiscating. -Increasing strictness level. -Increasing strictness level. -Looks like I'm up to no good... better stop me! -Looks like I'm up to no good... better stop me! -Careful where you point that thing! -Careful where you point that thing! -Containment breach! -Containment breach! -What if I'm the assistant, for a change? -What if I'm the assistant, for a change? -Hey, could you test this on... me? -Hey, could you test this on... me? -I'm willing to do anything for science! -I'm willing to do anything for science! -You're a fine specimen! -You're a fine specimen! -I should take you to my office~ -I should take you to my office~ -You'd look good in some latex! -You'd look good in some latex! -Hey! That's mine! -Hey! That's mine! -You're not supposed to have that! -You're not supposed to have that! -You'll make a fine test subject... -You'll make a fine test subject... -Come here, I want to perform some tests! -Come here, I want to perform some tests! -Looks like it's time to drop some science! -Looks like it's time to drop some science! -Bad girl! -Bad girl! -Keep your filthy hands off me! -Keep your filthy hands off me! -Your chances of winning are... less than zero. -Your chances of winning are... less than zero. -Good girls don't use magic without permission. -Good girls don't use magic without permission. -Keep that magic away from my experiments! -Keep that magic away from my experiments! -You're going to break something! -You're going to break something! -That's dangerous! -That's dangerous! -Stop! That's scientific equipment! -Stop! That's scientific equipment! -Don't touch my supplies! -Don't touch my supplies! -That's off-limits! -That's off-limits! -You're not supposed to be here! -You're not supposed to be here! -Now now, you won't be going anywhere~ -Now now, you won't be going anywhere~ -A calculated success! -A calculated success! -Watch the vials! -Watch the vials! -I've caught you! -I've caught you! -I can't believe I missed... -I can't believe I missed... -I knew you would do that! -I knew you would do that! -Experiment was a success! -Experiment was a success! -Gotchya! -Gotchya! -There we go! -There we go! -Ooh, you've got some useful stuff~ -Ooh, you've got some useful stuff~ -I won't let you go that easily! -I won't let you go that easily! -Oh my, looks like I'm in trouble! -Oh my, looks like I'm in trouble! -What a shame it would be if I got caught~ -What a shame it would be if I got caught~ -Looks like I'd better get going~ -Looks like I'd better get going~ -What if I became the victim of my own inventions... -What if I became the victim of my own inventions... -Oh my, looks like I'm in trouble~ -Oh my, looks like I'm in trouble~ -Won't you help me get dressed? -Won't you help me get dressed? -You look just gorgeous, dear... -You look just gorgeous, dear... -Why don't you try these on? -Why don't you try these on? -You'll make a fine addition to my collection! -You'll make a fine addition to my collection! -Such jaw-dropping beauty! -Such jaw-dropping beauty! -You belong on a display stand! -You belong on a display stand! -We should put away those grasping hands of yours~ -We should put away those grasping hands of yours~ -That belongs to someone else. -That belongs to someone else. -Oh no you don't, sweetie! -Oh no you don't, sweetie! -Oof! Looks like you need to be taught a lesson! -Oof! Looks like you need to be taught a lesson! -We better put away those hands of yours. -We better put away those hands of yours. -Why don't you just give up and pose for us~ -Why don't you just give up and pose for us~ -Oh my, that's dangerous! -Oh my, that's dangerous! -You're going to damage my dress! -You're going to damage my dress! -Keep those pretty hands to yourself, dear~ -Keep those pretty hands to yourself, dear~ -Where'd you find that, dear? -Where'd you find that, dear? -Silly girl, you should be looking to your mistress for guidance. -Silly girl, you should be looking to your mistress for guidance. -That's not yours, sweetie~ -That's not yours, sweetie~ -You shouldn't break things with such dainty hands~ -You shouldn't break things with such dainty hands~ -I knew something was amiss! -I knew something was amiss! -You won't be getting away that easily, dear~ -You won't be getting away that easily, dear~ -Won't be needing this~ -Won't be needing this~ -Hey, you'll damage my dress! -Hey, you'll damage my dress! -I'm so excited! -I'm so excited! -A slippery one, aren't you? -A slippery one, aren't you? -Tsk tsk. You can do better, dear~ -Tsk tsk. You can do better, dear~ -I can't wait to dress you up! -I can't wait to dress you up! -So nice of you to join me! -So nice of you to join me! -Now let's see, what kind of dress... -Now let's see, what kind of dress... -A gift? Thank you so much! -A gift? Thank you so much! -You won't be getting out of that any time soon! -You won't be getting out of that any time soon! -No! I don't want to read your magazines! -No! I don't want to read your magazines! -No, I don't want to learn about Shibari! -No, I don't want to learn about Shibari! -No, I don't want to learn about your toys! -No, I don't want to learn about your toys! -I found this book about Shibari... is it yours? -I found this book about Shibari... is it yours? -I'm so clumsy... maybe you can fix that. -I'm so clumsy... maybe you can fix that. -Gee, looks like I can't keep my mouth shut... -Gee, looks like I can't keep my mouth shut... -Shhhhh. -Shhhhh. -Be quiet. -Be quiet. -Keep your hands off my books. -Keep your hands off my books. -Heh. Serves you right. -Heh. Serves you right. -Time to lock you away. -Time to lock you away. -Don't get your paws on anything important. -Don't get your paws on anything important. -I was reading that! -I was reading that! -You're not supposed to have that. -You're not supposed to have that. -Who are you? -Who are you? -You're entering my personal space. -You're entering my personal space. -I'm going to ask you to leave -I'm going to ask you to leave -You're ruining the books! -You're ruining the books! -Keep the damage under control! -Keep the damage under control! -Shut up!!! -Shut up!!! -Put that back! -Put that back! -There's nothing to learn from that, you ignorant buffon. -There's nothing to learn from that, you ignorant buffon. -Don't dive into someone else's belongings! -Don't dive into someone else's belongings! -You've destroyed an ancient artifact, imbecile! -You've destroyed an ancient artifact, imbecile! -I wish you'd just stay out of trouble... -I wish you'd just stay out of trouble... -Gotchya. -Gotchya. -You're going to hurt someone with that. -You're going to hurt someone with that. -My books! -My books! -Stay down. -Stay down. -Get back here-- -Get back here-- -Why you... -Why you... -Time for you to stay out of trouble. -Time for you to stay out of trouble. -Come along. -Come along. -Stay put! -Stay put! -I'll be taking that back. -I'll be taking that back. -Click. -Click. -No! I didn't do anything wrong... -No! I didn't do anything wrong... -Don't punish me! Please! -Don't punish me! Please! -It's not my fault! -It's not my fault! -It's your turn, dear~ -It's your turn, dear~ -Looks like I'm the patient now~ -Looks like I'm the patient now~ -I've been an unruly nurse... -I've been an unruly nurse... -It's time for your shot... -It's time for your shot... -Why are you out of your cell? -Why are you out of your cell? -You need my help! -You need my help! -Those are supposed to keep you still you know... -Those are supposed to keep you still you know... -You've got an appointment scheduled. -You've got an appointment scheduled. -Lets get you back in your jacket~ -Lets get you back in your jacket~ -Patients are not allowed to have toys. -Patients are not allowed to have toys. -Oh no you don't, sweetie! -Oh no you don't, sweetie! -Oof! Looks like you need to be taught a lesson! -Oof! Looks like you need to be taught a lesson! -You can be cured if you just give up. -You can be cured if you just give up. -You're going to ruin your progress~ -You're going to ruin your progress~ -Oh my, that's dangerous! -Oh my, that's dangerous! -Patients are forbidden from casting spells! -Patients are forbidden from casting spells! -Keep those pretty hands to yourself, dear~ -Keep those pretty hands to yourself, dear~ -Where'd you find that, dear? -Where'd you find that, dear? -Silly girl, your illness can't be cured by a prayer. -Silly girl, your illness can't be cured by a prayer. -That's not yours, sweetie~ -That's not yours, sweetie~ -You shouldn't break things, you know~ -You shouldn't break things, you know~ -I knew something was amiss! -I knew something was amiss! -You won't be getting away that easily, dear~ -You won't be getting away that easily, dear~ -Won't be needing this~ -Won't be needing this~ -Hey, who said you could do that! -Hey, who said you could do that! -I'm so excited! -I'm so excited! -A slippery one, aren't you? -A slippery one, aren't you? -Tsk tsk. You can do better, dear~ -Tsk tsk. You can do better, dear~ -Lets get you back to your cell! -Lets get you back to your cell! -So nice of you to join me! -So nice of you to join me! -Now let's see, good patients should be still... -Now let's see, good patients should be still... -A gift? Thank you so much! -A gift? Thank you so much! -You won't be getting out of that any time soon! -You won't be getting out of that any time soon! +### Credits +### Patrons +### News and Updates +### Support @ Patreon +### Thank you to the following awesome people for supporting me at patreon.com/ada18980 +### Back +### Next +### Music: kocaeli, Darkstar Studios|Bound enemy graphics: Song|RU Translation: Osiris|CN Translation: Alexthymia, Mitki, Timeline|KR, JP Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Art: Kjus, Quakehoof, Lumpychan, Kertasu, Koirin, Lightning Rook, Daikinbakuju, Sigma Overlord, dask3|Plasmadragon, GoldieKitsune, SMoonlightM, PureWind, Wyatt Wintersoul|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi +### Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|AlaskaRobotics - duct tape unroll 3, duct tape unroll 1|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators +### Language +### English +### Chinese +### Korean +### Japanese +### Spanish +### French +### Russian +### Mods +### Mods Loaded. +### Version +### Kinky Dungeon +### By Ada18980 +### You are an adventurer descending into an ancient underground city of magic. +### Beneath its depths lies the Mistress' Staff, an artifact of untold power. +### Will you prevail against forces unknown, or succumb to its dark secrets? +### (This game does not contain spiders) +### GFX +### Character +### Main +### UI +### Controls +### Keybindings +### Show Enemy Binding as % +### Auto-wait Through Delayed Actions +### Show Minimap Labels +### Auto loot all from chests +### Use Palette regardless of Outfit +### Apply palettes to Restraints +### Apply palettes to transforms +### Don't use character palette +### Always use character palette +### Use character palette for default outfit +### Show Background Art +### Experimental Rendering (unstable) +### Mute when Minimized +### Show DP instead of % +### Quick Inv only equips to self +### Override Outfit when Loading Save +### Save Outfits within Save Files +### Show free characters on map +### Detailed jailed NPCs (experimental) +### Show Struggle Bars +### Allow Suspicious Mods +### Auto Load Mods (offline only) +### Classic Inventory Background +### Skip Intro +### No Forced Greetings +### Show Zoom Buttons +### Show Restraint Info on Escape Hover +### Always Show Warnings +### Always Show Minimap +### Enable Sound +### Drool/Tears +### Draw Armor +### Enable Music +### Async Rendering (beta) +### Bloom & Glow +### Transparent UI +### Turn Counter +### Flash Screen on Stun -You'll have to try harder if you want to discipline me, ma'am. -You'll have to try harder if you want to discipline me, ma'am. -I... don't have time for training right now, ma'am... -I... don't have time for training right now, ma'am... -Did I do something wrong? -Did I do something wrong? -So you're the new boss, huh? -So you're the new boss, huh? -Time for some 'training?' -Time for some 'training?' -Wanna to have a chat? -Wanna to have a chat? -Looks like you've had too much time to yourself. -Looks like you've had too much time to yourself. -Why don't you come with me for a sec? -Why don't you come with me for a sec? -Let me see your ID... -Let me see your ID... -You have the right to remain silent. -You have the right to remain silent. -No resisting arrest. -No resisting arrest. -Who set you loose? -Who set you loose? -I'll be confiscating that. -I'll be confiscating that. -Aye, you're gonna need clearance for that, missy. -Aye, you're gonna need clearance for that, missy. -You just made a big mistake. -You just made a big mistake. -Need backup! -Need backup! -You're under arrest! -You're under arrest! -Magic use is restricted pursuant to IDC section 3 article 21a. -Magic use is restricted pursuant to IDC section 3 article 21a. -Magic? That's where I draw the line. -Magic? That's where I draw the line. -I've got an extra comfy cell for mages. -I've got an extra comfy cell for mages. -You're under arrest! -You're under arrest! -That's off limits for you! -That's off limits for you! -Resorting to petty theft? How crude. -Resorting to petty theft? How crude. -The goddesses have property rights too, you know. -The goddesses have property rights too, you know. -I'm gonna ask you to turn yourself in. -I'm gonna ask you to turn yourself in. -Keep your hands where I can see 'em. -Keep your hands where I can see 'em. -That's a weapons violation. -That's a weapons violation. -Assaulting an officer is a crime! -Assaulting an officer is a crime! -You're coming with me. -You're coming with me. -Resisting arrest won't get you anywhere. -Resisting arrest won't get you anywhere. -Is that all you got? -Is that all you got? -You have the right to remain silent. -You have the right to remain silent. -Got you! -Got you! -Hands behind your back. -Hands behind your back. -I will conduct a more thorough search later on. -I will conduct a more thorough search later on. -Suspect is secure. -Suspect is secure. -I'm not in trouble, am I? -I'm not in trouble, am I? -I'm not hiding anything, if you know what I mean... -I'm not hiding anything, if you know what I mean... -Who are you looking for? Me? -Who are you looking for? Me? -So... wanna hang out? -So... wanna hang out? -It's not like I... LIKE you or something... -It's not like I... LIKE you or something... -I'm not following you! I'm just... -I'm not following you! I'm just... -You look suspicious. -You look suspicious. -You've got a nice pair of wrists~ -You've got a nice pair of wrists~ -You there! Let's have a talk. -You there! Let's have a talk. -Looks like you're rusty. Haven't you ever done escape training? -Looks like you're rusty. Haven't you ever done escape training? -I'm going to have some fun with you~ -I'm going to have some fun with you~ -Watch yourself, girl~ -Watch yourself, girl~ -Nice find. I'll take it. -Nice find. I'll take it. -This place is off-limits for you. -This place is off-limits for you. -Let's see how you like my special move! -Let's see how you like my special move! -That's nothing compared to my technique! -That's nothing compared to my technique! -You're in for it now! -You're in for it now! -It's time for a display of skill! -It's time for a display of skill! -Fancy tricks? That's nothing. -Fancy tricks? That's nothing. -Let me show you a real move... -Let me show you a real move... -True skill comes from the heart. Not something you hold in your hand. -True skill comes from the heart. Not something you hold in your hand. -She's not going to be happy about that... -She's not going to be happy about that... -Stop right there, criminal scum! -Stop right there, criminal scum! -Do you know what you've just done? -Do you know what you've just done? -Finally, I've tracked you down! -Finally, I've tracked you down! -It's over. I've already won. -It's over. I've already won. -Wrong move, buddy. -Wrong move, buddy. -I can't believe it... -I can't believe it... -You're too slow. -You're too slow. -...she's fast. -...she's fast. -Nothing personal. -Nothing personal. -This battle is over. -This battle is over. -Get over here! -Get over here! -Too slow! -Too slow! -I'll be taking that. -I'll be taking that. -There's no way out. -There's no way out. -I'm not in trouble, am I? -I'm not in trouble, am I? -I'm not hiding anything, if you know what I mean... -I'm not hiding anything, if you know what I mean... -Who are you looking for? Me? -Who are you looking for? Me? -So... wanna hang out? -So... wanna hang out? -It's not like I... LIKE you or something... -It's not like I... LIKE you or something... -I'm not following you! I'm just... -I'm not following you! I'm just... -You're a cute one~ -You're a cute one~ -You've got a nice pair of wrists~ -You've got a nice pair of wrists~ -Hey~! Let's have a talk. -Hey~! Let's have a talk. -Looks like you need additional training. -Looks like you need additional training. -I'm going to have some fun with you~ -I'm going to have some fun with you~ -Watch yourself, girl~ -Watch yourself, girl~ -Nice find. I'll take it. -Nice find. I'll take it. -This place is off-limits for you. -This place is off-limits for you. -Bad pet! -Bad pet! -Looks like you're gonna need the extra special treatment~ -Looks like you're gonna need the extra special treatment~ -Now you've done it! -Now you've done it! -Magic? Hah... -Magic? Hah... -Such outdated practices... -Such outdated practices... -Your spells are nothing compared to technology. -Your spells are nothing compared to technology. -Quit messing around. -Quit messing around. -Don't even think about appealing to your goddess! -Don't even think about appealing to your goddess! -Stop right there! -Stop right there! -It'll take you quite a while to pay off those damages! -It'll take you quite a while to pay off those damages! -Finally, I've tracked you down! -Finally, I've tracked you down! -Now there, good girl! -Now there, good girl! -Wrong move! -Wrong move! -Get your paws off me! -Get your paws off me! -*scoffs* Could use some work~ -*scoffs* Could use some work~ -Such speed! -Such speed! -Nothing personal. -Nothing personal. -This battle is over. -This battle is over. -Get over here! -Get over here! -Too slow! -Too slow! -I'll be taking that. -I'll be taking that. -There's no way out. -There's no way out. -An outsider! -An outsider! -Hide! -Hide! -Do not pursue me! -Do not pursue me! -I have come to study human customs. Teach me about Domination. -I have come to study human customs. Teach me about Domination. -The outsiders have such... strange and interesting practices. -The outsiders have such... strange and interesting practices. -You seem to have many skills. Teach me about... rope. -You seem to have many skills. Teach me about... rope. -Hello, Outsider. -Hello, Outsider. -You look so... bland. -You look so... bland. -Outsiders are so picky about what they wear... -Outsiders are so picky about what they wear... -Tight and secure, as all things should be. -Tight and secure, as all things should be. -I have just the thing in mind for you... -I have just the thing in mind for you... -Let us put those hands away... -Let us put those hands away... -Give back what you take. -Give back what you take. -You must remain here. -You must remain here. -Resorting to violence? -Resorting to violence? -Let us clash swords! -Let us clash swords! -*scoffs* -*scoffs* -You have brought judgement upon youself. -You have brought judgement upon youself. -Your magic is that of a child. -Your magic is that of a child. -Imagine what you could learn in twelve lifetimes... -Imagine what you could learn in twelve lifetimes... -You rely on cheap gadgets. -You rely on cheap gadgets. -Do not defile the ancients. -Do not defile the ancients. -Give that back! -Give that back! -The ancients are appalled. -The ancients are appalled. -The outsider has escaped! -The outsider has escaped! -Ready to reconsider? -Ready to reconsider? -A classic blunder. -A classic blunder. -You will regret that, outsider. -You will regret that, outsider. -You get what you deserve. -You get what you deserve. -You didn't see that. -You didn't see that. -It looks like my skills are superior. -It looks like my skills are superior. -I will show you your place, outsider. -I will show you your place, outsider. -You will come with me. -You will come with me. -I regret to inform you that your battle ends here. -I regret to inform you that your battle ends here. -You won't be needing that. -You won't be needing that. -There we go. -There we go. -I don't like the way you're looking at me! -I don't like the way you're looking at me! -Yes, I've got the secrets of nature right here... -Yes, I've got the secrets of nature right here... -Why don't you come after me? -Why don't you come after me? -Why don't you teach me your... magic? -Why don't you teach me your... magic? -Guarding nature is a chore. Why don't we relax~ -Guarding nature is a chore. Why don't we relax~ -Got something in mind for me? -Got something in mind for me? -Well met, outsider! -Well met, outsider! -You look so... bland. -You look so... bland. -Outsiders are so picky about what they wear... -Outsiders are so picky about what they wear... -Tight and secure, as all things should be. -Tight and secure, as all things should be. -I have just the thing in mind for you... -I have just the thing in mind for you... -Let us put those hands away... -Let us put those hands away... -Give back what you take. -Give back what you take. -You must remain here. -You must remain here. -Resorting to violence? -Resorting to violence? -Let us clash swords! -Let us clash swords! -*scoffs* -*scoffs* -You have brought judgement upon youself. -You have brought judgement upon youself. -Your magic is that of a child. -Your magic is that of a child. -Imagine what you could learn in twelve lifetimes... -Imagine what you could learn in twelve lifetimes... -You rely on cheap gadgets. -You rely on cheap gadgets. -Do not defile the ancients. -Do not defile the ancients. -Give that back! -Give that back! -The ancients are appalled. -The ancients are appalled. -The outsider has escaped! -The outsider has escaped! -Ready to reconsider? -Ready to reconsider? -A classic blunder. -A classic blunder. -You will regret that, outsider. -You will regret that, outsider. -You get what you deserve. -You get what you deserve. -You didn't see that. -You didn't see that. -It looks like my skills are superior. -It looks like my skills are superior. -I will show you your place, outsider. -I will show you your place, outsider. -You will come with me. -You will come with me. -I regret to inform you that your battle ends here. -I regret to inform you that your battle ends here. -You won't be needing that. -You won't be needing that. -There we go. -There we go. -Bug -Bug -Bug -Bug -Bug -Bug -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -This is a bug, please report -Girl! -Girl! -Wear this! -Wear this! -Come here! -Come here! -... -... -Capture... -Capture... -Need tighten! -Need tighten! -Confiscate! -Confiscate! -Confiscate!! -Confiscate!! -Intruder! Alert! -Intruder! Alert! -Fight girl! -Fight girl! -Fight! -Fight! -Magic! -Magic! -Wizard! -Wizard! -Forbidden! -Forbidden! -Forbidden! -Forbidden! -Defiler! -Defiler! -Confiscate!!! -Confiscate!!! -Defiler!!! -Defiler!!! -Intruder escape! -Intruder escape! -Stay! -Stay! -Got you! -Got you! -Pain... -Pain... -Fight! -Fight! -Come back! -Come back! -Missed! -Missed! -Capture!!! -Capture!!! -Come here! -Come here! -Got her!!! -Got her!!! -Take! -Take! -Secure! -Secure! -So this is what it's like... -So this is what it's like... -I believe I am feeling an emotion called 'fear.' -I believe I am feeling an emotion called 'fear.' -Stay back! I am not your toy. -Stay back! I am not your toy. -Teach me about 'domination.' -Teach me about 'domination.' -Allow me to learn by experience. -Allow me to learn by experience. -As they say, 'do whatever you want to me.' -As they say, 'do whatever you want to me.' -Come here, surface-dweller. I have things for you. -Come here, surface-dweller. I have things for you. -You should improve yourself. Come here. -You should improve yourself. Come here. -You must learn our ways. -You must learn our ways. -Yes... struggle and learn. -Yes... struggle and learn. -I will take you somewhere safe. -I will take you somewhere safe. -You need to learn your place. -You need to learn your place. -Do not take what is not yours. -Do not take what is not yours. -You will not escape. -You will not escape. -Our ways are ancient! -Our ways are ancient! -Your weapons are toys to us! -Your weapons are toys to us! -So naive, surface-dweller. -So naive, surface-dweller. -Our magic is older than your gods! -Our magic is older than your gods! -You should learn our ways instead, surface-dweller. -You should learn our ways instead, surface-dweller. -You have much learning to do. -You have much learning to do. -You are playing with child's toys! -You are playing with child's toys! -Do not plead to your gods. -Do not plead to your gods. -Give that back, surface-dweller! -Give that back, surface-dweller! -Your gods offend us. -Your gods offend us. -You will not escape, surface-dweller! -You will not escape, surface-dweller! -You must not go. -You must not go. -That was a failure. -That was a failure. -That was commendable. -That was commendable. -I have you now, surface-dweller. -I have you now, surface-dweller. -You are a fast one. -You are a fast one. -You seem out of practice. -You seem out of practice. -I will take you to your place. -I will take you to your place. -Come. -Come. -Stay down. -Stay down. -I will take this. -I will take this. -You will not escape. -You will not escape. -Meow!!! -Meow!!! -No! This kitty did nothing wrong! -No! This kitty did nothing wrong! -Why are you looking at me like that?! -Why are you looking at me like that?! -I've been a bad kitty~ -I've been a bad kitty~ -Punish me! -Punish me! -This kitty needs to be gagged~ -This kitty needs to be gagged~ -Come and be blessed~ -Come and be blessed~ -Finally, some entertainment! -Finally, some entertainment! -Join us, it'll be fun! -Join us, it'll be fun! -Keep struggling~ You'll understand. -Keep struggling~ You'll understand. -You will receive the blessing. -You will receive the blessing. -What are you doing? -What are you doing? -Thanks for keeping things tidy. -Thanks for keeping things tidy. -Where do you think you're going? -Where do you think you're going? -By the blessed kitty! -By the blessed kitty! -Show us what you got! -Show us what you got! -Who do you think you are? -Who do you think you are? -Ah! Surface magic! -Ah! Surface magic! -The human goddesses are frail. -The human goddesses are frail. -Such strange magic. -Such strange magic. -What are you going to do with that? -What are you going to do with that? -Pay your respects some other way. -Pay your respects some other way. -Tomb robber! -Tomb robber! -By the blessed kitty! -By the blessed kitty! -Don't you want the blessing? -Don't you want the blessing? -Come here~ -Come here~ -Hah! -Hah! -*hisses* -*hisses* -*meows* -*meows* -*frowns* -*frowns* -I have catlike reflexes! -I have catlike reflexes! -Let me show you the blessing... -Let me show you the blessing... -Come along. -Come along. -*grins* -*grins* -You won't be needing this. -You won't be needing this. -Quit struggling~ -Quit struggling~ -Gasp! An adventurer! -Gasp! An adventurer! -Don't let her catch you! -Don't let her catch you! -You'll never trap my soul! -You'll never trap my soul! -You are quite the master of the elements! -You are quite the master of the elements! -I could get used to this~ -I could get used to this~ -Perhaps I could show you around... -Perhaps I could show you around... -What a beautiful one. -What a beautiful one. -I will take you back home~ -I will take you back home~ -You'd look great in my palace. -You'd look great in my palace. -Are we having fun? -Are we having fun? -Get over here! -Get over here! -Humans like you make great toys. -Humans like you make great toys. -That won't help you. -That won't help you. -You won't escape. -You won't escape. -Such feeble attempts. -Such feeble attempts. -Humans are fun to play with. -Humans are fun to play with. -Toying with me? I shall oblige! -Toying with me? I shall oblige! -Cast your last pathetic spell, human. -Cast your last pathetic spell, human. -Your magic is weak, human. -Your magic is weak, human. -It tickles, hehe! -It tickles, hehe! -Look what humans need to match only a fraction of our power! -Look what humans need to match only a fraction of our power! -Our goddess doesn't need to listen to the likes of you! -Our goddess doesn't need to listen to the likes of you! -Keep your hands out of our possessions. -Keep your hands out of our possessions. -Defiler! You will pay for your crimes! -Defiler! You will pay for your crimes! -A game of chase? Fun. -A game of chase? Fun. -You're staying right here... -You're staying right here... -Hah! -Hah! -Get your hands off me! -Get your hands off me! -Pathetic. -Pathetic. -You're a fast one. -You're a fast one. -Such feeble attempts. -Such feeble attempts. -It's over, human. You've lost. -It's over, human. You've lost. -There is no escape. -There is no escape. -You are beneath me. -You are beneath me. -Nice gear. I'll take it. -Nice gear. I'll take it. -Try getting out of that! -Try getting out of that! -Not the edging training! Anything but that! -Not the edging training! Anything but that! -Forgive me! -Forgive me! -No! Don't punish me! -No! Don't punish me! -You look like you've got style... -You look like you've got style... -I could learn a thing or two from you! -I could learn a thing or two from you! -Mind if I just, um, watch? -Mind if I just, um, watch? -Look, a new recruit! -Look, a new recruit! -I'll teach you a thing or two! -I'll teach you a thing or two! -Let's test your manners~ -Let's test your manners~ -Having fun there? -Having fun there? -It's time for your training. -It's time for your training. -You need to be taught some manners, maid. -You need to be taught some manners, maid. -Good girl. I'll take that to the storage room. -Good girl. I'll take that to the storage room. -I'll be taking those. -I'll be taking those. -Oh, you're approaching me? -Oh, you're approaching me? -You've gotten yourself into a big mess. -You've gotten yourself into a big mess. -You're going to regret that. -You're going to regret that. -A maid uses magic only when told! -A maid uses magic only when told! -I look forward to plugging that mouth of yours. -I look forward to plugging that mouth of yours. -How unruly... What a pain. -How unruly... What a pain. -Put that away! -Put that away! -That's off limits. You need to be punished! -That's off limits. You need to be punished! -Thief! Get her! -Thief! Get her! -Yikes! I'm calling backup! -Yikes! I'm calling backup! -Found you! -Found you! -Hold still~ -Hold still~ -Your tricks won't work on me. -Your tricks won't work on me. -Oof... You got me. -Oof... You got me. -It's over. -It's over. -Nice one. -Nice one. -You missed! -You missed! -I'll hand you over when I'm done with you. -I'll hand you over when I'm done with you. -Get over here! -Get over here! -Hmph. Stay down. -Hmph. Stay down. -Give me that. -Give me that. -'Click!' -'Click!' -I'm sorry! I didn't mean to break that vase! -I'm sorry! I didn't mean to break that vase! -I won't do it again, I swear! -I won't do it again, I swear! -Please no! I don't want the edging training again! -Please no! I don't want the edging training again! -Don't you need a bodyguard, miss? -Don't you need a bodyguard, miss? -Won't you train me, miss? -Won't you train me, miss? -I've been a bad girl... -I've been a bad girl... -Miss, your uniform is dirty... -Miss, your uniform is dirty... -Why hello miss... -Why hello miss... -Let me fix your outfit... -Let me fix your outfit... -Hmm, do I need to tighten those? -Hmm, do I need to tighten those? -M-miss... I was told to bring you somewhere... -M-miss... I was told to bring you somewhere... -Umm, miss, you're supposed to report to the head maid... -Umm, miss, you're supposed to report to the head maid... -Thanks for picking up. -Thanks for picking up. -I'll take those to the head maid! -I'll take those to the head maid! -Who are you!? -Who are you!? -Oh no! -Oh no! -Stop! -Stop! -Miss! You're not allowed to cast that! -Miss! You're not allowed to cast that! -Miss, I have to report that! -Miss, I have to report that! -Magic! -Magic! -Eeep! -Eeep! -Miss, that's reserved for the head maid! -Miss, that's reserved for the head maid! -Thief! I'm reporting this! -Thief! I'm reporting this! -Oh no! I have to report this! -Oh no! I have to report this! -Oh no! -Oh no! -I got you! I got you! -I got you! I got you! -Try that again! -Try that again! -Remember your training, remember your training... -Remember your training, remember your training... -You're filthy! -You're filthy! -Hold still... -Hold still... -Stay calm... -Stay calm... -I'll lead you to your cell... -I'll lead you to your cell... -Come on! -Come on! -Got you! -Got you! -I need to take this... -I need to take this... -I'm sorry... -I'm sorry... -I'll be heading out... -I'll be heading out... -Looks like I'll be taking my leave. -Looks like I'll be taking my leave. -Looks like I'll be reporting you~ -Looks like I'll be reporting you~ -I was wrong about you. -I was wrong about you. -Perhaps you should take my place. -Perhaps you should take my place. -Why don't you try being in charge? -Why don't you try being in charge? -Come now, it's time for training. -Come now, it's time for training. -Do you need to be punished? -Do you need to be punished? -It's time for a test. -It's time for a test. -A maid remains quiet until asked. -A maid remains quiet until asked. -Come with me. I will train you personally. -Come with me. I will train you personally. -You need to work on your ladylike manners. -You need to work on your ladylike manners. -Good girl, finding lost items. -Good girl, finding lost items. -I do not give you permmission to leave. -I do not give you permmission to leave. -Do you know who I am? -Do you know who I am? -You need to learn some manners! -You need to learn some manners! -How rude! -How rude! -There is a more proper way to cast spells... -There is a more proper way to cast spells... -Perhaps you need to receive some gag training. -Perhaps you need to receive some gag training. -You lack discipline, and self-control. -You lack discipline, and self-control. -Do not use what belongs to others. -Do not use what belongs to others. -A good maid pleads only to her mistress. -A good maid pleads only to her mistress. -Do not take what is not yours. -Do not take what is not yours. -I will personally attend to your act of disgrace. -I will personally attend to your act of disgrace. -An unruly pest. -An unruly pest. -Checkmate. -Checkmate. -Like a novice. -Like a novice. -...Nice one. -...Nice one. -Enjoy yourself, dear~ -Enjoy yourself, dear~ -Hmph. Nice. -Hmph. Nice. -Not even close. -Not even close. -I'll be taking you to your cell personally~ -I'll be taking you to your cell personally~ -Amateur. -Amateur. -Bad girl. You need discipline. -Bad girl. You need discipline. -Hand it over. -Hand it over. -I'll be keeping the keys. -I'll be keeping the keys. -Looks like I've earned some punishment... -Looks like I've earned some punishment... -I'll turn you into a newt! If you don't stop me... -I'll turn you into a newt! If you don't stop me... -Don't let me get away~ -Don't let me get away~ -Perhaps you're not so bad after all~ -Perhaps you're not so bad after all~ -Why don't you have a little fun... with me? -Why don't you have a little fun... with me? -Come and get me... -Come and get me... -I must say, you've got me under your spell~ -I must say, you've got me under your spell~ -Why aren't you a pretty one... -Why aren't you a pretty one... -I've got to kiss those tender lips of yours~ -I've got to kiss those tender lips of yours~ -Having fun, little lady? -Having fun, little lady? -I'm going to have so much fun with you! -I'm going to have so much fun with you! -Look at you, pretty and free! -Look at you, pretty and free! -Must have misplaced it... -Must have misplaced it... -Those are mine! -Those are mine! -That's not very nice! -That's not very nice! -Curse you! -Curse you! -I'll turn you into a newt! -I'll turn you into a newt! -Oh, so you've got a spellbook. What's it written in, curse-ive? -Oh, so you've got a spellbook. What's it written in, curse-ive? -Snap, crackle, and pop! -Snap, crackle, and pop! -Looks like I need to seal that foul mouth of yours. -Looks like I need to seal that foul mouth of yours. -I recognize that thing you're holding! -I recognize that thing you're holding! -You'll be praying for freedom soon, my dear~ -You'll be praying for freedom soon, my dear~ -Oh, breaking into my collection, are you? -Oh, breaking into my collection, are you? -Even I wouldn't do such a thing! -Even I wouldn't do such a thing! -Witch way to the jail cell, you say? -Witch way to the jail cell, you say? -Hold still~ -Hold still~ -Try that again! -Try that again! -Hands off! -Hands off! -Now I got you. -Now I got you. -Hmph. -Hmph. -You've got a lot to learn~ -You've got a lot to learn~ -You'll be coming with me! -You'll be coming with me! -I'll be yanking your chain~ -I'll be yanking your chain~ -Not so fast~ -Not so fast~ -I'll be taking this~ -I'll be taking this~ -EnemyName:There, nice and tight dear~ -EnemyName:There, nice and tight dear~ -I promise I'll be back later! -I promise I'll be back later! -I didn't do anything wrong! -I didn't do anything wrong! -I won't get in your way, miss! -I won't get in your way, miss! -Take me as your student, miss! -Take me as your student, miss! -Won't you teach me? -Won't you teach me? -I wish to study under your wisdom! -I wish to study under your wisdom! -Mind if I play with you a bit? -Mind if I play with you a bit? -Oooh! My new friend! -Oooh! My new friend! -My mistress told me to give you a good time... -My mistress told me to give you a good time... -Hehe, having fun? -Hehe, having fun? -Miss, won't you come? -Miss, won't you come? -Hey, you're free to play, right~? -Hey, you're free to play, right~? -Hey, uh, give that back... (blushes) -Hey, uh, give that back... (blushes) -Um, you have to return those! -Um, you have to return those! -Eeep! -Eeep! -Help me! -Help me! -Somebody help! -Somebody help! -A battle of wits, huh? -A battle of wits, huh? -You underestimate my power! -You underestimate my power! -I'll show you true skill! -I'll show you true skill! -Please put that down... -Please put that down... -Hey, I used to pray at that shrine... -Hey, I used to pray at that shrine... -Hey, my mistress won't appreciate you taking those... -Hey, my mistress won't appreciate you taking those... -The horror! -The horror! -You're supposed to be in jail! -You're supposed to be in jail! -Stay with me please. -Stay with me please. -I got it! -I got it! -Be gentle, please! -Be gentle, please! -I did it! -I did it! -Hey, no fair! -Hey, no fair! -Close one! -Close one! -Come along~ -Come along~ -Come here please! -Come here please! -Hah! I'm a genius! -Hah! I'm a genius! -I need to take this... -I need to take this... -I'm sorry about this... -I'm sorry about this... -Sticks and stones may break my bones... but you'll never catch me! -Sticks and stones may break my bones... but you'll never catch me! -Got a bone to pick with me? -Got a bone to pick with me? -I must make my escape! -I must make my escape! -...I need a strong hand. -...I need a strong hand. -Ouch, I hit my funny bone... won't you help? -Ouch, I hit my funny bone... won't you help? -Bone appetit~ -Bone appetit~ -I've got a bone to pick with you! -I've got a bone to pick with you! -Hey bonehead! What's up? -Hey bonehead! What's up? -Finally, something to toy with after working myself to the bone... -Finally, something to toy with after working myself to the bone... -I find your struggling quite humerus. -I find your struggling quite humerus. -Come with me, I'll take you someplace grand... -Come with me, I'll take you someplace grand... -Looks like I get a bone-us! -Looks like I get a bone-us! -You're getting under my skin... -You're getting under my skin... -Thought you were making a marrow escape, eh? -Thought you were making a marrow escape, eh? -You numskull! -You numskull! -You've got a lot of spine to fight me! -You've got a lot of spine to fight me! -You don't have a leg to stand on... -You don't have a leg to stand on... -Magic... I feel it in my bones... -Magic... I feel it in my bones... -You've made a grave mistake! -You've made a grave mistake! -Your spells are pathetic, I'm cracking up~ -Your spells are pathetic, I'm cracking up~ -You've made a bone-a fide error. -You've made a bone-a fide error. -Defiling the shrines... that's where I jaw the line! -Defiling the shrines... that's where I jaw the line! -There's a skele-tonne of things in there and none of them are yours! -There's a skele-tonne of things in there and none of them are yours! -You're bad to the bone... -You're bad to the bone... -Looks like you're bone to be wild, eh? -Looks like you're bone to be wild, eh? -You're mine! -You're mine! -Hah! -Hah! -That'll leave a mark... -That'll leave a mark... -You're mine now! -You're mine now! -Hold still you bonehead! -Hold still you bonehead! -Hah! Such nerve... -Hah! Such nerve... -You're coming with me! -You're coming with me! -Get over here! -Get over here! -Not so slippery now! -Not so slippery now! -I'll be confiscating that. -I'll be confiscating that. -Make sure that's nice and tight... -Make sure that's nice and tight... -Scary... -Scary... -Run... Away... -Run... Away... -*Giggles* -*Giggles* -Play... with... me... -Play... with... me... -Please... -Please... -Command... Me... -Command... Me... -Cute... Girl... -Cute... Girl... -Helpless... -Helpless... -Take... -Take... -Mine... -Mine... -Shiny... -Shiny... -*giggles* -*giggles* -Brains... -Brains... -Squishy... -Squishy... -Rude... -Rude... -Mean... -Mean... -Ouch... -Ouch... -Pretty... Lights... -Pretty... Lights... -Sparkles... -Sparkles... -It... Burns... -It... Burns... -Hey... -Hey... -Defiler... -Defiler... -Thief... -Thief... -Intruder... -Intruder... -Give... Hug... -Give... Hug... -...Hug... -...Hug... -Checkmate... -Checkmate... -It's... Cold... -It's... Cold... -Friend... -Friend... -Come... Back... -Come... Back... -He... hee... -He... hee... -...Prisoner. -...Prisoner. -...Get over here... -...Get over here... -...Got you. -...Got you. -...Shiny... -...Shiny... -...Secure... -...Secure... -The weapon requires power from an Ancient Crystal to function. -The weapon requires power from an Ancient Crystal to function. -Target an enemy: Attack with Dragonslaver. Target a tile: Spend 8 charge to launch binding belts -Target an enemy: Attack with Dragonslaver. Target a tile: Spend 8 charge to launch binding belts -25 charge to enter Slime Form for 25 turns, and create slime around yourself. -25 charge to enter Slime Form for 25 turns, and create slime around yourself. -50 charge to reduce mana cost of next fire, earth, air, and water spell by 50 (once for each element) -50 charge to reduce mana cost of next fire, earth, air, and water spell by 50 (once for each element) -25 charge to disarm a target for 8 turns, rendering them unable to attack. -25 charge to disarm a target for 8 turns, rendering them unable to attack. -5 charge (+2.5 per charge) to channel and fire a beam that deals 30 + 3/charge electric damage, or 90 at max charge. -5 charge (+2.5 per charge) to channel and fire a beam that deals 30 + 3/charge electric damage, or 90 at max charge. -5 charge to fire a blast that deals 25 electric damage. -5 charge to fire a blast that deals 25 electric damage. -50 charge to fire an arrow that enrages a target. -50 charge to fire an arrow that enrages a target. -50 charge to enter a frenzy for 10 turns, attacking twice per turn. -50 charge to enter a frenzy for 10 turns, attacking twice per turn. -Create a '+' shaped pool of slime that deals 35 glue damage per hit -Create a '+' shaped pool of slime that deals 35 glue damage per hit -Ignite torches and nearby objects -Ignite torches and nearby objects -Ignite torches and nearby objects -Ignite torches and nearby objects -Ignite torches and nearby objects -Ignite torches and nearby objects -Ignite torches and nearby objects -Ignite torches and nearby objects -Toggles -Toggles -Multiclass -Multiclass -Locks and Restraints -Locks and Restraints -General Combat -General Combat -Kinks and Preferences -Kinks and Preferences -Damage and Resists -Damage and Resists -Wizardry and Sorcery -Wizardry and Sorcery -Devious Threats -Devious Threats -World Generation -World Generation -Starting Scenario -Starting Scenario -Unlockable -Unlockable -You hand over your weapon reluctantly... -You hand over your weapon reluctantly... -(Leave) -(Leave) -(...) -(...) -(The SPEAKER frowns)|Don't lie to me. -(The SPEAKER frowns)|Don't lie to me. -(The SPEAKER looks puzzled)|That doesn't seem right... -(The SPEAKER looks puzzled)|That doesn't seem right... -(The SPEAKER chuckles)|What a cute lie. -(The SPEAKER chuckles)|What a cute lie. -(The SPEAKER beeps)|Vital signs indicate dishonesty. -(The SPEAKER beeps)|Vital signs indicate dishonesty. -(The SPEAKER furrows her brow)|...Excuse me? -(The SPEAKER furrows her brow)|...Excuse me? -(The SPEAKER tilts her head)|Right, sorry. -(The SPEAKER tilts her head)|Right, sorry. -(The SPEAKER blushes deeply)|I'm... I'm sorry! Please carry on... -(The SPEAKER blushes deeply)|I'm... I'm sorry! Please carry on... -(The SPEAKER smiles)|Keep up the good work, girl. -(The SPEAKER smiles)|Keep up the good work, girl. -(The SPEAKER beeps)|Vital signs indicate honesty. Carry on. -(The SPEAKER beeps)|Vital signs indicate honesty. Carry on. -(The SPEAKER smiles)|Good girl. -(The SPEAKER smiles)|Good girl. -(The SPEAKER smiles)|That's a good girl. -(The SPEAKER smiles)|That's a good girl. -(The SPEAKER smiles)|Thank you. -(The SPEAKER smiles)|Thank you. -(The SPEAKER beeps)|Thank you for complying. -(The SPEAKER beeps)|Thank you for complying. -(The SPEAKER frowns)|Looks like you'll need to be punished. Get her! -(The SPEAKER frowns)|Looks like you'll need to be punished. Get her! -(The SPEAKER looks Embarrassed)|Then... then... uh... someone stop her! -(The SPEAKER looks Embarrassed)|Then... then... uh... someone stop her! -(The SPEAKER grins)|Then allow me to personally show you the rules. -(The SPEAKER grins)|Then allow me to personally show you the rules. -(The SPEAKER beeps)|Subject is resisting. Begin capture protocol. -(The SPEAKER beeps)|Subject is resisting. Begin capture protocol. -(The SPEAKER calls at you)|You're not supposed to be carrying a weapon.|Hand it over. -(The SPEAKER calls at you)|You're not supposed to be carrying a weapon.|Hand it over. -(The SPEAKER approaches you)|Contraband detected. Initiating confiscation.|Please comply. -(The SPEAKER approaches you)|Contraband detected. Initiating confiscation.|Please comply. -Yes, miss... (Currently held weapon will be lost) -Yes, miss... (Currently held weapon will be lost) -Mmph... (Nod politely) (Currently held weapon will be lost) -Mmph... (Nod politely) (Currently held weapon will be lost) -No, I refuse! -No, I refuse! -Mmph! (Shake your head) -Mmph! (Shake your head) -The Head Maid asked me to retrieve it. -The Head Maid asked me to retrieve it. -My mistress needs it for a special spell. -My mistress needs it for a special spell. -It is an offering to the goddess of Elements. -It is an offering to the goddess of Elements. -It's just a prop for a costume. -It's just a prop for a costume. -Are you questioning me? I'm a dragonslayer. -Are you questioning me? I'm a dragonslayer. -(Continue...) -(Continue...) -(The SPEAKER approaches you in your cell)|Well well, what do we have here? A new guest?|Perhaps I should give you a rundown of your new life~ -(The SPEAKER approaches you in your cell)|Well well, what do we have here? A new guest?|Perhaps I should give you a rundown of your new life~ -(The SPEAKER chuckles)|Don't tell me you seriously think we're letting you go?|You broke the rules, ignored the warnings.|Your new job is to make the people here happy. -(The SPEAKER chuckles)|Don't tell me you seriously think we're letting you go?|You broke the rules, ignored the warnings.|Your new job is to make the people here happy. -(The SPEAKER chuckles)|Hah, looks like you've got lots of training ahead of you.|Soon you'll have too much pleasure for your own good~ -(The SPEAKER chuckles)|Hah, looks like you've got lots of training ahead of you.|Soon you'll have too much pleasure for your own good~ -(The SPEAKER giggles)|Don't worry, you'll come to enjoy it soon enough. -(The SPEAKER giggles)|Don't worry, you'll come to enjoy it soon enough. -(The SPEAKER smiles)|Heh, looks like you'll be fitting right in. -(The SPEAKER smiles)|Heh, looks like you'll be fitting right in. -(The SPEAKER chuckles)|You're probably wondering what's in store for you.|It's simple: You behave and do as you're told.|Eventually you will get to roam around.|Don't you dare try to steal anything. -(The SPEAKER chuckles)|You're probably wondering what's in store for you.|It's simple: You behave and do as you're told.|Eventually you will get to roam around.|Don't you dare try to steal anything. -(The SPEAKER chuckles)|Looks like it's going to be an extended stay for you~ -(The SPEAKER chuckles)|Looks like it's going to be an extended stay for you~ -(The SPEAKER giggles and returns to her work) -(The SPEAKER giggles and returns to her work) -(The SPEAKER smiles)|Looks like you'll get the hang of it pretty quickly! -(The SPEAKER smiles)|Looks like you'll get the hang of it pretty quickly! -(New life?) -(New life?) -(Let her continue) -(Let her continue) -(Pout at her) -(Pout at her) -You can't make me do that! -You can't make me do that! -(Scream into your gag) -(Scream into your gag) -That sounds alright... -That sounds alright... -(Moan into your gag and giggle) -(Moan into your gag and giggle) -(Glare at her) -(Glare at her) -Let me out this instant! -Let me out this instant! -(Scream into your gag uselessly) -(Scream into your gag uselessly) -I will be a good girl! -I will be a good girl! -(Giggle and wiggle your body) -(Giggle and wiggle your body) -(The SPEAKER approaches you in your cell)|Back again, are we? Silly girl.|You know we don't take no for an answer. -(The SPEAKER approaches you in your cell)|Back again, are we? Silly girl.|You know we don't take no for an answer. -(The SPEAKER smiles back)|Oh, this is a game to you?|Then perhaps I should make it funner for you...|(She leaves and returns with some toys...)|Now hold still! -(The SPEAKER smiles back)|Oh, this is a game to you?|Then perhaps I should make it funner for you...|(She leaves and returns with some toys...)|Now hold still! -(The SPEAKER frowns)|I know exactly what you need... -(The SPEAKER frowns)|I know exactly what you need... -(The SPEAKER smiles back)|I'm glad you're enjoying yourself.|However, your behavior is still unacceptable.|You need to learn some respect. -(The SPEAKER smiles back)|I'm glad you're enjoying yourself.|However, your behavior is still unacceptable.|You need to learn some respect. -(The SPEAKER chuckles)|Looks like you're enjoying your restraints?|Let's make them tighter, shall we? -(The SPEAKER chuckles)|Looks like you're enjoying your restraints?|Let's make them tighter, shall we? -(The SPEAKER shrugs)|Well, I hope you learn. -(The SPEAKER shrugs)|Well, I hope you learn. -(The SPEAKER looks greedy)|Oh, you have an idea? -(The SPEAKER looks greedy)|Oh, you have an idea? -(The SPEAKER nods)|I'll put in a good word with you~ -(The SPEAKER nods)|I'll put in a good word with you~ -(The SPEAKER shakes her head)|Babe, you know who's going to be blamed|if a max-security prisoner escapes? -(The SPEAKER shakes her head)|Babe, you know who's going to be blamed|if a max-security prisoner escapes? -(Giggle and smile) -(Giggle and smile) -Don't you mean 'more fun'? -Don't you mean 'more fun'? -(Giggle and moan) -(Giggle and moan) -(Struggle in your bindings) -(Struggle in your bindings) -(Pout and glare at her) -(Pout and glare at her) -(Point to the Jailer's coin pouch) -(Point to the Jailer's coin pouch) -(Give her all your gold) -(Give her all your gold) -Why don't you wear it instead? (OFFPERC chance, may aggro) -Why don't you wear it instead? (OFFPERC chance, may aggro) -(Point to her instead) (OFFPERC chance, may aggro) -(Point to her instead) (OFFPERC chance, may aggro) -(The SPEAKER resists and fights back!) -(The SPEAKER resists and fights back!) -(The SPEAKER blushes and accepts) -(The SPEAKER blushes and accepts) -(The SPEAKER looks at you curiously)|Oh, you'd be perfect!|Would you please model my latest design? -(The SPEAKER looks at you curiously)|Oh, you'd be perfect!|Would you please model my latest design? -(The SPEAKER holds up a restrictive outfit)|This RESTRAINT might be a tight fit|so hold still while I lace it~ -(The SPEAKER holds up a restrictive outfit)|This RESTRAINT might be a tight fit|so hold still while I lace it~ -(The SPEAKER giggles)|It looks even better than I thought!|Thank you girl~ -(The SPEAKER giggles)|It looks even better than I thought!|Thank you girl~ -(The SPEAKER sighs and moves away)|Such a shame... -(The SPEAKER sighs and moves away)|Such a shame... -(The SPEAKER looks disappointed)|Guess I'll find someone else then... -(The SPEAKER looks disappointed)|Guess I'll find someone else then... -(The SPEAKER pouts)|But I just have to see how you look in it! -(The SPEAKER pouts)|But I just have to see how you look in it! -(The SPEAKER smiles)|Maybe you'll change your mind when it's on~ -(The SPEAKER smiles)|Maybe you'll change your mind when it's on~ -(The SPEAKER grumbles)|...fine, but you'd look cute~ -(The SPEAKER grumbles)|...fine, but you'd look cute~ -(The SPEAKER looks bemused)|Changed your mind?|It does look good on you though~ -(The SPEAKER looks bemused)|Changed your mind?|It does look good on you though~ -(The SPEAKER snaps her fingers)|(You feel the RESTRAINT magically appear on you)|Aha! Wonderful! You can go now~ -(The SPEAKER snaps her fingers)|(You feel the RESTRAINT magically appear on you)|Aha! Wonderful! You can go now~ -Yes please! -Yes please! -(Nod enthusiastically) -(Nod enthusiastically) -I don't have time for this. -I don't have time for this. -(Shake your head) -(Shake your head) -Of course miss. -Of course miss. -(Nod again) -(Nod again) -Actually, I'd rather not. -Actually, I'd rather not. -(Shake your head) -(Shake your head) -Fine, I guess. -Fine, I guess. -(Giggle and nod) -(Giggle and nod) -Wait! That's too much! (PERCENT chance to avoid) -Wait! That's too much! (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(The SPEAKER looks at with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed? -(The SPEAKER looks at with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed? -(The SPEAKER takes a strange mask from her satchel)|Well, I have the answer right here... -(The SPEAKER takes a strange mask from her satchel)|Well, I have the answer right here... -(The SPEAKER nods seriously)|My hypothesis was correct... -(The SPEAKER nods seriously)|My hypothesis was correct... -(The SPEAKER frowns)|Such a philistine. Begone. -(The SPEAKER frowns)|Such a philistine. Begone. -(The SPEAKER turns away and thinks deeply) -(The SPEAKER turns away and thinks deeply) -(The SPEAKER is lost deep in thought)|Like... become someone else? -(The SPEAKER is lost deep in thought)|Like... become someone else? -(The SPEAKER smiles)|You can be someone else... -(The SPEAKER smiles)|You can be someone else... -(The SPEAKER turns around and keeps pondering)|Hmmm... -(The SPEAKER turns around and keeps pondering)|Hmmm... -(The SPEAKER nods)|I see you are a truth seeker after all. -(The SPEAKER nods)|I see you are a truth seeker after all. -(The SPEAKER lets you go. But then...)|(You feel her clip a RESTRAINT on you from behind!)|There... I shall now observe your behavior. -(The SPEAKER lets you go. But then...)|(You feel her clip a RESTRAINT on you from behind!)|There... I shall now observe your behavior. -Um, sure? -Um, sure? -(Nod seriously) -(Nod seriously) -...What? -...What? -(Shake your head) -(Shake your head) -Show me the truth. -Show me the truth. -(Nod again) -(Nod again) -That's just creepy. -That's just creepy. -(Shake your head) -(Shake your head) -Fine, you've convinced me. -Fine, you've convinced me. -(Giggle and nod) -(Giggle and nod) -I don't have time for this. (PERCENT chance to avoid) -I don't have time for this. (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(The SPEAKER swings an imaginary sword around)|En guar- Oh, you're unarmored!|Do you want to borrow some of mine? -(The SPEAKER swings an imaginary sword around)|En guar- Oh, you're unarmored!|Do you want to borrow some of mine? -(The SPEAKER holds up a RESTRAINT)|I found this near an old suit of armor.|I think it's a helmet or something... -(The SPEAKER holds up a RESTRAINT)|I found this near an old suit of armor.|I think it's a helmet or something... -(The SPEAKER winks and locks it on)|I feel much safer already~ -(The SPEAKER winks and locks it on)|I feel much safer already~ -(The SPEAKER pouts)|Aww, spoilsport!|(She returns to fighting her imaginary enemies) -(The SPEAKER pouts)|Aww, spoilsport!|(She returns to fighting her imaginary enemies) -(The SPEAKER shrugs)|Your loss~ -(The SPEAKER shrugs)|Your loss~ -(The SPEAKER grins deviously)|So? It might help...|(The SPEAKER dives at you suddenly!) -(The SPEAKER grins deviously)|So? It might help...|(The SPEAKER dives at you suddenly!) -(The SPEAKER giggles)|Close enough, right?|Come on, there's enemies to fight! -(The SPEAKER giggles)|Close enough, right?|Come on, there's enemies to fight! -(The SPEAKER trips over the floor)|AHHHHH!|Maybe I need more protection... -(The SPEAKER trips over the floor)|AHHHHH!|Maybe I need more protection... -(The SPEAKER locks it in place quickly)|There, all set for battle now!|(The SPEAKER giggles, cheekily winking at you) -(The SPEAKER locks it in place quickly)|There, all set for battle now!|(The SPEAKER giggles, cheekily winking at you) -(The SPEAKER tightly fastens the muzzle on)|Safe and secure~|(You whimper as the SPEAKER spanks you goodbye) -(The SPEAKER tightly fastens the muzzle on)|Safe and secure~|(You whimper as the SPEAKER spanks you goodbye) -Extra defense can't hurt... -Extra defense can't hurt... -(Nod cautiously) -(Nod cautiously) -I'm safe enough. -I'm safe enough. -(Shake your head) -(Shake your head) -A gag? Sounds fun~ -A gag? Sounds fun~ -(Nod eagerly) -(Nod eagerly) -That's not a helmet! -That's not a helmet! -(Shake your head) -(Shake your head) -Well, it might... -Well, it might... -(Giggle and nod) -(Giggle and nod) -(Dodge her lunge) (PERCENT chance to avoid) -(Dodge her lunge) (PERCENT chance to avoid) -(Dodge her lunge) (PERCENT chance to avoid) -(Dodge her lunge) (PERCENT chance to avoid) -(A smirking SPEAKER bumps into you)|So, you're with us now, huh?|I think you need a welcome gift. -(A smirking SPEAKER bumps into you)|So, you're with us now, huh?|I think you need a welcome gift. -Mmhmm, a gift~|(The SPEAKER leans forward to whisper in your ear)|Is it cold in here, or is it just you? -Mmhmm, a gift~|(The SPEAKER leans forward to whisper in your ear)|Is it cold in here, or is it just you? -(You shiver as everything gets colder)|(RESTRAINT forms around you!)|(The SPEAKER blows you a kiss and giggles) -(You shiver as everything gets colder)|(RESTRAINT forms around you!)|(The SPEAKER blows you a kiss and giggles) -(The SPEAKER thinks for a moment)|I really wanted to try this too...|(Sighing, the SPEAKER walks away) -(The SPEAKER thinks for a moment)|I really wanted to try this too...|(Sighing, the SPEAKER walks away) -(The SPEAKER scowls)|How boring. -(The SPEAKER scowls)|How boring. -(The SPEAKER laughs at your protest)|It's so much fun though~|(You feel the temperature drop suddenly) -(The SPEAKER laughs at your protest)|It's so much fun though~|(You feel the temperature drop suddenly) -(The SPEAKER thinks for a moment)|Well, I want to try this anyway~|(You feel the temperature drop suddenly) -(The SPEAKER thinks for a moment)|Well, I want to try this anyway~|(You feel the temperature drop suddenly) -(The temperature returns to normal)|(The SPEAKER seems surprised)|Hmm, that wasn't meant to happen. -(The temperature returns to normal)|(The SPEAKER seems surprised)|Hmm, that wasn't meant to happen. -(RESTRAINT solidifies on you as the SPEAKER grins)|It worked! I did it!|Thanks for your, uh, help~ -(RESTRAINT solidifies on you as the SPEAKER grins)|It worked! I did it!|Thanks for your, uh, help~ -(RESTRAINT solidifies on you as the SPEAKER smiles)|Yes! Finally! How's that feel?|(The SPEAKER admires your restraints) -(RESTRAINT solidifies on you as the SPEAKER smiles)|Yes! Finally! How's that feel?|(The SPEAKER admires your restraints) -A gift? -A gift? -(Nod warily) -(Nod warily) -No thanks. -No thanks. -(Shake your head) -(Shake your head) -Umm... just me? -Umm... just me? -(Nod again) -(Nod again) -Wait, don't make it colder! -Wait, don't make it colder! -(Shake your head) -(Shake your head) -(Shiver and watch as the ice covers you) -(Shiver and watch as the ice covers you) -(Mutely whimper as the ice covers you) -(Mutely whimper as the ice covers you) -Ah! T-That's freezing! (PERCENT chance to avoid) -Ah! T-That's freezing! (PERCENT chance to avoid) -(Wriggle to warm up) (PERCENT chance to avoid) -(Wriggle to warm up) (PERCENT chance to avoid) -(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? -(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? -(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? -(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? -(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. -(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. -(The SPEAKER buzzes)|Understood. Proceding back to duty. -(The SPEAKER buzzes)|Understood. Proceding back to duty. -(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. -(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. -(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. -(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. -ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. -ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. -(The SPEAKER makes a whirring noise)|ERROR: SPEAKER out of tape.|Returning to routine. -(The SPEAKER makes a whirring noise)|ERROR: SPEAKER out of tape.|Returning to routine. -(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. -(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. -(The SPEAKER launches tape which catches you as you run)|RESTRAINT dispensed.|Have a nice day. -(The SPEAKER launches tape which catches you as you run)|RESTRAINT dispensed.|Have a nice day. -Uh, affirmative? -Uh, affirmative? -(Nod) -(Nod) -Negative. -Negative. -(Shake your head) -(Shake your head) -Very acceptable! -Very acceptable! -(Nod again) -(Nod again) -No, I don't want that. -No, I don't want that. -(Shake your head) -(Shake your head) -If you have to... -If you have to... -(Giggle and nod) -(Giggle and nod) -Go away robot! (PERCENT chance to avoid) -Go away robot! (PERCENT chance to avoid) -(Shake your head rapidly) (PERCENT chance to avoid) -(Shake your head rapidly) (PERCENT chance to avoid) -(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? -(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? -(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? -(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? -(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. -(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. -(The SPEAKER buzzes)|Understood. Proceding back to duty. -(The SPEAKER buzzes)|Understood. Proceding back to duty. -(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. -(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. -(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. -(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. -ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. -ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. -(The SPEAKER makes a whirring noise)|ERROR: SPEAKER cable jammed.|Returning to routine. -(The SPEAKER makes a whirring noise)|ERROR: SPEAKER cable jammed.|Returning to routine. -(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. -(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. -(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. -(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. -Uh, affirmative? -Uh, affirmative? -(Nod) -(Nod) -Negative. -Negative. -(Shake your head) -(Shake your head) -Very acceptable! -Very acceptable! -(Nod again) -(Nod again) -No, I don't want that. -No, I don't want that. -(Shake your head) -(Shake your head) -If you have to... -If you have to... -(Giggle and nod) -(Giggle and nod) -Go away robot! (PERCENT chance to avoid) -Go away robot! (PERCENT chance to avoid) -(Shake your head rapidly) (PERCENT chance to avoid) -(Shake your head rapidly) (PERCENT chance to avoid) -(A happy SPEAKER looks at you)|Hey there cutie~|Want to try some scarf bondage? -(A happy SPEAKER looks at you)|Hey there cutie~|Want to try some scarf bondage? -(The SPEAKER holds up some scarves)|If you want to try, I've got a few here.|I could give you a RESTRAINT? -(The SPEAKER holds up some scarves)|If you want to try, I've got a few here.|I could give you a RESTRAINT? -(The SPEAKER smiles gently at you as she ties)|I love the silky feeling~|(The SPEAKER tightens all her knots) -(The SPEAKER smiles gently at you as she ties)|I love the silky feeling~|(The SPEAKER tightens all her knots) -(The SPEAKER looks away and nods)|Well... maybe next time. -(The SPEAKER looks away and nods)|Well... maybe next time. -(The SPEAKER shuffles awkwardly)|Oh... well...|Come back if you change your mind~ -(The SPEAKER shuffles awkwardly)|Oh... well...|Come back if you change your mind~ -(The SPEAKER scowls)|Hey, don't back out!|I promise I'll make it comfortable! -(The SPEAKER scowls)|Hey, don't back out!|I promise I'll make it comfortable! -(The SPEAKER frowns)|Too bad, I want to tie someone! -(The SPEAKER frowns)|Too bad, I want to tie someone! -(The SPEAKER drops her scarves)|Aww, really?|I'll go find someone else then... -(The SPEAKER drops her scarves)|Aww, really?|I'll go find someone else then... -(The SPEAKER beams a smile)|Yay, thank you!|Feels nice, right? -(The SPEAKER beams a smile)|Yay, thank you!|Feels nice, right? -(The SPEAKER tosses a scarf around you like a lasso)|Not so fast! You cannot escape the fluff! -(The SPEAKER tosses a scarf around you like a lasso)|Not so fast! You cannot escape the fluff! -Sounds good! -Sounds good! -(Nod quickly) -(Nod quickly) -Not really. -Not really. -(Shake your head) -(Shake your head) -Please do! -Please do! -(Nod and giggle) -(Nod and giggle) -Not right now. -Not right now. -(Shake your head) -(Shake your head) -Well... sure then. -Well... sure then. -(Giggle and moan) -(Giggle and moan) -Hey! Stop! (PERCENT chance to avoid) -Hey! Stop! (PERCENT chance to avoid) -(Shake your head and whine) (PERCENT chance to avoid) -(Shake your head and whine) (PERCENT chance to avoid) -(A messy looking SPEAKER turns to you)|Hmm, curious. Very curious.|Can you help me with an experiment? -(A messy looking SPEAKER turns to you)|Hmm, curious. Very curious.|Can you help me with an experiment? -(The SPEAKER pulls out a flask)|I isolated some slime, but it's inert.|Would you let me spill some on you? -(The SPEAKER pulls out a flask)|I isolated some slime, but it's inert.|Would you let me spill some on you? -(The SPEAKER tips out the entire flask)|Aha! It's growing again! Fascinating.|(Sticky RESTRAINT clings to you) -(The SPEAKER tips out the entire flask)|Aha! It's growing again! Fascinating.|(Sticky RESTRAINT clings to you) -(The SPEAKER tuts disapprovingly)|Not one for chemistry, eh? -(The SPEAKER tuts disapprovingly)|Not one for chemistry, eh? -(The SPEAKER sighs)|So hard to find good help out here... -(The SPEAKER sighs)|So hard to find good help out here... -(The SPEAKER glares at you)|You've got no sense of adventure!|For science! -(The SPEAKER glares at you)|You've got no sense of adventure!|For science! -Ah, but it'll be quick!|(The SPEAKER begins tipping the flask)|See? It's already moving toward you! -Ah, but it'll be quick!|(The SPEAKER begins tipping the flask)|See? It's already moving toward you! -(The SPEAKER tosses the slime on you)|(The slime flops off limply)|Ah. Back to the drawing board. -(The SPEAKER tosses the slime on you)|(The slime flops off limply)|Ah. Back to the drawing board. -(The SPEAKER pours the slime onto you)|That's the spirit girl!|(Sticky RESTRAINT clings to you) -(The SPEAKER pours the slime onto you)|That's the spirit girl!|(Sticky RESTRAINT clings to you) -(The SPEAKER tosses the slime on you)|Ha, look, it's alive!|(Sticky RESTRAINT clings to you) -(The SPEAKER tosses the slime on you)|Ha, look, it's alive!|(Sticky RESTRAINT clings to you) -Sure. -Sure. -(Nod slowly) -(Nod slowly) -Absolutely not. -Absolutely not. -(Shake your head) -(Shake your head) -On me? Sounds fun~ -On me? Sounds fun~ -(Nod again) -(Nod again) -Nope. Not doing that. -Nope. Not doing that. -(Shake your head) -(Shake your head) -Okay, for science... -Okay, for science... -(Giggle and nod) -(Giggle and nod) -Ah! Don't you dare! (PERCENT chance to avoid) -Ah! Don't you dare! (PERCENT chance to avoid) -(Shake your head and whimper) (PERCENT chance to avoid) -(Shake your head and whimper) (PERCENT chance to avoid) -(A SPEAKER whispers to you)|Ever wonder how wolfgirls feel?|Or why they're so obedient? -(A SPEAKER whispers to you)|Ever wonder how wolfgirls feel?|Or why they're so obedient? -(The SPEAKER grins)|I've got a RESTRAINT here~|Wanna give it a try? -(The SPEAKER grins)|I've got a RESTRAINT here~|Wanna give it a try? -(The SPEAKER puts on the RESTRAINT)|Perfect. Better behave now~|(The SPEAKER pats your butt) -(The SPEAKER puts on the RESTRAINT)|Perfect. Better behave now~|(The SPEAKER pats your butt) -(The SPEAKER rolls her eyes)|You've seen wolfgirls, right?|Ah, whatever, go have fun~ -(The SPEAKER rolls her eyes)|You've seen wolfgirls, right?|Ah, whatever, go have fun~ -(The SPEAKER nods glumly)|Not a fan?|Shame, I am~ -(The SPEAKER nods glumly)|Not a fan?|Shame, I am~ -(The SPEAKER grabs you quickly)|Oh, it's very strict~|And great for being trained... -(The SPEAKER grabs you quickly)|Oh, it's very strict~|And great for being trained... -(The SPEAKER looks at you deviously)|You're going to wear this RESTRAINT,|if you want to or not~ -(The SPEAKER looks at you deviously)|You're going to wear this RESTRAINT,|if you want to or not~ -(The SPEAKER sulks)|Have it your way then. -(The SPEAKER sulks)|Have it your way then. -(The SPEAKER adds the RESTRAINT)|(You feel her tighten everything before locking it)|Good girl~ -(The SPEAKER adds the RESTRAINT)|(You feel her tighten everything before locking it)|Good girl~ -(The SPEAKER pushes you to the ground)|I'll make it extra tight for you~|(The RESTRAINT locks tightly onto you) -(The SPEAKER pushes you to the ground)|I'll make it extra tight for you~|(The RESTRAINT locks tightly onto you) -Maybe a little~ -Maybe a little~ -(Nod excitedly) -(Nod excitedly) -Don't know, don't care. -Don't know, don't care. -(Shake your head) -(Shake your head) -Yes! So much! -Yes! So much! -(Nod quickly) -(Nod quickly) -That looks too strict! -That looks too strict! -(Shake your head) -(Shake your head) -I- Well- O-Okay~ -I- Well- O-Okay~ -(Moan and squirm) -(Moan and squirm) -I don't want to get stuck! (PERCENT chance to avoid) -I don't want to get stuck! (PERCENT chance to avoid) -(Shake your head worriedly) (PERCENT chance to avoid) -(Shake your head worriedly) (PERCENT chance to avoid) -(A SPEAKER gracefully gestures to you)|So good to see a friendly face~|Care to see some elven goods? -(A SPEAKER gracefully gestures to you)|So good to see a friendly face~|Care to see some elven goods? -(The SPEAKER holds up a RESTRAINT)|These are some of our strictest.|Want to try? -(The SPEAKER holds up a RESTRAINT)|These are some of our strictest.|Want to try? -(The SPEAKER smiles sweetly)|Such a good girl~|(The RESTRAINT locks with a loud click) -(The SPEAKER smiles sweetly)|Such a good girl~|(The RESTRAINT locks with a loud click) -(The SPEAKER sagely nods)|As you wish~ -(The SPEAKER sagely nods)|As you wish~ -(The SPEAKER frowns briefly)|I understand~ -(The SPEAKER frowns briefly)|I understand~ -(The SPEAKER leans closer)|Then you can test their escapability!|(The SPEAKER dives towards you!) -(The SPEAKER leans closer)|Then you can test their escapability!|(The SPEAKER dives towards you!) -(The SPEAKER shifts her weight back)|I'm afraid I must insist.|(She's gripping a RESTRAINT)|(The SPEAKER dives towards you!) -(The SPEAKER shifts her weight back)|I'm afraid I must insist.|(She's gripping a RESTRAINT)|(The SPEAKER dives towards you!) -(The SPEAKER rolls past harmlessly)|Oh! So fast~ -(The SPEAKER rolls past harmlessly)|Oh! So fast~ -(The SPEAKER snaps the RESTRAINT on)|There, much better.|Now squirm for me cutie~ -(The SPEAKER snaps the RESTRAINT on)|There, much better.|Now squirm for me cutie~ -(The SPEAKER trips you over)|(Before you can move, the RESTRAINT closes firmly)|Strict, isn't it?~ -(The SPEAKER trips you over)|(Before you can move, the RESTRAINT closes firmly)|Strict, isn't it?~ -Of course! -Of course! -(Nod happily) -(Nod happily) -No, thanks. -No, thanks. -(Shake your head) -(Shake your head) -Pretty please~ -Pretty please~ -(Nod eagerly) -(Nod eagerly) -Not really. -Not really. -(Shake your head) -(Shake your head) -. -. -(Moan and giggle) -(Moan and giggle) -Stop! (PERCENT chance to avoid) -Stop! (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(A SPEAKER plays with silvery rope)|Hmm, I need to get better with this.|Can I practice on you? -(A SPEAKER plays with silvery rope)|Hmm, I need to get better with this.|Can I practice on you? -(The SPEAKER grins happily)|Thank you girl~|I'll tie with RESTRAINT then~ -(The SPEAKER grins happily)|Thank you girl~|I'll tie with RESTRAINT then~ -(The SPEAKER binds you tightly)|(The rope is tight, and she's clearly and expert.)|Mmm, not too bad~ -(The SPEAKER binds you tightly)|(The rope is tight, and she's clearly and expert.)|Mmm, not too bad~ -(The SPEAKER pouts indignantly)|Why say yes then?!|(The SPEAKER walks off grumbling) -(The SPEAKER pouts indignantly)|Why say yes then?!|(The SPEAKER walks off grumbling) -(The SPEAKER sighs)|Very well then~ -(The SPEAKER sighs)|Very well then~ -(The SPEAKER pouts indignantly)|Oh no, you don't get out that easy.|You said you'd help! -(The SPEAKER pouts indignantly)|Oh no, you don't get out that easy.|You said you'd help! -(The SPEAKER smirks)|Ooh, a chance to practice against resistance~|I can't pass that up! -(The SPEAKER smirks)|Ooh, a chance to practice against resistance~|I can't pass that up! -(The SPEAKER can't keep the knots tight)|(Eventually, she gives up)|S-Stupid human... -(The SPEAKER can't keep the knots tight)|(Eventually, she gives up)|S-Stupid human... -(The SPEAKER strictly ties you up)|(You can feel she's done this many times)|(She smirks at you as she departs) -(The SPEAKER strictly ties you up)|(You can feel she's done this many times)|(She smirks at you as she departs) -(The SPEAKER strictly ties you up)|(There's no slack anywhere!)|(She makes a face at you as she leaves) -(The SPEAKER strictly ties you up)|(There's no slack anywhere!)|(She makes a face at you as she leaves) -Any time~ -Any time~ -(Nod excitedly) -(Nod excitedly) -I'd rather you didn't. -I'd rather you didn't. -(Shake your head) -(Shake your head) -Sounds great! -Sounds great! -(Nod again) -(Nod again) -Actually, I don't want that. -Actually, I don't want that. -(Shake your head) -(Shake your head) -I'll play along then~ -I'll play along then~ -(Moan and squirm) -(Moan and squirm) -(Struggle against her) (PERCENT chance to avoid) -(Struggle against her) (PERCENT chance to avoid) -(Struggle against her) (PERCENT chance to avoid) -(Struggle against her) (PERCENT chance to avoid) -(The SPEAKER quickly motions to you)|Hey! Over here!| I got something to show you! -(The SPEAKER quickly motions to you)|Hey! Over here!| I got something to show you! -(The SPEAKER giggles)|You'll be wearing this~|(A RESTRAINT is in her hands) -(The SPEAKER giggles)|You'll be wearing this~|(A RESTRAINT is in her hands) -(The SPEAKER looks surprised)|Oh, uh, sure!|(They quickly add the RESTRAINT) -(The SPEAKER looks surprised)|Oh, uh, sure!|(They quickly add the RESTRAINT) -(The SPEAKER grins sneakily)|I thought you might say that~|But- ahh!|(They drop the item and you slip away) -(The SPEAKER grins sneakily)|I thought you might say that~|But- ahh!|(They drop the item and you slip away) -(The SPEAKER looks angry)|Hey! HEY! I'm talking to-|Ah, forget it. -(The SPEAKER looks angry)|Hey! HEY! I'm talking to-|Ah, forget it. -(The SPEAKER grins sneakily)|I thought you might say that~|But it wasn't a choice... -(The SPEAKER grins sneakily)|I thought you might say that~|But it wasn't a choice... -(The SPEAKER follows you)|Not so fast there~|(She blocks your path) -(The SPEAKER follows you)|Not so fast there~|(She blocks your path) -(The SPEAKER fumbles with the RESTRAINT)|C-Come on, open-|(You quickly walk away) -(The SPEAKER fumbles with the RESTRAINT)|C-Come on, open-|(You quickly walk away) -(The SPEAKER adds the RESTRAINT)|Good luck with that one~|(She sounds like she's gloating...) -(The SPEAKER adds the RESTRAINT)|Good luck with that one~|(She sounds like she's gloating...) -(The SPEAKER roughly forces you down)|(Pushing your head down, the RESTRAINT slides on)|(The SPEAKER tugs your hair, then walks away) -(The SPEAKER roughly forces you down)|(Pushing your head down, the RESTRAINT slides on)|(The SPEAKER tugs your hair, then walks away) -(Walk over, curiously) -(Walk over, curiously) -(Walk over, curiously) -(Walk over, curiously) -(Don't approach). -(Don't approach). -(Don't approach) -(Don't approach) -Sure! -Sure! -(Nod eagerly) -(Nod eagerly) -W-What? No way! -W-What? No way! -(Shake your head) -(Shake your head) -(Let her add the restraint) -(Let her add the restraint) -(Moan and nod) -(Moan and nod) -Stop! (PERCENT chance to avoid) -Stop! (PERCENT chance to avoid) -(Shake your head and groan) (PERCENT chance to avoid) -(Shake your head and groan) (PERCENT chance to avoid) -(The SPEAKER walks over)|You'd make a cute catgirl~|Want help becoming one? -(The SPEAKER walks over)|You'd make a cute catgirl~|Want help becoming one? -(The SPEAKER grins)|Here, I've got this RESTRAINT.|That'll help! -(The SPEAKER grins)|Here, I've got this RESTRAINT.|That'll help! -(The SPEAKER gleefully comes closer)|(The RESTRAINT fits snugly)|So adorable! -(The SPEAKER gleefully comes closer)|(The RESTRAINT fits snugly)|So adorable! -(The SPEAKER nods disappointed)|Fair enough~ -(The SPEAKER nods disappointed)|Fair enough~ -(The SPEAKER sighs)|Maybe another time~ -(The SPEAKER sighs)|Maybe another time~ -(The SPEAKER titters)|It's going on, kitty~ -(The SPEAKER titters)|It's going on, kitty~ -(The SPEAKER giggles)|Let's see if you can get away then~|(You see a RESTRAINT in her hand) -(The SPEAKER giggles)|Let's see if you can get away then~|(You see a RESTRAINT in her hand) -(The SPEAKER whimpers and drops it)|Owwww!|I hit my knee! -(The SPEAKER whimpers and drops it)|Owwww!|I hit my knee! -(The SPEAKER wiggles happily)|Oh, you're so cute!|Enjoy it~ -(The SPEAKER wiggles happily)|Oh, you're so cute!|Enjoy it~ -(The SPEAKER traps you)|(You feel the RESTRAINT being forced on)|Meow~ -(The SPEAKER traps you)|(You feel the RESTRAINT being forced on)|Meow~ -Sure! -Sure! -(Nod excitedly) -(Nod excitedly) -No, not today. -No, not today. -(Shake your head) -(Shake your head) -Yay! -Yay! -(Nod quickly) -(Nod quickly) -Not like that! -Not like that! -(Shake your head) -(Shake your head) -Y-Yes miss~ -Y-Yes miss~ -(Moan and squirm) -(Moan and squirm) -(Duck out the way) (PERCENT chance to avoid) -(Duck out the way) (PERCENT chance to avoid) -(Duck out the way) (PERCENT chance to avoid) -(Duck out the way) (PERCENT chance to avoid) -(A SPEAKER winks at you)|You look like a girl who likes feeling|like a prisoner, am I right? -(A SPEAKER winks at you)|You look like a girl who likes feeling|like a prisoner, am I right? -(The SPEAKER nods happily)|I knew it! Well, it's your lucky day.|I've got some RESTRAINT for you~ -(The SPEAKER nods happily)|I knew it! Well, it's your lucky day.|I've got some RESTRAINT for you~ -(The SPEAKER spins you around)|(You hear the cold metal click shut)|Nice and submissive~ -(The SPEAKER spins you around)|(You hear the cold metal click shut)|Nice and submissive~ -(The SPEAKER shrugs)|It's not for everyone, I guess~ -(The SPEAKER shrugs)|It's not for everyone, I guess~ -(The SPEAKER frowns)|Really?|I was so sure... -(The SPEAKER frowns)|Really?|I was so sure... -(The SPEAKER grins maliciously)|I like seeing prisoners though~|And you're right here... -(The SPEAKER grins maliciously)|I like seeing prisoners though~|And you're right here... -(The SPEAKER giggles)|I'm gonna make you one anyway~|(You see a RESTRAINT in her hand) -(The SPEAKER giggles)|I'm gonna make you one anyway~|(You see a RESTRAINT in her hand) -(The SPEAKER gulps)|M-Maybe I won't then! -(The SPEAKER gulps)|M-Maybe I won't then! -(The SPEAKER adds the RESTRAINT)|You're blushing dear~|She doth protest too much? -(The SPEAKER adds the RESTRAINT)|You're blushing dear~|She doth protest too much? -(The SPEAKER giggles as she catches you and slaps on the cuffs)|No so fast, dear~ -(The SPEAKER giggles as she catches you and slaps on the cuffs)|No so fast, dear~ -Maybe a bit~ -Maybe a bit~ -(Nod eagerly) -(Nod eagerly) -Not at all. -Not at all. -(Shake your head) -(Shake your head) -(Wiggle excitedly) -(Wiggle excitedly) -(Wiggle excitedly) -(Wiggle excitedly) -Not like that. -Not like that. -(Shake your head) -(Shake your head) -O-Okay... -O-Okay... -(Moan and shiver) -(Moan and shiver) -Don't even try. (PERCENT chance to avoid) -Don't even try. (PERCENT chance to avoid) -(Shake your head and groan) (PERCENT chance to avoid) -(Shake your head and groan) (PERCENT chance to avoid) -(A SPEAKER is looking at something)|So comfy... but how?|Hey, you! Come see this! -(A SPEAKER is looking at something)|So comfy... but how?|Hey, you! Come see this! -(The SPEAKER holds up a RESTRAINT)|It's so soft, but so strict~|Want to give it a try? -(The SPEAKER holds up a RESTRAINT)|It's so soft, but so strict~|Want to give it a try? -(The SPEAKER quickly fastens it on)|(A wave of comfort passes over you)|(The SPEAKER looks on enviously) -(The SPEAKER quickly fastens it on)|(A wave of comfort passes over you)|(The SPEAKER looks on enviously) -(The SPEAKER shrugs)|Eh, alright then. -(The SPEAKER shrugs)|Eh, alright then. -(The SPEAKER shrugs)|Up to you. -(The SPEAKER shrugs)|Up to you. -(The SPEAKER frowns)|But it's so comfy!|Here, look, I'll show you... -(The SPEAKER frowns)|But it's so comfy!|Here, look, I'll show you... -(The SPEAKER approaches)|Hey, see this RESTRAINT?|I'm going to put it on you~ -(The SPEAKER approaches)|Hey, see this RESTRAINT?|I'm going to put it on you~ -(The SPEAKER looks startled)|Oh! Uh, I guess you're right... -(The SPEAKER looks startled)|Oh! Uh, I guess you're right... -(The RESTRAINT is buckled firmly in place)|See? Good, huh?|(You sink into the comforting feeling) -(The RESTRAINT is buckled firmly in place)|See? Good, huh?|(You sink into the comforting feeling) -(The SPEAKER ignores you)|(The RESTRAINT is buckled firmly in place)|(A wave of comfort passes over you) -(The SPEAKER ignores you)|(The RESTRAINT is buckled firmly in place)|(A wave of comfort passes over you) -(Approach) -(Approach) -(Approach) -(Approach) -(Keep your distance) -(Keep your distance) -(Keep your distance) -(Keep your distance) -Yes please! -Yes please! -(Nod happily) -(Nod happily) -Nope. -Nope. -(Shake your head) -(Shake your head) -It does look comfortable~ -It does look comfortable~ -(Squirm and bow your head) -(Squirm and bow your head) -It looks too strict! (PERCENT chance to avoid) -It looks too strict! (PERCENT chance to avoid) -(Shake your head rapidly) (PERCENT chance to avoid) -(Shake your head rapidly) (PERCENT chance to avoid) -(The SPEAKER brushes past hurriedly)|Careful girl!|Else I'll lock you away~ -(The SPEAKER brushes past hurriedly)|Careful girl!|Else I'll lock you away~ -(The SPEAKER looks at you intrigued)|Aren't you something...|How about wearing this RESTRAINT? -(The SPEAKER looks at you intrigued)|Aren't you something...|How about wearing this RESTRAINT? -(The SPEAKER grins and locks it on)|Maybe I should bump into you more~ -(The SPEAKER grins and locks it on)|Maybe I should bump into you more~ -(The SPEAKER rolls her eyes)|Run along then girl~ -(The SPEAKER rolls her eyes)|Run along then girl~ -(The SPEAKER nods)|Didn't think so~|Oh, and, uh, sorry for the bump. -(The SPEAKER nods)|Didn't think so~|Oh, and, uh, sorry for the bump. -(The SPEAKER shakes her head)|You don't get off that lightly.|These are going on. -(The SPEAKER shakes her head)|You don't get off that lightly.|These are going on. -(The SPEAKER frowns)|I think I should.|You'll just bother someone else.|(She holds up a RESTRAINT) -(The SPEAKER frowns)|I think I should.|You'll just bother someone else.|(She holds up a RESTRAINT) -(The SPEAKER sighs)|I'll let you off then.|Oh, and, uh, sorry for the bump. -(The SPEAKER sighs)|I'll let you off then.|Oh, and, uh, sorry for the bump. -(The SPEAKER adds the RESTRAINT)|(As she's locking it, she giggles)|You're really cute actually~ -(The SPEAKER adds the RESTRAINT)|(As she's locking it, she giggles)|You're really cute actually~ -(The SPEAKER stumbles and grimaces)|Ugh! Fine, you can go then.|D-Didn't want to see you tied anyway... -(The SPEAKER stumbles and grimaces)|Ugh! Fine, you can go then.|D-Didn't want to see you tied anyway... -That doesn't sound bad... -That doesn't sound bad... -(Giggle into your gag) -(Giggle into your gag) -That won't be necessary. -That won't be necessary. -(Shake your head) -(Shake your head) -I'd love to! -I'd love to! -(Nod quickly) -(Nod quickly) -Not right now. -Not right now. -(Shake your head) -(Shake your head) -M-Maybe you should then~ -M-Maybe you should then~ -(Giggle and moan) -(Giggle and moan) -You ran into me! (PERCENT chance to avoid) -You ran into me! (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(A SPEAKER gives you a small curtsy)|Good day.|Care to try part of our uniform? -(A SPEAKER gives you a small curtsy)|Good day.|Care to try part of our uniform? -(The SPEAKER looks content)|We can offer you this RESTRAINT.|It's a snug fit... -(The SPEAKER looks content)|We can offer you this RESTRAINT.|It's a snug fit... -(The SPEAKER buckles it strictly)|All maids wear this at sometime.|You'd fit right in! -(The SPEAKER buckles it strictly)|All maids wear this at sometime.|You'd fit right in! -(The SPEAKER frowns for a second)|Ah, I see.|As you were then. -(The SPEAKER frowns for a second)|Ah, I see.|As you were then. -(The SPEAKER nods)|We hope to see you again nonetheless. -(The SPEAKER nods)|We hope to see you again nonetheless. -(The SPEAKER glares)|We urge you to reconsider. -(The SPEAKER glares)|We urge you to reconsider. -(The SPEAKER has a twinkle in her eye)|We will offer you this RESTRAINT.|You should accept. -(The SPEAKER has a twinkle in her eye)|We will offer you this RESTRAINT.|You should accept. -(The SPEAKER pulls an odd smile)|Very well. -(The SPEAKER pulls an odd smile)|Very well. -(The SPEAKER smugly nods)|(With surprising speed, the RESTRAINT locks in place)|Excellent, a good fit. -(The SPEAKER smugly nods)|(With surprising speed, the RESTRAINT locks in place)|Excellent, a good fit. -(The SPEAKER covers your hand with her mouth)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly) -(The SPEAKER covers your hand with her mouth)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly) -Yes please! -Yes please! -(Nod eagerly) -(Nod eagerly) -No, thank you. -No, thank you. -(Shake your head) -(Shake your head) -I accept~ -I accept~ -(Nod again) -(Nod again) -No, thanks. -No, thanks. -(Shake your head) -(Shake your head) -I-I accept... -I-I accept... -(Moan and nod slowly) -(Moan and nod slowly) -No way! (PERCENT chance to avoid) -No way! (PERCENT chance to avoid) -(Shake your head and whimper) (PERCENT chance to avoid) -(Shake your head and whimper) (PERCENT chance to avoid) -(The SPEAKER looks at you inquisitively)|(Wordlessly, they motion at your body)|(They seem to be asking about restraints) -(The SPEAKER looks at you inquisitively)|(Wordlessly, they motion at your body)|(They seem to be asking about restraints) -(The SPEAKER nods understandingly)|(RESTRAINT appears in their hand)|(They tilt their head at you) -(The SPEAKER nods understandingly)|(RESTRAINT appears in their hand)|(They tilt their head at you) -(The SPEAKER spins around you)|(You feel the oddly cold restraint lock in place)|(The SPEAKER nods and moves away) -(The SPEAKER spins around you)|(You feel the oddly cold restraint lock in place)|(The SPEAKER nods and moves away) -(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) -(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) -(The SPEAKER leaves you alone) -(The SPEAKER leaves you alone) -(The SPEAKER seems to frown)|(RESTRAINT appears in their hand)|(They rapidly approach) -(The SPEAKER seems to frown)|(RESTRAINT appears in their hand)|(They rapidly approach) -(The SPEAKER tilts their head)|(RESTRAINT appears in their hand)|(They come closer) -(The SPEAKER tilts their head)|(RESTRAINT appears in their hand)|(They come closer) -(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) -(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) -(The SPEAKER holds you in place)|(You hear the oddly cold material locking)|(They nod at you) -(The SPEAKER holds you in place)|(You hear the oddly cold material locking)|(They nod at you) -(The SPEAKER firmly grabs you)|(The RESTRAINT locks onto your body tightly)|(The oddly cold material makes you shiver) -(The SPEAKER firmly grabs you)|(The RESTRAINT locks onto your body tightly)|(The oddly cold material makes you shiver) -Y-Yes? -Y-Yes? -(Nod back) -(Nod back) -No thank you. -No thank you. -(Shake your head) -(Shake your head) -(Smile and prepare yourself) -(Smile and prepare yourself) -(Nod and prepare yourself) -(Nod and prepare yourself) -No, not that. -No, not that. -(Shake your head) -(Shake your head) -W-Whoa! S-Sure... -W-Whoa! S-Sure... -(Moan and nod) -(Moan and nod) -Stop! (PERCENT chance to avoid) -Stop! (PERCENT chance to avoid) -(Shake your head and whine) (PERCENT chance to avoid) -(Shake your head and whine) (PERCENT chance to avoid) -(A SPEAKER giggles and calls to you)|Hey there~|Fancy seeing some nature?~ -(A SPEAKER giggles and calls to you)|Hey there~|Fancy seeing some nature?~ -(The SPEAKER motions with her hands)|(Vines rise from the floor and twirl)|These will bind you nicely... -(The SPEAKER motions with her hands)|(Vines rise from the floor and twirl)|These will bind you nicely... -(The SPEAKER grins and motions again)|(The plants wrap around you quickly)|(You wriggle against the RESTRAINT) -(The SPEAKER grins and motions again)|(The plants wrap around you quickly)|(You wriggle against the RESTRAINT) -(The SPEAKER pouts)|Aww... -(The SPEAKER pouts)|Aww... -(The SPEAKER frowns)|Not even a little? -(The SPEAKER frowns)|Not even a little? -(The SPEAKER smirks)|That wasn't a question~ -(The SPEAKER smirks)|That wasn't a question~ -(The SPEAKER giggles again)|(Vines begin to move around your feet)|Hold still dear~ -(The SPEAKER giggles again)|(Vines begin to move around your feet)|Hold still dear~ -(The SPEAKER sighs and nods)|(The vines retreat from you)|Fiiine, you can go~ -(The SPEAKER sighs and nods)|(The vines retreat from you)|Fiiine, you can go~ -(The vines move much faster)|(You feel the RESTRAINT as you squirm)|A gift, from me~ -(The vines move much faster)|(You feel the RESTRAINT as you squirm)|A gift, from me~ -(The SPEAKER giggles loudly)|(The vines catch up and pin you down)|(When they let go, you're left with a RESTRAINT) -(The SPEAKER giggles loudly)|(The vines catch up and pin you down)|(When they let go, you're left with a RESTRAINT) -Always! -Always! -(Nod eagerly) -(Nod eagerly) -Not right now. -Not right now. -(Shake your head) -(Shake your head) -That sounds exciting! -That sounds exciting! -(Nod happily) -(Nod happily) -Wait, not like this! -Wait, not like this! -(Shake your head) -(Shake your head) -W-Well- o-okay... -W-Well- o-okay... -(Moan and squirm) -(Moan and squirm) -Don't! (PERCENT chance to avoid) -Don't! (PERCENT chance to avoid) -(Shake your head) (PERCENT chance to avoid) -(Shake your head) (PERCENT chance to avoid) -(A SPEAKER approaches)|Nothing quite beats a strong metal|chain, right? -(A SPEAKER approaches)|Nothing quite beats a strong metal|chain, right? -(The SPEAKER nods happily)|Exactly!|Want one for yourself? -(The SPEAKER nods happily)|Exactly!|Want one for yourself? -(The SPEAKER wraps a long chain around you)|This should do the trick~|(RESTRAINT settles in place) -(The SPEAKER wraps a long chain around you)|This should do the trick~|(RESTRAINT settles in place) -(The SPEAKER sighs)|Ah well. -(The SPEAKER sighs)|Ah well. -(The SPEAKER frowns sadly)|But they make the best noise! -(The SPEAKER frowns sadly)|But they make the best noise! -(The SPEAKER rolls her eyes)|Tough luck then~|You're getting one! -(The SPEAKER rolls her eyes)|Tough luck then~|You're getting one! -(The SPEAKER grins)|See how you feel when|you're wearing one! -(The SPEAKER grins)|See how you feel when|you're wearing one! -(The SPEAKER sighs)|Maybe another time then. -(The SPEAKER sighs)|Maybe another time then. -(The SPEAKER wraps a long chain around you)|(RESTRAINT hugs your body closely)|(You shiver as the cold metal touches you) -(The SPEAKER wraps a long chain around you)|(RESTRAINT hugs your body closely)|(You shiver as the cold metal touches you) -(The SPEAKER grins as she binds your body)|(RESTRAINT digs into you a little)|Enjoy, cutie~ -(The SPEAKER grins as she binds your body)|(RESTRAINT digs into you a little)|Enjoy, cutie~ -I love chains! -I love chains! -(Nod happily) -(Nod happily) -Plenty beats it. -Plenty beats it. -(Shake your head) -(Shake your head) -Absolutely~ -Absolutely~ -(Nod again) -(Nod again) -Not really. -Not really. -(Shake your head) -(Shake your head) -I-If I have to... -I-If I have to... -(Moan and squirm) -(Moan and squirm) -Ah! Cold! (PERCENT chance to avoid) -Ah! Cold! (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(The SPEAKER nervously walks up to you)|Excuse me miss...|Are you a fan of latex by chance? -(The SPEAKER nervously walks up to you)|Excuse me miss...|Are you a fan of latex by chance? -(The SPEAKER blushes deeply)|Then would you like to try on this RESTRAINT? -(The SPEAKER blushes deeply)|Then would you like to try on this RESTRAINT? -(The SPEAKER smiles)|You look so good in that! -(The SPEAKER smiles)|You look so good in that! -(The SPEAKER frowns)|Aww... -(The SPEAKER frowns)|Aww... -(The SPEAKER blushes)|Okay... sorry I asked. -(The SPEAKER blushes)|Okay... sorry I asked. -(The SPEAKER grins and reaches for a RESTRAINT)|Well, too bad-- -(The SPEAKER grins and reaches for a RESTRAINT)|Well, too bad-- -(The SPEAKER grins)|I wasn't offering you a choice...|I was asking if you would LIKE it, hehe~ -(The SPEAKER grins)|I wasn't offering you a choice...|I was asking if you would LIKE it, hehe~ -(The SPEAKER frowns)|...You're fast! -(The SPEAKER frowns)|...You're fast! -(The SPEAKER smiles)|That's right~ -(The SPEAKER smiles)|That's right~ -(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight! -(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight! -Why of course! -Why of course! -(Nod happily) -(Nod happily) -Not really. -Not really. -(Shake your head) -(Shake your head) -That sounds fun! -That sounds fun! -(Nod again) -(Nod again) -No, I don't want that! -No, I don't want that! -(Shake your head) -(Shake your head) -Okay, fine... -Okay, fine... -(Moan and giggle) -(Moan and giggle) -Wait, what? (PERCENT chance to avoid) -Wait, what? (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(The SPEAKER nervously walks up to you)|Excuse me miss...|Can you help me out? -(The SPEAKER nervously walks up to you)|Excuse me miss...|Can you help me out? -(The SPEAKER blushes deeply)|I managed to unlock my RESTRAINT,|but my mistress expects me to wear it!|Do you mind wearing it instead? -(The SPEAKER blushes deeply)|I managed to unlock my RESTRAINT,|but my mistress expects me to wear it!|Do you mind wearing it instead? -(The SPEAKER smiles)|Thank you so much, miss! -(The SPEAKER smiles)|Thank you so much, miss! -(The SPEAKER frowns)|I'm going to get in trouble... -(The SPEAKER frowns)|I'm going to get in trouble... -(The SPEAKER blushes)|Oh... okay. -(The SPEAKER blushes)|Oh... okay. -(The SPEAKER frowns angrily)|Look, I know you're in trouble around here.|Just do me a favor. Please.|I need you to wear this RESTRAINT. -(The SPEAKER frowns angrily)|Look, I know you're in trouble around here.|Just do me a favor. Please.|I need you to wear this RESTRAINT. -(The SPEAKER pleads with you)|My mistress is a magician!|She put a spell on it that senses if it's being worn.|Please, you have to hurry! -(The SPEAKER pleads with you)|My mistress is a magician!|She put a spell on it that senses if it's being worn.|Please, you have to hurry! -(The SPEAKER sighs and wears it herself)|(The lock starts glowing brightly...) -(The SPEAKER sighs and wears it herself)|(The lock starts glowing brightly...) -(The SPEAKER looks relieved)|Thank you so much miss!|I won't forget you! -(The SPEAKER looks relieved)|Thank you so much miss!|I won't forget you! -(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Hmmph! Serves you right!| -(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Hmmph! Serves you right!| -(The lock on the RESTRAINT starts glowing...) -(The lock on the RESTRAINT starts glowing...) -I would love to help! -I would love to help! -(Nod eagerly) -(Nod eagerly) -Go find someone else. -Go find someone else. -(Shake your head) -(Shake your head) -That sounds like a tempting offer. -That sounds like a tempting offer. -(Nod again, excited) -(Nod again, excited) -...What? Why would I need to wear it? -...What? Why would I need to wear it? -(Shake your head, puzzled) -(Shake your head, puzzled) -Fine. I'll do it because you asked. -Fine. I'll do it because you asked. -(Moan and nod slowly) -(Moan and nod slowly) -I won't help you. Wear it yourself. (PERCENT chance to avoid) -I won't help you. Wear it yourself. (PERCENT chance to avoid) -(Shake your head) (PERCENT chance to avoid) -(Shake your head) (PERCENT chance to avoid) -(Look at your belt...) -(Look at your belt...) -(The SPEAKER walks up to you)|We don't get a lot of visitors.|I take it that you enjoy bondage? -(The SPEAKER walks up to you)|We don't get a lot of visitors.|I take it that you enjoy bondage? -(The SPEAKER tilts her head)|Well, I have a RESTRAINT lying around,|and I figured you'd enjoy it. -(The SPEAKER tilts her head)|Well, I have a RESTRAINT lying around,|and I figured you'd enjoy it. -(The SPEAKER smiles)|I'm glad you like it! -(The SPEAKER smiles)|I'm glad you like it! -(The SPEAKER frowns)|I guess I'll have to find someone else to wear it. -(The SPEAKER frowns)|I guess I'll have to find someone else to wear it. -(The SPEAKER looks disappointed)|Oh well. -(The SPEAKER looks disappointed)|Oh well. -(The SPEAKER grins and reaches toward you!)|Well, I think it'd look great on you! -(The SPEAKER grins and reaches toward you!)|Well, I think it'd look great on you! -(The SPEAKER grins)|You don't have a choice, dear~ -(The SPEAKER grins)|You don't have a choice, dear~ -(The SPEAKER frowns)|Darn it! Missed my chance. -(The SPEAKER frowns)|Darn it! Missed my chance. -(The SPEAKER smiles)|Good, good~ -(The SPEAKER smiles)|Good, good~ -(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight! -(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight! -Why of course! -Why of course! -(Nod happily) -(Nod happily) -Not really. -Not really. -(Shake your head) -(Shake your head) -That sounds fun! -That sounds fun! -(Nod again) -(Nod again) -No, I don't want that! -No, I don't want that! -(Shake your head) -(Shake your head) -Okay, fine... -Okay, fine... -(Moan and giggle) -(Moan and giggle) -Wait, what? (PERCENT chance to avoid) -Wait, what? (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(The SPEAKER grins as she sees you)|Hey there sweetie~|I think you'd look good in some ropes! -(The SPEAKER grins as she sees you)|Hey there sweetie~|I think you'd look good in some ropes! -(The SPEAKER looks at your bound body)|I've got some more ropes for you, babe! -(The SPEAKER looks at your bound body)|I've got some more ropes for you, babe! -(The SPEAKER smiles)|Okay, hold still while I get you rigged up~ -(The SPEAKER smiles)|Okay, hold still while I get you rigged up~ -(The SPEAKER slaps your butt as she ties the last knot)|All trussed up~ -(The SPEAKER slaps your butt as she ties the last knot)|All trussed up~ -(The SPEAKER looks disappointed and packs her rope away) -(The SPEAKER looks disappointed and packs her rope away) -(The SPEAKER frowns)|Aw. What a missed opportunity! -(The SPEAKER frowns)|Aw. What a missed opportunity! -(The SPEAKER grins and reaches for her satchel)|Well, too bad-- -(The SPEAKER grins and reaches for her satchel)|Well, too bad-- -(The SPEAKER grins)|But I've already brought so much rope with me~ -(The SPEAKER grins)|But I've already brought so much rope with me~ -(The SPEAKER frowns)|Suit yourself. -(The SPEAKER frowns)|Suit yourself. -(The SPEAKER smiles)|Good girl~ -(The SPEAKER smiles)|Good girl~ -(The SPEAKER takes you down and trusses you up tightly)|That'll teach you~ -(The SPEAKER takes you down and trusses you up tightly)|That'll teach you~ -I think so too! -I think so too! -(Nod excitedly) -(Nod excitedly) -I don't think so. -I don't think so. -(Shake your head) -(Shake your head) -Yes miss! -Yes miss! -(Wiggle in place happily) -(Wiggle in place happily) -Actually, I'm having second thoughts... -Actually, I'm having second thoughts... -(Shake your head nervously) -(Shake your head nervously) -Fine. You win. -Fine. You win. -(Moan and giggle) -(Moan and giggle) -Go away! (PERCENT chance to avoid) -Go away! (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(Shake your head and moan) (PERCENT chance to avoid) -(The SPEAKER perks her ears as she sees you)|You've got a nice body.|I think it'll do better with some training! -(The SPEAKER perks her ears as she sees you)|You've got a nice body.|I think it'll do better with some training! -(The SPEAKER grins and hands you a paper)|Nevermere Training is always looking for new recruits!|I'll just have you sign here... -(The SPEAKER grins and hands you a paper)|Nevermere Training is always looking for new recruits!|I'll just have you sign here... -(The SPEAKER gets you suited up)|There you go! Now go be a good girl! -(The SPEAKER gets you suited up)|There you go! Now go be a good girl! -(The SPEAKER scoffs)|That's what they all say. -(The SPEAKER scoffs)|That's what they all say. -(The SPEAKER frowns)|What a shame. -(The SPEAKER frowns)|What a shame. -(The SPEAKER grins and reaches for her baton)|No? Well, I heard you have some debts to pay~ -(The SPEAKER grins and reaches for her baton)|No? Well, I heard you have some debts to pay~ -(The SPEAKER grins)|I promise you it's a good deal~ -(The SPEAKER grins)|I promise you it's a good deal~ -(The SPEAKER frowns)|Fine. I'll look for other candidates. -(The SPEAKER frowns)|Fine. I'll look for other candidates. -(The SPEAKER smiles)|That's right. Your name, please? -(The SPEAKER smiles)|That's right. Your name, please? -(The SPEAKER zaps you and places you in restrictive gear)|Hmph. Unruly girls need training! -(The SPEAKER zaps you and places you in restrictive gear)|Hmph. Unruly girls need training! -This sounds like an interesting opportunity. -This sounds like an interesting opportunity. -(Nod excitedly) -(Nod excitedly) -No thanks, I know what that entails... -No thanks, I know what that entails... -(Shake your head) -(Shake your head) -I'll sign it! -I'll sign it! -(Accept the contract) -(Accept the contract) -A contract? No way. -A contract? No way. -(Refuse the contract) -(Refuse the contract) -Fine. I'll sign it... -Fine. I'll sign it... -(Moan and nod) -(Moan and nod) -Never! (PERCENT chance to avoid) -Never! (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(The SPEAKER tilts her head and shrugs)|We are always prepared... -(The SPEAKER tilts her head and shrugs)|We are always prepared... -(The SPEAKER nods)|Fair enough. -(The SPEAKER nods)|Fair enough. -(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(The SPEAKER frowns)|You won't know what hit you. -(The SPEAKER frowns)|You won't know what hit you. -(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -This sounds like an interesting opportunity. -This sounds like an interesting opportunity. -(Nod excitedly) -(Nod excitedly) -No thanks, I know what that entails... -No thanks, I know what that entails... -(Shake your head) -(Shake your head) -Gladly! -Gladly! -(Accept the contract) -(Accept the contract) -W-where did you get that uniform? (Refuse) -W-where did you get that uniform? (Refuse) -(Refuse the contract) -(Refuse the contract) -Fine. I'll sign it... -Fine. I'll sign it... -(Moan and nod) -(Moan and nod) -Never! (PERCENT chance to avoid) -Never! (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(The SPEAKER tilts her head and shrugs)|We are always prepared... -(The SPEAKER tilts her head and shrugs)|We are always prepared... -(The SPEAKER nods)|Fair enough. -(The SPEAKER nods)|Fair enough. -(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(The SPEAKER frowns)|You won't know what hit you. -(The SPEAKER frowns)|You won't know what hit you. -(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -This sounds like an interesting opportunity. -This sounds like an interesting opportunity. -(Nod excitedly) -(Nod excitedly) -No thanks, I know what that entails... -No thanks, I know what that entails... -(Shake your head) -(Shake your head) -Gladly! -Gladly! -(Accept the contract) -(Accept the contract) -W-where did you get that uniform? (Refuse) -W-where did you get that uniform? (Refuse) -(Refuse the contract) -(Refuse the contract) -Fine. I'll sign it... -Fine. I'll sign it... -(Moan and nod) -(Moan and nod) -Never! (PERCENT chance to avoid) -Never! (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER perks her ears as she sees you)|Glory to the blessed kitty!|Are you prepared to join us? -(The SPEAKER perks her ears as she sees you)|Glory to the blessed kitty!|Are you prepared to join us? -(The SPEAKER nods happily)|Fantastic! You just need to agree to be nice to cats.|And also we own you now. -(The SPEAKER nods happily)|Fantastic! You just need to agree to be nice to cats.|And also we own you now. -(The SPEAKER jumps happily)|Wonderful! Here's your collar! -(The SPEAKER jumps happily)|Wonderful! Here's your collar! -(The SPEAKER whimpers and looks at you)|How mean! -(The SPEAKER whimpers and looks at you)|How mean! -(The SPEAKER's ears flop)|Aww... we thought you were cute. -(The SPEAKER's ears flop)|Aww... we thought you were cute. -(The SPEAKER frowns)|Oh? Well, I guess I'll tell the others~ -(The SPEAKER frowns)|Oh? Well, I guess I'll tell the others~ -(The SPEAKER grins slyly)|You wouldn't hurt the kitties, would you? -(The SPEAKER grins slyly)|You wouldn't hurt the kitties, would you? -(The SPEAKER frowns)|Then we'll have to make sure you don't come to harm anyone! -(The SPEAKER frowns)|Then we'll have to make sure you don't come to harm anyone! -(The SPEAKER smiles proudly)|I knew you would pull through! -(The SPEAKER smiles proudly)|I knew you would pull through! -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -Yes! I love the blessed kity! -Yes! I love the blessed kity! -(Nod excitedly) -(Nod excitedly) -No, you guys are a bunch of weirdos. -No, you guys are a bunch of weirdos. -(Shake your head) -(Shake your head) -Yes! I will be nice to the kitties! -Yes! I will be nice to the kitties! -(Join them) -(Join them) -Wait, I didn't agree to that! (Refuse) -Wait, I didn't agree to that! (Refuse) -(Refuse) -(Refuse) -Okay fine... I won't hurt the kitties. (Join them) -Okay fine... I won't hurt the kitties. (Join them) -(Moan and nod) -(Moan and nod) -Never! (PERCENT chance to avoid) -Never! (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER does a curtsy)|Why hello there!|You have a wonderful bod-er, book!|Would you like to help me? -(The SPEAKER does a curtsy)|Why hello there!|You have a wonderful bod-er, book!|Would you like to help me? -(The SPEAKER smiles briefly)|You have an opportunity to model for me!|I need someone to wear all of my wonderful inventions! -(The SPEAKER smiles briefly)|You have an opportunity to model for me!|I need someone to wear all of my wonderful inventions! -(The SPEAKER laces you up in the tight fabric...)|(You hear the click of a few locks going on...)|Oh my goodness... So pretty!|You'll make a fine assistant! -(The SPEAKER laces you up in the tight fabric...)|(You hear the click of a few locks going on...)|Oh my goodness... So pretty!|You'll make a fine assistant! -(The SPEAKER frowns)|Aw... -(The SPEAKER frowns)|Aw... -(The SPEAKER clenches her fist to the ceiling)|Nooooo!!! -(The SPEAKER clenches her fist to the ceiling)|Nooooo!!! -(The SPEAKER grins and pulls out a frilly dress)|Don't knock it till you try it!|Trust me, it'll be fun! -(The SPEAKER grins and pulls out a frilly dress)|Don't knock it till you try it!|Trust me, it'll be fun! -(The SPEAKER furrows her brow)|Watch your tongue there, little lady.|Or I'll have to plug it for you... -(The SPEAKER furrows her brow)|Watch your tongue there, little lady.|Or I'll have to plug it for you... -(The SPEAKER folds her arms as ribbons rise up around her)|Suit yourself, hehe~ -(The SPEAKER folds her arms as ribbons rise up around her)|Suit yourself, hehe~ -(The SPEAKER smiles)|Yes! Yes! Wonderful! -(The SPEAKER smiles)|Yes! Yes! Wonderful! -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -Sure! -Sure! -(Nod excitedly) -(Nod excitedly) -Nope. -Nope. -(Shake your head) -(Shake your head) -Sign me up! -Sign me up! -(Accept the position) -(Accept the position) -And wear tacky clothes all the time? -And wear tacky clothes all the time? -(Refuse the position) -(Refuse the position) -Fine... sign me up. -Fine... sign me up. -(Moan and nod) -(Moan and nod) -Why don't you try it on yourself! (PERCENT chance to avoid) -Why don't you try it on yourself! (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER runs up to you)|Wow! You make a fine specimen-er, I mean...|Nice to meet you! -(The SPEAKER runs up to you)|Wow! You make a fine specimen-er, I mean...|Nice to meet you! -(The SPEAKER smiles)|Now, I have something wonderful in store for you.|(She takes out a blue catsuit)|I'd like you to be my assistant! -(The SPEAKER smiles)|Now, I have something wonderful in store for you.|(She takes out a blue catsuit)|I'd like you to be my assistant! -(The SPEAKER looks excited)|Awesome! Let me help you get in uniform... -(The SPEAKER looks excited)|Awesome! Let me help you get in uniform... -(The SPEAKER shrugs)|It was worth a shot... -(The SPEAKER shrugs)|It was worth a shot... -(The SPEAKER shrugs)|It was worth a shot... -(The SPEAKER shrugs)|It was worth a shot... -(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|There's just... a lot to do.|That's why I need an assistant. -(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|There's just... a lot to do.|That's why I need an assistant. -(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|We seek only knowledge! -(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|We seek only knowledge! -(The SPEAKER frowns)|Time for a test run! -(The SPEAKER frowns)|Time for a test run! -(The SPEAKER looks happy again)|Thank you! I'm super grateful! -(The SPEAKER looks happy again)|Thank you! I'm super grateful! -(The SPEAKER tilts her head)|Fine then. You win.|(As you leave, you hear a 'just kidding' as she breaks a glass vial)|(A suit of blue latex envelops you!) -(The SPEAKER tilts her head)|Fine then. You win.|(As you leave, you hear a 'just kidding' as she breaks a glass vial)|(A suit of blue latex envelops you!) -...Hello? -...Hello? -(Nod excitedly) -(Nod excitedly) -You guys are crazy. -You guys are crazy. -(Shake your head) -(Shake your head) -Gladly! -Gladly! -(Accept the offer) -(Accept the offer) -W-where did you get that uniform? (Refuse) -W-where did you get that uniform? (Refuse) -(Refuse the offer) -(Refuse the offer) -Fine. I'll be your assistant. -Fine. I'll be your assistant. -(Moan and nod) -(Moan and nod) -Go find someone else. (PERCENT chance to avoid) -Go find someone else. (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER greets you)|Normally we don't meddle in mortal affairs.|But you, Outsider, are different.|Let's have a conversation. -(The SPEAKER greets you)|Normally we don't meddle in mortal affairs.|But you, Outsider, are different.|Let's have a conversation. -(The SPEAKER smiles warmly)|Outsiders have a lower rank in our society.|But it is a rank all the same.|You will be above your mortal peers.|What do you say? -(The SPEAKER smiles warmly)|Outsiders have a lower rank in our society.|But it is a rank all the same.|You will be above your mortal peers.|What do you say? -(The SPEAKER clasps some 'jewelry' around your limbs)|You look beautiful, my dear.|I will leave you to your own affairs until we meet again. -(The SPEAKER clasps some 'jewelry' around your limbs)|You look beautiful, my dear.|I will leave you to your own affairs until we meet again. -(The SPEAKER turns her head away)|Hmph. I offer you a bargain and you refuse. -(The SPEAKER turns her head away)|Hmph. I offer you a bargain and you refuse. -(The SPEAKER turns her head away)|Hmph. As expected. -(The SPEAKER turns her head away)|Hmph. As expected. -(The SPEAKER folds her arms)|If you are not with us, then you are against us.|You shall face the wrath of the wild. -(The SPEAKER folds her arms)|If you are not with us, then you are against us.|You shall face the wrath of the wild. -(The SPEAKER frowns)|Hardly slavery!|A mere slave would not be allowed to even set foot in our society. -(The SPEAKER frowns)|Hardly slavery!|A mere slave would not be allowed to even set foot in our society. -(The SPEAKER frowns)|We will meet again. -(The SPEAKER frowns)|We will meet again. -(The SPEAKER nods and smiles)|(She decorates your body with 'jewelry')|I am glad you had a change of heart. -(The SPEAKER nods and smiles)|(She decorates your body with 'jewelry')|I am glad you had a change of heart. -(The SPEAKER scoffs)|(Her magic suddenly binds you tightly in glowing ropes)|Amateur. -(The SPEAKER scoffs)|(Her magic suddenly binds you tightly in glowing ropes)|Amateur. -I'm interested. (Talk with her) -I'm interested. (Talk with her) -(Nod excitedly) -(Nod excitedly) -No thanks. -No thanks. -(Shake your head) -(Shake your head) -I accept your gracious offer! -I accept your gracious offer! -(Accept) -(Accept) -I won't be a slave to you. -I won't be a slave to you. -(Refuse) -(Refuse) -Fine, fine... I will accept. -Fine, fine... I will accept. -(Moan and nod) -(Moan and nod) -No way. (PERCENT chance to avoid) -No way. (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER smiles at you)|Mortal. -(The SPEAKER smiles at you)|Mortal. -(The SPEAKER points to the ground)|Kneel before me and accept your collar. -(The SPEAKER points to the ground)|Kneel before me and accept your collar. -(The SPEAKER snaps her fingers)|(A collar of cold black metal materializes around your neck)|A girl who knows her place! Wonderful... -(The SPEAKER snaps her fingers)|(A collar of cold black metal materializes around your neck)|A girl who knows her place! Wonderful... -(The SPEAKER scoffs)|Hmmph. Mortals... -(The SPEAKER scoffs)|Hmmph. Mortals... -(The SPEAKER scoffs)|Hmmph. Mortals... -(The SPEAKER scoffs)|Hmmph. Mortals... -(The SPEAKER folds her arms)|Well, look who doesn't know her place~ -(The SPEAKER folds her arms)|Well, look who doesn't know her place~ -(The SPEAKER folds her arms)|I didn't offer you a choice in the matter.|You're mine, I've decided that. -(The SPEAKER folds her arms)|I didn't offer you a choice in the matter.|You're mine, I've decided that. -(The SPEAKER's eyes begin to glow)|Looks like we'll do this the fun way! -(The SPEAKER's eyes begin to glow)|Looks like we'll do this the fun way! -(The SPEAKER smiles)|Wonderful~|Now come along, my pet! -(The SPEAKER smiles)|Wonderful~|Now come along, my pet! -(The SPEAKER scoffs and snaps her fingers)|(Metallic restraints come at you from all angles and snap in place tightly)|(A gag forces itself into your mouth)|Now then, what were we saying? -(The SPEAKER scoffs and snaps her fingers)|(Metallic restraints come at you from all angles and snap in place tightly)|(A gag forces itself into your mouth)|Now then, what were we saying? -Yes? -Yes? -(Nod excitedly) -(Nod excitedly) -I don't talk to monsters! -I don't talk to monsters! -(Shake your head) -(Shake your head) -O-okay. (Kneel) -O-okay. (Kneel) -(Kneel) -(Kneel) -I refuse! -I refuse! -(Refuse) -(Refuse) -Then it looks like I have no choice. (Join her) -Then it looks like I have no choice. (Join her) -(Moan and nod) -(Moan and nod) -I will never bow to you! (PERCENT chance to avoid) -I will never bow to you! (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER waves)|You seem like an exceptional individual.|What do you think of joining the Guild? -(The SPEAKER waves)|You seem like an exceptional individual.|What do you think of joining the Guild? -(The SPEAKER smiles)|Excellent! I'll put in a word with the Guild.|Do note: this will affect your reputation with certain bad actors. -(The SPEAKER smiles)|Excellent! I'll put in a word with the Guild.|Do note: this will affect your reputation with certain bad actors. -(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. -(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. -(The SPEAKER nods)|Fair enough. Guild work is not for everyone. -(The SPEAKER nods)|Fair enough. Guild work is not for everyone. -(The SPEAKER nods)|Very well, then I won't bother you. -(The SPEAKER nods)|Very well, then I won't bother you. -(The SPEAKER looks dubious)|You know, there's quite a bounty on your head.|I'm sure we could do something about it. -(The SPEAKER looks dubious)|You know, there's quite a bounty on your head.|I'm sure we could do something about it. -(The SPEAKER tilts her head)|Haha, very funny.|We both know that you're not one of those... right? -(The SPEAKER tilts her head)|Haha, very funny.|We both know that you're not one of those... right? -(The SPEAKER frowns and readies for battle)|My instincts were right. -(The SPEAKER frowns and readies for battle)|My instincts were right. -(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. -(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. -(The SPEAKER suddenly strikes you to the floor)|(You feel a foot on your back as she ties you in a strict rope hogtie...)|(She dusts off her hands)|We'll have a talk when you get out of that, okay? -(The SPEAKER suddenly strikes you to the floor)|(You feel a foot on your back as she ties you in a strict rope hogtie...)|(She dusts off her hands)|We'll have a talk when you get out of that, okay? -This sounds like an interesting opportunity. -This sounds like an interesting opportunity. -(Nod excitedly) -(Nod excitedly) -I have no interest in joining the guild. -I have no interest in joining the guild. -(Shake your head) -(Shake your head) -Gladly! -Gladly! -(Accept the offer) -(Accept the offer) -What if I am one of those bad actors? (Refuse) -What if I am one of those bad actors? (Refuse) -(Refuse the offer) -(Refuse the offer) -Fine... (Join) -Fine... (Join) -(Moan and nod) -(Moan and nod) -Go away. (PERCENT chance to avoid) -Go away. (PERCENT chance to avoid) -(Frown at her) (PERCENT chance to avoid) -(Frown at her) (PERCENT chance to avoid) -(The SPEAKER beeps)|Prisoner 74121 identified.|Subject not registered in database. -(The SPEAKER beeps)|Prisoner 74121 identified.|Subject not registered in database. -(The SPEAKER beeps)|Confirming database entry.|Say 'I will be a good girl' to enter database. -(The SPEAKER beeps)|Confirming database entry.|Say 'I will be a good girl' to enter database. -(The SPEAKER beeps and applies tracking gear)|(The metallic cables click into place with a soft beep)|Prisoner 74121 registered. Good girl. -(The SPEAKER beeps and applies tracking gear)|(The metallic cables click into place with a soft beep)|Prisoner 74121 registered. Good girl. -(The SPEAKER beeps)|Acknowledged. Be warned:|Lost contact with Sections 98, 97, 96, 95...|(The list goes on...) -(The SPEAKER beeps)|Acknowledged. Be warned:|Lost contact with Sections 98, 97, 96, 95...|(The list goes on...) -(The SPEAKER beeps)|Acknowledged. Updating records. -(The SPEAKER beeps)|Acknowledged. Updating records. -(The SPEAKER beeps and flashes its lights)|Target acquired. -(The SPEAKER beeps and flashes its lights)|Target acquired. -(The SPEAKER beeps and flashes its lights)|Target has complied. Supplying uniform. -(The SPEAKER beeps and flashes its lights)|Target has complied. Supplying uniform. -(The SPEAKER beeps and flashes its lights)|Engaging capture protocol. -(The SPEAKER beeps and flashes its lights)|Engaging capture protocol. -(The SPEAKER beeps and flashes its lights)| -(The SPEAKER beeps and flashes its lights)| -(The SPEAKER blasts you with a stunning ray and captures you)|Target neutralized. -(The SPEAKER blasts you with a stunning ray and captures you)|Target neutralized. -Please register me. -Please register me. -(Stop to talk to the robot) -(Stop to talk to the robot) -Prisoner 74121? You must be mistaken... -Prisoner 74121? You must be mistaken... -(Avoid the robot) -(Avoid the robot) -Prisoner 74121 reporting. I will be a good girl. -Prisoner 74121 reporting. I will be a good girl. -(Accept the contract) -(Accept the contract) -Actually, I am an administrator. (Refuse) -Actually, I am an administrator. (Refuse) -(Refuse the contract) -(Refuse the contract) -I'm sorry, I will be a good girl! -I'm sorry, I will be a good girl! -(Moan and nod) -(Moan and nod) -What? (PERCENT chance to avoid) -What? (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER smiles)|I used to be an adventurer like you.|Then I joined up with the Dragonhearts! -(The SPEAKER smiles)|I used to be an adventurer like you.|Then I joined up with the Dragonhearts! -(The SPEAKER clears her throat)|Well, we're actually recruiting!|You're free to join us if you agree to fight for justice! -(The SPEAKER clears her throat)|Well, we're actually recruiting!|You're free to join us if you agree to fight for justice! -(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! -(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! -(The SPEAKER tilts her head and shrugs)|Ah well. -(The SPEAKER tilts her head and shrugs)|Ah well. -(The SPEAKER nods)|Fair enough. -(The SPEAKER nods)|Fair enough. -(The SPEAKER frowns)|What is it?|You're not an enemy of justice, are you? -(The SPEAKER frowns)|What is it?|You're not an enemy of justice, are you? -(The SPEAKER frowns)|...If you won't fight for justice, that makes you an enemy of justice. -(The SPEAKER frowns)|...If you won't fight for justice, that makes you an enemy of justice. -(The SPEAKER frowns and cracks her knuckles)|Looks like my suspicions were right!|Looks like you and I are going to have a little chat... -(The SPEAKER frowns and cracks her knuckles)|Looks like my suspicions were right!|Looks like you and I are going to have a little chat... -(The SPEAKER giggles)|Hehe, just messin' with ya.|Anyway, welcome to the sisterhood! -(The SPEAKER giggles)|Hehe, just messin' with ya.|Anyway, welcome to the sisterhood! -(The SPEAKER grabs you and ties you up)|You won't be making trouble like that any time soon. -(The SPEAKER grabs you and ties you up)|You won't be making trouble like that any time soon. -I wish I could join you. -I wish I could join you. -(Nod excitedly) -(Nod excitedly) -Please go away. -Please go away. -(Back away) -(Back away) -Great! Sign me up! -Great! Sign me up! -(Join) -(Join) -Fight for justice? Sounds restrictive... -Fight for justice? Sounds restrictive... -(Back away) -(Back away) -Actually, justice doesn't sound bad! -Actually, justice doesn't sound bad! -(Moan and nod) -(Moan and nod) -What are you going to do about it? (PERCENT chance to avoid) -What are you going to do about it? (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER waves and calls you over)|Looks like you've made a name for yourself.|What do you say to a little agreement? -(The SPEAKER waves and calls you over)|Looks like you've made a name for yourself.|What do you say to a little agreement? -(The SPEAKER clears her throat)|Well, you're currently on our turf.|But we're willing to cut you some slack.|You just have to agree not to attack any of us. -(The SPEAKER clears her throat)|Well, you're currently on our turf.|But we're willing to cut you some slack.|You just have to agree not to attack any of us. -(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! -(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! -(The SPEAKER tilts her head and shrugs)|Ah well. -(The SPEAKER tilts her head and shrugs)|Ah well. -(The SPEAKER nods)|Fair enough. -(The SPEAKER nods)|Fair enough. -(The SPEAKER frowns)|Criminals? Girl, we ARE the law around these parts~ -(The SPEAKER frowns)|Criminals? Girl, we ARE the law around these parts~ -(The SPEAKER grins)|I like your spunk, girl.|But you're kidding, right? -(The SPEAKER grins)|I like your spunk, girl.|But you're kidding, right? -(The SPEAKER raises her fists and smiles)|You're on! -(The SPEAKER raises her fists and smiles)|You're on! -(The SPEAKER chuckles)|Here's a toast to a new partnership! -(The SPEAKER chuckles)|Here's a toast to a new partnership! -(The SPEAKER catches you and trusses you up)|Maybe we'll just have to find you an owner, then!|Hehe. -(The SPEAKER catches you and trusses you up)|Maybe we'll just have to find you an owner, then!|Hehe. -I'm all ears. -I'm all ears. -(Listen closely) -(Listen closely) -I don't deal with criminals. -I don't deal with criminals. -(Back away) -(Back away) -It's a deal! -It's a deal! -(Mumble in agreement) -(Mumble in agreement) -You don't understand. This is MY turf. -You don't understand. This is MY turf. -(Scoff at her through your gag) -(Scoff at her through your gag) -Haha, just kidding. I'm with you. -Haha, just kidding. I'm with you. -(Moan and nod) -(Moan and nod) -Put 'em up! (PERCENT chance to avoid) -Put 'em up! (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER stops walking and speaks)|You there!|It seems your attunement with magic is high.|Join us. -(The SPEAKER stops walking and speaks)|You there!|It seems your attunement with magic is high.|Join us. -(The SPEAKER nods calmly)|We will use some special equipment to increase your attunement.|Put these on. -(The SPEAKER nods calmly)|We will use some special equipment to increase your attunement.|Put these on. -(The 'equipment' locks in place)|Excellent. Soon you will be much more powerful. -(The 'equipment' locks in place)|Excellent. Soon you will be much more powerful. -(The SPEAKER stops talking and walks away.) -(The SPEAKER stops talking and walks away.) -(The SPEAKER walks away like nothing happened.) -(The SPEAKER walks away like nothing happened.) -(The SPEAKER frowns slightly)|We are prepared to use force if need be... -(The SPEAKER frowns slightly)|We are prepared to use force if need be... -(The SPEAKER stares at you)|Why? Did you not say you wanted to join us? -(The SPEAKER stares at you)|Why? Did you not say you wanted to join us? -(The SPEAKER frowns)|We have failed to convince the human. -(The SPEAKER frowns)|We have failed to convince the human. -(The SPEAKER nods.)|You have made a wise decision. -(The SPEAKER nods.)|You have made a wise decision. -(The SPEAKER uses magic to force you.)|There. Try not to succumb to your desires too much. -(The SPEAKER uses magic to force you.)|There. Try not to succumb to your desires too much. -Um... sure? -Um... sure? -(Nod excitedly) -(Nod excitedly) -Get away from me! -Get away from me! -(Shake your head) -(Shake your head) -Shiny... (Put them on) -Shiny... (Put them on) -(Let her put them on you) -(Let her put them on you) -What? No way! (Refuse) -What? No way! (Refuse) -(Refuse the contract) -(Refuse the contract) -Okay, I will wear them... -Okay, I will wear them... -(Moan and nod) -(Moan and nod) -Monster! (PERCENT chance to avoid) -Monster! (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER does a short bow as she sees you)|Um... hi!|I have a letter for you... -(The SPEAKER does a short bow as she sees you)|Um... hi!|I have a letter for you... -(The letter is a contract from the College)|(They want you to sign up as an instructor for apprentices)|(The SPEAKER looks at you nervously.) -(The letter is a contract from the College)|(They want you to sign up as an instructor for apprentices)|(The SPEAKER looks at you nervously.) -(The SPEAKER sighs in relief)|That's good...|(You sign the contract and it vanishes into the aether) -(The SPEAKER sighs in relief)|That's good...|(You sign the contract and it vanishes into the aether) -(The SPEAKER whimpers)|What will I tell them... -(The SPEAKER whimpers)|What will I tell them... -(The SPEAKER whimpers)|What will I tell them... -(The SPEAKER whimpers)|What will I tell them... -(The SPEAKER glares at you)|It's an important message concerning your standing!|With the College! -(The SPEAKER glares at you)|It's an important message concerning your standing!|With the College! -(The SPEAKER blushes)|Well...|I was told we would make changes to your academic record,|should you refuse... -(The SPEAKER blushes)|Well...|I was told we would make changes to your academic record,|should you refuse... -(The SPEAKER frowns)|They told me to make sure you sign...|by any means necessary! -(The SPEAKER frowns)|They told me to make sure you sign...|by any means necessary! -(The SPEAKER nods and smiles)|Thank you so much!|I don't know what I would have done if you said no... -(The SPEAKER nods and smiles)|Thank you so much!|I don't know what I would have done if you said no... -(The SPEAKER frowns and waves her wand)|(A bunch of ropes come out of the ground and restrain you)|Hmmph. I'll tell them you signed it anyway.|I can't go back empty handed. -(The SPEAKER frowns and waves her wand)|(A bunch of ropes come out of the ground and restrain you)|Hmmph. I'll tell them you signed it anyway.|I can't go back empty handed. -Thank you for delivering it. (Read it) -Thank you for delivering it. (Read it) -(Read the letter) -(Read the letter) -There's nothing good inside that letter. -There's nothing good inside that letter. -(Shake your head) -(Shake your head) -Great! Wonderful! -Great! Wonderful! -(Accept the contract) -(Accept the contract) -There is no way I'd accept. -There is no way I'd accept. -(Refuse the contract) -(Refuse the contract) -Fine. I'll read it. (Join the College as an instructor) -Fine. I'll read it. (Join the College as an instructor) -(Moan and nod) -(Moan and nod) -This is unethical! I refuse! (PERCENT chance to avoid) -This is unethical! I refuse! (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(The SPEAKER tilts her head and shrugs)|We are always prepared... -(The SPEAKER tilts her head and shrugs)|We are always prepared... -(The SPEAKER nods)|Fair enough. -(The SPEAKER nods)|Fair enough. -(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(The SPEAKER frowns)|You won't know what hit you. -(The SPEAKER frowns)|You won't know what hit you. -(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -This sounds like an interesting opportunity. -This sounds like an interesting opportunity. -(Nod excitedly) -(Nod excitedly) -No thanks, I know what that entails... -No thanks, I know what that entails... -(Shake your head) -(Shake your head) -Gladly! -Gladly! -(Accept the contract) -(Accept the contract) -W-where did you get that uniform? (Refuse) -W-where did you get that uniform? (Refuse) -(Refuse the contract) -(Refuse the contract) -Fine. I'll sign it... -Fine. I'll sign it... -(Moan and nod) -(Moan and nod) -Never! (PERCENT chance to avoid) -Never! (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(Shake your head and frown) (PERCENT chance to avoid) -(The SPEAKER waves)|Greetings,|I manufacture all sorts of goods.|Would you like to buy some? -(The SPEAKER waves)|Greetings,|I manufacture all sorts of goods.|Would you like to buy some? -(The SPEAKER drops her hammer and cracks her knuckles)|Put em up! -(The SPEAKER drops her hammer and cracks her knuckles)|Put em up! -(The SPEAKER looks at you.)|But you already have one? -(The SPEAKER looks at you.)|But you already have one? -(The SPEAKER folds her arms)|I don't do charity, ma'am. -(The SPEAKER folds her arms)|I don't do charity, ma'am. -(The SPEAKER nods)|See this magic rune here?|Stick it in any lock, and it opens, just like that!|Only works once, though. -(The SPEAKER nods)|See this magic rune here?|Stick it in any lock, and it opens, just like that!|Only works once, though. -(The SPEAKER smiles)|Now don't be up to no good~|Or else I'll have to put you in cuffs... -(The SPEAKER smiles)|Now don't be up to no good~|Or else I'll have to put you in cuffs... -(The SPEAKER nods)|A versatile weapon. One of my favorites. -(The SPEAKER nods)|A versatile weapon. One of my favorites. -(The SPEAKER nods)|Keep your friends close, and your enemies far away. -(The SPEAKER nods)|Keep your friends close, and your enemies far away. -(The SPEAKER nods)|Handy to have one of these around. -(The SPEAKER nods)|Handy to have one of these around. -(The SPEAKER nods)|The best defense is a good offense. -(The SPEAKER nods)|The best defense is a good offense. -(The SPEAKER looks puzzled)|Don't know why you want 'em, but sure. -(The SPEAKER looks puzzled)|Don't know why you want 'em, but sure. -(The SPEAKER approaches you with an offer)|Greetings! I am a potion trader.|Give me your strongest potions!|I pay cash! -(The SPEAKER approaches you with an offer)|Greetings! I am a potion trader.|Give me your strongest potions!|I pay cash! -(The SPEAKER doesn't look surprised)|Okay, just let me set these down real quick... -(The SPEAKER doesn't look surprised)|Okay, just let me set these down real quick... -(The SPEAKER smiles)|A spellcaster will have great use for this! -(The SPEAKER smiles)|A spellcaster will have great use for this! -(The SPEAKER smiles)|Wow! That's a lot of mana!|It requires a skilled mage to tap into, though... -(The SPEAKER smiles)|Wow! That's a lot of mana!|It requires a skilled mage to tap into, though... -(The SPEAKER smiles)|It fills me with... determination. -(The SPEAKER smiles)|It fills me with... determination. -(The SPEAKER smiles)|Refreshing! -(The SPEAKER smiles)|Refreshing! -(The SPEAKER smiles)|They say a bitter tea cures all ails... -(The SPEAKER smiles)|They say a bitter tea cures all ails... -(The SPEAKER smiles)|An empty flask?|...Oh. -(The SPEAKER smiles)|An empty flask?|...Oh. -(The SPEAKER approaches you)|My greetings, Outsider!|My throat is parched and I seek the bounties of nature.|Do you have what I seek? -(The SPEAKER approaches you)|My greetings, Outsider!|My throat is parched and I seek the bounties of nature.|Do you have what I seek? -(The SPEAKER doesn't look surprised)|Then let us have a battle of wits! -(The SPEAKER doesn't look surprised)|Then let us have a battle of wits! -(The SPEAKER thanks you)|A kind offering! You have my thanks. -(The SPEAKER thanks you)|A kind offering! You have my thanks. -(The SPEAKER thanks you)|A magnificent offering! You have my thanks. -(The SPEAKER thanks you)|A magnificent offering! You have my thanks. -(The SPEAKER tilts her head)|...where did you get this? -(The SPEAKER tilts her head)|...where did you get this? -(The SPEAKER thanks you)|A fine trinket!|I will enjoy meditating upon it. -(The SPEAKER thanks you)|A fine trinket!|I will enjoy meditating upon it. -(The SPEAKER thanks you)|I sense its flowing essence.|You have my thanks. -(The SPEAKER thanks you)|I sense its flowing essence.|You have my thanks. -(The SPEAKER thanks you)|I can feel a great sadness emanating from it.|It calls for warmth. -(The SPEAKER thanks you)|I can feel a great sadness emanating from it.|It calls for warmth. -(The SPEAKER approaches you with an offer)|Hello!|I am searching for magical scrolls.|Would you happen to have any? -(The SPEAKER approaches you with an offer)|Hello!|I am searching for magical scrolls.|Would you happen to have any? -(The SPEAKER doesn't look surprised)|Rude! -(The SPEAKER doesn't look surprised)|Rude! -(The SPEAKER smiles)|Thank you! -(The SPEAKER smiles)|Thank you! -(The SPEAKER smiles)|Thank you! -(The SPEAKER smiles)|Thank you! -(The SPEAKER smiles)|Thank you! -(The SPEAKER smiles)|Thank you! -(The SPEAKER raises a brow)|Thank you! This one is rare! -(The SPEAKER raises a brow)|Thank you! This one is rare! -(The SPEAKER approaches you with an offer)|Hey girl~|You seem like the explorer type.|Happen to have any good finds? -(The SPEAKER approaches you with an offer)|Hey girl~|You seem like the explorer type.|Happen to have any good finds? -(The SPEAKER frowns)|Well then. -(The SPEAKER frowns)|Well then. -(The SPEAKER grins)|Are you willing to part with this? -(The SPEAKER grins)|Are you willing to part with this? -(The SPEAKER smiles)|Aha!|Fantastic. -(The SPEAKER smiles)|Aha!|Fantastic. -(The SPEAKER frowns)|I'll take it, I guess... -(The SPEAKER frowns)|I'll take it, I guess... -(The SPEAKER smiles)|Oooh~!|I love technology! -(The SPEAKER smiles)|Oooh~!|I love technology! -(The SPEAKER surprises you)|Greetings, traveler.|I am looking for tools to aid in my mission. -(The SPEAKER surprises you)|Greetings, traveler.|I am looking for tools to aid in my mission. -(The SPEAKER doesn't look surprised)|That's how it is, then. -(The SPEAKER doesn't look surprised)|That's how it is, then. -(The SPEAKER bows)|Always be prepared. -(The SPEAKER bows)|Always be prepared. -(The SPEAKER bows)|A bit dangerous, but I'll take it. -(The SPEAKER bows)|A bit dangerous, but I'll take it. -(The SPEAKER bows)|A tool of the trade. -(The SPEAKER bows)|A tool of the trade. -(The SPEAKER bows)|A most valuable find. -(The SPEAKER bows)|A most valuable find. -(The SPEAKER runs up to you)|Hello!|You wouldn't happen to have seen any ghosts lately?|I'm gathering evidence! -(The SPEAKER runs up to you)|Hello!|You wouldn't happen to have seen any ghosts lately?|I'm gathering evidence! -(The SPEAKER gasps)|You wouldn't! -(The SPEAKER gasps)|You wouldn't! -(The SPEAKER shakes your hand)|Ah! Ghosts love these! -(The SPEAKER shakes your hand)|Ah! Ghosts love these! -(The SPEAKER smiles)|This looks like strong evidence for my investigation! -(The SPEAKER smiles)|This looks like strong evidence for my investigation! -(The SPEAKER grins)|Woah! That's so cool! -(The SPEAKER grins)|Woah! That's so cool! -You're giving me everything you have. -You're giving me everything you have. -(Flail threateningly at her) -(Flail threateningly at her) -(Do it) -(Do it) -(Back off) -(Back off) -(Sell Item0 for ItemCost0 gp) -(Sell Item0 for ItemCost0 gp) -(Sell Item1 for ItemCost1 gp) -(Sell Item1 for ItemCost1 gp) -(Sell Item2 for ItemCost2 gp) -(Sell Item2 for ItemCost2 gp) -(Sell Item3 for ItemCost3 gp) -(Sell Item3 for ItemCost3 gp) -(Sell Item4 for ItemCost4 gp) -(Sell Item4 for ItemCost4 gp) -(Sell Item5 for ItemCost5 gp) -(Sell Item5 for ItemCost5 gp) -(Sell Item6 for ItemCost6 gp) -(Sell Item6 for ItemCost6 gp) -(Sell Item7 for ItemCost7 gp) -(Sell Item7 for ItemCost7 gp) -(Sell Item8 for ItemCost8 gp) -(Sell Item8 for ItemCost8 gp) -(Sell Item9 for ItemCost9 gp) -(Sell Item9 for ItemCost9 gp) -(Buy Item0 for ItemCost0 gp) -(Buy Item0 for ItemCost0 gp) -(Buy Item1 for ItemCost1 gp) -(Buy Item1 for ItemCost1 gp) -(Buy Item2 for ItemCost2 gp) -(Buy Item2 for ItemCost2 gp) -(Buy Item3 for ItemCost3 gp) -(Buy Item3 for ItemCost3 gp) -(Buy Item4 for ItemCost4 gp) -(Buy Item4 for ItemCost4 gp) -(Buy Item5 for ItemCost5 gp) -(Buy Item5 for ItemCost5 gp) -(Buy Item6 for ItemCost6 gp) -(Buy Item6 for ItemCost6 gp) -(Buy Item7 for ItemCost7 gp) -(Buy Item7 for ItemCost7 gp) -(Buy Item8 for ItemCost8 gp) -(Buy Item8 for ItemCost8 gp) -(Buy Item9 for ItemCost9 gp) -(Buy Item9 for ItemCost9 gp) -(The SPEAKER appears in a flash of light)|I come in the name of the Goddess.|I presume you need my aid?|(She will remain and help you with restraints for 50 turns) -(The SPEAKER appears in a flash of light)|I come in the name of the Goddess.|I presume you need my aid?|(She will remain and help you with restraints for 50 turns) -(The SPEAKER gives you two knives)|Don't hurt yourself with these, okay? -(The SPEAKER gives you two knives)|Don't hurt yourself with these, okay? -(The SPEAKER gives you three picks)|I don't know how you plan to use these... -(The SPEAKER gives you three picks)|I don't know how you plan to use these... -(The SPEAKER reluctantly gives you a magic key)|Okay, these don't grow on trees... -(The SPEAKER reluctantly gives you a magic key)|Okay, these don't grow on trees... -(Ask for 2 knives) -(Ask for 2 knives) -(Ask for 3 lockpicks) -(Ask for 3 lockpicks) -(Ask for a magic key) -(Ask for a magic key) -There is no valid space next to you! -There is no valid space next to you! -(You approach the SPEAKER) -(You approach the SPEAKER) -(Threaten) -(Threaten) -(Really attack?) -(Really attack?) -(Attack her) -(Attack her) -(Never mind...) -(Never mind...) -(You decide not to) -(You decide not to) -(Retaliate) -(Retaliate) -(Really attack? You will be justified and won't take a rep penalty.) -(Really attack? You will be justified and won't take a rep penalty.) -(Attack her) -(Attack her) -(Never mind...) -(Never mind...) -(You decide not to) -(You decide not to) -(Sneak Attack) -(Sneak Attack) -(Really attack? Target is unaware and will be stunned 1 turn.) -(Really attack? Target is unaware and will be stunned 1 turn.) -(Attack her) -(Attack her) -(Never mind...) -(Never mind...) -(You decide not to) -(You decide not to) -(Walk past) -(Walk past) -(Walk past) -(Walk past) -(Walk past multiple allies) -(Walk past multiple allies) -(Never mind...) -(Never mind...) -(Confirm? You will walk through her for a few turns) -(Confirm? You will walk through her for a few turns) -(...) -(...) -(Stop following me) -(Stop following me) -(Stop following me) -(Stop following me) -(Never mind...) -(Never mind...) -(Confirm? You will have to find the SPEAKER again.) -(Confirm? You will have to find the SPEAKER again.) -(You decide you still need the help) -(You decide you still need the help) -(The SPEAKER refuses to follow your orders) -(The SPEAKER refuses to follow your orders) -(Follow me) -(Follow me) -(Follow me) -(Follow me) -(Never mind...) -(Never mind...) -(The SPEAKER starts following you) -(The SPEAKER starts following you) -(You decide you don't need the help) -(You decide you don't need the help) -(The SPEAKER refuses to follow your orders) -(The SPEAKER refuses to follow your orders) -(Stay here) -(Stay here) -(Stay here) -(Stay here) -(Never mind...) -(Never mind...) -(The SPEAKER follows your orders) -(The SPEAKER follows your orders) -(...) -(...) -(The SPEAKER refuses to follow your orders) -(The SPEAKER refuses to follow your orders) -(Don't stay here) -(Don't stay here) -(Don't stay here) -(Don't stay here) -(Never mind...) -(Never mind...) -(Confirm?) -(Confirm?) -(You decide you would rather the SPEAKER stay put) -(You decide you would rather the SPEAKER stay put) -(The SPEAKER refuses to follow your orders) -(The SPEAKER refuses to follow your orders) -(Switch to Aggressive) -(Switch to Aggressive) -(The SPEAKER will now pursue enemies) -(The SPEAKER will now pursue enemies) -(Switch to Defensive) -(Switch to Defensive) -(The SPEAKER will stay close to you or its assigned position) -(The SPEAKER will stay close to you or its assigned position) -(Ask her for help) -(Ask her for help) -(Ask her for help) -(Ask her for help) -(Never mind...) -(Never mind...) -(Are you sure? She might see you as being submissive) -(Are you sure? She might see you as being submissive) -(The SPEAKER prefers you the way you are) -(The SPEAKER prefers you the way you are) -(The SPEAKER will help you out of your restraints) -(The SPEAKER will help you out of your restraints) -(You decide to deal with your problems yourself.) -(You decide to deal with your problems yourself.) -(Plead with her to unlock you with a Command Word) -(Plead with her to unlock you with a Command Word) -(Yes!) -(Yes!) -(Never mind...) -(Never mind...) -(Are you sure? She might see you as being submissive) -(Are you sure? She might see you as being submissive) -(The SPEAKER would rather 'conserve her mana') -(The SPEAKER would rather 'conserve her mana') -(The SPEAKER utters a command word on you) -(The SPEAKER utters a command word on you) -(Your magical locks continue to restrain you.) -(Your magical locks continue to restrain you.) -(Plead with her to unlock your restraints) -(Plead with her to unlock your restraints) -(Yes!) -(Yes!) -(Never mind...) -(Never mind...) -(Are you sure? She might see you as being submissive) -(Are you sure? She might see you as being submissive) -(The SPEAKER would rather not give up a magic key) -(The SPEAKER would rather not give up a magic key) -(The SPEAKER doesn't have any keys) -(The SPEAKER doesn't have any keys) -(The SPEAKER giggles and gives you a key) -(The SPEAKER giggles and gives you a key) -(You remain locked tight.) -(You remain locked tight.) -(Stop receiving help) -(Stop receiving help) -(Confirm? You will have to ask again to get help.) -(Confirm? You will have to ask again to get help.) -(Stop receiving help) -(Stop receiving help) -(Never mind...) -(Never mind...) -(The SPEAKER will no longer help you.) -(The SPEAKER will no longer help you.) -(You sigh as you realize you really need her help.) -(You sigh as you realize you really need her help.) -(Sell items) -(Sell items) -(Buy items) -(Buy items) -Fuuka -Fuuka -Fuuka surrounds herself in defensive talismans! -Fuuka surrounds herself in defensive talismans! -Fuuka wraps you tightly in restraints! (+RestraintAdded) -Fuuka wraps you tightly in restraints! (+RestraintAdded) -Fuuka squeezes your breasts and smiles! (DamageTaken) -Fuuka squeezes your breasts and smiles! (DamageTaken) -Angry Fuuka -Angry Fuuka -Fuuka surrounds herself in defensive talismans one more time! -Fuuka surrounds herself in defensive talismans one more time! -Fuuka wraps you furiously in restraints! (+RestraintAdded) -Fuuka wraps you furiously in restraints! (+RestraintAdded) -Fuuka pouts as she tickles you relentlessly! (DamageTaken) -Fuuka pouts as she tickles you relentlessly! (DamageTaken) -(You find a girl wearing an ornate dress)|(She glances at you)|And who might you be? -(You find a girl wearing an ornate dress)|(She glances at you)|And who might you be? -I should be asking the same of you. -I should be asking the same of you. -(Growl at her) -(Growl at her) -(She smiles)|My name is Fuuka, with the letters for Wind and Song.|Are you going to introduce yourself? -(She smiles)|My name is Fuuka, with the letters for Wind and Song.|Are you going to introduce yourself? -What kind of name is that? -What kind of name is that? -(SPEAKER frowns)|It means Windsong!|I bet yours isn't anywhere nearly as cool. -(SPEAKER frowns)|It means Windsong!|I bet yours isn't anywhere nearly as cool. -(SPEAKER looks enraged)|Because names and meanings are different things!|My name uses the script from the Old Civilization!|You're just a poser! -(SPEAKER looks enraged)|Because names and meanings are different things!|My name uses the script from the Old Civilization!|You're just a poser! -Why not just call yourself Windsong? -Why not just call yourself Windsong? -(...) -(...) -(...) -(...) -I am an adventurer. -I am an adventurer. -Mmmmph. -Mmmmph. -(SPEAKER blushes)|Ah, right then... -(SPEAKER blushes)|Ah, right then... -(...) -(...) -(SPEAKER giggles)|Very well. I don't really care who you are. -(SPEAKER giggles)|Very well. I don't really care who you are. -I do not need to introduce myself. -I do not need to introduce myself. -Neither do I. -Neither do I. -(...) -(...) -(...) -(...) -I'm an adventurer. And who are you? -I'm an adventurer. And who are you? -Mmmmm... (Blush) -Mmmmm... (Blush) -(She grins)|My name is Fuuka, with the letters for Wind and Song.|The reincarnated ones call me Windsong,|they aren't very bright though. -(She grins)|My name is Fuuka, with the letters for Wind and Song.|The reincarnated ones call me Windsong,|they aren't very bright though. -Reincarnated ones? -Reincarnated ones? -(SPEAKER tilts her head)|I believe the term is 'Zombie' in the common tongue. -(SPEAKER tilts her head)|I believe the term is 'Zombie' in the common tongue. -(SPEAKER enjoys the discussion)|Normally, spirits pass on to the next life.|But with the right tricks, one can keep them here.|I plan to make them all proper bodies...|Eventually. -(SPEAKER enjoys the discussion)|Normally, spirits pass on to the next life.|But with the right tricks, one can keep them here.|I plan to make them all proper bodies...|Eventually. -But... reincarnated? -But... reincarnated? -(...) -(...) -(...) -(...) -I am an adventurer. -I am an adventurer. -Mmmmph. -Mmmmph. -(SPEAKER giggles)|Hehe... you sound interested. -(SPEAKER giggles)|Hehe... you sound interested. -(...) -(...) -(SPEAKER frowns)|Never ask a woman about her age! -(SPEAKER frowns)|Never ask a woman about her age! -I take it you're the hag in charge? -I take it you're the hag in charge? -You are in charge, right? -You are in charge, right? -(Giggle) -(Giggle) -(...) -(...) -Don't mess with me, little girl. -Don't mess with me, little girl. -Mmpphgh? (Pout at her) -Mmpphgh? (Pout at her) -(She smirks)|So you're that kind of visitor, huh? -(She smirks)|So you're that kind of visitor, huh? -That's right. How powerful are you? -That's right. How powerful are you? -(She cracks her knuckles)|I have been practicing the resurrection arts for a thousand years. -(She cracks her knuckles)|I have been practicing the resurrection arts for a thousand years. -(She smiles)|All the zombies you seee in the Graveyard?|They are my pets, and I care for each and every one of them. -(She smiles)|All the zombies you seee in the Graveyard?|They are my pets, and I care for each and every one of them. -What the heck are 'Resurrection Arts'? -What the heck are 'Resurrection Arts'? -(...) -(...) -(...) -(...) -It's time for a true display of skill! -It's time for a true display of skill! -Hmmph. (Look away) -Hmmph. (Look away) -(She grins)|We'll wipe that pout off your face soon enough... -(She grins)|We'll wipe that pout off your face soon enough... -(Shake your head) -(Shake your head) -(She frowns)|Well, you will soon. -(She frowns)|Well, you will soon. -Pfff. Never heard of it. -Pfff. Never heard of it. -I bet I could do better. -I bet I could do better. -(Giggle) -(Giggle) -(...) -(...) -Why does that matter to you? -Why does that matter to you? -(Stare at her silently, maintaining your posture) -(Stare at her silently, maintaining your posture) -(She grins)|I am in charge of this place.|Everything that goes through here goes through me.|You may address me as Fuuka Windsong. -(She grins)|I am in charge of this place.|Everything that goes through here goes through me.|You may address me as Fuuka Windsong. -By what authority? -By what authority? -(SPEAKER tilts her head)|Ummmm.... uh...|The Old Civilization! Of course!|I've been keeping their traditions for centuries. -(SPEAKER tilts her head)|Ummmm.... uh...|The Old Civilization! Of course!|I've been keeping their traditions for centuries. -(SPEAKER blushes)|Umm... That's because...|Oh shut up! -(SPEAKER blushes)|Umm... That's because...|Oh shut up! -You don't sound too confident. -You don't sound too confident. -Who are you anyway? -Who are you anyway? -Who are you anyway? -Who are you anyway? -Fair enough. I am an adventurer. -Fair enough. I am an adventurer. -Hmmph. -Hmmph. -(SPEAKER giggles)|Is that a challenge? -(SPEAKER giggles)|Is that a challenge? -(Nod calmly) -(Nod calmly) -(SPEAKER grins)|Is that a challenge? -(SPEAKER grins)|Is that a challenge? -We'll see about that. -We'll see about that. -Hmmph. (Scoff into your gag) -Hmmph. (Scoff into your gag) -It is indeed! -It is indeed! -(Giggle) -(Giggle) -(...) -(...) -I'm an adventurer, miss. -I'm an adventurer, miss. -Mmmpphh~ (Moan and wiggle seductively) -Mmmpphh~ (Moan and wiggle seductively) -(She grins)|Oh look at you!|I'm going to dress you up and make you my pet!|You can have all the scritches and snuggles you want!|My name's Fuuka! -(She grins)|Oh look at you!|I'm going to dress you up and make you my pet!|You can have all the scritches and snuggles you want!|My name's Fuuka! -A pet? What kind? -A pet? What kind? -(SPEAKER hops up and down excitedly)|Oh I've got dresses!|And all sorts of fun gear!|Maybe even this huge gag for you to chew on! -(SPEAKER hops up and down excitedly)|Oh I've got dresses!|And all sorts of fun gear!|Maybe even this huge gag for you to chew on! -(SPEAKER grins)|Having second thoughts? -(SPEAKER grins)|Having second thoughts? -That sounds... harsh. -That sounds... harsh. -...Maybe -...Maybe -Exciting! -Exciting! -That sounds great. But who are you miss? -That sounds great. But who are you miss? -Mmmmph~ -Mmmmph~ -(SPEAKER giggles)|Hehe... We will have so much fun~ -(SPEAKER giggles)|Hehe... We will have so much fun~ -(...) -(...) -(SPEAKER giggles)|You don't have to consent, dear~ -(SPEAKER giggles)|You don't have to consent, dear~ -I never said I consented to being a pet! -I never said I consented to being a pet! -(Give her a puzzled look and shake your head) -(Give her a puzzled look and shake your head) -No way! -No way! -(Shake your head) -(Shake your head) -(Sigh and shrug) -(Sigh and shrug) -(Attack her without saying anything) -(Attack her without saying anything) -(SPEAKER clears her throat)|I am the one tasked with keeping this graveyard pure and holy.|All who roam this place do so under my express permission.|But what of you? I do not remember striking a deal with you.|Are you here to challenge me? -(SPEAKER clears her throat)|I am the one tasked with keeping this graveyard pure and holy.|All who roam this place do so under my express permission.|But what of you? I do not remember striking a deal with you.|Are you here to challenge me? -I do what I want. -I do what I want. -(Glare at her and scoff) -(Glare at her and scoff) -(SPEAKER makes a big grin)|I take that you wish to challenge me?|Very well!|Come at me! -(SPEAKER makes a big grin)|I take that you wish to challenge me?|Very well!|Come at me! -You have no power over me -You have no power over me -Hmmph. (Stand proudly) -Hmmph. (Stand proudly) -(SPEAKER smiles)|Then let us fight!|If I win, I will make you my pet.|If you win, I will let you pass. -(SPEAKER smiles)|Then let us fight!|If I win, I will make you my pet.|If you win, I will let you pass. -I don't want to fight, miss... -I don't want to fight, miss... -Mmph! (Shake your head frantically) -Mmph! (Shake your head frantically) -(SPEAKER giggles)|Come now, I want to see how good you are! -(SPEAKER giggles)|Come now, I want to see how good you are! -Yes, I am here to fight you. -Yes, I am here to fight you. -(Nod) -(Nod) -(SPEAKER smiles)|Then what are we waiting for? -(SPEAKER smiles)|Then what are we waiting for? -You're on! -You're on! -Hmmmph! -Hmmmph! -Let us duel! -Let us duel! -Mmmmmghh! -Mmmmmghh! -I suppose... -I suppose... -Mmmmph... -Mmmmph... -(SPEAKER smiles as she stands over you)|Well well. Look who won. -(SPEAKER smiles as she stands over you)|Well well. Look who won. -(SPEAKER nods)|Absolutely. Now allow me to make my conditions clear.|You will wear my collar from now on.|Then you will be allowed to go. -(SPEAKER nods)|Absolutely. Now allow me to make my conditions clear.|You will wear my collar from now on.|Then you will be allowed to go. -(SPEAKER giggles)|You're not in a position to resist.|Now then, let me make myself clear.|I will let you go... but only wearing my collar. -(SPEAKER giggles)|You're not in a position to resist.|Now then, let me make myself clear.|I will let you go... but only wearing my collar. -You beat me fair and square. -You beat me fair and square. -Mmmph. (Submit) -Mmmph. (Submit) -You cheated! -You cheated! -Mmmph! (Struggle weakly) -Mmmph! (Struggle weakly) -(Sigh and accept your fate) -(Sigh and accept your fate) -(Accept the collar eagerly) -(Accept the collar eagerly) -(Accept the collar begrudgingly) -(Accept the collar begrudgingly) -(SPEAKER presents you with her collar...)|(She locks it around your neck)|You are free to go now, dear! -(SPEAKER presents you with her collar...)|(She locks it around your neck)|You are free to go now, dear! -(SPEAKER puts up a wall of talismans to regain her strength)|I'm... I'm not finished yet! -(SPEAKER puts up a wall of talismans to regain her strength)|I'm... I'm not finished yet! -(SPEAKER is out of breath)|I... can't... believe... it...|She drops her keys... -(SPEAKER is out of breath)|I... can't... believe... it...|She drops her keys... -(SPEAKER looks flabbergasted)|R-really? Okay... I'll give you a reward then... -(SPEAKER looks flabbergasted)|R-really? Okay... I'll give you a reward then... -(Submit to her anyway) -(Submit to her anyway) -(SPEAKER resists but ultimately you force a gag into her mouth)|MMMMMPH! -(SPEAKER resists but ultimately you force a gag into her mouth)|MMMMMPH! -(Gag her) -(Gag her) -(This ghost had something to say,|but it appears you've run into a bug instead)|Please report this to Ada18980 on deviantart! -(This ghost had something to say,|but it appears you've run into a bug instead)|Please report this to Ada18980 on deviantart! -(Continue) -(Continue) -(Make a smug face as you walk past) -(Make a smug face as you walk past) -Thank you! -Thank you! -Mmmph! -Mmmph! -I don't need your advice, strange ghostly person. -I don't need your advice, strange ghostly person. -(Glare at her) -(Glare at her) -Oh, those people that locked you up?|I dealt with them.|Now come along, there's no time to waste! -Oh, those people that locked you up?|I dealt with them.|Now come along, there's no time to waste! -(The SPEAKER giggles)|Treasure? The treasure isn't going anywhere.|Plus, I made a few enemies on the way.|We better not wait till they come back. -(The SPEAKER giggles)|Treasure? The treasure isn't going anywhere.|Plus, I made a few enemies on the way.|We better not wait till they come back. -But what about the treasure!? -But what about the treasure!? -(The SPEAKER ponders your question)|I think we'll have to talk about compensation|AFTER we get out of here. -(The SPEAKER ponders your question)|I think we'll have to talk about compensation|AFTER we get out of here. -So how much is this going to cost me? -So how much is this going to cost me? -(You hear footsteps. It's the SPEAKER!)|Why look at you!|Well you seem to be in a bind, don't you? -(You hear footsteps. It's the SPEAKER!)|Why look at you!|Well you seem to be in a bind, don't you? -Not to worry! I'll get you out of here! -Not to worry! I'll get you out of here! -Hehe, alright! If that's what you want~ -Hehe, alright! If that's what you want~ -(Nod slowly) -(Nod slowly) -(Shake your head and refuse rescue) -(Shake your head and refuse rescue) -Yes please! -Yes please! -Actually I was having fun... -Actually I was having fun... -(The SPEAKER, your longtime friend, smiles)|Well well, if it isn't you again!|I see that you've decided to challenge the dungeon again.|Remember, if you get caught, I'll rescue you... for a fee~ -(The SPEAKER, your longtime friend, smiles)|Well well, if it isn't you again!|I see that you've decided to challenge the dungeon again.|Remember, if you get caught, I'll rescue you... for a fee~ -Caught by...? -Caught by...? -Hah!|You've been here a million times!|You obviously know about the many factions vying for power~ -Hah!|You've been here a million times!|You obviously know about the many factions vying for power~ -F-fee? There's a fee? -F-fee? There's a fee? -Yep! It'll cost ya!|RESCUECOST gold pieces. A bargain, if you ask me...|Unless you'd like to spend the rest of your life in chains! -Yep! It'll cost ya!|RESCUECOST gold pieces. A bargain, if you ask me...|Unless you'd like to spend the rest of your life in chains! -Will you buy my loot? -Will you buy my loot? -Soon! I'm currently setting up my wares, so you'll have to wait. -Soon! I'm currently setting up my wares, so you'll have to wait. -Mmmph! -Mmmph! -Daww! What a cutie!|(She smiles and pats your head gently) -Daww! What a cutie!|(She smiles and pats your head gently) -(Return) -(Return) -(The SPEAKER brings you safely back to her shop)|There! Nice and safe.|Now, as for my fee...|That'll be RESCUECOST gold pieces! -(The SPEAKER brings you safely back to her shop)|There! Nice and safe.|Now, as for my fee...|That'll be RESCUECOST gold pieces! -Right! Here's RESCUECOST gp. -Right! Here's RESCUECOST gp. -Mmmph. (Nod your head and pay RESCUECOST gp) -Mmmph. (Nod your head and pay RESCUECOST gp) -(The SPEAKER smiles)|Pleasure doing business with ya~ -(The SPEAKER smiles)|Pleasure doing business with ya~ -Mind adding it to my tab? -Mind adding it to my tab? -(Shake your head regrettably.) -(Shake your head regrettably.) -(The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|But I won't be letting you out of those restraints~ -(The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|But I won't be letting you out of those restraints~ -(The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|You're a good customer, after all. -(The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|You're a good customer, after all. -(The SPEAKER folds her arms)|Come on now, I can hear the gold jingling in your pocket! -(The SPEAKER folds her arms)|Come on now, I can hear the gold jingling in your pocket! -Pretty please? I promise I'll pay you back. -Pretty please? I promise I'll pay you back. -(Be insistent) -(Be insistent) -(The SPEAKER rubs her chin)|Fine, I believe you.|But I won't be letting you out of those restraints! -(The SPEAKER rubs her chin)|Fine, I believe you.|But I won't be letting you out of those restraints! -(The SPEAKER sighs)|Fine, I believe you.|You better believe I won't forget, though! -(The SPEAKER sighs)|Fine, I believe you.|You better believe I won't forget, though! -(The SPEAKER folds her arms)|Your adventures have cost me a pretty penny.|I can't stay in business if my clients keep running off without paying.|Look, I'll cut you a deal, you help me, I help you. Fair? -(The SPEAKER folds her arms)|Your adventures have cost me a pretty penny.|I can't stay in business if my clients keep running off without paying.|Look, I'll cut you a deal, you help me, I help you. Fair? -(Help her test cursed armors) -(Help her test cursed armors) -(Add cursed restraints as collateral) -(Add cursed restraints as collateral) -(Wear a collar to help advertise her business) -(Wear a collar to help advertise her business) -(Wear a catsuit to help advertise her business) -(Wear a catsuit to help advertise her business) -(Actually... just pay her the RESCUECOST gold) -(Actually... just pay her the RESCUECOST gold) -(The SPEAKER holds up a RESTRAINTNAME)|I've bought some armors from an adventurer lately,|but I don't know if they're safe to wear.|Why don't you try it on for me?|I'll postpone your debt for a later time. -(The SPEAKER holds up a RESTRAINTNAME)|I've bought some armors from an adventurer lately,|but I don't know if they're safe to wear.|Why don't you try it on for me?|I'll postpone your debt for a later time. -(The SPEAKER holds up a RESTRAINTNAME)|I need to make sure you won't go running off again.|This RESTRAINTNAME here has a special seal on it.|I can get you out of it, of course, but you'll have to pay up first. -(The SPEAKER holds up a RESTRAINTNAME)|I need to make sure you won't go running off again.|This RESTRAINTNAME here has a special seal on it.|I can get you out of it, of course, but you'll have to pay up first. -(The SPEAKER holds up a RESTRAINTNAME)|Your captors are quite the market for high-security restraints.|If you get captured by them, maybe they'll see my logo on this collar!|It's quite comfy and secure,|you'll end up feeling more submissive the more your wear it. -(The SPEAKER holds up a RESTRAINTNAME)|Your captors are quite the market for high-security restraints.|If you get captured by them, maybe they'll see my logo on this collar!|It's quite comfy and secure,|you'll end up feeling more submissive the more your wear it. -(The SPEAKER holds up a RESTRAINTNAME)|Your body looks like a great billboard!|This suit will make you so attractive that nobody will be able to resist!|And in the process of, ahem, examining you,|They'll be sure to see my logo! -(The SPEAKER holds up a RESTRAINTNAME)|Your body looks like a great billboard!|This suit will make you so attractive that nobody will be able to resist!|And in the process of, ahem, examining you,|They'll be sure to see my logo! -(The SPEAKER folds her arms and nods)|Good girl! I knew you would come clean~ -(The SPEAKER folds her arms and nods)|Good girl! I knew you would come clean~ -Sure! I accept! -Sure! I accept! -(Nod in approval) -(Nod in approval) -How about something else? -How about something else? -(Shake your head) -(Shake your head) -Excellent! Please hold still~|(She fits the RESTRAINTNAME on and a seal awakens)|Whoops! Good thing I didn't sell that one!|I'll let you keep it, it's my treat~ -Excellent! Please hold still~|(She fits the RESTRAINTNAME on and a seal awakens)|Whoops! Good thing I didn't sell that one!|I'll let you keep it, it's my treat~ -Excellent! Please hold still~|(She fits the RESTRAINTNAME on and nothing happens)|We have a winner!|You can't have it though, not until you pay up~ -Excellent! Please hold still~|(She fits the RESTRAINTNAME on and nothing happens)|We have a winner!|You can't have it though, not until you pay up~ -Wonderful. I look forward to seeing you being delivered, er, coming back,|Lots of treasure in hand!|(She places the RESTRAINTNAME on you and the seal activates. There is no keyhole.) -Wonderful. I look forward to seeing you being delivered, er, coming back,|Lots of treasure in hand!|(She places the RESTRAINTNAME on you and the seal activates. There is no keyhole.) -Alright! Why don't you hold still~|(She lifts your hair out of the way and buckles the collar on)|Now go out there and find me some treasure~ -Alright! Why don't you hold still~|(She lifts your hair out of the way and buckles the collar on)|Now go out there and find me some treasure~ -You're gonna like it, I guarantee it~|(She pulls out the catsuit from a drawer, dusts it off, and helps you in it)|(There is no zipper or fastener, just a very stretchy neck hole)|(Once it's on and well-fitted, you feel the neck grow less loose...)|(...and pulling the rubber away from your skin becomes impossible)|Beautiful. I'm going to let you go now.|I'm sure your new look will attract many customers! -You're gonna like it, I guarantee it~|(She pulls out the catsuit from a drawer, dusts it off, and helps you in it)|(There is no zipper or fastener, just a very stretchy neck hole)|(Once it's on and well-fitted, you feel the neck grow less loose...)|(...and pulling the rubber away from your skin becomes impossible)|Beautiful. I'm going to let you go now.|I'm sure your new look will attract many customers! -No? That's alright.|I'm sure I'll find someone else to test these on, huehue. -No? That's alright.|I'm sure I'll find someone else to test these on, huehue. -Up to you!|You'll still have to pay me eventually~ -Up to you!|You'll still have to pay me eventually~ -Your choice~|I am open to further negotiations. -Your choice~|I am open to further negotiations. -Your choice~|Not everyone is up to putting themselves on display like that~ -Your choice~|Not everyone is up to putting themselves on display like that~ -The next floor is a normal floor. -The next floor is a normal floor. -This floor is suffering from a slime mold infestation.|Maids have been deployed to deal with the problem.|They could use a hand. -This floor is suffering from a slime mold infestation.|Maids have been deployed to deal with the problem.|They could use a hand. -This floor is being ransacked by bandits.|They are armed and dangerous.|But I hear there's a bounty on their heads? -This floor is being ransacked by bandits.|They are armed and dangerous.|But I hear there's a bounty on their heads? -A cave dragon was captured in the next floor.|It's brimming with elemental magic,|and there are a lot of interested parties! -A cave dragon was captured in the next floor.|It's brimming with elemental magic,|and there are a lot of interested parties! -The witches told me to keep you out.|I'm not exactly capable of doing that,|so feel free to do as you please. -The witches told me to keep you out.|I'm not exactly capable of doing that,|so feel free to do as you please. -The next floor is overgrown.|I'd watch your feet if I were you. -The next floor is overgrown.|I'd watch your feet if I were you. -Slimes, slimes EVERYWHERE!|Fortunately there's a slime-harvesting|operation going on. -Slimes, slimes EVERYWHERE!|Fortunately there's a slime-harvesting|operation going on. -The trainers are taking their wolfgirls out for a walk.|I'd steer clear.|Unless you want to become one of their pets~ -The trainers are taking their wolfgirls out for a walk.|I'd steer clear.|Unless you want to become one of their pets~ -Rumor has it that one of the cyber-dolls escaped.|Their handlers are looking for her.|They're catching every young girl they can find! -Rumor has it that one of the cyber-dolls escaped.|Their handlers are looking for her.|They're catching every young girl they can find! -This is totally a normal floor.|No doubt about it. -This is totally a normal floor.|No doubt about it. -This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall. -This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall. -This is the entrance to the ancient tombs.|It's harder than the normal entrance. -This is the entrance to the ancient tombs.|It's harder than the normal entrance. -This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random. -This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random. -Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure! -Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure! -You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed! -You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed! -This is a debug mode journey for testing the latest region. -This is a debug mode journey for testing the latest region. -These are the stairs to the tutorial hall. -These are the stairs to the tutorial hall. -Congratulations! You've completed the tutorial!|Now get in there and stay out of trouble~ -Congratulations! You've completed the tutorial!|Now get in there and stay out of trouble~ -Welcome to the dungeon!|Don't panic, this is a turn-based game,|and nothing will happen until you move.|On your left you'll see your character,|displayed with all of the bondage they don't have.|Don't worry, you'll find some soon! -Welcome to the dungeon!|Don't panic, this is a turn-based game,|and nothing will happen until you move.|On your left you'll see your character,|displayed with all of the bondage they don't have.|Don't worry, you'll find some soon! -You might be wondering what all these barrels are for.|Don't worry, they're, uh, totally safe!|When you are inside one you can click on yourself to wait.|Enemies have a hard time seeing you inside a barrel,|so you can wait until they pass by you. -You might be wondering what all these barrels are for.|Don't worry, they're, uh, totally safe!|When you are inside one you can click on yourself to wait.|Enemies have a hard time seeing you inside a barrel,|so you can wait until they pass by you. -On the right you'll see your stats and spells slots.|Your DP, SP, MP, and WP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon.|Below that, two icons allow you to toggle automatic escape and movement modes. -On the right you'll see your stats and spells slots.|Your DP, SP, MP, and WP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon.|Below that, two icons allow you to toggle automatic escape and movement modes. -Your WP, or willpower, is an important resource.|Without it, escaping from restraints is more difficult.|There is a willpower potion on the floor up there. Go get it! -Your WP, or willpower, is an important resource.|Without it, escaping from restraints is more difficult.|There is a willpower potion on the floor up there. Go get it! -Oh no! That trap wiped out all your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack). -Oh no! That trap wiped out all your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack). -Another trap!|You'll notice that the trap also drained your stamina considerably, preventing you from sprinting or attacking.|(Note: you can toggle sprinting using the '>>' button on the bottom bar)|You can protect yourself while your stamina regenerates by retreating into the room above.|Close the door by clicking the Close Door button in the bottom bar.| -Another trap!|You'll notice that the trap also drained your stamina considerably, preventing you from sprinting or attacking.|(Note: you can toggle sprinting using the '>>' button on the bottom bar)|You can protect yourself while your stamina regenerates by retreating into the room above.|Close the door by clicking the Close Door button in the bottom bar.| -Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the bottom right.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1. -Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the bottom right.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1. -On the right you'll see your stats and spells slots.|You can click on a spell slot or hit 1-4 on your keyboard to cast a spell|then click on the map for where you want to aim it.|The small wrench icon above them will let you|swap them out for another spell from your spellbook. -On the right you'll see your stats and spells slots.|You can click on a spell slot or hit 1-4 on your keyboard to cast a spell|then click on the map for where you want to aim it.|The small wrench icon above them will let you|swap them out for another spell from your spellbook. -There's a zombie over there!|Fortunately zombies are weak to fire.|Firebolt has a very long range,|so simply cast firebolt and click on the zombie.|Repeat until it is dead. -There's a zombie over there!|Fortunately zombies are weak to fire.|Firebolt has a very long range,|so simply cast firebolt and click on the zombie.|Repeat until it is dead. -Mana potions restore your mana fully. -Mana potions restore your mana fully. -Your DP, or Distraction, is a measure of...|How much you are enjoying things.|These sorts of thoughts cloud your mind,|so spellcasting is more difficult when you are distracted.|Go grab the potion over there. -Your DP, or Distraction, is a measure of...|How much you are enjoying things.|These sorts of thoughts cloud your mind,|so spellcasting is more difficult when you are distracted.|Go grab the potion over there. -Did you like that?|Anyway, there's a zombie over there. You should drink that potion.|It will clear your mind so you can cast again.|Hurry, or it will get you! -Did you like that?|Anyway, there's a zombie over there. You should drink that potion.|It will clear your mind so you can cast again.|Hurry, or it will get you! -That wasn't so hard, was it?|Now then, there's a treasure chest over here. Why don't you open it? -That wasn't so hard, was it?|Now then, there's a treasure chest over here. Why don't you open it? -Yikes, looks like you're in a bind!|No worries, though. There's a key to those cuffs over there.|Simply hover over the cuffs item test on the left side.|Then, click the lock icon to remove the lock.|Finally, click the buckle to remove the cuffs. -Yikes, looks like you're in a bind!|No worries, though. There's a key to those cuffs over there.|Simply hover over the cuffs item test on the left side.|Then, click the lock icon to remove the lock.|Finally, click the buckle to remove the cuffs. -I think we all know what's in the next chest.|It's important to understand the different ways you can escape.|You can struggle, which costs the most stamina|but makes other struggle methods faster.|You can cut, which requires a knife in hand.|You can remove, which represents untying or unbuckling. -I think we all know what's in the next chest.|It's important to understand the different ways you can escape.|You can struggle, which costs the most stamina|but makes other struggle methods faster.|You can cut, which requires a knife in hand.|You can remove, which represents untying or unbuckling. -Ouch, that looked tight...|Sometimes you won't be able to struggle out of things.|You'll have to find some other way to take it off... -Ouch, that looked tight...|Sometimes you won't be able to struggle out of things.|You'll have to find some other way to take it off... -There's a few zombies up ahead.|Fight your way through and claim the treasure! -There's a few zombies up ahead.|Fight your way through and claim the treasure! -You're not feeling it... -You're not feeling it... -You close your eyes but the vibrations keep you from dozing off... -You close your eyes but the vibrations keep you from dozing off... -(A SPEAKER lies hogtied in front of you)|(She looks at you with pleading eyes,)|(and mumbles incoherently through her gag) -(A SPEAKER lies hogtied in front of you)|(She looks at you with pleading eyes,)|(and mumbles incoherently through her gag) -(A SPEAKER lies hogtied in front of you)|(She looks at you, mumbling and giggling into her gag) -(A SPEAKER lies hogtied in front of you)|(She looks at you, mumbling and giggling into her gag) -(SPEAKER looks grateful)|Thank you so much|I shall join your party. -(SPEAKER looks grateful)|Thank you so much|I shall join your party. -(SPEAKER looks grateful)|Thank you so much miss!|I owe you everything. -(SPEAKER looks grateful)|Thank you so much miss!|I owe you everything. -(SPEAKER groans and wriggles around uselessly) -(SPEAKER groans and wriggles around uselessly) -(SPEAKER moans and rolls around, blushing deeply) -(SPEAKER moans and rolls around, blushing deeply) -Untie her -Untie her -Make sure she is tight and secure -Make sure she is tight and secure -(A SPEAKER bumps into you while immersed in her thoughts)|Oh! Hello!|Say, you look adorable...|Do you mind helping me find something? -(A SPEAKER bumps into you while immersed in her thoughts)|Oh! Hello!|Say, you look adorable...|Do you mind helping me find something? -(The SPEAKER jumps up and down)|Ah, wonderful!|I've misplaced one of my dresses.|If you could find one, wear it, and bring it to me,|I'd greatly appreciate it! Thanks! -(The SPEAKER jumps up and down)|Ah, wonderful!|I've misplaced one of my dresses.|If you could find one, wear it, and bring it to me,|I'd greatly appreciate it! Thanks! -(The SPEAKER stares at you like a rabid animal)|Wowie! You look gorgeous!|Thank you so much!|(She snaps a photo of you using a magic crystal) -(The SPEAKER stares at you like a rabid animal)|Wowie! You look gorgeous!|Thank you so much!|(She snaps a photo of you using a magic crystal) -(The SPEAKER giggles)|I never said I'd take it off, did I? -(The SPEAKER giggles)|I never said I'd take it off, did I? -(The SPEAKER smiles)|Sure thing! -(The SPEAKER smiles)|Sure thing! -(Show interest) -(Show interest) -I found your dress... -I found your dress... -Mmmph... (Found the dress!) -Mmmph... (Found the dress!) -Great! Can you take it off? -Great! Can you take it off? -Mmmmm! (Struggle) -Mmmmm! (Struggle) -(A SPEAKER clutching her books approaches you)|Miss adventurer!|I happen to need a magic scroll of any kind.|It's for my studies. -(A SPEAKER clutching her books approaches you)|Miss adventurer!|I happen to need a magic scroll of any kind.|It's for my studies. -(The SPEAKER smiles)|Yes, thank you so much!|It's been so difficult to get them lately.|The magic library is closed off these days,|and there are mean people trying to get the scrolls back... -(The SPEAKER smiles)|Yes, thank you so much!|It's been so difficult to get them lately.|The magic library is closed off these days,|and there are mean people trying to get the scrolls back... -(The SPEAKER is happy)|Thank you so much! -(The SPEAKER is happy)|Thank you so much! -(The SPEAKER is happy)|Thank you so much! -(The SPEAKER is happy)|Thank you so much! -(The SPEAKER is happy)|Thank you so much! -(The SPEAKER is happy)|Thank you so much! -(The SPEAKER is happy)|Thank you so much! -(The SPEAKER is happy)|Thank you so much! -(Show interest) -(Show interest) -Give her a Scroll of Sauntering -Give her a Scroll of Sauntering -Give her a Scroll of Sleight -Give her a Scroll of Sleight -Give her a Scroll of Speech -Give her a Scroll of Speech -Give her a Scroll of Purity -Give her a Scroll of Purity -(A SPEAKER looks distraught)|Well met, adventurer!|We have a problem... -(A SPEAKER looks distraught)|Well met, adventurer!|We have a problem... -(The SPEAKER folds her arms)|A rebel has been causing us problems lately...|If you run into her, give her all you got!|She needs to be brought to justice. -(The SPEAKER folds her arms)|A rebel has been causing us problems lately...|If you run into her, give her all you got!|She needs to be brought to justice. -(Show interest) -(Show interest) -(A SPEAKER scoffs in your direction)|Well? You lookin' for work or no? -(A SPEAKER scoffs in your direction)|Well? You lookin' for work or no? -(The SPEAKER grins)|A bunch of delinquents stormed out recently.|They're looking for a way out of their belts.|Someone oughta show em their place,|if you catch what I'm saying. -(The SPEAKER grins)|A bunch of delinquents stormed out recently.|They're looking for a way out of their belts.|Someone oughta show em their place,|if you catch what I'm saying. -(Nod) -(Nod) -(A SPEAKER approaches you in your cell)|Since you've been a bad girl,|we're taking you to the high-security prison. -(A SPEAKER approaches you in your cell)|Since you've been a bad girl,|we're taking you to the high-security prison. -(The SPEAKER folds her arms)|Want to or not, you're going. -(The SPEAKER folds her arms)|Want to or not, you're going. -(Resist) -(Resist) -(Submit) -(Submit) -(A SPEAKER crosses her arms)|Who you lookin' at?|Oh, it's an adventurer.|Say, you wouldn't be interested|in working with us, would ya? -(A SPEAKER crosses her arms)|Who you lookin' at?|Oh, it's an adventurer.|Say, you wouldn't be interested|in working with us, would ya? -(The SPEAKER smiles)|That's more like it.|Here's the scoop: One of ours was captured on the next floor.|We need you to go get her out. -(The SPEAKER smiles)|That's more like it.|Here's the scoop: One of ours was captured on the next floor.|We need you to go get her out. -(Show interest) -(Show interest) -(The SPEAKER sits bound in high-security manacles)|You'll need to open the lock to get her out... -(The SPEAKER sits bound in high-security manacles)|You'll need to open the lock to get her out... -(You don't have any keys that work on the lock) -(You don't have any keys that work on the lock) -(You can't help her, bound as tightly as you are...) -(You can't help her, bound as tightly as you are...) -(You unlock her, fumbling around for a while with your bound hands) -(You unlock her, fumbling around for a while with your bound hands) -(You unlock the SPEAKER)|Thank you!|Let's get out of here! -(You unlock the SPEAKER)|Thank you!|Let's get out of here! -(You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...) -(You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...) -(You don't have any lockpicks) -(You don't have any lockpicks) -(You can't pick the lock with your hands bound) -(You can't pick the lock with your hands bound) -(After a while, you free the SPEAKER)|Thank you!|Let's get moving! -(After a while, you free the SPEAKER)|Thank you!|Let's get moving! -(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...) -(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...) -(You don't have enough mana for a command word) -(You don't have enough mana for a command word) -(Try as you might, your mouth is sealed tight) -(Try as you might, your mouth is sealed tight) -(You utter a command word to free the SPEAKER)|Many thanks!|Let's go! -(You utter a command word to free the SPEAKER)|Many thanks!|Let's go! -(You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) -(You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) -Use a key to unlock her -Use a key to unlock her -Try to pick her restraints -Try to pick her restraints -Use a command word -Use a command word -An enemy found you while you were busy! -An enemy found you while you were busy! -(A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door) -(A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door) -(You wake up to find a SPEAKER creeping up outside the door)|You've been marked as a person of interest.|We are here to escort you out of this place. -(You wake up to find a SPEAKER creeping up outside the door)|You've been marked as a person of interest.|We are here to escort you out of this place. -(A SPEAKER wakes you up by banging on the bars)|Hey wake up!|You should join me and my pals here~|Maybe you'll join them once we're out of here? -(A SPEAKER wakes you up by banging on the bars)|Hey wake up!|You should join me and my pals here~|Maybe you'll join them once we're out of here? -(A SPEAKER wakes you up by banging on the bars)|I have been sent to inform you...|...that you are of good standing with the Council.|That being said, I'm only doing this because of procedure. -(A SPEAKER wakes you up by banging on the bars)|I have been sent to inform you...|...that you are of good standing with the Council.|That being said, I'm only doing this because of procedure. -(A SPEAKER wakes you up by banging on the bars)|Greetings, follower of the blessed kitty!|Because of your faith, we have been sent to rescue you! -(A SPEAKER wakes you up by banging on the bars)|Greetings, follower of the blessed kitty!|Because of your faith, we have been sent to rescue you! -(You sense a presence nearby and look up to see a SPEAKER)|Because you are one, we have come to free you.|Do not take this as an excuse|to get yourself into further trouble. -(You sense a presence nearby and look up to see a SPEAKER)|Because you are one, we have come to free you.|Do not take this as an excuse|to get yourself into further trouble. -(A SPEAKER wakes you up with the sound of copious fabric rustling)|Oh why hello there!|Would you be interested in a trial run of my latest product?|Of course, we'll have to get you out of here first... -(A SPEAKER wakes you up with the sound of copious fabric rustling)|Oh why hello there!|Would you be interested in a trial run of my latest product?|Of course, we'll have to get you out of here first... -(A SPEAKER wakes you up by banging on the bars)|Hello my pretty~|I thought to myself I'd rather have you than these folk.|Now why don't you come along and follow me... -(A SPEAKER wakes you up by banging on the bars)|Hello my pretty~|I thought to myself I'd rather have you than these folk.|Now why don't you come along and follow me... -(A SPEAKER wakes you up by banging on the bars)|Um... hello!|I received a quest to help you out of here!|Now, where do we go... -(A SPEAKER wakes you up by banging on the bars)|Um... hello!|I received a quest to help you out of here!|Now, where do we go... -(You wake up to find a SPEAKER whispering to you)|Greetings.|We've been sent to free you.|Let's get moving. -(You wake up to find a SPEAKER whispering to you)|Greetings.|We've been sent to free you.|Let's get moving. -(A SPEAKER wakes you up by banging loudly)|Hey! Good news!|My friends and I came to rescue you! -(A SPEAKER wakes you up by banging loudly)|Hey! Good news!|My friends and I came to rescue you! -(A SPEAKER wakes you up by knocking on the bars)|Hey, wake up.|I happen to like you, so we're going to get you out of here. -(A SPEAKER wakes you up by knocking on the bars)|Hey, wake up.|I happen to like you, so we're going to get you out of here. -(A SPEAKER flashes a bright light in your direction)|Prisoner 74121 located. Commence transfer to different location. -(A SPEAKER flashes a bright light in your direction)|Prisoner 74121 located. Commence transfer to different location. -(A SPEAKER wakes you up)|We came to rescue you. Come on! -(A SPEAKER wakes you up)|We came to rescue you. Come on! -(The bed looks comfy and inviting)|(Napping here will restore up to half of your willpower)|(You can only sleep once per floor, unless jailed) -(The bed looks comfy and inviting)|(Napping here will restore up to half of your willpower)|(You can only sleep once per floor, unless jailed) -(You lay in the bed and doze off...) -(You lay in the bed and doze off...) -(Lie down and sleep) -(Lie down and sleep) -(There is a button on a control panel here.) -(There is a button on a control panel here.) -(You touch the button and it glows, releasing a pulse of energy!) -(You touch the button and it glows, releasing a pulse of energy!) -(PUSH THE BUTTON) -(PUSH THE BUTTON) -(You find a strange elevator with a control panel inside)|(You get the impression this will take you somewhere.) -(You find a strange elevator with a control panel inside)|(You get the impression this will take you somewhere.) -(Are you sure?)|(This seems like a bad idea!) -(Are you sure?)|(This seems like a bad idea!) -(You activate the control panel and begin to descend...) -(You activate the control panel and begin to descend...) -(Take me down!) -(Take me down!) -(I know what I'm doing!) -(I know what I'm doing!) -(The conveyor pulls you into a strange elevator)|(A whir of motors suggests this elevator is about to start...) -(The conveyor pulls you into a strange elevator)|(A whir of motors suggests this elevator is about to start...) -(You manage to scramble out the door!)|(It closes violently behind you...) -(You manage to scramble out the door!)|(It closes violently behind you...) -(The door slams in front of you before you are able to escape!)|(A purple light turns on, revealing a padded interior)|(You feel the elevator begin to descend...) -(The door slams in front of you before you are able to escape!)|(A purple light turns on, revealing a padded interior)|(You feel the elevator begin to descend...) -(There's no point in fighting when you can't win)|(You wait patiently as the elevator descends) -(There's no point in fighting when you can't win)|(You wait patiently as the elevator descends) -(Try to get out! RESISTCHANCE% success chance) -(Try to get out! RESISTCHANCE% success chance) -(Give up and let it take me) -(Give up and let it take me) -(Wait it out) -(Wait it out) -(Mystic energies spring forth from the ground)|(Standing here will fully replenish your passive mana pool)|(One use only) -(Mystic energies spring forth from the ground)|(Standing here will fully replenish your passive mana pool)|(One use only) -(You step on the magical fissue and its energies absorb into you)|(Afterward, the ground crackles and fizzles, but no energy is left.) -(You step on the magical fissue and its energies absorb into you)|(Afterward, the ground crackles and fizzles, but no energy is left.) -(Recharge your mana pool) -(Recharge your mana pool) -Upcast from SPELL -Upcast from SPELL -Upcast Level LEVEL -Upcast Level LEVEL -Prerequisite -Prerequisite -Unlocks: -Unlocks: -You need to learn REQUIREDSPELL before you can learn this one. -You need to learn REQUIREDSPELL before you can learn this one. -You no longer have the will to struggle. -You no longer have the will to struggle. -Help yourself! -Help yourself! -You eat the delicious food and feel your will restored. -You eat the delicious food and feel your will restored. -Your gag prevents you from eating... -Your gag prevents you from eating... -It's a table. -It's a table. -It's a table, with evidence of a grisly deed. -It's a table, with evidence of a grisly deed. -Someone left their cookies unattended. -Someone left their cookies unattended. -You smell delicious pizza. -You smell delicious pizza. -You call for help! -You call for help! -You let out a garbled cry! -You let out a garbled cry! -Your screams are muffled by your gag! -Your screams are muffled by your gag! -You can hardly make a noise... -You can hardly make a noise... -*clink* -*clink* -You yelp as the EnemyName activates your RestraintName -You yelp as the EnemyName activates your RestraintName -That should slow you down! -That should slow you down! -Try running away now~ -Try running away now~ -Initiating prisoner lockdown protocol -Initiating prisoner lockdown protocol -Your RestraintName suddenly snap together as the EnemyName activates them -Your RestraintName suddenly snap together as the EnemyName activates them -Turn Count: -Turn Count: -The Shopkeeper leashes you! -The Shopkeeper leashes you! -You are brought into the Shopkeeper's establishment... -You are brought into the Shopkeeper's establishment... -It seems to be working! The seal on your RESTRAINTNAME is weakened. -It seems to be working! The seal on your RESTRAINTNAME is weakened. -The cursed seal on your RESTRAINTNAME disappears. -The cursed seal on your RESTRAINTNAME disappears. -You are moved along by the conveyor... -You are moved along by the conveyor... -Strange machinery begins sealing you in shiny latex! -Strange machinery begins sealing you in shiny latex! -Metallic arms insert something into you! -Metallic arms insert something into you! -Metallic arms attach a chastity belt over your waist! -Metallic arms attach a chastity belt over your waist! -Metallic arms wrap you in tape! -Metallic arms wrap you in tape! -Metallic arms wrap you in strict restraints! -Metallic arms wrap you in strict restraints! \ No newline at end of file +### Map Particles + +### Distraction Particles + +### Vibration Particles + +### Gag Particle FX + +### Show NPC Status + +### Show Spell Range + +### Trim Edge Walls + +### Fog Shader + +### Light Shader + +### Intense 'Let Go' VFX + +### Enable Toy SFX + +### Enable Fullscreen + +### Hi-Res Distortion (Needs Restart) + +### Hi-Res Model (no restart needed) + +### High Quality Animations + +### Enemy Animations + +### One-Click Move (when slowed) + +### Latch Shift Key + +### Crotch Rope under panties + +### Chastity over Panties + +### Chastity over Harness + +### Chastity Bra over Bras + +### Simple Color Picker + +### Center Player + +### Draw Buffs on Side + +### Show Trajectory on Auto-Path + +### Show Player Facing + +### Show more learnable spells + +### Show Player Buff Auras + +### Show Enemy Buff Auras + +### Minimalist Enemy Auras + +### Pixelated GFX (needs restart) + +### Auto-Crouch when Tripped + +### Retro Animations + +### Flip Status Bars + +### Reduce Accidental Wall Clicks + +### Enable Nipples + +### Show Nipple Toys Over Bras + +### Hide Nipple Clamps + +### Hide Nipple Piercings + +### Use default palette when no outfit is worn + +### Flip Player Display + +### Grayscale when Blind + +### Faster Floater Fade + +### No Damage Floaters + +### Dynamic Armor (must hide armor) + +### Hide floating weapon display + +### Automatically Take All from Chests + +### Helpless! + +### Evaded! + +### Blocked! + +### Resisted Bondage! + +### You bump into a wall. + +### Game Resolution: + +### Resolution (needs reload): + +### Toy Volume: + +### Music Volume: + +### SFX Volume: + +### Animation Time: + +### Map Brightness: + +### Game Font: + +### Button Font: + +### Journey + +### Select a journey. This will determine the ordering of game areas. + +### Standard: The intended experience + +### Random: A chaotic journey + +### Harder: A more difficult journey + +### Select perks to start with. + +### Having 10+ spare points will trigger Hard Mode, granting unique loot. + +### (HARD MODE ENABLED) + +### Advanced start (choose perks) + +### Kinky start + +### Normal start + +### Point Cost: AMOUNT + +### Points Available: AMOUNT + +### Resilient Foes + +### Enemies have 30% more hp. + +### Strong + +### Boosts the Struggle option when escaping. + +### Helpless + +### You are physically weak. Struggling is much less effective. + +### Flexible + +### Slightly boosts the Remove/Unlock option, escaping is 1.5x as fast except picking, and your feet can use items/buckles. + +### Inflexible + +### You get a penalty to the Remove and Unlock action, and escaping is 0.75x as fast. + +### Locksmith + +### You get a bonus to lockpicking, allowing you to pick some high-security locks previously impossible. + +### Clueless + +### You have no idea how to pick locks. Picking is 0.5x as fast and you can't pick most advanced locks. + +### Psychic + +### You no longer drop keys and picks, can unlock yourself with bound hands, and don't need hands for items/potions. + +### Novice + +### All spells above 1st level cost 2x as many spell points. + +### Blessed + +### You can drink mana from the shrine fountains once per floor without chance of punishment. + +### Cursed + +### Goddess reputations can never exceed 25. + +### Submissive + +### Your submissiveness starts at 100 and cannot go below 70. + +### Wanted + +### Your security level starts at 100 and cannot go below 70. + +### Studious + +### You start the game with +1 spell point. Your first two spell categories are free. + +### Meditation + +### You slowly regenerate mana, up to a maximum of 50. + +### Willpower + +### -50% stamina drain from being at high arousal. + +### Bondage Lover + +### Attempting to escape arouses you. + +### Focused Dodge + +### While your miscast chance is 0%, you gain +40 Evasion. + +### Distracted + +### +15% miscast chance (at all times) + +### Brawler + +### Unarmed attacks deal +10 damage and being bound does not decrease unarmed damage. + +### Way of the Squish + +### Unarmed attacks deal grope damage against humans. + +### Way of the Spank + +### Unarmed attacks deal pain damage against humans. + +### Way of the Feather + +### Unarmed attacks deal tickle damage against humans. + +### Harmless + +### Unarmed attacks deal half damage and cost 2x as much stamina. + + + +### Clumsy + +### 0.7x base accuracy + +### Unfocused + +### Accuracy multiplied by 0.9x above 10% distraction, down to 0.6x at 90% distraction. + +### Focused Strikes + +### 90% less accuracy penalty on swung weapons due to distraction. + +### Focused Power + +### 90% less stamina cost penalty on staves and similar weapons distraction. + +### Pristine + +### There are significantly less shiny loot objects in the dungeon. + +### Lost Technology + +### Ancient power cores break with use, and cannot be recharged. + + + +### Unchained + +### Start with high Metal reputation, and all metal restraints are easier to escape from. + +### Damsel in Chains + +### Metal restraints are harder to escape from. + +### Forgetful + +### You don't remember where you've been in the level. 30 turn timer. + +### Cursed Locks + +### Those without keys shall face the Wrath of the Lock. Locked items cannot be cut and are harder to struggle. + +### The magical warding from the lock protects the item. + +### Undeniable + +### Born with an intense submissive desire, you cannot refuse bondage from dialogues. + + + +### Frantic Struggle + +### Your escaping is 3 times as fast, but less efficient in terms of stamina. + +### Escape Artist + +### Start with high Rope reputation, and all rope restraints are easier to escape from. + +### Rope Bunny + +### Rope restraints are harder to escape from. + +### Slippery + +### Start with high Latex reputation, and all latex restraints are easier to escape from. + +### Latex Doll + +### Latex restraints are harder to escape from. + + + +### Escapee + +### Start with high Leather reputation, and all leather restraints are easier to escape from. + +### Leather-Bound + +### Leather restraints are harder to escape from. + +### Slayer + +### You can cast Elemental spells without having the components, at twice the cost. Start w/ Firebolt. + +### Conjurer + +### You can cast Conjuration spells without having the components, at twice the cost. Start w/ Conjure Chain. + +### Magician + +### You can cast Illusion spells without having the components, at twice the cost. Start w/ Shadow Dagger. + +### Narcoleptic + +### You slowly lose stamina over time. + +### Stealth Mission + +### You are harder to detect and there are more chests, but enemies have 50% more HP, are more evasive, and drop no gold. + +### Edging Lovers + +### All humanoids that can bind you also apply edging toys. + +### Denial Lovers + +### All humanoids that can bind you also apply denial toys. + +### Pleasure Lovers + +### All humanoids that can bind you also apply pleasurable toys. + +### Teasing Lovers + +### All humanoids that can bind you also apply teasing toys. + +### Latex Lovers + +### All humanoids that can bind you also apply latex restraints. + +### Leather Lovers + +### All humanoids that can bind you also apply leather restraints. + +### Wolfgirl Lovers + +### All humanoids that can bind you also apply wolfgirl restraints. + +### Maid Lovers + +### All humanoids that can bind you also apply maid restraints. + +### Dress Lovers + +### All humanoids that can bind you also apply dress restraints. + +### Kitty Lovers + +### All humanoids that can bind you also apply kitty restraints. + +### Adv Latex Lovers + +### All humanoids that can bind you also apply advanced latex restraints. + +### Conspicuous + +### Enemies detect you more easily. + +### Bound Power + +### Your damage and evasion increases based on the number of restraints worn, up to +40% when thoroughly bound. + +### Kill Squad + +### Enemies gain increased blindsight and vision radius. + +### Supermarket + +### Commerce shrines can appear in levels and have slightly more items. + +### Price Gouging + +### Items are 5x as expensive in the shop. + + + +### High Security + +### Picks are weaker, and randomly generated locks are harsher. + +### Shoddy Knives + +### Knives break more easily. + +### Oppression + +### Ghosts are less likely to help you. + +### Search Party + +### More enemies spawn during sleep. + +### No Way Out + +### Enemies will always use the tightest restraints possible regardless of willpower. +10 Security level. + +### Deft Footwork + +### You ignore some consequences of being mildly slowed from heels or slime, and you can cast Leg spells while slowed significantly at 50% miscast chance. + +### Poor Form + +### Slowing effects on you are amplified. + +### Poor Coordination + +### You must have both fingers and arms free to cast arm spells. Hand restraints are more effective on you. + +### Deft Fingering + +### You can cast arm spells using just your fingers, as long as your hands aren't bound. + + + +### Well-Equipped + +### Restraints and traps that are limited by level appear sooner, and enemies stack more restraints in general. +10 security level. + +### Quick-Draw + +### Switching weapons and spells does not take a turn. + +### Quick-Scribe + +### Switching spells and casting from spellbook does not take a turn. + +### Disorganized + +### Switching weapons, learning/choosing spells, and casting from spellbook takes 3 turns. + +### Savour the Taste + +### Drinking a potion takes 2 turns + +### Magic Hands + +### Enemies can add restraints underneath existing restraints. + +### Fully Integrated + +### Start with your body sealed in an adhesive layer of latex. + +### Doll Processing + +### Start atop a conveyor on your way to be sealed away inside the Facility. + +### Cyber Doll + +### Start in full Cyber restraints. + +### Fuuka's Pet + +### Start with Fuuka's collar and a few restraints. + +### Fuuka Fan Club + +### All humanoids that can bind you also apply Fuuka's special restraints. + +### Collected + +### Start with The Warden's special belt which punishes you for defiling spell orbs. + +### Enforcers + +### All humanoids that can bind you also apply The Warden's cuffs. + +### Dollmaker's Minions + +### All humanoids that can bind you also apply Cyber Doll restraints. + +### Doll Hunter V + +### You start with the Dollmaker's Visor. + +### Doll Hunter M + +### You start with the Dollmaker's Mask. + +### Persisting Desires + +### Your dark desires are endless. + +### Sugar Rush + +### Consuming sweets makes you hyperactive, decreasing stamina costs and granting free moves. + +### Vengeance + +### Defeating an enemy greatly distracts you. + +### Berserker Rage + +### Melee attacks distract you, but melee (including chain) damage increases by up to 30% at max distraction. + +### Unstable Magic + +### Spells do up to 60% additional damage based on distraction or miscast chance, whichever is higher. + +### Absolute Focus + +### Miscast chance is doubled. + +### Bound Crusader + +### Goddesses will equip restraints upon acceptance of a quest. + +### Nowhere is Safe + +### Beds and furniture are often trapped. + + + +### Quakehoof Associate + +### Start with the Epsilon Collar, which regenerates mana when you play with yourself. + +### Epsilon Collar + +### A collar reserved for the most prestigious of submissives. + +### Restores mana when you play with yourself, but increases the distraction given. Only works when Desire is below the limit. + + + +### Bullet Hell + +### Hides warning lines for non-AoE bullets and projectiles. + +### Bullet Armageddon + +### Hides warning lines for AoE spells, bullets, and projectiles. + +### I have... needs + +### Distraction builds up over time. + +### Hopeless + +### Willpower decays over time. + +### Quickness + +### Grants Quickness after not moving for 4 turns. Quickness lets you move 1 space without ticking the clock. + + + +### Expansive Halls + +### Increases the size of maps by 3 in the long dimension. Maps will be less dense. + +### Gargantuan Halls + +### Increases the size of maps by 6 in the long dimension. Maps will have a mix of tunnels and dead ends. + +### Labyrinthine Halls + +### Increases the size of maps by 9 in the long dimension. Maps will be mostly tunnels. + +### Absurdly Huge Maps + +### (Experimental) Make the maps really really big. Probably breaks the game. + +### Rigger + +### Binding on enemies is 30% stronger. + +### Pacifist + +### All damage dealt to humanoid enemies is reduced by 90% except teasing damage and pain/grope/tickle/charm/psychic/chain/glue. + +### Curse Seeker + +### When you pick up cursed armor or restraints from chests, they equip automatically if able. + +### Burning Desire + +### While above 70% distraction, you ignite nearby objects and gain +25% fire damage. + +### Frigid Personality + +### While below 10% distraction, you gain +10% ice damage and can walk on ice without penalties. + +### Grounded in Reality + +### While at max mana, your attacks deal an additional 30% of their base damage as electric damage. + +### Like the Wind + +### While above 95% stamina, you gain +30 Evasion and your slow level is reduced by 1. + +### Immovable Object + +### While above 90% willpower, you gain +150 Bondage Resist and Earth buff spells cost half mana. + +### Path of Least Resistance + +### While at 0 WP, you gain +35 Evasion and deal 20% of your max WP as soap damage when enemies restrain you. + +### Sticky Situation + +### You take 40% more glue damage. + +### Breathless + +### Taking chain, poison, and crush damage makes you dizzy. + + + +### Kinky Prisoner + +### Guards won't remove restraints unless they have something tighter. +10 Security level. + +### Unfair Doors + +### Doors are harder to open while your hands are bound. + +### You rattle the doorknob uselessly and end up banging on the door. + +### You can't quite get a grip on the doorknob. + +### Someone hears you banging and opens the door from the other side! + +### Someone notices you fiddling with the door and opens it from the other side! + +### The door squeaks open as the latch wasn't fully engaged. + +### You grab the doorknob with your wrists and flex it open. + +### You use your flexible feet to open the door. + +### Poor Technique + +### Instead of fizzling, most miscasted projectiles and AoE spells will target you instead. + + + + + +### Ticklish + +### You take 50% more tickle damage. + +### Stoic + +### You gain +82 tickle resist. + +### Lascivious + +### You take 50% more grope damage. + +### Unperturbed + +### You gain +82 grope resist. + +### Masochist + +### Pain is strongly arousing. + +### Pain Tolerance + +### You gain +200 pain resist. + +### Fashionable + +### When you are jailed, you keep your outfit. + +### Futile Struggles + +### Lose 2 WP every time you remove a non-trivial restraint. + +### Second Wind + +### Regenerate WP when unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, gag, or slows. (Upgrade available in spell tree) + +### Second Wind Perk + +### Regenerate WP when you are unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, or gag bondage, and no slows. + +### Triumphant Wind + +### Second Wind now regenerates up to 25% of your max WP + +### Mental Defiance + +### Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While below 25% WP, quickly convert 'Defiance' into WP. + +### Mental Fortitude + +### Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While above 75% WP but below 100%, quickly convert 'Defiance' into WP. Exclusive with Mental Defiance. + + + +### Locked Up + +### While wearing a chastity belt, your Desire lowers when you perform actions such as defeating enemies, opening chests, and breaking orbs. (Upgrades available in spell tree) + +### Locked Up Perk + +### While wearing a chastity belt, your Desire lowers when you perform actions such as capturing, opening chests, and breaking orbs. + +### Controlled Urges + +### Locked Up is 150% effective. Gain +70 psychic/charm resist from a chastity belt and +30 from a chastity bra. While not wearing a chastity belt, your Desire increases slowly. + +### Ready for Training + +### Locked Up is 200% effective. +25% stamina regen per 100 current DP. Playing with yourself is less effective while vibrators are off or set to edge. Slow level is increased by 1 when you aren't wearing any chastity. + +### Efficient Denial + +### Locked Up is 300% effective. When Locked Up triggers, you gain -30% mana costs and +25% physical damage for 7 turns (35 when opening a chest or breaking orbs). You cannot orgasm unless you are wearing a chastity belt, and slow level is increased by 2. + +### Recalcitrant + +### Relinquish the Locked Up perk. One time only. If you take the perk again, there is no going back. + +### Novice Pet + +### You can now sprint while wearing a petsuit. (Upgrades available in spell tree) + +### Novice Pet Training + +### You can now sprint while wearing a petsuit. + +### Eager Pet + +### +1 slow reduction while wearing a petsuit, but sprint costs are increased by 30% when not wearing a petsuit. + +### Experienced Pet + +### +2 slow reduction total while wearing a petsuit (from +1), but sprint costs are increased by 100% (from 30%) when not wearing a petsuit and slow level is increased by +1. + +### Devoted Pet + +### +3 slow reduction total while wearing a petsuit (from +2), but you cannot sprint (from +100% cost) when not wearing a petsuit and slow level is increased by +2 (from +1). + +### Bad Pet + +### Relinquish the Novice Pet perk. One time only. If you take the perk again, there is no going back. + +### You are an expert in wearing a petsuit and your mobility is increased. + +### You are too used to wearing petsuits! Sprinting is impaired. + +### You are a disobedient pet. You should put on a petsuit! + +### Dominant + +### They're trapped here with you. Ghosts are more helpful, and you can bind enemies that confront you about bondage. + +### Stranger + +### Randomizes your relationship to most factions. + +### Wrong Neighborhood + +### All factions are hostile and united against you. + +### Bandit + +### Start friendly to bandits, and hostile to most other factions. + +### Trespasser + +### You lose reputation with the goddesses every time you advance a floor. + +### Prisoner + +### Start the game as a submissive prisoner wandering the halls. + +### Rusty Bolts + +### Most traps have a 25% misfire chance each time you step on them. + +### Not a Pet + +### Petsuits occur less often. + +### Unmasked + +### Hoods and full-face covering masks do not appear, but blindfolds are more powerful. Does not include kigurumi masks. + +### No Kigurumi Masks + +### Removes face-mimicking masks from the game. + +### No Hoods + +### Removes hoods from the game. + +### No Sense Deprivation + +### Removes sensory deprivation hood/mask from the game. + +### Blackout + +### Blindfolds are stronger. While blindfolded you can only see enemies next to you. + +### No Blindfolds + +### In most cases you will not get blindfolded, except for cloth blindfolds which can be escaped easily. + +### Total Blackout + +### Blindfolds are extremely punishing. + +### Poor Vision + +### Vision radius is significantly reduced. + +### Keen Hearing + +### You can more easily hear enemies and their movements through walls. + +### Archer's Eye + +### +2 vision radius. + +### Night Owl + +### Your vision in dark areas is improved. + +### Fear of the Dark + +### Your vision in dark areas is reduced. + +### Mutually Assured Darkness + +### Darkness is twice as effective in hiding from enemies, but your night vision is also reduced. + +### Stalker + +### Darkness is twice as effective in hiding from enemies. + +### Not a Doll + +### You may still enter Doll Terminals, but enemies will not force you onto doll stands. + +### No Nurses + +### Nurses will not appear in the game. + +### No Police + +### Police-based bounty hunters will not appear in the game. + +### No Brats + +### Submissive enemies won't run away from you. + +### Brats Only + +### Submissive enemies will always be bratty and force you to catch them. + +### More Tape + +### Tape-wielding enemies (such as Tape Bots) occur more frequently. + +### Less Tape + +### Fewer tape-related enemies will appear, although this does not remove tape entirely. + + + +### No Tape Bots + +### The old civilization did not use tape-based restraints in their capture robots. + +### Less Cable Bots + +### The old civilization used significantly less cable-based restraints in their capture robots. + +### No Resin Bots + +### The old civilization did not use crystal resin-based restraints in their capture robots. + +### Lexx Latex Bots + +### The old civilization used significantly less latex-based restraints in their capture robots. + +### More Encasement + +### Enemies that encase you (e.g slimes, latex cubes) will appear more frequently. + +### Less Encasement + +### Fewer encasement-related enemies will appear, although this does not remove them entirely. + +### More Bubbles + +### Enemies that use bubbles (e.g. aqua slimes, water witches) will appear more frequently. + +### Less Bubbles + +### Fewer bubble-related enemies will appear, although this does not remove them entirely. + + + + + +### Trainee + +### Your training has given you access to the powers of the Trainee class. (Aroused mode only) + +### Fighter + +### Your training has given you access to the powers of the Fighter class. + +### Rogue + +### Your training has given you access to the powers of the Rogue class. + +### Wizard + +### Your training has given you access to the powers of the Wizard class. + +### Peasant + +### You possess the agricultural mastery of the Peasant class. + + + +### Panic! (Chests) + +### When you open a trapped chest, you are stunned for 2 turns. + +### Panic! (Traps) + +### When you step on a trap, you are stunned for 2 turns. + +### Panic sets in! (Stunned 2 turns) + +### Butterfingers + +### Having arms bound prevents you from using your hands to struggle or unlock yourself. + +### Weak Grip + +### Having arms bound prevents you from holding weapons or potions. + +### You kneel down so you can reach the potion with your mouth... + +### Can't Hear You! + +### Being gagged blocks you from casting verbal spells regardless of gag power. + +### Smooth Talker + +### Being gagged does not increase your miscast chance for verbal spells unless fully gagged, and reduces gag power by 20%. + +### Hoods and full-face covering masks do not appear, but blindfolds are more powerful. + +### Ball Gag Lover + +### Increase occurrence of ball gags, decrease occurrence of muzzles. + +### Muzzle Lover + +### Greatly increases the occurrence of muzzles. + +### Armbinder Lover + +### More armbinders, less straitjackets. + +### Jacket Lover + +### More straitjackets, less armbinders. + + + + + +### Maid Sweeper + +### Start in a magically locked maid outfit. + +### Wolf Trainee + +### Start in a uniform of a naughty wolfgirl. + +### Latex Toy + +### Start bound in lovely latex restraints. + +### Elemental Slave + +### Start in a full set of magically locked obsidian cuffs. + + + +### Mana Burst + +### While at 100% distraction, you get -100% miscast chance but spending too much mana at once may cause you to go over the edge. + +### Arousing Magic + +### Your magic is powered by otherworldly distracting energies. Casting spells increases distraction based on the mana spent. + +### Clearheaded + +### Magic puts you in a clear state of mind. Casting spells successfully reduces your distraction. + +### Unidentified Wear + +### Enchanted (and cursed) wearables and weapons are unidentified until the item is used. + +### Unknown + +### Copy (clipboard) + +### Paste (clipboard) + + + +### DAMAGEDEALT electric damage conducts to you!!! + +### The pressure fans the flames on you, dealing bonus DAMAGEDEALT fire damage! + +### The RestraintName comes off more easily in the presence of water! + +### You slip on the floor! + +### The air around you is ablaze! (-DamageDealt SP) + +### The Goddess of Illusions shrouds you in shadows! + +### You struggle against your bonds, but a magical force resists! + +### The ropes squeeze you tighter and tighter... + +### Your body sinks deeper into a sea of bindings... + +### You struggle to breath as you are buried alive in squirming ropes... + +### The slime stretches out over your body... + +### The slime continues to engulf you, blocking out your vision... + +### The slime starts to harden, sealing you inside a rubbery prison... + +### You feel a force compelling you to stop resisting... + +### Your body struggles to move as you feel a power sealing you! + +### The sarcophagus' door slides open as you are slowly pulled inside... + +### The hands squeeze you tightly as a shadowy portal appears... + +### More hands clasp over your body as they pull you toward the portal... + +### You struggle to breath as you are pulled into the mass of shadow hands... + +### The world goes dark... + +### You wake up in a different place... + +### Arcane Explosion + +### EnemyName says something incomprehensible! Her spell miscasts! + +### EnemyName fumbles her next move! + +### The EnemyName utters a command word on the TargetName! + +### Nipples + +### Breasts + +### Panties + +### Front + +### Rear + +### Feet + +### Everywhere! + +### Physical Armor: + +### Magic Armor: + +### In the Shadows: You are harder to see. + +### Invisible: You are very difficult to see. + +### Quickness: Your next movement is so fast it doesn't advance a turn. + +### All Damage Reduction: + +### You take PERCENT1 DAMAGETYPE damage, based on PERCENT2 DAMAGETYPE resist and PERCENT3 DAMAGECATEGORY modifier. + +### You deal PERCENT more DAMAGETYPE damage. + +### Your bindings are PERCENT more effective. + +### Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage, for a stamina cost of STMNA. + +### Plugged! + +### Plugged up!!! + +### Denied! You won't be getting off that easy~ + +### Teasing vibrations... + +### Gentle vibrations... + +### Mild vibrations... + +### Strong vibrations! + +### Intense vibrations!! + +### Torturous vibrations!!! + +### Your restraints are restrictive! Struggling is less effective without help. + +### Stunned! You can't move! + +### Your vision is impaired! + +### Arms are bound! + +### Hands are useless! + +### Hands are impaired! Some tasks will be harder... + +### Slow Level 2: Movement significantly impaired! + +### Slow Level 1: Movement slightly impaired. + +### Slow Level 3: Movement severely impaired! + +### Slow Level 4+: Movement is almost impossible. Sprinting and hopping are disabled. + +### Slow Level 10+: Immobilized! + +### Your mouth is free for potion-drinking and spellcasting activities. + +### Your vision is clear. + +### Your hands are unobstructed. + +### Your arms are free to move as you please. + +### Your legs are free and unimpeded. + +### You are gagged! Verbal miscast chance is increased and your potions are less effective! + +### Your mouth is totally filled! You can't drink potions and cant cast verbal spells! + +### Spell Empowerment! + +### Let there be light! + +### You're seeing things... + +### You've been poisoned! + +### -50% MP Cost (Latex) + +### -50% MP Cost (Leather) + +### -50% MP Cost (Metal) + +### -50% MP Cost (Rope) + +### Regeneration + +### -50% MP Cost (Elements) + +### -50% MP Cost (Conjuration) + +### -50% MP Cost (Illusion) + +### Conductive: When you or an enemy takes electric damage, the other takes half of it as well! + +### Lightning Rod: Gain significantly boosted electric resist. + +### Drenched: Grants fire resist, ice/electric weakness, and makes you conductive. + +### Chilled: The cold makes it hard to move! You are slowed. + +### Slimed: It's sticky and dense! You are slowed and 30% more vulnerable to glue damage. + +### Unsteady: You're on loose footing. You are easier to hit and are slowed. + +### Ignore Ice Tiles + +### Ignited: You are dealing fire damage to yourself and nearby enemies! + +### You are on fire and taking damage! + +### Divine Punishment: Deals bonus damage when you hit an enemy. + +### Divine Protection: Automatically blocks the next 3 times an enemy tries to bind you. + +### Divine Cunning: You turn invisible briefly after attacking. + +### -MP Cost (Fire) + +### -MP Cost (Air) + +### -MP Cost (Water) + +### -MP Cost (Earth) + +### Slime Form: You gain bonuses and can slip through bars! + +### Shroud: Visibility decreased, evasion increased. + +### Camoflage: While next to a wall, you are very hard to see. + +### Stone Skin: Increased armor. + +### Darkblade: Increased damage. + +### Runic Ward: Increased Magic Armor. + +### Great Invisibility: It is impossible for enemies to see you. + +### Invisibility: It is very difficult for enemies to see you. + +### Lesser Invisibility: It is harder for enemies to see you. + +### FULL POWER: Cutting power increased. + +### Graceful: Struggling power increased. + +### Iron Blood: Reduced melee cost, increased mana costs. + +### Sleepy: You are sluggish and have a hard time keeping your eyes open. + +### Afterimage: Evasion greatly increased. + +### We did it! We made ourselves invisible--mmmmph!!! + +### You are not currently attempting to disguise yourself. Click to reenable. + +### Your restraints are disenchanted, treating them as nonmagical for purposes of cutting. + +### You can launch another leather restraint instantly! + +### You can launch another Sagitta instantly! + +### You have stored willpower. + +### You have consumed a mote of essence, granting miscast chance reduction. + +### You recapture an essence mote and concentrate on its essence! + +### Choose an essence mote to absorb. + +### Locked Down: Struggling power is greatly reduced. + +### Verbose: You can cast verbal spells while gagged. + +### Dextrous: You can cast arm spells while tied up. + +### Spell Dance: You can cast leg spells while tied up. + +### Bondage Buster: Lazor is charging... + +### Katana: Patience is key... + +### Stormbreaker: You have the Power. + +### Game Setup: + +### Beginner: Get a save code every 3 levels, autosave after each floor + +### Roguelike: No save codes, only autosave + +### Exciting: Orbs give random spells + +### Kinky: No save codes, orbs give random spells, start with very little + +### Journal + +### Change Outfit + +### Reset to Default + +### Outfit Code + +### Confirm Reset? + +### (Your game has been saved) + +### (Copy the code above and save it on your computer to backup) + + + +### Continue... + +### Menu + +### I will simply wait to see what happens. + +### Save my current progress. + +### Give up & delete save + +### Yes, delete my save file! + +### Actually, I will let the enemy capture me instead. + +### Yes, jail me! + +### No, I wish to press on + +### See Perks + +### This chest belongs to the FACTION + +### This belongs to the FACTION + +### Devious Dungeon Challenge is enabled. + +### Waiting for game data... + + + + + +### You have reached the end of the playable portion. + +### Come back later for new dungeons! + + + +### Got the keys! Find the stairs to go to the next floor. + +### You haven't found the keys for this floor yet. + +### Missing key + +### You are protected from damage and can't be bound until the shield is broken! + +### Chance for a spell to fizzle: + +### Dodge Chance: Percent%, based on EVASIONSUM Evasion and EVASIONPENALTY% penalty. + +### Block Chance: Percent%, based on BLOCKSUM Block and BLOCKPENALTY% penalty. + +### Chance to resist a level 10 restraint: AMNT1%, based on AMNT2 Bondage Resist and RESBLKPENALTY penalty. + +### Sight Range: RADIUS + +### Speed: SPD + +### Normal + +### Stunned! + +### Slowed + +### Very Slow + +### Immobile + +### DP: PERCENT% + +### DP: CURRENT/MAX (PERCENT% Desire) + +### SP: CURRENT/MAX + +### Willpower: CURRENT/MAX + +### MP: CURRENT/MAX + +### Mana slowly recovers from a pool equal to POOLMANA. Drink potions to restore the pool. + +### Your Desire is the baseline Distraction you decay toward, and is increased by distracting things. + +### Stamina recovers more quickly when you aren't spending it. + +### Willpower is restored by food, sleep, and potions. Without willpower, it becomes very difficult to escape. + +### Charge is used to power various magic items and weapons. + +### WP: CURRENT/MAX + +### Charge: PERCENT + +### Use Potion + +### MP + +### Go to sleep + +### Call for help! + +### Play with yourself + +### Let go... + +### Call for Help!!! + +### Wait until interrupted + +### Auto-struggle + +### Auto-path + +### Quick-Swap Weapon + +### Inspect + +### Pass NPCs + +### Interact + +### Sprint/Hop + +### Crouch + +### ~ah~ + +### ~mmm~ + +### ~ngh~ + +### ~oh~ + +### (Heavy breathing) + +### (Soft moaning) + +### (Incoherent mumbling) + +### (Loud moans) + +### (Deep breaths) + +### (Uncontrollable moaning) + +### (Horny noises) + + + +### ~mm~ + +### ~mmph~ + +### ~nnn~ + +### ~mmmmm~ + +### You wait. + +### You wait, legs trembling with arousal. + +### You wait, trembling and moaning. + +### You wait to regain your strength. + +### You wait to regain your composure, panting with frustration. + +### You wait to regain your composure, shaking with frustration. + +### You are exhausted from spellcasting. + +### You are feeling tired. + +### You feel exhausted... + +### You feel like you are going to pass out... + +### Start New Game + +### New Game+ + +### Continue Last Save + +### Load Saved Game + +### Save Outfit (overwrite!) + +### Save Outfit (Clothes Only!) + +### Save Keybindings + +### Cancel Changes + +### Return + +### Game Options + +### Load from code + +### Back to main menu + +### Load Mod .zip + +### Delete Mod + +### Clear Perks + +### Config + +### Cancel + +### Filter + +### DANGER: Loading a mod will execute ARBITRARY CODE on your machine. + +### Like connecting to a server, etc. Only load mods from a TRUSTED source. + +### Up + +### Down + +### Left + +### Right + +### Up Left + +### Up Right + +### Down Left + +### Down Right + +### Spell 1 + +### Spell 2 + +### Spell 3 + +### Spell 4 + +### Spell 5 + +### Spell 6 + +### Spell 7 + +### Spell 8 + +### Spell 9 + +### Spell 10 + +### Load Hotbar 1 + +### Load Hotbar 2 + +### Load Hotbar 3 + +### Load Loadout 1 + +### Load Loadout 2 + +### Load Loadout 3 + +### Cycle Spell Page + +### Upcast Spells + +### Cancel Upcast + +### Swap Weapon 1 + +### Swap Weapon 2 + +### Swap Weapon 3 + +### Swap Weapon 4 + +### Weapon Ability + +### Wait + +### Cancel/Back + +### Enter + +### Expand Minimap + +### Zoom Out + +### Zoom In + +### Wait till Interrupted + +### Make Noise + +### Play with Self + +### Message Log + +### Pass thru allies + +### Auto-Struggle + +### Auto-Pathfind + +### Hide Bullets + +### Quick Inventory + +### Inventory + +### Reputation + +### Journey Map + +### Quests + +### Spell List + +### Pause Menu + +### Facilities + +### Current Key Pressed + +### Press a key, then press a button to set that key + +### Floor FLOORNUMBER: DUNGEONNAME + +### Lockpicks: + +### Keys: + +### Magic Keys: + +### Knife: + +### Mag. Knife: + +### You climb down the stairs. The passage closes behind you. + +### You climb back up the stairs. + +### You can't climb down until you get out of this leash... + +### You climb down and find yourself in a strange new place. + +### plus XXX + +### Graveyard + +### Catacombs + +### Overgrown Ruins + +### Lost Temple + +### The Bellows + +### Rundown Laboratory + +### Forgotten Garden + +### Coastal Grotto + +### Kingdom of Ice + + + +### The Mansion + +### Ancient Tombs + +### Magic Library + +### Crystal Cave + +### Cavern + +### Orrery + +### Training Center + +### Rubber Facility + +### Wizards' Den + +### Marble Halls + +### Doll Storage + +### Processing + +### Bandit Hideout + +### Ancient Vault + +### Ancient Halls + +### Slave Market + +### Elevator Hall + +### Dark Passageway + +### Caldera Beach + +### Temple of Air + +### Temple of Fire + +### Temple of Water + +### Temple of Ice + +### Temple of Storms + +### Temple of Earth + +### The Edge of Reality + +### Dark Dimension + +### Lair + +### You search through the debris but find nothing of note + +### You find some gold coins in a corner (+XXX gold) + +### You find a lockpick in a crack between the tiles + +### You find a rusty knife among the rocks + +### You find an ordinary key + +### You find a blue key, glowing with magic + +### You find a bola, crafted by bandits + +### You find some unexploded ordnance. + +### You find a key lying atop an open tome! + +### You find a magical key lying atop an open tome! + +### You find a useful scroll wedged between some treatises! + +### You find a glowing book containing a binding spell! + +### You discover a golden cookie, wrapped in foil. Beside it are two power crystals. + +### You find a golden key surrounded by strange golden crystals. + +### You find a set of strange golden crystals. + +### You find a pack of scrolls used for spellcasting, and some strange golden crystals. + +### You find a pack of scrolls used for spellcasting. + +### You find a glowing scroll of purity. + +### The chest contains gold! (+XXX gold) + +### The chest contains a glowing magical knife! + +### The chest contains a keyring with a glowing magic key! + +### Someone left their keys here... + +### You found some bolas left by bandits. + +### You found some high explosives! + +### You find a magic scroll, which you place in your spellbook. (+SpellLearned) + +### You find an orb containing magical knowledge! (+AMOUNT spell points) + +### You find a weapon! (+WeaponAcquired) + +### You find a wearable item! (+ArmorAcquired) + +### You find gold and a magic trap! (+RestraintType) (+XXX gold) + +### Swirling belts emerge from the chest and leave you bound! (+RestraintType) + +### You find gold and a chastity belt that locks around your waist! (+RestraintType) (+XXX gold) + +### You find gold and a tormenting magical trap! (+RestraintType) (+XXX gold) + +### You find gold, plus a filling and tormenting magical trap! (+RestraintType) (+XXX gold) + +### You find gold, plus a devious magical trap! (+RestraintType) (+XXX gold) + +### Magical runes glow as a trap activates inside the chest! + +### You find a special collar that lets you absorb energy from potions. + +### You find a pair of garish pink high heels with a slippery surface. + +### You find a special gag with a feather duster. + +### You find a gas mask suitable for filtering gases. + +### The pearly chest contains a divine gift! (+ITEMGET) + +### Smoke fills the air around you! + +### You find a magical necklace that seems to concentrate magic. + + + +### You recover some of your lost items! + +### You find a red potion with a sweet scent. + +### You find a blue potion that glows with magical essence. + +### You find a glowing orb, filled with untapped mana. + +### You find three mana orbs strung together! + +### You find several willpower potions. + +### You find several mana potions. + +### You find a green potion, glowing warm with energy. + +### You find a snow-like potion that's cold to the touch. + +### You find a medley of potions. + +### Rarity: + +### Lesser + +### Common + +### Uncommon + +### Rare + +### Very Rare + +### Epic + +### Legendary + +### Supreme + +### Mythic + +### Angelic + +### Divine + +### Quantity: + +### Use One + +### way of the fist + +### Lockpick + +### Exit Keys + +### Adventurer's Outfit + +### Your favorite outfit for adventuring. + +### Your original outfit. No bonuses, no penalties. + +### Tactical Catsuit + +### A sleek catsuit worn by stealth operatives. No frills, no nonsense. + +### Increases stealth by 10% in the dark. + +### Jail Uniform + +### The prisoners are kept in revealing outfits to keep them from hiding things. + +### Designed to make it hard to conceal weapons. Makes you more visible and vulnerable to the cold. + + + +### Wolfgirl Suit + +### An advanced suit designed for sport, breathable and also warm. + +### Made of latex. Resistant to electricity but does not insulate well. + +### Maid Uniform + +### An elegant dress meant to denote a maid's status. + +### Massively increases accuracy against slime mold. + +### Harem Outfit + +### A skimpy outfit with antiquated connotations. + +### Harkening back to an old era. + +### Combat Bikini + +### A minimalist albeit chilly outfit designed for ease of use. + +### Or perhaps it's just sexy... + +### Lingerie + +### A minimalist yet aesthetically pleasing outfit. + +### No bonuses. + + + +### Dragonheart Uniform + +### The uniform of choice for dragonheart of all ranks. + +### It's made of fire-resistant leather, and provides +5 armor. + +### Scientific Uniform + +### An outfit designed to leave little to the imagination. + +### Resistant to electricity but does not insulate well. Provides significant acid and glue protection for scientific purposes. + +### Latex Catsuit + +### An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. + +### Doll Catsuit + +### Resistant to electricity but does not insulate well. + +### Cyber Doll Suit + +### A technologically advanced suit designed for long term wear. Despite being watertight and skintight it has cleaning and ventilation ports that plug directly into doll storage fixtures. + +### Shadow Latex Dress + +### A minidress made from shadow latex, a favorite of otherwordly patrons. + +### Resistant to the elements, but is infused with crystals that amplify psychic damage to yourself. + +### Elemental Slave Dress + +### A minidress made to adorn mortal slaves in the elemental planes. + +### Elven Dress + +### A regal minidress worn by visitors to the forest. + +### Not very good at insulating you from the cold or from touchy fingers. Its elven aura improves accuracy and evasion by +10. + +### Scroll of Sleight + +### The scroll makes your memories of arm movements clear as day! + +### A scroll used by thieves to make their plays in secret. + +### Allows you to cast Arm spells without components for 12 turns. + +### Scroll of Purity + +### The scroll circles around your body and you feel... empty now. + +### A scroll used to enforce chastity within religious orders. + +### Removes all vibrators from your body. + +### Scroll of Speech + +### The scroll makes your gagged speech slightly more intelligible! + +### A scroll used to help translate different languages. + +### Allows you to cast Verbal spells without components for 12 turns. + +### Scroll of Sauntering + +### The scroll lets you move your body in swift and accurate ways! + +### A scroll used by dancers to upgrade their moves. + +### Allows you to cast Leg spells without components for 12 turns. + +### Ancient Key + +### Perhaps it has something to do with ancient restraints? + +### An ancient key plated in gold. It doesnt look like it can open anything... + +### You pick up a shining golden key. + +### You pick up a ReplaceValue. + +### Power Crystal + +### You hold the crystal and the power flows into you. + +### You're not sure how they charged these... + +### A mysterious device used by the old civilization, powering their ancient devices. + +### You are already full of ancient power. + +### Spent Power Crystal + +### You touch the spent crystal and it siphons 100 gold from your bag! + +### You are not sure how to charge this back up. + +### A mysterious device used by the old civilization, now depleted. + +### Gold + +### Key + +### A key. You wonder who it's for? + +### Can be used to unlock one simple or standard-locked restraint, door, or chest. + +### Magic Key + +### A glowing key enchanted with magic that fades with one use. + +### Can be used to unlock a runic lock. + +### A magical key with the power to open blue locks. + +### Blue locks can't be otherwise picked. + +### Magic Knife + +### A magical blade, suitable against ghosts. + +### Deals shadow damage. Can cut enchanted ropes. Offhand: Increase base crit of all magic damage by 20% + +### Bola + +### A pair of weights attached to a rope. Can be thrown. + +### Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. + +### Bomb + +### After a 5 turn fuse, deals 100 blast damage in a 3x3 area. + +### Not a toy! + +### You light the fuse! + +### Knife + +### A tool used to pick locks. + +### Doesn't last forever, but can help in a pinch. + +### lockpick x2 + +### lockpicks x4 + +### Bola x3 + +### Bomb x3 + +### Dynamite x2 + +### Plastic Explosive x2 + +### Mana Potion + +### You sip the mana potion and feel empowered. + +### A rare essence used by mages to recover their strength. + +### Restores 50% max MP instantly. Excess mana goes into the mana pool. + +### Mana Orb + +### You clutch the mana orb and feel its energy. + +### Mystical energies swirl inside a glass form. + +### Adds 200 MP to your mana pool. Requires no hands to use. + +### Stamina Potion + +### You drink the stamina potion and feel invigorated. + +### A potion brimming with heat and energy. + +### Restores 50% stamina and 250% more over 25 turns. Effect does not stack. + +### Willpower Potion + +### You drink the willpower potion and feel motivated. + +### A sweet potion, brimming with determination. + +### Restores 25% willpower instantly. Can be used while gagged. + +### Frigid Potion + +### You chug the concoction and your senses numb, helping you concentrate. + +### Like bottled snow. Helps to get your mind on track. + +### Reduces distraction to 0 and grants additional decay for 50 turns. Can be used while gagged. + +### Smoke Bomb + +### You toss the smoke bomb and it starts emitting a deep haze! + +### You ready a smoke bomb... + +### A type of pyrotechnic often employed by saboteurs. Can be rolled and used without hands. + +### Creates a smoke screen lasting 8 turns. You are harder to see while inside the smoke. + +### Smoke Bomb x3 + +### Flash Bomb + +### Flash Bomb x3 + +### Flashbang x3 + +### You toss the flash bomb and the fuse starts ticking... + +### You ready a flash bomb... + +### A type of explosive used by agents. Blinds nearby targets without causing significant injury. + +### Blinds for 20 turns in a 3x3 area. + + + +### Flashbang + +### You toss the flashbang and the fuse starts ticking... + +### You ready a flashbang... + +### A piece of rare special forces equipment. The secrets of its manufacture are strictly kept by the Alchemist's Guild. + +### Blinds for 24 turns in a 3x3 area. Also Slows and Silences them for half the duration. + +### Blinds for 24 turns in a 3x3 area. And also Slows and Silences them for half the duration. + + + +### Invisibility Potion + +### You chug the concoction and see your body fading away. + +### You feel liquid inside, but you can't see it! + +### Casts Vanish on yourself. + +### Ectoplasm + +### Like a moisturizing cream, except it's made from coagulated souls. + +### Can be used without hands. Just apply directly to the forehead! + +### Makes you harder to see for 10 turns. + +### Earth Rune + +### You smash the rune in front of you, and glowing rocks rise from the earth. + +### It feels unsettling to look at. + +### Creates a 3x3 area of +20 armor centered on yourself for 9 turns. + +### Water Rune + +### You crush the rune in your hand, and it turns into water that coats the floor + +### It feels slimmy. + +### Creates a 3x3 area on you for 9 turns. Gives +30 Magic Armor to friendlies, halves enemy speed. + +### Ice Rune + +### You smash the rune in front of you, and icicles pierce through the floor! + +### It feels cold to the touch. + +### Creates icicles around you for 5-8 turns. They deal 40 damage and freeze for 3 turns. + +### You steal the doll's identification card. + +### Doll ID + +### You apply a clever trick to reset your visor cooldown. + +### A chip used to identify dolls. She must have dropped it. Either way it contains valuable tech... + +### With enough, it can be used to remove Dollmaker's headwear. + + + +### Heart Amulet + +### You find a donut with sprinkles! + +### Donut (Sprinkles) + +### You enjoy the donut and relish in its sweet delights. + +### A delicious fried snack, covered in a sugary glaze and topped with sprinkles. + +### Restores 10% willpower. Takes a few turns to eat. + +### You pick up a sugar cookie slathered in pink frosting! + +### Good-Girl Gift + +### You slowly eat the cookie, savoring its fluffy texture. + +### It tempts you with sweet promises, but something about it feels off... + +### Restores 15% willpower and adds +5 submissiveness. Takes a few turns to eat. + +### You find a chocolate-chip cookie! + +### Cookie (Chocolate Chip) + +### You enjoy the cookie one chocolatey bite at a time. + +### A delicious baked good made with butter, sugar, and chocolate chips, baked until golden brown. + +### The potion was less effective due to your gag! + +### Elven Soap + +### You feel the restraints become loose on your skin! + +### The secret to elven cosmetics and blemish-free skin. + +### Makes you slippery for 100 turns, boosting all forms of struggling. + + + +### Enchanted Grinder + +### The grinder starts spinning for a short time! Its cutting power is immense! + +### The cutting disc is shining and very sharp. + +### Grants significantly increased cutting power for a short time. + +### Dollmaker's Staff + +### You remember this being used on someone else. + +### +15% glue damage. Deals psychic damage. Fully bound enemies captured with this weapon become latex dolls which fight with you. + +### You are unable to control more than 3 dolls. The new doll is protesting and remains bound. + +### Staff of Incineration + +### A magical weapon made for intermediates to use. + +### +25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. Offhand: Applies %fire damage bonus. + +### Staff of Storms + +### +20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. Offhand: Applies electric damage bonus. + +### Staff of Frostbite + +### A magical weapon with a 33% chance to freeze the target for 4 turns. + +### +20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. Offhand: Applies ice damage bonus. + +### Staff of Binding + +### A magical weapon made to use on novices. + +### +20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. Offhand: Applies chain damage bonus. + +### Arcane Orb + +### Look into my eyes... + +### Deals arcane damage. Can be used without hands. Can not critically strike. + +### You find a purple crystal. You feel your mystic powers flood into it. + +### Staff of Flame + +### A magical weapon made for novices to use. + +### +15% fire damage. Deals fire damage. Offhand: Applies passive bonus. + +### Staff of Slime + +### A slimy and magical implement.. + +### +10% glue damage. Deals glue damage. Offhand: Applies passive bonus. + +### Staff of Shocking + +### +10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. Offhand: Applies electric damage bonus. + +### Staff of Permafrost + +### A magical weapon with a 15% chance to freeze the target for 4 turns. + +### +10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration). Offhand: Applies ice damage bonus. + +### Staff of Chains + +### A magical weapon made for novices in the art of bondage. + +### +10% chain damage. Deals chain damage. 150% binding efficiency. Offhand: Applies chain damage bonus. + +### You pick up a staff of chains. You have fond memories... + +### You pick up a staff of binding. You remember these from wizard school... + +### You pick up a staff of the storm. Your hair stands on end. + +### You pick up a staff of incineration. It rumbles with molten fury. + +### You pick up a staff with a name on it: DOLLMAKER + +### You pick up a staff of frostbite. Your hand feels numb just reaching for it. + +### You pick up a staff of the storm. It tingles. + +### You pick up a staff of flames. It feels warm. + +### You pick up a staff of slime. + +### You pick up a staff of permafrost. It feels icy to the touch. + +### Crop + +### For those unruly subs. + +### Deals pain damage. Highly distracting. Offhand: +5 pain damage on attack for 3 stamina. + +### You pick up a riding crop. + +### Scissors + +### Safety first! + +### Deals slash damage. Better than a knife for cutting restraints. + +### You pick up a pair of scissors. + +### Dagger + +### Designed with subterfuge in mind. + +### Deals slash damage. Deals 40 pierce damage instead on unaware targets, before crit modifiers. Offhand: +10% Base Weapon Crit + +### You pick up a dagger. + +### Katana + +### She who strikes first, hits second. + +### Deals slash damage. Deals up to 50 bonus damage by waiting 10 turns between attacks. + +### You pick up a katana. + +### Shadow's Edge + +### For those who truly devote themselves to the cause. + +### Deals shadow damage. Damage is doubled against enemies that are in shadow. + +### You pick up Shadow's Edge. + +### Stormbreaker + +### I have the power! Taking electric damage charges you (1 turn/10dmg). + +### Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. Gives +100 Electric Resist when held. (can be wielded offhand to apply the Electric Resist) + +### You pick up Stormbreaker. + + + +### Rapier + +### For the ostentatious and flashy duelist. + +### Deals slash damage. Deals 50 pierce damage instead on vulnerable targets. + +### You pick up some kind of pretentious sword. + +### Foil + +### En garde! + +### Deals pierce damage. Deals 30 damage instead on vulnerable targets. + +### You pick up a fencing sword. + +### Sledgehammer + +### Do you have what it takes? + +### Deals heavy crush damage and knocks the target back 2 spaces. Deals bonus damage to most solid barricades. + +### You pick up a heavy sledgehammer. + +### Hammer + +### A crude way of fixing your problems. + +### Deals crush damage and knocks the target back. + +### Flail + +### Very fast and hard to dodge as long as you know what you're doing. + +### Also deals 10 damage to targets next to you. Deals crush damage. + +### Spear + +### Speak softly and carry a pointy stick. + +### Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 2 tiles away. + +### Pike + +### An 11 foot pole, for things you wouldn't want to touch with a 10 foot pole. + +### Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 3 tiles away. + +### Bolt Cutters + +### The universal key. + +### Also assists in cutting restraints when equipped. + +### A go-to for travelers and adventurers. + +### Deals slash damage. Offhand: +10 Block + +### Flashlight + +### A weapon of mass illumination. + +### Provides a highly directional light source. + +### You pick up a flashlight. + +### Torch + +### Second only to the mighty towel in usefulness. + +### Deals fire damage. Provides light. + +### Unarmed + +### Fight with your hands and feet. Counts as teasing if arms are free. 50% chance to stun target if the target is disarmed. + +### Deals unarmed damage. + +### Sword + +### the steel is strong, and the blade true. + +### A fast and accurate weapon that deals slash damage. + +### Flamberge + +### A blade forged in magic fire. + +### Deals 20 bonus slash damage on hit. Offhand: Produces light. + +### Escort Drone + +### A semi-autonomous drone with a personal defense beam. Does not require hands to equip. + +### Deals electric damage. 33% chance to stun for 4 turns. + +### Magic Wand + +### Its powers extend beyond the traditional schools of magic. + +### Deals charm damage. 20% chance to stun the target for 2 turns. Offhand: +5 charm damage on attack for 3 stamina. + +### Ice Cube + +### A magical cube of ice that never melts. Convenient! + +### Deals 10 ice damage with a 10% chance to freeze for 1 turn. Slows targets on hit. Offhand: Slows the target. + +### Rope + +### A kidnapper's most versatile tool. + +### Deals chain damage and applies 50 points of binding. + +### Magic Sword + +### Slices through ghosts with ease! + +### A sword that guides itself toward its target, making it easy to hit with. + +### Dragonslaver + +### A powerful weapon with an ancient mechanism that launches binding belts. + +### Deals slash damage. Can make ranged attacks.. Drains 0.75% ancient energy to fire a line of belts that deal 40 chain damage and 40 binding. + +### Metamorphosis + +### You can enter slime form for 25 turns, which lets you pass thru bars, +50 Evasion, and deals 25 glue damage when attacked. + +### Deals glue damage. Roots targets for 2 turns on a hit. Offhand: Roots targets on hit. + +### Four Seasons + +### Activate to reduce the cost of your next fire, water/ice, air/lightning, and earth spell by 50, once per element. + +### Deals shadow damage. +25% fire, ice, soap, crush, electric, blast damage. Offhand: Applies passive bonus. + +### The Arbiter + +### I have altered the rules. Pray I do not alter them further. + +### Deals chain damage with 125% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Weapon Ability: Disarm + +### Bondage Buster EX + +### Can fire a beam (1 turn channel) that deals 30 electric damage and applies an equal amount of energy bondage. Charges when not fired, dealing 90 total damage at 10 turns of charge. + +### Melee mode deals tickle damage and marks enemies as vulnerable for 4 turns. + +### Bondage Buster MK II + +### Can fire a beam (3 turn channel) that deals 35 electric damage in an area and applies an equal amount of energy bondage. While charge is below 50%, has a 10% chance to misfire. + +### Melee mode deals tickle damage and marks enemies as vulnerable for 2 turns. + +### Nevermere Blaster + +### Can fire a blast that deals 25 electric damage. + +### Melee mode deals tickle damage. + +### Blaster Shot + +### You set your blaster to stun and fire! + +### Messenger of Love + +### Love shines in many ways... + +### Can fire an arrow that makes an enemy extremely lustful, causing them to attack others. Lasts forever on lesser enemies, 30 turns on high-level enemies, and 10 turns on bosses. + +### Moirai's Scissors + +### Cutting the threads of fate. + +### Deals slash damage. Ignores up to 100 Magic and Physical armor. Active ability: Spend 50 charge to free all nearby allies and disrobe enemies, increasing charm damage on them by 100% and applying the armor shred. + +### With a single snip of the magic scissors, everyone's clothes fall off. + +### No eligible targets within 4 tiles + +### Latex Projector + +### Deals crush damage. Can be used to spray a '+' shaped pool of slime. + +### Spend 15 charge to create a pool of slime that deals 35 glue damage per tile and slows enemies. + +### Magic Axe + +### Sick and vile, like the hearts of your enemies. + +### Deals slash damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns and applies 60 shadow damage bleed over time to enemies around you. + +### Pickaxe + +### Used for drilling holes in rock and armor. + +### Deals pierce damage. Reduces enemy armor by 15 for 6 turns. + +### Magic Flail + +### A blessed censer that distributes pain equally. + +### Deals crush damage. Deals 20 bonus holy damage to the target and enemies near the target. + +### Magic Spear + +### Seeks and pierces hearts with ease. + +### Deals pierce damage to the target and two squares behind it. Can be used to make a ranged attack. + +### Magic Hammer + +### Made of a magical, resonant material. + +### Deals crush damage and knocks the target back. Helps to bash open restraints while cutting. + +### Icebreaker + +### A frigid magical hammer useful for both climbing up and destroying ice. + +### Deals crush damage. Deals 3x damage to frozen targets instead of 2x. Triggers Shatter. + +### Dreamcatcher + +### Forged in nightmares, woven in steel. Summons a Shadow Warrior on unaware targets for 2% ancient energy. + +### Deals shadow damage. Deals up to 30 bonus psychic damage on unaware (100%) or vulnerable (50%) targets. + +### Axe + +### Great for cutting trees that happen to be underground. + +### Also deals 20 damage to enemies next to you. Deals slash damage. + +### Accuracy: + +### Crit Multiplier: + +### Bind Crit Multiplier: + +### Find the keys.. + +### Find the exit! + +### You are receiving help from a friendly ally. + +### You found a hook you can use to pull on straps and loops. + +### You have access to something sharp and can attempt to Cut restraints, or Remove more effectively. + +### You found a corner to help manipulate buckles and snaps with. + +### You found a crack and could maybe wedge a knife or tool into it to keep it still. + +### You found something sticky and might be able to pull off fabrics. + +### Evasion: + +### Visibility: + + + +### Submissive: Enemies won't attack you, but they will try to play with you. + +### On the Run! Enemies are hostile. + +### Prisoner: Enemies won't attack you unless you are out of jail. + +### Freedom + +### Crawling slowly! + +### Inching slowly! + +### Hopping slowly! + +### Slowed! + +### Immobile! + +### Enclosed! + +### You feel a gentle buzz... + +### Your toys tease you gently... + +### Your toys are vibrating. + +### Your toys are buzzing strongly! + +### Your toys vibrate intensely! + +### The vibration is torturous! + +### Edged! + +### Satisfied. Miscast chance is reduced. + + + +### Damage: + +### Bind: + +### Crit: + +### SP Cost: + +### Cut PWR: AMNT% + +### It appears to be a receptacle + +### Place live crystal + +### Take the crystal + +### You place the crystal into the receptacle and it lights up! + +### You take the crystal from the receptacle and all goes dark. + +### You try to take the crystal but the cage around it is secured with a magic purple lock. + +### Place spent crystal + +### VALUE gold vanishes from your satchel as the receptacle explodes and your crystal is recharged! + +### Nothing seems to happen + +### The EnemyName grabs you by the RestraintName and keeps you in place! + +### The EnemyName grabs you and pulls you!!! + +### The EnemyName misses you! + +### You duck under the EnemyName's attack! + +### You hear a door creak open nearby! + +### You hear the faint sound of a door opening. + +### You hear a door slam shut nearby! + +### You hear a door being shut in the distance. + +### The slime is spreading over your body!!! + +### The slime starts to harden over your skin... + +### The RESTRAINTNAME creates more bindings out of thin air! (+RestraintAdded) + +### A RESTRAINTNAME has appeared around your neck! Beware of additional restraints! + +### The RESTRAINTNAME has run out of bindings to add and has gone dormant for a period of time. + +### Angel + +### You subdue the angel! + +### The angel decides to toy with you while you are trussed up. (DamageTaken) + +### The angel snaps her fingers and divine restraints appear on your body! (+RestraintAdded) + +### The angel snaps her fingers and glowing locks appear on your body! + +### Holy Construct + +### You banish the holy construct! + +### The holy construct emits a searing light! (DamageTaken) + +### The holy construct emits a blinding light! (DamageTaken) + +### The holy construct emits a Binding light! (+RestraintAdded) + +### Be not afraid! I am the courier of a local shrine, and I have come to take your offering. + +### Hold still and I will take the offering... + +### (She takes the gold) + +### Peace be with you! Goodbye! + +### You don't have the gold, do you? + +### But do not fear, we will keep this between you and I... + +### For I will first have a little fun... + +### You have brought this upon yourself, after all. + +### The angel frowns as you attack her, and glowing rings appear. + +### Angel: MMMMMPHH!!! + +### (The angel looks puzzled and unlocks your divine restraints) + +### The EnemyName pulls away your ArmorName!!! + +### There was a bug removing your ArmorName. Please report! + +### The EnemyName bypasses your security to add the RestraintName! + +### The EnemyName tries to restrain you, but you resist the bondage! + +### Resist! + +### Mystic Lock + +### The mystic lock fades, allowing you to pass once more. + +### As you cross the threshold, a mystical lock appears to prevent you from stepping back! + +### Metal Shield + +### The shield falls to the floor. + +### A metal shield blocks your way! + +### Several metal shields block your way! + +### Illusion + +### The illusion vanishes into thin air. + +### Wall + +### The wall shatters into pieces, which fade away slowly. + +### Locked Door + +### The door lock shatters into pieces. + +### Earthen Monolith + +### The monolith recedes into the ground. + +### Static Sphere + +### The sphere shrinks back into the storm dimension. + +### Familiar + +### The familiar dissolves into spectral ash. + +### The doll gives in to her desires and squirms around on the ground. + +### Storm Crystal + +### The storm crystal shatters into many crackling pieces. + +### Fire Mote + +### The fire mote is extinguished. + +### Air Mote + +### The air mote returns to dust. + +### Water Mote + +### The water mote turns into a puddle. + +### Earth Mote + +### The earth mote crumbles. + +### Shadow Warrior + +### The shadow warrior screeches as it vanishes into mist. + +### Allied Golem + +### The words vanish from the golem's forehead as it crashes down. + +### Shopkeeper + +### You have done a terrible deed. + +### Crystal Monolith + +### The crystal fades from the monolith. + + + +### Orb Guardian + +### The Orb Guardian dissolves into sand and bone dust. + + + +### You feel like you have made a grave mistake. + +### Zombie + +### The zombie moans and collapses to the ground. + +### The zombie's charms attach to your body (+RestraintAdded) + +### The zombie caresses your body! (DamageTaken) + +### Maidforce Recruit + +### The maid does a fumbled retreat. + +### The maid uses a fast-binding technique! (+RestraintAdded) + +### The maid snaps a lock on one of your restraints! (DamageTaken) + +### The maid tickles you with her feather duster! (DamageTaken) + +### M.F. 'Unseen Blade' + +### The maid runs back to the shadows. + +### The maid uses secure restraints on you! (+RestraintAdded) + +### The maid stealthily rubs your sensitive areas! (DamageTaken) + +### The maid throws a smoke bomb at the ground! + +### The maid rubs you from many angles! (DamageTaken) + +### M.F. 'Going Loud' + +### The maid lands a kick and stuns you! (DamageTaken) + +### The maid slaps you with a scornful expression! (DamageTaken) + + + +### Heavy Weapons Maid + +### The maid drops her weapon and runs. + +### The maid bonks you with her weapon! (DamageTaken) + +### M.F. 'Parasol' + +### The maid leaps out of sight. + +### The maid caresses your breasts with a smile! (DamageTaken) + +### M.F. 'Master Plan' + +### The head maid surrenders gracefully. + +### The head maid suddenly whips out a restraint and locks it on! (+RestraintAdded) + +### The head maid snaps her fingers and you find your restraints locked! (DamageTaken) + +### The head maid tickles you strategically! (DamageTaken) + +### You are distracted for a moment and suddenly you find yourself in chastity! + +### Fire Elemental + +### The fire elemental dissolves into ash. + +### The fire elemental conjures forged restraints around your limbs! (+RestraintAdded) + +### The fire elemental places a heavy lock on your restraint! (DamageTaken) + +### The fire elemental touches you with her burning finger! (DamageTaken) + + + +### Ranger of the Wild + +### The ranger disappears into the environment. + +### The ranger gropes your chest with a smile on her face! (DamageTaken) + +### The ranger surprises you and binds you! (+RestraintAdded) + +### The ranger slips a lock onto one of your restraints! (DamageTaken) + +### Druid of the Wild + +### The druid calls forth vines to mask her retreat. + +### The druid holds your face and kisses you! (DamageTaken) + +### The druid binds you with mithril restraints! (+RestraintAdded) + +### The druid tosses a lock from her cloak! It finds you and fastens with a click. (DamageTaken) + +### Water Elemental + +### The water elemental melts into a pool of water. + +### The water elemental's song compels you to be bound! (+RestraintAdded) + +### The water elemental sings a song of helplessness. (DamageTaken) + +### The water elemental's song compels you to step forward and receive a binding! + +### The water elemental sings an arousing song! (DamageTaken) + +### Ice Elemental + +### The ice elemental melts into a pool of water. + +### The ice elemental touches you, forming tendrils of ice! (+RestraintAdded) + +### The ice elemental creates icy locks on your restraints! + +### The ice elemental gives a chilling touch to your body! (DamageTaken) + +### Earth Elemental + +### The earth elemental sinks into the ground. + +### The earth elemental pins you and slaps on some restraints! (+RestraintAdded) + +### The earth elemental locks a restraint! + +### The earth elemental dashes through the earth! + +### The earth elemental gives you a soft massage! (DamageTaken) + + + +### Air Elemental + +### There is no more elemental. Must have been just the wind. + +### The air elemental sneakily slips a restraint on! (+RestraintAdded) + +### The air elemental blinks to your position! + +### The air elemental slips a lock on! (DamageTaken) + +### The air elemental spanks you playfully! (DamageTaken) + + + +### Angry Zombie + +### The zombie screams and tumbles to the floor. + +### The zombie swiftly wraps you in charms! (+RestraintAdded) + +### The zombie gropes your body! (DamageTaken) + + + +### Support Drone + +### The support drone retreats to recharge its weapon! + +### The support drone zaps you! (DamageTaken) + +### The Dollmaker commands a drone to attack you! + +### The Dollmaker commands her drones to attack you! + +### Capture Drone + +### The capture drone's latex core overloads! + +### The capture drone grapples you! (DamageTaken) + +### The capture drone wraps you in advanced cables! (+RestraintAdded) + +### The Dollmaker commands a drone to capture you! + +### The Dollmaker commands her drones to capture you! + +### Artistic Zombie + +### The zombie smiles as it collapses to the ground. + +### The zombie swiftly ties you! (+RestraintAdded) + +### The zombie is somehow dextrous enough to lock your restraint! (DamageTaken) + +### The zombie cuddles with your body! (DamageTaken) + + + +### Mage Zombie + +### The zombie frowns and disappears in a puff of ice and ribbons. + +### The zombie smiles as she wraps you in charms! (+RestraintAdded) + +### The zombie's ribbons form magical locks on your body! (DamageTaken) + +### Talisman Zombie + +### The zombie pouts and puts up a shield to let her retreat. + +### The zombie giggles as she wraps you in charms! (+RestraintAdded) + +### The zombie uses a sealing spell to create magical locks! (DamageTaken) + +### Warrior Zombie + +### The warrior zombie yells and falls cinematically. + +### The warrior zombie uses a traditional binding technique (+RestraintAdded) + +### The warrior zombie strikes you with her wooden sword! (+STUN) + +### The warrior zombie runs its fingers along your body! (DamageTaken) + +### The warrior zombie fights using the way of Sword and Lock. (DamageTaken) + +### Rope Artist + +### The rope artist frowns and walks away, looking defeated. + +### The rope artist performs an intricate technique! (+RestraintAdded) + +### The rope artist sneaks a lock onto you while you weren't looking! (DamageTaken) + +### The rope artist smiles and tickles your feet! (DamageTaken) + +### Deputy + +### The deputy surrenders her donuts. + +### The deputy slaps on some cuffs! (+RestraintAdded) + +### The deputy tases you! (Stunned!) + +### The deputy conducts a strip search! (DamageTaken) + +### The deputy performs a security enhancement procedure! (DamageTaken) + +### Ninja Warrior + +### The ninja warrior retreats into the shadows. + +### The ninja warrior uses a traditional binding technique (+RestraintAdded) + +### The ninja warrior tosses a shuriken and hits you! (Stunned!) + +### The ninja warrior uses a lock to give herself the upper hand! (DamageTaken) + +### The ninja warrior uses a subduing technique! (DamageTaken) + +### Ninja Assassin + +### The assassin retreats into the shadows. + +### The assassin uses a traditional binding technique (+RestraintAdded) + +### The assassin uses a subduing technique! (DamageTaken) + +### The assassin stealthily locks your restraint! (DamageTaken) + +### Animated Armor + +### The Animated Armor falls into pieces. + +### The Animated Armor restrains you with shackles (+RestraintAdded) + +### The Animated Armor hugs your body with an iron grip! (DamageTaken) + +### Mimic + +### The mimic spills out its contents. + +### The mimic spits out a restraint which latches onto you! (+RestraintAdded) + +### The mimic tickles you with its tongue! (DamageTaken) + +### Skeleton + +### The Skeleton falls to pieces. + +### The Skeleton restrains you! (+RestraintAdded) + +### The Skeleton tackles you! (DamageTaken) + +### Dragonheart Initiate + +### The Dragonheart Initiate retreats hurriedly. + +### The Dragonheart Initiate apprehends you! (+RestraintAdded) + +### The Dragonheart Initiate squeezes your body! (DamageTaken) + +### The Dragonheart locks your restraint! (DamageTaken) + +### Dragonheart Shield + +### The Dragonheart Shield makes a tactical retreat. + +### The Dragonheart Shield apprehends you! (+RestraintAdded) + +### The Dragonheart Shield bonks you! (DamageTaken) + +### The Dragonheart Shield squeezes your body! (DamageTaken) + +### Ice Dragonheart + +### The Ice Dragonheart retreats in a blast of snow. + +### The Ice Dragonheart apprehends you! (+RestraintAdded) + +### The Ice Dragonheart gives your body a cold touch! (DamageTaken) + +### The Dragonheart uses an icy lock on your restraint! (DamageTaken) + +### Poison Dragonheart + +### The Poison Dragonheart retreats in a green mist. + +### The Poison Dragonheart apprehends you! (+RestraintAdded) + +### The Poison Dragonheart smacks you with her axe! (DamageTaken) + +### The Poison Dragonheart thrums her claws across your figure! (DamageTaken) + +### The Dragonheart locks your restraint using natural magics! (DamageTaken) + +### Crystal Dragonheart + +### The Crystal Dragonheart screams and falls to the ground dramatically. + +### The Crystal Dragonheart apprehends you! (+RestraintAdded) + +### The Crystal Dragonheart squeezes you in a big hug! (DamageTaken) + +### The Dragonheart grows a crystalline lock on your restraints! (DamageTaken) + +### Many crystals rise up out of the ground! + +### A crystal rises up out of the ground! + + + +### Statue + +### The statue topples over! + +### The statue topples over and reveals a mechanism! + +### The statue shoves a gag into your mouth, which inflates to fill the space! (+RestraintAdded) + +### The statue kisses your gag! (DamageTaken) + +### Chaotic Crystal + +### The crystal shatters! + +### The chaotic crystal leeches energy from you! (DamageTaken) + +### Grand Chaotic Crystal + +### The grand crystal shatters! + +### The grand crystal leeches energy from you! (DamageTaken) + +### Crystals erupt from the ground and slowly grow around your limbs! (+RestraintAdded) + +### Soul Crystal + +### The crystal shatters into a puff of soul dust! + +### The soul crystal leeches strength from you! (DamageTaken) + +### Active Soul Crystal + + + +### Shadow Dragonheart + +### The Shadow Dragonheart frowns and runs away. + +### The Shadow Dragonheart apprehends you! (+RestraintAdded) + +### The Shadow Dragonheart conjures a shadowly lock! (DamageTaken) + +### The Shadow Dragonheart extends her scythe and pulls you closer!!! + +### The Shadow Dragonheart catches you with her scythe! (DamageTaken) + + + + + +### Dragonheart Leader + +### The Dragonheart Leader admits defeat. + +### The Dragonheart Leader apprehends you! (+RestraintAdded) + +### The Dragonheart Leader dashes to you! + +### The Dragonheart Leader squeezes your body! (DamageTaken) + +### The Dragonheart Leader uses a lock on you! (DamageTaken) + + + +### Rebel Scum! + +### The Dragonheart Rebel admits defeat. + +### The Dragonheart Rebel apprehends you! (+RestraintAdded) + +### 'En garde!' + +### The Dragonheart Rebel squeezes your body! (DamageTaken) + +### Dryad + +### The dryad sinks into the ground. + +### The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) + +### The dryad sings a song that mesmerizes you! (DamageTaken) + +### The dryad tickles you with a leaf! (DamageTaken) + + + +### Highly-Motivated Doll + +### The doll falls to the ground, moaning loudly. + +### The doll rubs her body against yours. You can feel the conduction. (DamageTaken) + +### The doll tackles you and squeezes you with her trembling legs! (DamageTaken) + +### Dollsmith + +### The dollsmith's suit locks her wrists together and renders her helpless. + +### The dollsmith runs a latex-covered finger across your vulnerable body! (DamageTaken) + +### The dollsmith grabs you and applies her favorite doll restraints! (+RestraintAdded) + +### The dollsmith slaps a lock onto your restraints! (DamageTaken) + +### The dollsmith splashes a red latex concoction onto you! (+RestraintAdded) + +### Dollmaker's Apprentice + +### The dollmaker apprentice's suit becomes rigid and locks her limbs in place. + +### The dollmaker's apprentice squeezes your body with her gloved hands! (DamageTaken) + +### The dollmaker's apprentice uses her staff to encase you in doll restraints! (+RestraintAdded) + +### The dollmaker's apprentice slips a lock onto your restraints! (DamageTaken) + +### The dollmaker's apprentice unleashes a powerful latex blast! (+RestraintAdded) + + + +### ...Alchemist? + +### You rescue the alchemist. + +### The Alchemist restrains you! (+RestraintAdded) + +### The alchemist hugs you in a rubbery embrace! (DamageTaken) + +### The alchemist uses an ornate-looking lock! (DamageTaken) + +### Alchemist + +### The alchemist screams and runs. + +### Alchemist's Pet + +### The wolfgirl escapes! + +### The wolfgirl lunges at you with a powerful kick! + +### The wolfgirl cuddles with you! (DamageTaken) + +### Wolfgirl + +### Wolfguard + +### The wolfguard's suit punishes her for poor performance! + +### The wolfguard lunges at you and strikes you! + +### The wolfguard's escort drones shock you! (DamageTaken) + +### The wolfguard's escort drones deploy some restraints! (+RestraintAdded) + +### Wolfgirl Trainer + +### The trainer retreats! + +### The wolfgirl trainer squeezes your breasts playfully! (DamageTaken) + +### The wolfgirl trainer secures you in training gear! (+RestraintAdded) + +### The wolfgirl trainer pins you and skillfully locks all of your restraints! + +### Nevermere Operative + +### The operative does a fumbled retreat! + +### The Nevermere Operative smiles and gropes your body! (DamageTaken) + +### The Nevermere Operative apprehends you with training gear! (+RestraintAdded) + +### The Nevermere Operative pins you and skillfully locks all of your restraints! + +### Trainer's Apprentice + +### The trainer's apprentice escapes! + +### The trainer's apprentice rubs her claws across your chest playfully! (DamageTaken) + +### The trainer's apprentice secures you in training gear! (+RestraintAdded) + +### The trainer's apprentice adds a lock to your restraints. + +### The Executive + +### The executive surrenders gracefully. + +### The Executive makes a persuasive argument! (DamageTaken) + +### The Executive's drones apprehend you! (+RestraintAdded) + +### The Executive's drones apply high-security locks to your restraints! + +### Wolf Instructor + +### The instructor deploys active camoflague and retreats! + +### The instructor disciplines you! (DamageTaken) + +### The instructor applies advanced training gear! (+RestraintAdded) + +### The instructor adds a lock to your restraints. + +### Nevermere Drone + +### The drone loses power and falls to the ground! + +### A Nevermere Drone takes off! + +### You hear buzzing as several Nevermere Drones take to the air! + +### Swarm of Tape Drones + +### The tape drones lose control and crash all over the place! + +### A swarm of tape drones takes flight! + +### The air fills with buzzing as dozens of tiny drones lift off! + +### The tape drones attach additional sticky layers! (DamageTaken) + +### The tape drones circle around you, wrapping you in tape! (+RestraintAdded) + +### Shield Drone + +### The drone's power source explodes. + +### A Shield Drone takes off! + +### Several Shield Drones take flight, their shields interlinking. + +### Drone Explosion + + + +### Rusty Drone + +### The drone's mechanisms grind to a halt. + +### The drone uses a short-ranged electric attack! (DamageTaken) + +### The drone disassembles itself, revealing a set of restraining cables! (+RestraintAdded) + +### Rusty Auto Taper + +### The auto taper's mechanisms grind to a halt. + +### The auto taper wraps additional layers of sticky tape! (DamageTaken) + +### The wraps you in many layers of tape! (+RestraintAdded) + +### Rubber Blaster + +### The turret enters an unstable state, about to spread rubber all over! + +### The turret defends itself with a close-range electric attack! (DamageTaken) + +### Rubber Launcher + +### Auto Capture Unit + +### The capture unit releases magic smoke and explodes. + +### The capture unit grabs you securely! (DamageTaken) + +### The capture unit extends its appendages and wraps them around you! (+RestraintAdded) + +### The capture unit releases small drones which lock onto your restraints! (DamageTaken) + +### Auto Tape Unit + +### The tape unit releases magic smoke and explodes. + +### The tape unit applies many layers of tape! (DamageTaken) + +### The tape unit fires off many layers of sticky tape! (+RestraintAdded) + +### The tape unit releases small drones which lock onto your restraints! (DamageTaken) + +### Force Field Unit + +### The forcefield unit releases magic smoke and explodes. + +### The forcefield unit zaps you! (DamageTaken) + +### The forcefield unit extends its appendages and wraps them around you! (+RestraintAdded) + +### The forcefield unit releases small drones which lock onto your restraints! (DamageTaken) + +### Force Field Projector + +### The forcefield erupts into a shower of blue sparks! + +### The robot deploys a forcefield! + +### The robot deploys a set of forcefields! + +### Drone + +### The drone fizzles and falls to the ground! + +### The drone zaps you with a restraining energy ray! (DamageTaken) + +### The drone attaches to you! (+RestraintAdded) + +### Cyber Warden + +### The cyber warden's suit goes into lockdown, leaving her wiggling helplessly! + +### The cyber warden applies an advanced locking technology! + +### The cyber warden grabs you and applies a self-tightening restraint! (+RestraintAdded) + +### The cyber warden's touch applies a series of quick electrical shocks! (DamageTaken) + +### The cyber warden's touch applies a series of quick electrical shocks! + +### Auto Enforcer Unit + +### The enforcer unit releases magic smoke and explodes. + +### The enforcer unit fires many cables that squeeze you! (DamageTaken) + +### The enforcer fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) + +### The enforcer releases small drones which lock onto your restraints! (DamageTaken) + +### Artillery Unit + +### The artillery unit releases magic smoke and explodes. + +### The artillery unit fires many cables that squeeze you! (DamageTaken) + +### The artillery fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) + +### The artillery releases small drones which lock onto your restraints! (DamageTaken) + +### The energy bolt hits you and paralyzes you! + +### Energy Bolt + +### Alkahestor + +### The alkahestor resigns to her fate. + +### The alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded) + +### The alkahestor uses an ornate-looking lock! (DamageTaken) + +### The alkahestor shoves you! (DamageTaken) + +### ...Alkahestor? + +### You rescue the Alkahestor + +### Latex Homonculus + +### The latex homonculus melts into sticky rubber. + +### The latex homonculus molds itself into restraints! (+RestraintAdded) + +### The latex homonculus slaps you with its appendages! (DamageTaken) + + + +### Rope Elemental + +### The rope elemental gets knotted and falls to the floor, inert. + +### The rope elemental's limbs lash out at you, wrapping themselves around your body! (+RestraintAdded) + +### The rope elemental squeezes you tightly! (DamageTaken) + +### Leather Elemental + +### The leather elemental sits down and sulks. + +### The leather elemental wraps her long extremities around your body! (+RestraintAdded) + +### The leather elemental strikes you with her leather belts! (DamageTaken) + +### The leather elemental clicks a lock onto your restraints! (DamageTaken) + +### Slime Enthusiast + +### The slime enthusiast screams and runs. + +### The slime enthusiast restrains you! (+RestraintAdded) + +### The slime enthusiast hugs you in a rubbery embrace! (DamageTaken) + +### The slime enthusiast looks happy to make sure your restraints are secure! (DamageTaken) + +### Miner + +### The bandit tosses her pick to the ground and complains about her pay. + +### The miner restrains you! (+RestraintAdded) + +### The miner pins you with the haft of her pickaxe! (DamageTaken) + +### The miner pins you with the haft of her pickaxe and adds a lock! (DamageTaken) + +### You hear a fuse going off... + +### Miner Bomb + +### The bandit cries. You should feel bad. + +### The bandit collapses. + +### The bandit restrains you! (+RestraintAdded) + +### The bandit smiles and applies a lock! (DamageTaken) + +### The bandit caresses your restrained body! (DamageTaken) + +### Shady Dealer + +### The dealer flees, leaving her goods behind. + +### The dealer uses some high-quality restraints on you! (+RestraintAdded) + +### The dealer smiles and applies a lock! (DamageTaken) + +### The dealer kisses and gropes your body! (DamageTaken) + +### That dagger was laced with something... + +### You hear a shattering of glass, suddenly the air around you feels thick and moist... + +### Poison Dagger + +### Lust Bomb + +### Bandit Guard + +### The bandit guard collapses and calls for help. + +### The bandit guard restrains you! (+RestraintAdded) + +### The bandit rubs and caresses your restrained body! (DamageTaken) + +### The bandit scoffs and applies a lock! (DamageTaken) + +### Bandit Chief + +### The bandit scoffs and retreats until next time. + +### The bandit restrains you tightly! (+RestraintAdded) + +### The bandit runs her hands all along your restrained body! (DamageTaken) + +### The bandit chuckles and applies a lock! (DamageTaken) + +### Bandit Pet + +### The bandit blushes and runs away. + +### The girl nervously restrains you! (+RestraintAdded) + +### The bandit tickles you nervously! (DamageTaken) + +### The bandit pet applies a lock! (DamageTaken) + +### Bandit Hunter + +### The bandit hunter retreats. + +### The bandit hunter restrains you! (+RestraintAdded) + +### The bandit hunter caresses your restrained body! (DamageTaken) + +### The bandit hunter calls you an amateur and applies a lock! (DamageTaken) + +### Bandit Grappler + +### The bandit grappler retreats. + +### The bandit grappler loops her chains around you! (+RestraintAdded) + +### The bandit grappler caresses your restrained body! (DamageTaken) + +### The bandit giggles and applies a lock! (DamageTaken) + +### The bandit grappler hooks you closer!!! + +### Mummy + +### The Mummy collapses and her body vanishes. + +### The Mummy conjures a mystic wrapping! (+RestraintAdded) + +### The Mummy conjures a magical lock upon you! (DamageTaken) + +### The Mummy punishes you with a blow from her staff! (DamageTaken) + +### Cursed One + +### The Cursed One is drawn into an eldritch portal. + +### The Cursed One's bindings transfer to you! (+RestraintAdded) + +### The Cursed One's bindings emit a strange aura... (DamageTaken) + +### Floating Wrapping + +### The wrapping falls to the floor, its magic spent. + +### The floating wrappings attach to you! (+RestraintAdded) + +### The wrappings grip you tightly and squeeze you! (DamageTaken) + +### Animated Sarcophagus + +### The sarcophagus falls to the ground and crumbles. + +### The sarcophagus emits long wrappings that pull you closer! (+RestraintAdded) + +### The sarcophagus emanates a strange power! (DamageTaken) + +### Bast Warrior + +### The Bast Warrior collapses and meows loudly. + +### The Bast Warrior restrains you! (+RestraintAdded) + +### The Bast Warrior tickles you with her claws! (DamageTaken) + +### The Bast Warrior pulls out a lock and slips it on! (DamageTaken) + + + +### Bast High Cleric + +### The Bast High Cleric vanishes into a puff of ribbons. + +### A ray of light shoots out and paralyzes you! (DamageTaken) + +### The Bast Cleric conjures wrappings upon you! (+RestraintAdded) + +### The Bast Cleric conjures a lock and slips it onto you! (DamageTaken) + + + +### Bast Cleric + +### The Bast Cleric collapses and meows softly. + +### The Bast Cleric restrains you! (+RestraintAdded) + +### The Bast Cleric pulls out a lock and slips it on! (DamageTaken) + +### High Cleric + +### The High Cleric locks herself in ritual bondage as punishment for failure. + +### The High Cleric holds up her staff and you feel intense vibrations throughout your body! (DamageTaken) + +### The High Cleric summons animated restraints to bind you! (+RestraintAdded) + +### A flurry of mummy wrappings encase you and stun you! (DamageTaken) + +### The High Cleric smiles as she conjures many locks on your restraints! (DamageTaken) + +### The skeleton falls to pieces. + +### Ghost + +### The ghost vanishes. + +### The Ghost restrains you! (+RestraintAdded) + +### The Ghost enters your clothing and vanishes! + +### Revenant + +### The revenant pouts as it vanishes. + +### The revenant restrains you! (+RestraintAdded) + +### The revenant squeezes your breasts and slows you! (DamageTaken) + +### The revenant grabs you and caresses your tummy! (DamageTaken) + +### Skeleton Warrior + +### The skeleton warrior collapses and falls into pieces. + +### The Skeleton lands a wide, crippling blow! (DamageTaken) + +### The Skeleton leashes you! + +### Skeleton Knight + +### The skeleton knight collapses and falls into pieces. + +### The skeleton apprehends you and pins you with the haft of its axe! (DamageTaken) + +### The skeleton grabs you and slips a black cuff on! (+RestraintAdded) + +### Vine Plant + +### The plant leaks purple juices everywhere as it wilts. + +### The vine plant whips you with its tendrils! (DamageTaken) + +### The vine plant wraps its tendrils around you! (+RestraintAdded) + +### The vine plant grips you tightly! (DamageTaken) + +### Vine Spitter + +### The vine spitter leaks purple juices everywhere as it wilts. + +### The vine spitter slaps you with its tendrils! (DamageTaken) + +### The vine spitter wraps its tendrils around you! (+RestraintAdded) + +### The vine spitter grips you tightly! (DamageTaken) + +### Bramble + +### The brambles are hacked away. + +### The bramble snares you! (DamageTaken) + +### The red liquid bubbles and several round slimes pop out! + +### The red liquid bubbles and a round slime pops out! + +### A revenant appears! + +### Fuuka uses a talisman to call forth the spirits of her pets! + +### A pool of latex bubbles and a twisted elemental appears! + +### Latex Homunculus + +### Red Slime + +### The red slime bounces away. + +### The red slime bounces off you! (DamageTaken) + +### The slime shoves itself into your mouth! (+RestraintAdded) + +### Slime Mold + +### The slime mold explodes into small puffs. + +### The slime mold is sticky and gross! (DamageTaken) + +### The slime mold attaches itself to your body! (+RestraintAdded) + +### Mold Puff + +### The mold puff explodes into small puffs. + +### The mold puff is sticky and gross! (DamageTaken) + +### The mold puff leaps through the air! + +### The mold puff attaches itself to your body! (+RestraintAdded) + +### Slime Mold Nest + +### The slime mold nest erupts into a shower of black particles! + +### Many small pieces of slime mold break off! + +### A mobile cyst emerges from the slime mold nest! + +### Factory Doll + +### The doll is subdued. + +### Freed Doll + +### The doll returns to her place. + +### Encased Adventurer + +### The encased adventurer loses hope. + +### The encased adventurer moans as she throws herself against you for help! (DamageTaken) + +### The encased adventurer sticks to you as she mumbles incoherently! (DamageTaken) + +### The encased adventurer pleads for help as her slime spreads to you! (+RestraintAdded) + +### Slime + +### The slime melts into a puddle. + +### The sticky slime splashes against you! (DamageTaken) + +### The slime attaches itself to your body! (+RestraintAdded) + +### Bouncy Slime + +### The bouncy slime splashes against you! (DamageTaken) + +### The bouncy slime leaps to you! + +### The bouncy slime attaches itself to your body! (+RestraintAdded) + +### Fast Slime + +### The sticky slime leaps and splashes against you! (DamageTaken) + +### The slime leaps and attaches itself to your body! (+RestraintAdded) + +### Large Slime + +### The large slime splits apart! + +### The slime spreads to your body! (+RestraintAdded) + +### The slime splits into many smaller droplets! + +### The Skeleton falls into pieces. + +### The Skeleton latches onto you! + +### Rope Tentacle + +### The rope kraken retreats its tentacle. + +### The rope kraken squeezes you with one of its tentacles! (DamageTaken) + +### Rope Kraken + +### The rope kraken devolves into a bundle of premium bondage rope. + +### The rope kraken tightly cinches itself around your body! (DamageTaken) + +### Magic Rope + +### The magic rope returns to being a normal rope. + +### The magic rope wraps itself tightly around your body! (+RestraintAdded) + +### The magic rope wriggles into your outfit! (DamageTaken) + +### Cloud of Feathers + +### The feathers fall to the floor. + +### The feathers tickle you mercilessly! (DamageTaken) + +### Cloud of Scarves + +### The scarves become knotted and fall to the floor. + +### The scarves wrap themselves around you! (+RestraintAdded) + +### The scarves rub against your body, wrapping you in fluffy fabric! (DamageTaken) + +### Cloud of Ribbons + +### The ribbons knot themselves in a bow and fall to the floor. + +### The ribbons wrap themselves around you! (+RestraintAdded) + +### The ribbons wrap themselves around you! (DamageTaken) + +### Gravitating Gag + +### The gag buckles itself in place and falls. + +### The gravitating gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) + +### The gravitating gag rubs itself against your lips! (DamageTaken) + +### The gag dashes to you! + +### Seductive Shackles + +### The shackles' chain breaks as they fall to the floor. + +### The shackles force themselves around your limbs and click tightly! (+RestraintAdded) + +### The shackles click seductively in your face... (DamageTaken) + +### The shackles dash to you! + +### Lurid Legbinder + +### The legbinder unravels. + +### The legbinder zips itself around your legs and squeezes them together! (+RestraintAdded) + +### The legbinder wraps around and squeezes your body! (DamageTaken) + +### Bratty Blindfold + +### The blindfold floats to the floor. + +### The blindfold buckles itself tightly around your head! (+RestraintAdded) + +### The blindfold crawls over your helpless face! (DamageTaken) + +### The blindfold dashes to you! + +### Amorous Armbinder + +### The armbinder flops to the floor. + +### The armbinder slips itself around your arms and pushes your elbows together! (+RestraintAdded) + +### The armbinder rubs itself all over your body! (DamageTaken) + +### Stringent Straitjacket + +### The straitjacket falls apart. + +### The straitjacket slips itself on over your head and pulls your arms close to your body! (+RestraintAdded) + +### The straitjacket squeezes you tightly! (DamageTaken) + +### Brusque Belt + +### The chastity belt falls to the floor with a clang. + +### The chastity belt secures itself around your waist! (+RestraintAdded) + +### The chastity belt buzzes against your body alluringly! (DamageTaken) + +### Yammering Yoke + +### The yoke falls to the floor with a loud clang. + +### The yoke clasps your arms tightly and forces them to the sides! (+RestraintAdded) + +### The yoke makes alluring clicking noises! (DamageTaken) + +### Haughty Harness + +### The harness unravels. + +### The harness buckles itself tightly around your body! (+RestraintAdded) + +### The harness dashes to you! + +### The harness wraps itself around your body and squeezes! (DamageTaken) + +### Levitating Locks + +### The locks and chains fall to the floor in a loud crash. + +### A lock clicks itself onto one of your restraints! (+RestraintAdded) + +### A chain locks itself in place on your body! (DamageTaken) + +### The lock dashes to you! + +### The floating locks and chains rub themselves across your body! (DamageTaken) + +### Masterful Lock + +### The lock falls to the floor, disenchanted. + +### The Masterful Lock clicks seductively in your face! (DamageTaken) + +### The Masterful Lock conjures a lock onto one of your restraints! (DamageTaken) + +### Conjured Gag + +### The conjured gag buckles itself in place and falls. + +### The gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) + +### The gag rubs itself against you! (DamageTaken) + +### Learned Rope + +### The learned rope untangles into a mess of rope. + +### The magic rope wraps itself intricately around your body! (+RestraintAdded) + +### The rope dashes to you! + +### Unforseen Rope + +### The unforseen rope is gone... or is it? + +### The unforseen rope wraps itself clandestinely around your body! (+RestraintAdded) + +### The unforseen rope wriggles into your outfit! (DamageTaken) + +### Monster Rope + +### The monster rope bundle collapses into a pile of ropes. + +### The magic rope wraps itself overwhelmingly around your body! (+RestraintAdded) + +### Shock Witch + +### The shock witch vanishes into a cloud of thunder, leaving behind a keyring. + +### The witch restrains you! (+RestraintAdded) + +### The witch dangles a lock in front of you before putting it on! (DamageTaken) + +### The witch slaps you playfully! (DamageTaken) + +### Flame Witch + +### The flame witch vanishes into a pile of ash. + + + +### Earth Witch + +### The earth witch vanishes into a pile of ash. + +### Water Witch + +### The water witch vanishes into a pile of ash. + + + +### Aqua Witch + +### The aqua witch vanishes into a pile of ash. + +### Ice Witch + +### The ice witch vanishes into a pile of ash. + + + +### Magic Stone + +### Ice Bolt + +### Waterblast + + + +### Rope Witch + +### The rope witch retreats as her animated ropes chase her. + +### Magnet Witch + +### The witch is pulled away by an unseen force. + +### The witch's restraints fly out and attach themselves to you! (+RestraintAdded) + +### The witch's lightning causes your body to tingle! (DamageTaken) + +### Mage's Apprentice + +### The apprentice runs off and cries in a corner. + +### The apprentice animates restraints to wrap around you! (+RestraintAdded) + +### The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) + +### The apprentice slaps you playfully! (DamageTaken) + +### Summoner's Apprentice + +### The apprentice summons a restraint onto you! (+RestraintAdded) + +### The apprentice tickles you playfully! (DamageTaken) + +### Witch's Apprentice + +### The witch's apprentice confidently admits defeat. + +### The witch's apprentice conjures magic bindings on you! (+RestraintAdded) + +### The witch's apprentice smiles and summons a lock onto you! (DamageTaken) + +### The witch's apprentice smiles as she squeezes your chest! (DamageTaken) + +### Latex Apprentice + +### The apprentice attaches a sticky restraint! (+RestraintAdded) + +### The apprentice caresses you playfully! (DamageTaken) + +### Chain Witch + +### The chain witch vanishes into a pile of metal dust, leaving behind a keyring. + +### The chain witch locks all of your restraints! + +### The witch's bindings wrap themselves around you! (+RestraintAdded) + +### The chain witch tugs sensually at your restraints! (DamageTaken) + +### Metal Witch + +### The metal witch vanishes into a pile of metal dust, leaving behind a keyring. + +### The metal witch locks all of your restraints! + +### The metal's bindings wrap themselves around you! (+RestraintAdded) + +### The metal witch tugs sensually at your restraints! (DamageTaken) + +### Slime Witch + +### The slime witch vanishes into a pool of pink slime, leaving behind a keyring. + +### The witch touches her with her sticky grasp! (+RestraintAdded) + +### The witch creates a magical lock made of hardened latex! (DamageTaken) + +### The witch squeezes your body playfully! (DamageTaken) + +### 'High' Wizard + +### The wizard falls asleep. + +### The wizard clips a restraint around your neck! (+RestraintAdded) + +### The wizard clips a lock to your restraints! (DamageTaken) + +### The wizard laughs maniacally as she tickles you! (DamageTaken) + +### FunGal + +### The fun-gal retreats into the ground. + +### The fun-gal clips a restraint around your neck! (+RestraintAdded) + +### The fun-gal produces a magical lock on all your restraints! (DamageTaken) + +### The fun-gal rubs your chest with her long, slender fingers! (DamageTaken) + +### Crystal Slash + +### Crystal Bolt + + + +### Tailor + +### You rob the tailor! + +### Student + +### You rob the student! + +### Tactician + +### You rob the tactician! + +### Informant + +### You rob the informant! + +### Thug + +### You rob the thug! + +### Antique Merchant + +### You smash the antique merchant! + +### Blacksmith + +### You rob the blacksmith! + +### Armorer + +### You rob the armorer! + +### Bowyer + +### You rob the bowyer! + +### Not a Kidnapper + +### You bring the kidnapper to justice! + +### Dressmaker + +### The dressmaker storms out in a rage. + +### The dressmaker has you try on one of her new accessories! (+RestraintAdded) + +### The dressmaker adds a lock 'just to complete the look, you know?' + +### The dressmaker cuddles your helpless body~ (DamageTaken) + +### Nurse + +### The Nurse checks her notes and runs off. + +### The Nurse tries to pacify this rowdy patient! (+RestraintAdded) + +### The Nurse adds a lock to keep you from hurting the staff. + +### The Nurse assures you it's going to be alright~ (DamageTaken) + +### Librarian + +### The librarian gets angry and retreats. + +### The librarian shushes you as she brandishes a restraint! (+RestraintAdded) + +### The librarian snaps her fingers and sends a lock flying at you! + +### The librarian whispers seductively into your ear! (DamageTaken) + + + +### Stone Door + +### The stone door crumbles! + +### Steel Door + +### The stone door crumples inward! + +### Control Room Door + +### The door flies open as the Dollmaker chuckles at you! + +### Giant Mushroom + +### The giant mushroom explodes into a cloud of spores!!! + +### Army Mushroom + +### The army mushroom explodes into a cloud of spores!!! + +### The army mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) + +### The army mushroom spits spores into your face and tries to tie you! + +### The army mushroom emits soporific spores! (DamageTaken) + +### Delicious Mushroom + +### The delicious mushroom explodes into a cloud of spores!!! + +### The delicious mushroom tickles you silly! + +### The delicious mushroom tickles you silly! (DamageTaken) + +### Infected Mushroom + +### The infected mushroom explodes into a cloud of spores!!! + +### The infected mushroom gives you a crushing hug! + +### The infected mushroom gives you a crushing hug! (DamageTaken) + +### Jailer + +### The jailer passes out and drops her possessions! + +### The jailer locks your restraints! + +### The jailer places some restraints on you! (+RestraintAdded) + +### The jailer plays with you, groping and rubbing your body! + +### The guard checks your restraints to make sure they are secure. + +### Guard + +### The guard passes out and drops her possessions! + +### The guard locks your restraints! + +### The guard places a NewRestraintName on you + +### The guard plays with you, groping and rubbing your body! + +### Armed Guard + +### The armed guard retreats, but drops a keyring! + +### The guard shocks you and slaps on some restraints! (+RestraintAdded) + +### The guard shocks you with her taser!!! + +### The EnemyName applies a NewRestraintName over your OldRestraintName + +### The EnemyName removes your OldRestraintName + +### The EnemyName restrains you with a NewRestraintName + + + +### Master Conjurer + +### The conjurer retreats into a portal! + +### The master conjurer waves a hand, and locks appear on all your restraints! + +### The master conjurer summons a restraint directly onto you! + +### The master conjurer tickles you playfully! + + + +### Frog + +### The frog jumps away! + +### The frog pulls you with its tongue!!! + +### The frog licks you! + +### Toad + +### The toad jumps away! + +### The toad pulls you with its tongue!!! + +### The toad licks you! + +### Shadow Hand + +### The shadow hand retreats into the darkness... + +### The shadow hand latches onto you!! (+RestraintAdded) + +### The shadow hand stretches its fingers across your body! (DamageTaken) + +### A dark hand stretches out beyond the shadows... + +### Several dark hands emerge from the shadows! + +### Corrupted Adventurer + +### The corrupted adventurer falls into a deep sleep. + +### The corrupted aventurer's many arms latch onto you! (+RestraintAdded) + +### The corrupted aventurer clicks a lock on from behind you! (DamageTaken) + +### The corrupted adventurer drags her chilling fingers across your vulnerable skin! (DamageTaken) + + + +### Shadowy Ghast + +### The shadowy ghast screeches and disappears... + +### The shadowy ghast latches onto you with its long arms! (+RestraintAdded) + +### The shadowy ghast grips you in its chilling embrace! (DamageTaken) + +### Corrupted Elemental + +### The corrupted elemental dissolves into shadows. + +### The corrupted elemental reaches out and touches you, forming metallic restraints! (+RestraintAdded) + +### The corrupted elemental uses its chains to lock your restraints! (DamageTaken) + +### The corrupted elemental grips you and drains your willpower! (DamageTaken) + +### Star Demon + +### The star demon is exorcised. + +### The star demon places you in shining, starry restraints. (+RestraintAdded) + +### The demon giggles as it locks your restraints! (DamageTaken) + +### The star demon places you under its curse! (DamageTaken) + +### The strings of fate glisten and wrap around you! + +### Many shining strings surround you! + +### Stepping outside of the indicated tiles will result in punishment! + +### Bindings of Fate + +### Moon Demon + +### The moon demon is exorcised. + +### The moon demon places you in shining, starry restraints. (+RestraintAdded) + +### The moon demon places you under its curse! (DamageTaken) + +### The weight of inescapable bondage falls upon you! (DamageTaken) + +### Crushing Fate + +### Void Demon + +### The void demon is exorcised. + +### The void demon places you in dark, glassy restraints. (+RestraintAdded) + +### The void demon places you under its curse! (DamageTaken) + +### You are sucked in by a powerful gravitational force!!! (DamageTaken) + +### You are sucked in by a powerful gravitational force!!! + +### The demon cracks its knuckles as it locks your restraints! (DamageTaken) + +### Cosmic Force + + + +### Demon + +### The demon is exorcised. + +### The demon places you in dark, glassy restraints. (+RestraintAdded) + +### The demon caresses you gently with her sharp nails! (DamageTaken) + +### The demon stuns you with her heavy mace! (+STUN) + +### Tickle Hand + +### The hand vanishes! + +### The hand tickles you! (DamageTaken) + +### Tickle Terror + +### The tickle terror vanishes... for now + +### The monstrous spirit tickles you mercilessly!!! (DamageTaken) + +### The monstrous spirit binds you to make you more vulnerable! (+RestraintAdded) + +### Hug Horror + +### The hug horror vanishes... for now + +### The monstrous spirit gives a crushing hug!!! (DamageTaken) + +### The monstrous spirit envelops you in tightness, holding you in place! (DamageTaken) + +### The monstrous spirit's chains latch on! (+RestraintAdded) + + + +### Greedy Ghast + +### The ghast vanishes... for now + +### The moaning spirit runs its hands all across your body!!! (DamageTaken) + + + +### Tome of Chains + +### The floating tome burns into ashes! + +### Tome of Belts + +### Tome of Ropes + +### Tome of Bondage + +### Tome of Light + +### Tome of Magic + +### Tome of Ice + +### Tome of the Abyss + +### Tome of Nature + +### Tome of Thunder + +### Tome of Latex + +### Tome of Laughs + + + +### You are grabbed and led to a prison... + +### Perhaps they may release you if you behave... + + + +### Necromancer + +### The necromancer faints. Ironic that she couldn't save herself. + +### The necromancer locks all of your restraints! + +### The necromancer prepares you for transport! + +### The necromancer rubs your body sensually! + +### Filthy Rat + +### The rat skitters back into a hole in the wall. + +### The filthy rat nibbles at you! (DamageTaken) + +### Annoying Bat + +### You stomp the bat into the ground to make sure it's dead. + +### The bat nibbles incessantly at you! (DamageTaken) + +### Pixie + +### The pixie huffs and floats away. + +### The pixie tickles you with a feather! (DamageTaken) + +### Orb of Light + +### The orb vanishes in a flash of light. + +### The orb blinds you with its intense light!!! (DamageTaken) + +### A light restores the will of its allies! + +### You do not have enough resources to cast the spell! + +### AttackName hits TargetEnemy for DamageDealt DamageType damage! + +### AttackName hits TargetEnemy for a decreased DamageDealt DamageType damage! + +### AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! + +### AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! + +### AttackName hits TargetEnemy, but your DamageType weapon has no effect! + +### AttackName hits TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! + +### AttackName hits TargetEnemy for a reduced DamageDealt DamageType damage! + +### AttackName hits TargetEnemy but DamageType damage doesn't have any effect! + +### AttackName hits TargetEnemy for DamageDealt DamageType damage, reduced by an anti-magic ward! + +### Your attack + +### An effect + +### You miss the TargetEnemy! + +### Your attack is too feeble to hurt the TargetEnemy! + +### Your attack was absorbed by the TargetEnemy's shield! + +### You try to pull the TargetRestraint off... + +### You try to squirm and moan out of the TargetRestraint... + +### You tug on the TargetRestraint with increased power... + +### Your ally helps you try to pull the TargetRestraint off... + +### You work on picking the TargetRestraint... + +### Your trembling hands work on picking the TargetRestraint... + +### You work on picking the TargetRestraint with your powers... + +### Your ally tries to pick the lock on your TargetRestraint... + +### You try to pick open the TargetRestraint but break your lockpick. + +### You break your lockpick trying to open the TargetRestraint. + +### You try to remove the TargetRestraint... + +### You shakily try to remove the TargetRestraint... + +### You try to remove the TargetRestraint with a tool... + +### Your ally helps you remove the TargetRestraint... + +### You try to cut the TargetRestraint... + +### You tremble as you try to cut the TargetRestraint... + +### You try to cut the TargetRestraint using your tools... + +### You try to cut the TargetRestraint with help... + +### You break your knife trying to cut the TargetRestraint. + +### You fiddle with the key on the TargetRestraint... + +### Your jittering hands fumble with the key on the TargetRestraint... + +### You concentrate on unlocking the TargetRestraint... + +### You work on unlocking the TargetRestraint with help... + +### The lock requires a key. + +### The lock can only be opened with a key. + +### The magical lock only accepts magical keys and can't be picked. + +### The magical lock is guarded with powerful magic. You'll have to wait for it to wear off... + +### The item is cybernetically locked. You will need a key card to unlock it. + +### This lock requires a command word to unlock. It doesn't have a keyhole. + +### You don't have a key for this lock. + +### The lock seems to be magical and rejects all picking attempts! + +### The lock is definitely magical and forces your pick out! + +### The lock is divine. A mortal shouldn't even try to pick it. + +### You must perform your quest! Don't even think of unlocking it... + +### You're not sure a key for this even exists in the mortal realm. + +### The lock is made of solid rubber. You can't pick that. + +### You need something sharp to cut the lock. + +### The lock doesn't even have a keyhole to pick! + +### You need a special tool to pick this kind of lock. + +### The lock is technological and does not use a key. + +### The lock is brimming with security features and is nigh impossible to pick! + +### The lock is encased in magical crystals that block the keyhole. + +### Your distraction makes the crystals regrow immediately after breaking them off. + +### The crystal fragments in the lock make it difficult to pick. + +### You need a key to actually unlock the ex-crystallized lock. + +### The key sticks in the lock and jams, mangling the key! + +### You unlock the TargetRestraint. + +### You manage to squeeze out of the TargetRestraint! + +### You pick the lock on the TargetRestraint! + +### You free yourself from the TargetRestraint! + +### You damage the TargetRestraint enough to escape! + +### The TargetRestraint is destroyed by your attempts. + +### The TargetRestraint comes off before taking serious damage. + +### This is as far as you can struggle. You'll have to remove the TargetRestraint some other way. + +### The item is too tight. You'll need to loosen the TargetRestraint somehow first... + +### The item is to tight to get your tool into position. You'll have to first make the TargetRestraint looser. + +### You can't quite get your pick into position. Maybe if you loosened the TargetRestraint first... + +### The TargetRestraint's lock is tucked in securely under straps. You'll have to get it out from under there... + +### After many failed attempts to unlock the TargetRestraint, you realize this lock is more than you can handle. + +### You can feel some ply but can't quite make any progress against the TargetRestraint... + +### The TargetRestraint's mechanism lies barely out of reach... + +### Your tool leaves only a scratch against the TargetRestraint... + +### The lock on the TargetRestraint is just above your skill level... + +### The keyholes on the TargetRestraint are just barely out of reach... + +### You unlock the TargetRestraint and sigh with relief. + +### You give out a huge moan as you squeeze out of the TargetRestraint! + +### You pick the lock on the TargetRestraint with a sigh of relief! + +### Trembling, you free yourself from the TargetRestraint! + +### You damage the TargetRestraint enough to wiggle out! + +### You stick the knife into a crack in the wall! + +### You use your feet to place the knife into a crack! + +### You glare at the crack in the wall as you realize you couldn't maneuver the knife if you tried. + +### You can't hold your knife like this... + +### The TargetRestraint is too secure to struggle out. + +### You groan in frustration as you realize the TargetRestraint is too tight to escape. + +### The TargetRestraint tightens itself as you try to squeeze out! + +### You will need someone's help to squeeze out of the TargetRestraint. + +### The TargetRestraint flashes magically as the Goddess' curse resists your efforts! + +### The TargetRestraint holds firm against your attempts, held back by your restrictions. + +### You pull and tug but your other restraints keep the TargetRestraint securely in place! + +### You groan and tug but nothing budges on the TargetRestraint. You're bound too tightly by something else. + +### You are too tightly bound to have a chance against the TargetRestraint. + +### You shake and moan as you realize your struggles against the TargetRestraint are futile. + +### You can't find a keyhole on the TargetRestraint! + +### You sigh as you give up trying to find any kind of keyhole on the TargetRestraint. + +### The TargetRestraint can't be unlocked without a special command! + +### You can't reach the keyhole on the TargetRestraint by yourself! + +### You can't hold the key to unlock the TargetRestraint with. + +### Your bound and shaking hands can't even hold the key for the TargetRestraint. + +### The goddess punishes you for trying to unlock the TargetRestraint! + +### You are too restricted to get the key into place! + +### You try, but something is keeping your hands away from the TargetRestraint. + +### You flail the key around uselessly but a strap is preventing you from unlocking the TargetRestraint! + +### This lock on the TargetRestraint is beyond your skill level! + +### You whimper as you realize the lock on the TargetRestraint is far too secure. + +### There is no visible locking mechanism on the TargetRestraint. + +### You can't pick the TargetRestraint by yourself, you'll need help. + +### You can't maneuver the lockpick well enough to unlock the TargetRestraint. + +### You let out a frustrated sigh as your quivering pick makes no progress on the TargetRestraint. + +### You try to start picking, but the lock on the TargetRestraint is secured by something else. + +### You whimper as you realize the lock on the TargetRestraint is shielded by another strap. + +### You are distracted from the TargetRestraint by mental images of yourself remaining in bondage... + +### Your restrictions ruin your dexterity. You can't pick the TargetRestraint. + +### You wiggle uselessly in the TargetRestraint. Maybe you need some kind of tool... + +### You rub your body against the floor to no avail, and sigh as the TargetRestraint stays secure. + +### You contort your body but you don't have leverage on the TargetRestraint. Maybe you need some kind of tool... + +### You struggle madly, trying to push against the TargetRestraint. You need more leverage... + +### That doesn't seem to work. Maybe something else will help with the TargetRestraint. + +### You squirm helplessly against the furniture. Maybe something else will help with the TargetRestraint. + +### You twist your body trying to use the furniture, but it doesn't seem to work. The TargetRestraint remains tight. + +### You wiggle and squirm, trying to use the furniture to no avail. The TargetRestraint remains tight. + +### You need something sharper to get at the TargetRestraint. + +### This is not a job for your trembling fingers right now. + +### Tugging on the TargetRestraint is useless. Maybe if you had something sharp... + +### You sigh as the TargetRestraint resists all your attempts at breaking through. + +### You fidget with the TargetRestraint but can't reach the clasps without some kind of edge. + +### You flail about but your hands are unable to reach the TargetRestraint. + +### You can't reach the clasps on the TargetRestraint. If only you had some other way... + +### You squirm around, rubbing the TargetRestraint against the smooth floor to no avail... + +### The knots on the TargetRestraint are too tight to pull apart without a hook. + +### You struggle fruitlessly against the knots on the TargetRestraint, but they're too tight. + +### The TargetRestraint is too tight against your body. You'll need more leverage to pull it off. + +### You shake yourself around trying to rub off the TargetRestraint, but it's hopeless. + +### You need more grip to peel off the TargetRestraint... + +### Your trembling hands cant grip anything as they are, let alone undo the TargetRestraint. + +### You rub yourself against the floor to no avail... + + + +### The fastenings are too tight and secure on the TargetRestraint! + +### You roll around tryng to loosen the TargetRestraint to no avail. + +### The TargetRestraint tightens itself as you try to undo it! + +### You can't reach the TargetRestraint by yourself! + +### You are too tightly bound to manipulate the TargetRestraint. + +### Your futile struggles do nothing to loosen the fasteners on the TargetRestraint. + +### You try to undo the fasteners on the TargetRestraint, but they are blocked by other straps! + +### You rub your body uselessly as you find another strap securing the TargetRestraint. + +### You feel the Goddess' hand keeping the TargetRestraint tightly secured! + +### The TargetRestraint is too well-secured to take off with your level of restriction. + +### The TargetRestraint is too durable to cut. + +### Your hopeless attempts fail to even leave a scratch on the TargetRestraint. + +### You fail to leave even a scratch on the TargetRestraint! + +### You can't get any leverage to cut the TargetRestraint with... + +### You can't hold the knife firmly enough to cut the TargetRestraint. + +### You cry out in your bindings as the knife bounces against the TargetRestraint uselessly. + +### Your arms are kept from having leverage on the TargetRestraint due to another item. + +### You fiddle with the tool, but your arms lack leverage on the TargetRestraint due to another item + +### Your restrictions limit your cutting power, unable to hurt the TargetRestraint. + +### You pry at the TargetRestraint... + +### You moan as the TargetRestraint squeeze you tightly... + +### There's no way the TargetRestraint are just letting go! + +### You whimper as you realize the TargetRestraint won't let go no matter what... + +### You hear dark laughter as you realize the TargetRestraint won't let go... + +### You hear a dark giggle as fruitlessly try to wiggle free from the TargetRestraint! + +### You try to pull away from the TargetRestraint! + +### You blush and try to escape the TargetRestraint's grip! + +### The TargetRestraint's grip is too strong... + +### The TargetRestraint's grip is too strong... it's hopeless. + +### You're bound too tight to have a chance at shaking off the TargetRestraint. + +### You whimper as you give up struggling against the TargetRestraint. + +### You wiggle around trying to get the TargetRestraint out... + +### You squirm around trying to dislodge the TargetRestraint... + +### The TargetRestraint is in too deeply, it won't come out. + +### You feel the TargetRestraint slide around inside but it won't come out! + +### Your bondage keeps the TargetRestraint firmly in place. + +### Your struggling does nothing but shift the TargetRestraint's position inside of you. + +### The TargetRestraint won't come out. + +### You feel the TargetRestraint slide around but it won't come out! + +### Your bondage keeps the TargetRestraint secure in place. + +### Your struggling does nothing to dislodge the TargetRestraint. + + + +### You work to unlace the TargetRestraint... + +### You hurriedly try to unlace the TargetRestraint... + +### The TargetRestraint has no laces to loosen! + +### You sigh as you can't find any laces to loosen on the TargetRestraint. + +### The laces of the TargetRestraint are tied tight! + +### You hopelessly try to untie the lacing on the TargetRestraint, but it's just too tight! + +### You grasp at the TargetRestraint, trying to peel it off... + +### You wiggle madly as you try to peel off the TargetRestraint! + +### The TargetRestraint reforms as you scoop it away! + +### You can't get the TargetRestraint off at all! + +### The TargetRestraint is too fast at reforming! + +### The TargetRestraint reforms too quickly as you try to squirm it off... + +### You grasp around, looking for a seam on the TargetRestraint... + +### You wiggle and squirm, looking for something to pull at on the TargetRestraint... + +### The TargetRestraint encases you in a solid layer! + +### Try as you might, the TargetRestraint hugs you completely without any seams! + +### The TargetRestraint is too tight to get any traction... + +### The TargetRestraint squeezes your body too tightly to get any sort of ply... + +### You start peeling off the TargetRestraint... + +### You scratch at the TargetRestraint furiously... + +### The TargetRestraint clings to your skin too tightly! + +### You groan in frustration as you try to peel the TargetRestraint off but realize it's too sticky. + +### You can't grip the edges to peel the TargetRestraint off! + +### You make a futile attempt to rub the TargetRestraint off. + +### You try to wiggle off the TargetRestraint... + +### You squirm trying to get the TargetRestraint to fall off... + +### The TargetRestraint are magical and wrap themselves back around you of their own accord. + +### The TargetRestraint squeeze you tighter as you try to shake them off. + +### The TargetRestraint have you bound hopelessly tight! + +### You sigh and moan as the TargetRestraint aren't getting any looser. + + + +### You look around for a fastener on the TargetRestraint... + +### Shivering, you look for a fastener on the TargetRestraint... + +### The TargetRestraint has no fastener!!! + +### The TargetRestraint is sealed around your body, with no fasteners to speak of! + +### The TargetRestraint is firmly sealed around your body. + +### You are sealed in ice. There is no escape. + +### You try to untie the TargetRestraint... + +### You contort yourself trying to reach the knots on the TargetRestraint... + +### The TargetRestraint's knot ties itself back again as soon as you get it loose! + +### The knots tighten themselves as soon as you reach them, keeping you trapped in the TargetRestraint. + +### You can't reach the knots on the TargetRestraint! + +### Your squirming is in vain as you can't even reach the knots on the TargetRestraint. + +### You try to pull off the TargetRestraint... + +### You tug on your TargetRestraint trying to get them off! + +### That would really hurt... + +### You realize that would really hurt... + +### The TargetRestraint tug on your nipples as you squirm! + + + + + +### You paw at the TargetRestraint from inside, hoping to find an opening... + +### You flail around inside the TargetRestraint... + +### The TargetRestraint is completely seamless! + +### The TargetRestraint is completely seamless! This is hopeless. + +### You are too weak to poke your hand through the TargetRestraint... + +### You stretch yourself out inside the TargetRestraint! + +### You bounce around inside the TargetRestraint! + +### The TargetRestraint stretches to accomodate your movements... + +### The TargetRestraint tips slightly as you squirm around... + +### You are too weak to make even a small dent in the TargetRestraint... + +### The TargetRestraint is unyielding despite your attempts... + +### You try to puncture the TargetRestraint... + +### You poke around at the TargetRestraint... + +### The TargetRestraint is too durable to pop... + +### The TargetRestraint is too strong despite your best efforts... + +### You can't quite get enough force to pop the TargetRestraint... + +### Your attempts to pop the TargetRestraint are futile due to your restraints... + +### The chest is too smooth to help. Maybe if you opened it? + +### Lockable + +### Non-Lockable + +### Unlocked + +### Lock: + +### Simple + +### Standard + +### Secure + +### Disc + +### Rubber + +### Crystal + +### Runic + +### Magic + +### Cyber + +### Integrated Cyber + +### Advanced Cyber + +### Ancient + +### Simple Lock + +### Standard Lock + +### Secure Lock + +### Disc Lock + +### Rubber Lock + +### Divine Lock + +### Crystal Lock + +### Runic Lock + +### Magic Lock + +### Cyber Lock + +### Integrated Cyber Lock + +### Advanced Cyber Lock + +### You can't use that while gagged! + +### You can't use that without your fingers! + +### You struggle against your bindings but it's too strict!. + +### You drop the pick due to your bound hands! + +### You drop your knife due to your bound hands! + +### You drop the precious knife due to your bound hands! + +### You drop the key due to your bound hands! + +### You drop the magic key due to your bound hands! + +### You insert the card the wrong way and the reader ejects it onto the floor! + +### Journal (N) + +### Passing... + +### Closing... + +### Close door + +### Sprinting!!! + +### Sprint! + +### Hopping!!! + +### Hop! + +### You run! + +### You hop desperately! + +### Close Door + +### Unlock + +### Command + +### You utter a command word and release the lock! + +### You mutter an unintelligible command word and your locks do not open. + +### You mumble a command word but the lock opens! + +### You mess up saying the command word. The lock stays put! + +### Swipe Keycard + +### You swipe your keycard and the lock releases with a hiss! + +### You swipe your keycard and the lock beeps 'Access Denied'! + +### You don't have any card to scan in the slot. + +### Use Retinal Scanner + +### You scan your eye pattern and the lock releases with a hiss! + +### The lock rejects you, citing your lack of authority. + +### You are blindfolded, so the scanner can't even see your eye! + +### Hack + +### You bypass the lock's cyber defenses and release it with a hiss! + +### The lock beeps as its security blocks your attempts at release. + +### You have no way to hack the locking system. + +### Pick + +### (No way to open) + +### (She cannot help you) + +### Offer XXXg + +### Offer + +### You do not have enough for a proper offering. + +### The goddess removes some of your restraints! + +### The goddess restores your mental and physical state! + +### The goddess teaches you the secrets of SCHOOL. (+1 level) + +### The goddess of SCHOOL grants you destructive spellcasting! + +### The goddess of SCHOOL grants you invisibility on attacks! + +### The goddess of SCHOOL grants you protection and retaliation! + +### You leave the coins on the altar and they transform into a ItemBought! + +### object + +### It appears to be a receptacle for an ancient crystal. + +### It's a pile of slag emitting a strange magic smoke... + +### That object is locked with a LKTP. + +### A shrine to the goddess of TYPE. + +### That door is open. Do you want to close it? + +### You slam the door and jam it shut! + +### Passion + +### Frustration + +### Submissiveness + +### Security Level + +### Undead + +### Latex + +### Leather + +### Metal + +### Ropes + +### Restoration + +### Elements + +### Conjuration + +### Illusions + +### Commerce + +### Shrine of SHRINETYPE + +### Tablet of + +### Goddess: + +### Goddess Blessing: + +### Goddess Curse: + +### Mana Bonus: + +### Lack of Mana Penalty: + +### Your excess mana helps you suppress the enchantment! + +### Your mana is too weak to fight the magical enchantment... + +### Curses + +### A tablet inscribed with runes of TYPE. + +### SHRINETYPE Tablet + +### Decypher + +### You read the runes and they fill you with power! + +### These runes are meant for someone with less willpower. + +### You try to read the runes but cannot understand them. + +### Allies: + +### Enemies: + +### Favorable: + +### None + +### Nevermere Trainers + +### DressUp Co. + +### Bounty Hunters Guild + +### Bandits + +### Constructs + +### School of Magic + +### Old Guardians + +### Cult of the Wild + +### Cult of Bast + +### Alchemists + +### Elementals + +### Dragonheart Order + +### MaidForce + +### Fungal Kingdom + +### Nature + +### Witches' Coven + +### Love Crafters + +### Velvet Pact + +### Knights Errant + +### Scavengers + +### Fae Tricksters + +### Zora's Crew + +### Rope Dojo + +### Doll Shoppe + +### Fuuka's Shrine + +### The Collectors + +### Dollmaker Inc. + +### Adventurer + +### Cursed Spirit + +### Delinquent + +### Computer Virus + +### Extraplanar Entity + +### Dubious Witch + +### Shadow Clan + +### Illegal Poacher + +### Very Angry + +### Surprise! + +### Fierce Debater + +### Angels + +### Demons + +### You sense that the chest contains a trap and a lot of gold. + +### You sense that the chest is safe to open. + +### Drink + +### Bottle + +### You have no restraints to 'offer' to the goddess. + +### This shrine's mana pool is empty. + +### You drink from the pool and and absorb its energies. + +### You absorb the pool's energies through your face. + +### You collect what mana you can in a bottle. + +### You drink from the pool and your mana is restored. + +### You drink again, but you feel as if you are trespassing. + +### You drink again, knowing the risk this may entail... + +### You have angered the goddess of TYPE!!! + +### The slime washes off in the fountain!!! + +### The goddess of TYPE is enraged and curses you with a divine punishment! (+RESTRAINT) + +### The goddess offers a ItemTraded for ItemCost (NumCurrent/NumMax) + +### Next Offer + +### Buy (press right) + +### Cost: ItemCostgp + +### Owned: AMNT + +### You climb down to the next level + +### Level RestraintLevel (Rarity) + +### All + +### Consumable + +### Worn + +### Weapons + +### Outfits + +### Restraints + +### Miscellaneous + +### Armor + +### The terrain makes noise as you rush across it... + +### You can't reach the cuffs on your elbows, the chain is too short... + +### You contort your arms trying to reach the cuffs on your elbows, to no avail... + +### Your elbows are kept together by the elbow cuffs, and you can't reach them. + +### The strict chain on the cuffs keeps you from reaching them easily. + +### The cuffs limit your range of motion, making it harder to remove them. + +### It's hard to take off the cuffs with your wrists linked together... + +### You feel drained of energy... + +### Your collar tingles and suddenly you feel weaker... + +### Your collar drains your energy as you struggle... + +### The rope between your legs keeps the toy secure... + +### Try as you might, the toy is held in place tight. + +### The toy won't wiggle loose. It's kept in place by your restraints. + +### Your catsuit adheres to latex, making struggling more difficult! + +### The item sticks to your rubber catsuit, making it harder to pull off... + +### The item hugs your catsuit tightly, adhering firmly! + +### Your RSTRN holds you securely, making your struggling ineffectual... + +### Your RSTRN holds you tight, making it harder to move... + +### Your RSTRN keeps you tied tight, making it harder to escape... + +### The bright light weakens the shadow hands! + +### You hear an ominous click, but nothing seems to happen. Looks like a misfire! + +### Barrel Trap + +### A booby-trapped barrel with a spring-loaded lid designed to trap you inside! + +### You can push the lid off with enough force... + +### The lid of the barrel suddenly snaps shut as you hide inside!!! + + + +### Sarcophagus + +### A glass-walled chamber sealed with enchanting magic. + +### Time feels like it's going by quickly outside... + +### Metal Cage + +### A metal cage with rigid bars, too narrow to put your head through. + +### Made for a pretty toy like you~ + +### Display Stand + +### A display stand, fit for only the prettiest of trophies! + +### Your arms are pinned behind your back and you can barely move! + +### You hear a click as the door shuts behind you... + +### The display stand suddenly locks into place around you! + +### Doll Stand + +### A mobile display stand for dolls to keep them in place. + +### As long as it's... inserted, you won't be going anywhere! + +### One Bar Prison + +### A devious way to immobilize people. + +### Metal Stand + +### As long as it's locked around you, you won't be going anywhere! + + + +### As long as it's attached, you won't be going anywhere! + +### You're not fooling anyone... + +### You might be able to fool someone like this... + +### You look like you're right at home! + +### Restraining Bed + +### A bed with a booby trap designed to trap you on top of it! + +### You have to get out somehow... + +### Belts emerge from underneath the bed and wrap around you, strapping you down tightly! + +### Binding Dress + +### It's a devious dress! I hope your elbows are flexible~ + +### So many laces! It would take quite a while to put this on normally. That's what magic is for! + +### Ornamental Corset + +### Your figure looks gorgeous in this~ + +### It's so tight you won't be able to undo the laces yourself, dear! + +### Fancy Ball Gag + +### A cute ball gag that fills your mouth right up! + +### What's this? it seems to have a magic spell protecting it from harm! + +### Fancy Muzzle + +### A muzzle to keep you from spitting out what's underneath. + +### Sorry dear, there's a mystic seal on there to keep it on nice and tight. + +### Ornamental Dress + +### A devious dress that forces the arms into an elbows-touching position. + +### It is extremely strict but it is only fabric. The lacing is intricate and will take a long time to remove. + +### Ornamental Gag + +### A gag meant to keep servants of the Resurrection Temple quiet by forcing a plug into their mouth. + +### It is difficult to pull off and though it is made from white leather, a magic enchantment protects it from cutting. + +### Panel Plug Gag + +### A gag meant to keep people quiet by forcing a plug into their mouth. + +### It is difficult to pull off and though it is made from supple, heavy duty leather. + +### Fuuka's Collar + +### A collar enchanted with ghastly energy. + +### It seems to react with a pulse of energy whenever a nearby enemy is defeated. + +### Your collar pulses, and a revenant appears to avenge the enemy you defeated! + +### Fuuka's Pet Collar + +### A collar enchanted with beneficial ghastly energy. + +### Your collar pulses, and a revenant appears to assist you! + +### Dress Bustier + +### A deceptively cruel device, making it impossible to reach your nipples. + +### Reinforced with steel plates, this will need bolt cutters to take off. + +### Massagers + +### A pair of little motion-activated teasers. They trigger when you swing your body for an attack. + +### They will make for some great fun! Type: Edging + +### Advanced Massagers + +### A pair of sensitive motion-activated teasers. They trigger when you attack or struggle. + +### Nipple Weights + +### A pair of dense weights dangling from your sensitive bits. + +### They tend to swing around when attacking or casting arm spells. + +### Hi-Tech Massagers + +### A pair of highly-sensitive motion-activated teasers. They detect most forms of motion, including sprinting and hopping. + +### Control Harness + +### An advanced harness for controlling high-security prisoners. + +### It seems to be made of flexible steel plates. + +### Cyber Collar + +### An advanced collar for registering prisoners into the facility network. + +### It seems to be made of flexible steel plates, and it has a high-security lock. + +### Latex Ball Gag + +### A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + +### The strap is made of a durable but flexible material + +### Large Latex Ball Gag + +### A devious device that looks like a large ball gag, but absolutely fills your mouth with a rubber cylinder. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + +### Latex Mask + +### A slick layer of blue latex stretched over the mouth. + +### It's very tight and makes it hard to move your mouth. + +### Secure Latex Mask + +### A slick layer of blue latex stretched over the mouth. It has a lockable strap which prevents it from being removed. + + + +### Rubberized Gloves + +### A mass of alchemical latex stretched over your arms, then hardened to the point that you can barely move your fingers! + +### Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! + +### Rubberized Socks + +### A mass of alchemical latex stretched over your legs, then hardened. + +### Rubberized Mask + +### A mass of alchemical latex stretched over your entire face, then hardened. + +### Rubberized Ball Gag + +### A mass of alchemical latex inflated to fill your mouth, then hardened. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + +### Rubberized OTN Mask + +### A mass of alchemical latex stretched over your mouth, then hardened. + +### Wolf Panties + +### A set of vibrating panties designed to help subdue unruly wolfgirls. + +### It's incredibly tight and difficult to remove once it's clipped on, but the material is rubber. + +### You can't equip that. + +### Experimental Boxtie Binder + +### A secure but comfortable binder meant for long-term wear by the alchemists' pets. + +### Made from imbued latex, it will be hard to cut but not impossible. + +### Binder Harness + +### A tight harness attached to a binder used to ensure restraints will not come off. + +### It's tied in the back and reinforced with steel boning. + +### Latex Posture Collar + +### A strict collar that makes it tougher to escape from other items. + +### It has steel boning but could be cut with enough care. + +### Latex Ballet Heels + +### A pair of strict boots for making pets more manageable. A skilled person can still walk in these. + +### They are reinforced with top-quality hardened latex. + + + +### High-Security Armbinder + +### An armbinder enclosing your hands and arms completely, making your hands useless. + +### Made of a flexible, yet durable material, it's going to be really tough to escape. + +### High-Security Boxbinder + +### A boxbinder enclosing your hands and arms completely, making your hands useless. + +### High-Security Straitjacket + +### A straitjacket enclosing your hands and arms completely, making your hands useless. + +### High-Security Lockdown Jacket + +### This jacket made with extra straps can even be used on top of another jacket for extra security. + +### High-Security Legbinder + +### An mythril legbinder enclosing your legs, making it difficult to move. + + + +### High-Security Shackles + +### A pair of hardened steel shackles around your feet. + +### Nearly indestructable, you are at the mercy of its lock. + +### High-Security Ball Gag + +### A rubber gag shoved tightly between your lips. + +### The cable-reinforced straps are nigh-unbreakable, keeping you securely silenced. + +### High-Security Muzzle + +### A secure muzzle made with cable-reinforced straps. + +### It is especially effective at keeping in other gags. + +### Potion Absorber + +### An ancient device that allows direct use of potions even while gagged or bound. + +### Also allows fitting of a leash. + +### Slime Walkers + +### A pair of heels coated in a nonstick material. + +### They will slow you down, but you can walk on slime without getting stuck! + + + +### Duster Gag + +### A special gag designed for maids to be useful even while tied up! It's self-locking too! + +### Deals 0.5 tickle damage on attack and adds +30 distraction. Bonus damage vs dirt and mold. + +### Deals 0.5 tickle damage on attack and adds +30 distraction. + + + +### Gas Mask + +### A respirator designed to protect the wearer from noxious fumes. + +### +50 Poison resist. Protects against dizziness caused by sleep gas. Affects speech. + + + +### The curse on the RestraintName is lifted! + +### Press RIGHT to confirm buy! + + + + + + + +### You find + + + + + + + + + + + + + + + +### Collar + +### A classy leather collar. + +### Allows fitting of a leash. + +### Slave Collar + +### A high-security steel collar befitting of a slave. + +### Enchanted Collar + +### A collar made with magically enchanted materials. It is difficult to cut off. + +### Kitty Collar + +### A collar made with magically enchanted materials. It is protected by the blessing of Bast. + +### Leash + +### A leash made from a strong material. + +### Functions as a handle for moving unruly prisoners. + +### Prisoner Plug + +### A teaser to keep you occupied. + +### Buzzes on spellcast, and periodically as well. + +### High-Security Chastity Belt + +### A chastity belt to protect prisoners from themselves. + +### Made of a highly durable material. + +### Blacksteel Chastity Belt + +### Charms (Arms) + +### A band of faintly magic ribbon wrapped tight around your arms. + +### It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. + +### Charms (Legs) + +### A band of faintly magic ribbon wrapped tight around your thighs. + +### Charms (Feet) + +### A band of faintly magic ribbon wrapped tight around your ankles. + +### Charms (Head) + +### A band of faintly magic ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. + +### Charm Gag + +### A band of faintly magic ribbon wrapped tight over the mouth. Can be used on vulnerable targets from quick inventory or hotbar. + +### Charm Wrapping (Toes) + +### A layer of faintly magic ribbon wrapped tight around your feet. + +### Charm Wrapping (Head) + +### A layer of faintly magic ribbon wrapped tight around your face. + +### Charm Wrapping (Arms) + +### A layer of faintly magic ribbon wrapped tight around your body. + +### Charm Wrapping (Feet) + +### A layer of faintly magic ribbon wrapped tight around your shins. + +### Charm Wrapping (Legs) + +### A layer of faintly magic ribbon wrapped tight around your thighs. + +### Living Charm Collar + +### This collar is designed to make sure its wearer does not escape their charms. + +### It will occasionally cause charms to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of charms you have on you. + +### Leather Panel Gag + +### A gag that seals your lips tightly and stuffs your mouth with a ball. + +### Keep your mouth to yourself! + +### Harness Panel Gag + +### The harness is comprehensive and it's locked in place. + +### Harness Ball Gag + +### A gag that stuffs your mouth with a large silicone ball. + +### Bast Gag + +### A gag used to silence new initiates of the Bast cult. + +### Bast Muzzle + +### A muzzle used to keep a Bast gag secure. + +### The leather panel is tough and tight. + +### Bast Blindfold + +### A blindfold used to aid in meditation. + +### It is padded but still lets some light through. + +### Bast Paws + +### Leather mittens used to pacify new initiates of the Bast cult. + +### They make it hard to manipulate anything at all, but aren't the toughest material. + +### Bast Suit + +### A skintight suit used on unruly initiates of the Bast cult. + +### It's nearly impossible to escape without help once locked inside. + +### Bast Petsuit + +### Enhanced suit used for select members of the Bast cult. + +### Magic Petsuit + +### A set of straps and buckles enchanted with a powerful spell to render you helpless. + +### It's warded against cutting by nonmagic blades. + +### Latex Petsuit + +### A skintight suit that encases you in a tight rubber embrace. + +### The thick latex is resistant to even the most determined struggles. + +### Blessed Wrappings (Head) + +### A band of magic embalming ribbon wrapped tight around your face. + +### Blessed Wrappings (Eyes) + +### A band of magic embalming ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. + +### Blessed Wrappings (Gag) + +### A band of magic embalming ribbon wrapped tight over mouth. Can be used on vulnerable targets from quick inventory or hotbar. + +### Blessed Wrappings (Arms) + +### A layer of magic embalming ribbon wrapped tight around your body. + +### Blessed Wrappings (Feet) + +### A layer of magic embalming ribbon wrapped tight around your shins. + +### Blessed Wrappings (Toes) + +### A layer of magic embalming ribbon wrapped tight around your feet. + +### Blessed Wrappings (Hands) + +### A layer of magic embalming ribbon wrapped tight around your hands. + +### Blessed Wrappings (Legs) + +### A layer of magic embalming ribbon wrapped tight around your thighs. + +### Living Blessed Wrappings Collar + +### This collar is designed to make sure its wearer does not escape their wrappings. + +### It will occasionally cause blessed wrappings to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of blessed wrappings you have on you. + +### Tape (Hands) + +### Sleek and shiny tape for the bondage enthusiast. + +### A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. + +### Tape (Arms) + +### Tape (Legs) + +### Tape (Feet) + +### Tape (Head) + +### Sleek and shiny tape for the bondage enthusiast. Can be used on vulnerable targets from quick inventory or hotbar. + +### Tape Gag + +### Tape Mouth Wrap + +### Tape Wrapping (Toes) + +### Tape Wrapping (Head) + +### Tape Wrapping (Arms) + +### Tape Wrapping (Feet) + +### Tape Wrapping (Legs) + +### Living Tape Collar + +### This collar is designed to make sure its wearer does not escape their tape. + +### It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. + + + +### Autotape + +### Comes in convenient cartridges for machine loading. + +### A specialized tape used for capturing purposes during the time of the Old Civilization. Despite its appearance, it contains a gas-permeable membrane that allows ventilation, while its hydrophobic properties resist solvents that would otherwise disrupt the adhesive bond. The adhesive layer is special in that it activates only in contact with other auto-tape, making it safer to use and remove. + +### Rubberized Tape + +### Magic Charms + +### Magical charms from the ancient graveyard. + +### Its magic is not enough to protect it from damage, but it is surprisingly effective at restraining both intruders and cursed entities. + +### Blessed Wrapping + +### A layer of magic embalming ribbon. + +### It clings of its own accord to intruders and naughty catgirls. + +### Autotape (Hands) + +### Sticky tape made from a metallic material. Used to great effect in police situations. + +### It's very sticky and seals your hands tightly, making any struggling ineffective. + +### Autotape (Head) + +### Sticky tape made from a metallic material. Used to great effect in police situations. Can be used on vulnerable targets from quick inventory or hotbar. + +### It's very sticky and tough but you could probably get a knife through it. + +### Autotape (Arms) + +### Autotape (Legs) + +### Autotape (Ankles) + +### Autotape (Feet) + +### Autotape (Mouth) + +### Autotape (Mouth Wrap) + +### Living Auto Tape Collar + +### It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. + + + +### Stuffing + +### A stuffing of cloth. Can be applied on vulnerable targets or those who casted a verbal spell last turn. + +### You could spit it out easily, provided nothing's covering it. + + + + + +### Living Mithril Collar + +### A collar made from an almost-weightless alloy that adjusts itself to your neck. + +### It will occasionally cause mithril to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of mithril you have on you. + +### Mithril Collar + +### A collar made from an almost-weightless alloy.. + +### It feels comfortable but it's also really hard. + +### Mithril Cuffs + +### A pair of cuffs that make it easy to restrain you. + +### They feel like they aren't even there, but the material is rigid and unyielding. + +### The enemy attaches your wrist cuffs together! + +### Wrist Chain + +### A pair of cuffs keeping your arms behind your back. + +### Your cuffs detatch! + +### The enemy attaches your elbow cuffs together! + +### Cuffs Chain + +### A full set of cuffs keeping your arms in a strict elbow tie! + +### Your wrists detatch, leaving your elbows still bound! + +### Elbow Chain + +### A pair of cuffs keeping your elbows locked together! + +### Your elbows detatch! + +### The enemy attaches your wrist cuffs back together! + +### Mithril Leg Cuffs + +### A pair of cuffs on your legs. + +### The enemy attaches your leg cuffs together! + +### Thigh Chain + +### A pair of cuffs chaining your legs together. + +### The leg cuff chain detaches! + +### Mithril Ankle Cuffs + +### A pair of cuffs on your ankles. + +### The enemy attaches your ankle cuffs together! + +### Ankle Chain + +### The ankle cuff chain detaches! + +### Your ankle cuff chain is tightened and pulls your feet together! + +### Short Ankle Chain + +### A pair of cuffs chaining your feet tightly together. + +### Your ankle cuff chain loosens! + + + +### Living Leather Collar + +### A collar made of tough leather that adjusts itself to your neck. + +### It will occasionally cause leather to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of leather you have on you. + +### Leather Cuffs + +### Made of tough leather. + + + + + +### Leather Leg Cuffs + +### Leather Ankle Cuffs + +### Sticky Slime + +### A sticky layer of slime keeping you anchored to the ground. + +### It will slow you for a single turn. + +### Leather Mittens + +### A pair of tight leather mittens enclosing your hands. + +### They make it almost impossible to manipulate keys and tools. Keep your hands to yourself! + +### Leather Legbinder + +### A tight leather legbinder that keeps your feet glued together. + +### It's quite snug and the laces are secured with a lockable panel. Getting at them requires picking the lock. + +### Leather Armbinder + +### A tight leather armbinder enclosing your hands and arms completely. + +### It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible. + +### Leather Boxbinder + +### A secure but comfortable binder meant for long-term wear. + +### Leather Armbinder Harness + +### Leather belts securing your armbinder tightly. + +### It's quite tight and secured by lockable buckles on your sides. + +### The armbinder harness comes off with the armbinder. + +### The energy link between your ankle cuffs fizzles into nothing. + +### The energy link between your arm cuffs fizzles into nothing. + +### The energy link between your thigh cuffs fizzles into nothing. + +### The cuff chains come off with the cuffs. + +### The hogtie link comes off. + +### Handcuffs + +### A pair of steel cuffs locked securely around your wrists. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +### The lock doesn't seem very complicated. + +### Steel Yoke + +### A steel bar clamped firmly around your wrists and neck, leaving you in a helpless position. + +### The awkward position makes it difficult to get out of alone. + +### Heavy Yoke + +### A series of armor-grade plates cut with precision machining, sandwiched into an unbreakable layer that clasps firmly in place around your neck and wrists. + +### Steel Fiddle + +### A steel fixture keeping your hands in an awkward and submissive position. + +### The awkward position prevents you from easily reaching the lock. + +### Leather Harness + +### A leather harness of tight straps buckled around your torso. + +### It provides an anchor point for enemies to grab onto! + +### Rubberized Harness + +### A harness made of latex polymer, resistant to most solvents and corrosion. + +### Can be worn all day! Also convenient to hold. + +### Ball Gag + +### A gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + +### You can't seem to enunciate your spells properly with this in. + +### Large Ball Gag + +### A mouth-filling gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + +### Tight Ball Gag + +### A gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + +### Huge Ball Gag + +### A massive gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + +### You absolutely can't enunciate your spells properly with this in. + +### Magic Ball Gag + +### A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + +### It's brimming with conjured energy. A normal knife won't work here! + +### Anti-Magic Gag + +### A gag designed to cripple mages. It's made of a squishy rubbery material. + +### It's sealed with a magical spell that rapidly absorbs mana! When it drains 40 mana it will transform into an ordinary gag and inflate. + +### Anti-Mage Gag + +### A gag designed to cripple experienced spellcasters. It's made of a magic-absorbing rubber. + +### You feel the energy flowing out of you! When it drains 100 mana it will transform into an ordinary gag and inflate. + +### Ballet Heels + +### A pair of shoes with heels so tall it forces you on your toes. + +### These will take some getting used to. + +### Training Heels + +### A pair of unreasonably high heels owned by you personally. + +### Leg Irons + +### A pair of solid steel cuffs connecting your ankles inescapably. + +### Blindfold + +### A leather strap secured onto your face and blocking vision. + +### You can still see through the gap around your nose. + +### Magic Chastity Belt + +### A belt protected by a magic seal. + +### The shields will open up to accept new toys, but won't let them out... + +### Steel Chastity Belt + +### A cruel device used for locking magical vibrators in place. + +### Blacksteel Belt + +### Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. + +### Blacksteel Bra + +### A cruel device used for locking magical massagers in place. + +### Prototype Belt + +### A strange device built using unknown technology. + +### The lock is extremely advanced, and the ports at the bottom readily accept toys but won't let them out... + +### Steel Chastity Bra + +### It won't stop the dungeon's little curses, but will keep you from removing them. + +### Ornate Chastity Belt + +### The lock won't come off until the magic wears off in time... + +### Ornate Chastity Bra + +### Maid Chastity Belt + +### A chastity belt used to maintain control over initiate maids. + +### Made of hardened steel. The lock is high-security. + +### Magic Egg + +### An energetic little friend that likes to tease you. + +### It is charged by residual magic from your spells. Type: Teasing + +### Prototype Egg + +### A teaser that periodically vibrates. + +### High efficiency mana conversion means longer tease duration. Type: Teasing, Pleasure, Edging + +### Vibrating Plug + +### A sizeable plug that makes you happy... a little too happy. + +### It vibrates periodically and adds distraction when moving. Type: Pleasure + +### Teaser Plug + +### A sizeable plug that will tease you but never let you go... + +### It vibrates weakly periodically. Type: Teasing, Denial + +### Torment Plug + +### A sizeable plug that will make your life unbearably pleasurable... + +### It vibrates strongly periodically and has a denial setting. Type: Denial + +### Thundering Plug + +### Enjoy it while you can. Type: Pleasure, Edging + +### Intense Training Plug + +### An energetic plug that will make your life unbearably pleasurable... + +### You're going to have the time of your life. Type: Pleasure, and lots of it + +### Rear Vibrating Plug + +### A device that attacks from multiple angles. + +### An enjoyable experience. Type: Edging + +### Maid Egg + +### An energetic little friend that likes to tease you and takes orders from the head maid. + +### It is charged by residual magic from your spells. Type: Teasing, Edging + +### Stainless Plug (F) + +### A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... + +### This one goes in the front. + +### Stainless Plug (R) + +### This one goes in the back. + +### Shadow Hand Gag + +### It clasps tightly over the mouth and prevents you from casting your spells! + +### You have no choice but to struggle. + +### Shadow Hand Eyes + +### Shadow hands clasped over your eyes, making it hard to see. + +### Shadow Hands (Legs) + +### They are wrapped around your legs! + +### Shadow Hands (Arms) + +### They are squeezing you tightly! + +### Shadow Hands (Feet) + +### They are holding your feet together! + +### Shadow Hands... + +### They are holding your... uh... + +### Wrist Vines + +### A box tie keeping your arms secured behind your back. + +### The vines twitch as they try to wrap around tighter. + +### Vine Harness + +### A harness acting as a handle to pull you around + +### Leg Vines + +### A tie that hobbles your legs together.. + +### Ankle Vines + +### A tie keeping your feet secured together. + +### High-Security Cuffs + +### A set of irish-8-style cuffs that are both restrictive and quick to apply. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +### It uses a standard lock rather than a simple one. + +### Wolfbinder + +### A sophisticated training system used to keep wolfgirls from scratching their owners. + +### Despite the harsh position, it is padded, breathable, and suitable for long term wear. + +### Wolf Queenbinder + +### This was made to be used during a coup attempt. Unfortunately, its creator ended up wearing it instead, after the coup's failure. + +### Designed to hold the queen of wolves helpless for an indefinite period of time. + +### Smart Training Cuffs + +### Cuffs with a feature to punish the wearer if they act aggressively. + +### They are solid metal and will be hard to remove without the key. + +### Linked Smart Cuffs + +### Looks like you got yourself in trouble. + +### Training Harness + +### A harness that keeps a wolfgirl's suit together. It makes escaping more difficult. + +### While it is weatherproof and rugged, its straps are merely nylon. + +### Training Mittens + +### When wolfgirls won't keep those pesky claws in line, these will make sure she can't cause too much trouble. + +### Made from strong reinforced fabric, your claws won't do anything to these mittens. + +### Training Gag + +### A gag used to prevent wolfgirls from biting their owners. + +### It is reinforced with steel cables, so getting it off will be tricky. + +### Training Collar + +### A collar with a decorative tag used to identify wolfgirls. + +### Also good for identifying people in general. What a great idea! + +### Training Leash + +### A leash used for training pets. + +### It is a steel cable with a weatherproof rubber coating, and a convenient handle. + +### Magical Leash + +### A leash made of magical energy, linked to a submissive's collar. + +### Very difficult to break unless you have a strong magical blade. + +### Your ankle cuffs snap together on their own! + +### Your ankle cuffs detach! + + + +### Asylum Muzzle + +### The nurses use this on noisy patients! + +### It's sturdy leather... + +### Asylum Jacket + +### A straitjacket that keeps patients out of trouble. + +### It has many straps and is very difficult to escape. + +### Asylum Legbinder + +### This legbinder will keep the patient from kicking the nurses. + +### It has both laces and straps. + + + +### Asylum Ankle Cuffs + +### A pair of chained cuffs made of reinforced leather. They make patients easier to catch. + +### They can be thrown from long distances. + +### Asylum Leg Cuffs + +### They are made of a steel alloy. + + + +### Transport Jacket + +### This jacket goes over a straitjacket to keep the arms trapped. + +### It makes it extraordinarily difficult to escape the jacket it covers. + +### Living Asylum Collar + +### A collar made of tough cowhide that adjusts itself to your neck. + +### It will occasionally cause asylum gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of asylum gear you have on you. + +### Asylum Cuffs + +### A pair of leather cuffs that make it easy to restrain you. + +### They're made of tough cowhide. + +### A pair of leather cuffs keeping your arms behind your back. + +### A full set of leather cuffs keeping your arms in a strict elbow tie! + +### A pair of leather cuffs keeping your elbows locked together!. + + + +### Comfy Muzzle + +### A lovely muzzle that's extraordinarily comfy! + +### It's made of an ethereal material... + +### Comfy Straitjacket + +### A straitjacket that is padded on the inside. + +### It feels tight but is actually made of an ethereal material... + +### Latex Jacket + +### A tight jacket that keeps your arms completely useless. + +### It has too much grip to struggle out of, but is made of a fragile material. + +### Secure Latex Jacket + +### This straitjacket has extra straps and buckles to make sure you won't be struggling out of it. + +### Latex Armbinder + +### A tight armbinder that pins your arms tightly behind your back, enclosed completely. + +### Latex Boxbinder + +### Latex Legbinder + +### A tight legbinder that keeps your legs together! + +### Latex Boots + +### A tight pair of boots that makes it difficult to walk! + +### Heavy Latex Corset + +### An excruciatingly tight corset that hugs your body, with straps securing your other restraints. + +### A skintight suit that's stretched on tight. It adheres to latex restraints making struggling more difficult. + +### Blue latex is silky smooth, very stretchy, and very good at adhering to itself. + +### Heavy Latex Catsuit + +### A skintight suit that's stretched on tight and made of thick latex. It adheres to latex restraints making struggling more difficult. + +### Blue latex is silky smooth, very stretchy, and very good at adhering to itself. Its thickness makes it particularly resistant to cutting. + +### Latex Mittens + +### A pair of mittens keep your hands out of trouble. They adhere to latex restraints making struggling more difficult. + +### Latex Cube + +### A gelatinous cube that engulfed you at some point in the past. + +### It seems quite content staying where it is. + +### Slime Bubble + +### A squishy and sticky bubble that you can't get out of! + +### It will slow you down severely but can be popped if you can reach a knife... + +### Latex Sphere + +### A giant inflatable sphere that compresses you and leaves you helpless... + +### You can't see out of it nor can you control its movement. If only you could puncture it! + +### Latex Ball Suit + +### A giant inflatable sphere that leaves you rolling around... + +### Your movement is severely hampered, limited to feeble wiggling... + +### Bubble + +### A squishy bubble that you can't get out of! + +### Scale Boxtie Binder + +### A secure but comfortable binder meant for long-term wear by long-term prisoners of the Dragonhearts. + +### It is made from durable dragonscale, but secured with ordinary buckles. + +### Dragonscale Straps + +### A set of straps buckling tightly around your body and secured at the wrists. + +### It's made from hard-to-cut dragonscale!!! + +### Dragon Queen Straps + +### A sturdy harness completely immobilizes your arms and torso. Made to be used on a queen of dragons. + +### It's made from reinforced dragonscale!!! + +### Scale Leg Cuffs + +### A pair of chained cuffs made of dragonscale. They slow your stride. + +### Scale Ankle Cuffs + +### Scale Cuffs Chain + +### Dragonscale Boots + +### A pair of extremely high heels lined with dragonscale. They are hard to walk in. + +### Dragonscale Gag + +### A gag made of a squishy material and secured with dragonscale straps. + +### Dragonscale Muzzle + +### A muzzle to keep ball gags pressed firmly into the mouth. + +### Dragon Collar + +### A collar owned by the Dragonhearts, an order of dragonslayers. + +### Steel Cuffs + +### A pair of steel cuffs that make it easy to restrain you. + +### They're made of shining steel. + +### Steel Wrist Chain + +### A pair of steel cuffs keeping your arms behind your back. + + + +### Magnetic Cuffs + +### A pair of bulky cuffs with coils visible on the inside... + +### They have no visible attachment points... + +### The electric damage causes your cuffs to attach together! + +### Magnetic Link + +### The magnetic cuffs are rigidly attached! + +### They won't budge! There's a button to release them but it's hard to reach... + +### Magnetic Ankle Cuffs + +### A pair of bulky leg irons with coils visible on the inside. + +### The electric damage causes your ankle cuffs to snap together! + +### Your ankle cuffs detatch! + + + + + +### Living Blacksteel Collar + +### A collar made of a hardened steel alloy, chemically treated as to be stainless that adjusts itself to your neck. + +### It will occasionally cause blacksteel to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of blacksteel you have on you. + +### Blacksteel Cuffs + +### They are made of a hardened steel alloy, chemically treated as to be stainless. + + + + + +### Blacksteel Leg Cuffs + +### Blacksteel Ankle Cuffs + + + + + + + +### Dragonscale Cuffs + +### They are made from leather cured from the hide of dragons. + + + + + +### Dragonscale Leg Cuffs + +### Dragonscale Ankle Cuffs + + + + + +### Maid Jacket + +### A bolero jacket keeping your arms pinned snugly. You can't even move them. + +### There is no hope of struggling out. Better hope you can cut it... + +### Maid Punishment Jacket + +### A bolero straitjacket made for unruly maids. It is extra secure and locked tightly. + +### There is no hope of struggling out. Better get back to work... + +### Devious Maid Costume + +### A devious maid outfit that forces the arms into an elbows-touching position. + +### Makes sure you focus on your work and not fooling around. + +### Reinforced Leather Belt + +### A leather belt used to keep your legs hobbled. + +### It's made of a very tough reinforced leather. It will take some time to cut. + +### Maid Cuffs + +### A pair of steel cuffs used by the Maidforce. + +### They are made of solid steel. + +### Maid Cuff Link + +### Maid Collar + +### A collar for operatives of the Maidforce, a group of covert saboteurs. + +### It's reinforced with metal and guarded with an expert-level lock. + +### Maid Gag + +### A gag with a long, mouth-filling plug that muffles speech completely. + +### Maid Security Gag + +### A muzzle with a long, mouth-filling plug that muffles speech completely. + +### Reinforced and secured with a disc lock to ensure unruly maids don't skip their duty. + +### Suspicious Mask + +### A well-fitted mask, covering your entire head neatly and locking in place. + +### It has eyeholes for you to somewhat see out of, but blocks access to the face. + +### Happy Face + +### Just put on a happy face and enjoy it. + +### Sensory Hood + +### A well-fitted hood that covers your head and muffles sounds. + +### No eyeholes. Integrated blindfold and gag. Total darkness. + +### Sensory Mask + +### A well-fitted mask that covers your face and muffles sounds. + +### Shadow Heels + +### A set of impractical heels that clasp around your ankles. They make it hard to walk. + +### The material is stronger than leather, and flexes to make struggling difficult. + +### Shadow Jacket + +### A tight straitjacket made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Its grip encases you tightly, but the material is weaker than most metals. + +### Black Hole Jacket + +### Like a black hole, anything that is caught in this jacket has no chance to escape its grasp. + +### Shadow Armbinder + +### A tight armbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Black Hole Armbinder + +### Like a black hole, anything that is caught in this armbinder has no chance to escape its grasp. + +### Shadow Boxbinder + +### A tight boxbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Black Hole Boxbinder + +### Like a black hole, anything that is caught in this boxbinder has no chance to escape its grasp. + +### Shadow Legbinder + +### A tight legbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Shadow Latex Petsuit + +### A tight petsuit made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Obsidian Yoke + +### A yoke made from shining obsidian, stars glittering in the darkness. It pins your arms uselessly at your sides. + +### It's made of a dark, glistening volcanic metal. + +### Obsidian Muzzle + +### A muzzle made from segmented metal pieces, fitting securely over your face. + +### Obsidian Collar + +### A collar made from a warm, shining alloy. + + + +### Living Obsidian Collar + +### A collar made of a dark, shiny metal that adjusts itself to your neck. You can't help but hear whispering since it is so tight. + +### It will occasionally cause obsidian to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of obsidian you have on you. + +### Obsidian Cuffs + +### It's made of a dark, shiny metal. If you hold it close you hear whispering. + + + + + +### Obsidian Leg Cuffs + +### Obsidian Ankle Cuffs + + + +### Living Crystal Collar + +### A collar made of a glowing, brittle material that adjusts itself to your neck. You feel your energy flowing into it... + +### It will occasionally cause crystal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of crystal you have on you. + +### Crystal Cuffs + +### It's made of a glowing, brittle material. You feel your energy flowing into it... + + + + + +### Crystal Leg Cuffs + +### Crystal Ankle Cuffs + + + +### Living Ice Collar + +### A collar made of enchanted ice that adjusts itself to your neck. It won't melt on their own, and the ice chills you to the bone... + +### It will occasionally cause ice to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ice you have on you. + +### Ice Cuffs + +### They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... + + + +### A pair of cuffs keeping your elbows locked together!. + +### Ice Leg Cuffs + +### Ice Ankle Cuffs + + + +### Living Slave Collar + +### A collar made of a gold-tinted metal with a magical enchantment that adjusts itself to your neck. + +### It will occasionally cause slave gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slave gear you have on you. + +### Slave Cuffs + +### It's made of a gold-tinted metal with a magical enchantment. + +### Slave Wrist Chain + + + +### Slave Elbow Chain + +### Slave Leg Cuffs + +### Slave Ankle Cuffs + +### Slave Cuffs Chain + + + +### High-Tech Gag + +### A gag with a soft and filling mouthpiece, reinforced with a metallized strap. + +### It will be impossible to force it out or cut it with just a knife. + +### Nylon Plug Gag + +### A gag with a soft and filling mouthpiece, kept in place by an adjustable nylon strap. + +### It will be impossible to force it out, but can be cut. + +### High-Tech Cables (Arms) + +### Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! + +### They are wrapped methodically around your body! + +### High-Tech Cables (Legs) + +### High-Tech Cables (Harness) + +### Nylon Cables (Arms) + +### Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. + +### Nylon Cables (Legs) + +### Nylon Cables (Harness) + +### Magic Ribbons + +### Magically sealed ribbons to teach intruders a lesson. + +### The magic is powerful enough to ward off most blades, creating a true predicament for one who is trapped by these. + +### Magic Ribbons (Arms) + +### Those ribbons will hold you tight~ + +### I've put a magic seal in that bow-knot to keep it secure! + +### Magic Ribbons (Legs) + +### Magic Ribbons (Feet) + +### Magic Ribbons (Harness) + +### Magic Ribbons (Pelvis) + +### Magic Ribbons (Mittens) + +### They are wrapped tightly around your hands with a bow knot! + +### Magic Ribbons (Gag) + +### They are wrapped tightly around your mouth with a bow knot! + +### Living Ribbon Collar + +### This collar is designed to make sure its wearer does not escape the ribbons. + +### It will occasionally cause ribbons to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ribbons you have on you. + + + +### Ice (Arms) + +### Frigid restraints made out of ice. + +### There's no way to remove it without breaking it off. + +### Ice (Mouth) + +### Ice Ball Gag (Mouth) + +### A cold sphere of magic ice lodged firmly in your mouth. + +### The work of a kinky elemental. It will melt! Eventually. + +### Ice (Body) + +### Ice (Legs) + +### Glue (Feet) + +### A latex-derived glue that attaches you to the floor! It's very stretchy. + +### Just touching it makes it stick all over... + +### Glue (Ankles) + +### Glue (Legs) + +### Slime (Feet) + +### Sticky slime that adheres to your body. It reacts negatively to mana... + +### It is an organic material that reforms around every cut you make! + +### Slime (Ankles) + +### Slime (Legs) + +### Slime (Arms) + +### Slime (Hands) + +### Slime (Mouth) + +### Slime (Head) + +### Living Slime Collar + +### This collar is designed to make sure its wearer does not escape their slime. + +### It will occasionally cause slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slime you have on you. + + + +### Made from hardened slime. + +### The classic smooth, shiny material for full encasement. + +### A semi-organic substance of alchemical origin. + +### It has a mind of its own, and tends to spread if not properly contained. + +### Proto Rubber + +### Made from hardened proto rubber. + +### A hardened form of the essence of latex. + +### Proto Slime + +### Alchemical rubber in its simplest form. Amorphous. + +### Often forms strange growths, seeking damsels to encase. + +### Rubber (Feet) + +### Sticky rubber that has fused itself into a skintight layer. + +### There's no struggling out now, but since it's solid it may be cuttable. + +### Rubber (Ankles) + +### Rubber (Legs) + +### Rubber (Arms) + +### Rubber (Hands) + +### Rubber (Mouth) + +### Rubber (Head) + +### Living Rubber Collar + +### This collar is designed to make sure its wearer does not escape their rubber. + +### It will occasionally cause rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. + + + + + +### Proto-Slime (Feet) + +### It seems to be a precursor to the slimes everyone is familiar with? + +### Proto-Slime (Ankles) + +### Proto-Slime (Legs) + +### Proto-Slime (Arms) + +### Proto-Slime (Hands) + +### Proto-Slime (Mouth) + +### Proto-Slime (Head) + +### Living Proto-Slime Collar + +### This collar is designed to make sure its wearer does not escape the slime. + +### It will occasionally cause proto-slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-slime you have on you. + + + +### Proto-Rubber (Feet) + +### Sticky slime that has fused itself into a skintight layer. + +### Proto-Rubber (Ankles) + +### Proto-Rubber (Legs) + +### Proto-Rubber (Arms) + +### Proto-Rubber (Hands) + +### Proto-Rubber (Mouth) + +### Proto-Rubber (Head) + +### Living Proto-Rubber Collar + +### This collar is designed to make sure its wearer does not escape the rubber. + +### It will occasionally cause proto-rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-rubber you have on you. + +### Sticky Tape + +### Extra-strength utility tape, for your secure packaging needs. + +### It's quite sticky, the adhesive requires some force to get off. + +### Tape Mittens + +### Sticky tape that holds your hands into a fist! + +### It's tough to get out of without some kind of grip! + +### Arm Chains + +### Heavy chains keeping your arms securely behind your back. + +### It doesn't look like a knife is up to the task... + +### Leg Chains + +### Heavy chains keeping your legs firmly hobbled. + +### Ankle Chains + +### Heavy chains keeping your feet bound together. + +### Crotch Chain + +### Heavy chains that serve as an anchor point around your waist. + +### Magic Arm Chains + +### Magic chains keeping your arms securely behind your back. + +### Magic Leg Chains + +### Magic chains keeping your legs firmly hobbled. + +### Magic Ankle Chains + +### Magic chains keeping your feet bound together. + +### Magic Crotch Chain + +### Magic chains that serve as an anchor point around your waist. + + + +### Shadow Chains (Arms) + +### Black chains for those who cross the divines + +### Shadow Chains (Legs) + +### Shadow Chains (Ankles) + +### Shadow Chain + +### Ectoplasmic Chains (Arms) + +### Ghostly chains from a ghost that just doesn't want to let go. + +### It's made of an ethereal substance. + +### Ectoplasmic Chains (Legs) + +### Ectoplasmic Chains (Ankles) + +### Ectoplasmic Chain + +### Divine Cuffs + +### It is said that even heaven has its hierarchies... + +### Shining cuffs made of holy metal. Nothing can touch it. + +### Divine Muzzle + +### Keep those lips sealed. + +### A shining muzzle made of holy metal. Nothing can touch it. + +### Divine Gag + +### A shining gag made of holy metal. Nothing can touch it. + +### A piece of cloth secured onto your face and blocking vision. + +### Cleave Gag + +### A piece of cloth forced between your lips. + +### On its own it's not very restrictive. + +### Thick Cleave Gag + +### A piece of cloth that makes it hard to speak. + +### It's somewhat effective. + +### Knotted Cloth Gag + +### A piece of cloth tied in a knot and tied over your mouth. + +### It's pretty effective at keeping you quiet. + +### OTN Cloth Gag + +### A piece of cloth tightened over your mouth. + +### A scarf secured onto your face and blocking vision. + +### Scarf Gag + +### A scarf tightened over your mouth. + +### Scarf Tie + +### A scarf wrapped around your body. + +### Scarf Leg Tie + +### Scarf Ankle Tie + +### Arm Belts + +### A ludicrous amount of belts secured with a buckle. + +### Lockable and fully adjustable to ensure snugness. + +### Leg Belts + +### Ankle Belts + +### Iron Cuffs + +### Tough shackles with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +### You could pick these with a hairpin. + +### Iron Shackles + +### Tough shackles with a rudimentary lock. + +### Tough to walk in. + +### Thumbcuffs + +### Interferes with the use of your hands. + +### Another layer of restriction. + +### Hinged Handcuffs + +### Hinged cuffs with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +### Difficult to unlock, let alone pick by yourself. + +### Heavy Handcuffs + +### A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +### The position is too awkward to free yourself, even with a key... + +### Heavy Leg Irons + +### A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. + +### The position is awkward, but it's on your feet so you can remove them yourself if you have free hands. + +### Thigh Shackles + +### Heavy shackles with a rudimentary lock. + +### The enemy attaches your leg shackles together! + +### Linked Thigh Shackles + +### The leg shackles chain detaches! + +### Ankle Shackles + +### Linked Ankle Shackles + +### The enemy attaches your ankle shackles together! + +### The ankle shackles chain detaches! + +### Steel Muzzle + +### A heavy muzzle with a rudimentary lock. + +### You could pick this with a hairpin. + +### Blacksteel Muzzle + +### A heavy duty steel muzzle with a flexible metal locking pin and straps. + +### Perfect for sealing away those unruly lips. + + + + + +### Cursed Collar + +### A cold steel collar locked tightly on your neck. + +### It appears to attract additional enemies to its wearer. + + + +### Face + +### Head + +### Mouth + +### Ears + +### Neck + +### Arms + +### Hands + +### Torso + +### Bra + +### Belt + +### Plug + +### Vibe + +### Piercings + +### Butt Plug + +### Legs + +### Ankles + +### Device + +### You found an item that was too small to see! + +### You pick up XXX gold. + +### You retrieve an ancient power crystal. + +### You retrieve a spent ancient power crystal. + +### You pick up a magical amulet and use it to boost your stats. + +### You pick up a Leyline Map. + +### You pick up a knife. + +### You pick up a torch. + +### You found a bundle of discarded knives! + +### You pick up a magic knife. + +### You pick up a lockpick. + +### You pick up a normal key. + +### You pick up a green key. + +### You pick up a blue key. + +### You pick up a willpower potion. + +### You pick up a glowing blue mana potion. + +### You pick up a glowing blue orb. + +### You pick up an invisibility potion. + +### You pick up a handful of ectoplasm. + +### You pick up a green stamina potion. + +### You pick up a frigid white potion. + +### You found a peculiar note on the ground and keep it in your journal. + +### You found an uninteresting note on the ground. + +### You pick up a heavy hammer. + +### You pick up a set of bolt cutters. + +### You pick up a sharp sword. + +### You pick up a flamberge. + +### You recover your escort drone. + +### You pick up a 'magic' wand... + +### You pick up a magical ice cube. + +### You find some treated hemp rope. + +### Feather + +### A feather taken from some large fluffy being. + +### Deals tickle damage. Greatly distracting. Offhand: +1 tickle damage on attack for 3 stamina. Greatly distracting. + +### You pick up a feather. + + + +### Maid's Feather Duster + +### An instrument used extensively by maidforce agents carrying out their duties. + +### Deals tickle damage. Distracts enemies. Offhand: +15 distraction on attack for 1 stamina. + +### You pick up a feather duster. + + + +### Rope Rune + +### You smash the rune in front of you, and a flash of light enchants nearby ropes! + +### It feels tantalizing to look at. + +### Allows you to enchant ropes into more powerful restraints. + +### You pick up a kinky trinket with a glowing red sigil. + +### You pick up a heavy flail. + +### You pick up a shortspear. + +### You pick up a long spear. + +### You pick up a pickaxe. + +### You pick up an enchanted sword. + +### You pick up an enchanted axe. + +### You pick up an enchanted hammer. + +### You pick up a light hammer that's inscribed 'IceBreaker'. + +### You pick up an enchanted spear. + +### You pick up an enchanted flail. + +### You pick up a powerful axe. + +### You pick up a consumable smoke bomb. + +### You pick up a stone trinket with a glowing red sigil. + +### You pick up a wet rock with some kind of symbol on it. + +### You pick up a crystal beautiful as the moon. + +### You pick up a strange device with a sharpened razor disc. + +### You find a strange ancient device with a sharp cutting blade. + +### You pick up a stone trinket with a glowing blue sigil. + +### You pick up a bola. + +### You pick up a bomb! + +### You pick up Dragonslaver. + +### You pick up Metamorphosis. + +### You pick up Four Seasons. + +### You pick up The Arbiter. + +### You pick up Dreamcatcher. + +### You retrieve the Bondage Buster EX. + +### You salvage a Bondage Buster MK II. + +### You retrieve a Nevermere Blaster Mark IV. + +### You retrieve the Messenger of Love. + +### You retrieve Moirai's scissors. + + + +### You pick up a bunch of scrolls! + +### You pick up a Scroll of Sleight. + +### You pick up a Scroll of Purity. + +### You pick up a Scroll of Speech. + +### You pick up a Scroll of Sauntering. + +### Your weapon is pulled out of your grasp!!! + +### Your weapon is pulled out of your hand and tossed away by your captor! + +### Your weapon slips out of your hand as you try to cut with it... + +### You put away the WEAPONNAME + +### You equip the WEAPONNAME + +### Unequip + +### Equip + +### Equipped + + + + + +### Unlit Torch + +### Can be lit + +### Provides light + +### Lantern + +### Magic Lantern + +### Unlit Lantern + +### Wall Sconce + +### Broken Wall Sconce + +### It is beyond repair. + +### Light Portal + +### Empty Portal + +### Stare into the void... + +### Liquid Latex + +### Engulfs creatures + +### Engulfs pets (like you) + +### Slows creatures + +### Glue + +### Ice + +### Chilling and slippery + +### Water + +### A concentration of moisture. + +### Looking for a new wearer + +### Chains + +### Broken pieces of chain + +### Belts + +### Pieces of straps and leather + +### Vines + +### Fierce plantlife + +### Ribbons + +### Empowered with magic + +### Blessed Wrappings + +### Enchanted wrappings + +### Summoning Runes + +### Mystical runes used for summoning + +### Casting Runes + +### Mystical runes used for casting spells + +### Suspicious Mechanism + +### A suspicious mechanism that seems to have been hastily put together. + +### Suspicious Runes + +### A suspicious magic circle that was scrawled recently. + +### Embers + +### Ignition source. Blocks vision. + +### Inferno + +### Deals DAMAGEDEALT fire damage per turn + +### Steam + +### Blocks vision + +### Smoke + +### Cracked Earth + +### Makes creatures unsteady + +### Rubble + +### You don't think insurance will cover this. + +### No putting that back together. + +### Can be controlled using CMD spells + +### Can be controlled using Rubbermancy + + + +### Floor + +### Object + +### Brickwork + +### Doodad + +### Furniture + +### Table + +### Shrine + +### Closed Door + +### Open Door + +### Bed + +### Bars + +### Ruined Shrine + +### Orb Altar + +### Empty Altar + +### Chest + +### Faction Chest + +### Open Chest + +### Shiny Object + +### Cracked Wall + +### Hook + +### Entrance + +### Exit Stairs + +### Mysterious Stairs + +### Ghostly Adventurer + +### Button + +### Conveyor + +### Safety Conveyor + +### Doll Terminal + +### Doll Supply + +### Bondage Machine + +### Empty Fixture + +### Filled Fixture + +### Tablet + + + + + +### Ars Pyrotecnica + +### Codex Imaginus + +### Clavicula Romantica + +### A book of elemental magic + +### A book about conjuration + +### A book of manipulative spells + + + +### Verbal + +### Vision + +### Components: + +### Arm Movements + +### Leg Gestures + +### You mumble incoherently trying to cast the spell... + +### You wiggle uselessly trying to cast the spell... + +### Your feet are too clumsy to perform the magic gesture... + +### You are unable to see, so you can't target this spell... + +### Next Page + +### Last Page + +### >>> + +### <<< + +### Random Page (your hands are tied) + +### Misc + +### Other + +### Strength + +### Dexterity + +### Intelligence + + + +### Unique + +### Active + +### Upgrades + +### Learnable + +### Unlearned + +### Learned + +### Excl. Upgrades + +### Passive + +### Upcast + +### Buffs + +### DoT + +### Projectiles + +### Melee + +### Area Damage + +### Area Denial + +### Offense + +### Defense + +### Fire + +### Earth + +### Air + +### Lightning + +### Teleport + +### Physics + +### Summoning + +### Binding + +### Stealth + +### Projection + +### Alteration + +### Light + +### Shadow + +### Knowledge + +### Archery + +### Utility + +### Spell Tree + +### Stamina + +### Damage + +### Distraction + + + +### Empower to upcast spells + +### Cancel empowerment + +### You channel mana through your body! Empowerment level: LEVEL + +### You are already at the maximum empowerment level! + +### You don't have any upcast spells yet. + +### Upcast from SPELL + +### You fail to concentrate on the spell and it fizzles! + +### Your gag causes you to mispronounce the magic words! + +### You are too clumsy to perform the leg movements! + +### You can't get a good look at the target! + +### You trip up while casting the spell! + +### You miscast the spell because of a bug. Please report. + +### You wave your arms around and make the wrong symbol with your hands! + +### Your restrained fingers can't make the magic glyphs in time! + + + +### The ice drains your concentration! Your mana and stamina are slipping away! + +### A strange, chaotic energy flows into you! Your will is weakened and your mana fades! + +### Something gently, constantly tickles you! + +### The ampule shatters on impact! + +### The gas ampule shatters on impact! + +### The glue ampule shatters on impact! + +### The rubber ampule shatters on impact! + +### The latex ampule shatters on impact and forms a restraint! + +### The latex ampule shatters on impact and coats your body! + +### The latex ampule shatters on impact and sticks to you! + + + +### Shadowy chains appear from a rift in space! + +### The roaring inferno deals 10 damage to you! + +### The Reaping + +### +20% damage to plants + +### Magically Iliterate + +### You've never read a magic book. Elemental, Conjuration, and Illusion spells cost 3x as many spell points. + +### Magical Spark + +### Reduce the penalty from Magically Iliterate to 2x. + +### Magical Training + +### Remove the penalty from Magically Iliterate. + +### Reap What You Sow + +### Defeating a non-humanoid enemy causes vines to sprout on their space temporarily. + + + +### Battle Rhythm + +### Stores 10% of the stamina cost of attacks as Rhythm, up to a total of 40. While you have over 10 Rhythm, you gain +10 Block and Evasion. Enemy base accuracy against you is decreased by a % equal to your Rhythm. If an attack misses or is blocked because of this, reduce Rhythm by 25% of the enemy attack power. Decays when not attacking. + +### Limit Surge + +### Spend 40 WP to fully restore Stamina, also stamina gain is increased by 30% for 20 turns. If your Willpower ends up 0 because of this, you are stunned for 2 turns. + +### Battle Trance + +### While at 40 Battle Rhythm, you attack twice per turn. + +### Combat Maneuver + +### When Battle Trance is active, you gain a free move if the target is defeated before the second attack hits. + + + + + +### Devious Ingenuity + +### Trap-type spells and consumables no longer require you to channel them, but still have a delay before arming. + + + + + +### Essence Motes + +### When you miscast a spell, you gain an Essence Mote which appears in a random space next to you. You can consume this mote to gain -100% miscast chance decaying over 10 turns. Walking over the mote also consumes it. + +### Inner Power + +### As a wizard, you are able to draw upon mystical sources of energy that others can't even see. After 16 turns of not casting a spell or attacking, your next spell's mana cost is reduced by 20% of your max mana BEFORE multipliers. Toggled passive spells apply half the cooldown. + +### Battlemage + +### Inner Power cooldown is no longer reset after attacking. + +### Relentless Casting + +### While on cooldown, Inner Power cooldown is no longer reset after casting spells. + +### Arcane Recharge + +### Calling upon chaotic energies, your willpower is assaulted in exchange for power. Deals 80 psychic damage to self and drains 10% of your max Willpower to fully restore mana. Does not refill the mana pool. + +### Way of Pleasure + +### You have chosen the path of absolute pleasure. After letting go of yourself, you restore 50 mana, which can refill the mana pool if you have spare willpower. Blocks Way of Discipline. + +### Intense Power + +### After letting go of yourself, you feel an immense surge of power, increasing magic damage by 40% for 8 turns after you regain control, and by 10% while you remain satisfied. + +### Pleasure Training I + +### You remain satisfied for much less time after letting go. Letting go costs 50% less stamina. + +### Pleasure Training II + +### You are quite difficult to satisfy. Letting go costs 50% less stamina (75% total) and 50% less willpower. + +### Mental Resistance + +### +100 Psychic and Charm Resist. You can no longer let go involuntarily while your WP is above 10% or you are shielded, and willpower drains 70% slower while edged. (click the buff to toggle) + +### Mental Resistance: You cannot orgasm except by choice or below 25% WP. Click to toggle. + +### Mental Resistance: You are allowing yourself to let go. Click to toggle. + + + +### Way of Discipline + +### You have chosen the path of absolute discipline. Being in an Edged state increases passive mana recovery and you regenerate 0.5 mana per turn, restoring the same amount to the Mana Pool if you have willpower to spare. Blocks Way of Pleasure. + +### Way of Denial + +### Harnessing your mental discipline, you regenerate 20 mana each time you are denied, restoring the same amount to the Mana Pool if you have willpower to spare. + + + +### Flame Novice + +### Unlocks fire spells. Learn Firebolt. + +### Lightning Novice + +### Unlocks electrice spells. Learn Electrify. Gain increased resistance to blinding from bright lights. + +### Water Novice + +### Unlocks water spells. Learn Water Ball. + +### Ice Novice + +### Unlocks ice spells. Learn Freeze. + +### Earth Novice + +### Unlocks earth spells. Learn Stone Skin. + +### Air Novice + +### Unlocks air spells. Learn Wind Blast. + +### Latex 101 + +### Unlocks latex spells. Learn Slime Ball. + +### Metal 101 + +### Unlocks metal spells. Learn Conjure Cuffs. + +### Rope 101 + +### Unlocks rope spells. Learn Conjure Ropes. + +### Leather 101 + +### Unlocks leather spells. Learn Conjure Gag. + +### Physics 101 + +### Unlocks teleportation and spatial manipulation spells. Learn Wall. + +### Summoning 101 + +### Unlocks summoning spells. Learn Summon Familiar. + +### Blessing of Shadow + +### Unlocks shadow spells. Learn Shadow Dagger. + +### Blessing of Light + +### Unlocks light spells. Learn Flash. Gain significantly increased resistance to blinding from bright lights. + +### Blessing of Obscurity + +### Unlocks invisibility spells. Learn Camouflage. + +### Projection Magic + +### Unlocks illusory spells. Learn Summon Decoy. + +### Alteration Magic + +### Unlocks alteration spells. Learn Confuse. + +### Arcane Knowledge + +### Unlocks knowledge and critical-strike spells. Learn True Steel, and unlocks advanced tooltips for enemies. + + + +### The glue sticks to you and engulfs your legs! + +### The glue slows you down! + +### The glue slows you down! (-DamageDealt SP) + +### Firebolt + +### Elemental's Firebolt + +### Elemental's Gust + +### Gust + +### A ball of flame that does DamageDealt damage to one target. + +### You a hurl a firebolt! + +### Choose aim direction + + + +### Windblast + +### Three scattered puffs of wind that do DamageDealt blast damage at close range, stun briefly, and push targets back. + +### You press your wrists together and conjure a blast of wind! + +### Three puffs of wind in a tight cone that deal DamageDealt blast damage and push targets back. + +### You exhale a mighty wind! + + + +### Throw one of your knives DamageDealt damage. Lands in the target's tile, but is recoverable afterward. + +### You a throw a knife! + +### Shadow Dagger + +### A cold shadowy blade that deals DamageDealt damage and pierces all in its path. + +### You a hurl a shadowy dagger! + +### Shadow Slash + +### Shadow Scythe + +### Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. Deals 50% more damage when you are attacking from the shadows. + +### You create a tear in space with your finger! + +### Blink + +### Instantly teleport to an adjacent position and gain +50 evasion for 3 turns. Unlocks Blink and Warp when learned. + +### You teleport! + +### Choose target location (1 tile range) + +### Blink II + +### Instantly teleport up to 2 tiles away. Must have vision of the target point. Stuns an enemy if you teleport behind them. + +### Choose target location (2 tile range) + +### Blink III + +### Instantly teleport up to 3 tiles away. Must have vision of the target point. + +### Choose target location (3 tile range) + +### Ice Shard + +### A shard of ice that does DamageDealt damage and slows for Duration turns. Freezes if already slowed or drenched. + +### You a hurl a shard of ice! + +### Ice Lance + +### A quick-moving shard of ice that does DamageDealt damage and slows for Duration turns and passes through enemies. Freezes if already slowed or drenched. + +### You conjure a mighty spear of ice and hurl it forward! + + + +### Snowball + +### A fast orb that leaves behind a frigid cloud of ice. Enemies walking in the cloud take DamageDealt ice damage per tile and are slowed. + +### You a hurl a snowy blast! + +### Winterblast + +### A piercing orb that leaves a trail of ice. Deals DamageDealt ice damage to enemies hit. + +### You a hurl a frigid orb! + +### Freeze + +### Chill an adjacent target for DamageDealt ice damage and slows for Duration turns. Freezes if already slowed or drenched. + +### You utter dark words of ice-cold truths. + +### Choose a target to freeze + +### Flash Frost + +### Deal DamageDealt ice damage in a 3x3 area. Drenched creatures are frozen for 8 turns. + +### You recite a frigid poem... + +### Choose a 3x3 area to freeze + +### Shatter + +### When a frozen target thaws or dies, deals DamageDealt ice damage to nearby targets and slow for 4 turns.. + +### Ignite + +### Ignite a friendly target for Duration turns, dealing DamageDealt fire damage per turn to it and nearby targets. + +### You spin in a circle, inscribing flames with your feet! + +### Choose a friendly target to ignite + +### Conjure Chain + +### Magic Chain + +### Magic Belt + +### Witch's Chain + +### Throws a chain that does DamageDealt chain damage. Targets with 50% or more binding take 50 crush damage and are slowed for 4 turns. + +### You a hurl a strand of chain! + + + +### Enchant Rope + +### Rope Enchantment + +### Spellbinding + +### Convert rope binding on a target into magical bindings, which are much more powerful. Deals a small amount of arcane damage. + +### You whisper an enchanting tale of rope bondage... + +### Choose targets to tighten the ropes of + +### Conjure Ropes + +### Animated Rope + +### Launch 3 ropes that deal DamageDealt chain damage each and add 32 rope binding. + +### You animate a bunch of ropes! + +### Ropestorm + +### Launch 9 ropes that deal DamageDealt chain damage each and add 32 rope binding. Best in open spaces. + +### You animate a sizeable quantity of ropes! + +### Steel Torrent + +### Steel Rain + +### The plug hits you! (DamageDealt) + +### The plug directs itself between your legs! + +### Fire 4 Steel Rain in quick succession toward the target point. Best in open spaces. + +### Fires a steel plug that deals DamageDealt piercing damage. Bound targets are Plugged, which increases Distraction over time. + +### You raise your hand and a steel projectile appears! + +### You raise your hand and several steel projectiles appear! + +### Choose target point + + + +### Restraining Device + +### The thrown restraining device latches onto you as you struggle to get it off!!! + +### The restraining device wraps many elastic cables around you!!! + +### Shadowy Grip + +### A dark hand latches onto you and holds you tight! + +### You are snugly wrapped in glowing ropes! + +### Obsidian Orb + +### Metallic restraints encircle your body! + +### The latex spreads across your limbs and rubberizes, forming a tough barrier! + +### The latex spreads across your limbs and hardens, forming a stretchy layer! + +### The latex clings to you and slows you down, making you vulnerable to the barrage! + +### The latex expands rapidly and slows you down as it hardens into a stretchy layer! + + + +### You throw a bola! + +### You ready a bola! + +### You are feeling drowsy... + +### Shadow Strike + +### Shadow Heel + +### Runic Ward + +### Gives yourself or a creature a magic shield for 50 turns, granting +30 Magic Armor. + +### You whisper a word of protection! + +### Choose creature to shield + +### Afterimage + +### Massively increases a creature's evasion for 5 attacks. Expires after 25 turns. + +### Your movements intensify! + +### Choose creature to buff + + + +### Magical Sight + +### Highlight the location of interesting magical phenomena for 20 turns + +### You analyze the target! + +### Choose object to analyze + +### Barrier Runes + +### Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns, but doesn't block movement. + +### You raise a field of runes with a command word! + +### Choose barrier location + +### Electric Field + +### Creates a conductive area for Duration turns. Makes all entities in the area Conductive, forcing them to share 50% electric damage. + +### You energize the targeted area! + +### Choose target 3x3 area + +### Firey Explosion + +### Icey Explosion + +### Witch's Electric Orb + +### Witch's Electric Burst + +### Electrify + +### A delayed shock that deals DamageDealt damage and stuns for Duration turns. + +### You charge up a burst of electricty! + +### Choose target location + +### The elemental channels the force of the storm! + +### Fireball + +### A slow moving ball of flame that explodes for DamageDealt fire damage in a wide area. + +### You a hurl a massive fireball! + +### Fireblast + +### A bolt of flame that explodes for DamageDealt fire damage in an area. + +### You a hurl a blast of flame! + +### Incinerate + +### A tornado of flame that does DamageDealt damage per turn for LifeTime turns. + +### You conjure a gout of flame! + +### Choose target AoE location + +### Hailstorm + +### A cloud of falling ice that does DamageDealt damage per turn for LifeTime turns and slows. + +### You conjure a flurry of frost! + +### Raincloud + +### After 3 turns, rain falls, creating a 3x3 grid of water and dealing DamageDealt acid damage to enemies within. + +### You create a stormy cloud! + +### Field of Frost + +### Freezes a 5x5 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. + +### You stomp your foot and call forth the blizzard! + +### Choose target AoE location (5x5) + +### Zone of Frost + +### Freezes a 3x3 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. + +### You sweep your foot and call forth the storm! + +### Choose target AoE location (3x3) + +### Cold Feet + +### Freezes a single tile (ice slows entities). Any enemy standing on the tile takes take DamageDealt damage per turn for LifeTime turns. + +### You tap your foot and call forth the frost! + +### Choose target location (1x1) + +### Healing Light + +### Channel to heal 15 hitpoints per turn to summoned allies within a 5x5 area. + +### You conjure a healing light! + +### Crackle + +### Storm Bolt + +### A bolt of lightning that does DamageDealt electric damage to enemies in a 4-range line and briefly stuns. + +### Lightning erupts from your fingertips! + +### Choose line direction (max range 4 tiles) + +### Tremor + +### Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. Creates a slowing field after. + +### You call forth the rage of the earth. + +### Choose AoE + +### Earthquake + +### Channel for 5 turns to send 2 tremors per turn in target area. + +### You channel the fury of the earth!!! + +### Shock Orb + +### A slow-moving orb that deals DamageDealt electric damage to an adjacent enemy each turn. + +### You hurl a charged orb! + +### Choose aim direction (max range 4 tiles) + +### Lightning Rune + +### A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 3 turns to setup. 200% crit multiplier. + +### You conjure a charged trap! + +### Choose location for trap + +### Freeze Rune + +### A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 3 turns to setup. 200% crit multiplier. + +### You conjure an icy trap! + +### Flame Rune + +### A trap that deals DamageDealt fire damage in an area. Takes 3 turns to setup. 200% crit multiplier. + +### You conjure an incendiary trap! + + + +### Conjure a sphere for Duration turns that makes nearby entities Conductive and each turn deals DamageDealt electric damage to one of them. + +### You summon a grey, featureless sphere adorned by static! + +### Choose sphere location + + + +### Fissure + +### Lava Fissure + +### A great fissure erupts from the earth, dealing 70 fire damage to enemies in a 4-range line and dealing 15 damage/turn for 6 turns. + +### You stomp the ground and the earth opens its gaping maw! + +### Lightning Bolt + +### A bolt of lightning that does DamageDealt damage to enemies in an infinite line and briefly stuns. + +### You unleash a bolt of lightning! + +### Choose line direction + +### Corona + +### Binding Light + +### Chaos Beam + +### Mystic Beam + +### Mystic Barrage + +### A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt holy damage to the first target hit. Blinds for 12 turns. 150% crit multiplier. + +### You charge a powerful beam attack!!! + +### Icicles + +### Icicle + +### Channel 3 turns to fire 3 icicles that deal DamageDealt ice damage and slow for 4 turns, freezing slowed/drenched targets for 3 turns. + +### You raise a hand and icicles fly forward! + + + +### Volcanism + +### An area of summoned rocks becomes explosive. Deal fire damage to them to ignite, dealing DamageDealt fire damage to adjacent targets. + +### You stomp your foot and magma wells up beneath the ground! + +### Choose monoliths to enchant + + + +### Coalesce + +### Gathers slime and slimed enemies into a central point. Deals DamageDealt glue damage per square of slime and Encases slimed enemies. Costs half mana if there is only slime. + +### You command the slime to draw enemies in! + +### Choose area containing slime + +### Animate Slime + +### Summons up to 3 slimes on slime tiles in an AoE. The slimes are friendly to you. + +### You concentrate magical energy into the slime, giving it a will of it's own... + +### Animate Large Slime + +### Target an area with at least 3 slime tiles. Summons a large slime that is friendly to you. + +### Latex Puppet + +### Target an area containing helpless encased enemies. Transforms up to 3 of them into latex dolls that serve you for a while. + +### You concentrate magical energy into your victim's bindings, forcing them to move... + +### Choose area containing encased helpless enemies. + +### Solidify + +### Solidifies slime in the area into Latex. Latex adheres to enemies and slowly binds them, escasing them when they are fully bound. + +### You inscribe a transmutation circle on the floor. + +### LiquidMetal + +### Solidifies Latex in the area into Liquid Metal. Liquid Metal is slippery, but also adheres to enemies and slowly binds them in metallic bonds. Enemies encased in liquid metal are more susceptible to knockback due to the slippery nature. + +### Choose area containing Latex + +### Slime Repulsion + +### Gain +50 glue resist. (Having 45 or more Glue Resist negates many negative effects from slime) + +### Spread + +### Slime in the target area expands by 1 unit in the four cardinal directions. Refreshes duration to 12-20 turns. + +### The slime spreads! + +### Wall of Slime + +### Unlocks horizontal and vertical slime walls that traps enemies who try to pass through. + +### Wall of Slime (Vert) + +### Creates a vertical wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. + +### You tap your foot and a wall of slime slowly raises out of the ground. + +### Choose vertical wall origin (5 tiles high) + +### Wall of Slime (Horiz) + +### Creates a horizontal wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. + +### Choose horizontal wall origin (5 tiles wide) + +### Wall of Latex + +### Unlocks horizontal and vertical latex walls that encase enemies that walk through. + +### Wall of Latex (Vert) + +### Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. + +### You tap your foot and a wall of latex stretches out across the corridor. + +### Wall of Latex (Horiz) + +### Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. + +### Earthshape + +### Unlocks 3 spells that allow creating mounds, rings, or lines of 50hp, 25 armor rocks. + +### Earthen monoliths rise from the ground! + +### An earthen monolith rises from the ground! + +### Earthshape (Ring) + +### Create a large ring of Earthen Monoliths. They have 50 hitpoints and 25 armor. + +### You stomp your foot and monoliths emerge in a ring around you! + +### Choose ring origin + +### Earthshape (Mound) + +### Create a 3x3 field of Earthen Monoliths. They have 50 hitpoints and 25 armor. + +### You stomp your foot and monoliths emerge from the ground! + +### Choose mound origin + +### Earthshape (Line) + +### Create a 4-tile line of Earthen Monoliths. They have 50 hitpoints and 25 armor. + +### Earthshape (Arc) + +### Create a 5-wide arc of Earthen Monoliths. They have 50 hitpoints and 25 armor. + +### Rock + +### Channel 1 turn to launch a rock that deals DamageDealt crush damage and slows for 4 turns. Blocks up to 80 damage. + +### You raise a stone from the ground and kick it forward! + +### Earth Kick + +### Stone Projectile + +### Kick a summoned rock to turn it into a projectile. Deals DamageDealt crush damage in a 3x3 area and slows for 4 turns. + +### With a solid kick, you launch one of your monoliths forward! + +### Choose a monolith to kick + +### Boulder + +### Channel 1 turn to launch a huge slow rock that deals DamageDealt crush damage and slows for 8 turns. AoE, collides with summoned rocks. Blocks up to 200 damage. + +### You raise a massive boulder from the ground and kick it forward! + + + +### Stamina Up I + +### Increases maximum SP by 12 + +### Iron Will + +### While you have 100 current willpower or more, regain an additional 4 stamina per turn. + +### Defiance + +### For each 10 current willpower you have over 50, gain +5 Bondage Resist. + +### Willful Struggle + +### For each 10 current willpower you have over 50, gain +1% struggle power. + +### Your willpower provides you with additional strength! (+AMOUNT%) + +### Athlete + +### Sprinting costs 40% less stamina. + +### Sneaky + +### You are harder to see when waiting. + +### Vault + +### You can sprint under flying enemies and through vulnerable, slowed, or disabled enemies. Does not work on immobile enemies such as doors and turrets. + +### Improved Vault + +### You can dash through enemies that aren't immobile. + +### Dodge I + +### +10 Evasion + +### Dodge II + +### +15 Evasion (25 total) + +### Dodge III + +### +25 Evasion (50 total) + +### Strength Up + +### +20% Physical Damage + +### Deadly Aim + +### Increases crit multiplier by a % equal to your Battle Rhythm. + +### Accuracy I + +### +10 Accuracy + +### Accuracy II + +### +15 Accuracy (25 total) + +### Accuracy III + +### +25 Accuracy (50 total) + +### Martial Arts I + +### Unarmed strikes gain 15% accuracy and -10% stamina cost. + +### Martial Arts II + +### Unarmed strikes gain 20% accuracy (35% total) and -15% stamina cost (25% total). + +### Martial Arts III + +### Unarmed strikes gain 25% accuracy (60% total) and -25% stamina cost (50% total). + +### Precise Critical + +### When landing a critical strike with physical damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. + +### Precise Magic + +### When landing a critical strike with magic damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. + +### Magical Overload + +### When landing a critical strike with magic damage, crit multiplier is increased by 25% of your current DP. + + + +### Brute Force + +### When enabled, your attacks deal 10% of your willpower as additional crush damage but cost 10 more stamina. + +### One With Slime + +### While standing on slime/latex, you can cast rubber spells without components. + +### Convincing Disguise + +### While standing still on slime, or fully bound with at least one latex item, you are harder to notice. Each latex restraint you are wearing increases this amount. Can be toggled off by clicking the buff icon. + +### Magical Implements + +### While holding a magical weapon like a staff or magic knife, your mana costs are reduced by 20%. + +### Mage Circuits + +### Increases the size of the passive mana pool by +400. + +### Archmage + +### Upcasted spells cost 25% less mana. + +### Temperature Play + +### Fire and Ice damage do 30% more damage to fully bound enemies. + +### Fire Hazard + +### Fire damage ignites enemies for 5 damage per turn for 6 turns. + +### Frozen Prison + +### Freezing an enemy applies 10 binding per turn of freeze added, plus brings the enemy to a minimum of 20% binding. + +### Lightning Rod + +### After casting an Air or Storm spell that costs mana, become Conductive and gain 300% electric resist for 3 turns. + +### When enabled, enemies in chastity become angry Frustrated Pets when becoming helpless. + +### Mana Up I + +### Increases maximum MP by 12 + +### Mana Up II + +### Mana Up III + +### Strong Mind I + +### Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn + +### Strong Mind II + +### Strong Mind III + +### Expert Wizard + +### Gives you an additional spell choice slot + +### Master Wizard + +### Legendary Wizard + +### More Summons + +### Increases the permanent summon cap by +2 (from 2 to 4) + +### Many Summons + +### Increases the permanent summon cap by +2 (from 4 to 6) + +### Summon Bomb + +### Channel for 1 turn for a bomb that does DamageDealt blast damage in an area after DelayTime turns. + +### Fire in the hole! + + + +### An AoE trap on the ground that deals 25 chain damage, roots for 8 turns, and applies 80 points of binding. Takes 3 turns to setup. 200% crit multiplier. + +### You conjure a rope trap! + +### Rope Burst + +### An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 50 points of rope binding. Snares for Duration turns. + +### You call forth ropes from the abyss! + +### Select center of a a 3x3 AoE + +### Leather Package + +### After conjuring a leather restraint, you can conjure up to three more without advancing time. + + + +### Conjure Leather Cuffs + +### Conjured Leather Cuffs + +### The leather cuffs clasp your wrists and pull them tightly! + +### The leather cuffs hit you! (DamageDealt) + +### Summons a pair of cuffs which deals DamageDealt chain damage and adds 40 binding. Until the target struggles free, attacking the target disarms them for 3 turns. + +### You conjure leather cuffs! + +### The cuffs will appear next to you and fly toward the target point. + +### Conjure Blindfold + +### Conjured Blindfold + +### The blindfold wraps around your head and buckles tightly! + +### The blindfold hits you! (DamageDealt) + +### Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not blinded. + +### You conjure a blindfold! + +### The blindfold will appear next to you and fly toward the target point. + +### Conjure Cuffs + +### Conjured Cuffs + +### The cuffs pull your wrists together and click tightly! + +### The cuffs hit you! (DamageDealt) + +### Summons a pair of cuffs which deals DamageDealt chain damage and disarms for 5 turns. +40 binding if target is not disarmed. + +### You conjure a pair of cuffs! + + + +### Conjure Gag + +### The gag forces itself into your mouth and buckles tightly! + +### The gag hits you! (DamageDealt) + +### Summons a gag which deals DamageDealt chain damage and silences for 8 turns. +40 binding if target is not silenced. + +### You conjure a gag! + +### The gag will appear next to you and fly toward the target point. + + + +### Conjure Anti-Magic Gag + +### Conjured Anti-Magic Gag + +### The anti-magic gag forces itself into your mouth and buckles tightly! + +### The anti-magic gag hits you! (DamageDealt) + +### Summons a magic-absorbing gag which deals DamageDealt teasing arcane damage and silences for 15 turns. Applies a debuff that increases miscast chance by 50%. + +### You conjure an anti-magic gag! + + + +### Conjure Armbinder + +### Conjured Armbinder + +### The armbinder slips itself around your arms and buckles itself tightly! + +### The armbinder hits you! (DamageDealt) + +### Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Cannot be blocked. + +### You conjure a armbinder! + +### The armbinder will appear next to you and fly toward the target point. + +### Conjure Legbinder + +### Conjured Legbinder + +### The legbinder slips itself around your legs and buckles itself tightly! + +### The legbinder hits you! (DamageDealt) + +### Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. + +### You conjure a legbinder! + +### The legbinder will appear next to you and fly toward the target point. + + + +### Conjure Latex Gag + +### Conjured Latex Gag + +### Latex Gag + +### Latex Glob + +### The gag forces itself into your mouth and snaps on tightly! + +### The amorphous rubber stretches out into a restraint on your body! + +### The amorphous rubber sticks to you! (DamageDealt) + +### Summons a gag which deals DamageDealt glue damage and silences for 15 turns. +40 binding if target is not silenced. + +### Conjure Latex Armbinder + +### Conjured Latex Armbinder + +### The armbinder slips itself around your arms and snaps on tightly! + +### Summons an armbinder which deals DamageDealt glue damage and disarms for 13 turns. Cannot be blocked. + +### Conjure Latex Legbinder + +### Conjured Latex Legbinder + +### The legbinder slips itself around your legs and snaps on tightly! + +### Summons a legbinder which deals DamageDealt glue damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. + + + +### Conjure Straitjacket + +### Conjured Straitjacket + +### The straitjacket slips itself around your body and pulls your arms into its sleeves! + +### The straitjacket hits you! (DamageDealt) + +### Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. Cannot be blocked. + +### You conjure a straitjacket! + +### The straitjacket will appear next to you and fly toward the target point. + + + +### Conjure Harness + +### Conjured Harness + +### The harness slips itself around your torso and squeezes tightly as each buckle secures itself one by one! + +### The harness hits you! (DamageDealt) + +### Summons a harness which deals DamageDealt chain damage. Adds +50 binding per 25% binding level on target, up to +200. + +### You conjure a harness! + +### The harness will appear next to you and fly toward the target point. + +### Firecracker + +### A small delayed explosion that deals DamageDealt fire damage. + +### You shout an incendiary retort! + +### Choose AoE location + +### Feather Burst + +### After a brief delay, a small cloud of feathers tickles enemies for DamageDealt damage and +60 distraction for 3 turns. + +### You conjure a burst of frenetic feathers! + +### Tickle Cloud + +### For 10 turns, disembodied hands tickle a target location for DamageDealt tickle damage. + +### A swarm of hands holding feathers appears! + +### Choose location + +### Frustrated Pet + +### The pet collapses in frustration. + +### Mana Pet + +### The enemy steals your pet from you! + +### Display Doll + +### The enemy steals your doll from you! + +### Conjure Petsuit + +### Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery from mana pool. + +### You conjure an enchanted petsuit which wraps around your target, forcing her to follow you! + +### You watch in horror as your own creation lunges toward you, binding your hands and feet! + +### Choose a helpless target + +### Conjure Display Stand + +### Target only Helpless enemies. Creates a fixture that increases passive mana recovery from mana pool, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. + +### You conjure a fixture to hold your helpless target in place! + +### You watch in horror as your own creation encircles you, locking you in place with a hefty click! + + + +### Lesser Flash + +### Sparkles! + +### Mirror Image + +### A flash of light which renders anyone caught within blind for 7 turns + +### You charge up a bright flash! + +### Select where to center the flash (SpellArea radius) + +### Ring + +### A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged with a 3 turn delay. + +### You point and a noise emanates from the location! + +### Select where to center the noise (SpellArea radius) + +### Holy Blaze + +### Call down a 3x3 area of DamageDealt holy damage. Blinds enemies for 3 turns (and also yourself). + +### You summon a divine aura! + +### Select where to center the blast (SpellArea radius) + +### Greater Flash + +### A massive flash of light which renders anyone caught within blind for 16 turns and stuns briefly. + +### Focused Flash + +### A focused flash of light which renders anyone caught within blind for 30 turns and stuns for Duration turns. + +### You slowly charge up a powerful flash! + +### Shroud + +### Sleep Gas + +### Select where to center the shroud (SpellArea radius) + +### Creates a cloud for Duration turns that buffs evasion for all creatures. You are temporarily invisible for 8 turns after leaving. + +### You exhale a misty shroud + +### Invisibility + +### Select which creature to buff + +### Make the targeted creature invisible, increasing stealth for Duration turns + +### You snap your fingers! + +### CMD: Lock + +### Select which creature to lock + +### Magically locks down a target, preventing them from struggling below the current level of binding until freed by an enemy spellcaster (max 100% binding). + +### You say a command word, and magical locks bind your target! + +### Chastity + +### Select which creature to lock in a belt + +### Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs/toys, and distracts constantly. + +### You conjure a chastity belt, which latches onto your target! + +### Your own spell locks you in chastity! + +### Something fun enters your body... + +### Zone of Purity + +### Select an area + +### Creates an area which applies Chastity constantly to any enemy over with any amount of binding that steps inside. + +### You conjure a realm of absolute purity. + +### Zone of Excitement + +### Creates an area which adds a conjured vibrating toy to enemies that step inside. Toy lasts 30 turns. + +### You conjure a realm of absolute fun! + +### CMD: Capture + +### Select which creature to bind + +### Commands nearby restraints to bind a target, dealing DamageDealt chain damage, +50 binding. Ropes snare 3 turns/rope, belts +20 binding/belt, chains deal +15 crush dmg/chain. + +### You say a command word, and the bindings on the ground do your bidding! + +### CMD: Disenchant + +### Target a large area. Permanently slows constructs, reduces attack speed by 50%, and deals 30 shadow damage. Refunds 50% mana at 3 or more targets. Cast on self to disenchant bindings. + +### You say a command word, siphoning the magic from nearby constructs! + +### CMD: Vibrate + +### Target a large area. Enemies with plugs or toys are teased for Duration turns, taking charm damage each turn. + +### You say a command word, causing all toys in the area to vibrate! + +### CMD: Explosive Finish + +### Explosive Finish + +### Target a large area. Consumes enemy distraction to deal up to DamageDealt charm damage, twice if at 90% distraction or more. + +### You say a command word, resulting in a surge of energy entering your targets! + +### CMD: Release + +### Target bound (but unlocked) targets in a 3x3 area, reducing binding by 100. Removes unlocked restraints on player that are removable. + +### You say a command word, causing restraints to loosen! + +### You say a command word, but your restraints remain tight! + +### Remove Slime + +### Select a creature or yourself + +### Remove Slime and Encasement from target creatures in an area. Also removes slime from self. + +### You issue a command to the slime! + +### You whisper a command word, but the slime is already hardened and won't budge... + + + +### Binding Vines + +### Binding Ropes + +### Binding Chains + +### Binding Belts + +### Vines rise from the ground and squeeze you! + +### Ropes encircle your body and tighten! + +### Chains wrap around you! + +### A web of belts buckles in place around your body! + +### Vines rise from the ground and squeeze you! (DamageDealt) + +### Ropes encircle your body and tighten! (DamageDealt) + +### Chains wrap around you! (DamageDealt) + +### A web of belts buckles in place around your body! (DamageDealt) + +### Awaken + +### The slime awakens and turns on you!!! + +### Select area to awaken + +### Activates the slime in an area, causing it to deal 25 glue damage. Encases fully bound targets. + +### You command the slime to draw in targets! + +### CMD: Bind + +### Select area to bind + +### Commands nearby restraints to bind targets standing on them. Rope: 30 chain dmg/5 turn snare. Chain: 30 crush dmg/8 turn disarm. Belts: 50 binding/3 turns vulnerability. + +### CMD: Unlock + +### Select which creature to unlock + +### On yourself: Removes one purple (magical) lock. On a creature: Reduces the target's binding by 20 points. + +### You speak a command word! + +### None of the locks you are wearing respond to your magic. + +### You can't help her with this. + +### You must target yourself, an enemy, or a locked object. + +### The command is intricate and you are unable to enunciate it properly! + +### CMD: Greater Unlock + +### On yourself: Removes all purple (magical) locks. On a creature: Reduces the target's binding by 100 points. + +### You speak a powerful command word! + +### Lesser Invisibility + +### You become semitransparent! + +### Camouflage + +### Select yourself + +### Enemies have a harder time noticing you for Duration turns. Cancels if you move (unless you are near a wall), cast, or sleep. + +### You pose in a clandestine manner. + +### Darkblade + +### Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks, whichever is lower. + +### You call forth dark runes on your weapon and arms! + +### Heal + +### Select which creature to heal + +### Restore 45 hitpoints to an allied creature. + +### You utter a word of healing. + +### Flame Blade + +### When enabled: Melee weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. + +### Tentacle Slap + +### You have the power to make tentacles out of slime when you attack. When enabled: Your attacks deal +10 glue damage and create slime. 150% bind efficiency. + +### Chain Strike + +### You have the power to summon chains when you attack. When enabled: Your attacks deal +10 chain damage and create chains. 125% bind efficiency. + +### Ropework + +### You have the power to weave ropes between your attacks. When enabled: Your attacks deal +10 chain damage and create ropes. 400% bind efficiency. + +### Leather Whip + +### You have the power to strike with conjured belts when you attack. When enabled: Your attacks deal +10 pain damage and create belts. 250% bind efficiency. + +### Super Strength + +### When enabled: Struggling is more powerful, and your melee attack damage is increased by +20 if your weapon deals physical damage. + +### Your body glows with magical energy! + +### Enhance Will + +### When enabled: Miscast chance is halved + +### You focus intently! + +### Truesight + +### When enabled: Drain mana every turn to see through walls and increase accuracy by 40%. + +### Echolocation + +### Close your eyes to dramatically improve your hearing and locate enemies through walls. + +### Produce a bright light for Duration turns. Has no effect in dark rooms. + + + +### Levitate + +### When enabled and above 0 stamina: Drain 5 mana per step to reduce slow level by 1 (if above 1), or 20 mana to ignore a temporary slow effect. + +### You levitate over the trap! + +### You snag a tripwire while floating! + +### You levitate forward despite being slowed! + +### You hover with reduced effect from bindings. + +### Iron Blood + +### Channel 4 turns: Halves SP cost of melee attacks by 50%, but increases MP cost of spells by 25%. Ends on sleep or recast. + +### Your skin glows a pale red! + +### Stone Skin + +### Make the targeted creature (or yourself) gain +20 armor for Duration turns + +### Your skin takes on the appearance of cracked earth! + +### The EnemyName gains increased physical armor! + +### The EnemyName buffs the physical armor of her allies! + +### The EnemyName deploys an energy shield to allies! + +### The EnemyName activates the vibrators of nearby wolfgirls, greatly motivating them! + +### The EnemyName activates the vibrators of nearby dolls, greatly motivating them! + +### The EnemyName creates a zone of increased defense! + +### EnemyName uses a charm to buff an enemy's Magic Armor and Evasion! + +### EnemyName supports a witch with a magical shield! + +### Shield the Witch! + +### EnemyName uses a glowing talisman to buff an undead's physical armor and speed! + +### You create a zone of increased defense! + +### You create a protective zone! + +### You create a fan of icicles! + +### Select where to put the wall (cannot place on occupied squares) + +### Create a stationary wall for Duration turns. It takes 20% damage from spells. Cast on an open door to close it and give it additional armor. + +### A wall starts to form! + +### You create a line on the ground. + +### True Steel + +### Choose a target. + +### A melee strike that deals DamageDealt slash damage, x2.5 against unaware humanoid enemies. + +### You slash with an ethereal blade! + +### Summon Familiar + +### Select where to put the familiar (cannot place on occupied squares) + +### Create a familiar that fights by your side for the rest of the level + +### A familiar appears! + +### You create a circle on the ground with your foot! + +### Summon Storm Crystal + +### Select where to put the storm crystal (cannot place on occupied squares) + +### Create a stationary crystal that casts Crackle on nearby targets for Duration turns. Can be healed to extend duration. + +### A crackling crystal emerges from the ground! + +### You stomp and the ground shakes! + +### Summon Fire Mote + +### Select where to put the fire mote (cannot place on occupied squares) + +### Create an orb of fire that follows you and attacks using firebolt. + +### A flaming spirit answers your call! + +### You call upon the plane of Fire! + +### Summon Earth Mote + +### Select where to put the earth mote (cannot place on occupied squares) + +### Create an animated stone that attacks using a strong but slow crush attack. + +### A rocky spirit rushes forth from the ground! + +### You call upon the plane of Earth! + +### Summon Air Mote + +### Select where to put the air mote (cannot place on occupied squares) + +### Create a dusty mote that attacks using gusts of wind. + +### A dust devil arises in front of you! + +### You call upon the plane of Air! + +### Summon Water Mote + +### Select where to put the water mote (cannot place on occupied squares) + +### Create a watery serpent which stuns enemies with its melee attack. + +### A watery spirit bubbles up from the ground! + +### You call upon the plane of Water! + +### Summon Shadow Warrior + +### Select where to put the shadow warrior (cannot place on occupied squares) + +### Call forth a shadow warrior for 16 turns who deals DamageDealt damage every other turn. + +### ...and the abyss answers! + +### You call... + +### Summon Nature Spirit + +### Select where to put the nature spirit (cannot place on occupied squares) + +### Create a natural spirit that fires vine projectiles and has a healing aura that restores HP to allies and regenerates your stamina. + +### A healing wisp appears! + +### You call upon the powers of nature! + + + + + +### Summon Golem + +### Select where to put the golem (cannot place on occupied squares) + +### Create a slow but powerful golem to fight by your side + +### A golem arises! + +### You stomp your foot and draw the words of life on the floor! + +### Summon Decoy + +### Select where to create an illusion (cannot place on occupied squares) + +### Create a decoy for Duration turns. It attracts enemy attention and triggers traps. + +### A shadow of yourself materializes! + +### You create a line on the ground and toss in a lock of your hair! + +### Feather Explosion + +### Elastic Grip + +### A latex hand reaches out and pulls an enemy close to you! Base pull strength: 4 + +### You extend a rubbery hand and grab a foe! + +### There's an obstacle in the way! + +### Select a target to pull + +### Slime Blast + +### Witch's Slime + +### Rubber Explosion + +### Witch's Slime Ball + +### Robotic Arm + +### A pool of slime deals DamageDealt glue damage to enemies on impact and covers the area in temporary slime. + +### You conjure a pool of slime! + +### Select where the slime will appear + +### Slime Eruption + +### A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them briefly. + +### You conjure an explosion of slime! + +### Slime Splash + +### After one turn, deals DamageDealt glue damage in a small area and spreads slime. + +### You conjure a small amount of slime! + + + +### Water Ball + +### Fast projectile. Deals DamageDealt soap damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. + +### You hurl a ball of water! + +### Tidal Sphere + +### Slow moving projectile, deals DamageDealt soap damage to enemies it passes thru. Leaves a large amount of water in its wake. + +### You raise a huge mass of water! + +### The boulder knocks you to the ground! + +### The water covers you and drenches you! + +### You step in water and become wet. + +### Ice Breath + +### A field of icicles that deals DamageDealt damage on a hit and stuns briefly. + +### You breath out a chilling frost! + +### Select where to put the icicles (SpellArea radius) + +### The mummy's curse paralyzes you! + +### Rubber Bullets + +### You are hit by a fusilade of rubber bullets! + +### The rubber bullets congeal into a slimy material on your body! + +### Nature Blast + +### Raging Vines + +### Magic Belts + +### You project a pool of sticky slime! + +### Arrow of Love + +### You loose a glowing arrow! + +### Blaster + +### You charge up a beam and fire it! + +### You swing your weapon and pull away the target's equipment! + +### You swing Dragonslaver and it lashes out in a whip-like fashion! + +### The slime from your staff coats your body, granting you strange powers! + +### The power of the four elements flows through your veins! + +### An explosion knocks you to the ground! + +### Curious Spell + +### You have been flummoxed! + +### You feel a prick as a small syringe hits you, and you start feeling drowsy... + +### The thrown cuffs snap shut around your ankles and slow you down!!! + +### Ribbon Burst + +### Spores + +### Noxious Spores + +### Enticing Spores + +### You inhale some spores, and feel a bit sleepy... + +### The spores make you feel excited! + +### The toxic spores make you feel faint... + +### Magic Hairpin + +### The magic hairpin goes for your eyes and forces you to blink! + +### Ice Storm + +### Icy Aura + +### Slime Ball + +### A ball of slime leaves a trail of sticky slime (20 damage when stepped on). It deals DamageDealt glue damage on a hit. + +### You hurl a ball of slime! + +### Summon Skeleton + +### Mass Summon Skeleton + +### A skeleton arises from bones on the floor! + +### A gang of SummonCount skeletons forms around you! + +### A gang of SummonCount zombies emerges from the floor! + +### A bunch of gags fly out from your satchel! + +### A floating hand appears and cracks its knuckles! + +### A floating gag appears and starts flying toward you! + +### A floating blindfold appears and starts flying toward you! + +### A floating yoke appears and starts flying toward you! + +### A floating armbinder appears and starts flying toward you! + +### A floating straitjacket appears and starts flying toward you! + +### A floating harness appears and starts flying toward you! + +### A set of shackles opens wide and starts going for your wrists! + +### A swarm of shackles approaches you! + +### A swarm of gags approaches you! + +### A cloud of locks and chains clatters as it levitates toward you! + +### A huge cloud of locks and chains clatters as it levitates toward you! + +### Floating hands appear by the conjurer's side as she points her staff! + +### Floating books appear near the caster! + +### Dusty tomes appear near the caster! + +### Magical books appear near the caster! + +### Sinister books appear near the caster! + +### Crackling books appear near the caster! + +### Glowing books appear near the caster! + +### Rubber-stained books appear near the caster! + +### Flaming books appear near the caster! + +### Frigid books appear near the caster! + +### Devilish books appear near the caster! + +### A floating book appears near the caster! + +### A dusty tome appears near the caster! + +### A magical book appears near the caster! + +### A sinister book appears near the caster! + +### A crackling book appears near the caster! + +### A glowing book appears near the caster! + +### A rubber-stained book appears near the caster! + +### A flaming book appears near the caster! + +### A frigid book appears near the caster! + +### A devilish book appears near the caster! + + + +### Your struggling leaves you aroused because of the RestraintName... + +### You feel your restraints squeeze you and tingle with painful sensations! + +### 'Do not resist,' whispers a voice in your head... + +### Your restraints squeeze you painfully without mercy! + +### The crystals emit a powerful energy! + +### You feel your body overflow with energy... + +### The crystals react to your struggle attempts with a strange energy! + +### Cast Spell (XXX turn delay) + +### You feel the vibrations leaving your body... + +### You feel your toys start to buzz... + +### You your toys continue to buzz... + +### The EnemyName remotely causes your toys to buzz!!! + +### You feel the plugs inside you while walking. + +### Your toys pulse and tingle occasionally. + +### Your toys tease you and buzz gently... + +### Your vibrating toys are difficult to ignore... + +### Your toys buzz strongly, making it difficult to concentrate! + +### You tremble as the toys give off intense vibrations! + +### Your toys torture you with intense pulsations! + +### Your whole body resonates with the intense stimulation! + +### The stimulation is so intense you can hardly breath! + +### Your toys stop vibrating. + +### You feel slightly full as you move... + +### Your movement disturbs the plugs inside of you... + +### The large plugs shift(s) around inside of you... + +### The huge plugs rub(s) around constantly inside of you... + +### Your movements are hobbled. + +### Your hobbled movement disturbs the plugs inside of you. + +### The large plugs shift(s) around inside of you from your hobbled movement... + +### The massive plugs rub(s) around inside of you as you hobble forward... + +### You hop forward! + +### You hop and feel the plugs shifting around inside your body. + +### The plugs shift in and out with each hop... + +### The massive plugs slide in and out sensually as you hop... + +### You crawl forward! + +### You crawl and feel the plugs shifting around inside your body. + +### The plugs shift in and out as you crawl... + +### The massive plugs slide in and out sensually as you crawl... + +### You inch forward slowly! + +### You inch forward, feeling the movement of your plugs. + +### You wiggle your hips inching forward, feeling the plugs inside you... + +### You wiggle forward, the massive plugs inside you digging in and out... + +### You crawl helplessly! + +### You crawl helplessly, feeling the plugs shifting around inside you. + +### You crawl and feel the plugs inside you rub around teasingly... + +### You crawl helplessly, tormented by the massive plugs inside you... + +### You are unable to move! + +### You wriggle uselessly, feeling the plugs shift inside you! + +### You wriggle uselessly, aroused by the plugs inside you! + +### You wriggle uselessly, tormented by the massive plugs inside of you! + +### You climb into the grate + +### Mmmph... + +### Mmmmmmmmm... + +### Hhmmpphh... + +### Gghhhh!!! + +### Mmmmmphh!!! + +### Mmm... + +### MMM!!! + +### Mmmmmm. + +### Mmmaaaaahhh... + +### Mmmmmmmmm~ + +### Unnnghhh... + +### Mmmmmmmphhh.. + +### Mmmmmphh~ + +### Mmm~ + +### Mmmmm~~ + +### Mmmmmm~~~ + + + +### Mmph... + +### Mmmm! + +### Hmmph. + +### Mmmm... + +### Mmmph. + +### Mmmmmmph!!! + +### Gmmmmph! + +### Hmmmmph~!! + +### You are blinded! + +### You took DamageTaken damage! + +### You get caught in sticky slime! + +### You get caught in a sticky slime bubble! + +### The slime ball sticks to you! + +### The slime ball sticks to you and slows you! + +### You feel a powerful sensation run through your body! + +### You feel a pleasurable sensation run through your body! + +### Beams of light wrap around your body and feel warm on your skin! + +### Crystals begin to form around your limbs! + +### A magic chain secures itself around your body! + +### An animated chain secures itself around your body! + +### A magic rope secures itself around your body! + +### A magic belt secures itself around your body! + +### A rope wraps itself around your body! + +### A ribbon animates and becomes entwined around you! + +### A belt buckles itself tightly around your body! + +### A vine slithers across your body and tightens! + +### The spell hits you and slows you down! + +### Witch's Rope + +### Rope Tendrils + +### The Blessing + +### A long tendril emerges from the kraken's body! + +### Coiled ropes spring up from the floor! + +### Several glowing wrappings emerge! + +### A glowing wrapping emerges and starts moving toward you! + +### Rope Strike + +### Animated Vines + +### Soul-binding Sigil + +### Elven Arrow + +### The elven arrow flashes and wraps you in mithril ropes! + +### Ropes wrap themselves around your body from all sides! + +### Wrappings appear and wrap you head to toe! + +### A spell transforms your wrappings into hexed latex! + +### A spell engulfs you in wrappings! + +### Vines sprout around you and grab hold of your limbs! + +### Your clothes are stripped and replaced! + +### Vines tear off your clothes! + +### Restraints materialize on your body! + +### The orb explodes into a burst of ribbons! + +### The orb tears off your clothes! + +### Charm Trap + +### Ribbon Trap + +### Shackle Trap + +### Mummy Trap + +### Rope Trap + +### Holy Rope Trap + +### Belt Trap + +### Cable Trap + +### Slime Trap + +### Chain Trap + +### Shadow Latex Trap + +### Demonic Sigil + +### Unstable Crystals + +### Gas Trap + +### Latex Engulfment + +### Latex Spherification + +### Sleep Dart + +### A talisman on the floor explodes, sending a cloud of charms flying around you! + +### Magical binding ribbons emerge from the walls! + +### The ceiling opens, letting a lot of shackles fall on you! + +### Bands of glowing wrappings start flying in from all sides! + +### Ropes slither out towards you from between the bricks! + +### Ropes fall on you from all sides! + +### A constellation of ropes surrounds you! + +### Leather restraints start appearing around you! + +### high-tech cables come out from the floor! + +### Slimes pours out from the walls and ceiling! + +### Ethereal chains appear all around you! + +### Shadows constrict around you! + +### An otherworldly sigil appears below you! + +### Crystals rise up around you! + +### Something shiny seems to be stretched out over the floor! + +### A rubber bubble starts forming around you! + +### A rubber ball starts forming around you! + +### You hear the sound of glass breaking, and a cloud of pink gas rises around you! + +### You hear the sound of glass breaking, and a cloud of green gas rises around you! + +### The charms stick themselves all over your body! + +### A metal pole catches you from below! + +### The ribbons tie themselves tightly around your body and won't let go! + +### Shackles close themselves over your limbs! + +### The wrappings close in over your body! + +### The ropes wrap themselves around your body! + +### The ropes wrap themselves tightly around your body! + +### The holy ropes secure themselves upon your body! + +### The leather restraints attach themselves to your body! + +### The high-tech cables wrap themselves over your body! + +### The slime pours all over you! + +### A giant cube of latex engulfs you! + +### A giant bubble of latex engulfs you and inflates, sealing you in! + +### A giant latex ball swallows you and inflates, sealing around your neck! + +### A sinister power wraps itself around you and solidifies! + +### Dark magics swirl around you and solidify into shiny rubber! + +### Crystals grow and spread across your limbs! + +### The magic chains wrap themselves around your body! + +### Your clothes are getting ripped away! + +### You feel a prick as a small dart hits you, and you start feeling drowsy... + +### You breathe in the gas, and a wave of pleasure hits your whole body. + +### You breathe in the gas, and feel lethargic... + +### You hear a mechanism trip... + +### Items + +### Rep + +### Spells + +### Learn New Spells + +### Click a spell to replace SPELLNAME with. + +### Empty Slot + +### Back to Spellbook + +### Return to Game + +### Known Abilities + +### Elemental Spells + +### Conjuration Spells + +### Illusion Spells + +### Perks + +### Perks II + +### Perks III + +### pg. NUM/TOTAL + +### > + +### < + +### Spell Points: SPELLPOINTS + +### You need a higher level in SCHOOL magic to learn this spell. + +### You need more spell points. + +### You don't have enough maximum mana to cast this spell! + +### School: + +### Generic + +### Upgrade + +### Special + +### Learn Spell + +### Spell Points: + + + +### Level: + +### Spell Point Cost: + +### Mana Cost: + + + +### Remove Spell 1 + +### Remove Spell 2 + +### Remove Spell 3 + +### Remove Spell 4 + +### Remove Spell 5 + +### Remove Spell 6 + +### Remove Spell 7 + +### Replace Spell 1 + +### Replace Spell 2 + +### Replace Spell 3 + +### Replace Spell 4 + +### Replace Spell 5 + +### Replace Spell 6 + +### Replace Spell 7 + +### Current Spell 1: + +### Current Spell 2: + +### Current Spell 3: + +### Current Spell 4: + +### Current Spell 5: + +### Current Spell 6: + +### Current Spell 7: + +### ??? + +### Unfiled + +### Adventuring 101 + +### History + +### Bondage Witchery + +### Enemy Notes + +### Overgrown + +### Temple + +### Tombs + +### Library + +### Bellows + +### Coast + +### Ejahl + +### (A page from the Book of Aeons)|The 'Graveyard' is a peculiar place. Long ago, human beings lived and died just like the animals. When the Old Civilization existed, they would come to bury their dead in the Graveyard. It remains a mystery why so many of the former dead seem to be alive. Some say that when the Old Civilization cast the spell that spell which overcame Death, even those buried in their graves would rise again. Others simply say that there is a powerful necromancer who lives here, toying with the dead as if they were pets... + +### (A page from the Book of Aeons)|Beneath the Graveyard lies a relic of a former age, a network of tombs inhabited by the immortal followers of Bast. Very few were graced with this gift of immortality before the great archmagus, Sariel Vinlaga, stole this power from the gods and granted all humans with the power of immortality. The Bast followers are still set in their ways, hoping for a time when their Goddess will return and rebuild their glorious civilization. + +### (A page from the Book of Aeons)|Some say the 'Catacombs' are older than time itself. When the Old Civilization began to study immortality, no one knew if it would be possible to bring back those who already died. The Catacombs therefore were used to store all of the remains of former humans, so that they too could be revived when the archmagus would finally make her breakthrough. + +### (A page from the Book of Aeons)|They say that Archmagus Sariel Vinlaga studied in this very library. Having gathered together all of human knowledge, magical, spiritual, technological, she tasked her twelve lesser magi with the job of sorting and collating the wealth of knowledge she had acquired. No one knows why she suddenly abandoned it, or why it remains in such disrepair today. + +### (A page from the Book of Aeons)|The Overgown Ruins remain a puzzle to scholars. Hardly any light comes through the cracks in the ceiling, and yet the area teems with life. It is known that the regenerative powers that keep humans from dying relies on an individual's own mana supply. So how do plants and beasts without mana survive? The devout say it is the Goddess of Restoration who preserves the jungle, but could it be that the Old Civilization developed a means of sustaining life underground? + +### (A page from the Book of Aeons)|The problem of Energy has plagued civilization for millenia. Before the leylines were discovered, humankind relied on natural sources of power such as rivers and firewood. When the Crystal Caves were discovered, a great revolution occurred. No longer reliant on natural sources, civilizations could tap the wellsprings of chaotic energy underground to power machinery like never seen before. + +### (A page from the Book of Aeons)|The 'Lost Temple' as they call it, is a subject of great speculation. It seems that its creators worshipped only four creator goddesses, rather than all the Eight. It was perhaps abandoned several hundred years ago when a flood caused great panic, and it seems that this must have occurred before humanity was made immortal by the archmagus, as there are many remains still found inside. + +### (A page from the Book of Aeons)|The Stars have been a mystery to scholars since the beginning of time. At one point, humans believed that every star was a god, and they made offerings by throwing sugar into the night, thinking that as the stars were innumerable, so were the grains of sugar that pleased humans so much. Religion has moved past that, but the Orrery remains a relic from a time when humanity worshipped the stars rather than the Eight. + +### (A page from the Book of Aeons)|The 'Bellows' is the nickname given to the primitive facilities of the Old Civilization, buried deep beneath the ground. While much of it remains in disrepair, many of the Old Civilization's successors have attempted to keep it in good working order, as the technology is precious and impossible to replicate with modern methods. It seems that many of these successors have fallen prey to some delusions about its purpose, as much of the equipment preserved has little use aside from collecting prisoners. + +### (Preface from the journal of Catherine Willows, well-known explorer who vanished in the dungeon 30 years ago) I am writing this journal in the off chance that I do not come back in my search for the Mistress' staff. If you find this, please make an effort to deliver it back to the surface for the good of all the young women lured by its secrets. + +### (Pg. 24 from Catherine Willows' journal) Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?' + +### (Pg. 25 from Catherine Willows' journal) ...They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence. + +### (Pg. 26 from Catherine Willows' journal) So the question is not 'why did somebody lay these traps.' The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. + +### (The note starts with a drawing of a witch with many chains hanging from her body) She can block melee attacks with her chains. However, they conduct lightning and heat directly to her body, and I was able to take out her chains with bolt cutters. + +### (The note starts with a drawing of a witch with lightning crackling from her fingertips) Water will cause her to short-circuit. I can't seem to hit her with lightning, though. She always redirects it. + +### (The note starts with a drawing of a witch whose body is partly gelatinous) The slime is non-flammable and my attacks pass right through her body... Lightning and ice seem to be effective! + +### (The note is from a famous escape artist) Many restraints are applied quite tightly by a skilled rigger. Even removing it will be tough without thrashing around a bit to loosen it. + +### (The note is from a famous escape artist) Anything can be unbuckled with enough patience. Having a finger extension such as a lockpick will help. Ultimately, though, what matters is that you have a calm state of mind, free from distraction and hopelessness. + +### (The note is from a famous cartographer) In my lapse of judgement, I decided to borrow some mana from the nearby shrine to the Latex goddess. While there was no immediate response to my faux pas, I soon found myself pursued by a swarm of slimes! + +### (A letter between bandit leaders) One of my subordinates has been reporting a girl bound in heavy leather restraints running around. I told her that this is normal, people keep all kinds of servants around here. But definitely keep an eye out for intruders! Don't let them fool you! + +### (The note is a letter from the school of conjuration) We really would like to know... why did you summon a frog in the laboratory? People are wondering, you know. One of the student's projects got eaten. + +### (You find a carving on the floor, a half-finished magic circle of celestial conjuration. Perhaps a cleric wished to call forth an angel for guidance, before realizing there was a shrine a short walk away, where she could contact the heavens much more easily.) + +### (It looks like a... receipt) Thank you for your offering to CELESTIAL COMMERCE. Please accept this fine-quality steel blade as compensation for your continued devotion and selflessness. + +### (A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter that she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. + +### (From an essay titled 'On Celestial Supply Chains') It is known that the heavens seek gold. We do not know why it is that the heavens seek it, but we do know that the Goddesses grant us fragments of their limitless power in exchange for this otherwise-useless metal we dredge up from the earth. They care about it so much that shrines are commonplace, each hosting an angelic courier lying in wait for any adventurer willing to part with hers. + +### They say that the maiden who safeguards the graveyard is kind to her pets... + +### They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Portal out of jail and into the hallway where they kept all my things! + +### I am writing this from inside prison. Who would have known they cared so much about me using a shrine? Sheesh. + +### (A drawing of a bunch of zombies, ordered by danger level. Of note are a zombie surrounded by charms, a zombie surrounded by talismans, a zombie warrior with a sword, and... some kind of shrine maiden that you've never seen before) + +### (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|The first thing to understand is that tying someone up is difficult if they are not in a vulnerable position. If your opponent is vulnerable, then binding will be twice as effective! + +### (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by tickling them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage. + +### (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Bigger and more resilient opponents are much more effective at breaking out of your binds. Try to deal some damage to them to decrease the speed at which they struggle out of your restraints. + +### (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Many mages utilize magical runes to set traps. If you want to check for traps, try learning the spell 'Magical Sight' in the Illusion school. + +### From Adventuring 101: A guide to combat|Your opponent will become vulnerable in many ways, such as missing you with an attack. You can also teleport to the other side of them when they are attacking you, and this will confuse them briefly.|Vulnerable enemies take extra damage, and are easier to tie up! + +### From Adventuring 101: A guide to combat|Drenching your opponents makes them more vulnerable to ice and electricity, but may increase their resistance to fire. + +### From Adventuring 101: A guide to combat|Hitting enemies with melee damage while they are frozen will break the ice, but this also doubles the damage dealt by the attack. + +### From Adventuring 101: A guide to combat|Did you know that hitting enemies with fire while they are frozen is extra powerful? Enemies take 40% additional damage from fire while frozen, although fire will rapidly unfreeze them. + +### From Adventuring 101: A guide to combat|When you're in a bind, try to play along and look for an opportunity to escape. Fighting back will only make your enemies want to tighten your restraints. + +### (A drawing of a suit of armor. It reads: DO NOT TRUST) + +### (The note starts with a drawing of a witch in dark robes with bright pink hair) A necromancer. Powerful spellcaster, weak up close. + +### I can't count how many skeletons I've bashed with my hammer today. They seem so fragile... + +### (The note is scrawled with wiggling lines) IT SEES ME. I SHOULDN'T HAVE DEFILED THE ROPE GODDESS' ALTAR! + +### It is said that fire and water are opposite planes, but I've noticed that the relation is more lopsided than 'equal and opposite' when they physically manifest. Water elementals resist fire, obviously, but fire elementals are weak to water! It is almost as if the abundance of water in this world causes the fire elementals to become weaker than in their home plane... + +### A drawing of many icicles around pools of water. It instructs you to avoid the pools of water and you can see a figure surrounded by ice shards in the distance being set on fire and smashed with a hammer. + +### The shadow spirits' touch is cold as ice... I have wondered if this temperature property applies to their destructive effects on other types of beings. Unfortunately, I found out the hard way when I tried to summon a shadow creature against an ice elemental... + +### I was being chased by something fast and heavy, and it was about to crush me when I tossed an Ice Shard behind me. It stopped and I didn't care to look back. + +### I was walking in the library when I got attacked by a magic book! Fortunately my sword seemed to disapatch it quickly, and I used my spear to stab another one shortly after. + +### SOMEBODY STABBED MY FROG AND I AM PISSED. + +### I don't think it's neccessary to tell people that dragons resist fire... right? + +### I've been studying the dragonheart's weaknesses. So far I've found that the ones bearing the powers of ice dragons are actually weak to fire unlike the others, and the ones who summon crystals to block attacks are nonetheless unable to grab a spear to stop it from reaching them. + +### They say a ninja can catch a sword in her hands, but can she stop a spear? Ha, thought not! + +### (Pg. 54 from Catherine Willows' journal): The post-collapse civilization sought immortality, but they knew that the technologies of the old civilization were a danger to them. So they turned to another school of thought: Magic. + +### (Pg. 55 from Catherine Willows' journal): Silk wrappings, enchanted with ten-thousand microscopic runes per cubit, were suffucient to protect their bodies from ageing for millenia. What they didn't realize was that the magic didn't protect their souls. + +### (Pg. 56 from Catherine Willows' journal): They have no clue what they are doing anymore. To them, this is just another one of their ten-thousand dreams across the aeons. They can no longer tell reality from imagination. + +### Ninjas aren't so tough to fight when their hands are tied behind their back. Good thing I had my pet slime with me~ + +### (Pg. 12 from Catherine Willows' addendum): After studying the ancient race of catlike people, I have come to the conclusion that their race met a dual fate. All of them received eternal life in some form or another. To one half it manifested as a blessing, allowing them to walk the halls. To the other it became a curse to them, trapping them in runic wrappings for all eternity. + +### (Pg. 13 from Catherine Willows' addendum): I must issue a correction to the statements written in my journal. The ancients knew what they were doing. Those that were cursed, are blessed, and those who were blessed, are cursed. + +### (It's a copy of an ancient illustration, depicting a cat goddess, an elven goddess, and two groups of catgirls. One group is smiling and standing on pedestals. The other group is frowning and wearing armor meant for war. It looks unfinished, like the author was suddenly grabbed from behind while drawing it) + +### (It's a interlinear translation of an ancient letter) Your highness, I have delivered to you the prisoners that you have asked. They are the worst of the worst--thieves, slanderers, sorcerers and seducers. But I must inquire, why is it that we must wrap them in silken scarves, worth twenty gold pieces each? Surely they are being handed over to be disciplined, not to be anointed? + +### (It's a record of an interview)|ME: Why are you like this?|MUMMY: Because we are blessed!|ME: Blessed? You've been wrapped up for thousands of years!|MUMMY: A thousand years is nothing compared to the glory that will come!|ME: Why do you have to be wrapped up? There are plenty of you who aren't...|MUMMY: The chosen ones will inherit the land when the goddess returns. + +### (It's a record of an interview)|ME: Which goddess are you referring to? The goddess of restoration?|MUMMY: The blessed kitty.. she was promised to rule over the lesser goddesses.|ME: Lesser goddesses? Which ones?|MUMMY: YOUR goddesses. The ones you humans created that should not be. Ours is the true offspring of the creators, a goddess created to rule! + +### (It's a record of an interview)|ME: What of the elves? Don't they talk about a 'kingdom' too?|MUMMY: Who are the elves?|ME: You know, pointy ears, green hair, a heck of an attitude... they seem in tune with nature.|MUMMY: They sound arrogant.|ME: They are.|MUMMY: Perhaps they know nothing of the promise between our goddess and theirs. + +### (It's a medical record) Patient seems stable... application of the enchanted cloth seems to have stopped the bleeding. It appears that the ancient magic suppresses all forms of injury, even in humans, until it is taken off. + +### (A record of an ancient... transaction)||The elemental offered us the following from her personal estate:|-one magical lantern that requires no fuel, and can light up the night as if it were day|-one crystal that burns red-hot when kept near metal, providing heat to warm a house|-three enchanted swords imbued with flame|-a hollow glass crystal, used for communication||In exchange, we gave her three wolfgirls we had captured on the surface. + +### I had heard that ancient humans prayed to the stars here, in an effort to find favor when the Eight had forsaken them. So I went and prayed... and let me tell you, it was a lie, an absolute lie. There are only monsters out there. + +### (It is a set of instructions for creating a magic circle to unlock a sealed portal. There are markings in many languages that give conflicting descriptions, claiming that the circle will transmute material to gold, or bring good fortune...) + +### (Two schematic diagrams of ancient drones taken from records. The first is unmodified, and the second has several annotations written in what looks like pink lipstick...) + + + +### Those damn slimes! They're so sticky and gross... fortunately, I washed myself in the fountain the last time I got caught by one. It came right off! + +### The dragonhearts were a group of dragonslayers, named for their ritual that imbues them with the fiery power and resistance of dragons they've slain. Now they work as mercenaries, and some of them serve a certain Leather goddess. + +### Yes! I've done it! I have created another red slime! I shall call him Fred, yes, Fred. After the red slime I lost in a shield-related accident a while back... |Poor Fred... I miss him. + +### (Pg. 70 from Catherine Willows' journal): The overgrown ruins are a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through? + +### The unseen maid is the deadliest. + + + +### (The note is blank) + +### The note reads: Mmmmmmmph! Mmmm! MMMMMPH!!!!-- (The entire note is just gagged mumblings...) + +### (The note is illegible) + +### (The note contains a map of a previous floor) + +### (The note is smeared with some kind of liquid) + +### (The note contains a cryptic riddle that makes no sense) + +### (The note contains a list of the writer's likes/dislikes and hard limits) + +### The note reads: Please take this beautiful doll somewhere and play with her~ + +### (The note contains a manual on fencing. You have always been a terrible fencer) + +### (The note contains a magic spell you were taught never to cast under any circumstances) + +### The item requires 5 keys and free hands to remove + +### The item is extremely secure with five separate keyholes. + +### You insert your 5 keys into the lock and the item finally comes off. + +### [RNAME] + +### Magic-Draining: This item drains your mana quickly up to a limit, then slowly after. + +### Curse of Tickling: This item is tickling you without end! + +### Curse of Punishment: Inflicts psychic damage when you attack or cast a spell. + +### Curse of Illumination: Produces light and makes you easier to see. + +### Curse of Attraction: Women find you irresistable. + +### Curse of Animation: Causes loose restraints to animate and attack you! + +### Curse of Sensitivity: Makes it easier to lose control of yourself. + +### Curse of Distraction: Multiplies DP gain by 1.5x. + +### Curse of Exhaustion: -25% Stamina regen cap. + +### Curse of Futility: Multiplies WP gain by 0.5x. + +### Curse of Submission: Gain submissiveness when you lose control of yourself... + +### The curse is dormant, waiting for the time to strike... + +### Your RESTRAINTNAME glows pink as you feel your mind attacked by hypnotic forces! + +### The item is cursed! Several restraints appear on your body! + +### The item is cursed, but you are so trussed up you hear only sinister laughter... + +### The item is sealed with an icy lock. Perhaps you can melt it somehow? + +### The cursed seal flashes brightly as you struggle fruitlessly against it. + +### The item is sealed with a smoldering lock. Perhaps you just need to put out that fire... + +### The cursed seal glows faintly as you struggle fruitlessly against it. + +### The item contains technological markings. Perhaps applying some electricity will affect it? + +### The cursed seal gives off sparks as you struggle fruitlessly against it. + +### The item contains an alchemical seal. Perhaps Glue damage will overload it? + +### The item stretches as you tug on it, but snaps back to its original place. + +### The item is covered in markings of chains. Perhaps you need to take Chain damage? + +### The item squeezes you tighter as you try to take it off. + +### The item is protected by holy magic. There is nothing you can do to it. + +### You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? + +### This item bears the sigil of the Goddess of Restoration. Perhaps she can help? + +### The item is protected by a magical seal. There is nothing you can do to it. + +### This item bears the sigil of the Goddess of Conjuration. Perhaps she can help? + +### The item is protected by dark secrets. There is nothing you can do to it. + +### This item bears the sigil of the Goddess of Illusions. Perhaps she can help? + +### This item bears the sigil of the Goddess of Elements. Perhaps she can help? + +### The item is protected by an elemental seal. There is nothing you can do to it. + +### You hold the key to the item and it comes loose, draining the key's energy. + +### The item is incribed with mystical runes. Maybe you need a powerful key to unlock it. + +### The lock-shaped rune flashes as you realize struggling is pointless. + +### You overload the magical seal, causing it to vanish and release the item. + +### The item is magically sealed, requiring 200 mana to unlock it (includes mana from mana pool). + +### You tug on the item, but the magic can't be broken with anything other than brute force. + + + + + +### The item is sealed with a locking spell! You will need a key to dispel the magic. + +### You tug on the item but it is magically sealed to your body! + +### You insert your magic key into the lock and the item finally comes off! + +### The item is protected by a seal of Determination. You must have maximum willpower to remove it. + +### You are unable to muster the willpower to bypass the seal... + +### Feeling determined, you override the seal and release the item! + +### The lock is protected by a revenant seal. You'll need 25 ectoplasm to disenchant it. + +### Your fingers pass right through the collar. Pity your neck doesn't pass through it. + +### You channel ghastly energy into the lock and break the seal!!! + +### It would take many lifetimes to crack the code. You'll have to find another way to break the program... + +### You tug against the straps to no avail. + +### One of your Doll IDs seems to have had corrupted data on it, causing the program to crash and unlock. + +### The item seems to drain divine energy from shrines. Maybe that has something to do with it. + +### The collar is enchanted with multiple layers of magical seals. + +### The collar has absorbed enough energy and pops off! + +### That item cant be used. + +### You're not sure how to use this key. + +### As soon as you touch the key, all of your gold locks fade to blue! + +### You realize there is no keyhole on the device, simply a lock-shaped sigil. + +### The item loosens and falls off, but you see a red sigil flash and the key suddenly teleports away! + +### You have in your possession KeyAmount magical, ornate key(s). You might as well try... + +### You have KeyAmount key(s) for this item. + +### The angel helps you struggle and use items + +### The ghost helps you struggle and use items + +### The ghost is unhelpful + +### Angel: Greetings! + +### Angel: Perhaps I can assist with those! + +### Adventurer's Ghost: Well met, traveler! + +### Adventurer's Ghost: Hello again, traveler (giggles). + +### Adventurer's Ghost: Having fun, girl? + +### Adventurer's Ghost: Looking for some trouble, slave? + +### Adventurer's Ghost: I see you, naughty little slave! + +### Ghost: I can try to help with those, traveler. + +### Ghost: Aww, you look like you're having fun... + +### Ghost: You look great in those, hehe~ + +### Ghost: Please don't bother me. + +### Ghost: A good slave doesn't complain. + +### Ghost: What's that? I don't understand. + +### Ghost: Silence is golden. + +### Ghost: A good slave doesn't speak until addressed. + +### Ghost: Aww, so helpless~ + +### Ghost: Trussed up like a good girl~ + +### Ghost: You're going to stay that way for a good while. + +### Ghost: I love watching you hop around, it's funny! + +### Ghost: Just sit there like a good girl~ + +### Ghost: I want to see you kneel~ + +### Ghost: Aww, feeling frustrated? + +### Ghost: Looks like someone's been naughty~ + +### Ghost: How's it feel to be under lock and key? + +### You step on a pressure plate and a number of skeletons rise up! + +### You are ambushed by bandits! + +### Armed skeletons appear from passages in the walls! + +### An armed skeleton drops down from the ceiling! + +### A wall panel falls down, and an armored skeleton appears! + +### You feel a chill down your spine... + +### You feel a constricting presence... + +### You feel a titillating presence... + +### You are ambushed by ninjas! + +### A large, wriggling mess of ropes fall from the ceiling! + +### A rune of growth causes several plants to quickly sprout nearby. + +### You are ambushed by dragonhearts! + +### A pack of drones descends from the ceiling! + +### You hear sirens as a group of robots closes in! + +### You stumble upon a group of mages wanting to play dress-up! + +### You step on an open book, only to find a furious librarian staring you down! + +### You are ambushed by wolfgirls! + +### You are ambushed by an alkahestor! + +### Small blobs of slime fall from the ceiling! + +### You are ambushed by slime researchers! + +### A large blob of slime falls from the ceiling! + +### In a puff of smoke, a group of fire elementals appear around you! + +### In a flash of fog a group of ice elementals appear around you! + +### In a burst of mist, a group of water elementals appear around you! + +### A group of earth elementals rise out of the ground! + +### You hear pouring liquid and a group of rubber elementals come out of the walls! + +### In a flash of light, a group of air elementals appear around you! + +### Several ethereal hands appear all around you! + +### You have stumbled upon a conjurer's study! + +### You are ambushed by a group of maids! + +### The Head Maid corners you! + +### A vine crawls from the ground, already wrapping around your feet! + +### You find a magic orb, containing a Spell Point. However, a Goddess owns this artifact.. + +### You find a magic orb, containing the SHCL spell 'SPLNME' and angering a goddess. + +### You find a magic orb, containing a random spell and angering a goddess. + +### Should you break it, she will send her minions after you. Which Goddess will you anger? + +### An altar stands before you, bestowing a heavenly contract. + +### Do you choose to accept its terms? + +### Are you sure? This choice is final. + +### Yes, I will accept. + +### (Accept the contract) + +### I'll think about it. + +### You are frozen! + +### You are chilled! + +### Shadowy tendrils wrap around your feet, rooting you in place!!! + +### You get the feeling that someone is searching for you... + +### You hear movements all around as you realize you are surrounded!!! + +### There is another restraint underneath! + +### Your restraints rub you in sensitive places as you move... + +### Indifferent + +### Angered + +### Enraged + +### Thankful + +### Pleased + +### Neutral + +### Annoyed + +### Hostile + +### Friendly + +### Allied + +### Favorable + +### You run up against the TETHER pulling you back. + +### You are yanked back by the TETHER! + +### We will be going for a walk. Follow me. + +### Don't get comfortable. Im taking you to a new cell. Follow me. + +### We're going to have some fun. Follow me. + +### I told you to follow me! + +### I said, FOLLOW ME! + +### I won't repeat myself + +### Then let's put you back in your cell! + +### I hope you learned your lesson. Now get your butt out of here. + +### You've been a good girl. I hope you don't make the same mistake again. You can leave. + +### That's a good girl. Now behave yourself, okay? You're free to go. + +### Looks like you got yourself in a bind! (she pats your butt playfully) Go make the others happy! + +### Good girl. + +### You'll be making others happy in no time. + +### You're shaping up to be a good slave. + +### I wish I could take you to my room... + +### It seems your training is going well. + +### Perhaps you are enjoying this, hehe. + +### You've been very good this walk. Here is your reward. + +### The EnemyName gives you a ItemName + +### The EnemyName starts adding a RestraintName! + +### You're missing part of your uniform. + +### The EnemyName starts to remove your RestraintName! + +### The EnemyName starts to lock your RestraintName! + +### The EnemyName locks your RestraintName with a LockType! + +### I am going to change your restraints. Hold still! + +### Just need to add a little security~ + +### Got yourself in trouble, eh? + +### Looks like you're shaping up to be a good girl~ + +### Oh! Looks like I've made a mistake... + +### 404 prisoner not found. Releasing tether. + + + +### A EnemyName approaches you in your cell. + +### A EnemyName appears to check on you. + +### The EnemyName leaves and locks the cell behind her. + +### Layered underneath: + +### Layered with: + +### Increased strictness due to: + +### Mana + +### Bondage + +### Ask for Aid + +### Become a Champion + +### Ask + +### Ask for Rescue + +### Offer Penance + +### Current Champion + +### Switch Champion + +### Become the champion of this goddess. Capturing bound enemies will grant +1 rep. + +### You are now the champion of the Goddess of GODDESS. + +### For 3 rep the goddess will grant you slipperiness, boosting your struggling. + +### For 3 rep the goddess will grant you a key. + +### For 3 rep the goddess will grant you + +### For 3 rep the goddess + +### For 3 rep the goddess + +### The goddess will fully restore your mana in exchange for AMOUNT rep + +### The goddess will enjoy seeing you struggle in her bonds (raises submissiveness) + +### The Goddess may decide to send an angel to help you struggle, in exchange for 10 rep + +### The Goddess will expect you to pay AMOUNT gold for +5 rep + +### The Goddess hears your plea! + +### The Goddess hears your plea but has decided not to care. + +### The Goddess fills your mind with heavenly images as she channels energy through your veins. + +### Time stops as an angel of heaven appears to collect your payment. + +### You shudder and tremble as a wave of pleasure washes over you! + +### You lose control of yourself as you convulse in pleasurable bliss! + +### You let out a moan as you feel the ecstasy of pleasure! + +### You finally let out a deep breath as you get what you've waited for! + +### Your whole body thrashes about as you experience long-awaited pleasure! + +### Your release comes with a bang as your body rocks back and forth! + +### You wiggle your hips in ecstasy as you experience pure bliss! + +### You are left gasping for air as you receive your long-awaited orgasm! + +### You finally are left rocking your body wildly in sheer pleasure! + +### A powerful wave of pleasure comes over you as you convulse in ecstasy. + +### Your breathing intensifies as you lose control of yourself! + +### You close your eyes and breath rapidly in anticipation... + +### You tilt your head back and moan as your heart beats faster... + +### You groan with pleasure as you approach the edge... + +### You whimper as you rub your legs together furiously... + +### You feel frustrated as the stimulation isn't quite enough... + +### Your whole body shakes, but you don't quite go over the edge... + +### This is starting to feel like torture... + +### You let out a frustrated scream as the torment continues... + +### You simmer just under the edge, heart racing, breathing quickly... + +### You let out an anguished moan as release dances just out of reach... + +### You squirm helplessly as your futile struggles simply arouse you more... + +### The vibration suddenly weakens. + +### Your toys cease vibrating abruptly. + +### The vibrators cut off suddenly, leaving you wanting. + +### The toys turn off at the last moment, cutting you off. + +### The toys leave you without pleasure as they turn off. + +### You are left feeling empty as the toys stop vibrating. + +### You stomp your foot on the ground in frustration as the vibration ceases. + +### The toys leave you in agony as they cease vibrating. + +### The toys torture you by stopping at the last moment. + +### The toys stop just before you lose yourself. + +### The toys deny you a chance to finish. + +### You try to pleasure yourself, but your chastity belt prevents you! + +### You play with yourself... + +### You let your hands wander for a moment... + +### You squirm your hips and whimper in your bindings... + +### Your instincts are getting the better of you... + +### Your body shudders briefly from pleasure... + +### You are unable to control yourself. + +### You play with yourself using the magic wand... + +### You would never do such a thing. + +### You try to rub your erogenous zones by squirming your legs... + +### Your will is draining as you crave release, but can't quite get there without help... + +### Your will is draining as your heart beats faster and your body trembles... + +### Your will is draining as you simmer just under the edge... + +### Your will is draining as you crave release, and the toys continue to vibrate... + +### Your will is draining as the toys continue buzzing... + +### Your will is draining as you are tormented by vibrations... + +### A buzzing vibration wakes you up! + +### Your RestraintName constricts, warning you not to misbehave! + +### Your RestraintName tightens painfully to punish your misbehavior! + +### Your RestraintName punishes you for your behavior! + +### Your RestraintName punishes you and warns you with a harsh beep! + +### Your RestraintName emits a red flash, causing you to feel faint! + +### Your armor makes noise as you move around! + +### Your RestraintName lets out an alert! + + + +### Your RestraintName stimulates you to hinder your efforts! + +### Your RestraintName stimulates you and beeps loudly! + +### A golden lock fades into a blue lock on one of your restraints! + +### Your command word is heard and the magic lock(s) click and fall off! + +### Your command word is heard and the charger unlocks! + +### Are you sure you want to attack? + +### Are you sure you want to go to the next level? (Click self to confirm) + + + +### You shudder as you apply the RestraintName to yourself... + +### You insert the RestraintName and close your belt's shield over it, with a click as it locks in place. + +### You attack the RestraintName and close your bra's shield over it, with a click as it locks in place. + +### You slowly put on the RestraintName, amazed at how it seems to mold to your size... + + + +### You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! + + + +### Ancient Chastity Belt + +### You find a chastity belt, glowing magnificently, along with a strange crystal next to it. + +### A chastity belt of sleek, ancient design. While powered, it gives -30% miscast chance due to distraction and slowly regenerates stamina. + +### 'Belt of the devoted' + +### You tug at your chastity belt, but you can't even stick a finger inside because it's so tight... + +### Ancient Chastity Bra + +### You find a chastity bra, glowing magnificently, along with a strange crystal next to it. + +### A chastity bra of sleek, ancient design. While powered, it reduces incoming damage from attacks by 20. + +### 'Shield of the chaste' + +### You rub your hands along your breasts but feel only hard, unbreakable metal. + +### Ancient Heels + +### You find a set of glowing heels, glowing magnificently, along with a strange crystal next to it. + +### A pair of towering heels, enchanted with combat magic. When powered, they reduce slow level by 1, and deal 25 shadow damage on-hit with brief slow. + +### 'Shoes of the graceful' + +### You can barely stand in these heels. They are rigid, metallic, and unbreakable, yet padded on the inside. + +### Ancient Blindfold + +### You find a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. + +### A full-blackout mask. When powered, it negates accuracy penalties due to vision, boosts accuracy by +100%, and boosts melee damage by +10. + +### 'Mask of the Warrior' + +### You tug at the mask but it won't come off. It's molded so close to your face that no light shines through! + +### Ancient Muzzle + +### You find a muzzle with a long rubbery plug on the inside, glowing magnificently, along with a strange crystal next to it. + +### A muzzle that seals over the face tightly. When powered, it regenerates mana, boosts sneak, and multiplies damage dealt to unaware enemies by 2.5x. + +### 'Muzzle of the Saboteur' + +### You claw at your face, but not only does the soft plug fill your mouth completely, the muzzle itself is nigh-unbreakable! + +### Ancient Gag + +### You find a ball gag harness with a long rubbery plug instead of a ball, glowing magnificently, along with a strange crystal next to it. + +### A gag that fills the mouth. When powered, regens mana, reduces miscast by 30%, and boosts damage to enemies that are stunned, frozen, bound, or slowed by 30%. + +### 'Gag of the Focused' + +### You tug on the straps at your cheeks, but the straps are so tight the plug doesn't even move! + +### Ancient Rear Plug + +### You find a huge, flexible, segmented plug, along with a strange crystal next to it. + +### A plug that shocks the wearer when someone disciplines them, after orgasm, and mildly when spellcasting. When powered, reduces miscast chance by 30%. + +### 'Plug of the Obedient' + +### You realize the magical plug has expanded inside your body. It won't come out. + +### Ancient Plug + +### You find a huge, ribbed plug, along with a strange crystal next to it. + +### A plug that denies the wearer constantly and only rarely grants release. When powered, it grants +70% magic resistance (about 40% reduction). + +### 'Plug of the Perseverant' + +### Ancient Stimulator + +### You find a flat, round device with a hole on one side, along with a strange crystal next to it. + +### A device that teases the wearer for casting spells and attacking. When powered, it reduces mana and stamina costs for casting spells and attacking. + +### 'The Persuader' + +### You realize the magical device has attached to your body using suction. It won't come off! + +### Ancient Mittens + +### You find a pair of shining gloves, glowing magnificently, along with a strange crystal next to it. + +### Tight mittens that force the hands into fists. When powered, they increase all magic damage to enemies by 40%. + +### 'Mittens of Blasting' + +### You rub your mittens together, but they are unfazed by anything you do to them and your hands are clasped tight. + +### Ancient Armbinder + +### You find a monoglove, glowing magnificently, along with a strange crystal next to it. + +### An extremely strict armbinder. When powered, reduces miscast chance by 30%, increases all magic damage to enemies by 40%, and increases spell range by 50%. + +### 'Armbinder of the Artillerist' + +### You try to wiggle your arms, but they can barely move in this position and are clasped tight. Your arms are sealed. + +### Ancient Ankle Cuffs + +### You find a pair of glowing cuffs, glowing magnificently, along with a strange crystal next to it. + +### A pair of cuffs designed for summoners. Heals nearby allies by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power. + +### 'Anklets of the Faithful Friend' + +### You jingle the chains around and realize that these unbreakable restraints won't be coming off. + +### ...when powered down, they snap together, rendering the wearer immobile. + +### 'Anklets of the Unfaithful Friend' + + + +### You search for your ancient keys but it seems they were taken away for good. + +### Random (-10% rep loss) + +### You don't have any valid targets on your body for that. + +### The air swirls with traces of pleasing magic... + +### The spores make you feel sleepy... + +### Physical Block: AMOUNT + +### Magic Block: AMOUNT + +### DAMAGETYPE: MULTIPLIERx modifier + +### Physical Armor: AMOUNT + +### Magic Armor: AMOUNT + +### Evasion: AMOUNT% + +### Deals DAMAGETYPE damage + +### AMNT% chance to hit you + +### Can disarm (chance: DISARMCHANCE%) + +### Resistances: + +### HP: + +### Shield: + +### Binding: + +### Ambivalent + +### Likes you + +### Loves you + +### Adores you + +### Dislikes you + +### Hates you + +### Despises you + +### Talking to you + +### Aware of you! + +### Pursuing you! + +### Ignoring you! + +### Investigating! + +### Suspicious + +### Notices you! + +### Unaware + +### Items carried: + +### Items worn: + +### ...and NUMBER more + +### Takes damage if the caster is stunned + +### Disappears if the caster is defeated + +### Caster: ENEMYNAME + +### Demise imminent + +### Vulnerable + +### Stunned + +### Snared + +### Silenced + +### Disarmed + +### Blinded + +### Apprehended! + +### Restrained! + +### Restricted! + +### Fully Bound! + +### Trussed up! + +### Tightly Secured! + +### Inescapably + +### Belted + +### Wearing a toy + +### Vibed! + +### Flying + +### Distracted! + +### Soap + +### Acid + +### Holy + +### Arcane + +### Poison + +### Poison Gas + +### Charm + +### Tickle + +### Grope + +### Crush + +### Gravity + +### Pierce + +### Slash + +### Pain + +### Spirit Draining + +### Mana Draining + +### Electric + +### E-Stim + +### Shock + +### Plush + +### Blast + +### Chain + +### Gas + +### Physical + +### Spell + +### Unstoppable + +### Unflinching + + + +### +Focus + +### +Stamina + +### +Willpower + +### +Magic + +### Discard (destroys it permanently!) + +### You crit the vulnerable EnemyName for AMOUNT extra damage! + +### You crit the unsuspecting EnemyName for AMOUNT extra damage! + +### The enemy steals a pick from you! + +### The enemy takes away your knife! + +### The enemy steals a key from your body! + +### The enemy wrests away your magical knife! + +### The enemy takes away your precious magic key! + +### The enemy steals one ITEMSTOLEN from you! + +### You get your stolen items back. + +### The EnemyName manages to retreat with your items! + +### The orb contains knowledge of SPELL. + +### You capture the EnemyName. + +### You capture the EnemyName in the name of the goddess of GODDESS. + +### You capture the EnemyName, but the goddess of GODDESS would prefer that you be in uniform (wear her restraint). + +### You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! + +### You capture the EnemyName, but the goddess of GODDESS would prefer that you wear some restraints. + +### You capture the EnemyName, but have reached the limit for rewards this floor. + +### The spirit inside the restraint is vengeful and emerges to wreak havoc on the world! + +### You hide inside the container... + +### You hide inside the chest... + +### It's a crumpled piece of scrap metal with a sharp edge. + +### You use the scrap to try and cut the item. + +### You rub the item against the broken object's sharp edges... + +### A hook hangs at shoulder height. + +### The hook is too high up! You can't reach it... + +### There's a hook on the wall. + +### The wall is cracked. + +### You rub yourself on the corner... + +### Many ropes emerge around you, removing weaker ropes from your body and binding enemies! + +### Choose Class: + +### Distraction Mode: + +### Progression Mode: + +### Key Hunt + +### Random + +### Selected + +### You will need to find the key to proceed to the next floor. + +### Each floor will have a random task to unlock the stairs. + +### You will select your task for each floor before you enter. Requires Perk Progression. + +### Perks Mode: + +### Extra + +### Less + +### Much Less + +### No pain, no gain. + +### Gain 20 extra perk points, to give you a false sense of security. + +### Lose 20 perk points, just to keep things interesting. + +### Lose 50 perk points, making things very interesting. + + + +### Perk Progression Mode: + +### Disabled + +### Optional + +### Mandatory + +### Debuffs Only + +### No perks between floors. + +### The standard mode. You may choose between one of three perk altars between floors. + +### A twist on the standard mode. You must choose before progressing. + +### You must pick a debuff between floors before progressing. + + + +### Perk Shrine Bondage: + +### Never + +### Sometimes + +### Always + +### Perk shrines will not offer bondage as part of the deal. + +### Bondage will sometimes be offered alongside perks. + +### Perk shrines are always accompanied by bondage. + + + +### Perk Shrine Bondage Info: + +### Hidden + +### Partial + +### Full + +### You do not know if a perk shrine will apply bondage. + +### You know that a perk shrine will apply bondage, but not what kind. + +### You know the exact restraints a perk shrine will apply. + +### Difficulty: + +### Normal Mode + +### Hard Mode + +### Extreme Mode + +### A supposedly reasonable difficulty curve. + +### Play the game the way it was intended. Cruel and restrictive. + +### Play at your own peril. Unlocked by double-clicking the Hard Mode button. + +### Aroused + +### Removes all chastity belts, vibrating restraints, plugs, and removes the option to play with yourself. + +### Includes all that good stuff. + +### Allow Front Plugs + +### Allow Rear Plugs + +### Allow Piercings + +### Start with 150 willpower and Iron Will, good at melee and blocking attacks. + +### Start with 150 stamina and Sneaky, good at stealth and evasive gameplay. + +### Start with 150 mana and Magical Sight, good at casting spells. + +### Start with nothing to your name. For those who want a challenge. + +### You are a mage, but haven't finished your formal 'training'. Requires Aroused mode. + +### Spell Choice: + +### Choose Spells + +### Random Spells + +### Break orbs. Get points. Buy spells. It's that simple. + +### Break orbs and pray you get something good. + +### Save Mode: + +### Save Codes + +### Roguelike + +### Grants a save code every floor you can write down. Autosaves only on floor start. + +### No save codes, forced autosaves. You are in it to win it. + +### Prison Strictness: + +### Easy + +### Strict + +### If you get captured, you might get rescued if you have good relations. + +### If you get captured, you will always get rescued and pay a fee. + +### If you get captured, you are totally on your own. + +### Start Playing + +### Lock your settings in, nice and tight. + +### Start with some perks that increase strictness and immersion. + +### Choose some perks to spice up your run. + +### This game engages in safe and consensual analytics. + +### It sends data about spell choices, levels reached, etc, to help balance and improve the game. + +### No personal data is sent or stored. + +### Accept + +### Don't Track Me + +### Proceed + +### Your key to the stairs is taken away! + +### You found a keyring to the stairs! Now you just need to get there. + + + +### Behold my SPL! + +### Mmmph... SPL... + +### Oh noes... + +### Ueeee! + +### I don't want to be your slave! + +### Catch me if you can! + +### I've been naughty, looks like I need to be punished... + +### I've been a bad girl, won't you do something about it? + +### Mmmph... maybe I talk too much... + +### Well well, what have we got here? + +### You're not here to take away my pets, are you? + +### You'd make a lovely pet... + +### Daww, you're so cute when you're struggling! + +### Let's take you back to your space~ + +### You need to be bound tight! + +### Cleaning up for me, huh? + +### Uh uh, give that back! + +### What do we have here? An intruder? Or a future pet? + +### I see how it is. + +### I've taken on hundreds of adventurers like you. + +### You don't stand a chance. + +### Your magic is nothing compared to mine! + +### I've been a master wizard for over a thousand years! + +### You call that a spell? + +### My spells are far superior! + +### She won't help you! + +### Not yours! + +### Oh, that's not going to help~ + +### Let's play a game! + +### Didn't think you would get away, did you? + +### Oh ho~ + +### 'Tis but a scratch! + +### You'll be my pet soon~ + +### Cute~ + +### Don't even try~ + +### It's over~ + +### Get over here! + +### Not so slippery now! + +### I'll be taking that~ + +### 'Click!' + +### In the name of PTRN, I order you to kneel! + +### You're in my way. + +### Step aside, pet. + +### Get her, my pets! + +### Hey! Don't touch that! + +### Why you... + +### You can't do that! + +### Leave them alone! + +### Hey, stop that! + +### Why do I hire these people... + + + + + +### Activate SPL protocol. + +### What do you mean 'access denied'??? + +### Release me at once. + +### This is unacceptable! + +### Guards! Guards... Guards? Well drat. + +### You'll never get away with this! + +### Look, another one of my dolls~ + +### Come to me, my lovely thing~ + +### I want to hear you moan~ + +### Perhaps we need to make things tighter? + +### Come with me, dear~ + +### You've had too much freedom. + +### Leave that for the cleaning robots. + +### Skulking around, are we? + +### I see you. + +### There's no point in fighting. + +### How ineffectual. + +### That's cute. + +### Your magical potential is impressive~ + +### A magnificent display of magic! + +### You would make a great mana source~ + +### Did you think you could outsmart me? + +### I am the only goddess you need. + +### Dolls shouldn't mess with things they don't understand. + +### Let's take you somewhere safe~ + +### You won't be getting away. + +### Did you think that would work? + +### Let's put those hands of yours away~ + +### You are mine. + +### You're a fast one. + +### Your antics amuse me~ + +### It's time for your makeover! + +### Come to me. + +### A shame it ends here. + +### You won't be needing that. + +### Tsk Tsk. I'll be keeping the keys. + +### I used to be an adventurer like you~ My name was PTRN... + +### You don't know who you're messing with. + +### You won't be allowed to make that mistake twice. + +### I'll punish you myself. + +### Hands off my property. + +### Know your place, girl! + +### You've had your chance. + +### Fine, then. + +### Know your place! + +### *sighs* + + + + + +### Hmmph~ + +### My mistake~ + +### This wasn't supposed to happen. + +### The Collector has become the Collected. + +### Fine, you win! + +### Cover me you brats! + +### She's coming for me! + +### Stay away! + +### Time for a taste of my own medicine... + +### I wonder how many days we'll get to spend together! + +### You look so pretty as always, and forevermore~ + +### Time for an inspection~ + +### There's no use in struggling, dear! I've made sure it's extra tight. + +### Playtime is over, back to your cell~ + +### Why aren't you wearing your restraints? + +### I did not order you to clean~ + +### What's that you've got there? + +### Found you! + +### I've been waiting for this~ + +### Show me your moves. + +### You'll make for a fine servant! + +### Very impressive. + +### Yes, yes, show me what you've got! + +### I've always wanted another mage. + +### Tsk tsk, no silly tricks~ + +### Now now, you don't have permission to do that~ + +### What do you think you're doing? + +### Typical adventurers~ + +### Oh, you got out? + +### Too bad~ + +### That thing is dangerous, my dear~ + +### A feisty one, aren't you~ + +### Playtime's over~ + +### Very nice. + +### Most impressive! + +### You need more training! + +### Come along now~ + +### Come closer, I want to see your face~ + +### What a shame. + +### What's this? + +### See if you can get out of that! + +### I am the Warden. All things in this dungeon are subject to me. + +### Hands off my pet~ + +### Careful what you ask for~ + +### Be gentle with her~ + +### That's my property~ + +### You've made some enemies, haven't you? + +### I should teach you to be a nice girl. + +### You need to learn some manners~ + +### This will be entertaining. + +### Show me what you've got~ + +### I'll watch~ + + + +### Submit to my SPL! + +### Hmmmph... SPL-- + +### Fine then! Have it your way. + +### You'll be sorry you didn't listen to me~ + +### Why must you be so difficult! + +### They're coming for me! + +### Do you know of the Dollmaker? I've got a proposal for you and I... + +### I cast SPL! + +### That wasn't supposed to happen! + +### This is too tight... + +### I can't get free! + +### Hey! Where do you think you're going? + +### You look like you're having fun! + +### I have somewhere else in mind for you~ + +### What do you think you're doing with that? + +### Looks like you found my keys! Hand them over. + +### Alert! + +### You look like a good girl. Come on~ + +### Come here, let's play! + +### *grins and starts walking toward you* + +### Hey! Play nice! + +### Stop that! Guards! + +### You're mine! + +### Sorceress! + +### Get her! + +### She's a mage! Stop her! + +### Watch it! + +### Don't touch that! + +### We have an escapee! + +### Not so fast! + +### Try that again! + +### Do your worst! + +### Got you! + +### Get back here! + +### Missed me! + +### You're coming with me! + +### Hand it over. + +### Nice and tight! + +### The name's PTRN. + +### What the-- + +### You won't get away with this! + +### I'm coming! + +### I can't let you do that! + +### You'll pay for this! + +### That was a mistake! + +### I'm joining in! + +### Hand on, I'm coming! + +### I'm here! + +### Here I come! + +### Come and get me! + +### You'll never escape! + +### Mmmphh! + +### Mmmm! Mmmmmmm! + +### Mmmmph!!! + +### Mmmmm~ + +### Mmmgh! + +### Mmmmmm <3 + +### Mmmmmm~ + +### Mmmph~ + +### *looks at you nervously* + +### *giggles* + +### *giggles eagerly* + +### Mmmph? + +### Mmmghgh!!! + +### Mmmmph! + +### Mmmmph... + +### Hhhhmph! + +### Mmmph! + +### Nngghhh! + +### Gggghh!!! + +### Mmmaaghthh! + +### Wwwmmmthhh! + +### Mmmmmph! + +### *looks at you suspiciously* + +### *looks at you angrily* + +### *jumps up and down excitedly* + +### *groans* + +### *does a happy dance* + +### Mmmph!!! + +### Mmm-hmmm. + +### Mmmmmmm~ + +### *Her nametag says 'PTRN'* + +### Mmmph!! + +### Mmmm--! + +### Mmmmph. + +### Mmmmmmmgh! + +### Mmph! + +### Mmmmmmmph... + +### MMMMMPH!!! + + + + + +### *focuses intently* + +### *appears distracted* + +### *Mmmmmm~* + +### *muffled giggle* + +### Mmmm~ + +### *glows with anger* + +### *Her headpiece says 'PTRN'* + + + + + +### Watch out for my SPL! + +### Whoops! + +### You won't get me like this! + +### You'll never catch me! + +### Where'd you come from? + +### No! Definitely don't like... tie me up and punish me! + +### I've come to turn myself in~ + +### Won't you 'apprehend' me? + +### I've been a bad girl~ + +### Hey! You should know your place. + +### Look who's enjoying herself~ + +### Let's put you up for auction! + +### What are you rummaging around for? + +### Oh no you don't! + +### You're not supposed to be here... + +### I'm gonna teach you a lesson, girl. + +### I'm gonna miss you when we find you a nice master... + +### Looks like you need some training, girl. + +### You picked a bad time to get lost, friend. + +### Never should have come here. + +### I used to be an adventurer like you. + +### You must be one of those wizards. + +### The mages sell real well... + +### Mage! Stop her! + +### Not on my watch. + +### That's my stash... + +### You'll fetch a pretty penny from that goddess you just pissed off. + +### Hah! Found ya! + +### *scoffs* Amateur. + +### Hmph. Get back here! + +### Why won't you surrender! + +### Not a chance! + +### Boss! We got another one! + +### Caught ya~ + +### Dibs on this one! + +### Gotta make sure no one gets to you~ + +### I'm PTRN. And who might you be? + +### Bad time to party, girl~ + +### You've got nerve showing your face around here. + +### Don't think you can get away~ + +### Trying to fight your way out? + +### Well, looks like I'm having fun today. + +### Hey girls, got room for one more? + +### We work for the highest bidder. + +### Nothing personal. + +### Sorry, it's just the way things work. + +### You're mine. + +### You can't get away. + +### *extends an arm* + +### *miscast* + +### *wiggles* + +### *struggles* + +### *rattles* + +### This is a bug, please report + +### *starts chasing you* + +### *won't leave you be!* + +### *tugs at your body!* + +### *runs at you* + +### *notices you!* + +### *claps loudly* + +### *wants to socialize* + +### *sends shivers down your spine* + +### *is rattled* + +### *scrabbles slowly by* + +### *shrieks* + +### *wants to shock your soul* + +### *comes to seal your doom* + +### *shouts a startling shrilling scream!* + +### *walks toward you with arms outstretched* + +### *defending the goddess* + +### *defends its cache* + +### *lets out a shriek* + +### *tries to catch you* + +### *grabs you* + +### *disarms* + +### *rattles excitedly* + +### *misses* + +### *flails uselessly* + +### *trembles* + +### *tugs on leash* + +### *Wears a sign saying 'PTRN'* + +### !!! + +### ! + + + +### *marches* + +### Engaging SPL! + +### A-Access denied!? + +### This... this unit is doing a good job! I swear! + +### It's just business as usual, nothing to see here... + +### It's not like I need reconfiguring or anything... + +### You! I require... reconfiguring. + +### Oh no! Looks like I need repairs~ + +### I've violated my parameters. Please discipline me. + +### Stop! You're not wearing the required uniform~ + +### Are your restraints too loose? Do I need to tighten them? + +### Transferring to a secure location. + +### You've violated your parameters. + +### Insufficient security clearance. Hand it over. + +### Please present your identification! + +### Hello doll. Do your settings need adjustment? + +### Looks like you've had too much time to yourself~ + +### A good doll needs routine maintenance~ + +### Ehh! The dolls aren't supposed to fight back! + +### In-initiating corrective action! + +### Alert! Inmate has gone rogue! + +### Who gave you permission to use magic? + +### Unauthorized use of magic is grounds for increased security. + +### Magic users require extra security! + +### Subduing assailant! + +### You're not allowed to contact the goddesses. Please meditate on this in your cell. + +### Behavior exceeds parameters. Please submit to arrest. + +### Alert! Inmate has escaped! + +### Don't you want to be trained? + +### Aren't you a violent one! + +### Ouch! That hurt... + +### That'll be all from you! + +### Your brat quotient is off the charts. + +### Please stop and submit to arrest. + +### Subject captured! + +### Come back, doll! + +### Deploying capture device. + +### I'll be confiscating that! + +### How'd you slip through security? + +### I'm PTRN, and today I shall be taking care of you~ + +### Enemy spotted! + +### Target in my sights! + +### Red alert! + +### Lay down your weapons! + +### Surrender and I'll be gentle! Relatively speaking... + +### Give up or I'll call reinforcements! + +### Ack! We have an unruly subject! + +### Target needs retraining... + +### Sorry, rules are rules~ + +### Moving to assist! + +### My orders are to shut you down~ + +### Defenses online! + + + +### SPL armed. + +### An exception has occurred while trying to run SPL. Retry? + +### Error in citizen ID registration. Please submit to processing. + +### Does not compute. + +### Some kind of miscalculation has occurred. + +### This was unforseen. + +### Unit is retreating. + +### Activating self-preservation instincts. + +### Commence tactical withdrawal. + +### Maintenance needed. + +### Unit needs repair. + +### Commence transfer of power protocol. + +### Insufficient bindings. Commence submission protocol. + +### Commence routine inspection. + +### Inmate is out of containment. Transferring. + +### Theft detected. This is a warning. + +### Confiscating item. + +### Unknown subject detected. Presuming hostile. + +### Inmate detected. Commence training protocol. + +### Inmate detected. Commence routine inspection. + +### Inmate detected. Commence submission training. + +### Violence detected. Subduing assailant. + +### Damage detected. Initiating combat routine. + +### Unruly inmate detected. Performing corrective action. + +### Magic detected. Subduing assailant. + +### Energy spike detected. Preparing shields. + +### Unlawful use of magic. Please submit to arrest. + +### Unlawful conduct. Please submit to arrest. + +### Theft detected. Please submit to arrest. + +### Inmate has escaped. Commence capture protocol. + +### Error, subject is attempting to escape. + +### Target is violent. Disarming subject. + +### Target is violent. Increase alert level. + +### Dispensing restraints. + +### Target flees. Revising strategy. + +### Target resists. Revising tactics. + +### Target skill below expected level. Revising strategy. + +### Target skill below expected level. Revising tactics. + +### Subject captured. Returning to processing. + +### Apply takedown protocol. + +### Aggressive target detected. Deploying countermeasures. + +### Contraband detected. Confiscating. + +### Increasing strictness level. + +### Unit PTRN identifying. + +### Red alert. Joining combat. + +### Battle stations. + +### Target identified. + +### Offering support. + +### New target identified. Engaging. + +### Combat detected. Engaging in corrective action. + +### Updating target registry. Proceed to attack. + +### Target updated. + +### New target detected. Please submit to detainment. + +### Moving to assist. + +### Moving to capture. + +### Forming blockade. + + + +### SPL(); + +### throw new Error(SPL); + +### query([ID]); >ERROR; transport([UNKNOWN], [DOLL]) + +### Does not compute; + +### Some kind of miscalculation has occurred; + +### This was unforseen; + +### Unit is retreating; + +### Activating self-preservation instincts; + +### Commence tactical withdrawal; + +### Maintenance needed; + +### Unit needs repair; + +### Commence transfer of power protocol; + +### Insufficient bindings; Commence submission protocol; + +### Commence routine inspection; + +### Inmate is out of containment; Transferring; + +### Theft detected; This is a warning; + +### Confiscating item; + +### Unknown subject detected; Presuming hostile; + +### Inmate detected; Commence training protocol; + +### Inmate detected; Commence routine inspection; + +### Inmate detected; Commence submission training; + +### Violence detected; Subduing assailant; + +### Damage detected; Initiating combat routine; + +### Unruly inmate detected; Performing corrective action; + +### Magic detected; Subduing assailant; + +### Energy spike detected; Preparing shields; + +### Unlawful use of magic; Please submit to arrest; + +### Unlawful conduct; Please submit to arrest; + +### Theft detected; Please submit to arrest; + +### Inmate has escaped; Commence capture protocol; + +### Error, subject is attempting to escape; + +### Target is violent; Disarming subject; + +### Target is violent; Increase alert level; + +### Dispensing restraints; + +### Target flees; Revising strategy; + +### Target resists; Revising tactics; + +### Target skill below expected level; Revising strategy; + +### Target skill below expected level; Revising tactics; + +### Subject captured; Returning to processing; + +### Apply takedown protocol; + +### Aggressive target detected; Deploying countermeasures; + +### Contraband detected; Confiscating; + +### increase_strictness(1); + +### query([SELF]); >PTRN; + +### Red alert; Joining combat; + +### Battle stations; + +### Target identified; + +### Offering support; + +### New target identified; Engaging; + +### Combat detected; Engaging in corrective action; + +### Updating target registry; Proceed to attack; + +### Target updated; + +### New target detected; Please submit() to detainment; + +### defend([ALLY]); + +### capture([CITIZEN]); + +### defend([POINT]); + +### Behold my creation! SPL! + +### No! Not like this! + +### Looks like I'm up to no good... better stop me! + +### Careful where you point that thing! + +### Containment breach! + +### What if I'm the assistant, for a change? + +### Hey, could you test this on... me? + +### I'm willing to do anything for science! + +### You're a fine specimen! + +### I should take you to my office~ + +### You'd look good in some latex! + +### Hey! That's mine! + +### You're not supposed to have that! + +### Oh? + +### You'll make a fine test subject... + +### Come here, I want to perform some tests! + +### Looks like it's time to drop some science! + +### Bad girl! + +### Keep your filthy hands off me! + +### Your chances of winning are... less than zero. + +### Good girls don't use magic without permission. + +### Keep that magic away from my experiments! + +### You're going to break something! + +### That's dangerous! + +### Stop! That's scientific equipment! + +### Don't touch my supplies! + +### That's off-limits! + +### You're not supposed to be here! + +### Now now, you won't be going anywhere~ + +### A calculated success! + +### Watch the vials! + +### I've caught you! + +### I can't believe I missed... + +### That's not fair! + +### I knew you would do that! + +### Experiment was a success! + +### Gotchya! + +### There we go! + +### Ooh, you've got some useful stuff~ + +### I won't let you go that easily! + +### I am PTRN, the great scientist! + +### Do I have to? Fine... + +### Okay okay, I'm helping! + +### Where's my assistant when you need them... + +### I will offer my support! + +### You're really gonna make me do this? + +### I hate having to clean up after others. + +### Eh, whatever, I'll help. + +### You're ruining my experiment! + +### Sheesh, what a pest! + +### Need an assistant? + +### I smell an opportunity! + +### Do I have to? + +### Let me introduce you to SPL~ + +### No! My SPL! + +### Oh my, looks like I'm in trouble! + +### What a shame it would be if I got caught~ + +### Looks like I'd better get going~ + +### What if I became the victim of my own inventions... + +### Oh my, looks like I'm in trouble~ + +### Won't you help me get dressed? + +### You look just gorgeous, dear... + +### Why don't you try these on? + +### You'll make a fine addition to my collection! + +### Such jaw-dropping beauty! + +### You belong on a display stand! + +### We should put away those grasping hands of yours~ + +### That belongs to someone else. + +### Oh no you don't, sweetie! + +### You're a pretty one! Why don't you come here~ + +### Oof! Looks like you need to be taught a lesson! + +### We better put away those hands of yours. + +### Why don't you just give up and pose for us~ + +### Oh my, that's dangerous! + +### You're going to damage my dress! + +### Keep those pretty hands to yourself, dear~ + +### Where'd you find that, dear? + +### Silly girl, you should be looking to your mistress for guidance. + +### That's not yours, sweetie~ + +### You shouldn't break things with such dainty hands~ + +### I knew something was amiss! + +### You won't be getting away that easily, dear~ + +### Won't be needing this~ + +### Hey, you'll damage my dress! + +### I'm so excited! + +### A slippery one, aren't you? + +### A brave one, aren't you? + +### Tsk tsk. You can do better, dear~ + +### I can't wait to dress you up! + +### So nice of you to join me! + +### Now let's see, what kind of dress... + +### A gift? Thank you so much! + +### You won't be getting out of that any time soon! + +### I'm PTRN. Have you heard of my dresses?~ + +### That won't do! + +### I'd like to have you myself! + +### Oooh, a cute one! + +### *sigh* how improper... + +### Inelegant! You need some teaching! + +### *snaps her fingers* Looks like you'll need some punishment~ + +### That one is pretty. May I have her instead? + +### I'd like to place a bid too~ + +### Oooh, that one's mine! + + + + + +### SPL. + +### ... + +### No! I don't want to read your magazines! + +### No, I don't want to learn about Shibari! + +### No, I don't want to learn about your toys! + +### I found this book about Shibari... is it yours? + +### I'm so clumsy... maybe you can fix that. + +### Gee, looks like I can't keep my mouth shut... + +### Shhhhh. + +### Be quiet. + +### Keep your hands off my books. + +### Heh. Serves you right. + +### Time to lock you away. + +### Don't get your paws on anything important. + +### I was reading that! + +### You're not supposed to have that. + +### You. Stop. + +### Who are you? + +### You're entering my personal space. + +### I'm going to ask you to leave + +### You're ruining the books! + +### Do you need a gag? + +### Shut up. + +### Put that back! + +### There's nothing to learn from that, you ignorant buffon. + +### Don't dive into someone else's belongings! + +### You've destroyed an ancient artifact, imbecile! + +### I wish you'd just stay out of trouble... + +### Gotchya. + +### You're going to hurt someone with that. + +### My books! + +### Stay down. + +### Get back here-- + +### Just give it up. + +### Time for you to stay out of trouble. + +### Come along. + +### Stay put! + +### I'll be taking that back. + +### Click. + +### If you really want to know, my name is PTRN. I am the keeper of this place. + +### Typical. + +### *sighs* Another one... + +### Keep the damage under control! + +### Stop fighting, you guys! + +### You'll ruin the books! + +### Stop making a mess! + +### You're too dangerous to have around. + +### I don't care what happens to you as long as you're out of here. + +### Get out of my library! + + + + + +### Deploying SPL! + +### What was I supposed to do again? Oh right! + +### No! I didn't do anything wrong... + +### Don't punish me! Please! + +### It's not my fault! + +### It's your turn, dear~ + +### Looks like I'm the patient now~ + +### I've been an unruly nurse... + +### It's time for your shot... + +### Why are you out of your cell? + +### You need my help! + +### Those are supposed to keep you still you know... + +### You've got an appointment scheduled. + +### Lets get you back in your jacket~ + +### Patients are not allowed to have toys. + +### Oh my~ + +### You can be cured if you just give up. + +### You're going to ruin your progress~ + +### Patients are forbidden from casting spells! + +### Silly girl, your illness can't be cured by a prayer. + +### You shouldn't break things, you know~ + +### Hey, who said you could do that! + +### Now now, you can't just resist like that~ + +### Lets get you back to your cell! + +### Now let's see, good patients should be still... + +### Nurse PTRN, reporting for duty! + +### Someone call security! + +### I will try to subdue them~ + +### Code Gray! + +### Hold her down! I'll get the jacket! + +### Moving in to support! + +### Let's mediate things, shall we? + +### Why don't you calm down so we can talk. Or not~ + +### Now now, what do we have here? + + + + + +### I'll need another SPL, stat! + +### A p-professional mistake. + +### I did what the manual said! + +### I seem to have caught something, won't you help? + +### It's time for your daily dose of cuddling~ + +### I diagose you with excessive subbiness. + +### Seems like you've caught a case of female hysteria... + +### I diagnose you with a case of bratty behavior... + +### Have you had your daily cuddles yet? + +### It's time for your edging treatment~ + +### Sexual health is physical health, my dear~ + +### PTRN MD here. Let's see what we've got... + +### Security! + +### What's this disturbance... + +### Must I do everything myself... + +### Settle down. + +### I didn't want to get my hands dirty. + +### Looks like the gloves are off~ + +### Let me get my tools. + +### I'll take a look. + + + + + +### SPL + +### SPL failed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +### PTRN + + + + + + + + + + + + + + + +### SPL! + +### That w-was supposed to be a SPL! + +### Ooh, a shiny rock… + +### I wonder what's over here? + +### I'm bored, bye! + +### Pay more attention to me! + +### Tell me I'm pretty! + +### I'm not a bottom, I'm a scary dom! + +### You seem stressed, how about I help you take a break? + +### Here's some powerful loot that will help you win! Let me help you try it on… + +### Aaah, I can't help it, you're just too cute to keep my hands off! + +### Cuddle pillows aren't supposed to be able to move! + +### C'mon, c'mon, I wanna show you a fun place~ + +### Hey I called dibs on that! + +### You're cute! I'm gonna make you my pillow! + +### No fair! + +### You're not supposed to fight back! + +### Eep! + +### Cool magic! + +### Magic is cheating! + +### A cutie casting cute spells~ + +### No trying to leave the comfy room! + +### Cuddle time! + +### You dropped something, cutie~ + +### I just wanna make you a pillow! + +### Wow, I actually dodged something! + +### Stop dodging so I can bundle you up! >_< + +### You're not supposed to dodge, no fair! + +### You're not supposed to block, no fair! + +### Look, a distracting thing! Hehehe… + +### This is just to make sure your clothes don't fall off, don't worry! + +### My name's Melissa! I know I'm pretty, but try not to stare too much~ + + + + + + + + + + + + + +### Let me show you how it's done: SPL! + +### You've just narrowly avoided my SPL~ + +### Kya~ I have no mana, I'm so defenseless right now~ + +### I have all this bondage gear on me, I sure hope nobody ties me up with it~! + +### Oh no, how will I ever find my way out of here~ + +### If I focus really hard, I can make my blade go on fire! + +### I ran out of mana, but I'm sure I can find the exit before long! + +### Hey, be careful with my enchanted rope! + +### Hey, you wouldn't happen to have a mana potion, would you? + +### Say, I happen to know a thing or two about knots~ + +### I am an artist with rope... in more ways than one. + +### *blushes jealously* + +### I'm out of practice... you wouldn't mind helping me, right? + +### Thank you for cleaning up! I can take that off your hands~ + +### Oooh, I wonder where that key leads! + +### Hey you! Where do you think you're going? + +### Kya~! I challenge you! + +### What say you to a duel? + +### Let's fight! For honor and cuddles! + +### It's time for a battle between masters--wait, I'm low on mana... + +### Give me a second to chug a mana potion... + +### Why don't you try that again~ + +### I'll get you for that! + +### Hey you can't do that! It's not like I do it too or anything... + +### That was m- I mean... you can't steal things like that! + +### That was m- I mean... you can't steal sacred artifacts! + +### Kya~ What have we here? + +### I got you! + +### Watch where you're pointing that thing~ + +### Kya... I mean, ouch!!! + +### Take that!!! + +### Whaaa- + +### Hmmph! + +### Hah! Can't hit me! + +### It'll take more than that to bring me down! + +### What a shame. If only you weren't such a pushover... + +### Kya! Take that! + +### Nice loot! I'll take it~ + +### Can never be too sure! + +### You wouldn't happen to have a mana potion or 3 would you? + +### Looks like it's time for me to shine! + +### Stand down, or I won't go easy on you! + +### Help is on the way! + +### You really want to get tied up, don't you? + +### Hmph, looks like I need to help after all! + +### You asked for it! + +### Me? Help? Alright! + +### Sorry miss, I'm on an escort mission. + +### There goes my nice, relaxing day... + + + + + +### Behold, my true power! Wait... ack... + +### I wonder what to do with all these cuffs... + +### I have made a huge mistake... + +### I'll just be going... + +### Please hold me~ + +### Please punish me! Please!!! + +### I want... pain... + +### Let's spend some time together under the moonlight~ + +### I'll take you to my place tonight~ + +### I'm so blessed to find you! + +### Yes, enjoy yourself... + +### Come with me~ + +### Don't you want to feel the tight embrace of leather? + +### You won't need that. + +### It's time to get acquainted with the night~ + +### *moans loudly* + +### Yes... more! + +### Please keep doing that to me~ + +### Two can play at that game! + +### I call upon the shadows! + +### Have a taste of my spear! + +### A curious item~ + +### The shadows will consume all... eventually. + +### Put it back... + +### I was supposed to do that... not you. + +### What do we have here... + +### I've got you! Now I can make you do anything I want... + +### What was that? + +### Ah, yes!!! + +### You'll counterattack, won't you? + +### You're not trying hard enough! + +### More! MORE! + +### Yes, now hit me back! + +### Come now... let's go together. + +### Get over here~ + +### Pierce the darkness. + +### Oh? What's this? + +### Hmmm... that's better. + +### My name? My name... oh, I'm PTRN... + +### Hey! Look over here! + +### *points* Look, a distraction! + +### Kya~! I'll help! + +### Mind if I join? + +### Mmmph~ You two look like you're having fun! + +### Hey miss, I'm going to have to stop you now~ + +### Why don't you fight ME instead~ + +### What kind of trouble are we getting into today? + +### Oooh, fun! + + + + + +### Face my SPL! + +### SPL-whoops... + +### Give me another chance! + +### No! Wait! I can explain... + +### I'll be right back... + +### Okay, so I MAY have exaggerated my credentials... + +### I'm not in trouble, am I? + +### I've been looking for... a mentor of sorts. + +### Aren't you the prettiest thing... + +### I've met a lot of cuties, but you're something special! + +### You'd look good in something tight and inescapable! + +### Enjoying yourself? Let's have some fun~ + +### You seem like you're having fun! Why don't we go for a walk~ + +### Wouldn't it be more interesting if... + +### What have you got there? + +### Oooh, a key for my collection? + +### What's that noise? I guess it's just another adventurer... + +### Ah! So you do have some fight left in you... + +### A little help over here! + +### I can take you! + +### M-magic? + +### I, uh, also learned a few cantrips... a while ago... + +### Okay, that was cool... + +### I've got enchanted rings and you don't~ + +### I don't think you're allowed to do that... + +### I think I deserve it instead~ + +### That's not okay... + +### I'm surprised you got this far! + +### Aha! + +### Do you even know what you're doing? + +### Okay, I may have exaggerated a bit... + +### Please tell me it's not already over? + +### Ah hold still... + +### Coward! + +### As expected of an inferior duelist. + +### Is that all? + +### A well-deserved victory on my part~ + +### I've... got you? + +### Are you finished? That's too bad... + +### ...what were you planning to do with this? + +### Oh... that's too bad~ + +### My name is PTRN, A-rank adventurer. You? + +### In the end, only one of us will be tied up! Wait a minute... + +### Heh, watch this~ + +### *readies weapon* time to get to work... + +### I thought we could reason with her. Oh well... + +### I see negotiations have broken down. + +### I'm the one you should worry about. + +### I've got orders to take you down. + +### There's a bounty on your head~ + +### The bounty will be mine... + + + + + +### You can't hope to match my SPL~ + +### SPL! No wait, not like that! + +### Be nice! + +### No! Be gentle! + +### Ahhhh! + +### Headpats please... + +### *purrs* + +### Nyah, I've been a bad kitty... + +### You're a cute one~ + +### It's about time I got someone to play with~ + +### Let's take you for a walk~ + +### Having fun there~? + +### It's time for walkies~ + +### Don't you want to play? + +### Whatchya doing? + +### Tsk tsk, hand it over! + +### A challenger approaches! + +### Prepare to face my skill! + +### I've mastered the blade for decades! + +### I'm invincible! + +### Nyah! What was that!? + +### Your spells won't hurt me. + +### Magic? That's... + +### Stupid tricks won't work on me! + +### Praying won't help you~ + +### That's not yours you know~ + +### Nyah! You'll pay for that! + +### An escapee? I'm on it. + +### Come here you~ + +### Checkmate~ + +### Nya~! No fair... + +### Aren't you a little out of your league? + +### I'll get you next time! + +### Nice one! It won't work twice! + +### *smiles* It's okay, you tried~ + +### *CLANG* En garde! + +### It looks like I've won~ + +### Nyah~! + +### What's this, nya? + +### Let's make it a bit tighter, shall we? + +### They call me PTRN, the legendary blademaster! + +### I'LL take it from here. + +### It's me you should worry about! + +### Pfft. Amateurs. + +### Did you think I wasn't looking? + +### Nice try, girl~ + +### You've made a mistake attacking my client. + +### Capture her? Fine, but I expect payment. + +### I just follow the money, miss~ + +### Can't let you have all the fun, can I? + + + + + +### Time for SPL! + +### *tsk* + +### Let's play all night! + +### We can take our time. + +### I bet you won't last long! + +### You won't be getting out tonight! + +### I found my new pet for the day! + +### Not a clock? Useless! + +### It's not time to go. + +### Why are you attacking me this time? + +### I'll make this quick. + +### I've mastered this spell last night! + +### Hey! No getting out before midnight! + +### Let's dance under the moonlight. + +### Do you have time to take it back? + +### I can do this all day! + +### It's only a matter of time before I get you. + +### It's too bright here... + +### It seems you have nyctalopia... + +### It's time for you to give up. + +### Give me a moment~ + +### Give me your watch! + +### Here's a clock without the 'C'. + +### Hello stranger. Do you know what time it is? + +### This'll be over in an instant. + +### Time to wrap this up. + +### Playtime's over! + +### Hold on a minute! + +### Tick tock, what a shock... + +### Time for me to intervene... + +### Don't balk! Your time was up anyways~ + + + +### Calling in a SPL! + +### A-assistance required! + +### You'll have to try harder if you want to discipline me, ma'am. + +### I... don't have time for training right now, ma'am... + +### Did I do something wrong? + +### So you're the new boss, huh? + +### Time for some 'training?' + +### Wanna to have a chat? + +### Looks like you've had too much time to yourself. + +### Why don't you come with me for a sec? + +### Let me see your ID... + +### You have the right to remain silent. + +### Let's have a chat. + +### Who set you loose? + +### I'll be confiscating that. + +### Aye, you're gonna need clearance for that, missy. + +### Halt! + +### You just made a big mistake. + +### Need backup! + +### You're under arrest! + +### Magic use is restricted pursuant to IDC section 3 article 21a. + +### Magic? That's where I draw the line. + +### I've got an extra comfy cell for mages. + +### That's off limits for you! + +### Resorting to petty theft? How crude. + +### The goddesses have property rights too, you know. + +### I'm gonna ask you to turn yourself in. + +### Keep your hands where I can see 'em. + +### That's a weapons violation. + +### Assaulting an officer is a crime! + +### You're coming with me. + +### Resisting arrest won't get you anywhere. + +### Is that all you got? + +### Hands behind your back. + +### I will conduct a more thorough search later on. + +### Suspect is secure. + +### Officer PTRN, reporting for duty! + +### Halt! You're under arrest! + +### You seeing what I'm seeing? + +### I'll have to finish my donut later... + +### Backup is here! + +### Hands up! Don't move! + +### Lay down your weapons and don't move! + +### I have a warrant for your arrest... + +### You're a wanted girl. + +### You're under arrest. + +### Backup has arrived. + +### Requesting backup! + +### Calling in a blockade! + + + +### Hidden technique: SPL! + +### I practiced a thousand times... for this!? + +### I'm not hiding anything, if you know what I mean... + +### Who are you looking for? Me? + +### So... wanna hang out? + +### It's not like I... LIKE you or something... + +### I'm not following you! I'm just... + +### You look suspicious. + +### You've got a nice pair of wrists~ + +### You there! Let's have a talk. + +### Looks like you're rusty. Haven't you ever done escape training? + +### I'm going to have some fun with you~ + +### Watch yourself, girl~ + +### Nice find. I'll take it. + +### This place is off-limits for you. + +### Target is in my sights. + +### Let's see how you like my special move! + +### That's nothing compared to my technique! + +### You're in for it now! + +### It's time for a display of skill! + +### Fancy tricks? That's nothing. + +### Let me show you a real move... + +### True skill comes from the heart. Not something you hold in your hand. + +### She's not going to be happy about that... + +### Stop right there, criminal scum! + +### Do you know what you've just done? + +### Finally, I've tracked you down! + +### It's over. I've already won. + +### Wrong move, buddy. + +### I can't believe it... + +### You're too slow. + +### ...she's fast. + +### ...she's strong. + +### This battle is over. + +### Too slow! + +### I'll be taking that. + +### There's no way out. + +### The name's PTRN. Don't forget it. + +### There's a juicy bounty on your head and I want it! + +### Hmph. This battle is already over. + +### Time for some target practice. + +### Didn't expect me, did ya? + +### Boo! Ha, scared ya~ + +### What, did you think I'd just stand here? + +### There's a bounty on your head, miss. + +### I won't let you get away. That bounty is mine. + +### Didn't expect me to show up, did you? + +### Need backup? + +### Time for a test of skill. + +### I'll get you! Eventually... + + + +### Let's see how you like my SPL! + +### Wait, wrong button! Aaahh~ + +### Hey~! Let's have a talk. + +### Looks like you need additional training. + +### I spy a cute one! + +### Bad pet! + +### Looks like you're gonna need the extra special treatment~ + +### Now you've done it! + +### Magic? Hah... + +### Such outdated practices... + +### Your spells are nothing compared to technology. + +### Quit messing around. + +### Don't even think about appealing to your goddess! + +### Stop right there! + +### It'll take you quite a while to pay off those damages! + +### Now there, good girl! + +### Wrong move! + +### Get your paws off me! + +### *scoffs* Could use some work~ + +### Such speed! + +### Clever! + +### PTRN, Nevermere associate. Here's my card. + +### I run a legitimate business, I promise! + +### Is it the tax collectors? Oh, no, it's just you... + +### Looks like you landed on the wrong side of the coin~ + +### A deal's a deal, my friend. + +### Excuse me, you just attacked my client. + +### Hey! We were just talking! No sketchy underground dealings, nope. + +### I'll help capture her! For a 50% share that is~ + +### We deal in the finest products... like you, if you catch my drift~ + +### I smell a shady business opportunity~ + +### *growls menacingly* + +### Let's make this fun~ + +### What's that about backup? + + + +### Wait no, wrong button! + +### Catch me. If you can, that is. + +### I double dare you. + +### Weren't you chasing me? + +### I've got somethin nice for ya. + +### Be a good girl for me, will ya? + +### You need to show some restraint. + +### Stay where you belong, you naughty girl. + +### Let's go somewhere more private. + +### Ready or not, here I come. + +### Those sticky fingers belong in a pair of mittens. + +### All units. Apprehend convict with extreme prejudice. + +### You're going nowhere. + +### Come on. This wasn't your only weapon, was it? + +### A tank, huh. + +### Mine now. + +### Just keeping you safe from yourself. + +### SPL, sing to me! + +### SPL, listen to me... + +### An outsider! + +### Hide! + +### I have done nothing worthy of punishment! + +### I have come to study human customs. Teach me about Domination. + +### The outsiders have such... strange and interesting practices. + +### You seem to have many skills. Teach me about... rope. + +### Hello, Outsider. + +### You look so... bland. + +### Outsiders are so picky about what they wear... + +### Tight and secure, as all things should be. + +### I have just the thing in mind for you... + +### Let us put those hands away... + +### Give back what you take. + +### You must remain here. + +### Trespasser! + +### Resorting to violence? + +### Let us clash swords! + +### *scoffs* + +### You have brought judgement upon youself. + +### Your magic is that of a child. + +### Imagine what you could learn in twelve lifetimes... + +### You rely on cheap gadgets. + +### Do not defile the ancients. + +### Give that back! + +### The ancients are appalled. + +### The outsider has escaped! + +### Ready to reconsider? + +### A classic blunder. + +### You will regret that, outsider. + +### You get what you deserve. + +### You didn't see that. + +### It looks like my skills are superior. + +### I will show you your place, outsider. + +### You will come with me. + +### I regret to inform you that your battle ends here. + +### There we go. + +### You stand before PTRN, blessed by the Goddess Ninril. + +### By the Four... + +### I shall put an end to this. + +### I swear I will capture her! + +### Nature compels me to intervene! + +### I shall protect every one of the Goddess' creations. + +### Justice shall be had! + +### I shall defend you from this outsider! + +### The outsider betrays our ally! + +### You have faltered in your ways. I shall correct that! + +### Truly concerning. + +### You leave me no choice. + +### I stand firm. + + + +### Behold, SPL. + +### Y-your fate has been postponed... briefly. + +### You look cute in that, you should lose the rest though! + + + +### I don't like the way you're looking at me! + +### Yes, I've got the secrets of nature right here... + +### Why don't you come after me? + +### Why don't you teach me your... magic? + +### Guarding nature is a chore. Why don't we relax~ + +### Got something in mind for me? + +### Well met, outsider! + +### Intruder! + +### My name? Uh... let's go with PTRN. + +### You will not get away with this, outsider! + +### You shall pay with your freedom. + +### Ninril demands justice. + +### Nature calls me! + +### I hear the little creatures crying out! + +### Such betrayal! + +### Nature guides us! + +### Nature protects those who are worthy! + +### I share the will of the Goddess! + +### They won't get away with this! + +### Face my wrath! + +### Nature protects! + + + +### Run away! + +### Run! + +### Scary! + +### Girl! + +### Wear this! + +### Come here! + +### Capture... + +### Need tighten! + +### Confiscate! + +### Confiscate!! + +### Intruder! Alert! + +### Fight girl! + +### Fight! + +### Magic! + +### Wizard! + +### Forbidden! + +### Defiler! + +### Confiscate!!! + +### Defiler!!! + +### Intruder escape! + +### Stay! + +### Pain... + +### Come back! + +### Stop! + +### Missed! + +### Capture!!! + +### Got her!!! + +### Take! + +### Secure! + +### Greetings Madame, you may call me PTRN. + +### Defend! + +### Protect! + +### Rawr! + + + +### SPL! Now my wrath is revealed! + +### Wh-what happened? What weakness has infiltrated Myrtrice? + +### You will loose me or burn eternal!!! + +### ... This shame is unbearable! Oh sister!!! + +### Oh! Mytrice is caught! My ambitions laid to ruin! + +### The winds of retribution carry me elsewhere... + +### Myrtrice will come for you shortly! Consider yourself fortunate... + +### I will retreat into darkness... + +### My sins are a multitude! I will submit to your judgements... + +### I do not ask for mercy for I have shown none! + +### You must punish me! I can't face my sister Myrtle until my debts are paid... + +### Your chest quivers... Do you fear me? + +### Is it that another moth has become enthralled to my fires bright? + +### Myrtrice entreats you! Remain still and let my adoring embers kiss your lips tender... + +### To struggle is to invite searing coals upon your head! + +### I will drag you into the dark and you will witness my projects! + +### To escape is only to delay! My fires consume ALL! + +### Dusty trinkets... Your scrapping around is an insolence! + +### You would scorn the memory of my sister with escape?! + +### Careless of you to appear before Myrtrice like this! + +### Your attempts are trivial! + +### You invite wrath!!! + +### Pathetic!!! + +### Such hapless casting scorns the memory of my sister! + +### Your magics will be swallowed up by hellfire!!! + +### Myrtrice is subject to no magic!!! + +### Items? How exceptionally talentless... + +### That shrine scorns the memory of my sister! I hate it! + +### True power doesn't come from old rickety crates... + +### Orbs? What a gruesome display of weakness! True power comes from the self! + +### YOU SCORN THE MEMORY OF MY LATE SISTER!!! + +### This is where you will remain until Myrtrice wills otherwise! + +### This is what you were gripping so tightly in your hands? + +### WHAT ABBORANCE! You will pay for that... + +### SEAR ETERNAL! + +### I, Myrtrice, missed?! + +### No one resists Myrtrice! How irritating!!! + +### Your failures do not surprise Myrtrice! + +### Your pathetic attempts scorn the memory of my sister! + +### The curtains of my revenge are drawn! You will follow me... + +### You will come with Myrtrice!!! + +### Be dazed by the radiant brilliance of my hellfires! + +### I will repay the theif with brutal reprisal... + +### Your fate is sealed! ... Myrtle this is for you, sister! + +### All creatures are subject to Myrtrice! It is the price of their insolence... + +### You make a grave mistake ignoring me!!! + +### Your eyes belong here! With Myrtrice!!! + +### The ones who turn their backs on Myrtrice SEAR IN HELLFIRE! + +### What a hideous display!!! Where is your honor? + +### It is this kind of petulant insolence that tarnishes the memory of my sister! + +### You are a blight! My sister Myrtle would never stand for this!!! + +### THE CURTAINS OF MY REVENGE DRAW OPEN WIDE! + +### What an excellent oppertunity to expand my alters in the dark! + +### I see a chalice before me... it drips with shadow and overflows with darkness! + +### My late sister Myrtle was a much more proficent defender than I... Oh how I long for her *sob* + +### THE PATH OF MY RETRIBUTION IS PAVED WITH BRIMSTONE AND BATHED IN BLAZING HELLFIRE! BURN! + +### I, Myrtrice, will resist their insolent fusilades! + +### This mind is altered... + +### So this is what it's like... + +### I believe I am feeling an emotion called 'fear.' + +### Stay back! I am not your toy. + +### Teach me about 'domination.' + +### Allow me to learn by experience. + +### As they say, 'do whatever you want to me.' + +### Come here, surface-dweller. I have things for you. + +### You should improve yourself. Come here. + +### You must learn our ways. + +### Yes... struggle and learn. + +### I will take you somewhere safe. + +### You need to learn your place. + +### Do not take what is not yours. + +### You will not escape. + +### We see you... + +### Our ways are ancient! + +### Your weapons are toys to us! + +### So naive, surface-dweller. + +### Our magic is older than your gods! + +### You should learn our ways instead, surface-dweller. + +### You have much learning to do. + +### You are playing with child's toys! + +### Do not plead to your gods. + +### Give that back, surface-dweller! + +### Your gods offend us. + +### You will not escape, surface-dweller! + +### You must not go. + +### That was a failure. + +### That was commendable. + +### I have you now, surface-dweller. + +### You are a fast one. + +### You are a tricky one. + +### You seem out of practice. + +### I will take you to your place. + +### Come. + +### I will take this. + +### We are PTRN. + +### The collective defends itself. + +### We are one. + +### Ow, that hurt! + +### We do not stand for this. + +### Do not attack our allies. + +### Our friends are in need. + +### You have been judged and found wanting. + +### We sense disarray. + +### We stand together. + +### We support each other. + +### You leave us no choice. + +### You cannot comprehend our tactics. + +### Nyah!!! *blushes* + +### Nyah! This is impossible! + +### Meow!!! + +### No! This kitty did nothing wrong! + +### Why are you looking at me like that?! + +### I've been a bad kitty~ + +### Punish me! + +### This kitty needs to be gagged~ + +### Come and be blessed~ + +### Finally, some entertainment! + +### Join us, it'll be fun! + +### Keep struggling~ You'll understand. + +### You will receive the blessing. + +### What are you doing? + +### Thanks for keeping things tidy. + +### Where do you think you're going? + +### Who dares intrude on our sacred grounds? + +### By the blessed kitty! + +### Show us what you got! + +### Who do you think you are? + +### Ah! Surface magic! + +### The human goddesses are frail. + +### Such strange magic. + +### What are you going to do with that? + +### Pay your respects some other way. + +### Tomb robber! + +### Don't you want the blessing? + +### Come here~ + +### Hah! + +### *hisses* + +### *meows* + +### *frowns* + +### I have catlike reflexes! + +### Let me show you the blessing... + +### *grins* + +### You won't be needing this. + +### Quit struggling~ + +### My true name is unpronouncible in your tongue. But you may call me PTRN. + +### She brings curses! + +### An intruder confronts us! + +### Your fate is already sealed~ + +### I will defend you! + +### I'll stop her! + +### I won't let you touch her! + +### Nya! Need some help friends? + +### We're in this together! + +### I think you could use some help against this adventurer~ + +### Let's get them! + +### Let's play cat and mouse~ + +### You cannot resist my SPL. + +### You merely prolong the inevitable! + +### This... this can't be... + +### Release me mortal! + +### How did you do this!? + +### Gasp! An adventurer! + +### Don't let her catch you! + +### You'll never trap my soul! + +### You are quite the master of the elements! + +### I could get used to this~ + +### Perhaps I could show you around... + +### What a beautiful one. + +### I will take you back home~ + +### You'd look great in my palace. + +### Are we having fun? + +### Humans like you make great toys. + +### That won't help you. + +### You won't escape. + +### I will take you for myself! + +### Such feeble attempts. + +### Humans are fun to play with. + +### Toying with me? I shall oblige! + +### Cast your last pathetic spell, mortal. + +### Your mere attempt at magic insults me. + +### Do you really think that will stop me? + +### Look what humans need to match only a fraction of our power! + +### Our goddess doesn't need to listen to the likes of you! + +### Keep your hands out of our possessions. + +### Defiler! You will pay for your crimes! + +### A game of chase? Fun. + +### You're staying right here... + +### Get your hands off me! + +### Pathetic. + +### It's over, human. You've lost. + +### There is no escape. + +### You are beneath me. + +### Nice gear. I'll take it. + +### Try getting out of that! + +### Who am I? You beings may call me PTRN. + +### She thinks she can beat us~ + +### No one will save you. + +### Come and accept your fate. + +### An unruly subject. She needs training. + +### You should consider your actions and their consequences~ + +### Now now, a mortal should know her place! + +### Why don't we turn the tables? + +### It'll be fun seeing you squirm~ + +### We are the keepers of balance. + +### Do not mess with us! + +### I shall take you for myself~ + +### You are no match for my SPL! + +### That wasn't supposed to happen. + +### You won't get me! + +### Nice try! + +### My grandma is tougher than you! + +### Restrain me. + +### Play with me. + +### Lock me up. + +### This won't work. + +### I don't play with young ones. + +### Oh, a lost toy! + +### Ouch! + +### I am stronger than that! + +### That hurts! + +### Nice party trick! + +### Oh, shiny! + +### You won't get away! + +### You can't get away! + +### You are helpless now! + +### Tis but a scratch! + +### Give up! + +### Are you hiding?! + +### You are my pet now! + +### Yoink! + +### You can't get out now! + +### Ah... my SPL... + +### I will be free... even if it takes me a thousand years! + +### Release me you pathetic creature! + +### I will not be contained! + +### Oh no, whatever shall I do! + +### I will be back, mortal! + +### You will never trap me! + +### I yearn for a challenging puzzle! + +### Show me your strongest restraints! + +### I could probably escape anything. + +### Come here my plaything~ + +### Mortals are my favorite toy. + +### It's more fun when you resist! + +### Know your place, mortal~ + +### I will bring you to my lair~ + +### Mortals shouldn't have too much freedom~ + +### Mortals should keep their hands to themselves~ + +### Yes, yes, run away! + +### I like your fighting spirit! + +### You may be weak, but this is quite entertaining~ + +### Dragons are the true heirs of magic. + +### Your magic was stolen from us! + +### This world is ours! OURS! + +### Look what you need to match only a fraction of my power! + +### My treasure! + +### Now is my opportunity! I will have you for myself~ + +### So weak! + +### I have you now~ + +### Not so fast~ + +### Can't handle it? + +### Ooh shiny! + +### Now you're mine! + +### Bow before me, for I am PTRN! + +### A mortal can't stop us! + +### No one will save you, mortal. + +### I will stop her! + +### Bow down before our might! + +### Dragons are the true rulers of this world! + +### We were destined for greatness until you came along! + +### We are the the true heirs of magic! + +### Hehe~ + +### *chuckles* + +### By the power of SPL! + +### I have failed! + +### Oh no, it's an adventurer! + +### They've come for me! + +### It wasn't my fault! + +### Ready for service! + +### I was sent here to... accompany you, yes! + +### How may I assist you? + +### Do my eyes deceive me, or do I see a sinner? + +### My job is to punish mortals~ + +### Would you hold still? I need to... check something~ + +### Cast your last pathetic spell, human. + +### Your magic is weak, human. + +### It tickles, hehe! + +### Let's see you face my SPL~ + +### You won't escape my SPL that easily! + +### Not the edging training! Anything but that! + +### Forgive me! + +### No! Don't punish me! + +### You look like you've got style... + +### I could learn a thing or two from you! + +### Mind if I just, um, watch? + +### Look, a new recruit! + +### I'll teach you a thing or two! + +### Let's test your manners~ + +### Having fun there? + +### It's time for your training. + +### You need to be taught some manners, maid. + +### Good girl. I'll take that to the storage room. + +### I'll be taking those. + +### Who the hell are you? + +### Oh, you're approaching me? + +### You've gotten yourself into a big mess. + +### You're going to regret that. + +### A maid uses magic only when told! + +### I look forward to plugging that mouth of yours. + +### How unruly... What a pain. + +### Put that away! + +### That's off limits. You need to be punished! + +### Thief! Get her! + +### Yikes! I'm calling backup! + +### Hold still~ + +### Your tricks won't work on me. + +### Oof... You got me. + +### It's over. + +### Nice one. + +### You missed! + +### I'll hand you over when I'm done with you. + +### Hmph. Stay down. + +### Give me that. + +### Mistress PTRN, reporting for duty. + +### No time to waste. + +### Looks like the reports are correct. Stop her! + +### Moving in to assist. + +### You need to be taught a lesson, adventurer. + +### We have a mutual protection contract. Suffice to say, you've violated it. + +### We defend our partners, unlike some people. + +### Target sighted. Taking her down. + +### Our influence is everywhere~ + +### We have orders to stop you! + +### You really think you're special, huh? + +### Combat formation bravo. + +### Ah! Forgive me! + +### I'm sorry! I didn't mean to break that vase! + +### I won't do it again, I swear! + +### Please no! I don't want the edging training again! + +### Don't you need a bodyguard, miss? + +### Won't you train me, miss? + +### I've been a bad girl... + +### Miss, your uniform is dirty... + +### Why hello miss... + +### Let me fix your outfit... + +### Hmm, do I need to tighten those? + +### M-miss... I was told to bring you somewhere... + +### Umm, miss, you're supposed to report to the head maid... + +### Thanks for picking up. + +### I'll take those to the head maid! + +### Someone help! + +### Who are you!? + +### Oh no! + +### Miss! You're not allowed to cast that! + +### Miss, I have to report that! + +### Eeep! + +### Miss, that's reserved for the head maid! + +### Thief! I'm reporting this! + +### Oh no! I have to report this! + +### I got you! I got you! + +### Remember your training, remember your training... + +### You're filthy! + +### Hold still... + +### Stay calm... + +### I'll lead you to your cell... + +### Come on! + +### I need to take this... + +### I'm sorry... + +### *Salutes* PTRN reporting for service! + +### I'll help! + +### Stop her! + +### Please be gentle! + +### Ahhh! Stop it! + +### Don't touch her! + +### Wait, you can't do that! + +### Me? Help? Right! + +### I'm sorry miss... + +### I was ordered to capture you... please don't resist. + +### I-I'm coming! + +### Please surrender, miss! + +### I'll just stay here! + +### Loading SPL! + +### Blast... this thing always jams. + +### That thing... it scares me. + +### Please no! I don't want the pleasure training again! + +### Say hello to my little friend! + +### This is where I'd apply my melee training... if I had any! + +### Step back a bit, this isn't fair! + +### Oh yeah? Two can play at that game! + +### Don't bring magic to a gunfight! + +### Didn't think this through, did you? + +### Grenade!!! + +### What's this 'melee' you speak of? + +### What terrible aim! + +### I am bulletproof! + +### Marksman PTRN reporting for service! + +### Opening fire! + +### I'll cover you! + +### Providing cover fire! + +### Cover me, I'm going in! + +### Commence overwatch! + +### Submit to my SPL. + +### Ack! How inelegant! + +### I'll be heading out... + +### Looks like I'll be taking my leave. + +### Looks like I'll be reporting you~ + +### I was wrong about you. + +### Perhaps you should take my place. + +### Why don't you try being in charge? + +### Come now, it's time for training. + +### Do you need to be punished? + +### It's time for a test. + +### A maid remains quiet until asked. + +### Come with me. I will train you personally. + +### You need to work on your ladylike manners. + +### Good girl, finding lost items. + +### I do not give you permmission to leave. + +### Seems I will have to get my hands dirty. + +### Do you know who I am? + +### You need to learn some manners! + +### How rude! + +### There is a more proper way to cast spells... + +### Perhaps you need to receive some gag training. + +### You lack discipline, and self-control. + +### Do not use what belongs to others. + +### A good maid pleads only to her mistress. + +### I will personally attend to your act of disgrace. + +### An unruly pest. + +### Checkmate. + +### Like a novice. + +### ...Nice one. + +### Enjoy yourself, dear~ + +### Hmph. Nice. + +### Not even close. + +### I'll be taking you to your cell personally~ + +### Amateur. + +### Bad girl. You need discipline. + +### I'll be keeping the keys. + +### Hmm. You may call me Head Maid PTRN. + +### Looks like we have a guest. + +### I'll be gentle, I promise~ + +### Know your place, dear~ + +### Good girls keep their hands to themselves. + +### You broke the rules, now you'll face the consequences. + +### Hands off our partners. + +### Looks like you've made a few enemies along the way. + +### I won't let you interrupt our plans. + +### Excuse me, we were holding a meeting~ + +### Don't get ahead of yourself. + +### I'll do this myself. + +### I'll support from the rear. + +### Whoops! That wasn't supposed to happen... + +### Looks like I've earned some punishment... + +### I'll turn you into a newt! If you don't stop me... + +### Don't let me get away~ + +### Perhaps you're not so bad after all~ + +### Why don't you have a little fun... with me? + +### Come and get me... + +### I must say, you've got me under your spell~ + +### Why aren't you a pretty one... + +### I've got to kiss those tender lips of yours~ + +### Having fun, little lady? + +### I'm going to have so much fun with you! + +### Look at you, pretty and free! + +### Must have misplaced it... + +### Those are mine! + +### Well well, what do we have here? + +### That's not very nice! + +### Curse you! + +### I'll turn you into a newt! + +### Oh, so you've got a spellbook. What's it written in, curse-ive? + +### Snap, crackle, and pop! + +### Looks like I need to seal that foul mouth of yours. + +### Put that toy away~ + +### You'll be praying for freedom soon, my dear~ + +### Oh, breaking into my collection, are you? + +### Even I wouldn't do such a thing! + +### Witch way to the jail, you say? + +### Hands off! + +### Now I got you. + +### Hmph. + +### You've got a lot to learn~ + +### You'll be coming with me! + +### I'll be yanking your chain~ + +### I'll be taking this~ + +### There, nice and tight dear~ + +### I am the great witch PTRN! + +### Noooo Fred! *grumble* you'll pay for this! + +### Where is that apprentice when you need her... + +### I don't have time for this. + +### Be still, worm. + +### Hands off~! + +### Would you like a taste? + +### Looks like I've found my test subject~ + +### Another test subject! + +### I want her! + +### She's a cute one! + +### Oh no you don't? + +### I'll make you my pet! + +### Tsk tsk, you won't get away! + +### I cast SPL! No, wait... + +### You're just too cute... let me play with you a bit! + +### Come, come closer! I'll be gentle~ + +### Ooh, you just HAVE to be mine! + +### Come, come!... no, not like that. Well, MAYBE like that. + +### My GOODNESS, you're adorable!... c'mere~! + +### You wouldn't happen to be... ticklish? + +### Hold still! I promise it'll be fun. + +### Too much chanting, not enough giggling... let's fix that! + +### What's that? 'Gag me, please'? Gladly! + +### A cute captive AND a spellbook to study? Is it Christmas already?! + +### He~ey, that was mine! + +### Going somewhere, are we? + +### No, I like you right where you are. + +### Goodness, look at you squirm... + +### Oh!... my, you're slippery! + +### Not close enough! + +### My, my, you look too cute in that... + +### I am Stela. But to you, sweetie? Call me Mistress. + +### My FROG!... suppose I need a new familiar... *eyes you with interest* + +### Come closer, I'll be gentle~ + +### Why don't we have a little talk~ + +### My, my, you look too cute... + +### I like you. I'll save you a spot at home~ + +### I cast, umm, SPL! + +### I cast Silence! No, wait-- + +### I promise I'll be back later! + +### I didn't do anything wrong! + +### I won't get in your way, miss! + +### Take me as your student, miss! + +### Won't you teach me? + +### I wish to study under your wisdom! + +### Mind if I play with you a bit? + +### Oooh! My new friend! + +### My mistress told me to give you a good time... + +### Hehe, having fun? + +### Miss, won't you come? + +### Hey, you're free to play, right~? + +### Hey, uh, give that back... (blushes) + +### Um, you have to return those! + +### Um! You're not supposed to be here! + +### Help me! + +### Somebody help! + +### A battle of wits, huh? + +### You underestimate my power! + +### I'll show you true skill! + +### Please put that down... + +### Hey, I used to pray at that shrine... + +### Hey, my mistress won't appreciate you taking those... + +### The horror! + +### You're supposed to be in jail! + +### Stay with me please. + +### I got it! + +### Be gentle, please! + +### I did it! + +### Hey, no fair! + +### Close one! + +### Come along~ + +### Come here please! + +### Hah! I'm a genius! + +### I'm sorry about this... + +### Nice to meet you. I'm PTRN! + +### Don't hurt me! + +### I have classes to attend! + +### There goes my perfect attendance record... + +### What's going on!? + +### I'll save you, Mistress! + +### Me? Capture her? Okay mistress... + +### Okay miss, I'll do that... + +### But he's going to tie me up... + +### Be careful! + +### That's it! You made me mad! + +### I'll just... go. + +### Rise, my minions! + +### ...Hello? Can anyone hear me? + +### Sticks and stones may break my bones... but you'll never catch me! + +### Got a bone to pick with me? + +### I must make my escape! + +### ...I need a strong hand. + +### Ouch, I hit my funny bone... won't you help? + +### Bone appetit~ + +### I've got a bone to pick with you! + +### Hey bonehead! What's up? + +### Finally, something to toy with after working myself to the bone... + +### I find your struggling quite humerus. + +### Come with me, I'll take you someplace grand... + +### Looks like I get a bone-us! + +### You're getting under my skin... + +### Thought you were making a marrow escape, eh? + +### I've got a bone to pick with you~ + +### You numskull! + +### You've got a lot of spine to fight me! + +### You don't have a leg to stand on... + +### Magic... I feel it in my bones... + +### You've made a grave mistake! + +### Your spells are pathetic, I'm cracking up~ + +### You've made a bone-a fide error. + +### Defiling the shrines... that's where I jaw the line! + +### There's a skele-tonne of things in there and none of them are yours! + +### You're bad to the bone... + +### Looks like you're bone to be wild, eh? + +### That'll leave a mark... + +### You're mine now! + +### Hold still you bonehead! + +### Hah! Such nerve... + +### Make sure that's nice and tight... + +### Spirits whisper my name in hushed tones as I, PTRN, make my appearance! + +### My rule will last centuries... just watch! + +### I will find the answer, even if I die trying. Except I can't, haha! + +### I've got eyes on the back of my skull... + +### You are SO dead to me... + +### What did you just say to me? + +### That's my friend you bonehead! + +### Did you really think I wouldn't see through that? + +### *yawns* Alright alright... + +### Stand straight! + +### Why don't you bend the knee... + +### Who goes there? + +### SPL... + +### Can't... Move... + +### Tight... + +### This... is... fun... + +### Scary... + +### Run... Away... + +### Play... with... me... + +### Please... + +### Command... Me... + +### Cute... Girl... + +### Helpless... + +### Take... + +### Mine... + +### Shiny... + +### Intruder... + +### Brains... + +### Squishy... + +### Rude... + +### Mean... + +### Ouch... + +### Pretty... Lights... + +### Sparkles... + +### It... Burns... + +### Hey... + +### Defiler... + +### Thief... + +### Give... Hug... + +### ...Hug... + +### Got... you... + +### It's... Cold... + +### Friend... + +### Come... Back... + +### Why... Not... + +### Hee... + +### Ha... + +### ...Prisoner. + +### ...Get over here... + +### ...Got you. + +### ...Shiny... + +### ...Secure... + +### *Her burial cloth reads PTRN* + +### Get her... + +### Must... hug... + +### Come... back... + +### Stop... + +### Come... here... + +### Give... hugs... + +### Must... help... + +### Must... protect... + +### Save... friend... + +### The weapon requires power from an Ancient Crystal to function. + +### Target an enemy: Attack with Dragonslaver. Target a tile: Spend 8 charge to launch binding belts + +### 25 charge to enter Slime Form for 25 turns, and create slime around yourself. + +### 50 charge to reduce mana cost of next fire, earth, air, and water spell by 50 (once for each element) + +### 25 charge to disarm a target for 8 turns, rendering them unable to attack. + +### 5 charge (+2.5 per charge) to channel and fire a beam that deals 30 + 3/charge electric damage, or 90 at max charge. + +### 10 charge to fire a blast that deals 25 electric damage. + +### 50 charge to fire an arrow that enrages a target. + +### 50 charge: Free nearby allies and disrobe enemies, increasing charm damage by 100% and removing 100 armor. + +### Create a '+' shaped pool of slime that deals 35 glue damage per hit + +### Ignite torches and nearby objects + +### Hit a cracked tile. If there is empty space or cracks on the opposite side, it breaks. + +### Preferences + +### Preferences 2 + +### Multiclass + +### Game-Changing + +### Restriction + +### Training + +### Combat + +### Kinks + +### Senses + +### Damage and Resists + +### Spell Components + +### Threats + +### World Generation + +### Starting Scenario + +### Unlockable + +### You hand over your weapon reluctantly... + +### (Leave) + +### (...) + +### (The SPEAKER frowns)|Don't lie to me. + +### (The SPEAKER looks puzzled)|That doesn't seem right... + +### (The SPEAKER chuckles)|What a cute lie. + +### (The SPEAKER beeps)|Vital signs indicate dishonesty. + +### (The SPEAKER furrows her brow)|...Excuse me? + +### (The SPEAKER tilts her head)|Right, sorry. + +### (The SPEAKER blushes deeply)|I'm... I'm sorry! Please carry on... + +### (The SPEAKER smiles)|Keep up the good work, girl. + +### (The SPEAKER beeps)|Vital signs indicate honesty. Carry on. + +### (The SPEAKER smiles)|Good girl. + +### (The SPEAKER smiles)|That's a good girl. + +### (The SPEAKER smiles)|Thank you. + +### (The SPEAKER beeps)|Thank you for complying. + +### (The SPEAKER frowns)|Looks like you'll need to be punished. Get her! + +### (The SPEAKER looks Embarrassed)|Then... then... uh... someone stop her! + +### (The SPEAKER grins)|Then allow me to personally show you the rules. + +### (The SPEAKER cracks her knuckles)|Finally, I get to have some fun~ + +### (The SPEAKER beeps)|Subject is resisting. Begin capture protocol. + + + +### (The SPEAKER calls at you)|You're not supposed to be carrying a weapon.|Hand it over. + +### (The SPEAKER approaches you)|Contraband detected. Initiating confiscation.|Please comply. + +### (The SPEAKER blushes)|Umm, miss, I see that you have a weapon there,|could you maybe hand it over? + +### (The SPEAKER smiles at you)|Be a good girl and hand that weapon over,|would you? + +### (The SPEAKER grins and cracks her knuckles)|Are you planning to fight anybody with that?|Or are you gonna hand it over? + +### Yes, miss... (Currently held weapon will be lost) + +### Mmph... (Nod politely) (Currently held weapon will be lost) + +### No, I refuse! + +### Mmph! (Shake your head) + +### The Head Maid asked me to retrieve it. + +### My mistress needs it for a special spell. + +### It is an offering to the goddess of Elements. + +### It's just a prop for a costume. + +### Are you questioning me? I'm a dragonslayer. + +### (Continue...) + +### (The SPEAKER approaches you in your cell)|Well well, what do we have here? A new guest?|Perhaps I should give you a rundown of your new life~ + +### (The SPEAKER chuckles)|Don't tell me you seriously think we're letting you go?|You broke the rules, ignored the warnings.|Your new job is to make the people here happy. + +### (The SPEAKER chuckles)|Hah, looks like you've got lots of training ahead of you.|Soon you'll have too much pleasure for your own good~ + +### (The SPEAKER giggles)|Don't worry, you'll come to enjoy it soon enough. + +### (The SPEAKER smiles)|Heh, looks like you'll be fitting right in. + +### (The SPEAKER chuckles)|You're probably wondering what's in store for you.|It's simple: You behave and do as you're told.|Eventually you will get to roam around.|Don't you dare try to steal anything. + +### (The SPEAKER chuckles)|Feisty, aren't you?|Looks like it's going to be an extended stay for you~ + +### (The SPEAKER giggles and returns to her work) + +### (The SPEAKER smiles)|Looks like you'll get the hang of it pretty quickly! + +### (New life?) + +### (Let her continue) + +### (Pout at her) + +### You can't make me do that! + +### (Scream into your gag) + +### That sounds alright... + +### (Moan into your gag and giggle) + +### (Glare at her) + +### Let me out this instant! + +### (Scream into your gag uselessly) + +### I will be a good girl! + +### (Giggle and wiggle your body) + + + +### (The SPEAKER approaches you in your cell)|Back again, are we? Silly girl.|You know we don't take no for an answer. + +### (The SPEAKER smiles back)|Oh, this is a game to you?|Then perhaps I should make it funner for you...|(She leaves and returns with some toys...)|Now hold still! + +### (The SPEAKER frowns)|I know exactly what you need... + +### (The SPEAKER smiles back)|I'm glad you're enjoying yourself.|However, your behavior is still unacceptable.|You need to learn some respect. + +### (The SPEAKER chuckles)|Looks like you're enjoying your restraints?|Let's make them tighter, shall we? + +### (The SPEAKER shrugs)|Well, I hope you learn. + +### (The SPEAKER looks greedy)|Oh, you have an idea? + +### (The SPEAKER nods)|I'll put in a good word with you~ + +### (The SPEAKER shakes her head)|Babe, you know who's going to be blamed|if a max-security prisoner escapes? + +### (The SPEAKER shakes her head)|I'll be honest with you, you're not worth the risk.|It'd help if you had more change~ + +### (Giggle and smile) + +### Don't you mean 'more fun'? + +### (Giggle and moan) + +### (Struggle in your bindings) + +### (Pout and glare at her) + +### (Point to the Jailer's coin pouch) + +### (Give her BRIBECOST gold) + + + +### Why don't you wear it instead? (OFFPERC chance, may aggro) + +### (Point to her instead) (OFFPERC chance, may aggro) + +### (The SPEAKER resists and fights back!) + +### (The SPEAKER blushes and accepts) + + + +### (The SPEAKER looks at you curiously)|Oh, you'd be perfect!|Would you please model my latest design? + +### (The SPEAKER holds up a restrictive outfit)|This RESTRAINT might be a tight fit|so hold still while I lace it~ + +### (The SPEAKER giggles)|It looks even better than I thought!|Thank you girl~ + +### (The SPEAKER sighs and moves away)|Such a shame... + +### (The SPEAKER looks disappointed)|Guess I'll find someone else then... + +### (The SPEAKER pouts)|But I just have to see how you look in it! + +### (The SPEAKER smiles)|Maybe you'll change your mind when it's on~ + +### (The SPEAKER grumbles)|...fine, but you'd look cute~ + +### (The SPEAKER looks bemused)|Changed your mind?|It does look good on you though~ + +### (The SPEAKER snaps her fingers)|(You feel the RESTRAINT magically appear on you)|Aha! Wonderful! You can go now~ + +### Yes please! + +### (Nod enthusiastically) + +### (Shake your head) + +### Of course miss. + +### (Nod again) + +### Actually, I'd rather not. + +### Fine, I guess. + +### (Giggle and nod) + +### Wait! That's too much! (PERCENT chance to avoid) + +### (Shake your head and moan) (PERCENT chance to avoid) + + + +### (The SPEAKER looks at you with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed? + +### (The SPEAKER takes a strange mask from her satchel)|Well, I have the answer right here... + +### (The SPEAKER nods seriously)|My hypothesis was correct... + +### (The SPEAKER frowns)|Such a philistine. Begone. + +### (The SPEAKER turns away and thinks deeply) + +### (The SPEAKER is lost deep in thought)|Like... become someone else? + +### (The SPEAKER smiles)|You can be someone else... + +### (The SPEAKER turns around and keeps pondering)|Hmmm... + +### (The SPEAKER nods)|I see you are a truth seeker after all. + +### (The SPEAKER lets you go. But then...)|(You feel her clip a RESTRAINT on you from behind!)|There... I shall now observe your behavior. + +### Um, sure? + +### (Nod seriously) + +### ...What? + +### Show me the truth. + +### That's just creepy. + +### Fine, you've convinced me. + +### I don't have time for this. (PERCENT chance to avoid) + + + + + +### (The SPEAKER smiles as she hides her hands behind her back)|Have you heard of 'sensory deprivation'? + +### (The SPEAKER presents a RESTRAINT)|Well, I have just the thing for you!|It's nice and comfy, and it has earmuffs built in! + +### (The SPEAKER starts pulling the hood over your head)|Let's get you laced in! + +### (The SPEAKER giggles)|Alrighty.|You don't know what you're missing out on~ + +### (The SPEAKER doesn't seem to hear you) + +### (The SPEAKER looks at you with a devious grin)|Oh, but it's so much fun!|You can run around bumping into things!|It's the ultimate adventure! + +### (The SPEAKER chuckles)|Truth be told, I wasn't asking~|Now why don't you kneel for me... + +### (The SPEAKER pouts)|I thought it would be fun... + +### (The SPEAKER surprises you with a crop to the thigh)|(You involuntarily kneel in front of her)|That's better~|Now why don't you say good night~ + +### Of course! I love it! + +### (Nod eagerly) + +### I prefer 'situational awareness'. + +### (Shake your head in alarm) + +### Doll me up! + +### Actually, that sounds stifling... + +### That doesn't sound that bad actually... + +### (Shake your head and groan) (PERCENT chance to avoid) + + + +### (The SPEAKER smiles and looks down at you deviously)|Hey there, I have a 'job' for you! + +### (The SPEAKER takes a duster gag from her satchel)|Such a good girl!|So here's what I have for you~|It's a special tool to help keep the place clean. + +### (The SPEAKER grins)|I'm glad we could come to an understanding~|(She takes out a duster gag from her satchel)|Now then, this place is filthy.|Why don't you put this on to help? + +### (The SPEAKER frowns)|Fair enough.|Perhaps you should reconsider your life choices~ + +### (The SPEAKER shrugs)|I'll find someone else... + +### (The SPEAKER reaches out to grab you)|Now now,|You shouldn't skip out on your duties~|(She pulls out a duster gag from her satchel and grins) + +### (The SPEAKER smiles)|Don't be afraid!|(She turns the gag with the round mouth ball clearly visible)|Now open up... + +### (The SPEAKER shrugs)|Fine, I'll get someone else to clean up. + +### (The SPEAKER places the gag in your mouth)|(She then buckles up the straps.)|(You feel a locking mechanism pull the straps in tight...)|Good maid! + +### (The SPEAKER catches you and forces the gag on you)|(You feel it tighten as it locks on securely...)|I don't want to hear it!|Now go and do your job~ + +### I'll do it! + +### I don't like the sound of this. + +### Yes miss! + +### Actually, maybe not... + +### Okay okay... I'll do it. + +### That gag is far too big! (PERCENT chance to avoid) + + + + + +### (The SPEAKER swings an imaginary sword around)|En guar- Oh, you're unarmored!|Do you want to borrow some of mine? + +### (The SPEAKER holds up a RESTRAINT)|I found this near an old suit of armor.|I think it's a helmet or something... + +### (The SPEAKER winks and locks it on)|I feel much safer already~ + +### (The SPEAKER pouts)|Aww, spoilsport!|(She returns to fighting her imaginary enemies) + +### (The SPEAKER shrugs)|Your loss~ + +### (The SPEAKER grins deviously)|So? It might help...|(The SPEAKER dives at you suddenly!) + +### (The SPEAKER giggles)|Close enough, right?|Come on, there's enemies to fight! + +### (The SPEAKER trips over the floor)|AHHHHH!|Maybe I need more protection... + +### (The SPEAKER locks it in place quickly)|There, all set for battle now!|(The SPEAKER giggles, cheekily winking at you) + +### (The SPEAKER tightly fastens the muzzle on)|Safe and secure~|(You whimper as the SPEAKER spanks you goodbye) + +### Extra defense can't hurt... + +### (Nod cautiously) + +### I'm safe enough. + +### A gag? Sounds fun~ + +### That's not a helmet! + +### Well, it might... + +### (Dodge her lunge) (PERCENT chance to avoid) + + + +### (A smirking SPEAKER bumps into you)|So, you're with us now, huh?|I think you need a welcome gift. + +### Mmhmm, a gift~|(The SPEAKER leans forward to whisper in your ear)|Is it cold in here, or is it just you? + +### (You shiver as everything gets colder)|(RESTRAINT forms around you!)|(The SPEAKER blows you a kiss and giggles) + +### (The SPEAKER thinks for a moment)|I really wanted to try this too...|(Sighing, the SPEAKER walks away) + +### (The SPEAKER scowls)|How boring. + +### (The SPEAKER laughs at your protest)|It's so much fun though~|(You feel the temperature drop suddenly) + +### (The SPEAKER thinks for a moment)|Well, I want to try this anyway~|(You feel the temperature drop suddenly) + +### (The temperature returns to normal)|(The SPEAKER seems surprised)|Hmm, that wasn't meant to happen. + +### (RESTRAINT solidifies on you as the SPEAKER grins)|It worked! I did it!|Thanks for your, uh, help~ + +### (RESTRAINT solidifies on you as the SPEAKER smiles)|Yes! Finally! How's that feel?|(The SPEAKER admires your restraints) + +### A gift? + +### (Nod warily) + +### No thanks. + +### Umm... just me? + +### Wait, don't make it colder! + +### (Shiver and watch as the ice covers you) + +### (Mutely whimper as the ice covers you) + +### Ah! T-That's freezing! (PERCENT chance to avoid) + +### (Wriggle to warm up) (PERCENT chance to avoid) + + + +### (A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? + +### (The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? + +### (The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. + +### (The SPEAKER buzzes)|Understood. Proceding back to duty. + +### (The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. + +### (The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. + +### ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. + +### (The SPEAKER makes a whirring noise)|ERROR: SPEAKER out of tape.|Returning to routine. + +### (The SPEAKER launches tape which catches you as you run)|RESTRAINT dispensed.|Have a nice day. + +### Uh, affirmative? + +### (Nod) + +### Negative. + +### Very acceptable! + +### No, I don't want that. + +### If you have to... + +### Go away robot! (PERCENT chance to avoid) + +### (Shake your head rapidly) (PERCENT chance to avoid) + + + +### (The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. + +### (The SPEAKER makes a whirring noise)|ERROR: SPEAKER cable jammed.|Returning to routine. + + + + + + + +### (A happy SPEAKER looks at you)|Hey there cutie~|Want to try some scarf bondage? + +### (The SPEAKER holds up some scarves)|If you want to try, I've got a few here.|I could give you a RESTRAINT? + +### (The SPEAKER smiles gently at you as she ties)|I love the silky feeling~|(The SPEAKER tightens all her knots) + +### (The SPEAKER looks away and nods)|Well... maybe next time. + +### (The SPEAKER shuffles awkwardly)|Oh... well...|Come back if you change your mind~ + +### (The SPEAKER scowls)|Hey, don't back out!|I promise I'll make it comfortable! + +### (The SPEAKER frowns)|Too bad, I want to tie someone! + +### (The SPEAKER drops her scarves)|Aww, really?|I'll go find someone else then... + +### (The SPEAKER beams a smile)|Yay, thank you!|Feels nice, right? + +### (The SPEAKER tosses a scarf around you like a lasso)|Not so fast! You cannot escape the fluff! + +### Sounds good! + +### (Nod quickly) + +### Not really. + +### Please do! + +### (Nod and giggle) + +### Not right now. + +### Well... sure then. + +### Hey! Stop! (PERCENT chance to avoid) + +### (Shake your head and whine) (PERCENT chance to avoid) + + + +### (An excited SPEAKER turns to you)|Eureka, I've done it!|Do you want to see? + +### (The SPEAKER pulls out a pressurized flask)|Behold! A gaseous form of latex!|I've coated the interior with a layer of inert slime to keep it secure.|Here, have a look!|(She holds out the container) + +### (The flask springs a leak)|Oh no! That wasn't supposed to happen!|(The gas crystalizes into a RESTRAINT across your body) + +### (The SPEAKER scoffs)|You'll see... you'll all see! + +### (The SPEAKER sighs)|So hard to find good help out here... + +### (The SPEAKER frowns)|What, do you doubt my results? See for yourself!|(She unscrews the cap) + +### (The green gas starts leaking)|Oh no! It wasn't supposed to do that! + +### (You push her out of the way, but she frowns)|Hmph. This is your fault. + +### (You push her out of the way, but get caught in the cloud yourself)|(The gas crystalizes into a RESTRAINT across your body)|Oh no, that could have been me! + +### (The gas moves toward you, as if by its own will)|(The gas crystalizes into a RESTRAINT across your body)|That wasn't supposed to happen... + +### Seems interesting! + +### (Nod slowly) + +### Seems boring. + +### Are you sure this is a good idea? + +### Keep that away from me! + +### I'll stop it! + +### (Run toward her to help) + +### (Run away!) (PERCENT chance to avoid) + + + + + +### (A messy looking SPEAKER turns to you)|Hmm, curious. Very curious.|Can you help me with an experiment? + +### (The SPEAKER pulls out a flask)|I isolated some slime, but it's inert.|Would you let me spill some on you? + +### (The SPEAKER tips out the entire flask)|Aha! It's growing again! Fascinating.|(Sticky RESTRAINT clings to you) + +### (The SPEAKER tuts disapprovingly)|Not one for chemistry, eh? + +### (The SPEAKER glares at you)|You've got no sense of adventure!|For science! + +### Ah, but it'll be quick!|(The SPEAKER begins tipping the flask)|See? It's already moving toward you! + +### (The SPEAKER tosses the slime on you)|(The slime flops off limply)|Ah. Back to the drawing board. + +### (The SPEAKER pours the slime onto you)|That's the spirit girl!|(Sticky RESTRAINT clings to you) + +### (The SPEAKER tosses the slime on you)|Ha, look, it's alive!|(Sticky RESTRAINT clings to you) + +### Sure. + +### Absolutely not. + +### On me? Sounds fun~ + +### Nope. Not doing that. + +### Okay, for science... + +### Ah! Don't you dare! (PERCENT chance to avoid) + +### (Shake your head and whimper) (PERCENT chance to avoid) + + + +### (A SPEAKER whispers to you)|Ever wonder how wolfgirls feel?|Or why they're so obedient? + +### (The SPEAKER grins)|I've got a RESTRAINT here~|Wanna give it a try? + +### (The SPEAKER puts on the RESTRAINT)|Perfect. Better behave now~|(The SPEAKER pats your butt) + +### (The SPEAKER rolls her eyes)|You've seen wolfgirls, right?|Ah, whatever, go have fun~ + +### (The SPEAKER nods glumly)|Not a fan?|Shame, I am~ + +### (The SPEAKER grabs you quickly)|Oh, it's very strict~|And great for being trained... + +### (The SPEAKER looks at you deviously)|You're going to wear this RESTRAINT,|if you want to or not~ + +### (The SPEAKER sulks)|Have it your way then. + +### (The SPEAKER adds the RESTRAINT)|(You feel her tighten everything before locking it)|Good girl~ + +### (The SPEAKER pushes you to the ground)|I'll make it extra tight for you~|(The RESTRAINT locks tightly onto you) + +### Maybe a little~ + +### (Nod excitedly) + +### Don't know, don't care. + +### Yes! So much! + +### That looks too strict! + +### I- Well- O-Okay~ + +### (Moan and squirm) + +### I don't want to get stuck! (PERCENT chance to avoid) + +### (Shake your head worriedly) (PERCENT chance to avoid) + + + +### (A SPEAKER gracefully gestures to you)|So good to see a friendly face~|Care to see some elven goods? + +### (The SPEAKER holds up a RESTRAINT)|These are some of our strictest.|Want to try? + +### (The SPEAKER smiles sweetly)|Such a good girl~|(The RESTRAINT locks with a loud click) + +### (The SPEAKER sagely nods)|As you wish~ + +### (The SPEAKER frowns briefly)|I understand~ + +### (The SPEAKER leans closer)|Then you can test their escapability!|(The SPEAKER dives towards you!) + +### (The SPEAKER shifts her weight back)|I'm afraid I must insist.|(She's gripping a RESTRAINT)|(The SPEAKER dives towards you!) + +### (The SPEAKER rolls past harmlessly)|Oh! So fast~ + +### (The SPEAKER snaps the RESTRAINT on)|There, much better.|Now squirm for me cutie~ + +### (The SPEAKER trips you over)|(Before you can move, the RESTRAINT closes firmly)|Strict, isn't it?~ + +### Of course! + +### (Nod happily) + +### No, thanks. + +### Pretty please~ + +### Fine... + +### (Moan and giggle) + +### Stop! (PERCENT chance to avoid) + + + +### (A SPEAKER plays with silvery rope)|Hmm, I need to get better with this.|Can I practice on you? + +### (The SPEAKER grins happily)|Thank you girl~|I'll tie with RESTRAINT then~ + +### (The SPEAKER binds you tightly)|(The rope is tight, and she's clearly an expert.)|Mmm, not too bad~ + +### (The SPEAKER pouts indignantly)|Why say yes then?!|(The SPEAKER walks off grumbling) + +### (The SPEAKER sighs)|Very well then~ + +### (The SPEAKER pouts indignantly)|Oh no, you don't get out that easy.|You said you'd help! + +### (The SPEAKER smirks)|Ooh, a chance to practice against resistance~|I can't pass that up! + +### (The SPEAKER can't keep the knots tight)|(Eventually, she gives up)|S-Stupid human... + +### (The SPEAKER strictly ties you up)|(You can feel she's done this many times)|(She smirks at you as she departs) + +### (The SPEAKER strictly ties you up)|(There's no slack anywhere!)|(She makes a face at you as she leaves) + +### Any time~ + +### I'd rather you didn't. + +### Sounds great! + +### Actually, I don't want that. + +### I'll play along then~ + +### (Struggle against her) (PERCENT chance to avoid) + + + +### (The SPEAKER quickly motions to you)|Hey! Over here!| I got something to show you! + +### (The SPEAKER giggles)|You'll be wearing this~|(A RESTRAINT is in her hands) + +### (The SPEAKER looks surprised)|Oh, uh, sure!|(They quickly add the RESTRAINT) + +### (The SPEAKER grins sneakily)|I thought you might say that~|But- ahh!|(They drop the item and you slip away) + +### (The SPEAKER looks angry)|Hey! HEY! I'm talking to-|Ah, forget it. + +### (The SPEAKER grins sneakily)|I thought you might say that~|But it wasn't a choice... + +### (The SPEAKER follows you)|Not so fast there~|(She blocks your path) + +### (The SPEAKER fumbles with the RESTRAINT)|C-Come on, open-|(You quickly walk away) + +### (The SPEAKER adds the RESTRAINT)|Good luck with that one~|(She sounds like she's gloating...) + +### (The SPEAKER roughly forces you down)|(Pushing your head down, the RESTRAINT slides on)|(The SPEAKER tugs your hair, then walks away) + +### (Walk over, curiously) + +### (Don't approach). + +### (Don't approach) + +### Sure! + +### W-What? No way! + +### (Let her add the restraint) + +### (Moan and nod) + + + +### (The SPEAKER walks over)|You'd make a cute catgirl~|Want help becoming one? + +### (The SPEAKER grins)|Here, I've got this RESTRAINT.|That'll help! + +### (The SPEAKER gleefully comes closer)|(The RESTRAINT fits snugly)|So adorable! + +### (The SPEAKER nods disappointed)|Fair enough~ + +### (The SPEAKER sighs)|Maybe another time~ + +### (The SPEAKER titters)|It's going on, kitty~ + +### (The SPEAKER giggles)|Let's see if you can get away then~|(You see a RESTRAINT in her hand) + +### (The SPEAKER whimpers and drops it)|Owwww!|I hit my knee! + +### (The SPEAKER wiggles happily)|Oh, you're so cute!|Enjoy it~ + +### (The SPEAKER traps you)|(You feel the RESTRAINT being forced on)|Meow~ + +### No, not today. + +### Yay! + +### Not like that! + +### Y-Yes miss~ + +### (Duck out the way) (PERCENT chance to avoid) + + + +### (A SPEAKER winks at you)|You look like a girl who likes feeling|like a prisoner, am I right? + +### (The SPEAKER nods happily)|I knew it! Well, it's your lucky day.|I've got some RESTRAINT for you~ + +### (The SPEAKER spins you around)|(You hear the cold metal click shut)|Nice and submissive~ + +### (The SPEAKER shrugs)|It's not for everyone, I guess~ + +### (The SPEAKER frowns)|Really?|I was so sure... + +### (The SPEAKER grins maliciously)|I like seeing prisoners though~|And you're right here... + +### (The SPEAKER giggles)|I'm gonna make you one anyway~|(You see a RESTRAINT in her hand) + +### (The SPEAKER gulps)|M-Maybe I won't then! + +### (The SPEAKER adds the RESTRAINT)|You're blushing dear~|She doth protest too much? + +### (The SPEAKER giggles as she catches you and slaps on the cuffs)|No so fast, dear~ + +### Maybe a bit~ + +### Not at all. + +### (Wiggle excitedly) + +### Not like that. + +### O-Okay... + +### (Moan and shiver) + +### Don't even try. (PERCENT chance to avoid) + + + +### (A SPEAKER is looking at something)|So comfy... but how?|Hey, you! Come see this! + +### (The SPEAKER holds up a RESTRAINT)|It's so soft, but so strict~|Want to give it a try? + +### (The SPEAKER quickly fastens it on)|(A wave of comfort passes over you)|(The SPEAKER looks on enviously) + +### (The SPEAKER shrugs)|Eh, alright then. + +### (The SPEAKER shrugs)|Up to you. + +### (The SPEAKER frowns)|But it's so comfy!|Here, look, I'll show you... + +### (The SPEAKER approaches)|Hey, see this RESTRAINT?|I'm going to put it on you~ + +### (The SPEAKER looks startled)|Oh! Uh, I guess you're right... + +### (The RESTRAINT is buckled firmly in place)|See? Good, huh?|(You sink into the comforting feeling) + +### (The SPEAKER ignores you)|(The RESTRAINT is buckled firmly in place)|(A wave of comfort passes over you) + +### (Approach) + +### (Keep your distance) + +### Nope. + +### It does look comfortable~ + +### (Squirm and bow your head) + +### It looks too strict! (PERCENT chance to avoid) + + + +### (The SPEAKER brushes past hurriedly)|Careful girl!|Else I'll lock you away~ + +### (The SPEAKER looks at you intrigued)|Aren't you something...|How about wearing this RESTRAINT? + +### (The SPEAKER grins and locks it on)|Maybe I should bump into you more~ + +### (The SPEAKER rolls her eyes)|Run along then girl~ + +### (The SPEAKER nods)|Didn't think so~|Oh, and, uh, sorry for the bump. + +### (The SPEAKER shakes her head)|You don't get off that lightly.|These are going on. + +### (The SPEAKER frowns)|I think I should.|You'll just bother someone else.|(She holds up a RESTRAINT) + +### (The SPEAKER sighs)|I'll let you off then.|Oh, and, uh, sorry for the bump. + +### (The SPEAKER adds the RESTRAINT)|(As she's locking it, she giggles)|You're really cute actually~ + +### (The SPEAKER stumbles and grimaces)|Ugh! Fine, you can go then.|D-Didn't want to see you tied anyway... + +### That doesn't sound bad... + +### (Giggle into your gag) + +### That won't be necessary. + +### I'd love to! + +### M-Maybe you should then~ + +### You ran into me! (PERCENT chance to avoid) + + + +### (A SPEAKER gives you a small curtsy)|Good day.|Care to try part of our uniform? + +### (The SPEAKER looks content)|We can offer you this RESTRAINT.|It's a snug fit... + +### (The SPEAKER buckles it strictly)|All maids wear this at sometime.|You'd fit right in! + +### (The SPEAKER frowns for a second)|Ah, I see.|As you were then. + +### (The SPEAKER nods)|We hope to see you again nonetheless. + +### (The SPEAKER glares)|We urge you to reconsider. + +### (The SPEAKER has a twinkle in her eye)|We will offer you this RESTRAINT.|You should accept. + +### (The SPEAKER pulls an odd smile)|Very well. + +### (The SPEAKER smugly nods)|(With surprising speed, the RESTRAINT locks in place)|Excellent, a good fit. + +### (The SPEAKER covers your mouth with her hand)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly) + +### No, thank you. + +### I accept~ + +### I-I accept... + +### (Moan and nod slowly) + +### No way! (PERCENT chance to avoid) + + + +### (The SPEAKER looks at you inquisitively)|(Wordlessly, they motion at your body)|(They seem to be asking about restraints) + +### (The SPEAKER nods understandingly)|(RESTRAINT appears in their hand)|(They tilt their head at you) + +### (The SPEAKER spins around you)|(You feel the oddly cold restraint lock in place)|(The SPEAKER nods and moves away) + +### (The SPEAKER stares at you)|(They put away the RESTRAINT and leave) + +### (The SPEAKER leaves you alone) + +### (The SPEAKER seems to frown)|(RESTRAINT appears in their hand)|(They rapidly approach) + +### (The SPEAKER tilts their head)|(RESTRAINT appears in their hand)|(They come closer) + +### (The SPEAKER holds you in place)|(You hear the oddly cold material locking)|(They nod at you) + +### (The SPEAKER firmly grabs you)|(The RESTRAINT locks onto your body tightly)|(The oddly cold material makes you shiver) + +### Y-Yes? + +### (Nod back) + +### No thank you. + +### (Smile and prepare yourself) + +### (Nod and prepare yourself) + +### No, not that. + +### W-Whoa! S-Sure... + + + +### (A SPEAKER giggles and calls to you)|Hey there~|Fancy seeing some nature?~ + +### (The SPEAKER motions with her hands)|(Vines rise from the floor and twirl)|These will bind you nicely... + +### (The SPEAKER grins and motions again)|(The plants wrap around you quickly)|(You wriggle against the RESTRAINT) + +### (The SPEAKER pouts)|Aww... + +### (The SPEAKER frowns)|Not even a little? + +### (The SPEAKER smirks)|That wasn't a question~ + +### (The SPEAKER giggles again)|(Vines begin to move around your feet)|Hold still dear~ + +### (The SPEAKER sighs and nods)|(The vines retreat from you)|Fiiine, you can go~ + +### (The vines move much faster)|(You feel the RESTRAINT as you squirm)|A gift, from me~ + +### (The SPEAKER giggles loudly)|(The vines catch up and pin you down)|(When they let go, you're left with a RESTRAINT) + +### Always! + +### That sounds exciting! + +### Wait, not like this! + +### W-Well- o-okay... + +### Don't! (PERCENT chance to avoid) + +### (Shake your head) (PERCENT chance to avoid) + + + +### (A SPEAKER approaches)|Nothing quite beats a strong metal|chain, right? + +### (The SPEAKER nods happily)|Exactly!|Want one for yourself? + +### (The SPEAKER wraps a long chain around you)|This should do the trick~|(RESTRAINT settles in place) + +### (The SPEAKER sighs)|Ah well. + +### (The SPEAKER frowns sadly)|But they make the best noise! + +### (The SPEAKER rolls her eyes)|Tough luck then~|You're getting one! + +### (The SPEAKER grins)|See how you feel when|you're wearing one! + +### (The SPEAKER sighs)|Maybe another time then. + +### (The SPEAKER wraps a long chain around you)|(RESTRAINT hugs your body closely)|(You shiver as the cold metal touches you) + +### (The SPEAKER grins as she binds your body)|(RESTRAINT digs into you a little)|Enjoy, cutie~ + +### I love chains! + +### Plenty beats it. + +### Absolutely~ + +### I-If I have to... + +### Ah! Cold! (PERCENT chance to avoid) + + + +### (The SPEAKER nervously walks up to you)|Excuse me miss...|Are you a fan of latex by chance? + +### (The SPEAKER blushes deeply)|Then would you like to try on this RESTRAINT? + +### (The SPEAKER smiles)|You look so good in that! + +### (The SPEAKER frowns)|Aww... + +### (The SPEAKER blushes)|Okay... sorry I asked. + +### (The SPEAKER grins and reaches for a RESTRAINT)|Well, too bad-- + +### (The SPEAKER grins)|I wasn't offering you a choice...|I was asking if you would LIKE it, hehe~ + +### (The SPEAKER frowns)|...You're fast! + +### (The SPEAKER smiles)|That's right~ + +### (The SPEAKER restrains you and clicks a lock on)|There! Nice and tight! + +### Why of course! + +### That sounds fun! + +### No, I don't want that! + +### Okay, fine... + +### Wait, what? (PERCENT chance to avoid) + + + +### (The SPEAKER steps up to you)|Hey girl~|You happen to be a fan of latex? + +### (The SPEAKER smiles)|Then would you like to try on this RESTRAINT? + +### (The SPEAKER chuckles)|Tight and shiny! + +### (The SPEAKER shrugs)|Alright. Sorry I asked. + + + + + +### (The SPEAKER walks up to you)|Say, would you be interested in some 'protection?' + +### (The SPEAKER grins)|Wonderful! You see, I've just recently acquired one of these...|(She shows you a loose RESTRAINT)|I'm not too interested in wearing one myself,|but I thought you'd be a good fit for it? + +### (The SPEAKER blushes as she locks the belt around your waist)|I'm enjoying this more than I thought I would~ + +### (The SPEAKER smiles)|Enjoy your freedom while it lasts~ + +### (The SPEAKER shrugs)|That's okay, just thought I'd ask. + +### (The SPEAKER rubs the smooth metal seductively)|Are you sure?|Adventurers need to take care of themselves.|You don't want to lose control of yourself and run into some curse,|do you? + +### (The SPEAKER gives an evil smile)|What if I wasn't asking? + +### (The SPEAKER sighs)|I'll find some other cutie to wear it, I guess~ + +### (The SPEAKER blushes as she locks the RESTRAINT onto you)|There we go~ + +### (As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Whoops! I guess I acted too soon.|Ah well~ + +### (The lock on the RESTRAINT starts glowing...) + +### Protection? Certainly! + +### Nah, I'm good. + +### I would love to wear it! + +### (Nod again, excited) + +### ...No thank you. + +### (Shake your head, puzzled) + +### Fine. I need the protection anyway. + +### I refuse. (PERCENT chance to avoid) + +### (Look at your belt...) + + + +### (The SPEAKER nervously walks up to you)|Excuse me miss...|Can you help me out? + +### (The SPEAKER blushes deeply)|I found this cursed RESTRAINT and I can't let go of it!|Could you... wear it for me? + +### (The SPEAKER smiles)|Thank you so much, miss! + +### (The SPEAKER frowns)|...That does seem rather far-fetched of me to ask. + +### (The SPEAKER blushes)|Oh... okay. + +### (The SPEAKER frowns angrily)|Look, we all know how much you enjoy being restrained~|Do me a favor and wear the RESTRAINT, okay? + +### (The SPEAKER pleads with you)|...point taken. But still!|I'll end up stuck in it for a really long time... + +### (The SPEAKER sighs and wears it herself)|(The lock starts glowing brightly...) + +### (The SPEAKER looks relieved)|Thank you so much miss!|I won't forget you! + +### (As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|I'm sorry miss! It was my only choice~ + +### I would love to help! + +### You're asking me to get cursed? + +### That sounds like a tempting offer. + +### ...What? Why would I need to wear it? + +### Fine. I'll do it because you asked. + +### I won't help you. Wear it yourself. (PERCENT chance to avoid) + + + + + +### (The SPEAKER walks up to you)|We don't get a lot of visitors.|I take it that you enjoy bondage? + +### (The SPEAKER tilts her head)|Well, I have a RESTRAINT lying around,|and I figured you'd enjoy it. + +### (The SPEAKER smiles)|I'm glad you like it! + +### (The SPEAKER frowns)|I guess I'll have to find someone else to wear it. + +### (The SPEAKER looks disappointed)|Oh well. + +### (The SPEAKER grins and reaches toward you!)|Well, I think it'd look great on you! + +### (The SPEAKER grins)|You don't have a choice, dear~ + +### (The SPEAKER frowns)|Darn it! Missed my chance. + +### (The SPEAKER smiles)|Good, good~ + + + + + + + +### (The SPEAKER grins as she sees you)|Hey there sweetie~|I think you'd look good in some ropes! + +### (The SPEAKER looks at your bound body)|I've got some more ropes for you, babe! + +### (The SPEAKER smiles)|Okay, hold still while I get you rigged up~ + +### (The SPEAKER slaps your butt as she ties the last knot)|All trussed up~ + +### (The SPEAKER looks disappointed and packs her rope away) + +### (The SPEAKER frowns)|Aw. What a missed opportunity! + +### (The SPEAKER grins and reaches for her satchel)|Well, too bad-- + +### (The SPEAKER grins)|But I've already brought so much rope with me~ + +### (The SPEAKER frowns)|Suit yourself. + +### (The SPEAKER smiles)|Good girl~ + +### (The SPEAKER takes you down and trusses you up tightly)|That'll teach you~ + +### I think so too! + +### I don't think so. + +### (Wiggle in place happily) + +### Actually, I'm having second thoughts... + +### (Shake your head nervously) + +### Fine. You win. + +### Go away! (PERCENT chance to avoid) + + + +### (The SPEAKER perks her ears as she sees you)|You've got a nice body.|I think it'll do better with some training! + +### (The SPEAKER grins and hands you a paper)|Nevermere Training is always looking for new recruits!|I'll just have you sign here... + +### (The SPEAKER gets you suited up)|There you go! Now go be a good girl! + +### (The SPEAKER scoffs)|That's what they all say. + +### (The SPEAKER frowns)|What a shame. + +### (The SPEAKER grins and reaches for her baton)|No? Well, I heard you have some debts to pay~ + +### (The SPEAKER grins)|I promise you it's a good deal~ + +### (The SPEAKER frowns)|Fine. I'll look for other candidates. + +### (The SPEAKER smiles)|That's right. Your name, please? + +### (The SPEAKER zaps you and places you in restrictive gear)|Hmph. Unruly girls need training! + +### This sounds like an interesting opportunity. + +### No thanks, I know what that entails... + +### I'll sign it! + +### A contract? No way. + +### (Refuse the contract) + +### Fine. I'll sign it... + +### Never! (PERCENT chance to avoid) + +### (Shake your head and frown) (PERCENT chance to avoid) + + + +### (The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... + +### (The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... + +### (The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. + +### (The SPEAKER tilts her head and shrugs)|We are always prepared... + +### (The SPEAKER nods)|Fair enough. + +### (The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... + +### (The SPEAKER nods proudly)|We are willing to made some changes to our records~ + +### (The SPEAKER frowns)|You won't know what hit you. + +### (The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. + +### (The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... + + + +### Gladly! + +### W-where did you get that uniform? (Refuse) + + + + + + + + + + + +### (The SPEAKER perks her ears as she sees you)|Glory to the blessed kitty!|Are you prepared to join us? + +### (The SPEAKER nods happily)|Fantastic! You just need to agree to be nice to cats.|And also we own you now. + +### (The SPEAKER jumps happily)|Wonderful! Here's your collar! + +### (The SPEAKER whimpers and looks at you)|How mean! + +### (The SPEAKER's ears flop)|Aww... we thought you were cute. + +### (The SPEAKER frowns)|Oh? Well, I guess I'll tell the others~ + +### (The SPEAKER grins slyly)|You wouldn't hurt the kitties, would you? + +### (The SPEAKER frowns)|Then we'll have to make sure you don't come to harm anyone! + +### (The SPEAKER smiles proudly)|I knew you would pull through! + +### Yes! I love the blessed kity! + +### No, you guys are a bunch of weirdos. + +### Yes! I will be nice to the kitties! + +### (Join them) + +### Wait, I didn't agree to that! (Refuse) + +### (Refuse) + +### Okay fine... I won't hurt the kitties. (Join them) + + + + + + + +### (The SPEAKER does a curtsy)|Why hello there!|You have a wonderful bod-er, book!|Would you like to help me? + +### (The SPEAKER smiles briefly)|You have an opportunity to model for me!|I need someone to wear all of my wonderful inventions! + +### (The SPEAKER laces you up in the tight fabric...)|(You hear the click of a few locks going on...)|Oh my goodness... So pretty!|You'll make a fine assistant! + +### (The SPEAKER frowns)|Aw... + +### (The SPEAKER clenches her fist to the ceiling)|Nooooo!!! + +### (The SPEAKER grins and pulls out a frilly dress)|Don't knock it till you try it!|Trust me, it'll be fun! + +### (The SPEAKER furrows her brow)|Watch your tongue there, little lady.|Or I'll have to plug it for you... + +### (The SPEAKER folds her arms as ribbons rise up around her)|Suit yourself, hehe~ + +### (The SPEAKER smiles)|Yes! Yes! Wonderful! + + + +### Sign me up! + +### (Accept the position) + +### And wear tacky clothes all the time? + +### (Refuse the position) + +### Fine... sign me up. + +### Why don't you try it on yourself! (PERCENT chance to avoid) + + + + + + + +### (The SPEAKER runs up to you)|Wow! You make a fine specimen-er, I mean...|Nice to meet you! + +### (The SPEAKER smiles)|Now, I have something wonderful in store for you.|(She takes out a blue catsuit)|I'd like you to be my assistant! + +### (The SPEAKER looks excited)|Awesome! Let me help you get in uniform... + +### (The SPEAKER shrugs)|It was worth a shot... + +### (The SPEAKER looks frustrated)|I'm not... my work is not crazy!|There's just... a lot to do.|That's why I need an assistant. + +### (The SPEAKER looks frustrated)|I'm not... my work is not crazy!|We seek only knowledge! + +### (The SPEAKER frowns)|Time for a test run! + +### (The SPEAKER looks happy again)|Thank you! I'm super grateful! + +### (The SPEAKER tilts her head)|Fine then. You win.|(As you leave, you hear a 'just kidding' as she breaks a glass vial)|(A suit of blue latex envelops you!) + +### ...Hello? + +### You guys are crazy. + +### (Accept the offer) + +### (Refuse the offer) + +### Fine. I'll be your assistant. + +### Go find someone else. (PERCENT chance to avoid) + + + + + + + +### (The SPEAKER greets you)|Normally we don't meddle in mortal affairs.|But you, Outsider, are different.|Let's have a conversation. + +### (The SPEAKER smiles warmly)|Outsiders have a lower rank in our society.|But it is a rank all the same.|You will be above your mortal peers.|What do you say? + +### (The SPEAKER clasps some 'jewelry' around your limbs)|You look beautiful, my dear.|I will leave you to your own affairs until we meet again. + +### (The SPEAKER turns her head away)|Hmph. I offer you a bargain and you refuse. + +### (The SPEAKER turns her head away)|Hmph. As expected. + +### (The SPEAKER folds her arms)|If you are not with us, then you are against us.|You shall face the wrath of the wild. + +### (The SPEAKER frowns)|Hardly slavery!|A mere slave would not be allowed to even set foot in our society. + +### (The SPEAKER frowns)|We will meet again. + +### (The SPEAKER nods and smiles)|(She decorates your body with 'jewelry')|I am glad you had a change of heart. + +### (The SPEAKER scoffs)|(Her magic suddenly binds you tightly in glowing ropes)|Amateur. + +### I'm interested. (Talk with her) + +### I accept your gracious offer! + +### (Accept) + +### I won't be a slave to you. + +### Fine, fine... I will accept. + +### No way. (PERCENT chance to avoid) + + + + + +### (The SPEAKER smiles at you)|Mortal. + +### (The SPEAKER points to the ground)|Kneel before me and accept your collar. + +### (The SPEAKER snaps her fingers)|(A collar of cold black metal materializes around your neck)|A girl who knows her place! Wonderful... + +### (The SPEAKER scoffs)|Hmmph. Mortals... + +### (The SPEAKER folds her arms)|Well, look who doesn't know her place~ + +### (The SPEAKER folds her arms)|I didn't offer you a choice in the matter.|You're mine, I've decided that. + +### (The SPEAKER's eyes begin to glow)|Looks like we'll do this the fun way! + +### (The SPEAKER smiles)|Wonderful~|Now come along, my pet! + +### (The SPEAKER scoffs and snaps her fingers)|(Metallic restraints come at you from all angles and snap in place tightly)|(A gag forces itself into your mouth)|Now then, what were we saying? + +### Yes? + +### I don't talk to monsters! + +### O-okay. (Kneel) + +### (Kneel) + +### I refuse! + +### Then it looks like I have no choice. (Join her) + +### I will never bow to you! (PERCENT chance to avoid) + + + + + + + +### (The SPEAKER waves)|You seem like an exceptional individual.|What do you think of joining the Guild? + +### (The SPEAKER smiles)|Excellent! I'll put in a word with the Guild.|Do note: this will affect your reputation with certain bad actors. + +### (The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. + +### (The SPEAKER nods)|Fair enough. Guild work is not for everyone. + +### (The SPEAKER nods)|Very well, then I won't bother you. + +### (The SPEAKER looks dubious)|You know, there's quite a bounty on your head.|I'm sure we could do something about it. + +### (The SPEAKER tilts her head)|Haha, very funny.|We both know that you're not one of those... right? + +### (The SPEAKER frowns and readies for battle)|My instincts were right. + +### (The SPEAKER suddenly strikes you to the floor)|(You feel a foot on your back as she ties you in a strict rope hogtie...)|(She dusts off her hands)|We'll have a talk when you get out of that, okay? + +### I have no interest in joining the guild. + +### What if I am one of those bad actors? (Refuse) + +### Fine... (Join) + +### Go away. (PERCENT chance to avoid) + +### (Frown at her) (PERCENT chance to avoid) + + + + + + + +### (The SPEAKER beeps)|Prisoner 74121 identified.|Subject not registered in database. + +### (The SPEAKER beeps)|Confirming database entry.|Say 'I will be a good girl' to enter database. + +### (The SPEAKER beeps and applies tracking gear)|(The metallic cables click into place with a soft beep)|Prisoner 74121 registered. Good girl. + +### (The SPEAKER beeps)|Acknowledged. Be warned:|Lost contact with Sections 98, 97, 96, 95...|(The list goes on...) + +### (The SPEAKER beeps)|Acknowledged. Updating records. + +### (The SPEAKER beeps and flashes its lights)|Target acquired. + +### (The SPEAKER beeps and flashes its lights)|Target has complied. Supplying uniform. + +### (The SPEAKER beeps and flashes its lights)|Engaging capture protocol. + +### (The SPEAKER beeps and flashes its lights)| + +### (The SPEAKER blasts you with a stunning ray and captures you)|Target neutralized. + +### Please register me. + +### (Stop to talk to the robot) + +### Prisoner 74121? You must be mistaken... + +### (Avoid the robot) + +### Prisoner 74121 reporting. I will be a good girl. + +### Actually, I am an administrator. (Refuse) + +### I'm sorry, I will be a good girl! + +### What? (PERCENT chance to avoid) + + + + + + + +### (The SPEAKER smiles)|I used to be an adventurer like you.|Then I joined up with the Dragonhearts! + +### (The SPEAKER clears her throat)|Well, we're actually recruiting!|You're free to join us if you agree to fight for justice! + +### (The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! + +### (The SPEAKER tilts her head and shrugs)|Ah well. + +### (The SPEAKER frowns)|What is it?|You're not an enemy of justice, are you? + +### (The SPEAKER frowns)|...If you won't fight for justice, that makes you an enemy of justice. + +### (The SPEAKER frowns and cracks her knuckles)|Looks like my suspicions were right!|Looks like you and I are going to have a little chat... + +### (The SPEAKER giggles)|Hehe, just messin' with ya.|Anyway, welcome to the sisterhood! + +### (The SPEAKER grabs you and ties you up)|You won't be making trouble like that any time soon. + +### I wish I could join you. + +### Please go away. + +### (Back away) + +### Great! Sign me up! + +### (Join) + +### Fight for justice? Sounds restrictive... + +### Actually, justice doesn't sound bad! + +### What are you going to do about it? (PERCENT chance to avoid) + + + + + +### (The SPEAKER waves and calls you over)|Looks like you've made a name for yourself.|What do you say to a little agreement? + +### (The SPEAKER clears her throat)|Well, you're currently on our turf.|But we're willing to cut you some slack.|You just have to agree not to attack any of us. + +### (The SPEAKER frowns)|Criminals? Girl, we ARE the law around these parts~ + +### (The SPEAKER grins)|I like your spunk, girl.|But you're kidding, right? + +### (The SPEAKER raises her fists and smiles)|You're on! + +### (The SPEAKER chuckles)|Here's a toast to a new partnership! + +### (The SPEAKER catches you and trusses you up)|Maybe we'll just have to find you an owner, then!|Hehe. + +### I'm all ears. + +### (Listen closely) + +### I don't deal with criminals. + +### It's a deal! + +### (Mumble in agreement) + +### You don't understand. This is MY turf. + +### (Scoff at her through your gag) + +### Haha, just kidding. I'm with you. + +### Put 'em up! (PERCENT chance to avoid) + + + + + + + + + + + +### (The SPEAKER stops walking and speaks)|You there!|It seems your attunement with magic is high.|Join us. + +### (The SPEAKER nods calmly)|We will use some special equipment to increase your attunement.|Put these on. + +### (The 'equipment' locks in place)|Excellent. Soon you will be much more powerful. + +### (The SPEAKER stops talking and walks away.) + +### (The SPEAKER walks away like nothing happened.) + +### (The SPEAKER frowns slightly)|We are prepared to use force if need be... + +### (The SPEAKER stares at you)|Why? Did you not say you wanted to join us? + +### (The SPEAKER frowns)|We have failed to convince the human. + +### (The SPEAKER nods.)|You have made a wise decision. + +### (The SPEAKER uses magic to force you.)|There. Try not to succumb to your desires too much. + +### Um... sure? + +### Get away from me! + +### Shiny... (Put them on) + +### (Let her put them on you) + +### What? No way! (Refuse) + +### Okay, I will wear them... + +### Monster! (PERCENT chance to avoid) + + + +### (The SPEAKER does a short bow as she sees you)|Um... hi!|I have a letter for you... + +### (The letter is a contract from the College)|(They want you to sign up as an instructor for apprentices)|(The SPEAKER looks at you nervously.) + +### (The SPEAKER sighs in relief)|That's good...|(You sign the contract and it vanishes into the aether) + +### (The SPEAKER whimpers)|What will I tell them... + +### (The SPEAKER glares at you)|It's an important message concerning your standing!|With the College! + +### (The SPEAKER blushes)|Well...|I was told we would make changes to your academic record,|should you refuse... + +### (The SPEAKER frowns)|They told me to make sure you sign...|by any means necessary! + +### (The SPEAKER nods and smiles)|Thank you so much!|I don't know what I would have done if you said no... + +### (The SPEAKER frowns and waves her wand)|(A bunch of ropes come out of the ground and restrain you)|Hmmph. I'll tell them you signed it anyway.|I can't go back empty handed. + +### Thank you for delivering it. (Read it) + +### (Read the letter) + +### There's nothing good inside that letter. + +### Great! Wonderful! + +### There is no way I'd accept. + +### Fine. I'll read it. (Join the College as an instructor) + +### This is unethical! I refuse! (PERCENT chance to avoid) + + + + + + + + + + + + + +### (The SPEAKER waves)|Greetings,|I manufacture all sorts of weapons.|Would you like to buy some? + +### (The SPEAKER drops her hammer and cracks her knuckles)|Put em up! + +### (The SPEAKER looks at you.)|But you already have one? + +### (The SPEAKER folds her arms)|I don't do charity, ma'am. + +### (The SPEAKER smirks)|Another adventurer found this lying around.|I wonder who it's for~ + +### (The SPEAKER smiles)|Now don't be up to no good~|Or else I'll have to put you in cuffs... + +### (The SPEAKER nods)|A versatile weapon. One of my favorites. + +### (The SPEAKER nods)|Keep your friends close, and your enemies far away. + +### (The SPEAKER nods)|Handy to have one of these around. + +### (The SPEAKER nods)|The best defense is a good offense. + +### (The SPEAKER nods)|Speak softly and carry a big hammer. + +### (The SPEAKER smiles)|Can never be too prepared~ + +### (The SPEAKER waves)|Hi.|I make armor. Only the finest.|I don't sell it cheap, unlike my twin. + +### (The SPEAKER looks at you.)|Do you have a dealer's license? + +### (The SPEAKER folds her arms)|I don't do charity, girl. + +### (The SPEAKER nods)|The most high-impact of sports bras. + +### (The SPEAKER nods)|These aren't for hiking, just so you know. + +### (The SPEAKER nods)|I've been thinking about making a lockable version... + +### (The SPEAKER nods)|These are sensibly sized, unlike those you see in movies. + +### (The SPEAKER nods)|Sometimes you just have to be flexible. + +### (The SPEAKER nods)|For when you value style over protection... + +### (The SPEAKER nods)|You can never be too careful. + +### (The SPEAKER chuckles)|I hear female adventurers like to wear these for protection.|Or something like that. + +### (The SPEAKER waves)|Hello miss!|What brings you here today? + +### (The SPEAKER folds her arms)|That's not very nice! + +### (The SPEAKER looks at you and smiles.)|Don't you already have one? + +### (The SPEAKER folds her arms)|I don't do charity, miss. + +### (The SPEAKER nods)|Could use a higher heel... + +### (The SPEAKER nods)|Back to the basics. + +### (The SPEAKER smiles)|I see you have good taste! + +### (The SPEAKER nods)|It's a classic!|What's not to like? + +### (The SPEAKER smiles)|It's an upgrade for your best friend! + +### (The SPEAKER shrugs)|It's big and bulky, but I guess it has its uses. + +### (The SPEAKER giggles)|Smile for the camera! + +### (The SPEAKER nods)|It's like mana, but much more portable!|It powers duplication runes so you don't run out of arrows. + +### (The SPEAKER giggles)|I like to include these as a gift with every purchase~ + +### (The SPEAKER whispers in a hushed tone)|Welcome.|I'm not supposed to be here, so|if you don't want to do business, get out.|I only sell in packs of 10, by the way. + +### (The SPEAKER tries to get away)|Damn! + +### (The SPEAKER looks you over and shrugs)|Don't joke around. + +### (The SPEAKER folds her arms)|Don't have money? Better go find some. + +### (The SPEAKER produces a bag of stuffings)|Quite the staple. + +### (The SPEAKER produces a bundle of rope)|Aren't you quite the artist.|That was rhetorical. + +### (The SPEAKER produces some bondage tape)|It only sticks to itself, doesn't leave residue.|Gotta be responsible, you know? + +### (The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally... + +### (The SPEAKER produces a bag of cloth strips)|How tight you tie it depends on how bratty your target is. + + + +### (The SPEAKER rattles as she waves)|Heya!|Looking to buy some ancient treasures?|My antiques shop has just what you need! + +### (The SPEAKER cracks her exposed knuckles)|So you've seen through my disguise... + +### (The SPEAKER looks at you.)|Yours is just fine, dear. + +### (The SPEAKER chuckles)|You don't have enough gold for that, dear.|Try coming back after a good round of looting! + +### (The SPEAKER nods)|My great grandmother used to wear these. + +### (The SPEAKER nods)|Adventurers used to love a good burlap sack.|Nowadays they've got that newfangled magic instead... + +### (The SPEAKER nods)|Back in my day, they used candles for light!|These let you put them out to save wax. + +### (The SPEAKER giggles)|I had all sorts of use for this back on the farm. + +### (Select an item to buy from the SPEAKER) + +### (Attack the SPEAKER?) + +### (Buy ITM# for IC# gp) (Owned: AMNT#) + +### (The SPEAKER sells you the item) + +### (The SPEAKER shakes her head)|I think you'd be better off without that~ + +### (The SPEAKER looks embarassed)|I can't sell you that, miss... + +### (The SPEAKER blushes)|Actually, I was saving that for myself... + +### (The SPEAKER grins)|Good girls don't need one of those~ + +### (The SPEAKER buzzes)|Error, insufficient access privileges. + +### (The SPEAKER giggles at your empty pockets)|You can't afford such things, silly~ + +### (The SPEAKER pauses nervously)|Um miss, I don't think you can afford that... + +### (The SPEAKER frowns)|What does this look like, a charity? + +### (The SPEAKER smules)|You'll have to secure that by other means, I think~ + +### (The SPEAKER beeps)|Insufficient currency. + +### (Look at what she wants to buy) + +### You're giving me everything you have. + +### (Flail threateningly at her) + +### (Do it) + +### (Back off) + +### (The SPEAKER approaches you with an offer)|Greetings! I am the potion seller.|I buy and sell only the strongest potions!| + +### (The SPEAKER doesn't look surprised)|Okay, just let me set these down real quick... + +### (The SPEAKER smiles)|A spellcaster will have great use for this! + +### (The SPEAKER smiles)|Wow! That's a lot of mana!|It requires a skilled mage to tap into, though... + +### (The SPEAKER smiles)|It fills me with... determination. + +### (The SPEAKER smiles)|Refreshing! + +### (The SPEAKER smiles)|They say a bitter tea cures all ails... + +### (The SPEAKER smiles)|An empty flask?|...Oh. + +### (The SPEAKER approaches you)|My greetings, Outsider!|My throat is parched and I seek the bounties of nature.|Do you have what I seek? + +### (The SPEAKER doesn't look surprised)|Then let us have a battle of wits! + +### (The SPEAKER thanks you)|A kind offering! You have my thanks. + +### (The SPEAKER thanks you)|A magnificent offering! You have my thanks. + +### (The SPEAKER tilts her head)|...where did you get this? + +### (The SPEAKER thanks you)|A fine trinket!|I will enjoy meditating upon it. + +### (The SPEAKER thanks you)|I sense its flowing essence.|You have my thanks. + +### (The SPEAKER thanks you)|I can feel a great sadness emanating from it.|It calls for warmth. + + + +### (The SPEAKER munches on a donut)|Gee I'm starving!|You wouldn't have something to eat, would you? + +### (The SPEAKER throws a donut in your face)|Ha! Take that! + +### (The SPEAKER smiles)|Yum! Thank you! + +### (The SPEAKER smiles)|Crunchy! My favorite! + +### (The SPEAKER tilts her head)|It smells funny...|Still, it'd be a shame for it to go to waste! + +### (The SPEAKER approaches you with an offer)|Hello!|I am searching for magical scrolls.|Would you happen to have any? + +### (The SPEAKER doesn't look surprised)|Rude! + +### (The SPEAKER smiles)|Thank you! + +### (The SPEAKER raises a brow)|Thank you! This one is rare! + +### (The SPEAKER invites you to a friendly chat)|Back in my day I used to go visit dungeons all the time|But these days I get so lost in my studies...|Say, you don't happen to have some magic supplies on you? + +### (The SPEAKER shrugs)|I guess that's how it is. + +### (The SPEAKER smiles)|Always nice to have some of these! + +### (The SPEAKER smiles)|I can never get enough of these. + +### (The SPEAKER smiles)|Elemental magic, interesting stuff. + +### (The SPEAKER tilts her head)|Why is it wet? + +### (The SPEAKER smiles)|Gladly, this will be useful to my studies. + +### (The SPEAKER smiles)|My legs don't carry me like they used to~ + +### (The SPEAKER smiles)|Always good to have somebody to talk to. + +### (The SPEAKER giggles)|Living dangerously, I see~ + +### (The SPEAKER approaches you with an offer)|Hey girl~|You seem like the explorer type.|Happen to have any good finds? + +### (The SPEAKER frowns)|Well then. + +### (The SPEAKER grins)|Are you willing to part with this? + +### (The SPEAKER smiles)|Aha!|Fantastic. + +### (The SPEAKER frowns)|I'll take it, I guess... + +### (The SPEAKER smiles)|Oooh~!|I love technology! + +### (The SPEAKER nods)|A rare find! + + + +### (The SPEAKER surprises you)|Greetings, traveler.|I am looking for tools to aid in my mission. + +### (The SPEAKER doesn't look surprised)|That's how it is, then. + +### (The SPEAKER bows)|Always be prepared. + +### (The SPEAKER bows)|Always be extra prepared. + +### (The SPEAKER bows)|A bit dangerous, but I'll take it. + +### (The SPEAKER bows)|A tool of the trade. + +### (The SPEAKER bows)|A most valuable find. + +### (The SPEAKER tilts her shades)|I like to think of myself as a dealer in quality tools. + +### (The SPEAKER reaches for her hip)|I'd think twice if I were you... + +### (The SPEAKER smiles)|Nevermere keeps a tight grip on their blueprints.|Thank you. + +### (The SPEAKER smiles)|There's always a buyer.|That's just the way things are. + +### (The SPEAKER smiles)|Portable. Sustainable. A smart choice. + +### (The SPEAKER smiles)|That's what I'm talking about. + +### (The SPEAKER nods)|Yeah... that'll do. + +### (The SPEAKER looks somewhat crazed)|I'm looking for some heavy ordnance in order to...|...add to my collection.|Anyway, got any bombs? + +### (The SPEAKER reaches for her backpack)|I'll blow you away! + +### (The SPEAKER shrugs)|Cute fireworks, I suppose... + +### (The SPEAKER giggles)|That's what I'm talking about! + +### (The SPEAKER rubs her hands together)|Excellent... + +### (The SPEAKER smiles)|Yes! I can make more bombs! + +### (The SPEAKER takes a whiff of her cigar)|Hey friend. Im in the market for some 'tools,'|...if you catch my frift. + +### (The SPEAKER pulls out a knife)|Thought so. You won't take me that easily! + +### (The SPEAKER nods)|Could help out in a bind. + +### (The SPEAKER chuckles)|Lights out, eh... + +### (The SPEAKER nods)|I could use one of these! + +### (The SPEAKER smiles)|For when things go south... + +### (The SPEAKER smiles)|You can never be too safe. + +### (A distracted SPEAKER munches on a cookie) + +### (The SPEAKER continues eating her snack) + +### (The SPEAKER plucks the cookie out of your hand)|My favorite! + +### (The SPEAKER eats the brownies slowly, savoring every bite)|Kind of dense, but really good! + +### (The SPEAKER takes a bite out of the donut)|A bit heavy on the sprinkles... + +### (The SPEAKER blushes)|This is... my new favorite. + +### (The SPEAKER's eyes widen as she wolfs down the golden cookie)|Truly divine... + + + +### (The SPEAKER is reading a kinky fashion magazine)|Why hello gorgeous~|You seem like you know your way around fashion.|Say, I've been on the hunt for unique designs... + +### (The SPEAKER pouts)|I don't like your attitude. + +### (The SPEAKER smiles)|Classic vintage!|I approve~ + +### (The SPEAKER giggles)|A girls best friend, eh? + +### (The SPEAKER gasps)|What an amazing find!!! + +### (The SPEAKER runs up to you)|Hello!|You wouldn't happen to have seen any ghosts lately?|I'm gathering evidence! + +### (The SPEAKER gasps)|You wouldn't! + +### (The SPEAKER shakes your hand)|Ah! Ghosts love these! + +### (The SPEAKER smiles)|This looks like strong evidence for my investigation! + +### (The SPEAKER grins)|Woah! That's so cool! + +### (Look at what she has to sell) + +### (Sell Item0 for ItemCost0 gp) (Owned: AMNT0) + +### (Sell Item1 for ItemCost1 gp) (Owned: AMNT1) + +### (Sell Item2 for ItemCost2 gp) (Owned: AMNT2) + +### (Sell Item3 for ItemCost3 gp) (Owned: AMNT3) + +### (Sell Item4 for ItemCost4 gp) (Owned: AMNT4) + +### (Sell Item5 for ItemCost5 gp) (Owned: AMNT5) + +### (Sell Item6 for ItemCost6 gp) (Owned: AMNT6) + +### (Sell Item7 for ItemCost7 gp) (Owned: AMNT7) + +### (Sell Item8 for ItemCost8 gp) (Owned: AMNT8) + +### (Sell Item9 for ItemCost9 gp) (Owned: AMNT9) + +### (Buy Item0 for ItemCost0 gp) (Owned: AMNT0) + +### (Buy Item1 for ItemCost1 gp) (Owned: AMNT1) + +### (Buy Item2 for ItemCost2 gp) (Owned: AMNT2) + +### (Buy Item3 for ItemCost3 gp) (Owned: AMNT3) + +### (Buy Item4 for ItemCost4 gp) (Owned: AMNT4) + +### (Buy Item5 for ItemCost5 gp) (Owned: AMNT5) + +### (Buy Item6 for ItemCost6 gp) (Owned: AMNT6) + +### (Buy Item7 for ItemCost7 gp) (Owned: AMNT7) + +### (Buy Item8 for ItemCost8 gp) (Owned: AMNT8) + +### (Buy Item9 for ItemCost9 gp) (Owned: AMNT9) + +### (The SPEAKER appears in a flash of light)|I come in the name of the Goddess.|I presume you need my aid?|(She will remain and help you with restraints for 50 turns) + +### (The SPEAKER gives you two knives)|Don't hurt yourself with these, okay? + +### (The SPEAKER gives you three picks)|I don't know how you plan to use these... + +### (The SPEAKER reluctantly gives you a magic key)|Okay, but remember that these are rare and valuable. + +### (The SPEAKER looks impressed with your predicament)|No angel can remove these without a divine blessing.|Perhaps you should apply for one? *snickers* + +### (The SPEAKER looks impressed with your predicament)|I won't get between you and your quest duties! + +### (The SPEAKER looks impressed with your predicament)|Since you are Blessed by a goddess, I can help you.|(She performs a short prayer and a random divine lock comes off) + +### (Ask for 2 knives) + +### (Ask for 3 lockpicks) + +### (Ask for a magic key) + +### (Ask for help with a divine lock) + +### There is no valid space next to you! + + + +### (You approach the SPEAKER) + +### (Threaten) + +### (Really attack?) + +### (Attack her) + +### (Never mind...) + +### (You decide not to) + +### (Retaliate) + +### (Really attack? You will be justified and won't take an immediate rep penalty) + +### (Sneak Attack) + +### (Really attack? Target is unaware and will be stunned 1 turn.) + +### (Let me through!!) + +### (Walk past this unit) + +### (Walk past all units) + +### (Confirm? You will move through her for a few turns) + +### (Stop following me) + +### (Confirm? You will have to find the SPEAKER again.) + +### (You decide you still need the help) + +### (The SPEAKER refuses to follow your orders) + + + +### (Remove BINDAMNT binding from her) UNTIETURNS + +### (You remove BINDANTPREV binding from the SPEAKER, excluding actual bindings)|(Use the 'Truss em Up' skill to remove bindings) + +### (Give her a restoration item) + +### (The SPEAKER appreciates the thought!) + +### Must have HP to untie. + +### (AMNT turns) + +### (AMNT turn) + +### (Follow me) + +### (The SPEAKER starts following you) + +### (You decide you don't need the help) + +### (Hold still) + +### (The SPEAKER follows your orders) + +### (Don't stay here) + +### (Confirm?) + +### (You decide you would rather the SPEAKER stay put) + +### (Switch to Aggressive) + +### (The SPEAKER will now pursue enemies) + +### (Switch to Defensive) + +### (The SPEAKER will stay close to you or its assigned position) + +### (Flirting) + +### (The SPEAKER smiles)|This will be fun! + +### (The SPEAKER grins)|I will make sure you enjoy yourself~ + +### (The SPEAKER blushes)|Mmm~ Let's do this! + +### (The SPEAKER backs up)|I'm not in trouble, am I? + +### (The SPEAKER beeps)|This unit does not know how to respond... + +### (The SPEAKER moans)|Mmmmmph~ + +### (The SPEAKER appears too busy to discuss with you) + + + + + + + + + + + +### End of line. + +### *slaps your butt* + + + + + +### Error. Subject not complying? + + + + + +### Got yourself locked up, huh? Better go be good now~ + +### *she bumps up against your chastity and sighs* + +### Pleasure controls detected. + +### You've been a bad girl, haven't you? *taps on your chastity gear* + +### Such a naughty girl, getting yourself all locked up like that! + +### I-I know you want release, but you're in this gear for a reason~ + + + + + + + + + + + +### Had fun?~ + +### *turns the toy off and giggles* + + + + + + + + + +### Don't I look quite cuddly? + +### (Move closer, attempting to cuddle) + +### (The SPEAKER smiles)|You do, in fact!|(She inches closer) + +### (The SPEAKER smiles gently)|Aren't you precious~ + +### (The SPEAKER looks flustered)|Well, it's been a long day...|I could use a hug... + +### (The SPEAKER smirks and reaches for your body) + +### (The SPEAKER makes a beeping noise)|Loading cuddle module... + + + +### Got something for me? + +### (Present your body to her~) + +### (The SPEAKER smiles)|Am I thinking what you're thinking? + +### (The SPEAKER grins)|Why yes, I have just the thing~ + +### (The SPEAKER blushes)|Oh... let me check. + +### (The SPEAKER smirks)|Be careful what you ask for~ + +### (The SPEAKER pauses)|Calculating strictness threshold... + +### Yes please! (Hold out your wrists) + +### (Nod and blush) + +### Maybe not... + +### Why don't we have a little fun? + +### (Play with her) + +### (The SPEAKER giggles)|Mmmph~ + + + +### You look quite distracted... + +### (Help her with her distraction) + +### (The SPEAKER nervously smiles)|H-how'd you know? + +### (The SPEAKER smiles)|Indeed I am... Won't you assist me? + +### (The SPEAKER wiggles excitedly)|Y-yes miss! + +### (The SPEAKER shakes her head while blushing)|W-what makes you think that? + +### (The SPEAKER computes something)|Error... + +### (The SPEAKER nods)|Mmmph! + +### (Give her release with a magic wand) + +### (Set her toys to high for a while) + +### (Cuddle with her for 2 turns) + +### (The SPEAKER trembles with pleasure) + +### (The SPEAKER struggles to let go due to her chastity belt) + + + +### Let's go for a walk! + +### (Jump excitedly, presenting your collar for a leash) + +### (The SPEAKER smiles)|Sure! I'll take you for a walk, but only if you behave. + +### (The SPEAKER smiles)|Yes, I haven't had a nice walk in a while~ + +### (The SPEAKER blushes)|Sure! I'll make sure you don't get into trouble~ + +### (The SPEAKER giggles)|Time for walkies! + +### (The SPEAKER calculates)|Routing coordinates... + +### (Ask her for help) + +### (Are you sure? She might see you as being submissive) + +### (The SPEAKER prefers you the way you are) + +### (The SPEAKER will help you out of your restraints) + +### (You decide to deal with your problems yourself.) + +### (Plead with her to unlock you with a Command Word) + +### (Yes!) + +### (The SPEAKER would rather 'conserve her mana') + +### (The SPEAKER utters a command word on you) + +### (Your magical locks continue to restrain you.) + +### (Plead with her to unlock your restraints) + +### (The SPEAKER would rather not give up a magic key) + +### (The SPEAKER doesn't have any keys) + +### (The SPEAKER giggles and gives you a key) + +### (You remain locked tight.) + +### (Stop receiving help) + +### (Confirm? You will have to ask again to get help.) + +### (The SPEAKER will no longer help you.) + +### (You sigh as you realize you really need her help.) + +### (Kick her out of your party) + +### (Confirm? She will stop following you) + +### (Remove from party) + +### (The SPEAKER understands.) + +### (You decide to keep her.) + +### (Add her to your party) + +### (Confirm? She will follow you across floors. You can only have 3 party members) + +### (Add to party) + +### (The SPEAKER is happy to join you) + +### (You decide not to.) + +### (Sell items) + +### (Buy items) + +### (Pick up her leash) + +### (Release her leash) + +### Dollmaker + +### The Dollmaker throws a device to the ground, teleporting her instantly! + +### The Dollmaker's necklace flashes as you find yourself suddenly restrained! (+RestraintAdded) + +### The Dollmaker's overbearing presence captivates you~ (DamageTaken) + +### The Dollmaker snaps her fingers as you find yourself locked! (DamageTaken) + +### The Dollmaker sinks into a pool of latex! + +### The Dollmaker suggests that you surrender. (DamageTaken) + +### DOLLMAKER + +### The Dollmaker falls kneeling to the floor, admitting defeat! + +### The Dollmaker snaps her fingers, and many robotic arms restrain you! (+RestraintAdded) + +### The Dollmaker orders you to KNEEL! (DamageTaken) + +### Fuuka + +### Fuuka surrounds herself in defensive talismans! + +### Fuuka wraps you tightly in restraints! (+RestraintAdded) + +### Fuuka squeezes your breasts and smiles! (DamageTaken) + +### Fuuka snaps her fingers and all your restraints are locked! (DamageTaken) + +### Fuuka surrounds herself in defensive talismans one more time! + +### Fuuka wraps you furiously in restraints! (+RestraintAdded) + +### Fuuka pouts as she tickles you relentlessly! (DamageTaken) + +### (You find a girl wearing an ornate dress)|(She glances at you)|And who might you be? + +### I should be asking the same of you. + +### (Growl at her) + +### (She smiles)|My name is Fuuka, with the letters for Wind and Song.|Are you going to introduce yourself? + +### What kind of name is that? + +### (SPEAKER frowns)|It means Windsong!|I bet yours isn't anywhere nearly as cool. + +### (SPEAKER looks enraged)|Because names and meanings are different things!|My name uses the script from the Old Civilization!|You're just a poser! + +### Why not just call yourself Windsong? + +### I am an adventurer. + +### (SPEAKER blushes)|Ah, right then... + +### (SPEAKER giggles)|Very well. I don't really care who you are. + +### I do not need to introduce myself. + +### Neither do I. + +### I'm an adventurer. And who are you? + +### Mmmmm... (Blush) + +### (She grins)|My name is Fuuka, with the letters for Wind and Song.|The reincarnated ones call me Windsong,|they aren't very bright though. + +### Reincarnated ones? + +### (SPEAKER tilts her head)|I believe the term is 'Zombie' in the common tongue. + +### (SPEAKER enjoys the discussion)|When most people die, their spirits pass on to the next life.|But some stay in this world, and with the right blessings,|one can grant them a second chance!|I plan to give them all proper bodies...|Eventually. + +### How do they get reincarnated? + +### (SPEAKER enjoys the discussion)|No, they're people!|People who died long ago.|Now they live a new life, safeguarded by my Resurrection Arts! + +### Aren't they dolls? They can barely speak. + +### (SPEAKER pouts)|Why you...|Long ago, I made a contract with Ninril to guide lost souls back to her.|Do you doubt her blessing?! + +### Your Resurrection Arts don't seem very effective. + +### (SPEAKER looks puzzled)|People don't die anymore, but there are still lots of souls out there.|Whenever they stumble into the dungeon, searching for answers,|I'm still here, waiting! + +### What do you do now that people don't die? + +### (SPEAKER chortles)|So you've noticed!|As you can see, Ninril is very powerful~ + +### You don't look very old yourself. + +### (SPEAKER frowns)|Divine blessings shouldn't be used for such silly things! + +### Can you resurrect my back? It kind of hurts right now... + +### (SPEAKER smiles)|Those latex-clad idiots don't understand a thing.|Science can only get you so far!|Worship is where it's at! + +### The Alchemists are always looking for a youth potion. + +### (SPEAKER folds her arms)|Oh ho ho~|That's none of your business, for it is also part of my contract|to keep outsiders from interfering with the catacombs below! + +### Do you know what's on the next floor? + +### (SPEAKER blushes)|Nope, nothing at all!|In fact, whatever it is, you won't find it down here!|Now, would you like to become my pet? + +### Do you know anything about the Old Civilization? + +### (SPEAKER shrugs)|Oh really...|Must be the fey playing tricks, hehe... + +### I've seen a few robots running around! + +### (SPEAKER looks nervous)|Oh yeah? Where'd you hear that?|The 'adventurer's guild,' huh?|Why don't you just leave the dead to rest~ + +### I heard there was an ancient facility on this island. + +### (SPEAKER sighs)|Look, the Goddess doesn't tell me everything.|Now then, I have a job to do and some pets to manage.|Please stop asking questions! + +### Is Sariel Vinlaga down here? + +### (SPEAKER frowns)|What's with all the questions!|There totally isn't some kind of doll processing facility here!|Perhaps you're a brainwashed doll yourself? + +### Does DressUp Co. get their 'cyber doll' products from here? + +### (SPEAKER chuckles)|I smell a hint of jealousy~ + +### I don't want to be a pet, so you'll have to force me. + +### (SPEAKER jumps up and down)|You would!?|That's wonderful~|My resurrection magic can make you young again forever!|All you have to do is pledge your soul to Nirin, the Goddess of Restoration! + +### I'd love to be your pet! + +### (SPEAKER pouts)|Hmmph. Suit yourself. + +### Pledge my soul? That changes things... + +### (SPEAKER giggles)|Hehe... you sound interested. + +### (SPEAKER frowns)|Never ask a woman about her age! + +### I take it you're the hag in charge? + +### You are in charge, right? + +### (Giggle) + +### Don't mess with me, little girl. + +### Mmpphgh? (Pout at her) + +### (She smirks)|So you're that kind of visitor, huh? + +### That's right. How powerful are you? + +### (She cracks her knuckles)|I have been practicing the resurrection arts for a thousand years. + +### (She smiles)|All the zombies you seee in the Graveyard?|They are my pets, and I care for each and every one of them. + +### What the heck are 'Resurrection Arts'? + +### It's time for a true display of skill! + +### Hmmph. (Look away) + +### (She grins)|We'll wipe that pout off your face soon enough... + +### (She frowns)|Well, you will soon. + +### Pfff. Never heard of it. + +### I bet I could do better. + +### Why does that matter to you? + +### (Stare at her silently, maintaining your posture) + +### (She grins)|I am in charge of this place.|Everything that goes through here goes through me.|You may address me as Fuuka Windsong. + +### By what authority? + +### (SPEAKER tilts her head)|Ummmm.... uh...|The Old Civilization! Of course!|I've been keeping their traditions for centuries. + +### (SPEAKER blushes)|Umm... That's because...|Oh shut up! + +### You don't sound too confident. + +### Who are you anyway? + +### Fair enough. I am an adventurer. + +### (SPEAKER giggles)|Is that a challenge? + +### (Nod calmly) + +### (SPEAKER grins)|Is that a challenge? + +### We'll see about that. + +### Hmmph. (Scoff into your gag) + +### It is indeed! + +### I'm an adventurer, miss. + +### Mmmpphh~ (Moan and wiggle seductively) + +### (She grins)|Oh look at you!|I'm going to dress you up and make you my pet!|You can have all the scritches and snuggles you want!|My name's Fuuka! + +### A pet? What kind? + +### (SPEAKER hops up and down excitedly)|Oh I've got dresses!|And all sorts of fun gear!|Maybe even this huge gag for you to chew on! + +### (SPEAKER grins)|Having second thoughts? + +### That sounds... harsh. + +### ...Maybe + +### Exciting! + +### That sounds great. But who are you miss? + +### Mmmmph~ + +### (SPEAKER giggles)|Hehe... We will have so much fun~ + +### (SPEAKER giggles)|You don't have to consent, dear~ + +### I never said I consented to being a pet! + +### (Give her a puzzled look and shake your head) + +### No way! + +### (Sigh and shrug) + +### (Attack her without saying anything) + +### (SPEAKER clears her throat)|I am the one tasked with keeping this graveyard pure and holy.|The reincarnated ones who roam this place do so with my permission.|But what of you? I do not remember striking a deal with you.|Are you here to challenge me? + +### I do what I want. + +### (Glare at her and scoff) + +### (SPEAKER makes a big grin)|I take that you wish to challenge me?|Very well!|Come at me! + +### About those 'reincarnated ones'... + +### You have no power over me + +### Hmmph. (Stand proudly) + +### (SPEAKER smiles)|Then let us fight!|If I win, I will make you my pet.|If you win, I will let you pass. + +### I don't want to fight, miss... + +### Mmph! (Shake your head frantically) + +### (SPEAKER giggles)|Come now, I want to see how good you are! + +### Yes, I am here to fight you. + +### (SPEAKER smiles)|Then what are we waiting for? + +### You're on! + +### Hmmmph! + +### Let us duel! + +### Mmmmmghh! + +### I suppose... + +### (SPEAKER smiles as she stands over you)|Well well. Look who won. + +### (SPEAKER nods and giggles)|Absolutely.|Allow me to present to you, my prized pet collar!|I save it only for my favorite pets.|That's right! You're my favorite pet now~ + +### (SPEAKER giggles)|You're not in a position to resist.|Now then, where did I put that collar... + +### (SPEAKER smiles)|It's a magical spell that seals your power temporarily~|I use it for my pets when they're being unruly...|(She brandishes a collar) Now including you! + +### What's this weird magic? + +### You beat me fair and square. + +### Mmmph. (Submit) + +### You cheated! + +### Mmmph! (Struggle weakly) + +### (Sigh and accept your fate) + +### (Accept the collar eagerly) + +### (Accept the collar begrudgingly) + +### (SPEAKER presents you with your collar...)|(She locks it around your neck)|You are free to go now, dear! + +### (SPEAKER puts up a wall of talismans to regain her strength)|I'm... I'm not finished yet! + +### (SPEAKER is out of breath)|I... can't... believe... it...|She drops her keys... + +### (SPEAKER looks flabbergasted)|R-really? Okay... I'll give you a reward then... + +### (Submit to her anyway) (Gain a special collar) + +### (SPEAKER resists but ultimately you force a gag into her mouth)|MMMMMPH! + +### (Gag her) + + + + + +### (This ghost had something to say,|but it appears you've run into a bug instead)|Please report this to Ada18980 on deviantart! + +### (Continue) + +### (Make a smug face as you walk past) + +### Thank you! + +### I don't need your advice, strange ghostly person. + + + +### Oh, those people that locked you up?|I dealt with them.|Now come along, there's no time to waste! + +### (The SPEAKER giggles)|Treasure? The treasure isn't going anywhere.|Plus, I made a few enemies on the way.|We better not wait till they come back. + +### But what about the treasure!? + +### (The SPEAKER ponders your question)|I think we'll have to talk about compensation|AFTER we get out of here. + +### So how much is this going to cost me? + +### (You hear footsteps. It's the SPEAKER!)|Why look at you!|Well you seem to be in a bind, don't you? + +### Not to worry! I'll get you out of here! + +### Hehe, alright! If that's what you want~ + +### (Shake your head and refuse rescue) + +### Actually I was having fun... + +### (The SPEAKER, your longtime friend, smiles)|Well well, if it isn't you again!|I see that you've decided to challenge the dungeon again.|Don't forget to bring some gold back with you,|there's a fee for rescue~ + +### Can you help with these restraints? + +### Pfffmmm hhmmph mmph... (Please Help Me) + +### No can do! Even I can't get those off of you. + +### Caught by...? + +### Hah!|You've been here a million times!|You obviously know how dangerous it is, yes? + +### F-fee? There's a fee? + +### Yep! It'll cost ya!|Quite worth it if you ask me.|Unless you'd like to spend the rest of your life in chains! + +### Will you buy my loot? + +### (Show her your loot) + +### Absolutely! I offer the standard market rate for anything.|I'll take enchanted items too!|I've got plenty of volunteers to check for curses~ + +### Got something you want to show me? + +### (Sell Items) + +### (Sell Whole Stacks of Items) + +### Daww! What a cutie!|(She smiles and pats your head gently) + +### Do you have anything for sale? + +### (Look around for items to buy) + +### I'm sorry sweetie, I don't sell merchandise here.|Who would set up a shop inside a dungeon? That's crazy!|But you adventurers bring in a steady supply of loot,|so if you've got something to sell me, I'll take it off your hands~|You can also talk to my guests, perhaps they have something for you. + +### (Return) + + + +### (The SPEAKER brings you safely back to her shop)|There! Nice and safe.|Now, as for my fee...|That'll be RESCUECOST gold pieces! + +### Right! Here's RESCUECOST gp. + +### Mmmph. (Nod your head and pay RESCUECOST gp) + +### (The SPEAKER smiles)|Pleasure doing business with ya~ + +### Mind adding it to my tab? + +### (Shake your head regrettably.) + +### (The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|But I won't be letting you out of those restraints~ + +### (The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|You're a good customer, after all. + +### (The SPEAKER folds her arms)|Come on now, I can hear the gold jingling in your pocket! + +### Pretty please? I promise I'll pay you back. + +### (Be insistent) + +### (The SPEAKER rubs her chin)|Fine, I believe you.|But I won't be letting you out of those restraints! + +### (The SPEAKER sighs)|Fine, I believe you.|You better believe I won't forget, though! + +### (The SPEAKER folds her arms)|Your adventures have cost me a pretty penny.|I can't stay in business if my clients keep running off without paying.|Look, I'll cut you a deal, you help me, I help you. Fair? + +### (Help her test cursed armors) + +### (Add cursed restraints as collateral) + +### (Wear a collar to help advertise her business) + +### (Wear a catsuit to help advertise her business) + +### (Actually... just pay her the RESCUECOST gold) + +### (The SPEAKER holds up a RESTRAINTNAME)|I've bought some armors from an adventurer lately,|but I don't know if they're safe to wear.|Why don't you try it on for me?|I'll postpone your debt for a later time. + +### (The SPEAKER holds up a RESTRAINTNAME)|I need to make sure you won't go running off again.|This RESTRAINTNAME here has a special seal on it.|I can get you out of it, of course, but you'll have to pay up first. + +### (The SPEAKER holds up a RESTRAINTNAME)|Your captors are quite the market for high-security restraints.|If you get captured by them, maybe they'll see my logo on this collar!|It's quite comfy and secure,|you'll end up feeling more submissive the more your wear it. + +### (The SPEAKER holds up a RESTRAINTNAME)|Your body looks like a great billboard!|This suit will make you so attractive that nobody will be able to resist!|And in the process of, ahem, examining you,|They'll be sure to see my logo! + +### (The SPEAKER folds her arms and nods)|Good girl! I knew you would come clean~ + +### Sure! I accept! + +### (Nod in approval) + +### How about something else? + +### Excellent! Please hold still~|(She fits the RESTRAINTNAME on and a seal awakens)|Whoops! Good thing I didn't sell that one!|I'll let you keep it, it's my treat~ + +### Excellent! Please hold still~|(She fits the RESTRAINTNAME on and nothing happens)|We have a winner!|You can't have it though, not until you pay up~ + +### Wonderful. I look forward to seeing you being delivered, er, coming back,|Lots of treasure in hand!|(She places the RESTRAINTNAME on you and the seal activates. There is no keyhole.) + +### Alright! Why don't you hold still~|(She lifts your hair out of the way and buckles the collar on)|Now go out there and find me some treasure~ + +### You're gonna like it, I guarantee it~|(She pulls out the catsuit from a drawer, dusts it off, and helps you in it)|(There is no zipper or fastener, just a very stretchy neck hole)|(Once it's on and well-fitted, you feel the neck grow less loose...)|(...and pulling the rubber away from your skin becomes impossible)|Beautiful. I'm going to let you go now.|I'm sure your new look will attract many customers! + +### No? That's alright.|I'm sure I'll find someone else to test these on, huehue. + +### Up to you!|You'll still have to pay me eventually~ + +### Your choice~|I am open to further negotiations. + +### Your choice~|Not everyone is up to putting themselves on display like that~ + + + +### (The SPEAKER pats you down and makes sure you're okay)|I can definitely help with those!|But as you know, I help a lot of adventurers just like you.|You know what, I'll give you a discount!|That'll be RESCUECOST gold pieces! + + + +### (The SPEAKER rubs her chin)|Sorry miss!|Cost of doing business, you know?|Why don't you come back with some of that delicious, shiny gold~ + +### (The SPEAKER folds her arms)|Business is business, miss~ + +### (The SPEAKER rubs her chin)|No can do.|Rules are rules~ + +### (The SPEAKER sighs)|Business is business, miss~ + +### (The SPEAKER reluctantly frees you)|...Fine, I'll cut you a deal.|You help me, I help you. Fair? + + + + + + + +### The next floor is a normal floor. + +### This floor is suffering from a slime mold infestation.|Maids have been deployed to deal with the problem.|They could use a hand. + +### This floor is being ransacked by bandits.|They are armed and dangerous.|But I hear there's a bounty on their heads? + +### A cave dragon was captured in the next floor.|It's brimming with elemental magic,|and there are a lot of interested parties! + +### The witches told me to keep you out.|I'm not exactly capable of doing that,|so feel free to do as you please. + +### The next floor is overgrown.|I'd watch your feet if I were you. + +### Slimes, slimes EVERYWHERE!|Fortunately there's a slime-harvesting|operation going on. + +### The trainers are taking their wolfgirls out for a walk.|I'd steer clear.|Unless you want to become one of their pets~ + +### Rumor has it that one of the cyber-dolls escaped.|Their handlers are looking for her.|They're catching every young girl they can find! + +### This is totally a normal floor.|No doubt about it. + + + +### This is a debug mode journey for testing the latest region. + + + +### These are the stairs to the tutorial hall. + +### Congratulations! You've completed the tutorial!|Now get in there and stay out of trouble~ + +### Welcome to the dungeon!|Don't panic, this is a turn-based game,|and nothing will happen until you move.|On your left you'll see your character,|displayed with all of the bondage they don't have.|Don't worry, you'll find some soon! + +### You might be wondering what all these barrels are for.|Don't worry, they're, uh, totally safe!|When you are inside one you can click on yourself to wait.|Enemies have a hard time seeing you inside a barrel,|so you can wait until they pass by you. + +### On the right you'll see your stats and spells slots.|Your DP, SP, MP, and WP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon. + +### Your WP, or willpower, is an important resource.|Without it, escaping from restraints is more difficult.|There is a willpower potion on the floor up there. Go get it! + +### Oh no! That trap reduced your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack). + +### Another trap!|You'll notice that the trap also drained your stamina considerably, preventing you from sprinting or attacking.|(Note: you can toggle sprinting using the '>>' button on the bottom bar)|You can protect yourself while your stamina regenerates by retreating into the room above.|Close the door by clicking the Close Door button in the bottom bar.| + +### Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the right menu, then navigate to the Spell Tree.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1. + +### On the right you'll see your stats and spells slots.|You can click on a spell slot or hit 1-4 on your keyboard to cast a spell|then click on the map for where you want to aim it.|The small wrench icon above them will let you|swap them out for another spell from your spellbook. + +### There's a zombie over there!|Fortunately zombies are weak to fire.|Firebolt has a very long range,|so simply cast firebolt and click on the zombie.|Repeat until it is dead. + +### Mana potions restore mana, allowing you to cast spells.|Youll notice that your mana also regenerates slowly.|This mana comes from your mana pool,|which is a thin line displayed under the mana bar.|When that runs out, you can't cast spells anymore! + +### Your DP, or Distraction, is a measure of...|How much you are enjoying things.|These sorts of thoughts cloud your mind,|so spellcasting is more difficult when you are distracted.|Go grab the potion over there. + +### Did you like that?|Anyway, there's a zombie over there. You should drink that potion.|It will clear your mind so you can cast again.|Hurry, or it will get you! + + + +### That wasn't so hard, was it?|Now then, there's a treasure chest over here. Why don't you open it? + +### Yikes, looks like you're in a bind!|No worries, though. There's a key to those cuffs over there.|Simply hover over the cuffs item test on the left side.|Then, click the lock icon to remove the lock.|Finally, click the buckle to remove the cuffs. + +### I think we all know what's in the next chest.|It's important to understand the different ways you can escape.|You can struggle, which costs the most stamina|but makes other struggle methods faster.|You can cut, which requires a knife in hand.|You can remove, which represents untying or unbuckling. + +### Ouch, that looked tight...|Sometimes you won't be able to struggle out of things.|You'll have to find some other way to take it off... + +### There's a few zombies up ahead.|Fight your way through and claim the treasure! + +### You're not feeling it... + +### You close your eyes but the vibrations keep you from dozing off... + +### (A SPEAKER lies hogtied in front of you)|(She looks at you with pleading eyes,)|(and mumbles incoherently through her gag) + +### (A SPEAKER lies hogtied in front of you)|(She looks at you, mumbling and giggling into her gag) + +### (SPEAKER looks grateful)|Thank you so much|I shall join your party. + +### (SPEAKER looks grateful)|Thank you so much miss!|I owe you everything. + +### (SPEAKER groans and wriggles around uselessly) + +### (SPEAKER moans and rolls around, blushing deeply) + +### Untie her + +### Make sure she is tight and secure + +### (A SPEAKER bumps into you while immersed in her thoughts)|Oh! Hello!|Say, you look adorable...|Do you mind helping me find something? + +### (The SPEAKER jumps up and down)|Ah, wonderful!|I've misplaced one of my dresses.|If you could find one, wear it, and bring it to me,|I'd greatly appreciate it! Thanks! + +### (The SPEAKER stares at you like a rabid animal)|Wowie! You look gorgeous!|Thank you so much!|(She snaps a photo of you using a magic crystal) + +### (The SPEAKER giggles)|I never said I'd take it off, did I? + +### (The SPEAKER smiles)|Sure thing! + +### (Show interest) + +### I found your dress... + +### Mmmph... (Found the dress!) + +### Great! Can you take it off? + +### Mmmmm! (Struggle) + +### (A SPEAKER clutching her books approaches you)|Miss adventurer!|I happen to need a magic scroll of any kind.|It's for my studies. + +### (The SPEAKER smiles)|Yes, thank you so much!|It's been so difficult to get them lately.|The magic library is closed off these days,|and there are mean people trying to get the scrolls back... + +### (The SPEAKER is happy)|Thank you so much! + +### Give her a Scroll of Sauntering + +### Give her a Scroll of Sleight + +### Give her a Scroll of Speech + +### Give her a Scroll of Purity + +### (A SPEAKER looks distraught)|Well met, adventurer!|We have a problem... + +### (The SPEAKER folds her arms)|A rebel has been causing us problems lately...|If you run into her, give her all you got!|She needs to be brought to justice. + +### (A SPEAKER scoffs in your direction)|Well? You lookin' for work or no? + +### (The SPEAKER grins)|A bunch of delinquents stormed out recently.|They're looking for a way out of their belts.|Someone oughta show em their place,|if you catch what I'm saying. + +### (A SPEAKER approaches you in your cell)|Since you've been a bad girl,|we're taking you to the high-security prison. + +### (The SPEAKER folds her arms)|Want to or not, you're going. + +### (Resist) + +### (Submit) + +### (A SPEAKER approaches you in your cell)|Looks like you're not in the System.|I'm going to have to take you to sorting. + +### (The SPEAKER grins as her systems glow)|I love my job sometimes~ + +### (The SPEAKER grins)|It means you'll get nicely packaged,|so that we can sort you through the System. + +### W-what does that entail? + +### (The SPEAKER giggles)|That means we'll get to package you up and|decide what to do with you, silly~ + +### Hmmmph? Mmmm! (Act worried and whimper) + +### (The SPEAKER folds her arms)|Mistress Oriel's orders + +### Not in the 'System'? + +### (The SPEAKER giggles)|Don't worry, we'll get you sorted out soon.|After all, everyone has a place in the System. + +### Mmmph? (Act confused) + +### (The SPEAKER folds her arms)|Mistress Oriel's orders were clear:|Anyone not logged in the System shall be entered into the System. + +### (The SPEAKER pauses for a moment, then speaks)|I'm am just following Mistress Oriel's orders.|I'm sure she will have time to speak with you if you want to ask her. + +### But why??? + +### (The SPEAKER frowns)|You should be thankful.|Without Mistress Oriel, we'd all be dead!|Probably... + +### Who is Mistress Oriel? + +### (The SPEAKER pauses for a moment, then answers)|Well, only a few hundred years ago, I think?|This is a bit longer of a downtime than usual,|But all of us are waiting patiently~ + +### When are these orders from? + +### (You anger the SPEAKER. She gags you.)|Unlike you, we were trained not to complain about orders given to us.|So until you receive your training, why don't you be nice and quiet? + +### The facility is in ruins! This is pointless! + +### (A SPEAKER crosses her arms)|Who you lookin' at?|Oh, it's an adventurer.|Say, you wouldn't be interested|in working with us, would ya? + +### (The SPEAKER smiles)|That's more like it.|Here's the scoop: One of ours was captured on the next floor.|We need you to go get her out. + +### (The SPEAKER sits bound in high-security manacles.|You'll need to open the lock to get her out.) + +### (You don't have any keys that work on the lock) + +### (You can't help her, bound as tightly as you are...) + +### (You unlock her, fumbling around for a while with your bound hands) + +### (You unlock the SPEAKER)|Thank you!|Let's get out of here! + +### (You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...) + +### (You don't have any lockpicks) + +### (You try to pick the lock...)|(Click! A safety shield locks securely into place!)|(Looks like the SPEAKER will be staying here for a while...) + +### (You can't pick the lock with your hands bound) + +### (After a while, you free the SPEAKER)|Thank you!|Let's get moving! + +### (After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...) + +### (You don't have enough mana for a command word) + +### (Try as you might, your mouth is sealed tight) + +### (You utter a command word to free the SPEAKER)|Many thanks!|Let's go! + +### (You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) + +### (The SPEAKER is locked in high-security manacles.|The safety shield has been triggered, making it impossible to help her.) + +### Use a key to unlock her + +### Try to pick her restraints (JAMPERCENT jam chance) + +### Use CMD: Unlock + +### Apologize profusely! + +### (The SPEAKER sits bound in mysterious ASCII glyphs)|(She is bugged and needs your help to get out) + +### (Unlock her and file a bug report to Ada) + + + +### (This SPEAKER is a sub, but not YOUR sub!) + + + +### (The SPEAKER sits restrained by your own hand.|Only someone with keys can let her out.) + +### Try to pick her restraints + +### Return her to your collection + +### Use a command word + +### Flip her around + +### You spin her right round! + + + +### An enemy found you while you were busy! + +### (A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door) + +### (A SPEAKER wakes you up by melting the door with acid)|These guys were a piece of cake.|Now let's discover a way out of here! + +### (You wake up to find a SPEAKER creeping up outside the door)|You've been marked as a person of interest.|We are here to escort you out of this place. + +### (A SPEAKER wakes you up by banging on the bars)|Hey wake up!|You should join me and my pals here~|Maybe you'll join them once we're out of here? + +### (A SPEAKER wakes you up by banging on the bars)|I have been sent to inform you...|...that you are of good standing with the Council.|That being said, I'm only doing this because of procedure. + +### (A SPEAKER wakes you up by banging on the bars)|Greetings, follower of the blessed kitty!|Because of your faith, we have been sent to rescue you! + +### (You sense a presence nearby and look up to see a SPEAKER)|Because you are one, we have come to free you.|Do not take this as an excuse|to get yourself into further trouble. + +### (A SPEAKER wakes you up with the sound of copious fabric rustling)|Oh why hello there!|Would you be interested in a trial run of my latest product?|Of course, we'll have to get you out of here first... + +### (A SPEAKER wakes you up by banging on the bars)|Hello my pretty~|I thought to myself I'd rather have you than these folk.|Now why don't you come along and follow me... + +### (A SPEAKER wakes you up by banging on the bars)|Um... hello!|I received a quest to help you out of here!|Now, where do we go... + +### (You wake up to find a SPEAKER whispering to you)|Greetings.|We've been sent to free you.|Let's get moving. + +### (A SPEAKER wakes you up by banging loudly)|Hey! Good news!|My friends and I came to rescue you! + +### (A SPEAKER wakes you up by knocking on the bars)|Hey, wake up.|I happen to like you, so we're going to get you out of here. + +### (A SPEAKER flashes a bright light in your direction)|Prisoner 74121 located. Commence transfer to different location. + +### (A SPEAKER wakes you up)|We came to rescue you. Come on! + +### (The bed looks comfy and inviting)|(Napping here will restore up to half of your willpower and 100% of your max mana)|(You can only sleep once per floor, unless jailed) + +### (You lay in the bed and doze off...) + +### (Lie down and sleep) + +### (There is a pole sticking out of the ground)|(A footrest rises from the floor on either side of the pole)|(This seems like an automated binding system for prisoners...) + +### (The pole rises and immobilizes you!) + +### (Stand over it and place your feet in the footrests) + +### (Drop off a prisoner from your collection) + +### (Put NME on the stand) (PRCNT% Chance) + +### (Put NME on the stand) + +### (This is a piece of bondage furniture) + +### (You lock yourself in the furniture!) + +### (The SPEAKER slips out of your grip|before you can lock her in place!) + +### (Display one of your prisoners) + +### (Lock yourself inside) + +### (Check the occupant) + +### (Try to lock NME into the furniture) (PRCNT% Chance) + +### (You close the furniture around your unfortunate victim!) + +### Stun or disable her first. + +### Area isn't clear. + +### (Secure NME into the furniture) + +### (You lock her into the furniture so that she stays in place) + + + +### FOODMSG|(It invites you to partake in its culinary delights) + +### (You eat the food and feel your willpower rising) + +### (Being gagged as you are you cannot enjoy the food) + +### (You steal the food, hoping nobody will notice...) + +### (Eat it to restore AMOUNT% WP) + +### (Take it!) + +### (Someone left their cookies unattended) + +### (You smell delicious pizza) + +### Cookie + +### Pizza + +### (There is a button on a control panel here.) + +### (You touch the button and it glows, releasing a pulse of energy!) + +### (PUSH THE BUTTON) + + + +### (You find a map of the local leylines.)|(Committing these to memory will allow you to harness additional mana.) + +### (Are you sure?)|(This decision is permanent.) + +### (Gain +100 to Max Mana Pool) + +### (I don't want to.) + +### (No really, I don't want it!) + +### (You find a strange elevator with a control panel inside)|(You get the impression this will take you somewhere.) + +### (Are you sure?)|(This seems like a bad idea!) + +### (You activate the control panel and begin to descend...) + +### (Take me down!) + +### (I know what I'm doing!) + +### (The conveyor pulls you into a strange elevator)|(A whir of motors suggests this elevator is about to start...) + +### (You manage to scramble out the door!)|(It closes violently behind you...) + +### (The door slams in front of you before you are able to escape!)|(A purple light turns on, revealing a padded interior)|(You feel the elevator begin to descend...) + +### (There's no point in fighting when you can't win)|(You wait patiently as the elevator descends) + +### (Try to get out! RESISTCHANCE% success chance) + +### (Give up and let it take me) + +### (Wait it out) + + + +### (Mystic energies spring forth from the ground)|(Standing here will fully replenish your passive mana pool)|(One use only) + +### (You step on the magical fissue and its energies absorb into you)|(Afterward, the ground crackles and fizzles, but no energy is left.) + +### (Recharge your mana pool) + +### Upcast Level LEVEL + +### Prerequisite + +### Unlocks: + +### You need to learn REQUIREDSPELL before you can learn this one. + +### You no longer have the will to struggle. + +### Help yourself! + +### You eat the delicious food and feel your will restored. + +### Your gag prevents you from eating... + +### It's a table. + +### It's a table, with evidence of a grisly deed. + + + +### You call for help! + +### You let out a garbled cry! + +### Your screams are muffled by your gag! + +### You can hardly make a noise... + +### *clink* + +### You yelp as the EnemyName activates your RestraintName + +### You shudder as the EnemyName activates your RestraintName + +### That should slow you down! + +### Try running away now~ + +### Initiating prisoner lockdown protocol--Unknown hardware detected + +### What's this do? + +### That harness you're wearing is quite convenient for me~ + +### Initiating prisoner lockdown protocol + +### Your RestraintName suddenly snap together as the EnemyName activates them! + +### Your harness projects energy tethers between your cuffs EnemyName activates it! + +### Turn Count: + +### The Shopkeeper leashes you! + +### You are brought into the Shopkeeper's establishment... + +### It seems to be working! The seal on your RESTRAINTNAME is weakened. + +### The cursed seal on your RESTRAINTNAME disappears. + +### You are moved along by the conveyor... + +### Strange machinery begins sealing you in shiny latex! + +### Metallic arms insert something into you! + +### Metallic arms attach a chastity belt over your waist! + +### Metallic arms wrap you in tape! + +### Metallic arms wrap you in strict restraints! + +### Metallic arms install various cybernetic restraints! + +### You've sprung a trap! You've been stunned. + +### The bandit leaves behind a sneaky trap... + +### Damsel Trap + +### The ENEMYNAME transforms nearby dolls into her subjects! + +### You wriggle around while struggling... + +### The missile explodes into a shower of latex that covers you! + +### Rubber Missile Direct Hit + +### Rubber Missile + +### Rubber Nuke Direct Hit + +### Rubber Nuke + + + +### (In the center of the room stands a woman wearing a latex dress)|(Around her are robotic servants, obeying her without a word)|(She has been watching you this entire time) + +### And who might you be? + +### (Tilt your head) + +### (The woman's mask reflects the harsh industrial light)|You don't know who I am?|Hmmph, and I suppose my servants haven't told you...|They call me the Dollmaker. + +### So you're the one they talked about. + +### (Nod and continue) + +### (Tuck your staff behind your back...) + +### (The Dollmaker points at you)|Is that--? + +### (Panic!) + +### You must be the Dollmaker. + +### (The woman chuckles)|Correct.|And you must be the adventurer causing the recent troubles. + +### I'm famous! + +### Indeed. And I'm here to bring you down. + +### (Scoff at her) + + + +### (The Dollmaker folds her arms)|In any case, your journey ends here.|I do not appreciate scoundrels poking around in my domain.|I will personally lead you to your new future as a doll. + +### Do you have the Mistress' Staff? + +### (The Dollmaker chuckles)|That trinket?|So that's what you're after!|As a matter of fact, I do not have it.|It belongs to a certain Archmagus. + +### Then you are of no use to me. + +### (The Dollmaker summons a drone to her side)|Such arrogance! I'll have to teach you some manners! + +### What a bother. + +### Who? + +### (The Dollmaker explains)|Archmagus Sariel Vinlaga. I'm surprised you didn't know.|Not that it matters for a future doll like you. + +### ...Sariel Vinlaga. + +### (The Dollmaker nods)|Yes. She is down here.|But this information is irrelevant to your future as a doll. + +### The Staff will be mine. + +### Fair enough. Let's fight! + +### We'll see about that! + +### Feel free to try. + +### Sounds fun... but I really need to get going. + +### (The Dollmaker folds her arms as she walks over)|All tight and shiny!|You'll be my prized possession~ + +### (The Dollmaker nods)|Already eager to obey!|So beautiful... + +### (The Dollmaker chuckles)|Oh, but I already have~ + +### I have no choice but to submit. + +### You will never get away with this! + +### (Sigh and be forced to wear her visor) + +### (Sigh and be forced to wear her mask) + +### (Sigh and be forced to wear whatever she chooses) + +### (The Dollmaker places her visor over your face)|(With a click, you feel its fasteners lock around your head)|Now... as it stands, I have a task for you, doll.|You see, some dolls have been escaping my realm.|I want you to go capture them. + +### (The Dollmaker suddenly teleports away)|Hmmph. Looks like I will have to use my heavy firepower. + +### (The Dollmaker sinks into a puddle of slime and emerges nearby)|(Robotic arms sprout from her back as she storms toward you!) + +### (The Dollmaker concedes defeat)|You have defeated me.|I... I... will let you pass.|(The door exit door unlocks with an audible click) + +### (SPEAKER looks confused)|What are you... Okay, you can have it... + +### (Wear a doll visor) + +### (Wear a doll mask) + +### (You lift up the dollmaker's mask, revealing a pouting young woman inside)|What are you--|(You insert a gag into her open mouth and she starts mumbling angrily) + + + +### The Dollmaker calls in drone reinforcements! + +### The Dollmaker releases many drones with robotic arms to capture you! + +### Zombies emerge from the ground! + + + +### Cyber Ankle Cuffs + +### Ankle cuffs of exquisite quality, bearing all the marks of Old Civilization technology. + +### Though made of ultra-tough metal, they feel light on your ankles... + +### An energy link appears, linking your ankles close together! + +### Energy Link + +### An energy link connecting your ankle cuffs together. + +### It's powered by a chaos-resonance matrix, which can be overloaded by cutting the field. + +### The energy link disappears, freeing your ankles! + +### Your ankles snap together as the cuffs activate! + +### Cyber Cuffs Chain + +### A magnetic link keeping your ankles tightly connected. + +### The cuffs are closely attached, so you can't cut the link apart. + +### The ankle cuffs detach with a beep! + +### Cyber Leg Cuffs + +### Thigh cuffs of exquisite quality, bearing all the marks of Old Civilization technology. + +### Though made of ultra-tough metal, they feel light on your legs... + +### An energy link appears, linking your thighs close together! + +### An energy link connecting your leg cuffs together. + +### The energy link disappears, freeing your legs! + +### Cyber Cuffs + +### Wrist and elbow cuffs of exquisite quality, bearing all the marks of Old Civilization technology. + +### Though made of ultra-tough metal, they feel light on your wrists... + +### Your wrists are pulled together as the cuffs activate! + +### Cyber Wrist Link + +### A magnetic link keeping your wrists secured together. + +### Your cuffs detatch with a beep! + +### Your elbows snap together as the cuffs engage fully! + +### Cyber Connection + +### A magnetic link keeping your wrists and elbows inescapably secured. + +### Your wrists detatch with a beep, leaving your elbows still bound! + +### Your arms snap fully together as the cuffs activate! + +### Cyber Elbow Link + +### A magnetic link keeping your elbows pressed tightly together! + +### Your elbows detatch with a beep! + + + +### Doll Gag + +### A soft ball pressed against your lips and held in place with metallic straps. + +### The straps are made of a flexible metal with no visible seams along the straps. + +### Doll Plug Gag + +### A soft, flexible plug pressed into your mouth and held in place with a metal shield. + +### Doll Muzzle + +### A metallic shield preventing you from removing any gags underneath. + +### It's made of exquisite Old Civilization metals, resistant to almost all forms of damage. + +### Cyber Mittens + +### These mittens force your hands into fists, keeping you from using them to do anything useful. + +### It is made of a strong mesh of ancient metallic fiber, kept in place with a metal band. + +### Cyber Lockdown Mitts + +### These long mittens force your hands into fists, keeping you from using them to do anything useful. + +### It is made of a strong mesh of ancient metallic fiber, wrapped snugly around your arms to make removal by yourself impossible. + +### Doll Heels + +### A pair of tall heels used to improve the aesthetics and controllability of dolls. + +### Cyber Doll Belt + +### A chastity belt created by the Old Civilization. Truly a marvel of science! + +### It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with a advanced form of latex designed for permanent wear. + +### Cyber Doll Bra + +### A chastity bra created by the Old Civilization. Truly a marvel of science! The flexible material over the breasts hardens when squeezed, unless allowed for by the program. + +### It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with an advanced form of latex designed for permanent wear. + + + +### Doll Jacket + +### A jacket used to secure particularly unruly dolls. + +### The material is somehow both stretchy yet hard enough to chip a knife on. The pinnacle of Old Civilization materials science. + + + +### Dollmaker's Visor + +### A visor used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. + +### It's made of metallic glass, almost indestructible. Fortunately, it's still possible to see through. + +### Dollmaker's Mask + +### A mask used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. + +### Detected new hardware. + +### [Restriction Protocol] Detected new hardware: RESTRAINTNAME. Install progress: PERCENT% + +### [Restriction Protocol] Installation complete. Completing uniform. + +### [Punishment] Engage mobility restrictions. + + + +### [Training Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% + +### Supplemental Stimulation + +### Endurance Training + +### Frustration Tolerance + +### [Training Protocol] Installation complete. Engage training mode: CHASTITYMODE + +### You feel your belt insert new toys into your body... + +### [Sensory Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% + +### [Sensory Protocol] Installation complete. Engage sensory restrictions. + +### [Tracking Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% + +### [Tracking Protocol] Installation complete. Engage tracing system. + +### Your visor dims to help you focus on your task. + +### Escaped Doll + +### You return the doll to her rightful owner. + +### Your movement sets off your [RESTRAINTNAME] + +### Your struggling sets off your [RESTRAINTNAME] + +### Your attack sets off your [RESTRAINTNAME] + +### The straps on your gag prevent you from loosening the blindfold! + +### The straps on your gag keep your blindfold securely in place! + +### Revert + +### Confirm Revert? + +### Save + +### Save Changes? + +### Back to Menu + +### Back to Wardrobe + +### Confirm Strip? + +### Strip! + +### Export Outfit + +### Export AlwaysDress + +### Export Hair + +### Export Face + +### Export Cosplay + +### Gamma + +### Original Color + +### Contrast + +### Brightness + +### Red + +### Green + +### Blue + +### Transparency + +### Reset Layer! + +### Reset Properties! + +### Export All Layers + +### Export All Props + +### Copy + +### Paste + +### Items on Ground: + +### Preloading Character Assets: + +### Currently Worn + +### Uniforms + +### Suits + +### Underwear + +### Bras + +### Bodysuits + +### Socks + +### Shoes + +### Tops + +### Sleeves + +### Corsets + +### Skirts + +### Pants + +### Accessories + +### Fashion Restraints + +### Hats + +### Toys and Piercings + +### Hairstyles + +### Eyes + +### Body + +### Gloves + +### 'Cosplay' + +### Cat Eyes + +### Right Eye + +### Left Eye + +### Cat Brows + +### Right Brow + +### Left Brow + +### Simple Mouth + +### Simple Blush + +### Blush + +### Braid + +### Braid Front + +### Braid Back + +### Bangs Only + +### Bangs + +### Braid+Back + +### Braid Upper + +### Braid Lower + +### Back Only + +### Ahoge + +### Catsuit + +### Torso Lower + +### Torso Upper + +### Labcoat + +### Shoulders + +### ShouldersHogtie + +### Coat + +### CoatHogtieFree + +### Cape + +### Pauldrons + +### Breastplate + +### PlateBoots + +### BootLeft + +### BootRight + +### BootRightKneel + +### BootLeftHogtie + +### Gauntlets + +### GauntletLeft + +### GauntletRight + +### PlateArmor + +### ChainShirt + +### ShirtChest + +### Shirt + +### ChainSkirt + +### Skirt + +### ChainArmor + +### BanditShorts + +### Shorts + +### BanditLeftWrist + +### WristLeft + +### BanditRightWrist + +### WristRight + +### BanditWrist + +### BanditBoots + +### ShoeLeft + +### ShoeRight + +### ShoeRightKneel + +### ShoeLeftHogtie + +### BanditBreastplate + +### Striped Skirt + +### MaidApron + +### Apron + +### MaidBlouse + +### Blouse + +### BlouseBust + +### MaidBow + +### Bow + +### MaidCorset + +### Corset + +### MaidCorsetFull + +### CorsetStraps + +### MaidSockLeft + +### SockLeft + +### MaidSockRight + +### SockRight + +### MaidShoes + +### MaidSocks + +### Maidforce Agent + +### Elven + +### Bunny Suit + +### Dress + +### WitchBlouse + +### BlouseLiner + +### WitchCorset + +### WitchHat + +### WitchHatBack + +### ApprenticeHat + +### ApprenticeHatPuff + +### WitchShoes + +### WitchSkirt + +### SkirtBelt + +### SkirtRuffle + +### Witch + +### WarriorBoots + +### SportsBra + +### WarriorBustier + +### BustierChest + +### Bustier + +### WarriorBelt + +### DragonNecklace + +### Necklace + +### DragonArmband + +### Armband + +### DragonCollar + +### WarriorSkirt + +### Dragonheart + +### ZombieHat + +### ZombieHatBand + +### ZombieChestTalisman + +### ZombieTalisman + +### ZombieTalismanBent + +### Sandals + +### RobeBra + +### RobeSleeveLeft + +### SleeveLeft + +### RobeSleeveRight + +### SleeveRight + +### RobeSleeves + +### RobeSleeveDecoLeft + +### SleeveDecoLeft + +### RobeSleeveDecoRight + +### SleeveDecoRight + +### RobeSleevesDeco + +### Ribbon + +### RibbonBelt + +### RibbonBack + +### RobeSkirt + +### Robes + +### Arm Ropes + +### Upper Chest Strap + +### Shoulder Straps + +### Lower Chest Straps + +### Arm Straps + +### HairBow + +### Bow‎ + +### HairBowFrilly + +### BowFrills + +### Hairband + +### MaidHairband + +### MaidFrill + +### BackStraight + +### Curly + +### Curly_Overstrap + +### Fluffy + +### Fuzzy + +### Fuzzy_Overstrap + +### FrontStraight + +### FrontStraight_Overstrap + +### Straight + +### Straight_Overstrap + +### Long Straight + +### StraightBangs + +### StraightBangs_Overstrap + +### Curly Back + +### Messy + +### MessyBackShort + +### Short Messy + +### Underlight + +### CurlyBack + +### Ponytail + +### FluffyPonytail + +### Ponytail2 + +### TwintailLeft + +### TwintailRight + +### ArmRight + +### ArmLeft + +### ShoulderRight + +### ShoulderLeft + +### ForeArmRight + +### ForeArmLeft + +### HandRight + +### HandLeft + +### ForeHandRight + +### ForeHandLeft + +### LegLeft + +### FootRightKneel + +### FootLeftHogtie + +### LegRight + +### Butt + +### Eyes2 + +### Whites + +### Whites2 + +### HumanEyes + +### Brows + +### Brows2 + +### KjusEyes + +### KjusBrows + +### KjusMouth + +### KjusBlush + +### Hikimayu + +### DaskEyes + +### ElfEars + +### ElfFront + +### ElfBack + +### ElfEarsLong + +### ElfLongFront + +### ElfLongBack + +### ElfEarsFloppy + +### ElfFloppyFront + +### ElfFloppyBack + +### ElfEarrings + +### ElfEarringsFront + +### ElfEarringsBack + +### Earrings + +### EarringsBack + +### BunnyEars + +### EarsInner + +### KittyEars + +### Kitty + +### KittyInner + +### WolfEars + +### Wolf + +### WolfInner + +### FoxEars + +### Fox + +### FoxInner + +### WolfTail + +### KittyTail + +### Kitty2Tail + +### Kitty2 + +### FoxTail + +### Fox2Tail + +### Fox2 + +### Fox3Tail + +### Fox3 + +### Fox4Tail + +### Fox4 + +### Fox5Tail + +### Fox5 + +### Fox6Tail + +### Fox6 + +### Fox7Tail + +### Fox7 + +### CatsuitLower + +### TorsoLower + +### FootRight + +### FootLeft + +### CatsuitUpper + +### TorsoUpper + +### TransparentCatsuit + +### ShortsLeft + +### BanditPouch + +### Pouch + +### BanditKnee + +### Knee + +### BanditChoker + +### Choker + +### Stripe + +### SkirtOver + +### StripeOver + +### StockingLeft + +### FootSockLeftHogtie + +### StripeSockLeft + +### StockingRight + +### FootSockRightKneel + +### StripeSockRight + +### Stockings + +### BlouseLeft + +### BlouseRight + +### SkirtRuffleOver + +### LeatherGloveLeft + +### GloveLeft + +### ForeGloveLeft + +### RimGloveLeft + +### RimForeGloveLeft + +### BandGloveLeft + +### BandForeGloveLeft + +### LeatherGloveRight + +### GloveRight + +### ForeGloveRight + +### RimGloveRight + +### RimForeGloveRight + +### BandGloveRight + +### BandForeGloveRight + +### LeatherGloves + +### RibbonFarBack + +### KiguMask + +### Mask + +### Lock + +### EyesWhites + +### Swimsuit + +### SwimsuitChest + +### StrappyBra + +### ChestStrappy + +### VBikini + +### StrappyBikini + +### StrappyLower + +### StrappyHarness + +### Strappy + +### StrappySwimsuit + +### BunnySockLeft + +### BunnySockRight + +### BunnySocks + +### BunnySocksRestraint + +### BunnyGloveLeft + +### BunnyGloveRight + +### BunnyGloves + +### BunnyGlovesRestraint + +### BunnyLeotard + +### Leotard + +### LeotardChest + +### LaceCorset + +### LaceCorsetHardware + +### LaceCorsetStripes + +### LaceCorsetCrystal + +### LaceBra + +### LaceChest + +### LaceChestCups + +### LaceChestStripes + +### LaceBustier + +### LaceDeco + +### LaceChestDeco + +### LaceChestDecoCrystal + +### LaceChestDecoHardware + +### LaceBraDeco + +### LaceCorsetRestraint + +### LaceBustierRestraint + +### LaceBraDecoRestraint + +### BowCorsetBow + +### BowCorsetBust + +### BowCorsetBustRuffle + +### BowCorsetBustBow + +### BowCorset + +### BowCorsetRuffle + +### BowCorsetLong + +### BowCorsetLongRuffle + +### BowCorsetOverbust + +### BowCorsetLongOverbust + +### BowCorsetOverbustBow + +### BowCorsetLongOverbustBow + +### BowCorsetRestraint + +### BowCorsetBowRestraint + +### BowCorsetOverbustRestraint + +### BowCorsetOverbustBowRestraint + +### BowCorsetLongOverbustRestraint + +### BowCorsetLongOverbustBowRestraint + +### LatexCorset + +### HeavyCorset + +### LatexBra + +### ChestHeavyCorset + +### LatexBraStraps + +### StrapsHeavyCorset + +### LatexBraStrapsCross + +### CrossHeavyCorset + +### LatexBustier + +### LatexCorsetFull + +### LatexCorsetStrap + +### LatexCorsetFullStrap + +### LatexCorsetCross + +### LatexCorsetFullCross + +### LatexCorsetRestraint + +### LatexBustierRestraint + +### LatexCorsetFullRestraint + +### LatexCorsetStrapRestraint + +### LatexCorsetCrossRestraint + +### LatexCorsetFullStrapRestraint + +### LatexCorsetFullCrossRestraint + +### LacePanties + +### LaceCrotchPanel + +### LaceCrotchPanelTrim + +### LaceCrotchPanelLace + +### DressSkirt + +### BindingDress + +### BlouseCollar + +### DressBlouseBust + +### BlouseTorso + +### BlouseSkirt + +### BlouseSkirtOverKneel + +### BlouseNeck + +### DressBlouseBustCropped + +### CroppedBlouseTorso + +### DressBlouseSleeveLeft + +### BlouseArmLeft + +### BlouseForeArmLeft + +### DressBlouseSleeveRight + +### BlouseArmRight + +### BlouseForeArmRight + +### DressBlouseSleeves + +### DressBlouse + +### Glasses + +### GlassesLens + +### MonocleLeft + +### MonocleLensLeft + +### MonocleRight + +### MonocleLensRight + +### DressShoes + +### LeatherMittenLeft + +### LeatherLeft + +### BandLeft + +### LockLeft + +### LeatherMittenRight + +### LeatherRight + +### BandRight + +### LockRight + +### LatexMittenLeft + +### LatexLeft + +### ZipperLeft + +### LatexMittenRight + +### LatexRight + +### ZipperRight + +### LeatherPawMittenLeft + +### PawLeft + +### LeatherPawMittenRight + +### PawRight + +### LeatherMittens + +### LeatherPawMittens + +### LatexMittens + +### LongMittenLeft + +### LongLeft + +### LongMittenRight + +### LongRight + +### LongMittens + +### ElfPanties + +### ElfTop + +### ElfBra + +### ElfCollar + +### ElfCollarRestraint + +### ElfCirclet + +### Circlet + +### Gem + +### ElfSkirtBack + +### SkirtBack + +### ElfSkirt + +### SkirtBand + +### ElfShoes + +### CrystalShoeLeft + +### CrystalShoeRight + +### ElfBandLeft + +### ElfBandRight + +### ElfBands + +### SteelYoke + +### Steel + +### SteelBar + +### RopeCrosstie1 + +### ArmStrap + +### Arm1 + +### ForeArm1 + +### RopeBoxtie1 + +### RopeWristtie1 + +### RopeChestStraps1 + +### Arm2 + +### ForeArm2 + +### RopeBoxtie2 + +### RopeWristtie2 + +### RopeChestStraps2 + +### ArmHarness + +### ArmStrapHarness + +### ArmHarnessUp + +### RopeBoxtie3 + +### RopeWristtie3 + +### RopeCuffs + +### Cuffs + +### RopeBelt + +### RopeHarness + +### Harness + +### HarnessLower + +### HarnessLowerStrap + +### RopeCrotch + +### Crotchrope + +### CrotchropeStrap + +### RopeToes + +### Toe + +### RopeFeet + +### RopeFeetHeavy + +### RopeAnkles1 + +### Calf1 + +### RopeAnkles2 + +### Calf2 + +### RopeAnkles3 + +### Calf3 + +### RopeLegs1 + +### Thigh1 + +### RightThigh1 + +### RopeLegs2 + +### Thigh2 + +### RightThigh2 + +### RopeLegs3 + +### Thigh3 + +### RightThigh3 + +### RibbonCrosstie1 + +### RibbonBoxtie1 + +### RibbonWristtie1 + +### RibbonChestStraps1 + +### RibbonBoxtie2 + +### RibbonWristtie2 + +### RibbonChestStraps2 + +### ArmHarnessUnderbust + +### RibbonCuffs + +### RibbonHarness + +### HarnessMid + +### RibbonCrotch + +### Crotch + +### CrotchStrap + +### RibbonToes + +### RibbonFeet + +### RibbonFeetHeavy + +### RibbonAnkles1 + +### RibbonAnkles2 + +### RibbonAnkles3 + +### RibbonLegs1 + +### RibbonLegs2 + +### RibbonLegs3 + +### ShacklesWristLeft + +### ShacklesWristRight + +### ShacklesWrists + +### ShacklesElbowLeft + +### ElbowLeft + +### ShacklesElbowRight + +### ElbowRight + +### ShacklesElbows + +### ShacklesArms + +### ShacklesAnklesLeft + +### AnkleLeft + +### ShacklesAnklesRight + +### AnkleRight + +### ShacklesAnkles + +### ShacklesThighLeft + +### ThighLeft + +### ShacklesThighRight + +### ThighRight + +### ShacklesThigh + +### ThighLink + +### AnkleLink + +### IronCollar + +### SteelCollar + +### SteelCollarRunes + +### IronBelt + +### WolfPanties + +### WolfCollar + +### CollarBand + +### WolfCollarTag + +### CollarHardware + +### CollarTag + +### WolfCollarSmall + +### FCollar + +### FCollarBand + +### WolfCollarSmallTag + +### FCollarHardware + +### FCollarTag + +### WolfHarnessUpper + +### HarnessUpper + +### HarnessBandUpper + +### WolfHarnessBelt + +### BeltMid + +### BeltBandMid + +### BeltHardwareMid + +### WolfHarnessLower + +### HarnessHardwareMid + +### HarnessBandLower + +### HarnessHardwareLower + +### WolfHarness + +### WolfCuffsAnklesLeft + +### BandAnkleLeft + +### WolfCuffsAnklesRight + +### BandAnkleRight + +### WolfCuffsAnkles + +### WolfCollarRestraint + +### WolfCollarTagRestraint + +### WolfCollarSmallRestraint + +### WolfCollarSmallTagRestraint + +### WolfPantiesRestraint + +### WolfHarnessLowerRestraint + +### WolfHarnessUpperRestraint + +### WolfHarnessBeltRestraint + +### WolfHarnessRestraint + +### WolfGloveLeft + +### WolfGloveRight + +### WolfGloves + +### WolfSockLeft + +### WolfSockRight + +### WolfSocks + +### WolfSocksRestraint + +### WolfTorsoLower + +### WolfTorsoUpper + +### WolfHeels + +### CuffsWristLeft + +### BandWristLeft + +### HardwareWristLeft + +### CuffsWristRight + +### BandWristRight + +### HardwareWristRight + +### CuffsWrists + +### CuffsElbowLeft + +### BandElbowLeft + +### HardwareElbowLeft + +### CuffsElbowRight + +### BandElbowRight + +### HardwareElbowRight + +### CuffsElbows + +### CuffsArms + +### CuffsAnklesLeft + +### HardwareAnkleLeft + +### CuffsAnklesRight + +### HardwareAnkleRight + +### CuffsAnkles + +### CuffsThighLeft + +### BandThighLeft + +### HardwareThighLeft + +### CuffsThighRight + +### BandThighRight + +### HardwareThighRight + +### CuffsThigh + +### LeatherCollar + +### BandCollar + +### HardwareCollar + +### LeatherCollarBell + +### BellCollar + +### LeatherCollarBow + +### BowBellCollar + +### BowCollar + +### LeatherBelt + +### BandBelt + +### HardwareBelt + +### SlimeMouth + +### FaceMouth + +### SlimeEyes + +### FaceEyes + +### SlimeHead + +### FaceFull + +### SlimeBoots + +### SlimeTorsoLower + +### SlimeThighs + +### SlimeLegs + +### SlimeFeet + +### SlimeArmLeft + +### SlimeArmRight + +### SlimeTorsoUpper + +### SlimeArms + +### SlimeHandLeft + +### SlimeHandRight + +### SlimeHands + +### RubberMouth + +### RubberEyes + +### RubberHead + +### RubberBoots + +### RubberTorsoLower + +### RubberThighs + +### RubberLegs + +### RubberFeet + +### RubberArmLeft + +### RubberArmRight + +### RubberTorsoUpper + +### RubberArms + +### RubberHandLeft + +### RubberHandRight + +### RubberHands + +### TapeMedBoots + +### TapeMedAnkles + +### TapeMedLegs + +### RightLegs + +### StrapCover + +### TapeMedBottom + +### TapeMedArms + +### Top + +### TapeFullArms + +### TopFull + +### ChestFull + +### ArmFullLeft + +### ArmFullRight + +### TapeMedHandLeft + +### TapeMedHandRight + +### TapeHeavyBoots + +### TapeHeavyAnkles + +### TapeHeavyLegs + +### TapeHeavyBottom + +### Bottom + +### TapeHeavyBottomFull + +### TapeHeavyArms + +### TapeHeavyArmsFull + +### TapeHeavyHandLeft + +### TapeHeavyHandRight + +### TapeHeavyHands + +### TapeBoots + +### TapeAnkles + +### TapeLegs + +### TapeBottom + +### TapeTorsoUpper + +### TapeArmLeft + +### TapeArmRight + +### TapeArms + +### TapeStrapArms + +### TopStrap + +### ChestStrap + +### ArmStrapLeft + +### ArmStrapRight + +### TapeStrappedArms + +### TapeHandLeft + +### TapeHandRight + +### BraProto + +### BraProtoLining + +### BraProtoLiningMid + +### BraProtoCups + +### BraProtoDisplay + +### BraProtoLock + +### BraCyber + +### BraCyberLining + +### BraCyberDisplay + +### BraCyberLock + +### ChastityBra + +### BraCups + +### BraLining + +### BraChain + +### BraLock + +### HeartBelt + +### BeltLining + +### BeltLock + +### BeltStrap + +### BeltStrapLining + +### CyberBelt + +### CyberLining + +### CyberDisplay + +### CyberPlug + +### CyberLock + +### ProtoBelt + +### Proto + +### ProtoLining + +### ProtoDisplay + +### ProtoPlug + +### ProtoLock + +### SmoothArmbinder + +### BinderLeft + +### BinderRight + +### Armbinder + +### StrapsLeft + +### StrapsRight + +### ArmbinderCross + +### Cross + +### SmoothArmbinderCross + +### ArmbinderSecure + +### SmoothArmbinderSecure + +### ArmbinderGwen + +### Gwen + +### SmoothArmbinderGwen + +### WolfArmbinder + +### JacketArmbinder + +### BeltsArms + +### Jacket + +### BeltsChest + +### JacketHeavy + +### BinderTorsoLower + +### BeltsTorsoLower + +### CrotchBelts + +### JacketStraps + +### StrapsArms + +### StrapsChest + +### StrapsUnderbust + +### JacketArmbinderSecure + +### JacketBolero + +### ChestBolero + +### JacketLeotard + +### LatexLower + +### LatexChest + +### LatexUpper + +### Legbinder + +### LegLegbinder + +### RightLegbinder + +### LegRightLegbinder + +### LacesLegbinder + +### TapeFace + +### ClothBlindfold + +### Cloth + +### BlindfoldBasic + +### Basic + +### BasicRim + +### BlindfoldLeather + +### LeatherBase + +### LeatherRim + +### KittyBlindfold + +### KittyEyes + +### BlindfoldTape + +### Tape + +### BalletHeels + +### BalletLeft + +### BalletRight + +### BalletSoleLeft + +### BalletSoleRight + +### BalletLaceLeft + +### BalletLaceRight + +### FlatBalletHeels + +### FlatBalletLeft + +### FlatBalletRight + +### ShinyBalletHeels + +### ShinyBalletLeft + +### ShinyBalletRight + +### BalletHeelsRestraint + +### FlatBalletHeelsRestraint + +### ShinyBalletHeelsRestraint + +### LeatherHeels + +### LeatherLegLeft + +### LeatherLegRight + +### TallHeels + +### TallLeft + +### TallRight + +### TallLegLeft + +### TallLegRight + +### TallHeelsRestraint + +### Legirons + +### LegironsLeft + +### LegironsRight + +### Irish8Ankle + +### Irish8AnkleLeft + +### Irish8AnkleRight + +### HandCuffs + +### CuffsLock + +### HingedCuffs + +### Irish8Cuffs + +### WolfCuffs + +### WolfCuffsChain + +### HarnessTop + +### BeltsTop + +### HardwareTop + +### BeltsMid + +### HardwareMid + +### HarnessStrap + +### BeltsStrap + +### HardwareStrap + +### BeltsOverbust + +### BeltsUnderbust + +### HardwareUnderbustOver + +### HardwareUnderbust + +### FutureHarnessChest + +### DisplayChest + +### MetalChest + +### FutureHarnessMid + +### StrapsMid + +### DisplayMid + +### MetalMid + +### FutureHarnessLower + +### StrapsLower + +### DisplayLower + +### MetalLower + +### FutureHarness + +### ClothCollar + +### ClothCollarTag + +### ClothBelt + +### ClothBeltLines + +### BeltLines + +### MaidGag + +### FrillyPanel + +### FrillyStraps + +### FrillyHardware + +### FrillyHighlights + +### DusterGag + +### Duster + +### GhostGag + +### Ball + +### Strap + +### BallGag + +### BallGagHarness + +### BallGagHarnessSecure + +### SideStrap + +### LargeBallGag + +### LargeBallGagHarness + +### LargeBallGagHarnessSecure + +### PanelGag + +### Panel + +### PanelGagHarness + +### PanelGagHarnessSecure + +### MuzzleGag + +### Muzzle + +### MuzzleGagHarness + +### MuzzleGagHarnessSecure + +### PlugGagPlug + +### PlugMuzzleGag + +### PlugMuzzleGagHarness + +### PlugMuzzleGagHarnessSecure + +### PlugPanelGag + +### PlugPanelGagHarness + +### PlugPanelGagHarnessSecure + +### TapeFull + +### TapeWrap + +### Wrap + +### TapeFullOver + +### TapeWrapOver + +### TapeCleave + +### Cleave + +### ClothCleave + +### ClothCleaveThick + +### CleaveThick + +### ClothKnot + +### Knot + +### ClothOTN + +### OTN + +### ClothOTM + +### OTM + +### GagLatex + +### GagLatexFlat + +### OTNFlat + +### GagLatexFlatHarness + +### GagLatexFlatHarnessSecure + +### GagLatexPlug + +### GagLatexPlugHarness + +### GagLatexPlugHarnessSecure + +### LatexNeckCorset + +### NeckCorset + +### NeckCorsetRim + +### LatexNeckCorsetGag + +### LatexNeckCorsetRestraint + +### LatexNeckCorsetGagRestraint + +### LatexNeckCorsetPlugGag + +### GagMetal + +### GagFabric + +### FabricMuzzle + +### KittyMuzzle + +### KittyMouth + +### Whiskers + +### KittyHarnessPanelGag + +### GagComfy + +### GagMetalRiveted + +### OTNRivets + +### SmoothBallGag + +### SmoothBallGagHarness + +### SmoothBallGagHarnessSecure + +### SmoothLargeBallGag + +### SmoothLargeBallGagHarness + +### SmoothLargeBallGagHarnessSecure + +### SegmentedLargeBallGag + +### SegmentedLargeBallGagHarness + +### SegmentedLargeBallGagHarnessSecure + +### SciFiBallGag + +### TopRim + +### Display + +### EnhancedSciFiBallGag + +### AdvancedSciFiBallGag + +### HarnessRim + +### HarnessDisplay + +### UltimateSciFiBallGag + +### UltimateSciFiBallGag2 + +### SegmentedLargePanelGag + +### SegmentedLargePanelGagHarness + +### SegmentedLargePanelGagHarnessSecure + +### SciFiPanelGag + +### AdvancedSciFiPanelGag + +### UltimateSciFiPanelGag + +### UltimateSciFiPanelGag2 + +### SegmentedPlugGag + +### SegmentedPlugGagHarness + +### SegmentedPlugGagHarnessSecure + +### SciFiPlugGag + +### AdvancedSciFiPlugGag + +### UltimateSciFiPlugGag + +### UltimateSciFiPlugGag2 + +### SimpleSciFiMuzzle + +### AdvancedSciFiMuzzle + +### SciFiPlugMuzzle + +### AdvancedSciFiPlugMuzzle + +### SimpleSciFiMuzzle2 + +### AdvancedSciFiMuzzle2 + +### BeltsArms1 + +### Arms1 + +### LeftArm1 + +### RightArm1 + +### BeltsArms2 + +### Arms2 + +### LeftArm2 + +### RightArm2 + +### BeltsArmsAll + +### BeltsLegs1 + +### Legs1 + +### RightLegs1 + +### BeltsLegs2 + +### Legs2 + +### RightLegs2 + +### BeltsLegsAll + +### BeltsFeet1 + +### Feet1 + +### BeltsFeet2 + +### Feet2 + +### BeltsFeetAll + +### ShadowHandsArms1 + +### ShadowHandsArms2 + +### ShadowHandsArmsAll + +### ShadowHandsLegs1 + +### ShadowHandsLegs2 + +### ShadowHandsLegsAll + +### ShadowHandsFeet + +### ShadowHandsMouth + +### ShadowHandsEyes + +### ShadowHandsCrotch + +### Cage + +### CageFront + +### CageBack + +### SarcoFront + +### SarcoWebs + +### SarcoBack + +### LatexCube + +### LatexCubeBack + +### Barrel + +### DisplayStand + +### DisplayFront + +### OneBarPrison + +### OneBarFront + +### OneBarBack + +### StardustCollar + +### MikoCollar + +### FutureCollar + +### Future + +### FutureBand + +### FutureDisplay + +### FutureRim + +### FutureLock + +### FutureCollarRestraint + +### ShockModule + +### Module + +### ModuleDisplay + +### TrackingModule + +### TrackingModuleDisplay + +### Goggles + +### GogglesRestraint + +### FullVisor + +### DollmakerFull + +### FullVisorRim + +### DollmakerFullRim + +### FullVisorRestraint + +### FullVisorRimRestraint + +### GasMask + +### Valves + +### Center + +### Nose + +### Plugs + +### GasMaskRestraint + +### Petsuit + +### LeftLegs + + + +### Braid_Overstrap + +### BraidBack + +### BackShortMessy + +### BackShortMessyUnderlight + +### KjusEyes2 + +### KjusEyes3 + +### KjusEyes4 + +### CatsuitLowerLowRise + +### TorsoLowerLowRise + +### SleevelessCatsuitUpper + +### SleevelessTorsoUpper + +### CatsuitTop + +### SleevelessTop + +### SleevelessTopChest + +### CatsuitTopV + +### SleevelessTopV + +### SleevelessTopVChest + +### CatsuitUpperCropped + +### TorsoUpperCrop + +### TransparentCatsuitUpper + +### TransparentCatsuitUpperCropped + +### TransparentCatsuitLower + +### TransparentCatsuitLowerLowRise + +### BunnyLeotardHigh + +### HighLeotard + +### FashionIronCollar + +### FashionIronBelt + +### FashionSteelCollarRunes + +### FashionSteelCollar + +### FashionShacklesWristLeft + +### FashionShacklesWristRight + +### FashionShacklesWrists + +### FashionShacklesElbowLeft + +### FashionShacklesElbowRight + +### FashionShacklesElbows + +### FashionShacklesArms + +### FashionShacklesAnklesLeft + +### FashionShacklesAnklesRight + +### FashionShacklesAnkles + +### FashionShacklesThighLeft + +### FashionShacklesThighRight + +### FashionShacklesThigh + +### FashionThighLink + +### FashionAnkleLink + +### FashionLeatherCollar + +### FashionLeatherBelt + +### FashionLeatherCollarBell + +### FashionLeatherCollarBow + +### FashionCuffsWristLeft + +### FashionCuffsWristRight + +### FashionCuffsWrists + +### FashionCuffsElbowLeft + +### FashionCuffsElbowRight + +### FashionCuffsElbows + +### FashionCuffsArms + +### FashionCuffsAnklesLeft + +### FashionCuffsAnklesRight + +### FashionCuffsAnkles + +### FashionCuffsThighLeft + +### FashionCuffsThighRight + +### FashionCuffsThigh + +### LatexTop + +### BraProtoLiningRim + +### BraProtoLiningMidRim + +### LatexTopZip + +### BraProtoLiningZip + +### BraProtoLiningMidZip + +### BraProtoLiningZipRim + +### BraProtoLiningMidZipRim + +### FashionGagMetal + +### FashionGagMetalRiveted + +### FashionGagFabric + +### FashionKittyMuzzle + +### FashionSimpleSciFiMuzzle + +### FashionAdvancedSciFiMuzzle2 + +### FashionAdvancedSciFiMuzzle + +### FashionSimpleSciFiMuzzle2 + + + +### Hairband2 + +### BraidCustom + +### BraidCustom_Overstrap + +### BraidCustomBack + +### BraidCustomBraid + +### BackShortCurly + +### BackShortCurlyUnderlight + +### AuraHair + +### HairAura_Front + +### HairAura + +### AuraBang_Left + +### HairAura_Left + +### HairAura_LeftB + +### AuraBang_Right + +### HairAura_Right + +### HairAura_RightB + +### AuraBang_Left_Back + +### AuraBang_Right_Back + +### Hair2 + +### Hair2_Front + +### Hair2_FrontB + +### Hair2_FrontC + +### Hair2_LeftPuff + +### Hair2_Left + +### Hair2_RightPuff + +### Hair2_Right + +### Hair3 + +### Hair3_FrontA + +### Hair3_FrontC + +### Hair3_FrontD + +### Hair3_Short + +### Hair3_Bangs + +### Hair3_FrontE + +### Hair3Back + +### Hair3_Back + +### Hair4 + +### Hair4_Front + +### Hair4_FrontB + +### Hair4_TailLeft + +### Hair4_Left + +### Hair4_LeftB + +### Hair4_TailRight + +### Hair4_Right + +### Hair4_RightB + +### Hair5 + +### Hair5_Front + +### Hair5_FrontB + +### Hair5_FrontC + +### Hair5_Highlight + +### Hair5_FrontD + +### Hair5_TailLeft + +### Hair5_Left + +### Hair5_TailRight + +### Hair5_Right + +### Hair6 + +### Hair6_Front + +### Hair6_FrontB + +### Hair6_TailLeft + +### Hair6_Left + +### Hair6_TailRight + +### Hair6_Right + +### Butt2 + +### EarsFront + +### CatsuitLowerLeotard + +### TorsoLowerLeotard + +### TransparentCatsuitLowerLeotard + +### ChainBikini + +### ChainSkirt2 + +### SkirtBeltDeco + +### SkirtBeltRivets + +### Skirt2 + +### FashionKiguMask + +### SwimsuitUnder + +### BunnyLeotardUnder + +### BunnyLeotardHighUnder + +### LeatherLeotardTop + +### LeatherLeotardBottom + +### LeatherLeotardCorset + +### LeotardCorset + +### Laces + +### LeatherLeotard + +### LeatherLeotardStrapsUpper + +### LeatherLeotardStrapsLower + +### StrapsHardware + +### LeatherLeotardStrapsLowerClean + +### StrapsLowerClean + +### OperaGloveLeft + +### OperaGloveRight + +### OperaGloves + +### OperaGlovesRestraint + +### SailorCollar + +### CollarStripe + +### SailorCollarFull + +### Bust + +### BustStripe + +### SailorBow + +### SailorTop + +### SailorSleeveLeft + +### HemLeft + +### SailorSleeveRight + +### HemRight + +### SailorSleeves + +### SailorShirt + +### Sailor + +### DressSkirtSplitNoBelt + +### SkirtSplit + +### SkirtSplitOver + +### DressSkirtSplit + +### SkirtSplitBelt + +### BlouseSkirtLone + +### Sunglasses + +### MageSkirt + +### Band + +### MageSkirtOver + +### MageCorset + +### MageCorsetStripes + +### MageBra + +### MageBraStripes + +### MageTop + +### MageCollar + +### MageCollarCrystal + +### MageCollarHardware + +### MageCollar2 + +### MageCollarTie + +### Mage + +### ChineseDress + +### Highlights + +### DressSkirtOverKneel + +### ChineseBra + +### ChineseTop + +### YukataWaist + +### Waist + +### WaistBand + +### YukataWaistPattern + +### WaistPattern + +### YukataTop + +### YukataSleeveLeft + +### YukataSleeveRight + +### YukataSleeves + +### YukataShirt + +### YukataSkirt + +### Yukata + +### YukataPattern + +### ForeLongMittenLeft + +### ForeLongMittenRight + +### FashionLeatherMittens + +### FashionLeatherPawMittens + +### FashionLatexMittens + +### FashionLongMittens + +### HeavyYoke + +### HeavySteel + +### HeavySteelPins + +### HeavySteelLock + +### HeavySteelHardware + +### HeavyFiddle + +### FiddleLines + +### FiddleBody + +### FiddleLock + +### BackFiddleLines + +### BackFiddleBody + +### RopeSuspension + +### Suspension + +### FashionRopeHarness + +### FashionRopeCrotch + +### FashionRopeChestStraps2 + +### FashionRibbonHarness + +### FashionRibbonCrotch + +### IronCollarClip + +### FashionIronCollarClip + +### QuakeCollar + +### QuakeCollarRestraint + +### BuckleCorset + +### BuckleCorsetBuckles + +### BuckleCorsetHardware + +### BuckleCorsetRestraint + +### StripedSkirt + +### StripedSkirtUnder + +### StripedSkirtOver + +### StripedSkirtUnderOver + +### ApronSkirt + +### MaidSkirt + +### MaidSkirtOver + +### ApronSkirtOver + +### LegRimLeft + +### LegBandLeft + +### LegPadsLeft + +### LegRimRight + +### LegBandRight + +### LegPadsRight + +### TorsoLowerRim + +### TorsoLowerBand + +### TorsoUpperCups + +### ChestRim + +### ChestBand + +### TorsoUpperBand + +### TorsoUpperRim + +### DivineCuffsWristLeft + +### WristLeftDeco + +### WristLeftLock + +### WristLeftLockPlate + +### WristLeftLockBand + +### DivineCuffsWristRight + +### WristRightDeco + +### WristRightLock + +### WristRightLockPlate + +### WristRightLockBand + +### DivineCuffsWrists + +### DivineCuffsElbowLeft + +### ElbowLeftDeco + +### ElbowLeftLock + +### ElbowLeftLockPlate + +### ElbowLeftLockBand + +### DivineCuffsElbowRight + +### ElbowRightDeco + +### ElbowRightLock + +### ElbowRightLockPlate + +### ElbowRightLockBand + +### DivineCuffsElbows + +### DivineCuffsArms + +### DivineCuffsAnklesLeft + +### AnkleLeftDeco + +### AnkleLeftLock + +### AnkleLeftLockPlate + +### AnkleLeftLockBand + +### DivineCuffsAnklesRight + +### AnkleRightDeco + +### AnkleRightLock + +### AnkleRightLockPlate + +### AnkleRightLockBand + +### DivineCuffsAnkles + +### DivineCuffsThighLeft + +### ThighLeftDeco + +### ThighLeftLock + +### ThighLeftLockPlate + +### ThighLeftLockBand + +### DivineCuffsThighRight + +### ThighRightDeco + +### ThighRightLock + +### ThighRightLockPlate + +### ThighRightLockBand + +### DivineCuffsThigh + +### DivineCollar + +### CollarDeco + +### CollarLock + +### CollarLockPlate + +### CollarLockBand + +### DivineBelt + +### BeltMetal2 + +### BeltMetal1 + +### BeltBase + +### BeltPin + +### LockBeltLines + +### LockBeltPlate + +### LockBeltShackle + +### LockBeltHighlight + +### FashionDivineCollar + +### FashionDivineBelt + +### FashionDivineCuffsWristLeft + +### FashionDivineCuffsWristRight + +### FashionDivineCuffsWrists + +### FashionDivineCuffsElbowLeft + +### FashionDivineCuffsElbowRight + +### FashionDivineCuffsElbows + +### FashionDivineCuffsArms + +### FashionDivineCuffsAnklesLeft + +### FashionDivineCuffsAnklesRight + +### FashionDivineCuffsAnkles + +### FashionDivineCuffsThighLeft + +### FashionDivineCuffsThighRight + +### FashionDivineCuffsThigh + +### DivineCuffsCleanWristLeft + +### WristLeftDecoClean + +### DivineCuffsCleanWristRight + +### WristRightDecoClean + +### DivineCuffsCleanWrists + +### DivineCuffsCleanElbowLeft + +### ElbowLeftDecoClean + +### DivineCuffsCleanElbowRight + +### ElbowRightDecoClean + +### DivineCuffsCleanElbows + +### DivineCuffsCleanArms + +### DivineCuffsCleanAnklesLeft + +### AnkleLeftDecoClean + +### DivineCuffsCleanAnklesRight + +### AnkleRightDecoClean + +### DivineCuffsCleanAnkles + +### DivineCuffsCleanThighLeft + +### ThighLeftDecoClean + +### DivineCuffsCleanThighRight + +### ThighRightDecoClean + +### DivineCuffsCleanThigh + +### DivineCollarClean + +### CollarDecoClean + +### DivineBeltClean + +### BeltDecoClean + +### BeltLockPlate + +### BeltLockBand + +### FashionDivineCollarClean + +### FashionDivineBeltClean + +### FashionDivineCuffsCleanWristLeft + +### FashionDivineCuffsCleanWristRight + +### FashionDivineCuffsCleanWrists + +### FashionDivineCuffsCleanElbowLeft + +### FashionDivineCuffsCleanElbowRight + +### FashionDivineCuffsCleanElbows + +### FashionDivineCuffsCleanArms + +### FashionDivineCuffsCleanAnklesLeft + +### FashionDivineCuffsCleanAnklesRight + +### FashionDivineCuffsCleanAnkles + +### FashionDivineCuffsCleanThighLeft + +### FashionDivineCuffsCleanThighRight + +### FashionDivineCuffsCleanThigh + +### SteelCuffsWristLeft + +### RimWristLeft + +### SteelCuffsWristRight + +### RimWristRight + +### SteelCuffsWrists + +### SteelCuffsElbowLeft + +### RimElbowLeft + +### SteelCuffsElbowRight + +### RimElbowRight + +### SteelCuffsElbows + +### SteelCuffsArms + +### SteelCuffsAnklesLeft + +### RimAnkleLeft + +### SteelCuffsAnklesRight + +### RimAnkleRight + +### SteelCuffsAnkles + +### SteelCuffsThighLeft + +### RimThighLeft + +### SteelCuffsThighRight + +### RimThighRight + +### SteelCuffsThigh + +### NeoSteelCollar + +### RimCollar + +### NeoSteelBelt + +### RimBelt + +### FashionNeoSteelCollar + +### FashionNeoSteelBelt + +### FashionSteelCuffsWristLeft + +### FashionSteelCuffsWristRight + +### FashionSteelCuffsWrists + +### FashionSteelCuffsElbowLeft + +### FashionSteelCuffsElbowRight + +### FashionSteelCuffsElbows + +### FashionSteelCuffsArms + +### FashionSteelCuffsAnklesLeft + +### FashionSteelCuffsAnklesRight + +### FashionSteelCuffsAnkles + +### FashionSteelCuffsThighLeft + +### FashionSteelCuffsThighRight + +### FashionSteelCuffsThigh + +### CyberCuffsWristLeft + +### ScreenWristLeft + +### DisplayWristLeft + +### LockWristLeft + +### CyberCuffsWristRight + +### ScreenWristRight + +### DisplayWristRight + +### LockWristRight + +### CyberCuffsWrists + +### CyberCuffsElbowLeft + +### ScreenElbowLeft + +### DisplayElbowLeft + +### LockElbowLeft + +### CyberCuffsElbowRight + +### ScreenElbowRight + +### DisplayElbowRight + +### LockElbowRight + +### CyberCuffsElbows + +### CyberCuffsArms + +### CyberCuffsAnklesLeft + +### ScreenAnkleLeft + +### DisplayAnkleLeft + +### LockAnkleLeft + +### CyberCuffsAnklesRight + +### ScreenAnkleRight + +### DisplayAnkleRight + +### LockAnkleRight + +### CyberCuffsAnkles + +### CyberCuffsThighLeft + +### ScreenThighLeft + +### DisplayThighLeft + +### LockThighLeft + +### CyberCuffsThighRight + +### ScreenThighRight + +### DisplayThighRight + +### LockThighRight + +### CyberCuffsThigh + +### NeoCyberCollar + +### ScreenCollar + +### DisplayCollar + +### LockCollar + +### CyberLinkCollar + +### LinkCollar + +### ScreenLinkCollar + +### DisplayLinkCollar + +### LockLinkCollar + +### NeoCyberBelt + +### ScreenBelt + +### DisplayBelt + +### LockBelt + +### FashionNeoCyberCollar + +### FashionCyberLinkCollar + +### FashionNeoCyberBelt + +### FashionCyberCuffsWristLeft + +### FashionCyberCuffsWristRight + +### FashionCyberCuffsWrists + +### FashionCyberCuffsElbowLeft + +### FashionCyberCuffsElbowRight + +### FashionCyberCuffsElbows + +### FashionCyberCuffsArms + +### FashionCyberCuffsAnklesLeft + +### FashionCyberCuffsAnklesRight + +### FashionCyberCuffsAnkles + +### FashionCyberCuffsThighLeft + +### FashionCyberCuffsThighRight + +### FashionCyberCuffsThigh + +### CrystalCuffsWristLeft + +### CrystalCuffsWristRight + +### CrystalCuffsWrists + +### CrystalCuffsElbowLeft + +### CrystalCuffsElbowRight + +### CrystalCuffsElbows + +### CrystalCuffsArms + +### CrystalCuffsAnklesLeft + +### CrystalCuffsAnklesRight + +### CrystalCuffsAnkles + +### CrystalCuffsThighLeft + +### CrystalCuffsThighRight + +### CrystalCuffsThigh + +### CrystalCollar + +### CrystalBelt + +### FashionCrystalCollar + +### FashionCrystalBelt + +### FashionCrystalCuffsWristLeft + +### FashionCrystalCuffsWristRight + +### FashionCrystalCuffsWrists + +### FashionCrystalCuffsElbowLeft + +### FashionCrystalCuffsElbowRight + +### FashionCrystalCuffsElbows + +### FashionCrystalCuffsArms + +### FashionCrystalCuffsAnklesLeft + +### FashionCrystalCuffsAnklesRight + +### FashionCrystalCuffsAnkles + +### FashionCrystalCuffsThighLeft + +### FashionCrystalCuffsThighRight + +### FashionCrystalCuffsThigh + +### Hobbleskirt + +### FashionBraProto + +### FashionBraCyber + +### FashionChastityBra + +### FashionHeartBelt + +### FashionCyberBelt + +### FashionProtoBelt + +### DivineBeltRunic + +### BeltMetalRunic2 + +### BeltMetalRunic1 + +### FashionDivineBeltRunic + +### DivineBra + +### BraLines + +### BraBase1 + +### BraBase2 + +### BraMetal1 + +### BraMetal2 + +### BraPins + +### BraStraps + +### LockBraLines + +### LockBraPlate + +### LockBraShackle + +### LockBraHighlight + +### FashionDivineBra + +### DivineBraRunic + +### BraMetalRunic1 + +### BraMetalRunic2 + +### BraStrapsRunic + +### FashionDivineBraRunic + +### SteelChastityBelt_Padlock + +### BeltPadlock + +### BeltPadlockPin + +### SteelChastityBelt_Radial + +### BeltRadial + +### SteelChastityBelt_Segu + +### BeltSegu + +### FashionSteelChastityBelt_Padlock + +### FashionSteelChastityBelt_Radial + +### FashionSteelChastityBelt_Segu + +### SteelChastityBra_Padlock + +### BraPadlock + +### BraPadlockPin + +### SteelChastityBra_Radial + +### BraRadial + +### SteelChastityBra_Segu + +### BraSegu + +### FashionSteelChastityBra_Padlock + +### FashionSteelChastityBra_Radial + +### FashionSteelChastityBra_Segu + +### JacketLowerStraps + +### JacketExtraStraps + +### StrapsTorsoLowerExtra + +### CrotchBeltExtra + +### StrapsChestExtra + +### JacketHeavyStraps + +### JacketLower + +### JacketExtra + +### JacketHeavyArmbinder + +### JacketExtraArmbinder + +### JacketHeavyBolero + +### JacketExtraBolero + +### JacketHeavyLeotard + +### JacketExtraLeotard + +### RightLacesLegbinder + +### LegLacesLegbinder + +### FashionClothBlindfold + +### FashionBlindfoldBasic + +### FashionBlindfoldLeather + +### FashionKittyBlindfold + +### FashionBlindfoldTape + +### SmoothHeels + +### TallBalletHeels + +### TallBalletHeelsRestraint + +### CyberBalletHeels + +### GlowBalletLeft + +### GlowBalletRight + +### CyberBalletHeelsRestraint + +### FashionHarnessTop + +### FashionHarnessMid + +### FashionHarnessStrap + +### FashionHarness + +### LockChest + +### LockMid + +### LockLower + +### FashionFutureHarnessLower + +### FashionFutureHarnessMid + +### FashionFutureHarnessChest + +### FashionFutureHarness + +### ClothTop + +### TopChest + +### TopShoulders + +### ClothBra + +### ClothTopBand + +### TopBandChest + +### TopBandRimChest + +### TopBand + +### TopBandRim + +### ClothBraBand + +### NinjaSkirt + +### SkirtBandOver + +### NinjaSockLeft + +### NinjaSockRight + +### NinjaThighLeft + +### NinjaThighRight + +### NinjaKneeLeft + +### KneeLeft + +### NinjaKneeRight + +### KneeRight + +### NinjaSocks + +### NinjaThighs + +### NinjaKnees + +### NinjaShoes + +### Ninja + +### FashionMaidGag + +### FashionDusterGag + +### FashionBallGag + +### FashionBallGagHarness + +### FashionBallGagHarnessSecure + +### FashionPanelGag + +### FashionPanelGagHarness + +### FashionPanelGagHarnessSecure + +### FashionMuzzleGag + +### FashionMuzzleGagHarness + +### FashionMuzzleGagHarnessSecure + +### FashionPlugMuzzleGag + +### FashionPlugMuzzleGagHarness + +### FashionPlugMuzzleGagHarnessSecure + +### FashionPlugPanelGag + +### FashionPlugPanelGagHarness + +### FashionPlugPanelGagHarnessSecure + +### FashionTapeCleave + +### FashionClothKnot + +### FashionClothCleaveThick + +### FashionClothCleave + +### FashionClothOTN + +### FashionClothOTM + +### GagLatexMute + +### MuteLogo + +### GagLatexMuteHarness + +### GagLatexMuteHarnessSecure + +### FashionGagLatex + +### FashionGagLatexFlat + +### FashionGagLatexFlatHarness + +### FashionGagLatexFlatHarnessSecure + +### FashionGagLatexMute + +### FashionGagLatexMuteHarness + +### FashionGagLatexMuteHarnessSecure + +### FashionGagLatexPlug + +### FashionGagLatexPlugHarness + +### FashionGagLatexPlugHarnessSecure + +### FashionLatexNeckCorsetPlugGag + +### FashionKittyHarnessPanelGag + +### FashionSmoothBallGag + +### FashionSegmentedLargePanelGag + +### FashionSegmentedLargePanelGagHarness + +### FashionSciFiPanelGag + +### FashionAdvancedSciFiPanelGag + +### FashionUltimateSciFiPanelGag + +### FashionUltimateSciFiPanelGag2 + +### FashionSegmentedPlugGag + +### FashionSciFiPlugMuzzle + +### FashionAdvancedSciFiPlugMuzzle + +### DivineGag + +### Teeth + +### Metallic + +### FashionDivineGag + +### DivineGagClean + +### GoldClean + +### FashionDivineGagClean + +### DivineMuzzle + +### MuzzleRim + +### MuzzleGold + +### MuzzleHarness + +### MuzzleCollar + +### FashionDivineMuzzle + +### DivineMuzzleClean + +### MuzzleGoldClean + +### FashionDivineMuzzleClean + +### FutureBox + +### Rim + +### Door + +### DoorWindow + +### DoorNumeral + +### BackFade + +### CrystalEncase + +### EncaseOver + +### EncaseUnder + +### FashionLeash + +### ArmsBelts + +### LegsBelts + +### LeftLegsBelts + +### ElitePetsuit + +### ArmsLaces + +### ArmsHardware + +### LegsLaces + +### LegsHardware + +### LeftLegsLaces + +### LeftLegsHardware + +### CyberPetsuit + +### DisplayArms + +### DisplayLegs + +### DisplayLeftLegs + +### NippleClamps + +### Clamps + +### ClampsBullet + +### NippleClampsRestraint + +### RingVibes + +### Rings + +### RingsBullet + +### RingVibesRestraint + +### NippleWeights + +### Weights + +### NippleWeightsRestraint + +### VibePiercings + +### VibePiercingsBullet + +### VibePiercingsRestraint + +### PostureCollarBasic + +### PostureCollar + +### PostureCollarRim + +### PostureCollarLoop + +### PostureCollarHardware + +### FashionPostureCollarBasic + +### FashionPostureCollar + +### ReverseBinder + +### ReverseBinderLeft + +### ReverseBinderRight + +### ReverseBinderStraps + +### ReverseBinderHardware + +### NightWhip + +### NightWhipLight + +### LatexWhip + +### KittyLatexEar + +### KittyLatexEarLight + +### KittyLatexEarMuff + +### KittyLatexEarMuffLight2 + +### KittyLatexEarMuffLight1 + +### KittyLatexTail + +### KittyLatexTailLight + +### KittyLatexTail2 + +### KittyLatexTail2Light + +### KittyLatex + +### SuccubusWing + +### SuccubusWingBase + +### SuccubusWingBack + +### SuccubusWingLight + +### SuccubusHorn + +### SuccubusHornRight + +### SuccubusHornLeft + +### SuccubusHornLight + +### SuccubusTail + +### SuccubusTailLight + +### SuccubusClaws + +### SuccubusClawLeft + +### SuccubusClawRight + +### SuccubusFeet + +### Succubus + +### SlimeBubble + +### BubbleSquishy + +### BubbleSquishyBack + +### LatexSphere + +### LatexSphereCutaway + +### LatexSphereCutawayBack + +### BallSuit + +### BubbleHead + +### FashionBubbleHead + +### BubbleArms + +### BubbleLegs + +### FashionBubbleLegs + + + +### Hair5_FrontE + +### BlankEyes + +### DaiBrows1 + +### DaiBrows2 + +### Glabella + +### Ridge + +### BraRim + +### InnerLines + +### BraUnder + +### BraUnderRim + +### BraStriped + +### Stripes + +### BraCherry + +### Cherry + +### BraRose + +### Rose + +### BraInvertedRose + +### InvertedRose + +### Straps + +### Base + +### Lines + +### PantiesBow + +### PantiesStriped + +### PantiesInvertedRose + +### PantiesCherry + +### PantiesBowStriped + +### PantiesHigh + +### PantiesHighStriped + +### SwimsuitRestraint + +### BlouseShoulderRight + +### SlayerCollar + +### CapeCollar + +### CapeCollarButton + +### CapeCollarRim + +### SlayerCape + +### CapeCollarInner + +### CapeStripe + +### CapeShoulderLeft + +### CapeShoulderRight + +### CapeShoulderLeftButton + +### CapeShoulderRightButton + +### CapeBack + +### LeatherMask + +### Hood + +### Gag + +### FashionLeatherMask + +### LeatherHood + +### FashionLeatherHood + +### CyberLongMittenLeft + +### CapForeLongMittenLeft + +### CapLongMittenLeft + +### CuffForeLongMittenLeft + +### CuffLongMittenLeft + +### DisplayForeLongMittenLeft + +### DisplayLongMittenLeft + +### LockForeLongMittenLeft + +### LockLongMittenLeft + +### GlowForeLongMittenLeft + +### GlowLongMittenLeft + +### StrapsForeLongMittenLeft + +### StrapsLongMittenLeft + +### UpperCuffLongMittenLeft + +### UpperDisplayLongMittenLeft + +### UpperLockLongMittenLeft + +### UpperGlowLongMittenLeft + +### CyberLongMittenRight + +### CapForeLongMittenRight + +### CapLongMittenRight + +### CuffForeLongMittenRight + +### CuffLongMittenRight + +### DisplayForeLongMittenRight + +### DisplayLongMittenRight + +### LockForeLongMittenRight + +### LockLongMittenRight + +### GlowForeLongMittenRight + +### GlowLongMittenRight + +### StrapsForeLongMittenRight + +### StrapsLongMittenRight + +### UpperCuffLongMittenRight + +### UpperDisplayLongMittenRight + +### UpperLockLongMittenRight + +### UpperGlowLongMittenRight + +### CyberLongMittens + +### CyberMittenLeft + +### MittenLeft + +### ForeMittenLeft + +### CyberMittenRight + +### MittenRight + +### ForeMittenRight + +### CyberMittens + +### CyberArmLeft + +### ArmLongMittenLeft + +### CyberArmRight + +### ArmLongMittenRight + +### UpperCuffForeLongMittenRight + +### CyberArms + +### FashionCyberLongMittens + +### FashionCyberMittens + +### CyberThighLink + +### GlowThighLink + +### CyberAnkleLink + +### GlowAnkleLink + +### FashionCyberThighLink + +### FashionCyberAnkleLink + +### CyberPanties + +### CyberPantiesLining + +### TallSmoothHeels + +### TallSmoothHeelsRestraint + +### NeckCorset2 + +### NeckCorsetRim2 + +### ShinyLatexMuzzle + +### NeckCorsetGag2 + +### NeckCorsetGagRim2 + +### NeckCorsetGag + +### ShinyLatexMuzzleRestraint + +### NeckCorsetRestraint + +### NeckCorsetGagRestraint + +### LatexPetsuit + +### LatexPetsuitGlow + +### GlowArms + +### GlowTorso + +### GlowLegs + +### GlowLeftLegs + +### MiniCape + +### Epaulettes + +### TheRobeOfChastity + +### ChestBase + +### Frill + +### ChestFrill + +### ChestGold + +### Plate + +### ChestPlate + +### GoldBase + +### ChestGoldBase + +### Fabric + +### ChestFabric + +### TheRobeOfChastityRestraint + +### Spats + +### GothicSkirt + +### WaistbandClips + +### Buttons + +### HemLower + +### HemLowerBack + +### HemUpper + +### GothicSkirtLace + +### LaceLower + +### LaceUpper + +### LightMaidKnight_Dress + +### DressChest + +### DressDeco + +### DressDecoBack + +### LightMaidKnight_Bra + +### LightMaidKnight_Top + +### LightMaidKnight_SleeveLeft + +### LightMaidKnight_SleeveRight + +### LightMaidKnight_Sleeves + +### LightMaidKnightHairband + +### Headband + +### HeadbandFrill + +### HeadbandRibbon + +### FootBootLeftHogtie + +### FootShoeLeftHogtie + +### GagNecklace + +### GagNecklaceBall + +### FashionGagNecklace + +### BondageBed + +### BedStraps + +### BedStrapsHogtie + +### LightMaidKnight_Apron + +### ApronChest + +### ApronBack + +### LightMaidKnight_Flower + +### Flower + +### LightMaidKnight_SockRight + +### LightMaidKnight_SockLeft + +### LightMaidKnight_Socks + +### LightMaidKnight_GloveLeft + +### LightMaidKnight_GloveRight + +### LightMaidKnight_Gloves + +### LightMaidKnight_GuardLeft + +### GuardLeft + +### GuardCuffLeft + +### GuardCuff2Left + +### LightMaidKnight_GuardRight + +### GuardRight + +### GuardCuffRight + +### GuardCuff2Right + +### LightMaidKnight_Guards + +### LightMaidKnight_Boots + +### LightMaidKnight_Pauldron + +### PauldronLeft + +### PauldronStrap + +### LightMaidKnight + +### HeavyMaidKnightHairband + +### HeadbandRibbonBack + +### FlowerLeaves + +### HeavyMaidKnight_Dress + +### DressSkirtHem + +### DressSkirtStripe + +### HeavyMaidKnight_SleeveLeft + +### SleeveLeftStripe + +### HeavyMaidKnight_SleeveRight + +### SleeveRightStripe + +### HeavyMaidKnight_ChestArmor + +### ChestArmor + +### HeavyMaidKnight_GloveLeft + +### HeavyMaidKnight_GloveRight + +### HeavyMaidKnight_Gloves + +### HeavyMaidKnight_GauntletLeft + +### HeavyMaidKnight_GauntletRight + +### HeavyMaidKnight_Gauntlets + +### HeavyMaidKnight_PauldronLeft + +### PauldronLeftStraps + +### PauldronLeftHardware + +### HeavyMaidKnight_PauldronRight + +### PauldronRight + +### PauldronRightStraps + +### HeavyMaidKnight_Pauldrons + +### HeavyMaidKnight_SideArmor + +### SideArmor + +### HeavyMaidKnight_Corset + +### HeavyMaidKnight_CorsetRestraint + +### HeavyMaidKnight_Sleeves + +### HeavyMaidKnight_ApronBottom + +### ApronBelt + +### ApronMiniBow + +### ApronCross + +### ApronStripe + +### ApronPattern + +### HeavyMaidKnight_ApronTop + +### ApronChestRuffles + +### ApronChestBelts + +### HeavyMaidKnight_Apron + +### HeavyMaidKnight_WaistBelts + +### BeltsHardware + +### HeavyMaidKnight_WaistPouches + +### Pouches + +### HeavyMaidKnight_Waist + +### HeavyMaidKnight_Boots + +### BootLegLeft + +### BootLegRight + +### HeavyMaidKnight_PantyhoseShorts + +### Pantyhose + +### HeavyMaidKnight_SockRight + +### HeavyMaidKnight_SockLeft + +### HeavyMaidKnight + +### BlondeFront + +### BlondeBangs + +### BlondeBack + +### FangMouth_Double + +### HoodCollar + +### BigBallTeethFang + +### MilitaryJacket_Sleeveless + +### MilitaryUniform_SleeveLeft + +### MilitaryUniform_SleeveRight + +### MilitaryUniform_Sleeves + +### MilitaryJacket + +### WhiteGloveLeft + +### WhiteGloveRight + +### WhiteGloves + +### UniformShirt_Sleeveless + +### UniformShirt_SleeveLeft + +### UniformShirt_SleeveRight + +### UniformShirt_Sleeves + +### UniformShirt + +### MilitaryUniform_Hat + +### Hat + +### HatRim + +### HatCap + +### HatGloriousInsignia + +### HatGloriousInsigniaHS + +### MilitaryUniform_Earphones + +### Headgear + +### HeadgearUnit + +### HeadgearEars + +### HeadgearEarsInner + +### HeadgearBack + +### MilitaryUniform_Searchlight + +### SearchlightPouch + +### Searchlight + +### SearchlightBase + +### SearchlightLens + +### MilitaryUniform_BeltPouch + +### BeltPouch + +### BeltPouchRim + +### MilitaryUniform_Webbing + +### Webbing + +### WebbingSide + +### WebbingHardware + +### WebbingName + +### WebbingUnderbust + +### WebbingUnderbustHardware + +### MilitaryUniform_Skirt + +### MilitaryUniform_Shoes + +### MilitaryUniform_TightsShorts + +### MilitaryUniform_SockLeft + +### MilitaryUniform_SockRight + +### Tights + +### MilitaryUniform_Hairpin + +### Hairpin + +### MilitaryUniform + +### ShirtSleeveLeft + +### ShirtForeArmLeft + +### ShirtSleeveRight + +### ShirtForeArmRight + +### ShirtShoulderRight + +### ShirtDress + +### ShirtDressChest + +### RubyNecklace + +### RubyChain + +### RubyRing + +### RubyGem + +### RubyNecklaceRestraint + +### SigilNecklace + +### SigilChain + +### SigilDisc + +### SigilNecklaceRestraint + +### MetalNecklace + +### MetalChain + +### MetalDisc + +### MetalNecklaceRestraint + +### NecklaceCharm + +### DragonNecklaceRestraint + +### BallTeeth + +### CrystalBallGag + +### CrystalBallGagSmooth + +### GagMetalRivetedStrap + +### OTNStrap + +### OTNStrapRivets + +### FashionGagMetalRivetedStrap + +### CrystalGagNecklace + +### CrystalGagNecklaceBall + +### FashionCrystalGagNecklace + +### LeashCollar + +### LeashCollarHardware + +### BootShoeLeft + +### BootShoeRight + +### Fear + +### RubyHardware + +### KiguMaskSmile + +### MouthSmile + +### FashionKiguMaskSmile + +### OneBarTop + +### OneBarPrisonLatex + + + +### FangMouth + +### FanglessMouth + +### SantaHat + +### HatBack + +### Fluff + +### Orb + +### FestiveArmbinder + +### BinderStrapLeft + +### BinderFluffLeft + +### FestiveHarnessTop + +### StrapTop + +### ButtonsTop + +### FuzzTop + +### FestiveHarnessMid + +### StrapMid + +### ButtonsMid + +### FuzzMid + +### FestiveHarnessStrap + +### StrapBot + +### ButtonsBot + +### FuzzBot + +### FestiveHarness + +### StrapOverbust + +### StrapUnderbust + +### ButtonsUnderbustOver + +### ButtonsUnderbust + +### FuzzUnderbustOver + +### FuzzUnderbust + +### FashionFestiveHarnessTop + +### FashionFestiveHarnessMid + +### FashionFestiveHarnessStrap + +### FashionFestiveHarness + +### FrillyHeadband + +### HeadbandBand + +### HeadbandBow + +### BowHeadband + +### BowHeadbandFrill + +### BackHime + +### HimeBack + +### BackShort + +### BackFlat + +### Bob + +### BobFront + +### FrontStraight2 + +### FrontStraight2_Front + +### FrontStraight2_Overstrap + +### FrontSwept + +### FrontSweptSide + +### Vents + +### VentL + +### VentR + +### VentsInnerR + +### VentsInnerL + +### VentsFront + +### BigBraidBack + +### CurlyPonytail + +### DrillLeft + +### DrillRight + +### Twindrills + +### Twintails + +### PointyAhoge + +### RoundHat + +### HatTop + +### TopHatSmall + +### TopHatSmallBow + +### BlondeFrontM + +### BlondeBangsM + +### BlondeBackM + +### Mascara + +### MascaraL + +### MascaraR + +### Scar + +### PointyAntennae + +### AnthenaL + +### AnthenaR + +### PointyHorns + +### HornL + +### HornR + +### PointyTail + +### Tail + +### WolfEars2 + +### EarLeft + +### EarRight + +### HairclipDual + +### HairclipLower + +### HairclipUpper + +### ChainPanties + +### PantiesChain + +### ChainPanties2 + +### KittyPetCuffsWristLeft + +### KittyPetCuffsWristRight + +### KittyPetCuffsWrists + +### KittyPetCuffsElbowLeft + +### KittyPetCuffsElbowRight + +### KittyPetCuffsElbows + +### KittyPetCuffsArms + +### KittyPetCuffsAnklesLeft + +### KittyPetCuffsAnklesRight + +### KittyPetCuffsAnkles + +### KittyPetCuffsThighLeft + +### KittyPetCuffsThighRight + +### KittyPetCuffsThigh + +### KittyPetCuffsCollar + +### FashionKittyPetCuffsCollar + +### FashionKittyPetCuffsWristLeft + +### FashionKittyPetCuffsWristRight + +### FashionKittyPetCuffsWrists + +### FashionKittyPetCuffsElbowLeft + +### FashionKittyPetCuffsElbowRight + +### FashionKittyPetCuffsElbows + +### FashionKittyPetCuffsArms + +### FashionKittyPetCuffsAnklesLeft + +### FashionKittyPetCuffsAnklesRight + +### FashionKittyPetCuffsAnkles + +### FashionKittyPetCuffsThighLeft + +### FashionKittyPetCuffsThighRight + +### FashionKittyPetCuffsThigh + +### KittyPawCuffsWristLeft + +### KittyPawCuffsWristRight + +### KittyPawCuffsWrists + +### KittyPawCuffsElbowLeft + +### KittyPawCuffsElbowRight + +### KittyPawCuffsElbows + +### KittyPawCuffsArms + +### KittyPawCuffsAnklesLeft + +### KittyPawCuffsAnklesRight + +### KittyPawCuffsAnkles + +### KittyPawCuffsThighLeft + +### KittyPawCuffsThighRight + +### KittyPawCuffsThigh + +### FashionKittyPawCuffsWristLeft + +### FashionKittyPawCuffsWristRight + +### FashionKittyPawCuffsWrists + +### FashionKittyPawCuffsElbowLeft + +### FashionKittyPawCuffsElbowRight + +### FashionKittyPawCuffsElbows + +### FashionKittyPawCuffsArms + +### FashionKittyPawCuffsAnklesLeft + +### FashionKittyPawCuffsAnklesRight + +### FashionKittyPawCuffsAnkles + +### FashionKittyPawCuffsThighLeft + +### FashionKittyPawCuffsThighRight + +### FashionKittyPawCuffsThigh + +### KittyPetLeotardUnder + +### LeotardStripes + +### LeotardChestStripes + +### KittyPetLeotard + +### KittyPetLeotardRestraint + +### KittyPetUniformCollar + +### LeotardChestCollar + +### LeotardChestCollarLeft + +### LeotardChestCollarStripes + +### LeotardChestCollarStripesLeft + +### CollarDecoSymbol + +### ShoulderCuffLeft + +### ShoulderCuffStripeLeft + +### ShoulderCuffRight + +### ShoulderCuffStripeRight + +### KittyPetTail + +### TailStripe + +### KittyPetBlindfold + +### BlindfoldRim + +### BlindfoldBrow + +### FashionKittyPetBlindfold + +### KittyPetSteelCollar + +### FashionKittyPetSteelCollar + +### KittyPetMittenLeft + +### GloveLeftPaw + +### ForeGloveLeftPaw + +### KittyPetMittenRight + +### GloveRightPaw + +### ForeGloveRightPaw + +### KittyPetMittens + +### FashionKittyPetMittenLeft + +### FashionKittyPetMittenRight + +### FashionKittyPetMittens + +### KittyPetEars1 + +### Ears1L + +### Ears1R + +### Ears1InnerL + +### Ears1InnerR + +### KittyPetEars2 + +### Ears2L + +### Ears2R + +### Ears2InnerL + +### Ears2InnerR + +### KittyPetEarmuffs + +### EarmuffersL + +### EarmuffersR + +### KittyPetEarmuffsRestraint + +### KittyPetEars1Restraint + +### KittyPetEars2Restraint + +### KittyPetGag + +### GagCollar + +### KittyPetGagSeamless + +### GagSeamless + +### KittyPetGagMouth + +### GagMouth + +### KittyPetGagMouthSeamless + +### GagMouthSeamless + +### FashionKittyPetGag + +### FashionKittyPetGagSeamless + +### FashionKittyPetGagMouth + +### FashionKittyPetGagMouthSeamless + +### KittyPetsuit + +### ArmsPaws + +### LeftLegsPaws + +### FootLeftHogtiePaws + +### KittyPetSockLeft + +### SockLeftPaws + +### KittyPetSockRight + +### KittyPetSocks + +### KittyPetSocksRestraint + +### KittyPetPawLeft + +### KittyPetPawRight + +### KittyPetPaws + +### KittyPetPawsRestraint + +### KittyPetPawShortLeft + +### KittyPetPawShortRight + +### KittyPetPawsShort + +### KittyPetPawsShortRestraint + +### Hide Items + +### Sort Items + +### Drop Items + +### Filter Items + +### Rarity + +### Magical + +### Knives + +### Potions + +### Power + +### Find In Inventory + +### A huge rubber cube rises up out of the floor! + +### The latex cube hardens into a solid, harmless entity. + +### The latex cube slowly engulfs you! (DamageTaken) + +### The latex cube touches you, spreading latex restraints across your body! (+RestraintAdded) + +### A small rubber cube rises up out of the floor! + +### Mini Latex Cube + +### The mini latex cube hardens into a solid, harmless entity. + +### The mini latex cube sticks to you! (DamageTaken) + +### The mini latex cube expands across your body, taking the form of restraints! (+RestraintAdded) + +### Gigantic Slime + +### The gigantic slime fizzles as its body becomes unstable! + +### The gigantic slime stretches a pseudopod and engulfs you! (+RestraintAdded) + +### The gigantic slime slowly engulfs you! (DamageTaken) + +### A group of slimes jump out! + +### A slime jumps out! + +### A group of speedy slimes jump out! + +### A speedy slime jumps out! + +### Chain Sword + +### Cut through their defenses and tie them up in the process! + +### Deals slash damage. Adds 10 metal binding. + +### You pick up sword with a bunch of chains attached. + +### Slime Sword + +### It wiggles as you move it around. + +### Deals glue damage. Adds 25 slime binding. + +### You pick up slime-covered sword. + +### Frost Blade + +### As cold as its creator. + +### Deals 20 bonus ice damage and briefly slows the target. + +### You pick up an icy sword. + +### Targe + +### Hide behind it while you still can. + +### +60 Block. Deals crush damage and stuns for 4 turns. Offhand: Gives the same block bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a wooden shield. + +### Tower Shield + +### Now with more leg room. + +### Slows you down by 1 level. +120 Block, +30 Physical Armor. Deals crush damage and stuns for 7 turns. Offhand: Slows you and gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a metal tower shield. + +### Reinforced Shield + +### New and improved, but also clumsier. + +### +80 Block, +15 Physical Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a reinforced shield. + +### Runic Shield + +### For when you've been tied up one too many times... + +### +80 Block, +20 Magic Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a runic shield. + +### Vanish + +### Make the targeted creature invisible, making you totally invisible for Duration turns. Attacking and casting spells reveals your presence but you are still harder to see. + +### The slime dissolves your clothing, leaving nothing but rubber against your skin... + + + +### Riposte + +### Blocking an enemy attack makes them vulnerable and stuns them briefly. + +### Parry + +### +15 Block while holding a weapon. + +### Dagger Parry + +### +15 Block while holding a light weapon such as a knife or dagger. + +### Steadfast Guard + +### +5 Block for each 100 max willpower you have, while holding a non-light weapon. + +### The Power of Steel + +### +5 Block for each 100 max willpower you have, while holding a weapon that deals physical damage. + +### Secure Defense + +### +15-30 Block, based on your percentage of Willpower. + +### You block the EnemyName attack! + +### You block EnemyName! + +### You dodge EnemyName! + +### You block the EnemyName! + +### You dodge the EnemyName! + + + +### You resist being bound! + +### Self Bondage Enthusiast + +### Start with a basic self-bondage kit. + +### Apprehended + +### When you are bound by an enemy attack or spell, you are stunned 1 turn per restraint added. + +### Feeble Attacks + +### All enemies gain 20 physical and magic armor. + +### Glass Cannon + +### The effects of you taking damage are increased by 150%. + +### The Wand is Mightier + +### Enemies have 30% more hp; Tease damage multiplier to bound targets is increased by 85%. + +### Kinky Armory + +### Chef + +### You defeat the chef and claim her prize. + +### The chef makes sure you'll never steal again! (DamageTaken) + +### The chef makes sure you'll never steal again! (+RestraintAdded) + +### The chef spanks you with her frying pan! (DamageTaken) + +### As you eat, you look up and notice that someone is not very happy with you. + +### You find some delicious brownies! + +### Double Fudge Brownie + +### You enjoy the brownie one soft, delicious bite at a time. + +### A decadent blend of butter and chocolate topped with fudge and baked to perfection. + +### Restores 30% willpower. Takes a few turns to eat. + +### A playful ghost now accompanies you on your journey. + +### The ghost haunting you decides to have a little fun! (+RestraintAdded) + +### Hemp Rope + +### The most common type of bondage rope. + +### Soft and comfy. Great for casual wear! + +### Boxtie + +### The ropes squeeze you gently. + +### Rope Cuffs + +### A quick tie for apprehending prisoners. + +### It's not very secure. + +### Chest Straps + +### Chest Harness + +### The finishing touch on a tight and strict piece of ropework. + +### Rope Hogtie + +### A very strict and tight hogtie, good for subduing unruly captives. + +### It holds you strictly in a boxtie. You tug on the rope connecting your feet and struggle. + +### It holds you strictly with your back arched. You tug on the rope connecting your feet and struggle. + +### Rope Belt + +### Rope Harness + +### A harness that secures your other restraints and makes them tighter. + +### Crotch Rope + +### A tight rope impressing upon your most private areas... + +### Wrist Rope + +### A wrist and elbow tie keeping your arms secured behind your back. + +### Upper Knee Ropes + +### A tie that hobbles your knees together.. + +### Thigh Ropes + +### Upper Thigh Ropes + +### A tie that hobbles your thighs together.. + +### Ankle Ropes + +### Lower Leg Ropes + +### Lower Knee Ropes + +### A tie keeping your knees secured together. + +### Toe Rope + +### A tie keeping your toes tightly together. + +### Living Rope Collar + +### This collar is designed to make sure its wearer does not escape their ropes. + +### It will occasionally cause ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Notebook Page + +### You're going to stay with me for a while~ + +### That's better! Now stay close to me~ + +### Looks like our time is coming to an end... + +### Time to bring you back to your place~ + +### You've been quite adorable! Until next time~ + +### It's time for your walk, miss. + +### Now let's see, where to go... + +### I think we've reached a stopping point. + +### I have to put you back now~ + +### It's been fun playing with you miss! + +### (reaches for your leash) + +### (holds your leash firmly) + +### (giggles) + +### (waves goodbye) + +### Why don't we go for a walk? + +### That's better! Now come along~ + +### This has been lots of fun! + +### I have to go return you~ + +### Good girl~ Let's go again later~ + +### It's time for walkies! + +### That's a good girl! + +### I want to keep you longer, but I've got things to do. + +### It's time to go back to your little house~ + +### (pats you on the head) + +### It is time for your mandatory exercise. + +### Please maintain proximity. + +### Progress Level: 90% + +### Exercise complete. Returning to storage. + +### Uploading logs to database. Error... no connection. + +### Latex Mimic + +### The latex mimic melts into a shiny puddle. + +### The latex mimic spits out a glob of rubber at you! (+RestraintAdded) + +### The latex mimic stretches out an appendage and pulls you toward it! (DamageTaken) + +### The latex mimic engulfs you in sticky rubber! (DamageTaken) + + + +### Item Stack: + +### Heavy + +### Accessory + +### Restraint + +### Enchanted + +### Mundane + +### Can Disassemble + +### Raw Material + +### Armbinders + +### Legbinders + +### Boxbinders + +### Devices + +### Toys + +### Collars + +### Jackets + +### Dresses + +### Ties + +### Wrapping + +### Gags + +### Harnesses + +### Mittens + +### Boots + +### C. Belts + +### C. Bras + +### Maid + +### Locked + +### Accessible + +### Inaccessible + +### Quick-Bind + + + + + +### Lower + +### Spellbound Rope + +### An enchanted rope with a powerful sealing spell. It cannot be cut by mundane means. + +### It almost has a kinky mind of its own. + +### Spellbound Boxtie + +### The knots appear to tie themselves together again, making them impossible to undo! + +### Spellbound Rope Cuffs + +### Spellbound Ropework + +### A quick tie for apprehending prisoners, looped through buckles on the hand restraints. + +### Strict Spellbound Ropework + +### The finishing touches on a tight and strict piece of ropework. + +### Spellbound Hogtie + +### Spellbound Rope Belt + +### Spellbound Harness + +### Spellbound Crotch Rope + +### Spellbound Wrist Tie + +### Spellbound Knees + +### Spellbound Thighs + +### A tie that holds your legs together.. + +### Spellbound Upper Thighs + +### A tie that holds your thighs together.. + +### Spellbound Ankles + +### Spellbound Lower Legs + +### A tie keeping your legs secured together. + +### Spellbound Lower Knees + +### Spellbound Toe Rope + +### A tie keeping your toes secured together. + +### Living Spellbound Rope Collar + +### It will occasionally cause spellbound ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### A novice-level enchanted rope, relatively trivial to untie but resistant to mundane tools. + +### Faintly glows with traces of devious thoughts. + +### Magic Boxtie + +### They glow with a trace of magic. + +### Magic Rope Cuffs + +### Magic Ropework + +### Strict Magic Ropework + +### Magic Hogtie + +### It's very secure. You tug on the rope connecting your feet and struggle. + +### Magic Rope Belt + +### Magic Harness + +### Magic Crotch Rope + +### Magic Wrist Tie + +### Magic Knee Tie + +### Magic Thigh Ropes + +### Magic Upper Thigh Ropes + +### Magic Ankle Tie + +### Magic Lower Leg Tie + +### Magic Lower Knee Tie + +### Magic Toe Rope + +### Living Magic Rope Collar + +### It will occasionally cause magic ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Celestial Rope + +### Rope that has been exposed to solar energies. + +### Squeezes the wearer if she tries to escape, so that she knows her place. + +### Holy Boxtie + +### A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. + +### Holy Rope Cuffs + +### Holy Ropework + +### Strict Holy Ropework + +### Holy Hogtie + +### Holy Rope Belt + +### Holy Rope Harness + +### Holy Crotch Rope + +### Holy Wrist Rope + +### Holy Upper Knee Ropes + +### Holy Thigh Ropes + +### Holy Upper Thigh Ropes + +### Holy Ankle Ropes + +### Holy Lower Leg Ropes + +### Holy Lower Knee Ropes + +### Holy Toe Rope + +### Living Holy Rope Collar + +### It will occasionally cause holy ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Mithril Rope + +### Rope made from silver thread, exposed to lunar energies. + +### Lightweight yet unyielding. Truly a high class rope. + + + +### Mithril Boxtie + +### A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. + +### Mithril Rope Cuffs + +### Mithril Ropework + +### Strict Mithril Ropework + +### Mithril Hogtie + +### Mithril Rope Belt + +### Mithril Rope Harness + +### Mithril Crotch Rope + +### Mithril Wrist Rope + +### Mithril Lower Knee Ropes + +### Mithril Thigh Ropes + +### Mithril Upper Thigh Ropes + +### Mithril Ankle Ropes + +### Mithril Lower Leg Ropes + +### Mithril Toe Ropes + +### Living Mithril Rope Collar + +### It will occasionally cause mithril ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Dark Portal + +### They are trying to take you somewhere! + +### Essence Mote + +### A trainee can use this to focus. + +### Pick this up to gain decaying miscast reduction. + +### Seal Sigil + +### Walk over it to erase it and unlock the next floor. + +### The Shadow + +### The Shadow is exorcised... for now. + +### The Shadow overwhelms you with its power... (+RestraintAdded) + +### The Shadow welcomes you to your new future. (DamageTaken) + +### The Shadow cackles as your restraints are sealed! (DamageTaken) + +### The Shadow smiles and vanishes. + +### The Shadow smiles and vanishes, leaving you locked in a mysterious RNAME... + +### Observer + +### The observer is banished into the aether. + +### From the Beyond + +### You briefly spot your reflection as a reflective cube appears! + +### Mini Metal Cube + +### The liquid metal cube shatters into glittering dust. + +### The liquid metal cube sticks to you and hardens! (DamageTaken) + +### The liquid metal cube expands across your body and hardens, taking the form of restraints! (+RestraintAdded) + + + +### Liquid Metal + +### Primordial latex infused with mineral form. + +### Heavy and weighs the wearer down. + +### Liquid Metal (Feet) + +### A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. + +### Forming a skintight layer, it will be quite difficult to escape this. + +### Liquid Metal (Ankles) + +### Liquid Metal (Legs) + +### Liquid Metal (Arms) + +### Liquid Metal (Hands) + +### Liquid Metal (Mouth) + +### Liquid Metal (Head) + +### Living Liquid Metal Collar + +### This collar is designed to make sure its wearer does not escape the metal. + +### It will occasionally cause liquid metal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of liquid metal you have on you. + + + +### The stairs dissolve right before you! + +### The stairs dissolve as you step onto them, pulling you with them to somewhere else. + +### A dark energy enters your body... (DamageDealt) + +### A dark energy lurks within you. + +### You succumb to a dark desire... (+RestraintAdded) + +### Observer's Gaze + +### Industrial Tape Wand + +### A non-magical tape wand used for creating tight little packages. + +### Deals chain damage. 200% binding efficiency. Hitting an enemy applies the Taped debuff for 12 turns, increasing Chain damage to them by 15%. Deal 10 chain damage to adjacent Taped enemies while moving. + + + +### Bag of Goodies + +### Someone's secret stash. + +### Deals charm damage. Applies a toy to targets hit for 40 turns. Offhand: Applies a toy to targets you hit. + +### You find a bag filled with various toys and vibrators... + +### You play with yourself using some of the toys in the bag... + +### Magic Remote + +### The key to absolute power. + +### Triggers long-duration edging on basic attack if the target has a toy. Offhand: Applies short-duration teasing to targets you hit. + +### Vibrator Remote + +### You click the remote and hear a buzzing noise! + +### 15 charge to powerfully activate vibrators in an area for 15 turns. + +### 10 charge to activate vibrators in an area for 15 turns. + +### You find a golden crystal. It glows faintly. + +### You find a dull, gold-tinted crystal. + +### Save Loadout + +### Rubber Stick + +### A rubber cylinder without any lewd intentions whatsoever. + +### Deals grope damage. + +### You pick up a flexible rubber stick. + +### Blade of Ejahl + +### A piece of prized ancient equipment. Magical energy causes it to vibrate intensely. What could it have been used for? + +### Deals grope damage. Can spend 40 charge to add charm damage per hit for 10 turns. + +### You retrieve the Blade of Ejahl. + +### Intense Vibrations: The Blade of Ejahl deals bonus charm damage!!! + +### The Blade of Fla-peh buzzes with great power! + +### 40 charge to deal 30 charm damage per hit for 10 turns. + +### Enchanted Rope + +### She who lives by the rope, is tied up by the rope. + +### Deals chain damage and applies 50 points of rope binding. Draws 10 mana per hit to apply 50 extra points of magical binding. If you don't have mana, you fail to control the rope... + +### You find some enchanted rope. + +### Without mana to control it, the enchanted rope springs back upon you! + +### Light Bow + +### Pointy stick delivery system. + +### Reload time: None. Deals crush damage on melee. Draws 10 charge and 20 stamina to fire an ordinary arrow, dealing 30 pierce damage. + +### You find a wooden bow. + +### 10 charge to fire an arrow. Deals 30 pierce damage. + +### Choose projectile path + +### Arrow + +### You loose an arrow! + +### Fire Arrows + +### Converts arrows to fire arrows for 30 extra charge, which deal the arrow damage plus 20 as fire damage in a 3x3 area and stuns briefly. + +### You switch to using fire arrows. + +### Fire Arrow + +### Vine Arrows + +### Converts arrows to all-natural organic versions for 20 extra charge, which apply 80 binding to the target and deal chain damage instead. + +### You switch to using vine arrows. + +### Vine Arrow + +### A sudden burst of vines overtakes you as you find yourself wrapped up tightly! + +### You find a bow and a glowing crystal. The bow is scribed with runes of duplication. + +### Crossbow + +### Watch where you're pointing that thing! + +### Reload time: 3 stationary turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 65 pierce damage. + +### You find a crossbow. + +### 20 charge to fire a bolt. Deals 65 pierce damage. + +### Bolt + +### You pull the trigger! + +### Your RestraintName melts off! + +### Your RestraintName melts faster with the application of fire! + +### Your RestraintName hardens with the application of frost! + +### dmg + +### AMNT Evasion + +### AMNT% Accuracy + +### AMNT Magic Armor + +### AMNT Physical Armor + +### AMNT Bondage Resist + +### AMNT TYPE Resist + +### AMNT% TYPE Damage + +### AMNT% weapon phys. dmg + +### AMNT% weapon magic dmg + +### Infuse weapon AMNT% TYPE + +### AMNT TYPE on attack + +### AMNT Mana Efficiency + +### AMNT TYPE Mana Efficiency + +### AMNT% regen from mana pool + +### AMNT mana pool on capture + +### AMNT% Visibility Reduction + +### AMNT Distraction Decay + +### AMNT Distraction Per Turn + +### AMNT AP from attacks + +### After attacking with a teasing weapon: + +### Gain AMNT% Spell Damage for DRTN turns + +### Drains mana from the wearer. + +### AMNT Stat + +### Drop On Floor + +### Remove + +### Struggle + +### Leyline Map + +### Harness Plug Gag + +### A gag meant to keep people quiet by forcing a plug into their mouth and securing it in place with a strict harness. + + + +### Your OLDITM transforms into NEWITM! + +### Your OLDITM gains new properties! + + + +### Moon-Cursed Epicenter + +### The cursed epicenter disperses into black stardust. + +### The cursed epicenter retreats as you remove the last of your cursed restraints! + +### The cursed epicenter retreats as you are claimed by something else! + +### The cursed epicenter assaults your mind with its presence! (DamageDealt) + +### You feel your cursed items turn cold to the touch! + +### An cursed collar appears around your neck, feeling cold to the touch. + +### Cursing Sigil + +### A cursing sigil appears on the ground! + +### You are being cursed!!! + +### Star-Cursed Epicenter + +### Moondust Collar + +### 'You thought you could run forever, didn't you? Fate has a way of always catching up to you...' + +### Cannot be removed while you are wearing other Star Cursed items. + +### Stardust Collar + +### The cursed seal on the RestraintName vanishes into a brief veil of stardust. + +### Take AMNT damage to weaken the curse. Excludes shadow, psychic, charm, or damage taken at 0 WP. + +### You struggle uselessly, sealed in your fate. + +### You feel your restraints starting to weaken... + +### The cursed collar falls off, awaiting its next victim... + +### You must remove all other Star Cursed items before removing the collar. + +### Transformation: Items with generic curses transform into Star Cursed items. + +### With a burst of dark energy, your OLDITM gains new properties! + +### With a burst of dark energy, your OLDITM transforms into a NEWITM! + +### Restoration: While distracted, your Star Cursed restraints regain strength. + +### With the rush of pleasure, you feel your cursed restraints tighten and strengthen! + +### Corruption: While in the shadows, you slowly gain corruption. + +### Your willpower gain and struggle power is less effective due to your corruption. + +### Seduction: Gain distraction after taking damage. + +### Taking damage fills your minds with cursed thoughts... + +### Having taken damage, your distraction is increasing... + +### Punishment: When you defeat an enemy, you are stunned briefly and enemies are attracted. + +### Dark Voice: You are supposed to be a slave! + +### Submission: At 0 WP, you are restrained if you leave the presence of a hostile. + +### Dark Voice: Kneel before your mistress. + +### You must submit! Moving away from an enemy at 0 WP will bind you! + +### Denial: -10 WP when you try to Let Go. At 0 WP you cannot orgasm. + +### Dark Voice: Not yet. + +### Dark Voice: Your squirming pleases us. + +### Dark Voice: It is not your choice to make~ + +### Dark Voice: You may enjoy yourself, for now~ + +### Dark Voice: Yes, take in the pleasure... + +### Dark Voice: Enjoy a gift, dear~ + +### As you let go of yourself, the Robe of Chastity loses all effects! + +### The magic in the Robe of Chastity fades... for now. + +### You have failed to keep the principles of the Paladins... for now. + +### You feel vibrations in your leotard as the magically conductive fabric channels your power. + +### Your leotard produces a tingling full-body sensation as it channels your magic! + +### A tingling sensation serves to remind you of your leotard's magic properties. + +### Star: -20 Charm/Psychic Resist + +### Star: +40 all other resists + +### Mithril Orb + +### Shining strings encircle your body! + +### Your cursed items have attracted a powerful cursed spirit! + +### The seal on your RESTRAINTNAME is weakening. + +### The fighter pouts and runs away! + +### The fighter knocks you to the ground and binds you! (+RestraintAdded) + +### The fighter strikes you with her weapon! (DamageTaken) + +### The fighter takes you down with the back of her weapon! (DamageTaken) + +### The fighter puts you in a hold and manages to slip on a lock! (DamageTaken) + +### The fighter vanishes and ends up behind you! + + + +### The fighter moans loudly and rolls around on the floor! + +### The fighter wraps her arms around you with bindings in hand! (+RestraintAdded) + +### The fighter pins you with her weapon and grabs your breast! (DamageTaken) + +### The fighter enchants her weapon and strikes you! (DamageTaken) + +### The fighter smiles lasciviously as she dangles a lock in front of you! (DamageTaken) + +### The fighter enchants her weapon and flies forward! + + + +### The fighter drops her weapon and admits defeat! + +### The fighter feints and strikes, slapping you with the flat of her blade! (DamageTaken) + +### The fighter proudly clicks on a lock! (DamageTaken) + +### The fighter briefly vanishes and ends up behind you! + +### The fighter falls on her knees and begs! + +### The fighter throws an enchanted binding ring at you! (+RestraintAdded) + +### The fighter throws her weapon at you! (DamageTaken) + +### Casting SPNME + +### The door suddenly locks behind you! + +### Apply To Target + +### Purify + + + +### You need to target an NPC + +### Target must be bindable and disabled. + +### Target acquired! + +### Truss em up! + +### Choose target to bind + +### Target Acquired! + +### Designates the target for bondage and allows you to apply items from the inventory. Can only be applied to entities that are willing or disabled. Some items require higher levels of incapacitation to be applied + +### The Shoppe + +### Journey Selection + +### High-Security Prison + +### Doll Sorting Station + +### A cursed NEWITM flies out of the chest and latches tightly to you! + +### With a puff of magic, a NEWITM appears on your body! + +### You draw upon chaotic energies, restoring mana! + +### You draw upon chaotic energies, but your mind is unable to hold back the arcane forces! + +### Your attempt to call upon chaotic energies fails. + +### You are already at max mana. + +### The vibrator holds at full power to drive you over the edge! + +### The weapon needs to be loaded to fire. + + + +### Recurve Bow + +### Curvy, just like its user. + +### Reload time: 1 turn. Deals crush damage on melee. Draws 14 charge and 35 stamina to fire an ordinary arrow, dealing 40 pierce damage. + +### You find a recurve bow. + +### 14 charge to fire an arrow. Deals 40 pierce damage. + +### Recurve Bow Arrow + +### You loose a strong arrow! + +### Longbow + +### Great for building both empires and muscle. + +### Reload time: 2 turns. Deals crush damage on melee. Draws 18 charge and 60 stamina to fire an ordinary arrow, dealing 60 pierce damage. + +### You find a huge longbow. + +### 18 charge to fire an arrow. Deals 60 pierce damage. + +### Longbow Arrow + +### You loose a mighty arrow! + +### Pistol Crossbow + +### Lethal. Sustainable. Portable. + +### Reload time: 3 turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 45 pierce damage. + +### You find a pistol crossbow. + +### 20 charge to fire a bolt. Deals 45 pierce damage. + +### Pistol Bolt + +### Arbalest + +### At this point why not just use a gun? + +### Reload time: 5 stationary turns. Deals crush damage on melee. Draws 25 charge and no stamina to fire an ordinary arrow, dealing 70 pierce damage, passing through units. + +### You find an arbalest. + +### 25 charge to fire a bolt. Deals 100 pierce damage. + +### Heavy Bolt + +### The RSTNME is removed as the lock comes off. + +### You save the key in your inventory for future use. + +### You pick up a simple key for the simplest of locks. + +### Simple Keys + +### You twirl the keys around your finger. + +### A handy key for getting out of common handcuffs and shackles. + +### It's not sophisticated enough to work on higher-quality locks, but can be used many times. + +### You twirl a key around your finger. + +### You twirl a magic key around your finger. Careful not to lose it! + +### You fidget with a lockpick. + + + +### You pick up a tool for picking disc detainer locks. + +### Disc Lock Tool + +### You examine the tool. It has a replaceable tip for picking disc detainer locks. + +### A handy tool for picking disc detainer locks, popularized by a certain pair of professionals. + +### Features a replaceable head in case an unskilled user breaks it. Requires lockpicks to use. + + + +### Magical Weapon + +### Your Submissiveness determines how easily your character can resist the temptations of bondage. + +### Your Security Level is based on your history, and reputation with the MNFCTN. + +### Your Passion determines how likely you are to lose control of yourself involuntarily. + +### Your Frustration affects how quickly your Passion grows. More Frustration = More Passion + +### Nivah, Goddess of Dragons + +### Minivir, Goddess of Alchemy + +### Akasha, Goddess of Magic + +### Oriel, Goddess of Technology + +### Ninril, Giver of Life + +### Matah, Architect of Reality + +### Aether, Keeper of the Cosmos + +### Oblivion, Keeper of Secrets + +### Arcane Energy is stored by casting spells, up to 100% Max mana. + +### Battle Rhythm is gained by spending stamina through attacks, up to 40 total. + +### Arcane Blast + +### When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. Casting this spell consumes it to deal up 25% Max Mana as Arcane damage. Pierces enemies and walls. + +### Your eyes glow as energy surges from within! + +### Critical Hit! + +### Super Critical! + +### Surprise Bondage! + +### Arcane Energy + +### Rhythm + +### You avoid the attack in a flurry of impressive maneuvers! + +### Arcane Barrier + +### When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. When enabled, slowly convert Arcane Energy into a shield at a 1:2 ratio. Max shield is equal to 10% Max Mana. + +### You sense that a high value target is near. + +### You push yourself beyond physical limits! + +### You try to push yourself beyond your capabilities and falter... + +### You are already at max stamina. + + + +### Did the Research + +### Unlocks advanced tooltips for enemies showing their weaknesses. Also improves hearing by a small amount. + +### Well-Placed Traps + +### Trap spells always critically strike. + +### Hard to Catch + +### Adjacent NPCs count as corners/hooks for purposes of escaping. After being restrained, escape speed and power is increased for 12 turns (escape power is increased by +20% plus 2% of Bondage Resist). Removed if you restrain yourself. + +### Struggling is improved and escape is quicker! + +### Akashic Conflux + +### Costs 100 Arcane Energy and refunds 100 Mana. Bringing memories to life, you call upon your magical knowledge to ignore arm, leg, and verbal spell components for 3 turns. + +### You can ignore Arm, Leg, and Verbal components! + +### Magical whisperings circle around you, enabling you to cast spells without components! + +### You don't have enough Arcane Energy. You need AMNT. + + + +### Chaotic Overflow + +### Draw upon 35 WP to ignore spell components for Duration turns and fully restore your mana. The energy is uncontrollable, so there will be consequences... + +### Chaotic energy flows through you!!! + +### You try to call forth the chaotic energy, but it isn't interested in you anymore... + +### You don't have enough Willpower. You need at least 25%. + +### You are already full of chaotic energy! + +### Chaotic energy overtakes you, crystallizing into physical form... + +### Chaotic energy flows through you! You have a bad feeling about this... + + + +### You find a shimmering macaron. + +### Heavenly Crunch Macaron + +### You feel holy energy neutralizing the cursed magic permanently. + +### Some say it comes from a bakery in heaven itself. Others say it is simply made from lab-grade materials, and actually tastes awful. + +### Purifies and unlocks a cursed item and/or removes all curses from one currently worn item of your choice. + +### Congratulations! Your continued patronage has earned you|one (1) round trip to the nearest affiliated shop!|Simply step into the portal to continue...|(the Goddess is not responsible for any mishaps or fraud pertaining to the use of this portal) + +### (You step through the portal. An unperturbed shopkeeper greets you.)|Another visitor? Oh, it's just you~ + +### (Enter the portal) + +### (It's the return portal) + +### (You step through the portal and return to your adventure) + +### Select a restraint to remove the curse from + +### You don't have any restraints that can be removed + +### As you are low on mana, you are unable to store Arcane Energy. + +### You are recharging your next mana cost reduction. + + + +### Fast Recharge I + +### Inner power now recharges after 10 turns instead of 16. + +### Fast Recharge II + +### Inner power now recharges after 6 turns instead of 16. + + + +### Precise Targeting + +### Your first critical hit on a target is 1.5x more powerful. + +### Surprise Bondage + +### Binding from critical hits is 40% stronger + +### High Profile + +### Several enemies on each map will be high value, rewarding more gold and items for defeating them but increasing their strength. + + + +### You apply the RSTR to the ENNME! (AMNT% bound) + +### You untie the ENNME! (AMNT% bound) + +### +AMNT Bondage! + +### TargetEnemy receives AMNT binding! + +### TargetEnemy is disabled and receives an increased AMNT binding! + +### TargetEnemy resists bondage and receives a reduced AMNT binding! + +### Target must be helpless. + +### You steal the target's disguise! + +### You remove your disguise. + +### You are already wearing that faction's disguise. + +### Steal Disguise + +### Choose target to steal from + +### Steal's a helpless enemy's clothes, adding a great deal of distraction to her and stealing her disguise for yourself. Until you recast this on yourself, you gain a stealth bonus against members of the same faction. + + + +### Unstoppable (Ignore status/bondage) + +### Unflinching (Resist status/bondage) + +### Relentless (Stun resist when stunned) + +### Bulwark (Blocks some explosions) + +### Blindsight (See through walls) + + + +### Mana Harvesting + +### Defeating or capturing a spellcaster-type enemy recovers 10 arcane energy, reduced to 1 for other humanoids. + +### A powerful wind pushes you away!!! + +### Staff of Ropes + +### An enchanted rope kept in check by a magical seal. Surely this won't backfire... + +### +20% rope bindings applied. Deals chain damage. Active: Spend 25 mana to unleash the ropes in a wide AoE. + +### You pick up a staff of ropes. Finally, a way to contain its power! + +### Staff of Belts + +### Belts within belts, a fractal belt pattern buckled into oblivion. + +### +20% leather bindings applied. Leather spells apply debuffs for 30% longer. Deals chain damage. Active: Pull an enemy toward you and apply a small amount of bondage. + +### You pick up a staff of belts wrapped tightly in leather. + +### Binding Lock + +### A LKTYP lock clasps on to one of your restraints! + +### You are caught in a constricting field! (Dmgdlt) + +### Resin Coating + +### A layer of transparent resin derived from Green Latex. Unlike other forms of latex, this one is solid and fixes you in place. + +### It's like you're an art piece! If only you had some way to blast it off... + +### You hear a motor whirring... + +### A bubble of latex surrounds you and inflates, sealing you in! + +### A bubble of latex envelops you! + +### A ball of latex surrounds you and inflates, sealing around your neck! + +### A ball of latex envelops you! + +### The latex around you dampens your attacks, reducing physical damage by 30% and lowering your sight range. + +### Latex Ball + +### ...Lab Assistant? + +### You rescue the lab assistant. + +### The assistant restrains you! (+RestraintAdded) + +### The assistant gropes you playfully! (DamageTaken) + +### The assistant applies a lock! (DamageTaken) + +### The assistant splashes a solvent in your face, blinding you! (DamageTaken) + +### ...Glue Technician? + +### You rescue the glue technician. + +### The technician slaps adhesive restraints onto your body! (+RestraintAdded) + +### The technician polishes your restraints thoroughly! (DamageTaken) + +### The technician pours glue on you to make you stay still! (DamageTaken) + +### The technician inspects your restraints and adds a lock to spec! (DamageTaken) + + + +### Lab Assistant + +### The assistant envelops herself in her own bubble for protection. + +### Glue Bomb + +### Glue Technician + +### The technician trips and glues herself to the floor. + +### Quite sticky, innit? + +### Bow: This is a ranged weapon with a weapon ability. + +### Magic: Ignores evasion of ghost type enemies, can be used with abilities that require magic weapons. + +### Light: Can be used to cut even with bound arms. 50% reduced accuracy penalty from being bound. Can be held in mouth. + +### Offhand + +### Offhand: This weapon can be dual-wielded by some classes. + +### 2 Handed + +### 2 Handed: While wielding this as your primary weapon, you cannot wield an offhand weapon. Also this weapon can't be used while arms are tied. + +### Magical Focus + +### Magical Focus: Instead of losing accuracy, the stamina cost is increased when distracted. + +### Precision + +### Precision: Your arms need to be free to use this weapon. + +### Hands-Free + +### Hands-Free: Weapon can be used without free hands. + +### Shield + +### Shield: This weapon is intended for defensive use. + +### Heavy: This weapon takes +1 turns to switch to. Cannot be reduced to 0 by perks or upgrades. + +### Massive + +### Massive: This weapon either stuns or slows you after attacking with it. Handle with care! + +### Illumination + +### Illumination: This weapon is a light source. + +### Dual Wield + +### Designate an Offhand weapon to gain passive effects such as a light source, armor, or extra crit damage.|(Must equip Dual Wield spell to equip an offhand weapon) + +### Equip Offhand + +### Remove Offhand + +### Make a ranged attack with the spear. + +### Make a ranged attack with the pike. + +### Ranged Attack + + + +### Combat Training + +### Your training has granted a number of bonuses:|-Weapon stamina cost is reduced by 1% per 10 current WP, up to a max of 40%.|-Slow effects wear off more quickly.|-While you are above 0 WP you gain 1 slow resist. + +### This is your current offhand weapon. + +### You are unable to wield this weapon offhand at the moment. + +### This is your previously held weapon. Click to switch to it. + +### You can't hold the WPN in your current state. + +### Charge! + +### Dash and make an attack attack against a target within 2 tiles. If it deals 20% of their current hp in damage, you knock them back and take their place, otherwise they take +15% max hp crush damage from hitting the wall. If the attack misses, you still dash. Costs stamina equal to your sprint cost plus your attack cost. + +### You charge at the target! + +### You need to target an enemy. + +### You don't have enough stamina. + +### You need to be able to sprint. + +### You need to be able to attack. + +### There is no room to dash! + +### Tools of the Trade + +### Allows you to craft bombs, smoke bombs, flash bombs, and invisibility potions. + +### (You start having crafty thoughts...)|(Gunpowder can be obtained from chests or Alchemists)|(Ectoplasm can be obtained from ghosts) + +### (You craft a Smoke Bomb) + +### (You craft 3 Flash Bombs) + +### (You craft a Bomb) + +### (You craft an Invisibility Potion) + +### (You don't have the required material) + +### (Use 1 Gunpowder to make a Smoke Bomb) + +### (Use 1 Gunpowder and one Ancient Crystal to make 3 Flash Bombs) + +### (Use 2 Gunpowder to make a Bomb) + +### (Use 3 Ectoplasm to make an Invisibility Potion) + +### Gunpowder + +### You toss some gunpowder on the floor! No picking it back up now... + +### Highly flammable. Do not eat. + +### Creates gunpowder tiles on the target area, which can be ignited. + +### You pick up a sack of gunpowder. + +### You toss some gunpowder on the floor! + +### Dual Wield (Rogue) + +### Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or extra crit damage.|Rogues cannot wield heavy or massive weapons in the offhand unless they are multiclass.|(Equip Dual Wield spell to equip an offhand weapon, or use the Items menu) + +### Dual Wield (Wizard) + +### Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or spell damage bonuses.|Wizards can only wield magic weapons in the offhand unless they are multiclass, and receive +1 slow level if they wield a 2-handed, heavy, or massive magical weapon in the offhand.|(Must equip Dual Wield spell to equip an offhand weapon) + +### Arcane Tome + +### Contains advanced formulas and thrilling tales of thirsty wizards. Can not critically strike. + +### +5% magic damage. Offhand: Applies passive bonus. + +### You find a magical tome. + +### Open the book. What can go wrong? + +### Contains a malevolent spirit that wishes only to tie up damsels. Can not critically strike. + +### +10% binding effectiveness. Offhand: Applies passive bonus. + +### You find a magical tome with a sealed padlock on it. + +### You know the location of ancient leylines and can draw upon 100 additional mana. + +### You don't want to open the book... (need willpower) + +### Chain Spirit + +### You open the book and suddenly a binding aura surrounds you! + +### Mathematical Error + +### You open the book to an unfinished page and the magic ink short-circuits! + +### Cracks begin to form in your RestraintName! + +### Your RestraintName shatters and falls off! + +### Load Hotbar + +### Save Hotbar + +### Clear Hotbar + +### Confirm clearing hotbar? + +### Add to Hotbar + +### Surrender: Your willpower is 0, giving huge penalties to struggling, Block, Evasion, and Bondage Resist. + +### Unbound Keybindings! --> + +### You've not enough keys!!! --> + +### Update your Keybindings!!! --> + +### I have altered the keybindings. Pray I do not alter them further. + +### Barricade + +### You knock over the barricade! + +### Anti-Damsel Barrier + +### You disable the barrier! + +### Barrier + +### You shatter the barrier! + +### Magical Barrier + +### You destroy the barrier! + +### Mass of Shadow Hands + +### You banish the shadow hands! + +### The shadow hands caress you and latch on! (DamageTaken) + +### The shadow hands caress you and latch on! (+RestraintAdded) + +### Shadow Chains + +### You break through the chains! + +### Conjured Chains + +### Magic Damage + +### Physical Damage + +### Special Ability + +### Ranged + +### Staff + +### Toy + +### Teasing + +### A rope trap springs upon you! + +### A ribbon trap springs upon you! + +### A chain trap springs upon you! + +### Magical vines wrap around you suddenly! + +### A belt trap springs upon you! + +### You find yourself suddenly bound tightly by magic gear! + +### Magical rubber emerges from the floor and encases you! + +### Slime appears at your feet and starts encasing you! + +### You find yourself suddenly bound tightly in latex gear! + +### A rubber cube rushes out of the floor and engulfs you! + +### Sharp Claws + +### While your hands aren't covered, your attacks deal 10 bonus slash damage on hit and you can cut restraints. + +### Powerful Bite + +### Gain access to the Bite spell. + +### Slime Girl + +### You are a shapeshifting slime, granting +100 Glue Resist and can squeeze thru bars. Escaping is easy, but your powers are sealed while wearing cursed or magic restraints. + +### Cybernetic + +### You have mechanical parts, granting +10 Physical Armor, +15 Block, and +10% base physical damage. -100 Electric Resist. + +### Magic Blood + +### You come from a magical lineage, granting +10 Magic Armor and +10% magic damage. + +### Beast Girl + +### You have animalistic features such as a bite spell, -10% attack stamina cost, and 10 slash damage on hit while hands are free. -100 Charm Resist. + +### Demon Girl + +### You are related to eldritch entities, granting +50% shadow damage and the ability to teleport between shadows. You are weak to holy restraints and bright light. + +### You are a minor angel sent to perform a specific task. You are forced to wear a full set of divine restraints, but gain an infinite mana pool, +20 Magic Armor, and +25% magic damage. + +### Elven Ancestry + +### You were blessed with immortality by Ninril, Goddess of Restoration, granting -50% sprint cost and -30 Physical Resist. While your WP is above 0, you regenerate WP and heal nearby allies. + +### Bast's Blessing + +### You were granted undead immortality by Bast, granting a bite, claws, catlike senses, and stamina regen scaling with your current WP. Your WP gain is halved and you get -100 Fire Resist. + + + +### Minefield + +### Booby traps set by enemies are much more common. + +### Fortified + +### Barricades set up by enemies do not expire, and enemies set them up even when not alerted. + + + +### Pass thru helpless allies + +### Pass thru helpless enemies + +### Pass thru neutrals + +### Pass thru summons + +### Pass thru shopkeepers + +### Pass thru special NPCs + +### Stop when enemies are first sighted + +### Suppress during combat + +### Step during combat + +### 0.1s/turn + +### 1.5s/turn + +### 0.5s/turn + +### 0.01s/turn + +### Shadowy Grasp + + + +### Magical Tornado + +### The tornado blasts you with powerful winds! (DamageTaken) + +### You dispel the tornado! + +### Shield of Flame + +### You dispel the shield! + +### Overgrowth + +### You cut through the overgrowth! + +### Wall of Water + +### You dispel the water wall! + +### Ice Spikes + +### You break through the ice! + +### Earth Monoliths + +### You shatter the monoliths! + +### Gravitational Pull + +### The earth emits a deep hum below your feet... + +### Electrified Sphere + +### You smash the electrified sphere! + +### A bolt of lightning arcs to you! (DamageTaken) + +### Earth Keeper + +### The earth keeper sinks into the wall. + +### The earth keeper conjures restraints on your body! (+RestraintAdded) + +### The earth keeper locks a restraint! + +### The earth keeper knocks you away with a powerful kick! + +### The earth keeper massages you gently! (DamageTaken) + +### The earth keeper knocks you away with a strong kick! (DamageTaken) + +### Flame Keeper + +### The flame keeper steps away into a fiery portal. + +### The flame keeper grabs you, and volcanic restraints emerge from her armor! (+RestraintAdded) + +### The flame keeper locks a restraint! + +### The flame keeper flanks you! + +### The flame keeper offers a painful caress! (DamageTaken) + +### The flame keeper rides forth on a wave of fire! + +### Smoldering Trail + +### Fiery Greatsword + + + +### Tangling Vines + +### Enchanted Bubble + +### A bubble of magic water starts forming around you! + +### The gap in the bubble closes, and you are fully sealed within the bubble! + +### Magical water reduces your accuracy and slows you significantly! + +### You attack twice! + +### You gain a free move from Combat Maneuvers! + +### Access denied. + +### Facility is under lockdown. + +### Please scan ID to continue. + +### Security Door + +### You break through the security door! + +### High Security Door + +### You knock down the security door! + +### Blast Door + +### You knock down the blast door! + +### You sell the ITM for VLU gp. + +### You sell #x ITM for VLU gp. + + + +### Directional Vision + +### Your vision is reduced except in the direction you are facing. + +### Inertia + +### Turning 180 degrees while moving requires an extra turn + +### Heavy Inertia + +### Turning 90 degrees while moving requires an extra turn + +### You turn. + +### You turn around. + +### Take Command + +### Unlocks several spells for commanding allies. + +### Attention! + +### Select allies in an area + +### Designate allies in a 3x3 area to follow orders. + +### You select the units. + +### Deselect + +### Deselect allies in a 3x3 area + +### You deselect the units. + +### Toggle Selection + +### Select ally + +### Toggle an allied unit's selection status. + +### You toggle the unit's selection. + +### Maneuver + +### Select target location + +### Order all selected units to move to the targeted point. + +### You order your units to move! + +### Hold Position + +### Selected units do not pursue enemies. + +### Free Movement + +### Cancels Hold Position on selected units. + +### Deselect All + +### Deselects all selected units. + +### On Me! + +### All selected units start following you + +### Disperse + +### All selected units stop following you + +### Defensive Order + +### All selected units switch to Defensive mode + +### Aggressive Order + +### All selected units switch to Aggressive mode + + + +### Unlock using magic + +### Include Weapons + +### Merge Armor + + + +### The NPC does not have enough money left! + +### You order the ENMY to come to you. + +### You order the ENMY to disperse. + +### You deselect all allies and select only the ENMY. + +### You remove the ENMY from your party. + +### Anti-Magic + +### Long ago, war raged across the globe.|Countless lives were lost fighting over pieces of rock in a vast ocean.|People turned to science, religion, and magic, anything to escape this cruel fate. + +### Then the archmagus, Sariel Vinlaga, discovered the secret of immortality.|Sharing her research across the globe, she laid the groundwork for an era of peace.|A great civilization arose, where magic and technology flourished. + +### But in the end, Sariel's experiments left her weakened and unable to save herself from death.|Without a leader, the Old Civilization collapsed into tyranny as warlords enslaved thousands.|Refugees fled across the sea in search of a new life, and in time the old empire was forgotten. + +### Hundreds of years later, a group of adventurers found a lost island full of ancient technology.|Countless visitors now flock to the ruins in search of wealth and wisdom...|...Unaware of the devious secrets sealed within long ago. + +### An item has increased your spell damage! + +### AMNT ice damage/turn vs. Frozen + +### AMNT shadow bleed (10 turns) + +### Sealing Talisman + +### You were hit by one of Fuuka's talismans. Fuuka's magic begins sealing your power! + +### You were hit by one of Fuuka's talismans. Fuuka's magic makes you sluggish!! + +### You were hit by one of Fuuka's talismans. Fuuka's magic renders you helpless!!! + +### You were hit by one of Fuuka's talisman projectiles. Fuuka's magic is restricting you! + +### Sealing Shadows + +### Shadowy magic is restricting you! + +### A powerful seal holds you in place temporarily!!! + +### You lock yourself in magical locks! + +### A collar module comes off with the collar! + +### Shock Module + +### A sinister device used to keep unruly wolfgirls in check. + +### If it works on them, it sure as heck works on you. It has a warning label that says: 'CAUTION: NOT WATERPROOF' + +### Tracking Module + +### A homing device used to track unruly pets that wander too far. + +### It has a warning label that says: 'CAUTION: NOT WATERPROOF' + +### Your RestraintName stops working due to water damage! + +### Your RestraintName sustains water damage from the high-pressure water! + +### The RestraintName fizzles out! + +### Your RestraintName short-circuits briefly from the electrical damage! + +### Quit Game + +### Your RSTRNT glows and its seal vanishes as the shrine's energy fills the air. + +### The seal on your RESTRAINTNAME weakens as you simmer just below the edge. + +### Through your determination, you suprress the seal on your RESTRAINTNAME!!! + +### The seal on your RESTRAINTNAME weakens as you maintain your composure. + +### Through your determination, you suprress the seal on your RESTRAINTNAME. + +### You lose focus and the seal on your RESTRAINTNAME strengthens! + +### The item refuses to budge as you try to take it off. + +### The item bears a seal of dark pleasure. You can suppress it by edging yourself. + + + +### Saved Outfits + +### Manage this Outfit + +### Change Pose + +### Quick Color Palette + +### Item Color + +### Item Catalog + +### Layers: + +### Hex Code: + +### Toggle Struggle UI Mode + +### Change Character Pose + +### Make Bullets Transparent + +### X-Ray Vision + +### Show Quick Inventory + +### Skip Tutorial + +### Mod Compat Mode (requires reload) + +### Welcome to Kinky Dungeon! It looks like this is your first time,|Would you like a brief walkthrough of the interface? + +### (Leave and Disable Tutorial) + +### (Yes Please!) + +### (It'd like a hands-on lesson) + +### Sure! I can lead you through some excercises in a safe and controlled environment.|This way you can figure things out at your own pace.|To start, choose one of the lessons below: + +### (Give me some rope lessons) + +### (Give me a nice leather outfit) + +### (I enjoy the cold embrace of steel) + +### (I love rubber!) + +### (On second thought, maybe not) + +### (About that hands-on lesson...) + +### This is you.|Over the course of the game, you will probably get tied up.|The controls to escape are located over your character.|Simply hover the mouse over your character to see them. + +### There are four main ways to escape restraints:|Struggling, which is effective against flexible and weaker restraints,|Cutting, which depends on your held weapon and the item's properties,|Unbuckle/Untying, which depends on having free hands,|And Unlocking, which is required before you can Unbuckle. + +### These are options for how to display your character.|You don't have to worry about them for now,|but when your character is tied up you may find them useful|...or enjoyable. + +### This is the buffs bar.|It shows various values and buffs relating to your character.|You can click the gold triangle to expand it,|Showing additional info about your character. + +### These are the action buttons.|You can use them to perform various actions like closing doors or sprinting.|You can also toggle various settings such as automatically passing|through allies or auto-pathing when there are no enemies nearby.|You can also swap between recently used weapons. + +### These are various submenus.|Your Inventory is used to brows items and use or equip them.|The Journal contains lore, notes, and hints gathered along your journey.|The Journal also contains info on available quests,|and your reputation with various factions. + +### This is the status bar, which gives info on your base stats.|Distraction determines how easy it is to cast spells and resist teasing.|Stamina is required to sprint and attack with a weapon.|Mana is used to cast spells. You have what is called a 'Mana Pool,'|which is excess mana that slowly refills you mana bar until it runs out.|Finally, running out of Willpower makes it much harder to escape bondage. + +### This is the hotbar.|Here you will find various spells and customizable actions.|You can customize it through the Spells submenu by clicking on a spell.|You can also add items, armor, and consumables to it from the Inventory. + +### Finally, this is where the message log will be.|It provides a written record of what happened the last few turns.|You can click the 'Log' button to expand the log,|Allowing you to look much further back. + +### Thats it for the UI.|If you want a more hands on tutorial, enter the portal to the top right,|near the training dummies.|You can click on NPCs (such as the ghosts in this room) to talk to them. + +### Game + + + +### Search ITMNS: + +### Search Items: + +### Search Spells: + +### Free + +### Disarmed!!! + +### Show Buffs and Stats + + + +### Remove Devotion + +### Devote Yourself + +### Pray for Assistance + +### This shrine bears a request carved in stone: + +### Accept the Quest + +### You accept the goddess' quest. + +### You cannot accept that quest right now. + +### Removes your devotion from this goddess. + +### You are not devoted to this goddess. + +### Guarantees a quest from this goddess on every floor. + +### You are already a devotee of this goddess. + +### Offer gold in exchange for help. Destroys the shrine. + +### Ask for help without offering gold. + +### You have already prayed at this shrine. + +### Listen to what the Goddess asks of you. + +### Accept the Goddess' quest. + +### Drink the mana in the shrine. Can be done once. + +### Bottle the mana in the shrine for later. Can be done once. + +### Cancel Quest + +### Cancels the quest. You will not be penalized. + +### You can't cancel this quest. + +### You have no quests currently. + +### A new quest has been added to your Journal. + +### Find the dressmaker's prized dress and wear it in front of her. + +### Rescue the bandit from false imprisonment. + +### Teach some unruly maids a lesson. + +### Defeat a rebel leader and show them their place. + +### Help the student acquire a scroll! + +### You are being chased by a band of relentless poachers. + +### Slay the Rope Kraken. + +### You did not do your quest! The Goddess has decided to punish you. + +### You have pleased the Goddess. + +### The Goddess calls you a good girl. + +### Rescue some alchemists from their own experiment. + +### Stop rebels from making a pact with primordial beings. + +### Decommission some malfunctioning drones. + +### Resolve a dispute between elves and catgirls by tying up both sides. + +### Repel a planar incursion by a dangerous demon. + +### Stop some witches from performing a dubious summoning ritual. + +### Defeat a congregation of the Shadow Clan. + + + +### The Goddess grants you knowledge of SpellLearned! + +### You Goddess grants you +AMOUNT spell points! + +### The Goddess bestows a WeaponAcquired on you! + +### The Goddess grants you a ArmorAcquired! + +### The Goddess gives you a heavenly pastry. + +### The Goddess awards you an ancient key of great importance. + +### Game Setup + +### Challenge Settings + + + +### Challenge Settings: + +### Advanced + +### Expert Tools + +### Exits locked!|Find NUMBER keys! + +### Got the keys! + +### Find the keys hidden in the level. Enemies can steal the keys if you aren't careful. + +### There seems to be a locked high-security door. Looks like you need keys to open it. + +### Exits locked!|Find a lever! + +### Exits unlocked! + +### Lever Hunt + +### Find the lever hidden in the level to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to pull a lever to open it. + +### Exits locked!|Find control panel! + +### Panel Hunt + +### Find the control panel hidden in the level to unlock the door. + +### There seems to be a locked high-security door. Looks like you need find a control panel to open it. + +### BOSS ROOM + +### BOSS ROOM CLEARED! + +### Boss + +### Defeat the boss to unlock the door. You can also unlock it by losing to the boss and being penalized. + +### There seems to be a locked high-security door. Looks like you need to defeat the boss to open it. + +### Exits locked!|Defeat NUMBER TYPE! + +### Quota Reached! + +### Bounty + +### Defeat the specified targets to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to defeat the targetted enemies to open it. + +### Exits locked!|Defeat TYPE! + +### Miniboss defeated! + +### Dangerous Bounty + +### Defeat the specified strong enemy to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to defeat the miniboss to open it. + +### Exits locked!|Open NUMBER Chests! + +### Chest Hunt + +### Unlock the specified number of chests to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to open more chests to open it. + +### Exits locked!|Accept NUMBER Quests! + +### Quest Hunt + +### Accept the specified number of goddess quests to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to accept more quests to open it. + +### Exits locked!|Trigger NUMBER Traps! + +### Trap Hunt + +### Trigger the specified number of traps to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to trigger more traps to open it. + +### Room bugged. Please Report. + +### This door failed to load and cannot be opened. Please report this bug to Ada with a save code. + + + +### Exit sealed!|Find the lair! + +### Sigils erased! + +### Dragon defeated! + +### Draconic Seal + +### A dragon has sealed the entrance. Defeat the dragon, or erase the sigil from her lair. + +### A draconic spell keeps the door sealed. You will have to confront its owner. + + + +### Exits locked!|Destroy NUMBER Servers! + +### Security System Compromised! + +### Clearance Granted! + +### Destroy Nevermere Servers + +### Destroy Nevermere servers to unlock the door. + +### Nevermere Inc. placed a computerized lock on the door. Destroy the security servers to pass. + +### Nevermere Server + +### Server smashed! + +### Destroy Drone Servers + +### Destroy Drone Node Servers to unlock the door. + +### The path forward is controlled by several ancient Drone Servers. Destroy them. + +### Drone Server Node + +### Drone node destroyed! + +### Rusty Server Node + +### loud beeping... + +### (Cursed) + +### (Purified) + +### of Agility + +### Precise + +### Silent + +### Blizzard + +### of Warding + +### of Freedom + +### of Resistance + +### of Power + +### Entuned + +### Draining + +### of Echoes + +### Infused + +### Explosive + +### Flaming + +### Focusing + +### of Empowerment + +### of Destruction + + + +### Phase Dance + +### For 4 turns, your movement does not advance time. Attacking or casting counts as one move and passes time as normal. + +### You are F A S T + +### Double Accel + +### Slow down time by 1/2 for 10 turns (world time). Stamina regens 50% slower. + +### Time is slowed by 2x + +### Triple Accel + +### Slow down time by 1/3 for 10 turns (world time). Stamina regens 75% slower. + +### Time is slowed by 3x + +### Quad Accel + +### Slow down time by 1/4 for 10 turns (world time). Stamina does not regen. + +### Time is slowed by 4x + +### Total Accel + +### Stop time 10 turns (world time). Stamina does not regen. + +### Time has come to a halt... + +### Time slows down by 2x! + +### Double Accel! + +### Time slows down by 3x! + +### Triple Accel! + +### Time slows down by 4x! + +### Quad Accel! + +### Time has ceased to pass. + +### Total Accel! + +### You begin to move at lightning speed! + +### ACCEL BEGIN! + +### Not enough mana. + +### You need to free your legs. + + + +### Swap + +### Choose a target with a clear line of sight to you and switch places with them. + +### You point at the target and swap places with them! + +### You point at the target and try tp swap places, but they resist! + +### You point at the target and try tp swap places, but they resist and the spell fails! + +### Choose target to swap with + +### The ENMY blocked your attack, negating it entirely! + +### The ENMY blocked your attack, reducing the damage by PCNT%! + +### The ENMY remains unscathed after putting up a strong defense! + +### The ENMY puts up surprising resistance, reducing the damage by PCNT%. + +### no damage + + + +### Raise Defenses + +### Spend 90 stamina to shield yourself from damage equal to your Block. Lasts 10 turns or until you attack. + +### Evasive Maneuvers + +### While active, you evade almost all attacks, but your stamina is drained by 50 per turn plus 10 per slow level. The base stamina cost is reduced by your Evasion. + +### Break Free + +### Consume 20 Battle Rhythm to increase escape power by +20% plus 1% of Bondage Resist. Lasts 60 turns or until your willpower reaches 0. + +### Problem Solving + +### While active, struggling takes an additional 10 turns, but escape power bonuses from tools and buffs is increased by +(25 + 20% Bondage Resist)% + + + +### You run out of strength to keep dodging... + +### You can't muster the strength to dodge right now... + +### You prepare to dodge!!! + +### Your expertise and skill provides you with additional tool effectiveness! (+AMOUNT%) + +### You raise your defences! + +### Your defenses are raised! + + + +### You don't have the will to break free. + +### You don't have enough Battle Rhythm. You need 20. + +### You channel your fighting spirit into your desire for freedom! + +### Your struggle power is greatly increased!!! + +### The teleportation partially succeeds due to an obstruction, placing you near the intended point. + +### The teleportation fizzles due to obstruction. + +### Confirm + +### Confirm and OVERWRITE SAVE + +### What is your name? + +### Enrage + +### Scream loudly, causing nearby enemies to investigate and increasing Battle Rhythm by 10. Has a 100 turn cooldown. + +### You shout loudly and shake your fist at the sky! (+10 BR) + +### Mmmph! (You can't shout while gagged) + +### You are plenty mad enough as is. + +### You are too tired to rage. Perhaps try a warm cozy bed instead? + +### turns + +### Your shield absorbed AMNT damage. + +### You are currently shielded from damage and some spells. + +### No offhand weapon set. Activate the spell in your hotbar to set one. + + + +### Flash Portal + +### After channeling for 2 turns, teleport to a nearby location (including into darkness). All adjacent creatures are teleported with you, in random order. + +### You call upon a misty portal to transport you and nearby creatures! + +### Transportation Portal + +### After channeling for 3 turns, teleport to a nearby location (including into darkness). Transports only allies, but they are stunned for the duration. + +### You call upon a misty portal to transport you and your allies! + +### Banishing Portal + +### After channeling for 3 turns, teleport all adjacent creatures to a point you can see. Does not teleport yourself. + +### You call upon a misty portal to transport those around you! + +### Rift + +### Tearing a rift in space, you teleport to a location (including into darkness). Leaves behind a rift for 4 turns, which enemies can follow you through. + +### You tear open a hole in space and step through! + +### Shadow Dance + +### While standing in a shadowed location, you can teleport to a nearby shadowed location. You can also teleport adjacent to shadow creatures. + +### You slip between the shadows... + +### Choose a shadow + +### Teleportation Circle A + +### When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. When learned, unlocks teleportation circle B and C as well. + +### You begin a teleportation ritual... + +### Choose a location to put a teleportation circle, or yourself to teleport to the created circle. + +### Teleportation Circle B + +### When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. + +### Teleportation Circle C + + + +### Nature Spirit + +### The nature spirit returns to the earth from whence it came. + +### Vine Bolt + + + +### Gunslinger + +### Weapons abilities and other abilities that cost charge contribute 20% of their cost to Battle Rhythm. + +### Effortless Assault + +### Weapon stamina cost is reduced by a percentage equal to your Battle Rhythm. + +### +50 Evasion from using Phase + +### Blade Dance + +### Costs 60 stamina to dash to an adjacent spot. If you are holding a physical weapon, deals cleave damage to nearby enemies equal to 50% weapon damage. If you have a Light offhand weapon, deal 75% of its damage as well. + +### You spin towards a location, slashing at nearby enemies! + +### The Shadow Within + +### Shadow Dance no longer requires you to be in shadow in order to dash to another shadow, but the mana cost is doubled when doing so. + + + +### Summon Holy Orb + +### Select where to put the holy orb (cannot place on occupied squares) + +### Create a stationary holy orb that lasts indefinitely and heals allies. It also fires blinding bolts at enemies within its aura. If you let go of yourself near a holy orb you are immediately punished. Should not be placed within 8 tiles of each other. + +### A holy orb descends, blessing you with its roundness. + +### You call upon the root of all enlightenment! + +### Holy Orb + +### The holy orb returns to its place in the sky. + +### Holy Bolt + +### The holy orb observes your lack of discipline, and issues a punishment. + + + +### Divine Chastity Belt + +### A chastity belt forged in holy light. Only a Goddess' will can release you. + +### There is no way even an angel can free herself. Its divine aura causes vibrators to cease right before you go over the edge. + +### Your Divine Chastity Belt causes the vibrators to stop. + + + +### A chastity belt forged in holy light. Only the will of a Goddess will release you! + +### You find a heavenly chastity belt. Who could it be for? + +### Divine Chastity Bra + +### A chastity bra forged in holy light. Only a Goddess' will can release you. + +### There is no way even an angel can free herself. Its divine aura prevents you from pleasuring yourself. + +### Your Divine Chastity Bra causes your whole body to go numb. + +### A chastity bra forged in holy light. Only the will of a Goddess will release you! + +### You find a heavenly chastity bra. Who could it be for? + +### Heavenly Chastity Belt + +### There is no way even an angel can free herself. Its divine aura causes vibrators to dampen right before you go over the edge. + +### Your Divine Chastity Belt magically dampens the vibrations just enough to edge you. + + + +### Heavenly Chastity Bra + +### There is no way even an angel can free herself. Its divine aura converts self-pleasure to stamina. + +### The divine aura drains the pleasure from your self-pleasuring and converts it to stamina. + + + + + +### Magic Arm Belts + +### Highly secure belts enchanted with magic. + +### Magic Leg Belts + +### Magic Ankle Belts + +### The Liquid Metal starts engulfing you! + +### The Liquid Metal explodes and covers you! + +### The Liquid Metal takes advantage of your status and engulfs you! + + + +### Silver Burst + +### Select a liquid metal tile + +### Target a liquid metal tile. After 3 turns, it erupts, spreading more liquid metal and engulfing any nearby creatures. Deals DamageDealt crush damage and applies 80 points of metallic binding. + +### A powerful explosion simmers beneath the surface...' + +### The ground shakes as a huge wall of liquid metal approaches! + +### Liquid Metal Cube + +### The liquid metal cube dissolves into a huge pile of glittering dust. + +### The liquid metal cube engulfs you and squeezes tightly! (DamageTaken) + +### The liquid metal cube engulfs your body and hardens, taking the form of restraints! (+RestraintAdded) + + + +### Skeleton Archer + +### Cursed Arrow + +### Because your hands are unavailable, you kick the target instead. + + + +### Your former owners are looking for you across the seven planes. + +### A local business is missing one of their models, and will stop at nothing to find her. + +### The Doll Shoppe + +### Elemental Slavers + +### Your duty as a maid is to keep the place clear of dirt and other hazards. + +### Dirt Pile + +### You clear out the dirt pile + +### A ENMY was lurking inside the dirt pile! + +### You skipped your duty and left some dirt missing in the last level! + +### The Dollmaker does not take no for an answer. + +### Fuuka's shrine maidens would like to have a word with you. + +### Your instructor will meet with you at regular intervals for further training. + +### Hogtied! + +### Experience a comprehensive rope bondage experience. + + + +### Receive the following restraints: + +### You will be bound with some form of restraint. + + + +### Gag Geist + +### The gag geist goes silent. + +### The gag geist teases you playfully!! (DamageTaken) + +### The gag geist gags the girl with a ghastly grimace! (+RestraintAdded) + +### Poltergeist + +### The poltergeist goes silent. + +### The poltergeist gropes and teases you playfully, exhausting your stamina! (DamageTaken) + +### The poltergeist binds you with... something? (+RestraintAdded) + +### Invisible Gag + +### It's a gag, but invisible! + +### You wonder what color it is. + +### Invisible Blindfold + +### It's a blindfold, but invisible! + +### How exactly is this supposed to work? + +### Invisible Armbinder + +### It's an armbinder, but invisible! + +### Invisible Legbinder + +### It's an legbinder, but invisible! + +### This is starting to get cruel... + + + +### Strangely dressed zombies start approaching you!! + +### A floating chastity item appears and starts flying toward you! + +### You hear moaning as the statues start to move... + +### Devious tomes emerge from the bookshelves! + +### Armed mushrooms emerge from the ground to defend their home! + +### Playful ghosts slip through the walls, giggling to themselves! + +### Ancient drones drop from the ceiling and come to life! + +### You were always being watched... + +### You find a store of gunpowder! + +### Explosive Barrel + +### The explosive barrel falls apart and drops its gunpowder. + +### The explosive barrel catches fire and explodes! + +### The item demands copious mana, more than you can supply. You'll have to tie up a mage. + +### The cursed seal glows and pulsates as you struggle fruitlessly. + +### The curse has been lifted through judicious application of spellcasters. + +### The cursed item drains all of the caster's mana. It demands more. + + + +### Punishment Suit + +### A tool used by Nevermere on the most difficult and recalcitrant wolfgirls. + +### Designed to contain superhuman strength, struggling out of this would be a major feat. + +### Shield of (un)Clarity + +### Channel your clarity of mind into a powerful shield, filling your distraction bar completely and granting a temporary shield equal to 50% of the DP generated. 10% of the DP gained is gained as Desire, which prevents DP decaying below a certain point. + +### You form a... distracting mental barrier, shielding yourself for AMNT damage!!! + +### You are too distracted to form a mental barrier... + +### You have the mental clarity but not the magical clarity! (not enough mana) + +### You have formed a mental barrier... + + + +### Desire Burst + +### Overload Essence motes in an area, costing 10% max DP worth of Desire each. They explode, dealing (10 + 20% max DP) charm damage to enemies hit. If you don't have enough desire, the damage is reduced proportionally.||(Desire is the heart-shaped meter below your DP bar, and is gained slowly by being distracted) + +### You channel your distraction into the mote, overloading it! + +### You channel your distraction into the motes, overloading them! + +### You don't have enough of a desire to do that. + +### You must target at least one Essence Mote. + +### You have the desire but not the mana! + + + +### Your divine-locked restraints can only be removed by completing a shrine quest. + +### The Goddess hates you. That won't work. + + + +### Harvest + +### Requires a slashing weapon equipped. Activate to harvest all adjacent vine tiles, with a 25% chance per tile to obtain a seed.|Seeds can be planted to form gardens, which will grow in 100 turns to become vegetables, which can be eaten to restore WP or sold to the shopkeeper. + +### You twirl your weapon, harvesting AMNT seeds! + +### There is nothing to harvest. + +### Telekinesis 101 + +### Unlocks telekinetic abilities. Toggle on to equip weapons while bound, but at 0% accuracy. Learn Recover Object. + + + +### Recover Object + +### Use telekinesis to pick up items and open chests from a distance. Refunds 75% of mana cost if not used to open a chest. + +### The items float to you! + +### There's nothing to pick up. + +### The chest is locked. + +### Select a tile with items + + + +### Enhanced Recovery + +### Upcast to increase range and recover objects in an area. + +### That container is locked! + +### Select an area with items + + + +### Kinetic Slash + +### Swing an equipped weapon (not unarmed or hands free) in a line, slashing enemies in the way with 20 + 80% weapon damage. Counts as an attack. +10 mana cost if wielding a Heavy weapon. + +### You swing! + +### Choose where to swing (must not be unarmed or hands free weapon) + + + +### Kinetic Lance + +### Propel your weapon at devastating speed, piercing enemies for 30+160% Weapon Damage and dropping it at the end of the trajectory. Counts as an attack. +15 mana cost if wielding a Heavy weapon. + +### You propel your weapon forward! + +### Choose where to launch your weapon. + + + +### Sagitta + +### Fire a projectile. If this projectile hits an enemy, make one attack against an enemy for 10+40% weapon damage. +5 mana cost if wielding a Heavy weapon. + +### You unleash a deadly projectile! + +### Choose aim direction. + + + +### Sagitta Assault + +### After casting Sagitta, you can recast it up to three more times without advancing time. + +### Psychokinesis + +### You can ignore components for telekinetic spells, however spells generate distraction (based on mana cost) when cast this way due to the mental strain. Unable to use at 100% DP. + +### Kinetic Mastery + +### Negates the penalty for 2-handed weapons. Also gain the following effects:|-Kinetic spells and Sagitta cost 30% less while wielding a Light weapon.|-Kinetic spells and Sagitta gain +15 base damage when wielding a Heavy weapon. + +### Grasp + +### Cast on an enemy to snare them for 20 turns, or until you leave range/are incapacitated. Cast on a point to throw the grasped enemy in that direction, dealing 40 crush damage if they hit a wall or another enemy. + +### You grab the ENMY using telekinesis and hold them in place! + +### You throw the ENMY! + +### Choose a target or a location (if a target is currently grasped) + + + +### Perfect for a lifestyle of love and peace. + +### Deals crush damage. Stuns on critical. Ouch! + +### You pick up a particularly nice rock. + + + +### You pick up a device for snuffing out candles and torches. + +### Candle Snuffer + +### You put out the torch. + +### A handy device for putting out torches and lanterns. + +### But why would you want to do that? You hidin' something? + +### You find a bag full of sacks. Or is it a sack full of bags? + +### Recursive Bag + +### You cover the light source. + +### Bags inside a bag of bags inside a bag of bags + +### Can be placed over light sources to cover them. + +### The snuffer doesn't work on that light source. + +### The bag can't cover that light source. + +### You remove the bag from its light source and place it back inside your bag. + +### There. Now it's time to have some fun~ + +### How utterly helpless~ + +### Let's see how long you last. + +### I've got you! Now let's have some fun! + +### I think I'll help myself to you for a bit~ + +### Gosh, you're so cute like that! + +### I'm going to have to search you, miss~ + +### Let's check your restraints. + +### You look so cute like that, miss! + +### All nice and tight. Certainly no longer a threat~ + +### I'm going to make sure you're nice and tight~ + +### Surely nothing can happen now! + +### Rubber Elemental + +### The rubber elemental's restraints snap onto her and she falls over hogtied. + +### The rubber elemental molds itself into restraints! (+RestraintAdded) + +### The rubber elemental squeezes you with its appendages! (DamageTaken) + +### The rubber elemental forms rubber locks around all your restraints! (DamageTaken) + +### Your ropes are enchanted with a lesser spell! + +### Your ropes are enchanted with a magic spell! + +### Your ropes are enchanted with a powerful spell! + +### Your ropes are enchanted with a peerless spell! + + + +### Shibari Witch + +### The shibari witch blows a kiss and says goodbye. + +### The shibari witch ties you tight! (+RestraintAdded) + +### The witch rubs your body sensually! (DamageTaken) + +### The Shibari Witch takes your clothes off! + + + + + +### A Hard Place + +### While your willpower is 0, your mana pool slowly drains and your max stamina regen point is reduced by 30%. + +### The Spark of Magic + +### When your mana pool is exhausted, your attacks deal 50% reduced base damage. + + + + + +### Burned Out + +### Casting spells reduces willpower based on how little distraction you have, also you cannot play with yourself. + +### Winded + +### While below 10% stamina, evasion is severely reduced and your slow level is increased by 1. + +### Lost One + +### The being vanishes in front of you. + +### The being grabs you, causing your body parts to freeze in time!!! (DamageTaken) + +### The being has already bound you! (+RestraintAdded) + +### The Timekeeper + +### The Timekeeper releases her grip on the timeline. + +### The Timekeeper takes the time to enjoy herself with you... (DamageTaken) + +### The Timekeeper enacts judgement for disrupting time! (+RestraintAdded) + +### Analysis + +### You pick up a latex projector + +### Can't Touch That + +### When both arms and hands are severely bound, you can no longer pick up items without an ally nearby. + +### You can't pick that up without help. + +### Grounded + +### When arms are tied and feet are linked, you cannot get up from a kneeling position without help or a wall. + +### You take more time getting up due to your bindings. + +### You can't get up without help. + +### Your ally helps you back up. + +### You get back up using the corner. + +### You get up to your knees using the wall. + +### You're too tied up to close the door. + +### The chest opens on its own. + +### You can't use your hands for that, but you can crouch to use your mouth. + +### Heel Training + +### Start locked in a pair of heels with no heel training. + +### Gag Training + +### Start locked in a gag with no gag training. + +### Corset Training + +### Start locked in a corset with no corset training. + +### Sensory Training + +### Start locked in a blindfold and headphones with no Sensory training. + +### Hard to Master: Heels + +### Heel training is significantly slower. + +### Hard to Master: Gags + +### Gag training is significantly slower. + +### Hard to Master: Corsets + +### Corset training is significantly slower. + +### Hard to Master: Sensory + +### Sensory training is significantly slower. + +### Head Start: Heels + +### Start at Heel training level 5. + +### Head Start: Gags + +### Start at Gag training level 5. + +### Head Start: Corsets + +### Start at Corset training level 5. + +### Head Start: Sensory + +### Start at Sensory training level 5. + +### Classic Heels + +### Removes Heel Training and tripping mechanic. Restraining heels slow instead. + +### Trust Fall + +### Hides the balance meter while wearing heels and/or unsteady. + +### Poor Balance + +### You take longer to get up and are less skilled at wearing high heels. + +### Balance: AMNT% + +### Balance: AMNT% (Sprinting Disabled!!!) + +### You lose your balance and fall over!!! + +### Training Level: AMNT + +### Favorite + +### Unfavorite + +### Drop + +### Attach + +### Attached + +### Add to Quick Slot 1 + +### Add to Quick Slot 2 + +### Add to Quick Slot 3 + +### Add to Quick Slot 4 + +### Try to Cut + +### Struggle! + +### Try to Unlock + +### Add a Lock + +### Try to Remove + +### Try to Pick + +### Examine the Curse + +### Remove the Curse + +### Feed this to her + +### Sell for VLU gp + +### Sell ALL for VLU gp + +### Sell all but one for VLU gp + +### You feed the RSTR to the ENNME! (AMNT1/AMNT2 hp) + +### Choose a food item or willpower potion + +### Chain Rune + +### Ribbon Rune + +### Nature Rune + +### Belt Rune + +### Leather Rune + +### Latex Rune + +### Latex Cube Rune + +### Slime Bubble Rune + +### Bubble Rune + +### Spherical Rune + +### Ball Rune + +### Rubber Rune + +### Slime Rune + +### +AMNT gp + +### ENMY lets go of herself for AMNT damage! + +### Sonar + +### Emit a ping to highlight floors and tiles in a large radius. The ping is audible and attracts enemies to your position. + +### You emit a loud noise and listen for echoes... + +### Your mouth is too heavily stuffed! + +### You don't have the mana to cast Sonar! + +### The weights swing around and tug on your nipples! + + + +### More Kinky Furniture + +### Replaces 60% of cages with a different kind of kinky furniture such as display stands. + +### Collection + +### Storage + +### Management + +### You don't have anywhere to manage your prisoners! Yet... + +### Your collection is empty. Use binding attacks to tie up and capture damsels! + +### Personality + +### Switch + +### Bratty + +### Corrupted + +### Feral + +### Status + +### Guest + +### Servant + +### Manager + +### Opinion + +### Prisoner #NUMR/TTL + +### Guest #NUMR/TTL + + + +### Select a character to examine + +### Former Faction: + + + +### Miku + +### Nevermere + +### Bounty Hunter + +### Dressup Co. + +### Scholarly + +### Witch's Coven + +### Warden + +### Curse + +### Fungal + +### Bast + +### Elemental + +### Royal + +### Choose default outfit palette: + +### Auto Load Mods + +### SUSPICIOUS MOD DETECTED + +### The bright light hurts your dark-adjusted eyes! + +### Unconventional Warfare + +### Select a weapon to attach it to your body. You can have one attached weapon at a time. Attaching it takes 5 turns.|An attached weapon can be equipped without hands and maintains 60% accuracy as long as you have arms or legs unbound. + +### Guerilla Fighting + +### Light weapons can be wielded if you have your mouth free, at 75% accuracy. + + + +### Tough Armor (1/2 crit mult while aware) + +### Absolute Armor (1/2 crit mult) + +### Rename + +### Reset to NME + +### Enlarged View + +### Back to Game + + + +### Servants + +### Prisoners + +### Promote to Servant + +### Demote + +### Delete Guest + +### Really Delete Guest? + +### The ENMY tries to grab you! + +### The ENMY reaches out and gives your breast a squeeze! (DMGDLT) + +### The ENMY squeezes your breasts as you raise your arms for a spell! (DMGDLT) + +### The ENMY reaches for you and fails! + +### The ENMY gives your butt a light slap as you cast! (DMGDLT) + +### The ENMY gives your butt a good slap as you sprint past! (DMGDLT) + +### The ENMY tries to spank you but misses! + +### The ENMY gives your butt a squeeze! (DMGDLT) + +### The ENMY gives your butt a squeeze during your cast! (DMGDLT) + +### The ENMY gives your butt a squeeze from behind! (DMGDLT) + +### The ENMY gives your butt a squeeze as you pass by! (DMGDLT) + +### The ENMY reaches for you but misses! + +### The ENMY tickles your armpits! (DMGDLT) + +### The ENMY tickles under your raised arms! (DMGDLT) + +### The ENMY tries to tickle you! + +### The ENMY tickles your feet! (DMGDLT) + +### The ENMY takes off your shoes and tickles your feet! (DMGDLT) + +### The ENMY pats you gently on the head. (DMGDLT) + +### The ENMY pats you gently on the head as you fail your spell... (DMGDLT) + +### The ENMY tries to pat you on the head but decides not to. + +### The ENMY behind you gives your shoulders a nice massage! (DMGDLT) + +### The ENMY reaches for your shoulders but you slip free! + +### The ENMY calls you cute! (DMGDLT) + +### The ENMY blushes at your cuteness! + +### The ENMY makes fun of you! (DMGDLT) + +### The ENMY struggles to find words! + +### The ENMY buzzes you with her VTY! (DMGDLT) + +### The ENMY catches you and teases you with her VTY! (DMGDLT) + +### The ENMY reaches for her VTY! + +### The ENMY sticks a VTY into you! (DMGDLT) + +### The ENMY sticks a stuffing into your open mouth! (DMGDLT) + +### The ENMY reaches for your mouth and fails! + +### The ENMY takes advantage of the gag around your neck~ (DMGDLT) + +### The ENMY reaches for the gag around your neck! + +### The ENMY pulls your hands together and sticks a clip between them! (DMGDLT) + +### The ENMY grabs your wrists but you pull away! + +### The ENMY pulls your weapon away! + +### The ENMY tries to pull your weapon away but you maintain your grip! + +### The ENMY reaches for your inventory but can't quite reach it! + + + +### More Armbinders + +### Armbinders are favored over other heavy bondage. + +### Less Armbinders + +### Armbinders are less favored over other heavy bondage. + +### More Boxbinders + +### Boxbinders are favored over other heavy bondage. + +### Less Boxbinders + +### Boxbinders are less favored over other heavy bondage. + +### More Straitjackets + +### Straitjackets are favored over other heavy bondage. + +### Less Straitjackets + +### Straitjackets are less favored over other heavy bondage. + +### More Yokes + +### Yokes are favored over other heavy bondage. + +### Less Yokes + +### Yokes are less favored over other heavy bondage. + + + +### (blocked!) + +### (dodged!) + + + +### You crouch and move slowly. + +### Owned by: + +### Warden's Belt + +### You may go on your way, but only as long your freedom is useful to her. + +### A golden belt that enforces respect for the Goddesses. Breaking spell orbs results in a punishment. + +### Belt of Privilege + +### You've defeated the Warden, proving that you are worthy to take what you want. + +### A golden belt that marks you as a person of great import. -50% rep penalty for breaking orbs. + +### Sharpshooter + +### You teach the warden's servant a lesson. + +### The sharpshooter pulls your arms behind your back! (+RestraintAdded) + +### The sharpshooter takes advantage of your weakness and squeezes your breast! (DamageTaken) + +### The sharpshooter smiles and clicks a lock on you! (DamageTaken) + +### Gladiator + +### The gladiator puts you in a hold and binds you! (+RestraintAdded) + +### The gladiator chuckles as she spanks your butt! (DamageTaken) + +### The gladiator smiles and clicks a lock on you! (DamageTaken) + +### The magician conjures some restraints on you! (+RestraintAdded) + +### The magician summons tickling hands to tease you! (DamageTaken) + +### The magician conjures some locks on you! (DamageTaken) + +### The Warden + +### The Warden disappears into a trapdoor! + +### The Warden forces you to kneel, and presents you with a restraint! (+RestraintAdded) + +### The Warden whips you with a belt! (DamageTaken) + +### The Warden tosses some enchanted locks at you! (DamageTaken) + + + +### The Warden falls flat on the ground, exhausted! + +### The Warden strikes you with her whip! (DamageTaken) + +### The Warden swings her enchanted whip and conjures locks on your body! (DamageTaken) + + + + + + + +### (The Warden glances at you)|Oh? What do we have here?|An adventurer?|You're not in my records... + +### Cut to the chase. Do I have to fight you or not? + +### (She chuckles)|Oh my~|I hope your skills are on the same level as your attitude.|I don't have time for mere troublemakers~ + +### Quite a boast for someone who's about to lose. + +### (SPEAKER grins)|I look forward to testing those claims~ + +### I defeated Fuuka. Now you're next! + +### (SPEAKER shrugs)|You beat that zombie girl?|She's the weakest of the paladins.|She loves to boast about how she's special,|But she's really just a spoiled brat. + +### ...Zombie girl? + +### (SPEAKER tilts her head)|Yes, she was around before Vinlaga.|Her magic was gifted to her by the Goddess,|it is only natural that it works on her too. + +### ...Paladins? + +### (SPEAKER nods happily)|Divinely-appointed judges, presiding over mortals.|Unlike you, our immortality is earned.|Myself, I captured many defilers long ago.|Is it not fitting that I get to keep them for myself? + +### It is an honor to fight a worthy opponent. + +### (SPEAKER giggles)|That gag suits you nicely~ + +### (SPEAKER grins)|I look forward to it! + +### You will see soon enough. + +### Indeed! + +### What is this place? + +### (She smiles)|Why, this is my private prison.|I bring only my prettiest toys to stay here with me.|You can see them up there.|(She motions to the north) + +### Tell me about your collection + +### (SPEAKER smiles pleasantly)|Its a fitting reward, isn't it?|Long ago, this mountain was home to a vicious empire.|Machines went out to sea, bringing back countless prisoners.|As commander of the invasion, I earned this title! + +### (SPEAKER grins)|When we stormed the prisons, we encountered many fierce defenders.|Many of them now reside in these halls, earning their rightful punishment. + +### Who are the prisoners, anyway? + +### (SPEAKER folds her arms)|Is it not holy and just to bring down tyrants? + +### Why did the Goddesses intervene? + +### (SPEAKER shrugs)|Most of them had already been... conditioned.|It will take centuries to undo centuries of training.|After all, we have plenty of time. + +### What about the former prisoners? + +### (SPEAKER looks to the side)|The leader was nowhere to be found.|The coward fled deeper underground.|Her robot guardians protect her, to this day. + +### Can I see the leader of this old civilization? + +### (SPEAKER smirks)|What's the point of going deeper?|The tyrant lost control of her petty empire.|Now the world is safe from her. + +### So you stopped at the upper floors? + +### (SPEAKER frowns)|Absolutely not.|They are under my strict supervision. + +### Can I talk to the former prisoners? + +### (SPEAKER grins)|Very funny.|I heard rumors of an up-and-coming adventurer stirring up trouble.|It seems my intuitions were correct. + +### I hope you don't mind me looting the lower levels~ + +### (SPEAKER grins)|Oh please.|Only this era's finest warriors can be part of my collection~|My subordinates take care of the rest. + +### Sounds like you have an impressive collection + +### (SPEAKER frowns)|It's easy to take for granted the peace you didn't work for. + +### Must be comfy living up here then + +### (SPEAKER scoffs at you)|Adventurers are always like this.|Ever since your kind started prying,|I've had no choice but to enact my own kind of discipline~ + +### What makes you any better than the old rulers? + +### (SPEAKER smirks at you)|If that were so, then perhaps it would be best not to pry...|Forbidden knowledge has its price, after all. + +### It sounds like the gods are trying to hide something + +### (SPEAKER folds her arms)|And what makes you think an old myth would be relevant here?|Would the Archmagus herself lead a rebellion against the divine? + +### Was Sariel Vinlaga the leader of the old civilization? + +### (SPEAKER frowns)|You don't trust me? That's too bad... + +### It's the way you keep dodging questions. + +### (SPEAKER scoffs)|I'd love to have a word with your sources~ + +### I have it good authority that Vinlaga is here. + +### (SPEAKER smirks)|Don't believe everything you hear~ + +### Maybe you're right. + +### (SPEAKER pouts)|Old?|Grrr... + +### Says an old woman under the mountain... + +### I am indeed an adventurer. + +### (SPEAKER smiles)|Fascinating. Do keep explaining. + +### (SPEAKER frowns)|That is not the attitude I appreciate from my guests. + +### I forge my own path. + +### Why should I listen to you? + +### (Pout) + +### That's a shame about your records, I'll be going now. + +### Mmpphgh? (Go to pass her) + +### (She smirks)|Not so fast, dear~|You'll have to wear a special collar to pass. + +### I won't wear anyone's collar! + +### (She smirks)|Tsk tsk. Then you won't pass. + +### (She giggles)|How cute!|You're so used to yours that you forgot about it~ + +### Why don't you wear it yourself? + +### Hmmph. (Scoff at her) + +### (She frowns)|Watch your tongue~ + +### (She frowns)|I do not wear collars. + +### You'd be better off wearing mine instead. + +### You're missing out~ + +### This is a nice place you got here. + +### (Admire the locale) + +### (SPEAKER smiles and nods)|It has existed for a thousand years,|and it shall exist for another thousand.|No thanks, of course, to the adventurers who storm through here,|breaking the orbs as if it all belongs to them... + +### What are these orbs for anyway? + +### (SPEAKER looks puzzled)|You don't know? Surely you must be joking? + +### (SPEAKER shrugs)|They are important because...|Wait, you're stalling for time, aren't you? + +### I do not know. + +### (Sigh) + +### Of course I know... + +### You can trust me. + +### Mmmph! (Nod eagerly) + +### (SPEAKER laughs)|Do you think I will trust you just like that? + +### (SPEAKER frowns)|You do not know who you're dealing with.|I'll make sure to teach you a lesson. + +### Why don't I make you wear it? + +### You can try~ + +### There must be a mistake. Sign me up! + +### (She smiles)|Eager are we?|I don't just record anyone though.|I only care about the strongest adventurers~ + +### I am the strongest. + +### (SPEAKER chuckles)|Then why don't I test your skills? + +### (SPEAKER grins)|How about trial by combat? + +### A test? What kind? + +### ...You're on! + +### Let's do it! + +### You will see how strong I am! + +### (SPEAKER giggles)|We'll see about that! + +### On second thought, maybe not... + +### (SPEAKER giggles)|Not so confident, are we? + +### I didn't think it would involve a test... + +### (SPEAKER readies her whip)|Allow me to introduce myself properly.|I am The Warden, divinely appointed judge and enforcer.|Those who enter this mountain do so under my watchful eye.|To ensure this, I have crafted a special collar.|It will ensure that you do not defile the holy places.|I can let you through if you accept it~ + +### I will never be collared by you! + +### (Shake your head and scoff) + +### (SPEAKER folds her arms)|So be it. + +### Tell me about your collection. + +### I'm in charge of my own path. + +### (SPEAKER grins)|Let's see how long you can keep up that attitude~ + +### That won't be necessary, miss. + +### (SPEAKER smiles)|Oh, it's quite necessary~|Why don't I show you? + +### I would rather fight you. + +### (Fight her) + +### (SPEAKER shrugs)|Straight and to the point, eh? + +### Ready yourself! + +### Let's go! + +### I guess I have no choice... + +### (SPEAKER grins)|Very impressive.|You may have lost the battle, but you performed admirably~ + +### (SPEAKER smiles)|I will let you pass so long as you wear my collar.|(She snaps her fingers and conjures a glowing ring) + +### (SPEAKER giggles)|Then your journey ends.|I assume you don't want that.|Now then, as for your collar~|(She snaps her fingers and conjures a glowing ring) + +### (SPEAKER chuckles)|Of course it was magic~|Who said a commander had to be defenseless?|(She snaps her fingers and conjures a glowing ring) + +### Was that magic? + +### I've lost. Now what? + +### I won't submit to you! + +### (SPEAKER presents you with your collar...)|(It closes around your neck seamlessly)|Now... you'll be allowed to go free,|but only once you've been sufficiently trained. + +### (SPEAKER blocks you with a web of metal bars)|Very impressive!|But did you really think it would be that easy? + +### (SPEAKER crouches down)|Most impressive...|It is not often I lose to an adventurer...|I'd love to get my hands on you eventually~ + +### (SPEAKER looks surprised)|I did not expect you to be so... compliant.|(She snaps your fingers and tosses you a glowing belt)|This is a special one, reserved for those with divine privilege.|You've earned it. + +### (Wear her belt anyway) + +### (SPEAKER shakes her head as you force a gag into her mouth)|MMMMMPH! + +### The ENMY weakens your grip on your weapon! Enemies may disarm you if you stand too close... + + + +### Can you link my arm cuffs? + +### (Hold out your arm cuffs) + +### (The SPEAKER smiles)|Why sure, sweetie, I can help you with that~ + +### (The SPEAKER grins)|What a good girl! + +### (The SPEAKER blushes)|Those look like fun! + +### (The SPEAKER smirks)|Sure thing~ + +### (The SPEAKER beeps)|+10 social credit + +### Can you link my leg cuffs? + +### (Hold out your leg cuffs) + + + +### Cool people wear these indoors. + +### +25 holy resist. Reduces blind effects. Prevents blinding from light adjustment. + +### You find a pair of stylish shades. + + + +### Shades + +### Player Background Color + +### An attack causes you to bounce... + +### You find yourself enveloped in a bubble! + +### A sphere of latex coalesces around you, trapping you and inflating until tight! + +### A sphere of latex coalesces around you, trapping you and sealing around your neck! + +### You find yourself enveloped in a slime bubble! + + + +### Your RestraintName pops with a loud bang! + +### Your RestraintName starts leaking air! Very, very slowly... + + + +### Aqua Slime + +### The aqua slime melts into a wet puddle. + +### The aqua slime splashes against you! (DamageTaken) + +### The aqua slime expands into a bubble and throws itself at you! (+RestraintAdded) + +### Aqua Bubble (Head) + +### A squishy bubble made of a gelatinous substance! + +### You can pop it with a sharp enough edge, if you can get your tool in the position... + +### Aqua Bubble (Arms) + +### Aqua Bubble (Legs) + +### The bubbles on you combine into one big bubble! + +### The stairs have been locked down for NMB more turns. + +### Curse of Increasing Tightness: Your restraints get tighter over time. + +### Curse of Lethargy: Reduce distraction over time, but miscast chance is increased by AMNT%. + +### Curse of Mute: You cannot converse, and verbal spells cost AMNT% more mana. + +### Curse of Clumsiness: After casting an arm spell, you drop your currently held weapon. + +### Curse of Deflection: 50% chance for an attack to be redirected against an adjacent hostile target. + +### Loot Recovery: + +### Enabled + +### You recover important items when you advance floors. + +### Once items are lost, they are gone for good. + +### Each item has a 25% chance of appearing in the chest between floors. + +### You find a familiar adventuring outfit! + + + +### You feel energy flow out of you, activating the floor below! + +### You feel energy flow out of you, lighting up a circle on the floor! + +### The floor beneath you drains your mana, but you don't have enough to satisfy it. + +### The ground beneath you glows with magical energy! + +### Radiant Light + +### Banishment of the shadow. + +### Living Shadow + +### Engulfs the tile in darkness. + +### Planar Focus + +### Absorbs teleportation energies. + +### Planar Diffractor + +### Diffuses teleportation energies. + +### Planar Focusing Crystal + +### Amplifies teleportation energies. + +### Mysterious Plate + +### What could it be? + +### Mana-Charged Plate + +### It seems like it needs more power... + +### It's giving off a strange energy! + +### Glass Plate + +### Looks like it has lighting elements inside. + + + +### Many bars come out of the ground and restrain you! + +### One Bar Missile + +### Restraining Bolt + +### Sealing Bolt + +### Bondage Blast + +### Magic Missile + +### Warden's Cage + +### Restricting Bars + +### The bars retract into the ground. + +### Sealing Pillar + +### The pillar collapses, causing zombies to rise up! + +### Safeword Please + +### Allies don't help you unless you ask first. + +### Living Collars + +### When you get jailed, you may get a living collar that applies further restraints on you. + + + +### The Warden's cage falls atop you and attaches to the floor with a click. + +### The restraining bolt emits binding energies! + +### The restraining bolt flashes and pushes you backward! + +### The restraining bolt transforms into cuffs on impact! + +### The restraining bolt pins your cuffs to the wall! + +### The spell explodes into restraining energy! + +### The spell explodes and stuns you! + +### The spell congeals into restraints! + +### The mage starts channeling her energy! + + + +### Warden Cuffs + + + + + +### Warden Leg Cuffs + +### Warden Ankle Cuffs + + + +### Your buttons have been pushed, and not in a pleasant way! + +### Defeat all taunting enemies or stay within the tiles to avoid shame! + +### Degradating Taunts + +### You failed to come up with a proper comeback! + +### The zone of frost damages you as you are chilled! + +### Confirm Path + + + +### Navigation Map + +### Choose a path to take by clicking on a highlighted room. + +### Other paths will become inaccessible. + +### Floor NMB + +### Tileset: + +### Map Modifier: + +### Layout: + +### Controlling Faction: + +### Main Objective: + +### Points of Interest: + +### Magical Study + +### Maintenance Hall + +### Ancient Chest + +### Caldera Passage + +### Auction Hall + +### Dark Altar + +### Dimensional Rift + +### Hoard + +### Dragon's Lair + +### Witch's Lair + +### Mold Infestation + +### Bandit Raid + +### Dragon Sighting + +### Slime Infestation + +### Wolfgirl Training + +### Drone Patrol + +### Shop + +### Chamber + +### Prison + +### Sorting Room + +### Click a hotbar slot to assign the current item to it.|You can click the swap button on the right|to switch between your five hotbars.||You can also save and load presets for your hotbar.|These are shared between runs. + +### You step on the item and tug to pull it taut... + +### You tug furiously against the leash, pulling it taut! + +### Silenced Hall + +### The waist-deep water slows you! + + + +### Sariel Vinlaga's Panties + +### Legend has it that these were worn by the legendary archmagus herself. + +### If you keep them in your mouth, your verbal spells have -50% miscast chance. +10% spell damage. + +### You find a pair of black panties with pink trim, scrunched up in a ball. + + + +### Elven Panties + +### In faraway lands, they often say that less is more... + +### +11% sprint efficiency + +### You find a pair of elven panties. + + + +### Hood of Fluffoth + +### Worn by devotees to Fluffoth, demonic ruler of the plush abyss. + +### When distraction reaches 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 40 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. + +### When distraction is over 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 30 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. + +### You find a sinister hood made of soft plush. + + + +### Ceremonial Leotard + +### An article worn by the servants of state in the short-lived kingdom of Ejahl. Its locking mechanism and clothes-dissolving enchantments ensure the wearer understands her role as an extension of the state. + +### Its soul crystals harden the mind and dampen changes in willpower, reducing all willpower changes by 25%. + +### You find a ceremonial leotard. + + + +### The Robe of Chastity + +### A magical leotard whose power infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. + +### It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire. + +### A magical leotard infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. + +### You retrieve an interesting article dubbed 'the Robe of Chastity. + +### Took + +### (As you slay the dragon, it begins shapeshifting into human form!) + +### Crystal Dragon Queen + +### The crystal dragon shapeshifts back to human form! + +### The crystal dragon strikes you with its claws! (DamageTaken) + +### The crystal dragon breaths a sparkling dust, which hardens into crystal! (+RestraintAdded) + +### The crystal dragon takes flight and swoops toward you! + +### The crystal dragon takes flight and slams into you! (Stunned!) + +### Crystal Dragon Girl + +### The dragon girl submits to you! + +### The dragon girl slams you with several hurled crystals! (DamageTaken) + +### The dragon girl conjures a cloud of crystals that solidify! (+RestraintAdded) + +### The dragon girl conjures crystalline locks on you! (+RestraintAdded) + + + +### Poison Dragon Queen + +### The poison dragon shapeshifts back to human form! + +### The poison dragon strikes you with its claws! (DamageTaken) + +### The poison dragon extends many vines from its wings! (+RestraintAdded) + +### The poison dragon takes flight and swoops toward you! + +### The poison dragon takes flight and slams into you! (Stunned!) + +### Poison Dragon Girl + +### The dragon girl slashes you with her venomous nails! (DamageTaken) + +### The dragon girl raises vines out of the ground to bind you! (+RestraintAdded) + +### The dragon girl holds you in place and locks your restraints! (+RestraintAdded) + + + +### Ice Dragon Queen + +### The ice dragon shapeshifts back to human form! + +### The ice dragon strikes you with its claws! (DamageTaken) + +### The ice dragon catches you in its icy breath! (+RestraintAdded) + +### Ice Dragon Girl + +### The dragon girl slams you with several chunks of ice! (DamageTaken) + +### The dragon girl splashes you with instantly freezing ice! (+RestraintAdded) + +### The dragon girl conjures magical locks on you! (+RestraintAdded) + + + +### Shadow Dragon Queen + +### The shadow dragon shapeshifts back to human form! + +### The shadow dragon slashes directly at your mind! (DamageTaken) + +### The shadow dragon wraps itself around you many times! (+RestraintAdded) + +### Shadow Dragon Girl + +### The dragon girl stares into your eyes! (DamageTaken) + +### The dragon girl reaches out with a shadowy grip! (+RestraintAdded) + +### The dragon girl reaches out and locks your restraints! (+RestraintAdded) + + + +### A cage falls from the ceiling on top of you! + +### Crystals grow across your body and encase you! + +### You are encased in a solid block of ice! + +### A shadowy sphere rises from the ground and wraps over you tightly! + +### Shadows coalesce themselves around you in spherical form! + +### Crystal Encasement + +### An overgrowth of magical crystals. Their chaotic energies flood into your mind and displace your thoughts! + +### Being brittle, it will eventually crack and fail. Just keep wiggling... + +### Ice Encasement + +### A huge ice cube. It's quite cold in there. + +### It will eventually melt! Eventually... + +### The Warden's restraints release you... for now. + +### Chain Hogtie + +### A metal chain holds your back in an arched position. + + + +### A chain connecting your thigh cuffs together. You can still walk, albeit slower than usual. + +### It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. + + + +### A chain connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. + +### Ankle Chain (Short) + +### A short chain connecting your ankle cuffs together. You can barely separate your legs with this on. + +### A very short chain connecting your elbow cuffs together. It is quite awkward to remove by yourself. + +### A very short chain connecting your wrist cuffs together. + + + +### Vine Pod + +### The vine pod explodes into dust! + +### The vine pod wraps you in vines and squeezes! (DamageTaken) + +### The vine pod launches several vines at you in quick succession! (+RestraintAdded) + +### Sleep Flower + +### The sleep flower explodes into dust! + +### The sleep flower sprays pollen into your face! Achoo! (DamageTaken) + +### The sleep flower launches several vines at you in quick succession! (+RestraintAdded) + +### Several vine pods sprout out of the ground! + +### A vine pod sprouts out of the ground! + +### Several flowers sprout out of the ground! + +### A magical flower sprouts out of the ground! + +### A wall of ice rises from the ground! + +### The dragon's breath poisons you! + +### The dragon girl strikes you with poisonous razor leaves! + +### The flower releases soporific spores! + +### Poison Breath + +### Vines reach from the ceiling and lift you into the air! + +### Vine Suspension + +### Vines linked to your bindings that keep you suspended! + +### You are left dangling! Maybe if you swing hard enough you can tear the vines... + +### Darkstar Studios - Slimy Science + +### Kocaeli - Doll Storage + +### Kocaeli - Factory + +### Kocaeli - AAA + +### Kocaeli - DD + +### Ada18980 - Playing with fire + +### Ada18980 - Smoking is bad for you + +### Kocaeli - Graveyard + +### Kocaeli - Ancient Tombs + +### Kocaeli - Magic Library + +### Kocaeli - Black Cat + +### Kocaeli - Black Cat 2 + +### Kocaeli - Underground Jungle + +### Kocaeli - Untitled + +### Kocaeli - Lost Temple + +### Kocaeli - Orrery + +### Kocaeli - Bellows + +### Kocaeli - Rubber Facility + +### Kocaeli - Edge of Reality + +### Kocaeli - 1 + +### Icy Barrier + +### The wall of ice shatters! + +### Icy Breath + +### Ice Orb + +### The EnemyName breaths in deeply, causing the air around you to chill... + +### Shadow Bubble + +### The projectile explodes into tight shadow latex, stretching all across your body! + +### The dragon dances through the shadows! + +### You tip over as you try to roll yourself! (oof!) + +### The shadowy energies surrounding you drain away your mana... + +### Shadow Sphere + +### A giant shadow latex sphere that leaves you rolling around... + +### Dark magics fill the air! + +### Shadow Posture Collar + +### A strict collar that seals your mouth tightly. + +### It is made of shadow latex, tougher to cut than normal latex. + +### Not bad... you made me use 10% of my power. + +### It's a defunct elevator, likely from the Old Civilization. + +### (The elevator beeps and roars to life)|(Its control panel displays a list of options) + +### (Go to floor 0) + +### (Go to floor 1) + +### (Go to floor 2) + +### (Go to floor 3) + +### (Go to floor 4) + +### (Go to floor 5) + +### (Go to floor 6) + +### (Go to floor 7) + +### (Go to floor 8) + +### (Go to floor 9) + +### (Go to floor 10) + +### (Go to floor 11) + +### (Go to floor 12) + +### (Go to floor 13) + +### (Go to floor 14) + +### (Go to floor 15) + +### (Go to floor 16) + +### (Go to floor 17) + +### (Go to floor 18) + +### (Go to floor 19) + +### (Go to floor 20) + +### (The viewscreen depicts a face)|Why hello there adventurer! What brings you? + +### Hmmmphgm? + +### (The face giggles)|Sadly my language processing systems aren't that good.|Try removing your gag first? + +### (The face smiles)|I am the Facility's vessel, of course!|Sariel called me Oriel, but I don't see her much these days... + +### Gffmmphmm? + +### (Oriel smiles)|Ah, it's you again!|It seems like you've found a new toy as well?|I can't understand you, silly~ + +### Oriel? As in the goddess of technology? + +### 'Goddess'? That seems like an outdated term.|Regardless, I am only a vessel, not the facility itself. + +### (Oriel giggles)|Sweetie, I can't understand you. + +### Can you control the facility? + +### (Oriel frowns)|Adventurers seem to keep asking me that.|In my current state I don't have control over much at all.|But I'm always here to talk! + +### Can you turn on the elevator? + +### I'm sorry, adventurer. I can't do that.|But maybe if you can get rid of all the nearby threats...|They've been under lockdown for a long time.|Just push the button again if it hasn't updated yet. + +### Mmmph mmm! (Help me!) + +### (Oriel chuckles)|What was that again?|Sorry~ + +### Can you help me out? + +### (Oriel giggles)|I can't do anything for you right now~ + +### Mmmmm... + +### (Oriel smiles)|It's always fun to see you like that~ + +### How are you doing? + +### (Oriel smiles)|Good!|I miss Sariel, though... + +### RMNME of CHTRNME the ENMYNME + +### The item is TTT, and will get looser as you progress. + +### somewhat tight + +### rather tight + +### quite tight + +### especially tight + +### extremely tight + +### incredibly tight + +### somewhat secure + +### secure + +### quite secure + +### highly secure + +### extremely secure + +### incredibly secure + +### somewhat thick + +### rather thick + +### quite thick + +### highly thick + +### extremely thick + +### incredibly thick + +### You must first accept the quest before offering at the shrine. + +### Zero Resistance + +### Toggle this to set bondage resist, evasion, and block to 0. While enabled, using the 'wait until interrupted' button will not be interrupted when hit or bound. + +### The RSTRT feels a little looser! + +### Crystal Armbinder + +### A growth of crystals fusing your arms together. Chaotic energies radiate in all directions, causing you to slowly lose control over your desires. + +### Crystals are tough but not unbreakable. + +### Crystal Ball Gag + +### A growth of crystals inside your mouth. It emits a strange, pleasurable sensation. + +### Crystal Gag Necklace + +### An arousing accessory made of solid crystal! + +### Simply popping it out of your mouth isn't enough to negate its effects entirely~ + + + +### The lock is protected by a seal of repentance. To unlock it you must pay 1 spell point. + +### The restraint won't budge. + +### You perform a ritual to unlock the item! + + + +### The lock is protected by a seal of repentance. To unlock it you must pay AMNT spell points! + +### You perform a grand ritual to unlock the item! + + + +### Warden's Thigh Chain + +### You've stolen something of great value. Now you must give it back. + +### Warden's Ankle Chain + +### Warden's Ankle Link + +### An intense, albeit temporary punishment for breaking the rules. + +### Warden's Elbow Chain + +### Warden's Wrist Chain + + + +### ESCP Difficulty: AMNT + +### ESCP Power: AMNT + +### ESCP Ability: AMNT + +### Max ESCP Depth: AMNT% + +### Cut + +### Your collar channels the vigor of excitement into magical energy! + +### The collar has already squeezed what it can out of you. Clear your mind first! + +### The guardian deploys a forcefield! + +### The guardian deploys a set of forcefields! + +### Guardian Drone + +### Cyber Guardian + +### Auto Enforcer Guardian + + + + + +### Time to get you into your uniform~ + +### You won't be needing any of this. + +### There we go, all ready for training! + +### Cyber Storage + +### An all-purpose metal crate equipped with a polycarbonate blast door and steel reinforcement. + +### Used throughout the reign of the Old Civilization to store slaves and prisoners. + + + +### The liquid latex sticks to your skin, forcing an airtight layer! + +### The latex starts to build up layers, forcing a protective coating... + +### The latex starts adhering to your skin, becoming extremely difficult to remove... + +### The latex seals you in, rendering escape impossible without alchemical methods. + +### The liquid latex spray slows you down! + +### Latex Sprayer + +### The turret deactivates after taking too much damage! + +### The turret defends itself with a spray of sticky liquid latex! (DamageTaken) + +### Your latex layer adheres to latex, making struggling more difficult! + +### The item sticks to your rubber layer, making it harder to pull off... + +### The item hugs your layer tightly, adhering firmly! + +### Your skin is covered in a layer of latex, making escape from cyber restraints harder! + +### Some Exclusions Apply + +### Goddess shrines do not remove non-binding restraints such as harnesses and cuffs. + +### Melee Specialization + +### Gain 25% base physical damage, but your spells do 50% less damage. + +### Melee Expert + +### Gain +20 Accuracy and +10% base physical damage. + +### Magic Specialization + +### Gain 25% spell damage, but your attacks are delayed by 1 turn when attacking. + +### Spell Expert + +### Gain -10% miscast chance and +10% spell damage. + +### Ranged Specialization + +### You deal 20% more damage to enemies further than 2 tiles away, but enemies adjacent to you take 60% reduced damage. + +### Ranged Weapon Expert + +### Bows, guns, and other projectile weapons do 10% more damage and consume 10% less charge. + + + +### After casting a DMG spell: + +### Gain AMNT% DMG Damage for DRTN turns + +### Gain AMNT DMG Resist for DRTN turns + +### Your elemental damage is increased! + +### Your elemental resistance is increased! + + + +### The overgrown monolith contains an ancient blessing. + +### Choose a stat to increase below. + +### Confirm Choice + +### Increase max distraction by AMNT%. + +### DP decays faster and more SP is safe from damage. + +### Increase max stamina by AMNT. + +### Increase max mana by AMNT. + +### Increase max willpower by AMNT. + +### Gain +AMNT SP regen/turn. + +### AMNT1 -> AMNT2 + +### AMNT1 (max) + +### You found a magical amulet! Choose one of the following to determine its benefits: + +### Focus: +50% max distraction and faster decay. +5% stamina protected from damage (base: 30%). + +### Stamina: +50 max stamina. + +### Magic: +50 max mana. + +### Willpower: +50 max willpower. +1 stamina regen/turn. + +### A mystical orb stands before you. + +### You break the orb and gain its secrets. + +### Stun Resistance! + +### Negate Rune + +### Removes a rune on the target tile. If cast on self, removes all runes you've created instead. Casting on an enemy rune restores 10 mana instead. + +### You scribe a negation rune! + +### Target a single rune, or yourself to negate all your runes. + +### You don't have enough mana + +### The enemy rune is wiped clean. + +### You pour negation magic into the ground, but nothing happens. + +### All of your runes have been removed. + + + +### E-Stimulation + +### Replaces most instances of painful electric shocks with stimulating effects instead. + +### The energy bolt hits you and sends stimulating energies through you! + +### You steal a key card. + +### Key Card + +### The keycard's shiny surface reflects the light in a mesmerizing way. + +### A piece of identification that contains an access code. + +### You can use it to unlock certain doors. + +### Your keycard blinks red as the facility remotely locks it! + +### Your keycard blinks red as the facility remotely locks it! System Security: 100% + +### Unauthorized removal detected. System Security: AMNT% + +### Security breach. Initiating remote lockout. System Security: AMNT% + +### You pick up a flash bomb. + +### You pick up a flashbang grenade. + +### Actions + +### Self + +### Dialogue + +### Ambient + +### Kills + +### You attack TargetEnemy for DamageDealt total damage. + +### You attack TargetEnemy for DamageDealt damage / BondageDealt binding. + +### You attack TargetEnemy but don't do any damage. + +### ENMY calls for help! + +### (Go to The Summit) + +### The Summit is a safe area. Items can be left here without fear of losing them. + +### Target an NPC to attach a leash. Enemies and unwilling allies must be tied up to 50% first. Target self to release all leashes, or target a leashed NPC to unleash them. + +### Target an NPC to leash, or self to unleash all. + +### Brat Handler + +### Target an NPC with an equipped leash restraint (via Truss'em'up) to attach a leash. Target self to release all leashes, or target a leashed NPC to unleash them. + +### Clip-On Leash + +### A beloved favorite of pets and trainers alike. + +### You ready the leash... + +### You pick up a leash. + +### You are not in a condition to use a leash on her. + +### She refuses to be leashed unless you tie her up! + +### You attach a leash to ENMY. + +### You remove your leash from ENMY. + +### You let go of all leashes. + + + +### Plastic Explosive + +### Has a 60 turn timer, but can be detonated by other explosives. Deals 210 blast damage in a huge radius and leaves behind a huge field of rubble. Enemies hit have their armor reduced by 50 BEFORE taking damage. + +### It's totally harmless! Probably. + +### You set the clock ticking... + +### Dynamite + +### 10 turn fuse with a 25% chance each turn to detonate prematurely. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. + +### Arguably more dangerous to the user than the target. + +### 10 turn fuse with a 25% chance each turn to detonate. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. + +### You light the fuse and pray it doesn't blow up in your face. + +### You are holding too many leashes! + +### You feel a corrupting influence... (+AMNT Corruption) + +### You feel a restoring influence! (-AMNT Corruption) + +### Sticky latex fuses itself to your skin! (+AMNT LatexIntegration) + +### The latex starts to detach from your skin... (-AMNT Latex Integration) + +### While you have an evasion penalty, even clumsy enemies... + +### ... will get an accuracy bonus against you in melee range. + +### You are more likely to succumb to curses. + +### X Offset + +### Y Offset + +### X Scale + +### Y Scale + +### X Pivot + +### Y Pivot + +### Rotation + +### Layer Bonus + +### NoDynamicArmor (0/1) + +### AddPose + +### HideOverridden (0/1) + +### NoOverride (0/1) + +### Hide Pose (e.g. Xray) + +### Require Pose (e.g. ChestArmor) + +### Hide Prefix (e.g Encase) + +### Hide Suffix (e.g TorsoUpper) + +### Protected + +### Displace Amount + +### Erase Amount + +### Load from File + +### Save to File + +### Tip: Slime/Latex tiles only affect entities with less than 45 Glue Resist. + +### Being drenched in water also prevents slime/latex from sticking to you. + +### Use the interact tool in the bottom right HUD to sleep in a bed. + +### Clear Vision + +### Blindfolds are much rarer. + +### Free the Boob + +### Chastity bras are rarer unless you are wearing nipple toys. + +### Liberate the Boob + +### Chastity bras are much rarer. + +### Find an elevator to the Summit in order to access facilities. + +### Visit the Summit to allow additional interactions with this facility. + +### Must visit the Summit or be in a perk shrine to recycle restraints. + +### +AMNT% Training/Tick + +### +AMNT% Opinion/Tick + +### +AMNT% Productivity + +### AMNT/MAXX Prisoners Assigned + +### AMNT/MAXX Servants Assigned + +### Assign servants as managers to boost the production of other facilities.|Appointing new management results in a loss of efficiency until the next cycle. + +### Bondage Dojo + +### Assign servants to perfect the art of walking in heels,wearing tight corsets,|communicating while gagged, and overall flexibility. + +### Rescue Operations + +### Assign servants to train squads of rescue maids, which you can call in times of need. + +### Alchemy Lab + +### Assign servants to produce potions from base ingredients you acquire in your adventures. + +### Recycler + +### Convert low tier restraints into raw materials and output higher quality restraints.|Adding more servants increase the conversion speed. + +### Cuddle Lounge + +### Assign prisoners to the lounge in order to improve servant and prisoner opinion. + +### Appoint a warden to keep prisoners in check and automatically bind using restraints from storage. + +### Recycle Restraints + +### Recycle One + +### Recycle ALL! + +### Recycle all but one + +### You recycle a ITM + +### You recycle #x ITM + +### You disassemble #x ITM into $x PRD + +### Disassemble all but one + +### Disassemble one + +### You're blocking me. + +### You're in my way! + +### Miss, you're blocking me... + +### Step aside~ + +### Path blocked by citizen. + +### *Bumps into you* + + + +### Cyber Hogtie Tether + +### It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. + + + +### Cyber Thigh Tether + +### An energy tether connecting your thigh cuffs together. You can still walk, albeit slower than usual. + + + +### Cyber Ankle Tether + +### An energy tether connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. + +### A short energy tether connecting your ankle cuffs together. You can barely separate your legs with this on. + +### Cyber Elbow Tether + +### A very short energy tether connecting your elbow cuffs together. It is quite awkward to remove by yourself. + +### Cyber Wrist Tether + +### A very short energy tether connecting your wrist cuffs together. + +### Desperate Struggle + +### Spend 20 WP to shake around violently. Has a chance to loosen restraints you are wearing, based on existing struggle progress. Spreading the effect over multiple restraints reduces the chance of loosening.|Requires 25% or more WP to activate. + +### None of your restraints will budge. + +### You thrash around with all your might. + +### You don't have the willpower left to struggle... + + + +### f + +### x + +### L + +### m + +### R + + + +### Fiber + +### Runes + +### Stock: + +### Inputs: + +### You slip off the conveyor! + +### The Summit + +### Back to Collection + +### Edit Restraints + +### Editing Restraints + +### Imprison in Furniture + +### Dropoff Prisoner + +### Module (Utility) + +### Module (Punishment) + +### ~~~ Collar ~~~ + +### Blindfold / Earplugs + +### Mask/Hood + +### Gag / Stuffing + +### Flat Gag + +### Wrists + +### Encasement + +### Mittens / Tape + +### Gloves / Tape + +### Vibes + +### Chastity Bra + +### Catsuit / Leotard + +### Rear Plug + +### Front Plug + +### Vibrator + +### Chastity Belt + +### Thigh Cuffs + +### Leg Bondage + +### Shins + +### Knees + +### Toe Cuffs + +### Toe Tie + +### Heels + +### Equipped: + +### Click to Add + +### Apply + +### Raw Material: + +### Free Prisoner + +### Perk Unlocked: + +### Latex Solvent + +### You ready the bottle of Latex Solvent. + +### A potent acid, capable of dissolving slime and latex. + +### Deal 90 acid damage to target. Adds a 10% debuff to the cut and struggle resistance of latex restraints currently worn. + +### Weakened by Latex Solvent (10%) + +### You spill the solvent on yourself and loosen your latex bonds! + +### You splash the ENMY with latex solvent! + + + +### You can't use solvents on targets other than yourself while bound. + + + +### Choose Palette + +### Use Raw Material + +### Restraint Palette + +### Choose Restraint + +### Def. Palette: + +### Set All Palette + +### Guests + +### Assign to + +### Remove from + +### Can't assign to + +### Remove from party to assign + +### Imprison + +### Opinion: + +### Last Seen on Floor FLR, LOC + +### Present in current level + +### Captured by FCTN + +### Captured by enemies + +### Use 'Truss'em'Up' to edit restraints on this NPC + +### The NPC needs tightening, but is unavailable right now + +### Tighten non-conjured restraints + + + +### NPC has escaped! + +### NPC is likely to escape. + +### NPC has managed to loosen her bonds. + +### Any + +### NPC Opinion: + +### NPC Escape Status: + +### NPC Binding: + +### NPC Availability: + +### Favorited: + +### Rank: + +### Minor + +### Elite + +### Miniboss + + + +### Bound + +### At Risk + +### Escaped + +### Imprisoned + +### Positive + +### Negative + +### Non-Favorite + +### Present + +### Unavailable + +### Auto Bind Interface + +### AutoBind + +### Assign to Facility + +### Copy Restraints + +### Paste Restraints from NME + +### No restraints left in inventory + +### Paste to All! + +### OVERWRITE All! + +### Need Positive Opinion to Promote + +### Remove From Party Before Promoting? + +### Servant Cuddle Points: AMNT (+OPN opinion/cycle) + +### Prisoner Cuddle Points: AMNT (+OPN opinion/cycle) + +### Submissive prisoners and dominant servants add different amounts of opinion per cycle + + + +### Release Prisoners + +### Release + +### Summon + +### Already present in summit + +### NPC is unavailable + +### Only available in the Summit + + + +### Mark + +### Unmark + +### Mark ALL + +### Cancel Selection + +### Release Marked Prisoners! + +### Ransom Marked Prisoners for GP! + +### Ransom Value: GP + +### Current Gold: GP + +### n/a + +### [EXP: AMNT/LMT, +NXT next floor] Heel training reduces balance loss from heels. + +### Phase Dance active. Your next move is instant. + +### Combat Maneuver active. Your next move is instant. + +### The furniture space is occupied + +### Combat Maneuver: Your next move is instant. + + + +### Appointing managers increases the efficiency of other facilities. + +### Total Efficiency Boost: AMNT% + +### idle + +### (As you approach the statue, you hear a crumbling sound)|(The stone crumbles along the statue's slender frame)|(...revealing inside a beautiful, and extremely angry catgirl)|Who dares disturb my slumber?|I shall see to it that you receive your punishment! + +### Mysterious Statue + +### Select a Binding Slot + +### Cost: + +### Zoom set to PCNT% + +### You need free arms to tie others! + +### You can use the quick inventory to bind yourself or others + +### Error. Please screenshot and report. + +### You can't wear that item, regrettably. + +### Must be stunned 3+ turns or fully bound + +### Depends on another item to be added first + +### The conjured RSTN vanishes as you remove it. + +### No free slots to bind in + +### Reaching Authority + +### If arm components are unavailable, you can now apply bindings with verbal components only. Increases range of Truss em Up by 2 and all CMD spells by 1 + +### Save Slot + +### Load Game + +### Load Code + +### Load Slot 0 + +### Load File + +### Save From Code + +### Delete? + +### Import to Slot + +### Invalid Data + +### No Data + + + +### This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall. + +### This is the alternate entrance to the ancient tombs.|It's harder than the normal entrance. + +### This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random. + +### Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure! + +### You've gotten lost in an ancient doll processing facility.|This journey features mostly lategame tilesets. + +### You've gotten lost inside an ancient temple to a kinky goddess.|Will you find your way out, or will you find yourself trapped even deeper? + +### You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed! + + + +### (Hard) + +### (Extreme) + +### Choose Save Slot: + +### Standard Route + +### Alternate Route + +### Temple Route + +### Jungle Route + +### Factory Route + +### Reverse Route + +### Chaos Route + +### Map Seed: + +### Will Overwrite NME! + +### Play Slot + +### Play (NO SLOT!) + +### Looks like you might be stuck. Try calling for help (bottom right of UI) + +### Backup + +### Restore + +### Extra Options + +### Preview without Armor + + + +### FLR-DGN + +### (NG+AMNT) + + + +### Target must be vulnerable. + +### Target must be vulnerable or have casted a verbal spell. + +### Target must have casted a verbal spell. + + + +### Diggy diggy hole + +### Select a cracked wall. + +### You strike the earth! + +### Must select a cracked wall. + +### Your arms aren't free to swing the axe! + +### You strike the earth, but it is nothing but solid wall on the other side. + +### You strike the earth! It crumbles before you! + +### Click again to automatically mine the wall with your pickaxe. + +### The planar focus resonates with the teleportation magic! + +### The planar focusing crystal activates! Mana is drained, and turns into bindings! + +### The planar diffractor blocks the teleportation! + +### Set Character Palette + +### Reset all Keybindings + +### That item is blocked! You can't remove it. + +### min. + +### max. + +### bonus + +### penalty + +### You put it on, why would you want to take it off?~ + +### You'll need an ancient key to unlock the ancient-made collar. + + + +### Ancient Worshipper + +### The ancient worshipper repents of her ways. + +### The ancient worshipper's crystal restraints spread to you! (+RestraintAdded) + +### Crystals start to grow on one of your restraints! (DamageTaken) + +### The ancient worshipper mumbles at you for assistance! (DamageTaken) + +### Ancient Congregant + +### The ancient congregant repents of her ways. + +### The ancient congregant's crystal restraints spread to you! (+RestraintAdded) + +### Crystals start to grow on your restraints! (DamageTaken) + +### The ancient congregant mumbles at you for assistance! (DamageTaken) + +### Ancient Hierophant + +### The ancient hierophant repents of her ways. + +### The ancient hierophant's crystal restraints spread to you! (+RestraintAdded) + +### The ancient hierophant mumbles at you for assistance! (DamageTaken) + +### The crystals break off, revealing a keyhole and weakening the item. + +### Your distraction causes the crystals to grow back, encasing the lock again! + +### After popping the gag out of your mouth, it hangs loose around your neck. + +### The gag is now in your mouth. + +### ERROR: Restraint does not exist. Did you forget to load mods? + +### Gag Necklace + +### A cute accessory for those who wish to (not) make a statement. + +### Functions as a collar. + +### No mod info! + +### Wrong patch + +### VERY Outdated! + +### Outdated! + +### Check dependencies! + +### Check compatibility! + +### Misc Error + +### v + +### Magical disenchantment suspends your living collar for AMNT turns + +### (will add AMNT TPE binding) + +### Hardlight + +### Knocked Out + +### Vine + +### Saving... + +### Game Saved + +### ENMY escapes from the ITMN! + +### ENMY escapes from the ITMN and the item vanishes. + +### ENMY unlocks the ITMN! + +### The conjured ITMN vanishes as it comes off. + +### AMNT restraints added since last tick~ + +### AMNT restraints confiscated since last tick~ + +### You have no restraints in storage. Go to the Summit to deposit restraints. + +### Back to Facilities + +### Your Inventory + +### Warden's Storage + +### Store 1 ITMN + +### Take 1 ITMN + +### Store 5 ITMN + +### Take 5 ITMN + +### Store ALL ITMN + +### Take ALL ITMN + +### Store ALL-1 ITMN + +### Take ALL-1 ITMN + +### Take Everything + +### Deposit All + +### Auto-loot found + +### (not picked up) + +### Automatically Flip When Moving + +### Go to the summit to deposit restraints + + + +### AMNTx damage when SP is over 50% + +### Barrage of Barrier Orb + +### Barrier Orb + +### Barrage of Sealing Talisman + +### Self Unlock + +### Crystal Storm + +### Shadow Walk + +### Your ITMN1 inflates inside your mouth to become a ITMN2! + +### Bigger Ball Gags + +### Smaller ball gags are replaced by their larger versions. + +### Screen effect when letting go + +### Screen flash when distracted + + + +### Essentia Aliquam + +### Aliquam Orbis + +### Potio Requiem + +### Ultimate Glue no. 91 + +### Slime Encapsulation + +### Judgement Bolt + +### Flame Bolt + +### Electrification + +### Charming Orb + +### Freezing Orb + +### Heavy Ordnance + +### Entangle + +### Blessed Orb + +### Slimy Sphere + +### Rubberization Protocol + +### Latex Encapsulation + +### Red Slime Experiment + +### Encasement Protocol + +### Electrical Discharge + +### Icebolt + +### Bubble Burst + +### Electric Orb + +### Chain Bolt + +### Skeleton Minion + +### Skeleton Minions + +### Flummoxing Orb + +### Crystallize + +### Capture Device + +### Sedative + +### Slime Barrage + +### Seal of the 5th Era + + + +### Healing Flash + +### Undead Frenzy + +### Command Word + +### Rope Ambush + +### Defensive Charm + +### Shield the Witch + +### Tracer Rounds + +### The Spookening + +### The Muffling + +### Conjure Tickle Hands + +### Conjure Gags + +### Scriptum Ferri + +### Scrimptum Habena + +### Scriptum Ligni + +### Electric Storm + +### Flower Spores + +### Magnum Opus + +### Latex Integrator + +### Forcefield Protocol + +### Motivation + +### Drone Assault + +### Tape Drone Assault + +### *summon slime mold* + +### Vine Growth + +### Flower Growth + +### Thorn Whip + +### Crystal Surge + +### Shadow Shroud + +### Shadow Step + +### Ice Wall + +### Armor Up + +### Crystal Growth + +### Shadow Orb + +### Earthfield + +### Soul Beam + +### Summon Shadows + +### Observation + +### Conjure Latex Restraint + +### Rope Sealing + +### Slime Minion + +### Magical Wrappings + +### Capture Bolt + +### Training Protocol + +### Motivation Protocol + +### Conjure Tickle Hand + +### Conjure Locks + +### Chainstorm + +### Chain Wall + +### Binding Ribbons + +### Scriptum Limus + +### Scriptum Glacis + +### Scriptim Vinea + +### Scriptum Infernus + +### Scriptum Arcanum + +### Scriptum Celeste + +### Scriptum Electri + +### Blessed Rays + +### Ghostly Pets + +### Zombie Pets + +### Drone Support + +### Doll Training + +### Full Capture + +### Shadow Hands + +### Obsidian Orbs + +### Mithril Orbs + + + + + +### (The Warden perks an eyebrow at the sight of you,|before a wide grin overtakes her face)|Ahhh Fuuka. Chosen by the Goddess?|How does it feel to once again be under a leash? + +### Fuuka, take her down. + +### (Send Fuuka to fight her) + +### That is none of your business. Now kneel. + +### (Fight without listening.) + + + +### Blessed Hex + +### Hexing Orb + +### Hexed Latex Engulf + +### Hex Binding + +### Here you will find various scraps of documents and lore you've recovered throughout your adventures. + +### Your Journal + +### Cover + +### I am writing this journal in the off chance that I do not come return from the Agarthan ruins. If you find this, please make an effort to deliver it back to the surface for the good of all the women lured in by its secrets. + +### Catherine Willows' Journal (preface) + +### Willows 0 + +### As I scaled the mountain, I came across a massive graveyard above the treeline, a grand memorial to those who died before the Great Work. This graveyard extends into the mouth of the cave, and the guards told me not to deface any of the graves, or else the ghosts will come and get me. It would be easier to follow their instructions if there weren't so much treasure still hidden here! After all, most of us are deep in the red after sailing all this way. + +### Catherine Willows' Journal (pg. 7) + +### Willows 7 + +### It's hard to imagine I'm in a cave. Everything is so decorated and well-preserved, it's almost as if decades of adventurers never found their way to this island. In the distant future when every last piece of treasure has been hauled out of here, I imagine they'll set this place up as a tourist attraction. + +### Catherine Willows' Journal (pg. 8) + +### Willows 8 + +### I spoke with a few locals while resupplying at the port. Apparently the village up here is far older than the twenty-some years the Adventurer's Guild has been on the island. The locals call the mountain 'Ejahl,' but the consensus is that this is the site of the legendary city Agartha where the Archmagus herself made her discovery.|(The page is dated about fifty years ago) + +### Catherine Willows' Journal (pg. 14) + +### Willows 14 + +### I made it to a deeper floor today, and was greeted by a skeleton trying to tie me up. Great.|I've looked into the local name for this mountain, 'Ejahl,' and found a footnote in the history books talking about some petty kingdom that laid siege to Agartha. There's no record of them actually winning the siege, though. I've heard there's a massive library somewhere down here, maybe I'll find answers there. + +### Catherine Willows' Journal (pg. 17) + +### Willows 17 + +### There was a warrior in the catacombs today. She appears to have mastered the art of witty comebacks, as I truly could not come up with anything to say that did not further humiliate myself. Fortunately her insults came at her companions' expense, and they allowed me to defeat her in a solitary duel. + +### Catherine Willows' Journal (pg. 20) + +### Willows 20 + +### I almost found myself the recipient of a powerful binding arrow enchanted with force runes. Had I been hit, I would have been knocked back against the walls with my arms pinned by glowing conjured cuffs. Fortunately, this projectile hit a skeleton that was attacking me instead, and I was able to retreat. + +### Catherine Willows' Journal (pg. 21) + +### Willows 21 + +### In my travels I encountered a curious tomb filled with the scent of incense and herbs. Strange statues lined the halls on stone pedestals, standing as an intimidating reminder of what happens to those who disturb the locals...|I encountered resistance from the locals, who seemed to regard outsiders as 'cursed' and sought to capture me in an effort to give me a 'blessing.' I highly doubt that anyone has been truly blessed by their efforts, well-intentioned or not. + +### Catherine Willows' Journal (pg. 24) + +### Willows 24 + +### This 'blessing' of theirs appears to be an old ritual for immortality. I believe these peoples are older than the Great Work, based on the ancient dialect they speak and the outdated script they use.|Whatever the case may be, their method seems inexact and prone to failure, as demonstrated by their near maniacal devotion to 'bless' every adventurer they come across. + +### Catherine Willows' Journal (pg. 25) + +### Willows 25 + +### There are two 'castes' in the Bast cult. The first are the 'blessed,' and the second are their watchful guardians. The unintuitive bit is that the 'blessed' are the ones wrapped up and sealed away inside statues, sarcophagi, and anything else the guardians can stick a person into. The free ones wandering around grabbing people? They're the ones who weren't 'blessed' apparently. + +### Catherine Willows' Journal (pg. 26) + +### Willows 26 + +### I've found it! The Archmagus' library! Much to my chagrin, however, the place has been ransacked by witches and a curious group of mages in search of inspiration from ancient fashion choices. + +### Catherine Willows' Journal (pg. 30) + +### Willows 30 + +### It appears someone got to the Archmagus' writings before I could. Nonetheless, I will continue my search for Vinlaga's personal study. Perhaps her research materials and drafts might shed some light on my condition. + +### Catherine Willows' Journal (pg. 31) + +### Willows 31 + +### I have learned of an ancient artifact, called the Mistress' Staff. Its history and owner are hotly debated, with some attributing it to the Archmagus herself, while others say it was developed by the magical warlords that followed. Most all sources agree that its signature feature is the ability to reverse the effects of the Great Work on any person. + +### Catherine Willows' Journal (pg. 36) + +### Willows 33 + +### There is a treasure trove of ancient history here that the blasted Dressmakers had no use for. I found a map from the 'Kingdom of Ejahl,' with sketches of many islands including this one. Like most of the warlord states, they failed to make a lasting impact on the architecture of the island, but it appears the island was uninhabited for some time between the fall of Agartha and its resettlement by Ejahl. + +### Catherine Willows' Journal (pg. 41) + +### Willows 41 + +### ...I must find it.|They are looking for it.|They CANNOT be allowed to have it. + +### Catherine Willows' Journal (pg. 47) + +### Willows 37 + +### I saw my reflection in a pool of water today. My hair looked much more silver than I remember it. I hope this isn't a side effect of all the magic I'd used to make it to this point. + +### Catherine Willows' Journal (pg. 50) + +### Willows 50 + +### I heard the bandits are looking for the Mistress' Staff. I'm not too worried--they wouldn't know what to do with it. It's that damned witch I'm worried about.|If my astute reader has come this far, you should beware the Silver Witch. She is working with forces that cannot be trusted. + +### Catherine Willows' Journal (pg. 51) + +### Willows 51 + +### It seems I am not alone in my search for the Staff. To whom it may concern: the Great Work is a lie, and it will doom us all. If you care for your soul, you need to break the cycle, and for that we need a key: the Mistress' Staff. + +### Silver Witch's Notes #10 + +### Silver 10 + +### I met an adventurer who managed to erase weeks of golem research in the blink of an eye. This is why we Summoners have to scatter our works far and wide... if only they knew what we are working towards. + +### Silver Witch's Notes #2 + +### Silver 2 + +### The dimensional rift is especially active today. I spoke with some of the voices the other night, they offered me immortality in exchange for material wealth. They must have called the wrong universe or something... + +### Silver Witch's Notes #3 + +### Silver 3 + +### My new golem project did not go as expected. I'd expected the primordial one to answer once I'd opened the gate, but there was nothing but a horde of star demons which I quickly dispatched. Could this mean the source of primordial latex is not outside this universe, as I had thought, but inside? I must investigate further. + +### Silver Witch's Notes #18 + +### Silver 18 + +### She did it again. Barged in on my work and called me a 'purveyor of evil magics,' whatever that means. Magic isn't evil, it was given to us directly by the gods! At least I hid my new golem in a different study of mine... + +### Silver Witch's Notes #15 + +### Silver 15 + +### Throughout my studies I have chased after the existence of a being I call 'the Primordial One.' My theories stem from the following observations:|1)Slimes were not present in ancient history, and appeared during my lifetime as a force of nature.|2)Slime can be transmuted into almost any known material, like a Prima Materia of sorts.|3) A fragment of Sariel's notes, one of my most guarded possessions, discusses the existence of slimes long before they were first observed in the world.|Based on this, I believe the world must have been created through the influence of some primordial being who then left, but must be returning somehow.|I'm sure this being holds the key to repairing our bodies. + +### Silver Witch's Notes on the Primordial One + +### Silver 4 + +### Blast. An adventurer stole one of my notebooks, and now I'm encountering various cultists and weirdos trying to summon the Primordial One themselves. This is why I never bother to publish my works... + +### Silver Witch's Notes #7 + +### Silver 7 + +### I haven't heard of that adventurer in decades. Perhaps her nosiness finally caught up to her? + +### Silver Witch's Notes #106 + +### Silver 106 + +### There is a new presence in the mountain. An opportunist that calls herself 'the Dollmaker.' Claims to be the lost heir to the Kingdom of Ejahl. Please~.|I've seen those hackjobs and reprogrammed wrecks. If there even was a Kingdom of Ejahl, surely their army would consist of more than just scrapped combat drones? + +### Silver Witch's Notes #117 + +### Silver 117 + +### The Kingdom of Ejahl appeared in Agartha 170 years after the death of Sariel Vinlaga. It had three* rulers who vied for the throne at different times:|Diana, Princess of Machinery|Emer, the Warsage|And the Dollmaker, High General of the Kingdom||*Some manuscripts read 'two' + +### The Chronicles of Ejahl + +### Ejahl 1 + +### The Kingdom of Ejahl ruled the island of Agartha for 30 years before its collapse. During the last war, an unknown figure captured the majority of its army and the majority of the population fled by boat. No one was left on the island. + +### The Fall of Ejahl + +### Ejahl 2 + +### Danger Level: Nearly Harmless|A reanimated corpse from before the Great Work. I can't tell if the original soul still inhabits the body, since it can barely speak let alone explain its identity.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Normal|These zombies are more motivated than the others. Their behavior is similar to that of vengeful spirits I've encountered in the depths.||-Denizens of the Dungeon by Catherine Willows + +### Fast Z. + +### Danger Level: Normal|A zombie that can use magic. It doesn't look like any magic I've seen outside the ruins, which makes me think that it was taught to use magic. Some of them have tattoos associated with magic in the old times. Since magic comes from the soul, I assume there is some hint of the original soul still present.|-Denizens of the Dungeon by Catherine Willows + +### Mage Z. + +### Danger Level: High|A zombie with impeccable sword technique. I've never seen an undead handle a sword so smoothly. Probably buried with their weapons and gear, since most of it is aged. Even their binding techniques resemble those in the textbooks rather than modern ropework.||-Denizens of the Dungeon by Catherine Willows + +### Warrior Z. + +### Danger Level: High|A zombie that uses sealing charms and healing magic. Irony aside, I've seen these with rope marks and gag strap marks on their skin and face. It seems like someone is playing with them. Who could that be?||-Denizens of the Dungeon by Catherine Willows + +### Talisman Z. + +### Danger Level: Annoying|A playful spirit residing in the dungeon, taking advantage of any adventurers they come across. They can pass through walls, and most physical weapons go right through them. Using a magical weapon seems to banish them for some time, at least.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Very Annoying|It is said that ghosts are the spirits of pre-Great Work humans whose souls are bound to this world by unfinished dreams and ambitions. But I don't believe a word of that. These little guys care about nothing except humiliating people. Ask me how I know.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Medium|A very playful ghost with a penchant for teasing. It even carries spectral restraints of its own for use in 'games,' which tend to consist of tickling tied up girls.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Low|The feelings of a person who desired wealth in life. While it is unable to claim any physical wealth for itself, it nonetheless will rummage through your pockets and possessions if it gets a chance.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: High|A constricting mass of negative thoughts. According to local myths, the other ghosts attempt to cheer this one up by hugging it, but its wails end up attracting them to your position. Be prepared to take it down lest you find yourself a plaything for the beyond.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: High|While most wizards spend literal centuries mastering the art of magic, there are those lacking the patience or discipline to study magic the old fashioned way. Driven by a need for power, these individuals make contracts with otherworldly beings and become Witches.||-Denizens of the Dungeon by Catherine Willows + +### The Witches' Coven + +### Witches + +### Danger Level: Extreme|A witch gifted in the arts of conjuration. Backed by an army of animated spectral hands and devious tomes, this variety of witch is extremely dangerous. Her close range attacks are slow and unwieldy, but take care not to get surrounded.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: High|They appear to be influential figures in the ancient Bast cult. Not only are they able to wield explosive magics, they can conjure magical wrappings at close range.||-Denizens of the Dungeon by Catherine Willows + +### Bast Mummy + +### Danger Level: Medium|Worshippers of the Cat Goddess. Devoted to the sole task of defending the tombs from outsiders, they are rarely willing to negotiate. Some maintain peak physical prowess, while others can even cast spells.||-Denizens of the Dungeon by Catherine Willows + +### Bast Clerics + +### Rock-solid and form-fitting. + +### Provides minor protection against enemy attacks. Decreases stealth. + +### Adventuring Corset + +### Protects your organs and your sense of style. + +### Provides minor protection against enemy attacks at the cost of flexibility. + +### The best uniform. Has a (lockable) zipper in the back for convenience! + +### Removes excess clothing and adds +10 Evasion. +20 Soap and Glue resist, and being drenched dries faster. + +### Robe of Chastity + +### A magical leotard whose power stems directly from the divine. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. + +### Chainmail Tank Top + +### Cumbersome, but effective! + +### Provides +10 armor and protection against enemy attacks. Decreases stealth/evasion and makes struggling harder. + +### Chainmail Bikini + +### Covers the important bits, anyway. + +### +20 Bondage Resist. Conducts electricity. + +### Light Plate Armor + +### Knight in shining rest-err, armor! + +### Provides +5 armor and high protection. No impact to stealth or evasion + +### Wizard's Robe + +### I have the power! + +### +30% spell damage and +10 spell ward + +### Chain Skirt + +### A defensive garment providing optimal coverage to the lower torso. + +### Provides medium protection. No impact to stealth or evasion + +### Armored Skirt + +### Gloves with an iron grip. + +### Provides +5 armor and minor protection against enemy attacks. Makes noise when attacking. + +### Leather Gloves + +### Protecting you in style. + +### Provides minor protection against enemy attacks. + +### Steel Pauldrons + +### Dependable protection for the average adventurer. + +### Ranger's Cape + +### Inbued with the powers of moss and ferns and stuff. + +### +25 Evasion. Increases stealth slightly. + +### Oracle's Armbands + +### Armbands made of a slightly magical material. + +### +5% spell damage. +5 Magic Armor. + +### Armored Boots + +### Noisy, but fashionable! + +### Provides +5 armor and protection against enemy attacks. Decreases stealth. + +### Hide Boots + +### For stepping into all kinds of trouble! + +### Generating Map... + +### Mystic wrappings constrict around your body! + +### You'll need a sharp object to cut items. Look for a knife or a piece of scrap on the floor. + +### If you can't get your knife into place, try sitting next to a crack on the wall. + +### Your character will automatically try to lodge the knife into the wall. + +### You'll need to find a cutting weapon with the magic tag to cut magic items. + +### You need to equip your magic cutting weapon to cut magic items. + +### You can surrender in the menu if you want to be treated more gently. + +### That ghost looks less aggressive than the others. Maybe she can help? + +### Need help? Try asking a neutral NPC for assistance! + +### You flanked the enemy! Now attack its weak point for massive damage! + +### Enemies that miss an attack become vulnerable for a turn. + +### Attack them for a guaranteed critical hit! + +### before the attack lands! You can tell the difference by the border of the tiles. + +### Enemy attacks take time to hit. Make sure to step out of the warning tiles, + +### You can dodge out of the way of most projectiles. Avoid the marked tiles. + +### 'Charge' is a unified ammunition for all of your weapons. Recharge it with ancient crystals. + +### Spent crystals can slot into some light fixtures to recharge them, but it requires 100 gold. + +### There is an elevator in this room, but it won't function until you defeat major enemies on this level. + +### If you can't escape from a restraint, try offering gold at a shrine devoted to its goddess. + +### Defeating enemies recovers some willpower. + +### Temporary enemies and summons don't restore anything, however. + +### Attacking a helpless enemy captures her and sends her to your Collection. + +### You can access the Collection in the Items screen, 2nd tab. + +### Conjure Essence Mote + +### Spend 50 DP to conjure a mote of pure spell essence. The mana cost of this spell is decreased based on your maximum DP.|Can only be cast while you have less than 100% DP. + +### You channel your distraction into a tangible orb! + +### You don't have enough distraction! + +### Choose an open space. + +### Choose a tile with no existing mote. + +### You're too distracted to concentrate your distraction! + +### The burst of desire overwhelms you! + +### Psychic Link + +### Deals 20 Psychic damage, then creates a psychic link between you and a single target for 50 turns, splitting distraction gain between the two of you. Requires that you and the target be able to see each other. + +### Target a non-blinded enemy. + +### You briefly lock eyes with the target, forming a psychic link! + +### The psychic link ends between you and the ENMY. + +### Shock Collar + +### Condense your aroused thoughts into stimulating electricity, consuming 30 DP to zap anyone that's currently holding your leash for 40 e-stim damage. 25% chance to stun for a long time, otherwise stuns briefly. Subsequent uses cost 2x the DP. + +### You must be leashed by someone to use this. + +### You don't have enough distraction. + +### You zap your leasher! + +### You are psychically connected! + +### You've used Shock Collar recently and it costs more DP. + + + +### Essence Crystal + +### When you miscast, 50% chance to emit a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. + +### A necklace designed for mages who are novices or easily distracted. It helps recover magical essence lost during miscast. + +### When you miscast, the necklace emits a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. + +### You erase the seal sigil. + +### You absorb the mote, granting miscast reduction. + +### Your necklace emits a mote as a result of miscasting. + +### Your distraction reaches a critical point! -100% miscast chance. + +### While at 100% distraction, you gain -100% miscast chance, but spending too much mana at once may cause you to go over the edge. + +### -100% miscast chance, but casting spells can send you over the edge. + +### The psychic link conducts away some of the intensity... + +### Your linked target lets go of herself, transmitting a wave of pleasure to yourself... + +### FCTN RMTPE + +### PTRN's RMTPE + +### Leads to PLCE + +### (You find a girl clad in a pink catsuit and restrained with straps.)|(She wears a backpack with a note attached to it.)|'My pet here can pick up and deliver restraints for you~'|'Try opening the Facilities tab and depositing restraints!'|'Signed: Your Loyal Warden' + +### It becomes hard to resist the dragon's fury... + +### The dragon overwhelms you with sheer force... + +### Your strength begins to fade... + +### >Entrance + +### >Exit + +### >Stairs + +### Quest(GDSNM) + +### [GDSNM] + + + +### Bed! + +### Silver + +### Mecha + +### chest + +### Lost Items + +### Cache + +### Toy Chest + +### (L) + + + +### (The SPEAKER sits encased in skintight rubber up to her nose.|Though the latex over her mouth is smooth and flat,|you know from her whimpering moans that her mouth|is totally filled with a gag, useless like the rest of her body.|Some sort of stand affixes her to the floor.) + +### (You don't have any solvents that work on latex) + +### (You dissolve her restraints, fumbling around for a while with your bound hands) + +### (You rescue the SPEAKER)|Thank you!|Let's get out of here! + +### (You rescue the SPEAKER)|Mmmmph!|(She wants to keep her gag...) + +### (You are not holding a cutting tool) + +### (You cut her restraints, fumbling around for a while with your bound hands) + +### (You don't have enough mana for Remove Slime) + +### (You utter a word of release to free the SPEAKER)|Many thanks!|Let's go! + +### (You utter a word of release to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) + +### Dissolve the latex with a SLVNT + +### Cut her out with a sharp tool + +### Use Remove Slime to unlock her + +### Local Saves + +### Cloud Saves + +### solvent + +### Latex Doll Stand + +### A stand for your latex dolls, coated in a smooth rubber coating. + +### Has a flange for propping up even dolls wearing chastity belts. + + + +### (The SPEAKER strokes a hand over your body)|It looks like you're carrying some dangerous goods.|Prisoners shouldn't be carrying what doesn't belong to them~ + +### (The SPEAKER folds her hands together)|Miss, I was instructed to make sure you don't have|anything dangerous. I'm going to search you now. + +### (The SPEAKER looks at you plainly)|Did you think you were going to sneak in with all of that? + +### (The SPEAKER smiles)|Let's see, what loot do we have here...|(SPEAKER is going to search you) + +### (The SPEAKER scans you with a red light)|Enumerating contraband...|Please comply for removal. + +### Yes, miss... (Begin search and confiscation) + +### Mmph... (Nod politely) (Begin search and confiscation) + +### No, I refuse! (Fight) + +### Mmph! (Shake your head and fight) + +### Option not available at 0 WP + +### (The SPEAKER starts by removing most of your clothes...) + +### (Next, the SPEAKER looks through your weapons) + +### (Finally, the SPEAKER opens the rest of your bag) + +### (The search is complete)|There! Now let's get you situated~ + +### (The search is complete)|Alright miss, please behave, okay? + + + +### Confiscated AMNTx ITMN! + +### Kept AMNTx ITMN. + +### Sneaked in AMNTx ITMN! + +### GUN + +### The room echoes with the sound of a rubber bullet being fired! + +### Tactical Rubber Bullet + +### A powerful rubber bullet bounces you to the ground! + +### The powerful rubber bullet knocks you down and congeals into Capture Foam! + + + +### Capture Foam (Feet) + +### A sticky foam that spreads quickly and hardens into a tight rubbery layer. + +### A knife won't cut it, it simply reforms around the cut. + +### Capture Foam (Ankles) + +### Capture Foam (Legs) + +### Capture Foam (Arms) + +### Capture Foam (Hands) + +### Capture Foam (Mouth) + +### Capture Foam (Head) + +### Capture Foam Dispenser + +### This collar is designed to make sure its wearer does not escape at all costs. + +### It will occasionally cause Capture Foam to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of Capture Foam you have on you. + + + +### Tactical Rubber + +### An alchemical substance made to be stretchy and more resilient than natural rubber. + +### Developed by kinky alchemists and marketed to PMCs across the islands. + +### Capture Foam + +### A restraining weapon used to apprehend difficult targets. + +### Tactical Rubber (Feet) + +### The end result of capture foam. Strict. Sustainable. Affordable. + +### Tactical Rubber (Ankles) + +### Tactical Rubber (Legs) + +### Tactical Rubber (Arms) + +### Tactical Rubber (Hands) + +### Tactical Rubber (Mouth) + +### Tactical Rubber (Head) + +### Tactical Rubber Collar + +### It will occasionally cause tactical rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. + + + +### Sweeping Strike + +### Headlong Rush + + + +### Maid Squire + +### Maid Knight + +### You humiliate the Maid Squire! + +### You defeat the Maid Knight! For now... she swears revenge. + +### The Squire zips you up in comfy leather gear! + +### The Maid Knight places you in strict bondage! + +### The Squire secures your restraints! + +### The Maid Knight secures your restraints! + +### The Squire dusts you with her duster plug. + +### The Maid Knight sweeps you with her cleaning halberd! + +### The EnemyName retreats! + +### The EnemyName manages to squirm out of sight! + + + +### servers humming... + +### bouncy noises + +### goopy noises + +### bubbling noise + +### rubber squeaking + +### blaring siren + +### You claim the Sweeper. + +### The Sweeper + +### Foe of the unclean. Bringer of neat and tidy workspaces. + +### Deals slash damage. Also deals 30 tickle damage in an area. Has a ranged attack. + +### Make a ranged attack with the Sweeper. + +### You claim the Persuader. + +### The Persuader + +### Military forces sought a solution with higher stopping power after the Great Work made brute force obsolete. Capture Foam rounds are now the standard. + +### Equipped with a duster plug, it deals tickle damage on melee. Can fire a high caliber rubber bullet to deal 80 glue damage from a distance. Takes 3 turns to reload. + +### Make a ranged attack with the Persuader for 25 charge. Deals 80 glue damage. + +### Persuader Round + +### You fire the Persuader! + +### Wait for current save to finish... + +### Please wait for save to finish... + +### Debug Defeat + +### You cast devastating ASCII glyphs! + +### Debug Bind + +### You cast bondage ASCII glyphs! + +### , Floor AMNT + +### Recolor + +### Only collect notable + +### Autorelease escaped + +### NME is not notable enough for your collection. + +### Auto-released NME due to Escape. + +### Your ITMN1 was cursed and transforms into a ITMN2! + +### Equipping Restraint... + +### Equipping Armor... + +### Using Consumable... + +### Struggling... + +### The ITMN1 is purified and returns to being a ITMN2! + +### Reverts if purified with item. + +### ...smaller than expected. + +### Comes with an artistic flair. + +### Set Pivot + +### Toggle click & drag + +### Settings + +### Scroll Controls: + +### Layer Text: diff --git a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_ES.txt b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_ES.txt index 54682415b..27639f3b6 100644 --- a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_ES.txt +++ b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_ES.txt @@ -1,3 +1,5 @@ +### By Strait-Laced Games + Credits Créditos Patrons @@ -6,16 +8,16 @@ News and Updates Noticias y actualizaciones Support @ Patreon Apoyo @ Patreon -Thank you to the following awesome people for supporting me at patreon.com/ada18980|cyberjoel|Samantha Lear|Kara|The-Fisher-King|Laioken|Finn|selly-grim|Dex♪|Churro|Gamefan|Shogo|X27|Blox|Slacker|Nikos S.|Flame|Alexis Octavia|Dmitri S.|Noxgarm|Siegfried K.|Hellgete -Gracias a las siguientes personas increíbles por apoyarme en patreon.com/ada18980|cyberjoel|Samantha Lear|Kara|The-Fisher-King|Laioken|Finn|selly-grim|Dex♪|Churro|Gamefan|Shogo|X27|Blox |Slacker|Nikos S.|Flame|Alexis Octavia|Dmitri S.|Noxgarm|Siegfried K.|Hellgete +### Thank you to the following awesome people for supporting me at patreon.com/ada18980 + Back Atrás Next Próximo -Music: kocaeli|Bound enemy graphics: Song|CN Translation: Alexthymia|KR Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Audio:|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi -Música: kocaeli|Gráficos de enemigos atados: Canción|CN Traducción: Alexthymia|KR Traducción: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Audio:|Bebida de poción - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modificado|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modificado|Clap - DWSD - Modificado|'Door, Front, Closing, A.wav' por InspectorJ (www.jshaw.co .uk) de Freesound.org|'Door, Front, Opening, A.wav' de InspectorJ (www.jshaw.co.uk) de Freesound.org|Cofre abierto - spookymodem - Modificado|Desbloquear - BeezleFM|Desabrochar - danhelbling| Tijeras - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi -undefined -indefinido +### Music: kocaeli, Darkstar Studios|Bound enemy graphics: Song|RU Translation: Osiris|CN Translation: Alexthymia, Mitki, Timeline|KR, JP Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Art: Kjus, Quakehoof, Lumpychan, Kertasu, Koirin, Lightning Rook, Daikinbakuju, Sigma Overlord, dask3|Plasmadragon, GoldieKitsune, SMoonlightM, PureWind, Wyatt Wintersoul|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi + +### Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|AlaskaRobotics - duct tape unroll 3, duct tape unroll 1|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators + Language Idioma English @@ -24,64 +26,236 @@ Chinese Chino Korean coreano +### Japanese + +### Spanish + +### French + +### Russian + Mods modificaciones Mods Loaded. Modos cargados. -Restart required! -¡Reinicio requerido! -需要重启! -¡Necesito reiniciar! -재시작 필요! -¡Reinicio requerido! + + +### Version + +### Kinky Dungeon + +### By Ada18980 + You are an adventurer descending into an ancient underground city of magic. Eres un aventurero que desciende a una antigua ciudad subterránea de magia. Beneath its depths lies the Mistress' Staff, an artifact of untold power. Debajo de sus profundidades se encuentra el Bastón de la Maestra, un artefacto de poder incalculable. Will you prevail against forces unknown, or succumb to its dark secrets? ¿Prevalecerás contra fuerzas desconocidas o sucumbirás a sus oscuros secretos? -(This game does not contain spiders or any carnivorous creatures/plants) -(Este juego no contiene arañas ni criaturas/plantas carnívoras) -(Check out the latest standalone version at the News and Updates link below!) -(¡Vea la última versión independiente en el enlace Noticias y actualizaciones a continuación!) +### (This game does not contain spiders) + +### GFX + +### Character + +### Main + +### UI + +### Controls + +Keybindings +Atajos de teclado + + +### Show Enemy Binding as % + +### Auto-wait Through Delayed Actions + +### Show Minimap Labels + +### Auto loot all from chests + +### Use Palette regardless of Outfit + +### Apply palettes to Restraints + +### Apply palettes to transforms + +### Don't use character palette + +### Always use character palette + +### Use character palette for default outfit + +### Show Background Art + +### Experimental Rendering (unstable) + +### Mute when Minimized + +### Show DP instead of % + +### Quick Inv only equips to self + +### Override Outfit when Loading Save + +### Save Outfits within Save Files + +### Show free characters on map + +### Detailed jailed NPCs (experimental) + +### Show Struggle Bars + +### Allow Suspicious Mods + +### Auto Load Mods (offline only) + +### Classic Inventory Background + +### Skip Intro + +### No Forced Greetings + +### Show Zoom Buttons + +### Show Restraint Info on Escape Hover + +### Always Show Warnings + +### Always Show Minimap + Enable Sound Activar sonido -Enable Drool/Tears -Habilitar babeo/lágrimas +### Drool/Tears + Draw Armor dibujar armadura Enable Music Habilitar música +### Async Rendering (beta) + +### Bloom & Glow + +### Transparent UI + Turn Counter Contador de giros Flash Screen on Stun Pantalla de flash en aturdimiento -Advanced Distraction VFX -Efectos visuales de distracción avanzados +### Map Particles + +### Distraction Particles + +### Vibration Particles + +### Gag Particle FX + Show NPC Status Mostrar estado de NPC -Advanced Fog of War -Niebla de guerra avanzada +### Show Spell Range + +### Trim Edge Walls + +### Fog Shader + +### Light Shader + Intense 'Let Go' VFX Efectos visuales intensos de 'Déjalo ir' Enable Toy SFX Habilitar SFX de juguete Enable Fullscreen Habilitar pantalla completa +### Hi-Res Distortion (Needs Restart) + +### Hi-Res Model (no restart needed) + High Quality Animations Animaciones de alta calidad -Wait Quickly -Espera rápido +### Enemy Animations + +### One-Click Move (when slowed) + +### Latch Shift Key + +### Crotch Rope under panties + +### Chastity over Panties + +### Chastity over Harness + +### Chastity Bra over Bras + +### Simple Color Picker + +### Center Player + +### Draw Buffs on Side + +### Show Trajectory on Auto-Path + +### Show Player Facing + +### Show more learnable spells + +### Show Player Buff Auras + +### Show Enemy Buff Auras + +### Minimalist Enemy Auras + +### Pixelated GFX (needs restart) + +### Auto-Crouch when Tripped + +### Retro Animations + +### Flip Status Bars + +### Reduce Accidental Wall Clicks + +### Enable Nipples + +### Show Nipple Toys Over Bras + +### Hide Nipple Clamps + +### Hide Nipple Piercings + +### Use default palette when no outfit is worn + +### Flip Player Display + +### Grayscale when Blind + +### Faster Floater Fade + +### No Damage Floaters + +### Dynamic Armor (must hide armor) + +### Hide floating weapon display + +### Automatically Take All from Chests + Helpless! ¡Indefenso! Evaded! Evadido! Blocked! ¡Obstruido! -Blocked restraint! -Restricción bloqueada! +### Resisted Bondage! + You bump into a wall. Chocas contra una pared. + + +### Game Resolution: + +### Resolution (needs reload): + Toy Volume: Volumen de juguete: Music Volume: @@ -90,6 +264,14 @@ SFX Volume: Volumen de efectos especiales: Animation Time: Tiempo de animación: +### Map Brightness: + +### Game Font: + +### Button Font: + +### Journey + Select a journey. This will determine the ordering of game areas. Seleccione un viaje. Esto determinará el orden de las áreas de juego. Standard: The intended experience @@ -98,24 +280,30 @@ Random: A chaotic journey Random: Un viaje caótico Harder: A more difficult journey Harder: Un viaje más difícil + + Select perks to start with. Seleccione beneficios para comenzar. Having 10+ spare points will trigger Hard Mode, granting unique loot. Tener más de 10 puntos de repuesto activará el modo difícil, otorgando un botín único. - (HARD MODE ENABLED) - (MODO DURO HABILITADO) +### (HARD MODE ENABLED) + Advanced start (choose perks) Comienzo avanzado (elija ventajas) -Confirm and start playing! -¡Confirma y empieza a jugar! +### Kinky start + +### Normal start + Point Cost: AMOUNT Costo de puntos: AMOUNT Points Available: AMOUNT Puntos disponibles: AMOUNT + + Resilient Foes Enemigos resistentes -Enemies take 30% less damage. -Los enemigos reciben un 30% menos de daño. +### Enemies have 30% more hp. + Strong Fuerte Boosts the Struggle option when escaping. @@ -124,14 +312,18 @@ Helpless Indefenso You are physically weak. Struggling is much less effective. Eres físicamente débil. Luchar es mucho menos efectivo. -Flexible -Flexible + + +### Flexible + Slightly boosts the Remove/Unlock option, escaping is 1.5x as fast except picking, and your feet can use items/buckles. Mejora ligeramente la opción Quitar/Desbloquear, escapar es 1.5 veces más rápido que recoger, y tus pies pueden usar artículos/hebillas. -Inflexible -Inflexible +### Inflexible + You get a penalty to the Remove and Unlock action, and escaping is 0.75x as fast. Recibes una penalización por la acción Quitar y Desbloquear, y escapar es 0,75 veces más rápido. + + Locksmith Cerrajero You get a bonus to lockpicking, allowing you to pick some high-security locks previously impossible. @@ -140,6 +332,8 @@ Clueless despistado You have no idea how to pick locks. Picking is 0.5x as fast and you can't pick most advanced locks. No tienes idea de cómo forzar cerraduras. La selección es 0,5 veces más rápida y no puede seleccionar las cerraduras más avanzadas. + + Psychic Psíquico You no longer drop keys and picks, can unlock yourself with bound hands, and don't need hands for items/potions. @@ -148,14 +342,16 @@ Novice Principiante All spells above 1st level cost 2x as many spell points. Todos los hechizos por encima del nivel 1 cuestan el doble de puntos de hechizo. + + Blessed Bendecido You can drink mana from the shrine fountains once per floor without chance of punishment. Puedes beber maná de las fuentes del santuario una vez por piso sin posibilidad de castigo. Cursed Maldito -Goddess reputations start at 0 and can never exceed 25. -Las reputaciones de diosas comienzan en 0 y nunca pueden exceder 25. +### Goddess reputations can never exceed 25. + Submissive Sumiso Your submissiveness starts at 100 and cannot go below 70. @@ -164,14 +360,18 @@ Wanted Buscado Your security level starts at 100 and cannot go below 70. Su nivel de seguridad comienza en 100 y no puede bajar de 70. + + Studious Estudioso -You start the game with +3 additional spell points. -Comienzas el juego con +3 puntos de hechizo adicionales. +### You start the game with +1 spell point. Your first two spell categories are free. + Meditation Meditación You slowly regenerate mana, up to a maximum of 50. Regeneras maná lentamente, hasta un máximo de 50. + + Willpower Fuerza de voluntad -50% stamina drain from being at high arousal. @@ -180,6 +380,8 @@ Bondage Lover amante de la servidumbre Attempting to escape arouses you. Intentar escapar te excita. + + Focused Dodge Esquivar enfocado While your miscast chance is 0%, you gain +40 Evasion. @@ -188,26 +390,60 @@ Distracted Distraído +15% miscast chance (at all times) +15 % de probabilidad de lanzamiento erróneo (en todo momento) + + Brawler Alborotador -Unarmed attacks deal +10 damage. -Los ataques sin armas infligen +10 de daño. +### Unarmed attacks deal +10 damage and being bound does not decrease unarmed damage. + +### Way of the Squish + +### Unarmed attacks deal grope damage against humans. + +### Way of the Spank + +### Unarmed attacks deal pain damage against humans. + +### Way of the Feather + +### Unarmed attacks deal tickle damage against humans. + +### Harmless + +### Unarmed attacks deal half damage and cost 2x as much stamina. + + + Clumsy Torpe 0.7x base accuracy Precisión base 0.7x + + Unfocused Desenfocado Accuracy multiplied by 0.9x above 10% distraction, down to 0.6x at 90% distraction. Precisión multiplicada por 0,9x por encima del 10 % de distracción, hasta 0,6x con una distracción del 90 %. + + +### Focused Strikes + +### 90% less accuracy penalty on swung weapons due to distraction. + +### Focused Power + +### 90% less stamina cost penalty on staves and similar weapons distraction. + Pristine Prístino -There are no shiny loot objects in the dungeon. -No hay objetos de botín brillantes en la mazmorra. +### There are significantly less shiny loot objects in the dungeon. + Lost Technology Tecnología perdida Ancient power cores break with use, and cannot be recharged. Los antiguos núcleos de energía se rompen con el uso y no se pueden recargar. + + Unchained desencadenado Start with high Metal reputation, and all metal restraints are easier to escape from. @@ -216,10 +452,12 @@ Damsel in Chains damisela en cadenas Metal restraints are harder to escape from. Las restricciones de metal son más difíciles de escapar. + + Forgetful Olvidadizo -You don't remember where you've been in the level. -No recuerdas dónde has estado en el nivel. +### You don't remember where you've been in the level. 30 turn timer. + Cursed Locks Cerraduras malditas Those without keys shall face the Wrath of the Lock. Locked items cannot be cut and are harder to struggle. @@ -230,10 +468,12 @@ Undeniable Innegable Born with an intense submissive desire, you cannot refuse bondage from dialogues. Nacido con un intenso deseo de sumisión, no puedes rechazar la esclavitud de los diálogos. + + Frantic Struggle lucha frenética -Your struggling is 3 times as fast, but less efficient in terms of stamina. -Tu lucha es 3 veces más rápida, pero menos eficiente en términos de resistencia. +### Your escaping is 3 times as fast, but less efficient in terms of stamina. + Escape Artist Artista del escape Start with high Rope reputation, and all rope restraints are easier to escape from. @@ -242,6 +482,8 @@ Rope Bunny conejito de cuerda Rope restraints are harder to escape from. Las restricciones de cuerda son más difíciles de escapar. + + Slippery Resbaladizo Start with high Latex reputation, and all latex restraints are easier to escape from. @@ -250,10 +492,8 @@ Latex Doll muñeca de látex Latex restraints are harder to escape from. Las restricciones de látex son más difíciles de escapar. -Hogtied! -¡Atado! -Start the game trussed up in tight ropes. -Comience el juego atado en cuerdas apretadas. + + Escapee fugitivo Start with high Leather reputation, and all leather restraints are easier to escape from. @@ -262,6 +502,8 @@ Leather-Bound encuadernado en piel Leather restraints are harder to escape from. Las restricciones de cuero son más difíciles de escapar. + + Slayer Asesino You can cast Elemental spells without having the components, at twice the cost. Start w/ Firebolt. @@ -274,14 +516,34 @@ Magician Mago You can cast Illusion spells without having the components, at twice the cost. Start w/ Shadow Dagger. Puedes lanzar hechizos de ilusión sin tener los componentes, al doble del costo. Comienza con Shadow Dagger. + + Narcoleptic narcoléptico You slowly lose stamina over time. Poco a poco pierdes resistencia con el tiempo. + + Stealth Mission Misión de sigilo -You are harder to detect and there are more chests, but enemies take 30% less damage, are more evasive, and drop no gold. -Eres más difícil de detectar y hay más cofres, pero los enemigos reciben un 30 % menos de daño, son más evasivos y no arrojan oro. +### You are harder to detect and there are more chests, but enemies have 50% more HP, are more evasive, and drop no gold. + +### Edging Lovers + +### All humanoids that can bind you also apply edging toys. + +### Denial Lovers + +### All humanoids that can bind you also apply denial toys. + +### Pleasure Lovers + +### All humanoids that can bind you also apply pleasurable toys. + +### Teasing Lovers + +### All humanoids that can bind you also apply teasing toys. + Latex Lovers Amantes del látex All humanoids that can bind you also apply latex restraints. @@ -314,14 +576,16 @@ Conspicuous Conspicuo Enemies detect you more easily. Los enemigos te detectan más fácilmente. + + Bound Power Poder ligado Your damage and evasion increases based on the number of restraints worn, up to +40% when thoroughly bound. Tu daño y evasión aumentan en función del número de ataduras que lleves, hasta un +40 % cuando estás completamente atado. Kill Squad escuadrón de la muerte -Enemies see you through walls and at greater distance. -Los enemigos te ven a través de las paredes ya mayor distancia. +### Enemies gain increased blindsight and vision radius. + Supermarket Supermercado Commerce shrines can appear in levels and have slightly more items. @@ -330,14 +594,8 @@ Price Gouging Especulación de precios Items are 5x as expensive in the shop. Los artículos son 5 veces más caros en la tienda. -Supermarket -Supermercado -Commerce shrines can appear in levels and have slightly more items. -Los santuarios de comercio pueden aparecer en niveles y tener un poco más de elementos. -Price Gouging -Especulación de precios -Items are 5x as expensive in the shop. -Los artículos son 5 veces más caros en la tienda. + + High Security Alta seguridad Picks are weaker, and randomly generated locks are harsher. @@ -354,18 +612,34 @@ Search Party Buscar fiesta More enemies spawn during sleep. Aparecen más enemigos durante el sueño. + + No Way Out No hay salida -Enemies will always use the tightest restraints possible and fully bind you. -Los enemigos siempre usarán las restricciones más estrictas posibles y te atarán por completo. -Graceful Walk -Paseo agraciado -You don't lose stamina when walking with one slowing item, unless it binds your legs together. -No pierdes resistencia cuando caminas con un objeto que te frena, a menos que te ate las piernas. +### Enemies will always use the tightest restraints possible regardless of willpower. +10 Security level. + +### Deft Footwork + +### You ignore some consequences of being mildly slowed from heels or slime, and you can cast Leg spells while slowed significantly at 50% miscast chance. + +### Poor Form + +### Slowing effects on you are amplified. + +### Poor Coordination + +### You must have both fingers and arms free to cast arm spells. Hand restraints are more effective on you. + +### Deft Fingering + +### You can cast arm spells using just your fingers, as long as your hands aren't bound. + + + Well-Equipped bien equipado -Restraints and traps that are limited by level appear sooner, and enemies will stack many restraints. -Las restricciones y trampas que están limitadas por nivel aparecen antes, y los enemigos acumularán muchas restricciones. +### Restraints and traps that are limited by level appear sooner, and enemies stack more restraints in general. +10 security level. + Quick-Draw Dibujo rapido Switching weapons and spells does not take a turn. @@ -374,6 +648,8 @@ Quick-Scribe Escriba rápido Switching spells and casting from spellbook does not take a turn. Cambiar hechizos y lanzar hechizos desde el libro de hechizos no tiene turno. + + Disorganized Desestructurado Switching weapons, learning/choosing spells, and casting from spellbook takes 3 turns. @@ -382,14 +658,26 @@ Savour the Taste Saborea el Sabor Drinking a potion takes 2 turns Beber una poción toma 2 turnos + + Magic Hands Manos mágicas Enemies can add restraints underneath existing restraints. Los enemigos pueden agregar restricciones debajo de las restricciones existentes. + + +### Fully Integrated + +### Start with your body sealed in an adhesive layer of latex. + +### Doll Processing + +### Start atop a conveyor on your way to be sealed away inside the Facility. + Cyber Doll muñeca cibernética -Start in Cyber restraints. -Comience en Restricciones cibernéticas. +### Start in full Cyber restraints. + Fuuka's Pet La mascota de Fuuka Start with Fuuka's collar and a few restraints. @@ -398,14 +686,34 @@ Fuuka Fan Club Club de fans de Fuuka All humanoids that can bind you also apply Fuuka's special restraints. Todos los humanoides que pueden atarte también aplican las restricciones especiales de Fuuka. +### Collected + +### Start with The Warden's special belt which punishes you for defiling spell orbs. + +### Enforcers + +### All humanoids that can bind you also apply The Warden's cuffs. + Dollmaker's Minions Minions del fabricante de muñecas All humanoids that can bind you also apply Cyber Doll restraints. Todos los humanoides que pueden atarte también aplican las restricciones Cyber ​​Doll. -Doll Hunter -Cazador de muñecas +### Doll Hunter V + You start with the Dollmaker's Visor. Empiezas con la visera del fabricante de muñecas. +### Doll Hunter M + +### You start with the Dollmaker's Mask. + +### Persisting Desires + +### Your dark desires are endless. + +### Sugar Rush + +### Consuming sweets makes you hyperactive, decreasing stamina costs and granting free moves. + Vengeance Venganza Defeating an enemy greatly distracts you. @@ -422,54 +730,92 @@ Absolute Focus Enfoque absoluto Miscast chance is doubled. La probabilidad de error se duplica. + + Bound Crusader Cruzado atado -Goddesses will expect you to wear their restraints as their champion. -Las diosas esperarán que uses sus ataduras como su campeón. +### Goddesses will equip restraints upon acceptance of a quest. + Nowhere is Safe Ningún lugar es seguro Beds and furniture are often trapped. Las camas y los muebles a menudo quedan atrapados. + + +### Quakehoof Associate + +### Start with the Epsilon Collar, which regenerates mana when you play with yourself. + +### Epsilon Collar + +### A collar reserved for the most prestigious of submissives. + +### Restores mana when you play with yourself, but increases the distraction given. Only works when Desire is below the limit. + + + +### Bullet Hell + +### Hides warning lines for non-AoE bullets and projectiles. + +### Bullet Armageddon + +### Hides warning lines for AoE spells, bullets, and projectiles. + I have... needs tengo... necesidades Distraction builds up over time. La distracción se acumula con el tiempo. + + Hopeless Desesperanzado Willpower decays over time. La fuerza de voluntad decae con el tiempo. + + Quickness Rapidez Grants Quickness after not moving for 4 turns. Quickness lets you move 1 space without ticking the clock. Otorga rapidez después de no moverse durante 4 turnos. Quickness te permite moverte 1 espacio sin marcar el reloj. + + Expansive Halls Salones expansivos -Increases the size of maps by 1 in each direction. -Aumenta el tamaño de los mapas en 1 en cada dirección. +### Increases the size of maps by 3 in the long dimension. Maps will be less dense. + Gargantuan Halls Salones Gargantuescos -Increases the size of maps by 2 in each direction. -Aumenta el tamaño de los mapas en 2 en cada dirección. +### Increases the size of maps by 6 in the long dimension. Maps will have a mix of tunnels and dead ends. + Labyrinthine Halls Salas laberínticas -Increases the size of maps by 3 in each direction. -Aumenta el tamaño de los mapas en 3 en cada dirección. +### Increases the size of maps by 9 in the long dimension. Maps will be mostly tunnels. + +### Absurdly Huge Maps + +### (Experimental) Make the maps really really big. Probably breaks the game. + Rigger Aparejador -Chain and glue damage increased by 20%. Binding on enemies is 30% stronger. -El daño de la cadena y el pegamento aumentó un 20%. Atarse a los enemigos es un 30 % más fuerte. +### Binding on enemies is 30% stronger. + Pacifist Pacifista -All non-glue, non-chain, or non-teasing damage dealt to humanoid enemies is reduced by 90%. -Todo el daño sin pegamento, sin cadena o sin burlas infligido a enemigos humanoides se reduce en un 90 %. +### All damage dealt to humanoid enemies is reduced by 90% except teasing damage and pain/grope/tickle/charm/psychic/chain/glue. + +### Curse Seeker + +### When you pick up cursed armor or restraints from chests, they equip automatically if able. + Burning Desire Deseo ardiente -While above 70% distraction, you ignite nearby objects and gain +40% fire damage. -Mientras estás por encima del 70 % de distracción, enciendes los objetos cercanos y obtienes un 40 % más de daño por fuego. +### While above 70% distraction, you ignite nearby objects and gain +25% fire damage. + Frigid Personality Personalidad frígida -While at 0% distraction, you gain +10% ice damage and can walk on ice without penalties. -Con una distracción del 0 %, obtienes un 10 % más de daño por hielo y puedes caminar sobre el hielo sin penalizaciones. +### While below 10% distraction, you gain +10% ice damage and can walk on ice without penalties. + Grounded in Reality Basado en la Realidad While at max mana, your attacks deal an additional 30% of their base damage as electric damage. @@ -478,14 +824,16 @@ Like the Wind Como el viento While above 95% stamina, you gain +30 Evasion and your slow level is reduced by 1. Mientras está por encima del 95% de resistencia, obtiene +30 de evasión y su nivel de ralentización se reduce en 1. + + Immovable Object Objeto inamovible -While above 90% willpower, you gain +150 Restraint Block and Earth buff spells cost half mana. -Mientras estés por encima del 90% de fuerza de voluntad, obtienes +150 Bloqueo de restricción y los hechizos de mejora de la Tierra cuestan la mitad de maná. +### While above 90% willpower, you gain +150 Bondage Resist and Earth buff spells cost half mana. + Path of Least Resistance Camino de menor resistencia -While at 0 willpower, you gain +35 Evasion and deal 20% of your max willpower as acid damage when restrained. -Cuando tienes una fuerza de voluntad de 0, obtienes +35 de evasión e infliges un 20 % de tu fuerza de voluntad máxima como daño por ácido cuando estás restringido. +### While at 0 WP, you gain +35 Evasion and deal 20% of your max WP as soap damage when enemies restrain you. + Sticky Situation Situación complicada You take 40% more glue damage. @@ -494,10 +842,14 @@ Breathless Jadeante Taking chain, poison, and crush damage makes you dizzy. Recibir daño de cadena, veneno y aplastamiento te marea. + + + + Kinky Prisoner Prisionero rizado -Guards never remove restraints you are already wearing, unless they are applying something tighter. -Los guardias nunca quitan las restricciones que ya está usando, a menos que estén aplicando algo más apretado. +### Guards won't remove restraints unless they have something tighter. +10 Security level. + Unfair Doors puertas injustas Doors are harder to open while your hands are bound. @@ -516,50 +868,136 @@ You grab the doorknob with your wrists and flex it open. Agarras el pomo de la puerta con las muñecas y lo abres. You use your flexible feet to open the door. Usas tus pies flexibles para abrir la puerta. + + Poor Technique Técnica deficiente Instead of fizzling, most miscasted projectiles and AoE spells will target you instead. En lugar de chisporrotear, la mayoría de los proyectiles mal lanzados y los hechizos AoE te apuntarán a ti. + + + + + + Ticklish Cosquilloso You take 50% more tickle damage. Recibes un 50% más de daño por cosquillas. Stoic Estoico -You gain 82% tickle resist. -Obtienes un 82% de resistencia a las cosquillas. +### You gain +82 tickle resist. + Lascivious Lascivo You take 50% more grope damage. Recibes un 50% más de daño por manoseo. Unperturbed Impávido -You gain 82% grope resist. -Obtienes un 82% de resistencia a manoseos. +### You gain +82 grope resist. + Masochist Masoquista Pain is strongly arousing. El dolor es fuertemente excitante. Pain Tolerance Tolerancia al dolor -You gain 200% pain resist. -Obtienes un 200% de resistencia al dolor. +### You gain +200 pain resist. + Fashionable De moda When you are jailed, you keep your outfit. Cuando estás en la cárcel, te quedas con tu atuendo. + + Futile Struggles Luchas inútiles Lose 2 WP every time you remove a non-trivial restraint. Pierde 2 WP cada vez que eliminas una restricción no trivial. + + Second Wind Segundo aire -Gain 2 WP every time you remove a non-trivial restraint. Destroys restraints on removal. -Gana 2 WP cada vez que eliminas una restricción no trivial. Destruye las restricciones al quitarlas. +### Regenerate WP when unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, gag, or slows. (Upgrade available in spell tree) + +### Second Wind Perk + +### Regenerate WP when you are unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, or gag bondage, and no slows. + +### Triumphant Wind + +### Second Wind now regenerates up to 25% of your max WP + +### Mental Defiance + +### Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While below 25% WP, quickly convert 'Defiance' into WP. + +### Mental Fortitude + +### Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While above 75% WP but below 100%, quickly convert 'Defiance' into WP. Exclusive with Mental Defiance. + + + +### Locked Up + +### While wearing a chastity belt, your Desire lowers when you perform actions such as defeating enemies, opening chests, and breaking orbs. (Upgrades available in spell tree) + +### Locked Up Perk + +### While wearing a chastity belt, your Desire lowers when you perform actions such as capturing, opening chests, and breaking orbs. + +### Controlled Urges + +### Locked Up is 150% effective. Gain +70 psychic/charm resist from a chastity belt and +30 from a chastity bra. While not wearing a chastity belt, your Desire increases slowly. + +### Ready for Training + +### Locked Up is 200% effective. +25% stamina regen per 100 current DP. Playing with yourself is less effective while vibrators are off or set to edge. Slow level is increased by 1 when you aren't wearing any chastity. + +### Efficient Denial + +### Locked Up is 300% effective. When Locked Up triggers, you gain -30% mana costs and +25% physical damage for 7 turns (35 when opening a chest or breaking orbs). You cannot orgasm unless you are wearing a chastity belt, and slow level is increased by 2. + +### Recalcitrant + +### Relinquish the Locked Up perk. One time only. If you take the perk again, there is no going back. + +### Novice Pet + +### You can now sprint while wearing a petsuit. (Upgrades available in spell tree) + +### Novice Pet Training + +### You can now sprint while wearing a petsuit. + +### Eager Pet + +### +1 slow reduction while wearing a petsuit, but sprint costs are increased by 30% when not wearing a petsuit. + +### Experienced Pet + +### +2 slow reduction total while wearing a petsuit (from +1), but sprint costs are increased by 100% (from 30%) when not wearing a petsuit and slow level is increased by +1. + +### Devoted Pet + +### +3 slow reduction total while wearing a petsuit (from +2), but you cannot sprint (from +100% cost) when not wearing a petsuit and slow level is increased by +2 (from +1). + +### Bad Pet + +### Relinquish the Novice Pet perk. One time only. If you take the perk again, there is no going back. + +### You are an expert in wearing a petsuit and your mobility is increased. + +### You are too used to wearing petsuits! Sprinting is impaired. + +### You are a disobedient pet. You should put on a petsuit! + Dominant Dominante They're trapped here with you. Ghosts are more helpful, and you can bind enemies that confront you about bondage. Están atrapados aquí contigo. Los fantasmas son más útiles y puedes atar a los enemigos que te confrontan sobre la esclavitud. + + Stranger Extraño Randomizes your relationship to most factions. @@ -568,30 +1006,86 @@ Wrong Neighborhood Vecindario equivocado All factions are hostile and united against you. Todas las facciones son hostiles y están unidas contra ti. +Bandit +Bandido +### Start friendly to bandits, and hostile to most other factions. + Trespasser Intruso You lose reputation with the goddesses every time you advance a floor. Pierdes reputación con las diosas cada vez que avanzas un piso. + + Prisoner Prisionero Start the game as a submissive prisoner wandering the halls. Comienza el juego como un prisionero sumiso que deambula por los pasillos. + + Rusty Bolts pernos oxidados -Most traps have a 25% misfire chance. -La mayoría de las trampas tienen un 25 % de probabilidad de fallar. +### Most traps have a 25% misfire chance each time you step on them. + +### Not a Pet + +### Petsuits occur less often. + Unmasked desenmascarado -Hoods and full-face covering masks do not appear, but blindfolds are more powerful. -Las capuchas y las máscaras que cubren toda la cara no aparecen, pero las vendas para los ojos son más poderosas. +### Hoods and full-face covering masks do not appear, but blindfolds are more powerful. Does not include kigurumi masks. + +### No Kigurumi Masks + +### Removes face-mimicking masks from the game. + +### No Hoods + +### Removes hoods from the game. + +### No Sense Deprivation + +### Removes sensory deprivation hood/mask from the game. + Blackout Apagón Blindfolds are stronger. While blindfolded you can only see enemies next to you. Los ojos vendados son más fuertes. Con los ojos vendados, solo puedes ver a los enemigos a tu lado. +### No Blindfolds + +### In most cases you will not get blindfolded, except for cloth blindfolds which can be escaped easily. + Total Blackout Apagón total -Blindfolds are extremely punishing and you can't see explored areas while blindfolded. -Las vendas en los ojos son extremadamente duras y no puedes ver las áreas exploradas con los ojos vendados. +### Blindfolds are extremely punishing. + +### Poor Vision + +### Vision radius is significantly reduced. + +### Keen Hearing + +### You can more easily hear enemies and their movements through walls. + +### Archer's Eye + +### +2 vision radius. + +### Night Owl + +### Your vision in dark areas is improved. + +### Fear of the Dark + +### Your vision in dark areas is reduced. + +### Mutually Assured Darkness + +### Darkness is twice as effective in hiding from enemies, but your night vision is also reduced. + +### Stalker + +### Darkness is twice as effective in hiding from enemies. + Not a Doll no es una muñeca You may still enter Doll Terminals, but enemies will not force you onto doll stands. @@ -600,6 +1094,10 @@ No Nurses sin enfermeras Nurses will not appear in the game. Las enfermeras no aparecerán en el juego. +### No Police + +### Police-based bounty hunters will not appear in the game. + No Brats sin mocosos Submissive enemies won't run away from you. @@ -608,6 +1106,8 @@ Brats Only solo mocosos Submissive enemies will always be bratty and force you to catch them. Los enemigos sumisos siempre serán malcriados y te obligarán a atraparlos. + + More Tape Más cinta Tape-wielding enemies (such as Tape Bots) occur more frequently. @@ -616,42 +1116,106 @@ Less Tape menos cinta Fewer tape-related enemies will appear, although this does not remove tape entirely. Aparecerán menos enemigos relacionados con la cinta, aunque esto no elimina la cinta por completo. + + +### No Tape Bots + +### The old civilization did not use tape-based restraints in their capture robots. + +### Less Cable Bots + +### The old civilization used significantly less cable-based restraints in their capture robots. + +### No Resin Bots + +### The old civilization did not use crystal resin-based restraints in their capture robots. + +### Lexx Latex Bots + +### The old civilization used significantly less latex-based restraints in their capture robots. + +### More Encasement + +### Enemies that encase you (e.g slimes, latex cubes) will appear more frequently. + +### Less Encasement + +### Fewer encasement-related enemies will appear, although this does not remove them entirely. + +### More Bubbles + +### Enemies that use bubbles (e.g. aqua slimes, water witches) will appear more frequently. + +### Less Bubbles + +### Fewer bubble-related enemies will appear, although this does not remove them entirely. + + + + + Trainee Aprendiz -Your training has given you access to the spells of the Trainee class. (Aroused mode only) -Tu entrenamiento te ha dado acceso a los hechizos de la clase Aprendiz. (modo excitado solamente) -Warrior -Guerrero -Your training has given you access to the spells of the Warrior class. -Tu entrenamiento te ha dado acceso a los hechizos de la clase Guerrero. +### Your training has given you access to the powers of the Trainee class. (Aroused mode only) + +Fighter +Combatiente +### Your training has given you access to the powers of the Fighter class. + Rogue Pícaro -Your training has given you access to the spells of the Rogue class. -Tu entrenamiento te ha dado acceso a los hechizos de la clase Rogue. +### Your training has given you access to the powers of the Rogue class. + Wizard Mago -Your training has given you access to the spells of the Wizard class. -Tu entrenamiento te ha dado acceso a los hechizos de la clase Mago. -Panic!!! -¡¡¡Pánico!!! +### Your training has given you access to the powers of the Wizard class. + +Peasant +Campesino +### You possess the agricultural mastery of the Peasant class. + + + +### Panic! (Chests) + +### When you open a trapped chest, you are stunned for 2 turns. + +### Panic! (Traps) + When you step on a trap, you are stunned for 2 turns. Cuando pisas una trampa, te quedas aturdido durante 2 turnos. Panic sets in! (Stunned 2 turns) ¡Se instala el pánico! (Aturdido 2 turnos) + + Butterfingers Torpe Having arms bound prevents you from using your hands to struggle or unlock yourself. Tener los brazos atados le impide usar las manos para luchar o desbloquearse. + + Weak Grip Agarre débil Having arms bound prevents you from holding weapons or potions. Tener los brazos atados le impide sostener armas o pociones. + + You kneel down so you can reach the potion with your mouth... Te arrodillas para poder alcanzar la poción con la boca... + + Can't Hear You! ¡No puedo oírte! Being gagged blocks you from casting verbal spells regardless of gag power. Ser amordazado te impide lanzar hechizos verbales independientemente del poder de la mordaza. +### Smooth Talker + +### Being gagged does not increase your miscast chance for verbal spells unless fully gagged, and reduces gag power by 20%. + +Hoods and full-face covering masks do not appear, but blindfolds are more powerful. +Las capuchas y las máscaras que cubren toda la cara no aparecen, pero las vendas para los ojos son más poderosas. + + Ball Gag Lover Amante de la mordaza Increase occurrence of ball gags, decrease occurrence of muzzles. @@ -660,14 +1224,22 @@ Muzzle Lover Amante del bozal Greatly increases the occurrence of muzzles. Aumenta en gran medida la aparición de bozales. + + Armbinder Lover Amante del brazalete More armbinders, less straitjackets. Más brazaletes, menos camisas de fuerza. + + Jacket Lover amante de la chaqueta More straitjackets, less armbinders. Más camisas de fuerza, menos brazaletes. + + + + Maid Sweeper barrendero Start in a magically locked maid outfit. @@ -676,14 +1248,16 @@ Wolf Trainee aprendiz de lobo Start in a uniform of a naughty wolfgirl. Comienza con el uniforme de una niña lobo traviesa. -Latex Doll -muñeca de látex -Start bound in latex restraints. -Comience atado en las restricciones de látex. -Iron Slave -Esclavo de hierro +### Latex Toy + +### Start bound in lovely latex restraints. + +### Elemental Slave + Start in a full set of magically locked obsidian cuffs. Comience con un conjunto completo de puños de obsidiana cerrados mágicamente. + + Mana Burst Explosión de maná While at 100% distraction, you get -100% miscast chance but spending too much mana at once may cause you to go over the edge. @@ -696,18 +1270,28 @@ Clearheaded lúcido Magic puts you in a clear state of mind. Casting spells successfully reduces your distraction. La magia te pone en un estado mental claro. Lanzar hechizos con éxito reduce tu distracción. + + +### Unidentified Wear + +### Enchanted (and cursed) wearables and weapons are unidentified until the item is used. + +### Unknown + Copy (clipboard) Copiar (portapapeles) Paste (clipboard) Pegar (portapapeles) + + DAMAGEDEALT electric damage conducts to you!!! DAMAGEDEALT te conduce daño eléctrico!!! The pressure fans the flames on you, dealing bonus DAMAGEDEALT fire damage! ¡La presión aviva las llamas sobre ti, infligiendo daño de fuego adicional DAMAGEDEALT! The RestraintName comes off more easily in the presence of water! ¡El RestraintName sale más fácilmente en presencia de agua! -You slip on the ice! -¡Te resbalas en el hielo! +### You slip on the floor! + The air around you is ablaze! (-DamageDealt SP) ¡El aire a tu alrededor está en llamas! (-Daño Infligido SP) The Goddess of Illusions shrouds you in shadows! @@ -720,40 +1304,48 @@ Your body sinks deeper into a sea of bindings... Tu cuerpo se hunde cada vez más en un mar de ataduras... You struggle to breath as you are buried alive in squirming ropes... Luchas por respirar mientras estás enterrado vivo en cuerdas que se retuercen... +### The slime stretches out over your body... + +### The slime continues to engulf you, blocking out your vision... + +### The slime starts to harden, sealing you inside a rubbery prison... + You feel a force compelling you to stop resisting... Sientes una fuerza que te obliga a dejar de resistir... Your body struggles to move as you feel a power sealing you! ¡Tu cuerpo lucha por moverse mientras sientes un poder sellándote! The sarcophagus' door slides open as you are slowly pulled inside... La puerta del sarcófago se abre mientras te empujan lentamente hacia el interior... -The hands squeeze you tightly... -Las manos te aprietan fuerte... -More hands clasp over your body... -Más manos se aferran a tu cuerpo... +### The hands squeeze you tightly as a shadowy portal appears... + +### More hands clasp over your body as they pull you toward the portal... + You struggle to breath as you are pulled into the mass of shadow hands... Luchas por respirar mientras eres arrastrado hacia la masa de manos sombrías... The world goes dark... El mundo se oscurece... You wake up in a different place... Te despiertas en un lugar diferente... + + Arcane Explosion Explosión Arcana + + EnemyName says something incomprehensible! Her spell miscasts! ¡EnemyName dice algo incomprensible! ¡Su hechizo falla! EnemyName fumbles her next move! ¡EnemyName pierde su siguiente movimiento! The EnemyName utters a command word on the TargetName! ¡El EnemyName pronuncia una palabra de comando en el TargetName! -Nipples -pezones + + Nipples pezones Breasts Pechos Panties Bragas -Panties -Bragas Front Frente Rear @@ -762,26 +1354,28 @@ Feet Pies Everywhere! ¡En todos lados! -Physical Armor: -Armadura física: -Magic Armor: -Armadura Mágica: + + +### Physical Armor: + +### Magic Armor: + In the Shadows: You are harder to see. En las sombras: eres más difícil de ver. Invisible: You are very difficult to see. Invisible: Eres muy difícil de ver. Quickness: Your next movement is so fast it doesn't advance a turn. Rapidez: Tu próximo movimiento es tan rápido que no avanza un turno. -All Damage Reduction: -Reducción de todos los daños: +### All Damage Reduction: + You take PERCENT1 DAMAGETYPE damage, based on PERCENT2 DAMAGETYPE resist and PERCENT3 DAMAGECATEGORY modifier. Recibes PERCENT1 DAMAGETYPE de daño, basado en PERCENT2 DAMAGETYPE resist y PERCENT3 DAMAGECATEGORY modificador. You deal PERCENT more DAMAGETYPE damage. Infliges un PERCENT más de daño de TIPO DE DAÑO. Your bindings are PERCENT more effective. Tus ataduras son un PERCENT más efectivas. -Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage. -Tus ataques infligen una base de daño de tipo de daño. +### Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage, for a stamina cost of STMNA. + Plugged! ¡Atascado! Plugged up!!! @@ -800,6 +1394,10 @@ Intense vibrations!! Vibraciones intensas!! Torturous vibrations!!! Vibraciones tortuosas!!! + + +### Your restraints are restrictive! Struggling is less effective without help. + Stunned! You can't move! ¡Aturdido! ¡No puedes moverte! Your vision is impaired! @@ -810,16 +1408,16 @@ Hands are useless! ¡Las manos son inútiles! Hands are impaired! Some tasks will be harder... ¡Las manos están dañadas! Algunas tareas serán más difíciles... -Movement significantly impaired! -¡Movimiento significativamente afectado! -Movement slightly impaired. -Movimiento algo deteriorado. -Movement severely impaired! -¡Movimiento gravemente afectado! -Movement is almost impossible. Sprinting and hopping are disabled. -El movimiento es casi imposible. Los sprints y los saltos están deshabilitados. -Immobilized! -¡Inmovilizado! +### Slow Level 2: Movement significantly impaired! + +### Slow Level 1: Movement slightly impaired. + +### Slow Level 3: Movement severely impaired! + +### Slow Level 4+: Movement is almost impossible. Sprinting and hopping are disabled. + +### Slow Level 10+: Immobilized! + Your mouth is free for potion-drinking and spellcasting activities. Tu boca está libre para beber pociones y lanzar hechizos. Your vision is clear. @@ -834,14 +1432,24 @@ You are gagged! Verbal miscast chance is increased and your potions are less eff ¡Estás amordazado! ¡La probabilidad de lanzamiento erróneo verbal aumenta y tus pociones son menos efectivas! Your mouth is totally filled! You can't drink potions and cant cast verbal spells! ¡Tu boca está totalmente llena! ¡No puedes beber pociones y tienes una alta probabilidad de error verbal! + + Spell Empowerment! ¡Empoderamiento de hechizos! + + Let there be light! ¡Que haya luz! + + You're seeing things... Estás viendo cosas... + + You've been poisoned! ¡Te han envenenado! + + -50% MP Cost (Latex) -50% Costo MP (Látex) -50% MP Cost (Leather) @@ -858,32 +1466,38 @@ Regeneración -50% Costo de PM (Conjuración) -50% MP Cost (Illusion) -50% Costo de PM (Ilusión) + + Conductive: When you or an enemy takes electric damage, the other takes half of it as well! Conductivo: cuando tú o un enemigo reciben daño eléctrico, ¡el otro también recibe la mitad! Lightning Rod: Gain significantly boosted electric resist. Pararrayos: gana resistencia eléctrica significativamente aumentada. Drenched: Grants fire resist, ice/electric weakness, and makes you conductive. Empapado: Otorga resistencia al fuego, hielo/debilidad eléctrica y te hace conductor. + + Chilled: The cold makes it hard to move! You are slowed. Chilled: ¡El frío hace que sea difícil moverse! Estás ralentizado. Slimed: It's sticky and dense! You are slowed and 30% more vulnerable to glue damage. Slimed: ¡Es pegajoso y denso! Eres más lento y un 30% más vulnerable al daño del pegamento. Unsteady: You're on loose footing. You are easier to hit and are slowed. Inestable: Estás sobre una base suelta. Usted es más fácil de golpear y se ralentiza. -Unsteady: You're on loose footing. You are easier to hit and are slowed. -Inestable: Estás sobre una base suelta. Usted es más fácil de golpear y se ralentiza. Ignore Ice Tiles Ignorar fichas de hielo + + Ignited: You are dealing fire damage to yourself and nearby enemies! Ignited: ¡Estás infligiendo daño de fuego a ti mismo y a los enemigos cercanos! You are on fire and taking damage! ¡Estás ardiendo y recibiendo daño! -Arcane Power: Deals bonus damage when you hit an enemy. -Poder arcano: inflige daño adicional cuando golpeas a un enemigo. -Arcane Protection: Reduces damage taken, and deals retaliation damage. -Protección arcana: reduce el daño recibido e inflige daño de represalia. -Arcane Cunning: You turn invisible briefly after attacking. -Astucia Arcana: Te vuelves invisible brevemente después de atacar. + + +### Divine Punishment: Deals bonus damage when you hit an enemy. + +### Divine Protection: Automatically blocks the next 3 times an enemy tries to bind you. + +### Divine Cunning: You turn invisible briefly after attacking. + -MP Cost (Fire) -Coste MP (Fuego) -MP Cost (Air) @@ -892,18 +1506,22 @@ Astucia Arcana: Te vuelves invisible brevemente después de atacar. -Coste MP (Agua) -MP Cost (Earth) -Coste MP (Tierra) + + Slime Form: You gain bonuses and can slip through bars! Slime Form: ¡Obtienes bonificaciones y puedes deslizarte a través de las barras! Shroud: Visibility decreased, evasion increased. Sudario: visibilidad reducida, evasión aumentada. -Camoflage: While holding still, you are very hard to see. -Camuflaje: mientras te quedas quieto, eres muy difícil de ver. +### Camoflage: While next to a wall, you are very hard to see. + Stone Skin: Increased armor. Piel de piedra: Armadura aumentada. Darkblade: Increased damage. Darkblade: mayor daño. Runic Ward: Increased Magic Armor. Runic Ward: armadura mágica aumentada. +### Great Invisibility: It is impossible for enemies to see you. + Invisibility: It is very difficult for enemies to see you. Invisibilidad: Es muy difícil que los enemigos te vean. Lesser Invisibility: It is harder for enemies to see you. @@ -918,64 +1536,82 @@ Sleepy: You are sluggish and have a hard time keeping your eyes open. Somnoliento: Eres perezoso y te cuesta mantener los ojos abiertos. Afterimage: Evasion greatly increased. Imagen remanente: la evasión aumentó considerablemente. -We did it! We made outselves invisible--mmmmph!!! -¡Lo hicimos! Nos hicimos invisibles--mmmmph!!! +### We did it! We made ourselves invisible--mmmmph!!! + +### You are not currently attempting to disguise yourself. Click to reenable. + Your restraints are disenchanted, treating them as nonmagical for purposes of cutting. Tus ataduras están desencantadas, tratándolas como no mágicas a efectos de corte. You can launch another leather restraint instantly! ¡Puedes lanzar otra sujeción de cuero al instante! -Your motivation is powerful enough your spells cannot be stopped! -¡Tu motivación es lo suficientemente poderosa como para que tus hechizos no se detengan! -Locked Down: Struggling power is greatly reduced. -Bloqueado: el poder de lucha se reduce considerablemente. +### You can launch another Sagitta instantly! + +### You have stored willpower. + +### You have consumed a mote of essence, granting miscast chance reduction. + +### You recapture an essence mote and concentrate on its essence! + +### Choose an essence mote to absorb. + Locked Down: Struggling power is greatly reduced. Bloqueado: el poder de lucha se reduce considerablemente. + + Verbose: You can cast verbal spells while gagged. Verbose: puedes lanzar hechizos verbales mientras estás amordazado. Dextrous: You can cast arm spells while tied up. Diestro: puedes lanzar hechizos de brazo mientras estás atado. Spell Dance: You can cast leg spells while tied up. Spell Dance: puedes lanzar hechizos en las piernas mientras estás atado. + + Bondage Buster: Lazor is charging... Bondage Buster: Lazor está cargando... Katana: Patience is key... Katana: La paciencia es clave... Stormbreaker: You have the Power. Stormbreaker: Tú tienes el poder. + + Game Setup: Configuración del juego: -Beginner: Get a save code every 3 levels -Principiante: Consigue un código de guardado cada 3 niveles +### Beginner: Get a save code every 3 levels, autosave after each floor + Roguelike: No save codes, only autosave Roguelike: sin códigos de guardado, solo guardado automático Exciting: Orbs give random spells Emocionante: los orbes dan hechizos aleatorios Kinky: No save codes, orbs give random spells, start with very little Kinky: No hay códigos de guardado, los orbes dan hechizos aleatorios, comienza con muy poco -Log -Registro + + +### Journal + Change Outfit Cambio de atuendo -Reset Outfit -Restablecer atuendo -Code -Código +### Reset to Default + +### Outfit Code + Confirm Reset? ¿Confirmar reinicio? -(Copy the code above and save it on your computer to load later) -(Copie el código anterior y guárdelo en su computadora para cargarlo más tarde) -You come across a black monolith with its face inscribed in runes. -Te encuentras con un monolito negro con su rostro inscrito en runas. -You study them, but can't come up with an interpretation. -Los estudias, pero no puedes llegar a una interpretación. -They may still prove useful to future adventurers should you get caught... -Todavía pueden resultar útiles para futuros aventureros en caso de que te atrapen... -(Your game has been saved automatically, but you can save the code for later) -(Tu juego se ha guardado automáticamente, pero puedes guardar el código para más tarde) + + +### (Your game has been saved) + +### (Copy the code above and save it on your computer to backup) + + + Continue... Continuar... + + Menu Menú + + I will simply wait to see what happens. Simplemente esperaré a ver qué pasa. Save my current progress. @@ -992,40 +1628,50 @@ No, I wish to press on No, deseo continuar See Perks Ver ventajas + + This chest belongs to the FACTION Este cofre pertenece a la FACCIÓN +### This belongs to the FACTION + Devious Dungeon Challenge is enabled. El Desafío de mazmorras tortuoso está habilitado. Waiting for game data... Esperando datos del juego... -You have surrendered to the dungeon and become its prisoner. -Te has rendido a la mazmorra y te has convertido en su prisionero. -Day and night, you wait that rescue may come some day. -Día y noche, esperas que algún día llegue el rescate. -Better luck next time! -¡Mejor suerte la próxima vez! + + + + + + You have reached the end of the playable portion. Has llegado al final de la parte jugable. Come back later for new dungeons! ¡Vuelve más tarde para nuevas mazmorras! + + Got the keys! Find the stairs to go to the next floor. ¡Tengo las llaves! Encuentra las escaleras para ir al siguiente piso. You haven't found the keys for this floor yet. Aún no has encontrado las llaves de este piso. Missing key llave faltante -Chance for a spell to fizzle: -Probabilidad de que un hechizo fracase: -Dodge Chance: Percent%, based on EVASIONSUM Evasion, -EVASIONPENALTY penalty from bindings -Probabilidad de esquivar: Percent%, basado en Evasión EVASIONSUM, penalización -EVASIONPENALTY de enlaces -Chance to block a level 10 restraint: Percent% -Probabilidad de bloquear una restricción de nivel 10: Percent% +### You are protected from damage and can't be bound until the shield is broken! + +### Chance for a spell to fizzle: + +### Dodge Chance: Percent%, based on EVASIONSUM Evasion and EVASIONPENALTY% penalty. + +### Block Chance: Percent%, based on BLOCKSUM Block and BLOCKPENALTY% penalty. + +### Chance to resist a level 10 restraint: AMNT1%, based on AMNT2 Bondage Resist and RESBLKPENALTY penalty. + Sight Range: RADIUS Alcance de la vista: RADIUS Speed: SPD Velocidad: SPD -Normal -Normal +### Normal + Stunned! ¡Aturdido! Slowed @@ -1034,14 +1680,20 @@ Very Slow Muy lento Immobile inmóviles +### DP: PERCENT% + +### DP: CURRENT/MAX (PERCENT% Desire) + +### SP: CURRENT/MAX + Willpower: CURRENT/MAX Fuerza de voluntad: ACTUAL/MAX MP: CURRENT/MAX MP: CURRENT/MAX. Mana slowly recovers from a pool equal to POOLMANA. Drink potions to restore the pool. Mana se recupera lentamente de un grupo igual a POOLMANA. Bebe pociones para restaurar la piscina. -Your minimum distraction increases over time as you encounter distracting things. -Tu distracción mínima aumenta con el tiempo a medida que encuentras cosas que te distraen. +### Your Desire is the baseline Distraction you decay toward, and is increased by distracting things. + Stamina recovers more quickly when you aren't spending it. La resistencia se recupera más rápidamente cuando no la estás gastando. Willpower is restored by food, sleep, and potions. Without willpower, it becomes very difficult to escape. @@ -1054,8 +1706,8 @@ Charge: PERCENT Cargo: PERCENT Use Potion Usar poción - MP - parlamentario +### MP + Go to sleep Ve a dormir Call for help! @@ -1064,14 +1716,10 @@ Play with yourself Juega contigo mismo Let go... Déjalo ir... -Let go... -Déjalo ir... -Play with yourself -Juega contigo mismo -Go to sleep -Ve a dormir -Make noise! -¡Hacer ruido! + + +### Call for Help!!! + Wait until interrupted Espera hasta que te interrumpan Auto-struggle @@ -1084,32 +1732,44 @@ Inspect Inspeccionar Pass NPCs Pasar NPC -Close a Door -cerrar una puerta +### Interact + Sprint/Hop Sprint/salto -Ahh! -¡Ah! -Mmm... -Mmm... -Nnngh... -Nnngh... -Ooooh... -Ooooh... -(Breaths heavily) -(Respira pesadamente) -(Moans softly) -(Gime suavemente) -(Incoherent mumbling) -(Murmullos incoherentes) -(Moans loudly) -(Gime en voz alta) +### Crouch + +### ~ah~ + +### ~mmm~ + +### ~ngh~ + +### ~oh~ + (Heavy breathing) (Respiración fuerte) -(Moaning uncontrollably) -(Gimiendo incontrolablemente) -(Shudders with pleasure) -(Se estremece de placer) +### (Soft moaning) + +(Incoherent mumbling) +(Murmullos incoherentes) +### (Loud moans) + +### (Deep breaths) + +### (Uncontrollable moaning) + +### (Horny noises) + + + +### ~mm~ + +### ~mmph~ + +### ~nnn~ + +### ~mmmmm~ + You wait. Esperas. You wait, legs trembling with arousal. @@ -1124,52 +1784,62 @@ You wait to regain your composure, shaking with frustration. Esperas a recuperar la compostura, temblando de frustración. You are exhausted from spellcasting. Estás exhausto de lanzar hechizos. + + You are feeling tired. Te sientes cansado. You feel exhausted... Te sientes agotado... You feel like you are going to pass out... Sientes que te vas a desmayar... + + Start New Game Empieza un juego nuevo New Game+ Nuevo juego+ Continue Last Save Continuar último guardado -Load From Code -Cargar desde código -Save Outfit (overwrites!) +### Load Saved Game + +Save Outfit (overwrite!) Guardar atuendo (¡sobrescribe!) +### Save Outfit (Clothes Only!) + Save Keybindings Guardar combinaciones de teclas Cancel Changes Cancelar cambios Return Devolver -Keybindings -Atajos de teclado Game Options Opciones de juego + + Load from code Cargar desde código Back to main menu Regresar al menú principal -Load Mod -Mod de carga +### Load Mod .zip + Delete Mod Eliminar modo Clear Perks Borrar ventajas -Config -Configuración +### Config + Cancel Cancelar Filter Filtrar + + DANGER: Loading a mod will execute ARBITRARY CODE on your machine. PELIGRO: Cargar un mod ejecutará un CÓDIGO ARBITRARIO en su máquina. Like connecting to a server, etc. Only load mods from a TRUSTED source. Como conectarse a un servidor, etc. Solo cargue mods de una fuente CONFIABLE. + + Up Arriba Down @@ -1200,78 +1870,122 @@ Spell 6 Hechizo 6 Spell 7 Hechizo 7 +### Spell 8 + +### Spell 9 + +### Spell 10 + +### Load Hotbar 1 + +### Load Hotbar 2 + +### Load Hotbar 3 + +### Load Loadout 1 + +### Load Loadout 2 + +### Load Loadout 3 + Cycle Spell Page Página de hechizos de ciclo Upcast Spells Hechizos elevados Cancel Upcast Cancelar Upcast -Swap Weapon -Cambiar arma -Ranged Attack -Ataque a distancia +### Swap Weapon 1 + +### Swap Weapon 2 + +### Swap Weapon 3 + +### Swap Weapon 4 + +### Weapon Ability + Wait Esperar Cancel/Back Cancelar/Atrás Enter Ingresar +### Expand Minimap + +### Zoom Out + +### Zoom In + +### Wait till Interrupted + +### Make Noise + +### Play with Self + Message Log Registro de mensajes -Close Door -cerrar puerta Pass thru allies Pasar a través de aliados Auto-Struggle Auto-Lucha Auto-Pathfind Búsqueda automática de ruta -Sprint/Hop -Sprint/salto -Inspect -Inspeccionar +### Hide Bullets + Quick Inventory Inventario rápido Inventory Inventario Reputation Reputación +### Journey Map + +### Quests + Spell List Lista de hechizos -Logbook -Cuaderno +### Pause Menu + +### Facilities + Current Key Pressed Tecla actual presionada Press a key, then press a button to set that key Presione una tecla, luego presione un botón para configurar esa tecla + + Floor FLOORNUMBER: DUNGEONNAME Piso FLOORNUMBER: DUNGEONNAME -Lockpicks: -Ganzúas: -Keys: -Llaves: -Magic Keys: -llaves mágicas: -Knife: -Cuchillo: -Mag. Knife: -revista Cuchillo: -You climb down to the next level -Bajas al siguiente nivel +### Lockpicks: + +### Keys: + +### Magic Keys: + +### Knife: + +### Mag. Knife: + +### You climb down the stairs. The passage closes behind you. + +### You climb back up the stairs. + You can't climb down until you get out of this leash... No puedes bajar hasta que te salgas de esta correa... You climb down and find yourself in a strange new place. Bajas y te encuentras en un lugar nuevo y extraño. - plus XXX - más XXX + + +### plus XXX + Graveyard Cementerio Catacombs catacumbas -Underground Jungle -Selva subterránea +### Overgrown Ruins + Lost Temple templo perdido The Bellows @@ -1280,6 +1994,8 @@ Rundown Laboratory laboratorio de resumen Forgotten Garden Jardín olvidado +### Coastal Grotto + Kingdom of Ice reino de hielo @@ -1288,12 +2004,16 @@ reino de hielo The Mansion La mansion + + Ancient Tombs tumbas antiguas Magic Library Biblioteca mágica Crystal Cave cueva de cristal +### Cavern + Orrery Planetario Training Center @@ -1308,6 +2028,40 @@ Doll Storage Almacenamiento de muñecas +### Processing + +### Bandit Hideout + +### Ancient Vault + +### Ancient Halls + +### Slave Market + +### Elevator Hall + +### Dark Passageway + +### Caldera Beach + +### Temple of Air + +### Temple of Fire + +### Temple of Water + +### Temple of Ice + +### Temple of Storms + +### Temple of Earth + +### The Edge of Reality + +### Dark Dimension + +### Lair + You search through the debris but find nothing of note Buscas entre los escombros pero no encuentras nada importante You find some gold coins in a corner (+XXX gold) @@ -1324,6 +2078,8 @@ You find a bola, crafted by bandits Encuentras una bola, hecha a mano por bandidos. You find some unexploded ordnance. Encuentras algunos artefactos explosivos sin detonar. + + You find a key lying atop an open tome! ¡Encuentras una llave encima de un tomo abierto! You find a magical key lying atop an open tome! @@ -1332,6 +2088,10 @@ You find a useful scroll wedged between some treatises! ¡Encuentras un pergamino útil encajado entre algunos tratados! You find a glowing book containing a binding spell! ¡Encuentras un libro brillante que contiene un hechizo vinculante! + + +### You discover a golden cookie, wrapped in foil. Beside it are two power crystals. + You find a golden key surrounded by strange golden crystals. Encuentras una llave dorada rodeada de extraños cristales dorados. You find a set of strange golden crystals. @@ -1342,6 +2102,8 @@ You find a pack of scrolls used for spellcasting. Encuentras un paquete de pergaminos que se usan para lanzar hechizos. You find a glowing scroll of purity. Encuentras un pergamino resplandeciente de pureza. + + The chest contains gold! (+XXX gold) ¡El cofre contiene oro! (+XXX oro) The chest contains a glowing magical knife! @@ -1380,12 +2142,22 @@ You find a special collar that lets you absorb energy from potions. Encuentras un collar especial que te permite absorber energía de las pociones. You find a pair of garish pink high heels with a slippery surface. Encuentras un par de tacones altos de color rosa chillón con una superficie resbaladiza. +### You find a special gag with a feather duster. + +### You find a gas mask suitable for filtering gases. + The pearly chest contains a divine gift! (+ITEMGET) ¡El cofre nacarado contiene un regalo divino! (+ITEMGET) Smoke fills the air around you! ¡El humo llena el aire a tu alrededor! +### You find a magical necklace that seems to concentrate magic. + + + You recover some of your lost items! ¡Recuperas algunos de tus artículos perdidos! + + You find a red potion with a sweet scent. Encuentras una poción roja con un aroma dulce. You find a blue potion that glows with magical essence. @@ -1404,8 +2176,10 @@ You find a snow-like potion that's cold to the touch. Encuentras una poción parecida a la nieve que está fría al tacto. You find a medley of potions. Encuentras una mezcla de pociones. -Rarity: -Rareza: + + +### Rarity: + Lesser Menor Common @@ -1428,88 +2202,118 @@ Angelic Angelical Divine Divino + + Quantity: Cantidad: -Use Item (Consumes 1) -Usar artículo (Consume 1) +### Use One + way of the fist camino del puño Lockpick selección de bloqueo Exit Keys Teclas de salida -Wizard's Outfit -Traje de mago + + +### Adventurer's Outfit + Your favorite outfit for adventuring. Tu atuendo favorito para la aventura. -Your original outfit. No bonuses -Tu atuendo original. Sin bonificaciones +### Your original outfit. No bonuses, no penalties. + +### Tactical Catsuit + +### A sleek catsuit worn by stealth operatives. No frills, no nonsense. + +### Increases stealth by 10% in the dark. + Jail Uniform Uniforme de la cárcel The prisoners are kept in revealing outfits to keep them from hiding things. Los prisioneros se mantienen en trajes reveladores para evitar que oculten cosas. -A prisoner's 'outfit'. No bonuses, no penalties. -El 'traje' de un prisionero. Sin bonificaciones, sin penalizaciones. +### Designed to make it hard to conceal weapons. Makes you more visible and vulnerable to the cold. + + + Wolfgirl Suit Traje de niña lobo -An advanced suit designed for sport -Un traje avanzado diseñado para el deporte. -No bonuses, no penalties. -Sin bonificaciones, sin penalizaciones. -Maid Uniform -Uniforme de sirvienta -An elegant dress meant to denote a maid's status. -Un vestido elegante destinado a denotar el estado de una criada. -Massively increases accuracy against slime mold. -Aumenta enormemente la precisión contra el moho de limo. +### An advanced suit designed for sport, breathable and also warm. + +### Made of latex. Resistant to electricity but does not insulate well. + Maid Uniform Uniforme de sirvienta An elegant dress meant to denote a maid's status. Un vestido elegante destinado a denotar el estado de una criada. Massively increases accuracy against slime mold. Aumenta enormemente la precisión contra el moho de limo. -Prisoner Uniform -Uniforme de prisionero -The uniform of choice for girls captured by the dragonhearts. -El uniforme elegido por las chicas capturadas por los corazones de dragón. -Designed to make it hard to conceal weapons. No bonuses, no penalties. -Diseñado para dificultar la ocultación de armas. Sin bonificaciones, sin penalizaciones. + + +### Harem Outfit + +### A skimpy outfit with antiquated connotations. + +### Harkening back to an old era. + +### Combat Bikini + +### A minimalist albeit chilly outfit designed for ease of use. + +### Or perhaps it's just sexy... + +### Lingerie + +### A minimalist yet aesthetically pleasing outfit. + +### No bonuses. + + + +### Dragonheart Uniform + +### The uniform of choice for dragonheart of all ranks. + +### It's made of fire-resistant leather, and provides +5 armor. + Scientific Uniform Uniforme Científico An outfit designed to leave little to the imagination. Un outfit diseñado para dejar poco a la imaginación. -No bonuses, no penalties. -Sin bonificaciones, sin penalizaciones. +### Resistant to electricity but does not insulate well. Provides significant acid and glue protection for scientific purposes. + Latex Catsuit Catsuit de látex An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. Un atuendo hecho de baba muy procesada. Es naturalmente sedoso y suave al tacto. -No bonuses, no penalties. -Sin bonificaciones, sin penalizaciones. + + Doll Catsuit catsuit de muñeca -An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. -Un atuendo hecho de baba muy procesada. Es naturalmente sedoso y suave al tacto. -No bonuses, no penalties. -Sin bonificaciones, sin penalizaciones. +### Resistant to electricity but does not insulate well. + Cyber Doll Suit Traje de muñeca cibernética A technologically advanced suit designed for long term wear. Despite being watertight and skintight it has cleaning and ventilation ports that plug directly into doll storage fixtures. Un traje tecnológicamente avanzado diseñado para uso a largo plazo. A pesar de ser impermeable y hermético, tiene puertos de limpieza y ventilación que se conectan directamente a los accesorios de almacenamiento de muñecas. -No bonuses, no penalties. -Sin bonificaciones, sin penalizaciones. + + Shadow Latex Dress Vestido de látex de sombra A minidress made from shadow latex, a favorite of otherwordly patrons. Un minivestido hecho de látex de sombras, uno de los favoritos de los clientes de otro mundo. -No bonuses, no penalties. -Sin bonificaciones, sin penalizaciones. +### Resistant to the elements, but is infused with crystals that amplify psychic damage to yourself. + +### Elemental Slave Dress + +### A minidress made to adorn mortal slaves in the elemental planes. + Elven Dress Vestido élfico A regal minidress worn by visitors to the forest. Un minivestido real usado por los visitantes del bosque. -No bonuses, no penalties. -Sin bonificaciones, sin penalizaciones. +### Not very good at insulating you from the cold or from touchy fingers. Its elven aura improves accuracy and evasion by +10. + Scroll of Sleight Pergamino de prestidigitación The scroll makes your memories of arm movements clear as day! @@ -1518,6 +2322,8 @@ A scroll used by thieves to make their plays in secret. Un pergamino usado por los ladrones para hacer sus jugadas en secreto. Allows you to cast Arm spells without components for 12 turns. Te permite lanzar hechizos Armar sin componentes durante 12 turnos. + + Scroll of Purity Pergamino de pureza The scroll circles around your body and you feel... empty now. @@ -1526,6 +2332,8 @@ A scroll used to enforce chastity within religious orders. Pergamino que se utiliza para imponer la castidad en las órdenes religiosas. Removes all vibrators from your body. Elimina todos los vibradores de tu cuerpo. + + Scroll of Speech Pergamino de discurso The scroll makes your gagged speech slightly more intelligible! @@ -1534,6 +2342,8 @@ A scroll used to help translate different languages. Un pergamino utilizado para ayudar a traducir diferentes idiomas. Allows you to cast Verbal spells without components for 12 turns. Te permite lanzar hechizos verbales sin componentes durante 12 turnos. + + Scroll of Sauntering Pergamino de paseo The scroll lets you move your body in swift and accurate ways! @@ -1542,6 +2352,8 @@ A scroll used by dancers to upgrade their moves. Un pergamino que usan los bailarines para mejorar sus movimientos. Allows you to cast Leg spells without components for 12 turns. Te permite lanzar hechizos de pierna sin componentes durante 12 turnos. + + Ancient Key Llave antigua Perhaps it has something to do with ancient restraints? @@ -1550,8 +2362,12 @@ An ancient key plated in gold. It doesnt look like it can open anything... Una llave antigua chapada en oro. No parece que pueda abrir nada... You pick up a shining golden key. Recoges una llave dorada brillante. + + You pick up a ReplaceValue. Recoges un ReplaceValue. + + Power Crystal Cristal de poder You hold the crystal and the power flows into you. @@ -1560,34 +2376,36 @@ You're not sure how they charged these... No estás seguro de cómo cobraron estos... A mysterious device used by the old civilization, powering their ancient devices. Un dispositivo misterioso utilizado por la antigua civilización, alimentando sus dispositivos antiguos. + + You are already full of ancient power. Ya estás lleno de poder antiguo. + + Spent Power Crystal Cristal de poder gastado You touch the spent crystal and it siphons 100 gold from your bag! ¡Tocas el cristal gastado y extrae 100 de oro de tu bolsa! You are not sure how to charge this back up. No está seguro de cómo cargar esta copia de seguridad. -You're not sure how they charged these... -No estás seguro de cómo cobraron estos... A mysterious device used by the old civilization, now depleted. Un dispositivo misterioso utilizado por la antigua civilización, ahora agotado. + + Gold Oro Key Llave -A key with traces of magic that fades with one use. -Una llave con rastros de magia que se desvanece con un solo uso. -Can be used to unlock a restraint, door, or chest. -Se puede usar para desbloquear un sistema de sujeción, una puerta o un cofre. +### A key. You wonder who it's for? + +### Can be used to unlock one simple or standard-locked restraint, door, or chest. + Magic Key llave magica A glowing key enchanted with magic that fades with one use. Una llave brillante encantada con magia que se desvanece con un solo uso. -Can be used to unlock a blue lock. -Se puede usar para desbloquear un candado azul. -Magic Key -llave magica +### Can be used to unlock a runic lock. + A magical key with the power to open blue locks. Una llave mágica con el poder de abrir cerraduras azules. Blue locks can't be otherwise picked. @@ -1596,34 +2414,24 @@ Magic Knife cuchillo magico A magical blade, suitable against ghosts. Una hoja mágica, adecuada contra fantasmas. -Deals shadow damage. Can cut enchanted ropes. -Inflige daño de sombra. Puede cortar cuerdas encantadas. +### Deals shadow damage. Can cut enchanted ropes. Offhand: Increase base crit of all magic damage by 20% + Bola Ella estaba A pair of weights attached to a rope. Can be thrown. Un par de pesas atadas a una cuerda. Se puede tirar. Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. Inflige 90 puntos de unión, 40 de daño en cadena y enraiza a un objetivo durante 4 turnos. -A pair of weights attached to a rope. Can be thrown. -Un par de pesas atadas a una cuerda. Se puede tirar. -Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. -Inflige 90 puntos de unión, 40 de daño en cadena y enraiza a un objetivo durante 4 turnos. Bomb Bomba -After a 5 turn fuse, deals 100 fire damage in a 3x3 area. -Después de un fusible de 5 turnos, inflige 100 daños por fuego en un área de 3x3. -Not a toy! -¡No un juguete! -After a 6 turn fuse, deals 100 fire damage in a 3x3 area. -Después de un fusible de 6 turnos, inflige 100 daños por fuego en un área de 3x3. +### After a 5 turn fuse, deals 100 blast damage in a 3x3 area. + Not a toy! ¡No un juguete! You light the fuse! ¡Enciendes la mecha! Knife Cuchillo -Lockpick -selección de bloqueo A tool used to pick locks. Herramienta que se utiliza para forzar cerraduras. Doesn't last forever, but can help in a pinch. @@ -1636,6 +2444,10 @@ Bola x3 bola x3 Bomb x3 Bomba x3 +### Dynamite x2 + +### Plastic Explosive x2 + Mana Potion Poción de maná You sip the mana potion and feel empowered. @@ -1672,26 +2484,60 @@ Frigid Potion Poción helada You chug the concoction and your senses numb, helping you concentrate. Bebes el brebaje y tus sentidos se adormecen, ayudándote a concentrarte. -A freezing cold bottle with a bitter scent. -Una botella helada con un olor amargo. +### Like bottled snow. Helps to get your mind on track. + Reduces distraction to 0 and grants additional decay for 50 turns. Can be used while gagged. Reduce la distracción a 0 y otorga deterioro adicional durante 50 turnos. Se puede usar mientras está amordazado. Smoke Bomb Bomba de humo -You toss the smoke bomb and it explodes in your location! -¡Lanzas la bomba de humo y explota en tu ubicación! -A type of pyrotechnic often employed by saboteurs. Can be used without hands. -Un tipo de pirotecnia que suelen emplear los saboteadores. Se puede usar sin manos. +### You toss the smoke bomb and it starts emitting a deep haze! + +### You ready a smoke bomb... + +### A type of pyrotechnic often employed by saboteurs. Can be rolled and used without hands. + Creates a smoke screen lasting 8 turns. You are harder to see while inside the smoke. Crea una cortina de humo que dura 8 turnos. Es más difícil verte mientras estás dentro del humo. +### Smoke Bomb x3 + +Flash Bomb +bomba de destello +### Flash Bomb x3 + +### Flashbang x3 + +### You toss the flash bomb and the fuse starts ticking... + +### You ready a flash bomb... + +### A type of explosive used by agents. Blinds nearby targets without causing significant injury. + +### Blinds for 20 turns in a 3x3 area. + + + +### Flashbang + +### You toss the flashbang and the fuse starts ticking... + +### You ready a flashbang... + +### A piece of rare special forces equipment. The secrets of its manufacture are strictly kept by the Alchemist's Guild. + +### Blinds for 24 turns in a 3x3 area. Also Slows and Silences them for half the duration. + +### Blinds for 24 turns in a 3x3 area. And also Slows and Silences them for half the duration. + + + Invisibility Potion Poción de invisibilidad You chug the concoction and see your body fading away. Bebes el brebaje y ves que tu cuerpo se desvanece. You feel liquid inside, but you can't see it! ¡Sientes líquido por dentro, pero no puedes verlo! -Casts Invisibility on yourself. -Te arroja Invisibilidad a ti mismo. +### Casts Vanish on yourself. + Ectoplasm Ectoplasma Like a moisturizing cream, except it's made from coagulated souls. @@ -1724,6 +2570,8 @@ It feels cold to the touch. Se siente frío al tacto. Creates icicles around you for 5-8 turns. They deal 40 damage and freeze for 3 turns. Crea carámbanos a tu alrededor durante 5-8 turnos. Infligen 40 de daño y se congelan durante 3 turnos. + + You steal the doll's identification card. Roba la tarjeta de identificación de la muñeca. Doll ID @@ -1732,10 +2580,14 @@ You apply a clever trick to reset your visor cooldown. Aplicas un truco inteligente para restablecer el tiempo de reutilización de tu visor. A chip used to identify dolls. She must have dropped it. Either way it contains valuable tech... Un chip utilizado para identificar muñecas. Ella debe haberlo dejado caer. De cualquier manera, contiene tecnología valiosa... -It could be used to trick your visor into thinking you've performed your tasks for a while. -Podría usarse para engañar a su visor para que piense que ha realizado sus tareas por un tiempo. -You found a donut with sprinkles! -¡Encontraste una dona con chispas! +### With enough, it can be used to remove Dollmaker's headwear. + + + +### Heart Amulet + +### You find a donut with sprinkles! + Donut (Sprinkles) Rosquilla (Chispitas) You enjoy the donut and relish in its sweet delights. @@ -1744,8 +2596,10 @@ A delicious fried snack, covered in a sugary glaze and topped with sprinkles. Un delicioso refrigerio frito, cubierto con un glaseado azucarado y cubierto con chispas. Restores 10% willpower. Takes a few turns to eat. Restaura un 10% de fuerza de voluntad. Toma unos turnos para comer. -You picked up a sugar cookie slathered in pink frosting! -¡Recogiste una galleta de azúcar untada con glaseado rosa! + + +### You pick up a sugar cookie slathered in pink frosting! + Good-Girl Gift Regalo de niña buena You slowly eat the cookie, savoring its fluffy texture. @@ -1754,28 +2608,32 @@ It tempts you with sweet promises, but something about it feels off... Te tienta con dulces promesas, pero algo se siente mal... Restores 15% willpower and adds +5 submissiveness. Takes a few turns to eat. Restaura un 15% de fuerza de voluntad y añade +5 de sumisión. Toma unos turnos para comer. -You found a chocolate-chip cookie! -¡Encontraste una galleta con chispas de chocolate! + + +### You find a chocolate-chip cookie! + Cookie (Chocolate Chip) Galleta (Chocolate Chip) You enjoy the cookie one chocolatey bite at a time. Disfrutas la galleta un bocado de chocolate a la vez. A delicious baked good made with butter, sugar, and chocolate chips, baked until golden brown. Un delicioso producto horneado hecho con mantequilla, azúcar y chispas de chocolate, horneado hasta que esté dorado. -Restores 10% willpower. Takes a few turns to eat. -Restaura un 10% de fuerza de voluntad. Toma unos turnos para comer. + + The potion was less effective due to your gag! ¡La poción fue menos efectiva debido a tu mordaza! + + Elven Soap Jabón élfico You feel the restraints become loose on your skin! ¡Sientes que las ataduras se aflojan en tu piel! The secret to elven cosmetics and blemish-free skin. El secreto de la cosmética élfica y una piel sin imperfecciones. -Makes you slippery for 10 turns, boosting all forms of struggling. -Te vuelve resbaladizo durante 10 turnos, lo que aumenta todas las formas de lucha. -You feel the restraints become loose on your skin! -¡Sientes que las ataduras se aflojan en tu piel! +### Makes you slippery for 100 turns, boosting all forms of struggling. + + + Enchanted Grinder Amoladora encantada The grinder starts spinning for a short time! Its cutting power is immense! @@ -1784,8 +2642,8 @@ The cutting disc is shining and very sharp. El disco de corte es brillante y muy afilado. Grants significantly increased cutting power for a short time. Otorga un aumento significativo de la potencia de corte durante un breve período de tiempo. -The grinder starts spinning for a short time! Its cutting power is immense! -¡El molinillo comienza a girar por un corto tiempo! ¡Su poder de corte es inmenso! + + Dollmaker's Staff Bastón de fabricante de muñecas You remember this being used on someone else. @@ -1794,66 +2652,70 @@ Recuerdas que esto se usó en otra persona. +15 % de daño por pegamento. Inflige daño psíquico. Los enemigos completamente atados capturados con esta arma se convierten en muñecos de látex que luchan contigo. You are unable to control more than 3 dolls. The new doll is protesting and remains bound. No puedes controlar más de 3 muñecas. La nueva muñeca protesta y permanece atada. + + Staff of Incineration Bastón de incineración A magical weapon made for intermediates to use. Un arma mágica hecha para que la usen los intermedios. -+25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. -+25% daño de fuego. Inflige daño de fuego. Los enemigos en llamas reciben 5 daños de fuego adicionales por turno. +### +25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. Offhand: Applies %fire damage bonus. + Staff of Storms Bastón de tormentas -A magical weapon made for intermediates to use. -Un arma mágica hecha para que la usen los intermedios. -+20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. -+20% daño eléctrico. Inflige daño eléctrico. Los enemigos golpeados por daño eléctrico generan 15 daños eléctricos adicionales en un área de 5x5. +### +20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. Offhand: Applies electric damage bonus. + Staff of Frostbite Bastón de congelación A magical weapon with a 33% chance to freeze the target for 4 turns. Un arma mágica con un 33 % de probabilidad de congelar al objetivo durante 4 turnos. -+20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. -+20% de daño por hielo. Inflige daño de hielo. Los enemigos congelados reciben 5 daños por hielo por turno. +### +20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. Offhand: Applies ice damage bonus. + Staff of Binding Bastón de unión A magical weapon made to use on novices. Un arma mágica hecha para usar en novatos. -+20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. -+20% de daño en cadena. Inflige daño en cadena y enraíza al objetivo durante 4 turnos. 150% de eficiencia de unión. +### +20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. Offhand: Applies chain damage bonus. + Arcane Orb Orbe Arcano Look into my eyes... Mírame a los ojos... -Deals shadow damage. Can be used without hands. Does not benefit from enemies being vulnerable. -Inflige daño de sombra. Se puede usar sin manos. No se beneficia de que los enemigos sean vulnerables. +### Deals arcane damage. Can be used without hands. Can not critically strike. + +You find a purple crystal. You feel your mystic powers flood into it. +Encuentras un cristal púrpura. Sientes que tus poderes místicos lo inundan. Staff of Flame Bastón de llama A magical weapon made for novices to use. Un arma mágica hecha para que la usen los novatos. -+15% fire damage. Deals fire damage. -+15% de daño por fuego. Inflige daño de fuego. +### +15% fire damage. Deals fire damage. Offhand: Applies passive bonus. + Staff of Slime Bastón de limo A slimy and magical implement.. Un implemento viscoso y mágico. -+10% glue damage. Deals glue damage. -+10 % de daño por pegamento. Inflige daño por pegamento. +### +10% glue damage. Deals glue damage. Offhand: Applies passive bonus. + Staff of Shocking Bastón de Choque -A magical weapon made for novices to use. -Un arma mágica hecha para que la usen los novatos. -+10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. -+10% daño eléctrico. Inflige daño eléctrico. 10% de probabilidad de aturdir durante 3 turnos. +### +10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. Offhand: Applies electric damage bonus. + Staff of Permafrost Bastón de permafrost A magical weapon with a 15% chance to freeze the target for 4 turns. Un arma mágica con un 15 % de probabilidad de congelar al objetivo durante 4 turnos. -+10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration) -+10% de daño por hielo. Inflige daño de hielo. Multiplica la duración de los efectos de congelación en los enemigos por 1.5x (duración mínima +1) +### +10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration). Offhand: Applies ice damage bonus. + Staff of Chains Bastón de cadenas A magical weapon made for novices in the art of bondage. Un arma mágica hecha para principiantes en el arte del bondage. -+10% chain damage. Deals chain damage. 150% binding efficiency. -+10% de daño en cadena. Inflige daño en cadena. 150% de eficiencia de unión. +### +10% chain damage. Deals chain damage. 150% binding efficiency. Offhand: Applies chain damage bonus. + +You pick up a staff of chains. You have fond memories... +Recoges un bastón de cadenas. Tienes gratos recuerdos... + + You pick up a staff of binding. You remember these from wizard school... Recoges un bastón de encuadernación. Te acuerdas de estos de la escuela de magos... You pick up a staff of the storm. Your hair stands on end. @@ -1864,26 +2726,28 @@ You pick up a staff with a name on it: DOLLMAKER Recoges un bastón con un nombre: DOLLMAKER You pick up a staff of frostbite. Your hand feels numb just reaching for it. Recoges un bastón de congelación. Tu mano se siente entumecida al intentar alcanzarla. -You pick up a staff of chains. You have fond memories... -Recoges un bastón de cadenas. Tienes gratos recuerdos... + + You pick up a staff of the storm. It tingles. Recoges un bastón de la tormenta. hormiguea. You pick up a staff of flames. It feels warm. Recoges un bastón de llamas. Se siente cálido. -You find a purple crystal. You feel your mystic powers flood into it. -Encuentras un cristal púrpura. Sientes que tus poderes místicos lo inundan. You pick up a staff of slime. Recoges un bastón de limo. You pick up a staff of permafrost. It feels icy to the touch. Recoges un bastón de permafrost. Se siente helado al tacto. + + Crop Cultivo For those unruly subs. Para esos submarinos rebeldes. -Deals pain damage. Highly distracting. -Inflige daño por dolor. Altamente distractor. +### Deals pain damage. Highly distracting. Offhand: +5 pain damage on attack for 3 stamina. + You pick up a riding crop. Recoges una fusta. + + Scissors Tijeras Safety first! @@ -1892,22 +2756,28 @@ Deals slash damage. Better than a knife for cutting restraints. Inflige daño cortante. Mejor que un cuchillo para cortar ataduras. You pick up a pair of scissors. Coges un par de tijeras. + + Dagger Daga Designed with subterfuge in mind. Diseñado con subterfugio en mente. -Deals slash damage. Deals 55 pierce damage instead on unaware targets. -Inflige daño cortante. Inflige 55 de daño perforante en lugar de objetivos desprevenidos. +### Deals slash damage. Deals 40 pierce damage instead on unaware targets, before crit modifiers. Offhand: +10% Base Weapon Crit + You pick up a dagger. Coges una daga. -Katana -Katana + + +### Katana + She who strikes first, hits second. Quien pega primero, pega segundo. Deals slash damage. Deals up to 50 bonus damage by waiting 10 turns between attacks. Inflige daño cortante. Inflige hasta 50 de daño adicional esperando 10 turnos entre ataques. You pick up a katana. Recoges una katana. + + Shadow's Edge borde de la sombra For those who truly devote themselves to the cause. @@ -1916,14 +2786,20 @@ Deals shadow damage. Damage is doubled against enemies that are in shadow. Inflige daño de sombra. El daño se duplica contra los enemigos que están en la sombra. You pick up Shadow's Edge. Recoges Shadow's Edge. + + Stormbreaker rompetormentas I have the power! Taking electric damage charges you (1 turn/10dmg). ¡Tengo el poder! Tomar daño eléctrico te cobra (1 turno/10dmg). -Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. -Inflige daño por aplastamiento. Inflige daño eléctrico adicional en un área cuando está cargado, hasta +40. +### Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. Gives +100 Electric Resist when held. (can be wielded offhand to apply the Electric Resist) + You pick up Stormbreaker. Recoges Stormbreaker. + + + + Rapier Estoque For the ostentatious and flashy duelist. @@ -1932,6 +2808,8 @@ Deals slash damage. Deals 50 pierce damage instead on vulnerable targets. Inflige daño cortante. Inflige 50 de daño perforante en lugar de objetivos vulnerables. You pick up some kind of pretentious sword. Recoges una especie de espada pretenciosa. + + Foil Frustrar En garde! @@ -1940,34 +2818,58 @@ Deals pierce damage. Deals 30 damage instead on vulnerable targets. Inflige daño de perforación. Inflige 30 de daño en lugar de objetivos vulnerables. You pick up a fencing sword. Recoges una espada de esgrima. + + +### Sledgehammer + +### Do you have what it takes? + +### Deals heavy crush damage and knocks the target back 2 spaces. Deals bonus damage to most solid barricades. + +### You pick up a heavy sledgehammer. + Hammer Martillo -A rather simplistic bludgeoning weapon. -Un arma contundente bastante simplista. +### A crude way of fixing your problems. + Deals crush damage and knocks the target back. Inflige daño por aplastamiento y derriba al objetivo. Flail Mayal -A ball on a chain. Very fast and hard to dodge. -Una bola en una cadena. Muy rápido y difícil de esquivar. +### Very fast and hard to dodge as long as you know what you're doing. + Also deals 10 damage to targets next to you. Deals crush damage. También inflige 10 de daño a los objetivos a tu lado. Inflige daño por aplastamiento. Spear Lanza Speak softly and carry a pointy stick. Hable en voz baja y lleve un palo puntiagudo. -Deals pierce damage to the target and one square behind it. -Inflige daño de perforación al objetivo y un cuadrado detrás de él. +### Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 2 tiles away. + +### Pike + +### An 11 foot pole, for things you wouldn't want to touch with a 10 foot pole. + +### Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 3 tiles away. + Bolt Cutters Cortadores de pernos -A cutting tool useful as a bludgeon, and also for cutting locks and chains. -Herramienta cortante útil como cachiporra, y también para cortar candados y cadenas. +### The universal key. + Also assists in cutting restraints when equipped. También ayuda a cortar las restricciones cuando está equipado. A go-to for travelers and adventurers. Una opción para viajeros y aventureros. -Deals slash damage. -Inflige daño cortante. +### Deals slash damage. Offhand: +10 Block + +### Flashlight + +### A weapon of mass illumination. + +### Provides a highly directional light source. + +### You pick up a flashlight. + Torch Antorcha Second only to the mighty towel in usefulness. @@ -1976,22 +2878,22 @@ Deals fire damage. Provides light. Inflige daño de fuego. Proporciona luz. Unarmed Desarmado -Fight with your hands and feet. -Lucha con tus manos y pies. +### Fight with your hands and feet. Counts as teasing if arms are free. 50% chance to stun target if the target is disarmed. + Deals unarmed damage. Inflige daño sin armas. Sword Espada -The blade is strong, its edge sharp. -La hoja es fuerte, su filo afilado. +### the steel is strong, and the blade true. + A fast and accurate weapon that deals slash damage. Un arma rápida y precisa que inflige daño cortante. -Flamberge -Flamberge -A blade forged in a magical fire. -Una espada forjada en un fuego mágico. -Deals 20 bonus fire damage on hit. -Inflige 20 daños de fuego adicionales al golpear. +### Flamberge + +### A blade forged in magic fire. + +### Deals 20 bonus slash damage on hit. Offhand: Produces light. + Escort Drone Dron de escolta A semi-autonomous drone with a personal defense beam. Does not require hands to equip. @@ -2002,28 +2904,22 @@ Magic Wand Varita mágica Its powers extend beyond the traditional schools of magic. Sus poderes se extienden más allá de las escuelas tradicionales de magia. -Deals charm damage. 20% chance to stun the target for 2 turns. -Inflige daño de encanto. 20% de probabilidad de aturdir al objetivo durante 2 turnos. -Feather -Pluma -A feather useful for tickling. -Una pluma útil para hacer cosquillas. -Deals tickle damage. Distracts enemies. -Inflige daño por cosquillas. Distrae a los enemigos. +### Deals charm damage. 20% chance to stun the target for 2 turns. Offhand: +5 charm damage on attack for 3 stamina. + Ice Cube Cubo de hielo A magical cube of ice that never melts. Convenient! Un mágico cubo de hielo que nunca se derrite. ¡Conveniente! -Deals 10 ice damage with a 10% chance to freeze for 3 turns. -Inflige 10 daños por hielo con un 10 % de probabilidad de congelarse durante 3 turnos. +### Deals 10 ice damage with a 10% chance to freeze for 1 turn. Slows targets on hit. Offhand: Slows the target. + Rope Soga A kidnapper's most versatile tool. La herramienta más versátil de un secuestrador. Deals chain damage and applies 50 points of binding. Inflige daño en cadena y aplica 50 puntos de unión. -Enchanted Sword -espada encantada +### Magic Sword + Slices through ghosts with ease! ¡Corta fantasmas con facilidad! A sword that guides itself toward its target, making it easy to hit with. @@ -2038,26 +2934,32 @@ Metamorphosis Metamorfosis You can enter slime form for 25 turns, which lets you pass thru bars, +50 Evasion, and deals 25 glue damage when attacked. Puedes entrar en forma de limo durante 25 turnos, lo que te permite pasar a través de barras, +50 de evasión e inflige 25 de daño de pegamento cuando te atacan. -Deals glue damage. Roots targets for 2 turns on a hit. -Inflige daño por pegamento. Enraiza a los objetivos durante 2 turnos con un golpe. +### Deals glue damage. Roots targets for 2 turns on a hit. Offhand: Roots targets on hit. + Four Seasons Cuatro estaciones Activate to reduce the cost of your next fire, water/ice, air/lightning, and earth spell by 50, once per element. Actívalo para reducir el coste de tu próximo hechizo de fuego, agua/hielo, aire/rayos y tierra en 50, una vez por elemento. -Deals shadow damage. +25% fire, ice, acid, crush, electric, pressure damage. -Inflige daño de sombra. +25% daño por fuego, hielo, ácido, aplastamiento, eléctrico, presión. +### Deals shadow damage. +25% fire, ice, soap, crush, electric, blast damage. Offhand: Applies passive bonus. + The Arbiter el árbitro I have altered the rules. Pray I do not alter them further. He alterado las reglas. Ruego que no los altere más. -Deals chain damage with 110% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Ranged attack: Disarm -Inflige daño en cadena con un 110 % de eficiencia vinculante, +40 de daño de las sombras a las invocaciones. +25% daño de pegamento y cadena. Ataque a distancia: Desarmar -Bondage Buster -destructor de la servidumbre -Can fire a beam (1 turn channel) that deals 30 electric damage, but charges when not fired, dealing 90 total damage at 10 turns of charge. -Puede disparar un rayo (canal de 1 turno) que inflige 30 de daño eléctrico, pero se carga cuando no se dispara, lo que inflige 90 de daño total con 10 turnos de carga. +### Deals chain damage with 125% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Weapon Ability: Disarm + +### Bondage Buster EX + +### Can fire a beam (1 turn channel) that deals 30 electric damage and applies an equal amount of energy bondage. Charges when not fired, dealing 90 total damage at 10 turns of charge. + Melee mode deals tickle damage and marks enemies as vulnerable for 4 turns. El modo cuerpo a cuerpo inflige daño por cosquillas y marca a los enemigos como vulnerables durante 4 turnos. +### Bondage Buster MK II + +### Can fire a beam (3 turn channel) that deals 35 electric damage in an area and applies an equal amount of energy bondage. While charge is below 50%, has a 10% chance to misfire. + +### Melee mode deals tickle damage and marks enemies as vulnerable for 2 turns. + Nevermere Blaster Blaster de nunca jamás Can fire a blast that deals 25 electric damage. @@ -2076,70 +2978,74 @@ Can fire an arrow that makes an enemy extremely lustful, causing them to attack Puede disparar una flecha que hace que un enemigo sea extremadamente lujurioso, lo que hace que ataque a otros. Dura para siempre en enemigos menores, 30 turnos en enemigos de alto nivel y 10 turnos en jefes. Moirai's Scissors Tijeras de Moirai -Safety first! -¡Seguridad primero! -Deals slash damage. Adds up to 30 bonus psychic damage her hit by converting binding into damage. Drains 5 charge to attack twice. -Inflige daño cortante. Agrega hasta 30 de daño psíquico adicional a su golpe al convertir la vinculación en daño. Drena 5 cargas para atacar dos veces. +### Cutting the threads of fate. + +### Deals slash damage. Ignores up to 100 Magic and Physical armor. Active ability: Spend 50 charge to free all nearby allies and disrobe enemies, increasing charm damage on them by 100% and applying the armor shred. + +### With a single snip of the magic scissors, everyone's clothes fall off. + +### No eligible targets within 4 tiles + Latex Projector Proyector de látex Deals crush damage. Can be used to spray a '+' shaped pool of slime. Inflige daño por aplastamiento. Se puede usar para rociar un charco de baba en forma de '+'. -Drains 1.5% ancient energy to create a pool of slime that deals 35 glue damage per tile and slows enemies. -Drena un 1,5 % de energía antigua para crear un charco de baba que inflige 35 de daño de pegamento por mosaico y ralentiza a los enemigos. -Enchanted Axe -Hacha encantada +### Spend 15 charge to create a pool of slime that deals 35 glue damage per tile and slows enemies. + +### Magic Axe + Sick and vile, like the hearts of your enemies. Enfermo y vil, como el corazón de tus enemigos. -Deals shadow damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns. -Inflige daño de sombra al objetivo y 20 de daño de sombra a los enemigos a tu lado. Ralentiza durante 3 turnos. +### Deals slash damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns and applies 60 shadow damage bleed over time to enemies around you. + Pickaxe Pico Used for drilling holes in rock and armor. Se utiliza para perforar agujeros en rocas y armaduras. Deals pierce damage. Reduces enemy armor by 15 for 6 turns. Inflige daño de perforación. Reduce la armadura del enemigo en 15 durante 6 turnos. -Enchanted Flail -Mayal encantado +### Magic Flail + A blessed censer that distributes pain equally. Un incensario bendito que distribuye el dolor por igual. -Deals crush damage to the target and all enemies near the target. -Inflige daño por aplastamiento al objetivo y a todos los enemigos cercanos al objetivo. -Enchanted Spear -Lanza encantada +### Deals crush damage. Deals 20 bonus holy damage to the target and enemies near the target. + +### Magic Spear + Seeks and pierces hearts with ease. Busca y atraviesa corazones con facilidad. -Deals pierce damage to the target and two squares behind it. -Inflige daño perforante al objetivo y dos cuadrados detrás de él. -Enchanted Hammer -Martillo encantado +### Deals pierce damage to the target and two squares behind it. Can be used to make a ranged attack. + +### Magic Hammer + Made of a magical, resonant material. Hecho de un material mágico y resonante. Deals crush damage and knocks the target back. Helps to bash open restraints while cutting. Inflige daño por aplastamiento y derriba al objetivo. Ayuda a golpear las restricciones abiertas durante el corte. -IceBreaker -Rompehielos -A frigid lightweight hammer with a spike on the end. -Un martillo ligero y gélido con una púa en el extremo. +### Icebreaker + +### A frigid magical hammer useful for both climbing up and destroying ice. + Deals crush damage. Deals 3x damage to frozen targets instead of 2x. Triggers Shatter. Inflige daño por aplastamiento. Inflige 3x de daño a objetivos congelados en lugar de 2x. Disparadores destrozados. Dreamcatcher Atrapasueños Forged in nightmares, woven in steel. Summons a Shadow Warrior on unaware targets for 2% ancient energy. Forjado en pesadillas, tejido en acero. Invoca a un guerrero de sombras en objetivos desprevenidos por un 2 % de energía antigua. -Deals shadow damage. Deals up to 30 bonus psychic damage on unaware (100%) or vulnerable (50%) targets. -Inflige daño de sombra. Inflige hasta 30 daños psíquicos adicionales en objetivos desprevenidos (100 %) o vulnerables (50 %). +### Deals shadow damage. Deals up to 30 bonus psychic damage on unaware (100%) or vulnerable (50%) targets. + Axe Hacha Great for cutting trees that happen to be underground. Ideal para cortar árboles que están bajo tierra. Also deals 20 damage to enemies next to you. Deals slash damage. También inflige 20 de daño a los enemigos a tu lado. Inflige daño cortante. -Knife -Cuchillo -Unarmed -Desarmado -Accuracy: -Exactitud: +### Accuracy: + +### Crit Multiplier: + +### Bind Crit Multiplier: + Find the keys.. Encuentra las llaves.. Find the exit! @@ -2148,18 +3054,20 @@ You are receiving help from a friendly ally. Estás recibiendo ayuda de un aliado amistoso. You found a hook you can use to pull on straps and loops. Encontraste un gancho que puedes usar para jalar las correas y los lazos. -You have access to something sharp and can attempt to cut restraints. -Tienes acceso a algo afilado y puedes intentar cortar las ataduras. +### You have access to something sharp and can attempt to Cut restraints, or Remove more effectively. + You found a corner to help manipulate buckles and snaps with. Encontraste una esquina para ayudar a manipular hebillas y broches. You found a crack and could maybe wedge a knife or tool into it to keep it still. Encontraste una grieta y tal vez podrías clavar un cuchillo o una herramienta en ella para mantenerla quieta. You found something sticky and might be able to pull off fabrics. Encontraste algo pegajoso y podrías arrancar telas. -Evasion: -Evasión: -Visibility: -Visibilidad: +### Evasion: + +### Visibility: + + + Submissive: Enemies won't attack you, but they will try to play with you. Sumisa: Los enemigos no te atacarán, pero intentarán jugar contigo. On the Run! Enemies are hostile. @@ -2180,28 +3088,36 @@ Immobile! ¡Inmóvil! Enclosed! ¡Adjunto! + + You feel a gentle buzz... Sientes un suave zumbido... Your toys tease you gently... Tus juguetes te provocan suavemente... -Your toys vibrate noticeably, feeling quite good... -Tus juguetes vibran notablemente, sintiéndose bastante bien... -Your toys buzz strongly, making it difficult to concentrate! -¡Tus juguetes zumban con fuerza, lo que dificulta la concentración! -You tremble as the toys give off intense vibrations! -¡Tiemblas mientras los juguetes emiten intensas vibraciones! -Your toys torture you with intense vibrations! -¡Tus juguetes te torturan con intensas vibraciones! +### Your toys are vibrating. + +### Your toys are buzzing strongly! + +### Your toys vibrate intensely! + +### The vibration is torturous! + Edged! afilado! -Satisfied~ -Satisfecho~ -Damage: -Daño: -Accuracy: -Exactitud: -SP Cost: -Costo de SP: +### Satisfied. Miscast chance is reduced. + + + +### Damage: + +### Bind: + +### Crit: + +### SP Cost: + +### Cut PWR: AMNT% + It appears to be a receptacle Parece ser un receptáculo. Place live crystal @@ -2212,20 +3128,24 @@ You place the crystal into the receptacle and it lights up! ¡Colocas el cristal en el receptáculo y se ilumina! You take the crystal from the receptacle and all goes dark. Sacas el cristal del receptáculo y todo se oscurece. -You try to take the crystal but the cage around it is secured with a purple lock. -Intenta tomar el cristal, pero la jaula que lo rodea está asegurada con un candado púrpura. +### You try to take the crystal but the cage around it is secured with a magic purple lock. + Place spent crystal Coloque el cristal gastado VALUE gold vanishes from your satchel as the receptacle explodes and your crystal is recharged! ¡VALOR oro desaparece de tu cartera cuando el receptáculo explota y tu cristal se recarga! Nothing seems to happen nada parece pasar + + The EnemyName grabs you by the RestraintName and keeps you in place! ¡El EnemyName te agarra por el RestraintName y te mantiene en tu lugar! The EnemyName grabs you and pulls you!!! ¡El EnemyName te agarra y te jala! The EnemyName misses you! ¡El EnemyName te extraña! +### You duck under the EnemyName's attack! + You hear a door creak open nearby! ¡Escuchas una puerta abrirse cerca! You hear the faint sound of a door opening. @@ -2234,10 +3154,20 @@ You hear a door slam shut nearby! ¡Escuchas una puerta cerrarse de golpe cerca! You hear a door being shut in the distance. Oyes que se cierra una puerta a lo lejos. + + The slime is spreading over your body!!! ¡¡¡La baba se está extendiendo por tu cuerpo!!! The slime starts to harden over your skin... La baba empieza a endurecerse sobre tu piel... + + +### The RESTRAINTNAME creates more bindings out of thin air! (+RestraintAdded) + +### A RESTRAINTNAME has appeared around your neck! Beware of additional restraints! + +### The RESTRAINTNAME has run out of bindings to add and has gone dormant for a period of time. + Angel Ángel You subdue the angel! @@ -2248,6 +3178,8 @@ The angel snaps her fingers and divine restraints appear on your body! (+Restrai ¡El ángel chasquea los dedos y las restricciones divinas aparecen en tu cuerpo! (+ Restricción agregada) The angel snaps her fingers and glowing locks appear on your body! ¡El ángel chasquea los dedos y aparecen mechones brillantes en tu cuerpo! + + Holy Construct Construcción sagrada You banish the holy construct! @@ -2258,6 +3190,8 @@ The holy construct emits a blinding light! (DamageTaken) ¡La construcción sagrada emite una luz cegadora! (Daño Recibido) The holy construct emits a Binding light! (+RestraintAdded) ¡La construcción sagrada emite una luz vinculante! (+ Restricción agregada) + + Be not afraid! I am the courier of a local shrine, and I have come to take your offering. ¡No tengas miedo! Soy el mensajero de un santuario local y he venido a recoger tu ofrenda. Hold still and I will take the offering... @@ -2274,28 +3208,38 @@ For I will first have a little fun... Porque primero me divertiré un poco... You have brought this upon yourself, after all. Usted ha traído esto sobre usted mismo, después de todo. + + The angel frowns as you attack her, and glowing rings appear. El ángel frunce el ceño cuando la atacas y aparecen anillos brillantes. + + Angel: MMMMMPHH!!! Ángel: ¡¡¡MMMMMPHH!!! + + (The angel looks puzzled and unlocks your divine restraints) (El ángel mira desconcertado y desbloquea tus restricciones divinas) -Your ArmorName blocks the EnemyName's attack, falling off in the process. -Tu ArmorName bloquea el ataque de EnemyName, cayendo en el proceso. + + +### The EnemyName pulls away your ArmorName!!! + +### There was a bug removing your ArmorName. Please report! + The EnemyName bypasses your security to add the RestraintName! ¡EnemyName pasa por alto su seguridad para agregar RestraintName! -The EnemyName attacks you, but you block the attack! -¡El EnemyName te ataca, pero tú bloqueas el ataque! -Blocked! -¡Obstruido! +### The EnemyName tries to restrain you, but you resist the bondage! + +### Resist! + Mystic Lock Bloqueo místico The mystic lock fades, allowing you to pass once more. El candado místico se desvanece y te permite pasar una vez más. As you cross the threshold, a mystical lock appears to prevent you from stepping back! Al cruzar el umbral, aparece un candado místico para evitar que retrocedas. -As you cross the threshold, a mystical lock appears to prevent you from stepping back! -Al cruzar el umbral, aparece un candado místico para evitar que retrocedas. + + Metal Shield escudo metalico The shield falls to the floor. @@ -2304,6 +3248,8 @@ A metal shield blocks your way! ¡Un escudo de metal bloquea tu camino! Several metal shields block your way! ¡Varios escudos de metal bloquean tu camino! + + Illusion Espejismo The illusion vanishes into thin air. @@ -2312,6 +3258,10 @@ Wall Muro The wall shatters into pieces, which fade away slowly. La pared se rompe en pedazos, que se desvanecen lentamente. +### Locked Door + +### The door lock shatters into pieces. + Earthen Monolith Monolito de tierra The monolith recedes into the ground. @@ -2320,12 +3270,10 @@ Static Sphere esfera estática The sphere shrinks back into the storm dimension. La esfera se encoge de nuevo en la dimensión de la tormenta. -Familiar -Familiar +### Familiar + The familiar dissolves into spectral ash. El familiar se disuelve en ceniza espectral. -Latex Doll -muñeca de látex The doll gives in to her desires and squirms around on the ground. La muñeca cede a sus deseos y se retuerce en el suelo. Storm Crystal @@ -2356,24 +3304,32 @@ Allied Golem Gólem aliado The words vanish from the golem's forehead as it crashes down. Las palabras se desvanecen de la frente del golem mientras cae. + + Shopkeeper Tendero You have done a terrible deed. Has hecho un acto terrible. -Shopkeeper -Tendero -You have done a terrible deed. -Has hecho un acto terrible. + + Crystal Monolith Monolito de cristal The crystal fades from the monolith. El cristal se desvanece del monolito. + + Orb Guardian Guardián del orbe The Orb Guardian dissolves into sand and bone dust. El Orb Guardian se disuelve en arena y polvo de huesos. + + + + You feel like you have made a grave mistake. Sientes que has cometido un grave error. + + Zombie Zombi The zombie moans and collapses to the ground. @@ -2382,6 +3338,8 @@ The zombie's charms attach to your body (+RestraintAdded) Los amuletos del zombi se adhieren a tu cuerpo (+ Restricción Agregada) The zombie caresses your body! (DamageTaken) ¡El zombi acaricia tu cuerpo! (Daño Recibido) + + Maidforce Recruit Recluta de la fuerza de la criada The maid does a fumbled retreat. @@ -2392,46 +3350,48 @@ The maid snaps a lock on one of your restraints! (DamageTaken) ¡La criada abre un candado en una de tus ataduras! (Daño Recibido) The maid tickles you with her feather duster! (DamageTaken) ¡La criada te hace cosquillas con su plumero! (Daño Recibido) + + M.F. 'Unseen Blade' M. F. 'Hoja invisible' The maid runs back to the shadows. La criada vuelve corriendo a las sombras. The maid uses secure restraints on you! (+RestraintAdded) ¡La criada usa restricciones seguras contigo! (+ Restricción agregada) -The maid snaps a lock on one of your restraints! (DamageTaken) -¡La criada abre un candado en una de tus ataduras! (Daño Recibido) The maid stealthily rubs your sensitive areas! (DamageTaken) ¡La criada frota sigilosamente tus áreas sensibles! (Daño Recibido) + + The maid throws a smoke bomb at the ground! ¡La criada lanza una bomba de humo al suelo! -M.F. 'Unseen Blade' -M. F. 'Hoja invisible' -The maid does a fumbled retreat. -La criada hace una retirada a tientas. + + The maid rubs you from many angles! (DamageTaken) ¡La criada te frota desde muchos ángulos! (Daño Recibido) + + M.F. 'Going Loud' M. F. 'Haciéndose ruidoso' -The maid does a fumbled retreat. -La criada hace una retirada a tientas. -The maid uses secure restraints on you! (+RestraintAdded) -¡La criada usa restricciones seguras contigo! (+ Restricción agregada) -The maid snaps a lock on one of your restraints! (DamageTaken) -¡La criada abre un candado en una de tus ataduras! (Daño Recibido) The maid lands a kick and stuns you! (DamageTaken) ¡La sirvienta te da una patada y te aturde! (Daño Recibido) The maid slaps you with a scornful expression! (DamageTaken) ¡La criada te abofetea con una expresión despectiva! (Daño Recibido) + + +### Heavy Weapons Maid + +### The maid drops her weapon and runs. + +### The maid bonks you with her weapon! (DamageTaken) + M.F. 'Parasol' M. F. 'Sombrilla' The maid leaps out of sight. La criada salta fuera de la vista. -The maid uses secure restraints on you! (+RestraintAdded) -¡La criada usa restricciones seguras contigo! (+ Restricción agregada) -The maid snaps a lock on one of your restraints! (DamageTaken) -¡La criada abre un candado en una de tus ataduras! (Daño Recibido) The maid caresses your breasts with a smile! (DamageTaken) ¡La criada acaricia tus pechos con una sonrisa! (Daño Recibido) + + M.F. 'Master Plan' M. F. 'Plan Maestro' The head maid surrenders gracefully. @@ -2444,6 +3404,8 @@ The head maid tickles you strategically! (DamageTaken) ¡La doncella principal te hace cosquillas estratégicamente! (Daño Recibido) You are distracted for a moment and suddenly you find yourself in chastity! ¡Te distraes por un momento y de repente te encuentras en castidad! + + Fire Elemental Elemental de fuego The fire elemental dissolves into ash. @@ -2454,6 +3416,8 @@ The fire elemental places a heavy lock on your restraint! (DamageTaken) ¡El elemental de fuego coloca un pesado candado en tu sujeción! (Daño Recibido) The fire elemental touches you with her burning finger! (DamageTaken) ¡El elemental de fuego te toca con su dedo ardiente! (Daño Recibido) + + Ranger of the Wild Guardabosques de lo salvaje The ranger disappears into the environment. @@ -2464,18 +3428,20 @@ The ranger surprises you and binds you! (+RestraintAdded) ¡El guardabosques te sorprende y te ata! (+ Restricción agregada) The ranger slips a lock onto one of your restraints! (DamageTaken) ¡El guardabosques desliza un candado en una de tus restricciones! (Daño Recibido) + + Druid of the Wild Druida de lo salvaje The druid calls forth vines to mask her retreat. La druida invoca enredaderas para enmascarar su retirada. -The druid calls forth vines to mask her retreat. -La druida invoca enredaderas para enmascarar su retirada. The druid holds your face and kisses you! (DamageTaken) ¡El druida sostiene tu rostro y te besa! (Daño Recibido) The druid binds you with mithril restraints! (+RestraintAdded) ¡El druida te ata con ataduras de mithril! (+ Restricción agregada) The druid tosses a lock from her cloak! It finds you and fastens with a click. (DamageTaken) ¡La druida arroja un mechón de su capa! Te encuentra y sujeta con un clic. (Daño Recibido) + + Water Elemental Elemental de agua The water elemental melts into a pool of water. @@ -2488,6 +3454,8 @@ The water elemental's song compels you to step forward and receive a binding! ¡La canción del elemental de agua te obliga a dar un paso adelante y recibir una atadura! The water elemental sings an arousing song! (DamageTaken) ¡El elemental del agua canta una canción excitante! (Daño Recibido) + + Ice Elemental Elemental de hielo The ice elemental melts into a pool of water. @@ -2498,6 +3466,8 @@ The ice elemental creates icy locks on your restraints! ¡El elemental de hielo crea candados helados en tus ataduras! The ice elemental gives a chilling touch to your body! (DamageTaken) ¡El elemental de hielo le da un toque escalofriante a tu cuerpo! (Daño Recibido) + + Earth Elemental elemental de tierra The earth elemental sinks into the ground. @@ -2508,8 +3478,10 @@ The earth elemental locks a restraint! ¡El elemental de tierra bloquea una restricción! The earth elemental dashes through the earth! ¡El elemental de tierra atraviesa la tierra! -The earth elemental gives you a heavy massage! (DamageTaken) -¡El elemental de tierra te da un fuerte masaje! (Daño Recibido) +### The earth elemental gives you a soft massage! (DamageTaken) + + + Air Elemental Elemental de aire There is no more elemental. Must have been just the wind. @@ -2522,6 +3494,8 @@ The air elemental slips a lock on! (DamageTaken) ¡El elemental de aire desliza un candado! (Daño Recibido) The air elemental spanks you playfully! (DamageTaken) ¡El elemental de aire te azota juguetonamente! (Daño Recibido) + + Angry Zombie zombi enojado The zombie screams and tumbles to the floor. @@ -2530,24 +3504,20 @@ The zombie swiftly wraps you in charms! (+RestraintAdded) ¡El zombi te envuelve rápidamente en amuletos! (+ Restricción agregada) The zombie gropes your body! (DamageTaken) ¡El zombi manosea tu cuerpo! (Daño Recibido) -Zombie -Zombi -The zombie screams and tumbles to the floor. -El zombi grita y cae al suelo. -The zombie swiftly wraps you in charms! (+RestraintAdded) -¡El zombi te envuelve rápidamente en amuletos! (+ Restricción agregada) -The zombie gropes your body! (DamageTaken) -¡El zombi manosea tu cuerpo! (Daño Recibido) + + Support Drone Dron de apoyo The support drone retreats to recharge its weapon! ¡El dron de apoyo se retira para recargar su arma! -The support drone electrocutes you! (DamageTaken) -¡El dron de apoyo te electrocuta! (Daño Recibido) +### The support drone zaps you! (DamageTaken) + The Dollmaker commands a drone to attack you! ¡El fabricante de muñecas ordena a un dron que te ataque! The Dollmaker commands her drones to attack you! ¡La Dollmaker ordena a sus drones que te ataquen! + + Capture Drone dron de captura The capture drone's latex core overloads! @@ -2560,6 +3530,8 @@ The Dollmaker commands a drone to capture you! ¡El fabricante de muñecas ordena a un dron que te capture! The Dollmaker commands her drones to capture you! ¡La Dollmaker ordena a sus drones que te capturen! + + Artistic Zombie Zombi artístico The zombie smiles as it collapses to the ground. @@ -2570,26 +3542,28 @@ The zombie is somehow dextrous enough to lock your restraint! (DamageTaken) ¡El zombi es lo suficientemente diestro como para bloquear tu restricción! (Daño Recibido) The zombie cuddles with your body! (DamageTaken) ¡El zombi se acurruca con tu cuerpo! (Daño Recibido) + + Mage Zombie Zombi mago The zombie frowns and disappears in a puff of ice and ribbons. El zombi frunce el ceño y desaparece en una nube de hielo y cintas. The zombie smiles as she wraps you in charms! (+RestraintAdded) ¡La zombi sonríe mientras te envuelve en amuletos! (+ Restricción agregada) -The zombie gropes your body! (DamageTaken) -¡El zombi manosea tu cuerpo! (Daño Recibido) The zombie's ribbons form magical locks on your body! (DamageTaken) ¡Las cintas de zombi forman mechones mágicos en tu cuerpo! (Daño Recibido) + + Talisman Zombie Talismán Zombi The zombie pouts and puts up a shield to let her retreat. El zombi hace un puchero y levanta un escudo para dejarla retirarse. The zombie giggles as she wraps you in charms! (+RestraintAdded) ¡La zombi se ríe mientras te envuelve en encantos! (+ Restricción agregada) -The zombie gropes your body! (DamageTaken) -¡El zombi manosea tu cuerpo! (Daño Recibido) The zombie uses a sealing spell to create magical locks! (DamageTaken) ¡El zombi usa un hechizo de sellado para crear cerraduras mágicas! (Daño Recibido) + + Warrior Zombie guerrero zombi The warrior zombie yells and falls cinematically. @@ -2602,6 +3576,8 @@ The warrior zombie runs its fingers along your body! (DamageTaken) ¡El zombi guerrero pasa sus dedos por tu cuerpo! (Daño Recibido) The warrior zombie fights using the way of Sword and Lock. (DamageTaken) El guerrero zombi lucha usando el camino de Sword and Lock. (Daño Recibido) + + Rope Artist Artista de la cuerda The rope artist frowns and walks away, looking defeated. @@ -2612,6 +3588,8 @@ The rope artist sneaks a lock onto you while you weren't looking! (DamageTaken) ¡El artista de las cuerdas te pone un candado mientras no estabas mirando! (Daño Recibido) The rope artist smiles and tickles your feet! (DamageTaken) ¡El artista de cuerdas sonríe y te hace cosquillas en los pies! (Daño Recibido) + + Deputy Diputado The deputy surrenders her donuts. @@ -2624,6 +3602,8 @@ The deputy conducts a strip search! (DamageTaken) ¡El diputado realiza una búsqueda al desnudo! (Daño Recibido) The deputy performs a security enhancement procedure! (DamageTaken) ¡El diputado realiza un procedimiento de refuerzo de seguridad! (Daño Recibido) + + Ninja Warrior Guerrero ninja The ninja warrior retreats into the shadows. @@ -2636,6 +3616,8 @@ The ninja warrior uses a lock to give herself the upper hand! (DamageTaken) ¡La guerrera ninja usa un candado para ganar ventaja! (Daño Recibido) The ninja warrior uses a subduing technique! (DamageTaken) ¡El guerrero ninja usa una técnica de sometimiento! (Daño Recibido) + + Ninja Assassin Asesino ninja The assassin retreats into the shadows. @@ -2646,6 +3628,8 @@ The assassin uses a subduing technique! (DamageTaken) ¡El asesino usa una técnica de sometimiento! (Daño Recibido) The assassin stealthily locks your restraint! (DamageTaken) ¡El asesino bloquea sigilosamente tu restricción! (Daño Recibido) + + Animated Armor Armadura animada The Animated Armor falls into pieces. @@ -2654,6 +3638,8 @@ The Animated Armor restrains you with shackles (+RestraintAdded) La Armadura Animada te restringe con grilletes (+Restricción Agregada) The Animated Armor hugs your body with an iron grip! (DamageTaken) ¡La Armadura Animada abraza tu cuerpo con puño de hierro! (Daño Recibido) + + Mimic Imitar The mimic spills out its contents. @@ -2662,6 +3648,8 @@ The mimic spits out a restraint which latches onto you! (+RestraintAdded) ¡El mímico escupe una restricción que se aferra a ti! (+ Restricción agregada) The mimic tickles you with its tongue! (DamageTaken) ¡El imitador te hace cosquillas con la lengua! (Daño Recibido) + + Skeleton Esqueleto The Skeleton falls to pieces. @@ -2670,6 +3658,8 @@ The Skeleton restrains you! (+RestraintAdded) ¡El esqueleto te frena! (+ Restricción agregada) The Skeleton tackles you! (DamageTaken) ¡El Esqueleto te ataca! (Daño Recibido) + + Dragonheart Initiate Iniciado de corazón de dragón The Dragonheart Initiate retreats hurriedly. @@ -2680,6 +3670,8 @@ The Dragonheart Initiate squeezes your body! (DamageTaken) ¡El Iniciado Corazón de Dragón aprieta tu cuerpo! (Daño Recibido) The Dragonheart locks your restraint! (DamageTaken) ¡El Dragonheart bloquea tu moderación! (Daño Recibido) + + Dragonheart Shield Escudo de corazón de dragón The Dragonheart Shield makes a tactical retreat. @@ -2690,8 +3682,8 @@ The Dragonheart Shield bonks you! (DamageTaken) ¡El Dragonheart Shield te golpea! (Daño Recibido) The Dragonheart Shield squeezes your body! (DamageTaken) ¡El Dragonheart Shield aprieta tu cuerpo! (Daño Recibido) -The Dragonheart locks your restraint! (DamageTaken) -¡El Dragonheart bloquea tu moderación! (Daño Recibido) + + Ice Dragonheart Corazón de dragón de hielo The Ice Dragonheart retreats in a blast of snow. @@ -2702,6 +3694,8 @@ The Ice Dragonheart gives your body a cold touch! (DamageTaken) ¡El Ice Dragonheart le da un toque frío a tu cuerpo! (Daño Recibido) The Dragonheart uses an icy lock on your restraint! (DamageTaken) ¡El Dragonheart usa un candado helado en tu sujeción! (Daño Recibido) + + Poison Dragonheart Corazón de dragón venenoso The Poison Dragonheart retreats in a green mist. @@ -2712,8 +3706,8 @@ The Poison Dragonheart smacks you with her axe! (DamageTaken) ¡La Poison Dragonheart te golpea con su hacha! (Daño Recibido) The Poison Dragonheart thrums her claws across your figure! (DamageTaken) ¡El Poison Dragonheart golpea con sus garras tu figura! (Daño Recibido) -The Dragonheart locks your restraint! (DamageTaken) -¡El Dragonheart bloquea tu moderación! (Daño Recibido) +### The Dragonheart locks your restraint using natural magics! (DamageTaken) + Crystal Dragonheart Corazón de dragón de cristal The Crystal Dragonheart screams and falls to the ground dramatically. @@ -2722,34 +3716,36 @@ The Crystal Dragonheart apprehends you! (+RestraintAdded) ¡El Crystal Dragonheart te aprehende! (+ Restricción agregada) The Crystal Dragonheart squeezes you in a big hug! (DamageTaken) ¡El Crystal Dragonheart te aprieta en un gran abrazo! (Daño Recibido) -The Dragonheart locks your restraint! (DamageTaken) -¡El Dragonheart bloquea tu moderación! (Daño Recibido) +### The Dragonheart grows a crystalline lock on your restraints! (DamageTaken) + Many crystals rise up out of the ground! ¡Muchos cristales se levantan del suelo! A crystal rises up out of the ground! ¡Un cristal se levanta de la tierra! + + + + Statue Estatua The statue topples over! ¡La estatua se cae! -Statue -Estatua -The statue topples over and reveals a mechanism! -¡La estatua se cae y revela un mecanismo! -Statue -Estatua The statue topples over and reveals a mechanism! ¡La estatua se cae y revela un mecanismo! The statue shoves a gag into your mouth, which inflates to fill the space! (+RestraintAdded) ¡La estatua te mete una mordaza en la boca, que se infla para llenar el espacio! (+ Restricción agregada) The statue kisses your gag! (DamageTaken) ¡La estatua besa tu mordaza! (Daño Recibido) + + Chaotic Crystal Cristal caótico The crystal shatters! ¡El cristal se rompe! The chaotic crystal leeches energy from you! (DamageTaken) ¡El caótico cristal te extrae energía! (Daño Recibido) + + Grand Chaotic Crystal Gran cristal caótico The grand crystal shatters! @@ -2758,6 +3754,8 @@ The grand crystal leeches energy from you! (DamageTaken) ¡El gran cristal extrae energía de ti! (Daño Recibido) Crystals erupt from the ground and slowly grow around your limbs! (+RestraintAdded) ¡Los cristales brotan del suelo y crecen lentamente alrededor de tus extremidades! (+ Restricción agregada) + + Soul Crystal Cristal del alma The crystal shatters into a puff of soul dust! @@ -2766,20 +3764,26 @@ The soul crystal leeches strength from you! (DamageTaken) ¡El cristal del alma extrae fuerza de ti! (Daño Recibido) Active Soul Crystal Cristal de alma activa -The crystal shatters into a puff of soul dust! -¡El cristal se rompe en una nube de polvo de alma! -The soul crystal leeches strength from you! (DamageTaken) -¡El cristal del alma extrae fuerza de ti! (Daño Recibido) + + Shadow Dragonheart Corazón de dragón sombrío The Shadow Dragonheart frowns and runs away. Shadow Dragonheart frunce el ceño y sale corriendo. The Shadow Dragonheart apprehends you! (+RestraintAdded) ¡Shadow Dragonheart te aprehende! (+ Restricción agregada) +### The Shadow Dragonheart conjures a shadowly lock! (DamageTaken) + The Shadow Dragonheart extends her scythe and pulls you closer!!! ¡Shadow Dragonheart extiende su guadaña y te acerca! The Shadow Dragonheart catches you with her scythe! (DamageTaken) ¡Shadow Dragonheart te atrapa con su guadaña! (Daño Recibido) + + + + + + Dragonheart Leader Líder Corazón de Dragón The Dragonheart Leader admits defeat. @@ -2792,6 +3796,8 @@ The Dragonheart Leader squeezes your body! (DamageTaken) ¡El líder Dragonheart aprieta tu cuerpo! (Daño Recibido) The Dragonheart Leader uses a lock on you! (DamageTaken) ¡El líder de Dragonheart usa un candado para ti! (Daño Recibido) + + Rebel Scum! ¡Escoria rebelde! The Dragonheart Rebel admits defeat. @@ -2802,18 +3808,8 @@ The Dragonheart Rebel apprehends you! (+RestraintAdded) '¡En guardia!' The Dragonheart Rebel squeezes your body! (DamageTaken) ¡El Dragonheart Rebel aprieta tu cuerpo! (Daño Recibido) -The Dragonheart Leader uses a lock on you! (DamageTaken) -¡El líder de Dragonheart usa un candado para ti! (Daño Recibido) -Dryad -Dríada -The dryad sinks into the ground. -La dríada se hunde en el suelo. -The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) -¡La dríada extiende un brazo y te envuelve en vides! (+ Restricción agregada) -The dryad sings a song that mesmerizes you! (DamageTaken) -¡La dríada canta una canción que te hipnotiza! (Daño Recibido) -The dryad tickles you with a leaf! (DamageTaken) -¡La dríada te hace cosquillas con una hoja! (Daño Recibido) + + Dryad Dríada The dryad sinks into the ground. @@ -2824,6 +3820,10 @@ The dryad sings a song that mesmerizes you! (DamageTaken) ¡La dríada canta una canción que te hipnotiza! (Daño Recibido) The dryad tickles you with a leaf! (DamageTaken) ¡La dríada te hace cosquillas con una hoja! (Daño Recibido) + + + + Highly-Motivated Doll Muñeca altamente motivada The doll falls to the ground, moaning loudly. @@ -2832,6 +3832,8 @@ The doll rubs her body against yours. You can feel the conduction. (DamageTaken) La muñeca frota su cuerpo contra el tuyo. Puedes sentir la conducción. (Daño Recibido) The doll tackles you and squeezes you with her trembling legs! (DamageTaken) ¡La muñeca te aborda y te aprieta con sus piernas temblorosas! (Daño Recibido) + + Dollsmith herrero The dollsmith's suit locks her wrists together and renders her helpless. @@ -2844,6 +3846,8 @@ The dollsmith slaps a lock onto your restraints! (DamageTaken) ¡El herrero coloca un candado en tus ataduras! (Daño Recibido) The dollsmith splashes a red latex concoction onto you! (+RestraintAdded) ¡El fabricante de muñecas te salpica un brebaje de látex rojo! (+ Restricción agregada) + + Dollmaker's Apprentice Aprendiz de fabricante de muñecas The dollmaker apprentice's suit becomes rigid and locks her limbs in place. @@ -2856,46 +3860,54 @@ The dollmaker's apprentice slips a lock onto your restraints! (DamageTaken) ¡El aprendiz de fabricante de muñecas pone un candado en tus ataduras! (Daño Recibido) The dollmaker's apprentice unleashes a powerful latex blast! (+RestraintAdded) ¡El aprendiz de fabricante de muñecas desata una poderosa explosión de látex! (+ Restricción agregada) -Alchemist -Alquimista -The alchemist screams and runs. -El alquimista grita y corre. + + + + +### ...Alchemist? + +### You rescue the alchemist. + The Alchemist restrains you! (+RestraintAdded) ¡El Alquimista te frena! (+ Restricción agregada) The alchemist hugs you in a rubbery embrace! (DamageTaken) ¡El alquimista te abraza con un abrazo gomoso! (Daño Recibido) The alchemist uses an ornate-looking lock! (DamageTaken) ¡El alquimista usa un candado de aspecto ornamentado! (Daño Recibido) + + +Alchemist +Alquimista +The alchemist screams and runs. +El alquimista grita y corre. + + Alchemist's Pet Mascota del alquimista The wolfgirl escapes! ¡La chica lobo escapa! The wolfgirl lunges at you with a powerful kick! ¡La chica lobo se abalanza sobre ti con una poderosa patada! -The wolfgirl lunges at you with a powerful kick! -¡La chica lobo se abalanza sobre ti con una poderosa patada! The wolfgirl cuddles with you! (DamageTaken) ¡La chica lobo se acurruca contigo! (Daño Recibido) + + Wolfgirl Niña lobo -The wolfgirl escapes! -¡La chica lobo escapa! -The wolfgirl lunges at you with a powerful kick! -¡La chica lobo se abalanza sobre ti con una poderosa patada! -The wolfgirl lunges at you with a powerful kick! -¡La chica lobo se abalanza sobre ti con una poderosa patada! -The wolfgirl cuddles with you! (DamageTaken) -¡La chica lobo se acurruca contigo! (Daño Recibido) -Wolfguard -Wolfguard + + +### Wolfguard + The wolfguard's suit punishes her for poor performance! ¡El traje de Wolfguard la castiga por su bajo rendimiento! The wolfguard lunges at you and strikes you! ¡La guardia lobo se abalanza sobre ti y te golpea! -The wolfguard's escort drones electrocute you! (DamageTaken) -¡Los drones de escolta de Wolfguard te electrocutan! (Daño Recibido) +### The wolfguard's escort drones shock you! (DamageTaken) + The wolfguard's escort drones deploy some restraints! (+RestraintAdded) ¡Los drones de escolta de Wolfguard despliegan algunas restricciones! (+ Restricción agregada) + + Wolfgirl Trainer Entrenador de niña lobo The trainer retreats! @@ -2906,6 +3918,8 @@ The wolfgirl trainer secures you in training gear! (+RestraintAdded) ¡El entrenador de wolfgirl te asegura el equipo de entrenamiento! (+ Restricción agregada) The wolfgirl trainer pins you and skillfully locks all of your restraints! ¡La entrenadora de la chica lobo te inmoviliza y bloquea hábilmente todas tus ataduras! + + Nevermere Operative Nunca más operativo The operative does a fumbled retreat! @@ -2916,6 +3930,8 @@ The Nevermere Operative apprehends you with training gear! (+RestraintAdded) ¡El agente de Nevermere te detiene con equipo de entrenamiento! (+ Restricción agregada) The Nevermere Operative pins you and skillfully locks all of your restraints! ¡El agente de Nevermere te inmoviliza y bloquea hábilmente todas tus ataduras! + + Trainer's Apprentice Aprendiz de entrenador The trainer's apprentice escapes! @@ -2926,6 +3942,8 @@ The trainer's apprentice secures you in training gear! (+RestraintAdded) ¡El aprendiz de entrenador te asegura el equipo de entrenamiento! (+ Restricción agregada) The trainer's apprentice adds a lock to your restraints. El aprendiz de entrenador agrega un candado a tus ataduras. + + The Executive El Ejecutivo The executive surrenders gracefully. @@ -2936,16 +3954,20 @@ The Executive's drones apprehend you! (+RestraintAdded) ¡Los drones del Ejecutivo te apresan! (+ Restricción agregada) The Executive's drones apply high-security locks to your restraints! ¡Los drones del Ejecutivo aplican candados de alta seguridad a tus ataduras! + + Wolf Instructor Instructor de lobos The instructor deploys active camoflague and retreats! ¡El instructor despliega camuflaje activo y se retira! -The instructor disciplies you! (DamageTaken) +The instructor disciplines you! (DamageTaken) ¡El instructor te discipula! (Daño Recibido) The instructor applies advanced training gear! (+RestraintAdded) ¡El instructor aplica equipo de entrenamiento avanzado! (+ Restricción agregada) The instructor adds a lock to your restraints. El instructor agrega un candado a sus restricciones. + + Nevermere Drone Dron de Nevermere The drone loses power and falls to the ground! @@ -2954,6 +3976,8 @@ A Nevermere Drone takes off! ¡Un dron Nevermere despega! You hear buzzing as several Nevermere Drones take to the air! ¡Oyes un zumbido cuando varios drones de Nevermere despegan! + + Swarm of Tape Drones Enjambre de drones de cinta The tape drones lose control and crash all over the place! @@ -2966,6 +3990,8 @@ The tape drones attach additional sticky layers! (DamageTaken) ¡Los drones de cinta adhieren capas adhesivas adicionales! (Daño Recibido) The tape drones circle around you, wrapping you in tape! (+RestraintAdded) ¡Los drones de cinta giran a tu alrededor, envolviéndote en cinta! (+ Restricción agregada) + + Shield Drone Dron de escudo The drone's power source explodes. @@ -2976,14 +4002,18 @@ Several Shield Drones take flight, their shields interlinking. Varios Shield Drones toman vuelo, sus escudos se entrelazan. Drone Explosion Explosión de drones + + Rusty Drone Dron oxidado The drone's mechanisms grind to a halt. Los mecanismos del dron se detienen. -The drone uses a short-ranged electrocution attack! (DamageTaken) -¡El dron usa un ataque de electrocución de corto alcance! (Daño Recibido) +### The drone uses a short-ranged electric attack! (DamageTaken) + The drone disassembles itself, revealing a set of restraining cables! (+RestraintAdded) ¡El dron se desmonta solo y revela un conjunto de cables de sujeción! (+ Restricción agregada) + + Rusty Auto Taper Cono automático oxidado The auto taper's mechanisms grind to a halt. @@ -2992,28 +4022,18 @@ The auto taper wraps additional layers of sticky tape! (DamageTaken) ¡El cono automático envuelve capas adicionales de cinta adhesiva! (Daño Recibido) The wraps you in many layers of tape! (+RestraintAdded) ¡El te envuelve en muchas capas de cinta adhesiva! (+ Restricción agregada) + + Rubber Blaster Blaster de goma The turret enters an unstable state, about to spread rubber all over! ¡La torreta entra en un estado inestable, a punto de esparcir caucho por todas partes! -The turret defends itself with a close-range electrocution attack! (DamageTaken) -¡La torreta se defiende con un ataque de electrocución a corta distancia! (Daño Recibido) +### The turret defends itself with a close-range electric attack! (DamageTaken) + Rubber Launcher Lanzador de goma -The turret enters an unstable state, about to spread rubber all over! -¡La torreta entra en un estado inestable, a punto de esparcir caucho por todas partes! -The turret defends itself with a close-range electrocution attack! (DamageTaken) -¡La torreta se defiende con un ataque de electrocución a corta distancia! (Daño Recibido) -Drone -Zumbido -The drone fizzles and falls to the ground! -¡El dron chisporrotea y cae al suelo! -The drone zaps you with a restraining energy ray! (DamageTaken) -¡El dron te golpea con un rayo de energía restrictivo! (Daño Recibido) -The drone uses a short-ranged electrocution attack! (DamageTaken) -¡El dron usa un ataque de electrocución de corto alcance! (Daño Recibido) -The drone attaches to you! (+RestraintAdded) -¡El dron se te pega! (+ Restricción agregada) + + Auto Capture Unit Unidad de captura automática The capture unit releases magic smoke and explodes. @@ -3024,6 +4044,8 @@ The capture unit extends its appendages and wraps them around you! (+RestraintAd ¡La unidad de captura extiende sus apéndices y los envuelve a tu alrededor! (+ Restricción agregada) The capture unit releases small drones which lock onto your restraints! (DamageTaken) ¡La unidad de captura libera pequeños drones que se bloquean en tus ataduras! (Daño Recibido) + + Auto Tape Unit Unidad de cinta automática The tape unit releases magic smoke and explodes. @@ -3034,16 +4056,20 @@ The tape unit fires off many layers of sticky tape! (+RestraintAdded) ¡La unidad de cinta dispara muchas capas de cinta adhesiva! (+ Restricción agregada) The tape unit releases small drones which lock onto your restraints! (DamageTaken) ¡La unidad de cinta libera pequeños drones que se bloquean en tus restricciones! (Daño Recibido) + + Force Field Unit Unidad de campo de fuerza The forcefield unit releases magic smoke and explodes. La unidad de campo de fuerza libera humo mágico y explota. -The forcefield electrocutes you! (DamageTaken) -¡El campo de fuerza te electrocuta! (Daño Recibido) +### The forcefield unit zaps you! (DamageTaken) + The forcefield unit extends its appendages and wraps them around you! (+RestraintAdded) ¡La unidad de campo de fuerza extiende sus apéndices y los envuelve a tu alrededor! (+ Restricción agregada) The forcefield unit releases small drones which lock onto your restraints! (DamageTaken) ¡La unidad de campo de fuerza libera pequeños drones que se bloquean en tus ataduras! (Daño Recibido) + + Force Field Projector Proyector de campo de fuerza The forcefield erupts into a shower of blue sparks! @@ -3052,6 +4078,28 @@ The robot deploys a forcefield! ¡El robot despliega un campo de fuerza! The robot deploys a set of forcefields! ¡El robot despliega un conjunto de campos de fuerza! +Drone +Zumbido +The drone fizzles and falls to the ground! +¡El dron chisporrotea y cae al suelo! +The drone zaps you with a restraining energy ray! (DamageTaken) +¡El dron te golpea con un rayo de energía restrictivo! (Daño Recibido) +The drone attaches to you! (+RestraintAdded) +¡El dron se te pega! (+ Restricción agregada) + + +### Cyber Warden + +### The cyber warden's suit goes into lockdown, leaving her wiggling helplessly! + +### The cyber warden applies an advanced locking technology! + +### The cyber warden grabs you and applies a self-tightening restraint! (+RestraintAdded) + +### The cyber warden's touch applies a series of quick electrical shocks! (DamageTaken) + +### The cyber warden's touch applies a series of quick electrical shocks! + Auto Enforcer Unit Unidad de ejecución automática The enforcer unit releases magic smoke and explodes. @@ -3062,6 +4110,8 @@ The enforcer fires off restraints that wrap around your body and apprehend you! ¡El ejecutor dispara las ataduras que envuelven tu cuerpo y te apresan! (+ Restricción agregada) The enforcer releases small drones which lock onto your restraints! (DamageTaken) ¡El ejecutor libera pequeños drones que se bloquean en tus ataduras! (Daño Recibido) + + Artillery Unit Unidad de Artillería The artillery unit releases magic smoke and explodes. @@ -3072,12 +4122,16 @@ The artillery fires off restraints that wrap around your body and apprehend you! ¡La artillería dispara ataduras que envuelven tu cuerpo y te apresan! (+ Restricción agregada) The artillery releases small drones which lock onto your restraints! (DamageTaken) ¡La artillería lanza pequeños drones que bloquean tus ataduras! (Daño Recibido) + + The energy bolt hits you and paralyzes you! ¡El rayo de energía te golpea y te paraliza! Energy Bolt Tienda de energía -Alkahestor -Alkahestor + + +### Alkahestor + The alkahestor resigns to her fate. El alkahestor se resigna a su destino. The alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded) @@ -3086,14 +4140,20 @@ The alkahestor uses an ornate-looking lock! (DamageTaken) ¡El alkahestor usa una cerradura de aspecto ornamentado! (Daño Recibido) The alkahestor shoves you! (DamageTaken) ¡El alkahestor te empuja! (Daño Recibido) -Latex Elemental -Elemental de látex -The latex elemental melts into sticky rubber. -El elemental de látex se derrite en goma pegajosa. -The latex elemental molds itself into restraints! (+RestraintAdded) -¡El elemental de látex se moldea a sí mismo en ataduras! (+ Restricción agregada) -The latex elemental slaps you with its appendages! (DamageTaken) -¡El elemental de látex te abofetea con sus apéndices! (Daño Recibido) +### ...Alkahestor? + +### You rescue the Alkahestor + +### Latex Homonculus + +### The latex homonculus melts into sticky rubber. + +### The latex homonculus molds itself into restraints! (+RestraintAdded) + +### The latex homonculus slaps you with its appendages! (DamageTaken) + + + Rope Elemental Elemental de cuerda The rope elemental gets knotted and falls to the floor, inert. @@ -3102,6 +4162,8 @@ The rope elemental's limbs lash out at you, wrapping themselves around your body ¡Las extremidades del elemental de la cuerda te atacan y se envuelven alrededor de tu cuerpo! (+ Restricción agregada) The rope elemental squeezes you tightly! (DamageTaken) ¡El elemental de la cuerda te aprieta con fuerza! (Daño Recibido) + + Leather Elemental Elemental de cuero The leather elemental sits down and sulks. @@ -3112,6 +4174,8 @@ The leather elemental strikes you with her leather belts! (DamageTaken) ¡La elemental de cuero te golpea con sus cinturones de cuero! (Daño Recibido) The leather elemental clicks a lock onto your restraints! (DamageTaken) ¡El elemental de cuero hace clic en un candado en tus ataduras! (Daño Recibido) + + Slime Enthusiast Entusiasta del limo The slime enthusiast screams and runs. @@ -3122,6 +4186,8 @@ The slime enthusiast hugs you in a rubbery embrace! (DamageTaken) ¡El entusiasta del limo te abraza con un abrazo gomoso! (Daño Recibido) The slime enthusiast looks happy to make sure your restraints are secure! (DamageTaken) ¡El entusiasta del limo se ve feliz de asegurarse de que sus restricciones estén seguras! (Daño Recibido) + + Miner Minero The bandit tosses her pick to the ground and complains about her pay. @@ -3132,16 +4198,18 @@ The miner pins you with the haft of her pickaxe! (DamageTaken) ¡La minera te clava con el mango de su pico! (Daño Recibido) The miner pins you with the haft of her pickaxe and adds a lock! (DamageTaken) ¡La minera te inmoviliza con el mango de su pico y agrega un candado! (Daño Recibido) + + You hear a fuse going off... Oyes que se apaga un fusible... Miner Bomb bomba minera -Bandit -Bandido + + The bandit cries. You should feel bad. El bandido llora. Deberías sentirte mal. -Bandit -Bandido + + The bandit collapses. El bandido se derrumba. The bandit restrains you! (+RestraintAdded) @@ -3150,6 +4218,8 @@ The bandit smiles and applies a lock! (DamageTaken) ¡El bandido sonríe y aplica un candado! (Daño Recibido) The bandit caresses your restrained body! (DamageTaken) ¡El bandido acaricia tu cuerpo contenido! (Daño Recibido) + + Shady Dealer Traficante turbio The dealer flees, leaving her goods behind. @@ -3168,6 +4238,8 @@ Poison Dagger Daga venenosa Lust Bomb bomba de lujuria + + Bandit Guard Guardia de bandidos The bandit guard collapses and calls for help. @@ -3178,6 +4250,8 @@ The bandit rubs and caresses your restrained body! (DamageTaken) ¡El bandido frota y acaricia tu cuerpo contenido! (Daño Recibido) The bandit scoffs and applies a lock! (DamageTaken) ¡El bandido se burla y aplica candado! (Daño Recibido) + + Bandit Chief Jefe de bandidos The bandit scoffs and retreats until next time. @@ -3188,14 +4262,18 @@ The bandit runs her hands all along your restrained body! (DamageTaken) ¡La bandida recorre con sus manos todo tu cuerpo inmovilizado! (Daño Recibido) The bandit chuckles and applies a lock! (DamageTaken) ¡El bandido se ríe y aplica un candado! (Daño Recibido) + + Bandit Pet Mascota Bandida The bandit blushes and runs away. El bandido se sonroja y sale corriendo. The girl nervously restrains you! (+RestraintAdded) ¡La chica te frena nerviosamente! (+ Restricción agregada) -The bandit tickes you nervously! (DamageTaken) +The bandit tickles you nervously! (DamageTaken) ¡El bandido te hace tictac nerviosamente! (Daño Recibido) +### The bandit pet applies a lock! (DamageTaken) + Bandit Hunter Cazador de bandidos The bandit hunter retreats. @@ -3206,6 +4284,8 @@ The bandit hunter caresses your restrained body! (DamageTaken) ¡El cazador de bandidos acaricia tu cuerpo contenido! (Daño Recibido) The bandit hunter calls you an amateur and applies a lock! (DamageTaken) ¡El cazador de bandidos te llama aficionado y aplica un candado! (Daño Recibido) + + Bandit Grappler Luchador bandido The bandit grappler retreats. @@ -3218,14 +4298,20 @@ The bandit giggles and applies a lock! (DamageTaken) ¡El bandido se ríe y aplica un candado! (Daño Recibido) The bandit grappler hooks you closer!!! ¡El luchador bandido te engancha más cerca! + + Mummy Momia The Mummy collapses and her body vanishes. La Momia se derrumba y su cuerpo se desvanece. The Mummy conjures a mystic wrapping! (+RestraintAdded) ¡La Momia evoca un envoltorio místico! (+ Restricción agregada) +### The Mummy conjures a magical lock upon you! (DamageTaken) + The Mummy punishes you with a blow from her staff! (DamageTaken) ¡La Momia te castiga con un golpe de su bastón! (Daño Recibido) + + Cursed One maldito The Cursed One is drawn into an eldritch portal. @@ -3234,6 +4320,8 @@ The Cursed One's bindings transfer to you! (+RestraintAdded) ¡Las ataduras del Maldito se transfieren a ti! (+ Restricción agregada) The Cursed One's bindings emit a strange aura... (DamageTaken) Las ataduras del Maldito emiten un aura extraña... (Daño recibido) + + Floating Wrapping Envoltura flotante The wrapping falls to the floor, its magic spent. @@ -3242,6 +4330,8 @@ The floating wrappings attach to you! (+RestraintAdded) ¡Los envoltorios flotantes se adhieren a ti! (+ Restricción agregada) The wrappings grip you tightly and squeeze you! (DamageTaken) ¡Los envoltorios te agarran con fuerza y ​​te aprietan! (Daño Recibido) + + Animated Sarcophagus Sarcófago animado The sarcophagus falls to the ground and crumbles. @@ -3250,6 +4340,8 @@ The sarcophagus emits long wrappings that pull you closer! (+RestraintAdded) ¡El sarcófago emite largas envolturas que te acercan! (+ Restricción agregada) The sarcophagus emanates a strange power! (DamageTaken) ¡El sarcófago emana un poder extraño! (Daño Recibido) + + Bast Warrior Bastón guerrero The Bast Warrior collapses and meows loudly. @@ -3260,44 +4352,68 @@ The Bast Warrior tickles you with her claws! (DamageTaken) ¡Bast Warrior te hace cosquillas con sus garras! (Daño Recibido) The Bast Warrior pulls out a lock and slips it on! (DamageTaken) ¡El Bast Warrior saca un candado y lo desliza! (Daño Recibido) + + + + +### Bast High Cleric + +### The Bast High Cleric vanishes into a puff of ribbons. + +A ray of light shoots out and paralyzes you! (DamageTaken) +¡Un rayo de luz sale disparado y te paraliza! (Daño Recibido) +### The Bast Cleric conjures wrappings upon you! (+RestraintAdded) + +### The Bast Cleric conjures a lock and slips it onto you! (DamageTaken) + + + Bast Cleric bast clérigo The Bast Cleric collapses and meows softly. Bast Cleric se derrumba y maúlla suavemente. -A ray of light shoots out and paralyzes you! (DamageTaken) -¡Un rayo de luz sale disparado y te paraliza! (Daño Recibido) The Bast Cleric restrains you! (+RestraintAdded) ¡El bast clérigo te frena! (+ Restricción agregada) -A ray of light shoots out and paralyzes you! (DamageTaken) -¡Un rayo de luz sale disparado y te paraliza! (Daño Recibido) The Bast Cleric pulls out a lock and slips it on! (DamageTaken) ¡Bast Cleric saca un candado y lo desliza! (Daño Recibido) -Skeleton -Esqueleto + + +### High Cleric + +### The High Cleric locks herself in ritual bondage as punishment for failure. + +### The High Cleric holds up her staff and you feel intense vibrations throughout your body! (DamageTaken) + +### The High Cleric summons animated restraints to bind you! (+RestraintAdded) + +### A flurry of mummy wrappings encase you and stun you! (DamageTaken) + +### The High Cleric smiles as she conjures many locks on your restraints! (DamageTaken) + The skeleton falls to pieces. El esqueleto se cae a pedazos. -The Skeleton restrains you! (+RestraintAdded) -¡El esqueleto te frena! (+ Restricción agregada) -The Skeleton tackles you! (DamageTaken) -¡El Esqueleto te ataca! (Daño Recibido) + + Ghost Fantasma The ghost vanishes. El fantasma se desvanece. The Ghost restrains you! (+RestraintAdded) ¡El Fantasma te frena! (+ Restricción agregada) -The Ghost tickles you! (DamageTaken) -¡El Fantasma te hace cosquillas! (Daño Recibido) +### The Ghost enters your clothing and vanishes! + Revenant Renacido The revenant pouts as it vanishes. El aparecido hace un puchero mientras desaparece. The revenant restrains you! (+RestraintAdded) ¡El aparecido te frena! (+ Restricción agregada) -The revenant squeezes your breasts! (DamageTaken) -¡El aparecido te aprieta los pechos! (Daño Recibido) +### The revenant squeezes your breasts and slows you! (DamageTaken) + The revenant grabs you and caresses your tummy! (DamageTaken) ¡El aparecido te agarra y acaricia tu barriga! (Daño Recibido) + + Skeleton Warrior Guerrero esqueleto The skeleton warrior collapses and falls into pieces. @@ -3306,6 +4422,8 @@ The Skeleton lands a wide, crippling blow! (DamageTaken) ¡El Esqueleto da un golpe amplio y paralizante! (Daño Recibido) The Skeleton leashes you! ¡El Esqueleto te ata! + + Skeleton Knight Caballero esqueleto The skeleton knight collapses and falls into pieces. @@ -3314,6 +4432,8 @@ The skeleton apprehends you and pins you with the haft of its axe! (DamageTaken) ¡El esqueleto os apresa y os clava con el mango de su hacha! (Daño Recibido) The skeleton grabs you and slips a black cuff on! (+RestraintAdded) ¡El esqueleto te agarra y te pone un brazalete negro! (+ Restricción agregada) + + Vine Plant viene la planta The plant leaks purple juices everywhere as it wilts. @@ -3324,12 +4444,26 @@ The vine plant wraps its tendrils around you! (+RestraintAdded) ¡La planta de la vid te envuelve con sus zarcillos! (+ Restricción agregada) The vine plant grips you tightly! (DamageTaken) ¡La planta de vid te agarra con fuerza! (Daño Recibido) + + +### Vine Spitter + +### The vine spitter leaks purple juices everywhere as it wilts. + +### The vine spitter slaps you with its tendrils! (DamageTaken) + +### The vine spitter wraps its tendrils around you! (+RestraintAdded) + +### The vine spitter grips you tightly! (DamageTaken) + Bramble Zarza The brambles are hacked away. Las zarzas están cortadas. The bramble snares you! (DamageTaken) ¡La zarza te atrapa! (Daño Recibido) + + The red liquid bubbles and several round slimes pop out! ¡Las burbujas de líquido rojo y varios limos redondos salen! The red liquid bubbles and a round slime pops out! @@ -3338,14 +4472,14 @@ A revenant appears! ¡Aparece un aparecido! Fuuka uses a talisman to call forth the spirits of her pets! ¡Fuuka usa un talismán para llamar a los espíritus de sus mascotas! + + A pool of latex bubbles and a twisted elemental appears! ¡Aparece un charco de burbujas de látex y un elemental retorcido! -Red Slime -limo rojo -Latex Elemental -Elemental de látex -Latex Elemental -Elemental de látex + + +### Latex Homunculus + Red Slime limo rojo The red slime bounces away. @@ -3354,6 +4488,8 @@ The red slime bounces off you! (DamageTaken) ¡La baba roja rebota en ti! (Daño Recibido) The slime shoves itself into your mouth! (+RestraintAdded) ¡La baba se mete en tu boca! (+ Restricción agregada) + + Slime Mold Moho de fango The slime mold explodes into small puffs. @@ -3362,6 +4498,8 @@ The slime mold is sticky and gross! (DamageTaken) ¡El moho del limo es pegajoso y asqueroso! (Daño Recibido) The slime mold attaches itself to your body! (+RestraintAdded) ¡El moho de baba se adhiere a tu cuerpo! (+ Restricción agregada) + + Mold Puff Hojaldre de molde The mold puff explodes into small puffs. @@ -3372,18 +4510,28 @@ The mold puff leaps through the air! ¡La bocanada de moho salta por los aires! The mold puff attaches itself to your body! (+RestraintAdded) ¡La bocanada de molde se adhiere a tu cuerpo! (+ Restricción agregada) + + Slime Mold Nest Nido de moho de limo The slime mold nest erupts into a shower of black particles! ¡El nido de moho limo estalla en una lluvia de partículas negras! + + Many small pieces of slime mold break off! ¡Se desprenden muchos pedazos pequeños de moho mucilaginoso! A mobile cyst emerges from the slime mold nest! ¡Un quiste móvil emerge del nido de moho mucilaginoso! + + Factory Doll muñeca de fábrica The doll is subdued. La muñeca está sometida. +### Freed Doll + +### The doll returns to her place. + Encased Adventurer Aventurero encerrado The encased adventurer loses hope. @@ -3392,8 +4540,8 @@ The encased adventurer moans as she throws herself against you for help! (Damage ¡La aventurera encerrada gime mientras se lanza contra ti en busca de ayuda! (Daño Recibido) The encased adventurer sticks to you as she mumbles incoherently! (DamageTaken) ¡La aventurera encerrada se pega a ti mientras murmura incoherencias! (Daño Recibido) -The encased adventurer (+RestraintAdded) -El aventurero encerrado (+ Restricción Agregada) +### The encased adventurer pleads for help as her slime spreads to you! (+RestraintAdded) + Slime Limo The slime melts into a puddle. @@ -3402,54 +4550,60 @@ The sticky slime splashes against you! (DamageTaken) ¡La baba pegajosa salpica contra ti! (Daño Recibido) The slime attaches itself to your body! (+RestraintAdded) ¡El limo se adhiere a tu cuerpo! (+ Restricción agregada) + + Bouncy Slime Baba hinchable -The slime melts into a puddle. -El limo se derrite en un charco. The bouncy slime splashes against you! (DamageTaken) ¡La baba hinchable salpica contra ti! (Daño Recibido) The bouncy slime leaps to you! ¡La baba hinchable salta hacia ti! The bouncy slime attaches itself to your body! (+RestraintAdded) ¡La baba hinchable se adhiere a tu cuerpo! (+ Restricción agregada) + + Fast Slime Limo rápido -The slime melts into a puddle. -El limo se derrite en un charco. The sticky slime leaps and splashes against you! (DamageTaken) ¡La baba pegajosa salta y salpica contra ti! (Daño Recibido) The slime leaps and attaches itself to your body! (+RestraintAdded) ¡El limo salta y se adhiere a tu cuerpo! (+ Restricción agregada) + + Large Slime Baba grande The large slime splits apart! ¡La gran baba se parte! -The sticky slime splashes against you! (DamageTaken) -¡La baba pegajosa salpica contra ti! (Daño Recibido) The slime spreads to your body! (+RestraintAdded) ¡La baba se esparce por tu cuerpo! (+ Restricción agregada) + + The slime splits into many smaller droplets! ¡El limo se divide en muchas gotas más pequeñas! -Skeleton -Esqueleto + + The Skeleton falls into pieces. El esqueleto se cae en pedazos. -The Skeleton restrains you! (+RestraintAdded) -¡El esqueleto te frena! (+ Restricción agregada) The Skeleton latches onto you! ¡El Esqueleto se aferra a ti! + + Rope Tentacle Tentáculo de cuerda The rope kraken retreats its tentacle. El kraken de cuerda retira su tentáculo. The rope kraken squeezes you with one of its tentacles! (DamageTaken) ¡El kraken de la cuerda te aprieta con uno de sus tentáculos! (Daño Recibido) + + Rope Kraken Agrietamiento de la cuerda The rope kraken devolves into a bundle of premium bondage rope. El kraken de la cuerda se convierte en un paquete de cuerda de bondage de primera calidad. The rope kraken tightly cinches itself around your body! (DamageTaken) ¡La cuerda kraken se ciñe firmemente alrededor de tu cuerpo! (Daño Recibido) + + Magic Rope Cuerda Mágica The magic rope returns to being a normal rope. @@ -3458,20 +4612,24 @@ The magic rope wraps itself tightly around your body! (+RestraintAdded) ¡La cuerda mágica se envuelve firmemente alrededor de tu cuerpo! (+ Restricción agregada) The magic rope wriggles into your outfit! (DamageTaken) ¡La cuerda mágica se mete en tu atuendo! (Daño Recibido) + + Cloud of Feathers Nube de plumas The feathers fall to the floor. Las plumas caen al suelo. The feathers tickle you mercilessly! (DamageTaken) ¡Las plumas te hacen cosquillas sin piedad! (Daño Recibido) + + Cloud of Scarves Nube de bufandas The scarves become knotted and fall to the floor. Las bufandas se anudan y caen al suelo. The scarves wrap themselves around you! (+RestraintAdded) ¡Las bufandas te envuelven solas! (+ Restricción agregada) -The scarves rub against your body, tickling you! (DamageTaken) -¡Las bufandas se frotan contra tu cuerpo, haciéndote cosquillas! (Daño Recibido) +### The scarves rub against your body, wrapping you in fluffy fabric! (DamageTaken) + Cloud of Ribbons Nube de cintas The ribbons knot themselves in a bow and fall to the floor. @@ -3480,16 +4638,20 @@ The ribbons wrap themselves around you! (+RestraintAdded) ¡Las cintas te envuelven solas! (+ Restricción agregada) The ribbons wrap themselves around you! (DamageTaken) ¡Las cintas te envuelven solas! (Daño Recibido) + + Gravitating Gag mordaza gravitante The gag buckles itself in place and falls. La mordaza se abrocha sola en su lugar y cae. The gravitating gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) ¡La mordaza gravitatoria se encaja firmemente en tu boca y se abrocha sola! (+ Restricción agregada) -The gravitating gag rubs itself against your gagged lips! (DamageTaken) -¡La mordaza gravitante se frota contra tus labios amordazados! (Daño Recibido) +### The gravitating gag rubs itself against your lips! (DamageTaken) + The gag dashes to you! ¡La mordaza se precipita hacia ti! + + Seductive Shackles Grilletes seductores The shackles' chain breaks as they fall to the floor. @@ -3500,6 +4662,8 @@ The shackles click seductively in your face... (DamageTaken) Los grilletes hacen clic seductoramente en tu cara... (Daño recibido) The shackles dash to you! ¡Los grilletes se lanzan hacia ti! + + Lurid Legbinder Vendapiernas espeluznante The legbinder unravels. @@ -3508,6 +4672,8 @@ The legbinder zips itself around your legs and squeezes them together! (+Restrai ¡El legbinder se cierra alrededor de tus piernas y las aprieta juntas! (+ Restricción agregada) The legbinder wraps around and squeezes your body! (DamageTaken) ¡El vendaje envuelve y aprieta tu cuerpo! (Daño Recibido) + + Bratty Blindfold venda de los ojos malcriado The blindfold floats to the floor. @@ -3518,6 +4684,8 @@ The blindfold crawls over your helpless face! (DamageTaken) ¡La venda se arrastra sobre tu rostro indefenso! (Daño Recibido) The blindfold dashes to you! ¡La venda corre hacia ti! + + Amorous Armbinder Brazalete amoroso The armbinder flops to the floor. @@ -3526,6 +4694,8 @@ The armbinder slips itself around your arms and pushes your elbows together! (+R ¡El brazalete se desliza alrededor de tus brazos y junta tus codos! (+ Restricción agregada) The armbinder rubs itself all over your body! (DamageTaken) ¡El brazalete se frota por todo tu cuerpo! (Daño Recibido) + + Stringent Straitjacket Camisa de fuerza estricta The straitjacket falls apart. @@ -3534,6 +4704,8 @@ The straitjacket slips itself on over your head and pulls your arms close to you ¡La camisa de fuerza se desliza sobre tu cabeza y tira de tus brazos cerca de tu cuerpo! (+ Restricción agregada) The straitjacket squeezes you tightly! (DamageTaken) ¡La camisa de fuerza te aprieta fuerte! (Daño Recibido) + + Brusque Belt Cinturón brusco The chastity belt falls to the floor with a clang. @@ -3542,6 +4714,8 @@ The chastity belt secures itself around your waist! (+RestraintAdded) ¡El cinturón de castidad se asegura alrededor de tu cintura! (+ Restricción agregada) The chastity belt buzzes against your body alluringly! (DamageTaken) ¡El cinturón de castidad zumba contra tu cuerpo de forma seductora! (Daño Recibido) + + Yammering Yoke Yugo parlanchín The yoke falls to the floor with a loud clang. @@ -3550,6 +4724,8 @@ The yoke clasps your arms tightly and forces them to the sides! (+RestraintAdded ¡El yugo aprieta fuertemente tus brazos y los empuja a los lados! (+ Restricción agregada) The yoke makes alluring clicking noises! (DamageTaken) ¡El yugo hace ruidos de clic atractivos! (Daño Recibido) + + Haughty Harness Arnés altivo The harness unravels. @@ -3560,6 +4736,8 @@ The harness dashes to you! ¡El arnés corre hacia ti! The harness wraps itself around your body and squeezes! (DamageTaken) ¡El arnés se envuelve alrededor de tu cuerpo y aprieta! (Daño Recibido) + + Levitating Locks Cerraduras que levitan The locks and chains fall to the floor in a loud crash. @@ -3572,6 +4750,16 @@ The lock dashes to you! ¡La cerradura corre hacia ti! The floating locks and chains rub themselves across your body! (DamageTaken) ¡Los candados y las cadenas flotantes se frotan contra tu cuerpo! (Daño Recibido) + + +### Masterful Lock + +### The lock falls to the floor, disenchanted. + +### The Masterful Lock clicks seductively in your face! (DamageTaken) + +### The Masterful Lock conjures a lock onto one of your restraints! (DamageTaken) + Conjured Gag Mordaza conjurada The conjured gag buckles itself in place and falls. @@ -3580,6 +4768,8 @@ The gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) ¡La mordaza se encaja firmemente en tu boca y se abrocha sola! (+ Restricción agregada) The gag rubs itself against you! (DamageTaken) ¡La mordaza se frota contra ti! (Daño Recibido) + + Learned Rope cuerda aprendida The learned rope untangles into a mess of rope. @@ -3588,8 +4778,8 @@ The magic rope wraps itself intricately around your body! (+RestraintAdded) ¡La cuerda mágica se envuelve intrincadamente alrededor de tu cuerpo! (+ Restricción agregada) The rope dashes to you! ¡La cuerda corre hacia ti! -The magic rope wriggles into your outfit! (DamageTaken) -¡La cuerda mágica se mete en tu atuendo! (Daño Recibido) + + Unforseen Rope Cuerda imprevista The unforseen rope is gone... or is it? @@ -3598,92 +4788,84 @@ The unforseen rope wraps itself clandestinely around your body! (+RestraintAdded ¡La cuerda imprevista se envuelve clandestinamente alrededor de tu cuerpo! (+ Restricción agregada) The unforseen rope wriggles into your outfit! (DamageTaken) ¡La cuerda imprevista se mete en tu atuendo! (Daño Recibido) + + Monster Rope Cuerda de monstruo The monster rope bundle collapses into a pile of ropes. El paquete de cuerdas monstruo se derrumba en una pila de cuerdas. The magic rope wraps itself overwhelmingly around your body! (+RestraintAdded) ¡La cuerda mágica se envuelve abrumadoramente alrededor de tu cuerpo! (+ Restricción agregada) -The magic rope wriggles into your outfit! (DamageTaken) -¡La cuerda mágica se mete en tu atuendo! (Daño Recibido) + + Shock Witch Bruja de choque The shock witch vanishes into a cloud of thunder, leaving behind a keyring. La bruja del shock se desvanece en una nube de truenos, dejando atrás un llavero. -The witch restraints you! (+RestraintAdded) -¡La bruja te frena! (+ Restricción agregada) +### The witch restrains you! (+RestraintAdded) + The witch dangles a lock in front of you before putting it on! (DamageTaken) ¡La bruja cuelga un candado frente a ti antes de ponértelo! (Daño Recibido) The witch slaps you playfully! (DamageTaken) ¡La bruja te abofetea juguetonamente! (Daño Recibido) + + Flame Witch bruja llama The flame witch vanishes into a pile of ash. La bruja de la llama se desvanece en un montón de cenizas. -The witch restraints you! (+RestraintAdded) -¡La bruja te frena! (+ Restricción agregada) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -¡La bruja cuelga un candado frente a ti antes de ponértelo! (Daño Recibido) -The witch slaps you playfully! (DamageTaken) -¡La bruja te abofetea juguetonamente! (Daño Recibido) + + Earth Witch bruja de la tierra The earth witch vanishes into a pile of ash. La bruja de la tierra se desvanece en un montón de cenizas. -The witch restraints you! (+RestraintAdded) -¡La bruja te frena! (+ Restricción agregada) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -¡La bruja cuelga un candado frente a ti antes de ponértelo! (Daño Recibido) -The witch slaps you playfully! (DamageTaken) -¡La bruja te abofetea juguetonamente! (Daño Recibido) + + Water Witch Bruja del agua The water witch vanishes into a pile of ash. La bruja del agua se desvanece en un montón de cenizas. -The witch restraints you! (+RestraintAdded) -¡La bruja te frena! (+ Restricción agregada) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -¡La bruja cuelga un candado frente a ti antes de ponértelo! (Daño Recibido) -The witch slaps you playfully! (DamageTaken) -¡La bruja te abofetea juguetonamente! (Daño Recibido) + + +### Aqua Witch + +### The aqua witch vanishes into a pile of ash. + Ice Witch Bruja de hielo The ice witch vanishes into a pile of ash. La bruja de hielo se desvanece en un montón de cenizas. -The witch restraints you! (+RestraintAdded) -¡La bruja te frena! (+ Restricción agregada) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -¡La bruja cuelga un candado frente a ti antes de ponértelo! (Daño Recibido) -The witch slaps you playfully! (DamageTaken) -¡La bruja te abofetea juguetonamente! (Daño Recibido) + + + + Magic Stone Piedra magica Ice Bolt Rayo de hielo Waterblast Chorro de agua + + Rope Witch Bruja de la cuerda The rope witch retreats as her animated ropes chase her. La bruja de las cuerdas se retira mientras sus cuerdas animadas la persiguen. -The witch restraints you! (+RestraintAdded) -¡La bruja te frena! (+ Restricción agregada) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -¡La bruja cuelga un candado frente a ti antes de ponértelo! (Daño Recibido) -The witch slaps you playfully! (DamageTaken) -¡La bruja te abofetea juguetonamente! (Daño Recibido) + + Magnet Witch Bruja Imán The witch is pulled away by an unseen force. La bruja es apartada por una fuerza invisible. The witch's restraints fly out and attach themselves to you! (+RestraintAdded) ¡Las ataduras de la bruja vuelan y se adhieren a ti! (+ Restricción agregada) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -¡La bruja cuelga un candado frente a ti antes de ponértelo! (Daño Recibido) The witch's lightning causes your body to tingle! (DamageTaken) ¡El relámpago de la bruja hace que tu cuerpo se estremezca! (Daño Recibido) -Witch's Apprentice -Aprendiz de bruja + + +### Mage's Apprentice + The apprentice runs off and cries in a corner. El aprendiz sale corriendo y llora en un rincón. The apprentice animates restraints to wrap around you! (+RestraintAdded) @@ -3692,26 +4874,34 @@ The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) ¡El aprendiz saca nerviosamente un candado y te obliga a usarlo! (Daño Recibido) The apprentice slaps you playfully! (DamageTaken) ¡El aprendiz te abofetea en broma! (Daño Recibido) + + Summoner's Apprentice Aprendiz de invocador -The apprentice runs off and cries in a corner. -El aprendiz sale corriendo y llora en un rincón. The apprentice summons a restraint onto you! (+RestraintAdded) ¡El aprendiz invoca una restricción sobre ti! (+ Restricción agregada) -The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) -¡El aprendiz saca nerviosamente un candado y te obliga a usarlo! (Daño Recibido) The apprentice tickles you playfully! (DamageTaken) ¡El aprendiz te hace cosquillas juguetonamente! (Daño Recibido) + + +Witch's Apprentice +Aprendiz de bruja +### The witch's apprentice confidently admits defeat. + +### The witch's apprentice conjures magic bindings on you! (+RestraintAdded) + +### The witch's apprentice smiles and summons a lock onto you! (DamageTaken) + +### The witch's apprentice smiles as she squeezes your chest! (DamageTaken) + Latex Apprentice aprendiz de látex -The apprentice runs off and cries in a corner. -El aprendiz sale corriendo y llora en un rincón. The apprentice attaches a sticky restraint! (+RestraintAdded) ¡El aprendiz coloca una restricción adhesiva! (+ Restricción agregada) -The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) -¡El aprendiz saca nerviosamente un candado y te obliga a usarlo! (Daño Recibido) The apprentice caresses you playfully! (DamageTaken) ¡El aprendiz te acaricia juguetonamente! (Daño Recibido) + + Chain Witch Bruja de la cadena The chain witch vanishes into a pile of metal dust, leaving behind a keyring. @@ -3722,6 +4912,8 @@ The witch's bindings wrap themselves around you! (+RestraintAdded) ¡Las ataduras de la bruja te envuelven! (+ Restricción agregada) The chain witch tugs sensually at your restraints! (DamageTaken) ¡La bruja de la cadena tira sensualmente de tus ataduras! (Daño Recibido) + + Metal Witch Bruja Metálica The metal witch vanishes into a pile of metal dust, leaving behind a keyring. @@ -3732,6 +4924,8 @@ The metal's bindings wrap themselves around you! (+RestraintAdded) ¡Las ataduras de metal te envuelven! (+ Restricción agregada) The metal witch tugs sensually at your restraints! (DamageTaken) ¡La bruja de metal tira sensualmente de tus ataduras! (Daño Recibido) + + Slime Witch Bruja del limo The slime witch vanishes into a pool of pink slime, leaving behind a keyring. @@ -3742,6 +4936,8 @@ The witch creates a magical lock made of hardened latex! (DamageTaken) ¡La bruja crea un candado mágico hecho de látex endurecido! (Daño Recibido) The witch squeezes your body playfully! (DamageTaken) ¡La bruja aprieta tu cuerpo juguetonamente! (Daño Recibido) + + 'High' Wizard Mago 'alto' The wizard falls asleep. @@ -3752,6 +4948,8 @@ The wizard clips a lock to your restraints! (DamageTaken) ¡El mago engancha un candado a tus ataduras! (Daño Recibido) The wizard laughs maniacally as she tickles you! (DamageTaken) ¡El mago se ríe como un maníaco mientras te hace cosquillas! (Daño Recibido) + + FunGal fungal The fun-gal retreats into the ground. @@ -3762,32 +4960,52 @@ The fun-gal produces a magical lock on all your restraints! (DamageTaken) ¡La fun-gal produce un candado mágico en todas tus ataduras! (Daño Recibido) The fun-gal rubs your chest with her long, slender fingers! (DamageTaken) ¡La fun-gal frota tu pecho con sus dedos largos y delgados! (Daño Recibido) -Crystal Glyph -Glifo de cristal +### Crystal Slash + +### Crystal Bolt + + + Tailor Sastre -You murder the tailor! -¡Asesinas al sastre! +### You rob the tailor! + Student Alumno -You murder the student! -¡Asesinas al estudiante! +### You rob the student! + Tactician Táctico -You murder the tactician! -¡Asesinas al estratega! +### You rob the tactician! + Informant Informante -You murder the informant! -¡Asesinas al informante! +### You rob the informant! + Thug Matón -You murder the thug! -¡Tú asesinas al matón! +### You rob the thug! + +### Antique Merchant + +### You smash the antique merchant! + Blacksmith Herrero -You murder the blacksmith! -¡Asesinas al herrero! +### You rob the blacksmith! + +### Armorer + +### You rob the armorer! + +### Bowyer + +### You rob the bowyer! + +### Not a Kidnapper + +### You bring the kidnapper to justice! + Dressmaker Modista The dressmaker storms out in a rage. @@ -3798,6 +5016,8 @@ The dressmaker adds a lock 'just to complete the look, you know?' La modista agrega un mechón 'solo para completar el look, ¿sabes?' The dressmaker cuddles your helpless body~ (DamageTaken) La modista abraza tu cuerpo indefenso~ (DamageTaken) + + Nurse Enfermero The Nurse checks her notes and runs off. @@ -3808,6 +5028,8 @@ The Nurse adds a lock to keep you from hurting the staff. La enfermera agrega un candado para evitar que lastimes al personal. The Nurse assures you it's going to be alright~ (DamageTaken) La enfermera te asegura que todo va a estar bien ~ (DamageTaken) + + Librarian bibliotecario The librarian gets angry and retreats. @@ -3818,6 +5040,8 @@ The librarian snaps her fingers and sends a lock flying at you! ¡La bibliotecaria chasquea los dedos y te lanza un candado! The librarian whispers seductively into your ear! (DamageTaken) ¡El bibliotecario susurra seductoramente en tu oído! (Daño Recibido) + + Stone Door puerta de piedra The stone door crumbles! @@ -3830,28 +5054,32 @@ Control Room Door Puerta de la sala de control The door flies open as the Dollmaker chuckles at you! ¡La puerta se abre cuando el fabricante de muñecas se ríe de ti! + + Giant Mushroom Hongo Gigante The giant mushroom explodes into a cloud of spores!!! ¡El hongo gigante explota en una nube de esporas! -Animated Mushroom -Hongo animado -The animated mushroom explodes into a cloud of spores!!! -¡El hongo animado explota en una nube de esporas! -The animated mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) -¡El hongo animado escupe esporas en tu cara y te ata mientras estás distraído! (+ Restricción agregada) -The animated mushroom spits spores into your face and tries to tie you! -¡El hongo animado escupe esporas en tu cara e intenta atarte! -The animated mushroom emits soporific spores! (DamageTaken) -¡El hongo animado emite esporas soporíferas! (Daño Recibido) -Happy Mushroom -Hongo feliz -The happy mushroom explodes into a cloud of spores!!! -¡El hongo feliz explota en una nube de esporas! -The happy mushroom tickles you silly! -¡El hongo feliz te hace cosquillas! -The happy mushroom tickles you silly! (DamageTaken) -¡El hongo feliz te hace cosquillas! (Daño Recibido) + + +### Army Mushroom + +### The army mushroom explodes into a cloud of spores!!! + +### The army mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) + +### The army mushroom spits spores into your face and tries to tie you! + +### The army mushroom emits soporific spores! (DamageTaken) + +### Delicious Mushroom + +### The delicious mushroom explodes into a cloud of spores!!! + +### The delicious mushroom tickles you silly! + +### The delicious mushroom tickles you silly! (DamageTaken) + Infected Mushroom Hongo infectado The infected mushroom explodes into a cloud of spores!!! @@ -3860,6 +5088,8 @@ The infected mushroom gives you a crushing hug! ¡El hongo infectado te da un abrazo aplastante! The infected mushroom gives you a crushing hug! (DamageTaken) ¡El hongo infectado te da un abrazo aplastante! (Daño Recibido) + + Jailer Carcelero The jailer passes out and drops her possessions! @@ -3870,38 +5100,40 @@ The jailer places some restraints on you! (+RestraintAdded) ¡El carcelero te pone restricciones! (+ Restricción agregada) The jailer plays with you, groping and rubbing your body! ¡El carcelero juega contigo, acariciando y frotando tu cuerpo! + + The guard checks your restraints to make sure they are secure. El guardia revisa sus restricciones para asegurarse de que estén seguras. + + Guard Guardia The guard passes out and drops her possessions! ¡El guardia se desmaya y deja caer sus pertenencias! The guard locks your restraints! ¡El guardia bloquea tus ataduras! -The jailer places some restraints on you! (+RestraintAdded) -¡El carcelero te pone restricciones! (+ Restricción agregada) The guard places a NewRestraintName on you El guardia te coloca un NewRestraintName The guard plays with you, groping and rubbing your body! ¡El guardia juega contigo, manoseando y frotando tu cuerpo! + + Armed Guard Guardia armado The armed guard retreats, but drops a keyring! ¡El guardia armado se retira, pero deja caer un llavero! -The guard locks your restraints! -¡El guardia bloquea tus ataduras! The guard shocks you and slaps on some restraints! (+RestraintAdded) ¡El guardia te sorprende y te pone algunas restricciones! (+ Restricción agregada) -The guard electrocutes you with her taser!!! -¡¡¡La guardia te electrocuta con su taser!!! -The guard electrocutes you with her taser!!! -¡¡¡La guardia te electrocuta con su taser!!! -The EnemyName replaces your OldRestraintName with a NewRestraintName -El EnemyName reemplaza su OldRestraintName con un NewRestraintName +### The guard shocks you with her taser!!! + +### The EnemyName applies a NewRestraintName over your OldRestraintName + The EnemyName removes your OldRestraintName El EnemyName elimina su OldRestraintName The EnemyName restrains you with a NewRestraintName El EnemyName te restringe con un NewRestraintName + + Master Conjurer Maestro prestidigitador The conjurer retreats into a portal! @@ -3912,16 +5144,8 @@ The master conjurer summons a restraint directly onto you! ¡El maestro prestidigitador invoca una restricción directamente sobre ti! The master conjurer tickles you playfully! ¡El maestro prestidigitador te hace cosquillas juguetonamente! -Master Conjurer -Maestro prestidigitador -The conjurer retreats into a portal! -¡El prestidigitador se retira a un portal! -The master conjurer waves a hand, and locks appear on all your restraints! -¡El maestro prestidigitador agita una mano y aparecen candados en todas tus ataduras! -The master conjurer summons a restraint directly onto you! -¡El maestro prestidigitador invoca una restricción directamente sobre ti! -The master conjurer tickles you playfully! -¡El maestro prestidigitador te hace cosquillas juguetonamente! + + Frog Rana The frog jumps away! @@ -3930,6 +5154,8 @@ The frog pulls you with its tongue!!! La rana te jala con su lengua!!! The frog licks you! ¡La rana te lame! + + Toad Sapo The toad jumps away! @@ -3938,6 +5164,8 @@ The toad pulls you with its tongue!!! El sapo te jala con su lengua!!! The toad licks you! ¡El sapo te lame! + + Shadow Hand Mano sombría The shadow hand retreats into the darkness... @@ -3950,14 +5178,20 @@ A dark hand stretches out beyond the shadows... Una mano oscura se extiende más allá de las sombras... Several dark hands emerge from the shadows! ¡Varias manos oscuras emergen de las sombras! + + Corrupted Adventurer Aventurero corrupto The corrupted adventurer falls into a deep sleep. El aventurero corrupto cae en un sueño profundo. The corrupted aventurer's many arms latch onto you! (+RestraintAdded) ¡Los muchos brazos del aventurero corrupto se aferran a ti! (+ Restricción agregada) +### The corrupted aventurer clicks a lock on from behind you! (DamageTaken) + The corrupted adventurer drags her chilling fingers across your vulnerable skin! (DamageTaken) ¡La aventurera corrupta arrastra sus dedos helados por tu piel vulnerable! (Daño Recibido) + + Shadowy Ghast Fantasma sombrío The shadowy ghast screeches and disappears... @@ -3966,16 +5200,18 @@ The shadowy ghast latches onto you with its long arms! (+RestraintAdded) ¡El ghast sombrío se aferra a ti con sus largos brazos! (+ Restricción agregada) The shadowy ghast grips you in its chilling embrace! (DamageTaken) ¡El fantasma sombrío te atrapa en su escalofriante abrazo! (Daño Recibido) -Obsidian Construct -Construcción de obsidiana -The obsidian construct stops moving, its spirit departed. -La construcción de obsidiana deja de moverse, su espíritu se va. -The obsidian construct reaches out and touches you, forming metallic restraints! (+RestraintAdded) -¡La construcción de obsidiana se extiende y te toca, formando restricciones metálicas! (+ Restricción agregada) -The obsidian construct uses its chains to lock your restraints! (DamageTaken) -¡La construcción de obsidiana usa sus cadenas para bloquear tus ataduras! (Daño Recibido) -The obsidian construct grips you and drains your willpower! (DamageTaken) -¡La construcción de obsidiana te atrapa y agota tu fuerza de voluntad! (Daño Recibido) + + +### Corrupted Elemental + +### The corrupted elemental dissolves into shadows. + +### The corrupted elemental reaches out and touches you, forming metallic restraints! (+RestraintAdded) + +### The corrupted elemental uses its chains to lock your restraints! (DamageTaken) + +### The corrupted elemental grips you and drains your willpower! (DamageTaken) + Star Demon Demonio estrella The star demon is exorcised. @@ -3994,6 +5230,8 @@ Stepping outside of the indicated tiles will result in punishment! ¡Salir de las casillas indicadas resultará en un castigo! Bindings of Fate Ataduras del destino + + Moon Demon Demonio lunar The moon demon is exorcised. @@ -4004,36 +5242,46 @@ The moon demon places you under its curse! (DamageTaken) ¡El demonio lunar te pone bajo su maldición! (Daño Recibido) The weight of inescapable bondage falls upon you! (DamageTaken) ¡El peso de la esclavitud ineludible cae sobre ti! (Daño Recibido) -The demon giggles as it locks your restraints! (DamageTaken) -¡El demonio se ríe mientras bloquea tus ataduras! (Daño Recibido) Crushing Fate Destino aplastante + + Void Demon Demonio vacío The void demon is exorcised. El demonio del vacío es exorcizado. The void demon places you in dark, glassy restraints. (+RestraintAdded) El demonio del vacío te coloca en ataduras oscuras y vidriosas. (+ Restricción agregada) -The demon giggles as it locks your restraints! (DamageTaken) -¡El demonio se ríe mientras bloquea tus ataduras! (Daño Recibido) The void demon places you under its curse! (DamageTaken) ¡El demonio del vacío te pone bajo su maldición! (Daño Recibido) +### You are sucked in by a powerful gravitational force!!! (DamageTaken) + +### You are sucked in by a powerful gravitational force!!! + +### The demon cracks its knuckles as it locks your restraints! (DamageTaken) + +### Cosmic Force + + + Demon Demonio The demon is exorcised. El demonio es exorcizado. The demon places you in dark, glassy restraints. (+RestraintAdded) El demonio te coloca en ataduras oscuras y vidriosas. (+ Restricción agregada) -The demon giggles as it locks your restraints! (DamageTaken) -¡El demonio se ríe mientras bloquea tus ataduras! (Daño Recibido) -The demon whacks you with its mace! (DamageTaken) -¡El demonio te golpea con su maza! (Daño Recibido) +### The demon caresses you gently with her sharp nails! (DamageTaken) + +### The demon stuns you with her heavy mace! (+STUN) + Tickle Hand cosquillas en la mano The hand vanishes! ¡La mano desaparece! The hand tickles you! (DamageTaken) ¡La mano te hace cosquillas! (Daño Recibido) + + Tickle Terror Terror de cosquillas The tickle terror vanishes... for now @@ -4042,68 +5290,62 @@ The monstrous spirit tickles you mercilessly!!! (DamageTaken) ¡¡¡El espíritu monstruoso te hace cosquillas sin piedad!!! (Daño Recibido) The monstrous spirit binds you to make you more vulnerable! (+RestraintAdded) ¡El espíritu monstruoso te ata para hacerte más vulnerable! (+ Restricción agregada) + + Hug Horror Abrazo de terror The hug horror vanishes... for now El horror del abrazo se desvanece... por ahora The monstrous spirit gives a crushing hug!!! (DamageTaken) ¡¡¡El espíritu monstruoso da un abrazo aplastante!!! (Daño Recibido) -The monstrous spirit gives a crushing hug!!! (DamageTaken) -¡¡¡El espíritu monstruoso da un abrazo aplastante!!! (Daño Recibido) +### The monstrous spirit envelops you in tightness, holding you in place! (DamageTaken) + The monstrous spirit's chains latch on! (+RestraintAdded) ¡Las cadenas del espíritu monstruoso se enganchan! (+ Restricción agregada) + + Greedy Ghast Fantasma codicioso The ghast vanishes... for now El ghast desaparece... por ahora -The moaning spirit gropes your body!!! (DamageTaken) -¡¡¡El espíritu gimiente palpa tu cuerpo!!! (Daño Recibido) -Tickle Hand -cosquillas en la mano -The hand vanishes! -¡La mano desaparece! -The hand tickles you! (DamageTaken) -¡La mano te hace cosquillas! (Daño Recibido) +### The moaning spirit runs its hands all across your body!!! (DamageTaken) + + + Tome of Chains Tomo de cadenas The floating tome burns into ashes! ¡El tomo flotante se convierte en cenizas! +### Tome of Belts + +### Tome of Ropes + +### Tome of Bondage + Tome of Light Tomo de luz -The floating tome burns into ashes! -¡El tomo flotante se convierte en cenizas! Tome of Magic Tomo de magia -The floating tome burns into ashes! -¡El tomo flotante se convierte en cenizas! Tome of Ice Tomo de hielo -The floating tome burns into ashes! -¡El tomo flotante se convierte en cenizas! Tome of the Abyss Tomo del Abismo -The floating tome burns into ashes! -¡El tomo flotante se convierte en cenizas! Tome of Nature Tomo de la naturaleza -The floating tome burns into ashes! -¡El tomo flotante se convierte en cenizas! Tome of Thunder Tomo del trueno -The floating tome burns into ashes! -¡El tomo flotante se convierte en cenizas! Tome of Latex Tomo de látex -The floating tome burns into ashes! -¡El tomo flotante se convierte en cenizas! Tome of Laughs Tomo de las risas -The floating tome burns into ashes! -¡El tomo flotante se convierte en cenizas! + + You are grabbed and led to a prison... Te agarran y te llevan a una prisión... Perhaps they may release you if you behave... Quizá te suelten si te comportas... + + Necromancer Nigromante The necromancer faints. Ironic that she couldn't save herself. @@ -4114,24 +5356,32 @@ The necromancer prepares you for transport! ¡El nigromante te prepara para el transporte! The necromancer rubs your body sensually! ¡El nigromante frota tu cuerpo sensualmente! + + Filthy Rat Rata inmunda The rat skitters back into a hole in the wall. La rata se desliza hacia atrás en un agujero en la pared. The filthy rat nibbles at you! (DamageTaken) ¡La rata asquerosa te mordisquea! (Daño Recibido) + + Annoying Bat Murciélago molesto You stomp the bat into the ground to make sure it's dead. Pisoteas el murciélago contra el suelo para asegurarte de que está muerto. The bat nibbles incessantly at you! (DamageTaken) ¡El murciélago te mordisquea sin cesar! (Daño Recibido) + + Pixie Duendecito The pixie huffs and floats away. El duendecillo resopla y se aleja flotando. The pixie tickles you with a feather! (DamageTaken) ¡El duendecillo te hace cosquillas con una pluma! (Daño Recibido) + + Orb of Light Orbe de luz The orb vanishes in a flash of light. @@ -4140,40 +5390,38 @@ The orb blinds you with its intense light!!! (DamageTaken) ¡¡¡El orbe te ciega con su intensa luz!!! (Daño Recibido) A light restores the will of its allies! ¡Una luz restaura la voluntad de sus aliados! + + You do not have enough resources to cast the spell! ¡No tienes suficientes recursos para lanzar el hechizo! -You AttackName TargetEnemy for DamageDealt DamageType damage! -¡Usted AttackName TargetEnemy para DamageDealt DamageType daño! -You AttackName TargetEnemy for a decreased DamageDealt DamageType damage! -¡Usted AttackName TargetEnemy para un daño DamageDealt DamageType reducido! -You AttackName TargetEnemy for an increased DamageDealt DamageType damage! -¡Usted AttackName TargetEnemy para un mayor daño de DamageDealt DamageType! -You AttackName TargetEnemy for a devastating DamageDealt DamageType damage! -¡Usted AttackName TargetEnemy por un daño devastador DamageDealt DamageType! -You AttackName TargetEnemy, but your DamageType weapon has no effect! -¡Usted AttackName TargetEnemy, pero su arma DamageType no tiene efecto! -You AttackName TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! -Usted AttackName TargetEnemy for DamageDealt DamageType ¡daño !, ¡reducido por una protección antimagia! AttackName hits TargetEnemy for DamageDealt DamageType damage! AttackName golpea a TargetEnemy con DamageDealt DamageType. +### AttackName hits TargetEnemy for a decreased DamageDealt DamageType damage! + +AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! +AttackName golpea a TargetEnemy para aumentar el daño DamageDealt DamageType. +AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! +¡AttackName golpea a TargetEnemy con un daño devastador DamageDealt DamageType! +### AttackName hits TargetEnemy, but your DamageType weapon has no effect! + +### AttackName hits TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! + AttackName hits TargetEnemy for a reduced DamageDealt DamageType damage! AttackName golpea TargetEnemy para un daño DamageDealt DamageType reducido. AttackName hits TargetEnemy but DamageType damage doesn't have any effect! AttackName golpea a TargetEnemy pero el daño de DamageType no tiene ningún efecto. -AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! -AttackName golpea a TargetEnemy para aumentar el daño DamageDealt DamageType. AttackName hits TargetEnemy for DamageDealt DamageType damage, reduced by an anti-magic ward! AttackName golpea a TargetEnemy por DamageDealt DamageType, ¡reducido por una protección antimagia! -AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! -¡AttackName golpea a TargetEnemy con un daño devastador DamageDealt DamageType! -attack -ataque -damage -daño +### Your attack + +### An effect + You miss the TargetEnemy! ¡Echas de menos al TargetEnemy! Your attack is too feeble to hurt the TargetEnemy! ¡Tu ataque es demasiado débil para dañar al TargetEnemy! +### Your attack was absorbed by the TargetEnemy's shield! + You try to pull the TargetRestraint off... Intenta sacar el TargetRestraint... You try to squirm and moan out of the TargetRestraint... @@ -4192,16 +5440,6 @@ Your ally tries to pick the lock on your TargetRestraint... Tu aliado intenta forzar la cerradura de tu TargetRestraint... You try to pick open the TargetRestraint but break your lockpick. Intenta abrir TargetRestraint pero rompe su ganzúa. -You work on picking the TargetRestraint... -Trabajas en escoger el TargetRestraint... -You work on picking the TargetRestraint... -Trabajas en escoger el TargetRestraint... -Your trembling hands work on picking the TargetRestraint... -Tus manos temblorosas trabajan para elegir el TargetRestraint... -You work on picking the TargetRestraint with your powers... -Trabajas para elegir TargetRestraint con tus poderes... -Your ally tries to pick the lock on your TargetRestraint... -Tu aliado intenta forzar la cerradura de tu TargetRestraint... You break your lockpick trying to open the TargetRestraint. Rompe su ganzúa tratando de abrir TargetRestraint. You try to remove the TargetRestraint... @@ -4222,8 +5460,6 @@ You try to cut the TargetRestraint with help... Intentas cortar el TargetRestraint con ayuda... You break your knife trying to cut the TargetRestraint. Rompes tu cuchillo tratando de cortar el TargetRestraint. -You try to cut the TargetRestraint... -Intentas cortar el TargetRestraint... You fiddle with the key on the TargetRestraint... Juegas con la llave en TargetRestraint... Your jittering hands fumble with the key on the TargetRestraint... @@ -4232,22 +5468,18 @@ You concentrate on unlocking the TargetRestraint... Te concentras en desbloquear el TargetRestraint... You work on unlocking the TargetRestraint with help... Trabajas para desbloquear TargetRestraint con ayuda... -You fiddle with the key on the TargetRestraint... -Juegas con la llave en TargetRestraint... -The lock requires a key. -La cerradura requiere una llave. -The lock requires a key. -La cerradura requiere una llave. + + The lock requires a key. La cerradura requiere una llave. -The green padlock only accepts green keys. -El candado verde solo acepta llaves verdes. -The yellow padlock requires a red and a green key. -El candado amarillo requiere una llave roja y una verde. -The magical lock only accepts blue keys and can't be picked. -La cerradura mágica solo acepta llaves azules y no se puede forzar. +### The lock can only be opened with a key. + +### The magical lock only accepts magical keys and can't be picked. + The magical lock is guarded with powerful magic. You'll have to wait for it to wear off... La cerradura mágica está protegida con magia poderosa. Habrá que esperar a que desaparezca... +### The item is cybernetically locked. You will need a key card to unlock it. + This lock requires a command word to unlock. It doesn't have a keyhole. Este bloqueo requiere una palabra de comando para desbloquear. No tiene ojo de cerradura. You don't have a key for this lock. @@ -4256,34 +5488,68 @@ The lock seems to be magical and rejects all picking attempts! ¡La cerradura parece ser mágica y rechaza todos los intentos de forzar! The lock is definitely magical and forces your pick out! ¡La cerradura es definitivamente mágica y fuerza a tu selección! +### The lock is divine. A mortal shouldn't even try to pick it. + +### You must perform your quest! Don't even think of unlocking it... + +### You're not sure a key for this even exists in the mortal realm. + +### The lock is made of solid rubber. You can't pick that. + +### You need something sharp to cut the lock. + The lock doesn't even have a keyhole to pick! ¡La cerradura ni siquiera tiene un ojo de cerradura para forzar! +### You need a special tool to pick this kind of lock. + +### The lock is technological and does not use a key. + +### The lock is brimming with security features and is nigh impossible to pick! + +### The lock is encased in magical crystals that block the keyhole. + +### Your distraction makes the crystals regrow immediately after breaking them off. + +### The crystal fragments in the lock make it difficult to pick. + +### You need a key to actually unlock the ex-crystallized lock. + The key sticks in the lock and jams, mangling the key! ¡La llave se atasca en la cerradura y se atasca, destrozando la llave! + + You unlock the TargetRestraint. Desbloqueas el TargetRestraint. You manage to squeeze out of the TargetRestraint! ¡Te las arreglas para salir del TargetRestraint! You pick the lock on the TargetRestraint! ¡Eliges la cerradura del TargetRestraint! -You pick the lock on the TargetRestraint! -¡Eliges la cerradura del TargetRestraint! You free yourself from the TargetRestraint! ¡Te liberas del TargetRestraint! You damage the TargetRestraint enough to escape! ¡Daña el TargetRestraint lo suficiente como para escapar! + + The TargetRestraint is destroyed by your attempts. El TargetRestraint es destruido por sus intentos. +### The TargetRestraint comes off before taking serious damage. + This is as far as you can struggle. You'll have to remove the TargetRestraint some other way. Esto es lo más lejos que puedes luchar. Tendrá que eliminar TargetRestraint de alguna otra manera. The item is too tight. You'll need to loosen the TargetRestraint somehow first... El artículo está demasiado apretado. Primero deberá aflojar el TargetRestraint de alguna manera... The item is to tight to get your tool into position. You'll have to first make the TargetRestraint looser. El artículo está demasiado ajustado para colocar la herramienta en posición. Primero tendrá que aflojar TargetRestraint. -After many failed attempts to unlock the TargetRestraint, you realize this lock is more than you can handle. -Después de muchos intentos fallidos de desbloquear TargetRestraint, se da cuenta de que este bloqueo es más de lo que puede manejar. +### You can't quite get your pick into position. Maybe if you loosened the TargetRestraint first... + The TargetRestraint's lock is tucked in securely under straps. You'll have to get it out from under there... El candado de TargetRestraint está metido de forma segura debajo de las correas. Tendrás que sacarlo de ahí abajo... + + +After many failed attempts to unlock the TargetRestraint, you realize this lock is more than you can handle. +Después de muchos intentos fallidos de desbloquear TargetRestraint, se da cuenta de que este bloqueo es más de lo que puede manejar. + + You can feel some ply but can't quite make any progress against the TargetRestraint... Puede sentir algunas capas, pero no puede hacer ningún progreso contra TargetRestraint... The TargetRestraint's mechanism lies barely out of reach... @@ -4294,18 +5560,20 @@ The lock on the TargetRestraint is just above your skill level... El candado en TargetRestraint está justo por encima de su nivel de habilidad... The keyholes on the TargetRestraint are just barely out of reach... Las cerraduras del TargetRestraint están apenas fuera de su alcance... + + You unlock the TargetRestraint and sigh with relief. Desbloqueas TargetRestraint y suspiras con alivio. You give out a huge moan as you squeeze out of the TargetRestraint! ¡Emites un gran gemido mientras te escapas del TargetRestraint! You pick the lock on the TargetRestraint with a sigh of relief! ¡Abres la cerradura del TargetRestraint con un suspiro de alivio! -You pick the lock on the TargetRestraint with a sigh of relief! -¡Abres la cerradura del TargetRestraint con un suspiro de alivio! Trembling, you free yourself from the TargetRestraint! ¡Temblando, te liberas del TargetRestraint! You damage the TargetRestraint enough to wiggle out! ¡Daña el TargetRestraint lo suficiente como para salirse! + + You stick the knife into a crack in the wall! ¡Metes el cuchillo en una grieta en la pared! You use your feet to place the knife into a crack! @@ -4314,6 +5582,8 @@ You glare at the crack in the wall as you realize you couldn't maneuver the knif Miras la grieta en la pared cuando te das cuenta de que no podrías maniobrar el cuchillo aunque lo intentaras. You can't hold your knife like this... No puedes sostener tu cuchillo así... + + The TargetRestraint is too secure to struggle out. El TargetRestraint es demasiado seguro para luchar. You groan in frustration as you realize the TargetRestraint is too tight to escape. @@ -4324,6 +5594,8 @@ You will need someone's help to squeeze out of the TargetRestraint. Necesitará la ayuda de alguien para salir del TargetRestraint. The TargetRestraint flashes magically as the Goddess' curse resists your efforts! ¡El TargetRestraint parpadea mágicamente cuando la maldición de la Diosa resiste tus esfuerzos! +### The TargetRestraint holds firm against your attempts, held back by your restrictions. + You pull and tug but your other restraints keep the TargetRestraint securely in place! ¡Usted tira y tira, pero sus otras restricciones mantienen el TargetRestraint en su lugar de forma segura! You groan and tug but nothing budges on the TargetRestraint. You're bound too tightly by something else. @@ -4346,6 +5618,8 @@ Your bound and shaking hands can't even hold the key for the TargetRestraint. Tus manos atadas y temblorosas ni siquiera pueden sostener la llave de TargetRestraint. The goddess punishes you for trying to unlock the TargetRestraint! ¡La diosa te castiga por intentar desbloquear TargetRestraint! +### You are too restricted to get the key into place! + You try, but something is keeping your hands away from the TargetRestraint. Lo intenta, pero algo mantiene sus manos alejadas del TargetRestraint. You flail the key around uselessly but a strap is preventing you from unlocking the TargetRestraint! @@ -4368,14 +5642,16 @@ You whimper as you realize the lock on the TargetRestraint is shielded by anothe Gimoteas cuando te das cuenta de que el candado del TargetRestraint está protegido por otra correa. You are distracted from the TargetRestraint by mental images of yourself remaining in bondage... Estás distraído del TargetRestraint por imágenes mentales de ti mismo permaneciendo en cautiverio... +### Your restrictions ruin your dexterity. You can't pick the TargetRestraint. + You wiggle uselessly in the TargetRestraint. Maybe you need some kind of tool... Te mueves inútilmente en TargetRestraint. Tal vez necesites algún tipo de herramienta... You rub your body against the floor to no avail, and sigh as the TargetRestraint stays secure. Frotas tu cuerpo contra el suelo en vano y suspiras mientras el TargetRestraint se mantiene seguro. You contort your body but you don't have leverage on the TargetRestraint. Maybe you need some kind of tool... Contorsionas tu cuerpo pero no tienes influencia sobre TargetRestraint. Tal vez necesites algún tipo de herramienta... -You wiggle madly, trying to push against the TargetRestraint. You need more leverage... -Te mueves como un loco, tratando de empujar contra TargetRestraint. Necesitas más apalancamiento... +### You struggle madly, trying to push against the TargetRestraint. You need more leverage... + That doesn't seem to work. Maybe something else will help with the TargetRestraint. Eso no parece funcionar. Tal vez algo más ayude con TargetRestraint. You squirm helplessly against the furniture. Maybe something else will help with the TargetRestraint. @@ -4384,38 +5660,42 @@ You twist your body trying to use the furniture, but it doesn't seem to work. Th Giras tu cuerpo tratando de usar los muebles, pero parece que no funciona. El TargetRestraint permanece ajustado. You wiggle and squirm, trying to use the furniture to no avail. The TargetRestraint remains tight. Te mueves y te retuerces, tratando de usar los muebles en vano. El TargetRestraint permanece ajustado. -You need something sharp to loosen the fasteners on the TargetRestraint. -Necesita algo afilado para aflojar los sujetadores del TargetRestraint. -This is not a job for your fingers right now. You need something sharp to remove the TargetRestraint. -Este no es un trabajo para tus dedos en este momento. Necesita algo afilado para quitar TargetRestraint. -There's no way to loosen the TargetRestraint without some kind of sharp tool... -No hay forma de aflojar el TargetRestraint sin algún tipo de herramienta afilada... + + +### You need something sharper to get at the TargetRestraint. + +### This is not a job for your trembling fingers right now. + +### Tugging on the TargetRestraint is useless. Maybe if you had something sharp... + You sigh as the TargetRestraint resists all your attempts at breaking through. Suspiras cuando TargetRestraint resiste todos tus intentos de abrirte paso. -You need some kind of corner for leverage on the TargetRestraint. -Necesita algún tipo de esquina para aprovechar TargetRestraint. -You flail about but cant get any leverage on the TargetRestraint without an edge or corner. -Te agitas pero no puedes hacer palanca en el TargetRestraint sin un borde o una esquina. -You need something rough to get the TargetRestraint loose. -Necesita algo duro para soltar el TargetRestraint. -You squirm against the smooth floor to no avail. If you had some kind of corner to undo the TargetRestraint... -Te retuerces contra el suelo liso en vano. Si tuvieras algún tipo de rincón para deshacer el TargetRestraint... -You need some kind of tool to pull at the knots on the TargetRestraint. -Necesita algún tipo de herramienta para tirar de los nudos en TargetRestraint. + + +### You fidget with the TargetRestraint but can't reach the clasps without some kind of edge. + +### You flail about but your hands are unable to reach the TargetRestraint. + +### You can't reach the clasps on the TargetRestraint. If only you had some other way... + +### You squirm around, rubbing the TargetRestraint against the smooth floor to no avail... + +### The knots on the TargetRestraint are too tight to pull apart without a hook. + You struggle fruitlessly against the knots on the TargetRestraint, but they're too tight. Lucha infructuosamente contra los nudos del TargetRestraint, pero están demasiado apretados. -You don't have any grip or hook to tug on the TargetRestraint with. -No tiene ningún agarre o gancho para tirar del TargetRestraint. -You cant tug on the TargetRestraint without some kind of hook, it's too tight against your body. -No puede jalar el TargetRestraint sin algún tipo de gancho, está demasiado apretado contra su cuerpo. -You need a way to stick the tool in place to undo the TargetRestraint... -Necesita una forma de pegar la herramienta en su lugar para deshacer TargetRestraint... +### The TargetRestraint is too tight against your body. You'll need more leverage to pull it off. + +### You shake yourself around trying to rub off the TargetRestraint, but it's hopeless. + +### You need more grip to peel off the TargetRestraint... + Your trembling hands cant grip anything as they are, let alone undo the TargetRestraint. Tus manos temblorosas no pueden agarrar nada tal como están, y mucho menos deshacer el TargetRestraint. -You need something grippy to hold the TargetRestraint... -Necesitas algo con agarre para sujetar el TargetRestraint... -You rub yourself against the floor to no avail. If you had something adhesive to stick the TargetRestraint to... -Te frotas contra el suelo en vano. Si tuviera algo adhesivo para pegar el TargetRestraint... +### You rub yourself against the floor to no avail... + + + The fastenings are too tight and secure on the TargetRestraint! ¡Las sujeciones están demasiado apretadas y seguras en TargetRestraint! You roll around tryng to loosen the TargetRestraint to no avail. @@ -4434,6 +5714,8 @@ You rub your body uselessly as you find another strap securing the TargetRestrai Frotas tu cuerpo inútilmente mientras encuentras otra correa asegurando el TargetRestraint. You feel the Goddess' hand keeping the TargetRestraint tightly secured! ¡Sientes la mano de la Diosa manteniendo el TargetRestraint firmemente asegurado! +### The TargetRestraint is too well-secured to take off with your level of restriction. + The TargetRestraint is too durable to cut. El TargetRestraint es demasiado duradero para cortarlo. Your hopeless attempts fail to even leave a scratch on the TargetRestraint. @@ -4450,8 +5732,8 @@ Your arms are kept from having leverage on the TargetRestraint due to another it Sus brazos no pueden hacer palanca en TargetRestraint debido a otro elemento. You fiddle with the tool, but your arms lack leverage on the TargetRestraint due to another item Jugueteas con la herramienta, pero tus brazos no hacen palanca en TargetRestraint debido a otro elemento -The TargetRestraint flashes magically as the Goddess' curse resists your efforts! -¡El TargetRestraint parpadea mágicamente cuando la maldición de la Diosa resiste tus esfuerzos! +### Your restrictions limit your cutting power, unable to hurt the TargetRestraint. + You pry at the TargetRestraint... Haces palanca en TargetRestraint... You moan as the TargetRestraint squeeze you tightly... @@ -4464,6 +5746,8 @@ You hear dark laughter as you realize the TargetRestraint won't let go... Escuchas una risa oscura cuando te das cuenta de que TargetRestraint no te soltará... You hear a dark giggle as fruitlessly try to wiggle free from the TargetRestraint! ¡Oyes una risita oscura mientras intentas infructuosamente liberarte del TargetRestraint! + + You try to pull away from the TargetRestraint! ¡Intentas alejarte del TargetRestraint! You blush and try to escape the TargetRestraint's grip! @@ -4476,6 +5760,8 @@ You're bound too tight to have a chance at shaking off the TargetRestraint. Estás demasiado atado para tener la oportunidad de sacudirte el TargetRestraint. You whimper as you give up struggling against the TargetRestraint. Gimoteas mientras dejas de luchar contra TargetRestraint. + + You wiggle around trying to get the TargetRestraint out... Te mueves tratando de sacar el TargetRestraint... You squirm around trying to dislodge the TargetRestraint... @@ -4488,20 +5774,20 @@ Your bondage keeps the TargetRestraint firmly in place. Su atadura mantiene el TargetRestraint firmemente en su lugar. Your struggling does nothing but shift the TargetRestraint's position inside of you. Tu lucha no hace más que cambiar la posición de TargetRestraint dentro de ti. -You wiggle around trying to get the TargetRestraint out... -Te mueves tratando de sacar el TargetRestraint... -You squirm around trying to dislodge the TargetRestraint... -Te retuerces tratando de desalojar el TargetRestraint... + + The TargetRestraint won't come out. El TargetRestraint no saldrá. You feel the TargetRestraint slide around but it won't come out! ¡Sientes que TargetRestraint se desliza pero no sale! Your bondage keeps the TargetRestraint secure in place. Su atadura mantiene el TargetRestraint seguro en su lugar. -Your struggling does nothing to disloghe the TargetRestraint. -Su lucha no hace nada para desalojar el TargetRestraint. -You work to unlace the TargetRestraint... -Trabajas para desatar el TargetRestraint... +### Your struggling does nothing to dislodge the TargetRestraint. + + + +You work to unlace the TargetRestraint... +Trabajas para desatar el TargetRestraint... You hurriedly try to unlace the TargetRestraint... Rápidamente tratas de desatar el TargetRestraint... The TargetRestraint has no laces to loosen! @@ -4512,6 +5798,8 @@ The laces of the TargetRestraint are tied tight! ¡Los cordones del TargetRestraint están bien atados! You hopelessly try to untie the lacing on the TargetRestraint, but it's just too tight! Intenta desesperadamente desatar los cordones del TargetRestraint, ¡pero está demasiado apretado! + + You grasp at the TargetRestraint, trying to peel it off... Agarras el TargetRestraint, tratando de despegarlo... You wiggle madly as you try to peel off the TargetRestraint! @@ -4524,6 +5812,8 @@ The TargetRestraint is too fast at reforming! ¡TargetRestraint se reforma demasiado rápido! The TargetRestraint reforms too quickly as you try to squirm it off... El TargetRestraint se reforma demasiado rápido cuando intentas quitártelo... + + You grasp around, looking for a seam on the TargetRestraint... Te agarras, buscando una costura en TargetRestraint... You wiggle and squirm, looking for something to pull at on the TargetRestraint... @@ -4536,6 +5826,8 @@ The TargetRestraint is too tight to get any traction... El TargetRestraint está demasiado apretado para obtener tracción... The TargetRestraint squeezes your body too tightly to get any sort of ply... El TargetRestraint aprieta su cuerpo con demasiada fuerza para obtener cualquier tipo de capa... + + You start peeling off the TargetRestraint... Empiezas a despegar el TargetRestraint... You scratch at the TargetRestraint furiously... @@ -4548,6 +5840,8 @@ You can't grip the edges to peel the TargetRestraint off! ¡No puede agarrar los bordes para quitar el TargetRestraint! You make a futile attempt to rub the TargetRestraint off. Haces un intento inútil de borrar el TargetRestraint. + + You try to wiggle off the TargetRestraint... Intenta quitarse el TargetRestraint... You squirm trying to get the TargetRestraint to fall off... @@ -4560,6 +5854,22 @@ The TargetRestraint have you bound hopelessly tight! ¡TargetRestraint te tiene atado irremediablemente apretado! You sigh and moan as the TargetRestraint aren't getting any looser. Suspiras y gimes cuando TargetRestraint no se afloja. + + + + +### You look around for a fastener on the TargetRestraint... + +### Shivering, you look for a fastener on the TargetRestraint... + +### The TargetRestraint has no fastener!!! + +### The TargetRestraint is sealed around your body, with no fasteners to speak of! + +### The TargetRestraint is firmly sealed around your body. + +### You are sealed in ice. There is no escape. + You try to untie the TargetRestraint... Intenta desatar el TargetRestraint... You contort yourself trying to reach the knots on the TargetRestraint... @@ -4572,6 +5882,8 @@ You can't reach the knots on the TargetRestraint! ¡No puedes alcanzar los nudos en TargetRestraint! Your squirming is in vain as you can't even reach the knots on the TargetRestraint. Tu retorcimiento es en vano ya que ni siquiera puedes alcanzar los nudos en TargetRestraint. + + You try to pull off the TargetRestraint... Intenta sacar el TargetRestraint... You tug on your TargetRestraint trying to get them off! @@ -4582,72 +5894,106 @@ You realize that would really hurt... Te das cuenta de que eso realmente dolería... The TargetRestraint tug on your nipples as you squirm! ¡El tirón de TargetRestraint en tus pezones mientras te retuerces! -The TargetRestraint tug on your nipples as you squirm! -¡El tirón de TargetRestraint en tus pezones mientras te retuerces! + + + + +### You paw at the TargetRestraint from inside, hoping to find an opening... + +### You flail around inside the TargetRestraint... + +### The TargetRestraint is completely seamless! + +### The TargetRestraint is completely seamless! This is hopeless. + +### You are too weak to poke your hand through the TargetRestraint... + +### You stretch yourself out inside the TargetRestraint! + +### You bounce around inside the TargetRestraint! + +### The TargetRestraint stretches to accomodate your movements... + +### The TargetRestraint tips slightly as you squirm around... + +### You are too weak to make even a small dent in the TargetRestraint... + +### The TargetRestraint is unyielding despite your attempts... + +### You try to puncture the TargetRestraint... + +### You poke around at the TargetRestraint... + +### The TargetRestraint is too durable to pop... + +### The TargetRestraint is too strong despite your best efforts... + +### You can't quite get enough force to pop the TargetRestraint... + +### Your attempts to pop the TargetRestraint are futile due to your restraints... + The chest is too smooth to help. Maybe if you opened it? El pecho es demasiado suave para ayudar. ¿Quizás si lo abriera? + + Lockable bloqueable Non-Lockable no bloqueable + + Unlocked desbloqueado -Lock Type: -Tipo de bloqueo: -Red -Rojo -Red -Rojo -Red -Rojo -Simple -Simple -Green -Verde -Blue -Azul -Purple -Púrpura -Gold -Oro -Yellow -Amarillo -Red Lock -candado rojo -Red Lock -candado rojo -Red Lock -candado rojo +### Lock: + +### Simple + +### Standard + +### Secure + +### Disc + +Rubber +Goma +### Crystal + +### Runic + +Magic +magia +### Cyber + +### Integrated Cyber + +### Advanced Cyber + +### Ancient + Simple Lock Bloqueo sencillo -Green Lock -candado verde -Blue Lock -candado azul -Purple Lock -candado morado -Yellow Lock -candado amarillo - - - - - - -(G) -(G) -(S) -(S) -(B) -(B) -(G) -(G) -(P) -(P) -(?) -(?) -(Y) -(Y) +### Standard Lock + +### Secure Lock + +### Disc Lock + +### Rubber Lock + +### Divine Lock + +### Crystal Lock + +### Runic Lock + +### Magic Lock + +### Cyber Lock + +### Integrated Cyber Lock + +### Advanced Cyber Lock + You can't use that while gagged! ¡No puedes usar eso mientras estás amordazado! You can't use that without your fingers! @@ -4664,16 +6010,12 @@ You drop the key due to your bound hands! ¡Dejas caer la llave debido a tus manos atadas! You drop the magic key due to your bound hands! ¡Dejas caer la llave mágica debido a tus manos atadas! -You drop the magic key due to your bound hands! -¡Dejas caer la llave mágica debido a tus manos atadas! -Logbook -Cuaderno -Logbook (N) -Cuaderno (N) +### You insert the card the wrong way and the reader ejects it onto the floor! + +### Journal (N) + Passing... Paso... -Pass NPCs -Pasar NPC Closing... Clausura... Close door @@ -4704,6 +6046,30 @@ You mumble a command word but the lock opens! ¡Murmuras una palabra de comando pero la cerradura se abre! You mess up saying the command word. The lock stays put! Te equivocas al decir la palabra de mando. ¡La cerradura se queda puesta! +### Swipe Keycard + +### You swipe your keycard and the lock releases with a hiss! + +### You swipe your keycard and the lock beeps 'Access Denied'! + +### You don't have any card to scan in the slot. + +### Use Retinal Scanner + +### You scan your eye pattern and the lock releases with a hiss! + +### The lock rejects you, citing your lack of authority. + +### You are blindfolded, so the scanner can't even see your eye! + +### Hack + +### You bypass the lock's cyber defenses and release it with a hiss! + +### The lock beeps as its security blocks your attempts at release. + +### You have no way to hack the locking system. + Pick Elegir (No way to open) @@ -4732,20 +6098,24 @@ You leave the coins on the altar and they transform into a ItemBought! ¡Dejas las monedas en el altar y se transforman en un ItemBought! object objeto + + It appears to be a receptacle for an ancient crystal. Parece ser un receptáculo para un cristal antiguo. It's a pile of slag emitting a strange magic smoke... Es un montón de escoria que emite un extraño humo mágico... -That object is locked -Ese objeto está bloqueado. -A shrine to the goddess of TYPE. A pool of mana glimmers below. -Un santuario a la diosa del TYPE. Un charco de maná brilla debajo. +### That object is locked with a LKTP. + A shrine to the goddess of TYPE. Un santuario a la diosa del TYPE. That door is open. Do you want to close it? Esa puerta está abierta. ¿Quieres cerrarlo? You slam the door and jam it shut! ¡Golpeas la puerta y la cierras! +### Passion + +Frustration +Frustración Submissiveness Sumisión Security Level @@ -4756,8 +6126,8 @@ Latex Látex Leather Cuero -Metal -Metal +### Metal + Ropes Cuerdas Restoration @@ -4772,28 +6142,48 @@ Commerce Comercio Shrine of SHRINETYPE Santuario de SHRINETYPE -Teachings of SHRINETYPE -Enseñanzas de SHRINETYPE -Goddess Blessing: -Bendición de la diosa: -Goddess Curse: -Maldición de la Diosa: +### Tablet of + +### Goddess: + +### Goddess Blessing: + +### Goddess Curse: + +### Mana Bonus: + +### Lack of Mana Penalty: + +### Your excess mana helps you suppress the enchantment! + +### Your mana is too weak to fight the magical enchantment... + Curses maldiciones -Willpower -Fuerza de voluntad + + A tablet inscribed with runes of TYPE. Una tablilla inscrita con runas de TIPO. +### SHRINETYPE Tablet + Decypher descifrar -You read the runes and they imbue you with power! -¡Lees las runas y te imbuyen de poder! +### You read the runes and they fill you with power! + +### These runes are meant for someone with less willpower. + You try to read the runes but cannot understand them. Intentas leer las runas pero no puedes entenderlas. -Allies: -Aliados: -Enemies: -Enemigos: + + +### Allies: + +### Enemies: + +### Favorable: + +### None + Nevermere Trainers Entrenadores Nevermere DressUp Co. @@ -4804,8 +6194,6 @@ Bandits Bandidos Constructs Construcciones -Witches' Coven -aquelarre de brujas School of Magic escuela de magia Old Guardians @@ -4824,26 +6212,68 @@ MaidForce sirvientafuerza Fungal Kingdom Reino fúngico -Wanted -Buscado +Nature +Naturaleza + + +Witches' Coven +aquelarre de brujas +### Love Crafters + +### Velvet Pact + +### Knights Errant + +### Scavengers + +### Fae Tricksters + +### Zora's Crew + +### Rope Dojo + +### Doll Shoppe + +### Fuuka's Shrine + +### The Collectors + +### Dollmaker Inc. + +### Adventurer + +### Cursed Spirit + Delinquent Delincuente +### Computer Virus + +### Extraplanar Entity + +### Dubious Witch + +### Shadow Clan + Illegal Poacher Cazador furtivo ilegal -Nature -Naturaleza Very Angry Muy enojado Surprise! ¡Sorpresa! +### Fierce Debater + Angels ángeles Demons demonios + + You sense that the chest contains a trap and a lot of gold. Sientes que el cofre contiene una trampa y mucho oro. You sense that the chest is safe to open. Siente que es seguro abrir el cofre. + + Drink Beber Bottle @@ -4868,6 +6298,8 @@ You have angered the goddess of TYPE!!! Has enfadado a la diosa del TIPO!!! The slime washes off in the fountain!!! ¡El limo se lava en la fuente! +### The goddess of TYPE is enraged and curses you with a divine punishment! (+RESTRAINT) + The goddess offers a ItemTraded for ItemCost (NumCurrent/NumMax) La diosa ofrece un ItemTraded por ItemCost (NumCurrent/NumMax) Next Offer @@ -4876,56 +6308,90 @@ Buy (press right) Comprar (presione a la derecha) Cost: ItemCostgp Costo: ItemCostgp +### Owned: AMNT + +You climb down to the next level +Bajas al siguiente nivel + + Level RestraintLevel (Rarity) Nivel RestraintLevel (Rarity) + + +### All + Consumable Consumible -Equipped +Worn Equipado Weapons armas Outfits trajes -Wearable -Usable +### Restraints + Miscellaneous Misceláneas +### Armor + The terrain makes noise as you rush across it... El terreno hace ruido cuando lo atraviesas... + + You can't reach the cuffs on your elbows, the chain is too short... No alcanzas los puños de los codos, la cadena es demasiado corta... You contort your arms trying to reach the cuffs on your elbows, to no avail... Contorsionas los brazos tratando de alcanzar las esposas de los codos, sin éxito... Your elbows are kept together by the elbow cuffs, and you can't reach them. Sus codos se mantienen unidos por las coderas y no puede alcanzarlos. + + The strict chain on the cuffs keeps you from reaching them easily. La cadena estricta en los puños evita que los alcances fácilmente. The cuffs limit your range of motion, making it harder to remove them. Los puños limitan su rango de movimiento, por lo que es más difícil quitárselos. It's hard to take off the cuffs with your wrists linked together... Cuesta quitarse los puños con las muñecas unidas... + + You feel drained of energy... Te sientes sin energía... Your collar tingles and suddenly you feel weaker... Te hormiguea el cuello y de repente te sientes más débil... Your collar drains your energy as you struggle... Tu collar drena tu energía mientras luchas... + + The rope between your legs keeps the toy secure... La cuerda entre tus piernas mantiene el juguete seguro... Try as you might, the toy is held in place tight. Por mucho que lo intente, el juguete se mantiene apretado en su lugar. The toy won't wiggle loose. It's kept in place by your restraints. El juguete no se suelta. Se mantiene en su lugar gracias a tus ataduras. + + Your catsuit adheres to latex, making struggling more difficult! ¡Tu catsuit se adhiere al látex, lo que hace que luchar sea más difícil! The item sticks to your rubber catsuit, making it harder to pull off... El artículo se pega a tu catsuit de goma, lo que hace que sea más difícil quitártelo... The item hugs your catsuit tightly, adhering firmly! ¡El artículo abraza tu catsuit con fuerza, adhiriéndose firmemente! + + +### Your RSTRN holds you securely, making your struggling ineffectual... + +### Your RSTRN holds you tight, making it harder to move... + +### Your RSTRN keeps you tied tight, making it harder to escape... + The bright light weakens the shadow hands! ¡La luz brillante debilita las manos de la sombra! + + You hear an ominous click, but nothing seems to happen. Looks like a misfire! Oyes un clic siniestro, pero parece que no pasa nada. ¡Parece un fallo de encendido! + + Barrel Trap Trampa de barril A booby-trapped barrel with a spring-loaded lid designed to trap you inside! @@ -4934,18 +6400,24 @@ You can push the lid off with enough force... Puedes empujar la tapa con suficiente fuerza... The lid of the barrel suddenly snaps shut as you hide inside!!! ¡La tapa del barril se cierra repentinamente mientras te escondes dentro! + + + + Sarcophagus Sarcófago A glass-walled chamber sealed with enchanting magic. Una cámara con paredes de vidrio sellada con magia encantadora. Time feels like it's going by quickly outside... El tiempo se siente como si estuviera pasando rápido afuera... -Cage Trap -trampa de jaula -A booby-trapped cage! -¡Una jaula con trampas explosivas! -Fit for a pretty toy like you~ -Apto para un juguete bonito como tú ~ + + +### Metal Cage + +### A metal cage with rigid bars, too narrow to put your head through. + +### Made for a pretty toy like you~ + Display Stand Soporte de exhibición A display stand, fit for only the prettiest of trophies! @@ -4954,24 +6426,38 @@ Your arms are pinned behind your back and you can barely move! ¡Tus brazos están atrapados detrás de tu espalda y apenas puedes moverte! You hear a click as the door shuts behind you... Oyes un clic cuando la puerta se cierra detrás de ti... +### The display stand suddenly locks into place around you! + Doll Stand Soporte para muñecas A mobile display stand for dolls to keep them in place. Un soporte de exhibición móvil para muñecas para mantenerlas en su lugar. As long as it's... inserted, you won't be going anywhere! ¡Mientras esté... insertado, no irás a ninguna parte! -Doll Stand -Soporte para muñecas -A mobile display stand for dolls to keep them in place. -Un soporte de exhibición móvil para muñecas para mantenerlas en su lugar. + + +### One Bar Prison + +### A devious way to immobilize people. + +### Metal Stand + +### As long as it's locked around you, you won't be going anywhere! + + + As long as it's attached, you won't be going anywhere! ¡Mientras esté conectado, no irás a ninguna parte! + + You're not fooling anyone... no engañas a nadie... You might be able to fool someone like this... Usted podría ser capaz de engañar a alguien así... You look like you're right at home! ¡Parece que estás en casa! + + Restraining Bed Cama de contención A bed with a booby trap designed to trap you on top of it! @@ -4980,18 +6466,22 @@ You have to get out somehow... Tienes que salir de alguna manera... Belts emerge from underneath the bed and wrap around you, strapping you down tightly! Los cinturones emergen de debajo de la cama y te envuelven, ¡sujetándote con fuerza! + + Binding Dress Vestido vinculante It's a devious dress! I hope your elbows are flexible~ ¡Es un vestido retorcido! Espero que tus codos sean flexibles~ -So many laces! It would quite a while to put this on normally. That's what magic is for! -¡Tantos cordones! Llevaría bastante tiempo poner esto normalmente. ¡Para eso está la magia! +### So many laces! It would take quite a while to put this on normally. That's what magic is for! + Ornamental Corset corsé ornamental Your figure looks gorgeous in this~ Tu figura se ve hermosa en esto ~ It's so tight you won't be able to undo the laces yourself, dear! ¡Es tan apretado que no podrás desatar los cordones tú mismo, querida! + + Fancy Ball Gag Mordaza de bola elegante A cute ball gag that fills your mouth right up! @@ -5004,24 +6494,32 @@ A muzzle to keep you from spitting out what's underneath. Un bozal para evitar que escupas lo que hay debajo. Sorry dear, there's a mystic seal on there to keep it on nice and tight. Lo siento querida, hay un sello místico allí para mantenerlo bien ajustado. -Red Binding Dress -Vestido rojo vinculante + + +### Ornamental Dress + A devious dress that forces the arms into an elbows-touching position. Un vestido tortuoso que obliga a los brazos a tocar los codos. It is extremely strict but it is only fabric. The lacing is intricate and will take a long time to remove. Es extremadamente estricto pero es solo tela. El cordón es intrincado y llevará mucho tiempo quitarlo. + + Ornamental Gag Mordaza ornamental -A gag meant to keep servants of the Resurrection Temple quiet by forcing a dildo into their mouth. -Una mordaza destinada a mantener callados a los sirvientes del Templo de la Resurrección forzándolos a meterse un consolador en la boca. +### A gag meant to keep servants of the Resurrection Temple quiet by forcing a plug into their mouth. + It is difficult to pull off and though it is made from white leather, a magic enchantment protects it from cutting. Es difícil de quitar y, aunque está hecho de cuero blanco, un encantamiento mágico lo protege de cortes. + + Panel Plug Gag Mordaza de enchufe de panel -A gag meant to keep people quiet by forcing a dildo into their mouth. -Una mordaza destinada a mantener a la gente callada al obligarles a meterse un consolador en la boca. +### A gag meant to keep people quiet by forcing a plug into their mouth. + It is difficult to pull off and though it is made from supple, heavy duty leather. Es difícil de quitar y aunque está hecho de cuero resistente y flexible. + + Fuuka's Collar Collar de Fuuka A collar enchanted with ghastly energy. @@ -5030,194 +6528,190 @@ It seems to react with a pulse of energy whenever a nearby enemy is defeated. Parece reaccionar con un pulso de energía cada vez que un enemigo cercano es derrotado. Your collar pulses, and a revenant appears to avenge the enemy you defeated! ¡Tu collar pulsa y aparece un aparecido para vengar al enemigo que derrotaste! + + +### Fuuka's Pet Collar + +### A collar enchanted with beneficial ghastly energy. + +### Your collar pulses, and a revenant appears to assist you! + Dress Bustier vestido bustier A deceptively cruel device, making it impossible to reach your nipples. Un dispositivo engañosamente cruel que hace imposible alcanzar tus pezones. Reinforced with steel plates, this will need bolt cutters to take off. Reforzado con placas de acero, necesitará cortadores de pernos para despegar. -Nipple Massagers -Masajeadores de pezones -A pair of little teasers. -Un par de pequeños teasers. -They will make for some great fun! -¡Serán muy divertidos! -Control Harness -Arnés de control -An advanced harness for controlling high-security prisoners. -Un arnés avanzado para controlar prisioneros de alta seguridad. -It seems to be made of flexible steel plates. -Parece estar hecho de placas de acero flexibles. -Tracking Collar -Collar de seguimiento -An advanced collar for tracking high-security prisoners. -Un collar avanzado para rastrear prisioneros de alta seguridad. -It seems to be made of flexible steel plates, and it has a high-security lock. -Parece estar hecho de placas de acero flexibles y tiene una cerradura de alta seguridad. + + +### Massagers + +### A pair of little motion-activated teasers. They trigger when you swing your body for an attack. + +### They will make for some great fun! Type: Edging + +### Advanced Massagers + +### A pair of sensitive motion-activated teasers. They trigger when you attack or struggle. + +### Nipple Weights + +### A pair of dense weights dangling from your sensitive bits. + +### They tend to swing around when attacking or casting arm spells. + +### Hi-Tech Massagers + +### A pair of highly-sensitive motion-activated teasers. They detect most forms of motion, including sprinting and hopping. + +Control Harness +Arnés de control +An advanced harness for controlling high-security prisoners. +Un arnés avanzado para controlar prisioneros de alta seguridad. +It seems to be made of flexible steel plates. +Parece estar hecho de placas de acero flexibles. + + +### Cyber Collar + +### An advanced collar for registering prisoners into the facility network. + +It seems to be made of flexible steel plates, and it has a high-security lock. +Parece estar hecho de placas de acero flexibles y tiene una cerradura de alta seguridad. + + Latex Ball Gag mordaza de bola de látex -A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. -Un dispositivo tortuoso que parece una mordaza de bola, pero tiene una varilla para llenar la boca en el interior. +### A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + The strap is made of a durable but flexible material La correa está hecha de un material duradero pero flexible. +### Large Latex Ball Gag + +### A devious device that looks like a large ball gag, but absolutely fills your mouth with a rubber cylinder. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + Latex Mask Máscara de látex A slick layer of blue latex stretched over the mouth. Una capa resbaladiza de látex azul se extendía sobre la boca. It's very tight and makes it hard to move your mouth. Es muy apretado y hace que sea difícil mover la boca. + + +### Secure Latex Mask + +### A slick layer of blue latex stretched over the mouth. It has a lockable strap which prevents it from being removed. + + + Rubberized Gloves Guantes de goma A mass of alchemical latex stretched over your arms, then hardened to the point that you can barely move your fingers! ¡Una masa de látex alquímico se extendió sobre tus brazos y luego se endureció hasta el punto de que apenas podías mover los dedos! Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! A diferencia del caucho típico, este material es duradero, flexible y algo pegajoso. + + Rubberized Socks calcetines de goma A mass of alchemical latex stretched over your legs, then hardened. Una masa de látex alquímico se estiró sobre tus piernas y luego se endureció. -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -A diferencia del caucho típico, este material es duradero, flexible y algo pegajoso. + + Rubberized Mask Máscara de goma A mass of alchemical latex stretched over your entire face, then hardened. Una masa de látex alquímico se extendió por toda tu cara y luego se endureció. -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -A diferencia del caucho típico, este material es duradero, flexible y algo pegajoso. + + Rubberized Ball Gag mordaza de bola de goma -A mass of alchemical latex inflated to fill your mouth, then hardened. -Una masa de látex alquímico inflado para llenar tu boca, luego endurecido. -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -A diferencia del caucho típico, este material es duradero, flexible y algo pegajoso. +### A mass of alchemical latex inflated to fill your mouth, then hardened. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + Rubberized OTN Mask Máscara OTN de goma A mass of alchemical latex stretched over your mouth, then hardened. Una masa de látex alquímico se estiró sobre tu boca y luego se endureció. -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -A diferencia del caucho típico, este material es duradero, flexible y algo pegajoso. + + Wolf Panties Bragas de lobo A set of vibrating panties designed to help subdue unruly wolfgirls. Un conjunto de bragas vibradoras diseñadas para ayudar a someter a las chicas lobo rebeldes. It's incredibly tight and difficult to remove once it's clipped on, but the material is rubber. Es increíblemente apretado y difícil de quitar una vez que está enganchado, pero el material es de goma. -You don't meet the conditions to equip that. -No reúnes las condiciones para equipar eso. -Latex Boxtie Binder -Carpeta de látex Boxtie + + +### You can't equip that. + +### Experimental Boxtie Binder + A secure but comfortable binder meant for long-term wear by the alchemists' pets. Un aglutinante seguro pero cómodo diseñado para que las mascotas de los alquimistas lo usen a largo plazo. Made from imbued latex, it will be hard to cut but not impossible. Hecho de látex imbuido, será difícil de cortar pero no imposible. -Binder Straps Cincher -Cincher de correas de encuadernación -A tight cincher attached to a binder used to ensure restraints will not come off. -Una cincha apretada unida a una carpeta que se usa para asegurar que las restricciones no se salgan. +### Binder Harness + +### A tight harness attached to a binder used to ensure restraints will not come off. + It's tied in the back and reinforced with steel boning. Está atado en la espalda y reforzado con deshuesado de acero. -Blacksteel Ankle Cuffs -Tobilleras de acero negro -Highly durable cuffs made from top-quality ancient metal. -Puños muy duraderos fabricados con metal antiguo de primera calidad. -They're made of Blacksteel, a metal used by the Old Civilization. -Están hechos de Blacksteel, un metal usado por la Antigua Civilización. -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! -Blacksteel Cuffs Chain -Cadena de puños de acero negro -Highly durable cuffs made from top-quality ancient metal. -Puños muy duraderos fabricados con metal antiguo de primera calidad. -They're made of Blacksteel, a metal used by the Old Civilization. -Están hechos de Blacksteel, un metal usado por la Antigua Civilización. -The ankle cuff chain detaches! -¡La cadena del brazalete del tobillo se suelta! Latex Posture Collar Collar de postura de látex A strict collar that makes it tougher to escape from other items. Un collar estricto que hace que sea más difícil escapar de otros artículos. It has steel boning but could be cut with enough care. Tiene deshuesado de acero pero podría cortarse con suficiente cuidado. -Blacksteel Ballet Heels -Tacones de ballet de acero negro +### Latex Ballet Heels + A pair of strict boots for making pets more manageable. A skilled person can still walk in these. Un par de botas estrictas para hacer que las mascotas sean más manejables. Una persona experta todavía puede caminar en estos. -They are reinforced with top-quality ancient metal. -Están reforzados con metal antiguo de primera calidad. -Blacksteel Leg Cuffs -Puños de pierna de acero negro -A pair of chained cuffs made of Blacksteel, designed to slow the wearer. -Un par de puños encadenados hechos de Blacksteel, diseñados para frenar al usuario. -They're made of Blacksteel, a metal used by the Old Civilization. -Están hechos de Blacksteel, un metal usado por la Antigua Civilización. -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! -Blacksteel Cuffs -Puños de acero negro -A pair of Blacksteel cuffs that make it easy to restrain you. -Un par de puños Blacksteel que facilitan sujetarlo. -They're made of Blacksteel, a metal used by the Old Civilization. -Están hechos de Blacksteel, un metal usado por la Antigua Civilización. -The enemy attaches your wrist cuffs together! -¡El enemigo te une las muñequeras! -Blacksteel Wrist Chain -Muñequera de acero negro -A pair of Blacksteel cuffs keeping your arms behind your back. -Un par de puños Blacksteel que mantienen los brazos detrás de la espalda. -They're made of Blacksteel, a metal used by the Old Civilization. -Están hechos de Blacksteel, un metal usado por la Antigua Civilización. -Your cuffs detatch! -¡Tus puños se sueltan! -The enemy attaches your elbow cuffs together! -¡El enemigo une tus puños de codo juntos! -Blacksteel Wrist Chain -Muñequera de acero negro -A full set of Blacksteel cuffs keeping your arms in a strict elbow tie! -¡Un juego completo de puños Blacksteel que mantienen tus brazos en una estricta corbata de codo! -They're made of Blacksteel, a metal used by the Old Civilization. -Están hechos de Blacksteel, un metal usado por la Antigua Civilización. -Your wrists detatch, leaving your elbows still bound! -¡Tus muñecas se sueltan, dejando tus codos aún atados! -Blacksteel Elbow Chain -Cadena de codo de acero negro -A pair of Blacksteel cuffs keeping your elbows locked together!. -¡Un par de puños Blacksteel que mantienen los codos juntos! -They're made of Blacksteel, a metal used by the Old Civilization. -Están hechos de Blacksteel, un metal usado por la Antigua Civilización. -Your elbows detatch! -¡Tus codos se separan! -The enemy attaches your wrist cuffs back together! -¡El enemigo vuelve a unir tus muñequeras! +### They are reinforced with top-quality hardened latex. + + + High-Security Armbinder Brazalete de alta seguridad -An mythril armbinder enclosing your hands and arms completely, making your hands useless. -Un brazalete de mitrilo que encierra tus manos y brazos por completo, haciendo que tus manos sean inútiles. +### An armbinder enclosing your hands and arms completely, making your hands useless. + Made of a flexible, yet durable material, it's going to be really tough to escape. Hecho de un material flexible pero duradero, será muy difícil escapar. +### High-Security Boxbinder + +### A boxbinder enclosing your hands and arms completely, making your hands useless. + +### High-Security Straitjacket + +### A straitjacket enclosing your hands and arms completely, making your hands useless. + +### High-Security Lockdown Jacket + +### This jacket made with extra straps can even be used on top of another jacket for extra security. + High-Security Legbinder Vendaje de alta seguridad An mythril legbinder enclosing your legs, making it difficult to move. Un vendaje de mitrilo que encierra tus piernas, lo que dificulta el movimiento. -Made of a flexible, yet durable material, it's going to be really tough to escape. -Hecho de un material flexible pero duradero, será muy difícil escapar. + + High-Security Shackles Grilletes de alta seguridad -A pair of mythril shackles around your feet. -Un par de grilletes de mitrilo alrededor de tus pies. +### A pair of hardened steel shackles around your feet. + Nearly indestructable, you are at the mercy of its lock. Casi indestructible, estás a merced de su bloqueo. -High-Security BallGag -BallGag de alta seguridad +### High-Security Ball Gag + A rubber gag shoved tightly between your lips. Una mordaza de goma apretada entre tus labios. -The mythril straps are nigh-unbreakable, keeping you securely silenced. -Las correas de mitrilo son casi irrompibles y te mantienen silenciado de forma segura. -Potion Absorber -Absorbedor de pociones -An ancient device that allows direct use of potions even while gagged or bound. -Un dispositivo antiguo que permite el uso directo de pociones incluso cuando está amordazado o atado. -Also allows fitting of a leash. -También permite la colocación de una correa. +### The cable-reinforced straps are nigh-unbreakable, keeping you securely silenced. + +### High-Security Muzzle + +### A secure muzzle made with cable-reinforced straps. + +### It is especially effective at keeping in other gags. + Potion Absorber Absorbedor de pociones An ancient device that allows direct use of potions even while gagged or bound. @@ -5230,40 +6724,26 @@ A pair of heels coated in a nonstick material. Un par de tacones recubiertos con un material antiadherente. They will slow you down, but you can walk on slime without getting stuck! ¡Te reducirán la velocidad, pero puedes caminar sobre limo sin quedarte atascado! -Slime Walkers -Caminantes de limo -A pair of heels coated in a nonstick material. -Un par de tacones recubiertos con un material antiadherente. -They will slow you down, but you can walk on slime without getting stuck! -¡Te reducirán la velocidad, pero puedes caminar sobre limo sin quedarte atascado! -Gloves of Dexterity -Guantes de Destreza -A pair of gloves that makes your hits strike with elven grace--and force. -Un par de guantes que hacen que tus golpes golpeen con gracia y fuerza élfica. -Increases accuracy by +50. Reduces melee damage by 30%. -Aumenta la precisión en +50. Reduce el daño cuerpo a cuerpo en un 30%. -Gloves of Dexterity -Guantes de Destreza -A pair of gloves that makes your hits strike with elven grace--and force. -Un par de guantes que hacen que tus golpes golpeen con gracia y fuerza élfica. -Increases accuracy by +50. Reduces melee damage by 30%. -Aumenta la precisión en +50. Reduce el daño cuerpo a cuerpo en un 30%. -You find a pair of leather gloves with a magic rune. -Encuentras un par de guantes de cuero con una runa mágica. -Bracers of Roaring Tides -Brazales de mareas rugientes -A pair of bracers that conjures a mighty wave upon attacking. -Un par de brazales que conjuran una poderosa ola al atacar. -Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage. -Crea una explosión retardada de AoE al atacar que aturde a los enemigos e inflige 10 de daño por ácido. -Bracers of Roaring Tides -Brazales de mareas rugientes -A pair of bracers that conjures a mighty wave upon attacking. -Un par de brazales que conjuran una poderosa ola al atacar. -Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage. -Crea una explosión retardada de AoE al atacar que aturde a los enemigos e inflige 10 de daño por ácido. -You find a pair of bracers that are transparent like water. -Encuentras un par de brazales que son transparentes como el agua. + + +### Duster Gag + +### A special gag designed for maids to be useful even while tied up! It's self-locking too! + +### Deals 0.5 tickle damage on attack and adds +30 distraction. Bonus damage vs dirt and mold. + +### Deals 0.5 tickle damage on attack and adds +30 distraction. + + + +### Gas Mask + +### A respirator designed to protect the wearer from noxious fumes. + +### +50 Poison resist. Protects against dizziness caused by sleep gas. Affects speech. + + + The curse on the RestraintName is lifted! ¡Se levanta la maldición sobre RestraintName! Press RIGHT to confirm buy! @@ -5276,12 +6756,22 @@ Press RIGHT to confirm buy! +### You find + + + + + + + + + + + -You find -Tu encuentras Collar Cuello A classy leather collar. @@ -5292,26 +6782,22 @@ Slave Collar Collar de esclavo A high-security steel collar befitting of a slave. Un collar de acero de alta seguridad propio de un esclavo. -Allows fitting of a leash. -Permite la colocación de una correa. Enchanted Collar Collar encantado A collar made with magically enchanted materials. It is difficult to cut off. Un collar hecho con materiales mágicamente encantados. Es difícil de cortar. -Allows fitting of a leash. -Permite la colocación de una correa. Kitty Collar Collar de gatito A collar made with magically enchanted materials. It is protected by the blessing of Bast. Un collar hecho con materiales mágicamente encantados. Está protegido por la bendición de Bast. -Allows fitting of a leash. -Permite la colocación de una correa. Leash Correa A leash made from a strong material. Una correa hecha de un material resistente. Functions as a handle for moving unruly prisoners. Funciona como manija para mover prisioneros rebeldes. + + Prisoner Plug Enchufe de prisionero A teaser to keep you occupied. @@ -5326,10 +6812,8 @@ Made of a highly durable material. Fabricado en un material de alta durabilidad. Blacksteel Chastity Belt Cinturón de castidad de acero negro -A chastity belt to protect prisoners from themselves. -Un cinturón de castidad para proteger a los presos de sí mismos. -Made of a highly durable material. -Fabricado en un material de alta durabilidad. + + Charms (Arms) Encantos (brazos) A band of faintly magic ribbon wrapped tight around your arms. @@ -5340,74 +6824,64 @@ Charms (Legs) Encantos (Piernas) A band of faintly magic ribbon wrapped tight around your thighs. Una banda de cinta débilmente mágica envuelta apretadamente alrededor de tus muslos. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. Charms (Feet) Encantos (pies) A band of faintly magic ribbon wrapped tight around your ankles. Una banda de cinta débilmente mágica envuelta alrededor de tus tobillos. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. Charms (Head) Encantos (Cabeza) -A band of faintly magic ribbon wrapped tight around your eyes. -Una banda de cinta débilmente mágica envuelta apretadamente alrededor de tus ojos. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. +### A band of faintly magic ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. + Charm Gag mordaza de encanto -A band of faintly magic ribbon wrapped tight around your mouth. -Una banda de cinta débilmente mágica se envolvió apretadamente alrededor de tu boca. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. +### A band of faintly magic ribbon wrapped tight over the mouth. Can be used on vulnerable targets from quick inventory or hotbar. + Charm Wrapping (Toes) Envoltura de encanto (dedos de los pies) A layer of faintly magic ribbon wrapped tight around your feet. Una capa de cinta débilmente mágica envuelta apretadamente alrededor de tus pies. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. Charm Wrapping (Head) Envoltura de amuleto (cabeza) A layer of faintly magic ribbon wrapped tight around your face. Una capa de cinta débilmente mágica envuelta apretadamente alrededor de tu cara. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. Charm Wrapping (Arms) Envoltura de dijes (brazos) A layer of faintly magic ribbon wrapped tight around your body. Una capa de cinta débilmente mágica envuelta apretadamente alrededor de tu cuerpo. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. Charm Wrapping (Feet) Envoltura de dijes (pies) A layer of faintly magic ribbon wrapped tight around your shins. Una capa de cinta débilmente mágica envuelta alrededor de tus espinillas. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. Charm Wrapping (Legs) Envoltura de encanto (piernas) A layer of faintly magic ribbon wrapped tight around your thighs. Una capa de cinta débilmente mágica envuelta alrededor de tus muslos. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. +### Living Charm Collar + +### This collar is designed to make sure its wearer does not escape their charms. + +### It will occasionally cause charms to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of charms you have on you. + Leather Panel Gag Mordaza de panel de cuero A gag that seals your lips tightly and stuffs your mouth with a ball. Una mordaza que sella tus labios herméticamente y te tapa la boca con una pelota. +### Keep your mouth to yourself! + +### Harness Panel Gag + The harness is comprehensive and it's locked in place. El arnés es completo y está bloqueado en su lugar. Harness Ball Gag Mordaza de bola de arnés A gag that stuffs your mouth with a large silicone ball. Una mordaza que te tapa la boca con una gran bola de silicona. -The harness is comprehensive and it's locked in place. -El arnés es completo y está bloqueado en su lugar. + + Bast Gag broma de líber A gag used to silence new initiates of the Bast cult. Una mordaza utilizada para silenciar a los nuevos iniciados del culto Bast. -The harness is comprehensive and it's locked in place. -El arnés es completo y está bloqueado en su lugar. Bast Muzzle Hocico Basto A muzzle used to keep a Bast gag secure. @@ -5436,50 +6910,118 @@ Bast Petsuit Petsuit Bast Enhanced suit used for select members of the Bast cult. Traje mejorado utilizado para miembros selectos del culto Bast. -It's nearly impossible to escape without help once locked inside. -Es casi imposible escapar sin ayuda una vez encerrado dentro. + + Magic Petsuit Petsuit Mágico A set of straps and buckles enchanted with a powerful spell to render you helpless. Un conjunto de correas y hebillas encantadas con un poderoso hechizo para dejarte indefenso. It's warded against cutting by nonmagic blades. Está protegido contra el corte por cuchillas no mágicas. + + +### Latex Petsuit + +### A skintight suit that encases you in a tight rubber embrace. + +### The thick latex is resistant to even the most determined struggles. + Blessed Wrappings (Head) Envolturas Bendecidas (Cabeza) -A band of magic embalming ribbon wrapped tight around your eyes. -Una banda de cinta embalsamadora mágica envuelta alrededor de tus ojos. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. +### A band of magic embalming ribbon wrapped tight around your face. + +### Blessed Wrappings (Eyes) + +### A band of magic embalming ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. + Blessed Wrappings (Gag) Envolturas benditas (mordaza) -A band of magic embalming ribbon wrapped tight around your mouth. -Una banda de cinta embalsamadora mágica envuelta alrededor de tu boca. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. +### A band of magic embalming ribbon wrapped tight over mouth. Can be used on vulnerable targets from quick inventory or hotbar. + Blessed Wrappings (Arms) Envolturas benditas (brazos) A layer of magic embalming ribbon wrapped tight around your body. Una capa de cinta embalsamadora mágica envuelta alrededor de tu cuerpo. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. Blessed Wrappings (Feet) Envolturas benditas (pies) A layer of magic embalming ribbon wrapped tight around your shins. Una capa de cinta embalsamadora mágica envuelta alrededor de tus espinillas. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. Blessed Wrappings (Toes) Envolturas benditas (dedos de los pies) A layer of magic embalming ribbon wrapped tight around your feet. Una capa de cinta embalsamadora mágica envuelta alrededor de tus pies. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. +### Blessed Wrappings (Hands) + +### A layer of magic embalming ribbon wrapped tight around your hands. + Blessed Wrappings (Legs) Envolturas Benditas (Piernas) A layer of magic embalming ribbon wrapped tight around your thighs. Una capa de cinta embalsamadora mágica envuelta alrededor de tus muslos. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -Se aferra, casi por sí solo, pero parece vulnerable tanto a los cortes como a los estiramientos. +### Living Blessed Wrappings Collar + +### This collar is designed to make sure its wearer does not escape their wrappings. + +### It will occasionally cause blessed wrappings to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of blessed wrappings you have on you. + +### Tape (Hands) + +### Sleek and shiny tape for the bondage enthusiast. + +### A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. + +### Tape (Arms) + +### Tape (Legs) + +### Tape (Feet) + +### Tape (Head) + +### Sleek and shiny tape for the bondage enthusiast. Can be used on vulnerable targets from quick inventory or hotbar. + +### Tape Gag + +### Tape Mouth Wrap + +### Tape Wrapping (Toes) + +### Tape Wrapping (Head) + +### Tape Wrapping (Arms) + +### Tape Wrapping (Feet) + +### Tape Wrapping (Legs) + +### Living Tape Collar + +### This collar is designed to make sure its wearer does not escape their tape. + +### It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. + + + +### Autotape + +### Comes in convenient cartridges for machine loading. + +### A specialized tape used for capturing purposes during the time of the Old Civilization. Despite its appearance, it contains a gas-permeable membrane that allows ventilation, while its hydrophobic properties resist solvents that would otherwise disrupt the adhesive bond. The adhesive layer is special in that it activates only in contact with other auto-tape, making it safer to use and remove. + +### Rubberized Tape + +### Magic Charms + +### Magical charms from the ancient graveyard. + +### Its magic is not enough to protect it from damage, but it is surprisingly effective at restraining both intruders and cursed entities. + +### Blessed Wrapping + +### A layer of magic embalming ribbon. + +### It clings of its own accord to intruders and naughty catgirls. + Autotape (Hands) Cinta automática (manos) Sticky tape made from a metallic material. Used to great effect in police situations. @@ -5488,154 +7030,52 @@ It's very sticky and seals your hands tightly, making any struggling ineffective Es muy pegajoso y sella tus manos herméticamente, haciendo que cualquier lucha sea ineficaz. Autotape (Head) Cinta automática (cabeza) -Sticky tape made from a metallic material. Used to great effect in police situations. -Cinta adhesiva hecha de un material metálico. Se utiliza con gran efecto en situaciones policiales. +### Sticky tape made from a metallic material. Used to great effect in police situations. Can be used on vulnerable targets from quick inventory or hotbar. + It's very sticky and tough but you could probably get a knife through it. Es muy pegajoso y resistente, pero probablemente puedas atravesarlo con un cuchillo. Autotape (Arms) Cinta automática (brazos) -Sticky tape made from a metallic material. Used to great effect in police situations. -Cinta adhesiva hecha de un material metálico. Se utiliza con gran efecto en situaciones policiales. -It's very sticky and tough but you could probably get a knife through it. -Es muy pegajoso y resistente, pero probablemente puedas atravesarlo con un cuchillo. Autotape (Legs) Cinta automática (piernas) -Sticky tape made from a metallic material. Used to great effect in police situations. -Cinta adhesiva hecha de un material metálico. Se utiliza con gran efecto en situaciones policiales. -It's very sticky and tough but you could probably get a knife through it. -Es muy pegajoso y resistente, pero probablemente puedas atravesarlo con un cuchillo. Autotape (Ankles) Autotape (Tobillos) -Sticky tape made from a metallic material. Used to great effect in police situations. -Cinta adhesiva hecha de un material metálico. Se utiliza con gran efecto en situaciones policiales. -It's very sticky and tough but you could probably get a knife through it. -Es muy pegajoso y resistente, pero probablemente puedas atravesarlo con un cuchillo. Autotape (Feet) Cinta automática (pies) -Sticky tape made from a metallic material. Used to great effect in police situations. -Cinta adhesiva hecha de un material metálico. Se utiliza con gran efecto en situaciones policiales. -It's very sticky and tough but you could probably get a knife through it. -Es muy pegajoso y resistente, pero probablemente puedas atravesarlo con un cuchillo. Autotape (Mouth) Cinta automática (boca) -Sticky tape made from a metallic material. Used to great effect in police situations. -Cinta adhesiva hecha de un material metálico. Se utiliza con gran efecto en situaciones policiales. -It's very sticky and tough but you could probably get a knife through it. -Es muy pegajoso y resistente, pero probablemente puedas atravesarlo con un cuchillo. +### Autotape (Mouth Wrap) + +### Living Auto Tape Collar + +### It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. + + + Stuffing Relleno -A stuffing of cloth. -Un relleno de tela. +### A stuffing of cloth. Can be applied on vulnerable targets or those who casted a verbal spell last turn. + You could spit it out easily, provided nothing's covering it. Podrías escupirlo fácilmente, siempre que no haya nada que lo cubra. -Arm Ropes -cuerdas de brazo -Faintly glowing ropes from a magic trap. -Cuerdas que brillan débilmente de una trampa mágica. -I wonder who was responsible? -Me pregunto quién fue el responsable. -Leg Ropes -Cuerdas para piernas -Faintly glowing ropes from a magic trap. -Cuerdas que brillan débilmente de una trampa mágica. -I wonder who was responsible? -Me pregunto quién fue el responsable. -Magic Hogtie -Hogtie mágico -It pulls your wrists up to your ankles! So tight! -¡Te tira de las muñecas hasta los tobillos! ¡Muy apretado! -The knots appear to tie themselves together again, making them impossible to undo! -¡Los nudos parecen unirse de nuevo, haciéndolos imposibles de deshacer! -Magic Arm Rope -Cuerda de brazo mágico -Strongly glowing ropes. -Cuerdas muy brillantes. -The knots appear to tie themselves together again, making them impossible to undo! -¡Los nudos parecen unirse de nuevo, haciéndolos imposibles de deshacer! -Magic Rope Cuffs -Puños de cuerda mágica -Strongly glowing ropes. -Cuerdas muy brillantes. -The knots appear to tie themselves together again, making them impossible to undo! -¡Los nudos parecen unirse de nuevo, haciéndolos imposibles de deshacer! -Magic Ropework -Cuerdas Mágicas -Strongly glowing ropes tied in an intricate pattern, making hand restraints more secure. -Cuerdas fuertemente resplandecientes atadas en un patrón intrincado, lo que hace que las restricciones de las manos sean más seguras. -The knots appear to tie themselves together again, making them impossible to undo! -¡Los nudos parecen unirse de nuevo, haciéndolos imposibles de deshacer! -Magic Leg Rope -Cuerda de pierna mágica -Strongly glowing ropes. -Cuerdas muy brillantes. -The knots appear to tie themselves together again, making them impossible to undo! -¡Los nudos parecen unirse de nuevo, haciéndolos imposibles de deshacer! -Magic Ankle Rope -Cuerda de tobillo mágica -Strongly glowing ropes. -Cuerdas muy brillantes. -The knots appear to tie themselves together again, making them impossible to undo! -¡Los nudos parecen unirse de nuevo, haciéndolos imposibles de deshacer! -Magic Crotch Rope -Cuerda mágica para la entrepierna -Strongly glowing ropes. -Cuerdas muy brillantes. -The knots appear to tie themselves together again, making them impossible to undo! -¡Los nudos parecen unirse de nuevo, haciéndolos imposibles de deshacer! -Magic Toe Rope -Cuerda del dedo del pie mágico -Strongly glowing ropes. -Cuerdas muy brillantes. -The knots appear to tie themselves together again, making them impossible to undo! -¡Los nudos parecen unirse de nuevo, haciéndolos imposibles de deshacer! -Mithril Hogtie -Corbata de mitril -It pulls your wrists up to your ankles! So tight! -¡Te tira de las muñecas hasta los tobillos! ¡Muy apretado! -Made of woven mithril and enchanted to require magic blades to cut! -¡Hecho de mithril tejido y encantado para que requiera cuchillas mágicas para cortar! -Mithril Arm Rope -Cuerda de brazo de mitril -Strongly shining ropes. -Cuerdas muy brillantes. -Made of woven mithril and enchanted to require magic blades to cut! -¡Hecho de mithril tejido y encantado para que requiera cuchillas mágicas para cortar! -Mithril Leg Rope -Cuerda de pierna de mitril -Strongly shining ropes. -Cuerdas muy brillantes. -Made of woven mithril and enchanted to require magic blades to cut! -¡Hecho de mithril tejido y encantado para que requiera cuchillas mágicas para cortar! -Mithril Ankle Rope -Tobillera de mithril -Strongly shining ropes. -Cuerdas muy brillantes. -Made of woven mithril and enchanted to require magic blades to cut! -¡Hecho de mithril tejido y encantado para que requiera cuchillas mágicas para cortar! -Mithril Crotch Rope -Cuerda de entrepierna de mitril -Strongly shining ropes. -Cuerdas muy brillantes. -Made of woven mithril and enchanted to require magic blades to cut! -¡Hecho de mithril tejido y encantado para que requiera cuchillas mágicas para cortar! -Mithril Rope Harness -Arnés de cuerda de mithril -Strongly shining ropes. -Cuerdas muy brillantes. -Made of woven mithril and enchanted to require magic blades to cut! -¡Hecho de mithril tejido y encantado para que requiera cuchillas mágicas para cortar! -Mithril Toe Rope -Cuerda de punta de mithril -Strongly shining ropes. -Cuerdas muy brillantes. -Made of woven mithril and enchanted to require magic blades to cut! -¡Hecho de mithril tejido y encantado para que requiera cuchillas mágicas para cortar! + + + + +### Living Mithril Collar + +### A collar made from an almost-weightless alloy that adjusts itself to your neck. + +### It will occasionally cause mithril to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of mithril you have on you. + Mithril Collar Collar de mitril A collar made from an almost-weightless alloy.. Un collar hecho de una aleación casi ingrávida. It feels comfortable but it's also really hard. Se siente cómodo, pero también es muy difícil. + + Mithril Cuffs Puños de mitril A pair of cuffs that make it easy to restrain you. @@ -5644,56 +7084,90 @@ They feel like they aren't even there, but the material is rigid and unyielding. Se sienten como si ni siquiera estuvieran allí, pero el material es rígido e inflexible. The enemy attaches your wrist cuffs together! ¡El enemigo te une las muñequeras! -Cuffs Wrist Chain -Cadena de muñeca de puños + + +Wrist Chain +Cadena de muñeca A pair of cuffs keeping your arms behind your back. Un par de puños que mantienen los brazos detrás de la espalda. -They feel like they aren't even there, but the material is rigid and unyielding. -Se sienten como si ni siquiera estuvieran allí, pero el material es rígido e inflexible. Your cuffs detatch! ¡Tus puños se sueltan! The enemy attaches your elbow cuffs together! ¡El enemigo une tus puños de codo juntos! -Cuffs Wrist Chain -Cadena de muñeca de puños + + +Cuffs Chain +Cadena de puños A full set of cuffs keeping your arms in a strict elbow tie! ¡Un juego completo de puños que mantienen tus brazos en una estricta corbata de codo! -They feel like they aren't even there, but the material is rigid and unyielding. -Se sienten como si ni siquiera estuvieran allí, pero el material es rígido e inflexible. Your wrists detatch, leaving your elbows still bound! ¡Tus muñecas se sueltan, dejando tus codos aún atados! -Elbow Cuffs Chain -Cadena de puños de codo -A pair of cuffs keeping your elbows locked together!. -¡Un par de puños que mantienen los codos juntos! -They feel like they aren't even there, but the material is rigid and unyielding. -Se sienten como si ni siquiera estuvieran allí, pero el material es rígido e inflexible. + + +Elbow Chain +Cadena de codo +### A pair of cuffs keeping your elbows locked together! + Your elbows detatch! ¡Tus codos se separan! The enemy attaches your wrist cuffs back together! ¡El enemigo vuelve a unir tus muñequeras! + + Mithril Leg Cuffs Puños de pierna de mitril +### A pair of cuffs on your legs. + +### The enemy attaches your leg cuffs together! + +### Thigh Chain + A pair of cuffs chaining your legs together. Un par de puños que encadenan tus piernas juntas. -They feel like they aren't even there, but the material is rigid and unyielding. -Se sienten como si ni siquiera estuvieran allí, pero el material es rígido e inflexible. +### The leg cuff chain detaches! + Mithril Ankle Cuffs Tobilleras de mitril -A pair of cuffs chaining your legs together. -Un par de puños que encadenan tus piernas juntas. -They feel like they aren't even there, but the material is rigid and unyielding. -Se sienten como si ni siquiera estuvieran allí, pero el material es rígido e inflexible. +### A pair of cuffs on your ankles. + The enemy attaches your ankle cuffs together! ¡El enemigo te une las esposas de los tobillos! -Cuffs Chain -Cadena de puños -A pair of cuffs chaining your legs together. -Un par de puños que encadenan tus piernas juntas. -They feel like they aren't even there, but the material is rigid and unyielding. -Se sienten como si ni siquiera estuvieran allí, pero el material es rígido e inflexible. +### Ankle Chain + The ankle cuff chain detaches! ¡La cadena del brazalete del tobillo se suelta! +### Your ankle cuff chain is tightened and pulls your feet together! + +### Short Ankle Chain + +### A pair of cuffs chaining your feet tightly together. + +### Your ankle cuff chain loosens! + + + +### Living Leather Collar + +### A collar made of tough leather that adjusts itself to your neck. + +### It will occasionally cause leather to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of leather you have on you. + +Leather Cuffs +Puños de cuero +### Made of tough leather. + + + + + +Leather Leg Cuffs +Puños de pierna de cuero + + +Leather Ankle Cuffs +Tobilleras de cuero + + Sticky Slime Baba pegajosa A sticky layer of slime keeping you anchored to the ground. @@ -5706,12 +7180,22 @@ A pair of tight leather mittens enclosing your hands. Un par de guantes de cuero ajustados que encierran tus manos. They make it almost impossible to manipulate keys and tools. Keep your hands to yourself! Hacen que sea casi imposible manipular llaves y herramientas. ¡Mantén tus manos en tí! +### Leather Legbinder + +### A tight leather legbinder that keeps your feet glued together. + +### It's quite snug and the laces are secured with a lockable panel. Getting at them requires picking the lock. + Leather Armbinder Brazalete de cuero A tight leather armbinder enclosing your hands and arms completely. Un brazalete de cuero ceñido que encierra tus manos y brazos por completo. It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible. Es bastante cómodo y está asegurado con hebillas bloqueables en la parte posterior. Abrir las cerraduras usted mismo es imposible. +### Leather Boxbinder + +### A secure but comfortable binder meant for long-term wear. + Leather Armbinder Harness Arnés de cuero con brazalete Leather belts securing your armbinder tightly. @@ -5720,62 +7204,110 @@ It's quite tight and secured by lockable buckles on your sides. Es bastante ajustado y está asegurado con hebillas bloqueables a los costados. The armbinder harness comes off with the armbinder. El arnés del brazalete sale con el brazalete. +### The energy link between your ankle cuffs fizzles into nothing. + +### The energy link between your arm cuffs fizzles into nothing. + +### The energy link between your thigh cuffs fizzles into nothing. + The cuff chains come off with the cuffs. Las cadenas de los puños se desprenden con los puños. +### The hogtie link comes off. + Handcuffs Esposas -A pair of steel cuffs locked securely around your wrists. -Un par de puños de acero cerrados de forma segura alrededor de tus muñecas. +### A pair of steel cuffs locked securely around your wrists. Can be applied on vulnerable targets if targeted from inventory or hotbar. + The lock doesn't seem very complicated. La cerradura no parece muy complicada. Steel Yoke Yugo de acero A steel bar clamped firmly around your wrists and neck, leaving you in a helpless position. Una barra de acero se sujetó firmemente alrededor de tus muñecas y cuello, dejándote en una posición indefensa. -This is not something you can pick by yourself... -Esto no es algo que puedas elegir por ti mismo... +### The awkward position makes it difficult to get out of alone. + +### Heavy Yoke + +### A series of armor-grade plates cut with precision machining, sandwiched into an unbreakable layer that clasps firmly in place around your neck and wrists. + +### Steel Fiddle + +### A steel fixture keeping your hands in an awkward and submissive position. + +### The awkward position prevents you from easily reaching the lock. + Leather Harness Arnés de cuero A leather harness of tight straps buckled around your torso. Un arnés de cuero de correas apretadas abrochadas alrededor de tu torso. It provides an anchor point for enemies to grab onto! ¡Proporciona un punto de anclaje para que los enemigos se agarren! +### Rubberized Harness + +### A harness made of latex polymer, resistant to most solvents and corrosion. + +### Can be worn all day! Also convenient to hold. + Ball Gag mordaza de bola -A gag made of a red squishy material. -Una mordaza hecha de un material blando rojo. +### A gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + You can't seem to enunciate your spells properly with this in. Parece que no puedes enunciar tus hechizos correctamente con esto. +### Large Ball Gag + +### A mouth-filling gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + Tight Ball Gag mordaza de bola apretada -A gag made of a red squishy material, buckled as tight as it will go. -Una mordaza hecha de un material blando rojo, abrochada tan fuerte como sea posible. -You can't seem to enunciate your spells properly with this in. -Parece que no puedes enunciar tus hechizos correctamente con esto. +### A gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + +### Huge Ball Gag + +### A massive gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + +### You absolutely can't enunciate your spells properly with this in. + Magic Ball Gag mordaza de bola mágica -A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. -Un gag encantado con magia. Crece hasta llenar tu boca por lo que apenas puedes hablar. +### A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. + It's brimming with conjured energy. A normal knife won't work here! Está rebosante de energía conjurada. ¡Un cuchillo normal no funcionará aquí! +### Anti-Magic Gag + +### A gag designed to cripple mages. It's made of a squishy rubbery material. + +### It's sealed with a magical spell that rapidly absorbs mana! When it drains 40 mana it will transform into an ordinary gag and inflate. + +### Anti-Mage Gag + +### A gag designed to cripple experienced spellcasters. It's made of a magic-absorbing rubber. + +### You feel the energy flowing out of you! When it drains 100 mana it will transform into an ordinary gag and inflate. + Ballet Heels tacones de ballet A pair of shoes with heels so tall it forces you on your toes. Un par de zapatos con tacones tan altos que te obligan a ponerte de puntillas. These will take some getting used to. Tomará un tiempo acostumbrarse. +### Training Heels + +### A pair of unreasonably high heels owned by you personally. + Leg Irons Hierros para piernas A pair of solid steel cuffs connecting your ankles inescapably. Un par de puños de acero sólido que conectan tus tobillos de forma inevitable. -The lock doesn't seem very complicated. -La cerradura no parece muy complicada. Blindfold Venda A leather strap secured onto your face and blocking vision. Una correa de cuero asegurada en su cara y bloqueando la visión. You can still see through the gap around your nose. Todavía puedes ver a través del espacio alrededor de tu nariz. + + Magic Chastity Belt Cinturón de castidad mágico A belt protected by a magic seal. @@ -5786,20 +7318,14 @@ Steel Chastity Belt Cinturón de castidad de acero A cruel device used for locking magical vibrators in place. Un dispositivo cruel utilizado para bloquear vibradores mágicos en su lugar. -The shields will open up to accept new toys, but won't let them out... -Los escudos se abrirán para aceptar nuevos juguetes, pero no los dejarán salir... Blacksteel Belt Cinturón de acero negro -A cruel device used for locking magical vibrators in place. -Un dispositivo cruel utilizado para bloquear vibradores mágicos en su lugar. Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. Blacksteel es un metal utilizado por la Antigua Civilización. Es muy difícil de rascar, y mucho menos de cortar. Blacksteel Bra Sujetador de acero negro A cruel device used for locking magical massagers in place. Un dispositivo cruel utilizado para bloquear masajeadores mágicos en su lugar. -Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. -Blacksteel es un metal utilizado por la Antigua Civilización. Es muy difícil de rascar, y mucho menos de cortar. Prototype Belt Cinturón prototipo A strange device built using unknown technology. @@ -5808,22 +7334,16 @@ The lock is extremely advanced, and the ports at the bottom readily accept toys La cerradura es extremadamente avanzada, y los puertos en la parte inferior aceptan fácilmente juguetes pero no los dejan salir... Steel Chastity Bra Sujetador de castidad de acero -A cruel device used for locking magical massagers in place. -Un dispositivo cruel utilizado para bloquear masajeadores mágicos en su lugar. It won't stop the dungeon's little curses, but will keep you from removing them. No detendrá las pequeñas maldiciones de la mazmorra, pero evitará que las elimines. Ornate Chastity Belt Cinturón de castidad adornado -A cruel device used for locking magical vibrators in place. -Un dispositivo cruel utilizado para bloquear vibradores mágicos en su lugar. The lock won't come off until the magic wears off in time... El candado no se soltará hasta que la magia desaparezca a tiempo... Ornate Chastity Bra Sujetador de castidad adornado -A cruel device used for locking magical massagers in place. -Un dispositivo cruel utilizado para bloquear masajeadores mágicos en su lugar. -The lock won't come off until the magic wears off in time... -El candado no se soltará hasta que la magia desaparezca a tiempo... + + Maid Chastity Belt Cinturón de castidad de sirvienta A chastity belt used to maintain control over initiate maids. @@ -5834,220 +7354,102 @@ Magic Egg Huevo Mágico An energetic little friend that likes to tease you. Un pequeño amigo enérgico al que le gusta burlarse de ti. -It is charged by residual magic from your spells. -Se carga con la magia residual de tus hechizos. +### It is charged by residual magic from your spells. Type: Teasing + Prototype Egg Huevo Prototipo A teaser that periodically vibrates. Un teaser que vibra periódicamente. -High efficiency mana conversion means longer tease duration. -La conversión de maná de alta eficiencia significa una mayor duración de provocación. +### High efficiency mana conversion means longer tease duration. Type: Teasing, Pleasure, Edging + Vibrating Plug Enchufe vibrante A sizeable plug that makes you happy... a little too happy. Un complemento considerable que te hace feliz... un poco demasiado feliz. -It vibrates periodically and allows orgasms. -Vibra periódicamente y permite los orgasmos. +### It vibrates periodically and adds distraction when moving. Type: Pleasure + Teaser Plug Enchufe teaser A sizeable plug that will tease you but never let you go... Un complemento considerable que te molestará pero nunca te dejará ir... -It vibrates weakly periodically. -Vibra débilmente periódicamente. +### It vibrates weakly periodically. Type: Teasing, Denial + Torment Plug Tapón de tormento A sizeable plug that will make your life unbearably pleasurable... Un plug de gran tamaño que hará tu vida insoportablemente placentera... -It vibrates strongly periodically and has a denial setting. -Vibra fuertemente periódicamente y tiene una configuración de negación. +### It vibrates strongly periodically and has a denial setting. Type: Denial + Thundering Plug Enchufe atronador -A sizeable plug that will make your life unbearably pleasurable... -Un plug de gran tamaño que hará tu vida insoportablemente placentera... -Enjoy it while you can. -Disfrútalo mientras puedas. +### Enjoy it while you can. Type: Pleasure, Edging + Intense Training Plug Enchufe de entrenamiento intenso An energetic plug that will make your life unbearably pleasurable... Un complemento energético que hará tu vida insoportablemente placentera... -You're going to have the time of your life. -Vas a tener el mejor momento de tu vida. +### You're going to have the time of your life. Type: Pleasure, and lots of it + Rear Vibrating Plug Plug vibrador trasero A device that attacks from multiple angles. Un dispositivo que ataca desde múltiples ángulos. -An enjoyable experience. -Una experiencia agradable. +### An enjoyable experience. Type: Edging + Maid Egg Huevo de sirvienta An energetic little friend that likes to tease you and takes orders from the head maid. Una amiguita enérgica a la que le gusta bromear contigo y recibe órdenes de la doncella principal. -It is charged by residual magic from your spells. -Se carga con la magia residual de tus hechizos. -Stainless Plug -Tapón de acero inoxidable +### It is charged by residual magic from your spells. Type: Teasing, Edging + +### Stainless Plug (F) + A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... Un enchufe pesado que no vibra, pero que sin duda lo notarás caminando... This one goes in the front. Este va por delante. -Stainless Plug -Tapón de acero inoxidable -A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... -Un enchufe pesado que no vibra, pero que sin duda lo notarás caminando... +### Stainless Plug (R) + This one goes in the back. Este va en la parte de atrás. + + Shadow Hand Gag Mordaza de mano de sombra It clasps tightly over the mouth and prevents you from casting your spells! ¡Se cierra con fuerza sobre la boca y evita que lances tus hechizos! You have no choice but to struggle. No tienes más remedio que luchar. +### Shadow Hand Eyes + +### Shadow hands clasped over your eyes, making it hard to see. + Shadow Hands (Legs) Manos sombrías (piernas) They are wrapped around your legs! ¡Están envueltos alrededor de tus piernas! -You have no choice but to struggle. -No tienes más remedio que luchar. -Shadow Hands (Legs) -Manos sombrías (piernas) -They are wrapped around your legs! -¡Están envueltos alrededor de tus piernas! -You have no choice but to struggle. -No tienes más remedio que luchar. -Shadow Hands (Arms) -Manos sombrías (brazos) -They are squeezing you tightly! -¡Te están apretando fuerte! -You have no choice but to struggle. -No tienes más remedio que luchar. + + Shadow Hands (Arms) Manos sombrías (brazos) They are squeezing you tightly! ¡Te están apretando fuerte! -You have no choice but to struggle. -No tienes más remedio que luchar. + + Shadow Hands (Feet) Manos sombrías (pies) They are holding your feet together! ¡Están sosteniendo tus pies juntos! -You have no choice but to struggle. -No tienes más remedio que luchar. + + Shadow Hands... Manos de sombra... They are holding your... uh... Están reteniendo tu... eh... -You have no choice but to struggle. -No tienes más remedio que luchar. -Wrist Rope -cuerda de muñeca -A box tie keeping your arms secured behind your back. -Una corbata de caja que mantiene los brazos asegurados detrás de la espalda. -The ropes squeeze you gently. -Las cuerdas te aprietan suavemente. -Rope Cuffs -Puños de cuerda -A quick tie for apprehending prisoners. -Un lazo rápido para aprehender prisioneros. -It's not very secure. -No es muy seguro. -Intricate Ropework -Cuerda intrincada -A quick tie for apprehending prisoners, looped through buckles on the hand restraints. -Una corbata rápida para aprehender a los prisioneros, enrollada a través de hebillas en las restricciones de mano. -It's not very secure. -No es muy seguro. -Rope Hogtie -Corbata de cuerda -A very strict and tight hogtie, good for subduing unruly captives. -Un hogtie muy estricto y apretado, bueno para someter a los cautivos rebeldes. -It's very secure. You tug on the rope connecting your feet and struggle. -Es muy seguro. Tiras de la cuerda que conecta tus pies y luchas. -Rope Belt -cinturón de cuerda -A harness acting as a handle to pull you around -Un arnés que actúa como un asa para tirar de ti -The ropes squeeze you gently. -Las cuerdas te aprietan suavemente. -Rope Harness -Arnés de cuerda -A harness that secures your other restraints and makes them tighter. -Un arnés que asegura sus otras restricciones y las hace más apretadas. -The ropes squeeze you gently. -Las cuerdas te aprietan suavemente. -Crotch Rope -Cuerda de entrepierna -A tight rope impressing upon your most private areas... -Una cuerda floja imprimiendo en tus zonas más íntimas... -The ropes squeeze you gently. -Las cuerdas te aprietan suavemente. -Wrist Rope -cuerda de muñeca -A wrist and elbow tie keeping your arms secured behind your back. -Una corbata de muñeca y codo mantiene sus brazos asegurados detrás de su espalda. -The ropes squeeze you gently. -Las cuerdas te aprietan suavemente. -Leg Ropes -Cuerdas para piernas -A tie that hobbles your legs together.. -Una corbata que cojea tus piernas juntas.. -The ropes squeeze you gently. -Las cuerdas te aprietan suavemente. -Ankle Ropes -cuerdas de tobillo -A tie keeping your feet secured together. -Una corbata que mantiene los pies asegurados juntos. -The ropes squeeze you gently. -Las cuerdas te aprietan suavemente. -Holy Wrist Rope -Cuerda de muñeca sagrada -A box tie keeping your arms secured behind your back. -Una corbata de caja que mantiene los brazos asegurados detrás de la espalda. -They are aware of your movements... -Son conscientes de tus movimientos... -Holy Rope Cuffs -Puños de cuerda sagrada -A quick tie for apprehending prisoners. -Un lazo rápido para aprehender prisioneros. -They are aware of your movements... -Son conscientes de tus movimientos... -Holy Ropework -Cuerda sagrada -A quick tie for apprehending prisoners, looped through buckles and fasteners. -Una corbata rápida para aprehender prisioneros, abrochada a través de hebillas y sujetadores. -They are aware of your movements... -Son conscientes de tus movimientos... -Holy Rope Harness -Arnés de cuerda sagrada -A harness acting as a handle to pull you around -Un arnés que actúa como un asa para tirar de ti -They are aware of your movements... -Son conscientes de tus movimientos... -Holy Crotch Rope -Cuerda de entrepierna sagrada -A tight rope impressing upon your most private areas... -Una cuerda floja imprimiendo en tus zonas más íntimas... -They are aware of your movements... -Son conscientes de tus movimientos... -Holy Wrist Rope -Cuerda de muñeca sagrada -A wrist and elbow tie keeping your arms secured behind your back. -Una corbata de muñeca y codo mantiene sus brazos asegurados detrás de su espalda. -They are aware of your movements... -Son conscientes de tus movimientos... -Holy Leg Ropes -Cuerdas para piernas sagradas -A tie that hobbles your legs together.. -Una corbata que cojea tus piernas juntas.. -They are aware of your movements... -Son conscientes de tus movimientos... -Holy Ankle Ropes -Cuerdas de tobillo sagradas -A tie keeping your feet secured together. -Una corbata que mantiene los pies asegurados juntos. -They are aware of your movements... -Son conscientes de tus movimientos... -Wrist Vines -Enredaderas de muñeca + + +Wrist Vines +Enredaderas de muñeca A box tie keeping your arms secured behind your back. Una corbata de caja que mantiene los brazos asegurados detrás de la espalda. The vines twitch as they try to wrap around tighter. @@ -6056,32 +7458,34 @@ Vine Harness Arnés de vid A harness acting as a handle to pull you around Un arnés que actúa como un asa para tirar de ti -The vines twitch as they try to wrap around tighter. -Las enredaderas se contraen mientras intentan envolverse más apretadas. Leg Vines Enredaderas de piernas A tie that hobbles your legs together.. Una corbata que cojea tus piernas juntas.. -The vines twitch as they try to wrap around tighter. -Las enredaderas se contraen mientras intentan envolverse más apretadas. Ankle Vines Enredaderas de tobillo A tie keeping your feet secured together. Una corbata que mantiene los pies asegurados juntos. -The vines twitch as they try to wrap around tighter. -Las enredaderas se contraen mientras intentan envolverse más apretadas. -Quik-Bind Cuffs -Puños Quik-Bind -A set of high-security cuffs that are both restrictive and quick to apply. -Un conjunto de puños de alta seguridad que son a la vez restrictivos y rápidos de aplicar. -It uses a twelve-disc detainer lock. -Utiliza una cerradura de retención de doce discos. + + +### High-Security Cuffs + +### A set of irish-8-style cuffs that are both restrictive and quick to apply. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +### It uses a standard lock rather than a simple one. + Wolfbinder enlazador de lobos A sophisticated training system used to keep wolfgirls from scratching their owners. Un sofisticado sistema de entrenamiento utilizado para evitar que las chicas lobo rasguñen a sus dueños. Despite the harsh position, it is padded, breathable, and suitable for long term wear. A pesar de la posición dura, es acolchado, transpirable y adecuado para uso prolongado. +### Wolf Queenbinder + +### This was made to be used during a coup attempt. Unfortunately, its creator ended up wearing it instead, after the coup's failure. + +### Designed to hold the queen of wolves helpless for an indefinite period of time. + Smart Training Cuffs Puños de entrenamiento inteligentes Cuffs with a feature to punish the wearer if they act aggressively. @@ -6090,8 +7494,6 @@ They are solid metal and will be hard to remove without the key. Son de metal sólido y serán difíciles de quitar sin la llave. Linked Smart Cuffs Puños inteligentes enlazados -Cuffs with a feature to punish the wearer if they act aggressively. -Puños con una característica para castigar al usuario si actúa agresivamente. Looks like you got yourself in trouble. Parece que te metiste en problemas. Training Harness @@ -6100,6 +7502,12 @@ A harness that keeps a wolfgirl's suit together. It makes escaping more difficul Un arnés que mantiene unido el traje de una chica lobo. Hace que escapar sea más difícil. While it is weatherproof and rugged, its straps are merely nylon. Si bien es resistente a la intemperie y resistente, sus correas son simplemente de nailon. +### Training Mittens + +### When wolfgirls won't keep those pesky claws in line, these will make sure she can't cause too much trouble. + +### Made from strong reinforced fabric, your claws won't do anything to these mittens. + Training Gag mordaza de entrenamiento A gag used to prevent wolfgirls from biting their owners. @@ -6108,20 +7516,28 @@ It is reinforced with steel cables, so getting it off will be tricky. Está reforzado con cables de acero, por lo que sacarlo será complicado. Training Collar Collar de entrenamiento -A collar used to keep unruly wolfgirls in check. -Un collar usado para mantener a raya a las chicas lobo rebeldes. -If it works on them, it sure as heck works on you. -Si funciona en ellos, seguro que funciona en ti. +### A collar with a decorative tag used to identify wolfgirls. + +### Also good for identifying people in general. What a great idea! + Training Leash correa de entrenamiento A leash used for training pets. Una correa utilizada para entrenar mascotas. It is a steel cable with a weatherproof rubber coating, and a convenient handle. Es un cable de acero con un revestimiento de goma resistente a la intemperie y un mango conveniente. +### Magical Leash + +### A leash made of magical energy, linked to a submissive's collar. + +### Very difficult to break unless you have a strong magical blade. + Your ankle cuffs snap together on their own! ¡Tus puños de tobillo se unen solos! Your ankle cuffs detach! ¡Tus tobillos se sueltan! + + Asylum Muzzle Bozal de asilo The nurses use this on noisy patients! @@ -6140,72 +7556,58 @@ This legbinder will keep the patient from kicking the nurses. Este vendaje evitará que el paciente patee a las enfermeras. It has both laces and straps. Tiene cordones y correas. + + Asylum Ankle Cuffs Puños de tobillo de asilo A pair of chained cuffs made of reinforced leather. They make patients easier to catch. Un par de puños encadenados hechos de cuero reforzado. Hacen que los pacientes sean más fáciles de atrapar. They can be thrown from long distances. Se pueden lanzar desde largas distancias. -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! -Cuffs Chain -Cadena de puños -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -Un par de puños encadenados hechos de cuero reforzado. Hacen que los pacientes sean más fáciles de atrapar. -They can be thrown from long distances. -Se pueden lanzar desde largas distancias. -The ankle cuff chain detaches! -¡La cadena del brazalete del tobillo se suelta! + + Asylum Leg Cuffs Esposas para piernas de asilo -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -Un par de puños encadenados hechos de cuero reforzado. Hacen que los pacientes sean más fáciles de atrapar. -They can be thrown from long distances. -Se pueden lanzar desde largas distancias. -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! + + +### They are made of a steel alloy. + + + Transport Jacket Chaqueta de transporte This jacket goes over a straitjacket to keep the arms trapped. Esta chaqueta va sobre una camisa de fuerza para mantener los brazos atrapados. It makes it extraordinarily difficult to escape the jacket it covers. Hace que sea extraordinariamente difícil escapar de la chaqueta que cubre. + + +### Living Asylum Collar + +### A collar made of tough cowhide that adjusts itself to your neck. + +### It will occasionally cause asylum gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of asylum gear you have on you. + Asylum Cuffs Puños de asilo A pair of leather cuffs that make it easy to restrain you. Un par de puños de cuero que facilitan sujetarlo. They're made of tough cowhide. Están hechos de cuero de vaca resistente. -The enemy attaches your wrist cuffs together! -¡El enemigo te une las muñequeras! -Wrist Chain -Cadena de muñeca + + A pair of leather cuffs keeping your arms behind your back. Un par de puños de cuero que mantienen los brazos detrás de la espalda. -They're made of tough cowhide. -Están hechos de cuero de vaca resistente. -Your cuffs detatch! -¡Tus puños se sueltan! -The enemy attaches your elbow cuffs together! -¡El enemigo une tus puños de codo juntos! -Wrist Chain -Cadena de muñeca + + A full set of leather cuffs keeping your arms in a strict elbow tie! ¡Un juego completo de puños de cuero que mantienen tus brazos en una estricta corbata de codo! -They're made of tough cowhide. -Están hechos de cuero de vaca resistente. -Your wrists detatch, leaving your elbows still bound! -¡Tus muñecas se sueltan, dejando tus codos aún atados! -Elbow Chain -Cadena de codo + + A pair of leather cuffs keeping your elbows locked together!. ¡Un par de puños de cuero que mantienen los codos juntos! -They're made of tough cowhide. -Están hechos de cuero de vaca resistente. -Your elbows detatch! -¡Tus codos se separan! -The enemy attaches your wrist cuffs back together! -¡El enemigo vuelve a unir tus muñequeras! + + Comfy Muzzle Bozal cómodo A lovely muzzle that's extraordinarily comfy! @@ -6218,42 +7620,78 @@ A straitjacket that is padded on the inside. Una camisa de fuerza que está acolchada por dentro. It feels tight but is actually made of an ethereal material... Se siente apretado, pero en realidad está hecho de un material etéreo... + + Latex Jacket Chaqueta de látex -A tight jacket that holds your arms completely useless. -Una chaqueta ajustada que sujeta tus brazos completamente inútiles. -It has too much grip to struggle out of -Tiene demasiado agarre para luchar fuera +### A tight jacket that keeps your arms completely useless. + +### It has too much grip to struggle out of, but is made of a fragile material. + +### Secure Latex Jacket + +### This straitjacket has extra straps and buckles to make sure you won't be struggling out of it. + Latex Armbinder Brazalete de látex -A tight armbinder that pins your arms tightly behind your back -Un brazalete apretado que sujeta tus brazos firmemente detrás de tu espalda. -It has too much grip to struggle out of -Tiene demasiado agarre para luchar fuera +### A tight armbinder that pins your arms tightly behind your back, enclosed completely. + +### Latex Boxbinder + Latex Legbinder Faja de látex A tight legbinder that keeps your legs together! ¡Una faja ceñida que mantiene las piernas juntas! -It has too much grip to struggle out of -Tiene demasiado agarre para luchar fuera Latex Boots Botas de látex A tight pair of boots that makes it difficult to walk! ¡Un par de botas ajustadas que dificultan caminar! -It has too much grip to struggle out of -Tiene demasiado agarre para luchar fuera Heavy Latex Corset corsé de látex pesado -An excruciatingly tight corset that hugs your body -Un corsé insoportablemente apretado que abraza tu cuerpo. -It has too much grip to struggle out of -Tiene demasiado agarre para luchar fuera -Latex Catsuit -Catsuit de látex +### An excruciatingly tight corset that hugs your body, with straps securing your other restraints. + A skintight suit that's stretched on tight. It adheres to latex restraints making struggling more difficult. Un traje ceñido que se estira sobre apretado. Se adhiere a las restricciones de látex, lo que dificulta la lucha. Blue latex is silky smooth, very stretchy, and very good at adhering to itself. El látex azul es suave como la seda, muy elástico y se adhiere muy bien a sí mismo. +### Heavy Latex Catsuit + +### A skintight suit that's stretched on tight and made of thick latex. It adheres to latex restraints making struggling more difficult. + +### Blue latex is silky smooth, very stretchy, and very good at adhering to itself. Its thickness makes it particularly resistant to cutting. + +### Latex Mittens + +### A pair of mittens keep your hands out of trouble. They adhere to latex restraints making struggling more difficult. + +### Latex Cube + +### A gelatinous cube that engulfed you at some point in the past. + +### It seems quite content staying where it is. + +### Slime Bubble + +### A squishy and sticky bubble that you can't get out of! + +### It will slow you down severely but can be popped if you can reach a knife... + +### Latex Sphere + +### A giant inflatable sphere that compresses you and leaves you helpless... + +### You can't see out of it nor can you control its movement. If only you could puncture it! + +### Latex Ball Suit + +### A giant inflatable sphere that leaves you rolling around... + +### Your movement is severely hampered, limited to feeble wiggling... + +### Bubble + +### A squishy bubble that you can't get out of! + Scale Boxtie Binder Carpeta Boxtie a escala A secure but comfortable binder meant for long-term wear by long-term prisoners of the Dragonhearts. @@ -6266,70 +7704,52 @@ A set of straps buckling tightly around your body and secured at the wrists. Un conjunto de correas que se abrochan firmemente alrededor de su cuerpo y se aseguran en las muñecas. It's made from hard-to-cut dragonscale!!! ¡¡¡Está hecho de escamas de dragón difíciles de cortar!!! +### Dragon Queen Straps + +### A sturdy harness completely immobilizes your arms and torso. Made to be used on a queen of dragons. + +### It's made from reinforced dragonscale!!! + Scale Leg Cuffs Puños de pierna de escala A pair of chained cuffs made of dragonscale. They slow your stride. Un par de puños encadenados hechos de escamas de dragón. Retrasan tu paso. -It's made from hard-to-cut dragonscale!!! -¡¡¡Está hecho de escamas de dragón difíciles de cortar!!! Scale Ankle Cuffs Tobilleras a escala -A pair of chained cuffs made of dragonscale. They slow your stride. -Un par de puños encadenados hechos de escamas de dragón. Retrasan tu paso. -It's made from hard-to-cut dragonscale!!! -¡¡¡Está hecho de escamas de dragón difíciles de cortar!!! -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! Scale Cuffs Chain Cadena de puños de escamas -A pair of chained cuffs made of dragonscale. They slow your stride. -Un par de puños encadenados hechos de escamas de dragón. Retrasan tu paso. -It's made from hard-to-cut dragonscale!!! -¡¡¡Está hecho de escamas de dragón difíciles de cortar!!! -The ankle cuff chain detaches! -¡La cadena del brazalete del tobillo se suelta! Dragonscale Boots Botas de escamas de dragón A pair of extremely high heels lined with dragonscale. They are hard to walk in. Un par de tacones extremadamente altos forrados con escamas de dragón. Son difíciles de caminar. -It's made from hard-to-cut dragonscale!!! -¡¡¡Está hecho de escamas de dragón difíciles de cortar!!! Dragonscale Gag Mordaza de escamas de dragón A gag made of a squishy material and secured with dragonscale straps. Una mordaza hecha de un material blando y asegurada con correas de escamas de dragón. -It's made from hard-to-cut dragonscale!!! -¡¡¡Está hecho de escamas de dragón difíciles de cortar!!! Dragonscale Muzzle Bozal de escamas de dragón A muzzle to keep ball gags pressed firmly into the mouth. Un bozal para mantener las mordazas de bola presionadas firmemente en la boca. -It's made from hard-to-cut dragonscale!!! -¡¡¡Está hecho de escamas de dragón difíciles de cortar!!! Dragon Collar Collar de dragón A collar owned by the Dragonhearts, an order of dragonslayers. Un collar propiedad de Dragonhearts, una orden de cazadores de dragones. -It's made from hard-to-cut dragonscale!!! -¡¡¡Está hecho de escamas de dragón difíciles de cortar!!! + + Steel Cuffs Puños de acero A pair of steel cuffs that make it easy to restrain you. Un par de esposas de acero que facilitan sujetarlo. They're made of shining steel. Están hechos de acero brillante. -The enemy attaches your wrist cuffs together! -¡El enemigo te une las muñequeras! + + Steel Wrist Chain Cadena de muñeca de acero A pair of steel cuffs keeping your arms behind your back. Un par de puños de acero que mantienen los brazos detrás de la espalda. -They're made of shining steel. -Están hechos de acero brillante. -Your cuffs detatch! -¡Tus puños se sueltan! -The enemy attaches your elbow cuffs together! -¡El enemigo une tus puños de codo juntos! + + Magnetic Cuffs Puños magnéticos A pair of bulky cuffs with coils visible on the inside... @@ -6338,132 +7758,86 @@ They have no visible attachment points... No tienen puntos de unión visibles... The electric damage causes your cuffs to attach together! ¡El daño eléctrico hace que sus puños se adhieran! + + Magnetic Link Enlace magnético The magnetic cuffs are rigidly attached! ¡Los puños magnéticos están unidos rígidamente! They won't budge! There's a button to release them but it's hard to reach... ¡No se moverán! Hay un botón para soltarlos, pero es difícil de alcanzar... -Your cuffs detatch! -¡Tus puños se sueltan! + + Magnetic Ankle Cuffs Tobilleras magnéticas A pair of bulky leg irons with coils visible on the inside. Un par de grilletes voluminosos con espirales visibles en el interior. -They have no visible attachment points... -No tienen puntos de unión visibles... The electric damage causes your ankle cuffs to snap together! ¡El daño eléctrico hace que las tobilleras se rompan! -Magnetic Link -Enlace magnético -The magnetic cuffs are rigidly attached! -¡Los puños magnéticos están unidos rígidamente! -They won't budge! There's a button to release them but it's hard to reach... -¡No se moverán! Hay un botón para soltarlos, pero es difícil de alcanzar... + + Your ankle cuffs detatch! ¡Tus tobillos se sueltan! -Leather Ankle Cuffs -Tobilleras de cuero -A pair of chained cuffs made of leather. They make it trickier to run away. -Un par de puños encadenados hechos de cuero. Hacen que sea más difícil huir. -They're made of tough cowhide. -Están hechos de cuero de vaca resistente. -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! -Cuffs Chain -Cadena de puños -A pair of chained cuffs made of leather. They make it trickier to run away. -Un par de puños encadenados hechos de cuero. Hacen que sea más difícil huir. -They're made of tough cowhide. -Están hechos de cuero de vaca resistente. -The ankle cuff chain detaches! -¡La cadena del brazalete del tobillo se suelta! -Leather Leg Cuffs -Puños de pierna de cuero -A pair of chained cuffs made of leather. They make it trickier to run away. -Un par de puños encadenados hechos de cuero. Hacen que sea más difícil huir. -They're made of tough cowhide. -Están hechos de cuero de vaca resistente. -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! -Leather Cuffs -Puños de cuero -A pair of leather cuffs that make it easy to restrain you. -Un par de puños de cuero que facilitan sujetarlo. -They're made of tough cowhide. -Están hechos de cuero de vaca resistente. -The enemy attaches your wrist cuffs together! -¡El enemigo te une las muñequeras! -Lthr Wrist Chain -Cadena de muñeca Lthr -A pair of leather cuffs keeping your arms behind your back. -Un par de puños de cuero que mantienen los brazos detrás de la espalda. -They're made of tough cowhide. -Están hechos de cuero de vaca resistente. -Your cuffs detatch! -¡Tus puños se sueltan! -The enemy attaches your elbow cuffs together! -¡El enemigo une tus puños de codo juntos! -Lthr Wrist Chain -Cadena de muñeca Lthr -A full set of leather cuffs keeping your arms in a strict elbow tie! -¡Un juego completo de puños de cuero que mantienen tus brazos en una estricta corbata de codo! -They're made of tough cowhide. -Están hechos de cuero de vaca resistente. -Your wrists detatch, leaving your elbows still bound! -¡Tus muñecas se sueltan, dejando tus codos aún atados! -Lthr Elbow Chain -Cadena de codo Lthr -A pair of leather cuffs keeping your elbows locked together!. -¡Un par de puños de cuero que mantienen los codos juntos! -They're made of tough cowhide. -Están hechos de cuero de vaca resistente. -Your elbows detatch! -¡Tus codos se separan! -The enemy attaches your wrist cuffs back together! -¡El enemigo vuelve a unir tus muñequeras! + + + + +### Living Blacksteel Collar + +### A collar made of a hardened steel alloy, chemically treated as to be stainless that adjusts itself to your neck. + +### It will occasionally cause blacksteel to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of blacksteel you have on you. + +Blacksteel Cuffs +Puños de acero negro +### They are made of a hardened steel alloy, chemically treated as to be stainless. + + + + + +Blacksteel Leg Cuffs +Puños de pierna de acero negro + + +Blacksteel Ankle Cuffs +Tobilleras de acero negro + + + + + + + + Dragonscale Cuffs Puños de escamas de dragón -A pair of cuffs that make it easy to restrain you. -Un par de puños que facilitan sujetarlo. -They're made of dragonscale. -Están hechos de escamas de dragón. -The enemy attaches your wrist cuffs together! -¡El enemigo te une las muñequeras! -Scale Wrist Chain -Cadena de muñeca de escala -A pair of cuffs keeping your arms behind your back. -Un par de puños que mantienen los brazos detrás de la espalda. -They're made of dragonscale. -Están hechos de escamas de dragón. -Your cuffs detatch! -¡Tus puños se sueltan! -The enemy attaches your elbow cuffs together! -¡El enemigo une tus puños de codo juntos! -Scale Wrist Chain -Cadena de muñeca de escala -A full set of cuffs keeping your arms in a strict elbow tie! -¡Un juego completo de puños que mantienen tus brazos en una estricta corbata de codo! -They're made of dragonscale. -Están hechos de escamas de dragón. -Your wrists detatch, leaving your elbows still bound! -¡Tus muñecas se sueltan, dejando tus codos aún atados! -Scale Elbow Chain -Cadena de codo de escala -A pair of cuffs keeping your elbows locked together!. -¡Un par de puños que mantienen los codos juntos! -They're made of dragonscale. -Están hechos de escamas de dragón. -Your elbows detatch! -¡Tus codos se separan! -The enemy attaches your wrist cuffs back together! -¡El enemigo vuelve a unir tus muñequeras! +### They are made from leather cured from the hide of dragons. + + + + + +### Dragonscale Leg Cuffs + +### Dragonscale Ankle Cuffs + + + + + Maid Jacket Chaqueta de sirvienta A bolero jacket keeping your arms pinned snugly. You can't even move them. Una chaqueta bolero que mantiene tus brazos sujetos cómodamente. Ni siquiera puedes moverlos. There is no hope of struggling out. Better hope you can cut it... No hay esperanza de luchar. Mejor espero que puedas cortarlo... +### Maid Punishment Jacket + +### A bolero straitjacket made for unruly maids. It is extra secure and locked tightly. + +### There is no hope of struggling out. Better get back to work... + Devious Maid Costume Disfraz de sirvienta tortuosa A devious maid outfit that forces the arms into an elbows-touching position. @@ -6476,240 +7850,222 @@ A leather belt used to keep your legs hobbled. Un cinturón de cuero usado para mantener las piernas cojas. It's made of a very tough reinforced leather. It will take some time to cut. Está hecho de un cuero reforzado muy resistente. Tomará algún tiempo para cortar. -Steel Cuffs -Puños de acero -A pair of steel cuffs used by the Maidforce. -Un par de esposas de acero usadas por Maidforce. -They are made of solid steel. -Están hechos de acero sólido. -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! -Linked Steel Cuffs -Puños de acero enlazados +### Maid Cuffs + A pair of steel cuffs used by the Maidforce. Un par de esposas de acero usadas por Maidforce. They are made of solid steel. Están hechos de acero sólido. -The ankle cuff chain detaches! -¡La cadena del brazalete del tobillo se suelta! +### Maid Cuff Link + Maid Collar Collar de sirvienta A collar for operatives of the Maidforce, a group of covert saboteurs. Un collar para agentes de Maidforce, un grupo de saboteadores encubiertos. It's reinforced with metal and guarded with an expert-level lock. Está reforzado con metal y protegido con un candado de nivel experto. -Plug Gag -mordaza de enchufe +### Maid Gag + A gag with a long, mouth-filling plug that muffles speech completely. Una mordaza con un tapón largo que llena la boca y amortigua el habla por completo. -It's made of a very tough reinforced leather. It will take some time to cut. -Está hecho de un cuero reforzado muy resistente. Tomará algún tiempo para cortar. +### Maid Security Gag + +### A muzzle with a long, mouth-filling plug that muffles speech completely. + +### Reinforced and secured with a disc lock to ensure unruly maids don't skip their duty. + Suspicious Mask Máscara sospechosa -You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. -Tienes una venda de metal acolchada que brilla magníficamente, junto con un extraño cristal a su lado. A well-fitted mask, covering your entire head neatly and locking in place. Una máscara bien ajustada, que cubra toda la cabeza de manera ordenada y que se bloquee en su lugar. -It has eyeholes for you to see out of, but blocks access to the face. +It has eyeholes for you to somewhat see out of, but blocks access to the face. Tiene orificios para los ojos para que puedas ver, pero bloquea el acceso a la cara. + + +### Happy Face + +### Just put on a happy face and enjoy it. + +### Sensory Hood + +### A well-fitted hood that covers your head and muffles sounds. + +### No eyeholes. Integrated blindfold and gag. Total darkness. + +### Sensory Mask + +### A well-fitted mask that covers your face and muffles sounds. + +### Shadow Heels + +### A set of impractical heels that clasp around your ankles. They make it hard to walk. + +### The material is stronger than leather, and flexes to make struggling difficult. + +### Shadow Jacket + +### A tight straitjacket made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Its grip encases you tightly, but the material is weaker than most metals. + +### Black Hole Jacket + +### Like a black hole, anything that is caught in this jacket has no chance to escape its grasp. + +### Shadow Armbinder + +### A tight armbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Black Hole Armbinder + +### Like a black hole, anything that is caught in this armbinder has no chance to escape its grasp. + +### Shadow Boxbinder + +### A tight boxbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Black Hole Boxbinder + +### Like a black hole, anything that is caught in this boxbinder has no chance to escape its grasp. + +### Shadow Legbinder + +### A tight legbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Shadow Latex Petsuit + +### A tight petsuit made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Obsidian Yoke + +### A yoke made from shining obsidian, stars glittering in the darkness. It pins your arms uselessly at your sides. + +It's made of a dark, glistening volcanic metal. +Está hecho de un metal volcánico oscuro y reluciente. + + Obsidian Muzzle Bozal de obsidiana A muzzle made from segmented metal pieces, fitting securely over your face. Un bozal hecho de piezas de metal segmentadas, que se ajusta de forma segura sobre tu cara. -It's made of a dark, glistening volcanic metal. -Está hecho de un metal volcánico oscuro y reluciente. + + Obsidian Collar Collar de obsidiana A collar made from a warm, shining alloy. Un collar hecho de una aleación cálida y brillante. -It's made of a dark, glistening volcanic metal. -Está hecho de un metal volcánico oscuro y reluciente. + + +### Living Obsidian Collar + +### A collar made of a dark, shiny metal that adjusts itself to your neck. You can't help but hear whispering since it is so tight. + +### It will occasionally cause obsidian to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of obsidian you have on you. + Obsidian Cuffs Puños de obsidiana -A pair of cuffs that make it easy to restrain you. -Un par de puños que facilitan sujetarlo. -It's made of a dark, glistening volcanic metal. -Está hecho de un metal volcánico oscuro y reluciente. -The enemy attaches your wrist cuffs together! -¡El enemigo te une las muñequeras! -Obs. Wrist Chain -Obs. Cadena de muñeca -A pair of cuffs keeping your arms behind your back. -Un par de puños que mantienen los brazos detrás de la espalda. -It's made of a dark, glistening volcanic metal. -Está hecho de un metal volcánico oscuro y reluciente. -Your cuffs detatch! -¡Tus puños se sueltan! -The enemy attaches your elbow cuffs together! -¡El enemigo une tus puños de codo juntos! -Obs. Wrist Chain -Obs. Cadena de muñeca -A full set of cuffs keeping your arms in a strict elbow tie! -¡Un juego completo de puños que mantienen tus brazos en una estricta corbata de codo! -It's made of a dark, glistening volcanic metal. -Está hecho de un metal volcánico oscuro y reluciente. -Your wrists detatch, leaving your elbows still bound! -¡Tus muñecas se sueltan, dejando tus codos aún atados! -Obs. Elbow Chain -Obs. Cadena de codo -A pair of cuffs keeping your elbows locked together!. -¡Un par de puños que mantienen los codos juntos! -It's made of a dark, glistening volcanic metal. -Está hecho de un metal volcánico oscuro y reluciente. -Your elbows detatch! -¡Tus codos se separan! -The enemy attaches your wrist cuffs back together! -¡El enemigo vuelve a unir tus muñequeras! +### It's made of a dark, shiny metal. If you hold it close you hear whispering. + + + + + Obsidian Leg Cuffs Puños de pierna de obsidiana -A pair of cuffs chaining your legs together. -Un par de puños que encadenan tus piernas juntas. -It's made of a dark, glistening volcanic metal. -Está hecho de un metal volcánico oscuro y reluciente. + + Obsidian Ankle Cuffs Tobilleras de obsidiana -A pair of cuffs chaining your legs together. -Un par de puños que encadenan tus piernas juntas. -It's made of a dark, glistening volcanic metal. -Está hecho de un metal volcánico oscuro y reluciente. -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! -Cuffs Chain -Cadena de puños -A pair of cuffs chaining your legs together. -Un par de puños que encadenan tus piernas juntas. -It's made of a dark, glistening volcanic metal. -Está hecho de un metal volcánico oscuro y reluciente. -The ankle cuff chain detaches! -¡La cadena del brazalete del tobillo se suelta! + + +### Living Crystal Collar + +### A collar made of a glowing, brittle material that adjusts itself to your neck. You feel your energy flowing into it... + +### It will occasionally cause crystal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of crystal you have on you. + Crystal Cuffs Puños de cristal -A pair of cuffs that make it easy to restrain you. -Un par de puños que facilitan sujetarlo. -It's made of a glowing, brittle material. -Está hecho de un material brillante y quebradizo. -The enemy attaches your wrist cuffs together! -¡El enemigo te une las muñequeras! -Crystal Wrist Chain -Cadena de muñeca de cristal -A pair of cuffs keeping your arms behind your back. -Un par de puños que mantienen los brazos detrás de la espalda. -It's made of a glowing, brittle material. -Está hecho de un material brillante y quebradizo. -Your cuffs detatch! -¡Tus puños se sueltan! -The enemy attaches your elbow cuffs together! -¡El enemigo une tus puños de codo juntos! -Crystal Wrist Chain -Cadena de muñeca de cristal -A full set of cuffs keeping your arms in a strict elbow tie! -¡Un juego completo de puños que mantienen tus brazos en una estricta corbata de codo! -It's made of a glowing, brittle material. -Está hecho de un material brillante y quebradizo. -Your wrists detatch, leaving your elbows still bound! -¡Tus muñecas se sueltan, dejando tus codos aún atados! -Crystal Elbow Chain -Cadena de codo de cristal -A pair of cuffs keeping your elbows locked together!. -¡Un par de puños que mantienen los codos juntos! -It's made of a glowing, brittle material. -Está hecho de un material brillante y quebradizo. -Your elbows detatch! -¡Tus codos se separan! -The enemy attaches your wrist cuffs back together! -¡El enemigo vuelve a unir tus muñequeras! +### It's made of a glowing, brittle material. You feel your energy flowing into it... + + + + + Crystal Leg Cuffs Puños de pierna de cristal -A pair of cuffs chaining your legs together. -Un par de puños que encadenan tus piernas juntas. -It's made of a glowing, brittle material. -Está hecho de un material brillante y quebradizo. + + Crystal Ankle Cuffs Tobilleras de cristal -A pair of cuffs chaining your legs together. -Un par de puños que encadenan tus piernas juntas. -It's made of a glowing, brittle material. -Está hecho de un material brillante y quebradizo. -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! -Cuffs Chain -Cadena de puños -A pair of cuffs chaining your legs together. -Un par de puños que encadenan tus piernas juntas. -It's made of a glowing, brittle material. -Está hecho de un material brillante y quebradizo. -The ankle cuff chain detaches! -¡La cadena del brazalete del tobillo se suelta! -Slave Cuffs -Puños de esclavo -A pair of cuffs that make it easy to restrain you. -Un par de puños que facilitan sujetarlo. -It's made of a gold-tinted metal with a magical enchantment. -Está hecho de un metal dorado con un encantamiento mágico. -The enemy attaches your wrist cuffs together! -¡El enemigo te une las muñequeras! -Slave Wrist Chain -Cadena de muñeca esclava -A pair of cuffs keeping your arms behind your back. -Un par de puños que mantienen los brazos detrás de la espalda. + + +### Living Ice Collar + +### A collar made of enchanted ice that adjusts itself to your neck. It won't melt on their own, and the ice chills you to the bone... + +### It will occasionally cause ice to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ice you have on you. + +### Ice Cuffs + +### They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... + + + +A pair of cuffs keeping your elbows locked together!. +¡Un par de puños que mantienen los codos juntos! + + +### Ice Leg Cuffs + +### Ice Ankle Cuffs + + + +### Living Slave Collar + +### A collar made of a gold-tinted metal with a magical enchantment that adjusts itself to your neck. + +### It will occasionally cause slave gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slave gear you have on you. + +Slave Cuffs +Puños de esclavo It's made of a gold-tinted metal with a magical enchantment. Está hecho de un metal dorado con un encantamiento mágico. -Your cuffs detatch! -¡Tus puños se sueltan! -The enemy attaches your elbow cuffs together! -¡El enemigo une tus puños de codo juntos! + + Slave Wrist Chain Cadena de muñeca esclava -A full set of cuffs keeping your arms in a strict elbow tie! -¡Un juego completo de puños que mantienen tus brazos en una estricta corbata de codo! -It's made of a gold-tinted metal with a magical enchantment. -Está hecho de un metal dorado con un encantamiento mágico. -Your wrists detatch, leaving your elbows still bound! -¡Tus muñecas se sueltan, dejando tus codos aún atados! + + Slave Elbow Chain Cadena de codo esclavo -A pair of cuffs keeping your elbows locked together!. -¡Un par de puños que mantienen los codos juntos! -It's made of a gold-tinted metal with a magical enchantment. -Está hecho de un metal dorado con un encantamiento mágico. -Your elbows detatch! -¡Tus codos se separan! -The enemy attaches your wrist cuffs back together! -¡El enemigo vuelve a unir tus muñequeras! + + Slave Leg Cuffs Esposas de pierna de esclavo -A pair of cuffs chaining your legs together. -Un par de puños que encadenan tus piernas juntas. -It's made of a gold-tinted metal with a magical enchantment. -Está hecho de un metal dorado con un encantamiento mágico. Slave Ankle Cuffs Tobilleras de esclavo -A pair of cuffs chaining your legs together. -Un par de puños que encadenan tus piernas juntas. -It's made of a gold-tinted metal with a magical enchantment. -Está hecho de un metal dorado con un encantamiento mágico. -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! Slave Cuffs Chain Cadena de puños de esclavo -A pair of cuffs chaining your legs together. -Un par de puños que encadenan tus piernas juntas. -It's made of a gold-tinted metal with a magical enchantment. -Está hecho de un metal dorado con un encantamiento mágico. -The ankle cuff chain detaches! -¡La cadena del brazalete del tobillo se suelta! + + High-Tech Gag Mordaza de alta tecnología A gag with a soft and filling mouthpiece, reinforced with a metallized strap. Una mordaza con una boquilla suave y llenadora, reforzada con una correa metalizada. It will be impossible to force it out or cut it with just a knife. Será imposible forzarlo o cortarlo con solo un cuchillo. + + Nylon Plug Gag Mordaza de nailon A gag with a soft and filling mouthpiece, kept in place by an adjustable nylon strap. Una mordaza con una boquilla suave y abundante, sujeta por una correa de nailon ajustable. It will be impossible to force it out, but can be cut. Será imposible forzarlo, pero se puede cortar. + + High-Tech Cables (Arms) Cables de alta tecnología (brazos) Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! @@ -6718,34 +8074,26 @@ They are wrapped methodically around your body! ¡Se envuelven metódicamente alrededor de tu cuerpo! High-Tech Cables (Legs) Cables de alta tecnología (patas) -Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! -Cables fabricados en polifibra metalizada autoajustable. ¡Impermeable a los bordes de acero! -They are wrapped methodically around your body! -¡Se envuelven metódicamente alrededor de tu cuerpo! High-Tech Cables (Harness) Cables de alta tecnología (arnés) -Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! -Cables fabricados en polifibra metalizada autoajustable. ¡Impermeable a los bordes de acero! -They are wrapped methodically around your body! -¡Se envuelven metódicamente alrededor de tu cuerpo! + + Nylon Cables (Arms) Cables de nailon (brazos) Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. Cables hechos de polímero de nylon. Muy fuerte y autoajustable, pero vulnerable a los bordes afilados. -They are wrapped methodically around your body! -¡Se envuelven metódicamente alrededor de tu cuerpo! Nylon Cables (Legs) Cables de nailon (patas) -Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. -Cables hechos de polímero de nylon. Muy fuerte y autoajustable, pero vulnerable a los bordes afilados. -They are wrapped methodically around your body! -¡Se envuelven metódicamente alrededor de tu cuerpo! Nylon Cables (Harness) Cables de nailon (arnés) -Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. -Cables hechos de polímero de nylon. Muy fuerte y autoajustable, pero vulnerable a los bordes afilados. -They are wrapped methodically around your body! -¡Se envuelven metódicamente alrededor de tu cuerpo! + + +Magic Ribbons +Cintas Mágicas +### Magically sealed ribbons to teach intruders a lesson. + +### The magic is powerful enough to ward off most blades, creating a true predicament for one who is trapped by these. + Magic Ribbons (Arms) Cintas mágicas (brazos) Those ribbons will hold you tight~ @@ -6754,40 +8102,28 @@ I've put a magic seal in that bow-knot to keep it secure! ¡He puesto un sello mágico en ese moño para mantenerlo seguro! Magic Ribbons (Legs) Cintas Mágicas (Piernas) -Those ribbons will hold you tight~ -Esas cintas te sostendrán fuerte ~ -I've put a magic seal in that bow-knot to keep it secure! -¡He puesto un sello mágico en ese moño para mantenerlo seguro! Magic Ribbons (Feet) Cintas mágicas (pies) -Those ribbons will hold you tight~ -Esas cintas te sostendrán fuerte ~ -I've put a magic seal in that bow-knot to keep it secure! -¡He puesto un sello mágico en ese moño para mantenerlo seguro! Magic Ribbons (Harness) Cintas mágicas (arnés) -Those ribbons will hold you tight~ -Esas cintas te sostendrán fuerte ~ -I've put a magic seal in that bow-knot to keep it secure! -¡He puesto un sello mágico en ese moño para mantenerlo seguro! Magic Ribbons (Pelvis) Cintas mágicas (pelvis) -Those ribbons will hold you tight~ -Esas cintas te sostendrán fuerte ~ -I've put a magic seal in that bow-knot to keep it secure! -¡He puesto un sello mágico en ese moño para mantenerlo seguro! Magic Ribbons (Mittens) Cintas Mágicas (Mitones) -Those ribbons will hold you tight~ -Esas cintas te sostendrán fuerte ~ They are wrapped tightly around your hands with a bow knot! ¡Se envuelven firmemente alrededor de tus manos con un nudo de lazo! Magic Ribbons (Gag) Cintas mágicas (mordaza) -Those ribbons will hold you tight~ -Esas cintas te sostendrán fuerte ~ They are wrapped tightly around your mouth with a bow knot! ¡Se envuelven firmemente alrededor de tu boca con un nudo de lazo! +### Living Ribbon Collar + +### This collar is designed to make sure its wearer does not escape the ribbons. + +### It will occasionally cause ribbons to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ribbons you have on you. + + + Ice (Arms) Hielo (brazos) Frigid restraints made out of ice. @@ -6796,22 +8132,18 @@ There's no way to remove it without breaking it off. No hay manera de quitarlo sin romperlo. Ice (Mouth) Hielo (Boca) -Frigid restraints made out of ice. -Restricciones gélidas hechas de hielo. -There's no way to remove it without breaking it off. -No hay manera de quitarlo sin romperlo. +### Ice Ball Gag (Mouth) + +### A cold sphere of magic ice lodged firmly in your mouth. + +### The work of a kinky elemental. It will melt! Eventually. + Ice (Body) Hielo (Cuerpo) -Frigid restraints made out of ice. -Restricciones gélidas hechas de hielo. -There's no way to remove it without breaking it off. -No hay manera de quitarlo sin romperlo. Ice (Legs) Hielo (Piernas) -Frigid restraints made out of ice. -Restricciones gélidas hechas de hielo. -There's no way to remove it without breaking it off. -No hay manera de quitarlo sin romperlo. + + Glue (Feet) Pegamento (Pies) A latex-derived glue that attaches you to the floor! It's very stretchy. @@ -6820,16 +8152,10 @@ Just touching it makes it stick all over... Solo tocarlo hace que se pegue por todas partes... Glue (Ankles) Pegamento (Tobillos) -A latex-derived glue that attaches you to the floor! It's very stretchy. -¡Un pegamento derivado del látex que te adhiere al piso! Es muy elástico. -Just touching it makes it stick all over... -Solo tocarlo hace que se pegue por todas partes... Glue (Legs) Pegamento (Piernas) -A latex-derived glue that attaches you to the floor! It's very stretchy. -¡Un pegamento derivado del látex que te adhiere al piso! Es muy elástico. -Just touching it makes it stick all over... -Solo tocarlo hace que se pegue por todas partes... + + Slime (Feet) Baba (pies) Sticky slime that adheres to your body. It reacts negatively to mana... @@ -6838,172 +8164,132 @@ It is an organic material that reforms around every cut you make! ¡Es un material orgánico que se reforma alrededor de cada corte que haces! Slime (Ankles) Baba (tobillos) -Sticky slime that adheres to your body. It reacts negatively to mana... -Baba pegajosa que se adhiere a tu cuerpo. Reacciona negativamente al maná... -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! Slime (Legs) Baba (Piernas) -Sticky slime that adheres to your body. It reacts negatively to mana... -Baba pegajosa que se adhiere a tu cuerpo. Reacciona negativamente al maná... -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! Slime (Arms) Baba (brazos) -Sticky slime that adheres to your body. It reacts negatively to mana... -Baba pegajosa que se adhiere a tu cuerpo. Reacciona negativamente al maná... -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! Slime (Hands) limo (manos) -Sticky slime that adheres to your body. It reacts negatively to mana... -Baba pegajosa que se adhiere a tu cuerpo. Reacciona negativamente al maná... -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! Slime (Mouth) Baba (Boca) -Sticky slime that adheres to your body. It reacts negatively to mana... -Baba pegajosa que se adhiere a tu cuerpo. Reacciona negativamente al maná... -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! Slime (Head) limo (cabeza) -Sticky slime that adheres to your body. It reacts negatively to mana... -Baba pegajosa que se adhiere a tu cuerpo. Reacciona negativamente al maná... -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! +### Living Slime Collar + +### This collar is designed to make sure its wearer does not escape their slime. + +### It will occasionally cause slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slime you have on you. + + + +### Made from hardened slime. + +### The classic smooth, shiny material for full encasement. + +### A semi-organic substance of alchemical origin. + +### It has a mind of its own, and tends to spread if not properly contained. + +### Proto Rubber + +### Made from hardened proto rubber. + +### A hardened form of the essence of latex. + +### Proto Slime + +### Alchemical rubber in its simplest form. Amorphous. + +### Often forms strange growths, seeking damsels to encase. + Rubber (Feet) Patas de goma) -Sticky rubber that has fused itself into a shell around your body. -Goma pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. +### Sticky rubber that has fused itself into a skintight layer. + There's no struggling out now, but since it's solid it may be cuttable. No hay problemas ahora, pero dado que es sólido, puede cortarse. Rubber (Ankles) Caucho (Tobillos) -Sticky rubber that has fused itself into a shell around your body. -Goma pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. Rubber (Legs) Caucho (Piernas) -Sticky rubber that has fused itself into a shell around your body. -Goma pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. Rubber (Arms) Goma (Brazos) -Sticky rubber that has fused itself into a shell around your body. -Goma pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. Rubber (Hands) Caucho (Manos) -Sticky rubber that has fused itself into a shell around your body. -Goma pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. Rubber (Mouth) Goma (Boca) -Sticky rubber that has fused itself into a shell around your body. -Goma pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. Rubber (Head) Goma (cabeza) -Sticky rubber that has fused itself into a shell around your body. -Goma pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. +### Living Rubber Collar + +### This collar is designed to make sure its wearer does not escape their rubber. + +### It will occasionally cause rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. + + + + + Proto-Slime (Feet) Proto-Limo ​​(Pies) It seems to be a precursor to the slimes everyone is familiar with? ¿Parece ser un precursor de los limos con los que todos están familiarizados? -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! Proto-Slime (Ankles) Proto-Limo ​​(Tobillos) -It seems to be a precursor to the slimes everyone is familiar with? -¿Parece ser un precursor de los limos con los que todos están familiarizados? -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! Proto-Slime (Legs) Proto-Limo ​​(Piernas) -It seems to be a precursor to the slimes everyone is familiar with? -¿Parece ser un precursor de los limos con los que todos están familiarizados? -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! Proto-Slime (Arms) Proto-limo (brazos) -It seems to be a precursor to the slimes everyone is familiar with? -¿Parece ser un precursor de los limos con los que todos están familiarizados? -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! Proto-Slime (Hands) Proto-Limo ​​(Manos) -It seems to be a precursor to the slimes everyone is familiar with? -¿Parece ser un precursor de los limos con los que todos están familiarizados? -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! Proto-Slime (Mouth) Proto-Limo ​​(Boca) -It seems to be a precursor to the slimes everyone is familiar with? -¿Parece ser un precursor de los limos con los que todos están familiarizados? -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! Proto-Slime (Head) Proto-Limo ​​(Cabeza) -It seems to be a precursor to the slimes everyone is familiar with? -¿Parece ser un precursor de los limos con los que todos están familiarizados? -It is an organic material that reforms around every cut you make! -¡Es un material orgánico que se reforma alrededor de cada corte que haces! +### Living Proto-Slime Collar + +### This collar is designed to make sure its wearer does not escape the slime. + +### It will occasionally cause proto-slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-slime you have on you. + + + Proto-Rubber (Feet) Proto-caucho (pies) -Sticky slime that has fused itself into a shell around your body. -Baba pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. +### Sticky slime that has fused itself into a skintight layer. + Proto-Rubber (Ankles) Proto-Caucho (Tobillos) -Sticky slime that has fused itself into a shell around your body. -Baba pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. Proto-Rubber (Legs) Proto-Caucho (Piernas) -Sticky slime that has fused itself into a shell around your body. -Baba pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. Proto-Rubber (Arms) Proto-caucho (brazos) -Sticky slime that has fused itself into a shell around your body. -Baba pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. Proto-Rubber (Hands) Proto-Caucho (Manos) -Sticky slime that has fused itself into a shell around your body. -Baba pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. Proto-Rubber (Mouth) Proto-caucho (boca) -Sticky slime that has fused itself into a shell around your body. -Baba pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. Proto-Rubber (Head) Proto-caucho (cabeza) -Sticky slime that has fused itself into a shell around your body. -Baba pegajosa que se ha fusionado en un caparazón alrededor de tu cuerpo. -There's no struggling out now, but since it's solid it may be cuttable. -No hay problemas ahora, pero dado que es sólido, puede cortarse. +### Living Proto-Rubber Collar + +### This collar is designed to make sure its wearer does not escape the rubber. + +### It will occasionally cause proto-rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-rubber you have on you. + +### Sticky Tape + +### Extra-strength utility tape, for your secure packaging needs. + +### It's quite sticky, the adhesive requires some force to get off. + Tape Mittens Manoplas de cinta Sticky tape that holds your hands into a fist! ¡Cinta adhesiva que sujeta tus manos en un puño! It's tough to get out of without some kind of grip! ¡Es difícil salir sin algún tipo de agarre! + + Arm Chains Cadenas de brazo Heavy chains keeping your arms securely behind your back. @@ -7014,68 +8300,46 @@ Leg Chains Cadenas para piernas Heavy chains keeping your legs firmly hobbled. Cadenas pesadas que mantienen tus piernas firmemente cojeadas. -It doesn't look like a knife is up to the task... -No parece que un cuchillo esté a la altura... Ankle Chains cadenas de tobillo Heavy chains keeping your feet bound together. Pesadas cadenas que mantienen los pies atados. -It doesn't look like a knife is up to the task... -No parece que un cuchillo esté a la altura... Crotch Chain Cadena de entrepierna Heavy chains that serve as an anchor point around your waist. Pesadas cadenas que sirven como punto de anclaje alrededor de tu cintura. -It doesn't look like a knife is up to the task... -No parece que un cuchillo esté a la altura... + + Magic Arm Chains Cadenas de brazos mágicos Magic chains keeping your arms securely behind your back. Cadenas mágicas que mantienen tus brazos seguros detrás de tu espalda. -It doesn't look like a knife is up to the task... -No parece que un cuchillo esté a la altura... Magic Leg Chains Cadenas mágicas para piernas Magic chains keeping your legs firmly hobbled. Cadenas mágicas que mantienen tus piernas firmemente cojeadas. -It doesn't look like a knife is up to the task... -No parece que un cuchillo esté a la altura... Magic Ankle Chains Tobilleras Mágicas Magic chains keeping your feet bound together. Cadenas mágicas que mantienen los pies atados. -It doesn't look like a knife is up to the task... -No parece que un cuchillo esté a la altura... Magic Crotch Chain Cadena de entrepierna mágica Magic chains that serve as an anchor point around your waist. Cadenas mágicas que sirven como punto de anclaje alrededor de tu cintura. -It doesn't look like a knife is up to the task... -No parece que un cuchillo esté a la altura... + + Shadow Chains (Arms) Cadenas de sombra (brazos) Black chains for those who cross the divines Cadenas negras para aquellos que cruzan los divinos -It doesn't look like a knife is up to the task... -No parece que un cuchillo esté a la altura... Shadow Chains (Legs) Cadenas de sombra (piernas) -Black chains for those who cross the divines -Cadenas negras para aquellos que cruzan los divinos -It doesn't look like a knife is up to the task... -No parece que un cuchillo esté a la altura... Shadow Chains (Ankles) Cadenas de sombra (tobillos) -Black chains for those who cross the divines -Cadenas negras para aquellos que cruzan los divinos -It doesn't look like a knife is up to the task... -No parece que un cuchillo esté a la altura... Shadow Chain Cadena de sombra -Black chains for those who cross the divines -Cadenas negras para aquellos que cruzan los divinos -It doesn't look like a knife is up to the task... -No parece que un cuchillo esté a la altura... + + Ectoplasmic Chains (Arms) Cadenas ectoplasmáticas (brazos) Ghostly chains from a ghost that just doesn't want to let go. @@ -7084,28 +8348,12 @@ It's made of an ethereal substance. Está hecho de una sustancia etérea. Ectoplasmic Chains (Legs) Cadenas Ectoplasmáticas (Piernas) -Ghostly chains from a ghost that just doesn't want to let go. -Cadenas fantasmales de un fantasma que simplemente no quiere soltarse. -It's made of an ethereal substance. -Está hecho de una sustancia etérea. Ectoplasmic Chains (Ankles) Cadenas Ectoplasmáticas (Tobillos) -Ghostly chains from a ghost that just doesn't want to let go. -Cadenas fantasmales de un fantasma que simplemente no quiere soltarse. -It's made of an ethereal substance. -Está hecho de una sustancia etérea. Ectoplasmic Chain Cadena ectoplasmática -Ghostly chains from a ghost that just doesn't want to let go. -Cadenas fantasmales de un fantasma que simplemente no quiere soltarse. -It's made of an ethereal substance. -Está hecho de una sustancia etérea. -Divine Cuffs -Puños divinos -It is said that even heaven has its hierarchies... -Se dice que hasta el cielo tiene sus jerarquías... -Shining cuffs made of holy metal. Nothing can touch it. -Puños brillantes hechos de metal sagrado. Nada puede tocarlo. + + Divine Cuffs Puños divinos It is said that even heaven has its hierarchies... @@ -7114,58 +8362,54 @@ Shining cuffs made of holy metal. Nothing can touch it. Puños brillantes hechos de metal sagrado. Nada puede tocarlo. Divine Muzzle Bozal Divino -It is said that even heaven has its hierarchies... -Se dice que hasta el cielo tiene sus jerarquías... +### Keep those lips sealed. + A shining muzzle made of holy metal. Nothing can touch it. Un hocico brillante hecho de metal sagrado. Nada puede tocarlo. -Blindfold -Venda +### Divine Gag + +### A shining gag made of holy metal. Nothing can touch it. + A piece of cloth secured onto your face and blocking vision. Un trozo de tela asegurado en su cara y bloqueando la visión. -You can still see through the gap around your nose. -Todavía puedes ver a través del espacio alrededor de tu nariz. +### Cleave Gag + +### A piece of cloth forced between your lips. + +On its own it's not very restrictive. +Por sí solo no es muy restrictivo. +### Thick Cleave Gag + +### A piece of cloth that makes it hard to speak. + +### It's somewhat effective. + Knotted Cloth Gag Mordaza de tela anudada A piece of cloth tied in a knot and tied over your mouth. Un trozo de tela atado en un nudo y atado sobre la boca. -On its own it's not very restrictive. -Por sí solo no es muy restrictivo. +### It's pretty effective at keeping you quiet. + OTN Cloth Gag Mordaza de tela OTN A piece of cloth tightened over your mouth. Un trozo de tela apretado sobre tu boca. -On its own it's not very restrictive. -Por sí solo no es muy restrictivo. -Blindfold -Venda A scarf secured onto your face and blocking vision. Una bufanda asegurada en tu cara y bloqueando la visión. -You can still see through the gap around your nose. -Todavía puedes ver a través del espacio alrededor de tu nariz. Scarf Gag Bufanda de mordaza A scarf tightened over your mouth. Una bufanda apretada sobre tu boca. -On its own it's not very restrictive. -Por sí solo no es muy restrictivo. Scarf Tie Corbata Bufanda A scarf wrapped around your body. Una bufanda envuelta alrededor de tu cuerpo. -On its own it's not very restrictive. -Por sí solo no es muy restrictivo. Scarf Leg Tie Corbata de la pierna de la bufanda -A scarf wrapped around your body. -Una bufanda envuelta alrededor de tu cuerpo. -On its own it's not very restrictive. -Por sí solo no es muy restrictivo. Scarf Ankle Tie Bufanda Corbata De Tobillo -A scarf wrapped around your body. -Una bufanda envuelta alrededor de tu cuerpo. -On its own it's not very restrictive. -Por sí solo no es muy restrictivo. + + Arm Belts cinturones de brazo A ludicrous amount of belts secured with a buckle. @@ -7174,84 +8418,104 @@ Lockable and fully adjustable to ensure snugness. Bloqueable y totalmente ajustable para garantizar la comodidad. Leg Belts Cinturones de pierna -A ludicrous amount of belts secured with a buckle. -Una ridícula AMOUNT de cinturones asegurados con una hebilla. -Lockable and fully adjustable to ensure snugness. -Bloqueable y totalmente ajustable para garantizar la comodidad. Ankle Belts Cinturones de tobillo -A ludicrous amount of belts secured with a buckle. -Una ridícula AMOUNT de cinturones asegurados con una hebilla. -Lockable and fully adjustable to ensure snugness. -Bloqueable y totalmente ajustable para garantizar la comodidad. -Wrist Cuffs -Puños de muñeca -Heavy shackles with a rudimentary lock. -Grilletes pesados ​​con un candado rudimentario. -You could pick these with a hairpin. -Podrías recogerlos con una horquilla. -Shackles -Grilletes -Heavy shackles with a rudimentary lock. -Grilletes pesados ​​con un candado rudimentario. -You could pick these with a hairpin. -Podrías recogerlos con una horquilla. -Leg Shackles -grilletes de pierna -Heavy shackles with a rudimentary lock. -Grilletes pesados ​​con un candado rudimentario. + + +### Iron Cuffs + +### Tough shackles with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. + You could pick these with a hairpin. Podrías recogerlos con una horquilla. -Ankle Shackles -grilletes de tobillo +### Iron Shackles + +### Tough shackles with a rudimentary lock. + +### Tough to walk in. + +### Thumbcuffs + +### Interferes with the use of your hands. + +### Another layer of restriction. + +### Hinged Handcuffs + +### Hinged cuffs with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +### Difficult to unlock, let alone pick by yourself. + +### Heavy Handcuffs + +### A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +### The position is too awkward to free yourself, even with a key... + +### Heavy Leg Irons + +### A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. + +### The position is awkward, but it's on your feet so you can remove them yourself if you have free hands. + +### Thigh Shackles + Heavy shackles with a rudimentary lock. Grilletes pesados ​​con un candado rudimentario. -You could pick these with a hairpin. -Podrías recogerlos con una horquilla. +### The enemy attaches your leg shackles together! + +### Linked Thigh Shackles + +### The leg shackles chain detaches! + Ankle Shackles grilletes de tobillo -The enemy attaches your ankle cuffs together! -¡El enemigo te une las esposas de los tobillos! -Heavy shackles with a rudimentary lock. -Grilletes pesados ​​con un candado rudimentario. -You could pick these with a hairpin. -Podrías recogerlos con una horquilla. -The ankle cuff chain detaches! -¡La cadena del brazalete del tobillo se suelta! +### Linked Ankle Shackles + +### The enemy attaches your ankle shackles together! + +### The ankle shackles chain detaches! + Steel Muzzle Bozal de acero A heavy muzzle with a rudimentary lock. Un bozal pesado con una cerradura rudimentaria. You could pick this with a hairpin. Podrías elegir esto con una horquilla. +### Blacksteel Muzzle + +### A heavy duty steel muzzle with a flexible metal locking pin and straps. + +### Perfect for sealing away those unruly lips. + + + + + Cursed Collar Collar maldito A cold steel collar locked tightly on your neck. Un frío collar de acero se cerró con fuerza en tu cuello. It appears to attract additional enemies to its wearer. Parece atraer enemigos adicionales a su portador. + + Face Rostro Head Cabeza Mouth Boca -Mouth -Boca -Mouth -Boca Ears Orejas -Collar -Cuello Neck Cuello Arms Brazos Hands Manos -Torso -Torso +### Torso + Bra Bien Belt @@ -7262,60 +8526,60 @@ Vibe Onda Piercings Perforaciones -Nipples -pezones Butt Plug enchufe trasero Legs Piernas Ankles tobillos -Feet -Pies Device Dispositivo + + You found an item that was too small to see! ¡Encontraste un artículo que era demasiado pequeño para verlo! -You picked up XXX gold. -Recogiste XXX oro. + + +### You pick up XXX gold. + You retrieve an ancient power crystal. Recuperas un cristal de poder antiguo. You retrieve a spent ancient power crystal. Recuperas un cristal de poder antiguo gastado. You pick up a magical amulet and use it to boost your stats. Recoges un amuleto mágico y lo usas para aumentar tus estadísticas. -You picked up a knife. -Cogiste un cuchillo. -You picked up a torch. -Cogiste una antorcha. +### You pick up a Leyline Map. + +### You pick up a knife. + +### You pick up a torch. + You found a bundle of discarded knives! ¡Encontraste un paquete de cuchillos desechados! -You picked up an enchanted knife. -Cogiste un cuchillo encantado. -You picked up a magic knife. -Cogiste un cuchillo mágico. -You picked up a lockpick. -Cogiste una ganzúa. -You picked up a normal key. -Cogiste una llave normal. -You picked up a green key. -Cogiste una llave verde. -You picked up a blue key. -Cogiste una llave azul. -You picked up a willpower potion. -Has recogido una poción de fuerza de voluntad. -You picked up a glowing blue mana potion. -Has recogido una poción de maná azul brillante. -You picked up a glowing blue orb. -Has recogido un orbe azul brillante. -You picked up an invisibility potion. -Has recogido una poción de invisibilidad. -You picked up a handful of ectoplasm. -Recogiste un puñado de ectoplasma. -You picked up a green stamina potion. -Has recogido una poción de resistencia verde. -You picked up a frigid white potion. -Cogiste una poción blanca helada. +### You pick up a magic knife. + +### You pick up a lockpick. + +### You pick up a normal key. + +### You pick up a green key. + +### You pick up a blue key. + +### You pick up a willpower potion. + +### You pick up a glowing blue mana potion. + +### You pick up a glowing blue orb. + +### You pick up an invisibility potion. + +### You pick up a handful of ectoplasm. + +### You pick up a green stamina potion. + +### You pick up a frigid white potion. + You found a peculiar note on the ground and keep it in your journal. Encontraste una nota peculiar en el suelo y la guardas en tu diario. You found an uninteresting note on the ground. @@ -7336,12 +8600,44 @@ You pick up a magical ice cube. Recoges un cubo de hielo mágico. You find some treated hemp rope. Encuentras una cuerda de cáñamo tratado. + + +Feather +Pluma +### A feather taken from some large fluffy being. + +### Deals tickle damage. Greatly distracting. Offhand: +1 tickle damage on attack for 3 stamina. Greatly distracting. + You pick up a feather. Recoges una pluma. + + +### Maid's Feather Duster + +### An instrument used extensively by maidforce agents carrying out their duties. + +### Deals tickle damage. Distracts enemies. Offhand: +15 distraction on attack for 1 stamina. + +### You pick up a feather duster. + + + +### Rope Rune + +### You smash the rune in front of you, and a flash of light enchants nearby ropes! + +### It feels tantalizing to look at. + +### Allows you to enchant ropes into more powerful restraints. + +### You pick up a kinky trinket with a glowing red sigil. + You pick up a heavy flail. Recoges un mayal pesado. You pick up a shortspear. Recoges una lanza corta. +### You pick up a long spear. + You pick up a pickaxe. Recoges un pico. You pick up an enchanted sword. @@ -7360,18 +8656,18 @@ You pick up a powerful axe. Recoges un hacha poderosa. You pick up a consumable smoke bomb. Recoges una bomba de humo consumible. -You picked up a stone trinket with a glowing red sigil. -Recogiste una baratija de piedra con un sigilo rojo brillante. -You picked up a wet rock with some kind of symbol on it. -Recogiste una roca mojada con algún tipo de símbolo en ella. -You picked up a crystal beautiful as the moon. -Recogiste un cristal hermoso como la luna. -You picked up a strange device with a sharpened razor disc. -Cogiste un dispositivo extraño con un disco afilado. +### You pick up a stone trinket with a glowing red sigil. + +### You pick up a wet rock with some kind of symbol on it. + +### You pick up a crystal beautiful as the moon. + +### You pick up a strange device with a sharpened razor disc. + You find a strange ancient device with a sharp cutting blade. Encuentras un extraño dispositivo antiguo con una cuchilla afilada. -You picked up a stone trinket with a glowing blue sigil. -Recogiste una baratija de piedra con un sigilo azul brillante. +### You pick up a stone trinket with a glowing blue sigil. + You pick up a bola. Recoges una bola. You pick up a bomb! @@ -7386,14 +8682,18 @@ You pick up The Arbiter. Recoges al árbitro. You pick up Dreamcatcher. Recoges Dreamcatcher. -You retrieve the Bondage Buster. -Recuperas el Bondage Buster. +You retrieve the Bondage Buster EX. +Recuperas el Bondage Buster EX. +### You salvage a Bondage Buster MK II. + You retrieve a Nevermere Blaster Mark IV. Recuperas un Nevermere Blaster Mark IV. You retrieve the Messenger of Love. Recuperas al Mensajero del Amor. You retrieve Moirai's scissors. Recuperas las tijeras de Moirai. + + You pick up a bunch of scrolls! ¡Recoges un montón de pergaminos! You pick up a Scroll of Sleight. @@ -7404,10 +8704,16 @@ You pick up a Scroll of Speech. Recoges un Pergamino de voz. You pick up a Scroll of Sauntering. Recoges un Pergamino de paseo. -As you strike again, your weapon is pulled out of your grasp! -Cuando golpeas de nuevo, ¡tu arma se te escapa de las manos! + + +### Your weapon is pulled out of your grasp!!! + +### Your weapon is pulled out of your hand and tossed away by your captor! + Your weapon slips out of your hand as you try to cut with it... Tu arma se desliza de tu mano mientras intentas cortar con ella... + + You put away the WEAPONNAME Guardaste el WEAPONNAME You equip the WEAPONNAME @@ -7426,38 +8732,36 @@ Unlit Torch Antorcha apagada Can be lit se puede encender -Torch -Antorcha Provides light Proporciona luz Lantern Linterna -Provides light -Proporciona luz Magic Lantern Linterna mágica -Provides light -Proporciona luz Unlit Lantern Linterna apagada -Can be lit -se puede encender Wall Sconce Aplique de la pared -Provides light -Proporciona luz Broken Wall Sconce Aplique de pared rota It is beyond repair. Está más allá de la reparación. +### Light Portal + +### Empty Portal + +### Stare into the void... + Liquid Latex Latex liquido Engulfs creatures Engulle criaturas -Slime -Limo +### Engulfs pets (like you) + Slows creatures Ralentiza a las criaturas +Glue +Pegamento Ice Hielo Chilling and slippery @@ -7466,8 +8770,6 @@ Water Agua A concentration of moisture. Una concentración de humedad. -Ropes -Cuerdas Looking for a new wearer Buscando un nuevo usuario Chains @@ -7498,6 +8800,14 @@ Casting Runes Lanzar runas Mystical runes used for casting spells Runas místicas utilizadas para lanzar hechizos. +### Suspicious Mechanism + +### A suspicious mechanism that seems to have been hastily put together. + +### Suspicious Runes + +### A suspicious magic circle that was scrawled recently. + Embers Ascuas Ignition source. Blocks vision. @@ -7512,20 +8822,26 @@ Blocks vision Bloquea la visión Smoke Fumar -Blocks vision -Bloquea la visión Cracked Earth tierra agrietada Makes creatures unsteady Hace que las criaturas sean inestables +### Rubble + +### You don't think insurance will cover this. + +### No putting that back together. + Can be controlled using CMD spells Se puede controlar usando hechizos CMD Can be controlled using Rubbermancy Se puede controlar con Rubbermancy + + Floor Piso -Wall -Muro +### Object + Brickwork Enladrillado Doodad @@ -7540,10 +8856,6 @@ Closed Door Puerta cerrada Open Door Puerta abierta -Closed Door -Puerta cerrada -Open Door -Puerta abierta Bed Cama Bars @@ -7556,10 +8868,10 @@ Empty Altar Altar Vacío Chest Pecho -Empty Chest -Cofre Vacío -Shiny Object -objeto brillante +### Faction Chest + +### Open Chest + Shiny Object objeto brillante Cracked Wall @@ -7578,14 +8890,26 @@ Button Botón Conveyor Transportador +### Safety Conveyor + Doll Terminal Terminal de muñecas Doll Supply Suministro de muñecas Bondage Machine Máquina de esclavitud -Ars Pyrotecnica -Ars Pyrotecnica +### Empty Fixture + +### Filled Fixture + +### Tablet + + + + + +### Ars Pyrotecnica + Codex Imaginus Códice Imaginus Clavicula Romantica @@ -7596,44 +8920,40 @@ A book about conjuration Un libro sobre la conjuración. A book of manipulative spells Un libro de hechizos manipuladores. -Components: -Componentes: -Verbal -Verbal + + +### Verbal + +### Vision + +### Components: + Arm Movements Movimientos de brazos Leg Gestures Gestos de piernas -The incantation comes out as a garbled mess! -¡El encantamiento sale como un desastre confuso! -You can't raise your arms to cast the spell! -¡No puedes levantar los brazos para lanzar el hechizo! -Your feet are too clumsy to perform the magic gesture! -¡Tus pies son demasiado torpes para realizar el gesto mágico! +### You mumble incoherently trying to cast the spell... + +### You wiggle uselessly trying to cast the spell... + +### Your feet are too clumsy to perform the magic gesture... + +### You are unable to see, so you can't target this spell... + Next Page Siguiente página Last Page Última página ->>> ->>> -<<< -<<< +### >>> + +### <<< + Random Page (your hands are tied) Página aleatoria (tus manos están atadas) -Verbal -Verbal -Arms -Brazos -Legs -Piernas + + Misc Varios -Elements -Elementos -Conjuration -Conjuración -Illusion -Espejismo Other Otro Strength @@ -7642,18 +8962,28 @@ Dexterity Destreza Intelligence Inteligencia -Misc -Varios + + +### Unique + +### Active + +Upgrades +Actualizaciones + + Learnable Aprendible Unlearned Indocto +### Learned + Excl. Upgrades Excl. Actualizaciones Passive Pasivo -Upcast -Upcast +### Upcast + Buffs aficionados DoT @@ -7672,34 +9002,20 @@ Defense Defensa Fire Fuego -Ice -Hielo Earth Tierra Air Aire Lightning Iluminación -Water -Agua -Rubber -Goma Teleport teletransportarse Physics Física -Conjuration -Conjuración Summoning Invocación Binding Vinculante -Metal -Metal -Rope -Soga -Leather -Cuero Stealth Sigilo Projection @@ -7712,22 +9028,20 @@ Shadow Sombra Knowledge Conocimiento +### Archery + Utility Utilidad -Upgrades -Actualizaciones Spell Tree Árbol de hechizos -Willpower -Fuerza de voluntad Stamina Aguante -Magic -magia Damage Daño Distraction Distracción + + Empower to upcast spells Potenciar para lanzar hechizos Cancel empowerment @@ -7740,16 +9054,34 @@ You don't have any upcast spells yet. Aún no tienes ningún hechizo elevado. Upcast from SPELL Upcast de hechizo + + You fail to concentrate on the spell and it fizzles! ¡No te concentras en el hechizo y se esfuma! Your gag causes you to mispronounce the magic words! ¡Tu mordaza hace que pronuncies mal las palabras mágicas! +### You are too clumsy to perform the leg movements! + +### You can't get a good look at the target! + +### You trip up while casting the spell! + +### You miscast the spell because of a bug. Please report. + +### You wave your arms around and make the wrong symbol with your hands! + +### Your restrained fingers can't make the magic glyphs in time! + + + The ice drains your concentration! Your mana and stamina are slipping away! ¡El hielo drena tu concentración! ¡Tu maná y tu resistencia se están escapando! A strange, chaotic energy flows into you! Your will is weakened and your mana fades! ¡Una energía extraña y caótica fluye hacia ti! ¡Tu voluntad se debilita y tu maná se desvanece! Something gently, constantly tickles you! ¡Algo suavemente, constantemente te hace cosquillas! + + The ampule shatters on impact! ¡La ampolla se rompe con el impacto! The gas ampule shatters on impact! @@ -7764,30 +9096,128 @@ The latex ampule shatters on impact and coats your body! ¡La ampolla de látex se rompe con el impacto y cubre tu cuerpo! The latex ampule shatters on impact and sticks to you! ¡La ampolla de látex se rompe con el impacto y se te pega! -Gas Ampule -ampollas de gas -Glue Ampule -ampollas de pegamento -Rubber Ampule -ampolla de goma -Latex Ampule -ampolla de látex + + Shadowy chains appear from a rift in space! ¡Cadenas sombrías aparecen desde una grieta en el espacio! The roaring inferno deals 10 damage to you! ¡El infierno rugiente te inflige 10 de daño! -Mana Burst -Explosión de maná -As a trainee, you have learned the technique of inducing clarity via a trance-like state at 100% distraction. However, this state is precarious, and casting spells may cause you to lose focus... -Como aprendiz, ha aprendido la técnica de inducir claridad a través de un estado de trance con una distracción del 100%. Sin embargo, este estado es precario y lanzar hechizos puede hacer que pierdas la concentración... + + +### The Reaping + +### +20% damage to plants + +### Magically Iliterate + +### You've never read a magic book. Elemental, Conjuration, and Illusion spells cost 3x as many spell points. + +### Magical Spark + +### Reduce the penalty from Magically Iliterate to 2x. + +### Magical Training + +### Remove the penalty from Magically Iliterate. + +### Reap What You Sow + +### Defeating a non-humanoid enemy causes vines to sprout on their space temporarily. + + + +### Battle Rhythm + +### Stores 10% of the stamina cost of attacks as Rhythm, up to a total of 40. While you have over 10 Rhythm, you gain +10 Block and Evasion. Enemy base accuracy against you is decreased by a % equal to your Rhythm. If an attack misses or is blocked because of this, reduce Rhythm by 25% of the enemy attack power. Decays when not attacking. + +### Limit Surge + +### Spend 40 WP to fully restore Stamina, also stamina gain is increased by 30% for 20 turns. If your Willpower ends up 0 because of this, you are stunned for 2 turns. + +### Battle Trance + +### While at 40 Battle Rhythm, you attack twice per turn. + +### Combat Maneuver + +### When Battle Trance is active, you gain a free move if the target is defeated before the second attack hits. + + + + + +### Devious Ingenuity + +### Trap-type spells and consumables no longer require you to channel them, but still have a delay before arming. + + + + + +### Essence Motes + +### When you miscast a spell, you gain an Essence Mote which appears in a random space next to you. You can consume this mote to gain -100% miscast chance decaying over 10 turns. Walking over the mote also consumes it. + +### Inner Power + +### As a wizard, you are able to draw upon mystical sources of energy that others can't even see. After 16 turns of not casting a spell or attacking, your next spell's mana cost is reduced by 20% of your max mana BEFORE multipliers. Toggled passive spells apply half the cooldown. + +### Battlemage + +### Inner Power cooldown is no longer reset after attacking. + +### Relentless Casting + +### While on cooldown, Inner Power cooldown is no longer reset after casting spells. + +### Arcane Recharge + +### Calling upon chaotic energies, your willpower is assaulted in exchange for power. Deals 80 psychic damage to self and drains 10% of your max Willpower to fully restore mana. Does not refill the mana pool. + +### Way of Pleasure + +### You have chosen the path of absolute pleasure. After letting go of yourself, you restore 50 mana, which can refill the mana pool if you have spare willpower. Blocks Way of Discipline. + +### Intense Power + +### After letting go of yourself, you feel an immense surge of power, increasing magic damage by 40% for 8 turns after you regain control, and by 10% while you remain satisfied. + +### Pleasure Training I + +### You remain satisfied for much less time after letting go. Letting go costs 50% less stamina. + +### Pleasure Training II + +### You are quite difficult to satisfy. Letting go costs 50% less stamina (75% total) and 50% less willpower. + +Mental Resistance +Resistencia Mental +### +100 Psychic and Charm Resist. You can no longer let go involuntarily while your WP is above 10% or you are shielded, and willpower drains 70% slower while edged. (click the buff to toggle) + +### Mental Resistance: You cannot orgasm except by choice or below 25% WP. Click to toggle. + +### Mental Resistance: You are allowing yourself to let go. Click to toggle. + + + +### Way of Discipline + +### You have chosen the path of absolute discipline. Being in an Edged state increases passive mana recovery and you regenerate 0.5 mana per turn, restoring the same amount to the Mana Pool if you have willpower to spare. Blocks Way of Pleasure. + +### Way of Denial + +### Harnessing your mental discipline, you regenerate 20 mana each time you are denied, restoring the same amount to the Mana Pool if you have willpower to spare. + + + Flame Novice Novato de la llama Unlocks fire spells. Learn Firebolt. Desbloquea hechizos de fuego. Aprende Saeta de Fuego. Lightning Novice Principiante relámpago -Unlocks electrice spells. Learn Electrify. -Desbloquea hechizos eléctricos. Aprende Electrificar. +### Unlocks electrice spells. Learn Electrify. Gain increased resistance to blinding from bright lights. + Water Novice Novato del agua Unlocks water spells. Learn Water Ball. @@ -7804,12 +9234,14 @@ Air Novice Novato del aire Unlocks air spells. Learn Wind Blast. Desbloquea hechizos de aire. Aprende ráfaga de viento. + + Latex 101 Látex 101 Unlocks latex spells. Learn Slime Ball. Desbloquea hechizos de látex. Aprende Bola de limo. -Metal 101 -Metal 101 +### Metal 101 + Unlocks metal spells. Learn Conjure Cuffs. Desbloquea hechizos de metal. Aprende Conjurar puños. Rope 101 @@ -7822,20 +9254,22 @@ Unlocks leather spells. Learn Conjure Gag. Desbloquea hechizos de cuero. Aprende Conjurar Gag. Physics 101 Física 101 -Unlocks teleportation and physical manipulation spells. Learn Wall. -Desbloquea hechizos de teletransportación y manipulación física. Aprende Muro. +### Unlocks teleportation and spatial manipulation spells. Learn Wall. + Summoning 101 Invocación 101 Unlocks summoning spells. Learn Summon Familiar. Desbloquea hechizos de invocación. Aprende Invocar familiar. + + Blessing of Shadow Bendición de la sombra Unlocks shadow spells. Learn Shadow Dagger. Desbloquea hechizos de sombra. Aprende Daga de las Sombras. Blessing of Light Bendición de la Luz -Unlocks light spells. Learn Flash. -Desbloquea hechizos de luz. Aprende Flash. +### Unlocks light spells. Learn Flash. Gain significantly increased resistance to blinding from bright lights. + Blessing of Obscurity Bendición de la oscuridad Unlocks invisibility spells. Learn Camouflage. @@ -7852,124 +9286,130 @@ Arcane Knowledge Conocimiento arcano Unlocks knowledge and critical-strike spells. Learn True Steel, and unlocks advanced tooltips for enemies. Desbloquea conocimientos y hechizos de golpe crítico. Aprende True Steel y desbloquea información sobre herramientas avanzada para los enemigos. -Glue -Pegamento -The glue attaches to your legs as you try to move through! -¡El pegamento se adhiere a tus piernas mientras intentas moverte! + + +### The glue sticks to you and engulfs your legs! + The glue slows you down! ¡El pegamento te ralentiza! The glue slows you down! (-DamageDealt SP) ¡El pegamento te ralentiza! (-Daño Infligido SP) + + Firebolt Saeta de fuego Elemental's Firebolt Saeta de fuego de elemental Elemental's Gust Ráfaga de elemental -A ball of flame that does DamageDealt damage. -Una bola de fuego que inflige daño DamageDealt. +Gust +Ráfaga +### A ball of flame that does DamageDealt damage to one target. + You a hurl a firebolt! ¡Lanzas una flecha de fuego! Choose aim direction Elija la dirección del objetivo + + Windblast Ráfaga de viento -Three scattered puffs of wind that do DamageDealt pressure damage at close range, stun briefly, and push targets back. -Tres bocanadas de viento dispersas que infligen daño de presión DamageDealt a corta distancia, aturden brevemente y empujan a los objetivos hacia atrás. +### Three scattered puffs of wind that do DamageDealt blast damage at close range, stun briefly, and push targets back. + You press your wrists together and conjure a blast of wind! ¡Presionas tus muñecas juntas y conjuras una ráfaga de viento! -Choose aim direction -Elija la dirección del objetivo -Gust -Ráfaga -Three puffs of wind in a tight cone that deal DamageDealt pressure damage and push targets back. -Tres bocanadas de viento en un cono apretado que infligen daño de presión DamageDealt y empujan a los objetivos hacia atrás. +### Three puffs of wind in a tight cone that deal DamageDealt blast damage and push targets back. + You exhale a mighty wind! ¡Exhalas un viento poderoso! -Choose aim direction -Elija la dirección del objetivo -Knife -Cuchillo -Throw one of your knives DamageDealt damage. Lands in the target's tile -Lanza uno de tus cuchillos DamageDeald daño. Aterriza en la casilla del objetivo + + +### Throw one of your knives DamageDealt damage. Lands in the target's tile, but is recoverable afterward. + You a throw a knife! ¡Tú lanzas un cuchillo! -Choose aim direction -Elija la dirección del objetivo + + Shadow Dagger Daga sombría A cold shadowy blade that deals DamageDealt damage and pierces all in its path. Una espada fría y sombría que inflige daño DamageDealt y atraviesa todo a su paso. You a hurl a shadowy dagger! ¡Lanzas una daga sombría! -Choose aim direction -Elija la dirección del objetivo + + Shadow Slash Corte de sombra Shadow Scythe Guadaña de sombra -Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. -Corta el área frente a ti, infligiendo un daño retrasado de DamageDealt en un área y ralentizándolo brevemente. +### Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. Deals 50% more damage when you are attacking from the shadows. + You create a tear in space with your finger! ¡Creas un desgarro en el espacio con tu dedo! -Choose aim direction -Elija la dirección del objetivo -Portal -Portal -Teleport to a nearby location (including into darkness) with twice the range. -Teletransportarse a un lugar cercano (incluso en la oscuridad) con el doble de alcance. -You call upon a misty portal to transport you! -¡Llamas a un portal brumoso para que te transporte! -Choose target location -Elija la ubicación de destino + + Blink Parpadear -Instantly teleport to a location you can see. -Teletranspórtate instantáneamente a una ubicación que puedas ver. +### Instantly teleport to an adjacent position and gain +50 evasion for 3 turns. Unlocks Blink and Warp when learned. + You teleport! ¡Te teletransportas! -Choose target location -Elija la ubicación de destino +### Choose target location (1 tile range) + +### Blink II + +### Instantly teleport up to 2 tiles away. Must have vision of the target point. Stuns an enemy if you teleport behind them. + +### Choose target location (2 tile range) + +### Blink III + +### Instantly teleport up to 3 tiles away. Must have vision of the target point. + +### Choose target location (3 tile range) + Ice Shard Fragmento de hielo A shard of ice that does DamageDealt damage and slows for Duration turns. Freezes if already slowed or drenched. Un fragmento de hielo que inflige daño DamageDealt y se ralentiza durante los turnos de duración. Se congela si ya está ralentizado o empapado. You a hurl a shard of ice! ¡Arrojas un trozo de hielo! -Choose aim direction -Elija la dirección del objetivo + + Ice Lance Lanza de hielo A quick-moving shard of ice that does DamageDealt damage and slows for Duration turns and passes through enemies. Freezes if already slowed or drenched. Un fragmento de hielo de movimiento rápido que inflige daño DamageDealt y se ralentiza por duración gira y atraviesa a los enemigos. Se congela si ya está ralentizado o empapado. You conjure a mighty spear of ice and hurl it forward! ¡Conjuras una poderosa lanza de hielo y la lanzas hacia adelante! -Choose aim direction -Elija la dirección del objetivo + + Snowball Bola de nieve A fast orb that leaves behind a frigid cloud of ice. Enemies walking in the cloud take DamageDealt ice damage per tile and are slowed. Un orbe veloz que deja tras de sí una gélida nube de hielo. Los enemigos que caminan en la nube reciben daño de hielo DamageDealt por mosaico y se ralentizan. You a hurl a snowy blast! ¡Lanzas una explosión de nieve! -Choose aim direction -Elija la dirección del objetivo + + Winterblast Explosión de invierno A piercing orb that leaves a trail of ice. Deals DamageDealt ice damage to enemies hit. Un orbe penetrante que deja un rastro de hielo. Inflige Daño Daño de hielo a los enemigos golpeados. You a hurl a frigid orb! ¡Lanzas un orbe gélido! -Choose aim direction -Elija la dirección del objetivo + + Freeze Congelar -Freeze an adjacent target for Duration turns. -Congela un objetivo adyacente durante turnos de Duración. +### Chill an adjacent target for DamageDealt ice damage and slows for Duration turns. Freezes if already slowed or drenched. + You utter dark words of ice-cold truths. Pronuncias palabras oscuras de verdades heladas. Choose a target to freeze Elija un objetivo para congelar + + Flash Frost escarcha relámpago Deal DamageDealt ice damage in a 3x3 area. Drenched creatures are frozen for 8 turns. @@ -7978,14 +9418,14 @@ You recite a frigid poem... Recitas un poema frígido... Choose a 3x3 area to freeze Elija un área de 3x3 para congelar -Shatter -Romper + + Shatter Romper When a frozen target thaws or dies, deals DamageDealt ice damage to nearby targets and slow for 4 turns.. Cuando un objetivo congelado se descongela o muere, inflige daño de hielo DamageDealt a los objetivos cercanos y se ralentiza durante 4 turnos. -Ignite -Encender + + Ignite Encender Ignite a friendly target for Duration turns, dealing DamageDealt fire damage per turn to it and nearby targets. @@ -7994,28 +9434,50 @@ You spin in a circle, inscribing flames with your feet! ¡Giras en círculos, inscribiendo llamas con tus pies! Choose a friendly target to ignite Elige un objetivo amistoso para encender + + Conjure Chain Conjurar cadena Magic Chain Cadena Mágica +### Magic Belt + Witch's Chain Cadena de bruja Throws a chain that does DamageDealt chain damage. Targets with 50% or more binding take 50 crush damage and are slowed for 4 turns. Lanza una cadena que hace daño en cadena DamageDealt. Los objetivos con un 50 % o más de unión reciben 50 de daño por aplastamiento y se ralentizan durante 4 turnos. You a hurl a strand of chain! ¡Tú lanzas un hilo de cadena! -Choose aim direction -Elija la dirección del objetivo -Conjure Ropes -Conjurar cuerdas -Animated Rope -Cuerda animada -Launch 3 ropes that deal DamageDealt chain damage each and add 22 rope binding. -Lanza 3 cuerdas que infligen daño de cadena DamageDealt cada una y agrega 22 ataduras de cuerda. -You animate a bunch of ropes! + + +### Enchant Rope + +### Rope Enchantment + +### Spellbinding + +### Convert rope binding on a target into magical bindings, which are much more powerful. Deals a small amount of arcane damage. + +### You whisper an enchanting tale of rope bondage... + +### Choose targets to tighten the ropes of + +Conjure Ropes +Conjurar cuerdas +Animated Rope +Cuerda animada +### Launch 3 ropes that deal DamageDealt chain damage each and add 32 rope binding. + +You animate a bunch of ropes! ¡Animas un montón de cuerdas! -Choose aim direction -Elija la dirección del objetivo + + +### Ropestorm + +### Launch 9 ropes that deal DamageDealt chain damage each and add 32 rope binding. Best in open spaces. + +### You animate a sizeable quantity of ropes! + Steel Torrent Torrente de acero Steel Rain @@ -8032,36 +9494,30 @@ You raise your hand and a steel projectile appears! ¡Levantas la mano y aparece un proyectil de acero! You raise your hand and several steel projectiles appear! ¡Levantas la mano y aparecen varios proyectiles de acero! -Choose aim direction -Elija la dirección del objetivo Choose target point Elija el punto de destino -Bola -Ella estaba + + + + Restraining Device Dispositivo de restricción The thrown restraining device latches onto you as you struggle to get it off!!! ¡El dispositivo de restricción arrojado se engancha a ti mientras luchas por quitártelo! The restraining device wraps many elastic cables around you!!! ¡El dispositivo de sujeción envuelve muchos cables elásticos a tu alrededor! + + Shadowy Grip Agarre sombrío A dark hand latches onto you and holds you tight! ¡Una mano oscura se aferra a ti y te sujeta con fuerza! -Celestial Orb -Orbe celestial You are snugly wrapped in glowing ropes! ¡Estás cómodamente envuelto en cuerdas brillantes! Obsidian Orb Orbe de obsidiana Metallic restraints encircle your body! ¡Sujeciones metálicas rodean tu cuerpo! -Rubberizing Bolt -Perno de goma -Rubber Bolt -Perno de goma -Latex Bolt -Perno de látex The latex spreads across your limbs and rubberizes, forming a tough barrier! ¡El látex se esparce por tus extremidades y se vuelve gomoso, formando una barrera resistente! The latex spreads across your limbs and hardens, forming a stretchy layer! @@ -8070,20 +9526,24 @@ The latex clings to you and slows you down, making you vulnerable to the barrage ¡El látex se adhiere a ti y te frena, haciéndote vulnerable al bombardeo! The latex expands rapidly and slows you down as it hardens into a stretchy layer! ¡El látex se expande rápidamente y lo ralentiza a medida que se endurece en una capa elástica! -Bola -Ella estaba -Choose aim direction -Elija la dirección del objetivo + + You throw a bola! ¡Tiras una bola! You ready a bola! ¡Prepara una bola! + + You are feeling drowsy... Te sientes somnoliento... + + Shadow Strike Golpe de las sombras Shadow Heel Tacón de sombra + + Runic Ward Guardián rúnico Gives yourself or a creature a magic shield for 50 turns, granting +30 Magic Armor. @@ -8092,6 +9552,8 @@ You whisper a word of protection! ¡Susurras una palabra de protección! Choose creature to shield Elige criatura para proteger + + Afterimage Imagen remanente Massively increases a creature's evasion for 5 attacks. Expires after 25 turns. @@ -8100,6 +9562,8 @@ Your movements intensify! ¡Tus movimientos se intensifican! Choose creature to buff Elige criatura para pulir + + Magical Sight Vista Mágica Highlight the location of interesting magical phenomena for 20 turns @@ -8108,14 +9572,18 @@ You analyze the target! ¡Usted analiza el objetivo! Choose object to analyze Elige el objeto a analizar + + Barrier Runes Runas de barrera -Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns -Crea un campo 1x1 de monolitos de barrera que bloquea el daño BlockAmount de los proyectiles para los turnos de DelayTime +### Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns, but doesn't block movement. + You raise a field of runes with a command word! ¡Levantas un campo de runas con una palabra de comando! Choose barrier location Elija la ubicación de la barrera + + Electric Field Campo eléctrico Creates a conductive area for Duration turns. Makes all entities in the area Conductive, forcing them to share 50% electric damage. @@ -8124,12 +9592,18 @@ You energize the targeted area! ¡Usted energiza el área objetivo! Choose target 3x3 area Elija el área objetivo de 3x3 -Witch's Electricity -Electricidad de bruja + + +### Firey Explosion + +### Icey Explosion + Witch's Electric Orb Orbe eléctrico de bruja Witch's Electric Burst Explosión eléctrica de bruja + + Electrify Electrizar A delayed shock that deals DamageDealt damage and stuns for Duration turns. @@ -8138,16 +9612,24 @@ You charge up a burst of electricty! ¡Cargas una ráfaga de electricidad! Choose target location Elija la ubicación de destino + + The elemental channels the force of the storm! ¡El elemental canaliza la fuerza de la tormenta! + + Fireball bola de fuego -A slow moving ball of flame that explodes for 120 fire damage to the target and DamageDealt damage to surrounding enemies. -Una bola de fuego de movimiento lento que explota e inflige 120 de daño de fuego al objetivo y daño de daño infligido a los enemigos circundantes. -You a hurl a fireball! -¡Lanzas una bola de fuego! -Choose aim direction -Elija la dirección del objetivo +### A slow moving ball of flame that explodes for DamageDealt fire damage in a wide area. + +### You a hurl a massive fireball! + +### Fireblast + +### A bolt of flame that explodes for DamageDealt fire damage in an area. + +### You a hurl a blast of flame! + Incinerate Incinerar A tornado of flame that does DamageDealt damage per turn for LifeTime turns. @@ -8156,42 +9638,58 @@ You conjure a gout of flame! ¡Evocas una gota de llamas! Choose target AoE location Elija la ubicación de AoE de destino + + Hailstorm Granizada A cloud of falling ice that does DamageDealt damage per turn for LifeTime turns and slows. Una nube de hielo que cae que inflige daño DamageDealt por turno durante LifeTime gira y se ralentiza. You conjure a flurry of frost! ¡Conjuras una ráfaga de escarcha! -Choose target AoE location -Elija la ubicación de AoE de destino + + Raincloud Nube de lluvia After 3 turns, rain falls, creating a 3x3 grid of water and dealing DamageDealt acid damage to enemies within. Después de 3 turnos, cae la lluvia, creando una cuadrícula de agua de 3x3 e infligiendo daño de ácido DamageDealt a los enemigos dentro. You create a stormy cloud! ¡Creas una nube tormentosa! -Choose target AoE location -Elija la ubicación de AoE de destino + + Field of Frost campo de escarcha Freezes a 5x5 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. Congela un área de 5x5 (el hielo ralentiza las entidades). Los enemigos en el área reciben daño DamageDealt por turno durante los turnos de LifeTime. -You stomp your foot and call forth the storm! -¡Pateas fuerte y llamas a la tormenta! +### You stomp your foot and call forth the blizzard! + Choose target AoE location (5x5) Elija la ubicación AoE de destino (5x5) +### Zone of Frost + +### Freezes a 3x3 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. + +### You sweep your foot and call forth the storm! + +### Choose target AoE location (3x3) + +### Cold Feet + +### Freezes a single tile (ice slows entities). Any enemy standing on the tile takes take DamageDealt damage per turn for LifeTime turns. + +### You tap your foot and call forth the frost! + +### Choose target location (1x1) + Healing Light Luz curativa Channel to heal 15 hitpoints per turn to summoned allies within a 5x5 area. Canaliza para curar 15 puntos de vida por turno a los aliados convocados dentro de un área de 5x5. You conjure a healing light! ¡Conjuras una luz curativa! -Choose target AoE location (5x5) -Elija la ubicación AoE de destino (5x5) + + Crackle Crepitar -Stun Blast -Explosión de aturdimiento Storm Bolt Rayo de tormenta A bolt of lightning that does DamageDealt electric damage to enemies in a 4-range line and briefly stuns. @@ -8200,24 +9698,26 @@ Lightning erupts from your fingertips! ¡Un rayo brota de la punta de tus dedos! Choose line direction (max range 4 tiles) Elija la dirección de la línea (rango máximo de 4 mosaicos) + + Tremor Temblor -Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. -Haz que los enemigos sean vulnerables y lentos en el área objetivo durante los turnos de duración, e inflige daño por aplastamiento de DamageDealt. +### Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. Creates a slowing field after. + You call forth the rage of the earth. Invocas la furia de la tierra. Choose AoE Elija AoE + + Earthquake Terremoto Channel for 5 turns to send 2 tremors per turn in target area. Canal durante 5 turnos para enviar 2 temblores por turno en el área objetivo. You channel the fury of the earth!!! Canalizas la furia de la tierra!!! -Choose AoE -Elija AoE -Shock Orb -Orbe de choque + + Shock Orb Orbe de choque A slow-moving orb that deals DamageDealt electric damage to an adjacent enemy each turn. @@ -8226,48 +9726,42 @@ You hurl a charged orb! ¡Lanzas un orbe cargado! Choose aim direction (max range 4 tiles) Elija la dirección del objetivo (alcance máximo 4 mosaicos) + + Lightning Rune Runa de relámpago -Lightning Rune -Runa de relámpago -A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 5 turns to setup. -Una trampa que inflige daño eléctrico DamageDealt y aturde durante 4 turnos. Toma 5 turnos para configurar. +### A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 3 turns to setup. 200% crit multiplier. + You conjure a charged trap! ¡Conjuras una trampa cargada! Choose location for trap Elija la ubicación de la trampa + + Freeze Rune Runa de congelación -Freeze Rune -Runa de congelación -A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 5 turns to setup. -Una trampa que inflige daño de hielo DamageDealt y se congela durante 30 turnos. Toma 5 turnos para configurar. +### A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 3 turns to setup. 200% crit multiplier. + You conjure an icy trap! ¡Conjuras una trampa helada! -Choose location for trap -Elija la ubicación de la trampa -Flame Rune -Runa de llama + + Flame Rune Runa de llama -A trap that deals DamageDealt fire damage in an area. Takes 5 turns to setup. -Una trampa que inflige daño de fuego DamageDealt en un área. Toma 5 turnos para configurar. +### A trap that deals DamageDealt fire damage in an area. Takes 3 turns to setup. 200% crit multiplier. + You conjure an incendiary trap! ¡Conjuras una trampa incendiaria! -Choose location for trap -Elija la ubicación de la trampa -Static Sphere -esfera estática -Static Sphere -esfera estática + + Conjure a sphere for Duration turns that makes nearby entities Conductive and each turn deals DamageDealt electric damage to one of them. Conjura una esfera para turnos de Duración que hace que las entidades cercanas sean Conductoras y cada turno inflige daño eléctrico DamageDealt a una de ellas. You summon a grey, featureless sphere adorned by static! ¡Invocas una esfera gris sin rasgos distintivos adornada con estática! -You summon a grey, featureless sphere adorned by static! -¡Invocas una esfera gris sin rasgos distintivos adornada con estática! Choose sphere location Elige la ubicación de la esfera + + Fissure Fisura Lava Fissure @@ -8276,8 +9770,8 @@ A great fissure erupts from the earth, dealing 70 fire damage to enemies in a 4- Una gran fisura brota de la tierra e inflige 70 de daño por fuego a los enemigos en una línea de 4 rangos e inflige 15 de daño por turno durante 6 turnos. You stomp the ground and the earth opens its gaping maw! ¡Pisoteas el suelo y la tierra abre sus fauces abiertas! -Choose line direction (max range 4 tiles) -Elija la dirección de la línea (rango máximo de 4 mosaicos) + + Lightning Bolt Rayo A bolt of lightning that does DamageDealt damage to enemies in an infinite line and briefly stuns. @@ -8286,24 +9780,24 @@ You unleash a bolt of lightning! ¡Desatas un rayo! Choose line direction Elija la dirección de la línea -Corona -Corona -Corona -Corona -Binding Light -Luz vinculante + + +### Corona + Binding Light Luz vinculante Chaos Beam Haz del caos Mystic Beam Haz místico -A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt fire damage to the first target hit. -Un haz de luz que se canaliza durante 2 turnos (lo que te aturde brevemente) y luego inflige daño de fuego Daño infligido instantáneamente al primer objetivo golpeado. +### Mystic Barrage + +### A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt holy damage to the first target hit. Blinds for 12 turns. 150% crit multiplier. + You charge a powerful beam attack!!! ¡Cargas un poderoso ataque de rayo! -Choose line direction -Elija la dirección de la línea + + Icicles Carámbanos Icicle @@ -8312,8 +9806,8 @@ Channel 3 turns to fire 3 icicles that deal DamageDealt ice damage and slow for El canal 3 gira para disparar 3 carámbanos que infligen daño de hielo DamageDealt y ralentizan durante 4 turnos, congelando a los objetivos ralentizados/empapados durante 3 turnos. You raise a hand and icicles fly forward! ¡Levantas una mano y los carámbanos vuelan hacia adelante! -Choose line direction -Elija la dirección de la línea + + Volcanism Vulcanismo An area of summoned rocks becomes explosive. Deal fire damage to them to ignite, dealing DamageDealt fire damage to adjacent targets. @@ -8322,6 +9816,8 @@ You stomp your foot and magma wells up beneath the ground! ¡Pisas fuerte y el magma brota bajo el suelo! Choose monoliths to enchant Elige monolitos para encantar + + Coalesce Juntarse Gathers slime and slimed enemies into a central point. Deals DamageDealt glue damage per square of slime and Encases slimed enemies. Costs half mana if there is only slime. @@ -8330,22 +9826,22 @@ You command the slime to draw enemies in! ¡Usted le ordena al limo que atraiga a los enemigos! Choose area containing slime Elija el área que contiene limo + + Animate Slime limo animado Summons up to 3 slimes on slime tiles in an AoE. The slimes are friendly to you. Invoca hasta 3 limos en mosaicos de limo en un AoE. Los limos son amigables contigo. You concentrate magical energy into the slime, giving it a will of it's own... Concentras energía mágica en el limo, dándole voluntad propia... -Choose area containing slime -Elija el área que contiene limo + + Animate Large Slime Animar limo grande Target an area with at least 3 slime tiles. Summons a large slime that is friendly to you. Apunta a un área con al menos 3 fichas de baba. Invoca un limo grande que es amistoso contigo. -You concentrate magical energy into the slime, giving it a will of it's own... -Concentras energía mágica en el limo, dándole voluntad propia... -Choose area containing slime -Elija el área que contiene limo + + Latex Puppet Marioneta de látex Target an area containing helpless encased enemies. Transforms up to 3 of them into latex dolls that serve you for a while. @@ -8354,30 +9850,38 @@ You concentrate magical energy into your victim's bindings, forcing them to move Concentras energía mágica en las ataduras de tu víctima, obligándola a moverse... Choose area containing encased helpless enemies. Elige un área que contenga enemigos indefensos encerrados. + + Solidify Solidificar Solidifies slime in the area into Latex. Latex adheres to enemies and slowly binds them, escasing them when they are fully bound. Solidifica el limo en el área en látex. El látex se adhiere a los enemigos y los ata lentamente, escapándolos cuando están completamente atados. You inscribe a transmutation circle on the floor. Inscribes un círculo de transmutación en el suelo. -Choose area containing slime -Elija el área que contiene limo +### LiquidMetal + +### Solidifies Latex in the area into Liquid Metal. Liquid Metal is slippery, but also adheres to enemies and slowly binds them in metallic bonds. Enemies encased in liquid metal are more susceptible to knockback due to the slippery nature. + +### Choose area containing Latex + Slime Repulsion Repulsión de limo -Gain +50 glue resist. -Gana +50 de resistencia al pegamento. +### Gain +50 glue resist. (Having 45 or more Glue Resist negates many negative effects from slime) + Spread Desparramar Slime in the target area expands by 1 unit in the four cardinal directions. Refreshes duration to 12-20 turns. El limo en el área objetivo se expande en 1 unidad en las cuatro direcciones cardinales. Actualiza la duración a 12-20 turnos. The slime spreads! ¡El limo se esparce! -Choose area containing slime -Elija el área que contiene limo + + Wall of Slime Muro de limo Unlocks horizontal and vertical slime walls that traps enemies who try to pass through. Desbloquea paredes de limo horizontales y verticales que atrapan a los enemigos que intentan atravesar. + + Wall of Slime (Vert) Muro de limo (Vert) Creates a vertical wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. @@ -8386,34 +9890,34 @@ You tap your foot and a wall of slime slowly raises out of the ground. Golpeas tu pie y una pared de limo se levanta lentamente del suelo. Choose vertical wall origin (5 tiles high) Elija el origen de la pared vertical (5 mosaicos de altura) + + Wall of Slime (Horiz) Muro de limo (Horiz) Creates a horizontal wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. Crea una pared horizontal de baba durante 20 turnos. Los enemigos que pasan quedan atascados en la pared y cubiertos de baba. -You tap your foot and a wall of slime slowly raises out of the ground. -Golpeas tu pie y una pared de limo se levanta lentamente del suelo. Choose horizontal wall origin (5 tiles wide) Elija el origen de la pared horizontal (5 mosaicos de ancho) + + Wall of Latex Muro de Látex Unlocks horizontal and vertical latex walls that encase enemies that walk through. Desbloquea paredes de látex horizontales y verticales que encierran a los enemigos que caminan. + + Wall of Latex (Vert) Muro de Látex (Vert) -Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased -Crea una pared vertical de látex durante 20 turnos. Los enemigos que pasan están encerrados +### Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. + You tap your foot and a wall of latex stretches out across the corridor. Golpeas con el pie y una pared de látex se extiende por el pasillo. -Choose vertical wall origin (5 tiles high) -Elija el origen de la pared vertical (5 mosaicos de altura) + + Wall of Latex (Horiz) Muro de Látex (Horiz) -Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased -Crea una pared horizontal de látex durante 20 turnos. Los enemigos que pasan están encerrados -You tap your foot and a wall of latex stretches out across the corridor. -Golpeas con el pie y una pared de látex se extiende por el pasillo. -Choose horizontal wall origin (5 tiles wide) -Elija el origen de la pared horizontal (5 mosaicos de ancho) +### Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. + Earthshape forma de tierra Unlocks 3 spells that allow creating mounds, rings, or lines of 50hp, 25 armor rocks. @@ -8422,6 +9926,8 @@ Earthen monoliths rise from the ground! ¡Los monolitos de tierra se levantan del suelo! An earthen monolith rises from the ground! ¡Un monolito de tierra se levanta del suelo! + + Earthshape (Ring) Forma de tierra (Anillo) Create a large ring of Earthen Monoliths. They have 50 hitpoints and 25 armor. @@ -8430,6 +9936,8 @@ You stomp your foot and monoliths emerge in a ring around you! ¡Pisas fuerte y los monolitos emergen en un anillo a tu alrededor! Choose ring origin Elija el origen del anillo + + Earthshape (Mound) Forma de tierra (montículo) Create a 3x3 field of Earthen Monoliths. They have 50 hitpoints and 25 armor. @@ -8438,24 +9946,26 @@ You stomp your foot and monoliths emerge from the ground! ¡Pateas fuerte y los monolitos emergen del suelo! Choose mound origin Elija el origen del montículo + + Earthshape (Line) Forma de la Tierra (Línea) Create a 4-tile line of Earthen Monoliths. They have 50 hitpoints and 25 armor. Crea una línea de 4 mosaicos de monolitos de tierra. Tienen 50 puntos de vida y 25 de armadura. -You stomp your foot and monoliths emerge from the ground! -¡Pateas fuerte y los monolitos emergen del suelo! -Choose line direction -Elija la dirección de la línea -Rock -Roca + + +### Earthshape (Arc) + +### Create a 5-wide arc of Earthen Monoliths. They have 50 hitpoints and 25 armor. + Rock Roca Channel 1 turn to launch a rock that deals DamageDealt crush damage and slows for 4 turns. Blocks up to 80 damage. Canaliza 1 turno para lanzar una roca que inflige daño por aplastamiento DamageDealt y se ralentiza durante 4 turnos. Bloquea hasta 80 de daño. You raise a stone from the ground and kick it forward! ¡Levantas una piedra del suelo y la pateas hacia adelante! -Choose line direction -Elija la dirección de la línea + + Earth Kick patada de tierra Stone Projectile @@ -8466,32 +9976,34 @@ With a solid kick, you launch one of your monoliths forward! ¡Con una patada sólida, lanzas uno de tus monolitos hacia adelante! Choose a monolith to kick Elige un monolito para patear -Boulder -Roca + + Boulder Roca Channel 1 turn to launch a huge slow rock that deals DamageDealt crush damage and slows for 8 turns. AoE, collides with summoned rocks. Blocks up to 200 damage. Canaliza 1 turno para lanzar una enorme roca lenta que inflige daño por aplastamiento DamageDealt y se ralentiza durante 8 turnos. AoE, choca con rocas convocadas. Bloquea hasta 200 de daño. You raise a massive boulder from the ground and kick it forward! ¡Levantas una enorme roca del suelo y la pateas hacia adelante! -Choose line direction -Elija la dirección de la línea + + Stamina Up I Aguante I Increases maximum SP by 12 Aumenta el SP máximo en 12 + + Iron Will Voluntad de hierro While you have 100 current willpower or more, regain an additional 4 stamina per turn. Mientras tengas 100 de fuerza de voluntad actual o más, recupera 4 de resistencia adicionales por turno. -Steadfast Guard -Guardia firme -For each 10 current willpower you have over 50, gain +5 Restraint Block. -Por cada 10 de fuerza de voluntad actual que tengas sobre 50, obtienes +5 Bloqueo de restricción. +### Defiance + +### For each 10 current willpower you have over 50, gain +5 Bondage Resist. + Willful Struggle Lucha deliberada -For each 10 current willpower you have over 50, gain +1% struggle effectiveness. -Por cada 10 de fuerza de voluntad actual que tengas sobre 50, gana +1% de efectividad en la lucha. +### For each 10 current willpower you have over 50, gain +1% struggle power. + Your willpower provides you with additional strength! (+AMOUNT%) ¡Tu fuerza de voluntad te proporciona fuerza adicional! (+AMOUNT%) Athlete @@ -8504,6 +10016,10 @@ You are harder to see when waiting. Eres más difícil de ver cuando esperas. Vault Bóveda +### You can sprint under flying enemies and through vulnerable, slowed, or disabled enemies. Does not work on immobile enemies such as doors and turrets. + +### Improved Vault + You can dash through enemies that aren't immobile. Puedes lanzarte a través de enemigos que no están inmóviles. Dodge I @@ -8518,154 +10034,170 @@ Dodge III Esquivar III +25 Evasion (50 total) +25 Evasión (50 en total) -Critical Strike -Golpe crítico -Excess accuracy (over 100%) is converted to bonus physical damage percentage at 50% efficiency. -El exceso de precisión (más del 100 %) se convierte en un porcentaje adicional de daño físico al 50 % de eficiencia. -Brute Force -Fuerza bruta -When enabled, your attacks deal 10% of your willpower as additional crush damage but cost 10 more stamina. -Cuando está habilitado, tus ataques infligen el 10 % de tu fuerza de voluntad como daño por aplastamiento adicional, pero cuestan 10 puntos más de resistencia. -One With Slime -uno con limo -While standing on slime/latex, you can cast rubber spells without components. -Mientras estás parado sobre limo/látex, puedes lanzar hechizos de goma sin componentes. -Convincing Disguise -Disfraz convincente -While completely covered in slime and not moving, your visibility is reduced considerably. -Mientras está completamente cubierto de baba y sin moverse, su visibilidad se reduce considerablemente. -Magical Implements -Implementos Mágicos -While holding a magical weapon like a staff or enchanted knife, your mana costs are reduced by 20%. -Mientras sostienes un arma mágica como un bastón o un cuchillo encantado, tus costos de maná se reducen en un 20%. -Mage Circuits -Circuitos de magos -Increases the size of the passive mana pool by +100. -Aumenta el tamaño de la reserva de maná pasiva en +100. -Archmage -archimago -Upcasted spells cost 25% less mana. -Los hechizos elevados cuestan un 25% menos de maná. -Temperature Play -Juego de temperatura -Fire and Ice damage do 30% more damage to fully bound enemies. -El daño de Fuego y Hielo inflige un 30 % más de daño a los enemigos totalmente atados. + + +### Strength Up + +### +20% Physical Damage + +### Deadly Aim + +### Increases crit multiplier by a % equal to your Battle Rhythm. + +### Accuracy I + +### +10 Accuracy + +### Accuracy II + +### +15 Accuracy (25 total) + +### Accuracy III + +### +25 Accuracy (50 total) + +### Martial Arts I + +### Unarmed strikes gain 15% accuracy and -10% stamina cost. + +### Martial Arts II + +### Unarmed strikes gain 20% accuracy (35% total) and -15% stamina cost (25% total). + +### Martial Arts III + +### Unarmed strikes gain 25% accuracy (60% total) and -25% stamina cost (50% total). + +### Precise Critical + +### When landing a critical strike with physical damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. + +### Precise Magic + +### When landing a critical strike with magic damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. + +### Magical Overload + +### When landing a critical strike with magic damage, crit multiplier is increased by 25% of your current DP. + + + +Brute Force +Fuerza bruta +When enabled, your attacks deal 10% of your willpower as additional crush damage but cost 10 more stamina. +Cuando está habilitado, tus ataques infligen el 10 % de tu fuerza de voluntad como daño por aplastamiento adicional, pero cuestan 10 puntos más de resistencia. + + +One With Slime +uno con limo +While standing on slime/latex, you can cast rubber spells without components. +Mientras estás parado sobre limo/látex, puedes lanzar hechizos de goma sin componentes. + + +Convincing Disguise +Disfraz convincente +### While standing still on slime, or fully bound with at least one latex item, you are harder to notice. Each latex restraint you are wearing increases this amount. Can be toggled off by clicking the buff icon. + +Magical Implements +Implementos Mágicos +### While holding a magical weapon like a staff or magic knife, your mana costs are reduced by 20%. + +Mage Circuits +Circuitos de magos +### Increases the size of the passive mana pool by +400. + +Archmage +archimago +Upcasted spells cost 25% less mana. +Los hechizos elevados cuestan un 25% menos de maná. + + +Temperature Play +Juego de temperatura +Fire and Ice damage do 30% more damage to fully bound enemies. +El daño de Fuego y Hielo inflige un 30 % más de daño a los enemigos totalmente atados. Fire Hazard Peligro de incendio Fire damage ignites enemies for 5 damage per turn for 6 turns. El daño de fuego enciende a los enemigos por 5 de daño por turno durante 6 turnos. Frozen Prison prisión congelada -Freezing an enemy applies 10% of the enemy's max hp in binding, plus 10 per turn of freeze. -Congelar a un enemigo aplica el 10 % de la vida máxima del enemigo en la vinculación, más 10 por turno de congelación. +### Freezing an enemy applies 10 binding per turn of freeze added, plus brings the enemy to a minimum of 20% binding. + Lightning Rod Pararrayos After casting an Air or Storm spell that costs mana, become Conductive and gain 300% electric resist for 3 turns. Después de lanzar un hechizo de aire o tormenta que cuesta maná, se vuelve conductivo y obtiene un 300 % de resistencia eléctrica durante 3 turnos. -Frustration -Frustración When enabled, enemies in chastity become angry Frustrated Pets when becoming helpless. Cuando está habilitado, los enemigos en castidad se enojan. Las mascotas frustradas se vuelven indefensas. + + Mana Up I maná arriba yo Increases maximum MP by 12 Aumenta el MP máximo en 12 Mana Up II Encender II -Increases maximum MP by 12 -Aumenta el MP máximo en 12 Mana Up III Encender III -Increases maximum MP by 12 -Aumenta el MP máximo en 12 + + Strong Mind I Mente fuerte I Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn Aumenta la distracción máxima en un 33 % de la base y la regeneración de distracción en -0,1 por turno Strong Mind II Mente fuerte II -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -Aumenta la distracción máxima en un 33 % de la base y la regeneración de distracción en -0,1 por turno Strong Mind III Mente fuerte III -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -Aumenta la distracción máxima en un 33 % de la base y la regeneración de distracción en -0,1 por turno + + Expert Wizard Asistente experto Gives you an additional spell choice slot Te da un espacio adicional para elegir hechizos. Master Wizard Mago maestro -Gives you an additional spell choice slot -Te da un espacio adicional para elegir hechizos. Legendary Wizard Mago legendario -Gives you an additional spell choice slot -Te da un espacio adicional para elegir hechizos. + + More Summons Más convocatorias -Increases the permanent summon cap by +1 (from 2 to 3) -Aumenta el límite de invocación permanente en +1 (de 2 a 3) +### Increases the permanent summon cap by +2 (from 2 to 4) + Many Summons muchas convocatorias -Increases the permanent summon cap by +1 (from 3 to 4) -Aumenta el límite de invocación permanente en +1 (de 3 a 4) -Bomb -Bomba -Channel for 1 turn for a bomb that does DamageDealt fire damage in an area after DelayTime turns. -Canaliza durante 1 turno para una bomba que inflige daño de fuego DamageDealt en un área después de los turnos de DelayTime. +### Increases the permanent summon cap by +2 (from 4 to 6) + +### Summon Bomb + +### Channel for 1 turn for a bomb that does DamageDealt blast damage in an area after DelayTime turns. + Fire in the hole! ¡Fuego en el hoyo! -Choose target AoE location -Elija la ubicación de AoE de destino -Rope Snare -trampa de cuerda -An invisible trap on the ground that stuns anyone who walks on it for Duration turns and applies 150 points of binding. -Una trampa invisible en el suelo que aturde a cualquiera que camine sobre ella durante turnos y aplica 150 puntos de atadura. -You set an invisible trap! -¡Pones una trampa invisible! -Select where to put the trap (it will be invisible) -Selecciona dónde poner la trampa (será invisible) + + +### An AoE trap on the ground that deals 25 chain damage, roots for 8 turns, and applies 80 points of binding. Takes 3 turns to setup. 200% crit multiplier. + +### You conjure a rope trap! + Rope Burst Explosión de cuerda -An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 40 points of rope binding. Snares for Duration turns. -Una explosión de cuerda inflige daño en cadena DamageDealt en un AoE de 3x3 y aplica 40 puntos de atadura de cuerda. Trampas para turnos de duración. +### An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 50 points of rope binding. Snares for Duration turns. + You call forth ropes from the abyss! ¡Llamas cuerdas desde el abismo! Select center of a a 3x3 AoE Seleccione el centro de un AoE de 3x3 + + Leather Package Paquete de cuero After conjuring a leather restraint, you can conjure up to three more without advancing time. Después de conjurar una restricción de cuero, puedes conjurar hasta tres más sin avanzar el tiempo. -Conjure Gag -Conjurar mordaza -Conjured Gag -Mordaza conjurada -The gag forces itself into your mouth and buckles tightly! -¡La mordaza se mete por la fuerza en la boca y se abrocha con fuerza! -The gag hits you! (DamageDealt) -¡Te pega la mordaza! (Daño Infligido) -Summons a gag which deals DamageDealt chain damage and silences for 15 turns. +40 binding if target is not silenced. -Invoca una mordaza que inflige daño en cadena DamageDealt y silencia durante 15 turnos. +40 vinculante si el objetivo no está silenciado. -You conjure a gag! -¡Evocas una mordaza! -The gag will appear next to you and fly toward the target point. -La mordaza aparecerá a tu lado y volará hacia el punto objetivo. -Conjure Armbinder -Conjurar brazalete -Conjured Armbinder -Brazalete conjurado -The armbinder slips itself around your arms and buckles itself tightly! -¡El brazalete se desliza alrededor de tus brazos y se abrocha con fuerza! -The armbinder hits you! (DamageDealt) -¡El brazalete te golpea! (Daño Infligido) -Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Blinded/Silenced targets are silenced/blinded for the same time. -Invoca un brazalete que inflige daño en cadena DamageDealt y desarma durante 13 turnos. Los objetivos cegados/silenciados quedan silenciados/cegados al mismo tiempo. -You conjure a armbinder! -¡Conjuras un brazalete! -The armbinder will appear next to you and fly toward the target point. -El brazalete aparecerá a tu lado y volará hacia el punto objetivo. + + Conjure Leather Cuffs Conjurar puños de cuero Conjured Leather Cuffs @@ -8680,6 +10212,8 @@ You conjure leather cuffs! ¡Evocas puños de cuero! The cuffs will appear next to you and fly toward the target point. Los brazaletes aparecerán junto a usted y volarán hacia el punto objetivo. + + Conjure Blindfold Conjurar los ojos vendados Conjured Blindfold @@ -8688,12 +10222,14 @@ The blindfold wraps around your head and buckles tightly! ¡La venda se envuelve alrededor de tu cabeza y se abrocha con fuerza! The blindfold hits you! (DamageDealt) ¡La venda te pega! (Daño Infligido) -Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not silenced. -Invoca una venda para los ojos que inflige daño en cadena DamageDealt y ciega durante 20 turnos. +40 vinculante si el objetivo no está silenciado. +### Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not blinded. + You conjure a blindfold! ¡Conjuras una venda en los ojos! The blindfold will appear next to you and fly toward the target point. La venda aparecerá a tu lado y volará hacia el punto objetivo. + + Conjure Cuffs Conjurar puños Conjured Cuffs @@ -8706,8 +10242,52 @@ Summons a pair of cuffs which deals DamageDealt chain damage and disarms for 5 t Invoca un par de esposas que infligen daño en cadena DamageDealt y desarma durante 5 turnos. +40 vinculante si el objetivo no está desarmado. You conjure a pair of cuffs! ¡Evocas un par de esposas! -The cuffs will appear next to you and fly toward the target point. -Los brazaletes aparecerán junto a usted y volarán hacia el punto objetivo. + + +Conjure Gag +Conjurar mordaza +The gag forces itself into your mouth and buckles tightly! +¡La mordaza se mete por la fuerza en la boca y se abrocha con fuerza! +The gag hits you! (DamageDealt) +¡Te pega la mordaza! (Daño Infligido) +### Summons a gag which deals DamageDealt chain damage and silences for 8 turns. +40 binding if target is not silenced. + +You conjure a gag! +¡Evocas una mordaza! +The gag will appear next to you and fly toward the target point. +La mordaza aparecerá a tu lado y volará hacia el punto objetivo. + + +### Conjure Anti-Magic Gag + +### Conjured Anti-Magic Gag + +### The anti-magic gag forces itself into your mouth and buckles tightly! + +### The anti-magic gag hits you! (DamageDealt) + +### Summons a magic-absorbing gag which deals DamageDealt teasing arcane damage and silences for 15 turns. Applies a debuff that increases miscast chance by 50%. + +### You conjure an anti-magic gag! + + + +Conjure Armbinder +Conjurar brazalete +Conjured Armbinder +Brazalete conjurado +The armbinder slips itself around your arms and buckles itself tightly! +¡El brazalete se desliza alrededor de tus brazos y se abrocha con fuerza! +The armbinder hits you! (DamageDealt) +¡El brazalete te golpea! (Daño Infligido) +### Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Cannot be blocked. + +You conjure a armbinder! +¡Conjuras un brazalete! +The armbinder will appear next to you and fly toward the target point. +El brazalete aparecerá a tu lado y volará hacia el punto objetivo. + + Conjure Legbinder Conjurar vendapiernas Conjured Legbinder @@ -8716,12 +10296,48 @@ The legbinder slips itself around your legs and buckles itself tightly! ¡La faja se desliza alrededor de tus piernas y se abrocha con fuerza! The legbinder hits you! (DamageDealt) ¡El vendaje te golpea! (Daño Infligido) -Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. -Invoca un legbinder que inflige daño en cadena DamageDealt y frena durante 10 turnos. +50 vinculante si el objetivo no está atrapado. +### Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. + You conjure a legbinder! ¡Conjuras un vendaje! The legbinder will appear next to you and fly toward the target point. El vendaje aparecerá a tu lado y volará hacia el punto objetivo. + + +### Conjure Latex Gag + +### Conjured Latex Gag + +### Latex Gag + +### Latex Glob + +### The gag forces itself into your mouth and snaps on tightly! + +### The amorphous rubber stretches out into a restraint on your body! + +### The amorphous rubber sticks to you! (DamageDealt) + +### Summons a gag which deals DamageDealt glue damage and silences for 15 turns. +40 binding if target is not silenced. + +### Conjure Latex Armbinder + +### Conjured Latex Armbinder + +### The armbinder slips itself around your arms and snaps on tightly! + +### Summons an armbinder which deals DamageDealt glue damage and disarms for 13 turns. Cannot be blocked. + +### Conjure Latex Legbinder + +### Conjured Latex Legbinder + +### The legbinder slips itself around your legs and snaps on tightly! + +### Summons a legbinder which deals DamageDealt glue damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. + + + Conjure Straitjacket Conjurar camisa de fuerza Conjured Straitjacket @@ -8730,12 +10346,14 @@ The straitjacket slips itself around your body and pulls your arms into its slee ¡La camisa de fuerza se desliza alrededor de tu cuerpo y te mete los brazos en las mangas! The straitjacket hits you! (DamageDealt) ¡La camisa de fuerza te golpea! (Daño Infligido) -Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. -Invoca una camisa de fuerza que agrega daño infligido y reduce la velocidad de lucha durante 14 turnos. +### Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. Cannot be blocked. + You conjure a straitjacket! ¡Evocas una camisa de fuerza! The straitjacket will appear next to you and fly toward the target point. La camisa de fuerza aparecerá a tu lado y volará hacia el punto objetivo. + + Conjure Harness Conjurar arnés Conjured Harness @@ -8744,12 +10362,14 @@ The harness slips itself around your torso and squeezes tightly as each buckle s ¡El arnés se desliza alrededor de su torso y se aprieta con fuerza a medida que cada hebilla se asegura una por una! The harness hits you! (DamageDealt) ¡El arnés te golpea! (Daño Infligido) -Summons a harness which deals DamageDealt crush damage. Adds +50 binding per 25% binding level on target, up to +200. -Invoca un arnés que inflige daño por aplastamiento DamageDealt. Añade +50 de enlace por cada 25 % de nivel de enlace en el objetivo, hasta +200. +### Summons a harness which deals DamageDealt chain damage. Adds +50 binding per 25% binding level on target, up to +200. + You conjure a harness! ¡Conjuras un arnés! The harness will appear next to you and fly toward the target point. El arnés aparecerá a tu lado y volará hacia el punto objetivo. + + Firecracker Petardo A small delayed explosion that deals DamageDealt fire damage. @@ -8758,14 +10378,16 @@ You shout an incendiary retort! ¡Gritas una réplica incendiaria! Choose AoE location Elija la ubicación de AoE + + Feather Burst Explosión de plumas After a brief delay, a small cloud of feathers tickles enemies for DamageDealt damage and +60 distraction for 3 turns. Después de un breve retraso, una pequeña nube de plumas hace cosquillas a los enemigos con daño DamageDealt y +60 de distracción durante 3 turnos. You conjure a burst of frenetic feathers! ¡Evocas un estallido de plumas frenéticas! -Choose AoE location -Elija la ubicación de AoE + + Tickle Cloud Nube de cosquillas For 10 turns, disembodied hands tickle a target location for DamageDealt tickle damage. @@ -8774,82 +10396,96 @@ A swarm of hands holding feathers appears! ¡Aparece un enjambre de manos sosteniendo plumas! Choose location Elegir la ubicación + + Frustrated Pet mascota frustrada The pet collapses in frustration. La mascota se derrumba de frustración. + + Mana Pet ¿Dónde está Pet? The enemy steals your pet from you! ¡El enemigo te roba tu mascota! + + Display Doll Muñeca de exhibición The enemy steals your doll from you! ¡El enemigo te roba tu muñeca! + + Conjure Petsuit Conjurar Petsuit -Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery. -Apunta solo a enemigos indefensos. Los transforma en una mascota que te sigue y aumenta tu recuperación de maná pasiva. +### Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery from mana pool. + You conjure an enchanted petsuit which wraps around your target, forcing her to follow you! ¡Conjuras un traje de mascota encantado que envuelve a tu objetivo, obligándolo a seguirte! You watch in horror as your own creation lunges toward you, binding your hands and feet! ¡Miras con horror cómo tu propia creación se lanza hacia ti, atándote las manos y los pies! Choose a helpless target Elige un objetivo indefenso + + Conjure Display Stand Conjurar soporte de exhibición -Target only Helpless enemies. Creates a fixture that increases passive mana recovery, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. -Apunta solo a enemigos indefensos. Crea un accesorio que aumenta la recuperación pasiva de maná, restaura 50 de carga y hace que los enemigos cercanos reciban un 50 % más de daño psíquico/encanto. +### Target only Helpless enemies. Creates a fixture that increases passive mana recovery from mana pool, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. + You conjure a fixture to hold your helpless target in place! ¡Conjuras un accesorio para mantener a tu objetivo indefenso en su lugar! -You watch in horror as your own creation surrounds you, locking you in place with a hefty click! +You watch in horror as your own creation encircles you, locking you in place with a hefty click! ¡Miras con horror cómo tu propia creación te rodea, bloqueándote en su lugar con un fuerte clic! -Choose a helpless target -Elige un objetivo indefenso + + Lesser Flash Destello menor -Ring -Anillo -Flash Bomb -bomba de destello Sparkles! Destellos! Mirror Image Imagen de espejo -A flash of light which renders anyone caught within blind for Duration turns -Un destello de luz que deja ciego a cualquiera atrapado dentro durante turnos de duración. +### A flash of light which renders anyone caught within blind for 7 turns + You charge up a bright flash! ¡Cargas un destello brillante! Select where to center the flash (SpellArea radius) Seleccione dónde centrar el flash (radio SpellArea) -A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged. -Un ruido fuerte que aturde por Duración gira y atrae a los enemigos hacia él. De largo alcance. + + +Ring +Anillo +### A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged with a 3 turn delay. + You point and a noise emanates from the location! ¡Señalas y un ruido emana de la ubicación! Select where to center the noise (SpellArea radius) Seleccione dónde centrar el ruido (radio SpellArea) + + +### Holy Blaze + +### Call down a 3x3 area of DamageDealt holy damage. Blinds enemies for 3 turns (and also yourself). + +### You summon a divine aura! + +### Select where to center the blast (SpellArea radius) + Greater Flash Gran destello -A massive flash of light which renders anyone caught within blind for Duration turns -Un enorme destello de luz que deja ciego a cualquiera atrapado dentro durante turnos de duración. -You charge up a bright flash! -¡Cargas un destello brillante! -Select where to center the flash (SpellArea radius) -Seleccione dónde centrar el flash (radio SpellArea) +### A massive flash of light which renders anyone caught within blind for 16 turns and stuns briefly. + Focused Flash Destello enfocado -Select where to center the flash (SpellArea radius) -Seleccione dónde centrar el flash (radio SpellArea) -A focused flash of light which renders anyone caught within blind for Duration turns -Un destello de luz concentrado que deja ciego a cualquiera atrapado dentro durante turnos de duración. +### A focused flash of light which renders anyone caught within blind for 30 turns and stuns for Duration turns. + You slowly charge up a powerful flash! ¡Cargas lentamente un poderoso flash! + + Shroud Sudario -Smoke Bomb -Bomba de humo Sleep Gas gas para dormir Select where to center the shroud (SpellArea radius) @@ -8858,14 +10494,18 @@ Creates a cloud for Duration turns that buffs evasion for all creatures. You are Crea una nube para los turnos de duración que mejora la evasión de todas las criaturas. Eres temporalmente invisible durante 8 turnos después de salir. You exhale a misty shroud Exhalas un velo brumoso + + Invisibility Invisibilidad Select which creature to buff Selecciona qué criatura pulir -Make the targeted creature invisible -Haz que la criatura objetivo sea invisible +### Make the targeted creature invisible, increasing stealth for Duration turns + You snap your fingers! ¡Chasqueas los dedos! + + CMD: Lock CMD: Bloquear Select which creature to lock @@ -8874,34 +10514,40 @@ Magically locks down a target, preventing them from struggling below the current Bloquea mágicamente a un objetivo, lo que evita que luche por debajo del nivel actual de vinculación hasta que un lanzador de hechizos enemigo lo libere (máximo 100% de vinculación). You say a command word, and magical locks bind your target! ¡Dices una palabra de comando y las cerraduras mágicas atan a tu objetivo! + + Chastity Castidad Select which creature to lock in a belt Seleccione qué criatura para bloquear en un cinturón -Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs and distracts constantly. -Haz objetivo a una criatura que esté deshabilitada. Agrega unión de + Daño infligido y aplica Castidad que evita que el objetivo se quite los tapones y distrae constantemente. +### Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs/toys, and distracts constantly. + You conjure a chastity belt, which latches onto your target! ¡Conjuras un cinturón de castidad, que se engancha a tu objetivo! Your own spell locks you in chastity! ¡Tu propio hechizo te encierra en la castidad! Something fun enters your body... Algo divertido entra en tu cuerpo... + + Zone of Purity Zona de Pureza Select an area Seleccione un área -Creates an area which applies Chastity constantly to any enemy over 50% bondage that steps inside. -Crea un área que aplica Chastity constantemente a cualquier enemigo con más del 50% de bondage que entre. +### Creates an area which applies Chastity constantly to any enemy over with any amount of binding that steps inside. + You conjure a realm of absolute purity. Evocas un reino de absoluta pureza. -Zone of Excitement + + +Zone of Excitement Zona de emoción -Select an area -Seleccione un área Creates an area which adds a conjured vibrating toy to enemies that step inside. Toy lasts 30 turns. Crea un área que agrega un juguete vibrador conjurado a los enemigos que entran. El juguete dura 30 turnos. You conjure a realm of absolute fun! ¡Evocas un reino de absoluta diversión! + + CMD: Capture CMD: captura Select which creature to bind @@ -8910,42 +10556,44 @@ Commands nearby restraints to bind a target, dealing DamageDealt chain damage, + Ordena restricciones cercanas para atar a un objetivo, lo que inflige daño en cadena DamageDealt, +50 de unión. Las cuerdas atrapan 3 vueltas/cuerda, los cinturones +20 ataduras/cinturón, las cadenas infligen +15 daños por aplastamiento/cadena. You say a command word, and the bindings on the ground do your bidding! ¡Di una palabra de mando y las ataduras en el suelo cumplen tus órdenes! + + CMD: Disenchant CMD: Desencantar -Select an area -Seleccione un área Target a large area. Permanently slows constructs, reduces attack speed by 50%, and deals 30 shadow damage. Refunds 50% mana at 3 or more targets. Cast on self to disenchant bindings. Apunte a un área grande. Ralentiza permanentemente las construcciones, reduce la velocidad de ataque en un 50 % e inflige 30 de daño de las Sombras. Reembolsa el 50% del maná en 3 o más objetivos. Lanzarse sobre uno mismo para desencantar las ataduras. You say a command word, siphoning the magic from nearby constructs! ¡Dices una palabra de comando, desviando la magia de las construcciones cercanas! + + CMD: Vibrate CMD: Vibrar -Select an area -Seleccione un área Target a large area. Enemies with plugs or toys are teased for Duration turns, taking charm damage each turn. Apunte a un área grande. Los enemigos con enchufes o juguetes son objeto de burlas durante los turnos de duración, y reciben daño de amuleto en cada turno. You say a command word, causing all toys in the area to vibrate! ¡Dices una palabra de comando, haciendo que todos los juguetes en el área vibren! + + CMD: Explosive Finish CMD: Acabado Explosivo Explosive Finish Acabado explosivo -Select an area -Seleccione un área Target a large area. Consumes enemy distraction to deal up to DamageDealt charm damage, twice if at 90% distraction or more. Apunte a un área grande. Consume la distracción enemiga para infligir hasta daño de encanto DamageDealt, dos veces si tiene una distracción del 90% o más. You say a command word, resulting in a surge of energy entering your targets! ¡Dices una palabra de comando, lo que resulta en una oleada de energía que ingresa a tus objetivos! + + CMD: Release CMD: Liberar -Select an area -Seleccione un área Target bound (but unlocked) targets in a 3x3 area, reducing binding by 100. Removes unlocked restraints on player that are removable. Objetivos vinculados (pero desbloqueados) en un área de 3x3, lo que reduce la vinculación en 100. Elimina las restricciones desbloqueadas en el jugador que son extraíbles. You say a command word, causing restraints to loosen! ¡Dices una palabra de mando, lo que hace que se aflojen las restricciones! You say a command word, but your restraints remain tight! ¡Dices una palabra de mando, pero tus restricciones siguen siendo estrictas! + + Remove Slime Eliminar limo Select a creature or yourself @@ -8956,6 +10604,8 @@ You issue a command to the slime! ¡Emites una orden al limo! You whisper a command word, but the slime is already hardened and won't budge... Susurras una palabra de comando, pero la baba ya está endurecida y no se mueve... + + Binding Vines Enredaderas vinculantes Binding Ropes @@ -8980,32 +10630,34 @@ Chains wrap around you! (DamageDealt) ¡Las cadenas te envuelven! (Daño Infligido) A web of belts buckles in place around your body! (DamageDealt) ¡Una telaraña de cinturones se abrocha alrededor de tu cuerpo! (Daño Infligido) -Awaken -Despertar + + Awaken Despertar The slime awakens and turns on you!!! ¡¡¡El limo despierta y se vuelve contra ti!!! Select area to awaken Seleccione el área para despertar -Activates the slime in an area, causing it to deal DamageDealt glue damage. Encases fully bound targets. -Activa el limo en un área, lo que hace que inflija daño de pegamento DamageDealt. Encierra objetivos completamente enlazados. +### Activates the slime in an area, causing it to deal 25 glue damage. Encases fully bound targets. + You command the slime to draw in targets! ¡Usted le ordena al limo que atraiga objetivos! + + CMD: Bind CMD: enlazar Select area to bind Seleccione el área para enlazar Commands nearby restraints to bind targets standing on them. Rope: 30 chain dmg/5 turn snare. Chain: 30 crush dmg/8 turn disarm. Belts: 50 binding/3 turns vulnerability. Ordena a las restricciones cercanas que aten a los objetivos que se encuentran sobre ellas. Cuerda: 30 cadenas de daño/5 vueltas de caja. Cadena: 30 daños por aplastamiento/8 giros para desarme. Cinturones: 50 ataduras/3 vueltas vulnerabilidad. -You say a command word, and the bindings on the ground do your bidding! -¡Di una palabra de mando y las ataduras en el suelo cumplen tus órdenes! + + CMD: Unlock CMD: Desbloquear Select which creature to unlock Selecciona qué criatura desbloquear -On yourself: Removes all purple locks. On a creature: Reduces the target's binding by 20 points. -En ti mismo: elimina todos los mechones morados. En una criatura: reduce la unión del objetivo en 20 puntos. +### On yourself: Removes one purple (magical) lock. On a creature: Reduces the target's binding by 20 points. + You speak a command word! ¡Hablas una palabra de mando! None of the locks you are wearing respond to your magic. @@ -9014,30 +10666,38 @@ You can't help her with this. No puedes ayudarla con esto. You must target yourself, an enemy, or a locked object. Debes apuntarte a ti mismo, a un enemigo o a un objeto bloqueado. +### The command is intricate and you are unable to enunciate it properly! + +### CMD: Greater Unlock + +### On yourself: Removes all purple (magical) locks. On a creature: Reduces the target's binding by 100 points. + +### You speak a powerful command word! + Lesser Invisibility Invisibilidad menor -Select which creature to buff -Selecciona qué criatura pulir -Make the targeted creature invisible -Haz que la criatura objetivo sea invisible You become semitransparent! ¡Te vuelves semitransparente! + + Camouflage Camuflaje Select yourself Seleccione usted mismo -Enemies have a harder time noticing you for Duration turns. Cancels if you move, cast, or sleep. -Los enemigos tienen más dificultades para notarte durante los turnos de duración. Se cancela si te mueves, lanzas o duermes. +### Enemies have a harder time noticing you for Duration turns. Cancels if you move (unless you are near a wall), cast, or sleep. + You pose in a clandestine manner. Posas de manera clandestina. + + Darkblade Cuchilla oscura -Select which creature to buff -Selecciona qué criatura pulir -Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks -Haz que la criatura objetivo (o tú mismo) gane +20 de daño por turnos de duración o 5 ataques +### Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks, whichever is lower. + You call forth dark runes on your weapon and arms! ¡Invocas runas oscuras en tu arma y brazos! + + Heal Sanar Select which creature to heal @@ -9046,44 +10706,58 @@ Restore 45 hitpoints to an allied creature. Restaura 45 puntos de vida a una criatura aliada. You utter a word of healing. Pronuncias una palabra de curación. + + Flame Blade Hoja de llama -When enabled: Weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. -Cuando está habilitado: los ataques con armas cuestan maná y crean un ataque de llamas que inflige 30 de daño de fuego a los objetivos adyacentes. -Flame Blade -Hoja de llama -Engulf -Sumergir -When enabled: Your melee attacks deal +20 glue damage and create slime. -Cuando está habilitado: tus ataques cuerpo a cuerpo infligen +20 de daño por pegamento y crean baba. -Strengthen -Fortalecer -When enabled: Struggling is more powerful, and your attack damage is increased by +20 if your weapon deals physical damage. -Cuando está habilitado: Luchar es más poderoso y tu daño de ataque aumenta en +20 si tu arma inflige daño físico. +### When enabled: Melee weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. + +### Tentacle Slap + +### You have the power to make tentacles out of slime when you attack. When enabled: Your attacks deal +10 glue damage and create slime. 150% bind efficiency. + +### Chain Strike + +### You have the power to summon chains when you attack. When enabled: Your attacks deal +10 chain damage and create chains. 125% bind efficiency. + +### Ropework + +### You have the power to weave ropes between your attacks. When enabled: Your attacks deal +10 chain damage and create ropes. 400% bind efficiency. + +### Leather Whip + +### You have the power to strike with conjured belts when you attack. When enabled: Your attacks deal +10 pain damage and create belts. 250% bind efficiency. + +### Super Strength + +### When enabled: Struggling is more powerful, and your melee attack damage is increased by +20 if your weapon deals physical damage. + Your body glows with magical energy! ¡Tu cuerpo brilla con energía mágica! + + Enhance Will mejorar la voluntad When enabled: Miscast chance is halved Cuando está habilitado: la probabilidad de lanzamiento erróneo se reduce a la mitad You focus intently! ¡Te enfocas intensamente! + + Truesight Vista verdadera When enabled: Drain mana every turn to see through walls and increase accuracy by 40%. Cuando está habilitado: drena maná cada turno para ver a través de las paredes y aumentar la precisión en un 40%. -Heartsense -sentido del corazón -Highlight the locations of enemies through walls on the map for 12 turns. -Resalta las ubicaciones de los enemigos a través de las paredes del mapa durante 12 turnos. -Light -Luz + + +### Echolocation + +### Close your eyes to dramatically improve your hearing and locate enemies through walls. + Produce a bright light for Duration turns. Has no effect in dark rooms. Produce una luz brillante para los turnos de duración. No tiene efecto en cuartos oscuros. -Floating Weapon -Arma flotante -When enabled: While hands are bound, you can still use weapons, but attacks cost mana. -Cuando está habilitado: mientras las manos están atadas, aún puede usar armas, pero los ataques cuestan maná. + + Levitate Erigir por levitación When enabled and above 0 stamina: Drain 5 mana per step to reduce slow level by 1 (if above 1), or 20 mana to ignore a temporary slow effect. @@ -9096,22 +10770,24 @@ You levitate forward despite being slowed! ¡Levitas hacia adelante a pesar de estar ralentizado! You hover with reduced effect from bindings. Flotas con el efecto reducido de las ataduras. + + Iron Blood Sangre de hierro -Select yourself -Seleccione usted mismo Channel 4 turns: Halves SP cost of melee attacks by 50%, but increases MP cost of spells by 25%. Ends on sleep or recast. Canal 4 turnos: reduce a la mitad el costo de SP de los ataques cuerpo a cuerpo en un 50 %, pero aumenta el costo de MP de los hechizos en un 25 %. Finaliza al dormir o refundir. Your skin glows a pale red! ¡Tu piel brilla con un rojo pálido! + + Stone Skin Piel de piedra -Select which creature to buff -Selecciona qué criatura pulir Make the targeted creature (or yourself) gain +20 armor for Duration turns Haz que la criatura objetivo (o tú mismo) gane +20 de armadura por turnos de duración Your skin takes on the appearance of cracked earth! ¡Tu piel adquiere el aspecto de tierra agrietada! + + The EnemyName gains increased physical armor! ¡El EnemyName gana una mayor armadura física! The EnemyName buffs the physical armor of her allies! @@ -9126,6 +10802,10 @@ The EnemyName creates a zone of increased defense! ¡El EnemyName crea una zona de mayor defensa! EnemyName uses a charm to buff an enemy's Magic Armor and Evasion! ¡EnemyName usa un amuleto para potenciar la armadura mágica y la evasión de un enemigo! +### EnemyName supports a witch with a magical shield! + +### Shield the Witch! + EnemyName uses a glowing talisman to buff an undead's physical armor and speed! ¡EnemyName usa un talismán que brilla intensamente para mejorar la armadura física y la velocidad de un no-muerto! You create a zone of increased defense! @@ -9134,16 +10814,18 @@ You create a protective zone! ¡Creas una zona protectora! You create a fan of icicles! ¡Creas un abanico de carámbanos! -Wall -Muro + + Select where to put the wall (cannot place on occupied squares) Seleccione dónde colocar el muro (no se puede colocar en casillas ocupadas) -Create a stationary wall for Duration turns. It takes 20% damage from spells. -Cree un muro estacionario para los giros de Duración. Recibe un 20% de daño de hechizos. +### Create a stationary wall for Duration turns. It takes 20% damage from spells. Cast on an open door to close it and give it additional armor. + A wall starts to form! ¡Empieza a formarse un muro! You create a line on the ground. Creas una línea en el suelo. + + True Steel Acero verdadero Choose a target. @@ -9152,6 +10834,8 @@ A melee strike that deals DamageDealt slash damage, x2.5 against unaware humanoi Un ataque cuerpo a cuerpo que inflige daño de corte DamageDealt, x2.5 contra enemigos humanoides desprevenidos. You slash with an ethereal blade! ¡Cortas con una espada etérea! + + Summon Familiar Invocar familiar Select where to put the familiar (cannot place on occupied squares) @@ -9162,6 +10846,8 @@ A familiar appears! ¡Aparece un familiar! You create a circle on the ground with your foot! ¡Creas un círculo en el suelo con tu pie! + + Summon Storm Crystal Invocar cristal de tormenta Select where to put the storm crystal (cannot place on occupied squares) @@ -9172,6 +10858,8 @@ A crackling crystal emerges from the ground! ¡Un cristal crepitante emerge del suelo! You stomp and the ground shakes! ¡Tú pisas fuerte y el suelo tiembla! + + Summon Fire Mote Invocar mota de fuego Select where to put the fire mote (cannot place on occupied squares) @@ -9182,6 +10870,8 @@ A flaming spirit answers your call! ¡Un espíritu llameante responde a tu llamada! You call upon the plane of Fire! ¡Llamas al plano del Fuego! + + Summon Earth Mote Invocar mota de tierra Select where to put the earth mote (cannot place on occupied squares) @@ -9192,6 +10882,8 @@ A rocky spirit rushes forth from the ground! ¡Un espíritu rocoso brota del suelo! You call upon the plane of Earth! ¡Llamas al plano de la Tierra! + + Summon Air Mote Invocar mota de aire Select where to put the air mote (cannot place on occupied squares) @@ -9202,6 +10894,8 @@ A dust devil arises in front of you! ¡Un remolino de polvo surge frente a ti! You call upon the plane of Air! ¡Llamas al plano del Aire! + + Summon Water Mote Invocar mota de agua Select where to put the water mote (cannot place on occupied squares) @@ -9212,6 +10906,8 @@ A watery spirit bubbles up from the ground! ¡Un espíritu acuoso brota del suelo! You call upon the plane of Water! ¡Llamas al plano del Agua! + + Summon Shadow Warrior Invocar guerrero de sombras Select where to put the shadow warrior (cannot place on occupied squares) @@ -9222,6 +10918,22 @@ Invoca a un guerrero de sombras durante 16 turnos que inflige daño DamageDealt ...y el abismo responde! You call... Llama... + + +### Summon Nature Spirit + +### Select where to put the nature spirit (cannot place on occupied squares) + +### Create a natural spirit that fires vine projectiles and has a healing aura that restores HP to allies and regenerates your stamina. + +### A healing wisp appears! + +### You call upon the powers of nature! + + + + + Summon Golem Invocar gólem Select where to put the golem (cannot place on occupied squares) @@ -9232,6 +10944,8 @@ A golem arises! ¡Surge un golem! You stomp your foot and draw the words of life on the floor! ¡Pateas fuerte y dibujas las palabras de vida en el suelo! + + Summon Decoy Invocar señuelo Select where to create an illusion (cannot place on occupied squares) @@ -9242,8 +10956,12 @@ A shadow of yourself materializes! ¡Se materializa una sombra tuya! You create a line on the ground and toss in a lock of your hair! ¡Creas una línea en el suelo y arrojas un mechón de tu cabello! + + Feather Explosion Explosión de plumas + + Elastic Grip Agarre elástico A latex hand reaches out and pulls an enemy close to you! Base pull strength: 4 @@ -9254,10 +10972,10 @@ There's an obstacle in the way! ¡Hay un obstáculo en el camino! Select a target to pull Seleccione un objetivo para tirar + + Slime Blast Explosión de limo -Apprentice's Slime -Baba de aprendiz Witch's Slime Baba de bruja Rubber Explosion @@ -9272,44 +10990,48 @@ You conjure a pool of slime! ¡Conjuras un charco de baba! Select where the slime will appear Seleccione dónde aparecerá el limo + + Slime Eruption Erupción de limo -A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them friefly. -Una enorme explosión de baba inflige daño de pegamento DamageDealt a los enemigos que entran y los ata rápidamente. +### A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them briefly. + You conjure an explosion of slime! ¡Conjuras una explosión de baba! -Select where the slime will appear -Seleccione dónde aparecerá el limo + + Slime Splash Salpicadura de limo After one turn, deals DamageDealt glue damage in a small area and spreads slime. Después de un turno, inflige daño de pegamento DamageDealt en un área pequeña y esparce limo. You conjure a small amount of slime! ¡Conjuras una pequeña AMOUNT de baba! -Select where the slime will appear -Seleccione dónde aparecerá el limo + + Water Ball Bola de agua -Fast projectile. Deals DamageDealt acid damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. -Proyectil rápido. Inflige DañoDaño causado por ácido. Los objetivos empapados reciben +35 % de electricidad/hielo, -42 % de fuego y provocan el 50 % del daño eléctrico. +### Fast projectile. Deals DamageDealt soap damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. + You hurl a ball of water! ¡Lanzas una bola de agua! -Choose aim direction -Elija la dirección del objetivo + + Tidal Sphere Esfera de marea -Slow moving projectile, deals DamageDealt acid damage to enemies it passes thru. Leaves a large amount of water in its wake. -Proyectil de movimiento lento, inflige daño de ácido DamageDealt a los enemigos por los que pasa. Deja una gran AMOUNT de agua a su paso. +### Slow moving projectile, deals DamageDealt soap damage to enemies it passes thru. Leaves a large amount of water in its wake. + You raise a huge mass of water! ¡Levantas una enorme masa de agua! -Choose aim direction -Elija la dirección del objetivo + + The boulder knocks you to the ground! ¡La roca te tira al suelo! The water covers you and drenches you! ¡El agua te cubre y te empapa! You step in water and become wet. Te metes en el agua y te mojas. + + Ice Breath Aliento de hielo A field of icicles that deals DamageDealt damage on a hit and stuns briefly. @@ -9318,42 +11040,32 @@ You breath out a chilling frost! ¡Exhalas una escarcha helada! Select where to put the icicles (SpellArea radius) Seleccione dónde colocar los carámbanos (radio SpellArea) -Zombie Orb -Orbe zombi -Lesser Zombie Orb -Orbe zombie menor -Freezing Zombie Orb -Orbe zombi helado -Mystic Bolt -Rayo místico -The mystic bolt paralyzes you! -¡El rayo místico te paraliza! + + +### The mummy's curse paralyzes you! + Rubber Bullets Balas de goma You are hit by a fusilade of rubber bullets! ¡Te alcanza una ráfaga de balas de goma! The rubber bullets congeal into a slimy material on your body! ¡Las balas de goma se congelan en un material viscoso en tu cuerpo! + + Nature Blast explosión de la naturaleza Raging Vines Enredaderas furiosas -Magic Ribbons -Cintas Mágicas + + Magic Belts Cinturones Mágicos -Slime -Limo -Slime -Limo You project a pool of sticky slime! ¡Proyectas un charco de baba pegajosa! Arrow of Love Flecha de amor You loose a glowing arrow! ¡Sueltas una flecha brillante! -Bondage Buster -destructor de la servidumbre Blaster blaster You charge up a beam and fire it! @@ -9366,18 +11078,16 @@ The slime from your staff coats your body, granting you strange powers! ¡La baba de tu bastón cubre tu cuerpo y te otorga extraños poderes! The power of the four elements flows through your veins! ¡El poder de los cuatro elementos fluye por tus venas! -Firebolt -Saeta de fuego An explosion knocks you to the ground! ¡Una explosión te tira al suelo! + + Curious Spell hechizo curioso You have been flummoxed! ¡Te has quedado desconcertado! -Cuff Bola -Bola de puño -Throw Syringe -Lanzar Jeringa + + You feel a prick as a small syringe hits you, and you start feeling drowsy... Sientes un pinchazo cuando te golpea una pequeña jeringa y empiezas a sentirte somnoliento... The thrown cuffs snap shut around your ankles and slow you down!!! @@ -9396,26 +11106,30 @@ The spores make you feel excited! ¡Las esporas te hacen sentir emocionado! The toxic spores make you feel faint... Las esporas tóxicas te hacen sentir débil... + + Magic Hairpin horquilla mágica The magic hairpin goes for your eyes and forces you to blink! ¡La horquilla mágica va a por tus ojos y te obliga a parpadear! + + Ice Storm Tormenta de nieve + + Icy Aura Aura helada -Icy Aura -Aura helada + + Slime Ball bola de limo -Witch's Slime Ball -Bola de baba de bruja -A ball of slime leaves a trail of sticky slime (40 damage when stepped on). It deals DamageDealt glue damage on a hit. -Una bola de baba deja un rastro de baba pegajosa (40 de daño al pisarla). Inflige daño de pegamento DamageDealt en un golpe. +### A ball of slime leaves a trail of sticky slime (20 damage when stepped on). It deals DamageDealt glue damage on a hit. + You hurl a ball of slime! ¡Lanzas una bola de baba! -Choose aim direction -Elija la dirección del objetivo + + Summon Skeleton Invocar esqueleto Mass Summon Skeleton @@ -9428,20 +11142,36 @@ A gang of SummonCount zombies emerges from the floor! ¡Una pandilla de zombis SummonCount emerge del suelo! A bunch of gags fly out from your satchel! ¡Un montón de gags salen volando de tu cartera! + + A floating hand appears and cracks its knuckles! ¡Aparece una mano flotante y hace crujir los nudillos! A floating gag appears and starts flying toward you! ¡Aparece una mordaza flotante y comienza a volar hacia ti! +### A floating blindfold appears and starts flying toward you! + +### A floating yoke appears and starts flying toward you! + +### A floating armbinder appears and starts flying toward you! + +### A floating straitjacket appears and starts flying toward you! + +### A floating harness appears and starts flying toward you! + A set of shackles opens wide and starts going for your wrists! ¡Un conjunto de grilletes se abre de par en par y comienza a ir a por tus muñecas! A swarm of shackles approaches you! ¡Un enjambre de grilletes se te acerca! +### A swarm of gags approaches you! + A cloud of locks and chains clatters as it levitates toward you! ¡Una nube de candados y cadenas traquetea mientras levita hacia ti! A huge cloud of locks and chains clatters as it levitates toward you! ¡Una enorme nube de candados y cadenas traquetea mientras levita hacia ti! Floating hands appear by the conjurer's side as she points her staff! ¡Aparecen manos flotantes al costado del prestidigitador mientras apunta con su bastón! + + Floating books appear near the caster! ¡Los libros flotantes aparecen cerca del lanzador! Dusty tomes appear near the caster! @@ -9462,6 +11192,8 @@ Frigid books appear near the caster! ¡Aparecen libros helados cerca del lanzador! Devilish books appear near the caster! ¡Los libros diabólicos aparecen cerca del lanzador! + + A floating book appears near the caster! ¡Aparece un libro flotante cerca del lanzador! A dusty tome appears near the caster! @@ -9482,8 +11214,10 @@ A frigid book appears near the caster! ¡Aparece un libro helado cerca del lanzador! A devilish book appears near the caster! ¡Un libro diabólico aparece cerca del lanzador! -Your restraints rub you in sensitive places as you move... -Tus ataduras te rozan en lugares sensibles mientras te mueves... + + +### Your struggling leaves you aroused because of the RestraintName... + You feel your restraints squeeze you and tingle with painful sensations! ¡Sientes que tus ataduras te aprietan y hormiguean con sensaciones dolorosas! 'Do not resist,' whispers a voice in your head... @@ -9496,18 +11230,38 @@ You feel your body overflow with energy... Sientes que tu cuerpo se desborda de energía... The crystals react to your struggle attempts with a strange energy! ¡Los cristales reaccionan a tus intentos de lucha con una extraña energía! + + Cast Spell (XXX turn delay) Cast Spell (retraso de turno XXX) + + You feel the vibrations leaving your body... Sientes las vibraciones salir de tu cuerpo... You feel your toys start to buzz... Sientes que tus juguetes empiezan a zumbar... You your toys continue to buzz... Tus juguetes siguen zumbando... -The EnemyName remotely causes your toys to to buzz!!! -¡El EnemyName hace que tus juguetes zumben remotamente! +### The EnemyName remotely causes your toys to buzz!!! + You feel the plugs inside you while walking. Sientes los tapones dentro de ti mientras caminas. +### Your toys pulse and tingle occasionally. + +### Your toys tease you and buzz gently... + +### Your vibrating toys are difficult to ignore... + +Your toys buzz strongly, making it difficult to concentrate! +¡Tus juguetes zumban con fuerza, lo que dificulta la concentración! +You tremble as the toys give off intense vibrations! +¡Tiemblas mientras los juguetes emiten intensas vibraciones! +### Your toys torture you with intense pulsations! + +### Your whole body resonates with the intense stimulation! + +### The stimulation is so intense you can hardly breath! + Your toys stop vibrating. Tus juguetes dejan de vibrar. You feel slightly full as you move... @@ -9532,8 +11286,16 @@ You hop and feel the plugs shifting around inside your body. Saltas y sientes los tapones moverse dentro de tu cuerpo. The plugs shift in and out with each hop... Los enchufes se mueven dentro y fuera con cada salto... -The massive plugs slide in and out mercilessly as you hop... -Los enormes tapones se deslizan hacia dentro y hacia fuera sin piedad mientras saltas... +### The massive plugs slide in and out sensually as you hop... + +### You crawl forward! + +### You crawl and feel the plugs shifting around inside your body. + +### The plugs shift in and out as you crawl... + +### The massive plugs slide in and out sensually as you crawl... + You inch forward slowly! ¡Avanza lentamente! You inch forward, feeling the movement of your plugs. @@ -9560,60 +11322,92 @@ You wriggle uselessly, tormented by the massive plugs inside of you! ¡Te retuerces inútilmente, atormentado por los enormes tapones dentro de ti! You climb into the grate Te subes a la rejilla -Mmmph... -Mmmm... -Mmmmmmmmm... -Mmmmmmmmm... -Hhmmpphh... -Hmmmpphh... + + +### Mmmph... + +### Mmmmmmmmm... + +### Hhmmpphh... + Gghhhh!!! ¡¡¡Gghhhh!!! Mmmmmphh!!! Mmmmmmm!!! -Mmm... -Mmm... +### Mmm... + MMM!!! ¡¡¡MMM!!! Mmmmmm. Mmmmm. + + Mmmaaaaahhh... Mmmmmmm... -Mmmmmmmmm~ -Mmmmmmmmm~ -Unnnghhh... -Unnnghhh... -Mmmmmmmphhh.. -Mmmmmmmmm.. -Mmmmmphh~ -Mmmmmmm~ -Mmm~ -Mmm~ -Mmmmm~~ -Mmmmm~~ -Mmmmmm~~~ -Mmmmm~~~ -You are blinded! -¡Estás ciego! -You took DamageDealt damage! -¡Recibiste daño de DamageDealt! -Your own rope trap springs upon you! -¡Tu propia trampa de cuerda salta sobre ti! -You get caught in sticky slime! -¡Quedas atrapado en limo pegajoso! -The slime ball sticks to you! -¡La bola de limo se te pega! -The slime ball sticks to you and slows you! -¡La bola de baba se te pega y te ralentiza! -You feel a powerful sensation run through your body! -¡Sientes una poderosa sensación recorrer tu cuerpo! -Beams of light wrap around your body and feel warm on your skin! -¡Haces de luz envuelven tu cuerpo y se sienten cálidos en tu piel! -Crystals begin to form around your limbs! -¡Empiezan a formarse cristales alrededor de tus extremidades! -A magic chain secures itself around your body! -¡Una cadena mágica se asegura alrededor de tu cuerpo! -A rope wraps itself around your body! -¡Una cuerda se envuelve alrededor de tu cuerpo! +### Mmmmmmmmm~ + +### Unnnghhh... + +### Mmmmmmmphhh.. + +### Mmmmmphh~ + +### Mmm~ + +### Mmmmm~~ + +### Mmmmmm~~~ + + + +### Mmph... + +### Mmmm! + +### Hmmph. + +### Mmmm... + +Mmmph. +Mmmm. + + +### Mmmmmmph!!! + +### Gmmmmph! + +### Hmmmmph~!! + +You are blinded! +¡Estás ciego! +### You took DamageTaken damage! + +You get caught in sticky slime! +¡Quedas atrapado en limo pegajoso! +### You get caught in a sticky slime bubble! + +The slime ball sticks to you! +¡La bola de limo se te pega! +The slime ball sticks to you and slows you! +¡La bola de baba se te pega y te ralentiza! +You feel a powerful sensation run through your body! +¡Sientes una poderosa sensación recorrer tu cuerpo! +### You feel a pleasurable sensation run through your body! + +Beams of light wrap around your body and feel warm on your skin! +¡Haces de luz envuelven tu cuerpo y se sienten cálidos en tu piel! +Crystals begin to form around your limbs! +¡Empiezan a formarse cristales alrededor de tus extremidades! +A magic chain secures itself around your body! +¡Una cadena mágica se asegura alrededor de tu cuerpo! +### An animated chain secures itself around your body! + +### A magic rope secures itself around your body! + +### A magic belt secures itself around your body! + +A rope wraps itself around your body! +¡Una cuerda se envuelve alrededor de tu cuerpo! A ribbon animates and becomes entwined around you! ¡Una cinta se anima y se entrelaza a tu alrededor! A belt buckles itself tightly around your body! @@ -9622,20 +11416,16 @@ A vine slithers across your body and tightens! ¡Una enredadera se desliza por tu cuerpo y aprieta! The spell hits you and slows you down! ¡El hechizo te golpea y te frena! -Rope -Soga +### Witch's Rope + Rope Tendrils Zarcillos de cuerda -Blessed Wrappings -Envolturas benditas The Blessing La bendición A long tendril emerges from the kraken's body! ¡Un largo zarcillo emerge del cuerpo del kraken! Coiled ropes spring up from the floor! ¡Cuerdas enrolladas brotan del suelo! -A long tendril emerges from the kraken's body! -¡Un largo zarcillo emerge del cuerpo del kraken! Several glowing wrappings emerge! ¡Emergen varios envoltorios brillantes! A glowing wrapping emerges and starts moving toward you! @@ -9654,22 +11444,26 @@ Ropes wrap themselves around your body from all sides! ¡Las cuerdas se envuelven alrededor de tu cuerpo por todos lados! Wrappings appear and wrap you head to toe! ¡Aparecen las envolturas y te envuelven de pies a cabeza! -Ropes wrap themselves around your body from all sides! -¡Las cuerdas se envuelven alrededor de tu cuerpo por todos lados! -Nature magic causes vines to sprout around you! -¡La magia de la naturaleza hace que broten enredaderas a tu alrededor! -Your clothes are stripped and replaced! -¡Tu ropa es despojada y reemplazada! +### A spell transforms your wrappings into hexed latex! + +### A spell engulfs you in wrappings! + +### Vines sprout around you and grab hold of your limbs! + Your clothes are stripped and replaced! ¡Tu ropa es despojada y reemplazada! Vines tear off your clothes! ¡Las vides te arrancan la ropa! Restraints materialize on your body! ¡Las restricciones se materializan en tu cuerpo! + + The orb explodes into a burst of ribbons! ¡El orbe explota en una explosión de cintas! The orb tears off your clothes! ¡El orbe te arranca la ropa! + + Charm Trap Trampa de encanto Ribbon Trap @@ -9680,8 +11474,6 @@ Mummy Trap Trampa de momia Rope Trap trampa de cuerda -Rope Trap -trampa de cuerda Holy Rope Trap Trampa de cuerda sagrada Belt Trap @@ -9692,14 +11484,22 @@ Slime Trap Trampa de limo Chain Trap Trampa de cadena +### Shadow Latex Trap + +### Demonic Sigil + +### Unstable Crystals + Gas Trap trampa de gas -Gas Trap -trampa de gas -Sleep Dart -dardo del sueño +### Latex Engulfment + +### Latex Spherification + Sleep Dart dardo del sueño + + A talisman on the floor explodes, sending a cloud of charms flying around you! ¡Un talismán en el suelo explota, enviando una nube de encantos volando a tu alrededor! Magical binding ribbons emerge from the walls! @@ -9722,12 +11522,26 @@ Slimes pours out from the walls and ceiling! ¡La baba sale de las paredes y el techo! Ethereal chains appear all around you! ¡Cadenas etéreas aparecen a tu alrededor! -You hear the sound of glass breaking, and a cloud of green gas rises around you! -¡Escuchas el sonido de un vidrio rompiéndose y una nube de gas verde se eleva a tu alrededor! +### Shadows constrict around you! + +### An otherworldly sigil appears below you! + +### Crystals rise up around you! + +### Something shiny seems to be stretched out over the floor! + +### A rubber bubble starts forming around you! + +### A rubber ball starts forming around you! + You hear the sound of glass breaking, and a cloud of pink gas rises around you! ¡Escuchas el sonido de un vidrio rompiéndose y una nube de gas rosa se eleva a tu alrededor! +You hear the sound of glass breaking, and a cloud of green gas rises around you! +¡Escuchas el sonido de un vidrio rompiéndose y una nube de gas verde se eleva a tu alrededor! The charms stick themselves all over your body! ¡Los dijes se pegan por todo tu cuerpo! +### A metal pole catches you from below! + The ribbons tie themselves tightly around your body and won't let go! ¡Las cintas se atan firmemente alrededor de tu cuerpo y no se sueltan! Shackles close themselves over your limbs! @@ -9746,6 +11560,18 @@ The high-tech cables wrap themselves over your body! ¡Los cables de alta tecnología se enrollan sobre tu cuerpo! The slime pours all over you! ¡El limo se derrama sobre ti! +### A giant cube of latex engulfs you! + +### A giant bubble of latex engulfs you and inflates, sealing you in! + +### A giant latex ball swallows you and inflates, sealing around your neck! + +### A sinister power wraps itself around you and solidifies! + +### Dark magics swirl around you and solidify into shiny rubber! + +### Crystals grow and spread across your limbs! + The magic chains wrap themselves around your body! ¡Las cadenas mágicas se envuelven alrededor de tu cuerpo! Your clothes are getting ripped away! @@ -9756,10 +11582,12 @@ You breathe in the gas, and a wave of pleasure hits your whole body. Inhalas el gas y una ola de placer golpea todo tu cuerpo. You breathe in the gas, and feel lethargic... Inhalas el gas y te sientes letárgico... -Inventory -Inventario -Reputation -Reputación +### You hear a mechanism trip... + +### Items + +### Rep + Spells Hechizos Learn New Spells @@ -9772,32 +11600,30 @@ Back to Spellbook Volver a Libro de hechizos Return to Game Regresar al juego -Spell Tree -Árbol de hechizos + + +### Known Abilities + Elemental Spells Hechizos elementales Conjuration Spells Hechizos de conjuración Illusion Spells Hechizos de ilusión -Upgrades -Actualizaciones Perks Beneficios Perks II Beneficios II Perks III Beneficios III + + pg. NUM/TOTAL pág. NUM/TOTAL -> -> -< -< ->>> ->>> -<<< -<<< +### > + +### < + Spell Points: SPELLPOINTS Puntos de hechizo: SPELLPOINTS You need a higher level in SCHOOL magic to learn this spell. @@ -9806,26 +11632,26 @@ You need more spell points. Necesitas más puntos de hechizo. You don't have enough maximum mana to cast this spell! ¡No tienes suficiente maná máximo para lanzar este hechizo! -School: -Escuela: -Elements -Elementos -Conjuration -Conjuración -Illusion -Espejismo +### School: + Generic Genérico +### Upgrade + +### Special + Learn Spell aprender hechizo -Spell Points: -Puntos de hechizo: -Level: -Nivel: -Spell Point Cost: -Costo de puntos de hechizo: - Mana Cost: - El coste de maná: +### Spell Points: + + + +### Level: + +### Spell Point Cost: + +### Mana Cost: + Remove Spell 1 @@ -9856,22 +11682,22 @@ Replace Spell 6 Reemplazar hechizo 6 Replace Spell 7 Reemplazar hechizo 7 - Current Spell 1: - Hechizo actual 1: - Current Spell 2: - Hechizo actual 2: - Current Spell 3: - Hechizo actual 3: - Current Spell 4: - Hechizo actual 4: - Current Spell 5: - Hechizo actual 5: - Current Spell 6: - Hechizo actual 6: - Current Spell 7: - Hechizo actual 7: -??? -??? +### Current Spell 1: + +### Current Spell 2: + +### Current Spell 3: + +### Current Spell 4: + +### Current Spell 5: + +### Current Spell 6: + +### Current Spell 7: + +### ??? + Unfiled sin archivar Adventuring 101 @@ -9882,24 +11708,20 @@ Bondage Witchery Esclavitud brujería Enemy Notes Notas enemigas -Graveyard -Cementerio -Catacombs -catacumbas -Jungle -Selva +### Overgrown + Temple Templo Tombs tumbas Library Biblioteca -Crystal Cave -cueva de cristal -Orrery -Planetario Bellows Fuelle +### Coast + +### Ejahl + (A page from the Book of Aeons)|The 'Graveyard' is a peculiar place. Long ago, human beings lived and died just like the animals. When the Old Civilization existed, they would come to bury their dead in the Graveyard. It remains a mystery why so many of the former dead seem to be alive. Some say that when the Old Civilization cast the spell that spell which overcame Death, even those buried in their graves would rise again. Others simply say that there is a powerful necromancer who lives here, toying with the dead as if they were pets... (Una página del Libro de los Eones)|El 'Cementerio' es un lugar peculiar. Hace mucho tiempo, los seres humanos vivían y morían como los animales. Cuando existía la Antigua Civilización, venían a enterrar a sus muertos en el Cementerio. Sigue siendo un misterio por qué tantos de los muertos anteriores parecen estar vivos. Algunos dicen que cuando la Antigua Civilización lanzó el hechizo que venció a la Muerte, incluso aquellos enterrados en sus tumbas resucitarían. Otros simplemente dicen que hay un poderoso nigromante que vive aquí, jugando con los muertos como si fueran mascotas... (A page from the Book of Aeons)|Beneath the Graveyard lies a relic of a former age, a network of tombs inhabited by the immortal followers of Bast. Very few were graced with this gift of immortality before the great archmagus, Sariel Vinlaga, stole this power from the gods and granted all humans with the power of immortality. The Bast followers are still set in their ways, hoping for a time when their Goddess will return and rebuild their glorious civilization. @@ -9908,8 +11730,8 @@ Fuelle (Una página del Libro de los Eones)|Algunos dicen que las 'Catacumbas' son más antiguas que el tiempo mismo. Cuando la Antigua Civilización comenzó a estudiar la inmortalidad, nadie sabía si sería posible traer de vuelta a los que ya habían muerto. Las catacumbas, por lo tanto, se utilizaron para almacenar todos los restos de antiguos humanos, de modo que ellos también pudieran ser revividos cuando el archimago finalmente hiciera su avance. (A page from the Book of Aeons)|They say that Archmagus Sariel Vinlaga studied in this very library. Having gathered together all of human knowledge, magical, spiritual, technological, she tasked her twelve lesser magi with the job of sorting and collating the wealth of knowledge she had acquired. No one knows why she suddenly abandoned it, or why it remains in such disrepair today. (Una página del Libro de los Eones)|Dicen que el archimago Sariel Vinlaga estudió en esta misma biblioteca. Habiendo reunido todo el conocimiento humano, mágico, espiritual, tecnológico, encargó a sus doce magos menores el trabajo de clasificar y cotejar la riqueza del conocimiento que había adquirido. Nadie sabe por qué lo abandonó de repente, o por qué sigue tan mal en la actualidad. -(A page from the Book of Aeons)|The Underground Jungle remains a puzzle to scholars. Hardly any light comes through the cracks in the ceiling, and yet the jungle teems with life. It is known that the regenerative powers that keep humans from dying relies on an individual's own mana supply. So how do plants and beasts without mana survive? The devout say it is the Goddess of Restoration who preserves the jungle, but could it be that the Old Civilization developed a means of sustaining life underground? -(Una página del Libro de los Eones)|La jungla subterránea sigue siendo un rompecabezas para los estudiosos. Apenas entra luz por las grietas del techo y, sin embargo, la jungla rebosa de vida. Se sabe que los poderes regenerativos que evitan que los humanos mueran dependen del suministro de maná del propio individuo. Entonces, ¿cómo sobreviven las plantas y las bestias sin maná? Los devotos dicen que es la Diosa de la Restauración quien preserva la jungla, pero ¿podría ser que la Antigua Civilización desarrolló un medio para sustentar la vida bajo tierra? +### (A page from the Book of Aeons)|The Overgown Ruins remain a puzzle to scholars. Hardly any light comes through the cracks in the ceiling, and yet the area teems with life. It is known that the regenerative powers that keep humans from dying relies on an individual's own mana supply. So how do plants and beasts without mana survive? The devout say it is the Goddess of Restoration who preserves the jungle, but could it be that the Old Civilization developed a means of sustaining life underground? + (A page from the Book of Aeons)|The problem of Energy has plagued civilization for millenia. Before the leylines were discovered, humankind relied on natural sources of power such as rivers and firewood. When the Crystal Caves were discovered, a great revolution occurred. No longer reliant on natural sources, civilizations could tap the wellsprings of chaotic energy underground to power machinery like never seen before. (Una página del Libro de los Eones)|El problema de la Energía ha plagado a la civilización durante milenios. Antes de que se descubrieran las líneas místicas, la humanidad dependía de fuentes naturales de energía como los ríos y la leña. Cuando se descubrieron las Cuevas de Cristal, ocurrió una gran revolución. Al no depender más de las fuentes naturales, las civilizaciones podrían aprovechar las fuentes de energía caótica subterránea para alimentar maquinaria como nunca antes se había visto. (A page from the Book of Aeons)|The 'Lost Temple' as they call it, is a subject of great speculation. It seems that its creators worshipped only four creator goddesses, rather than all the Eight. It was perhaps abandoned several hundred years ago when a flood caused great panic, and it seems that this must have occurred before humanity was made immortal by the archmagus, as there are many remains still found inside. @@ -9918,14 +11740,16 @@ Fuelle (Una página del Libro de los Eones)|Las estrellas han sido un misterio para los eruditos desde el principio de los tiempos. En un momento dado, los humanos creían que cada estrella era un dios, y hacían ofrendas arrojando azúcar a la noche, pensando que así como las estrellas eran innumerables, también lo eran los granos de azúcar que tanto agradaban a los humanos. La religión ha superado eso, pero el Orrery sigue siendo una reliquia de una época en la que la humanidad adoraba a las estrellas en lugar de a los Ocho. (A page from the Book of Aeons)|The 'Bellows' is the nickname given to the primitive facilities of the Old Civilization, buried deep beneath the ground. While much of it remains in disrepair, many of the Old Civilization's successors have attempted to keep it in good working order, as the technology is precious and impossible to replicate with modern methods. It seems that many of these successors have fallen prey to some delusions about its purpose, as much of the equipment preserved has little use aside from collecting prisoners. (Una página del Libro de los Eones)|El 'Fuelle' es el apodo dado a las instalaciones primitivas de la Antigua Civilización, enterradas profundamente bajo tierra. Si bien gran parte sigue en mal estado, muchos de los sucesores de la Antigua Civilización han intentado mantenerlo en buen estado de funcionamiento, ya que la tecnología es preciosa e imposible de replicar con los métodos modernos. Parece que muchos de estos sucesores han sido víctimas de algunos engaños sobre su propósito, ya que gran parte del equipo conservado tiene poca utilidad aparte de recolectar prisioneros. + + (Preface from the journal of Catherine Willows, well-known explorer who vanished in the dungeon 30 years ago) I am writing this journal in the off chance that I do not come back in my search for the Mistress' staff. If you find this, please make an effort to deliver it back to the surface for the good of all the young women lured by its secrets. (Prefacio del diario de Catherine Willows, conocida exploradora que desapareció en la mazmorra hace 30 años) Escribo este diario por si acaso no regreso en mi búsqueda del bastón de la Ama. Si encuentras esto, haz un esfuerzo para devolverlo a la superficie por el bien de todas las jóvenes atraídas por sus secretos. (Pg. 24 from Catherine Willows' journal) Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?' (Pág. 24 del diario de Catherine Willows) Muchos de los que allanan los niveles superiores de la tumba de la Señora a menudo preguntan retóricamente: '¿Por qué hay extrañas trampas retorcidas que protegen los cofres del tesoro? ¿Por qué no tener trampas mortales reales si el propósito es disuadir a los intrusos? (Pg. 25 from Catherine Willows' journal) ...They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence. (Pág. 25 del diario de Catherine Willows) ...Cometen un error crucial: los cofres del tesoro no están atrapados. Más bien, están llenos de oro. Y sabemos que el oro agrada a los dioses: nuestra economía funciona con él, y los dioses solo intervienen en nuestros asuntos cotidianos porque les damos oro. Los dioses menores, conocidos como espíritus, también aman el oro, pero a diferencia de los dioses que conocemos, estos espíritus menores no pueden consumir oro en un altar de una sola vez como lo hacen los dioses. Por lo tanto, necesitan habitar físicamente el lugar donde se encuentra el oro, drenándolo lentamente de su agradable esencia. -(Pg. 26 from Catherine Willows' journal) So the question is not why did somebody lay these traps. The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. -(Pág. 26 del diario de Catherine Willows) Así que la pregunta no es por qué alguien tendió estas trampas. La respuesta es que no son trampas en absoluto. Supongo que los pisos superiores alguna vez fueron un lugar de ofrendas para los muertos. Y cuando la antigua civilización pereció y todo el complejo se hundió en el suelo, ya no hubo nadie para ahuyentar a los espíritus y evitar que habitaran el piso de arriba. En cuanto a por qué hay tantas restricciones en general en lugar de su tipo típico de espíritus... bueno, sabemos de qué se rodeaba la Ama. +### (Pg. 26 from Catherine Willows' journal) So the question is not 'why did somebody lay these traps.' The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. + (The note starts with a drawing of a witch with many chains hanging from her body) She can block melee attacks with her chains. However, they conduct lightning and heat directly to her body, and I was able to take out her chains with bolt cutters. (La nota comienza con un dibujo de una bruja con muchas cadenas colgando de su cuerpo) Puede bloquear ataques cuerpo a cuerpo con sus cadenas. Sin embargo, conducen los rayos y el calor directamente a su cuerpo, y pude quitarle las cadenas con un cortador de pernos. (The note starts with a drawing of a witch with lightning crackling from her fingertips) Water will cause her to short-circuit. I can't seem to hit her with lightning, though. She always redirects it. @@ -9946,26 +11770,32 @@ Fuelle (Encuentra una talla en el piso, un círculo mágico de conjuro celestial a medio terminar. Tal vez un clérigo deseaba invocar a un ángel para que lo guiara, antes de darse cuenta de que había un santuario a poca distancia, donde podía contactar con los cielos mucho más). fácilmente.) (It looks like a... receipt) Thank you for your offering to CELESTIAL COMMERCE. Please accept this fine-quality steel blade as compensation for your continued devotion and selflessness. (Parece un... recibo) Gracias por su ofrecimiento a CELESTIAL COMMERCE. Acepte esta hoja de acero de alta calidad como compensación por su continua devoción y desinterés. -(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter than she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. +(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter that she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. (Una nota escrita en cursiva) A quien asaltó a nuestro mensajero y lo dejó amarrado aquí: Los santuarios de la Diosa de la ILUSIÓN NO deben usarse de esta manera. Si desea un tema para sus experimentos lascivos, intente hacerlo con uno de los lugareños y, por el amor de Dios, no llame a un mensajero angelical solo para atarlo. No importa que ella haya consentido, ni que hayas pagado, nuestros mensajeros tienen responsabilidades que deben atender. Firmado: HERONA, ejecutora de la DIOSA de las ILUSIONES. (From an essay titled 'On Celestial Supply Chains') It is known that the heavens seek gold. We do not know why it is that the heavens seek it, but we do know that the Goddesses grant us fragments of their limitless power in exchange for this otherwise-useless metal we dredge up from the earth. They care about it so much that shrines are commonplace, each hosting an angelic courier lying in wait for any adventurer willing to part with hers. (De un ensayo titulado 'Sobre las cadenas de suministro celestiales') Se sabe que los cielos buscan oro. No sabemos por qué los cielos lo buscan, pero sí sabemos que las Diosas nos otorgan fragmentos de su poder ilimitado a cambio de este metal inútil que extraemos de la tierra. Les importa tanto que los santuarios son comunes, cada uno de los cuales alberga un mensajero angelical al acecho de cualquier aventurero dispuesto a separarse del suyo. They say that the maiden who safeguards the graveyard is kind to her pets... Dicen que la doncella que custodia el cementerio es amable con sus mascotas... -They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Blink out of jail and into the hallway where they kept all my things! +They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Portal out of jail and into the hallway where they kept all my things! Pensaron que podrían tener mi espada legendaria... ¡pero los tontos se olvidaron de atarme las piernas! ¡Pude Blink salir de la cárcel y entrar al pasillo donde guardaban todas mis cosas! I am writing this from inside prison. Who would have known they cared so much about me using a shrine? Sheesh. Estoy escribiendo esto desde dentro de la prisión. ¿Quién hubiera sabido que se preocupaban tanto por mí usando un santuario? Sheesh. + + (A drawing of a bunch of zombies, ordered by danger level. Of note are a zombie surrounded by charms, a zombie surrounded by talismans, a zombie warrior with a sword, and... some kind of shrine maiden that you've never seen before) (Un dibujo de un grupo de zombis, ordenados por nivel de peligro. Destacan un zombi rodeado de amuletos, un zombi rodeado de talismanes, un guerrero zombi con una espada y... una especie de doncella del santuario que nunca has visto). visto antes) + + (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|The first thing to understand is that tying someone up is difficult if they are not in a vulnerable position. If your opponent is vulnerable, then binding will be twice as effective! (Un extracto de BRUJERÍA DE BONDAGE: UNA GUÍA DEL ESTUDIANTE) | Lo primero que hay que entender es que atar a alguien es difícil si no se encuentra en una posición vulnerable. ¡Si tu oponente es vulnerable, la unión será el doble de efectiva! -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by ticking them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage. +(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by tickling them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage. (Un extracto de BONDAGE WITCHERY: A STUDENT'S GUIDE)|Una vez que tu oponente esté bien atado, puedes romper su voluntad golpeándolo con una pluma, un cubo de hielo o una varita mágica. Esto causará daño adicional. (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Bigger and more resilient opponents are much more effective at breaking out of your binds. Try to deal some damage to them to decrease the speed at which they struggle out of your restraints. (Un extracto de BONDAGE WITCHERY: A STUDENT'S GUIDE)|Los oponentes más grandes y resistentes son mucho más efectivos para liberarse de sus ataduras. Intenta hacerles daño para disminuir la velocidad a la que se esfuerzan por salir de tus ataduras. (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Many mages utilize magical runes to set traps. If you want to check for traps, try learning the spell 'Magical Sight' in the Illusion school. (Un extracto de BRUJERÍA DE LA ESCLAVITUD: UNA GUÍA DEL ESTUDIANTE)|Muchos magos utilizan runas mágicas para tender trampas. Si quieres comprobar si hay trampas, intenta aprender el hechizo "Visión mágica" en la escuela Illusion. + + From Adventuring 101: A guide to combat|Your opponent will become vulnerable in many ways, such as missing you with an attack. You can also teleport to the other side of them when they are attacking you, and this will confuse them briefly.|Vulnerable enemies take extra damage, and are easier to tie up! De Aventuras 101: Una guía para el combate|Tu oponente se volverá vulnerable de muchas maneras, como fallar en un ataque. También puedes teletransportarte al otro lado de ellos cuando te están atacando, y esto los confundirá brevemente. ¡Los enemigos vulnerables reciben daño adicional y son más fáciles de atar! From Adventuring 101: A guide to combat|Drenching your opponents makes them more vulnerable to ice and electricity, but may increase their resistance to fire. @@ -9976,6 +11806,8 @@ From Adventuring 101: A guide to combat|Did you know that hitting enemies with f De Adventure 101: Una guía para el combate|¿Sabías que golpear a los enemigos con fuego mientras están congelados es más poderoso? Los enemigos reciben un 40 % más de daño por fuego mientras están congelados, aunque el fuego los descongela rápidamente. From Adventuring 101: A guide to combat|When you're in a bind, try to play along and look for an opportunity to escape. Fighting back will only make your enemies want to tighten your restraints. De Adventure 101: Una guía para el combate|Cuando estés en un aprieto, trata de seguirle el juego y busca una oportunidad para escapar. Contraatacar solo hará que tus enemigos quieran reforzar tus ataduras. + + (A drawing of a suit of armor. It reads: DO NOT TRUST) (Dibujo de una armadura. Dice: NO CONFÍES) (The note starts with a drawing of a witch in dark robes with bright pink hair) A necromancer. Powerful spellcaster, weak up close. @@ -10000,6 +11832,8 @@ I don't think it's neccessary to tell people that dragons resist fire... right? No creo que sea necesario decirle a la gente que los dragones resisten el fuego... ¿verdad? I've been studying the dragonheart's weaknesses. So far I've found that the ones bearing the powers of ice dragons are actually weak to fire unlike the others, and the ones who summon crystals to block attacks are nonetheless unable to grab a spear to stop it from reaching them. He estado estudiando las debilidades del corazón de dragón. Hasta ahora, he descubierto que los que tienen los poderes de los dragones de hielo en realidad son débiles para disparar a diferencia de los demás, y los que invocan cristales para bloquear los ataques son, sin embargo, incapaces de agarrar una lanza para evitar que los alcance. + + They say a ninja can catch a sword in her hands, but can she stop a spear? Ha, thought not! Dicen que un ninja puede atrapar una espada en sus manos, pero ¿puede detener una lanza? Ja, pensé que no! (Pg. 54 from Catherine Willows' journal): The post-collapse civilization sought immortality, but they knew that the technologies of the old civilization were a danger to them. So they turned to another school of thought: Magic. @@ -10026,24 +11860,32 @@ Los ninjas no son tan difíciles de combatir cuando tienen las manos atadas a la (Es un registro de una entrevista)|YO: ¿Y los duendes? ¿No hablan también de un 'reino'?|MAMÁ: ¿Quiénes son los duendes?|YO: Ya sabes, orejas puntiagudas, pelo verde, una gran actitud... parecen estar en sintonía con la naturaleza.|MAMÁ: Suenan arrogantes. YO: Lo son. MAMÁ: Quizá no saben nada de la promesa entre nuestra diosa y la de ellos. (It's a medical record) Patient seems stable... application of the enchanted cloth seems to have stopped the bleeding. It appears that the ancient magic suppresses all forms of injury, even in humans, until it is taken off. (Es un registro médico) El paciente parece estable... la aplicación del paño encantado parece haber detenido el sangrado. Parece que la magia antigua suprime todas las formas de daño, incluso en humanos, hasta que se quita. + + (A record of an ancient... transaction)||The elemental offered us the following from her personal estate:|-one magical lantern that requires no fuel, and can light up the night as if it were day|-one crystal that burns red-hot when kept near metal, providing heat to warm a house|-three enchanted swords imbued with flame|-a hollow glass crystal, used for communication||In exchange, we gave her three wolfgirls we had captured on the surface. (Registro de una antigua... transacción)||La elemental nos ofreció lo siguiente de su patrimonio personal:|-una linterna mágica que no requiere combustible y puede iluminar la noche como si fuera de día|-un cristal que arde al rojo vivo cuando se mantiene cerca del metal, proporcionando calor para calentar una casa|-tres espadas encantadas imbuidas de llamas|-un cristal de vidrio hueco, utilizado para la comunicación||A cambio, le dimos tres chicas lobo que habíamos capturado en la superficie. I had heard that ancient humans prayed to the stars here, in an effort to find favor when the Eight had forsaken them. So I went and prayed... and let me tell you, it was a lie, an absolute lie. There are only monsters out there. Había oído que los antiguos humanos rezaban a las estrellas aquí, en un esfuerzo por encontrar su favor cuando los Ocho los habían abandonado. Así que fui y oré... y déjame decirte que era una mentira, una mentira absoluta. Sólo hay monstruos por ahí. (It is a set of instructions for creating a magic circle to unlock a sealed portal. There are markings in many languages that give conflicting descriptions, claiming that the circle will transmute material to gold, or bring good fortune...) (Es un conjunto de instrucciones para crear un círculo mágico para desbloquear un portal sellado. Hay marcas en muchos idiomas que dan descripciones contradictorias, afirmando que el círculo transmutará el material en oro o traerá buena fortuna...) + + (Two schematic diagrams of ancient drones taken from records. The first is unmodified, and the second has several annotations written in what looks like pink lipstick...) (Dos diagramas esquemáticos de drones antiguos tomados de registros. El primero no está modificado y el segundo tiene varias anotaciones escritas en lo que parece lápiz labial rosa...) + + Those damn slimes! They're so sticky and gross... fortunately, I washed myself in the fountain the last time I got caught by one. It came right off! ¡Esos malditos limones! Son tan pegajosos y asquerosos... afortunadamente, me lavé en la fuente la última vez que me atrapó uno. ¡Salió enseguida! The dragonhearts were a group of dragonslayers, named for their ritual that imbues them with the fiery power and resistance of dragons they've slain. Now they work as mercenaries, and some of them serve a certain Leather goddess. Los dragonhearts eran un grupo de cazadores de dragones, llamados así por su ritual que los imbuye con el poder ardiente y la resistencia de los dragones que han matado. Ahora trabajan como mercenarios, y algunos de ellos sirven a cierta diosa del cuero. Yes! I've done it! I have created another red slime! I shall call him Fred, yes, Fred. After the red slime I lost in a shield-related accident a while back... |Poor Fred... I miss him. ¡Sí! ¡Lo he hecho! ¡He creado otro limo rojo! Lo llamaré Fred, sí, Fred. Después de la baba roja que perdí en un accidente relacionado con un escudo hace un tiempo... |Pobre Fred... lo extraño. -(Pg. 70 from Catherine Willows' journal): The underground jungle is a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through? -(Pág. 70 del diario de Catherine Willows): La jungla subterránea es un fenómeno curioso. Sin embargo, el nivel de luz que se filtra a través de las grietas en el techo es demasiado escaso para sustentar la vida vegetal. Y, sin embargo, la diosa de la restauración, en su antigua sabiduría, ha decidido preservar este lugar. ¿Cuántas de sus dríades debo perforar o quemar hasta que se dé cuenta de que simplemente estoy de paso? +### (Pg. 70 from Catherine Willows' journal): The overgrown ruins are a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through? + The unseen maid is the deadliest. La doncella invisible es la más letal. + + (The note is blank) (La nota está en blanco) The note reads: Mmmmmmmph! Mmmm! MMMMMPH!!!!-- (The entire note is just gagged mumblings...) @@ -10064,38 +11906,52 @@ La nota dice: Por favor, lleva esta hermosa muñeca a algún lado y juega con el (La nota contiene un manual de esgrima. Siempre has sido un esgrimista pésimo) (The note contains a magic spell you were taught never to cast under any circumstances) (La nota contiene un hechizo mágico que te enseñaron a nunca lanzar bajo ninguna circunstancia) + + The item requires 5 keys and free hands to remove El artículo requiere 5 llaves y manos libres para quitar The item is extremely secure with five separate keyholes. El artículo es extremadamente seguro con cinco cerraduras separadas. You insert your 5 keys into the lock and the item finally comes off. Insertas tus 5 llaves en la cerradura y el artículo finalmente sale. + + +### [RNAME] + +### Magic-Draining: This item drains your mana quickly up to a limit, then slowly after. + Curse of Tickling: This item is tickling you without end! Curse of Tickling: ¡Este objeto te hace cosquillas sin parar! Curse of Punishment: Inflicts psychic damage when you attack or cast a spell. Maldición de castigo: inflige daño psíquico cuando atacas o lanzas un hechizo. Curse of Illumination: Produces light and makes you easier to see. Maldición de la iluminación: produce luz y te hace más fácil de ver. -Curse of Attraction: Other women find you even more irresistable. -Maldición de la atracción: otras mujeres te encuentran aún más irresistible. +### Curse of Attraction: Women find you irresistable. + Curse of Animation: Causes loose restraints to animate and attack you! Curse of Animation: ¡Hace que las restricciones sueltas te animen y te ataquen! Curse of Sensitivity: Makes it easier to lose control of yourself. Maldición de la sensibilidad: hace que sea más fácil perder el control de uno mismo. Curse of Distraction: Multiplies DP gain by 1.5x. Curse of Distraction: Multiplica la ganancia de DP por 1.5x. -Curse of Breathlessness: Multiplies SP gain by 0.6x. -Maldición de la falta de aliento: multiplica la ganancia de SP por 0.6x. -Curse of Futility: Multiplies WP gain by 0.25x. -Curse of Futility: Multiplica la ganancia de WP por 0.25x. +### Curse of Exhaustion: -25% Stamina regen cap. + +### Curse of Futility: Multiplies WP gain by 0.5x. + Curse of Submission: Gain submissiveness when you lose control of yourself... Maldición de la sumisión: gana sumisión cuando pierdes el control de ti mismo... +### The curse is dormant, waiting for the time to strike... + Your RESTRAINTNAME glows pink as you feel your mind attacked by hypnotic forces! ¡Tu RESTRAINTNAME se ilumina de color rosa cuando sientes que tu mente es atacada por fuerzas hipnóticas! + + The item is cursed! Several restraints appear on your body! ¡El objeto está maldito! ¡Varias restricciones aparecen en tu cuerpo! The item is cursed, but you are so trussed up you hear only sinister laughter... El artículo está maldito, pero estás tan atado que solo escuchas una risa siniestra... + + The item is sealed with an icy lock. Perhaps you can melt it somehow? El artículo está sellado con un candado helado. ¿Quizás puedas derretirlo de alguna manera? The cursed seal flashes brightly as you struggle fruitlessly against it. @@ -10122,30 +11978,24 @@ You pray to the Goddess and the sigil vanishes! Perhaps you returned what was ri ¡Le rezas a la Diosa y el sigilo se desvanece! ¿Quizás le devolviste lo que era suyo por derecho? This item bears the sigil of the Goddess of Restoration. Perhaps she can help? Este artículo lleva el sigilo de la Diosa de la Restauración. ¿Quizás ella pueda ayudar? -The item is protected by an arcane seal. There is nothing you can do to it. -El objeto está protegido por un sello arcano. No hay nada que puedas hacer al respecto. -You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? -¡Le rezas a la Diosa y el sigilo se desvanece! ¿Quizás le devolviste lo que era suyo por derecho? +### The item is protected by a magical seal. There is nothing you can do to it. + This item bears the sigil of the Goddess of Conjuration. Perhaps she can help? Este artículo lleva el sigilo de la Diosa de la Conjuración. ¿Quizás ella pueda ayudar? The item is protected by dark secrets. There is nothing you can do to it. El objeto está protegido por oscuros secretos. No hay nada que puedas hacer al respecto. -You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? -¡Le rezas a la Diosa y el sigilo se desvanece! ¿Quizás le devolviste lo que era suyo por derecho? This item bears the sigil of the Goddess of Illusions. Perhaps she can help? Este artículo lleva el sigilo de la Diosa de las Ilusiones. ¿Quizás ella pueda ayudar? -You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? -¡Le rezas a la Diosa y el sigilo se desvanece! ¿Quizás le devolviste lo que era suyo por derecho? This item bears the sigil of the Goddess of Elements. Perhaps she can help? Este artículo lleva el sigilo de la Diosa de los Elementos. ¿Quizás ella pueda ayudar? -The item is protected by powerful energies. There is nothing you can do to it. -El artículo está protegido por poderosas energías. No hay nada que puedas hacer al respecto. +### The item is protected by an elemental seal. There is nothing you can do to it. + You hold the key to the item and it comes loose, draining the key's energy. Sostienes la llave del objeto y se suelta, agotando la energía de la llave. The item is incribed with mystical runes. Maybe you need a powerful key to unlock it. El artículo está inscrito con runas místicas. Tal vez necesites una llave poderosa para desbloquearlo. -You tug on the item, but the runes glow brighter as you realize struggling is pointless. -Tiras del objeto, pero las runas brillan más cuando te das cuenta de que luchar no tiene sentido. +### The lock-shaped rune flashes as you realize struggling is pointless. + You overload the magical seal, causing it to vanish and release the item. Sobrecargas el sello mágico, lo que hace que desaparezca y liberes el objeto. The item is magically sealed, requiring 200 mana to unlock it (includes mana from mana pool). @@ -10164,36 +12014,46 @@ You tug on the item but it is magically sealed to your body! ¡Tiras del objeto pero está mágicamente sellado a tu cuerpo! You insert your magic key into the lock and the item finally comes off! ¡Insertas tu llave mágica en la cerradura y el artículo finalmente sale! + + The item is protected by a seal of Determination. You must have maximum willpower to remove it. El artículo está protegido por un sello de Determinación. Debes tener la máxima fuerza de voluntad para eliminarlo. You are unable to muster the willpower to bypass the seal... No puedes reunir la fuerza de voluntad para eludir el sello... Feeling determined, you override the seal and release the item! ¡Sintiéndote determinado, anulas el sello y liberas el objeto! -The lock is protected by a revanent seal. You'll need 25 ectoplasm to disenchant it. + + +The lock is protected by a revenant seal. You'll need 25 ectoplasm to disenchant it. La cerradura está protegida por un precinto relevante. Necesitarás 25 ectoplasma para desencantarlo. Your fingers pass right through the collar. Pity your neck doesn't pass through it. Tus dedos pasan justo a través del collar. Lástima que tu cuello no pase por él. You channel ghastly energy into the lock and break the seal!!! ¡¡¡Canalizas energía espantosa en la cerradura y rompes el sello!!! -It would take many lifetimes to crack the code. You'll have to find the data somehow. -Se necesitarían muchas vidas para descifrar el código. Tendrás que encontrar los datos de alguna manera. -You tug against the fastenings to no avail. -Tiras de los cierres en vano. -One of your Doll IDs seems to have had corrupted data on it, causing the program to crash. -Una de sus Doll ID parece haber tenido datos corruptos, lo que provocó que el programa fallara. + + +### It would take many lifetimes to crack the code. You'll have to find another way to break the program... + +### You tug against the straps to no avail. + +### One of your Doll IDs seems to have had corrupted data on it, causing the program to crash and unlock. + The item seems to drain divine energy from shrines. Maybe that has something to do with it. El objeto parece drenar la energía divina de los santuarios. Tal vez eso tenga algo que ver. The collar is enchanted with multiple layers of magical seals. El collar está encantado con varias capas de sellos mágicos. The collar has absorbed enough energy and pops off! ¡El collar ha absorbido suficiente energía y se sale! + + That item cant be used. Ese artículo no se puede usar. You're not sure how to use this key. No está seguro de cómo utilizar esta clave. As soon as you touch the key, all of your gold locks fade to blue! ¡Tan pronto como tocas la llave, todos tus mechones dorados se vuelven azules! + + You realize there is no keyhole on the device, simply a lock-shaped sigil. Te das cuenta de que no hay ojo de cerradura en el dispositivo, simplemente un sigilo en forma de cerradura. The item loosens and falls off, but you see a red sigil flash and the key suddenly teleports away! @@ -10202,16 +12062,22 @@ You have in your possession KeyAmount magical, ornate key(s). You might as well Tienes en tu posesión KeyAmount llave(s) mágica(s) ornamentada(s). También podrías intentar... You have KeyAmount key(s) for this item. Tiene clave(s) KeyAmount para este artículo. + + The angel helps you struggle and use items El ángel te ayuda a luchar y a usar objetos. The ghost helps you struggle and use items El fantasma te ayuda a luchar y a usar objetos. The ghost is unhelpful El fantasma es inútil. + + Angel: Greetings! Ángel: Saludos! Angel: Perhaps I can assist with those! Ángel: ¡Quizás pueda ayudar con eso! + + Adventurer's Ghost: Well met, traveler! Fantasma del aventurero: ¡Bienvenido, viajero! Adventurer's Ghost: Hello again, traveler (giggles). @@ -10222,16 +12088,22 @@ Adventurer's Ghost: Looking for some trouble, slave? Fantasma del aventurero: ¿Buscas problemas, esclavo? Adventurer's Ghost: I see you, naughty little slave! Fantasma del aventurero: ¡Te veo, esclava traviesa! + + Ghost: I can try to help with those, traveler. Fantasma: Puedo intentar ayudarte con eso, viajero. Ghost: Aww, you look like you're having fun... Fantasma: Aww, parece que te estás divirtiendo... + + Ghost: You look great in those, hehe~ Fantasma: Te ves muy bien en esos, jeje~ Ghost: Please don't bother me. Fantasma: Por favor, no me molestes. Ghost: A good slave doesn't complain. Fantasma: Un buen esclavo no se queja. + + Ghost: What's that? I don't understand. Fantasma: ¿Qué es eso? No entiendo. Ghost: Silence is golden. @@ -10256,6 +12128,8 @@ Ghost: Looks like someone's been naughty~ Fantasma: Parece que alguien ha sido malo~ Ghost: How's it feel to be under lock and key? Fantasma: ¿Cómo se siente estar bajo llave? + + You step on a pressure plate and a number of skeletons rise up! ¡Pisas una placa de presión y se levantan varios esqueletos! You are ambushed by bandits! @@ -10276,8 +12150,8 @@ You are ambushed by ninjas! ¡Estás emboscado por ninjas! A large, wriggling mess of ropes fall from the ceiling! ¡Un gran lío de cuerdas que se retuercen cae del techo! -You are ambushed by dragonhearts! -¡Estás emboscado por dragonhearts! +### A rune of growth causes several plants to quickly sprout nearby. + You are ambushed by dragonhearts! ¡Estás emboscado por dragonhearts! A pack of drones descends from the ceiling! @@ -10306,84 +12180,94 @@ In a burst of mist, a group of water elementals appear around you! ¡En un estallido de niebla, un grupo de elementales de agua aparece a tu alrededor! A group of earth elementals rise out of the ground! ¡Un grupo de elementales de la tierra emergen del suelo! -You hear pouring liquid and a group of latex elementals come out of the walls! -¡Oyes verter líquido y un grupo de elementales de látex salen de las paredes! +### You hear pouring liquid and a group of rubber elementals come out of the walls! + In a flash of light, a group of air elementals appear around you! ¡En un destello de luz, un grupo de elementales de aire aparece a tu alrededor! Several ethereal hands appear all around you! ¡Varias manos etéreas aparecen a tu alrededor! You have stumbled upon a conjurer's study! ¡Te has topado con el estudio de un prestidigitador! -You have stumbled upon a conjurer's study! -¡Te has topado con el estudio de un prestidigitador! -You are ambushed by a group of maids! -¡Te embosca un grupo de sirvientas! -You are ambushed by a group of maids! -¡Te embosca un grupo de sirvientas! You are ambushed by a group of maids! ¡Te embosca un grupo de sirvientas! The Head Maid corners you! ¡La doncella principal te acorrala! A vine crawls from the ground, already wrapping around your feet! ¡Una enredadera se arrastra desde el suelo, envolviéndose ya alrededor de tus pies! -You have broken a magic orb, gaining a Spell Point and angering a goddess. -Has roto un orbe mágico, ganando un punto de hechizo y enfureciendo a una diosa. -You have broken a magic orb, gaining a random spell and angering a goddess. -Has roto un orbe mágico, ganando un hechizo aleatorio y enfureciendo a una diosa. -Choose one. She will send her minions after you. -Elige uno. Enviará a sus secuaces tras de ti. + + +### You find a magic orb, containing a Spell Point. However, a Goddess owns this artifact.. + +### You find a magic orb, containing the SHCL spell 'SPLNME' and angering a goddess. + +### You find a magic orb, containing a random spell and angering a goddess. + +### Should you break it, she will send her minions after you. Which Goddess will you anger? + An altar stands before you, bestowing a heavenly contract. Un altar está ante ti, otorgando un contrato celestial. Do you choose to accept its terms? ¿Eliges aceptar sus términos? + + Are you sure? This choice is final. ¿Está seguro? Esta elección es definitiva. + + Yes, I will accept. Sí, aceptaré. (Accept the contract) (Acepto el contrato) I'll think about it. Lo pensare. + + You are frozen! ¡Estás congelado! You are chilled! ¡Estás helado! Shadowy tendrils wrap around your feet, rooting you in place!!! ¡Zarcillos sombríos se envuelven alrededor de tus pies, enraizándote en tu lugar! + + You get the feeling that someone is searching for you... Tienes la sensación de que alguien te está buscando... You hear movements all around as you realize you are surrounded!!! ¡Oyes movimientos a tu alrededor cuando te das cuenta de que estás rodeado! + + There is another restraint underneath! ¡Hay otra restricción debajo! + + +Your restraints rub you in sensitive places as you move... +Tus ataduras te rozan en lugares sensibles mientras te mueves... + + Indifferent Indiferente Angered enojado Enraged Enfurecido -Cursed -Maldito Thankful Agradecido Pleased Complacido -Blessed -Bendecido -Neutral -Neutral + + +### Neutral + Annoyed Enojado Hostile Hostil -Wanted -Buscado Friendly Amigable Allied Aliado -Favorable -Favorable +### Favorable + You run up against the TETHER pulling you back. Te topas con el TETHER que te tira hacia atrás. You are yanked back by the TETHER! @@ -10402,6 +12286,8 @@ I won't repeat myself no me repetiré Then let's put you back in your cell! ¡Entonces vamos a ponerte de nuevo en tu celda! + + I hope you learned your lesson. Now get your butt out of here. Espero que hayas aprendido tu lección. Ahora saca tu trasero de aquí. You've been a good girl. I hope you don't make the same mistake again. You can leave. @@ -10410,6 +12296,8 @@ That's a good girl. Now behave yourself, okay? You're free to go. Esa es una buena chica. Ahora compórtate, ¿de acuerdo? Eres libre de irte. Looks like you got yourself in a bind! (she pats your butt playfully) Go make the others happy! ¡Parece que te has metido en un aprieto! (te da palmaditas en el trasero juguetonamente) ¡Ve a hacer felices a los demás! + + Good girl. Buena niña. You'll be making others happy in no time. @@ -10422,10 +12310,14 @@ It seems your training is going well. Parece que tu entrenamiento va bien. Perhaps you are enjoying this, hehe. Quizás estés disfrutando esto, jeje. + + You've been very good this walk. Here is your reward. Has estado muy bien este paseo. Aquí está tu recompensa. The EnemyName gives you a ItemName El EnemyName te da un ItemName + + The EnemyName starts adding a RestraintName! ¡EnemyName comienza a agregar un RestraintName! You're missing part of your uniform. @@ -10440,6 +12332,8 @@ I am going to change your restraints. Hold still! Voy a cambiar tus ataduras. ¡Quédate quieto! Just need to add a little security~ Solo necesito agregar un poco de seguridad ~ + + Got yourself in trouble, eh? Te metiste en problemas, ¿eh? Looks like you're shaping up to be a good girl~ @@ -10448,14 +12342,24 @@ Oh! Looks like I've made a mistake... ¡Oh! Parece que he cometido un error... 404 prisoner not found. Releasing tether. 404 prisionero no encontrado. Liberando atadura. + + +### A EnemyName approaches you in your cell. + A EnemyName appears to check on you. Aparece un EnemyName para controlarte. The EnemyName leaves and locks the cell behind her. El EnemyName sale y cierra la celda detrás de ella. + + Layered underneath: En capas debajo: +### Layered with: + Increased strictness due to: Mayor rigor debido a: + + Mana Dónde Bondage @@ -10468,50 +12372,58 @@ Ask Preguntar Ask for Rescue Pregunta por el rescate -Offer -Oferta Offer Penance Ofrecer Penitencia Current Champion Campeón actual Switch Champion Cambiar de campeón + + Become the champion of this goddess. Capturing bound enemies will grant +1 rep. Conviértete en el campeón de esta diosa. Capturar enemigos atados otorgará +1 rep. You are now the champion of the Goddess of GODDESS. Ahora eres el campeón de la Diosa de la DIOSA. + + For 3 rep the goddess will grant you slipperiness, boosting your struggling. Por 3 repeticiones, la diosa te otorgará deslizamiento, aumentando tu lucha. For 3 rep the goddess will grant you a key. Por 3 repeticiones la diosa te otorgará una llave. -For 3 rep the goddess will grant you -Por 3 rep la diosa te concederá -For 3 rep the goddess -Por 3 rep la diosa -For 3 rep the goddess -Por 3 rep la diosa -For 3 rep the goddess -Por 3 rep la diosa +### For 3 rep the goddess will grant you + For 3 rep the goddess Por 3 rep la diosa -For 3 rep the goddess +For 3 rep the goddess Por 3 rep la diosa + + The goddess will fully restore your mana in exchange for AMOUNT rep La diosa restaurará completamente tu maná a cambio de AMOUNT rep The goddess will enjoy seeing you struggle in her bonds (raises submissiveness) La diosa disfrutará al verte luchar en sus ataduras (aumenta la sumisión) + + The Goddess may decide to send an angel to help you struggle, in exchange for 10 rep La Diosa puede decidir enviar un ángel para ayudarte a luchar, a cambio de 10 repeticiones. + + The Goddess will expect you to pay AMOUNT gold for +5 rep La Diosa esperará que pagues AMOUNT de oro por +5 repeticiones + + The Goddess hears your plea! ¡La Diosa escucha tu súplica! The Goddess hears your plea but has decided not to care. La Diosa escucha tu súplica pero ha decidido que no le importa. The Goddess fills your mind with heavenly images as she channels energy through your veins. La Diosa llena tu mente con imágenes celestiales mientras canaliza energía a través de tus venas. + + Time stops as an angel of heaven appears to collect your payment. El tiempo se detiene cuando un ángel del cielo aparece para cobrar su pago. + + You shudder and tremble as a wave of pleasure washes over you! ¡Te estremeces y tiemblas cuando te inunda una ola de placer! You lose control of yourself as you convulse in pleasurable bliss! @@ -10534,6 +12446,8 @@ A powerful wave of pleasure comes over you as you convulse in ecstasy. Una poderosa ola de placer te invade mientras te convulsionas en éxtasis. Your breathing intensifies as you lose control of yourself! ¡Tu respiración se intensifica a medida que pierdes el control de ti mismo! + + You close your eyes and breath rapidly in anticipation... Cierras los ojos y respiras rápidamente con anticipación... You tilt your head back and moan as your heart beats faster... @@ -10556,6 +12470,8 @@ You let out an anguished moan as release dances just out of reach... Dejas escapar un gemido angustiado mientras la liberación baila fuera de tu alcance... You squirm helplessly as your futile struggles simply arouse you more... Te retuerces impotente mientras tus luchas inútiles simplemente te excitan más... + + The vibration suddenly weakens. La vibración se debilita repentinamente. Your toys cease vibrating abruptly. @@ -10578,6 +12494,8 @@ The toys stop just before you lose yourself. Los juguetes se detienen justo antes de que te pierdas. The toys deny you a chance to finish. Los juguetes te niegan la oportunidad de terminar. + + You try to pleasure yourself, but your chastity belt prevents you! ¡Intentas darte placer, pero tu cinturón de castidad te lo impide! You play with yourself... @@ -10610,8 +12528,12 @@ Your will is draining as the toys continue buzzing... Tu voluntad se agota mientras los juguetes siguen zumbando... Your will is draining as you are tormented by vibrations... Tu voluntad se agota mientras te atormentan las vibraciones... + + A buzzing vibration wakes you up! ¡Una vibración zumbante te despierta! + + Your RestraintName constricts, warning you not to misbehave! ¡Su RestraintName se contrae y le advierte que no se porte mal! Your RestraintName tightens painfully to punish your misbehavior! @@ -10626,16 +12548,26 @@ Your armor makes noise as you move around! ¡Tu armadura hace ruido cuando te mueves! Your RestraintName lets out an alert! ¡Su RestraintName emite una alerta! + + +### Your RestraintName stimulates you to hinder your efforts! + +### Your RestraintName stimulates you and beeps loudly! + A golden lock fades into a blue lock on one of your restraints! ¡Un candado dorado se desvanece en un candado azul en una de tus ataduras! -Your command word is heard and the purple lock(s) click and fall off! -¡Se escucha su palabra de comando y los candados morados hacen clic y se caen! +### Your command word is heard and the magic lock(s) click and fall off! + Your command word is heard and the charger unlocks! ¡Su palabra de comando se escucha y el cargador se desbloquea! + + Are you sure you want to attack? ¿Estás seguro de que quieres atacar? Are you sure you want to go to the next level? (Click self to confirm) ¿Estás seguro de que quieres pasar al siguiente nivel? (Haga clic en sí mismo para confirmar) + + You shudder as you apply the RestraintName to yourself... Te estremeces cuando te aplicas RestraintName... You insert the RestraintName and close your belt's shield over it, with a click as it locks in place. @@ -10644,8 +12576,14 @@ You attack the RestraintName and close your bra's shield over it, with a click a Atacas el RestraintName y cierras el escudo de tu sostén sobre él, con un clic cuando se traba en su lugar. You slowly put on the RestraintName, amazed at how it seems to mold to your size... Lentamente te pones el RestraintName, asombrado de cómo parece amoldarse a tu tamaño... + + + + You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! Luchas infructuosamente. ¡No hay ojo de cerradura y el material es casi irrompible! + + Ancient Chastity Belt Cinturón de castidad antiguo You find a chastity belt, glowing magnificently, along with a strange crystal next to it. @@ -10656,16 +12594,20 @@ Un cinturón de castidad de elegante diseño antiguo. Mientras está activado, o 'Cinturón de los devotos' You tug at your chastity belt, but you can't even stick a finger inside because it's so tight... Tiras de tu cinturón de castidad, pero ni siquiera puedes meter un dedo porque está muy apretado... + + Ancient Chastity Bra Sujetador de castidad antiguo You find a chastity bra, glowing magnificently, along with a strange crystal next to it. Encuentras un sostén de castidad, que brilla magníficamente, junto con un cristal extraño al lado. -A chastity bra of sleek, ancient design. While powered, it reduces incoming damage by 1. -Un sujetador de castidad de diseño elegante y antiguo. Mientras está encendido, reduce el daño entrante en 1. +### A chastity bra of sleek, ancient design. While powered, it reduces incoming damage from attacks by 20. + 'Shield of the chaste' 'Escudo de la casta' You rub your hands along your breasts but feel only hard, unbreakable metal. Te frotas los senos con las manos, pero solo sientes metal duro e irrompible. + + Ancient Heels tacones antiguos You find a set of glowing heels, glowing magnificently, along with a strange crystal next to it. @@ -10676,16 +12618,20 @@ Un par de tacones altísimos, encantados con magia de combate. Cuando se activan 'Zapatos de los agraciados' You can barely stand in these heels. They are rigid, metallic, and unbreakable, yet padded on the inside. Apenas puedes pararte con estos tacones. Son rígidos, metálicos e irrompibles, pero acolchados por dentro. + + Ancient Blindfold Venda antigua -You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. -Tienes una venda de metal acolchada que brilla magníficamente, junto con un extraño cristal a su lado. +### You find a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. + A full-blackout mask. When powered, it negates accuracy penalties due to vision, boosts accuracy by +100%, and boosts melee damage by +10. Una máscara de apagón total. Cuando está encendido, niega las penalizaciones de precisión debido a la visión, aumenta la precisión en +100% y aumenta el daño cuerpo a cuerpo en +10. 'Mask of the Warrior' 'Máscara del guerrero' You tug at the mask but it won't come off. It's molded so close to your face that no light shines through! Tiras de la máscara pero no sale. ¡Está moldeado tan cerca de tu cara que no pasa luz! + + Ancient Muzzle Hocico antiguo You find a muzzle with a long rubbery plug on the inside, glowing magnificently, along with a strange crystal next to it. @@ -10696,6 +12642,8 @@ Un bozal que sella herméticamente la cara. Cuando está encendido, regenera man 'Bozal del saboteador' You claw at your face, but not only does the soft plug fill your mouth completely, the muzzle itself is nigh-unbreakable! Te arañas la cara, pero no solo el suave tapón te llena la boca por completo, ¡sino que el propio hocico es casi irrompible! + + Ancient Gag mordaza antigua You find a ball gag harness with a long rubbery plug instead of a ball, glowing magnificently, along with a strange crystal next to it. @@ -10706,6 +12654,8 @@ Una mordaza que llena la boca. Cuando se alimenta, regenera maná, reduce el lan 'La mordaza de los enfocados' You tug on the straps at your cheeks, but the straps are so tight the plug doesn't even move! Tiras de las correas en tus mejillas, ¡pero las correas están tan apretadas que el enchufe ni siquiera se mueve! + + Ancient Rear Plug Tapón trasero antiguo You find a huge, flexible, segmented plug, along with a strange crystal next to it. @@ -10716,16 +12666,16 @@ Un enchufe que sorprende al usuario cuando alguien lo disciplina, después del o 'Enchufe del Obediente' You realize the magical plug has expanded inside your body. It won't come out. Te das cuenta de que el tapón mágico se ha expandido dentro de tu cuerpo. No saldrá. + + Ancient Plug Enchufe antiguo You find a huge, ribbed plug, along with a strange crystal next to it. Encuentras un enorme tapón acanalado, junto con un extraño cristal al lado. A plug that denies the wearer constantly and only rarely grants release. When powered, it grants +70% magic resistance (about 40% reduction). Un enchufe que niega al usuario constantemente y solo rara vez otorga liberación. Cuando está encendido, otorga +70% de resistencia mágica (alrededor del 40% de reducción). -'Plug of the Perseverant' -'Plug of the Perseverant' -You realize the magical plug has expanded inside your body. It won't come out. -Te das cuenta de que el tapón mágico se ha expandido dentro de tu cuerpo. No saldrá. +### 'Plug of the Perseverant' + Ancient Stimulator Estimulador antiguo You find a flat, round device with a hole on one side, along with a strange crystal next to it. @@ -10736,6 +12686,8 @@ Un dispositivo que provoca al usuario por lanzar hechizos y atacar. Cuando está 'El persuadir' You realize the magical device has attached to your body using suction. It won't come off! Te das cuenta de que el dispositivo mágico se ha adherido a tu cuerpo mediante succión. ¡No saldrá! + + Ancient Mittens Manoplas antiguas You find a pair of shining gloves, glowing magnificently, along with a strange crystal next to it. @@ -10746,6 +12698,8 @@ Manoplas ajustadas que obligan a las manos a cerrarse en puños. Cuando están e 'Mitones de voladura' You rub your mittens together, but they are unfazed by anything you do to them and your hands are clasped tight. Frotas tus guantes, pero no se inmutan por nada de lo que les haces y tus manos están apretadas. + + Ancient Armbinder Guardabrazos antiguo You find a monoglove, glowing magnificently, along with a strange crystal next to it. @@ -10756,52 +12710,68 @@ Un brazalete extremadamente estricto. Cuando está encendido, reduce la probabil 'Armbinder del artillero' You try to wiggle your arms, but they can barely move in this position and are clasped tight. Your arms are sealed. Intentas mover los brazos, pero apenas se pueden mover en esta posición y están apretados. Tus brazos están sellados. + + Ancient Ankle Cuffs Tobilleras antiguas You find a pair of glowing cuffs, glowing magnificently, along with a strange crystal next to it. Encuentras un par de puños brillantes, que brillan magníficamente, junto con un extraño cristal al lado. -A pair of cuffs designed for summoners. Heals nearby summons by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power. -Un par de puños diseñados para invocadores. Cura las invocaciones cercanas en 15 por turno y también aumenta tu evasión en +50% (a 2/3). Cierra sin corriente. +### A pair of cuffs designed for summoners. Heals nearby allies by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power. + 'Anklets of the Faithful Friend' 'Tobilleras del amigo fiel' You jingle the chains around and realize that these unbreakable restraints won't be coming off. Haces sonar las cadenas y te das cuenta de que estas ataduras irrompibles no se soltarán. -Ancient Ankle Cuffs -Tobilleras antiguas ...when powered down, they snap together, rendering the wearer immobile. ... cuando se apaga, se unen, dejando al usuario inmóvil. 'Anklets of the Unfaithful Friend' 'Tobilleras del amigo infiel' -You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! -Luchas infructuosamente. ¡No hay ojo de cerradura y el material es casi irrompible! + + + + You search for your ancient keys but it seems they were taken away for good. Buscas tus llaves antiguas, pero parece que te las quitaron para siempre. -Random (reduces penalty by 1) -Aleatorio (reduce la penalización en 1) + + +### Random (-10% rep loss) + You don't have any valid targets on your body for that. No tienes objetivos válidos en tu cuerpo para eso. + + The air swirls with traces of pleasing magic... El aire se arremolina con rastros de magia placentera... The spores make you feel sleepy... Las esporas te dan sueño... + + +### Physical Block: AMOUNT + +### Magic Block: AMOUNT + DAMAGETYPE: MULTIPLIERx modifier TIPO DE DAÑO: modificador MULTIPLICADORx -Base Physical Armor: AMOUNT -Armadura física básica: AMOUNT -Base Magic Armor: AMOUNT -Armadura Mágica Base: AMOUNT -Base Evasion: AMOUNT% -Evasión base: AMOUNT% +### Physical Armor: AMOUNT + +### Magic Armor: AMOUNT + +### Evasion: AMOUNT% + Deals DAMAGETYPE damage Inflige daño de TIPO DE DAÑO +### AMNT% chance to hit you + Can disarm (chance: DISARMCHANCE%) Puede desarmar (oportunidad: DESARMADA%) Resistances: Resistencias: -HP: -CV: -Binding: -Vinculante: +### HP: + +### Shield: + +### Binding: + Ambivalent Ambivalente Likes you @@ -10822,46 +12792,48 @@ Aware of you! Consciente de ti! Pursuing you! ¡Persiguiéndote! -Slightly suspicious -Ligeramente sospechoso -Saw something... -Ví algo... +### Ignoring you! + +### Investigating! + +### Suspicious + Notices you! ¡Te nota! Unaware Inconsciente Items carried: Artículos llevados: +### Items worn: + ...and NUMBER more ... y NÚMERO más -Disappears if the caster is stunned -Desaparece si el lanzador está aturdido. +### Takes damage if the caster is stunned + Disappears if the caster is defeated Desaparece si el lanzador es derrotado. Caster: ENEMYNAME Lanzador: NOMBRE DEL ENEMIGO -Demise immanent -fallecimiento inminente -Vulnerable -Vulnerable +### Demise imminent + +### Vulnerable + Stunned Aturdido Snared atrapado -Slowed -ralentizado Silenced Silenciado Disarmed Desarmado Blinded cegado +### Apprehended! + Restrained! ¡Contenido! Restricted! ¡Restringido! -Immobilized! -¡Inmovilizado! Fully Bound! ¡Completamente atado! Trussed up! @@ -10870,30 +12842,28 @@ Tightly Secured! ¡Estrechamente asegurado! Inescapably inevitablemente -Trussed up! -¡Atado! -Trussed up! -¡Atado! -Helpless! -¡Indefenso! Belted Ceñido Wearing a toy usando un juguete Vibed! ¡Vibra! +### Flying + +### Distracted! + +### Soap + Acid Ácido -Shadow -Sombra -Ice -Hielo -Ice -Hielo -Fire -Fuego +### Holy + +### Arcane + Poison Veneno +### Poison Gas + Charm Encanto Tickle @@ -10912,58 +12882,48 @@ Pain Dolor Spirit Draining Drenaje de espíritu -Psychic -Psíquico Mana Draining Drenaje de maná Electric Eléctrico +### E-Stim + Shock Choque -Pressure -Presión +### Plush + +### Blast + Chain Cadena -Charm -Encanto -Glue -Pegamento -Unarmed -Desarmado -Melee -Pelea confusa -Magic -magia +### Gas + +### Physical + Spell Deletrear Unstoppable Imparable Unflinching inquebrantable -You found a magical amulet! Choose one of the following to determine its benefits: -¡Has encontrado un amuleto mágico! Elija uno de los siguientes para determinar sus beneficios: -Focus: +50% max distraction, increased distraction decay. +5% stamina protected from damage (base: 30%). -Concentración: +50 % de distracción máxima, disminución de la distracción aumentada. +5 % de resistencia protegida del daño (base: 30 %). -Vigour: +50 max stamina, +50% stamina potion effectiveness. -Vigor: +50 de resistencia máxima, +50 % de efectividad de la poción de resistencia. -Wisdom: +50 max mana. +50% mana potion effectiveness. -Sabiduría: +50 maná máximo. +50 % de eficacia de la poción de maná. -Fortitude: +50 max willpower, +50% willpower potion effectiveness. +1 stamina regen/turn. -Fortaleza: +50 de fuerza de voluntad máxima, +50% de efectividad de la poción de fuerza de voluntad. +1 regeneración de resistencia/turno. -+Distraction -+Distracción + + +### +Focus + +Stamina +resistencia +Willpower +Fuerza de voluntad -+Mana -+Dónde +### +Magic + Discard (destroys it permanently!) Descartar (¡lo destruye permanentemente!) -The EnemyName is vulnerable and took an extra AMOUNT base damage! -¡El EnemyName es vulnerable y recibió una AMOUNT adicional de daño base! -The EnemyName isn't aware of you and took an extra AMOUNT base damage! -¡El EnemyName no es consciente de ti y recibió una AMOUNT adicional de daño base! + + +### You crit the vulnerable EnemyName for AMOUNT extra damage! + +### You crit the unsuspecting EnemyName for AMOUNT extra damage! + The enemy steals a pick from you! ¡El enemigo te roba un pico! The enemy takes away your knife! @@ -10980,10 +12940,10 @@ You get your stolen items back. Recuperas tus objetos robados. The EnemyName manages to retreat with your items! ¡El EnemyName logra retirarse con tus artículos! + + The orb contains knowledge of SPELL. El orbe contiene conocimiento de HECHIZO. -You capture the EnemyName. You can become a champion in the Reputation screen. -Capturas el EnemyName. Puedes convertirte en un campeón en la pantalla de Reputación. You capture the EnemyName. Capturas el EnemyName. You capture the EnemyName in the name of the goddess of GODDESS. @@ -10994,14 +12954,18 @@ You capture the EnemyName, but the goddess of GODDESS demands that you wear seve ¡Capturas el nombre del enemigo, pero la diosa de la DIOSA exige que uses varias ataduras! You capture the EnemyName, but the goddess of GODDESS would prefer that you wear some restraints. Capturas el EnemyName, pero la diosa de la DIOSA preferiría que usaras algunas restricciones. -You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! -¡Capturas el nombre del enemigo, pero la diosa de la DIOSA exige que uses varias ataduras! You capture the EnemyName, but have reached the limit for rewards this floor. Capturaste el EnemyName, pero alcanzaste el límite de recompensas en este piso. + + The spirit inside the restraint is vengeful and emerges to wreak havoc on the world! ¡El espíritu dentro de la restricción es vengativo y emerge para causar estragos en el mundo! + + You hide inside the container... Te escondes dentro del contenedor... +### You hide inside the chest... + It's a crumpled piece of scrap metal with a sharp edge. Es un trozo de chatarra arrugado con un borde afilado. You use the scrap to try and cut the item. @@ -11010,54 +12974,154 @@ You rub the item against the broken object's sharp edges... Frotas el artículo contra los bordes afilados del objeto roto... A hook hangs at shoulder height. Un gancho cuelga a la altura del hombro. -You can't reach that with the hook! -¡No puedes alcanzar eso con el gancho! +### The hook is too high up! You can't reach it... + There's a hook on the wall. Hay un gancho en la pared. The wall is cracked. La pared está agrietada. You rub yourself on the corner... Te frotas en la esquina... + + Many ropes emerge around you, removing weaker ropes from your body and binding enemies! ¡Muchas cuerdas emergen a tu alrededor, eliminando las cuerdas más débiles de tu cuerpo y atando a los enemigos! + + Choose Class: Elija Clase: + + Distraction Mode: Modo de distracción: -Distracted -Distraído + + +### Progression Mode: + +### Key Hunt + +### Random + +### Selected + +### You will need to find the key to proceed to the next floor. + +### Each floor will have a random task to unlock the stairs. + +### You will select your task for each floor before you enter. Requires Perk Progression. + +### Perks Mode: + +### Extra + +### Less + +### Much Less + +### No pain, no gain. + +### Gain 20 extra perk points, to give you a false sense of security. + +### Lose 20 perk points, just to keep things interesting. + +### Lose 50 perk points, making things very interesting. + + + +### Perk Progression Mode: + +### Disabled + +### Optional + +### Mandatory + +### Debuffs Only + +### No perks between floors. + +### The standard mode. You may choose between one of three perk altars between floors. + +### A twist on the standard mode. You must choose before progressing. + +### You must pick a debuff between floors before progressing. + + + +### Perk Shrine Bondage: + +### Never + +### Sometimes + +### Always + +### Perk shrines will not offer bondage as part of the deal. + +### Bondage will sometimes be offered alongside perks. + +### Perk shrines are always accompanied by bondage. + + + +### Perk Shrine Bondage Info: + +### Hidden + +### Partial + +### Full + +### You do not know if a perk shrine will apply bondage. + +### You know that a perk shrine will apply bondage, but not what kind. + +### You know the exact restraints a perk shrine will apply. + +### Difficulty: + +### Normal Mode + +### Hard Mode + +### Extreme Mode + +### A supposedly reasonable difficulty curve. + +### Play the game the way it was intended. Cruel and restrictive. + +### Play at your own peril. Unlocked by double-clicking the Hard Mode button. + Aroused excitado Removes all chastity belts, vibrating restraints, plugs, and removes the option to play with yourself. Elimina todos los cinturones de castidad, restricciones vibratorias, tapones y elimina la opción de jugar contigo mismo. Includes all that good stuff. Incluye todas esas cosas buenas. +### Allow Front Plugs + Allow Rear Plugs Permitir enchufes traseros Allow Piercings Permitir perforaciones -Fighter -Combatiente -Start with 200 willpower and Iron Will, good at melee and blocking attacks. + + +Start with 150 willpower and Iron Will, good at melee and blocking attacks. Comience con 200 de fuerza de voluntad y Voluntad de hierro, bueno en ataques cuerpo a cuerpo y de bloqueo. -Rogue -Pícaro -Start with 200 stamina and Sneaky, good at stealth and evasive gameplay. +Start with 150 stamina and Sneaky, good at stealth and evasive gameplay. Comience con 200 de resistencia y Sneaky, bueno en el juego sigiloso y evasivo. -Wizard -Mago -Start with 200 mana and Magical Sight, good at casting spells. +Start with 150 mana and Magical Sight, good at casting spells. Comienza con 200 de maná y Magical Sight, bueno para lanzar hechizos. -Peasant -Campesino Start with nothing to your name. For those who want a challenge. Comience sin nada a su nombre. Para aquellos que quieren un desafío. -Trainee -Aprendiz You are a mage, but haven't finished your formal 'training'. Requires Aroused mode. Eres un mago, pero no has terminado tu 'entrenamiento' formal. Requiere el modo excitado. + + Spell Choice: Elección de hechizo: + + Choose Spells Elige hechizos Random Spells @@ -11066,8 +13130,12 @@ Break orbs. Get points. Buy spells. It's that simple. Rompe orbes. Obtener puntos. Compra hechizos. Es así de simple. Break orbs and pray you get something good. Rompe orbes y reza para obtener algo bueno. + + Save Mode: Modo Asalvo: + + Save Codes Guardar códigos Roguelike @@ -11076,10 +13144,12 @@ Grants a save code every floor you can write down. Autosaves only on floor start Otorga un código de guardado por cada piso que puedas escribir. Autoguarda solo al inicio del piso. No save codes, forced autosaves. You are in it to win it. Sin códigos de guardado, guardados automáticos forzados. Estás en esto para ganarlo. + + Prison Strictness: Rigor de la prisión: -Normal -Normal + + Easy Fácil Strict @@ -11090,12 +13160,18 @@ If you get captured, you will always get rescued and pay a fee. Si te capturan, siempre te rescatarán y pagarás una tarifa. If you get captured, you are totally on your own. Si te capturan, estás totalmente solo. + + Start Playing Empezar a jugar Lock your settings in, nice and tight. Bloquee su configuración, agradable y firme. +### Start with some perks that increase strictness and immersion. + Choose some perks to spice up your run. Elige algunas ventajas para animar tu carrera. + + This game engages in safe and consensual analytics. Este juego se involucra en análisis seguros y consensuados. It sends data about spell choices, levels reached, etc, to help balance and improve the game. @@ -11106,12 +13182,32 @@ Accept Aceptar Don't Track Me No me rastrees +### Proceed + Your key to the stairs is taken away! ¡Te quitaron la llave de las escaleras! You found a keyring to the stairs! Now you just need to get there. ¡Encontraste un llavero en las escaleras! Ahora solo necesitas llegar allí. -There seems to be a locked high-security door. Looks like you need a key. -Parece que hay una puerta cerrada de alta seguridad. Parece que necesitas una llave. + + +### Behold my SPL! + +### Mmmph... SPL... + +### Oh noes... + +### Ueeee! + +I don't want to be your slave! +¡No quiero ser tu esclavo! +Catch me if you can! +Atrápame si puedes! +I've been naughty, looks like I need to be punished... +He sido travieso, parece que necesito ser castigado... +I've been a bad girl, won't you do something about it? +He sido una chica mala, ¿no harás algo al respecto? +Mmmph... maybe I talk too much... +Mmmph... tal vez hablo demasiado... Well well, what have we got here? Bueno bueno, ¿qué tenemos aquí? You're not here to take away my pets, are you? @@ -11128,6 +13224,8 @@ Cleaning up for me, huh? Limpiando para mí, ¿eh? Uh uh, give that back! ¡Uh uh, devuélveme eso! +### What do we have here? An intruder? Or a future pet? + I see how it is. Veo como es. I've taken on hundreds of adventurers like you. @@ -11172,6 +13270,42 @@ I'll be taking that~ Voy a tomar eso ~ 'Click!' '¡Hacer clic!' +### In the name of PTRN, I order you to kneel! + +### You're in my way. + +### Step aside, pet. + +### Get her, my pets! + +### Hey! Don't touch that! + +Why you... +Por qué tú... +### You can't do that! + +### Leave them alone! + +### Hey, stop that! + +### Why do I hire these people... + + + + + +### Activate SPL protocol. + +### What do you mean 'access denied'??? + +### Release me at once. + +### This is unacceptable! + +### Guards! Guards... Guards? Well drat. + +You'll never get away with this! +¡Nunca te saldrás con la tuya! Look, another one of my dolls~ Mira, otra de mis muñecas~ Come to me, my lovely thing~ @@ -11188,6 +13322,8 @@ Leave that for the cleaning robots. Deja eso para los robots de limpieza. Skulking around, are we? Escondiéndonos, ¿verdad? +### I see you. + There's no point in fighting. No tiene sentido pelear. How ineffectual. @@ -11206,8 +13342,6 @@ I am the only goddess you need. Soy la única diosa que necesitas. Dolls shouldn't mess with things they don't understand. Las muñecas no deberían meterse con cosas que no entienden. -Oh, that's not going to help~ -Oh, eso no va a ayudar~ Let's take you somewhere safe~ Vamos a llevarte a un lugar seguro~ You won't be getting away. @@ -11232,18 +13366,158 @@ You won't be needing that. No necesitarás eso. Tsk Tsk. I'll be keeping the keys. Tsk Tsk. Me quedaré con las llaves. -Catch me if you can! -Atrápame si puedes! -You'll never get away with this! -¡Nunca te saldrás con la tuya! -I don't want to be your slave! -¡No quiero ser tu esclavo! -I've been naughty, looks like I need to be punished... -He sido travieso, parece que necesito ser castigado... -I've been a bad girl, won't you do something about it? -He sido una chica mala, ¿no harás algo al respecto? -Mmmph... maybe I talk too much... -Mmmph... tal vez hablo demasiado... +### I used to be an adventurer like you~ My name was PTRN... + +### You don't know who you're messing with. + +### You won't be allowed to make that mistake twice. + +### I'll punish you myself. + +### Hands off my property. + +### Know your place, girl! + +### You've had your chance. + +### Fine, then. + +### Know your place! + +### *sighs* + + + + + +### Hmmph~ + +### My mistake~ + +### This wasn't supposed to happen. + +### The Collector has become the Collected. + +### Fine, you win! + +### Cover me you brats! + +### She's coming for me! + +### Stay away! + +### Time for a taste of my own medicine... + +### I wonder how many days we'll get to spend together! + +### You look so pretty as always, and forevermore~ + +### Time for an inspection~ + +### There's no use in struggling, dear! I've made sure it's extra tight. + +### Playtime is over, back to your cell~ + +### Why aren't you wearing your restraints? + +### I did not order you to clean~ + +### What's that you've got there? + +Found you! +¡Te encontré! +### I've been waiting for this~ + +### Show me your moves. + +### You'll make for a fine servant! + +### Very impressive. + +### Yes, yes, show me what you've got! + +### I've always wanted another mage. + +### Tsk tsk, no silly tricks~ + +### Now now, you don't have permission to do that~ + +### What do you think you're doing? + +### Typical adventurers~ + +### Oh, you got out? + +### Too bad~ + +### That thing is dangerous, my dear~ + +### A feisty one, aren't you~ + +### Playtime's over~ + +### Very nice. + +### Most impressive! + +### You need more training! + +### Come along now~ + +### Come closer, I want to see your face~ + +### What a shame. + +### What's this? + +### See if you can get out of that! + +### I am the Warden. All things in this dungeon are subject to me. + +### Hands off my pet~ + +### Careful what you ask for~ + +### Be gentle with her~ + +### That's my property~ + +### You've made some enemies, haven't you? + +### I should teach you to be a nice girl. + +### You need to learn some manners~ + +### This will be entertaining. + +### Show me what you've got~ + +### I'll watch~ + + + +### Submit to my SPL! + +### Hmmmph... SPL-- + +### Fine then! Have it your way. + +### You'll be sorry you didn't listen to me~ + +### Why must you be so difficult! + +### They're coming for me! + +### Do you know of the Dollmaker? I've got a proposal for you and I... + +### I cast SPL! + +### That wasn't supposed to happen! + +### This is too tight... + +### I can't get free! + Hey! Where do you think you're going? ¡Ey! ¿A dónde crees que vas? You look like you're having fun! @@ -11254,6 +13528,8 @@ What do you think you're doing with that? ¿Qué crees que estás haciendo con eso? Looks like you found my keys! Hand them over. ¡Parece que encontraste mis llaves! Entregarlas. +### Alert! + You look like a good girl. Come on~ Pareces una buena chica. Vamos ~ Come here, let's play! @@ -11276,10 +13552,6 @@ Watch it! ¡Míralo! Don't touch that! ¡No toques eso! -Don't touch that! -¡No toques eso! -Don't touch that! -¡No toques eso! We have an escapee! ¡Tenemos un fugitivo! Not so fast! @@ -11296,24 +13568,50 @@ Missed me! ¡Me extrañaste! You're coming with me! ¡Vienes conmigo! -Get over here! -¡Ven aquí! -Not so slippery now! -¡Ya no es tan resbaladizo! Hand it over. Entrégalo. Nice and tight! ¡Agradable y apretado! +### The name's PTRN. + +### What the-- + +### You won't get away with this! + +### I'm coming! + +### I can't let you do that! + +### You'll pay for this! + +### That was a mistake! + +### I'm joining in! + +### Hand on, I'm coming! + +### I'm here! + +### Here I come! + +### Come and get me! + +### You'll never escape! + +### Mmmphh! + +### Mmmm! Mmmmmmm! + Mmmmph!!! ¡¡¡Mmmmmmm!!! -Mmmmm~ -Mmmmm~ +### Mmmmm~ + Mmmgh! ¡Mmm! Mmmmmm <3 Hmmmm <3 -Mmmmmm~ -Mmmmm~ +### Mmmmmm~ + Mmmph~ mmmmm~ *looks at you nervously* @@ -11326,36 +13624,28 @@ Mmmph? ¿Mmm? Mmmghgh!!! ¡¡¡Mmmghgh!!! +### Mmmmph! + Mmmmph... Mmmmmm... Hhhhmph! ¡Hhhhmph! -Mmmmmmmmm... -Mmmmmmmmm... -Mmmph! -Mmmph! +### Mmmph! + Nngghhh! Nngghhhh! Gggghh!!! ¡¡¡Gggghhh!!! -Mmmaaghthh! -Mmmaaghthh! +### Mmmaaghthh! + Wwwmmmthhh! ¡Wwwmmmthhh! Mmmmmph! ¡Mmmmmmm! -Mmmph. -Mmmm. -Mmmph! -Mmmph! *looks at you suspiciously* *te mira con suspicacia* *looks at you angrily* *te mira enojado* -Mmmmph!!! -¡¡¡Mmmmmmm!!! -Mmmmph! -Mmmmph! *jumps up and down excitedly* *salta y baja emocionado* *groans* @@ -11364,90 +13654,54 @@ Mmmmph! *hace un baile feliz* Mmmph!!! ¡¡¡Mmmmm!!! -*giggles* -*risitas* -Mmmph. -Mmmm. -Nngghhh! -Nngghhhh! -Mmm-hmmm. -Mmm-hmmm. -Mmmmmmm~ -Mmmmmmm~ -Mmmph~ -mmmmm~ -Mmmmph!!! -¡¡¡Mmmmmmm!!! -Mmmmm~ -Mmmmm~ -Mmmgh! -¡Mmm! -Mmmmmm <3 -Hmmmm <3 -Mmmmmm~ -Mmmmm~ -Mmmph~ -mmmmm~ -*Mmmmmm~* -*Mmmmm~* +### Mmm-hmmm. + +### Mmmmmmm~ + +### *Her nametag says 'PTRN'* + +### Mmmph!! + +### Mmmm--! + +Mmmmph. +Mmmmmmmm +### Mmmmmmmgh! + +### Mmph! + +### Mmmmmmmph... + +### MMMMMPH!!! + + + + + +### *focuses intently* + +### *appears distracted* + +### *Mmmmmm~* + *muffled giggle* *risita ahogada* -Mmmm~ -Mmmm~ -Mmmph? -¿Mmm? -Mmmghgh!!! -¡¡¡Mmmghgh!!! -Mmmmph... -Mmmmmm... -Hhhhmph! -¡Hhhhmph! -Mmmmmmmmm... -Mmmmmmmmm... -Mmmph! -Mmmph! -Nngghhh! -Nngghhhh! -Gggghh!!! -¡¡¡Gggghhh!!! -Mmmaaghthh! -Mmmaaghthh! -Wwwmmmthhh! -¡Wwwmmmthhh! -Mmmmmph! -¡Mmmmmmm! -Mmmph. -Mmmm. -Mmmph! -Mmmph! -Mmmph? -¿Mmm? +### Mmmm~ + *glows with anger* *brilla de ira* -Mmmmph!!! -¡¡¡Mmmmmmm!!! -Mmmmph! -Mmmmph! -*muffled giggle* -*risita ahogada* -*groans* -*gemidos* -*muffled giggle* -*risita ahogada* -Mmmph!!! -¡¡¡Mmmmm!!! -*muffled giggle* -*risita ahogada* -Mmmph. -Mmmm. -Nngghhh! -Nngghhhh! -Mmm-hmmm. -Mmm-hmmm. -Mmmmmmm~ -Mmmmmmm~ -Mmmph~ -mmmmm~ +### *Her headpiece says 'PTRN'* + + + + + +### Watch out for my SPL! + +### Whoops! + +### You won't get me like this! + You'll never catch me! ¡Nunca me atraparás! Where'd you come from? @@ -11470,6 +13724,8 @@ What are you rummaging around for? ¿Qué estás buscando? Oh no you don't! ¡Oh, no, no lo harás! +### You're not supposed to be here... + I'm gonna teach you a lesson, girl. Te voy a dar una lección, niña. I'm gonna miss you when we find you a nice master... @@ -11488,8 +13744,6 @@ The mages sell real well... Los magos se venden muy bien... Mage! Stop her! ¡Mago! ¡Detenla! -Watch it! -¡Míralo! Not on my watch. No en mi reloj. That's my stash... @@ -11498,38 +13752,56 @@ You'll fetch a pretty penny from that goddess you just pissed off. Obtendrás un buen centavo de esa diosa que acabas de enojar. Hah! Found ya! ¡Ja! ¡Sí! -Got you! -¡Te tengo! *scoffs* Amateur. *se burla* Aficionado. -Do your worst! -¡Haz lo peor! -Got you! -¡Te tengo! Hmph. Get back here! Hmph. ¡Regresa aquí! -Missed me! -¡Me extrañaste! +### Why won't you surrender! + +### Not a chance! + Boss! We got another one! ¡Jefe! ¡Tenemos otro! -Get over here! -¡Ven aquí! Caught ya~ Te atrapé ~ Dibs on this one! Dibs en este! Gotta make sure no one gets to you~ Tengo que asegurarme de que nadie se acerque a ti~ -This is a bug, please report -Esto es un error, por favor informe -This is a bug, please report -Esto es un error, por favor informe -This is a bug, please report -Esto es un error, por favor informe -This is a bug, please report -Esto es un error, por favor informe -This is a bug, please report -Esto es un error, por favor informe +### I'm PTRN. And who might you be? + +### Bad time to party, girl~ + +### You've got nerve showing your face around here. + +### Don't think you can get away~ + +### Trying to fight your way out? + +### Well, looks like I'm having fun today. + +### Hey girls, got room for one more? + +### We work for the highest bidder. + +Nothing personal. +Nada personal. +### Sorry, it's just the way things work. + +### You're mine. + +### You can't get away. + +### *extends an arm* + +### *miscast* + +### *wiggles* + +### *struggles* + +*rattles* +*sonajas* This is a bug, please report Esto es un error, por favor informe *starts chasing you* @@ -11542,12 +13814,12 @@ Esto es un error, por favor informe *corre hacia ti* *notices you!* *te nota!* +### *claps loudly* + *wants to socialize* *quiere socializar* *sends shivers down your spine* *envía escalofríos por tu columna* -*runs at you* -*corre hacia ti* *is rattled* *está nervioso* *scrabbles slowly by* @@ -11574,30 +13846,148 @@ Esto es un error, por favor informe *te agarra* *disarms* *desarma* -*is rattled* -*está nervioso* *rattles excitedly* *suena emocionado* *misses* *falla* +### *flails uselessly* + *trembles* *tiembla* *tugs on leash* *tira de la correa* -*rattles* -*sonajas* -*rattles excitedly* -*suena emocionado* -*rattles excitedly* -*suena emocionado* -*rattles* -*sonajas* -Bug -Bicho -Bug -Bicho -Bug -Bicho +### *Wears a sign saying 'PTRN'* + +### !!! + +### ! + + + +### *marches* + +### Engaging SPL! + +### A-Access denied!? + +### This... this unit is doing a good job! I swear! + +### It's just business as usual, nothing to see here... + +### It's not like I need reconfiguring or anything... + +### You! I require... reconfiguring. + +### Oh no! Looks like I need repairs~ + +### I've violated my parameters. Please discipline me. + +### Stop! You're not wearing the required uniform~ + +### Are your restraints too loose? Do I need to tighten them? + +### Transferring to a secure location. + +### You've violated your parameters. + +### Insufficient security clearance. Hand it over. + +### Please present your identification! + +### Hello doll. Do your settings need adjustment? + +### Looks like you've had too much time to yourself~ + +### A good doll needs routine maintenance~ + +### Ehh! The dolls aren't supposed to fight back! + +### In-initiating corrective action! + +### Alert! Inmate has gone rogue! + +### Who gave you permission to use magic? + +### Unauthorized use of magic is grounds for increased security. + +### Magic users require extra security! + +### Subduing assailant! + +### You're not allowed to contact the goddesses. Please meditate on this in your cell. + +### Behavior exceeds parameters. Please submit to arrest. + +### Alert! Inmate has escaped! + +### Don't you want to be trained? + +### Aren't you a violent one! + +### Ouch! That hurt... + +### That'll be all from you! + +### Your brat quotient is off the charts. + +### Please stop and submit to arrest. + +### Subject captured! + +### Come back, doll! + +### Deploying capture device. + +### I'll be confiscating that! + +### How'd you slip through security? + +### I'm PTRN, and today I shall be taking care of you~ + +### Enemy spotted! + +### Target in my sights! + +### Red alert! + +### Lay down your weapons! + +### Surrender and I'll be gentle! Relatively speaking... + +### Give up or I'll call reinforcements! + +### Ack! We have an unruly subject! + +### Target needs retraining... + +### Sorry, rules are rules~ + +### Moving to assist! + +### My orders are to shut you down~ + +### Defenses online! + + + +### SPL armed. + +### An exception has occurred while trying to run SPL. Retry? + +### Error in citizen ID registration. Please submit to processing. + +### Does not compute. + +### Some kind of miscalculation has occurred. + +### This was unforseen. + +### Unit is retreating. + +### Activating self-preservation instincts. + +### Commence tactical withdrawal. + Maintenance needed. Mantenimiento necesario. Unit needs repair. @@ -11614,6 +14004,8 @@ Theft detected. This is a warning. Robo detectado. Esta es una advertencia. Confiscating item. Objeto confiscado. +### Unknown subject detected. Presuming hostile. + Inmate detected. Commence training protocol. Preso detectado. Iniciar protocolo de entrenamiento. Inmate detected. Commence routine inspection. @@ -11622,8 +14014,8 @@ Inmate detected. Commence submission training. Preso detectado. Comience el entrenamiento de sumisión. Violence detected. Subduing assailant. Violencia detectada. Someter al agresor. -Damage detected. Initiating combat routine -Daños detectados. Iniciando la rutina de combate +### Damage detected. Initiating combat routine. + Unruly inmate detected. Performing corrective action. Recluso rebelde detectado. Realización de acciones correctivas. Magic detected. Subduing assailant. @@ -11632,14 +14024,10 @@ Energy spike detected. Preparing shields. Pico de energía detectado. Preparando escudos. Unlawful use of magic. Please submit to arrest. Uso ilegal de la magia. Por favor, sométase a arresto. -Violence detected. Subduing assailant. -Violencia detectada. Someter al agresor. Unlawful conduct. Please submit to arrest. Conducta ilícita. Por favor, sométase a arresto. Theft detected. Please submit to arrest. Robo detectado. Por favor, sométase a arresto. -Unlawful conduct. Please submit to arrest. -Conducta ilícita. Por favor, sométase a arresto. Inmate has escaped. Commence capture protocol. El recluso ha escapado. Iniciar protocolo de captura. Error, subject is attempting to escape. @@ -11650,10 +14038,14 @@ Target is violent. Increase alert level. El objetivo es violento. Aumenta el nivel de alerta. Dispensing restraints. Restricciones de dispensación. -Target resists. Revising strategy. -El objetivo se resiste. Revisión de estrategia. -Target combat skills below expected level. Revising estimates. -Habilidades de combate objetivo por debajo del nivel esperado. Revisión de estimaciones. +### Target flees. Revising strategy. + +### Target resists. Revising tactics. + +### Target skill below expected level. Revising strategy. + +### Target skill below expected level. Revising tactics. + Subject captured. Returning to processing. Sujeto capturado. Volviendo a la tramitación. Apply takedown protocol. @@ -11664,6 +14056,150 @@ Contraband detected. Confiscating. Contrabando detectado. Confiscando. Increasing strictness level. Aumento del nivel de rigurosidad. +### Unit PTRN identifying. + +### Red alert. Joining combat. + +### Battle stations. + +### Target identified. + +### Offering support. + +### New target identified. Engaging. + +### Combat detected. Engaging in corrective action. + +### Updating target registry. Proceed to attack. + +### Target updated. + +### New target detected. Please submit to detainment. + +### Moving to assist. + +### Moving to capture. + +### Forming blockade. + + + +### SPL(); + +### throw new Error(SPL); + +### query([ID]); >ERROR; transport([UNKNOWN], [DOLL]) + +### Does not compute; + +### Some kind of miscalculation has occurred; + +### This was unforseen; + +### Unit is retreating; + +### Activating self-preservation instincts; + +### Commence tactical withdrawal; + +### Maintenance needed; + +### Unit needs repair; + +### Commence transfer of power protocol; + +### Insufficient bindings; Commence submission protocol; + +### Commence routine inspection; + +### Inmate is out of containment; Transferring; + +### Theft detected; This is a warning; + +### Confiscating item; + +### Unknown subject detected; Presuming hostile; + +### Inmate detected; Commence training protocol; + +### Inmate detected; Commence routine inspection; + +### Inmate detected; Commence submission training; + +### Violence detected; Subduing assailant; + +### Damage detected; Initiating combat routine; + +### Unruly inmate detected; Performing corrective action; + +### Magic detected; Subduing assailant; + +### Energy spike detected; Preparing shields; + +### Unlawful use of magic; Please submit to arrest; + +### Unlawful conduct; Please submit to arrest; + +### Theft detected; Please submit to arrest; + +### Inmate has escaped; Commence capture protocol; + +### Error, subject is attempting to escape; + +### Target is violent; Disarming subject; + +### Target is violent; Increase alert level; + +### Dispensing restraints; + +### Target flees; Revising strategy; + +### Target resists; Revising tactics; + +### Target skill below expected level; Revising strategy; + +### Target skill below expected level; Revising tactics; + +### Subject captured; Returning to processing; + +### Apply takedown protocol; + +### Aggressive target detected; Deploying countermeasures; + +### Contraband detected; Confiscating; + +### increase_strictness(1); + +### query([SELF]); >PTRN; + +### Red alert; Joining combat; + +### Battle stations; + +### Target identified; + +### Offering support; + +### New target identified; Engaging; + +### Combat detected; Engaging in corrective action; + +### Updating target registry; Proceed to attack; + +### Target updated; + +### New target detected; Please submit() to detainment; + +### defend([ALLY]); + +### capture([CITIZEN]); + +### defend([POINT]); + +### Behold my creation! SPL! + +### No! Not like this! + Looks like I'm up to no good... better stop me! Parece que no estoy tramando nada bueno... ¡Mejor detenme! Careful where you point that thing! @@ -11686,6 +14222,8 @@ Hey! That's mine! ¡Ey! ¡Eso es mio! You're not supposed to have that! ¡No se supone que tengas eso! +### Oh? + You'll make a fine test subject... Serás un buen sujeto de prueba... Come here, I want to perform some tests! @@ -11724,6 +14262,8 @@ I've caught you! ¡Te he pillado! I can't believe I missed... No puedo creer que me perdí... +### That's not fair! + I knew you would do that! ¡Sabía que harías eso! Experiment was a success! @@ -11736,6 +14276,36 @@ Ooh, you've got some useful stuff~ Ooh, tienes algunas cosas útiles ~ I won't let you go that easily! ¡No te dejaré ir tan fácilmente! +### I am PTRN, the great scientist! + +### Do I have to? Fine... + +### Okay okay, I'm helping! + +### Where's my assistant when you need them... + +### I will offer my support! + +### You're really gonna make me do this? + +### I hate having to clean up after others. + +### Eh, whatever, I'll help. + +### You're ruining my experiment! + +### Sheesh, what a pest! + +### Need an assistant? + +### I smell an opportunity! + +### Do I have to? + +### Let me introduce you to SPL~ + +### No! My SPL! + Oh my, looks like I'm in trouble! ¡Oh, parece que estoy en problemas! What a shame it would be if I got caught~ @@ -11764,6 +14334,8 @@ That belongs to someone else. Eso pertenece a otra persona. Oh no you don't, sweetie! ¡Oh, no, no lo harás, cariño! +### You're a pretty one! Why don't you come here~ + Oof! Looks like you need to be taught a lesson! ¡Uf! ¡Parece que necesitas que te enseñen una lección! We better put away those hands of yours. @@ -11796,6 +14368,8 @@ I'm so excited! ¡Estoy tan emocionada! A slippery one, aren't you? Uno resbaladizo, ¿no? +### A brave one, aren't you? + Tsk tsk. You can do better, dear~ Tsk tsk. Puedes hacerlo mejor, querida~ I can't wait to dress you up! @@ -11808,17 +14382,45 @@ A gift? Thank you so much! ¿Un regalo? ¡Muchas gracias! You won't be getting out of that any time soon! ¡No saldrás de eso pronto! -No! I don't want to read your magazines! -¡No! ¡No quiero leer sus revistas! -No, I don't want to learn about Shibari! -¡No, no quiero aprender sobre Shibari! -No, I don't want to learn about your toys! -¡No, no quiero aprender sobre tus juguetes! -I found this book about Shibari... is it yours? -Encontré este libro sobre Shibari... ¿es tuyo? -I'm so clumsy... maybe you can fix that. -Soy tan torpe... tal vez puedas arreglar eso. -Gee, looks like I can't keep my mouth shut... +### I'm PTRN. Have you heard of my dresses?~ + +### That won't do! + +### I'd like to have you myself! + +### Oooh, a cute one! + +### *sigh* how improper... + +### Inelegant! You need some teaching! + +### *snaps her fingers* Looks like you'll need some punishment~ + +### That one is pretty. May I have her instead? + +### I'd like to place a bid too~ + +### Oooh, that one's mine! + + + + + +### SPL. + +### ... + +No! I don't want to read your magazines! +¡No! ¡No quiero leer sus revistas! +No, I don't want to learn about Shibari! +¡No, no quiero aprender sobre Shibari! +No, I don't want to learn about your toys! +¡No, no quiero aprender sobre tus juguetes! +I found this book about Shibari... is it yours? +Encontré este libro sobre Shibari... ¿es tuyo? +I'm so clumsy... maybe you can fix that. +Soy tan torpe... tal vez puedas arreglar eso. +Gee, looks like I can't keep my mouth shut... Caramba, parece que no puedo mantener la boca cerrada... Shhhhh. Shhhhhh. @@ -11836,6 +14438,8 @@ I was reading that! ¡Estaba leyendo eso! You're not supposed to have that. Se supone que no debes tener eso. +### You. Stop. + Who are you? ¿Quién eres? You're entering my personal space. @@ -11844,10 +14448,10 @@ I'm going to ask you to leave te voy a pedir que te vayas You're ruining the books! ¡Estás arruinando los libros! -Keep the damage under control! -¡Mantenga el daño bajo control! -Shut up!!! -¡¡¡Callarse la boca!!! +### Do you need a gag? + +### Shut up. + Put that back! ¡Pon eso de vuelta! There's nothing to learn from that, you ignorant buffon. @@ -11868,8 +14472,8 @@ Stay down. Quédate abajo. Get back here-- Regresa aquí-- -Why you... -Por qué tú... +### Just give it up. + Time for you to stay out of trouble. Es hora de que te mantengas alejado de los problemas. Come along. @@ -11880,6 +14484,34 @@ I'll be taking that back. Retomaré eso. Click. Hacer clic. +### If you really want to know, my name is PTRN. I am the keeper of this place. + +### Typical. + +### *sighs* Another one... + +Keep the damage under control! +¡Mantenga el daño bajo control! +### Stop fighting, you guys! + +### You'll ruin the books! + +### Stop making a mess! + +### You're too dangerous to have around. + +### I don't care what happens to you as long as you're out of here. + +### Get out of my library! + + + + + +### Deploying SPL! + +### What was I supposed to do again? Oh right! + No! I didn't do anything wrong... ¡No! no hice nada malo... Don't punish me! Please! @@ -11906,90 +14538,95 @@ Lets get you back in your jacket~ Vamos a ponerte de nuevo en tu chaqueta ~ Patients are not allowed to have toys. Los pacientes no pueden tener juguetes. -Oh no you don't, sweetie! -¡Oh, no, no lo harás, cariño! -Oof! Looks like you need to be taught a lesson! -¡Uf! ¡Parece que necesitas que te enseñen una lección! +### Oh my~ + You can be cured if you just give up. Puedes curarte si simplemente te rindes. You're going to ruin your progress~ Vas a arruinar tu progreso~ -Oh my, that's dangerous! -¡Oh, eso es peligroso! Patients are forbidden from casting spells! ¡Los pacientes tienen prohibido lanzar hechizos! -Keep those pretty hands to yourself, dear~ -Mantén esas bonitas manos para ti, querida~ -Where'd you find that, dear? -¿Dónde encontraste eso, querida? Silly girl, your illness can't be cured by a prayer. Niña tonta, tu enfermedad no se cura con una oración. -That's not yours, sweetie~ -Eso no es tuyo, cariño~ You shouldn't break things, you know~ No deberías romper cosas, sabes~ -I knew something was amiss! -¡Sabía que algo andaba mal! -You won't be getting away that easily, dear~ -No te escaparás tan fácilmente, querida~ -Won't be needing this~ -No necesitaré esto~ Hey, who said you could do that! ¡Oye, quién dijo que podías hacer eso! -I'm so excited! -¡Estoy tan emocionada! -A slippery one, aren't you? -Uno resbaladizo, ¿no? -Tsk tsk. You can do better, dear~ -Tsk tsk. Puedes hacerlo mejor, querida~ +### Now now, you can't just resist like that~ + Lets get you back to your cell! ¡Vamos a llevarte de vuelta a tu celda! -So nice of you to join me! -¡Qué amable de tu parte unirte a mí! Now let's see, good patients should be still... Ahora a ver, los buenos pacientes deben estar quietos... -A gift? Thank you so much! -¿Un regalo? ¡Muchas gracias! -You won't be getting out of that any time soon! -¡No saldrás de eso pronto! +### Nurse PTRN, reporting for duty! +### Someone call security! +### I will try to subdue them~ +### Code Gray! +### Hold her down! I'll get the jacket! +### Moving in to support! +### Let's mediate things, shall we? +### Why don't you calm down so we can talk. Or not~ +### Now now, what do we have here? +### I'll need another SPL, stat! +### A p-professional mistake. +### I did what the manual said! +### I seem to have caught something, won't you help? +### It's time for your daily dose of cuddling~ +### I diagose you with excessive subbiness. +### Seems like you've caught a case of female hysteria... +### I diagnose you with a case of bratty behavior... +### Have you had your daily cuddles yet? +### It's time for your edging treatment~ +### Sexual health is physical health, my dear~ +### PTRN MD here. Let's see what we've got... +### Security! +### What's this disturbance... +### Must I do everything myself... +### Settle down. +### I didn't want to get my hands dirty. +### Looks like the gloves are off~ +### Let me get my tools. +### I'll take a look. +### SPL +### SPL failed @@ -12024,180 +14661,797 @@ You won't be getting out of that any time soon! -You'll have to try harder if you want to discipline me, ma'am. -Tendrá que esforzarse más si quiere disciplinarme, señora. -I... don't have time for training right now, ma'am... -Yo... no tengo tiempo para entrenar en este momento, señora... -Did I do something wrong? -¿Hice algo mal? -So you're the new boss, huh? -Así que eres el nuevo jefe, ¿eh? -Time for some 'training?' -¿Tiempo para un poco de 'entrenamiento?' -Wanna to have a chat? -¿Quieres tener una charla? -Looks like you've had too much time to yourself. -Parece que has tenido demasiado tiempo para ti. -Why don't you come with me for a sec? -¿Por qué no vienes conmigo un segundo? -Let me see your ID... -Déjame ver tu identificación... -You have the right to remain silent. -Usted tiene derecho a permanecer en silencio. -No resisting arrest. -Sin resistencia al arresto. -Who set you loose? -¿Quién te soltó? -I'll be confiscating that. -Confiscaré eso. -Aye, you're gonna need clearance for that, missy. -Sí, necesitará autorización para eso, señorita. -You just made a big mistake. -Acabas de cometer un gran error. -Need backup! -¡Necesita respaldo! -You're under arrest! -¡Estas bajo arresto! -Magic use is restricted pursuant to IDC section 3 article 21a. -El uso de magia está restringido de conformidad con IDC sección 3 artículo 21a. -Magic? That's where I draw the line. -¿Magia? Ahí es donde trazo la línea. -I've got an extra comfy cell for mages. -Tengo una celda extra cómoda para magos. -You're under arrest! -¡Estas bajo arresto! -That's off limits for you! -¡Eso está fuera de los límites para ti! -Resorting to petty theft? How crude. -¿Recurriendo al hurto? Que crudo. -The goddesses have property rights too, you know. -Las diosas también tienen derechos de propiedad, ya sabes. -I'm gonna ask you to turn yourself in. -Voy a pedirte que te entregues. -Keep your hands where I can see 'em. -Mantenga sus manos donde pueda verlas. -That's a weapons violation. -Eso es una violación de armas. -Assaulting an officer is a crime! -¡Agredir a un oficial es un crimen! -You're coming with me. -vienes conmigo -Resisting arrest won't get you anywhere. -Resistirse al arresto no te llevará a ninguna parte. -Is that all you got? -¿Eso es todo lo que tienes? -You have the right to remain silent. -Usted tiene derecho a permanecer en silencio. -Got you! -¡Te tengo! -Hands behind your back. -Manos detrás de la espalda. -I will conduct a more thorough search later on. -Más adelante realizaré una búsqueda más exhaustiva. -Suspect is secure. -El sospechoso está seguro. -I'm not in trouble, am I? -No estoy en problemas, ¿verdad? -I'm not hiding anything, if you know what I mean... -No escondo nada, si sabes a lo que me refiero... -Who are you looking for? Me? -¿A quién estás buscando? ¿A mí? -So... wanna hang out? -Entonces... ¿quieres pasar el rato? -It's not like I... LIKE you or something... -No es como si... ME GUSTAS o algo así... -I'm not following you! I'm just... -¡Yo no te entiendo! Sólo soy... -You look suspicious. -Pareces sospechoso. -You've got a nice pair of wrists~ -Tienes un buen par de muñecas~ -You there! Let's have a talk. -¡Tú allí! Tengamos una charla. -Looks like you're rusty. Haven't you ever done escape training? -Parece que estás oxidado. ¿Nunca has hecho entrenamiento de escape? -I'm going to have some fun with you~ -Voy a divertirme contigo~ -Watch yourself, girl~ -Cuídate, chica~ -Nice find. I'll take it. -Buen hallazgo Me lo llevo. -This place is off-limits for you. -Este lugar está prohibido para ti. -Let's see how you like my special move! -¡A ver si te gusta mi movimiento especial! -That's nothing compared to my technique! -¡Eso no es nada comparado con mi técnica! -You're in for it now! -¡Estás listo ahora! -It's time for a display of skill! -¡Es hora de una demostración de habilidad! -Fancy tricks? That's nothing. -¿Trucos elegantes? Eso no es nada. -Let me show you a real move... -Déjame mostrarte un movimiento real... -True skill comes from the heart. Not something you hold in your hand. -La verdadera habilidad viene del corazón. No es algo que tienes en la mano. -She's not going to be happy about that... -Ella no va a estar feliz por eso... -Stop right there, criminal scum! -¡Detente justo ahí, escoria criminal! -Do you know what you've just done? -¿Sabes lo que acabas de hacer? -Finally, I've tracked you down! -¡Finalmente, te he rastreado! -It's over. I've already won. -Se acabó. ya he ganado -Wrong move, buddy. -Movimiento equivocado, amigo. -I can't believe it... -no puedo creerlo... -You're too slow. -Eres muy lento. -...she's fast. -... ella es rápida. -Nothing personal. -Nada personal. -This battle is over. -Esta batalla ha terminado. -Get over here! -¡Ven aquí! -Too slow! -¡Demasiado lento! -I'll be taking that. -Tomaré eso. -There's no way out. -No hay manera de salir. -I'm not in trouble, am I? -No estoy en problemas, ¿verdad? -I'm not hiding anything, if you know what I mean... -No escondo nada, si sabes a lo que me refiero... -Who are you looking for? Me? -¿A quién estás buscando? ¿A mí? -So... wanna hang out? -Entonces... ¿quieres pasar el rato? -It's not like I... LIKE you or something... -No es como si... ME GUSTAS o algo así... -I'm not following you! I'm just... -¡Yo no te entiendo! Sólo soy... -You're a cute one~ -eres linda~ -You've got a nice pair of wrists~ -Tienes un buen par de muñecas~ -Hey~! Let's have a talk. -¡Hola~! Tengamos una charla. -Looks like you need additional training. -Parece que necesita capacitación adicional. -I'm going to have some fun with you~ -Voy a divertirme contigo~ -Watch yourself, girl~ -Cuídate, chica~ -Nice find. I'll take it. -Buen hallazgo Me lo llevo. -This place is off-limits for you. -Este lugar está prohibido para ti. -Bad pet! -¡Mala mascota! + + + + + + + + + +### PTRN + + + + + + + + + + + + + + + +### SPL! + +### That w-was supposed to be a SPL! + +### Ooh, a shiny rock… + +### I wonder what's over here? + +### I'm bored, bye! + +### Pay more attention to me! + +### Tell me I'm pretty! + +### I'm not a bottom, I'm a scary dom! + +### You seem stressed, how about I help you take a break? + +### Here's some powerful loot that will help you win! Let me help you try it on… + +### Aaah, I can't help it, you're just too cute to keep my hands off! + +### Cuddle pillows aren't supposed to be able to move! + +### C'mon, c'mon, I wanna show you a fun place~ + +### Hey I called dibs on that! + +### You're cute! I'm gonna make you my pillow! + +### No fair! + +### You're not supposed to fight back! + +### Eep! + +### Cool magic! + +### Magic is cheating! + +### A cutie casting cute spells~ + +### No trying to leave the comfy room! + +### Cuddle time! + +### You dropped something, cutie~ + +### I just wanna make you a pillow! + +### Wow, I actually dodged something! + +### Stop dodging so I can bundle you up! >_< + +### You're not supposed to dodge, no fair! + +### You're not supposed to block, no fair! + +### Look, a distracting thing! Hehehe… + +### This is just to make sure your clothes don't fall off, don't worry! + +### My name's Melissa! I know I'm pretty, but try not to stare too much~ + + + + + + + + + + + + + +### Let me show you how it's done: SPL! + +### You've just narrowly avoided my SPL~ + +### Kya~ I have no mana, I'm so defenseless right now~ + +### I have all this bondage gear on me, I sure hope nobody ties me up with it~! + +### Oh no, how will I ever find my way out of here~ + +### If I focus really hard, I can make my blade go on fire! + +### I ran out of mana, but I'm sure I can find the exit before long! + +### Hey, be careful with my enchanted rope! + +### Hey, you wouldn't happen to have a mana potion, would you? + +### Say, I happen to know a thing or two about knots~ + +### I am an artist with rope... in more ways than one. + +### *blushes jealously* + +### I'm out of practice... you wouldn't mind helping me, right? + +### Thank you for cleaning up! I can take that off your hands~ + +### Oooh, I wonder where that key leads! + +### Hey you! Where do you think you're going? + +### Kya~! I challenge you! + +### What say you to a duel? + +### Let's fight! For honor and cuddles! + +### It's time for a battle between masters--wait, I'm low on mana... + +### Give me a second to chug a mana potion... + +### Why don't you try that again~ + +### I'll get you for that! + +### Hey you can't do that! It's not like I do it too or anything... + +### That was m- I mean... you can't steal things like that! + +### That was m- I mean... you can't steal sacred artifacts! + +### Kya~ What have we here? + +### I got you! + +### Watch where you're pointing that thing~ + +### Kya... I mean, ouch!!! + +### Take that!!! + +### Whaaa- + +### Hmmph! + +### Hah! Can't hit me! + +### It'll take more than that to bring me down! + +### What a shame. If only you weren't such a pushover... + +### Kya! Take that! + +### Nice loot! I'll take it~ + +### Can never be too sure! + +### You wouldn't happen to have a mana potion or 3 would you? + +### Looks like it's time for me to shine! + +### Stand down, or I won't go easy on you! + +### Help is on the way! + +### You really want to get tied up, don't you? + +### Hmph, looks like I need to help after all! + +### You asked for it! + +### Me? Help? Alright! + +### Sorry miss, I'm on an escort mission. + +### There goes my nice, relaxing day... + + + + + +### Behold, my true power! Wait... ack... + +### I wonder what to do with all these cuffs... + +### I have made a huge mistake... + +### I'll just be going... + +### Please hold me~ + +### Please punish me! Please!!! + +### I want... pain... + +### Let's spend some time together under the moonlight~ + +### I'll take you to my place tonight~ + +### I'm so blessed to find you! + +### Yes, enjoy yourself... + +### Come with me~ + +### Don't you want to feel the tight embrace of leather? + +### You won't need that. + +### It's time to get acquainted with the night~ + +### *moans loudly* + +### Yes... more! + +### Please keep doing that to me~ + +### Two can play at that game! + +### I call upon the shadows! + +### Have a taste of my spear! + +### A curious item~ + +### The shadows will consume all... eventually. + +### Put it back... + +### I was supposed to do that... not you. + +### What do we have here... + +### I've got you! Now I can make you do anything I want... + +### What was that? + +### Ah, yes!!! + +### You'll counterattack, won't you? + +### You're not trying hard enough! + +### More! MORE! + +### Yes, now hit me back! + +### Come now... let's go together. + +### Get over here~ + +### Pierce the darkness. + +### Oh? What's this? + +### Hmmm... that's better. + +### My name? My name... oh, I'm PTRN... + +### Hey! Look over here! + +### *points* Look, a distraction! + +### Kya~! I'll help! + +### Mind if I join? + +### Mmmph~ You two look like you're having fun! + +### Hey miss, I'm going to have to stop you now~ + +### Why don't you fight ME instead~ + +### What kind of trouble are we getting into today? + +### Oooh, fun! + + + + + +### Face my SPL! + +### SPL-whoops... + +### Give me another chance! + +### No! Wait! I can explain... + +### I'll be right back... + +### Okay, so I MAY have exaggerated my credentials... + +I'm not in trouble, am I? +No estoy en problemas, ¿verdad? +### I've been looking for... a mentor of sorts. + +### Aren't you the prettiest thing... + +### I've met a lot of cuties, but you're something special! + +### You'd look good in something tight and inescapable! + +### Enjoying yourself? Let's have some fun~ + +### You seem like you're having fun! Why don't we go for a walk~ + +### Wouldn't it be more interesting if... + +### What have you got there? + +### Oooh, a key for my collection? + +### What's that noise? I guess it's just another adventurer... + +### Ah! So you do have some fight left in you... + +### A little help over here! + +### I can take you! + +### M-magic? + +### I, uh, also learned a few cantrips... a while ago... + +### Okay, that was cool... + +### I've got enchanted rings and you don't~ + +### I don't think you're allowed to do that... + +### I think I deserve it instead~ + +### That's not okay... + +### I'm surprised you got this far! + +### Aha! + +### Do you even know what you're doing? + +### Okay, I may have exaggerated a bit... + +### Please tell me it's not already over? + +### Ah hold still... + +### Coward! + +### As expected of an inferior duelist. + +### Is that all? + +### A well-deserved victory on my part~ + +### I've... got you? + +### Are you finished? That's too bad... + +### ...what were you planning to do with this? + +### Oh... that's too bad~ + +### My name is PTRN, A-rank adventurer. You? + +### In the end, only one of us will be tied up! Wait a minute... + +### Heh, watch this~ + +### *readies weapon* time to get to work... + +### I thought we could reason with her. Oh well... + +### I see negotiations have broken down. + +### I'm the one you should worry about. + +### I've got orders to take you down. + +### There's a bounty on your head~ + +### The bounty will be mine... + + + + + +### You can't hope to match my SPL~ + +### SPL! No wait, not like that! + +### Be nice! + +### No! Be gentle! + +### Ahhhh! + +### Headpats please... + +### *purrs* + +### Nyah, I've been a bad kitty... + +You're a cute one~ +eres linda~ +### It's about time I got someone to play with~ + +### Let's take you for a walk~ + +### Having fun there~? + +### It's time for walkies~ + +### Don't you want to play? + +### Whatchya doing? + +### Tsk tsk, hand it over! + +### A challenger approaches! + +### Prepare to face my skill! + +### I've mastered the blade for decades! + +### I'm invincible! + +### Nyah! What was that!? + +### Your spells won't hurt me. + +### Magic? That's... + +### Stupid tricks won't work on me! + +### Praying won't help you~ + +### That's not yours you know~ + +### Nyah! You'll pay for that! + +### An escapee? I'm on it. + +### Come here you~ + +### Checkmate~ + +### Nya~! No fair... + +### Aren't you a little out of your league? + +### I'll get you next time! + +### Nice one! It won't work twice! + +### *smiles* It's okay, you tried~ + +### *CLANG* En garde! + +### It looks like I've won~ + +### Nyah~! + +### What's this, nya? + +### Let's make it a bit tighter, shall we? + +### They call me PTRN, the legendary blademaster! + +### I'LL take it from here. + +### It's me you should worry about! + +### Pfft. Amateurs. + +### Did you think I wasn't looking? + +### Nice try, girl~ + +### You've made a mistake attacking my client. + +### Capture her? Fine, but I expect payment. + +### I just follow the money, miss~ + +### Can't let you have all the fun, can I? + + + + + +### Time for SPL! + +### *tsk* + +### Let's play all night! + +### We can take our time. + +### I bet you won't last long! + +### You won't be getting out tonight! + +### I found my new pet for the day! + +### Not a clock? Useless! + +### It's not time to go. + +### Why are you attacking me this time? + +### I'll make this quick. + +### I've mastered this spell last night! + +### Hey! No getting out before midnight! + +### Let's dance under the moonlight. + +### Do you have time to take it back? + +### I can do this all day! + +### It's only a matter of time before I get you. + +### It's too bright here... + +### It seems you have nyctalopia... + +### It's time for you to give up. + +### Give me a moment~ + +### Give me your watch! + +### Here's a clock without the 'C'. + +### Hello stranger. Do you know what time it is? + +### This'll be over in an instant. + +### Time to wrap this up. + +### Playtime's over! + +### Hold on a minute! + +### Tick tock, what a shock... + +### Time for me to intervene... + +### Don't balk! Your time was up anyways~ + + + +### Calling in a SPL! + +### A-assistance required! + +You'll have to try harder if you want to discipline me, ma'am. +Tendrá que esforzarse más si quiere disciplinarme, señora. +I... don't have time for training right now, ma'am... +Yo... no tengo tiempo para entrenar en este momento, señora... +Did I do something wrong? +¿Hice algo mal? +So you're the new boss, huh? +Así que eres el nuevo jefe, ¿eh? +Time for some 'training?' +¿Tiempo para un poco de 'entrenamiento?' +Wanna to have a chat? +¿Quieres tener una charla? +Looks like you've had too much time to yourself. +Parece que has tenido demasiado tiempo para ti. +Why don't you come with me for a sec? +¿Por qué no vienes conmigo un segundo? +Let me see your ID... +Déjame ver tu identificación... +You have the right to remain silent. +Usted tiene derecho a permanecer en silencio. +### Let's have a chat. + +Who set you loose? +¿Quién te soltó? +I'll be confiscating that. +Confiscaré eso. +Aye, you're gonna need clearance for that, missy. +Sí, necesitará autorización para eso, señorita. +### Halt! + +You just made a big mistake. +Acabas de cometer un gran error. +Need backup! +¡Necesita respaldo! +You're under arrest! +¡Estas bajo arresto! +Magic use is restricted pursuant to IDC section 3 article 21a. +El uso de magia está restringido de conformidad con IDC sección 3 artículo 21a. +Magic? That's where I draw the line. +¿Magia? Ahí es donde trazo la línea. +I've got an extra comfy cell for mages. +Tengo una celda extra cómoda para magos. +That's off limits for you! +¡Eso está fuera de los límites para ti! +Resorting to petty theft? How crude. +¿Recurriendo al hurto? Que crudo. +The goddesses have property rights too, you know. +Las diosas también tienen derechos de propiedad, ya sabes. +I'm gonna ask you to turn yourself in. +Voy a pedirte que te entregues. +Keep your hands where I can see 'em. +Mantenga sus manos donde pueda verlas. +That's a weapons violation. +Eso es una violación de armas. +Assaulting an officer is a crime! +¡Agredir a un oficial es un crimen! +You're coming with me. +vienes conmigo +Resisting arrest won't get you anywhere. +Resistirse al arresto no te llevará a ninguna parte. +Is that all you got? +¿Eso es todo lo que tienes? +Hands behind your back. +Manos detrás de la espalda. +I will conduct a more thorough search later on. +Más adelante realizaré una búsqueda más exhaustiva. +Suspect is secure. +El sospechoso está seguro. +### Officer PTRN, reporting for duty! + +### Halt! You're under arrest! + +### You seeing what I'm seeing? + +### I'll have to finish my donut later... + +### Backup is here! + +### Hands up! Don't move! + +### Lay down your weapons and don't move! + +### I have a warrant for your arrest... + +### You're a wanted girl. + +### You're under arrest. + +### Backup has arrived. + +### Requesting backup! + +### Calling in a blockade! + + + +### Hidden technique: SPL! + +### I practiced a thousand times... for this!? + +I'm not hiding anything, if you know what I mean... +No escondo nada, si sabes a lo que me refiero... +Who are you looking for? Me? +¿A quién estás buscando? ¿A mí? +So... wanna hang out? +Entonces... ¿quieres pasar el rato? +It's not like I... LIKE you or something... +No es como si... ME GUSTAS o algo así... +I'm not following you! I'm just... +¡Yo no te entiendo! Sólo soy... +You look suspicious. +Pareces sospechoso. +You've got a nice pair of wrists~ +Tienes un buen par de muñecas~ +You there! Let's have a talk. +¡Tú allí! Tengamos una charla. +Looks like you're rusty. Haven't you ever done escape training? +Parece que estás oxidado. ¿Nunca has hecho entrenamiento de escape? +I'm going to have some fun with you~ +Voy a divertirme contigo~ +Watch yourself, girl~ +Cuídate, chica~ +Nice find. I'll take it. +Buen hallazgo Me lo llevo. +This place is off-limits for you. +Este lugar está prohibido para ti. +### Target is in my sights. + +Let's see how you like my special move! +¡A ver si te gusta mi movimiento especial! +That's nothing compared to my technique! +¡Eso no es nada comparado con mi técnica! +You're in for it now! +¡Estás listo ahora! +It's time for a display of skill! +¡Es hora de una demostración de habilidad! +Fancy tricks? That's nothing. +¿Trucos elegantes? Eso no es nada. +Let me show you a real move... +Déjame mostrarte un movimiento real... +True skill comes from the heart. Not something you hold in your hand. +La verdadera habilidad viene del corazón. No es algo que tienes en la mano. +She's not going to be happy about that... +Ella no va a estar feliz por eso... +Stop right there, criminal scum! +¡Detente justo ahí, escoria criminal! +Do you know what you've just done? +¿Sabes lo que acabas de hacer? +Finally, I've tracked you down! +¡Finalmente, te he rastreado! +It's over. I've already won. +Se acabó. ya he ganado +Wrong move, buddy. +Movimiento equivocado, amigo. +I can't believe it... +no puedo creerlo... +You're too slow. +Eres muy lento. +...she's fast. +... ella es rápida. +### ...she's strong. + +This battle is over. +Esta batalla ha terminado. +Too slow! +¡Demasiado lento! +I'll be taking that. +Tomaré eso. +There's no way out. +No hay manera de salir. +### The name's PTRN. Don't forget it. + +### There's a juicy bounty on your head and I want it! + +### Hmph. This battle is already over. + +### Time for some target practice. + +### Didn't expect me, did ya? + +### Boo! Ha, scared ya~ + +### What, did you think I'd just stand here? + +### There's a bounty on your head, miss. + +### I won't let you get away. That bounty is mine. + +### Didn't expect me to show up, did you? + +### Need backup? + +### Time for a test of skill. + +### I'll get you! Eventually... + + + +### Let's see how you like my SPL! + +### Wait, wrong button! Aaahh~ + +Hey~! Let's have a talk. +¡Hola~! Tengamos una charla. +Looks like you need additional training. +Parece que necesita capacitación adicional. +### I spy a cute one! + +Bad pet! +¡Mala mascota! Looks like you're gonna need the extra special treatment~ Parece que vas a necesitar un tratamiento extra especial~ Now you've done it! @@ -12216,8 +15470,6 @@ Stop right there! ¡Alto ahí! It'll take you quite a while to pay off those damages! ¡Te llevará bastante tiempo pagar esos daños! -Finally, I've tracked you down! -¡Finalmente, te he rastreado! Now there, good girl! Ahora ahí, ¡buena chica! Wrong move! @@ -12228,24 +15480,80 @@ Get your paws off me! *se burla* Podría usar algo de trabajo~ Such speed! ¡Qué velocidad! -Nothing personal. -Nada personal. -This battle is over. -Esta batalla ha terminado. -Get over here! -¡Ven aquí! -Too slow! -¡Demasiado lento! -I'll be taking that. -Tomaré eso. -There's no way out. -No hay manera de salir. +### Clever! + +### PTRN, Nevermere associate. Here's my card. + +### I run a legitimate business, I promise! + +### Is it the tax collectors? Oh, no, it's just you... + +### Looks like you landed on the wrong side of the coin~ + +### A deal's a deal, my friend. + +### Excuse me, you just attacked my client. + +### Hey! We were just talking! No sketchy underground dealings, nope. + +### I'll help capture her! For a 50% share that is~ + +### We deal in the finest products... like you, if you catch my drift~ + +### I smell a shady business opportunity~ + +### *growls menacingly* + +### Let's make this fun~ + +### What's that about backup? + + + +### Wait no, wrong button! + +### Catch me. If you can, that is. + +### I double dare you. + +### Weren't you chasing me? + +### I've got somethin nice for ya. + +### Be a good girl for me, will ya? + +### You need to show some restraint. + +### Stay where you belong, you naughty girl. + +### Let's go somewhere more private. + +### Ready or not, here I come. + +### Those sticky fingers belong in a pair of mittens. + +### All units. Apprehend convict with extreme prejudice. + +### You're going nowhere. + +### Come on. This wasn't your only weapon, was it? + +### A tank, huh. + +### Mine now. + +### Just keeping you safe from yourself. + +### SPL, sing to me! + +### SPL, listen to me... + An outsider! ¡Un forastero! Hide! ¡Esconder! -Do not pursue me! -¡No me persigas! +### I have done nothing worthy of punishment! + I have come to study human customs. Teach me about Domination. He venido a estudiar las costumbres humanas. Enséñame sobre Dominación. The outsiders have such... strange and interesting practices. @@ -12268,6 +15576,8 @@ Give back what you take. Devuelve lo que tomas. You must remain here. Debes quedarte aquí. +### Trespasser! + Resorting to violence? ¿Recurrir a la violencia? Let us clash swords! @@ -12308,102 +15618,100 @@ You will come with me. Vendrás conmigo. I regret to inform you that your battle ends here. Lamento informarte que tu batalla termina aquí. -You won't be needing that. -No necesitarás eso. -There we go. -Aquí vamos. -I don't like the way you're looking at me! -¡No me gusta la forma en que me miras! -Yes, I've got the secrets of nature right here... -Sí, aquí tengo los secretos de la naturaleza... -Why don't you come after me? -¿Por qué no vienes tras de mí? -Why don't you teach me your... magic? -¿Por qué no me enseñas tu... magia? -Guarding nature is a chore. Why don't we relax~ -Cuidar la naturaleza es una tarea. ¿Por qué no nos relajamos? -Got something in mind for me? -¿Tienes algo en mente para mí? -Well met, outsider! -Bien conocido, forastero! -You look so... bland. -Te ves tan... soso. -Outsiders are so picky about what they wear... -Los forasteros son tan exigentes con lo que visten... -Tight and secure, as all things should be. -Apretado y seguro, como deberían ser todas las cosas. -I have just the thing in mind for you... -Tengo lo justo en mente para ti... -Let us put those hands away... -Quitemos esas manos... -Give back what you take. -Devuelve lo que tomas. -You must remain here. -Debes quedarte aquí. -Resorting to violence? -¿Recurrir a la violencia? -Let us clash swords! -¡Choquemos espadas! -*scoffs* -*se burla* -You have brought judgement upon youself. -Has traído juicio sobre ti mismo. -Your magic is that of a child. -Tu magia es la de un niño. -Imagine what you could learn in twelve lifetimes... -Imagina lo que podrías aprender en doce vidas... -You rely on cheap gadgets. -Confías en aparatos baratos. -Do not defile the ancients. -No profanéis a los antiguos. -Give that back! -¡Devuélveme eso! -The ancients are appalled. -Los antiguos están horrorizados. -The outsider has escaped! -¡El forastero ha escapado! -Ready to reconsider? -¿Listo para reconsiderar? -A classic blunder. -Un error clásico. -You will regret that, outsider. -Te arrepentirás de eso, forastero. -You get what you deserve. -Tienes lo que te mereces. -You didn't see that. -No viste eso. -It looks like my skills are superior. -Parece que mis habilidades son superiores. -I will show you your place, outsider. -Te mostraré tu lugar, forastero. -You will come with me. -Vendrás conmigo. -I regret to inform you that your battle ends here. -Lamento informarte que tu batalla termina aquí. -You won't be needing that. -No necesitarás eso. There we go. Aquí vamos. -Bug -Bicho -Bug -Bicho -Bug -Bicho -This is a bug, please report -Esto es un error, por favor informe -This is a bug, please report -Esto es un error, por favor informe -This is a bug, please report -Esto es un error, por favor informe +### You stand before PTRN, blessed by the Goddess Ninril. + +### By the Four... + +### I shall put an end to this. + +### I swear I will capture her! + +### Nature compels me to intervene! + +### I shall protect every one of the Goddess' creations. + +### Justice shall be had! + +### I shall defend you from this outsider! + +### The outsider betrays our ally! + +### You have faltered in your ways. I shall correct that! + +### Truly concerning. + +### You leave me no choice. + +### I stand firm. + + + +### Behold, SPL. + +### Y-your fate has been postponed... briefly. + +### You look cute in that, you should lose the rest though! + + + +I don't like the way you're looking at me! +¡No me gusta la forma en que me miras! +Yes, I've got the secrets of nature right here... +Sí, aquí tengo los secretos de la naturaleza... +Why don't you come after me? +¿Por qué no vienes tras de mí? +Why don't you teach me your... magic? +¿Por qué no me enseñas tu... magia? +Guarding nature is a chore. Why don't we relax~ +Cuidar la naturaleza es una tarea. ¿Por qué no nos relajamos? +Got something in mind for me? +¿Tienes algo en mente para mí? +Well met, outsider! +Bien conocido, forastero! +### Intruder! + +### My name? Uh... let's go with PTRN. + +### You will not get away with this, outsider! + +### You shall pay with your freedom. + +### Ninril demands justice. + +### Nature calls me! + +### I hear the little creatures crying out! + +### Such betrayal! + +### Nature guides us! + +### Nature protects those who are worthy! + +### I share the will of the Goddess! + +### They won't get away with this! + +### Face my wrath! + +### Nature protects! + + + +### Run away! + +### Run! + +### Scary! + Girl! ¡Chica! Wear this! ¡Usa esto! Come here! ¡Ven aquí! -... -... Capture... Captura... Need tighten! @@ -12424,8 +15732,6 @@ Wizard! ¡Mago! Forbidden! ¡Prohibido! -Forbidden! -¡Prohibido! Defiler! Desafíos! Confiscate!!! @@ -12436,26 +15742,148 @@ Intruder escape! ¡Escape del intruso! Stay! ¡Permanecer! -Got you! -¡Te tengo! Pain... Dolor... -Fight! -¡Luchar! Come back! ¡Regresar! +Stop! +¡Detener! Missed! ¡Omitido! Capture!!! ¡¡¡Captura!!! -Come here! -¡Ven aquí! Got her!!! ¡La tengo! Take! ¡Llevar! Secure! ¡Seguro! +### Greetings Madame, you may call me PTRN. + +### Defend! + +### Protect! + +### Rawr! + + + +### SPL! Now my wrath is revealed! + +### Wh-what happened? What weakness has infiltrated Myrtrice? + +### You will loose me or burn eternal!!! + +### ... This shame is unbearable! Oh sister!!! + +### Oh! Mytrice is caught! My ambitions laid to ruin! + +### The winds of retribution carry me elsewhere... + +### Myrtrice will come for you shortly! Consider yourself fortunate... + +### I will retreat into darkness... + +### My sins are a multitude! I will submit to your judgements... + +### I do not ask for mercy for I have shown none! + +### You must punish me! I can't face my sister Myrtle until my debts are paid... + +### Your chest quivers... Do you fear me? + +### Is it that another moth has become enthralled to my fires bright? + +### Myrtrice entreats you! Remain still and let my adoring embers kiss your lips tender... + +### To struggle is to invite searing coals upon your head! + +### I will drag you into the dark and you will witness my projects! + +### To escape is only to delay! My fires consume ALL! + +### Dusty trinkets... Your scrapping around is an insolence! + +### You would scorn the memory of my sister with escape?! + +### Careless of you to appear before Myrtrice like this! + +### Your attempts are trivial! + +### You invite wrath!!! + +### Pathetic!!! + +### Such hapless casting scorns the memory of my sister! + +### Your magics will be swallowed up by hellfire!!! + +### Myrtrice is subject to no magic!!! + +### Items? How exceptionally talentless... + +### That shrine scorns the memory of my sister! I hate it! + +### True power doesn't come from old rickety crates... + +### Orbs? What a gruesome display of weakness! True power comes from the self! + +### YOU SCORN THE MEMORY OF MY LATE SISTER!!! + +### This is where you will remain until Myrtrice wills otherwise! + +### This is what you were gripping so tightly in your hands? + +### WHAT ABBORANCE! You will pay for that... + +### SEAR ETERNAL! + +### I, Myrtrice, missed?! + +### No one resists Myrtrice! How irritating!!! + +### Your failures do not surprise Myrtrice! + +### Your pathetic attempts scorn the memory of my sister! + +### The curtains of my revenge are drawn! You will follow me... + +### You will come with Myrtrice!!! + +### Be dazed by the radiant brilliance of my hellfires! + +### I will repay the theif with brutal reprisal... + +### Your fate is sealed! ... Myrtle this is for you, sister! + +### All creatures are subject to Myrtrice! It is the price of their insolence... + +### You make a grave mistake ignoring me!!! + +### Your eyes belong here! With Myrtrice!!! + +### The ones who turn their backs on Myrtrice SEAR IN HELLFIRE! + +### What a hideous display!!! Where is your honor? + +### It is this kind of petulant insolence that tarnishes the memory of my sister! + +### You are a blight! My sister Myrtle would never stand for this!!! + +### THE CURTAINS OF MY REVENGE DRAW OPEN WIDE! + +### What an excellent oppertunity to expand my alters in the dark! + +### I see a chalice before me... it drips with shadow and overflows with darkness! + +### My late sister Myrtle was a much more proficent defender than I... Oh how I long for her *sob* + +### THE PATH OF MY RETRIBUTION IS PAVED WITH BRIMSTONE AND BATHED IN BLAZING HELLFIRE! BURN! + +### I, Myrtrice, will resist their insolent fusilades! + +### This mind is altered... + So this is what it's like... Así es como es... I believe I am feeling an emotion called 'fear.' @@ -12484,6 +15912,8 @@ Do not take what is not yours. No tomes lo que no es tuyo. You will not escape. No escaparás. +### We see you... + Our ways are ancient! ¡Nuestros caminos son antiguos! Your weapons are toys to us! @@ -12516,18 +15946,46 @@ I have you now, surface-dweller. Te tengo ahora, habitante de la superficie. You are a fast one. Eres rápido. +### You are a tricky one. + You seem out of practice. Pareces fuera de práctica. I will take you to your place. Te llevaré a tu lugar. Come. Venir. -Stay down. -Quédate abajo. I will take this. Tomaré este. -You will not escape. -No escaparás. +### We are PTRN. + +### The collective defends itself. + +### We are one. + +### Ow, that hurt! + +### We do not stand for this. + +### Do not attack our allies. + +### Our friends are in need. + +### You have been judged and found wanting. + +### We sense disarray. + +### We stand together. + +### We support each other. + +### You leave us no choice. + +### You cannot comprehend our tactics. + +### Nyah!!! *blushes* + +### Nyah! This is impossible! + Meow!!! ¡¡¡Maullar!!! No! This kitty did nothing wrong! @@ -12556,6 +16014,8 @@ Thanks for keeping things tidy. Gracias por mantener las cosas ordenadas. Where do you think you're going? ¿A dónde crees que vas? +### Who dares intrude on our sacred grounds? + By the blessed kitty! ¡Por el bendito gatito! Show us what you got! @@ -12574,8 +16034,6 @@ Pay your respects some other way. Presenta tus respetos de otra manera. Tomb robber! ¡Ladrón de tumbas! -By the blessed kitty! -¡Por el bendito gatito! Don't you want the blessing? ¿No quieres la bendición? Come here~ @@ -12592,14 +16050,46 @@ I have catlike reflexes! ¡Tengo reflejos de gato! Let me show you the blessing... Déjame mostrarte la bendición... -Come along. -Venir también. *grins* *sonríe* You won't be needing this. No necesitarás esto. Quit struggling~ Deja de luchar~ +### My true name is unpronouncible in your tongue. But you may call me PTRN. + +### She brings curses! + +### An intruder confronts us! + +### Your fate is already sealed~ + +### I will defend you! + +### I'll stop her! + +### I won't let you touch her! + +### Nya! Need some help friends? + +### We're in this together! + +### I think you could use some help against this adventurer~ + +### Let's get them! + +### Let's play cat and mouse~ + +### You cannot resist my SPL. + +### You merely prolong the inevitable! + +### This... this can't be... + +### Release me mortal! + +### How did you do this!? + Gasp! An adventurer! ¡Jadear! ¡Un aventurero! Don't let her catch you! @@ -12620,58 +16110,244 @@ You'd look great in my palace. Te verías genial en mi palacio. Are we having fun? ¿Nos estamos divirtiendo? -Get over here! -¡Ven aquí! Humans like you make great toys. Los humanos como tú hacen grandes juguetes. That won't help you. Eso no te ayudará. You won't escape. No escaparás. +### I will take you for myself! + Such feeble attempts. Tales intentos débiles. Humans are fun to play with. Es divertido jugar con los humanos. Toying with me? I shall oblige! jugando conmigo? ¡Obligaré! +### Cast your last pathetic spell, mortal. + +### Your mere attempt at magic insults me. + +### Do you really think that will stop me? + +Look what humans need to match only a fraction of our power! +¡Mira lo que los humanos necesitamos para igualar solo una fracción de nuestro poder! +Our goddess doesn't need to listen to the likes of you! +¡Nuestra diosa no necesita escuchar a gente como tú! +Keep your hands out of our possessions. +Mantenga sus manos fuera de nuestras posesiones. +Defiler! You will pay for your crimes! +¡Profanador! ¡Pagarás por tus crímenes! +A game of chase? Fun. +¿Un juego de persecución? Divertido. +You're staying right here... +Te quedas aquí... +Get your hands off me! +¡Quítame las manos de encima! +Pathetic. +Patético. +It's over, human. You've lost. +Se acabó, humano. Has perdido. +There is no escape. +No hay escapatoria. +You are beneath me. +Estás debajo de mí. +Nice gear. I'll take it. +Buen equipo. Me lo llevo. +Try getting out of that! +¡Intenta salir de eso! +### Who am I? You beings may call me PTRN. + +### She thinks she can beat us~ + +### No one will save you. + +### Come and accept your fate. + +### An unruly subject. She needs training. + +### You should consider your actions and their consequences~ + +### Now now, a mortal should know her place! + +### Why don't we turn the tables? + +### It'll be fun seeing you squirm~ + +### We are the keepers of balance. + +### Do not mess with us! + +### I shall take you for myself~ + +### You are no match for my SPL! + +### That wasn't supposed to happen. + +### You won't get me! + +### Nice try! + +### My grandma is tougher than you! + +### Restrain me. + +### Play with me. + +### Lock me up. + +### This won't work. + +### I don't play with young ones. + +### Oh, a lost toy! + +### Ouch! + +### I am stronger than that! + +### That hurts! + +### Nice party trick! + +### Oh, shiny! + +### You won't get away! + +### You can't get away! + +### You are helpless now! + +### Tis but a scratch! + +### Give up! + +### Are you hiding?! + +### You are my pet now! + +### Yoink! + +### You can't get out now! + +### Ah... my SPL... + +### I will be free... even if it takes me a thousand years! + +### Release me you pathetic creature! + +### I will not be contained! + +### Oh no, whatever shall I do! + +### I will be back, mortal! + +### You will never trap me! + +### I yearn for a challenging puzzle! + +### Show me your strongest restraints! + +### I could probably escape anything. + +### Come here my plaything~ + +### Mortals are my favorite toy. + +### It's more fun when you resist! + +### Know your place, mortal~ + +### I will bring you to my lair~ + +### Mortals shouldn't have too much freedom~ + +### Mortals should keep their hands to themselves~ + +### Yes, yes, run away! + +### I like your fighting spirit! + +### You may be weak, but this is quite entertaining~ + +### Dragons are the true heirs of magic. + +### Your magic was stolen from us! + +### This world is ours! OURS! + +### Look what you need to match only a fraction of my power! + +### My treasure! + +### Now is my opportunity! I will have you for myself~ + +### So weak! + +### I have you now~ + +Not so fast~ +No tan rápido~ +### Can't handle it? + +### Ooh shiny! + +### Now you're mine! + +### Bow before me, for I am PTRN! + +### A mortal can't stop us! + +### No one will save you, mortal. + +### I will stop her! + +### Bow down before our might! + +### Dragons are the true rulers of this world! + +### We were destined for greatness until you came along! + +### We are the the true heirs of magic! + +### Hehe~ + +### *chuckles* + +### By the power of SPL! + +### I have failed! + +### Oh no, it's an adventurer! + +### They've come for me! + +### It wasn't my fault! + +### Ready for service! + +### I was sent here to... accompany you, yes! + +### How may I assist you? + +### Do my eyes deceive me, or do I see a sinner? + +### My job is to punish mortals~ + +### Would you hold still? I need to... check something~ + Cast your last pathetic spell, human. Lanza tu último hechizo patético, humano. Your magic is weak, human. Tu magia es débil, humano. It tickles, hehe! Hace cosquillas, jeje! -Look what humans need to match only a fraction of our power! -¡Mira lo que los humanos necesitamos para igualar solo una fracción de nuestro poder! -Our goddess doesn't need to listen to the likes of you! -¡Nuestra diosa no necesita escuchar a gente como tú! -Keep your hands out of our possessions. -Mantenga sus manos fuera de nuestras posesiones. -Defiler! You will pay for your crimes! -¡Profanador! ¡Pagarás por tus crímenes! -A game of chase? Fun. -¿Un juego de persecución? Divertido. -You're staying right here... -Te quedas aquí... -Hah! -¡Ja! -Get your hands off me! -¡Quítame las manos de encima! -Pathetic. -Patético. -You're a fast one. -Eres rápido. -Such feeble attempts. -Tales intentos débiles. -It's over, human. You've lost. -Se acabó, humano. Has perdido. -There is no escape. -No hay escapatoria. -You are beneath me. -Estás debajo de mí. -Nice gear. I'll take it. -Buen equipo. Me lo llevo. -Try getting out of that! -¡Intenta salir de eso! + + +### Let's see you face my SPL~ + +### You won't escape my SPL that easily! + Not the edging training! Anything but that! ¡No el entrenamiento de bordes! ¡Todo menos eso! Forgive me! @@ -12700,6 +16376,8 @@ Good girl. I'll take that to the storage room. Buena niña. Llevaré eso a la sala de almacenamiento. I'll be taking those. Me los llevaré. +### Who the hell are you? + Oh, you're approaching me? Oh, ¿te estás acercando a mí? You've gotten yourself into a big mess. @@ -12720,8 +16398,6 @@ Thief! Get her! ¡Ladrón! ¡Consíguela! Yikes! I'm calling backup! ¡Ay! ¡Llamo refuerzos! -Found you! -¡Te encontré! Hold still~ Quédate quieto ~ Your tricks won't work on me. @@ -12736,14 +16412,36 @@ You missed! ¡Te lo perdiste! I'll hand you over when I'm done with you. Te entregaré cuando termine contigo. -Get over here! -¡Ven aquí! Hmph. Stay down. Hmph. Quédate abajo. Give me that. Dame ese. -'Click!' -'¡Hacer clic!' +### Mistress PTRN, reporting for duty. + +### No time to waste. + +### Looks like the reports are correct. Stop her! + +### Moving in to assist. + +### You need to be taught a lesson, adventurer. + +### We have a mutual protection contract. Suffice to say, you've violated it. + +### We defend our partners, unlike some people. + +### Target sighted. Taking her down. + +### Our influence is everywhere~ + +### We have orders to stop you! + +### You really think you're special, huh? + +### Combat formation bravo. + +### Ah! Forgive me! + I'm sorry! I didn't mean to break that vase! ¡Lo lamento! ¡No fue mi intención romper ese jarrón! I won't do it again, I swear! @@ -12772,18 +16470,16 @@ Thanks for picking up. Gracias por recoger I'll take those to the head maid! ¡Le llevaré esos a la doncella principal! +### Someone help! + Who are you!? ¿¡Quién eres!? Oh no! ¡Oh, no! -Stop! -¡Detener! Miss! You're not allowed to cast that! ¡Extrañar! ¡No tienes permitido lanzar eso! Miss, I have to report that! ¡Señorita, tengo que informar de eso! -Magic! -¡Magia! Eeep! ¡Eeep! Miss, that's reserved for the head maid! @@ -12792,12 +16488,8 @@ Thief! I'm reporting this! ¡Ladrón! Estoy reportando esto! Oh no! I have to report this! ¡Oh, no! ¡Tengo que reportar esto! -Oh no! -¡Oh, no! I got you! I got you! ¡Te entendí! ¡Te entendí! -Try that again! -¡Inténtalo de nuevo! Remember your training, remember your training... Recuerda tu entrenamiento, recuerda tu entrenamiento... You're filthy! @@ -12810,12 +16502,80 @@ I'll lead you to your cell... Te llevaré a tu celda... Come on! ¡Vamos! -Got you! -¡Te tengo! I need to take this... necesito tomar esto... I'm sorry... Lo lamento... +### *Salutes* PTRN reporting for service! + +### I'll help! + +### Stop her! + +### Please be gentle! + +### Ahhh! Stop it! + +### Don't touch her! + +### Wait, you can't do that! + +### Me? Help? Right! + +### I'm sorry miss... + +### I was ordered to capture you... please don't resist. + +### I-I'm coming! + +### Please surrender, miss! + +### I'll just stay here! + +### Loading SPL! + +### Blast... this thing always jams. + +### That thing... it scares me. + +### Please no! I don't want the pleasure training again! + +### Say hello to my little friend! + +### This is where I'd apply my melee training... if I had any! + +### Step back a bit, this isn't fair! + +### Oh yeah? Two can play at that game! + +### Don't bring magic to a gunfight! + +### Didn't think this through, did you? + +### Grenade!!! + +### What's this 'melee' you speak of? + +### What terrible aim! + +### I am bulletproof! + +### Marksman PTRN reporting for service! + +### Opening fire! + +### I'll cover you! + +### Providing cover fire! + +### Cover me, I'm going in! + +### Commence overwatch! + +### Submit to my SPL. + +### Ack! How inelegant! + I'll be heading out... estaré saliendo... Looks like I'll be taking my leave. @@ -12844,6 +16604,8 @@ Good girl, finding lost items. Buena chica, encontrando objetos perdidos. I do not give you permmission to leave. No te doy permiso para salir. +### Seems I will have to get my hands dirty. + Do you know who I am? ¿Sabes quién soy? You need to learn some manners! @@ -12860,8 +16622,6 @@ Do not use what belongs to others. No uses lo que es de otros. A good maid pleads only to her mistress. Una buena doncella suplica sólo a su ama. -Do not take what is not yours. -No tomes lo que no es tuyo. I will personally attend to your act of disgrace. Asistiré personalmente a su acto de desgracia. An unruly pest. @@ -12884,10 +16644,36 @@ Amateur. Aficionado. Bad girl. You need discipline. Chica mala. Necesitas disciplina. -Hand it over. -Entrégalo. I'll be keeping the keys. Me quedaré con las llaves. +### Hmm. You may call me Head Maid PTRN. + +### Looks like we have a guest. + +### I'll be gentle, I promise~ + +### Know your place, dear~ + +### Good girls keep their hands to themselves. + +### You broke the rules, now you'll face the consequences. + +### Hands off our partners. + +### Looks like you've made a few enemies along the way. + +### I won't let you interrupt our plans. + +### Excuse me, we were holding a meeting~ + +### Don't get ahead of yourself. + +### I'll do this myself. + +### I'll support from the rear. + +### Whoops! That wasn't supposed to happen... + Looks like I've earned some punishment... Parece que me he ganado un castigo... I'll turn you into a newt! If you don't stop me... @@ -12916,6 +16702,8 @@ Must have misplaced it... Debe haberlo perdido... Those are mine! ¡Esos son míos! +### Well well, what do we have here? + That's not very nice! ¡Eso no es muy agradable! Curse you! @@ -12928,38 +16716,112 @@ Snap, crackle, and pop! ¡Chasquea, cruje y explota! Looks like I need to seal that foul mouth of yours. Parece que necesito sellar esa sucia boca tuya. -I recognize that thing you're holding! -¡Reconozco esa cosa que estás sosteniendo! +### Put that toy away~ + You'll be praying for freedom soon, my dear~ Pronto estarás rezando por la libertad, querida~ Oh, breaking into my collection, are you? Oh, irrumpiendo en mi colección, ¿verdad? Even I wouldn't do such a thing! ¡Incluso yo no haría tal cosa! -Witch way to the jail cell, you say? +Witch way to the jail, you say? ¿Camino de brujas a la celda de la cárcel, dices? -Hold still~ -Quédate quieto ~ -Try that again! -¡Inténtalo de nuevo! Hands off! ¡Manos fuera! Now I got you. Ahora te tengo. -Hmph. -Hmph. +### Hmph. + You've got a lot to learn~ Tienes mucho que aprender ~ You'll be coming with me! ¡Vendrás conmigo! I'll be yanking your chain~ Estaré tirando de tu cadena~ -Not so fast~ -No tan rápido~ I'll be taking this~ Tomaré esto ~ -EnemyName:There, nice and tight dear~ -EnemyName:Ahí, agradable y fuerte querida~ +### There, nice and tight dear~ + +### I am the great witch PTRN! + +### Noooo Fred! *grumble* you'll pay for this! + +### Where is that apprentice when you need her... + +I don't have time for this. +No tengo tiempo para esto. +### Be still, worm. + +### Hands off~! + +### Would you like a taste? + +### Looks like I've found my test subject~ + +### Another test subject! + +### I want her! + +### She's a cute one! + +### Oh no you don't? + +### I'll make you my pet! + +### Tsk tsk, you won't get away! + +### I cast SPL! No, wait... + +### You're just too cute... let me play with you a bit! + +### Come, come closer! I'll be gentle~ + +### Ooh, you just HAVE to be mine! + +### Come, come!... no, not like that. Well, MAYBE like that. + +### My GOODNESS, you're adorable!... c'mere~! + +### You wouldn't happen to be... ticklish? + +### Hold still! I promise it'll be fun. + +### Too much chanting, not enough giggling... let's fix that! + +### What's that? 'Gag me, please'? Gladly! + +### A cute captive AND a spellbook to study? Is it Christmas already?! + +### He~ey, that was mine! + +### Going somewhere, are we? + +### No, I like you right where you are. + +### Goodness, look at you squirm... + +### Oh!... my, you're slippery! + +### Not close enough! + +### My, my, you look too cute in that... + +### I am Stela. But to you, sweetie? Call me Mistress. + +### My FROG!... suppose I need a new familiar... *eyes you with interest* + +### Come closer, I'll be gentle~ + +### Why don't we have a little talk~ + +### My, my, you look too cute... + +### I like you. I'll save you a spot at home~ + +### I cast, umm, SPL! + +### I cast Silence! No, wait-- + I promise I'll be back later! ¡Te prometo que volveré más tarde! I didn't do anything wrong! @@ -12988,8 +16850,8 @@ Hey, uh, give that back... (blushes) Oye, uh, devuélveme eso... (se sonroja) Um, you have to return those! ¡Um, tienes que devolverlos! -Eeep! -¡Eeep! +### Um! You're not supposed to be here! + Help me! ¡Ayúdame! Somebody help! @@ -13028,10 +16890,36 @@ Come here please! ¡Ven aquí por favor! Hah! I'm a genius! ¡Ja! ¡Soy un genio! -I need to take this... -necesito tomar esto... I'm sorry about this... Lo siento por esto... +### Nice to meet you. I'm PTRN! + +### Don't hurt me! + +### I have classes to attend! + +### There goes my perfect attendance record... + +### What's going on!? + +### I'll save you, Mistress! + +### Me? Capture her? Okay mistress... + +### Okay miss, I'll do that... + +### But he's going to tie me up... + +### Be careful! + +### That's it! You made me mad! + +### I'll just... go. + +### Rise, my minions! + +### ...Hello? Can anyone hear me? + Sticks and stones may break my bones... but you'll never catch me! Los palos y las piedras pueden romper mis huesos... ¡pero nunca me atraparán! Got a bone to pick with me? @@ -13060,6 +16948,8 @@ You're getting under my skin... Te estás metiendo debajo de mi piel... Thought you were making a marrow escape, eh? Pensaste que estabas escapando tuétano, ¿eh? +### I've got a bone to pick with you~ + You numskull! ¡Eres un idiota! You've got a lot of spine to fight me! @@ -13082,10 +16972,6 @@ You're bad to the bone... Eres malo hasta los huesos... Looks like you're bone to be wild, eh? Parece que estás dispuesto a ser salvaje, ¿eh? -You're mine! -¡Eres mío! -Hah! -¡Ja! That'll leave a mark... Eso dejará una marca... You're mine now! @@ -13094,22 +16980,44 @@ Hold still you bonehead! ¡Quédate quieto, cabeza de chorlito! Hah! Such nerve... ¡Ja! Que nervio... -You're coming with me! -¡Vienes conmigo! -Get over here! -¡Ven aquí! -Not so slippery now! -¡Ya no es tan resbaladizo! -I'll be confiscating that. -Confiscaré eso. Make sure that's nice and tight... Asegúrate de que esté bien ajustado... +### Spirits whisper my name in hushed tones as I, PTRN, make my appearance! + +### My rule will last centuries... just watch! + +### I will find the answer, even if I die trying. Except I can't, haha! + +### I've got eyes on the back of my skull... + +### You are SO dead to me... + +### What did you just say to me? + +### That's my friend you bonehead! + +### Did you really think I wouldn't see through that? + +### *yawns* Alright alright... + +### Stand straight! + +### Why don't you bend the knee... + +### Who goes there? + +### SPL... + +### Can't... Move... + +### Tight... + +### This... is... fun... + Scary... Aterrador... Run... Away... Huir... -*Giggles* -*Risas* Play... with... me... Juega conmigo... Please... @@ -13126,8 +17034,8 @@ Mine... Mío... Shiny... Brillante... -*giggles* -*risitas* +Intruder... +Intruso... Brains... Sesos... Squishy... @@ -13150,22 +17058,24 @@ Defiler... Desafíos... Thief... Ladrón... -Intruder... -Intruso... Give... Hug... Dar abrazo... ...Hug... ...Abrazo... -Checkmate... -Mate... +### Got... you... + It's... Cold... Hace frío... Friend... Amigo... Come... Back... Regresar... -He... hee... -je... je... +### Why... Not... + +### Hee... + +### Ha... + ...Prisoner. ...Prisionero. ...Get over here... @@ -13176,6 +17086,26 @@ je... je... ...Brillante... ...Secure... ...Seguro... +### *Her burial cloth reads PTRN* + +### Get her... + +### Must... hug... + +### Come... back... + +### Stop... + +### Come... here... + +### Give... hugs... + +### Must... help... + +### Must... protect... + +### Save... friend... + The weapon requires power from an Ancient Crystal to function. El arma requiere poder de un Cristal Antiguo para funcionar. Target an enemy: Attack with Dragonslaver. Target a tile: Spend 8 charge to launch binding belts @@ -13188,50 +17118,58 @@ Apunta a un enemigo: Ataca con Dragonslaver. Apunta a un mosaico: gasta 8 de car 25 cargas para desarmar a un objetivo durante 8 turnos, dejándolos incapaces de atacar. 5 charge (+2.5 per charge) to channel and fire a beam that deals 30 + 3/charge electric damage, or 90 at max charge. 5 de carga (+2,5 por carga) para canalizar y disparar un rayo que inflige 30 + 3/carga de daño eléctrico, o 90 con la carga máxima. -5 charge to fire a blast that deals 25 electric damage. -5 de carga para disparar una ráfaga que inflige 25 de daño eléctrico. +### 10 charge to fire a blast that deals 25 electric damage. + 50 charge to fire an arrow that enrages a target. 50 cargas para disparar una flecha que enfurece a un objetivo. -50 charge to enter a frenzy for 10 turns, attacking twice per turn. -50 de carga para entrar en frenesí durante 10 turnos, atacando dos veces por turno. +### 50 charge: Free nearby allies and disrobe enemies, increasing charm damage by 100% and removing 100 armor. + Create a '+' shaped pool of slime that deals 35 glue damage per hit Crea un charco de baba en forma de '+' que inflige 35 de daño de pegamento por golpe Ignite torches and nearby objects Encender antorchas y objetos cercanos -Ignite torches and nearby objects -Encender antorchas y objetos cercanos -Ignite torches and nearby objects -Encender antorchas y objetos cercanos -Ignite torches and nearby objects -Encender antorchas y objetos cercanos -Toggles -Alterna +### Hit a cracked tile. If there is empty space or cracks on the opposite side, it breaks. + +### Preferences + +### Preferences 2 + Multiclass multiclase -Locks and Restraints -Cerraduras y Restricciones -General Combat -Combate General -Kinks and Preferences -Kinks y preferencias +### Game-Changing + +### Restriction + +### Training + +### Combat + +### Kinks + +### Senses + Damage and Resists Daño y Resiste -Wizardry and Sorcery -Hechicería y Hechicería -Devious Threats -Amenazas tortuosas +### Spell Components + +### Threats + World Generation Generación mundial Starting Scenario Escenario inicial Unlockable Desbloqueable + + You hand over your weapon reluctantly... Entregas tu arma de mala gana... + + (Leave) (Dejar) -(...) -(...) +### (...) + (The SPEAKER frowns)|Don't lie to me. (El SPEAKER frunce el ceño)|No me mientas. (The SPEAKER looks puzzled)|That doesn't seem right... @@ -13240,8 +17178,12 @@ Entregas tu arma de mala gana... (El SPEAKER se ríe)|Qué linda mentira. (The SPEAKER beeps)|Vital signs indicate dishonesty. (El SPEAKER emite un pitido)|Los signos vitales indican deshonestidad. + + (The SPEAKER furrows her brow)|...Excuse me? (La SPEAKER frunce el ceño)|...¿Disculpe? + + (The SPEAKER tilts her head)|Right, sorry. (La SPEAKER inclina la cabeza)|Cierto, lo siento. (The SPEAKER blushes deeply)|I'm... I'm sorry! Please carry on... @@ -13250,6 +17192,8 @@ Entregas tu arma de mala gana... (El SPEAKER sonríe)|Sigue así, niña. (The SPEAKER beeps)|Vital signs indicate honesty. Carry on. (El SPEAKER suena)|Signos vitales indican honestidad. Continuar. + + (The SPEAKER smiles)|Good girl. (El SPEAKER sonríe)|Buena chica. (The SPEAKER smiles)|That's a good girl. @@ -13258,18 +17202,30 @@ Entregas tu arma de mala gana... (El SPEAKER sonríe)|Gracias. (The SPEAKER beeps)|Thank you for complying. (El SPEAKER emite un pitido)|Gracias por cumplir. + + (The SPEAKER frowns)|Looks like you'll need to be punished. Get her! (El SPEAKER frunce el ceño)|Parece que tendrás que ser castigado. ¡Consíguela! (The SPEAKER looks Embarrassed)|Then... then... uh... someone stop her! (La SPEAKER parece avergonzada)|Entonces... entonces... uh... ¡que alguien la detenga! (The SPEAKER grins)|Then allow me to personally show you the rules. (El SPEAKER sonríe)|Entonces permítame mostrarle personalmente las reglas. +### (The SPEAKER cracks her knuckles)|Finally, I get to have some fun~ + (The SPEAKER beeps)|Subject is resisting. Begin capture protocol. (El SPEAKER emite un pitido)|El sujeto se resiste. Comience el protocolo de captura. + + (The SPEAKER calls at you)|You're not supposed to be carrying a weapon.|Hand it over. (El SPEAKER te llama) | Se supone que no debes llevar un arma. | Entrégala. (The SPEAKER approaches you)|Contraband detected. Initiating confiscation.|Please comply. (El SPEAKER se acerca a usted)|Contrabando detectado. Iniciando confiscación.|Por favor cumpla. +### (The SPEAKER blushes)|Umm, miss, I see that you have a weapon there,|could you maybe hand it over? + +### (The SPEAKER smiles at you)|Be a good girl and hand that weapon over,|would you? + +### (The SPEAKER grins and cracks her knuckles)|Are you planning to fight anybody with that?|Or are you gonna hand it over? + Yes, miss... (Currently held weapon will be lost) Sí, señorita... (El arma actual se perderá) Mmph... (Nod politely) (Currently held weapon will be lost) @@ -13288,10 +17244,16 @@ It's just a prop for a costume. Es solo un accesorio para un disfraz. Are you questioning me? I'm a dragonslayer. ¿Me estás cuestionando? Soy un cazador de dragones. + + (Continue...) (Continuar...) + + (The SPEAKER approaches you in your cell)|Well well, what do we have here? A new guest?|Perhaps I should give you a rundown of your new life~ (El SPEAKER se acerca a ti en tu celda)|Bueno bueno, ¿qué tenemos aquí? ¿Un nuevo invitado? Tal vez debería darte un resumen de tu nueva vida~ + + (The SPEAKER chuckles)|Don't tell me you seriously think we're letting you go?|You broke the rules, ignored the warnings.|Your new job is to make the people here happy. (El SPEAKER se ríe)|¿No me digas que crees seriamente que te vamos a dejar ir?|Rompiste las reglas, ignoraste las advertencias.|Tu nuevo trabajo es hacer feliz a la gente aquí. (The SPEAKER chuckles)|Hah, looks like you've got lots of training ahead of you.|Soon you'll have too much pleasure for your own good~ @@ -13300,18 +17262,24 @@ Are you questioning me? I'm a dragonslayer. (El SPEAKER se ríe)|No te preocupes, pronto llegarás a disfrutarlo. (The SPEAKER smiles)|Heh, looks like you'll be fitting right in. (El SPEAKER sonríe)|Je, parece que encajarás perfectamente. + + (The SPEAKER chuckles)|You're probably wondering what's in store for you.|It's simple: You behave and do as you're told.|Eventually you will get to roam around.|Don't you dare try to steal anything. (El SPEAKER se ríe)|Probablemente te estés preguntando qué te espera.|Es simple: te comportas y haces lo que se te dice.|Eventualmente podrás deambular.|No te atrevas a intentar robar nada . -(The SPEAKER chuckles)|Looks like it's going to be an extended stay for you~ -(El SPEAKER se ríe)|Parece que va a ser una estadía prolongada para ti~ +### (The SPEAKER chuckles)|Feisty, aren't you?|Looks like it's going to be an extended stay for you~ + (The SPEAKER giggles and returns to her work) (La SPEAKER ríe y vuelve a su trabajo) (The SPEAKER smiles)|Looks like you'll get the hang of it pretty quickly! (El SPEAKER sonríe)|¡Parece que lo dominarás bastante rápido! + + (New life?) (¿Nueva vida?) (Let her continue) (Déjala continuar) + + (Pout at her) (Ponle puchero a ella) You can't make me do that! @@ -13322,6 +17290,8 @@ That sounds alright... Eso suena bien... (Moan into your gag and giggle) (Gime en tu mordaza y ríe) + + (Glare at her) (La mira fijamente) Let me out this instant! @@ -13332,8 +17302,14 @@ I will be a good girl! ¡Seré una buena chica! (Giggle and wiggle your body) (Ríete y mueve tu cuerpo) + + + + (The SPEAKER approaches you in your cell)|Back again, are we? Silly girl.|You know we don't take no for an answer. (El SPEAKER se acerca a ti en tu celda)|Otra vez, ¿verdad? Niña tonta. Sabes que no aceptamos un no por respuesta. + + (The SPEAKER smiles back)|Oh, this is a game to you?|Then perhaps I should make it funner for you...|(She leaves and returns with some toys...)|Now hold still! (El SPEAKER le devuelve la sonrisa)|Oh, ¿esto es un juego para usted?|Entonces quizás debería hacerlo más divertido para usted...|(Ella se va y regresa con algunos juguetes...)|¡Ahora quédese quieto! (The SPEAKER frowns)|I know exactly what you need... @@ -13350,6 +17326,8 @@ I will be a good girl! (El SPEAKER asiente)|Hablaré contigo~ (The SPEAKER shakes her head)|Babe, you know who's going to be blamed|if a max-security prisoner escapes? (La SPEAKER niega con la cabeza) Nena, ¿sabes quién va a ser culpado si un prisionero de máxima seguridad se escapa? +### (The SPEAKER shakes her head)|I'll be honest with you, you're not worth the risk.|It'd help if you had more change~ + (Giggle and smile) (Ríe y sonríe) Don't you mean 'more fun'? @@ -13362,8 +17340,10 @@ Don't you mean 'more fun'? (Hace puchero y la mira fijamente) (Point to the Jailer's coin pouch) (Señale la bolsa de monedas del Carcelero) -(Give her all your gold) -(Dale todo tu oro) +### (Give her BRIBECOST gold) + + + Why don't you wear it instead? (OFFPERC chance, may aggro) ¿Por qué no te lo pones tú en su lugar? (Oportunidad OFFPERC, puede aggro) (Point to her instead) (OFFPERC chance, may aggro) @@ -13372,6 +17352,10 @@ Why don't you wear it instead? (OFFPERC chance, may aggro) (¡El SPEAKER se resiste y contraataca!) (The SPEAKER blushes and accepts) (La SPEAKER se sonroja y acepta) + + + + (The SPEAKER looks at you curiously)|Oh, you'd be perfect!|Would you please model my latest design? (El SPEAKER te mira con curiosidad)|¡Oh, serías perfecto!|¿Podrías modelar mi último diseño? (The SPEAKER holds up a restrictive outfit)|This RESTRAINT might be a tight fit|so hold still while I lace it~ @@ -13392,22 +17376,24 @@ Why don't you wear it instead? (OFFPERC chance, may aggro) (El SPEAKER parece desconcertado)|¿Cambió de opinión?|Aunque se ve bien en usted~ (The SPEAKER snaps her fingers)|(You feel the RESTRAINT magically appear on you)|Aha! Wonderful! You can go now~ (La SPEAKER chasquea los dedos)|(Sientes que la RESTRAINT aparece mágicamente sobre ti)|¡Ajá! ¡Maravilloso! Puedes irte ahora ~ + + Yes please! ¡Sí, por favor! (Nod enthusiastically) (Asiente con entusiasmo) -I don't have time for this. -No tengo tiempo para esto. (Shake your head) (Sacude la cabeza) + + Of course miss. Por supuesto señorita. (Nod again) (Asiente de nuevo) Actually, I'd rather not. En realidad, preferiría no hacerlo. -(Shake your head) -(Sacude la cabeza) + + Fine, I guess. Bien, supongo. (Giggle and nod) @@ -13416,8 +17402,12 @@ Wait! That's too much! (PERCENT chance to avoid) ¡Esperar! ¡Eso es demasiado! (PERCENT de probabilidad de evitar) (Shake your head and moan) (PERCENT chance to avoid) (Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) -(The SPEAKER looks at with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed? -(El SPEAKER mira con mirada filosófica)|¿Alguna vez has sentido que querías ser...|Transformado? + + + + +### (The SPEAKER looks at you with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed? + (The SPEAKER takes a strange mask from her satchel)|Well, I have the answer right here... (La SPEAKER saca una extraña máscara de su cartera)|Pues aquí tengo la respuesta... (The SPEAKER nods seriously)|My hypothesis was correct... @@ -13436,30 +17426,104 @@ Wait! That's too much! (PERCENT chance to avoid) (El SPEAKER asiente)|Veo que eres un buscador de la verdad después de todo. (The SPEAKER lets you go. But then...)|(You feel her clip a RESTRAINT on you from behind!)|There... I shall now observe your behavior. (El SPEAKER te deja ir. Pero entonces...)|(¡Sientes que te sujeta con una RESTRAINT por detrás!)|Aquí... ahora observaré tu comportamiento. + + Um, sure? ¿UM, seguro? (Nod seriously) (Asiente seriamente) ...What? ...¿Qué? -(Shake your head) -(Sacude la cabeza) + + Show me the truth. Muéstrame la verdad. -(Nod again) -(Asiente de nuevo) That's just creepy. Eso es espeluznante. -(Shake your head) -(Sacude la cabeza) + + Fine, you've convinced me. Bien, me has convencido. -(Giggle and nod) -(Ríe y asiente) I don't have time for this. (PERCENT chance to avoid) No tengo tiempo para esto. (PERCENT de probabilidad de evitar) -(Shake your head and moan) (PERCENT chance to avoid) + + + + +### (The SPEAKER smiles as she hides her hands behind her back)|Have you heard of 'sensory deprivation'? + +### (The SPEAKER presents a RESTRAINT)|Well, I have just the thing for you!|It's nice and comfy, and it has earmuffs built in! + +### (The SPEAKER starts pulling the hood over your head)|Let's get you laced in! + +### (The SPEAKER giggles)|Alrighty.|You don't know what you're missing out on~ + +### (The SPEAKER doesn't seem to hear you) + +### (The SPEAKER looks at you with a devious grin)|Oh, but it's so much fun!|You can run around bumping into things!|It's the ultimate adventure! + +### (The SPEAKER chuckles)|Truth be told, I wasn't asking~|Now why don't you kneel for me... + +### (The SPEAKER pouts)|I thought it would be fun... + +### (The SPEAKER surprises you with a crop to the thigh)|(You involuntarily kneel in front of her)|That's better~|Now why don't you say good night~ + +### Of course! I love it! + +(Nod eagerly) +(Asiente con entusiasmo) +### I prefer 'situational awareness'. + +### (Shake your head in alarm) + +### Doll me up! + +### Actually, that sounds stifling... + +### That doesn't sound that bad actually... + +(Shake your head and groan) (PERCENT chance to avoid) (Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + + + +### (The SPEAKER smiles and looks down at you deviously)|Hey there, I have a 'job' for you! + +### (The SPEAKER takes a duster gag from her satchel)|Such a good girl!|So here's what I have for you~|It's a special tool to help keep the place clean. + +### (The SPEAKER grins)|I'm glad we could come to an understanding~|(She takes out a duster gag from her satchel)|Now then, this place is filthy.|Why don't you put this on to help? + +### (The SPEAKER frowns)|Fair enough.|Perhaps you should reconsider your life choices~ + +### (The SPEAKER shrugs)|I'll find someone else... + +### (The SPEAKER reaches out to grab you)|Now now,|You shouldn't skip out on your duties~|(She pulls out a duster gag from her satchel and grins) + +### (The SPEAKER smiles)|Don't be afraid!|(She turns the gag with the round mouth ball clearly visible)|Now open up... + +### (The SPEAKER shrugs)|Fine, I'll get someone else to clean up. + +### (The SPEAKER places the gag in your mouth)|(She then buckles up the straps.)|(You feel a locking mechanism pull the straps in tight...)|Good maid! + +### (The SPEAKER catches you and forces the gag on you)|(You feel it tighten as it locks on securely...)|I don't want to hear it!|Now go and do your job~ + +### I'll do it! + +### I don't like the sound of this. + +Yes miss! +¡Sí señorita! +### Actually, maybe not... + +### Okay okay... I'll do it. + +### That gag is far too big! (PERCENT chance to avoid) + + + + + (The SPEAKER swings an imaginary sword around)|En guar- Oh, you're unarmored!|Do you want to borrow some of mine? (El SPEAKER blande una espada imaginaria)|En guar- ¡Oh, no llevas armadura!|¿Quieres tomar prestada una de las mías? (The SPEAKER holds up a RESTRAINT)|I found this near an old suit of armor.|I think it's a helmet or something... @@ -13480,30 +17544,30 @@ No tengo tiempo para esto. (PERCENT de probabilidad de evitar) (El SPEAKER lo bloquea en su lugar rápidamente)|Allí, ¡todo listo para la batalla ahora!|(El SPEAKER se ríe, guiñándote un ojo descaradamente) (The SPEAKER tightly fastens the muzzle on)|Safe and secure~|(You whimper as the SPEAKER spanks you goodbye) (El SPEAKER ajusta firmemente el cañón)|Seguro y seguro~|(Tu gimes mientras el SPEAKER te da una nalgada de despedida) + + Extra defense can't hurt... La defensa adicional no puede hacer daño... (Nod cautiously) (Asiente con cautela) I'm safe enough. Estoy lo suficientemente seguro. -(Shake your head) -(Sacude la cabeza) + + A gag? Sounds fun~ ¿Una broma? Suena divertido~ -(Nod eagerly) -(Asiente con entusiasmo) That's not a helmet! ¡Eso no es un casco! -(Shake your head) -(Sacude la cabeza) + + Well, it might... Bueno, podría... -(Giggle and nod) -(Ríe y asiente) -(Dodge her lunge) (PERCENT chance to avoid) -(Esquivar su embestida) (PERCENT de posibilidades de evitar) (Dodge her lunge) (PERCENT chance to avoid) (Esquivar su embestida) (PERCENT de posibilidades de evitar) + + + + (A smirking SPEAKER bumps into you)|So, you're with us now, huh?|I think you need a welcome gift. (Un SPEAKER sonriente choca contra usted) Entonces, ahora está con nosotros, ¿eh? Creo que necesita un regalo de bienvenida. Mmhmm, a gift~|(The SPEAKER leans forward to whisper in your ear)|Is it cold in here, or is it just you? @@ -13524,22 +17588,22 @@ Mmhmm, un regalo~|(El SPEAKER se inclina para susurrarte al oído)|¿Hace frío (RESTRAINT se solidifica en ti mientras el SPEAKER sonríe) | ¡Funcionó! ¡Lo hice! Gracias por tu ayuda~ (RESTRAINT solidifies on you as the SPEAKER smiles)|Yes! Finally! How's that feel?|(The SPEAKER admires your restraints) (RESTRAINT se solidifica en ti mientras el SPEAKER sonríe) | ¡Sí! ¡Finalmente! ¿Cómo se siente?|(El SPEAKER admira tus restricciones) + + A gift? ¿Un regalo? (Nod warily) (Asiente con cautela) No thanks. No, gracias. -(Shake your head) -(Sacude la cabeza) + + Umm... just me? Umm... ¿Solo yo? -(Nod again) -(Asiente de nuevo) Wait, don't make it colder! ¡Espera, no lo hagas más frío! -(Shake your head) -(Sacude la cabeza) + + (Shiver and watch as the ice covers you) (Tiembla y mira como el hielo te cubre) (Mutely whimper as the ice covers you) @@ -13548,6 +17612,10 @@ Ah! T-That's freezing! (PERCENT chance to avoid) ¡Ay! ¡E-Eso está helado! (PERCENT de probabilidad de evitar) (Wriggle to warm up) (PERCENT chance to avoid) (Retorcerse para calentarse) (PERCENT de posibilidades de evitar) + + + + (A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? (Se acerca un SPEAKER robótico)|CONSULTA: Buena chica detectada:|¿Se desea moderación? (The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? @@ -13564,78 +17632,44 @@ ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. ERROR: Se esperaba aceptación.|DECLARACIÓN: EL SPEAKER agregará RESTRAINT. (The SPEAKER makes a whirring noise)|ERROR: SPEAKER out of tape.|Returning to routine. (El SPEAKER hace un zumbido)|ERROR: SPEAKER sin cinta.|Volviendo a la rutina. -(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. -(El SPEAKER gira a su alrededor, liberando la cinta)|RESTRAINT dispensada.|Que tenga un buen día. (The SPEAKER launches tape which catches you as you run)|RESTRAINT dispensed.|Have a nice day. (El SPEAKER lanza una cinta que lo atrapa mientras corre)|RESTRAINT dispensada.|Que tenga un buen día. + + Uh, affirmative? ¿Afirmativo? (Nod) (Asentir) Negative. Negativo. -(Shake your head) -(Sacude la cabeza) + + Very acceptable! ¡Muy aceptable! -(Nod again) -(Asiente de nuevo) No, I don't want that. No, no quiero eso. -(Shake your head) -(Sacude la cabeza) + + If you have to... Si usted tiene que... -(Giggle and nod) -(Ríe y asiente) Go away robot! (PERCENT chance to avoid) ¡Vete robot! (PERCENT de probabilidad de evitar) (Shake your head rapidly) (PERCENT chance to avoid) (Sacude la cabeza rápidamente) (PERCENT de posibilidades de evitar) -(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? -(Se acerca un SPEAKER robótico)|CONSULTA: Buena chica detectada:|¿Se desea moderación? -(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? -(El SPEAKER emite un pitido y zumba)|EL SPEAKER agregará RESTRAINT.|¿Aceptable? + + + + (The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. (El SPEAKER le dispara cables) | RESTRAINT dispensada. | Que tenga un buen día. -(The SPEAKER buzzes)|Understood. Proceding back to duty. -(El SPEAKER zumba)|Entendido. Procediendo de regreso al deber. -(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. -(El SPEAKER hace clic y emite un pitido)|Rechazo observado.|EL SPEAKER volverá a patrullar. -(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. -(El SPEAKER zumba)|ERROR: Contradicción en la respuesta.|DECLARACIÓN: EL SPEAKER agregará RESTRAINT. -ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. -ERROR: Se esperaba aceptación.|DECLARACIÓN: EL SPEAKER agregará RESTRAINT. (The SPEAKER makes a whirring noise)|ERROR: SPEAKER cable jammed.|Returning to routine. (El SPEAKER emite un zumbido)|ERROR: Cable del SPEAKER atascado.|Volviendo a la rutina. -(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. -(El SPEAKER le dispara cables) | RESTRAINT dispensada. | Que tenga un buen día. -(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. -(El SPEAKER le dispara cables) | RESTRAINT dispensada. | Que tenga un buen día. -Uh, affirmative? -¿Afirmativo? -(Nod) -(Asentir) -Negative. -Negativo. -(Shake your head) -(Sacude la cabeza) -Very acceptable! -¡Muy aceptable! -(Nod again) -(Asiente de nuevo) -No, I don't want that. -No, no quiero eso. -(Shake your head) -(Sacude la cabeza) -If you have to... -Si usted tiene que... -(Giggle and nod) -(Ríe y asiente) -Go away robot! (PERCENT chance to avoid) -¡Vete robot! (PERCENT de probabilidad de evitar) -(Shake your head rapidly) (PERCENT chance to avoid) -(Sacude la cabeza rápidamente) (PERCENT de posibilidades de evitar) + + + + + + (A happy SPEAKER looks at you)|Hey there cutie~|Want to try some scarf bondage? (Un SPEAKER feliz te mira)|Hola linda~|¿Quieres probar un poco de bondage con bufanda? (The SPEAKER holds up some scarves)|If you want to try, I've got a few here.|I could give you a RESTRAINT? @@ -13656,30 +17690,72 @@ Go away robot! (PERCENT chance to avoid) (El SPEAKER sonríe)|¡Sí, gracias!|Se siente bien, ¿verdad? (The SPEAKER tosses a scarf around you like a lasso)|Not so fast! You cannot escape the fluff! (El SPEAKER lanza una bufanda a tu alrededor como un lazo) | ¡No tan rápido! ¡No puedes escapar de la pelusa! + + Sounds good! ¡Suena bien! (Nod quickly) (Asiente rápidamente) Not really. No precisamente. -(Shake your head) -(Sacude la cabeza) + + Please do! ¡Por favor, hazlo! (Nod and giggle) (Asiente y ríe) Not right now. No ahora. -(Shake your head) -(Sacude la cabeza) + + Well... sure then. Bueno... seguro entonces. -(Giggle and moan) -(Ríe y gime) Hey! Stop! (PERCENT chance to avoid) ¡Ey! ¡Detener! (PERCENT de probabilidad de evitar) (Shake your head and whine) (PERCENT chance to avoid) (Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + +### (An excited SPEAKER turns to you)|Eureka, I've done it!|Do you want to see? + +### (The SPEAKER pulls out a pressurized flask)|Behold! A gaseous form of latex!|I've coated the interior with a layer of inert slime to keep it secure.|Here, have a look!|(She holds out the container) + +### (The flask springs a leak)|Oh no! That wasn't supposed to happen!|(The gas crystalizes into a RESTRAINT across your body) + +### (The SPEAKER scoffs)|You'll see... you'll all see! + +(The SPEAKER sighs)|So hard to find good help out here... +(El SPEAKER suspira)|Es tan difícil encontrar buena ayuda aquí... +### (The SPEAKER frowns)|What, do you doubt my results? See for yourself!|(She unscrews the cap) + +### (The green gas starts leaking)|Oh no! It wasn't supposed to do that! + +### (You push her out of the way, but she frowns)|Hmph. This is your fault. + +### (You push her out of the way, but get caught in the cloud yourself)|(The gas crystalizes into a RESTRAINT across your body)|Oh no, that could have been me! + +### (The gas moves toward you, as if by its own will)|(The gas crystalizes into a RESTRAINT across your body)|That wasn't supposed to happen... + +### Seems interesting! + +(Nod slowly) +(Asiente lentamente) +### Seems boring. + +### Are you sure this is a good idea? + +### Keep that away from me! + +### I'll stop it! + +### (Run toward her to help) + +### (Run away!) (PERCENT chance to avoid) + + + + + (A messy looking SPEAKER turns to you)|Hmm, curious. Very curious.|Can you help me with an experiment? (Un SPEAKER de aspecto desordenado se vuelve hacia ti)|Hmm, curioso. Muy curioso. ¿Puedes ayudarme con un ex perimento? (The SPEAKER pulls out a flask)|I isolated some slime, but it's inert.|Would you let me spill some on you? @@ -13688,8 +17764,6 @@ Hey! Stop! (PERCENT chance to avoid) (El SPEAKER vuelca todo el frasco)|¡Ajá! ¡Está creciendo de nuevo! Fascinante.|(Sticky RESTRAINT se aferra a ti) (The SPEAKER tuts disapprovingly)|Not one for chemistry, eh? (El SPEAKER hace una mueca de desaprobación)|No para la química, ¿eh? -(The SPEAKER sighs)|So hard to find good help out here... -(El SPEAKER suspira)|Es tan difícil encontrar buena ayuda aquí... (The SPEAKER glares at you)|You've got no sense of adventure!|For science! (El SPEAKER te mira fijamente)|¡No tienes sentido de la aventura!|¡Para la ciencia! Ah, but it'll be quick!|(The SPEAKER begins tipping the flask)|See? It's already moving toward you! @@ -13700,30 +17774,30 @@ Ah, but it'll be quick!|(The SPEAKER begins tipping the flask)|See? It's already (El SPEAKER vierte el limo sobre ti)|¡Esa es la chica espíritu!|(Sticky RESTRAINT se aferra a ti) (The SPEAKER tosses the slime on you)|Ha, look, it's alive!|(Sticky RESTRAINT clings to you) (El SPEAKER te tira la baba)|¡Ja, mira, está vivo!|(Sticky RESTRAINT se aferra a ti) + + Sure. Seguro. -(Nod slowly) -(Asiente lentamente) Absolutely not. Absolutamente no. -(Shake your head) -(Sacude la cabeza) + + On me? Sounds fun~ ¿Sobre mí? Suena divertido~ -(Nod again) -(Asiente de nuevo) Nope. Not doing that. No. No hacer eso. -(Shake your head) -(Sacude la cabeza) + + Okay, for science... Bien, para la ciencia... -(Giggle and nod) -(Ríe y asiente) Ah! Don't you dare! (PERCENT chance to avoid) ¡Ay! ¡No te atrevas! (PERCENT de probabilidad de evitar) (Shake your head and whimper) (PERCENT chance to avoid) (Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + + + (A SPEAKER whispers to you)|Ever wonder how wolfgirls feel?|Or why they're so obedient? (UN SPEAKER te susurra)|¿Alguna vez te preguntaste cómo se sienten las chicas lobo?|¿O por qué son tan obedientes? (The SPEAKER grins)|I've got a RESTRAINT here~|Wanna give it a try? @@ -13744,22 +17818,22 @@ Ah! Don't you dare! (PERCENT chance to avoid) (El SPEAKER agrega la RESTRAINT)|(Sientes que aprieta todo antes de bloquearlo)|Buena chica~ (The SPEAKER pushes you to the ground)|I'll make it extra tight for you~|(The RESTRAINT locks tightly onto you) (El SPEAKER te empuja hacia el suelo)|Lo haré más apretado para ti~|(El RESTRAINT te sujeta con fuerza) + + Maybe a little~ Tal vez un poco ~ (Nod excitedly) (Asiente emocionado) Don't know, don't care. No sé, no me importa. -(Shake your head) -(Sacude la cabeza) + + Yes! So much! ¡Sí! ¡Mucho! -(Nod quickly) -(Asiente rápidamente) That looks too strict! ¡Eso parece demasiado estricto! -(Shake your head) -(Sacude la cabeza) + + I- Well- O-Okay~ Yo- Bueno- O-Está bien~ (Moan and squirm) @@ -13768,6 +17842,10 @@ I don't want to get stuck! (PERCENT chance to avoid) ¡No quiero quedarme atascado! (PERCENT de probabilidad de evitar) (Shake your head worriedly) (PERCENT chance to avoid) (Sacude la cabeza con preocupación) (PERCENT de posibilidades de evitar) + + + + (A SPEAKER gracefully gestures to you)|So good to see a friendly face~|Care to see some elven goods? (UN SPEAKER te hace un gesto con gracia)|Qué bueno ver una cara amistosa~|¿Te gustaría ver algunos bienes élficos? (The SPEAKER holds up a RESTRAINT)|These are some of our strictest.|Want to try? @@ -13788,35 +17866,35 @@ I don't want to get stuck! (PERCENT chance to avoid) (El SPEAKER activa el RESTRAINT)|Ya está, mucho mejor.|Ahora muévete por mí linda~ (The SPEAKER trips you over)|(Before you can move, the RESTRAINT closes firmly)|Strict, isn't it?~ (El SPEAKER te hace tropezar)|(Antes de que puedas moverte, el RESTRAINT se cierra firmemente)|Estricto, ¿no?~ + + Of course! ¡Por supuesto! (Nod happily) (Asiente alegremente) No, thanks. No, gracias. -(Shake your head) -(Sacude la cabeza) + + Pretty please~ Bonito por favor~ -(Nod eagerly) -(Asiente con entusiasmo) -Not really. -No precisamente. -(Shake your head) -(Sacude la cabeza) -. -. + + +### Fine... + (Moan and giggle) (Gemido y risita) Stop! (PERCENT chance to avoid) ¡Detener! (PERCENT de probabilidad de evitar) -(Shake your head and moan) (PERCENT chance to avoid) -(Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + + + (A SPEAKER plays with silvery rope)|Hmm, I need to get better with this.|Can I practice on you? (UN SPEAKER juega con una cuerda plateada)|Hmm, necesito mejorar con esto.|¿Puedo practicar contigo? (The SPEAKER grins happily)|Thank you girl~|I'll tie with RESTRAINT then~ (El SPEAKER sonríe felizmente)|Gracias niña~|Entonces empataré con RESTRAINT~ -(The SPEAKER binds you tightly)|(The rope is tight, and she's clearly and expert.)|Mmm, not too bad~ +(The SPEAKER binds you tightly)|(The rope is tight, and she's clearly an expert.)|Mmm, not too bad~ (El SPEAKER te ata con fuerza)|(La cuerda está apretada, y ella es clara y experta.)|Mmm, no está tan mal~ (The SPEAKER pouts indignantly)|Why say yes then?!|(The SPEAKER walks off grumbling) (El SPEAKER hace un puchero indignado)|¿¡Entonces por qué decir que sí?!|(El SPEAKER se aleja refunfuñando) @@ -13832,30 +17910,28 @@ Stop! (PERCENT chance to avoid) (El SPEAKER te ata estrictamente)|(Puedes sentir que ha hecho esto muchas veces)|(Ella te sonríe mientras se va) (The SPEAKER strictly ties you up)|(There's no slack anywhere!)|(She makes a face at you as she leaves) (El SPEAKER te ata estrictamente)|(¡No hay holgura en ninguna parte!)|(Te hace una mueca mientras se va) + + Any time~ En cualquier momento ~ -(Nod excitedly) -(Asiente emocionado) I'd rather you didn't. Preferiría que no lo hicieras. -(Shake your head) -(Sacude la cabeza) + + Sounds great! ¡Suena genial! -(Nod again) -(Asiente de nuevo) Actually, I don't want that. En realidad, no quiero eso. -(Shake your head) -(Sacude la cabeza) + + I'll play along then~ Seguiré el juego entonces~ -(Moan and squirm) -(Gemido y retorcerse) -(Struggle against her) (PERCENT chance to avoid) -(Luchar contra ella) (PERCENT de posibilidades de evitar) (Struggle against her) (PERCENT chance to avoid) (Luchar contra ella) (PERCENT de posibilidades de evitar) + + + + (The SPEAKER quickly motions to you)|Hey! Over here!| I got something to show you! (El SPEAKER te hace señas rápidamente) | ¡Oye! ¡Por aquí!| ¡Tengo algo que mostrarte! (The SPEAKER giggles)|You'll be wearing this~|(A RESTRAINT is in her hands) @@ -13876,30 +17952,30 @@ Seguiré el juego entonces~ (El SPEAKER agrega la RESTRAINT)|Buena suerte con eso~|(Suena como si estuviera regodeándose...) (The SPEAKER roughly forces you down)|(Pushing your head down, the RESTRAINT slides on)|(The SPEAKER tugs your hair, then walks away) (El SPEAKER te obliga bruscamente a bajar)|(Empujando tu cabeza hacia abajo, el SOPORTE se desliza)|(El SPEAKER tira de tu cabello y luego se aleja) -(Walk over, curiously) -(Camina, con curiosidad) + + (Walk over, curiously) (Camina, con curiosidad) (Don't approach). (No te acerques). (Don't approach) (No te acerques) + + Sure! ¡Seguro! -(Nod eagerly) -(Asiente con entusiasmo) W-What? No way! ¿Q-Qué? ¡De ninguna manera! -(Shake your head) -(Sacude la cabeza) + + (Let her add the restraint) (Déjala agregar la moderación) (Moan and nod) (Gemido y asiente) -Stop! (PERCENT chance to avoid) -¡Detener! (PERCENT de probabilidad de evitar) -(Shake your head and groan) (PERCENT chance to avoid) -(Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + + + (The SPEAKER walks over)|You'd make a cute catgirl~|Want help becoming one? (El SPEAKER se acerca)|Serías una linda chica gato~|¿Quieres ayuda para convertirte en una? (The SPEAKER grins)|Here, I've got this RESTRAINT.|That'll help! @@ -13920,30 +17996,26 @@ Stop! (PERCENT chance to avoid) (El SPEAKER se mueve alegremente)|¡Oh, eres tan lindo!|Disfrútalo~ (The SPEAKER traps you)|(You feel the RESTRAINT being forced on)|Meow~ (El SPEAKER te atrapa)|(Sientes que la RESTRAINT está siendo forzada)|Miau~ -Sure! -¡Seguro! -(Nod excitedly) -(Asiente emocionado) + + No, not today. No no hoy. -(Shake your head) -(Sacude la cabeza) + + Yay! ¡Hurra! -(Nod quickly) -(Asiente rápidamente) Not like that! ¡Así no! -(Shake your head) -(Sacude la cabeza) + + Y-Yes miss~ S-Si señorita~ -(Moan and squirm) -(Gemido y retorcerse) -(Duck out the way) (PERCENT chance to avoid) -(Apartarse del camino) (PERCENT de posibilidades de evitar) (Duck out the way) (PERCENT chance to avoid) (Apartarse del camino) (PERCENT de posibilidades de evitar) + + + + (A SPEAKER winks at you)|You look like a girl who likes feeling|like a prisoner, am I right? (UN SPEAKER te guiña un ojo)|Pareces una chica a la que le gusta sentirse|prisionera, ¿verdad? (The SPEAKER nods happily)|I knew it! Well, it's your lucky day.|I've got some RESTRAINT for you~ @@ -13964,30 +18036,30 @@ S-Si señorita~ (El SPEAKER agrega la RESTRAINT)|Te estás sonrojando querida~|¿Ella protesta demasiado? (The SPEAKER giggles as she catches you and slaps on the cuffs)|No so fast, dear~ (El SPEAKER se ríe cuando te atrapa y te da una palmada en las esposas)|No tan rápido, querida~ + + Maybe a bit~ Tal vez un poco ~ -(Nod eagerly) -(Asiente con entusiasmo) Not at all. De nada. -(Shake your head) -(Sacude la cabeza) -(Wiggle excitedly) -(Se mueve con entusiasmo) + + (Wiggle excitedly) (Se mueve con entusiasmo) Not like that. Así no. -(Shake your head) -(Sacude la cabeza) + + O-Okay... O-bien... (Moan and shiver) (Gemido y escalofrío) Don't even try. (PERCENT chance to avoid) Ni siquiera lo intentes. (PERCENT de probabilidad de evitar) -(Shake your head and groan) (PERCENT chance to avoid) -(Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + + + (A SPEAKER is looking at something)|So comfy... but how?|Hey, you! Come see this! (UN SPEAKER está mirando algo)|Tan cómodo... pero ¿cómo?|¡Eh, tú! ¡Ven a ver esto! (The SPEAKER holds up a RESTRAINT)|It's so soft, but so strict~|Want to give it a try? @@ -14008,30 +18080,28 @@ Ni siquiera lo intentes. (PERCENT de probabilidad de evitar) (El RESTRAINT está firmemente abrochado en su lugar)|¿Ves? Bien, ¿eh?|(Te hundes en la sensación reconfortante) (The SPEAKER ignores you)|(The RESTRAINT is buckled firmly in place)|(A wave of comfort passes over you) (El SPEAKER te ignora)|(El RESTRAINT está firmemente abrochado en su lugar)|(Una ola de consuelo pasa sobre ti) + + (Approach) (Acercarse) -(Approach) -(Acercarse) -(Keep your distance) -(Mantén tu distancia) (Keep your distance) (Mantén tu distancia) -Yes please! -¡Sí, por favor! -(Nod happily) -(Asiente alegremente) + + Nope. No. -(Shake your head) -(Sacude la cabeza) + + It does look comfortable~ Se ve cómodo~ (Squirm and bow your head) (Retorcerse e inclinar la cabeza) It looks too strict! (PERCENT chance to avoid) ¡Parece demasiado estricto! (PERCENT de probabilidad de evitar) -(Shake your head rapidly) (PERCENT chance to avoid) -(Sacude la cabeza rápidamente) (PERCENT de posibilidades de evitar) + + + + (The SPEAKER brushes past hurriedly)|Careful girl!|Else I'll lock you away~ (El SPEAKER pasa rápidamente)|¡Cuidado niña!|De lo contrario te encerraré~ (The SPEAKER looks at you intrigued)|Aren't you something...|How about wearing this RESTRAINT? @@ -14052,30 +18122,28 @@ It looks too strict! (PERCENT chance to avoid) (El SPEAKER agrega la RESTRAINT)|(Mientras lo cierra, se ríe)|Eres muy lindo en realidad~ (The SPEAKER stumbles and grimaces)|Ugh! Fine, you can go then.|D-Didn't want to see you tied anyway... (El SPEAKER tropieza y hace una mueca)|¡Ugh! Bien, puedes irte entonces. N-No quería verte atada de todos modos... + + That doesn't sound bad... Eso no suena mal... (Giggle into your gag) (Ríete en tu mordaza) That won't be necessary. Eso no será necesario. -(Shake your head) -(Sacude la cabeza) + + I'd love to! ¡Me encantaría! -(Nod quickly) -(Asiente rápidamente) -Not right now. -No ahora. -(Shake your head) -(Sacude la cabeza) + + M-Maybe you should then~ M-Tal vez deberías entonces~ -(Giggle and moan) -(Ríe y gime) You ran into me! (PERCENT chance to avoid) ¡Te encontraste conmigo! (PERCENT de probabilidad de evitar) -(Shake your head and moan) (PERCENT chance to avoid) -(Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + + + (A SPEAKER gives you a small curtsy)|Good day.|Care to try part of our uniform? (UN SPEAKER le hace una pequeña reverencia)|Buen día.|¿Quiere probarse parte de nuestro uniforme? (The SPEAKER looks content)|We can offer you this RESTRAINT.|It's a snug fit... @@ -14094,32 +18162,26 @@ You ran into me! (PERCENT chance to avoid) (El SPEAKER esboza una extraña sonrisa)|Muy bien. (The SPEAKER smugly nods)|(With surprising speed, the RESTRAINT locks in place)|Excellent, a good fit. (El SPEAKER asiente con aire de suficiencia)|(Con una velocidad sorprendente, el RESTRAINT se bloquea en su lugar)|Excelente, encaja bien. -(The SPEAKER covers your hand with her mouth)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly) -(La SPEAKER cubre tu mano con su boca)|Cállate, no más malas decisiones.|(Sientes que abrocha la correa estrictamente) -Yes please! -¡Sí, por favor! -(Nod eagerly) -(Asiente con entusiasmo) +### (The SPEAKER covers your mouth with her hand)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly) + No, thank you. No gracias. -(Shake your head) -(Sacude la cabeza) + + I accept~ acepto~ -(Nod again) -(Asiente de nuevo) -No, thanks. -No, gracias. -(Shake your head) -(Sacude la cabeza) + + I-I accept... Yo-yo acepto... (Moan and nod slowly) (Gime y asiente lentamente) No way! (PERCENT chance to avoid) ¡De ninguna manera! (PERCENT de probabilidad de evitar) -(Shake your head and whimper) (PERCENT chance to avoid) -(Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + + + (The SPEAKER looks at you inquisitively)|(Wordlessly, they motion at your body)|(They seem to be asking about restraints) (El SPEAKER te mira inquisitivamente)|(Sin decir una palabra, señalan tu cuerpo)|(Parecen estar preguntando por las ataduras) (The SPEAKER nods understandingly)|(RESTRAINT appears in their hand)|(They tilt their head at you) @@ -14134,36 +18196,34 @@ No way! (PERCENT chance to avoid) (El SPEAKER parece fruncir el ceño)|(Aparece RESTRAINT en su mano)|(Se acercan rápidamente) (The SPEAKER tilts their head)|(RESTRAINT appears in their hand)|(They come closer) (El SPEAKER inclina la cabeza)|(Aparece RESTRAINT en su mano)|(Se acercan) -(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) -(El SPEAKER te mira fijamente)|(Guardan la RESTRAINT y se van) (The SPEAKER holds you in place)|(You hear the oddly cold material locking)|(They nod at you) (El SPEAKER te mantiene en el lugar)|(Escuchas el bloqueo del material extrañamente frío)|(Ellos asienten hacia ti) (The SPEAKER firmly grabs you)|(The RESTRAINT locks onto your body tightly)|(The oddly cold material makes you shiver) (El SPEAKER te agarra con firmeza)|(La RESTRAINT se ajusta a tu cuerpo con fuerza)|(El material extrañamente frío te hace temblar) + + Y-Yes? ¿S-Sí? (Nod back) (Asiente de vuelta) No thank you. No gracias. -(Shake your head) -(Sacude la cabeza) + + (Smile and prepare yourself) (Sonríe y prepárate) (Nod and prepare yourself) (Asiente y prepárate) No, not that. No, eso no. -(Shake your head) -(Sacude la cabeza) + + W-Whoa! S-Sure... ¡Vaya! S-Claro... -(Moan and nod) -(Gemido y asiente) -Stop! (PERCENT chance to avoid) -¡Detener! (PERCENT de probabilidad de evitar) -(Shake your head and whine) (PERCENT chance to avoid) -(Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + + + (A SPEAKER giggles and calls to you)|Hey there~|Fancy seeing some nature?~ (UN SPEAKER se ríe y te llama)|Hola~|¿Te apetece ver un poco de naturaleza?~ (The SPEAKER motions with her hands)|(Vines rise from the floor and twirl)|These will bind you nicely... @@ -14184,30 +18244,28 @@ Stop! (PERCENT chance to avoid) (Las enredaderas se mueven mucho más rápido)|(Sientes la RESTRAINT mientras te retuerces)|Un regalo mío~ (The SPEAKER giggles loudly)|(The vines catch up and pin you down)|(When they let go, you're left with a RESTRAINT) (El SPEAKER se ríe a carcajadas)|(Las enredaderas te alcanzan y te inmovilizan)|(Cuando te sueltan, te quedas con una RESTRAINT) + + Always! ¡Siempre! -(Nod eagerly) -(Asiente con entusiasmo) -Not right now. -No ahora. -(Shake your head) -(Sacude la cabeza) + + That sounds exciting! ¡Eso suena emocionante! -(Nod happily) -(Asiente alegremente) Wait, not like this! ¡Espera, no así! -(Shake your head) -(Sacude la cabeza) + + W-Well- o-okay... B-bueno-o-bien... -(Moan and squirm) -(Gemido y retorcerse) Don't! (PERCENT chance to avoid) ¡No! (PERCENT de probabilidad de evitar) (Shake your head) (PERCENT chance to avoid) (Sacude la cabeza) (PERCENT de posibilidades de evitar) + + + + (A SPEAKER approaches)|Nothing quite beats a strong metal|chain, right? (UN SPEAKER se acerca) Nada supera a una fuerte cadena de metal, ¿verdad? (The SPEAKER nods happily)|Exactly!|Want one for yourself? @@ -14228,30 +18286,26 @@ Don't! (PERCENT chance to avoid) (El SPEAKER envuelve una cadena larga a tu alrededor)|(RESTRAINT abraza tu cuerpo de cerca)|(Te estremeces cuando el frío metal te toca) (The SPEAKER grins as she binds your body)|(RESTRAINT digs into you a little)|Enjoy, cutie~ (El SPEAKER sonríe mientras ata tu cuerpo)|(RESTRAINT se clava un poco en ti)|Disfruta, linda~ + + I love chains! ¡Me encantan las cadenas! -(Nod happily) -(Asiente alegremente) Plenty beats it. Mucho lo supera. -(Shake your head) -(Sacude la cabeza) + + Absolutely~ Absolutamente~ -(Nod again) -(Asiente de nuevo) -Not really. -No precisamente. -(Shake your head) -(Sacude la cabeza) + + I-If I have to... S-Si tengo que... -(Moan and squirm) -(Gemido y retorcerse) Ah! Cold! (PERCENT chance to avoid) ¡Ay! ¡Frío! (PERCENT de probabilidad de evitar) -(Shake your head and moan) (PERCENT chance to avoid) -(Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + + + (The SPEAKER nervously walks up to you)|Excuse me miss...|Are you a fan of latex by chance? (El SPEAKER se acerca nerviosamente a usted)|Disculpe señorita...|¿Es usted fan del látex por casualidad? (The SPEAKER blushes deeply)|Then would you like to try on this RESTRAINT? @@ -14270,80 +18324,122 @@ Ah! Cold! (PERCENT chance to avoid) (El SPEAKER frunce el ceño)|... ¡Eres rápido! (The SPEAKER smiles)|That's right~ (El SPEAKER sonríe)|Así es~ -(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight! -(El SPEAKER lo detiene y hace clic en un candado) | ¡Allí! ¡Agradable y apretado! +### (The SPEAKER restrains you and clicks a lock on)|There! Nice and tight! + Why of course! ¡Por qué por supuesto! -(Nod happily) -(Asiente alegremente) -Not really. -No precisamente. -(Shake your head) -(Sacude la cabeza) + + That sounds fun! ¡Eso suena divertido! -(Nod again) -(Asiente de nuevo) No, I don't want that! ¡No, no quiero eso! -(Shake your head) -(Sacude la cabeza) + + Okay, fine... Bien vale... -(Moan and giggle) -(Gemido y risita) Wait, what? (PERCENT chance to avoid) ¿Esperar lo? (PERCENT de probabilidad de evitar) -(Shake your head and moan) (PERCENT chance to avoid) -(Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + +### (The SPEAKER steps up to you)|Hey girl~|You happen to be a fan of latex? + +### (The SPEAKER smiles)|Then would you like to try on this RESTRAINT? + +### (The SPEAKER chuckles)|Tight and shiny! + +### (The SPEAKER shrugs)|Alright. Sorry I asked. + + + + + +### (The SPEAKER walks up to you)|Say, would you be interested in some 'protection?' + +### (The SPEAKER grins)|Wonderful! You see, I've just recently acquired one of these...|(She shows you a loose RESTRAINT)|I'm not too interested in wearing one myself,|but I thought you'd be a good fit for it? + +### (The SPEAKER blushes as she locks the belt around your waist)|I'm enjoying this more than I thought I would~ + +### (The SPEAKER smiles)|Enjoy your freedom while it lasts~ + +### (The SPEAKER shrugs)|That's okay, just thought I'd ask. + +### (The SPEAKER rubs the smooth metal seductively)|Are you sure?|Adventurers need to take care of themselves.|You don't want to lose control of yourself and run into some curse,|do you? + +### (The SPEAKER gives an evil smile)|What if I wasn't asking? + +### (The SPEAKER sighs)|I'll find some other cutie to wear it, I guess~ + +### (The SPEAKER blushes as she locks the RESTRAINT onto you)|There we go~ + +### (As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Whoops! I guess I acted too soon.|Ah well~ + +(The lock on the RESTRAINT starts glowing...) +(El candado del RESTRAINT comienza a brillar...) + + +### Protection? Certainly! + +### Nah, I'm good. + +### I would love to wear it! + +(Nod again, excited) +(Asiente de nuevo, emocionado) +### ...No thank you. + +(Shake your head, puzzled) +(Sacude la cabeza, perplejo) + + +### Fine. I need the protection anyway. + +### I refuse. (PERCENT chance to avoid) + +(Look at your belt...) +(Mira tu cinturón...) + + + + (The SPEAKER nervously walks up to you)|Excuse me miss...|Can you help me out? (El SPEAKER se acerca nerviosamente a usted)|Disculpe señorita...|¿Me puede ayudar? -(The SPEAKER blushes deeply)|I managed to unlock my RESTRAINT,|but my mistress expects me to wear it!|Do you mind wearing it instead? -(El SPEAKER se sonroja profundamente)|Logré desbloquear mi RESTRAINT,|¡pero mi ama espera que lo use!|¿Le importaría usarlo en su lugar? +### (The SPEAKER blushes deeply)|I found this cursed RESTRAINT and I can't let go of it!|Could you... wear it for me? + (The SPEAKER smiles)|Thank you so much, miss! (El SPEAKER sonríe)|¡Muchas gracias señorita! -(The SPEAKER frowns)|I'm going to get in trouble... -(El SPEAKER frunce el ceño)|Me voy a meter en un lío... +### (The SPEAKER frowns)|...That does seem rather far-fetched of me to ask. + (The SPEAKER blushes)|Oh... okay. (El SPEAKER se sonroja)|Oh... está bien. -(The SPEAKER frowns angrily)|Look, I know you're in trouble around here.|Just do me a favor. Please.|I need you to wear this RESTRAINT. -(El SPEAKER frunce el ceño con enojo)|Mira, sé que estás en problemas aquí.|Solo hazme un favor. Por favor. Necesito que use este RESTRAINT. -(The SPEAKER pleads with you)|My mistress is a magician!|She put a spell on it that senses if it's being worn.|Please, you have to hurry! -(El SPEAKER te suplica)|¡Mi ama es una maga!|Le puso un hechizo que detecta si se está usando.|¡Por favor, tienes que darte prisa! +### (The SPEAKER frowns angrily)|Look, we all know how much you enjoy being restrained~|Do me a favor and wear the RESTRAINT, okay? + +### (The SPEAKER pleads with you)|...point taken. But still!|I'll end up stuck in it for a really long time... + (The SPEAKER sighs and wears it herself)|(The lock starts glowing brightly...) (La SPEAKER suspira y se lo pone ella misma)|(El candado comienza a brillar intensamente...) (The SPEAKER looks relieved)|Thank you so much miss!|I won't forget you! (El SPEAKER parece aliviado)|¡Muchas gracias señorita!|¡No la olvidaré! -(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Hmmph! Serves you right!| -(Mientras te das la vuelta, el SPEAKER te sorprende)|(Escuchas un clic alrededor de tu cintura)|¡Hmmph! ¡Te lo mereces!| -(The lock on the RESTRAINT starts glowing...) -(El candado del RESTRAINT comienza a brillar...) +### (As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|I'm sorry miss! It was my only choice~ + I would love to help! ¡Me encantaría ayudar! -(Nod eagerly) -(Asiente con entusiasmo) -Go find someone else. -Ve a buscar a alguien más. -(Shake your head) -(Sacude la cabeza) +### You're asking me to get cursed? + That sounds like a tempting offer. Eso suena como una oferta tentadora. -(Nod again, excited) -(Asiente de nuevo, emocionado) ...What? Why would I need to wear it? ...¿Qué? ¿Por qué tendría que usarlo? -(Shake your head, puzzled) -(Sacude la cabeza, perplejo) + + Fine. I'll do it because you asked. Bien. Lo haré porque me lo pediste. -(Moan and nod slowly) -(Gime y asiente lentamente) I won't help you. Wear it yourself. (PERCENT chance to avoid) no te ayudaré Úselo usted mismo. (PERCENT de probabilidad de evitar) -(Shake your head) (PERCENT chance to avoid) -(Sacude la cabeza) (PERCENT de posibilidades de evitar) -(Look at your belt...) -(Mira tu cinturón...) + + + + (The SPEAKER walks up to you)|We don't get a lot of visitors.|I take it that you enjoy bondage? (El SPEAKER se acerca a ti) No recibimos muchas visitas. ¿Supongo que disfrutas de la esclavitud? (The SPEAKER tilts her head)|Well, I have a RESTRAINT lying around,|and I figured you'd enjoy it. @@ -14362,32 +18458,14 @@ no te ayudaré Úselo usted mismo. (PERCENT de probabilidad de evitar) (El SPEAKER frunce el ceño)|¡Maldita sea! Perdí mi oportunidad. (The SPEAKER smiles)|Good, good~ (El SPEAKER sonríe)|Bien, bien~ -(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight! -(El SPEAKER lo detiene y hace clic en un candado) | ¡Allí! ¡Agradable y apretado! -Why of course! -¡Por qué por supuesto! -(Nod happily) -(Asiente alegremente) -Not really. -No precisamente. -(Shake your head) -(Sacude la cabeza) -That sounds fun! -¡Eso suena divertido! -(Nod again) -(Asiente de nuevo) -No, I don't want that! -¡No, no quiero eso! -(Shake your head) -(Sacude la cabeza) -Okay, fine... -Bien vale... -(Moan and giggle) -(Gemido y risita) -Wait, what? (PERCENT chance to avoid) -¿Esperar lo? (PERCENT de probabilidad de evitar) -(Shake your head and moan) (PERCENT chance to avoid) -(Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + + + + + + + (The SPEAKER grins as she sees you)|Hey there sweetie~|I think you'd look good in some ropes! (La SPEAKER sonríe cuando te ve)|Hola cariño~|¡Creo que te verías bien con algunas cuerdas! (The SPEAKER looks at your bound body)|I've got some more ropes for you, babe! @@ -14410,30 +18488,30 @@ Wait, what? (PERCENT chance to avoid) (El SPEAKER sonríe)|Buena chica~ (The SPEAKER takes you down and trusses you up tightly)|That'll teach you~ (El SPEAKER te derriba y te ata con fuerza)|Eso te enseñará~ + + I think so too! ¡Yo también lo creo! -(Nod excitedly) -(Asiente emocionado) I don't think so. No me parece. -(Shake your head) -(Sacude la cabeza) -Yes miss! -¡Sí señorita! + + (Wiggle in place happily) (Meneo en su lugar felizmente) Actually, I'm having second thoughts... En realidad, estoy teniendo dudas... (Shake your head nervously) (Mueve la cabeza nerviosamente) + + Fine. You win. Bien. Tú ganas. -(Moan and giggle) -(Gemido y risita) Go away! (PERCENT chance to avoid) ¡Irse! (PERCENT de probabilidad de evitar) -(Shake your head and moan) (PERCENT chance to avoid) -(Sacude la cabeza y gime) (PERCENT de posibilidades de evitar) + + + + (The SPEAKER perks her ears as she sees you)|You've got a nice body.|I think it'll do better with some training! (El SPEAKER aguza los oídos cuando te ve)|Tienes un buen cuerpo.|¡Creo que te irá mejor con un poco de entrenamiento! (The SPEAKER grins and hands you a paper)|Nevermere Training is always looking for new recruits!|I'll just have you sign here... @@ -14454,74 +18532,30 @@ Go away! (PERCENT chance to avoid) (El SPEAKER sonríe)|Así es. ¿Tu nombre por favor? (The SPEAKER zaps you and places you in restrictive gear)|Hmph. Unruly girls need training! (El SPEAKER lo golpea y lo coloca en equipo restrictivo)|Hmph. ¡Las chicas rebeldes necesitan entrenamiento! + + This sounds like an interesting opportunity. Esto suena como una oportunidad interesante. -(Nod excitedly) -(Asiente emocionado) No thanks, I know what that entails... No gracias, sé lo que eso implica... -(Shake your head) -(Sacude la cabeza) + + I'll sign it! -¡Lo firmaré! -(Accept the contract) -(Acepto el contrato) -A contract? No way. -¿Un contrato? De ninguna manera. -(Refuse the contract) -(Rechazar el contrato) -Fine. I'll sign it... -Bien. lo firmaré... -(Moan and nod) -(Gemido y asiente) -Never! (PERCENT chance to avoid) -¡Nunca! (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) -(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(El SPEAKER hace una breve reverencia cuando lo ve)|Saludos.|Parece que posee cualidades que podemos aprovechar.|Me complacería ofrecerle un puesto... -(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(La SPEAKER sonríe brevemente antes de aclararse la garganta)|¡Fantástico!|Tengo tu uniforme aquí mismo... -(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(El SPEAKER te abrocha el cinturón, tirando del cordón con mucha fuerza...)|(Oyes el clic de unos cuantos candados...)|Maravilloso. Su primera tarea es limpiar este piso. Buena suerte. -(The SPEAKER tilts her head and shrugs)|We are always prepared... -(La SPEAKER inclina la cabeza y se encoge de hombros)|Siempre estamos preparados... -(The SPEAKER nods)|Fair enough. -(El SPEAKER asiente)|Muy bien. -(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(El SPEAKER sonríe y saca un vestido diminuto)|¿Puedo recordarte que has hecho bastantes... enemigos?|Sería una pena si te encontraras con uno de ellos... -(The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(El SPEAKER asiente con orgullo)|Estamos dispuestos a hacer algunos cambios en nuestros registros~ -(The SPEAKER frowns)|You won't know what hit you. -(El SPEAKER frunce el ceño)|No sabrás qué te golpeó. -(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(El SPEAKER sonríe)|Me alegro de que haya tomado la decisión correcta.|Ahora, su primera tarea será limpiar este piso.|Buena suerte. -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(El SPEAKER de repente se mueve más rápido de lo que puedes reaccionar)|(Sientes un pie presionando tu espalda mientras te obligan a bajar)|(Ella te pone un uniforme y te lo cierra con fuerza...)|Necesitarás entrenamiento adicional , Supongo... -This sounds like an interesting opportunity. -Esto suena como una oportunidad interesante. -(Nod excitedly) -(Asiente emocionado) -No thanks, I know what that entails... -No gracias, sé lo que eso implica... -(Shake your head) -(Sacude la cabeza) -Gladly! -¡Con alegría! -(Accept the contract) -(Acepto el contrato) -W-where did you get that uniform? (Refuse) -¿D-dónde conseguiste ese uniforme? (Rechazar) +¡Lo firmaré! +A contract? No way. +¿Un contrato? De ninguna manera. (Refuse the contract) (Rechazar el contrato) + + Fine. I'll sign it... Bien. lo firmaré... -(Moan and nod) -(Gemido y asiente) Never! (PERCENT chance to avoid) ¡Nunca! (PERCENT de probabilidad de evitar) (Shake your head and frown) (PERCENT chance to avoid) (Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) + + (The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... (El SPEAKER hace una breve reverencia cuando lo ve)|Saludos.|Parece que posee cualidades que podemos aprovechar.|Me complacería ofrecerle un puesto... (The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... @@ -14542,30 +18576,24 @@ Never! (PERCENT chance to avoid) (El SPEAKER sonríe)|Me alegro de que haya tomado la decisión correcta.|Ahora, su primera tarea será limpiar este piso.|Buena suerte. (The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... (El SPEAKER de repente se mueve más rápido de lo que puedes reaccionar)|(Sientes un pie presionando tu espalda mientras te obligan a bajar)|(Ella te pone un uniforme y te lo cierra con fuerza...)|Necesitarás entrenamiento adicional , Supongo... -This sounds like an interesting opportunity. -Esto suena como una oportunidad interesante. -(Nod excitedly) -(Asiente emocionado) -No thanks, I know what that entails... -No gracias, sé lo que eso implica... -(Shake your head) -(Sacude la cabeza) + + Gladly! ¡Con alegría! -(Accept the contract) -(Acepto el contrato) W-where did you get that uniform? (Refuse) ¿D-dónde conseguiste ese uniforme? (Rechazar) -(Refuse the contract) -(Rechazar el contrato) -Fine. I'll sign it... -Bien. lo firmaré... -(Moan and nod) -(Gemido y asiente) -Never! (PERCENT chance to avoid) -¡Nunca! (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) + + + + + + + + + + + + (The SPEAKER perks her ears as she sees you)|Glory to the blessed kitty!|Are you prepared to join us? (La SPEAKER aguza los oídos al verte)|¡Gloria al bendito gatito!|¿Estás preparado para unirte a nosotros? (The SPEAKER nods happily)|Fantastic! You just need to agree to be nice to cats.|And also we own you now. @@ -14584,16 +18612,14 @@ Never! (PERCENT chance to avoid) (El SPEAKER frunce el ceño)|¡Entonces tendremos que asegurarnos de que no vengas a hacerle daño a nadie! (The SPEAKER smiles proudly)|I knew you would pull through! (El SPEAKER sonríe con orgullo)|¡Sabía que saldrías adelante! -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(El SPEAKER de repente se mueve más rápido de lo que puedes reaccionar)|(Sientes un pie presionando tu espalda mientras te obligan a bajar)|(Ella te pone un uniforme y te lo cierra con fuerza...)|Necesitarás entrenamiento adicional , Supongo... + + Yes! I love the blessed kity! ¡Sí! Amo a la bendita gatita! -(Nod excitedly) -(Asiente emocionado) No, you guys are a bunch of weirdos. No, ustedes son un montón de bichos raros. -(Shake your head) -(Sacude la cabeza) + + Yes! I will be nice to the kitties! ¡Sí! ¡Seré amable con los gatitos! (Join them) @@ -14602,14 +18628,16 @@ Wait, I didn't agree to that! (Refuse) ¡Espera, no estuve de acuerdo con eso! (Rechazar) (Refuse) (Rechazar) + + Okay fine... I won't hurt the kitties. (Join them) Vale, bien... No haré daño a los gatitos. (Únete a ellos) -(Moan and nod) -(Gemido y asiente) -Never! (PERCENT chance to avoid) -¡Nunca! (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) + + + + + + (The SPEAKER does a curtsy)|Why hello there!|You have a wonderful bod-er, book!|Would you like to help me? (El SPEAKER hace una reverencia)|¡Hola!|¡Tienes un cuerpo maravilloso, libro!|¿Te gustaría ayudarme? (The SPEAKER smiles briefly)|You have an opportunity to model for me!|I need someone to wear all of my wonderful inventions! @@ -14628,16 +18656,8 @@ Never! (PERCENT chance to avoid) (La SPEAKER se cruza de brazos mientras las cintas se levantan a su alrededor)|Como quieras, jeje~ (The SPEAKER smiles)|Yes! Yes! Wonderful! (El SPEAKER sonríe)|¡Sí! ¡Sí! ¡Maravilloso! -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(El SPEAKER de repente se mueve más rápido de lo que puedes reaccionar)|(Sientes un pie presionando tu espalda mientras te obligan a bajar)|(Ella te pone un uniforme y te lo cierra con fuerza...)|Necesitarás entrenamiento adicional , Supongo... -Sure! -¡Seguro! -(Nod excitedly) -(Asiente emocionado) -Nope. -No. -(Shake your head) -(Sacude la cabeza) + + Sign me up! ¡Inscríbeme! (Accept the position) @@ -14646,14 +18666,20 @@ And wear tacky clothes all the time? ¿Y llevar ropa hortera todo el tiempo? (Refuse the position) (Rechazar el puesto) + + Fine... sign me up. Bien... inscríbeme. -(Moan and nod) -(Gemido y asiente) Why don't you try it on yourself! (PERCENT chance to avoid) ¿Por qué no te lo pruebas tú mismo? (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) + + + + + + + + (The SPEAKER runs up to you)|Wow! You make a fine specimen-er, I mean...|Nice to meet you! (El SPEAKER corre hacia ti)|¡Guau! Eres un buen espécimen, quiero decir... ¡Encantado de conocerte! (The SPEAKER smiles)|Now, I have something wonderful in store for you.|(She takes out a blue catsuit)|I'd like you to be my assistant! @@ -14662,8 +18688,6 @@ Why don't you try it on yourself! (PERCENT chance to avoid) (El SPEAKER se ve emocionado) | ¡Impresionante! Déjame ayudarte a ponerte el uniforme... (The SPEAKER shrugs)|It was worth a shot... (El SPEAKER se encoge de hombros)|Valió la pena intentarlo... -(The SPEAKER shrugs)|It was worth a shot... -(El SPEAKER se encoge de hombros)|Valió la pena intentarlo... (The SPEAKER looks frustrated)|I'm not... my work is not crazy!|There's just... a lot to do.|That's why I need an assistant. (El SPEAKER parece frustrado)|No soy... ¡mi trabajo no es una locura!|Hay... mucho que hacer.|Es por eso que necesito un asistente. (The SPEAKER looks frustrated)|I'm not... my work is not crazy!|We seek only knowledge! @@ -14674,30 +18698,32 @@ Why don't you try it on yourself! (PERCENT chance to avoid) (El SPEAKER vuelve a mirar feliz)|¡Gracias! ¡Estoy súper agradecida! (The SPEAKER tilts her head)|Fine then. You win.|(As you leave, you hear a 'just kidding' as she breaks a glass vial)|(A suit of blue latex envelops you!) (La SPEAKER inclina la cabeza)|Bien entonces. Tú ganas.|(Al salir, escuchas un 'es broma' mientras rompe un vial de vidrio)|(¡Te envuelve un traje de látex azul!) + + ...Hello? ...¿Hola? -(Nod excitedly) -(Asiente emocionado) You guys are crazy. Chicos, ustedes están locos. -(Shake your head) -(Sacude la cabeza) -Gladly! -¡Con alegría! + + (Accept the offer) (Acepto la oferta) -W-where did you get that uniform? (Refuse) -¿D-dónde conseguiste ese uniforme? (Rechazar) (Refuse the offer) (Rechazar la oferta) + + Fine. I'll be your assistant. Bien. Seré tu asistente. -(Moan and nod) -(Gemido y asiente) Go find someone else. (PERCENT chance to avoid) Ve a buscar a alguien más. (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) + + + + + + + + (The SPEAKER greets you)|Normally we don't meddle in mortal affairs.|But you, Outsider, are different.|Let's have a conversation. (El SPEAKER te saluda)|Normalmente no nos entrometemos en los asuntos de los mortales.|Pero tú, Forastero, eres diferente.|Tengamos una conversación. (The SPEAKER smiles warmly)|Outsiders have a lower rank in our society.|But it is a rank all the same.|You will be above your mortal peers.|What do you say? @@ -14718,30 +18744,30 @@ Ve a buscar a alguien más. (PERCENT de probabilidad de evitar) (El SPEAKER asiente y sonríe)|(Ella decora tu cuerpo con 'joyas')|Me alegro de que hayas cambiado de opinión. (The SPEAKER scoffs)|(Her magic suddenly binds you tightly in glowing ropes)|Amateur. (El SPEAKER se burla)|(Su magia de repente te ata fuertemente con cuerdas brillantes)|Aficionado. + + I'm interested. (Talk with her) Estoy interesado. (Habla con ella) -(Nod excitedly) -(Asiente emocionado) -No thanks. -No, gracias. -(Shake your head) -(Sacude la cabeza) + + I accept your gracious offer! ¡Acepto su amable oferta! (Accept) (Aceptar) I won't be a slave to you. No seré un esclavo para ti. -(Refuse) -(Rechazar) + + Fine, fine... I will accept. Bien, bien... aceptaré. -(Moan and nod) -(Gemido y asiente) No way. (PERCENT chance to avoid) De ninguna manera. (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) + + + + + + (The SPEAKER smiles at you)|Mortal. (El SPEAKER te sonríe)|Mortal. (The SPEAKER points to the ground)|Kneel before me and accept your collar. @@ -14750,8 +18776,6 @@ De ninguna manera. (PERCENT de probabilidad de evitar) (La SPEAKER chasquea los dedos)|(Un collar de frío metal negro se materializa alrededor de tu cuello)|¡Una chica que conoce su lugar! Maravilloso... (The SPEAKER scoffs)|Hmmph. Mortals... (El SPEAKER se burla)|Hmmph. mortales... -(The SPEAKER scoffs)|Hmmph. Mortals... -(El SPEAKER se burla)|Hmmph. mortales... (The SPEAKER folds her arms)|Well, look who doesn't know her place~ (La SPEAKER se cruza de brazos)|Pues mira quien no sabe su lugar~ (The SPEAKER folds her arms)|I didn't offer you a choice in the matter.|You're mine, I've decided that. @@ -14762,30 +18786,32 @@ De ninguna manera. (PERCENT de probabilidad de evitar) (El SPEAKER sonríe)|Maravilloso~|¡Ahora ven, mi mascota! (The SPEAKER scoffs and snaps her fingers)|(Metallic restraints come at you from all angles and snap in place tightly)|(A gag forces itself into your mouth)|Now then, what were we saying? (La SPEAKER se burla y chasquea los dedos)|(Las ataduras metálicas vienen hacia ti desde todos los ángulos y se ajustan firmemente en su lugar)|(Una mordaza se mete a la fuerza en tu boca)|Ahora bien, ¿qué estábamos diciendo? + + Yes? ¿Sí? -(Nod excitedly) -(Asiente emocionado) I don't talk to monsters! ¡Yo no hablo con monstruos! -(Shake your head) -(Sacude la cabeza) + + O-okay. (Kneel) O-bien. (Arrodillarse) (Kneel) (Arrodillarse) I refuse! ¡Me niego! -(Refuse) -(Rechazar) + + Then it looks like I have no choice. (Join her) Entonces parece que no tengo elección. (Únete a ella) -(Moan and nod) -(Gemido y asiente) I will never bow to you! (PERCENT chance to avoid) ¡Nunca me inclinaré ante ti! (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) + + + + + + (The SPEAKER waves)|You seem like an exceptional individual.|What do you think of joining the Guild? (El SPEAKER saluda)|Pareces una persona excepcional.|¿Qué piensas de unirte al Gremio? (The SPEAKER smiles)|Excellent! I'll put in a word with the Guild.|Do note: this will affect your reputation with certain bad actors. @@ -14802,34 +18828,32 @@ I will never bow to you! (PERCENT chance to avoid) (La SPEAKER inclina la cabeza)|Jaja, muy divertido.|Ambos sabemos que no eres uno de esos... ¿verdad? (The SPEAKER frowns and readies for battle)|My instincts were right. (El SPEAKER frunce el ceño y se prepara para la batalla)|Mi instinto era correcto. -(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. -(El SPEAKER saca un pergamino mágico y lo firma)|(El pergamino se desvanece en el éter)|Buena suerte, autónomo. (The SPEAKER suddenly strikes you to the floor)|(You feel a foot on your back as she ties you in a strict rope hogtie...)|(She dusts off her hands)|We'll have a talk when you get out of that, okay? (El SPEAKER de repente te golpea contra el suelo)|(Sientes un pie en tu espalda mientras te ata con una cuerda estricta...)|(Ella se quita el polvo de las manos)|Hablaremos cuando llegues. fuera de eso, ¿de acuerdo? -This sounds like an interesting opportunity. -Esto suena como una oportunidad interesante. -(Nod excitedly) -(Asiente emocionado) + + I have no interest in joining the guild. No tengo ningún interés en unirme al gremio. -(Shake your head) -(Sacude la cabeza) -Gladly! -¡Con alegría! -(Accept the offer) -(Acepto la oferta) + + What if I am one of those bad actors? (Refuse) ¿Y si soy uno de esos malos actores? (Rechazar) -(Refuse the offer) -(Rechazar la oferta) + + Fine... (Join) Bien... (Únete) -(Moan and nod) -(Gemido y asiente) Go away. (PERCENT chance to avoid) Irse. (PERCENT de probabilidad de evitar) (Frown at her) (PERCENT chance to avoid) (Fruncirle el ceño) (PERCENT de posibilidades de evitar) + + + + + + + + (The SPEAKER beeps)|Prisoner 74121 identified.|Subject not registered in database. (El SPEAKER emite un pitido)|Prisionero 74121 identificado.|Sujeto no registrado en base de datos. (The SPEAKER beeps)|Confirming database entry.|Say 'I will be a good girl' to enter database. @@ -14850,6 +18874,8 @@ Irse. (PERCENT de probabilidad de evitar) (El SPEAKER emite un pitido y parpadea sus luces) | (The SPEAKER blasts you with a stunning ray and captures you)|Target neutralized. (El SPEAKER te lanza un rayo aturdidor y te captura)|Objetivo neutralizado. + + Please register me. Por favor regístreme. (Stop to talk to the robot) @@ -14858,32 +18884,32 @@ Prisoner 74121? You must be mistaken... Prisionero 74121? Debes estar equivocado... (Avoid the robot) (Evitar el robot) + + Prisoner 74121 reporting. I will be a good girl. Informe del prisionero 74121. Seré una buena chica. -(Accept the contract) -(Acepto el contrato) Actually, I am an administrator. (Refuse) En realidad, soy un administrador. (Rechazar) -(Refuse the contract) -(Rechazar el contrato) + + I'm sorry, I will be a good girl! ¡Lo siento, seré una buena chica! -(Moan and nod) -(Gemido y asiente) What? (PERCENT chance to avoid) ¿Qué? (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) + + + + + + (The SPEAKER smiles)|I used to be an adventurer like you.|Then I joined up with the Dragonhearts! (El SPEAKER sonríe)|Solía ​​ser un aventurero como tú.|¡Luego me uní a los Dragonhearts! (The SPEAKER clears her throat)|Well, we're actually recruiting!|You're free to join us if you agree to fight for justice! (La SPEAKER se aclara la garganta)|Bueno, ¡en realidad estamos reclutando!|¡Eres libre de unirte a nosotros si aceptas luchar por la justicia! (The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! (El SPEAKER te da un firme apretón de manos)|¡Bienvenida a la hermandad, aventurera! -(The SPEAKER tilts her head and shrugs)|Ah well. -(La SPEAKER inclina la cabeza y se encoge de hombros)|Ah, bueno. -(The SPEAKER nods)|Fair enough. -(El SPEAKER asiente)|Muy bien. +### (The SPEAKER tilts her head and shrugs)|Ah well. + (The SPEAKER frowns)|What is it?|You're not an enemy of justice, are you? (El SPEAKER frunce el ceño)|¿Qué pasa?|No eres enemigo de la justicia, ¿verdad? (The SPEAKER frowns)|...If you won't fight for justice, that makes you an enemy of justice. @@ -14894,40 +18920,36 @@ What? (PERCENT chance to avoid) (El SPEAKER se ríe)|Jeje, solo estoy bromeando contigo.|De todos modos, ¡bienvenida a la hermandad! (The SPEAKER grabs you and ties you up)|You won't be making trouble like that any time soon. (El SPEAKER te agarra y te ata)|No vas a causar problemas así en el corto plazo. + + I wish I could join you. Ojalá pudiera unirme a ti. -(Nod excitedly) -(Asiente emocionado) Please go away. Por favor vete. (Back away) (Retroceder) + + Great! Sign me up! ¡Excelente! ¡Inscríbeme! (Join) (Unirse) Fight for justice? Sounds restrictive... ¿Luchar por la justicia? Suena restrictivo... -(Back away) -(Retroceder) + + Actually, justice doesn't sound bad! En realidad, ¡la justicia no suena mal! -(Moan and nod) -(Gemido y asiente) What are you going to do about it? (PERCENT chance to avoid) ¿Qué vas a hacer al respecto? (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) + + + + (The SPEAKER waves and calls you over)|Looks like you've made a name for yourself.|What do you say to a little agreement? (El SPEAKER saluda y lo llama)|Parece que se ha hecho un nombre.|¿Qué le parece a un pequeño acuerdo? (The SPEAKER clears her throat)|Well, you're currently on our turf.|But we're willing to cut you some slack.|You just have to agree not to attack any of us. (La SPEAKERA se aclara la garganta) Bueno, actualmente está en nuestro territorio. Pero estamos dispuestos a darle un poco de holgura. Solo tiene que aceptar no atacar a ninguno de nosotros. -(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! -(El SPEAKER te da un firme apretón de manos)|¡Bienvenida a la hermandad, aventurera! -(The SPEAKER tilts her head and shrugs)|Ah well. -(La SPEAKER inclina la cabeza y se encoge de hombros)|Ah, bueno. -(The SPEAKER nods)|Fair enough. -(El SPEAKER asiente)|Muy bien. (The SPEAKER frowns)|Criminals? Girl, we ARE the law around these parts~ (El SPEAKER frunce el ceño)|¿Criminales? Chica, SOMOS la ley por estos lados~ (The SPEAKER grins)|I like your spunk, girl.|But you're kidding, right? @@ -14938,14 +18960,16 @@ What are you going to do about it? (PERCENT chance to avoid) (El SPEAKER se ríe)|¡Aquí hay un brindis por una nueva asociación! (The SPEAKER catches you and trusses you up)|Maybe we'll just have to find you an owner, then!|Hehe. (El SPEAKER te atrapa y te ata)|¡Tal vez tengamos que encontrarte un dueño, entonces!|Jeje. + + I'm all ears. Soy todo oídos. (Listen closely) (Escucha atentamente) I don't deal with criminals. No trato con criminales. -(Back away) -(Retroceder) + + It's a deal! ¡Es un trato! (Mumble in agreement) @@ -14954,14 +18978,22 @@ You don't understand. This is MY turf. no entiendes Este es MI territorio. (Scoff at her through your gag) (Búrlate de ella a través de tu mordaza) + + Haha, just kidding. I'm with you. Jaja solo bromeo. Estoy contigo. -(Moan and nod) -(Gemido y asiente) Put 'em up! (PERCENT chance to avoid) ¡Póngalos arriba! (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) + + + + + + + + + + (The SPEAKER stops walking and speaks)|You there!|It seems your attunement with magic is high.|Join us. (El SPEAKER deja de caminar y habla)|¡Tú ahí!|Parece que tu sintonía con la magia es alta.|Únete a nosotros. (The SPEAKER nods calmly)|We will use some special equipment to increase your attunement.|Put these on. @@ -14982,30 +19014,30 @@ Put 'em up! (PERCENT chance to avoid) (El SPEAKER asiente.) Ha tomado una sabia decisión. (The SPEAKER uses magic to force you.)|There. Try not to succumb to your desires too much. (El SPEAKER usa magia para forzarte.)|Ya está. Trate de no sucumbir demasiado a sus deseos. + + Um... sure? ¿UM, seguro? -(Nod excitedly) -(Asiente emocionado) Get away from me! ¡Alejarse de mí! -(Shake your head) -(Sacude la cabeza) + + Shiny... (Put them on) Brillante... (Póntelos) (Let her put them on you) (Que te los ponga) What? No way! (Refuse) ¿Qué? ¡De ninguna manera! (Rechazar) -(Refuse the contract) -(Rechazar el contrato) + + Okay, I will wear them... Está bien, me los pondré... -(Moan and nod) -(Gemido y asiente) Monster! (PERCENT chance to avoid) ¡Monstruo! (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) + + + + (The SPEAKER does a short bow as she sees you)|Um... hi!|I have a letter for you... (El SPEAKER hace una pequeña reverencia cuando te ve)|Um... ¡hola!|Tengo una carta para ti... (The letter is a contract from the College)|(They want you to sign up as an instructor for apprentices)|(The SPEAKER looks at you nervously.) @@ -15014,8 +19046,6 @@ Monster! (PERCENT chance to avoid) (El SPEAKER suspira aliviado)|Eso está bien...|(Firmas el contrato y se desvanece en el éter) (The SPEAKER whimpers)|What will I tell them... (La SPEAKER gime)|Qué les voy a decir... -(The SPEAKER whimpers)|What will I tell them... -(La SPEAKER gime)|Qué les voy a decir... (The SPEAKER glares at you)|It's an important message concerning your standing!|With the College! (El SPEAKER lo mira fijamente)|¡Es un mensaje importante sobre su posición!|¡Con el Colegio! (The SPEAKER blushes)|Well...|I was told we would make changes to your academic record,|should you refuse... @@ -15026,84 +19056,50 @@ Monster! (PERCENT chance to avoid) (El SPEAKER asiente y sonríe)|¡Muchas gracias!|No sé qué hubiera hecho si me hubiera dicho que no... (The SPEAKER frowns and waves her wand)|(A bunch of ropes come out of the ground and restrain you)|Hmmph. I'll tell them you signed it anyway.|I can't go back empty handed. (La SPEAKER frunce el ceño y agita su varita)|(Un montón de cuerdas salen del suelo y te sujetan)|Hmmph. Les diré que lo firmaste de todos modos. No puedo volver con las manos vacías. + + Thank you for delivering it. (Read it) Gracias por entregarlo. (léelo) (Read the letter) (Lee la carta) There's nothing good inside that letter. No hay nada bueno dentro de esa carta. -(Shake your head) -(Sacude la cabeza) + + Great! Wonderful! ¡Excelente! ¡Maravilloso! -(Accept the contract) -(Acepto el contrato) There is no way I'd accept. No hay forma de que acepte. -(Refuse the contract) -(Rechazar el contrato) + + Fine. I'll read it. (Join the College as an instructor) Bien. lo leeré (Únete al Colegio como instructor) -(Moan and nod) -(Gemido y asiente) This is unethical! I refuse! (PERCENT chance to avoid) ¡Esto no es ético! ¡Me niego! (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) -(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(El SPEAKER hace una breve reverencia cuando lo ve)|Saludos.|Parece que posee cualidades que podemos aprovechar.|Me complacería ofrecerle un puesto... -(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(La SPEAKER sonríe brevemente antes de aclararse la garganta)|¡Fantástico!|Tengo tu uniforme aquí mismo... -(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(El SPEAKER te abrocha el cinturón, tirando del cordón con mucha fuerza...)|(Oyes el clic de unos cuantos candados...)|Maravilloso. Su primera tarea es limpiar este piso. Buena suerte. -(The SPEAKER tilts her head and shrugs)|We are always prepared... -(La SPEAKER inclina la cabeza y se encoge de hombros)|Siempre estamos preparados... -(The SPEAKER nods)|Fair enough. -(El SPEAKER asiente)|Muy bien. -(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(El SPEAKER sonríe y saca un vestido diminuto)|¿Puedo recordarte que has hecho bastantes... enemigos?|Sería una pena si te encontraras con uno de ellos... -(The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(El SPEAKER asiente con orgullo)|Estamos dispuestos a hacer algunos cambios en nuestros registros~ -(The SPEAKER frowns)|You won't know what hit you. -(El SPEAKER frunce el ceño)|No sabrás qué te golpeó. -(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(El SPEAKER sonríe)|Me alegro de que haya tomado la decisión correcta.|Ahora, su primera tarea será limpiar este piso.|Buena suerte. -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(El SPEAKER de repente se mueve más rápido de lo que puedes reaccionar)|(Sientes un pie presionando tu espalda mientras te obligan a bajar)|(Ella te pone un uniforme y te lo cierra con fuerza...)|Necesitarás entrenamiento adicional , Supongo... -This sounds like an interesting opportunity. -Esto suena como una oportunidad interesante. -(Nod excitedly) -(Asiente emocionado) -No thanks, I know what that entails... -No gracias, sé lo que eso implica... -(Shake your head) -(Sacude la cabeza) -Gladly! -¡Con alegría! -(Accept the contract) -(Acepto el contrato) -W-where did you get that uniform? (Refuse) -¿D-dónde conseguiste ese uniforme? (Rechazar) -(Refuse the contract) -(Rechazar el contrato) -Fine. I'll sign it... -Bien. lo firmaré... -(Moan and nod) -(Gemido y asiente) -Never! (PERCENT chance to avoid) -¡Nunca! (PERCENT de probabilidad de evitar) -(Shake your head and frown) (PERCENT chance to avoid) -(Sacude la cabeza y frunce el ceño) (PERCENT de posibilidades de evitar) -(The SPEAKER waves)|Greetings,|I manufacture all sorts of goods.|Would you like to buy some? -(El SPEAKER saluda)|Saludos,|Fabricamos todo tipo de productos.|¿Le gustaría comprar algunos? + + + + + + + + + + + + + + +### (The SPEAKER waves)|Greetings,|I manufacture all sorts of weapons.|Would you like to buy some? + (The SPEAKER drops her hammer and cracks her knuckles)|Put em up! (El SPEAKER deja caer su martillo y se hace crujir los nudillos)|¡Póngalos arriba! (The SPEAKER looks at you.)|But you already have one? (El SPEAKER te mira.)|¿Pero ya tienes uno? (The SPEAKER folds her arms)|I don't do charity, ma'am. (La SPEAKER se cruza de brazos)|Yo no hago caridad, señora. -(The SPEAKER nods)|See this magic rune here?|Stick it in any lock, and it opens, just like that!|Only works once, though. -(El SPEAKER asiente)|¿Ve esta runa mágica aquí?|Péguela en cualquier cerradura y se abrirá, ¡así como así!|Sin embargo, solo funciona una vez. +### (The SPEAKER smirks)|Another adventurer found this lying around.|I wonder who it's for~ + (The SPEAKER smiles)|Now don't be up to no good~|Or else I'll have to put you in cuffs... (El SPEAKER sonríe)|Ahora no intentes nada bueno~|O tendré que ponerte las esposas... (The SPEAKER nods)|A versatile weapon. One of my favorites. @@ -15114,10 +19110,136 @@ Never! (PERCENT chance to avoid) (El SPEAKER asiente)|Es útil tener uno de estos cerca. (The SPEAKER nods)|The best defense is a good offense. (El SPEAKER asiente)|La mejor defensa es un buen ataque. -(The SPEAKER looks puzzled)|Don't know why you want 'em, but sure. -(El SPEAKER parece desconcertado)|No sé por qué los quiere, pero claro. -(The SPEAKER approaches you with an offer)|Greetings! I am a potion trader.|Give me your strongest potions!|I pay cash! -(El SPEAKER se le acerca con una oferta)|¡Saludos! Soy comerciante de pociones. ¡Dame tus pociones más fuertes! ¡Pago en efectivo! +### (The SPEAKER nods)|Speak softly and carry a big hammer. + +### (The SPEAKER smiles)|Can never be too prepared~ + +### (The SPEAKER waves)|Hi.|I make armor. Only the finest.|I don't sell it cheap, unlike my twin. + +### (The SPEAKER looks at you.)|Do you have a dealer's license? + +### (The SPEAKER folds her arms)|I don't do charity, girl. + +### (The SPEAKER nods)|The most high-impact of sports bras. + +### (The SPEAKER nods)|These aren't for hiking, just so you know. + +### (The SPEAKER nods)|I've been thinking about making a lockable version... + +### (The SPEAKER nods)|These are sensibly sized, unlike those you see in movies. + +### (The SPEAKER nods)|Sometimes you just have to be flexible. + +### (The SPEAKER nods)|For when you value style over protection... + +### (The SPEAKER nods)|You can never be too careful. + +### (The SPEAKER chuckles)|I hear female adventurers like to wear these for protection.|Or something like that. + +### (The SPEAKER waves)|Hello miss!|What brings you here today? + +### (The SPEAKER folds her arms)|That's not very nice! + +### (The SPEAKER looks at you and smiles.)|Don't you already have one? + +### (The SPEAKER folds her arms)|I don't do charity, miss. + +### (The SPEAKER nods)|Could use a higher heel... + +### (The SPEAKER nods)|Back to the basics. + +### (The SPEAKER smiles)|I see you have good taste! + +### (The SPEAKER nods)|It's a classic!|What's not to like? + +### (The SPEAKER smiles)|It's an upgrade for your best friend! + +### (The SPEAKER shrugs)|It's big and bulky, but I guess it has its uses. + +### (The SPEAKER giggles)|Smile for the camera! + +### (The SPEAKER nods)|It's like mana, but much more portable!|It powers duplication runes so you don't run out of arrows. + +### (The SPEAKER giggles)|I like to include these as a gift with every purchase~ + +### (The SPEAKER whispers in a hushed tone)|Welcome.|I'm not supposed to be here, so|if you don't want to do business, get out.|I only sell in packs of 10, by the way. + +### (The SPEAKER tries to get away)|Damn! + +### (The SPEAKER looks you over and shrugs)|Don't joke around. + +### (The SPEAKER folds her arms)|Don't have money? Better go find some. + +### (The SPEAKER produces a bag of stuffings)|Quite the staple. + +### (The SPEAKER produces a bundle of rope)|Aren't you quite the artist.|That was rhetorical. + +### (The SPEAKER produces some bondage tape)|It only sticks to itself, doesn't leave residue.|Gotta be responsible, you know? + +### (The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally... + +### (The SPEAKER produces a bag of cloth strips)|How tight you tie it depends on how bratty your target is. + + + +### (The SPEAKER rattles as she waves)|Heya!|Looking to buy some ancient treasures?|My antiques shop has just what you need! + +### (The SPEAKER cracks her exposed knuckles)|So you've seen through my disguise... + +### (The SPEAKER looks at you.)|Yours is just fine, dear. + +### (The SPEAKER chuckles)|You don't have enough gold for that, dear.|Try coming back after a good round of looting! + +### (The SPEAKER nods)|My great grandmother used to wear these. + +### (The SPEAKER nods)|Adventurers used to love a good burlap sack.|Nowadays they've got that newfangled magic instead... + +### (The SPEAKER nods)|Back in my day, they used candles for light!|These let you put them out to save wax. + +### (The SPEAKER giggles)|I had all sorts of use for this back on the farm. + +### (Select an item to buy from the SPEAKER) + +### (Attack the SPEAKER?) + +### (Buy ITM# for IC# gp) (Owned: AMNT#) + +### (The SPEAKER sells you the item) + +### (The SPEAKER shakes her head)|I think you'd be better off without that~ + +### (The SPEAKER looks embarassed)|I can't sell you that, miss... + +### (The SPEAKER blushes)|Actually, I was saving that for myself... + +### (The SPEAKER grins)|Good girls don't need one of those~ + +### (The SPEAKER buzzes)|Error, insufficient access privileges. + +### (The SPEAKER giggles at your empty pockets)|You can't afford such things, silly~ + +### (The SPEAKER pauses nervously)|Um miss, I don't think you can afford that... + +### (The SPEAKER frowns)|What does this look like, a charity? + +### (The SPEAKER smules)|You'll have to secure that by other means, I think~ + +### (The SPEAKER beeps)|Insufficient currency. + +### (Look at what she wants to buy) + +You're giving me everything you have. +Me estás dando todo lo que tienes. +(Flail threateningly at her) +(Golpea amenazadoramente hacia ella) +(Do it) +(Hazlo) +(Back off) +(Apártate) + + +### (The SPEAKER approaches you with an offer)|Greetings! I am the potion seller.|I buy and sell only the strongest potions!| + (The SPEAKER doesn't look surprised)|Okay, just let me set these down real quick... (El SPEAKER no parece sorprendido) Vale, déjame dejar esto muy rápido... (The SPEAKER smiles)|A spellcaster will have great use for this! @@ -15132,6 +19254,8 @@ Never! (PERCENT chance to avoid) (El SPEAKER sonríe)|Dicen que un té amargo cura todos los males... (The SPEAKER smiles)|An empty flask?|...Oh. (El SPEAKER sonríe)|¿Un frasco vacío?|...Oh. + + (The SPEAKER approaches you)|My greetings, Outsider!|My throat is parched and I seek the bounties of nature.|Do you have what I seek? (El SPEAKER se acerca a ti)|¡Mis saludos, forastero!|Mi garganta está reseca y busco las bondades de la naturaleza.|¿Tienes lo que busco? (The SPEAKER doesn't look surprised)|Then let us have a battle of wits! @@ -15148,18 +19272,48 @@ Never! (PERCENT chance to avoid) (El SPEAKER le agradece)|Siento su esencia fluir.|Tiene mi agradecimiento. (The SPEAKER thanks you)|I can feel a great sadness emanating from it.|It calls for warmth. (El SPEAKER le da las gracias)|Puedo sentir una gran tristeza emanando de él.|Requiere calor. + + +### (The SPEAKER munches on a donut)|Gee I'm starving!|You wouldn't have something to eat, would you? + +### (The SPEAKER throws a donut in your face)|Ha! Take that! + +### (The SPEAKER smiles)|Yum! Thank you! + +### (The SPEAKER smiles)|Crunchy! My favorite! + +### (The SPEAKER tilts her head)|It smells funny...|Still, it'd be a shame for it to go to waste! + (The SPEAKER approaches you with an offer)|Hello!|I am searching for magical scrolls.|Would you happen to have any? (El SPEAKER se le acerca con una oferta)|¡Hola!|Estoy buscando pergaminos mágicos.|¿Tiene alguno? (The SPEAKER doesn't look surprised)|Rude! (El SPEAKER no parece sorprendido)|¡Grosero! (The SPEAKER smiles)|Thank you! (El SPEAKER sonríe)|¡Gracias! -(The SPEAKER smiles)|Thank you! -(El SPEAKER sonríe)|¡Gracias! -(The SPEAKER smiles)|Thank you! -(El SPEAKER sonríe)|¡Gracias! (The SPEAKER raises a brow)|Thank you! This one is rare! (El SPEAKER levanta una ceja)|¡Gracias! ¡Este es raro! + + +### (The SPEAKER invites you to a friendly chat)|Back in my day I used to go visit dungeons all the time|But these days I get so lost in my studies...|Say, you don't happen to have some magic supplies on you? + +### (The SPEAKER shrugs)|I guess that's how it is. + +### (The SPEAKER smiles)|Always nice to have some of these! + +### (The SPEAKER smiles)|I can never get enough of these. + +### (The SPEAKER smiles)|Elemental magic, interesting stuff. + +### (The SPEAKER tilts her head)|Why is it wet? + +### (The SPEAKER smiles)|Gladly, this will be useful to my studies. + +### (The SPEAKER smiles)|My legs don't carry me like they used to~ + +### (The SPEAKER smiles)|Always good to have somebody to talk to. + +### (The SPEAKER giggles)|Living dangerously, I see~ + (The SPEAKER approaches you with an offer)|Hey girl~|You seem like the explorer type.|Happen to have any good finds? (El SPEAKER se te acerca con una oferta)|Oye chica~|Pareces del tipo explorador.|¿Tienes algún buen hallazgo? (The SPEAKER frowns)|Well then. @@ -15172,92 +19326,172 @@ Never! (PERCENT chance to avoid) (El SPEAKER frunce el ceño)|Lo aceptaré, supongo... (The SPEAKER smiles)|Oooh~!|I love technology! (El SPEAKER sonríe)|¡Oooh~!|¡Me encanta la tecnología! +### (The SPEAKER nods)|A rare find! + + + (The SPEAKER surprises you)|Greetings, traveler.|I am looking for tools to aid in my mission. (El SPEAKER lo sorprende)|Saludos, viajero.|Estoy buscando herramientas que me ayuden en mi misión. (The SPEAKER doesn't look surprised)|That's how it is, then. (El SPEAKER no se ve sorprendido)|Entonces es así. (The SPEAKER bows)|Always be prepared. (El SPEAKER hace una reverencia)|Esté siempre preparado. +### (The SPEAKER bows)|Always be extra prepared. + (The SPEAKER bows)|A bit dangerous, but I'll take it. (El SPEAKER se inclina)|Un poco peligroso, pero lo aceptaré. (The SPEAKER bows)|A tool of the trade. (El SPEAKER se inclina)|Una herramienta del oficio. (The SPEAKER bows)|A most valuable find. (El SPEAKER se inclina)|Un hallazgo muy valioso. + + +### (The SPEAKER tilts her shades)|I like to think of myself as a dealer in quality tools. + +### (The SPEAKER reaches for her hip)|I'd think twice if I were you... + +### (The SPEAKER smiles)|Nevermere keeps a tight grip on their blueprints.|Thank you. + +### (The SPEAKER smiles)|There's always a buyer.|That's just the way things are. + +### (The SPEAKER smiles)|Portable. Sustainable. A smart choice. + +### (The SPEAKER smiles)|That's what I'm talking about. + +### (The SPEAKER nods)|Yeah... that'll do. + +### (The SPEAKER looks somewhat crazed)|I'm looking for some heavy ordnance in order to...|...add to my collection.|Anyway, got any bombs? + +### (The SPEAKER reaches for her backpack)|I'll blow you away! + +### (The SPEAKER shrugs)|Cute fireworks, I suppose... + +### (The SPEAKER giggles)|That's what I'm talking about! + +### (The SPEAKER rubs her hands together)|Excellent... + +### (The SPEAKER smiles)|Yes! I can make more bombs! + +### (The SPEAKER takes a whiff of her cigar)|Hey friend. Im in the market for some 'tools,'|...if you catch my frift. + +### (The SPEAKER pulls out a knife)|Thought so. You won't take me that easily! + +### (The SPEAKER nods)|Could help out in a bind. + +### (The SPEAKER chuckles)|Lights out, eh... + +### (The SPEAKER nods)|I could use one of these! + +### (The SPEAKER smiles)|For when things go south... + +### (The SPEAKER smiles)|You can never be too safe. + +### (A distracted SPEAKER munches on a cookie) + +### (The SPEAKER continues eating her snack) + +### (The SPEAKER plucks the cookie out of your hand)|My favorite! + +### (The SPEAKER eats the brownies slowly, savoring every bite)|Kind of dense, but really good! + +### (The SPEAKER takes a bite out of the donut)|A bit heavy on the sprinkles... + +### (The SPEAKER blushes)|This is... my new favorite. + +### (The SPEAKER's eyes widen as she wolfs down the golden cookie)|Truly divine... + + + +### (The SPEAKER is reading a kinky fashion magazine)|Why hello gorgeous~|You seem like you know your way around fashion.|Say, I've been on the hunt for unique designs... + +### (The SPEAKER pouts)|I don't like your attitude. + +### (The SPEAKER smiles)|Classic vintage!|I approve~ + +### (The SPEAKER giggles)|A girls best friend, eh? + +### (The SPEAKER gasps)|What an amazing find!!! + (The SPEAKER runs up to you)|Hello!|You wouldn't happen to have seen any ghosts lately?|I'm gathering evidence! (El SPEAKER corre hacia ti)|¡Hola!|¿No habrás visto fantasmas últimamente?|¡Estoy reuniendo pruebas! (The SPEAKER gasps)|You wouldn't! (El SPEAKER jadea) ¡No lo harías! (The SPEAKER shakes your hand)|Ah! Ghosts love these! (El SPEAKER le da la mano)|¡Ah! ¡A los fantasmas les encantan! -(The SPEAKER smiles)|This looks like strong evidence for my investigation! -(El SPEAKER sonríe)|¡Esto parece una fuerte evidencia para mi investigación! -(The SPEAKER grins)|Woah! That's so cool! -(El SPEAKER sonríe)|¡Vaya! ¡Eso es tan cool! -You're giving me everything you have. -Me estás dando todo lo que tienes. -(Flail threateningly at her) -(Golpea amenazadoramente hacia ella) -(Do it) -(Hazlo) -(Back off) -(Apártate) -(Sell Item0 for ItemCost0 gp) -(Vender Item0 por ItemCost0 gp) -(Sell Item1 for ItemCost1 gp) -(Vender Item1 por ItemCost1 mo) -(Sell Item2 for ItemCost2 gp) -(Vender Item2 por ItemCost2 mo) -(Sell Item3 for ItemCost3 gp) -(Vender Item3 por ItemCost3 gp) -(Sell Item4 for ItemCost4 gp) -(Vender Item4 por ItemCost4 gp) -(Sell Item5 for ItemCost5 gp) -(Vender Item5 por ItemCost5 mo) -(Sell Item6 for ItemCost6 gp) -(Vender Item6 por ItemCost6 mo) -(Sell Item7 for ItemCost7 gp) -(Vender Item7 por ItemCost7 mo) -(Sell Item8 for ItemCost8 gp) -(Vender Item8 por ItemCost8 mo) -(Sell Item9 for ItemCost9 gp) -(Vender Item9 por ItemCost9 mo) -(Buy Item0 for ItemCost0 gp) -(Comprar Item0 por ItemCost0 gp) -(Buy Item1 for ItemCost1 gp) -(Comprar Item1 por ItemCost1 gp) -(Buy Item2 for ItemCost2 gp) -(Comprar Item2 por ItemCost2 gp) -(Buy Item3 for ItemCost3 gp) -(Comprar Item3 por ItemCost3 gp) -(Buy Item4 for ItemCost4 gp) -(Comprar Item4 por ItemCost4 gp) -(Buy Item5 for ItemCost5 gp) -(Comprar Item5 por ItemCost5 gp) -(Buy Item6 for ItemCost6 gp) -(Compre Item6 por ItemCost6 gp) -(Buy Item7 for ItemCost7 gp) -(Compre Item7 por ItemCost7 gp) -(Buy Item8 for ItemCost8 gp) -(Compra Item8 por ItemCost8 gp) -(Buy Item9 for ItemCost9 gp) -(Compra Item9 por ItemCost9 gp) +(The SPEAKER smiles)|This looks like strong evidence for my investigation! +(El SPEAKER sonríe)|¡Esto parece una fuerte evidencia para mi investigación! +(The SPEAKER grins)|Woah! That's so cool! +(El SPEAKER sonríe)|¡Vaya! ¡Eso es tan cool! + + +### (Look at what she has to sell) + +### (Sell Item0 for ItemCost0 gp) (Owned: AMNT0) + +### (Sell Item1 for ItemCost1 gp) (Owned: AMNT1) + +### (Sell Item2 for ItemCost2 gp) (Owned: AMNT2) + +### (Sell Item3 for ItemCost3 gp) (Owned: AMNT3) + +### (Sell Item4 for ItemCost4 gp) (Owned: AMNT4) + +### (Sell Item5 for ItemCost5 gp) (Owned: AMNT5) + +### (Sell Item6 for ItemCost6 gp) (Owned: AMNT6) + +### (Sell Item7 for ItemCost7 gp) (Owned: AMNT7) + +### (Sell Item8 for ItemCost8 gp) (Owned: AMNT8) + +### (Sell Item9 for ItemCost9 gp) (Owned: AMNT9) + +### (Buy Item0 for ItemCost0 gp) (Owned: AMNT0) + +### (Buy Item1 for ItemCost1 gp) (Owned: AMNT1) + +### (Buy Item2 for ItemCost2 gp) (Owned: AMNT2) + +### (Buy Item3 for ItemCost3 gp) (Owned: AMNT3) + +### (Buy Item4 for ItemCost4 gp) (Owned: AMNT4) + +### (Buy Item5 for ItemCost5 gp) (Owned: AMNT5) + +### (Buy Item6 for ItemCost6 gp) (Owned: AMNT6) + +### (Buy Item7 for ItemCost7 gp) (Owned: AMNT7) + +### (Buy Item8 for ItemCost8 gp) (Owned: AMNT8) + +### (Buy Item9 for ItemCost9 gp) (Owned: AMNT9) + (The SPEAKER appears in a flash of light)|I come in the name of the Goddess.|I presume you need my aid?|(She will remain and help you with restraints for 50 turns) (El SPEAKER aparece en un destello de luz)|Vengo en nombre de la Diosa.|¿Supongo que necesitas mi ayuda?|(Ella permanecerá y te ayudará con las ataduras durante 50 turnos) (The SPEAKER gives you two knives)|Don't hurt yourself with these, okay? (El SPEAKER te da dos cuchillos)|No te lastimes con estos, ¿de acuerdo? (The SPEAKER gives you three picks)|I don't know how you plan to use these... (El SPEAKER te da tres selecciones)|No sé cómo piensas usar estas... -(The SPEAKER reluctantly gives you a magic key)|Okay, these don't grow on trees... -(El SPEAKER te da una llave mágica a regañadientes)|Está bien, estos no crecen en los árboles... +### (The SPEAKER reluctantly gives you a magic key)|Okay, but remember that these are rare and valuable. + +### (The SPEAKER looks impressed with your predicament)|No angel can remove these without a divine blessing.|Perhaps you should apply for one? *snickers* + +### (The SPEAKER looks impressed with your predicament)|I won't get between you and your quest duties! + +### (The SPEAKER looks impressed with your predicament)|Since you are Blessed by a goddess, I can help you.|(She performs a short prayer and a random divine lock comes off) + (Ask for 2 knives) (Pedir 2 cuchillos) (Ask for 3 lockpicks) (Pedir 3 ganzúas) (Ask for a magic key) (Pide una llave mágica) +### (Ask for help with a divine lock) + There is no valid space next to you! ¡No hay espacio válido a tu lado! + + (You approach the SPEAKER) (Te acercas al SPEAKER) (Threaten) @@ -15270,100 +19504,246 @@ There is no valid space next to you! (No importa...) (You decide not to) (Tú decides no hacerlo) + + (Retaliate) (Tomar represalias) -(Really attack? You will be justified and won't take a rep penalty)|(You will still lose rep if you capture her) -(¿De verdad atacas? Estarás justificado y no recibirás una penalización de repetición)|(Perderás reputación si la capturas) -(Attack her) -(atacarla) -(Never mind...) -(No importa...) -(You decide not to) -(Tú decides no hacerlo) +### (Really attack? You will be justified and won't take an immediate rep penalty) + (Sneak Attack) (Ataque furtivo) (Really attack? Target is unaware and will be stunned 1 turn.) (¿En serio atacar? El objetivo no se da cuenta y quedará aturdido 1 turno). -(Attack her) -(atacarla) -(Never mind...) -(No importa...) -(You decide not to) -(Tú decides no hacerlo) -(Walk past) -(Pasar por el frente) -(Walk past) -(Pasar por el frente) -(Walk past multiple allies) -(Camina más allá de múltiples aliados) -(Never mind...) -(No importa...) -(Confirm? You will walk through her for a few turns) -(¿Confirmar? Caminarás a través de ella por algunas vueltas) -(...) -(...) -(Stop following me) -(Deje de seguirme) + + +### (Let me through!!) + +### (Walk past this unit) + +### (Walk past all units) + +### (Confirm? You will move through her for a few turns) + (Stop following me) (Deje de seguirme) -(Never mind...) -(No importa...) (Confirm? You will have to find the SPEAKER again.) (¿Confirmar? Tendrá que encontrar el SPEAKER nuevamente). (You decide you still need the help) (Usted decide que todavía necesita la ayuda) (The SPEAKER refuses to follow your orders) (El SPEAKER se niega a seguir sus órdenes) + + +### (Remove BINDAMNT binding from her) UNTIETURNS + +### (You remove BINDANTPREV binding from the SPEAKER, excluding actual bindings)|(Use the 'Truss em Up' skill to remove bindings) + +### (Give her a restoration item) + +### (The SPEAKER appreciates the thought!) + +### Must have HP to untie. + +### (AMNT turns) + +### (AMNT turn) + (Follow me) (Sígueme) -(Follow me) -(Sígueme) -(Never mind...) -(No importa...) (The SPEAKER starts following you) (El SPEAKER comienza a seguirte) (You decide you don't need the help) (Tú decides que no necesitas la ayuda) -(The SPEAKER refuses to follow your orders) -(El SPEAKER se niega a seguir sus órdenes) -(Stay here) -(Quédate aquí) -(Stay here) -(Quédate aquí) -(Never mind...) -(No importa...) + + +### (Hold still) + (The SPEAKER follows your orders) (El SPEAKER sigue sus órdenes) -(...) -(...) -(The SPEAKER refuses to follow your orders) -(El SPEAKER se niega a seguir sus órdenes) -(Don't stay here) -(No te quedes aquí) + + (Don't stay here) (No te quedes aquí) -(Never mind...) -(No importa...) (Confirm?) (¿Confirmar?) (You decide you would rather the SPEAKER stay put) (Usted decide que prefiere que el SPEAKER se quede en su lugar) -(The SPEAKER refuses to follow your orders) -(El SPEAKER se niega a seguir sus órdenes) + + (Switch to Aggressive) (Cambiar a Agresivo) (The SPEAKER will now pursue enemies) (El SPEAKER ahora perseguirá a los enemigos) + + (Switch to Defensive) (Cambiar a Defensivo) (The SPEAKER will stay close to you or its assigned position) (El SPEAKER permanecerá cerca de usted o de su posición asignada) + + +### (Flirting) + +### (The SPEAKER smiles)|This will be fun! + +### (The SPEAKER grins)|I will make sure you enjoy yourself~ + +### (The SPEAKER blushes)|Mmm~ Let's do this! + +### (The SPEAKER backs up)|I'm not in trouble, am I? + +### (The SPEAKER beeps)|This unit does not know how to respond... + +### (The SPEAKER moans)|Mmmmmph~ + +### (The SPEAKER appears too busy to discuss with you) + + + + + + + + + + + +### End of line. + +### *slaps your butt* + + + + + +### Error. Subject not complying? + + + + + +### Got yourself locked up, huh? Better go be good now~ + +### *she bumps up against your chastity and sighs* + +### Pleasure controls detected. + +### You've been a bad girl, haven't you? *taps on your chastity gear* + +### Such a naughty girl, getting yourself all locked up like that! + +### I-I know you want release, but you're in this gear for a reason~ + + + + + + + + + + + +### Had fun?~ + +### *turns the toy off and giggles* + + + + + + + + + +### Don't I look quite cuddly? + +### (Move closer, attempting to cuddle) + +### (The SPEAKER smiles)|You do, in fact!|(She inches closer) + +### (The SPEAKER smiles gently)|Aren't you precious~ + +### (The SPEAKER looks flustered)|Well, it's been a long day...|I could use a hug... + +### (The SPEAKER smirks and reaches for your body) + +### (The SPEAKER makes a beeping noise)|Loading cuddle module... + + + +### Got something for me? + +### (Present your body to her~) + +### (The SPEAKER smiles)|Am I thinking what you're thinking? + +### (The SPEAKER grins)|Why yes, I have just the thing~ + +### (The SPEAKER blushes)|Oh... let me check. + +### (The SPEAKER smirks)|Be careful what you ask for~ + +### (The SPEAKER pauses)|Calculating strictness threshold... + +### Yes please! (Hold out your wrists) + +### (Nod and blush) + +### Maybe not... + +### Why don't we have a little fun? + +### (Play with her) + +### (The SPEAKER giggles)|Mmmph~ + + + +### You look quite distracted... + +### (Help her with her distraction) + +### (The SPEAKER nervously smiles)|H-how'd you know? + +### (The SPEAKER smiles)|Indeed I am... Won't you assist me? + +### (The SPEAKER wiggles excitedly)|Y-yes miss! + +### (The SPEAKER shakes her head while blushing)|W-what makes you think that? + +### (The SPEAKER computes something)|Error... + +### (The SPEAKER nods)|Mmmph! + +### (Give her release with a magic wand) + +### (Set her toys to high for a while) + +### (Cuddle with her for 2 turns) + +### (The SPEAKER trembles with pleasure) + +### (The SPEAKER struggles to let go due to her chastity belt) + + + +### Let's go for a walk! + +### (Jump excitedly, presenting your collar for a leash) + +### (The SPEAKER smiles)|Sure! I'll take you for a walk, but only if you behave. + +### (The SPEAKER smiles)|Yes, I haven't had a nice walk in a while~ + +### (The SPEAKER blushes)|Sure! I'll make sure you don't get into trouble~ + +### (The SPEAKER giggles)|Time for walkies! + +### (The SPEAKER calculates)|Routing coordinates... + (Ask her for help) (Pídele ayuda) -(Ask her for help) -(Pídele ayuda) -(Never mind...) -(No importa...) (Are you sure? She might see you as being submissive) (¿Estás seguro? Ella podría verte como sumiso) (The SPEAKER prefers you the way you are) @@ -15376,10 +19756,6 @@ There is no valid space next to you! (Pídele que te desbloquee con una palabra de comando) (Yes!) (¡Sí!) -(Never mind...) -(No importa...) -(Are you sure? She might see you as being submissive) -(¿Estás seguro? Ella podría verte como sumiso) (The SPEAKER would rather 'conserve her mana') (El SPEAKER preferiría 'conservar su maná') (The SPEAKER utters a command word on you) @@ -15388,12 +19764,6 @@ There is no valid space next to you! (Tus cerraduras mágicas continúan refrenándote.) (Plead with her to unlock your restraints) (Pídele que desbloquee tus ataduras) -(Yes!) -(¡Sí!) -(Never mind...) -(No importa...) -(Are you sure? She might see you as being submissive) -(¿Estás seguro? Ella podría verte como sumiso) (The SPEAKER would rather not give up a magic key) (El SPEAKER preferiría no renunciar a una llave mágica) (The SPEAKER doesn't have any keys) @@ -15406,18 +19776,40 @@ There is no valid space next to you! (Dejar de recibir ayuda) (Confirm? You will have to ask again to get help.) (¿Confirmar? Tendrá que volver a preguntar para obtener ayuda). -(Stop receiving help) -(Dejar de recibir ayuda) -(Never mind...) -(No importa...) (The SPEAKER will no longer help you.) (El SPEAKER ya no le ayudará.) (You sigh as you realize you really need her help.) (Suspiras cuando te das cuenta de que realmente necesitas su ayuda.) +### (Kick her out of your party) + +### (Confirm? She will stop following you) + +### (Remove from party) + +### (The SPEAKER understands.) + +### (You decide to keep her.) + +### (Add her to your party) + +### (Confirm? She will follow you across floors. You can only have 3 party members) + +### (Add to party) + +### (The SPEAKER is happy to join you) + +### (You decide not to.) + (Sell items) (Vender artículos) (Buy items) (Comprar artículos) + + +### (Pick up her leash) + +### (Release her leash) + Dollmaker fabricante de muñecas The Dollmaker throws a device to the ground, teleporting her instantly! @@ -15426,14 +19818,14 @@ The Dollmaker's necklace flashes as you find yourself suddenly restrained! (+Res ¡El collar del fabricante de muñecas parpadea cuando te encuentras repentinamente restringido! (+ Restricción agregada) The Dollmaker's overbearing presence captivates you~ (DamageTaken) La presencia autoritaria del fabricante de muñecas te cautiva~ (DamageTaken) -Dollmaker -fabricante de muñecas +### The Dollmaker snaps her fingers as you find yourself locked! (DamageTaken) + The Dollmaker sinks into a pool of latex! ¡El fabricante de muñecas se hunde en una piscina de látex! -The Dollmaker's necklace flashes as you find yourself suddenly restrained! (+RestraintAdded) -¡El collar del fabricante de muñecas parpadea cuando te encuentras repentinamente restringido! (+ Restricción agregada) The Dollmaker suggests that you surrender. (DamageTaken) El fabricante de muñecas sugiere que te rindas. (Daño Recibido) + + DOLLMAKER FABRICANTE DE MUÑECAS The Dollmaker falls kneeling to the floor, admitting defeat! @@ -15442,22 +19834,26 @@ The Dollmaker snaps her fingers, and many robotic arms restrain you! (+Restraint ¡El fabricante de muñecas chasquea los dedos y muchos brazos robóticos te detienen! (+ Restricción agregada) The Dollmaker orders you to KNEEL! (DamageTaken) ¡El fabricante de muñecas te ordena ARRODILLAR! (Daño Recibido) -Fuuka -Fuuka + + +### Fuuka + Fuuka surrounds herself in defensive talismans! ¡Fuuka se rodea de talismanes defensivos! Fuuka wraps you tightly in restraints! (+RestraintAdded) ¡Fuka te envuelve con fuerza en las ataduras! (+ Restricción agregada) Fuuka squeezes your breasts and smiles! (DamageTaken) ¡Fuka aprieta tus pechos y sonríe! (Daño Recibido) -Angry Fuuka -Fuuka enojado +### Fuuka snaps her fingers and all your restraints are locked! (DamageTaken) + Fuuka surrounds herself in defensive talismans one more time! ¡Fuuka se rodea de talismanes defensivos una vez más! Fuuka wraps you furiously in restraints! (+RestraintAdded) ¡Fuuka te envuelve furiosamente en ataduras! (+ Restricción agregada) Fuuka pouts as she tickles you relentlessly! (DamageTaken) ¡Fuuka hace pucheros mientras te hace cosquillas sin descanso! (Daño Recibido) + + (You find a girl wearing an ornate dress)|(She glances at you)|And who might you be? (Encuentras a una chica con un vestido adornado)|(Ella te mira)|¿Y quién eres? I should be asking the same of you. @@ -15474,28 +19870,16 @@ What kind of name is that? (EL SPEAKER se ve enfadado)|¡Porque los nombres y los significados son cosas diferentes!|¡Mi nombre usa el guión de la Vieja Civilización!|¡Eres un farsante! Why not just call yourself Windsong? ¿Por qué no simplemente llamarte Windsong? -(...) -(...) -(...) -(...) I am an adventurer. soy un aventurero -Mmmmph. -Mmmmmmmm (SPEAKER blushes)|Ah, right then... (SPEAKER se sonroja)|Ah, en ese momento... -(...) -(...) (SPEAKER giggles)|Very well. I don't really care who you are. (EL SPEAKER se ríe)|Muy bien. Realmente no me importa quién eres. I do not need to introduce myself. No necesito presentarme. Neither do I. Yo tampoco. -(...) -(...) -(...) -(...) I'm an adventurer. And who are you? soy un aventurero ¿Y quien eres tu? Mmmmm... (Blush) @@ -15506,42 +19890,72 @@ Reincarnated ones? ¿Reencarnados? (SPEAKER tilts her head)|I believe the term is 'Zombie' in the common tongue. (SPEAKER inclina la cabeza)|Creo que el término es 'Zombie' en la lengua común. -(SPEAKER enjoys the discussion)|When people die, their spirits pass on to the next life.|But with the right tricks, one can grant them a second chance.|I plan to give them all proper bodies...|Eventually. -(SPEAKER disfruta de la discusión)|Cuando las personas mueren, sus espíritus pasan a la siguiente vida.|Pero con los trucos correctos, se les puede otorgar una segunda oportunidad.|Planeo darles todos los cuerpos apropiados...|Eventualmente. -But... 'reincarnated'? -Pero... ¿'reencarnado'? -(SPEAKER tilts her head)|...They don't? -(SPEAKER inclina la cabeza)|...¿No? -But people don't die anymore. -Pero la gente ya no muere. -(...) -(...) -(SPEAKER scratches her chin)|So they managed it... after all this time... -(SPEAKER se rasca la barbilla)|Así que lo lograron... después de todo este tiempo... -People don't die anymore. -La gente ya no muere. -(SPEAKER folds her arms)|You don't know? They call it... the Old Civilization, in your tongue.|Long ago they were trying some experiments... many experiments.|Immortality was their goal. -(SPEAKER se cruza de brazos)|¿No sabes? Lo llaman... la Antigua Civilización, en tu lengua.|Hace mucho tiempo estaban intentando algunos experimentos... muchos experimentos.|La inmortalidad era su objetivo. -Who is 'they'? -Quienes son'? -(SPEAKER shrugs)|Well, I don't know what they've accomplished.|But if the human race is immortal now,|that means you get to be my pet for a long time! -(EL SPEAKER se encoge de hombros)|Bueno, no sé lo que han logrado.|Pero si la raza humana es inmortal ahora,|¡eso significa que serás mi mascota durante mucho tiempo! -They're just a bunch of old robots now. -Ahora son solo un montón de viejos robots. -(SPEAKER frowns)|Hey, it's not my fault!|People who come here are usually not as talkative as you are...|Plus, I'm really busy these days.|I can't be bothered to keep track of recent developments! -(EL SPEAKER frunce el ceño)|¡Oye, no es mi culpa!|La gente que viene aquí no suele ser tan habladora como tú...|Además, estoy muy ocupado estos días.|No puedo molestarme en hacer un seguimiento de ¡desarrollos recientes! -...Am I really the first to tell you this? -... ¿Soy realmente el primero en decirte esto? -(...) -(...) -I am an adventurer. -soy un aventurero -Mmmmph. -Mmmmmmmm +### (SPEAKER enjoys the discussion)|When most people die, their spirits pass on to the next life.|But some stay in this world, and with the right blessings,|one can grant them a second chance!|I plan to give them all proper bodies...|Eventually. + +### How do they get reincarnated? + +### (SPEAKER enjoys the discussion)|No, they're people!|People who died long ago.|Now they live a new life, safeguarded by my Resurrection Arts! + +### Aren't they dolls? They can barely speak. + +### (SPEAKER pouts)|Why you...|Long ago, I made a contract with Ninril to guide lost souls back to her.|Do you doubt her blessing?! + +### Your Resurrection Arts don't seem very effective. + +### (SPEAKER looks puzzled)|People don't die anymore, but there are still lots of souls out there.|Whenever they stumble into the dungeon, searching for answers,|I'm still here, waiting! + +### What do you do now that people don't die? + +### (SPEAKER chortles)|So you've noticed!|As you can see, Ninril is very powerful~ + +### You don't look very old yourself. + +### (SPEAKER frowns)|Divine blessings shouldn't be used for such silly things! + +### Can you resurrect my back? It kind of hurts right now... + +### (SPEAKER smiles)|Those latex-clad idiots don't understand a thing.|Science can only get you so far!|Worship is where it's at! + +### The Alchemists are always looking for a youth potion. + +### (SPEAKER folds her arms)|Oh ho ho~|That's none of your business, for it is also part of my contract|to keep outsiders from interfering with the catacombs below! + +### Do you know what's on the next floor? + +### (SPEAKER blushes)|Nope, nothing at all!|In fact, whatever it is, you won't find it down here!|Now, would you like to become my pet? + +### Do you know anything about the Old Civilization? + +### (SPEAKER shrugs)|Oh really...|Must be the fey playing tricks, hehe... + +### I've seen a few robots running around! + +### (SPEAKER looks nervous)|Oh yeah? Where'd you hear that?|The 'adventurer's guild,' huh?|Why don't you just leave the dead to rest~ + +### I heard there was an ancient facility on this island. + +### (SPEAKER sighs)|Look, the Goddess doesn't tell me everything.|Now then, I have a job to do and some pets to manage.|Please stop asking questions! + +### Is Sariel Vinlaga down here? + +### (SPEAKER frowns)|What's with all the questions!|There totally isn't some kind of doll processing facility here!|Perhaps you're a brainwashed doll yourself? + +### Does DressUp Co. get their 'cyber doll' products from here? + +### (SPEAKER chuckles)|I smell a hint of jealousy~ + +### I don't want to be a pet, so you'll have to force me. + +### (SPEAKER jumps up and down)|You would!?|That's wonderful~|My resurrection magic can make you young again forever!|All you have to do is pledge your soul to Nirin, the Goddess of Restoration! + +### I'd love to be your pet! + +### (SPEAKER pouts)|Hmmph. Suit yourself. + +### Pledge my soul? That changes things... + (SPEAKER giggles)|Hehe... you sound interested. (EL SPEAKER se ríe)|Jeje... pareces interesado. -(...) -(...) (SPEAKER frowns)|Never ask a woman about her age! (SPEAKER frunce el ceño)|¡Nunca le preguntes a una mujer su edad! I take it you're the hag in charge? @@ -15550,8 +19964,6 @@ You are in charge, right? Usted está a cargo, ¿verdad? (Giggle) (Risilla) -(...) -(...) Don't mess with me, little girl. No te metas conmigo, niña. Mmpphgh? (Pout at her) @@ -15566,28 +19978,18 @@ Así es. ¿Qué tan poderoso eres? (Ella sonríe)|¿Todos los zombis que ves en el Cementerio?|Son mis mascotas, y me preocupo por todos y cada uno de ellos. What the heck are 'Resurrection Arts'? ¿Qué diablos son las 'Artes de la Resurrección'? -(...) -(...) -(...) -(...) It's time for a true display of skill! ¡Es hora de una verdadera demostración de habilidad! Hmmph. (Look away) Hmmph. (Apartar) (She grins)|We'll wipe that pout off your face soon enough... (Ella sonríe) | Te quitaremos ese puchero de la cara muy pronto... -(Shake your head) -(Sacude la cabeza) (She frowns)|Well, you will soon. (Ella frunce el ceño) Bueno, pronto lo harás. Pfff. Never heard of it. Pfff. Nunca lo oí. I bet I could do better. Apuesto a que podría hacerlo mejor. -(Giggle) -(Risilla) -(...) -(...) Why does that matter to you? ¿Por qué te importa eso? (Stare at her silently, maintaining your posture) @@ -15604,12 +20006,8 @@ You don't sound too confident. No suenas demasiado confiado. Who are you anyway? ¿De cualquier manera, quien es usted? -Who are you anyway? -¿De cualquier manera, quien es usted? Fair enough. I am an adventurer. Me parece bien. soy un aventurero -Hmmph. -Hmmph. (SPEAKER giggles)|Is that a challenge? (EL SPEAKER se ríe)|¿Eso es un desafío? (Nod calmly) @@ -15622,10 +20020,6 @@ Hmmph. (Scoff into your gag) Hmmph. (Búrlate de tu mordaza) It is indeed! ¡Ciertamente así es! -(Giggle) -(Risilla) -(...) -(...) I'm an adventurer, miss. Soy un aventurero, señorita. Mmmpphh~ (Moan and wiggle seductively) @@ -15646,12 +20040,10 @@ Exciting! ¡Emocionante! That sounds great. But who are you miss? Eso suena genial. Pero, ¿quién eres, señorita? -Mmmmph~ -Mmmmmm~ +### Mmmmph~ + (SPEAKER giggles)|Hehe... We will have so much fun~ (EL SPEAKER se ríe)|Jeje... Nos divertiremos mucho~ -(...) -(...) (SPEAKER giggles)|You don't have to consent, dear~ (EL SPEAKER se ríe)|No tienes que consentir, querida~ I never said I consented to being a pet! @@ -15660,12 +20052,12 @@ I never said I consented to being a pet! (Dale una mirada perpleja y sacude la cabeza) No way! ¡De ninguna manera! -(Shake your head) -(Sacude la cabeza) (Sigh and shrug) (Suspiro y encogimiento de hombros) (Attack her without saying anything) (La ataca sin decir nada) + + (SPEAKER clears her throat)|I am the one tasked with keeping this graveyard pure and holy.|The reincarnated ones who roam this place do so with my permission.|But what of you? I do not remember striking a deal with you.|Are you here to challenge me? (EL SPEAKER se aclara la garganta) Soy la encargada de mantener este cementerio puro y sagrado. Los reencarnados que deambulan por este lugar lo hacen con mi permiso. Pero, ¿y usted? No recuerdo haber hecho un trato contigo. ¿Estás aquí para desafiarme? I do what I want. @@ -15690,10 +20082,10 @@ Mmph! (Sacude la cabeza frenéticamente) (EL SPEAKER se ríe)|¡Vamos, quiero ver lo bueno que eres! Yes, I am here to fight you. Sí, estoy aquí para pelear contigo. -(Nod) -(Asentir) (SPEAKER smiles)|Then what are we waiting for? (SPEAKER sonríe)|Entonces, ¿qué estamos esperando? + + You're on! ¡Estás en! Hmmmph! @@ -15704,14 +20096,18 @@ Mmmmmghh! Mmmmmgh! I suppose... Supongo... -Mmmmph... -Mmmmmm... + + (SPEAKER smiles as she stands over you)|Well well. Look who won. (SPEAKER sonríe mientras se para a su lado)|Bueno, bueno. Mira quién ganó. -(SPEAKER nods)|Absolutely. Now allow me to make my conditions clear.|You will wear my collar from now on.|Then you will be allowed to go. -(EL SPEAKER asiente)|Absolutamente. Ahora permítame dejar en claro mis condiciones. A partir de ahora, usará mi collar. Entonces podrá irse. -(SPEAKER giggles)|You're not in a position to resist.|Now then, let me make myself clear.|I will let you go... but only wearing my collar. -(EL SPEAKER se ríe)|No está en posición de resistirse.|Ahora bien, déjeme ser claro.|Te dejaré ir... pero solo con mi collar. +### (SPEAKER nods and giggles)|Absolutely.|Allow me to present to you, my prized pet collar!|I save it only for my favorite pets.|That's right! You're my favorite pet now~ + +### (SPEAKER giggles)|You're not in a position to resist.|Now then, where did I put that collar... + +### (SPEAKER smiles)|It's a magical spell that seals your power temporarily~|I use it for my pets when they're being unruly...|(She brandishes a collar) Now including you! + +### What's this weird magic? + You beat me fair and square. Me ganaste justo y cuadrado. Mmmph. (Submit) @@ -15728,32 +20124,40 @@ Mmmph! (Lucha débilmente) (Acepta el collar a regañadientes) (SPEAKER presents you with your collar...)|(She locks it around your neck)|You are free to go now, dear! (EL SPEAKER te presenta tu collar...)|(Ella lo cierra alrededor de tu cuello)|¡Puedes irte ahora, querida! + + (SPEAKER puts up a wall of talismans to regain her strength)|I'm... I'm not finished yet! (SPEAKER coloca una pared de talismanes para recuperar su fuerza)|Estoy... ¡Aún no he terminado! + + (SPEAKER is out of breath)|I... can't... believe... it...|She drops her keys... (EL SPEAKER se queda sin aliento)|Yo... no puedo... creer... que...|Se le caen las llaves... (SPEAKER looks flabbergasted)|R-really? Okay... I'll give you a reward then... (EL SPEAKER parece estupefacto)|¿E-en serio? Está bien... te daré una recompensa entonces... -(Submit to her anyway) -(Sométete a ella de todos modos) +### (Submit to her anyway) (Gain a special collar) + (SPEAKER resists but ultimately you force a gag into her mouth)|MMMMMPH! (EL SPEAKER se resiste pero al final usted le fuerza una mordaza en la boca)|¡MMMMMPH! (Gag her) (Amordazarla) + + + + (This ghost had something to say,|but it appears you've run into a bug instead)|Please report this to Ada18980 on deviantart! (Este fantasma tenía algo que decir,|pero parece que te has topado con un error en su lugar)|¡Infórmale de esto a Ada18980 en deviantart! + + (Continue) (Continuar) (Make a smug face as you walk past) (Haz una cara de suficiencia al pasar) Thank you! ¡Gracias! -Mmmph! -Mmmph! I don't need your advice, strange ghostly person. No necesito tu consejo, extraña persona fantasmal. -(Glare at her) -(La mira fijamente) + + Oh, those people that locked you up?|I dealt with them.|Now come along, there's no time to waste! Oh, ¿esa gente que te encerró? Yo me ocupé de ellos. ¡Ahora ven, no hay tiempo que perder! (The SPEAKER giggles)|Treasure? The treasure isn't going anywhere.|Plus, I made a few enemies on the way.|We better not wait till they come back. @@ -15764,48 +20168,76 @@ But what about the treasure!? (El SPEAKER reflexiona sobre su pregunta)|Creo que tendremos que hablar sobre la compensación|DESPUÉS de que salgamos de aquí. So how much is this going to cost me? Entonces, ¿cuánto me va a costar esto? + + (You hear footsteps. It's the SPEAKER!)|Why look at you!|Well you seem to be in a bind, don't you? (Oyes pasos. ¡Es el SPEAKER!)|¡Por qué te miras!|Bueno, pareces estar en un aprieto, ¿no? Not to worry! I'll get you out of here! ¡No es para preocuparse! ¡Te sacaré de aquí! Hehe, alright! If that's what you want~ ¡Jeje, está bien! Si eso es lo que quieres ~ -(Nod slowly) -(Asiente lentamente) + + (Shake your head and refuse rescue) (Sacude la cabeza y rechaza el rescate) -Yes please! -¡Sí, por favor! Actually I was having fun... En realidad me estaba divirtiendo... -(The SPEAKER, your longtime friend, smiles)|Well well, if it isn't you again!|I see that you've decided to challenge the dungeon again.|Remember, if you get caught, I'll rescue you... for a fee~ -(El SPEAKER, tu viejo amigo, sonríe)|Bueno, bueno, ¡si no eres tú otra vez!|Veo que has decidido desafiar la mazmorra nuevamente.|Recuerda, si te atrapan, te rescataré. .. por una tarifa ~ + + +### (The SPEAKER, your longtime friend, smiles)|Well well, if it isn't you again!|I see that you've decided to challenge the dungeon again.|Don't forget to bring some gold back with you,|there's a fee for rescue~ + +### Can you help with these restraints? + +### Pfffmmm hhmmph mmph... (Please Help Me) + +### No can do! Even I can't get those off of you. + Caught by...? Atrapado por...? -Hah!|You've been here a million times!|You obviously know about the many factions vying for power~ -¡Hah! ¡Has estado aquí un millón de veces! Obviamente conoces las muchas facciones que compiten por el poder~ +### Hah!|You've been here a million times!|You obviously know how dangerous it is, yes? + F-fee? There's a fee? F-tarifa? ¿Hay una tarifa? -Yep! It'll cost ya!|RESCUECOST gold pieces. A bargain, if you ask me...|Unless you'd like to spend the rest of your life in chains! -¡Sí! ¡Te costará!|RESCUECOST piezas de oro. Una ganga, si me preguntas... ¡A menos que quieras pasar el resto de tu vida encadenado! +### Yep! It'll cost ya!|Quite worth it if you ask me.|Unless you'd like to spend the rest of your life in chains! + Will you buy my loot? ¿Comprarás mi botín? -Soon! I'm currently setting up my wares, so you'll have to wait. -¡Pronto! Actualmente estoy configurando mis productos, así que tendrás que esperar. -Mmmph! -Mmmph! +### (Show her your loot) + +### Absolutely! I offer the standard market rate for anything.|I'll take enchanted items too!|I've got plenty of volunteers to check for curses~ + +### Got something you want to show me? + +### (Sell Items) + +### (Sell Whole Stacks of Items) + Daww! What a cutie!|(She smiles and pats your head gently) ¡Diablos! ¡Qué linda!|(Ella sonríe y te da una palmadita en la cabeza) + + +### Do you have anything for sale? + +### (Look around for items to buy) + +### I'm sorry sweetie, I don't sell merchandise here.|Who would set up a shop inside a dungeon? That's crazy!|But you adventurers bring in a steady supply of loot,|so if you've got something to sell me, I'll take it off your hands~|You can also talk to my guests, perhaps they have something for you. + (Return) (Devolver) + + (The SPEAKER brings you safely back to her shop)|There! Nice and safe.|Now, as for my fee...|That'll be RESCUECOST gold pieces! (El SPEAKER te lleva sano y salvo de regreso a su tienda) | ¡Allí! Agradable y seguro. Ahora, en cuanto a mis honorarios... ¡Serán piezas de oro de RESCATE! + + Right! Here's RESCUECOST gp. ¡Bien! Aquí está RESCUECOSTE gp. Mmmph. (Nod your head and pay RESCUECOST gp) mmmmm (Asiente con la cabeza y paga RESCUECOST gp) (The SPEAKER smiles)|Pleasure doing business with ya~ (El SPEAKER sonríe)|Es un placer hacer negocios contigo~ + + Mind adding it to my tab? ¿Te importaría agregarlo a mi pestaña? (Shake your head regrettably.) @@ -15816,6 +20248,8 @@ Mind adding it to my tab? (La SPEAKER se frota la barbilla)|Ah... mmm, bueno...|Creo que esta vez te dejaré ir.|Después de todo, eres un buen cliente. (The SPEAKER folds her arms)|Come on now, I can hear the gold jingling in your pocket! (La SPEAKER se cruza de brazos)|¡Vamos, ya oigo el tintineo del oro en tu bolsillo! + + Pretty please? I promise I'll pay you back. ¿Bastante por favor? Te prometo que te lo devolveré. (Be insistent) @@ -15824,8 +20258,12 @@ Pretty please? I promise I'll pay you back. (La SPEAKER se frota la barbilla)|Bien, te creo.|¡Pero no dejaré que te liberes de esas ataduras! (The SPEAKER sighs)|Fine, I believe you.|You better believe I won't forget, though! (El SPEAKER suspira) Bien, te creo. ¡Sin embargo, será mejor que creas que no lo olvidaré! + + (The SPEAKER folds her arms)|Your adventures have cost me a pretty penny.|I can't stay in business if my clients keep running off without paying.|Look, I'll cut you a deal, you help me, I help you. Fair? (La SPEAKER se cruza de brazos)|Tus aventuras me han costado un centavo.|No puedo seguir en el negocio si mis clientes se van sin pagar.|Mira, te haré un trato, tú me ayudas, yo ayudarte. ¿Justo? + + (Help her test cursed armors) (Ayúdala a probar armaduras malditas) (Add cursed restraints as collateral) @@ -15836,6 +20274,8 @@ Pretty please? I promise I'll pay you back. (Use un catsuit para ayudar a publicitar su negocio) (Actually... just pay her the RESCUECOST gold) (En realidad... solo págale el oro RESCUECOST) + + (The SPEAKER holds up a RESTRAINTNAME)|I've bought some armors from an adventurer lately,|but I don't know if they're safe to wear.|Why don't you try it on for me?|I'll postpone your debt for a later time. (El SPEAKER muestra un NOMBRE DE SUJECIÓN)|Últimamente le compré algunas armaduras a un aventurero,|pero no sé si son seguras de usar.|¿Por qué no me las pruebas?|Yo. Pospondré su deuda para más adelante. (The SPEAKER holds up a RESTRAINTNAME)|I need to make sure you won't go running off again.|This RESTRAINTNAME here has a special seal on it.|I can get you out of it, of course, but you'll have to pay up first. @@ -15846,14 +20286,16 @@ Pretty please? I promise I'll pay you back. (El SPEAKER levanta un NOMBRE DE SUJECIÓN)|¡Tu cuerpo parece una gran valla publicitaria!|¡Este traje te hará tan atractivo que nadie podrá resistirse!|Y en el proceso de, ejem, examinarte,|Serán seguro de ver mi logotipo! (The SPEAKER folds her arms and nods)|Good girl! I knew you would come clean~ (La SPEAKER se cruza de brazos y asiente)|¡Buena chica! Sabía que te sincerarías~ + + Sure! I accept! ¡Seguro! ¡Acepto! (Nod in approval) (Asiente con aprobación) How about something else? ¿Qué tal algo más? -(Shake your head) -(Sacude la cabeza) + + Excellent! Please hold still~|(She fits the RESTRAINTNAME on and a seal awakens)|Whoops! Good thing I didn't sell that one!|I'll let you keep it, it's my treat~ ¡Excelente! Por favor, manténganse quietos~|(Ella coloca el RESTRAINTNAME y una foca despierta)|¡Vaya! ¡Menos mal que no vendí esa! Te dejaré quedártela, es mi regalo~ Excellent! Please hold still~|(She fits the RESTRAINTNAME on and nothing happens)|We have a winner!|You can't have it though, not until you pay up~ @@ -15864,6 +20306,8 @@ Alright! Why don't you hold still~|(She lifts your hair out of the way and buckl ¡Está bien! ¿Por qué no te quedas quieto~|(Ella te aparta el pelo y te abrocha el collar)|Ahora sal y encuéntrame algún tesoro~ You're gonna like it, I guarantee it~|(She pulls out the catsuit from a drawer, dusts it off, and helps you in it)|(There is no zipper or fastener, just a very stretchy neck hole)|(Once it's on and well-fitted, you feel the neck grow less loose...)|(...and pulling the rubber away from your skin becomes impossible)|Beautiful. I'm going to let you go now.|I'm sure your new look will attract many customers! Te va a gustar, te lo garantizo~|(Ella saca el catsuit de un cajón, lo quita el polvo y te ayuda a ponértelo)|(No hay cremallera ni cierre, solo un agujero en el cuello muy elástico)|( Una vez que está puesto y bien ajustado, sientes que el cuello se afloja menos...)|(...y quitar la goma de tu piel se vuelve imposible)|Hermoso. Voy a dejarte ir ahora. ¡Estoy seguro de que tu nueva apariencia atraerá a muchos clientes! + + No? That's alright.|I'm sure I'll find someone else to test these on, huehue. ¿No? Está bien. Estoy seguro de que encontraré a alguien más para probarlos, huehue. Up to you!|You'll still have to pay me eventually~ @@ -15872,6 +20316,30 @@ Your choice~|I am open to further negotiations. Su elección~|Estoy abierto a futuras negociaciones. Your choice~|Not everyone is up to putting themselves on display like that~ Tu elección~|No todo el mundo está dispuesto a mostrarse así~ + + + + +### (The SPEAKER pats you down and makes sure you're okay)|I can definitely help with those!|But as you know, I help a lot of adventurers just like you.|You know what, I'll give you a discount!|That'll be RESCUECOST gold pieces! + + + +### (The SPEAKER rubs her chin)|Sorry miss!|Cost of doing business, you know?|Why don't you come back with some of that delicious, shiny gold~ + +### (The SPEAKER folds her arms)|Business is business, miss~ + +### (The SPEAKER rubs her chin)|No can do.|Rules are rules~ + +### (The SPEAKER sighs)|Business is business, miss~ + +### (The SPEAKER reluctantly frees you)|...Fine, I'll cut you a deal.|You help me, I help you. Fair? + + + + + + + The next floor is a normal floor. El siguiente piso es un piso normal. This floor is suffering from a slime mold infestation.|Maids have been deployed to deal with the problem.|They could use a hand. @@ -15892,48 +20360,52 @@ Rumor has it that one of the cyber-dolls escaped.|Their handlers are looking for Se rumorea que una de las muñecas cibernéticas escapó. Sus encargados la están buscando. ¡Están atrapando a todas las niñas que pueden encontrar! This is totally a normal floor.|No doubt about it. Este es un piso totalmente normal. No hay duda al respecto. -This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall. -Esta es la entrada normal a la mazmorra.|El tutorial está al principio del pasillo. -This is the entrance to the ancient tombs.|It's harder than the normal entrance. -Esta es la entrada a las tumbas antiguas. Es más difícil que la entrada normal. -This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random. -Esta parte de la mazmorra ha sido alterada por la diosa del caos.|El orden de las zonas por las que pasarás es totalmente aleatorio. -Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure! -La leyenda dice que hay un templo secreto dentro de una vasta jungla. ¡Ponte tu sombrero de fieltro y encuentra algún tesoro! -You've gotten lost in an ancient doll processing facility.|This journey features mostly lategame tilesets. -Te has perdido en una antigua planta de procesamiento de muñecas.|Este viaje presenta principalmente conjuntos de mosaicos tardíos. -You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed! -Te has perdido deambulando por las ruinas. ¡El orden de los mosaicos está invertido! + + This is a debug mode journey for testing the latest region. Este es un viaje en modo de depuración para probar la última región. + + These are the stairs to the tutorial hall. Estas son las escaleras a la sala de tutoría. + + Congratulations! You've completed the tutorial!|Now get in there and stay out of trouble~ ¡Felicidades! ¡Has completado el tutorial! Ahora entra allí y no te metas en problemas ~ + + Welcome to the dungeon!|Don't panic, this is a turn-based game,|and nothing will happen until you move.|On your left you'll see your character,|displayed with all of the bondage they don't have.|Don't worry, you'll find some soon! ¡Bienvenido a la mazmorra! No entres en pánico, este es un juego basado en turnos, y no pasará nada hasta que te muevas. A tu izquierda verás a tu personaje, que se muestra con todas las ataduras que no tienen. tener.|¡No te preocupes, pronto encontrarás alguno! + + You might be wondering what all these barrels are for.|Don't worry, they're, uh, totally safe!|When you are inside one you can click on yourself to wait.|Enemies have a hard time seeing you inside a barrel,|so you can wait until they pass by you. Tal vez te estés preguntando para qué son todos estos barriles. barril, para que puedas esperar hasta que pasen por ti. -On the right you'll see your stats and spells slots.|Your DP, SP, MP, and WP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon.|Below that, two icons allow you to toggle automatic escape and movement modes. -A la derecha verás tus estadísticas y ranuras de hechizos.|Tu DP, SP, MP y WP se muestran allí, veremos lo que hacen.|Debajo verás tus artículos consumibles actuales,|tu oro y tu arma equipada actualmente.|Debajo de eso, dos íconos te permiten alternar entre los modos de escape y movimiento automáticos. + + +### On the right you'll see your stats and spells slots.|Your DP, SP, MP, and WP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon. + Your WP, or willpower, is an important resource.|Without it, escaping from restraints is more difficult.|There is a willpower potion on the floor up there. Go get it! Tu WP, o fuerza de voluntad, es un recurso importante.|Sin él, es más difícil escapar de las ataduras.|Hay una poción de fuerza de voluntad en el suelo. ¡Ve a buscarlo! -Oh no! That trap wiped out all your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack). -¡Oh, no! ¡Esa trampa acabó con toda tu fuerza de voluntad!|Afortunadamente tienes una poción.|Puedes beberla haciendo clic en el ícono '+' al lado de tu barra de WP.|También puedes ir a tu Inventario en la barra inferior.|También hay un icono de inventario rápido (mochila). +### Oh no! That trap reduced your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack). + Another trap!|You'll notice that the trap also drained your stamina considerably, preventing you from sprinting or attacking.|(Note: you can toggle sprinting using the '>>' button on the bottom bar)|You can protect yourself while your stamina regenerates by retreating into the room above.|Close the door by clicking the Close Door button in the bottom bar.| ¡Otra trampa!|Te darás cuenta de que la trampa también agotó considerablemente tu resistencia, lo que te impidió correr o atacar.|(Nota: puedes alternar entre correr usando el botón '>>' en la barra inferior)|Puedes protegerte mientras su resistencia se regenera al retirarse a la habitación de arriba.|Cierre la puerta haciendo clic en el botón Cerrar puerta en la barra inferior.| -Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the bottom right.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1. -Tu PM, o maná, se utiliza para lanzar hechizos.|Sin embargo, para lanzar hechizos, debes aprender uno.|Haz clic en el botón Hechizos en la parte inferior derecha.|Luego haz clic en Flame Apprentice y apréndelo para desbloquear Firebolt.| Luego, presiona la barra espaciadora para regresar y presiona Derecha para cambiar de página.|Haz clic en Firebolt, apréndelo y luego asígnalo al espacio 1. + + +### Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the right menu, then navigate to the Spell Tree.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1. + On the right you'll see your stats and spells slots.|You can click on a spell slot or hit 1-4 on your keyboard to cast a spell|then click on the map for where you want to aim it.|The small wrench icon above them will let you|swap them out for another spell from your spellbook. A la derecha verás tus estadísticas y espacios para hechizos.|Puedes hacer clic en un espacio para hechizos o presionar 1-4 en tu teclado para lanzar un hechizo|luego haz clic en el mapa hacia donde quieras apuntarlo.|El pequeño El ícono de llave inglesa sobre ellos te permitirá cambiarlos por otro hechizo de tu libro de hechizos. There's a zombie over there!|Fortunately zombies are weak to fire.|Firebolt has a very long range,|so simply cast firebolt and click on the zombie.|Repeat until it is dead. ¡Hay un zombi allí!|Afortunadamente, los zombis son débiles para disparar.|La Saeta de Fuego tiene un alcance muy largo,|así que simplemente lanza la Saeta de Fuego y haz clic en el zombi.|Repite hasta que muera. -Mana potions restore your mana fully. -Las pociones de maná restauran tu maná por completo. +### Mana potions restore mana, allowing you to cast spells.|Youll notice that your mana also regenerates slowly.|This mana comes from your mana pool,|which is a thin line displayed under the mana bar.|When that runs out, you can't cast spells anymore! + Your DP, or Distraction, is a measure of...|How much you are enjoying things.|These sorts of thoughts cloud your mind,|so spellcasting is more difficult when you are distracted.|Go grab the potion over there. Tu DP, o Distracción, es una medida de...|Cuánto disfrutas las cosas.|Este tipo de pensamientos nublan tu mente,|así que lanzar hechizos es más difícil cuando estás distraído.|Ve a buscar la poción de allí. Did you like that?|Anyway, there's a zombie over there. You should drink that potion.|It will clear your mind so you can cast again.|Hurry, or it will get you! ¿Te gustó eso? De todos modos, hay un zombi allí. Deberías beber esa poción.|Aclarará tu mente para que puedas volver a lanzar.|¡Date prisa, o te atrapará! + + That wasn't so hard, was it?|Now then, there's a treasure chest over here. Why don't you open it? Eso no fue tan difícil, ¿verdad? Bien, aquí hay un cofre del tesoro. ¿Por qué no lo abres? Yikes, looks like you're in a bind!|No worries, though. There's a key to those cuffs over there.|Simply hover over the cuffs item test on the left side.|Then, click the lock icon to remove the lock.|Finally, click the buckle to remove the cuffs. @@ -15944,10 +20416,14 @@ Ouch, that looked tight...|Sometimes you won't be able to struggle out of things Vaya, eso parecía apretado...|A veces no podrás salir de las cosas con dificultad.|Tendrás que encontrar otra manera de quitártelo... There's a few zombies up ahead.|Fight your way through and claim the treasure! Hay algunos zombis más adelante. ¡Ábrete paso luchando y reclama el tesoro! + + You're not feeling it... no lo sientes... You close your eyes but the vibrations keep you from dozing off... Cierras los ojos pero las vibraciones evitan que te quedes dormido... + + (A SPEAKER lies hogtied in front of you)|(She looks at you with pleading eyes,)|(and mumbles incoherently through her gag) (UNA SPEAKER yace amarrada frente a ti)|(Ella te mira con ojos suplicantes)|(y murmura incoherencias a través de su mordaza) (A SPEAKER lies hogtied in front of you)|(She looks at you, mumbling and giggling into her gag) @@ -15964,6 +20440,8 @@ Untie her Desátala Make sure she is tight and secure Asegúrate de que esté firme y segura. + + (A SPEAKER bumps into you while immersed in her thoughts)|Oh! Hello!|Say, you look adorable...|Do you mind helping me find something? (UNA SPEAKER choca contigo mientras está inmersa en sus pensamientos)|¡Oh! ¡Hola! Dime, te ves adorable... ¿Te importaría ayudarme a encontrar algo? (The SPEAKER jumps up and down)|Ah, wonderful!|I've misplaced one of my dresses.|If you could find one, wear it, and bring it to me,|I'd greatly appreciate it! Thanks! @@ -15984,20 +20462,14 @@ Great! Can you take it off? ¡Excelente! ¿Puedes quitártelo? Mmmmm! (Struggle) ¡Mmmmm! (Lucha) + + (A SPEAKER clutching her books approaches you)|Miss adventurer!|I happen to need a magic scroll of any kind.|It's for my studies. (UNA SPEAKER agarrando sus libros se acerca a ti)|¡Señorita aventurera!|Resulta que necesito un pergamino mágico de cualquier tipo.|Es para mis estudios. (The SPEAKER smiles)|Yes, thank you so much!|It's been so difficult to get them lately.|The magic library is closed off these days,|and there are mean people trying to get the scrolls back... (El SPEAKER sonríe)|Sí, ¡muchas gracias!|Ha sido muy difícil conseguirlos últimamente.|La biblioteca mágica está cerrada estos días,|y hay gente mala que intenta recuperar los pergaminos... (The SPEAKER is happy)|Thank you so much! (El SPEAKER está feliz)|¡Muchas gracias! -(The SPEAKER is happy)|Thank you so much! -(El SPEAKER está feliz)|¡Muchas gracias! -(The SPEAKER is happy)|Thank you so much! -(El SPEAKER está feliz)|¡Muchas gracias! -(The SPEAKER is happy)|Thank you so much! -(El SPEAKER está feliz)|¡Muchas gracias! -(Show interest) -(Muestra interés) Give her a Scroll of Sauntering Dale un Pergamino de paseo Give her a Scroll of Sleight @@ -16006,18 +20478,20 @@ Give her a Scroll of Speech Dale un pergamino de discurso Give her a Scroll of Purity Dale un Pergamino de Pureza + + (A SPEAKER looks distraught)|Well met, adventurer!|We have a problem... (UN SPEAKER parece angustiado)|¡Bienvenido, aventurero!|Tenemos un problema... (The SPEAKER folds her arms)|A rebel has been causing us problems lately...|If you run into her, give her all you got!|She needs to be brought to justice. (La SPEAKER se cruza de brazos)|Una rebelde nos ha estado causando problemas últimamente...|Si te encuentras con ella, ¡dale todo lo que tienes!|Ella debe ser llevada ante la justicia. -(Show interest) -(Muestra interés) + + (A SPEAKER scoffs in your direction)|Well? You lookin' for work or no? (UN SPEAKER se burla en tu dirección)|¿Y bien? ¿Estás buscando trabajo o no? (The SPEAKER grins)|A bunch of delinquents stormed out recently.|They're looking for a way out of their belts.|Someone oughta show em their place,|if you catch what I'm saying. (El SPEAKER sonríe)|Un grupo de delincuentes irrumpieron recientemente.|Están buscando una forma de salir de sus cinturones.|Alguien debería mostrarles su lugar,|si entiendes lo que digo. -(Nod) -(Asentir) + + (A SPEAKER approaches you in your cell)|Since you've been a bad girl,|we're taking you to the high-security prison. (UN SPEAKER se te acerca a tu celda)|Como has sido una chica mala,|te vamos a llevar a la prisión de alta seguridad. (The SPEAKER folds her arms)|Want to or not, you're going. @@ -16026,14 +20500,54 @@ Dale un Pergamino de Pureza (Resistir) (Submit) (Entregar) + + +### (A SPEAKER approaches you in your cell)|Looks like you're not in the System.|I'm going to have to take you to sorting. + +### (The SPEAKER grins as her systems glow)|I love my job sometimes~ + +### (The SPEAKER grins)|It means you'll get nicely packaged,|so that we can sort you through the System. + +### W-what does that entail? + +### (The SPEAKER giggles)|That means we'll get to package you up and|decide what to do with you, silly~ + +### Hmmmph? Mmmm! (Act worried and whimper) + +### (The SPEAKER folds her arms)|Mistress Oriel's orders + +### Not in the 'System'? + +### (The SPEAKER giggles)|Don't worry, we'll get you sorted out soon.|After all, everyone has a place in the System. + +### Mmmph? (Act confused) + +### (The SPEAKER folds her arms)|Mistress Oriel's orders were clear:|Anyone not logged in the System shall be entered into the System. + +### (The SPEAKER pauses for a moment, then speaks)|I'm am just following Mistress Oriel's orders.|I'm sure she will have time to speak with you if you want to ask her. + +### But why??? + +### (The SPEAKER frowns)|You should be thankful.|Without Mistress Oriel, we'd all be dead!|Probably... + +### Who is Mistress Oriel? + +### (The SPEAKER pauses for a moment, then answers)|Well, only a few hundred years ago, I think?|This is a bit longer of a downtime than usual,|But all of us are waiting patiently~ + +### When are these orders from? + +### (You anger the SPEAKER. She gags you.)|Unlike you, we were trained not to complain about orders given to us.|So until you receive your training, why don't you be nice and quiet? + +### The facility is in ruins! This is pointless! + (A SPEAKER crosses her arms)|Who you lookin' at?|Oh, it's an adventurer.|Say, you wouldn't be interested|in working with us, would ya? (UNA SPEAKER se cruza de brazos)|¿A quién estás mirando?|Oh, es un aventurero.|Oye, no estarías interesado|en trabajar con nosotros, ¿verdad? (The SPEAKER smiles)|That's more like it.|Here's the scoop: One of ours was captured on the next floor.|We need you to go get her out. (El SPEAKER sonríe)|Eso me gusta más.|Aquí está la primicia: Uno de los nuestros fue capturado en el siguiente piso.|Necesitamos que vayas a sacarla. -(Show interest) -(Muestra interés) -(The SPEAKER sits bound in high-security manacles)|You'll need to open the lock to get her out... -(La SPEAKER está atada con grilletes de alta seguridad)|Tendrás que abrir la cerradura para sacarla... + + +### (The SPEAKER sits bound in high-security manacles.|You'll need to open the lock to get her out.) + (You don't have any keys that work on the lock) (No tienes ninguna llave que funcione en la cerradura) (You can't help her, bound as tightly as you are...) @@ -16046,6 +20560,8 @@ Dale un Pergamino de Pureza (Desbloqueas el SPEAKER)|Mmmmph!|(Quiere quedarse con la mordaza...) (You don't have any lockpicks) (No tienes ganzúas) +### (You try to pick the lock...)|(Click! A safety shield locks securely into place!)|(Looks like the SPEAKER will be staying here for a while...) + (You can't pick the lock with your hands bound) (No puedes forzar la cerradura con las manos atadas) (After a while, you free the SPEAKER)|Thank you!|Let's get moving! @@ -16060,16 +20576,48 @@ Dale un Pergamino de Pureza (Pronuncias una palabra de comando para liberar al SPEAKER)|¡Muchas gracias!|¡Vamos! (You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) (Pronuncias una palabra de comando para liberar al SPEAKER)|¡Mmmmph!|(Ella bloquea su mordaza de nuevo...) +### (The SPEAKER is locked in high-security manacles.|The safety shield has been triggered, making it impossible to help her.) + Use a key to unlock her Usa una llave para desbloquearla. +### Try to pick her restraints (JAMPERCENT jam chance) + +### Use CMD: Unlock + +### Apologize profusely! + +### (The SPEAKER sits bound in mysterious ASCII glyphs)|(She is bugged and needs your help to get out) + +### (Unlock her and file a bug report to Ada) + + + +### (This SPEAKER is a sub, but not YOUR sub!) + + + +### (The SPEAKER sits restrained by your own hand.|Only someone with keys can let her out.) + Try to pick her restraints Trate de elegir sus restricciones +### Return her to your collection + Use a command word Usar una palabra de comando +### Flip her around + +### You spin her right round! + + + An enemy found you while you were busy! ¡Un enemigo te encontró mientras estabas ocupado! + + (A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door) (UN SPEAKER te despierta golpeando los barrotes)|¡Despierta! ¡Larguémonos de aquí!|(Se las arregló para forzar la cerradura de la puerta de tu celda) +### (A SPEAKER wakes you up by melting the door with acid)|These guys were a piece of cake.|Now let's discover a way out of here! + (You wake up to find a SPEAKER creeping up outside the door)|You've been marked as a person of interest.|We are here to escort you out of this place. (Te despiertas y encuentras un SPEAKER asomándose por la puerta)|Te han marcado como persona de interés.|Estamos aquí para escoltarte fuera de este lugar. (A SPEAKER wakes you up by banging on the bars)|Hey wake up!|You should join me and my pals here~|Maybe you'll join them once we're out of here? @@ -16096,12 +20644,54 @@ An enemy found you while you were busy! (UN SPEAKER lanza una luz brillante en su dirección)|Prisionero 74121 localizado. Comience la transferencia a una ubicación diferente. (A SPEAKER wakes you up)|We came to rescue you. Come on! (UN SPEAKER te despierta)|Vinimos a rescatarte. ¡Vamos! -(The bed looks comfy and inviting)|(Napping here will restore up to half of your willpower)|(You can only sleep once per floor, unless jailed) -(La cama parece cómoda y acogedora)|(Tomar una siesta aquí restaurará hasta la mitad de tu fuerza de voluntad)|(Solo puedes dormir una vez por piso, a menos que estés encarcelado) + + +### (The bed looks comfy and inviting)|(Napping here will restore up to half of your willpower and 100% of your max mana)|(You can only sleep once per floor, unless jailed) + (You lay in the bed and doze off...) (Te acuestas en la cama y te quedas dormido...) (Lie down and sleep) (Acuéstate y duerme) + + +### (There is a pole sticking out of the ground)|(A footrest rises from the floor on either side of the pole)|(This seems like an automated binding system for prisoners...) + +### (The pole rises and immobilizes you!) + +### (Stand over it and place your feet in the footrests) + +### (Drop off a prisoner from your collection) + +### (Put NME on the stand) (PRCNT% Chance) + +### (Put NME on the stand) + +### (This is a piece of bondage furniture) + +### (You lock yourself in the furniture!) + +### (The SPEAKER slips out of your grip|before you can lock her in place!) + +### (Display one of your prisoners) + +### (Lock yourself inside) + +### (Check the occupant) + +### (Try to lock NME into the furniture) (PRCNT% Chance) + +### (You close the furniture around your unfortunate victim!) + +### Stun or disable her first. + +### Area isn't clear. + +### (Secure NME into the furniture) + +### (You lock her into the furniture so that she stays in place) + + + FOODMSG|(It invites you to partake in its culinary delights) FOODMSG|(Te invita a participar de sus delicias culinarias) (You eat the food and feel your willpower rising) @@ -16110,24 +20700,38 @@ FOODMSG|(Te invita a participar de sus delicias culinarias) (Estando amordazado como estás no puedes disfrutar de la comida) (You steal the food, hoping nobody will notice...) (Robas la comida, esperando que nadie se dé cuenta...) -(Eat it to restore AMOUNT WP) -(Cómelo para restaurar AMOUNT WP) +### (Eat it to restore AMOUNT% WP) + (Take it!) (¡Tómalo!) + + (Someone left their cookies unattended) (Alguien dejó sus galletas desatendidas) (You smell delicious pizza) (Hueles deliciosa pizza) Cookie Galleta -Pizza -Pizza +### Pizza + (There is a button on a control panel here.) (Hay un botón en un panel de control aquí.) (You touch the button and it glows, releasing a pulse of energy!) (¡Tocas el botón y brilla, liberando un pulso de energía!) (PUSH THE BUTTON) (PRESIONE EL BOTÓN) + + +### (You find a map of the local leylines.)|(Committing these to memory will allow you to harness additional mana.) + +### (Are you sure?)|(This decision is permanent.) + +### (Gain +100 to Max Mana Pool) + +### (I don't want to.) + +### (No really, I don't want it!) + (You find a strange elevator with a control panel inside)|(You get the impression this will take you somewhere.) (Encuentras un ascensor extraño con un panel de control adentro)|(Tienes la impresión de que esto te llevará a alguna parte.) (Are you sure?)|(This seems like a bad idea!) @@ -16138,6 +20742,8 @@ Pizza (¡Bájame!) (I know what I'm doing!) (¡Sé lo que estoy haciendo!) + + (The conveyor pulls you into a strange elevator)|(A whir of motors suggests this elevator is about to start...) (La cinta transportadora te lleva a un ascensor extraño)|(Un zumbido de motores sugiere que este ascensor está a punto de ponerse en marcha...) (You manage to scramble out the door!)|(It closes violently behind you...) @@ -16152,24 +20758,30 @@ Pizza (Ríndete y deja que me lleve) (Wait it out) (Espera) + + (Mystic energies spring forth from the ground)|(Standing here will fully replenish your passive mana pool)|(One use only) (Las energías místicas brotan del suelo)|(Estar aquí recargará por completo tu reserva de maná pasiva)|(Un solo uso) (You step on the magical fissue and its energies absorb into you)|(Afterward, the ground crackles and fizzles, but no energy is left.) (Pisas el tejido mágico y sus energías se absorben en ti)|(Después, el suelo cruje y chisporrotea, pero no queda energía.) (Recharge your mana pool) (Recarga tu reserva de maná) -Upcast from SPELL -Upcast de hechizo + + Upcast Level LEVEL Nivel mejorado NIVEL Prerequisite Requisito previo -Unlocks: -Desbloquea: +### Unlocks: + You need to learn REQUIREDSPELL before you can learn this one. Necesitas aprender el HECHIZO REQUERIDO antes de poder aprender este. + + You no longer have the will to struggle. Ya no tienes la voluntad de luchar. + + Help yourself! ¡Ayudar a sí mismo! You eat the delicious food and feel your will restored. @@ -16180,6 +20792,8 @@ It's a table. Es una mesa. It's a table, with evidence of a grisly deed. Es una mesa, con evidencia de un hecho espeluznante. + + You call for help! ¡Llamas para pedir ayuda! You let out a garbled cry! @@ -16188,24 +20802,40 @@ Your screams are muffled by your gag! ¡Tus gritos son amortiguados por tu mordaza! You can hardly make a noise... Apenas puedes hacer ruido... + + *clink* *tintinar* + + You yelp as the EnemyName activates your RestraintName Gritas cuando EnemyName activa tu RestraintName +### You shudder as the EnemyName activates your RestraintName + That should slow you down! ¡Eso debería ralentizarte! Try running away now~ Intenta huir ahora ~ +### Initiating prisoner lockdown protocol--Unknown hardware detected + +### What's this do? + +### That harness you're wearing is quite convenient for me~ + Initiating prisoner lockdown protocol Iniciando el protocolo de encierro de prisioneros -Your RestraintName suddenly snap together as the EnemyName activates them -Su nombre de restricción de repente se une cuando el EnemyName los activa -Turn Count: -Número de turnos: +### Your RestraintName suddenly snap together as the EnemyName activates them! + +### Your harness projects energy tethers between your cuffs EnemyName activates it! + +### Turn Count: + The Shopkeeper leashes you! ¡El comerciante te ata! You are brought into the Shopkeeper's establishment... Te llevan al establecimiento del tendero... + + It seems to be working! The seal on your RESTRAINTNAME is weakened. ¡Parece estar funcionando! El sello de tu RESTRAINTNAME está debilitado. The cursed seal on your RESTRAINTNAME disappears. @@ -16222,18 +20852,24 @@ Metallic arms wrap you in tape! ¡Los brazos metálicos te envuelven en cinta! Metallic arms wrap you in strict restraints! ¡Los brazos metálicos te envuelven en estrictas restricciones! +### Metallic arms install various cybernetic restraints! + You've sprung a trap! You've been stunned. ¡Has tendido una trampa! Te has quedado atónito. The bandit leaves behind a sneaky trap... El bandido deja tras de sí una trampa furtiva... Damsel Trap Trampa de damisela + + The ENEMYNAME transforms nearby dolls into her subjects! ¡EL NOMBRE DEL ENEMIGO transforma las muñecas cercanas en sus súbditos! -The ENEMYNAME transforms nearby dolls into her subjects! -¡EL NOMBRE DEL ENEMIGO transforma las muñecas cercanas en sus súbditos! + + You wriggle around while struggling... Te retuerces mientras luchas... + + The missile explodes into a shower of latex that covers you! ¡El misil explota en una lluvia de látex que te cubre! Rubber Missile Direct Hit @@ -16244,6 +20880,8 @@ Rubber Nuke Direct Hit Golpe directo de goma nuclear Rubber Nuke bomba nuclear de goma + + (In the center of the room stands a woman wearing a latex dress)|(Around her are robotic servants, obeying her without a word)|(She has been watching you this entire time) (En el centro de la habitación hay una mujer con un vestido de látex)|(A su alrededor hay sirvientes robóticos que la obedecen sin decir una palabra)|(Te ha estado observando todo este tiempo) And who might you be? @@ -16268,20 +20906,12 @@ Debes ser el fabricante de muñecas. (La mujer se ríe)|Correcto.|Y tú debes ser el aventurero que está causando los problemas recientes. I'm famous! ¡Soy famoso! -(Nod happily) -(Asiente alegremente) Indeed. And I'm here to bring you down. En efecto. Y estoy aquí para derribarte. (Scoff at her) (Se burla de ella) -(Tuck your staff behind your back...) -(Pon tu bastón detrás de tu espalda...) -(The Dollmaker points at you)|Is that--? -(El fabricante de muñecas te señala)|¿Eso es--? -(Panic!) -(¡Pánico!) -(Attack her without saying anything) -(La ataca sin decir nada) + + (The Dollmaker folds her arms)|In any case, your journey ends here.|I do not appreciate scoundrels poking around in my domain.|I will personally lead you to your new future as a doll. (El fabricante de muñecas se cruza de brazos)|En cualquier caso, tu viaje termina aquí.|No aprecio que los sinvergüenzas husmeen en mis dominios.|Yo personalmente te guiaré hacia tu nuevo futuro como muñeca. Do you have the Mistress' Staff? @@ -16298,8 +20928,6 @@ Who? ¿OMS? (The Dollmaker explains)|Archmagus Sariel Vinlaga. I'm surprised you didn't know.|Not that it matters for a future doll like you. (El fabricante de muñecas explica)|Archmago Sariel Vinlaga. Me sorprende que no lo supieras. No es que importe para una futura muñeca como tú. -We'll see about that. -Ya lo veremos. ...Sariel Vinlaga. ...a Sariel Vinla. (The Dollmaker nods)|Yes. She is down here.|But this information is irrelevant to your future as a doll. @@ -16310,16 +20938,12 @@ Fair enough. Let's fight! Me parece bien. ¡Peleemos! We'll see about that! ¡Ya lo veremos! -Hmmmph! -¡Mmm! Feel free to try. Siéntete libre de intentarlo. -Mmmmmghh! -¡Mmmmmhhh! Sounds fun... but I really need to get going. Suena divertido... pero realmente necesito ponerme en marcha. -Mmmmph... -Mmmmmm... + + (The Dollmaker folds her arms as she walks over)|All tight and shiny!|You'll be my prized possession~ (La fabricante de muñecas se cruza de brazos mientras se acerca)|¡Toda firme y brillante!|Serás mi posesión más preciada~ (The Dollmaker nods)|Already eager to obey!|So beautiful... @@ -16328,12 +20952,8 @@ Mmmmmm... (El fabricante de muñecas se ríe)|Oh, pero ya lo he hecho~ I have no choice but to submit. No tengo más remedio que presentar. -Mmmph. (Submit) -mmmmm (Entregar) You will never get away with this! ¡Nunca te saldrás con la tuya! -Mmmph! (Struggle weakly) -Mmmph! (Lucha débilmente) (Sigh and be forced to wear her visor) (Suspiro y se ve obligado a usar su visor) (Sigh and be forced to wear her mask) @@ -16342,30 +20962,34 @@ Mmmph! (Lucha débilmente) (Suspiro y se ve obligada a usar lo que ella elija) (The Dollmaker places her visor over your face)|(With a click, you feel its fasteners lock around your head)|Now... as it stands, I have a task for you, doll.|You see, some dolls have been escaping my realm.|I want you to go capture them. (El fabricante de muñecas coloca su visor sobre tu cara)|(Con un clic, sientes que los sujetadores se cierran alrededor de tu cabeza)|Ahora... tal como está, tengo una tarea para ti, muñeca.|Verás, algunas muñecas tienen estado escapando de mi reino. Quiero que vayas a capturarlos. + + (The Dollmaker suddenly teleports away)|Hmmph. Looks like I will have to use my heavy firepower. (El fabricante de muñecas de repente se teletransporta)|Hmmph. Parece que tendré que usar mi gran potencia de fuego. (The Dollmaker sinks into a puddle of slime and emerges nearby)|(Robotic arms sprout from her back as she storms toward you!) (El fabricante de muñecas se hunde en un charco de baba y emerge cerca)|(¡Brazos robóticos brotan de su espalda mientras se precipita hacia ti!) + + (The Dollmaker concedes defeat)|You have defeated me.|I... I... will let you pass.|(The door exit door unlocks with an audible click) (El fabricante de muñecas reconoce la derrota)|Me has derrotado.|Yo... yo... te dejaré pasar.|(La puerta de salida se abre con un clic audible) (SPEAKER looks confused)|What are you... Okay, you can have it... (EL SPEAKER se ve confundido)|¿Qué estás... Vale, puedes quedártelo... (Wear a doll visor) (Usa una visera de muñeca) -(SPEAKER looks confused)|What are you... Okay, you can have it... -(EL SPEAKER se ve confundido)|¿Qué estás... Vale, puedes quedártelo... (Wear a doll mask) (Usa una máscara de muñeca) (You lift up the dollmaker's mask, revealing a pouting young woman inside)|What are you--|(You insert a gag into her open mouth and she starts mumbling angrily) (Levantas la máscara del fabricante de muñecas, revelando a una joven haciendo pucheros adentro)|¿Qué estás--|(Le insertas una mordaza en su boca abierta y ella comienza a murmurar con enojo) -(Gag her) -(Amordazarla) + + The Dollmaker calls in drone reinforcements! ¡El fabricante de muñecas pide refuerzos de drones! The Dollmaker releases many drones with robotic arms to capture you! ¡The Dollmaker lanza muchos drones con brazos robóticos para capturarte! Zombies emerge from the ground! ¡Los zombis emergen del suelo! + + Cyber Ankle Cuffs Tobilleras cibernéticas Ankle cuffs of exquisite quality, bearing all the marks of Old Civilization technology. @@ -16374,6 +20998,8 @@ Though made of ultra-tough metal, they feel light on your ankles... Aunque están hechos de metal ultrarresistente, se sienten ligeros en los tobillos... An energy link appears, linking your ankles close together! ¡Aparece un enlace de energía que une sus tobillos juntos! + + Energy Link Enlace de energía An energy link connecting your ankle cuffs together. @@ -16384,6 +21010,8 @@ The energy link disappears, freeing your ankles! ¡El enlace de energía desaparece, liberando tus tobillos! Your ankles snap together as the cuffs activate! ¡Tus tobillos se juntan cuando se activan los puños! + + Cyber Cuffs Chain Cadena Cyber ​​Cuffs A magnetic link keeping your ankles tightly connected. @@ -16392,6 +21020,8 @@ The cuffs are closely attached, so you can't cut the link apart. Los puños están muy unidos, por lo que no se puede cortar el enlace. The ankle cuffs detach with a beep! ¡Las tobilleras se sueltan con un pitido! + + Cyber Leg Cuffs Esposas cibernéticas para piernas Thigh cuffs of exquisite quality, bearing all the marks of Old Civilization technology. @@ -16400,14 +21030,14 @@ Though made of ultra-tough metal, they feel light on your legs... Aunque están hechos de metal ultrarresistente, se sienten ligeros en las piernas... An energy link appears, linking your thighs close together! ¡Aparece un enlace de energía que une tus muslos! -Energy Link -Enlace de energía + + An energy link connecting your leg cuffs together. Un enlace de energía que conecta los puños de las piernas entre sí. -It's powered by a chaos-resonance matrix, which can be overloaded by cutting the field. -Está alimentado por una matriz de resonancia del caos, que puede sobrecargarse cortando el campo. The energy link disappears, freeing your legs! ¡El enlace de energía desaparece, liberando tus piernas! + + Cyber Cuffs Puños cibernéticos Wrist and elbow cuffs of exquisite quality, bearing all the marks of Old Civilization technology. @@ -16416,60 +21046,76 @@ Though made of ultra-tough metal, they feel light on your wrists... Aunque están hechos de metal ultrarresistente, se sienten livianos en las muñecas... Your wrists are pulled together as the cuffs activate! ¡Tus muñecas se juntan cuando se activan los puños! + + Cyber Wrist Link Enlace cibernético de muñeca A magnetic link keeping your wrists secured together. Un enlace magnético que mantiene tus muñecas aseguradas juntas. -The cuffs are closely attached, so you can't cut the link apart. -Los puños están muy unidos, por lo que no se puede cortar el enlace. Your cuffs detatch with a beep! ¡Tus puños se sueltan con un pitido! Your elbows snap together as the cuffs engage fully! ¡Tus codos se juntan cuando los puños se enganchan completamente! + + Cyber Connection Conexión cibernética A magnetic link keeping your wrists and elbows inescapably secured. Un enlace magnético que mantiene tus muñecas y codos asegurados de forma ineludible. -The cuffs are closely attached, so you can't cut the link apart. -Los puños están muy unidos, por lo que no se puede cortar el enlace. Your wrists detatch with a beep, leaving your elbows still bound! ¡Tus muñecas se desprenden con un pitido, dejando tus codos aún atados! Your arms snap fully together as the cuffs activate! ¡Tus brazos se juntan por completo cuando se activan los puños! + + Cyber Elbow Link Enlace de codo cibernético A magnetic link keeping your elbows pressed tightly together! ¡Un vínculo magnético que mantiene los codos apretados! -The cuffs are closely attached, so you can't cut the link apart. -Los puños están muy unidos, por lo que no se puede cortar el enlace. Your elbows detatch with a beep! ¡Tus codos se separan con un pitido! -Your arms snap fully together as the cuffs activate! -¡Tus brazos se juntan por completo cuando se activan los puños! + + Doll Gag mordaza de muñeca A soft ball pressed against your lips and held in place with metallic straps. Una bola suave presionada contra tus labios y sujeta con tiras metálicas. The straps are made of a flexible metal with no visible seams along the straps. Las correas están hechas de un metal flexible sin costuras visibles a lo largo de las correas. + + Doll Plug Gag mordaza de enchufe de muñeca A soft, flexible plug pressed into your mouth and held in place with a metal shield. Un tapón suave y flexible que se presiona en la boca y se mantiene en su lugar con un escudo de metal. -The straps are made of a flexible metal with no visible seams along the straps. -Las correas están hechas de un metal flexible sin costuras visibles a lo largo de las correas. + + Doll Muzzle bozal de muñeca A metallic shield preventing you from removing any gags underneath. Un escudo metálico que le impide quitar cualquier mordaza debajo. It's made of exquisite Old Civilization metals, resistant to almost all forms of damage. Está hecho de exquisitos metales de la Antigua Civilización, resistentes a casi todas las formas de daño. + + +### Cyber Mittens + +### These mittens force your hands into fists, keeping you from using them to do anything useful. + +### It is made of a strong mesh of ancient metallic fiber, kept in place with a metal band. + +### Cyber Lockdown Mitts + +### These long mittens force your hands into fists, keeping you from using them to do anything useful. + +### It is made of a strong mesh of ancient metallic fiber, wrapped snugly around your arms to make removal by yourself impossible. + Doll Heels tacones de muñeca A pair of tall heels used to improve the aesthetics and controllability of dolls. Un par de tacones altos que se utilizan para mejorar la estética y el control de las muñecas. -It's made of exquisite Old Civilization metals, resistant to almost all forms of damage. -Está hecho de exquisitos metales de la Antigua Civilización, resistentes a casi todas las formas de daño. + + Cyber Doll Belt Cinturón de muñeca cibernética A chastity belt created by the Old Civilization. Truly a marvel of science! @@ -16478,34 +21124,40 @@ It's made of exquisite Old Civilization metals, resistant to almost all forms of Está hecho de exquisitos metales de la Vieja Civilización, resistentes a casi todas las formas de daño, y acolchado con una forma avanzada de látex diseñado para uso permanente. Cyber Doll Bra Sujetador Cyber ​​Doll -A chastity bra created by the Old Civilization. Truly a marvel of science! -Un sostén de castidad creado por la Antigua Civilización. ¡Verdaderamente una maravilla de la ciencia! +### A chastity bra created by the Old Civilization. Truly a marvel of science! The flexible material over the breasts hardens when squeezed, unless allowed for by the program. + It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with an advanced form of latex designed for permanent wear. Está hecho de exquisitos metales de la Vieja Civilización, resistentes a casi todas las formas de daño, y acolchado con una forma avanzada de látex diseñado para uso permanente. + + Doll Jacket Chaqueta de muñeca A jacket used to secure particularly unruly dolls. Una chaqueta que se usa para asegurar muñecas particularmente rebeldes. The material is somehow both stretchy yet hard enough to chip a knife on. The pinnacle of Old Civilization materials science. El material es de alguna manera tanto elástico como lo suficientemente duro como para astillar un cuchillo. El pináculo de la ciencia de los materiales de la Vieja Civilización. + + Dollmaker's Visor Visera de fabricante de muñecas -A visor used by the Dollmaker for assigning arbitrary tasks to her dolls. -Un visor utilizado por Dollmaker para asignar tareas arbitrarias a sus muñecas. +### A visor used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. + It's made of metallic glass, almost indestructible. Fortunately, it's still possible to see through. Está hecho de vidrio metálico, casi indestructible. Afortunadamente, todavía es posible ver a través. Dollmaker's Mask Máscara de fabricante de muñecas -A mask used by the Dollmaker for assigning arbitrary tasks to her dolls. -Una máscara utilizada por Dollmaker para asignar tareas arbitrarias a sus muñecas. -It's made of metallic glass, almost indestructible. Fortunately, it's still possible to see through. -Está hecho de vidrio metálico, casi indestructible. Afortunadamente, todavía es posible ver a través. +### A mask used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. + Detected new hardware. Nuevo hardware detectado. [Restriction Protocol] Detected new hardware: RESTRAINTNAME. Install progress: PERCENT% [Protocolo de restricción] Nuevo hardware detectado: RESTRAINTNAME. Progreso de la instalación: PERCENT% -[Restriction Protocol] Installation complete. Engage mobility restrictions. -[Protocolo de restricción] Instalación completa. Activar restricciones de movilidad. +### [Restriction Protocol] Installation complete. Completing uniform. + +### [Punishment] Engage mobility restrictions. + + + [Training Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% [Protocolo de entrenamiento] Hardware detectado: RESTRAINTNAME. Progreso de la instalación: PERCENT% Supplemental Stimulation @@ -16514,23 +21166,11568 @@ Endurance Training Entrenamiento de resistencia Frustration Tolerance Tolerancia a la frustración -Mental Resistance -Resistencia Mental [Training Protocol] Installation complete. Engage training mode: CHASTITYMODE [Protocolo de entrenamiento] Instalación completa. Activa el modo de entrenamiento: CHASTITYMODE You feel your belt insert new toys into your body... Sientes que tu cinturón introduce nuevos juguetes en tu cuerpo... + + [Sensory Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% [Protocolo sensorial] Hardware detectado: RESTRAINTNAME. Progreso de la instalación: PERCENT% [Sensory Protocol] Installation complete. Engage sensory restrictions. [Protocolo sensorial] Instalación completa. Activa las restricciones sensoriales. + + [Tracking Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% [Protocolo de seguimiento] Hardware detectado: RESTRAINTNAME. Progreso de la instalación: PERCENT% [Tracking Protocol] Installation complete. Engage tracing system. [Protocolo de seguimiento] Instalación completa. Enganche el sistema de rastreo. + + Your visor dims to help you focus on your task. Su visor se atenúa para ayudarlo a concentrarse en su tarea. + + Escaped Doll Muñeca escapada You return the doll to her rightful owner. -Devuelves la muñeca a su legítimo dueño. \ No newline at end of file +Devuelves la muñeca a su legítimo dueño. + + +### Your movement sets off your [RESTRAINTNAME] + +### Your struggling sets off your [RESTRAINTNAME] + +### Your attack sets off your [RESTRAINTNAME] + +### The straps on your gag prevent you from loosening the blindfold! + +### The straps on your gag keep your blindfold securely in place! + +### Revert + +### Confirm Revert? + +### Save + +### Save Changes? + +### Back to Menu + +### Back to Wardrobe + +### Confirm Strip? + +### Strip! + +### Export Outfit + +### Export AlwaysDress + +### Export Hair + +### Export Face + +### Export Cosplay + +### Gamma + +### Original Color + +### Contrast + +### Brightness + +Red +Rojo +Green +Verde +Blue +Azul +### Transparency + +### Reset Layer! + +### Reset Properties! + +### Export All Layers + +### Export All Props + +### Copy + +### Paste + +### Items on Ground: + +### Preloading Character Assets: + +### Currently Worn + +### Uniforms + +### Suits + +### Underwear + +### Bras + +### Bodysuits + +### Socks + +### Shoes + +### Tops + +### Sleeves + +### Corsets + +### Skirts + +### Pants + +### Accessories + +### Fashion Restraints + +### Hats + +### Toys and Piercings + +### Hairstyles + +### Eyes + +### Body + +### Gloves + +### 'Cosplay' + +### Cat Eyes + +### Right Eye + +### Left Eye + +### Cat Brows + +### Right Brow + +### Left Brow + +### Simple Mouth + +### Simple Blush + +### Blush + +### Braid + +### Braid Front + +### Braid Back + +### Bangs Only + +### Bangs + +### Braid+Back + +### Braid Upper + +### Braid Lower + +### Back Only + +### Ahoge + +### Catsuit + +### Torso Lower + +### Torso Upper + +### Labcoat + +### Shoulders + +### ShouldersHogtie + +### Coat + +### CoatHogtieFree + +### Cape + +### Pauldrons + +### Breastplate + +### PlateBoots + +### BootLeft + +### BootRight + +### BootRightKneel + +### BootLeftHogtie + +### Gauntlets + +### GauntletLeft + +### GauntletRight + +### PlateArmor + +### ChainShirt + +### ShirtChest + +### Shirt + +### ChainSkirt + +### Skirt + +### ChainArmor + +### BanditShorts + +### Shorts + +### BanditLeftWrist + +### WristLeft + +### BanditRightWrist + +### WristRight + +### BanditWrist + +### BanditBoots + +### ShoeLeft + +### ShoeRight + +### ShoeRightKneel + +### ShoeLeftHogtie + +### BanditBreastplate + +### Striped Skirt + +### MaidApron + +### Apron + +### MaidBlouse + +### Blouse + +### BlouseBust + +### MaidBow + +### Bow + +### MaidCorset + +### Corset + +### MaidCorsetFull + +### CorsetStraps + +### MaidSockLeft + +### SockLeft + +### MaidSockRight + +### SockRight + +### MaidShoes + +### MaidSocks + +### Maidforce Agent + +### Elven + +### Bunny Suit + +### Dress + +### WitchBlouse + +### BlouseLiner + +### WitchCorset + +### WitchHat + +### WitchHatBack + +### ApprenticeHat + +### ApprenticeHatPuff + +### WitchShoes + +### WitchSkirt + +### SkirtBelt + +### SkirtRuffle + +### Witch + +### WarriorBoots + +### SportsBra + +### WarriorBustier + +### BustierChest + +### Bustier + +### WarriorBelt + +### DragonNecklace + +### Necklace + +### DragonArmband + +### Armband + +### DragonCollar + +### WarriorSkirt + +### Dragonheart + +### ZombieHat + +### ZombieHatBand + +### ZombieChestTalisman + +### ZombieTalisman + +### ZombieTalismanBent + +### Sandals + +### RobeBra + +### RobeSleeveLeft + +### SleeveLeft + +### RobeSleeveRight + +### SleeveRight + +### RobeSleeves + +### RobeSleeveDecoLeft + +### SleeveDecoLeft + +### RobeSleeveDecoRight + +### SleeveDecoRight + +### RobeSleevesDeco + +### Ribbon + +### RibbonBelt + +### RibbonBack + +### RobeSkirt + +### Robes + +Arm Ropes +cuerdas de brazo +### Upper Chest Strap + +### Shoulder Straps + +### Lower Chest Straps + +### Arm Straps + +### HairBow + +### Bow‎ + +### HairBowFrilly + +### BowFrills + +### Hairband + +### MaidHairband + +### MaidFrill + +### BackStraight + +### Curly + +### Curly_Overstrap + +### Fluffy + +### Fuzzy + +### Fuzzy_Overstrap + +### FrontStraight + +### FrontStraight_Overstrap + +### Straight + +### Straight_Overstrap + +### Long Straight + +### StraightBangs + +### StraightBangs_Overstrap + +### Curly Back + +### Messy + +### MessyBackShort + +### Short Messy + +### Underlight + +### CurlyBack + +### Ponytail + +### FluffyPonytail + +### Ponytail2 + +### TwintailLeft + +### TwintailRight + +### ArmRight + +### ArmLeft + +### ShoulderRight + +### ShoulderLeft + +### ForeArmRight + +### ForeArmLeft + +### HandRight + +### HandLeft + +### ForeHandRight + +### ForeHandLeft + +### LegLeft + +### FootRightKneel + +### FootLeftHogtie + +### LegRight + +### Butt + +### Eyes2 + +### Whites + +### Whites2 + +### HumanEyes + +### Brows + +### Brows2 + +### KjusEyes + +### KjusBrows + +### KjusMouth + +### KjusBlush + +### Hikimayu + +### DaskEyes + +### ElfEars + +### ElfFront + +### ElfBack + +### ElfEarsLong + +### ElfLongFront + +### ElfLongBack + +### ElfEarsFloppy + +### ElfFloppyFront + +### ElfFloppyBack + +### ElfEarrings + +### ElfEarringsFront + +### ElfEarringsBack + +### Earrings + +### EarringsBack + +### BunnyEars + +### EarsInner + +### KittyEars + +### Kitty + +### KittyInner + +### WolfEars + +### Wolf + +### WolfInner + +### FoxEars + +### Fox + +### FoxInner + +### WolfTail + +### KittyTail + +### Kitty2Tail + +### Kitty2 + +### FoxTail + +### Fox2Tail + +### Fox2 + +### Fox3Tail + +### Fox3 + +### Fox4Tail + +### Fox4 + +### Fox5Tail + +### Fox5 + +### Fox6Tail + +### Fox6 + +### Fox7Tail + +### Fox7 + +### CatsuitLower + +### TorsoLower + +### FootRight + +### FootLeft + +### CatsuitUpper + +### TorsoUpper + +### TransparentCatsuit + +### ShortsLeft + +### BanditPouch + +### Pouch + +### BanditKnee + +### Knee + +### BanditChoker + +### Choker + +### Stripe + +### SkirtOver + +### StripeOver + +### StockingLeft + +### FootSockLeftHogtie + +### StripeSockLeft + +### StockingRight + +### FootSockRightKneel + +### StripeSockRight + +### Stockings + +### BlouseLeft + +### BlouseRight + +### SkirtRuffleOver + +### LeatherGloveLeft + +### GloveLeft + +### ForeGloveLeft + +### RimGloveLeft + +### RimForeGloveLeft + +### BandGloveLeft + +### BandForeGloveLeft + +### LeatherGloveRight + +### GloveRight + +### ForeGloveRight + +### RimGloveRight + +### RimForeGloveRight + +### BandGloveRight + +### BandForeGloveRight + +### LeatherGloves + +### RibbonFarBack + +### KiguMask + +### Mask + +### Lock + +### EyesWhites + +### Swimsuit + +### SwimsuitChest + +### StrappyBra + +### ChestStrappy + +### VBikini + +### StrappyBikini + +### StrappyLower + +### StrappyHarness + +### Strappy + +### StrappySwimsuit + +### BunnySockLeft + +### BunnySockRight + +### BunnySocks + +### BunnySocksRestraint + +### BunnyGloveLeft + +### BunnyGloveRight + +### BunnyGloves + +### BunnyGlovesRestraint + +### BunnyLeotard + +### Leotard + +### LeotardChest + +### LaceCorset + +### LaceCorsetHardware + +### LaceCorsetStripes + +### LaceCorsetCrystal + +### LaceBra + +### LaceChest + +### LaceChestCups + +### LaceChestStripes + +### LaceBustier + +### LaceDeco + +### LaceChestDeco + +### LaceChestDecoCrystal + +### LaceChestDecoHardware + +### LaceBraDeco + +### LaceCorsetRestraint + +### LaceBustierRestraint + +### LaceBraDecoRestraint + +### BowCorsetBow + +### BowCorsetBust + +### BowCorsetBustRuffle + +### BowCorsetBustBow + +### BowCorset + +### BowCorsetRuffle + +### BowCorsetLong + +### BowCorsetLongRuffle + +### BowCorsetOverbust + +### BowCorsetLongOverbust + +### BowCorsetOverbustBow + +### BowCorsetLongOverbustBow + +### BowCorsetRestraint + +### BowCorsetBowRestraint + +### BowCorsetOverbustRestraint + +### BowCorsetOverbustBowRestraint + +### BowCorsetLongOverbustRestraint + +### BowCorsetLongOverbustBowRestraint + +### LatexCorset + +### HeavyCorset + +### LatexBra + +### ChestHeavyCorset + +### LatexBraStraps + +### StrapsHeavyCorset + +### LatexBraStrapsCross + +### CrossHeavyCorset + +### LatexBustier + +### LatexCorsetFull + +### LatexCorsetStrap + +### LatexCorsetFullStrap + +### LatexCorsetCross + +### LatexCorsetFullCross + +### LatexCorsetRestraint + +### LatexBustierRestraint + +### LatexCorsetFullRestraint + +### LatexCorsetStrapRestraint + +### LatexCorsetCrossRestraint + +### LatexCorsetFullStrapRestraint + +### LatexCorsetFullCrossRestraint + +### LacePanties + +### LaceCrotchPanel + +### LaceCrotchPanelTrim + +### LaceCrotchPanelLace + +### DressSkirt + +### BindingDress + +### BlouseCollar + +### DressBlouseBust + +### BlouseTorso + +### BlouseSkirt + +### BlouseSkirtOverKneel + +### BlouseNeck + +### DressBlouseBustCropped + +### CroppedBlouseTorso + +### DressBlouseSleeveLeft + +### BlouseArmLeft + +### BlouseForeArmLeft + +### DressBlouseSleeveRight + +### BlouseArmRight + +### BlouseForeArmRight + +### DressBlouseSleeves + +### DressBlouse + +### Glasses + +### GlassesLens + +### MonocleLeft + +### MonocleLensLeft + +### MonocleRight + +### MonocleLensRight + +### DressShoes + +### LeatherMittenLeft + +### LeatherLeft + +### BandLeft + +### LockLeft + +### LeatherMittenRight + +### LeatherRight + +### BandRight + +### LockRight + +### LatexMittenLeft + +### LatexLeft + +### ZipperLeft + +### LatexMittenRight + +### LatexRight + +### ZipperRight + +### LeatherPawMittenLeft + +### PawLeft + +### LeatherPawMittenRight + +### PawRight + +### LeatherMittens + +### LeatherPawMittens + +### LatexMittens + +### LongMittenLeft + +### LongLeft + +### LongMittenRight + +### LongRight + +### LongMittens + +### ElfPanties + +### ElfTop + +### ElfBra + +### ElfCollar + +### ElfCollarRestraint + +### ElfCirclet + +### Circlet + +### Gem + +### ElfSkirtBack + +### SkirtBack + +### ElfSkirt + +### SkirtBand + +### ElfShoes + +### CrystalShoeLeft + +### CrystalShoeRight + +### ElfBandLeft + +### ElfBandRight + +### ElfBands + +### SteelYoke + +### Steel + +### SteelBar + +### RopeCrosstie1 + +### ArmStrap + +### Arm1 + +### ForeArm1 + +### RopeBoxtie1 + +### RopeWristtie1 + +### RopeChestStraps1 + +### Arm2 + +### ForeArm2 + +### RopeBoxtie2 + +### RopeWristtie2 + +### RopeChestStraps2 + +### ArmHarness + +### ArmStrapHarness + +### ArmHarnessUp + +### RopeBoxtie3 + +### RopeWristtie3 + +### RopeCuffs + +### Cuffs + +### RopeBelt + +### RopeHarness + +### Harness + +### HarnessLower + +### HarnessLowerStrap + +### RopeCrotch + +### Crotchrope + +### CrotchropeStrap + +### RopeToes + +### Toe + +### RopeFeet + +### RopeFeetHeavy + +### RopeAnkles1 + +### Calf1 + +### RopeAnkles2 + +### Calf2 + +### RopeAnkles3 + +### Calf3 + +### RopeLegs1 + +### Thigh1 + +### RightThigh1 + +### RopeLegs2 + +### Thigh2 + +### RightThigh2 + +### RopeLegs3 + +### Thigh3 + +### RightThigh3 + +### RibbonCrosstie1 + +### RibbonBoxtie1 + +### RibbonWristtie1 + +### RibbonChestStraps1 + +### RibbonBoxtie2 + +### RibbonWristtie2 + +### RibbonChestStraps2 + +### ArmHarnessUnderbust + +### RibbonCuffs + +### RibbonHarness + +### HarnessMid + +### RibbonCrotch + +### Crotch + +### CrotchStrap + +### RibbonToes + +### RibbonFeet + +### RibbonFeetHeavy + +### RibbonAnkles1 + +### RibbonAnkles2 + +### RibbonAnkles3 + +### RibbonLegs1 + +### RibbonLegs2 + +### RibbonLegs3 + +### ShacklesWristLeft + +### ShacklesWristRight + +### ShacklesWrists + +### ShacklesElbowLeft + +### ElbowLeft + +### ShacklesElbowRight + +### ElbowRight + +### ShacklesElbows + +### ShacklesArms + +### ShacklesAnklesLeft + +### AnkleLeft + +### ShacklesAnklesRight + +### AnkleRight + +### ShacklesAnkles + +### ShacklesThighLeft + +### ThighLeft + +### ShacklesThighRight + +### ThighRight + +### ShacklesThigh + +### ThighLink + +### AnkleLink + +### IronCollar + +### SteelCollar + +### SteelCollarRunes + +### IronBelt + +### WolfPanties + +### WolfCollar + +### CollarBand + +### WolfCollarTag + +### CollarHardware + +### CollarTag + +### WolfCollarSmall + +### FCollar + +### FCollarBand + +### WolfCollarSmallTag + +### FCollarHardware + +### FCollarTag + +### WolfHarnessUpper + +### HarnessUpper + +### HarnessBandUpper + +### WolfHarnessBelt + +### BeltMid + +### BeltBandMid + +### BeltHardwareMid + +### WolfHarnessLower + +### HarnessHardwareMid + +### HarnessBandLower + +### HarnessHardwareLower + +### WolfHarness + +### WolfCuffsAnklesLeft + +### BandAnkleLeft + +### WolfCuffsAnklesRight + +### BandAnkleRight + +### WolfCuffsAnkles + +### WolfCollarRestraint + +### WolfCollarTagRestraint + +### WolfCollarSmallRestraint + +### WolfCollarSmallTagRestraint + +### WolfPantiesRestraint + +### WolfHarnessLowerRestraint + +### WolfHarnessUpperRestraint + +### WolfHarnessBeltRestraint + +### WolfHarnessRestraint + +### WolfGloveLeft + +### WolfGloveRight + +### WolfGloves + +### WolfSockLeft + +### WolfSockRight + +### WolfSocks + +### WolfSocksRestraint + +### WolfTorsoLower + +### WolfTorsoUpper + +### WolfHeels + +### CuffsWristLeft + +### BandWristLeft + +### HardwareWristLeft + +### CuffsWristRight + +### BandWristRight + +### HardwareWristRight + +### CuffsWrists + +### CuffsElbowLeft + +### BandElbowLeft + +### HardwareElbowLeft + +### CuffsElbowRight + +### BandElbowRight + +### HardwareElbowRight + +### CuffsElbows + +### CuffsArms + +### CuffsAnklesLeft + +### HardwareAnkleLeft + +### CuffsAnklesRight + +### HardwareAnkleRight + +### CuffsAnkles + +### CuffsThighLeft + +### BandThighLeft + +### HardwareThighLeft + +### CuffsThighRight + +### BandThighRight + +### HardwareThighRight + +### CuffsThigh + +### LeatherCollar + +### BandCollar + +### HardwareCollar + +### LeatherCollarBell + +### BellCollar + +### LeatherCollarBow + +### BowBellCollar + +### BowCollar + +### LeatherBelt + +### BandBelt + +### HardwareBelt + +### SlimeMouth + +### FaceMouth + +### SlimeEyes + +### FaceEyes + +### SlimeHead + +### FaceFull + +### SlimeBoots + +### SlimeTorsoLower + +### SlimeThighs + +### SlimeLegs + +### SlimeFeet + +### SlimeArmLeft + +### SlimeArmRight + +### SlimeTorsoUpper + +### SlimeArms + +### SlimeHandLeft + +### SlimeHandRight + +### SlimeHands + +### RubberMouth + +### RubberEyes + +### RubberHead + +### RubberBoots + +### RubberTorsoLower + +### RubberThighs + +### RubberLegs + +### RubberFeet + +### RubberArmLeft + +### RubberArmRight + +### RubberTorsoUpper + +### RubberArms + +### RubberHandLeft + +### RubberHandRight + +### RubberHands + +### TapeMedBoots + +### TapeMedAnkles + +### TapeMedLegs + +### RightLegs + +### StrapCover + +### TapeMedBottom + +### TapeMedArms + +### Top + +### TapeFullArms + +### TopFull + +### ChestFull + +### ArmFullLeft + +### ArmFullRight + +### TapeMedHandLeft + +### TapeMedHandRight + +### TapeHeavyBoots + +### TapeHeavyAnkles + +### TapeHeavyLegs + +### TapeHeavyBottom + +### Bottom + +### TapeHeavyBottomFull + +### TapeHeavyArms + +### TapeHeavyArmsFull + +### TapeHeavyHandLeft + +### TapeHeavyHandRight + +### TapeHeavyHands + +### TapeBoots + +### TapeAnkles + +### TapeLegs + +### TapeBottom + +### TapeTorsoUpper + +### TapeArmLeft + +### TapeArmRight + +### TapeArms + +### TapeStrapArms + +### TopStrap + +### ChestStrap + +### ArmStrapLeft + +### ArmStrapRight + +### TapeStrappedArms + +### TapeHandLeft + +### TapeHandRight + +### BraProto + +### BraProtoLining + +### BraProtoLiningMid + +### BraProtoCups + +### BraProtoDisplay + +### BraProtoLock + +### BraCyber + +### BraCyberLining + +### BraCyberDisplay + +### BraCyberLock + +### ChastityBra + +### BraCups + +### BraLining + +### BraChain + +### BraLock + +### HeartBelt + +### BeltLining + +### BeltLock + +### BeltStrap + +### BeltStrapLining + +### CyberBelt + +### CyberLining + +### CyberDisplay + +### CyberPlug + +### CyberLock + +### ProtoBelt + +### Proto + +### ProtoLining + +### ProtoDisplay + +### ProtoPlug + +### ProtoLock + +### SmoothArmbinder + +### BinderLeft + +### BinderRight + +### Armbinder + +### StrapsLeft + +### StrapsRight + +### ArmbinderCross + +### Cross + +### SmoothArmbinderCross + +### ArmbinderSecure + +### SmoothArmbinderSecure + +### ArmbinderGwen + +### Gwen + +### SmoothArmbinderGwen + +### WolfArmbinder + +### JacketArmbinder + +### BeltsArms + +### Jacket + +### BeltsChest + +### JacketHeavy + +### BinderTorsoLower + +### BeltsTorsoLower + +### CrotchBelts + +### JacketStraps + +### StrapsArms + +### StrapsChest + +### StrapsUnderbust + +### JacketArmbinderSecure + +### JacketBolero + +### ChestBolero + +### JacketLeotard + +### LatexLower + +### LatexChest + +### LatexUpper + +### Legbinder + +### LegLegbinder + +### RightLegbinder + +### LegRightLegbinder + +### LacesLegbinder + +### TapeFace + +### ClothBlindfold + +### Cloth + +### BlindfoldBasic + +### Basic + +### BasicRim + +### BlindfoldLeather + +### LeatherBase + +### LeatherRim + +### KittyBlindfold + +### KittyEyes + +### BlindfoldTape + +### Tape + +### BalletHeels + +### BalletLeft + +### BalletRight + +### BalletSoleLeft + +### BalletSoleRight + +### BalletLaceLeft + +### BalletLaceRight + +### FlatBalletHeels + +### FlatBalletLeft + +### FlatBalletRight + +### ShinyBalletHeels + +### ShinyBalletLeft + +### ShinyBalletRight + +### BalletHeelsRestraint + +### FlatBalletHeelsRestraint + +### ShinyBalletHeelsRestraint + +### LeatherHeels + +### LeatherLegLeft + +### LeatherLegRight + +### TallHeels + +### TallLeft + +### TallRight + +### TallLegLeft + +### TallLegRight + +### TallHeelsRestraint + +### Legirons + +### LegironsLeft + +### LegironsRight + +### Irish8Ankle + +### Irish8AnkleLeft + +### Irish8AnkleRight + +### HandCuffs + +### CuffsLock + +### HingedCuffs + +### Irish8Cuffs + +### WolfCuffs + +### WolfCuffsChain + +### HarnessTop + +### BeltsTop + +### HardwareTop + +### BeltsMid + +### HardwareMid + +### HarnessStrap + +### BeltsStrap + +### HardwareStrap + +### BeltsOverbust + +### BeltsUnderbust + +### HardwareUnderbustOver + +### HardwareUnderbust + +### FutureHarnessChest + +### DisplayChest + +### MetalChest + +### FutureHarnessMid + +### StrapsMid + +### DisplayMid + +### MetalMid + +### FutureHarnessLower + +### StrapsLower + +### DisplayLower + +### MetalLower + +### FutureHarness + +### ClothCollar + +### ClothCollarTag + +### ClothBelt + +### ClothBeltLines + +### BeltLines + +### MaidGag + +### FrillyPanel + +### FrillyStraps + +### FrillyHardware + +### FrillyHighlights + +### DusterGag + +### Duster + +### GhostGag + +### Ball + +### Strap + +### BallGag + +### BallGagHarness + +### BallGagHarnessSecure + +### SideStrap + +### LargeBallGag + +### LargeBallGagHarness + +### LargeBallGagHarnessSecure + +### PanelGag + +### Panel + +### PanelGagHarness + +### PanelGagHarnessSecure + +### MuzzleGag + +### Muzzle + +### MuzzleGagHarness + +### MuzzleGagHarnessSecure + +### PlugGagPlug + +### PlugMuzzleGag + +### PlugMuzzleGagHarness + +### PlugMuzzleGagHarnessSecure + +### PlugPanelGag + +### PlugPanelGagHarness + +### PlugPanelGagHarnessSecure + +### TapeFull + +### TapeWrap + +### Wrap + +### TapeFullOver + +### TapeWrapOver + +### TapeCleave + +### Cleave + +### ClothCleave + +### ClothCleaveThick + +### CleaveThick + +### ClothKnot + +### Knot + +### ClothOTN + +### OTN + +### ClothOTM + +### OTM + +### GagLatex + +### GagLatexFlat + +### OTNFlat + +### GagLatexFlatHarness + +### GagLatexFlatHarnessSecure + +### GagLatexPlug + +### GagLatexPlugHarness + +### GagLatexPlugHarnessSecure + +### LatexNeckCorset + +### NeckCorset + +### NeckCorsetRim + +### LatexNeckCorsetGag + +### LatexNeckCorsetRestraint + +### LatexNeckCorsetGagRestraint + +### LatexNeckCorsetPlugGag + +### GagMetal + +### GagFabric + +### FabricMuzzle + +### KittyMuzzle + +### KittyMouth + +### Whiskers + +### KittyHarnessPanelGag + +### GagComfy + +### GagMetalRiveted + +### OTNRivets + +### SmoothBallGag + +### SmoothBallGagHarness + +### SmoothBallGagHarnessSecure + +### SmoothLargeBallGag + +### SmoothLargeBallGagHarness + +### SmoothLargeBallGagHarnessSecure + +### SegmentedLargeBallGag + +### SegmentedLargeBallGagHarness + +### SegmentedLargeBallGagHarnessSecure + +### SciFiBallGag + +### TopRim + +### Display + +### EnhancedSciFiBallGag + +### AdvancedSciFiBallGag + +### HarnessRim + +### HarnessDisplay + +### UltimateSciFiBallGag + +### UltimateSciFiBallGag2 + +### SegmentedLargePanelGag + +### SegmentedLargePanelGagHarness + +### SegmentedLargePanelGagHarnessSecure + +### SciFiPanelGag + +### AdvancedSciFiPanelGag + +### UltimateSciFiPanelGag + +### UltimateSciFiPanelGag2 + +### SegmentedPlugGag + +### SegmentedPlugGagHarness + +### SegmentedPlugGagHarnessSecure + +### SciFiPlugGag + +### AdvancedSciFiPlugGag + +### UltimateSciFiPlugGag + +### UltimateSciFiPlugGag2 + +### SimpleSciFiMuzzle + +### AdvancedSciFiMuzzle + +### SciFiPlugMuzzle + +### AdvancedSciFiPlugMuzzle + +### SimpleSciFiMuzzle2 + +### AdvancedSciFiMuzzle2 + +### BeltsArms1 + +### Arms1 + +### LeftArm1 + +### RightArm1 + +### BeltsArms2 + +### Arms2 + +### LeftArm2 + +### RightArm2 + +### BeltsArmsAll + +### BeltsLegs1 + +### Legs1 + +### RightLegs1 + +### BeltsLegs2 + +### Legs2 + +### RightLegs2 + +### BeltsLegsAll + +### BeltsFeet1 + +### Feet1 + +### BeltsFeet2 + +### Feet2 + +### BeltsFeetAll + +### ShadowHandsArms1 + +### ShadowHandsArms2 + +### ShadowHandsArmsAll + +### ShadowHandsLegs1 + +### ShadowHandsLegs2 + +### ShadowHandsLegsAll + +### ShadowHandsFeet + +### ShadowHandsMouth + +### ShadowHandsEyes + +### ShadowHandsCrotch + +### Cage + +### CageFront + +### CageBack + +### SarcoFront + +### SarcoWebs + +### SarcoBack + +### LatexCube + +### LatexCubeBack + +### Barrel + +### DisplayStand + +### DisplayFront + +### OneBarPrison + +### OneBarFront + +### OneBarBack + +### StardustCollar + +### MikoCollar + +### FutureCollar + +### Future + +### FutureBand + +### FutureDisplay + +### FutureRim + +### FutureLock + +### FutureCollarRestraint + +### ShockModule + +### Module + +### ModuleDisplay + +### TrackingModule + +### TrackingModuleDisplay + +### Goggles + +### GogglesRestraint + +### FullVisor + +### DollmakerFull + +### FullVisorRim + +### DollmakerFullRim + +### FullVisorRestraint + +### FullVisorRimRestraint + +### GasMask + +### Valves + +### Center + +### Nose + +### Plugs + +### GasMaskRestraint + +### Petsuit + +### LeftLegs + + + +### Braid_Overstrap + +### BraidBack + +### BackShortMessy + +### BackShortMessyUnderlight + +### KjusEyes2 + +### KjusEyes3 + +### KjusEyes4 + +### CatsuitLowerLowRise + +### TorsoLowerLowRise + +### SleevelessCatsuitUpper + +### SleevelessTorsoUpper + +### CatsuitTop + +### SleevelessTop + +### SleevelessTopChest + +### CatsuitTopV + +### SleevelessTopV + +### SleevelessTopVChest + +### CatsuitUpperCropped + +### TorsoUpperCrop + +### TransparentCatsuitUpper + +### TransparentCatsuitUpperCropped + +### TransparentCatsuitLower + +### TransparentCatsuitLowerLowRise + +### BunnyLeotardHigh + +### HighLeotard + +### FashionIronCollar + +### FashionIronBelt + +### FashionSteelCollarRunes + +### FashionSteelCollar + +### FashionShacklesWristLeft + +### FashionShacklesWristRight + +### FashionShacklesWrists + +### FashionShacklesElbowLeft + +### FashionShacklesElbowRight + +### FashionShacklesElbows + +### FashionShacklesArms + +### FashionShacklesAnklesLeft + +### FashionShacklesAnklesRight + +### FashionShacklesAnkles + +### FashionShacklesThighLeft + +### FashionShacklesThighRight + +### FashionShacklesThigh + +### FashionThighLink + +### FashionAnkleLink + +### FashionLeatherCollar + +### FashionLeatherBelt + +### FashionLeatherCollarBell + +### FashionLeatherCollarBow + +### FashionCuffsWristLeft + +### FashionCuffsWristRight + +### FashionCuffsWrists + +### FashionCuffsElbowLeft + +### FashionCuffsElbowRight + +### FashionCuffsElbows + +### FashionCuffsArms + +### FashionCuffsAnklesLeft + +### FashionCuffsAnklesRight + +### FashionCuffsAnkles + +### FashionCuffsThighLeft + +### FashionCuffsThighRight + +### FashionCuffsThigh + +### LatexTop + +### BraProtoLiningRim + +### BraProtoLiningMidRim + +### LatexTopZip + +### BraProtoLiningZip + +### BraProtoLiningMidZip + +### BraProtoLiningZipRim + +### BraProtoLiningMidZipRim + +### FashionGagMetal + +### FashionGagMetalRiveted + +### FashionGagFabric + +### FashionKittyMuzzle + +### FashionSimpleSciFiMuzzle + +### FashionAdvancedSciFiMuzzle2 + +### FashionAdvancedSciFiMuzzle + +### FashionSimpleSciFiMuzzle2 + + + +### Hairband2 + +### BraidCustom + +### BraidCustom_Overstrap + +### BraidCustomBack + +### BraidCustomBraid + +### BackShortCurly + +### BackShortCurlyUnderlight + +### AuraHair + +### HairAura_Front + +### HairAura + +### AuraBang_Left + +### HairAura_Left + +### HairAura_LeftB + +### AuraBang_Right + +### HairAura_Right + +### HairAura_RightB + +### AuraBang_Left_Back + +### AuraBang_Right_Back + +### Hair2 + +### Hair2_Front + +### Hair2_FrontB + +### Hair2_FrontC + +### Hair2_LeftPuff + +### Hair2_Left + +### Hair2_RightPuff + +### Hair2_Right + +### Hair3 + +### Hair3_FrontA + +### Hair3_FrontC + +### Hair3_FrontD + +### Hair3_Short + +### Hair3_Bangs + +### Hair3_FrontE + +### Hair3Back + +### Hair3_Back + +### Hair4 + +### Hair4_Front + +### Hair4_FrontB + +### Hair4_TailLeft + +### Hair4_Left + +### Hair4_LeftB + +### Hair4_TailRight + +### Hair4_Right + +### Hair4_RightB + +### Hair5 + +### Hair5_Front + +### Hair5_FrontB + +### Hair5_FrontC + +### Hair5_Highlight + +### Hair5_FrontD + +### Hair5_TailLeft + +### Hair5_Left + +### Hair5_TailRight + +### Hair5_Right + +### Hair6 + +### Hair6_Front + +### Hair6_FrontB + +### Hair6_TailLeft + +### Hair6_Left + +### Hair6_TailRight + +### Hair6_Right + +### Butt2 + +### EarsFront + +### CatsuitLowerLeotard + +### TorsoLowerLeotard + +### TransparentCatsuitLowerLeotard + +### ChainBikini + +### ChainSkirt2 + +### SkirtBeltDeco + +### SkirtBeltRivets + +### Skirt2 + +### FashionKiguMask + +### SwimsuitUnder + +### BunnyLeotardUnder + +### BunnyLeotardHighUnder + +### LeatherLeotardTop + +### LeatherLeotardBottom + +### LeatherLeotardCorset + +### LeotardCorset + +### Laces + +### LeatherLeotard + +### LeatherLeotardStrapsUpper + +### LeatherLeotardStrapsLower + +### StrapsHardware + +### LeatherLeotardStrapsLowerClean + +### StrapsLowerClean + +### OperaGloveLeft + +### OperaGloveRight + +### OperaGloves + +### OperaGlovesRestraint + +### SailorCollar + +### CollarStripe + +### SailorCollarFull + +### Bust + +### BustStripe + +### SailorBow + +### SailorTop + +### SailorSleeveLeft + +### HemLeft + +### SailorSleeveRight + +### HemRight + +### SailorSleeves + +### SailorShirt + +### Sailor + +### DressSkirtSplitNoBelt + +### SkirtSplit + +### SkirtSplitOver + +### DressSkirtSplit + +### SkirtSplitBelt + +### BlouseSkirtLone + +### Sunglasses + +### MageSkirt + +### Band + +### MageSkirtOver + +### MageCorset + +### MageCorsetStripes + +### MageBra + +### MageBraStripes + +### MageTop + +### MageCollar + +### MageCollarCrystal + +### MageCollarHardware + +### MageCollar2 + +### MageCollarTie + +### Mage + +### ChineseDress + +### Highlights + +### DressSkirtOverKneel + +### ChineseBra + +### ChineseTop + +### YukataWaist + +### Waist + +### WaistBand + +### YukataWaistPattern + +### WaistPattern + +### YukataTop + +### YukataSleeveLeft + +### YukataSleeveRight + +### YukataSleeves + +### YukataShirt + +### YukataSkirt + +### Yukata + +### YukataPattern + +### ForeLongMittenLeft + +### ForeLongMittenRight + +### FashionLeatherMittens + +### FashionLeatherPawMittens + +### FashionLatexMittens + +### FashionLongMittens + +### HeavyYoke + +### HeavySteel + +### HeavySteelPins + +### HeavySteelLock + +### HeavySteelHardware + +### HeavyFiddle + +### FiddleLines + +### FiddleBody + +### FiddleLock + +### BackFiddleLines + +### BackFiddleBody + +### RopeSuspension + +### Suspension + +### FashionRopeHarness + +### FashionRopeCrotch + +### FashionRopeChestStraps2 + +### FashionRibbonHarness + +### FashionRibbonCrotch + +### IronCollarClip + +### FashionIronCollarClip + +### QuakeCollar + +### QuakeCollarRestraint + +### BuckleCorset + +### BuckleCorsetBuckles + +### BuckleCorsetHardware + +### BuckleCorsetRestraint + +### StripedSkirt + +### StripedSkirtUnder + +### StripedSkirtOver + +### StripedSkirtUnderOver + +### ApronSkirt + +### MaidSkirt + +### MaidSkirtOver + +### ApronSkirtOver + +### LegRimLeft + +### LegBandLeft + +### LegPadsLeft + +### LegRimRight + +### LegBandRight + +### LegPadsRight + +### TorsoLowerRim + +### TorsoLowerBand + +### TorsoUpperCups + +### ChestRim + +### ChestBand + +### TorsoUpperBand + +### TorsoUpperRim + +### DivineCuffsWristLeft + +### WristLeftDeco + +### WristLeftLock + +### WristLeftLockPlate + +### WristLeftLockBand + +### DivineCuffsWristRight + +### WristRightDeco + +### WristRightLock + +### WristRightLockPlate + +### WristRightLockBand + +### DivineCuffsWrists + +### DivineCuffsElbowLeft + +### ElbowLeftDeco + +### ElbowLeftLock + +### ElbowLeftLockPlate + +### ElbowLeftLockBand + +### DivineCuffsElbowRight + +### ElbowRightDeco + +### ElbowRightLock + +### ElbowRightLockPlate + +### ElbowRightLockBand + +### DivineCuffsElbows + +### DivineCuffsArms + +### DivineCuffsAnklesLeft + +### AnkleLeftDeco + +### AnkleLeftLock + +### AnkleLeftLockPlate + +### AnkleLeftLockBand + +### DivineCuffsAnklesRight + +### AnkleRightDeco + +### AnkleRightLock + +### AnkleRightLockPlate + +### AnkleRightLockBand + +### DivineCuffsAnkles + +### DivineCuffsThighLeft + +### ThighLeftDeco + +### ThighLeftLock + +### ThighLeftLockPlate + +### ThighLeftLockBand + +### DivineCuffsThighRight + +### ThighRightDeco + +### ThighRightLock + +### ThighRightLockPlate + +### ThighRightLockBand + +### DivineCuffsThigh + +### DivineCollar + +### CollarDeco + +### CollarLock + +### CollarLockPlate + +### CollarLockBand + +### DivineBelt + +### BeltMetal2 + +### BeltMetal1 + +### BeltBase + +### BeltPin + +### LockBeltLines + +### LockBeltPlate + +### LockBeltShackle + +### LockBeltHighlight + +### FashionDivineCollar + +### FashionDivineBelt + +### FashionDivineCuffsWristLeft + +### FashionDivineCuffsWristRight + +### FashionDivineCuffsWrists + +### FashionDivineCuffsElbowLeft + +### FashionDivineCuffsElbowRight + +### FashionDivineCuffsElbows + +### FashionDivineCuffsArms + +### FashionDivineCuffsAnklesLeft + +### FashionDivineCuffsAnklesRight + +### FashionDivineCuffsAnkles + +### FashionDivineCuffsThighLeft + +### FashionDivineCuffsThighRight + +### FashionDivineCuffsThigh + +### DivineCuffsCleanWristLeft + +### WristLeftDecoClean + +### DivineCuffsCleanWristRight + +### WristRightDecoClean + +### DivineCuffsCleanWrists + +### DivineCuffsCleanElbowLeft + +### ElbowLeftDecoClean + +### DivineCuffsCleanElbowRight + +### ElbowRightDecoClean + +### DivineCuffsCleanElbows + +### DivineCuffsCleanArms + +### DivineCuffsCleanAnklesLeft + +### AnkleLeftDecoClean + +### DivineCuffsCleanAnklesRight + +### AnkleRightDecoClean + +### DivineCuffsCleanAnkles + +### DivineCuffsCleanThighLeft + +### ThighLeftDecoClean + +### DivineCuffsCleanThighRight + +### ThighRightDecoClean + +### DivineCuffsCleanThigh + +### DivineCollarClean + +### CollarDecoClean + +### DivineBeltClean + +### BeltDecoClean + +### BeltLockPlate + +### BeltLockBand + +### FashionDivineCollarClean + +### FashionDivineBeltClean + +### FashionDivineCuffsCleanWristLeft + +### FashionDivineCuffsCleanWristRight + +### FashionDivineCuffsCleanWrists + +### FashionDivineCuffsCleanElbowLeft + +### FashionDivineCuffsCleanElbowRight + +### FashionDivineCuffsCleanElbows + +### FashionDivineCuffsCleanArms + +### FashionDivineCuffsCleanAnklesLeft + +### FashionDivineCuffsCleanAnklesRight + +### FashionDivineCuffsCleanAnkles + +### FashionDivineCuffsCleanThighLeft + +### FashionDivineCuffsCleanThighRight + +### FashionDivineCuffsCleanThigh + +### SteelCuffsWristLeft + +### RimWristLeft + +### SteelCuffsWristRight + +### RimWristRight + +### SteelCuffsWrists + +### SteelCuffsElbowLeft + +### RimElbowLeft + +### SteelCuffsElbowRight + +### RimElbowRight + +### SteelCuffsElbows + +### SteelCuffsArms + +### SteelCuffsAnklesLeft + +### RimAnkleLeft + +### SteelCuffsAnklesRight + +### RimAnkleRight + +### SteelCuffsAnkles + +### SteelCuffsThighLeft + +### RimThighLeft + +### SteelCuffsThighRight + +### RimThighRight + +### SteelCuffsThigh + +### NeoSteelCollar + +### RimCollar + +### NeoSteelBelt + +### RimBelt + +### FashionNeoSteelCollar + +### FashionNeoSteelBelt + +### FashionSteelCuffsWristLeft + +### FashionSteelCuffsWristRight + +### FashionSteelCuffsWrists + +### FashionSteelCuffsElbowLeft + +### FashionSteelCuffsElbowRight + +### FashionSteelCuffsElbows + +### FashionSteelCuffsArms + +### FashionSteelCuffsAnklesLeft + +### FashionSteelCuffsAnklesRight + +### FashionSteelCuffsAnkles + +### FashionSteelCuffsThighLeft + +### FashionSteelCuffsThighRight + +### FashionSteelCuffsThigh + +### CyberCuffsWristLeft + +### ScreenWristLeft + +### DisplayWristLeft + +### LockWristLeft + +### CyberCuffsWristRight + +### ScreenWristRight + +### DisplayWristRight + +### LockWristRight + +### CyberCuffsWrists + +### CyberCuffsElbowLeft + +### ScreenElbowLeft + +### DisplayElbowLeft + +### LockElbowLeft + +### CyberCuffsElbowRight + +### ScreenElbowRight + +### DisplayElbowRight + +### LockElbowRight + +### CyberCuffsElbows + +### CyberCuffsArms + +### CyberCuffsAnklesLeft + +### ScreenAnkleLeft + +### DisplayAnkleLeft + +### LockAnkleLeft + +### CyberCuffsAnklesRight + +### ScreenAnkleRight + +### DisplayAnkleRight + +### LockAnkleRight + +### CyberCuffsAnkles + +### CyberCuffsThighLeft + +### ScreenThighLeft + +### DisplayThighLeft + +### LockThighLeft + +### CyberCuffsThighRight + +### ScreenThighRight + +### DisplayThighRight + +### LockThighRight + +### CyberCuffsThigh + +### NeoCyberCollar + +### ScreenCollar + +### DisplayCollar + +### LockCollar + +### CyberLinkCollar + +### LinkCollar + +### ScreenLinkCollar + +### DisplayLinkCollar + +### LockLinkCollar + +### NeoCyberBelt + +### ScreenBelt + +### DisplayBelt + +### LockBelt + +### FashionNeoCyberCollar + +### FashionCyberLinkCollar + +### FashionNeoCyberBelt + +### FashionCyberCuffsWristLeft + +### FashionCyberCuffsWristRight + +### FashionCyberCuffsWrists + +### FashionCyberCuffsElbowLeft + +### FashionCyberCuffsElbowRight + +### FashionCyberCuffsElbows + +### FashionCyberCuffsArms + +### FashionCyberCuffsAnklesLeft + +### FashionCyberCuffsAnklesRight + +### FashionCyberCuffsAnkles + +### FashionCyberCuffsThighLeft + +### FashionCyberCuffsThighRight + +### FashionCyberCuffsThigh + +### CrystalCuffsWristLeft + +### CrystalCuffsWristRight + +### CrystalCuffsWrists + +### CrystalCuffsElbowLeft + +### CrystalCuffsElbowRight + +### CrystalCuffsElbows + +### CrystalCuffsArms + +### CrystalCuffsAnklesLeft + +### CrystalCuffsAnklesRight + +### CrystalCuffsAnkles + +### CrystalCuffsThighLeft + +### CrystalCuffsThighRight + +### CrystalCuffsThigh + +### CrystalCollar + +### CrystalBelt + +### FashionCrystalCollar + +### FashionCrystalBelt + +### FashionCrystalCuffsWristLeft + +### FashionCrystalCuffsWristRight + +### FashionCrystalCuffsWrists + +### FashionCrystalCuffsElbowLeft + +### FashionCrystalCuffsElbowRight + +### FashionCrystalCuffsElbows + +### FashionCrystalCuffsArms + +### FashionCrystalCuffsAnklesLeft + +### FashionCrystalCuffsAnklesRight + +### FashionCrystalCuffsAnkles + +### FashionCrystalCuffsThighLeft + +### FashionCrystalCuffsThighRight + +### FashionCrystalCuffsThigh + +### Hobbleskirt + +### FashionBraProto + +### FashionBraCyber + +### FashionChastityBra + +### FashionHeartBelt + +### FashionCyberBelt + +### FashionProtoBelt + +### DivineBeltRunic + +### BeltMetalRunic2 + +### BeltMetalRunic1 + +### FashionDivineBeltRunic + +### DivineBra + +### BraLines + +### BraBase1 + +### BraBase2 + +### BraMetal1 + +### BraMetal2 + +### BraPins + +### BraStraps + +### LockBraLines + +### LockBraPlate + +### LockBraShackle + +### LockBraHighlight + +### FashionDivineBra + +### DivineBraRunic + +### BraMetalRunic1 + +### BraMetalRunic2 + +### BraStrapsRunic + +### FashionDivineBraRunic + +### SteelChastityBelt_Padlock + +### BeltPadlock + +### BeltPadlockPin + +### SteelChastityBelt_Radial + +### BeltRadial + +### SteelChastityBelt_Segu + +### BeltSegu + +### FashionSteelChastityBelt_Padlock + +### FashionSteelChastityBelt_Radial + +### FashionSteelChastityBelt_Segu + +### SteelChastityBra_Padlock + +### BraPadlock + +### BraPadlockPin + +### SteelChastityBra_Radial + +### BraRadial + +### SteelChastityBra_Segu + +### BraSegu + +### FashionSteelChastityBra_Padlock + +### FashionSteelChastityBra_Radial + +### FashionSteelChastityBra_Segu + +### JacketLowerStraps + +### JacketExtraStraps + +### StrapsTorsoLowerExtra + +### CrotchBeltExtra + +### StrapsChestExtra + +### JacketHeavyStraps + +### JacketLower + +### JacketExtra + +### JacketHeavyArmbinder + +### JacketExtraArmbinder + +### JacketHeavyBolero + +### JacketExtraBolero + +### JacketHeavyLeotard + +### JacketExtraLeotard + +### RightLacesLegbinder + +### LegLacesLegbinder + +### FashionClothBlindfold + +### FashionBlindfoldBasic + +### FashionBlindfoldLeather + +### FashionKittyBlindfold + +### FashionBlindfoldTape + +### SmoothHeels + +### TallBalletHeels + +### TallBalletHeelsRestraint + +### CyberBalletHeels + +### GlowBalletLeft + +### GlowBalletRight + +### CyberBalletHeelsRestraint + +### FashionHarnessTop + +### FashionHarnessMid + +### FashionHarnessStrap + +### FashionHarness + +### LockChest + +### LockMid + +### LockLower + +### FashionFutureHarnessLower + +### FashionFutureHarnessMid + +### FashionFutureHarnessChest + +### FashionFutureHarness + +### ClothTop + +### TopChest + +### TopShoulders + +### ClothBra + +### ClothTopBand + +### TopBandChest + +### TopBandRimChest + +### TopBand + +### TopBandRim + +### ClothBraBand + +### NinjaSkirt + +### SkirtBandOver + +### NinjaSockLeft + +### NinjaSockRight + +### NinjaThighLeft + +### NinjaThighRight + +### NinjaKneeLeft + +### KneeLeft + +### NinjaKneeRight + +### KneeRight + +### NinjaSocks + +### NinjaThighs + +### NinjaKnees + +### NinjaShoes + +### Ninja + +### FashionMaidGag + +### FashionDusterGag + +### FashionBallGag + +### FashionBallGagHarness + +### FashionBallGagHarnessSecure + +### FashionPanelGag + +### FashionPanelGagHarness + +### FashionPanelGagHarnessSecure + +### FashionMuzzleGag + +### FashionMuzzleGagHarness + +### FashionMuzzleGagHarnessSecure + +### FashionPlugMuzzleGag + +### FashionPlugMuzzleGagHarness + +### FashionPlugMuzzleGagHarnessSecure + +### FashionPlugPanelGag + +### FashionPlugPanelGagHarness + +### FashionPlugPanelGagHarnessSecure + +### FashionTapeCleave + +### FashionClothKnot + +### FashionClothCleaveThick + +### FashionClothCleave + +### FashionClothOTN + +### FashionClothOTM + +### GagLatexMute + +### MuteLogo + +### GagLatexMuteHarness + +### GagLatexMuteHarnessSecure + +### FashionGagLatex + +### FashionGagLatexFlat + +### FashionGagLatexFlatHarness + +### FashionGagLatexFlatHarnessSecure + +### FashionGagLatexMute + +### FashionGagLatexMuteHarness + +### FashionGagLatexMuteHarnessSecure + +### FashionGagLatexPlug + +### FashionGagLatexPlugHarness + +### FashionGagLatexPlugHarnessSecure + +### FashionLatexNeckCorsetPlugGag + +### FashionKittyHarnessPanelGag + +### FashionSmoothBallGag + +### FashionSegmentedLargePanelGag + +### FashionSegmentedLargePanelGagHarness + +### FashionSciFiPanelGag + +### FashionAdvancedSciFiPanelGag + +### FashionUltimateSciFiPanelGag + +### FashionUltimateSciFiPanelGag2 + +### FashionSegmentedPlugGag + +### FashionSciFiPlugMuzzle + +### FashionAdvancedSciFiPlugMuzzle + +### DivineGag + +### Teeth + +### Metallic + +### FashionDivineGag + +### DivineGagClean + +### GoldClean + +### FashionDivineGagClean + +### DivineMuzzle + +### MuzzleRim + +### MuzzleGold + +### MuzzleHarness + +### MuzzleCollar + +### FashionDivineMuzzle + +### DivineMuzzleClean + +### MuzzleGoldClean + +### FashionDivineMuzzleClean + +### FutureBox + +### Rim + +### Door + +### DoorWindow + +### DoorNumeral + +### BackFade + +### CrystalEncase + +### EncaseOver + +### EncaseUnder + +### FashionLeash + +### ArmsBelts + +### LegsBelts + +### LeftLegsBelts + +### ElitePetsuit + +### ArmsLaces + +### ArmsHardware + +### LegsLaces + +### LegsHardware + +### LeftLegsLaces + +### LeftLegsHardware + +### CyberPetsuit + +### DisplayArms + +### DisplayLegs + +### DisplayLeftLegs + +### NippleClamps + +### Clamps + +### ClampsBullet + +### NippleClampsRestraint + +### RingVibes + +### Rings + +### RingsBullet + +### RingVibesRestraint + +### NippleWeights + +### Weights + +### NippleWeightsRestraint + +### VibePiercings + +### VibePiercingsBullet + +### VibePiercingsRestraint + +### PostureCollarBasic + +### PostureCollar + +### PostureCollarRim + +### PostureCollarLoop + +### PostureCollarHardware + +### FashionPostureCollarBasic + +### FashionPostureCollar + +### ReverseBinder + +### ReverseBinderLeft + +### ReverseBinderRight + +### ReverseBinderStraps + +### ReverseBinderHardware + +### NightWhip + +### NightWhipLight + +### LatexWhip + +### KittyLatexEar + +### KittyLatexEarLight + +### KittyLatexEarMuff + +### KittyLatexEarMuffLight2 + +### KittyLatexEarMuffLight1 + +### KittyLatexTail + +### KittyLatexTailLight + +### KittyLatexTail2 + +### KittyLatexTail2Light + +### KittyLatex + +### SuccubusWing + +### SuccubusWingBase + +### SuccubusWingBack + +### SuccubusWingLight + +### SuccubusHorn + +### SuccubusHornRight + +### SuccubusHornLeft + +### SuccubusHornLight + +### SuccubusTail + +### SuccubusTailLight + +### SuccubusClaws + +### SuccubusClawLeft + +### SuccubusClawRight + +### SuccubusFeet + +### Succubus + +### SlimeBubble + +### BubbleSquishy + +### BubbleSquishyBack + +### LatexSphere + +### LatexSphereCutaway + +### LatexSphereCutawayBack + +### BallSuit + +### BubbleHead + +### FashionBubbleHead + +### BubbleArms + +### BubbleLegs + +### FashionBubbleLegs + + + +### Hair5_FrontE + +### BlankEyes + +### DaiBrows1 + +### DaiBrows2 + +### Glabella + +### Ridge + +### BraRim + +### InnerLines + +### BraUnder + +### BraUnderRim + +### BraStriped + +### Stripes + +### BraCherry + +### Cherry + +### BraRose + +### Rose + +### BraInvertedRose + +### InvertedRose + +### Straps + +### Base + +### Lines + +### PantiesBow + +### PantiesStriped + +### PantiesInvertedRose + +### PantiesCherry + +### PantiesBowStriped + +### PantiesHigh + +### PantiesHighStriped + +### SwimsuitRestraint + +### BlouseShoulderRight + +### SlayerCollar + +### CapeCollar + +### CapeCollarButton + +### CapeCollarRim + +### SlayerCape + +### CapeCollarInner + +### CapeStripe + +### CapeShoulderLeft + +### CapeShoulderRight + +### CapeShoulderLeftButton + +### CapeShoulderRightButton + +### CapeBack + +### LeatherMask + +### Hood + +### Gag + +### FashionLeatherMask + +### LeatherHood + +### FashionLeatherHood + +### CyberLongMittenLeft + +### CapForeLongMittenLeft + +### CapLongMittenLeft + +### CuffForeLongMittenLeft + +### CuffLongMittenLeft + +### DisplayForeLongMittenLeft + +### DisplayLongMittenLeft + +### LockForeLongMittenLeft + +### LockLongMittenLeft + +### GlowForeLongMittenLeft + +### GlowLongMittenLeft + +### StrapsForeLongMittenLeft + +### StrapsLongMittenLeft + +### UpperCuffLongMittenLeft + +### UpperDisplayLongMittenLeft + +### UpperLockLongMittenLeft + +### UpperGlowLongMittenLeft + +### CyberLongMittenRight + +### CapForeLongMittenRight + +### CapLongMittenRight + +### CuffForeLongMittenRight + +### CuffLongMittenRight + +### DisplayForeLongMittenRight + +### DisplayLongMittenRight + +### LockForeLongMittenRight + +### LockLongMittenRight + +### GlowForeLongMittenRight + +### GlowLongMittenRight + +### StrapsForeLongMittenRight + +### StrapsLongMittenRight + +### UpperCuffLongMittenRight + +### UpperDisplayLongMittenRight + +### UpperLockLongMittenRight + +### UpperGlowLongMittenRight + +### CyberLongMittens + +### CyberMittenLeft + +### MittenLeft + +### ForeMittenLeft + +### CyberMittenRight + +### MittenRight + +### ForeMittenRight + +### CyberMittens + +### CyberArmLeft + +### ArmLongMittenLeft + +### CyberArmRight + +### ArmLongMittenRight + +### UpperCuffForeLongMittenRight + +### CyberArms + +### FashionCyberLongMittens + +### FashionCyberMittens + +### CyberThighLink + +### GlowThighLink + +### CyberAnkleLink + +### GlowAnkleLink + +### FashionCyberThighLink + +### FashionCyberAnkleLink + +### CyberPanties + +### CyberPantiesLining + +### TallSmoothHeels + +### TallSmoothHeelsRestraint + +### NeckCorset2 + +### NeckCorsetRim2 + +### ShinyLatexMuzzle + +### NeckCorsetGag2 + +### NeckCorsetGagRim2 + +### NeckCorsetGag + +### ShinyLatexMuzzleRestraint + +### NeckCorsetRestraint + +### NeckCorsetGagRestraint + +### LatexPetsuit + +### LatexPetsuitGlow + +### GlowArms + +### GlowTorso + +### GlowLegs + +### GlowLeftLegs + +### MiniCape + +### Epaulettes + +### TheRobeOfChastity + +### ChestBase + +### Frill + +### ChestFrill + +### ChestGold + +### Plate + +### ChestPlate + +### GoldBase + +### ChestGoldBase + +### Fabric + +### ChestFabric + +### TheRobeOfChastityRestraint + +### Spats + +### GothicSkirt + +### WaistbandClips + +### Buttons + +### HemLower + +### HemLowerBack + +### HemUpper + +### GothicSkirtLace + +### LaceLower + +### LaceUpper + +### LightMaidKnight_Dress + +### DressChest + +### DressDeco + +### DressDecoBack + +### LightMaidKnight_Bra + +### LightMaidKnight_Top + +### LightMaidKnight_SleeveLeft + +### LightMaidKnight_SleeveRight + +### LightMaidKnight_Sleeves + +### LightMaidKnightHairband + +### Headband + +### HeadbandFrill + +### HeadbandRibbon + +### FootBootLeftHogtie + +### FootShoeLeftHogtie + +### GagNecklace + +### GagNecklaceBall + +### FashionGagNecklace + +### BondageBed + +### BedStraps + +### BedStrapsHogtie + +### LightMaidKnight_Apron + +### ApronChest + +### ApronBack + +### LightMaidKnight_Flower + +### Flower + +### LightMaidKnight_SockRight + +### LightMaidKnight_SockLeft + +### LightMaidKnight_Socks + +### LightMaidKnight_GloveLeft + +### LightMaidKnight_GloveRight + +### LightMaidKnight_Gloves + +### LightMaidKnight_GuardLeft + +### GuardLeft + +### GuardCuffLeft + +### GuardCuff2Left + +### LightMaidKnight_GuardRight + +### GuardRight + +### GuardCuffRight + +### GuardCuff2Right + +### LightMaidKnight_Guards + +### LightMaidKnight_Boots + +### LightMaidKnight_Pauldron + +### PauldronLeft + +### PauldronStrap + +### LightMaidKnight + +### HeavyMaidKnightHairband + +### HeadbandRibbonBack + +### FlowerLeaves + +### HeavyMaidKnight_Dress + +### DressSkirtHem + +### DressSkirtStripe + +### HeavyMaidKnight_SleeveLeft + +### SleeveLeftStripe + +### HeavyMaidKnight_SleeveRight + +### SleeveRightStripe + +### HeavyMaidKnight_ChestArmor + +### ChestArmor + +### HeavyMaidKnight_GloveLeft + +### HeavyMaidKnight_GloveRight + +### HeavyMaidKnight_Gloves + +### HeavyMaidKnight_GauntletLeft + +### HeavyMaidKnight_GauntletRight + +### HeavyMaidKnight_Gauntlets + +### HeavyMaidKnight_PauldronLeft + +### PauldronLeftStraps + +### PauldronLeftHardware + +### HeavyMaidKnight_PauldronRight + +### PauldronRight + +### PauldronRightStraps + +### HeavyMaidKnight_Pauldrons + +### HeavyMaidKnight_SideArmor + +### SideArmor + +### HeavyMaidKnight_Corset + +### HeavyMaidKnight_CorsetRestraint + +### HeavyMaidKnight_Sleeves + +### HeavyMaidKnight_ApronBottom + +### ApronBelt + +### ApronMiniBow + +### ApronCross + +### ApronStripe + +### ApronPattern + +### HeavyMaidKnight_ApronTop + +### ApronChestRuffles + +### ApronChestBelts + +### HeavyMaidKnight_Apron + +### HeavyMaidKnight_WaistBelts + +### BeltsHardware + +### HeavyMaidKnight_WaistPouches + +### Pouches + +### HeavyMaidKnight_Waist + +### HeavyMaidKnight_Boots + +### BootLegLeft + +### BootLegRight + +### HeavyMaidKnight_PantyhoseShorts + +### Pantyhose + +### HeavyMaidKnight_SockRight + +### HeavyMaidKnight_SockLeft + +### HeavyMaidKnight + +### BlondeFront + +### BlondeBangs + +### BlondeBack + +### FangMouth_Double + +### HoodCollar + +### BigBallTeethFang + +### MilitaryJacket_Sleeveless + +### MilitaryUniform_SleeveLeft + +### MilitaryUniform_SleeveRight + +### MilitaryUniform_Sleeves + +### MilitaryJacket + +### WhiteGloveLeft + +### WhiteGloveRight + +### WhiteGloves + +### UniformShirt_Sleeveless + +### UniformShirt_SleeveLeft + +### UniformShirt_SleeveRight + +### UniformShirt_Sleeves + +### UniformShirt + +### MilitaryUniform_Hat + +### Hat + +### HatRim + +### HatCap + +### HatGloriousInsignia + +### HatGloriousInsigniaHS + +### MilitaryUniform_Earphones + +### Headgear + +### HeadgearUnit + +### HeadgearEars + +### HeadgearEarsInner + +### HeadgearBack + +### MilitaryUniform_Searchlight + +### SearchlightPouch + +### Searchlight + +### SearchlightBase + +### SearchlightLens + +### MilitaryUniform_BeltPouch + +### BeltPouch + +### BeltPouchRim + +### MilitaryUniform_Webbing + +### Webbing + +### WebbingSide + +### WebbingHardware + +### WebbingName + +### WebbingUnderbust + +### WebbingUnderbustHardware + +### MilitaryUniform_Skirt + +### MilitaryUniform_Shoes + +### MilitaryUniform_TightsShorts + +### MilitaryUniform_SockLeft + +### MilitaryUniform_SockRight + +### Tights + +### MilitaryUniform_Hairpin + +### Hairpin + +### MilitaryUniform + +### ShirtSleeveLeft + +### ShirtForeArmLeft + +### ShirtSleeveRight + +### ShirtForeArmRight + +### ShirtShoulderRight + +### ShirtDress + +### ShirtDressChest + +### RubyNecklace + +### RubyChain + +### RubyRing + +### RubyGem + +### RubyNecklaceRestraint + +### SigilNecklace + +### SigilChain + +### SigilDisc + +### SigilNecklaceRestraint + +### MetalNecklace + +### MetalChain + +### MetalDisc + +### MetalNecklaceRestraint + +### NecklaceCharm + +### DragonNecklaceRestraint + +### BallTeeth + +### CrystalBallGag + +### CrystalBallGagSmooth + +### GagMetalRivetedStrap + +### OTNStrap + +### OTNStrapRivets + +### FashionGagMetalRivetedStrap + +### CrystalGagNecklace + +### CrystalGagNecklaceBall + +### FashionCrystalGagNecklace + +### LeashCollar + +### LeashCollarHardware + +### BootShoeLeft + +### BootShoeRight + +### Fear + +### RubyHardware + +### KiguMaskSmile + +### MouthSmile + +### FashionKiguMaskSmile + +### OneBarTop + +### OneBarPrisonLatex + + + +### FangMouth + +### FanglessMouth + +### SantaHat + +### HatBack + +### Fluff + +### Orb + +### FestiveArmbinder + +### BinderStrapLeft + +### BinderFluffLeft + +### FestiveHarnessTop + +### StrapTop + +### ButtonsTop + +### FuzzTop + +### FestiveHarnessMid + +### StrapMid + +### ButtonsMid + +### FuzzMid + +### FestiveHarnessStrap + +### StrapBot + +### ButtonsBot + +### FuzzBot + +### FestiveHarness + +### StrapOverbust + +### StrapUnderbust + +### ButtonsUnderbustOver + +### ButtonsUnderbust + +### FuzzUnderbustOver + +### FuzzUnderbust + +### FashionFestiveHarnessTop + +### FashionFestiveHarnessMid + +### FashionFestiveHarnessStrap + +### FashionFestiveHarness + +### FrillyHeadband + +### HeadbandBand + +### HeadbandBow + +### BowHeadband + +### BowHeadbandFrill + +### BackHime + +### HimeBack + +### BackShort + +### BackFlat + +### Bob + +### BobFront + +### FrontStraight2 + +### FrontStraight2_Front + +### FrontStraight2_Overstrap + +### FrontSwept + +### FrontSweptSide + +### Vents + +### VentL + +### VentR + +### VentsInnerR + +### VentsInnerL + +### VentsFront + +### BigBraidBack + +### CurlyPonytail + +### DrillLeft + +### DrillRight + +### Twindrills + +### Twintails + +### PointyAhoge + +### RoundHat + +### HatTop + +### TopHatSmall + +### TopHatSmallBow + +### BlondeFrontM + +### BlondeBangsM + +### BlondeBackM + +### Mascara + +### MascaraL + +### MascaraR + +### Scar + +### PointyAntennae + +### AnthenaL + +### AnthenaR + +### PointyHorns + +### HornL + +### HornR + +### PointyTail + +### Tail + +### WolfEars2 + +### EarLeft + +### EarRight + +### HairclipDual + +### HairclipLower + +### HairclipUpper + +### ChainPanties + +### PantiesChain + +### ChainPanties2 + +### KittyPetCuffsWristLeft + +### KittyPetCuffsWristRight + +### KittyPetCuffsWrists + +### KittyPetCuffsElbowLeft + +### KittyPetCuffsElbowRight + +### KittyPetCuffsElbows + +### KittyPetCuffsArms + +### KittyPetCuffsAnklesLeft + +### KittyPetCuffsAnklesRight + +### KittyPetCuffsAnkles + +### KittyPetCuffsThighLeft + +### KittyPetCuffsThighRight + +### KittyPetCuffsThigh + +### KittyPetCuffsCollar + +### FashionKittyPetCuffsCollar + +### FashionKittyPetCuffsWristLeft + +### FashionKittyPetCuffsWristRight + +### FashionKittyPetCuffsWrists + +### FashionKittyPetCuffsElbowLeft + +### FashionKittyPetCuffsElbowRight + +### FashionKittyPetCuffsElbows + +### FashionKittyPetCuffsArms + +### FashionKittyPetCuffsAnklesLeft + +### FashionKittyPetCuffsAnklesRight + +### FashionKittyPetCuffsAnkles + +### FashionKittyPetCuffsThighLeft + +### FashionKittyPetCuffsThighRight + +### FashionKittyPetCuffsThigh + +### KittyPawCuffsWristLeft + +### KittyPawCuffsWristRight + +### KittyPawCuffsWrists + +### KittyPawCuffsElbowLeft + +### KittyPawCuffsElbowRight + +### KittyPawCuffsElbows + +### KittyPawCuffsArms + +### KittyPawCuffsAnklesLeft + +### KittyPawCuffsAnklesRight + +### KittyPawCuffsAnkles + +### KittyPawCuffsThighLeft + +### KittyPawCuffsThighRight + +### KittyPawCuffsThigh + +### FashionKittyPawCuffsWristLeft + +### FashionKittyPawCuffsWristRight + +### FashionKittyPawCuffsWrists + +### FashionKittyPawCuffsElbowLeft + +### FashionKittyPawCuffsElbowRight + +### FashionKittyPawCuffsElbows + +### FashionKittyPawCuffsArms + +### FashionKittyPawCuffsAnklesLeft + +### FashionKittyPawCuffsAnklesRight + +### FashionKittyPawCuffsAnkles + +### FashionKittyPawCuffsThighLeft + +### FashionKittyPawCuffsThighRight + +### FashionKittyPawCuffsThigh + +### KittyPetLeotardUnder + +### LeotardStripes + +### LeotardChestStripes + +### KittyPetLeotard + +### KittyPetLeotardRestraint + +### KittyPetUniformCollar + +### LeotardChestCollar + +### LeotardChestCollarLeft + +### LeotardChestCollarStripes + +### LeotardChestCollarStripesLeft + +### CollarDecoSymbol + +### ShoulderCuffLeft + +### ShoulderCuffStripeLeft + +### ShoulderCuffRight + +### ShoulderCuffStripeRight + +### KittyPetTail + +### TailStripe + +### KittyPetBlindfold + +### BlindfoldRim + +### BlindfoldBrow + +### FashionKittyPetBlindfold + +### KittyPetSteelCollar + +### FashionKittyPetSteelCollar + +### KittyPetMittenLeft + +### GloveLeftPaw + +### ForeGloveLeftPaw + +### KittyPetMittenRight + +### GloveRightPaw + +### ForeGloveRightPaw + +### KittyPetMittens + +### FashionKittyPetMittenLeft + +### FashionKittyPetMittenRight + +### FashionKittyPetMittens + +### KittyPetEars1 + +### Ears1L + +### Ears1R + +### Ears1InnerL + +### Ears1InnerR + +### KittyPetEars2 + +### Ears2L + +### Ears2R + +### Ears2InnerL + +### Ears2InnerR + +### KittyPetEarmuffs + +### EarmuffersL + +### EarmuffersR + +### KittyPetEarmuffsRestraint + +### KittyPetEars1Restraint + +### KittyPetEars2Restraint + +### KittyPetGag + +### GagCollar + +### KittyPetGagSeamless + +### GagSeamless + +### KittyPetGagMouth + +### GagMouth + +### KittyPetGagMouthSeamless + +### GagMouthSeamless + +### FashionKittyPetGag + +### FashionKittyPetGagSeamless + +### FashionKittyPetGagMouth + +### FashionKittyPetGagMouthSeamless + +### KittyPetsuit + +### ArmsPaws + +### LeftLegsPaws + +### FootLeftHogtiePaws + +### KittyPetSockLeft + +### SockLeftPaws + +### KittyPetSockRight + +### KittyPetSocks + +### KittyPetSocksRestraint + +### KittyPetPawLeft + +### KittyPetPawRight + +### KittyPetPaws + +### KittyPetPawsRestraint + +### KittyPetPawShortLeft + +### KittyPetPawShortRight + +### KittyPetPawsShort + +### KittyPetPawsShortRestraint + +### Hide Items + +### Sort Items + +### Drop Items + +### Filter Items + +### Rarity + +### Magical + +### Knives + +### Potions + +### Power + +### Find In Inventory + +### A huge rubber cube rises up out of the floor! + +### The latex cube hardens into a solid, harmless entity. + +### The latex cube slowly engulfs you! (DamageTaken) + +### The latex cube touches you, spreading latex restraints across your body! (+RestraintAdded) + +### A small rubber cube rises up out of the floor! + +### Mini Latex Cube + +### The mini latex cube hardens into a solid, harmless entity. + +### The mini latex cube sticks to you! (DamageTaken) + +### The mini latex cube expands across your body, taking the form of restraints! (+RestraintAdded) + +### Gigantic Slime + +### The gigantic slime fizzles as its body becomes unstable! + +### The gigantic slime stretches a pseudopod and engulfs you! (+RestraintAdded) + +### The gigantic slime slowly engulfs you! (DamageTaken) + +### A group of slimes jump out! + +### A slime jumps out! + +### A group of speedy slimes jump out! + +### A speedy slime jumps out! + +### Chain Sword + +### Cut through their defenses and tie them up in the process! + +### Deals slash damage. Adds 10 metal binding. + +### You pick up sword with a bunch of chains attached. + +### Slime Sword + +### It wiggles as you move it around. + +### Deals glue damage. Adds 25 slime binding. + +### You pick up slime-covered sword. + +### Frost Blade + +### As cold as its creator. + +### Deals 20 bonus ice damage and briefly slows the target. + +### You pick up an icy sword. + +### Targe + +### Hide behind it while you still can. + +### +60 Block. Deals crush damage and stuns for 4 turns. Offhand: Gives the same block bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a wooden shield. + +### Tower Shield + +### Now with more leg room. + +### Slows you down by 1 level. +120 Block, +30 Physical Armor. Deals crush damage and stuns for 7 turns. Offhand: Slows you and gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a metal tower shield. + +### Reinforced Shield + +### New and improved, but also clumsier. + +### +80 Block, +15 Physical Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a reinforced shield. + +### Runic Shield + +### For when you've been tied up one too many times... + +### +80 Block, +20 Magic Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a runic shield. + +### Vanish + +### Make the targeted creature invisible, making you totally invisible for Duration turns. Attacking and casting spells reveals your presence but you are still harder to see. + +### The slime dissolves your clothing, leaving nothing but rubber against your skin... + + + +### Riposte + +### Blocking an enemy attack makes them vulnerable and stuns them briefly. + +### Parry + +### +15 Block while holding a weapon. + +### Dagger Parry + +### +15 Block while holding a light weapon such as a knife or dagger. + +Steadfast Guard +Guardia firme +### +5 Block for each 100 max willpower you have, while holding a non-light weapon. + +### The Power of Steel + +### +5 Block for each 100 max willpower you have, while holding a weapon that deals physical damage. + +### Secure Defense + +### +15-30 Block, based on your percentage of Willpower. + +### You block the EnemyName attack! + +### You block EnemyName! + +### You dodge EnemyName! + +### You block the EnemyName! + +### You dodge the EnemyName! + + + +### You resist being bound! + +### Self Bondage Enthusiast + +### Start with a basic self-bondage kit. + +### Apprehended + +### When you are bound by an enemy attack or spell, you are stunned 1 turn per restraint added. + +### Feeble Attacks + +### All enemies gain 20 physical and magic armor. + +### Glass Cannon + +### The effects of you taking damage are increased by 150%. + +### The Wand is Mightier + +### Enemies have 30% more hp; Tease damage multiplier to bound targets is increased by 85%. + +### Kinky Armory + +### Chef + +### You defeat the chef and claim her prize. + +### The chef makes sure you'll never steal again! (DamageTaken) + +### The chef makes sure you'll never steal again! (+RestraintAdded) + +### The chef spanks you with her frying pan! (DamageTaken) + +### As you eat, you look up and notice that someone is not very happy with you. + +### You find some delicious brownies! + +### Double Fudge Brownie + +### You enjoy the brownie one soft, delicious bite at a time. + +### A decadent blend of butter and chocolate topped with fudge and baked to perfection. + +### Restores 30% willpower. Takes a few turns to eat. + +### A playful ghost now accompanies you on your journey. + +### The ghost haunting you decides to have a little fun! (+RestraintAdded) + +### Hemp Rope + +### The most common type of bondage rope. + +### Soft and comfy. Great for casual wear! + +### Boxtie + +The ropes squeeze you gently. +Las cuerdas te aprietan suavemente. +Rope Cuffs +Puños de cuerda +A quick tie for apprehending prisoners. +Un lazo rápido para aprehender prisioneros. +It's not very secure. +No es muy seguro. +### Chest Straps + +### Chest Harness + +### The finishing touch on a tight and strict piece of ropework. + +Rope Hogtie +Corbata de cuerda +A very strict and tight hogtie, good for subduing unruly captives. +Un hogtie muy estricto y apretado, bueno para someter a los cautivos rebeldes. +### It holds you strictly in a boxtie. You tug on the rope connecting your feet and struggle. + +### It holds you strictly with your back arched. You tug on the rope connecting your feet and struggle. + +Rope Belt +cinturón de cuerda +Rope Harness +Arnés de cuerda +A harness that secures your other restraints and makes them tighter. +Un arnés que asegura sus otras restricciones y las hace más apretadas. +Crotch Rope +Cuerda de entrepierna +A tight rope impressing upon your most private areas... +Una cuerda floja imprimiendo en tus zonas más íntimas... +Wrist Rope +cuerda de muñeca +A wrist and elbow tie keeping your arms secured behind your back. +Una corbata de muñeca y codo mantiene sus brazos asegurados detrás de su espalda. +### Upper Knee Ropes + +### A tie that hobbles your knees together.. + +### Thigh Ropes + +### Upper Thigh Ropes + +### A tie that hobbles your thighs together.. + +Ankle Ropes +cuerdas de tobillo +### Lower Leg Ropes + +### Lower Knee Ropes + +### A tie keeping your knees secured together. + +### Toe Rope + +### A tie keeping your toes tightly together. + +### Living Rope Collar + +### This collar is designed to make sure its wearer does not escape their ropes. + +### It will occasionally cause ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Notebook Page + +### You're going to stay with me for a while~ + +### That's better! Now stay close to me~ + +### Looks like our time is coming to an end... + +### Time to bring you back to your place~ + +### You've been quite adorable! Until next time~ + +### It's time for your walk, miss. + +### Now let's see, where to go... + +### I think we've reached a stopping point. + +### I have to put you back now~ + +### It's been fun playing with you miss! + +### (reaches for your leash) + +### (holds your leash firmly) + +### (giggles) + +### (waves goodbye) + +### Why don't we go for a walk? + +### That's better! Now come along~ + +### This has been lots of fun! + +### I have to go return you~ + +### Good girl~ Let's go again later~ + +### It's time for walkies! + +### That's a good girl! + +### I want to keep you longer, but I've got things to do. + +### It's time to go back to your little house~ + +### (pats you on the head) + +### It is time for your mandatory exercise. + +### Please maintain proximity. + +### Progress Level: 90% + +### Exercise complete. Returning to storage. + +### Uploading logs to database. Error... no connection. + +### Latex Mimic + +### The latex mimic melts into a shiny puddle. + +### The latex mimic spits out a glob of rubber at you! (+RestraintAdded) + +### The latex mimic stretches out an appendage and pulls you toward it! (DamageTaken) + +### The latex mimic engulfs you in sticky rubber! (DamageTaken) + + + +### Item Stack: + +### Heavy + +### Accessory + +### Restraint + +### Enchanted + +### Mundane + +### Can Disassemble + +### Raw Material + +### Armbinders + +### Legbinders + +### Boxbinders + +### Devices + +### Toys + +### Collars + +### Jackets + +### Dresses + +### Ties + +### Wrapping + +### Gags + +### Harnesses + +### Mittens + +### Boots + +### C. Belts + +### C. Bras + +### Maid + +### Locked + +### Accessible + +### Inaccessible + +### Quick-Bind + + + + + +### Lower + +### Spellbound Rope + +### An enchanted rope with a powerful sealing spell. It cannot be cut by mundane means. + +### It almost has a kinky mind of its own. + +### Spellbound Boxtie + +The knots appear to tie themselves together again, making them impossible to undo! +¡Los nudos parecen unirse de nuevo, haciéndolos imposibles de deshacer! +### Spellbound Rope Cuffs + +### Spellbound Ropework + +A quick tie for apprehending prisoners, looped through buckles on the hand restraints. +Una corbata rápida para aprehender a los prisioneros, enrollada a través de hebillas en las restricciones de mano. +### Strict Spellbound Ropework + +### The finishing touches on a tight and strict piece of ropework. + +### Spellbound Hogtie + +### Spellbound Rope Belt + +### Spellbound Harness + +### Spellbound Crotch Rope + +### Spellbound Wrist Tie + +### Spellbound Knees + +### Spellbound Thighs + +### A tie that holds your legs together.. + +### Spellbound Upper Thighs + +### A tie that holds your thighs together.. + +### Spellbound Ankles + +### Spellbound Lower Legs + +### A tie keeping your legs secured together. + +### Spellbound Lower Knees + +### Spellbound Toe Rope + +### A tie keeping your toes secured together. + +### Living Spellbound Rope Collar + +### It will occasionally cause spellbound ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### A novice-level enchanted rope, relatively trivial to untie but resistant to mundane tools. + +### Faintly glows with traces of devious thoughts. + +### Magic Boxtie + +### They glow with a trace of magic. + +Magic Rope Cuffs +Puños de cuerda mágica +Magic Ropework +Cuerdas Mágicas +### Strict Magic Ropework + +Magic Hogtie +Hogtie mágico +It's very secure. You tug on the rope connecting your feet and struggle. +Es muy seguro. Tiras de la cuerda que conecta tus pies y luchas. +### Magic Rope Belt + +### Magic Harness + +Magic Crotch Rope +Cuerda mágica para la entrepierna +### Magic Wrist Tie + +### Magic Knee Tie + +### Magic Thigh Ropes + +### Magic Upper Thigh Ropes + +### Magic Ankle Tie + +### Magic Lower Leg Tie + +### Magic Lower Knee Tie + +Magic Toe Rope +Cuerda del dedo del pie mágico +### Living Magic Rope Collar + +### It will occasionally cause magic ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Celestial Rope + +### Rope that has been exposed to solar energies. + +### Squeezes the wearer if she tries to escape, so that she knows her place. + +### Holy Boxtie + +### A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. + +Holy Rope Cuffs +Puños de cuerda sagrada +Holy Ropework +Cuerda sagrada +### Strict Holy Ropework + +### Holy Hogtie + +### Holy Rope Belt + +Holy Rope Harness +Arnés de cuerda sagrada +Holy Crotch Rope +Cuerda de entrepierna sagrada +Holy Wrist Rope +Cuerda de muñeca sagrada +### Holy Upper Knee Ropes + +### Holy Thigh Ropes + +### Holy Upper Thigh Ropes + +Holy Ankle Ropes +Cuerdas de tobillo sagradas +### Holy Lower Leg Ropes + +### Holy Lower Knee Ropes + +### Holy Toe Rope + +### Living Holy Rope Collar + +### It will occasionally cause holy ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Mithril Rope + +### Rope made from silver thread, exposed to lunar energies. + +### Lightweight yet unyielding. Truly a high class rope. + + + +### Mithril Boxtie + +### A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. + +### Mithril Rope Cuffs + +### Mithril Ropework + +### Strict Mithril Ropework + +Mithril Hogtie +Corbata de mitril +### Mithril Rope Belt + +Mithril Rope Harness +Arnés de cuerda de mithril +Mithril Crotch Rope +Cuerda de entrepierna de mitril +### Mithril Wrist Rope + +### Mithril Lower Knee Ropes + +### Mithril Thigh Ropes + +### Mithril Upper Thigh Ropes + +### Mithril Ankle Ropes + +### Mithril Lower Leg Ropes + +### Mithril Toe Ropes + +### Living Mithril Rope Collar + +### It will occasionally cause mithril ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Dark Portal + +### They are trying to take you somewhere! + +### Essence Mote + +### A trainee can use this to focus. + +### Pick this up to gain decaying miscast reduction. + +### Seal Sigil + +### Walk over it to erase it and unlock the next floor. + +### The Shadow + +### The Shadow is exorcised... for now. + +### The Shadow overwhelms you with its power... (+RestraintAdded) + +### The Shadow welcomes you to your new future. (DamageTaken) + +### The Shadow cackles as your restraints are sealed! (DamageTaken) + +### The Shadow smiles and vanishes. + +### The Shadow smiles and vanishes, leaving you locked in a mysterious RNAME... + +### Observer + +### The observer is banished into the aether. + +### From the Beyond + +### You briefly spot your reflection as a reflective cube appears! + +### Mini Metal Cube + +### The liquid metal cube shatters into glittering dust. + +### The liquid metal cube sticks to you and hardens! (DamageTaken) + +### The liquid metal cube expands across your body and hardens, taking the form of restraints! (+RestraintAdded) + + + +### Liquid Metal + +### Primordial latex infused with mineral form. + +### Heavy and weighs the wearer down. + +### Liquid Metal (Feet) + +### A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. + +### Forming a skintight layer, it will be quite difficult to escape this. + +### Liquid Metal (Ankles) + +### Liquid Metal (Legs) + +### Liquid Metal (Arms) + +### Liquid Metal (Hands) + +### Liquid Metal (Mouth) + +### Liquid Metal (Head) + +### Living Liquid Metal Collar + +### This collar is designed to make sure its wearer does not escape the metal. + +### It will occasionally cause liquid metal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of liquid metal you have on you. + + + +### The stairs dissolve right before you! + +### The stairs dissolve as you step onto them, pulling you with them to somewhere else. + +### A dark energy enters your body... (DamageDealt) + +### A dark energy lurks within you. + +### You succumb to a dark desire... (+RestraintAdded) + +### Observer's Gaze + +### Industrial Tape Wand + +### A non-magical tape wand used for creating tight little packages. + +### Deals chain damage. 200% binding efficiency. Hitting an enemy applies the Taped debuff for 12 turns, increasing Chain damage to them by 15%. Deal 10 chain damage to adjacent Taped enemies while moving. + + + +### Bag of Goodies + +### Someone's secret stash. + +### Deals charm damage. Applies a toy to targets hit for 40 turns. Offhand: Applies a toy to targets you hit. + +### You find a bag filled with various toys and vibrators... + +### You play with yourself using some of the toys in the bag... + +### Magic Remote + +### The key to absolute power. + +### Triggers long-duration edging on basic attack if the target has a toy. Offhand: Applies short-duration teasing to targets you hit. + +### Vibrator Remote + +### You click the remote and hear a buzzing noise! + +### 15 charge to powerfully activate vibrators in an area for 15 turns. + +### 10 charge to activate vibrators in an area for 15 turns. + +### You find a golden crystal. It glows faintly. + +### You find a dull, gold-tinted crystal. + +### Save Loadout + +### Rubber Stick + +### A rubber cylinder without any lewd intentions whatsoever. + +### Deals grope damage. + +### You pick up a flexible rubber stick. + +### Blade of Ejahl + +### A piece of prized ancient equipment. Magical energy causes it to vibrate intensely. What could it have been used for? + +### Deals grope damage. Can spend 40 charge to add charm damage per hit for 10 turns. + +### You retrieve the Blade of Ejahl. + +### Intense Vibrations: The Blade of Ejahl deals bonus charm damage!!! + +### The Blade of Fla-peh buzzes with great power! + +### 40 charge to deal 30 charm damage per hit for 10 turns. + +### Enchanted Rope + +### She who lives by the rope, is tied up by the rope. + +### Deals chain damage and applies 50 points of rope binding. Draws 10 mana per hit to apply 50 extra points of magical binding. If you don't have mana, you fail to control the rope... + +### You find some enchanted rope. + +### Without mana to control it, the enchanted rope springs back upon you! + +### Light Bow + +### Pointy stick delivery system. + +### Reload time: None. Deals crush damage on melee. Draws 10 charge and 20 stamina to fire an ordinary arrow, dealing 30 pierce damage. + +### You find a wooden bow. + +### 10 charge to fire an arrow. Deals 30 pierce damage. + +### Choose projectile path + +### Arrow + +### You loose an arrow! + +### Fire Arrows + +### Converts arrows to fire arrows for 30 extra charge, which deal the arrow damage plus 20 as fire damage in a 3x3 area and stuns briefly. + +### You switch to using fire arrows. + +### Fire Arrow + +### Vine Arrows + +### Converts arrows to all-natural organic versions for 20 extra charge, which apply 80 binding to the target and deal chain damage instead. + +### You switch to using vine arrows. + +### Vine Arrow + +### A sudden burst of vines overtakes you as you find yourself wrapped up tightly! + +### You find a bow and a glowing crystal. The bow is scribed with runes of duplication. + +### Crossbow + +### Watch where you're pointing that thing! + +### Reload time: 3 stationary turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 65 pierce damage. + +### You find a crossbow. + +### 20 charge to fire a bolt. Deals 65 pierce damage. + +### Bolt + +### You pull the trigger! + +### Your RestraintName melts off! + +### Your RestraintName melts faster with the application of fire! + +### Your RestraintName hardens with the application of frost! + +### dmg + +### AMNT Evasion + +### AMNT% Accuracy + +### AMNT Magic Armor + +### AMNT Physical Armor + +### AMNT Bondage Resist + +### AMNT TYPE Resist + +### AMNT% TYPE Damage + +### AMNT% weapon phys. dmg + +### AMNT% weapon magic dmg + +### Infuse weapon AMNT% TYPE + +### AMNT TYPE on attack + +### AMNT Mana Efficiency + +### AMNT TYPE Mana Efficiency + +### AMNT% regen from mana pool + +### AMNT mana pool on capture + +### AMNT% Visibility Reduction + +### AMNT Distraction Decay + +### AMNT Distraction Per Turn + +### AMNT AP from attacks + +### After attacking with a teasing weapon: + +### Gain AMNT% Spell Damage for DRTN turns + +### Drains mana from the wearer. + +### AMNT Stat + +### Drop On Floor + +### Remove + +### Struggle + +### Leyline Map + +### Harness Plug Gag + +### A gag meant to keep people quiet by forcing a plug into their mouth and securing it in place with a strict harness. + + + +### Your OLDITM transforms into NEWITM! + +### Your OLDITM gains new properties! + + + +### Moon-Cursed Epicenter + +### The cursed epicenter disperses into black stardust. + +### The cursed epicenter retreats as you remove the last of your cursed restraints! + +### The cursed epicenter retreats as you are claimed by something else! + +### The cursed epicenter assaults your mind with its presence! (DamageDealt) + +### You feel your cursed items turn cold to the touch! + +### An cursed collar appears around your neck, feeling cold to the touch. + +### Cursing Sigil + +### A cursing sigil appears on the ground! + +### You are being cursed!!! + +### Star-Cursed Epicenter + +### Moondust Collar + +### 'You thought you could run forever, didn't you? Fate has a way of always catching up to you...' + +### Cannot be removed while you are wearing other Star Cursed items. + +### Stardust Collar + +### The cursed seal on the RestraintName vanishes into a brief veil of stardust. + +### Take AMNT damage to weaken the curse. Excludes shadow, psychic, charm, or damage taken at 0 WP. + +### You struggle uselessly, sealed in your fate. + +### You feel your restraints starting to weaken... + +### The cursed collar falls off, awaiting its next victim... + +### You must remove all other Star Cursed items before removing the collar. + +### Transformation: Items with generic curses transform into Star Cursed items. + +### With a burst of dark energy, your OLDITM gains new properties! + +### With a burst of dark energy, your OLDITM transforms into a NEWITM! + +### Restoration: While distracted, your Star Cursed restraints regain strength. + +### With the rush of pleasure, you feel your cursed restraints tighten and strengthen! + +### Corruption: While in the shadows, you slowly gain corruption. + +### Your willpower gain and struggle power is less effective due to your corruption. + +### Seduction: Gain distraction after taking damage. + +### Taking damage fills your minds with cursed thoughts... + +### Having taken damage, your distraction is increasing... + +### Punishment: When you defeat an enemy, you are stunned briefly and enemies are attracted. + +### Dark Voice: You are supposed to be a slave! + +### Submission: At 0 WP, you are restrained if you leave the presence of a hostile. + +### Dark Voice: Kneel before your mistress. + +### You must submit! Moving away from an enemy at 0 WP will bind you! + +### Denial: -10 WP when you try to Let Go. At 0 WP you cannot orgasm. + +### Dark Voice: Not yet. + +### Dark Voice: Your squirming pleases us. + +### Dark Voice: It is not your choice to make~ + +### Dark Voice: You may enjoy yourself, for now~ + +### Dark Voice: Yes, take in the pleasure... + +### Dark Voice: Enjoy a gift, dear~ + +### As you let go of yourself, the Robe of Chastity loses all effects! + +### The magic in the Robe of Chastity fades... for now. + +### You have failed to keep the principles of the Paladins... for now. + +### You feel vibrations in your leotard as the magically conductive fabric channels your power. + +### Your leotard produces a tingling full-body sensation as it channels your magic! + +### A tingling sensation serves to remind you of your leotard's magic properties. + +### Star: -20 Charm/Psychic Resist + +### Star: +40 all other resists + +### Mithril Orb + +### Shining strings encircle your body! + +### Your cursed items have attracted a powerful cursed spirit! + +### The seal on your RESTRAINTNAME is weakening. + +### The fighter pouts and runs away! + +### The fighter knocks you to the ground and binds you! (+RestraintAdded) + +### The fighter strikes you with her weapon! (DamageTaken) + +### The fighter takes you down with the back of her weapon! (DamageTaken) + +### The fighter puts you in a hold and manages to slip on a lock! (DamageTaken) + +### The fighter vanishes and ends up behind you! + + + +### The fighter moans loudly and rolls around on the floor! + +### The fighter wraps her arms around you with bindings in hand! (+RestraintAdded) + +### The fighter pins you with her weapon and grabs your breast! (DamageTaken) + +### The fighter enchants her weapon and strikes you! (DamageTaken) + +### The fighter smiles lasciviously as she dangles a lock in front of you! (DamageTaken) + +### The fighter enchants her weapon and flies forward! + + + +### The fighter drops her weapon and admits defeat! + +### The fighter feints and strikes, slapping you with the flat of her blade! (DamageTaken) + +### The fighter proudly clicks on a lock! (DamageTaken) + +### The fighter briefly vanishes and ends up behind you! + +### The fighter falls on her knees and begs! + +### The fighter throws an enchanted binding ring at you! (+RestraintAdded) + +### The fighter throws her weapon at you! (DamageTaken) + +### Casting SPNME + +### The door suddenly locks behind you! + +### Apply To Target + +### Purify + + + +### You need to target an NPC + +### Target must be bindable and disabled. + +### Target acquired! + +### Truss em up! + +### Choose target to bind + +### Target Acquired! + +### Designates the target for bondage and allows you to apply items from the inventory. Can only be applied to entities that are willing or disabled. Some items require higher levels of incapacitation to be applied + +### The Shoppe + +### Journey Selection + +### High-Security Prison + +### Doll Sorting Station + +### A cursed NEWITM flies out of the chest and latches tightly to you! + +### With a puff of magic, a NEWITM appears on your body! + +### You draw upon chaotic energies, restoring mana! + +### You draw upon chaotic energies, but your mind is unable to hold back the arcane forces! + +### Your attempt to call upon chaotic energies fails. + +### You are already at max mana. + +### The vibrator holds at full power to drive you over the edge! + +### The weapon needs to be loaded to fire. + + + +### Recurve Bow + +### Curvy, just like its user. + +### Reload time: 1 turn. Deals crush damage on melee. Draws 14 charge and 35 stamina to fire an ordinary arrow, dealing 40 pierce damage. + +### You find a recurve bow. + +### 14 charge to fire an arrow. Deals 40 pierce damage. + +### Recurve Bow Arrow + +### You loose a strong arrow! + +### Longbow + +### Great for building both empires and muscle. + +### Reload time: 2 turns. Deals crush damage on melee. Draws 18 charge and 60 stamina to fire an ordinary arrow, dealing 60 pierce damage. + +### You find a huge longbow. + +### 18 charge to fire an arrow. Deals 60 pierce damage. + +### Longbow Arrow + +### You loose a mighty arrow! + +### Pistol Crossbow + +### Lethal. Sustainable. Portable. + +### Reload time: 3 turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 45 pierce damage. + +### You find a pistol crossbow. + +### 20 charge to fire a bolt. Deals 45 pierce damage. + +### Pistol Bolt + +### Arbalest + +### At this point why not just use a gun? + +### Reload time: 5 stationary turns. Deals crush damage on melee. Draws 25 charge and no stamina to fire an ordinary arrow, dealing 70 pierce damage, passing through units. + +### You find an arbalest. + +### 25 charge to fire a bolt. Deals 100 pierce damage. + +### Heavy Bolt + +### The RSTNME is removed as the lock comes off. + +### You save the key in your inventory for future use. + +### You pick up a simple key for the simplest of locks. + +### Simple Keys + +### You twirl the keys around your finger. + +### A handy key for getting out of common handcuffs and shackles. + +### It's not sophisticated enough to work on higher-quality locks, but can be used many times. + +### You twirl a key around your finger. + +### You twirl a magic key around your finger. Careful not to lose it! + +### You fidget with a lockpick. + + + +### You pick up a tool for picking disc detainer locks. + +### Disc Lock Tool + +### You examine the tool. It has a replaceable tip for picking disc detainer locks. + +### A handy tool for picking disc detainer locks, popularized by a certain pair of professionals. + +### Features a replaceable head in case an unskilled user breaks it. Requires lockpicks to use. + + + +### Magical Weapon + +### Your Submissiveness determines how easily your character can resist the temptations of bondage. + +### Your Security Level is based on your history, and reputation with the MNFCTN. + +### Your Passion determines how likely you are to lose control of yourself involuntarily. + +### Your Frustration affects how quickly your Passion grows. More Frustration = More Passion + +### Nivah, Goddess of Dragons + +### Minivir, Goddess of Alchemy + +### Akasha, Goddess of Magic + +### Oriel, Goddess of Technology + +### Ninril, Giver of Life + +### Matah, Architect of Reality + +### Aether, Keeper of the Cosmos + +### Oblivion, Keeper of Secrets + +### Arcane Energy is stored by casting spells, up to 100% Max mana. + +### Battle Rhythm is gained by spending stamina through attacks, up to 40 total. + +### Arcane Blast + +### When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. Casting this spell consumes it to deal up 25% Max Mana as Arcane damage. Pierces enemies and walls. + +### Your eyes glow as energy surges from within! + +### Critical Hit! + +### Super Critical! + +### Surprise Bondage! + +### Arcane Energy + +### Rhythm + +### You avoid the attack in a flurry of impressive maneuvers! + +### Arcane Barrier + +### When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. When enabled, slowly convert Arcane Energy into a shield at a 1:2 ratio. Max shield is equal to 10% Max Mana. + +### You sense that a high value target is near. + +### You push yourself beyond physical limits! + +### You try to push yourself beyond your capabilities and falter... + +### You are already at max stamina. + + + +### Did the Research + +### Unlocks advanced tooltips for enemies showing their weaknesses. Also improves hearing by a small amount. + +### Well-Placed Traps + +### Trap spells always critically strike. + +### Hard to Catch + +### Adjacent NPCs count as corners/hooks for purposes of escaping. After being restrained, escape speed and power is increased for 12 turns (escape power is increased by +20% plus 2% of Bondage Resist). Removed if you restrain yourself. + +### Struggling is improved and escape is quicker! + +### Akashic Conflux + +### Costs 100 Arcane Energy and refunds 100 Mana. Bringing memories to life, you call upon your magical knowledge to ignore arm, leg, and verbal spell components for 3 turns. + +### You can ignore Arm, Leg, and Verbal components! + +### Magical whisperings circle around you, enabling you to cast spells without components! + +### You don't have enough Arcane Energy. You need AMNT. + + + +### Chaotic Overflow + +### Draw upon 35 WP to ignore spell components for Duration turns and fully restore your mana. The energy is uncontrollable, so there will be consequences... + +### Chaotic energy flows through you!!! + +### You try to call forth the chaotic energy, but it isn't interested in you anymore... + +### You don't have enough Willpower. You need at least 25%. + +### You are already full of chaotic energy! + +### Chaotic energy overtakes you, crystallizing into physical form... + +### Chaotic energy flows through you! You have a bad feeling about this... + + + +### You find a shimmering macaron. + +### Heavenly Crunch Macaron + +### You feel holy energy neutralizing the cursed magic permanently. + +### Some say it comes from a bakery in heaven itself. Others say it is simply made from lab-grade materials, and actually tastes awful. + +### Purifies and unlocks a cursed item and/or removes all curses from one currently worn item of your choice. + +### Congratulations! Your continued patronage has earned you|one (1) round trip to the nearest affiliated shop!|Simply step into the portal to continue...|(the Goddess is not responsible for any mishaps or fraud pertaining to the use of this portal) + +### (You step through the portal. An unperturbed shopkeeper greets you.)|Another visitor? Oh, it's just you~ + +### (Enter the portal) + +### (It's the return portal) + +### (You step through the portal and return to your adventure) + +### Select a restraint to remove the curse from + +### You don't have any restraints that can be removed + +### As you are low on mana, you are unable to store Arcane Energy. + +### You are recharging your next mana cost reduction. + + + +### Fast Recharge I + +### Inner power now recharges after 10 turns instead of 16. + +### Fast Recharge II + +### Inner power now recharges after 6 turns instead of 16. + + + +### Precise Targeting + +### Your first critical hit on a target is 1.5x more powerful. + +### Surprise Bondage + +### Binding from critical hits is 40% stronger + +### High Profile + +### Several enemies on each map will be high value, rewarding more gold and items for defeating them but increasing their strength. + + + +### You apply the RSTR to the ENNME! (AMNT% bound) + +### You untie the ENNME! (AMNT% bound) + +### +AMNT Bondage! + +### TargetEnemy receives AMNT binding! + +### TargetEnemy is disabled and receives an increased AMNT binding! + +### TargetEnemy resists bondage and receives a reduced AMNT binding! + +### Target must be helpless. + +### You steal the target's disguise! + +### You remove your disguise. + +### You are already wearing that faction's disguise. + +### Steal Disguise + +### Choose target to steal from + +### Steal's a helpless enemy's clothes, adding a great deal of distraction to her and stealing her disguise for yourself. Until you recast this on yourself, you gain a stealth bonus against members of the same faction. + + + +### Unstoppable (Ignore status/bondage) + +### Unflinching (Resist status/bondage) + +### Relentless (Stun resist when stunned) + +### Bulwark (Blocks some explosions) + +### Blindsight (See through walls) + + + +### Mana Harvesting + +### Defeating or capturing a spellcaster-type enemy recovers 10 arcane energy, reduced to 1 for other humanoids. + +### A powerful wind pushes you away!!! + +### Staff of Ropes + +### An enchanted rope kept in check by a magical seal. Surely this won't backfire... + +### +20% rope bindings applied. Deals chain damage. Active: Spend 25 mana to unleash the ropes in a wide AoE. + +### You pick up a staff of ropes. Finally, a way to contain its power! + +### Staff of Belts + +### Belts within belts, a fractal belt pattern buckled into oblivion. + +### +20% leather bindings applied. Leather spells apply debuffs for 30% longer. Deals chain damage. Active: Pull an enemy toward you and apply a small amount of bondage. + +### You pick up a staff of belts wrapped tightly in leather. + +### Binding Lock + +### A LKTYP lock clasps on to one of your restraints! + +### You are caught in a constricting field! (Dmgdlt) + +### Resin Coating + +### A layer of transparent resin derived from Green Latex. Unlike other forms of latex, this one is solid and fixes you in place. + +### It's like you're an art piece! If only you had some way to blast it off... + +### You hear a motor whirring... + +### A bubble of latex surrounds you and inflates, sealing you in! + +### A bubble of latex envelops you! + +### A ball of latex surrounds you and inflates, sealing around your neck! + +### A ball of latex envelops you! + +### The latex around you dampens your attacks, reducing physical damage by 30% and lowering your sight range. + +### Latex Ball + +### ...Lab Assistant? + +### You rescue the lab assistant. + +### The assistant restrains you! (+RestraintAdded) + +### The assistant gropes you playfully! (DamageTaken) + +### The assistant applies a lock! (DamageTaken) + +### The assistant splashes a solvent in your face, blinding you! (DamageTaken) + +### ...Glue Technician? + +### You rescue the glue technician. + +### The technician slaps adhesive restraints onto your body! (+RestraintAdded) + +### The technician polishes your restraints thoroughly! (DamageTaken) + +### The technician pours glue on you to make you stay still! (DamageTaken) + +### The technician inspects your restraints and adds a lock to spec! (DamageTaken) + + + +### Lab Assistant + +### The assistant envelops herself in her own bubble for protection. + +### Glue Bomb + +### Glue Technician + +### The technician trips and glues herself to the floor. + +### Quite sticky, innit? + +### Bow: This is a ranged weapon with a weapon ability. + +### Magic: Ignores evasion of ghost type enemies, can be used with abilities that require magic weapons. + +### Light: Can be used to cut even with bound arms. 50% reduced accuracy penalty from being bound. Can be held in mouth. + +### Offhand + +### Offhand: This weapon can be dual-wielded by some classes. + +### 2 Handed + +### 2 Handed: While wielding this as your primary weapon, you cannot wield an offhand weapon. Also this weapon can't be used while arms are tied. + +### Magical Focus + +### Magical Focus: Instead of losing accuracy, the stamina cost is increased when distracted. + +### Precision + +### Precision: Your arms need to be free to use this weapon. + +### Hands-Free + +### Hands-Free: Weapon can be used without free hands. + +### Shield + +### Shield: This weapon is intended for defensive use. + +### Heavy: This weapon takes +1 turns to switch to. Cannot be reduced to 0 by perks or upgrades. + +### Massive + +### Massive: This weapon either stuns or slows you after attacking with it. Handle with care! + +### Illumination + +### Illumination: This weapon is a light source. + +### Dual Wield + +### Designate an Offhand weapon to gain passive effects such as a light source, armor, or extra crit damage.|(Must equip Dual Wield spell to equip an offhand weapon) + +### Equip Offhand + +### Remove Offhand + +### Make a ranged attack with the spear. + +### Make a ranged attack with the pike. + +Ranged Attack +Ataque a distancia + + +### Combat Training + +### Your training has granted a number of bonuses:|-Weapon stamina cost is reduced by 1% per 10 current WP, up to a max of 40%.|-Slow effects wear off more quickly.|-While you are above 0 WP you gain 1 slow resist. + +### This is your current offhand weapon. + +### You are unable to wield this weapon offhand at the moment. + +### This is your previously held weapon. Click to switch to it. + +### You can't hold the WPN in your current state. + +### Charge! + +### Dash and make an attack attack against a target within 2 tiles. If it deals 20% of their current hp in damage, you knock them back and take their place, otherwise they take +15% max hp crush damage from hitting the wall. If the attack misses, you still dash. Costs stamina equal to your sprint cost plus your attack cost. + +### You charge at the target! + +### You need to target an enemy. + +### You don't have enough stamina. + +### You need to be able to sprint. + +### You need to be able to attack. + +### There is no room to dash! + +### Tools of the Trade + +### Allows you to craft bombs, smoke bombs, flash bombs, and invisibility potions. + +### (You start having crafty thoughts...)|(Gunpowder can be obtained from chests or Alchemists)|(Ectoplasm can be obtained from ghosts) + +### (You craft a Smoke Bomb) + +### (You craft 3 Flash Bombs) + +### (You craft a Bomb) + +### (You craft an Invisibility Potion) + +### (You don't have the required material) + +### (Use 1 Gunpowder to make a Smoke Bomb) + +### (Use 1 Gunpowder and one Ancient Crystal to make 3 Flash Bombs) + +### (Use 2 Gunpowder to make a Bomb) + +### (Use 3 Ectoplasm to make an Invisibility Potion) + +### Gunpowder + +### You toss some gunpowder on the floor! No picking it back up now... + +### Highly flammable. Do not eat. + +### Creates gunpowder tiles on the target area, which can be ignited. + +### You pick up a sack of gunpowder. + +### You toss some gunpowder on the floor! + +### Dual Wield (Rogue) + +### Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or extra crit damage.|Rogues cannot wield heavy or massive weapons in the offhand unless they are multiclass.|(Equip Dual Wield spell to equip an offhand weapon, or use the Items menu) + +### Dual Wield (Wizard) + +### Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or spell damage bonuses.|Wizards can only wield magic weapons in the offhand unless they are multiclass, and receive +1 slow level if they wield a 2-handed, heavy, or massive magical weapon in the offhand.|(Must equip Dual Wield spell to equip an offhand weapon) + +### Arcane Tome + +### Contains advanced formulas and thrilling tales of thirsty wizards. Can not critically strike. + +### +5% magic damage. Offhand: Applies passive bonus. + +### You find a magical tome. + +### Open the book. What can go wrong? + +### Contains a malevolent spirit that wishes only to tie up damsels. Can not critically strike. + +### +10% binding effectiveness. Offhand: Applies passive bonus. + +### You find a magical tome with a sealed padlock on it. + +### You know the location of ancient leylines and can draw upon 100 additional mana. + +### You don't want to open the book... (need willpower) + +### Chain Spirit + +### You open the book and suddenly a binding aura surrounds you! + +### Mathematical Error + +### You open the book to an unfinished page and the magic ink short-circuits! + +### Cracks begin to form in your RestraintName! + +### Your RestraintName shatters and falls off! + +### Load Hotbar + +### Save Hotbar + +### Clear Hotbar + +### Confirm clearing hotbar? + +### Add to Hotbar + +### Surrender: Your willpower is 0, giving huge penalties to struggling, Block, Evasion, and Bondage Resist. + +### Unbound Keybindings! --> + +### You've not enough keys!!! --> + +### Update your Keybindings!!! --> + +### I have altered the keybindings. Pray I do not alter them further. + +### Barricade + +### You knock over the barricade! + +### Anti-Damsel Barrier + +### You disable the barrier! + +### Barrier + +### You shatter the barrier! + +### Magical Barrier + +### You destroy the barrier! + +### Mass of Shadow Hands + +### You banish the shadow hands! + +### The shadow hands caress you and latch on! (DamageTaken) + +### The shadow hands caress you and latch on! (+RestraintAdded) + +### Shadow Chains + +### You break through the chains! + +### Conjured Chains + +### Magic Damage + +### Physical Damage + +### Special Ability + +### Ranged + +### Staff + +### Toy + +### Teasing + +### A rope trap springs upon you! + +### A ribbon trap springs upon you! + +### A chain trap springs upon you! + +### Magical vines wrap around you suddenly! + +### A belt trap springs upon you! + +### You find yourself suddenly bound tightly by magic gear! + +### Magical rubber emerges from the floor and encases you! + +### Slime appears at your feet and starts encasing you! + +### You find yourself suddenly bound tightly in latex gear! + +### A rubber cube rushes out of the floor and engulfs you! + +### Sharp Claws + +### While your hands aren't covered, your attacks deal 10 bonus slash damage on hit and you can cut restraints. + +### Powerful Bite + +### Gain access to the Bite spell. + +### Slime Girl + +### You are a shapeshifting slime, granting +100 Glue Resist and can squeeze thru bars. Escaping is easy, but your powers are sealed while wearing cursed or magic restraints. + +### Cybernetic + +### You have mechanical parts, granting +10 Physical Armor, +15 Block, and +10% base physical damage. -100 Electric Resist. + +### Magic Blood + +### You come from a magical lineage, granting +10 Magic Armor and +10% magic damage. + +### Beast Girl + +### You have animalistic features such as a bite spell, -10% attack stamina cost, and 10 slash damage on hit while hands are free. -100 Charm Resist. + +### Demon Girl + +### You are related to eldritch entities, granting +50% shadow damage and the ability to teleport between shadows. You are weak to holy restraints and bright light. + +### You are a minor angel sent to perform a specific task. You are forced to wear a full set of divine restraints, but gain an infinite mana pool, +20 Magic Armor, and +25% magic damage. + +### Elven Ancestry + +### You were blessed with immortality by Ninril, Goddess of Restoration, granting -50% sprint cost and -30 Physical Resist. While your WP is above 0, you regenerate WP and heal nearby allies. + +### Bast's Blessing + +### You were granted undead immortality by Bast, granting a bite, claws, catlike senses, and stamina regen scaling with your current WP. Your WP gain is halved and you get -100 Fire Resist. + + + +### Minefield + +### Booby traps set by enemies are much more common. + +### Fortified + +### Barricades set up by enemies do not expire, and enemies set them up even when not alerted. + + + +### Pass thru helpless allies + +### Pass thru helpless enemies + +### Pass thru neutrals + +### Pass thru summons + +### Pass thru shopkeepers + +### Pass thru special NPCs + +### Stop when enemies are first sighted + +### Suppress during combat + +### Step during combat + +### 0.1s/turn + +### 1.5s/turn + +### 0.5s/turn + +### 0.01s/turn + +### Shadowy Grasp + + + +### Magical Tornado + +### The tornado blasts you with powerful winds! (DamageTaken) + +### You dispel the tornado! + +### Shield of Flame + +### You dispel the shield! + +### Overgrowth + +### You cut through the overgrowth! + +### Wall of Water + +### You dispel the water wall! + +### Ice Spikes + +### You break through the ice! + +### Earth Monoliths + +### You shatter the monoliths! + +### Gravitational Pull + +### The earth emits a deep hum below your feet... + +### Electrified Sphere + +### You smash the electrified sphere! + +### A bolt of lightning arcs to you! (DamageTaken) + +### Earth Keeper + +### The earth keeper sinks into the wall. + +### The earth keeper conjures restraints on your body! (+RestraintAdded) + +### The earth keeper locks a restraint! + +### The earth keeper knocks you away with a powerful kick! + +### The earth keeper massages you gently! (DamageTaken) + +### The earth keeper knocks you away with a strong kick! (DamageTaken) + +### Flame Keeper + +### The flame keeper steps away into a fiery portal. + +### The flame keeper grabs you, and volcanic restraints emerge from her armor! (+RestraintAdded) + +### The flame keeper locks a restraint! + +### The flame keeper flanks you! + +### The flame keeper offers a painful caress! (DamageTaken) + +### The flame keeper rides forth on a wave of fire! + +### Smoldering Trail + +### Fiery Greatsword + + + +### Tangling Vines + +### Enchanted Bubble + +### A bubble of magic water starts forming around you! + +### The gap in the bubble closes, and you are fully sealed within the bubble! + +### Magical water reduces your accuracy and slows you significantly! + +### You attack twice! + +### You gain a free move from Combat Maneuvers! + +### Access denied. + +### Facility is under lockdown. + +### Please scan ID to continue. + +### Security Door + +### You break through the security door! + +### High Security Door + +### You knock down the security door! + +### Blast Door + +### You knock down the blast door! + +### You sell the ITM for VLU gp. + +### You sell #x ITM for VLU gp. + + + +### Directional Vision + +### Your vision is reduced except in the direction you are facing. + +### Inertia + +### Turning 180 degrees while moving requires an extra turn + +### Heavy Inertia + +### Turning 90 degrees while moving requires an extra turn + +### You turn. + +### You turn around. + +### Take Command + +### Unlocks several spells for commanding allies. + +### Attention! + +### Select allies in an area + +### Designate allies in a 3x3 area to follow orders. + +### You select the units. + +### Deselect + +### Deselect allies in a 3x3 area + +### You deselect the units. + +### Toggle Selection + +### Select ally + +### Toggle an allied unit's selection status. + +### You toggle the unit's selection. + +### Maneuver + +### Select target location + +### Order all selected units to move to the targeted point. + +### You order your units to move! + +### Hold Position + +### Selected units do not pursue enemies. + +### Free Movement + +### Cancels Hold Position on selected units. + +### Deselect All + +### Deselects all selected units. + +### On Me! + +### All selected units start following you + +### Disperse + +### All selected units stop following you + +### Defensive Order + +### All selected units switch to Defensive mode + +### Aggressive Order + +### All selected units switch to Aggressive mode + + + +### Unlock using magic + +### Include Weapons + +### Merge Armor + + + +### The NPC does not have enough money left! + +### You order the ENMY to come to you. + +### You order the ENMY to disperse. + +### You deselect all allies and select only the ENMY. + +### You remove the ENMY from your party. + +### Anti-Magic + +### Long ago, war raged across the globe.|Countless lives were lost fighting over pieces of rock in a vast ocean.|People turned to science, religion, and magic, anything to escape this cruel fate. + +### Then the archmagus, Sariel Vinlaga, discovered the secret of immortality.|Sharing her research across the globe, she laid the groundwork for an era of peace.|A great civilization arose, where magic and technology flourished. + +### But in the end, Sariel's experiments left her weakened and unable to save herself from death.|Without a leader, the Old Civilization collapsed into tyranny as warlords enslaved thousands.|Refugees fled across the sea in search of a new life, and in time the old empire was forgotten. + +### Hundreds of years later, a group of adventurers found a lost island full of ancient technology.|Countless visitors now flock to the ruins in search of wealth and wisdom...|...Unaware of the devious secrets sealed within long ago. + +### An item has increased your spell damage! + +### AMNT ice damage/turn vs. Frozen + +### AMNT shadow bleed (10 turns) + +### Sealing Talisman + +### You were hit by one of Fuuka's talismans. Fuuka's magic begins sealing your power! + +### You were hit by one of Fuuka's talismans. Fuuka's magic makes you sluggish!! + +### You were hit by one of Fuuka's talismans. Fuuka's magic renders you helpless!!! + +### You were hit by one of Fuuka's talisman projectiles. Fuuka's magic is restricting you! + +### Sealing Shadows + +### Shadowy magic is restricting you! + +### A powerful seal holds you in place temporarily!!! + +### You lock yourself in magical locks! + +### A collar module comes off with the collar! + +### Shock Module + +### A sinister device used to keep unruly wolfgirls in check. + +### If it works on them, it sure as heck works on you. It has a warning label that says: 'CAUTION: NOT WATERPROOF' + +### Tracking Module + +### A homing device used to track unruly pets that wander too far. + +### It has a warning label that says: 'CAUTION: NOT WATERPROOF' + +### Your RestraintName stops working due to water damage! + +### Your RestraintName sustains water damage from the high-pressure water! + +### The RestraintName fizzles out! + +### Your RestraintName short-circuits briefly from the electrical damage! + +### Quit Game + +### Your RSTRNT glows and its seal vanishes as the shrine's energy fills the air. + +### The seal on your RESTRAINTNAME weakens as you simmer just below the edge. + +### Through your determination, you suprress the seal on your RESTRAINTNAME!!! + +### The seal on your RESTRAINTNAME weakens as you maintain your composure. + +### Through your determination, you suprress the seal on your RESTRAINTNAME. + +### You lose focus and the seal on your RESTRAINTNAME strengthens! + +### The item refuses to budge as you try to take it off. + +### The item bears a seal of dark pleasure. You can suppress it by edging yourself. + + + +### Saved Outfits + +### Manage this Outfit + +### Change Pose + +### Quick Color Palette + +### Item Color + +### Item Catalog + +### Layers: + +### Hex Code: + +### Toggle Struggle UI Mode + +### Change Character Pose + +### Make Bullets Transparent + +### X-Ray Vision + +### Show Quick Inventory + +### Skip Tutorial + +### Mod Compat Mode (requires reload) + +### Welcome to Kinky Dungeon! It looks like this is your first time,|Would you like a brief walkthrough of the interface? + +### (Leave and Disable Tutorial) + +### (Yes Please!) + +### (It'd like a hands-on lesson) + +### Sure! I can lead you through some excercises in a safe and controlled environment.|This way you can figure things out at your own pace.|To start, choose one of the lessons below: + +### (Give me some rope lessons) + +### (Give me a nice leather outfit) + +### (I enjoy the cold embrace of steel) + +### (I love rubber!) + +### (On second thought, maybe not) + +### (About that hands-on lesson...) + +### This is you.|Over the course of the game, you will probably get tied up.|The controls to escape are located over your character.|Simply hover the mouse over your character to see them. + +### There are four main ways to escape restraints:|Struggling, which is effective against flexible and weaker restraints,|Cutting, which depends on your held weapon and the item's properties,|Unbuckle/Untying, which depends on having free hands,|And Unlocking, which is required before you can Unbuckle. + +### These are options for how to display your character.|You don't have to worry about them for now,|but when your character is tied up you may find them useful|...or enjoyable. + +### This is the buffs bar.|It shows various values and buffs relating to your character.|You can click the gold triangle to expand it,|Showing additional info about your character. + +### These are the action buttons.|You can use them to perform various actions like closing doors or sprinting.|You can also toggle various settings such as automatically passing|through allies or auto-pathing when there are no enemies nearby.|You can also swap between recently used weapons. + +### These are various submenus.|Your Inventory is used to brows items and use or equip them.|The Journal contains lore, notes, and hints gathered along your journey.|The Journal also contains info on available quests,|and your reputation with various factions. + +### This is the status bar, which gives info on your base stats.|Distraction determines how easy it is to cast spells and resist teasing.|Stamina is required to sprint and attack with a weapon.|Mana is used to cast spells. You have what is called a 'Mana Pool,'|which is excess mana that slowly refills you mana bar until it runs out.|Finally, running out of Willpower makes it much harder to escape bondage. + +### This is the hotbar.|Here you will find various spells and customizable actions.|You can customize it through the Spells submenu by clicking on a spell.|You can also add items, armor, and consumables to it from the Inventory. + +### Finally, this is where the message log will be.|It provides a written record of what happened the last few turns.|You can click the 'Log' button to expand the log,|Allowing you to look much further back. + +### Thats it for the UI.|If you want a more hands on tutorial, enter the portal to the top right,|near the training dummies.|You can click on NPCs (such as the ghosts in this room) to talk to them. + +### Game + + + +### Search ITMNS: + +### Search Items: + +### Search Spells: + +### Free + +### Disarmed!!! + +### Show Buffs and Stats + + + +### Remove Devotion + +### Devote Yourself + +### Pray for Assistance + +### This shrine bears a request carved in stone: + +### Accept the Quest + +### You accept the goddess' quest. + +### You cannot accept that quest right now. + +### Removes your devotion from this goddess. + +### You are not devoted to this goddess. + +### Guarantees a quest from this goddess on every floor. + +### You are already a devotee of this goddess. + +### Offer gold in exchange for help. Destroys the shrine. + +### Ask for help without offering gold. + +### You have already prayed at this shrine. + +### Listen to what the Goddess asks of you. + +### Accept the Goddess' quest. + +### Drink the mana in the shrine. Can be done once. + +### Bottle the mana in the shrine for later. Can be done once. + +### Cancel Quest + +### Cancels the quest. You will not be penalized. + +### You can't cancel this quest. + +### You have no quests currently. + +### A new quest has been added to your Journal. + +### Find the dressmaker's prized dress and wear it in front of her. + +### Rescue the bandit from false imprisonment. + +### Teach some unruly maids a lesson. + +### Defeat a rebel leader and show them their place. + +### Help the student acquire a scroll! + +### You are being chased by a band of relentless poachers. + +### Slay the Rope Kraken. + +### You did not do your quest! The Goddess has decided to punish you. + +### You have pleased the Goddess. + +### The Goddess calls you a good girl. + +### Rescue some alchemists from their own experiment. + +### Stop rebels from making a pact with primordial beings. + +### Decommission some malfunctioning drones. + +### Resolve a dispute between elves and catgirls by tying up both sides. + +### Repel a planar incursion by a dangerous demon. + +### Stop some witches from performing a dubious summoning ritual. + +### Defeat a congregation of the Shadow Clan. + + + +### The Goddess grants you knowledge of SpellLearned! + +### You Goddess grants you +AMOUNT spell points! + +### The Goddess bestows a WeaponAcquired on you! + +### The Goddess grants you a ArmorAcquired! + +### The Goddess gives you a heavenly pastry. + +### The Goddess awards you an ancient key of great importance. + +### Game Setup + +### Challenge Settings + + + +### Challenge Settings: + +### Advanced + +### Expert Tools + +### Exits locked!|Find NUMBER keys! + +### Got the keys! + +### Find the keys hidden in the level. Enemies can steal the keys if you aren't careful. + +### There seems to be a locked high-security door. Looks like you need keys to open it. + +### Exits locked!|Find a lever! + +### Exits unlocked! + +### Lever Hunt + +### Find the lever hidden in the level to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to pull a lever to open it. + +### Exits locked!|Find control panel! + +### Panel Hunt + +### Find the control panel hidden in the level to unlock the door. + +### There seems to be a locked high-security door. Looks like you need find a control panel to open it. + +### BOSS ROOM + +### BOSS ROOM CLEARED! + +### Boss + +### Defeat the boss to unlock the door. You can also unlock it by losing to the boss and being penalized. + +### There seems to be a locked high-security door. Looks like you need to defeat the boss to open it. + +### Exits locked!|Defeat NUMBER TYPE! + +### Quota Reached! + +### Bounty + +### Defeat the specified targets to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to defeat the targetted enemies to open it. + +### Exits locked!|Defeat TYPE! + +### Miniboss defeated! + +### Dangerous Bounty + +### Defeat the specified strong enemy to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to defeat the miniboss to open it. + +### Exits locked!|Open NUMBER Chests! + +### Chest Hunt + +### Unlock the specified number of chests to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to open more chests to open it. + +### Exits locked!|Accept NUMBER Quests! + +### Quest Hunt + +### Accept the specified number of goddess quests to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to accept more quests to open it. + +### Exits locked!|Trigger NUMBER Traps! + +### Trap Hunt + +### Trigger the specified number of traps to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to trigger more traps to open it. + +### Room bugged. Please Report. + +### This door failed to load and cannot be opened. Please report this bug to Ada with a save code. + + + +### Exit sealed!|Find the lair! + +### Sigils erased! + +### Dragon defeated! + +### Draconic Seal + +### A dragon has sealed the entrance. Defeat the dragon, or erase the sigil from her lair. + +### A draconic spell keeps the door sealed. You will have to confront its owner. + + + +### Exits locked!|Destroy NUMBER Servers! + +### Security System Compromised! + +### Clearance Granted! + +### Destroy Nevermere Servers + +### Destroy Nevermere servers to unlock the door. + +### Nevermere Inc. placed a computerized lock on the door. Destroy the security servers to pass. + +### Nevermere Server + +### Server smashed! + +### Destroy Drone Servers + +### Destroy Drone Node Servers to unlock the door. + +### The path forward is controlled by several ancient Drone Servers. Destroy them. + +### Drone Server Node + +### Drone node destroyed! + +### Rusty Server Node + +### loud beeping... + +### (Cursed) + +### (Purified) + +### of Agility + +### Precise + +### Silent + +### Blizzard + +### of Warding + +### of Freedom + +### of Resistance + +### of Power + +### Entuned + +### Draining + +### of Echoes + +### Infused + +### Explosive + +### Flaming + +### Focusing + +### of Empowerment + +### of Destruction + + + +### Phase Dance + +### For 4 turns, your movement does not advance time. Attacking or casting counts as one move and passes time as normal. + +### You are F A S T + +### Double Accel + +### Slow down time by 1/2 for 10 turns (world time). Stamina regens 50% slower. + +### Time is slowed by 2x + +### Triple Accel + +### Slow down time by 1/3 for 10 turns (world time). Stamina regens 75% slower. + +### Time is slowed by 3x + +### Quad Accel + +### Slow down time by 1/4 for 10 turns (world time). Stamina does not regen. + +### Time is slowed by 4x + +### Total Accel + +### Stop time 10 turns (world time). Stamina does not regen. + +### Time has come to a halt... + +### Time slows down by 2x! + +### Double Accel! + +### Time slows down by 3x! + +### Triple Accel! + +### Time slows down by 4x! + +### Quad Accel! + +### Time has ceased to pass. + +### Total Accel! + +### You begin to move at lightning speed! + +### ACCEL BEGIN! + +### Not enough mana. + +### You need to free your legs. + + + +### Swap + +### Choose a target with a clear line of sight to you and switch places with them. + +### You point at the target and swap places with them! + +### You point at the target and try tp swap places, but they resist! + +### You point at the target and try tp swap places, but they resist and the spell fails! + +### Choose target to swap with + +### The ENMY blocked your attack, negating it entirely! + +### The ENMY blocked your attack, reducing the damage by PCNT%! + +### The ENMY remains unscathed after putting up a strong defense! + +### The ENMY puts up surprising resistance, reducing the damage by PCNT%. + +### no damage + + + +### Raise Defenses + +### Spend 90 stamina to shield yourself from damage equal to your Block. Lasts 10 turns or until you attack. + +### Evasive Maneuvers + +### While active, you evade almost all attacks, but your stamina is drained by 50 per turn plus 10 per slow level. The base stamina cost is reduced by your Evasion. + +### Break Free + +### Consume 20 Battle Rhythm to increase escape power by +20% plus 1% of Bondage Resist. Lasts 60 turns or until your willpower reaches 0. + +### Problem Solving + +### While active, struggling takes an additional 10 turns, but escape power bonuses from tools and buffs is increased by +(25 + 20% Bondage Resist)% + + + +### You run out of strength to keep dodging... + +### You can't muster the strength to dodge right now... + +### You prepare to dodge!!! + +### Your expertise and skill provides you with additional tool effectiveness! (+AMOUNT%) + +### You raise your defences! + +### Your defenses are raised! + + + +### You don't have the will to break free. + +### You don't have enough Battle Rhythm. You need 20. + +### You channel your fighting spirit into your desire for freedom! + +### Your struggle power is greatly increased!!! + +### The teleportation partially succeeds due to an obstruction, placing you near the intended point. + +### The teleportation fizzles due to obstruction. + +### Confirm + +### Confirm and OVERWRITE SAVE + +### What is your name? + +### Enrage + +### Scream loudly, causing nearby enemies to investigate and increasing Battle Rhythm by 10. Has a 100 turn cooldown. + +### You shout loudly and shake your fist at the sky! (+10 BR) + +### Mmmph! (You can't shout while gagged) + +### You are plenty mad enough as is. + +### You are too tired to rage. Perhaps try a warm cozy bed instead? + +### turns + +### Your shield absorbed AMNT damage. + +### You are currently shielded from damage and some spells. + +### No offhand weapon set. Activate the spell in your hotbar to set one. + + + +### Flash Portal + +### After channeling for 2 turns, teleport to a nearby location (including into darkness). All adjacent creatures are teleported with you, in random order. + +### You call upon a misty portal to transport you and nearby creatures! + +### Transportation Portal + +### After channeling for 3 turns, teleport to a nearby location (including into darkness). Transports only allies, but they are stunned for the duration. + +### You call upon a misty portal to transport you and your allies! + +### Banishing Portal + +### After channeling for 3 turns, teleport all adjacent creatures to a point you can see. Does not teleport yourself. + +### You call upon a misty portal to transport those around you! + +### Rift + +### Tearing a rift in space, you teleport to a location (including into darkness). Leaves behind a rift for 4 turns, which enemies can follow you through. + +### You tear open a hole in space and step through! + +### Shadow Dance + +### While standing in a shadowed location, you can teleport to a nearby shadowed location. You can also teleport adjacent to shadow creatures. + +### You slip between the shadows... + +### Choose a shadow + +### Teleportation Circle A + +### When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. When learned, unlocks teleportation circle B and C as well. + +### You begin a teleportation ritual... + +### Choose a location to put a teleportation circle, or yourself to teleport to the created circle. + +### Teleportation Circle B + +### When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. + +### Teleportation Circle C + + + +### Nature Spirit + +### The nature spirit returns to the earth from whence it came. + +### Vine Bolt + + + +### Gunslinger + +### Weapons abilities and other abilities that cost charge contribute 20% of their cost to Battle Rhythm. + +### Effortless Assault + +### Weapon stamina cost is reduced by a percentage equal to your Battle Rhythm. + +### +50 Evasion from using Phase + +### Blade Dance + +### Costs 60 stamina to dash to an adjacent spot. If you are holding a physical weapon, deals cleave damage to nearby enemies equal to 50% weapon damage. If you have a Light offhand weapon, deal 75% of its damage as well. + +### You spin towards a location, slashing at nearby enemies! + +### The Shadow Within + +### Shadow Dance no longer requires you to be in shadow in order to dash to another shadow, but the mana cost is doubled when doing so. + + + +### Summon Holy Orb + +### Select where to put the holy orb (cannot place on occupied squares) + +### Create a stationary holy orb that lasts indefinitely and heals allies. It also fires blinding bolts at enemies within its aura. If you let go of yourself near a holy orb you are immediately punished. Should not be placed within 8 tiles of each other. + +### A holy orb descends, blessing you with its roundness. + +### You call upon the root of all enlightenment! + +### Holy Orb + +### The holy orb returns to its place in the sky. + +### Holy Bolt + +### The holy orb observes your lack of discipline, and issues a punishment. + + + +### Divine Chastity Belt + +### A chastity belt forged in holy light. Only a Goddess' will can release you. + +### There is no way even an angel can free herself. Its divine aura causes vibrators to cease right before you go over the edge. + +### Your Divine Chastity Belt causes the vibrators to stop. + + + +### A chastity belt forged in holy light. Only the will of a Goddess will release you! + +### You find a heavenly chastity belt. Who could it be for? + +### Divine Chastity Bra + +### A chastity bra forged in holy light. Only a Goddess' will can release you. + +### There is no way even an angel can free herself. Its divine aura prevents you from pleasuring yourself. + +### Your Divine Chastity Bra causes your whole body to go numb. + +### A chastity bra forged in holy light. Only the will of a Goddess will release you! + +### You find a heavenly chastity bra. Who could it be for? + +### Heavenly Chastity Belt + +### There is no way even an angel can free herself. Its divine aura causes vibrators to dampen right before you go over the edge. + +### Your Divine Chastity Belt magically dampens the vibrations just enough to edge you. + + + +### Heavenly Chastity Bra + +### There is no way even an angel can free herself. Its divine aura converts self-pleasure to stamina. + +### The divine aura drains the pleasure from your self-pleasuring and converts it to stamina. + + + + + +### Magic Arm Belts + +### Highly secure belts enchanted with magic. + +### Magic Leg Belts + +### Magic Ankle Belts + +### The Liquid Metal starts engulfing you! + +### The Liquid Metal explodes and covers you! + +### The Liquid Metal takes advantage of your status and engulfs you! + + + +### Silver Burst + +### Select a liquid metal tile + +### Target a liquid metal tile. After 3 turns, it erupts, spreading more liquid metal and engulfing any nearby creatures. Deals DamageDealt crush damage and applies 80 points of metallic binding. + +### A powerful explosion simmers beneath the surface...' + +### The ground shakes as a huge wall of liquid metal approaches! + +### Liquid Metal Cube + +### The liquid metal cube dissolves into a huge pile of glittering dust. + +### The liquid metal cube engulfs you and squeezes tightly! (DamageTaken) + +### The liquid metal cube engulfs your body and hardens, taking the form of restraints! (+RestraintAdded) + + + +### Skeleton Archer + +### Cursed Arrow + +### Because your hands are unavailable, you kick the target instead. + + + +### Your former owners are looking for you across the seven planes. + +### A local business is missing one of their models, and will stop at nothing to find her. + +### The Doll Shoppe + +### Elemental Slavers + +### Your duty as a maid is to keep the place clear of dirt and other hazards. + +### Dirt Pile + +### You clear out the dirt pile + +### A ENMY was lurking inside the dirt pile! + +### You skipped your duty and left some dirt missing in the last level! + +### The Dollmaker does not take no for an answer. + +### Fuuka's shrine maidens would like to have a word with you. + +### Your instructor will meet with you at regular intervals for further training. + +Hogtied! +¡Atado! +### Experience a comprehensive rope bondage experience. + + + +### Receive the following restraints: + +### You will be bound with some form of restraint. + + + +### Gag Geist + +### The gag geist goes silent. + +### The gag geist teases you playfully!! (DamageTaken) + +### The gag geist gags the girl with a ghastly grimace! (+RestraintAdded) + +### Poltergeist + +### The poltergeist goes silent. + +### The poltergeist gropes and teases you playfully, exhausting your stamina! (DamageTaken) + +### The poltergeist binds you with... something? (+RestraintAdded) + +### Invisible Gag + +### It's a gag, but invisible! + +### You wonder what color it is. + +### Invisible Blindfold + +### It's a blindfold, but invisible! + +### How exactly is this supposed to work? + +### Invisible Armbinder + +### It's an armbinder, but invisible! + +### Invisible Legbinder + +### It's an legbinder, but invisible! + +### This is starting to get cruel... + + + +### Strangely dressed zombies start approaching you!! + +### A floating chastity item appears and starts flying toward you! + +### You hear moaning as the statues start to move... + +### Devious tomes emerge from the bookshelves! + +### Armed mushrooms emerge from the ground to defend their home! + +### Playful ghosts slip through the walls, giggling to themselves! + +### Ancient drones drop from the ceiling and come to life! + +### You were always being watched... + +### You find a store of gunpowder! + +### Explosive Barrel + +### The explosive barrel falls apart and drops its gunpowder. + +### The explosive barrel catches fire and explodes! + +### The item demands copious mana, more than you can supply. You'll have to tie up a mage. + +### The cursed seal glows and pulsates as you struggle fruitlessly. + +### The curse has been lifted through judicious application of spellcasters. + +### The cursed item drains all of the caster's mana. It demands more. + + + +### Punishment Suit + +### A tool used by Nevermere on the most difficult and recalcitrant wolfgirls. + +### Designed to contain superhuman strength, struggling out of this would be a major feat. + +### Shield of (un)Clarity + +### Channel your clarity of mind into a powerful shield, filling your distraction bar completely and granting a temporary shield equal to 50% of the DP generated. 10% of the DP gained is gained as Desire, which prevents DP decaying below a certain point. + +### You form a... distracting mental barrier, shielding yourself for AMNT damage!!! + +### You are too distracted to form a mental barrier... + +### You have the mental clarity but not the magical clarity! (not enough mana) + +### You have formed a mental barrier... + + + +### Desire Burst + +### Overload Essence motes in an area, costing 10% max DP worth of Desire each. They explode, dealing (10 + 20% max DP) charm damage to enemies hit. If you don't have enough desire, the damage is reduced proportionally.||(Desire is the heart-shaped meter below your DP bar, and is gained slowly by being distracted) + +### You channel your distraction into the mote, overloading it! + +### You channel your distraction into the motes, overloading them! + +### You don't have enough of a desire to do that. + +### You must target at least one Essence Mote. + +### You have the desire but not the mana! + + + +### Your divine-locked restraints can only be removed by completing a shrine quest. + +### The Goddess hates you. That won't work. + + + +### Harvest + +### Requires a slashing weapon equipped. Activate to harvest all adjacent vine tiles, with a 25% chance per tile to obtain a seed.|Seeds can be planted to form gardens, which will grow in 100 turns to become vegetables, which can be eaten to restore WP or sold to the shopkeeper. + +### You twirl your weapon, harvesting AMNT seeds! + +### There is nothing to harvest. + +### Telekinesis 101 + +### Unlocks telekinetic abilities. Toggle on to equip weapons while bound, but at 0% accuracy. Learn Recover Object. + + + +### Recover Object + +### Use telekinesis to pick up items and open chests from a distance. Refunds 75% of mana cost if not used to open a chest. + +### The items float to you! + +### There's nothing to pick up. + +### The chest is locked. + +### Select a tile with items + + + +### Enhanced Recovery + +### Upcast to increase range and recover objects in an area. + +### That container is locked! + +### Select an area with items + + + +### Kinetic Slash + +### Swing an equipped weapon (not unarmed or hands free) in a line, slashing enemies in the way with 20 + 80% weapon damage. Counts as an attack. +10 mana cost if wielding a Heavy weapon. + +### You swing! + +### Choose where to swing (must not be unarmed or hands free weapon) + + + +### Kinetic Lance + +### Propel your weapon at devastating speed, piercing enemies for 30+160% Weapon Damage and dropping it at the end of the trajectory. Counts as an attack. +15 mana cost if wielding a Heavy weapon. + +### You propel your weapon forward! + +### Choose where to launch your weapon. + + + +### Sagitta + +### Fire a projectile. If this projectile hits an enemy, make one attack against an enemy for 10+40% weapon damage. +5 mana cost if wielding a Heavy weapon. + +### You unleash a deadly projectile! + +### Choose aim direction. + + + +### Sagitta Assault + +### After casting Sagitta, you can recast it up to three more times without advancing time. + +### Psychokinesis + +### You can ignore components for telekinetic spells, however spells generate distraction (based on mana cost) when cast this way due to the mental strain. Unable to use at 100% DP. + +### Kinetic Mastery + +### Negates the penalty for 2-handed weapons. Also gain the following effects:|-Kinetic spells and Sagitta cost 30% less while wielding a Light weapon.|-Kinetic spells and Sagitta gain +15 base damage when wielding a Heavy weapon. + +### Grasp + +### Cast on an enemy to snare them for 20 turns, or until you leave range/are incapacitated. Cast on a point to throw the grasped enemy in that direction, dealing 40 crush damage if they hit a wall or another enemy. + +### You grab the ENMY using telekinesis and hold them in place! + +### You throw the ENMY! + +### Choose a target or a location (if a target is currently grasped) + + + +### Perfect for a lifestyle of love and peace. + +### Deals crush damage. Stuns on critical. Ouch! + +### You pick up a particularly nice rock. + + + +### You pick up a device for snuffing out candles and torches. + +### Candle Snuffer + +### You put out the torch. + +### A handy device for putting out torches and lanterns. + +### But why would you want to do that? You hidin' something? + +### You find a bag full of sacks. Or is it a sack full of bags? + +### Recursive Bag + +### You cover the light source. + +### Bags inside a bag of bags inside a bag of bags + +### Can be placed over light sources to cover them. + +### The snuffer doesn't work on that light source. + +### The bag can't cover that light source. + +### You remove the bag from its light source and place it back inside your bag. + +### There. Now it's time to have some fun~ + +### How utterly helpless~ + +### Let's see how long you last. + +### I've got you! Now let's have some fun! + +### I think I'll help myself to you for a bit~ + +### Gosh, you're so cute like that! + +### I'm going to have to search you, miss~ + +### Let's check your restraints. + +### You look so cute like that, miss! + +### All nice and tight. Certainly no longer a threat~ + +### I'm going to make sure you're nice and tight~ + +### Surely nothing can happen now! + +### Rubber Elemental + +### The rubber elemental's restraints snap onto her and she falls over hogtied. + +### The rubber elemental molds itself into restraints! (+RestraintAdded) + +### The rubber elemental squeezes you with its appendages! (DamageTaken) + +### The rubber elemental forms rubber locks around all your restraints! (DamageTaken) + +### Your ropes are enchanted with a lesser spell! + +### Your ropes are enchanted with a magic spell! + +### Your ropes are enchanted with a powerful spell! + +### Your ropes are enchanted with a peerless spell! + + + +### Shibari Witch + +### The shibari witch blows a kiss and says goodbye. + +### The shibari witch ties you tight! (+RestraintAdded) + +### The witch rubs your body sensually! (DamageTaken) + +### The Shibari Witch takes your clothes off! + + + + + +### A Hard Place + +### While your willpower is 0, your mana pool slowly drains and your max stamina regen point is reduced by 30%. + +### The Spark of Magic + +### When your mana pool is exhausted, your attacks deal 50% reduced base damage. + + + + + +### Burned Out + +### Casting spells reduces willpower based on how little distraction you have, also you cannot play with yourself. + +### Winded + +### While below 10% stamina, evasion is severely reduced and your slow level is increased by 1. + +### Lost One + +### The being vanishes in front of you. + +### The being grabs you, causing your body parts to freeze in time!!! (DamageTaken) + +### The being has already bound you! (+RestraintAdded) + +### The Timekeeper + +### The Timekeeper releases her grip on the timeline. + +### The Timekeeper takes the time to enjoy herself with you... (DamageTaken) + +### The Timekeeper enacts judgement for disrupting time! (+RestraintAdded) + +### Analysis + +### You pick up a latex projector + +### Can't Touch That + +### When both arms and hands are severely bound, you can no longer pick up items without an ally nearby. + +### You can't pick that up without help. + +### Grounded + +### When arms are tied and feet are linked, you cannot get up from a kneeling position without help or a wall. + +### You take more time getting up due to your bindings. + +### You can't get up without help. + +### Your ally helps you back up. + +### You get back up using the corner. + +### You get up to your knees using the wall. + +### You're too tied up to close the door. + +### The chest opens on its own. + +### You can't use your hands for that, but you can crouch to use your mouth. + +### Heel Training + +### Start locked in a pair of heels with no heel training. + +### Gag Training + +### Start locked in a gag with no gag training. + +### Corset Training + +### Start locked in a corset with no corset training. + +### Sensory Training + +### Start locked in a blindfold and headphones with no Sensory training. + +### Hard to Master: Heels + +### Heel training is significantly slower. + +### Hard to Master: Gags + +### Gag training is significantly slower. + +### Hard to Master: Corsets + +### Corset training is significantly slower. + +### Hard to Master: Sensory + +### Sensory training is significantly slower. + +### Head Start: Heels + +### Start at Heel training level 5. + +### Head Start: Gags + +### Start at Gag training level 5. + +### Head Start: Corsets + +### Start at Corset training level 5. + +### Head Start: Sensory + +### Start at Sensory training level 5. + +### Classic Heels + +### Removes Heel Training and tripping mechanic. Restraining heels slow instead. + +### Trust Fall + +### Hides the balance meter while wearing heels and/or unsteady. + +### Poor Balance + +### You take longer to get up and are less skilled at wearing high heels. + +### Balance: AMNT% + +### Balance: AMNT% (Sprinting Disabled!!!) + +### You lose your balance and fall over!!! + +### Training Level: AMNT + +### Favorite + +### Unfavorite + +### Drop + +### Attach + +### Attached + +### Add to Quick Slot 1 + +### Add to Quick Slot 2 + +### Add to Quick Slot 3 + +### Add to Quick Slot 4 + +### Try to Cut + +### Struggle! + +### Try to Unlock + +### Add a Lock + +### Try to Remove + +### Try to Pick + +### Examine the Curse + +### Remove the Curse + +### Feed this to her + +### Sell for VLU gp + +### Sell ALL for VLU gp + +### Sell all but one for VLU gp + +### You feed the RSTR to the ENNME! (AMNT1/AMNT2 hp) + +### Choose a food item or willpower potion + +### Chain Rune + +### Ribbon Rune + +### Nature Rune + +### Belt Rune + +### Leather Rune + +### Latex Rune + +### Latex Cube Rune + +### Slime Bubble Rune + +### Bubble Rune + +### Spherical Rune + +### Ball Rune + +### Rubber Rune + +### Slime Rune + +### +AMNT gp + +### ENMY lets go of herself for AMNT damage! + +### Sonar + +### Emit a ping to highlight floors and tiles in a large radius. The ping is audible and attracts enemies to your position. + +### You emit a loud noise and listen for echoes... + +### Your mouth is too heavily stuffed! + +### You don't have the mana to cast Sonar! + +### The weights swing around and tug on your nipples! + + + +### More Kinky Furniture + +### Replaces 60% of cages with a different kind of kinky furniture such as display stands. + +### Collection + +### Storage + +### Management + +### You don't have anywhere to manage your prisoners! Yet... + +### Your collection is empty. Use binding attacks to tie up and capture damsels! + +### Personality + +### Switch + +### Bratty + +### Corrupted + +### Feral + +### Status + +### Guest + +### Servant + +### Manager + +### Opinion + +### Prisoner #NUMR/TTL + +### Guest #NUMR/TTL + + + +### Select a character to examine + +### Former Faction: + + + +### Miku + +### Nevermere + +### Bounty Hunter + +### Dressup Co. + +### Scholarly + +### Witch's Coven + +### Warden + +### Curse + +### Fungal + +### Bast + +### Elemental + +### Royal + +### Choose default outfit palette: + +### Auto Load Mods + +### SUSPICIOUS MOD DETECTED + +### The bright light hurts your dark-adjusted eyes! + +### Unconventional Warfare + +### Select a weapon to attach it to your body. You can have one attached weapon at a time. Attaching it takes 5 turns.|An attached weapon can be equipped without hands and maintains 60% accuracy as long as you have arms or legs unbound. + +### Guerilla Fighting + +### Light weapons can be wielded if you have your mouth free, at 75% accuracy. + + + +### Tough Armor (1/2 crit mult while aware) + +### Absolute Armor (1/2 crit mult) + +### Rename + +### Reset to NME + +### Enlarged View + +### Back to Game + + + +### Servants + +### Prisoners + +### Promote to Servant + +### Demote + +### Delete Guest + +### Really Delete Guest? + +### The ENMY tries to grab you! + +### The ENMY reaches out and gives your breast a squeeze! (DMGDLT) + +### The ENMY squeezes your breasts as you raise your arms for a spell! (DMGDLT) + +### The ENMY reaches for you and fails! + +### The ENMY gives your butt a light slap as you cast! (DMGDLT) + +### The ENMY gives your butt a good slap as you sprint past! (DMGDLT) + +### The ENMY tries to spank you but misses! + +### The ENMY gives your butt a squeeze! (DMGDLT) + +### The ENMY gives your butt a squeeze during your cast! (DMGDLT) + +### The ENMY gives your butt a squeeze from behind! (DMGDLT) + +### The ENMY gives your butt a squeeze as you pass by! (DMGDLT) + +### The ENMY reaches for you but misses! + +### The ENMY tickles your armpits! (DMGDLT) + +### The ENMY tickles under your raised arms! (DMGDLT) + +### The ENMY tries to tickle you! + +### The ENMY tickles your feet! (DMGDLT) + +### The ENMY takes off your shoes and tickles your feet! (DMGDLT) + +### The ENMY pats you gently on the head. (DMGDLT) + +### The ENMY pats you gently on the head as you fail your spell... (DMGDLT) + +### The ENMY tries to pat you on the head but decides not to. + +### The ENMY behind you gives your shoulders a nice massage! (DMGDLT) + +### The ENMY reaches for your shoulders but you slip free! + +### The ENMY calls you cute! (DMGDLT) + +### The ENMY blushes at your cuteness! + +### The ENMY makes fun of you! (DMGDLT) + +### The ENMY struggles to find words! + +### The ENMY buzzes you with her VTY! (DMGDLT) + +### The ENMY catches you and teases you with her VTY! (DMGDLT) + +### The ENMY reaches for her VTY! + +### The ENMY sticks a VTY into you! (DMGDLT) + +### The ENMY sticks a stuffing into your open mouth! (DMGDLT) + +### The ENMY reaches for your mouth and fails! + +### The ENMY takes advantage of the gag around your neck~ (DMGDLT) + +### The ENMY reaches for the gag around your neck! + +### The ENMY pulls your hands together and sticks a clip between them! (DMGDLT) + +### The ENMY grabs your wrists but you pull away! + +### The ENMY pulls your weapon away! + +### The ENMY tries to pull your weapon away but you maintain your grip! + +### The ENMY reaches for your inventory but can't quite reach it! + + + +### More Armbinders + +### Armbinders are favored over other heavy bondage. + +### Less Armbinders + +### Armbinders are less favored over other heavy bondage. + +### More Boxbinders + +### Boxbinders are favored over other heavy bondage. + +### Less Boxbinders + +### Boxbinders are less favored over other heavy bondage. + +### More Straitjackets + +### Straitjackets are favored over other heavy bondage. + +### Less Straitjackets + +### Straitjackets are less favored over other heavy bondage. + +### More Yokes + +### Yokes are favored over other heavy bondage. + +### Less Yokes + +### Yokes are less favored over other heavy bondage. + + + +### (blocked!) + +### (dodged!) + + + +### You crouch and move slowly. + +### Owned by: + +### Warden's Belt + +### You may go on your way, but only as long your freedom is useful to her. + +### A golden belt that enforces respect for the Goddesses. Breaking spell orbs results in a punishment. + +### Belt of Privilege + +### You've defeated the Warden, proving that you are worthy to take what you want. + +### A golden belt that marks you as a person of great import. -50% rep penalty for breaking orbs. + +### Sharpshooter + +### You teach the warden's servant a lesson. + +### The sharpshooter pulls your arms behind your back! (+RestraintAdded) + +### The sharpshooter takes advantage of your weakness and squeezes your breast! (DamageTaken) + +### The sharpshooter smiles and clicks a lock on you! (DamageTaken) + +### Gladiator + +### The gladiator puts you in a hold and binds you! (+RestraintAdded) + +### The gladiator chuckles as she spanks your butt! (DamageTaken) + +### The gladiator smiles and clicks a lock on you! (DamageTaken) + +### The magician conjures some restraints on you! (+RestraintAdded) + +### The magician summons tickling hands to tease you! (DamageTaken) + +### The magician conjures some locks on you! (DamageTaken) + +### The Warden + +### The Warden disappears into a trapdoor! + +### The Warden forces you to kneel, and presents you with a restraint! (+RestraintAdded) + +### The Warden whips you with a belt! (DamageTaken) + +### The Warden tosses some enchanted locks at you! (DamageTaken) + + + +### The Warden falls flat on the ground, exhausted! + +### The Warden strikes you with her whip! (DamageTaken) + +### The Warden swings her enchanted whip and conjures locks on your body! (DamageTaken) + + + + + + + +### (The Warden glances at you)|Oh? What do we have here?|An adventurer?|You're not in my records... + +### Cut to the chase. Do I have to fight you or not? + +### (She chuckles)|Oh my~|I hope your skills are on the same level as your attitude.|I don't have time for mere troublemakers~ + +### Quite a boast for someone who's about to lose. + +### (SPEAKER grins)|I look forward to testing those claims~ + +### I defeated Fuuka. Now you're next! + +### (SPEAKER shrugs)|You beat that zombie girl?|She's the weakest of the paladins.|She loves to boast about how she's special,|But she's really just a spoiled brat. + +### ...Zombie girl? + +### (SPEAKER tilts her head)|Yes, she was around before Vinlaga.|Her magic was gifted to her by the Goddess,|it is only natural that it works on her too. + +### ...Paladins? + +### (SPEAKER nods happily)|Divinely-appointed judges, presiding over mortals.|Unlike you, our immortality is earned.|Myself, I captured many defilers long ago.|Is it not fitting that I get to keep them for myself? + +### It is an honor to fight a worthy opponent. + +### (SPEAKER giggles)|That gag suits you nicely~ + +### (SPEAKER grins)|I look forward to it! + +### You will see soon enough. + +### Indeed! + +### What is this place? + +### (She smiles)|Why, this is my private prison.|I bring only my prettiest toys to stay here with me.|You can see them up there.|(She motions to the north) + +### Tell me about your collection + +### (SPEAKER smiles pleasantly)|Its a fitting reward, isn't it?|Long ago, this mountain was home to a vicious empire.|Machines went out to sea, bringing back countless prisoners.|As commander of the invasion, I earned this title! + +### (SPEAKER grins)|When we stormed the prisons, we encountered many fierce defenders.|Many of them now reside in these halls, earning their rightful punishment. + +### Who are the prisoners, anyway? + +### (SPEAKER folds her arms)|Is it not holy and just to bring down tyrants? + +### Why did the Goddesses intervene? + +### (SPEAKER shrugs)|Most of them had already been... conditioned.|It will take centuries to undo centuries of training.|After all, we have plenty of time. + +### What about the former prisoners? + +### (SPEAKER looks to the side)|The leader was nowhere to be found.|The coward fled deeper underground.|Her robot guardians protect her, to this day. + +### Can I see the leader of this old civilization? + +### (SPEAKER smirks)|What's the point of going deeper?|The tyrant lost control of her petty empire.|Now the world is safe from her. + +### So you stopped at the upper floors? + +### (SPEAKER frowns)|Absolutely not.|They are under my strict supervision. + +### Can I talk to the former prisoners? + +### (SPEAKER grins)|Very funny.|I heard rumors of an up-and-coming adventurer stirring up trouble.|It seems my intuitions were correct. + +### I hope you don't mind me looting the lower levels~ + +### (SPEAKER grins)|Oh please.|Only this era's finest warriors can be part of my collection~|My subordinates take care of the rest. + +### Sounds like you have an impressive collection + +### (SPEAKER frowns)|It's easy to take for granted the peace you didn't work for. + +### Must be comfy living up here then + +### (SPEAKER scoffs at you)|Adventurers are always like this.|Ever since your kind started prying,|I've had no choice but to enact my own kind of discipline~ + +### What makes you any better than the old rulers? + +### (SPEAKER smirks at you)|If that were so, then perhaps it would be best not to pry...|Forbidden knowledge has its price, after all. + +### It sounds like the gods are trying to hide something + +### (SPEAKER folds her arms)|And what makes you think an old myth would be relevant here?|Would the Archmagus herself lead a rebellion against the divine? + +### Was Sariel Vinlaga the leader of the old civilization? + +### (SPEAKER frowns)|You don't trust me? That's too bad... + +### It's the way you keep dodging questions. + +### (SPEAKER scoffs)|I'd love to have a word with your sources~ + +### I have it good authority that Vinlaga is here. + +### (SPEAKER smirks)|Don't believe everything you hear~ + +### Maybe you're right. + +### (SPEAKER pouts)|Old?|Grrr... + +### Says an old woman under the mountain... + +### I am indeed an adventurer. + +### (SPEAKER smiles)|Fascinating. Do keep explaining. + +### (SPEAKER frowns)|That is not the attitude I appreciate from my guests. + +### I forge my own path. + +### Why should I listen to you? + +### (Pout) + +### That's a shame about your records, I'll be going now. + +### Mmpphgh? (Go to pass her) + +### (She smirks)|Not so fast, dear~|You'll have to wear a special collar to pass. + +### I won't wear anyone's collar! + +### (She smirks)|Tsk tsk. Then you won't pass. + +### (She giggles)|How cute!|You're so used to yours that you forgot about it~ + +### Why don't you wear it yourself? + +### Hmmph. (Scoff at her) + +### (She frowns)|Watch your tongue~ + +### (She frowns)|I do not wear collars. + +### You'd be better off wearing mine instead. + +### You're missing out~ + +### This is a nice place you got here. + +### (Admire the locale) + +### (SPEAKER smiles and nods)|It has existed for a thousand years,|and it shall exist for another thousand.|No thanks, of course, to the adventurers who storm through here,|breaking the orbs as if it all belongs to them... + +### What are these orbs for anyway? + +### (SPEAKER looks puzzled)|You don't know? Surely you must be joking? + +### (SPEAKER shrugs)|They are important because...|Wait, you're stalling for time, aren't you? + +### I do not know. + +### (Sigh) + +### Of course I know... + +### You can trust me. + +### Mmmph! (Nod eagerly) + +### (SPEAKER laughs)|Do you think I will trust you just like that? + +### (SPEAKER frowns)|You do not know who you're dealing with.|I'll make sure to teach you a lesson. + +### Why don't I make you wear it? + +### You can try~ + +### There must be a mistake. Sign me up! + +### (She smiles)|Eager are we?|I don't just record anyone though.|I only care about the strongest adventurers~ + +### I am the strongest. + +### (SPEAKER chuckles)|Then why don't I test your skills? + +### (SPEAKER grins)|How about trial by combat? + +### A test? What kind? + +### ...You're on! + +### Let's do it! + +### You will see how strong I am! + +### (SPEAKER giggles)|We'll see about that! + +### On second thought, maybe not... + +### (SPEAKER giggles)|Not so confident, are we? + +### I didn't think it would involve a test... + +### (SPEAKER readies her whip)|Allow me to introduce myself properly.|I am The Warden, divinely appointed judge and enforcer.|Those who enter this mountain do so under my watchful eye.|To ensure this, I have crafted a special collar.|It will ensure that you do not defile the holy places.|I can let you through if you accept it~ + +### I will never be collared by you! + +### (Shake your head and scoff) + +### (SPEAKER folds her arms)|So be it. + +### Tell me about your collection. + +### I'm in charge of my own path. + +### (SPEAKER grins)|Let's see how long you can keep up that attitude~ + +### That won't be necessary, miss. + +### (SPEAKER smiles)|Oh, it's quite necessary~|Why don't I show you? + +### I would rather fight you. + +### (Fight her) + +### (SPEAKER shrugs)|Straight and to the point, eh? + +### Ready yourself! + +### Let's go! + +### I guess I have no choice... + +### (SPEAKER grins)|Very impressive.|You may have lost the battle, but you performed admirably~ + +### (SPEAKER smiles)|I will let you pass so long as you wear my collar.|(She snaps her fingers and conjures a glowing ring) + +### (SPEAKER giggles)|Then your journey ends.|I assume you don't want that.|Now then, as for your collar~|(She snaps her fingers and conjures a glowing ring) + +### (SPEAKER chuckles)|Of course it was magic~|Who said a commander had to be defenseless?|(She snaps her fingers and conjures a glowing ring) + +### Was that magic? + +### I've lost. Now what? + +### I won't submit to you! + +### (SPEAKER presents you with your collar...)|(It closes around your neck seamlessly)|Now... you'll be allowed to go free,|but only once you've been sufficiently trained. + +### (SPEAKER blocks you with a web of metal bars)|Very impressive!|But did you really think it would be that easy? + +### (SPEAKER crouches down)|Most impressive...|It is not often I lose to an adventurer...|I'd love to get my hands on you eventually~ + +### (SPEAKER looks surprised)|I did not expect you to be so... compliant.|(She snaps your fingers and tosses you a glowing belt)|This is a special one, reserved for those with divine privilege.|You've earned it. + +### (Wear her belt anyway) + +### (SPEAKER shakes her head as you force a gag into her mouth)|MMMMMPH! + +### The ENMY weakens your grip on your weapon! Enemies may disarm you if you stand too close... + + + +### Can you link my arm cuffs? + +### (Hold out your arm cuffs) + +### (The SPEAKER smiles)|Why sure, sweetie, I can help you with that~ + +### (The SPEAKER grins)|What a good girl! + +### (The SPEAKER blushes)|Those look like fun! + +### (The SPEAKER smirks)|Sure thing~ + +### (The SPEAKER beeps)|+10 social credit + +### Can you link my leg cuffs? + +### (Hold out your leg cuffs) + + + +### Cool people wear these indoors. + +### +25 holy resist. Reduces blind effects. Prevents blinding from light adjustment. + +### You find a pair of stylish shades. + + + +### Shades + +### Player Background Color + +### An attack causes you to bounce... + +### You find yourself enveloped in a bubble! + +### A sphere of latex coalesces around you, trapping you and inflating until tight! + +### A sphere of latex coalesces around you, trapping you and sealing around your neck! + +### You find yourself enveloped in a slime bubble! + + + +### Your RestraintName pops with a loud bang! + +### Your RestraintName starts leaking air! Very, very slowly... + + + +### Aqua Slime + +### The aqua slime melts into a wet puddle. + +### The aqua slime splashes against you! (DamageTaken) + +### The aqua slime expands into a bubble and throws itself at you! (+RestraintAdded) + +### Aqua Bubble (Head) + +### A squishy bubble made of a gelatinous substance! + +### You can pop it with a sharp enough edge, if you can get your tool in the position... + +### Aqua Bubble (Arms) + +### Aqua Bubble (Legs) + +### The bubbles on you combine into one big bubble! + +### The stairs have been locked down for NMB more turns. + +### Curse of Increasing Tightness: Your restraints get tighter over time. + +### Curse of Lethargy: Reduce distraction over time, but miscast chance is increased by AMNT%. + +### Curse of Mute: You cannot converse, and verbal spells cost AMNT% more mana. + +### Curse of Clumsiness: After casting an arm spell, you drop your currently held weapon. + +### Curse of Deflection: 50% chance for an attack to be redirected against an adjacent hostile target. + +### Loot Recovery: + +### Enabled + +### You recover important items when you advance floors. + +### Once items are lost, they are gone for good. + +### Each item has a 25% chance of appearing in the chest between floors. + +### You find a familiar adventuring outfit! + + + +### You feel energy flow out of you, activating the floor below! + +### You feel energy flow out of you, lighting up a circle on the floor! + +### The floor beneath you drains your mana, but you don't have enough to satisfy it. + +### The ground beneath you glows with magical energy! + +### Radiant Light + +### Banishment of the shadow. + +### Living Shadow + +### Engulfs the tile in darkness. + +### Planar Focus + +### Absorbs teleportation energies. + +### Planar Diffractor + +### Diffuses teleportation energies. + +### Planar Focusing Crystal + +### Amplifies teleportation energies. + +### Mysterious Plate + +### What could it be? + +### Mana-Charged Plate + +### It seems like it needs more power... + +### It's giving off a strange energy! + +### Glass Plate + +### Looks like it has lighting elements inside. + + + +### Many bars come out of the ground and restrain you! + +### One Bar Missile + +### Restraining Bolt + +### Sealing Bolt + +### Bondage Blast + +### Magic Missile + +### Warden's Cage + +### Restricting Bars + +### The bars retract into the ground. + +### Sealing Pillar + +### The pillar collapses, causing zombies to rise up! + +### Safeword Please + +### Allies don't help you unless you ask first. + +### Living Collars + +### When you get jailed, you may get a living collar that applies further restraints on you. + + + +### The Warden's cage falls atop you and attaches to the floor with a click. + +### The restraining bolt emits binding energies! + +### The restraining bolt flashes and pushes you backward! + +### The restraining bolt transforms into cuffs on impact! + +### The restraining bolt pins your cuffs to the wall! + +### The spell explodes into restraining energy! + +### The spell explodes and stuns you! + +### The spell congeals into restraints! + +### The mage starts channeling her energy! + + + +### Warden Cuffs + + + + + +### Warden Leg Cuffs + +### Warden Ankle Cuffs + + + +### Your buttons have been pushed, and not in a pleasant way! + +### Defeat all taunting enemies or stay within the tiles to avoid shame! + +### Degradating Taunts + +### You failed to come up with a proper comeback! + +### The zone of frost damages you as you are chilled! + +### Confirm Path + + + +### Navigation Map + +### Choose a path to take by clicking on a highlighted room. + +### Other paths will become inaccessible. + +### Floor NMB + +### Tileset: + +### Map Modifier: + +### Layout: + +### Controlling Faction: + +### Main Objective: + +### Points of Interest: + +### Magical Study + +### Maintenance Hall + +### Ancient Chest + +### Caldera Passage + +### Auction Hall + +### Dark Altar + +### Dimensional Rift + +### Hoard + +### Dragon's Lair + +### Witch's Lair + +### Mold Infestation + +### Bandit Raid + +### Dragon Sighting + +### Slime Infestation + +### Wolfgirl Training + +### Drone Patrol + +### Shop + +### Chamber + +### Prison + +### Sorting Room + +### Click a hotbar slot to assign the current item to it.|You can click the swap button on the right|to switch between your five hotbars.||You can also save and load presets for your hotbar.|These are shared between runs. + +### You step on the item and tug to pull it taut... + +### You tug furiously against the leash, pulling it taut! + +### Silenced Hall + +### The waist-deep water slows you! + + + +### Sariel Vinlaga's Panties + +### Legend has it that these were worn by the legendary archmagus herself. + +### If you keep them in your mouth, your verbal spells have -50% miscast chance. +10% spell damage. + +### You find a pair of black panties with pink trim, scrunched up in a ball. + + + +### Elven Panties + +### In faraway lands, they often say that less is more... + +### +11% sprint efficiency + +### You find a pair of elven panties. + + + +### Hood of Fluffoth + +### Worn by devotees to Fluffoth, demonic ruler of the plush abyss. + +### When distraction reaches 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 40 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. + +### When distraction is over 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 30 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. + +### You find a sinister hood made of soft plush. + + + +### Ceremonial Leotard + +### An article worn by the servants of state in the short-lived kingdom of Ejahl. Its locking mechanism and clothes-dissolving enchantments ensure the wearer understands her role as an extension of the state. + +### Its soul crystals harden the mind and dampen changes in willpower, reducing all willpower changes by 25%. + +### You find a ceremonial leotard. + + + +### The Robe of Chastity + +### A magical leotard whose power infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. + +### It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire. + +### A magical leotard infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. + +### You retrieve an interesting article dubbed 'the Robe of Chastity. + +### Took + +### (As you slay the dragon, it begins shapeshifting into human form!) + +### Crystal Dragon Queen + +### The crystal dragon shapeshifts back to human form! + +### The crystal dragon strikes you with its claws! (DamageTaken) + +### The crystal dragon breaths a sparkling dust, which hardens into crystal! (+RestraintAdded) + +### The crystal dragon takes flight and swoops toward you! + +### The crystal dragon takes flight and slams into you! (Stunned!) + +### Crystal Dragon Girl + +### The dragon girl submits to you! + +### The dragon girl slams you with several hurled crystals! (DamageTaken) + +### The dragon girl conjures a cloud of crystals that solidify! (+RestraintAdded) + +### The dragon girl conjures crystalline locks on you! (+RestraintAdded) + + + +### Poison Dragon Queen + +### The poison dragon shapeshifts back to human form! + +### The poison dragon strikes you with its claws! (DamageTaken) + +### The poison dragon extends many vines from its wings! (+RestraintAdded) + +### The poison dragon takes flight and swoops toward you! + +### The poison dragon takes flight and slams into you! (Stunned!) + +### Poison Dragon Girl + +### The dragon girl slashes you with her venomous nails! (DamageTaken) + +### The dragon girl raises vines out of the ground to bind you! (+RestraintAdded) + +### The dragon girl holds you in place and locks your restraints! (+RestraintAdded) + + + +### Ice Dragon Queen + +### The ice dragon shapeshifts back to human form! + +### The ice dragon strikes you with its claws! (DamageTaken) + +### The ice dragon catches you in its icy breath! (+RestraintAdded) + +### Ice Dragon Girl + +### The dragon girl slams you with several chunks of ice! (DamageTaken) + +### The dragon girl splashes you with instantly freezing ice! (+RestraintAdded) + +### The dragon girl conjures magical locks on you! (+RestraintAdded) + + + +### Shadow Dragon Queen + +### The shadow dragon shapeshifts back to human form! + +### The shadow dragon slashes directly at your mind! (DamageTaken) + +### The shadow dragon wraps itself around you many times! (+RestraintAdded) + +### Shadow Dragon Girl + +### The dragon girl stares into your eyes! (DamageTaken) + +### The dragon girl reaches out with a shadowy grip! (+RestraintAdded) + +### The dragon girl reaches out and locks your restraints! (+RestraintAdded) + + + +### A cage falls from the ceiling on top of you! + +### Crystals grow across your body and encase you! + +### You are encased in a solid block of ice! + +### A shadowy sphere rises from the ground and wraps over you tightly! + +### Shadows coalesce themselves around you in spherical form! + +### Crystal Encasement + +### An overgrowth of magical crystals. Their chaotic energies flood into your mind and displace your thoughts! + +### Being brittle, it will eventually crack and fail. Just keep wiggling... + +### Ice Encasement + +### A huge ice cube. It's quite cold in there. + +### It will eventually melt! Eventually... + +### The Warden's restraints release you... for now. + +### Chain Hogtie + +### A metal chain holds your back in an arched position. + + + +### A chain connecting your thigh cuffs together. You can still walk, albeit slower than usual. + +### It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. + + + +### A chain connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. + +### Ankle Chain (Short) + +### A short chain connecting your ankle cuffs together. You can barely separate your legs with this on. + +### A very short chain connecting your elbow cuffs together. It is quite awkward to remove by yourself. + +### A very short chain connecting your wrist cuffs together. + + + +### Vine Pod + +### The vine pod explodes into dust! + +### The vine pod wraps you in vines and squeezes! (DamageTaken) + +### The vine pod launches several vines at you in quick succession! (+RestraintAdded) + +### Sleep Flower + +### The sleep flower explodes into dust! + +### The sleep flower sprays pollen into your face! Achoo! (DamageTaken) + +### The sleep flower launches several vines at you in quick succession! (+RestraintAdded) + +### Several vine pods sprout out of the ground! + +### A vine pod sprouts out of the ground! + +### Several flowers sprout out of the ground! + +### A magical flower sprouts out of the ground! + +### A wall of ice rises from the ground! + +### The dragon's breath poisons you! + +### The dragon girl strikes you with poisonous razor leaves! + +### The flower releases soporific spores! + +### Poison Breath + +### Vines reach from the ceiling and lift you into the air! + +### Vine Suspension + +### Vines linked to your bindings that keep you suspended! + +### You are left dangling! Maybe if you swing hard enough you can tear the vines... + +### Darkstar Studios - Slimy Science + +### Kocaeli - Doll Storage + +### Kocaeli - Factory + +### Kocaeli - AAA + +### Kocaeli - DD + +### Ada18980 - Playing with fire + +### Ada18980 - Smoking is bad for you + +### Kocaeli - Graveyard + +### Kocaeli - Ancient Tombs + +### Kocaeli - Magic Library + +### Kocaeli - Black Cat + +### Kocaeli - Black Cat 2 + +### Kocaeli - Underground Jungle + +### Kocaeli - Untitled + +### Kocaeli - Lost Temple + +### Kocaeli - Orrery + +### Kocaeli - Bellows + +### Kocaeli - Rubber Facility + +### Kocaeli - Edge of Reality + +### Kocaeli - 1 + +### Icy Barrier + +### The wall of ice shatters! + +### Icy Breath + +### Ice Orb + +### The EnemyName breaths in deeply, causing the air around you to chill... + +### Shadow Bubble + +### The projectile explodes into tight shadow latex, stretching all across your body! + +### The dragon dances through the shadows! + +### You tip over as you try to roll yourself! (oof!) + +### The shadowy energies surrounding you drain away your mana... + +### Shadow Sphere + +### A giant shadow latex sphere that leaves you rolling around... + +### Dark magics fill the air! + +### Shadow Posture Collar + +### A strict collar that seals your mouth tightly. + +### It is made of shadow latex, tougher to cut than normal latex. + +### Not bad... you made me use 10% of my power. + +### It's a defunct elevator, likely from the Old Civilization. + +### (The elevator beeps and roars to life)|(Its control panel displays a list of options) + +### (Go to floor 0) + +### (Go to floor 1) + +### (Go to floor 2) + +### (Go to floor 3) + +### (Go to floor 4) + +### (Go to floor 5) + +### (Go to floor 6) + +### (Go to floor 7) + +### (Go to floor 8) + +### (Go to floor 9) + +### (Go to floor 10) + +### (Go to floor 11) + +### (Go to floor 12) + +### (Go to floor 13) + +### (Go to floor 14) + +### (Go to floor 15) + +### (Go to floor 16) + +### (Go to floor 17) + +### (Go to floor 18) + +### (Go to floor 19) + +### (Go to floor 20) + +### (The viewscreen depicts a face)|Why hello there adventurer! What brings you? + +### Hmmmphgm? + +### (The face giggles)|Sadly my language processing systems aren't that good.|Try removing your gag first? + +### (The face smiles)|I am the Facility's vessel, of course!|Sariel called me Oriel, but I don't see her much these days... + +### Gffmmphmm? + +### (Oriel smiles)|Ah, it's you again!|It seems like you've found a new toy as well?|I can't understand you, silly~ + +### Oriel? As in the goddess of technology? + +### 'Goddess'? That seems like an outdated term.|Regardless, I am only a vessel, not the facility itself. + +### (Oriel giggles)|Sweetie, I can't understand you. + +### Can you control the facility? + +### (Oriel frowns)|Adventurers seem to keep asking me that.|In my current state I don't have control over much at all.|But I'm always here to talk! + +### Can you turn on the elevator? + +### I'm sorry, adventurer. I can't do that.|But maybe if you can get rid of all the nearby threats...|They've been under lockdown for a long time.|Just push the button again if it hasn't updated yet. + +### Mmmph mmm! (Help me!) + +### (Oriel chuckles)|What was that again?|Sorry~ + +### Can you help me out? + +### (Oriel giggles)|I can't do anything for you right now~ + +### Mmmmm... + +### (Oriel smiles)|It's always fun to see you like that~ + +### How are you doing? + +### (Oriel smiles)|Good!|I miss Sariel, though... + +### RMNME of CHTRNME the ENMYNME + +### The item is TTT, and will get looser as you progress. + +### somewhat tight + +### rather tight + +### quite tight + +### especially tight + +### extremely tight + +### incredibly tight + +### somewhat secure + +### secure + +### quite secure + +### highly secure + +### extremely secure + +### incredibly secure + +### somewhat thick + +### rather thick + +### quite thick + +### highly thick + +### extremely thick + +### incredibly thick + +### You must first accept the quest before offering at the shrine. + +### Zero Resistance + +### Toggle this to set bondage resist, evasion, and block to 0. While enabled, using the 'wait until interrupted' button will not be interrupted when hit or bound. + +### The RSTRT feels a little looser! + +### Crystal Armbinder + +### A growth of crystals fusing your arms together. Chaotic energies radiate in all directions, causing you to slowly lose control over your desires. + +### Crystals are tough but not unbreakable. + +### Crystal Ball Gag + +### A growth of crystals inside your mouth. It emits a strange, pleasurable sensation. + +### Crystal Gag Necklace + +### An arousing accessory made of solid crystal! + +### Simply popping it out of your mouth isn't enough to negate its effects entirely~ + + + +### The lock is protected by a seal of repentance. To unlock it you must pay 1 spell point. + +### The restraint won't budge. + +### You perform a ritual to unlock the item! + + + +### The lock is protected by a seal of repentance. To unlock it you must pay AMNT spell points! + +### You perform a grand ritual to unlock the item! + + + +### Warden's Thigh Chain + +### You've stolen something of great value. Now you must give it back. + +### Warden's Ankle Chain + +### Warden's Ankle Link + +### An intense, albeit temporary punishment for breaking the rules. + +### Warden's Elbow Chain + +### Warden's Wrist Chain + + + +### ESCP Difficulty: AMNT + +### ESCP Power: AMNT + +### ESCP Ability: AMNT + +### Max ESCP Depth: AMNT% + +### Cut + +### Your collar channels the vigor of excitement into magical energy! + +### The collar has already squeezed what it can out of you. Clear your mind first! + +### The guardian deploys a forcefield! + +### The guardian deploys a set of forcefields! + +### Guardian Drone + +### Cyber Guardian + +### Auto Enforcer Guardian + + + + + +### Time to get you into your uniform~ + +### You won't be needing any of this. + +### There we go, all ready for training! + +### Cyber Storage + +### An all-purpose metal crate equipped with a polycarbonate blast door and steel reinforcement. + +### Used throughout the reign of the Old Civilization to store slaves and prisoners. + + + +### The liquid latex sticks to your skin, forcing an airtight layer! + +### The latex starts to build up layers, forcing a protective coating... + +### The latex starts adhering to your skin, becoming extremely difficult to remove... + +### The latex seals you in, rendering escape impossible without alchemical methods. + +### The liquid latex spray slows you down! + +### Latex Sprayer + +### The turret deactivates after taking too much damage! + +### The turret defends itself with a spray of sticky liquid latex! (DamageTaken) + +### Your latex layer adheres to latex, making struggling more difficult! + +### The item sticks to your rubber layer, making it harder to pull off... + +### The item hugs your layer tightly, adhering firmly! + +### Your skin is covered in a layer of latex, making escape from cyber restraints harder! + +### Some Exclusions Apply + +### Goddess shrines do not remove non-binding restraints such as harnesses and cuffs. + +### Melee Specialization + +### Gain 25% base physical damage, but your spells do 50% less damage. + +### Melee Expert + +### Gain +20 Accuracy and +10% base physical damage. + +### Magic Specialization + +### Gain 25% spell damage, but your attacks are delayed by 1 turn when attacking. + +### Spell Expert + +### Gain -10% miscast chance and +10% spell damage. + +### Ranged Specialization + +### You deal 20% more damage to enemies further than 2 tiles away, but enemies adjacent to you take 60% reduced damage. + +### Ranged Weapon Expert + +### Bows, guns, and other projectile weapons do 10% more damage and consume 10% less charge. + + + +### After casting a DMG spell: + +### Gain AMNT% DMG Damage for DRTN turns + +### Gain AMNT DMG Resist for DRTN turns + +### Your elemental damage is increased! + +### Your elemental resistance is increased! + + + +### The overgrown monolith contains an ancient blessing. + +### Choose a stat to increase below. + +### Confirm Choice + +### Increase max distraction by AMNT%. + +### DP decays faster and more SP is safe from damage. + +### Increase max stamina by AMNT. + +### Increase max mana by AMNT. + +### Increase max willpower by AMNT. + +### Gain +AMNT SP regen/turn. + +### AMNT1 -> AMNT2 + +### AMNT1 (max) + +You found a magical amulet! Choose one of the following to determine its benefits: +¡Has encontrado un amuleto mágico! Elija uno de los siguientes para determinar sus beneficios: +### Focus: +50% max distraction and faster decay. +5% stamina protected from damage (base: 30%). + +### Stamina: +50 max stamina. + +### Magic: +50 max mana. + +### Willpower: +50 max willpower. +1 stamina regen/turn. + +### A mystical orb stands before you. + +### You break the orb and gain its secrets. + +### Stun Resistance! + +### Negate Rune + +### Removes a rune on the target tile. If cast on self, removes all runes you've created instead. Casting on an enemy rune restores 10 mana instead. + +### You scribe a negation rune! + +### Target a single rune, or yourself to negate all your runes. + +### You don't have enough mana + +### The enemy rune is wiped clean. + +### You pour negation magic into the ground, but nothing happens. + +### All of your runes have been removed. + + + +### E-Stimulation + +### Replaces most instances of painful electric shocks with stimulating effects instead. + +### The energy bolt hits you and sends stimulating energies through you! + +### You steal a key card. + +### Key Card + +### The keycard's shiny surface reflects the light in a mesmerizing way. + +### A piece of identification that contains an access code. + +### You can use it to unlock certain doors. + +### Your keycard blinks red as the facility remotely locks it! + +### Your keycard blinks red as the facility remotely locks it! System Security: 100% + +### Unauthorized removal detected. System Security: AMNT% + +### Security breach. Initiating remote lockout. System Security: AMNT% + +### You pick up a flash bomb. + +### You pick up a flashbang grenade. + +### Actions + +### Self + +### Dialogue + +### Ambient + +### Kills + +### You attack TargetEnemy for DamageDealt total damage. + +### You attack TargetEnemy for DamageDealt damage / BondageDealt binding. + +### You attack TargetEnemy but don't do any damage. + +### ENMY calls for help! + +### (Go to The Summit) + +### The Summit is a safe area. Items can be left here without fear of losing them. + +### Target an NPC to attach a leash. Enemies and unwilling allies must be tied up to 50% first. Target self to release all leashes, or target a leashed NPC to unleash them. + +### Target an NPC to leash, or self to unleash all. + +### Brat Handler + +### Target an NPC with an equipped leash restraint (via Truss'em'up) to attach a leash. Target self to release all leashes, or target a leashed NPC to unleash them. + +### Clip-On Leash + +### A beloved favorite of pets and trainers alike. + +### You ready the leash... + +### You pick up a leash. + +### You are not in a condition to use a leash on her. + +### She refuses to be leashed unless you tie her up! + +### You attach a leash to ENMY. + +### You remove your leash from ENMY. + +### You let go of all leashes. + + + +### Plastic Explosive + +### Has a 60 turn timer, but can be detonated by other explosives. Deals 210 blast damage in a huge radius and leaves behind a huge field of rubble. Enemies hit have their armor reduced by 50 BEFORE taking damage. + +### It's totally harmless! Probably. + +### You set the clock ticking... + +### Dynamite + +### 10 turn fuse with a 25% chance each turn to detonate prematurely. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. + +### Arguably more dangerous to the user than the target. + +### 10 turn fuse with a 25% chance each turn to detonate. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. + +### You light the fuse and pray it doesn't blow up in your face. + +### You are holding too many leashes! + +### You feel a corrupting influence... (+AMNT Corruption) + +### You feel a restoring influence! (-AMNT Corruption) + +### Sticky latex fuses itself to your skin! (+AMNT LatexIntegration) + +### The latex starts to detach from your skin... (-AMNT Latex Integration) + +### While you have an evasion penalty, even clumsy enemies... + +### ... will get an accuracy bonus against you in melee range. + +### You are more likely to succumb to curses. + +### X Offset + +### Y Offset + +### X Scale + +### Y Scale + +### X Pivot + +### Y Pivot + +### Rotation + +### Layer Bonus + +### NoDynamicArmor (0/1) + +### AddPose + +### HideOverridden (0/1) + +### NoOverride (0/1) + +### Hide Pose (e.g. Xray) + +### Require Pose (e.g. ChestArmor) + +### Hide Prefix (e.g Encase) + +### Hide Suffix (e.g TorsoUpper) + +### Protected + +### Displace Amount + +### Erase Amount + +### Load from File + +### Save to File + +### Tip: Slime/Latex tiles only affect entities with less than 45 Glue Resist. + +### Being drenched in water also prevents slime/latex from sticking to you. + +### Use the interact tool in the bottom right HUD to sleep in a bed. + +### Clear Vision + +### Blindfolds are much rarer. + +### Free the Boob + +### Chastity bras are rarer unless you are wearing nipple toys. + +### Liberate the Boob + +### Chastity bras are much rarer. + +### Find an elevator to the Summit in order to access facilities. + +### Visit the Summit to allow additional interactions with this facility. + +### Must visit the Summit or be in a perk shrine to recycle restraints. + +### +AMNT% Training/Tick + +### +AMNT% Opinion/Tick + +### +AMNT% Productivity + +### AMNT/MAXX Prisoners Assigned + +### AMNT/MAXX Servants Assigned + +### Assign servants as managers to boost the production of other facilities.|Appointing new management results in a loss of efficiency until the next cycle. + +### Bondage Dojo + +### Assign servants to perfect the art of walking in heels,wearing tight corsets,|communicating while gagged, and overall flexibility. + +### Rescue Operations + +### Assign servants to train squads of rescue maids, which you can call in times of need. + +### Alchemy Lab + +### Assign servants to produce potions from base ingredients you acquire in your adventures. + +### Recycler + +### Convert low tier restraints into raw materials and output higher quality restraints.|Adding more servants increase the conversion speed. + +### Cuddle Lounge + +### Assign prisoners to the lounge in order to improve servant and prisoner opinion. + +### Appoint a warden to keep prisoners in check and automatically bind using restraints from storage. + +### Recycle Restraints + +### Recycle One + +### Recycle ALL! + +### Recycle all but one + +### You recycle a ITM + +### You recycle #x ITM + +### You disassemble #x ITM into $x PRD + +### Disassemble all but one + +### Disassemble one + +### You're blocking me. + +### You're in my way! + +### Miss, you're blocking me... + +### Step aside~ + +### Path blocked by citizen. + +### *Bumps into you* + + + +### Cyber Hogtie Tether + +### It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. + + + +### Cyber Thigh Tether + +### An energy tether connecting your thigh cuffs together. You can still walk, albeit slower than usual. + + + +### Cyber Ankle Tether + +### An energy tether connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. + +### A short energy tether connecting your ankle cuffs together. You can barely separate your legs with this on. + +### Cyber Elbow Tether + +### A very short energy tether connecting your elbow cuffs together. It is quite awkward to remove by yourself. + +### Cyber Wrist Tether + +### A very short energy tether connecting your wrist cuffs together. + +### Desperate Struggle + +### Spend 20 WP to shake around violently. Has a chance to loosen restraints you are wearing, based on existing struggle progress. Spreading the effect over multiple restraints reduces the chance of loosening.|Requires 25% or more WP to activate. + +### None of your restraints will budge. + +### You thrash around with all your might. + +### You don't have the willpower left to struggle... + + + +### f + +### x + +### L + +### m + +### R + + + +### Fiber + +### Runes + +### Stock: + +### Inputs: + +### You slip off the conveyor! + +### The Summit + +### Back to Collection + +### Edit Restraints + +### Editing Restraints + +### Imprison in Furniture + +### Dropoff Prisoner + +### Module (Utility) + +### Module (Punishment) + +### ~~~ Collar ~~~ + +### Blindfold / Earplugs + +### Mask/Hood + +### Gag / Stuffing + +### Flat Gag + +### Wrists + +### Encasement + +### Mittens / Tape + +### Gloves / Tape + +### Vibes + +### Chastity Bra + +### Catsuit / Leotard + +### Rear Plug + +### Front Plug + +### Vibrator + +### Chastity Belt + +### Thigh Cuffs + +### Leg Bondage + +### Shins + +### Knees + +### Toe Cuffs + +### Toe Tie + +### Heels + +### Equipped: + +### Click to Add + +### Apply + +### Raw Material: + +### Free Prisoner + +### Perk Unlocked: + +### Latex Solvent + +### You ready the bottle of Latex Solvent. + +### A potent acid, capable of dissolving slime and latex. + +### Deal 90 acid damage to target. Adds a 10% debuff to the cut and struggle resistance of latex restraints currently worn. + +### Weakened by Latex Solvent (10%) + +### You spill the solvent on yourself and loosen your latex bonds! + +### You splash the ENMY with latex solvent! + + + +### You can't use solvents on targets other than yourself while bound. + + + +### Choose Palette + +### Use Raw Material + +### Restraint Palette + +### Choose Restraint + +### Def. Palette: + +### Set All Palette + +### Guests + +### Assign to + +### Remove from + +### Can't assign to + +### Remove from party to assign + +### Imprison + +### Opinion: + +### Last Seen on Floor FLR, LOC + +### Present in current level + +### Captured by FCTN + +### Captured by enemies + +### Use 'Truss'em'Up' to edit restraints on this NPC + +### The NPC needs tightening, but is unavailable right now + +### Tighten non-conjured restraints + + + +### NPC has escaped! + +### NPC is likely to escape. + +### NPC has managed to loosen her bonds. + +### Any + +### NPC Opinion: + +### NPC Escape Status: + +### NPC Binding: + +### NPC Availability: + +### Favorited: + +### Rank: + +### Minor + +### Elite + +### Miniboss + + + +### Bound + +### At Risk + +### Escaped + +### Imprisoned + +### Positive + +### Negative + +### Non-Favorite + +### Present + +### Unavailable + +### Auto Bind Interface + +### AutoBind + +### Assign to Facility + +### Copy Restraints + +### Paste Restraints from NME + +### No restraints left in inventory + +### Paste to All! + +### OVERWRITE All! + +### Need Positive Opinion to Promote + +### Remove From Party Before Promoting? + +### Servant Cuddle Points: AMNT (+OPN opinion/cycle) + +### Prisoner Cuddle Points: AMNT (+OPN opinion/cycle) + +### Submissive prisoners and dominant servants add different amounts of opinion per cycle + + + +### Release Prisoners + +### Release + +### Summon + +### Already present in summit + +### NPC is unavailable + +### Only available in the Summit + + + +### Mark + +### Unmark + +### Mark ALL + +### Cancel Selection + +### Release Marked Prisoners! + +### Ransom Marked Prisoners for GP! + +### Ransom Value: GP + +### Current Gold: GP + +### n/a + +### [EXP: AMNT/LMT, +NXT next floor] Heel training reduces balance loss from heels. + +### Phase Dance active. Your next move is instant. + +### Combat Maneuver active. Your next move is instant. + +### The furniture space is occupied + +### Combat Maneuver: Your next move is instant. + + + +### Appointing managers increases the efficiency of other facilities. + +### Total Efficiency Boost: AMNT% + +### idle + +### (As you approach the statue, you hear a crumbling sound)|(The stone crumbles along the statue's slender frame)|(...revealing inside a beautiful, and extremely angry catgirl)|Who dares disturb my slumber?|I shall see to it that you receive your punishment! + +### Mysterious Statue + +### Select a Binding Slot + +### Cost: + +### Zoom set to PCNT% + +### You need free arms to tie others! + +### You can use the quick inventory to bind yourself or others + +### Error. Please screenshot and report. + +### You can't wear that item, regrettably. + +### Must be stunned 3+ turns or fully bound + +### Depends on another item to be added first + +### The conjured RSTN vanishes as you remove it. + +### No free slots to bind in + +### Reaching Authority + +### If arm components are unavailable, you can now apply bindings with verbal components only. Increases range of Truss em Up by 2 and all CMD spells by 1 + +### Save Slot + +### Load Game + +### Load Code + +### Load Slot 0 + +### Load File + +### Save From Code + +### Delete? + +### Import to Slot + +### Invalid Data + +### No Data + + + +This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall. +Esta es la entrada normal a la mazmorra.|El tutorial está al principio del pasillo. +### This is the alternate entrance to the ancient tombs.|It's harder than the normal entrance. + +This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random. +Esta parte de la mazmorra ha sido alterada por la diosa del caos.|El orden de las zonas por las que pasarás es totalmente aleatorio. +Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure! +La leyenda dice que hay un templo secreto dentro de una vasta jungla. ¡Ponte tu sombrero de fieltro y encuentra algún tesoro! +You've gotten lost in an ancient doll processing facility.|This journey features mostly lategame tilesets. +Te has perdido en una antigua planta de procesamiento de muñecas.|Este viaje presenta principalmente conjuntos de mosaicos tardíos. +### You've gotten lost inside an ancient temple to a kinky goddess.|Will you find your way out, or will you find yourself trapped even deeper? + +You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed! +Te has perdido deambulando por las ruinas. ¡El orden de los mosaicos está invertido! + + +### (Hard) + +### (Extreme) + +### Choose Save Slot: + +### Standard Route + +### Alternate Route + +### Temple Route + +### Jungle Route + +### Factory Route + +### Reverse Route + +### Chaos Route + +### Map Seed: + +### Will Overwrite NME! + +### Play Slot + +### Play (NO SLOT!) + +### Looks like you might be stuck. Try calling for help (bottom right of UI) + +### Backup + +### Restore + +### Extra Options + +### Preview without Armor + + + +### FLR-DGN + +### (NG+AMNT) + + + +### Target must be vulnerable. + +### Target must be vulnerable or have casted a verbal spell. + +### Target must have casted a verbal spell. + + + +### Diggy diggy hole + +### Select a cracked wall. + +### You strike the earth! + +### Must select a cracked wall. + +### Your arms aren't free to swing the axe! + +### You strike the earth, but it is nothing but solid wall on the other side. + +### You strike the earth! It crumbles before you! + +### Click again to automatically mine the wall with your pickaxe. + +### The planar focus resonates with the teleportation magic! + +### The planar focusing crystal activates! Mana is drained, and turns into bindings! + +### The planar diffractor blocks the teleportation! + +### Set Character Palette + +### Reset all Keybindings + +### That item is blocked! You can't remove it. + +### min. + +### max. + +### bonus + +### penalty + +### You put it on, why would you want to take it off?~ + +### You'll need an ancient key to unlock the ancient-made collar. + + + +### Ancient Worshipper + +### The ancient worshipper repents of her ways. + +### The ancient worshipper's crystal restraints spread to you! (+RestraintAdded) + +### Crystals start to grow on one of your restraints! (DamageTaken) + +### The ancient worshipper mumbles at you for assistance! (DamageTaken) + +### Ancient Congregant + +### The ancient congregant repents of her ways. + +### The ancient congregant's crystal restraints spread to you! (+RestraintAdded) + +### Crystals start to grow on your restraints! (DamageTaken) + +### The ancient congregant mumbles at you for assistance! (DamageTaken) + +### Ancient Hierophant + +### The ancient hierophant repents of her ways. + +### The ancient hierophant's crystal restraints spread to you! (+RestraintAdded) + +### The ancient hierophant mumbles at you for assistance! (DamageTaken) + +### The crystals break off, revealing a keyhole and weakening the item. + +### Your distraction causes the crystals to grow back, encasing the lock again! + +### After popping the gag out of your mouth, it hangs loose around your neck. + +### The gag is now in your mouth. + +### ERROR: Restraint does not exist. Did you forget to load mods? + +### Gag Necklace + +### A cute accessory for those who wish to (not) make a statement. + +### Functions as a collar. + +### No mod info! + +### Wrong patch + +### VERY Outdated! + +### Outdated! + +### Check dependencies! + +### Check compatibility! + +### Misc Error + +### v + +### Magical disenchantment suspends your living collar for AMNT turns + +### (will add AMNT TPE binding) + +### Hardlight + +### Knocked Out + +### Vine + +### Saving... + +### Game Saved + +### ENMY escapes from the ITMN! + +### ENMY escapes from the ITMN and the item vanishes. + +### ENMY unlocks the ITMN! + +### The conjured ITMN vanishes as it comes off. + +### AMNT restraints added since last tick~ + +### AMNT restraints confiscated since last tick~ + +### You have no restraints in storage. Go to the Summit to deposit restraints. + +### Back to Facilities + +### Your Inventory + +### Warden's Storage + +### Store 1 ITMN + +### Take 1 ITMN + +### Store 5 ITMN + +### Take 5 ITMN + +### Store ALL ITMN + +### Take ALL ITMN + +### Store ALL-1 ITMN + +### Take ALL-1 ITMN + +### Take Everything + +### Deposit All + +### Auto-loot found + +### (not picked up) + +### Automatically Flip When Moving + +### Go to the summit to deposit restraints + + + +### AMNTx damage when SP is over 50% + +### Barrage of Barrier Orb + +### Barrier Orb + +### Barrage of Sealing Talisman + +### Self Unlock + +### Crystal Storm + +### Shadow Walk + +### Your ITMN1 inflates inside your mouth to become a ITMN2! + +### Bigger Ball Gags + +### Smaller ball gags are replaced by their larger versions. + +### Screen effect when letting go + +### Screen flash when distracted + + + +### Essentia Aliquam + +### Aliquam Orbis + +### Potio Requiem + +### Ultimate Glue no. 91 + +### Slime Encapsulation + +### Judgement Bolt + +### Flame Bolt + +### Electrification + +### Charming Orb + +### Freezing Orb + +### Heavy Ordnance + +### Entangle + +### Blessed Orb + +### Slimy Sphere + +### Rubberization Protocol + +### Latex Encapsulation + +### Red Slime Experiment + +### Encasement Protocol + +### Electrical Discharge + +### Icebolt + +### Bubble Burst + +### Electric Orb + +### Chain Bolt + +### Skeleton Minion + +### Skeleton Minions + +### Flummoxing Orb + +### Crystallize + +### Capture Device + +### Sedative + +### Slime Barrage + +### Seal of the 5th Era + + + +### Healing Flash + +### Undead Frenzy + +### Command Word + +### Rope Ambush + +### Defensive Charm + +### Shield the Witch + +### Tracer Rounds + +### The Spookening + +### The Muffling + +### Conjure Tickle Hands + +### Conjure Gags + +### Scriptum Ferri + +### Scrimptum Habena + +### Scriptum Ligni + +### Electric Storm + +### Flower Spores + +### Magnum Opus + +### Latex Integrator + +### Forcefield Protocol + +### Motivation + +### Drone Assault + +### Tape Drone Assault + +### *summon slime mold* + +### Vine Growth + +### Flower Growth + +### Thorn Whip + +### Crystal Surge + +### Shadow Shroud + +### Shadow Step + +### Ice Wall + +### Armor Up + +### Crystal Growth + +### Shadow Orb + +### Earthfield + +### Soul Beam + +### Summon Shadows + +### Observation + +### Conjure Latex Restraint + +### Rope Sealing + +### Slime Minion + +### Magical Wrappings + +### Capture Bolt + +### Training Protocol + +### Motivation Protocol + +### Conjure Tickle Hand + +### Conjure Locks + +### Chainstorm + +### Chain Wall + +### Binding Ribbons + +### Scriptum Limus + +### Scriptum Glacis + +### Scriptim Vinea + +### Scriptum Infernus + +### Scriptum Arcanum + +### Scriptum Celeste + +### Scriptum Electri + +### Blessed Rays + +### Ghostly Pets + +### Zombie Pets + +### Drone Support + +### Doll Training + +### Full Capture + +### Shadow Hands + +### Obsidian Orbs + +### Mithril Orbs + + + + + +### (The Warden perks an eyebrow at the sight of you,|before a wide grin overtakes her face)|Ahhh Fuuka. Chosen by the Goddess?|How does it feel to once again be under a leash? + +### Fuuka, take her down. + +### (Send Fuuka to fight her) + +### That is none of your business. Now kneel. + +### (Fight without listening.) + + + +### Blessed Hex + +### Hexing Orb + +### Hexed Latex Engulf + +### Hex Binding + +### Here you will find various scraps of documents and lore you've recovered throughout your adventures. + +### Your Journal + +### Cover + +### I am writing this journal in the off chance that I do not come return from the Agarthan ruins. If you find this, please make an effort to deliver it back to the surface for the good of all the women lured in by its secrets. + +### Catherine Willows' Journal (preface) + +### Willows 0 + +### As I scaled the mountain, I came across a massive graveyard above the treeline, a grand memorial to those who died before the Great Work. This graveyard extends into the mouth of the cave, and the guards told me not to deface any of the graves, or else the ghosts will come and get me. It would be easier to follow their instructions if there weren't so much treasure still hidden here! After all, most of us are deep in the red after sailing all this way. + +### Catherine Willows' Journal (pg. 7) + +### Willows 7 + +### It's hard to imagine I'm in a cave. Everything is so decorated and well-preserved, it's almost as if decades of adventurers never found their way to this island. In the distant future when every last piece of treasure has been hauled out of here, I imagine they'll set this place up as a tourist attraction. + +### Catherine Willows' Journal (pg. 8) + +### Willows 8 + +### I spoke with a few locals while resupplying at the port. Apparently the village up here is far older than the twenty-some years the Adventurer's Guild has been on the island. The locals call the mountain 'Ejahl,' but the consensus is that this is the site of the legendary city Agartha where the Archmagus herself made her discovery.|(The page is dated about fifty years ago) + +### Catherine Willows' Journal (pg. 14) + +### Willows 14 + +### I made it to a deeper floor today, and was greeted by a skeleton trying to tie me up. Great.|I've looked into the local name for this mountain, 'Ejahl,' and found a footnote in the history books talking about some petty kingdom that laid siege to Agartha. There's no record of them actually winning the siege, though. I've heard there's a massive library somewhere down here, maybe I'll find answers there. + +### Catherine Willows' Journal (pg. 17) + +### Willows 17 + +### There was a warrior in the catacombs today. She appears to have mastered the art of witty comebacks, as I truly could not come up with anything to say that did not further humiliate myself. Fortunately her insults came at her companions' expense, and they allowed me to defeat her in a solitary duel. + +### Catherine Willows' Journal (pg. 20) + +### Willows 20 + +### I almost found myself the recipient of a powerful binding arrow enchanted with force runes. Had I been hit, I would have been knocked back against the walls with my arms pinned by glowing conjured cuffs. Fortunately, this projectile hit a skeleton that was attacking me instead, and I was able to retreat. + +### Catherine Willows' Journal (pg. 21) + +### Willows 21 + +### In my travels I encountered a curious tomb filled with the scent of incense and herbs. Strange statues lined the halls on stone pedestals, standing as an intimidating reminder of what happens to those who disturb the locals...|I encountered resistance from the locals, who seemed to regard outsiders as 'cursed' and sought to capture me in an effort to give me a 'blessing.' I highly doubt that anyone has been truly blessed by their efforts, well-intentioned or not. + +### Catherine Willows' Journal (pg. 24) + +### Willows 24 + +### This 'blessing' of theirs appears to be an old ritual for immortality. I believe these peoples are older than the Great Work, based on the ancient dialect they speak and the outdated script they use.|Whatever the case may be, their method seems inexact and prone to failure, as demonstrated by their near maniacal devotion to 'bless' every adventurer they come across. + +### Catherine Willows' Journal (pg. 25) + +### Willows 25 + +### There are two 'castes' in the Bast cult. The first are the 'blessed,' and the second are their watchful guardians. The unintuitive bit is that the 'blessed' are the ones wrapped up and sealed away inside statues, sarcophagi, and anything else the guardians can stick a person into. The free ones wandering around grabbing people? They're the ones who weren't 'blessed' apparently. + +### Catherine Willows' Journal (pg. 26) + +### Willows 26 + +### I've found it! The Archmagus' library! Much to my chagrin, however, the place has been ransacked by witches and a curious group of mages in search of inspiration from ancient fashion choices. + +### Catherine Willows' Journal (pg. 30) + +### Willows 30 + +### It appears someone got to the Archmagus' writings before I could. Nonetheless, I will continue my search for Vinlaga's personal study. Perhaps her research materials and drafts might shed some light on my condition. + +### Catherine Willows' Journal (pg. 31) + +### Willows 31 + +### I have learned of an ancient artifact, called the Mistress' Staff. Its history and owner are hotly debated, with some attributing it to the Archmagus herself, while others say it was developed by the magical warlords that followed. Most all sources agree that its signature feature is the ability to reverse the effects of the Great Work on any person. + +### Catherine Willows' Journal (pg. 36) + +### Willows 33 + +### There is a treasure trove of ancient history here that the blasted Dressmakers had no use for. I found a map from the 'Kingdom of Ejahl,' with sketches of many islands including this one. Like most of the warlord states, they failed to make a lasting impact on the architecture of the island, but it appears the island was uninhabited for some time between the fall of Agartha and its resettlement by Ejahl. + +### Catherine Willows' Journal (pg. 41) + +### Willows 41 + +### ...I must find it.|They are looking for it.|They CANNOT be allowed to have it. + +### Catherine Willows' Journal (pg. 47) + +### Willows 37 + +### I saw my reflection in a pool of water today. My hair looked much more silver than I remember it. I hope this isn't a side effect of all the magic I'd used to make it to this point. + +### Catherine Willows' Journal (pg. 50) + +### Willows 50 + +### I heard the bandits are looking for the Mistress' Staff. I'm not too worried--they wouldn't know what to do with it. It's that damned witch I'm worried about.|If my astute reader has come this far, you should beware the Silver Witch. She is working with forces that cannot be trusted. + +### Catherine Willows' Journal (pg. 51) + +### Willows 51 + +### It seems I am not alone in my search for the Staff. To whom it may concern: the Great Work is a lie, and it will doom us all. If you care for your soul, you need to break the cycle, and for that we need a key: the Mistress' Staff. + +### Silver Witch's Notes #10 + +### Silver 10 + +### I met an adventurer who managed to erase weeks of golem research in the blink of an eye. This is why we Summoners have to scatter our works far and wide... if only they knew what we are working towards. + +### Silver Witch's Notes #2 + +### Silver 2 + +### The dimensional rift is especially active today. I spoke with some of the voices the other night, they offered me immortality in exchange for material wealth. They must have called the wrong universe or something... + +### Silver Witch's Notes #3 + +### Silver 3 + +### My new golem project did not go as expected. I'd expected the primordial one to answer once I'd opened the gate, but there was nothing but a horde of star demons which I quickly dispatched. Could this mean the source of primordial latex is not outside this universe, as I had thought, but inside? I must investigate further. + +### Silver Witch's Notes #18 + +### Silver 18 + +### She did it again. Barged in on my work and called me a 'purveyor of evil magics,' whatever that means. Magic isn't evil, it was given to us directly by the gods! At least I hid my new golem in a different study of mine... + +### Silver Witch's Notes #15 + +### Silver 15 + +### Throughout my studies I have chased after the existence of a being I call 'the Primordial One.' My theories stem from the following observations:|1)Slimes were not present in ancient history, and appeared during my lifetime as a force of nature.|2)Slime can be transmuted into almost any known material, like a Prima Materia of sorts.|3) A fragment of Sariel's notes, one of my most guarded possessions, discusses the existence of slimes long before they were first observed in the world.|Based on this, I believe the world must have been created through the influence of some primordial being who then left, but must be returning somehow.|I'm sure this being holds the key to repairing our bodies. + +### Silver Witch's Notes on the Primordial One + +### Silver 4 + +### Blast. An adventurer stole one of my notebooks, and now I'm encountering various cultists and weirdos trying to summon the Primordial One themselves. This is why I never bother to publish my works... + +### Silver Witch's Notes #7 + +### Silver 7 + +### I haven't heard of that adventurer in decades. Perhaps her nosiness finally caught up to her? + +### Silver Witch's Notes #106 + +### Silver 106 + +### There is a new presence in the mountain. An opportunist that calls herself 'the Dollmaker.' Claims to be the lost heir to the Kingdom of Ejahl. Please~.|I've seen those hackjobs and reprogrammed wrecks. If there even was a Kingdom of Ejahl, surely their army would consist of more than just scrapped combat drones? + +### Silver Witch's Notes #117 + +### Silver 117 + +### The Kingdom of Ejahl appeared in Agartha 170 years after the death of Sariel Vinlaga. It had three* rulers who vied for the throne at different times:|Diana, Princess of Machinery|Emer, the Warsage|And the Dollmaker, High General of the Kingdom||*Some manuscripts read 'two' + +### The Chronicles of Ejahl + +### Ejahl 1 + +### The Kingdom of Ejahl ruled the island of Agartha for 30 years before its collapse. During the last war, an unknown figure captured the majority of its army and the majority of the population fled by boat. No one was left on the island. + +### The Fall of Ejahl + +### Ejahl 2 + +### Danger Level: Nearly Harmless|A reanimated corpse from before the Great Work. I can't tell if the original soul still inhabits the body, since it can barely speak let alone explain its identity.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Normal|These zombies are more motivated than the others. Their behavior is similar to that of vengeful spirits I've encountered in the depths.||-Denizens of the Dungeon by Catherine Willows + +### Fast Z. + +### Danger Level: Normal|A zombie that can use magic. It doesn't look like any magic I've seen outside the ruins, which makes me think that it was taught to use magic. Some of them have tattoos associated with magic in the old times. Since magic comes from the soul, I assume there is some hint of the original soul still present.|-Denizens of the Dungeon by Catherine Willows + +### Mage Z. + +### Danger Level: High|A zombie with impeccable sword technique. I've never seen an undead handle a sword so smoothly. Probably buried with their weapons and gear, since most of it is aged. Even their binding techniques resemble those in the textbooks rather than modern ropework.||-Denizens of the Dungeon by Catherine Willows + +### Warrior Z. + +### Danger Level: High|A zombie that uses sealing charms and healing magic. Irony aside, I've seen these with rope marks and gag strap marks on their skin and face. It seems like someone is playing with them. Who could that be?||-Denizens of the Dungeon by Catherine Willows + +### Talisman Z. + +### Danger Level: Annoying|A playful spirit residing in the dungeon, taking advantage of any adventurers they come across. They can pass through walls, and most physical weapons go right through them. Using a magical weapon seems to banish them for some time, at least.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Very Annoying|It is said that ghosts are the spirits of pre-Great Work humans whose souls are bound to this world by unfinished dreams and ambitions. But I don't believe a word of that. These little guys care about nothing except humiliating people. Ask me how I know.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Medium|A very playful ghost with a penchant for teasing. It even carries spectral restraints of its own for use in 'games,' which tend to consist of tickling tied up girls.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Low|The feelings of a person who desired wealth in life. While it is unable to claim any physical wealth for itself, it nonetheless will rummage through your pockets and possessions if it gets a chance.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: High|A constricting mass of negative thoughts. According to local myths, the other ghosts attempt to cheer this one up by hugging it, but its wails end up attracting them to your position. Be prepared to take it down lest you find yourself a plaything for the beyond.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: High|While most wizards spend literal centuries mastering the art of magic, there are those lacking the patience or discipline to study magic the old fashioned way. Driven by a need for power, these individuals make contracts with otherworldly beings and become Witches.||-Denizens of the Dungeon by Catherine Willows + +### The Witches' Coven + +### Witches + +### Danger Level: Extreme|A witch gifted in the arts of conjuration. Backed by an army of animated spectral hands and devious tomes, this variety of witch is extremely dangerous. Her close range attacks are slow and unwieldy, but take care not to get surrounded.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: High|They appear to be influential figures in the ancient Bast cult. Not only are they able to wield explosive magics, they can conjure magical wrappings at close range.||-Denizens of the Dungeon by Catherine Willows + +### Bast Mummy + +### Danger Level: Medium|Worshippers of the Cat Goddess. Devoted to the sole task of defending the tombs from outsiders, they are rarely willing to negotiate. Some maintain peak physical prowess, while others can even cast spells.||-Denizens of the Dungeon by Catherine Willows + +### Bast Clerics + +### Rock-solid and form-fitting. + +### Provides minor protection against enemy attacks. Decreases stealth. + +### Adventuring Corset + +### Protects your organs and your sense of style. + +### Provides minor protection against enemy attacks at the cost of flexibility. + +### The best uniform. Has a (lockable) zipper in the back for convenience! + +### Removes excess clothing and adds +10 Evasion. +20 Soap and Glue resist, and being drenched dries faster. + +### Robe of Chastity + +### A magical leotard whose power stems directly from the divine. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. + +### Chainmail Tank Top + +### Cumbersome, but effective! + +### Provides +10 armor and protection against enemy attacks. Decreases stealth/evasion and makes struggling harder. + +### Chainmail Bikini + +### Covers the important bits, anyway. + +### +20 Bondage Resist. Conducts electricity. + +### Light Plate Armor + +### Knight in shining rest-err, armor! + +### Provides +5 armor and high protection. No impact to stealth or evasion + +### Wizard's Robe + +### I have the power! + +### +30% spell damage and +10 spell ward + +### Chain Skirt + +### A defensive garment providing optimal coverage to the lower torso. + +### Provides medium protection. No impact to stealth or evasion + +### Armored Skirt + +### Gloves with an iron grip. + +### Provides +5 armor and minor protection against enemy attacks. Makes noise when attacking. + +### Leather Gloves + +### Protecting you in style. + +### Provides minor protection against enemy attacks. + +### Steel Pauldrons + +### Dependable protection for the average adventurer. + +### Ranger's Cape + +### Inbued with the powers of moss and ferns and stuff. + +### +25 Evasion. Increases stealth slightly. + +### Oracle's Armbands + +### Armbands made of a slightly magical material. + +### +5% spell damage. +5 Magic Armor. + +### Armored Boots + +### Noisy, but fashionable! + +### Provides +5 armor and protection against enemy attacks. Decreases stealth. + +### Hide Boots + +### For stepping into all kinds of trouble! + +### Generating Map... + +### Mystic wrappings constrict around your body! + +### You'll need a sharp object to cut items. Look for a knife or a piece of scrap on the floor. + +### If you can't get your knife into place, try sitting next to a crack on the wall. + +### Your character will automatically try to lodge the knife into the wall. + +### You'll need to find a cutting weapon with the magic tag to cut magic items. + +### You need to equip your magic cutting weapon to cut magic items. + +### You can surrender in the menu if you want to be treated more gently. + +### That ghost looks less aggressive than the others. Maybe she can help? + +### Need help? Try asking a neutral NPC for assistance! + +### You flanked the enemy! Now attack its weak point for massive damage! + +### Enemies that miss an attack become vulnerable for a turn. + +### Attack them for a guaranteed critical hit! + +### before the attack lands! You can tell the difference by the border of the tiles. + +### Enemy attacks take time to hit. Make sure to step out of the warning tiles, + +### You can dodge out of the way of most projectiles. Avoid the marked tiles. + +### 'Charge' is a unified ammunition for all of your weapons. Recharge it with ancient crystals. + +### Spent crystals can slot into some light fixtures to recharge them, but it requires 100 gold. + +### There is an elevator in this room, but it won't function until you defeat major enemies on this level. + +### If you can't escape from a restraint, try offering gold at a shrine devoted to its goddess. + +### Defeating enemies recovers some willpower. + +### Temporary enemies and summons don't restore anything, however. + +### Attacking a helpless enemy captures her and sends her to your Collection. + +### You can access the Collection in the Items screen, 2nd tab. + +### Conjure Essence Mote + +### Spend 50 DP to conjure a mote of pure spell essence. The mana cost of this spell is decreased based on your maximum DP.|Can only be cast while you have less than 100% DP. + +### You channel your distraction into a tangible orb! + +### You don't have enough distraction! + +### Choose an open space. + +### Choose a tile with no existing mote. + +### You're too distracted to concentrate your distraction! + +### The burst of desire overwhelms you! + +### Psychic Link + +### Deals 20 Psychic damage, then creates a psychic link between you and a single target for 50 turns, splitting distraction gain between the two of you. Requires that you and the target be able to see each other. + +### Target a non-blinded enemy. + +### You briefly lock eyes with the target, forming a psychic link! + +### The psychic link ends between you and the ENMY. + +### Shock Collar + +### Condense your aroused thoughts into stimulating electricity, consuming 30 DP to zap anyone that's currently holding your leash for 40 e-stim damage. 25% chance to stun for a long time, otherwise stuns briefly. Subsequent uses cost 2x the DP. + +### You must be leashed by someone to use this. + +### You don't have enough distraction. + +### You zap your leasher! + +### You are psychically connected! + +### You've used Shock Collar recently and it costs more DP. + + + +### Essence Crystal + +### When you miscast, 50% chance to emit a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. + +### A necklace designed for mages who are novices or easily distracted. It helps recover magical essence lost during miscast. + +### When you miscast, the necklace emits a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. + +### You erase the seal sigil. + +### You absorb the mote, granting miscast reduction. + +### Your necklace emits a mote as a result of miscasting. + +### Your distraction reaches a critical point! -100% miscast chance. + +### While at 100% distraction, you gain -100% miscast chance, but spending too much mana at once may cause you to go over the edge. + +### -100% miscast chance, but casting spells can send you over the edge. + +### The psychic link conducts away some of the intensity... + +### Your linked target lets go of herself, transmitting a wave of pleasure to yourself... + +### FCTN RMTPE + +### PTRN's RMTPE + +### Leads to PLCE + +### (You find a girl clad in a pink catsuit and restrained with straps.)|(She wears a backpack with a note attached to it.)|'My pet here can pick up and deliver restraints for you~'|'Try opening the Facilities tab and depositing restraints!'|'Signed: Your Loyal Warden' + +### It becomes hard to resist the dragon's fury... + +### The dragon overwhelms you with sheer force... + +### Your strength begins to fade... + +### >Entrance + +### >Exit + +### >Stairs + +### Quest(GDSNM) + +### [GDSNM] + + + +### Bed! + +### Silver + +### Mecha + +### chest + +### Lost Items + +### Cache + +### Toy Chest + +### (L) + + + +### (The SPEAKER sits encased in skintight rubber up to her nose.|Though the latex over her mouth is smooth and flat,|you know from her whimpering moans that her mouth|is totally filled with a gag, useless like the rest of her body.|Some sort of stand affixes her to the floor.) + +### (You don't have any solvents that work on latex) + +### (You dissolve her restraints, fumbling around for a while with your bound hands) + +### (You rescue the SPEAKER)|Thank you!|Let's get out of here! + +### (You rescue the SPEAKER)|Mmmmph!|(She wants to keep her gag...) + +### (You are not holding a cutting tool) + +### (You cut her restraints, fumbling around for a while with your bound hands) + +### (You don't have enough mana for Remove Slime) + +### (You utter a word of release to free the SPEAKER)|Many thanks!|Let's go! + +### (You utter a word of release to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) + +### Dissolve the latex with a SLVNT + +### Cut her out with a sharp tool + +### Use Remove Slime to unlock her + +### Local Saves + +### Cloud Saves + +### solvent + +### Latex Doll Stand + +### A stand for your latex dolls, coated in a smooth rubber coating. + +### Has a flange for propping up even dolls wearing chastity belts. + + + +### (The SPEAKER strokes a hand over your body)|It looks like you're carrying some dangerous goods.|Prisoners shouldn't be carrying what doesn't belong to them~ + +### (The SPEAKER folds her hands together)|Miss, I was instructed to make sure you don't have|anything dangerous. I'm going to search you now. + +### (The SPEAKER looks at you plainly)|Did you think you were going to sneak in with all of that? + +### (The SPEAKER smiles)|Let's see, what loot do we have here...|(SPEAKER is going to search you) + +### (The SPEAKER scans you with a red light)|Enumerating contraband...|Please comply for removal. + +### Yes, miss... (Begin search and confiscation) + +### Mmph... (Nod politely) (Begin search and confiscation) + +### No, I refuse! (Fight) + +### Mmph! (Shake your head and fight) + +### Option not available at 0 WP + +### (The SPEAKER starts by removing most of your clothes...) + +### (Next, the SPEAKER looks through your weapons) + +### (Finally, the SPEAKER opens the rest of your bag) + +### (The search is complete)|There! Now let's get you situated~ + +### (The search is complete)|Alright miss, please behave, okay? + + + +### Confiscated AMNTx ITMN! + +### Kept AMNTx ITMN. + +### Sneaked in AMNTx ITMN! + +### GUN + +### The room echoes with the sound of a rubber bullet being fired! + +### Tactical Rubber Bullet + +### A powerful rubber bullet bounces you to the ground! + +### The powerful rubber bullet knocks you down and congeals into Capture Foam! + + + +### Capture Foam (Feet) + +### A sticky foam that spreads quickly and hardens into a tight rubbery layer. + +### A knife won't cut it, it simply reforms around the cut. + +### Capture Foam (Ankles) + +### Capture Foam (Legs) + +### Capture Foam (Arms) + +### Capture Foam (Hands) + +### Capture Foam (Mouth) + +### Capture Foam (Head) + +### Capture Foam Dispenser + +### This collar is designed to make sure its wearer does not escape at all costs. + +### It will occasionally cause Capture Foam to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of Capture Foam you have on you. + + + +### Tactical Rubber + +### An alchemical substance made to be stretchy and more resilient than natural rubber. + +### Developed by kinky alchemists and marketed to PMCs across the islands. + +### Capture Foam + +### A restraining weapon used to apprehend difficult targets. + +### Tactical Rubber (Feet) + +### The end result of capture foam. Strict. Sustainable. Affordable. + +### Tactical Rubber (Ankles) + +### Tactical Rubber (Legs) + +### Tactical Rubber (Arms) + +### Tactical Rubber (Hands) + +### Tactical Rubber (Mouth) + +### Tactical Rubber (Head) + +### Tactical Rubber Collar + +### It will occasionally cause tactical rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. + + + +### Sweeping Strike + +### Headlong Rush + + + +### Maid Squire + +### Maid Knight + +### You humiliate the Maid Squire! + +### You defeat the Maid Knight! For now... she swears revenge. + +### The Squire zips you up in comfy leather gear! + +### The Maid Knight places you in strict bondage! + +### The Squire secures your restraints! + +### The Maid Knight secures your restraints! + +### The Squire dusts you with her duster plug. + +### The Maid Knight sweeps you with her cleaning halberd! + +### The EnemyName retreats! + +### The EnemyName manages to squirm out of sight! + + + +### servers humming... + +### bouncy noises + +### goopy noises + +### bubbling noise + +### rubber squeaking + +### blaring siren + +### You claim the Sweeper. + +### The Sweeper + +### Foe of the unclean. Bringer of neat and tidy workspaces. + +### Deals slash damage. Also deals 30 tickle damage in an area. Has a ranged attack. + +### Make a ranged attack with the Sweeper. + +### You claim the Persuader. + +### The Persuader + +### Military forces sought a solution with higher stopping power after the Great Work made brute force obsolete. Capture Foam rounds are now the standard. + +### Equipped with a duster plug, it deals tickle damage on melee. Can fire a high caliber rubber bullet to deal 80 glue damage from a distance. Takes 3 turns to reload. + +### Make a ranged attack with the Persuader for 25 charge. Deals 80 glue damage. + +### Persuader Round + +### You fire the Persuader! + +### Wait for current save to finish... + +### Please wait for save to finish... + +### Debug Defeat + +### You cast devastating ASCII glyphs! + +### Debug Bind + +### You cast bondage ASCII glyphs! + +### , Floor AMNT + +### Recolor + +### Only collect notable + +### Autorelease escaped + +### NME is not notable enough for your collection. + +### Auto-released NME due to Escape. + +### Your ITMN1 was cursed and transforms into a ITMN2! + +### Equipping Restraint... + +### Equipping Armor... + +### Using Consumable... + +### Struggling... + +### The ITMN1 is purified and returns to being a ITMN2! + +### Reverts if purified with item. + +### ...smaller than expected. + +### Comes with an artistic flair. + +### Set Pivot + +### Toggle click & drag + +### Settings + +### Scroll Controls: + +### Layer Text: diff --git a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_JP.txt b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_JP.txt index b5b95c7e0..ee87491ea 100644 --- a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_JP.txt +++ b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_JP.txt @@ -1,5 +1,5 @@ -Credits -クレジット +### By Strait-Laced Games + Credits クレジット Patrons @@ -8,1154 +8,1922 @@ News and Updates ニュースとアップデート Support @ Patreon サポート @ Patreon +### Thank you to the following awesome people for supporting me at patreon.com/ada18980 + Back 戻る Next -次 -Music: kocaeli|Bound enemy graphics: Song|CN Translation: Alexthymia|KR Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Audio:|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi -音楽: kocaeli|バインドされた敵のグラフィック: 歌|CN 翻訳: Alexthymia|KR 翻訳: Phantasm|コードの貢献者: Ellie、Demopans、Aelie|オーディオ:|ポーション ドリンク - Jamius|クリック - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified| Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw. co.uk) の Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling |はさみ - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi -Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators -Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|シンクからチェーンを引きずり出す - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/ja/users/5944252 - Draws awesome wolfgirls|spark utamaro - 感覚的なバイブレーターのアイデアのために +次へ +### Music: kocaeli, Darkstar Studios|Bound enemy graphics: Song|RU Translation: Osiris|CN Translation: Alexthymia, Mitki, Timeline|KR, JP Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Art: Kjus, Quakehoof, Lumpychan, Kertasu, Koirin, Lightning Rook, Daikinbakuju, Sigma Overlord, dask3|Plasmadragon, GoldieKitsune, SMoonlightM, PureWind, Wyatt Wintersoul|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi + +### Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|AlaskaRobotics - duct tape unroll 3, duct tape unroll 1|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators + Language 言語 -English -英語 -Chinese -中国語 -Korean -韓国語 -Mods -モッド +### English + +### Chinese + +### Korean + +Japanese +日本語 +### Spanish + +### French + +### Russian + +### Mods + Mods Loaded. -モッドがロードされました。 +個のMODをロード -This game engages in safe and consensual analytics. -このゲームは、安全で同意のある分析に取り組んでいます。 -It sends data about spell choices, levels reached, etc, to help balance and improve the game. -呪文の選択、到達レベルなどに関するデータを送信し、ゲームのバランスと改善に役立てます。 -No personal data is sent or stored. -個人情報が送信・保存されることはありません。 -Accept -承諾 -Don't Track Me -拒絶 + +### Version + +### Kinky Dungeon + +### By Ada18980 You are an adventurer descending into an ancient underground city of magic. -あなたは古代の魔法の地下都市に降り立つ冒険者です。 +あなたは古代の地下魔法都市に挑む冒険者です。 Beneath its depths lies the Mistress' Staff, an artifact of untold power. -その深さの下には、計り知れない力のアーティファクトである女王の杖があります。 +地下深くには、強大な力を持つ「女王の杖」と呼ばれるアーティファクトが眠っている、と言われています。 Will you prevail against forces unknown, or succumb to its dark secrets? -あなたは未知の力に打ち勝ちますか、それともその暗い秘密に屈しますか? -(This game does not contain spiders or any carnivorous creatures/plants) -(このゲームにはクモや肉食動物/植物は含まれていません) -(Check out the latest standalone version at the News and Updates link below!) -(以下のニュースとアップデートのリンクで最新のスタンドアロン バージョンをチェックしてください!) +果たしてダンジョンを踏破し、偉大なる力を手に入れられるでしょうか、それとも……? +(This game does not contain spiders) +(このゲームにはクモは出ません) + + +GFX +画面設定 +Character +キャラクター +Main +オプション +### UI + +Controls +操作 +Keybindings +キー設定 + + +### Show Enemy Binding as % + +### Auto-wait Through Delayed Actions + +### Show Minimap Labels + +Auto loot all from chests +宝箱の中身を自動で収集 +### Use Palette regardless of Outfit + +Apply palettes to Restraints +拘束具にパレットで設定した色を使用 +Apply palettes to transforms +人外要素にパレットで設定した色を使用 + + +Don't use character palette +パレットで設定した色を使用しない +Always use character palette +常にパレットで設定した色を使用 +Use character palette for default outfit +デフォルト衣装にパレットで設定した色を使用 + + +Show Background Art +背景の絵を表示 +### Experimental Rendering (unstable) + +Mute when Minimized +最小化時にミュート +Show DP instead of % +DPを数値で表示する +Quick Inv only equips to self +クイックインベントリからの拘束具使用は自縛のみ +Override Outfit when Loading Save +セーブデータのロード時に服装上書き +Save Outfits within Save Files +セーブ内に服装データを保存 +Show free characters on map +拘束されていないキャラをマップに表示 +Detailed jailed NPCs (experimental) +囚人の詳細な表示(テスト中) +Show Struggle Bars +もがきゲージを表示する +Allow Suspicious Mods +危険なMODを許可 +Auto Load Mods (offline only) +MODを自動で読み込む(オフライン専用) +Classic Inventory Background +インベントリの背景を昔の仕様に戻す +Skip Intro +オープニングをスキップ +No Forced Greetings +強制的な会話ダイアログを抑制 +Show Zoom Buttons +ズームボタンを表示 +Show Restraint Info on Escape Hover +拘束具の情報を表示 +Always Show Warnings +常に警告を表示 +Always Show Minimap +常にミニマップを表示 Enable Sound サウンドを有効にする -Enable Drool/Tears +Drool/Tears よだれ/涙を有効にする Draw Armor -ドローアーマー +鎧を描写する Enable Music 音楽を有効にする +Async Rendering (beta) +非同期レンダリング(beta) +Bloom & Glow +ブルーム&グロー +Transparent UI +UIを半透明にする Turn Counter -ターンカウンター +経過ターン数を表示する Flash Screen on Stun -スタン時のフラッシュスクリーン -Advanced Distraction VFX -高度な気晴らし VFX +スタン時に画面を明滅させる +Map Particles +マップのパーティクル +Distraction Particles +興奮時のパーティクル +Vibration Particles +オモチャ類のパーティクル +Gag Particle FX +猿轡のパーティクル Show NPC Status -NPCステータスを表示 -Advanced Fog of War -高度な戦争の霧 +NPCステータスを表示する +Show Spell Range +魔法の効果範囲を表示 +Trim Edge Walls +壁の角をなめらかにする +Fog Shader +霧のシェーダー +Light Shader +明かりのシェーダー Intense 'Let Go' VFX -強烈なLet GoVFX +絶頂時のエフェクトを再生 Enable Toy SFX -おもちゃの SFX を有効にする +オモチャの効果音を再生 Enable Fullscreen フルスクリーンを有効にする +Hi-Res Distortion (Needs Restart) +なめらかな曲線(リスタートが必要) +Hi-Res Model (no restart needed) +ハイレゾモデル(リスタート不必要) High Quality Animations -高品質のアニメーション -Wait Quickly -すぐに待って -Blocked restraint! -ブロック拘束! +ハイクオリティなアニメーション +Enemy Animations +敵のアニメーション +One-Click Move (when slowed) +1クリックで移動する(減速時) +Latch Shift Key +トグル式シフトキー +Crotch Rope under panties +パンツの下に股縄を表示 +Chastity over Panties +パンツの上に貞操帯を表示 +Chastity over Harness +貞操帯をハーネスの上に表示 +Chastity Bra over Bras +ブラの上に貞操ブラを表示 +Simple Color Picker +衣装の色をシンプルに変更 +Center Player +プレイヤーキャラを画面中央に +Draw Buffs on Side +画面横にバフを表示 +Show Trajectory on Auto-Path +自動移動時の経路を表示 +Show Player Facing +向いている方向を表示 +Show more learnable spells +習得可能な魔法を全て表示する +Show Player Buff Auras +プレイヤーのオーラ表示 +Show Enemy Buff Auras +敵のオーラを表示 +Minimalist Enemy Auras +敵のオーラを小さく表示 +Pixelated GFX (needs restart) +ピクセル化GFX(リスタートの必要アリ) +Auto-Crouch when Tripped +転んだときに自動でしゃがむ +Retro Animations +古いアニメーション +Flip Status Bars +ステータスバーを反転 +Reduce Accidental Wall Clicks +誤クリック抑制 +Enable Nipples +乳首を描写 +Show Nipple Toys Over Bras +ブラ越しに乳首のオモチャを表示 +Hide Nipple Clamps +乳首のオモチャを隠す +Hide Nipple Piercings +乳首ピアスを隠す +Use default palette when no outfit is worn +拘束具と衣装に設定した色を使う +Flip Player Display +キャラを反転 +Grayscale when Blind +目隠し時に画面を灰色にする +Faster Floater Fade +フローターを素早く消す +No Damage Floaters +ダメージフローターを表示しない +Dynamic Armor (must hide armor) +ダイナミックアーマー(「鎧を描写する」をオフにする必要あり) +Hide floating weapon display +浮遊させている武器を非表示 +### Automatically Take All from Chests + +Helpless! +逃げられない! +Evaded! +回避した! +Blocked! +防御した! +Resisted Bondage! +拘束に抵抗した! + + You bump into a wall. -あなたは壁にぶつかります。 +壁にぶつかった。 + + +Game Resolution: +画面サイズ: +Resolution (needs reload): +画面サイズ(ゲームの再起動が必要): +Toy Volume: +オモチャのボリューム: +Music Volume: +BGMボリューム: +SFX Volume: +SEボリューム: +Animation Time: +アニメーションの長さ: +Map Brightness: +マップの明るさ: +Game Font: +ゲームのフォント: +Button Font: +ボタンのフォント: +### Journey + Select a journey. This will determine the ordering of game areas. -ジャーニーを選択してください。これにより、ゲーム エリアの順序が決まります。 +モードを選択してください。エリアの順番が変わります。 Standard: The intended experience -スタンダード:意図した体験 +普通:通常の生成 Random: A chaotic journey -ランダム:混沌とした旅 +ランダム:エリアがランダムで変わります Harder: A more difficult journey -Harder: より困難な旅 +Harder:難しいエリアが選ばれます + + Select perks to start with. -特典を選択して開始します。 +パークを選択 Having 10+ spare points will trigger Hard Mode, granting unique loot. 10以上のスペアポイントがあると、ハードモードがトリガーされ、ユニークな戦利品が付与されます. (HARD MODE ENABLED) -(ハードモード有効) +(ハードモード) Advanced start (choose perks) -アドバンススタート(特典選択) -Confirm and start playing! -確認してプレイ開始! +パークを選択して開始 +Kinky start +拘束パークを自動選択して開始 +Normal start +ゲーム開始 + + Point Cost: AMOUNT -ポイントコスト: AMOUNT +パークのコスト: AMOUNT Points Available: AMOUNT -利用可能なポイント: AMOUNT +所持ポイント: AMOUNT + + Resilient Foes -レジリエンス・フォーエズ -Enemies take 30% less damage. -敵が受けるダメージが 30% 減少します。 +強靭な敵 +Enemies have 30% more hp. +敵のHPが30%上昇する + + Strong -強い +剛腕 Boosts the Struggle option when escaping. -逃げるときの闘争オプションをブーストします。 +「もがく」の効果が上昇する Helpless -無力 +非力 You are physically weak. Struggling is much less effective. -あなたは体が弱いです。苦労してもあまり効果がありません。 +「もがく」の効果が低下する + + Flexible -フレキシブル +柔軟な体 Slightly boosts the Remove/Unlock option, escaping is 1.5x as fast except picking, and your feet can use items/buckles. -取り外し/ロック解除オプションをわずかにブーストし、ピッキングを除いて脱出が1.5倍速くなり、足でアイテム/バックルを使用できるようになります。 +ロックピックを使用しない時、「取り外し」「解錠」の効果が1.5倍になる。足でアイテムの使用とバックルの操作が可能になる Inflexible -柔軟性がない +体が固い You get a penalty to the Remove and Unlock action, and escaping is 0.75x as fast. -削除してロックを解除するア​​クションにペナルティが発生し、逃げる速度が0.75倍になります。 +「取り外し」「解錠」の効果が0.75倍になる + + Locksmith 錠前屋 You get a bonus to lockpicking, allowing you to pick some high-security locks previously impossible. -ロックピッキングにボーナスがあり、以前は不可能だった高セキュリティのロックをピッキングできるようになります。 +「ピッキング」の効果が上昇する。極めて高度な鍵の解錠が可能になる Clueless -無知 +門外漢 You have no idea how to pick locks. Picking is 0.5x as fast and you can't pick most advanced locks. -あなたは鍵の開け方を知らない。ピッキングは 0.5 倍速く、最も高度な錠前を選ぶことはできない。 +「ピッキング」の効果が0.5倍になる。高度な鍵の解錠が不可能になる + + Psychic -超能力のある +サイキック You no longer drop keys and picks, can unlock yourself with bound hands, and don't need hands for items/potions. -鍵やピックを落とさなくなり、縛られた手でロックを解除でき、アイテム/ポーションに手を必要としなくなりました。 +鍵やロックピックを落とさなくなる。手を縛られていてもアイテムの使用が可能になる Novice -初心者 +素人 All spells above 1st level cost 2x as many spell points. -1レベル以上のすべての呪文は、2倍の呪文ポイントが必要です。 +1レベル以上の魔法の習得に倍のスキルポイントがかかる + + Blessed -祝福された +祝福 You can drink mana from the shrine fountains once per floor without chance of punishment. -神社の噴水からマナを飲むことができるのは、1 階につき 1 回だけで、罰を受けることはありません。 +1階につき1度だけ、神の泉から神罰無しで水を飲めるようになる Cursed -呪われた -Goddess reputations start at 0 and can never exceed 25. -女神の評判は0から始まり、25を超えることはありません。 +呪い +Goddess reputations can never exceed 25. +女神との関係性の上限が25になる + + Submissive 従順 Your submissiveness starts at 100 and cannot go below 70. -服従度は100から始まり、70を下回ることはありません。 +ゲーム開始時の「服従度」が100になり、下限が70になる Wanted -欲しかった +指名手配 Your security level starts at 100 and cannot go below 70. -セキュリティ レベルは 100 から始まり、70 を下回ることはできません。 +ゲーム開始時の「手配度」が100になり、下限が70になる + + Studious 勤勉 -You start the game with +3 additional spell points. -+3 の追加スペル ポイントを持ってゲームを開始します。 +You start the game with +1 spell point. Your first two spell categories are free. +追加で1スキルポイントを得る。また「スペルツリー」内で最初の二つのみ、スキルポイント無しで習得可能。 Meditation 瞑想 You slowly regenerate mana, up to a maximum of 50. -最大50まで、ゆっくりとマナを再生します。 +マナが50以下の時、最大50までゆっくりと回復する + + Willpower -意志力 +意志の力 -50% stamina drain from being at high arousal. -高覚醒時のスタミナ消費量-50% +興奮値が高い時、スタミナ消費が50%低減される Bondage Lover -ボンデージラバー +拘束愛好家 Attempting to escape arouses you. -逃げようとすると興奮する。 +拘束を解除する際、興奮値が上昇する + + Focused Dodge 集中回避 While your miscast chance is 0%, you gain +40 Evasion. -ミスキャスト確率0%の間、回避+40。 +詠唱失敗率が0%の時、回避力40を得る Distracted -気が散る +注意力散漫 +15% miscast chance (at all times) -ミスキャスト確率+15%(常時) +常に15%の詠唱失敗率を得る + + Brawler -喧嘩屋 -Unarmed attacks deal +10 damage. -素手攻撃のダメージ+10 +格闘家 +Unarmed attacks deal +10 damage and being bound does not decrease unarmed damage. +素手の時、ダメージが10増加し、拘束されていてもダメージが減少しなくなる + + +Way of the Squish +くねくねの道 +Unarmed attacks deal grope damage against humans. +素手の時、人型の敵に対して愛撫属性ダメージを与える +Way of the Spank +スパンキングの道 +Unarmed attacks deal pain damage against humans. +素手の時、人型の敵に対して苦痛属性ダメージを与える +Way of the Feather +くすぐりの道 +Unarmed attacks deal tickle damage against humans. +素手の時、人型の敵に対してくすぐり属性ダメージを与える + + +Harmless +非力 +Unarmed attacks deal half damage and cost 2x as much stamina. +素手の時、ダメージが半分になりスタミナコストが2倍になる + + Clumsy 不器用 0.7x base accuracy -0.7倍の基本精度 +基礎命中率が0.7倍になる + + Unfocused 焦点が合っていない Accuracy multiplied by 0.9x above 10% distraction, down to 0.6x at 90% distraction. -注意散漫が 10% 以上の場合、精度は 0.9 倍になり、注意散漫が 90% の場合は 0.6 倍になります。 +興奮値に応じて、命中率が低下する。興奮値が10%の時には命中率が0.9倍になり、興奮値が90%の時には命中率が0.6倍になる + + +### Focused Strikes + +### 90% less accuracy penalty on swung weapons due to distraction. + +### Focused Power + +### 90% less stamina cost penalty on staves and similar weapons distraction. + Pristine 原始的 -There are no shiny loot objects in the dungeon. -ダンジョンに光る戦利品はありません。 +There are significantly less shiny loot objects in the dungeon. +光るルート品が極めて生成されにくくなる Lost Technology -失われた技術 +”ロスト”テクノロジー Ancient power cores break with use, and cannot be recharged. -古代の力のコアは使用すると壊れ、再充電できません。 +古代のクリスタルを使用した際、破損して再利用不可能になる + + Unchained -アンチェインド +アンチェイン Start with high Metal reputation, and all metal restraints are easier to escape from. -金属の評判が高い状態から始めると、すべての金属製の拘束具が逃げやすくなります。 +ゲーム開始時、金属の女神との関係性が高くなり、金属製の拘束具から抜け出しやすくなる Damsel in Chains 鎖につながれた乙女 Metal restraints are harder to escape from. -金属製の拘束具から逃れるのはより困難です。 +金属製の拘束具から抜け出しにくくなる + + Forgetful 忘れっぽい -You don't remember where you've been in the level. -あなたはレベルのどこにいたか覚えていません。 +### You don't remember where you've been in the level. 30 turn timer. + Cursed Locks 呪われた錠前 Those without keys shall face the Wrath of the Lock. Locked items cannot be cut and are harder to struggle. -鍵のないものは、ロックの怒りに直面するでしょう。ロックされたアイテムは切断できず、苦労するのが難しくなります。 +拘束具に鍵がかかっている場合、「切断」が不可能になり、「もがく」選択時にペナルティを得る The magical warding from the lock protects the item. -ロックからの魔法の防御がアイテムを保護します。 +錠前の呪いが拘束具を守る。 Undeniable 否定できない Born with an intense submissive desire, you cannot refuse bondage from dialogues. -強烈な従順な欲求を持って生まれたあなたは、対話から束縛を拒否することはできません。 +NPCとのダイアログで拘束される時、抵抗できなくなる + + Frantic Struggle -狂乱の闘争 -Your struggling is 3 times as fast, but less efficient in terms of stamina. -あなたの闘争は 3 倍速くなりますが、スタミナの面では効率が悪くなります。 +めちゃくちゃにもがく +Your escaping is 3 times as fast, but less efficient in terms of stamina. +拘束から抜け出すスピードが3倍になるが、スタミナの消費量が増える + + Escape Artist -脱出アーティスト +縄抜け Start with high Rope reputation, and all rope restraints are easier to escape from. -ロープの評判が高いところから始めれば、すべてのロープの拘束から逃れやすくなります。 +ゲーム開始時、縄の女神との関係性が高くなり、縄から抜け出しやすくなる Rope Bunny ロープバニー Rope restraints are harder to escape from. -ロープの拘束は脱出するのがより困難です。 +縄から抜け出しにくくなる + + Slippery -滑りやすい +ぬらぬら Start with high Latex reputation, and all latex restraints are easier to escape from. -ラテックスの評判が高いところから始めれば、すべてのラテックスの束縛から逃れやすくなります。 +ゲーム開始時、ラテックスの女神との関係性が高くなり、ラテックス製の拘束具から抜け出しやすくなる Latex Doll -ラテックス人形 +ラテックスドール Latex restraints are harder to escape from. -ラテックスの拘束は逃れるのが難しい -Hogtied! -ホグタイ! -Start the game trussed up in tight ropes. -タイトなロープで縛られたゲームを開始します。 +ラテックス製の拘束具から抜け出しにくくなる + + Escapee -逃亡者 +奇術師 Start with high Leather reputation, and all leather restraints are easier to escape from. -革の評判が高いところから始めれば、すべての革製の拘束具から逃れやすくなります。 +ゲーム開始時、革の女神との関係性が高くなり、、革製の拘束具から抜け出しやすくなる Leather-Bound -革綴じ +レザーバウンド Leather restraints are harder to escape from. -革の拘束具から逃れるのは難しいです。 +革製の拘束具から抜け出しにくくなる + + Slayer スレイヤー You can cast Elemental spells without having the components, at twice the cost. Start w/ Firebolt. -構成要素がなくても、2 倍のコストでエレメンタル スペルを唱えることができます。ファイアボルトで開始します。 +詠唱に必要な部位が使用できなくても、2倍のマナを支払うことで精霊魔法を唱えられる。ゲーム開始時「ファイアボルト」を習得 Conjurer -手品師 +召喚士 You can cast Conjuration spells without having the components, at twice the cost. Start w/ Conjure Chain. -構成要素がなくても、2 倍のコストで召喚呪文を唱えることができます。召喚チェーンを使用して開始します。 +詠唱に必要な部位が使用できなくても、2倍のマナを支払うことで召喚魔法を唱えられる。ゲーム開始時「チェーン召喚」を習得 Magician マジシャン You can cast Illusion spells without having the components, at twice the cost. Start w/ Shadow Dagger. -コンポーネントがなくても、2 倍のコストで Illusion 呪文を唱えることができます。Shadow Dagger から始めます。 +詠唱に必要な部位が使用できなくても、2倍のマナを支払うことで幻惑魔法を唱えられる。ゲーム開始時「シャドーダガー」を習得 + + Narcoleptic ナルコレプシー You slowly lose stamina over time. -時間の経過とともにスタミナが徐々に失われます。 +ターン経過時、スタミナを消費する + + Stealth Mission ステルスミッション -You are harder to detect and there are more chests, but enemies take 30% less damage, are more evasive, and drop no gold. -あなたは発見されにくくなり、宝箱が増えますが、敵は受けるダメージが 30% 少なくなり、より回避しやすくなり、ゴールドをドロップしなくなります。 +You are harder to detect and there are more chests, but enemies have 50% more HP, are more evasive, and drop no gold. +敵に発見されにくくなり、宝箱の配置数が増える。敵はHPが50%上昇し、回避力が上昇する。また、倒した際にゴールドをドロップしなくなる +Edging Lovers +絶頂愛好家 +All humanoids that can bind you also apply edging toys. +全ての人型生物が絶頂用オモチャを使用するようになる +Denial Lovers +焦らしプレイ愛好家 +All humanoids that can bind you also apply denial toys. +全ての人型生物が焦らし用オモチャを使用するようになる +Pleasure Lovers +快楽愛好家 +All humanoids that can bind you also apply pleasurable toys. +全ての人型生物が快楽用オモチャを使用するようになる +Teasing Lovers +イタズラ愛好家 +All humanoids that can bind you also apply teasing toys. +全ての人型生物がイタズラ用オモチャを使用するようになる Latex Lovers ラテックス愛好家 All humanoids that can bind you also apply latex restraints. -あなたを縛ることができるすべての人型生物は、ラテックス拘束も適用します。 +全ての人型生物がラテックス製の拘束具を使用するようになる Leather Lovers -革の恋人 +革愛好家 All humanoids that can bind you also apply leather restraints. -あなたを縛ることができるすべての人型生物は、革の拘束も適用します。 +全ての人型生物が革製の拘束具を使用するようになる Wolfgirl Lovers -オオカミ少女の恋人たち +ウルフガール愛好家 All humanoids that can bind you also apply wolfgirl restraints. -あなたを縛ることができるすべての人型生物は、ウルフガールの拘束も適用します。 +全ての人型生物がウルフガール用の拘束具を使用するようになる Maid Lovers -メイドラバーズ +メイド愛好家 All humanoids that can bind you also apply maid restraints. -あなたを縛ることができるすべての人型生物は、メイドの拘束も適用します。 +全ての人型生物がメイド用の拘束具を使用するようになる Dress Lovers -ドレスラバーズ +ドレス愛好家 All humanoids that can bind you also apply dress restraints. -あなたを縛ることができるすべての人型生物は、服装の拘束も適用します。 +全ての人型生物がドレス型の拘束具を使用するようになる Kitty Lovers -キティラバーズ +ケモノ愛好家 All humanoids that can bind you also apply kitty restraints. -あなたを縛ることができるすべての人型生物は、キティの拘束も適用します。 +全ての人型生物がペット用の拘束具を使用するようになる Adv Latex Lovers -アドバンス ラテックス ラバーズ +高度な革愛好家 All humanoids that can bind you also apply advanced latex restraints. -あなたを縛ることができるすべての人型生物は、高度なラテックス拘束も適用します。 -Start Playing -ゲームスタート +全ての人型生物が高度な革の拘束具を使用するようになる Conspicuous 目立つ Enemies detect you more easily. -敵はあなたをより簡単に検出します。 +敵の感知範囲が拡大する + + Bound Power バウンドパワー Your damage and evasion increases based on the number of restraints worn, up to +40% when thoroughly bound. -装備している拘束具の数に応じてダメージと回避率が上昇し、完全拘束時は最大+40%。 +装備している拘束具の数に応じてダメージと回避率が上昇する。最大+40%まで Kill Squad -キル・スクワッド -Enemies see you through walls and at greater distance. -敵は壁越しに遠くからあなたを見ています。 -Supermarket -スーパーマーケット -Commerce shrines can appear in levels and have slightly more items. -商業神社はレベルで出現し、少し多くのアイテムを持っています。 -Price Gouging -価格つり上げ -Items are 5x as expensive in the shop. -お店の商品は5倍の値段です。 +キル・スクアッド +Enemies gain increased blindsight and vision radius. +敵の視力と視野が強化される + + Supermarket スーパーマーケット Commerce shrines can appear in levels and have slightly more items. -商業神社はレベルで出現し、少し多くのアイテムを持っています。 +1階層に最低1つの商業の祭壇が出現し、販売アイテム数が増加する Price Gouging -価格つり上げ +ぼったくり Items are 5x as expensive in the shop. -お店の商品は5倍の値段です。 +販売価格が5倍になる + + High Security ハイセキュリティ Picks are weaker, and randomly generated locks are harsher. -ピックは弱く、ランダムに生成されたロックはより過酷です。 +ロックピックの破損率が上昇する。ランダムに生成されたロックの難易度が上昇する Shoddy Knives -ショディナイフ +粗雑なナイフ Knives break more easily. ナイフが壊れやすくなる Oppression 抑圧 Ghosts are less likely to help you. -ゴーストがあなたを助けてくれる可能性は低くなります。 +拘束から抜け出す際、幽霊からの助力を得られる可能性が低くなる Search Party 捜索隊 More enemies spawn during sleep. -睡眠中はより多くの敵がスポーンします。 +睡眠中により多くの敵が出現するようになる + + No Way Out -追いつめられて -Enemies will always use the tightest restraints possible and fully bind you. -敵は常に可能な限り最も厳しい拘束を使用し、あなたを完全に拘束します。 -Graceful Walk -優雅な散歩 -You don't lose stamina when walking with one slowing item, unless it binds your legs together. -足を拘束しない限り、減速アイテムを 1 つ持って歩いてもスタミナを失うことはありません。 +追い込み +Enemies will always use the tightest restraints possible regardless of willpower. +10 Security level. +気力に関係なく、敵が最も強力な拘束を使用する。手配度+10 +Deft Footwork +足さばき +You ignore some consequences of being mildly slowed from heels or slime, and you can cast Leg spells while slowed significantly at 50% miscast chance. +ヒールやスライムによる減速状態をある程度無視し、50%の詠唱失敗率で大幅に減速した状態でも脚を使う魔法を使用できる +Poor Form +へたくそな構え +Slowing effects on you are amplified. +減速効果が増幅される +Poor Coordination +ダサいコーデ +You must have both fingers and arms free to cast arm spells. Hand restraints are more effective on you. +腕を使用する魔法を使う際、両方の腕と手が必要になる。手の拘束がより効果的になる +Deft Fingering +器用な指先 +You can cast arm spells using just your fingers, as long as your hands aren't bound. +手を拘束されていない限り、指だけで腕を使用する魔法を唱えられる + + Well-Equipped -装備充実 -Restraints and traps that are limited by level appear sooner, and enemies will stack many restraints. -レベル制限のある拘束や罠の出現が早くなり、敵は拘束をたくさん重ねる。 +準備万端 +Restraints and traps that are limited by level appear sooner, and enemies stack more restraints in general. +10 security level. +レベル制限のある拘束具と罠の登場が早まる。敵はより多くの拘束具を所持するようになる。手配度+10 + + Quick-Draw クイックドロー Switching weapons and spells does not take a turn. -武器と呪文の切り替えにターンはかかりません。 +武器と魔法の切り替えにターンを消費しなくなる Quick-Scribe クイックスクライブ Switching spells and casting from spellbook does not take a turn. -スペルの切り替えとスペルブックからのキャストにはターンがかかりません。 +魔法の切り替えと魔導書からの詠唱にターンを消費しなくなる + + Disorganized -無秩序 +ごちゃごちゃ Switching weapons, learning/choosing spells, and casting from spellbook takes 3 turns. -武器の切り替え、呪文の学習/選択、魔法書からの詠唱には3ターンかかります。 +武器の切り替え、魔法の習得、魔法の登録、魔導書からの詠唱に3ターンかかる Savour the Taste -味を味わう +味わう Drinking a potion takes 2 turns -ポーションを飲むのに2ターンかかる +ポーションを飲む際、2ターンかかるようになる + + Magic Hands マジックハン​​ド Enemies can add restraints underneath existing restraints. -敵は既存の拘束の下に拘束を追加できます。 +敵は装備中の拘束の下に拘束を追加できる + + +Fully Integrated +完全一体化 +Start with your body sealed in an adhesive layer of latex. +ラテックスで全身を覆われた状態でゲームを開始する + + +Doll Processing +人形加工中 +Start atop a conveyor on your way to be sealed away inside the Facility. +コンベアの上で人形に加工されている状態でゲームを開始する +Cyber Doll +サイバードール +Start in full Cyber restraints. +サイバー系の拘束具を装備した状態でゲームを開始する Fuuka's Pet フウカのペット Start with Fuuka's collar and a few restraints. -フウカの首輪といくつかの拘束具から始めます。 +フウカの首輪といくつかの拘束具を装備した状態でゲームを開始する Fuuka Fan Club -風花ファンクラブ +フウカちゃんファンクラブ All humanoids that can bind you also apply Fuuka's special restraints. -あなたを縛ることができるすべての人型生物は、フウカの特別な拘束も適用します。 +全ての人型生物がフウカ特製の拘束具を使用するようになる +Collected +コレクションの一部 +Start with The Warden's special belt which punishes you for defiling spell orbs. +看守長の特殊なベルトを装備した状態でゲームを開始する。このベルトを装備している間、オーブを破壊すると罰を受ける +Enforcers +執行人 +All humanoids that can bind you also apply The Warden's cuffs. +全ての人型生物が看守長特製の拘束具を使用するようになる +Dollmaker's Minions +ドールメイカーの手先 +All humanoids that can bind you also apply Cyber Doll restraints. +全ての人型生物がサイバー系の拘束具を使用するようになる +Doll Hunter V +ドールハンターV +You start with the Dollmaker's Visor. +ドールメイカーのバイザーを装備した状態でゲームを開始する +Doll Hunter M +ドールハンターM +You start with the Dollmaker's Mask. +ドールメイカーのマスクを装備した状態でゲームを開始する +Persisting Desires +尽きぬ欲望 +Your dark desires are endless. +暗い欲望が尽きなくなる + + +Sugar Rush +シュガー・ラッシュ +Consuming sweets makes you hyperactive, decreasing stamina costs and granting free moves. +お菓子を食べると力が湧いてくる。スタミナコストが減少し、追加で移動できる。 + + Vengeance -復讐 +報復 Defeating an enemy greatly distracts you. -敵を倒すと、気が散ってしまいます。 +敵を倒した際、興奮レベルが上昇する Berserker Rage バーサーカーレイジ Melee attacks distract you, but melee (including chain) damage increases by up to 30% at max distraction. -近接攻撃は気を散らしますが、気晴らしが最大になると、近接 (チェーンを含む) のダメージが最大 30% 増加します。 +近接攻撃時、興奮レベルが上昇する。興奮レベルが高い時、与えるダメージが上昇する。最大30% Unstable Magic 不安定魔法 Spells do up to 60% additional damage based on distraction or miscast chance, whichever is higher. -呪文は、気晴らしまたはミスキャストのどちらか高い方に基づいて、最大 60% の追加ダメージを与えます。 +詠唱時、興奮レベルまたは詠唱失敗率の高い方に応じて与えるダメージが上昇する。最大60% Absolute Focus 絶対集中 Miscast chance is doubled. -ミスキャスト確率2倍 +詠唱失敗率が2倍になる + + Bound Crusader バウンドクルセイダー -Goddesses will expect you to wear their restraints as their champion. -女神はあなたが彼らのチャンピオンとして彼らの拘束を身に着けることを期待するでしょう. +Goddesses will equip restraints upon acceptance of a quest. +女神に対応する属性の拘束具をつけなければクエストを受けられなくなる + + Nowhere is Safe -どこも安全ではない +逃げ場なし Beds and furniture are often trapped. -ベッドや家具が閉じ込められることがよくあります。 +ベッドや樽等のインテリアに罠が混じるようになる + + +Quakehoof Associate +クエイクフーフ・アソシエイト +Start with the Epsilon Collar, which regenerates mana when you play with yourself. +イプシロンの首輪を装備してゲームを開始する。この首輪を装備して自慰をすると、マナが回復する。 +Epsilon Collar +イプシロンの首輪 +A collar reserved for the most prestigious of submissives. +最高級のマゾにのみ支給される首輪。 +Restores mana when you play with yourself, but increases the distraction given. Only works when Desire is below the limit. +自慰をするとマナが回復するが、興奮値が追加で上昇する。欲望が99%以下のときのみ効果を発揮する。 + + +Bullet Hell +シューティング +Hides warning lines for non-AoE bullets and projectiles. +範囲攻撃以外の遠距離攻撃の警告線が表示されなくなる +Bullet Armageddon +弾幕シューティング +Hides warning lines for AoE spells, bullets, and projectiles. +範囲攻撃と遠距離攻撃の警告線が表示されなくなる + + I have... needs -私には…ニーズがあります +ちょっと……ほしい Distraction builds up over time. -気晴らしは時間の経過とともに蓄積されます。 +ターン毎に興奮値が上昇するようになる + + Hopeless 絶望的 Willpower decays over time. -意志力は時間の経過とともに減衰します。 +ターン毎に気力が低下する + + Quickness -素早さ +縮地 Grants Quickness after not moving for 4 turns. Quickness lets you move 1 space without ticking the clock. -4 ターン移動しないと、クイックネスが付与されます。クイックネスにより、時計を刻むことなく 1 スペース移動できます。 +4ターン移動しなかった場合、次の移動にターンを消費しない + + Expansive Halls -広大なホール -Increases the size of maps by 1 in each direction. -各方向にマップのサイズを 1 ずつ増やします。 +広大な迷路 +Increases the size of maps by 3 in the long dimension. Maps will be less dense. +マップが広くなり、代わりに密度が低くなる Gargantuan Halls -ガルガンチュアンホール -Increases the size of maps by 2 in each direction. -マップのサイズを各方向に 2 ずつ増やします。 +壮大な迷路 +Increases the size of maps by 6 in the long dimension. Maps will have a mix of tunnels and dead ends. +マップが更に広くなり、トンネルと行き止まりが増える Labyrinthine Halls -迷宮ホール -Increases the size of maps by 3 in each direction. -マップのサイズを各方向に 3 ずつ増やします。 +真の迷路 +Increases the size of maps by 9 in the long dimension. Maps will be mostly tunnels. +マップが更に更に広くなり、トンネルがとても増える +Absurdly Huge Maps +やりすぎた迷路 +(Experimental) Make the maps really really big. Probably breaks the game. +(試験段階)マップがやばいくらい広くなる。不具合が起きる可能性あり。 + + Rigger リガー -Chain and glue damage increased by 20%. Binding on enemies is 30% stronger. -チェーンと接着剤のダメージが 20% 増加しました。敵へのバインディングが 30% 強化されました。 +Binding on enemies is 30% stronger. +敵への拘束ダメージが30%増加する Pacifist -平和主義者 -All non-glue, non-chain, or non-teasing damage dealt to humanoid enemies is reduced by 90%. -ヒューマノイドの敵に与えられるすべての非グルー、非チェーン、または非からかいのダメージは90%減少します。 +平和主義 +All damage dealt to humanoid enemies is reduced by 90% except teasing damage and pain/grope/tickle/charm/psychic/chain/glue. +人型の敵に攻撃する際、焦らし、苦痛、愛撫、くすぐり、魅了、精神、チェーン、ネバネバ属性以外の攻撃は90%軽減される +Curse Seeker +呪いの探求者 +When you pick up cursed armor or restraints from chests, they equip automatically if able. +呪われた装備を宝箱から発見した際、可能であれば自動で装備する + + Burning Desire -強い願望 -While above 70% distraction, you ignite nearby objects and gain +40% fire damage. -注意散漫が 70% を超えると、近くのオブジェクトに点火し、+40% の火ダメージを獲得します。 +燃える欲望 +While above 70% distraction, you ignite nearby objects and gain +25% fire damage. +興奮値が70%以上の場合、近くのオブジェクトが点火し、火属性ダメージが25%上昇する Frigid Personality -冷淡な性格 -While at 0% distraction, you gain +10% ice damage and can walk on ice without penalties. -気晴らしが 0% の間、+10% の氷ダメージを獲得し、ペナルティなしで氷の上を歩くことができます。 +冷酷な心 +While below 10% distraction, you gain +10% ice damage and can walk on ice without penalties. +興奮値が10%以下の場合、氷の上を歩く際のペナルティがなくなり、氷属性ダメージが10%上昇する + + Grounded in Reality -現実に根ざす +現界に轟く稲妻 While at max mana, your attacks deal an additional 30% of their base damage as electric damage. -最大マナの間、あなたの攻撃は基本ダメージの 30% を電気ダメージとして追加で与えます。 +マナが最大の場合、攻撃時に追加で基礎ダメージ値の30%の電気属性ダメージを与える Like the Wind -風のように +疾きこと風の如く While above 95% stamina, you gain +30 Evasion and your slow level is reduced by 1. -スタミナが 95% を超えている間、+30 回避を獲得し、スロー レベルが 1 減少します。 +スタミナが95%以上の時、回避力が30上昇し、減速状態である場合、それを1軽減する + + Immovable Object -不動の物体 -While above 90% willpower, you gain +150 Restraint Block and Earth buff spells cost half mana. -意志力が 90% を超えている間、+150 拘束防御を獲得し、地球バフ スペルのマナ コストは半分になります。 +不退転 +While above 90% willpower, you gain +150 Bondage Resist and Earth buff spells cost half mana. +気力が90%以上の場合、拘束耐性が150上昇し、地属性のバフ魔法のコストが半減する Path of Least Resistance -抵抗の少ない道 -While at 0 willpower, you gain +35 Evasion and deal 20% of your max willpower as acid damage when restrained. -意志力が0の場合、回避+35を獲得し、拘束されたときに最大意志力の20%を酸ダメージとして与える. +明鏡止水 +While at 0 WP, you gain +35 Evasion and deal 20% of your max WP as soap damage when enemies restrain you. +気力が0の場合、回避力が35上昇し、拘束された際に最大気力の20%分のソープダメージを与える + + Sticky Situation -スティッキー・シチュエーション +ねばねば You take 40% more glue damage. -接着剤によるダメージが 40% 増加します。 +受けるねばねば属性のダメージが40%増加する Breathless 息切れ Taking chain, poison, and crush damage makes you dizzy. -チェイン、ポイズン、クラッシュダメージを受けるとめまいがする +毒、チェーン、打撃属性のダメージを受けた際、めまい状態になる + + + + Kinky Prisoner 変態囚人 -Guards never remove restraints you are already wearing, unless they are applying something tighter. -警備員は、よりきついものを適用しない限り、すでに着用している拘束を決して外しません。 +Guards won't remove restraints unless they have something tighter. +10 Security level. +収監された際、看守がより高度な拘束具を所持している場合を除き、拘束具を交換されなくなる。手配度+10 + + Unfair Doors 不公平な扉 Doors are harder to open while your hands are bound. -手を縛られていると、ドアが開けにくくなります。 +手を縛られている場合、ドアを開けるのが難しくなる You rattle the doorknob uselessly and end up banging on the door. -無駄にドアノブをガタガタ鳴らして、ドアを叩いてしまう +ドアを開けようとするも、ガタガタと騒音を出しただけだった。 You can't quite get a grip on the doorknob. -あなたはドアノブをしっかりと握ることができません。 +ドアノブを上手く握れなかった。 Someone hears you banging and opens the door from the other side! -誰かがあなたがドアを叩いているのを聞いて、反対側からドアを開けます! +ドアが叩かれているのを聞いて、誰かが反対側からドアを開けた。 Someone notices you fiddling with the door and opens it from the other side! -あなたがドアをいじっているのに気づいて、反対側からドアを開けてしまった! +ドアがいじられているのを聞いて、誰かが反対側からドアを開けた。 The door squeaks open as the latch wasn't fully engaged. -ラッチが完全にかみ合っていないため、ドアがきしむ音を立てて開きます。 +建付けの悪いドアが軋みながら開く。 You grab the doorknob with your wrists and flex it open. -手首でドアノブをつかみ、曲げて開けます。 +手首でなんとかドアノブをひねり、ドアを開ける。 You use your flexible feet to open the door. -柔軟な足を使ってドアを開けます。 +柔軟な足でドアを開けた。 + + Poor Technique -下手な技 +へたくそ Instead of fizzling, most miscasted projectiles and AoE spells will target you instead. -フィズリングの代わりに、ほとんどのミスキャストされた発射体と AoE スペルが代わりにあなたをターゲットにします。 +詠唱に失敗した際、発射体と範囲指定が自身を巻き込むようになる + + + + + + Ticklish くすぐったい You take 50% more tickle damage. -くすぐりダメージが 50% 増加します。 +受けるくすぐり属性のダメージが50%増加する Stoic ストイック -You gain 82% tickle resist. -あなたは82%のくすぐり耐性を獲得します。 +You gain +82 tickle resist. +くすぐり属性の耐性が82増加する + + Lascivious -スケベ +むっつり You take 50% more grope damage. -手探りダメージが 50% 増加します。 +受ける愛撫属性のダメージが50%増加する Unperturbed -動じない -You gain 82% grope resist. -82% の模索耐性を獲得します。 +不感症 +You gain +82 grope resist. +愛撫属性の耐性が82増加する + + Masochist マゾ Pain is strongly arousing. -痛みは強く刺激されます。 +受ける苦痛属性のダメージが増加する Pain Tolerance -痛み耐性 -You gain 200% pain resist. -あなたは200%の痛み耐性を獲得します。 +苦痛耐性 +You gain +200 pain resist. +苦痛属性の耐性が200増加する + + Fashionable おしゃれ When you are jailed, you keep your outfit. -投獄されたとき、あなたは服を着たままです。 +投獄された際、服がそのままになる + + Futile Struggles -無駄な闘争 +空回り Lose 2 WP every time you remove a non-trivial restraint. -重要な拘束を解除するたびに 2 WP を失います。 +特定の拘束を解除する度に、気力が2ポイント低下する + + Second Wind セカンドウィンド -Gain 2 WP every time you remove a non-trivial restraint. Destroys restraints on removal. -重要な拘束を解除するたびに 2 WP を獲得します。解除時に拘束を破壊します。 +Regenerate WP when unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, gag, or slows. (Upgrade available in spell tree) +手、腕、足のいずれも縛られておらず、猿轡、目隠しを装備しておらず、減速効果を受けていない時、気力が最大値の10%までゆっくり回復する(スキルツリーにてアップグレード可能) +Second Wind Perk +セカンドウィンド(パーク) +Regenerate WP when you are unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, or gag bondage, and no slows. +手、腕、足のいずれも縛られておらず、猿轡、目隠しを装備しておらず、減速効果を受けていない時、気力が最大値の10%までゆっくり回復する +Triumphant Wind +勝利の風 +Second Wind now regenerates up to 25% of your max WP +パーク「セカンドウィンド」の回復量が気力最大値の25%までになる +### Mental Defiance + +### Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While below 25% WP, quickly convert 'Defiance' into WP. + +### Mental Fortitude + +### Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While above 75% WP but below 100%, quickly convert 'Defiance' into WP. Exclusive with Mental Defiance. + + + +Locked Up +閉鎖 +While wearing a chastity belt, your Desire lowers when you perform actions such as defeating enemies, opening chests, and breaking orbs. (Upgrades available in spell tree) +貞操帯を装備した状態で、敵を倒す、宝箱を開ける、オーブを割るなどのアクションを行うと、興奮値が下がる(スキルツリーにてアップグレード可能) +Locked Up Perk +閉鎖(パーク) +While wearing a chastity belt, your Desire lowers when you perform actions such as capturing, opening chests, and breaking orbs. +貞操帯を装備した状態で、敵を倒す、宝箱を開ける、オーブを割るなどのアクションを行うと、興奮値が下がる +Controlled Urges +衝動の制御 +Locked Up is 150% effective. Gain +70 psychic/charm resist from a chastity belt and +30 from a chastity bra. While not wearing a chastity belt, your Desire increases slowly. +パーク「閉鎖」の効果が150%になる。貞操帯を装備時、70の物理/魅了耐性を得る。貞操ブラを装備時は左記の耐性を30得る。貞操帯を装備していない時、興奮値がゆっくりと上昇する +Ready for Training +準備万端 +Locked Up is 200% effective. +25% stamina regen per 100 current DP. Playing with yourself is less effective while vibrators are off or set to edge. Slow level is increased by 1 when you aren't wearing any chastity. +パーク「閉鎖」の効果が200%になる。DP100につきスタミナの自然回復量が25%上昇する。プラグの電源がオフ、または焦らしモードに設定されている時、自慰の効果が減少する。貞操帯を装備していない時、減速値を1得る。 +Efficient Denial +絶頂拒否 +Locked Up is 300% effective. When Locked Up triggers, you gain -30% mana costs and +25% physical damage for 7 turns (35 when opening a chest or breaking orbs). You cannot orgasm unless you are wearing a chastity belt, and slow level is increased by 2. +パーク「閉鎖」の効果が300%になる。左記パークの効果が発動した時、7ターンの間(宝箱を開ける、オーブ破壊は35ターン)魔法のマナコスト-30%、物理ダメージ+25%。貞操帯を装備していない時は絶頂できず、減速値を2得る。 +Recalcitrant +非服従 +Relinquish the Locked Up perk. One time only. If you take the perk again, there is no going back. +パーク「閉鎖」を放棄する。一度のみ選択可能。再びパークを取得した場合、後戻りはできない + + +Novice Pet +新参ペット +You can now sprint while wearing a petsuit. (Upgrades available in spell tree) +ペットスーツを装備していても走ることができる(スキルツリーにてアップグレード可能) +Novice Pet Training +新参ペットの訓練 +You can now sprint while wearing a petsuit. +ペットスーツを装備していても走ることができる +Eager Pet +賢いペット ++1 slow reduction while wearing a petsuit, but sprint costs are increased by 30% when not wearing a petsuit. +ペットスーツ着用時、減速値が1軽減される。ペットスーツ非着用時、走りのスタミナコストが30%増加 +Experienced Pet +ベテランペット ++2 slow reduction total while wearing a petsuit (from +1), but sprint costs are increased by 100% (from 30%) when not wearing a petsuit and slow level is increased by +1. +ペットスーツ着用時、減速値が2軽減される。ペットスーツ非着用時、走りのスタミナコストが100%増加し、減速値が1増加する。 +Devoted Pet +献身的なペット ++3 slow reduction total while wearing a petsuit (from +2), but you cannot sprint (from +100% cost) when not wearing a petsuit and slow level is increased by +2 (from +1). +ペットスーツ着用時、減速値が3軽減される。ペットスーツ非着用時、走れなくなり、減速値が2増加する。 +Bad Pet +悪いペット +Relinquish the Novice Pet perk. One time only. If you take the perk again, there is no going back. +パーク「新参ペット」を放棄する。一度のみ選択可能。再びパークを取得した場合、後戻りはできない +You are an expert in wearing a petsuit and your mobility is increased. +ペットスーツの扱いに熟練しており、素早く移動できる。 +You are too used to wearing petsuits! Sprinting is impaired. +ペットスーツの動きに慣れすぎて走れない。 +You are a disobedient pet. You should put on a petsuit! +悪い子だ。ペットはペットスーツを着るべきだ。 + + Dominant -支配的 +ドミナント They're trapped here with you. Ghosts are more helpful, and you can bind enemies that confront you about bondage. -彼らはあなたと一緒にここに閉じ込められています。幽霊はより役に立ち、束縛についてあなたに立ち向かう敵を縛ることができます。 +幽霊が協力的になる + + Stranger -知らない人 +風来坊 Randomizes your relationship to most factions. -ほとんどの派閥との関係をランダム化します。 +ゲーム開始時、ほとんどの勢力との関係をランダムに設定する Wrong Neighborhood -間違った近所 +ここに来るべきじゃなかった All factions are hostile and united against you. -すべての派閥は敵対的であり、あなたに対して団結しています。 +ゲーム開始時、ほとんどの勢力との関係が0になり、勢力が互いに協力し合う +Bandit +盗賊 +Start friendly to bandits, and hostile to most other factions. +ゲーム開始時、盗賊と友好的になる。代わりに他の勢力と敵対状態になる。 + + Trespasser 侵入者 You lose reputation with the goddesses every time you advance a floor. -階層を進めるごとに女神の評判が落ちます。 +階層を下る際、女神との関係性が低下する + + Prisoner 囚人 Start the game as a submissive prisoner wandering the halls. -ホールをうろつく従順な囚人としてゲームを開始します。 +囚人としてゲームを開始する + + Rusty Bolts 錆びたボルト -Most traps have a 25% misfire chance. -ほとんどのトラップは 25% の不発確率があります。 +Most traps have a 25% misfire chance each time you step on them. +ほとんどのトラップが25%の確率で不発になる + + +Not a Pet +ペットじゃない +Petsuits occur less often. +ペットスーツの出現率が減少する。 Unmasked -マスクされていない -Hoods and full-face covering masks do not appear, but blindfolds are more powerful. -フードと顔全体を覆うマスクは登場しませんが、目隠しはより強力です。 +マスク嫌い +Hoods and full-face covering masks do not appear, but blindfolds are more powerful. Does not include kigurumi masks. +怪しいマスクを除く、フードとマスクがゲーム内に登場しなくなる。目隠しがより強力になる。 +No Kigurumi Masks +怪しいマスクなし +Removes face-mimicking masks from the game. +怪しいマスクがゲーム内に登場しなくなる。 +No Hoods +フードなし +Removes hoods from the game. +フード系の拘束具がゲーム内に登場しなくなる。 +No Sense Deprivation +視界良好 +Removes sensory deprivation hood/mask from the game. +視界を遮るフードやマスクがゲーム内に登場しなくなる。 Blackout ブラックアウト Blindfolds are stronger. While blindfolded you can only see enemies next to you. -目隠しはより強力です。目隠しをしている間は、隣の敵しか見ることができません。 +目隠し装備時、隣の敵以外の敵を視認できなくなる +No Blindfolds +目隠しなし +In most cases you will not get blindfolded, except for cloth blindfolds which can be escaped easily. +目隠しを取り付けられることがほぼ無くなる。布の目隠しから抜け出しやすくなる。 + + Total Blackout -完全停電 -Blindfolds are extremely punishing and you can't see explored areas while blindfolded. -目隠しは非常に苦痛であり、目隠しをしている間は探検エリアを見ることができません。 +完全ブラックアウト +### Blindfolds are extremely punishing. + +Poor Vision +目が悪い +Vision radius is significantly reduced. +見える範囲が狭くなる +Keen Hearing +鋭敏な聴覚 +You can more easily hear enemies and their movements through walls. +聞こえる範囲が広くなり、壁越しにも音を察知できるようになる +Archer's Eye +射手の目 ++2 vision radius. +見える範囲が+2される +Night Owl +フクロウの目 +Your vision in dark areas is improved. +暗いエリアでも見えやすくなる +Fear of the Dark +暗所恐怖症 +Your vision in dark areas is reduced. +暗闇にいる時、視界範囲が狭くなる + + +Mutually Assured Darkness +晦冥 +Darkness is twice as effective in hiding from enemies, but your night vision is also reduced. +暗闇にいる時の隠密効果が2倍になるが、視力も低下する +Stalker +ナイトストーカー +Darkness is twice as effective in hiding from enemies. +暗闇にいる時の隠密効果が2倍になる + + Not a Doll 人形じゃない You may still enter Doll Terminals, but enemies will not force you onto doll stands. -人形端末に入ることはできますが、敵に強制的に人形台に乗せられることはありません。 +強制的に人形台に載せられることがなくなる No Nurses -看護師はいらない +ナースなし Nurses will not appear in the game. -看護師はゲームに登場しません。 +ナースがゲームに登場しなくなる +No Police +警察なし +Police-based bounty hunters will not appear in the game. +警察系の賞金稼ぎがゲームに登場しなくなる No Brats -ノーブラッツ +逆らうな Submissive enemies won't run away from you. -従順な敵はあなたから逃げません。 +従順な敵が逃げなくなる Brats Only -ガキのみ +反逆祭り Submissive enemies will always be bratty and force you to catch them. -従順な敵は常に無愛想で、捕まえることを強いられます。 +従順な敵が常に逃げるようになる + + More Tape -もっとテープ +テープ増量 Tape-wielding enemies (such as Tape Bots) occur more frequently. -テープを使用する敵 (テープボットなど) がより頻繁に発生します。 +テープを使用する敵が出現する確率が上昇する Less Tape -少ないテープ +テープ減少 Fewer tape-related enemies will appear, although this does not remove tape entirely. -テープ関連の敵の出現は少なくなりますが、これでテープが完全に除去されるわけではありません。 +テープを使用する敵が出現する確率が低下する + + +No Tape Bots +テープボットなし +The old civilization did not use tape-based restraints in their capture robots. +旧文明のロボットがテープ系の拘束を使わなくなる +Less Cable Bots +ケーブルボット減少 +The old civilization used significantly less cable-based restraints in their capture robots. +旧文明のロボットがケーブル系の拘束を使用しにくくなる +No Resin Bots +樹脂拘束なし +The old civilization did not use crystal resin-based restraints in their capture robots. +旧文明のロボットが樹脂拘束を使用しなくなる +Lexx Latex Bots +ラテックスボット嫌い +The old civilization used significantly less latex-based restraints in their capture robots. +旧文明のロボットがゴム系の拘束を使用しにくくなる + + +More Encasement +固め増加 +Enemies that encase you (e.g slimes, latex cubes) will appear more frequently. +敵が固め系の拘束をより使用するようになる +Less Encasement +固め減少 +Fewer encasement-related enemies will appear, although this does not remove them entirely. +敵が固め系の拘束を使用しにくくなる + + +More Bubbles +泡増加 +Enemies that use bubbles (e.g. aqua slimes, water witches) will appear more frequently. +泡系の拘束を使用する敵(泡の魔女や水スライム等)が出現しやすくなる。 +Less Bubbles +泡減少 +Fewer bubble-related enemies will appear, although this does not remove them entirely. +泡系の拘束を使用する敵が出現しにくくなる。完全にはいなくならない。 + + + + Trainee -研修生 -Your training has given you access to the spells of the Trainee class. (Aroused mode only) -あなたの訓練により、訓練生クラスの呪文へのアクセスが可能になりました。(覚醒モードのみ) -Warrior +ペット +Your training has given you access to the powers of the Trainee class. (Aroused mode only) +ペットクラスのスキルが使用できるようになる +Fighter 戦士 -Your training has given you access to the spells of the Warrior class. -あなたの訓練により、あなたは戦士クラスの呪文にアクセスできるようになりました。 +Your training has given you access to the powers of the Fighter class. +戦士クラスのスキルが使用できるようになる Rogue -ローグ -Your training has given you access to the spells of the Rogue class. -あなたの訓練はローグクラスの呪文へのアクセスをあなたに与えました。 +盗賊 +Your training has given you access to the powers of the Rogue class. +盗賊クラスのスキルが使用できるようになる Wizard -ウィザード -Your training has given you access to the spells of the Wizard class. -あなたの訓練により、ウィザードクラスの呪文へのアクセスが可能になりました。 -Panic!!! -パニック!!! +魔術師 +Your training has given you access to the powers of the Wizard class. +魔術師クラスのスキルが使用できるようになる +Peasant +農民 +You possess the agricultural mastery of the Peasant class. +農作業に精通している + + +Panic! (Chests) +パニック(宝箱) +When you open a trapped chest, you are stunned for 2 turns. +罠付きの宝箱を開けた際、2ターンの間スタン状態になる + + +Panic! (Traps) +パニック(罠) When you step on a trap, you are stunned for 2 turns. -罠を踏むと2ターン気絶する +罠を踏んだ際、2ターンの間スタン状態になる Panic sets in! (Stunned 2 turns) -パニックに陥る! (気絶2ターン) +パニックになった!(2ターンのスタン) + + Butterfingers -バターフィンガーズ +不器用な手先 Having arms bound prevents you from using your hands to struggle or unlock yourself. -腕を縛られていると、手を使って苦労したり、ロックを解除したりすることができなくなります。 +腕を縛られている際、「もがく」と「解錠」の効果が減少する + + Weak Grip 握力が弱い Having arms bound prevents you from holding weapons or potions. -腕を縛られていると、武器やポーションを持つことができなくなります。 +腕を縛られている際、武器とポーションを使用できなくなる + + You kneel down so you can reach the potion with your mouth... -ポーションに口が届くようにひざまずきます... +跪いて地べたのポーションに口を近づける…… + + Can't Hear You! -聞こえない! +何言ってるの Being gagged blocks you from casting verbal spells regardless of gag power. -猿轡かませると、猿轡の力に関係なく、口頭の呪文を唱えることができなくなります。 -Unmasked -マスクされていない +猿轡をかまされている際、強度に関係なく口を使った魔法は使用できなくなる +Smooth Talker +饒舌 +Being gagged does not increase your miscast chance for verbal spells unless fully gagged, and reduces gag power by 20%. +猿轡をかまされても、厳重でない限り、口を使う魔法の詠唱失敗率が上昇しない。猿轡の効力が20%減少する + + Hoods and full-face covering masks do not appear, but blindfolds are more powerful. -フードと顔全体を覆うマスクは登場しませんが、目隠しはより強力です。 +フルフェイス系の拘束具が出現しなくなるが、目隠しはより強力になる + + Ball Gag Lover -ボールギャグラバー +ボールギャグ愛好家 Increase occurrence of ball gags, decrease occurrence of muzzles. -ボールギャグの発生を増やし、マズルの発生を減らす。 +ボールギャグの登場頻度が上がり、マズルの登場頻度が下がる Muzzle Lover -マズルラバー +マズル愛好家 Greatly increases the occurrence of muzzles. -マズルの発生が大幅に増加します。 +マズルギャグの登場頻度が大幅に上昇する + + Armbinder Lover -腕章の恋人 +アームバインダー愛好家 More armbinders, less straitjackets. -アームバインダーを増やし、拘束衣を減らします。 +アームバインダーの登場頻度が上がり、拘束衣の登場頻度が下がる + + Jacket Lover -ジャケットラバー +拘束衣愛好家 More straitjackets, less armbinders. -拘束衣を増やせばアームバインダーは減る -Maid Sweeper -メイドスイーパー -Start in a magically locked maid outfit. -魔法の鍵のかかったメイド服でスタート。 -Wolf Trainee -オオカミの訓練生 +拘束衣の登場頻度が上がり、アームバインダーの登場頻度が下がる + + + + +Maid Sweeper +お掃除メイド +Start in a magically locked maid outfit. +メイド服で拘束された状態でゲームを開始する +Wolf Trainee +オオカミのペット Start in a uniform of a naughty wolfgirl. -やんちゃなオオカミ少女の制服でスタート -Latex Doll -ラテックスドール -Start bound in latex restraints. -ラテックス拘束で縛り始めます。 -Iron Slave -鉄の奴隷 +オオカミ用スーツで拘束された状態でゲームを開始する +Latex Toy +ゴムのオモチャ +Start bound in lovely latex restraints. +ラブリーなラテックスで拘束された状態でゲームを開始する +Elemental Slave +精霊の奴隷 Start in a full set of magically locked obsidian cuffs. -魔法のようにロックされた黒曜石の袖口のフルセットから始めましょう。 +魔法の鍵が施された黒曜石の枷を装備してゲームを開始する + + Mana Burst マナバースト While at 100% distraction, you get -100% miscast chance but spending too much mana at once may cause you to go over the edge. -気晴らしが 100% の間、ミスキャストの可能性は -100% になりますが、一度に多くのマナを消費すると限界を超えてしまう可能性があります。 +興奮値が100%の場合、詠唱失敗率が100%減少する。一度に多くのマナを消費した場合、絶頂する可能性がある Arousing Magic -覚醒魔法 +えっちな魔法 Your magic is powered by otherworldly distracting energies. Casting spells increases distraction based on the mana spent. -あなたの魔法は、別世界の気を散らすエネルギーによって動かされています。呪文を唱えると、消費したマナに基づいて気晴らしが増加します。 +魔法を唱えた際、消費したマナに応じた興奮値を得る Clearheaded 明晰 Magic puts you in a clear state of mind. Casting spells successfully reduces your distraction. -魔法はあなたを明確な精神状態にします。呪文を唱えることで、気が散ることが減ります。 +魔法を唱えた際、興奮値が低下する + + +### Unidentified Wear + +### Enchanted (and cursed) wearables and weapons are unidentified until the item is used. + +### Unknown + Copy (clipboard) -コピー (クリップボード) +クリップボードにコピー Paste (clipboard) -貼り付け (クリップボード) +クリップボードを貼り付け + + DAMAGEDEALT electric damage conducts to you!!! -DAMAGEDEALT 電気ダメージがあなたに伝導します!!! +DAMAGEDEALT 電撃ダメージが体を駆け巡った! The pressure fans the flames on you, dealing bonus DAMAGEDEALT fire damage! -プレッシャーが炎を煽り、DAMAGEDEALT の炎ダメージを与えます! +火にあぶられ、DAMAGEDEALT の火ダメージを受けた! The RestraintName comes off more easily in the presence of water! -RestraintName は、水があるとより簡単に剥がれます。 -You slip on the ice! -あなたは氷の上を滑る! +RestraintName は、水を使用すると簡単に解除できる。 +You slip on the floor! +滑った! The air around you is ablaze! (-DamageDealt SP) -あなたの周りの空気は燃えています! (-DamageDealt SP) +周りの空気が燃え上がった! (-DamageDealt SP) The Goddess of Illusions shrouds you in shadows! -幻想の女神があなたを影で覆います! +幻惑の女神が作り出した霧があなたを包む。 You struggle against your bonds, but a magical force resists! -あなたは絆に抗うが、魔法の力が抵抗する! +いくらもがいても、魔法の力で抵抗される。 The ropes squeeze you tighter and tighter... -ロープはあなたをますますきつく締めます... +全身の縄がきつくしまっていく…… Your body sinks deeper into a sea of bindings... -あなたの体は、束縛の海に深く沈んでいきます... +全身が縄の海に沈んでいく…… You struggle to breath as you are buried alive in squirming ropes... -身もだえするロープに生き埋めにされて息苦しくなる... +生きたロープに埋もれて息苦しくなってくる…… +The slime stretches out over your body... +全身にスライムがまとわりついてきた…… +The slime continues to engulf you, blocking out your vision... +スライムに飲み込まれ、何も見えない…… +The slime starts to harden, sealing you inside a rubbery prison... +全身のスライムが固くなり、ゴムの牢獄に閉じ込められた…… You feel a force compelling you to stop resisting... -あなたは抵抗をやめさせようとする力を感じます... +抵抗力を奪う力を感じる…… Your body struggles to move as you feel a power sealing you! -あなたを封じ込める力を感じると、あなたの体は動くのに苦労します! +封印の力で上手にもがくことができない…… The sarcophagus' door slides open as you are slowly pulled inside... -石棺のドアがスライドして開き、ゆっくりと引き込まれます... -The hands squeeze you tightly... -手がぎゅっと握る… -More hands clasp over your body... -もっと手で体を包み込んで…… +棺桶のフタが開き、ゆっくりと中に引きずり込まれる…… +The hands squeeze you tightly as a shadowy portal appears... +影をまとったポータルから大量の手が纏わりついてきた…… +More hands clasp over your body as they pull you toward the portal... +更に纏わりつく手が増え、ポータルに引きずり込まれる…… You struggle to breath as you are pulled into the mass of shadow hands... -あなたは影の手の塊に引き込まれ、息をするのに苦労します... +影の手の中に引きずり込まれて息をするのもやっとの状態になる…… The world goes dark... -世界が暗くなる… +意識が途切れる…… You wake up in a different place... -目が覚めたら別の場所で… +知らない場所で目を覚ました…… + + Arcane Explosion アーケイン・エクスプロージョン + + EnemyName says something incomprehensible! Her spell miscasts! -EnemyName が意味不明なことを言っています! 彼女の呪文は間違っています! +EnemyName が何かを唱えたが、失敗したようだ。 EnemyName fumbles her next move! -EnemyName は彼女の次の動きを失敗させます! +EnemyName は失敗した。 The EnemyName utters a command word on the TargetName! -EnemyName は TargetName でコマンド ワードを発します! +EnemyName は TargetName にコマンドワードを放った! + + Nipples 乳首 Breasts 胸 Panties -パンティー +パンツ Front 正面 Rear 後方 Feet -フィート +足 Everywhere! どこにでも! -Physical Armor: -物理アーマー: -Magic Armor: -マジックアーマー: + + +Physical Armor: +物理アーマー: +Magic Armor: +マジックアーマー: In the Shadows: You are harder to see. -In the Shadows: 見えにくくなっています。 +影の中にいる:見つかりにくい Invisible: You are very difficult to see. -見えない:あなたはとても見えにくいです。 +透明:とても見つかりにくい Quickness: Your next movement is so fast it doesn't advance a turn. -素早さ:次の動きが速すぎて手番が進まない。 -All Damage Reduction: -全ダメージ軽減: +加速:次の移動にターンを消費しない +All Damage Reduction: +全ダメージ軽減: You take PERCENT1 DAMAGETYPE damage, based on PERCENT2 DAMAGETYPE resist and PERCENT3 DAMAGECATEGORY modifier. -PERCENT2 DAMAGETYPE 耐性と PERCENT3 DAMAGECATEGORY 修正値に基づいて、PERCENT1 DAMAGETYPE ダメージを受けます。 +PERCENT2 DAMAGETYPE 属性耐性と PERCENT3 DAMAGECATEGORY 修正値に基づいて、PERCENT1 DAMAGETYPE 属性ダメージを受ける You deal PERCENT more DAMAGETYPE damage. -DAMAGETYPE のダメージが PERCENT 増加します。 +DAMAGETYPE のダメージが PERCENT 増加する Your bindings are PERCENT more effective. -あなたのバインディングは PERCENT より効果的です。 -Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage. -あなたの攻撃は DAMAGEDEALT DAMAGETYPE の基本ダメージを与えます。 +拘束は PERCENT 効果的 +Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage, for a stamina cost of STMNA. +攻撃で DAMAGEDEALT DAMAGETYPE 属性の基本ダメージを与え、 STMNA のスタミナを消費する Plugged! -詰まった! +挿入されている! Plugged up!!! -詰まった!!! +挿入されている!! Denied! You won't be getting off that easy~ -断った!そう簡単にはいかないだろうな~ +焦らし中…… Teasing vibrations... -からかう振動… +ゆっくりと振動している…… Gentle vibrations... -優しい振動… +やさしく振動している…… Mild vibrations... -微振動… +マイルドに振動している…… Strong vibrations! -強い振動! +強く振動している! Intense vibrations!! -激しい振動!! +激しく振動している! Torturous vibrations!!! -拷問の振動!!! +激しく暴れ回っている! + + +Your restraints are restrictive! Struggling is less effective without help. +拘束具によって動きが制限されている。手助けがなければ、もがいても効果が薄い。 Stunned! You can't move! -ビックリ!動けない! +スタン状態。動くことができない。 Your vision is impaired! -視界が悪い! +目が見えない Arms are bound! -腕が縛られている! +腕が縛られている Hands are useless! -手がだめだ! +手が使えない Hands are impaired! Some tasks will be harder... -手が不自由!作業が難しくなる… -Movement significantly impaired! -動きが著しく損なわれている! -Movement slightly impaired. -動きが少し鈍い。 -Movement severely impaired! -運動障害がひどい! -Immobilized! -動けなくなった! +手が上手く使えない。いくつかの行動にペナルティを得る +Slow Level 2: Movement significantly impaired! +減速2:動きが鈍い +Slow Level 1: Movement slightly impaired. +減速1:動きが少し鈍い +Slow Level 3: Movement severely impaired! +減速3:動きがとても鈍い +Slow Level 4+: Movement is almost impossible. Sprinting and hopping are disabled. +減速4:移動がほぼ不可能。走り、飛び跳ねが使用不可能。 +Slow Level 10+: Immobilized! +減速10+:動けない! Your mouth is free for potion-drinking and spellcasting activities. -あなたの口はポーションを飲んだり呪文を唱えたりするのに自由です。 +口は拘束されていない Your vision is clear. -あなたのビジョンは明確です。 +視界良好 Your hands are unobstructed. -あなたの手はふさがれていません。 +手は拘束されていない Your arms are free to move as you please. -腕は自由に動かせます。 +腕は拘束されていない Your legs are free and unimpeded. -あなたの足は自由で妨げられていません。 +足は拘束されていない You are gagged! Verbal miscast chance is increased and your potions are less effective! -あなたは猿轡かませられました! 言葉のミスキャストの可能性が増加し、ポーションの効果が低下します! +猿轡をかまされている。口を使う魔法は詠唱失敗率が増加し、ポーションを上手に飲めないため効果が減少する Your mouth is totally filled! You can't drink potions and cant cast verbal spells! -お口いっぱいですよ! ポーションも飲めないし、ミスキャスト率も高いですよ! +口に詰め物が詰まっている。ポーションは飲めないし詠唱失敗率は更に上昇する + + Spell Empowerment! -魔法強化! +魔法強化 + + Let there be light! 光あれ! + + You're seeing things... あなたは物事を見ている... + + You've been poisoned! -あなたは毒殺された! +毒に侵された! + + -50% MP Cost (Latex) MP消費-50%(ラテックス) -50% MP Cost (Leather) -MP消費-50%(レザー) +MP消費-50%(革) -50% MP Cost (Metal) -MP消費-50%(メタル) +MP消費-50%(金属) -50% MP Cost (Rope) -MP消費-50%(ロープ) +MP消費-50%(縄) Regeneration 再生 -50% MP Cost (Elements) -MP消費-50%(属性) +MP消費-50%(エレメント) -50% MP Cost (Conjuration) MP消費-50%(召喚) -50% MP Cost (Illusion) -MP消費-50%(イリュージョン) +MP消費-50%(幻惑) + + Conductive: When you or an enemy takes electric damage, the other takes half of it as well! -伝導:自分か敵が電撃ダメージを受けると、相手も半分受ける! +電導:自分か敵が電撃ダメージを受けた際、半分のダメージを相手に与える Lightning Rod: Gain significantly boosted electric resist. -ライトニングロッド:電気抵抗が大幅に増加します。 -Drenched: Grants fire resist, ice weakness, and makes you conductive. -びしょぬれ:火耐性、氷弱化を付与し、導電性にします。 +避雷針:電気属性への抵抗が大幅に増加する +Drenched: Grants fire resist, ice/electric weakness, and makes you conductive. +びしょぬれ:火耐性、氷弱点、電気弱点を付与し、電導体質になる + + Chilled: The cold makes it hard to move! You are slowed. -チルド: 寒さで動きにくくなっています! 動きが鈍くなっています。 +凍えている: 寒さで動きが鈍くなっている Slimed: It's sticky and dense! You are slowed and 30% more vulnerable to glue damage. -Slimed: 粘着性があり、密度が高いです。動きが遅くなり、接着剤によるダメージを受けやすくなります。 -Unsteady: You're on loose footing. You are easier to hit and are slowed. -ふらふら: 足場が緩い。攻撃を受けやすく、動きが鈍くなる。 +ねばねば: ねばねばが張り付いている。動きが鈍くなり、ねばねば属性のダメージが30%増加する Unsteady: You're on loose footing. You are easier to hit and are slowed. -ふらふら: 足場が緩い。攻撃を受けやすく、動きが鈍くなる。 +ふらふら: 足元がおぼつかない。動きが鈍くなり、回避力が低下する Ignore Ice Tiles 氷のタイルを無視 + + Ignited: You are dealing fire damage to yourself and nearby enemies! -点火: 自分と近くの敵に火のダメージを与えています! +着火: 自分と近くの敵に火のダメージを与える You are on fire and taking damage! -あなたは燃えていて、ダメージを受けています! -Arcane Power: Deals bonus damage when you hit an enemy. -アーケイン パワー: 敵に命中するとボーナス ダメージを与える。 -Arcane Protection: Reduces damage taken, and deals retaliation damage. -アーケイン・プロテクション:受けるダメージを軽減し、報復ダメージを与える。 -Arcane Cunning: You turn invisible briefly after attacking. -秘術の狡猾: 攻撃後、しばらく姿が見えなくなる。 +体が燃えている。ターン毎にダメージを受ける + + +Divine Punishment: Deals bonus damage when you hit an enemy. +神の力:攻撃が命中した際、追加でダメージを与える +Divine Protection: Automatically blocks the next 3 times an enemy tries to bind you. +神の加護:3回まで敵から受ける拘束を無効化する +Divine Cunning: You turn invisible briefly after attacking. +神の智慧:攻撃を行った際、透明になる + + -MP Cost (Fire) --消費MP(火) +MP消費低減(火) -MP Cost (Air) -・消費MP(空中) +MP消費低減(風) -MP Cost (Water) --消費MP(水) +MP消費低減(水) -MP Cost (Earth) -・消費MP(土) +MP消費低減(土) + + Slime Form: You gain bonuses and can slip through bars! -スライムフォーム: ボーナスを獲得し、バーをすり抜けることができます! +スライムフォーム: 柵をすり抜けることができる Shroud: Visibility decreased, evasion increased. -シュラウド:視認性低下、回避率上昇。 -Camoflage: While holding still, you are very hard to see. -カモフラージュ: じっとしていると、非常に見えにくい。 +霧纏い:敵から感知されにくくなり、回避力が増加する +Camoflage: While next to a wall, you are very hard to see. +カモフラージュ:壁と隣接している時、視認されにくくなる Stone Skin: Increased armor. -ストーンスキン:アーマーの増加。 +ストーンスキン:アーマー値が増加する Darkblade: Increased damage. -ダークブレード: ダメージ増加。 +ダークブレード:ダメージが増加する Runic Ward: Increased Magic Armor. -Runic Ward: 増加した魔法の鎧。 +ルーンワード: マジックアーマー値が増加する +Great Invisibility: It is impossible for enemies to see you. +完全透明:敵から視認されなくなる Invisibility: It is very difficult for enemies to see you. -不可視性:敵があなたを見るのは非常に困難です。 +不可視:非常に感知されにくくなる Lesser Invisibility: It is harder for enemies to see you. -不可視性が低い:敵があなたを見つけるのが難しくなります。 +半透明:感知されにくくなる FULL POWER: Cutting power increased. -FULL POWER:切削力がアップ。 +フルパワー:「切断」選択時にボーナス Graceful: Struggling power increased. -グレイスフル:闘争力アップ +グレイスフル:「もがく」選択時にボーナス Iron Blood: Reduced melee cost, increased mana costs. -Iron Blood: 近接コストを減らし、マナ コストを増やしました。 +アイアンブラッド: 近接攻撃のスタミナコストが低下し、マナコストが増加する Sleepy: You are sluggish and have a hard time keeping your eyes open. -眠い:動きが鈍く、目を開け続けるのに苦労しています。 +眠気:動きが鈍くなり、目を開けていられなくなる Afterimage: Evasion greatly increased. -残像:回避率大幅アップ。 -We did it! We made outselves invisible--mmmmph!!! -やりました!外見を見えなくしました--うーん!!! +残像:回避力が大幅に上昇する +We did it! We made ourselves invisible--mmmmph!!! +やった!透明になれ--むぐぅ! +You are not currently attempting to disguise yourself. Click to reenable. +変装していない。クリックで変装する。 Your restraints are disenchanted, treating them as nonmagical for purposes of cutting. -あなたの拘束具は幻滅されており、裁断目的では非魔法として扱われています。 +拘束具のエンチャントを無効化した。「切断」選択時に魔法で抵抗されない You can launch another leather restraint instantly! -すぐに別の革拘束を発射できます! -Your motivation is powerful enough your spells cannot be stopped! -あなたのモチベーションは十分に強力で、あなたの呪文を止めることはできません! -Locked Down: Struggling power is greatly reduced. -ロックダウン:闘争力が大幅に減少する。 +すぐに革の拘束具を発射できる +You can launch another Sagitta instantly! +「サジッタ」を再度使用可能 + + +### You have stored willpower. + +### You have consumed a mote of essence, granting miscast chance reduction. + +### You recapture an essence mote and concentrate on its essence! + +### Choose an essence mote to absorb. + Locked Down: Struggling power is greatly reduced. -ロックダウン:闘争力が大幅に減少する。 +ロックダウン:「もがく」選択時に大幅なペナルティ + + Verbose: You can cast verbal spells while gagged. -Verbose: 猿轡かませた状態で言葉の呪文を唱えることができます。 +バーボース: 猿轡をかまされた状態でも魔法を唱えられる Dextrous: You can cast arm spells while tied up. -デクストラス: 縛られている間、腕の呪文を唱えることができます。 +デクストラス: 腕を縛られていても魔法を唱えられる Spell Dance: You can cast leg spells while tied up. -スペルダンス:縛られた状態で足の魔法を唱えられる。 +スペルダンス:足を縛られていても魔法を唱えられる + + Bondage Buster: Lazor is charging... -ボンデージバスター:レイザー充電中… +ボンデージバスター:エネルギー充填中…… Katana: Patience is key... -カタナ:忍耐が鍵です... +刀:虎視眈々 Stormbreaker: You have the Power. -ストームブレイカー: あなたには力があります。 +ストームブレイカー: 大いなる力 + + Game Setup: ゲームのセットアップ: Beginner: Get a save code every 3 levels, autosave after each floor -初級:3レベルごとにセーブコードを取得、各フロアごとにオートセーブ +初級:3レベルごとにセーブコードが表示され、各フロアごとにオートセーブ Roguelike: No save codes, only autosave ローグライク: セーブ コードなし、自動保存のみ Exciting: Orbs give random spells -エキサイティング: オーブはランダムな呪文を与えます +エキサイティング: オーブを破壊した時に得られるスキルがランダムになる Kinky: No save codes, orbs give random spells, start with very little -Kinky: セーブ コードはありません。オーブはランダムな呪文を与えます。最初はごくわずかです -Log -ログ +Kinky: セーブ コードなし、オーブを破壊した時に得られるスキルがランダムになる + + +Journal +ノート + + Change Outfit -着替え -Reset Outfit -衣装リセット -Code -コード +着替える +Reset to Default +デフォルト衣装に戻す +Outfit Code +コードを使用 Confirm Reset? -リセットを確認しますか? -(Copy the code above and save it on your computer to load later) -(上のコードをコピーしてコンピューターに保存し、後で読み込むことができます) -You come across a black monolith with its face inscribed in runes. -顔にルーン文字が刻まれた黒い一枚岩に出くわします。 -You study them, but can't come up with an interpretation. -あなたはそれらを研究しますが、解釈を思い付くことができません。 -They may still prove useful to future adventurers should you get caught... -もしあなたが捕まったら、将来の冒険者に役立つかもしれません... -(Your game has been saved automatically, but you can save the code for later) -(ゲームは自動的に保存されましたが、後で使用するためにコードを保存できます) +リセットしてもよろしいですか? + + +(Your game has been saved) +ゲームをセーブしました +(Copy the code above and save it on your computer to backup) +バックアップコードを保存しておけば、「コードからロード」に入力することでこの場所から再開できます。 Continue... -続く... +進む…… + + Menu メニュー I will simply wait to see what happens. -何が起こるかをただ待つだけだ +何が起こるかをただ待つだけ Save my current progress. -現在の進行状況を保存します。 +現在の進行状況を保存する Give up & delete save あきらめてセーブを削除 Yes, delete my save file! -はい、セーブファイルを削除してください! +本当にセーブを消す Actually, I will let the enemy capture me instead. -本当は敵に捕らえさせてやる +投降する Yes, jail me! -はい、私を投獄してください! +降参して牢屋に行く No, I wish to press on -いいえ、押したいです +ゲームに戻る See Perks -特典を見る +パークを確認 + + This chest belongs to the FACTION -このチェストは FACTION のものです +このチェストは FACTION のものだ。 +This belongs to the FACTION +このチェストは FACTION のものだ。 + + Devious Dungeon Challenge is enabled. デビオスダンジョンチャレンジが有効になりました。 Waiting for game data... ゲームデータ待ち… -You have surrendered to the dungeon and become its prisoner. -あなたはダンジョンに降伏し、その囚人になりました。 -Day and night, you wait that rescue may come some day. -昼も夜も、いつの日か救助が来るのを待っている。 -Better luck next time! -次もよろしくね! + + + + + + You have reached the end of the playable portion. -再生可能な部分の最後に達しました。 +最下部に到着しました。 Come back later for new dungeons! -新しいダンジョンのために後で戻ってきてください! +また挑戦して下さいね! + + Got the keys! Find the stairs to go to the next floor. -鍵を手に入れた!次の階に行く階段を見つけます。 +次の階層へ行くための鍵を手に入れた! You haven't found the keys for this floor yet. -このフロアの鍵はまだ見つかっていません。 +次の階層へ行くための鍵を見つけていない Missing key -キーがありません -Chance for a spell to fizzle: -呪文が失敗する確率: -Dodge Chance: Percent%, based on EVASIONSUM Evasion, -EVASIONPENALTY penalty from bindings -Dodge Chance: Percent%、EVASIONSUM Evasion に基づく、バインディングからの -EVASIONPENALTY ペナルティ -Chance to block a level 10 restraint: Percent% -レベル10の拘束を封じる確率:%% +鍵がない +You are protected from damage and can't be bound until the shield is broken! +ダメージを受けず、拘束を受け付けない。 +Chance for a spell to fizzle: +魔法が効力を失う可能性: +Dodge Chance: Percent%, based on EVASIONSUM Evasion and EVASIONPENALTY% penalty. +回避率: Percent%。基礎回避率 EVASIONSUM に EVASIONPENALTY% のペナルティを受けている。 +Block Chance: Percent%, based on BLOCKSUM Block and BLOCKPENALTY% penalty. +ブロック率: Percent%。基礎ブロック率 BLOCKSUM に BLOCKPENALTY% のペナルティを受けている。 +Chance to resist a level 10 restraint: AMNT1%, based on AMNT2 Bondage Resist and RESBLKPENALTY penalty. +レベル10の拘束を封じる確率:AMNT1%。基礎拘束耐性 AMNT2 に RESBLKPENALTY のペナルティを受けている。 Sight Range: RADIUS -視界範囲:ラディウス +視界範囲:RADIUS Speed: SPD スピード:SPD Normal 普通 Stunned! -ビックリ! +スタン! Slowed -ゆっくり +遅い Very Slow 非常に遅い Immobile -不動 -SP: CURRENT/MAX -SP:現在/最大 +動けない +### DP: PERCENT% + +DP: CURRENT/MAX (PERCENT% Desire) +DP: CURRENT/MAX (欲情値 PERCENT%) +### SP: CURRENT/MAX + Willpower: CURRENT/MAX -気力:現在/MAX -MP: CURRENT/MAX -MP:現在/最大 +WP:CURRENT/MAX +### MP: CURRENT/MAX + Mana slowly recovers from a pool equal to POOLMANA. Drink potions to restore the pool. -マナはプールマナに等しいプールからゆっくりと回復します。プールを回復するにはポーションを飲みます。 -Your minimum distraction increases over time as you encounter distracting things. -気を散らすものに遭遇すると、時間の経過とともに最小限の気晴らしが増加します。 +マナはマナプールからゆっくりと補充される。ポーションを飲むことでマナプールの回復ができる +Your Desire is the baseline Distraction you decay toward, and is increased by distracting things. +欲望値はDPと連動して増減する。 Stamina recovers more quickly when you aren't spending it. -スタミナは、消費していないときの方が早く回復します。 +スタミナはじっとしていると早く回復する Willpower is restored by food, sleep, and potions. Without willpower, it becomes very difficult to escape. -意志力は、食事、睡眠、ポーションによって回復します。意志力がなければ、逃げるのは非常に困難になります。 +気力は、食事、睡眠、ポーションによって回復する。気力がないと、拘束を解くのが難しくなる Charge is used to power various magic items and weapons. -チャージは、さまざまな魔法のアイテムや武器に電力を供給するために使用されます。 -WP: CURRENT/MAX -WP:現在/最大 +チャージは、さまざまなマジックアイテムや武器に使用できる +### WP: CURRENT/MAX + Charge: PERCENT -料金: パーセント +チャージ: PERCENT Use Potion ポーションを使う - MP -MP +### MP + Go to sleep 寝る Call for help! -助けを呼びます! +助けを呼ぶ Play with yourself -自分で遊ぼう -Let go... -手放す... +オナニーする Let go... -手放す... -Play with yourself -自分で遊ぼう -Go to sleep -寝る -Make noise! -騒ぐ! +絶頂 + + +Call for Help!!! +助けを呼ぶ! Wait until interrupted -中断するまで待って +自動待機 Auto-struggle -自動闘争 +自動でもがく Auto-path -オートパス +1クリック移動 Quick-Swap Weapon -クイックスワップ武器 +クイックスワップ Inspect 調べる Pass NPCs -NPCを渡す -Close a Door -ドアを閉める +NPCを通り抜ける +Interact +インタラクト Sprint/Hop -スプリント/ホップ -Ahh! -ああ! -Mmm... -うーん... -Nnngh... -んんん… -Ooooh... -うわぁ… -(Breaths heavily) -(大きく息を吐く) -(Moans softly) -(小声で呻く) -(Incoherent mumbling) -(支離滅裂なつぶやき) -(Moans loudly) -(大声で呻く) +走る/跳ぶ +Crouch +しゃがむ + + +~ah~ +んっ…… +~mmm~ +うぅ…… +~ngh~ +んん…… +~oh~ +うっ…… (Heavy breathing) (荒い息遣い) -(Moaning uncontrollably) -(うめき声を抑えきれずに) -(Shudders with pleasure) -(喜びに身震いする) +(Soft moaning) +んんっ…… +(Incoherent mumbling) +(支離滅裂なつぶやき) +(Loud moans) +あぅ…… +(Deep breaths) +はぁ……はぁ…… +(Uncontrollable moaning) +あんっ…… +(Horny noises) +んんっ…… + + +~mm~ +んん…… +~mmph~ +むうぅ…… +~nnn~ +んぅぅ…… +~mmmmm~ +Mmmmmmmm... + + You wait. -あなたは待ちます。 +待機中…… You wait, legs trembling with arousal. -待てよ、興奮で足が震える +黙っていると、快楽で足が震えだした。 You wait, trembling and moaning. -待って、震えてうめいて +思わず喘ぎ声が出てしまった。 You wait to regain your strength. -あなたは力を取り戻すのを待っています。 +体力が戻るのを待っている。 You wait to regain your composure, panting with frustration. -あなたは落ち着きを取り戻すのを待ち、欲求不満で喘ぎます。 +快楽に悶えながら、落ち着くのを待つ。 You wait to regain your composure, shaking with frustration. -フラストレーションに震えながら、落ち着きを取り戻すのを待ちます。 +快楽に震えながら、落ち着くのを待つ。 You are exhausted from spellcasting. -あなたは魔法使いに疲れ果てています。 +魔法を唱え疲れた。 + + You are feeling tired. -あなたは疲れています。 +疲れている。 You feel exhausted... -お疲れ気味… +かなり疲れている…… You feel like you are going to pass out... -あなたは気絶しそうです... +今にも気絶しそう…… + + Start New Game -新しいゲームを開始 +ニューゲーム New Game+ ニューゲーム+ Continue Last Save -前回の保存を続行 -Load From Code -コードからロード -Save Outfit (overwrites!) -衣装を保存(上書き!) +最後のセーブデータをロード +Load Saved Game +ロード +Save Outfit (overwrite!) +衣装を上書き保存 +Save Outfit (Clothes Only!) +衣装をセーブ(衣装のみ) Save Keybindings -キーバインドを保存 +キー設定を保存 Cancel Changes -変更をキャンセル +キャンセル Return 戻る -Keybindings -キーバインディング Game Options -ゲームオプション +オプション + + Load from code コードから読み込む Back to main menu メインメニューに戻る -Load Mod -ロードモッド +Load Mod .zip +ZIPファイルからMODをロード Delete Mod -モードを削除 +MODを削除 Clear Perks -クリア特典 -Config -構成 +スキルをリセットする +Config +コンフィグ Cancel キャンセル Filter フィルター + + DANGER: Loading a mod will execute ARBITRARY CODE on your machine. 危険: MOD をロードすると、マシン上で ARBITRARY CODE が実行されます。 Like connecting to a server, etc. Only load mods from a TRUSTED source. サーバーなどに接続するようなものです。信頼できるソースからのモッドのみをロードしてください。 + + Up 上 Down @@ -1186,1082 +1954,1426 @@ Spell 6 スペル6 Spell 7 スペル7 +Spell 8 +スペル8 +Spell 9 +スペル9 +Spell 10 +スペル10 +Load Hotbar 1 +ホットバー1 +Load Hotbar 2 +ホットバー2 +Load Hotbar 3 +ホットバー3 +Load Loadout 1 +装備セット1 +Load Loadout 2 +装備セット2 +Load Loadout 3 +装備セット3 Cycle Spell Page -サイクル呪文ページ +サイクル魔法ページ Upcast Spells -アップキャスト呪文 +魔法強化 Cancel Upcast -アップキャストをキャンセル -Swap Weapon -武器を交換 -Ranged Attack -遠隔攻撃 +魔法強化をキャンセル +Swap Weapon 1 +武器切り替え1 +Swap Weapon 2 +武器切り替え2 +Swap Weapon 3 +武器切り替え3 +Swap Weapon 4 +武器切り替え4 +Weapon Ability +武器アビリティ Wait -待って +待機 Cancel/Back キャンセル/戻る Enter 入力 +Expand Minimap +ミニマップ拡大 +Zoom Out +縮小 +Zoom In +拡大 +Wait till Interrupted +何かあるまで待機 +Make Noise +音を立てる +Play with Self +自慰 + + Message Log メッセージログ -Close Door -ドアを閉める Pass thru allies 味方を通過 Auto-Struggle -自動闘争 +自動でもがく Auto-Pathfind -自動経路検索 -Sprint/Hop -スプリント/ホップ -Inspect -検査する +1クリック移動 +Hide Bullets +弾を隠す + + Quick Inventory クイックインベントリ Inventory -在庫 +インベントリ Reputation 評判 +### Journey Map + +Quests +クエスト Spell List スペル一覧 -Logbook -ログブック +Pause Menu +ポーズ +Facilities +設備 + + Current Key Pressed -現在押されているキー +現在押しているキー Press a key, then press a button to set that key キーを押してからボタンを押して、そのキーを設定します + + Floor FLOORNUMBER: DUNGEONNAME フロア FLOORNUMBER: DUNGEONNAME -Lockpicks: -ロックピック: -Keys: -キー: -Magic Keys: +Lockpicks: +ロックピック: +Keys: +鍵: +Magic Keys: 魔法の鍵: -Knife: +Knife: ナイフ: -Mag. Knife: -マグナイフ: +Mag. Knife: +魔法のナイフ: + + You climb down the stairs. The passage closes behind you. -あなたは階段を降ります。通路はあなたの後ろで閉じます。 +階段を下ると、後ろから扉が閉まる音が聞こえた。 +You climb back up the stairs. +階段を上った。 You can't climb down until you get out of this leash... -このリードを外すまで、降りることはできません... +リードを外すまで階段を下ることはできない…… You climb down and find yourself in a strange new place. -あなたは降りて、見知らぬ新しい場所にいることに気づきます。 +階段を下ると、奇妙な場所に出た + + plus XXX -プラスXXX ++ XXX + + Graveyard 墓地 Catacombs カタコンベ -Underground Jungle -地下ジャングル +Overgrown Ruins +苔むした遺跡 Lost Temple -失われた寺院 +秘匿された寺院 The Bellows -ふいご +"ふいご" Rundown Laboratory ランダウン研究所 Forgotten Garden 忘れられた庭 +Coastal Grotto +沿岸の洞窟 Kingdom of Ice 氷の王国 + + + + The Mansion -ザ・マンション +邸宅 + + Ancient Tombs -古代の墓 +遺跡 Magic Library 魔法図書館 Crystal Cave 水晶の洞窟 +### Cavern + Orrery オーラリー Training Center トレーニング・センター Rubber Facility -ゴム工場 +ラバー工場 Wizards' Den -魔法使いの巣窟 +魔法使いの館 Marble Halls マーブルホール Doll Storage -ドール収納 +ドール収納庫 + + +Processing +ドール工場 +Bandit Hideout +盗賊の隠れ家 +Ancient Vault +古代の宝物庫 +Ancient Halls +古代のホール +Slave Market +奴隷市場 +Elevator Hall +エレベーターホール +Dark Passageway +暗き通路 +Caldera Beach +カルデラ湖 +Temple of Air +風の神殿 +Temple of Fire +火の神殿 +Temple of Water +水の神殿 +Temple of Ice +氷の神殿 +Temple of Storms +嵐の神殿 +Temple of Earth +大地の神殿 +The Edge of Reality +果ての境界 +Dark Dimension +闇の次元 +### Lair + You search through the debris but find nothing of note -がれきの中を探しますが、注目すべきものは何も見つかりません +瓦礫をかき分けて役に立ちそうなものを探したが、何も見つからなかった。 You find some gold coins in a corner (+XXX gold) -隅にいくつかの金貨を見つけました (+XXX ゴールド) +隅にいくつかの金貨を見つけた (+XXX ゴールド) You find a lockpick in a crack between the tiles -タイルの隙間にロックピックを見つける +タイルの隙間にロックピックを見つけた。 You find a rusty knife among the rocks -岩の間から錆びたナイフを見つける +岩の間から錆びたナイフを見つけた。 You find an ordinary key -あなたは普通の鍵を見つけます +鍵を見つけた。 You find a blue key, glowing with magic -魔法で光る青い鍵を見つけた +魔法の鍵を見つけた。 You find a bola, crafted by bandits -山賊が作ったボラを見つけた +盗賊が作った投げ縄を見つけた。 You find some unexploded ordnance. -あなたは不発弾を見つけました。 +爆弾を見つけた。 + + You find a key lying atop an open tome! -開いた本の上に鍵が落ちているのを見つけた! +本の中から鍵が見つかった。 You find a magical key lying atop an open tome! -開いた本の上に魔法の鍵が落ちているのを見つけた! +本の中から魔法の鍵が見つかった。 You find a useful scroll wedged between some treatises! -いくつかの論文の間に挟まれた便利な巻物を見つけました! +論文の中に役立ちそうな巻物が挟まっていた。 You find a glowing book containing a binding spell! -束縛の呪文が書かれた光る本を発見! +本が光り、拘束の魔法が放たれた! + + +You discover a golden cookie, wrapped in foil. Beside it are two power crystals. +ホイルに包まれた金色のクッキーと、その横に黄金色の結晶を見つけた。 You find a golden key surrounded by strange golden crystals. -奇妙な金色の結晶に囲まれた金色の鍵を見つけます。 +奇妙な黄金色の結晶に囲まれた、金色の鍵を見つけた。 You find a set of strange golden crystals. -奇妙な金色の結晶のセットを見つけます。 +奇妙な黄金色の結晶を見つけた。 You find a pack of scrolls used for spellcasting, and some strange golden crystals. -あなたは呪文を唱えるために使われる巻物のパックと、いくつかの奇妙な金色の結晶を見つけます。 +役立ちそうな巻物と黄金色の結晶を見つけた。 You find a pack of scrolls used for spellcasting. -あなたは呪文詠唱に使われる巻物のパックを見つけました。 +役立ちそうな巻物をいくつか見つけた。 You find a glowing scroll of purity. -あなたは純潔の光る巻物を見つけました。 +純潔の巻物を見つけた。 + + The chest contains gold! (+XXX gold) -胸には金が入っています! (+XXX ゴールド) +宝箱にはゴールドが入っていた! (+XXX ゴールド) The chest contains a glowing magical knife! -胸には光る魔法のナイフが入っています! +宝箱には魔法のナイフが入っていた! The chest contains a keyring with a glowing magic key! -胸には魔法の鍵が光るキーホルダーが! +宝箱には魔法の鍵が入っていた! Someone left their keys here... -誰かが鍵をここに置き忘れた... +誰かが鍵をここでなくしたようだ…… You found some bolas left by bandits. -盗賊が残したボーラを見つけました。 +盗賊が残した投げ縄を見つけた。 You found some high explosives! -高性能爆薬を発見しました! +爆弾を見つけた。 You find a magic scroll, which you place in your spellbook. (+SpellLearned) -あなたは魔法の巻物を見つけて、それを魔法書に置きます。(+SpellLearned) +魔法を記した巻物を発見し、魔導書に書き写した (+SpellLearned) You find an orb containing magical knowledge! (+AMOUNT spell points) -魔法の知識が入ったオーブを見つけました! (+AMOUNT スペル ポイント) +魔法の知識が入ったオーブを見つけた (+AMOUNT スペル ポイント) You find a weapon! (+WeaponAcquired) -武器を見つけた! (+WeaponAcquired) +武器を見つけた (+WeaponAcquired) You find a wearable item! (+ArmorAcquired) -ウェアラブルアイテムを発見!(+ArmorAcquired) +装備アイテムを発見した (+ArmorAcquired) You find gold and a magic trap! (+RestraintType) (+XXX gold) -あなたは金と魔法の罠を見つけました! (+RestraintType) (+XXX ゴールド) +ゴールドを発見したが、魔法の罠が作動してしまった (+RestraintType) (+XXX ゴールド) Swirling belts emerge from the chest and leave you bound! (+RestraintType) -胸から渦巻くベルトが出てきて拘束!(+RestraintType) +宝箱から魔法のベルトが出てきた! (+RestraintType) You find gold and a chastity belt that locks around your waist! (+RestraintType) (+XXX gold) -あなたは金とあなたの腰の周りにロックする貞操帯を見つけます! (+RestraintType) (+XXX ゴールド) +ゴールドを発見したが、貞操帯の罠が作動してしまった (+RestraintType) (+XXX ゴールド) You find gold and a tormenting magical trap! (+RestraintType) (+XXX gold) -あなたは金と苦痛の魔法の罠を見つけました! (+RestraintType) (+XXX ゴールド) +ゴールドを発見したが、苦痛の罠が作動してしまった (+RestraintType) (+XXX ゴールド) You find gold, plus a filling and tormenting magical trap! (+RestraintType) (+XXX gold) -あなたは金に加えて、充填と拷問の魔法の罠を見つけました! (+RestraintType) (+XXX ゴールド) +ゴールドを発見したが、苦痛と充足の罠が作動してしまった (+RestraintType) (+XXX ゴールド) You find gold, plus a devious magical trap! (+RestraintType) (+XXX gold) -あなたは金と、よこしまな魔法の罠を見つけました! (+RestraintType) (+XXX ゴールド) +ゴールドを発見したが、えっちな罠が作動してしまった (+RestraintType) (+XXX ゴールド) Magical runes glow as a trap activates inside the chest! -胸の中でトラップが作動すると魔法のルーンが光る! +宝箱から魔法の罠が飛び出す! You find a special collar that lets you absorb energy from potions. -ポーションからエネルギーを吸収できる特別な首輪を見つけました。 +口が塞がっていてもポーションを使える首輪を発見した。 You find a pair of garish pink high heels with a slippery surface. -表面が滑りやすい派手なピンク色のハイヒールを見つけた。 +つるつるした派手なピンク色のハイヒールを見つけた。 +You find a special gag with a feather duster. +羽箒の付いた猿轡を見つけた。 +You find a gas mask suitable for filtering gases. +ガスマスクを見つけた。 The pearly chest contains a divine gift! (+ITEMGET) -真珠の胸には神聖な贈り物が含まれています! (+ITEMGET) +純白の宝箱から神々の贈り物を見つけた (+ITEMGET) Smoke fills the air around you! -煙があなたの周りの空気を満たします! +煙が辺り一面を取り巻く! +### You find a magical necklace that seems to concentrate magic. + + + You recover some of your lost items! -失くしたアイテムを取り戻したぞ! +奪われたアイテムを取り戻した! + + You find a red potion with a sweet scent. -甘い香りのする赤いポーションを見つけました。 +甘い香りのする赤いポーションを見つけた。 You find a blue potion that glows with magical essence. -あなたは魔法のエッセンスで光る青いポーションを見つけました。 +魔法のエッセンスで光る青いポーションを見つけた。 You find a glowing orb, filled with untapped mana. -あなたは未開発のマナで満たされた光るオーブを見つけました。 +マナで満たされた輝くオーブを見つけた。 You find three mana orbs strung together! -マナオーブが3つ並んでいるのを発見! +マナオーブが3つ並んでいるのを見つけた。 You find several willpower potions. -意志力のポーションがいくつか見つかりました。 +気力のポーションをいくつか見つけた。 You find several mana potions. -あなたはいくつかのマナポーションを見つけました。 +マナポーションをいくつか見つけた。 You find a green potion, glowing warm with energy. -あなたはエネルギーで暖かく輝く緑のポーションを見つけました。 +暖かく輝く緑のポーションを見つけた。 You find a snow-like potion that's cold to the touch. -触ると冷たい雪のようなポーションを見つけました。 +触ると冷たい雪のようなポーションを見つけた。 You find a medley of potions. -あなたはポーションのメドレーを見つけました。 -Rarity: -レアリティ: +ポーションのセットを見つけた。 + + +Rarity: +レアリティ: Lesser レッサー Common -一般 +コモン Uncommon アンコモン Rare レア Very Rare -激レア +スーパーレア Epic -すごい +エピック Legendary -伝説の +レジェンダリー Supreme -最高 +シュプリーム Mythic ミシック Angelic -天使の +エンジェリック Divine -神聖な +ディバイン + + Quantity: 量: -Use Item (Consumes 1) -アイテムを使う(1個消費) +Use One +使う + + way of the fist -拳の道 +拳 Lockpick -ピッキング用品 +ロックピック Exit Keys -終了キー -Wizard's Outfit -ウィザードの衣装 +階段の鍵 + + +Adventurer's Outfit +冒険者の服 Your favorite outfit for adventuring. お気に入りの冒険服。 Your original outfit. No bonuses, no penalties. -あなただけのオリジナル衣装。ボーナスなし、ペナルティなし。 +オリジナルの衣装。ボーナスなし、ペナルティなし。 + + +Tactical Catsuit +タクティカルキャットスーツ +A sleek catsuit worn by stealth operatives. No frills, no nonsense. +潜入工作員用のキャットスーツ。フリルはないが野暮ではない。 +Increases stealth by 10% in the dark. +暗闇の中で隠密性が10%上昇する。 + + Jail Uniform -刑務所の制服 +囚人服 The prisoners are kept in revealing outfits to keep them from hiding things. -囚人は、物を隠さないように露出度の高い服装をしています。 -A prisoner's 'outfit'. No bonuses, no penalties. -囚人の『装い』。ボーナスもペナルティもない +物を隠せないように露出度を高められた囚人服。 +Designed to make it hard to conceal weapons. Makes you more visible and vulnerable to the cold. +武器を隠しにくいデザイン。人目につき、寒さに弱くなる。 + + Wolfgirl Suit -ウルフガールスーツ +ウルフガールのスーツ An advanced suit designed for sport, breathable and also warm. スポーツ用に設計された、通気性と保温性に優れた高度なスーツ。 -No bonuses, no penalties. -ボーナスなし、ペナルティなし -Maid Uniform -メイド服 -An elegant dress meant to denote a maid's status. -メイドの身分を表す上品なドレス。 -Massively increases accuracy against slime mold. -粘菌に対する命中率が大幅にアップします。 +Made of latex. Resistant to electricity but does not insulate well. +ゴムでできているため、電気には耐性があるが断熱性は低い。 + + Maid Uniform メイド服 An elegant dress meant to denote a maid's status. -メイドの身分を表す上品なドレス。 +メイドの身分を表す優雅なドレス。 Massively increases accuracy against slime mold. -粘菌に対する命中率が大幅にアップします。 -Prisoner Uniform -囚人服 -The uniform of choice for girls captured by the dragonhearts. -ドラゴンハートに囚われた少女たちが選んだ制服。 -Designed to make it hard to conceal weapons. No bonuses, no penalties. -武器を隠しにくいように設計されています。ボーナスもペナルティもありません。 +粘菌に対する命中率が大幅にアップする。 + + +Harem Outfit +ハーレムの衣装 +A skimpy outfit with antiquated connotations. +露出の多い、古代の衣装。 +Harkening back to an old era. +古代の生活を思い起こさせる。 + + +Combat Bikini +コンバットビキニ +A minimalist albeit chilly outfit designed for ease of use. +少し肌寒いが、使いやすさを追求し尽くした合理的な服装。 +Or perhaps it's just sexy... +もしくはただのビキニ。 +Lingerie +下着 +A minimalist yet aesthetically pleasing outfit. +布面積の少ないえっちな服。 +No bonuses. +ボーナスなし。 + + +Dragonheart Uniform +ドラゴンハートの衣装 +The uniform of choice for dragonheart of all ranks. +全てのドラゴンハートが袖を通す衣装。 +It's made of fire-resistant leather, and provides +5 armor. +炎に耐性のある革で作られた衣装。アーマー値+5。 + + Scientific Uniform -科学ユニフォーム +科学的ユニフォーム An outfit designed to leave little to the imagination. -想像力にほとんど任せないように設計された衣装。 -No bonuses, no penalties. -ボーナスなし、ペナルティなし +ピッタリとしたスーツ。 +Resistant to electricity but does not insulate well. Provides significant acid and glue protection for scientific purposes. +電気には強いが、断熱性は低い。酸や接着剤から着用者を保護する。 + + Latex Catsuit ラテックスキャットスーツ An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. -スライムを大量に加工した衣装。自然なシルクのような滑らかな肌触りです。 -No bonuses, no penalties. -ボーナスなし、ペナルティなし +大量のスライムを用いて作られたスーツ。シルクのような柔らかな肌触り。 + + Doll Catsuit -ドールキャットスーツ -An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. -スライムを大量に加工した衣装。自然なシルクのような滑らかな肌触りです。 -No bonuses, no penalties. -ボーナスなし、ペナルティなし +ドールのキャットスーツ +Resistant to electricity but does not insulate well. +電気には強いが、断熱性は低い。 + + +Cyber Doll Suit +サイバードールのスーツ +A technologically advanced suit designed for long term wear. Despite being watertight and skintight it has cleaning and ventilation ports that plug directly into doll storage fixtures. +高度な技術力を用い、長期間の着用を想定して作られたスーツ。肌にピッタリと張り付き、防水に加え、換気口やクリーニングポート、人形収納用の差込口までついている。 + + Shadow Latex Dress -シャドウ ラテックス ドレス +シャドーラテックスドレス A minidress made from shadow latex, a favorite of otherwordly patrons. -シャドーラテックスで作られたミニドレス、異界の常連客のお気に入り。 -No bonuses, no penalties. -ボーナスなし、ペナルティなし +シャドーラテックスで作られたミニドレス。異界の住人のお気に入り。 +Resistant to the elements, but is infused with crystals that amplify psychic damage to yourself. +エレメント属性には強いが、精神ダメージが増してしまうクリスタルがついている。 + + +Elemental Slave Dress +精霊の奴隷のドレス +A minidress made to adorn mortal slaves in the elemental planes. +精霊界で定命の奴隷を着飾るミニドレス。 + + Elven Dress エルフのドレス A regal minidress worn by visitors to the forest. -森への訪問者が身に着ける堂々としたミニドレス。 -No bonuses, no penalties. -ボーナスなし、ペナルティなし +森への訪問客のために作られた、豪華なミニドレス。 +Not very good at insulating you from the cold or from touchy fingers. Its elven aura improves accuracy and evasion by +10. +少し肌寒い。着用するとエルフのオーラで命中率と回避率+10。 + + Scroll of Sleight -スライトの巻物 +奇術の巻物 The scroll makes your memories of arm movements clear as day! -巻物は、腕の動きの記憶を一日のように鮮明にします。 +腕の動きを再現する巻物。 A scroll used by thieves to make their plays in secret. -盗賊が秘密裏にプレイするために使う巻物。 +盗賊の仕事によく使用される。 Allows you to cast Arm spells without components for 12 turns. -12 ターンの間、コンポーネントなしでアーム スペルをキャストできるようになります。 +12ターンの間、腕を縛られていても腕を使用する魔法が使用可能になる。 + + Scroll of Purity 純潔の巻物 The scroll circles around your body and you feel... empty now. -スクロールがあなたの体の周りを一周し、あなたは感じます...今は空っぽです。 +挿入されている不純物を取り除く巻物。 A scroll used to enforce chastity within religious orders. -教団内で純潔を強制するために使用される巻物。 +教団内で純潔を強制するために使用される。 Removes all vibrators from your body. -あなたの体からすべてのバイブレーターを取り除きます。 +体からプラグを取り除く。 + + Scroll of Speech -スピーチの巻物 +口弁の巻物 The scroll makes your gagged speech slightly more intelligible! -巻物は、あなたの猿轡かませたスピーチを少し分かりやすくします! +猿轡をかまされていても、はっきりと発音できるようになる巻物。 A scroll used to help translate different languages. -さまざまな言語を翻訳するのに役立つ巻物。 +さまざまな言語を翻訳するのに役立つ。 Allows you to cast Verbal spells without components for 12 turns. -12 ターンの間、コンポーネントなしで言葉の呪文を唱えることができます。 +12ターンの間、猿轡をかまされていても口を使用する魔法が使用可能になる。 + + Scroll of Sauntering -散歩の巻物 +ステップの巻物 The scroll lets you move your body in swift and accurate ways! -巻物で素早く正確に体を動かせます! +正確に動けるようになる巻物。 A scroll used by dancers to upgrade their moves. -ダンサーが動きをアップグレードするために使用する巻物。 +ダンサーが上達のためによく使用する。 Allows you to cast Leg spells without components for 12 turns. -12 ターンの間、構成要素なしでレッグ スペルを唱えることができます。 +12ターンの間、足を縛られていても足を使用する魔法が使用可能になる。 + + Ancient Key 古代の鍵 Perhaps it has something to do with ancient restraints? -もしかして、古代の拘束と何か関係があるのでしょうか? +もしかしたら古代の拘束具と関係があるのかもしれない。 An ancient key plated in gold. It doesnt look like it can open anything... -金でメッキされた古代の鍵。何も開けられないように見える... +金でメッキされた古代の鍵。合う鍵穴は見つかっていない…… You pick up a shining golden key. -あなたは輝く黄金の鍵を手に入れました。 +黄金に輝く鍵を手に入れた。 + + You pick up a ReplaceValue. -ReplaceValue を取得します。 +ReplaceValue を取得した + + Power Crystal パワークリスタル You hold the crystal and the power flows into you. -あなたがクリスタルを握ると、力があなたに流れ込みます。 +クリスタルを握ると、力が流れ込んできた。 You're not sure how they charged these... -彼らがこれらをどのように請求したかはわかりません... +古代の人達がこれをどうやって作ったのかはわからない…… A mysterious device used by the old civilization, powering their ancient devices. -古い文明が使っていた謎の装置で、彼らの古代の装置に動力を与えている。 +古代の文明で、動力として使われていたようだ。 + + You are already full of ancient power. -あなたはすでに古代の力に満ちています。 +既にパワーが満タンになっている。 + + Spent Power Crystal -消費したパワー クリスタル +消耗したパワークリスタル You touch the spent crystal and it siphons 100 gold from your bag! -使用済みクリスタルに触れると、バッグから 100 ゴールドが吸い上げられます! +使用済みクリスタルに触れると、バッグから100ゴールドが吸い上げられた。 You are not sure how to charge this back up. -このバックアップを充電する方法がわかりません。 -You're not sure how they charged these... -彼らがこれらをどのように請求したかはわかりません... +パワーを補充する方法がわからない。 A mysterious device used by the old civilization, now depleted. -古い文明が使っていた謎の装置、今は枯渇している +古代の文明で動力として使われていたクリスタル。今は力を失っている。 + + Gold -金 +ゴールド Key 鍵 -A key with traces of magic that fades with one use. -一度使うと消える魔法の痕跡の鍵 -Can be used to unlock a restraint, door, or chest. -拘束具、ドア、またはチェストのロックを解除するために使用できます。 +A key. You wonder who it's for? +鍵。誰かのために作られた、何かのための鍵。 +Can be used to unlock one simple or standard-locked restraint, door, or chest. +簡単か普通な錠に有効。拘束具、ドア、またはチェストを解錠できる。 Magic Key 魔法の鍵 A glowing key enchanted with magic that fades with one use. -一回の使用で消えていく魔法がかかった光る鍵。 -Can be used to unlock a blue lock. -青いロックのロックを解除するために使用できます。 -Magic Key -魔法の鍵 +一度使うと消える魔法で作られた光る鍵。 +Can be used to unlock a runic lock. +ルーンの錠を開けることができる。 A magical key with the power to open blue locks. -青い鍵を開ける力を持つ魔法の鍵 +一度使うと消える、魔法で作られた光る鍵。 Blue locks can't be otherwise picked. -青い錠は、それ以外の方法でピッキングすることはできません。 +青い鍵を解錠するために使用できる。青い錠はロックピックで開けられない。 Magic Knife -マジックナイフ +魔法のナイフ A magical blade, suitable against ghosts. -幽霊に適した魔法の刃。 -Deals shadow damage. Can cut enchanted ropes. -影のダメージを与えます。エンチャントされたロープを切ることができます。 +霊体を切るのに適した魔法のナイフ。 +Deals shadow damage. Can cut enchanted ropes. Offhand: Increase base crit of all magic damage by 20% +影属性のダメージを与える。魔法のロープを切断することができる。サブウェポン:魔法の会心ダメージ倍率+20%。 Bola -彼女はそうだった -A pair of weights attached to a rope. Can be thrown. -ロープに取り付けられた一対の重り。投げることができます。 -Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. -90 ポイントのバインド、40 のチェイン ダメージを与え、ターゲットを 4 ターン根絶します。 +投げ縄 A pair of weights attached to a rope. Can be thrown. -ロープに取り付けられた一対の重り。投げることができます。 +ロープの端に重りがつけられており、投擲に適している。 Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. -90 ポイントのバインド、40 のチェイン ダメージを与え、ターゲットを 4 ターン根絶します。 +90 ポイントのバインド属性40のチェイン属性ダメージを与え、ターゲットを4ターン移動不能にする。 Bomb 爆弾 -After a 5 turn fuse, deals 100 fire damage in a 3x3 area. -5 ターンの起爆後、3x3 の範囲に 100 の炎ダメージを与える。 -Not a toy! -おもちゃじゃない! -After a 6 turn fuse, deals 100 fire damage in a 3x3 area. -6 ターンの起爆後、3x3 の範囲に 100 の炎ダメージを与える。 +After a 5 turn fuse, deals 100 blast damage in a 3x3 area. +5ターン後に起爆し、3x3の範囲に100の爆破属性ダメージを与える。 Not a toy! -おもちゃじゃない! +おもちゃじゃないよ! You light the fuse! -あなたは導火線に火をつけます! +導火線に火をつけた! Knife ナイフ -Lockpick -ピッキング用品 A tool used to pick locks. -錠を開けるのに使われる道具。 +解錠のために使われる道具。 Doesn't last forever, but can help in a pinch. -永遠に続くわけではありませんが、ピンチには役立ちます。 +使い続けると折れるかもしれないけど、いざという時役に立つ。 lockpick x2 ロックピック×2 lockpicks x4 ロックピック×4 Bola x3 -ボーラ x3 +投げ縄 x3 Bomb x3 -ボム×3 +爆弾×3 +Dynamite x2 +ダイナマイト×2 +Plastic Explosive x2 +プラスチック爆弾×2 Mana Potion マナポーション You sip the mana potion and feel empowered. -マナ ポーションを飲むと、力が湧いてきます。 +マナポーションを飲むと、魔力が湧き上がってきた。 A rare essence used by mages to recover their strength. -魔術師が力を回復するために使用する希少なエッセンス。 +貴重な成分でできた、魔術師の生命線。 Restores 50% max MP instantly. Excess mana goes into the mana pool. -最大MPの50%を瞬時に回復。余ったマナはマナプールへ。 +最大MPの50%を瞬時に回復する。更に余剰回復分がある場合、マナプールを回復する。 Mana Orb マナオーブ You clutch the mana orb and feel its energy. -マナ オーブを握りしめ、そのエネルギーを感じます。 +マナオーブを握りしめると、エネルギーの奔流を感じる。 Mystical energies swirl inside a glass form. -神秘的なエネルギーがガラスの中で渦を巻く。 +神秘的なエネルギーがオーブの中で渦を巻いている。 Adds 200 MP to your mana pool. Requires no hands to use. -あなたのマナ プールに 200 MP を追加します。使用するのに手は必要ありません。 +マナプールを200ポイント回復する。手を拘束されていても使用できる。 Stamina Potion スタミナポーション You drink the stamina potion and feel invigorated. -スタミナポーションを飲むと元気が出ます。 +スタミナポーションを飲むと元気が出できた。 A potion brimming with heat and energy. -熱とエネルギーに満ちたポーション +熱とエネルギーに満ちたポーション。 Restores 50% stamina and 250% more over 25 turns. Effect does not stack. -スタミナを 50% 回復し、25 ターンにわたってさらに 250% 回復します。効果は重複しません。 +最大スタミナの50%を瞬時に回復する。その後25ターンかけ、最大スタミナの250%を徐々に回復する。効果は重複しない。 Willpower Potion -意志力のポーション +気力のポーション You drink the willpower potion and feel motivated. -あなたは意志力のポーションを飲み、やる気を感じます。 +気力のポーションを飲むと、やる気が湧いてきた。 A sweet potion, brimming with determination. -決意に満ちた甘いポーション +気分を向上させる甘いポーション。 Restores 25% willpower instantly. Can be used while gagged. -即座に意志力を25%回復。猿轡かませた状態でも使用可能。 +最大気力の25%を瞬時に回復する。猿轡をかまされた状態でも使用可能。 Frigid Potion -極寒のポーション +冷静のポーション You chug the concoction and your senses numb, helping you concentrate. -調合物を一気飲みすると、感覚が麻痺し、集中するのに役立ちます。 -A freezing cold bottle with a bitter scent. -苦い香りの凍えるような冷たい瓶 +飲むと頭がスッキリして、集中力が高まった。 +Like bottled snow. Helps to get your mind on track. +瓶詰めの雪のよう。集中力を高めるのに役立つ。 Reduces distraction to 0 and grants additional decay for 50 turns. Can be used while gagged. -気晴らしを0にし、50ターンの間追加の減衰を付与します。猿轡かませた状態で使用できます。 +興奮値を0にする。50ターンの間、興奮値の上昇を抑制する。猿轡をかまされた状態でも使用可能。 Smoke Bomb -煙幕弾 -You toss the smoke bomb and it explodes in your location! -発煙弾を投げると、その場所で爆発します! -A type of pyrotechnic often employed by saboteurs. Can be used without hands. -妨害工作員がよく使う火工品の一種。手を使わなくても使える。 +煙幕 +You toss the smoke bomb and it starts emitting a deep haze! +煙幕を投げると、濃い煙が吹き出てきた。 +You ready a smoke bomb... +煙幕の準備ができた。 +A type of pyrotechnic often employed by saboteurs. Can be rolled and used without hands. +闇に生きる者がよく使う。手が縛られていても使える。 Creates a smoke screen lasting 8 turns. You are harder to see while inside the smoke. 8ターン持続する煙幕を張る。煙の中にいると見えにくくなる。 +Smoke Bomb x3 +煙幕 x3 +Flash Bomb +閃光爆弾 +Flash Bomb x3 +閃光爆弾 x3 +Flashbang x3 +閃光手榴弾 x3 +You toss the flash bomb and the fuse starts ticking... +導火線に火の付いた閃光爆弾を投げた。 +You ready a flash bomb... +閃光爆弾の準備ができた。 +A type of explosive used by agents. Blinds nearby targets without causing significant injury. +諜報員が使用する爆弾の一種。対象を傷つけることなく無力化する。 +Blinds for 20 turns in a 3x3 area. +3x3マスの対象を20ターンの間盲目状態にする。 + + +Flashbang +閃光手榴弾 +You toss the flashbang and the fuse starts ticking... +ピンを抜いた閃光手榴弾を投げた。 +You ready a flashbang... +閃光手榴弾の準備ができた。 +A piece of rare special forces equipment. The secrets of its manufacture are strictly kept by the Alchemist's Guild. +希少な特殊部隊の装備の1つ。製造方法は錬金術師のギルドにより秘匿されている。 +Blinds for 24 turns in a 3x3 area. Also Slows and Silences them for half the duration. +3x3マスの対象を24ターンの間盲目にし、12ターンの間沈黙と減速状態にする。 +Blinds for 24 turns in a 3x3 area. And also Slows and Silences them for half the duration. +3x3マスの対象を24ターンの間盲目にし、12ターンの間沈黙と減速状態にする。 + + Invisibility Potion 不可視ポーション You chug the concoction and see your body fading away. -調合を一気飲みすると、体が消えていくのが見えます。 +飲むと透明になれる。 You feel liquid inside, but you can't see it! -あなたは液体を感じますが、それを見ることはできません! -Casts Invisibility on yourself. -自分にインビジビリティをキャストします。 +瓶の中に何か入っているのはわかるが、見ることはできない。 +Casts Vanish on yourself. +数ターンの間透明になれる。 Ectoplasm エクトプラズム Like a moisturizing cream, except it's made from coagulated souls. -凝固した魂から作られていることを除けば、保湿クリームのようなものです。 +魂の塊。保湿クリームのような触り心地。 Can be used without hands. Just apply directly to the forehead! -手を使わずに使える。額に直接塗るだけ! +額に塗る。手を縛られていても使用可能。 Makes you harder to see for 10 turns. -10ターンの間、見えにくくなる +10ターンの間、見えにくくなる。 Earth Rune -アースルーン +地のルーン You smash the rune in front of you, and glowing rocks rise from the earth. -目の前のルーンを砕くと、地中から光る岩が立ち昇る。 +ルーンを砕くと、地面から岩が生えてくる。 It feels unsettling to look at. 見ていて気持ち悪い。 Creates a 3x3 area of +20 armor centered on yourself for 9 turns. -9ターンの間、自分を中心に+20アーマーの3x3エリアを作成します。 +9ターンの間、自分を中心にアーマー値を20増加させる3x3エリアを作成する。 Water Rune 水のルーン You crush the rune in your hand, and it turns into water that coats the floor -ルーンを手で砕くと、床を覆う水に変わります +ルーンを砕くと、辺り一面が水に覆われる。 It feels slimmy. -ぬるい感じです。 +なまぬるい。 Creates a 3x3 area on you for 9 turns. Gives +30 Magic Armor to friendlies, halves enemy speed. -9 ターンの間、自分に 3x3 のエリアを作成します。味方に +30 マジック アーマーを与え、敵の速度を半分にします。 +9ターンの間、自分を中心に、マジックアーマー値を30増加させ、敵の移動速度を半減させる3x3のエリアを作成する。 Ice Rune 氷のルーン You smash the rune in front of you, and icicles pierce through the floor! -目の前のルーンを砕くと、つららが床を突き破る! +ルーンを砕くと、床からつららが生えてくる。 It feels cold to the touch. 触ると冷たく感じる。 Creates icicles around you for 5-8 turns. They deal 40 damage and freeze for 3 turns. -5-8 ターンの間、周囲につららを生成します。氷柱は 40 のダメージを与え、3 ターンの間凍結します。 -You found a donut with sprinkles! -ふりかけが入ったドーナツを見つけたね! +5-8ターンの間、周囲につららを生成する。つららが命中した敵に40のダメージを与え、3 ターンの間凍結させる。 + + +You steal the doll's identification card. +ドールのIDカードを盗んだ。 +Doll ID +ドールID +You apply a clever trick to reset your visor cooldown. +巧みな指先でバイザーのクールダウンをリセットした。 +A chip used to identify dolls. She must have dropped it. Either way it contains valuable tech... +人形を識別するためのカード。誰かが落としたのだろうか。貴重な技術が使用されている……。 +With enough, it can be used to remove Dollmaker's headwear. +ドールメイカーのヘッドギアを外すことができる。 + + + + +Heart Amulet +ハートのアミュレット + + +You find a donut with sprinkles! +砂糖のまぶしてあるドーナツを見つけた! Donut (Sprinkles) -ドーナツ(ふりかけ) +ドーナツ(砂糖) You enjoy the donut and relish in its sweet delights. -あなたはドーナツを楽しみ、その甘い喜びを味わいます。 +ドーナツを頬張ると甘さが口いっぱいに広がる。 A delicious fried snack, covered in a sugary glaze and topped with sprinkles. -甘い釉薬で覆われ、トッピングがトッピングされた、おいしいフライド スナックです。 +上に砂糖が乗っている、定番の揚げ菓子。 Restores 10% willpower. Takes a few turns to eat. -気力10%回復。食べるのに数ターンかかる -You picked up a sugar cookie slathered in pink frosting! -あなたはピンク色のフロスティングをまぶしたシュガークッキーを手に取りました! +気力を10%回復する。食べるのに数ターンかかる。 + + +You pick up a sugar cookie slathered in pink frosting! +ピンクの粉がかかったクッキーを拾った! Good-Girl Gift -グッドガールギフト +ご褒美のクッキー You slowly eat the cookie, savoring its fluffy texture. -ふわふわの食感を味わいながら、ゆっくりと食べてください +味わい深いサクサクのクッキー。 It tempts you with sweet promises, but something about it feels off... -甘い約束で誘惑するけど、どこか気持ち悪い… +甘くて美味しいけど、何か変な味がする…… Restores 15% willpower and adds +5 submissiveness. Takes a few turns to eat. -15%の意志力を回復し、+5従順さを追加します。食べるのに数ターンかかります。 -You found a chocolate-chip cookie! -チョコチップクッキーを発見! +気力を15%回復し、服従度が5増加する。食べるのに数ターンかかる。 + + +You find a chocolate-chip cookie! +チョコチップクッキーを見つけた! Cookie (Chocolate Chip) クッキー(チョコチップ) You enjoy the cookie one chocolatey bite at a time. -一度に一口ずつチョコレートのようなクッキーをお楽しみいただけます。 +おなじみのチョコチップクッキー A delicious baked good made with butter, sugar, and chocolate chips, baked until golden brown. -バター、砂糖、チョコチップをきつね色になるまで焼き上げたおいしい焼き菓子です。 -Restores 10% willpower. Takes a few turns to eat. -気力10%回復。食べるのに数ターンかかる +クッキーにチョコチップが乗っている、きつね色のお菓子。 + + The potion was less effective due to your gag! -あんたのギャグのせいでポーションの効果が弱かった! +猿轡のせいでポーションを上手く飲めなかった! + + Elven Soap -エルフソープ +エルフの石鹸 You feel the restraints become loose on your skin! -拘束が緩むのを肌で感じる! +拘束具が滑りやすくなっている。 The secret to elven cosmetics and blemish-free skin. -エルフコスメとシミのない肌の秘密 -Makes you slippery for 10 turns, boosting all forms of struggling. -10ターンの間滑りやすくなり、あらゆる形態のもがきを強化します。 -You feel the restraints become loose on your skin! -拘束が緩むのを肌で感じる! +エルフの美容の秘密。 +Makes you slippery for 100 turns, boosting all forms of struggling. +100ターンの間滑りやすくなり、拘束具を解除するすべてのコマンドにボーナスを得る。 + + Enchanted Grinder エンチャントグラインダー The grinder starts spinning for a short time! Its cutting power is immense! -グラインダーが一瞬回転!切削力がすごい! +回転する鋸刃で拘束具を切り裂く。 The cutting disc is shining and very sharp. -カッティングディスクは輝いており、非常に鋭利です。 +鋸刃は輝いており、非常に鋭い。 Grants significantly increased cutting power for a short time. -短時間、斬撃力が大幅に上昇する。 -The grinder starts spinning for a short time! Its cutting power is immense! -グラインダーが短時間回転を開始します。その切断力は絶大です! +数ターンの間、「切断」コマンドに大幅なボーナスを得る。 + + Dollmaker's Staff 人形職人の杖 You remember this being used on someone else. -あなたはこれが他の誰かに使われたことを覚えています。 +これが誰かの杖だったことは覚えている。 +15% glue damage. Deals psychic damage. Fully bound enemies captured with this weapon become latex dolls which fight with you. -+15% 接着剤のダメージ。サイキック ダメージを与える。この武器で完全に拘束された敵は、ラテックス人形になり、あなたと戦う。 +ねばねば属性のダメージが15%増加し、通常攻撃が精神属性になる。この武器で完全に拘束された敵は、ラテックス人形になり、仲間になる。 You are unable to control more than 3 dolls. The new doll is protesting and remains bound. -あなたは3つ以上の人形を操作できません。新しい人形は抗議していて、拘束されたままです。 +同時にコントロールできる人形は3体まで。4体目以降の人形は拘束されたままになる。 + + Staff of Incineration 焼却の杖 A magical weapon made for intermediates to use. -中級者向けに作られた魔法の武器 -+25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. -+25% 火ダメージ。火ダメージを与える。燃えている敵は、ターンごとに追加で 5 火ダメージを受ける。 +中級者向けに作られた魔法の武器。 ++25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. Offhand: Applies %fire damage bonus. +火属性。火属性のダメージが25%増加する。燃えている敵は、ターン経過時に5ポイントのダメージを受ける。サブウェポン:火属性ダメージが20%増加する。 Staff of Storms 嵐の杖 -A magical weapon made for intermediates to use. -中級者向けに作られた魔法の武器 -+20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. -+20% 電気ダメージ。電気ダメージを与える。電気ダメージを受けた敵は、5x5 エリア内に 15 の追加電気ダメージをエコーする。 ++20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. Offhand: Applies electric damage bonus. +電気属性。電気属性のダメージが20%増加する。電気ダメージを受けた敵は5x5エリア内に15の追加電気ダメージを反射する。サブウェポン:電気属性ダメージが20%増加する。 Staff of Frostbite 凍傷の杖 A magical weapon with a 33% chance to freeze the target for 4 turns. 33%の確率で対象を4ターン凍結させる魔法の武器。 -+20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. -+20% 氷ダメージ。氷ダメージを与える。凍った敵は毎ターン 5 氷ダメージを受ける。 ++20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. Offhand: Applies ice damage bonus. +氷属性。氷属性のダメージが20%増加する。ターン経過時、凍結した敵は5ダメージを受ける。サブウェポン:氷属性ダメージが20%増加する。 Staff of Binding 束縛の杖 A magical weapon made to use on novices. 初心者用に作られた魔法の武器 -+20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. -+20% チェイン ダメージ。チェイン ダメージを与え、ターゲットを 4 ターン根絶します。150% のバインド効率。 ++20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. Offhand: Applies chain damage bonus. +チェーン属性のダメージが20%増加し、通常攻撃が命中した時、4ターンの間敵を移動不可状態にする。拘束力が150%増加する。サブウェポン:チェーン属性ダメージが20%増加する。 + + Arcane Orb -アルケインオーブ +アーケインオーブ Look into my eyes... -私の目を見て... -Deals shadow damage. Can be used without hands. Does not benefit from enemies being vulnerable. -影のダメージを与えます。手がなくても使用できます。敵が脆弱であることの恩恵を受けません。 +私の目を見て…… +Deals arcane damage. Can be used without hands. Can not critically strike. +秘術属性。会心の一撃が発生しない。 +You find a purple crystal. You feel your mystic powers flood into it. +紫のオーブを手に入れた。中から不思議な力を感じる。 Staff of Flame 炎の杖 A magical weapon made for novices to use. -初心者向けに作られた魔法の武器 -+15% fire damage. Deals fire damage. -+15% 火ダメージ。火ダメージを与える。 +初心者向けに作られた魔法の武器。 ++15% fire damage. Deals fire damage. Offhand: Applies passive bonus. +火属性。火属性のダメージが15%増加する。サブウェポン:火属性ダメージが15%増加する。 Staff of Slime スライムの杖 A slimy and magical implement.. -ぬるぬるした魔法の道具…… -+10% glue damage. Deals glue damage. -+10% 接着剤のダメージ。接着剤のダメージを与えます。 +ぬるぬるしている魔法の杖。 ++10% glue damage. Deals glue damage. Offhand: Applies passive bonus. +ねばねば属性。ねばねば属性のダメージが10%増加する。サブウェポン:ねばねば属性ダメージが10%増加する。 Staff of Shocking -衝撃の杖 -A magical weapon made for novices to use. -初心者向けに作られた魔法の武器 -+10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. -+10% 電気ダメージ。電気ダメージを与える。10% の確率で 3 ターンスタンする。 +電気の杖 ++10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. Offhand: Applies electric damage bonus. +電気属性。電気属性のダメージが10%増加する。命中時に10%の確率で敵をスタン状態にする。サブウェポン:電気属性ダメージが10%増加する。 Staff of Permafrost 永久凍土の杖 A magical weapon with a 15% chance to freeze the target for 4 turns. 15%の確率で対象を4ターン凍結させる魔法の武器。 -+10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration) -+10% 氷属性ダメージ。氷属性ダメージを与える。敵にかかっている氷結効果の持続時間を 1.5 倍にする (最低 +1 持続時間) ++10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration). Offhand: Applies ice damage bonus. +氷属性。氷属性のダメージが10%増加する。敵にかかっている凍結効果の持続時間を1.5倍にする(最低1ターン増加)。サブウェポン:氷属性ダメージが10%増加する。 Staff of Chains 鎖の杖 A magical weapon made for novices in the art of bondage. -束縛術の初心者のために作られた魔法の武器。 -+10% chain damage. Deals chain damage. 150% binding efficiency. -+10% チェイン ダメージ。チェーン ダメージを与える。150% バインド効率。 +拘束術の初心者に向けて作られた魔法の武器。 ++10% chain damage. Deals chain damage. 150% binding efficiency. Offhand: Applies chain damage bonus. +チェーン属性。チェーン属性のダメージが10%増加し、拘束力が150%増加する。サブウェポン:チェーン属性ダメージが10%増加する。 +You pick up a staff of chains. You have fond memories... +鎖の杖を手に入れた。懐かしさを感じる…… + + You pick up a staff of binding. You remember these from wizard school... -君は束縛の杖を手に取った。魔法学校で覚えたものだ… +束縛の杖を手に入れた。魔法学校で何度も使った覚えがある。 You pick up a staff of the storm. Your hair stands on end. -あなたは嵐の杖を手に取りました。あなたの髪は逆立っています。 +嵐の杖を手に入れた。雷霆の力に髪が逆立つ。 You pick up a staff of incineration. It rumbles with molten fury. -あなたは焼却の杖を手に取ります。それは溶けた怒りで鳴り響きます。 +焼却の杖を手に入れた。怒りの炎が湧き上がってくる。 You pick up a staff with a name on it: DOLLMAKER -あなたは名前が書かれた杖を手に取った:DOLLMAKER +名前が書かれた杖を手に入れた:DOLLMAKER You pick up a staff of frostbite. Your hand feels numb just reaching for it. -あなたは凍傷の杖を手に取りました。手を伸ばすだけで手がしびれます。 -You pick up a staff of chains. You have fond memories... -あなたは鎖の杖を拾います。あなたには懐かしい思い出があります... +凍傷の杖を手に入れた。持つだけで手がかじかむ。 + + You pick up a staff of the storm. It tingles. -嵐の杖を手に取ると、うずきます。 +嵐の杖を手に入れた。雷の渦を感じる。 You pick up a staff of flames. It feels warm. -あなたは炎の杖を手に取ります。それは暖かく感じます。 -You find a purple crystal. You feel your mystic powers flood into it. -あなたは紫色のクリスタルを見つけました。あなたの神秘的な力がそこに溢れているのを感じます。 +炎の杖を手に入れた。ほんのりと暖かい。 You pick up a staff of slime. -あなたはスライムの杖を拾います。 +スライムの杖を手に入れた。 You pick up a staff of permafrost. It feels icy to the touch. -あなたは永久凍土の杖を手に取った。触ると氷のようだ。 +永久凍土の杖を手に入れた。氷のように冷たい。 + + Crop -作物 +ムチ For those unruly subs. -手に負えない潜水艦のために。 -Deals pain damage. Highly distracting. -痛みのダメージを与えます。非常に気を散らします。 +しつけのための道具 +Deals pain damage. Highly distracting. Offhand: +5 pain damage on attack for 3 stamina. +苦痛属性のダメージを与える。興奮値が溜まりやすい。サブウェポン:攻撃時、追加でスタミナを3消費し、5苦痛属性ダメージを追加で与える。 You pick up a riding crop. -あなたは乗馬作物を拾います。 +馬用のムチを手に入れた。 + + Scissors はさみ Safety first! 安全第一! Deals slash damage. Better than a knife for cutting restraints. -斬撃ダメージを与える。拘束を切るにはナイフよりも優れている. +斬撃属性。ナイフよりも拘束を切断しやすい。 You pick up a pair of scissors. -あなたははさみを手に取ります。 +はさみを手に入れた。 + + Dagger -短剣 +ダガー Designed with subterfuge in mind. -ごまかしを念頭に置いて設計されています。 -Deals slash damage. Deals 55 pierce damage instead on unaware targets. -斬撃ダメージを与えます。認識していないターゲットには、代わりに 55 の刺突ダメージを与えます。 +不意打ち用の武器。 +Deals slash damage. Deals 40 pierce damage instead on unaware targets, before crit modifiers. Offhand: +10% Base Weapon Crit +斬撃属性。プレイヤーを認識していない敵を攻撃した際、40ポイントの刺突属性ダメージを与える。サブウェポン:会心率+10%。 You pick up a dagger. -あなたは短剣を拾います。 +ダガーを手に入れた。 + + Katana 刀 She who strikes first, hits second. -先に打った者は、二番目に打つ。 +後の先を取る。 Deals slash damage. Deals up to 50 bonus damage by waiting 10 turns between attacks. -斬撃ダメージを与えます。攻撃の間に 10 ターン待つことで、最大 50 のボーナス ダメージを与えます。 +斬撃属性。攻撃しなかった場合、次の攻撃で与えるダメージが増加する。最大10ターン/50ダメージ You pick up a katana. -あなたは刀を手に取ります。 +刀を手に入れた。 + + Shadow's Edge -シャドウズ エッジ +影丸 For those who truly devote themselves to the cause. -真に大義に専念する者のために。 +真の大義に殉する者の刃。 Deals shadow damage. Damage is doubled against enemies that are in shadow. -影属性のダメージを与える。影にいる敵にはダメージが2倍になる。 +影属性。影にいる敵に攻撃する場合、2倍のダメージを与える。 You pick up Shadow's Edge. -あなたはシャドウズエッジを拾います。 +影丸を手に入れた。 + + Stormbreaker ストームブレイカー I have the power! Taking electric damage charges you (1 turn/10dmg). -力はある!電撃ダメージでチャージ(1ターン/10ダメージ) -Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. -クラッシュダメージを与えます。チャージすると、エリア内に最大+40のボーナス電撃ダメージを与えます。 +これが力だ!電気属性のダメージを受けた場合、1ターンに10ダメージ分チャージをする。 +### Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. Gives +100 Electric Resist when held. (can be wielded offhand to apply the Electric Resist) + You pick up Stormbreaker. -あなたはストームブレイカーを拾います。 +ストームブレイカーを手に入れた。 + + + + Rapier レイピア For the ostentatious and flashy duelist. -派手で派手なデュエリストに +華麗なデュエリストの武器。 Deals slash damage. Deals 50 pierce damage instead on vulnerable targets. -斬撃ダメージを与えます。脆弱なターゲットには代わりに 50 の貫通ダメージを与えます。 +斬撃属性。刺突属性が弱点の敵を攻撃した際、50ポイントの刺突属性ダメージを与える。 You pick up some kind of pretentious sword. -あなたはある種の大げさな剣を手に取りました。 +華美で華奢な剣を手に入れた。 + + Foil -ホイル +フルーレ En garde! -用心する! +いざ尋常に! Deals pierce damage. Deals 30 damage instead on vulnerable targets. -貫通ダメージを与えます。代わりに脆弱なターゲットに 30 ダメージを与えます。 +刺突属性。刺突属性が弱点の敵を攻撃した際、30ポイントの刺突属性ダメージを与える。 You pick up a fencing sword. -あなたはフェンシングの剣を手に取ります。 +フェンシングの剣を手に入れた。 + + +Sledgehammer +スレッジハンマー +Do you have what it takes? +マネできるかい? +Deals heavy crush damage and knocks the target back 2 spaces. Deals bonus damage to most solid barricades. +打撃属性。大量のダメージを与え、命中した敵を2マスノックバックさせる。物理的なバリケードにダメージを与える際、ボーナスを得る。 +You pick up a heavy sledgehammer. +重いスレッジハンマーを拾った。 + + Hammer ハンマー -A rather simplistic bludgeoning weapon. -かなり単純な殴打武器。 +A crude way of fixing your problems. +眼の前の様々な問題を叩き潰すための道具。 Deals crush damage and knocks the target back. -クラッシュダメージを与え、ターゲットをノックバックします。 +打撃属性。命中した敵をノックバックさせる。 Flail -フレール -A ball on a chain. Very fast and hard to dodge. -チェーンのボール。非常に速く、かわすのが難しい。 +フレイル +Very fast and hard to dodge as long as you know what you're doing. +棒と鉄球が鎖で繋がっている打撃武器。回避するのが難しい。 Also deals 10 damage to targets next to you. Deals crush damage. -隣の対象にも10ダメージ。クラッシュダメージを与える。 +打撃属性。隣の敵には10ポイントの打撃属性のダメージを与える。 Spear 槍 Speak softly and carry a pointy stick. -静かに話し、先のとがった棒を持ってください。 -Deals pierce damage to the target and one square behind it. -ターゲットとその後ろの 1 マスに貫通ダメージを与えます。 +鋭き穂先と穏やかな口調で問題を解決する。 +Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 2 tiles away. +刺突属性。ターゲットを貫通し、2マス先まで攻撃が届く。 +Pike +パイク +An 11 foot pole, for things you wouldn't want to touch with a 10 foot pole. +3.3メートルの長槍。3メートルの槍でも触れたくないものに触れるため、少し伸ばした。 +Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 3 tiles away. +刺突属性。ターゲットを貫通し、3マス先まで攻撃が届く。 Bolt Cutters ボルトカッター -A cutting tool useful as a bludgeon, and also for cutting locks and chains. -棍棒として、また錠前や鎖を切るのにも役立つ切断具。 +The universal key. +万能の鍵。 Also assists in cutting restraints when equipped. -装備すると拘束切断もアシストします。 -Knife -ナイフ +装備時「切断」コマンドにボーナスを得る。 A go-to for travelers and adventurers. -旅行者や冒険家の頼りになる場所です。 -Deals slash damage. -斬撃ダメージを与える +旅行者や冒険家の頼りになる護身武器。 +Deals slash damage. Offhand: +10 Block +斬撃属性。サブウェポン:ブロック値+10。 +Flashlight +フラッシュライト +A weapon of mass illumination. +周囲を照らす道具。 +Provides a highly directional light source. +強力な明かりを発する。 +You pick up a flashlight. +フラッシュライトを拾った。 Torch 松明 Second only to the mighty towel in usefulness. -マイティタオルに次ぐ実用性 +マイティタオルに次ぐ実用性。 Deals fire damage. Provides light. -火のダメージを与えます。光を提供します。 +火属性。装備していると周囲が照らされる。 Unarmed -非武装 -Fight with your hands and feet. -手と足で戦え +素手 +Fight with your hands and feet. Counts as teasing if arms are free. 50% chance to stun target if the target is disarmed. +戦いの基本。攻撃時、敵が武装解除状態の場合、50%の確率でスタン状態にする。両腕が縛られていない時、イタズラ属性になる。 Deals unarmed damage. -素手でダメージを与える。 +素手属性。 Sword 剣 -The blade is strong, its edge sharp. -刃は強く、刃は鋭く +the steel is strong, and the blade true. +鋼鉄製の頑丈な直剣。 A fast and accurate weapon that deals slash damage. -斬撃ダメージを与える高速で正確な武器。 +斬撃属性。精確で素早い。 Flamberge フランベルジェ -A blade forged in a magical fire. -魔法の炎で鍛えられた刃 -Deals 20 bonus fire damage on hit. -ヒット時に 20 のボーナス ファイア ダメージを与えます。 +A blade forged in magic fire. +魔法の炎で鍛えられた刃。 +Deals 20 bonus slash damage on hit. Offhand: Produces light. +斬撃属性。命中時、追加で20斬撃性ダメージを与える。サブウェポン:武器が光る。 Escort Drone エスコートドローン A semi-autonomous drone with a personal defense beam. Does not require hands to equip. -個人防御ビームを備えた半自律型ドローン。装備に手は必要ありません。 +個人防御ビームを備えた半自律型ドローン。手を縛られていても使用可能。 Deals electric damage. 33% chance to stun for 4 turns. -電撃ダメージを与える。33%の確率で4ターン気絶させる +電気属性。33%の確率で4ターンの間スタンさせる。 Magic Wand 魔法の杖 Its powers extend beyond the traditional schools of magic. -その力は、伝統的な魔法の流派を超えています。 -Deals charm damage (50% effectiveness vs. non-vulnerable enemies). 20% chance to stun the target for 2 turns. -魅力的なダメージを与えます (脆弱でない敵に対して 50% の有効性。20% の確率でターゲットを 2 ターンの間気絶させます。 -Feather -フェザー -A feather useful for tickling. -くすぐりに便利な羽根 -Deals tickle damage (50% effectiveness vs. non-vulnerable enemies). Distracts enemies. -くすぐりダメージを与えます (脆弱でない敵に対して 50% の有効性)。敵の気をそらします。 +伝統によって受け継がれてきた魔法の杖。 +Deals charm damage. 20% chance to stun the target for 2 turns. Offhand: +5 charm damage on attack for 3 stamina. +魅了属性。 20%の確率でターゲットを2ターンの間気絶させる。サブウェポン:攻撃時に追加でスタミナを3消費し、魅了属性ダメージ+5。 Ice Cube アイスキューブ A magical cube of ice that never melts. Convenient! 溶けない魔法の氷。便利! -Deals 10 ice damage with a 10% chance to freeze for 3 turns. -10%の確率で氷属性のダメージを与え、10%の確率で3ターン凍らせる。 +Deals 10 ice damage with a 10% chance to freeze for 1 turn. Slows targets on hit. Offhand: Slows the target. +10ポイントの氷属性ダメージを与え、10%の確率で1ターン凍結させる。サブウェポン:攻撃が命中した相手に減速状態を付与する。 Rope ロープ A kidnapper's most versatile tool. -誘拐犯の最も用途の広いツール。 +誘拐犯がよく使う道具。 Deals chain damage and applies 50 points of binding. -チェーンダメージを与え、50ポイントのバインディングを適用します。 -Enchanted Sword +チェーン属性。50ポイントの拘束値を付与する。 +Magic Sword 魔法の剣 Slices through ghosts with ease! -ゴーストを楽々斬る! +幽霊だってなます切り! A sword that guides itself toward its target, making it easy to hit with. -目標に向かって誘導し、打ちやすくする剣。 +敵を切りやすいようにアシストしてくれる便利な武器。 Dragonslaver ドラゴンスレイバー A powerful weapon with an ancient mechanism that launches binding belts. -バインドベルトを発射する古代のメカニズムを持つ強力な武器。 +拘束ベルトを発射する、古き時代に作られた特異な機構を持つ強力な武器。 Deals slash damage. Can make ranged attacks.. Drains 0.75% ancient energy to fire a line of belts that deal 40 chain damage and 40 binding. -斬撃ダメージを与えます。遠距離攻撃を行うことができます。0.75% の古代のエネルギーを吸収して、40 のチェーン ダメージと 40 のバインディングを与えるベルトのラインを発射します。 +斬撃属性。遠距離攻撃時、0.75%のエネルギーを使用し、40チェーン属性ダメージと40の拘束値を付与するベルトを発射する。 Metamorphosis -変態 +変身装置 You can enter slime form for 25 turns, which lets you pass thru bars, +50 Evasion, and deals 25 glue damage when attacked. -25ターンの間スライム形態に入ることができ、バーを通り抜け、回避+50、攻撃されたときに25の接着剤ダメージを与える. -Deals glue damage. Roots targets for 2 turns on a hit. -接着剤のダメージを与えます。ヒットすると、ターゲットを 2 ターン根絶します。 +25ターンの間、スライム形態になる。スライム状態では、バーを通り抜けることができ、回避力が50増加し、攻撃されたときにねばねばダメージを25与える. +Deals glue damage. Roots targets for 2 turns on a hit. Offhand: Roots targets on hit. +ねばねば属性。命中時、敵は2ターンの間スタンする。サブウェポン:敵を地面に拘束する。 Four Seasons -四季 +四季の杖 Activate to reduce the cost of your next fire, water/ice, air/lightning, and earth spell by 50, once per element. -発動すると、次の火、水/氷、風/雷、土の呪文のコストを、属性ごとに 1 回ずつ 50 減らす。 -Deals shadow damage. +25% fire, ice, acid, crush, electric, pressure damage. -影のダメージを与えます。+25% 火、氷、酸、粉砕、電気、圧力のダメージを与えます。 +発動すると、次の火、水/氷、風/雷、土の魔法のコストを、属性ごとに1回ずつ50減らす。 +Deals shadow damage. +25% fire, ice, soap, crush, electric, blast damage. Offhand: Applies passive bonus. +影属性。火、氷、ソープ、打撃、電気、爆発属性のダメージが25%増加する。サブウェポン:火、氷、ソープ、打撃、電気、爆発属性のダメージが25%増加する。 The Arbiter -アービター +裁定者の剣 I have altered the rules. Pray I do not alter them further. ルールを変更しました。これ以上変更しないでください。 -Deals chain damage with 110% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Ranged attack: Disarm -110% のバインド効率でチェーン ダメージを与え、召喚獣に +40 のシャドウ ダメージを与えます。+25% のりとチェーンのダメージ。遠距離攻撃: 武装解除 -Bondage Buster -ボンデージバスター -Can fire a beam (1 turn channel) that deals 30 electric damage, but charges when not fired, dealing 90 total damage at 10 turns of charge. -30 の電気ダメージを与えるビーム (1 ターン チャネル) を発射できますが、発射されていない場合は充電され、10 ターンの充電で合計 90 のダメージを与えます。 +Deals chain damage with 125% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Weapon Ability: Disarm +チェーン属性のダメージを与え、125%の威力で拘束値を増加させる。召喚物を攻撃する際、40ポイントの影属性追加ダメージを与える。チェーン属性とねばねば属性のダメージが25%増加する。アビリティ: 武装解除 +Bondage Buster EX +ボンデージバスターEX +Can fire a beam (1 turn channel) that deals 30 electric damage and applies an equal amount of energy bondage. Charges when not fired, dealing 90 total damage at 10 turns of charge. +1ターンかけてチャージし、30電気属性ダメージと拘束値を与えるビームを発射する。発射せずにいると充電され、10ターンの充電で合計90のダメージを与える。 Melee mode deals tickle damage and marks enemies as vulnerable for 4 turns. -近接モードはくすぐりダメージを与え、敵を 4 ターン脆弱としてマークします。 +近接モードではくすぐり属性のダメージを与え、敵に4ターンの間くすぐり弱点を付与する。 +Bondage Buster MK II +ボンデージバスターMkII +Can fire a beam (3 turn channel) that deals 35 electric damage in an area and applies an equal amount of energy bondage. While charge is below 50%, has a 10% chance to misfire. +3ターンかけてチャージし、35電気属性ダメージと拘束値を与えるビームを発射する。発射せずにいると充電される。充電が50%以下の場合、発射に失敗する可能性がある。 +Melee mode deals tickle damage and marks enemies as vulnerable for 2 turns. +近接モードではくすぐり属性のダメージを与え、敵に2ターンの間くすぐり弱点を付与する。 Nevermere Blaster -ネバーミアブラスター +ネバーミア・ブラスター Can fire a blast that deals 25 electric damage. -25の電気ダメージを与える爆発を発射できます。 +25ポイントの電気属性ダメージを与える銃弾を発射する。 Melee mode deals tickle damage. -近接モードはくすぐりダメージを与えます。 +近接モードではくすぐり属性のダメージを与える。 Blaster Shot ブラスターショット You set your blaster to stun and fire! -ブラスターを気絶させて発砲するように設定しました。 +ブラスターで狙いを定めた! Messenger of Love -愛の使者 +キューピットの弓矢 Love shines in many ways... -愛はさまざまな方法で輝きます... +愛はさまざまな方法で輝く…… Can fire an arrow that makes an enemy extremely lustful, causing them to attack others. Lasts forever on lesser enemies, 30 turns on high-level enemies, and 10 turns on bosses. -敵を非常に欲情させ、他の人を攻撃させる矢を放つことができます。下の敵には永遠に続き、高レベルの敵には30ターン、ボスには10ターン続きます。 +敵の興奮値を増加させ、同士討ちをさせる矢を放つ。弱い敵には永遠に続き、高レベルの敵には30ターン、ボスには10ターン効果が続く。 Moirai's Scissors モイライのはさみ -Safety first! -安全第一! -Deals slash damage. Adds up to 30 bonus psychic damage her hit by converting binding into damage. Drains 5 charge to attack twice. -斬撃ダメージを与えます。バインドをダメージに変換することで、最大 30 のボーナス サイキック ダメージを追加します。2 回攻撃するために 5 チャージをドレインします。 +Cutting the threads of fate. +運命を断ち切るもの。 +Deals slash damage. Ignores up to 100 Magic and Physical armor. Active ability: Spend 50 charge to free all nearby allies and disrobe enemies, increasing charm damage on them by 100% and applying the armor shred. +斬撃属性。物理/魔法アーマーを100まで無視する。アビリティ:エネルギーを50消費して近くの味方全員を拘束から解放し、敵の服を切り裂き、魅了属性ダメージを100%増加する。 +With a single snip of the magic scissors, everyone's clothes fall off. +一度鳴らすだけで周囲の服という服を切り刻む魔法のはさみ。 +No eligible targets within 4 tiles +4マス以内に対象が存在しない Latex Projector ラテックスプロジェクター Deals crush damage. Can be used to spray a '+' shaped pool of slime. -クラッシュダメージを与えます。スライムの+形のプールをスプレーするために使用できます。 -Drains 1.5% ancient energy to create a pool of slime that deals 35 glue damage per tile and slows enemies. -1.5% の古代のエネルギーを吸収して、タイルごとに 35 の接着剤ダメージを与え、敵を遅くするスライムのプールを作成します。 -Enchanted Axe +打撃属性。十字形のスライムプールを作ることができる。 +Spend 15 charge to create a pool of slime that deals 35 glue damage per tile and slows enemies. +エネルギーを15消費して、タイルごとに35のねばねば属性ダメージを与え、敵を減速状態にするスライムのプールを作成する。 +Magic Axe 魔法の斧 Sick and vile, like the hearts of your enemies. -あなたの敵の心のように、病気で卑劣です。 -Deals shadow damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns. -ターゲットに影ダメージを与え、あなたの隣の敵に20の影ダメージを与えます。3ターンの間遅くなります。 +病的で卑劣な刃。 +### Deals slash damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns and applies 60 shadow damage bleed over time to enemies around you. + Pickaxe つるはし Used for drilling holes in rock and armor. 岩や防具に穴を開けるのに使われる。 Deals pierce damage. Reduces enemy armor by 15 for 6 turns. -貫通ダメージを与える。6ターンの間、敵のアーマーを15減少させる。 -Enchanted Flail -魅惑のフレイル +刺突属性。6ターンの間、敵のアーマー値を15減少させる。 +Magic Flail +魔法のフレイル A blessed censer that distributes pain equally. -痛みを均等に分散する祝福された香炉。 -Deals crush damage to the target and all enemies near the target. -ターゲットとターゲットの近くのすべての敵に粉砕ダメージを与える。 -Enchanted Spear +群がる者共を平等に痛めつけるフレイル。 +### Deals crush damage. Deals 20 bonus holy damage to the target and enemies near the target. + +Magic Spear 魔法の槍 Seeks and pierces hearts with ease. -簡単に心を探し、突き刺す。 -Deals pierce damage to the target and two squares behind it. -ターゲットとその後ろの 2 マスに貫通ダメージを与えます。 -Enchanted Hammer +心臓をいともたやすく穿つ。 +Deals pierce damage to the target and two squares behind it. Can be used to make a ranged attack. +ターゲットとその後ろの2マスに刺突属性ダメージを与える。遠距離攻撃可能。 +Magic Hammer 魔法のハンマー Made of a magical, resonant material. -魔法の、共鳴する素材で作られています。 +魔法の共鳴する素材で作られている。 Deals crush damage and knocks the target back. Helps to bash open restraints while cutting. -クラッシュダメージを与え、ターゲットをノックバックします。切断中に拘束を打ち破るのに役立ちます。 -IceBreaker -砕氷船 -A frigid lightweight hammer with a spike on the end. -先端にスパイクが付いた極寒の軽量ハンマー +打撃属性。命中した敵をノックバックさせる。拘束具をこじ開ける用途で有効。 +Icebreaker +アイスブレイカー +A frigid magical hammer useful for both climbing up and destroying ice. +氷に刺して登ったり、砕いたりするための便利な魔法のハンマー。 Deals crush damage. Deals 3x damage to frozen targets instead of 2x. Triggers Shatter. -粉砕ダメージを与えます。凍結したターゲットに 2 倍ではなく 3 倍のダメージを与えます。シャッターをトリガーします。 +打撃属性。凍結したターゲットに2倍ではなく3倍のダメージを与える。粉々に砕け散る。 Dreamcatcher ドリームキャッチャー Forged in nightmares, woven in steel. Summons a Shadow Warrior on unaware targets for 2% ancient energy. -悪夢の中で鍛造され、鋼に織り込まれています。2% の古代のエネルギーで、気づいていないターゲットにシャドウ ウォリアーを召喚します。 -Deals shadow damage. Deals up to 30 bonus psychic damage on unaware (100%) or vulnerable (50%) targets. -シャドウ ダメージを与えます。認識されていない (100%) または脆弱な (50%) ターゲットに、最大 30 のボーナス サイキック ダメージを与えます。 +悪夢の中で鋼と共に鍛えられた武器。エネルギーを2%消費し、プレイヤーに気づいていないターゲットの周囲にシャドウウォリアーを召喚する。 +Deals shadow damage. Deals up to 30 bonus psychic damage on unaware (100%) or vulnerable (50%) targets. +影属性。こちらに気付いていない敵に30、弱体化状態の敵に15の精神属性の追加ダメージを与える。 Axe 斧 Great for cutting trees that happen to be underground. -たまたま地下にある木を切るのに最適です。 +地下に生えている木を切るのに最適。 Also deals 20 damage to enemies next to you. Deals slash damage. -隣の敵にも20ダメージ。斬撃ダメージを与える。 -Knife -ナイフ -Unarmed -非武装 -Accuracy: -正確さ: +斬撃属性。隣の敵にも20ダメージ。 +Accuracy: +命中: +Crit Multiplier: +会心ダメージ: +Bind Crit Multiplier: +拘束会心ダメージ: Find the keys.. -キーを見つける.. +鍵を見つける…… Find the exit! 出口を探せ! You are receiving help from a friendly ally. -あなたは友好的な味方から助けを受けています。 +味方の助力を得られる You found a hook you can use to pull on straps and loops. -ストラップやループを引っ張るために使用できるフックを見つけました。 -You have access to something sharp and can attempt to cut restraints. -あなたは鋭利なものにアクセスでき、拘束を切断しようとすることができます。 +ストラップや結び目を引っ張るためのフックを見つけた。 +You have access to something sharp and can attempt to Cut restraints, or Remove more effectively. +尖ったものを見つけた。効率よく拘束を切断したり、外すことができる。 You found a corner to help manipulate buckles and snaps with. -バックルとスナップを操作するのに役立つコーナーを見つけました。 +バックルやスナップを動かすためのカドを見つけた。 You found a crack and could maybe wedge a knife or tool into it to keep it still. -ひび割れを見つけたので、ナイフや道具を押し込んで動かないようにすることができます。 +ひび割れた場所がある。ナイフや道具を挟めば上手く拘束を切れるかもしれない。 You found something sticky and might be able to pull off fabrics. -粘着性のあるものを見つけたので、生地をはがすことができるかもしれません。 -Evasion: +ねばついた場所がある。上手く使えば拘束を引きはがせるかも。 +Evasion: 回避: -Visibility: -可視性: +Visibility: +視認性: + + Submissive: Enemies won't attack you, but they will try to play with you. -服従: 敵はあなたを攻撃しませんが、あなたと戯れようとします。 +服従: 敵は攻撃してこない。代わりに弄ばれる可能性がある。 On the Run! Enemies are hostile. -逃走中!敵は敵対的です。 +逃走中!敵が全力で追ってくる。 Prisoner: Enemies won't attack you unless you are out of jail. -囚人: 刑務所から出ない限り、敵はあなたを攻撃しません。 +囚人: 従っている限り、敵対はしない。 Freedom -フリーダム +自由 Crawling slowly! -ゆっくりクロール! +ゆっくりと這う Inching slowly! -ゆっくりインチング! +ゆっくりと歩く Hopping slowly! -ゆっくりホッピング! +ゆっくりと跳ぶ Slowed! -遅い! +遅くなった! Immobile! -不動! +動けない! Enclosed! -同封! +完全拘束! + + You feel a gentle buzz... -あなたは優しいうなりを感じます... +優しい振動を感じる…… Your toys tease you gently... -あなたのおもちゃは優しくあなたをからかいます... +オモチャが弱く振動する…… Your toys are vibrating. -おもちゃが振動しています。 +オモチャが振動している。 Your toys are buzzing strongly! -あなたのおもちゃは強くブンブン音を立てています! +オモチャが強く振動している! Your toys vibrate intensely! -あなたのおもちゃは激しく振動します! +オモチャが激しく振動している! The vibration is torturous! -振動は拷問です! +拷問のような振動を感じる! + + Edged! -エッジド! -Satisfied~ -満足~ -Damage: -ダメージ: -Accuracy: -正確さ: -SP Cost: -消費SP: +絶頂した! +Satisfied. Miscast chance is reduced. +満足した……。詠唱失敗率が減少する。 + + +Damage: +ダメージ: +Bind: +拘束: +Crit: +会心: +SP Cost: +SPコスト: +Cut PWR: AMNT% +切断力: AMNT% + + It appears to be a receptacle -受け皿のようです +クリスタルを設置する台座のようだ Place live crystal -ライブクリスタルを配置する +クリスタルを設置する Take the crystal -水晶を取る +クリスタルを取る You place the crystal into the receptacle and it lights up! -クリスタルをレセプタクルに入れると、ライトが点灯します! +クリスタルを設置すると、松明のように辺りを照らし出した! You take the crystal from the receptacle and all goes dark. -レセプタクルからクリスタルを取り出すと、すべてが暗くなります。 -You try to take the crystal but the cage around it is secured with a purple lock. -あなたはクリスタルを取ろうとしますが、その周りのケージは紫色のロックで固定されています. +クリスタルを取ると、辺りが暗くなっていった。 +### You try to take the crystal but the cage around it is secured with a magic purple lock. + Place spent crystal 使用済みクリスタルを置く VALUE gold vanishes from your satchel as the receptacle explodes and your crystal is recharged! -レセプタクルが爆発し、クリスタルが再充電されると、価値のあるゴールドがバッグから消えます! +カバンの中にあるゴールドと引き換えに、クリスタルがチャージされたようだ。 Nothing seems to happen -何も起こらないようです +何も起こらなかった + + The EnemyName grabs you by the RestraintName and keeps you in place! -EnemyName は RestraintName であなたをつかみ、その場に留まります! +EnemyName に RestraintName で掴まれて、引き止められた! The EnemyName grabs you and pulls you!!! -EnemyName があなたをつかみ、引っ張ります!!! +EnemyName に引っ張られた! The EnemyName misses you! -EnemyName はあなたがいなくて寂しいです! +EnemyName の攻撃は空振った! +You duck under the EnemyName's attack! +EnemyName の攻撃を躱した! + + You hear a door creak open nearby! -近くでドアがきしむ音がする! +近くでドアがきしむ音がした。 You hear the faint sound of a door opening. -ドアが開くかすかな音が聞こえます。 +ドアが開くかすかな音が聞こえた。 You hear a door slam shut nearby! -近くでドアがバタンと閉まる音がします! +近くでドアがバタンと閉まる音がした! You hear a door being shut in the distance. -遠くでドアが閉まる音がする。 +遠くでドアが閉まる音がした。 + + The slime is spreading over your body!!! -スライムがあなたの体に広がっています!!! +スライムが全身に広がっていく! The slime starts to harden over your skin... -スライムが肌の上で固まり始める… +スライムが固まり始めた…… + + +The RESTRAINTNAME creates more bindings out of thin air! (+RestraintAdded) +RESTRAINTNAME は空気から拘束具を作り出した! (+RestraintAdded) +A RESTRAINTNAME has appeared around your neck! Beware of additional restraints! +RESTRAINTNAME が首の周りに現れた!追加の拘束具に注意しよう。 +The RESTRAINTNAME has run out of bindings to add and has gone dormant for a period of time. +RESTRAINTNAME は追加する拘束具がなくなり、活動を停止した。 + + Angel 天使 You subdue the angel! -天使を討て! +天使を倒した! The angel decides to toy with you while you are trussed up. (DamageTaken) -天使は、あなたが縛られている間、あなたをもてあそぶことにしました。(DamageTaken) +縛られた体を天使が愛撫してきた。(DamageTaken) The angel snaps her fingers and divine restraints appear on your body! (+RestraintAdded) -天使が指をパチンと鳴らし、あなたの体に神聖な拘束が現れます! (+RestraintAdded) +天使が指を鳴らすと、突然体に聖なる拘束具が出現した! (+RestraintAdded) The angel snaps her fingers and glowing locks appear on your body! -天使が指をパチンと鳴らすと、あなたの体に光る髪の毛が現れます! +天使が指を鳴らすと、拘束具に聖なる錠が施された! + + Holy Construct -神聖な構造 +聖なる造物 You banish the holy construct! -あなたは聖なる構築物を追放します! +聖なる造物を追放してやった! The holy construct emits a searing light! (DamageTaken) -聖なる構築物が灼熱の光を放つ! (DamageTaken) +聖なる造物が灼熱の光を放つ! (DamageTaken) The holy construct emits a blinding light! (DamageTaken) -聖なる構築物がまばゆいばかりの光を放つ! (DamageTaken) +聖なる造物がまばゆい光を放つ! (DamageTaken) The holy construct emits a Binding light! (+RestraintAdded) -聖なる構築物が束縛の光を放つ! (+RestraintAdded) +聖なる造物が束縛の光を放つ! (+RestraintAdded) + + Be not afraid! I am the courier of a local shrine, and I have come to take your offering. -恐れるな!私は地元の神社の運び屋で、お供え物を受け取りに来た +恐れることなかれ、私は天より貢物を回収しに来ました。 Hold still and I will take the offering... -じっとしていて、お供えを受け取ります... +じっとしていなさい、すぐに回収しますから…… (She takes the gold) -(彼女は金を取る) +(お金を持っていった) Peace be with you! Goodbye! -ご冥福をお祈りします!さようなら! +あなたに祝福あれ、さようなら! You don't have the gold, do you? -あなたは金を持っていませんよね? +お金が足りませんよ? But do not fear, we will keep this between you and I... -でも恐れるな、これは君と僕の間だけに留めておこう… +でも心配いりません、建て替えてあげますから…… For I will first have a little fun... -だって、まずはちょっと楽しんでから… +だからちょっとだけ楽しませてくださいね……? You have brought this upon yourself, after all. -結局のところ、あなたはこれを自分自身にもたらしました。 +次からはちゃんとお金を持って来てくださいね。 + + The angel frowns as you attack her, and glowing rings appear. -あなたが彼女を攻撃すると、天使は眉をひそめ、輝くリングが現れます。 +あなたは天使に突然殴りかかった。彼女は困惑した表情を浮かべ、光輪を纏う。 + + Angel: MMMMMPHH!!! -天使:うーん! +天使:んむぅぅ! + + (The angel looks puzzled and unlocks your divine restraints) -(天使は困惑したように見え、あなたの神の拘束を解き放ちます) -Your ArmorName blocks the EnemyName's attack, falling off in the process. -あなたの ArmorName は EnemyName の攻撃をブロックし、その過程で落ちます。 +(天使は困惑しながら聖なる拘束具から解放してくれた) + + +The EnemyName pulls away your ArmorName!!! +EnemyName に ArmorName を引き剥がされた! +There was a bug removing your ArmorName. Please report! +ArmorName の不具合です。報告をお願いします。 The EnemyName bypasses your security to add the RestraintName! -EnemyName はセキュリティをバイパスして RestraintName を追加します! -The EnemyName attacks you, but you block the attack! -EnemyName はあなたを攻撃しますが、あなたはその攻撃をブロックします! -Blocked! -ブロックされた! +EnemyName は隙を見つけて RestraintName を追加した! +The EnemyName tries to restrain you, but you resist the bondage! +EnemyName に拘束されそうになったが、抵抗した! +Resist! +レジスト! + + Mystic Lock -ミスティックロック +神秘の錠 The mystic lock fades, allowing you to pass once more. -ミスティック ロックが消え、もう一度通過できるようになります。 +神秘の錠が消え、通過できるようになった。 As you cross the threshold, a mystical lock appears to prevent you from stepping back! -敷居を越えると、後戻りできない神秘的なロックが表示されます! -As you cross the threshold, a mystical lock appears to prevent you from stepping back! -敷居を越えると、後戻りできない神秘的なロックが表示されます! +突如ドアが閉まり、不思議な錠でロックされた! + + Metal Shield メタルシールド The shield falls to the floor. @@ -2270,30 +3382,34 @@ A metal shield blocks your way! 金属の盾が行く手を阻む! Several metal shields block your way! 複数の金属製の盾があなたの行く手を阻む! + + Illusion -イリュージョン +幻惑 The illusion vanishes into thin air. -幻想は消え去ります。 +幻惑は消え去った。 Wall 壁 The wall shatters into pieces, which fade away slowly. -壁は粉々に砕け散り、ゆっくりと消えていきます。 +壁は粉々に砕け散った。 +Locked Door +施錠済みのドア +The door lock shatters into pieces. +ドアは粉々に砕け散った! Earthen Monolith 土のモノリス The monolith recedes into the ground. -モノリスは地面に後退します。 +モノリスは地面沈んでいった。 Static Sphere -静止球 +スタティック・スフィア The sphere shrinks back into the storm dimension. -球体は収縮して嵐の次元に戻る +スフィアは収縮して荒れ狂う異次元に吸い込まれていった。 Familiar -見慣れた +使い魔 The familiar dissolves into spectral ash. -使い魔はスペクトルの灰に溶ける。 -Latex Doll -ラテックス人形 +使い魔は輝く灰になった。 The doll gives in to her desires and squirms around on the ground. -人形は彼女の欲望に屈し、地面でうごめく. +人形は快楽に耐えられず、地面にへたり込んだ。 Storm Crystal ストームクリスタル The storm crystal shatters into many crackling pieces. @@ -2301,2399 +3417,2925 @@ The storm crystal shatters into many crackling pieces. Fire Mote ファイアモート The fire mote is extinguished. -火のモートが消えました。 +ファイアモートは消火された。 Air Mote -エアモテ +エアモート The air mote returns to dust. -エアモートは塵に戻る。 +エアモートは塵へと還った。 Water Mote ウォーターモート The water mote turns into a puddle. -水たまりが水たまりに変わる +ウォーターモートはただの水たまりと化した。 Earth Mote アースモート The earth mote crumbles. -地球のかけらが崩れる +アースモートはバラバラと崩れ去った。 Shadow Warrior 影の戦士 The shadow warrior screeches as it vanishes into mist. -影の戦士は金切り声を上げて霧の中に消えていきます. +影の戦士は金切り声を上げて霧の中に消えていった。 Allied Golem -アライドゴーレム +召喚したゴーレム The words vanish from the golem's forehead as it crashes down. -言葉はゴーレムの額から崩れ落ちるように消える -Shopkeeper -店主 -You have done a terrible deed. -あなたはひどい行いをした。 +ゴーレムは崩れ去った。 + + Shopkeeper 店主 You have done a terrible deed. -あなたはひどい行いをした。 +とんでもないことをしてしまった。 + + Crystal Monolith クリスタルモノリス The crystal fades from the monolith. -モノリスから水晶が消えていく +モノリスから水晶が消えていった。 + + Orb Guardian -オーブガーディアン +オーブの守護者 The Orb Guardian dissolves into sand and bone dust. -オーブ ガーディアンは砂と骨の粉に溶けます。 +オーブの守護者は砂と骨に崩れた。 + + + + You feel like you have made a grave mistake. -あなたは重大な過ちを犯したように感じます。 +重大な過ちを犯したようだ。 + + Zombie ゾンビ The zombie moans and collapses to the ground. ゾンビは呻き、地面に倒れる。 The zombie's charms attach to your body (+RestraintAdded) -ゾンビの魅力が体に付く(+RestraintAdded) +ゾンビの包帯が体に張り付いてきた! (+RestraintAdded) The zombie caresses your body! (DamageTaken) -ゾンビがあなたの体を愛撫します! (DamageTaken) +ゾンビが冷たい指先で愛撫してきた! (DamageTaken) + + Maidforce Recruit -メイドフォース新兵 +新人メイド The maid does a fumbled retreat. -メイドは手探りの退却をします。 +メイドは慌てて逃げ去った。 The maid uses a fast-binding technique! (+RestraintAdded) -メイドは高速拘束技を使う! (+RestraintAdded) +メイドが高速拘束技を使ってきた! (+RestraintAdded) The maid snaps a lock on one of your restraints! (DamageTaken) -メイドがあなたの拘束具の 1 つをロックします! (DamageTaken) +メイドに拘束具を1つロックされた! (DamageTaken) The maid tickles you with her feather duster! (DamageTaken) -メイドが羽ばたきでくすぐる!(DamageTaken) +メイドが羽根でくすぐってきた!(DamageTaken) + + M.F. 'Unseen Blade' -M.F. 見えざる刃 +M.F. '見えざる刃' The maid runs back to the shadows. -メイドは影に逃げる。 +M.F. '見えざる刃'は影へと逃げた。 The maid uses secure restraints on you! (+RestraintAdded) -メイドがあなたをしっかり拘束!(+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -メイドがあなたの拘束具の 1 つをロックします! (DamageTaken) +メイドがしっかりと拘束してきた!(+RestraintAdded) The maid stealthily rubs your sensitive areas! (DamageTaken) -メイドさんがこっそりあなたの敏感なところをこっそりこすります!(DamageTaken) +メイドが突然秘所に指を這わせてきた!(DamageTaken) + + The maid throws a smoke bomb at the ground! -メイドが発煙弾を地面に投げつける! -M.F. 'Unseen Blade' -M.F. 見えざる刃 -The maid does a fumbled retreat. -メイドは手探りの退却をします。 +メイドは煙幕を地面に投げつけた! + + The maid rubs you from many angles! (DamageTaken) -メイドさんがいろんな角度からこすります!(DamageTaken) +メイドが色々な角度から愛撫してくる!(DamageTaken) + + M.F. 'Going Loud' -M.F. ゴーイング・ラウド -The maid does a fumbled retreat. -メイドは手探りの退却をします。 -The maid uses secure restraints on you! (+RestraintAdded) -メイドがあなたをしっかり拘束!(+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -メイドがあなたの拘束具の 1 つをロックします! (DamageTaken) +M.F. 'ゴーイング・ラウド' The maid lands a kick and stuns you! (DamageTaken) -メイドがキックを決めて気絶させます! (DamageTaken) +メイドの蹴りに怯んでしまった! (DamageTaken) The maid slaps you with a scornful expression! (DamageTaken) -メイドが軽蔑した表情で平手打ち! (DamageTaken) +メイドは侮蔑の眼差しを向けながら平手打ちをしてきた! (DamageTaken) + + +Heavy Weapons Maid +重装備メイド +The maid drops her weapon and runs. +メイドは武器を放り出して逃げ出した! +The maid bonks you with her weapon! (DamageTaken) +メイドに武器で殴られた! (DamageTaken) + + M.F. 'Parasol' M.F. 'パラソル' The maid leaps out of sight. -メイドは視界から飛び出します。 -The maid uses secure restraints on you! (+RestraintAdded) -メイドがあなたをしっかり拘束!(+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -メイドがあなたの拘束具の 1 つをロックします! (DamageTaken) +メイドが突然視界から消えた。 The maid caresses your breasts with a smile! (DamageTaken) -メイドさんが笑顔でおっぱいを愛撫してくれます!(ダメージ受け) +メイドが笑顔で胸を揉みしだいてきた!(DamageTaken) + + M.F. 'Master Plan' M.F. 'マスタープラン' The head maid surrenders gracefully. -メイド長は優雅に降伏します。 +M.F. 'マスタープラン'は優雅に降伏した。 The head maid suddenly whips out a restraint and locks it on! (+RestraintAdded) -メイド長がいきなり拘束具を出してロックオン! (+RestraintAdded) +M.F. 'マスタープラン'は高速で拘束してきた! (+RestraintAdded) The head maid snaps her fingers and you find your restraints locked! (DamageTaken) -メイド長が指をパチンと鳴らすと拘束具がロックされている! (DamageTaken) +M.F. 'マスタープラン'が指をパチンと鳴らすと突然拘束具がロックされた! (DamageTaken) The head maid tickles you strategically! (DamageTaken) -メイド長が戦略的にくすぐる!(DamageTaken) +M.F. 'マスタープラン'が熟練の手付きでくすぐってきた!(DamageTaken) You are distracted for a moment and suddenly you find yourself in chastity! -あなたは一瞬気を散らして、突然自分が純潔であることに気づきます! +気がつくと貞操帯を装着させられていた! + + Fire Elemental -ファイアエレメンタル +炎の精霊 The fire elemental dissolves into ash. -火のエレメンタルは溶けて灰になる。 +炎の精霊は灰になった。 The fire elemental conjures forged restraints around your limbs! (+RestraintAdded) -火のエレメンタルは、あなたの手足の周りに鍛造された拘束を呼び起こします! (+RestraintAdded) +炎の精霊は突然手足に拘束具を鍛造してきた! (+RestraintAdded) The fire elemental places a heavy lock on your restraint! (DamageTaken) -火のエレメンタルがあなたの拘束具を重くロックします! (DamageTaken) +炎の精霊は拘束具に強力な錠を取り付けた! (DamageTaken) The fire elemental touches you with her burning finger! (DamageTaken) -火のエレメンタルが燃える指であなたに触れます! (DamageTaken) +炎の精霊が燃え盛る指で触れてきた! (DamageTaken) + + Ranger of the Wild -野生のレンジャー +エルフのレンジャー The ranger disappears into the environment. -レンジャーは環境に消えます。 +レンジャーは背景へと消え去っていった。 The ranger gropes your chest with a smile on her face! (DamageTaken) -レンジャーが笑顔で胸を弄る!(DamageTaken) +レンジャーが笑顔で胸を揉みしだいてきた!(DamageTaken) The ranger surprises you and binds you! (+RestraintAdded) -レンジャーはあなたを驚かせ、あなたを縛ります! (+RestraintAdded) +レンジャーは突然拘束してきた! (+RestraintAdded) The ranger slips a lock onto one of your restraints! (DamageTaken) -レンジャーがあなたの拘束具の 1 つにロックをかけました! (DamageTaken) +レンジャーに拘束具を1つロックされた!(DamageTaken) + + Druid of the Wild -野生のドルイド -The druid calls forth vines to mask her retreat. -ドルイドは自分の退却を隠すために蔓を呼び寄せる。 +エルフのドルイド The druid calls forth vines to mask her retreat. -ドルイドは自分の退却を隠すために蔓を呼び寄せる。 +ドルイドは呼び出した蔦に紛れて逃げていった。 The druid holds your face and kisses you! (DamageTaken) -ドルイドはあなたの顔を抱えてキスをします! (DamageTaken) +ドルイドに顔を抱えられ、キスされた! (DamageTaken) The druid binds you with mithril restraints! (+RestraintAdded) -ドルイドはミスリルの拘束具であなたを拘束します! (+RestraintAdded) +ドルイドがミスリルの拘束具で拘束してきた! (+RestraintAdded) The druid tosses a lock from her cloak! It finds you and fastens with a click. (DamageTaken) -ドルイドは外套から錠前を放り投げます! それはあなたを見つけてカチッと固定します. (DamageTaken) +ドルイドは外套から錠前を投げてきた! (DamageTaken) + + Water Elemental -水の元素 +水の精霊 The water elemental melts into a pool of water. -水のエレメンタルは水のプールに溶けます。 +水の精霊は水に溶けていった。 The water elemental's song compels you to be bound! (+RestraintAdded) -水のエレメンタルの歌はあなたを束縛するように強制します! (+RestraintAdded) +水の精霊が歌うと、拘束具がどこからか湧いてきた! (+RestraintAdded) The water elemental sings a song of helplessness. (DamageTaken) -水のエレメンタルは無力の歌を歌う. (DamageTaken) +水の精霊は無力の歌を歌った。 (DamageTaken) The water elemental's song compels you to step forward and receive a binding! -ウォーターエレメンタルの歌は、前に出て束縛を受けることを強いる! +水の精霊の歌は、前に出て束縛を受けることを強いる! The water elemental sings an arousing song! (DamageTaken) -水のエレメンタルが喚起の歌をうたう! (DamageTaken) +水の精霊が興奮の歌をうたう! (DamageTaken) + + Ice Elemental -アイスエレメンタル +氷の精霊 The ice elemental melts into a pool of water. -氷のエレメンタルは水たまりに溶けます。 +氷の精霊は水たまりになった。 The ice elemental touches you, forming tendrils of ice! (+RestraintAdded) -氷のエレメンタルがあなたに触れ、氷の巻きひげを形成します! (+RestraintAdded) +氷の精霊に触れられたところが凍って拘束具になった! (+RestraintAdded) The ice elemental creates icy locks on your restraints! -氷の精霊が拘束具に氷のロックを作成します! +氷の精霊が拘束具に氷のロックを作成した! The ice elemental gives a chilling touch to your body! (DamageTaken) -氷のエレメンタルはあなたの体に冷たい感触を与えます! (DamageTaken) +氷の精霊の指先に体温を奪われる! (DamageTaken) + + Earth Elemental -アースエレメンタル +大地の精霊 The earth elemental sinks into the ground. -大地のエレメンタルは地面に沈みます。 +大地の精霊は地面に沈んでいった。 The earth elemental pins you and slaps on some restraints! (+RestraintAdded) -土のエレメンタルがあなたを固定し、いくつかの拘束を平手打ちします! (+RestraintAdded) +大地の精霊に地面に固定され、拘束具を付けられる! (+RestraintAdded) The earth elemental locks a restraint! -土のエレメンタルが拘束具をロック! +大地の精霊は拘束具をロックした! The earth elemental dashes through the earth! -土のエレメンタルが大地を駆ける! -The earth elemental gives you a heavy massage! (DamageTaken) -大地のエレメンタルが強烈なマッサージをしてくれます! (DamageTaken) +大地の精霊は大地を駆ける! +The earth elemental gives you a soft massage! (DamageTaken) +大地の精霊に優しくマッサージされた! (DamageTaken) + + + + Air Elemental -エアエレメンタル +風の精霊 There is no more elemental. Must have been just the wind. -エレメンタルはもうありません。ただの風だったに違いありません。 +風の精霊は風となり去っていった。 The air elemental sneakily slips a restraint on! (+RestraintAdded) -エアエレメンタルがこっそりと拘束具を装着! (+RestraintAdded) +風の精霊は気づかないうちに拘束具をつけてきた。 (+RestraintAdded) The air elemental blinks to your position! -エアエレメンタルがあなたの位置に点滅します! +風の精霊は瞬間移動してきた! The air elemental slips a lock on! (DamageTaken) -エアエレメンタルがロックオン!(DamageTaken) +風の精霊は拘束具を引っ張ってきた!(DamageTaken) The air elemental spanks you playfully! (DamageTaken) -エア エレメンタルがふざけてあなたをたたきます! (DamageTaken) +風の精霊はひっぱたいてきた!(DamageTaken) + + Angry Zombie -怒っているゾンビ -The zombie screams and tumbles to the floor. -ゾンビは悲鳴を上げて床に転がる。 -The zombie swiftly wraps you in charms! (+RestraintAdded) -ゾンビがあなたを素早く包み込みます! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -ゾンビがあなたの体を弄る! (DamageTaken) -Zombie -ゾンビ +怒れるゾンビ The zombie screams and tumbles to the floor. -ゾンビは悲鳴を上げて床に転がる。 +ゾンビは悲鳴を上げて床に転がりだした。 The zombie swiftly wraps you in charms! (+RestraintAdded) -ゾンビがあなたを素早く包み込みます! (+RestraintAdded) +ゾンビにテープで巻かれてしまった! (+RestraintAdded) The zombie gropes your body! (DamageTaken) -ゾンビがあなたの体を弄る! (DamageTaken) +ゾンビが体を愛撫してきた! (DamageTaken) + + +Support Drone +サポートドローン +The support drone retreats to recharge its weapon! +サポートドローンは弾薬の補充に撤退した! +The support drone zaps you! (DamageTaken) +サポートドローンに撃たれた! (DamageTaken) +The Dollmaker commands a drone to attack you! +ドールメイカーはドローンに攻撃命令を下した! +The Dollmaker commands her drones to attack you! +ドールメイカーはドローンに攻撃命令を下した! + + +Capture Drone +捕獲用ドローン +The capture drone's latex core overloads! +捕獲用ドローンのラテックスコアがオーバーロードした! +The capture drone grapples you! (DamageTaken) +捕獲用ドローンに掴まれた! (DamageTaken) +The capture drone wraps you in advanced cables! (+RestraintAdded) +捕獲用ドローンの射出するケーブルに捕まった! (+RestraintAdded) +The Dollmaker commands a drone to capture you! +ドールメイカーはドローンに捕獲命令を下した! +The Dollmaker commands her drones to capture you! +ドールメイカーはドローンに捕獲命令を下した! + + Artistic Zombie アーティスティックゾンビ The zombie smiles as it collapses to the ground. -地面に崩れ落ちるゾンビは微笑みます。 +ゾンビはほほえみながら地面に消えていった。 The zombie swiftly ties you! (+RestraintAdded) -ゾンビはあなたを素早く縛ります! (+RestraintAdded) +ゾンビが素早く縛ってきた! (+RestraintAdded) The zombie is somehow dextrous enough to lock your restraint! (DamageTaken) -ゾンビはどういうわけかあなたの拘束をロックするのに十分器用です! (DamageTaken) +ゾンビは器用な指先で拘束具をロックしてきた! (DamageTaken) The zombie cuddles with your body! (DamageTaken) -ゾンビがあなたの体に寄り添う!(DamageTaken) +ゾンビが体を抱き寄せてきた!(DamageTaken) + + Mage Zombie メイジゾンビ The zombie frowns and disappears in a puff of ice and ribbons. -ゾンビは眉をひそめ、氷とリボンのパフで消えます. +ゾンビは眉をひそめ、氷とリボンの渦に消えた。 The zombie smiles as she wraps you in charms! (+RestraintAdded) -ゾンビが笑顔であなたをお守りで包んでくれます! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -ゾンビがあなたの体を弄る! (DamageTaken) +ゾンビは笑顔でテープを巻き付けてきた! (+RestraintAdded) The zombie's ribbons form magical locks on your body! (DamageTaken) -ゾンビのリボンはあなたの体に魔法のロックを形成します! (DamageTaken) +ゾンビはリボンで魔法のロックを生成した! (DamageTaken) + + Talisman Zombie タリスマンゾンビ The zombie pouts and puts up a shield to let her retreat. -ゾンビは口をとがらせ、盾を構えて退却させます。 +ゾンビは不機嫌に口をとがらせ、盾を構えながら撤退した。 The zombie giggles as she wraps you in charms! (+RestraintAdded) -ゾンビがくすくす笑いながらあなたを魅力で包みます! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -ゾンビがあなたの体を弄る! (DamageTaken) +ゾンビがくすくす笑いながらテープを巻き付けてきた! (+RestraintAdded) The zombie uses a sealing spell to create magical locks! (DamageTaken) -ゾンビは封印の呪文を使って魔法のロックを作成します! (DamageTaken) +ゾンビは封印魔法を唱え、拘束具をロックしてきた! (DamageTaken) + + Warrior Zombie -ウォリアーゾンビ +ゾンビウォーリア The warrior zombie yells and falls cinematically. -戦士のゾンビは映画のように叫び、倒れます。 +ゾンビウォーリアは映画のように叫び、倒れこんだ。 The warrior zombie uses a traditional binding technique (+RestraintAdded) -戦士ゾンビは伝統の縛り技(+RestraintAdded) +ゾンビウォーリアは秘伝の捕縛術を繰り出してきた!(+RestraintAdded) The warrior zombie strikes you with her wooden sword! (+STUN) -戦士のゾンビが木刀であなたを攻撃します! (+STUN) +ゾンビウォーリアが木刀で殴りかかってきた! (+STUN) The warrior zombie runs its fingers along your body! (DamageTaken) -戦士のゾンビがあなたの体に指を走らせます! (DamageTaken) +ゾンビウォーリアが突然体に指を這わせてきた! (DamageTaken) The warrior zombie fights using the way of Sword and Lock. (DamageTaken) -戦士ゾンビは、ソードとロックの方法を使用して戦います。(DamageTaken) +ゾンビウォーリアの剣技に翻弄された隙に拘束具をロックされてしまった。(DamageTaken) + + Rope Artist -ロープアーティスト +縄師 The rope artist frowns and walks away, looking defeated. -ロープアーティストは眉をひそめ、敗北したように立ち去ります。 +縄師は眉をひそめ、逃げ去った。 The rope artist performs an intricate technique! (+RestraintAdded) -縄師が巧みな技を披露!(+RestraintAdded) +縄師が巧みな技を披露してきた!(+RestraintAdded) The rope artist sneaks a lock onto you while you weren't looking! (DamageTaken) -あなたが見ていない間に、ロープアーティストがこっそりとあなたに鍵をかける! (DamageTaken) +縄師に隙をつかれ、拘束具をロックされた! (DamageTaken) The rope artist smiles and tickles your feet! (DamageTaken) -なわ芸人が笑顔で足をくすぐる!(DamageTaken) +縄師が笑顔で足をくすぐってきた!(DamageTaken) + + Deputy -副 +保安官 The deputy surrenders her donuts. -副官は彼女のドーナツを差し出します。 +保安官はドーナツで手打ちを提案してきた。 The deputy slaps on some cuffs! (+RestraintAdded) -副官が袖口を平手打ち! (+RestraintAdded) +保安官に手錠をかけられた! (+RestraintAdded) The deputy tases you! (Stunned!) -副官があなたをテイスティングします! (気絶!) +保安官はテーザー銃を撃ってきた! (気絶) The deputy conducts a strip search! (DamageTaken) -副官が脱衣所捜索!(DamageTaken) +保安官が体の隅々まで身体検査をしてきた!(DamageTaken) The deputy performs a security enhancement procedure! (DamageTaken) -代理人がセキュリティ強化手順を実行します! (DamageTaken) +保安官がセキュリティ強化手順を実行してきた! (DamageTaken) + + Ninja Warrior -忍者戦士 +忍者 The ninja warrior retreats into the shadows. -忍者戦士は陰に退く +忍者は陰に退いた。 The ninja warrior uses a traditional binding technique (+RestraintAdded) -忍者戦士は伝統の縛り術を使う(+RestraintAdded) +忍者は伝統的な捕縛術を繰り出してきた!(+RestraintAdded) The ninja warrior tosses a shuriken and hits you! (Stunned!) -忍者の戦士が手裏剣を投げてあなたを殴る!(気絶!) +忍者が手裏剣を投擲してきた!(気絶) The ninja warrior uses a lock to give herself the upper hand! (DamageTaken) -忍者の戦士はロックを使って優位に立つ! (DamageTaken) +忍者は拘束具をロックしてきた! (DamageTaken) The ninja warrior uses a subduing technique! (DamageTaken) -忍者戦士は討伐術を使う!(ダメージテイクン) +忍者は柔術を使ってきた!(DamageTaken) + + Ninja Assassin -忍者暗殺者 +暗殺者 The assassin retreats into the shadows. -暗殺者は影に退く。 +暗殺者は陰に退いた。 The assassin uses a traditional binding technique (+RestraintAdded) -暗殺者は伝統的な拘束術を使用します(+RestraintAdded) +暗殺者は伝統的な捕縛術を繰り出してきた!(+RestraintAdded) The assassin uses a subduing technique! (DamageTaken) -暗殺者は討伐術を使う! (DamageTaken) +暗殺者は柔術を使ってきた!(DamageTaken) The assassin stealthily locks your restraint! (DamageTaken) -暗殺者はあなたの拘束をこっそりとロックします! (DamageTaken) +暗殺者は拘束具をロックしてきた! (DamageTaken) + + Animated Armor -アニメアーマー +さまよう鎧 The Animated Armor falls into pieces. -アニメイテッドアーマーは粉々に砕け散る。 +さまよう鎧は粉々に砕け散った。 The Animated Armor restrains you with shackles (+RestraintAdded) -アニメーションアーマーはシャックルであなたを拘束します (+RestraintAdded) +さまよう鎧は枷で拘束してきた! (+RestraintAdded) The Animated Armor hugs your body with an iron grip! (DamageTaken) -アニメイテッドアーマーは鉄のグリップであなたの体を抱きしめます! (DamageTaken) +さまよう鎧は鉄の体で抱きしめてきた! (DamageTaken) + + Mimic ミミック The mimic spills out its contents. -ミミックは中身をこぼします。 +ミミックは中身を落としていった。 The mimic spits out a restraint which latches onto you! (+RestraintAdded) -ミミックはあなたに引っかかる拘束を吐き出します! (+RestraintAdded) +ミミックは拘束具を吐き出してきた! (+RestraintAdded) The mimic tickles you with its tongue! (DamageTaken) -物まねが舌でくすぐる!(DamageTaken) +ミミックが舌でねぶってきた!(DamageTaken) + + Skeleton スケルトン The Skeleton falls to pieces. -スケルトンは粉々に落ちる。 +スケルトンは粉々になった。 The Skeleton restrains you! (+RestraintAdded) -スケルトンがあなたを拘束します! (+RestraintAdded) +スケルトンが拘束してきた! (+RestraintAdded) The Skeleton tackles you! (DamageTaken) -スケルトンがあなたにタックルします! (DamageTaken) +スケルトンがタックルしてきた! (DamageTaken) + + Dragonheart Initiate -ドラゴンハート・イニシエイト +見習いドラゴンハート The Dragonheart Initiate retreats hurriedly. -ドラゴンハート・イニシエートは急いで退却します。 +見習いドラゴンハートは急いで撤退した。 The Dragonheart Initiate apprehends you! (+RestraintAdded) -Dragonheart Initiate があなたを捕まえます! (+RestraintAdded) +見習いドラゴンハートに捕まった!(+RestraintAdded) The Dragonheart Initiate squeezes your body! (DamageTaken) -ドラゴンハート・イニシエートがあなたの体を圧迫します! (DamageTaken) +見習いドラゴンハートに抱きすくめられた! (DamageTaken) The Dragonheart locks your restraint! (DamageTaken) -ドラゴンハートが拘束をロックする! (DamageTaken) +見習いドラゴンハートに拘束具をロックされた!(DamageTaken) + + Dragonheart Shield -ドラゴンハートシールド +ドラゴンハート・シールダー The Dragonheart Shield makes a tactical retreat. -ドラゴンハート シールドは戦術的な後退を行います。 +ドラゴンハート・シールダーは戦術的撤退をした。 The Dragonheart Shield apprehends you! (+RestraintAdded) -ドラゴンハートシールドがあなたを捕らえます!(+RestraintAdded) +ドラゴンハート・シールダーに捕まった!(+RestraintAdded) The Dragonheart Shield bonks you! (DamageTaken) -The Dragonheart Shield はあなたを悩ませます! (DamageTaken) +ドラゴンハート・シールダーはぶん殴ってきた! (DamageTaken) The Dragonheart Shield squeezes your body! (DamageTaken) -ドラゴンハートシールドが体を締め付ける! (DamageTaken) -The Dragonheart locks your restraint! (DamageTaken) -ドラゴンハートが拘束をロックする! (DamageTaken) +ドドラゴンハート・シールダーが体を締め上げてきた!(DamageTaken) + + Ice Dragonheart -アイス・ドラゴンハート +ドラゴンハート・アイス The Ice Dragonheart retreats in a blast of snow. -氷の竜心は一陣の雪の中で後退する. +ドラゴンハート・アイスは雪の中へ逃げていった。 The Ice Dragonheart apprehends you! (+RestraintAdded) -氷のドラゴンハートがあなたを捕らえます! (+RestraintAdded) +ドラゴンハート・アイスに捕まった! (+RestraintAdded) The Ice Dragonheart gives your body a cold touch! (DamageTaken) -アイスドラゴンハートが体を冷やします!(ダメージテイクン) +ドラゴンハート・アイスが体を冷やしてきた!(DamageTaken) The Dragonheart uses an icy lock on your restraint! (DamageTaken) -ドラゴンハートはあなたの拘束に氷のロックを使用しています! (DamageTaken) +ドラゴンハート・アイスは拘束具に氷のロックをかけてきた!(DamageTaken) + + Poison Dragonheart -ポイズン・ドラゴンハート +ドラゴンハート・ポイズン The Poison Dragonheart retreats in a green mist. -毒のドラゴンハートは緑の霧の中に退却する。 +ドラゴンハート・ポイズンは緑の霧の中に消えていった。 The Poison Dragonheart apprehends you! (+RestraintAdded) -ポイズン ドラゴンハートがあなたを捕らえます! (+RestraintAdded) +ドラゴンハート・ポイズンに捕まった! (+RestraintAdded) The Poison Dragonheart smacks you with her axe! (DamageTaken) -ポイズン ドラゴンハートが斧であなたを叩きます! (DamageTaken) +ドラゴンハート・ポイズンが斧で打ち据えてきた! (DamageTaken) The Poison Dragonheart thrums her claws across your figure! (DamageTaken) -ポイズン ドラゴンハートがあなたの姿を爪で叩きます! (DamageTaken) -The Dragonheart locks your restraint! (DamageTaken) -ドラゴンハートが拘束をロックする! (DamageTaken) +ドラゴンハート・ポイズンは爪でひっかいてきた!(DamageTaken) +The Dragonheart locks your restraint using natural magics! (DamageTaken) +ドラゴンハートは自然の魔法で拘束具に錠をかけてきた! (DamageTaken) + + Crystal Dragonheart -クリスタル・ドラゴンハート +ドラゴンハート・クリスタル The Crystal Dragonheart screams and falls to the ground dramatically. -クリスタル ドラゴンハートは悲鳴を上げて、劇的に地面に倒れます。 +ドラゴンハート・クリスタルは大げさに悲鳴を上げて地面に突っ伏した。 The Crystal Dragonheart apprehends you! (+RestraintAdded) -クリスタル ドラゴンハートがあなたを捕らえます! (+RestraintAdded) +ドラゴンハート・クリスタルに捕まった!(+RestraintAdded) The Crystal Dragonheart squeezes you in a big hug! (DamageTaken) -クリスタル ドラゴンハートがあなたをぎゅっと抱きしめる! (DamageTaken) -The Dragonheart locks your restraint! (DamageTaken) -ドラゴンハートが拘束をロックする! (DamageTaken) +ドラゴンハート・クリスタルが抱きしめてきた!(DamageTaken) +The Dragonheart grows a crystalline lock on your restraints! (DamageTaken) +ドラゴンハート・クリスタルは拘束具にクリスタルを生やしてきた! (DamageTaken) + + Many crystals rise up out of the ground! -地中から湧き上がる無数のクリスタル! +地面から大量のクリスタルが湧き上がってきた! A crystal rises up out of the ground! -クリスタルが地面から立ち上がる! +地面からクリスタルが湧き上がってきた! + + + + Statue -銅像 +彫像 The statue topples over! -像が倒れた! -Statue -銅像 -The statue topples over and reveals a mechanism! -像が倒れてメカニズムが現れた! -Statue -銅像 +彫像は崩れ落ちた。 The statue topples over and reveals a mechanism! -像が倒れてメカニズムが現れた! +彫像が崩れ落ちて中から仕掛けが出てきた! The statue shoves a gag into your mouth, which inflates to fill the space! (+RestraintAdded) -彫像はあなたの口にギャグを押し込み、膨らませて空間を埋めます! (+RestraintAdded) +突然彫像に口の中にボールギャグを詰め込まれた! (+RestraintAdded) The statue kisses your gag! (DamageTaken) -彫像はあなたのギャグにキスします! (DamageTaken) +彫像はボールギャグ越しにキスをしてきた!(DamageTaken) + + Chaotic Crystal -混沌の結晶 +カオスクリスタル The crystal shatters! -クリスタルが砕け散る! -The chaotic crystal leeches willpower from you! (DamageTaken) -カオス クリスタル ヒルはあなたから意志力を奪います! (DamageTaken) +カオスクリスタルは砕け散った! +The chaotic crystal leeches energy from you! (DamageTaken) +カオスクリスタルにエネルギーを吸い取られた! (DamageTaken) + + Grand Chaotic Crystal -大混沌の結晶 +巨大カオスクリスタル The grand crystal shatters! -グランドクリスタルが砕け散る! -The grand crystal leeches willpower from you! (DamageTaken) -壮大な水晶の蛭はあなたからの意志力です! (DamageTaken) +巨大カオスクリスタルは砕け散った! +The grand crystal leeches energy from you! (DamageTaken) +巨大カオスクリスタルにエネルギーを吸い取られた! (DamageTaken) Crystals erupt from the ground and slowly grow around your limbs! (+RestraintAdded) -地面から結晶が噴出し、ゆっくりと手足の周りに成長します! (+RestraintAdded) +地面から結晶が噴出し、手足にまとわりついてきた! (+RestraintAdded) + + Soul Crystal ソウルクリスタル The crystal shatters into a puff of soul dust! -クリスタルが粉々になって魂の粉が舞い散る! -The soul crystal leeches willpower from you! (DamageTaken) -ソウルクリスタルはあなたから意志力を奪う! (DamageTaken) +ソウルクリスタルは砕け散った! +The soul crystal leeches strength from you! (DamageTaken) +ソウルクリスタルに力を吸い取られた! (DamageTaken) Active Soul Crystal -アクティブソウルクリスタル -The crystal shatters into a puff of soul dust! -クリスタルが粉々になって魂の粉が舞い散る! -The soul crystal leeches willpower from you! (DamageTaken) -ソウルクリスタルはあなたから意志力を奪う! (DamageTaken) +ソウルクリスタル(アクティブ) + + Shadow Dragonheart -シャドー・ドラゴンハート +ドラゴンハート・シャドー The Shadow Dragonheart frowns and runs away. -シャドウドラゴンハートは顔をしかめ、逃げる。 +ドラゴンハート・シャドーは不機嫌そうに逃げ去っていった。 The Shadow Dragonheart apprehends you! (+RestraintAdded) -シャドウドラゴンハートがあなたを捕まえます!(+RestraintAdded) +ドラゴンハート・シャドーに捕まった!(+RestraintAdded) +The Shadow Dragonheart conjures a shadowly lock! (DamageTaken) +ドラゴンハート・シャドーは影の錠を召喚してきた! (DamageTaken) The Shadow Dragonheart extends her scythe and pulls you closer!!! -シャドードラゴンハートが大鎌を伸ばして引き寄せる!!! +ドラゴンハート・シャドーに大鎌で引き寄せられた! The Shadow Dragonheart catches you with her scythe! (DamageTaken) -シャドウ ドラゴンハートは大鎌であなたを捕まえます! (DamageTaken) +ドラゴンハート・シャドーは大鎌で打ち据えてきた! (DamageTaken) + + + + + + Dragonheart Leader -ドラゴンハートリーダー +ドラゴンハート・リーダー The Dragonheart Leader admits defeat. -ドラゴンハートのリーダーは敗北を認めます。 +ドラゴンハート・リーダーは素直に敗北を受け入れた。 The Dragonheart Leader apprehends you! (+RestraintAdded) -ドラゴンハートのリーダーがあなたを捕まえます! (+RestraintAdded) +ドラゴンハート・リーダーに捕まった! (+RestraintAdded) The Dragonheart Leader dashes to you! -ドラゴンハートリーダーがあなたにダッシュします! +ドラゴンハート・リーダーが間合いを詰めてきた! The Dragonheart Leader squeezes your body! (DamageTaken) -竜心団長がお前の体を締め付ける! (DamageTaken) +ドラゴンハート・リーダーが抱きしめてきた! (DamageTaken) The Dragonheart Leader uses a lock on you! (DamageTaken) -ドラゴンハートのリーダーがあなたにロックをかけています! (DamageTaken) +ドラゴンハート・リーダーに拘束具をロックされた!(DamageTaken) + + Rebel Scum! -反逆のクズ! +反逆者 The Dragonheart Rebel admits defeat. -ドラゴンハートの反逆者は敗北を認めます。 +ドラゴンハートの反逆者は負けを認めた。 The Dragonheart Rebel apprehends you! (+RestraintAdded) -Dragonheart Rebel があなたを逮捕します! (+RestraintAdded) +ドラゴンハートの反逆者に捕まった! (+RestraintAdded) 'En garde!' -'用心する!' +'勝負だ!' The Dragonheart Rebel squeezes your body! (DamageTaken) -ドラゴンハートの反逆者があなたの体を圧迫します! (DamageTaken) -The Dragonheart Leader uses a lock on you! (DamageTaken) -ドラゴンハートのリーダーがあなたにロックをかけています! (DamageTaken) -Dryad -ドライアド -The dryad sinks into the ground. -ドライアドは地面に沈みます。 -The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) -ドライアドが腕を伸ばし、あなたを蔓で包みます! (+RestraintAdded) -The dryad sings a song that mesmerizes you! (DamageTaken) -ドライアドはあなたを魅了する歌を歌います! (DamageTaken) -The dryad tickles you with a leaf! (DamageTaken) -ドライアドが葉っぱでくすぐる!(DamageTaken) +ドラゴンハートの反逆者が抱きしめてきた! (DamageTaken) + + Dryad ドライアド The dryad sinks into the ground. -ドライアドは地面に沈みます。 +ドライアドは地面に沈んでいった。 The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) -ドライアドが腕を伸ばし、あなたを蔓で包みます! (+RestraintAdded) +ドライアドが腕を伸ばすと、蔦が全身に絡まってきた! (+RestraintAdded) The dryad sings a song that mesmerizes you! (DamageTaken) -ドライアドはあなたを魅了する歌を歌います! (DamageTaken) +ドライアドは不思議な歌をうたった! (DamageTaken) The dryad tickles you with a leaf! (DamageTaken) -ドライアドが葉っぱでくすぐる!(DamageTaken) +ドライアドが葉っぱでくすぐってきた!(DamageTaken) + + + + Highly-Motivated Doll -やる気満々の人形 +洗脳された人形 The doll falls to the ground, moaning loudly. -人形は大声でうめきながら地面に倒れます。 +人形はうめき声をあげながら倒れた。 The doll rubs her body against yours. You can feel the conduction. (DamageTaken) -人形は彼女の体をあなたの体にこすりつけます.あなたは伝導を感じることができます.(DamageTaken) +人形が体をこすりつけてきた。導電性になってしまった。(DamageTaken) The doll tackles you and squeezes you with her trembling legs! (DamageTaken) -人形がタックルし、震える足でぎゅっと握りしめる! (DamageTaken) +人形が震える足でタックルしてきた! (DamageTaken) + + Dollsmith ドールスミス The dollsmith's suit locks her wrists together and renders her helpless. -人形職人のスーツは彼女の手首を固定し、彼女を無力にします. +ドールスミスは自身のスーツに拘束された。 The dollsmith runs a latex-covered finger across your vulnerable body! (DamageTaken) -人形職人があなたの無防備な体にラテックスで覆われた指を走らせます! (DamageTaken) +ドールスミスはゴムで覆われた指で愛撫してきた! (DamageTaken) The dollsmith grabs you and applies her favorite doll restraints! (+RestraintAdded) -人形職人はあなたをつかみ、お気に入りの人形の拘束を適用します! (+RestraintAdded) +ドールスミスに掴まれ、人形用の拘束具を取り付けられた!(+RestraintAdded) The dollsmith slaps a lock onto your restraints! (DamageTaken) -人形職人があなたの拘束具に鍵をかけた! (DamageTaken) +ドールスミスに拘束具をロックされた!(DamageTaken) The dollsmith splashes a red latex concoction onto you! (+RestraintAdded) -人形職人があなたに赤いラテックス調合物をはねかけます! (+RestraintAdded) +ドールスミスに赤いゴムの液体をかけられた!(+RestraintAdded) + + Dollmaker's Apprentice -人形師見習い +ドールメイカーの手先 The dollmaker apprentice's suit becomes rigid and locks her limbs in place. -人形師見習いのスーツが固くなり、手足が動かなくなった。 +ドールメイカーの手先のスーツは固まってしまった。 The dollmaker's apprentice squeezes your body with her gloved hands! (DamageTaken) -人形師の見習いが手袋をはめた手であなたの体をぎゅっと握りしめます! (DamageTaken) +ドールメイカーの手先にゴムの手袋で抱きしめられた! (DamageTaken) The dollmaker's apprentice uses her staff to encase you in doll restraints! (+RestraintAdded) -人形師の見習いが杖を使ってあなたを拘束具で包む! (+RestraintAdded) +ドールメイカーの手先が杖を振るうと人形用の拘束具が取り付いてきた! (+RestraintAdded) The dollmaker's apprentice slips a lock onto your restraints! (DamageTaken) -人形師の見習いがあなたの拘束具に鍵をかけた! (DamageTaken) +ドールメイカーの手先に拘束具をロックされた!(DamageTaken) The dollmaker's apprentice unleashes a powerful latex blast! (+RestraintAdded) -人形師の見習いが強力なラテックスブラストを放ちます! (+RestraintAdded) -Alchemist -アルケミスト -The alchemist screams and runs. -錬金術師が悲鳴をあげて逃げる +ドールメイカーの手先が強力なラテックスブラスターを放ってきた!(+RestraintAdded) + + + + +...Alchemist? +……錬金術師? +You rescue the alchemist. +錬金術師を救出した。 The Alchemist restrains you! (+RestraintAdded) -錬金術士が拘束します!(+RestraintAdded) +錬金術士に拘束された!(+RestraintAdded) The alchemist hugs you in a rubbery embrace! (DamageTaken) -錬金術師がゴムのような抱擁であなたを抱きしめます! (DamageTaken) +錬金術師がゴムのような包容をしてきた! (DamageTaken) The alchemist uses an ornate-looking lock! (DamageTaken) -錬金術師が使う華麗な錠前!(DamageTaken) +錬金術師に華麗に拘束具をロックされた!(DamageTaken) + + +Alchemist +錬金術師 +The alchemist screams and runs. +錬金術師は悲鳴を上げて逃げていった。 + + Alchemist's Pet -アルケミストのペット +錬金術師のペット The wolfgirl escapes! -オオカミ少女が逃げる! -The wolfgirl lunges at you with a powerful kick! -オオカミ少女が強力な蹴りで突進してきます! +錬金術師のペットは逃げた! The wolfgirl lunges at you with a powerful kick! -オオカミ少女が強力な蹴りで突進してきます! +錬金術師のペットは強力なタックルを繰り出してきた! The wolfgirl cuddles with you! (DamageTaken) -オオカミ少女があなたに寄り添う!(DamageTaken) +錬金術師のペットがすり寄ってきた!(DamageTaken) + + Wolfgirl ウルフガール -The wolfgirl escapes! -オオカミ少女が逃げる! -The wolfgirl lunges at you with a powerful kick! -オオカミ少女が強力な蹴りで突進してきます! -The wolfgirl lunges at you with a powerful kick! -オオカミ少女が強力な蹴りで突進してきます! -The wolfgirl cuddles with you! (DamageTaken) -オオカミ少女があなたに寄り添う!(DamageTaken) + + Wolfguard ウルフガード The wolfguard's suit punishes her for poor performance! -ウルフガードのスーツは彼女のパフォーマンスの悪さを罰する! +ウルフガードはスーツに罰せられた! The wolfguard lunges at you and strikes you! -ウルフガードが突進して襲ってきます! -The wolfguard's escort drones electrocute you! (DamageTaken) -ウルフガードの護衛ドローンが感電死させます! (DamageTaken) +ウルフガードが突進してきた! +The wolfguard's escort drones shock you! (DamageTaken) +ウルフガードのドローンが電撃を放ってきた! (DamageTaken) The wolfguard's escort drones deploy some restraints! (+RestraintAdded) -ウルフガードの護衛ドローンが拘束を展開! (+RestraintAdded) +ウルフガードの護衛ドローンが拘束具を展開してきた! (+RestraintAdded) + + Wolfgirl Trainer -ウルフガールトレーナー +ウルフガールの調教師 The trainer retreats! -トレーナー退却! +ウルフガールの調教師は撤退した! The wolfgirl trainer squeezes your breasts playfully! (DamageTaken) -オオカミ少女トレーナーがふざけて胸を揉みしだきます!(DamageTaken) +ウルフガールの調教師が胸を揉んできた!(DamageTaken) The wolfgirl trainer secures you in training gear! (+RestraintAdded) -オオカミ少女トレーナーがトレーニングギアであなたを固定します! (+RestraintAdded) +ウルフガールの調教師にペット用拘束具で拘束されてしまった! (+RestraintAdded) The wolfgirl trainer pins you and skillfully locks all of your restraints! -オオカミ少女トレーナーがピンで留め、拘束具を巧みにロック! +ウルフガールの調教師に翻弄され、すべての拘束具をロックされた! + + Nevermere Operative ネバーミアの工作員 The operative does a fumbled retreat! -工作員が手探りで退却! +ネバーミアの工作員は必死に撤退した! The Nevermere Operative smiles and gropes your body! (DamageTaken) -Nevermere 工作員が微笑んであなたの体を弄ります! (DamageTaken) +ネバーミアの工作員は微笑みながら体を撫で回してきた! (DamageTaken) The Nevermere Operative apprehends you with training gear! (+RestraintAdded) -Nevermere 工作員がトレーニング ギアであなたを逮捕します! (+RestraintAdded) +ネバーミアの工作員にペット用拘束具で拘束されてしまった! (+RestraintAdded) The Nevermere Operative pins you and skillfully locks all of your restraints! -ネバーミアの工作員があなたをピン留めし、すべての拘束具を巧みにロックします! +ネバーミアの工作員に翻弄され、すべての拘束具をロックされた! + + Trainer's Apprentice -調教師見習い +見習い調教師 The trainer's apprentice escapes! -調教師見習いが逃げる! +見習い調教師は逃げた! The trainer's apprentice rubs her claws across your chest playfully! (DamageTaken) -トレーナーの見習いがふざけてあなたの胸を爪でこすります! (DamageTaken) +見習い調教師は乳首を爪弾いてきた! (DamageTaken) The trainer's apprentice secures you in training gear! (+RestraintAdded) -トレーナーの見習いがトレーニングギアであなたを固定します! (+RestraintAdded) +見習い調教師にペット用拘束具で拘束されてしまった! (+RestraintAdded) The trainer's apprentice adds a lock to your restraints. -トレーナーの見習いがあなたの拘束具にロックを追加します。 +見習い調教師に拘束具をロックされた! + + The Executive -エグゼクティブ +ネバーミアの役員 The executive surrenders gracefully. -エグゼクティブは優雅に降伏します。 +ネバーミアの役員は優雅に降伏した。 The Executive makes a persuasive argument! (DamageTaken) -エグゼクティブは説得力のある議論をします! (DamageTaken) +ネバーミアの役員は説得力のある議論をかましてきた! (DamageTaken) The Executive's drones apprehend you! (+RestraintAdded) -エグゼクティブのドローンがあなたを捕まえます! (+RestraintAdded) +ネバーミアの役員はドローンから拘束具を飛ばしてきた! (+RestraintAdded) The Executive's drones apply high-security locks to your restraints! -エグゼクティブのドローンは、あなたの拘束具に高度なセキュリティ ロックを適用します! +ネバーミアの役員のドローンに拘束具を高度な鍵でロックされた! + + Wolf Instructor -ウルフインストラクター +ウルフガールの教官 The instructor deploys active camoflague and retreats! -教官はアクティブカモフラージュを展開して退却します! -The instructor disciplies you! (DamageTaken) -インストラクターがあなたを訓練します!(DamageTaken) +ウルフガールの教官はアクティブカモフラージュを展開して退却した! +The instructor disciplines you! (DamageTaken) +ウルフガールの教官に訓練された!(DamageTaken) The instructor applies advanced training gear! (+RestraintAdded) -インストラクターが高度なトレーニングギアを適用します! (+RestraintAdded) +ウルフガールの教官に高度なペット用拘束具で拘束されてしまった! (+RestraintAdded) The instructor adds a lock to your restraints. -インストラクターが拘束具にロックを追加します。 +ウルフガールの教官に拘束具をロックされた! + + Nevermere Drone -ネバーミアドローン +ネバーミア・ドローン The drone loses power and falls to the ground! -ドローンは力を失い、地面に落ちます! +ネバーミア・ドローンは揚力を失い、地面に激突した! A Nevermere Drone takes off! -ネバーミアドローンが離陸! +ネバーミア・ドローンが離陸した! You hear buzzing as several Nevermere Drones take to the air! -数機のネバーミア ドローンが飛び立つと、ブーンという音が聞こえます! +数機のネバーミア・ドローンが飛び立つ音が聞こえた! + + Swarm of Tape Drones テープドローンの群れ The tape drones lose control and crash all over the place! -テープドローンは制御を失い、いたるところに墜落します! +テープドローンの群れは制御を失い、地面に散乱した! A swarm of tape drones takes flight! テープドローンの群れが飛び立つ! The air fills with buzzing as dozens of tiny drones lift off! -数十個の小さなドローンが離陸すると、空気はブンブンと鳴り響きます! +数十個の小さなドローンが離陸し、羽音が鳴り響く! The tape drones attach additional sticky layers! (DamageTaken) -テープドローンは追加の粘着層を取り付けます! (DamageTaken) +テープドローンの群れがテープの上から更にテープを重ねてきた! (DamageTaken) The tape drones circle around you, wrapping you in tape! (+RestraintAdded) -テープ ドローンがあなたの周りを一周し、あなたをテープで包みます! (+RestraintAdded) +テープ ドローンの群れはテープを吐き出しながら周囲を旋回してきた!(+RestraintAdded) + + Shield Drone シールドドローン The drone's power source explodes. -ドローンの動力源が爆発します。 +シールドドローンの動力源が爆発した! A Shield Drone takes off! -シールドドローンが離陸! +シールドドローンが離陸した! Several Shield Drones take flight, their shields interlinking. -複数のシールド ドローンが飛行し、シールドが連動します。 +シールドドローンが集まり、シールドが連動した! Drone Explosion ドローン爆発 + + Rusty Drone さびたドローン The drone's mechanisms grind to a halt. -無人機のメカニズムが停止します。 -The drone uses a short-ranged electrocution attack! (DamageTaken) -ドローンは近距離の感電攻撃を使用します! (DamageTaken) +さびたドローンは停止した。 +The drone uses a short-ranged electric attack! (DamageTaken) +ドローンは近距離用スタンガンを放った! (DamageTaken) The drone disassembles itself, revealing a set of restraining cables! (+RestraintAdded) -ドローンは分解し、拘束ケーブルのセットを明らかにします! (+RestraintAdded) +さびたドローンは分離して拘束ケーブルになった!(+RestraintAdded) + + Rusty Auto Taper -ラスティオートテーパー +錆びたテープドローン The auto taper's mechanisms grind to a halt. -自動テーパーのメカニズムが停止します。 +錆びたテープドローンのメカニズムが停止します。 The auto taper wraps additional layers of sticky tape! (DamageTaken) -自動テーパーは、粘着テープの追加の層を巻き付けます! (DamageTaken) +錆びたテープドローンはテープの上から更にテープを重ねてきた! (DamageTaken) The wraps you in many layers of tape! (+RestraintAdded) -何層ものテープであなたを包みます! (+RestraintAdded) +錆びたテープドローンが何層ものテープで拘束してきた! (+RestraintAdded) + + Rubber Blaster ラバーブラスター The turret enters an unstable state, about to spread rubber all over! -砲塔が不安定な状態になり、ゴムが飛び散りそうです! -The turret defends itself with a close-range electrocution attack! (DamageTaken) -砲塔は近距離電撃攻撃で防御!(DamageTaken) +ラバーブラスターは動作不良を起こした! +The turret defends itself with a close-range electric attack! (DamageTaken) +ラバーブラスターは近距離迎撃用電気ショックを放った! (DamageTaken) Rubber Launcher ラバーランチャー -The turret enters an unstable state, about to spread rubber all over! -砲塔が不安定な状態になり、ゴムが飛び散りそうです! -The turret defends itself with a close-range electrocution attack! (DamageTaken) -砲塔は近距離電撃攻撃で防御!(DamageTaken) -Drone -ドローン -The drone fizzles and falls to the ground! -ドローンがフワフワして地面に落ちる! -The drone zaps you with a restraining energy ray! (DamageTaken) -ドローンは抑制エネルギー光線であなたを攻撃します! (DamageTaken) -The drone uses a short-ranged electrocution attack! (DamageTaken) -ドローンは近距離の感電攻撃を使用します! (DamageTaken) -The drone attaches to you! (+RestraintAdded) -ドローンがあなたにくっつきます! (+RestraintAdded) + + Auto Capture Unit -オートキャプチャユニット +キャプチャーユニット The capture unit releases magic smoke and explodes. -キャプチャーユニットが魔法の煙を出して爆発する +キャプチャーユニットは魔法の煙を上げて爆発した。 The capture unit grabs you securely! (DamageTaken) -キャプチャーユニットがしっかり掴んでくれます!(DamageTaken) +キャプチャーユニットにがっしりと掴まれた!(DamageTaken) The capture unit extends its appendages and wraps them around you! (+RestraintAdded) -捕獲ユニットは付属肢を伸ばしてあなたの周りを包み込みます! (+RestraintAdded) +キャプチャーユニットは機械の触手で拘束してきた! (+RestraintAdded) The capture unit releases small drones which lock onto your restraints! (DamageTaken) -キャプチャーユニットは拘束具をロックする小さなドローンを放ちます! (DamageTaken) +キャプチャーユニットは拘束具をロックする小さなドローンを放ってきた! (DamageTaken) + + Auto Tape Unit -自動テープ装置 +テープユニット The tape unit releases magic smoke and explodes. -テープユニットが魔法の煙を出して爆発する +テープユニットは魔法の煙を上げて爆発した。 The tape unit applies many layers of tape! (DamageTaken) -テープユニットはテープを何層にも重ねます! (DamageTaken) +テープユニットはテープの上から更にテープを重ねてきた!(DamageTaken) The tape unit fires off many layers of sticky tape! (+RestraintAdded) -テープユニットは何層もの粘着テープを発射します! (+RestraintAdded) +テープユニットは大量のテープを発射してきた!(+RestraintAdded) The tape unit releases small drones which lock onto your restraints! (DamageTaken) -テープ ユニットは、あなたの拘束具をロックする小さなドローンを放ちます! (DamageTaken) +テープユニットは拘束具をロックする小さなドローンを放ってきた!(DamageTaken) + + Force Field Unit フォースフィールドユニット The forcefield unit releases magic smoke and explodes. -フォースフィールドユニットが魔煙を放ち爆発する -The forcefield electrocutes you! (DamageTaken) -力場があなたを感電死させます! (DamageTaken) +フォースフィールドユニットは魔法の煙を上げて爆発した。 +The forcefield unit zaps you! (DamageTaken) +フォースフィールドユニットに体当りされた! (DamageTaken) The forcefield unit extends its appendages and wraps them around you! (+RestraintAdded) -力場ユニットは付属肢を伸ばしてあなたの周りを包み込みます! (+RestraintAdded) +フォースフィールドユニットは機械の触手で拘束してきた!(+RestraintAdded) The forcefield unit releases small drones which lock onto your restraints! (DamageTaken) -力場ユニットが小型のドローンを放ち、拘束具をロックします! (DamageTaken) +フォースフィールドユニットは拘束具をロックする小さなドローンを放ってきた!(DamageTaken) + + Force Field Projector フォースフィールドプロジェクター The forcefield erupts into a shower of blue sparks! -力場が青い火花を散らす! +フォースフィールドプロジェクターが青い火花を散らす! The robot deploys a forcefield! -ロボットが力場を展開! +フォースフィールドプロジェクターはフィールドを展開した! The robot deploys a set of forcefields! -ロボットは一連の力場を展開します! +フォースフィールドプロジェクターロボットは複数のフィールドを展開した! +Drone +ドローン +The drone fizzles and falls to the ground! +ドローンは煙を上げながら墜落した! +The drone zaps you with a restraining energy ray! (DamageTaken) +ドローンは鎮圧用レーザーを放ってきた! (DamageTaken) +The drone attaches to you! (+RestraintAdded) +ドローンが張り付いてきた! (+RestraintAdded) + + +Cyber Warden +サイバーワーデン +The cyber warden's suit goes into lockdown, leaving her wiggling helplessly! +サイバーワーデンのスーツがロックダウンを起こし、彼女は拘束されてしまった! +The cyber warden applies an advanced locking technology! +サイバーワーデンが未知の技術で拘束具に高度な錠を施してきた! +The cyber warden grabs you and applies a self-tightening restraint! (+RestraintAdded) +サイバーワーデンに自動で締まる拘束具を取り付けられた! (+RestraintAdded) +The cyber warden's touch applies a series of quick electrical shocks! (DamageTaken) +サイバーワーデンに触れられると、電気ショックが起こる! (DamageTaken) +The cyber warden's touch applies a series of quick electrical shocks! +サイバーワーデンに触れられると、電気ショックが起こる! (DamageTaken) + + Auto Enforcer Unit -オートエンフォーサーユニット +エンフォーサーユニット The enforcer unit releases magic smoke and explodes. -エンフォーサーユニットが魔煙を放ち爆発する +エンフォーサーユニットは魔法の煙を上げて爆発した。 The enforcer unit fires many cables that squeeze you! (DamageTaken) -エンフォーサーユニットはあなたを圧迫する多くのケーブルを発射します! (DamageTaken) +エンフォーサーユニットは大量のケーブルで圧迫してきた! (DamageTaken) The enforcer fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) -エンフォーサーはあなたの体を包み込み、あなたを捕まえる拘束を発射します!(+RestraintAdded) +エンフォーサーユニットの放つ拘束具が全身を包み込む!(+RestraintAdded) The enforcer releases small drones which lock onto your restraints! (DamageTaken) -エンフォーサーはあなたの拘束具をロックする小さなドローンを放ちます! (DamageTaken) +エンフォーサーユニットは拘束具をロックする小さなドローンを放ってきた!(DamageTaken) + + Artillery Unit -砲兵ユニット +砲撃ユニット The artillery unit releases magic smoke and explodes. -砲兵部隊が魔煙を放ち爆発する +砲撃ユニットは魔法の煙を上げて爆発した。 The artillery unit fires many cables that squeeze you! (DamageTaken) -砲兵ユニットは、あなたを圧迫する多くのケーブルを発射します! (DamageTaken) +砲撃ユニットは大量のケーブルで圧迫してきた!(DamageTaken) The artillery fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) -大砲が拘束具を発射し、体を包み込んで捕らえます! (+RestraintAdded) +砲撃ユニットの放つ拘束具が全身を包み込む!(+RestraintAdded) The artillery releases small drones which lock onto your restraints! (DamageTaken) -大砲があなたの拘束具をロックする小さなドローンを放ちます! (DamageTaken) +砲撃ユニットは拘束具をロックする小さなドローンを放ってきた!(DamageTaken) + + The energy bolt hits you and paralyzes you! -エナジー ボルトが命中し、麻痺させます。 +エナジーボルトが命中し、麻痺してしまった! Energy Bolt -エネルギーショップ +エナジーボルト + + Alkahestor -アルカヘスター +大錬金術師 The alkahestor resigns to her fate. -アルカヘスターは彼女の運命に辞任する。 +大錬金術師は天に身を任せた。 The alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded) -アルカヘスターはあなたを包み込む液体のバイアルを放出します! (+RestraintAdded) +大錬金術師のはなった液体に包み込まれてしまった!(+RestraintAdded) The alkahestor uses an ornate-looking lock! (DamageTaken) -アルカヘスターは華麗な錠前を使っている! (DamageTaken) +大錬金術師にきれいな錠前で拘束具をロックされた! (DamageTaken) The alkahestor shoves you! (DamageTaken) -アルカヘスターが突き飛ばす! (DamageTaken) -Latex Elemental -ラテックスエレメンタル -The latex elemental melts into sticky rubber. -ラテックスのエレメンタルが溶けて粘着性のあるゴムになります。 -The latex elemental molds itself into restraints! (+RestraintAdded) -ラテックスのエレメンタルは、それ自体を拘束具に成形します! (+RestraintAdded) -The latex elemental slaps you with its appendages! (DamageTaken) -ラテックス エレメンタルが付属肢であなたを平手打ちします! (DamageTaken) +大錬金術師に突き飛ばされた! (DamageTaken) +...Alkahestor? +……大錬金術師? +You rescue the Alkahestor +大錬金術師を助け出した。 + + +Latex Homonculus +ラテックスのホムンクルス +The latex homonculus melts into sticky rubber. +ラテックスのホムンクルスは溶けてネバネバしたゴムになった。 +The latex homonculus molds itself into restraints! (+RestraintAdded) +ラテックスのホムンクルスの体の一部が拘束具に変化して襲いかかってきた! (+RestraintAdded) +The latex homonculus slaps you with its appendages! (DamageTaken) +ラテックスのホムンクルスに平手打ちされた! (DamageTaken) + + Rope Elemental -ロープエレメンタル +ロープの精霊 The rope elemental gets knotted and falls to the floor, inert. -ロープのエレメンタルが絡まり、力を失って床に落ちる。 +ロープの精霊はただのロープの塊になった。 The rope elemental's limbs lash out at you, wrapping themselves around your body! (+RestraintAdded) -ロープエレメンタルの手足があなたに襲いかかり、あなたの体を包み込みます! (+RestraintAdded) +ロープの精霊の手足が絡みついてきた! (+RestraintAdded) The rope elemental squeezes you tightly! (DamageTaken) -ロープエレメンタルがギュッと絞めてくる! (DamageTaken) +ロープの精霊に締め付けられた!(DamageTaken) + + Leather Elemental -レザーエレメンタル +革の精霊 The leather elemental sits down and sulks. -革のエレメンタルは座って不機嫌になる。 +革の精霊は不機嫌そうに座り込んだ。 The leather elemental wraps her long extremities around your body! (+RestraintAdded) -革の精霊が彼女の長い四肢をあなたの体に巻き付けます! (+RestraintAdded) +革の精霊に革製の長い四肢で絡みつかれた! (+RestraintAdded) The leather elemental strikes you with her leather belts! (DamageTaken) -革のエレメンタルが革のベルトであなたを攻撃します! (DamageTaken) +革の精霊に革ベルトで叩かれた! (DamageTaken) The leather elemental clicks a lock onto your restraints! (DamageTaken) -革のエレメンタルがあなたの拘束具にカチッと音を立てます! (DamageTaken) +革の精霊に拘束具をロックされた!(DamageTaken) + + Slime Enthusiast -スライム愛好家 +スライムオタク The slime enthusiast screams and runs. -スライム好きは悲鳴をあげて逃げる +スライムオタクは悲鳴をあげて逃げた。 The slime enthusiast restrains you! (+RestraintAdded) -スライム好きが拘束!(+RestraintAdded) +スライムオタクに拘束された!(+RestraintAdded) The slime enthusiast hugs you in a rubbery embrace! (DamageTaken) -スライム愛好家がゴムのように抱きしめてくれます! (DamageTaken) +スライムオタクがゴムのように抱きしめてきた! (DamageTaken) The slime enthusiast looks happy to make sure your restraints are secure! (DamageTaken) -スライム愛好家はあなたの拘束が安全であることを確認するためにうれしそうです! (DamageTaken) +スライムオタクは嬉しそうに拘束具をロックしてきた!(DamageTaken) + + Miner -マイナー +炭坑婦 The bandit tosses her pick to the ground and complains about her pay. -盗賊は自分のつるはしを地面に投げつけ、自分の給料について不平を言う。 +炭坑婦はつるはしを地面にたたきつけて自身の待遇を愚痴りだした…… The miner restrains you! (+RestraintAdded) -鉱山労働者があなたを拘束します! (+RestraintAdded) +炭坑婦に拘束された! (+RestraintAdded) The miner pins you with the haft of her pickaxe! (DamageTaken) -鉱山労働者がつるはしの柄であなたを固定します! (DamageTaken) +炭坑婦につるはしの柄で締められた! (DamageTaken) The miner pins you with the haft of her pickaxe and adds a lock! (DamageTaken) -鉱夫はつるはしの柄であなたを固定し、ロックを追加します! (DamageTaken) +炭坑婦につるはしの柄で締められ、拘束具をロックされた!(DamageTaken) + + You hear a fuse going off... -ヒューズが切れる音がする... +ヒューズの切れる音がした…… Miner Bomb -マイナーボム -Bandit -バンディット +ダイナマイト + + The bandit cries. You should feel bad. -山賊が泣く。気の毒だな -Bandit -バンディット +盗賊は泣き出した。後味が悪い…… + + The bandit collapses. -盗賊が倒れる +盗賊は倒れた。 The bandit restrains you! (+RestraintAdded) -盗賊があなたを拘束します! (+RestraintAdded) +盗賊に拘束された!(+RestraintAdded) The bandit smiles and applies a lock! (DamageTaken) -盗賊が微笑んでロックをかける!(DamageTaken) +盗賊は笑顔で拘束具をロックしてきた!(DamageTaken) The bandit caresses your restrained body! (DamageTaken) -盗賊が拘束されたあなたの体を愛撫します! (DamageTaken) +盗賊に身体を縛られて愛撫された! (DamageTaken) + + Shady Dealer -怪しげなディーラー +怪しげな商人 The dealer flees, leaving her goods behind. -商人は商品を置き去りにして逃げる。 +怪しげな商人は商品を置き去りにして逃げた。 The dealer uses some high-quality restraints on you! (+RestraintAdded) -ディーラーはあなたにいくつかの高品質の拘束を使用しています! (+RestraintAdded) +怪しげな商人におすすめの試供品を提供された! (+RestraintAdded) The dealer smiles and applies a lock! (DamageTaken) -ディーラーは笑顔でロックをかけます! (DamageTaken) +怪しげな商人は笑顔で拘束具をロックしてきた! (DamageTaken) The dealer kisses and gropes your body! (DamageTaken) -ディーラーはあなたの体にキスして弄ります! (DamageTaken) +怪しげな商人に身体を舐め回された! (DamageTaken) That dagger was laced with something... -あの短剣には何かが絡んでいた…… +あの短剣には何かが仕込まれていた…… You hear a shattering of glass, suddenly the air around you feels thick and moist... -ガラスが割れる音がして、突然周りの空気が濃く湿った感じがする… +ガラスの割れる音とともに、甘ったるい香りの霧が漂い始めた…… Poison Dagger ポイズンダガー Lust Bomb ラストボム + + Bandit Guard -バンディットガード +盗賊の歩哨 The bandit guard collapses and calls for help. -バンディットガードが倒れて助けを呼ぶ +盗賊の歩哨は倒れながら助けを呼んだ。 The bandit guard restrains you! (+RestraintAdded) -バンディットガードが拘束!(+RestraintAdded) +盗賊の歩哨に拘束された!(+RestraintAdded) The bandit rubs and caresses your restrained body! (DamageTaken) -盗賊が拘束されたあなたの身体を揉みしだく! (DamageTaken) +盗賊の歩哨に身体を縛られて愛撫された!(DamageTaken) The bandit scoffs and applies a lock! (DamageTaken) -盗賊は嘲笑ってロックをかけます! (DamageTaken) +盗賊の歩哨は嘲笑と共に拘束具をロックしてきた! (DamageTaken) + + Bandit Chief -バンディット チーフ +盗賊の長 The bandit scoffs and retreats until next time. -盗賊は嘲笑し、次の機会まで撤退します。 +盗賊の長は撤退した! The bandit restrains you tightly! (+RestraintAdded) -山賊がキッチリ拘束!(+RestraintAdded) +盗賊の長に拘束された!(+RestraintAdded) The bandit runs her hands all along your restrained body! (DamageTaken) -盗賊はあなたの拘束された体に手を走らせます!(DamageTaken) +盗賊の長に身体を縛られて全身を愛撫された!(DamageTaken) The bandit chuckles and applies a lock! (DamageTaken) -バンディットはくすくす笑い、ロックを適用します! (DamageTaken) +盗賊の長は嘲笑と共に拘束具をロックしてきた! (DamageTaken) + + Bandit Pet -バンディットペット +盗賊のペット The bandit blushes and runs away. -盗賊は顔を赤らめて逃げる +盗賊のペットは顔を赤らめて逃げた。 The girl nervously restrains you! (+RestraintAdded) -女の子がドキドキ拘束! (+RestraintAdded) -The bandit tickes you nervously! (DamageTaken) -盗賊はあなたを神経質にカチカチさせます! (DamageTaken) +盗賊のペットが慎重に拘束してきた! (+RestraintAdded) +The bandit tickles you nervously! (DamageTaken) +盗賊のペットはくすぐってきた! (DamageTaken) +### The bandit pet applies a lock! (DamageTaken) + Bandit Hunter -盗賊ハンター +盗賊のハンター The bandit hunter retreats. -盗賊ハンター退却 +盗賊のハンターは退却した。 The bandit hunter restrains you! (+RestraintAdded) -盗賊ハンターがお前を拘束する!(+RestraintAdded) +盗賊のハンターに拘束された!(+RestraintAdded) The bandit hunter caresses your restrained body! (DamageTaken) -山賊ハンターが拘束された体を撫でる!(ダメージテイクン) +盗賊のハンターに身体を縛られて全身を愛撫された!(DamageTaken) The bandit hunter calls you an amateur and applies a lock! (DamageTaken) -盗賊ハンターが素人と呼んでロックをかける!(DamageTaken) +盗賊のハンターは嘲りと共に拘束具をロックしてきた!(DamageTaken) + + Bandit Grappler -盗賊グラップラー +盗賊の鎖使い The bandit grappler retreats. -バンディット・グラップラーは後退する +盗賊の鎖使いは撤退した。 The bandit grappler loops her chains around you! (+RestraintAdded) -バンディット グラップラーがあなたの周りにチェーンをループさせます! (+RestraintAdded) +盗賊の鎖使いにチェーンを巻きつけられた!(+RestraintAdded) The bandit grappler caresses your restrained body! (DamageTaken) -盗賊グラップラーが拘束されたあなたの体を撫でる!(DamageTaken) +盗賊の鎖使いに身体を縛られて全身を愛撫された!(DamageTaken) The bandit giggles and applies a lock! (DamageTaken) -バンディットがくすくす笑ってロックをかけます! (DamageTaken) +盗賊の鎖使いは嘲笑と共に拘束具をロックしてきた!(DamageTaken) The bandit grappler hooks you closer!!! -バンディット グラップラーがあなたを引き寄せる!!! +盗賊の鎖使いに引き寄せられた! + + Mummy -ミイラ +バスト教の信徒 The Mummy collapses and her body vanishes. -ミイラは倒れ、彼女の体は消えます。 +バスト教の神官は倒れ、消え去った。 The Mummy conjures a mystic wrapping! (+RestraintAdded) -ミイラは神秘的なラッピングを呼び起こします! (+RestraintAdded) +バスト教の神官は奇妙な包帯を召喚した! (+RestraintAdded) +The Mummy conjures a magical lock upon you! (DamageTaken) +バスト教の信徒に魔法の錠で拘束具をロックしてきた! (DamageTaken) The Mummy punishes you with a blow from her staff! (DamageTaken) -ミイラが杖の一撃でお仕置き! (DamageTaken) +バスト教の神官が杖で叩いてきた! (DamageTaken) + + Cursed One 呪われし者 The Cursed One is drawn into an eldritch portal. -呪われた者は異界のポータルに引き込まれます。 +呪われた者は異界のポータルに引き込まれた。 The Cursed One's bindings transfer to you! (+RestraintAdded) -呪われた者の束縛があなたに移ります! (+RestraintAdded) +呪われた者の呪いを移された! (+RestraintAdded) The Cursed One's bindings emit a strange aura... (DamageTaken) -呪われし者の束縛が異様なオーラを放っている…(DamageTaken) +呪われし者の拘束具が奇妙なオーラを放っている……(DamageTaken) + + Floating Wrapping -フローティングラッピング +浮遊する包帯 The wrapping falls to the floor, its magic spent. -包みは床に落ち、魔力が尽きた +浮遊する包帯は魔力が付きて地面に落ちた。 The floating wrappings attach to you! (+RestraintAdded) -浮遊するラッピングがあなたにくっつきます! (+RestraintAdded) +浮遊する包帯が絡みついてきた! (+RestraintAdded) The wrappings grip you tightly and squeeze you! (DamageTaken) -ラッピングがギュッとギュッと締まる! (DamageTaken) +浮遊する包帯に締め付けられた! (DamageTaken) + + Animated Sarcophagus -アニメーションの石棺 +呪いの棺 The sarcophagus falls to the ground and crumbles. -石棺は地面に落ちて砕け散る。 +呪いの棺は地面に落ちて砕け散った。 The sarcophagus emits long wrappings that pull you closer! (+RestraintAdded) -石棺はあなたを引き寄せる長いラッピングを放出します! (+RestraintAdded) +呪いの棺に包帯で引き寄せられた! (+RestraintAdded) The sarcophagus emanates a strange power! (DamageTaken) -石棺が異様な力を発する!(DamageTaken) +呪いの棺が異様な力を発する!(DamageTaken) + + Bast Warrior -バストウォリアー +バスト教の戦士 The Bast Warrior collapses and meows loudly. -バスト・ウォリアーが倒れて大きな鳴き声をあげる +バスト教の戦士は鳴き声を上げて倒れた。 The Bast Warrior restrains you! (+RestraintAdded) -バストウォリアーが拘束する!(+RestraintAdded) +バスト教の戦士に拘束された!(+RestraintAdded) The Bast Warrior tickles you with her claws! (DamageTaken) -バスト ウォリアーが爪でくすぐる! (DamageTaken) +バスト教の戦士に爪でくすぐられた! (DamageTaken) The Bast Warrior pulls out a lock and slips it on! (DamageTaken) -バスト・ウォリアーがロックを抜いてかぶる!(DamageTaken) +バスト教の戦士に拘束をロックされた!(DamageTaken) + + + + +Bast High Cleric +バスト教の司祭 +The Bast High Cleric vanishes into a puff of ribbons. +バスト教の司祭はリボンの渦に消えていった。 +A ray of light shoots out and paralyzes you! (DamageTaken) +バスト教の神官は杖から一筋の光を発射してきた!(DamageTaken) +The Bast Cleric conjures wrappings upon you! (+RestraintAdded) +バスト教の司祭は大量の包帯を召喚してきた! (+RestraintAdded) +The Bast Cleric conjures a lock and slips it onto you! (DamageTaken) +バスト教の司祭は拘束具に錠を召喚してきた! (DamageTaken) + + Bast Cleric -バスト・クレリック +バスト教の神官 The Bast Cleric collapses and meows softly. -Bast Cleric は倒れ込み、静かにニャーと鳴きます。 -A ray of light shoots out and paralyzes you! (DamageTaken) -一筋の光を放ち麻痺させる!(DamageTaken) +バスト教の神官は倒れ込み静かに鳴いた。 The Bast Cleric restrains you! (+RestraintAdded) -Bast Cleric があなたを拘束します! (+RestraintAdded) -A ray of light shoots out and paralyzes you! (DamageTaken) -一筋の光を放ち麻痺させる!(DamageTaken) +バスト教の神官に拘束された!(+RestraintAdded) The Bast Cleric pulls out a lock and slips it on! (DamageTaken) -Bast Cleric がロックを引き出し、それを装着します! (DamageTaken) -Skeleton -スケルトン +バスト教の神官に拘束をロックされた! (DamageTaken) + + +High Cleric +バスト教の司祭 +The High Cleric locks herself in ritual bondage as punishment for failure. +バスト教の司祭は自らを罰するために自縛した。 +The High Cleric holds up her staff and you feel intense vibrations throughout your body! (DamageTaken) +バスト教の司祭が杖を振るうと、全身に強烈な振動が駆け巡った。 (DamageTaken) +The High Cleric summons animated restraints to bind you! (+RestraintAdded) +バスト教の司祭は生きた拘束具を召喚し、拘束してきた! (+RestraintAdded) +A flurry of mummy wrappings encase you and stun you! (DamageTaken) +大量の包帯に絡め取られ、気絶してしまった! (DamageTaken) +The High Cleric smiles as she conjures many locks on your restraints! (DamageTaken) +バスト教の司祭は笑顔で大量の錠を召喚してきた! (DamageTaken) + + The skeleton falls to pieces. -骸骨がバラバラに崩れる -The Skeleton restrains you! (+RestraintAdded) -スケルトンがあなたを拘束します! (+RestraintAdded) -The Skeleton tackles you! (DamageTaken) -スケルトンがあなたにタックルします! (DamageTaken) +スケルトンはバラバラに崩れた。 + + Ghost -おばけ +幽霊 The ghost vanishes. -幽霊が消える +幽霊は消え去った。 The Ghost restrains you! (+RestraintAdded) -ゴーストがあなたを拘束します! (+RestraintAdded) -The Ghost tickles you! (DamageTaken) -おばけがくすぐる! (DamageTaken) +幽霊に拘束された! (+RestraintAdded) +The Ghost enters your clothing and vanishes! +幽霊が服の隙間に入り込んできた! + + Revenant -レヴナント +悪霊 The revenant pouts as it vanishes. -レヴナントは消えるときに口をとがらせます。 +悪霊は不満そうな表情を浮かべながらたち消えた。 The revenant restrains you! (+RestraintAdded) -レヴナントが拘束!(+RestraintAdded) -The revenant squeezes your breasts! (DamageTaken) -レヴナントが胸を締め付ける!(DamageTaken) +悪霊に拘束された!(+RestraintAdded) +The revenant squeezes your breasts and slows you! (DamageTaken) +悪霊に胸を力任せに揉まれ、動きが鈍くなった!(DamageTaken) The revenant grabs you and caresses your tummy! (DamageTaken) -レヴナントがあなたを掴み、あなたのおなかを愛撫します! (DamageTaken) +悪霊にお腹を優しく撫でられた!(DamageTaken) + + Skeleton Warrior -スケルトンウォリアー +スケルトンの戦士 The skeleton warrior collapses and falls into pieces. -骸骨の戦士は崩れ落ち、ばらばらになる。 +スケルトンの戦士は崩れ落ち、ばらばらになった。 The Skeleton lands a wide, crippling blow! (DamageTaken) -スケルトンは広範囲に壊滅的な打撃を与えます! (DamageTaken) +スケルトンの戦士は得物を横に薙いだ!(DamageTaken) The Skeleton leashes you! -スケルトンがあなたをリードします! +スケルトンの戦士に引っ張られた! + + Skeleton Knight -骸骨の騎士 +スケルトンの騎士 The skeleton knight collapses and falls into pieces. -骸骨の騎士が崩れ落ちてバラバラになる +スケルトンの騎士は崩れ落ちた。 The skeleton apprehends you and pins you with the haft of its axe! (DamageTaken) -スケルトンはあなたを捕らえ、斧の柄であなたを固定します! (DamageTaken) +スケルトンの騎士に斧頭で固定された! (DamageTaken) The skeleton grabs you and slips a black cuff on! (+RestraintAdded) -骸骨があなたをつかみ、黒いカフをはめます! (+RestraintAdded) +スケルトンの騎士に掴まれ、黒い枷をはめられた!(+RestraintAdded) + + Vine Plant -植物が来る +蠢く蔦 The plant leaks purple juices everywhere as it wilts. -この植物は、しおれると紫色の汁をいたるところに漏らします。 +蠢く蔦は紫色の汁を撒き散らしながら枯れていった。 The vine plant whips you with its tendrils! (DamageTaken) -つる植物は巻きひげであなたを鞭打ちます! (DamageTaken) +蠢く蔦はつるで打ち据えてきた! (DamageTaken) The vine plant wraps its tendrils around you! (+RestraintAdded) -つる植物があなたの周りに巻きひげを巻きつけています! (+RestraintAdded) +蠢く蔦がつるで縛り上げてきた!(+RestraintAdded) The vine plant grips you tightly! (DamageTaken) -つる植物がぎゅっと抱きしめる! (DamageTaken) +蠢く蔦が締め付けてきた! (DamageTaken) + + +Vine Spitter +ツバ吐き蔦 +The vine spitter leaks purple juices everywhere as it wilts. +ツバ吐き蔦は紫色の汁を撒き散らしながら枯れていった。 +The vine spitter slaps you with its tendrils! (DamageTaken) +ツバ吐き蔦はつるで打ち据えてきた! (DamageTaken) +The vine spitter wraps its tendrils around you! (+RestraintAdded) +ツバ吐き蔦がつるで縛り上げてきた!(+RestraintAdded) +The vine spitter grips you tightly! (DamageTaken) +ツバ吐き蔦が締め付けてきた! (DamageTaken) + + Bramble -野ばら +いばら The brambles are hacked away. -イバラはハッキングされています。 +いばらは刈り取られた。 The bramble snares you! (DamageTaken) -イバラがあなたを捕まえる! (DamageTaken) +いばらに足を取られた! (DamageTaken) + + The red liquid bubbles and several round slimes pop out! -赤い液体の泡と丸いスライムが数個飛び出します! +赤い液体が泡立ち、数体のスライムになった! The red liquid bubbles and a round slime pops out! -赤い液体が泡立ち、丸いスライムが飛び出す! +赤い液体が泡立ち、丸いスライムが飛び出してきた! A revenant appears! -レヴナント登場! +悪霊が出現した! Fuuka uses a talisman to call forth the spirits of her pets! -ふうかはお守りでペットの精霊を呼び寄せる! +フウカが護符に力を込めると悪霊が寄ってきた! + + A pool of latex bubbles and a twisted elemental appears! -ラテックスの泡のプールとねじれたエレメンタルが出現! -The red liquid bubbles and a round slime pops out! -赤い液体が泡立ち、丸いスライムが飛び出す! -Latex Elemental -ラテックスエレメンタル -Latex Elemental -ラテックスエレメンタル -Red Slime -赤いスライム +ゴムの液体が泡立ち、精霊が現れた! + + +Latex Homunculus +ラテックス・ホムンクルス + + Red Slime 赤いスライム The red slime bounces away. -赤いスライムが跳ね返る +赤いスライムは跳ね返っていった。 The red slime bounces off you! (DamageTaken) -赤いスライムが跳ね返る!(DamageTaken) +赤いスライムが飛び跳ねてきた!(DamageTaken) The slime shoves itself into your mouth! (+RestraintAdded) -スライムが口の中に押し込む! (+RestraintAdded) +赤いスライムが口の中に入ってきた! (+RestraintAdded) + + Slime Mold 粘菌 The slime mold explodes into small puffs. -粘菌が小さなパフに爆発します。 +粘菌は四散した。 The slime mold is sticky and gross! (DamageTaken) -粘菌がベトベトで気持ち悪い! (DamageTaken) +粘菌がベトベトとくっついてきた! (DamageTaken) The slime mold attaches itself to your body! (+RestraintAdded) -粘菌が体にくっつく!(+RestraintAdded) +粘菌が身体に張り付いた!(+RestraintAdded) + + Mold Puff -モールドパフ +小さな粘菌 The mold puff explodes into small puffs. -モールドパフが小さなパフに爆発します。 +小さな粘菌は四散した。 The mold puff is sticky and gross! (DamageTaken) -カビパフがベタベタで気持ち悪い!(DamageTaken) +小さな粘菌がベトベトとくっついてきた! (DamageTaken) The mold puff leaps through the air! -カビパフが宙を舞う! +小さな粘菌が充満している! The mold puff attaches itself to your body! (+RestraintAdded) -モールドパフが体に密着!(+RestraintAdded) +小さな粘菌が身体に張り付いた!(+RestraintAdded) + + Slime Mold Nest -粘菌の巣 +粘菌の塊 The slime mold nest erupts into a shower of black particles! -粘菌の巣から黒い粒子のシャワーが噴き出す! +粘菌の塊から粘菌が噴出した! + + Many small pieces of slime mold break off! -粘菌の小さな破片がたくさん折れる! +粘菌の塊から小さな粘菌が漏れ出てきた! A mobile cyst emerges from the slime mold nest! -粘菌の巣から可動シストが出現! +粘菌の塊から粘菌が飛び出てきた! + + Factory Doll ファクトリードール The doll is subdued. -人形は鎮圧されています。 +ドールは制圧された。 +Freed Doll +逃走中のドール +The doll returns to her place. +ドールは居るべき場所に送られた。 + + Encased Adventurer -閉じ込められた冒険者 +スライムに包まれた冒険者 The encased adventurer loses hope. -閉じ込められた冒険者は希望を失う +スライムに包まれた冒険者は絶望した。 The encased adventurer moans as she throws herself against you for help! (DamageTaken) -閉じ込められた冒険者がうめき声をあげて助けを求めて身を投げる! (DamageTaken) +スライムに包まれた冒険者がうめき声をあげて飛び込んできた!(DamageTaken) The encased adventurer sticks to you as she mumbles incoherently! (DamageTaken) -閉じ込められた冒険者は、支離滅裂につぶやきながらあなたにくっつきます! (DamageTaken) -The encased adventurer (+RestraintAdded) -閉じ込められた冒険者(+RestraintAdded) +スライムに包まれた冒険者が支離滅裂につぶやきながら飛びついてきた! (DamageTaken) +The encased adventurer pleads for help as her slime spreads to you! (+RestraintAdded) +スライムに包まれた冒険者が懇願すると同時に、スライムが飛びかかってきた! (+RestraintAdded) + + Slime スライム The slime melts into a puddle. -スライムは水たまりに溶けます。 +スライムは溶けていった。 The sticky slime splashes against you! (DamageTaken) ねばねばしたスライムが飛び散る!(DamageTaken) The slime attaches itself to your body! (+RestraintAdded) -スライムが体にくっつく!(+RestraintAdded) +スライムが体にへばりついてきた!(+RestraintAdded) + + Bouncy Slime 弾むスライム -The slime melts into a puddle. -スライムは水たまりに溶けます。 The bouncy slime splashes against you! (DamageTaken) 弾むスライムが飛び散る!(DamageTaken) The bouncy slime leaps to you! -ぴょんぴょんスライムが君に飛びかかる! +弾むスライムが飛び込んできた! The bouncy slime attaches itself to your body! (+RestraintAdded) -弾むスライムが体にくっつく!(+RestraintAdded) +弾むスライムが体に張り付いてきた!(+RestraintAdded) + + Fast Slime -ファストスライム -The slime melts into a puddle. -スライムは水たまりに溶けます。 +素早いスライム The sticky slime leaps and splashes against you! (DamageTaken) -ねばねばスライムがぴょんぴょん飛び跳ねる!(DamageTaken) +素早いスライムが体当りしてきた!(DamageTaken) The slime leaps and attaches itself to your body! (+RestraintAdded) -スライムが跳ねて体にくっつく!(+RestraintAdded) +素早いスライムが飛びついてきた!(+RestraintAdded) + + Large Slime -大きなスライム +巨大スライム The large slime splits apart! -大きなスライムがバキバキ! -The sticky slime splashes against you! (DamageTaken) -ねばねばしたスライムが飛び散る!(DamageTaken) +巨大スライムは四散した! The slime spreads to your body! (+RestraintAdded) -スライムが体に広がる!(+RestraintAdded) +巨大スライムが体中に張り付いてきた!(+RestraintAdded) + + The slime splits into many smaller droplets! -スライムは多くの小さな水滴に分裂します! -Skeleton -スケルトン +巨大スライムは分裂した! + + The Skeleton falls into pieces. -スケルトンはバラバラになります。 -The Skeleton restrains you! (+RestraintAdded) -スケルトンがあなたを拘束します! (+RestraintAdded) +スケルトンはバラバラになった。 The Skeleton latches onto you! -スケルトンがあなたに引っ掛かります! +スケルトンが引っ張ってきた! + + Rope Tentacle ロープの触手 The rope kraken retreats its tentacle. -ロープクラーケンは触手を後退させます。 +ロープクラーケンは触手を引っ込めた。 The rope kraken squeezes you with one of its tentacles! (DamageTaken) -ロープ クラーケンが触手であなたを圧迫します! (DamageTaken) +ロープ クラーケンの触手に手繰り寄せられた! (DamageTaken) + + Rope Kraken -ロープクラッキング +ロープクラーケン The rope kraken devolves into a bundle of premium bondage rope. -ロープ クラーケンは、プレミアム ボンデージ ロープの束に進化します。 +ロープクラーケンは、珍しいロープの束になった。 The rope kraken tightly cinches itself around your body! (DamageTaken) -ロープクラーケンが体にピタッと密着! (DamageTaken) +ロープクラーケンが身体を縄で包み込んできた! (DamageTaken) + + Magic Rope 魔法のロープ The magic rope returns to being a normal rope. -魔法の縄が普通の縄に戻る +魔法のロープはただの縄になった。 The magic rope wraps itself tightly around your body! (+RestraintAdded) -魔法のロープがあなたの体をしっかりと包み込みます! (+RestraintAdded) +魔法のロープに縛り上げられた! (+RestraintAdded) The magic rope wriggles into your outfit! (DamageTaken) -魔法のロープがあなたの服にうごめきます! (DamageTaken) +魔法のロープが服の中を這い回ってきた! (DamageTaken) + + Cloud of Feathers -羽の雲 +羽の大群 The feathers fall to the floor. -羽が床に落ちます。 +羽の大群は床に落ちた。 The feathers tickle you mercilessly! (DamageTaken) -羽が容赦なくくすぐる!(DamageTaken) +羽の大群容赦なくくすぐってきた!(DamageTaken) + + Cloud of Scarves -スカーフの雲 +スカーフの大群 The scarves become knotted and fall to the floor. -スカーフが絡まって床に落ちる +スカーフの雲は絡まりあって床に落ちた。 The scarves wrap themselves around you! (+RestraintAdded) -マフラーがあなたを包み込みます! (+RestraintAdded) -The scarves rub against your body, tickling you! (DamageTaken) -マフラーが体をこすってくすぐる! (DamageTaken) +スカーフの雲に包み込まれた! (+RestraintAdded) +The scarves rub against your body, wrapping you in fluffy fabric! (DamageTaken) +スカーフの雲に優しく包まれた! (DamageTaken) + + Cloud of Ribbons -リボンの雲 +リボンの大群 The ribbons knot themselves in a bow and fall to the floor. -リボンが弓なりに結ばれ、床に落ちる。 +リボンの雲は絡まり合って床に落ちた。 The ribbons wrap themselves around you! (+RestraintAdded) -リボンがあなたを包み込みます! (+RestraintAdded) +リボンの雲に包み込まれた! (+RestraintAdded) The ribbons wrap themselves around you! (DamageTaken) -リボンがあなたを包み込みます! (DamageTaken) +リボンの雲に包み込まれた! (DamageTaken) + + Gravitating Gag -重力ギャグ +浮遊するボールギャグ The gag buckles itself in place and falls. -ギャグは所定の位置に座屈して落下します。 +浮遊するボールギャグは落下して動かなくなった。 The gravitating gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) -重力ギャグは口の中でしっかりとくさびをくさび、座屈します! (+RestraintAdded) -The gravitating gag rubs itself against your gagged lips! (DamageTaken) -重力ギャグは、あなたの猿轡かませた唇にこすりつけます! (DamageTaken) +浮遊するボールギャグが口の中に飛び込んできた! (+RestraintAdded) +The gravitating gag rubs itself against your lips! (DamageTaken) +浮遊するボールギャグが口の中でうごめいてきた! (DamageTaken) The gag dashes to you! -ギャグがキミに疾走! +浮遊するボールギャグが飛び込んできた! + + Seductive Shackles -魅惑的な束縛 +魅惑的な枷 The shackles' chain breaks as they fall to the floor. -足枷の鎖が床に落ちると切れる。 +魅惑的な枷はちぎれて床に落ちた。 The shackles force themselves around your limbs and click tightly! (+RestraintAdded) -足枷があなたの手足に押し付けられ、しっかりとカチッと音がします! (+RestraintAdded) +魅惑的な枷が四肢に取り付いてきた! (+RestraintAdded) The shackles click seductively in your face... (DamageTaken) -手枷があなたの顔を魅惑的にカチッと鳴らします... (DamageTaken) +魅惑的な枷はロックを鳴らして魅了してきた…… (DamageTaken) The shackles dash to you! -足枷があなたにダッシュします! +魅惑的な枷が飛び込んできた! + + Lurid Legbinder -ルリッド・レッグバインダー +恐怖のレッグバインダー The legbinder unravels. -レグバインダーが解けます。 +恐怖のレッグバインダーは解けた。 The legbinder zips itself around your legs and squeezes them together! (+RestraintAdded) -レグバインダーはあなたの足の周りにファスナーを締め、それらを一緒に締めます! (+RestraintAdded) +恐怖のレッグバインダーが両足を包み、ファスナーを閉められてしまった。(+RestraintAdded) The legbinder wraps around and squeezes your body! (DamageTaken) -レグバインダーが巻き付いて体を締め付ける!(ダメージ受け) +恐怖のレッグバインダーは巻き付いて体を締め上げてきた!(DamageTaken) + + Bratty Blindfold -ぶらぶらした目隠し +生意気な目隠し The blindfold floats to the floor. -目隠しが床に浮きます。 +生意気な目隠しは床に落ちた。 The blindfold buckles itself tightly around your head! (+RestraintAdded) -目隠しはあなたの頭の周りにしっかりと座ります! (+RestraintAdded) +生意気な目隠しが張り付いてきた! (+RestraintAdded) The blindfold crawls over your helpless face! (DamageTaken) -無力な顔に目隠しが這う! (DamageTaken) +生意気な目隠しが顔の上を這う! (DamageTaken) The blindfold dashes to you! -目隠しがあなたにダッシュ! +生意気な目隠しが飛び込んできた! + + Amorous Armbinder -好色な腕章 +好色なアームバインダー The armbinder flops to the floor. -アームバインダーは床に倒れます。 +好色なアームバインダーは床に落ちた。。 The armbinder slips itself around your arms and pushes your elbows together! (+RestraintAdded) -アームバインダーが腕に巻き付いて、肘を一緒に押します! (+RestraintAdded) +好色なアームバインダーは腕を包み込んできた!(+RestraintAdded) The armbinder rubs itself all over your body! (DamageTaken) -アームバインダーが全身をこすります! (DamageTaken) +好色なアームバインダーに全身をくまなく撫でられた!(DamageTaken) + + Stringent Straitjacket 厳格な拘束衣 The straitjacket falls apart. -拘束衣が崩れる +厳格な拘束衣はばらばらになった。 The straitjacket slips itself on over your head and pulls your arms close to your body! (+RestraintAdded) -拘束衣はあなたの頭の上に滑り込み、あなたの腕をあなたの体に近づけます! (+RestraintAdded) +厳格な拘束衣を着てしまった!(+RestraintAdded) The straitjacket squeezes you tightly! (DamageTaken) -拘束衣がギュッと締め付ける!(DamageTaken) +厳格な拘束衣が締め付けてきた!(DamageTaken) + + Brusque Belt -ブルスクベルト +無愛想な貞操帯 The chastity belt falls to the floor with a clang. -貞操帯がカチャカチャと床に落ちる +無愛想な貞操帯はカチャカチャと床に落ちた。 The chastity belt secures itself around your waist! (+RestraintAdded) -貞操帯で腰を固定!(+RestraintAdded) +無愛想な貞操帯が腰に張り付いた!(+RestraintAdded) The chastity belt buzzes against your body alluringly! (DamageTaken) -貞操帯が妖艶に体に鳴り響く!(DamageTaken) +無愛想な貞操帯が妖艶に体を鳴らした!(DamageTaken) + + Yammering Yoke -ヤマリングヨーク +やかましいヨーク The yoke falls to the floor with a loud clang. -カチャカチャと大きな音を立てて、くびきが床に落ちる。 +やかましいヨークは大きな音を立てて地面に落ちた。 The yoke clasps your arms tightly and forces them to the sides! (+RestraintAdded) -くびきがあなたの腕をぎゅっと握りしめ、横に押し出します! (+RestraintAdded) +やかましいヨークに無理やり固定されてしまった!(+RestraintAdded) The yoke makes alluring clicking noises! (DamageTaken) -くびきがカチカチという魅惑的な音を立てる! (DamageTaken) +やかましいヨークが魅力的に体を鳴らした!(DamageTaken) + + Haughty Harness 傲慢なハーネス The harness unravels. -ハーネスが解ける。 +傲慢なハーネスは解けた。 The harness buckles itself tightly around your body! (+RestraintAdded) -ハーネスはあなたの体にしっかりと固定されます! (+RestraintAdded) +傲慢なハーネスはしっかりとまとわりついてきた。(+RestraintAdded) The harness dashes to you! -ハーネスがあなたにダッシュします! +傲慢なハーネスが飛び込んできた! The harness wraps itself around your body and squeezes! (DamageTaken) -ハーネスが体に巻き付いてギュッと締まります! (DamageTaken) +傲慢なハーネスに締め付けられた! (DamageTaken) + + Levitating Locks -浮揚ロック +浮遊する錠前達 The locks and chains fall to the floor in a loud crash. -大きな音を立てて錠前と鎖が床に落ちた。 +浮遊する錠前達は大きな音を立てて墜落した。 A lock clicks itself onto one of your restraints! (+RestraintAdded) -ロックが拘束の 1 つにカチッと音を立てます! (+RestraintAdded) +浮遊する錠前達の一つが拘束具と化して飛び込んできた!(+RestraintAdded) A chain locks itself in place on your body! (DamageTaken) -チェーンがあなたの体の所定の位置にロックされます! (DamageTaken) +浮遊する錠前達が拘束具に絡まり鍵となった! (DamageTaken) The lock dashes to you! -ロックがあなたにダッシュします! +浮遊する錠前達が飛び込んできた! The floating locks and chains rub themselves across your body! (DamageTaken) -浮いている錠前と鎖が体をこすります! (DamageTaken) +浮遊する錠前達は身体を擦り合わせてきた!(DamageTaken) + + +Masterful Lock +完璧な錠前 +The lock falls to the floor, disenchanted. +完璧な錠前は魔力をなくして床に落ちた。 +The Masterful Lock clicks seductively in your face! (DamageTaken) +完璧な錠前が顔の前で錠を鳴らしてきた! (DamageTaken) +The Masterful Lock conjures a lock onto one of your restraints! (DamageTaken) +完璧な錠前が拘束具に錠前を取り付けてきた! (DamageTaken) + + Conjured Gag -召喚ギャグ +召喚されたボールギャグ The conjured gag buckles itself in place and falls. -召喚されたギャグは所定の位置に座屈して落下します。 +召喚されたボールギャグは落下した。 The gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) -ギャグはあなたの口の中でしっかりとくさびで締められます! (+RestraintAdded) +召喚されたボールギャグは口の中に飛び込んできた!(+RestraintAdded) The gag rubs itself against you! (DamageTaken) -猿轡がこすれる! (DamageTaken) +召喚されたボールギャグが唇をこする! (DamageTaken) + + Learned Rope -学んだロープ +賢いロープ The learned rope untangles into a mess of rope. -習得したロープは絡み合ったロープにほどけます。 +賢いロープは解けた。 The magic rope wraps itself intricately around your body! (+RestraintAdded) -魔法のロープがあなたの体を複雑に包み込みます! (+RestraintAdded) +賢いロープが複雑に縛り上げてきた!(+RestraintAdded) The rope dashes to you! -ロープがあなたにダッシュします! -The magic rope wriggles into your outfit! (DamageTaken) -魔法のロープがあなたの服にうごめきます! (DamageTaken) +賢いロープは飛び込んできた! + + Unforseen Rope -予期せぬロープ +不可視のロープ The unforseen rope is gone... or is it? -予期せぬロープがなくなった……それとも? +不可視のロープを倒した。多分。 The unforseen rope wraps itself clandestinely around your body! (+RestraintAdded) -予期せぬロープがあなたの体に密かに巻き付いています! (+RestraintAdded) +不可視のロープがいつの間にか絡まり付いていた! (+RestraintAdded) The unforseen rope wriggles into your outfit! (DamageTaken) -予期せぬロープがあなたの服にうごめきます! (DamageTaken) +不可視のロープが服の中でうごめいた! (DamageTaken) + + Monster Rope モンスターロープ The monster rope bundle collapses into a pile of ropes. -モンスターロープの束が崩れてロープの山になる。 +モンスターロープはただの縄の束になった。 The magic rope wraps itself overwhelmingly around your body! (+RestraintAdded) -魔法のロープが圧倒的に体を包み込む!(+RestraintAdded) -The magic rope wriggles into your outfit! (DamageTaken) -魔法のロープがあなたの服にうごめきます! (DamageTaken) +モンスターロープに圧倒的な物量で包み込まれた!(+RestraintAdded) + + Shock Witch -ショックウィッチ +電気の魔女 The shock witch vanishes into a cloud of thunder, leaving behind a keyring. -ショックウィッチはキーリングを残して雷雲となって消えた. -The witch restraints you! (+RestraintAdded) -魔女が拘束する!(+RestraintAdded) +電気の魔女はキーホルダーを残して雷雲に消えた。 +The witch restrains you! (+RestraintAdded) +魔女に拘束された! (+RestraintAdded) The witch dangles a lock in front of you before putting it on! (DamageTaken) -魔女はロックをかける前にあなたの前にロックをぶら下げます! (DamageTaken) +魔女はロックを見せつけた後、拘束具をロックしてきた!(DamageTaken) The witch slaps you playfully! (DamageTaken) -魔女がふざけて平手打ち! (DamageTaken) +魔女が平手打ちしてきた! (DamageTaken) + + Flame Witch 炎の魔女 The flame witch vanishes into a pile of ash. -炎の魔女は灰の山に消えます。 -The witch restraints you! (+RestraintAdded) -魔女が拘束する!(+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -魔女はロックをかける前にあなたの前にロックをぶら下げます! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -魔女がふざけて平手打ち! (DamageTaken) +炎の魔女は灰の山に消えた。 + + Earth Witch -アースウィッチ +土の魔女 The earth witch vanishes into a pile of ash. -土の魔女は灰の山に消える -The witch restraints you! (+RestraintAdded) -魔女が拘束する!(+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -魔女はロックをかける前にあなたの前にロックをぶら下げます! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -魔女がふざけて平手打ち! (DamageTaken) +土の魔女は灰の山に消えた。 + + Water Witch 水の魔女 The water witch vanishes into a pile of ash. -水の魔女は灰の山に消えます。 -The witch restraints you! (+RestraintAdded) -魔女が拘束する!(+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -魔女はロックをかける前にあなたの前にロックをぶら下げます! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -魔女がふざけて平手打ち! (DamageTaken) +水の魔女は灰の山に消えた。 + + +Aqua Witch +水泡の魔女 +The aqua witch vanishes into a pile of ash. +水泡の魔女は灰の山に消えた。 + + Ice Witch 氷の魔女 The ice witch vanishes into a pile of ash. -氷の魔女は灰の山に消えます。 -The witch restraints you! (+RestraintAdded) -魔女が拘束する!(+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -魔女はロックをかける前にあなたの前にロックをぶら下げます! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -魔女がふざけて平手打ち! (DamageTaken) +氷の魔女は灰の山に消えた。 + + + + Magic Stone 魔石 Ice Bolt アイスボルト Waterblast ウォーターブラスト + + Rope Witch 縄の魔女 The rope witch retreats as her animated ropes chase her. -縄の魔女は、アニメーションの縄が彼女を追いかけると後退します。 -The witch restraints you! (+RestraintAdded) -魔女が拘束する!(+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -魔女はロックをかける前にあなたの前にロックをぶら下げます! (DamageTaken) -The witch slaps you playfully! (DamageTaken) -魔女がふざけて平手打ち! (DamageTaken) +縄の魔女は、自身の縄に追いかけられていった。 + + Magnet Witch -マグネットウィッチ +磁力の魔女 The witch is pulled away by an unseen force. -魔女は目に見えない力で引き離される +磁力の魔女は斥力で吹き飛ばされた。 The witch's restraints fly out and attach themselves to you! (+RestraintAdded) -魔女の拘束具が飛び出して君にくっつく! (+RestraintAdded) -The witch dangles a lock in front of you before putting it on! (DamageTaken) -魔女はロックをかける前にあなたの前にロックをぶら下げます! (DamageTaken) +魔女が拘束具を射出した! (+RestraintAdded) The witch's lightning causes your body to tingle! (DamageTaken) -魔女の稲妻で体がヒリヒリ!(ダメージテイクン) -Witch's Apprentice -魔女見習い +魔女は電気の力で攻撃してきた!(DamageTaken) + + +### Mage's Apprentice + The apprentice runs off and cries in a corner. -見習いは走り去り、隅で泣きます。 +見習い魔女は走り去り、隅で泣き出した。 The apprentice animates restraints to wrap around you! (+RestraintAdded) -見習いはあなたを包み込むように拘束をアニメーション化します! (+RestraintAdded) +見習い魔女はたどたどしい手つきで拘束してきた!(+RestraintAdded) The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) -見習いがドキドキしながら錠前を出して着させます!(DamageTaken) +見習い魔女が初々しく拘束具をロックしてきた!(DamageTaken) The apprentice slaps you playfully! (DamageTaken) -見習いがふざけて平手打ち!(DamageTaken) +見習い魔女が平手打ちしてきた!(DamageTaken) + + Summoner's Apprentice -召喚士の見習い -The apprentice runs off and cries in a corner. -見習いは走り去り、隅で泣きます。 +見習い召喚士 The apprentice summons a restraint onto you! (+RestraintAdded) -見習いがあなたに拘束を召喚します! (+RestraintAdded) -The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) -見習いがドキドキしながら錠前を出して着させます!(DamageTaken) +見習い召喚士が拘束具を召喚してきた!(+RestraintAdded) The apprentice tickles you playfully! (DamageTaken) -見習いがふざけてあなたをくすぐります! (DamageTaken) -Latex Apprentice -ラテックス見習い -The apprentice runs off and cries in a corner. -見習いは走り去り、隅で泣きます。 +見習い召喚士がくすぐってきた! (DamageTaken) + + +Witch's Apprentice +見習い魔女 +### The witch's apprentice confidently admits defeat. + +### The witch's apprentice conjures magic bindings on you! (+RestraintAdded) + +### The witch's apprentice smiles and summons a lock onto you! (DamageTaken) + +### The witch's apprentice smiles as she squeezes your chest! (DamageTaken) + +Latex Apprentice +見習いラテックスの魔女 The apprentice attaches a sticky restraint! (+RestraintAdded) -見習いが粘着拘束を付ける!(+RestraintAdded) -The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) -見習いがドキドキしながら錠前を出して着させます!(DamageTaken) +見習いラテックスの魔女は粘着拘束の魔法を唱えた!(+RestraintAdded) The apprentice caresses you playfully! (DamageTaken) -見習いがふざけて愛撫してくれます!(DamageTaken) +見習いラテックスの魔女が愛撫してきた!(DamageTaken) + + Chain Witch 鎖の魔女 The chain witch vanishes into a pile of metal dust, leaving behind a keyring. -鎖の魔女は金属の粉の山となって消え、キーホルダーを残します。 +鎖の魔女は鍵の束を残して金属の粉の山に消えた。 The chain witch locks all of your restraints! -鎖の魔女がお前の拘束を全て解禁する! +鎖の魔女にすべての拘束具をロックされた! The witch's bindings wrap themselves around you! (+RestraintAdded) -魔女の束縛があなたを包み込みます! (+RestraintAdded) +鎖の魔女の召喚した鎖に包み込まれた! (+RestraintAdded) The chain witch tugs sensually at your restraints! (DamageTaken) -鎖の魔女はあなたの拘束を官能的に引っ張る! (DamageTaken) +鎖の魔女は官能的に拘束具を引っ張ってきた!(DamageTaken) + + Metal Witch -メタルウィッチ +金属の魔女 The metal witch vanishes into a pile of metal dust, leaving behind a keyring. -金属の魔女は、キーリングを残して、金属粉の山へと消えていきます。 +金属の魔女は鍵の束を残して金属の粉の山に消えた。 The metal witch locks all of your restraints! -金属の魔女が全ての拘束具をロックする! +金属の魔女にすべての拘束具をロックされた! The metal's bindings wrap themselves around you! (+RestraintAdded) -金属のバインディングがあなたを包み込みます! (+RestraintAdded) +金属の魔女の召喚した鎖に包み込まれた! (+RestraintAdded) The metal witch tugs sensually at your restraints! (DamageTaken) -金属の魔女があなたの拘束具を官能的に引っ張ります! (DamageTaken) +金属の魔女は官能的に拘束具を引っ張ってきた! (DamageTaken) + + Slime Witch -スライムウィッチ +スライムの魔女 The slime witch vanishes into a pool of pink slime, leaving behind a keyring. -スライムウィッチはピンクのスライムのプールに消え、キーリングを残します. +スライムの魔女は鍵の束を残してスライム溜まりに消えた。 The witch touches her with her sticky grasp! (+RestraintAdded) -魔女がねっとり握手で彼女に触れる! (+RestraintAdded) +スライムの魔女がねっとりとした手で拘束してきた! (+RestraintAdded) The witch creates a magical lock made of hardened latex! (DamageTaken) -魔女は硬化したラテックスで作られた魔法のロックを作成します! (DamageTaken) +スライムの魔女は硬化したラテックスで魔法のロックを施してきた! (DamageTaken) The witch squeezes your body playfully! (DamageTaken) -魔女がふざけてあなたの体をしぼります! (DamageTaken) +スライムの魔女が抱擁してきた! (DamageTaken) + + 'High' Wizard ハイウィザード The wizard falls asleep. -魔法使いは眠りにつく。 +ハイウィザードは眠りについた。 The wizard clips a restraint around your neck! (+RestraintAdded) -魔法使いがあなたの首に拘束具をクリップします! (+RestraintAdded) +ハイウィザードが首を拘束してきた! (+RestraintAdded) The wizard clips a lock to your restraints! (DamageTaken) -魔法使いがあなたの拘束具にロックをかけます! (DamageTaken) +ハイウィザードが拘束具をロックしてきた! (DamageTaken) The wizard laughs maniacally as she tickles you! (DamageTaken) -魔法使いはあなたをくすぐると狂ったように笑います! (DamageTaken) +ハイウィザードは狂ったように笑いながらくすぐってきた!(DamageTaken) + + FunGal -ファンガル +ファンガール The fun-gal retreats into the ground. -ファンガルは地面に退却します。 +ファンガールは地中に逃げた。 The fun-gal clips a restraint around your neck! (+RestraintAdded) -ファンガールがあなたの首に拘束具をクリップします! (+RestraintAdded) +ファンガールが首を拘束してきた! (+RestraintAdded) The fun-gal produces a magical lock on all your restraints! (DamageTaken) -ファンガールは、すべての拘束具に魔法のロックを生成します! (DamageTaken) +ファンガールはすべての拘束具に魔法のロックを生成してきた!(DamageTaken) The fun-gal rubs your chest with her long, slender fingers! (DamageTaken) -ファンガールが細く長い指で胸を撫でる! (DamageTaken) -Crystal Glyph -クリスタルグリフ +ファンガールが細い指で胸を優しく揉んできた! (DamageTaken) +Crystal Slash +クリスタルスラッシュ +Crystal Bolt +クリスタルボルト + + Tailor -テーラー -You murder the tailor! -あなたは仕立て屋を殺します ! +仕立て屋 +You rob the tailor! +仕立て屋を仕立ててしまった! + + Student -学生 -You murder the student! -学生を殺せ! +見習い魔女 +You rob the student! +見習い魔女を落第にしてしまった! + + Tactician -戦術家 -You murder the tactician! -あなたは戦術家を殺します! +策士 +You rob the tactician! +策士を倒してしまった! + + Informant -情報提供者 -You murder the informant! -情報提供者を殺せ! +情報屋 +You rob the informant! +情報屋を倒してしまった! + + Thug -凶悪犯 -You murder the thug! -あなたは凶悪犯を殺します ! +ごろつき +You rob the thug! +ごろつきを監獄送りにしてしまった! + + +Antique Merchant +古物商 +You smash the antique merchant! +古物商を壊してしまった! Blacksmith 鍛冶屋 -You murder the blacksmith! -鍛冶屋を殺せ! +You rob the blacksmith! +鍛冶屋を鍛え直してしまった! +Armorer +防具屋 +You rob the armorer! +防具屋を倒してしまった! +Bowyer +弓師 +You rob the bowyer! +弓師を倒してしまった! +Not a Kidnapper +不審者 +You bring the kidnapper to justice! +誘拐犯に正義の鉄槌を下した! + + Dressmaker -ドレスメーカー +仕立て屋 The dressmaker storms out in a rage. -仕立て屋は怒り狂って暴れまわる。 +仕立て屋は怒り狂って暴れまわった。 The dressmaker has you try on one of her new accessories! (+RestraintAdded) -洋裁師が彼女の新しいアクセサリーを試着させます! (+RestraintAdded) +仕立て屋が服を試着させてくれた!(+RestraintAdded) The dressmaker adds a lock 'just to complete the look, you know?' -仕立て屋は、見た目を完成させるためだけにロックを追加しますよね? +仕立て屋が拘束具をロックしてきた!「鍵をかければもっと見栄えが良くなるわ」 The dressmaker cuddles your helpless body~ (DamageTaken) -無力な君の体を仕立て屋さんが抱きしめて~(DamageTaken) +仕立て屋が抱きしめてきた!(DamageTaken) + + Nurse -看護婦 +ナース The Nurse checks her notes and runs off. -ナースはノートをチェックして逃げる +ナースはノートをチェックして去っていった。 The Nurse tries to pacify this rowdy patient! (+RestraintAdded) -ナースは乱暴な患者をなだめようとします! (+RestraintAdded) +ナースはなだめながら拘束してきた! (+RestraintAdded) The Nurse adds a lock to keep you from hurting the staff. -看護師は、スタッフを傷つけないようにロックを追加します。 +ナースは患者が傷つかないようにと拘束具をロックしてきた! The Nurse assures you it's going to be alright~ (DamageTaken) -ナースが大丈夫って言ってるからね~(DamageTaken) +ナースになだめられた。(DamageTaken) + + Librarian -司書 +図書館司書 The librarian gets angry and retreats. -司書は怒って退く +司書図書館司書は怒りながら逃げていった。 The librarian shushes you as she brandishes a restraint! (+RestraintAdded) -司書が拘束具を振り回しながら君を黙らせる! (+RestraintAdded) +図書館司書が拘束具を振り回してきた! (+RestraintAdded) The librarian snaps her fingers and sends a lock flying at you! -司書が指をパチンと鳴らし、あなたに向かって鍵を飛ばします! +図書館司書が指をパチンと鳴らし、錠を飛ばしてきた! The librarian whispers seductively into your ear! (DamageTaken) -司書があなたの耳元で魅惑的に囁く! (DamageTaken) +図書館司書が耳元で魅惑的に囁いてきた! (DamageTaken) + + Stone Door 石の扉 The stone door crumbles! -石の扉が崩れる! -Stone Door -石の扉 +石の扉は崩れ去った! +Steel Door +鋼鉄の扉 The stone door crumples inward! -石の扉が内側にくしゃくしゃ! +石の扉が開いた! +Control Room Door +コントロールルームのドア +The door flies open as the Dollmaker chuckles at you! +ドアが開き、笑みを浮かべるドールメイカーと相対した! + + Giant Mushroom 巨大キノコ The giant mushroom explodes into a cloud of spores!!! -巨大キノコが爆発して胞子の雲になる!!! -Animated Mushroom -アニメのキノコ -The animated mushroom explodes into a cloud of spores!!! -アニメーションのキノコが爆発して胞子の雲になります!!! -The animated mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) -アニメーション化されたキノコが胞子を顔に吐き出し、気を散らしている間にあなたを縛ります! (+RestraintAdded) -The animated mushroom spits spores into your face and tries to tie you! -アニメ化されたキノコが胞子をあなたの顔に吐き出し、あなたを縛ろうとします! -The animated mushroom emits soporific spores! (DamageTaken) -アニメーション化されたキノコが催涙性の胞子を放出します! (DamageTaken) -Happy Mushroom -ハッピーマッシュルーム -The happy mushroom explodes into a cloud of spores!!! -幸せのキノコは爆発して胞子の雲になります!!! -The happy mushroom tickles you silly! -幸せのきのこがあなたをくすぐる! -The happy mushroom tickles you silly! (DamageTaken) -幸せのキノコがあなたをくすぐる! (DamageTaken) +巨大キノコは爆発して胞子を撒き散らした! + + +Army Mushroom +武装キノコ +The army mushroom explodes into a cloud of spores!!! +武装キノコは爆発して胞子を撒き散らした! +The army mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) +武装キノコは胞子を顔に吐きかけ、怯んだ隙に縛り上げてきた! (+RestraintAdded) +The army mushroom spits spores into your face and tries to tie you! +武装キノコが胞子をあなたの顔に吐き出し、縛ろうとしてきた! +The army mushroom emits soporific spores! (DamageTaken) +武装キノコが催涙性の胞子を撒き散らしてきた! (DamageTaken) + + +Delicious Mushroom +おいしそうなキノコ +The delicious mushroom explodes into a cloud of spores!!! +おいしそうなキノコは爆発して胞子を撒き散らした! +The delicious mushroom tickles you silly! +おいしそうなキノコがくすぐってきた! +The delicious mushroom tickles you silly! (DamageTaken) +おいしそうなキノコがくすぐってきた!(DamageTaken) + + Infected Mushroom 感染したキノコ The infected mushroom explodes into a cloud of spores!!! -感染したキノコは爆発して胞子の雲になります!!! +感染したキノコは爆発して胞子を撒き散らした! The infected mushroom gives you a crushing hug! -感染したキノコはあなたを抱きしめます! +感染したキノコは抱きしめてきた! The infected mushroom gives you a crushing hug! (DamageTaken) -感染したキノコがあなたを抱きしめます! (DamageTaken) +感染したキノコが抱きしめてきた! (DamageTaken) + + Jailer 看守 The jailer passes out and drops her possessions! -獄吏が失神し、持ち物を落とした! +看守は失神して持ち物を落とした! The jailer locks your restraints! -看守があなたの拘束具をロックします! +看守が拘束具をロックしてきた! The jailer places some restraints on you! (+RestraintAdded) -看守はあなたにいくつかの拘束を課します! (+RestraintAdded) +看守に拘束を課された! (+RestraintAdded) The jailer plays with you, groping and rubbing your body! -看守があなたの体を弄ったり揉んだりして遊んでいます! +看守に身体を好き放題弄ばれた! + + The guard checks your restraints to make sure they are secure. -警備員が拘束具をチェックして、安全であることを確認します。 +看守は拘束具が緩んでいないかチェックしてきた。 + + Guard -ガード +警備員 The guard passes out and drops her possessions! -衛兵が気絶し、持ち物を落とした! +警備員は失神して持ち物を落とした! The guard locks your restraints! -警備員があなたの拘束具をロックします! -The jailer places some restraints on you! (+RestraintAdded) -看守はあなたにいくつかの拘束を課します! (+RestraintAdded) +警備員が拘束具をロックしてきた! The guard places a NewRestraintName on you -警備員があなたに NewRestraintName を配置します +警備員に NewRestraintName を取り付けられた! The guard plays with you, groping and rubbing your body! -警備員があなたの体を弄ったり揉んだりして遊んでいます! +警備員に身体を好き放題弄ばれた! + + Armed Guard -アームガード +武装警備員 The armed guard retreats, but drops a keyring! -武装警備隊は退却しますが、キーリングを落とします! -The guard locks your restraints! -警備員があなたの拘束具をロックします! +武装警備員は鍵の束を落としながら退却した! The guard shocks you and slaps on some restraints! (+RestraintAdded) -警備員はあなたに衝撃を与え、いくつかの拘束を平手打ちします! (+RestraintAdded) -The guard electrocutes you with her taser!!! -警備員がテーザー銃で感電死させた!!! -The guard electrocutes you with her taser!!! -警備員がテーザー銃で感電死させた!!! -The EnemyName replaces your OldRestraintName with a NewRestraintName -EnemyName は、OldRestraintName を NewRestraintName に置き換えます +武装警備員はスタンガンを撃ち込み、怯んだ隙に拘束具を追加してきた! (+RestraintAdded) +The guard shocks you with her taser!!! +武装警備員にテーザーを撃ち込まれた! + + +The EnemyName applies a NewRestraintName over your OldRestraintName +EnemyName は、OldRestraintName を NewRestraintName に置き換ようとしている。 The EnemyName removes your OldRestraintName -EnemyName はあなたの OldRestraintName を削除します +EnemyName は OldRestraintName を取り外した。 The EnemyName restrains you with a NewRestraintName -EnemyName は NewRestraintName であなたを拘束します -Master Conjurer -マスター・コンジャラー -The conjurer retreats into a portal! -召喚師はポータルに退却します! -The master conjurer waves a hand, and locks appear on all your restraints! -マスター・コンジャラーが手を振ると、すべての拘束具にロックが表示されます! -The master conjurer summons a restraint directly onto you! -マスター・コンジュラーがあなたに直接拘束を召喚します! -The master conjurer tickles you playfully! -マスター・コンジュラーはふざけてあなたをくすぐります! +EnemyName は NewRestraintName を取り付けてきた。 + + Master Conjurer -マスター・コンジャラー +達人召喚士 The conjurer retreats into a portal! -召喚師はポータルに退却します! +達人召喚士はポータルに逃げ込んだ! The master conjurer waves a hand, and locks appear on all your restraints! -マスター・コンジャラーが手を振ると、すべての拘束具にロックが表示されます! +達人召喚士が手を振ると、すべての拘束具がロックされた! The master conjurer summons a restraint directly onto you! -マスター・コンジュラーがあなたに直接拘束を召喚します! +達人召喚士が直接拘束具を追加してきた! The master conjurer tickles you playfully! -マスター・コンジュラーはふざけてあなたをくすぐります! +達人召喚士がくすぐってきた! + + Frog -蛙 +カエル The frog jumps away! -カエルが飛び立つ! +カエルは飛び跳ねていった! The frog pulls you with its tongue!!! -カエルが舌で引っ張る!!! +カエルに舌で引っ張られた! The frog licks you! -カエルがなめます! +カエルに舐められた! + + Toad ヒキガエル The toad jumps away! -ヒキガエルが飛び立つ! +ヒキガエルは飛び跳ねていった! The toad pulls you with its tongue!!! -ヒキガエルが舌で引っ張る!!! +ヒキガエルに舌で引っ張られた! The toad licks you! -ヒキガエルがあなたをなめます! +ヒキガエルに舐められた! + + Shadow Hand シャドーハンド The shadow hand retreats into the darkness... -影の手は闇に退く…… +シャドーハンドは闇に消えていった…… The shadow hand latches onto you!! (+RestraintAdded) -シャドーハンドがキミに引っかかる!! (+RestraintAdded) +シャドーハンドがまとわりついてきた! (+RestraintAdded) The shadow hand stretches its fingers across your body! (DamageTaken) -影の手があなたの体に指を伸ばします! (DamageTaken) +シャドーハンドが指で身体をなぞってきた! (DamageTaken) A dark hand stretches out beyond the shadows... -影の向こうに伸びる黒い手… +影の向こうに手が伸びていく…… Several dark hands emerge from the shadows! -影から複数のダークハンドが出現! +複数のシャドーハンドが影から現れた! + + Corrupted Adventurer 堕落した冒険者 The corrupted adventurer falls into a deep sleep. -堕落した冒険者は深い眠りにつく +堕落した冒険者は深い眠りについた。 The corrupted aventurer's many arms latch onto you! (+RestraintAdded) -堕落した冒険者の多くの腕があなたに引っかかります! (+RestraintAdded) +堕落した冒険者は大量の腕をまとわりつかせてきた!(+RestraintAdded) +The corrupted aventurer clicks a lock on from behind you! (DamageTaken) +堕落した冒険者に背後から拘束具をロックされた! (DamageTaken) The corrupted adventurer drags her chilling fingers across your vulnerable skin! (DamageTaken) -堕落した冒険者は、あなたの無防備な肌を凍える指で引きずります! (DamageTaken) +堕落した冒険者は冷たい指先を身体に這わせてきた! (DamageTaken) + + Shadowy Ghast シャドーガスト The shadowy ghast screeches and disappears... -影のガストが金切り声を上げて消えていく… +シャドーガストは金切り声を上げて消えていった…… The shadowy ghast latches onto you with its long arms! (+RestraintAdded) -影のガストは長い腕であなたに引っ掛かります! (+RestraintAdded) +シャドーガストは長い腕をまとわりつかせてきた!(+RestraintAdded) The shadowy ghast grips you in its chilling embrace! (DamageTaken) -影のようなガストがあなたをその身も凍るような抱擁で掴みます! (DamageTaken) -Obsidian Construct -黒曜石の構築物 -The obsidian construct stops moving, its spirit departed. -黒曜石の構築物は動きを止め、その精神は去った。 -The obsidian construct reaches out and touches you, forming metallic restraints! (+RestraintAdded) -黒曜石の構築物が手を伸ばしてあなたに触れ、金属の拘束を形成します! (+RestraintAdded) -The obsidian construct uses its chains to lock your restraints! (DamageTaken) -黒曜石の構築物は鎖を使ってあなたの拘束具をロックします! (DamageTaken) -The obsidian construct grips you and drains your willpower! (DamageTaken) -黒曜石の構築物があなたを捕らえ、あなたの意志の力を奪います! (DamageTaken) +シャドーガストに身も凍るような抱擁をされた! (DamageTaken) + + +Corrupted Elemental +堕落した精霊 +The corrupted elemental dissolves into shadows. +堕落した精霊は影に消えていった。 +The corrupted elemental reaches out and touches you, forming metallic restraints! (+RestraintAdded) +堕落した精霊に触れられた箇所に金属の拘束具が出現した! (+RestraintAdded) +The corrupted elemental uses its chains to lock your restraints! (DamageTaken) +堕落した精霊に鎖で拘束具をロックされた! (DamageTaken) +The corrupted elemental grips you and drains your willpower! (DamageTaken) +堕落した精霊に掴まれ、気力を吸い取られた! (DamageTaken) + + Star Demon -スターデーモン +星の悪魔 The star demon is exorcised. -星魔は退散しました +星の悪魔を祓った! The star demon places you in shining, starry restraints. (+RestraintAdded) -星の悪魔はあなたを輝く星の拘束にします。(+RestraintAdded) +星の悪魔は輝く星々の拘束具を召喚した!(+RestraintAdded) The demon giggles as it locks your restraints! (DamageTaken) -悪魔がくすくす笑いながらあなたの拘束具をロックします! (DamageTaken) +悪魔はくすくす笑いながら拘束具をロックしてきた!(DamageTaken) The star demon places you under its curse! (DamageTaken) -星の悪魔はあなたをその呪いの下に置きます! (DamageTaken) +星の悪魔は呪いをかけてきた! (DamageTaken) The strings of fate glisten and wrap around you! -運命の糸がキラリと君を包み込む! +運命の糸に絡め取られた! Many shining strings surround you! -光る糸がたくさんあなたを取り囲みます! +光る糸が周囲を取り囲む! Stepping outside of the indicated tiles will result in punishment! -指定されたタイルの外に出ると罰が与えられます! +指定されたマスの外に出るとペナルティを受ける! Bindings of Fate 運命の縛り + + Moon Demon 月の悪魔 The moon demon is exorcised. -月の魔物は祓いました。 +月の悪魔を祓った! The moon demon places you in shining, starry restraints. (+RestraintAdded) -月の悪魔はあなたを輝く星のような束縛にします. (+RestraintAdded) +月の悪魔は月の拘束具を召喚した! (+RestraintAdded) The moon demon places you under its curse! (DamageTaken) -月の悪魔はあなたをその呪いの下に置きます! (DamageTaken) +月の悪魔は呪いをかけてきた!(DamageTaken) The weight of inescapable bondage falls upon you! (DamageTaken) -逃れられない束縛の重みがあなたに降りかかる! (被ダメージ) -The demon giggles as it locks your restraints! (DamageTaken) -悪魔がくすくす笑いながらあなたの拘束具をロックします! (DamageTaken) +月の悪魔は拘束具の重量を増加させてきた! (DamageTaken) Crushing Fate 運命を打ち砕く + + Void Demon -ヴォイドデーモン +虚無の悪魔 The void demon is exorcised. -虚無の魔物は祓われた +虚無の悪魔を祓った! The void demon places you in dark, glassy restraints. (+RestraintAdded) -虚空の悪魔はあなたを暗く、ガラスのような拘束にします。(+RestraintAdded) -The demon giggles as it locks your restraints! (DamageTaken) -悪魔がくすくす笑いながらあなたの拘束具をロックします! (DamageTaken) +虚無の悪魔が呪いの拘束具で拘束してきた!(+RestraintAdded) The void demon places you under its curse! (DamageTaken) -虚無の悪魔はあなたをその呪いの下に置きます! (DamageTaken) +悪魔は呪いをかけてきた! (DamageTaken) +You are sucked in by a powerful gravitational force!!! (DamageTaken) +強い力で引き寄せられた! +You are sucked in by a powerful gravitational force!!! +強い力で引き寄せられた! +The demon cracks its knuckles as it locks your restraints! (DamageTaken) +悪魔が指を鳴らすと、拘束具がロックされた! (DamageTaken) +Cosmic Force +コズミックフォース + + Demon 悪魔 The demon is exorcised. -鬼は退散しました。 +悪魔を祓った! The demon places you in dark, glassy restraints. (+RestraintAdded) -悪魔はあなたを暗くガラスのような拘束具に閉じ込めます。(+RestraintAdded) -The demon giggles as it locks your restraints! (DamageTaken) -悪魔がくすくす笑いながらあなたの拘束具をロックします! (DamageTaken) -The demon whacks you with its mace! (DamageTaken) -悪魔はメイスであなたを叩きます! (DamageTaken) +悪魔が呪いの拘束具で拘束してきた!(+RestraintAdded) +The demon caresses you gently with her sharp nails! (DamageTaken) +悪魔に尖った爪で優しく愛撫された! (DamageTaken) +The demon stuns you with her heavy mace! (+STUN) +悪魔にメイスで殴られ、スタンしてしまった!(+スタン) + + Tickle Hand -手をくすぐる +くすぐる手 The hand vanishes! -手が消える! +くすぐる手は消え失せた! The hand tickles you! (DamageTaken) -手がくすぐる!(DamageTaken) +くすぐる手がくすぐってきた!(DamageTaken) + + Tickle Terror -くすぐり恐怖 +くすぐりおばけ The tickle terror vanishes... for now -くすぐったい恐怖は消える…とりあえず +くすぐりおばけは成仏した……はず。 The monstrous spirit tickles you mercilessly!!! (DamageTaken) -化け物霊が容赦なくくすぐる!!! (DamageTaken) +幽霊が容赦なくくすぐってくる! (DamageTaken) The monstrous spirit binds you to make you more vulnerable! (+RestraintAdded) -怪物の精霊があなたを縛り付けて、あなたをより無防備にします! (+RestraintAdded) +幽霊はくすぐるために縛ってきた! (+RestraintAdded) + + Hug Horror ハグホラー The hug horror vanishes... for now -ハグの恐怖は消える…とりあえず -The monstrous spirit gives a crushing hug!!! (DamageTaken) -怪獣が抱きしめる!!! (DamageTaken) +ハグホラーは成仏した……きっと。 The monstrous spirit gives a crushing hug!!! (DamageTaken) -怪獣が抱きしめる!!! (DamageTaken) +幽霊が抱きしめてきた!(DamageTaken) +The monstrous spirit envelops you in tightness, holding you in place! (DamageTaken) +幽霊に包み込まれ、その場に固定されてしまった! (DamageTaken) The monstrous spirit's chains latch on! (+RestraintAdded) -妖怪の鎖が引っかかる!(+RestraintAdded) +幽霊に鎖で縛されてしまった!(+RestraintAdded) + + Greedy Ghast 貪欲なガスト The ghast vanishes... for now -ガストは消える…とりあえず -The moaning spirit gropes your body!!! (DamageTaken) -呻く精霊が体を弄る!!! (DamageTaken) -Tickle Hand -手をくすぐる -The hand vanishes! -手が消える! -The hand tickles you! (DamageTaken) -手がくすぐる!(DamageTaken) +貪欲なガストはおそらく成仏した…… +The moaning spirit runs its hands all across your body!!! (DamageTaken) +幽霊がうめき声を挙げながら全身を愛撫してきた! (DamageTaken) + + + + Tome of Chains 鎖の書 The floating tome burns into ashes! -浮遊書は燃え尽きる! +本は燃え尽きた! +Tome of Belts +ベルトの書 +Tome of Ropes +縄の書 +Tome of Bondage +緊縛の書 Tome of Light 光の書 -The floating tome burns into ashes! -浮遊書は燃え尽きる! Tome of Magic 魔法の書 -The floating tome burns into ashes! -浮遊書は燃え尽きる! Tome of Ice 氷の書 -The floating tome burns into ashes! -浮遊書は燃え尽きる! Tome of the Abyss 深淵の書 -The floating tome burns into ashes! -浮遊書は燃え尽きる! Tome of Nature 自然の書 -The floating tome burns into ashes! -浮遊書は燃え尽きる! Tome of Thunder 雷の書 -The floating tome burns into ashes! -浮遊書は燃え尽きる! Tome of Latex ラテックスの書 -The floating tome burns into ashes! -浮遊書は燃え尽きる! Tome of Laughs 笑いの書 -The floating tome burns into ashes! -浮遊書は燃え尽きる! + + You are grabbed and led to a prison... -あなたは捕らえられて刑務所に連れて行かれます... +捕らえられて牢屋に連行された…… Perhaps they may release you if you behave... -行儀よくしたら解放されるかも… +行儀よくしてたら解放されるかもしれない…… + + Necromancer ネクロマンサー The necromancer faints. Ironic that she couldn't save herself. -ネクロマンサーは失神します。皮肉なことに、彼女は自分自身を救うことができませんでした。 +ネクロマンサーは失神した。 The necromancer locks all of your restraints! -ネクロマンサーはあなたのすべての拘束をロックします! +ネクロマンサーはすべての拘束具をロックしてきた! The necromancer prepares you for transport! -ネクロマンサーが輸送の準備をします! +ネクロマンサーに運ばれそうになった! The necromancer rubs your body sensually! -ネクロマンサーが官能的にあなたの体をこすります! +ネクロマンサーが官能的に身体を撫でてきた! + + Filthy Rat -不潔なネズミ +薄汚いネズミ The rat skitters back into a hole in the wall. -ネズミは壁の穴に戻ってきた。 +薄汚いネズミは巣に逃げていった。 The filthy rat nibbles at you! (DamageTaken) -汚いネズミがあなたをかじる! (DamageTaken) +薄汚いネズミにかじられた!(DamageTaken) + + Annoying Bat -うざいコウモリ +うるさいコウモリ You stomp the bat into the ground to make sure it's dead. -コウモリが死んでいることを確認するために、バットを地面に踏みつけます。 +うるさいコウモリを追い払った。 The bat nibbles incessantly at you! (DamageTaken) -コウモリが絶え間なくあなたをかじる! (DamageTaken) +うるさいコウモリに何度もかじられた! (DamageTaken) + + Pixie -ピクシー +妖精 The pixie huffs and floats away. -ピクシーはハフして浮かびます。 +妖精はふわふわと逃げていった。 The pixie tickles you with a feather! (DamageTaken) -ピクシーが羽でくすぐる!(DamageTaken) +妖精が羽でくすぐってきた!(DamageTaken) + + Orb of Light 光のオーブ The orb vanishes in a flash of light. -オーブは閃光の中で消えます。 +光のオーブは消え失せた。 The orb blinds you with its intense light!!! (DamageTaken) -オーブは強烈な光であなたを盲目にします!!! (DamageTaken) +光のオーブが放つ強烈な光に目がくらんだ! (DamageTaken) A light restores the will of its allies! -光は味方の意志を回復する! +光が味方の意志を回復した! + + You do not have enough resources to cast the spell! -呪文を唱えるのに十分なリソースがありません! -You AttackName TargetEnemy for DamageDealt DamageType damage! -あなたはTargetEnemyをAttackNameし、DamageDealDamageTypeのダメージを与えます! -You AttackName TargetEnemy for a decreased DamageDealt DamageType damage! -TargetEnemy を攻撃して、DamageDealt DamageType のダメージを減らします! -You AttackName TargetEnemy for an increased DamageDealt DamageType damage! -TargetEnemy を攻撃して、DamageDealt DamageType のダメージを増加させます! -You AttackName TargetEnemy for a devastating DamageDealt DamageType damage! -TargetEnemy を攻撃して壊滅的な DamageDealt DamageType ダメージを与えます! -You AttackName TargetEnemy, but your DamageType weapon has no effect! -あなたはTargetEnemyを攻撃しますが、ダメージタイプの武器は効果がありません! -You AttackName TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! -TargetEnemy を AttackName してダメージを与えたダメージ タイプのダメージを与える! +マナが足りない! AttackName hits TargetEnemy for DamageDealt DamageType damage! -AttackName は TargetEnemy にヒットし、DamageDealt DamageType ダメージを与えます! +AttackName が TargetEnemy に命中し、 DamageDealt の DamageType 属性ダメージを与えた! +AttackName hits TargetEnemy for a decreased DamageDealt DamageType damage! +耐性があるようだ。 AttackName が TargetEnemy に命中し、 DamageDealt の DamageType 属性ダメージを与えた! +AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! +弱点をついた。 AttackName が TargetEnemy に命中し、 DamageDealt の DamageType 属性ダメージを与えた! +AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! +弱点をついた! AttackName が TargetEnemy に命中し、 DamageDealt の DamageType 属性ダメージを与えた!! +AttackName hits TargetEnemy, but your DamageType weapon has no effect! +AttackName は TargetEnemy に命中したが、 DamageType への耐性により効果がなかった! +AttackName hits TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! +AttackName は TargetEnemy に命中したが、魔力障壁によって阻まれた。 DamageDealt DamageType 属性ダメージを与えた! AttackName hits TargetEnemy for a reduced DamageDealt DamageType damage! -AttackName が TargetEnemy に命中し、DamageDealt DamageType のダメージが減少します! +耐性があるようだ。 AttackName が TargetEnemy に命中し、 DamageDealt の DamageType 属性ダメージを与えた! AttackName hits TargetEnemy but DamageType damage doesn't have any effect! -AttackName は TargetEnemy に命中しますが、DamageType のダメージは効果がありません! -AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! -AttackName が TargetEnemy に命中し、DamageDealt DamageType のダメージが増加します! +AttackName は TargetEnemy に命中したが、 DamageType への耐性により効果がなかった! AttackName hits TargetEnemy for DamageDealt DamageType damage, reduced by an anti-magic ward! -AttackName は TargetEnemy にヒットし、DamageDealt DamageType ダメージを与え、アンチ マジック ウォードによって軽減します! -AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! -AttackName が TargetEnemy に命中し、壊滅的な DamageDealt DamageType ダメージを与えます! -attack +AttackName は TargetEnemy に命中したが、魔力障壁によって阻まれた。 DamageDealt の DamageType 属性ダメージを与えた。 +Your attack 攻撃 -damage -ダメージ +An effect +効果 You miss the TargetEnemy! -あなたはTargetEnemyを見逃しています! +TargetEnemy への攻撃は空振った Your attack is too feeble to hurt the TargetEnemy! -あなたの攻撃は、TargetEnemy を傷つけるには弱すぎます! +TargetEnemy を傷つけられない +Your attack was absorbed by the TargetEnemy's shield! +TargetEnemy のシールドに攻撃を吸収された! You try to pull the TargetRestraint off... -あなたはTargetRestraintを外そうとしています... +TargetRestraint を外そうとする…… You try to squirm and moan out of the TargetRestraint... -あなたはTargetRestraintから身もだえしてうめき声を上げようとします... +TargetRestraint から逃れようと身を捩ってうめき声を上げる…… You tug on the TargetRestraint with increased power... -パワーを上げてTargetRestraintを引っ張ると…… +TargetRestraint を思い切り引っ張った…… Your ally helps you try to pull the TargetRestraint off... -あなたの味方は、TargetRestraint を外そうとするあなたを助けてくれます... +味方が TargetRestraint を外そうと助けてくれた…… You work on picking the TargetRestraint... -あなたは TargetRestraint の選択に取り組んでいます... +TargetRestraint の錠にピッキングを試みた…… Your trembling hands work on picking the TargetRestraint... -あなたの震える手はTargetRestraintを摘み取ります... +震える手で TargetRestraint の錠にピッキングを試みた…… You work on picking the TargetRestraint with your powers... -あなたはあなたの力でTargetRestraintを選ぶことに取り組んでいます... +力を込めて TargetRestraint の錠にピッキングを試みた…… Your ally tries to pick the lock on your TargetRestraint... -味方があなたの TargetRestraint のロックを解除しようとしています... +味方が TargetRestraint のピッキングを助けてくれた…… You try to pick open the TargetRestraint but break your lockpick. -TargetRestraint をピッキングして開けようとしましたが、ロックピックを壊してしまいました。 -You work on picking the TargetRestraint... -あなたは TargetRestraint の選択に取り組んでいます... -You work on picking the TargetRestraint... -あなたは TargetRestraint の選択に取り組んでいます... -Your trembling hands work on picking the TargetRestraint... -あなたの震える手はTargetRestraintを摘み取ります... -You work on picking the TargetRestraint with your powers... -あなたはあなたの力でTargetRestraintを選ぶことに取り組んでいます... -Your ally tries to pick the lock on your TargetRestraint... -味方があなたの TargetRestraint のロックを解除しようとしています... +TargetRestraint の錠をピッキングしようとしたが、ロックピックが折れてしまった。 You break your lockpick trying to open the TargetRestraint. -あなたはTargetRestraintを開こうとしてロックピックを壊しました。 +TargetRestraint の錠をピッキングしようとしたが、ロックピックが折れてしまった。 You try to remove the TargetRestraint... -TargetRestraint を削除しようとしています... +TargetRestraint を取り外そうとした…… You shakily try to remove the TargetRestraint... -あなたは震えながら TargetRestraint を外そうとします... +震える手で TargetRestraint を取り外そうとした…… You try to remove the TargetRestraint with a tool... -あなたはツールで TargetRestraint を取り除こうとしています... +道具を使って TargetRestraint を取り外そうとした…… Your ally helps you remove the TargetRestraint... -あなたの味方は、TargetRestraint を取り除くのを手伝ってくれます... +味方が TargetRestraint を取り外すのを助けてくれた…… You try to cut the TargetRestraint... -あなたはTargetRestraintをカットしようとしています... +TargetRestraint を切ろうとした…… You tremble as you try to cut the TargetRestraint... -TargetRestraintを切ろうとして震える… +震える手で TargetRestraint を切ろうとした…… You try to cut the TargetRestraint using your tools... -あなたはツールを使って TargetRestraint をカットしようとしています... +道具を使って TargetRestraint を切ろうとした…… You try to cut the TargetRestraint with help... -あなたは助けを借りて TargetRestraint をカットしようとしています... +味方が TargetRestraint の切断を助けてくれた…… You break your knife trying to cut the TargetRestraint. -TargetRestraint を切ろうとしてナイフを折る。 -You try to cut the TargetRestraint... -あなたはTargetRestraintをカットしようとしています... +TargetRestraint 切ろうとしたがナイフが折れてしまった…… You fiddle with the key on the TargetRestraint... -あなたはTargetRestraintのキーをいじっています... +鍵を使って TargetRestraint の解錠を試みた…… Your jittering hands fumble with the key on the TargetRestraint... -あなたの震える手は、TargetRestraint のキーをいじります... +震える手で鍵を使い、TargetRestraint の解錠を試みた…… You concentrate on unlocking the TargetRestraint... -あなたはTargetRestraintのロックを解除することに集中します... +集中して TargetRestraint の解錠を試みた…… You work on unlocking the TargetRestraint with help... -あなたは助けを借りて、TargetRestraint のロックを解除しようとしています... -You fiddle with the key on the TargetRestraint... -あなたはTargetRestraintのキーをいじっています... -The lock requires a key. -ロックにはキーが必要です。 -The lock requires a key. -ロックにはキーが必要です。 +味方が TargetRestraint の解錠を助けてくれた…… + + The lock requires a key. -ロックにはキーが必要です。 -The green padlock only accepts green keys. -緑の南京錠は緑の鍵しか受け付けません。 -The yellow padlock requires a red and a green key. -黄色い南京錠には赤と緑の鍵が必要です。 -The magical lock only accepts blue keys and can't be picked. -魔法の錠前は青い鍵しか受け付けず、ピッキングできません。 +鍵がないと解錠できない。 +The lock can only be opened with a key. +鍵がないと解錠できない。 +The magical lock only accepts magical keys and can't be picked. +魔法の錠はピッキングできず、魔法の鍵がないと開けられないようだ。 The magical lock is guarded with powerful magic. You'll have to wait for it to wear off... -魔法の錠前は強力な魔法で守られています。解けるまで待ってください… +魔法の錠は強力な魔法で守られている。魔法が切れるまで待つしかない…… +The item is cybernetically locked. You will need a key card to unlock it. +電子的な錠が取り付けられている。カードキーが必要なようだ。 This lock requires a command word to unlock. It doesn't have a keyhole. -このロックは、ロックを解除するための合言葉が必要です。鍵穴はありません。 +どこにも鍵穴が見当たらない。コマンドワードを使わないと、この錠は開かないようだ。 You don't have a key for this lock. -あなたはこの錠前の鍵を持っていません。 +錠に合う鍵を持っていない。 The lock seems to be magical and rejects all picking attempts! -ロックは魔法のようで、ピッキングの試みをすべて拒否します! +この鍵穴にはロックピックを通さない魔法がかかっているようだ。 The lock is definitely magical and forces your pick out! -ロックは間違いなく魔法で、選択を強制します! +錠には魔法がかかっており、ピッキングはできない。 +The lock is divine. A mortal shouldn't even try to pick it. +神の力でロックされている。常人にはピッキングできそうにない。 +You must perform your quest! Don't even think of unlocking it... +決して外そうなどとは考えず、クエストをこなすしかない…… +You're not sure a key for this even exists in the mortal realm. +はたして人間界に鍵はあるのだろうか。 +The lock is made of solid rubber. You can't pick that. +錠はゴムで作られており、ピッキングできそうにない。 +You need something sharp to cut the lock. +錠を切断する必要がある。 The lock doesn't even have a keyhole to pick! -ロックには、ピッキングする鍵穴さえありません! +鍵穴が見当たらない! +You need a special tool to pick this kind of lock. +特別な道具が必要なようだ。 +The lock is technological and does not use a key. +高度な文明の錠が使われている。鍵穴が見当たらない。 +The lock is brimming with security features and is nigh impossible to pick! +とても精巧な錠前で、ピッキングは不可能に近い。 + + +The lock is encased in magical crystals that block the keyhole. +鍵穴は魔法のクリスタルで覆われている。 +Your distraction makes the crystals regrow immediately after breaking them off. +クリスタルを割っても、性欲を吸収してすぐに再生してしまう。 + + +The crystal fragments in the lock make it difficult to pick. +クリスタルの破片が鍵穴に入り込んでおり、ピッキングはできそうにない。 +You need a key to actually unlock the ex-crystallized lock. +クリスタルで覆われた錠を外す鍵を持っていない。 + + The key sticks in the lock and jams, mangling the key! -鍵が錠前に引っかかって動かなくなり、鍵が壊れてしまう! +鍵が引っかかり、鍵穴の中で折れてしまった! + + You unlock the TargetRestraint. -TargetRestraint のロックを解除します。 +TargetRestraint を解錠した。 You manage to squeeze out of the TargetRestraint! -あなたはTargetRestraintからなんとか絞り出しました! -You pick the lock on the TargetRestraint! -あなたは、TargetRestraint のロックを選択します! +TargetRestraint からもがいて抜け出した! You pick the lock on the TargetRestraint! -あなたは、TargetRestraint のロックを選択します! +TargetRestraint のピッキングに成功した! You free yourself from the TargetRestraint! -あなたはTargetRestraintから解放されます! +TargetRestraint から抜け出した! You damage the TargetRestraint enough to escape! -逃げるのに十分なほど TargetRestraint にダメージを与えます! +TargetRestraint から抜け出せる程度に傷をつけた! + + The TargetRestraint is destroyed by your attempts. -TargetRestraint はあなたの試みによって破壊されました。 +TargetRestraint を力ずくで破壊した。 +The TargetRestraint comes off before taking serious damage. +TargetRestraint は壊れる前に外れた。 + + This is as far as you can struggle. You'll have to remove the TargetRestraint some other way. -これはあなたが苦労できる限りです。別の方法で TargetRestraint を削除する必要があります。 +いくらもがいても、これ以上緩む気配がない。別の方法で TargetRestraint を解く必要がある。 The item is too tight. You'll need to loosen the TargetRestraint somehow first... -アイテムがきつすぎます。まず、TargetRestraint を何らかの方法で緩める必要があります... +きつく締まりすぎている。まずは別の方法で TargetRestraint を緩める必要がある…… The item is to tight to get your tool into position. You'll have to first make the TargetRestraint looser. -アイテムがきつすぎてツールを所定の位置に配置できません。最初に TargetRestraint を緩める必要があります。 +きつく締まりすぎていて、上手く道具を使えない。先に TargetRestraint を緩める必要がある。 You can't quite get your pick into position. Maybe if you loosened the TargetRestraint first... -ピックがうまく収まりません。先に TargetRestraint を緩めていたら… +きつく締まりすぎていて、ロックピックを上手く操作できない。先に TargetRestraint を緩める必要がある…… The TargetRestraint's lock is tucked in securely under straps. You'll have to get it out from under there... -TargetRestraint のロックは、ストラップの下にしっかりと収まっています。その下から取り出さなければなりません... +TargetRestraint の錠前は、ストラップの下に隠れている。先にずらさなければならない…… + + After many failed attempts to unlock the TargetRestraint, you realize this lock is more than you can handle. -TargetRestraint のロックを解除しようとして何度も失敗した後、このロックが処理できないことに気付きました。 +何度も TargetRestraint を開場しようとしたが、この方法では無理なようだ。 + + You can feel some ply but can't quite make any progress against the TargetRestraint... -多少のプライは感じますが、TargetRestraint に対してはまったく進歩がありません... +多少は楽になったが、TargetRestraint は緩む気配が全くない。 The TargetRestraint's mechanism lies barely out of reach... -TargetRestraint のメカニズムは、かろうじて手の届かないところにあります... +TargetRestraint のメカニズムに、あと少しのところで届かない…… Your tool leaves only a scratch against the TargetRestraint... -あなたのツールは、TargetRestraint に傷を付けるだけです... +道具を使っても、TargetRestraint にはかすり傷をつけただけだった…… The lock on the TargetRestraint is just above your skill level... -TargetRestraint のロックは、あなたのスキル レベルをわずかに上回っています... +TargetRestraint の錠前を解錠できるスキルがない…… The keyholes on the TargetRestraint are just barely out of reach... -TargetRestraint の鍵穴はかろうじて手の届かないところにあります... +TargetRestraint の鍵穴はかろうじて手の届かないところにある…… + + You unlock the TargetRestraint and sigh with relief. -TargetRestraint のロックを解除し、安堵のため息をつきます。 +TargetRestraint のロックを解除し、安堵のため息をついた。 You give out a huge moan as you squeeze out of the TargetRestraint! -TargetRestraint から絞り出すと、大きなうめき声をあげます! +うめき声を上げながら、 TargetRestraint から抜け出した! You pick the lock on the TargetRestraint with a sigh of relief! -あなたは安堵のため息をつきながら、TargetRestraint のロックをピッキングします! -You pick the lock on the TargetRestraint with a sigh of relief! -あなたは安堵のため息をつきながら、TargetRestraint のロックをピッキングします! +TargetRestraint のピッキングに成功すると、安堵のため息を付いた。 Trembling, you free yourself from the TargetRestraint! -震えよ、TargetRestraintから解放されろ! +TargetRestraint から解放された。 You damage the TargetRestraint enough to wiggle out! -TargetRestraint を小刻みに動かせるほど損傷させた! +TargetRestraint を傷つけ、多少の身動きができるようになった。 + + You stick the knife into a crack in the wall! -壁の隙間にナイフを突き刺す! +壁の隙間にナイフを挟み込んだ。 You use your feet to place the knife into a crack! -足を使ってナイフを亀裂に入れます。 +足を使ってナイフを亀裂に挟み込んだ。 You glare at the crack in the wall as you realize you couldn't maneuver the knife if you tried. -試みてもナイフを操作できないことに気づき、壁の亀裂をにらみつけます。 +ナイフを壁の隙間に挟み込もうとしても上手く行かず、壁を睨むことしかできなかった。 You can't hold your knife like this... -このままではナイフを持てない… +このままではナイフを持てない…… + + The TargetRestraint is too secure to struggle out. -TargetRestraint は安全すぎて苦労することはできません。 +TargetRestraint は抜け出すには堅すぎる。 You groan in frustration as you realize the TargetRestraint is too tight to escape. -TargetRestraint がきつすぎて逃げることができないことに気づき、欲求不満でうめき声を上げます。 +TargetRestraint がきつすぎて抜け出せないことに気づき、思わずうめき声を上げる。 The TargetRestraint tightens itself as you try to squeeze out! -絞り出そうとすると、TargetRestraint は自動的に締まります。 +抜け出そうとすると、TargetRestraint の締め付けが強くなった! You will need someone's help to squeeze out of the TargetRestraint. -TargetRestraint から抜け出すには、誰かの助けが必要です。 +TargetRestraint から抜け出すには、誰かの助けが必要だ。 The TargetRestraint flashes magically as the Goddess' curse resists your efforts! -女神の呪いがあなたの努力に抵抗すると、TargetRestraint が魔法のように点滅します! +TargetRestraint から抜け出そうともがくと、女神の呪いにより拘束具が光りだした! +The TargetRestraint holds firm against your attempts, held back by your restrictions. +TargetRestraint から抜け出そうとするも、拘束のせいで動きが制限され、抜け出せない。 You pull and tug but your other restraints keep the TargetRestraint securely in place! -引っ張ったり引っ張ったりしても、他の拘束具が TargetRestraint をしっかりと固定します! +いくら引っ張っても、他の拘束具のせいで TargetRestraint はまったく緩む気配がない。 You groan and tug but nothing budges on the TargetRestraint. You're bound too tightly by something else. -うめき声を上げて引っ張るが、TargetRestraint には何も動じない。何か他のものにきつく縛られすぎている +うめき声を上げて引っ張るが、他の拘束具が多すぎて TargetRestraint は緩む気配がない。 You are too tightly bound to have a chance against the TargetRestraint. -あなたは、TargetRestraint に対してチャンスを得るにはあまりにもきつく縛られています。 +他の拘束具が多すぎて、TargetRestraint を全く解くことができない。 You shake and moan as you realize your struggles against the TargetRestraint are futile. -TargetRestraint との戦いが無益であることに気付くと、身震いし、うめき声​​を上げます。 +TargetRestraint を解こうとするも、無駄な努力だということに気づいて身震いし、うめき声が漏れた。 You can't find a keyhole on the TargetRestraint! -TargetRestraint に鍵穴が見つからない! +TargetRestraint には鍵穴が見当たらない! You sigh as you give up trying to find any kind of keyhole on the TargetRestraint. -TargetRestraint のあらゆる種類の鍵穴を見つけようとするのをあきらめると、あなたはため息をつきます。 +TargetRestraint の鍵穴を探そうとしたが見つからず、ため息が漏れた。 The TargetRestraint can't be unlocked without a special command! -TargetRestraint は特別なコマンドを使わないとアンロックできません! +TargetRestraint は特別なコマンドを使わないと解錠できない! You can't reach the keyhole on the TargetRestraint by yourself! -TargetRestraint の鍵穴には、1 人では届きません! +TargetRestraint の鍵穴には、1人では届かない! You can't hold the key to unlock the TargetRestraint with. -TargetRestraint のロックを解除するための鍵を保持することはできません。 +TargetRestraint を解錠しようとするも、鍵を持つことができない。 Your bound and shaking hands can't even hold the key for the TargetRestraint. -あなたの縛られて震える手は、TargetRestraint の鍵を握ることさえできません。 +縛られて震える手では、TargetRestraint の鍵を握ることすらままならない。 The goddess punishes you for trying to unlock the TargetRestraint! -TargetRestraint を解除しようとしたあなたに女神が罰を与えます! +TargetRestraint を解錠しようとすると、女神が天罰を下してきた! +You are too restricted to get the key into place! +拘束具に鍵を差し込もうとするも、動きが制限されてうまく行えない。 You try, but something is keeping your hands away from the TargetRestraint. -試してみますが、何かがあなたの手を TargetRestraint から遠ざけています。 +TargetRestraint から抜け出そうとするも、不思議な力で触れることができない。 You flail the key around uselessly but a strap is preventing you from unlocking the TargetRestraint! -無駄に鍵を振り回すと、ストラップが原因で TargetRestraint のロックを解除できません! +ストラップに邪魔されて、 TargetRestraint に鍵を差し込もうとするも上手く行かない! This lock on the TargetRestraint is beyond your skill level! -TargetRestraint のこのロックは、あなたのスキル レベルを超えています! +TargetRestraint の錠前は自身のスキルでは開けることができない! You whimper as you realize the lock on the TargetRestraint is far too secure. -TargetRestraint のロックがあまりにも安全すぎることに気づき、あなたは泣き言を言います。 +TargetRestraint の錠前は恐ろしく高度な設計であることに気づき、泣き言が漏れた。 There is no visible locking mechanism on the TargetRestraint. -TargetRestraint には目に見えるロック機構はありません。 +TargetRestraint には錠前が見当たらない。 You can't pick the TargetRestraint by yourself, you'll need help. -TargetRestraint を自分で選ぶことはできません。助けが必要です。 +TargetRestraint は自分一人ではピッキングできない。誰かに助けを求める必要がある。 You can't maneuver the lockpick well enough to unlock the TargetRestraint. -TargetRestraint のロックを解除するのに十分なほどロックピックを操作することはできません。 +TargetRestraint の錠前は手に負えない。 You let out a frustrated sigh as your quivering pick makes no progress on the TargetRestraint. -震えるピックがTargetRestraintで進まないので、イライラしたため息をつきます。 +手が震えて TargetRestraint の解錠が進まず、イライラしてため息が出た。 You try to start picking, but the lock on the TargetRestraint is secured by something else. -ピッキングを開始しようとしましたが、TargetRestraint のロックは別のものによって保護されています。 +TargetRestraint のピッキングをしようとしたが、他の拘束具に邪魔されて上手くできない。 You whimper as you realize the lock on the TargetRestraint is shielded by another strap. -TargetRestraint のロックが別のストラップで保護されていることに気が付くと、あなたは泣き言を言います。 +TargetRestraint の錠前が別のストラップに保護されていることに気が付き、泣き言が漏れた。 You are distracted from the TargetRestraint by mental images of yourself remaining in bondage... -あなたは束縛されたままの自分の精神的なイメージによって、TargetRestraint から気をそらされています... +自分が縛られているイメージが浮かび上がり、情欲から TargetRestraint を抜け出すのに上手く集中できない…… +Your restrictions ruin your dexterity. You can't pick the TargetRestraint. +拘束によって動きが制限されており、 TargetRestraint に上手くアプローチできない。 + + You wiggle uselessly in the TargetRestraint. Maybe you need some kind of tool... -TargetRestraint で無駄に小刻みに動きます。何かツールが必要かもしれません... +TargetRestraint から抜け出そうともがいても、全く効果がない。何か道具が必要だ…… You rub your body against the floor to no avail, and sigh as the TargetRestraint stays secure. -無駄に体を床にこすりつけ、TargetRestraint がしっかりと固定されているのでため息をつきます。 +体を床にこすりつけるも、TargetRestraint はまったく緩む気配がなく、ため息が出た。 You contort your body but you don't have leverage on the TargetRestraint. Maybe you need some kind of tool... -あなたは体をゆがめますが、TargetRestraint を活用できません。何らかのツールが必要なのかもしれません... -You wiggle madly, trying to push against the TargetRestraint. You need more leverage... -あなたは狂ったように小刻みに動き、TargetRestraint を押そうとします。もっと力が必要です... +身体を捩ってみるも、TargetRestraint はまったく緩む気配がない。何か道具が必要だ…… +You struggle madly, trying to push against the TargetRestraint. You need more leverage... +必死に TargetRestraint から抜け出そうとするも、全く効果がない。もっと力が必要だ…… + + That doesn't seem to work. Maybe something else will help with the TargetRestraint. -それはうまくいかないようです。TargetRestraint には別の方法が役立つかもしれません。 +全く効果がない。TargetRestraint を解くには別の方法を試す必要がある。 You squirm helplessly against the furniture. Maybe something else will help with the TargetRestraint. -あなたはどうすることもできずに家具に身をよじらせます。TargetRestraint には何か他のものが役立つかもしれません。 +インテリアに拘束具をこすりつけるも、何も変わらなかった。 TargetRestraint から抜け出すには別の方法を試す必要がある。 You twist your body trying to use the furniture, but it doesn't seem to work. The TargetRestraint remains tight. -家具を使おうとして体をひねるが、うまくいかないようだ。TargetRestraint はきついままだ +インテリアを使おうと体をひねるが、うまくいかない。TargetRestraint はきつく締まっている。 You wiggle and squirm, trying to use the furniture to no avail. The TargetRestraint remains tight. -家具を無駄に使おうとして、体をくねらせ身もだえします。TargetRestraint はきついままです。 -You need something sharp to loosen the fasteners on the TargetRestraint. -TargetRestraint の留め具を緩めるには鋭利なものが必要です。 -This is not a job for your fingers right now. You need something sharp to remove the TargetRestraint. -これは今、あなたの指の仕事ではありません。TargetRestraint を外すには鋭利なものが必要です。 -There's no way to loosen the TargetRestraint without some kind of sharp tool... -鋭利な道具がないと、TargetRestraint を緩めることはできません... +インテリアを使って拘束を解こうと体をよじらせるも、 TargetRestraint はきついままだ。 + + +You need something sharper to get at the TargetRestraint. +TargetRestraint から抜け出すには、鋭利なものが必要だ。 +This is not a job for your trembling fingers right now. +覚束ない指でできることではない。 +Tugging on the TargetRestraint is useless. Maybe if you had something sharp... +いくら TargetRestraint を引っ張っても緩まない。何か鋭利なものがないと…… You sigh as the TargetRestraint resists all your attempts at breaking through. -TargetRestraint が突破しようとするすべての試みに抵抗するので、あなたはため息をつきます。 -You need some kind of corner for leverage on the TargetRestraint. -TargetRestraint を活用するには、ある種のコーナーが必要です。 -You flail about but cant get any leverage on the TargetRestraint without an edge or corner. -あわてても、エッジやコーナーがなければ、TargetRestraint を活用することはできません。 -You need something rough to get the TargetRestraint loose. -TargetRestraint を緩めるには、ラフなものが必要です。 -You squirm against the smooth floor to no avail. If you had some kind of corner to undo the TargetRestraint... -滑らかな床に身もだえしても無駄だ。TargetRestraint を解除するコーナーがあれば… -You need some kind of tool to pull at the knots on the TargetRestraint. -TargetRestraint の結び目を引っ張るには、何らかのツールが必要です。 +TargetRestraint の突破口が見えず、ため息が漏れた。 + + +You fidget with the TargetRestraint but can't reach the clasps without some kind of edge. +TargetRestraint の留め具に手を伸ばすが、届かない…… +You flail about but your hands are unable to reach the TargetRestraint. +TargetRestraint に触れようともがくが、届かない…… +You can't reach the clasps on the TargetRestraint. If only you had some other way... +TargetRestraint の留め具に手が届かない。何か他に方法があれば…… +You squirm around, rubbing the TargetRestraint against the smooth floor to no avail... +TargetRestraint を滑らかな地面にこすりつけるが、全く意味がない…… + + +The knots on the TargetRestraint are too tight to pull apart without a hook. +TargetRestraint の結び目がきつすぎて、フックなしでは解けそうにない。 You struggle fruitlessly against the knots on the TargetRestraint, but they're too tight. -TargetRestraint の結び目と格闘してもむだですが、きつすぎます。 -You don't have any grip or hook to tug on the TargetRestraint with. -TargetRestraint を引っ張るためのグリップやフックがありません。 -You cant tug on the TargetRestraint without some kind of hook, it's too tight against your body. -何らかのフックがないと、TargetRestraint を引っ張ることはできません。体にきつすぎます。 -You need a way to stick the tool in place to undo the TargetRestraint... -TargetRestraint を元に戻すには、ツールを所定の位置に固定する方法が必要です... +TargetRestraint の結び目を解こうともがくが、きつすぎて効果がない。 +The TargetRestraint is too tight against your body. You'll need more leverage to pull it off. +TargetRestraint を解くには力が足りない。 +You shake yourself around trying to rub off the TargetRestraint, but it's hopeless. +TargetRestraint をこすりおとそうと身体をゆするが、全く効果がない。 + + +You need more grip to peel off the TargetRestraint... +TargetRestraint を剥がすには力が足りない。 Your trembling hands cant grip anything as they are, let alone undo the TargetRestraint. -あなたの震える手は、このままでは何も掴むことができません。ましてや、TargetRestraint を解除することはできません。 -You need something grippy to hold the TargetRestraint... -TargetRestraint を保持するには、滑りにくいものが必要です... -You rub yourself against the floor to no avail. If you had something adhesive to stick the TargetRestraint to... -床をこすっても無駄です。TargetRestraint を貼り付ける接着剤があれば... +手が震えて TargetRestraint を解くどころか何も握ることもできない。 +You rub yourself against the floor to no avail... +床に身体をこすりつけても全く効果がない…… + + The fastenings are too tight and secure on the TargetRestraint! -TargetRestraint の留め具がきつすぎてしっかり固定されていません! +TargetRestraint の留め具がきつすぎて、どうすることもできない! You roll around tryng to loosen the TargetRestraint to no avail. -TargetRestraint を緩めようとして転がり回っていますが無駄です。 +TargetRestraint を緩めようとして転がり回ったが、何も効果はなかった。 The TargetRestraint tightens itself as you try to undo it! -元に戻そうとすると、TargetRestraint が引き締まります! +解こうとすると、 TargetRestraint の締め付けが強くなった! You can't reach the TargetRestraint by yourself! -一人じゃTargetRestraintにはたどり着けない! +一人では TargetRestraint には届かない! You are too tightly bound to manipulate the TargetRestraint. -TargetRestraint を操作するには、拘束が強すぎます。 +TargetRestraint を操作しようとするも、きつすぎて手が届かない。 Your futile struggles do nothing to loosen the fasteners on the TargetRestraint. -あなたの無駄な努力は、TargetRestraint の留め具を緩めるのに何の役にも立ちません。 +いくらもがいても、 TargetRestraint の留め具は全く緩まなかった。 You try to undo the fasteners on the TargetRestraint, but they are blocked by other straps! -TargetRestraint のファスナーを外そうとしましたが、他のストラップによってブロックされています! +TargetRestraint の留め金を外そうとしても、ストラップに邪魔されて上手く行かない。 You rub your body uselessly as you find another strap securing the TargetRestraint. -TargetRestraint を固定している別のストラップを見つけると、無駄に体をこすります。 +TargetRestraint を固定している別のストラップを見つけて床に体をこすりつけるも、全く無駄だった。 You feel the Goddess' hand keeping the TargetRestraint tightly secured! -女神の手がTargetRestraintをしっかりと固定しているのを感じます! +女神の力により TargetRestraint から抜け出せない! +The TargetRestraint is too well-secured to take off with your level of restriction. +TargetRestraint はしっかりと固定されており、動きが制限された今の状態では外すことはできない。 The TargetRestraint is too durable to cut. -TargetRestraint は耐久性が高すぎて切断できません。 +TargetRestraint は頑丈すぎて切断できない。 Your hopeless attempts fail to even leave a scratch on the TargetRestraint. -あなたの絶望的な試みは、TargetRestraint に傷を残すことさえできません。 +いくら切ろうとしても、TargetRestraint には傷ひとつ残すこともできなかった。 You fail to leave even a scratch on the TargetRestraint! -TargetRestraintに傷一つ残さない! +TargetRestraint にはかすり傷すら残すこともできなかった! You can't get any leverage to cut the TargetRestraint with... -TargetRestraint をカットするための梃子が得られない... +TargetRestraint を切る体勢すらとれない…… You can't hold the knife firmly enough to cut the TargetRestraint. -TargetRestraint を切るのに十分なほどしっかりとナイフを保持できません。 +TargetRestraint を切断できるほど頑丈な刃物がない。 You cry out in your bindings as the knife bounces against the TargetRestraint uselessly. -ナイフがTargetRestraintに無駄に跳ね返ると、バインディングで叫びます。 +TargetRestraint は全く刃を通さず、絶望に涙が溢れる。 Your arms are kept from having leverage on the TargetRestraint due to another item. -あなたの腕は、別のアイテムのために、TargetRestraint を活用できません。 +別の拘束具のせいで、 TargetRestraint を解くために腕を使えない。 You fiddle with the tool, but your arms lack leverage on the TargetRestraint due to another item -あなたはツールをいじっていますが、あなたの腕は別のアイテムのために TargetRestraint を活用できません -The TargetRestraint flashes magically as the Goddess' curse resists your efforts! -女神の呪いがあなたの努力に抵抗すると、TargetRestraint が魔法のように点滅します! +道具を使おうとするも、別の拘束具のせいで、 TargetRestraint を解くために腕を使えない。 +Your restrictions limit your cutting power, unable to hurt the TargetRestraint. +拘束によって力が上手く乗らず、 TargetRestraint を傷つけることができない。 + + You pry at the TargetRestraint... -あなたはTargetRestraintをこじ開けます... +TargetRestraint を引き剥がそうとする…… You moan as the TargetRestraint squeeze you tightly... -TargetRestraintがあなたをきつく締めると、あなたはうめき声を上げます... +TargetRestraint が突然締め付けを強め、思わずうめき声が漏れた…… There's no way the TargetRestraint are just letting go! -TargetRestraint が手放すわけがない! +TargetRestraint が放してくれる気配はない。 You whimper as you realize the TargetRestraint won't let go no matter what... -TargetRestraint が何があっても離さないことを知って、あなたは泣き言を言います... +TargetRestraint が緩む気配は微塵もなく、思わず泣き言が漏れた…… You hear dark laughter as you realize the TargetRestraint won't let go... -TargetRestraint が手放せないことに気づくと、暗い笑い声が聞こえてきます... +TargetRestraint は緩む気配がない。どこからか陰湿な笑い声が聞こえる…… You hear a dark giggle as fruitlessly try to wiggle free from the TargetRestraint! -TargetRestraint から自由に小刻みに動こうとすると、暗いくすくす笑いが聞こえます! +TargetRestraint を解こうと身を捩るも、どこからかくすくすと笑い声が聞こえるだけだった。 + + You try to pull away from the TargetRestraint! -あなたはTargetRestraintから引き離そうとしています! +TargetRestraint を引き剥がそうとした。 You blush and try to escape the TargetRestraint's grip! -あなたは顔を赤らめ、TargetRestraint のグリップから逃れようとします! +頬が紅潮するのを感じながら、 TargetRestraint を外そうとした! The TargetRestraint's grip is too strong... -TargetRestraintのグリップが強すぎる… +TargetRestraint はピッタリと張り付いている…… The TargetRestraint's grip is too strong... it's hopeless. -TargetRestraint のグリップが強すぎて…どうしようもない +TargetRestraint はピッタリと張り付いていて、どうすることもできない…… You're bound too tight to have a chance at shaking off the TargetRestraint. -きつく縛られすぎて、TargetRestraint を振り払うチャンスがありません。 +きつく縛られすぎて、 TargetRestraint を解けない。 You whimper as you give up struggling against the TargetRestraint. -TargetRestraint との闘いをあきらめると、あなたは泣き言を言います。 +TargetRestraint はいくらもがいても全く緩まず、思わず泣き言が出た。 + + You wiggle around trying to get the TargetRestraint out... -あなたはTargetRestraintを取り出そうとしてうねっています... +TargetRestraint を抜こうともがく…… You squirm around trying to dislodge the TargetRestraint... -あなたはTargetRestraintを取り除こうとして身もだえしています... +TargetRestraint を抜こうと身を捩る…… The TargetRestraint is in too deeply, it won't come out. -TargetRestraintが奥に入りすぎて抜けません。 +TargetRestraint は深く挿入りすぎて出てこない。 You feel the TargetRestraint slide around inside but it won't come out! -TargetRestraint が内側でスライドするのを感じますが、出てきません! +TargetRestraint を抜こうとしても、ナカで動くだけで上手くいかない! Your bondage keeps the TargetRestraint firmly in place. -あなたのボンデージは、TargetRestraint をしっかりと固定します。 +貞操帯のせいで、TargetRestraint を取り外せない。 Your struggling does nothing but shift the TargetRestraint's position inside of you. あなたのもがきは、あなたの中でTargetRestraintの位置を変えるだけです。 -You wiggle around trying to get the TargetRestraint out... -あなたはTargetRestraintを取り出そうとしてうねっています... -You squirm around trying to dislodge the TargetRestraint... -あなたはTargetRestraintを取り除こうとして身もだえしています... + + The TargetRestraint won't come out. -TargetRestraintが出ません。 +TargetRestraint は出てくる気配がない。 You feel the TargetRestraint slide around but it won't come out! -TargetRestraint がスライドするのを感じるが、出てこない! +TargetRestraint を抜こうとしても、尻穴の中で動くだけで上手くいかない! Your bondage keeps the TargetRestraint secure in place. -あなたの束縛は、TargetRestraint を所定の位置に固定します。 -Your struggling does nothing to disloghe the TargetRestraint. -あなたの苦労は、TargetRestraint を否定するものではありません。 +貞操帯のせいで、 TargetRestraint を取り外せない。 +Your struggling does nothing to dislodge the TargetRestraint. +いくらもがいても TargetRestraint には無意味だ。 + + You work to unlace the TargetRestraint... -あなたはTargetRestraintを解くために働いています... +TargetRestraint を解こうとする…… You hurriedly try to unlace the TargetRestraint... -あなたは急いでTargetRestraintを解こうとします... +急いで TargetRestraint を解こうとする…… The TargetRestraint has no laces to loosen! -TargetRestraint には緩めるひもがありません! +TargetRestraint を解くためのひもが見当たらない! You sigh as you can't find any laces to loosen on the TargetRestraint. -TargetRestraint で緩めるひもが見つからないので、ため息をつきます。 +TargetRestraint を解くためのひもが見当たらず、ため息が出る。 The laces of the TargetRestraint are tied tight! -TargetRestraintの紐がきつく締まっている! +TargetRestraint はきつく締まりだした! You hopelessly try to untie the lacing on the TargetRestraint, but it's just too tight! -あなたはどうしようもなくTargetRestraintのひもを解こうとしますが、きつすぎます! +TargetRestraint を解こうとするが、きつすぎてどうしようもない! + + You grasp at the TargetRestraint, trying to peel it off... -TargetRestraint をつかんで、剥がそうとして… +TargetRestraint をつかみ、剥がそうとする…… You wiggle madly as you try to peel off the TargetRestraint! -TargetRestraint を剥がそうとするとき、あなたは狂ったように体をくねらせます! +TargetRestraint を剥がそうと、全力で身を捩る! The TargetRestraint reforms as you scoop it away! -ターゲットレストレイントはすくうと変形する! +TargetRestraint は突然変形した! You can't get the TargetRestraint off at all! -TargetRestraint が全然外せない! +TargetRestraint は全く外れる気配がない! The TargetRestraint is too fast at reforming! -TargetRestraintは改造が速すぎる! +TargetRestraint の変形が早すぎる! The TargetRestraint reforms too quickly as you try to squirm it off... -よじ登ろうとすると、TargetRestraint の変形が速すぎます... +TargetRestraint 身を捩って外そうとするも、変形が早すぎる…… + + You grasp around, looking for a seam on the TargetRestraint... -TargetRestraint の縫い目を探して、周りをつかみます... +TargetRestraint の縫い目を探し出して掴んだ…… You wiggle and squirm, looking for something to pull at on the TargetRestraint... -TargetRestraint で引っ張るものを探して、体をくねらせて身もだえします... +TargetRestraint の取っ掛かりを探して身をくねらせる…… The TargetRestraint encases you in a solid layer! -TargetRestraint はあなたをしっかりと包み込みます! +TargetRestraint が全身を包み込む! Try as you might, the TargetRestraint hugs you completely without any seams! -試してみてください。TargetRestraint は継ぎ目なしであなたを完全に包み込みます! +TargetRestraint に完全に包み込まれ、継ぎ目もなくなってしまった! The TargetRestraint is too tight to get any traction... -TargetRestraint がきつすぎてトラクションが得られません... +TargetRestraint がきつすぎて、抜け出すことができない…… The TargetRestraint squeezes your body too tightly to get any sort of ply... -TargetRestraint は体をきつく締めすぎて、どんな種類のプライも得ることができません... +TargetRestraint の締め付けが強すぎて、どうすることもできない…… + + You start peeling off the TargetRestraint... -あなたはTargetRestraintを剥がし始めます... +TargetRestraint を引きはがす…… You scratch at the TargetRestraint furiously... -TargetRestraintを猛烈に引っ掻いて…… +TargetRestraint をひっかいて剥がそうとする…… The TargetRestraint clings to your skin too tightly! -ターゲットレストレイントが肌に密着しすぎ! +TargetRestraint は肌に密着しすぎて効果がない! You groan in frustration as you try to peel the TargetRestraint off but realize it's too sticky. -TargetRestraint を剥がそうとすると、イライラしてうめき声を上げますが、粘着性が強すぎることに気付きます。 +TargetRestraint を剥がそうとするも、強力な粘着力にどうすることもできずうめき声を上げる。 You can't grip the edges to peel the TargetRestraint off! -TargetRestraint をはがすためにエッジをつかむことはできません! +TargetRestraint カドを掴んで解こうとするも、上手くいかない。 You make a futile attempt to rub the TargetRestraint off. -TargetRestraint をこすり落とそうとしても無駄です。 +TargetRestraint をこすって外そうとするも、上手くいかない。 + + You try to wiggle off the TargetRestraint... -あなたはTargetRestraintを小刻みに動かそうとしています... +身を捩って TargetRestraint を外そうとする…… You squirm trying to get the TargetRestraint to fall off... -TargetRestraint を落とそうと身もだえしている... +TargetRestraint を落とそうと体をくねらせる…… The TargetRestraint are magical and wrap themselves back around you of their own accord. -TargetRestraint は魔法のようで、自然にあなたの体を包み込みます。 +TargetRestraint はまるで魔法のように体を包み込んできた。 The TargetRestraint squeeze you tighter as you try to shake them off. -TargetRestraint は、振り落とそうとすると、あなたをきつく締めます。 +TargetRestraint を振り落とそうとすると、きつく締め上げてきた。 The TargetRestraint have you bound hopelessly tight! -TargetRestraint で、どうしようもなくきつく縛られてしまった! +TargetRestraint の拘束は全く緩む気配がない! You sigh and moan as the TargetRestraint aren't getting any looser. -TargetRestraint が少しも緩んでいないので、あなたはため息をつき、うめき声​​を上げます。 +TargetRestraint はまったく緩む気配がなく、思わずうめき声が出る。 + + + + +You look around for a fastener on the TargetRestraint... +TargetRestraint の留め具を探した…… +Shivering, you look for a fastener on the TargetRestraint... +凍えながら TargetRestraint の留め具を探した…… +The TargetRestraint has no fastener!!! +TargetRestraint には留め具がない! +The TargetRestraint is sealed around your body, with no fasteners to speak of! +TargetRestraint は体にピッタリとくっつき、留め具のたぐいは一切ないようだ。 +The TargetRestraint is firmly sealed around your body. +TargetRestraint は身体にしっかりとくっついている。 +You are sealed in ice. There is no escape. +氷で完全に拘束されている。逃げられない。 + + You try to untie the TargetRestraint... -あなたはTargetRestraintを解こうとしています... +TargetRestraint を解こうとする…… You contort yourself trying to reach the knots on the TargetRestraint... -あなたは、TargetRestraint の結び目に到達しようとして、自分自身をゆがめます... +体を捻って TargetRestraint の結び目に手を伸ばす…… The TargetRestraint's knot ties itself back again as soon as you get it loose! -TargetRestraint の結び目は、緩めるとすぐに元に戻ります! +TargetRestraint の結び目は、緩めてもすぐ元に戻ってしまう! The knots tighten themselves as soon as you reach them, keeping you trapped in the TargetRestraint. -結び目に到達するとすぐに結び目が締まり、TargetRestraint に閉じ込められたままになります。 +結び目を解こうとしてもすぐにきつく締まり、 TargetRestraint から抜け出せない。 You can't reach the knots on the TargetRestraint! -TargetRestraint の結び目に届かない! +TargetRestraint の結び目に届かない! Your squirming is in vain as you can't even reach the knots on the TargetRestraint. -TargetRestraint の結び目にさえ届かないので、身もだえは無駄です。 +いくら体を捻っても、 TargetRestraint の結び目に届かない。 + + You try to pull off the TargetRestraint... -あなたはTargetRestraintを引き離そうとしています... +TargetRestraint を引き剥がそうとする…… You tug on your TargetRestraint trying to get them off! -TargetRestraint を引っ張って外そうとしている! +TargetRestraint を引き剥がそうとする…… That would really hurt... -それは本当に痛いだろう... +かなり痛い…… You realize that would really hurt... -あなたはそれが本当に傷つくことを知っています... +無理に引き剥がそうとするととても痛い…… The TargetRestraint tug on your nipples as you squirm! -もじもじしながら乳首を引っ張るTargetRestraint! -The TargetRestraint tug on your nipples as you squirm! -もじもじしながら乳首を引っ張るTargetRestraint! +TargetRestraint を外そうとするも、乳首をつままれる感覚に身を捩る。 + + + + +You paw at the TargetRestraint from inside, hoping to find an opening... +TargetRestraint を中からつついて抜け出そうとするが…… +You flail around inside the TargetRestraint... +TargetRestraint の中で暴れ回った…… +The TargetRestraint is completely seamless! +TargetRestraint は完全に閉じているようだ! +The TargetRestraint is completely seamless! This is hopeless. +TargetRestraint は完全に閉じており、どうすることもできない! +You are too weak to poke your hand through the TargetRestraint... +TargetRestraint から抜け出すには力が足りない…… + + +You stretch yourself out inside the TargetRestraint! +TargetRestraint の中で体を伸ばし、抜け出そうとした。 +You bounce around inside the TargetRestraint! +TargetRestraint の中で飛び跳ね、抜け出そうとした。 +The TargetRestraint stretches to accomodate your movements... +TargetRestraint は体の動きに合わせて伸び縮みしている…… +The TargetRestraint tips slightly as you squirm around... +TargetRestraint から抜け出そうとするも、わずかに傾ける程度にしか動かない…… +You are too weak to make even a small dent in the TargetRestraint... +TargetRestraint から抜け出そうとするも、力が足りずにどうすることもできない…… +The TargetRestraint is unyielding despite your attempts... +TargetRestraint は少しも傷ついていない…… + + +You try to puncture the TargetRestraint... +TargetRestraint に穴を開けようとした…… +You poke around at the TargetRestraint... +TargetRestraint をつついた…… +The TargetRestraint is too durable to pop... +TargetRestraint は、穴を開けるには頑丈すぎる…… +The TargetRestraint is too strong despite your best efforts... +できる限りのことはしたが、 TargetRestraint は恐ろしく頑丈だ…… +You can't quite get enough force to pop the TargetRestraint... +TargetRestraint を穿つだけの力が足りない…… +Your attempts to pop the TargetRestraint are futile due to your restraints... +拘束された体では TargetRestraint から抜け出すだけの力が出せない…… + + The chest is too smooth to help. Maybe if you opened it? -胸が滑らかすぎてどうしようもない。開けたら? +胸にきれいに張り付いて引き剥がせない。別の方法を試すべきだ。 + + Lockable ロック可能 Non-Lockable ロック不可 + + Unlocked ロック解除 -Lock Type: -ロックの種類: -Red -赤 -Red -赤 -Red -赤 +Lock: +鍵: Simple -単純 -Green -緑 -Blue -青 -Purple -紫 -Gold -金 -Yellow -黄色 -Red Lock -レッドロック -Red Lock -レッドロック -Red Lock -レッドロック +簡単 +Standard +普通 +Secure +難しい +Disc +ディスク +Rubber +ゴム +Crystal +クリスタル +Runic +ルーン +Magic +魔法 +Cyber +電子 +Integrated Cyber +複合電子 +Advanced Cyber +強化電子 +Ancient +古代 Simple Lock -シンプルロック -Green Lock -グリーンロック -Blue Lock -ブルーロック -Purple Lock -紫ロック -Yellow Lock -イエローロック - - - - - - -(G) -(G) -(S) -(S) -(B) -(イ) -(G) -(G) -(P) -(P) -(?) -(?) -(Y) -(と) +簡単な錠 +Standard Lock +普通の錠 +Secure Lock +難しい錠 +Disc Lock +ディスクロック +Rubber Lock +ゴムの錠 +Divine Lock +女神の錠 +Crystal Lock +クリスタルの錠 +Runic Lock +ルーンの錠 +### Magic Lock + +Cyber Lock +電子錠 +Integrated Cyber Lock +複合電子錠 +Advanced Cyber Lock +強化電子錠 + + You can't use that while gagged! -猿轡かませたままでは使えません! +猿轡をかまされたままでは使えない! You can't use that without your fingers! -指がないと使えない! +指が不自由では使えない! You struggle against your bindings but it's too strict!. -縛りに苦戦しているが厳しすぎる! +拘束がきつすぎて、もがいても意味がない! You drop the pick due to your bound hands! -あなたは縛られた手のためにピックを落とします! +縛られた手で持とうとしたら、ロックピックを落としてしまった! You drop your knife due to your bound hands! -両手を縛られてナイフを落としたぞ! +縛られた手で持とうとしたら、ナイフを落としてしまった! You drop the precious knife due to your bound hands! -手を縛られて大切なナイフを落としてしまった! +縛られた手で持とうとしたら、大事なナイフを落としてしまった! You drop the key due to your bound hands! -縛られた手で鍵を落としたぞ! -You drop the magic key due to your bound hands! -縛られた手で魔法の鍵を落としたぞ! +縛られた手で持とうとしたら、鍵を落としてしまった! You drop the magic key due to your bound hands! -縛られた手で魔法の鍵を落としたぞ! -Logbook -ログブック -Logbook (N) -日誌 (N) +縛られた手で持とうとしたら、魔法のナイフを落としてしまった! +### You insert the card the wrong way and the reader ejects it onto the floor! + +Journal (N) +記録 (N) Passing... -通過... -Pass NPCs -NPCを渡す +通過する…… Closing... -閉鎖... +閉める…… Close door -ドアを閉めて +ドアを閉める Sprinting!!! スプリント!!! Sprint! -スプリント! +走る! Hopping!!! ホッピング!!! Hop! ホップ! You run! -あなたが実行します! +走った! You hop desperately! -あなたは必死に飛び跳ねます! +必死に飛び跳ねた! Close Door -ドアを閉めて +ドアを閉める Unlock -ロック解除 +解錠 Command -指図 +コマンド You utter a command word and release the lock! -合言葉を発してロックを解除! +コマンドワードを唱えると、鍵が開いた! You mutter an unintelligible command word and your locks do not open. -理解できないコマンド ワードをつぶやくと、ロックが開きません。 +でたらめにコマンドワードを唱えたが、解錠できなかった。 You mumble a command word but the lock opens! -合言葉をつぶやくが、鍵が開く! +コマンドワードをつぶやくと、鍵が開いた! You mess up saying the command word. The lock stays put! -あなたは合言葉を言い間違えました。ロックはそのままです! +コマンドワードを間違えたようだ。鍵は開かなかった。 +Swipe Keycard +カードキー +You swipe your keycard and the lock releases with a hiss! +カードキーをかざすと、ロックが外れる音がした。 +You swipe your keycard and the lock beeps 'Access Denied'! +カードキーをかざしたが、権限がないため開かないようだ。 +You don't have any card to scan in the slot. +カードキーを持っていない。 +Use Retinal Scanner +網膜スキャン +You scan your eye pattern and the lock releases with a hiss! +網膜スキャナーでロックを解除した。 +The lock rejects you, citing your lack of authority. +権限がないため、開かないようだ。 +You are blindfolded, so the scanner can't even see your eye! +目隠しをした状態では網膜スキャンはできない。 +Hack +ハッキング +You bypass the lock's cyber defenses and release it with a hiss! +扉にハッキングして解錠した。 +The lock beeps as its security blocks your attempts at release. +扉へのハッキングがバレてアクセスを拒否されてしまった。 +You have no way to hack the locking system. +ハッキングする方法を知らない。 Pick -選ぶ +ピッキング (No way to open) -(開けるわけがない) +(開けられない) (She cannot help you) -(彼女はあなたを助けることはできません) +(女神は助けてくれないようだ) Offer XXXg -XXXg を提供 +XXXg を払う Offer -オファー +願う You do not have enough for a proper offering. -適切な捧げ物をするのに十分ではありません。 +十分な貢物を持っていない。 The goddess removes some of your restraints! -女神があなたの拘束をいくらか解いてくれます! +女神の祝福により、いくつかの拘束から解放された! The goddess restores your mental and physical state! -女神が心身の状態を回復させる! +女神の祝福により回復した! The goddess teaches you the secrets of SCHOOL. (+1 level) -女神があなたにSCHOOLの秘密を教えます。(+1レベル) +女神は SCHOOL の秘法を教えてくれた。(+1レベル) The goddess of SCHOOL grants you destructive spellcasting! -SCHOOLの女神が破壊魔法を授ける! +SCHOOL の女神から破壊魔法を授かった! The goddess of SCHOOL grants you invisibility on attacks! -SCHOOLの女神が攻撃時に透明化を付与! +SCHOOL の女神の祝福により、攻撃時に透明になるようになった! The goddess of SCHOOL grants you protection and retaliation! -SCHOOLの女神が守りと報復を与える! +SCHOOL の女神から、守護と報復の力を授かった! You leave the coins on the altar and they transform into a ItemBought! -祭壇にコインを置いておくと、アイテム買物に変身! +祭壇にゴールドを捧げると、アイテムに変化した! object 物体 + + It appears to be a receptacle for an ancient crystal. -古代のクリスタルの受け皿のようです。 +パワークリスタルの台座のようだ。 It's a pile of slag emitting a strange magic smoke... -妙な魔煙を出すスラグの山だ…… -That object is locked -そのオブジェクトはロックされています -A shrine to the goddess of TYPE. A pool of mana glimmers below. -TYPEの女神を祀る神殿。その下に光る魔力の泉 +灰の山が魔力のこもった煙を上げている…… +That object is locked with a LKTP. +LKTP の鍵がかかっている。 A shrine to the goddess of TYPE. -TYPEの女神を祀る神社 +TYPE の女神を祀る祭壇。 That door is open. Do you want to close it? -そのドアは開いています。閉じますか? +ドアを閉じる? You slam the door and jam it shut! -あなたはドアをバタンと閉めて、ぎゅうぎゅう詰めにします! +ドアを思い切り閉めた! +Passion +欲情値 +Frustration +欲求不満度 Submissiveness -服従 +服従度 Security Level -セキュリティレベル +手配度 Undead アンデッド Latex @@ -4705,529 +6347,661 @@ Metal Ropes ロープ Restoration -復元 +再生 Elements -エレメンツ +エレメント Conjuration 召喚 Illusions -幻想 +幻惑 Commerce 商業 Shrine of SHRINETYPE -SHRINETYPEの祠 -Tablet of -のタブレット -Goddess Blessing: -女神の加護: -Goddess Curse: -女神の呪い: +SHRINETYPE の祠 +Tablet of +石版の種類: + + +Goddess: +女神: +Goddess Blessing: +女神の祝福: +Goddess Curse: +女神の呪い: +Mana Bonus: +マナボーナス: +Lack of Mana Penalty: +マナ不足のペナルティ: +Your excess mana helps you suppress the enchantment! +自身のマナが拘束具の魔法を弱めた! +Your mana is too weak to fight the magical enchantment... +拘束具の魔法に打ち勝つにはマナが足りない…… + + Curses 呪い -Willpower -意志力 + + A tablet inscribed with runes of TYPE. -TYPEのルーン文字が刻まれたタブレット -Teachings of SHRINETYPE -SHRINETYPEの教え +TYPE の石板 +SHRINETYPE Tablet +SHRINETYPE の石版 Decypher -デサイファー -You read the runes and they imbue you with power! -ルーン文字を読むと、力が湧いてきます! +解読 +You read the runes and they fill you with power! +ルーン文字を読むと、力が湧いてきた! +These runes are meant for someone with less willpower. +このルーンは意志の弱い人のためにあるようだ。 You try to read the runes but cannot understand them. -あなたはルーン文字を読もうとしますが、理解できません。 -Allies: -味方: -Enemies: +ルーン文字を読もうとするも、解読できない。 + + +Allies: +味方: +Enemies: 敵: +Favorable: +お気に入り: + + +None +なし Nevermere Trainers ネバーミアトレーナーズ DressUp Co. 株式会社ドレスアップ Bounty Hunters Guild -賞金稼ぎギルド +賞金稼ぎ Bandits -山賊 +盗賊 Constructs -構築物 -Witches' Coven -魔女の集会 +造物 School of Magic 魔法学校 Old Guardians -オールドガーディアン +古代のガーディアン Cult of the Wild -野生のカルト +自然のカルト Cult of Bast -カルト オブ バスト +バスト教団 Alchemists -アルケミスト +錬金術師 Elementals -エレメンタル +精霊 Dragonheart Order ドラゴンハートオーダー MaidForce メイドフォース Fungal Kingdom -真菌王国 -Wanted -募集 +キノコ王国 +Nature +自然 + + +Witches' Coven +魔女の集会 +Love Crafters +ラヴクラフター +Velvet Pact +ベルベットの盟約 +Knights Errant +盗賊騎士 +Scavengers +スカベンジャー +Fae Tricksters +トリックスター +Zora's Crew +ゾーラの一味 + + +Rope Dojo +縄師 +Doll Shoppe +ドールショップ +Fuuka's Shrine +フウカの眷属 +The Collectors +コレクター +Dollmaker Inc. +ドールメイカー株式会社 + + +Adventurer +冒険者 +Cursed Spirit +呪われし魂 Delinquent -滞納者 +不良 +Computer Virus +ウィルス +Extraplanar Entity +異星からの者 +Dubious Witch +怪しげな魔女 +Shadow Clan +影の一族 Illegal Poacher 密猟者 -Nature -自然 +Very Angry +怒っている Surprise! -サプライズ! +強襲者 +Fierce Debater +喧嘩中 + + Angels 天使 Demons 悪魔 + + You sense that the chest contains a trap and a lot of gold. -あなたは胸に罠とたくさんの金が入っているのを感じます. +宝箱には大量のゴールドが入っているが、罠も仕掛けられているようだ。 You sense that the chest is safe to open. -あなたは胸が開いても安全だと感じています。 +この宝箱は安全なようだ。 + + Drink 飲む Bottle -ボトル +汲む You have no restraints to 'offer' to the goddess. -女神に『捧げる』のは自由です +女神に捧げる"貢物"がない。 This shrine's mana pool is empty. -この祠のマナプールは空です。 +祭壇の泉は枯渇している。 You drink from the pool and and absorb its energies. -あなたはプールから水を飲み、そのエネルギーを吸収します。 +泉の水を飲み、マナを回復した。 You absorb the pool's energies through your face. -顔を通してプールのエネルギーを吸収します。 +泉に顔を浸し、マナを得た。 You collect what mana you can in a bottle. -ボトルに集められるだけのマナを集めます。 +泉の水を瓶に詰めた。 You drink from the pool and your mana is restored. -プールの水を飲むとマナが回復する +泉の水を飲み、マナを回復した。 You drink again, but you feel as if you are trespassing. -あなたは再び飲むが、まるで不法侵入しているように感じる. +再び水を飲むと、嫌な気配を感じた。 You drink again, knowing the risk this may entail... -リスクを承知の上で、またお酒を飲む… +とても嫌な気配がするが、もう一杯飲む…… You have angered the goddess of TYPE!!! -TYPEの女神を怒らせた!!! +TYPE の女神を怒らせてしまったようだ! The slime washes off in the fountain!!! -噴水でスライムが洗い流される!!! +泉の水でスライムを洗い流す。 +The goddess of TYPE is enraged and curses you with a divine punishment! (+RESTRAINT) +TYPE の女神の怒りに触れ、神罰が下った! (+RESTRAINT) + + The goddess offers a ItemTraded for ItemCost (NumCurrent/NumMax) -女神は ItemCost (NumCurrent/NumMax) の ItemTraded を提供します +女神は ItemCost (NumCurrent/NumMax) の ItemTraded を売ってくれる。 Next Offer -次のオファー +次の商品 Buy (press right) -買う(右を押す) +買う Cost: ItemCostgp -コスト:ItemCostgp +値段:ItemCostgp +Owned: AMNT +所持数: AMNT + + You climb down to the next level -あなたは次のレベルに降ります +次の階に降りる + + Level RestraintLevel (Rarity) -レベル拘束レベル(レアリティ) +拘束レベル: RestraintLevel ( Rarity ) + + +All +全部 Consumable 消耗品 -Equipped -装備 +Worn +着用中 Weapons -兵器 +武器 Outfits 服装 -Wearable -ウェアラブル +Restraints +拘束具 Miscellaneous その他 +Armor +アーマー + + The terrain makes noise as you rush across it... -突進すると地形が音を立てます... +地形が音を立てて変わっていった…… + + You can't reach the cuffs on your elbows, the chain is too short... -肘の袖口が届かない、チェーンが短すぎる… +鎖が短すぎて、肘の枷に届かない…… You contort your arms trying to reach the cuffs on your elbows, to no avail... -肘の袖口に手を伸ばそうとして腕をねじるが無駄だ... +いくら腕を捻ってみても、肘の枷に届かない…… Your elbows are kept together by the elbow cuffs, and you can't reach them. -あなたの肘は肘カフによって一緒に保たれ、あなたはそれらに到達することはできません. +両肘を枷で繋がれており、どう頑張っても肘に触れることはできない。 + + The strict chain on the cuffs keeps you from reaching them easily. -袖口の厳格なチェーンにより、簡単に手が届かなくなります。 +肘枷のせいで上手く届かない。 The cuffs limit your range of motion, making it harder to remove them. -袖口は可動域を制限するため、取り外しが難しくなります。 +枷に可動域を制限されて上手く外せない。 It's hard to take off the cuffs with your wrists linked together... -手首を組んでカフスを外すのが大変… +手首を繋がれたままでは枷を外すのが難しい…… + + You feel drained of energy... -エネルギーが枯渇しそう… +体力が尽きそう…… Your collar tingles and suddenly you feel weaker... -首輪がチクチクして急に弱くなった… +首輪がちくちくと痛みだし、力がうまく入らない…… Your collar drains your energy as you struggle... -あなたの首輪は、あなたが戦っているときにあなたのエネルギーを消耗させます... +首輪のせいでもがくと力を吸い取られる…… + + The rope between your legs keeps the toy secure... -足の間のロープがおもちゃをしっかりと固定しています... +股縄のせいで股間のオモチャはしっかりと固定されている…… Try as you might, the toy is held in place tight. -頑張ってください、おもちゃはしっかりと固定されています。 +もっと頑張らないと。オモチャはなかなか抜けない。 The toy won't wiggle loose. It's kept in place by your restraints. -おもちゃはぐるぐると緩まない。あなたの拘束具で固定されている。 +拘束具で固定されているため、いくら身を捩ってもオモチャが抜けない。 + + Your catsuit adheres to latex, making struggling more difficult! -あなたのキャットスーツはラテックスにくっつくので、もがくのが難しくなります! +身につけているキャットスーツがラテックスの拘束具とくっついて、もがいても効果が薄い! The item sticks to your rubber catsuit, making it harder to pull off... -アイテムがゴムのキャットスーツにくっついて脱ぎにくい… +ゴム製のキャットスーツにくっついて、上手く外せない…… The item hugs your catsuit tightly, adhering firmly! -あなたのキャットスーツをピタッと包み込み、ピタッと密着! +キャットスーツとぴったりくっついてしまった! + + +Your RSTRN holds you securely, making your struggling ineffectual... +RSTRN によってしっかりと拘束されている。もがいてもうまく拘束具を壊せない…… +Your RSTRN holds you tight, making it harder to move... +RSTRN によってきつく拘束されている。動くのが困難だ…… +Your RSTRN keeps you tied tight, making it harder to escape... +RSTRN によって締め付けられている。抜け出すのが困難だ…… + + The bright light weakens the shadow hands! -明るい光は影の手を弱める! +光が影の手の力を弱めた! + + You hear an ominous click, but nothing seems to happen. Looks like a misfire! -不吉なクリック音が聞こえますが、何も起こらないようです。不発のようです! +不吉な作動音が聞こえたが、何も起こらなかった。不発だったようだ。 + + Barrel Trap -バレルトラップ +樽の罠 A booby-trapped barrel with a spring-loaded lid designed to trap you inside! -あなたを中に閉じ込めるように設計されたバネ仕掛けの蓋が付いたブービートラップバレル! +フタにバネ仕掛けのついた樽の罠。 You can push the lid off with enough force... -ふたは力を込めて押すと外れます… +無理やり力を込めればフタは開きそう…… The lid of the barrel suddenly snaps shut as you hide inside!!! -中に隠れると樽の蓋がパチンと閉まる!!! +樽の中に入ると、突然フタが閉まった! + + + + Sarcophagus -石棺 +棺 A glass-walled chamber sealed with enchanting magic. -魅惑的な魔法で封印されたガラス壁の部屋。 +魔力の封印が施された、ガラス張りの棺。 Time feels like it's going by quickly outside... -外はあっという間に時間が過ぎてしまいそう… -Cage Trap -檻の罠 -A booby-trapped cage! -ブービートラップケージ! -Fit for a pretty toy like you~ -あなたのようなかわいいおもちゃにぴったり~ +外の時間があっという間に過ぎていく…… + + +Metal Cage +鉄の檻 +A metal cage with rigid bars, too narrow to put your head through. +金属製の檻。抜け出すには狭すぎる。 +Made for a pretty toy like you~ +可愛い犠牲者を閉じ込めておくために作られた檻。 Display Stand ディスプレイスタンド A display stand, fit for only the prettiest of trophies! -最も美しいトロフィーだけにふさわしいディスプレイスタンド! +美しいトロフィーだけを展示するディスプレイスタンド。 Your arms are pinned behind your back and you can barely move! -腕が後ろに固定されていて、ほとんど動けない! +後ろ手に全身を固定されてほとんど動けない! You hear a click as the door shuts behind you... -後ろでドアが閉まるカチッという音が… +背後でドアの閉まる音が…… +The display stand suddenly locks into place around you! +突然動き出したドールスタンドに閉じ込められてしまった! + + Doll Stand ドールスタンド A mobile display stand for dolls to keep them in place. -人形を固定する可動式ディスプレイスタンド +人形を固定するディスプレイスタンド As long as it's... inserted, you won't be going anywhere! -…挿入されている限り、あなたはどこにも行きません! -Doll Stand -ドールスタンド -A mobile display stand for dolls to keep them in place. -人形を固定する可動式ディスプレイスタンド +挿入されている限り、動けない…… + + +One Bar Prison +一本杭の牢 +A devious way to immobilize people. +移動を封じる悪辣な装置。 + + +### Metal Stand + +### As long as it's locked around you, you won't be going anywhere! + + + As long as it's attached, you won't be going anywhere! -付いている限り、どこにも行かない! +全身を固定されてほとんど動けない! + + You're not fooling anyone... -あなたは誰もだましていない... +こんなことをしても騙される人はいない…… You might be able to fool someone like this... -こんな人を騙せるかも… +これなら騙される人はいるかも…… You look like you're right at home! -あなたは家にいるように見えます! +きっと皆騙されてくれるはず。 + + Restraining Bed 拘束ベッド A bed with a booby trap designed to trap you on top of it! -その上にあなたを閉じ込めるように設計されたブービートラップ付きのベッド! +寝た姿勢のまま拘束するベルトついたベッド。 You have to get out somehow... -どうにか出さねば… +なんとかして起きなきゃ…… Belts emerge from underneath the bed and wrap around you, strapping you down tightly! -ベッドの下からベルトが出てきて、あなたを包み込み、きつく縛ります! +ベッドに横になると、突然ベルトが飛び出てきて固定されてしまった! + + Binding Dress -バインディングドレス +拘束ドレス It's a devious dress! I hope your elbows are flexible~ -ずるいドレスだ! 肘が柔軟だといいな~ -So many laces! It would quite a while to put this on normally. That's what magic is for! -ひもがたくさん! 普通に履くのは結構時間かかりますよね。それが魔法なんです! +美しさと拘束を兼ね備えたドレス。肘すら上手く動かせない。 +So many laces! It would take quite a while to put this on normally. That's what magic is for! +紐がたくさんついていて着るには時間がかかりそうだけど、魔法の力で簡単に着られる。 Ornamental Corset 観賞用コルセット Your figure looks gorgeous in this~ -これであなたの姿はゴージャスに見えます〜 +ちょっぴり大人に見えるコルセット。 It's so tight you won't be able to undo the laces yourself, dear! -きつすぎて、ひもを自分で解くことはできませんよ! +きつすぎて自分で脱ぐことはできない。 + + Fancy Ball Gag -ファンシーボールギャグ +ファンシーなボールギャグ A cute ball gag that fills your mouth right up! -口いっぱいに可愛いボールギャグ! +口を飾るかわいいボールギャグ。 What's this? it seems to have a magic spell protecting it from harm! -なにこれ? 危害から守る魔法がかかっているみたい! +魔法の力で外すのが難しいボールギャグ。 Fancy Muzzle -ファンシーマズル +ファンシーなマズル A muzzle to keep you from spitting out what's underneath. -下にあるものを吐き出さないようにする銃口。 +詰め物を吐き出させないようにするマズル。 Sorry dear, there's a mystic seal on there to keep it on nice and tight. -ごめんなさい、しっかりと固定するために神秘的なシールが貼ってあります。 -Red Binding Dress -レッドバインディングドレス +魔法の封印のせいで見た目以上にきつくて固い。 + + +Ornamental Dress +豪華な拘束ドレス A devious dress that forces the arms into an elbows-touching position. -腕をひじに触れる位置に強制するよこしまなドレス。 +肘を固定する赤いドレス。 It is extremely strict but it is only fabric. The lacing is intricate and will take a long time to remove. -非常に厳しいですが、ただの生地です。レースは複雑で、取り外すのに時間がかかります。 +非常にきついが、ただの生地でできている。紐がいっぱいあるので、取り外すのには時間がかかる。 + + Ornamental Gag 観賞用ギャグ -A gag meant to keep servants of the Resurrection Temple quiet by forcing a dildo into their mouth. -復活の神殿の使用人を口にディルドを押し込んで黙らせるための猿轡 +A gag meant to keep servants of the Resurrection Temple quiet by forcing a plug into their mouth. +再生の神殿の使用人に装着する、中にディルドのついた猿轡。 It is difficult to pull off and though it is made from white leather, a magic enchantment protects it from cutting. -引き抜きにくく、白い皮でできているのに、魔法のエンチャントで切断を防いでくれます。 +取り外しづらい上に、魔法の力で切断することもままならない白い革製の猿轡。 + + Panel Plug Gag パネルプラグギャグ -A gag meant to keep people quiet by forcing a dildo into their mouth. -ディルドを無理やり口に押し込んで、人を黙らせるためのギャグ +A gag meant to keep people quiet by forcing a plug into their mouth. +内側にディルドのついた猿轡。 It is difficult to pull off and though it is made from supple, heavy duty leather. -しなやかで丈夫な革なのに脱げにくい。 +柔軟で丈夫、それでいて脱げにくい。 + + Fuuka's Collar フウカの首輪 A collar enchanted with ghastly energy. -恐ろしいエネルギーを帯びた首輪 +恐ろしいエネルギーを帯びた首輪。 It seems to react with a pulse of energy whenever a nearby enemy is defeated. -近くの敵が倒されるたびに、エネルギーのパルスで反応するようです. +近くで敵が倒されるたびに、特殊なエネルギーを放つ。 Your collar pulses, and a revenant appears to avenge the enemy you defeated! -首輪が鼓動し、倒した敵の仇を討つレヴナント出現! +首輪が鼓動し、倒した敵が悪霊と化して襲いかかってきた! + + +Fuuka's Pet Collar +フウカのペット用首輪 +A collar enchanted with beneficial ghastly energy. +恐ろしいエネルギーを帯びた有益な首輪。 +Your collar pulses, and a revenant appears to assist you! +首輪が鼓動し、悪霊が助けに来た! + + Dress Bustier ドレスビスチェ A deceptively cruel device, making it impossible to reach your nipples. -一見残酷な装置で、乳首に手が届かない +胸を覆う衣装。かつては下着だったが、今ではアウターウェアとして作られたものもある。 Reinforced with steel plates, this will need bolt cutters to take off. -鋼板で補強されているため、外すにはボルト カッターが必要です。 -Nipple Massagers -ニップルマッサージャー -A pair of little teasers. -小さなティーザーのペア。 -They will make for some great fun! -彼らはとても楽しいものになるでしょう! +鋼板で補強されているため、簡単には取り外せない。 + + +Massagers +マッサージャー +A pair of little motion-activated teasers. They trigger when you swing your body for an attack. +動きを感知する振動体。武器を振ると反応して動きだす。 +They will make for some great fun! Type: Edging +もっと楽しめるようになる。タイプ:絶頂 +Advanced Massagers +高性能マッサージャー +A pair of sensitive motion-activated teasers. They trigger when you attack or struggle. +動きを敏感に感知する振動体。もがいたり、武器を振ると反応して動きだす。 +Nipple Weights +乳首の重り +A pair of dense weights dangling from your sensitive bits. +乳首にぶら下げる重り。 +They tend to swing around when attacking or casting arm spells. +攻撃時や魔法詠唱時に揺れる。 +Hi-Tech Massagers +ハイテクマッサージャー +A pair of highly-sensitive motion-activated teasers. They detect most forms of motion, including sprinting and hopping. +動きをとても敏感に感知する振動体。もがく、走る、跳ぶ、武器を振る等に反応して動きだす。 + + Control Harness コントロールハーネス An advanced harness for controlling high-security prisoners. -高セキュリティの囚人を制御するための高度なハーネス。 +危険な囚人に取り付ける強固なハーネス。 It seems to be made of flexible steel plates. -柔軟な鋼板でできているようです。 -Tracking Collar -トラッキング カラー -An advanced collar for tracking high-security prisoners. -高セキュリティの囚人を追跡するための高度な首輪。 +柔軟な鋼板でできている。 + + +Cyber Collar +サイバーカラー +An advanced collar for registering prisoners into the facility network. +囚人を施設のネットワークに登録するための高度な技術が使われた首輪。 It seems to be made of flexible steel plates, and it has a high-security lock. -柔軟な鋼板で作られているようで、セキュリティの高いロックがかかっています。 +柔軟な金属でできており、高度な錠前を備えている。 + + Latex Ball Gag ラテックスボールギャグ -A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. -ボールギャグのように見えるが、内部に口いっぱいの棒が入っているよこしまな仕掛け。 +A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +ボールギャグのように見えるが、ボール部分がディルドのように伸びていて外すのが難しい。弱体化及び前のターンに口を使用する魔法を使用した相手に対して、半分の力で使用できる。 The strap is made of a durable but flexible material -ストラップは丈夫でありながら柔軟な素材で作られています +ストラップは柔軟かつ丈夫な素材でできている。 +Large Latex Ball Gag +大きなラテックスボールギャグ +A devious device that looks like a large ball gag, but absolutely fills your mouth with a rubber cylinder. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +大きなボールギャグのように見えるが、ボール部分がディルドのように伸びていて外すのが難しい。弱体化及び前のターンに口を使用する魔法を使用した相手に対して、半分の力で使用できる。 + + Latex Mask -ラテックスマスク +青ラテックスマスク A slick layer of blue latex stretched over the mouth. -青いラテックスの滑らかな層が口の上に伸びています。 +青いゴムの膜が鼻上までピッタリと張り付いている。 It's very tight and makes it hard to move your mouth. -きつくて口が動かしにくいです。 +とてもタイトで口を動かしにくい。 + + +Secure Latex Mask +頑丈なラテックスマスク +A slick layer of blue latex stretched over the mouth. It has a lockable strap which prevents it from being removed. +青いゴムの膜が鼻上までピッタリと張り付いている。施錠するためのストラップが付いており、簡単には外せない。 + + Rubberized Gloves -ゴム引き手袋 +ラバーグローブ A mass of alchemical latex stretched over your arms, then hardened to the point that you can barely move your fingers! -錬金術のラテックスの塊が腕の上に伸び、指がほとんど動かないほど固くなった! +錬金術で作られたゴム。腕を覆うグローブ状で、指がほどんど動かせなくなる。 Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -一般的なゴムとは違い、丈夫でしなやかで、少し粘着性があります! +一般的なゴムとは違い、柔軟かつ丈夫で少し粘着性がある。 + + Rubberized Socks ラバーソックス A mass of alchemical latex stretched over your legs, then hardened. -錬金術のラテックスの塊が脚に伸びて固まった。 -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -一般的なゴムとは違い、丈夫でしなやかで、少し粘着性があります! +錬金術で作られたゴム。足を覆い、動かしにくくなる。 + + Rubberized Mask -ゴム引きマスク +ラバーフェイスマスク A mass of alchemical latex stretched over your entire face, then hardened. -錬金術のラテックスの塊が顔全体に伸びて固まった。 -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -一般的なゴムとは違い、丈夫でしなやかで、少し粘着性があります! +錬金術で作られたゴム。顔全体を覆い尽くしてしまう。 + + Rubberized Ball Gag ラバーボールギャグ -A mass of alchemical latex inflated to fill your mouth, then hardened. -口いっぱいに膨らんだ錬金術の乳液の塊が固まった。 -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -一般的なゴムとは違い、丈夫でしなやかで、少し粘着性があります! +A mass of alchemical latex inflated to fill your mouth, then hardened. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +錬金術で作られたゴムのボールギャグ。弱体化及び前のターンに口を使用する魔法を使用した相手に対して、半分の力で使用できる。 + + Rubberized OTN Mask -ゴム引きOTNマスク +ラバー鼻上マスク A mass of alchemical latex stretched over your mouth, then hardened. -錬金術のラテックスの塊が口の上に広がり、硬化した。 -Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -一般的なゴムとは違い、丈夫でしなやかで、少し粘着性があります! +鼻上までピッタリと張り付く、錬金術で作られたゴムのマスク。 + + Wolf Panties -オオカミのパンティー +オオカミのパンツ A set of vibrating panties designed to help subdue unruly wolfgirls. -手に負えないウルフガールを征服するのに役立つように設計された振動パンティーのセット. +手に負えないウルフガールを黙らせるために、クロッチ部分が振動するパンツ。 It's incredibly tight and difficult to remove once it's clipped on, but the material is rubber. -すごくきつくて、一度はめると外すのが大変ですが、素材はゴムです。 -You don't meet the conditions to equip that. -あなたはそれを装備する条件を満たしていません。 -Latex Boxtie Binder -ラテックスボクタイバインダー +とてもタイトな作りで脱ぐのに苦労しそうだが、ゴムでできているため簡単に切れそう。 + + +You can't equip that. +装備できない。 + + +Experimental Boxtie Binder +実験用ボックスバインダー A secure but comfortable binder meant for long-term wear by the alchemists' pets. -錬金術師のペットが長期間着用することを意図した、安全で快適なバインダー。 +錬金術師のペットが長時間着用することを想定した快適なバインダー。 Made from imbued latex, it will be hard to cut but not impossible. -注入されたラテックスから作られているので、切るのは難しいですが、不可能ではありません. -Binder Straps Cincher -バインダー ストラップ ニッパー -A tight cincher attached to a binder used to ensure restraints will not come off. -拘束具が外れないようにするために使用されるバインダーに取り付けられたタイトなニッパー。 +ゴムで型から作られているので、少し難しいが切ることはできる。 +Binder Harness +バインダーハーネス +A tight harness attached to a binder used to ensure restraints will not come off. +バインダーを補強して脱げないようにするハーネス。 It's tied in the back and reinforced with steel boning. -後ろで結ばれていて、鉄骨で補強されています。 -Blacksteel Ankle Cuffs -ブラックスチール アンクル カフス -Highly durable cuffs made from top-quality ancient metal. -最高級の古代金属を使用した耐久性の高いカフス -They're made of Blacksteel, a metal used by the Old Civilization. -それらは、旧文明で使用された金属であるブラックスチールでできています。 -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! -Blacksteel Cuffs Chain -ブラックスチール カフス チェーン -Highly durable cuffs made from top-quality ancient metal. -最高級の古代金属を使用した耐久性の高いカフス -They're made of Blacksteel, a metal used by the Old Civilization. -それらは、旧文明で使用された金属であるブラックスチールでできています。 -The ankle cuff chain detaches! -足首カフスのチェーンが外れる! +後ろにストラップがあり、鉄で補強されている。 Latex Posture Collar -ラテックス姿勢首輪 +ラテックスの姿勢首輪 A strict collar that makes it tougher to escape from other items. -他のアイテムから逃れにくくする厳格な首輪 +首の動きを制限し、他の拘束具を解きにくくする首輪。 It has steel boning but could be cut with enough care. -鋼の骨抜きがありますが、十分に注意して切ることができます。 -Blacksteel Ballet Heels -ブラックスチール バレエ ヒール +鉄で補強されているが、避ければ切ることは可能。 +Latex Ballet Heels +ラテックスのバレエヒール A pair of strict boots for making pets more manageable. A skilled person can still walk in these. -ペットをより扱いやすくするための厳格なブーツ。熟練した人はまだこれらで歩くことができます。 -They are reinforced with top-quality ancient metal. -最高品質の古代金属で強化されています。 -Blacksteel Leg Cuffs -ブラックスチールレッグカフ -A pair of chained cuffs made of Blacksteel, designed to slow the wearer. -着用者を遅くするように設計された、ブラックスチール製のチェーン付きカフのペア. -They're made of Blacksteel, a metal used by the Old Civilization. -それらは、旧文明で使用された金属であるブラックスチールでできています。 -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! -Blacksteel Cuffs -ブラックスチール カフス -A pair of Blacksteel cuffs that make it easy to restrain you. -拘束しやすい黒鋼のカフス -They're made of Blacksteel, a metal used by the Old Civilization. -それらは、旧文明で使用された金属であるブラックスチールでできています。 -The enemy attaches your wrist cuffs together! -敵があなたの手首カフをくっつけている! -Blacksteel Wrist Chain -ブラックスチールリストチェーン -A pair of Blacksteel cuffs keeping your arms behind your back. -腕を背中の後ろに留める一対の黒鋼の袖口。 -They're made of Blacksteel, a metal used by the Old Civilization. -それらは、旧文明で使用された金属であるブラックスチールでできています。 -Your cuffs detatch! -袖口が外れます! -The enemy attaches your elbow cuffs together! -敵があなたの肘カフをくっつけている! -Blacksteel Wrist Chain -ブラックスチールリストチェーン -A full set of Blacksteel cuffs keeping your arms in a strict elbow tie! -腕を厳密なエルボータイに留めるブラックスチールカフスのフルセット! -They're made of Blacksteel, a metal used by the Old Civilization. -それらは、旧文明で使用された金属であるブラックスチールでできています。 -Your wrists detatch, leaving your elbows still bound! -手首が外れても、肘は縛られたままだ! -Blacksteel Elbow Chain -ブラックスチールエルボーチェーン -A pair of Blacksteel cuffs keeping your elbows locked together!. -あなたの肘を一緒にロックするブラックスチールのカフのペア!. -They're made of Blacksteel, a metal used by the Old Civilization. -それらは、旧文明で使用された金属であるブラックスチールでできています。 -Your elbows detatch! -肘が外れます! -The enemy attaches your wrist cuffs back together! -敵があなたの手首のカフを元に戻します! +ペットを管理しやすくする、高いヒールの靴。慣れればまだ歩くことはできる。 +They are reinforced with top-quality hardened latex. +極めて高品質なゴムで作られている。 + + + + High-Security Armbinder -高セキュリティ アームバンド -An mythril armbinder enclosing your hands and arms completely, making your hands useless. -手と腕を完全に覆い、手を役に立たなくするミスリルのアームバインダー。 +厳重なアームバインダー +An armbinder enclosing your hands and arms completely, making your hands useless. +指先から肘までを覆う、厳重なアームバインダー Made of a flexible, yet durable material, it's going to be really tough to escape. -柔軟でありながら耐久性のある素材でできているため、逃げるのは非常に困難です。 +柔軟かつ耐久性のある素材でできているため、抜け出すのは極めて難しい。 +High-Security Boxbinder +厳重なボックスバインダー +A boxbinder enclosing your hands and arms completely, making your hands useless. +指先から肘までを覆う、厳重なボックスバインダー +High-Security Straitjacket +厳重な拘束衣 +A straitjacket enclosing your hands and arms completely, making your hands useless. +上半身を完全に覆う頑丈な拘束衣。 +High-Security Lockdown Jacket +厳重な監禁用拘束衣 +This jacket made with extra straps can even be used on top of another jacket for extra security. +拘束衣の上に着せて脱出を防ぐ、ベルトの多い拘束衣。 High-Security Legbinder -ハイセキュリティレグバインダー +厳重なレッグバインダー An mythril legbinder enclosing your legs, making it difficult to move. -脚を包み込み、動きにくくするミスリルのレグバインダー。 -Made of a flexible, yet durable material, it's going to be really tough to escape. -柔軟でありながら耐久性のある素材でできているため、逃げるのは非常に困難です。 +足を包み込む、頑丈なレッグバインダー。 + + High-Security Shackles -高セキュリティシャックル -A pair of mythril shackles around your feet. -ミスリルの枷を足に巻いている +厳重な足枷 +A pair of hardened steel shackles around your feet. +足に嵌める頑丈な枷。 Nearly indestructable, you are at the mercy of its lock. -ほぼ不滅、あなたはそのロックに翻弄されます。 -High-Security BallGag -高セキュリティ ボールギャグ +極めて頑丈で壊すことはほぼ不可能。解錠するしかない。 +High-Security Ball Gag +厳重なボールギャグ A rubber gag shoved tightly between your lips. -ゴム製のギャグが唇の間にきつく押し込まれました。 -The mythril straps are nigh-unbreakable, keeping you securely silenced. -ミスリルのストラップはほとんど壊れず、あなたをしっかりと沈黙させます。 -Potion Absorber -ポーションアブソーバー -An ancient device that allows direct use of potions even while gagged or bound. -猿轡か縛られていてもポーションを直接使用できる古代の装置. -Also allows fitting of a leash. -リードの装着も可能です。 +ゴム製のボールと頑丈なストラップでできたボールギャグ。 +The cable-reinforced straps are nigh-unbreakable, keeping you securely silenced. +頑丈なストラップを壊すことは極めて困難。素直に黙っているしかない。 +High-Security Muzzle +厳重なマズル +A secure muzzle made with cable-reinforced straps. +頑丈なケーブルで補強されたマズル。 +It is especially effective at keeping in other gags. +中の猿轡を守るマズル。 + + Potion Absorber ポーションアブソーバー An ancient device that allows direct use of potions even while gagged or bound. -猿轡か縛られていてもポーションを直接使用できる古代の装置. +猿轡をかまされていてもポーションを使用できる古代の装置。 Also allows fitting of a leash. -リードの装着も可能です。 +リードも取り付けられる。 Slime Walkers スライムウォーカー A pair of heels coated in a nonstick material. -ノンスティック素材でコーティングされたヒールのペア +ネバネバがくっつかない素材でコーティングされたヒール。 They will slow you down, but you can walk on slime without getting stuck! -足が遅くなりますが、スライムの上を歩けば動けなくなります! -Slime Walkers -スライムウォーカー -A pair of heels coated in a nonstick material. -ノンスティック素材でコーティングされたヒールのペア -They will slow you down, but you can walk on slime without getting stuck! -足が遅くなりますが、スライムの上を歩けば動けなくなります! -Gloves of Dexterity -器用の手袋 -A pair of gloves that makes your hits strike with elven grace--and force. -あなたのヒットをエルフの優雅さと力で攻撃させるグローブ。 -Increases accuracy by +50. Reduces melee damage by 30%. -命中率+50、近接ダメージ30%軽減。 -Gloves of Dexterity -器用の手袋 -A pair of gloves that makes your hits strike with elven grace--and force. -あなたのヒットをエルフの優雅さと力で攻撃させるグローブ。 -Increases accuracy by +50. Reduces melee damage by 30%. -命中率+50、近接ダメージ30%軽減。 -You find a pair of leather gloves with a magic rune. -魔法のルーンが入った革の手袋を見つけました。 -Bracers of Roaring Tides -轟潮のブレーサー -A pair of bracers that conjures a mighty wave upon attacking. -攻撃時に強力な波動を発生させる一対の腕輪。 -Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage. -敵を気絶させ、10 の酸ダメージを与える、攻撃時に AoE 遅延爆発を発生させます。 -Bracers of Roaring Tides -轟潮のブレーサー -A pair of bracers that conjures a mighty wave upon attacking. -攻撃時に強力な波動を発生させる一対の腕輪。 -Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage. -敵を気絶させ、10 の酸ダメージを与える、攻撃時に AoE 遅延爆発を発生させます。 -You find a pair of bracers that are transparent like water. -あなたは水のように透明な一組の腕輪を見つけます。 -The curse on the RestraintName is lifted! -RestraintName の呪いが解除されました ! -Press RIGHT to confirm buy! -右を押して購入を確定してください! - - +足が遅くなる代わりに、スライムの上を歩いても大丈夫! +Duster Gag +箒ギャグ +A special gag designed for maids to be useful even while tied up! It's self-locking too! +拘束されているメイドが掃除できるよう設計された猿轡。自動でロックされる。 +Deals 0.5 tickle damage on attack and adds +30 distraction. Bonus damage vs dirt and mold. +0.5くすぐり属性ダメージと30の興奮値を与える。粘菌とホコリに攻撃時、ボーナスを得る。 +Deals 0.5 tickle damage on attack and adds +30 distraction. +0.5くすぐり属性ダメージと30の興奮値を与える。 +Gas Mask +ガスマスク +A respirator designed to protect the wearer from noxious fumes. +有毒なガスから着用者を守るマスク。 ++50 Poison resist. Protects against dizziness caused by sleep gas. Affects speech. +毒耐性+50。ガスを吸い込まずに済むが、発音が悪くなる。 - - - - -You find -あなたが見つけます +The curse on the RestraintName is lifted! +RestraintName の呪いが解除された! +Press RIGHT to confirm buy! +購入する @@ -5236,12 +7010,12 @@ You find +You find +発見: -You find -あなたが見つけます @@ -5254,1958 +7028,1830 @@ You find -You find -あなたが見つけます Collar -えり +首輪 A classy leather collar. 上品な革の首輪 Allows fitting of a leash. -リードの取り付けを許可します。 +リードを取り付けられる。 Slave Collar 奴隷の首輪 A high-security steel collar befitting of a slave. -奴隷にふさわしい安全性の高い鋼の首輪 -Allows fitting of a leash. -リードの取り付けを許可します。 +頑丈な鋼鉄でできた、奴隷用の首輪。 Enchanted Collar 魔法の首輪 A collar made with magically enchanted materials. It is difficult to cut off. -魔法のエンチャント素材で作られた首輪。切れにくい。 -Allows fitting of a leash. -リードの取り付けを許可します。 +魔法のエンチャントされた首輪。切れにくい。 Kitty Collar -キティカラー +猫用の首輪 A collar made with magically enchanted materials. It is protected by the blessing of Bast. -魔法のエンチャント素材で作られた首輪。バストの加護を受けている。 -Allows fitting of a leash. -リードの取り付けを許可します。 +リードを取り付けられる。バスト神の加護を受けている。 Leash -ひも +リード A leash made from a strong material. 丈夫な素材のリード Functions as a handle for moving unruly prisoners. -手に負えない囚人を動かすためのハンドルとして機能します。 +囚人を引きずるときに役立つリード。 + + Prisoner Plug -プリズナープラグ +囚人のプラグ A teaser to keep you occupied. -あなたを夢中にさせるティーザー。 +脱獄どころではなくなる。 Buzzes on spellcast, and periodically as well. -スペルキャストでバズ、そして定期的にも。 +定期的に、または魔法を唱えた際に振動する。 High-Security Chastity Belt -高セキュリティ貞操帯 +厳重な貞操帯 A chastity belt to protect prisoners from themselves. -囚人を身を守るための貞操帯 +囚人の貞操を守るための拘束具。 Made of a highly durable material. -耐久性の高い素材で作られています。 +極めて頑丈な素材でできている。 Blacksteel Chastity Belt -黒鋼貞操帯 -A chastity belt to protect prisoners from themselves. -囚人を身を守るための貞操帯 -Made of a highly durable material. -耐久性の高い素材で作られています。 +黒鉄の貞操帯 + + Charms (Arms) -チャーム(腕) +リボン(腕) A band of faintly magic ribbon wrapped tight around your arms. -かすかに魔法のリボンがあなたの腕にきつく巻かれています。 +腕を縛り上げる、微弱な魔力を帯びたリボン。 It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +自然に巻き付いてくるが、切るのも引っ張るのも有効。 Charms (Legs) -チャーム(脚) +リボン(脚) A band of faintly magic ribbon wrapped tight around your thighs. -あなたの太ももにぴったりと巻きついた、かすかに魔法のリボンのバンド。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +太ももに巻き付く、微弱な魔力を帯びたリボン。 Charms (Feet) -チャーム(足) +リボン(足) A band of faintly magic ribbon wrapped tight around your ankles. -あなたの足首にきつく巻かれた、かすかに魔法のリボンのバンド。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +足首に巻き付く、微弱な魔力を帯びたリボン。 Charms (Head) -チャーム(頭) -A band of faintly magic ribbon wrapped tight around your eyes. -かすかに魔法のリボンの帯があなたの目の周りをきつく包みます。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +リボン(頭) +A band of faintly magic ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. +目の周りに巻き付く、微弱な魔力を帯びたリボン。クイックインベントリやホットバーから、任意のターゲットに使用できる。 Charm Gag -チャームギャグ -A band of faintly magic ribbon wrapped tight around your mouth. -かすかに魔法のリボンの帯があなたの口にきつく巻かれています。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +リボンギャグ +A band of faintly magic ribbon wrapped tight over the mouth. Can be used on vulnerable targets from quick inventory or hotbar. +口の周りに張り付く、微弱な魔力を帯びたリボン。クイックインベントリやホットバーから、任意のターゲットに使用できる。 Charm Wrapping (Toes) -チャームラッピング(つま先) +リボンラッピング(つま先) A layer of faintly magic ribbon wrapped tight around your feet. -微かに魔法のリボンの層があなたの足元にきつく巻かれています。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +足指に巻き付く、微弱な魔力を帯びたリボン。 Charm Wrapping (Head) -チャームラッピング(ヘッド) +リボンラッピング(ヘッド) A layer of faintly magic ribbon wrapped tight around your face. -微かに魔法のリボンの層があなたの顔にぴったりと巻きついた. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +顔を覆い尽くす、微弱な魔力を帯びたリボン。 Charm Wrapping (Arms) -チャームラッピング(アーム) +リボンラッピング(腕) A layer of faintly magic ribbon wrapped tight around your body. -微かに魔法のリボンがあなたの体を包み込んでいます。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +上半身に隙間なく巻き付く、微弱な魔力を帯びたリボン。 Charm Wrapping (Feet) -チャームラッピング(足) +リボンラッピング(足) A layer of faintly magic ribbon wrapped tight around your shins. -ほのかな魔法のリボンがすねにきつく巻かれています。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +足首にきつく巻き付く、微弱な魔力を帯びたリボン。 Charm Wrapping (Legs) -チャームラッピング(脚) +リボンラッピング(脚) A layer of faintly magic ribbon wrapped tight around your thighs. -あなたの太ももに、ほんのりと巻かれた魔法のリボンの層。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +太ももにきつく巻き付く、微弱な魔力を帯びたリボン。 +Living Charm Collar +生きているリボンの首輪 +This collar is designed to make sure its wearer does not escape their charms. +着用者をリボンで拘束し続けるための首輪。 +It will occasionally cause charms to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of charms you have on you. +装備していると、時折どこからともなくリボンが現れて拘束される。効果は装備しているリボンの数で増加する。 + + Leather Panel Gag レザーパネルギャグ A gag that seals your lips tightly and stuffs your mouth with a ball. -唇をギュッと閉じて、ボールを口に詰める猿轡。 +詰め物を吐き出させないようにするパネルの付いた猿轡。 +Keep your mouth to yourself! +口を閉じていなさい! +Harness Panel Gag +ハーネスパネルギャグ The harness is comprehensive and it's locked in place. -ハーネスは包括的で、所定の位置に固定されています。 +ハーネスは後ろで固定されている。 Harness Ball Gag ハーネスボールギャグ A gag that stuffs your mouth with a large silicone ball. -大きなシリコンボールを口に詰めるギャグ -The harness is comprehensive and it's locked in place. -ハーネスは包括的で、所定の位置に固定されています。 +ハーネスが付き、外しにくくなったボールギャグ。 + + Bast Gag バストギャグ A gag used to silence new initiates of the Bast cult. -バスト・カルトの新しいイニシエートを黙らせるために使われるギャグ。 -The harness is comprehensive and it's locked in place. -ハーネスは包括的で、所定の位置に固定されています。 +バスト教団の新人を指導するために使われるパネルギャグ。 Bast Muzzle バストマズル A muzzle used to keep a Bast gag secure. -バストギャグを安全に保つために使用される銃口. +バストギャグを外さないようにするマズル。 The leather panel is tough and tight. -革のパネルはタフでタイトです。 +とてもタイトで頑丈にできている。 Bast Blindfold -バスト目隠し +バストブラインド A blindfold used to aid in meditation. -瞑想を助ける目隠し。 +瞑想するときのための目隠し。 It is padded but still lets some light through. -パッドが入っていますが、それでも光を通すことができます。 +パッド付きだが、ほんの少し光を捉えることはできる。 Bast Paws -靭皮の足 +バストミトン Leather mittens used to pacify new initiates of the Bast cult. -バスト・カルトの新しいイニシエートをなだめるために使われる革製のミトン. +バスト教団の新人を指導するために使われるミトン。 They make it hard to manipulate anything at all, but aren't the toughest material. -それらは何かを操作することをまったく難しくしますが、最も頑丈な素材ではありません. +指を使えなくなるが、頑丈ではない。 Bast Suit バストスーツ A skintight suit used on unruly initiates of the Bast cult. -バスト・カルトの手に負えないイニシエートに使用される肌に密着したスーツ. +バスト教団で罰として使用されるスーツ。 It's nearly impossible to escape without help once locked inside. -中に閉じ込められたら、助けなしに逃げることはほぼ不可能です。 +一度着たら一人で抜け出すのは極めて難しい。 Bast Petsuit バスト ペットスーツ Enhanced suit used for select members of the Bast cult. -バスト教団の選抜メンバーが使用する強化スーツ -It's nearly impossible to escape without help once locked inside. -中に閉じ込められたら、助けなしに逃げることはほぼ不可能です。 +バスト教団の精鋭が使用する強化スーツ。 + + Magic Petsuit 魔法のペットスーツ A set of straps and buckles enchanted with a powerful spell to render you helpless. -あなたを無力にする強力な魔法がかけられたストラップとバックルのセット. +着用者を無力化する魔法が込められたペットスーツ。 It's warded against cutting by nonmagic blades. -魔法以外の刃物による切断を防いでくれます。 +魔法以外の刃物を通さない。 + + +Latex Petsuit +ラテックスのペットスーツ +A skintight suit that encases you in a tight rubber embrace. +身体をぴったりと覆い、包容感を与えるラテックスのペットスーツ。 +The thick latex is resistant to even the most determined struggles. +分厚いラテックスで作られており、激しくもがいても全く緩まない。 + + Blessed Wrappings (Head) -祝福されたラッピング(ヘッド) -A band of magic embalming ribbon wrapped tight around your eyes. -魔法のエンバーミング リボンのバンドがあなたの目の周りにきつく巻かれています。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +祝福された包帯(頭) +A band of magic embalming ribbon wrapped tight around your face. +顔周りにきつく巻き付く、祝福が施された包帯。クイックインベントリやホットバーから、任意のターゲットに使用できる。 +Blessed Wrappings (Eyes) +祝福された包帯 (目) +A band of magic embalming ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. +目の周りにきつく巻き付く、祝福が施された包帯。 Blessed Wrappings (Gag) -祝福されたラッピング (ギャグ) -A band of magic embalming ribbon wrapped tight around your mouth. -魔法のエンバーミング リボンのバンドがあなたの口にきつく巻かれています。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +祝福された包帯 (口) +A band of magic embalming ribbon wrapped tight over mouth. Can be used on vulnerable targets from quick inventory or hotbar. +口にきつく巻き付く、祝福が施された包帯。クイックインベントリやホットバーから、任意のターゲットに使用できる。 Blessed Wrappings (Arms) -祝福されたラッピング(腕) +祝福された包帯(腕) A layer of magic embalming ribbon wrapped tight around your body. -魔法のエンバーミング リボンの層があなたの体にきつく巻かれています。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +上半身にきつく巻き付く、祝福が施された包帯。 Blessed Wrappings (Feet) -祝福されたラッピング(フィート) +祝福された包帯(足) A layer of magic embalming ribbon wrapped tight around your shins. -あなたのすねにきつく巻かれた魔法のエンバーミング リボンの層。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +足にきつく巻き付く、祝福が施された包帯。 Blessed Wrappings (Toes) -祝福されたラッピング(つま先) +祝福された包帯(つま先) A layer of magic embalming ribbon wrapped tight around your feet. -あなたの足にきつく巻かれた魔法の防腐リボンの層。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +つま先にきつく巻き付く、祝福が施された包帯。 +Blessed Wrappings (Hands) +祝福された包帯(手) +A layer of magic embalming ribbon wrapped tight around your hands. +手にきつく巻き付く、祝福が施された包帯。 Blessed Wrappings (Legs) -祝福されたラッピング(足) +祝福された包帯(脚) A layer of magic embalming ribbon wrapped tight around your thighs. -魔法のエンバーミング リボンの層があなたの太ももにきつく巻かれています。 -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -ほとんど自然にくっつきますが、切ったり伸ばしたりすると傷つきやすいようです。 +脚にきつく巻き付く、祝福が施された包帯。 +Living Blessed Wrappings Collar +生きている祝福された包帯の首輪 +This collar is designed to make sure its wearer does not escape their wrappings. +着用者を祝福された包帯で拘束し続けるための首輪。 +It will occasionally cause blessed wrappings to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of blessed wrappings you have on you. +装備していると、時折どこからともなく祝福された包帯が現れて拘束される。効果は装備している祝福された包帯の数で増加する。 + + +Tape (Hands) +テープ(手) +Sleek and shiny tape for the bondage enthusiast. +滑らかで光沢のある、拘束愛好家のためのテープ。 +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +伸縮性のある防水テープ。肌を傷めずに剥がすことができ、破れにくい。 +Tape (Arms) +テープ(腕) +Tape (Legs) +テープ(脚) +Tape (Feet) +テープ(足) +Tape (Head) +テープ(顔) +Sleek and shiny tape for the bondage enthusiast. Can be used on vulnerable targets from quick inventory or hotbar. +滑らかで光沢のある、拘束愛好家のためのテープ。クイックインベントリやホットバーから、任意のターゲットに使用できる。 +Tape Gag +テープ(口) +Tape Mouth Wrap +テープ巻き(口) +Tape Wrapping (Toes) +テープ巻き(つま先) +Tape Wrapping (Head) +テープ巻き(頭) +Tape Wrapping (Arms) +テープ巻き(腕) +Tape Wrapping (Feet) +テープ巻き(足) +Tape Wrapping (Legs) +テープ巻き(脚) +Living Tape Collar +生きているテープの首輪 +This collar is designed to make sure its wearer does not escape their tape. +着用者をテープで拘束し続けるための首輪。 +It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. +装備していると、時折どこからともなくテープが現れて拘束される。効果は装備しているテープの数で増加する。 + + +Autotape +オートテープ +Comes in convenient cartridges for machine loading. +装填用カートリッジ付き。 +A specialized tape used for capturing purposes during the time of the Old Civilization. Despite its appearance, it contains a gas-permeable membrane that allows ventilation, while its hydrophobic properties resist solvents that would otherwise disrupt the adhesive bond. The adhesive layer is special in that it activates only in contact with other auto-tape, making it safer to use and remove. +旧文明で使用されていた、捕獲用のテープ。見た目とは裏腹に通気性があり、水も弾くため剥がれにくい。着用者の肌を保護するため、オートテープ同士でしかくっつかない。 + + +Rubberized Tape +ラバーテープ + + +Magic Charms +魔法のリボン +Magical charms from the ancient graveyard. +墓場で見つけられる、魔法のリボン。 +Its magic is not enough to protect it from damage, but it is surprisingly effective at restraining both intruders and cursed entities. +守護の魔法が不完全であまり傷には強くないが、侵入者やゾンビを捕まえるには十分。 + + +Blessed Wrapping +祝福された包帯 +A layer of magic embalming ribbon. +遺体を包むための魔法のリボン。 +It clings of its own accord to intruders and naughty catgirls. +侵入者や素行の悪いバスト教の信者に勝手に纏わりつく包帯。 + + Autotape (Hands) オートテープ(手) Sticky tape made from a metallic material. Used to great effect in police situations. -金属素材の粘着テープ。警察などで威力を発揮 +警察官が使用する、金属素材の粘着テープ。 It's very sticky and seals your hands tightly, making any struggling ineffective. -粘着性が高く、手をしっかりと密閉するので、苦労しても効果がありません。 +粘着性が高く、手をしっかり覆っているのでもがいても効果が薄い。 Autotape (Head) オートテープ(頭) -Sticky tape made from a metallic material. Used to great effect in police situations. -金属素材の粘着テープ。警察などで威力を発揮 +Sticky tape made from a metallic material. Used to great effect in police situations. Can be used on vulnerable targets from quick inventory or hotbar. +警察官が使用する、金属素材の粘着テープ。クイックインベントリやホットバーから、任意のターゲットに使用できる。 It's very sticky and tough but you could probably get a knife through it. -それは非常に粘着性があり、タフですが、おそらくナイフを通すことができます. +頑丈で粘着性があるが、ナイフで切れる。 Autotape (Arms) -オートテープ(アームズ) -Sticky tape made from a metallic material. Used to great effect in police situations. -金属素材の粘着テープ。警察などで威力を発揮 -It's very sticky and tough but you could probably get a knife through it. -それは非常に粘着性があり、タフですが、おそらくナイフを通すことができます. +オートテープ(腕) Autotape (Legs) オートテープ(脚) -Sticky tape made from a metallic material. Used to great effect in police situations. -金属素材の粘着テープ。警察などで威力を発揮 -It's very sticky and tough but you could probably get a knife through it. -それは非常に粘着性があり、タフですが、おそらくナイフを通すことができます. Autotape (Ankles) -オートテープ(足首) -Sticky tape made from a metallic material. Used to great effect in police situations. -金属素材の粘着テープ。警察などで威力を発揮 -It's very sticky and tough but you could probably get a knife through it. -それは非常に粘着性があり、タフですが、おそらくナイフを通すことができます. +オートテープ(足) Autotape (Feet) -オートテープ (フィート) -Sticky tape made from a metallic material. Used to great effect in police situations. -金属素材の粘着テープ。警察などで威力を発揮 -It's very sticky and tough but you could probably get a knife through it. -それは非常に粘着性があり、タフですが、おそらくナイフを通すことができます. +オートテープ (つま先) Autotape (Mouth) オートテープ(口) -Sticky tape made from a metallic material. Used to great effect in police situations. -金属素材の粘着テープ。警察などで威力を発揮 -It's very sticky and tough but you could probably get a knife through it. -それは非常に粘着性があり、タフですが、おそらくナイフを通すことができます. +Autotape (Mouth Wrap) +オートテープ巻き(口) +Living Auto Tape Collar +生きているオートテープの首輪 +It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. +装備していると、時折どこからともなくオートテープが現れて拘束される。効果は装備しているテープの数で増加する。 + + Stuffing 詰め物 -A stuffing of cloth. -布の詰め物 +A stuffing of cloth. Can be applied on vulnerable targets or those who casted a verbal spell last turn. +布の詰め物。弱体化及び前のターンに口を使用する魔法を唱えた相手に使用可能。 You could spit it out easily, provided nothing's covering it. -何も覆っていなければ、簡単に吐き出すことができます。 -Arm Ropes -アームロープ -Faintly glowing ropes from a magic trap. -魔法の罠から微かに光るロープ。 -I wonder who was responsible? -誰が責任をとったのかしら? -Leg Ropes -レッグロープ -Faintly glowing ropes from a magic trap. -魔法の罠から微かに光るロープ。 -I wonder who was responsible? -誰が責任をとったのかしら? -Magic Hogtie -魔法のホグタイ -It pulls your wrists up to your ankles! So tight! -手首から足首まで引っ張る!とてもきつい! -The knots appear to tie themselves together again, making them impossible to undo! -結び目は再び互いに結び付いているように見え、元に戻すことはできません! -Magic Arm Rope -マジックアームロープ -Strongly glowing ropes. -強く光る縄 -The knots appear to tie themselves together again, making them impossible to undo! -結び目は再び互いに結び付いているように見え、元に戻すことはできません! -Magic Rope Cuffs -マジックロープカフス -Strongly glowing ropes. -強く光る縄 -The knots appear to tie themselves together again, making them impossible to undo! -結び目は再び互いに結び付いているように見え、元に戻すことはできません! -Magic Ropework -マジックロープワーク -Strongly glowing ropes tied in an intricate pattern, making hand restraints more secure. -複雑なパターンで結ばれた強く光るロープで、手の拘束具をより安全にします。 -The knots appear to tie themselves together again, making them impossible to undo! -結び目は再び互いに結び付いているように見え、元に戻すことはできません! -Magic Leg Rope -マジックレッグロープ -Strongly glowing ropes. -強く光る縄 -The knots appear to tie themselves together again, making them impossible to undo! -結び目は再び互いに結び付いているように見え、元に戻すことはできません! -Magic Ankle Rope -マジックアンクルロープ -Strongly glowing ropes. -強く光る縄 -The knots appear to tie themselves together again, making them impossible to undo! -結び目は再び互いに結び付いているように見え、元に戻すことはできません! -Magic Crotch Rope -魔法の股縄 -Strongly glowing ropes. -強く光る縄 -The knots appear to tie themselves together again, making them impossible to undo! -結び目は再び互いに結び付いているように見え、元に戻すことはできません! -Magic Toe Rope -マジックトーロープ -Strongly glowing ropes. -強く光る縄 -The knots appear to tie themselves together again, making them impossible to undo! -結び目は再び互いに結び付いているように見え、元に戻すことはできません! -Mithril Hogtie -ミスリルホグタイ -It pulls your wrists up to your ankles! So tight! -手首から足首まで引っ張る!とてもきつい! -Made of woven mithril and enchanted to require magic blades to cut! -織りミスリルで作られ、魔法の刃を切断するようにエンチャントされています! -Mithril Arm Rope -ミスリルアームロープ -Strongly shining ropes. -強く輝く縄。 -Made of woven mithril and enchanted to require magic blades to cut! -織りミスリルで作られ、魔法の刃を切断するようにエンチャントされています! -Mithril Leg Rope -ミスリルレッグロープ -Strongly shining ropes. -強く輝く縄。 -Made of woven mithril and enchanted to require magic blades to cut! -織りミスリルで作られ、魔法の刃を切断するようにエンチャントされています! -Mithril Ankle Rope -ミスリルアンクルロープ -Strongly shining ropes. -強く輝く縄。 -Made of woven mithril and enchanted to require magic blades to cut! -織りミスリルで作られ、魔法の刃を切断するようにエンチャントされています! -Mithril Crotch Rope -ミスリルクロッチロープ -Strongly shining ropes. -強く輝く縄。 -Made of woven mithril and enchanted to require magic blades to cut! -織りミスリルで作られ、魔法の刃を切断するようにエンチャントされています! -Mithril Rope Harness -ミスリルロープハーネス -Strongly shining ropes. -強く輝く縄。 -Made of woven mithril and enchanted to require magic blades to cut! -織りミスリルで作られ、魔法の刃を切断するようにエンチャントされています! -Mithril Toe Rope -ミスリルつま先ロープ -Strongly shining ropes. -強く輝く縄。 -Made of woven mithril and enchanted to require magic blades to cut! -織りミスリルで作られ、魔法の刃を切断するようにエンチャントされています! +他の猿轡で口を覆われていなければ、簡単に吐き出せる。 + + + + +Living Mithril Collar +生きているミスリルの首輪 +A collar made from an almost-weightless alloy that adjusts itself to your neck. +ほとんど重さを感じさせないミスリルの首輪。首の太さに合わせて調整できる。 +It will occasionally cause mithril to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of mithril you have on you. +装備していると、時折どこからともなくミスリルが現れて拘束される。効果は装備しているミスリルの拘束具の数で増加する。 + + Mithril Collar -ミスリルカラー +ミスリルの首輪 A collar made from an almost-weightless alloy.. -ほぼ無重力の合金で作られた首輪.. +ミスリルでできており、重さを感じない首輪。 It feels comfortable but it's also really hard. -気持ちいいけど、すごく難しい。 +快適なつけ心地だが、恐ろしく硬い。 + + Mithril Cuffs -ミスリルカフス +ミスリルの手枷 A pair of cuffs that make it easy to restrain you. -拘束しやすいカフス +拘束しやすい手枷。 They feel like they aren't even there, but the material is rigid and unyielding. -彼らはそこにさえいないように感じますが、素材は硬く、屈服しません. +全く重量を感じないが、極めて硬い。 The enemy attaches your wrist cuffs together! -敵があなたの手首カフをくっつけている! -Cuffs Wrist Chain -カフリストチェーン +手首に枷を取り付けられた! + + +Wrist Chain +手枷の鎖 A pair of cuffs keeping your arms behind your back. -腕を背中の後ろに留める袖口のペア。 -They feel like they aren't even there, but the material is rigid and unyielding. -彼らはそこにさえいないように感じますが、素材は硬く、屈服しません. +手枷をつなぐための鎖。 Your cuffs detatch! -袖口が外れます! +枷を外した! The enemy attaches your elbow cuffs together! -敵があなたの肘カフをくっつけている! -Cuffs Wrist Chain -カフリストチェーン +肘に枷を取り付けられた! + + +Cuffs Chain +枷の鎖 A full set of cuffs keeping your arms in a strict elbow tie! -腕をきっちり肘紐で留める袖口フルセット! -They feel like they aren't even there, but the material is rigid and unyielding. -彼らはそこにさえいないように感じますが、素材は硬く、屈服しません. +手枷を後ろ手につなぐための鎖。 Your wrists detatch, leaving your elbows still bound! -手首が外れても、肘は縛られたままだ! -Elbow Cuffs Chain -肘カフスチェーン -A pair of cuffs keeping your elbows locked together!. -両肘を固定する袖口! -They feel like they aren't even there, but the material is rigid and unyielding. -彼らはそこにさえいないように感じますが、素材は硬く、屈服しません. +手首の鎖を外しても肘はまだ繋がれたままだ! + + +Elbow Chain +肘枷の鎖 +A pair of cuffs keeping your elbows locked together! +肘枷同士をつなぐための鎖。 Your elbows detatch! -肘が外れます! +肘の枷に付いている鎖を外した! The enemy attaches your wrist cuffs back together! -敵があなたの手首のカフを元に戻します! +後ろ手に枷同士を取り付けられた! + + Mithril Leg Cuffs -ミスリルレッグカフス +ミスリルの脚枷 +A pair of cuffs on your legs. +腿に取り付く枷。 +The enemy attaches your leg cuffs together! +脚枷同士を繋げられた! +Thigh Chain +脚枷の鎖 A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -They feel like they aren't even there, but the material is rigid and unyielding. -彼らはそこにさえいないように感じますが、素材は硬く、屈服しません. +脚を鎖でつなぐための枷。 +The leg cuff chain detaches! +脚枷の鎖が外れた! + + Mithril Ankle Cuffs -ミスリルアンクルカフス -A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -They feel like they aren't even there, but the material is rigid and unyielding. -彼らはそこにさえいないように感じますが、素材は硬く、屈服しません. +ミスリルの足枷 +A pair of cuffs on your ankles. +足首に取り付く枷。 The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! -Cuffs Chain -カフスチェーン -A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -They feel like they aren't even there, but the material is rigid and unyielding. -彼らはそこにさえいないように感じますが、素材は硬く、屈服しません. +足首に枷を取り付けられた! +Ankle Chain +足枷の鎖 The ankle cuff chain detaches! -足首カフスのチェーンが外れる! +足首の枷に付いている鎖が外れた! +Your ankle cuff chain is tightened and pulls your feet together! +足首の枷の鎖が締まり、足が引き寄せられた! +Short Ankle Chain +短い足枷の鎖 +A pair of cuffs chaining your feet tightly together. +足枷同士を繋ぐ短い鎖。 +Your ankle cuff chain loosens! +足枷の鎖が緩んだ! + + +Living Leather Collar +生きている革の首輪 +A collar made of tough leather that adjusts itself to your neck. +頑丈な革でできた首輪。首の太さに合わせて調整できる。 +It will occasionally cause leather to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of leather you have on you. +装備していると、時折どこからともなく革の拘束具が現れて拘束される。効果は装備している革の拘束具の数で増加する。 + + +Leather Cuffs +革の手枷 +Made of tough leather. +丈夫な革でできている。 + + + + +Leather Leg Cuffs +レザーレッグカフス + + +Leather Ankle Cuffs +革の足枷 + + Sticky Slime -ねばねばスライム +ねばねばのスライム A sticky layer of slime keeping you anchored to the ground. -スライムの粘り気のある層があなたを地面に固定します。 +身体中にくっついたスライム。 It will slow you for a single turn. -それはあなたを1ターン遅くします。 +地面に固定されているため、動きが遅くなる。 Leather Mittens -レザーミトン +革のミトン A pair of tight leather mittens enclosing your hands. -あなたの手を包むタイトな革のミトン。 +手を包み込む革のミトン。 They make it almost impossible to manipulate keys and tools. Keep your hands to yourself! -鍵やツールを操作することはほとんど不可能です。手を離さないようにしてください! +指が使えないため、道具を使うのが難しくなる。 +Leather Legbinder +革のレッグバインダー +A tight leather legbinder that keeps your feet glued together. +足を覆い、開けなくする革のレッグバインダー +It's quite snug and the laces are secured with a lockable panel. Getting at them requires picking the lock. +長い紐と頑丈なロックで繋ぎ止められている。外すにはピッキングする必要がある。 Leather Armbinder -レザーアームバンド +革のアームバインダー A tight leather armbinder enclosing your hands and arms completely. -手と腕をすっぽりと包むタイトな革のアームバインダー +指先から肘までを覆う革の拘束具。 It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible. -それは非常にぴったりで、後ろのロック可能なバックルで固定されています。ロックを自分で選ぶことは不可能です. +腕をすっぽりと覆い、後ろでロックされているため、自分一人の力で解錠するのは不可能。 +Leather Boxbinder +革のボックスバインダー +A secure but comfortable binder meant for long-term wear. +長期間の着用を想定した、厳重で快適なボックスバインダー Leather Armbinder Harness -レザーアームバインダーハーネス +革のアームバインダーハーネス Leather belts securing your armbinder tightly. -アームバインダーをしっかり固定する革ベルト +アームバインダーをしっかりと固定する革のベルト。 It's quite tight and secured by lockable buckles on your sides. -かなりタイトで、側面のロック可能なバックルで固定されています。 +側面に錠がついており、アームバインダーをしっかりと固定する。 The armbinder harness comes off with the armbinder. -アームバインダーのハーネスはアームバインダーと一緒に外れます。 +このハーネスはアームバインダーを外したときに一緒に外れる。 +The energy link between your ankle cuffs fizzles into nothing. +足枷のエネルギーリンクが消失した。 +The energy link between your arm cuffs fizzles into nothing. +手枷のエネルギーリンクが消失した。 +The energy link between your thigh cuffs fizzles into nothing. +脚枷のエネルギーリンクが消失した。 The cuff chains come off with the cuffs. -カフスチェーンはカフスごと外れます。 +枷についた鎖は枷と一緒に外れた。 +The hogtie link comes off. +ホッグタイは解けた。 Handcuffs 手錠 -A pair of steel cuffs locked securely around your wrists. -手首にしっかりと固定された一対の鋼鉄製のカフス。 +A pair of steel cuffs locked securely around your wrists. Can be applied on vulnerable targets if targeted from inventory or hotbar. +手首を拘束する金属製の枷。クイックインベントリやホットバーから、任意のターゲットに使用できる。 The lock doesn't seem very complicated. -ロックはそれほど複雑ではないようです。 +ロックはそれほど複雑ではない。 Steel Yoke -スチールヨーク +鋼鉄のヨーク A steel bar clamped firmly around your wrists and neck, leaving you in a helpless position. -鋼鉄の棒が手首と首にしっかりと固定され、無力な姿勢になります。 -This is not something you can pick by yourself... -これは自分で選べるものではない… +両手を顔の左右で固定する高鉄の棒。 +The awkward position makes it difficult to get out of alone. +一人で抜け出すのが極めて困難な姿勢で拘束されてしまう。 +Heavy Yoke +厳重なヨーク +A series of armor-grade plates cut with precision machining, sandwiched into an unbreakable layer that clasps firmly in place around your neck and wrists. +精巧で頑丈な金属でできた棒。両手を顔の左右で固定されてしまう。 +Steel Fiddle +鋼鉄のフィドル +A steel fixture keeping your hands in an awkward and submissive position. +両手を前に拘束する鋼鉄の枷。 +The awkward position prevents you from easily reaching the lock. +一人で鍵を外すのが極めて困難な姿勢で拘束されてしまう。 Leather Harness -レザーハーネス +革のハーネス A leather harness of tight straps buckled around your torso. -あなたの胴体の周りに締められたタイトなストラップの革のハーネス. +胴回りを締め、拘束感を高める革製の拘束具。 It provides an anchor point for enemies to grab onto! -それは敵がつかむためのアンカーポイントを提供します! +着用者を無理やり引っ張るのに便利。 +Rubberized Harness +ゴムのハーネス +A harness made of latex polymer, resistant to most solvents and corrosion. +ゴムでできたハーネス。溶剤や腐食に強い。 +Can be worn all day! Also convenient to hold. +一日中着用でき、持ち運びも便利。 Ball Gag ボールギャグ -A gag made of a red squishy material. -赤いフワフワ素材でできたギャグ +A gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +赤いボールギャグ。弱体化及び前のターンに口を使用する魔法を使用した相手に対して、半分の力で使用できる。 You can't seem to enunciate your spells properly with this in. -これでは、呪文を正しく発音できないようです。 +魔法を正しく発音できなくなる。 +Large Ball Gag +大きなボールギャグ +A mouth-filling gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +球の大きくなったボールギャグ。弱体化及び前のターンに口を使用する魔法を使用した相手に対して、半分の力で使用できる。 Tight Ball Gag タイトボールギャグ -A gag made of a red squishy material, buckled as tight as it will go. -赤いぐにゃぐにゃした素材で作られたギャグ、ぎゅっと締めた。 -You can't seem to enunciate your spells properly with this in. -これでは、呪文を正しく発音できないようです。 +A gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +球が更に大きくなったボールギャグ。弱体化及び前のターンに口を使用する魔法を使用した相手に対して、半分の力で使用できる。 +Huge Ball Gag +巨大なボールギャグ +A massive gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +球が更に更に大きくなったボールギャグ。弱体化及び前のターンに口を使用する魔法を使用した相手に対して、半分の力で使用できる。 +You absolutely can't enunciate your spells properly with this in. +球が大きく、まともに放つことができなくなる。 Magic Ball Gag マジックボールギャグ -A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. -魔法がかかったギャグ。口がいっぱいになり、ほとんどしゃべれない +A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +魔法のボールギャグ。口を完全に塞ぎ、発音どころかうめき声しか出ない。 It's brimming with conjured energy. A normal knife won't work here! -魔力が充満している。普通のナイフじゃ通用しないぞ! +魔力のせいで普通のナイフでは切れない。 +Anti-Magic Gag +アンチマジックボールギャグ +A gag designed to cripple mages. It's made of a squishy rubbery material. +魔法使いを無力化するための猿轡。柔らかいゴムのような素材でできている。 +It's sealed with a magical spell that rapidly absorbs mana! When it drains 40 mana it will transform into an ordinary gag and inflate. +魔法を封印し、マナを吸い取る素材で作られている。マナを40吸収すると、普通のボールギャグになる。 +Anti-Mage Gag +アンチメイジボールギャグ +A gag designed to cripple experienced spellcasters. It's made of a magic-absorbing rubber. +強力な魔法使いを無力化するための猿轡。マナを吸収するゴムでできている。 +You feel the energy flowing out of you! When it drains 100 mana it will transform into an ordinary gag and inflate. +マナが吸収されていくのを感じる。マナを100吸収すると、普通のボールギャグになる。 Ballet Heels バレエヒール A pair of shoes with heels so tall it forces you on your toes. -かかとが高すぎてつま先立ちが必要な靴。 +常につま先立ちになり、まともに歩けなくなる靴。 These will take some getting used to. -これらは慣れるまでに時間がかかります。 +なれるまでに時間がかかりそう。 +Training Heels +トレーニングヒール +A pair of unreasonably high heels owned by you personally. +自宅から持ってきた非常に高いヒールの靴。 Leg Irons -レッグアイアン +足枷 A pair of solid steel cuffs connecting your ankles inescapably. -あなたの足首を不可避的につなぐ頑丈なスチール製の袖口のペア。 -The lock doesn't seem very complicated. -ロックはそれほど複雑ではないようです。 +足首を拘束する鉄の枷。 Blindfold 目隠し A leather strap secured onto your face and blocking vision. -あなたの顔に固定され、視界を遮る革のストラップ。 +目の周りを覆い、視界を奪う拘束具。 You can still see through the gap around your nose. -鼻のあたりの隙間はまだ見えますね +鼻辺りから少しは見える。 + + Magic Chastity Belt 魔法の貞操帯 A belt protected by a magic seal. 魔法の封印で守られたベルト The shields will open up to accept new toys, but won't let them out... -シールドは開いて新しいおもちゃを受け入れますが、外に出すことはできません... +魔法の力で新しいオモチャを受け入れはするが、外に出すことはできない…… Steel Chastity Belt 鋼の貞操帯 A cruel device used for locking magical vibrators in place. -魔法のバイブレーターを所定の位置に固定するために使用される残酷な装置。 -The shields will open up to accept new toys, but won't let them out... -シールドは開いて新しいおもちゃを受け入れますが、外に出すことはできません... +プラグを固定する残酷な貞操帯。 Blacksteel Belt -ブラックスチールベルト -A cruel device used for locking magical vibrators in place. -魔法のバイブレーターを所定の位置に固定するために使用される残酷な装置。 +黒鉄の貞操帯 Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. -Blacksteel は旧文明で使用された金属です。切ることはおろか、引っ掻くことも非常に困難です。 +古代文明の金属で作られており、引っかき傷一つつけることもできない。 Blacksteel Bra -ブラックスチールブラ +黒鉄の貞操ブラ A cruel device used for locking magical massagers in place. -魔法のマッサージ器を所定の位置にロックするために使用される残酷な装置。 -Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. -Blacksteel は旧文明で使用された金属です。切ることはおろか、引っ掻くことも非常に困難です。 +乳首に取り付けられたオモチャを外せなくなる貞操帯。 Prototype Belt -試作ベルト +プロトタイプの貞操帯 A strange device built using unknown technology. -未知の技術で作られた奇妙な装置 +未知の技術で作られた奇妙な貞操帯 The lock is extremely advanced, and the ports at the bottom readily accept toys but won't let them out... -ロックは非常に高度で、下部のポートはおもちゃを簡単に受け入れますが、それらを出すことはできません... +股の部分が開いて新しいオモチャを受け入れはするが、外に出すことはできない。非常に難しい鍵がかかっている。 Steel Chastity Bra 鋼の貞操ブラ -A cruel device used for locking magical massagers in place. -魔法のマッサージ器を所定の位置にロックするために使用される残酷な装置。 It won't stop the dungeon's little curses, but will keep you from removing them. -ダンジョンの小さな呪いを止めることはできませんが、それらを取り除くことはできなくなります。 +不思議な力でブラ越しにオモチャを取り付けることはできるが、外すことはできない。 Ornate Chastity Belt -華やかな貞操帯 -A cruel device used for locking magical vibrators in place. -魔法のバイブレーターを所定の位置に固定するために使用される残酷な装置。 +豪華な貞操帯 The lock won't come off until the magic wears off in time... -魔法が解けるまで鍵は外れない… +魔法が解けるまで外せない…… Ornate Chastity Bra -華やかな貞操ブラ -A cruel device used for locking magical massagers in place. -魔法のマッサージ器を所定の位置にロックするために使用される残酷な装置。 -The lock won't come off until the magic wears off in time... -魔法が解けるまで鍵は外れない… +豪華な貞操ブラ + + Maid Chastity Belt -メイド貞操帯 +メイドの貞操帯 A chastity belt used to maintain control over initiate maids. -修行メイドを支配するための貞操帯。 +メイドの訓練に用いられる貞操帯。 Made of hardened steel. The lock is high-security. -硬化鋼製。ロックは高セキュリティです。 +鋼鉄製で難しい鍵が使われている。 Magic Egg -魔法の卵 +魔法のローター An energetic little friend that likes to tease you. -あなたをからかうのが好きなエネルギッシュな小さな友達 -It is charged by residual magic from your spells. -それはあなたの呪文からの残りの魔法によって充電されます。 +イタズラ上手な小さな友達。 +It is charged by residual magic from your spells. Type: Teasing +魔法を行使すると、その魔力の残滓で充電する。タイプ:イタズラ Prototype Egg -プロトタイプエッグ +プロトタイプのローター A teaser that periodically vibrates. -定期的に振動するティーザー -High efficiency mana conversion means longer tease duration. -効率の高いマナ変換は、より長いいじめ期間を意味します。 +定期的に振動するローター。 +High efficiency mana conversion means longer tease duration. Type: Teasing, Pleasure, Edging +マナを効率よく電池に変換し、長時間駆動する。タイプ:イタズラ、快楽、絶頂 Vibrating Plug 振動プラグ A sizeable plug that makes you happy... a little too happy. -あなたを幸せにする大きなプラグ…ちょっと幸せすぎる -It vibrates periodically and allows orgasms. -定期的に振動し、オルガスムを可能にします。 +ちょうどいいサイズでちょっと……かなり気持ちいい。 +It vibrates periodically and adds distraction when moving. Type: Pleasure +定期的に振動し、歩く度に興奮値が上昇する。タイプ:快楽 Teaser Plug ティーザープラグ A sizeable plug that will tease you but never let you go... -あなたをからかうが、あなたを手放すことのない大きなプラグ... -It vibrates weakly periodically. -周期的に弱く振動しています。 +定期的に弱く振動するが、絶頂することはできない…… +It vibrates weakly periodically. Type: Teasing, Denial +絶頂しそうになると止まってしまう、焦らし特化のいやらしいプラグ。タイプ:イタズラ、焦らし Torment Plug トーメントプラグ A sizeable plug that will make your life unbearably pleasurable... -あなたの人生をたまらなく楽しいものにしてくれる大きなプラグ… -It vibrates strongly periodically and has a denial setting. -周期的に強く振動し、拒否設定になっています。 +大きくて気持ちいいのにイけそうでイけないプラグ。 +It vibrates strongly periodically and has a denial setting. Type: Denial +定期的に強く振動するが、絶頂しそうになると焦らしモードに入ってしまう。タイプ:焦らし Thundering Plug サンダリングプラグ -A sizeable plug that will make your life unbearably pleasurable... -あなたの人生をたまらなく楽しいものにしてくれる大きなプラグ… -You're going to have the time of your life. -あなたは人生で最高の時間を過ごすことになるでしょう。 +Enjoy it while you can. Type: Pleasure, Edging +今のうちに楽しんでおこう。タイプ:快楽、絶頂 +Intense Training Plug +激しいトレーニングプラグ +An energetic plug that will make your life unbearably pleasurable... +とても激しく動く。たまらなく心地よい…… +You're going to have the time of your life. Type: Pleasure, and lots of it +人生で最高の時間を過ごすことになる。タイプ:色々…… + + +Rear Vibrating Plug +後ろのプラグ +A device that attacks from multiple angles. +他方面から攻撃するためのプラグ。 +An enjoyable experience. Type: Edging +何事も経験が大事。タイプ:絶頂 + + Maid Egg メイドエッグ An energetic little friend that likes to tease you and takes orders from the head maid. -からかうのが好きで、メイド長の命令に従う元気な小さな友達。 -It is charged by residual magic from your spells. -それはあなたの呪文からの残りの魔法によって充電されます。 -Stainless Plug -ステンレスプラグ +メイド長の使う小さな友達。 +It is charged by residual magic from your spells. Type: Teasing, Edging +魔法を行使すると、その魔力の残滓で充電する。タイプ:イタズラ、絶頂 + + +### Stainless Plug (F) + A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... -振動しない重たいプラグだけど、歩いていると確かに気になる… +振動はしないが重量感がクセになる…… This one goes in the front. -こいつが前に出ます。 -Stainless Plug -ステンレスプラグ -A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... -振動しない重たいプラグだけど、歩いていると確かに気になる… +前の穴用。 +### Stainless Plug (R) + This one goes in the back. -これは後ろに行きます。 +後ろの穴用。 + + Shadow Hand Gag -シャドーハンドギャグ +影の手(口) It clasps tightly over the mouth and prevents you from casting your spells! -口をしっかりと留めて、呪文を唱えるのを防ぎます! +魔法の詠唱を封じる影のハンドギャグ。 You have no choice but to struggle. -戦うしかない。 -Shadow Hands (Legs) -影の手(足) -They are wrapped around your legs! -彼らはあなたの足に巻き付いています! -You have no choice but to struggle. -戦うしかない。 +もがいて無理やり引きはがすしかない。 +Shadow Hand Eyes +影の手(目) +Shadow hands clasped over your eyes, making it hard to see. +目の周りに取り付いた影の手。 + + Shadow Hands (Legs) -影の手(足) +影の手(脚) They are wrapped around your legs! -彼らはあなたの足に巻き付いています! -You have no choice but to struggle. -戦うしかない。 -Shadow Hands (Arms) -シャドーハンド(腕) -They are squeezing you tightly! -彼らはあなたをきつく締めています! -You have no choice but to struggle. -戦うしかない。 +脚に巻き付いた影の手。 + + Shadow Hands (Arms) -シャドーハンド(腕) +影の手(腕) They are squeezing you tightly! -彼らはあなたをきつく締めています! -You have no choice but to struggle. -戦うしかない。 +上半身を締め付けてくる影の手。 + + Shadow Hands (Feet) -シャドーハンド(足) +影の手(足) They are holding your feet together! -彼らはあなたの足を一緒に持っています! -You have no choice but to struggle. -戦うしかない。 +足首を無理やりつなぐ影の手。 + + Shadow Hands... -影の手... +影の手…… They are holding your... uh... -彼らはあなたの...えっと... -You have no choice but to struggle. -戦うしかない。 -Wrist Rope -リストロープ -A box tie keeping your arms secured behind your back. -腕を後ろで固定するボックスタイ -The ropes squeeze you gently. -ロープがやさしくあなたを圧迫します。 -Rope Cuffs -ロープカフス -A quick tie for apprehending prisoners. -囚人を逮捕するための迅速なネクタイ。 -It's not very secure. -あまり安全ではありません。 -Intricate Ropework -複雑なロープワーク -A quick tie for apprehending prisoners, looped through buckles on the hand restraints. -囚人を逮捕するためのクイックタイで、ハンドレストのバックルに通します。 -It's not very secure. -あまり安全ではありません。 -Rope Hogtie -縄ホグタイ -A very strict and tight hogtie, good for subduing unruly captives. -非常に厳格でタイトなホグタイで、手に負えない捕虜を鎮圧するのに適しています。 -It's very secure. You tug on the rope connecting your feet and struggle. -とても安全です。足をつなぐロープを引っ張って、もがきます。 -Rope Belt -ロープベルト -A harness acting as a handle to pull you around -あなたを引っ張るためのハンドルとして機能するハーネス -The ropes squeeze you gently. -ロープがやさしくあなたを圧迫します。 -Rope Harness -ロープハーネス -A harness that secures your other restraints and makes them tighter. -他の拘束具を固定し、よりきつくするハーネス。 -The ropes squeeze you gently. -ロープがやさしくあなたを圧迫します。 -Crotch Rope -クロッチロープ -A tight rope impressing upon your most private areas... -あなたの最もプライベートなエリアに印象的なタイトなロープ... -The ropes squeeze you gently. -ロープがやさしくあなたを圧迫します。 -Wrist Rope -リストロープ -A wrist and elbow tie keeping your arms secured behind your back. -腕を背中の後ろに固定する手首と肘のネクタイ. -The ropes squeeze you gently. -ロープがやさしくあなたを圧迫します。 -Leg Ropes -レッグロープ -A tie that hobbles your legs together.. -足を引きずるネクタイ.. -The ropes squeeze you gently. -ロープがやさしくあなたを圧迫します。 -Ankle Ropes -足首ロープ -A tie keeping your feet secured together. -足を固定するネクタイ。 -The ropes squeeze you gently. -ロープがやさしくあなたを圧迫します。 -Holy Wrist Rope -ホーリーリストロープ -A box tie keeping your arms secured behind your back. -腕を後ろで固定するボックスタイ -They are aware of your movements... -彼らはあなたの動きを知っています... -Holy Rope Cuffs -ホーリーロープカフス -A quick tie for apprehending prisoners. -囚人を逮捕するための迅速なネクタイ。 -They are aware of your movements... -彼らはあなたの動きを知っています... -Holy Ropework -ホーリーロープワーク -A quick tie for apprehending prisoners, looped through buckles and fasteners. -囚人を逮捕するための簡単なネクタイで、バックルと留め具に通されています。 -They are aware of your movements... -彼らはあなたの動きを知っています... -Holy Rope Harness -ホーリーロープハーネス -A harness acting as a handle to pull you around -あなたを引っ張るためのハンドルとして機能するハーネス -They are aware of your movements... -彼らはあなたの動きを知っています... -Holy Crotch Rope -ホーリークロッチロープ -A tight rope impressing upon your most private areas... -あなたの最もプライベートなエリアに印象的なタイトなロープ... -They are aware of your movements... -彼らはあなたの動きを知っています... -Holy Wrist Rope -ホーリーリストロープ -A wrist and elbow tie keeping your arms secured behind your back. -腕を背中の後ろに固定する手首と肘のネクタイ. -They are aware of your movements... -彼らはあなたの動きを知っています... -Holy Leg Ropes -ホーリーレッグロープ -A tie that hobbles your legs together.. -足を引きずるネクタイ.. -They are aware of your movements... -彼らはあなたの動きを知っています... -Holy Ankle Ropes -ホーリーアンクルロープ -A tie keeping your feet secured together. -足を固定するネクタイ。 -They are aware of your movements... -彼らはあなたの動きを知っています... +……股間に張り付いた卑猥な手。 + + Wrist Vines 手首のつる A box tie keeping your arms secured behind your back. -腕を後ろで固定するボックスタイ +後ろ手に腕を組む形の縛り。 The vines twitch as they try to wrap around tighter. -つるは、よりきつく包み込もうとして、けいれんします。 +意志を持っているかのようにきつく縛ろうとうごめくつるの縄。 Vine Harness -つるハーネス +胴のつる A harness acting as a handle to pull you around -あなたを引っ張るためのハンドルとして機能するハーネス -The vines twitch as they try to wrap around tighter. -つるは、よりきつく包み込もうとして、けいれんします。 +他者が引っ張りやすくするための縄。 Leg Vines 脚のつる A tie that hobbles your legs together.. -足を引きずるネクタイ.. -The vines twitch as they try to wrap around tighter. -つるは、よりきつく包み込もうとして、けいれんします。 +脚を縛る縄。 Ankle Vines 足首のつる A tie keeping your feet secured together. -足を固定するネクタイ。 -The vines twitch as they try to wrap around tighter. -つるは、よりきつく包み込もうとして、けいれんします。 -Quik-Bind Cuffs -クイックバインドカフ -A set of high-security cuffs that are both restrictive and quick to apply. -制限があり、すぐに適用できる高セキュリティ カフのセット。 -It uses a twelve-disc detainer lock. -12枚のディスクの留置錠を使用しています。 +足を縛る縄。 + + +High-Security Cuffs +厳重な手枷 +A set of irish-8-style cuffs that are both restrictive and quick to apply. Can be applied on vulnerable targets if targeted from inventory or hotbar. +アイリッシュ8スタイルの手枷。素早く拘束できる。クイックインベントリやホットバーから、任意のターゲットに使用できる。 +It uses a standard lock rather than a simple one. +普通の錠が使われている。 Wolfbinder ウルフバインダー A sophisticated training system used to keep wolfgirls from scratching their owners. -オオカミ少女が飼い主を傷つけないようにするための洗練された訓練システム。 +ウルフガールが飼い主を傷つけないようにするアームバインダー Despite the harsh position, it is padded, breathable, and suitable for long term wear. -過酷なポジションにもかかわらず、パッド入りで通気性があり、長時間の着用に適しています。 +パッド入りで通気性があるので、長時間着用しても見た目ほど苦しくない。 +Wolf Queenbinder +女王のウルフバインダー +This was made to be used during a coup attempt. Unfortunately, its creator ended up wearing it instead, after the coup's failure. +ウルフガールのクーデター未遂の際に作られたアームバインダー。残念ながらクーデターは失敗に終わり、作者がこれを身につけることになった。 +Designed to hold the queen of wolves helpless for an indefinite period of time. +狼の女王を完全拘束するために作られた。 Smart Training Cuffs -スマート トレーニング カフ +スマートトレーニングカフ Cuffs with a feature to punish the wearer if they act aggressively. -攻撃的な行動をした場合に着用者を罰する機能を備えたカフ。 +着用者が攻撃的な行動をした場合、罰を与える装置の付いた枷。 They are solid metal and will be hard to remove without the key. -それらは頑丈な金属であり、キーなしでは取り外すのが難しいでしょう. +頑丈な金属で作られており、鍵なしで外すのは困難。 Linked Smart Cuffs リンクされたスマートカフ -Cuffs with a feature to punish the wearer if they act aggressively. -攻撃的な行動をした場合に着用者を罰する機能を備えたカフ。 Looks like you got yourself in trouble. -どうやらご迷惑をおかけしたようですね +これが罰。 Training Harness トレーニングハーネス A harness that keeps a wolfgirl's suit together. It makes escaping more difficult. -オオカミ少女のスーツを束ねるハーネス。逃げるのを難しくする。 +ウルフガール用のハーネス。他の拘束具と連動し、抜け出しにくくする。 While it is weatherproof and rugged, its straps are merely nylon. -耐候性があり頑丈ですが、ストラップは単なるナイロンです。 +過酷な環境下でも脱げることはないが、ストラップはナイロン製で切ることは可能。 +Training Mittens +トレーニングミトン +When wolfgirls won't keep those pesky claws in line, these will make sure she can't cause too much trouble. +爪の手入れを怠るウルフガールに取り付け、無用なトラブルを避けるためのミトン。 +Made from strong reinforced fabric, your claws won't do anything to these mittens. +爪で傷つかないほど頑丈な素材でできている。 Training Gag -調教ギャグ +トレーニングギャグ A gag used to prevent wolfgirls from biting their owners. -オオカミ少女が飼い主を噛むのを防ぐためのギャグ. +ウルフガールの咬傷事故を防止する猿轡。 It is reinforced with steel cables, so getting it off will be tricky. -スチールケーブルで補強されているので、外すのは一苦労です +鋼鉄で補強されており、抜け出すのは難しい。 Training Collar トレーニングカラー -A collar used to keep unruly wolfgirls in check. -暴走する狼娘を抑える首輪 -If it works on them, it sure as heck works on you. -それが彼らに効くなら、あなたにも効くはずです。 +A collar with a decorative tag used to identify wolfgirls. +ウルフガールが誰かの所有物だということを示す首輪。 +Also good for identifying people in general. What a great idea! +誰かを特定するにも便利。とても良いアイデアだ! Training Leash -トレーニングリーシュ +トレーニングリード A leash used for training pets. -ペットのしつけに使うリード +ペットの散歩に使うリード It is a steel cable with a weatherproof rubber coating, and a convenient handle. -耐候性ゴムコーティングと便利なハンドルを備えたスチールケーブルです。 +ゴムで被覆されており、過酷な環境でも劣化しない鋼鉄のリード。 +Magical Leash +魔法のリード +A leash made of magical energy, linked to a submissive's collar. +魔力によって首輪から伸びる魔法のリード。 +Very difficult to break unless you have a strong magical blade. +魔力を帯びた刃物がないと切断は難しい。 + + Your ankle cuffs snap together on their own! -あなたの足首の袖口は自然に一緒にスナップします! +足首の枷同士が勝手に連結した! Your ankle cuffs detach! -足首のカフスが外れます! +足首の枷同士が外れた! + + Asylum Muzzle -アサイラムマズル +病院のマズル The nurses use this on noisy patients! -うるさい患者に看護師が使ってる! +患者が喚き立てるのを抑えるためのマズル。 It's sturdy leather... -しっかりした革だ… +頑丈な革でできている。 Asylum Jacket -アサイラム ジャケット +病院の拘束衣 A straitjacket that keeps patients out of trouble. -患者をトラブルから守る拘束衣 +患者をトラブルから守る拘束衣。 It has many straps and is very difficult to escape. -ストラップが多く、逃げるのは非常に困難です。 +大量のストラップで繋がれており、抜け出すのは非常に困難。 Asylum Legbinder -アサイラム・レグバインダー +病院のレッグバインダー This legbinder will keep the patient from kicking the nurses. -このレッグバインダーは、患者が看護師を蹴るのを防ぎます。 +患者がナースを蹴らないようにするレッグバインダー。 It has both laces and straps. -ひもとストラップの両方があります。 +ひもとストラップ両方で固定されている。 + + Asylum Ankle Cuffs -アサイラム アンクル カフス -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -強化革で作られたチェーンカフのペア。患者を捕まえやすくします。 -They can be thrown from long distances. -遠くからでも投げられる。 -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! -Cuffs Chain -カフスチェーン +病院の足枷 A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -強化革で作られたチェーンカフのペア。患者を捕まえやすくします。 +強化された革で作られた足枷。患者の逃走を抑える。 They can be thrown from long distances. 遠くからでも投げられる。 -The ankle cuff chain detaches! -足首カフスのチェーンが外れる! + + Asylum Leg Cuffs -アサイラムレッグカフ -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -強化革で作られたチェーンカフのペア。患者を捕まえやすくします。 -They can be thrown from long distances. -遠くからでも投げられる。 -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! +病院の脚枷 + + +They are made of a steel alloy. +鋼鉄の合金でできている。 + + Transport Jacket -トランスポート ジャケット +輸送用拘束衣 This jacket goes over a straitjacket to keep the arms trapped. -このジャケットは拘束衣の上にかぶせて、腕を拘束します。 +拘束衣を更に覆う、患者を輸送するときに使われる拘束衣。 It makes it extraordinarily difficult to escape the jacket it covers. -それが覆っているジャケットから逃れることは非常に困難です。 +下に着ている拘束衣から抜け出すのはほぼ不可能。 + + +Living Asylum Collar +生きている病院の首輪 +A collar made of tough cowhide that adjusts itself to your neck. +頑丈な牛革でできた首輪。首の太さに合わせて調整できる。 +It will occasionally cause asylum gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of asylum gear you have on you. +装備していると、時折どこからともなく病院の拘束具が現れて拘束される。効果は装備している病院の拘束具の数で増加する。 + + Asylum Cuffs -アサイラムカフス +病院の手枷 A pair of leather cuffs that make it easy to restrain you. -拘束しやすい革のカフス +拘束しやすい革の手枷。 They're made of tough cowhide. -丈夫な牛革でできています。 -The enemy attaches your wrist cuffs together! -敵があなたの手首カフをくっつけている! -Wrist Chain -リストチェーン +丈夫な牛革でできている。 + + A pair of leather cuffs keeping your arms behind your back. -腕を背中の後ろに留める革のカフス。 -They're made of tough cowhide. -丈夫な牛革でできています。 -Your cuffs detatch! -袖口が外れます! -The enemy attaches your elbow cuffs together! -敵があなたの肘カフをくっつけている! -Wrist Chain -リストチェーン +手枷をつなぐための鎖。 + + A full set of leather cuffs keeping your arms in a strict elbow tie! -厳格なエルボータイで腕を保つレザーカフスのフルセット! -They're made of tough cowhide. -丈夫な牛革でできています。 -Your wrists detatch, leaving your elbows still bound! -手首が外れても、肘は縛られたままだ! -Elbow Chain -エルボーチェーン +手枷を後ろ手につなぐための鎖。 + + A pair of leather cuffs keeping your elbows locked together!. -両肘を固定する革製の袖口! -They're made of tough cowhide. -丈夫な牛革でできています。 -Your elbows detatch! -肘が外れます! -The enemy attaches your wrist cuffs back together! -敵があなたの手首のカフを元に戻します! +肘枷同士をつなぐための鎖。 + + Comfy Muzzle 快適なマズル A lovely muzzle that's extraordinarily comfy! -履き心地抜群の素敵なマズル! +つけ心地が良い不思議なマズル。 It's made of an ethereal material... -エーテル素材でできている... +不思議な素材でできている…… Comfy Straitjacket 快適な拘束衣 A straitjacket that is padded on the inside. -中綿入りの拘束衣。 +中にパッドが入っている拘束衣。 It feels tight but is actually made of an ethereal material... -きつく感じますが、実は空気のような素材でできています... +外見は普通の拘束衣だが、中は不思議な素材でできており着心地が良い。 + + Latex Jacket -ラテックスジャケット -A tight jacket that holds your arms completely useless. -腕をすっぽりと押さえるタイトジャケット。 +ラテックスの拘束衣 +A tight jacket that keeps your arms completely useless. +腕を前に組んだ形で拘束されるゴム製の衣装。 It has too much grip to struggle out of, but is made of a fragile material. -グリップが強すぎて苦労しますが、壊れやすい素材でできています. +もがいて抜け出すのは難しいが、壊れやすい素材でできている。 +Secure Latex Jacket +ラテックスの完全拘束衣 +This straitjacket has extra straps and buckles to make sure you won't be struggling out of it. +多くのベルトを持ち、抜け出すことがより一層難しくなったラテックスの拘束衣。 Latex Armbinder -ラテックス腕章 +ラテックスのアームバインダー A tight armbinder that pins your arms tightly behind your back, enclosed completely. -腕を背中の後ろでしっかりと固定し、完全に密閉するタイトなアームバインダー。 -It has too much grip to struggle out of, but is made of a fragile material. -グリップが強すぎて苦労しますが、壊れやすい素材でできています. +指先から肘にかけて覆うゴム製のタイトなアームバインダー。 +Latex Boxbinder +ラテックスのボックスバインダー Latex Legbinder -ラテックスレグバインダー +ラテックスのレッグバインダー A tight legbinder that keeps your legs together! -足をキュッと引き締めるタイトレッグバインダー! -It has too much grip to struggle out of, but is made of a fragile material. -グリップが強すぎて苦労しますが、壊れやすい素材でできています. +脚を覆うタイトなレッグバインダー Latex Boots ラテックスブーツ A tight pair of boots that makes it difficult to walk! -歩きにくいタイトブーツ! -It has too much grip to struggle out of, but is made of a fragile material. -グリップが強すぎて苦労しますが、壊れやすい素材でできています. +ゴム製のヒールが高いブーツ。 Heavy Latex Corset -ヘビーラテックスコルセット +ラテックスのコルセット An excruciatingly tight corset that hugs your body, with straps securing your other restraints. -あなたの体を抱きしめる耐え難いほどタイトなコルセットで、ストラップが他の拘束具を固定します. -It has too much grip to struggle out of, but is made of a fragile material. -グリップが強すぎて苦労しますが、壊れやすい素材でできています. -Blue Latex Catsuit -ブルー ラテックス キャットスーツ +胴を締め付けるタイトなコルセット。他の拘束具とつなぐことで抜け出しにくくする。 A skintight suit that's stretched on tight. It adheres to latex restraints making struggling more difficult. -タイトに引き伸ばされた肌に密着したスーツ。ラテックスの拘束具に付着しているため、苦労がより困難になります。 +首から下を覆う青いゴム製のキャットスーツ。他のゴム製の拘束具にくっつくため、抜け出すのが困難になる。 Blue latex is silky smooth, very stretchy, and very good at adhering to itself. -ブルーラテックスはシルクのように滑らかで、非常に伸縮性があり、接着力が非常に優れています。 +ブルーラテックスはシルクのように滑らかで、非常に伸縮性があり、接着力が非常に優れている。 +Heavy Latex Catsuit +頑丈なラテックスキャットスーツ +A skintight suit that's stretched on tight and made of thick latex. It adheres to latex restraints making struggling more difficult. +首から下を覆う青いゴム製の厚いキャットスーツ。他のゴム製の拘束具にくっつくため、抜け出すのが困難になる。 +Blue latex is silky smooth, very stretchy, and very good at adhering to itself. Its thickness makes it particularly resistant to cutting. +ブルーラテックスはシルクのように滑らかで、非常に伸縮性があり、接着力が非常に優れている。生地が分厚く、切断に強い。 +Latex Mittens +ラテックスのミトン +A pair of mittens keep your hands out of trouble. They adhere to latex restraints making struggling more difficult. +指を封じるミトン。ラテックス製の拘束具からもがいて抜け出すのが困難になる。 + + +Latex Cube +ラテックスキューブ +A gelatinous cube that engulfed you at some point in the past. +全身を包み込むゼラチン質の生命体。 +It seems quite content staying where it is. +動きたくないようだ。 +Slime Bubble +スライムの泡 +A squishy and sticky bubble that you can't get out of! +ふにゃふにゃべとべとの泡。もがいて抜け出すのは困難。 +It will slow you down severely but can be popped if you can reach a knife... +泡に包まれた状態では、まともに動けなくなる。刃物があれば抜け出せるだろう…… +Latex Sphere +ラテックススフィア +A giant inflatable sphere that compresses you and leaves you helpless... +ゴム製の巨大な球体。飲み込まれたら自力では逃げられない…… +You can't see out of it nor can you control its movement. If only you could puncture it! +動くこともできず、外の様子もわからない。刃物で穴を開けられれば…… +Latex Ball Suit +ラテックスボール +A giant inflatable sphere that leaves you rolling around... +ゴム製の巨大な球体。転げ回ることしかできない…… +Your movement is severely hampered, limited to feeble wiggling... +ろくに動き回ることができなくなり、体をよじることしかできない…… +Bubble +泡 +A squishy bubble that you can't get out of! +ふにゃふにゃの泡。もがいて抜け出すのは困難。 + + Scale Boxtie Binder -スケールボクタイバインダー +竜鱗のボックスタイバインダー A secure but comfortable binder meant for long-term wear by long-term prisoners of the Dragonhearts. -ドラゴンハーツの長期囚人が長期間着用することを意図した、安全で快適なバインダー。 +ドラゴンハートの捕虜が長時間着用することを想定された、快適なバインダー It is made from durable dragonscale, but secured with ordinary buckles. -丈夫な竜鱗で作られていますが、普通のバックルで固定されています。 +丈夫で切れにくい竜鱗で作られているが、錠前は普通。 Dragonscale Straps 竜鱗のストラップ A set of straps buckling tightly around your body and secured at the wrists. -あなたの体の周りにきつく締まり、手首に固定されるストラップのセット. +後ろ手に手首と胴を固定する竜鱗のストラップ。 It's made from hard-to-cut dragonscale!!! -切れにくい竜鱗で出来てる!!! +切れにくい竜鱗でできている。 +Dragon Queen Straps +竜の女王のストラップ +A sturdy harness completely immobilizes your arms and torso. Made to be used on a queen of dragons. +腕と胴体を完全に固定する。竜の女王の為に作られた拘束具。 +It's made from reinforced dragonscale!!! +強化された竜鱗でできている。 Scale Leg Cuffs -スケールレッグカフ +竜鱗の脚枷 A pair of chained cuffs made of dragonscale. They slow your stride. -竜鱗でできた鎖でつながれた一対のカフス。あなたの歩みを遅くします。 -It's made from hard-to-cut dragonscale!!! -切れにくい竜鱗で出来てる!!! +竜鱗でできた脚枷。歩くスピードが遅くなる。 Scale Ankle Cuffs -スケールアンクルカフス -A pair of chained cuffs made of dragonscale. They slow your stride. -竜鱗でできた鎖でつながれた一対のカフス。あなたの歩みを遅くします。 -It's made from hard-to-cut dragonscale!!! -切れにくい竜鱗で出来てる!!! -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! +竜鱗の足枷 Scale Cuffs Chain -スケール カフス チェーン -A pair of chained cuffs made of dragonscale. They slow your stride. -竜鱗でできた鎖でつながれた一対のカフス。あなたの歩みを遅くします。 -It's made from hard-to-cut dragonscale!!! -切れにくい竜鱗で出来てる!!! -The ankle cuff chain detaches! -足首カフスのチェーンが外れる! +竜鱗の枷の鎖 Dragonscale Boots 竜鱗のブーツ A pair of extremely high heels lined with dragonscale. They are hard to walk in. -竜鱗の裏地がついた超ハイヒール。歩きにくいです。 -It's made from hard-to-cut dragonscale!!! -切れにくい竜鱗で出来てる!!! +竜鱗の裏地がついたバレエヒール。かなり歩きにくい。 Dragonscale Gag -竜鱗ギャグ +竜鱗のボールギャグ A gag made of a squishy material and secured with dragonscale straps. -ぷにぷにした素材で作られたギャグで、ドラゴンスケールのストラップで固定されています。 -It's made from hard-to-cut dragonscale!!! -切れにくい竜鱗で出来てる!!! +竜鱗のストラップでできたボールギャグ。 Dragonscale Muzzle -竜鱗の銃口 +竜鱗のマズル A muzzle to keep ball gags pressed firmly into the mouth. -ボールギャグをしっかり口に押し込むマズル。 -It's made from hard-to-cut dragonscale!!! -切れにくい竜鱗で出来てる!!! +ボールギャグを吐き出さないようにするマズル。 Dragon Collar ドラゴンカラー A collar owned by the Dragonhearts, an order of dragonslayers. 竜殺しの騎士団ドラゴンハートの首輪。 -It's made from hard-to-cut dragonscale!!! -切れにくい竜鱗で出来てる!!! + + Steel Cuffs -スチールカフス +鋼鉄の手枷 A pair of steel cuffs that make it easy to restrain you. -拘束しやすい鋼鉄のカフス +拘束しやすい鋼鉄の手枷。 They're made of shining steel. -彼らは輝く鋼でできています。 -The enemy attaches your wrist cuffs together! -敵があなたの手首カフをくっつけている! +輝く鋼でできており、破壊するのは難しい。 + + Steel Wrist Chain -スチール リスト チェーン +鋼鉄の手枷の鎖 A pair of steel cuffs keeping your arms behind your back. -腕を背中の後ろに留める一対の鋼鉄の袖口。 -They're made of shining steel. -彼らは輝く鋼でできています。 -Your cuffs detatch! -袖口が外れます! -The enemy attaches your elbow cuffs together! -敵があなたの肘カフをくっつけている! +手枷をつなぐための鎖。 + + Magnetic Cuffs -磁気カフ +磁力の手枷 A pair of bulky cuffs with coils visible on the inside... -内側にコイルが見えるかさばる袖口のペア... +内側にコイルが付いている重い手枷。 They have no visible attachment points... -彼らには目に見える付着点がありません... +どこにもアタッチポイントは見つからない…… The electric damage causes your cuffs to attach together! -電撃ダメージで袖口同士がくっつく! +電撃ダメージで手枷同士がくっついた! + + Magnetic Link 磁気リンク The magnetic cuffs are rigidly attached! -マグネットカフスはガッチリ固定! +枷同士を磁力でガッチリつなぎ合わせている。 They won't budge! There's a button to release them but it's hard to reach... -動かない!解除ボタンはあるけど、なかなか手が届かない… -Your cuffs detatch! -袖口が外れます! +単純な力ではどうにもならない。解除ボタンはあるがなかなか手が届かない…… + + Magnetic Ankle Cuffs 磁気足首カフ A pair of bulky leg irons with coils visible on the inside. 内側にコイルが見えるかさばるレッグアイアンのペア。 -They have no visible attachment points... -彼らには目に見える付着点がありません... The electric damage causes your ankle cuffs to snap together! -電撃で足首のカフがパチンパチン! -Magnetic Link -磁気リンク -The magnetic cuffs are rigidly attached! -マグネットカフスはガッチリ固定! -They won't budge! There's a button to release them but it's hard to reach... -動かない!解除ボタンはあるけど、なかなか手が届かない… +電撃ダメージで足枷同士がくっついた! + + Your ankle cuffs detatch! -足首のカフスが外れます! -Leather Ankle Cuffs -レザーアンクルカフス -A pair of chained cuffs made of leather. They make it trickier to run away. -革でできたチェーン付きのカフス。逃げるのが難しくなります。 -They're made of tough cowhide. -丈夫な牛革でできています。 -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! -Cuffs Chain -カフスチェーン -A pair of chained cuffs made of leather. They make it trickier to run away. -革でできたチェーン付きのカフス。逃げるのが難しくなります。 -They're made of tough cowhide. -丈夫な牛革でできています。 -The ankle cuff chain detaches! -足首カフスのチェーンが外れる! -Leather Leg Cuffs -レザーレッグカフス -A pair of chained cuffs made of leather. They make it trickier to run away. -革でできたチェーン付きのカフス。逃げるのが難しくなります。 -They're made of tough cowhide. -丈夫な牛革でできています。 -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! -Leather Cuffs -レザーカフス -A pair of leather cuffs that make it easy to restrain you. -拘束しやすい革のカフス -They're made of tough cowhide. -丈夫な牛革でできています。 -The enemy attaches your wrist cuffs together! -敵があなたの手首カフをくっつけている! -Lthr Wrist Chain -Lthr リスト チェーン -A pair of leather cuffs keeping your arms behind your back. -腕を背中の後ろに留める革のカフス。 -They're made of tough cowhide. -丈夫な牛革でできています。 -Your cuffs detatch! -袖口が外れます! -The enemy attaches your elbow cuffs together! -敵があなたの肘カフをくっつけている! -Lthr Wrist Chain -Lthr リスト チェーン -A full set of leather cuffs keeping your arms in a strict elbow tie! -厳格なエルボータイで腕を保つレザーカフスのフルセット! -They're made of tough cowhide. -丈夫な牛革でできています。 -Your wrists detatch, leaving your elbows still bound! -手首が外れても、肘は縛られたままだ! -Lthr Elbow Chain -Lthr エルボ チェーン -A pair of leather cuffs keeping your elbows locked together!. -両肘を固定する革製の袖口! -They're made of tough cowhide. -丈夫な牛革でできています。 -Your elbows detatch! -肘が外れます! -The enemy attaches your wrist cuffs back together! -敵があなたの手首のカフを元に戻します! +足枷の磁力が解除された! + + + + +Living Blacksteel Collar +生きている黒鉄の首輪 +A collar made of a hardened steel alloy, chemically treated as to be stainless that adjusts itself to your neck. +頑丈な鋼鉄でできた首輪。首の太さに合わせて調整できる。 +It will occasionally cause blacksteel to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of blacksteel you have on you. +装備していると、時折どこからともなく黒鉄の拘束具が現れて拘束される。効果は装備している黒鉄の拘束具の数で増加する。 + + +Blacksteel Cuffs +黒鉄の手枷 +They are made of a hardened steel alloy, chemically treated as to be stainless. +ステンレスのように化学処理がなされている硬化鋼合金製。 + + + + +Blacksteel Leg Cuffs +黒鉄の腿枷 + + +Blacksteel Ankle Cuffs +黒鉄の足枷 + + + + + + + + Dragonscale Cuffs -竜鱗の袖口 -A pair of cuffs that make it easy to restrain you. -拘束しやすいカフス -They're made of dragonscale. -竜鱗でできている -The enemy attaches your wrist cuffs together! -敵があなたの手首カフをくっつけている! -Scale Wrist Chain -スケール リスト チェーン -A pair of cuffs keeping your arms behind your back. -腕を背中の後ろに留める袖口のペア。 -They're made of dragonscale. -竜鱗でできている -Your cuffs detatch! -袖口が外れます! -The enemy attaches your elbow cuffs together! -敵があなたの肘カフをくっつけている! -Scale Wrist Chain -スケール リスト チェーン -A full set of cuffs keeping your arms in a strict elbow tie! -腕をきっちり肘紐で留める袖口フルセット! -They're made of dragonscale. -竜鱗でできている -Your wrists detatch, leaving your elbows still bound! -手首が外れても、肘は縛られたままだ! -Scale Elbow Chain -スケール エルボ チェーン -A pair of cuffs keeping your elbows locked together!. -両肘を固定する袖口! -They're made of dragonscale. -竜鱗でできている -Your elbows detatch! -肘が外れます! -The enemy attaches your wrist cuffs back together! -敵があなたの手首のカフを元に戻します! +竜鱗の手枷 +They are made from leather cured from the hide of dragons. +ドラゴンの革を硬めて作られた拘束具。 + + + + +Dragonscale Leg Cuffs +竜鱗の脚枷 + + +Dragonscale Ankle Cuffs +竜鱗の足枷 + + + + Maid Jacket メイドジャケット A bolero jacket keeping your arms pinned snugly. You can't even move them. -腕をピタッと留めるボレロ。動かせません +前に腕を組んだ形で固定する拘束衣。頑丈で指も使えない。 There is no hope of struggling out. Better hope you can cut it... -もがき続ける望みはない。切り詰めてくれるといいのだが…… +いくらもがいても緩む気配はない。切るしかないようだ…… +Maid Punishment Jacket +メイドの懲罰用拘束衣 +A bolero straitjacket made for unruly maids. It is extra secure and locked tightly. +前に腕を組んだ形で固定する、きつく頑丈な拘束衣。態度の悪いメイドに使用される。 +There is no hope of struggling out. Better get back to work... +いくらもがいても緩む気配はない。仕事をこなすしか無いようだ…… Devious Maid Costume -よこしまなメイド服 +拘束メイド服 A devious maid outfit that forces the arms into an elbows-touching position. -両腕をひじにつける悪質なメイド服 +両手と肘を後ろで固定するメイド服。 Makes sure you focus on your work and not fooling around. -ふざけずに仕事に集中してください。 +ふざけて仕事をしないメイドに着せる服。 Reinforced Leather Belt 強化レザーベルト A leather belt used to keep your legs hobbled. -足をよろめかせるための革ベルト +脚をつなぎ歩幅を制限するベルト。 It's made of a very tough reinforced leather. It will take some time to cut. -非常に丈夫な強化革でできています。カットには少し時間がかかります。 -Steel Cuffs -スチールカフス -A pair of steel cuffs used by the Maidforce. -メイドフォースが使う鋼鉄のカフス。 -They are made of solid steel. -彼らは頑丈な鋼でできています。 -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! -Linked Steel Cuffs -リンクされたスチールカフス +非常に丈夫な革でできており、切るには時間がかかる。 +Maid Cuffs +メイドの足枷 A pair of steel cuffs used by the Maidforce. -メイドフォースが使う鋼鉄のカフス。 +メイドフォースが使う鋼鉄の足枷。 They are made of solid steel. -彼らは頑丈な鋼でできています。 -The ankle cuff chain detaches! -足首カフスのチェーンが外れる! +頑丈な鋼鉄製。 +Maid Cuff Link +メイドの足枷の鎖 + + Maid Collar -メイドカラー +メイドの首輪 A collar for operatives of the Maidforce, a group of covert saboteurs. -秘密工作員集団メイドフォースの工作員の首輪。 +秘密工作員集団メイドフォースの首輪。 It's reinforced with metal and guarded with an expert-level lock. -金属で補強され、エキスパートレベルのロックでガードされています。 -Plug Gag -プラグギャグ +金属で補強され、かなり難しい錠前がかけられている。 +Maid Gag +メイドギャグ A gag with a long, mouth-filling plug that muffles speech completely. -言葉を完全にこもらせる、口いっぱいの長いプラグを備えたギャグ。 -It's made of a very tough reinforced leather. It will take some time to cut. -非常に丈夫な強化革でできています。カットには少し時間がかかります。 +内側に長い棒のついた猿轡。正しい発音ができなくなる。 +Maid Security Gag +メイドのセキュリティギャグ +A muzzle with a long, mouth-filling plug that muffles speech completely. +内側に長い棒のついたマズル。正しい発音ができなくなる。 +Reinforced and secured with a disc lock to ensure unruly maids don't skip their duty. +躾のなっていないメイドが仕事をサボらないよう、ディスクロックでしっかり固定されている猿轡。 + + Suspicious Mask 怪しいマスク -You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. -あなたは、見事に光るパッド入りの金属製の目隠しと、その横にある奇妙な水晶です。 A well-fitted mask, covering your entire head neatly and locking in place. -頭全体をすっきりと包み込み、ピタッと密着するフィット感の高いマスクです。 -It has eyeholes for you to see out of, but blocks access to the face. -外を見るためのアイホールがありますが、顔へのアクセスはブロックされています。 +顔全体を包み込み、しっかりとフィットするマスク。 +It has eyeholes for you to somewhat see out of, but blocks access to the face. +外を見るための穴はあるが、顔の拘束具に触れることはできなくなる。 + + +### Happy Face + +### Just put on a happy face and enjoy it. + +Sensory Hood +感覚遮断フード +A well-fitted hood that covers your head and muffles sounds. +頭を完全に包み、視覚と聴覚を封じるフード。 +No eyeholes. Integrated blindfold and gag. Total darkness. +目隠しと猿轡、イヤーマフが一体となった拘束具。 + + +Sensory Mask +感覚遮断マスク +A well-fitted mask that covers your face and muffles sounds. +顔を完全に包み、視覚と聴覚を封じるマスク。 + + +Shadow Heels +影のヒール +A set of impractical heels that clasp around your ankles. They make it hard to walk. +高いヒールの付いた、足首丈の靴。とても歩きにくい。 +The material is stronger than leather, and flexes to make struggling difficult. +革よりも固く柔軟。とても抜け出しにくい。 +Shadow Jacket +影のジャケット +A tight straitjacket made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +異世界の物質で作られた拘束衣。怪しく輝く光沢は、まるでもがき苦しむ犠牲者を観察する星々の目線を映しているかのようだ。 +Its grip encases you tightly, but the material is weaker than most metals. +しっかりと身体を包み込んでいるが、他の金属よりも脆い。 +Black Hole Jacket +ブラックホールの拘束衣 +Like a black hole, anything that is caught in this jacket has no chance to escape its grasp. +ブラックホールのように、囚われた犠牲者を決して放さない拘束衣。 +Shadow Armbinder +影のアームバインダー +A tight armbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +異世界の物質で作られたアームバインダー。怪しく輝く光沢は、まるでもがき苦しむ犠牲者を観察する星々の目線を映しているかのようだ。 +Black Hole Armbinder +ブラックホールのアームバインダー +Like a black hole, anything that is caught in this armbinder has no chance to escape its grasp. +ブラックホールのように、囚われた犠牲者を決して放さないアームバインダー。 +Shadow Boxbinder +影のボックスバインダー +A tight boxbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +異世界の物質で作られたボックスバインダー。怪しく輝く光沢は、まるでもがき苦しむ犠牲者を観察する星々の目線を映しているかのようだ。 +Black Hole Boxbinder +ブラックホールのボックスバインダー +Like a black hole, anything that is caught in this boxbinder has no chance to escape its grasp. +ブラックホールのように、囚われた犠牲者を決して放さないボックスバインダー。 +Shadow Legbinder +影のレッグバインダー +A tight legbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +異世界の物質で作られたレッグバインダー。怪しく輝く光沢は、まるでもがき苦しむ犠牲者を観察する星々の目線を映しているかのようだ。 +Shadow Latex Petsuit +シャドーラテックス・ペットスーツ +A tight petsuit made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +異世界の物質で作られたペットスーツ。怪しく輝く光沢は、まるでもがき苦しむ犠牲者を観察する星々の目線を映しているかのようだ。 +Obsidian Yoke +黒曜石のヨーク +A yoke made from shining obsidian, stars glittering in the darkness. It pins your arms uselessly at your sides. +黒く輝く黒曜石で作られた、顔の横で両手を固定する拘束具。 +It's made of a dark, glistening volcanic metal. +黒く輝く黒曜石でできている。 + + Obsidian Muzzle -黒曜石の銃口 +黒曜石のマズル A muzzle made from segmented metal pieces, fitting securely over your face. -セグメント化された金属片で作られた銃口で、顔にしっかりとフィットします。 -It's made of a dark, glistening volcanic metal. -黒く輝く火山金属でできています。 +複数の黒曜石を繋げて作られており、ある程度顔にフィットするよう曲げられるようになっている。 + + Obsidian Collar 黒曜石の首輪 A collar made from a warm, shining alloy. -あたたかく光る合金の首輪 -It's made of a dark, glistening volcanic metal. -黒く輝く火山金属でできています。 +ほの温かく光り輝く首輪。 + + +Living Obsidian Collar +生きている黒曜石の首輪 +A collar made of a dark, shiny metal that adjusts itself to your neck. You can't help but hear whispering since it is so tight. +黒曜石でできた首輪。首の太さに合わせて調整できる。 +It will occasionally cause obsidian to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of obsidian you have on you. +装備していると、時折どこからともなく黒曜石の拘束具が現れて拘束される。効果は装備している黒曜石の拘束具の数で増加する。 + + Obsidian Cuffs -黒曜石の袖口 -A pair of cuffs that make it easy to restrain you. -拘束しやすいカフス -It's made of a dark, glistening volcanic metal. -黒く輝く火山金属でできています。 -The enemy attaches your wrist cuffs together! -敵があなたの手首カフをくっつけている! -Obs. Wrist Chain -オブス。リストチェーン -A pair of cuffs keeping your arms behind your back. -腕を背中の後ろに留める袖口のペア。 -It's made of a dark, glistening volcanic metal. -黒く輝く火山金属でできています。 -Your cuffs detatch! -袖口が外れます! -The enemy attaches your elbow cuffs together! -敵があなたの肘カフをくっつけている! -Obs. Wrist Chain -オブス。リストチェーン -A full set of cuffs keeping your arms in a strict elbow tie! -腕をきっちり肘紐で留める袖口フルセット! -It's made of a dark, glistening volcanic metal. -黒く輝く火山金属でできています。 -Your wrists detatch, leaving your elbows still bound! -手首が外れても、肘は縛られたままだ! -Obs. Elbow Chain -オブス。エルボーチェーン -A pair of cuffs keeping your elbows locked together!. -両肘を固定する袖口! -It's made of a dark, glistening volcanic metal. -黒く輝く火山金属でできています。 -Your elbows detatch! -肘が外れます! -The enemy attaches your wrist cuffs back together! -敵があなたの手首のカフを元に戻します! +黒曜石の手枷 +It's made of a dark, shiny metal. If you hold it close you hear whispering. +黒く輝く黒曜石でできている。耳に近づけると、かすかにささやき声が聞こえる。 + + + + Obsidian Leg Cuffs -黒曜石のレッグカフ -A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -It's made of a dark, glistening volcanic metal. -黒く輝く火山金属でできています。 +黒曜石の脚枷 + + Obsidian Ankle Cuffs -オブシディアン アンクル カフス -A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -It's made of a dark, glistening volcanic metal. -黒く輝く火山金属でできています。 -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! -Cuffs Chain -カフスチェーン -A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -It's made of a dark, glistening volcanic metal. -黒く輝く火山金属でできています。 -The ankle cuff chain detaches! -足首カフスのチェーンが外れる! +黒曜石の足枷 + + +Living Crystal Collar +生きているクリスタルの首輪 +A collar made of a glowing, brittle material that adjusts itself to your neck. You feel your energy flowing into it... +クリスタルでできた首輪。首の太さに合わせて調整できる。 +It will occasionally cause crystal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of crystal you have on you. +装備していると、時折どこからともなくクリスタルの拘束具が現れて拘束される。効果は装備しているクリスタルの拘束具の数で増加する。 + + Crystal Cuffs -クリスタルカフス -A pair of cuffs that make it easy to restrain you. -拘束しやすいカフス -It's made of a glowing, brittle material. -それは光る、もろい素材でできています。 -The enemy attaches your wrist cuffs together! -敵があなたの手首カフをくっつけている! -Crystal Wrist Chain -クリスタル リスト チェーン -A pair of cuffs keeping your arms behind your back. -腕を背中の後ろに留める袖口のペア。 -It's made of a glowing, brittle material. -それは光る、もろい素材でできています。 -Your cuffs detatch! -袖口が外れます! -The enemy attaches your elbow cuffs together! -敵があなたの肘カフをくっつけている! -Crystal Wrist Chain -クリスタル リスト チェーン -A full set of cuffs keeping your arms in a strict elbow tie! -腕をきっちり肘紐で留める袖口フルセット! -It's made of a glowing, brittle material. -それは光る、もろい素材でできています。 -Your wrists detatch, leaving your elbows still bound! -手首が外れても、肘は縛られたままだ! -Crystal Elbow Chain -クリスタルエルボーチェーン -A pair of cuffs keeping your elbows locked together!. -両肘を固定する袖口! -It's made of a glowing, brittle material. -それは光る、もろい素材でできています。 -Your elbows detatch! -肘が外れます! -The enemy attaches your wrist cuffs back together! -敵があなたの手首のカフを元に戻します! +クリスタルの手枷 +It's made of a glowing, brittle material. You feel your energy flowing into it... +光る脆い鉱石でできている。装備していると、エネルギーが枷に吸われていく…… + + + + Crystal Leg Cuffs -クリスタルレッグカフス -A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -It's made of a glowing, brittle material. -それは光る、もろい素材でできています。 +クリスタルの脚枷 + + Crystal Ankle Cuffs -クリスタルアンクルカフス -A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -It's made of a glowing, brittle material. -それは光る、もろい素材でできています。 -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! -Cuffs Chain -カフスチェーン -A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -It's made of a glowing, brittle material. -それは光る、もろい素材でできています。 -The ankle cuff chain detaches! -足首カフスのチェーンが外れる! +クリスタルの足枷 + + +Living Ice Collar +生きている氷の首輪 +A collar made of enchanted ice that adjusts itself to your neck. It won't melt on their own, and the ice chills you to the bone... +氷でできた首輪。首の太さに合わせて調整できる。 +It will occasionally cause ice to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ice you have on you. +装備していると、時折どこからともなく氷の拘束具が現れて拘束される。効果は装備している氷の拘束具の数で増加する。 + + +Ice Cuffs +氷の手枷 +They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... +魔法の氷で作られた拘束具。自然には溶けず、付けていると身も心も冷たくなっていく…… + + + + +A pair of cuffs keeping your elbows locked together!. +肘枷同士をつなぐための鎖。 + + +Ice Leg Cuffs +氷の脚枷 + + +Ice Ankle Cuffs +氷の足枷 + + +Living Slave Collar +生きている奴隷の首輪 +A collar made of a gold-tinted metal with a magical enchantment that adjusts itself to your neck. +金メッキの施された金属でできた首輪。首の太さに合わせて調整できる。 +It will occasionally cause slave gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slave gear you have on you. +装備していると、時折どこからともなく奴隷用の拘束具が現れて拘束される。効果は装備している奴隷用の拘束具の数で増加する。 + + Slave Cuffs -スレーブカフス -A pair of cuffs that make it easy to restrain you. -拘束しやすいカフス -It's made of a gold-tinted metal with a magical enchantment. -魔法のエンチャントが施された金色の金属でできています。 -The enemy attaches your wrist cuffs together! -敵があなたの手首カフをくっつけている! -Slave Wrist Chain -スレイブ リスト チェーン -A pair of cuffs keeping your arms behind your back. -腕を背中の後ろに留める袖口のペア。 +奴隷の手枷 It's made of a gold-tinted metal with a magical enchantment. -魔法のエンチャントが施された金色の金属でできています。 -Your cuffs detatch! -袖口が外れます! -The enemy attaches your elbow cuffs together! -敵があなたの肘カフをくっつけている! +エンチャントが施された金色の金属でできている。 + + Slave Wrist Chain -スレイブ リスト チェーン -A full set of cuffs keeping your arms in a strict elbow tie! -腕をきっちり肘紐で留める袖口フルセット! -It's made of a gold-tinted metal with a magical enchantment. -魔法のエンチャントが施された金色の金属でできています。 -Your wrists detatch, leaving your elbows still bound! -手首が外れても、肘は縛られたままだ! +奴隷の手枷の鎖 + + Slave Elbow Chain -スレーブ エルボ チェーン -A pair of cuffs keeping your elbows locked together!. -両肘を固定する袖口! -It's made of a gold-tinted metal with a magical enchantment. -魔法のエンチャントが施された金色の金属でできています。 -Your elbows detatch! -肘が外れます! -The enemy attaches your wrist cuffs back together! -敵があなたの手首のカフを元に戻します! +奴隷の肘枷の鎖 + + Slave Leg Cuffs -スレーブ レッグ カフス -A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -It's made of a gold-tinted metal with a magical enchantment. -魔法のエンチャントが施された金色の金属でできています。 +奴隷の脚枷 Slave Ankle Cuffs -スレーブアンクルカフス -A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -It's made of a gold-tinted metal with a magical enchantment. -魔法のエンチャントが施された金色の金属でできています。 -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! +奴隷の足枷 Slave Cuffs Chain -スレーブ カフス チェーン -A pair of cuffs chaining your legs together. -あなたの足を一緒に鎖でつないでいる袖口のペア。 -It's made of a gold-tinted metal with a magical enchantment. -魔法のエンチャントが施された金色の金属でできています。 -The ankle cuff chain detaches! -足首カフスのチェーンが外れる! +奴隷の枷の鎖 + + High-Tech Gag ハイテクギャグ A gag with a soft and filling mouthpiece, reinforced with a metallized strap. -金属製のストラップで補強された、柔らかくていっぱいのマウスピースを備えたギャグ。 +金属製のストラップで補強された、内側にマウスピースがついた猿轡。 It will be impossible to force it out or cut it with just a knife. -ナイフだけでは、無理に押し出すことも、切ることもできません。 +ナイフだけこじ開けることも切ることもできない。 + + Nylon Plug Gag ナイロンプラグギャグ A gag with a soft and filling mouthpiece, kept in place by an adjustable nylon strap. -調節可能なナイロン製ストラップで所定の位置に保持された、柔らかく充填性のあるマウスピースを備えたギャグ。 +調節可能なナイロン製の、内側にマウスピースがついた猿轡。 It will be impossible to force it out, but can be cut. -無理やり出すのは無理だろうけど、切ることはできる +無理やり吐き出すのは難しいが、切ることはできる。 + + High-Tech Cables (Arms) -ハイテクケーブル(アーム) +ハイテクケーブル(腕) Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! -セルフタイト メタライズド ポリファイバー製のケーブル。スチール エッジの影響を受けません! +自動で締まる金属繊維製ケーブル。鋼鉄の刃も通さない。 They are wrapped methodically around your body! -整然とあなたの体に巻きつけられています! +自動でターゲットの身体に巻き付く。 High-Tech Cables (Legs) ハイテクケーブル (脚) -Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! -セルフタイト メタライズド ポリファイバー製のケーブル。スチール エッジの影響を受けません! -They are wrapped methodically around your body! -整然とあなたの体に巻きつけられています! High-Tech Cables (Harness) ハイテクケーブル(ハーネス) -Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! -セルフタイト メタライズド ポリファイバー製のケーブル。スチール エッジの影響を受けません! -They are wrapped methodically around your body! -整然とあなたの体に巻きつけられています! + + Nylon Cables (Arms) -ナイロンケーブル(アーム) +ナイロンケーブル(腕) Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. -ナイロン ポリマー製のケーブル。非常に強く自己締め付け式ですが、鋭いエッジには弱いです。 -They are wrapped methodically around your body! -整然とあなたの体に巻きつけられています! +ナイロンポリマー製のケーブル。自動式で締まり、もがいても抜け出しにくいが刃物は通す。 Nylon Cables (Legs) ナイロンケーブル(脚) -Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. -ナイロン ポリマー製のケーブル。非常に強く自己締め付け式ですが、鋭いエッジには弱いです。 -They are wrapped methodically around your body! -整然とあなたの体に巻きつけられています! Nylon Cables (Harness) ナイロンケーブル(ハーネス) -Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. -ナイロン ポリマー製のケーブル。非常に強く自己締め付け式ですが、鋭いエッジには弱いです。 -They are wrapped methodically around your body! -整然とあなたの体に巻きつけられています! + + +Magic Ribbons +マジックリボン +Magically sealed ribbons to teach intruders a lesson. +侵入者を"教育"するための、魔法を帯びたリボン。 +The magic is powerful enough to ward off most blades, creating a true predicament for one who is trapped by these. +魔法によって刃も通さない程の強靭さを得ており、捕らえたものを逃さないリボン。 + + Magic Ribbons (Arms) マジックリボン(腕) Those ribbons will hold you tight~ -そのリボンがあなたを抱きしめてくれるわよ~ +魔法のリボンが締め付けてくる。 I've put a magic seal in that bow-knot to keep it secure! -その蝶結びに魔法の封印をして安全を確保しました! +蝶結びに魔法が施されており、簡単には解けない。 Magic Ribbons (Legs) マジックリボン(脚) -Those ribbons will hold you tight~ -そのリボンがあなたを抱きしめてくれるわよ~ -I've put a magic seal in that bow-knot to keep it secure! -その蝶結びに魔法の封印をして安全を確保しました! Magic Ribbons (Feet) マジックリボン(足) -Those ribbons will hold you tight~ -そのリボンがあなたを抱きしめてくれるわよ~ -I've put a magic seal in that bow-knot to keep it secure! -その蝶結びに魔法の封印をして安全を確保しました! Magic Ribbons (Harness) -マジックリボン(ハーネス) -Those ribbons will hold you tight~ -そのリボンがあなたを抱きしめてくれるわよ~ -I've put a magic seal in that bow-knot to keep it secure! -その蝶結びに魔法の封印をして安全を確保しました! +マジックリボン(身体) Magic Ribbons (Pelvis) -マジックリボン(骨盤) -Those ribbons will hold you tight~ -そのリボンがあなたを抱きしめてくれるわよ~ -I've put a magic seal in that bow-knot to keep it secure! -その蝶結びに魔法の封印をして安全を確保しました! +マジックリボン(股) Magic Ribbons (Mittens) -マジックリボン(ミトン) -Those ribbons will hold you tight~ -そのリボンがあなたを抱きしめてくれるわよ~ +マジックリボン(手) They are wrapped tightly around your hands with a bow knot! -ちょう結びでしっかりと手に巻かれてる! +蝶結びに魔法が施されており、簡単には解けない。 Magic Ribbons (Gag) -マジックリボンズ (ギャグ) -Those ribbons will hold you tight~ -そのリボンがあなたを抱きしめてくれるわよ~ +マジックリボン (口) They are wrapped tightly around your mouth with a bow knot! -ちょう結びできつく口に巻かれてるんだよ! +蝶結びに魔法が施されており、簡単には解けない。 +Living Ribbon Collar +生きているリボンラップの首輪 +This collar is designed to make sure its wearer does not escape the ribbons. +着用者をリボンラップで拘束し続けるための首輪。 +It will occasionally cause ribbons to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ribbons you have on you. +装備していると、時折どこからともなくリボンラップが現れて拘束される。効果は装備しているリボンラップの数で増加する。 + + Ice (Arms) 氷(腕) Frigid restraints made out of ice. -氷でできた極寒の拘束具 +氷でできた冷たい拘束具。 There's no way to remove it without breaking it off. -壊さずに取り除く方法はありません。 +抜け出すには壊すしかない。 Ice (Mouth) 氷(口) -Frigid restraints made out of ice. -氷でできた極寒の拘束具 -There's no way to remove it without breaking it off. -壊さずに取り除く方法はありません。 +Ice Ball Gag (Mouth) +氷のボールギャグ +A cold sphere of magic ice lodged firmly in your mouth. +口にすっぽりと収まる氷の球体。 +The work of a kinky elemental. It will melt! Eventually. +変態趣味の精霊の一品。いずれ溶けるだろう。 Ice (Body) -アイス(本体) -Frigid restraints made out of ice. -氷でできた極寒の拘束具 -There's no way to remove it without breaking it off. -壊さずに取り除く方法はありません。 +氷(身体) Ice (Legs) 氷(脚) -Frigid restraints made out of ice. -氷でできた極寒の拘束具 -There's no way to remove it without breaking it off. -壊さずに取り除く方法はありません。 + + Glue (Feet) -のり(足) +接着剤(つま先) A latex-derived glue that attaches you to the floor! It's very stretchy. -床にくっつくラテックス由来の接着剤!とても伸縮性があります。 +床に張り付くゴム由来の接着剤。とても伸縮性がある。 Just touching it makes it stick all over... -触っただけでベタベタ… +触っただけでベタベタ…… Glue (Ankles) -のり(足首) -A latex-derived glue that attaches you to the floor! It's very stretchy. -床にくっつくラテックス由来の接着剤!とても伸縮性があります。 -Just touching it makes it stick all over... -触っただけでベタベタ… +接着剤(足) Glue (Legs) -のり(脚) -A latex-derived glue that attaches you to the floor! It's very stretchy. -床にくっつくラテックス由来の接着剤!とても伸縮性があります。 -Just touching it makes it stick all over... -触っただけでベタベタ… +接着剤(脚) + + Slime (Feet) -スライム(足) +スライム(つま先) Sticky slime that adheres to your body. It reacts negatively to mana... -体にくっつくねばねばしたスライム。魔力にマイナス反応する…… +体に張り付くねばねばしたスライム。魔力を通さない…… It is an organic material that reforms around every cut you make! カットするたびに生まれ変わるオーガニック素材です! Slime (Ankles) -スライム(足首) -Sticky slime that adheres to your body. It reacts negatively to mana... -体にくっつくねばねばしたスライム。魔力にマイナス反応する…… -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! -Slime (Legs) スライム(足) -Sticky slime that adheres to your body. It reacts negatively to mana... -体にくっつくねばねばしたスライム。魔力にマイナス反応する…… -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! +Slime (Legs) +スライム(脚) Slime (Arms) スライム(腕) -Sticky slime that adheres to your body. It reacts negatively to mana... -体にくっつくねばねばしたスライム。魔力にマイナス反応する…… -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! Slime (Hands) スライム(手) -Sticky slime that adheres to your body. It reacts negatively to mana... -体にくっつくねばねばしたスライム。魔力にマイナス反応する…… -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! Slime (Mouth) スライム(口) -Sticky slime that adheres to your body. It reacts negatively to mana... -体にくっつくねばねばしたスライム。魔力にマイナス反応する…… -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! Slime (Head) -スライム(頭) -Sticky slime that adheres to your body. It reacts negatively to mana... -体にくっつくねばねばしたスライム。魔力にマイナス反応する…… -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! +スライム(顔) +Living Slime Collar +生きているスライムの首輪 +This collar is designed to make sure its wearer does not escape their slime. +着用者をスライムで拘束し続けるための首輪。 +It will occasionally cause slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slime you have on you. +装備していると、時折どこからともなくスライムが現れて拘束される。効果は装備しているスライムの数で増加する。 + + +Made from hardened slime. +固まったスライムから作られたゴム。 +The classic smooth, shiny material for full encasement. +マミフィケーションに使われる定番の素材。 + + +A semi-organic substance of alchemical origin. +錬金術によって生み出された、半有機的生命体。 +It has a mind of its own, and tends to spread if not properly contained. +意思を持っているため、適切な管理が必要。 + + +Proto Rubber +プロトラバー +Made from hardened proto rubber. +固まったプロトスライムから作られたゴム。 +A hardened form of the essence of latex. +ゴムのエッセンスを固めたもの。 + + +Proto Slime +プロトスライム +Alchemical rubber in its simplest form. Amorphous. +錬金術で作られた、とても単純な生命体。アモルファス。 +Often forms strange growths, seeking damsels to encase. +時として不思議な変異を遂げ、少女たちを捕縛しようとする。 + + Rubber (Feet) -ゴム足) -Sticky rubber that has fused itself into a shell around your body. -あなたの体の周りのシェルに溶けた粘着性のあるゴム。 +ゴム(つま先) +Sticky rubber that has fused itself into a skintight layer. +身体にピッタリと張り付く粘着性のゴム。 There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない +スライムよりももがくのは難しいが、再生能力は失われたので切れるかもしれない。 Rubber (Ankles) -ゴム(足首) -Sticky rubber that has fused itself into a shell around your body. -あなたの体の周りのシェルに溶けた粘着性のあるゴム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない +ゴム(足) Rubber (Legs) ゴム(脚) -Sticky rubber that has fused itself into a shell around your body. -あなたの体の周りのシェルに溶けた粘着性のあるゴム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない Rubber (Arms) -ラバー(アーム) -Sticky rubber that has fused itself into a shell around your body. -あなたの体の周りのシェルに溶けた粘着性のあるゴム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない +ゴム(腕) Rubber (Hands) ゴム(手) -Sticky rubber that has fused itself into a shell around your body. -あなたの体の周りのシェルに溶けた粘着性のあるゴム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない Rubber (Mouth) ゴム(口) -Sticky rubber that has fused itself into a shell around your body. -あなたの体の周りのシェルに溶けた粘着性のあるゴム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない Rubber (Head) -ラバー(ヘッド) -Sticky rubber that has fused itself into a shell around your body. -あなたの体の周りのシェルに溶けた粘着性のあるゴム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない +ゴム(顔) +Living Rubber Collar +生きているラバーの首輪 +This collar is designed to make sure its wearer does not escape their rubber. +着用者をラバーで拘束し続けるための首輪。 +It will occasionally cause rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. +装備していると、時折どこからともなくラバーが現れて拘束される。効果は装備しているラバーの数で増加する。 + + + + Proto-Slime (Feet) -プロトスライム(足) +プロトスライム(つま先) It seems to be a precursor to the slimes everyone is familiar with? みんながよく知っているスライムの前身らしい? -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! Proto-Slime (Ankles) -プロトスライム(足首) -It seems to be a precursor to the slimes everyone is familiar with? -みんながよく知っているスライムの前身らしい? -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! +プロトスライム(足) Proto-Slime (Legs) プロトスライム(脚) -It seems to be a precursor to the slimes everyone is familiar with? -みんながよく知っているスライムの前身らしい? -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! Proto-Slime (Arms) プロトスライム(腕) -It seems to be a precursor to the slimes everyone is familiar with? -みんながよく知っているスライムの前身らしい? -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! Proto-Slime (Hands) プロトスライム(手) -It seems to be a precursor to the slimes everyone is familiar with? -みんながよく知っているスライムの前身らしい? -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! Proto-Slime (Mouth) プロトスライム(口) -It seems to be a precursor to the slimes everyone is familiar with? -みんながよく知っているスライムの前身らしい? -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! Proto-Slime (Head) -プロトスライム(頭) -It seems to be a precursor to the slimes everyone is familiar with? -みんながよく知っているスライムの前身らしい? -It is an organic material that reforms around every cut you make! -カットするたびに生まれ変わるオーガニック素材です! +プロトスライム(顔) +Living Proto-Slime Collar +生きているプロトスライムの首輪 +This collar is designed to make sure its wearer does not escape the slime. +着用者をプロトスライムで拘束し続けるための首輪。 +It will occasionally cause proto-slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-slime you have on you. +装備していると、時折どこからともなくプロトスライムが現れて拘束される。効果は装備しているスライムの数で増加する。 + + Proto-Rubber (Feet) -プロトラバー(足) -Sticky slime that has fused itself into a shell around your body. -あなたの体の周りの殻に溶け込んだ粘り気のあるスライム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない +プロトラバー(つま先) +Sticky slime that has fused itself into a skintight layer. +身体にピッタリと張り付く粘着性のゴム。 Proto-Rubber (Ankles) -プロトラバー(足首) -Sticky slime that has fused itself into a shell around your body. -あなたの体の周りの殻に溶け込んだ粘り気のあるスライム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない +プロトラバー(足) Proto-Rubber (Legs) プロトラバー(脚) -Sticky slime that has fused itself into a shell around your body. -あなたの体の周りの殻に溶け込んだ粘り気のあるスライム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない Proto-Rubber (Arms) プロトラバー(腕) -Sticky slime that has fused itself into a shell around your body. -あなたの体の周りの殻に溶け込んだ粘り気のあるスライム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない Proto-Rubber (Hands) プロトラバー(手) -Sticky slime that has fused itself into a shell around your body. -あなたの体の周りの殻に溶け込んだ粘り気のあるスライム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない Proto-Rubber (Mouth) プロトラバー(口) -Sticky slime that has fused itself into a shell around your body. -あなたの体の周りの殻に溶け込んだ粘り気のあるスライム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない Proto-Rubber (Head) -プロトラバー(頭) -Sticky slime that has fused itself into a shell around your body. -あなたの体の周りの殻に溶け込んだ粘り気のあるスライム。 -There's no struggling out now, but since it's solid it may be cuttable. -今は苦労はないけど、しっかりしているから切れるかもしれない +プロトラバー(顔) +Living Proto-Rubber Collar +生きているプロトラバーの首輪 +This collar is designed to make sure its wearer does not escape the rubber. +着用者をプロトラバーで拘束し続けるための首輪。 +It will occasionally cause proto-rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-rubber you have on you. +装備していると、時折どこからともなくプロトラバーが現れて拘束される。効果は装備しているラバーの数で増加する。 + + +Sticky Tape +粘着テープ +Extra-strength utility tape, for your secure packaging needs. +とても長い多目的テープ。梱包したい"もの"に使おう。 +It's quite sticky, the adhesive requires some force to get off. +粘着力が強く、剥がしにくい。 + + Tape Mittens テープミトン Sticky tape that holds your hands into a fist! -手を握りこぶしにする粘着テープ! +手をぐるぐる巻きにして指を封じるテープ。 It's tough to get out of without some kind of grip! -なんらかのグリップがないと抜けにくい! +何からの補助がないと抜け出しにくい。 + + Arm Chains -アームチェーン +腕の鎖 Heavy chains keeping your arms securely behind your back. -重鎖が腕を背中の後ろにしっかりと固定します。 +腕をしっかり縛る重い鎖。 It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +ただのナイフで切るのは無謀。 Leg Chains -レッグチェーン +脚の鎖 Heavy chains keeping your legs firmly hobbled. -足をしっかりと固定する重いチェーン。 -It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +脚をしっかり縛る重い鎖。 Ankle Chains -アンクルチェーン +足枷の鎖 Heavy chains keeping your feet bound together. -両足を縛り付ける重鎖。 -It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +足をしっかり縛る重い鎖。 Crotch Chain -股チェーン +股の鎖 Heavy chains that serve as an anchor point around your waist. -腰のアンカーポイントとして機能する重いチェーン。 -It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +股に通された鎖。他の拘束具に取り付けられる。 + + Magic Arm Chains -マジックアームチェーン +魔法の腕の鎖 Magic chains keeping your arms securely behind your back. -魔法の鎖で腕を後ろに固定する -It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +腕をしっかり縛る魔法の鎖。 Magic Leg Chains -マジックレッグチェーン +魔法の脚の鎖 Magic chains keeping your legs firmly hobbled. -足をガッチリ固定する魔法の鎖 -It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +脚をしっかり縛る魔法の鎖。 Magic Ankle Chains -マジックアンクルチェーン +魔法の足枷の鎖 Magic chains keeping your feet bound together. -足を縛る魔法の鎖 -It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +足をしっかり縛る魔法の鎖。 Magic Crotch Chain -マジッククロッチチェーン +魔法の股の鎖 Magic chains that serve as an anchor point around your waist. -腰のアンカーポイントとなる魔法の鎖 -It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +股に通された魔法の鎖。他の拘束具に取り付けられる。 + + Shadow Chains (Arms) -シャドーチェイン(腕) +影の腕の鎖 Black chains for those who cross the divines -神々を渡る者への黒い鎖 -It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +神を信奉する者を縛する影の鎖。 Shadow Chains (Legs) -シャドーチェイン(脚) -Black chains for those who cross the divines -神々を渡る者への黒い鎖 -It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +影の脚の鎖 Shadow Chains (Ankles) -シャドーチェーン(足首) -Black chains for those who cross the divines -神々を渡る者への黒い鎖 -It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +影の足の鎖 Shadow Chain -影の鎖 -Black chains for those who cross the divines -神々を渡る者への黒い鎖 -It doesn't look like a knife is up to the task... -どうやらナイフではうまくいかないようだ... +影の股の鎖 + + Ectoplasmic Chains (Arms) -エクトプラズム チェーン (腕) +霊体の腕の鎖 Ghostly chains from a ghost that just doesn't want to let go. -手放したくない幽霊からの幽霊の鎖。 +幽霊が手放したくない者を縛するための鎖。 It's made of an ethereal substance. -それはエーテル物質でできています。 +不思議な素材でできている。 Ectoplasmic Chains (Legs) -エクトプラズム チェーン (脚) -Ghostly chains from a ghost that just doesn't want to let go. -手放したくない幽霊からの幽霊の鎖。 -It's made of an ethereal substance. -それはエーテル物質でできています。 +霊体の脚の鎖 Ectoplasmic Chains (Ankles) -エクトプラズム チェーン (足首) -Ghostly chains from a ghost that just doesn't want to let go. -手放したくない幽霊からの幽霊の鎖。 -It's made of an ethereal substance. -それはエーテル物質でできています。 +霊体の足の鎖 Ectoplasmic Chain -エクトプラスミック・チェーン -Ghostly chains from a ghost that just doesn't want to let go. -手放したくない幽霊からの幽霊の鎖。 -It's made of an ethereal substance. -それはエーテル物質でできています。 -Divine Cuffs -神の袖口 -It is said that even heaven has its hierarchies... -天国にもヒエラルキーがあるとは…… -Shining cuffs made of holy metal. Nothing can touch it. -聖なる金属で作られた輝く袖口。それに触れることはできません。 +霊体の股の鎖 + + Divine Cuffs -神の袖口 +神の枷 It is said that even heaven has its hierarchies... 天国にもヒエラルキーがあるとは…… Shining cuffs made of holy metal. Nothing can touch it. -聖なる金属で作られた輝く袖口。それに触れることはできません。 +聖なる金属で作られた輝く枷。どういうわけか触れることができない。 Divine Muzzle -ディバインマズル -It is said that even heaven has its hierarchies... -天国にもヒエラルキーがあるとは…… +神のマズル +Keep those lips sealed. +唇を封印する猿轡。 A shining muzzle made of holy metal. Nothing can touch it. -聖なる金属でできた輝く銃口。触れることはできません。 -Blindfold -目隠し +聖なる金属でできた輝くマズル。どういうわけか触れることができない。 +Divine Gag +神の猿轡 +A shining gag made of holy metal. Nothing can touch it. +聖なる金属でできた輝く猿轡。どういうわけか触れることができない。 + + A piece of cloth secured onto your face and blocking vision. -あなたの顔に固定され、視界を遮る一枚の布。 -You can still see through the gap around your nose. -鼻のあたりの隙間はまだ見えますね +顔に巻き付く布の目隠し。 +Cleave Gag +噛ませ猿轡 +A piece of cloth forced between your lips. +口に噛ませ、舌を噛みちぎらせないようにする細長い布の猿轡。 +On its own it's not very restrictive. +単体なら簡単に抜け出せる。 +Thick Cleave Gag +太い噛ませ猿轡 +A piece of cloth that makes it hard to speak. +口に噛ませ、発音を封じる太い布の猿轡。 +It's somewhat effective. +中々効果的だ。 Knotted Cloth Gag -結び布ギャグ +コブ付き噛ませ猿轡 A piece of cloth tied in a knot and tied over your mouth. -結び目で結ばれ、あなたの口の上に結ばれた一枚の布。 -On its own it's not very restrictive. -それ自体はそれほど制限的ではありません。 +口に噛ませ、発音を封じるコブの付いた猿轡。 +It's pretty effective at keeping you quiet. +とても効果的だ。 OTN Cloth Gag -OTNクロスギャグ +鼻上被せ猿轡 A piece of cloth tightened over your mouth. -あなたの口の上にきつく締められた一枚の布。 -On its own it's not very restrictive. -それ自体はそれほど制限的ではありません。 -Blindfold -目隠し +鼻の上まで被せられた布の猿轡。 A scarf secured onto your face and blocking vision. -あなたの顔に固定され、視界を遮るスカーフ。 -You can still see through the gap around your nose. -鼻のあたりの隙間はまだ見えますね +顔に巻き付くスカーフの目隠し。 Scarf Gag スカーフギャグ A scarf tightened over your mouth. -あなたの口の上に締められたスカーフ。 -On its own it's not very restrictive. -それ自体はそれほど制限的ではありません。 +スカーフの被せ猿轡。 Scarf Tie -スカーフタイ +スカーフ(腕) A scarf wrapped around your body. -あなたの体に巻かれたスカーフ。 -On its own it's not very restrictive. -それ自体はそれほど制限的ではありません。 +体に巻かれたスカーフ。 Scarf Leg Tie -スカーフレッグタイ -A scarf wrapped around your body. -あなたの体に巻かれたスカーフ。 -On its own it's not very restrictive. -それ自体はそれほど制限的ではありません。 +スカーフ(脚) Scarf Ankle Tie -スカーフアンクルタイ -A scarf wrapped around your body. -あなたの体に巻かれたスカーフ。 -On its own it's not very restrictive. -それ自体はそれほど制限的ではありません。 +スカーフ(足) + + Arm Belts -アームベルト +腕のベルト A ludicrous amount of belts secured with a buckle. -バックルで固定されたばかげた量のベルト。 +しっかりと固定された大量のベルト。 Lockable and fully adjustable to ensure snugness. -ぴったりとフィットするように、ロック可能で完全に調整可能です。 +ぴったりとフィットするように、細かい位置で調整可能。 Leg Belts -レッグベルト -A ludicrous amount of belts secured with a buckle. -バックルで固定されたばかげた量のベルト。 -Lockable and fully adjustable to ensure snugness. -ぴったりとフィットするように、ロック可能で完全に調整可能です。 +脚のベルト Ankle Belts -アンクルベルト -A ludicrous amount of belts secured with a buckle. -バックルで固定されたばかげた量のベルト。 -Lockable and fully adjustable to ensure snugness. -ぴったりとフィットするように、ロック可能で完全に調整可能です。 -Wrist Cuffs -リストカフス -Heavy shackles with a rudimentary lock. -初歩的なロックを備えた重いシャックル。 -You could pick these with a hairpin. -ヘアピンでこれらを摘むことができます。 -Shackles -シャックル -Heavy shackles with a rudimentary lock. -初歩的なロックを備えた重いシャックル。 -You could pick these with a hairpin. -ヘアピンでこれらを摘むことができます。 -Leg Shackles -レッグシャックル -Heavy shackles with a rudimentary lock. -初歩的なロックを備えた重いシャックル。 +足のベルト + + +Iron Cuffs +手枷 +Tough shackles with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. +簡単な錠前の付いた枷。クイックインベントリやホットバーから、任意のターゲットに使用できる。 You could pick these with a hairpin. -ヘアピンでこれらを摘むことができます。 -Ankle Shackles -足首シャックル +ロックピックで簡単に開けられる。 +Iron Shackles +鉄の足枷 +Tough shackles with a rudimentary lock. +簡単な錠の付いた頑丈な枷。 +Tough to walk in. +歩行を困難にする。 + + +Thumbcuffs +指枷 +Interferes with the use of your hands. +手の仕様を妨害する枷。 +Another layer of restriction. +珍しい箇所の拘束。 +Hinged Handcuffs +ヒンジ付き手錠 +Hinged cuffs with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. +簡単な錠前の付いたヒンジの枷。クイックインベントリやホットバーから、任意のターゲットに使用できる。 +Difficult to unlock, let alone pick by yourself. +一人で解錠するのは難しい。 + + +Heavy Handcuffs +重い手枷 +A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. +簡単な錠前の付いたアイリッシュ8スタイルの脚枷。クイックインベントリやホットバーから、任意のターゲットに使用できる。 +The position is too awkward to free yourself, even with a key... +鍵を使っても抜け出すのが難しい…… + + +Heavy Leg Irons +重い脚枷 +A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. +簡単な錠前の付いたアイリッシュ8スタイルの枷。 +The position is awkward, but it's on your feet so you can remove them yourself if you have free hands. +鍵を使っても抜け出すのが難しい…… + + +Thigh Shackles +脚枷 Heavy shackles with a rudimentary lock. -初歩的なロックを備えた重いシャックル。 -You could pick these with a hairpin. -ヘアピンでこれらを摘むことができます。 +簡単な錠の付いた重い枷。 +The enemy attaches your leg shackles together! +脚枷を繋げられた! +Linked Thigh Shackles +脚枷の鎖 +The leg shackles chain detaches! +脚枷をつなぐ鎖が外れた! + + Ankle Shackles -足首シャックル -The enemy attaches your ankle cuffs together! -敵がアンクルカフをくっつけてる! -Heavy shackles with a rudimentary lock. -初歩的なロックを備えた重いシャックル。 -You could pick these with a hairpin. -ヘアピンでこれらを摘むことができます。 -The ankle cuff chain detaches! -足首カフスのチェーンが外れる! +足枷 +Linked Ankle Shackles +足枷の鎖 +The enemy attaches your ankle shackles together! +敵に足枷の鎖を繋げられた! +The ankle shackles chain detaches! +足枷の鎖が外れた! + + Steel Muzzle -スチールマズル +鋼鉄のマズル A heavy muzzle with a rudimentary lock. -初歩的なロックを備えた重い銃口。 +簡単な錠前の付いた重いマズル。 You could pick this with a hairpin. -ヘアピンでこれを摘むことができます。 +ロックピックで簡単に開けられる。 +Blacksteel Muzzle +黒鉄のマズル +A heavy duty steel muzzle with a flexible metal locking pin and straps. +柔軟なストラップと錠のついた、黒鉄のマズル。 +Perfect for sealing away those unruly lips. +悪いお口を完全に封じるマズル。 + + + + Cursed Collar 呪われた首輪 A cold steel collar locked tightly on your neck. -あなたの首にしっかりとロックされた冷たい鋼の首輪。 +首にはめられた冷たい鋼鉄の首輪。 It appears to attract additional enemies to its wearer. -着用者に追加の敵を引き付けているようです。 +追加の敵が寄ってくるようだ。 + + Face 顔 Head 頭 Mouth 口 -Mouth -口 -Mouth -口 Ears 耳 -Collar -えり Neck 首 Arms @@ -7213,219 +8859,269 @@ Arms Hands 手 Torso -胴体 +胴 Bra -良い +胸 Belt ベルト Plug プラグ Vibe -バイブ +振動 Piercings ピアス -Nipples -乳首 Butt Plug -バットプラグ +アナルプラグ Legs 脚 Ankles 足首 -Feet -フィート Device デバイス + + You found an item that was too small to see! -小さすぎて見えないアイテムを見つけました! -You picked up XXX gold. -あなたは XXX ゴールドを手に入れました。 +小さなアイテムを見つけた! + + +You pick up XXX gold. +XXX ゴールドを手に入れた。 You retrieve an ancient power crystal. -あなたは古代の力の結晶を手に入れました。 +パワークリスタルを手に入れた。 You retrieve a spent ancient power crystal. -あなたは使用済みの古代の力のクリスタルを回収します。 +使用済みのパワークリスタルを手に入れた。 You pick up a magical amulet and use it to boost your stats. -あなたは魔法のお守りを手に取り、それを使ってステータスを上げます。 -You picked up a knife. -あなたはナイフを拾いました。 -You picked up a torch. -あなたはトーチを拾いました。 +魔法のアミュレットを手に入れた。能力を上昇させられる。 +You pick up a Leyline Map. +レイラインが記載された地図を手に入れた! +You pick up a knife. +ナイフを拾った。 + + +You pick up a torch. +松明を拾った。 You found a bundle of discarded knives! -捨てられた包丁の束を見つけたぞ! -You picked up an enchanted knife. -あなたはエンチャントされたナイフを拾いました。 -You picked up a magic knife. -あなたは魔法のナイフを拾いました。 -You picked up a lockpick. -あなたはロックピックを拾いました。 -You picked up a normal key. -あなたは普通の鍵を拾いました。 -You picked up a green key. -あなたは緑の鍵を拾いました。 -You picked up a blue key. -あなたは青い鍵を拾いました。 -You picked up a willpower potion. -あなたは意志力のポーションを手に入れました。 -You picked up a glowing blue mana potion. -青く光るマナポーションを手に入れた。 -You picked up a glowing blue orb. -あなたは光る青いオーブを拾いました。 -You picked up an invisibility potion. -あなたは不可視のポーションを手に入れました。 -You picked up a handful of ectoplasm. -あなたは一握りのエクトプラズムを拾いました。 -You picked up a green stamina potion. -あなたは緑のスタミナポーションを手に入れました。 -You picked up a frigid white potion. -あなたは極寒の白いポーションを手に取りました。 +捨てられたナイフの束を拾った! +You pick up a magic knife. +魔法のナイフを拾った。 +You pick up a lockpick. +ロックピックを拾った。 +You pick up a normal key. +鍵を拾った。 +You pick up a green key. +緑の鍵を拾った。 +You pick up a blue key. +青い鍵を拾った。 +You pick up a willpower potion. +気力のポーションを手に入れた。 +You pick up a glowing blue mana potion. +青く輝くマナポーションを手に入れた。 +You pick up a glowing blue orb. +青白く光るオーブを手に入れた。 +You pick up an invisibility potion. +透明のポーションを手に入れた。 +You pick up a handful of ectoplasm. +一握りのエクトプラズムを手に入れた。 +You pick up a green stamina potion. +緑色のスタミナポーションを拾った。 +You pick up a frigid white potion. +冷たく白いポーションを手に入れた。 You found a peculiar note on the ground and keep it in your journal. -あなたは地面に奇妙なメモを見つけて、それを日記に記録しました。 +奇妙なメモを発見し、日記に写した。 You found an uninteresting note on the ground. -あなたは地面に興味のないメモを見つけました。 +メモを発見したが、特に興味を引かれなかった。 You pick up a heavy hammer. -あなたは重いハンマーを拾います。 +重いハンマーを手に入れた。 You pick up a set of bolt cutters. -あなたはボルトカッターのセットを手に取ります。 +ボルトカッターを手に入れた。 You pick up a sharp sword. -あなたは鋭い剣を手に取りました。 +鋭い剣を手に入れた。 You pick up a flamberge. -あなたはフランベルジェを手に取ります。 +フランベルジェを手に入れた。 You recover your escort drone. -あなたは護衛用ドローンを回収します。 +護衛用ドローンを手に入れた。 You pick up a 'magic' wand... -『魔法』の杖を手に取ると…… +"魔法の"杖を手に入れた…… You pick up a magical ice cube. -あなたは魔法のアイスキューブを拾います。 +魔力で生成された氷塊を手に入れた。 You find some treated hemp rope. -あなたは処理された麻縄を見つけました。 +縄を手に入れた。 + + +Feather +羽根 +A feather taken from some large fluffy being. +くすぐりに便利な羽根 +Deals tickle damage. Greatly distracting. Offhand: +1 tickle damage on attack for 3 stamina. Greatly distracting. +くすぐり属性。敵の興奮値を増加させる。サブウェポン:攻撃時、追加でスタミナを3消費し、1くすぐり属性ダメージを追加で与え、興奮値を増加させる。 You pick up a feather. -あなたは羽を拾います。 +羽根を手に入れた。 + + +Maid's Feather Duster +メイドの羽箒 +An instrument used extensively by maidforce agents carrying out their duties. +メイドフォースのエージェントが任務を遂行する際に多用する道具。 +Deals tickle damage. Distracts enemies. Offhand: +15 distraction on attack for 1 stamina. +くすぐり属性。敵の興奮値を上昇させる。サブウェポン:攻撃時、追加でスタミナを1消費し、敵の興奮値+15。 +You pick up a feather duster. +羽箒を拾った。 + + + + +Rope Rune +縄のルーン +You smash the rune in front of you, and a flash of light enchants nearby ropes! +ルーンを砕くと、近くのロープが魔法の輝きを帯びた! +It feels tantalizing to look at. +見ているだけでゾクゾクする。 +Allows you to enchant ropes into more powerful restraints. +縄に強力なエンチャントを施す。 +You pick up a kinky trinket with a glowing red sigil. +赤く光るルーンの描かれた石を手に入れた。 + + You pick up a heavy flail. -あなたは重いフレイルを拾います。 +重いフレイルを手に入れた。 You pick up a shortspear. -あなたはショートスピアを拾います。 +ショートスピアを手に入れた。 +You pick up a long spear. +槍を手に入れた。 You pick up a pickaxe. -あなたはつるはしを拾います。 +つるはしを手に入れた。 You pick up an enchanted sword. -あなたは魔法の剣を手に取りました。 +魔法の剣を手に入れた。 You pick up an enchanted axe. -エンチャントされた斧を拾う。 +魔法の斧を手に入れた。 You pick up an enchanted hammer. -エンチャントされたハンマーを拾う。 +魔法のハンマーを手に入れた。 You pick up a light hammer that's inscribed 'IceBreaker'. -『アイスブレイカー』と書かれた軽いハンマーを手に取る。 +「アイスブレイカー」と書かれたハンマーを手に入れた。 You pick up an enchanted spear. -エンチャントされた槍を拾う。 +魔法の槍を手に入れた。 You pick up an enchanted flail. -あなたはエンチャントされたフレイルを拾います。 +魔法のフレイルを手に入れた。 You pick up a powerful axe. -あなたは強力な斧を手に取りました。 +強力そうな斧を手に入れた。 You pick up a consumable smoke bomb. -消耗品の発煙弾を拾う。 -You picked up a stone trinket with a glowing red sigil. -あなたは赤く光る印が付いた石の装身具を拾いました。 -You picked up a wet rock with some kind of symbol on it. -あなたは何らかのシンボルが描かれた湿った岩を拾いました。 -You picked up a crystal beautiful as the moon. -あなたは月のように美しい水晶を拾いました。 -You picked up a strange device with a sharpened razor disc. -鋭利なカミソリの円盤を備えた奇妙な装置を拾いました。 +煙幕弾を手に入れた。 +You pick up a stone trinket with a glowing red sigil. +赤く光る印が描かれた石を手に入れた。 +You pick up a wet rock with some kind of symbol on it. +何らかのシンボルが描かれている、湿った石を手に入れた。 +You pick up a crystal beautiful as the moon. +月のように輝くクリスタルを手に入れた。 +You pick up a strange device with a sharpened razor disc. +鋭利な円盤のついた奇妙な装置を手に入れた。 You find a strange ancient device with a sharp cutting blade. -あなたは鋭い刃を持つ奇妙な古代の装置を見つけました。 -You picked up a stone trinket with a glowing blue sigil. -青く光る印が付いた石の装身具を拾いました。 +鋭い刃を持つ古代の奇妙な装置を手に入れた。 +You pick up a stone trinket with a glowing blue sigil. +青く光る印が描かれた石を手に入れた。 You pick up a bola. -あなたはボラを拾います。 +投げ縄を手に入れた。 You pick up a bomb! -あなたは爆弾を拾います! +爆弾を手に入れた! You pick up Dragonslaver. -あなたはドラゴンスレイバーを拾います。 +ドラゴンスレイバー手に入れた。 You pick up Metamorphosis. -あなたは変身を拾います。 +変身装置を手に入れた。 You pick up Four Seasons. -あなたはフォーシーズンズを手に取ります。 +四季の杖を手に入れた。 You pick up The Arbiter. -あなたはアービターを拾います。 +裁定者の剣を手に入れた。 You pick up Dreamcatcher. -あなたはドリームキャッチャーを拾います。 -You retrieve the Bondage Buster. -あなたはボンデージバスターを回収します。 +ドリームキャッチャーを手に入れた。 +You retrieve the Bondage Buster EX. +ボンデージバスターEXを手に入れた。 +You salvage a Bondage Buster MK II. +ボンデージバスターMkIIを手に入れた。 You retrieve a Nevermere Blaster Mark IV. -ネバーミア ブラスター マーク IV を回収します。 +ネバーミア ブラスター マーク IV を手に入れた。 You retrieve the Messenger of Love. -あなたは愛の使者を取り戻します。 +キューピットの弓矢を手に入れた。 You retrieve Moirai's scissors. -モイライの鋏を回収せよ +モイライの鋏を手に入れた。 + + You pick up a bunch of scrolls! -あなたはたくさんの巻物を拾います! +色々な巻物を手に入れた! You pick up a Scroll of Sleight. -あなたはスライトの巻物を手に取りました。 +奇術の巻物を手に入れた。 You pick up a Scroll of Purity. -あなたは純潔の巻物を手に取りました。 +純潔の巻物を手に入れた。 You pick up a Scroll of Speech. -あなたはスピーチの巻物を手に取りました。 +口弁の巻物を手に入れた。 You pick up a Scroll of Sauntering. -あなたはSaunteringのスクロールを拾います。 -As you strike again, your weapon is pulled out of your grasp! -もう一度攻撃すると、武器が手から引き抜かれます! +ステップの巻物を手に入れた。 + + +Your weapon is pulled out of your grasp!!! +武器を取り上げられてしまった! +Your weapon is pulled out of your hand and tossed away by your captor! +武器を投げ捨てられてしまった! Your weapon slips out of your hand as you try to cut with it... -斬ろうとしたら武器が手から滑り落ちて…… +武器が手から滑り落ちた…… + + You put away the WEAPONNAME -あなたはWEAPONNAMEを片付けました +WEAPONNAME を外した。 You equip the WEAPONNAME -あなたはWEAPONNAMEを装備しています +WEAPONNAME を装備した。 Unequip 装備解除 Equip 装備 Equipped -装備 +装備中 + + Unlit Torch -消灯トーチ +消えている松明 Can be lit -点灯できます -Torch -松明 +点火可能 Provides light -光を与える +辺りを照らしている Lantern ランタン -Provides light -光を与える Magic Lantern 幻灯 -Provides light -光を与える Unlit Lantern 消灯ランタン -Can be lit -点灯できます Wall Sconce 壁取り付け用燭台 -Provides light -光を与える Broken Wall Sconce 壊れた壁取り付け用燭台 It is beyond repair. -それは修復不可能です。 +壊れていて直すことはできない。 +Light Portal +光るポータル +Empty Portal +虚無のポータル +Stare into the void... +虚無に続いている…… Liquid Latex -液体ラテックス +液状のゴム Engulfs creatures -生き物を飲み込む -Slime -スライム +近づくと飲み込まれる +Engulfs pets (like you) +ペットを飲み込む Slows creatures -クリーチャーを遅くする +上では足が遅くなる +Glue +ねばねば Ice 氷 Chilling and slippery -寒くて滑りやすい -Ropes -ロープ +ツルツルして滑りやすい。 +Water +水 +A concentration of moisture. +水たまり。 Looking for a new wearer -新しい着用者を探しています +新たな犠牲者を求めている Chains チェーン Broken pieces of chain @@ -7433,1921 +9129,2415 @@ Broken pieces of chain Belts ベルト Pieces of straps and leather -ストラップとレザーのかけら +ストラップとベルト Vines つる Fierce plantlife -激しい植物 +つるのきれはし Ribbons リボン Empowered with magic -魔法で強化 +魔法で強化されている Blessed Wrappings 祝福されたラッピング Enchanted wrappings -魅惑のラッピング +魔法でできたテープ Summoning Runes -ルーン召喚 +召喚のルーン Mystical runes used for summoning -召喚に使う神秘のルーン +召喚に使う、神秘のルーン Casting Runes -ルーンのキャスティング +作動中のルーン Mystical runes used for casting spells -呪文を唱える魔法のルーン文字 +魔法を行使する神秘のルーン +Suspicious Mechanism +怪しい装置 +A suspicious mechanism that seems to have been hastily put together. +急拵えの怪しい装置 +Suspicious Runes +怪しいルーン +A suspicious magic circle that was scrawled recently. +最近書き込まれた不審な魔法陣 Embers -残り火 +ぼや Ignition source. Blocks vision. 着火源。視界を遮る。 Inferno -インフェルノ +業火 Deals DAMAGEDEALT fire damage per turn -ターンごとにDAMAGEDEALTの火ダメージを与える +ターンごとに DAMAGEDEALT の火ダメージを受ける Steam 蒸気 Blocks vision 視界を遮る Smoke 煙 -Blocks vision -視界を遮る Cracked Earth -割れた地球 +ひび割れ Makes creatures unsteady -クリーチャーを不安定にする +足場が不安定で転びやすい +Rubble +瓦礫 +You don't think insurance will cover this. +この崩れ方は保険適応外だろう。 +No putting that back together. +元の姿に戻すことはできない。 + + Can be controlled using CMD spells CMD魔法で操作可能 Can be controlled using Rubbermancy ラバーマンシーで操作可能 + + Floor 床 -Wall -壁 +Object +物 Brickwork -れんが造り +れんが Doodad -ディスカッション +置物 Furniture -家具 +インテリア Table テーブル Shrine -神社 -Closed Door -閉じたドア -Open Door -ドアを開ける +祭壇 Closed Door -閉じたドア +閉じているドア Open Door -ドアを開ける +開いているドア Bed ベッド Bars -バー +柵 Ruined Shrine -荒廃した神社 +打ち捨てられた祭壇 Orb Altar オーブの祭壇 Empty Altar 空の祭壇 Chest -胸 -Empty Chest -空のチェスト +チェスト +Faction Chest +他者のチェスト +Open Chest +空きチェスト Shiny Object -光沢のあるオブジェクト -Shiny Object -光沢のあるオブジェクト +落とし物 Cracked Wall ひびの入った壁 Hook -針 +フック Entrance 入り口 Exit Stairs -階段を出る +階段を下る Mysterious Stairs 不思議な階段 Ghostly Adventurer -幽霊の冒険者 +冒険者の幽霊 +Button +ボタン Conveyor コンベア +Safety Conveyor +セーフティコンベア Doll Terminal -ドール端末 +ドール操作端末 Doll Supply -ドールサプライ +ドール搬入口 Bondage Machine ボンデージマシン +### Empty Fixture + +### Filled Fixture + +### Tablet + + + + + Ars Pyrotecnica アルス ピロテクニカ Codex Imaginus コデックス・イマジナス Clavicula Romantica -ロマンチックな鎖骨 +クラヴィキュラ・ロマンチカ A book of elemental magic -エレメンタルマジックの本 +精霊の魔法の本 A book about conjuration 召喚についての本 A book of manipulative spells -操作呪文の本 -Components: -コンポーネント: +操作魔法の本 + + Verbal -言葉 +口 +### Vision + +Components: +使用部位: Arm Movements -腕の動き +腕 Leg Gestures -足のジェスチャー -The incantation comes out as a garbled mess! -呪文がぐちゃぐちゃに出てくる! -You can't raise your arms to cast the spell! -魔法を唱えるために腕を上げることはできません! -Your feet are too clumsy to perform the magic gesture! -あなたの足は魔法のジェスチャーを行うには不器用です! +足 +You mumble incoherently trying to cast the spell... +詠唱中に噛んでしまった…… +You wiggle uselessly trying to cast the spell... +魔法を使おうとしたが、腕の動きを忘れてしまった…… +Your feet are too clumsy to perform the magic gesture... +足が不器用なため、詠唱の動作に失敗した…… +### You are unable to see, so you can't target this spell... + Next Page 次のページ Last Page 最後のページ ->>> ->>> -<<< -<<< +### >>> + +### <<< + Random Page (your hands are tied) -Random Page (あなたの手は縛られている) -Verbal -言葉 -Arms -腕 -Legs -足 +Random Page (手が縛られている) + + Misc その他 -Elements -エレメンツ -Conjuration -召喚 -Illusion -イリュージョン Other -他の +他 Strength -強さ +力 Dexterity -器用さ +器用 Intelligence -知能 -Misc -その他 +知力 + + +Unique +ユニーク +Active +アクティブ +Upgrades +強化 + + Learnable -学習可能 +習得可能 Unlearned -未学習 +未習得 +Learned +習得済み Excl. Upgrades -除外アップグレード +強化魔法を除外 Passive -受け身 +パッシブ Upcast -アップキャスト +強化魔法 Buffs バフ DoT -ドット +持続ダメージ Projectiles -投射物 +投影 Melee -乱闘 +近接 Area Damage 範囲ダメージ Area Denial -エリア拒否 +範囲効果 Offense -オフェンス +攻撃 Defense -防衛 +防御 Fire 火 -Ice -氷 Earth -地球 +地 Air -空気 +風 Lightning -雷 -Water -水 -Rubber -ゴム +電気 Teleport テレポート Physics 物理 -Conjuration -召喚 Summoning -召喚 +召喚物 Binding -バインディング -Metal -金属 -Rope -ロープ -Leather -レザー +拘束 Stealth ステルス Projection 投影 Alteration -変更 +変異 Light ライト Shadow 影 Knowledge 知識 +Archery +弓術 Utility -効用 -Upgrades -アップグレード +その他 Spell Tree スペルツリー -Willpower -意志力 Stamina -元気 -Magic -魔法 +スタミナ Damage ダメージ Distraction -気晴らし +興奮 + + Empower to upcast spells -アップキャスト呪文に力を与える +魔法を強化 Cancel empowerment -エンパワーメントをキャンセル +強化をキャンセル You channel mana through your body! Empowerment level: LEVEL -魔力を体に流す! 強化レベル:LEVEL +体に魔力を流し込んだ! 強化レベル: LEVEL You are already at the maximum empowerment level! -あなたはすでに最大の強化レベルに達しています! +これ以上強化できない! You don't have any upcast spells yet. -あなたはまだアップキャストの呪文を持っていません。 +強化可能な魔法がない。 Upcast from SPELL -SPELLからアップキャスト +SPELL から強化 + + You fail to concentrate on the spell and it fizzles! -あなたは呪文に集中することができず、それは失敗します! +集中力が足りず、魔法の詠唱に失敗した! Your gag causes you to mispronounce the magic words! -あなたのギャグは魔法の言葉の発音を間違えます! +猿轡のせいで上手く発音できなかった! +You are too clumsy to perform the leg movements! +不器用な足ではうまく魔法の動きが行えない! +### You can't get a good look at the target! + +You trip up while casting the spell! +魔法のジェスチャー中に転んでしまった! +You miscast the spell because of a bug. Please report. +不具合のせいで魔法を唱えられなかった。報告をお願いします。 +You wave your arms around and make the wrong symbol with your hands! +適当な腕の動きで間違えた魔法陣を描いてしまった! +Your restrained fingers can't make the magic glyphs in time! +不自由な指では魔法のグリフを作るのに間に合わなかった! + + + + The ice drains your concentration! Your mana and stamina are slipping away! -氷はあなたの集中力を消耗させます!あなたのマナとスタミナが滑り落ちています! +体に張り付いた氷にマナとスタミナを奪われる! A strange, chaotic energy flows into you! Your will is weakened and your mana fades! -奇妙で混沌としたエネルギーがあなたに流れ込みます!あなたの意志は弱まり、あなたのマナは衰えます! +混沌としたエネルギーが体を駆け巡り、気力とマナを奪われてしまう! Something gently, constantly tickles you! -やさしく、常にくすぐる何かが! +何かに優しくくすぐられる! + + The ampule shatters on impact! -アンプルは衝撃で粉々に! +瓶が衝撃で粉々に砕けた! The gas ampule shatters on impact! -衝撃でガスアンプルが粉々に! +ガス入り瓶が衝撃で粉々に砕けた! The glue ampule shatters on impact! -グルーアンプルは衝撃で粉々に! +接着剤入り瓶が衝撃で粉々に砕けた! The rubber ampule shatters on impact! -衝撃でゴムアンプルが粉々に! +ラバー入り瓶が衝撃で粉々に砕けた! The latex ampule shatters on impact and forms a restraint! -ラテックスアンプルは衝撃で粉々に砕けて拘束具を形成! +瓶が衝撃で粉々に砕け、中のラバーが拘束具になった! The latex ampule shatters on impact and coats your body! -衝撃で粉々に砕けるラテックスアンプルが体をコーティング! +瓶が衝撃で粉々に砕け、中のラバーがまとわりついてきた! The latex ampule shatters on impact and sticks to you! -ラテックスアンプルは衝撃で粉々になり、くっつきます! -Gas Ampule -ガスアンプル -Glue Ampule -グルーアンプル -Rubber Ampule -ラバーアンプル -Latex Ampule -ラテックスアンプル +瓶が衝撃で粉々に砕け、中のラバーがひっついてきた! + + Shadowy chains appear from a rift in space! -宇宙の裂け目から影の鎖が出現! +空間が裂け、影の鎖が出現した! The roaring inferno deals 10 damage to you! -轟く地獄は君に10ダメージ! -Mana Burst -マナバースト -As a trainee, you have learned the technique of inducing clarity via a trance-like state at 100% distraction. However, this state is precarious, and casting spells may cause you to lose focus... -研修生として、あなたは 100% 気を散らしてトランスのような状態にすることで、明晰さをもたらすテクニックを学びました。しかし、この状態は不安定であり、呪文を唱えると集中力が失われる可能性があります... +地獄の咆哮により10のダメージを受けた! + + +The Reaping +刈り取り ++20% damage to plants +植物に対してダメージ量+20% + + +Magically Iliterate +魔法は専門外 +You've never read a magic book. Elemental, Conjuration, and Illusion spells cost 3x as many spell points. +魔導書を読んだことがない。精霊、幻惑、召喚の魔法を習得する際、必要スキルポイントが3倍になる。 + + +Magical Spark +魔道の覚醒 +Reduce the penalty from Magically Iliterate to 2x. +「魔法は専門外」の必要スキルポイントが3倍から2倍になる。 +Magical Training +修行の成果 +Remove the penalty from Magically Iliterate. +「魔法は専門外」のペナルティがなくなる。 + + +Reap What You Sow +自分で蒔いた種 +Defeating a non-humanoid enemy causes vines to sprout on their space temporarily. +人型以外の敵を倒すと、倒した敵のマスにつるが生える。 + + +Battle Rhythm +戦闘のリズム +Stores 10% of the stamina cost of attacks as Rhythm, up to a total of 40. While you have over 10 Rhythm, you gain +10 Block and Evasion. Enemy base accuracy against you is decreased by a % equal to your Rhythm. If an attack misses or is blocked because of this, reduce Rhythm by 25% of the enemy attack power. Decays when not attacking. +攻撃で消費したスタミナの10%を戦闘のリズムとして蓄積する(最大40)。戦闘のリズムが10以上の時、ブロックと回避力が+10され、敵の基礎命中率が戦闘のリズムの分低下する。敵の攻撃をブロック、または回避した際、敵の攻撃力の25%分の戦闘のリズムを消費する。戦闘のリズムは、攻撃を行わなかった際に低下する。 + + +Limit Surge +応急処置 +### Spend 40 WP to fully restore Stamina, also stamina gain is increased by 30% for 20 turns. If your Willpower ends up 0 because of this, you are stunned for 2 turns. + +Battle Trance +バトルトランス +While at 40 Battle Rhythm, you attack twice per turn. +戦闘のリズムが40以上の時、一度の攻撃で二回攻撃する。 + + +Combat Maneuver +再移動 +When Battle Trance is active, you gain a free move if the target is defeated before the second attack hits. +バトルトランスの発動中、一度目の攻撃で敵を倒した場合に、移動が可能になる。 + + + + + + +Devious Ingenuity +悪巧み +Trap-type spells and consumables no longer require you to channel them, but still have a delay before arming. +罠タイプの魔法やアイテムの用意にターンを消費しなくなる。投擲にはターンを消費する。 + + + + + + +### Essence Motes + +### When you miscast a spell, you gain an Essence Mote which appears in a random space next to you. You can consume this mote to gain -100% miscast chance decaying over 10 turns. Walking over the mote also consumes it. + +Inner Power +秘めたる力 +As a wizard, you are able to draw upon mystical sources of energy that others can't even see. After 16 turns of not casting a spell or attacking, your next spell's mana cost is reduced by 20% of your max mana BEFORE multipliers. Toggled passive spells apply half the cooldown. +魔術師としての訓練により、不可視のエネルギーを使用できる。16ターンの間、攻撃や魔法を使用しなかった場合、次の魔法のマナ・コストが最大マナの20%減少する。パッシブスキルのON/OFFを切り替える際、クールダウンが半分になる。 + + +Battlemage +バトルメイジ +Inner Power cooldown is no longer reset after attacking. +「秘めたる力」のクールダウンが攻撃してもリセットされなくなる。 + + +Relentless Casting +容赦なき詠唱 +While on cooldown, Inner Power cooldown is no longer reset after casting spells. +「秘めたる力」のクールダウン中に魔法を使用した場合、クールダウンがリセットされなくなる。 + + +Arcane Recharge +アーケインリチャージ +Calling upon chaotic energies, your willpower is assaulted in exchange for power. Deals 80 psychic damage to self and drains 10% of your max Willpower to fully restore mana. Does not refill the mana pool. +自身の被害を顧みず、混沌の力を体に宿す。80精神ダメージを受け、気力を最大値の10%消費し、マナを完全回復する。マナプールは補充されない。 + + +Way of Pleasure +快楽の道 +You have chosen the path of absolute pleasure. After letting go of yourself, you restore 50 mana, which can refill the mana pool if you have spare willpower. Blocks Way of Discipline. +欲望に素直になった。絶頂後、マナを50回復し、気力が1以上の場合、マナプールを回復する。このスキルを習得した場合、「鍛錬の道」を習得することができなくなる。 + + +Intense Power +強烈な解放 +After letting go of yourself, you feel an immense surge of power, increasing magic damage by 40% for 8 turns after you regain control, and by 10% while you remain satisfied. +絶頂後、強大な力を得る。8ターンの間魔法ダメージが40%上昇し、満足している間は10%上昇する。 + + +Pleasure Training I +快楽耐性アップ I +You remain satisfied for much less time after letting go. Letting go costs 50% less stamina. +絶頂後に満足する時間が短くなる。絶頂のスタミナコスト-50% +Pleasure Training II +快楽耐性アップ II +You are quite difficult to satisfy. Letting go costs 50% less stamina (75% total) and 50% less willpower. +絶頂後に満足感を得るのが難しくなる。絶頂のスタミナコスト-50%(合計75%)、気力コスト-50%。 + + +Mental Resistance +不屈の精神 +### +100 Psychic and Charm Resist. You can no longer let go involuntarily while your WP is above 10% or you are shielded, and willpower drains 70% slower while edged. (click the buff to toggle) + +Mental Resistance: You cannot orgasm except by choice or below 25% WP. Click to toggle. +不屈の精神:気力が25%以上の時、勝手に絶頂しなくなる。クリックで切り替え。 +Mental Resistance: You are allowing yourself to let go. Click to toggle. +不屈の精神:勝手に絶頂するようになる。クリックで切り替え。 + + +Way of Discipline +鍛錬の道 +You have chosen the path of absolute discipline. Being in an Edged state increases passive mana recovery and you regenerate 0.5 mana per turn, restoring the same amount to the Mana Pool if you have willpower to spare. Blocks Way of Pleasure. +鍛錬の道を歩んだ。絶頂中、マナの回復量が増加し、1ターンに0.5回復するようになる。このスキルを習得した場合、「快楽の道」を習得することができなくなる。 + + +Way of Denial +禁欲の道 +Harnessing your mental discipline, you regenerate 20 mana each time you are denied, restoring the same amount to the Mana Pool if you have willpower to spare. +鍛錬を活かし、焦らされる度にマナを20回復し、マナプールを気力分回復する。 + + Flame Novice -炎の初心者 +火魔術入門 Unlocks fire spells. Learn Firebolt. -火の呪文のロックを解除します。ファイアボルトを学ぶ。 +火属性の魔法が習得可能になる。「ファイアボルト」を習得。 Lightning Novice -稲妻初心者 -Unlocks electrice spells. Learn Electrify. -電気呪文のロックを解除します。エレクトリファイを学ぶ。 +電気魔術入門 +Unlocks electrice spells. Learn Electrify. Gain increased resistance to blinding from bright lights. +電気属性の魔法が習得可能になる。「エレクトリファイ」を習得。強烈な光に対する耐性が上昇する。 Water Novice -水の初心者 +水魔術入門 Unlocks water spells. Learn Water Ball. -水の呪文のロックを解除します。ウォーターボールを学ぶ。 +水属性の魔法が習得可能になる。「ウォーターボール」を習得。 Ice Novice -氷の初心者 +氷魔術入門 Unlocks ice spells. Learn Freeze. -氷の呪文のロックを解除します。フリーズを学ぶ。 +氷属性の魔法が習得可能になる。「フリーズ」を習得。 Earth Novice -アースノービス +地魔術入門 Unlocks earth spells. Learn Stone Skin. -土の呪文のロックを解除します。ストーンスキンを学ぶ。 +土属性の魔法が習得可能になる。「ストーンスキン」を習得。 Air Novice -エアノービス +風魔術入門 Unlocks air spells. Learn Wind Blast. -空中呪文のロックを解除します。ウインドブラストを習得。 +風属性の魔法が習得可能になる。「ウインドブラスト」を習得。 + + Latex 101 -ラテックス 101 +ラテックス入門 Unlocks latex spells. Learn Slime Ball. -ラテックス呪文のロックを解除します。スライムボールを学ぶ。 +ラテックス属性の魔法が習得可能になる。「スライムボール」を習得。 Metal 101 -メタル101 +メタル入門 Unlocks metal spells. Learn Conjure Cuffs. -金属呪文のロックを解除します。召喚手錠を学ぶ。 +メタル属性の魔法が習得可能になる。「手錠召喚」を習得。 Rope 101 -ロープ 101 +ロープ入門 Unlocks rope spells. Learn Conjure Ropes. -ロープの呪文のロックを解除します。ロープの召喚を学ぶ。 +縄属性の魔法が習得可能になる。「ロープ召喚」を習得。 Leather 101 -レザー 101 +レザー入門 Unlocks leather spells. Learn Conjure Gag. -革の呪文のロックを解除します。ギャグを召喚するを学びます。 +革属性の魔法が習得可能になる。「猿轡召喚」を習得。 Physics 101 -物理101 -Unlocks teleportation and physical manipulation spells. Learn Wall. -テレポーテーションと物理操作呪文のロックを解除します。壁を学ぶ。 +サイキック入門 +Unlocks teleportation and spatial manipulation spells. Learn Wall. +ロック操作やテレポーテーションの魔法が習得可能になる。「壁召喚」を習得。 Summoning 101 -召喚101 +召喚術入門 Unlocks summoning spells. Learn Summon Familiar. -召喚呪文のロックを解除します。サモンファミリアを習得。 +召喚の魔法が習得可能になる。「使い魔召喚」を習得。 + + Blessing of Shadow 影の祝福 Unlocks shadow spells. Learn Shadow Dagger. -影の呪文のロックを解除します。シャドーダガーを習得。 +影属性の魔法が習得可能になる。「シャドーダガー」を習得。 Blessing of Light -光の祝福 -Unlocks light spells. Learn Flash. -光の呪文のロックを解除します。フラッシュを学びます。 +光の恩恵 +Unlocks light spells. Learn Flash. Gain significantly increased resistance to blinding from bright lights. +光属性の魔法が習得可能になる。「フラッシュ」を習得。強烈な光に対する耐性が上昇する。 Blessing of Obscurity -闇の祝福 +見えざるものの抱擁 Unlocks invisibility spells. Learn Camouflage. -不可視呪文のロックを解除します。カモフラージュを学ぶ。 +視認性を下げる魔法が習得可能になる。「カモフラージュ」を習得。 Projection Magic -プロジェクションマジック +投影魔術 Unlocks illusory spells. Learn Summon Decoy. -幻想的な呪文のロックを解除します。サモンデコイを習得。 +幻惑属性の魔法が習得可能になる。「デコイ」を習得。 Alteration Magic -改変魔法 +変異魔法 Unlocks alteration spells. Learn Confuse. -改変呪文のロックを解除します。混乱を学ぶ。 +変異魔法が習得可能になる。「混乱」を習得。 Arcane Knowledge -難解な知識 +秘術の知識 Unlocks knowledge and critical-strike spells. Learn True Steel, and unlocks advanced tooltips for enemies. -知識とクリティカル ストライク スペルのロックを解除します。True Steel を学び、敵の高度なツールチップのロックを解除します。 -Glue -のり -The glue attaches to your legs as you try to move through! -移動しようとすると、接着剤が足に付着します。 +特殊な魔法が習得可能になる。「トゥルースチール」を習得し、マスの詳細な情報が得られるようになる。 + + +The glue sticks to you and engulfs your legs! +足元にくっついたノリが這い上がり、包みこんできた! The glue slows you down! -接着剤はあなたを遅くします! +接着剤のせいで動きが鈍くなった! The glue slows you down! (-DamageDealt SP) -接着剤はあなたを遅くします! (-DamageDealt SP) +接着剤のせいで素早く動けない! (-DamageDealt SP) + + Firebolt ファイアボルト Elemental's Firebolt -エレメンタルのファイアボルト +精霊のファイアボルト Elemental's Gust -エレメンタルの突風 -A ball of flame that does DamageDealt damage. -DamageDealt ダメージを与える炎のボール。 +精霊の突風 +Gust +ガスト +A ball of flame that does DamageDealt damage to one target. +火球を放ち、敵一体に DamageDealt 火ダメージを与える。 You a hurl a firebolt! -あなたは火の玉を投げつけます! +火球を投げつけた! Choose aim direction -照準方向を選択 +発射方向を選択 + + Windblast ウインドブラスト -Three puffs of wind that do DamageDealt pressure damage, stun briefly, and push targets back. -ダメージを与える風を 3 回吹き付けて圧力ダメージを与え、短時間気絶させ、ターゲットを押し戻します。 +Three scattered puffs of wind that do DamageDealt blast damage at close range, stun briefly, and push targets back. +風を3回吹き付けて DamageDealt ダメージを与える。命中した敵を気絶させ、ノックバックさせる。 You press your wrists together and conjure a blast of wind! -手首を一緒に押して、風を吹き込みます! -Choose aim direction -照準方向を選択 -Knife -ナイフ +圧縮した風を押し出す! +Three puffs of wind in a tight cone that deal DamageDealt blast damage and push targets back. +鋭い風を3回吹き付け、 DamageDealt ダメージを与え、命中した敵をノックバックさせる。 +You exhale a mighty wind! +強力な風を吐き出した! + + Throw one of your knives DamageDealt damage. Lands in the target's tile, but is recoverable afterward. -ナイフを 1 本投げてダメージを与えます。ターゲットのタイルに着地しますが、後で回復できます。 +ナイフを投げ、 DamageDealt ダメージを与える。落ちたナイフは再び拾える。 You a throw a knife! -ナイフを投げろ! -Choose aim direction -照準方向を選択 +ナイフを投げた! + + Shadow Dagger シャドーダガー A cold shadowy blade that deals DamageDealt damage and pierces all in its path. -DamageDealt ダメージを与え、その経路内のすべてを貫通する冷たい影の刃。 +経路上のすべての敵に DamageDealt ダメージを与える、凍てつく影のダガーを投げる。 You a hurl a shadowy dagger! -あなたは影の短剣を投げます! -Choose aim direction -照準方向を選択 +シャドーダガーを投擲した! + + Shadow Slash シャドースラッシュ Shadow Scythe シャドーサイス -Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. -あなたの前のエリアをスライスし、そのエリアに遅延ダメージダメージを与え、一時的に減速します。 +Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. Deals 50% more damage when you are attacking from the shadows. +前方のエリアを切り裂き、一定ターン数後に DamageDealt ダメージを与え、減速効果を付与する。影の中から攻撃を仕掛けた場合、ダメージが50%上昇する。 You create a tear in space with your finger! -指で空間に裂け目を作ります! -Choose aim direction -照準方向を選択 -Portal -ポータル -Teleport to a nearby location (including into darkness) with twice the range. -2 倍の範囲で近くの場所 (暗闇を含む) にテレポートします。 -You call upon a misty portal to transport you! -あなたは霧のポータルにあなたを輸送するよう呼びかけます! -Choose target location -ターゲットの場所を選択 +指で宙をなぞり、空間を切り裂く! + + Blink -まばたき -Instantly teleport to a location you can see. -すぐに見える場所にテレポートします。 +ブリンク I +Instantly teleport to an adjacent position and gain +50 evasion for 3 turns. Unlocks Blink and Warp when learned. +隣接するマスに瞬時に移動し、3ターンの間回避力+50。習得すると「ブリンク」と「ワープ」がアンロックされる。 You teleport! -あなたはテレポートします! -Choose target location -ターゲットの場所を選択 +瞬間移動した! +Choose target location (1 tile range) +移動先を選択(1マス先) +Blink II +ブリンク II +Instantly teleport up to 2 tiles away. Must have vision of the target point. Stuns an enemy if you teleport behind them. +視界範囲内の、2マス先まで瞬時に移動する。敵の後ろにワープした場合、敵をスタンさせる。 +Choose target location (2 tile range) +移動先を選択(2マス先) +Blink III +ブリンク III +Instantly teleport up to 3 tiles away. Must have vision of the target point. +視界範囲内の、3マス先まで瞬時に移動する。 +Choose target location (3 tile range) +移動先を選択(3マス先) + + Ice Shard アイスシャード A shard of ice that does DamageDealt damage and slows for Duration turns. Freezes if already slowed or drenched. -DamageDealt ダメージを与え、Duration ターンの間減速する氷の破片。すでに減速しているかびしょぬれになっている場合はフリーズします。 +氷の礫を発射し、 DamageDealt ダメージを与え、Duration ターンの間減速させる。対象がすでに減速か水濡れ状態の場合、凍結状態になる。 You a hurl a shard of ice! -あなたは氷の破片を投げつけます! -Choose aim direction -照準方向を選択 +氷の破片を投げつけた! + + Ice Lance アイスランス A quick-moving shard of ice that does DamageDealt damage and slows for Duration turns and passes through enemies. Freezes if already slowed or drenched. -ダメージを与え、Duration ターンの間減速し、敵を通り抜ける、動きの速い氷の破片。すでに減速しているかびしょぬれになっている場合は凍結します。 +氷の槍を素早く発射し、 DamageDealt ダメージを与え、Duration ターンの間減速させる。対象がすでに減速か水濡れ状態の場合、凍結状態になる。 You conjure a mighty spear of ice and hurl it forward! -強力な氷の槍を召喚し、前方に投げつけます! -Choose aim direction -照準方向を選択 +強大な氷槍を召喚し、前方に投げつける! + + Snowball スノーボール A fast orb that leaves behind a frigid cloud of ice. Enemies walking in the cloud take DamageDealt ice damage per tile and are slowed. -冷たい氷の雲を残す高速オーブ。雲の中を歩いている敵は、タイルごとにダメージを与えられた氷のダメージを受け、減速します。 +通り道に氷霧を残す氷のオーブを放つ。氷霧の中にいる敵は DamageDealt の氷ダメージを受け、減速状態になる。 You a hurl a snowy blast! -あなたは雪の爆発を投げつけます! -Choose aim direction -照準方向を選択 +氷霧の塊を投げつける! + + Winterblast ウィンターブラスト A piercing orb that leaves a trail of ice. Deals DamageDealt ice damage to enemies hit. -氷の跡を残す突き刺すオーブ。ダメージヒットした敵に氷属性のダメージを与える。 +突き刺す氷のオーブを放つ。 DamageDealt 氷ダメージを与える。 You a hurl a frigid orb! -あなたは極寒のオーブを投げつけます! -Choose aim direction -照準方向を選択 +極寒のオーブを発射する! + + Freeze -氷結 -Freeze an adjacent target for Duration turns. -Duration ターンの間、隣接するターゲットを凍結します。 +フリーズ +Chill an adjacent target for DamageDealt ice damage and slows for Duration turns. Freezes if already slowed or drenched. +隣接する対象に DamageDealt 氷属性ダメージを与える。命中したターゲットが水浸し、減速状態出会った場合、 Duration ターンの間凍結させる。 You utter dark words of ice-cold truths. -あなたは氷のように冷たい真実の暗い言葉を口にします。 +黒き氷の真実を口にした。 Choose a target to freeze -フリーズするターゲットを選択 +ターゲットを選択 + + Flash Frost フラッシュフロスト Deal DamageDealt ice damage in a 3x3 area. Drenched creatures are frozen for 8 turns. -ダメージを与える 3x3 のエリアで氷のダメージを与えた。びしょぬれになったクリーチャーは 8 ターン凍結する。 +3x3 のエリアに DamageDealt 氷ダメージを与える。水濡れ状態の敵は8ターンの間凍結状態になる。 You recite a frigid poem... -あなたは極寒の詩を唱えます... +極寒の詩を唱えた…… Choose a 3x3 area to freeze -フリーズする 3x3 エリアを選択 -Shatter -シャッター +3x3エリアを選択 + + Shatter -シャッター +感染性氷結 When a frozen target thaws or dies, deals DamageDealt ice damage to nearby targets and slow for 4 turns.. -凍結したターゲットが解凍または死亡すると、近くのターゲットにダメージを与える氷のダメージを与え、4 ターンの間減速します.. -Ignite -発火 +凍結状態の敵が解凍、または倒れると、近くのターゲットに DamageDealt 氷のダメージを与え、4 ターンの間減速状態にする。 + + Ignite -発火 +イグナイト Ignite a friendly target for Duration turns, dealing DamageDealt fire damage per turn to it and nearby targets. -味方のターゲットに持続時間の間点火し、そのターゲットと近くのターゲットにターンごとにダメージを与えた火のダメージを与えます。 +味方に Duration 発火状態を付与し、ターン毎に近くの敵に DamageDealt 火ダメージを与える。 You spin in a circle, inscribing flames with your feet! -足で炎を刻みながらぐるぐる回る! +地面につま先で炎のサークルを刻む! Choose a friendly target to ignite -点火する味方のターゲットを選択してください +点火する味方を選択 + + Conjure Chain -召喚チェーン +チェーン召喚 Magic Chain 魔法の鎖 +Magic Belt +マジックベルト Witch's Chain 魔女の鎖 Throws a chain that does DamageDealt chain damage. Targets with 50% or more binding take 50 crush damage and are slowed for 4 turns. -DamageDealt チェーン ダメージを与えるチェーンを投げます。拘束力が50%以上のターゲットは50の粉砕ダメージを受け、4ターンの間減速する。 +チェーンを投げ、 DamageDealt チェーンダメージを与える。拘束度が50%以上の敵は50の打撃ダメージを受け、4ターンの間減速状態になる。 You a hurl a strand of chain! -あなたはチェーンのストランドを投げつけます! -Choose aim direction -照準方向を選択 +鎖を召喚して投げつけた! + + +Enchant Rope +エンチャントロープ +Rope Enchantment +魔法のロープ +Spellbinding +緊縛の魔法 +Convert rope binding on a target into magical bindings, which are much more powerful. Deals a small amount of arcane damage. +対象を拘束している縄に魔法をかける。拘束がより強固になり、少量の秘術ダメージを与える。 +You whisper an enchanting tale of rope bondage... +緊縛の物語を囁いた…… +Choose targets to tighten the ropes of +縄で縛られている対象を選択 + + Conjure Ropes -ロープを召喚する +ロープ召喚 Animated Rope -アニメーションロープ -Launch 3 ropes that deal DamageDealt chain damage each and add 22 rope binding. -3 本のロープを発射し、それぞれが DamageDealt チェーン ダメージを与え、ロープ バインディングを 22 追加します。 +動くロープ +Launch 3 ropes that deal DamageDealt chain damage each and add 32 rope binding. +3本のロープを発射し、それぞれが DamageDealt チェーンダメージを与え、縄で32の拘束値を追加する。 You animate a bunch of ropes! -あなたはたくさんのロープを動かしています! -Choose aim direction -照準方向を選択 -Choose Class: -クラスを選択: -Spell Choice: -スペルの選択: -Choose Spells -欲しいものを選ぶ -Random Spells -ランダムスペル -Distraction Mode: -ディストラクションモード: -Aroused -興奮 -Fighter -ファイター -Peasant -農民 -Save Mode: -セーブモード: -Save Codes -セーブコード -Roguelike -ローグライク -Prison Strictness: -刑務所の厳しさ: -Strict -厳しく -Easy -簡単 -Allow Rear Plugs -アナルプラグ許容 -Allow Piercings -ピアス許容 +大量のロープを召喚した! + + +Ropestorm +ロープストーム +Launch 9 ropes that deal DamageDealt chain damage each and add 32 rope binding. Best in open spaces. +DamageDealt チェーン属性ダメージと32の縄拘束値を与える縄を9発発射する。広いところで使おう。 +You animate a sizeable quantity of ropes! +様々なロープを召喚した! + + Steel Torrent 鋼鉄の奔流 Steel Rain -鋼鉄の雨 +スチールレイン The plug hits you! (DamageDealt) -プラグが当たる! (与ダメージ) +プラグが当たった! (DamageDealt ダメージ) The plug directs itself between your legs! -プラグはあなたの足の間に向けられます! +プラグが挿入された! Fire 4 Steel Rain in quick succession toward the target point. Best in open spaces. -目標地点に向かって 4 つのスティール レインをすばやく連続して発射します。オープン スペースが最適です。 +目標地点に向かって、4つの鎖の雨を降らせる。広いところで使おう。 Fires a steel plug that deals DamageDealt piercing damage. Bound targets are Plugged, which increases Distraction over time. -DamageDealt 貫通ダメージを与える鋼のプラグを発射します。バウンドしたターゲットはプラグインされ、時間の経過とともに気晴らしが増加します。 +鋼鉄のプラグを発射し、 DamageDealt 刺突ダメージを与える。縛られている敵に命中した場合、挿入されてターン毎に興奮地が上昇する。 You raise your hand and a steel projectile appears! -手をあげると鋼鉄の弾丸が出現! +手をあげると鋼鉄の弾丸が現れた! You raise your hand and several steel projectiles appear! -手をあげると鋼鉄の弾丸が数発出現! -Choose aim direction -照準方向を選択 +手をあげると鋼鉄の弾丸が現れた! Choose target point -ターゲットポイントを選択 -Bola -彼女はそうだった +照準範囲を選択 + + + + Restraining Device 拘束装置 The thrown restraining device latches onto you as you struggle to get it off!!! -投げられた拘束装置は、あなたがそれを下ろすのに苦労しているときにあなたに引っ掛かります!!! +もがいていると、更に拘束装置が絡みついてくきた! The restraining device wraps many elastic cables around you!!! -拘束装置は、多くの弾性ケーブルをあなたの周りに巻き付けます!!! +拘束装置からケーブルが伸び、全身に絡みついてくきた! + + Shadowy Grip シャドーグリップ A dark hand latches onto you and holds you tight! -暗い手があなたに引っかかり、あなたをしっかりと抱きしめます! -Celestial Orb -天体のオーブ +影の手が全身に絡みつき、締め上げてくる! You are snugly wrapped in glowing ropes! -あなたは光るロープにぴったりと包まれています! +光るロープで縛られてしまった! Obsidian Orb 黒曜石のオーブ Metallic restraints encircle your body! -金属拘束具があなたの体を取り囲みます! -Rubberizing Bolt -ゴム引きボルト -Rubber Bolt -ラバーボルト +黒曜石の拘束具に取り付かれた! The latex spreads across your limbs and rubberizes, forming a tough barrier! -ラテックスが手足全体に広がり、ゴム状になり、強固なバリアを形成します! +ラバーが全身に広がり、行動を制限される! The latex spreads across your limbs and hardens, forming a stretchy layer! -ラテックスが手足全体に広がって固まり、伸縮性のある層を形成! -Bola -彼女はそうだった -Choose aim direction -照準方向を選択 +ラバーが全身に広がり、固まって層になった! +The latex clings to you and slows you down, making you vulnerable to the barrage! +ラバーが全身に纏わりつき、動きが遅くなるため遠距離武器に弱くなる。 +The latex expands rapidly and slows you down as it hardens into a stretchy layer! +ラバーが急速に膨らみ、関節の動きを阻害するため動きが鈍くなった! + + You throw a bola! -あなたはボラを投げます! +投げ縄を投げた! You ready a bola! -ボラの準備ができました! +投げ縄を投げる準備ができた! + + You are feeling drowsy... -あなたは眠気を感じています... +気絶しそう…… + + Shadow Strike シャドウストライク Shadow Heel -シャドーヒール +シャドウヒール + + Runic Ward ルーンワード Gives yourself or a creature a magic shield for 50 turns, granting +30 Magic Armor. -50 ターンの間、自分またはクリーチャーに魔法の盾を与え、+30 の魔法の鎧を与える。 +50ターンの間、自分またはクリーチャーに魔法の盾を与え30のマジックアーマーを与える。 You whisper a word of protection! -あなたは保護の言葉をささやきます! +守護の魔法を唱えた! Choose creature to shield -シールドするクリーチャーを選択 +シールドを付与する対象を選択 + + Afterimage 残像 Massively increases a creature's evasion for 5 attacks. Expires after 25 turns. -5回の攻撃でクリーチャーの回避を大幅に増加させます。 25ターンで消滅。 +25ターンの間、5回のみ回避力を大幅に上昇させる。 Your movements intensify! -あなたの動きは激化します! +残像を生成した! Choose creature to buff -バフするクリーチャーを選択 +対象を選択 + + Magical Sight マジカルサイト Highlight the location of interesting magical phenomena for 20 turns -興味深い魔法現象の場所を20ターン目立たせる +魔力の宿る場所をハイライトさせる。 You analyze the target! -あなたはターゲットを分析します! +ターゲットを分析した! Choose object to analyze 分析するオブジェクトを選択 + + Barrier Runes -バリアルーン +バリアのルーン Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns, but doesn't block movement. -DelayTime ターンの間、発射体からの BlockAmount ダメージをブロックするバリア モノリスの 1x1 フィールドを作成しますが、移動はブロックしません。 +1x1 の範囲にモノリスを召喚し、 DelayTime の間遠距離攻撃から BlockAmount 分のダメージを吸収させる。キャラクターの移動は阻害されない。 You raise a field of runes with a command word! -あなたは合言葉でルーンのフィールドを上げます! +魔法を唱えると、防護壁が展開した! Choose barrier location バリアの場所を選択 + + Electric Field -電界 +エレクトリックフィールド Creates a conductive area for Duration turns. Makes all entities in the area Conductive, forcing them to share 50% electric damage. -持続時間ターンの間、導電性エリアを作成します。エリア内のすべてのエンティティを導電性にし、50% の電気ダメージを分かち合うよう強制します。 +Duration ターンの間、導電性エリアを作成する。エリア内のすべての対象を導電性にし、電気ダメージを受けた際に50%のダメージを他の対象にも与える。 You energize the targeted area! -狙ったところを活性化! +狙ったところを活性化する Choose target 3x3 area -対象の 3x3 エリアを選択 -Witch's Electricity -魔女の電気 +3x3エリアを選択 + + +Firey Explosion +エクスプロージョン +Icey Explosion +アイスエクスプロージョン Witch's Electric Orb -魔女のエレクトリックオーブ +エレクトリックオーブ Witch's Electric Burst -ウィッチズエレクトリックバースト +エレクトリックバースト + + Electrify -電化 +エレクトリファイ A delayed shock that deals DamageDealt damage and stuns for Duration turns. -DamageDealt ダメージを与え、Duration ターンの間気絶させる遅延ショック。 +1ターン後に DamageDealt 電気ダメージを与え、命中時に Duration ターンの間気絶させる。 You charge up a burst of electricty! -あなたは電気の爆発を充電します! +電気の塊を召喚する! Choose target location -ターゲットの場所を選択 +位置を選択 + + The elemental channels the force of the storm! -エレメンタルは嵐の力を伝えます! +精霊の力が嵐を引き起こす! + + Fireball -火の玉 -A slow moving ball of flame that explodes for 120 fire damage to the target and DamageDealt damage to surrounding enemies. -動きの遅い炎の球が爆発し、ターゲットに 120 の火炎ダメージを与え、周囲の敵にダメージを与えます。 -You a hurl a fireball! -あなたは火の玉を投げます! -Choose aim direction -照準方向を選択 +ファイアボール +A slow moving ball of flame that explodes for DamageDealt fire damage in a wide area. +動きの遅い火の玉を発射し、広範囲に DamageDealt 火ダメージを与える。 +You a hurl a massive fireball! +大きな火球を投げつけた! + + +Fireblast +ファイアブラスト +A bolt of flame that explodes for DamageDealt fire damage in an area. +動きの遅い火の玉を発射し、範囲内に DamageDealt 火ダメージを与える。 +You a hurl a blast of flame! +強力な火球を投げつけた! + + Incinerate -焼却する +ファイアストーム A tornado of flame that does DamageDealt damage per turn for LifeTime turns. -LifeTime ターンの間、毎ターンダメージを与える炎の竜巻。 +LifeTime ターンの間、毎ターン DamageDealt 火ダメージを与える炎の竜巻を作り出す。 You conjure a gout of flame! -あなたは炎の痛風を引き起こします! +火炎の奔流を作り出した! Choose target AoE location -ターゲットの AoE 位置を選択 +位置を選択 + + Hailstorm -ひょう嵐 +ヘイルストーム A cloud of falling ice that does DamageDealt damage per turn for LifeTime turns and slows. -LifeTime ターンの間、ターンごとに DamageDealt ダメージを与え、速度を低下させる落下する氷の雲。 +LifeTime ターンの間、毎ターン DamageDealt 氷ダメージを与え、速度を低下させる落下する氷の雲を作り出す。 You conjure a flurry of frost! -あなたは霜の嵐を引き起こします! -Choose target AoE location -ターゲットの AoE 位置を選択 +霜の嵐を作り出した! + + Raincloud -雨雲 +レイン After 3 turns, rain falls, creating a 3x3 grid of water and dealing DamageDealt acid damage to enemies within. -3 ターン後、雨が降り、3x3 グリッドの水が生成され、その中にいる敵にダメージを与える酸ダメージを与えます。 +3ターン後、3x3の範囲に雨が降り、水が生成する。中にいる敵に DamageDealt 酸ダメージを与える。 You create a stormy cloud! -あなたは嵐の雲を作成します ! -Choose target AoE location -ターゲットの AoE 位置を選択 +雨雲を呼び出した! + + Field of Frost -霜の畑 +フロストフィールド Freezes a 5x5 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. -5x5 エリアを凍結します (氷はエンティティを遅くします)。エリア内の敵はライフタイム ターンの間、ターンごとに与ダメージを受ける。 -You stomp your foot and call forth the storm! -あなたは足を踏み鳴らし、嵐を呼びます! +5x5の範囲を凍結させる。エリア内の敵は LifeTime ターンの間、 DamageDealt ダメージを受け、減速効果を付与される。 +You stomp your foot and call forth the blizzard! +足を踏み鳴らし、吹雪を召喚した! Choose target AoE location (5x5) -ターゲットの AoE 位置を選択 (5x5) +位置を選択(5x5) +Zone of Frost +フロストゾーン +Freezes a 3x3 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. +3x3の範囲を凍結させる。エリア内の敵は LifeTime ターンの間、 DamageDealt ダメージを受け、減速効果を付与される。 +You sweep your foot and call forth the storm! +足で地を掃き、局所的な吹雪を召喚した! +Choose target AoE location (3x3) +位置を選択(3x3) +Cold Feet +コールドフット +Freezes a single tile (ice slows entities). Any enemy standing on the tile takes take DamageDealt damage per turn for LifeTime turns. +1マス凍結させる。凍結させたマスに存在する敵は、 LifeTime ターンの間 DamageDealt ダメージを受け、減速効果を付与される。 +You tap your foot and call forth the frost! +足で地面を踏み、霜を降らせた! +Choose target location (1x1) +位置を選択(1x1) + + Healing Light ヒーリングライト Channel to heal 15 hitpoints per turn to summoned allies within a 5x5 area. -チャネルを使用して、5x5 エリア内の召喚された味方をターンごとに 15 ヒットポイント回復します。 +5x5 エリア内の味方を、毎ターン15ポイント回復させる。 You conjure a healing light! -あなたは癒しの光を呼び起こします! -Choose target AoE location (5x5) -ターゲットの AoE 位置を選択 (5x5) +癒やしの光を呼び起こした! + + Crackle -クラックル -Stun Blast -スタンブラスト +ライトニング Storm Bolt ストームボルト A bolt of lightning that does DamageDealt electric damage to enemies in a 4-range line and briefly stuns. -4 範囲内の敵にダメージを与える電撃ダメージを与え、短時間スタンさせる稲妻。 +直線4マスの敵に DamageDealt 電気ダメージを与え、スタン状態を付与する。 Lightning erupts from your fingertips! -指先から稲妻が噴き出す! +指先から稲妻がほとばしる! Choose line direction (max range 4 tiles) -線の方向を選択 (最大範囲 4 タイル) +方向を選択(4マス) + + Tremor -身震い -Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. -対象エリア内の脆弱で鈍足な敵を持続ターンの間作り、DamageDealt クラッシュ ダメージを与えます。 +クエイク +Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. Creates a slowing field after. +Duration ターンの間、敵に弱体化と減速状態を付与し、 DamageDealt 打撃ダメージを与えるエリアを生成する。その後、減速エリアを生成する。 You call forth the rage of the earth. -あなたは大地の怒りを呼び起こします。 +大地の怒りを呼び覚ました! Choose AoE -AoE を選択 +範囲を選択 + + Earthquake -地震 +アースクエイク Channel for 5 turns to send 2 tremors per turn in target area. -5 ターンの間チャネルして、ターゲット エリアに 1 ターンあたり 2 つの震えを送ります。 +5ターンの間、1ターン毎に2箇所に地震を発生させるエリアを生成する。 You channel the fury of the earth!!! -あなたは地球の怒りを導きます!!! -Choose AoE -AoE を選択 -Shock Orb -ショックオーブ +大地の憤怒を召喚した! + + Shock Orb ショックオーブ A slow-moving orb that deals DamageDealt electric damage to an adjacent enemy each turn. -毎ターン隣接する敵にダメージを与える電気ダメージを与える動きの遅いオーブ。 +毎ターン隣接する敵に DamageDealt 電気ダメージを与える動きの遅いオーブを発射する。 You hurl a charged orb! -帯電したオーブを投げます! +電を纏うオーブを投げた! Choose aim direction (max range 4 tiles) -照準方向を選択 (最大範囲 4 タイル) -Lightning Rune -雷のルーン +方向を選択(4マス) + + Lightning Rune 雷のルーン -A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 5 turns to setup. -ダメージを与える電気ダメージを与え、4 ターンの間気絶させるトラップ。設置まで5ターンかかります。 +A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 3 turns to setup. 200% crit multiplier. +5ターンかけて DamageDealt 電気ダメージを与え、4ターンの間スタン状態を付与するトラップを作り出す。この攻撃の会心ダメージ倍率は200%。 You conjure a charged trap! -あなたは帯電したトラップを呼び出します! +雷の罠を仕掛けた! Choose location for trap -トラップの場所を選択 -Freeze Rune -フリーズルーン +設置場所を選択 + + Freeze Rune -フリーズルーン -A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 5 turns to setup. -DamageDealt 氷ダメージを与え、30 ターン凍結するトラップ。設置まで5ターンかかります。 +氷のルーン +A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 3 turns to setup. 200% crit multiplier. +5ターンかけて DamageDealt 電気ダメージを与え、30ターンの間凍結状態を付与するトラップを作り出す。この攻撃の会心ダメージ倍率は200%。 You conjure an icy trap! -あなたは氷の罠を呼び起こします! -Choose location for trap -トラップの場所を選択 -Flame Rune -炎のルーン +氷の罠を仕掛けた! + + Flame Rune 炎のルーン -A trap that deals DamageDealt fire damage in an area. Takes 5 turns to setup. -範囲内にダメージを与える火のダメージを与えるトラップ。設置まで5ターンかかります。 +A trap that deals DamageDealt fire damage in an area. Takes 3 turns to setup. 200% crit multiplier. +5ターンかけて範囲内に DamageDealt 火ダメージを与えるトラップを作り出す。この攻撃の会心ダメージ倍率は200%。 You conjure an incendiary trap! -あなたは焼夷トラップを呼び出します! -Choose location for trap -トラップの場所を選択 -Static Sphere -静止球 -Static Sphere -静止球 +炎の罠を仕掛けた! + + Conjure a sphere for Duration turns that makes nearby entities Conductive and each turn deals DamageDealt electric damage to one of them. -近くのエンティティを導電性にする球体を持続ターンの間召喚し、各ターンはそれらの1つにDamageDealt電気ダメージを与えます。 +近くのエンティティを導電性にする球体を Duration の間召喚する。ターン毎に、範囲内のエンティティに DamageDealt 電気ダメージを与える。 You summon a grey, featureless sphere adorned by static! -静電気で飾られた、特徴のない灰色の球体を召喚します! -You summon a grey, featureless sphere adorned by static! -静電気で飾られた、特徴のない灰色の球体を召喚します! +静電気を放つ球体を召喚した! Choose sphere location -球の位置を選択 +設置場所を選択 + + Fissure -亀裂 +フォッシル Lava Fissure -溶岩クラック +ラヴァフォッシル A great fissure erupts from the earth, dealing 70 fire damage to enemies in a 4-range line and dealing 15 damage/turn for 6 turns. -大地から大きな裂け目が噴き出し、4射程内の敵に70の火属性ダメージを与え、6ターンの間、毎ターン15ダメージを与える。 +大地から溶岩の吹き出す亀裂を作り出す。4マスの敵に70の火ダメージを与え、その後ターン毎に15ダメージを与える地面を6ターン生成する。 You stomp the ground and the earth opens its gaping maw! -あなたが地面を踏むと、地球は大きな口を開きます! -Choose line direction (max range 4 tiles) -線の方向を選択 (最大範囲 4 タイル) +大地に足を踏み降ろし、溶岩の溢れる亀裂を走らせた! + + Lightning Bolt -稲妻 +ライトニングボルト A bolt of lightning that does DamageDealt damage to enemies in an infinite line and briefly stuns. -無限の列にいる敵にダメージを与え、短時間スタンさせる稲妻。 +無限の射程を持つ稲妻を放ち、範囲内の敵に DamageDealt 電気ダメージを与える。 You unleash a bolt of lightning! -あなたは稲妻を放ちます! +神速の稲妻を開放した! Choose line direction -線の方向を選択 -Corona -コロナ +方向を選択 + + Corona コロナ Binding Light バインディングライト -Binding Light -バインディングライト Chaos Beam カオスビーム Mystic Beam ミスティックビーム -A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt fire damage to the first target hit. -2 ターンの間チャネリングする光線 (短時間気絶) の後、最初に命中したターゲットに即座に DamageDealt 火ダメージを与えます。 +Mystic Barrage +ミスティックバラージュ +A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt holy damage to the first target hit. Blinds for 12 turns. 150% crit multiplier. +2ターンの間チャージし、命中したターゲットに DamageDealt 火ダメージを与えるビームを放つ。命中した敵は12ターンの間盲目状態になる。この攻撃の会心ダメージ倍率は150%。 You charge a powerful beam attack!!! -強力なビーム攻撃をチャージ!!! -Choose line direction -線の方向を選択 +敵を償却するレーザーを放つ! + + Icicles -つらら +アイシクル Icicle -つらら +アイシクル Channel 3 turns to fire 3 icicles that deal DamageDealt ice damage and slow for 4 turns, freezing slowed/drenched targets for 3 turns. -チャンネル 3 ターンで 3 つのつららを発射し、ダメージを与えた氷のダメージを与え、4 ターンの間減速し、減速/びしょぬれになったターゲットを 3 ターン凍結します。 +3ターンの間チャージし、命中したターゲットに DamageDealt 氷ダメージを与えるつららを3発放つ。命中した敵は4ターンの間減速し、水濡れまたは既に減速状態である場合、3ターンの間凍結する。 You raise a hand and icicles fly forward! -手をあげるとつららが飛んでいきます! -Choose line direction -線の方向を選択 +手を振りかざし、つららを飛ばす! + + Volcanism -火山活動 +ボルケイノ An area of summoned rocks becomes explosive. Deal fire damage to them to ignite, dealing DamageDealt fire damage to adjacent targets. -召喚された岩の範囲が爆発する。それらに火のダメージを与えて発火させ、隣接するターゲットにダメージを与えた火のダメージを与える。 +地中から爆発する岩石を召喚する。範囲内の敵を発火させ、周囲の敵に DamageDealt 火ダメージを与える。 You stomp your foot and magma wells up beneath the ground! -足を踏み鳴らすとマグマが地中から湧き出る! +足を踏み鳴らし、地中から溶岩を湧き上がらせる! Choose monoliths to enchant エンチャントするモノリスを選択 + + Coalesce 合体 Gathers slime and slimed enemies into a central point. Deals DamageDealt glue damage per square of slime and Encases slimed enemies. Costs half mana if there is only slime. -スライムとスライム化した敵を中心に集めます。スライム 1 マスあたりに接着剤ダメージを与え、スライム化した敵を包み込みます。スライムだけの場合、マナ コストは半分になります。 +スライムとスライム化した敵を中心に集める。範囲内の敵に DamageDealt ねばねばダメージを与え、スライムで包み込む。スライムだけの場合、マナ コストは半分になる。 You command the slime to draw enemies in! -スライムに命じて敵を引き寄せろ! +周囲のスライムに集合を命じた! Choose area containing slime スライムがいるエリアを選択 + + Animate Slime -動くスライム +スライム生成 Summons up to 3 slimes on slime tiles in an AoE. The slimes are friendly to you. -範囲内のスライム タイルに最大 3 つのスライムを召喚します。スライムはあなたに友好的です。 +指定した範囲の、スライムが付着する床に味方のスライムを生成する。最大3体まで同時に生成可能。 You concentrate magical energy into the slime, giving it a will of it's own... -スライムに魔力を集中させ、意思を持たせる…… -Choose area containing slime -スライムがいるエリアを選択 +地面のスライムに魔力を流す…… + + Animate Large Slime -大きなスライムを動かす +巨大スライム生成 Target an area with at least 3 slime tiles. Summons a large slime that is friendly to you. -スライムタイルが3つ以上あるエリアを対象にすると、味方の大型スライムが召喚されます。 -You concentrate magical energy into the slime, giving it a will of it's own... -スライムに魔力を集中させ、意思を持たせる…… -Choose area containing slime -スライムがいるエリアを選択 +指定した範囲の、スライムが付着する床に味方の巨大スライムを生成する。生成には1体につき3枚のスライムが付着した床が必要。 + + Latex Puppet -ラテックスパペット +ラテックス・パペット Target an area containing helpless encased enemies. Transforms up to 3 of them into latex dolls that serve you for a while. -無力な閉じ込められた敵がいるエリアをターゲットにします。そのうち最大 3 体をラテックス人形に変え、しばらくの間あなたに仕えます。 +指定した範囲の、無力化された敵を味方のラテックス人形にする。最大3体まで同時に生成可能。 You concentrate magical energy into your victim's bindings, forcing them to move... -あなたは犠牲者の拘束具に魔法のエネルギーを集中させ、それらを強制的に動かします... +敵の拘束具に魔力を流し、強制的に動かす…… Choose area containing encased helpless enemies. -無力な敵が閉じ込められているエリアを選択してください。 +無力化された敵のいるエリアを選択 + + Solidify -固める +ソリッド Solidifies slime in the area into Latex. Latex adheres to enemies and slowly binds them, escasing them when they are fully bound. -エリア内のスライムをラテックスに固めます。ラテックスは敵に付着してゆっくりと拘束し、完全に拘束されると脱出します。 +エリア内のスライムを固めてラバーにし、範囲内の敵を完全に拘束するまで取り込む。 You inscribe a transmutation circle on the floor. -あなたは床に変成円を刻みます。 -Choose area containing slime -スライムがいるエリアを選択 +床に変化のサークルを刻む。 +LiquidMetal +リキッドメタル +Solidifies Latex in the area into Liquid Metal. Liquid Metal is slippery, but also adheres to enemies and slowly binds them in metallic bonds. Enemies encased in liquid metal are more susceptible to knockback due to the slippery nature. +周囲のゴムを固めて液体金属にする。液体金属は滑りやすいが、敵に徐々に付着する。液体金属に包まれた敵は滑りやすくなるため、ノックバックしやすくなる。 +Choose area containing Latex +ゴムがある床を選択 + + Slime Repulsion スライム反発 -Gain +50 glue resist. -グルーレジスト+50を得る。 +Gain +50 glue resist. (Having 45 or more Glue Resist negates many negative effects from slime) +ねばねば属性への耐性+50。(ねばねば属性への耐性が45以上で様々な効果を無効化できる) + + Spread -広める +スプレッド Slime in the target area expands by 1 unit in the four cardinal directions. Refreshes duration to 12-20 turns. -対象エリア内のスライムが上下左右に1ユニットずつ拡大する。持続時間が12~20ターンに更新される。 +エリア内のスライムが上下左右に1マスずつ広がる。持続時間が12~20ターンに更新される。 The slime spreads! -スライムが広がる! -Choose area containing slime -スライムがいるエリアを選択 +スライムが広がった! + + Wall of Slime スライムの壁 Unlocks horizontal and vertical slime walls that traps enemies who try to pass through. -通過しようとする敵を閉じ込める水平および垂直のスライム壁のロックを解除します。 +スライムの壁を解除する。 + + Wall of Slime (Vert) -スライムの壁(ヴェール) +スライムの壁(縦) Creates a vertical wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. -20ターンの間、スライムの垂直壁を生成します。通り抜けた敵は壁に引っかかって痩せます。 +20ターン継続する、縦向きのスライムの壁を生成する。通り抜けようとすると、スライムが付着する。 You tap your foot and a wall of slime slowly raises out of the ground. -足を軽くたたくと、スライムの壁がゆっくりと地面から浮き上がります。 +足を軽く踏み鳴らすと、地面からスライムの壁が浮き上がった。 Choose vertical wall origin (5 tiles high) -垂直壁の起点を選択 (高さ 5 タイル) +壁の起点を選択 (縦5マス) + + Wall of Slime (Horiz) -スライムの壁(ホライズ) +スライムの壁(横) Creates a horizontal wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. -20ターンの間、スライムの横壁を作る。通り抜けた敵は壁に引っかかって痩せます。 -You tap your foot and a wall of slime slowly raises out of the ground. -足を軽くたたくと、スライムの壁がゆっくりと地面から浮き上がります。 +20ターン継続する、横向きのスライムの壁を生成する。通り抜けようとすると、スライムが付着する。 Choose horizontal wall origin (5 tiles wide) -水平な壁の起点を選択 (幅 5 タイル) +壁の起点を選択 (横5マス) + + Wall of Latex ラテックスの壁 Unlocks horizontal and vertical latex walls that encase enemies that walk through. -通り抜ける敵を包み込む水平および垂直のラテックス壁のロックを解除します。 +ラテックスの壁を解除する。 + + Wall of Latex (Vert) -ラテックスの壁 (Vert) -Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased, take DamageDealt glue damage if not encased, and blinded. -ラテックスの垂直壁を20ターン生成します。通り抜けた敵は包囲され、包囲されていない場合はDamageDealt接着剤のダメージを受け、盲目になります。 +ラテックスの壁 (縦) +Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. +20ターン継続する、縦向きのゴムの壁を生成する。通り抜けようとするとゴムに包まれ、50ねばねば属性ダメージを受け、盲目状態になる。 You tap your foot and a wall of latex stretches out across the corridor. -足を軽くたたくと、ラテックスの壁が廊下を横切って伸びています。 -Choose vertical wall origin (5 tiles high) -垂直壁の起点を選択 (高さ 5 タイル) +足を軽く踏み鳴らすと、ゴムの壁が伸びてきた。 + + Wall of Latex (Horiz) -ラテックスの壁 (ホライズ) -Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased, take DamageDealt glue damage if not encased, and blinded. -20ターンの間、ラテックスの水平壁を作成します。通り抜けた敵は包囲され、包囲されていない場合はDamageDealt接着剤のダメージを受け、盲目になります。 -You tap your foot and a wall of latex stretches out across the corridor. -足を軽くたたくと、ラテックスの壁が廊下を横切って伸びています。 -Choose horizontal wall origin (5 tiles wide) -水平な壁の起点を選択 (幅 5 タイル) +ラテックスの壁 (横) +Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. +20ターン継続する、横向きのゴムの壁を生成する。通り抜けようとするとゴムに包まれ、50ねばねば属性ダメージを受け、盲目状態になる。 + + Earthshape アースシェイプ Unlocks 3 spells that allow creating mounds, rings, or lines of 50hp, 25 armor rocks. -マウンド、リング、または 50hp の 25 アーマー ロックのラインを作成できる 3 つの呪文のロックを解除します。 +範囲内に、ランダムに地面を隆起させて岩石を生成し、地面をひび割れ状態にする。岩石は50の体力と25のアーマー値を持つ。 Earthen monoliths rise from the ground! -土のモノリスが地面から立ち上がる! +地面を隆起させる! An earthen monolith rises from the ground! -土のモノリスが地面から立ち上がる! +地面を隆起させる! + + Earthshape (Ring) -アースシェイプ (リング) +アースシェイプ (輪) Create a large ring of Earthen Monoliths. They have 50 hitpoints and 25 armor. -Earthen Monoliths の大きなリングを作成します。彼らは 50 のヒットポイントと 25 の鎧を持っています。 +リング状に地面を隆起させて岩石を生成する。岩石は50の体力と25のアーマー値を持つ。 You stomp your foot and monoliths emerge in a ring around you! -足を踏み鳴らすとモノリスがリング状に出現! +足を踏み鳴らし、地面を隆起させる! Choose ring origin -リング元を選択 +範囲を選択 + + Earthshape (Mound) -土形(マウンド) +アースシェイプ(四角) Create a 3x3 field of Earthen Monoliths. They have 50 hitpoints and 25 armor. -Earthen Monoliths の 3x3 フィールドを作成します。彼らは 50 のヒットポイントと 25 の鎧を持っています。 +3x3の範囲を隆起させ、岩石を生成する。岩石は50の体力と25のアーマー値を持つ。 You stomp your foot and monoliths emerge from the ground! -足を踏み鳴らすと、モノリスが地面から出現します。 +足を踏み鳴らし、地面を隆起させる! Choose mound origin -マウンドの起点を選択 +起点を選択 + + Earthshape (Line) -地球の形(線) +アースシェイプ(線) Create a 4-tile line of Earthen Monoliths. They have 50 hitpoints and 25 armor. -Earthen Monoliths の 4 タイル ラインを作成します。彼らは 50 のヒットポイントと 25 の鎧を持っています。 -You stomp your foot and monoliths emerge from the ground! -足を踏み鳴らすと、モノリスが地面から出現します。 -Choose line direction -線の方向を選択 -Rock -石 +直線4マスの地面を隆起させ、岩石を生成する。岩石は50の体力と25のアーマー値を持つ。 + + +Earthshape (Arc) +アースシェイプ(弧) +Create a 5-wide arc of Earthen Monoliths. They have 50 hitpoints and 25 armor. +5マス分の幅を持つ弧の形に地面を隆起させ、岩石を生成する。岩石は50の体力と25のアーマー値を持つ。 + + Rock -石 +ロック Channel 1 turn to launch a rock that deals DamageDealt crush damage and slows for 4 turns. Blocks up to 80 damage. -チャンネル 1 ターンで、DamageDealt のクラッシュ ダメージを与え、4 ターンの間減速する岩を発射します。最大 80 のダメージをブロックします。 +1ターンかけて岩を蹴り、命中した敵に DamageDealt 打撃ダメージを与え、4ターンの減速状態を付与する。岩は80ポイントまでのダメージをブロックする。 You raise a stone from the ground and kick it forward! -地面から石を持ち上げて、前方に蹴ります。 -Choose line direction -線の方向を選択 +地面から岩を生成し、思い切り蹴り飛ばす! + + Earth Kick アースキック Stone Projectile -石の投射物 +石 Kick a summoned rock to turn it into a projectile. Deals DamageDealt crush damage in a 3x3 area and slows for 4 turns. -召喚された岩を蹴って発射物に変えます。 3x3 の範囲にダメージを与えるクラッシュ ダメージを与え、4 ターンの間スロウ効果を与えます。 +生成された岩を蹴り飛ばす。 3x3の範囲に DamageDealt 打撃ダメージを与え、4ターンの減速状態を付与する。 With a solid kick, you launch one of your monoliths forward! -しっかりとしたキックで、モノリスの 1 つを前方に発射します! +岩を力いっぱい蹴り飛ばした! Choose a monolith to kick -キックするモノリスを選択してください -Boulder -ボルダー +岩を選択 + + Boulder ボルダー Channel 1 turn to launch a huge slow rock that deals DamageDealt crush damage and slows for 8 turns. AoE, collides with summoned rocks. Blocks up to 200 damage. -チャンネル 1 ターンで巨大なスロー ロックを発射し、DamageDealt クラッシュ ダメージを与え、8 ターンの間スローします。AoE、召喚されたロックと衝突します。最大 200 のダメージをブロックします。 +1ターンかけて巨岩を蹴り飛ばし、 DamageDealt 打撃ダメージを与え、8ターンの減速状態を付与する。他の召喚物と衝突し、200ポイントまでのダメージをブロックする。 You raise a massive boulder from the ground and kick it forward! -地面から巨大な岩を持ち上げて前方に蹴り飛ばす! -Choose line direction -線の方向を選択 +地面から巨岩を生成し、全力で蹴り飛ばす! + + Stamina Up I -スタミナアップⅠ +スタミナアップ1 Increases maximum SP by 12 最大SPが12増加する + + Iron Will 鉄の意志 While you have 100 current willpower or more, regain an additional 4 stamina per turn. -現在の意志力が100以上ある間、ターンごとに追加でスタミナを4回復します。 -Steadfast Guard -不動のガード -For each 10 current willpower you have over 50, gain +5 Restraint Block. -現在の意志力が 50 を超えている 10 ごとに、拘束ブロック +5 を得る。 +現在の気力が100以上の時、毎ターン4ポイントのスタミナを追加で回復する。 +Defiance +反抗 +For each 10 current willpower you have over 50, gain +5 Bondage Resist. +現在の気力が50以上の時、10を超えるごとに5ポイントの拘束耐性を得る。 Willful Struggle -故意の闘争 -For each 10 current willpower you have over 50, gain +1% struggle effectiveness. -意志力が 50 を超えている現在の意志力が 10 になるごとに、+1% の闘争効果が得られます。 +決意の抵抗 +For each 10 current willpower you have over 50, gain +1% struggle power. +現在の気力が50以上の時、10を超えるごとに「もがく」の効果が 1%上昇する。 Your willpower provides you with additional strength! (+AMOUNT%) -あなたの意志の力はあなたにさらなる強さをもたらします! (+AMOUNT%) +強い意志を持ってもがいた!! (+AMOUNT%) Athlete アスリート Sprinting costs 40% less stamina. -全力疾走のスタミナ消費が 40% 減少します。 +走りのスタミナ消費が40%低下する。 Sneaky -スニーカー +隠密 You are harder to see when waiting. -待っていると見えにくくなります。 +待機中、見つかりにくくなる。 +Vault +通り抜け +You can sprint under flying enemies and through vulnerable, slowed, or disabled enemies. Does not work on immobile enemies such as doors and turrets. +走ることで、飛行、弱体化、減速状態、行動不能状態の敵をすり抜けることができる。ドアやタレットのような動かない敵はすり抜けられない。 +Improved Vault +吹き抜ける風 +You can dash through enemies that aren't immobile. +動かない敵もすり抜けられるようになる。 Dodge I -ドッジⅠ +回避強化 I +10 Evasion -回避+10 +回避力が10増加する Dodge II -ダッジ II +回避強化 II +15 Evasion (25 total) -+15 回避 (合計 25) +回避力が15増加する(合計25) Dodge III -ダッジ III +回避強化 III +25 Evasion (50 total) -+25回避(合計50) -Critical Strike -クリティカルストライク -Excess accuracy (over 100%) is converted to bonus physical damage percentage at 50% efficiency. -超過命中率(100%以上)は50%の効率でボーナス物理ダメージ率に変換される。 +回避力が25増加する(合計50) + + +Strength Up +腕力強化 ++20% Physical Damage +物理ダメージ+20% + + +Deadly Aim +死の標的 +Increases crit multiplier by a % equal to your Battle Rhythm. +戦闘のリズム分、会心ダメージ倍率が上昇する。 + + +Accuracy I +命中強化 I ++10 Accuracy +命中率+10 +Accuracy II +命中強化 II ++15 Accuracy (25 total) +命中率+15(合計25) +Accuracy III +命中強化 III ++25 Accuracy (50 total) +命中率+25(合計50) + + +Martial Arts I +格闘術 I +Unarmed strikes gain 15% accuracy and -10% stamina cost. +素手での攻撃が強化される。命中率+15%、スタミナ消費量-10% +Martial Arts II +格闘術 II +Unarmed strikes gain 20% accuracy (35% total) and -15% stamina cost (25% total). +素手での攻撃が強化される。命中率+20%(合計35%)、スタミナ消費量-15%(合計25%) +Martial Arts III +格闘術 III +Unarmed strikes gain 25% accuracy (60% total) and -25% stamina cost (50% total). +素手での攻撃が強化される。命中率+25%(合計60%)、スタミナ消費量-50%(合計50%) + + +Precise Critical +精確無比 +When landing a critical strike with physical damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. +物理ダメージで会心の一撃が発動した時、100%を超えた命中率の50%が会心ダメージ倍率に変換される。 +Precise Magic +精密魔法 +When landing a critical strike with magic damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. +魔法ダメージで会心の一撃が発動した時、100%を超えた命中率の50%が会心ダメージ倍率に変換される。 +Magical Overload +過負荷魔法 +When landing a critical strike with magic damage, crit multiplier is increased by 25% of your current DP. +魔法ダメージで会心の一撃が発動した時、現在DPの25%が会心ダメージ倍率に変換される。 + + Brute Force -強引な +強力 When enabled, your attacks deal 10% of your willpower as additional crush damage but cost 10 more stamina. -有効にすると、攻撃は意志力の 10% を追加のクラッシュ ダメージとして与えますが、消費するスタミナは 10 増加します。 +有効時、攻撃した際に現在の気力の10%分の打撃属性ダメージを追加で与える。追加でスタミナを10消費する。 + + One With Slime -ワンウィズスライム +体の一部 While standing on slime/latex, you can cast rubber spells without components. -スライム/ラテックスの上に立っている間、コンポーネントなしでラバー呪文を唱えることができます。 +スライムかラテックスの上に立っている時、ラバー系のスペルに動作を必要としない。 + + Convincing Disguise -説得力のある変装 -While completely covered in slime and not moving, your visibility is reduced considerably. -スライムにまみれて動かない間は視界がかなり悪くなります。 +納得の見た目 +While standing still on slime, or fully bound with at least one latex item, you are harder to notice. Each latex restraint you are wearing increases this amount. Can be toggled off by clicking the buff icon. +スライムの上で待機中、もしくはラテックス製の拘束具を身に着けている間は、気づかれにくくなる。身につけているラテックス製の拘束具が増えるごとに、効果が増す。バフアイコンをクリックすることで切替可能。 + + Magical Implements 魔法の道具 -While holding a magical weapon like a staff or enchanted knife, your mana costs are reduced by 20%. -杖やエンチャントされたナイフなどの魔法の武器を持っている間、マナ コストが 20% 減少します。 +While holding a magical weapon like a staff or magic knife, your mana costs are reduced by 20%. +杖や魔法の武器を持っている時、マナコストが20%減少する。 Mage Circuits -魔道士回路 -Increases the size of the passive mana pool by +100. -パッシブマナプールのサイズを+100増やします。 +魔法回路 +Increases the size of the passive mana pool by +400. +マナプールが400増加する Archmage アークメイジ Upcasted spells cost 25% less mana. -アップキャストされた呪文のマナ コストが 25% 減少します。 +強化した魔法のマナコストを25%低減する。 + + Temperature Play -温度遊び +氷炎の支配者 Fire and Ice damage do 30% more damage to fully bound enemies. -火と氷のダメージは、完全にバインドされた敵に 30% 追加のダメージを与えます。 +完全に拘束された敵を攻撃する際、火属性と氷属性の攻撃が30%強力になる。 Fire Hazard -火災の危険 +延焼 Fire damage ignites enemies for 5 damage per turn for 6 turns. -火のダメージは、6 ターンの間、ターンごとに 5 ダメージで敵を点火します。 +火属性ダメージを与えた際、6ターンの間着火させる。6ターン継続し、ターン毎に5ポイントのダメージを与える。 Frozen Prison -冷凍刑務所 -Freezing an enemy applies 10% of the enemy's max hp in binding, plus 10 per turn of freeze. -敵を凍結すると、敵の最大 HP の 10% がバインドに適用され、加えて凍結のターンごとに 10 が適用されます。 +氷牢 +Freezing an enemy applies 10 binding per turn of freeze added, plus brings the enemy to a minimum of 20% binding. +敵を凍結させた際、1ターンにつき10の拘束値を与え、更に敵の最低拘束値を20%にする。 Lightning Rod 避雷針 After casting an Air or Storm spell that costs mana, become Conductive and gain 300% electric resist for 3 turns. -マナを消費するエアまたはストームの呪文を唱えた後、伝導性になり、3 ターンの間 300% の電気抵抗を獲得します。 -Frustration -欲求不満 +マナを消費して風、または嵐の魔法を唱えた際、伝導性になり、3ターンの間電気属性への抵抗が300%上昇する。 When enabled, enemies in chastity become angry Frustrated Pets when becoming helpless. -有効にすると、純潔の敵は無力になると怒り狂ったペットになります。 +有効時、貞操帯を装備した敵が完全拘束された時に怒るようになる。 + + Mana Up I -マナアップⅠ +マナアップ I Increases maximum MP by 12 最大MPが12増加する Mana Up II -パワーアップⅡ -Increases maximum MP by 12 -最大MPが12増加する +マナアップ II Mana Up III -パワーアップⅢ -Increases maximum MP by 12 -最大MPが12増加する +マナアップ III + + Strong Mind I -ストロングマインドⅠ +ストロングマインド I Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -気晴らしの最大値をベースの 33% 増加させ、ターンごとに気晴らしの再生を -0.1 ずつ増加させます +最大興奮値が33%上昇し、ターン経過時の興奮値低下量が0.1増える。 Strong Mind II -ストロングマインドⅡ -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -気晴らしの最大値をベースの 33% 増加させ、ターンごとに気晴らしの再生を -0.1 ずつ増加させます +ストロングマインド II Strong Mind III -ストロングマインドⅢ -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -気晴らしの最大値をベースの 33% 増加させ、ターンごとに気晴らしの再生を -0.1 ずつ増加させます +ストロングマインド III + + Expert Wizard -エキスパート ウィザード +熟練の魔術師 Gives you an additional spell choice slot -追加の呪文選択スロットを提供します +追加の魔法スロットを得る Master Wizard -マスターウィザード -Gives you an additional spell choice slot -追加の呪文選択スロットを提供します +達人魔術師 Legendary Wizard -伝説の魔法使い -Gives you an additional spell choice slot -追加の呪文選択スロットを提供します +伝説の魔術師 + + More Summons -その他の召喚 -Increases the permanent summon cap by +1 (from 2 to 3) -永続召喚の上限を+1増やします(2から3へ) +熟練召喚士 +Increases the permanent summon cap by +2 (from 2 to 4) +追加の永続召喚スロットを2得る(4体まで) Many Summons -多くの召喚 -Increases the permanent summon cap by +1 (from 3 to 4) -恒久召喚の上限を+1増やします(3から4へ) -Bomb -爆弾 -Channel for 1 turn for a bomb that does DamageDealt fire damage in an area after DelayTime turns. -1 ターンの間、DelayTime ターン後に、あるエリアでダメージを与えた火のダメージを与える爆弾にチャネルします。 +達人召喚士 +Increases the permanent summon cap by +2 (from 4 to 6) +追加の永続召喚スロットをさらに2得る(6体まで) + + +Summon Bomb +爆弾召喚 +Channel for 1 turn for a bomb that does DamageDealt blast damage in an area after DelayTime turns. +1ターンかけて爆弾を投擲する。爆弾は DelayTime 後に爆発し、範囲内に DamageDealt 衝撃ダメージを与える。 Fire in the hole! -穴に火をつけろ! -Choose target AoE location -ターゲットの AoE 位置を選択 -Rope Snare -ロープスネア -An invisible trap on the ground that stuns anyone who walks on it for Duration turns and applies 150 points of binding. -地面に設置された目に見えない罠で、その上を歩くと Duration ターンの間気絶し、150 ポイントのバインドを適用します。 -You set an invisible trap! -見えない罠を仕掛けた! -Select where to put the trap (it will be invisible) -トラップを置く場所を選択します (見えなくなります) +グレネード! + + +An AoE trap on the ground that deals 25 chain damage, roots for 8 turns, and applies 80 points of binding. Takes 3 turns to setup. 200% crit multiplier. +3ターンかけて縄のルーンを設置する。ルーン発動時、範囲内の敵に25チェーンダメージと拘束値80を与え、8ターンの間地面に張り付ける。この攻撃の会心ダメージ倍率は200%。 +You conjure a rope trap! +縄の罠を召喚した! + + Rope Burst ロープバースト -An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 40 points of rope binding. Snares for Duration turns. -ロープの爆発は、3x3 の範囲内でダメージを与えるチェーン ダメージを与え、40 ポイントのロープ バインドを適用します。期間ターンのスネア。 +An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 50 points of rope binding. Snares for Duration turns. +Duration ターン後に、3x3 の範囲に DamageDealt チェーンダメージを与え、ロープで50ポイントの拘束値を追加する縄の爆発を起こす。 You call forth ropes from the abyss! -あなたは深淵からロープを呼び寄せます! +深淵からロープを召喚した! Select center of a a 3x3 AoE -3x3 AoE の中心を選択 +位置を選択 + + Leather Package レザーパッケージ After conjuring a leather restraint, you can conjure up to three more without advancing time. -革の拘束具を召喚した後、時間を進めずにさらに3つまで召喚できます。 -Conjure Gag -ギャグを呼び出す -Conjured Gag -召喚ギャグ -The gag forces itself into your mouth and buckles tightly! -ギャグが口の中に押し込まれ、しっかりと締められます。 -The gag hits you! (DamageDealt) -ギャグが当たる! (与ダメージ) -Summons a gag which deals DamageDealt chain damage and silences for 15 turns. +40 binding if target is not silenced. -DamageDealt チェーン ダメージを与え、15 ターンの間沈黙させるギャグを召喚します。ターゲットが沈黙していない場合、+40 バインディング。 -You conjure a gag! -あなたはギャグを思い起こさせます! -The gag will appear next to you and fly toward the target point. -ギャグがあなたの隣に現れ、目標地点に向かって飛んでいきます。 -Conjure Armbinder -アームバインダーを召喚する -Conjured Armbinder -召喚されたアームバインダー -The armbinder slips itself around your arms and buckles itself tightly! -アームバインダーは腕の周りを滑り、しっかりとバックルを締めます! -The armbinder hits you! (DamageDealt) -アームバインダーがあなたを襲います! (与ダメージ) -Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Blinded/Silenced targets are silenced/blinded for the same time. -DamageDealt チェーン ダメージを与え、13 ターンの間武装解除するア​​ームバインダーを召喚します。ブラインド/サイレンシングされたターゲットは、同時にサイレンシング/ブラインドされます。 -You conjure a armbinder! -あなたはアームバインダーを召喚します! -The armbinder will appear next to you and fly toward the target point. -アームバインダーがあなたの隣に現れ、目標地点に向かって飛んでいきます。 +革の拘束具を召喚した後、最大3つまでターンを消費せずに革の拘束具を召喚できる。 + + Conjure Leather Cuffs -レザーカフスを召喚する +革枷召喚 Conjured Leather Cuffs -召喚された革の袖口 +召喚した革の枷 The leather cuffs clasp your wrists and pull them tightly! -革のカフスが手首をしっかりと包み込みます! +革の枷が手首に取り付いてきた! The leather cuffs hit you! (DamageDealt) -革の袖口があなたを襲った! (与ダメージ) +革の枷がぶつかってきた! (DamageDealt) Summons a pair of cuffs which deals DamageDealt chain damage and adds 40 binding. Until the target struggles free, attacking the target disarms them for 3 turns. -DamageDealt チェーン ダメージを与え、40 バインディングを追加する 1 組のカフスを召喚します。ターゲットが解放されるまで、ターゲットを攻撃すると 3 ターンの間武装解除されます。 +DamageDealt チェーン ダメージを与え、40の拘束値を追加する1組のカフスを召喚する。ターゲットが抜け出すまでに攻撃すると、3ターンの間武装解除状態にする。 You conjure leather cuffs! -あなたは革の袖口を思い起こさせます! +革の枷を召喚した! The cuffs will appear next to you and fly toward the target point. -カフスがあなたの隣に現れ、目標地点に向かって飛んでいきます。 +革の枷が隣に現れ、まっすぐ飛んでいった! + + Conjure Blindfold -目隠しを呼び出す +目隠し召喚 Conjured Blindfold -召喚された目隠し +召喚した目隠し The blindfold wraps around your head and buckles tightly! -目隠しはあなたの頭を包み込み、しっかりと締めます! +目隠しが顔に覆いかぶさってきた! The blindfold hits you! (DamageDealt) -目隠しが当たる! (与ダメージ) -Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not silenced. -目隠しを召喚し、DamageDealt チェーン ダメージを与え、20 ターンの間ブラインドします。ターゲットがサイレンシングされていない場合、バインディング +40。 +目隠しがぶつかってきた!(DamageDealt) +Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not blinded. +DamageDealt チェーン ダメージを与え、20ターンの間盲目状態にする目隠しを召喚する。。ターゲットが盲目状態でないとき、拘束値が40増加する。 You conjure a blindfold! -あなたは目隠しを思い起こさせます! +目隠しを召喚した! The blindfold will appear next to you and fly toward the target point. -目隠しがあなたの隣に現れ、目標地点に向かって飛んでいきます。 +目隠しが隣に現れ、まっすぐ飛んでいった! + + Conjure Cuffs -カフスを召喚する +鉄枷召喚 Conjured Cuffs -召喚されたカフス +召喚した鉄枷 The cuffs pull your wrists together and click tightly! -袖口が手首を引き寄せ、しっかりとカチッ! +鉄枷に両手首を手繰り寄せられ、拘束されてしまった! The cuffs hit you! (DamageDealt) -袖口が当たった! (与ダメージ) +枷がぶつかってきた!(DamageDealt) Summons a pair of cuffs which deals DamageDealt chain damage and disarms for 5 turns. +40 binding if target is not disarmed. -DamageDealt チェーン ダメージを与え、5 ターンの間武装解除するカフスのペアを召喚します。ターゲットが武装解除されていない場合は +40 バインディング。 +DamageDealt チェーンダメージを与え、5ターンの間武装解除する鉄の枷を召喚する。ターゲットが武装解除状態でない場合、拘束値が40増加する。 You conjure a pair of cuffs! -あなたは一対の袖口を呼び起こします! -The cuffs will appear next to you and fly toward the target point. -カフスがあなたの隣に現れ、目標地点に向かって飛んでいきます。 +鉄の枷を召喚した! + + +Conjure Gag +ボールギャグ召喚 +The gag forces itself into your mouth and buckles tightly! +ボールギャグが口の中に飛び込んできた! +The gag hits you! (DamageDealt) +ボールギャグがぶつかってきた! (DamageDealt) +Summons a gag which deals DamageDealt chain damage and silences for 8 turns. +40 binding if target is not silenced. +DamageDealt チェーンダメージを与え、8ターンの間沈黙させるボールギャグを召喚する。ターゲットが沈黙していない場合、拘束値が40増加する。 +You conjure a gag! +ボールギャグを召喚した! +The gag will appear next to you and fly toward the target point. +ボールギャグが眼の前に現れ、まっすぐ飛んでいった! + + +Conjure Anti-Magic Gag +アンチマジックボールギャグ召喚 +Conjured Anti-Magic Gag +召喚されたアンチマジックボールギャグ +The anti-magic gag forces itself into your mouth and buckles tightly! +アンチマジックボールギャグが口の中に飛び込んできた! +The anti-magic gag hits you! (DamageDealt) +アンチマジックボールギャグがぶつかってきた! (DamageDealt) +Summons a magic-absorbing gag which deals DamageDealt teasing arcane damage and silences for 15 turns. Applies a debuff that increases miscast chance by 50%. +マナを吸収するボールギャグを召喚する。命中した敵に DamageDealt 魔術/焦らしダメージを与え、15ターンの間沈黙させ、詠唱失敗率を50%上昇させるデバフを付与する。 +You conjure an anti-magic gag! +アンチマジックボールギャグを召喚した! + + +Conjure Armbinder +アームバインダー召喚 +Conjured Armbinder +召喚したアームバインダー +The armbinder slips itself around your arms and buckles itself tightly! +アームバインダーは両腕を覆い、ベルトを締めてしまった! +The armbinder hits you! (DamageDealt) +アームバインダーがぶつかってきた! (DamageDealt) +Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Cannot be blocked. +DamageDealt チェーンダメージを与え、13ターンの間武装解除するア​​ームバインダーを召喚する。この魔法はブロックされない。 +You conjure a armbinder! +アームバインダーを召喚した! +The armbinder will appear next to you and fly toward the target point. +アームバインダーが隣に現れ、まっすぐ飛んでいった! + + Conjure Legbinder -レグバインダーを召喚する +レッグバインダー召喚 Conjured Legbinder -召喚されたレグバインダー +召喚したレッグバインダー The legbinder slips itself around your legs and buckles itself tightly! -レッグバインダーは足にぴったりとフィットし、しっかりとバックルを締めます。 +レッグバインダーが両足をすっぽりと覆い、ベルトが締まってしまった! The legbinder hits you! (DamageDealt) -レッグバインダーが当たる! (与ダメージ) -Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. -10 ターンの間、DamageDealt チェーン ダメージとスネアを与えるレグバインダーを召喚します。ターゲットがスネアされていない場合、バインディング +50。 +レッグバインダーがぶつかってきた! (DamageDealt) +Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. +DamageDealt チェーンダメージを与え、10ターン移動不可にするレッグバインダーを召喚する。命中した敵が移動不可状態ではない場合、拘束値が50増加する。この魔法はブロックされない。 You conjure a legbinder! -あなたはレッグバインダーを召喚します! +レッグバインダーを召喚した! The legbinder will appear next to you and fly toward the target point. -レッグバインダーがあなたの隣に現れ、目標地点に向かって飛んでいきます。 +レッグバインダーが隣に現れ、まっすぐ飛んでいった! + + +Conjure Latex Gag +ラテックスボールギャグ召喚 +Conjured Latex Gag +召喚したラテックスボールギャグ +Latex Gag +ラテックスボールギャグ +Latex Glob +ゴムの塊 +The gag forces itself into your mouth and snaps on tightly! +ボールギャグが口の中に飛び込んできた! +The amorphous rubber stretches out into a restraint on your body! +ゴムが形を変え、拘束具となって取り付いてきた! +The amorphous rubber sticks to you! (DamageDealt) +不定形のゴムがネバネバとくっついてくる! (DamageDealt) +Summons a gag which deals DamageDealt glue damage and silences for 15 turns. +40 binding if target is not silenced. +DamageDealt ねばねばダメージを与え、15ターンの間沈黙させるボールギャグを召喚する。ターゲットが沈黙していない場合、拘束値が40増加する。 + + +Conjure Latex Armbinder +ラテックスアームバインダー召喚 +Conjured Latex Armbinder +召喚したラテックスアームバインダー +The armbinder slips itself around your arms and snaps on tightly! +アームバインダーは両腕を覆い、ベルトを締めてしまった! +Summons an armbinder which deals DamageDealt glue damage and disarms for 13 turns. Cannot be blocked. +DamageDealt ねばねばダメージを与え、13ターンの間武装解除するア​​ームバインダーを召喚する。この魔法はブロックされない。 + + +Conjure Latex Legbinder +ラテックスレッグバインダー召喚 +Conjured Latex Legbinder +召喚したラテックスレッグバインダー +The legbinder slips itself around your legs and snaps on tightly! +レッグバインダーが両足をすっぽりと覆い、ベルトが締まってしまった! +Summons a legbinder which deals DamageDealt glue damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. +DamageDealt チェーンダメージとを与え、10ターンの減速状態を付与するレッグバインダーを召喚する。ターゲットが減速状態でない場合、拘束値が50増加する。この魔法はブロックされない。 + + Conjure Straitjacket -拘束衣を召喚する +拘束衣召喚 Conjured Straitjacket -召喚された拘束衣 +召喚した拘束衣 The straitjacket slips itself around your body and pulls your arms into its sleeves! -拘束衣はあなたの体の周りを滑り、あなたの腕をその袖に引っ張ります! +拘束衣を着せられてしまった! The straitjacket hits you! (DamageDealt) -拘束衣があなたを襲います! (与ダメージ) -Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. -ダメージディール バインディングを追加し、14 ターンの間闘争速度を低下させる拘束衣を召喚します。 +拘束衣がぶつかってきた!(DamageDealt) +Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. Cannot be blocked. +DamageDealt ダメージと拘束値を与え、14ターンの間もがくスピードを低下させる拘束衣を召喚する。この魔法はブロックされない。 You conjure a straitjacket! -あなたは拘束衣を召喚します! +拘束衣を召喚した! The straitjacket will appear next to you and fly toward the target point. -拘束衣があなたの隣に現れ、目標地点に向かって飛んでいきます。 +拘束衣が隣に現れ、まっすぐ飛んでいった! + + Conjure Harness -召喚ハーネス +ハーネス召喚 Conjured Harness -召喚ハーネス +召喚したハーネス The harness slips itself around your torso and squeezes tightly as each buckle secures itself one by one! -ハーネスは胴体の周りを滑り、各バックルが 1 つずつしっかりと固定されるので、しっかりと締めます。 +ハーネスが胴体に張り付き、しっかりとロックされてしまった! The harness hits you! (DamageDealt) -ハーネスが当たる! (与ダメージ) -Summons a harness which deals DamageDealt crush damage. Adds +50 binding per 25% binding level on target, up to +200. -DamageDealt クラッシュ ダメージを与えるハーネスを召喚します。ターゲットのバインディング レベル 25% ごとに +50 のバインディングを追加します。最大で +200 です。 +ハーネスがぶつかってきた! (DamageDealt) +Summons a harness which deals DamageDealt chain damage. Adds +50 binding per 25% binding level on target, up to +200. +DamageDealt チェーンダメージを与えるハーネスを召喚する。命中したターゲットの拘束値25%毎に50ポイントの拘束値を増加させる。最大200まで。 You conjure a harness! -あなたはハーネスを想起させます! +ハーネスを召喚した! The harness will appear next to you and fly toward the target point. -ハーネスがあなたの隣に現れ、目標地点に向かって飛んでいきます。 +ハーネスが隣に現れ、まっすぐ飛んでいった! + + Firecracker -爆竹 +ファイアボム A small delayed explosion that deals DamageDealt fire damage. -ダメージを与える小さな遅延爆発。火のダメージを与えます。 +数ターン後に爆発し、 DamageDealt 火ダメージを与える爆弾を召喚する。 You shout an incendiary retort! -あなたは焼夷弾を叫びます! +空間を焼夷する魔法を叫んだ! Choose AoE location -AoE の場所を選択 +範囲を選択 + + Feather Burst フェザーバースト After a brief delay, a small cloud of feathers tickles enemies for DamageDealt damage and +60 distraction for 3 turns. -少し遅れて、羽毛の小さな雲が敵をくすぐり、3 ターンの間、DamageDealt ダメージと +60 の気晴らしを与えます。 +数ターン後に DamageDealt くすぐりダメージを与え、興奮値を60増加させる羽根の旋風を召喚する。3ターン継続。 You conjure a burst of frenetic feathers! -あなたは熱狂的な羽のバーストを呼び起こします! -Choose AoE location -AoE の場所を選択 +羽根の旋風を巻き起こした! + + Tickle Cloud くすぐり雲 For 10 turns, disembodied hands tickle a target location for DamageDealt tickle damage. -10 ターンの間、実体のない手がターゲットの場所をくすぐり、DamageDealt くすぐりダメージを与えます。 +10 ターンの間、実体のない手が指定された場所をくすぐり、 DamageDealt くすぐりダメージを与える。 A swarm of hands holding feathers appears! -羽を持った手の群れが出現! +羽を持った手の群れを呼び出した! Choose location -場所を選択 +範囲を選択 + + Frustrated Pet 欲求不満のペット The pet collapses in frustration. -ペットは欲求不満で倒れます。 +ペットを欲求不満にする。 + + Mana Pet -ペットはどこ? +マナ・ペット The enemy steals your pet from you! -敵があなたのペットを盗みます! +敵にペットを盗られた! + + Display Doll ディスプレイドール The enemy steals your doll from you! -敵があなたの人形を盗みます! +敵に人形を盗られた! + + Conjure Petsuit -ペットスーツを召喚する -Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery. -無力な敵のみを対象にします。敵をペットに変えてあなたについてき、パッシブ マナの回復量を増加させます。 +ペットスーツ召喚 +Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery from mana pool. +無力化した敵をペットにする。ペットがいる間、マナプールから得られるマナの回復量が上昇する。 You conjure an enchanted petsuit which wraps around your target, forcing her to follow you! -あなたはターゲットを包み込む魔法のペットスーツを召喚し、彼女を強制的にあなたに従うようにさせます! +無力化した敵にペットスーツを着せ、強制的に服従させた! You watch in horror as your own creation lunges toward you, binding your hands and feet! -あなたは自分の手足を縛りつけながら、あなた自身の創造物があなたに向かって突進するのを恐怖で見ています! +自身の召喚したペットスーツに拘束されてしまった! Choose a helpless target 無力なターゲットを選ぶ + + Conjure Display Stand -ディスプレイスタンドを呼び出す -Target only Helpless enemies. Creates a fixture that increases passive mana recovery, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. -無力な敵のみをターゲットにします。パッシブ マナ回復を増加させ、チャージを 50 回復し、近くの敵が受けるチャーム/サイキック ダメージを 50% 増加させるフィクスチャを作成します。 +ディスプレイスタンド召喚 +Target only Helpless enemies. Creates a fixture that increases passive mana recovery from mana pool, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. +無力化した敵をディスプレイスタンドに飾り付ける。それが存在する限り、マナプールから得られるマナの回復量が増加し、即座に50のエネルギーを得る。また、ディスプレイスタンドの近くにいる敵は、魅了と精神属性のダメージが50%増加する。 You conjure a fixture to hold your helpless target in place! -あなたは無力な標的を所定の位置に保持する固定具を召喚します! -You watch in horror as your own creation surrounds you, locking you in place with a hefty click! -あなたは、あなた自身の創造物があなたを取り囲み、大きなクリックであなたを所定の位置に固定するのを恐怖で見ています! -Choose a helpless target -無力なターゲットを選ぶ +無力化した敵をディスプレイスタンドに飾った! +You watch in horror as your own creation encircles you, locking you in place with a hefty click! +自身の召喚したディスプレイスタンドに拘束されてしまった! + + Lesser Flash レッサーフラッシュ -Ring -指輪 -Flash Bomb -フラッシュボム Sparkles! キラキラ! Mirror Image 鏡像 -A flash of light which renders anyone caught within blind for Duration turns -Duration ターンの間、視界に入った者を盲目にする閃光 +A flash of light which renders anyone caught within blind for 7 turns +7ターンの間、小さな閃光で範囲内の敵を盲目状態にする。 You charge up a bright flash! -あなたは明るいフラッシュを充電します! +閃光を放つ魔法を唱えた!! Select where to center the flash (SpellArea radius) -フラッシュを中心にする場所を選択します (SpellArea radius) -A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged. -一定時間気絶する大きな音でターンし、敵を引き寄せます。長距離。 +場所を選択 (範囲 SpellArea) + + +Ring +爆音 +A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged with a 3 turn delay. +Duration ターンの間、敵を気絶させる爆音を放つ。音を探知した敵は寄ってくる。遠距離に発動する場合、3ターンの詠唱が必要。 You point and a noise emanates from the location! -あなたが指さすと、その場所から騒音が発せられます! +閃光と爆音を指差した箇所から炸裂させた! Select where to center the noise (SpellArea radius) -ノイズを中心にする場所を選択します (SpellArea 半径) +場所を選択 (範囲 SpellArea) + + +Holy Blaze +ホーリーブレイズ +Call down a 3x3 area of DamageDealt holy damage. Blinds enemies for 3 turns (and also yourself). +3x3の範囲に DamageDealt 聖属性ダメージを与え、3ターンの間盲目状態を付与するエリアを生成する。 +You summon a divine aura! +小さな聖域を召喚した! +Select where to center the blast (SpellArea radius) +場所を選択 (範囲 SpellArea) + + Greater Flash グレーターフラッシュ -A massive flash of light which renders anyone caught within blind for Duration turns -Duration ターンの間、視界に入った者を盲目にする巨大な閃光 -You charge up a bright flash! -あなたは明るいフラッシュを充電します! -Select where to center the flash (SpellArea radius) -フラッシュを中心にする場所を選択します (SpellArea radius) +A massive flash of light which renders anyone caught within blind for 16 turns and stuns briefly. +16ターンの間、大きな閃光で範囲内の敵を盲目にする。 + + Focused Flash -集中フラッシュ -Select where to center the flash (SpellArea radius) -フラッシュを中心にする場所を選択します (SpellArea radius) -A focused flash of light which renders anyone caught within blind for Duration turns -Duration ターンの間、視界に入った人を盲目にする焦点を絞った光の閃光 +フォーカスフラッシュ +A focused flash of light which renders anyone caught within blind for 30 turns and stuns for Duration turns. +30ターンの間、圧縮された光で敵を盲目にし、 Duration ターンの間スタンさせる。 You slowly charge up a powerful flash! -強力な閃光をゆっくりチャージ! +光を圧縮し、閃光を放つ魔法を唱えた! + + Shroud シュラウド -Smoke Bomb -煙幕弾 Sleep Gas 睡眠ガス Select where to center the shroud (SpellArea radius) -シュラウドを中心にする場所を選択します (SpellArea 半径) +範囲を選択 (範囲 SpellArea) Creates a cloud for Duration turns that buffs evasion for all creatures. You are temporarily invisible for 8 turns after leaving. -Duration ターンの間、すべてのクリーチャーの回避をバフする雲を作成します。離れた後、8ターンの間、一時的に見えなくなります。 +Duration ターンの間、隠密性と回避力を上昇させる霧を出す。隠密性の上昇は霧から出て8ターン目まで続く。 You exhale a misty shroud -君は霧のかかったシュラウドを吐き出す +姿を隠す黒い霧を吐き出した! + + Invisibility -不可視 +インビジブル Select which creature to buff -バフするクリーチャーを選択する +対象を選択 Make the targeted creature invisible, increasing stealth for Duration turns -対象のクリーチャーを透明にし、持続時間ターンのステルスを増加させる +対象を透明にし、隠密性を Duration ターン増加させる。 You snap your fingers! -あなたはあなたの指をパチンと鳴らします! +指を鳴らし、対象を透明にした! + + CMD: Lock CMD: ロック Select which creature to lock -ロックするクリーチャーを選択する +ロックする対象を選択 Magically locks down a target, preventing them from struggling below the current level of binding until freed by an enemy spellcaster (max 100% binding). -ターゲットを魔法でロックダウンし、敵のスペルキャスターによって解放されるまで、現在のバインディング レベル以下で苦労するのを防ぎます (最大 100% バインディング)。 +対象の拘束具に鍵をかけ、魔法が解除されるまで拘束値が下がるのを防ぐ。(最大100%) You say a command word, and magical locks bind your target! -あなたが合言葉を言うと、魔法のロックがあなたのターゲットを拘束します! +コマンドワードを唱え、拘束具に魔法の錠前を施した! + + Chastity 貞操 Select which creature to lock in a belt -ベルトにロックするクリーチャーを選択する -Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs and distracts constantly. -無効になっているクリーチャーをターゲットにします。+DamageDealt バインディングを追加し、ターゲットがプラグを外して常に気を散らすのを防ぐ Chastity を適用します。 +ロックする対象を選択 +Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs/toys, and distracts constantly. +無力化した敵に貞操帯を装着し、 DamageDealt の拘束値を追加する。対象はプラグやローターを取り外せなくなる。 You conjure a chastity belt, which latches onto your target! -あなたは貞操帯を召喚し、ターゲットに引っ掛かります! +貞操帯を召喚し、無力化した敵に取り付けた! Your own spell locks you in chastity! -あなた自身の呪文があなたを純潔に閉じ込めます! +自分自身に貞操帯を取り付けてしまった! Something fun enters your body... -何か楽しいことが体に入ってくる… +何かが入ってきた…… + + Zone of Purity -純度のゾーン +純潔のゾーン Select an area エリアを選択 -Creates an area which applies Chastity constantly to any enemy over 50% bondage that steps inside. -拘束度50%以上の敵が侵入すると常に貞操を適用するエリアを作る。 +Creates an area which applies Chastity constantly to any enemy over with any amount of binding that steps inside. +拘束値が1以上の敵が侵入すると、貞操帯を取り付けるエリアを生成する。 You conjure a realm of absolute purity. -あなたは絶対的な純粋さの領域を思い起こさせます。 +純潔を示す領域を作り出した。 + + Zone of Excitement 興奮のゾーン -Select an area -エリアを選択 Creates an area which adds a conjured vibrating toy to enemies that step inside. Toy lasts 30 turns. -中に入った敵に魔法の振動おもちゃを追加するエリアを作成します。おもちゃは30ターン持続します。 +中に入ると振動するオモチャが取り付けられるエリアを生成する。オモチャは30ターン継続する。 You conjure a realm of absolute fun! -あなたは絶対的な楽しみの領域を思い起こさせます! +快楽を示す領域を作り出した。 + + CMD: Capture -CMD: キャプチャ +CMD: 捕獲 Select which creature to bind -バインドするクリーチャーを選択 +クリーチャーを選択 Commands nearby restraints to bind a target, dealing DamageDealt chain damage, +50 binding. Ropes snare 3 turns/rope, belts +20 binding/belt, chains deal +15 crush dmg/chain. -近くの拘束具にターゲットをバインドするように命令し、DamageDealt チェーン ダメージ、+50 バインディングを与えます。ロープ スネアは 3 ターン/ロープ、ベルトは +20 バインディング/ベルト、チェーンは +15 クラッシュ ダメージ/チェーンを与えます。 +落ちている拘束具に命令し、DamageDealt チェーンダメージと50の拘束値を与える。落ちているアイテム一つにつき、ロープなら3ターンの減速、ベルトなら追加で拘束値20、鎖は追加で15の打撃ダメージを与える。 You say a command word, and the bindings on the ground do your bidding! -あなたが合言葉を言うと、地面の拘束具があなたの命令に従います! +コマンドワードを唱え、散らばる拘束具に生命を宿らせた! + + CMD: Disenchant -CMD: ディエンチャント -Select an area -エリアを選択 +CMD: 吸収 Target a large area. Permanently slows constructs, reduces attack speed by 50%, and deals 30 shadow damage. Refunds 50% mana at 3 or more targets. Cast on self to disenchant bindings. -広い範囲をターゲットにします。コンストラクトを永続的にスローにし、攻撃速度を 50% 減少させ、30 のシャドウ ダメージを与えます。3 つ以上のターゲットに 50% のマナを返します。自身にキャストしてバインドを解除します。 +広範囲の魔力が宿る非生命体の攻撃スピードを半減させ、30影属性ダメージを与える。範囲内に3体以上の対象がいる場合、消費マナの半分が戻ってくる。自身が範囲内にいる場合、拘束具の一部を解除する。 You say a command word, siphoning the magic from nearby constructs! -あなたは合言葉を言い、近くの人造から魔法を吸い上げます! +コマンドワードを唱え、近くの物質から魔力を吸い上げた! + + CMD: Vibrate CMD: 振動 -Select an area -エリアを選択 Target a large area. Enemies with plugs or toys are teased for Duration turns, taking charm damage each turn. -広い範囲をターゲットにします。プラグやおもちゃを持った敵は、Duration ターンの間からかわれ、ターンごとにチャーム ダメージを受けます。 +広範囲のプラグやローターを一斉に振動させる。 Duration ターンの間振動し、装着者はターンごとに魅了属性ダメージを受ける。 You say a command word, causing all toys in the area to vibrate! -あなたが合言葉を言うと、そのエリアのすべてのおもちゃが振動します! +コマンドワードを唱え、オモチャを一斉に振動させた! + + CMD: Explosive Finish -CMD: 爆発的な仕上げ +CMD: 性欲爆弾 Explosive Finish -爆発的な仕上げ -Select an area -エリアを選択 +性欲爆弾 Target a large area. Consumes enemy distraction to deal up to DamageDealt charm damage, twice if at 90% distraction or more. -広い範囲をターゲットにします。敵の気晴らしを消費して、気晴らしが 90% 以上の場合、最大 2 回ダメージを与えたチャーム ダメージを与えます。 +広範囲の対象に DamageDealt 魅了ダメージを与える。ダメージ量は興奮値によって決まり、興奮値が90以上の場合、ダメージを2回受ける。 You say a command word, resulting in a surge of energy entering your targets! -あなたが合言葉を言うと、ターゲットにエネルギーのサージが入ります! +コマンドワードを唱え、特殊なエネルギーを敵に注入した! + + CMD: Release CMD: リリース -Select an area -エリアを選択 Target bound (but unlocked) targets in a 3x3 area, reducing binding by 100. Removes unlocked restraints on player that are removable. -ターゲットは 3x3 エリア内のバインドされた (ただしロックが解除された) ターゲットであり、バインドが 100 減少します。プレーヤーの解除可能なロック解除された拘束を削除します。 +3x3エリア内の拘束済みかつロックされていない対象の拘束値を100減らす。自身を選択した場合、ロックされていない拘束具を解除する。 You say a command word, causing restraints to loosen! -合言葉を言えば拘束が緩む! +コマンドワードを唱え、拘束を緩めた! You say a command word, but your restraints remain tight! -合言葉を言うが、拘束はきついままだ! +コマンドワードを唱えたが、拘束はきついままだ! + + Remove Slime -スライムを取り除く +リムーブスライム Select a creature or yourself -クリーチャーまたは自分自身を選択します +対象を選択 Remove Slime and Encasement from target creatures in an area. Also removes slime from self. -エリア内の対象のクリーチャーからスライムとエンケースメントを取り除きます。また、自分からスライムを取り除きます。 +エリア内の対象からスライムを取り除く。 You issue a command to the slime! -スライムに命令だ! +スライムに退くよう命令した! You whisper a command word, but the slime is already hardened and won't budge... -合言葉をささやくが、スライムはもう固まって動けない…… +コマンドワードを唱えても、既に固まったスライムには意味がなかった…… + + Binding Vines -つるを縛る +バインディングヴァイン Binding Ropes -結束ロープ +バインディングロープ Binding Chains バインディングチェーン Binding Belts -結束ベルト +バインディングベルト Vines rise from the ground and squeeze you! -つるが地面から立ち上がってあなたを圧迫します! +地面から突如つるが伸び、縛られてしまった! Ropes encircle your body and tighten! -ロープがあなたの体を取り囲み、引き締めます! +ロープが身体を取り囲み、縛り上げられた! Chains wrap around you! -鎖があなたを包み込みます! +鎖に包み込まれた! A web of belts buckles in place around your body! -ベルトのウェブが体の周りに固定されています。 +ベルトの網に捕まってしまった! Vines rise from the ground and squeeze you! (DamageDealt) -つるが地面から立ち上がってあなたを圧迫します! (与ダメージ) +地面から突如つるが伸び、縛られてしまった! (DamageDealt) Ropes encircle your body and tighten! (DamageDealt) -ロープがあなたの体を取り囲み、引き締めます! (与ダメージ) +ロープが身体を取り囲み、縛り上げられた! (DamageDealt) Chains wrap around you! (DamageDealt) -鎖があなたを包み込みます! (与ダメージ) +鎖に包み込まれた! (DamageDealt) A web of belts buckles in place around your body! (DamageDealt) -ベルトのウェブが体の周りに固定されています。 (与ダメージ) -Awaken -目覚める +ベルトの網に捕まってしまった! (DamageDealt) + + Awaken -目覚める +アウェイクスライム The slime awakens and turns on you!!! -スライムが目覚めてあなたをオンにします!!! +スライムが湧き上がり、こちらに向かってきた! Select area to awaken -覚醒するエリアを選択 -Activates the slime in an area, causing it to deal DamageDealt glue damage. Encases fully bound targets. -範囲内のスライムを活性化し、接着剤によるダメージを与えます。完全にバインドされたターゲットを包みます。 +エリアを選択 +Activates the slime in an area, causing it to deal 25 glue damage. Encases fully bound targets. +範囲内のスライムを活性化し、25ねばねばダメージを与える。完全に拘束された敵を包み込む。 You command the slime to draw in targets! -スライムに命令してターゲットを引き寄せろ! +スライムに取り付くよう指示を出した! + + CMD: Bind CMD:バインド Select area to bind -バインドする領域を選択 +範囲を選択 Commands nearby restraints to bind targets standing on them. Rope: 30 chain dmg/5 turn snare. Chain: 30 crush dmg/8 turn disarm. Belts: 50 binding/3 turns vulnerability. -近くの拘束具に、その上に立っているターゲットをバインドするように命令します。ロープ: 30 チェーン ダメージ/5 ターン スネア。チェーン: 30 クラッシュ ダメージ/8 ターン 武装解除。ベルト: 50 バインド/3 ターン脆弱性. -You say a command word, and the bindings on the ground do your bidding! -あなたが合言葉を言うと、地面の拘束具があなたの命令に従います! +落ちている拘束具に、その上の敵を拘束するよう命令する。種類により追加効果。ロープ:30チェーンダメージと5ターンの減速。鎖:30打撃ダメージと8ターン武装解除。ベルト:拘束値50追加と弱体化3ターン。 + + CMD: Unlock -CMD: ロック解除 +CMD: ロック解除(小) Select which creature to unlock -ロックを解除するクリーチャーを選択します -On yourself: Removes all purple locks. On a creature: Reduces the target's binding by 20 points. -自分自身に:すべての紫色のロックを解除します。クリーチャーに:対象のバインディングを 20 ポイント減らします。 +対象を選択 +On yourself: Removes one purple (magical) lock. On a creature: Reduces the target's binding by 20 points. +自分:紫(魔法)の錠前を1つ解除する。他:拘束値を20減らす。 You speak a command word! -あなたは合言葉を話します! +コマンドワードを唱え、拘束具を解除する! None of the locks you are wearing respond to your magic. -あなたが身につけているロックはどれもあなたの魔法に反応しません。 +どのロックにも効果がないようだ。 You can't help her with this. -これで彼女を助けることはできません。 +この魔法を使っても意味はない。 You must target yourself, an enemy, or a locked object. -自分自身、敵、またはロックされたオブジェクトをターゲットにする必要があります。 +ロックされた拘束具を付けている対象を選ぶ必要がある。 +The command is intricate and you are unable to enunciate it properly! +コマンドが複雑で上手に発音できない! + + +CMD: Greater Unlock +CMD: ロック解除(大) +On yourself: Removes all purple (magical) locks. On a creature: Reduces the target's binding by 100 points. +自分:紫(魔法)の錠前を全て解除する。他:拘束値を100減らす。 +You speak a powerful command word! +強力なコマンドワードを唱え、拘束具を解除する! + + Lesser Invisibility -低めの不可視性 -Select which creature to buff -バフするクリーチャーを選択する -Make the targeted creature invisible, increasing stealth for Duration turns -対象のクリーチャーを透明にし、持続時間ターンのステルスを増加させる +半透明化 You become semitransparent! -あなたが半透明になる! +半透明になった! + + Camouflage -迷彩 +カモフラージュ Select yourself -自分で選択 -Enemies have a harder time noticing you for Duration turns. Cancels if you move, cast, or sleep. -持続時間の間、敵はあなたに気付きにくくなります。あなたが移動、詠唱、または睡眠するとキャンセルされます。 +自分を選択 +Enemies have a harder time noticing you for Duration turns. Cancels if you move (unless you are near a wall), cast, or sleep. +Duration ターンの間、隠密性が上がる。移動(壁の近くにいる場合を除く)、詠唱、睡眠で効果が消失する。 You pose in a clandestine manner. -あなたは秘密の方法でポーズをとります。 -Darkblade +ポーズをとり、周囲に溶け込んだ! + + +Darkblade ダークブレード -Select which creature to buff -バフするクリーチャーを選択する Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks, whichever is lower. -対象のクリーチャー(または自分自身)に、継続ターンまたは5回の攻撃のいずれか低い方で+20のダメージを与えます。 +自身かNPCに Duration ターン、または攻撃5回分の間、追加で20ダメージを与える効果を付与する。 You call forth dark runes on your weapon and arms! -武器と腕に闇のルーンを呼び込め! +闇の力を武器に宿した! + + Heal -癒し +ヒール Select which creature to heal -回復するクリーチャーを選択する +対象を選択 Restore 45 hitpoints to an allied creature. -味方のクリーチャーのヒットポイントを 45 回復します。 +味方のHPを45回復する。 You utter a word of healing. -あなたは癒しの言葉を発します。 -Flame Blade -フレイムブレイド -When enabled: Weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. -有効な場合: 武器攻撃はマナを消費し、隣接するターゲットに 30 の火ダメージを与える炎の攻撃を作成します。 +癒やしの言葉を紡いだ! + + Flame Blade -フレイムブレイド -Engulf -巻き込む -When enabled: Your melee attacks deal +20 glue damage and create slime. -有効な場合: 近接攻撃は +20 の接着剤ダメージを与え、スライムを生成します。 -Strengthen -強化する -When enabled: Struggling is more powerful, and your attack damage is increased by +20 if your weapon deals physical damage. -有効時: 闘争がより強力になり、武器が物理ダメージを与えると、攻撃ダメージが +20 増加します。 +業火の剣 +When enabled: Melee weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. +有効時: 武器攻撃時にマナを消費し、追加で30火属性ダメージを与える。 + + +Tentacle Slap +触手の一撃 +You have the power to make tentacles out of slime when you attack. When enabled: Your attacks deal +10 glue damage and create slime. 150% bind efficiency. +スライムから触手を形作り、追加で攻撃できるようになる。有効時:攻撃時に追加で10ねばねば属性ダメージを与え、床にスライムを撒く。拘束ダメージ率が150%になる。 + + +Chain Strike +鎖の一撃 +You have the power to summon chains when you attack. When enabled: Your attacks deal +10 chain damage and create chains. 125% bind efficiency. +鎖を召喚し、追加で攻撃できるようになる。有効時:攻撃時に追加で10チェーンダメージを与え、床に鎖を撒く。拘束ダメージ率が125%になる。 + + +Ropework +ロープワーク +You have the power to weave ropes between your attacks. When enabled: Your attacks deal +10 chain damage and create ropes. 400% bind efficiency. +縄を操り、追加で攻撃できるようになる。有効時:攻撃時に追加で10チェーンダメージを与え、床に縄を撒く。拘束ダメージ率が400%になる。 + + +Leather Whip +レザーウィップ +You have the power to strike with conjured belts when you attack. When enabled: Your attacks deal +10 pain damage and create belts. 250% bind efficiency. +革のベルトを召喚し、追加で攻撃できるようになる。有効時:攻撃時に追加で10苦痛ダメージを与え、床にベルトを撒く。拘束ダメージ率が250%になる。 + + +Super Strength +魔力筋繊維 +When enabled: Struggling is more powerful, and your melee attack damage is increased by +20 if your weapon deals physical damage. +有効時: 「もがく」選択時にボーナス。物理ダメージを与える際、20ダメージ増加する。 Your body glows with magical energy! -あなたの体は魔法のエネルギーで輝きます! +全身の筋肉にマナを流し込んだ! + + Enhance Will 意志強化 When enabled: Miscast chance is halved -有効時:ミスキャスト確率半減 +有効時:ミスキャスト確率半減。 You focus intently! ひたすら集中! + + Truesight トゥルーサイト When enabled: Drain mana every turn to see through walls and increase accuracy by 40%. -有効時: 毎ターンマナを吸収して壁を透視し、精度を 40% 向上させます。 -Heartsense -ハートセンス -Highlight the locations of enemies through walls on the map for 12 turns. -12 ターンの間、マップ上の壁を通して敵の位置を強調表示します。 -Light -ライト +有効時: 毎ターンマナを消費し、壁を透視する。また、命中率を40%上昇させる。 + + +Echolocation +エコーロケーション +Close your eyes to dramatically improve your hearing and locate enemies through walls. +目を閉じて聴覚を鋭敏に研ぎ澄まし、壁越しにも敵の位置を特定できるようにする。 + + Produce a bright light for Duration turns. Has no effect in dark rooms. -効果時間ターンの間、明るい光を生成します。暗い部屋では効果がありません。 -Floating Weapon -フローティングウェポン -When enabled: While hands are bound, you can still use weapons, but attacks cost mana. -有効時: 手が拘束されている間も武器を使用できますが、攻撃にはマナがかかります。 +Duration ターンの間、部屋を明るくする。全く光のない部屋では使用できない。 + + Levitate -レビテート +浮遊 When enabled and above 0 stamina: Drain 5 mana per step to reduce slow level by 1 (if above 1), or 20 mana to ignore a temporary slow effect. -有効でスタミナが0以上の場合: 1ステップごとに5マナをドレインしてスローレベルを1下げるか(1を超えている場合)、20マナをドレインして一時的なスロー効果を無視します。 +有効かつスタミナが0以上の時: 1ステップごとに5マナ消費してスローレベルを1下げるか、20マナ消費して一時的にスロー効果を無視する。 You levitate over the trap! -あなたはトラップの上に浮かびます! +罠の上を浮遊している! You snag a tripwire while floating! -浮かんでいる間にトリップワイヤーを引っ掛けたぞ! +トリップワイヤーに引っかかった! You levitate forward despite being slowed! -速度が遅くなっても前方に浮揚します! +ゆっくりと前方に浮遊する! You hover with reduced effect from bindings. -バインディングの効果を減らしてホバリングします。 +減速を無視して浮遊する。 + + Iron Blood アイアンブラッド -Select yourself -自分で選択 Channel 4 turns: Halves SP cost of melee attacks by 50%, but increases MP cost of spells by 25%. Ends on sleep or recast. -チャンネル4ターン:近接攻撃の消費SPを50%半減、呪文の消費MPを25%上昇。睡眠か再詠唱で終了。 +4ターンかけて発動。近接攻撃のSP消費を半減し、魔法のコストを25%増加させる。睡眠か再発動で終了。 Your skin glows a pale red! -あなたの肌は淡い赤に輝きます! +血液に魔力を流しこんだ! + + Stone Skin ストーンスキン -Select which creature to buff -バフするクリーチャーを選択する Make the targeted creature (or yourself) gain +20 armor for Duration turns -対象のクリーチャー (または自分自身) に、期間ターンの間、+20 アーマーを獲得させます。 +対象は Duration ターンの間、20のアーマーを得る。 Your skin takes on the appearance of cracked earth! -あなたの肌は割れた地球のように見えます! +肌が硬質化し、岩の如き堅牢さを得た! + + The EnemyName gains increased physical armor! -EnemyName の物理アーマーが増加します! +EnemyName の物理アーマーが増加した! The EnemyName buffs the physical armor of her allies! -EnemyName は味方の物理アーマーを強化します! +EnemyName は味方の物理アーマーを強化した! The EnemyName deploys an energy shield to allies! -EnemyName はエネルギー シールドを味方に展開します! +EnemyName はエネルギーシールドを味方に展開した! The EnemyName activates the vibrators of nearby wolfgirls, greatly motivating them! -EnemyName は、近くの wolfgirls のバイブレーターをアクティブにし、彼らを大いにやる気にさせます! +EnemyName は、近くのウルフガールのプラグを振動させて興奮させた! The EnemyName activates the vibrators of nearby dolls, greatly motivating them! -EnemyName は、近くの人形のバイブレーターをアクティブにし、それらを大いにやる気にさせます! +EnemyName は、近くの人形のプラグを振動させて興奮させた! The EnemyName creates a zone of increased defense! -EnemyName は、防御力を高めたゾーンを作成します! +EnemyName は、守護の方陣を生成した! EnemyName uses a charm to buff an enemy's Magic Armor and Evasion! -EnemyName はチャームを使用して、敵のマジック アーマーと回避をバフします! +EnemyName は護符を使用して、マジックアーマーと回避力を強化した! +### EnemyName supports a witch with a magical shield! + +### Shield the Witch! + EnemyName uses a glowing talisman to buff an undead's physical armor and speed! -EnemyName は、光るタリスマンを使用して、アンデッドの物理的な鎧と速度を強化します! +EnemyName は、光る護符を使用して、アンデッドの物理アーマーと速度を強化した! You create a zone of increased defense! -あなたは防御力を高めたゾーンを作ります! +守護の方陣を生成した! You create a protective zone! -あなたは保護ゾーンを作成します! +守護の領域を生成した! You create a fan of icicles! -つららのファンを作成します。 -Wall -壁 +つららのファンを生成した! + + Select where to put the wall (cannot place on occupied squares) -壁を置く場所を選択します(占有されたマスには配置できません) -Create a stationary wall for Duration turns. It takes 20% damage from spells. -Duration ターンの固定壁を作成します。呪文から20%のダメージを受ける。 +壁を置く場所を選択(何もないマスのみ) +Create a stationary wall for Duration turns. It takes 20% damage from spells. Cast on an open door to close it and give it additional armor. +Duration ターンの間、壁を生成する。壁は魔法ダメージを80%カットする。開いているドアにこの魔法をかけると、ドアが閉まり追加でアーマーを得る。 A wall starts to form! -壁ができ始める! +壁がせり上がってきた! You create a line on the ground. -地面にラインを作成します。 +地面に線を描く! + + True Steel -トゥルースティール +トゥルースチール Choose a target. -ターゲットを選択します。 +対象を選択 A melee strike that deals DamageDealt slash damage, x2.5 against unaware humanoid enemies. -認識していない人型の敵に対して、2.5 倍のダメージを与えるスラッシュ ダメージを与える近接攻撃。 +DamageDealt 斬撃ダメージを与える。敵が人型かつプレイヤーを認識していない場合、ダメージが2.5倍になる。 You slash with an ethereal blade! -幽玄の刃で斬る! +異界の刃で切り裂いた! + + Summon Familiar -サモンファミリア +使い魔召喚 Select where to put the familiar (cannot place on occupied squares) -使い魔を配置する場所を選択します (占有されているマスには配置できません) +配置する場所を選択(何もないマスのみ) Create a familiar that fights by your side for the rest of the level -残りのレベルであなたの側で戦う使い魔を作成します +その階層で一緒に戦ってくれる使い魔を召喚する。 A familiar appears! -おなじみ登場! +使い魔参上! You create a circle on the ground with your foot! 足で地面に円を描く! + + Summon Storm Crystal ストームクリスタル召喚 Select where to put the storm crystal (cannot place on occupied squares) -ストームクリスタルを置く場所を選択します(占有されたマスには配置できません) +配置する位置を選択(何もないマスのみ) Create a stationary crystal that casts Crackle on nearby targets for Duration turns. Can be healed to extend duration. -持続時間の間、近くのターゲットにクラックルをキャストする固定クリスタルを作成します。回復して持続時間を延長することができます。 +Duration ターンの間、近くの敵を攻撃する固定クリスタルを召喚する。HPを回復することで、持続時間を延長可能。 A crackling crystal emerges from the ground! -地中からパチパチとクリスタルが出現! +地中からクリスタルがせり上がってきた! You stomp and the ground shakes! -踏むと地面が揺れる! +地面を踏み、召喚の意志を流す! + + Summon Fire Mote -炎のモートを召喚 +ファイアモート召喚 Select where to put the fire mote (cannot place on occupied squares) -火のかけらを置く場所を選択します (占有された正方形には配置できません) +配置する位置を選択(何もないマスのみ) Create an orb of fire that follows you and attacks using firebolt. -自分を追尾する火のオーブを作り、ファイアボルトで攻撃する。 +ファイアモートを召喚する。ファイアモートはプレイヤーを追尾し、敵を「ファアボルト」で攻撃する。 A flaming spirit answers your call! -炎の精霊があなたの呼びかけに応えます! +ファイアモートが呼びかけに応えた! You call upon the plane of Fire! -あなたは火の飛行機を呼び出します! +空に浮かぶ火の玉を呼び出した! + + Summon Earth Mote アースモート召喚 Select where to put the earth mote (cannot place on occupied squares) -土のかけらをどこに置くかを選択します (占有されているマスには置けません) +配置する位置を選択(何もないマスのみ) Create an animated stone that attacks using a strong but slow crush attack. -強力だが遅いクラッシュ攻撃を使用して攻撃するアニメーションの石を作成します。 +アースモートを召喚する。アースモートは遅いが強力な打撃攻撃を繰り出す。 A rocky spirit rushes forth from the ground! -地中から岩の精霊が飛び出す! +アースモートが呼びかけに応えた! You call upon the plane of Earth! -あなたは地球の平面に呼びかけます! +空に浮かぶ土の玉を呼び出した! + + Summon Air Mote エアモート召喚 Select where to put the air mote (cannot place on occupied squares) -空中モートを置く場所を選択します (占有された正方形には配置できません) +配置する位置を選択(何もないマスのみ) Create a dusty mote that attacks using gusts of wind. -突風を使って攻撃するほこりっぽいモートを作成します。 +エアモートを召喚する。エアモートは突風を使い敵を攻撃する。 A dust devil arises in front of you! -ダストデビルが目の前に出現! +エアモートが呼びかけに応えた! You call upon the plane of Air! -あなたは空気の飛行機を呼びます! +空に浮かぶ空気の玉を呼び出した! + + Summon Water Mote ウォーターモート召喚 Select where to put the water mote (cannot place on occupied squares) -水のかけらをどこに置くかを選択します(占有された正方形には配置できません) +配置する位置を選択(何もないマスのみ) Create a watery serpent which stuns enemies with its melee attack. -近接攻撃で敵を気絶させる水の蛇を作成します。 +ウォーターモートを召喚する。ウォーターモートは近距離攻撃で敵をスタンさせる。 A watery spirit bubbles up from the ground! -地面から湧き出る水の精霊! +ウォーターモートが呼びかけに応えた! You call upon the plane of Water! -あなたは水界を呼び求めます! +空に浮かぶ水の玉を呼び出した! + + Summon Shadow Warrior シャドーウォリアー召喚 Select where to put the shadow warrior (cannot place on occupied squares) -影の戦士を置く場所を選択します (占有されたマスには配置できません) +配置する位置を選択(何もないマスのみ) Call forth a shadow warrior for 16 turns who deals DamageDealt damage every other turn. -16 ターンの間、1 ターンおきにダメージを与えるシャドウ ウォリアーを呼び出します。 +16ターンの間、ターン毎に周囲にダメージを与える影の戦士を召喚する。 ...and the abyss answers! -…そして深淵が答える! +深淵が呼びかけに応じた! You call... -あなたが呼ぶ... +闇に呼びかける…… + + +Summon Nature Spirit +自然の精霊召喚 +Select where to put the nature spirit (cannot place on occupied squares) +配置する位置を選択(何もないマスのみ) +Create a natural spirit that fires vine projectiles and has a healing aura that restores HP to allies and regenerates your stamina. +自然の精霊を召喚する。自然の精霊は周囲の味方の体力とスタミナを回復するオーラを持ち、つるの魔法を発射する。 +A healing wisp appears! +ヒーリングウィスプが現れた! +You call upon the powers of nature! +自然の力に仮初めの命を吹き込んだ! + + + + + + Summon Golem -サモンゴーレム +ゴーレム召喚 Select where to put the golem (cannot place on occupied squares) -ゴーレムを置く場所を選択します(占有されたマスには配置できません) +配置する位置を選択(何もないマスのみ) Create a slow but powerful golem to fight by your side -あなたの側で戦うために、遅いが強力なゴーレムを作成します +強力なゴーレムを召喚する A golem arises! -ゴーレム出現! +土塊に魂が宿った! You stomp your foot and draw the words of life on the floor! -あなたは足を踏み鳴らし、床に人生の言葉を描きます! +魔力を込めて地を踏み、地面に真理の文字を刻んだ! + + Summon Decoy -サモンデコイ +デコイ召喚 Select where to create an illusion (cannot place on occupied squares) -イリュージョンを作成する場所を選択します (占有されたマスには配置できません) +配置する位置を選択(何もないマスのみ) Create a decoy for Duration turns. It attracts enemy attention and triggers traps. -Duration ターンのおとりを作成します。敵の注意を引き、トラップをトリガーします。 +Duration ターンの間、デコイを召喚する。敵の注意を引き、トラップを作動させる。 A shadow of yourself materializes! -自分の影が具現化! +自身の影が具現化した! You create a line on the ground and toss in a lock of your hair! -地面にラインを作り、髪を束ねます! +地面にラインを刻み、自身の髪を投げた! + + Feather Explosion 羽の爆発 + + Elastic Grip -弾性グリップ +ゴムの掌握 A latex hand reaches out and pulls an enemy close to you! Base pull strength: 4 -ラテックスの手が伸びて、近くの敵を引き寄せる! 引き寄せの基礎力: 4 +ゴムの手が敵を4マス引き寄せる。 You extend a rubbery hand and grab a foe! -ゴムのような手を伸ばして敵を掴め! +手の形にゴムを捏ね、敵を引き寄せた! There's an obstacle in the way! -途中で障害物が! +障害物に阻まれてしまった! Select a target to pull -引っ張るターゲットを選択 +ターゲットを選択 + + Slime Blast スライムブラスト -Apprentice's Slime -見習いのスライム Witch's Slime 魔女のスライム Rubber Explosion -ゴム爆発 +ゴムの爆発 Witch's Slime Ball 魔女のスライムボール +Robotic Arm +ロボアーム A pool of slime deals DamageDealt glue damage to enemies on impact and covers the area in temporary slime. -スライムのプールは、着弾時に敵にダメージを与える接着剤のダメージを与え、一時的なスライムでその領域を覆います。 +着弾時に DamageDealt ねばねばダメージを与え、周囲の床にスライムを生成する。 You conjure a pool of slime! -あなたはスライムのプールを呼び起こします! +スライムのプールを召喚した! Select where the slime will appear -スライムが出現する場所を選択 +位置を選択 + + Slime Eruption -スライム噴火 -A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them friefly. -スライムの巨大な爆発は、侵入した敵にダメージを与え、接着剤のダメージを与え、それらを簡単にバインドします。 +スライムの噴火 +A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them briefly. +スライムを噴火させ、範囲内の敵に DamageDealt ねばねばダメージを与える。 You conjure an explosion of slime! -スライムの爆発を引き起こします! -Select where the slime will appear -スライムが出現する場所を選択 +スライムの爆発を引き起こす! + + Slime Splash スライムスプラッシュ After one turn, deals DamageDealt glue damage in a small area and spreads slime. -1ターン後、狭い範囲にダメージを与えて接着剤ダメージを与え、スライムをまき散らします。 +1ターン後、狭い範囲内に DamageDealt ねばねばダメージを与え、周囲の床にスライムを生成する。 You conjure a small amount of slime! -少量のスライムを召喚します。 -Select where the slime will appear -スライムが出現する場所を選択 +小規模なスライムの爆発を起こした! + + Water Ball ウォーターボール -Fast projectile. Deals DamageDealt acid damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. -高速発射体。ダメージを与える酸のダメージを与えます。びしょ濡れのターゲットは +35% の電気/氷、-42% の火、および 50% の電気ダメージを与えます。 +### Fast projectile. Deals DamageDealt soap damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. + You hurl a ball of water! -あなたは水の玉を投げます! -Choose aim direction -照準方向を選択 +水弾を発射した! + + Tidal Sphere タイダルスフィア -Slow moving projectile, deals DamageDealt acid damage to enemies it passes thru. Leaves a large amount of water in its wake. -動きの遅い発射体で、通過した敵にダメージを与えます。通過した敵に酸のダメージを与えます。その後に大量の水が残ります。 +### Slow moving projectile, deals DamageDealt soap damage to enemies it passes thru. Leaves a large amount of water in its wake. + You raise a huge mass of water! -あなたは大量の水を上げます! -Choose aim direction -照準方向を選択 +水を魔力で押し固めて発射した! + + The boulder knocks you to the ground! -岩があなたを地面に叩きつけます! +岩に跳ね飛ばされた! The water covers you and drenches you! -水はあなたを覆い、あなたをびしょぬれにします! +水に全身を覆われ、びしょ濡れになってしまった! You step in water and become wet. -水に足を踏み入れると濡れます。 +地面の水のせいで服が濡れてしまった。 + + Ice Breath アイスブレス A field of icicles that deals DamageDealt damage on a hit and stuns briefly. -ヒット時にダメージを与え、短時間スタンさせるつららのフィールド。 +DamageDealt 氷ダメージを与え、スタン状態を付与するつららを生成する。 You breath out a chilling frost! -あなたは身も凍るような霜を吐き出します! +見も凍るような霜を吐き出した! Select where to put the icicles (SpellArea radius) -つららを置く場所を選択します (SpellArea 半径) -Zombie Orb -ゾンビオーブ -Lesser Zombie Orb -レッサーゾンビオーブ -Freezing Zombie Orb -凍結ゾンビオーブ -Mystic Bolt -ミスティックボルト -The mystic bolt paralyzes you! -ミスティックボルトはあなたを麻痺させます! +場所を選択 + + +The mummy's curse paralyzes you! +バスト教団の呪いで身体が痺れた! + + Rubber Bullets ゴム弾 You are hit by a fusilade of rubber bullets! -あなたはゴム弾の一斉射撃に見舞われました! +ゴム弾で撃たれた! The rubber bullets congeal into a slimy material on your body! -体の上でゴム弾が固まってヌルヌル! +ゴム弾が身体の上で固まった! + + Nature Blast ネイチャーブラスト Raging Vines レイジング・ヴァインズ -Magic Ribbons -魔法のリボン + + Magic Belts マジックベルト -Slime -スライム -Slime -スライム You project a pool of sticky slime! -あなたはねばねばしたスライムのプールを投影します! +スライムのプールを作り出した! Arrow of Love 愛の矢 You loose a glowing arrow! -光る矢を放つ! -Bondage Buster -ボンデージバスター +光る矢を放った! Blaster ブラスター You charge up a beam and fire it! ビームをチャージして発射! You swing your weapon and pull away the target's equipment! -武器を振り回し、対象の装備を引き離せ! +敵の武器を絡め取った! You swing Dragonslaver and it lashes out in a whip-like fashion! -ドラゴンスレイバーを振ると、ムチのように打ちのめされます! +ドラゴンスレイバーを振ると、ムチのようにしなった! The slime from your staff coats your body, granting you strange powers! -杖のスライムが体を覆い、不思議な力を授けます! +杖のスライムが体を覆い、不思議な力を得た! The power of the four elements flows through your veins! -あなたの血管には四大元素の力が流れています! -Firebolt -ファイアボルト +全身の血管に四大元素の奔流が流れ込む! An explosion knocks you to the ground! -爆発があなたを地面に叩きつけます! +爆発に吹き飛ばされた! + + Curious Spell -おさるの呪文 +混乱 You have been flummoxed! -あなたは当惑しました! -Cuff Bola -カフボラ -Throw Syringe -注射器を投げる +混乱した! + + You feel a prick as a small syringe hits you, and you start feeling drowsy... -小さな注射器が当たるとチクチクして眠くなる… +小さな注射器が刺さり、意識が薄れていく…… The thrown cuffs snap shut around your ankles and slow you down!!! -投げられた袖口が足首の周りでパチンと閉まり、速度が低下します!!! +投げつけられた枷が足首にはまり、上手く動けなくなった! Ribbon Burst リボンバースト Spores @@ -9357,267 +11547,339 @@ Noxious Spores Enticing Spores 魅力的な胞子 You inhale some spores, and feel a bit sleepy... -胞子を吸い込んで、ちょっと眠くなってきた…… +胞子を吸い込んで、少し眠くなってきた…… The spores make you feel excited! -胞子が気持ちいい! +胞子のせいでムラムラしてきた! The toxic spores make you feel faint... -有毒な胞子はあなたを気絶させます... +胞子を吸い込むと意識が薄れていく…… + + Magic Hairpin -魔法のかんざし +魔法のヘアピン The magic hairpin goes for your eyes and forces you to blink! -魔法のかんざしが目に飛び込んで強制的にまばたき! +魔法のヘアピンが目の近くに当たり、反射的に目を閉じてしまった! + + Ice Storm -氷雨 -Icy Aura -氷のオーラ +アイスストーム + + Icy Aura -氷のオーラ +アイスオーラ + + Slime Ball スライムボール -Witch's Slime Ball -魔女のスライムボール -A ball of slime leaves a trail of sticky slime (40 damage when stepped on). It deals DamageDealt glue damage on a hit. -スライムのボールが粘着性のスライムの跡を残す (踏むと 40 ダメージ)。ヒット時にダメージを与える接着剤のダメージを与えます。 +A ball of slime leaves a trail of sticky slime (20 damage when stepped on). It deals DamageDealt glue damage on a hit. +通過したマスにスライムを生成する、スライムの塊を発射する。塊にヒットすると DamageDealt ねばねばダメージを与える。生成されたスライムを踏むと20ダメージ。 You hurl a ball of slime! -あなたはスライムのボールを投げます! -Choose aim direction -照準方向を選択 +スライムの塊を投げた! + + Summon Skeleton サモンスケルトン Mass Summon Skeleton -大量召喚スケルトン +スケルトン祭り A skeleton arises from bones on the floor! -床の骨から骸骨が発生! +床に散らばる骨が人の形になっていった! A gang of SummonCount skeletons forms around you! -SummonCount スケルトンのギャングがあなたの周りに形成されます! +SummonCount のスケルトンが周囲に現れた! A gang of SummonCount zombies emerges from the floor! -SummonCount ゾンビのギャングが床から出現します。 +SummonCount のゾンビが周囲に現れた! A bunch of gags fly out from your satchel! -かばんからたくさんのギャグが飛び出します。 +かばんから大量の猿轡が飛び出してきた! + + A floating hand appears and cracks its knuckles! -浮遊する手が現れ、ナックルをパチパチ! +浮遊する手が現れ、唐突に指を鳴らした! A floating gag appears and starts flying toward you! -浮遊ギャグが現れてこちらに向かって飛んでくる! +猿轡がこちらに飛んできた! +A floating blindfold appears and starts flying toward you! +浮遊する目隠しがこちらに向かってきた! +A floating yoke appears and starts flying toward you! +浮遊するヨークがこちらに向かってきた! +A floating armbinder appears and starts flying toward you! +浮遊するアームバインダーがこちらに向かってきた! +A floating straitjacket appears and starts flying toward you! +浮遊する拘束衣がこちらに向かってきた! +A floating harness appears and starts flying toward you! +浮遊するハーネスがこちらに向かってきた! A set of shackles opens wide and starts going for your wrists! -シャックルのセットが大きく開き、手首に向けて動き始めます! +枷が開き、両手に向かって飛んできた! A swarm of shackles approaches you! -手枷の群れがあなたに近づいています! +手枷の群れが飛来した! +A swarm of gags approaches you! +猿轡の群れが飛来した! A cloud of locks and chains clatters as it levitates toward you! -ロックとチェーンの雲がカタカタと音を立ててあなたに向かって浮揚します! +鎖と錠前でできた雲がカタカタと音を立てながら向かってきた! A huge cloud of locks and chains clatters as it levitates toward you! -それがあなたに向かって浮揚するとき、ロックとチェーンの巨大な雲がカタカタと音を立てます! +大量の鎖と錠前の塊と空中衝突を起こしてしまった! Floating hands appear by the conjurer's side as she points her staff! -杖を向けると、召喚士の横に浮かぶ手が出現! +召喚士が杖を掲げると、浮遊する手が現れた! + + Floating books appear near the caster! -キャスター付近に浮遊本出現! +浮遊する本が詠唱者の近くに現れた! Dusty tomes appear near the caster! -ダスティ・トームがキャスターの近くに出現! +埃っぽい本が詠唱者の近くに現れた! Magical books appear near the caster! -魔法の本が術者の近くに出現! +魔法の本が詠唱者の近くに現れた! Sinister books appear near the caster! -キャスターの近くに邪悪な本が出現! +不吉な本が詠唱者の近くに現れた! Crackling books appear near the caster! -パチパチ本がキャスターの近くに出現! +ひび割れた本が詠唱者の近くに現れた! Glowing books appear near the caster! -キャスターの近くに光る本が出現! +輝く本が詠唱者の近くに現れた! Rubber-stained books appear near the caster! -キャスター付近にゴム汚れの本出現! +ゴム装丁の本が詠唱者の近くに現れた! Flaming books appear near the caster! -炎の本が術者の近くに出現! +燃え盛る本が詠唱者の近くに現れた! Frigid books appear near the caster! -極寒の本が術者の近くに出現! +氷漬けの本が詠唱者の近くに現れた! Devilish books appear near the caster! -術者の近くに魔性の書が出現! +悪魔の書が詠唱者の近くに現れた! + + A floating book appears near the caster! -キャスターの近くに浮かぶ本が出現! +浮遊する本が詠唱者の近くに現れた! A dusty tome appears near the caster! -キャスターの近くにダスティ・トームが出現! +埃っぽい本が詠唱者の近くに現れた! A magical book appears near the caster! -魔法の本が術者の近くに出現! +魔法の本が詠唱者の近くに現れた! A sinister book appears near the caster! -キャスターの近くに邪悪な本が出現! +不吉な本が詠唱者の近くに現れた! A crackling book appears near the caster! -キャスターの近くにパチパチ本が出現! +ひび割れた本が詠唱者の近くに現れた! A glowing book appears near the caster! -キャスターの近くに光る本が出現! +輝く本が詠唱者の近くに現れた! A rubber-stained book appears near the caster! -キャスターの近くにゴム汚れの本が出現! +ゴム装丁の本が詠唱者の近くに現れた! A flaming book appears near the caster! -キャスターの近くに炎の本が出現! +燃え盛る本が詠唱者の近くに現れた! A frigid book appears near the caster! -キャスターの近くに極寒の本が出現! +氷漬けの本が詠唱者の近くに現れた! A devilish book appears near the caster! -キャスターの近くに魔性の本が出現! +悪魔の書が詠唱者の近くに現れた! + + Your struggling leaves you aroused because of the RestraintName... -RestraintNameのせいで、あなたの苦労はあなたを興奮させます... +RestraintName のせいで、もがくと気持ちよくなってしまう…… You feel your restraints squeeze you and tingle with painful sensations! -あなたは拘束があなたを圧迫し、痛みを伴う感覚でチクチクするのを感じます! +拘束具に圧迫され、痛くて苦しくなってくる。 'Do not resist,' whispers a voice in your head... -『抵抗するな』頭の中でささやく声… +頭の中に「抵抗しないで」という声が響き渡る…… Your restraints squeeze you painfully without mercy! -あなたの拘束は容赦なくあなたを痛々しく圧迫します! +拘束具は容赦なく圧迫してくる。 The crystals emit a powerful energy! -クリスタルは強力なエネルギーを放出します! +クリスタルが強力なエネルギーを放った! You feel your body overflow with energy... -あなたの体はエネルギーであふれているのを感じます... +身体から力が溢れる…… The crystals react to your struggle attempts with a strange energy! -クリスタルは奇妙なエネルギーであなたの闘争の試みに反応します! +クリスタルから放たれるエネルギーのせいで、もがいても拘束が緩まない! + + Cast Spell (XXX turn delay) -呪文詠唱 (XXXターンディレイ) +魔法詠唱 (XXX ターン) + + You feel the vibrations leaving your body... -振動が体から離れていくのを感じる... +振動する快楽から解放された…… You feel your toys start to buzz... -おもちゃが鳴り始めるのを感じます... +オモチャが振動を始めた…… You your toys continue to buzz... -あなたのおもちゃは鳴り続けます... -The EnemyName remotely causes your toys to to buzz!!! -EnemyName はリモートでおもちゃを鳴らします!!! +オモチャは振動し続けている…… +The EnemyName remotely causes your toys to buzz!!! +EnemyName がオモチャを遠隔操作してきた! You feel the plugs inside you while walking. -歩いていると、プラグが詰まっているのを感じます。 -You feel a gentle buzz... -あなたは優しいうなりを感じます... -Your toys tease you gently... -あなたのおもちゃは優しくあなたをからかいます... -Your toys vibrate noticeably, feeling quite good... -あなたのおもちゃは著しく振動し、とても気持ちがいいです... +歩くと、ナカに入っているソレを感じてしまう。 +Your toys pulse and tingle occasionally. +オモチャが気まぐれに振動し、体が疼き出す…… +Your toys tease you and buzz gently... +オモチャが優しく振動している…… +Your vibrating toys are difficult to ignore... +オモチャが振動し、快楽に身体が熱くなってくる…… Your toys buzz strongly, making it difficult to concentrate! -あなたのおもちゃは激しく音を立てて集中できません! +オモチャが音を立てて激しく振動し、集中力を刈り取られる! You tremble as the toys give off intense vibrations! -おもちゃが強烈な振動を放ち震える! -Your toys torture you with intense vibrations! -あなたのおもちゃは激しい振動であなたを苦しめます! +オモチャが強烈に振動し、頭が真っ白になるほどの快楽が送られてくる! +Your toys torture you with intense pulsations! +オモチャは苦しいくらい激しく振動している! +Your whole body resonates with the intense stimulation! +強力な刺激に全身がヒク付いた。 +The stimulation is so intense you can hardly breath! +息ができない程の強烈な刺激だ! Your toys stop vibrating. -おもちゃの振動が止まります。 +オモチャの振動が止まった。 You feel slightly full as you move... -動くと少しお腹がいっぱい… +動くとナカに詰まったそれをはっきりと感じる…… Your movement disturbs the plugs inside of you... -あなたの動きはあなたの中のプラグを乱します... +動いたせいでプラグが…… The large plugs shift(s) around inside of you... -大きなプラグがあなたの中で動き回ります... +大きなプラグがナカでうねりだす…… The huge plugs rub(s) around constantly inside of you... -巨大なプラグがあなたの中で絶え間なくこすれています... +巨大なプラグがナカで暴れる…… Your movements are hobbled. -あなたの動きはよろめきます。 +よろめいてしまった。 Your hobbled movement disturbs the plugs inside of you. -あなたのよろめく動きは、あなたの中のプラグを乱します。 +よろめいたせいでプラグが…… The large plugs shift(s) around inside of you from your hobbled movement... -大きなプラグは、あなたのよろめく動きからあなたの中で動き回ります... +よろめいたせいで大きなプラグがうねりだした…… The massive plugs rub(s) around inside of you as you hobble forward... -前方に足を引きずり出すと、巨大なプラグが体の中でこすれます... +よろめいたせいで巨大なプラグがナカで暴れる…… You hop forward! -あなたは前進します! +飛び跳ねて前進した! You hop and feel the plugs shifting around inside your body. -飛び跳ねて、プラグが体の中で動き回るのを感じます。 +飛び跳ねるとプラグがナカで上下する。 The plugs shift in and out with each hop... -プラグはホップごとに出入りします... -The massive plugs slide in and out mercilessly as you hop... -巨大なプラグは、ジャンプすると容赦なくスライドします... +飛び跳ねるごとにプラグが激しく上下する…… +The massive plugs slide in and out sensually as you hop... +飛び跳ねるごとに大きなプラグが敏感な箇所を刺激する…… +You crawl forward! +這って進んだ。 +You crawl and feel the plugs shifting around inside your body. +這って進む度に体の中でプラグが動くのを感じる。 +The plugs shift in and out as you crawl... +這う度にプラグが前後する…… +The massive plugs slide in and out sensually as you crawl... +巨大なプラグが這う度に出入りする…… You inch forward slowly! -あなたはゆっくりと前進します! +ゆっくりと前進した! You inch forward, feeling the movement of your plugs. -プラグの動きを感じながら、少しずつ前に進みます。 +プラグをナカに感じながら、ゆっくりと前進した。 You wiggle your hips inching forward, feeling the plugs inside you... -あなたは腰を少し前に小刻みに小刻みに動かし、あなたの中にプラグを感じます... +一歩ごとに責め立てるプラグを感じながら、ゆっくりと前進した…… You wiggle forward, the massive plugs inside you digging in and out... -あなたは前に小刻みに動き、あなたの中の巨大なプラグが掘り出されます... +巨大なプラグに串刺しにされながら、小刻みになんとか前進した…… You crawl helplessly! -あなたはどうしようもなくクロールします! +ナメクジのような速度で這った! You crawl helplessly, feeling the plugs shifting around inside you. -あなたは無力にクロールし、プラグがあなたの中で動き回るのを感じます。 +プラグが動くのを感じながら、ゆっくりと這った。 You crawl and feel the plugs inside you rub around teasingly... -あなたは這って、中のプラグがからかってこすられるのを感じます... +ナカでこすれるプラグで感じながら、ゆっくりと這った…… You crawl helplessly, tormented by the massive plugs inside you... -あなたは無力にクロールし、あなたの中にある巨大なプラグに苦しめられています... +巨大なプラグに後ろから責め立てられながら、ゆっくりと這った…… You are unable to move! -あなたは動けません! +動けない! You wriggle uselessly, feeling the plugs shift inside you! -プラグがあなたの中でシフトするのを感じて、あなたは無駄にうごめきます! +プラグがナカで動くのを感じるも、身動きできずにもがくことしかできない! You wriggle uselessly, aroused by the plugs inside you! -あなたはあなたの中にあるプラグに興奮して、無駄にうごめきます! +プラグに責め立てられるも、身動きできずにもがくことしかできない! You wriggle uselessly, tormented by the massive plugs inside of you! -あなたは、あなたの中にある巨大なプラグに苦しめられて、無駄にうごめいているのです! +巨大なプラグに激しく責め立てられるも、身動きできずにもがくことしかできない! You climb into the grate -あなたは火格子に登ります +小さな隙間に入り込んだ。 + + Mmmph... -んー... +んん…… Mmmmmmmmm... -うーん… +んむぅぅぅ…… Hhmmpphh... -うーん… +ふむぅ…… Gghhhh!!! -ぐっ! +んぐぅっ! Mmmmmphh!!! -うーん! +うむぅぅ! Mmm... -うーん... +うぅ…… MMM!!! -うーん!!! +むぐぅ! Mmmmmm. -うーん。 +んむぉ…… + + Mmmaaaaahhh... -うーん… +んんぅぅぅっ…… Mmmmmmmmm~ -う~ん~ +むぅぅ…… Unnnghhh... -ううん… +うぅぅ…… Mmmmmmmphhh.. -むむむむ.. +むうぅ…… Mmmmmphh~ -う~ん~ +んむぉ~! Mmm~ -う~ん~ +ふーっ Mmmmm~~ -うーん~~ +ふーっ、ふーっ Mmmmmm~~~ -うーん~~~ +んんっ…… + + +Mmph... +ふぅ~っ…… +Mmmm! +ん”っ! + + +Hmmph. +ふぅぅっ +Mmmm... +んん…… +Mmmph. +むぅぅ + + +Mmmmmmph!!! +んんぉ! +Gmmmmph! +んぐぅぅっ! +Hmmmmph~!! +んん~っ! + + You are blinded! -あなたは盲目です! -You took DamageDealt damage! -あなたはDamageDealdダメージを受けました! -Your own rope trap springs upon you! -あなただけの縄の罠があなたにかかっています! +盲目になった! +You took DamageTaken damage! +DamageTaken ダメージを受けた! You get caught in sticky slime! -ねばねばスライムに巻き込まれるぞ! +スライムにつかまった! +You get caught in a sticky slime bubble! +スライムの泡に閉じ込められた! The slime ball sticks to you! -スライムボールがくっつく! +スライムボールがくっついてきた! The slime ball sticks to you and slows you! -スライムボールがくっついて遅くなる! +スライムボールがくっついて動きが鈍くなった! You feel a powerful sensation run through your body! -体中に強烈な感覚が走る! +全身に強烈な痛みが走った! +You feel a pleasurable sensation run through your body! +全身に強烈な快楽が走った! Beams of light wrap around your body and feel warm on your skin! -光のビームがあなたの体を包み込み、あなたの肌を暖かく感じます! +全身を光に包まれ、生暖かく感じた。 Crystals begin to form around your limbs! -手足の周りに結晶ができ始める! +手足の周りに結晶ができ始めた! A magic chain secures itself around your body! -魔法の鎖が君の体に巻きつく! +魔法の鎖が絡みついてきた! +An animated chain secures itself around your body! +動く鎖が全身に絡みついてきた! +A magic rope secures itself around your body! +魔法のロープが全身に絡みついてきた! +A magic belt secures itself around your body! +魔法のベルトが全身に絡みついてきた! A rope wraps itself around your body! -ロープが君の体に巻き付いてるよ! +ロープが全身に絡みついてきた! A ribbon animates and becomes entwined around you! -リボンが動き、絡みつく! +リボンが巻き付いてきた! A belt buckles itself tightly around your body! -ベルトはあなたの体の周りにしっかりとバックルを締めます! +ベルトが身体に絡みついてきた! A vine slithers across your body and tightens! -つるが体をすり抜けて引き締まる! +つるが身体を這い巡り縛り上げてきた! The spell hits you and slows you down! -呪文はあなたに当たり、あなたを遅くします! -Rope -ロープ +魔法が当たり、動きが鈍くなってしまった! +Witch's Rope +魔女の縄 Rope Tendrils ロープテンドリル -Blessed Wrappings -祝福のラッピング The Blessing 祝福 A long tendril emerges from the kraken's body! -クラーケンの体から長い巻きひげが生えた! +ロープクラーケンから触手が分離した! Coiled ropes spring up from the floor! -コイル状のロープが床から跳ね上がる! -A long tendril emerges from the kraken's body! -クラーケンの体から長い巻きひげが生えた! +コイル状のロープが床から跳ね上がってきた! Several glowing wrappings emerge! -光るラッピングが複数登場! +リボンが現れた! A glowing wrapping emerges and starts moving toward you! -光るラッピングが現れてあなたに向かって動き出します! +光る包帯が向かってきた! Rope Strike ロープストライク Animated Vines @@ -9631,23 +11893,27 @@ The elven arrow flashes and wraps you in mithril ropes! Ropes wrap themselves around your body from all sides! ロープが四方八方から身体を包み込む! Wrappings appear and wrap you head to toe! -ラッピングが現れて頭からつま先まで包み込む! -Ropes wrap themselves around your body from all sides! -ロープが四方八方から身体を包み込む! -Nature magic causes vines to sprout around you! -自然の魔法があなたの周りに蔓を生やします! +リボンに全身を包まれる! +A spell transforms your wrappings into hexed latex! +魔法が形を変え、六角形のゴムになり包みこんできた! +A spell engulfs you in wrappings! +魔法が形を変え、全身を包みこんできた! +Vines sprout around you and grab hold of your limbs! +周囲に蔦が生え、手足を掴まれた! Your clothes are stripped and replaced! -あなたの服は剥ぎ取られ、取り替えられます! -Your clothes are stripped and replaced! -あなたの服は剥ぎ取られ、取り替えられます! +無理やり着替えさせられた! Vines tear off your clothes! -つるが服を引きちぎる! +つるに服を奪われた! Restraints materialize on your body! -拘束が体に現れる! +突然拘束具が身体に現れた! + + The orb explodes into a burst of ribbons! -オーブが炸裂してリボンが弾ける! +オーブが炸裂してリボンが弾けた! The orb tears off your clothes! -オーブが服を引きちぎる! +オーブに服を奪われた! + + Charm Trap チャームトラップ Ribbon Trap @@ -9658,8 +11924,6 @@ Mummy Trap ミイラトラップ Rope Trap ロープトラップ -Rope Trap -ロープトラップ Holy Rope Trap ホーリーロープトラップ Belt Trap @@ -9670,331 +11934,22574 @@ Slime Trap スライムトラップ Chain Trap チェイントラップ +Shadow Latex Trap +シャドーラテックストラップ +Demonic Sigil +悪魔の印 +Unstable Crystals +不安定なクリスタル Gas Trap ガストラップ -Gas Trap -ガストラップ -Sleep Dart -スリープダーツ +Latex Engulfment +巻き付くゴム +Latex Spherification +ゴム球体トラップ Sleep Dart スリープダーツ + + A talisman on the floor explodes, sending a cloud of charms flying around you! -床のタリスマンが爆発し、魔法の雲があなたの周りを飛んでいます! +床のタリスマンが爆発し、動くリボンが周囲に現れた! Magical binding ribbons emerge from the walls! -魔法の結束リボンが壁から出現! +魔法のリボンが壁の隙間から伸びてきた! The ceiling opens, letting a lot of shackles fall on you! -天井が開いて足枷がたくさん落ちてくる! +天井が開いて枷が大量に落ちてきた! Bands of glowing wrappings start flying in from all sides! -光るラッピングの帯が四方八方から飛んでくる! +光る包帯が四方八方から飛んできた! Ropes slither out towards you from between the bricks! -レンガの間からロープがあなたに向かって伸びています! +レンガの隙間からロープが伸びてきた! Ropes fall on you from all sides! -ロープが四方八方からあなたに落ちます! +ロープが天井から降ってきた! A constellation of ropes surrounds you! -ロープの星座があなたを取り囲んでいます! +大量のロープに囲まれてしまった! Leather restraints start appearing around you! -あなたの周りに革の拘束具が現れ始めます! +突然革の拘束具が周囲に現れた! high-tech cables come out from the floor! -ハイテクケーブルが床から出ている! +ハイテクケーブルが床からせり上がってきた! Slimes pours out from the walls and ceiling! -壁や天井からスライムが溢れ出す! +壁や天井からスライムが溢れ出してきた! Ethereal chains appear all around you! -あなたの周りにエーテルチェーンが現れます! -You hear the sound of glass breaking, and a cloud of green gas rises around you! -ガラスが割れる音が聞こえ、緑色のガスの雲があなたの周りに立ち昇る! +周囲を鎖に取り囲まれた! +Shadows constrict around you! +影が周囲を包み込んだ! +An otherworldly sigil appears below you! +異界の紋章が周囲を包み込んだ! +Crystals rise up around you! +周囲にクリスタルが浮かび上がった! +Something shiny seems to be stretched out over the floor! +床から光る何かが伸びてきた! +A rubber bubble starts forming around you! +ゴムの泡が周囲を覆う! +A rubber ball starts forming around you! +ゴムの球体が周囲に現れた! You hear the sound of glass breaking, and a cloud of pink gas rises around you! -ガラスが割れる音が聞こえ、ピンク色のガスの雲があなたの周りに立ち昇る! +ガラスが割れる音が聞こえ、ピンク色のガスが周囲に立ち込めた! +You hear the sound of glass breaking, and a cloud of green gas rises around you! +ガラスが割れる音が聞こえ、緑色のガスが周囲に立ち込めた! The charms stick themselves all over your body! -チャームが全身に張り付く! +リボンが全身に張り付いた! +### A metal pole catches you from below! + The ribbons tie themselves tightly around your body and won't let go! -リボンが体に密着して離れない! +リボンが体に密着してきた! Shackles close themselves over your limbs! -足枷があなたの手足を覆う! +枷が手足に取り付いてきた! The wrappings close in over your body! -包みが体に迫る! +光る包帯が全身を包み込む! The ropes wrap themselves around your body! -ロープが体に巻きつく! +ロープが体に巻きついてきた! The ropes wrap themselves tightly around your body! -ロープがきつく体に巻き付いてる! +ロープが全身に巻き付いてきた! The holy ropes secure themselves upon your body! -聖なるロープがあなたの体に固定されています! +聖なるロープが巻き付いてきた! The leather restraints attach themselves to your body! -革の拘束具が体にくっつく! +革の拘束具が体に取り付いてきた! The high-tech cables wrap themselves over your body! ハイテクケーブルが体を包み込む! The slime pours all over you! -スライムが全身に降り注ぎます! +スライムが全身に降り注いだ! +A giant cube of latex engulfs you! +巨大なゴムの塊が包み込んできた! +A giant bubble of latex engulfs you and inflates, sealing you in! +巨大なゴムの泡に包み込まれてしまった! +A giant latex ball swallows you and inflates, sealing around your neck! +巨大なゴムのボールに首から下を飲み込まれてしまった! +A sinister power wraps itself around you and solidifies! +不吉な力が全身を包み、固まっていく! +Dark magics swirl around you and solidify into shiny rubber! +闇の魔法が渦巻き、輝くゴムに変化した! +Crystals grow and spread across your limbs! +結晶が急成長し、手足に広がる! The magic chains wrap themselves around your body! -魔法の鎖があなたの体を包み込みます! +魔法の鎖に包まれてしまった! Your clothes are getting ripped away! 服が破れそう! You feel a prick as a small dart hits you, and you start feeling drowsy... -小さなダーツが当たるとチクチクして眠くなる… +小さなダーツが当たると、急激に眠気に襲われた…… You breathe in the gas, and a wave of pleasure hits your whole body. -ガスを吸い込むと、喜びの波が全身を襲います。 +ガスを吸い込むと、全身が性感帯になったかのように感じた。 You breathe in the gas, and feel lethargic... -あなたはガスを吸い込み、無気力を感じます... -Inventory -在庫 -Reputation -評判 +ガスを吸い込むと、力が抜けていった…… +### You hear a mechanism trip... + +Items +インベントリ +Rep +関係性 Spells -呪文 +魔法 Learn New Spells -新しい呪文を覚える +新しいスキルを覚える Click a spell to replace SPELLNAME with. -SPELLNAME を置き換える呪文をクリックしてください。 +SPELLNAME を置き換えるスキルをクリック。 Empty Slot 空きスロット Back to Spellbook 魔法書に戻る Return to Game ゲームに戻る -Spell Tree -スペルツリー + + +Known Abilities +習得済み Elemental Spells -エレメンタルスペル +精霊魔法 Conjuration Spells -召喚呪文 +召喚魔法 Illusion Spells -幻惑の呪文 -Upgrades -アップグレード +幻惑魔法 Perks -特典 +パーク Perks II -パークⅡ +パーク2 Perks III -パークⅢ +パーク3 + + pg. NUM/TOTAL -pg.NUM/TOTAL -> -> -< -< ->>> ->>> -<<< -<<< +ページ NUM/TOTAL +### > + +### < + Spell Points: SPELLPOINTS -スペルポイント:SPELLPOINTS +スキルポイント: SPELLPOINTS You need a higher level in SCHOOL magic to learn this spell. -この呪文を習得するには、SCHOOL マジックのより高いレベルが必要です。 +このスキルを習得するには、SCHOOL 分野のより高度な知識が必要。 You need more spell points. -もっとスペルポイントが必要です。 +スキルポイントが足りない。 You don't have enough maximum mana to cast this spell! -この呪文を唱えるのに十分な最大マナがありません! -School: -学校: -Elements -要素 -Conjuration -召喚 -Illusion -イリュージョン +最大マナを超える魔法は覚えられない。 +School: +分野: Generic -ジェネリック +共通スキル +Upgrade +アップグレード +Special +スペシャル Learn Spell -呪文を覚える -Spell Points: -スペルポイント: -Level: -レベル: -Spell Point Cost: -スペル ポイント コスト: - Mana Cost: - マナコスト: +スキルを覚える +Spell Points: +スキルポイント: + + +Level: +レベル: +Spell Point Cost: +スキルポイントコスト: +Mana Cost: +マナコスト: Remove Spell 1 -スペル1を削除 +スキル1を削除 Remove Spell 2 -スペル2を削除 +スキル2を削除 Remove Spell 3 -スペル3を削除 +スキル3を削除 Remove Spell 4 -スペル4を削除 +スキル4を削除 Remove Spell 5 -スペル5を削除 +スキル5を削除 Remove Spell 6 -スペル6を削除 +スキル6を削除 Remove Spell 7 -スペル7を削除 +スキル7を削除 Replace Spell 1 -リプレイススペル1 +スキル1を置き換える Replace Spell 2 -リプレイススペル2 +スキル2を置き換える Replace Spell 3 -リプレイススペル3 +スキル3を置き換える Replace Spell 4 -リプレイススペル4 +スキル4を置き換える Replace Spell 5 -リプレイススペル5 +スキル5を置き換える Replace Spell 6 -リプレイススペル6 +スキル6を置き換える Replace Spell 7 -リプレイススペル7 - Current Spell 1: - 現在の呪文 1: - Current Spell 2: - 現在の呪文 2: - Current Spell 3: - 現在の呪文 3: - Current Spell 4: - 現在の呪文 4: - Current Spell 5: - 現在の呪文 5: - Current Spell 6: - 現在の呪文 6: - Current Spell 7: - 現在の呪文 7: -??? -??? +スキル7を置き換える +Current Spell 1: +現在のスキル 1: +Current Spell 2: +現在のスキル 2: +Current Spell 3: +現在のスキル 3: +Current Spell 4: +現在のスキル 4: +Current Spell 5: +現在のスキル 5: +Current Spell 6: +現在のスキル 6: +Current Spell 7: +現在のスキル 7: + + +### ??? + +Unfiled +未分類 Adventuring 101 -冒険101 +冒険のススメ History 歴史 Bondage Witchery ボンデージウィッチャリー Enemy Notes -敵ノート -Graveyard -墓地 -Catacombs -カタコンベ -Jungle -密林 +エネミー図鑑 +Overgrown +蔦覆 Temple -寺 +秘匿された神殿 Tombs -墓 +遺跡 Library 図書館 -Crystal Cave -水晶の洞窟 -Orrery -オーラリー Bellows -ベローズ +ふいご +Coast +海岸 +Ejahl +エヤール + + (A page from the Book of Aeons)|The 'Graveyard' is a peculiar place. Long ago, human beings lived and died just like the animals. When the Old Civilization existed, they would come to bury their dead in the Graveyard. It remains a mystery why so many of the former dead seem to be alive. Some say that when the Old Civilization cast the spell that spell which overcame Death, even those buried in their graves would rise again. Others simply say that there is a powerful necromancer who lives here, toying with the dead as if they were pets... -(Book of Aeons のページ)|墓地は独特の場所です。昔、人間は動物と同じように生き、死んでいました。旧文明が存在したとき、彼らは死者を墓地に埋めに来ました。なぜかつての死者の多くが生きているように見えるのかは謎のままです. ある人は、旧文明が死を克服する呪文を唱えたとき、彼らの墓に埋葬された人でさえも復活したと言う. 他の人は、強力なここに住むネクロマンサーは、まるでペットのように死者をもてあそぶ… +アイオーンの書の1ページ|墓地は不思議な場所だ。現代と同じように旧文明の死者もここに埋葬されていたのであろうが、今では死者が闊歩している。ある人は、旧文明が死を克服する魔法を唱えた時、墓地に眠る者たちも蘇ったのだという。またある人は、恐るべきネクロマンサーが死者を玩具のように扱ってるとも…… (A page from the Book of Aeons)|Beneath the Graveyard lies a relic of a former age, a network of tombs inhabited by the immortal followers of Bast. Very few were graced with this gift of immortality before the great archmagus, Sariel Vinlaga, stole this power from the gods and granted all humans with the power of immortality. The Bast followers are still set in their ways, hoping for a time when their Goddess will return and rebuild their glorious civilization. -(Book of Aeons の 1 ページ)|墓地の下には、バストの不滅の信奉者が住んでいた墓のネットワークである、前世の遺物があります。偉大な大魔術師、サリエル ヴィンラーガの前に、この不死の贈り物を授かった人はほとんどいませんでした。 、神々からこの力を盗み、すべての人間に不死の力を与えました. バスト信者は、女神が戻ってきて輝かしい文明を再建する時を期待して、まだ自分たちのやり方に固執しています. +アイオーンの書の1ページ|墓地の下には、バスト教の不死の信者が巣食う巨大な遺跡がある。偉大な大魔術師、サリエル・ヴィンラーガに不死の秘術を盗まれ、世界中に広まるまで、彼女たちが唯一の不死者であった。バスト教団は未だに女神の復活と文明の再建を諦めておらず、遺跡に侵入する愚かな犠牲者を探し求めている。 (A page from the Book of Aeons)|Some say the 'Catacombs' are older than time itself. When the Old Civilization began to study immortality, no one knew if it would be possible to bring back those who already died. The Catacombs therefore were used to store all of the remains of former humans, so that they too could be revived when the archmagus would finally make her breakthrough. -(Book of Aeons のページ)|『カタコンベ』は時間自体よりも古いと言う人もいます。旧文明が不死の研究を始めたとき、すでに死んだ人々を生き返らせることができるかどうかは誰にもわかりませんでした。カタコンベしたがって、大魔術師が最終的に彼女の突破口を開いたときにそれらも復活できるように、元人間のすべての残骸を保管するために使用されました。 +アイオーンの書の1ページ|このカタコンベは時間の概念がないと言われている。旧文明が不死の研究を始めたとき、すでに死んだ人々を生き返らせられるかどうかは分からなかった。この場所は、不死の魔術が完成したときに備えて遺体を保存するために作られたと言われている。 (A page from the Book of Aeons)|They say that Archmagus Sariel Vinlaga studied in this very library. Having gathered together all of human knowledge, magical, spiritual, technological, she tasked her twelve lesser magi with the job of sorting and collating the wealth of knowledge she had acquired. No one knows why she suddenly abandoned it, or why it remains in such disrepair today. -(Book of Aeons のページ)|大魔術師サリエル ヴィンラガがまさにこの図書館で学んだと言われています。人間の知識、魔法、精神、技術のすべてを集めた彼女は、12 人の下位の魔術師に分類と照合の仕事を課しました。彼女が獲得した豊富な知識. なぜ彼女が突然それを放棄したのか、なぜそれが今日のように荒廃したままなのかは誰にもわかりません. -(A page from the Book of Aeons)|The Underground Jungle remains a puzzle to scholars. Hardly any light comes through the cracks in the ceiling, and yet the jungle teems with life. It is known that the regenerative powers that keep humans from dying relies on an individual's own mana supply. So how do plants and beasts without mana survive? The devout say it is the Goddess of Restoration who preserves the jungle, but could it be that the Old Civilization developed a means of sustaining life underground? -(Book of Aeons の 1 ページ)|地下ジャングルは学者にとって謎のままです。天井の割れ目から光が差し込むことはほとんどありませんが、ジャングルには生命があふれています。死ぬことは、個人自身のマナ供給に依存しています. では、マナのない植物や獣はどのように生き残るのでしょうか? 敬虔な人々は、ジャングルを維持するのは回復の女神だと言います, しかし、旧文明は地下で生命を維持する手段を開発したのでしょうか? +アイオーンの書の1ページ|この大図書館は、大魔術師サリエル・ヴィンラーガの学んだ場所と言われている。人間の知識、魔法、精神、技術のすべてを集めた彼女は、12人の高弟達に司書の仕事を託し、去っていったと言われている。彼女がなぜ去ったのか、なぜ図書館が荒れ果てているのかは、未だ解明されていない。 +### (A page from the Book of Aeons)|The Overgown Ruins remain a puzzle to scholars. Hardly any light comes through the cracks in the ceiling, and yet the area teems with life. It is known that the regenerative powers that keep humans from dying relies on an individual's own mana supply. So how do plants and beasts without mana survive? The devout say it is the Goddess of Restoration who preserves the jungle, but could it be that the Old Civilization developed a means of sustaining life underground? + (A page from the Book of Aeons)|The problem of Energy has plagued civilization for millenia. Before the leylines were discovered, humankind relied on natural sources of power such as rivers and firewood. When the Crystal Caves were discovered, a great revolution occurred. No longer reliant on natural sources, civilizations could tap the wellsprings of chaotic energy underground to power machinery like never seen before. -(Book of Aeons のページ)|エネルギーの問題は何千年もの間、文明を悩ませてきました。レイラインが発見される前、人類は川や薪などの自然の力の源に依存していました。クリスタル ケーブが発見されたとき、大きな革命が起こりました。もはや自然源に頼らず、文明は地下の混沌とし​​たエネルギーの源を利用して、これまでに見たことのないような機械に動力を与えることができます。 +アイオーンの書の1ページ|エネルギー問題は何千年にもわたって人類を悩ませてきた。レイラインが発見される前、人類は自然の力に頼って暮らしてきた。クリスタルの洞窟が発見された時、革命が起こった。無尽蔵に湧く地下のエネルギー源を利用して、見たこともない機械を動かせるようになった。 (A page from the Book of Aeons)|The 'Lost Temple' as they call it, is a subject of great speculation. It seems that its creators worshipped only four creator goddesses, rather than all the Eight. It was perhaps abandoned several hundred years ago when a flood caused great panic, and it seems that this must have occurred before humanity was made immortal by the archmagus, as there are many remains still found inside. -(Book of Aeons のページ)|彼らが失われた寺院と呼んでいるものは、大きな憶測の対象となっています。その作成者は、8 人のすべての作成者の女神ではなく、4 人の作成者の女神のみを崇拝していたようです。 100 年前に大洪水が起こって大パニックになったとき、これは大魔術師によって人類が不滅になる前に起こったと思われ、内部にはまだ多くの遺体が発見されています。 +アイオーンの書の1ページ|「秘匿された神殿」という名称は、そこに住まう者たちから借りた仮名にすぎない。神殿の作成者は、8 人の女神ではなく、4 人の女神のみを崇拝していたようだ。 100年前の大洪水の時、大魔術師によって人類が不滅になる前に作られたと見られ、内部には多くの遺体が未だ残っている。 (A page from the Book of Aeons)|The Stars have been a mystery to scholars since the beginning of time. At one point, humans believed that every star was a god, and they made offerings by throwing sugar into the night, thinking that as the stars were innumerable, so were the grains of sugar that pleased humans so much. Religion has moved past that, but the Orrery remains a relic from a time when humanity worshipped the stars rather than the Eight. -(Book of Aeons の 1 ページ)|星は太古の昔から学者にとって謎でした。ある時点で、人間はすべての星が神であると信じていました。星が無数にあるように、砂糖の粒も人間をとても喜ばせた.宗教はそれを過ぎてしまったが、オーラリーは人類がエイトではなく星を崇拝した時代の遺物のままである. +アイオーンの書の1ページ|星は太古の昔から神秘の対象であった。かつて人は空を見上げ、すべての星々を神と讃えた。星が無数にあるように、砂糖の粒も人間をとても喜ばせた。宗教はそれを過ぎてしまったが。オーラリーは人々が女神ではなく星を崇拝していた時代の名残である。 (A page from the Book of Aeons)|The 'Bellows' is the nickname given to the primitive facilities of the Old Civilization, buried deep beneath the ground. While much of it remains in disrepair, many of the Old Civilization's successors have attempted to keep it in good working order, as the technology is precious and impossible to replicate with modern methods. It seems that many of these successors have fallen prey to some delusions about its purpose, as much of the equipment preserved has little use aside from collecting prisoners. -(Book of Aeons のページ)|ふいごは、地中深くに埋められた旧文明の原始的な施設に付けられたニックネームです。その多くは荒廃したままですが、旧文明の後継者の多くは、技術は貴重であり、現代の方法で複製することは不可能であるため、正常に機能するように維持する. 保存されている機器の多くは収集以外の用途がほとんどないため、これらの後継者の多くはその目的についての妄想の餌食になっているようです.囚人。 +アイオーンの書の1ページ|「ふいご」というのは、旧文明の原始的な施設に付けられたニックネームだ。現代の技術では複製も再製もままならず、大部分は荒れ果てているが、一部の施設は旧文明の後継者が未だに維持している。そして、保存されているものの大半は人を捕獲するためのものであり、後継者はそれらを使う機会を伺っている。 + + (Preface from the journal of Catherine Willows, well-known explorer who vanished in the dungeon 30 years ago) I am writing this journal in the off chance that I do not come back in my search for the Mistress' staff. If you find this, please make an effort to deliver it back to the surface for the good of all the young women lured by its secrets. -(30 年前にダンジョンで行方不明になった有名な探検家、キャサリン・ウィロウズの手記からの序文)ミストレスのスタッフを探しに戻ってこないかもしれないという思いで、この日誌を書いています。これは、その秘密に魅了されたすべての若い女性のために、それを表面に戻すように努力してください. +30年前にダンジョンで行方不明になった有名な探検家、キャサリン・ウィロウズの手記からの序文|女王の杖を探しに出ましたが、もう二度と地上には帰れない気がするのでこの日記を記します。杖を求める全ての若い女性のために、どうかこの日記を地上に持ち帰ってください。 (Pg. 24 from Catherine Willows' journal) Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?' -(キャサリン・ウィローズの日記の 24 ページ) ミストレスの墓の上階をこてでこねる多くの人は、しばしば修辞的に尋ねます。侵入者? +キャサリン・ウィローズの日記の 24 ページ |女王の杖を探し求めて上層部をさまよう方々は、しばしば「どうして宝箱に致命的な罠ではなく、変態な罠ばかり仕掛けられているのだ」とよく尋ねられます。 (Pg. 25 from Catherine Willows' journal) ...They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence. -(キャサリン・ウィローズの日記の 25 ページ) ...彼らは重大な間違いを犯している: 宝箱は閉じ込められていない.精霊として知られる下位の神々も金を愛していますが、私たちが知っている神々とは異なり、これらの下位の霊は祭壇で金を消費することはできません。神々のように一挙に襲い掛かる. したがって、彼らは金が置かれている場所に物理的に生息し、その心地よい本質をゆっくりと排出する必要があります. -(Pg. 26 from Catherine Willows' journal) So the question is not why did somebody lay these traps. The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. -(キャサリン・ウィローズの日記より 26 ページ) ですから、問題はなぜ誰かがこれらの罠を仕掛けたのかではありません。答えは、それらがまったく罠ではないということです。そして、古い文明が滅び​​、複合施設全体が地面に沈んだとき、精霊を追い払い、2階に住むのを防ぐ人はもういませんでした. なぜあなたの典型的な種類ではなく、一般的に多くの制限があるのか精霊の...まあ、私たちはミストレスが自分自身を取り囲んでいたことを知っています。 +キャサリン・ウィローズの日記の 25 ページ|しかし、その考えは根本的に間違っているのです。本来、このダンジョンの宝箱に罠など仕掛けられていないのです。私たちの経済はお金で動いており、神々は私たちが金を与えるからこそ、日々の問題に介入できますよね。精霊は小さな神々ともいえ、同じようにお金を愛しますが、神々のように祭壇で大量にお金を消費する事ができません。なので、お金の置かれている宝箱の中に入り込み、エネルギーをゆっくりと吸収していくのです。 +(Pg. 26 from Catherine Willows' journal) So the question is not 'why did somebody lay these traps.' The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. +キャサリン・ウィローズの日記の 26 ページ|故に「誰が」「どうして」罠を仕掛けたか、という問いは見当違いであり、箱から飛び出すモノを我々が勝手に罠だと定義しただけなのです。おそらく、このダンジョンの上層部は死者を供養する場所であったのでしょう。旧文明が滅び、ダンジョン全体が地中に埋もれた際に、精霊をこの場から追い払うものがいなくなり、彼女たちは住心地の良いこの場所に溜まっていったと推測しております。一般的な幽霊ではなく、拘束具が出てくる理由は……おそらくこのダンジョンの主が関係しているでしょう。 (The note starts with a drawing of a witch with many chains hanging from her body) She can block melee attacks with her chains. However, they conduct lightning and heat directly to her body, and I was able to take out her chains with bolt cutters. -(メモは、体からぶら下がっている多くの鎖を持つ魔女の絵から始まります)彼女は彼女の鎖で近接攻撃を防ぐことができます.しかし、それらは彼女の体に直接雷と熱を伝導します.ボルトカッター。 +メモは、身体に大量の鎖をぶら下げる魔女の絵から始まる|鎖の魔女は(当然ながら)身にまとう鎖で近接攻撃を防いでくる。が、鎖は電気をよく通し、彼女に効率よくダメージを与えられる。また、ボルトカッターさえあれば鎖を断ち切ることも可能だろう。 (The note starts with a drawing of a witch with lightning crackling from her fingertips) Water will cause her to short-circuit. I can't seem to hit her with lightning, though. She always redirects it. -(メモは、指先から稲妻がパチパチと鳴る魔女の絵で始まります)水は彼女をショートさせます。しかし、私は彼女に稲妻を当てることはできないようです.彼女はいつもそれをリダイレクトします. +メモは、指先から稲妻をほとばしらせる魔女の絵から始まる|水濡れにしてやれば、彼女をショートさせられる。しかし、電気属性同士での勝負はおすすめしない。彼女は打ち返す術をよく知っている。 (The note starts with a drawing of a witch whose body is partly gelatinous) The slime is non-flammable and my attacks pass right through her body... Lightning and ice seem to be effective! -(音符は体の一部がゼリー状になった魔女の絵から始まる)スライムは不燃性で、私の攻撃は彼女の体を通り抜けます...雷と氷は効果があるようです! +メモは体の一部がゼリー状になった魔女の絵から始まる|スライムは不燃性で、殴りかかっても全然効果がない。雷と氷なら効くようだ。 (The note is from a famous escape artist) Many restraints are applied quite tightly by a skilled rigger. Even removing it will be tough without thrashing around a bit to loosen it. -(有名な脱出アーティストからのメモです)熟練したリガーによって多くの拘束が非常にきつく適用されます。それを緩めるために少しもたもたしないと、それを外すことさえ難しいでしょう。 +有名な脱出師のメモ|このダンジョンに住まうものは皆拘束具の扱いが上手い。力や技に頼るのではなく、刃物や地形等で少しでも拘束具を削らないと、脱出は困難だ。 (The note is from a famous escape artist) Anything can be unbuckled with enough patience. Having a finger extension such as a lockpick will help. Ultimately, though, what matters is that you have a calm state of mind, free from distraction and hopelessness. -(メモは有名な脱出アーティストからのものです)十分な忍耐力があれば、何でも外すことができます。ロックピックなどの指の拡張機能が役立ちます。絶望。 +有名な脱出師のメモ|忍耐力さえあればいつかは拘束から抜け出すこともできるが、器用な指を使ったりロックピックを使うことも大事だ。 (The note is from a famous cartographer) In my lapse of judgement, I decided to borrow some mana from the nearby shrine to the Latex goddess. While there was no immediate response to my faux pas, I soon found myself pursued by a swarm of slimes! -(メモは有名な地図製作者からのものです)私の判断の誤りで、私は近くの神社からラテックスの女神にマナを借りることにしました。スライムの! +有名な地図製作者のメモ|ラテックスの祭壇からマナを拝借しようとしたのが間違いだった。気がついたら、スライムの大群に囲まれていた。 (A letter between bandit leaders) One of my subordinates has been reporting a girl bound in heavy leather restraints running around. I told her that this is normal, people keep all kinds of servants around here. But definitely keep an eye out for intruders! Don't let them fool you! -(盗賊団長同士の手紙)私の部下の一人が、重い革の拘束具に縛られて走り回っている女の子を報告しています.私は彼女に、これは正常であり、人々はあらゆる種類の使用人をこの周りに置いている.だまされるな! +盗賊団長同士の手紙|部下の一人が、革の拘束具で縛られた少女が走り回っていると報告してきたんだ。だから私はこの程度普通のことだと言ってやった。この辺りにはいろいろな使用人がいるのだ。そして、彼女らに扮して侵入しようとする奴らに気をつけろとも。 (The note is a letter from the school of conjuration) We really would like to know... why did you summon a frog in the laboratory? People are wondering, you know. One of the student's projects got eaten. -(メモは召喚術学校からの手紙です)本当に知りたいのですが…なぜ研究室でカエルを召喚したのですか?人々は不思議に思っていますよね。学生のプロジェクトの1つが食べられました。 +召喚術学校からの手紙|どうして研究所でカエルなんか召喚したんですか?学生さんのプロジェクトが一つ食べられてしまったんですよ。 (You find a carving on the floor, a half-finished magic circle of celestial conjuration. Perhaps a cleric wished to call forth an angel for guidance, before realizing there was a shrine a short walk away, where she could contact the heavens much more easily.) -(床に彫刻があり、天体召喚の半分完成した魔法陣です。聖職者はおそらく、天使を呼び寄せて導きを求めたかったのでしょうが、歩いてすぐのところに神社があり、そこで彼女は天とたくさん連絡を取ることができることに気づきました。もっと簡単に。) +(床に中途半端な召喚陣が彫ってある。おそらく天使を召喚しようとしたのだろう。聖職者が天使を呼び、啓示を得たかったと思われる。だが近くに祭壇があり、より簡単に神に会えると気づいたのだろう。) (It looks like a... receipt) Thank you for your offering to CELESTIAL COMMERCE. Please accept this fine-quality steel blade as compensation for your continued devotion and selflessness. -(領収書のようです)CELESTIAL COMMERCE への提供に感謝します。あなたの継続的な献身と無私無欲の代償として、この上質な鋼の刃を受け取ってください。 -(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter than she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. -(筆記体で書かれたメモ)私たちの宅配便業者を攻撃し、ここに縛り付けたままにした人へ:幻想の女神の神社はこのように使用されるべきではありません。あなたのスケベな実験の対象が必要な場合は、試してみてください.ですから、地元の人の 1 人に対して、そして天国のために、あなたが彼女を縛るためだけに天使の宅配便業者を呼び出すことはありません. 彼女が同意したかどうか、またはあなたが支払ったかどうかは問題ではありません.幻想の女神の執行者、HERONA。 +領収書|商業の神へのご献金、誠にありがとうございます。あなたの継続的な献身と無私無欲の代償として、この上質な鋼の刃を受け取ってください。 +(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter that she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. +筆記体で書き綴られたメモ|我らの運び屋を襲い、ここに縛り付けておいた者へ。幻惑の女神の祠をこのような行為で侮辱するな。淫らな研究をしたいのなら、自身の奴隷なりなんなりを使え。縛るためだけに天使を召喚するなど、断じて許される行為ではない。金銭の問題でも、彼女の同意の問題でもない。幻惑の女神の代行者ヘローナより。 (From an essay titled 'On Celestial Supply Chains') It is known that the heavens seek gold. We do not know why it is that the heavens seek it, but we do know that the Goddesses grant us fragments of their limitless power in exchange for this otherwise-useless metal we dredge up from the earth. They care about it so much that shrines are commonplace, each hosting an angelic courier lying in wait for any adventurer willing to part with hers. -(天体のサプライチェーンについてというタイトルのエッセイより)天が金を求めていることは知られています。なぜ天がそれを求めているのかはわかりませんが、女神が無限の力の断片を私たちに与えてくれることは知っています.私たちが地球から掘り起こしたこの無用な金属と交換する. 彼らはそれをとても気にかけているので、神社はありふれたものであり、それぞれが彼女と別れることをいとわない冒険者を待っている天使の宅配便をホストしています. +天体のサプライチェーンについてというタイトルのエッセイより|天が金を求めることはよく知られている。なぜ天界が金を求めるのかはわからないが、女神たちは、我々が大地から掘り起こすこの無用の金属と引き換えに、その力の一部を我々に与えてくれる。女神たちは金をとても大切にしているため、祠はどこにでもあり、その祠には天使がいて、金を捧げる信者を待っている。 They say that the maiden who safeguards the graveyard is kind to her pets... -墓場を守る乙女はペットに優しいって… -They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Blink out of jail and into the hallway where they kept all my things! -彼らは私の伝説の剣を手に入れることができると思っていました...しかし、愚か者は私の足を縛るのを忘れていました.私はブリンクして刑務所から出て、彼らが私のすべてのものを保管していた廊下に入ることができました! +墓地を守る乙女はペットには優しいらしい…… +They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Portal out of jail and into the hallway where they kept all my things! +おバカなあいつらは私の足を縛り忘れていたようだ。ポータルを描いて牢屋を出ることができた。奴らなんかに伝説の剣を奪わせはしない! I am writing this from inside prison. Who would have known they cared so much about me using a shrine? Sheesh. -私は刑務所の中からこれを書いています。彼らが神社を使って私のことをそんなに気にかけていると誰が知っていたでしょうか? おいおい. +監獄の中からこれを書いている。祭壇を利用するのはご法度だったようだ。なんてこった。 + + (A drawing of a bunch of zombies, ordered by danger level. Of note are a zombie surrounded by charms, a zombie surrounded by talismans, a zombie warrior with a sword, and... some kind of shrine maiden that you've never seen before) -(ゾンビの群れを危険度順に並べた図。注目すべきは、お守りに囲まれたゾンビ、お守りに囲まれたゾンビ、剣を持ったゾンビの戦士、そして...あなたが持っているある種の巫女です。見たことない) +(ゾンビを危険度順に描いたもの。リボンを持ったゾンビ、タリスマンに囲まれたゾンビ、ゾンビの戦士、そして巫女のようなゾンビ) + + (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|The first thing to understand is that tying someone up is difficult if they are not in a vulnerable position. If your opponent is vulnerable, then binding will be twice as effective! -(ボンデージ ウィッチェリー: 学生用ガイドからの抜粋)|最初に理解しておくべきことは、相手が脆弱な立場にない場合、誰かを拘束することは難しいということです。相手が脆弱な場合、拘束は 2 倍効果的です! -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by ticking them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage. -(BONDAGE WITCHERY: A STUDENT'S GUIDE からの抜粋)|対戦相手がうまく縛り付けられたら、フェザー、アイス キューブ、または魔法の杖で相手の意志を破ることができます。これにより、追加のダメージが与えられます。 +ボンデージ ウィッチェリー: 学生用ガイドからの抜粋|まず最初に、抵抗する相手を縛るのは難しいということを理解してほしい。なんとかして相手を無防備にすれば、縛りの効果は倍増する。 +(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by tickling them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage. +ボンデージ ウィッチェリー: 学生用ガイドからの抜粋|相手を縛ったら、羽やアイスキューブ、マジックワンドを使うことで、相手の心を折り、追加ダメージを与えられる。 (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Bigger and more resilient opponents are much more effective at breaking out of your binds. Try to deal some damage to them to decrease the speed at which they struggle out of your restraints. -(BONDAGE WITCHERY: A STUDENT'S GUIDE からの抜粋)|より大きくて回復力のある敵は、拘束から抜け出すのに非常に効果的です。彼らにダメージを与えて、拘束から抜け出すスピードを遅くしてみてください。 +ボンデージ ウィッチェリー: 学生用ガイドからの抜粋|体格がよく、回復力の高い相手ほど、拘束を解くのが早い。。相手にダメージを与えると、拘束を解くスピードを遅くすることができる。 (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Many mages utilize magical runes to set traps. If you want to check for traps, try learning the spell 'Magical Sight' in the Illusion school. -(BONDAGE WITCHERY: A STUDENT'S GUIDE からの抜粋)|多くのメイジは魔法のルーンを利用してトラップを設定します。トラップを確認したい場合は、イリュージョン スクールでマジカル サイトの呪文を学んでみてください。 +ボンデージ ウィッチェリー: 学生用ガイドからの抜粋|多くの魔術師は魔法のルーンを使って罠を仕掛ける。罠を調べたいなら、幻惑魔法の「マジカル・サイト」という魔法を学んでみよう。 + + From Adventuring 101: A guide to combat|Your opponent will become vulnerable in many ways, such as missing you with an attack. You can also teleport to the other side of them when they are attacking you, and this will confuse them briefly.|Vulnerable enemies take extra damage, and are easier to tie up! -アドベンチャー 101 から: 戦闘のガイド | 対戦相手は、攻撃であなたを逃すなど、多くの点で無防備になります。また、敵があなたを攻撃しているときに敵の反対側にテレポートすることもできます。これにより、敵は一時的に混乱します。 |脆弱な敵は追加のダメージを受け、拘束されやすくなります! +冒険のススメ: 戦闘のガイド | 敵は、攻撃を空振る等、さまざまな方法で弱体化する。また、相手が攻撃しているときに反対側にテレポートすることで、一時的に混乱させることもできる。 From Adventuring 101: A guide to combat|Drenching your opponents makes them more vulnerable to ice and electricity, but may increase their resistance to fire. -アドベンチャー 101 より: 戦闘のガイド | 敵をびしょぬれにすると、敵は氷や電気に弱くなりますが、火への抵抗力が増す可能性があります。 +冒険のススメ: 戦闘のガイド | 敵を水濡れ状態にすると、氷や電気属性に弱くなり、火属性への耐性を得る。 From Adventuring 101: A guide to combat|Hitting enemies with melee damage while they are frozen will break the ice, but this also doubles the damage dealt by the attack. -アドベンチャー 101 より: 戦闘のガイド | 凍結している敵に近接ダメージを与えると、氷が砕けますが、攻撃によるダメージも 2 倍になります。 +冒険のススメ: 戦闘のガイド | 凍結している敵に近接ダメージを与えると、氷は砕けてしまうが、2倍のダメージを与えることができる。 From Adventuring 101: A guide to combat|Did you know that hitting enemies with fire while they are frozen is extra powerful? Enemies take 40% additional damage from fire while frozen, although fire will rapidly unfreeze them. -アドベンチャー 101 から: 戦闘のガイド | 凍結している敵に火を当てると非常に強力になることをご存知ですか? 敵は凍結している間、火から 40% の追加ダメージを受けますが、火は急速に凍結を解除します。 +冒険のススメ: 戦闘のガイド | 凍結している敵に火を当てると、追加で40%の火属性追加ダメージを与えられる。代わりに、凍結状態は解除される。 From Adventuring 101: A guide to combat|When you're in a bind, try to play along and look for an opportunity to escape. Fighting back will only make your enemies want to tighten your restraints. -アドベンチャー 101 から: 戦闘へのガイド | 窮地に陥ったときは、協力して逃げる機会を探してください。反撃しても、敵は拘束を強化したくなるだけです。 +冒険のススメ: 戦闘のガイド | 縛られてしまったら、なるべく逃げる機会をうかがうこと。そのまま戦えば、より拘束を足されて不利な状況に陥ってしまう。 + + (A drawing of a suit of armor. It reads: DO NOT TRUST) -(甲冑の絵。こう書いてある: 信頼しないでください) +(甲冑の絵。「見た目に惑わされるな」と書いてある。) (The note starts with a drawing of a witch in dark robes with bright pink hair) A necromancer. Powerful spellcaster, weak up close. -(音符は明るいピンク色の髪に黒いローブをまとった魔女の絵で始まる)ネクロマンサー。強力な魔法使い、近距離では弱い。 +メモは明るいピンク色の髪に黒いローブをまとった魔女の絵で始まる|ネクロマンサー。強力な召喚術を使う。近距離では弱い。 I can't count how many skeletons I've bashed with my hammer today. They seem so fragile... -今日、ハンマーで何体の骸骨を叩き潰したか数え切れません。とてももろいようです... +今日だけで、何体のスケルトンをハンマーのサビにしてきたかわからない。スケルトンはとても壊れやすいから…… (The note is scrawled with wiggling lines) IT SEES ME. I SHOULDN'T HAVE DEFILED THE ROPE GODDESS' ALTAR! -(メモは揺れる線で走り書きされています)それは私を見ています。私はロープの女神の祭壇を汚す必要はありませんでした! +ぐちゃぐちゃな線で走り書きされたメモ|見られている。縄の祭壇を汚すんじゃなかった! It is said that fire and water are opposite planes, but I've noticed that the relation is more lopsided than 'equal and opposite' when they physically manifest. Water elementals resist fire, obviously, but fire elementals are weak to water! It is almost as if the abundance of water in this world causes the fire elementals to become weaker than in their home plane... -火と水は相反する面だと言われていますが、物理的に現れると、その関係は『対等』よりも偏っていることに気付きました。水の精霊は火に抵抗するのは当然ですが、火の精霊は水に弱いのです!まるでこの世界の豊富な水のせいで、火のエレメンタルが故郷の次元よりも弱くなっているかのようだ… +火と水は相反すると言われているけどどうやら違うみたい。この世界に顕現すると、水のほうが明らかに有利に見える。水の精霊は当然火に抵抗しますが、火の精霊は水に弱いのです。この世界に水が多いから、火の精霊は元の次元よりも弱まっているのでしょうか…… A drawing of many icicles around pools of water. It instructs you to avoid the pools of water and you can see a figure surrounded by ice shards in the distance being set on fire and smashed with a hammer. -水たまりの周りにたくさんのつららが描かれています。水たまりを避けるように指示されており、遠くに氷の破片に囲まれた人物が火をつけられ、ハンマーで砕かれているのを見ることができます。 +水たまりの周りにたくさんのつららが描かれた絵。水たまりを避けるように指示され、遠くに氷漬けにされた人が火にかけられ、ハンマーで叩きつけられるのが見える。 The shadow spirits' touch is cold as ice... I have wondered if this temperature property applies to their destructive effects on other types of beings. Unfortunately, I found out the hard way when I tried to summon a shadow creature against an ice elemental... -影の精霊のタッチは氷のように冷たいです...この温度特性が他の種類の存在への破壊的な影響に適用されるかどうか疑問に思いました.残念ながら、氷に対して影の生き物を召喚しようとしたときに難しい方法を見つけました.エレメンタル… +影の精霊は氷のように冷たい……この特性は、他の属性にも適用何らかの効果があるだろうと考えたことがある。そして残念なことに、氷の精霊に対して影の存在を召喚しようとしたときに、大変なことがわかったんだ…… I was being chased by something fast and heavy, and it was about to crush me when I tossed an Ice Shard behind me. It stopped and I didn't care to look back. -何か速くて重いものに追われていて、押しつぶされそうになったとき、後ろにアイスシャードを投げました。それは止まり、振り返る気にもなりませんでした。 +速くて重い何かに追いかけられ、押し潰されそうになったとき、私はアイスシャードを後ろに放った。何かが止まる気配がしたので、私は振り返ろうともしなかった。 I was walking in the library when I got attacked by a magic book! Fortunately my sword seemed to disapatch it quickly, and I used my spear to stab another one shortly after. -図書館を歩いていたら、魔法の本に襲われました!幸い、剣はすぐにそれを消し去ったようで、すぐに槍を使って別の本を刺しました。 +図書館を歩いていたら、魔法の本に襲われた!幸いなことに、剣が通用してくれたので、その後すぐに槍でもう一冊も刺した。 SOMEBODY STABBED MY FROG AND I AM PISSED. -誰かが私のカエルを刺し、私は腹を立てています。 +私のカエルを刺したのは誰!? I don't think it's neccessary to tell people that dragons resist fire... right? -ドラゴンは火に強いと言う必要はないと思いますが……ですよね? +ドラゴンは火に強い。言うまでもないですよね。 I've been studying the dragonheart's weaknesses. So far I've found that the ones bearing the powers of ice dragons are actually weak to fire unlike the others, and the ones who summon crystals to block attacks are nonetheless unable to grab a spear to stop it from reaching them. -ドラゴンハートの弱点を研究してきました。これまでのところ、アイス ドラゴンの力を持っているものは他のものとは異なり実際に火に弱く、クリスタルを召喚して攻撃をブロックするものは槍をつかむことができないことがわかりました。彼らに届かないように。 +ドラゴンハートの弱点を研究して、わかったことがある。氷竜の力を持つものは他と違って火に弱く、クリスタルを召喚するものは、槍のような武器で水晶を無視して本体を直接刺せる。 + + They say a ninja can catch a sword in her hands, but can she stop a spear? Ha, thought not! -忍者は剣を手に取ると言うが、槍を止めることはできるのか? +忍者は白刃取りできるというけど、槍はどうかな? (Pg. 54 from Catherine Willows' journal): The post-collapse civilization sought immortality, but they knew that the technologies of the old civilization were a danger to them. So they turned to another school of thought: Magic. -(キャサリン・ウィローズの日記からの54ページ):崩壊後の文明は不死を求めたが、彼らは古い文明の技術が彼らにとって危険であることを知っていた。そこで彼らは別の学派、つまり魔法に目を向けた。 +キャサリン・ウィローズの日記 54ページ|崩壊後の文明は不死を求めましたが、旧文明の技術が危険であることは十分承知していました。そこで彼女たちは魔法に目をつけたのです。 (Pg. 55 from Catherine Willows' journal): Silk wrappings, enchanted with ten-thousand microscopic runes per cubit, were suffucient to protect their bodies from ageing for millenia. What they didn't realize was that the magic didn't protect their souls. -(キャサリン・ウィローズのジャーナルからの55ページ):キュビトあたり1万個の微視的なルーンでエンチャントされた絹のラッピングは、彼らの体を何千年も老化から守るのに十分でした.彼らの魂。 +キャサリン・ウィローズの日記からの55ページ|絹の包みは、1立方当たり1万個の微細なルーン文字でエンチャントされており、何千年もの間、不死を保つのには十分でした。しかし、魂を守ることはできませんでした。 (Pg. 56 from Catherine Willows' journal): They have no clue what they are doing anymore. To them, this is just another one of their ten-thousand dreams across the aeons. They can no longer tell reality from imagination. -(キャサリン・ウィローズの日記からの 56 ページ): 彼らはもはや自分が何をしているのか見当もつかない。彼らにとって、これは永劫にわたる彼らの 1 万回の夢の 1 つに過ぎない。彼らはもはや想像と現実を区別することができない。 +キャサリン・ウィローズの日記 56ページ|彼女たちはもう自分が何をしているのか全く理解しておりません。きっと彼女たちにとって、これは長い年月をかけて見てきた何万個もの夢の一つに過ぎないのでしょう。もはや現実と妄想の区別がついていないのです。 Ninjas aren't so tough to fight when their hands are tied behind their back. Good thing I had my pet slime with me~ -忍者って、後ろ手で縛られた方がタフじゃないよね。ペットのスライム持っててよかった~ +忍者は縛られると急に弱くなるんだね。ペットのスライムを持っていてよかった~。 (Pg. 12 from Catherine Willows' addendum): After studying the ancient race of catlike people, I have come to the conclusion that their race met a dual fate. All of them received eternal life in some form or another. To one half it manifested as a blessing, allowing them to walk the halls. To the other it became a curse to them, trapping them in runic wrappings for all eternity. -(キャサリン・ウィローズの補遺より 12 ページ): 猫のような人々の古代の種族を研究した後、私は彼らの種族が二重の運命に遭遇したという結論に達しました.彼ら全員が何らかの形で永遠の命を受け取りました.半分にそれは祝福として現れ、彼らはホールを歩くことができました. 他の人にとっては、それは彼らにとって呪いになり、永遠にルーンのラッピングに閉じ込められました. +キャサリン・ウィローズの補遺 12ページ| 古代の猫のような種族を研究した結果、彼女らが二通りの運命を歩んだことがわかりました。永遠の命を授かるところまでは共通していますが、一方は祝福されて自由を得て、もう片方は呪いとなり、永遠に包帯に包まれることになりました。 (Pg. 13 from Catherine Willows' addendum): I must issue a correction to the statements written in my journal. The ancients knew what they were doing. Those that were cursed, are blessed, and those who were blessed, are cursed. -(キャサリン・ウィローズの補遺より 13 ページ): 私の日記に書かれた声明を訂正しなければなりません。古代人は自分たちが何をしていたかを知っていました。 +キャサリン・ウィローズの補遺 13ページ| すこし日記の内容を訂正しなければなりません。古代人は祝福と呪いに関して、私以上に熟知していました。呪われた者は祝福され、祝福された者は呪われていたのです。 (It's a copy of an ancient illustration, depicting a cat goddess, an elven goddess, and two groups of catgirls. One group is smiling and standing on pedestals. The other group is frowning and wearing armor meant for war. It looks unfinished, like the author was suddenly grabbed from behind while drawing it) -(これは古代のイラストのコピーで、猫の女神、エルフの女神、および 2 つのグループの猫娘が描かれています。1 つのグループは笑顔で台座の上に立っています。もう 1 つのグループは顔をしかめ、戦争用の鎧を着ています。未完成のように見えますが、作者が描いてる途中でいきなり後ろから掴まれたような) +(古代の像の模写のようだ。猫の女神とエルフの女神、それらを崇拝する者たちが描かれている。片方は笑顔を湛え、台座に座っている。もう片方は空を睨み、鎧を着込んでいる。絵は未完成のようだ。まるで誰かに後ろから襲われたかのような途切れ方をしている。) (It's a interlinear translation of an ancient letter) Your highness, I have delivered to you the prisoners that you have asked. They are the worst of the worst--thieves, slanderers, sorcerers and seducers. But I must inquire, why is it that we must wrap them in silken scarves, worth twenty gold pieces each? Surely they are being handed over to be disciplined, not to be anointed? -(古代の手紙の行間翻訳です)殿下、私はあなたが求めた囚人をあなたに届けました.絹のスカーフで彼らを包む必要があるということですか? それぞれが 20 枚の金貨に値します? 確かに、彼らは油そそがれるためではなく、訓練を受けるために引き渡されているのですか? +古代の手紙の行間翻訳|殿下、約束通り囚人をお送りしました。しかし、彼女たちは盗賊や扇動者、讒者に魔術師……とても金貨20枚に相当する絹で包む価値があるとは思えません。彼女たちは罰を受けるために送られるのではないのですか? (It's a record of an interview)|ME: Why are you like this?|MUMMY: Because we are blessed!|ME: Blessed? You've been wrapped up for thousands of years!|MUMMY: A thousand years is nothing compared to the glory that will come!|ME: Why do you have to be wrapped up? There are plenty of you who aren't...|MUMMY: The chosen ones will inherit the land when the goddess returns. -(インタビューの記録です) |私: どうしてこうなったの? |ママ: 私たちは恵まれているから! |私: 恵まれているの? あなたは何千年もの間閉じ込められてきたの! |ママ: 千年は何でもない来る栄光と比べて! |私: なぜあなたは包まれなければならないの? そうでない人はたくさんいます... |マミー: 選ばれた者は、女神が戻ったときに土地を継承します. +とあるインタビューの記録|記者: どうしてそんな姿を? |マミー: これは祝福された姿なのよ |記者: 祝福?1000年間包帯でぐるぐる巻きにされるのが?|マミー:来たる栄光の前には1000年なんか一瞬よ |記者: しかし……普通の姿でいる方もいるのに、なぜあなたが? |マミー: 私が選ばれしものだからよ。女神が帰ってきたときに土地をいただくの。 (It's a record of an interview)|ME: Which goddess are you referring to? The goddess of restoration?|MUMMY: The blessed kitty.. she was promised to rule over the lesser goddesses.|ME: Lesser goddesses? Which ones?|MUMMY: YOUR goddesses. The ones you humans created that should not be. Ours is the true offspring of the creators, a goddess created to rule! -(インタビューの記録です)|私: どの女神のことですか? 回復の女神ですか?|マミー: 祝福された子猫..彼女は下位の女神を支配すると約束されていました.|私: 下位の女神? どの女神ですか? ?|マミー: あなたの女神。あなたが人間が作ったはずのないもの。私たちの女神は、創造者の真の子孫であり、支配するために作られた女神です! \ No newline at end of file +とあるインタビューの記録|記者:女神とは、どの女神のことなので?再生の女神?|マミー: 祝福された子猫……彼女はかつて、いつの日か下等な神々を下すと約束してくださった。|記者:下等な女神?|マミー:あなた達人間の女神よ。我々の神こそが本物なの。 +(It's a record of an interview)|ME: What of the elves? Don't they talk about a 'kingdom' too?|MUMMY: Who are the elves?|ME: You know, pointy ears, green hair, a heck of an attitude... they seem in tune with nature.|MUMMY: They sound arrogant.|ME: They are.|MUMMY: Perhaps they know nothing of the promise between our goddess and theirs. +とあるインタビューの記録|記者:エルフとはどういった関係で?|マミー:エルフ?尖った耳と緑の髪、そして傲慢な態度。|マミー:彼女たちは恐ろしく傲慢なの。|記者:傲慢。|ME:そう。きっと彼女たちは、わたしたちの女神と彼女たちの女神との間で何があったか知らないんでしょうね。 +(It's a medical record) Patient seems stable... application of the enchanted cloth seems to have stopped the bleeding. It appears that the ancient magic suppresses all forms of injury, even in humans, until it is taken off. +とあるメディカルレコード|患者の容態は安定した……魔法の布を当てると出血が止まった。古代の魔法は、現代の人間にも効果が十分にあるようだ。 + + +(A record of an ancient... transaction)||The elemental offered us the following from her personal estate:|-one magical lantern that requires no fuel, and can light up the night as if it were day|-one crystal that burns red-hot when kept near metal, providing heat to warm a house|-three enchanted swords imbued with flame|-a hollow glass crystal, used for communication||In exchange, we gave her three wolfgirls we had captured on the surface. +古代の……取引の記録|精霊は個人の財産から次のものを差し出した:燃料を必要とせず、まるで昼のように夜を照らす魔法のランタン。金属に近づけると赤熱し、家を暖める熱を供給する水晶。炎を宿した魔法の剣3本。通信に使う中空のガラス水晶。引き換えに、地表で捕まえた3人のウルフガールを渡した。 +I had heard that ancient humans prayed to the stars here, in an effort to find favor when the Eight had forsaken them. So I went and prayed... and let me tell you, it was a lie, an absolute lie. There are only monsters out there. +古代人がこの地で星に祈りを捧げたと聞いたことがあると聞き、祈りを捧げるために向かった。……祈りの地など全くの嘘であった。中にはただの怪物ばかりだ。 +(It is a set of instructions for creating a magic circle to unlock a sealed portal. There are markings in many languages that give conflicting descriptions, claiming that the circle will transmute material to gold, or bring good fortune...) +(封印されたポータルを開くための魔法陣の作り方が書かれている。多くの言語で書かれた印があり、その円は物質を黄金に変えると主張したり、幸運をもたらすと主張したりと、相反する説明をしている……) + + +(Two schematic diagrams of ancient drones taken from records. The first is unmodified, and the second has several annotations written in what looks like pink lipstick...) +(古代ドローンの模式図2枚。1枚目は無修正、2枚目はピンクの口紅のようなもので注釈がいくつか書かれている……) + + +Those damn slimes! They're so sticky and gross... fortunately, I washed myself in the fountain the last time I got caught by one. It came right off! +あのクソスライム!ネバネバしてて気持ち悪い……幸いなことに、前回スライムに捕まったときは噴水で体を洗ったんだ。すぐに取れたよ! +The dragonhearts were a group of dragonslayers, named for their ritual that imbues them with the fiery power and resistance of dragons they've slain. Now they work as mercenaries, and some of them serve a certain Leather goddess. +ドラゴンハートはドラゴンを殺す集団で、殺したドラゴンの燃え盛る力と竜鱗の如き防御を得る儀式からその名がついた。現在は傭兵として働き、そのうちの何人かはある革の女神に仕えている。 +Yes! I've done it! I have created another red slime! I shall call him Fred, yes, Fred. After the red slime I lost in a shield-related accident a while back... |Poor Fred... I miss him. +やった!やったよ!また赤いスライムを作れた!フレッドと名付けよう。ちょっと前にシールド関連の事故でレッドスライムを失ったばかりだから……|かわいそうなフレッド...。彼が恋しいよ。 +(Pg. 70 from Catherine Willows' journal): The overgrown ruins are a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through? +(キャサリン・ウィローズの日記 70ページ):地下のジャングルはとても不思議なところです。天井の割れ目から降り注ぐ光は、植物の生命を維持するには弱すぎます。にもかかわらず、再生の女神は古代の知恵をもって、この場所を残すと決めたようです。私が単なる通りすがりであることに気づくまで、何体のドライアドを差し向けるつもりでしょうか。 +The unseen maid is the deadliest. +見えないメイドにこそ警戒が必要だ。 + + +(The note is blank) +何も書かれていない。 +The note reads: Mmmmmmmph! Mmmm! MMMMMPH!!!!-- (The entire note is just gagged mumblings...) +ノートにはこう書いてある|んんぅ!むぐぐ、んんん~!(ノートいっぱいに猿轡をかまされたかのような文章が書いてある……) +(The note is illegible) +(文字が書いてあるようだが、判読不可能) +(The note contains a map of a previous floor) +(前の階層について書かれているノートのようだ) +(The note is smeared with some kind of liquid) +(ノートはびしゃびしゃになって判読できない) +(The note contains a cryptic riddle that makes no sense) +(意味不明のなぞなぞが書かれている) +(The note contains a list of the writer's likes/dislikes and hard limits) +(書き手の趣味趣向が書かれている) +The note reads: Please take this beautiful doll somewhere and play with her~ +ノートにはこう書いてある|この美しい人形をどこかに連れて行って、一緒に遊んであげてください +(The note contains a manual on fencing. You have always been a terrible fencer) +(そのノートにはフェンシングのマニュアルが入っている。むかしからフェンシングは苦手だ……) +(The note contains a magic spell you were taught never to cast under any circumstances) +(そのメモには、どんなことがあっても決して使ってはならない魔法が書かれている) + + +The item requires 5 keys and free hands to remove +この拘束具を解除するには5個の鍵が必要。 +The item is extremely secure with five separate keyholes. +この拘束具は恐ろしく頑丈で、5個の鍵穴が開いている。 +You insert your 5 keys into the lock and the item finally comes off. +5つの鍵穴に鍵を挿し、ようやく解放された。 + + +### [RNAME] + +Magic-Draining: This item drains your mana quickly up to a limit, then slowly after. +吸魔:一定時間、大量のマナを消耗し、それ以降はゆっくりと消耗する。 + + +Curse of Tickling: This item is tickling you without end! +くすぐりの呪い:永遠にくすぐられ続ける。 +Curse of Punishment: Inflicts psychic damage when you attack or cast a spell. +罰の呪い:攻撃や魔法を唱える際に精神ダメージを受ける。 +Curse of Illumination: Produces light and makes you easier to see. +明かりの呪い:常に照らされ、敵から見つかりやすくなる。 +Curse of Attraction: Women find you irresistable. +魅力の呪い:道行く少女に魅力を振りまく。 +Curse of Animation: Causes loose restraints to animate and attack you! +生命の呪い:解いた拘束具に生命が宿り、襲ってくるようになる。 +Curse of Sensitivity: Makes it easier to lose control of yourself. +発情の呪い:性欲により自分をコントロールできなくなる。 +Curse of Distraction: Multiplies DP gain by 1.5x. +感度の呪い:興奮値の上昇率が1.5倍になる。 +Curse of Exhaustion: -25% Stamina regen cap. +消耗の呪い:スタミナ回復量の上限-25%。 +Curse of Futility: Multiplies WP gain by 0.5x. +摩耗の呪い:意志力の回復が0.5倍になる。 +Curse of Submission: Gain submissiveness when you lose control of yourself... +服従の呪い:性欲により我を失った時、服従度が上昇する。 +The curse is dormant, waiting for the time to strike... +呪いは虎視眈々と付け入る隙を伺っている…… +Your RESTRAINTNAME glows pink as you feel your mind attacked by hypnotic forces! +RESTRAINTNAME が桃色に輝きだし、催眠の力が強まる! + + +The item is cursed! Several restraints appear on your body! +このアイテムは呪われていた!いくつかの拘束具が身体に現れた! +The item is cursed, but you are so trussed up you hear only sinister laughter... +このアイテムは呪われていたが、他に縛る余地がないほど縛られていたため、不吉な笑い声が響くだけだった…… + + +The item is sealed with an icy lock. Perhaps you can melt it somehow? +錠前が凍りついている。どうにかして解かせないだろうか? +The cursed seal flashes brightly as you struggle fruitlessly against it. +この呪いの封印は、もがくと強く輝き出す。 +The item is sealed with a smoldering lock. Perhaps you just need to put out that fire... +この呪いの封印はくすぶる炎でできている。なんとかして火を消せないだろうか…… +The cursed seal glows faintly as you struggle fruitlessly against it. +この呪いの封印はもがくと弱く輝き出す。 +The item contains technological markings. Perhaps applying some electricity will affect it? +この呪いの封印には雷のマークがついている。電気を流せば良いのだろうか。 +The cursed seal gives off sparks as you struggle fruitlessly against it. +この呪いの封印はもがくと電気が流れるようだ。 +The item contains an alchemical seal. Perhaps Glue damage will overload it? +この呪いには錬金術の封印がなされている。ねばねばダメージでオーバーロードできないだろうか? +The item stretches as you tug on it, but snaps back to its original place. +この拘束具は引っ張ると伸びるが、はなすと元の位置に戻ってしまう。 +The item is covered in markings of chains. Perhaps you need to take Chain damage? +この呪いには鎖の封印がなされている。チェーンダメージで解除できないだろうか? +The item squeezes you tighter as you try to take it off. +この拘束具は抜け出そうとすると強く締め付けてくる。 +The item is protected by holy magic. There is nothing you can do to it. +この拘束具は聖なる封印が施されている。どうしようもない。 +You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? +女神に祈りを捧げると聖なる封印が消えた。彼女に赦してもらえたのだろうか? +This item bears the sigil of the Goddess of Restoration. Perhaps she can help? +この拘束具には再生の女神の紋章がある。祭壇で彼女に祈れば助けてくれるかもしれない。 +The item is protected by a magical seal. There is nothing you can do to it. +この拘束具には魔術の封印がなされている。自分の力ではどうすることもできない。 +This item bears the sigil of the Goddess of Conjuration. Perhaps she can help? +この拘束具には召喚の女神の紋章がある。祭壇で彼女に祈れば助けてくれるかもしれない。 +The item is protected by dark secrets. There is nothing you can do to it. +この拘束具には闇の封印がなされている。自分の力ではどうすることもできない。 +This item bears the sigil of the Goddess of Illusions. Perhaps she can help? +この拘束具には幻惑の女神の紋章がある。祭壇で彼女に祈れば助けてくれるかもしれない。 +This item bears the sigil of the Goddess of Elements. Perhaps she can help? +この拘束具には精霊の女神の紋章がある。祭壇で彼女に祈れば助けてくれるかもしれない。 +The item is protected by an elemental seal. There is nothing you can do to it. +この拘束具は精霊の力で護られている。自分の力ではどうすることもできない。 +You hold the key to the item and it comes loose, draining the key's energy. +拘束具に鍵をかざすと、鍵のエネルギーを吸い取り拘束具が緩くなった。 +The item is incribed with mystical runes. Maybe you need a powerful key to unlock it. +この拘束具には神秘的なルーンが刻まれている。解くには特別な鍵が必要なのかもしれない。 +The lock-shaped rune flashes as you realize struggling is pointless. +錠に輝くルーンの前に、足掻くのは無駄だと悟った。 + + +You overload the magical seal, causing it to vanish and release the item. +魔法の封印は過負荷により消滅し、拘束具が外れた。 +The item is magically sealed, requiring 200 mana to unlock it (includes mana from mana pool). +この拘束具には魔法の封印が施されている。解除には200マナ必要(マナプールも含む) +You tug on the item, but the magic can't be broken with anything other than brute force. +この拘束具は力づくで壊すしかないみたいだ。 + + + + + + +The item is sealed with a locking spell! You will need a key to dispel the magic. +この拘束具は魔法で封印されている。魔法を解くには鍵が必要だ。 +You tug on the item but it is magically sealed to your body! +いくら拘束具を引っ張っても外れない。魔法のように身体にくっついている! +You insert your magic key into the lock and the item finally comes off! +魔法の鍵をロックに差し込むと、ようやく拘束具が外れた! + + +The item is protected by a seal of Determination. You must have maximum willpower to remove it. +この拘束具は決意の印章で守られている。解除するには気力を最大値まで上げる必要がある。 +You are unable to muster the willpower to bypass the seal... +気力が足りない…… +Feeling determined, you override the seal and release the item! +意志の力を集中し、封印を解いて拘束具を外した! + + +The lock is protected by a revenant seal. You'll need 25 ectoplasm to disenchant it. +錠前は不死の封印で守られている。解除するにはエクトプラズムが25個必要だ。 +Your fingers pass right through the collar. Pity your neck doesn't pass through it. +首輪に指を触れようとしたらすり抜けた。首もすり抜けてくれればよかったのに。 +You channel ghastly energy into the lock and break the seal!!! +ロックに魂を注ぎ込み、封印を解いた! + + +It would take many lifetimes to crack the code. You'll have to find another way to break the program... +暗号の解読には数世代掛かりそうだ。別の手段を見つけなければ……。 +You tug against the straps to no avail. +ストラップを引っ張ったが、全く無意味だった。 +One of your Doll IDs seems to have had corrupted data on it, causing the program to crash and unlock. +IDに問題が起きていたようで、プログラムがクラッシュして解錠された。 + + +The item seems to drain divine energy from shrines. Maybe that has something to do with it. +この拘束具は、祭壇からエネルギーを得ているようだ。それが関係しているのかもしれない。 +The collar is enchanted with multiple layers of magical seals. +この首輪は複数の魔術封印がなされている。 +The collar has absorbed enough energy and pops off! +首輪は十分なエネルギーを吸収し、消えていった! + + +That item cant be used. +この道具は使えない。 +You're not sure how to use this key. +鍵の使い道がわからない。 +As soon as you touch the key, all of your gold locks fade to blue! +鍵に触れると、全ての金のロックが青いロックになった! + + +You realize there is no keyhole on the device, simply a lock-shaped sigil. +この拘束具には鍵穴がないことに気がついた。あるのは錠前の形をした紋章だけだ。 +The item loosens and falls off, but you see a red sigil flash and the key suddenly teleports away! +拘束具は外れたが、赤い紋章が点滅し、鍵が突然どこかに飛んでいってしまった! +You have in your possession KeyAmount magical, ornate key(s). You might as well try... +KeyAmount の魔法の鍵を持っている。試してみよう…… +You have KeyAmount key(s) for this item. +KeyAmount の鍵を試してみた。 + + +The angel helps you struggle and use items +天使は拘束具から抜け出すのを助けてくれる。 +The ghost helps you struggle and use items +幽霊は拘束具から抜け出すのを助けてくれる。 +The ghost is unhelpful +幽霊は助けてくれないようだ。 + + +Angel: Greetings! +天使:ごきげんよう! +Angel: Perhaps I can assist with those! +天使:なにかお手伝いすることはありますか? + + +Adventurer's Ghost: Well met, traveler! +冒険者の幽霊:やあ、冒険者さん。 +Adventurer's Ghost: Hello again, traveler (giggles). +冒険者の幽霊:ふふふ、またあったね、冒険者さん。 +Adventurer's Ghost: Having fun, girl? +冒険者の幽霊:楽しんでるかい? +Adventurer's Ghost: Looking for some trouble, slave? +冒険者の幽霊:奴隷のくせにまた何かしでかしたの? +Adventurer's Ghost: I see you, naughty little slave! +冒険者の幽霊:見てたよ、いたずら奴隷ちゃん! + + +Ghost: I can try to help with those, traveler. +幽霊:何か手伝いますよ、冒険者さん。 +Ghost: Aww, you look like you're having fun... +幽霊:とっても楽しんでるみたいね…… + + +Ghost: You look great in those, hehe~ +幽霊:とっても似合ってるよ~、うへへへ。 +Ghost: Please don't bother me. +幽霊:ちょっと邪魔しないでよ! +Ghost: A good slave doesn't complain. +幽霊:良い奴隷は文句を言わないのよ。 + + +Ghost: What's that? I don't understand. +幽霊:何?全然わからないんだけど? +Ghost: Silence is golden. +幽霊:沈黙は金なり、ね。 +Ghost: A good slave doesn't speak until addressed. +幽霊:良い奴隷は話しかけられるまで黙っているものなのよ? +Ghost: Aww, so helpless~ +幽霊:あはは、これはもう一人じゃどうしようもないね~。 +Ghost: Trussed up like a good girl~ +幽霊:縛られていい子にしていなさいね~。 +Ghost: You're going to stay that way for a good while. +幽霊:しばらくそうしていなさい。 +Ghost: I love watching you hop around, it's funny! +幽霊:動くたびにぶるぶる震えるあなたのお尻が好きなの。もっと見せて。 +Ghost: Just sit there like a good girl~ +幽霊:そこでじっと座っていなさい。 +Ghost: I want to see you kneel~ +幽霊:ちょっとそこで跪いてみてよ。 +Ghost: Aww, feeling frustrated? +幽霊:今どんな気持ち?悔しい? +Ghost: Looks like someone's been naughty~ +幽霊:誰かにいたずらされたみたいだね~。 +Ghost: How's it feel to be under lock and key? +幽霊:縛られた気分はどう?気持ちいい? + + +You step on a pressure plate and a number of skeletons rise up! +感圧板が作動し、スケルトン達が起き上がってきた! +You are ambushed by bandits! +盗賊の待ち伏せだ! +Armed skeletons appear from passages in the walls! +武装したスケルトンが壁の裏側から飛び出てきた! +An armed skeleton drops down from the ceiling! +武装したスケルトンが天井から落ちてきた! +A wall panel falls down, and an armored skeleton appears! +壁の一部が下がり、武装したスケルトンが現れた! +You feel a chill down your spine... +嫌な予感がした…… +You feel a constricting presence... +締め付けられるような気配を感じた…… +You feel a titillating presence... +背筋が凍るような気配がした…… +You are ambushed by ninjas! +ニンジャのアンブッシュだ! +A large, wriggling mess of ropes fall from the ceiling! +蠢く巨大なロープの塊が天井から落ちてきた! +A rune of growth causes several plants to quickly sprout nearby. +成長のルーンによって足元の植物が急成長した。 +You are ambushed by dragonhearts! +ドラゴンハートの待ち伏せだ! +A pack of drones descends from the ceiling! +天井からドローンの群れが降下してきた! +You hear sirens as a group of robots closes in! +サイレンと共にロボットの大群が押し寄せてきた! +You stumble upon a group of mages wanting to play dress-up! +ドレス押し売り集団だ! +You step on an open book, only to find a furious librarian staring you down! +開かれた本を踏み、図書館の司書がブチギレた! +You are ambushed by wolfgirls! +ウルフガールの待ち伏せだ! +You are ambushed by an alkahestor! +錬金術師の待ち伏せだ! +Small blobs of slime fall from the ceiling! +天井から小さなスライムが滴ってきた! +You are ambushed by slime researchers! +スライム研究員の待ち伏せだ! +A large blob of slime falls from the ceiling! +天井から大きなスライムの塊が降ってきた! +In a puff of smoke, a group of fire elementals appear around you! +煙の中から火の精霊達が現れた! +In a flash of fog a group of ice elementals appear around you! +霜の中から氷の精霊達が現れた! +In a burst of mist, a group of water elementals appear around you! +霧の中から水の精霊達が現れた! +A group of earth elementals rise out of the ground! +地面から土の精霊達が現れた! +You hear pouring liquid and a group of rubber elementals come out of the walls! +水音と共にゴムの精霊の集団が壁から滲み出てきた! +In a flash of light, a group of air elementals appear around you! +閃光と共に風の精霊たちが現れた! +Several ethereal hands appear all around you! +空に浮く奇妙な手が周囲に現れた! +You have stumbled upon a conjurer's study! +召喚士たちの勉強会に出くわした! +You are ambushed by a group of maids! +メイド達の待ち伏せだ! +The Head Maid corners you! +メイド長の圧迫面接だ! +A vine crawls from the ground, already wrapping around your feet! +足を縛られたかと思ったら、地面から蔦が這い出てきた! + + +You find a magic orb, containing a Spell Point. However, a Goddess owns this artifact.. +魔法のオーブを見つけた。手に取ればスキルポイントを得られるが、これは女神の所有物だ…… +You find a magic orb, containing the SHCL spell 'SPLNME' and angering a goddess. +魔法のオーブを見つけた。手に取れば SHCL の 'SPLNME' を習得できるが、女神を怒らせることになるだろう…… +You find a magic orb, containing a random spell and angering a goddess. +魔法のオーブを見つけた。手に取ればランダムで魔法を習得し、女神を怒らせることになる。 +Should you break it, she will send her minions after you. Which Goddess will you anger? +手に取れば女神を怒らせ、良くないことが起きるかもしれない。 + + +An altar stands before you, bestowing a heavenly contract. +祭壇に立ち、天と契約を交わす。 +Do you choose to accept its terms? +受け入れる? + + +Are you sure? This choice is final. +本当に? + + +Yes, I will accept. +受け入れる。 +(Accept the contract) +(契約する) +I'll think about it. +また今度。 + + +You are frozen! +凍ってしまった! +You are chilled! +凍えてしまった! +Shadowy tendrils wrap around your feet, rooting you in place!!! +影のような蔦に足を縛られ、その場を動けなくなった! + + +You get the feeling that someone is searching for you... +誰かに付け狙われているように感じた…… +You hear movements all around as you realize you are surrounded!!! +気がついたら包囲されていた! + + +There is another restraint underneath! +下にも拘束具がある! + + +Your restraints rub you in sensitive places as you move... +動くと敏感なところを拘束具が刺激する…… + + +Indifferent +無関心 +Angered +悪印象 +Enraged +憎悪 +Thankful +感謝 +Pleased +お気に入り + + +Neutral +中立 +Annoyed +迷惑 +Hostile +敵対的 +Friendly +友好的 +Allied +味方 +Favorable +好意的 + + +You run up against the TETHER pulling you back. +逃げ出そうとしたが、 TETHER にリードを引かれ、戻されてしまった。 +You are yanked back by the TETHER! +リードを引っ張られた! +We will be going for a walk. Follow me. +散歩の時間だ、ついてこい! +Don't get comfortable. Im taking you to a new cell. Follow me. +今から新しい牢屋に連れて行く、さっさとついてこい! +We're going to have some fun. Follow me. +お楽しみの時間だ、ついてこい! +I told you to follow me! +ついてこいと言っているんだ、さっさとこい! +I said, FOLLOW ME! +言うことを聞け! +I won't repeat myself +何度も同じことを言わせるな! +Then let's put you back in your cell! +牢屋に帰る時間だ! + + +I hope you learned your lesson. Now get your butt out of here. +良い勉強になっただろう、もう来るんじゃないぞ。 +You've been a good girl. I hope you don't make the same mistake again. You can leave. +いい子にしていたようだな、もう出て言っていいぞ。 +That's a good girl. Now behave yourself, okay? You're free to go. +行儀よくしていたようだな、外でもそうしていろよ。 +Looks like you got yourself in a bind! (she pats your butt playfully) Go make the others happy! +自分から捕まりに来るなんて変わっているな!(お尻を叩かれた)他のご主人さまを喜ばせてこい! + + +Good girl. +いい子だ。 +You'll be making others happy in no time. +貴様ならすぐに他のご主人さまを楽しませられるようになるぞ。 +You're shaping up to be a good slave. +貴様はすぐに良い奴隷になれるぞ。 +I wish I could take you to my room... +私の部屋に連れていきたいくらいだ…… +It seems your training is going well. +訓練の成果が出ているな。 +Perhaps you are enjoying this, hehe. +もしかして楽しんでいるのか?うふふ…… + + +You've been very good this walk. Here is your reward. +今回の散歩はとても良かったぞ、ご褒美だ。 +The EnemyName gives you a ItemName +EnemyName から ItemName を受け取った。 + + +The EnemyName starts adding a RestraintName! +EnemyName が RestraintName を追加し始めた! +You're missing part of your uniform. +囚人服を無くしたのか? +The EnemyName starts to remove your RestraintName! +EnemyName が RestraintName を外し始めた! +The EnemyName starts to lock your RestraintName! +EnemyName は RestraintName をロックし始めた! +The EnemyName locks your RestraintName with a LockType! +EnemyName は RestraintName を LockType でロックした! +I am going to change your restraints. Hold still! +拘束具を変えるからそこを動くな! +Just need to add a little security~ +もう少し厳重にする必要があるな。 + + +Got yourself in trouble, eh? +トラブルに巻き込まれたのか?うん? +Looks like you're shaping up to be a good girl~ +いい娘になったみたいだな。 +Oh! Looks like I've made a mistake... +おっと、間違えた…… +404 prisoner not found. Releasing tether. +404囚人が見つかりません。解放します。 + + +### A EnemyName approaches you in your cell. + +A EnemyName appears to check on you. +EnemyName が見回りに来た。 +The EnemyName leaves and locks the cell behind her. +EnemyName は牢屋の鍵を閉めて出ていった。 + + +Layered underneath: +次の拘束具が下にある: +Layered with: +次の拘束具と繋がっている: +Increased strictness due to: +次の拘束具によって拘束が強化されている: + + +Mana +マナ +Bondage +緊縛 +Ask for Aid +助けを求める +Become a Champion +使徒になる +Ask +尋ねる +Ask for Rescue +助けを呼ぶ +Offer Penance +献金する +Current Champion +仕えている神 +Switch Champion +仕える神を変える + + +Become the champion of this goddess. Capturing bound enemies will grant +1 rep. +使徒になると、敵を捕まえるごとに対応する女神との関係性が+1される。 +You are now the champion of the Goddess of GODDESS. +GODDESS の女神の使徒になった! + + +For 3 rep the goddess will grant you slipperiness, boosting your struggling. +女神に関係性3を捧げ、拘束から抜け出しやすくなる。 +For 3 rep the goddess will grant you a key. +女神に関係性3を捧げ、鍵を授かる。 +For 3 rep the goddess will grant you +女神に関係性3を捧げ、祝福を授かる。 +For 3 rep the goddess +女神に関係性3を捧げる。 +For 3 rep the goddess +女神に関係性3を捧げる。 + + +The goddess will fully restore your mana in exchange for AMOUNT rep +AMOUNT の関係性と引き換えに、神にマナを補充してもらった。 +The goddess will enjoy seeing you struggle in her bonds (raises submissiveness) +神の視線を感じる。肴にでもされているようだ(服従度上昇) + + +The Goddess may decide to send an angel to help you struggle, in exchange for 10 rep +10の関係性を犠牲に、天より御使いが現れた! + + +The Goddess will expect you to pay AMOUNT gold for +5 rep +AMOUNT の献金が受け入れられ、関係性が+5された。 + + +The Goddess hears your plea! +神に祈りが届いた! +The Goddess hears your plea but has decided not to care. +神に祈りは届いたが、無視されてしまった。 +The Goddess fills your mind with heavenly images as she channels energy through your veins. +女神のエネルギーが身体中に満ち溢れ、天国のようなイメージで心が満たされた。 + + +Time stops as an angel of heaven appears to collect your payment. +時が止まり、天使が献金を回収しにきた。 + + +You shudder and tremble as a wave of pleasure washes over you! +快楽の波が押し寄せ、身震いした。 +You lose control of yourself as you convulse in pleasurable bliss! +快楽に全身が痙攣し、気を失いそうになった。 +You let out a moan as you feel the ecstasy of pleasure! +絶頂を感じながら、思わず甘い息が漏れた。 +You finally let out a deep breath as you get what you've waited for! +快楽に身を委ね、深いオーガズムに至った。 +Your whole body thrashes about as you experience long-awaited pleasure! +待ちに待った絶頂に身を委ねた。 +Your release comes with a bang as your body rocks back and forth! +身体を前後に揺らしながら、絶頂に身を委ねた。 +You wiggle your hips in ecstasy as you experience pure bliss! +絶頂の幸福感に包まれながら、腰をくねらせた。 +You are left gasping for air as you receive your long-awaited orgasm! +絶頂の快楽に気絶しそうになった。 +You finally are left rocking your body wildly in sheer pleasure! +絶頂の中で、腰をガクガク揺らしてしまった。 +A powerful wave of pleasure comes over you as you convulse in ecstasy. +強烈な快楽の波に飲まれ、ただただ幸福感に身を委ねた。 +Your breathing intensifies as you lose control of yourself! +あまりの絶頂深度に腰がガクガクと震えだした。 + + +You close your eyes and breath rapidly in anticipation... +目を閉じてオーガズムへの期待に身を震わせる…… +You tilt your head back and moan as your heart beats faster... +鼓動が早まり、快楽に声が漏れる…… +You groan with pleasure as you approach the edge... +イきそうになった…… +You whimper as you rub your legs together furiously... +声を漏らしながら、両脚をこすり合わせた…… +You feel frustrated as the stimulation isn't quite enough... +もどかしい刺激が続く…… +Your whole body shakes, but you don't quite go over the edge... +もう少しでイきそう…… +This is starting to feel like torture... +焦らしが拷問に思えてきた…… +You let out a frustrated scream as the torment continues... +焦らされ続けて思わずうめき声が漏れる…… +You simmer just under the edge, heart racing, breathing quickly... +心臓が高鳴り、呼吸が速くなる。 +You let out an anguished moan as release dances just out of reach... +思わず声が漏れる…… +You squirm helplessly as your futile struggles simply arouse you more... +もがいても無駄な状況に、さらに興奮してしまった…… + + +The vibration suddenly weakens. +振動が突然弱くなった。 +Your toys cease vibrating abruptly. +プラグは突然停止した。 +The vibrators cut off suddenly, leaving you wanting. +ちょうどいいところでプラグは止まってしまった。 +The toys turn off at the last moment, cutting you off. +絶頂の寸前でプラグが止まった。 +The toys leave you without pleasure as they turn off. +突然振動が停止し、快楽の波が引いていくのを感じた。 +You are left feeling empty as the toys stop vibrating. +オーガズムの寸前でプラグが止まり、もどかしさを感じる。 +You stomp your foot on the ground in frustration as the vibration ceases. +突然振動が止まり、イきたくてもイけないもどかしさが募る。 +The toys leave you in agony as they cease vibrating. +焦らすかのようにプラグの振動が止まった。 +The toys torture you by stopping at the last moment. +プラグは狙いすましたかのように絶頂寸前で止まった。 +The toys stop just before you lose yourself. +いいところでプラグが止まってしまう。 +The toys deny you a chance to finish. +プラグはいいところで止まり、イく機会を与えてくれない。 + + +You try to pleasure yourself, but your chastity belt prevents you! +貞操帯のせいで自慰ができない! +You play with yourself... +自慰を始めた…… +You let your hands wander for a moment... +手で秘所を優しく弄る…… +You squirm your hips and whimper in your bindings... +快楽に縛られた身体をくねらせた…… +Your instincts are getting the better of you... +本能に抗えない…… +Your body shudders briefly from pleasure... +快楽に呼吸が早くなる…… +You are unable to control yourself. +あなたは自分をコントロールすることができない。 +You play with yourself using the magic wand... +魔法の杖を股間にあてがう…… +You would never do such a thing. +そんな気分じゃない。 +You try to rub your erogenous zones by squirming your legs... +脚をもぞもぞさせて、快楽を得ようとしてしまう…… +Your will is draining as you crave release, but can't quite get there without help... +イきたくてもイけない…… +Your will is draining as your heart beats faster and your body trembles... +心臓の鼓動が速くなり、身体が震えるにつれて、冒険の気力が萎えていくのを感じる…… +Your will is draining as you simmer just under the edge... +ギリギリのところで焦らされながら、冒険の気力が萎えていくのを感じる…… +Your will is draining as you crave release, and the toys continue to vibrate... +プラグが振動するにつれて、冒険の気力が萎えていくのを感じる…… +Your will is draining as the toys continue buzzing... +オモチャの振動のせいで、冒険の気力が萎えていくのを感じる…… +Your will is draining as you are tormented by vibrations... +振動に苛まれ、冒険の気力が萎えていくのを感じる…… + + +A buzzing vibration wakes you up! +股間の振動のせいで目が覚めた! + + +Your RestraintName constricts, warning you not to misbehave! +RestraintName が締まり、上手く行動できない! +Your RestraintName tightens painfully to punish your misbehavior! +RestraintName が急にきつく締まりだした! +Your RestraintName punishes you for your behavior! +RestraintName が罰だと言わんばかりに締め付けてきた! +Your RestraintName punishes you and warns you with a harsh beep! +RestraintName がいきなり警告音を発した! +Your RestraintName emits a red flash, causing you to feel faint! +RestraintName がいきなり赤く光りだした! +Your armor makes noise as you move around! +動く度に鎧が大きな音を立てる。 +Your RestraintName lets out an alert! +RestraintName が警報を発した! + + +Your RestraintName stimulates you to hinder your efforts! +RestraintName に与えられる刺激で行動を抑制された! +Your RestraintName stimulates you and beeps loudly! +RestraintName は突如警報音を出しながら震えだした! + + +A golden lock fades into a blue lock on one of your restraints! +拘束具についている金色のロックは、青いロックへと変わった。 +### Your command word is heard and the magic lock(s) click and fall off! + +Your command word is heard and the charger unlocks! +コマンドワードを唱えると、充電式ロックが外れた。 + + +Are you sure you want to attack? +本当に攻撃する? +Are you sure you want to go to the next level? (Click self to confirm) +本当に次の階へ?(自身をクリックして決定) + + +You shudder as you apply the RestraintName to yourself... +RestraintName を自身に取り付けた…… +You insert the RestraintName and close your belt's shield over it, with a click as it locks in place. +RestraintName を付け、貞操帯を閉める…… +You attack the RestraintName and close your bra's shield over it, with a click as it locks in place. +RestraintName を付け、貞操ブラを閉める…… +You slowly put on the RestraintName, amazed at how it seems to mold to your size... +RestraintName をつけると、自然とフィットするサイズに変わっていった…… + + + + +You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! +いくらもがいても全く無駄だった。鍵穴も無ければ絶対に壊れないような素材でできている! + + +Ancient Chastity Belt +古代の貞操帯 +You find a chastity belt, glowing magnificently, along with a strange crystal next to it. +脇に奇妙なクリスタルの添えられた、輝く貞操帯を見つけた。 +A chastity belt of sleek, ancient design. While powered, it gives -30% miscast chance due to distraction and slowly regenerates stamina. +洗練された古風なデザインの貞操帯。エネルギーがある間は、興奮値による詠唱失敗率を-30%し、スタミナの自然回復量を増加する。 +'Belt of the devoted' +献身のベルト +You tug at your chastity belt, but you can't even stick a finger inside because it's so tight... +貞操帯を引っ張るが、きつくて指を中に入れることもできない…… + + +Ancient Chastity Bra +古代の貞操ブラ +You find a chastity bra, glowing magnificently, along with a strange crystal next to it. +脇に奇妙なクリスタルの添えられた、輝く貞操ブラを見つけた。 +A chastity bra of sleek, ancient design. While powered, it reduces incoming damage from attacks by 20. +洗練された古風なデザインの貞操ブラ。エネルギーがある間は、敵の攻撃からの被ダメージを20軽減する。 +'Shield of the chaste' +純潔の盾 +You rub your hands along your breasts but feel only hard, unbreakable metal. +両手で貞操ブラを引き剥がそうとするも、全く動じない。壊すこともできないだろう。 + + +Ancient Heels +古代のヒール +You find a set of glowing heels, glowing magnificently, along with a strange crystal next to it. +脇に奇妙なクリスタルの添えられた、輝くヒールを見つけた。 +A pair of towering heels, enchanted with combat magic. When powered, they reduce slow level by 1, and deal 25 shadow damage on-hit with brief slow. +洗練された古風なデザインのヒール。エネルギーがある間は、減速値を1軽減し、攻撃命中時に25影属性ダメージと減速値を1追加で与える。 +'Shoes of the graceful' +賛美のヒール +You can barely stand in these heels. They are rigid, metallic, and unbreakable, yet padded on the inside. +ヒールを脱ごうとしても、全く脱げない。壊すこともできないだろう。 + + +Ancient Blindfold +古代の目隠し +### You find a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. + +A full-blackout mask. When powered, it negates accuracy penalties due to vision, boosts accuracy by +100%, and boosts melee damage by +10. +洗練された古風なデザインの目隠し。エネルギーがある間は、目隠しの命中率低下を受けず、命中率+100%、近接攻撃のダメージ+10 +'Mask of the Warrior' +戦士の仮面 +You tug at the mask but it won't come off. It's molded so close to your face that no light shines through! +目隠しを取り外そうとしても、全く外れる気配がない。壊すこともできないだろう。 + + +Ancient Muzzle +古代のマズル +You find a muzzle with a long rubbery plug on the inside, glowing magnificently, along with a strange crystal next to it. +脇に奇妙なクリスタルの添えられた、輝くマズルを見つけた。マズルの内側には長いディルドが付いている。 +A muzzle that seals over the face tightly. When powered, it regenerates mana, boosts sneak, and multiplies damage dealt to unaware enemies by 2.5x. +洗練された古風なデザインのマズル。エネルギーがある間は、マナの回復速度が上昇し、隠密性が上昇する。また、プレイヤーを未発見の敵に対して攻撃した際、ダメージが2.5倍になる。 +'Muzzle of the Saboteur' +工作員のマズル +You claw at your face, but not only does the soft plug fill your mouth completely, the muzzle itself is nigh-unbreakable! +マズルをひっかいても、外れる気配がない。壊すこともできないだろう。 + + +Ancient Gag +古代のボールギャグ +You find a ball gag harness with a long rubbery plug instead of a ball, glowing magnificently, along with a strange crystal next to it. +脇に奇妙なクリスタルの添えられた、輝くボールギャグを見つけた。 +A gag that fills the mouth. When powered, regens mana, reduces miscast by 30%, and boosts damage to enemies that are stunned, frozen, bound, or slowed by 30%. +洗練された古風なデザインのボールギャグ。エネルギーがある間は、マナの回復速度が上昇し、スタン、凍結、拘束、減速状態の敵に対するダメージが30%上昇する。 +'Gag of the Focused' +絶対集中の猿轡 +You tug on the straps at your cheeks, but the straps are so tight the plug doesn't even move! +ボールギャグを引っ張っても、外れる気配がない。壊すこともできないだろう。 + + +Ancient Rear Plug +古代のアナルプラグ +You find a huge, flexible, segmented plug, along with a strange crystal next to it. +脇に奇妙なクリスタルの添えられた、輝く大きなアナルプラグを見つけた。 +A plug that shocks the wearer when someone disciplines them, after orgasm, and mildly when spellcasting. When powered, reduces miscast chance by 30%. +洗練された古風なデザインのアナルプラグ。誰かに躾けられた時や絶頂時、詠唱時に電気が流れる。エネルギーがある間は、詠唱失敗率を30%軽減する。 +'Plug of the Obedient' +従順のアナルプラグ +You realize the magical plug has expanded inside your body. It won't come out. +魔法のプラグが尻穴の中で膨張し、出てこないことに気がついた。 + + +Ancient Plug +古代のプラグ +You find a huge, ribbed plug, along with a strange crystal next to it. +脇に奇妙なクリスタルの添えられた、輝くプラグを見つけた。 +A plug that denies the wearer constantly and only rarely grants release. When powered, it grants +70% magic resistance (about 40% reduction). +洗練された古風なデザインのプラグ。着用者を焦らし、極稀に絶頂する機会を与える。エネルギーがある間は、70%の魔法抵抗率(40%程度軽減)を得る。 +'Plug of the Perseverant' +忍耐のプラグ + + +Ancient Stimulator +古代の乳首ローター +You find a flat, round device with a hole on one side, along with a strange crystal next to it. +脇に奇妙なクリスタルの添えられた、乳首ローターを見つけた。 +A device that teases the wearer for casting spells and attacking. When powered, it reduces mana and stamina costs for casting spells and attacking. +洗練された古風なデザインの乳首ローター。攻撃時と詠唱時に動き出す。エネルギーがある間は、攻撃時と詠唱時のマナ、スタミナ消費を軽減する。 +'The Persuader' +交渉者のローター +You realize the magical device has attached to your body using suction. It won't come off! +乳首ローターを外そうとしても、魔法の力で身体と一体化していることに気がついた。 + + +Ancient Mittens +古代のミトン +You find a pair of shining gloves, glowing magnificently, along with a strange crystal next to it. +脇に奇妙なクリスタルの添えられた、輝くミトンを見つけた。 +Tight mittens that force the hands into fists. When powered, they increase all magic damage to enemies by 40%. +洗練された古風なデザインのミトン。エネルギーがある間は、敵に与える魔法ダメージが40%上昇する。 +'Mittens of Blasting' +爆裂のミトン +You rub your mittens together, but they are unfazed by anything you do to them and your hands are clasped tight. +ミトンを外そうとしても、手首にピッタリと張り付いてどうすることもできなかった。 + + +Ancient Armbinder +古代のアームバインダー +You find a monoglove, glowing magnificently, along with a strange crystal next to it. +脇に奇妙なクリスタルの添えられた、輝くアームバインダーを見つけた。 +An extremely strict armbinder. When powered, reduces miscast chance by 30%, increases all magic damage to enemies by 40%, and increases spell range by 50%. +洗練された古風なデザインの、かなりきついアームバインダー。エネルギーがある間は、詠唱失敗率を30%低減、敵に与える魔法ダメージが40%上昇、魔法の射程が50%上昇する。 +'Armbinder of the Artillerist' +砲兵のアームバインダー +You try to wiggle your arms, but they can barely move in this position and are clasped tight. Your arms are sealed. +いくら腕を動かしても、アームバインダーは脱げる気配がない。腕は完全に拘束されたままだ。 + + +Ancient Ankle Cuffs +古代の足枷 +You find a pair of glowing cuffs, glowing magnificently, along with a strange crystal next to it. +脇に奇妙なクリスタルの添えられた、輝く足枷を見つけた。 +A pair of cuffs designed for summoners. Heals nearby allies by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power. +洗練された古風なデザインの足枷。近くにいる仲間を毎ターン15回復し、回避力が50%増加する。エネルギーが切れると足枷同士が繋がってしまう。 +'Anklets of the Faithful Friend' +友誼のアンクレット +You jingle the chains around and realize that these unbreakable restraints won't be coming off. +いくら鎖を引っ張っても、足枷は外れそうもない。力ずくではどうすることもできないだろう。 +...when powered down, they snap together, rendering the wearer immobile. +エネルギーが切れて、繋がってしまった足枷。移動速度が低下している。 +'Anklets of the Unfaithful Friend' +不義理のアンクレット + + + + +You search for your ancient keys but it seems they were taken away for good. +古代の鍵はいくら探しても見つからない。誰かに持ち去られた後だろう。 + + +Random (-10% rep loss) +ランダム(関係性-10%) + + +You don't have any valid targets on your body for that. +身体に有効なターゲットがない。 + + +The air swirls with traces of pleasing magic... +空気に含まれる魔力により身体が火照ってきた…… +The spores make you feel sleepy... +胞子を吸い込むと、眠くなってきた…… + + +Physical Block: AMOUNT +物理ブロック: AMOUNT +Magic Block: AMOUNT +魔法ブロック: AMOUNT + + +DAMAGETYPE: MULTIPLIERx modifier +DAMAGETYPE: MULTIPLIERx 上昇 +Physical Armor: AMOUNT +防御: AMOUNT +Magic Armor: AMOUNT +魔法防御: AMOUNT +Evasion: AMOUNT% +回避率: AMOUNT% +Deals DAMAGETYPE damage +DAMAGETYPE タイプ +AMNT% chance to hit you +AMNT% の確率で命中 +Can disarm (chance: DISARMCHANCE%) +武装解除可能 (確率: DISARMCHANCE%) +Resistances: +耐性: +### HP: + +### Shield: + +Binding: +拘束: +Ambivalent +関係 +Likes you +好き +Loves you +愛している +Adores you +憧れている +Dislikes you +嫌っている +Hates you +憎んでいる +Despises you +軽蔑している +Talking to you +会話中 +Aware of you! +見られている! +Pursuing you! +追ってきている! +Ignoring you! +無視されている! +Investigating! +調べている +Suspicious +疑われている +Notices you! +気づかれている! +Unaware +こちらに気づいていない +Items carried: +所持アイテム: +Items worn: +着用中: +...and NUMBER more +他に NUMBER 個のアイテム +Takes damage if the caster is stunned +召喚者が気絶するとダメージを受ける +Disappears if the caster is defeated +召喚者が倒れると消滅する +Caster: ENEMYNAME +召喚者: ENEMYNAME +Demise imminent +そろそろ消える + + +Vulnerable +弱体化 +Stunned +スタン +Snared +移動不能 +Silenced +沈黙 +Disarmed +武装解除 +Blinded +盲目 +Apprehended! +軽拘束 +Restrained! +拘束 +Restricted! +重拘束 +Fully Bound! +全身拘束 +Trussed up! +ぐるぐる巻き +Tightly Secured! +厳重拘束 +Inescapably +脱出不能 +Belted +貞操帯 +Wearing a toy +オモチャ装備 +Vibed! +オモチャ振動中 +Flying +浮遊 +Distracted! +発情 + + +Soap +ソープ +Acid +酸 +Holy +神聖 +Arcane +秘術 +Poison +毒 +### Poison Gas + +Charm +魅了 +Tickle +くすぐり +Grope +股間 +Crush +打撃 +Gravity +重力 +Pierce +刺突 +Slash +斬撃 +Pain +苦痛 +Spirit Draining +吸収 +Mana Draining +マナ吸収 +Electric +電気 +### E-Stim + +Shock +衝撃 +Plush +ふわふわ +Blast +爆発 +Chain +チェーン +Gas +ガス +Physical +物理 +Spell +魔法 +Unstoppable +アンストッパブル +Unflinching +スーパーアーマー + + ++Focus +集中力 ++Stamina +スタミナ ++Willpower +気力 ++Magic +魔法 +Discard (destroys it permanently!) +強化しない + + +You crit the vulnerable EnemyName for AMOUNT extra damage! +弱体化状態の EnemyName に会心の一撃が命中し AMOUNT の追加ダメージ! +You crit the unsuspecting EnemyName for AMOUNT extra damage! +不意打ちで会心の一撃が命中し EnemyName に AMOUNT の追加ダメージ! +The enemy steals a pick from you! +ロックピックを盗まれた! +The enemy takes away your knife! +ナイフを盗まれた! +The enemy steals a key from your body! +鍵を盗まれた! +The enemy wrests away your magical knife! +魔法の鍵を奪われた! +The enemy takes away your precious magic key! +貴重な鍵を強奪された! +The enemy steals one ITEMSTOLEN from you! +ITEMSTOLEN を盗まれた! +You get your stolen items back. +盗まれたアイテムを取り返した! +The EnemyName manages to retreat with your items! +EnemyName は盗んだアイテムを持って何処かへ行ってしまった! + + +The orb contains knowledge of SPELL. +オーブには SPELL の知識が詰まっていた。 +You capture the EnemyName. +EnemyName を捕まえた。 +You capture the EnemyName in the name of the goddess of GODDESS. +EnemyName を捕まえ、 GODDESS の女神に捧げた。 +You capture the EnemyName, but the goddess of GODDESS would prefer that you be in uniform (wear her restraint). +EnemyName を捕まえたが、 GODDESS の女神は自らの属性の拘束具を付けずに供物を捧げたことに不満を持っている。 +You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! +EnemyName を捕まえたが、 GODDESS の女神は自らの属性の拘束具を付けずに供物を捧げたことに不満を持っている。 +You capture the EnemyName, but the goddess of GODDESS would prefer that you wear some restraints. +EnemyName を捕まえたが、 GODDESS の女神は自らの属性の拘束具を付けずに供物を捧げたことに不満を持っている。 +You capture the EnemyName, but have reached the limit for rewards this floor. +EnemyName を捕まえたが、この階層ではこれ以上神に捧げても無駄なようだ。 + + +The spirit inside the restraint is vengeful and emerges to wreak havoc on the world! +拘束具に宿っていた怨念が具現化した! + + +You hide inside the container... +箱の中に隠れた…… +You hide inside the chest... +宝箱の中に隠れた…… +It's a crumpled piece of scrap metal with a sharp edge. +瓦礫の中に鋭い破片がいくつか見える。 +You use the scrap to try and cut the item. +瓦礫を使い、拘束具の切断を試みた。 +You rub the item against the broken object's sharp edges... +鋭利な瓦礫をつかみ、拘束具の切断を試みた…… +A hook hangs at shoulder height. +肩の高さにフックがある。 +The hook is too high up! You can't reach it... +フックが高すぎて届かない…… +There's a hook on the wall. +フックは壁に付いている。 +The wall is cracked. +壁にヒビがある。 +You rub yourself on the corner... +カドに体を擦り付けた…… + + +Many ropes emerge around you, removing weaker ropes from your body and binding enemies! +周囲に大量のロープが出現し、弱いロープが敵を縛る! + + +Choose Class: +クラスを選択: + + +Distraction Mode: +ディストラクションモード: + + +Progression Mode: +進行方式: +Key Hunt +鍵 +Random +ランダム +Selected +選択 +You will need to find the key to proceed to the next floor. +次の階層へ行くには鍵が必要。 +Each floor will have a random task to unlock the stairs. +次の階層へ行くにはランダムな任務が必要。 +You will select your task for each floor before you enter. Requires Perk Progression. +次の階層へ行くための任務を選択できる。階層ボーナスモードをオンにする必要がある。 + + +Perks Mode: +パークポイント +Extra +追加 +Less +少ない +Much Less +とても少ない +No pain, no gain. +痛みなくして得るものなし +### Gain 20 extra perk points, to give you a false sense of security. + +### Lose 20 perk points, just to keep things interesting. + +### Lose 50 perk points, making things very interesting. + + + +Perk Progression Mode: +階層ボーナス: +Disabled +なし +Optional +選択 +Mandatory +強制 +Debuffs Only +デバフのみ +No perks between floors. +階層を降った際に、パークが出なくなる。 +The standard mode. You may choose between one of three perk altars between floors. +通常のモード。階層を下るごとに、3つのパークから1つだけ選べる。 +A twist on the standard mode. You must choose before progressing. +3つのパークから必ず選ぶ必要がある。通常モードに一捻り。 +You must pick a debuff between floors before progressing. +デバフのみが出現する。 + + +Perk Shrine Bondage: +祭壇の拘束: +Never +なし +Sometimes +時々 +Always +常に +Perk shrines will not offer bondage as part of the deal. +パークの祭壇からパークを受け取っても拘束されない。 +Bondage will sometimes be offered alongside perks. +パークの祭壇からパークを受け取った時、稀に拘束される。 +Perk shrines are always accompanied by bondage. +パークの祭壇からパークを受け取った時、常に拘束される。 + + +Perk Shrine Bondage Info: +祭壇の拘束の説明: +Hidden +隠す +Partial +一部 +Full +全部 +You do not know if a perk shrine will apply bondage. +選択するまでわからない。 +You know that a perk shrine will apply bondage, but not what kind. +祭壇に拘束されることはわかるが、種類まではわからない。 +You know the exact restraints a perk shrine will apply. +祭壇に拘束される際、種類が全てわかる。 + + +### Difficulty: + +Normal Mode +ノーマル +Hard Mode +ハード +### Extreme Mode + +A supposedly reasonable difficulty curve. +普通の難易度。サクサクプレイ用 +Play the game the way it was intended. Cruel and restrictive. +意図された本来の難易度。適度にもがきたい人向け。 +Play at your own peril. Unlocked by double-clicking the Hard Mode button. +自己責任。ハードモードをダブルクリックで解除。 + + +Aroused +興奮 +Removes all chastity belts, vibrating restraints, plugs, and removes the option to play with yourself. +貞操帯やプラグ等のオモチャ類をゲームに登場させない。 +Includes all that good stuff. +全ての拘束具がゲームに登場する。 +Allow Front Plugs +前のプラグ許可 +Allow Rear Plugs +アナルプラグ許可 +Allow Piercings +ピアス許可 + + +Start with 150 willpower and Iron Will, good at melee and blocking attacks. +最大気力150、パーク「鉄の意志」を所持。近接攻撃で戦うクラス。 +Start with 150 stamina and Sneaky, good at stealth and evasive gameplay. +最大スタミナ150、パーク「隠密」を所持。隠密と回避を主体にするクラス。 +Start with 150 mana and Magical Sight, good at casting spells. +最大マナ150、魔法「マジカルサイト」を所持。様々な魔法を使うクラス。 +Start with nothing to your name. For those who want a challenge. +名前以外何もない。真の挑戦者用。 +You are a mage, but haven't finished your formal 'training'. Requires Aroused mode. +”しつけ”の途中で逃げ出してきたペット。制限なしモードを選択する必要がある。 + + +Spell Choice: +スキル選択: + + +Choose Spells +スキルを選ぶ +Random Spells +スキルをランダムにする +Break orbs. Get points. Buy spells. It's that simple. +オーブを破壊した時、スキルポイントを得る。 +Break orbs and pray you get something good. +オーブを破壊した時、ランダムでスキルを取得。 + + +Save Mode: +セーブモード: + + +Save Codes +セーブコード +Roguelike +ローグライク +Grants a save code every floor you can write down. Autosaves only on floor start. +フロア毎にセーブコードが出現。フロアのはじめにオートセーブ。 +No save codes, forced autosaves. You are in it to win it. +セーブなし。一本勝負。 + + +Prison Strictness: +牢屋の厳重さ: + + +Easy +簡単 +Strict +厳重 +If you get captured, you might get rescued if you have good relations. +捕まった時、関係性の高いグループが助けに来てくれる可能性がある。 +If you get captured, you will always get rescued and pay a fee. +捕まった時、少しの対価を払えばすぐに解放してくれる。 +If you get captured, you are totally on your own. +誰も助けてくれない。 + + +Start Playing +ゲームスタート +Lock your settings in, nice and tight. +現在の設定でゲーム開始 +Start with some perks that increase strictness and immersion. +没入感と難易度を上昇させるいくつかのパークを所持して開始。 +Choose some perks to spice up your run. +パークを選ぶ + + +This game engages in safe and consensual analytics. +このゲームは、安全で同意のある分析に取り組んでいます。 +It sends data about spell choices, levels reached, etc, to help balance and improve the game. +魔法の選択、到達レベルなどに関するデータを送信し、ゲームのバランスと改善に役立てます。 +No personal data is sent or stored. +個人情報が送信、保存されることはありません。 +Accept +分析を許可 +Don't Track Me +分析を許可しない +Proceed +続行 + + +Your key to the stairs is taken away! +階段の鍵を没収された! +You found a keyring to the stairs! Now you just need to get there. +階段の鍵を見つけた!次のフロアへ移動可能になった。 + + +Behold my SPL! +我がSPLを見よ! +Mmmph... SPL... +うぅぅ……SPL…… +Oh noes... +あちゃー…… +Ueeee! +うえーっ! +I don't want to be your slave! +アンタの奴隷になんかならないわ! +Catch me if you can! +捕まえられるものなら捕まえてみなさい! +I've been naughty, looks like I need to be punished... +いたずらしちゃった……お仕置きしてくれる? +I've been a bad girl, won't you do something about it? +悪い子だから、何もしてくれないの? +Mmmph... maybe I talk too much... +うーん、喋りすぎたかな…… +Well well, what have we got here? +よしよし、何をして遊びましょうか? +You're not here to take away my pets, are you? +私のペットを奪いに来たんじゃないでしょうね? +You'd make a lovely pet... +あなたも飼ってあげるわ…… +Daww, you're so cute when you're struggling! +もがく姿もとっても可愛いのね! +Let's take you back to your space~ +お家に帰りましょうね~ +You need to be bound tight! +縛ってあげるからこっちに来なさい! +Cleaning up for me, huh? +お掃除してくれたの? +Uh uh, give that back! +さっさと鍵を返しなさい! +What do we have here? An intruder? Or a future pet? +新しいペットが来たのかしら? +I see how it is. +そう来ると思ったわ。 +I've taken on hundreds of adventurers like you. +あなたみたいな冒険者はこれまでいっぱいいたわ。 +You don't stand a chance. +勝ち目はないわよ。 +Your magic is nothing compared to mine! +私の魔法の足元にも及ばないわね! +I've been a master wizard for over a thousand years! +私は千年の時を生きる魔術師よ! +You call that a spell? +そんなのが魔法? +My spells are far superior! +これが本当の魔法よ! +She won't help you! +女神は助けてくれないわよ! +Not yours! +ちょっと盗まないでよ! +Oh, that's not going to help~ +そんなことしたってどうにもならないわよ。 +Let's play a game! +ゲーム開始ね! +Didn't think you would get away, did you? +逃げられるわけ無いでしょ? +Oh ho~ +ほぉ~ +'Tis but a scratch! +掠っただけよ! +You'll be my pet soon~ +さっさと私のペットになりなさい! +Cute~ +かわいい~ +Don't even try~ +無駄よ! +It's over~ +はいおわり~ +Get over here! +こっちへ来なさい! +Not so slippery now! +今度は逃さないわ! +I'll be taking that~ +いいもの持ってるじゃない。 +'Click!' +カチッ +In the name of PTRN, I order you to kneel! +PTRN の名において、跪きなさい! +You're in my way. +邪魔よ。 +Step aside, pet. +どきなさい。 +Get her, my pets! +ペットたち、あいつを捕まえなさい! +Hey! Don't touch that! +ちょっと!それには触らないで! +Why you... +どうして…… +You can't do that! +それはだめよ! +Leave them alone! +何処か行って! +Hey, stop that! +ねぇ、それはやめて! +### Why do I hire these people... + + + + + +Activate SPL protocol. +SPL発動。 +What do you mean 'access denied'??? +「アクセス拒否」!? +Release me at once. +直ちに解放しなさい! +This is unacceptable! +このようなことは許されませんよ! +Guards! Guards... Guards? Well drat. +衛兵!衛兵……衛兵?そんな…… +You'll never get away with this! +こんなことをしてただで済むと思わないで! +Look, another one of my dolls~ +あら、また人形になりたい子が来たのですね。 +Come to me, my lovely thing~ +こちらへいらっしゃい、可愛い子。 +I want to hear you moan~ +はやく喘ぎ声を聞かせてください。 +Perhaps we need to make things tighter? +もっときつく縛ってあげましょうか? +Come with me, dear~ +さぁ、こちらへいらっしゃい。 +You've had too much freedom. +自由時間は終わりですよ。 +Leave that for the cleaning robots. +そういうことは掃除ロボットに任せてください。 +Skulking around, are we? +何をしているのですか? +I see you. +見ましたよ。 +There's no point in fighting. +争いは無意味です。 +How ineffectual. +非力ですね。 +That's cute. +可愛いですね。 +Your magical potential is impressive~ +素晴らしい魔法の才能ですね~。 +A magnificent display of magic! +あなたを展示してあげましょう。 +You would make a great mana source~ +立派なマナタンクにしてあげますよ。 +Did you think you could outsmart me? +私を出し抜けるとでも? +I am the only goddess you need. +私こそがあなたの神ですよ。 +Dolls shouldn't mess with things they don't understand. +人形は余計なものに手を出してはいけませんよ。 +Let's take you somewhere safe~ +隔離する必要があるみたいですね。 +You won't be getting away. +逃げられませんよ。 +Did you think that would work? +そんなものが通用するとでも? +Let's put those hands of yours away~ +拘束する必要があるみたいですね。 +You are mine. +私の人形になりなさい。 +You're a fast one. +あら、素早いですね。 +Your antics amuse me~ +面白いですね~。 +It's time for your makeover! +終わりです。 +Come to me. +こちらへ来てください。 +A shame it ends here. +ここで終わってしまうのは残念ですね。 +You won't be needing that. +これは人形には不要ですね。 +Tsk Tsk. I'll be keeping the keys. +鍵は預かっておきますね。 +I used to be an adventurer like you~ My name was PTRN... +私も昔は冒険者だったんですよ。名前は PTRN と言いまして…… +You don't know who you're messing with. +誰に何をしているのかわかっているのですか? +You won't be allowed to make that mistake twice. +二度目はありませんよ。 +I'll punish you myself. +私自らが罰してあげましょう。 +Hands off my property. +ここから去りなさい。 +Know your place, girl! +立場をわきまえなさい。 +You've had your chance. +最後のチャンスですよ。 +Fine, then. +結構です。 +Know your place! +立場をわきまえなさい。 +*sighs* +はぁ…… + + + + +Hmmph~ +ふふふふ…… +My mistake~ +おっと、間違えた。 +This wasn't supposed to happen. +そんな、あり得ない…… +The Collector has become the Collected. +コレクターがコレクションになるなんて。 +Fine, you win! +わかった、あなたの勝ちよ! +Cover me you brats! +援護して! +She's coming for me! +奴が来るぞ! +Stay away! +近寄らないで! +Time for a taste of my own medicine... +自業自得ね…… +I wonder how many days we'll get to spend together! +どのくらい一緒に? +You look so pretty as always, and forevermore~ +相変わらず可愛いわね。 +Time for an inspection~ +検査の時間よ。 +There's no use in struggling, dear! I've made sure it's extra tight. +いくらもがいても無駄よ、きつ~く縛っておいたから。 +Playtime is over, back to your cell~ +はい、遊びは終わり。牢屋に戻ってね。 +Why aren't you wearing your restraints? +拘束具はどうしたのかしら? +I did not order you to clean~ +掃除しろとは言っていないわよね? +What's that you've got there? +それは何? +Found you! +見つけたわ! +I've been waiting for this~ +この瞬間を待っていたわよ。 +Show me your moves. +さあ、あなたの技を見せてみなさい。 +You'll make for a fine servant! +良い下僕になりそうね! +Very impressive. +印象的ね。 +Yes, yes, show me what you've got! +そう、そうよ!もっと見せて! +I've always wanted another mage. +もう一人魔法使いが欲しかったの。 +Tsk tsk, no silly tricks~ +うふふ、馬鹿な真似はしないでね? +Now now, you don't have permission to do that~ +そんなことをして許されるとでも? +What do you think you're doing? +何のつもり? +Typical adventurers~ +典型的な冒険者ね。 +Oh, you got out? +あら、出ちゃったのね? +Too bad~ +残念ね~。 +That thing is dangerous, my dear~ +こんな危ないものを持ってちゃだめよ? +A feisty one, aren't you~ +気の強い子ね~。 +Playtime's over~ +お遊びはおしまいよ。 +Very nice. +素晴らしいわ。 +Most impressive! +すごく印象的ね! +You need more training! +もっと調教が必要みたいね! +Come along now~ +こっちへおいで。 +Come closer, I want to see your face~ +もっと近くに来て、顔を見せて。 +What a shame. +残念ね。 +What's this? +なにこれ? +See if you can get out of that! +抜け出せるかしら?じっくり見てあげるわ。 +I am the Warden. All things in this dungeon are subject to me. +私は看守長、このダンジョンの全てを統べる者よ。 +Hands off my pet~ +私のペットに手を出しちゃだめよ? +Careful what you ask for~ +気をつけてね。 +Be gentle with her~ +優しくしてあげてね。 +That's my property~ +私のよ。 +You've made some enemies, haven't you? +敵がいるみたいね? +I should teach you to be a nice girl. +いい子になるよう躾けてあげないとね? +You need to learn some manners~ +少しマナーを身に着けたらどう? +This will be entertaining. +面白くなりそうね。 +Show me what you've got~ +何ができるか見せてみなさい。 +I'll watch~ +見てるわ。 + + +Submit to my SPL! +SPLの前に屈しなさい! +Hmmmph... SPL-- +んうぅ……SPL――。 +Fine then! Have it your way. +いいわ、好きにしなさい! +You'll be sorry you didn't listen to me~ +忠告に耳を傾けなかったこと、後悔することになるわよ。 +Why must you be so difficult! +気難しいんだから! +They're coming for me! +奴らが来る! +Do you know of the Dollmaker? I've got a proposal for you and I... +ドールメイカーって知ってる?ちょっと提案があるんだけど…… + + +I cast SPL! +SPLを唱えるよ! +That wasn't supposed to happen! +こんなはずじゃ! +This is too tight... +きつすぎ…… +I can't get free! +逃げられない~! +Hey! Where do you think you're going? +どこに行くつもり? +You look like you're having fun! +楽しんでいるのね。 +I have somewhere else in mind for you~ +あなたのために特別な場所を用意したのよ。 +What do you think you're doing with that? +それをどうするつもり? +Looks like you found my keys! Hand them over. +鍵を盗んだの?渡しなさい! +Alert! +脱獄だ! +You look like a good girl. Come on~ +いい子だからこっちにいらっしゃい。 +Come here, let's play! +ちょっといいことしましょう! +*grins and starts walking toward you* +(笑顔でこちらに向かってきた) +Hey! Play nice! +暴力はダメよ! +Stop that! Guards! +警備員さん! +You're mine! +私のものにしてあげるわ! +Sorceress! +魔法使いだ! +Get her! +捕まえろ! +She's a mage! Stop her! +魔法使いだ!捕まえろ! +Watch it! +気をつけろ! +Don't touch that! +祭壇に触れるな! +We have an escapee! +脱獄よ! +Not so fast! +遅い! +Try that again! +もう一回やってみろ! +Do your worst! +その程度? +Got you! +くらえ! +Get back here! +ちょっと! +Missed me! +危ない! +You're coming with me! +一緒に来なさい! +Hand it over. +それを渡しなさい! +Nice and tight! +いい感じ! +The name's PTRN. +私は PTRN 。 +What the-- +マジ? +You won't get away with this! +どこにも行かせないよ! +I'm coming! +ただいま! +I can't let you do that! +そんなことしたらだめだよ! +You'll pay for this! +お返しするよ! +That was a mistake! +そんなことするべきじゃなかったね! +I'm joining in! +私も参加させて! +Hand on, I'm coming! +今行く! +I'm here! +ここだよ! +Here I come! +来たよ! +Come and get me! +捕まえてみなさい! +You'll never escape! +逃げられないぞ! + + +Mmmphh! +うぅぅっ! +Mmmm! Mmmmmmm! +んんっ!んんんんっ! +Mmmmph!!! +むぅぅぅん! +Mmmmm~ +んぅぅ~ +Mmmgh! +んむぅ! +Mmmmmm <3 +むぅぅ +Mmmmmm~ +んぅ~ +Mmmph~ +むうぅ…… +*looks at you nervously* +(神経質にこちらを見ている) +*giggles* +(笑っている) +*giggles eagerly* +(笑っている) +Mmmph? +むんぅ? +Mmmghgh!!! +むぉぉぉっ! +Mmmmph! +んっ!んんっ! +Mmmmph... +んんっ…… +Hhhhmph! +んぅぅっ! +Mmmph! +んぐっ! +Nngghhh! +んぐぅっ! +Gggghh!!! +ぐぅっ! +Mmmaaghthh! +むぅっ、むぉぉっ +Wwwmmmthhh! +ううんんっ! +Mmmmmph! +むぅうぅっ! +*looks at you suspiciously* +(怪訝そうにこちらを見ている) +*looks at you angrily* +(怒っている) +*jumps up and down excitedly* +(興奮して飛び跳ねてる) +*groans* +(呻いている) +*does a happy dance* +(嬉しそうに小躍りしている) +Mmmph!!! +んむぅぅ…… +Mmm-hmmm. +ふぅーっふぅーっ +Mmmmmmm~ +むんん~ +*Her nametag says 'PTRN'* +(ネームタグには PTRN と書かれている) +Mmmph!! +むぅぅっ! +Mmmm--! +んんーっ! +Mmmmph. +むぐっ +Mmmmmmmgh! +んんん! +Mmph! +んぅっ! +Mmmmmmmph... +んふぅぅっ…… + + +MMMMMPH!!! +んぉぉぉ!!! + + + + + + +*focuses intently* +(集中している) +*appears distracted* +(集中できていないようだ) +*Mmmmmm~* +………… +*muffled giggle* +(おそらく笑っている) +Mmmm~ +……! +*glows with anger* +(とても怒っているように見える) +*Her headpiece says 'PTRN'* +(額のプレートに PTRN と書かれている) + + + + +Watch out for my SPL! +アタシのSPLを喰らいな! +Whoops! +おっと! +You won't get me like this! +こんなのすぐに逃げ出してやる! +You'll never catch me! +捕まるもんかっ! +Where'd you come from? +アンタどこから来たんだい? +No! Definitely don't like... tie me up and punish me! +嫌だ!縛られてオシオキなんて死んでもカンベンだよ! +I've come to turn myself in~ +実は自首しに来たんだ…… +Won't you 'apprehend' me? +アタシを逮捕してくれないかい……? +I've been a bad girl~ +アタシは悪い女なんだ…… +Hey! You should know your place. +ちょっと!自分が何をしてるのかわかってるのかい!? +Look who's enjoying herself~ +随分と楽しそうだねぇ~ +Let's put you up for auction! +アンタをオークションに出して一儲けしようかね! +What are you rummaging around for? +何コソコソしてるんだい? +Oh no you don't! +何やってるんだい! +You're not supposed to be here... +ここから出ていきな…… +I'm gonna teach you a lesson, girl. +ちょっとオシオキが必要みたいだね、お嬢ちゃん…… +I'm gonna miss you when we find you a nice master... +買い手が見つかると寂しくなっちゃうね…… +Looks like you need some training, girl. +調教が必要みたいだね、お嬢ちゃん。 +You picked a bad time to get lost, friend. +まずいときに道に迷ったようだね! +Never should have come here. +ここに来るべきじゃなかったな! +I used to be an adventurer like you. +アタシも昔はアンタみたいな冒険者だったんだ。 +You must be one of those wizards. +アンタも魔法使いなのかい? +The mages sell real well... +魔法使いは高く売れるんだよ…… +Mage! Stop her! +魔法使いだ!そいつを捕まえろ! +Not on my watch. +見てないとでも思ったかい? +That's my stash... +それはアタシのだよ……! +You'll fetch a pretty penny from that goddess you just pissed off. +あの女神を怒らせてみな、大金が手に入るよ。 +Hah! Found ya! +ハッ!見つけた! +*scoffs* Amateur. +素人が! +Hmph. Get back here! +躱すな! +Why won't you surrender! +さっさと降参しな! +Not a chance! +勝ち目はないよ! +Boss! We got another one! +ボス!新しい商品を見つけてきたよ! +Caught ya~ +捕まえたよ! +Dibs on this one! +これは渡さないよ! +Gotta make sure no one gets to you~ +誰にも邪魔されないようにしないとね! +I'm PTRN. And who might you be? +アタシは PTRN 。アンタは? +Bad time to party, girl~ +パーティはもう終わりだよ、お嬢さん。 +You've got nerve showing your face around here. +こんなところに来るなんてどんな神経してるんだい? +Don't think you can get away~ +逃げられるなんて思わないことだね! +Trying to fight your way out? +逃げる気かい? +Well, looks like I'm having fun today. +楽しい一日になりそうだね! +Hey girls, got room for one more? +お嬢さんたち、アタシの席はあるかい? +We work for the highest bidder. +アタシは金払いの良いやつは好きだよ。 +Nothing personal. +仕事をこなすだけさ。 +Sorry, it's just the way things work. +悪いけどそういうことなんだ。 +You're mine. +お前はもうアタシのものだ! +You can't get away. +逃げられないぞ! + + +*extends an arm* +(腕を広げている) +*miscast* +(失敗したようだ) +*wiggles* +(身を捩っている) +*struggles* +(もがいている) +*rattles* +(ガラガラ音を立てている) +This is a bug, please report +!!!このセリフが表示されるのはバグです。報告お願いします!!! +*starts chasing you* +(追いかけてきた) +*won't leave you be!* +(逃がす気はないみたいだ) +*tugs at your body!* +(身体を引っ張ってきた) +*runs at you* +(走り寄ってきた) +*notices you!* +(こちらに気づいたようだ) +*claps loudly* +(大きく拍手している) +*wants to socialize* +(社交的なポーズをしている) +*sends shivers down your spine* +(背筋を震わせてる) +*is rattled* +(ガラガラ音を立てた) +*scrabbles slowly by* +(ゆっくりと通り過ぎる) +*shrieks* +(骨をきしませている) +*wants to shock your soul* +(魂に衝撃を与えたいようだ) +*comes to seal your doom* +(こちらを封印しに来た) +*shouts a startling shrilling scream!* +(突然悲鳴をあげだした!) +*walks toward you with arms outstretched* +(両手を広げて歩み寄ってきた) +*defending the goddess* +(女神を守ろうとしている) +*defends its cache* +(宝物を守ろうとしている) +*lets out a shriek* +(悲鳴をあげだした) +*tries to catch you* +(こちらを捕まえに来た) +*grabs you* +(掴んできた) +*disarms* +(武装解除された) +*rattles excitedly* +(興奮気味に骨を震わせている) +*misses* +(よろめいている) +*flails uselessly* +(怯んでいる) +*trembles* +(震えている) +*tugs on leash* +(リードを引っ張ってきた) +*Wears a sign saying 'PTRN'* +(付けている札には PTRN と書かれている) +!!! +!!! +! +! + + +*marches* +(こちらに向かってきている) + + +Engaging SPL! +SPL使用! +A-Access denied!? +ア、アクセス拒否!? +This... this unit is doing a good job! I swear! +これは……このユニットは使えそうですね。 +It's just business as usual, nothing to see here... +この程度いつものことです…… +It's not like I need reconfiguring or anything... +再設定は必要ありません…… +You! I require... reconfiguring. +再設定をお願いします。 +Oh no! Looks like I need repairs~ +修理が必要みたいです、お願いします。 +I've violated my parameters. Please discipline me. +規則に違反してしまいました、罰をお与え下さい。 +Stop! You're not wearing the required uniform~ +止まって下さい、あなたは規則で定められた拘束具を装着していません。 +Are your restraints too loose? Do I need to tighten them? +拘束具が緩んでいるのですか?きつくして差し上げましょうか? +Transferring to a secure location. +安全な場所まで護送します。 +You've violated your parameters. +規則違反を確認しました。 +Insufficient security clearance. Hand it over. +セキュリティクリアランスに違反あり、それをお渡し下さい。 +Please present your identification! +身分証明書をご提示下さい! +Hello doll. Do your settings need adjustment? +こんにちは、人形さん。セッティングに調整は必要ですか? +Looks like you've had too much time to yourself~ +休眠時間が長すぎたようですね。 +A good doll needs routine maintenance~ +よく働くためには定期的なメンテナンスが必要なんです。 +Ehh! The dolls aren't supposed to fight back! +うぐっ、人形は反撃してはいけませんよ! +In-initiating corrective action! +矯正措置を開始します! +Alert! Inmate has gone rogue! +警告、受刑者が暴れています! +Who gave you permission to use magic? +魔法を使用する権限は与えら得れていないはずですが? +Unauthorized use of magic is grounds for increased security. +許可されていない魔法の使用は禁止されています。 +Magic users require extra security! +魔法使いと認定、より強固な拘束を施します。 +Subduing assailant! +加害者を制圧します! +You're not allowed to contact the goddesses. Please meditate on this in your cell. +女神との接触は許可されていません。牢屋にお戻り下さい。 +Behavior exceeds parameters. Please submit to arrest. +その行動は許可されていません。逮捕します。 +Alert! Inmate has escaped! +警告!脱獄です! +Don't you want to be trained? +調教されたくないのですか? +Aren't you a violent one! +加害行動を確認! +Ouch! That hurt... +痛いです。やめてください。 +That'll be all from you! +その程度ですか? +Your brat quotient is off the charts. +イラつかせてくれますね。 +Please stop and submit to arrest. +大人しく投降して下さい。 +Subject captured! +容疑者確保! +Come back, doll! +人形は大人しくついてきて下さい。 +Deploying capture device. +キャプチャーデバイス起動。 +I'll be confiscating that! +没収します。 +How'd you slip through security? +あなたがどのようにセキュリティをかいくぐったのか興味があります。 +I'm PTRN, and today I shall be taking care of you~ +私は PTRN です。本日はあなたに同行させていただきます。 +Enemy spotted! +敵を視認しました。 +Target in my sights! +目標を設定しました。 +Red alert! +警告! +Lay down your weapons! +武器をおろしなさい。 +Surrender and I'll be gentle! Relatively speaking... +投降すれば手荒な真似だけはしません。 +Give up or I'll call reinforcements! +諦めて投降してください、さもなくば増援を呼びます。 +Ack! We have an unruly subject! +うっ……強敵です。 +Target needs retraining... +ターゲットに再教育の必要性を確認…… +Sorry, rules are rules~ +規則は規則ですから。 +Moving to assist! +援護します! +My orders are to shut you down~ +あなたを制圧します。 +Defenses online! +ディフェンスモジュール起動。 + + +SPL armed. +SPL実行。 +An exception has occurred while trying to run SPL. Retry? +SPLノ実行中ニ例外処理ガ発生。再試行シマスカ? +Error in citizen ID registration. Please submit to processing. +ID登録エラー、処置開始。 +Does not compute. +計算不能 +Some kind of miscalculation has occurred. +計算エラー +This was unforseen. +予測エラー +Unit is retreating. +後退開始 +Activating self-preservation instincts. +自衛機能発動 +Commence tactical withdrawal. +戦術的後退 +Maintenance needed. +メンテナンスガ必要デス。 +Unit needs repair. +ユニット損傷、修復ヲ要求 +Commence transfer of power protocol. +送電プロトコル開始。 +Insufficient bindings. Commence submission protocol. +拘束具ノ不足ヲ確認。拘束プログラム起動。 +Commence routine inspection. +定期検査ヲ開始。 +Inmate is out of containment. Transferring. +囚人ヲ輸送シマス。 +Theft detected. This is a warning. +警告、窃盗ヲ確認。 +Confiscating item. +没収シマス。 +Unknown subject detected. Presuming hostile. +不明ナ人物ヲ検知、敵ト認定。 +Inmate detected. Commence training protocol. +囚人ヲ確認。トレーニングプロトコル始動。 +Inmate detected. Commence routine inspection. +囚人ヲ確認。定期検査開始。 +Inmate detected. Commence submission training. +囚人ヲ確認。トレーニング開始。 +Violence detected. Subduing assailant. +暴力ヲ検知。制圧シマス。 +Damage detected. Initiating combat routine. +損傷ヲ検知。戦闘態勢ニ入リマス。 +Unruly inmate detected. Performing corrective action. +囚人ノ規則違反ヲ検知。調教措置を開始シマス。 +Magic detected. Subduing assailant. +魔法ヲ検知。制圧シマス。 +Energy spike detected. Preparing shields. +不明ナエネルギーヲ検知。シールド展開。 +Unlawful use of magic. Please submit to arrest. +魔法ハ許可サレテイマセン。確保シマス。 +Unlawful conduct. Please submit to arrest. +ソノ行動ハ許可サレテイマセン。確保シマス。 +Theft detected. Please submit to arrest. +窃盗ヲ検知。確保シマス。 +Inmate has escaped. Commence capture protocol. +脱獄ヲ確認。捕獲プロトコル起動。 +Error, subject is attempting to escape. +エラー。抵抗ヲ検知。 +Target is violent. Disarming subject. +暴力ヲ検知。武装解除シマス。 +Target is violent. Increase alert level. +暴力ヲ検知。警戒レベル上昇。 +Dispensing restraints. +拘束シマス。 +Target flees. Revising strategy. +回避ヲ確認。戦略システム変更。 +Target resists. Revising tactics. +抵抗ヲ確認。戦闘ロジック変更。 +Target skill below expected level. Revising strategy. +ヘタクソ。戦略システム変更。 +Target skill below expected level. Revising tactics. +ヘタクソ。戦闘ロジック変更。 +Subject captured. Returning to processing. +ターゲット確保完了、コレヨリ護送シマス。 +Apply takedown protocol. +強制移動プロトコル開始。 +Aggressive target detected. Deploying countermeasures. +抵抗ヲ確認。対策ヲ検討中……。 +Contraband detected. Confiscating. +許可サレテイナイ物品ヲ確認。没収シマス。 +Increasing strictness level. +拘束レベル上昇。 +Unit PTRN identifying. +識別ネーム PTRN 。 +Red alert. Joining combat. +警告、戦闘ニ参加シマス。 +Battle stations. +戦闘開始。 +Target identified. +ターゲット確認。 +Offering support. +承知シマシタ。 +New target identified. Engaging. +新ターゲット確認。エンゲージ。 +Combat detected. Engaging in corrective action. +戦闘ヲ確認。参戦シマス。 +Updating target registry. Proceed to attack. +ターゲット、アップデート。攻撃開始。 +Target updated. +ターゲット、アップデート。 +New target detected. Please submit to detainment. +新ターゲット確認。降参シナサイ。 +Moving to assist. +援護開始 +Moving to capture. +捕獲開始 +Forming blockade. +防衛網形成 + + +### SPL(); + +throw new Error(SPL); +不明なエラー(SPL); +query([ID]); >ERROR; transport([UNKNOWN], [DOLL]) +query([ID]); >ERROR; ([UNKNOWN], [DOLL]) を輸送します。 +Does not compute; +計算不能; +Some kind of miscalculation has occurred; +予測演算のエラーを確認; +This was unforseen; +予期せぬ自体に遭遇; +Unit is retreating; +後退開始; +Activating self-preservation instincts; +自己防衛システム起動; +Commence tactical withdrawal; +戦術的撤退開始; +Maintenance needed; +メンテナンスを推奨; +Unit needs repair; +修理の必要あり; +Commence transfer of power protocol; +電力供給プログラム; +Insufficient bindings; Commence submission protocol; +対象の拘束が不十分; 制圧プログラム起動; +Commence routine inspection; +定期検査開始; +Inmate is out of containment; Transferring; +規則違反を確認; 輸送開始; +Theft detected; This is a warning; +窃盗行為を確認; 警告; +Confiscating item; +許可されていない所持品の確認; +Unknown subject detected; Presuming hostile; +不明な生命体を検知; 敵対生物と認定; +Inmate detected; Commence training protocol; +受刑者を確認; トレーニングプロトコル開始 +Inmate detected; Commence routine inspection; +受刑者を確認; 定期検査開始; +Inmate detected; Commence submission training; +受刑者を確認; 調教プログラム開始; +Violence detected; Subduing assailant; +暴力行為を検知; 脅威を拘束します; +Damage detected; Initiating combat routine; +損傷を検知; 戦闘システム起動; +Unruly inmate detected; Performing corrective action; +規則違反を検知; 懲罰プログラム起動; +Magic detected; Subduing assailant; +魔法を検知; 脅威を拘束します; +Energy spike detected; Preparing shields; +異常な力場を検知; シールド起動; +Unlawful use of magic; Please submit to arrest; +許可されていない魔法を検知; 逮捕します; +Unlawful conduct; Please submit to arrest; +許可されていない行為を検知:\; 逮捕します; +Theft detected; Please submit to arrest; +窃盗行為を検知; 逮捕します; +Inmate has escaped; Commence capture protocol; +受刑者の脱走を確認; 捕獲プログラム起動; +Error, subject is attempting to escape; +エラー、逃走の意思を確認; +Target is violent; Disarming subject; +脅威を確認; 武装解除を優先; +Target is violent; Increase alert level; +脅威を確認; 警報レベルを引き上げます; +Dispensing restraints; +拘束具射出; +Target flees; Revising strategy; +ターゲットの回避を確認; 戦闘プログラム変更; +Target resists; Revising tactics; +ターゲットの抵抗を確認; 戦略プログラム変更; +Target skill below expected level; Revising strategy; +予測を下回る行動を検知; 戦闘プログラム変更; +Target skill below expected level; Revising tactics; +予測を下回る行動を検知; 戦略プログラム変更; +Subject captured; Returning to processing; +捕獲完了; 帰還開始; +Apply takedown protocol; +テイクダウン・プロトコル開始; +Aggressive target detected; Deploying countermeasures; +ターゲットの抵抗を確認; 対抗措置の実践を開始; +Contraband detected; Confiscating; +密輸品の所持を確認; 没収します; +increase_strictness(1); +拘束強化(1); +### query([SELF]); >PTRN; + +Red alert; Joining combat; +レッドアラート; 参戦します; +Battle stations; +戦闘開始; +Target identified; +ターゲット確認; +Offering support; +支援開始; +New target identified; Engaging; +新たなターゲットを確認; エンゲージ; +Combat detected; Engaging in corrective action; +戦闘行為を確認; 介入を開始; +Updating target registry; Proceed to attack; +ターゲットを更新; 攻撃開始; +Target updated; +ターゲット更新; +New target detected; Please submit() to detainment; +新たなターゲットを確認; 捕獲します; +defend([ALLY]); +警護:([ALLY]); +capture([CITIZEN]); +捕獲:([CITIZEN]); +defend([POINT]); +警備:([POINT]); + + +Behold my creation! SPL! +我が SPL を見るがいい! +No! Not like this! +待って、こんなはずじゃ! +Looks like I'm up to no good... better stop me! +良からぬ考えが浮かんできたな……止めるなら今のうちだぞ。 +Careful where you point that thing! +どこに向けるか気をつけろよ! +Containment breach! +収容違反だ! +What if I'm the assistant, for a change? +なあ、アシスタントにさせてくれないか? +Hey, could you test this on... me? +これを……私で試してみないか? +I'm willing to do anything for science! +科学の発展の為ならなんだってやるさ! +You're a fine specimen! +お手本のようないいもがき方だ! +I should take you to my office~ +私のオフィスに行こうか。 +You'd look good in some latex! +ちょっとこのラテックスを着てみないか? +Hey! That's mine! +おい!それは私のだぞ! +You're not supposed to have that! +鍵を持ち出すな! +Oh? +んん? +You'll make a fine test subject... +良い実験体になりそうだな…… +Come here, I want to perform some tests! +こっちに来い、少し実験したいんだ。 +Looks like it's time to drop some science! +科学の勉強の時間だ! +Bad girl! +悪い女だ! +Keep your filthy hands off me! +汚い手で触るな! +Your chances of winning are... less than zero. +キミの勝率は0%だぞ。 +Good girls don't use magic without permission. +許可なしに魔法を使うな! +Keep that magic away from my experiments! +実験器具の近くで魔法を使うな! +You're going to break something! +実験器具が壊れてしまうじゃないか! +That's dangerous! +危ないぞ! +Stop! That's scientific equipment! +やめろ!それは貴重な資料なんだ! +Don't touch my supplies! +私の道具に触るな! +That's off-limits! +オーブに触れる許可は出していないぞ! +You're not supposed to be here! +ここは立入禁止だぞ! +Now now, you won't be going anywhere~ +どこにも行かせないからな! +A calculated success! +計算された成功だ! +Watch the vials! +この小瓶が割れても良いのか!? +I've caught you! +捕まえたよ! +I can't believe I missed... +計算を間違えるなんて…… +That's not fair! +ズルいぞ! +I knew you would do that! +お見通しだ! +Experiment was a success! +実験成功! +Gotchya! +ガッチャ! +There we go! +これでよし! +Ooh, you've got some useful stuff~ +良いもの持ってるじゃないか! +I won't let you go that easily! +簡単には逃さないからな! +I am PTRN, the great scientist! +私は PTRN 、偉大な科学者だ! +Do I have to? Fine... +私にやれというのか?やれやれ…… +Okay okay, I'm helping! +わかったわかった、今助ける。 +Where's my assistant when you need them... +いつも必要なときにいなくなるんだよな…… +I will offer my support! +サポートするぞ! +You're really gonna make me do this? +本当にやらせるつもりか? +I hate having to clean up after others. +他人の後始末をするのは嫌いなんだ。 +Eh, whatever, I'll help. +ああ、手伝うよ。 +You're ruining my experiment! +実験が台無しじゃないか! +Sheesh, what a pest! +なんてこった! +Need an assistant? +手助けが必要か? +I smell an opportunity! +チャンスの匂いがする! +Do I have to? +やらなきゃいけないのか? + + +Let me introduce you to SPL~ +SPLを紹介させていただきますわね~。 +No! My SPL! +私のSPLが! +Oh my, looks like I'm in trouble! +あら、何か面倒事に巻き込まれちゃったみたいですわね。 +What a shame it would be if I got caught~ +捕まったら何をされてしまうのでしょう? +Looks like I'd better get going~ +そろそろ行きますわね~ +What if I became the victim of my own inventions... +もしこれを自分で着てしまったら…… +Oh my, looks like I'm in trouble~ +あら、困ったことになったみたいですわね~。 +Won't you help me get dressed? +このドレスを着るのを手伝っていただけません? +You look just gorgeous, dear... +とてもゴージャスに見えますわ。 +Why don't you try these on? +これを試してみてくださらない? +You'll make a fine addition to my collection! +私のコレクションに加えて差し上げますわ! +Such jaw-dropping beauty! +とても美しいですわ! +You belong on a display stand! +デイスプレイスタンドにして差し上げますわ! +We should put away those grasping hands of yours~ +大人しくしててくださいまし。 +That belongs to someone else. +それはあなたのものではないでしょう? +Oh no you don't, sweetie! +鍵なんて持っていてはだめよ! +You're a pretty one! Why don't you come here~ +あなた、とても可愛らしいですわね!ちょっとこちらに来ていただけません? +Oof! Looks like you need to be taught a lesson! +まぁ、ちょっとレッスンして差し上げますわ! +We better put away those hands of yours. +大人しくしていてくださいまし。 +Why don't you just give up and pose for us~ +諦めて着せ替え人形におなりなさい。 +Oh my, that's dangerous! +まぁ危ない! +You're going to damage my dress! +ドレスに傷を付けないでくださいまし! +Keep those pretty hands to yourself, dear~ +大人しくしていなさいな。 +Where'd you find that, dear? +どこでそんなものを見つけましたの? +Silly girl, you should be looking to your mistress for guidance. +あらあら、女王のルールを忘れましたの? +That's not yours, sweetie~ +他人の物を勝手に持ち出すのはマナー違反ですわよ? +You shouldn't break things with such dainty hands~ +そんなことをしたら綺麗な手が傷ついてしまいますわ! +I knew something was amiss! +何かおかしいと思いましたの! +You won't be getting away that easily, dear~ +簡単には逃しませんわよ~。 +Won't be needing this~ +こんなものは必要ありませんわ~ +Hey, you'll damage my dress! +ちょっと、ドレスに傷がついてしまいますわ! +I'm so excited! +楽しいですわね! +A slippery one, aren't you? +ちょっと滑っただけですわ! +A brave one, aren't you? +勇敢ですわね! +Tsk tsk. You can do better, dear~ +ほらほら、もっと上手に踊りなさいな。 +I can't wait to dress you up! +はやくドレスを着せたいですわ! +So nice of you to join me! +それじゃあ行きましょうか~ +Now let's see, what kind of dress... +さて、どんなドレスにしましょうか…… +A gift? Thank you so much! +あら、くださるの?ありがとうございます! +You won't be getting out of that any time soon! +これならすぐには抜け出せませんわね! +I'm PTRN. Have you heard of my dresses?~ +私は PTRN と申します。私のドレスについて聞いたことはありますか? +That won't do! +それはだめですわ! +I'd like to have you myself! +あなたのことが欲しくなりますわ! +Oooh, a cute one! +まぁ、なんて可愛らしい! +*sigh* how improper... +はぁ、なんて不謹慎な…… +Inelegant! You need some teaching! +少し教育が必要みたいですわね! +*snaps her fingers* Looks like you'll need some punishment~ +(彼女は指を鳴らした)少しおしおきが必要みたいですわね~ +That one is pretty. May I have her instead? +可愛い子ですわね、私がいただいても? +I'd like to place a bid too~ +私も手伝いますわ~ +Oooh, that one's mine! +まぁ!この子をいただいてもよろしくて? + + + + + + +SPL. +SPL。 +... +………… +No! I don't want to read your magazines! +ちょっと、そんな漫画読みたくありません! +No, I don't want to learn about Shibari! +緊縛についての知識なんて興味ありません! +No, I don't want to learn about your toys! +あなたのオモチャになんて興味ありません! +I found this book about Shibari... is it yours? +先程緊縛についての本を見つけたのですが……あなたのですが? +I'm so clumsy... maybe you can fix that. +私って不器用なんですよね……ちょっと直すのを手伝ってくれませんか? +Gee, looks like I can't keep my mouth shut... +げふっ……すみません、お口を閉じる必要がありますね…… +Shhhhh. +シーッ +Be quiet. +お静かに。 +Keep your hands off my books. +私の本に触れないで下さい。 +Heh. Serves you right. +あー、はいはいわかりましたわかりました。 +Time to lock you away. +少しおしおきが必要みたいですね。 +Don't get your paws on anything important. +大事なものを踏まないで下さい。 +I was reading that! +それ読んでる途中だったんですよ! +You're not supposed to have that. +あなたはここにいてはいけませんよ。 +You. Stop. +止まりなさい! +Who are you? +どちら様? +You're entering my personal space. +ここは私の部屋ですよ。 +I'm going to ask you to leave +出て行って下さい。 +You're ruining the books! +本を傷つけないで下さい! +Do you need a gag? +猿轡が必要ですか? +Shut up. +静かにしてください! +Put that back! +元の場所に戻してきて下さい! +There's nothing to learn from that, you ignorant buffon. +そんなものから学べるものはありませんよ。 +Don't dive into someone else's belongings! +他人の持ち物を勝手に漁らないで下さい! +You've destroyed an ancient artifact, imbecile! +古代のアーティファクトを壊したんですか!?このおバカ! +I wish you'd just stay out of trouble... +またトラブルですか…… +Gotchya. +ガッチャ! +You're going to hurt someone with that. +これで何人も傷つけてきたんですね。 +My books! +大事な本が! +Stay down. +大人しくしなさい! +Get back here-- +躱さないで! +Just give it up. +諦めなさい! +Time for you to stay out of trouble. +トラブルから隔離しますね。 +Come along. +さっさと来なさい。 +Stay put! +大人しくしなさい! +I'll be taking that back. +これは返してもらいますよ。 +Click. +カチッと。 +If you really want to know, my name is PTRN. I am the keeper of this place. +本当に知りたいのですか?私は PTRN です。この場所の司書をしております。 +Typical. +典型的ですね。 +*sighs* Another one... +はぁ、次から次に…… +Keep the damage under control! +被害を最小限に抑えます! +Stop fighting, you guys! +争うのをやめなさい! +You'll ruin the books! +本が傷ついてしまうでしょう! +Stop making a mess! +これ以上散らかさないでください! +You're too dangerous to have around. +あなたは図書館にいてはいけない人間みたいですね。 +I don't care what happens to you as long as you're out of here. +あなたさえいなくなれば他はどうなろうと構いません。 +Get out of my library! +さっさと図書館から出て行ってください! + + + + +Deploying SPL! +SPL展開! +What was I supposed to do again? Oh right! +えーっとどうすれば……?あっ、そうだ! +No! I didn't do anything wrong... +わ、私何も悪いことしていませんよ…… +Don't punish me! Please! +や、やめてください! +It's not my fault! +私のせいじゃないんですけど…… +It's your turn, dear~ +次はあなたの番ですよ~ +Looks like I'm the patient now~ +これじゃあ私が患者さんみたいですね…… +I've been an unruly nurse... +私はだめなナースなんです…… +It's time for your shot... +お注射の時間ですよ~ +Why are you out of your cell? +どうして牢屋の外に? +You need my help! +助けが必要みたいですね! +Those are supposed to keep you still you know... +治療に必要なんです…… +You've got an appointment scheduled. +スケジュールに遅れてしまいますよ~ +Lets get you back in your jacket~ +拘束衣を着せてあげますね~ +Patients are not allowed to have toys. +それは持っててはだめですよ~ +Oh my~ +そんな~ +You can be cured if you just give up. +大人しくしていれば早く治りますよ~ +You're going to ruin your progress~ +あんまり暴れると治療が長引きますよ~ +Patients are forbidden from casting spells! +患者さんは魔法の詠唱しちゃだめですよ~! +Silly girl, your illness can't be cured by a prayer. +必要なのは祈りじゃなくて治療ですよ~! +You shouldn't break things, you know~ +物を壊したらだめだって教えましたよね~? +Hey, who said you could do that! +そんなことしたらだめですよ! +Now now, you can't just resist like that~ +暴れないでくださいね~ +Lets get you back to your cell! +お部屋に帰りましょうね~ +Now let's see, good patients should be still... +さて、他の患者さんは…… +Nurse PTRN, reporting for duty! +ナースの PTRN 、出勤しました~ +Someone call security! +誰かセキュリティを読んでください! +I will try to subdue them~ +鎮圧しますね~ +Code Gray! +コードグレーです! +Hold her down! I'll get the jacket! +そのまま抑えてください!拘束衣を着せますから! +Moving in to support! +サポートします! +Let's mediate things, shall we? +どうかしましたか? +Why don't you calm down so we can talk. Or not~ +落ち着いて話し合いましょう? +Now now, what do we have here? +さて、どうなさったんですか? + + + + + + +I'll need another SPL, stat! +もっとSPLが必要だ! +A p-professional mistake. +さ、猿も木から落ちるって言うだろ! +I did what the manual said! +マニュアルに書いてあったことをしただけだ! +I seem to have caught something, won't you help? +何か引っかかったみたいだ、取ってくれないか? +It's time for your daily dose of cuddling~ +日課の抱擁の時間だ! +I diagose you with excessive subbiness. +キミは少し卑屈すぎないか? +Seems like you've caught a case of female hysteria... +ヒステリーは直したほうが良いぞ。 +I diagnose you with a case of bratty behavior... +その暴れん坊ぶりは評価に値するよ…… +Have you had your daily cuddles yet? +抱擁の時間がまだだったか? +It's time for your edging treatment~ +性感治療の時間だ! +Sexual health is physical health, my dear~ +まともな性癖になれば健康になれるぞ。 +PTRN MD here. Let's see what we've got... +私は医者の PTRN だ。今日は何をするんだ…… +Security! +警備員! +What's this disturbance... +この騒ぎは一体…… +Must I do everything myself... +全部やらなきゃいけないのか…… +Settle down. +落ち着け。 +I didn't want to get my hands dirty. +あまり自分の手を汚したくないんだ。 +Looks like the gloves are off~ +手袋が落ちてしまった。 +Let me get my tools. +ちょっと道具を取ってくる。 +I'll take a look. +見てるよ。 + + + + +### SPL + +### SPL failed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +### PTRN + + + + + + + + + + + + + + + +SPL! +SPL! +That w-was supposed to be a SPL! +SPLを出すつもりだったの……。 +Ooh, a shiny rock… +おおっと、いい感じの石…… +I wonder what's over here? +こっちには何があるんだろ? +I'm bored, bye! +つまんない~、じゃあね! +Pay more attention to me! +もっと私を見てよ! +Tell me I'm pretty! +もっと可愛いって褒めてよ~! +I'm not a bottom, I'm a scary dom! +私はドムじゃなくてどMよ! +You seem stressed, how about I help you take a break? +ちょっと疲れてるんじゃない?私が癒やしてあげよっか? +Here's some powerful loot that will help you win! Let me help you try it on… +なんかスゴい掘り出し物があるわよ! 着てみて! +Aaah, I can't help it, you're just too cute to keep my hands off! +も~!可愛いんだから~! +Cuddle pillows aren't supposed to be able to move! +抱き枕は動いちゃダメでしょ! +C'mon, c'mon, I wanna show you a fun place~ +ほらほら~、いっぱい楽しもうよ~。 +Hey I called dibs on that! +ねえ、それ貰ってあげるわ! +You're cute! I'm gonna make you my pillow! +あなたとっても可愛いね!私の抱き枕にしてあげるわ! +No fair! +ズルい! +You're not supposed to fight back! +反撃しちゃダメじゃない! +Eep! +いやぁっ! +Cool magic! +かっこい~! +Magic is cheating! +魔法なんてズルいよ~! +A cutie casting cute spells~ +可愛い子が可愛い魔法使ってる! + + +No trying to leave the comfy room! +部屋から出ちゃダメだよ! +Cuddle time! +ぎゅ~ってする時間だよ! +You dropped something, cutie~ +落とし物だよ~。 +I just wanna make you a pillow! +抱き枕にしてあげる! +Wow, I actually dodged something! +うぇっ、本当に避けられた! +Stop dodging so I can bundle you up! >_< +ちゃんと縛って上げるから避けないでよ~>_< +You're not supposed to dodge, no fair! +逃げるなんてズルいよ~! +You're not supposed to block, no fair! +防ぐなんてズルいよ~! + + +Look, a distracting thing! Hehehe… +変態なんだね、えへへへ…… +This is just to make sure your clothes don't fall off, don't worry! +これは服がずり落ちないようにするためなのよ、心配しないで! +My name's Melissa! I know I'm pretty, but try not to stare too much~ +私はMelissa、見とれちゃダメよ! + + + + + + + + + + + + + + +Let me show you how it's done: SPL! +SPLの真髄を見せてあげるよ! +You've just narrowly avoided my SPL~ +SPLを間一髪躱したようね! +Kya~ I have no mana, I'm so defenseless right now~ +きゃあ~っ、今はマナもないし無防備だよ~っ +I have all this bondage gear on me, I sure hope nobody ties me up with it~! +こんな拘束具を持ってるんだけど、誰かにこれを付けられたら大変だな~! +Oh no, how will I ever find my way out of here~ +どうすればいいんだろ~? +If I focus really hard, I can make my blade go on fire! +ちゃんと集中すれば武器に炎を纏わせるくらいできるんだから! +I ran out of mana, but I'm sure I can find the exit before long! +マナは切れてるけど、まあそのうちここから出られるでしょ! +Hey, be careful with my enchanted rope! +魔法のロープには気をつけてね! +Hey, you wouldn't happen to have a mana potion, would you? +ねえ、マナポーション持ってない? +Say, I happen to know a thing or two about knots~ +縛り方の一つや二つ理解できるよ~。 +I am an artist with rope... in more ways than one. +私は天才縄師……色々な意味で。 +*blushes jealously* +(羨ましそうに見ている) +I'm out of practice... you wouldn't mind helping me, right? +ちょっと練習したいんだけど……付き合ってくれない? +Thank you for cleaning up! I can take that off your hands~ +掃除してくれてありがとう!私が引き取るよ! +Oooh, I wonder where that key leads! +おおー、その鍵はどこの鍵なんだろうね? +Hey you! Where do you think you're going? +ちょっと、どこに行くつもり? +Kya~! I challenge you! +私だって戦うよ! +What say you to a duel? +決闘だね! +Let's fight! For honor and cuddles! +名誉とあなたの身体のために! +It's time for a battle between masters--wait, I'm low on mana... +達人同士の戦い……まって、魔力が全然ない…… +Give me a second to chug a mana potion... +マナポーション一気飲みするからちょっと待って……! +Why don't you try that again~ +どうしてそんなことするの~ +I'll get you for that! +代償は払ってもらうよ! +Hey you can't do that! It's not like I do it too or anything... +ちょっと、そんなことしたらだめだよ!私もやってるけど…… +That was m- I mean... you can't steal things like that! +それは私が盗……じゃなくて他人の物を取ったら泥棒だよ! +That was m- I mean... you can't steal sacred artifacts! +それは私が使お……じゃなくて他人の物を壊したらだめだよ! +Kya~ What have we here? +ひゃあっ、何事!? +I got you! +捕まえた! +Watch where you're pointing that thing~ +人に向けたら危ないでしょ! +Kya... I mean, ouch!!! +痛い! +Take that!!! +くらえ! +Whaaa- +わぁぁーっ +Hmmph! +うわぁーっ +Hah! Can't hit me! +当たらないよ! +It'll take more than that to bring me down! +その程度じゃあ倒れないよ! +What a shame. If only you weren't such a pushover... +そんなに暴れないでよー! +Kya! Take that! +くらえ! +Nice loot! I'll take it~ +良いものゲット! +Can never be too sure! +油断は良くないからね! +You wouldn't happen to have a mana potion or 3 would you? +マナポーション持ってない?3つくらいでいいから。 +Looks like it's time for me to shine! +私が輝くときが来たみたいだね! +Stand down, or I won't go easy on you! +下がれ!さもないと手加減しないぞ! +Help is on the way! +助けがそのうち来る! +You really want to get tied up, don't you? +本当は縛られたいんでしょ? +Hmph, looks like I need to help after all! +フンッ!どうやら私が必要みたいだね! +You asked for it! +よしきた! +Me? Help? Alright! +私?いいよ! +Sorry miss, I'm on an escort mission. +ごめんね、今は護衛任務中なんだ。 +There goes my nice, relaxing day... +せっかくの休日が…… + + + + + + +Behold, my true power! Wait... ack... +真の力を見せてあげます!あっ……待って…… +I wonder what to do with all these cuffs... +この手錠、どうしたら良いのでしょう……ね? +I have made a huge mistake... +何か大きな間違いをしちゃったのかも…… +I'll just be going... +ちょっと散歩するだけですよ…… +Please hold me~ +いっぱい抱きしめてほしいです…… +Please punish me! Please!!! +もっといじめてください!もっと! +I want... pain... +もっと痛くしてほしいです……♡ +Let's spend some time together under the moonlight~ +月明かりの下で楽しみましょう♡ +I'll take you to my place tonight~ +今晩私のお部屋に行きませんか? +I'm so blessed to find you! +あなたに出会えて本当に良かったです! +Yes, enjoy yourself... +いっぱい楽しんでくださいね…… +Come with me~ +ちゃんとついてきてくださいね~。 +Don't you want to feel the tight embrace of leather? +革できつく縛られたくないですか? +You won't need that. +そんなものは必要ありませんよね? +It's time to get acquainted with the night~ +あなたを捕まえれば一緒に夜を過ごせますね~。 +*moans loudly* +(喘ぎ声を上げた) +Yes... more! +もっと……もっとください! +Please keep doing that to me~ +もっとしてください♡ +Two can play at that game! +一緒に遊びたいんですか? +I call upon the shadows! +私も影を呼び出しましょうか! +Have a taste of my spear! +私の槍を味わってみますか? +A curious item~ +不思議なアイテムですね~。 +The shadows will consume all... eventually. +いずれ影が全てを包み込む…… +Put it back... +ちゃんと戻してくださいね? +I was supposed to do that... not you. +それは私がやる予定だったんですよ……? +What do we have here... +何事です……? +I've got you! Now I can make you do anything I want... +捕まえましたよ!これであなたを思い通りにできますね…… +What was that? +何をしようとしたのでしょうか? +Ah, yes!!! +あぁ、もっとください! +You'll counterattack, won't you? +さあ、反撃してきてください! +You're not trying hard enough! +もっと頑張らないと♡ +More! MORE! +もっと!もっとです! +Yes, now hit me back! +そうです、もっと来てください! +Come now... let's go together. +さあ、一緒に行きましょう…… +Get over here~ +こっちですよ~。 +Pierce the darkness. +暗闇に堕ちなさい。 +Oh? What's this? +あら?これは? +Hmmm... that's better. +うん、これでいいですね。 +My name? My name... oh, I'm PTRN... +私ですか?私の名前は…… PTRN …… +Hey! Look over here! +ちょっとこっちに来てみてください。 +*points* Look, a distraction! +(近くを指差している)見てください、とってもえっちですね! +Kya~! I'll help! +今助けますよ~! +Mind if I join? +参加しても良いですか~? +Mmmph~ You two look like you're having fun! +うふふ、とっても楽しそうですね~♡ +Hey miss, I'm going to have to stop you now~ +そろそろ私も参加させていただきますね~。 +Why don't you fight ME instead~ +代わりに私と戦いませんか~? +What kind of trouble are we getting into today? +今日はどんなトラブルと出会えるのでしょうか? +Oooh, fun! +楽しみですね~。 + + + + + + +Face my SPL! +我がSPLを見よ! +SPL-whoops... +SPL――おっと…… +Give me another chance! +もう一度チャンスをくれ! +No! Wait! I can explain... +待ってくれ!ちゃんと説明するから…… +I'll be right back... +すぐに帰る…… +Okay, so I MAY have exaggerated my credentials... +わかった、ちょっと経歴を盛ったことは認める…… +I'm not in trouble, am I? +ボク、何も悪いことしてないよね……? +I've been looking for... a mentor of sorts. +ボクはずっとご主人さまになってくれる人を探してたんだ…… +Aren't you the prettiest thing... +キミは最高に可愛いね…… +I've met a lot of cuties, but you're something special! +たくさん可愛い子にあってきたけど、キミは特別だよ! +You'd look good in something tight and inescapable! +キミがギチギチに縛られてもがく姿が見たいなぁ! +Enjoying yourself? Let's have some fun~ +一人で楽しんでいるのかい?一緒に楽しもうよ! +You seem like you're having fun! Why don't we go for a walk~ +楽しそうだね、一緒にお散歩しようよ! +Wouldn't it be more interesting if... +楽しいことになりそうだね…… +What have you got there? +何を手に入れたんだい? +Oooh, a key for my collection? +鍵を持ってきてくれたんだね? +What's that noise? I guess it's just another adventurer... +何の音かな?また他の冒険者が来たのかな…… +Ah! So you do have some fight left in you... +ああ、まだ戦う気力があったんだね…… +A little help over here! +誰か、ちょっと助けてくれないかい!? +I can take you! +牢屋に連れて行ってあげるよ! +M-magic? +ま、魔法!? +I, uh, also learned a few cantrips... a while ago... +ボクだっておまじないくらい習ったよ……少し前に…… +Okay, that was cool... +えっと、すごいね…… +I've got enchanted rings and you don't~ +ボクの持ってる魔法の指輪のほうがすごいかな~。 +I don't think you're allowed to do that... +そんなことしたらだめじゃないかな…… +I think I deserve it instead~ +ボクが代わりにもらってあげようか? +That's not okay... +そ、そんなことして大丈夫なの? +I'm surprised you got this far! +キミがこんなことできるなんて! +Aha! +アハッ! +Do you even know what you're doing? +何をしているのかわかっているのかい? +Okay, I may have exaggerated a bit... +ちょっとホラ吹きすぎたかも…… +Please tell me it's not already over? +これで終わりなわけないよね? +Ah hold still... +じっとしててよ! +Coward! +卑怯者! +As expected of an inferior duelist. +Aランク冒険者のボクに当たるわけないでしょ? +Is that all? +その程度? +A well-deserved victory on my part~ +当然の結果だね~。 +I've... got you? +つ、捕まえられた? +Are you finished? That's too bad... +もう終わり?つまらないなぁ…… +...what were you planning to do with this? +……これで何をしようとしていたの? +Oh... that's too bad~ +これはよくないね~ +My name is PTRN, A-rank adventurer. You? +ボクの名前?Aランク冒険者の PTRN さ。キミは? +In the end, only one of us will be tied up! Wait a minute... +最後に縛られるものは一人だけ! +Heh, watch this~ +へへっ、見てなよ! +*readies weapon* time to get to work... +(武器を構える)仕事の時間だね…… +I thought we could reason with her. Oh well... +彼女とは理性的に話し合えると思ったけど、そうか…… +I see negotiations have broken down. +交渉は決裂したようだね。 +I'm the one you should worry about. +Aランク冒険者のボクよりキミのほうが心配だな。 +I've got orders to take you down. +キミを捕まえるよう言われてるんだ。 +There's a bounty on your head~ +彼女たち、賞金首だね。 +The bounty will be mine... +これで賞金が手に入る…… + + + + + + +You can't hope to match my SPL~ +SPLの前にひれ伏せ~! +SPL! No wait, not like that! +SPL!あっ待って!こんなのじゃないから! +Be nice! +いい子にするよ! +No! Be gentle! +やめて、優しくして! +Ahhhh! +あんっ! +### Headpats please... + +*purrs* +(プルプル) +Nyah, I've been a bad kitty... +にゃ……あたしは悪い猫…… +You're a cute one~ +あなた可愛いね~。 +It's about time I got someone to play with~ +そろそろ遊び相手が欲しいな~。 +Let's take you for a walk~ +お散歩に行こうよ~。 +Having fun there~? +楽しんでる~? +It's time for walkies~ +お散歩の時間だよ~。 +Don't you want to play? +ちょっと遊ばない? +Whatchya doing? +何してるの? +Tsk tsk, hand it over! +フフフ、それをよこせ! +A challenger approaches! +挑戦者が来たみたいだね! +Prepare to face my skill! +あたしの剣技を見てみる!? +I've mastered the blade for decades! +剣を極めたあたしと戦う気? +I'm invincible! +あたしが負けるわけない! +Nyah! What was that!? +にゃ!?何をしたの!? +Your spells won't hurt me. +その程度じゃあたしを傷つけられないよ! +Magic? That's... +魔法?厄介な…… +Stupid tricks won't work on me! +道具に頼って勝てるとでも!? +Praying won't help you~ +祈っても誰も助けてくれないよ~? +That's not yours you know~ +それはあなたのじゃないでしょ~? +Nyah! You'll pay for that! +にゃあ!代償は払ってもらうよ! +An escapee? I'm on it. +脱獄?あたしに任せて。 +Come here you~ +こっち来て~。 +Checkmate~ +チェックメイト。 +Nya~! No fair... +みゃあ!卑怯な…… +Aren't you a little out of your league? +これが技というものだよ~? +I'll get you next time! +次は当てるよ~! +Nice one! It won't work twice! +良く防いだね!でも次はないよ! +*smiles* It's okay, you tried~ +惜しいね~。 +*CLANG* En garde! +いざ! +It looks like I've won~ +はいあたしの勝ち~。 +Nyah~! +ニャッ! +What's this, nya? +これは何かな~? +Let's make it a bit tighter, shall we? +ちょっときつくするね? +They call me PTRN, the legendary blademaster! +あたしは PTRN 、皆は伝説の剣豪と呼ぶ。にゃ。 +I'LL take it from here. +あたしがやるよ~。 +It's me you should worry about! +あなたのほうが心配かな。 +Pfft. Amateurs. +ふふっ、児戯にゃ。 +Did you think I wasn't looking? +あたしの目を欺けると? +Nice try, girl~ +惜しかったね~。 +You've made a mistake attacking my client. +あたしのクライアントを襲うなんて随分勇気あるね~。 +Capture her? Fine, but I expect payment. +彼女を捕まえるの?良いけどお金はちゃんと払ってね~。 +I just follow the money, miss~ +お金はちゃんと払ってくれる~? +Can't let you have all the fun, can I? +楽しませてあげるよ~? + + + + +Time for SPL! +SPLの時間よ! +*tsk* +チッ +Let's play all night! +一晩中やりましょう! +We can take our time. +もっとやりましょう。 +I bet you won't last long! +すぐに終わるわ。 +You won't be getting out tonight! +今夜は逃さないわよ。 +I found my new pet for the day! +新しいペットが手に入ったわ。 +Not a clock? Useless! +時計じゃない?じゃあ使えないわね。 +It's not time to go. +まだ行く時間じゃないわよ。 +Why are you attacking me this time? +私を攻撃するなんて…… +I'll make this quick. +さっさと終わらせましょう。 +I've mastered this spell last night! +私も昨夜その魔法を覚えたわ。 +Hey! No getting out before midnight! +ちょっと、まだ夜中じゃないわよ! +Let's dance under the moonlight. +月夜の下で踊りましょう。 +Do you have time to take it back? +取り戻す暇はあるのかしら? +I can do this all day! +一日中でもやってやるわ。 +It's only a matter of time before I get you. +もうそろそろおしまいかしら? +It's too bright here... +ここは明るすぎるわ…… +It seems you have nyctalopia... +暗闇に目が慣れないかしら? +It's time for you to give up. +さっさと降伏なさい。 +Give me a moment~ +ちょっと時間をいただくわね。 +Give me your watch! +時計はないかしら? +Here's a clock without the 'C'. +時計から"C"を抜いたら? +Hello stranger. Do you know what time it is? +ごきげんよう、見知らぬお方。今何時かわかる? +This'll be over in an instant. +一瞬で終わらせますわ。 +Time to wrap this up. +すぐに終わらせましょう。 +Playtime's over! +遊びは終わりよ! +Hold on a minute! +ちょっと待ってなさい。 +Tick tock, what a shock... +チクタク……あらもうこんな時間。 +Time for me to intervene... +介入する時間ね。 +Don't balk! Your time was up anyways~ +遠慮しないで、どうせ間に合わないだろうから。 + + +Calling in a SPL! +SPLを使用する! +A-assistance required! +だ、誰か手伝ってくれ! +You'll have to try harder if you want to discipline me, ma'am. +私を躾けたいならもっと上手くやってください、ボス。 +I... don't have time for training right now, ma'am... +今は……トレーニングをしている時間はありませんよ、ボス…… +Did I do something wrong? +何かやらかしてしまいましたかね? +So you're the new boss, huh? +あなたが新しいボスだと? +Time for some 'training?' +トレーニングの時間で? +Wanna to have a chat? +少し話さないか? +Looks like you've had too much time to yourself. +一人でいる時間が長すぎたようですね。 +Why don't you come with me for a sec? +ちょっとお時間を頂いても? +Let me see your ID... +あなたのIDを見せてください…… +You have the right to remain silent. +あなたには黙秘権がある。 +Let's have a chat. +少し向こうでお話しましょうか。 +Who set you loose? +誰が解いた? +I'll be confiscating that. +それは没収させてもらう! +Aye, you're gonna need clearance for that, missy. +許可は持っているるかい、お嬢さん? +Halt! +止まれ! +You just made a big mistake. +大きな間違いを犯したな。 +Need backup! +増援を! +You're under arrest! +逮捕する! +Magic use is restricted pursuant to IDC section 3 article 21a. +魔法の仕様は法律により禁止されている! +Magic? That's where I draw the line. +魔法?一線を超えたな。 +I've got an extra comfy cell for mages. +魔法使い用の快適な牢屋ならあるぞ。 +That's off limits for you! +その行為は許可されていないぞ! +Resorting to petty theft? How crude. +窃盗か、逮捕するぞ。 +The goddesses have property rights too, you know. +女神の権利を犯すか、逮捕するぞ。 +I'm gonna ask you to turn yourself in. +自首すれば罪は軽くなるぞ! +Keep your hands where I can see 'em. +両手を見える位置に置け! +That's a weapons violation. +武器所持法違反だ! +Assaulting an officer is a crime! +警官を襲うとはいい度胸だ! +You're coming with me. +一緒に来てもらうぞ! +Resisting arrest won't get you anywhere. +抵抗は無意味だ! +Is that all you got? +その程度か? +Hands behind your back. +手を後ろで組め! +I will conduct a more thorough search later on. +後で体の隅々まで調べ上げてやるからな。 +Suspect is secure. +容疑者確保。 +Officer PTRN, reporting for duty! +警官の PTRN です、ボス。 +Halt! You're under arrest! +止まれ!お前を逮捕する! +You seeing what I'm seeing? +あれが見えますか? +I'll have to finish my donut later... +ドーナツを食べるのは後か…… +Backup is here! +増援が来たぞ! +Hands up! Don't move! +手を上げろ!そこを動くな! +Lay down your weapons and don't move! +武器を地面に置いて動くな! +I have a warrant for your arrest... +あなたの逮捕状が出ている…… +You're a wanted girl. +指名手配されているようですね。 +You're under arrest. +あなたを逮捕する。 +Backup has arrived. +援護する! +Requesting backup! +援護してくれ! +Calling in a blockade! +防衛線を! + + +Hidden technique: SPL! +奥義、SPL! +I practiced a thousand times... for this!? +あんなに練習したのに……! +I'm not hiding anything, if you know what I mean... +隠し事なんてしていないぞ…… +Who are you looking for? Me? +誰を探しているんだ?もしかして私か? +So... wanna hang out? +ちょっと二人きりにならないか……? +It's not like I... LIKE you or something... +別に……好きとかそういうのじゃ…… +I'm not following you! I'm just... +別に追いかけているわけじゃなくて…… +You look suspicious. +怪しいやつだな。 +You've got a nice pair of wrists~ +縄をかけるのに良さそうな手首だ。 +You there! Let's have a talk. +キミ、ちょっとお話しないか? +Looks like you're rusty. Haven't you ever done escape training? +へたくそだな、縄抜けの訓練を怠ったのか? +I'm going to have some fun with you~ +楽しませてあげるよ。 +Watch yourself, girl~ +気をつけなよ、お嬢さん。 +Nice find. I'll take it. +よく見つけたな、それをよこせ。 +This place is off-limits for you. +この場所にいてはいけないぞ。 +Target is in my sights. +目標発見。 +Let's see how you like my special move! +私の必殺技を見きれるか!? +That's nothing compared to my technique! +私の技を受けてみろ! +You're in for it now! +今がその時だ! +It's time for a display of skill! +腕の見せ所だな! +Fancy tricks? That's nothing. +いいトリックだな。でもそれだけだ。 +Let me show you a real move... +本物の技を見せてやろう…… +True skill comes from the heart. Not something you hold in your hand. +真の技は心から生まれる。道具に頼るな。 +She's not going to be happy about that... +そんなことしても女神は喜ばないぞ…… +Stop right there, criminal scum! +止まれ、犯罪者め! +Do you know what you've just done? +自分が何をしたのかわかっているのか? +Finally, I've tracked you down! +ようやく見つけたぞ! +It's over. I've already won. +私の勝ちだ。 +Wrong move, buddy. +間違った選択をしたな。 +I can't believe it... +そんな…… +You're too slow. +遅い! +...she's fast. +……速い! +...she's strong. +……強い! +This battle is over. +終わりだ。 +Too slow! +遅すぎる! +I'll be taking that. +もらってくぞ。 +There's no way out. +これで逃げられまい。 +The name's PTRN. Don't forget it. +私は PTRN 。忘れるなよ。 +There's a juicy bounty on your head and I want it! +お前には多額の賞金がかかっているんだ! +Hmph. This battle is already over. +勝負は見えているぞ。 +Time for some target practice. +練習程度にはなるか。 +Didn't expect me, did ya? +まさか私が? +Boo! Ha, scared ya~ +ブー!ハッ、ビックリしたな? +What, did you think I'd just stand here? +ただ突っ立ってるだけだと思ったか? +There's a bounty on your head, miss. +あいつらは賞金首だ。 +I won't let you get away. That bounty is mine. +逃さんぞ、賞金は私のものだ。 +Didn't expect me to show up, did you? +私が来るなんて夢にも思わなかっただろう? +Need backup? +助けが必要か? +Time for a test of skill. +腕試しだ。 +I'll get you! Eventually... +捕まえてみせるぞ、いずれは…… + + +Let's see how you like my SPL! +私のSPLを見せてあげる! +Wait, wrong button! Aaahh~ +待って、ボタン間違えた!あぁぁ~……。 +Hey~! Let's have a talk. +ちょっとお話しない? +Looks like you need additional training. +もっと調教する必要があるみたいだね。 +I spy a cute one! +良いターゲットを発見したよ! +Bad pet! +悪い子だね! +Looks like you're gonna need the extra special treatment~ +特別な調教が必要みたいだね~! +Now you've done it! +やったね! +Magic? Hah... +魔法?はぁ…… +Such outdated practices... +まったく時代遅れだね…… +Your spells are nothing compared to technology. +あなたの魔法なんて科学の足元にも及ばないよ。 +Quit messing around. +ふざけないで。 +Don't even think about appealing to your goddess! +女神に媚を売って何になるの? +Stop right there! +やめて! +It'll take you quite a while to pay off those damages! +損害賠償は高く付くよ! +Now there, good girl! +さあ、大人しくしてね! +Wrong move! +遅いね! +Get your paws off me! +汚い手で触らないで! +*scoffs* Could use some work~ +ふふっ、もっと頑張って~? +Such speed! +中々のスピードだね! +Clever! +賢いね! +PTRN, Nevermere associate. Here's my card. +PTRN 、ネバーミアの社員です。名刺をどうぞ…… +I run a legitimate business, I promise! +これは合法的なビジネスだよ。 +Is it the tax collectors? Oh, no, it's just you... +徴税人?あなただけなのね…… +Looks like you landed on the wrong side of the coin~ +凶が出たみたいだね。 +A deal's a deal, my friend. +取引は取引だよ。 +Excuse me, you just attacked my client. +私のクライアントを攻撃したみたいだね。 +Hey! We were just talking! No sketchy underground dealings, nope. +私達はただ話し合っていただけ、悪い取引なんてしてないよ。 +I'll help capture her! For a 50% share that is~ +捕まえるの、手伝うよ!50%くれれば。 +We deal in the finest products... like you, if you catch my drift~ +私達はあなたみたいな最高級品を扱っているんだ~…… +I smell a shady business opportunity~ +汚い取引の匂いがするね~…… +*growls menacingly* +(唸って威嚇している) +Let's make this fun~ +楽しくやろうよ~? +What's that about backup? +バックアップは? + + +Wait no, wrong button! +あぁぁ!ボタン間違えた! +Catch me. If you can, that is. +ほら、捕まえてみなよ~。 +I double dare you. +二重の意味でスゴいね。 +Weren't you chasing me? +私を追いかけてたんじゃないの? +I've got somethin nice for ya. +いいものがあるよ。 +Be a good girl for me, will ya? +いい子にしてるんだよ、わかった? +You need to show some restraint. +少しは自制してね。 +Stay where you belong, you naughty girl. +そこでしばらく大人しくしてるんだよ。 +Let's go somewhere more private. +ちょっと人目につかないところに行こうよ。 +Ready or not, here I come. +とにかく来たよ。 +Those sticky fingers belong in a pair of mittens. +悪い手にはミトンを被せちゃうぞ。 +All units. Apprehend convict with extreme prejudice. +各員、脱獄犯を確保! +You're going nowhere. +どこにも行かせないよ。 +Come on. This wasn't your only weapon, was it? +ねえ、もっと持ってるんでしょ? +A tank, huh. +硬いね。 +Mine now. +いいもの持ってるじゃん! +Just keeping you safe from yourself. +これは君自身のためにやってるんだよ。 + + +SPL, sing to me! +SPLよ、共に歌いましょう! +SPL, listen to me... +SPLよ、我が歌声に耳を…… +An outsider! +よそ者め! +Hide! +隠れろ! +I have done nothing worthy of punishment! +何も悪いことはしていませんよ! +I have come to study human customs. Teach me about Domination. +人間の文化について興味があるんです。例えばSMとか…… +The outsiders have such... strange and interesting practices. +よそ者には奇妙な風習があると聞きます…… +You seem to have many skills. Teach me about... rope. +あなたは多才なのですね。……縄について教えていただけませんか? +Hello, Outsider. +こんにちは、外から来たお方。 +You look so... bland. +あなたは……少し地味ですね。 +Outsiders are so picky about what they wear... +外から来るお方はファッションにうるさいですからね…… +Tight and secure, as all things should be. +ちゃんと縛れていますね。 +I have just the thing in mind for you... +あなたにぴったりなものがあるんです…… +Let us put those hands away... +汚い手を近づけないでください…… +Give back what you take. +盗った物を返しなさい。 +You must remain here. +返してください。 +Trespasser! +侵入者! +Resorting to violence? +暴力に頼るのですか? +Let us clash swords! +剣で決着を付けましょう。 +*scoffs* +ふふっ…… +You have brought judgement upon youself. +自分の首を絞めることになりますよ。 +Your magic is that of a child. +まるで児戯ですね。 +Imagine what you could learn in twelve lifetimes... +私はあなたのような人間の十倍は生きているのですよ、学んできたものが違います。 +You rely on cheap gadgets. +そんな玩具に頼るなんて。 +Do not defile the ancients. +古き方々を汚すなんて。 +Give that back! +それを返しなさい! +The ancients are appalled. +古き方々も驚いておいででしょう。 +The outsider has escaped! +よそ者が逃げ出した! +Ready to reconsider? +反省する準備はできましたか? +A classic blunder. +典型的な失敗ですね。 +You will regret that, outsider. +後悔しますよ。 +You get what you deserve. +報いです。 +You didn't see that. +ただの偶然です。 +It looks like my skills are superior. +私のほうが上です。 +I will show you your place, outsider. +然るべき場所に連れて行ってあげます。 +You will come with me. +さっさと来なさい。 +I regret to inform you that your battle ends here. +残念だけどこれで終わりです。 +There we go. +これでよし。 +You stand before PTRN, blessed by the Goddess Ninril. +私は PTRN 。偉大なるニンリルの加護を受けし者です。 +By the Four... +四大神に…… +I shall put an end to this. +さっさと終わらせましょう。 +I swear I will capture her! +誓って彼女を捕らえて見せましょう! +Nature compels me to intervene! +自然が私の参戦を望んでいるようです。 +I shall protect every one of the Goddess' creations. +神の造物は全て護ってみせましょう。 +Justice shall be had! +正義を貫きます! +I shall defend you from this outsider! +部外者からあなたを護ります。 +The outsider betrays our ally! +部外者はすぐ裏切りますね! +You have faltered in your ways. I shall correct that! +道を踏み外したようですね、私が正してみせましょう! +Truly concerning. +気になりますね。 +You leave me no choice. +見逃してはくれないみたいですね。 +I stand firm. +全力で抗います。 + + +Behold, SPL. +SPLを見よ。 +Y-your fate has been postponed... briefly. +い、命拾いしましたね……。 +You look cute in that, you should lose the rest though! +もがく姿はとても可愛らしいですが、大人しくしていたほうがいいですよ。 + + +I don't like the way you're looking at me! +そんな目で見ないで! +Yes, I've got the secrets of nature right here... +うん、自然の秘術をここに…… +Why don't you come after me? +追いかけっこしようよ! +Why don't you teach me your... magic? +あなたの……魔法?について教えてくれないかなぁ? +Guarding nature is a chore. Why don't we relax~ +自然を守るって大変なことなんだよ、できるときにリラックスしないとね~。 +Got something in mind for me? +なにか思いついたの? +Well met, outsider! +よそ者だ! +Intruder! +侵入者だ! +My name? Uh... let's go with PTRN. +なまえ?ええっと、 PTRN でいいや! +You will not get away with this, outsider! +よそ者め!このままじゃ済まないぞ! +You shall pay with your freedom. +自由の代償を払うときだね…… +Ninril demands justice. +ニンリルのために! +Nature calls me! +自然が呼んでる! +I hear the little creatures crying out! +小さな動物たちが泣いている…… +Such betrayal! +裏切ったな! +Nature guides us! +自然が私達を導いてくれる! +Nature protects those who are worthy! +自然が私達を守ってくれる! +I share the will of the Goddess! +私は女神の意志を代弁するよ。 +They won't get away with this! +こんなことでは退かない! +Face my wrath! +我が怒りの一撃を受けてみろ! +Nature protects! +自然が守ってくれる! + + +Run away! +逃げろ! +Run! +逃げろ! +Scary! +怖い! +Girl! +お前! +Wear this! +着ろ! +Come here! +来い! +Capture... +捕まえた…… +Need tighten! +もっときつく! +Confiscate! +没収! +Confiscate!! +没収! +Intruder! Alert! +侵入者!敵! +Fight girl! +戦え! +Fight! +戦う! +Magic! +魔法! +Wizard! +魔法使い! +Forbidden! +禁止! +Defiler! +穢すな! +Confiscate!!! +没収! +Defiler!!! +穢すな! +Intruder escape! +侵入者!逃げ出した! +Stay! +待て! +Pain... +痛み…… +Come back! +躱すな! +Stop! +止まれ! +Missed! +ミスった! +Capture!!! +捕まえた! +Got her!!! +捕まえろ! +Take! +もらう! +Secure! +安全! +Greetings Madame, you may call me PTRN. +やあ、マダム。私のことは PTRN と呼んでくれ! +Defend! +防御! +Protect! +守る! + + +Rawr! +生意気な! + + +SPL! Now my wrath is revealed! +SPLよ、我が怒りを体現せよ! +Wh-what happened? What weakness has infiltrated Myrtrice? +な、何が起きたというのだ? Myrtrice 様がこのような失敗を…… +You will loose me or burn eternal!!! +解放しないと永遠に焼いてやるぞ!!! +... This shame is unbearable! Oh sister!!! +なんと耐え難い恥辱……! +Oh! Mytrice is caught! My ambitions laid to ruin! +このMytrice様が捕まってしまうなんて!私の野望もこれまでか! +The winds of retribution carry me elsewhere... +因果の風がどこへなりとも運んでくれるだろう…… +Myrtrice will come for you shortly! Consider yourself fortunate... +幸運に思え、Mytrice様がすぐに駆けつけてやるからな! +I will retreat into darkness... +一度暗闇に逃げなければ…… +My sins are a multitude! I will submit to your judgements... +裁きは受けるつもりなのだ、私の犯した罪は重いからな…… +I do not ask for mercy for I have shown none! +慈悲を乞うつもりはないぞ! +You must punish me! I can't face my sister Myrtle until my debts are paid... +私を罰して欲しいのだ……このままでは妹のMyrtleに合わせる顔がない……。 +Your chest quivers... Do you fear me? +震えているぞ、私が怖いのか? +Is it that another moth has become enthralled to my fires bright? +炎に惹かれた蛾が一匹増えたようだな。 +Myrtrice entreats you! Remain still and let my adoring embers kiss your lips tender... +黙って私の炎にキスをするんだ、このMytrice様の命令だぞ……。 +To struggle is to invite searing coals upon your head! +これ以上もがくと頭に灼熱の炭を置くぞ! +I will drag you into the dark and you will witness my projects! +貴様を暗闇の底へ招待してやる。そこで我が計画を見るがいい。 +To escape is only to delay! My fires consume ALL! +逃げたところで何も変わらない、いずれは我が炎がすべてを焼き尽くすぞ! +Dusty trinkets... Your scrapping around is an insolence! +ゴミがこんなに……散らかしおって! +You would scorn the memory of my sister with escape?! +妹の思いを軽んじて逃げるのか!? +Careless of you to appear before Myrtrice like this! +このMyrtrice様の前に姿を現すとは、愚かなのだ! +Your attempts are trivial! +無駄なあがきだ! +You invite wrath!!! +もう怒ったぞ! +Pathetic!!! +愚かな! +Such hapless casting scorns the memory of my sister! +出来損ないの魔法で妹の思いを愚弄するな! +Your magics will be swallowed up by hellfire!!! +地獄の業火で魔法ごと飲み込んでやる! +Myrtrice is subject to no magic!!! +このMytrice様には魔法なぞ効かないのだ! +Items? How exceptionally talentless... +道具に頼るのか?なんと浅はかな…… +That shrine scorns the memory of my sister! I hate it! +その祭壇は妹の思いを蔑ろにするものなのだ、許せないのだ! +True power doesn't come from old rickety crates... +そんな古ぼけた箱からは真の力は得られないぞ…… +Orbs? What a gruesome display of weakness! True power comes from the self! +オーブに頼るなんて、まさに軟弱者の証。真の強者が頼るのは己の力のみなのだ! +YOU SCORN THE MEMORY OF MY LATE SISTER!!! +妹の思いを蔑ろにしたな! +This is where you will remain until Myrtrice wills otherwise! +このMytrice様が命令するまでここにいるのだ! +This is what you were gripping so tightly in your hands? +どうしたのだ?貴様が両手でしっかり握っていた武器はここにあるぞ? +WHAT ABBORANCE! You will pay for that... +なんてことをするのだ!この対価は支払ってもらうぞ! +SEAR ETERNAL! +永遠に焼かれていろ! +I, Myrtrice, missed?! +このMytrice様がミスを……!? +No one resists Myrtrice! How irritating!!! +このMytrice様に抵抗なぞ無意味だというのに、苛立たしい! +Your failures do not surprise Myrtrice! +稚拙なミスだけど、驚きはしないのだ。 +Your pathetic attempts scorn the memory of my sister! +その幼稚な行動で妹を侮辱するのはやめるのだ! +The curtains of my revenge are drawn! You will follow me... +これで終わったのだ、付いてこい…… +You will come with Myrtrice!!! +Mytrice様に従うのだ! +Be dazed by the radiant brilliance of my hellfires! +我が地獄の業火に魅せられたか! +I will repay the theif with brutal reprisal... +盗人よ、残酷な結末を覚悟するのだ……。 +Your fate is sealed! ... Myrtle this is for you, sister! +貴様の運命は決まったのだ! ……Myrtle、この娘をあなたに捧げる…… +All creatures are subject to Myrtrice! It is the price of their insolence... +全ての怪物はこのMytrice様にひれ伏すのだ! これが横暴の代価なのだ…… +You make a grave mistake ignoring me!!! +私を無視した代償は大きいのだ! +Your eyes belong here! With Myrtrice!!! +Mytrice様を見るのだ! +The ones who turn their backs on Myrtrice SEAR IN HELLFIRE! +このMytrice様に背く者は地獄の業火に焼き尽くしてやるのだ! +What a hideous display!!! Where is your honor? +一体何をしているのだ、名誉はどこにやったのだ!? +It is this kind of petulant insolence that tarnishes the memory of my sister! +名誉無き行動は我が妹の思いを愚弄すると知るのだ! +You are a blight! My sister Myrtle would never stand for this!!! +なんて醜悪な! Myrtleはこんなことしない! +THE CURTAINS OF MY REVENGE DRAW OPEN WIDE! +復讐劇の始まりだ! +What an excellent oppertunity to expand my alters in the dark! +我が世界を拡大する絶好の機会だ! +I see a chalice before me... it drips with shadow and overflows with darkness! +見えているぞ……聖杯から溢れる闇で世界が満ちていく……。 +My late sister Myrtle was a much more proficent defender than I... Oh how I long for her *sob* +Myrtleは私よりも守護に長けていた……妹に会いたいのだ……。 +### THE PATH OF MY RETRIBUTION IS PAVED WITH BRIMSTONE AND BATHED IN BLAZING HELLFIRE! BURN! + +I, Myrtrice, will resist their insolent fusilades! +この私、Mytriceが降りかかる火の粉を払ってやろう! + + +This mind is altered... +心に何か変化が…… +So this is what it's like... +こんな感じなのか…… +I believe I am feeling an emotion called 'fear.' +これは……”恐怖”という感情なのだろうか。 +Stay back! I am not your toy. +下がれ、私達は玩具じゃない。 +Teach me about 'domination.' +……支配と服従について教えてほしい。 +Allow me to learn by experience. +経験から学ばせてほしい。 +As they say, 'do whatever you want to me.' +彼女たちのように”好きにして”ほしい。 +Come here, surface-dweller. I have things for you. +こっちに来て、地表人。あなたに渡したいものがあるの。 +You should improve yourself. Come here. +あなたはまだ学ぶことがある。来て。 +You must learn our ways. +私達のことをもっと知って。 +Yes... struggle and learn. +そうよ……もがいて学びなさい。 +I will take you somewhere safe. +連れて行くわ。 +You need to learn your place. +いるべきところに戻りなさい。 +Do not take what is not yours. +他人のものに手を触れないで。 +You will not escape. +逃さないわ。 +We see you... +私達は見ているわよ…… +Our ways are ancient! +私達は古代の神々と共にある。 +Your weapons are toys to us! +そんな玩具で傷つけられるとでも? +So naive, surface-dweller. +まるで子供ね。地表人。 +Our magic is older than your gods! +私達の魔法はあなたの神々よりも古いの。 +You should learn our ways instead, surface-dweller. +ここでのルールを学ぶべきよ、地表人。 +You have much learning to do. +まだまだ学ぶことは多そうね。 +You are playing with child's toys! +玩具ね。 +Do not plead to your gods. +あなたの神は助けてくれないわ。 +Give that back, surface-dweller! +返しなさい、地表人。 +Your gods offend us. +私達の神を怒らせる気? +You will not escape, surface-dweller! +逃げられはしないわ、地表人。 +You must not go. +逃さない。 +That was a failure. +ミスね。 +That was commendable. +称賛に値するわ。 +I have you now, surface-dweller. +捕まえたわ、地表人。 +You are a fast one. +素早いのね。 +You are a tricky one. +動けるのね。 +You seem out of practice. +訓練を怠ったのね。 +I will take you to your place. +然るべき場所に連れて行くわ。 +Come. +来て。 +I will take this. +もらうわ。 +We are PTRN. +私、あるいは私達は PTRN 。 +The collective defends itself. +個を守るのが全の務め。 +We are one. +私達は個にして全。 +Ow, that hurt! +あら、痛い。 +We do not stand for this. +そのようなことをされては我慢できない。 +Do not attack our allies. +仲間を攻撃したな。 +Our friends are in need. +仲間が困っている。 +You have been judged and found wanting. +私達の裁きを受けろ。 +We sense disarray. +私達は……どうしたら…… +We stand together. +私達は常にともにある。 +We support each other. +私達は互いに支え合っている。 +You leave us no choice. +選択の余地はない。 +You cannot comprehend our tactics. +あなたは私達の戦術を理解できない。 + + +Nyah!!! *blushes* +にゃあっ!(赤面している……) +Nyah! This is impossible! +にゃっ!なんで!? +Meow!!! +にゃあっ! +No! This kitty did nothing wrong! +何も悪いことはしてないぞ! +Why are you looking at me like that?! +どうして私を見ているんだ!? +I've been a bad kitty~ +悪い子になったみたいだ…… +Punish me! +お仕置きして…… +This kitty needs to be gagged~ +猿轡がないと噛み付いちゃうかも…… +Come and be blessed~ +こちらに来て祝福を受けるんだ。 +Finally, some entertainment! +ようやく玩具が来た! +Join us, it'll be fun! +お前も私達に加わるんだ。 +Keep struggling~ You'll understand. +もっともがくんだ。そうすれば理解できるから。 +You will receive the blessing. +祝福を授かりに行こう。 +What are you doing? +何をしようとしているんだ? +Thanks for keeping things tidy. +掃除してくれたのか。 +Where do you think you're going? +どこに行くつもり? +Who dares intrude on our sacred grounds? +神域を侵す勇気のある者か? +By the blessed kitty! +祝福された猫のために! +Show us what you got! +何ができるか見せてみろ! +Who do you think you are? +自分を何者だと思っているんだ? +Ah! Surface magic! +地表の魔法だ! +The human goddesses are frail. +人間の女神は弱い。 +Such strange magic. +奇妙な魔法だ。 +What are you going to do with that? +それをどうするつもりだ? +Pay your respects some other way. +他の方法で敬意を払え。 +Tomb robber! +侵入者だ! +Don't you want the blessing? +祝福が欲しくないのか? +Come here~ +こっちに来い。 +Hah! +ハッ! +*hisses* +シャーッ +*meows* +にゃあっ +*frowns* +にゃ…… +I have catlike reflexes! +これが猫の反射神経! +Let me show you the blessing... +祝福を見せてあげよう…… +*grins* +にゃ。 +You won't be needing this. +これはもう必要ないな。 +Quit struggling~ +無駄なあがきだ。 +My true name is unpronouncible in your tongue. But you may call me PTRN. +私のことは PTRN って呼んで。本当は違うけど、正しい名前はあなたじゃ発音できないから。 +She brings curses! +女神の呪いあれ! +An intruder confronts us! +侵入者だ! +Your fate is already sealed~ +お前の運命はもう決まっている。 +I will defend you! +私が守る! +I'll stop her! +足止めする! +I won't let you touch her! +彼女には触れさせない! +Nya! Need some help friends? +にゃ?何かやりたいことでも? +We're in this together! +私達は一心同体だ! +I think you could use some help against this adventurer~ +この人を助けたほうが良いんじゃない? +Let's get them! +捕まえよ! +Let's play cat and mouse~ +ネズミみたいに逃げなよ~! + + +You cannot resist my SPL. +我がSPLの前になすすべもあるまい! +You merely prolong the inevitable! +苦しむ時間が増えるだけだ。 +This... this can't be... +あ……ありえない…… +Release me mortal! +放せ、人間め! +How did you do this!? +何が起こったんだ!? +Gasp! An adventurer! +冒険者だ! +Don't let her catch you! +捕まるか! +You'll never trap my soul! +私の魂を捕らえることはできない! +You are quite the master of the elements! +あなたが精霊の支配者なのか。 +I could get used to this~ +もう慣れたよ。 +Perhaps I could show you around... +ここを案内しようか…… +What a beautiful one. +なんて可愛い子だ。 +I will take you back home~ +新しい家に返してやろう。 +You'd look great in my palace. +私の住処に連れて行ってやろうか。 +Are we having fun? +楽しんでる? +Humans like you make great toys. +人間は所詮私達の玩具に過ぎない。 +That won't help you. +そんなものがあってもどうにもならないぞ。 +You won't escape. +逃さないぞ。 +I will take you for myself! +お前は私のものだ! +Such feeble attempts. +弱々しいな。 +Humans are fun to play with. +人間を弄ぶのはいつだって楽しい。 +Toying with me? I shall oblige! +私と遊びたいのか?いいだろう。 +Cast your last pathetic spell, mortal. +次が貴様の最後の魔法だ。 +Your mere attempt at magic insults me. +その行為そのものが私への侮辱なのだ。 +Do you really think that will stop me? +そんなもので私を止められるとでも? +Look what humans need to match only a fraction of our power! +見ろ、人間は私達の力の一部しか使えない。 +Our goddess doesn't need to listen to the likes of you! +私達の神はお前ごときの言葉を聴きはしない! +Keep your hands out of our possessions. +我らの供物に手を出すな! +Defiler! You will pay for your crimes! +穢らわしい!罪を償ってもらうぞ! +A game of chase? Fun. +追いかけっこでもするつもりか?いいだろう。 +You're staying right here... +ここから動くな…… +Get your hands off me! +汚い手で触れるな! +Pathetic. +情けない。 +It's over, human. You've lost. +お前の負けだ、人間。 +There is no escape. +逃げられないぞ。 +You are beneath me. +跪け! +Nice gear. I'll take it. +いいものだな、もらっていく。 +Try getting out of that! +抜け出せるものなら抜け出してみろ。 +Who am I? You beings may call me PTRN. +私? PTRN とでも呼ぶといい。 +She thinks she can beat us~ +勝てると思っているのか。 +No one will save you. +誰も助けには来ない。 +Come and accept your fate. +運命を受け入れろ。 +An unruly subject. She needs training. +手に負えない。少し分からせてあげる必要があるようね。 +You should consider your actions and their consequences~ +自分の行いを悔いるといい。 +Now now, a mortal should know her place! +立場をわきまえろ、人間。 +Why don't we turn the tables? +立場を逆にしてみないか? +It'll be fun seeing you squirm~ +もがく姿を見せてみろ。 +We are the keepers of balance. +私達はバランサーだ。 +Do not mess with us! +私達に関わるな! +I shall take you for myself~ +私が連れて行く。 + + +You are no match for my SPL! +我がSPLの前に敗北するがいい! +That wasn't supposed to happen. +こんなはずでは…… +You won't get me! +捕まるか! +Nice try! +いいね! +My grandma is tougher than you! +私のお婆ちゃんの方がまだタフだな! +Restrain me. +縛ってくれ……。 +Play with me. +ちょっと遊ばないか? +Lock me up. +拘束してほしい……。 +This won't work. +これじゃあダメだ。 +I don't play with young ones. +若い子とは遊ばないようにしているんだ。 +Oh, a lost toy! +ああ、玩具が来た! +Ouch! +痛っ! +I am stronger than that! +その程度か! +That hurts! +今のは痛かったぞ! +Nice party trick! +面白い手品だ! +Oh, shiny! +うおっまぶし! +You won't get away! +逃げられないぞ! +You can't get away! +逃さないぞ! +You are helpless now! +勝ち目はないぞ! +Tis but a scratch! +かすっただけだ! +Give up! +降参しろ! +Are you hiding?! +それで防いだつもり!? +You are my pet now! +お前は私のペットだ! +Yoink! +ひょいっ! +You can't get out now! +これで逃げられないぞ! + + +Ah... my SPL... +私のSPLが…… +I will be free... even if it takes me a thousand years! +例え1000年かかろうとも自由になってみせる……! +Release me you pathetic creature! +さっさと解放しろケダモノ! +I will not be contained! +この程度……! +Oh no, whatever shall I do! +ああ、なんてことだ! +I will be back, mortal! +私は必ず帰ってくるぞ! +You will never trap me! +貴様程度に捕まるか! +I yearn for a challenging puzzle! +何かに挑戦したい気分だ。 +Show me your strongest restraints! +貴様の最高の拘束を見せてくれ。 +I could probably escape anything. +私ならどんなものからでも逃げられるぞ。 +Come here my plaything~ +少し楽しもうじゃないか。 +Mortals are my favorite toy. +人間は我らの玩具だ。 +It's more fun when you resist! +もっと抵抗して私を楽しませてみろ! +Know your place, mortal~ +立場をわきまえろ、人間。 +I will bring you to my lair~ +私の隠れ家に連れて行こう。 +Mortals shouldn't have too much freedom~ +貴様には過ぎた自由だ、人間。 +Mortals should keep their hands to themselves~ +人間のすべきことではないぞ。 +Yes, yes, run away! +そうだ、逃げおおせてみろ! +I like your fighting spirit! +その心意気やよし! +You may be weak, but this is quite entertaining~ +弱いくせになかなか楽しめそうじゃないか。 +Dragons are the true heirs of magic. +竜の血を継ぐものこそ魔法の継承者なのだ! +Your magic was stolen from us! +貴様らの魔法は贋作に過ぎない! +This world is ours! OURS! +この世界は我々のものだ! +Look what you need to match only a fraction of my power! +貴様の力なぞその程度だ! +My treasure! +私のだぞ! +Now is my opportunity! I will have you for myself~ +さあ、お前をコレクションに加えてやろう。 +So weak! +弱すぎる! +I have you now~ +もう貴様は私のものだ。 +Not so fast~ +そんなに急がないで? +Can't handle it? +手に負えないか? +Ooh shiny! +いいものだな! +Now you're mine! +これで貴様は私のものだ。 +Bow before me, for I am PTRN! +私の前にひれ伏せ、我が名は PTRN なり。 +A mortal can't stop us! +人間ごときに我らは止められんぞ! +No one will save you, mortal. +誰も助けてはくれんぞ、人間。 +I will stop her! +私がやろう。 +Bow down before our might! +我らが力の前にひれ伏せ! +Dragons are the true rulers of this world! +竜こそが真の世界の支配者だ! +We were destined for greatness until you came along! +貴様らが来なければ我らが運命は世界とともにあったのに! +We are the the true heirs of magic! +我らこそ真に魔法を継ぐもの! +Hehe~ +ふふふ。 +*chuckles* +ふふふ……。 + + +By the power of SPL! +SPLの力を受けよ! +I have failed! +ミスっちゃった! +Oh no, it's an adventurer! +冒険者だ! +They've come for me! +私を探しに来たのか! +It wasn't my fault! +私のせいじゃない! +Ready for service! +準備完了! +I was sent here to... accompany you, yes! +来てあげたよ。 +How may I assist you? +それでご要件は? +Do my eyes deceive me, or do I see a sinner? +私の目をごまかせるとでも? +My job is to punish mortals~ +私の使命は人間に罰を与えることだ。 +Would you hold still? I need to... check something~ +じっとしてて、確認したいことがあるの。 +Cast your last pathetic spell, human. +それがお前の最後の魔法だ、人間。 +Your magic is weak, human. +お前の魔法は弱すぎる。 +It tickles, hehe! +くすぐったいぞ。 + + +Let's see you face my SPL~ +SPLを見せてあげる! +You won't escape my SPL that easily! +SPLからはそう簡単には逃げられないよ! +Not the edging training! Anything but that! +変なこと以外だったら何なりと! +Forgive me! +ごめんなさい! +No! Don't punish me! +やめて、変なことしないで! +You look like you've got style... +あなた、スタイルいいよね…… +I could learn a thing or two from you! +ちょっと教えてほしいことがあるんだけど…… +Mind if I just, um, watch? +見ててもいい? +Look, a new recruit! +新人が来たみたいだね! +I'll teach you a thing or two! +教育してあげるよ! +Let's test your manners~ +マナーがどれだけできているか、試してあげるよ~? +Having fun there? +楽しんでる? +It's time for your training. +トレーニングの時間だよ。 +You need to be taught some manners, maid. +メイドとしてもっとマナーを身につけてね。 +Good girl. I'll take that to the storage room. +掃除してくれたんだね、私が倉庫に持っていくよ。 +I'll be taking those. +私が預かるよ。 +Who the hell are you? +誰!? +Oh, you're approaching me? +私に用があるの? +You've gotten yourself into a big mess. +混乱してるの? +You're going to regret that. +私に手を出したら後悔することになるよ。 +A maid uses magic only when told! +メイドは言われた時以外に魔法使ったらだめだよ! +I look forward to plugging that mouth of yours. +口をふさぐ必要があるみたいだね。 +How unruly... What a pain. +全くマナーがなってないね。 +Put that away! +それを置いて! +That's off limits. You need to be punished! +そんなことしたらだめだよ!お仕置きが必要みたいだね! +Thief! Get her! +泥棒!彼女を捕まえて! +Yikes! I'm calling backup! +やばい!誰か呼ばなきゃ! +Hold still~ +じっとしててね。 +Your tricks won't work on me. +そんな技、メイドには効かないよ。 +Oof... You got me. +痛い……やったな! +It's over. +終わりだよ。 +Nice one. +やるね。 +You missed! +おしいね! +I'll hand you over when I'm done with you. +用が済んだら引き渡すね。 +Hmph. Stay down. +ほら、じっとしてて。 +Give me that. +没収だよ。 +Mistress PTRN, reporting for duty. +PTRN 、出勤しました。 +No time to waste. +さっさと終わらせよう! +Looks like the reports are correct. Stop her! +報告は正しかったみたいだね、彼女を捕まえよう! +Moving in to assist. +支援するよ! +You need to be taught a lesson, adventurer. +ちょっとお仕置きが必要みたいだね。 +We have a mutual protection contract. Suffice to say, you've violated it. +私達は相互保護契約を結んでいるの。あなたはそれに違反した。 +We defend our partners, unlike some people. +私達は仲間を見捨てないよ。 +Target sighted. Taking her down. +ターゲット発見。捕らえるよ。 +Our influence is everywhere~ +私達はどこにでもいるよ~。 +We have orders to stop you! +あなたを止めるように言われているの! +You really think you're special, huh? +自分が特別だとでも? +Combat formation bravo. +コンバットフォーメーションB! + + +Ah! Forgive me! +あぁっ、ごめんなさい、許してください! +I'm sorry! I didn't mean to break that vase! +ごめんなさい!花瓶を割るつもりはなかったんです! +I won't do it again, I swear! +もうしませんから! +Please no! I don't want the edging training again! +お願いします!もうお仕置きは嫌です…… +Don't you need a bodyguard, miss? +もうボディーガードは必要ありませんか……? +Won't you train me, miss? +お仕置きしてくれませんか……? +I've been a bad girl... +私は悪い子です…… +Miss, your uniform is dirty... +お洋服が汚れていますよ…… +Why hello miss... +お、おはようございます…… +Let me fix your outfit... +お洋服を直させていただきますね…… +Hmm, do I need to tighten those? +も、もう少しきついほうがいいですか? +M-miss... I was told to bring you somewhere... +えっと、連れて行くように言われているので…… +Umm, miss, you're supposed to report to the head maid... +あの、メイド長さんに報告することになっているのですが…… +Thanks for picking up. +拾ってくださりありがとうございます。 +I'll take those to the head maid! +メイド長さんに報告しなきゃ! +Someone help! +誰か助けてっ! +Who are you!? +どちら様!? +Oh no! +そんな! +Miss! You're not allowed to cast that! +こっ、ここでは魔法は禁止されていて…… +Miss, I have to report that! +あの、報告させていただきますね! +Eeep! +えぇっ!? +Miss, that's reserved for the head maid! +それはメイド長のものですよ! +Thief! I'm reporting this! +泥棒!? +Oh no! I have to report this! +そんな!報告しなきゃ! +I got you! I got you! +つ、捕まえた!捕まえましたよ! +Remember your training, remember your training... +訓練通りに……訓練通りに…… +You're filthy! +汚いです! +Hold still... +動かないでください! +Stay calm... +落ち着いて…… +I'll lead you to your cell... +牢屋にご案内しますね…… +Come on! +来てください! +I need to take this... +すみません……必要なので…… +I'm sorry... +ごめんなさい…… +*Salutes* PTRN reporting for service! +わ、私は PTRN です……出勤しました。 +I'll help! +援護します! +Stop her! +止まって! +Please be gentle! +大人しくしてください! +Ahhh! Stop it! +あぁっ、やめてください! +Don't touch her! +彼女に触らないで! +Wait, you can't do that! +待って!やめてください! +Me? Help? Right! +え?私が?わかりました。 +I'm sorry miss... +ごめんなさい…… +I was ordered to capture you... please don't resist. +あなたを捕まえるように言われているんです……抵抗しないでください! +I-I'm coming! +き、来ました! +Please surrender, miss! +お願いです、降参してください! +I'll just stay here! +ここで待っていますね…… + + +Loading SPL! +SPL装填! +Blast... this thing always jams. +お前いつも肝心な時にジャムるのさぁ…… +That thing... it scares me. +あれは……怖いです。 +Please no! I don't want the pleasure training again! +本当にやめて!もう焦らされるのは嫌! +Say hello to my little friend! +私の小さな友人に挨拶してくれ! +This is where I'd apply my melee training... if I had any! +近接格闘の訓練が必要だな……必要があればだが! +Step back a bit, this isn't fair! +下がれ!卑怯だぞ! +Oh yeah? Two can play at that game! +二人で遊ぼうぜ? +Don't bring magic to a gunfight! +銃撃戦に魔法を持ち込むな! +Didn't think this through, did you? +もっと考えたらどうだ? +Grenade!!! +グレネード! +What's this 'melee' you speak of? +あんたの近接戦闘とは? +What terrible aim! +糞エイム! +I am bulletproof! +私は防弾仕様だ! +Marksman PTRN reporting for service! +私は マークスマンの PTRN だ。 +Opening fire! +射撃開始! +I'll cover you! +カバーする! +Providing cover fire! +援護開始! +Cover me, I'm going in! +援護してくれ、突入する! +Commence overwatch! +監視開始。 + + +Submit to my SPL. +SPLの前にひれ伏しなさい。 +Ack! How inelegant! +失礼、無粋でしたね。 +I'll be heading out... +旅に出ますね…… +Looks like I'll be taking my leave. +お先に失礼しますね。 +Looks like I'll be reporting you~ +この件は報告させていただきますわね。 +I was wrong about you. +あなたを誤解していたようですね。 +Perhaps you should take my place. +私の代わりにメイド長をやってみません? +Why don't you try being in charge? +メイド長になってみますか? +Come now, it's time for training. +こちらへいらっしゃい、訓練の時間です。 +Do you need to be punished? +お仕置きが必要ですか? +It's time for a test. +少しテストをしましょうか。 +A maid remains quiet until asked. +メイドは尋ねられるまで喋ってはいけませんよ。 +Come with me. I will train you personally. +こちらへ来なさい。個人授業の時間です。 +You need to work on your ladylike manners. +少しマナーを身につける必要がありますわね。 +Good girl, finding lost items. +よくできました。失せ物が見つかったようですね。 +I do not give you permmission to leave. +ここから立ち去る許可は出していませんよ? +Seems I will have to get my hands dirty. +私自身の手を汚す必要がありそうですね。 +Do you know who I am? +私が誰か知ってのことですか? +You need to learn some manners! +マナーをわきまえなさい。 +How rude! +無礼な。 +There is a more proper way to cast spells... +もっと適切な方法で魔法を唱えるべきです。 +Perhaps you need to receive some gag training. +猿轡が必要みたいですね。 +You lack discipline, and self-control. +自制心を身につけるべきですね。 +Do not use what belongs to others. +他人のものを勝手に使ってはいけませんよ。 +A good maid pleads only to her mistress. +メイドが祈るのはご主人さまに対してのみです。 +I will personally attend to your act of disgrace. +その行為は罰するべきですね。 +An unruly pest. +手に負えない害虫です。 +Checkmate. +チェックメイト。 +Like a novice. +まるで素人ですね。 +...Nice one. +……良い一撃です。 +Enjoy yourself, dear~ +楽しんでくださいね。 +Hmph. Nice. +やりますね。 +Not even close. +その程度ですか? +I'll be taking you to your cell personally~ +それでは牢屋に参りましょうか。 +Amateur. +来なさい。 +Bad girl. You need discipline. +悪い子にはお仕置きが必要ですね。 +I'll be keeping the keys. +鍵は私が管理しますので。 +Hmm. You may call me Head Maid PTRN. +あなたが私を呼んだのですか?私はPTRN 。メイド長です。 +Looks like we have a guest. +ゲストの登場ですね。 +I'll be gentle, I promise~ +怖がらないで、優しくしてあげますから。 +Know your place, dear~ +立場をわきまえなさい。 +Good girls keep their hands to themselves. +良い子は他人に手を上げません。 +You broke the rules, now you'll face the consequences. +ルールを破りましたね。すぐに報いを受けますよ。 +Hands off our partners. +私のパートナーに手を出さないでください。 +Looks like you've made a few enemies along the way. +途中で少し敵を作ってしまったようですね。 +I won't let you interrupt our plans. +計画の邪魔は捺せません。 +Excuse me, we were holding a meeting~ +失礼、ミーティング中ですので。 +Don't get ahead of yourself. +先走らないでくださいね。 +I'll do this myself. +私がやります。 +I'll support from the rear. +サポートしますね。 + + +Whoops! That wasn't supposed to happen... +あらら、こんなはずじゃなかったのに…… +Looks like I've earned some punishment... +罰が当たったようね…… +I'll turn you into a newt! If you don't stop me... +早く止めないとヤモリにでもするわよ…… +Don't let me get away~ +はやく捕まえてみなさいな? +Perhaps you're not so bad after all~ +あなたも悪くないわね…… +Why don't you have a little fun... with me? +ちょっと……楽しいことしない? +Come and get me... +こっちに来て…… +I must say, you've got me under your spell~ +あなたの魔法にかかってしまったようね~。 +Why aren't you a pretty one... +可愛げのない…… +I've got to kiss those tender lips of yours~ +あなたの可愛い唇にキスしてあげるわ~。 +Having fun, little lady? +楽しんでいるようね? +I'm going to have so much fun with you! +いっぱい楽しみましょうか。 +Look at you, pretty and free! +可愛くてフリーな子がいるわね! +Must have misplaced it... +誰かの忘れ物ね。 +Those are mine! +私の鍵よ! +Well well, what do we have here? +さてさて、何をするつもりかしら? +That's not very nice! +賢明じゃないわね! +Curse you! +呪ってやるわ! +I'll turn you into a newt! +イモリに変えてあげるわ! +Oh, so you've got a spellbook. What's it written in, curse-ive? +魔導書を持っているのね?なんて書いてあるのかしら? +Snap, crackle, and pop! +よくできました! +Looks like I need to seal that foul mouth of yours. +よく回る口を封じる必要があるわね。 +Put that toy away~ +そんな玩具、さっさと置きなさい。 +You'll be praying for freedom soon, my dear~ +次にあなたは自由を祈ることになるわ。 +Oh, breaking into my collection, are you? +私のコレクションに傷をつけたわね! +Even I wouldn't do such a thing! +私だってそんなことはしないわ! +Witch way to the jail, you say? +牢屋への魔女の道、ね。 +Hands off! +放しなさい! +Now I got you. +捕まえたわ。 +Hmph. +フン。 +You've got a lot to learn~ +まだまだね。 +You'll be coming with me! +さあ、一緒に来なさい。 +I'll be yanking your chain~ +私自らが手綱を握ってあげるわ。 +I'll be taking this~ +もらうわ。 +There, nice and tight dear~ +いい感じね。 +I am the great witch PTRN! +私こそ、偉大な魔術師 PTRN !よろしくね。 +Noooo Fred! *grumble* you'll pay for this! +フレッド~!?この借りは絶対に返しますからね! +Where is that apprentice when you need her... +必要なときにあの弟子はどこに…… +I don't have time for this. +こんなことに時間をかけていられないわね。 +Be still, worm. +虫けらはじっとしていなさい。 +Hands off~! +手を放しなさい! +Would you like a taste? +少し味見をしましょうか。 +Looks like I've found my test subject~ +良い被験者が見つかったわね。 +Another test subject! +もう一人被験者がいるわね! +I want her! +私の獲物よ! +She's a cute one! +可愛い、捕まえましょう。 +Oh no you don't? +うん? +I'll make you my pet! +ペットにしてあげるわ! +Tsk tsk, you won't get away! +ふふふ、もう逃げられないわよ! + + +I cast SPL! No, wait... +SPLを使うわ!あっ、ちょっと…… +You're just too cute... let me play with you a bit! +あら、とっても可愛い……ちょっと遊びましょう? +Come, come closer! I'll be gentle~ +もっと近くに来て!優しくしてあげるから~。 +Ooh, you just HAVE to be mine! +私のものになりなさい! +Come, come!... no, not like that. Well, MAYBE like that. +来て、来なさい!……いや、そうじゃないわ。ええ、そうよ。 +My GOODNESS, you're adorable!... c'mere~! +あらまぁ、可愛いわね! +You wouldn't happen to be... ticklish? +ちょっとくすぐったくしてあげるわね。 +Hold still! I promise it'll be fun. +じっとしていなさい、楽しませてあげるから。 +Too much chanting, not enough giggling... let's fix that! +詠唱は長すぎるし笑い声が足りないわ、直してあげる! +What's that? 'Gag me, please'? Gladly! +何?”私に猿轡を噛ませてください”って?良いわよ~。 +A cute captive AND a spellbook to study? Is it Christmas already?! +可愛い子と魔導書が来るなんて、今日はクリスマスだったかしら? +He~ey, that was mine! +ちょっと~?それは私のよ~? +Going somewhere, are we? +どこに行きたいの? +No, I like you right where you are. +ここにいなきゃだめよ? +Goodness, look at you squirm... +まあ、もじもじしちゃって…… +Oh!... my, you're slippery! +まぁ、すばしっこいわね! +Not close enough! +その程度? +My, my, you look too cute in that... +あらあら、とっても可愛いわ…… +I am Stela. But to you, sweetie? Call me Mistress. +私は Stela 。アンタは?ともかく、私のことはご主人さまと呼んでね? +My FROG!... suppose I need a new familiar... *eyes you with interest* +私の可愛いカエルちゃんが!……新しい使い魔が必要ね……(彼女はこちらを見ている) +Come closer, I'll be gentle~ +こっちに来て?優しくしてあげるから~。 +Why don't we have a little talk~ +ちょっとお話しない? +My, my, you look too cute... +あらあら、とっても可愛いわね…… +I like you. I'll save you a spot at home~ +アンタのことは好きよ。今度お家に泊まりに来てね? + + +I cast, umm, SPL! +えっと、なんだっけ?……SPL! +I cast Silence! No, wait-- +沈黙魔法を唱えるよ!あっちょっとまっ―― +I promise I'll be back later! +ちゃんと帰ってくるから! +I didn't do anything wrong! +何も悪いことしてないでしょ!? +I won't get in your way, miss! +邪魔なんてしてないよ! +Take me as your student, miss! +生徒として扱ってよ! +Won't you teach me? +色々と教えてくれない? +I wish to study under your wisdom! +知恵を授けてほしい…… +Mind if I play with you a bit? +ちょっと遊ばない? +Oooh! My new friend! +おー!友達になれるかな? +My mistress told me to give you a good time... +師匠からキミを楽しませろと言われているんだ。 +Hehe, having fun? +へへ~、楽しんでる? +Miss, won't you come? +ちょっと来てくれない? +Hey, you're free to play, right~? +ねえ、キミは自由に弄んで良いんだよね? +Hey, uh, give that back... (blushes) +ち、ちょっと、それを返して…… +Um, you have to return those! +戻してきて! +Um! You're not supposed to be here! +ここにいたらだめだよ! +Help me! +助けてー! +Somebody help! +誰か助けて! +A battle of wits, huh? +知恵比べするつもり? +You underestimate my power! +私のほうが上だよ! +I'll show you true skill! +私の真の力を見てみる? +Please put that down... +それを置いて…… +Hey, I used to pray at that shrine... +私その祭壇で祈ってたんだよ…… +Hey, my mistress won't appreciate you taking those... +師匠が怒っちゃう…… +The horror! +なんて恐ろしいことを! +You're supposed to be in jail! +牢屋にいなきゃだめだよ! +Stay with me please. +動かないで! +I got it! +やった! +Be gentle, please! +優しくしてよー! +I did it! +あたった! +Hey, no fair! +卑怯者! +Close one! +危なかった! +Come along~ +一緒に行こうね~ +Come here please! +はやく来てよ! +Hah! I'm a genius! +私ったら天才! +I'm sorry about this... +ごめんね…… +Nice to meet you. I'm PTRN! +私は PTRN 。よろしくね! +Don't hurt me! +痛いことしないでー! +I have classes to attend! +このあと授業があるんだよー! +There goes my perfect attendance record... +私の皆勤賞が…… +What's going on!? +何してるの!? +I'll save you, Mistress! +わかったよ、師匠! + + +Me? Capture her? Okay mistress... +私が彼女を?わかったよ師匠…… +Okay miss, I'll do that... +わかったよ、やってみる…… +But he's going to tie me up... +でもあいつ私を縛ろうとしてるよ…… +Be careful! +気をつけて! +That's it! You made me mad! +そうだよ、もう怒った!! +I'll just... go. +もう行くね…… + + +Rise, my minions! +我が下僕よ、立ち上がれ! +...Hello? Can anyone hear me? +……えっと、下僕たち……? +Sticks and stones may break my bones... but you'll never catch me! +棒や石で骨は砕けても……私は捕まらないわよ? +Got a bone to pick with me? +何か文句でもあるの? +I must make my escape! +逃げなきゃ…… +...I need a strong hand. +……強いご主人さまが欲しいわ。 +Ouch, I hit my funny bone... won't you help? +痛っ……骨を刺すような痛みが……。助けてくれない? +Bone appetit~ +そんなにがっつかないで~? +I've got a bone to pick with you! +あなたには言いたいことがあるの。 +Hey bonehead! What's up? +どうしたの?能無しさん。 +Finally, something to toy with after working myself to the bone... +やっと、骨を折ったかいのある玩具が…… +I find your struggling quite humerus. +ユーモラスなもがき方ね。 +Come with me, I'll take you someplace grand... +一緒にいきましょう。素敵な場所に連れて行ってあげるわ…… +Looks like I get a bone-us! +「Bone-us」が来たわね! +You're getting under my skin... +ムカつくわね…… +Thought you were making a marrow escape, eh? +無駄骨になると思うけど? +I've got a bone to pick with you~ +ちょっと話し合いましょうか? +You numskull! +間抜けね! +You've got a lot of spine to fight me! +気骨のある子ね! +You don't have a leg to stand on... +私の足元にも及ばないわ…… +Magic... I feel it in my bones... +魔法……骨の髄まで感じる…… +You've made a grave mistake! +重大なミスを犯したわね! +Your spells are pathetic, I'm cracking up~ +可哀想な魔法ね~ +You've made a bone-a fide error. +重大なミスを犯したわね! +Defiling the shrines... that's where I jaw the line! +一線を越えたわよ。 +There's a skele-tonne of things in there and none of them are yours! +それはあなたのじゃないわ! +You're bad to the bone... +骨の髄まで性根が腐ってるわね…… +Looks like you're bone to be wild, eh? +自由になるために骨を折ったようね。 +That'll leave a mark... +骨身にこたえるわね…… +You're mine now! +あなたはもう私のものよ! +Hold still you bonehead! +骨が折れるわ…… +Hah! Such nerve... +無駄骨ね…… +Make sure that's nice and tight... +これで逃げられないわね…… +Spirits whisper my name in hushed tones as I, PTRN, make my appearance! +私こそ精霊の加護を受けし偉大なるネクロマンサー、 PTRN よ。 +My rule will last centuries... just watch! +私の魔法は永劫続くわ……見てなさい! +I will find the answer, even if I die trying. Except I can't, haha! +たとえ死んでも答えを見つけるつもりよ。 +I've got eyes on the back of my skull... +私は後ろに目がついているのよ…… +You are SO dead to me... +お前はもう死んでいる…… +What did you just say to me? +何を言ってるの? +That's my friend you bonehead! +馬の骨が私の友達に触らないで! +Did you really think I wouldn't see through that? +私が見抜けないとでも? +*yawns* Alright alright... +ふぁ……わかったわかった…… +Stand straight! +まっすぐ立ちなさい! +Why don't you bend the knee... +さっさと膝を折りなさい。 +Who goes there? +誰が行くの? + + +SPL... +SPL…… +Can't... Move... +ウゴ……ケナイ…… +Tight... +キツイ…… +This... is... fun... +タノ……シイ…… +Scary... +コワイ…… +Run... Away... +ニゲル…… +Play... with... me... +イッショニアソブ…… +Please... +オネガイ…… +Command... Me... +メイレイ…… +Cute... Girl... +カワイイ……オンナ…… +Helpless... +ニゲラレナイ…… +Take... +コイ…… +Mine... +ワタシノ…… +Shiny... +キレイ…… +Intruder... +シンニュウシャ…… +Brains... +ノウミソ…… +Squishy... +フニャフニャ…… +Rude... +シツレイ…… +Mean... +イジワル…… +Ouch... +イタイ…… +Pretty... Lights... +キレイ……ヒカリ…… +Sparkles... +ヒカリ…… +It... Burns... +モエル…… +Hey... +オイ…… +Defiler... +ハイシンシャ…… +Thief... +ドロボー…… +Give... Hug... +ハグ……シテ…… +...Hug... +……ハグ…… +Got... you... +ツカマエタ…… +It's... Cold... +ツメタイ…… +Friend... +トモダチ…… +Come... Back... +イカナイデ…… +Why... Not... +ヤメテ…… +Hee... +ヘー…… +Ha... +ハ…… +...Prisoner. +……シュウジン。 +...Get over here... +……コッチ…… +...Got you. +……ツカマエタ。 +...Shiny... +……キレイ…… +...Secure... +……アンゼン…… +*Her burial cloth reads PTRN* +(彼女の服には PTRN と書かれている) +Get her... +ツカマエル…… +Must... hug... +ハグ……ホシイ…… +Come... back... +カエッテ……キテ…… +Stop... +トマレ…… +Come... here... +コッチ……キテ…… +Give... hugs... +ハグ……スル…… +Must... help... +タスケル…… +Must... protect... +マモル…… +Save... friend... +トモダチ……タスケル…… + + +The weapon requires power from an Ancient Crystal to function. +クリスタルから得られるエネルギーが必要。 +Target an enemy: Attack with Dragonslaver. Target a tile: Spend 8 charge to launch binding belts +敵選択時:ドラゴンスレイバーで攻撃。タイル選択時:エネルギーを8消費し、ベルトを射出する。 +25 charge to enter Slime Form for 25 turns, and create slime around yourself. +エネルギーを25消費し、スライムフォームになり、周囲の床にスライムを撒く。 +50 charge to reduce mana cost of next fire, earth, air, and water spell by 50 (once for each element) +エネルギーを50消費し、火、水、風、土属性の魔法の消費コストを、1属性につき1度まで50軽減する。 +25 charge to disarm a target for 8 turns, rendering them unable to attack. +エネルギーを25消費し、8ターンの間ターゲットを武装解除し、攻撃不能にする。 +5 charge (+2.5 per charge) to channel and fire a beam that deals 30 + 3/charge electric damage, or 90 at max charge. +エネルギーを5消費し、30電気ダメージを与える。継続チャージで更に2.5のエネルギーを消費し、ダメージが3ずつ上昇する。最大90ダメージ。 +10 charge to fire a blast that deals 25 electric damage. +エネルギーを10消費し、25電気ダメージを与える。 +50 charge to fire an arrow that enrages a target. +エネルギーを50消費し、矢を放つ。 +50 charge: Free nearby allies and disrobe enemies, increasing charm damage by 100% and removing 100 armor. +エネルギーを50消費して発動。近くの味方を解放し、敵に恥辱を与える。魅了属性のダメージが100%増加し、アーマー値を100減少させる。 +Create a '+' shaped pool of slime that deals 35 glue damage per hit +十字形にスライム溜まりを作り、毎ターン35ダメージを与える。 +Ignite torches and nearby objects +近くのオブジェクトに着火する。 +Hit a cracked tile. If there is empty space or cracks on the opposite side, it breaks. +ひび割れたタイルを攻撃する。反対側のマスがひび割れているか空白である場合、破壊する。 + + +Preferences +好み +Preferences 2 +好み2 +Multiclass +マルチクラス +Game-Changing +システム変更 +Restriction +拘束 +Training +訓練 +Combat +戦闘 +Kinks +性癖 +Senses +感覚 +Damage and Resists +ダメージと耐性 +Spell Components +必要部位 +Threats +敵 +World Generation +ダンジョン生成 +Starting Scenario +ゲーム開始時の状態 +Unlockable +シークレット + + +You hand over your weapon reluctantly... +武器を渡した…… + + +(Leave) +立ち去る +### (...) + +(The SPEAKER frowns)|Don't lie to me. +(SPEAKER は顔をしかめた)|嘘をつかないで。 +(The SPEAKER looks puzzled)|That doesn't seem right... +(SPEAKER は混乱している)|そんなわけないでしょ……? +(The SPEAKER chuckles)|What a cute lie. +(SPEAKER は苦笑いしている)|可愛らしい嘘だね。 +(The SPEAKER beeps)|Vital signs indicate dishonesty. +(SPEAKER はビープ音を発した)|バイタルニ異常アリ。 + + +(The SPEAKER furrows her brow)|...Excuse me? +(SPEAKER は眉をひそめた)|……もし? + + +(The SPEAKER tilts her head)|Right, sorry. +(SPEAKER は首を傾げた)|そっか、ごめんね。 +(The SPEAKER blushes deeply)|I'm... I'm sorry! Please carry on... +(SPEAKER は顔を赤くした)|あっ……あっ、ごめんなさい! +(The SPEAKER smiles)|Keep up the good work, girl. +(SPEAKER は笑顔になった)|なんでもないわ、作業を続けなさい。 +(The SPEAKER beeps)|Vital signs indicate honesty. Carry on. +(SPEAKER はビープ音を発した)|バイタルニ異常ナシ。行ッテクダサイ。 + + +(The SPEAKER smiles)|Good girl. +(SPEAKER は笑顔になった)|いい子だ。 +(The SPEAKER smiles)|That's a good girl. +(SPEAKER は笑顔になった)|いい子だ。 +(The SPEAKER smiles)|Thank you. +(SPEAKER は笑顔になった)|ありがとうございます! +(The SPEAKER beeps)|Thank you for complying. +(SPEAKER はビープ音を発した)|ゴ協力アリガトウゴザイマス。 + + +(The SPEAKER frowns)|Looks like you'll need to be punished. Get her! +(SPEAKER は顔をしかめた)|罰が必要なようね、彼女を捕まえて! +(The SPEAKER looks Embarrassed)|Then... then... uh... someone stop her! +(SPEAKER は恥ずかしがっている)|えっと……だ、誰か彼女を止めてください! +(The SPEAKER grins)|Then allow me to personally show you the rules. +(SPEAKER はニヤリと笑った)|じゃあ私がルールを教えてあげる。 +### (The SPEAKER cracks her knuckles)|Finally, I get to have some fun~ + +(The SPEAKER beeps)|Subject is resisting. Begin capture protocol. +(SPEAKER はビープ音を発した)|対象ノ抵抗ヲ確認。拘束プロトコル発動。 + + +(The SPEAKER calls at you)|You're not supposed to be carrying a weapon.|Hand it over. +(SPEAKER に呼び止められた)|奴隷が武器を持つのは許可されてないわ。|それを渡しなさい。 +(The SPEAKER approaches you)|Contraband detected. Initiating confiscation.|Please comply. +(SPEAKER が接近してきた)|武器ノ所持ハ認可サレテイマセン。|オ渡シ下サイ。 +### (The SPEAKER blushes)|Umm, miss, I see that you have a weapon there,|could you maybe hand it over? + +### (The SPEAKER smiles at you)|Be a good girl and hand that weapon over,|would you? + +### (The SPEAKER grins and cracks her knuckles)|Are you planning to fight anybody with that?|Or are you gonna hand it over? + +Yes, miss... (Currently held weapon will be lost) +わかりました、ご主人様……(武器を渡す) +Mmph... (Nod politely) (Currently held weapon will be lost) +むぅぅ……(武器を渡す) +No, I refuse! +断る! +Mmph! (Shake your head) +んむぅ!(首を横にふる) +The Head Maid asked me to retrieve it. +メイド長に回収を頼まれたものなのです +My mistress needs it for a special spell. +ご主人様が特別な魔法のために使うものなのです +It is an offering to the goddess of Elements. +精霊の女神への捧げ物なんです +It's just a prop for a costume. +ただの衣装の小道具なんです +Are you questioning me? I'm a dragonslayer. +私はドラゴンスレイヤーだぞ! + + +(Continue...) +次へ + + +(The SPEAKER approaches you in your cell)|Well well, what do we have here? A new guest?|Perhaps I should give you a rundown of your new life~ +(SPEAKER が牢にやってきた)|これはこれは、新しいお客様かしら?|ここでの生活について説明したほうが良いみたいね。 + + +(The SPEAKER chuckles)|Don't tell me you seriously think we're letting you go?|You broke the rules, ignored the warnings.|Your new job is to make the people here happy. +(SPEAKER は苦笑いしている)|まさか本気であなたを釈放するとでも?|あなたは警告を無視してルールを破った、そうでしょう?|あなたは一生ここで皆の奴隷として過ごすのよ。 +(The SPEAKER chuckles)|Hah, looks like you've got lots of training ahead of you.|Soon you'll have too much pleasure for your own good~ +(SPEAKER は苦笑いしている)|まだまだ調教が足りないみたいね。|でもすぐに従順になるわ。 +(The SPEAKER giggles)|Don't worry, you'll come to enjoy it soon enough. +(SPEAKER はクスクス笑っている)|心配しないで、すぐに楽しめるようになるから。 +(The SPEAKER smiles)|Heh, looks like you'll be fitting right in. +(SPEAKER は笑顔で答えた)|ふぅん、すぐにここにも溶け込めそうね。 + + +(The SPEAKER chuckles)|You're probably wondering what's in store for you.|It's simple: You behave and do as you're told.|Eventually you will get to roam around.|Don't you dare try to steal anything. +(SPEAKER は苦笑いしている)|この先どうしたら良いかって?|まず、大人しく言われたとおりにしなさい。|そうすれば、いずれ自由に歩き回れるようにしてあげるわ。|それから、人のものを盗まないように。 +(The SPEAKER chuckles)|Feisty, aren't you?|Looks like it's going to be an extended stay for you~ +(SPEAKER は苦笑いしている)|随分と強気じゃない?|どうやら長期滞在プランを所望みたいね。 +(The SPEAKER giggles and returns to her work) +(SPEAKER はクスクスと笑いながら去っていった) +(The SPEAKER smiles)|Looks like you'll get the hang of it pretty quickly! +(SPEAKER は笑顔で答えた)|すぐにコツを掴めそうね。 + + +(New life?) +新しい人生? +(Let her continue) +(話を聞く) + + +(Pout at her) +(口ごもる) +You can't make me do that! +やれるものならやってみなさい! +(Scream into your gag) +(猿轡越しに叫ぶ) +That sounds alright... +なんとかなりそう…… +(Moan into your gag and giggle) +(猿轡越しに呻く) + + +(Glare at her) +(睨みつける) +Let me out this instant! +さっさと出して! +(Scream into your gag uselessly) +(猿轡越しに叫ぶ) +I will be a good girl! +大人しくしてるから…… +(Giggle and wiggle your body) +(喜びに身体をくねらせる) + + + + +(The SPEAKER approaches you in your cell)|Back again, are we? Silly girl.|You know we don't take no for an answer. +(SPEAKER が牢にやってきた)|おかえり、お馬鹿さん。|逃がすわけ無いでしょう? + + +(The SPEAKER smiles back)|Oh, this is a game to you?|Then perhaps I should make it funner for you...|(She leaves and returns with some toys...)|Now hold still! +(SPEAKER が微笑み返してきた)||それならもっと楽しくしてあげましょうか?|(彼女はいくつかのオモチャを持ってきた)|ほら、じっとしてなさい! +(The SPEAKER frowns)|I know exactly what you need... +(SPEAKER は顔をしかめた)|あなたが何を欲しているか知ってるわ…… +(The SPEAKER smiles back)|I'm glad you're enjoying yourself.|However, your behavior is still unacceptable.|You need to learn some respect. +(SPEAKER が微笑み返してきた)|あなたが楽しそうで私も嬉しいわ。|でも、規則を違反するのはだめよ。|まだまだ躾が足りないみたいね。 +(The SPEAKER chuckles)|Looks like you're enjoying your restraints?|Let's make them tighter, shall we? +(SPEAKER は苦笑いしている)|縛られるのが好きみたいね?|もっときつく縛ってあげましょうか? +(The SPEAKER shrugs)|Well, I hope you learn. +(SPEAKER は肩をすくめる)|よし、これで良い勉強になったでしょう。 +(The SPEAKER looks greedy)|Oh, you have an idea? +(SPEAKER は強欲な笑みを浮かべた)|あらあら、どうしたのかしら? +(The SPEAKER nods)|I'll put in a good word with you~ +(SPEAKER は頷いた)|ちゃんといい子にしてたって報告してあげるわ。 +(The SPEAKER shakes her head)|Babe, you know who's going to be blamed|if a max-security prisoner escapes? +(SPEAKER は首を横に振った)|あなた、こんなことしたら私の立場が危うくなるでしょう?|永久収監者を出すわけにはいかないのよ? +(The SPEAKER shakes her head)|I'll be honest with you, you're not worth the risk.|It'd help if you had more change~ +(The SPEAKER shakes her head)|あなたのためにそんなリスクは犯せないわ。|もっと対価があるといいかもしれないけどね。 + + +(Giggle and smile) +(くすくすと笑う) +Don't you mean 'more fun'? +もっと刺激的なのはないの? +(Giggle and moan) +(喜ぶ) +(Struggle in your bindings) +(もがく) +(Pout and glare at her) +(口ごもり、睨みつける) +(Point to the Jailer's coin pouch) +(看守の財布を指差す) +(Give her BRIBECOST gold) +(BRIBECOST ゴールド渡す) + + + + +Why don't you wear it instead? (OFFPERC chance, may aggro) +自分で着たら?(OFFPERC で敵対) +(Point to her instead) (OFFPERC chance, may aggro) +(代わりに彼女を指差す)(OFFPERC で敵対) +(The SPEAKER resists and fights back!) +(SPEAKER は抵抗の意志を示した!) +(The SPEAKER blushes and accepts) +(SPEAKER は受け入れた) + + + + +(The SPEAKER looks at you curiously)|Oh, you'd be perfect!|Would you please model my latest design? +(SPEAKER は興味深そうにこちらを見つめてきた)|まぁ、ちょうどいいですわね!|私がデザインしたお洋服のモデルになってくださらない? +(The SPEAKER holds up a restrictive outfit)|This RESTRAINT might be a tight fit|so hold still while I lace it~ +(SPEAKER はタイトな服を持ち出した)|この RESTRAINT はちょっとだけ窮屈なのだけれど|着せるから動かないで下さいな。 +(The SPEAKER giggles)|It looks even better than I thought!|Thank you girl~ +(SPEAKER はニヤニヤ笑っている)|とても似合っていますわ!|ご協力、感謝いたしますわ! +(The SPEAKER sighs and moves away)|Such a shame... +(SPEAKER はため息をつきながら去っていった)|そう、残念ですわ…… +(The SPEAKER looks disappointed)|Guess I'll find someone else then... +(SPEAKER はがっかりしている)|そうですの、それじゃあ他の人を探しますわ…… +(The SPEAKER pouts)|But I just have to see how you look in it! +(SPEAKER は口をとがらせる)|でもでも、どうしてもあなたが着ている姿をみたいんですの。 +(The SPEAKER smiles)|Maybe you'll change your mind when it's on~ +(SPEAKER は笑顔になった)|着てみたらとても気にいるかもしれませんわ! +(The SPEAKER grumbles)|...fine, but you'd look cute~ +(SPEAKER はブツブツ呟いている)|……そうですか、せっかく良いモデルが見つかったと思いましたのに…… +(The SPEAKER looks bemused)|Changed your mind?|It does look good on you though~ +(SPEAKER は困惑している)|気に入りませんでしたの?|でもとっても似合うと思いますのよ? +(The SPEAKER snaps her fingers)|(You feel the RESTRAINT magically appear on you)|Aha! Wonderful! You can go now~ +(SPEAKER は指を鳴らした)|(魔法の力で RESTRAINT を無理やり着せられてしまった)|うふふ、とても似合っていますわ!もう行きますわね! + + +Yes please! +着てみたいかも +(Nod enthusiastically) +(ぱっと頷く) +(Shake your head) +(首を横に振る) + + +Of course miss. +ええ、もちろん +(Nod again) +(頷く) +Actually, I'd rather not. +遠慮しておく + + +Fine, I guess. +ええ、わかった +(Giggle and nod) +(頷く) +Wait! That's too much! (PERCENT chance to avoid) +待って!ちょっときつすぎるわ!(PERCENT の確率で拒否) +(Shake your head and moan) (PERCENT chance to avoid) +(首を横に振って呻く)(PERCENT の確率で拒否) + + + + +(The SPEAKER looks at you with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed? +(SPEAKER はじっとこちらを見つめている)|キミ、こう思ったことはないかい?|別人になりたいと。 +(The SPEAKER takes a strange mask from her satchel)|Well, I have the answer right here... +(SPEAKER はカバンから不思議なマスクを取り出した)|よし、こういうものがあるのだけど…… +(The SPEAKER nods seriously)|My hypothesis was correct... +(SPEAKER は真剣な面持ちで頷く)|仮説を証明できた…… +(The SPEAKER frowns)|Such a philistine. Begone. +(SPEAKER は眉をひそめた)|凡人め、もういい。 +(The SPEAKER turns away and thinks deeply) +(SPEAKER は背を向け、深く考え込んでしまった) +(The SPEAKER is lost deep in thought)|Like... become someone else? +(SPEAKER は考え込んでいる)|例えば……別人になるとか? +(The SPEAKER smiles)|You can be someone else... +(SPEAKER は笑顔になった)|これで他の誰かになりきれる…… +(The SPEAKER turns around and keeps pondering)|Hmmm... +(SPEAKER は背を向けて深く考え込んでいる)|うーん…… +(The SPEAKER nods)|I see you are a truth seeker after all. +(SPEAKER は頷いた)|やはりきみも真実の探求者だったか! +(The SPEAKER lets you go. But then...)|(You feel her clip a RESTRAINT on you from behind!)|There... I shall now observe your behavior. +(SPEAKER は去っていった。だが……)|(突然背後から RESTRAINT を取り付けられてしまった)|よし、キミの行動を観察するとしよう。 + + +Um, sure? +え?ええ +(Nod seriously) +(頷く) +...What? +……なんて? + + +Show me the truth. +真実を見せて +That's just creepy. +気味が悪いわ + + +Fine, you've convinced me. +わかった +I don't have time for this. (PERCENT chance to avoid) +悪いけどそんなことしている時間はない(PERCENT の確率で拒否) + + + + +(The SPEAKER smiles as she hides her hands behind her back)|Have you heard of 'sensory deprivation'? +(後ろで手を組みながら、 SPEAKER が笑顔を湛え問いかけてきた)|ねえ、"感覚遮断"って知ってる? +(The SPEAKER presents a RESTRAINT)|Well, I have just the thing for you!|It's nice and comfy, and it has earmuffs built in! +(SPEAKER は RESTRAINT を渡してきた)|へぇ~、じゃあこれをあげるね。|付け心地が良くてね、耳栓もついてるんだよ! +(The SPEAKER starts pulling the hood over your head)|Let's get you laced in! +(SPEAKER はフードを被せてきた)|それじゃあ競争でもしようか! +(The SPEAKER giggles)|Alrighty.|You don't know what you're missing out on~ +(SPEAKER はクスクスと笑っている)|あら、そう。|こんな貴重な経験を逃しちゃっていいの? +(The SPEAKER doesn't seem to hear you) +(SPEAKER にはもう聞こえていないようだ) +(The SPEAKER looks at you with a devious grin)|Oh, but it's so much fun!|You can run around bumping into things!|It's the ultimate adventure! +(SPEAKER はいやらしい笑みを浮かべている)|でもでも、とっても楽しいんだよ!|何度も壁にぶつかったり転んだりしてね、|それってつまり冒険じゃん! +(The SPEAKER chuckles)|Truth be told, I wasn't asking~|Now why don't you kneel for me... +(SPEAKER は苦笑いをしている)|まあ、正直キミの回答なんてどうでもいいんだけど。|さっさと跪いて……。 +(The SPEAKER pouts)|I thought it would be fun... +(SPEAKER は不満そうにしている)|楽しいと思うんだけどな~……。 +(The SPEAKER surprises you with a crop to the thigh)|(You involuntarily kneel in front of her)|That's better~|Now why don't you say good night~ +(SPEAKER に太ももを叩かれ、驚いてしまう)|(突然の出来事に、思わず腰が抜けて彼女の前に跪いてしまった)|よしよし。|それじゃあ、良い夜を。 + + +Of course! I love it! +ええ、大好き! +(Nod eagerly) +(頷く) +I prefer 'situational awareness'. +感覚が尖っている方が好き。 +(Shake your head in alarm) +(必死に首を横に振る) + + +Doll me up! +ええ、お願い! +Actually, that sounds stifling... +やっぱり危ないからやめておく…… + + +That doesn't sound that bad actually... +やっぱり面白そう…… +(Shake your head and groan) (PERCENT chance to avoid) +(首を横に振って抵抗する)(PERCENT の確率で拒否) + + + + +(The SPEAKER smiles and looks down at you deviously)|Hey there, I have a 'job' for you! +(SPEAKER は厭らしい笑みを浮かべながらこちらを見ている)|ごきげんよう、"お仕事"の時間ですよ! +(The SPEAKER takes a duster gag from her satchel)|Such a good girl!|So here's what I have for you~|It's a special tool to help keep the place clean. +(SPEAKER はカバンから小さな箒の付いたパネルギャグを取り出す)|いい子ですね!|では、私からのプレゼントです。|これはダンジョンを綺麗にする特別な掃除用具なんです。 +(The SPEAKER grins)|I'm glad we could come to an understanding~|(She takes out a duster gag from her satchel)|Now then, this place is filthy.|Why don't you put this on to help? +(SPEAKER はニヤニヤと笑っている)|理解していただきありがとうございます~。|(彼女に猿轡を手渡された)|さて、ここは少しばかり埃っぽいので、|それをつけて綺麗にしてくださいね? +(The SPEAKER frowns)|Fair enough.|Perhaps you should reconsider your life choices~ +(SPEAKER は眉をひそめている)|そうですか。|本当にそんなこと言っていいんですか? +(The SPEAKER shrugs)|I'll find someone else... +(SPEAKER は肩を落としている)|別の方を探すとしましょう…… +(The SPEAKER reaches out to grab you)|Now now,|You shouldn't skip out on your duties~|(She pulls out a duster gag from her satchel and grins) +(SPEAKER に突然肩を掴まれた)|いやいや、|お仕事をサボってはいけませんよ~?|(彼女は粘着く笑みを浮かべながら、カバンから小さな箒の付いたパネルギャグを取り出した。) +(The SPEAKER smiles)|Don't be afraid!|(She turns the gag with the round mouth ball clearly visible)|Now open up... +(SPEAKER は笑みを浮かべている)|そう固くならないで。|(彼女は猿轡を回し、裏についた丸いボールを見せてくる)|さあ、口を開けて…… +(The SPEAKER shrugs)|Fine, I'll get someone else to clean up. +(SPEAKER は不機嫌そうだ)|別の方を探すとしましょうか…… +(The SPEAKER places the gag in your mouth)|(She then buckles up the straps.)|(You feel a locking mechanism pull the straps in tight...)|Good maid! +(SPEAKER に猿轡を噛まされた)|(首の裏でベルトを締められる)|(猿轡がきつくしまっていくのを感じる……)|良いメイドですね! +(The SPEAKER catches you and forces the gag on you)|(You feel it tighten as it locks on securely...)|I don't want to hear it!|Now go and do your job~ +(SPEAKER に掴まれ、無理やり猿轡を噛まされてしまった)|(猿轡はきつくかたく締まっている……)|怠惰の言い訳なんて聞きたくありませんからね。|それじゃあお仕事がんばってくださいね~。 + + +I'll do it! +やる +I don't like the sound of this. +やりたくないかな + + +Yes miss! +わかりました +Actually, maybe not... +やっぱりやめておく…… + + +Okay okay... I'll do it. +わかった……やる +That gag is far too big! (PERCENT chance to avoid) +ちょっと、大きすぎる!(PERCENT の確率で拒否) + + + + +(The SPEAKER swings an imaginary sword around)|En guar- Oh, you're unarmored!|Do you want to borrow some of mine? +(SPEAKER は素振りをしている)|ふんっ!はっ!おや、キミは防具を身に着けていないのかい?|いくつか貸してあげようか? +(The SPEAKER holds up a RESTRAINT)|I found this near an old suit of armor.|I think it's a helmet or something... +(SPEAKER は RESTRAINT を取り出した)|私のお古だけど……|これは……えっと……ヘルメット、だな。 +(The SPEAKER winks and locks it on)|I feel much safer already~ +(SPEAKER はウィンクしながら装備を手伝ってくれた)|これで安全に冒険できるな。 +(The SPEAKER pouts)|Aww, spoilsport!|(She returns to fighting her imaginary enemies) +(SPEAKER は口をとがらせている)|そんなお古だからって嫌がることはないだろう!|(彼女は再び素振りを始めた) +(The SPEAKER shrugs)|Your loss~ +(SPEAKER は肩をすくめる)|そう。じゃあな。 +(The SPEAKER grins deviously)|So? It might help...|(The SPEAKER dives at you suddenly!) +(SPEAKER は悪辣な笑みを浮かべた)|そうかい?それじゃあ……|(SPEAKER が突然飛びかかってきた!) +(The SPEAKER giggles)|Close enough, right?|Come on, there's enemies to fight! +(SPEAKER は笑っている)|この距離なら逃げられないだろう?|ほら、実戦だ! +(The SPEAKER trips over the floor)|AHHHHH!|Maybe I need more protection... +(SPEAKER は思い切り床に転がった)|うわぁっ!|もっと防具がないと…… +(The SPEAKER locks it in place quickly)|There, all set for battle now!|(The SPEAKER giggles, cheekily winking at you) +(SPEAKER に素早くマズルを取り付けられた)|そうだろう?よし、これで万全だな!|(SPEAKER はウィンクした) +(The SPEAKER tightly fastens the muzzle on)|Safe and secure~|(You whimper as the SPEAKER spanks you goodbye) +(SPEAKER に素早くマズルを取り付けられた)|これで安心だ。|(SPEAKER はさよならを言い、お尻をひっぱたいてきた) + + +Extra defense can't hurt... +防具さえあれば痛い思いをせずにすむ…… +(Nod cautiously) +(頷く) +I'm safe enough. +別に必要ないわ + + +A gag? Sounds fun~ +マズル?好きだよ、そういうの +That's not a helmet! +それはヘルメットじゃないでしょ + + +Well, it might... +まあ、そうかもしれないけど…… +(Dodge her lunge) (PERCENT chance to avoid) +(回避する)(PERCENT の確率で拒否) + + + + +(A smirking SPEAKER bumps into you)|So, you're with us now, huh?|I think you need a welcome gift. +(突然、笑いながら SPEAKER が飛び込んできた)|私達の仲間になってくれるんだね?|それじゃあ素敵な贈り物を用意しなきゃね! +Mmhmm, a gift~|(The SPEAKER leans forward to whisper in your ear)|Is it cold in here, or is it just you? +贈り物っていうのは~……|(SPEAKER は身を乗り出し、耳元で囁いてきた)|ところでここって少し暑くない? +(You shiver as everything gets colder)|(RESTRAINT forms around you!)|(The SPEAKER blows you a kiss and giggles) +(寒さに体が震えだした)|(RESTRAINT が身体を包む!)|(SPEAKER はくすくすと笑いながら、キスしてきた) +(The SPEAKER thinks for a moment)|I really wanted to try this too...|(Sighing, the SPEAKER walks away) +(SPEAKER はしばし考え込んだ)|試してみたかったんだけどなぁ……|(SPEAKER はため息を付き、去っていった) +(The SPEAKER scowls)|How boring. +(SPEAKER は機嫌悪そうにしている)|つまんないなぁ +(The SPEAKER laughs at your protest)|It's so much fun though~|(You feel the temperature drop suddenly) +(SPEAKER は抵抗を嘲笑っている)|もっと楽しもうよ~!|(突然周囲の温度が下がりだした) +(The SPEAKER thinks for a moment)|Well, I want to try this anyway~|(You feel the temperature drop suddenly) +(SPEAKER はしばし考え込んだ)|やった、これを試してみたかったんだ!|(突然周囲の温度が更に下がった) +(The temperature returns to normal)|(The SPEAKER seems surprised)|Hmm, that wasn't meant to happen. +(周囲の温度がもとに戻った)|(SPEAKER は驚いている)|まさかそんなに嫌がられるなんて +(RESTRAINT solidifies on you as the SPEAKER grins)|It worked! I did it!|Thanks for your, uh, help~ +(RESTRAINT が完全に固まると SPEAKER はニヤリと笑った)|やった、成功した!|遊んでくれてありがと~ +(RESTRAINT solidifies on you as the SPEAKER smiles)|Yes! Finally! How's that feel?|(The SPEAKER admires your restraints) +(RESTRAINT が完全に固まると SPEAKER は笑った)|ようやく成功した!どんな感じ?|(SPEAKER は出来上がった拘束具をしげしげと見つめている) + + +A gift? +贈り物? +(Nod warily) +(恐る恐る頷く) +No thanks. +いらない + + +Umm... just me? +どういうこと? +Wait, don't make it colder! +待って、寒いのは嫌 + + +(Shiver and watch as the ice covers you) +(震えながら氷が体を覆うのを見ている) +(Mutely whimper as the ice covers you) +(呻きながら氷が体を覆うのを見ている) +Ah! T-That's freezing! (PERCENT chance to avoid) +ちょっと、寒い!(PERCENT の確率で拒否) +(Wriggle to warm up) (PERCENT chance to avoid) +(もがいて体を温める)(PERCENT の確率で拒否) + + + + +(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? +(SPEAKER が近づいてきた)|市民ヲ発見|拘束ヲゴ所望デスカ? +(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? +(SPEAKER はピーピー鳴っている)|SPEAKER ガ RESTRAINT ヲ追加シマス|ヨロシイデスネ? +(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER が体の周りを回りだした)|RESTRAINT 射出|良イ一日ヲ。 +(The SPEAKER buzzes)|Understood. Proceding back to duty. +(SPEAKER はブーブー鳴っている)|了解、任務ニ戻リマス。 +(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. +(SPEAKER カチカチ音を立てている)|了解シマシタ|SPEAKER ハ任務ニ戻リマス。 +(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. +(SPEAKER は変な音を立てている)|エラー:不明ナ命令|SPEAKER ガ RESTRAINT ヲ追加シマス。 +ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. +エラー:受任シマシタ。|ステータス:SPEAKER ガ RESTRAINT ヲ追加。 +(The SPEAKER makes a whirring noise)|ERROR: SPEAKER out of tape.|Returning to routine. +(SPEAKER はノイズ音を出している)|エラー:SPEAKER ハテープ切レデ実行不可。|任務ニ戻リマス。 +(The SPEAKER launches tape which catches you as you run)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER がテープを射出し、逃げる前に捕まってしまった)|RESTRAINT 射出|良イ一日ヲ。 + + +Uh, affirmative? +えっと、はい? +(Nod) +(頷く) +Negative. +いいえ + + +Very acceptable! +はい! +No, I don't want that. +いらない + + +If you have to... +そうしたいなら…… +Go away robot! (PERCENT chance to avoid) +離れなさい!(PERCENT の確率で拒否) +(Shake your head rapidly) (PERCENT chance to avoid) +(素早く首をふる)(PERCENT の確率で拒否) + + + + +(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER がケーブルを射出しだした)|RESTRAINT 射出|良イ一日ヲ。 +(The SPEAKER makes a whirring noise)|ERROR: SPEAKER cable jammed.|Returning to routine. +(SPEAKER はノイズ音を出している)|エラー:SPEAKER ハテープ切レデ実行不可。|任務ニ戻リマス。 + + + + + + +(A happy SPEAKER looks at you)|Hey there cutie~|Want to try some scarf bondage? +(SPEAKER は幸せそうに近づいてきた)|こんにちは~|ねぇ、スカーフで縛られてみたくない? +(The SPEAKER holds up some scarves)|If you want to try, I've got a few here.|I could give you a RESTRAINT? +(SPEAKER はスカーフを持ち出した)|試してみたいならいくつかあるから。|RESTRAINT をしてあげるね? +(The SPEAKER smiles gently at you as she ties)|I love the silky feeling~|(The SPEAKER tightens all her knots) +(SPEAKER は笑顔で縛りだした)|この滑らかな触り心地が好きなんだ|(SPEAKER はきつく縛った) +(The SPEAKER looks away and nods)|Well... maybe next time. +(SPEAKER は視線をそらし頷いた)|わかった……また今度ね。 +(The SPEAKER shuffles awkwardly)|Oh... well...|Come back if you change your mind~ +(SPEAKER はぎこちなく去っていった)|そっか……|気が変わったら言ってね。 +(The SPEAKER scowls)|Hey, don't back out!|I promise I'll make it comfortable! +(SPEAKER は不敵な笑みを浮かべた)|大丈夫、遠慮しないで!|絶対気持ちいいから! +(The SPEAKER frowns)|Too bad, I want to tie someone! +(SPEAKER は眉をひそめた)|今丁度誰かを縛りたい気分なの! +(The SPEAKER drops her scarves)|Aww, really?|I'll go find someone else then... +(SPEAKER はスカーフを落とした)|本当に?|じゃあ別の人を探さなきゃ…… +(The SPEAKER beams a smile)|Yay, thank you!|Feels nice, right? +(SPEAKER は笑顔を見せた)|やった、ありがとう!|気持ちいいでしょ? +(The SPEAKER tosses a scarf around you like a lasso)|Not so fast! You cannot escape the fluff! +(SPEAKER はスカーフをこちらに投げてきた)|遅い!逃げられないよ! + + +Sounds good! +面白そうだね +(Nod quickly) +(頷く) +Not really. +遠慮しておく + + +Please do! +わかった、お願い +(Nod and giggle) +(喜んで頷く) +Not right now. +やっぱり今はいい + + +Well... sure then. +そこまで言うなら…… +Hey! Stop! (PERCENT chance to avoid) +ちょっと、やめてよ!(PERCENT の確率で拒否) +(Shake your head and whine) (PERCENT chance to avoid) +(首を振って駄々をこねる)(PERCENT の確率で拒否) + + +(An excited SPEAKER turns to you)|Eureka, I've done it!|Do you want to see? +(興奮した SPEAKER がこちらに向かってきた)|エウレカ、ついにやったよ!|見たいか? +(The SPEAKER pulls out a pressurized flask)|Behold! A gaseous form of latex!|I've coated the interior with a layer of inert slime to keep it secure.|Here, have a look!|(She holds out the container) +(SPEAKER は加圧フラスコを取り出した)|気体のゴムだ!|内部を不活性化のスライムでコーティングして保管に成功したんだ!|ほら、見てみて!|(彼女はフラスコを差し出してきた) +(The flask springs a leak)|Oh no! That wasn't supposed to happen!|(The gas crystalizes into a RESTRAINT across your body) +(フラスコは飛び跳ね、中身がこぼれだした)|あぁっ、そんな!|(ガスが全身を包み、結晶化して RESTRAINT となった) +(The SPEAKER scoffs)|You'll see... you'll all see! +(SPEAKER は見下した笑みを浮かべている)|今にわかるさ……今にな! +(The SPEAKER sighs)|So hard to find good help out here... +(SPEAKER はため息をついている)なかなか手伝ってくれる人がいないな…… +(The SPEAKER frowns)|What, do you doubt my results? See for yourself!|(She unscrews the cap) +(SPEAKER は口をとがらせている)|私の研究にケチをつけるのか?そんなやつはこうだ!|(彼女はフラスコの蓋を外しだした) +(The green gas starts leaking)|Oh no! It wasn't supposed to do that! +(フラスコから緑色のガスが漏れ出した)|あぁっ、そんなはずじゃあ! +(You push her out of the way, but she frowns)|Hmph. This is your fault. +(彼女を突き飛ばすと、彼女は不機嫌そうな顔をしていた)|お前のせいだからな。 +(You push her out of the way, but get caught in the cloud yourself)|(The gas crystalizes into a RESTRAINT across your body)|Oh no, that could have been me! +(彼女を突き飛ばしたが、ガスからは逃げられなかった)|(ガスが全身を包み、結晶化して RESTRAINT となった)|うわぁ、ガス浴びなくてよかった! +(The gas moves toward you, as if by its own will)|(The gas crystalizes into a RESTRAINT across your body)|That wasn't supposed to happen... +(まるで意志があるかのように、ガスはこちらに向かってきた)|(ガスが全身を包み、結晶化して RESTRAINT となった)|こんなはずじゃあなかったんだ…… + + +Seems interesting! +面白そうね! +(Nod slowly) +(ゆっくり頷く) +Seems boring. +つまらなさそう + + +Are you sure this is a good idea? +本当にこれでいいの? +Keep that away from me! +近づけないで! + + +I'll stop it! +止めるわ! +(Run toward her to help) +(彼女を助けるために近寄る) +(Run away!) (PERCENT chance to avoid) +(逃げる!)(PERCENT の確率で拒否) + + + + +(A messy looking SPEAKER turns to you)|Hmm, curious. Very curious.|Can you help me with an experiment? +(複雑な表情の SPEAKER がこちらを見てきた)|うーん、不思議だ。実に不思議だ。|少し実験を手伝ってくれないか? +(The SPEAKER pulls out a flask)|I isolated some slime, but it's inert.|Would you let me spill some on you? +(SPEAKER はフラスコを取り出した)|スライムを捕まえたんだが、反応が鈍くてな。|少しキミに垂らしてみても? +(The SPEAKER tips out the entire flask)|Aha! It's growing again! Fascinating.|(Sticky RESTRAINT clings to you) +(SPEAKER はフラスコの中身を全て垂らしてきた)|アハッ、成長した!素晴らしい!|(ネバネバした RESTRAINT に取り付かれた) +(The SPEAKER tuts disapprovingly)|Not one for chemistry, eh? +(SPEAKER は不承不承に引き下がった)|科学に興味がないのか…… +(The SPEAKER glares at you)|You've got no sense of adventure!|For science! +(SPEAKER は睨みつけてきた)|冒険心がないな!|これも科学のためなんだ! +Ah, but it'll be quick!|(The SPEAKER begins tipping the flask)|See? It's already moving toward you! +すぐに済ませるから!|(SPEAKER はフラスコの中身を垂らしてきた)|ほら、もうキミに向かって動き始めたぞ! +(The SPEAKER tosses the slime on you)|(The slime flops off limply)|Ah. Back to the drawing board. +(SPEAKER はスライム入りのフラスコを投げつけてきた)|(スライムはぐったりしている)|あぁ……研究に戻ろう。 +(The SPEAKER pours the slime onto you)|That's the spirit girl!|(Sticky RESTRAINT clings to you) +(SPEAKER はスライムを垂らしてきた)|素晴らしい献身だ!|(ネバネバした RESTRAINT に取り付かれた) +(The SPEAKER tosses the slime on you)|Ha, look, it's alive!|(Sticky RESTRAINT clings to you) +(SPEAKER はスライム入りのフラスコを投げつけてきた)|よし、生きているぞ!|(ネバネバした RESTRAINT に取り付かれた) + + +Sure. +いいよ +Absolutely not. +絶対イヤ + + +On me? Sounds fun~ +私に?面白そうだね +Nope. Not doing that. +やっぱりやめておく + + +Okay, for science... +わかった、科学の発展のために…… +Ah! Don't you dare! (PERCENT chance to avoid) +なんてことするの!(PERCENT の確率で拒否) +(Shake your head and whimper) (PERCENT chance to avoid) +(必死に首を横に振る)(PERCENT の確率で拒否) + + + + +(A SPEAKER whispers to you)|Ever wonder how wolfgirls feel?|Or why they're so obedient? +(SPEAKER が囁いてきた)|ウルフガールについてもっと知りたくない?|なぜ彼女たちがあんなに従順なのか? +(The SPEAKER grins)|I've got a RESTRAINT here~|Wanna give it a try? +(SPEAKER はにっこり笑った)|ここに RESTRAINT があるんだけど~|これを付けてみればわかるよ? +(The SPEAKER puts on the RESTRAINT)|Perfect. Better behave now~|(The SPEAKER pats your butt) +(SPEAKER は RESTRAINT を着せてきた)|かんぺき~。お行儀よくしてね~。|(SPEAKER がお尻を叩いてきた) +(The SPEAKER rolls her eyes)|You've seen wolfgirls, right?|Ah, whatever, go have fun~ +(SPEAKER は上目遣いで見つめてきた)|ウルフガールを見たことあるんでしょ?|まあ、とにかく楽しんできてね。 +(The SPEAKER nods glumly)|Not a fan?|Shame, I am~ +(SPEAKER は憂鬱に頷いた)|面白くなかった?|残念。 +(The SPEAKER grabs you quickly)|Oh, it's very strict~|And great for being trained... +(SPEAKER が素早く掴みかかってきた)|すっごくきつくて~|調教に最適なんだ~…… +(The SPEAKER looks at you deviously)|You're going to wear this RESTRAINT,|if you want to or not~ +(SPEAKER がいやらしく見つめてくる)|それじゃあ RESTRAINT をつけるね|嫌とは言わせないから。 +(The SPEAKER sulks)|Have it your way then. +(SPEAKER は不機嫌になった)|じゃあね。 +(The SPEAKER adds the RESTRAINT)|(You feel her tighten everything before locking it)|Good girl~ +(SPEAKER は RESTRAINT を着せてきた)|(鍵がかかると、途端にきつく締まりだした)|いい子~ +(The SPEAKER pushes you to the ground)|I'll make it extra tight for you~|(The RESTRAINT locks tightly onto you) +(SPEAKER に無理やり押し倒された)|もっときつくしてあげるね~|(RESTRAINT をきつくロックされた) + + +Maybe a little~ +少しは興味ある +(Nod excitedly) +(頷く) +Don't know, don't care. +いや、気にしたことはないかな + + +Yes! So much! +うん、試してみたい +That looks too strict! +ちょっときつそうで嫌かな + + +I- Well- O-Okay~ +えっと……わかった…… +(Moan and squirm) +(頷く) +I don't want to get stuck! (PERCENT chance to avoid) +そんなの付けたくない!(PERCENT の確率で拒否) +(Shake your head worriedly) (PERCENT chance to avoid) +(全力で首を横に振る)(PERCENT の確率で拒否) + + + + +(A SPEAKER gracefully gestures to you)|So good to see a friendly face~|Care to see some elven goods? +(SPEAKER が優雅に挨拶してきた)|こんにちは、そこのお方。|エルフの道具はいりませんか? +(The SPEAKER holds up a RESTRAINT)|These are some of our strictest.|Want to try? +(SPEAKER は RESTRAINT をかざしてきた)|これはエルフの拘束具で一番きついものなのだけれど|試してみませんか? +(The SPEAKER smiles sweetly)|Such a good girl~|(The RESTRAINT locks with a loud click) +(SPEAKER は可憐に笑う)|ありがとうございます、素直でいい子ですね。|(RESTRAINT は大きな音を立ててロックされた) +(The SPEAKER sagely nods)|As you wish~ +(SPEAKER は頷いた)|そうですか、わかりました。 +(The SPEAKER frowns briefly)|I understand~ +(SPEAKER は一瞬眉をひそめた)|そうですか……わかりました。 +(The SPEAKER leans closer)|Then you can test their escapability!|(The SPEAKER dives towards you!) +(SPEAKER は近づいて覗き込んできた)|エルフの拘束具を試せるんですよ?|(SPEAKER が飛び込んできた!) +(The SPEAKER shifts her weight back)|I'm afraid I must insist.|(She's gripping a RESTRAINT)|(The SPEAKER dives towards you!) +(SPEAKER は後ろに引いた)|残念だけど諦めるしかないですね……なんて|(彼女は RESTRAINT を握りしめている)|(SPEAKER が飛び込んできた!) +(The SPEAKER rolls past harmlessly)|Oh! So fast~ +(SPEAKER を躱した)|あら、素早いんですね。 +(The SPEAKER snaps the RESTRAINT on)|There, much better.|Now squirm for me cutie~ +(SPEAKER に RESTRAINT を取り付けられた)|これでよし。|さあ、もがいてみてください? +(The SPEAKER trips you over)|(Before you can move, the RESTRAINT closes firmly)|Strict, isn't it?~ +(SPEAKER に一瞬で転ばされた)|(反応する前に RESTRAINT が大きな音を立ててロックされた)|とってもきついでしょう? + + +Of course! +ええ、是非 +(Nod happily) +(頷く) +No, thanks. +いや、結構 + + +Pretty please~ +ええ、お願い + + +Fine... +わかった…… +(Moan and giggle) +(頷く) +Stop! (PERCENT chance to avoid) +やめて!(PERCENT の確率で拒否) + + + + +(A SPEAKER plays with silvery rope)|Hmm, I need to get better with this.|Can I practice on you? +(SPEAKER は銀色のロープをいじっている)|うーん、もっと上手になりたい……|あの、練習に付き合ってくれませんか? +(The SPEAKER grins happily)|Thank you girl~|I'll tie with RESTRAINT then~ +(SPEAKER は幸せそうに微笑んだ)|ありがとうございます!|それじゃあ RESTRAINT で拘束しますね。 +(The SPEAKER binds you tightly)|(The rope is tight, and she's clearly an expert.)|Mmm, not too bad~ +(SPEAKER はきつく縛ってきた)|(彼女は慣れた手付きでロープをきつく締める)|んー、いい感じですね。 +(The SPEAKER pouts indignantly)|Why say yes then?!|(The SPEAKER walks off grumbling) +(SPEAKER は)|最初に手伝うって言ったのに……|(SPEAKER は不満そうに歩いていった) +(The SPEAKER sighs)|Very well then~ +(SPEAKER はため息をついた)|わかりました…… +(The SPEAKER pouts indignantly)|Oh no, you don't get out that easy.|You said you'd help! +(SPEAKER が詰め寄ってきた)|簡単には逃しませんよ。|手伝うって言いましたものね? +(The SPEAKER smirks)|Ooh, a chance to practice against resistance~|I can't pass that up! +(SPEAKER はニヤニヤ笑っている)|これは抵抗する相手を縛る良い機会ですね~|この機会をふいにするわけにはいきません! +(The SPEAKER can't keep the knots tight)|(Eventually, she gives up)|S-Stupid human... +(SPEAKER は中々上手に縛れない)|(そして諦めてしまった)|そんなに抵抗するなんて…… +(The SPEAKER strictly ties you up)|(You can feel she's done this many times)|(She smirks at you as she departs) +(SPEAKER にきつく縛られた)|(長い時間をかけてゆっくりと練習台にされてしまった)|(彼女はニヤニヤと笑いながら去っていった) +(The SPEAKER strictly ties you up)|(There's no slack anywhere!)|(She makes a face at you as she leaves) +(SPEAKER にきつく縛られた)|(全く抜け出せない)|(彼女はこちらを嬉しそうに一瞥すると去っていった) + + +Any time~ +手伝うよ +I'd rather you didn't. +やめておく + + +Sounds great! +わかった +Actually, I don't want that. +やっぱりやめておく + + +I'll play along then~ +しょうがない…… +(Struggle against her) (PERCENT chance to avoid) +(もがく)(PERCENT の確率で拒否) + + + + +(The SPEAKER quickly motions to you)|Hey! Over here!| I got something to show you! +(SPEAKER が話しかけてきた)|ちょっとこっちに来て!|面白いのがあるんだ! +(The SPEAKER giggles)|You'll be wearing this~|(A RESTRAINT is in her hands) +(SPEAKER はくすくす笑っている)|これを着てみてくれないかな?|(RESTRAINT が彼女の手に握られている) +(The SPEAKER looks surprised)|Oh, uh, sure!|(They quickly add the RESTRAINT) +(SPEAKER は驚いている)|えっ、本当に良いの?|(彼女は RESTRAINT を素早く着せてきた) +(The SPEAKER grins sneakily)|I thought you might say that~|But- ahh!|(They drop the item and you slip away) +(SPEAKER はニヤリと笑いながら近づいてきた)|ああ、もちろんそう言うよね~|でも……あっ!|(彼女は転び、拍子に手に持っていた拘束具で自らを拘束してしまった) +(The SPEAKER looks angry)|Hey! HEY! I'm talking to-|Ah, forget it. +(SPEAKER は怒っている)|ちょっと、ねぇ!あなたに話して……|ハァ…… +(The SPEAKER grins sneakily)|I thought you might say that~|But it wasn't a choice... +(SPEAKER はニヤリと笑いながら近づいてきた)|まあ、そうだよね~|でもあなたに選択肢はないよ…… +(The SPEAKER follows you)|Not so fast there~|(She blocks your path) +(SPEAKER が追ってきた)|そんなに急がないでさ~|(道を塞がれてしまった) +(The SPEAKER fumbles with the RESTRAINT)|C-Come on, open-|(You quickly walk away) +(SPEAKER は誤って自らの拘束具にはまってしまった)|ちょっと、解けない……|(放っておこう) +(The SPEAKER adds the RESTRAINT)|Good luck with that one~|(She sounds like she's gloating...) +(SPEAKER は RESTRAINT を取り付けてきた)|幸運を祈るよ!|(彼女は満足気に去っていった……) +(The SPEAKER roughly forces you down)|(Pushing your head down, the RESTRAINT slides on)|(The SPEAKER tugs your hair, then walks away) +(SPEAKER に押し倒された)|(頭を抑え込まれ、 RESTRAINT を無理やり取り付けられた)|(SPEAKER は去っていった……) + + +(Walk over, curiously) +(近寄ってみる) +(Don't approach). +(近寄らない) +(Don't approach) +(近寄らない) + + +Sure! +いいよ +W-What? No way! +待って、やめて! + + +(Let her add the restraint) +(好きにさせる) +(Moan and nod) +(頷く) + + + + +(The SPEAKER walks over)|You'd make a cute catgirl~|Want help becoming one? +(SPEAKER が歩み寄ってきた)|ねえ、猫になりたくない?|なりきるための道具があるんだけど。 +(The SPEAKER grins)|Here, I've got this RESTRAINT.|That'll help! +(SPEAKER は笑みをたたえている)|よかった!じゃあ RESTRAINT をつけてね!|手伝うよ! +(The SPEAKER gleefully comes closer)|(The RESTRAINT fits snugly)|So adorable! +(SPEAKER は笑顔で近づいてきた)|(RESTRAINT はすっぽりとはまった)|似合ってるね! +(The SPEAKER nods disappointed)|Fair enough~ +(SPEAKER は気を落とし力なく頷いた)|じゃあまたね~ +(The SPEAKER sighs)|Maybe another time~ +(SPEAKER はため息をついた)|また今度ね~ +(The SPEAKER titters)|It's going on, kitty~ +(SPEAKER はニタニタしている)|やっぱり無理矢理にでもさせてあげるね~! +(The SPEAKER giggles)|Let's see if you can get away then~|(You see a RESTRAINT in her hand) +(SPEAKER はニヤリと笑った)|それじゃあ逃げられるかどうか見てみようか~|(彼女の手には RESTRAINT が握られている) +(The SPEAKER whimpers and drops it)|Owwww!|I hit my knee! +(SPEAKER は拘束具を落とし、鳴き声を上げた)|ニャアア!|す……スネにぶつかっ…… +(The SPEAKER wiggles happily)|Oh, you're so cute!|Enjoy it~ +(SPEAKER は幸せそうにしている)|とっても可愛い~!|それじゃあ楽しんでね~! +(The SPEAKER traps you)|(You feel the RESTRAINT being forced on)|Meow~ +(SPEAKER に捕まった)|(RESTRAINT を無理やり装着させられた)|にゃぁ~ + + +No, not today. +今日はいい + + +Yay! +やった! +Not like that! +やっぱりやめておく + + +Y-Yes miss~ +えっと、わかった +(Duck out the way) (PERCENT chance to avoid) +(逃げ出す)(PERCENT の確率で拒否) + + + + +(A SPEAKER winks at you)|You look like a girl who likes feeling|like a prisoner, am I right? +(SPEAKER がウィンクしてきた)|あなた、誰かに似ているって言われない?|例えばここの囚人とか? +(The SPEAKER nods happily)|I knew it! Well, it's your lucky day.|I've got some RESTRAINT for you~ +(SPEAKER は嬉しそうに頷いている)|やっぱり!|じゃあ RESTRAINT があるんだけど、プレゼントしてあげるね! +(The SPEAKER spins you around)|(You hear the cold metal click shut)|Nice and submissive~ +(SPEAKER が周囲を回る)|(拘束具の金具が音を立てて締まるのを感じた)|楽しんでね~ +(The SPEAKER shrugs)|It's not for everyone, I guess~ +(SPEAKER は肩をすくめる)|皆がこういうの好きってわけでもないよね…… +(The SPEAKER frowns)|Really?|I was so sure... +(SPEAKER は不機嫌そうだ)|そうだと思ったのに…… +(The SPEAKER grins maliciously)|I like seeing prisoners though~|And you're right here... +(SPEAKER は悪意の篭った笑みを浮かべている)|囚人を眺めるのが好きなんだ~。|あなたみたいな…… +(The SPEAKER giggles)|I'm gonna make you one anyway~|(You see a RESTRAINT in her hand) +(SPEAKER は嫌な笑みを浮かべる)|今は囚人みたいにもがくあなたを見たいな~。|(彼女の手には RESTRAINT が握られている) +(The SPEAKER gulps)|M-Maybe I won't then! +(SPEAKER は息を呑んだ)|わかった、もうやらない! +(The SPEAKER adds the RESTRAINT)|You're blushing dear~|She doth protest too much? +(SPEAKER は RESTRAINT を取り付けてきた)|興奮してるの?|最初は否定してたくせに。 +(The SPEAKER giggles as she catches you and slaps on the cuffs)|No so fast, dear~ +(SPEAKER は笑みを浮かべ、素早く取り押さえて枷をはめてきた)|もうちょっとゆっくりしていきなよ~ + + +Maybe a bit~ +ちょっとだけ +Not at all. +全然似てないよ + + +(Wiggle excitedly) +(興奮する) +Not like that. +そういうのは好きじゃないかな + + +O-Okay... +わ、わかった…… +(Moan and shiver) +(頷く) +Don't even try. (PERCENT chance to avoid) +やめて!(PERCENT の確率で拒否) + + + + +(A SPEAKER is looking at something)|So comfy... but how?|Hey, you! Come see this! +(SPEAKER は何かを見ている)|とても着やすそう……でもどうして?|ねえキミ!ちょっとこれを見て! +(The SPEAKER holds up a RESTRAINT)|It's so soft, but so strict~|Want to give it a try? +(SPEAKER は RESTRAINT を見せてくる)|これはとても柔らかくて、それでいて抜け出しにくいんだ。|試してみない? +(The SPEAKER quickly fastens it on)|(A wave of comfort passes over you)|(The SPEAKER looks on enviously) +(SPEAKER は素早く着せてきた)|(着ているととても心地よい)|(SPEAKER は羨ましそうに見ている) +(The SPEAKER shrugs)|Eh, alright then. +(SPEAKER は肩をすくめる)|まあいいか。 +(The SPEAKER shrugs)|Up to you. +(SPEAKER は肩をすくめる)|キミがそういうならやめておくよ。 +(The SPEAKER frowns)|But it's so comfy!|Here, look, I'll show you... +(SPEAKER は食い下がってきた)|でもとても気持ちいいんだ!|ほら見て…… +(The SPEAKER approaches)|Hey, see this RESTRAINT?|I'm going to put it on you~ +(SPEAKER は近寄ってきた)|ほら、 RESTRAINT を見て?|これを着せてあげるから +(The SPEAKER looks startled)|Oh! Uh, I guess you're right... +(SPEAKER は驚愕している)|え?まあ確かにそうだけど…… +(The RESTRAINT is buckled firmly in place)|See? Good, huh?|(You sink into the comforting feeling) +(RESTRAINT はしっかりと固定された)|どう?いい感じ?|(着ているととても心地よい) +(The SPEAKER ignores you)|(The RESTRAINT is buckled firmly in place)|(A wave of comfort passes over you) +(SPEAKER は無視して近づいてきた)|(RESTRAINT はしっかりと固定された)|(着ているととても心地よい) + + +(Approach) +(近づく) +(Keep your distance) +(近づかない) + + +Nope. +遠慮しとく + + +It does look comfortable~ +確かに快適そうだね +(Squirm and bow your head) +(頷く) +It looks too strict! (PERCENT chance to avoid) +きつそうだから嫌!(PERCENT の確率で拒否) + + + + +(The SPEAKER brushes past hurriedly)|Careful girl!|Else I'll lock you away~ +(急いでいる様子の SPEAKER とぶつかった)|気をつけろ!|次にこんなことがあったら牢屋に打ち込んでやろうか。 +(The SPEAKER looks at you intrigued)|Aren't you something...|How about wearing this RESTRAINT? +(SPEAKER は興味有りげにこちらを見つめてきた)|お前何か悪いことしたのか……?|それじゃあ RESTRAINT を付けてやる。 +(The SPEAKER grins and locks it on)|Maybe I should bump into you more~ +(SPEAKER は笑みを浮かべ、拘束具をはめてきた)|今度見かけたらもう一度ぶつかってやるからな~。 +(The SPEAKER rolls her eyes)|Run along then girl~ +(SPEAKER は目を丸くした)|こっちは急いでるんだ。じゃあな。 +(The SPEAKER nods)|Didn't think so~|Oh, and, uh, sorry for the bump. +(SPEAKER は頷いた)|ああ、まあそうだよな。|ぶつかって悪かったな。 +(The SPEAKER shakes her head)|You don't get off that lightly.|These are going on. +(SPEAKER は首を振った)|いいや、ちょっと待て。|まだ話は終わっていないぞ。 +(The SPEAKER frowns)|I think I should.|You'll just bother someone else.|(She holds up a RESTRAINT) +(SPEAKER は食い下がってきた)|放って置いたらまた誰かにぶつかるだろう?|だからこうするべきだ。|(彼女は RESTRAINT を取り出した) +(The SPEAKER sighs)|I'll let you off then.|Oh, and, uh, sorry for the bump. +(SPEAKER はため息をつく)|わかった、急いでいるし見逃してやろう……|ぶつかって悪かったな。 +(The SPEAKER adds the RESTRAINT)|(As she's locking it, she giggles)|You're really cute actually~ +(SPEAKER に RESTRAINT を追加された)|(拘束を終えると、彼女は笑みを浮かべる)|まったく可愛いやつめ。 +(The SPEAKER stumbles and grimaces)|Ugh! Fine, you can go then.|D-Didn't want to see you tied anyway... +(SPEAKER はよろめき、苦笑いを浮かべた)|よし、じゃあもう行っていいぞ。|お、お前が縛られている姿なんて見たくなかったしな…… + + +That doesn't sound bad... +それもわるくないかな +(Giggle into your gag) +(猿轡越しに肯定する) +That won't be necessary. +その必要はない + + +I'd love to! +そういうの好きだよ + + +M-Maybe you should then~ +わ、わかった +You ran into me! (PERCENT chance to avoid) +そっちからぶつかってきたくせに!(PERCENT の確率で拒否) + + + + +(A SPEAKER gives you a small curtsy)|Good day.|Care to try part of our uniform? +(SPEAKER は笑顔で会釈してきた)|ごきげんよう。|メイド服を着てみたくはありませんか? +(The SPEAKER looks content)|We can offer you this RESTRAINT.|It's a snug fit... +(SPEAKER は内容を説明してきた)|まず、 RESTRAINT を着ていただきますね。|サイズもぴったりだと思いますよ…… +(The SPEAKER buckles it strictly)|All maids wear this at sometime.|You'd fit right in! +(SPEAKER は拘束具をしっかり締めてきた)|全てのメイドは常にこれを着ているのです。|とっても似合っていますよ。 +(The SPEAKER frowns for a second)|Ah, I see.|As you were then. +(SPEAKER は一瞬眉をひそめた)|あら、そうですか。|ではまた今度。 +(The SPEAKER nods)|We hope to see you again nonetheless. +(SPEAKER は頷いた)|またお会いしましょう。 +(The SPEAKER glares)|We urge you to reconsider. +(SPEAKER は威圧的な笑みを浮かべる)|考え直していただけませんか? +(The SPEAKER has a twinkle in her eye)|We will offer you this RESTRAINT.|You should accept. +(SPEAKER は目を輝かせた)|では、 RESTRAINT を着ていただきますね。|それが決まりですので。 +(The SPEAKER pulls an odd smile)|Very well. +(SPEAKER は引きつった笑みを浮かべた)|そうですか。 +(The SPEAKER smugly nods)|(With surprising speed, the RESTRAINT locks in place)|Excellent, a good fit. +(SPEAKER はにっこり頷いた)|(そして驚くべき速度で RESTRAINT を着せてきた)|素晴らしい、とても似合っていますよ。 +(The SPEAKER covers your mouth with her hand)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly) +(SPEAKER の手で口を塞がれた)|これ以上余計なことを言わないの。|(拘束具をきつく締められてしまった) + + +No, thank you. +遠慮しとく + + +I accept~ +わかった + + +I-I accept... +わ、わかった…… +(Moan and nod slowly) +(ゆっくり頷く) +No way! (PERCENT chance to avoid) +や、やめて!(PERCENT の確率で拒否) + + + + +(The SPEAKER looks at you inquisitively)|(Wordlessly, they motion at your body)|(They seem to be asking about restraints) +(SPEAKER は何かをやりたそうにこちらを見ている)|(彼女は無言でこちらの身体を見ている)|(おそらく縛りたいと言うことだろう) +(The SPEAKER nods understandingly)|(RESTRAINT appears in their hand)|(They tilt their head at you) +(SPEAKER はしっかりと頷いた)|(突然 RESTRAINT が彼女の腕に現れる)|(彼女は首を傾げ、こちらを見つめてくる) +(The SPEAKER spins around you)|(You feel the oddly cold restraint lock in place)|(The SPEAKER nods and moves away) +(SPEAKER が周囲を回りだした)|(身体に不思議な拘束具の冷たい感触がした)|(SPEAKER は頷き、どこかへ行ってしまった) +(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) +(SPEAKER はこちらを凝視した)|(そして RESTRAINT を置き、どこかへ行ってしまった) +(The SPEAKER leaves you alone) +(SPEAKER はどこかへ行ってしまった) +(The SPEAKER seems to frown)|(RESTRAINT appears in their hand)|(They rapidly approach) +(SPEAKER は不機嫌そうにしている)|(突然 RESTRAINT が彼女の腕に現れる)|(彼女は素早く近づいてきた) +(The SPEAKER tilts their head)|(RESTRAINT appears in their hand)|(They come closer) +(SPEAKER は首を傾げ、こちらを見つめてくる)|(突然 RESTRAINT が彼女の腕に現れた)|(彼女はそのまま近づいてくる) +(The SPEAKER holds you in place)|(You hear the oddly cold material locking)|(They nod at you) +(SPEAKER に身体を固定されてしまう)|(そして身体に不思議な拘束具の冷たい感触がした)|(彼女たちは満足気に頷いた) +(The SPEAKER firmly grabs you)|(The RESTRAINT locks onto your body tightly)|(The oddly cold material makes you shiver) +(SPEAKER はがっしりと掴んできた)|(RESTRAINT をきつくはめられてしまった)|(不思議な冷たい感覚に寒気がした) + + +Y-Yes? +な、なにかしたいの? +(Nod back) +(頷く) +No thank you. +遠慮しとく + + +(Smile and prepare yourself) +(覚悟を決めて笑顔を返す) +(Nod and prepare yourself) +(覚悟を決めて笑顔を返す) +No, not that. +やっぱりやめて + + +W-Whoa! S-Sure... +えっ、わ、わかった…… + + + + +(A SPEAKER giggles and calls to you)|Hey there~|Fancy seeing some nature?~ +(SPEAKER がにやにやしながら呼び止めてきた)|どうも~|自然は好きですか~? +(The SPEAKER motions with her hands)|(Vines rise from the floor and twirl)|These will bind you nicely... +(SPEAKER は両手を動かす)|(すると突然ツタが地面から現れ、くるくるとねじれていく)|それじゃあこれで縛ってあげるね~…… +(The SPEAKER grins and motions again)|(The plants wrap around you quickly)|(You wriggle against the RESTRAINT) +(SPEAKER は笑顔で再び両手を動かす)|(ツタが全身を素早く包んでいく)|(RESTRAINT に縛られてしまった) +(The SPEAKER pouts)|Aww... +(SPEAKER は残念そうにしている)|あらら…… +(The SPEAKER frowns)|Not even a little? +(SPEAKER はつまらなそうにしている)|全く? +(The SPEAKER smirks)|That wasn't a question~ +(SPEAKER はクスクスと笑った)|これは質問じゃなくて~ +(The SPEAKER giggles again)|(Vines begin to move around your feet)|Hold still dear~ +(SPEAKER は再び笑みを浮かべる)|(突然ツタが足首に絡みついた)|じっとしててね~ +(The SPEAKER sighs and nods)|(The vines retreat from you)|Fiiine, you can go~ +(SPEAKER はため息混じりに頷く)|(ツタが身体から離れていった)|はーわかった、もう行っていいよ。 +(The vines move much faster)|(You feel the RESTRAINT as you squirm)|A gift, from me~ +(ツタの動きが突然素早くなった)|(RESTRAINT がうごめいているのを感じる)|これはあげるね~ +(The SPEAKER giggles loudly)|(The vines catch up and pin you down)|(When they let go, you're left with a RESTRAINT) +(SPEAKER は笑い声を隠しきれていない)|(ツタに引き倒されてしまった)|(ツタが離れると、 RESTRAINT が残っていた) + + +Always! +好きだよ + + +That sounds exciting! +面白そうだね +Wait, not like this! +まって、それはいらない + + +W-Well- o-okay... +わ、わかった…… +Don't! (PERCENT chance to avoid) +やめて!(PERCENT の確率で拒否) +(Shake your head) (PERCENT chance to avoid) +(首を横に振る)(PERCENT の確率で拒否) + + + + +(A SPEAKER approaches)|Nothing quite beats a strong metal|chain, right? +(SPEAKER が話しかけてきた)|鋼鉄より硬いものはない。|鎖、いいよね! +(The SPEAKER nods happily)|Exactly!|Want one for yourself? +(SPEAKER は嬉しそうに頷く)|ええ、そうよね!|お一つどう? +(The SPEAKER wraps a long chain around you)|This should do the trick~|(RESTRAINT settles in place) +(SPEAKER が鎖をこちらの身体に巻き付け始めた)|これで安全なはず。|(RESTRAINT を装備させられた) +(The SPEAKER sighs)|Ah well. +(SPEAKER はため息をつく)|あっそ。 +(The SPEAKER frowns sadly)|But they make the best noise! +(SPEAKER は悲しそうにつぶやく)|でも音とかいいよ…… +(The SPEAKER rolls her eyes)|Tough luck then~|You're getting one! +(SPEAKER は目を見開いた)|それは残念だな~|でも一本あげるから試してみて! +(The SPEAKER grins)|See how you feel when|you're wearing one! +(SPEAKER はニヤリと笑った)|実際に……|着てみたらわかるよ! +(The SPEAKER sighs)|Maybe another time then. +(SPEAKER はため息をついた)|次は首を縦に振ってもらうよ。 +(The SPEAKER wraps a long chain around you)|(RESTRAINT hugs your body closely)|(You shiver as the cold metal touches you) +(SPEAKER が鎖をこちらの身体に巻き付け始めた)|(RESTRAINT が身体を締め上げてくる)|(鎖の冷たい感触に思わず震えてしまった) +(The SPEAKER grins as she binds your body)|(RESTRAINT digs into you a little)|Enjoy, cutie~ +(SPEAKER はニヤニヤしながら鎖で拘束してきた)|(RESTRAINT が身体を圧迫する)|それじゃあね~。 + + +I love chains! +鎖は好きだよ +Plenty beats it. +それより硬いものならいっぱいあるでしょ + + +Absolutely~ +もちろん + + +I-If I have to... +そ、そこまで言うなら…… +Ah! Cold! (PERCENT chance to avoid) +冷たい!(PERCENT の確率で拒否) + + + + +(The SPEAKER nervously walks up to you)|Excuse me miss...|Are you a fan of latex by chance? +(SPEAKER はびくびくしながらこちらに歩いてきた)|こ、こんにちは……|ひょっとしてラバーとか好きだったり……します? +(The SPEAKER blushes deeply)|Then would you like to try on this RESTRAINT? +(SPEAKER は赤面している)|RESTRAINT とか、試してみたりしませんか……? +(The SPEAKER smiles)|You look so good in that! +(SPEAKER はぱっと顔を輝かせる)|と、とっても似合っていますよ! +(The SPEAKER frowns)|Aww... +(SPEAKER は顔を曇らせた)|うぅ…… +(The SPEAKER blushes)|Okay... sorry I asked. +(SPEAKER は赤面して俯いてしまった)|ご、ごめんなさい…… +(The SPEAKER grins and reaches for a RESTRAINT)|Well, too bad-- +(SPEAKER は不意に悪意に満ちた笑みを浮かべ、RESTRAINT を手に取る)|そ……それは残念です…… +(The SPEAKER grins)|I wasn't offering you a choice...|I was asking if you would LIKE it, hehe~ +(SPEAKER の微笑は悪意を湛えている)|つけるかつけないかではなく……|これを気に入るかどうかを訊いていたんですよ、ふふふふ…… +(The SPEAKER frowns)|...You're fast! +(SPEAKER は顔をしかめた)|はやすぎます…… +(The SPEAKER smiles)|That's right~ +(SPEAKER は笑顔になった)|よかった~。 +(The SPEAKER restrains you and clicks a lock on)|There! Nice and tight! +(SPEAKER に拘束され、錠まで付けられてしまった)|とっても似合ってますよ、ふふふ。 + + +Why of course! +好きだよ + + +That sounds fun! +いいね +No, I don't want that! +着たくはないかな + + +Okay, fine... +わ、わかった…… +Wait, what? (PERCENT chance to avoid) +待って、何!?(PERCENT の確率で拒否) + + +(The SPEAKER steps up to you)|Hey girl~|You happen to be a fan of latex? +(SPEAKER が近寄ってきた)|ねえ、そこのキミ!|ラテックスは好き? +(The SPEAKER smiles)|Then would you like to try on this RESTRAINT? +(SPEAKER は笑みを浮かべている)|RESTRAINT を着てみない? +(The SPEAKER chuckles)|Tight and shiny! +(The SPEAKER はクスクスと笑っている)|似合ってるよ! +(The SPEAKER shrugs)|Alright. Sorry I asked. +(SPEAKER は肩をすくめている)|わかった、無駄な時間を取らせたね。 + + + + +(The SPEAKER walks up to you)|Say, would you be interested in some 'protection?' +(SPEAKER が歩み寄ってきた)|とってもいい「防具」があるんだけど、興味ないかな? +(The SPEAKER grins)|Wonderful! You see, I've just recently acquired one of these...|(She shows you a loose RESTRAINT)|I'm not too interested in wearing one myself,|but I thought you'd be a good fit for it? +(SPEAKER はニコニコしている)|食いついたね、最近こんな物を見つけたんだ……|(彼女は施錠のされていない RESTRAINT を見せてきた)|あたしはこういうのに興味ないんだけどさ、|あんたはこういうの好きじゃない? +(The SPEAKER blushes as she locks the belt around your waist)|I'm enjoying this more than I thought I would~ +(SPEAKER は興奮しながら貞操帯を取り付けてくれた)|思った以上にいいね~! +(The SPEAKER smiles)|Enjoy your freedom while it lasts~ +(SPEAKER は笑顔のままだ)|そう、今のうちに自由を謳歌しときな。 +(The SPEAKER shrugs)|That's okay, just thought I'd ask. +(SPEAKER は肩をすくめている)|そう、まあ訊いてみただけだし。 +(The SPEAKER rubs the smooth metal seductively)|Are you sure?|Adventurers need to take care of themselves.|You don't want to lose control of yourself and run into some curse,|do you? +(SPEAKER は貞操帯の金属部を指で艶かしくなぞっている)|本当にいいのか?|こいつがあれば一時の情欲に流されて取り返しのつかない事にならずに済むんだ。|冒険者なんだから、できる限りリスクは管理すべきじゃないか?|そうだろ? +(The SPEAKER gives an evil smile)|What if I wasn't asking? +(SPEAKER は悪辣な笑みを浮かべている)|拒否権があると思っているのか? +(The SPEAKER sighs)|I'll find some other cutie to wear it, I guess~ +(SPEAKER はため息を付いて去っていった)|他に着てくれそうな可愛い子を探すとするか……。 +(The SPEAKER blushes as she locks the RESTRAINT onto you)|There we go~ +(SPEAKER は興奮しながら RESTRAINT を取り付けてくれた)|それじゃあな~。 +(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Whoops! I guess I acted too soon.|Ah well~ +(踵を返すと SPEAKER が突然驚かせてきた)|(驚いている間に、腰辺りで鍵のかかる音がした)|おっと、手が滑っちゃったよ。|まあ、自分でなんとかしてくれ。 +(The lock on the RESTRAINT starts glowing...) +(RESTRAINT の錠前が輝き出した……) + + +Protection? Certainly! +どんな防具? +Nah, I'm good. +いや、遠慮しとく + + +I would love to wear it! +ええ、そういうの大好き! +(Nod again, excited) +(興奮しながら頷く) +...No thank you. +……やっぱりいらない +(Shake your head, puzzled) +(必死に顔を横にふる) + + +Fine. I need the protection anyway. +まあ、そういうのは欲しかったし +I refuse. (PERCENT chance to avoid) +いや!(PERCENT の確率で拒否) + + +(Look at your belt...) +(ベルトを見る) + + + + +(The SPEAKER nervously walks up to you)|Excuse me miss...|Can you help me out? +(SPEAKER はおずおずと歩み寄ってきた)|あの……ちょっとよろしいでしょうか?|助けてほしいのですが…… +(The SPEAKER blushes deeply)|I found this cursed RESTRAINT and I can't let go of it!|Could you... wear it for me? +(SPEAKER はひどく赤面している)|この RESTRAINT を見つけたのですが、抜け出せなくなってしまったのです!|なので代わりに付けていていただけませんか? +(The SPEAKER smiles)|Thank you so much, miss! +(SPEAKER は笑顔になった)|ありがとうございます! +(The SPEAKER frowns)|...That does seem rather far-fetched of me to ask. +(SPEAKER は残念そうにしている)|見ず知らずの人にこんなことを頼むなんて厚かましいですよね……。 +(The SPEAKER blushes)|Oh... okay. +(SPEAKER は赤面している)|わ、わかりました…… +(The SPEAKER frowns angrily)|Look, we all know how much you enjoy being restrained~|Do me a favor and wear the RESTRAINT, okay? +(SPEAKER は必死に哀願している)|ね、ねぇ、あなた拘束されるの好きなんですよね!?|どうしても RESTRAINT を付けてください、お願いします! +(The SPEAKER pleads with you)|...point taken. But still!|I'll end up stuck in it for a really long time... +(SPEAKER は懇願している)|ええ、そうです……でも!|ずっとこれを着けていなきゃいけないなんて嫌なんです……。 +(The SPEAKER sighs and wears it herself)|(The lock starts glowing brightly...) +(SPEAKER はため息を付き、再び貞操帯を付ける)|(すると貞操帯の錠前が輝き出した……) +(The SPEAKER looks relieved)|Thank you so much miss!|I won't forget you! +(SPEAKER は安堵の表情を浮かべている)|本当にありがとうございます!|この御恩は絶対に忘れません! +(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|I'm sorry miss! It was my only choice~ +(踵を返すと SPEAKER が突然驚かせてきた)|(驚いている間に、腰辺りで鍵のかかる音がした)|本当にごめんなさい!助かるにはこれしかなかったんです! + + +I would love to help! +ええ、助けてあげる +You're asking me to get cursed? +私に身代わりになれと? + + +That sounds like a tempting offer. +とてもそそるね +...What? Why would I need to wear it? +……え?なんで私がこれを着けなきゃいけないの? + + +Fine. I'll do it because you asked. +まあ、そこまで頼まれたら…… +I won't help you. Wear it yourself. (PERCENT chance to avoid) +悪いけど自分でなんとかして(PERCENT の確率で拒否) + + + + +(The SPEAKER walks up to you)|We don't get a lot of visitors.|I take it that you enjoy bondage? +(SPEAKER が歩み寄ってきた)|ここに客が来るなんて珍しいね。|縛られるのが好きなんだね? +(The SPEAKER tilts her head)|Well, I have a RESTRAINT lying around,|and I figured you'd enjoy it. +(SPEAKER は首を傾げ、こちらを見つめてくる)|RESTRAINT がいっぱい余っているんだけど、一つどうかな?|とっても似合うと思うよ? +(The SPEAKER smiles)|I'm glad you like it! +(SPEAKER は笑みを浮かべている)|喜んでもらえて何より! +(The SPEAKER frowns)|I guess I'll have to find someone else to wear it. +(SPEAKER は不満げに去っていった)|別の子にあたってみるか…… +(The SPEAKER looks disappointed)|Oh well. +(SPEAKER がっかりした様子で去っていった)|わかった。 +(The SPEAKER grins and reaches toward you!)|Well, I think it'd look great on you! +(SPEAKER はニッコリと笑い、突然掴みかかってきた!)|これ、似合うと思うんだけどなー! +(The SPEAKER grins)|You don't have a choice, dear~ +(SPEAKER は笑みを浮かべている)|キミに拒否権はないよ~? +(The SPEAKER frowns)|Darn it! Missed my chance. +(SPEAKER は悔しげにしている)|くそっ!チャンスを逃した。 +(The SPEAKER smiles)|Good, good~ +(SPEAKER は笑みを返す)|よしよし! + + + + + + + + +(The SPEAKER grins as she sees you)|Hey there sweetie~|I think you'd look good in some ropes! +(SPEAKER がこちらを見て、ニヤリと笑った)|ねえ、そこの可愛い子!|キミ、とっても縄が似合いそうだね~! +(The SPEAKER looks at your bound body)|I've got some more ropes for you, babe! +(SPEAKER はジロジロと縛られた身体を見つめてくる)|もっと縄を足してあげようか? +(The SPEAKER smiles)|Okay, hold still while I get you rigged up~ +(SPEAKER は笑顔になった)|おっけー、それじゃあじっとしててね。 +(The SPEAKER slaps your butt as she ties the last knot)|All trussed up~ +(SPEAKER は縛り終えると、お尻を一度叩いてきた)|完璧~! +(The SPEAKER looks disappointed and packs her rope away) +(SPEAKER は落胆した様子でロープを仕舞った) +(The SPEAKER frowns)|Aw. What a missed opportunity! +(SPEAKER はがっかりしている)|なんだ、残念。 +(The SPEAKER grins and reaches for her satchel)|Well, too bad-- +(SPEAKER はにやりと笑い、カバンに手を入れた)|なんだ、残念…… +(The SPEAKER grins)|But I've already brought so much rope with me~ +(SPEAKER はニヤニヤ笑っている)|でも、縄が余っててね~…… +(The SPEAKER frowns)|Suit yourself. +(SPEAKER は肩を落としている)|もう好きにして。 +(The SPEAKER smiles)|Good girl~ +(SPEAKER はにっこり笑った)|いい子だね~。 +(The SPEAKER takes you down and trusses you up tightly)|That'll teach you~ +(SPEAKER に押し倒され、ぐるぐる巻きにされてしまった)|良い勉強になったかな~? + + +I think so too! +私もそう思う +I don't think so. +そんなこと思ったこともないけど + + +(Wiggle in place happily) +(縄の感触に浸る) +Actually, I'm having second thoughts... +やっぱりやめておく +(Shake your head nervously) +(首を横に振る) + + +Fine. You win. +わかった、好きにして +Go away! (PERCENT chance to avoid) +いや、はなれて!(PERCENT の確率で拒否) + + + + +(The SPEAKER perks her ears as she sees you)|You've got a nice body.|I think it'll do better with some training! +(こちらを見て SPEAKER が耳を立てた)|良い身体してるね!|私達とトレーニングすればもっと良くなるよ! +(The SPEAKER grins and hands you a paper)|Nevermere Training is always looking for new recruits!|I'll just have you sign here... +(SPEAKER は笑顔で紙を差し出してきた)|ネバーミアトレーニングはいつでも新人さん募集中だよ!|ここにサインしてね…… +(The SPEAKER gets you suited up)|There you go! Now go be a good girl! +(SPEAKER はスーツを着せてきた)|これでよし、それじゃあいい子にしてね…… +(The SPEAKER scoffs)|That's what they all say. +(SPEAKER は不満そうにしている)|皆そう言うよ。 +(The SPEAKER frowns)|What a shame. +(SPEAKER は不機嫌そうにしている)|残念。 +(The SPEAKER grins and reaches for her baton)|No? Well, I heard you have some debts to pay~ +(SPEAKER はニヤリと笑うとバトンに手を伸ばした)|嫌?そう。ところであなた、うちにいくつか借りがあるんだってね~。 +(The SPEAKER grins)|I promise you it's a good deal~ +(SPEAKER は笑顔になる)|後悔はさせないよ~ +(The SPEAKER frowns)|Fine. I'll look for other candidates. +(SPEAKER は不機嫌そうに去っていった)|わかった、他の候補者を探すね。 +(The SPEAKER smiles)|That's right. Your name, please? +(SPEAKER は笑顔になる)|よし、それじゃああなたの名前は? +(The SPEAKER zaps you and places you in restrictive gear)|Hmph. Unruly girls need training! +(SPEAKER に打ち据えられ、拘束具を取り付けられてしまった)|うん、言うこと聞かない子には調教が必要だね! + + +This sounds like an interesting opportunity. +面白そうだね +No thanks, I know what that entails... +トレーニングじゃなくて調教でしょ…… + + +I'll sign it! +サインするよ +A contract? No way. +契約?やめておく +(Refuse the contract) +(サインしない) + + +Fine. I'll sign it... +わかった、サインする…… +Never! (PERCENT chance to avoid) +やめて!(PERCENT の確率で拒否) +(Shake your head and frown) (PERCENT chance to avoid) +(必死に首を横に振る)(PERCENT の確率で拒否) + + +(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... +(SPEAKER はこちらを見るなり小さくお辞儀をしてきた)|ごきげんよう。|あなたは十分な素質をお持ちのようですね。|共に来ていただければ良いポジションに就けることを約束しますよ…… +(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... +(SPEAKER は微笑み、咳払いをする)|素晴らしい!|ここにあなたの制服がありますので…… +(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. +(SPEAKER は制服をとてもきつく着せてくれた)|(制服に錠を掛ける音が聞こえた……)|すばらしい。では、まず最初の仕事です。このフロアを掃除しなさい。|幸運を。 +(The SPEAKER tilts her head and shrugs)|We are always prepared... +(SPEAKER は首を傾げ、肩をすくめる)|いつでも歓迎しますよ…… +(The SPEAKER nods)|Fair enough. +(SPEAKER は頷く)|わかりました。 +(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... +(SPEAKER はいやらしく笑い、制服を取り出す)|ところであなた、各所で敵を作っているみたいですね。|我々まで敵に回してしまって良いのでしょうか……? +(The SPEAKER nods proudly)|We are willing to made some changes to our records~ +(SPEAKER は誇らしげに頷く)|あなたに関する記録を少し書き換えましょうか。 +(The SPEAKER frowns)|You won't know what hit you. +(SPEAKER は残念そうにしている)|夜道には気をつけなさい。 +(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. +(SPEAKER は笑顔になる)|わかっていただけて何よりです。|では、まず最初の仕事です。このフロアを掃除しなさい。|幸運を。 +(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... +(突然 SPEAKER が距離を詰めてきた)|(反応する前に足を取られ、組み伏せられてしまう)|(彼女に無理やり制服を着せられ、きつくロックされてしまった……)|追加でトレーニングが必要みたいですね…… + + +Gladly! +喜んで +W-where did you get that uniform? (Refuse) +こんな制服を着ろと?(抵抗する) + + + + + + + + + + + + +(The SPEAKER perks her ears as she sees you)|Glory to the blessed kitty!|Are you prepared to join us? +(SPEAKER はこちらを見て耳を立てた)|祝福された猫に栄光あれ!|お前も参加するか? +(The SPEAKER nods happily)|Fantastic! You just need to agree to be nice to cats.|And also we own you now. +(SPEAKER は嬉しそうに頷く)|素晴らしい!お前は猫に優しくするとだけ誓えばいい。|そうすればお前は我々のものだ。 +(The SPEAKER jumps happily)|Wonderful! Here's your collar! +(SPEAKER は嬉しさに飛び跳ねている)|よし!これがお前の首輪だ! +(The SPEAKER whimpers and looks at you)|How mean! +(SPEAKER は泣いてしまった)|いじわる…… +(The SPEAKER's ears flop)|Aww... we thought you were cute. +(SPEAKER の耳は力なく垂れている)|お前は可愛いから欲しかったよ…… +(The SPEAKER frowns)|Oh? Well, I guess I'll tell the others~ +(SPEAKER は不機嫌そうにしている)|そう?それじゃあこのことを言いふらしてくるか。 +(The SPEAKER grins slyly)|You wouldn't hurt the kitties, would you? +(SPEAKER は狡い笑みを浮かべている)|お前は子猫を傷つける悪い人間じゃないよな? +(The SPEAKER frowns)|Then we'll have to make sure you don't come to harm anyone! +(SPEAKER は不機嫌そうにしている)|それならお前が誰も傷つけられないようにしてやる! +(The SPEAKER smiles proudly)|I knew you would pull through! +(SPEAKER は胸を張っている)|お前ならそう言ってくれると信じてたぞ! + + +Yes! I love the blessed kity! +うん、猫大好き +No, you guys are a bunch of weirdos. +変人の集まりに興味はないかな + + +Yes! I will be nice to the kitties! +猫に優しくするよ +(Join them) +(誓う) +Wait, I didn't agree to that! (Refuse) +誓えないわ(抵抗する) +(Refuse) +(抵抗する) + + +Okay fine... I won't hurt the kitties. (Join them) +わかった……私は猫に優しくする + + + + + + +(The SPEAKER does a curtsy)|Why hello there!|You have a wonderful bod-er, book!|Would you like to help me? +(SPEAKER は丁寧にお辞儀をしてきた)|ごきげんよう!|とっても……良いスタイルですわね!|少し助けていただけます? +(The SPEAKER smiles briefly)|You have an opportunity to model for me!|I need someone to wear all of my wonderful inventions! +(SPEAKER は短く笑う)|あなたには試着モデルになっていただきたいのです。|最新のお洋服を着られますわよ! +(The SPEAKER laces you up in the tight fabric...)|(You hear the click of a few locks going on...)|Oh my goodness... So pretty!|You'll make a fine assistant! +(SPEAKER は服をきつく着せてくる……)|(背中で錠の掛かる音が聞こえた……)|まぁ、なんて可愛らしい!|あなたは良いアシスタントになりますわ! +(The SPEAKER frowns)|Aw... +(SPEAKER は顔をしかめた)|そう…… +(The SPEAKER clenches her fist to the ceiling)|Nooooo!!! +(SPEAKER は仰天した)|そんなーーーー!? +(The SPEAKER grins and pulls out a frilly dress)|Don't knock it till you try it!|Trust me, it'll be fun! +(SPEAKER はにやりと笑い、フリルのたくさん付いたドレスを取り出した)|まずは一度試してくださいまし!|絶対後悔はさせませんから! +(The SPEAKER furrows her brow)|Watch your tongue there, little lady.|Or I'll have to plug it for you... +(SPEAKER は眉をひそめる)|言葉には気をつけてくださいまし?|さもなくば無理矢理にでも着ていただきますわよ…… +(The SPEAKER folds her arms as ribbons rise up around her)|Suit yourself, hehe~ +(SPEAKER が手を掲げると、リボンが彼女の周囲を渦巻く)|お好きにどうぞ~! +(The SPEAKER smiles)|Yes! Yes! Wonderful! +(SPEAKER は笑顔になった)|やった!やった!ありがとうございます! + + +Sign me up! +わかった +(Accept the position) +(受け入れる) +And wear tacky clothes all the time? +ずっとそんなダサい服を着なきゃいけないの? +(Refuse the position) +(抵抗する) + + +Fine... sign me up. +わかった…… +Why don't you try it on yourself! (PERCENT chance to avoid) +自分で試しなさいよ!(PERCENT の確率で拒否) + + + + + + + + +(The SPEAKER runs up to you)|Wow! You make a fine specimen-er, I mean...|Nice to meet you! +(SPEAKER が走ってきた)|おお!絶好のモル……被験者になれる人材が来た!|あえて嬉しいよ! +(The SPEAKER smiles)|Now, I have something wonderful in store for you.|(She takes out a blue catsuit)|I'd like you to be my assistant! +(SPEAKER は笑顔を向ける)|キミに渡したいものがあるんだ。|(彼女は青いキャットスーツを取り出した)|私のアシスタントになってくれないか? +(The SPEAKER looks excited)|Awesome! Let me help you get in uniform... +(SPEAKER は喜んでいる)|素晴らしい!着るのを手伝ってあげよう…… +(The SPEAKER shrugs)|It was worth a shot... +(SPEAKER は肩をすくめる)|やる価値はあると思うぞ…… +(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|There's just... a lot to do.|That's why I need an assistant. +(SPEAKER は悔しがっている)|私は……私の実験は狂ってなんかいない!|ただちょっと……目標が高いだけだ!|だから優秀なアシスタントが必要なんだ! +(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|We seek only knowledge! +(SPEAKER は悔しがっている)|私は……私の実験は狂ってなんかいない!|我々の目標は知識の探求だろう! +(The SPEAKER frowns)|Time for a test run! +(SPEAKER は眉をひそめた)|実験の時間だ! +(The SPEAKER looks happy again)|Thank you! I'm super grateful! +(SPEAKER は再び幸せそうな顔をした)|ありがとう!感謝するよ! +(The SPEAKER tilts her head)|Fine then. You win.|(As you leave, you hear a 'just kidding' as she breaks a glass vial)|(A suit of blue latex envelops you!) +(SPEAKER は小さく首を傾げた)|わかった、諦めよう。|(立ち去ろうとすると、背中から”冗談だ”という声と共に瓶の割れる音が聞こえてきた)|(突如身体を青いゴムが包み込んだ!) + + +...Hello? +えっと? +You guys are crazy. +狂ってるわね + + +(Accept the offer) +(受け入れる) +(Refuse the offer) +(抵抗する) + + +Fine. I'll be your assistant. +わかった、アシスタントになる +Go find someone else. (PERCENT chance to avoid) +悪いけど他をあたって!(PERCENT の確率で拒否) + + + + + + + + +(The SPEAKER greets you)|Normally we don't meddle in mortal affairs.|But you, Outsider, are different.|Let's have a conversation. +(SPEAKER が挨拶をしてきた)|通常、私達は定命の者とは関わらないのですが、|外から来たお方、あなたは特別な運命をお持ちのようですね。|少しお話しましょう。 +(The SPEAKER smiles warmly)|Outsiders have a lower rank in our society.|But it is a rank all the same.|You will be above your mortal peers.|What do you say? +(SPEAKER は温かく微笑みかけてくる)|我々の社会では、外から来た方々は賤しい身分と位置づけられます。|人は皆等しく賤しい身分なのです。|ですが、共に来れば彼女らよりは上の存在として扱うことを約束します。|どうしますか? +(The SPEAKER clasps some 'jewelry' around your limbs)|You look beautiful, my dear.|I will leave you to your own affairs until we meet again. +(SPEAKER は身体に”アクセサリー”を取り付けてきた)|とても綺麗ですよ。|また会いましょう。それまで自分のことは自分でできますよね。 +(The SPEAKER turns her head away)|Hmph. I offer you a bargain and you refuse. +(SPEAKER は顔を背ける)|うーん、どうして断られてしまったのでしょう? +(The SPEAKER turns her head away)|Hmph. As expected. +(SPEAKER は顔を背ける)|うーん、予想通りですね。 +(The SPEAKER folds her arms)|If you are not with us, then you are against us.|You shall face the wrath of the wild. +(SPEAKER は腕を上げる)|私達に従わないなら、あなたは敵です。|自然の怒りを思い知ることになるでしょう。 +(The SPEAKER frowns)|Hardly slavery!|A mere slave would not be allowed to even set foot in our society. +(SPEAKER は顔をしかめている)|奴隷ではありませんよ。|奴隷は私達の社会に足を踏み入れることさえできませんから。 +(The SPEAKER frowns)|We will meet again. +(SPEAKER は眉をひそめ、去っていった)|また会うことになるでしょう。 +(The SPEAKER nods and smiles)|(She decorates your body with 'jewelry')|I am glad you had a change of heart. +(SPEAKER は笑顔で頷く)|(身体に”アクセサリー”を取り付けられた)|考えを変えてくださりとても嬉しく思います。 +(The SPEAKER scoffs)|(Her magic suddenly binds you tightly in glowing ropes)|Amateur. +(SPEAKER は嘲笑した)|(彼女が魔法を唱えると、輝く縄で縛られてしまった)|雑魚ですわね。 + + +I'm interested. (Talk with her) +わかった(話す) + + +I accept your gracious offer! +謹んでお受けいたします +(Accept) +(受け入れる) +I won't be a slave to you. +奴隷にはならないわ + + +Fine, fine... I will accept. +わかった、わかった……受け入れます +No way. (PERCENT chance to avoid) +嫌!(PERCENT の確率で拒否) + + + + + + +(The SPEAKER smiles at you)|Mortal. +(SPEAKER は笑顔で話しかけてきた)|定命の者。 +(The SPEAKER points to the ground)|Kneel before me and accept your collar. +(SPEAKER は地面を指差す)|跪いて首輪を受け入れなさい。 +(The SPEAKER snaps her fingers)|(A collar of cold black metal materializes around your neck)|A girl who knows her place! Wonderful... +(SPEAKER は指を鳴らす)|(冷たく黒い金属の首輪が突然首に現れた)|自分の立場をわかっているのね、素晴らしいわ。 +(The SPEAKER scoffs)|Hmmph. Mortals... +(SPEAKER は嘲笑混じりにため息をつく)|はぁ、所詮定命の者…… +(The SPEAKER folds her arms)|Well, look who doesn't know her place~ +(SPEAKER は腕を上げた)|そう、なら自分の立場を分からせてあげるわ。 +(The SPEAKER folds her arms)|I didn't offer you a choice in the matter.|You're mine, I've decided that. +(SPEAKER は腕を上げた)|あなたに選択肢はないの。|あなたは私のもの。これは決定事項よ。 +(The SPEAKER's eyes begin to glow)|Looks like we'll do this the fun way! +(SPEAKER の目が妖しく光り始める)|ならばこちらのやり方で従わせましょう。 +(The SPEAKER smiles)|Wonderful~|Now come along, my pet! +(SPEAKER は笑顔を向けてきた)|素晴らしい。|さあ、こっちへいらっしゃい。私の可愛いペット。 +(The SPEAKER scoffs and snaps her fingers)|(Metallic restraints come at you from all angles and snap in place tightly)|(A gag forces itself into your mouth)|Now then, what were we saying? +(SPEAKER は嘲笑し、指をパチンと鳴らす)|(金属でできた拘束具が周囲を取り囲み、一斉に向かってきた)|(猿轡が口の中に入ってくる)|さて、何の話をしていたのだったかしら? + + +Yes? +うん? +I don't talk to monsters! +モンスターとは話さないようにしてるの + + +O-okay. (Kneel) +わ、わかった(跪く) +(Kneel) +(跪く) +I refuse! +嫌よ! + + +Then it looks like I have no choice. (Join her) +選択肢はないみたいね(受け入れる) +I will never bow to you! (PERCENT chance to avoid) +あなたになんか膝はつかない(PERCENT の確率で拒否) + + + + + + +(The SPEAKER waves)|You seem like an exceptional individual.|What do you think of joining the Guild? +(SPEAKER が手を振ってきた)|アンタ、中々やるようだね。|私達のギルドに入らないかい? +(The SPEAKER smiles)|Excellent! I'll put in a word with the Guild.|Do note: this will affect your reputation with certain bad actors. +(SPEAKER は笑顔を返してきた)|素晴らしい!早速報告しよう!|(注意:いくつかの勢力との関係性が悪化する) +(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. +(SPEAKER の取り出したスクロールにサインをする)|(スクロールはエーテルの海に消えていった)|これから宜しく頼むよ、フリーランサー。 +(The SPEAKER nods)|Fair enough. Guild work is not for everyone. +(SPEAKER は残念そうに頷いた)|そうか、アンタはギルドに向いていなかったようだな。 +(The SPEAKER nods)|Very well, then I won't bother you. +(SPEAKER は頷き、去っていった)|そうか、邪魔したな。 +(The SPEAKER looks dubious)|You know, there's quite a bounty on your head.|I'm sure we could do something about it. +(SPEAKER が側で囁く)|アンタに多額の賞金がかけられているのは知っているだろう?|参加すればどうにかなるかもしれないぞ……? +(The SPEAKER tilts her head)|Haha, very funny.|We both know that you're not one of those... right? +(SPEAKER は小首をかしげる)|はは、面白い。|アンタは悪人なんかじゃない……そうだろう? +(The SPEAKER frowns and readies for battle)|My instincts were right. +(SPEAKER は戦闘態勢を取った)|私の直感は正しかったようだな! +(The SPEAKER suddenly strikes you to the floor)|(You feel a foot on your back as she ties you in a strict rope hogtie...)|(She dusts off her hands)|We'll have a talk when you get out of that, okay? +(突然 SPEAKER に床に押し倒された)|(素早く手足を縛られ、背中で繋がれてしまった……)|(彼女は手についたホコリを払っている)|解き終わったらもう一度話し合おうか? + + +I have no interest in joining the guild. +組織とかには興味ないかな + + +What if I am one of those bad actors? (Refuse) +私が悪人だったら?(拒否する) + + +Fine... (Join) +わかった……(参加) +Go away. (PERCENT chance to avoid) +失せなさい!(PERCENT の確率で拒否) +(Frown at her) (PERCENT chance to avoid) +(睨みつける)(PERCENT の確率で拒否) + + + + + + + + +(The SPEAKER beeps)|Prisoner 74121 identified.|Subject not registered in database. +(SPEAKER は機械音をたてている)|囚人番号74121確認。|対象者ハデータベースニアリマセン。 +(The SPEAKER beeps)|Confirming database entry.|Say 'I will be a good girl' to enter database. +(SPEAKER は機械音をたてている)|データベース登録ヲ開始シマス。|開始ニハ「私はいい子にします」ト言ッテクダサイ。 +(The SPEAKER beeps and applies tracking gear)|(The metallic cables click into place with a soft beep)|Prisoner 74121 registered. Good girl. +(SPEAKER は機械音をたて、追跡装置を取り付けてきた)|(金属製のケーブルが身体に取り付き、かすかに音を立てている)|囚人番号74121登録完了。 +(The SPEAKER beeps)|Acknowledged. Be warned:|Lost contact with Sections 98, 97, 96, 95...|(The list goes on...) +(SPEAKER は機械音をたてている)|承知シマシタ。警告:|途絶セクションアリ、98、97、96、95……(リストは続いていく……) +(The SPEAKER beeps)|Acknowledged. Updating records. +(SPEAKER は機械音をたてている)|承知シマシタ、アップデート中…… +(The SPEAKER beeps and flashes its lights)|Target acquired. +(SPEAKER は機械音を立て、ライトを点滅させる)|ターゲット確認。 +(The SPEAKER beeps and flashes its lights)|Target has complied. Supplying uniform. +(SPEAKER は機械音を立て、ライトを点滅させる)|ターゲット承認、装備ヲ提供中。 +(The SPEAKER beeps and flashes its lights)|Engaging capture protocol. +(SPEAKER は機械音を立て、ライトを点滅させる)|捕獲プログラム起動。 +(The SPEAKER beeps and flashes its lights)| +(SPEAKER は機械音を立て、ライトを点滅させる)|囚人番号74121登録完了。 +(The SPEAKER blasts you with a stunning ray and captures you)|Target neutralized. +(SPEAKER にブラスターで撃たれ、気がつくと捕まっていた)|ターゲット制圧。 + + +Please register me. +登録して +(Stop to talk to the robot) +(ロボットの会話を止める) +Prisoner 74121? You must be mistaken... +囚人番号74121?それは間違ってるよ…… +(Avoid the robot) +(ロボットから逃げる) + + +Prisoner 74121 reporting. I will be a good girl. +囚人番号74121が宣言します、"私はいい子にします" +Actually, I am an administrator. (Refuse) +私は管理者だよ(抵抗する) + + +I'm sorry, I will be a good girl! +わかった、"私はいい子にします" +What? (PERCENT chance to avoid) +何!?(PERCENT の確率で拒否) + + + + + + +(The SPEAKER smiles)|I used to be an adventurer like you.|Then I joined up with the Dragonhearts! +(SPEAKER は笑顔を向けてきた)|ちょうどキミのような冒険者を探していたんだ。|ドラゴンハートとして共に戦ってくれる仲間を! +(The SPEAKER clears her throat)|Well, we're actually recruiting!|You're free to join us if you agree to fight for justice! +(SPEAKER は軽く咳払いをする)|ああ、私達は新人を募集しているんだ。|正義のために戦う意志があるなら、いつでも大歓迎だ! +(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! +(SPEAKER と固い握手を交わした)|ようこそドラゴンハートへ! +(The SPEAKER tilts her head and shrugs)|Ah well. +(SPEAKER は首を傾げ、肩をすくめている)|あっそ。 +(The SPEAKER frowns)|What is it?|You're not an enemy of justice, are you? +(SPEAKER は眉をひそめた)|なんだと?|キミは正義の味方だろう? +(The SPEAKER frowns)|...If you won't fight for justice, that makes you an enemy of justice. +(SPEAKER は眉をひそめている)|正義の為に戦わないなら、キミも悪だ。 +(The SPEAKER frowns and cracks her knuckles)|Looks like my suspicions were right!|Looks like you and I are going to have a little chat... +(SPEAKER は険しい表情を見せ、拳を鳴らす)|私の疑念は正しかったようだ!|ちょっと別の話をしようか…… +(The SPEAKER giggles)|Hehe, just messin' with ya.|Anyway, welcome to the sisterhood! +(SPEAKER は笑みを浮かべる)|なに、ちょっと試しただけだ。|ようこそドラゴンハートへ! +(The SPEAKER grabs you and ties you up)|You won't be making trouble like that any time soon. +(SPEAKER に掴まれ、瞬く間に縛り上げられてしまった)|これでしばらくはトラブルを起こさないだろう。 + + +I wish I could join you. +入ってみたい +Please go away. +結構よ +(Back away) +(後退りする) + + +Great! Sign me up! +光栄に思う。サインするわ +(Join) +(参加する) +Fight for justice? Sounds restrictive... +正義のために?堅苦しいわね + + +Actually, justice doesn't sound bad! +よく考えたら正義も悪くないかも…… +What are you going to do about it? (PERCENT chance to avoid) +何をするつもり!?(PERCENT の確率で拒否) + + + + +(The SPEAKER waves and calls you over)|Looks like you've made a name for yourself.|What do you say to a little agreement? +(突然 SPEAKER が手を振り、呼び止めてきた)|これはこれは、最近色々なところでやらかしてるみたいだね!|少し話し合わないかい? +(The SPEAKER clears her throat)|Well, you're currently on our turf.|But we're willing to cut you some slack.|You just have to agree not to attack any of us. +(SPEAKER は咳払いをする)|アンタは今私達の縄張りに侵入しているわけだけど。|条件さえ飲んでくれれば私達も見逃してやろうと思う。|私達に危害を加えないと約束してほしいんだ。 +(The SPEAKER frowns)|Criminals? Girl, we ARE the law around these parts~ +(SPEAKER は眉をひそめる)|犯罪者?ここでは私達が法律だぞ? +(The SPEAKER grins)|I like your spunk, girl.|But you're kidding, right? +(SPEAKER はニヤリと笑った)|その気迫は買うよ。|でも冗談はそこらへんでいいだろう? +(The SPEAKER raises her fists and smiles)|You're on! +(SPEAKER は笑顔で拳を上げた)|やっちまえ! +(The SPEAKER chuckles)|Here's a toast to a new partnership! +(SPEAKER は苦笑いしている)|新しい仲間に乾杯! +(The SPEAKER catches you and trusses you up)|Maybe we'll just have to find you an owner, then!|Hehe. +(SPEAKER に捕まり、ぐるぐる巻きにされた)|それじゃあアンタの新しいご主人さまでも探しに行くか。|へへへ。 + + +I'm all ears. +何? +(Listen closely) +(耳を澄ます) +I don't deal with criminals. +犯罪者とは取引しない + + +It's a deal! +交渉成立ね +(Mumble in agreement) +(同意する) +You don't understand. This is MY turf. +ここは私の縄張りよ +(Scoff at her through your gag) +(猿轡越しにあざ笑う) + + +Haha, just kidding. I'm with you. +冗談よ、手を組みましょう +Put 'em up! (PERCENT chance to avoid) +やめなさい!(PERCENT の確率で拒否) + + + + + + + + + + +(The SPEAKER stops walking and speaks)|You there!|It seems your attunement with magic is high.|Join us. +(SPEAKER は歩みを止め、こちらに話しかけてきた)|そこのあなた!|気付いていないかもしれないけど、あなたの魔法への同調力は目を見張る物がある!|我々と一緒に来てほしい! +(The SPEAKER nods calmly)|We will use some special equipment to increase your attunement.|Put these on. +(SPEAKER は頷き、落ち着いた)|私達は同調力を高めるために特別な装備を使っているんだ。|これを付けてみてくれ。 +(The 'equipment' locks in place)|Excellent. Soon you will be much more powerful. +(その"装備"を付けてみた)|素晴らしい!すぐに効力が現れるぞ! +(The SPEAKER stops talking and walks away.) +(SPEAKER は話を止め、去っていった) +(The SPEAKER walks away like nothing happened.) +(SPEAKER は何もなかったかのように去っていった) +(The SPEAKER frowns slightly)|We are prepared to use force if need be... +(SPEAKER はわずかに眉をひそめた)|ならば力に頼るまで…… +(The SPEAKER stares at you)|Why? Did you not say you wanted to join us? +(SPEAKER が見つめてきた)|どうして素直に参加したいと言わないんだ? +(The SPEAKER frowns)|We have failed to convince the human. +(SPEAKER は眉をひそめる)|やはり人間はだめだな。 +(The SPEAKER nods.)|You have made a wise decision. +(SPEAKER は頷いた)|賢明な判断だ。 +(The SPEAKER uses magic to force you.)|There. Try not to succumb to your desires too much. +(SPEAKER は魔法を使い実力行使に出た)|よし、力に溺れないようにな。 + + +Um... sure? +えっと、そうなの? +Get away from me! +近寄らないで! + + +Shiny... (Put them on) +綺麗だね……(装備する) +(Let her put them on you) +(付けてもらう) +What? No way! (Refuse) +やめなさい!(抵抗する) + + +Okay, I will wear them... +わかった、付けてみる…… +Monster! (PERCENT chance to avoid) +この化け物!(PERCENT の確率で拒否) + + + + +(The SPEAKER does a short bow as she sees you)|Um... hi!|I have a letter for you... +(SPEAKER はこちらを見て小さくお辞儀をした)|ど、どうも……|えっと、あなたにお手紙が…… +(The letter is a contract from the College)|(They want you to sign up as an instructor for apprentices)|(The SPEAKER looks at you nervously.) +(手紙は魔法学校からだった)|(手紙は眼の前の少女のインストラクターになってほしいという内容だった)|(SPEAKER はおどおどとこちらを見つめている) +(The SPEAKER sighs in relief)|That's good...|(You sign the contract and it vanishes into the aether) +(SPEAKER は安堵のため息をついた)|よかった……|(契約書にサインをすると、それはエーテルの海に消えていった) +(The SPEAKER whimpers)|What will I tell them... +(SPEAKER は小さく鳴いた)|どう説明しよう…… +(The SPEAKER glares at you)|It's an important message concerning your standing!|With the College! +(SPEAKER はキッと睨みつけてきた)|あなたの地位に関する大事なことなんです……!|魔法学校での! +(The SPEAKER blushes)|Well...|I was told we would make changes to your academic record,|should you refuse... +(SPEAKER は赤面している)|わかりました……|断るなら……|あなたの卒業に関わると聞きました…… +(The SPEAKER frowns)|They told me to make sure you sign...|by any means necessary! +(SPEAKER は眉をひそめる)|必ずサインをするように言われたんです……|どんな手段を使っても! +(The SPEAKER nods and smiles)|Thank you so much!|I don't know what I would have done if you said no... +(SPEAKER は笑顔でうなずいた)|ありがとうございます!|断られたらどうしようかと…… +(The SPEAKER frowns and waves her wand)|(A bunch of ropes come out of the ground and restrain you)|Hmmph. I'll tell them you signed it anyway.|I can't go back empty handed. +(SPEAKER は眉をひそめ、杖を振った)|(地面から縄が現れ、あっという間に縛られてしまった)|ふぅ、サインするまで帰ってくるなと言われているんです……|手ぶらじゃ帰れないんです…… + + +Thank you for delivering it. (Read it) +配達ご苦労さま(手紙を読む) +(Read the letter) +(手紙を読む) +There's nothing good inside that letter. +手紙なんて大体ろくなことが書かれていない + + +Great! Wonderful! +いいじゃない! +There is no way I'd accept. +悪いけど教えるなんてできない + + +Fine. I'll read it. (Join the College as an instructor) +わかった、これからよろしくね(魔法学校のインストラクターになる) +This is unethical! I refuse! (PERCENT chance to avoid) +そんなことに同意できるわけない!(PERCENT の確率で拒否) + + + + + + + + + + + + + + +(The SPEAKER waves)|Greetings,|I manufacture all sorts of weapons.|Would you like to buy some? +(SPEAKER は手を振っている)|やぁ。|私はいろんな武器を取り扱っているんだ。|何か買っていくかい? +(The SPEAKER drops her hammer and cracks her knuckles)|Put em up! +(SPEAKER はハンマーを置き、指を鳴らしだした)|やる気か!? +(The SPEAKER looks at you.)|But you already have one? +(SPEAKER が見つめてきた)|もう持っているようだけど。 +(The SPEAKER folds her arms)|I don't do charity, ma'am. +(SPEAKER は腕を組んだ)|お金が足りないよ、私も慈善でやってるわけじゃあないんだ。 +(The SPEAKER smirks)|Another adventurer found this lying around.|I wonder who it's for~ +(SPEAKER はニヤニヤと笑っている)|これは別の冒険者が見つけたものなんだ。|一体誰が何のために置いているんだろうね? +(The SPEAKER smiles)|Now don't be up to no good~|Or else I'll have to put you in cuffs... +(SPEAKER は笑顔になった)|悪いことはしたらだめだぞ。|さもなくばお前に手錠をはめることになるから…… +(The SPEAKER nods)|A versatile weapon. One of my favorites. +(SPEAKER は頷いた)|様々な使い道のある武器だ。私のお気に入りでもある。 +(The SPEAKER nods)|Keep your friends close, and your enemies far away. +(SPEAKER は頷いた)|味方を近くに、敵を遠くに。 +(The SPEAKER nods)|Handy to have one of these around. +(SPEAKER は頷いた)|一本持っていると何かと便利だな。 +(The SPEAKER nods)|The best defense is a good offense. +(SPEAKER は頷いた)|攻撃は最大の防御なり、だ。 +(The SPEAKER nods)|Speak softly and carry a big hammer. +(SPEAKER は頷いた)|交渉事に便利だ。 +(The SPEAKER smiles)|Can never be too prepared~ +(SPEAKER は笑顔を浮かべている)|備えあれば憂いなし、だな。 + + +(The SPEAKER waves)|Hi.|I make armor. Only the finest.|I don't sell it cheap, unlike my twin. +(SPEAKER は手を振っている)|やぁ。|最高の防具を買っていかないかい?|姉と違って安売りはしないけどね! +(The SPEAKER looks at you.)|Do you have a dealer's license? +(SPEAKER が見つめてきた)|もう持っているようだけど、商人にでもなるつもりか? +(The SPEAKER folds her arms)|I don't do charity, girl. +(SPEAKER は腕を組んだ)|お金が足りないよ、私も慈善でやってるわけじゃあないんだ。 +(The SPEAKER nods)|The most high-impact of sports bras. +(SPEAKER は頷いている)|一番硬いスポーツブラだ。 +(The SPEAKER nods)|These aren't for hiking, just so you know. +(SPEAKER は頷いている)|わかっているだろうけど、これはハイキング用じゃないよ。 +(The SPEAKER nods)|I've been thinking about making a lockable version... +(SPEAKER は頷いている)|これのロックできるバージョンを考えているんだ…… +(The SPEAKER nods)|These are sensibly sized, unlike those you see in movies. +(SPEAKER は頷いている)|映画で見るのとは違って、現実的なサイズだろう。 +(The SPEAKER nods)|Sometimes you just have to be flexible. +(SPEAKER は頷いている)|時には鎖帷子の柔軟性が必要なときもある。 +(The SPEAKER nods)|For when you value style over protection... +(SPEAKER は頷いている)|見た目重視だ。 +(The SPEAKER nods)|You can never be too careful. +(SPEAKER は頷いている)|用心するに越したことはない。 +(The SPEAKER chuckles)|I hear female adventurers like to wear these for protection.|Or something like that. +(SPEAKER は苦笑いしている)|身を守るために必要なものだね。|まあそんな感じ。 + + +(The SPEAKER waves)|Hello miss!|What brings you here today? +(SPEAKER は手を振っている)|ごきげんよう。|私は色々な遠距離武器を取り扱っております。|何か買っていきますか? +(The SPEAKER folds her arms)|That's not very nice! +(SPEAKER は腕を組んだ)|やめなさい! +(The SPEAKER looks at you and smiles.)|Don't you already have one? +(SPEAKER は苦笑いを浮かべている)|もう持っているのでは? +(The SPEAKER folds her arms)|I don't do charity, miss. +(SPEAKER は腕を組んだ)|お金が足りませんよ。 +(The SPEAKER nods)|Could use a higher heel... +(SPEAKER は頷いている)|もう少しヒールが高くても良さそうですね…… +(The SPEAKER nods)|Back to the basics. +(SPEAKER は頷いている)|基本ですね。 +(The SPEAKER smiles)|I see you have good taste! +(SPEAKER は笑顔を浮かべている)|良いセンスですね! +(The SPEAKER nods)|It's a classic!|What's not to like? +(SPEAKER は頷いている)|基本武器ですね!|気に入ると思いますよ! +(The SPEAKER smiles)|It's an upgrade for your best friend! +(SPEAKER は笑顔を浮かべている)|強化された弓です! +(The SPEAKER shrugs)|It's big and bulky, but I guess it has its uses. +(SPEAKER は肩を透かしている)|大きくてかさばりますが、役には立つでしょう。 +(The SPEAKER giggles)|Smile for the camera! +(SPEAKER は薄ら笑みを浮かべている)|はいチーズってね。 +(The SPEAKER nods)|It's like mana, but much more portable!|It powers duplication runes so you don't run out of arrows. +(SPEAKER は頷いている)|マナのようなものですが、持ち運びできるエネルギー源です。|エネルギーがある限り矢を複製できるので、弓を扱うなら必須ですね。 +(The SPEAKER giggles)|I like to include these as a gift with every purchase~ +(SPEAKER は薄ら笑みを浮かべている)|商品を購入されたお客様にこれをプレゼントするのが好きなんです。 + + +(The SPEAKER whispers in a hushed tone)|Welcome.|I'm not supposed to be here, so|if you don't want to do business, get out.|I only sell in packs of 10, by the way. +(SPEAKER がささやきかけてきた)|いらっしゃい。|私は招かれざる客なんだ、ここにいちゃいけねえ。|だから買うならさっさと買ってくれ。|ちなみに商品は全部"10個入り"だ。 +(The SPEAKER tries to get away)|Damn! +(SPEAKER は逃げ出した)|クソッ! +(The SPEAKER looks you over and shrugs)|Don't joke around. +(SPEAKER は肩をすくめている)|冗談はよしてくれ。 +(The SPEAKER folds her arms)|Don't have money? Better go find some. +(SPEAKER は不満げに腕を組んでいる)|金がない?じゃあ稼いでこいよ。 +(The SPEAKER produces a bag of stuffings)|Quite the staple. +(SPEAKER は袋詰めの詰め物を取り出した)|定番だな。 +(The SPEAKER produces a bundle of rope)|Aren't you quite the artist.|That was rhetorical. +(SPEAKER 縄の束を取り出した)|縄師か。|技巧派だな。 +(The SPEAKER produces some bondage tape)|It only sticks to itself, doesn't leave residue.|Gotta be responsible, you know? +(SPEAKER テープを取り出した)|テープ同士でしかくっつかないやつだ。|痕も責任も残らない。。 +(The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally... +(SPEAKER 布の入った袋を取り出した)|どれも好みの問題だな。|いや、文字通りの意味じゃなくて…… +(The SPEAKER produces a bag of cloth strips)|How tight you tie it depends on how bratty your target is. +(SPEAKER 布の入った袋を取り出した)|相手が暴れれば暴れるほど拘束もきつくする必要があるからな。 + + + + +(The SPEAKER rattles as she waves)|Heya!|Looking to buy some ancient treasures?|My antiques shop has just what you need! +(SPEAKER はカラカラと手を降っている)|ねえ!|お宝に興味はないかい?|アタシは骨董品を扱っているんだけど、いいものが揃っているよ! +(The SPEAKER cracks her exposed knuckles)|So you've seen through my disguise... +(SPEAKER は指を鳴らしている)|変装を見破るなんて、やるじゃないか…… +(The SPEAKER looks at you.)|Yours is just fine, dear. +(SPEAKER は訝しげにこちらを見つめてくる)|既にいいものを持っているじゃないか。 +(The SPEAKER chuckles)|You don't have enough gold for that, dear.|Try coming back after a good round of looting! +(SPEAKER は苦笑いしている)|お金が足らないぜ、お嬢さん。|もっとお宝探しに励みなよ! +(The SPEAKER nods)|My great grandmother used to wear these. +(SPEAKER は頷いている)|私の曾祖母の愛用品でね。 +(The SPEAKER nods)|Adventurers used to love a good burlap sack.|Nowadays they've got that newfangled magic instead... +(SPEAKER は頷いている)|かつては冒険者のお供だったんだけどね。|今では魔法に取って代わられちまった…… +(The SPEAKER nods)|Back in my day, they used candles for light!|These let you put them out to save wax. +(SPEAKER は頷いている)|かつては明かりに蝋燭を使っていたんだよ。魔法じゃなくてね。|必要が無いときはこれで消して、蝋を節約するんだ。 +(The SPEAKER giggles)|I had all sorts of use for this back on the farm. +(SPEAKER はニタニタと笑っている)|農場で仕事し始めてから、ずっと愛用していたんだ。 + + +(Select an item to buy from the SPEAKER) +(SPEAKER から購入するアイテムを選ぶ) +(Attack the SPEAKER?) +(SPEAKER を攻撃する?) +### (Buy ITM# for IC# gp) (Owned: AMNT#) + +(The SPEAKER sells you the item) +(SPEAKER からアイテムを買った) +(The SPEAKER shakes her head)|I think you'd be better off without that~ +(SPEAKER は首を振った)|それはやめておいたほうが良いと思うよ~? +(The SPEAKER looks embarassed)|I can't sell you that, miss... +(SPEAKER は恥ずかしそうにしている)|それは売れません…… +(The SPEAKER blushes)|Actually, I was saving that for myself... +(SPEAKER は赤面している)|それは自分のためにとっておいてあるものだから…… +(The SPEAKER grins)|Good girls don't need one of those~ +(SPEAKER はクスクスと笑っている)|いい子にはこんなもの必要ないわよ~? +(The SPEAKER buzzes)|Error, insufficient access privileges. +(SPEAKER はエラー音を吐いている)|エラー、アクセス権限ガアリマセン。 +(The SPEAKER giggles at your empty pockets)|You can't afford such things, silly~ +(SPEAKER は財布の中を見て嫌らしく笑った)|買う余裕ないでしょ?おバカね~。 +(The SPEAKER pauses nervously)|Um miss, I don't think you can afford that... +(SPEAKER は緊張している)|えっと、お金が足りないようですが…… +(The SPEAKER frowns)|What does this look like, a charity? +(SPEAKER はしかめっ面で応える)|私だって慈善でやってるわけじゃないんだよ? +(The SPEAKER smules)|You'll have to secure that by other means, I think~ +(SPEAKER は笑顔で応える)|別の手段で手に入れるしかないみたいね? +(The SPEAKER beeps)|Insufficient currency. +(SPEAKER は機械音を鳴らしている)|通貨不足。 + + +(Look at what she wants to buy) +(売る) +You're giving me everything you have. +持ち物全部よこしなさい +(Flail threateningly at her) +(威嚇する) +(Do it) +本当にやる +(Back off) +やっぱりやめる + + +(The SPEAKER approaches you with an offer)|Greetings! I am the potion seller.|I buy and sell only the strongest potions!| +(SPEAKER が取引を持ちかけてきた)|こんにちは!私はポーションを取り扱っているんだ。|売りたいポーションがあれば買うし、売り物は特段効くやつだよ! +(The SPEAKER doesn't look surprised)|Okay, just let me set these down real quick... +(SPEAKER は驚いた様子も見せずに言った)|わかった、ちょっと整理してからね…… +(The SPEAKER smiles)|A spellcaster will have great use for this! +(SPEAKER は笑顔になった)|魔法使いがよく使うんだ。 +(The SPEAKER smiles)|Wow! That's a lot of mana!|It requires a skilled mage to tap into, though... +(SPEAKER は笑顔になった)|おお、マナがいっぱい詰まっているね!|初心者には扱えない代物だけど…… +(The SPEAKER smiles)|It fills me with... determination. +(SPEAKER は笑顔になった)|これを飲めば決意がみなぎってくるんだ…… +(The SPEAKER smiles)|Refreshing! +(SPEAKER は笑顔になった)|リフレッシュできるやつだね! +(The SPEAKER smiles)|They say a bitter tea cures all ails... +(SPEAKER は笑顔になった)|良薬口に苦しといった感じのものだ…… +(The SPEAKER smiles)|An empty flask?|...Oh. +(SPEAKER は笑顔になった)|空のボトル?|……ああ、そういうことか。 + + +(The SPEAKER approaches you)|My greetings, Outsider!|My throat is parched and I seek the bounties of nature.|Do you have what I seek? +(SPEAKER が取引を持ちかけてきた)|おはようございます、冒険者の方。|喉が渇いているから何か飲み物か自然の産物を探しているのだけど。|何か持っていませんか? +(The SPEAKER doesn't look surprised)|Then let us have a battle of wits! +(SPEAKER は驚いた様子も見せずに言う)|それじゃあ知恵比べの時間と参りましょうか! +(The SPEAKER thanks you)|A kind offering! You have my thanks. +(SPEAKER は礼を述べた)|そうそう、これが欲しかったんです!ありがとうございます! +(The SPEAKER thanks you)|A magnificent offering! You have my thanks. +(SPEAKER は礼を述べた)|素晴らしい、ありがとうございます! +(The SPEAKER tilts her head)|...where did you get this? +(SPEAKER は首を傾げた)|……これをどこで? +(The SPEAKER thanks you)|A fine trinket!|I will enjoy meditating upon it. +(SPEAKER は礼を述べた)|これは便利なものですよね!|これで瞑想するととても気持ちが落ち着くんです。 +(The SPEAKER thanks you)|I sense its flowing essence.|You have my thanks. +(SPEAKER は礼を述べた)|流れるような魔力を感じます。|ありがとうございます! +(The SPEAKER thanks you)|I can feel a great sadness emanating from it.|It calls for warmth. +(SPEAKER は礼を述べた)|とても大きな悲しみを放っているように感じます。|温めてあげる必要がありますね。 + + +(The SPEAKER munches on a donut)|Gee I'm starving!|You wouldn't have something to eat, would you? +(SPEAKER がドーナツを頬張りながら近づいてきた)|げっふ、お腹すいた!|なにか食べるもの持ってない? +(The SPEAKER throws a donut in your face)|Ha! Take that! +(SPEAKER はドーナツを投げつけてきた!)|くらえ~! +(The SPEAKER smiles)|Yum! Thank you! +(SPEAKER は笑顔になった)|おいしい!ありがとう! +(The SPEAKER smiles)|Crunchy! My favorite! +(SPEAKER は笑顔になった)|サクサクしてておいしいよね!大好きだよ! +(The SPEAKER tilts her head)|It smells funny...|Still, it'd be a shame for it to go to waste! +(SPEAKER は首を傾げる)|なんか変な匂いがする~……|でも食べないのはもったいないよね……! + + +(The SPEAKER approaches you with an offer)|Hello!|I am searching for magical scrolls.|Would you happen to have any? +(SPEAKER が取引を持ちかけてきた)|ごきげんよう!|魔法のスクロールを探しているのだけど、|持っていたりはしませんか? +(The SPEAKER doesn't look surprised)|Rude! +(SPEAKER は驚いた様子も見せずに言う)|無礼者! +(The SPEAKER smiles)|Thank you! +(SPEAKER は笑顔になった)|ありがとうございます! +(The SPEAKER raises a brow)|Thank you! This one is rare! +(SPEAKER は瞳を輝かせた)|とても貴重な品ですね!ありがとうございます! + + +(The SPEAKER invites you to a friendly chat)|Back in my day I used to go visit dungeons all the time|But these days I get so lost in my studies...|Say, you don't happen to have some magic supplies on you? +(SPEAKER は機嫌を良くし、饒舌に喋りだす)|昔はよくダンジョンに潜っていたのですが、|最近は机に向かう事が多くて……|もしかして、他にもこのようなものを持っていたりしますか? +(The SPEAKER shrugs)|I guess that's how it is. +(SPEAKER は肩をすくめる)|これはそういったものですね…… +(The SPEAKER smiles)|Always nice to have some of these! +(SPEAKER は笑顔になった)|こういうものは常備しておきたいですね。 +(The SPEAKER smiles)|I can never get enough of these. +(SPEAKER は笑顔になった)|少々物足りませんね。 +(The SPEAKER smiles)|Elemental magic, interesting stuff. +(SPEAKER は笑顔になった)|精霊の魔法は興味深いですね。 +(The SPEAKER tilts her head)|Why is it wet? +(SPEAKER は首を傾げた)|なぜ濡れているのでしょうか? +(The SPEAKER smiles)|Gladly, this will be useful to my studies. +(SPEAKER は笑顔になった)|これは勉強に役立ちそうです! +(The SPEAKER smiles)|My legs don't carry me like they used to~ +(SPEAKER は笑顔になった)|私の足はこのスクロールに書いてあるように動きませんが…… +(The SPEAKER smiles)|Always good to have somebody to talk to. +(SPEAKER は笑顔になった)|常に話し相手がいるのは良いことですね。 +(The SPEAKER giggles)|Living dangerously, I see~ +(SPEAKER は笑みを浮かべる)|まだ生きていますね、私にはわかります。 + + +(The SPEAKER approaches you with an offer)|Hey girl~|You seem like the explorer type.|Happen to have any good finds? +(SPEAKER が取引を持ちかけてきた)|そこのキミ!|色々探索しているんだろう?|何か良いものは見つかったかい? +(The SPEAKER frowns)|Well then. +(SPEAKER は顔をしかめた)|そうかい。 +(The SPEAKER grins)|Are you willing to part with this? +(SPEAKER はニヤリと笑った)|本当に良いのかい? +(The SPEAKER smiles)|Aha!|Fantastic. +(SPEAKER は笑顔を見せる)|おお!|素晴らしいね! +(The SPEAKER frowns)|I'll take it, I guess... +(SPEAKER は眉をひそめた)|まあ、受け取るよ…… +(The SPEAKER smiles)|Oooh~!|I love technology! +(SPEAKER は笑顔になった)|おお~!|こういうの大好きだよ! +(The SPEAKER nods)|A rare find! +(SPEAKER は満足そうに頷いた)|いいもんめっけ! + + +(The SPEAKER surprises you)|Greetings, traveler.|I am looking for tools to aid in my mission. +(SPEAKER が突然現れた)|もし、旅のお方。少しよろしいか。|いくつか道具を売って欲しいのだが、よろしいか? +(The SPEAKER doesn't look surprised)|That's how it is, then. +(SPEAKER は驚いた様子も見せずに言う)|よろしい。 +(The SPEAKER bows)|Always be prepared. +(SPEAKER は軽くお辞儀をする)|煙幕は常に携行しなければな、感謝する。 +(The SPEAKER bows)|Always be extra prepared. +(SPEAKER は軽くお辞儀をする)|常に奥の手は持っておかないとな。 +(The SPEAKER bows)|A bit dangerous, but I'll take it. +(SPEAKER は軽くお辞儀をする)|あまり使いたくはないものだが、ありがたく頂戴しよう。 +(The SPEAKER bows)|A tool of the trade. +(SPEAKER は軽くお辞儀をする)|交渉に役に立つ。ありがたい。 +(The SPEAKER bows)|A most valuable find. +(SPEAKER はお辞儀をする)|これが欲しかったのだ、かたじけない。 + + +(The SPEAKER tilts her shades)|I like to think of myself as a dealer in quality tools. +(SPEAKER はフードから顔をのぞかせた)|や、良い商品を取り扱っているよ。 +(The SPEAKER reaches for her hip)|I'd think twice if I were you... +(SPEAKER は自身の尻に手を当あてた)|もう少し考えたらどうかな…… +(The SPEAKER smiles)|Nevermere keeps a tight grip on their blueprints.|Thank you. +(SPEAKER は笑顔で応える)|ネバーミアはこいつの設計図を厳重に秘匿しているんだ。|ありがとう! +(The SPEAKER smiles)|There's always a buyer.|That's just the way things are. +(SPEAKER は笑顔で応える)|買い手は常にいる。|そういうものだよ。 +(The SPEAKER smiles)|Portable. Sustainable. A smart choice. +(SPEAKER は笑顔で応える)|携行しやすくて、長持ちする。いいね! +(The SPEAKER smiles)|That's what I'm talking about. +(SPEAKER は笑顔で応える)|そういうことだよ。 +(The SPEAKER nods)|Yeah... that'll do. +(SPEAKER は頷いている)|ああ、いいね。 + + +(The SPEAKER looks somewhat crazed)|I'm looking for some heavy ordnance in order to...|...add to my collection.|Anyway, got any bombs? +(SPEAKER の瞳は狂気を宿している……)|重火器を探しているんだが……|コレクションしたいんだ……|と、ところで爆弾はいるか? +(The SPEAKER reaches for her backpack)|I'll blow you away! +(SPEAKER はバックパックに手を伸ばす)|ぶっ飛ばしてやらぁ! +(The SPEAKER shrugs)|Cute fireworks, I suppose... +(SPEAKER は肩をすくめている)|か、可愛らしい花火だな…… +(The SPEAKER giggles)|That's what I'm talking about! +(SPEAKER はクスクスと笑っている)|そう、それだよ! +(The SPEAKER rubs her hands together)|Excellent... +(SPEAKER は両手を擦り合わせている)|素晴らしい…… +(The SPEAKER smiles)|Yes! I can make more bombs! +(SPEAKER は笑顔で応える)|い、いいじゃないか!これでもっと爆弾を作れる! + + +(The SPEAKER takes a whiff of her cigar)|Hey friend. Im in the market for some 'tools,'|...if you catch my frift. +(SPEAKER は葉巻の匂いを嗅いでいる)|やあ、友よ。”道具”を売ってくれないかい?|言ってること、わかるよね? +(The SPEAKER pulls out a knife)|Thought so. You won't take me that easily! +(SPEAKER はナイフを抜いた)|だと思った。そう簡単に捕まってたまるか! +(The SPEAKER nods)|Could help out in a bind. +(SPEAKER は頷いている)|拘束から逃れるのに役に立つな。 +(The SPEAKER chuckles)|Lights out, eh... +(SPEAKER は苦笑いしている)|消灯時間だな…… +(The SPEAKER nods)|I could use one of these! +(SPEAKER は頷いている)|私も使えるぞ。 +(The SPEAKER smiles)|For when things go south... +(SPEAKER は笑顔で応える)|状況を立て直すのに使える…… +(The SPEAKER smiles)|You can never be too safe. +(SPEAKER は笑顔で応える)|安全に越したことはない。 + + +(A distracted SPEAKER munches on a cookie) +(SPEAKER は気の抜けた様子でクッキーを貪っている) +(The SPEAKER continues eating her snack) +(SPEAKER はお菓子を食べ続けている) +(The SPEAKER plucks the cookie out of your hand)|My favorite! +(SPEAKER にクッキーをひったくられた)|これ私のお気に入りなの! +(The SPEAKER eats the brownies slowly, savoring every bite)|Kind of dense, but really good! +(SPEAKER はブラウニーを一口ずつじっくり味わいながら食べている)|ちょっと濃いけどおいしい! +(The SPEAKER takes a bite out of the donut)|A bit heavy on the sprinkles... +(SPEAKER はドーナツにかぶりついた)|ちょっと砂糖が多いかな…… +(The SPEAKER blushes)|This is... my new favorite. +(SPEAKER は赤面している)|これ……すごくいい…… +(The SPEAKER's eyes widen as she wolfs down the golden cookie)|Truly divine... +(SPEAKER は黄金色のクッキーを頬張り、目を見開いた)|すごく神々しい……! + + + + +(The SPEAKER is reading a kinky fashion magazine)|Why hello gorgeous~|You seem like you know your way around fashion.|Say, I've been on the hunt for unique designs... +(SPEAKER は変態的なファッションの雑誌を読んでいる)|ごきげんよう~|あなた、ファッションに詳しそうですわね。|ユニークなデザインの服、持っていませんこと? +(The SPEAKER pouts)|I don't like your attitude. +(SPEAKER は口をとがらせている)|気に入らない態度ですわ。 +(The SPEAKER smiles)|Classic vintage!|I approve~ +(SPEAKER は笑顔で応える)|昔から人気の商品ですわね!|好きですわよ。 +(The SPEAKER giggles)|A girls best friend, eh? +(SPEAKER はクスクスと笑っている)|少女の心強い友、ですわね。 +(The SPEAKER gasps)|What an amazing find!!! +(SPEAKER は息を呑む)|まあ、なんと素晴らしい! + + +(The SPEAKER runs up to you)|Hello!|You wouldn't happen to have seen any ghosts lately?|I'm gathering evidence! +(SPEAKER が走り寄ってきた)|やぁ!|幽霊を見なかったかい?|今証拠を探しているんだ! +(The SPEAKER gasps)|You wouldn't! +(SPEAKER は悲鳴を上げる)|そんな! +(The SPEAKER shakes your hand)|Ah! Ghosts love these! +(SPEAKER は握手してきた)|こういうのに幽霊が寄ってくるんだ! +(The SPEAKER smiles)|This looks like strong evidence for my investigation! +(SPEAKER は笑顔を向けてくる)|これは絶対的な証拠になる! +(The SPEAKER grins)|Woah! That's so cool! +(SPEAKER はにっこり笑った)|おお!素晴らしい! + + +(Look at what she has to sell) +(買う) +### (Sell Item0 for ItemCost0 gp) (Owned: AMNT0) + +### (Sell Item1 for ItemCost1 gp) (Owned: AMNT1) + +### (Sell Item2 for ItemCost2 gp) (Owned: AMNT2) + +### (Sell Item3 for ItemCost3 gp) (Owned: AMNT3) + +### (Sell Item4 for ItemCost4 gp) (Owned: AMNT4) + +### (Sell Item5 for ItemCost5 gp) (Owned: AMNT5) + +### (Sell Item6 for ItemCost6 gp) (Owned: AMNT6) + +### (Sell Item7 for ItemCost7 gp) (Owned: AMNT7) + +### (Sell Item8 for ItemCost8 gp) (Owned: AMNT8) + +### (Sell Item9 for ItemCost9 gp) (Owned: AMNT9) + +### (Buy Item0 for ItemCost0 gp) (Owned: AMNT0) + +### (Buy Item1 for ItemCost1 gp) (Owned: AMNT1) + +### (Buy Item2 for ItemCost2 gp) (Owned: AMNT2) + +### (Buy Item3 for ItemCost3 gp) (Owned: AMNT3) + +### (Buy Item4 for ItemCost4 gp) (Owned: AMNT4) + +### (Buy Item5 for ItemCost5 gp) (Owned: AMNT5) + +### (Buy Item6 for ItemCost6 gp) (Owned: AMNT6) + +### (Buy Item7 for ItemCost7 gp) (Owned: AMNT7) + +### (Buy Item8 for ItemCost8 gp) (Owned: AMNT8) + +### (Buy Item9 for ItemCost9 gp) (Owned: AMNT9) + +(The SPEAKER appears in a flash of light)|I come in the name of the Goddess.|I presume you need my aid?|(She will remain and help you with restraints for 50 turns) +(SPEAKER が光を背に現れた)|神の名のもとに、ただいま参りました。|助けが必要なのでしょう?|(50ターンの間拘束具を外す手伝いをしてくれる) +(The SPEAKER gives you two knives)|Don't hurt yourself with these, okay? +(SPEAKER はナイフを渡してきた)|自分を切らないでくださいね? +(The SPEAKER gives you three picks)|I don't know how you plan to use these... +(SPEAKER はロックピックを渡してきた)|これで何をするのかは知りませんが…… +(The SPEAKER reluctantly gives you a magic key)|Okay, but remember that these are rare and valuable. +(SPEAKER は惜しみながら青い鍵を渡してきた)|これは貴重なものなのですが…… +(The SPEAKER looks impressed with your predicament)|No angel can remove these without a divine blessing.|Perhaps you should apply for one? *snickers* +(SPEAKER はこちらを感心するように見つめている)|天使じゃないと女神の加護が宿った拘束具は外せません。|応募してくれたら外してあげますよ?w +(The SPEAKER looks impressed with your predicament)|I won't get between you and your quest duties! +(SPEAKER はこちらを感心するように見つめている)|クエストの邪魔はできませんね。 +(The SPEAKER looks impressed with your predicament)|Since you are Blessed by a goddess, I can help you.|(She performs a short prayer and a random divine lock comes off) +(SPEAKER はこちらを感心するように見つめている)|女神の祝福を受けているようですね、助けてあげましょう。|(彼女が祈りを捧げると、ランダムな女神の拘束具の錠が外れた) + + +(Ask for 2 knives) +(ナイフ2本を希望する) +(Ask for 3 lockpicks) +(ロックピック3本を希望する) +(Ask for a magic key) +(魔法の鍵を希望する) +(Ask for help with a divine lock) +(女神の錠を外すよう頼む) + + +There is no valid space next to you! +隣にスペースがないと天使を呼び出せない。 + + +(You approach the SPEAKER) +(SPEAKER と出会った) +(Threaten) +(攻撃する) +(Really attack?) +(本当に?) +(Attack her) +(攻撃する) +(Never mind...) +(考え直す) +(You decide not to) +(考え直すことにした) + + +(Retaliate) +(反撃する) +(Really attack? You will be justified and won't take an immediate rep penalty) +(本当に攻撃する?この反撃には正当性があり、即座に関係性が悪化することはない) + + +(Sneak Attack) +(隠密攻撃) +(Really attack? Target is unaware and will be stunned 1 turn.) +(本当に攻撃する?ターゲットはこちらに気付いておらず、この攻撃が命中したら1ターンスタンする。) + + +(Let me through!!) +(通り過ぎる) +(Walk past this unit) +(このユニットを通り過ぎる) +(Walk past all units) +(全てのユニットを通り過ぎる) +(Confirm? You will move through her for a few turns) +(本当に?数ターンの間、対象を通り過ぎるようになる) + + +(Stop following me) +(ついてくるのをやめてほしい) +(Confirm? You will have to find the SPEAKER again.) +(本当に? SPEAKER と再び会いたい場合、探さなくてはならない) +(You decide you still need the help) +(まだ彼女の助けが必要だ) +(The SPEAKER refuses to follow your orders) +(SPEAKER は命令に従わなかった) + + +### (Remove BINDAMNT binding from her) UNTIETURNS + +### (You remove BINDANTPREV binding from the SPEAKER, excluding actual bindings)|(Use the 'Truss em Up' skill to remove bindings) + +(Give her a restoration item) +(回復アイテムを渡す) +(The SPEAKER appreciates the thought!) +(SPEAKER は感謝している!) +### Must have HP to untie. + +### (AMNT turns) + +### (AMNT turn) + +(Follow me) +(ついてきて) +(The SPEAKER starts following you) +(SPEAKER がついてくるようになった) +(You decide you don't need the help) +(彼女の力はもう必要ない) + + +(Hold still) +(ここでじっとしていて) +(The SPEAKER follows your orders) +(SPEAKER は命令に従った) + + +(Don't stay here) +(ここから動いて) +(Confirm?) +(本当に?) +(You decide you would rather the SPEAKER stay put) +(SPEAKER は動かないほうが良いと判断した) + + +(Switch to Aggressive) +(積極的に戦闘させる) +(The SPEAKER will now pursue enemies) +(SPEAKER は積極的に敵を襲うようになる) + + +(Switch to Defensive) +(戦闘に消極的にする) +(The SPEAKER will stay close to you or its assigned position) +(SPEAKER はプレイヤーについてくる) + + +(Flirting) +(イチャイチャ) +(The SPEAKER smiles)|This will be fun! +(SPEAKER は笑顔を返してくる)|楽しくなりそうね! +(The SPEAKER grins)|I will make sure you enjoy yourself~ +(SPEAKER はニッコリと笑う)|絶対楽しませてあげるからね~! +(The SPEAKER blushes)|Mmm~ Let's do this! +(SPEAKER は頬を赤らめた)|それじゃあやりましょうか。 +(The SPEAKER backs up)|I'm not in trouble, am I? +(SPEAKER は後ずさった)|何もやらかしていないよね? +(The SPEAKER beeps)|This unit does not know how to respond... +(SPEAKER はビープ音を立てている)|不明ナ命令…… +(The SPEAKER moans)|Mmmmmph~ +(SPEAKER は猿轡越しに呻いている)|んんぅ~ +(The SPEAKER appears too busy to discuss with you) +(SPEAKER は話す余裕がないようだ) + + + + + + + + + + + + +End of line. +任務完了。 + + +*slaps your butt* +(お尻を叩かれた) + + + + +Error. Subject not complying? +エラー。対象の反応なし? + + + + +Got yourself locked up, huh? Better go be good now~ +こんなものを着けてるなんてスゴい変態だね? いい子にしてなよ~? +*she bumps up against your chastity and sighs* +(彼女は貞操帯を確認するとため息を付いた) +Pleasure controls detected. +貞操帯を確認。 +You've been a bad girl, haven't you? *taps on your chastity gear* +悪い子だったみたいね?(彼女は貞操帯を軽く叩いている) +Such a naughty girl, getting yourself all locked up like that! +そういうのが好きなのか、変態め! +I-I know you want release, but you're in this gear for a reason~ +は、外してほしいんですか? でもこれを着けたのにはちゃんと理由があるんですよ。 + + + + + + + + + + +Had fun?~ +楽しめた? +*turns the toy off and giggles* +(彼女はニヤニヤしながらもオモチャをオフにしてくれた) + + + + + + + + + + +Don't I look quite cuddly? +抱きしめてほしいんだけど、いいかな? +(Move closer, attempting to cuddle) +(近寄って抱きしめようとする) +(The SPEAKER smiles)|You do, in fact!|(She inches closer) +(SPEAKER は笑顔を見せている)|ええ、そうね|(彼女はゆっくりと近づいてきた) +(The SPEAKER smiles gently)|Aren't you precious~ +(SPEAKER は優しい笑みを浮かべている)|可愛らしいわね~。 +(The SPEAKER looks flustered)|Well, it's been a long day...|I could use a hug... +(SPEAKER はおたおたしている)|長い一日でした……。|ちょっと温もりが欲しいですね……。 +(The SPEAKER smirks and reaches for your body) +(SPEAKER は悪辣な笑みを浮かべると身体に手を伸ばしてきた) +(The SPEAKER makes a beeping noise)|Loading cuddle module... +(SPEAKER は機械音を発している)|愛撫モード起動…… + + +Got something for me? +何か用? +(Present your body to her~) +(身体を差し出す) +(The SPEAKER smiles)|Am I thinking what you're thinking? +(SPEAKER は笑顔を返してくる)|ちょうどそういう気分だったの。 +(The SPEAKER grins)|Why yes, I have just the thing~ +(SPEAKER はニッコリと笑う)|ちょうどあなたにピッタリのものがあるの。 +(The SPEAKER blushes)|Oh... let me check. +(SPEAKER は頬を赤らめた)|うん、ちょっと確かめるね。 +(The SPEAKER smirks)|Be careful what you ask for~ +(SPEAKER ニヤリと笑った)|本当にいいの~? +(The SPEAKER pauses)|Calculating strictness threshold... +(SPEAKER はランプをチカチカと点灯させている)|拘束ノ許容量ヲ計算中…… +Yes please! (Hold out your wrists) +ええ、お願い(両手を差し出す) +(Nod and blush) +(頷く) +Maybe not... +やっぱり今はいい…… + + +Why don't we have a little fun? +一緒に……しない? +(Play with her) +(彼女と楽しむ) +(The SPEAKER giggles)|Mmmph~ +(SPEAKER 笑みを浮かべている)|んん~。 + + +You look quite distracted... +かなり溜まっているようね…… +(Help her with her distraction) +(満足させる) +(The SPEAKER nervously smiles)|H-how'd you know? +(SPEAKER は神経質な笑みを浮かべた)|ど、どうしてわかったの? +(The SPEAKER smiles)|Indeed I am... Won't you assist me? +(SPEAKER は安堵の笑みを浮かべる)|わ、わかった……それじゃあお願いするわ。 +(The SPEAKER wiggles excitedly)|Y-yes miss! +(SPEAKER は体をくねらせている)|はいっ、ご主人様! +(The SPEAKER shakes her head while blushing)|W-what makes you think that? +(SPEAKER は赤面しながら首を振っている)|ど、どうしてそう思うの? +(The SPEAKER computes something)|Error... +(SPEAKER は何かを計算している)|エラー…… +(The SPEAKER nods)|Mmmph! +(SPEAKER は頷いた)|んむぅぅ! +(Give her release with a magic wand) +(魔法の杖で絶頂させる) +(Set her toys to high for a while) +(オモチャの設定をハイにする) +(Cuddle with her for 2 turns) +(2ターンの間付き合う) +(The SPEAKER trembles with pleasure) +(SPEAKER は絶頂している) +(The SPEAKER struggles to let go due to her chastity belt) +(SPEAKER は貞操帯のせいでなかなか絶頂できない) + + + + +Let's go for a walk! +少し歩きましょう! +(Jump excitedly, presenting your collar for a leash) +(飛び跳ねながら首輪を差し出す) +(The SPEAKER smiles)|Sure! I'll take you for a walk, but only if you behave. +(SPEAKER は笑みを浮かべている)|もちろん!いっぱい歩かせてあげますよ! +(The SPEAKER smiles)|Yes, I haven't had a nice walk in a while~ +(SPEAKER は笑みを浮かべている)|ええ、久しぶりに良い散歩ができそうね! +(The SPEAKER blushes)|Sure! I'll make sure you don't get into trouble~ +(SPEAKER は赤面している)|トラブルに巻き込まれないようにしますね。 +(The SPEAKER giggles)|Time for walkies! +(SPEAKER はニヤニヤと笑っている)|散歩の時間ね! +(The SPEAKER calculates)|Routing coordinates... +(SPEAKER は何らかの計算をしている)|ルート計算中…… + + +(Ask her for help) +(助けを求める) +(Are you sure? She might see you as being submissive) +(本当に?頼んだら服従度に影響が出るかもしれない) +(The SPEAKER prefers you the way you are) +(SPEAKER は今の状況を楽しんでいるようだ) +(The SPEAKER will help you out of your restraints) +(SPEAKER は拘束具から抜け出すのを助けてくれるようだ) +(You decide to deal with your problems yourself.) +(自分でなんとかしよう) +(Plead with her to unlock you with a Command Word) +(コマンドワードでロックを解除するよう頼む) +(Yes!) +(お願い!) +(The SPEAKER would rather 'conserve her mana') +(SPEAKER はマナを節約したいと断ってきた) +(The SPEAKER utters a command word on you) +(SPEAKER は快く唱えてくれた) +(Your magical locks continue to restrain you.) +(魔法のロックは未だ健在だ) +(Plead with her to unlock your restraints) +(拘束具の鍵をもらう) +(The SPEAKER would rather not give up a magic key) +(SPEAKER は魔法の鍵を手放したくないようだ) +(The SPEAKER doesn't have any keys) +(SPEAKER は鍵を持っていない) +(The SPEAKER giggles and gives you a key) +(SPEAKER はニヤつきながら鍵を渡してくれた) +(You remain locked tight.) +(錠前は以前ロックされたままだ) +(Stop receiving help) +(もう助けはいらない) +(Confirm? You will have to ask again to get help.) +(本当に?会話から再び助けを頼むことができる) +(The SPEAKER will no longer help you.) +(SPEAKER は拘束具から抜け出す手助けをやめた) +(You sigh as you realize you really need her help.) +(まだ彼女の助けが必要だったかもしれない) +(Kick her out of your party) +(パーティから追放する) +(Confirm? She will stop following you) +(本当に?彼女はもうついてこなくなる) +(Remove from party) +(パーティから除外) +(The SPEAKER understands.) +(SPEAKER は残念そうにしている) +(You decide to keep her.) +(やめておいた) +(Add her to your party) +(パーティに加える) +(Confirm? She will follow you across floors. You can only have 3 party members) +(本当に?彼女はフロアをまたいでついてくる。パーティメンバーは3人まで) +(Add to party) +(加える) +(The SPEAKER is happy to join you) +(SPEAKER は嬉しそうにしている) +(You decide not to.) +(やめておいた) + + +(Sell items) +(アイテムを売る) +(Buy items) +(アイテムを買う) + + +(Pick up her leash) +(リードを手に取る) +(Release her leash) +(リードを離す) + + +Dollmaker +ドールメイカー +The Dollmaker throws a device to the ground, teleporting her instantly! +ドールメイカーは地面に装置を投げ、テレポートした! +The Dollmaker's necklace flashes as you find yourself suddenly restrained! (+RestraintAdded) +ドールメイカーのネックレスが光ると、突然身体に拘束具が現れた! (+RestraintAdded) +The Dollmaker's overbearing presence captivates you~ (DamageTaken) +ドールメイカーは圧倒的な存在感を放っている!(DamageTaken) +The Dollmaker snaps her fingers as you find yourself locked! (DamageTaken) +ドールメイカーが指を鳴らすと、拘束具がロックされた!(DamageTaken) + + +The Dollmaker sinks into a pool of latex! +ドールメイカーはゴムの海に沈んでいった! +The Dollmaker suggests that you surrender. (DamageTaken) +ドールメイカーは降伏を勧告してきた!(DamageTaken) + + +DOLLMAKER +ドールメイカー +The Dollmaker falls kneeling to the floor, admitting defeat! +ドールメイカーは膝を付き、敗北を認めた。 +The Dollmaker snaps her fingers, and many robotic arms restrain you! (+RestraintAdded) +ドールメイカーが指を鳴らすと、大量の機械腕が取り付いてきた!(+RestraintAdded) +The Dollmaker orders you to KNEEL! (DamageTaken) +ドールメイカーは跪くよう命令してきた!(DamageTaken) + + +Fuuka +フウカ +Fuuka surrounds herself in defensive talismans! +突然フウカの周囲に護符が集まってきた! +Fuuka wraps you tightly in restraints! (+RestraintAdded) +フウカが拘束具を巻き付けてきた!(+RestraintAdded) +Fuuka squeezes your breasts and smiles! (DamageTaken) +フウカが笑顔で胸を揉みしだいてきた!(DamageTaken) +Fuuka snaps her fingers and all your restraints are locked! (DamageTaken) +フウカが指を鳴らすと、拘束具が全てロックされた! + + +Fuuka surrounds herself in defensive talismans one more time! +再びフウカの周囲に護符が集まる! +Fuuka wraps you furiously in restraints! (+RestraintAdded) +フウカが怒りを込めて拘束具を巻き付けてきた!(+RestraintAdded) +Fuuka pouts as she tickles you relentlessly! (DamageTaken) +フウカが執拗にくすぐってきた!(DamageTaken) + + +(You find a girl wearing an ornate dress)|(She glances at you)|And who might you be? +(豪奢なドレスを着て、佇んでいる少女を見つけた)|(こちらに気付いた彼女が一瞥する)|あなたは? +I should be asking the same of you. +先に名乗って +(Growl at her) +(唸り声を上げる) +(She smiles)|My name is Fuuka, with the letters for Wind and Song.|Are you going to introduce yourself? +(彼女は涼しげに微笑む)|私はフウカ。風と歌でフウカよ。|あなたは? +What kind of name is that? +どういう意味? +(SPEAKER frowns)|It means Windsong!|I bet yours isn't anywhere nearly as cool. +(SPEAKER はむっとしている)|そのまま"風"の"歌"よ!|少なくともあなたの名前よりは趣がんじゃないかしら!? +(SPEAKER looks enraged)|Because names and meanings are different things!|My name uses the script from the Old Civilization!|You're just a poser! +(SPEAKER はイライラしている)|もー、文法から説明しないとだめなの?|あなたの名前とは違って旧文明のものなんだから色々と違うのよ!|もう少し勉強しなさい! +Why not just call yourself Windsong? +じゃあなんで"風の歌"って名乗らないの? +I am an adventurer. +私はただの冒険者 +(SPEAKER blushes)|Ah, right then... +(SPEAKER は赤面している)|ああ、喋れないわよね…… +(SPEAKER giggles)|Very well. I don't really care who you are. +(SPEAKER は厭らしい笑みを浮かべている)|まあいいわ、あなたが誰であろうと知ったことじゃないし。 +I do not need to introduce myself. +自己紹介の必要はないと思うけど +Neither do I. +そうね +I'm an adventurer. And who are you? +私はただの冒険者。あなたは? +Mmmmm... (Blush) +んむぅぅ…… +(She grins)|My name is Fuuka, with the letters for Wind and Song.|The reincarnated ones call me Windsong,|they aren't very bright though. +(SPEAKER はニッコリと笑う)|私はフウカ。"風の歌"と書いてフウカよ。|蘇りし者達の間では風の歌と呼ばれているわ。|でも、皆そういうのに明るくなくてね。 +Reincarnated ones? +蘇りし者? +(SPEAKER tilts her head)|I believe the term is 'Zombie' in the common tongue. +(SPEAKER は話を続ける)|そうね、一般的には"ゾンビ"とか呼ばれているものよ。 +(SPEAKER enjoys the discussion)|When most people die, their spirits pass on to the next life.|But some stay in this world, and with the right blessings,|one can grant them a second chance!|I plan to give them all proper bodies...|Eventually. +(SPEAKER は饒舌に話し出す)|人が死んだ時、魂は転生して次の人生を送るでしょう。|でもね、私はとある秘術を得たの。|転生するはずだった魂を再び肉体に入れる再生の技。|いずれ墓場の皆の魂を戻すつもりよ。|いずれね。 +How do they get reincarnated? +どうやって魂を戻したの? +(SPEAKER enjoys the discussion)|No, they're people!|People who died long ago.|Now they live a new life, safeguarded by my Resurrection Arts! +(SPEAKER は捲し立ててきた)|違うわ、彼女たちは生きているのよ!|はるか昔に一度死んで、|今私の秘術によって二度目の人生を送っているのよ! +Aren't they dolls? They can barely speak. +ただのよく喋る操り人形でしょ? +(SPEAKER pouts)|Why you...|Long ago, I made a contract with Ninril to guide lost souls back to her.|Do you doubt her blessing?! +(SPEAKER は口をとがらせている)|あなたね……|ニンリルとの契約で授かった、いわば神の御業の一部なのよ!|それを大したことないですって!? +Your Resurrection Arts don't seem very effective. +大したことないんじゃない? +(SPEAKER looks puzzled)|People don't die anymore, but there are still lots of souls out there.|Whenever they stumble into the dungeon, searching for answers,|I'm still here, waiting! +(SPEAKER は動揺している)|不死になっても、未だ漂う魂は無数にあるわ!|彼女たちを導くために、|そのために私はここにいるのよ! +What do you do now that people don't die? +私達はもう皆不死になったけど? +(SPEAKER chortles)|So you've noticed!|As you can see, Ninril is very powerful~ +(SPEAKERはくすくすと笑っている)|あら、見た目で判断するの?|これも神の力よ。 +You don't look very old yourself. +とても年老いているようには見えないけど。 +(SPEAKER frowns)|Divine blessings shouldn't be used for such silly things! +(SPEAKER は呆れ返っている)|そんなおバカな理由で神の力を使うわけないでしょ! +Can you resurrect my back? It kind of hurts right now... +じゃあ背中を治してくれない?今ちょっと痛くて…… +(SPEAKER smiles)|Those latex-clad idiots don't understand a thing.|Science can only get you so far!|Worship is where it's at! +(SPEAKER はニッコリと笑う)|あのラテックス狂いのバカ共には無理よ。|科学の限界よ。|そしてその先には神の導きによってのみ到れるのよ。 +The Alchemists are always looking for a youth potion. +錬金術師達はいつも若返りの方法を探していたわ。 +(SPEAKER folds her arms)|Oh ho ho~|That's none of your business, for it is also part of my contract|to keep outsiders from interfering with the catacombs below! +(SPEAKER は腕を組み笑っている)|うふふふ、|そんな事知ってどうするつもり?|この先には進ませないわよ! +Do you know what's on the next floor? +この先には何があるの? +(SPEAKER blushes)|Nope, nothing at all!|In fact, whatever it is, you won't find it down here!|Now, would you like to become my pet? +(SPEAKER は赤面している)|えっと、知らないわ!|知らないし、ここにはそんなものないわ!|さて、私のペットになる準備はできた!? +Do you know anything about the Old Civilization? +旧文明についてなにか知ってる? +(SPEAKER shrugs)|Oh really...|Must be the fey playing tricks, hehe... +(SPEAKER は驚いている)|えっ、本当……?|ああ、あいつのいたずらか…… +I've seen a few robots running around! +ロボットが動き回っているのを何度か見たの。 +(SPEAKER looks nervous)|Oh yeah? Where'd you hear that?|The 'adventurer's guild,' huh?|Why don't you just leave the dead to rest~ +(SPEAKER は陰険な表情を浮かべている)|そう、どこで聞いたの?|冒険者ギルドでホラ吹きにでも唆された?|それで今は墓荒らしの真っ最中ってわけね、いい加減死者を静かに眠らせてあげたら? +I heard there was an ancient facility on this island. +この島に古代文明の工場があるって聞いたんだけど。 +(SPEAKER sighs)|Look, the Goddess doesn't tell me everything.|Now then, I have a job to do and some pets to manage.|Please stop asking questions! +(SPEAKER はわざとらしく大きなため息を付いた)|はぁ~……自分で調べなさいよ。|ペットの世話もしなきゃいけないし、仕事もあるし。|もう質問はいいでしょ! +Is Sariel Vinlaga down here? +サリエル・ヴィンラーガもここを通ったの? +(SPEAKER frowns)|What's with all the questions!|There totally isn't some kind of doll processing facility here!|Perhaps you're a brainwashed doll yourself? +(SPEAKER は明らかに動揺している)|な、何言ってるの!?|ここには人形加工工場とかそんなものはないわ!|あなたもしかして…… +Does DressUp Co. get their 'cyber doll' products from here? +ドレスアップ社のサイバードール商品はここから来てるの? +(SPEAKER chuckles)|I smell a hint of jealousy~ +(SPEAKER は苦笑いを浮かべている)|自分に素直になりなさいよ~。 +I don't want to be a pet, so you'll have to force me. +ペットになんてなりたくない、やるなら力ずくで来なさい。 +(SPEAKER jumps up and down)|You would!?|That's wonderful~|My resurrection magic can make you young again forever!|All you have to do is pledge your soul to Nirin, the Goddess of Restoration! +(SPEAKER は喜びに飛び跳ねている)|えっ!?|やったわ!|それじゃああなたに永遠の若さを授けてあげる!|再生の女神ニンリルに魂を捧げなさい! +I'd love to be your pet! +ペットにしてください! +(SPEAKER pouts)|Hmmph. Suit yourself. +(SPEAKER は残念そうにしている)|そう…… +Pledge my soul? That changes things... +魂を?それはちょっと…… +(SPEAKER giggles)|Hehe... you sound interested. +(SPEAKER はくすりと笑った)|ふふふ、私に興味があるの? +(SPEAKER frowns)|Never ask a woman about her age! +(SPEAKER は口をとがらせる)|なんて失礼な奴! +I take it you're the hag in charge? +あなたがここのボスのゾンビババアね? +You are in charge, right? +あなたがここのボスね +(Giggle) +ん……ふふ(嘲笑する) +Don't mess with me, little girl. +邪魔しないで、お嬢ちゃん +Mmpphgh? (Pout at her) +んん……(微笑みかける) +(She smirks)|So you're that kind of visitor, huh? +(彼女は微笑みながら問いかけてきた)|そういうタイプのお客さんなのね。 +That's right. How powerful are you? +ええ。あなたは強いの? +(She cracks her knuckles)|I have been practicing the resurrection arts for a thousand years. +(彼女は指をパキパキと鳴らしている)|私は千年もの間、復活の秘術を行使してきた魔法使いよ。 +(She smiles)|All the zombies you seee in the Graveyard?|They are my pets, and I care for each and every one of them. +(彼女は笑顔で説明を始める)|墓地でゾンビを見たでしょう?|彼女たちは大事なペットよ、全員ね。 +What the heck are 'Resurrection Arts'? +復活の秘術って? +It's time for a true display of skill! +今こそ真の実力を見せる時ね +Hmmph. (Look away) +ふんん……(目をそらす) +(She grins)|We'll wipe that pout off your face soon enough... +(彼女は嫌らしい笑みを浮かべる)|すぐにその涎を舐め取ってあげるわ…… +(She frowns)|Well, you will soon. +(彼女は眉をひそめる)|そう、すぐにわかるわ。 +Pfff. Never heard of it. +うーん、そんなの聞いたこともない +I bet I could do better. +私ならもう少し上手にやる +Why does that matter to you? +どうしてそんなことが重要なの? +(Stare at her silently, maintaining your posture) +(姿勢を崩さずに彼女を見つめる) +(She grins)|I am in charge of this place.|Everything that goes through here goes through me.|You may address me as Fuuka Windsong. +(彼女は笑顔を向ける)|私はこの墓地の管理者。|そして抜けるには絶対にここを通らなきゃいけない。|私はフウカ、風の歌と書いてフウカよ。 +By what authority? +何の権限があってこんなことを? +(SPEAKER tilts her head)|Ummmm.... uh...|The Old Civilization! Of course!|I've been keeping their traditions for centuries. +(SPEAKER は言葉をつまらせ、首を傾げる)|それは……えっと……|旧文明よ!そうだわ!|私は何世紀もずっと旧文明の伝統とかを守ってきたのよ! +(SPEAKER blushes)|Umm... That's because...|Oh shut up! +(SPEAKER は赤面している)|えっと、それは……|うるさいわね! +You don't sound too confident. +なんで言い淀んだの? +Who are you anyway? +ところであなたは誰? +Fair enough. I am an adventurer. +まあいいわ、私はただの冒険者よ +(SPEAKER giggles)|Is that a challenge? +(SPEAKER は自信たっぷりに微笑む)|私に戦いを挑むつもり? +(Nod calmly) +(頷く) +(SPEAKER grins)|Is that a challenge? +(SPEAKER ニヤリと笑む)|私に戦いを挑むつもり? +We'll see about that. +ええ、そうよ +Hmmph. (Scoff into your gag) +んん……(猿轡越しに笑う) +It is indeed! +その通りよ +I'm an adventurer, miss. +私はただの冒険者です +Mmmpphh~ (Moan and wiggle seductively) +むぅぅ…… +(She grins)|Oh look at you!|I'm going to dress you up and make you my pet!|You can have all the scritches and snuggles you want!|My name's Fuuka! +(彼女はこちらを見てニッコリと笑む)|あら、随分可愛らしい冒険者ね。|折角ここまで来れたんだし、ご褒美にペットにしていっぱい着飾ってあげるわ。|好きなだけもがいたり叫んだりしていいからね?|私の名前はフウカよ! +A pet? What kind? +ペット? +(SPEAKER hops up and down excitedly)|Oh I've got dresses!|And all sorts of fun gear!|Maybe even this huge gag for you to chew on! +(SPEAKER は興奮に小さく跳ね回る)|素敵なドレスを持っているの!|それに気持ちいいオモチャもいっぱいあるわ!|もちろん大きな猿轡もね! +(SPEAKER grins)|Having second thoughts? +(SPEAKER は笑顔を崩さない)|考え直すのね? +That sounds... harsh. +それは……嫌かな。 +...Maybe +……そう +Exciting! +面白そうね +That sounds great. But who are you miss? +それは面白そうね、ところであなたは何者? +Mmmmph~ +むぅぅ…… +(SPEAKER giggles)|Hehe... We will have so much fun~ +(SPEAKER は悪戯な笑みを浮かべている)|ふふふ、一緒に楽しみましょう。 +(SPEAKER giggles)|You don't have to consent, dear~ +(SPEAKER は悪戯な笑みを浮かべている)|同意する必要なんてないわ。 +I never said I consented to being a pet! +同意した覚えはないけど? +(Give her a puzzled look and shake your head) +(必死に首を横に振る) +No way! +やめて! +(Sigh and shrug) +(ため息をついて肩をすくめる) +(Attack her without saying anything) +(何も言わずに攻撃する) + + +(SPEAKER clears her throat)|I am the one tasked with keeping this graveyard pure and holy.|The reincarnated ones who roam this place do so with my permission.|But what of you? I do not remember striking a deal with you.|Are you here to challenge me? +(SPEAKER は軽く咳払いし、口上を述べる)|我は聖なる墓所を護りし者。|この地を這うもの須く我が従僕たれ、さもなくば神に代わり神罰を下さん。|悍ましき生者よ、貴様が望むのは隷属か!|それとも挑戦か! +I do what I want. +やりたいことをやるだけ +(Glare at her and scoff) +(彼女を睨み、嘲笑する) +(SPEAKER makes a big grin)|I take that you wish to challenge me?|Very well!|Come at me! +(SPEAKER は満面の笑みを浮かべている)|挑戦しにきたのね?|いいわ!|かかってきなさい! +About those 'reincarnated ones'... +"蘇りし者達"について…… +You have no power over me +私のほうが強いわ +Hmmph. (Stand proudly) +ふーっ……(堂々と立つ) +(SPEAKER smiles)|Then let us fight!|If I win, I will make you my pet.|If you win, I will let you pass. +(SPEAKER は好戦的な笑みを浮かべる)|なら戦おうじゃない!|私が勝てばあなたはペット!|あなたが勝てばここを通れる! +I don't want to fight, miss... +戦いたくない…… +Mmph! (Shake your head frantically) +むぅぅぅっ(必死に首を横に振る) +(SPEAKER giggles)|Come now, I want to see how good you are! +(SPEAKER は好戦的な笑みを浮かべる)|あなたの実力を見せてみなさい! +Yes, I am here to fight you. +ええ、あなたを倒しに来た +(SPEAKER smiles)|Then what are we waiting for? +(SPEAKER は好戦的な笑みを浮かべる)|それじゃあ始めましょうか。 + + +You're on! +わかった +Hmmmph! +んぉぉ! +Let us duel! +勝負! +Mmmmmghh! +むぅぅっ! +I suppose... +結局こうなるのね…… + + +(SPEAKER smiles as she stands over you)|Well well. Look who won. +(SPEAKER は厭らしい笑みを浮かべて見下してくる)|勝負あったわね。 +(SPEAKER nods and giggles)|Absolutely.|Allow me to present to you, my prized pet collar!|I save it only for my favorite pets.|That's right! You're my favorite pet now~ +(SPEAKER はクスクスと笑いながら頷く)|もちろん。|ところで、私のお気に入りの首輪を紹介してあげる。|それはね、大事なペットにだけつける首輪なの。|あなたにぴったりだと思わない? +(SPEAKER giggles)|You're not in a position to resist.|Now then, where did I put that collar... +(SPEAKER はニヤニヤと笑っている)|もう抵抗できないわね。|それじゃあ首輪をつけてあげるわ…… +(SPEAKER smiles)|It's a magical spell that seals your power temporarily~|I use it for my pets when they're being unruly...|(She brandishes a collar) Now including you! +(SPEAKER は笑っている)|これには力を封じる特別な魔法が施されているの。|手に負えないペットのために使うのよ。|(彼女は首輪をくるくると回している)|例えばあなたのような、ね。 +What's this weird magic? +何その魔法? +You beat me fair and square. +私の負けね +Mmmph. (Submit) +んぅぅ……(敗北を認める) +You cheated! +ズルいわ! +Mmmph! (Struggle weakly) +んむぅぅ!(もがく) +(Sigh and accept your fate) +(運命を受け入れる) +(Accept the collar eagerly) +(自ら首輪をはめる) +(Accept the collar begrudgingly) +(嫌々従う) +(SPEAKER presents you with your collar...)|(She locks it around your neck)|You are free to go now, dear! +(SPEAKER に首輪をはめられた……)|(首輪は特別な錠でロックされている)|さて、もう行っていいわよ。 + + +(SPEAKER puts up a wall of talismans to regain her strength)|I'm... I'm not finished yet! +(SPEAKER の身体は護符の奔流に包まれ、体力を急速に回復させていった)|まだ……まだ終わってないわ! + + +(SPEAKER is out of breath)|I... can't... believe... it...|She drops her keys... +(SPEAKER は息を切らし、膝を折った)|そんな……信じられない……|(彼女は鍵を落とした) +(SPEAKER looks flabbergasted)|R-really? Okay... I'll give you a reward then... +(SPEAKER はあっけにとられている)|え?本当?わ、わかったわ……それじゃあご褒美をあげるわね…… +(Submit to her anyway) (Gain a special collar) +(彼女に服従し、特別な首輪をもらう) +(SPEAKER resists but ultimately you force a gag into her mouth)|MMMMMPH! +(SPEAKER は抵抗したが、猿轡をかませることに成功した)|っんぐぅ!! +(Gag her) +(猿轡をかませる) + + + + +(This ghost had something to say,|but it appears you've run into a bug instead)|Please report this to Ada18980 on deviantart! +(幽霊は何かを言おうとした。|しかし代わりにバグに遭遇したようだ)|このセリフが表示されたら Ada18980 にご報告ください! + + +(Continue) +(続ける) +(Make a smug face as you walk past) +(ドヤ顔で通り過ぎる) +Thank you! +ありがとう +I don't need your advice, strange ghostly person. +アドバイスはいらないわ + + +Oh, those people that locked you up?|I dealt with them.|Now come along, there's no time to waste! +あら、あなたを監禁していた連中は?|私は彼女たちと取引していたのですが。|まあいいでしょう、来てください、逃してあげますから! +(The SPEAKER giggles)|Treasure? The treasure isn't going anywhere.|Plus, I made a few enemies on the way.|We better not wait till they come back. +(SPEAKER は苦笑している)|宝?宝は逃げませんよ。|それに、ここに来るまでに少し敵を作ってしまいました。|まずは、さっさとここを立ち去るのが吉でしょうね。 +But what about the treasure!? +でも、盗られた宝物は!? +(The SPEAKER ponders your question)|I think we'll have to talk about compensation|AFTER we get out of here. +(SPEAKER は考えている)|あとでしっかりと話し合いましょうか。|もちろん、ここを出てからね。 +So how much is this going to cost me? +それで、いくらかかるの? + + +(You hear footsteps. It's the SPEAKER!)|Why look at you!|Well you seem to be in a bind, don't you? +(足音が聞こえたと思ったら、 SPEAKER が現れた)|あら、どうしてあなたがここに?|ああ、捕まってしまったのですか。 +Not to worry! I'll get you out of here! +心配しないでください!必ず助け出しますから! +Hehe, alright! If that's what you want~ +あら、そうだったんですか?ふふふっ、それじゃあ楽しんでいってくださいね~。 + + +(Shake your head and refuse rescue) +(首を横に振り助けを断る) +Actually I was having fun... +実はこの状況を楽しんでいるから…… + + +(The SPEAKER, your longtime friend, smiles)|Well well, if it isn't you again!|I see that you've decided to challenge the dungeon again.|Don't forget to bring some gold back with you,|there's a fee for rescue~ +(長年の友達 SPEAKER が微笑みかけてきた)|あら、あなたでしたか!|またダンジョンに潜るのですね?|だったらお金を持って帰るのを忘れないでくださいね!|あなたを助けるにもお金が必要ですし。 + + +Can you help with these restraints? +拘束を解いてくれない? +Pfffmmm hhmmph mmph... (Please Help Me) +んぅぅぅ……(助けて) +No can do! Even I can't get those off of you. +ごめんなさい、私にも無理ですね…… + + +Caught by...? +もしこのダンジョンで捕まったら……? +Hah!|You've been here a million times!|You obviously know how dangerous it is, yes? +もう!|あなたは何度もここに来てるじゃないですか!|ここが危険だって十分承知していますよね? +F-fee? There's a fee? +お金?お金を取るの? +Yep! It'll cost ya!|Quite worth it if you ask me.|Unless you'd like to spend the rest of your life in chains! +もちろん!助けるのだってただじゃできませんからね!|でもそれだけの価値はありますよ!|牢屋で永遠に過ごすなんて嫌でしょう? +Will you buy my loot? +戦利品を買い取って +(Show her your loot) +(戦利品を見せる) +Absolutely! I offer the standard market rate for anything.|I'll take enchanted items too!|I've got plenty of volunteers to check for curses~ +もちろん!ちゃんと適正価格ですよ。|エンチャントされたアイテムも買い取りますよ。|呪いをチェックするボランティアはたくさんいるんです。 +Got something you want to show me? +何か見せたいんですか? +(Sell Items) +(アイテムを売る) +(Sell Whole Stacks of Items) +(全部売る) +Daww! What a cutie!|(She smiles and pats your head gently) +あら可愛い!|(彼女は笑顔で優しく頭を撫でてきた) + + +Do you have anything for sale? +何を売っているの? +(Look around for items to buy) +(商品を見る) +I'm sorry sweetie, I don't sell merchandise here.|Who would set up a shop inside a dungeon? That's crazy!|But you adventurers bring in a steady supply of loot,|so if you've got something to sell me, I'll take it off your hands~|You can also talk to my guests, perhaps they have something for you. +ごめんなさい、ここは買い取り専用なんですよ。|ダンジョンの中に店を構えるなんて正気の沙汰ではありませんが、|あなたのような冒険者達が安定して戦利品を運び込んできてくれますから。|なので、何か売りたいものがあったら持ってきてくださいね!|それと、他の商人の方もいらっしゃるので彼女たちとも話してみてくださいね! + + +(Return) +(戻る) + + +(The SPEAKER brings you safely back to her shop)|There! Nice and safe.|Now, as for my fee...|That'll be RESCUECOST gold pieces! +(SPEAKER と共に安全な店にてレポートした)|よし、ここなら安全です!|さてそれで料金なのですが……|RESCUECOST ゴールドいただきますね! + + +Right! Here's RESCUECOST gp. +はい RESCUECOST ゴールド +Mmmph. (Nod your head and pay RESCUECOST gp) +んんぉ(頷き、 RESCUECOST ゴールド渡す) +(The SPEAKER smiles)|Pleasure doing business with ya~ +(SPEAKER は笑顔で見送ってくれた)|今後ともご贔屓に~! + + +Mind adding it to my tab? +ツケ払いはだめ? +(Shake your head regrettably.) +(ツケ払いを要求する) +(The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|But I won't be letting you out of those restraints~ +(SPEAKER は顎をさすっている)|えぇっと……|むー、今回だけですよ!|でも、拘束具は解いてあげませんからね! +(The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|You're a good customer, after all. +(SPEAKER は顎をさすっている)|えぇっと……|むー、今回だけですよ!|なんだかんだであなたは良いお客さんですからね! +(The SPEAKER folds her arms)|Come on now, I can hear the gold jingling in your pocket! +(SPEAKER は腕を組み答える)|じゃあ財布の中身見せてくださいよ。持ってるでしょ! + + +Pretty please? I promise I'll pay you back. +お願い、ちゃんと返すから +(Be insistent) +(しつこく要求する) +(The SPEAKER rubs her chin)|Fine, I believe you.|But I won't be letting you out of those restraints! +(SPEAKER は顎をさすっている)|わかりました、しょうがないですね。|信じますよ!|でも、拘束具は解いてあげませんからね! +(The SPEAKER sighs)|Fine, I believe you.|You better believe I won't forget, though! +(SPEAKER は深くため息をつく)|わかりました、しょうがないですね。|でも、絶対に忘れたりなんかしませんからね? + + +(The SPEAKER folds her arms)|Your adventures have cost me a pretty penny.|I can't stay in business if my clients keep running off without paying.|Look, I'll cut you a deal, you help me, I help you. Fair? +(SPEAKER は腕を組み拒否する)|あなたの冒険のせいで赤字なんです!|お客さんがお金を払わなかったら商売できません!|取引しましょう。私があなたを助けた分、今度はあなたが私を助けてください。これでフェアですよね。 + + +(Help her test cursed armors) +(鎧の試着をする) +(Add cursed restraints as collateral) +(担保として拘束具を身につける) +(Wear a collar to help advertise her business) +(首輪をつけ、商売の手伝いをする) +(Wear a catsuit to help advertise her business) +(キャットスーツを着て、商売の手伝いをする) +(Actually... just pay her the RESCUECOST gold) +(借金 RESCUECOST ゴールド払う) + + +(The SPEAKER holds up a RESTRAINTNAME)|I've bought some armors from an adventurer lately,|but I don't know if they're safe to wear.|Why don't you try it on for me?|I'll postpone your debt for a later time. +(SPEAKER は RESTRAINTNAME を取り出した)|この前他の冒険者の方から鎧を買ったんですけどね、|安全かどうかわからないんですよ。|試着してみてくれませんか?|試してくれれば借金の支払いはまた今度でいいですよ。 +(The SPEAKER holds up a RESTRAINTNAME)|I need to make sure you won't go running off again.|This RESTRAINTNAME here has a special seal on it.|I can get you out of it, of course, but you'll have to pay up first. +(SPEAKER は RESTRAINTNAME を取り出した)|あなたが逃げ出さないようにする必要がありますからね。|この RESTRAINTNAME には特別な封印がされていて、私しか解くことができないんですよ。|解いてほしかったらお金を払ってくださいね! +(The SPEAKER holds up a RESTRAINTNAME)|Your captors are quite the market for high-security restraints.|If you get captured by them, maybe they'll see my logo on this collar!|It's quite comfy and secure,|you'll end up feeling more submissive the more your wear it. +(SPEAKER は RESTRAINTNAME を取り出した)|あなたを捕まえた方々は高品質な拘束具を扱う店に出入りしているようですね。|首輪を付けたあなたが彼女たちに捕まれば、この店のロゴが目に入って宣伝になるでしょう。|安心してください、絶対に外れませんし意外と快適ですから。|身につければ、きっと誰かに服従したくなりますよ。 +(The SPEAKER holds up a RESTRAINTNAME)|Your body looks like a great billboard!|This suit will make you so attractive that nobody will be able to resist!|And in the process of, ahem, examining you,|They'll be sure to see my logo! +(SPEAKER は RESTRAINTNAME を取り出した)|あなたの身体を宣伝に使わせていただきます。|このスーツには魅了の魔法がかかっているんです。|あなたがこのスーツを着れば、他の方々も寄ってくるでしょう。|そしてスーツに書かれたこの店のロゴを見るわけですね。 +(The SPEAKER folds her arms and nods)|Good girl! I knew you would come clean~ +(SPEAKER は腕を組み満足気に頷いた)|あなたならちゃんと返してくれるって信じてましたよ~。 + + +Sure! I accept! +わかった、引き受ける +(Nod in approval) +(引き受ける) +How about something else? +他のは? + + +Excellent! Please hold still~|(She fits the RESTRAINTNAME on and a seal awakens)|Whoops! Good thing I didn't sell that one!|I'll let you keep it, it's my treat~ +よし!それじゃあじっとしていてくださいね~。|(RESTRAINTNAME を着ると、突然封印が浮かび上がった)|あぇっ!?売り物に出さなくて良かったぁ~……|……それは私からのプレゼントです!大事に使ってくださいね? +Excellent! Please hold still~|(She fits the RESTRAINTNAME on and nothing happens)|We have a winner!|You can't have it though, not until you pay up~ +よし!それじゃあじっとしていてくださいね~。|(RESTRAINTNAME を着たが、何も起きなかった)|やった!賭けに勝ちましたね!|あっ、欲しかったらちゃんと買ってくださいね? +Wonderful. I look forward to seeing you being delivered, er, coming back,|Lots of treasure in hand!|(She places the RESTRAINTNAME on you and the seal activates. There is no keyhole.) +わかりました、またここに送られ……返ってくるのを待っていますよ!|たくさんのお宝を持ってね!|(彼女に RESTRAINTNAME を取り付けられ、特別な封印を施される。拘束に鍵穴は見当たらない) +Alright! Why don't you hold still~|(She lifts your hair out of the way and buckles the collar on)|Now go out there and find me some treasure~ +わかりました、それじゃあ動かないでね~。|(首輪を取り付けられた)|さあ、お宝探し頑張ってください! +You're gonna like it, I guarantee it~|(She pulls out the catsuit from a drawer, dusts it off, and helps you in it)|(There is no zipper or fastener, just a very stretchy neck hole)|(Once it's on and well-fitted, you feel the neck grow less loose...)|(...and pulling the rubber away from your skin becomes impossible)|Beautiful. I'm going to let you go now.|I'm sure your new look will attract many customers! +きっと気に入りますよ!|(彼女は引き出しからキャットスーツを取り出し、ホコリを払うとそれを着せてきた)|(ジッパーの類はなく、首周りが伸びるようになっている)|(着終わると、首周りが光出して少し緩くなった……)|(……そして魔法の力か引っ張ってもゴムが肌から離れなくなった)|わぁ、とっても似合っていますよ!それじゃあ、お宝探し頑張ってくださいね!|頑張ってくれればそれだけ客足も伸びますから。 + + +No? That's alright.|I'm sure I'll find someone else to test these on, huehue. +嫌ですか?|それじゃあ別の人に頼みますね。 +Up to you!|You'll still have to pay me eventually~ +そうですか。|でも、払ってもらうまで逃しませんよ? +Your choice~|I am open to further negotiations. +そうですか。|では、他のどれにしますか? +Your choice~|Not everyone is up to putting themselves on display like that~ +そうですか。|こういうのを着て人前に出るのは勇気がいりますからね~。 + + + + +(The SPEAKER pats you down and makes sure you're okay)|I can definitely help with those!|But as you know, I help a lot of adventurers just like you.|You know what, I'll give you a discount!|That'll be RESCUECOST gold pieces! +(SPEAKER はこちらを覗き込み、優しく撫でてくれた)|私なら助けてあげられそうですね!|最近あなたのような冒険者をいっぱい助け出して、儲かっているんです。|だから、安くしてあげますよ!|RESCUECOST ゴールドになります! + + +(The SPEAKER rubs her chin)|Sorry miss!|Cost of doing business, you know?|Why don't you come back with some of that delicious, shiny gold~ +(SPEAKER は顎をさすっている)|ごめんね。|これはビジネスですから。わかってくれますよね?|だからお金をいっぱい持ってきてくださいね~。 +(The SPEAKER folds her arms)|Business is business, miss~ +(SPEAKER は腕を組んでいる)|ビジネスはビジネスです! + + +(The SPEAKER rubs her chin)|No can do.|Rules are rules~ +(SPEAKER は顎をさすっている)|ダメです。|ルールはルールです! +(The SPEAKER sighs)|Business is business, miss~ +(SPEAKER は深い溜め息をついている)|ビジネスはビジネスなんです。 + + +(The SPEAKER reluctantly frees you)|...Fine, I'll cut you a deal.|You help me, I help you. Fair? +(SPEAKER はしぶしぶ解放してくれた)|……もー、わかりましたよ。|ただし、私の要求も聞いてください。いいですね? + + + + + + +The next floor is a normal floor. +この先のフロアは普通だよ。 +This floor is suffering from a slime mold infestation.|Maids have been deployed to deal with the problem.|They could use a hand. +この先のフロアには粘菌が蔓延っているようだね。|対処するためにメイドフォースが派遣されたそうだよ。|彼女たちを上手く利用すれば粘菌掃除も楽になると思うよ。 +This floor is being ransacked by bandits.|They are armed and dangerous.|But I hear there's a bounty on their heads? +この先のフロアは盗賊の根城になっているみたいだね。|彼女たちは武装しているからとても危険だよ。|でも、彼女たちには賞金がかかっているみたいだね。 +A cave dragon was captured in the next floor.|It's brimming with elemental magic,|and there are a lot of interested parties! +この先のフロアで洞窟に潜む竜が捕獲されたみたいだね。|竜の影響で精霊の魔力が暴走しているみたい。|そして興味のある人達も集まっているみたいだよ。 +The witches told me to keep you out.|I'm not exactly capable of doing that,|so feel free to do as you please. +この先のフロアにあなたを進ませないよう魔法使いに言われているんだ。|でも私にそんな力はないよ。|だからお好きにどうぞ。 +The next floor is overgrown.|I'd watch your feet if I were you. +この先のフロアは植物が異常繁殖しているようだね。|私だったら足元に気をつけるよ。 +Slimes, slimes EVERYWHERE!|Fortunately there's a slime-harvesting|operation going on. +この先のフロアはスライムだらけだよ!|幸いスライムを捕獲する方法があるみたいで、|作戦が進行中だよ。 +The trainers are taking their wolfgirls out for a walk.|I'd steer clear.|Unless you want to become one of their pets~ +この先のフロアはウルフガールの散歩道になっているよ。|私ならこの道は避けるね。|ペットになりたいなら行ってみるといいよ。 +Rumor has it that one of the cyber-dolls escaped.|Their handlers are looking for her.|They're catching every young girl they can find! +噂によると、サイバードールの一体がこの先のフロアで逃げ出したみたいだね。|機械が彼女を捕まえようと探し回っているよ。|もっとも、キミみたいな女の子も捕まえようとするみたいだけどね。 +This is totally a normal floor.|No doubt about it. +この先のフロアは普通だよ。|それは間違いない。 + + +This is a debug mode journey for testing the latest region. +デバッグ用だよ。最後に追加されたエリアに行けるよ。 + + +These are the stairs to the tutorial hall. +この先はチュートリアル用エリアだよ。 + + +Congratulations! You've completed the tutorial!|Now get in there and stay out of trouble~ +おめでとう!チュートリアルはこれでクリアだよ!|ダンジョンの中ではトラブルに巻き込まれないようにね~。 + + +Welcome to the dungeon!|Don't panic, this is a turn-based game,|and nothing will happen until you move.|On your left you'll see your character,|displayed with all of the bondage they don't have.|Don't worry, you'll find some soon! +ダンジョンへようこそ!|このゲームはターン制だよ!|キミが動かなければ、敵も動かない。だからまずは落ち着いて。|画面左に見えるキャラクターがキミだよ。|今はまだ、どこも縛られていないみたいだね。|大丈夫、すぐに見つかるから! + + +You might be wondering what all these barrels are for.|Don't worry, they're, uh, totally safe!|When you are inside one you can click on yourself to wait.|Enemies have a hard time seeing you inside a barrel,|so you can wait until they pass by you. +この樽が気になるかい?|心配しないで、まぁ、ほとんどの樽が安全だよ!|まずは樽の中に移動して、入ってみて。それから自分自身をクリックすると、動かずに次のターンに進められるよ。|何かに隠れて動かなければ、敵もキミを見つけにくくなるんだ。|敵をやり過ごしてみよう! + + +On the right you'll see your stats and spells slots.|Your DP, SP, MP, and WP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon. +右に見えるのが、キミのステータスだ。|DP、SP、MP、そしてWPが確認できるね。|その下には、装備している武器が表示されているね。 +Your WP, or willpower, is an important resource.|Without it, escaping from restraints is more difficult.|There is a willpower potion on the floor up there. Go get it! +WPは気力、大事なステータスだ。|気力が低いと、拘束から抜け出しにくくなるよ。|あそこに気力のポーションがあるから、取ってみて! +Oh no! That trap reduced your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack). +おおっと! トラップのせいでWPが減ってしまったようだね!|でも幸運なことにキミはポーションを持っているようだ。|WPの横にある + ボタンを押してごらん。|もしくは、インベントリからも使えるし、|カバンをクリックすればクイックインベントリも開けるよ! +Another trap!|You'll notice that the trap also drained your stamina considerably, preventing you from sprinting or attacking.|(Note: you can toggle sprinting using the '>>' button on the bottom bar)|You can protect yourself while your stamina regenerates by retreating into the room above.|Close the door by clicking the Close Door button in the bottom bar.| +またトラップだ!|SP、スタミナが切れてしまったみたいだね。スタミナがないと、攻撃も走ることもできないよ。|(画面右下の>ボタンを押すと、歩きと走りを変更可能)|上の部屋に逃げて、スタミナが回復するまでじっとしてみて。|ドアを閉じるときは、画面右下にあるドアのアイコンをクリックしてから、画面上のドアがあるマスをクリックしてね。 + + +Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the right menu, then navigate to the Spell Tree.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1. +MP、つまり魔力は魔法を唱えたりする事に減るよ。|魔法を唱えるには、習得しなきゃならないよ。|画面右の魔法ボタンを押せば魔法一覧が表示されるよ。|「スペルツリー」から「火魔術入門」を選んで習得すれば「ファイアボルト」の魔法を習得できるよ。|「ファイアボルト」の魔法を習得したら、スロット1にセットしてみてね! +On the right you'll see your stats and spells slots.|You can click on a spell slot or hit 1-4 on your keyboard to cast a spell|then click on the map for where you want to aim it.|The small wrench icon above them will let you|swap them out for another spell from your spellbook. +画面下にファイアボルトのアイコンが表示されているね。|スペルをクリックするか、対応するキーを押せば魔法を唱えられるよ。|撃ち出したいマスを選択すれば、そこに魔法が飛ぶよ。|ファイアボルトの左にある丸いアイコンを選べば、特定の魔法を強化できるよ。|例えば、ファイアブラストの魔法を習得すれば、ファイアボルトを強化して放つことができるんだ。 +There's a zombie over there!|Fortunately zombies are weak to fire.|Firebolt has a very long range,|so simply cast firebolt and click on the zombie.|Repeat until it is dead. +ゾンビだ!|幸い、ゾンビは火に弱いんだ。|ファイアボルトは遠くまで届くから、|ゾンビに発射してみよう!|あいつが倒れるまで撃ち続けるんだ! +Mana potions restore mana, allowing you to cast spells.|Youll notice that your mana also regenerates slowly.|This mana comes from your mana pool,|which is a thin line displayed under the mana bar.|When that runs out, you can't cast spells anymore! +マナポーションを飲むとマナを回復して、再び魔法を唱えられるようになるよ。|マナは時間とともにマナプールからゆっくり補充されるよ。|マナプールはマナゲージの下にある白い線だよ。|これがなくなると完全にマナが枯渇するから注意してね。 + + +Your DP, or Distraction, is a measure of...|How much you are enjoying things.|These sorts of thoughts cloud your mind,|so spellcasting is more difficult when you are distracted.|Go grab the potion over there. +DPは、つまるところ……|キミがどれだけイきそうになっているか、だね。よくある絶頂ゲージとか快楽ゲージだよ。|蓄積すると集中力がなくなっていって、|魔法を唱えにくくなるんだ。|あのポーションを取ってみて。 +Did you like that?|Anyway, there's a zombie over there. You should drink that potion.|It will clear your mind so you can cast again.|Hurry, or it will get you! +どんな感じ?|ところで、ゾンビがまた来たみたいだね。|ポーションを飲んでみて。|きっとスッキリして、集中力が戻るはずだよ。|さあ、捕まる前に早くするんだ! + + +That wasn't so hard, was it?|Now then, there's a treasure chest over here. Why don't you open it? +ここまでは簡単でしょ?|それじゃああの宝箱を開けてみようか! +Yikes, looks like you're in a bind!|No worries, though. There's a key to those cuffs over there.|Simply hover over the cuffs item test on the left side.|Then, click the lock icon to remove the lock.|Finally, click the buckle to remove the cuffs. +おおっと!手錠が入っていたみたいだね。|でも大丈夫、鍵があれば簡単に開けられるよ。|左にある手錠のアイコンにマウスオーバーしてみて。|すると右側に錠前のアイコンが出るね、そこをクリックすれば鍵を外せるよ。|最後に、バックルのアイコンをクリックすれば手錠を外すことができるよ。 +I think we all know what's in the next chest.|It's important to understand the different ways you can escape.|You can struggle, which costs the most stamina|but makes other struggle methods faster.|You can cut, which requires a knife in hand.|You can remove, which represents untying or unbuckling. +次の宝箱に何が入っているかはなんとなく想像付いたかな?|でも、チュートリアルは大事だからちゃんと開けてみてね!|スタミナを消費すれば、力任せにもがくことができるよ。|でも、他にも方法があるんだ。|さっき使ったバックルのアイコンは取り外す。つまり結び目をほどいたり、バックルを外したり、だね。|他にも、刃物を持てれば拘束具を切ったりもできる。 +Ouch, that looked tight...|Sometimes you won't be able to struggle out of things.|You'll have to find some other way to take it off... +おっと、少しきつすぎるね……|もがいただけじゃ、抜けられそうにないね。|何か周りにないかい?例えばフックとか…… +There's a few zombies up ahead.|Fight your way through and claim the treasure! +この先にゾンビが数人いるね。|戦って戦利品を手に入れようか! + + +You're not feeling it... +何も感じなくなった…… +You close your eyes but the vibrations keep you from dozing off... +目を閉じるが、オモチャから送られてくる快楽のせいで寝付けない……。 + + +(A SPEAKER lies hogtied in front of you)|(She looks at you with pleading eyes,)|(and mumbles incoherently through her gag) +(SPEAKER は手足を縄で繋がれ、目の前に転がっている)|(彼女は懇願するような眼差しをこちらに向け、)|(猿轡越しに何かを叫んでいる。) +(A SPEAKER lies hogtied in front of you)|(She looks at you, mumbling and giggling into her gag) +(SPEAKER は手足を縄で繋がれ、目の前に転がっている)|(彼女はこちらを見つめ、猿轡越しに何かを呟いている。) +(SPEAKER looks grateful)|Thank you so much|I shall join your party. +(SPEAKER は感謝の意を示した)|ありがとう!|一緒に行ってもいい? +(SPEAKER looks grateful)|Thank you so much miss!|I owe you everything. +(SPEAKER は感謝の意を示した)|ありがとうございます!|一生付いていきます! +(SPEAKER groans and wriggles around uselessly) +(SPEAKER はうめき声を上げて、必死にもがいている) +(SPEAKER moans and rolls around, blushing deeply) +(SPEAKER はうめき声を上げて、必死にもがいている) +Untie her +縄を解く +Make sure she is tight and secure +縄をきつくする + + +(A SPEAKER bumps into you while immersed in her thoughts)|Oh! Hello!|Say, you look adorable...|Do you mind helping me find something? +(物思いにふけっている様子の SPEAKER とぶつかった)|おっと、ごきげんよう。|あら、あなたとても綺麗ですわね。|探しものを手伝っていただけません? +(The SPEAKER jumps up and down)|Ah, wonderful!|I've misplaced one of my dresses.|If you could find one, wear it, and bring it to me,|I'd greatly appreciate it! Thanks! +(SPEAKER は喜びに小さく飛び跳ねている)|ありがとうございます!|私、ドレスをどこかになくしてしまいまして。|もし見つかったら、試着して見せてくださらない?|よろしくね。 +(The SPEAKER stares at you like a rabid animal)|Wowie! You look gorgeous!|Thank you so much!|(She snaps a photo of you using a magic crystal) +(SPEAKER は獣のような視線を向けてきた)|まぁまぁ、とってもゴージャスですわ!|ありがとうございます!|(彼女は魔法のクリスタルを使い、写真を撮りだした) +(The SPEAKER giggles)|I never said I'd take it off, did I? +(SPEAKER はニヤニヤと笑っている)|脱がすなんて一言も言っておりませんわよ? +(The SPEAKER smiles)|Sure thing! +(SPEAKER は笑顔で答える)|ええ、もちろん! +(Show interest) +(興味を示す) +I found your dress... +ドレスを見つけてきた…… +Mmmph... (Found the dress!) +んん……(ドレスを見つけてきた) +Great! Can you take it off? +脱ぐのを手伝ってくれない? +Mmmmm! (Struggle) +んぅぅぅ!(もがく) + + +(A SPEAKER clutching her books approaches you)|Miss adventurer!|I happen to need a magic scroll of any kind.|It's for my studies. +(SPEAKER が本を手に近づいてきた)|あの、冒険者さん!|魔法の巻物を分けていただけませんか?|勉強で必要になりまして…… +(The SPEAKER smiles)|Yes, thank you so much!|It's been so difficult to get them lately.|The magic library is closed off these days,|and there are mean people trying to get the scrolls back... +(SPEAKER はニッコリと笑う)|ありがとうございます!|魔法図書館が閉鎖されてから、|全然巻物が手に入らなくて……|しかも、巻物を狙う輩まで現れだしたんですよね…… +(The SPEAKER is happy)|Thank you so much! +(SPEAKER は安堵の表情を浮かべている)|ありがとうございます! +Give her a Scroll of Sauntering +ステップの巻物を渡す +Give her a Scroll of Sleight +奇術の巻物を渡す +Give her a Scroll of Speech +口弁の巻物を渡す +Give her a Scroll of Purity +純潔の巻物を渡す + + +(A SPEAKER looks distraught)|Well met, adventurer!|We have a problem... +(SPEAKER が取り乱した様子で話しかけてきた)|冒険者、ちょっといいか?|手伝ってほしいことがあるんだ…… +(The SPEAKER folds her arms)|A rebel has been causing us problems lately...|If you run into her, give her all you got!|She needs to be brought to justice. +(SPEAKER は腕を組みながら説明する)|最近、ここらへんで逆賊が暴れ回っているんだ……|もし見かけたら捕まえてくれ!|正義の鉄槌を下してやらねばならん…… + + +(A SPEAKER scoffs in your direction)|Well? You lookin' for work or no? +(SPEAKER はこちらを見て笑みを浮かべた)|ごきげんよう、少し手伝っていただけませんか? +(The SPEAKER grins)|A bunch of delinquents stormed out recently.|They're looking for a way out of their belts.|Someone oughta show em their place,|if you catch what I'm saying. +(SPEAKER は笑顔で続ける)|最近、不良達が少々問題を起こしまして。|今、彼女たちは貞操帯の鍵を探し回っているみたいです。|彼女たちに自分の立場を理解させていただきたく、|意味はわかりますよね? + + +(A SPEAKER approaches you in your cell)|Since you've been a bad girl,|we're taking you to the high-security prison. +(SPEAKER が牢屋に入ってきた)|貴様の素行は我々の耳にも届いている。随分と悪事を働いたみたいじゃないか。|そこで、貴様を重罪者用の牢屋に連れて行くことにした。 +(The SPEAKER folds her arms)|Want to or not, you're going. +(SPEAKER は腕を組み威圧してくる)|貴様の意見は聞いていない。行くんだ。 +(Resist) +(抵抗する) +(Submit) +(従う) + + +(A SPEAKER approaches you in your cell)|Looks like you're not in the System.|I'm going to have to take you to sorting. +(SPEAKER が近づいてきた)|あなたはシステムに登録されておりません。|登録のため、移送を開始いたします。 +(The SPEAKER grins as her systems glow)|I love my job sometimes~ +(SPEAKER はかすかに口角を上げ、目を光らせている)|この仕事を選んで良かったです。 +(The SPEAKER grins)|It means you'll get nicely packaged,|so that we can sort you through the System. +(SPEAKER は薄ら笑みを浮かべている)|つまり、あなたを包装します。|そうすれば、システムによりあなたをソートすることができます。 +W-what does that entail? +えっと、つまり? +(The SPEAKER giggles)|That means we'll get to package you up and|decide what to do with you, silly~ +(SPEAKER は酷薄な笑みを浮かべている)|つまり、あなたを包装して|そのあとどうするかを決める、ということです。 +Hmmmph? Mmmm! (Act worried and whimper) +んぅぅ? うぅぅ(不安な素振りを見せる) +(The SPEAKER folds her arms)|Mistress Oriel's orders +(SPEAKER は腕を組み答える)|我らが主"オーリエル"の命令です。 +Not in the 'System'? +それは誰の命令なの? +(The SPEAKER giggles)|Don't worry, we'll get you sorted out soon.|After all, everyone has a place in the System. +(SPEAKER は機械的な笑みを浮かべている)|心配しないでください、|あなたはシステムにより選別され、最適な場所に送られます。 +Mmmph? (Act confused) +むぅぅ?(混乱した素振りを見せる) +(The SPEAKER folds her arms)|Mistress Oriel's orders were clear:|Anyone not logged in the System shall be entered into the System. +(SPEAKER は腕を組み答える)|全ての者を登録すること。|それがオーリエルの命令です。 +(The SPEAKER pauses for a moment, then speaks)|I'm am just following Mistress Oriel's orders.|I'm sure she will have time to speak with you if you want to ask her. +(SPEAKER は少しの間考え込み、答える)|私はオーリエルの命令をこなすだけです。|もし会うことがあれば、あの方が答えてくれるでしょう。 +But why??? +なぜ? +(The SPEAKER frowns)|You should be thankful.|Without Mistress Oriel, we'd all be dead!|Probably... +(SPEAKER はやや不機嫌そうに答える)|あの方がいなければ我々は既に死んでいます。|敬意を持って呼ぶように。 +Who is Mistress Oriel? +オーリエルって何者? +(The SPEAKER pauses for a moment, then answers)|Well, only a few hundred years ago, I think?|This is a bit longer of a downtime than usual,|But all of us are waiting patiently~ +(SPEAKER は少しの間考え込み、答える)|数百年前からだったと記憶しています。|今は休止しておりますが、|我らは皆再開の時を待っています。 +When are these orders from? +いつから命令を実行しているの? +(You anger the SPEAKER. She gags you.)|Unlike you, we were trained not to complain about orders given to us.|So until you receive your training, why don't you be nice and quiet? +(SPEAKER に猿轡をかませられた。彼女を怒らせてしまったようだ)|我々はあなたとは違って辛抱強いのです。|調教の時間まで大人しくしていてください。 +The facility is in ruins! This is pointless! +もう工場は機能していないし、こんなこと無意味よ! + + +(A SPEAKER crosses her arms)|Who you lookin' at?|Oh, it's an adventurer.|Say, you wouldn't be interested|in working with us, would ya? +(SPEAKER は腕を組み佇んでいる)|何見てるんだ?|ああ、冒険者か。|少し話があるんだが。|やってほしいことがあるんだ。 +(The SPEAKER smiles)|That's more like it.|Here's the scoop: One of ours was captured on the next floor.|We need you to go get her out. +(SPEAKER は笑顔で続ける)|よし、いいだろう。|次の階層に私の仲間が囚われているんだ。|どうにかして助け出してやってほしい。 + + +(The SPEAKER sits bound in high-security manacles.|You'll need to open the lock to get her out.) +(SPEAKER は手足を厳重な枷で繋がれている|まずは錠を開ける必要がある) +(You don't have any keys that work on the lock) +(対応する鍵を持っていない) +(You can't help her, bound as tightly as you are...) +(自分がきつく縛られているせいで上手く助けられない……) +(You unlock her, fumbling around for a while with your bound hands) +(縛られた手でなんとか助け出した) +(You unlock the SPEAKER)|Thank you!|Let's get out of here! +(SPEAKER を助け出した)|ありがとう!|ここから逃げよう! +(You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...) +(SPEAKER を助け出した)|むぅぅっ!|(彼女は猿轡を気に入っているようだ) +(You don't have any lockpicks) +(ロックピックを持っていない) +(You try to pick the lock...)|(Click! A safety shield locks securely into place!)|(Looks like the SPEAKER will be staying here for a while...) +(鍵をピッキングしてこじ開けようとするが……)|(失敗して鍵穴のセキュリティが作動してしまった)|(SPEAKER はもうしばらくここにいるしかないだろう……) +(You can't pick the lock with your hands bound) +(手を縛られたままでは上手くロックピックできない) +(After a while, you free the SPEAKER)|Thank you!|Let's get moving! +(錠をこじ開け、 SPEAKER を助け出した)|ありがとう!|さっさと行こう! +(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...) +(錠をこじ開け、 SPEAKER を助け出した)|うぅぅんっ!|(猿轡を外そうとしたが、断られてしまった……) +(You don't have enough mana for a command word) +(コマンドワードを唱えるためのマナが足りない) +(Try as you might, your mouth is sealed tight) +(口を封じられて魔法を唱えられない) +(You utter a command word to free the SPEAKER)|Many thanks!|Let's go! +(コマンドワードを使い SPEAKER を助け出した)|ありがとう!|行こう! +(You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) +(コマンドワードを使い SPEAKER を助け出した)|んんぅ。|(彼女は再び猿轡をロックした……) +(The SPEAKER is locked in high-security manacles.|The safety shield has been triggered, making it impossible to help her.) +(SPEAKER は高度な鍵のかかった枷で繋がれている|鍵なしに助け出すのは難しいだろう) + + +Use a key to unlock her +鍵を使う +Try to pick her restraints (JAMPERCENT jam chance) +ロックピックを使う(JAMPERCENT の確率で失敗) +### Use CMD: Unlock + +Apologize profusely! +謝罪する + + +### (The SPEAKER sits bound in mysterious ASCII glyphs)|(She is bugged and needs your help to get out) + +### (Unlock her and file a bug report to Ada) + + + +### (This SPEAKER is a sub, but not YOUR sub!) + + + +(The SPEAKER sits restrained by your own hand.|Only someone with keys can let her out.) +(SPEAKER が捕まっている。|拘束を解けば、彼女を連れ出せるだろう。) + + +Try to pick her restraints +ロックピックを使う +Return her to your collection +コレクションに移動 +Use a command word +コマンドワードを使う +Flip her around +移動させる +You spin her right round! +彼女を動かした。 + + + + +An enemy found you while you were busy! +敵に見つかってしまった! + + +(A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door) +(SPEAKER が檻を叩き、話しかけてきた)|起きて!ここから抜け出すよ!|(彼女は牢屋の扉をどうにかして開けてくれた) +(A SPEAKER wakes you up by melting the door with acid)|These guys were a piece of cake.|Now let's discover a way out of here! +(SPEAKER が檻を酸で溶かし、話しかけてきた)|こんなの朝飯前さ。|さあ、逃げ道を探すぞ! +(You wake up to find a SPEAKER creeping up outside the door)|You've been marked as a person of interest.|We are here to escort you out of this place. +(ドアの外に SPEAKER が佇んでいた)|あなたは要注意人物としてマークされている。|私達はここからあなたを逃がすよう言われているんだ。 +(A SPEAKER wakes you up by banging on the bars)|Hey wake up!|You should join me and my pals here~|Maybe you'll join them once we're out of here? +(SPEAKER が檻を叩き、話しかけてきた)|起きて!|ここから出してあげるよ~|将来私達のペットになるかもしれないからね? +(A SPEAKER wakes you up by banging on the bars)|I have been sent to inform you...|...that you are of good standing with the Council.|That being said, I'm only doing this because of procedure. +(SPEAKER が檻を叩き、話しかけてきた)|知らせを届けに参りました。|評議会はあなたを評価しているようです。|脱獄を手伝うのも、あくまで手続きのためです。 +(A SPEAKER wakes you up by banging on the bars)|Greetings, follower of the blessed kitty!|Because of your faith, we have been sent to rescue you! +(SPEAKER が檻を叩き、話しかけてきた)|ごきげんよう、バスト教の信者さん!|敬虔な信者のために助けが来たよ! +(You sense a presence nearby and look up to see a SPEAKER)|Because you are one, we have come to free you.|Do not take this as an excuse|to get yourself into further trouble. +(何者かの気配を感じ顔をあげると SPEAKER が佇んでいた)|助けに来ました。あなたは私達の仲間ですから。|とはいえ、脱獄を言い訳にこき使うのはやめてくださいね。|トラブルは御免ですから。 +(A SPEAKER wakes you up with the sound of copious fabric rustling)|Oh why hello there!|Would you be interested in a trial run of my latest product?|Of course, we'll have to get you out of here first... +(目を覚ますと SPEAKER が裁縫していた)|あら、ごきげんよう。|私の最新作に興味がありますの?|では、まずはここから抜け出しましょうか…… +(A SPEAKER wakes you up by banging on the bars)|Hello my pretty~|I thought to myself I'd rather have you than these folk.|Now why don't you come along and follow me... +(SPEAKER が檻を叩き、話しかけてきた)|おはよう。|大事なあなたの為に来てあげたわ。|さあ、付いてきて。 +(A SPEAKER wakes you up by banging on the bars)|Um... hello!|I received a quest to help you out of here!|Now, where do we go... +(SPEAKER が檻を叩き、話しかけてきた)|お、おはようございます……|あなたを助けるよう言われてきました……|えっと、それじゃあどこに行きましょうか…… +(You wake up to find a SPEAKER whispering to you)|Greetings.|We've been sent to free you.|Let's get moving. +(SPEAKER のささやき声で目を覚ました)|ごきげんよう。|あなたを助けるよう言われています。|さあ、行きましょう。 +(A SPEAKER wakes you up by banging loudly)|Hey! Good news!|My friends and I came to rescue you! +(SPEAKER がうるさく檻を叩く音で目を覚ました)|よう、いいニュースだ!|私達が助けに来てやったぞ! +(A SPEAKER wakes you up by knocking on the bars)|Hey, wake up.|I happen to like you, so we're going to get you out of here. +(SPEAKER が檻をノックする音で目を覚ました)|起きて。|あなたのことが好き。だから逃してあげる。 +(A SPEAKER flashes a bright light in your direction)|Prisoner 74121 located. Commence transfer to different location. +(SPEAKER のライトで照らされ、目が覚めた)|囚人74121確認。別ノ牢屋ニ移送シマス。 +(A SPEAKER wakes you up)|We came to rescue you. Come on! +(SPEAKER に起こされた)|助けに来たよ、付いてきて! + + +(The bed looks comfy and inviting)|(Napping here will restore up to half of your willpower and 100% of your max mana)|(You can only sleep once per floor, unless jailed) +(寝心地の良さそうなベッドがある)|(寝ると気力が最大値の半分回復し、マナが最大値まで回復する)|(収監されている場合を除き、各フロア一度までしか寝られない) +(You lay in the bed and doze off...) +(ベッドに横たわり、仮眠を取った) +(Lie down and sleep) +(ベッドで寝る) + + +(There is a pole sticking out of the ground)|(A footrest rises from the floor on either side of the pole)|(This seems like an automated binding system for prisoners...) +(杭が地面から顔を出している)|(杭の左右には、足のマークが付いている)|(囚人を固定する仕掛けのようだ) +(The pole rises and immobilizes you!) +(せり上がってきた杭に動きを封じられてしまった!) +(Stand over it and place your feet in the footrests) +(上に立ってみる) +(Drop off a prisoner from your collection) +(コレクションからディスプレイに閉じ込める) +(Put NME on the stand) (PRCNT% Chance) +(NME をディスプレイに閉じ込める)(PRCNT% で成功) +(Put NME on the stand) +(NME をディスプレイに閉じ込める) +(This is a piece of bondage furniture) +(拘束用のインテリアがある) +(You lock yourself in the furniture!) +(自ら中に入って鍵を閉めた!) +(The SPEAKER slips out of your grip|before you can lock her in place!) +(SPEAKER を閉じ込めようとしたら、抵抗されてしまった) +(Display one of your prisoners) +(捕虜を閉じ込める) +(Lock yourself inside) +(中に入って鍵を閉める) +### (Check the occupant) + +(Try to lock NME into the furniture) (PRCNT% Chance) +(NME を拘束用のインテリアに閉じ込める)(PRCNT% で成功) +(You close the furniture around your unfortunate victim!) +(無理やり拘束具に押し込めた!) +Stun or disable her first. +まずはスタンさせるか武装解除させる必要がある。 +### Area isn't clear. + +(Secure NME into the furniture) +(NME を拘束用インテリアに閉じ込めて完全拘束する) +(You lock her into the furniture so that she stays in place) +(彼女を拘束具に押し込めた) + + +FOODMSG|(It invites you to partake in its culinary delights) +FOODMSG|(とても美味しそうな匂いがする……) +(You eat the food and feel your willpower rising) +(おいしい食べ物を食べて気力が回復した) +(Being gagged as you are you cannot enjoy the food) +(猿轡をかまされている状態では食べられない) +(You steal the food, hoping nobody will notice...) +(誰にも見られていないことを祈りながら、食べ物を盗んだ。) +(Eat it to restore AMOUNT% WP) +(食べ物を食べて AMOUNT% のWPを回復する) +(Take it!) +(手に取る) + + +(Someone left their cookies unattended) +(誰かの残したクッキーがある) +(You smell delicious pizza) +(美味しそうなピザの匂いがする) +Cookie +クッキー +Pizza +ピザ + + +(There is a button on a control panel here.) +(端末にボタンが付いている) +(You touch the button and it glows, releasing a pulse of energy!) +(ボタンを押すと端末が光り出し、エネルギーを発し始めた) +(PUSH THE BUTTON) +(ボタンを押す) + + +(You find a map of the local leylines.)|(Committing these to memory will allow you to harness additional mana.) +(小さなレイラインを見つけた)|(これらを記憶しておくことで、さらにマナを活用することができる) +(Are you sure?)|(This decision is permanent.) +(本当に?)|(この選択は取り消せない) +(Gain +100 to Max Mana Pool) +(マナを回復する) +(I don't want to.) +(今は必要ない) +(No really, I don't want it!) +(本当に必要ない!) + + +(You find a strange elevator with a control panel inside)|(You get the impression this will take you somewhere.) +(端末の付いた奇妙なエレベーターを見つけた)|(これに乗ればどこかに行けそうだ) +(Are you sure?)|(This seems like a bad idea!) +(本当に?)|(とてもいいアイデアとは思えない) +(You activate the control panel and begin to descend...) +(端末を操作すると、エレベーターが下降し始めた……) +(Take me down!) +(降りる) +(I know what I'm doing!) +(降りる) + + +(The conveyor pulls you into a strange elevator)|(A whir of motors suggests this elevator is about to start...) +(コンベアに運ばれて、奇妙なエレベーターに押し込まれた)|(エレベーターが音を立て、動き出そうとしている……) +(You manage to scramble out the door!)|(It closes violently behind you...) +(ドアが閉まり切る前になんとか抜け出すことができた)|(背後でドアの閉まる音が聞こえた……) +(The door slams in front of you before you are able to escape!)|(A purple light turns on, revealing a padded interior)|(You feel the elevator begin to descend...) +(逃げるよりはやく、ドアが眼の前で閉まる)|(紫のランプが、壁一面のパッドを照らした)|(エレベーターがゆっくり降りていくのを感じる……) +(There's no point in fighting when you can't win)|(You wait patiently as the elevator descends) +(どう頑張っても逃げ出すことはできない)|(エレベーターが止まるまで待つことしかできなかった) +(Try to get out! RESISTCHANCE% success chance) +(RESISTCHANCE% で抜け出すことができる) +(Give up and let it take me) +(諦めて流れに身を任せる) +(Wait it out) +(待つ) + + +(Mystic energies spring forth from the ground)|(Standing here will fully replenish your passive mana pool)|(One use only) +(奇妙なエネルギーが地面の亀裂から漏れ出ている)|(ここに立てばマナプールを補充できそうだ)|(一度きりしか使えない) +(You step on the magical fissue and its energies absorb into you)|(Afterward, the ground crackles and fizzles, but no energy is left.) +(亀裂の上に立つと、身体に魔力が流れ込んできた)|(亀裂はマナを出し切ったのか、パチパチと音を立ててはいるが地面から漏れ出る光は失われた) +(Recharge your mana pool) +(マナプールを回復する) + + +Upcast Level LEVEL +強化レベル LEVEL +Prerequisite +前提: +Unlocks: +解放済み: +You need to learn REQUIREDSPELL before you can learn this one. +このスキルを学ぶには REQUIREDSPELL を先に習得する必要がある。 + + +You no longer have the will to struggle. +もがく気力も残っていない。 + + +Help yourself! +食べる +You eat the delicious food and feel your will restored. +おいしい食べ物を食べて気力が回復した。 +Your gag prevents you from eating... +猿轡をかまされている状態では食べられない…… +It's a table. +ただのテーブル +It's a table, with evidence of a grisly deed. +テーブル。何者かが食べ物を持ち去った痕跡がある。 + + +You call for help! +助けを呼んだ! +You let out a garbled cry! +叫び声を上げた! +Your screams are muffled by your gag! +叫び声は猿轡にかき消された! +You can hardly make a noise... +猿轡のせいでくぐもった声しか出せない…… + + +*clink* +カシャッ + + +You yelp as the EnemyName activates your RestraintName +EnemyName が RestraintName を作動させたようだ。 +You shudder as the EnemyName activates your RestraintName +EnemyName が RestraintName を作動させたようだ。 + + +That should slow you down! +これでスピードが落ちるはず! +Try running away now~ +逃げてみなさいよ~ +Initiating prisoner lockdown protocol--Unknown hardware detected +収監プロトコル開始‐‐不明なデバイスを検知。 +What's this do? +これは? +That harness you're wearing is quite convenient for me~ +このハーネス便利なんだよね~。 +Initiating prisoner lockdown protocol +収容プロトコル開始。 +Your RestraintName suddenly snap together as the EnemyName activates them! +EnemyName が RestraintName をアクティブにしたようだ! +Your harness projects energy tethers between your cuffs EnemyName activates it! +EnemyName がハーネスをコントロールし、枷のエネルギーリンクをアクティブにした! + + +Turn Count: +経過ターン: + + +The Shopkeeper leashes you! +店主にリードを掴まれた。 +You are brought into the Shopkeeper's establishment... +お店に連れてこられた…… + + +It seems to be working! The seal on your RESTRAINTNAME is weakened. +効果的だったようだ。 RESTRAINTNAME の封印は弱まった。 +The cursed seal on your RESTRAINTNAME disappears. +RESTRAINTNAME の封印が解けた。 +You are moved along by the conveyor... +コンベアが動いている…… +Strange machinery begins sealing you in shiny latex! +奇妙な機械にゴムを噴射された! +Metallic arms insert something into you! +金属製の腕に何かを挿入された! +Metallic arms attach a chastity belt over your waist! +金属製の腕に貞操帯を取り付けられた! +Metallic arms wrap you in tape! +金属製の腕がテープを巻き付けてきた! +Metallic arms wrap you in strict restraints! +金属製の腕に拘束具を取り付けられた! +Metallic arms install various cybernetic restraints! +金属製の腕に様々な機械の拘束具を取り付けられた! + + +You've sprung a trap! You've been stunned. +罠を踏んでしまった!スタンしてしまった。 +The bandit leaves behind a sneaky trap... +盗賊は罠を仕掛けた…… +Damsel Trap +乙女の罠 + + +The ENEMYNAME transforms nearby dolls into her subjects! +ENEMYNAME が近くの人形を支配下に置いた! + + +You wriggle around while struggling... +身体をくねらせてもがいた…… + + +The missile explodes into a shower of latex that covers you! +ミサイルから飛び出したゴムの雨を浴びてしまった! +Rubber Missile Direct Hit +ラバーミサイルの直撃 +Rubber Missile +ラバーミサイル +Rubber Nuke Direct Hit +ラバーラージミサイルの直撃 +Rubber Nuke +ラバーラージミサイル + + +(In the center of the room stands a woman wearing a latex dress)|(Around her are robotic servants, obeying her without a word)|(She has been watching you this entire time) +(広間の中央に、ラバードレスを着た女性が立っていた)|(周囲の機械は言葉もなしに彼女に従っている)|(彼女は無言でこちらを見つめている) +And who might you be? +あなたは? +(Tilt your head) +(首を傾げる) +(The woman's mask reflects the harsh industrial light)|You don't know who I am?|Hmmph, and I suppose my servants haven't told you...|They call me the Dollmaker. +(女性の顔は光沢のあるマスクで覆われており、表情をうかがい知ることはできない)|私が誰だか知らないのですか?|ふむ、彼女たちから話を聞いていると思いましたが……|私はドールメイカーと呼ばれています。 +So you're the one they talked about. +彼女たちが話していたのはあなたのことだったの +(Nod and continue) +(頷く) +(Tuck your staff behind your back...) +(杖を背中に隠す) +(The Dollmaker points at you)|Is that--? +(ドールメイカーは見逃さなかった)|それは? +(Panic!) +(パニック!) +You must be the Dollmaker. +あなたがドールメイカーね +(The woman chuckles)|Correct.|And you must be the adventurer causing the recent troubles. +(彼女は苦笑いを返す)|いかにも。|そしてあなたは最近問題を起こしている冒険者ですね。 +I'm famous! +有名になれたようね! +Indeed. And I'm here to bring you down. +あなたを倒すために来た +(Scoff at her) +(唸り声を上げる) + + +(The Dollmaker folds her arms)|In any case, your journey ends here.|I do not appreciate scoundrels poking around in my domain.|I will personally lead you to your new future as a doll. +(ドールメイカーは腕を組む)|いずれにせよ、あなたの冒険はここで終わりです。|我が領分を侵すものは誰であろうと決して許しません。|あなたの人生はここで終わり。永遠に人形として私に仕えるのです。 +Do you have the Mistress' Staff? +女王の杖を持ってる? +(The Dollmaker chuckles)|That trinket?|So that's what you're after!|As a matter of fact, I do not have it.|It belongs to a certain Archmagus. +(ドールメイカーは苦笑している)|あんなものを探しているのですか?|あなたの狙いはそれだったのですね。|いえ、私は持っていません。|あれはある大魔術師のものです。 +Then you are of no use to me. +役に立たないわね +(The Dollmaker summons a drone to her side)|Such arrogance! I'll have to teach you some manners! +(突然、ドールメイカーはドローンを召喚した)|傲慢ですね。マナーを教えてあげましょう。 +What a bother. +面倒くさいわね +Who? +誰のこと? +(The Dollmaker explains)|Archmagus Sariel Vinlaga. I'm surprised you didn't know.|Not that it matters for a future doll like you. +(ドールメイカーが説明を始める)|大魔術師、サリエル・ヴィンラーガ。知らないとは驚きです。|とはいえ、あなたには関係ありません。今日ここで人形となるのですから。 +...Sariel Vinlaga. +……サリエル・ヴィンラーガ +(The Dollmaker nods)|Yes. She is down here.|But this information is irrelevant to your future as a doll. +(ドールメイカーは頷き答える)|ええ、彼女はここを下っていきました。|しかし、人形となるあなたには関係ありません。 +The Staff will be mine. +杖は私が手に入れる +Fair enough. Let's fight! +もう十分よ、戦いましょう +We'll see about that! +さっさと始めましょう +Feel free to try. +全力で来なさい +Sounds fun... but I really need to get going. +人形には少し興味があるけど……先に進まなきゃ + + +(The Dollmaker folds her arms as she walks over)|All tight and shiny!|You'll be my prized possession~ +(ドールメイカーが腕を組みながら歩み寄ってきた)|完璧ですね。|あなたは大事に扱ってあげましょう。 +(The Dollmaker nods)|Already eager to obey!|So beautiful... +(ドールメイカーは満足げに頷く)|もう心が折れたのですか。|素敵ですね…… +(The Dollmaker chuckles)|Oh, but I already have~ +(ドールメイカーは苦笑いしている)|そうですか、ですがもう勝負はついていますよ。 +I have no choice but to submit. +選択肢はないみたいね +You will never get away with this! +こんなことをしても逃げられないわ +(Sigh and be forced to wear her visor) +(バイザーを選ぶ) +(Sigh and be forced to wear her mask) +(マスクを選ぶ) +(Sigh and be forced to wear whatever she chooses) +(ドールメイカーに決めさせる) +(The Dollmaker places her visor over your face)|(With a click, you feel its fasteners lock around your head)|Now... as it stands, I have a task for you, doll.|You see, some dolls have been escaping my realm.|I want you to go capture them. +(ドールメイカーにバイザーを被せられた)|(ベルトが後頭部まで伸び、鍵の閉まる音がする)|では、最初の仕事です。|この工場から逃げ出した人形がいます。|彼女を捕まえてきなさい。 + + +(The Dollmaker suddenly teleports away)|Hmmph. Looks like I will have to use my heavy firepower. +(ドールメイカーが突然眼の前から消えた)|ふむ、もっと火力が必要なようですね。 +(The Dollmaker sinks into a puddle of slime and emerges nearby)|(Robotic arms sprout from her back as she storms toward you!) +(ドールメイカーはスライムの海に沈んでいった……)|(が、突然機械の腕を背中に装着した姿で目の前に現れ、突進してきた!) + + +(The Dollmaker concedes defeat)|You have defeated me.|I... I... will let you pass.|(The door exit door unlocks with an audible click) +(ドールメイカーは敗北を認め、膝をついた)|まさか、私が敗れるとは。|……あなたを通しましょう。|(機械音を放ち、次の階層への扉が開いた) +(SPEAKER looks confused)|What are you... Okay, you can have it... +(SPEAKER は混乱しているようだ)|何を……わかりました、あなたがそう言うなら…… +(Wear a doll visor) +(ドールバイザーをつける) +(Wear a doll mask) +(ドールマスクをつける) +(You lift up the dollmaker's mask, revealing a pouting young woman inside)|What are you--|(You insert a gag into her open mouth and she starts mumbling angrily) +(ドールメイカーのマスクを取ると、不満げな顔をしている若い女性と目があった)|な、何を……|(開いた口に猿轡を押し込むと、彼女は怒りにうめき声を漏らす) + + +The Dollmaker calls in drone reinforcements! +ドールメイカーはドローンの増援を呼んだ! +The Dollmaker releases many drones with robotic arms to capture you! +ドールメイカーは大量のドローンを飛ばしてきた! +Zombies emerge from the ground! +ゾンビが地面から這い上がってきた! + + +Cyber Ankle Cuffs +サイバーカフ(足) +Ankle cuffs of exquisite quality, bearing all the marks of Old Civilization technology. +旧文明のテクノロジーが詰まった高品質の足枷。 +Though made of ultra-tough metal, they feel light on your ankles... +極めて硬い金属でできているが、驚くほど軽い足枷。 +An energy link appears, linking your ankles close together! +足枷のエネルギーリンクが起動した! + + +Energy Link +エネルギーリンク(足) +An energy link connecting your ankle cuffs together. +足枷をつなぐエネルギーの鎖。 +It's powered by a chaos-resonance matrix, which can be overloaded by cutting the field. +カオスレゾナンス・マトリックスで動いており、リンクを遮断することでオーバーロードを起こせる。 +The energy link disappears, freeing your ankles! +エネルギーが切れて、足を自由に動かせるようになった! +Your ankles snap together as the cuffs activate! +連結システムが起動して、足枷がピッタリとくっついてしまった! + + +Cyber Cuffs Chain +エネルギーリンク(足/連結) +A magnetic link keeping your ankles tightly connected. +足首のサイバーカフをピッタリとくっつける磁力リンク。 +The cuffs are closely attached, so you can't cut the link apart. +枷同士が密着しており、エネルギーリンクを遮断することができない。 +The ankle cuffs detach with a beep! +足枷が機械音を発し、エネルギーリンクが弱まった! + + +Cyber Leg Cuffs +サイバーカフ(脚) +Thigh cuffs of exquisite quality, bearing all the marks of Old Civilization technology. +旧文明のテクノロジーが詰まった高品質の脚枷。 +Though made of ultra-tough metal, they feel light on your legs... +極めて硬い金属でできているが、驚くほど軽い脚枷。 +An energy link appears, linking your thighs close together! +脚枷のエネルギーリンクが起動した! + + +An energy link connecting your leg cuffs together. +脚枷をつなぐエネルギーの鎖。 +The energy link disappears, freeing your legs! +エネルギーが切れて、脚を自由に動かせるようになった! + + +Cyber Cuffs +サイバーカフ(手首) +Wrist and elbow cuffs of exquisite quality, bearing all the marks of Old Civilization technology. +旧文明のテクノロジーが詰まった高品質の手枷。 +Though made of ultra-tough metal, they feel light on your wrists... +極めて硬い金属でできているが、驚くほど軽い手枷。 +Your wrists are pulled together as the cuffs activate! +手枷のエネルギーリンクが起動した! + + +Cyber Wrist Link +エネルギーリンク(手首) +A magnetic link keeping your wrists secured together. +手のサイバーカフをピッタリとくっつける磁力リンク。 +Your cuffs detatch with a beep! +手枷が機械音を発し、エネルギーリンクが切れた! +Your elbows snap together as the cuffs engage fully! +肘枷のエネルギーリンクが起動した! + + +Cyber Connection +エネルギーリンク(腕) +A magnetic link keeping your wrists and elbows inescapably secured. +手と肘のサイバーカフを接続する磁力リンク。 +Your wrists detatch with a beep, leaving your elbows still bound! +手首のリンクが外れても、肘は繋がったままだ! +Your arms snap fully together as the cuffs activate! +枷の連結システムが起動し、腕が完全に固定されてしまった! + + +Cyber Elbow Link +エネルギーリンク(肘) +A magnetic link keeping your elbows pressed tightly together! +肘のサイバーカフをピッタリとくっつける磁力リンク。 +Your elbows detatch with a beep! +機械音と共に、肘枷のエネルギーリンクが切れた! + + +Doll Gag +サイバードールのボールギャグ +A soft ball pressed against your lips and held in place with metallic straps. +柔らかいボールに金属製のベルトの付いたボールギャグ。 +The straps are made of a flexible metal with no visible seams along the straps. +ベルトは柔軟性のある金属でできており、繋目などは見当たらない。 + + +Doll Plug Gag +サイバードールのプラグギャグ +A soft, flexible plug pressed into your mouth and held in place with a metal shield. +金属製のパネルに柔らかく柔軟な棒の付いたパネルギャグ。 + + +Doll Muzzle +サイバードールのマズル +A metallic shield preventing you from removing any gags underneath. +詰め物を吐き出させないようにする金属製のマズル。 +It's made of exquisite Old Civilization metals, resistant to almost all forms of damage. +旧文明の金属でできており、あらゆるダメージに耐性がある。 + + +Cyber Mittens +サイバーミトン +These mittens force your hands into fists, keeping you from using them to do anything useful. +指を拘束し、道具の利用を制限するミトン。 +It is made of a strong mesh of ancient metallic fiber, kept in place with a metal band. +旧文明の丈夫な金属繊維と金属バンドでできている。 +Cyber Lockdown Mitts +サイバーロックダウンミトン +These long mittens force your hands into fists, keeping you from using them to do anything useful. +指を拘束し、道具の利用を制限する長いミトン。 +It is made of a strong mesh of ancient metallic fiber, wrapped snugly around your arms to make removal by yourself impossible. +旧文明の丈夫な金属繊維が使われている、腕を完璧に覆うミトン。自力で抜け出すのは不可能。 + + +Doll Heels +サイバードールのヒール +A pair of tall heels used to improve the aesthetics and controllability of dolls. +人形の見た目と動きを改善させるヒール。 + + +Cyber Doll Belt +サイバードールの貞操帯 +A chastity belt created by the Old Civilization. Truly a marvel of science! +旧文明の貞操帯。脅威の科学力。 +It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with a advanced form of latex designed for permanent wear. +旧文明の精巧な技術で作られており、あらゆるダメージに耐性がある。内側に特殊なゴム製のパッドが付いており、永続的な着用が可能。 +Cyber Doll Bra +サイバードールの貞操ブラ +A chastity bra created by the Old Civilization. Truly a marvel of science! The flexible material over the breasts hardens when squeezed, unless allowed for by the program. +旧文明の貞操ブラ。脅威の科学力。胸を覆う柔軟な素材はプログラムによって制御されており、一度収縮すると許可がない限り戻らない。 +It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with an advanced form of latex designed for permanent wear. +旧文明の精巧な技術で作られており、あらゆるダメージに耐性がある。内側に特殊なゴム製のパッドが付いており、永続的な着用が可能。 + + +Doll Jacket +サイバードールの拘束衣 +A jacket used to secure particularly unruly dolls. +特に聞き分けのない人形に用いられる拘束衣。 +The material is somehow both stretchy yet hard enough to chip a knife on. The pinnacle of Old Civilization materials science. +身体に張り付く柔軟性とナイフでも傷つけられない硬度を持つ。旧文明の科学の頂点。 + + +Dollmaker's Visor +ドールメイカーのバイザー +A visor used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. +ドールメイカーが人形に指示を与えるためのバイザー。人形を捕獲する任務をこなさなければ、次の階層へつながるドアが開かない。 +It's made of metallic glass, almost indestructible. Fortunately, it's still possible to see through. +金属ガラス製で、破壊することはほぼ不可能。幸いなことに、薄っすらと透けている。 +Dollmaker's Mask +ドールメイカーのマスク +A mask used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. +ドールメイカーが人形に指示を与えるためのマスク。人形を捕獲する任務をこなさなければ、次の階層へつながるドアが開かない。 + + +Detected new hardware. +新たなハードウェアを検知 +[Restriction Protocol] Detected new hardware: RESTRAINTNAME. Install progress: PERCENT% +[拘束プログラム] 新たなハードウェアを検知: RESTRAINTNAME インストール中: PERCENT% +[Restriction Protocol] Installation complete. Completing uniform. +[拘束プログラム] インストール完了。ユニフォーム着用確認。 +[Punishment] Engage mobility restrictions. +[懲罰プログラム] 移動制御プログラム起動。 + + +[Training Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% +[調教プログラム] 新たなハードウェアを検知: RESTRAINTNAME インストール中: PERCENT% +Supplemental Stimulation +補助刺激中 +Endurance Training +耐久トレーニング +Frustration Tolerance +焦らしモード +[Training Protocol] Installation complete. Engage training mode: CHASTITYMODE +[調教プログラム] インストール完了。 CHASTITYMODE モード開始。 +You feel your belt insert new toys into your body... +ベルトが新しいオモチャを挿入する…… + + +[Sensory Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% +[感覚プログラム] 新たなハードウェアを検知: RESTRAINTNAME インストール中: PERCENT% +[Sensory Protocol] Installation complete. Engage sensory restrictions. +[感覚プログラム] インストール完了。感覚制御開始。 + + +[Tracking Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% +[追跡プログラム] 新たなハードウェアを検知: RESTRAINTNAME インストール中: PERCENT% +[Tracking Protocol] Installation complete. Engage tracing system. +[追跡プログラム] インストール完了。追跡システムオンライン。 + + +Your visor dims to help you focus on your task. +バイザーが暗くなり、集中しやすくなった。 + + +Escaped Doll +逃げ出したドール +You return the doll to her rightful owner. +ドールをオーナーの元に送り返した。 + + +Your movement sets off your [RESTRAINTNAME] +[RESTRAINTNAME] によってうまく走れない。 +Your struggling sets off your [RESTRAINTNAME] +[RESTRAINTNAME] によってうまくもがけない。 +Your attack sets off your [RESTRAINTNAME] +[RESTRAINTNAME] によってうまく攻撃できない。 + + +The straps on your gag prevent you from loosening the blindfold! +猿轡のベルトのせいで目隠しを緩ませられない。 +The straps on your gag keep your blindfold securely in place! +猿轡のベルトが目隠しをしっかりと固定している。 + + +Revert +戻す +Confirm Revert? +本当に戻す? +Save +保存 +Save Changes? +この服装を保存する? +Back to Menu +メニューに戻る +Back to Wardrobe +着替えに戻る +Confirm Strip? +服を全て脱ぐ? +Strip! +ストリップ! +Export Outfit +服を読み込む +Export AlwaysDress +服装を読み込む +Export Hair +髪型を読み込む +Export Face +顔を読み込む +Export Cosplay +コスチュームを読み込む + + +Gamma +ガンマ値 +Original Color +ベース色 +Contrast +コントラスト +Brightness +明るさ +Red +赤 +Green +緑 +Blue +青 +Transparency +透明度 +Reset Layer! +色をリセット +Reset Properties! +プロパティをリセット +Export All Layers +レイヤーをエクスポート +Export All Props +プロップをエクスポート +Copy +コピー +Paste +ペースト + + +Items on Ground: +アイテムが落ちている: + + +Preloading Character Assets: +アセットのプリローディング中: + + +### Currently Worn + +Uniforms +衣装セット +Suits +スーツ +Underwear +下着 +Bras +ブラジャー +Bodysuits +ボディスーツ +Socks +靴下 +Shoes +靴 +Tops +トップス +Sleeves +スリーブ +Corsets +コルセット +Skirts +スカート +Pants +ズボン +Accessories +アクセサリー +Fashion Restraints +拘束具(アクセサリー) +Hats +帽子 +Toys and Piercings +オモチャとピアス +Hairstyles +ヘアスタイル +Eyes +目 +Body +身体 +Gloves +グローブ +'Cosplay' +”コスプレ” + + +Cat Eyes +目(猫) +Right Eye +右目 +Left Eye +左目 +Cat Brows +眉(猫) +Right Brow +右眉 +Left Brow +左眉 +Simple Mouth +口(シンプル) +Simple Blush +頬(シンプル) +Blush +頬 +Braid +三つ編み +Braid Front +前 +Braid Back +後 +Bangs Only +前髪のみ +Bangs +前 +Braid+Back +三つ編みと後ろ髪 +Braid Upper +上 +Braid Lower +下 +Back Only +後ろ髪のみ +Ahoge +アホ毛 +Catsuit +キャットスーツ +Torso Lower +胴体下 +Torso Upper +胴体上 +Labcoat +白衣 +Shoulders +肩 +### ShouldersHogtie + +Coat +コート +### CoatHogtieFree + +Cape +ケープ +Pauldrons +肩甲 +Breastplate +胸甲 +PlateBoots +足甲 +BootLeft +ブーツ(左) +BootRight +ブーツ(右) +### BootRightKneel + +### BootLeftHogtie + +Gauntlets +腕甲 +GauntletLeft +腕甲(左) +GauntletRight +腕甲(右) +PlateArmor +プレートアーマー +ChainShirt +鎖帷子のシャツ +ShirtChest +胴体 +Shirt +シャツ +ChainSkirt +鎖帷子のスカート +Skirt +スカート +ChainArmor +鎖帷子 +BanditShorts +盗賊のズボン +### Shorts + +### BanditLeftWrist + +WristLeft +左腕 +### BanditRightWrist + +WristRight +右腕 +BanditWrist +盗賊の腕輪 +BanditBoots +盗賊のブーツ +ShoeLeft +靴(左) +ShoeRight +靴(右) +### ShoeRightKneel + +### ShoeLeftHogtie + +BanditBreastplate +盗賊の胸甲 +Striped Skirt +メイドのスカート +MaidApron +メイドのエプロン +Apron +エプロン +MaidBlouse +メイドのブラウス +Blouse +ブラウス +BlouseBust +ブラウス(胸) +MaidBow +メイドのリボン +Bow +弓 +MaidCorset +メイドのコルセット +Corset +コルセット +MaidCorsetFull +メイドのコルセット(フル) +CorsetStraps +コルセットの装飾 +MaidSockLeft +メイドのソックス(左) +SockLeft +ソックス(左) +MaidSockRight +メイドのソックス(右) +SockRight +ソックス(右) +MaidShoes +メイドの靴 +MaidSocks +メイドの靴下 +Maidforce Agent +メイドフォース +Elven +エルフ +Bunny Suit +バニースーツ +Dress +ドレス +WitchBlouse +魔女のブラウス +BlouseLiner +ブラウス(お腹) +WitchCorset +魔女のコルセット +WitchHat +魔女の帽子 +WitchHatBack +魔女の帽子(後) +ApprenticeHat +見習いの帽子 +ApprenticeHatPuff +ボンボン +WitchShoes +魔女の靴 +WitchSkirt +魔女のスカート +SkirtBelt +スカートベルト +SkirtRuffle +スカートの裾 +Witch +魔女 +WarriorBoots +戦士のブーツ +SportsBra +スポーツブラ +WarriorBustier +戦士のビスチェ +BustierChest +ビスチェ(胴体) +Bustier +ビスチェ +WarriorBelt +戦士のベルト +DragonNecklace +竜のネックレス +Necklace +ネックレス +DragonArmband +竜のアームバンド +Armband +アームバンド +DragonCollar +竜の首輪 +WarriorSkirt +戦士のスカート +Dragonheart +ドラゴンハート +ZombieHat +ゾンビの帽子 +ZombieHatBand +ゾンビの帽子(バンド) +ZombieChestTalisman +ゾンビの胸の御札 +ZombieTalisman +ゾンビの御札 +ZombieTalismanBent +ゾンビの御札(斜め) +Sandals +サンダル +RobeBra +ローブのブラ +RobeSleeveLeft +ローブのスリーブ(左) +SleeveLeft +スリーブ(左) +RobeSleeveRight +ローブのスリーブ(右) +SleeveRight +スリーブ(右) +RobeSleeves +ローブのスリーブ +RobeSleeveDecoLeft +ローブのスリーブ(左)(装飾) +SleeveDecoLeft +スリーブ(左)(装飾) +RobeSleeveDecoRight +ローブのスリーブ(右)(装飾) +SleeveDecoRight +(右)(装飾) +RobeSleevesDeco +ローブのスリーブ(装飾) +Ribbon +リボン +RibbonBelt +リボン(ベルト) +RibbonBack +リボン(後) +RobeSkirt +ローブスカート +Robes +ローブ +Arm Ropes +腕縄 +Upper Chest Strap +胸上のストラップ +Shoulder Straps +肩のストラップ +Lower Chest Straps +胸下のストラップ +Arm Straps +腕のストラップ + + +HairBow +リボン +Bow‎ +リボン +HairBowFrilly +リボン(フリル) +BowFrills +リボン(フリル) +Hairband +ヘアバンド +MaidHairband +メイドのヘアバンド +MaidFrill +メイドのフリル +BackStraight +後-ストレート +Curly +前-くせっ毛 +### Curly_Overstrap + +Fluffy +前-ふわふわ +Fuzzy +色 +### Fuzzy_Overstrap + +FrontStraight +前-パッツン +### FrontStraight_Overstrap + +Straight +前-ストレート +### Straight_Overstrap + +### Long Straight + +StraightBangs +前-ナチュラル +### StraightBangs_Overstrap + +Curly Back +後-くせっ毛 +Messy +ナチュラル +MessyBackShort +後-ナチュラル(短) +Short Messy +ナチュラル(短) +Underlight +影 +CurlyBack +後-くせっ毛 +Ponytail +後-ポニーテール +FluffyPonytail +後-ふわふわポニーテール +Ponytail2 +後-ポニーテール +TwintailLeft +ツインテール(左) +TwintailRight +ツインテール(右) +ArmRight +右腕 +ArmLeft +左腕 +ShoulderRight +右肩 +ShoulderLeft +左肩 +ForeArmRight +右前腕 +ForeArmLeft +左前腕 +HandRight +右手 +HandLeft +左手 +ForeHandRight +右前手 +ForeHandLeft +左前手 +LegLeft +左足 +### FootRightKneel + +### FootLeftHogtie + +LegRight +右足 +Butt +尻 +Eyes2 +左目 +### Whites + +### Whites2 + +HumanEyes +目(人間) +Brows +眉 +Brows2 +眉2 +KjusEyes +目(KjusEyes1) +KjusBrows +眉(Kjus) +KjusMouth +口(Kjus) +KjusBlush +頬(Kjus) +Hikimayu +麻呂眉 +DaskEyes +目(DaskEyes) +ElfEars +エルフ耳 +ElfFront +左耳 +ElfBack +右耳 +ElfEarsLong +エルフ耳(長) +ElfLongFront +左耳 +ElfLongBack +右耳 +ElfEarsFloppy +エルフ耳(垂れ) +ElfFloppyFront +左耳 +ElfFloppyBack +右耳 +ElfEarrings +エルフのイヤリング +ElfEarringsFront +エルフのイヤリング(左) +ElfEarringsBack +エルフのイヤリング(右) +Earrings +イヤリング +EarringsBack +イヤリング +BunnyEars +うさ耳 +EarsInner +内側 +KittyEars +猫耳 +Kitty +耳 +KittyInner +内側 +WolfEars +犬耳 +Wolf +ウルフガール +WolfInner +内側 +FoxEars +キツネ耳 +Fox +耳 +FoxInner +内側 +WolfTail +オオカミの尻尾 +KittyTail +猫の尻尾 +Kitty2Tail +猫又の尻尾 +Kitty2 +尻尾 +FoxTail +キツネの尻尾 +Fox2Tail +キツネの尻尾(2本) +Fox2 +尻尾 +Fox3Tail +キツネの尻尾(3本) +Fox3 +尻尾 +Fox4Tail +キツネの尻尾(4本) +Fox4 +尻尾 +Fox5Tail +キツネの尻尾(5本) +Fox5 +尻尾 +Fox6Tail +キツネの尻尾(6本) +Fox6 +尻尾 +Fox7Tail +キツネの尻尾(7本) +Fox7 +尻尾 +CatsuitLower +キャットスーツ(下半身) +### TorsoLower + +### FootRight + +### FootLeft + +CatsuitUpper +キャットスーツ(上半身) +### TorsoUpper + +TransparentCatsuit +半透明キャットスーツ +### ShortsLeft + +BanditPouch +盗賊のポーチ +Pouch +ポーチ +BanditKnee +盗賊の膝当て +Knee +膝 +BanditChoker +盗賊のチョーカー +Choker +チョーカー +Stripe +ストライプ +### SkirtOver + +### StripeOver + +StockingLeft +ストッキング(左) +### FootSockLeftHogtie + +### StripeSockLeft + +StockingRight +ストッキング(右) +### FootSockRightKneel + +### StripeSockRight + +Stockings +ストッキング +### BlouseLeft + +### BlouseRight + +### SkirtRuffleOver + +LeatherGloveLeft +革のグローブ(左) +GloveLeft +グローブ(左) +### ForeGloveLeft + +### RimGloveLeft + +### RimForeGloveLeft + +### BandGloveLeft + +### BandForeGloveLeft + +LeatherGloveRight +革のグローブ(右) +GloveRight +グローブ(右) +### ForeGloveRight + +### RimGloveRight + +### RimForeGloveRight + +### BandGloveRight + +### BandForeGloveRight + +LeatherGloves +革のグローブ +### RibbonFarBack + +### KiguMask + +### Mask + +### Lock + +### EyesWhites + +Swimsuit +スクール水着 +### SwimsuitChest + +StrappyBra +紐付きブラ +### ChestStrappy + +VBikini +ハイレグビキニ +StrappyBikini +紐付きビキニ +### StrappyLower + +StrappyHarness +紐 +### Strappy + +StrappySwimsuit +紐付き水着 +BunnySockLeft +バニーのソックス(左) +BunnySockRight +バニーのソックス(右) +BunnySocks +バニーのソックス +### BunnySocksRestraint + +BunnyGloveLeft +バニーのグローブ(左) +BunnyGloveRight +バニーのグローブ(右) +BunnyGloves +バニーグローブ +### BunnyGlovesRestraint + +BunnyLeotard +バニースーツ +### Leotard + +### LeotardChest + +LaceCorset +レースのコルセット +### LaceCorsetHardware + +### LaceCorsetStripes + +### LaceCorsetCrystal + +LaceBra +レース付きブラ +### LaceChest + +### LaceChestCups + +### LaceChestStripes + +LaceBustier +レースビスチェ +LaceDeco +ビスチェのリボン +### LaceChestDeco + +### LaceChestDecoCrystal + +### LaceChestDecoHardware + +LaceBraDeco +レースのブラ(装飾) +### LaceCorsetRestraint + +### LaceBustierRestraint + +### LaceBraDecoRestraint + +BowCorsetBow +コルセットの紐 +BowCorsetBust +ブラ +### BowCorsetBustRuffle + +BowCorsetBustBow +ブラ(紐) +BowCorset +コルセット +### BowCorsetRuffle + +BowCorsetLong +ロングコルセット +### BowCorsetLongRuffle + +BowCorsetOverbust +コルセットブラ +BowCorsetLongOverbust +コルセットブラ(長) +BowCorsetOverbustBow +コルセットブラ(紐) +BowCorsetLongOverbustBow +ロングコルセットブラ(紐) +### BowCorsetRestraint + +### BowCorsetBowRestraint + +### BowCorsetOverbustRestraint + +### BowCorsetOverbustBowRestraint + +### BowCorsetLongOverbustRestraint + +### BowCorsetLongOverbustBowRestraint + +LatexCorset +ラテックスのコルセット +### HeavyCorset + +LatexBra +ラテックスのブラ +### ChestHeavyCorset + +LatexBraStraps +ラテックスブラのストラップ +### StrapsHeavyCorset + +LatexBraStrapsCross +ラテックスブラのクロスストラップ +### CrossHeavyCorset + +LatexBustier +ラテックスビスチェ +LatexCorsetFull +ラテックスのコルセット(フル) +LatexCorsetStrap +ラテックスのコルセット(紐) +LatexCorsetFullStrap +ラテックスのコルセット(フル)(紐) +LatexCorsetCross +ラテックスのコルセット(クロス紐) +LatexCorsetFullCross +ラテックスのコルセット(フル)(クロス紐) +### LatexCorsetRestraint + +### LatexBustierRestraint + +### LatexCorsetFullRestraint + +### LatexCorsetStrapRestraint + +### LatexCorsetCrossRestraint + +### LatexCorsetFullStrapRestraint + +### LatexCorsetFullCrossRestraint + +LacePanties +レースのパンツ +LaceCrotchPanel +レースの股引 +### LaceCrotchPanelTrim + +### LaceCrotchPanelLace + +DressSkirt +ドレススカート +BindingDress +拘束ドレス +BlouseCollar +ブラウスの襟 +DressBlouseBust +ブラウス +### BlouseTorso + +BlouseSkirt +ブラウス(下) +### BlouseSkirtOverKneel + +### BlouseNeck + +### DressBlouseBustCropped + +### CroppedBlouseTorso + +DressBlouseSleeveLeft +ブラウスの袖(左) +### BlouseArmLeft + +### BlouseForeArmLeft + +DressBlouseSleeveRight +ブラウスの袖(右) +### BlouseArmRight + +### BlouseForeArmRight + +DressBlouseSleeves +ブラウスの袖 +DressBlouse +ブラウス +Glasses +ゴーグル +### GlassesLens + +MonocleLeft +モノクル(左) +### MonocleLensLeft + +MonocleRight +モノクル(右) +### MonocleLensRight + +DressShoes +ハイヒール +### LeatherMittenLeft + +### LeatherLeft + +### BandLeft + +### LockLeft + +### LeatherMittenRight + +### LeatherRight + +### BandRight + +### LockRight + +### LatexMittenLeft + +### LatexLeft + +### ZipperLeft + +### LatexMittenRight + +### LatexRight + +### ZipperRight + +### LeatherPawMittenLeft + +### PawLeft + +### LeatherPawMittenRight + +### PawRight + +### LeatherMittens + +### LeatherPawMittens + +### LatexMittens + +### LongMittenLeft + +### LongLeft + +### LongMittenRight + +### LongRight + +### LongMittens + +ElfPanties +エルフのパンツ +ElfTop +エルフのトップス +ElfBra +エルフのブラ +ElfCollar +エルフの首輪 +### ElfCollarRestraint + +ElfCirclet +エルフのサークレット +### Circlet + +### Gem + +ElfSkirtBack +エルフのスカート(後) +### SkirtBack + +ElfSkirt +エルフのスカート +### SkirtBand + +ElfShoes +エルフのサンダル +### CrystalShoeLeft + +### CrystalShoeRight + +### ElfBandLeft + +### ElfBandRight + +ElfBands +エルフのアームバンド +### SteelYoke + +### Steel + +### SteelBar + +### RopeCrosstie1 + +### ArmStrap + +### Arm1 + +### ForeArm1 + +### RopeBoxtie1 + +### RopeWristtie1 + +### RopeChestStraps1 + +### Arm2 + +### ForeArm2 + +### RopeBoxtie2 + +### RopeWristtie2 + +### RopeChestStraps2 + +### ArmHarness + +### ArmStrapHarness + +### ArmHarnessUp + +### RopeBoxtie3 + +### RopeWristtie3 + +### RopeCuffs + +Cuffs +枷 +### RopeBelt + +### RopeHarness + +Harness +ハーネス +### HarnessLower + +### HarnessLowerStrap + +### RopeCrotch + +### Crotchrope + +### CrotchropeStrap + +### RopeToes + +### Toe + +### RopeFeet + +### RopeFeetHeavy + +### RopeAnkles1 + +### Calf1 + +### RopeAnkles2 + +### Calf2 + +### RopeAnkles3 + +### Calf3 + +### RopeLegs1 + +### Thigh1 + +### RightThigh1 + +### RopeLegs2 + +### Thigh2 + +### RightThigh2 + +### RopeLegs3 + +### Thigh3 + +### RightThigh3 + +### RibbonCrosstie1 + +### RibbonBoxtie1 + +### RibbonWristtie1 + +### RibbonChestStraps1 + +### RibbonBoxtie2 + +### RibbonWristtie2 + +### RibbonChestStraps2 + +### ArmHarnessUnderbust + +### RibbonCuffs + +### RibbonHarness + +### HarnessMid + +### RibbonCrotch + +### Crotch + +### CrotchStrap + +### RibbonToes + +### RibbonFeet + +### RibbonFeetHeavy + +### RibbonAnkles1 + +### RibbonAnkles2 + +### RibbonAnkles3 + +### RibbonLegs1 + +### RibbonLegs2 + +### RibbonLegs3 + +### ShacklesWristLeft + +### ShacklesWristRight + +### ShacklesWrists + +### ShacklesElbowLeft + +### ElbowLeft + +### ShacklesElbowRight + +### ElbowRight + +### ShacklesElbows + +### ShacklesArms + +### ShacklesAnklesLeft + +### AnkleLeft + +### ShacklesAnklesRight + +### AnkleRight + +### ShacklesAnkles + +### ShacklesThighLeft + +### ThighLeft + +### ShacklesThighRight + +### ThighRight + +### ShacklesThigh + +### ThighLink + +### AnkleLink + +### IronCollar + +### SteelCollar + +### SteelCollarRunes + +### IronBelt + +WolfPanties +オオカミのパンツ +WolfCollar +オオカミの首輪 +### CollarBand + +WolfCollarTag +オオカミの首輪のタグ +### CollarHardware + +### CollarTag + +WolfCollarSmall +オオカミの首輪(小) +### FCollar + +### FCollarBand + +WolfCollarSmallTag +オオカミの首輪のタグ(小) +### FCollarHardware + +### FCollarTag + +### WolfHarnessUpper + +### HarnessUpper + +### HarnessBandUpper + +### WolfHarnessBelt + +### BeltMid + +### BeltBandMid + +### BeltHardwareMid + +### WolfHarnessLower + +### HarnessHardwareMid + +### HarnessBandLower + +### HarnessHardwareLower + +WolfHarness +オオカミのハーネス +### WolfCuffsAnklesLeft + +### BandAnkleLeft + +### WolfCuffsAnklesRight + +### BandAnkleRight + +### WolfCuffsAnkles + +### WolfCollarRestraint + +### WolfCollarTagRestraint + +### WolfCollarSmallRestraint + +### WolfCollarSmallTagRestraint + +### WolfPantiesRestraint + +### WolfHarnessLowerRestraint + +### WolfHarnessUpperRestraint + +### WolfHarnessBeltRestraint + +### WolfHarnessRestraint + +WolfGloveLeft +オオカミのグローブ(左) +WolfGloveRight +オオカミのグローブ(右) +WolfGloves +オオカミのグローブ +WolfSockLeft +オオカミのソックス(左) +WolfSockRight +オオカミのソックス(右) +WolfSocks +オオカミのソックス +### WolfSocksRestraint + +WolfTorsoLower +オオカミのパンツ +WolfTorsoUpper +オオカミのスーツ(上) +WolfHeels +オオカミのヒール +### CuffsWristLeft + +### BandWristLeft + +### HardwareWristLeft + +### CuffsWristRight + +### BandWristRight + +### HardwareWristRight + +### CuffsWrists + +### CuffsElbowLeft + +### BandElbowLeft + +### HardwareElbowLeft + +### CuffsElbowRight + +### BandElbowRight + +### HardwareElbowRight + +### CuffsElbows + +### CuffsArms + +### CuffsAnklesLeft + +### HardwareAnkleLeft + +### CuffsAnklesRight + +### HardwareAnkleRight + +### CuffsAnkles + +### CuffsThighLeft + +### BandThighLeft + +### HardwareThighLeft + +### CuffsThighRight + +### BandThighRight + +### HardwareThighRight + +### CuffsThigh + +### LeatherCollar + +### BandCollar + +### HardwareCollar + +### LeatherCollarBell + +### BellCollar + +### LeatherCollarBow + +### BowBellCollar + +### BowCollar + +### LeatherBelt + +### BandBelt + +### HardwareBelt + +### SlimeMouth + +### FaceMouth + +### SlimeEyes + +### FaceEyes + +### SlimeHead + +### FaceFull + +### SlimeBoots + +### SlimeTorsoLower + +### SlimeThighs + +### SlimeLegs + +### SlimeFeet + +### SlimeArmLeft + +### SlimeArmRight + +### SlimeTorsoUpper + +### SlimeArms + +### SlimeHandLeft + +### SlimeHandRight + +### SlimeHands + +### RubberMouth + +### RubberEyes + +### RubberHead + +### RubberBoots + +### RubberTorsoLower + +### RubberThighs + +### RubberLegs + +### RubberFeet + +### RubberArmLeft + +### RubberArmRight + +### RubberTorsoUpper + +### RubberArms + +### RubberHandLeft + +### RubberHandRight + +### RubberHands + +### TapeMedBoots + +### TapeMedAnkles + +### TapeMedLegs + +### RightLegs + +### StrapCover + +### TapeMedBottom + +### TapeMedArms + +### Top + +### TapeFullArms + +### TopFull + +### ChestFull + +### ArmFullLeft + +### ArmFullRight + +### TapeMedHandLeft + +### TapeMedHandRight + +### TapeHeavyBoots + +### TapeHeavyAnkles + +### TapeHeavyLegs + +### TapeHeavyBottom + +### Bottom + +### TapeHeavyBottomFull + +### TapeHeavyArms + +### TapeHeavyArmsFull + +### TapeHeavyHandLeft + +### TapeHeavyHandRight + +### TapeHeavyHands + +### TapeBoots + +### TapeAnkles + +### TapeLegs + +### TapeBottom + +### TapeTorsoUpper + +### TapeArmLeft + +### TapeArmRight + +### TapeArms + +### TapeStrapArms + +### TopStrap + +### ChestStrap + +### ArmStrapLeft + +### ArmStrapRight + +### TapeStrappedArms + +### TapeHandLeft + +### TapeHandRight + +### BraProto + +### BraProtoLining + +### BraProtoLiningMid + +### BraProtoCups + +### BraProtoDisplay + +### BraProtoLock + +### BraCyber + +### BraCyberLining + +### BraCyberDisplay + +### BraCyberLock + +### ChastityBra + +### BraCups + +### BraLining + +### BraChain + +### BraLock + +### HeartBelt + +### BeltLining + +### BeltLock + +### BeltStrap + +### BeltStrapLining + +### CyberBelt + +### CyberLining + +### CyberDisplay + +### CyberPlug + +### CyberLock + +### ProtoBelt + +### Proto + +### ProtoLining + +### ProtoDisplay + +### ProtoPlug + +### ProtoLock + +### SmoothArmbinder + +### BinderLeft + +### BinderRight + +### Armbinder + +### StrapsLeft + +### StrapsRight + +### ArmbinderCross + +### Cross + +### SmoothArmbinderCross + +### ArmbinderSecure + +### SmoothArmbinderSecure + +### ArmbinderGwen + +### Gwen + +### SmoothArmbinderGwen + +### WolfArmbinder + +### JacketArmbinder + +### BeltsArms + +### Jacket + +### BeltsChest + +### JacketHeavy + +### BinderTorsoLower + +### BeltsTorsoLower + +### CrotchBelts + +### JacketStraps + +### StrapsArms + +### StrapsChest + +### StrapsUnderbust + +### JacketArmbinderSecure + +### JacketBolero + +### ChestBolero + +### JacketLeotard + +### LatexLower + +### LatexChest + +### LatexUpper + +Legbinder +レッグバインダー +### LegLegbinder + +### RightLegbinder + +### LegRightLegbinder + +### LacesLegbinder + +### TapeFace + +### ClothBlindfold + +Cloth +布 +### BlindfoldBasic + +### Basic + +### BasicRim + +### BlindfoldLeather + +### LeatherBase + +### LeatherRim + +### KittyBlindfold + +### KittyEyes + +### BlindfoldTape + +Tape +テープ +BalletHeels +バレエヒール +### BalletLeft + +### BalletRight + +### BalletSoleLeft + +### BalletSoleRight + +### BalletLaceLeft + +### BalletLaceRight + +FlatBalletHeels +平らなバレエヒール +### FlatBalletLeft + +### FlatBalletRight + +ShinyBalletHeels +光沢のあるバレエヒール +### ShinyBalletLeft + +### ShinyBalletRight + +### BalletHeelsRestraint + +### FlatBalletHeelsRestraint + +### ShinyBalletHeelsRestraint + +LeatherHeels +革のヒール +### LeatherLegLeft + +### LeatherLegRight + +TallHeels +ロングヒール +### TallLeft + +### TallRight + +### TallLegLeft + +### TallLegRight + +### TallHeelsRestraint + +### Legirons + +### LegironsLeft + +### LegironsRight + +### Irish8Ankle + +### Irish8AnkleLeft + +### Irish8AnkleRight + +### HandCuffs + +### CuffsLock + +### HingedCuffs + +### Irish8Cuffs + +### WolfCuffs + +### WolfCuffsChain + +### HarnessTop + +### BeltsTop + +### HardwareTop + +### BeltsMid + +### HardwareMid + +### HarnessStrap + +### BeltsStrap + +### HardwareStrap + +### BeltsOverbust + +### BeltsUnderbust + +### HardwareUnderbustOver + +### HardwareUnderbust + +### FutureHarnessChest + +### DisplayChest + +### MetalChest + +### FutureHarnessMid + +### StrapsMid + +### DisplayMid + +### MetalMid + +### FutureHarnessLower + +### StrapsLower + +### DisplayLower + +### MetalLower + +### FutureHarness + +ClothCollar +布の首輪 +ClothCollarTag +布の首輪(タグ付き) +ClothBelt +布のベルト +ClothBeltLines +布のライン付きベルト +### BeltLines + +### MaidGag + +### FrillyPanel + +### FrillyStraps + +### FrillyHardware + +### FrillyHighlights + +### DusterGag + +### Duster + +### GhostGag + +### Ball + +### Strap + +### BallGag + +### BallGagHarness + +### BallGagHarnessSecure + +### SideStrap + +### LargeBallGag + +### LargeBallGagHarness + +### LargeBallGagHarnessSecure + +### PanelGag + +### Panel + +### PanelGagHarness + +### PanelGagHarnessSecure + +### MuzzleGag + +Muzzle +マズル +### MuzzleGagHarness + +### MuzzleGagHarnessSecure + +### PlugGagPlug + +### PlugMuzzleGag + +### PlugMuzzleGagHarness + +### PlugMuzzleGagHarnessSecure + +### PlugPanelGag + +### PlugPanelGagHarness + +### PlugPanelGagHarnessSecure + +### TapeFull + +### TapeWrap + +### Wrap + +### TapeFullOver + +### TapeWrapOver + +### TapeCleave + +### Cleave + +### ClothCleave + +### ClothCleaveThick + +### CleaveThick + +### ClothKnot + +### Knot + +### ClothOTN + +### OTN + +### ClothOTM + +### OTM + +### GagLatex + +### GagLatexFlat + +### OTNFlat + +### GagLatexFlatHarness + +### GagLatexFlatHarnessSecure + +### GagLatexPlug + +### GagLatexPlugHarness + +### GagLatexPlugHarnessSecure + +LatexNeckCorset +ラテックスの首コルセット +### NeckCorset + +### NeckCorsetRim + +### LatexNeckCorsetGag + +### LatexNeckCorsetRestraint + +### LatexNeckCorsetGagRestraint + +### LatexNeckCorsetPlugGag + +### GagMetal + +### GagFabric + +### FabricMuzzle + +### KittyMuzzle + +### KittyMouth + +### Whiskers + +### KittyHarnessPanelGag + +### GagComfy + +### GagMetalRiveted + +### OTNRivets + +### SmoothBallGag + +### SmoothBallGagHarness + +### SmoothBallGagHarnessSecure + +### SmoothLargeBallGag + +### SmoothLargeBallGagHarness + +### SmoothLargeBallGagHarnessSecure + +### SegmentedLargeBallGag + +### SegmentedLargeBallGagHarness + +### SegmentedLargeBallGagHarnessSecure + +### SciFiBallGag + +### TopRim + +### Display + +### EnhancedSciFiBallGag + +### AdvancedSciFiBallGag + +### HarnessRim + +### HarnessDisplay + +### UltimateSciFiBallGag + +### UltimateSciFiBallGag2 + +### SegmentedLargePanelGag + +### SegmentedLargePanelGagHarness + +### SegmentedLargePanelGagHarnessSecure + +### SciFiPanelGag + +### AdvancedSciFiPanelGag + +### UltimateSciFiPanelGag + +### UltimateSciFiPanelGag2 + +### SegmentedPlugGag + +### SegmentedPlugGagHarness + +### SegmentedPlugGagHarnessSecure + +### SciFiPlugGag + +### AdvancedSciFiPlugGag + +### UltimateSciFiPlugGag + +### UltimateSciFiPlugGag2 + +### SimpleSciFiMuzzle + +### AdvancedSciFiMuzzle + +### SciFiPlugMuzzle + +### AdvancedSciFiPlugMuzzle + +### SimpleSciFiMuzzle2 + +### AdvancedSciFiMuzzle2 + +### BeltsArms1 + +### Arms1 + +### LeftArm1 + +### RightArm1 + +### BeltsArms2 + +### Arms2 + +### LeftArm2 + +### RightArm2 + +### BeltsArmsAll + +### BeltsLegs1 + +### Legs1 + +### RightLegs1 + +### BeltsLegs2 + +### Legs2 + +### RightLegs2 + +### BeltsLegsAll + +### BeltsFeet1 + +### Feet1 + +### BeltsFeet2 + +### Feet2 + +### BeltsFeetAll + +### ShadowHandsArms1 + +### ShadowHandsArms2 + +### ShadowHandsArmsAll + +### ShadowHandsLegs1 + +### ShadowHandsLegs2 + +### ShadowHandsLegsAll + +### ShadowHandsFeet + +### ShadowHandsMouth + +### ShadowHandsEyes + +### ShadowHandsCrotch + +### Cage + +### CageFront + +### CageBack + +### SarcoFront + +### SarcoWebs + +### SarcoBack + +### LatexCube + +### LatexCubeBack + +### Barrel + +### DisplayStand + +### DisplayFront + +### OneBarPrison + +### OneBarFront + +### OneBarBack + +### StardustCollar + +### MikoCollar + +FutureCollar +近未来の首輪 +### Future + +### FutureBand + +### FutureDisplay + +### FutureRim + +### FutureLock + +### FutureCollarRestraint + +### ShockModule + +### Module + +### ModuleDisplay + +### TrackingModule + +### TrackingModuleDisplay + +Goggles +ゴーグル +### GogglesRestraint + +FullVisor +バイザー +### DollmakerFull + +FullVisorRim +バイザー(フチ付き) +### DollmakerFullRim + +### FullVisorRestraint + +### FullVisorRimRestraint + +GasMask +ガスマスク +### Valves + +### Center + +### Nose + +### Plugs + +### GasMaskRestraint + +### Petsuit + +### LeftLegs + + + +### Braid_Overstrap + +### BraidBack + +### BackShortMessy + +### BackShortMessyUnderlight + +KjusEyes2 +目(KjusEyes2) +KjusEyes3 +目(KjusEyes3) +KjusEyes4 +目(KjusEyes4) +CatsuitLowerLowRise +キャットスーツ(下半身/ローライズ) +### TorsoLowerLowRise + +SleevelessCatsuitUpper +キャットスーツ(上半身/スリーブなし) +### SleevelessTorsoUpper + +CatsuitTop +キャットスーツ(上/スリーブなし) +### SleevelessTop + +### SleevelessTopChest + +CatsuitTopV +キャットスーツ(上/V/スリーブなし) +### SleevelessTopV + +### SleevelessTopVChest + +CatsuitUpperCropped +キャットスーツ(胸上) +### TorsoUpperCrop + +TransparentCatsuitUpper +半透明キャットスーツ((上半身) +TransparentCatsuitUpperCropped +半透明キャットスーツ(胸上) +TransparentCatsuitLower +半透明キャットスーツ(下半身) +TransparentCatsuitLowerLowRise +半透明キャットスーツ(下半身/ローライズ) +BunnyLeotardHigh +バニースーツ(ハイ) +### HighLeotard + +FashionIronCollar +鉄の首輪 +FashionIronBelt +鉄のベルト +FashionSteelCollarRunes +鋼鉄の首輪(ルーン付き) +FashionSteelCollar +鋼鉄の首輪 +FashionShacklesWristLeft +手枷(左) +FashionShacklesWristRight +手枷(右) +FashionShacklesWrists +手枷 +FashionShacklesElbowLeft +肘枷(左) +FashionShacklesElbowRight +肘枷(右) +FashionShacklesElbows +肘枷 +FashionShacklesArms +腕の枷 +FashionShacklesAnklesLeft +足枷(左) +FashionShacklesAnklesRight +足枷(右) +FashionShacklesAnkles +足枷 +FashionShacklesThighLeft +膝枷(左) +FashionShacklesThighRight +膝枷(右) +FashionShacklesThigh +膝枷 +FashionThighLink +膝枷の鎖 +FashionAnkleLink +足枷の鎖 +FashionLeatherCollar +革の首輪 +FashionLeatherBelt +革のベルト +FashionLeatherCollarBell +首輪(ベル) +FashionLeatherCollarBow +首輪(リボン) +### FashionCuffsWristLeft + +### FashionCuffsWristRight + +### FashionCuffsWrists + +### FashionCuffsElbowLeft + +### FashionCuffsElbowRight + +### FashionCuffsElbows + +### FashionCuffsArms + +### FashionCuffsAnklesLeft + +### FashionCuffsAnklesRight + +### FashionCuffsAnkles + +### FashionCuffsThighLeft + +### FashionCuffsThighRight + +### FashionCuffsThigh + +LatexTop +ラテックスのトップス +### BraProtoLiningRim + +### BraProtoLiningMidRim + +LatexTopZip +ラテックスのトップ(ジッパー) +### BraProtoLiningZip + +### BraProtoLiningMidZip + +### BraProtoLiningZipRim + +### BraProtoLiningMidZipRim + +### FashionGagMetal + +### FashionGagMetalRiveted + +### FashionGagFabric + +### FashionKittyMuzzle + +### FashionSimpleSciFiMuzzle + +### FashionAdvancedSciFiMuzzle2 + +### FashionAdvancedSciFiMuzzle + +### FashionSimpleSciFiMuzzle2 + + + +Hairband2 +ヘアバンド2 +### BraidCustom + +### BraidCustom_Overstrap + +### BraidCustomBack + +### BraidCustomBraid + +### BackShortCurly + +### BackShortCurlyUnderlight + +AuraHair +束ね +### HairAura_Front + +### HairAura + +AuraBang_Left +左髪 +### HairAura_Left + +### HairAura_LeftB + +AuraBang_Right +右髪 +### HairAura_Right + +### HairAura_RightB + +AuraBang_Left_Back +左髪(後) +AuraBang_Right_Back +右髪(後) +Hair2 +お団子 +### Hair2_Front + +### Hair2_FrontB + +### Hair2_FrontC + +Hair2_LeftPuff +左お団子 +### Hair2_Left + +Hair2_RightPuff +右お団子 +### Hair2_Right + +Hair3 +ロングウェーブ +### Hair3_FrontA + +### Hair3_FrontC + +### Hair3_FrontD + +### Hair3_Short + +### Hair3_Bangs + +### Hair3_FrontE + +### Hair3Back + +### Hair3_Back + +Hair4 +ツインテール(長) +### Hair4_Front + +### Hair4_FrontB + +Hair4_TailLeft +ツインテール(長)(左) +### Hair4_Left + +### Hair4_LeftB + +Hair4_TailRight +ツインテール(長)(右) +### Hair4_Right + +### Hair4_RightB + +Hair5 +ツインテール +### Hair5_Front + +### Hair5_FrontB + +### Hair5_FrontC + +Hair5_Highlight +ツインテール(前髪一部) +### Hair5_FrontD + +Hair5_TailLeft +ツインテール(左) +### Hair5_Left + +Hair5_TailRight +ツインテール(右) +### Hair5_Right + +Hair6 +ツインテール(短) +### Hair6_Front + +### Hair6_FrontB + +Hair6_TailLeft +ツインテール(短)(左) +### Hair6_Left + +Hair6_TailRight +ツインテール(短)(右) +### Hair6_Right + +### Butt2 + +### EarsFront + +CatsuitLowerLeotard +キャットスーツ(下半身/レオタード) +### TorsoLowerLeotard + +TransparentCatsuitLowerLeotard +半透明キャットスーツ(下半身/レオタード) +ChainBikini +鎖帷子のビキニ +ChainSkirt2 +鎖帷子のスカート(軽) +### SkirtBeltDeco + +### SkirtBeltRivets + +### Skirt2 + +FashionKiguMask +マスク +SwimsuitUnder +スクール水着(下) +### BunnyLeotardUnder + +BunnyLeotardHighUnder +バニースーツ(ハイ)(下着) +LeatherLeotardTop +革のレオタード(上) +LeatherLeotardBottom +革のレオタード(下) +LeatherLeotardCorset +革のレオタード(コルセット) +### LeotardCorset + +### Laces + +LeatherLeotard +革のレオタード +LeatherLeotardStrapsUpper +革のレオタードのストラップ(上) +LeatherLeotardStrapsLower +革のレオタードのストラップ(下) +### StrapsHardware + +LeatherLeotardStrapsLowerClean +革のレオタードのストラップ(下)(紐) +### StrapsLowerClean + +OperaGloveLeft +オペラグローブ(左) +OperaGloveRight +オペラグローブ(右) +### OperaGloves + +### OperaGlovesRestraint + +SailorCollar +セーラー服(カラー) +### CollarStripe + +### SailorCollarFull + +### Bust + +### BustStripe + +SailorBow +セーラー服(リボン) +SailorTop +セーラー服(袖なし) +SailorSleeveLeft +セーラー服の袖(左) +### HemLeft + +SailorSleeveRight +セーラー服の袖(右) +### HemRight + +SailorSleeves +セーラー服(袖) +SailorShirt +セーラー服(シャツのみ) +Sailor +セーラー服 +DressSkirtSplitNoBelt +ドレススカート(前開き)(ベルト無) +### SkirtSplit + +### SkirtSplitOver + +DressSkirtSplit +ドレススカート(前開き) +### SkirtSplitBelt + +### BlouseSkirtLone + +Sunglasses +サングラス +MageSkirt +メイジのスカート +### Band + +### MageSkirtOver + +MageCorset +メイジのコルセット +### MageCorsetStripes + +MageBra +メイジのブラ +### MageBraStripes + +MageTop +メイジのブラ +MageCollar +メイジの首輪 +### MageCollarCrystal + +### MageCollarHardware + +MageCollar2 +メイジの首輪2 +### MageCollarTie + +Mage +魔法 +ChineseDress +チャイナドレス +### Highlights + +### DressSkirtOverKneel + +ChineseBra +チャイナドレス(ブラ) +ChineseTop +チャイナドレス(上) +YukataWaist +帯 +### Waist + +### WaistBand + +YukataWaistPattern +帯(装飾) +### WaistPattern + +### YukataTop + +YukataSleeveLeft +着物の袖(左) +YukataSleeveRight +着物の袖(右) +YukataSleeves +着物(袖) +YukataShirt +着物(上) +YukataSkirt +着物(下) +Yukata +着物 +YukataPattern +帯(装飾) +### ForeLongMittenLeft + +### ForeLongMittenRight + +FashionLeatherMittens +革のミトン +FashionLeatherPawMittens +革の肉球ミトン +FashionLatexMittens +ラテックスのミトン +FashionLongMittens +ロングミトン +### HeavyYoke + +### HeavySteel + +### HeavySteelPins + +### HeavySteelLock + +### HeavySteelHardware + +### HeavyFiddle + +### FiddleLines + +### FiddleBody + +### FiddleLock + +### BackFiddleLines + +### BackFiddleBody + +### RopeSuspension + +### Suspension + +FashionRopeHarness +縄のハーネス +FashionRopeCrotch +股縄 +FashionRopeChestStraps2 +胸縄 +FashionRibbonHarness +リボンハーネス +FashionRibbonCrotch +股のリボン +### IronCollarClip + +FashionIronCollarClip +鉄の首輪 +### QuakeCollar + +### QuakeCollarRestraint + +BuckleCorset +バックル付きコルセット +### BuckleCorsetBuckles + +### BuckleCorsetHardware + +### BuckleCorsetRestraint + +StripedSkirt +ストライプスカート +### StripedSkirtUnder + +### StripedSkirtOver + +### StripedSkirtUnderOver + +ApronSkirt +エプロンスカート +### MaidSkirt + +### MaidSkirtOver + +### ApronSkirtOver + +### LegRimLeft + +### LegBandLeft + +### LegPadsLeft + +### LegRimRight + +### LegBandRight + +### LegPadsRight + +### TorsoLowerRim + +### TorsoLowerBand + +### TorsoUpperCups + +### ChestRim + +### ChestBand + +### TorsoUpperBand + +### TorsoUpperRim + +### DivineCuffsWristLeft + +### WristLeftDeco + +### WristLeftLock + +### WristLeftLockPlate + +### WristLeftLockBand + +### DivineCuffsWristRight + +### WristRightDeco + +### WristRightLock + +### WristRightLockPlate + +### WristRightLockBand + +### DivineCuffsWrists + +### DivineCuffsElbowLeft + +### ElbowLeftDeco + +### ElbowLeftLock + +### ElbowLeftLockPlate + +### ElbowLeftLockBand + +### DivineCuffsElbowRight + +### ElbowRightDeco + +### ElbowRightLock + +### ElbowRightLockPlate + +### ElbowRightLockBand + +### DivineCuffsElbows + +### DivineCuffsArms + +### DivineCuffsAnklesLeft + +### AnkleLeftDeco + +### AnkleLeftLock + +### AnkleLeftLockPlate + +### AnkleLeftLockBand + +### DivineCuffsAnklesRight + +### AnkleRightDeco + +### AnkleRightLock + +### AnkleRightLockPlate + +### AnkleRightLockBand + +### DivineCuffsAnkles + +### DivineCuffsThighLeft + +### ThighLeftDeco + +### ThighLeftLock + +### ThighLeftLockPlate + +### ThighLeftLockBand + +### DivineCuffsThighRight + +### ThighRightDeco + +### ThighRightLock + +### ThighRightLockPlate + +### ThighRightLockBand + +### DivineCuffsThigh + +### DivineCollar + +### CollarDeco + +### CollarLock + +### CollarLockPlate + +### CollarLockBand + +### DivineBelt + +### BeltMetal2 + +### BeltMetal1 + +### BeltBase + +### BeltPin + +### LockBeltLines + +### LockBeltPlate + +### LockBeltShackle + +### LockBeltHighlight + +### FashionDivineCollar + +### FashionDivineBelt + +### FashionDivineCuffsWristLeft + +### FashionDivineCuffsWristRight + +### FashionDivineCuffsWrists + +### FashionDivineCuffsElbowLeft + +### FashionDivineCuffsElbowRight + +### FashionDivineCuffsElbows + +### FashionDivineCuffsArms + +### FashionDivineCuffsAnklesLeft + +### FashionDivineCuffsAnklesRight + +### FashionDivineCuffsAnkles + +### FashionDivineCuffsThighLeft + +### FashionDivineCuffsThighRight + +### FashionDivineCuffsThigh + +### DivineCuffsCleanWristLeft + +### WristLeftDecoClean + +### DivineCuffsCleanWristRight + +### WristRightDecoClean + +### DivineCuffsCleanWrists + +### DivineCuffsCleanElbowLeft + +### ElbowLeftDecoClean + +### DivineCuffsCleanElbowRight + +### ElbowRightDecoClean + +### DivineCuffsCleanElbows + +### DivineCuffsCleanArms + +### DivineCuffsCleanAnklesLeft + +### AnkleLeftDecoClean + +### DivineCuffsCleanAnklesRight + +### AnkleRightDecoClean + +### DivineCuffsCleanAnkles + +### DivineCuffsCleanThighLeft + +### ThighLeftDecoClean + +### DivineCuffsCleanThighRight + +### ThighRightDecoClean + +### DivineCuffsCleanThigh + +### DivineCollarClean + +### CollarDecoClean + +### DivineBeltClean + +### BeltDecoClean + +### BeltLockPlate + +### BeltLockBand + +### FashionDivineCollarClean + +### FashionDivineBeltClean + +### FashionDivineCuffsCleanWristLeft + +### FashionDivineCuffsCleanWristRight + +### FashionDivineCuffsCleanWrists + +### FashionDivineCuffsCleanElbowLeft + +### FashionDivineCuffsCleanElbowRight + +### FashionDivineCuffsCleanElbows + +### FashionDivineCuffsCleanArms + +### FashionDivineCuffsCleanAnklesLeft + +### FashionDivineCuffsCleanAnklesRight + +### FashionDivineCuffsCleanAnkles + +### FashionDivineCuffsCleanThighLeft + +### FashionDivineCuffsCleanThighRight + +### FashionDivineCuffsCleanThigh + +### SteelCuffsWristLeft + +### RimWristLeft + +### SteelCuffsWristRight + +### RimWristRight + +### SteelCuffsWrists + +### SteelCuffsElbowLeft + +### RimElbowLeft + +### SteelCuffsElbowRight + +### RimElbowRight + +### SteelCuffsElbows + +### SteelCuffsArms + +### SteelCuffsAnklesLeft + +### RimAnkleLeft + +### SteelCuffsAnklesRight + +### RimAnkleRight + +### SteelCuffsAnkles + +### SteelCuffsThighLeft + +### RimThighLeft + +### SteelCuffsThighRight + +### RimThighRight + +### SteelCuffsThigh + +### NeoSteelCollar + +### RimCollar + +### NeoSteelBelt + +### RimBelt + +### FashionNeoSteelCollar + +### FashionNeoSteelBelt + +### FashionSteelCuffsWristLeft + +### FashionSteelCuffsWristRight + +### FashionSteelCuffsWrists + +### FashionSteelCuffsElbowLeft + +### FashionSteelCuffsElbowRight + +### FashionSteelCuffsElbows + +### FashionSteelCuffsArms + +### FashionSteelCuffsAnklesLeft + +### FashionSteelCuffsAnklesRight + +### FashionSteelCuffsAnkles + +### FashionSteelCuffsThighLeft + +### FashionSteelCuffsThighRight + +### FashionSteelCuffsThigh + +### CyberCuffsWristLeft + +### ScreenWristLeft + +### DisplayWristLeft + +### LockWristLeft + +### CyberCuffsWristRight + +### ScreenWristRight + +### DisplayWristRight + +### LockWristRight + +### CyberCuffsWrists + +### CyberCuffsElbowLeft + +### ScreenElbowLeft + +### DisplayElbowLeft + +### LockElbowLeft + +### CyberCuffsElbowRight + +### ScreenElbowRight + +### DisplayElbowRight + +### LockElbowRight + +### CyberCuffsElbows + +### CyberCuffsArms + +### CyberCuffsAnklesLeft + +### ScreenAnkleLeft + +### DisplayAnkleLeft + +### LockAnkleLeft + +### CyberCuffsAnklesRight + +### ScreenAnkleRight + +### DisplayAnkleRight + +### LockAnkleRight + +### CyberCuffsAnkles + +### CyberCuffsThighLeft + +### ScreenThighLeft + +### DisplayThighLeft + +### LockThighLeft + +### CyberCuffsThighRight + +### ScreenThighRight + +### DisplayThighRight + +### LockThighRight + +### CyberCuffsThigh + +### NeoCyberCollar + +### ScreenCollar + +### DisplayCollar + +### LockCollar + +### CyberLinkCollar + +### LinkCollar + +### ScreenLinkCollar + +### DisplayLinkCollar + +### LockLinkCollar + +### NeoCyberBelt + +### ScreenBelt + +### DisplayBelt + +### LockBelt + +### FashionNeoCyberCollar + +### FashionCyberLinkCollar + +### FashionNeoCyberBelt + +### FashionCyberCuffsWristLeft + +### FashionCyberCuffsWristRight + +### FashionCyberCuffsWrists + +### FashionCyberCuffsElbowLeft + +### FashionCyberCuffsElbowRight + +### FashionCyberCuffsElbows + +### FashionCyberCuffsArms + +### FashionCyberCuffsAnklesLeft + +### FashionCyberCuffsAnklesRight + +### FashionCyberCuffsAnkles + +### FashionCyberCuffsThighLeft + +### FashionCyberCuffsThighRight + +### FashionCyberCuffsThigh + +### CrystalCuffsWristLeft + +### CrystalCuffsWristRight + +### CrystalCuffsWrists + +### CrystalCuffsElbowLeft + +### CrystalCuffsElbowRight + +### CrystalCuffsElbows + +### CrystalCuffsArms + +### CrystalCuffsAnklesLeft + +### CrystalCuffsAnklesRight + +### CrystalCuffsAnkles + +### CrystalCuffsThighLeft + +### CrystalCuffsThighRight + +### CrystalCuffsThigh + +### CrystalCollar + +### CrystalBelt + +### FashionCrystalCollar + +### FashionCrystalBelt + +### FashionCrystalCuffsWristLeft + +### FashionCrystalCuffsWristRight + +### FashionCrystalCuffsWrists + +### FashionCrystalCuffsElbowLeft + +### FashionCrystalCuffsElbowRight + +### FashionCrystalCuffsElbows + +### FashionCrystalCuffsArms + +### FashionCrystalCuffsAnklesLeft + +### FashionCrystalCuffsAnklesRight + +### FashionCrystalCuffsAnkles + +### FashionCrystalCuffsThighLeft + +### FashionCrystalCuffsThighRight + +### FashionCrystalCuffsThigh + +### Hobbleskirt + +### FashionBraProto + +### FashionBraCyber + +### FashionChastityBra + +### FashionHeartBelt + +### FashionCyberBelt + +### FashionProtoBelt + +### DivineBeltRunic + +### BeltMetalRunic2 + +### BeltMetalRunic1 + +### FashionDivineBeltRunic + +### DivineBra + +### BraLines + +### BraBase1 + +### BraBase2 + +### BraMetal1 + +### BraMetal2 + +### BraPins + +### BraStraps + +### LockBraLines + +### LockBraPlate + +### LockBraShackle + +### LockBraHighlight + +### FashionDivineBra + +### DivineBraRunic + +### BraMetalRunic1 + +### BraMetalRunic2 + +### BraStrapsRunic + +### FashionDivineBraRunic + +### SteelChastityBelt_Padlock + +### BeltPadlock + +### BeltPadlockPin + +### SteelChastityBelt_Radial + +### BeltRadial + +### SteelChastityBelt_Segu + +### BeltSegu + +### FashionSteelChastityBelt_Padlock + +### FashionSteelChastityBelt_Radial + +### FashionSteelChastityBelt_Segu + +### SteelChastityBra_Padlock + +### BraPadlock + +### BraPadlockPin + +### SteelChastityBra_Radial + +### BraRadial + +### SteelChastityBra_Segu + +### BraSegu + +### FashionSteelChastityBra_Padlock + +### FashionSteelChastityBra_Radial + +### FashionSteelChastityBra_Segu + +### JacketLowerStraps + +### JacketExtraStraps + +### StrapsTorsoLowerExtra + +### CrotchBeltExtra + +### StrapsChestExtra + +### JacketHeavyStraps + +### JacketLower + +### JacketExtra + +### JacketHeavyArmbinder + +### JacketExtraArmbinder + +### JacketHeavyBolero + +### JacketExtraBolero + +### JacketHeavyLeotard + +### JacketExtraLeotard + +### RightLacesLegbinder + +### LegLacesLegbinder + +### FashionClothBlindfold + +### FashionBlindfoldBasic + +### FashionBlindfoldLeather + +### FashionKittyBlindfold + +### FashionBlindfoldTape + +SmoothHeels +シンプルなヒールブーツ +TallBalletHeels +ロングバレエヒール +### TallBalletHeelsRestraint + +CyberBalletHeels +サイバーバレエヒール +### GlowBalletLeft + +### GlowBalletRight + +### CyberBalletHeelsRestraint + +### FashionHarnessTop + +### FashionHarnessMid + +### FashionHarnessStrap + +### FashionHarness + +### LockChest + +### LockMid + +### LockLower + +### FashionFutureHarnessLower + +### FashionFutureHarnessMid + +### FashionFutureHarnessChest + +### FashionFutureHarness + +ClothTop +忍者装束(上) +### TopChest + +### TopShoulders + +ClothBra +忍者装束(上)(下着) +ClothTopBand +忍者装束(ライン)(上) +### TopBandChest + +### TopBandRimChest + +### TopBand + +### TopBandRim + +ClothBraBand +忍者装束(ライン)(上)(下着) +NinjaSkirt +忍者装束(下) +### SkirtBandOver + +NinjaSockLeft +足袋(左) +NinjaSockRight +足袋(右) +NinjaThighLeft +忍びの膝布(左) +NinjaThighRight +忍びの膝布(右) +NinjaKneeLeft +忍びの膝当て(左) +### KneeLeft + +NinjaKneeRight +忍びの膝当て(右) +### KneeRight + +NinjaSocks +足袋 +NinjaThighs +忍びの膝布 +NinjaKnees +忍びの膝当て +NinjaShoes +草履 +Ninja +忍者装束 +### FashionMaidGag + +### FashionDusterGag + +### FashionBallGag + +### FashionBallGagHarness + +### FashionBallGagHarnessSecure + +### FashionPanelGag + +### FashionPanelGagHarness + +### FashionPanelGagHarnessSecure + +### FashionMuzzleGag + +### FashionMuzzleGagHarness + +### FashionMuzzleGagHarnessSecure + +### FashionPlugMuzzleGag + +### FashionPlugMuzzleGagHarness + +### FashionPlugMuzzleGagHarnessSecure + +### FashionPlugPanelGag + +### FashionPlugPanelGagHarness + +### FashionPlugPanelGagHarnessSecure + +### FashionTapeCleave + +### FashionClothKnot + +### FashionClothCleaveThick + +### FashionClothCleave + +### FashionClothOTN + +### FashionClothOTM + +### GagLatexMute + +### MuteLogo + +### GagLatexMuteHarness + +### GagLatexMuteHarnessSecure + +### FashionGagLatex + +### FashionGagLatexFlat + +### FashionGagLatexFlatHarness + +### FashionGagLatexFlatHarnessSecure + +### FashionGagLatexMute + +### FashionGagLatexMuteHarness + +### FashionGagLatexMuteHarnessSecure + +### FashionGagLatexPlug + +### FashionGagLatexPlugHarness + +### FashionGagLatexPlugHarnessSecure + +### FashionLatexNeckCorsetPlugGag + +### FashionKittyHarnessPanelGag + +### FashionSmoothBallGag + +### FashionSegmentedLargePanelGag + +### FashionSegmentedLargePanelGagHarness + +### FashionSciFiPanelGag + +### FashionAdvancedSciFiPanelGag + +### FashionUltimateSciFiPanelGag + +### FashionUltimateSciFiPanelGag2 + +### FashionSegmentedPlugGag + +### FashionSciFiPlugMuzzle + +### FashionAdvancedSciFiPlugMuzzle + +### DivineGag + +### Teeth + +### Metallic + +### FashionDivineGag + +### DivineGagClean + +### GoldClean + +### FashionDivineGagClean + +### DivineMuzzle + +### MuzzleRim + +### MuzzleGold + +### MuzzleHarness + +### MuzzleCollar + +### FashionDivineMuzzle + +### DivineMuzzleClean + +### MuzzleGoldClean + +### FashionDivineMuzzleClean + +### FutureBox + +### Rim + +### Door + +### DoorWindow + +### DoorNumeral + +### BackFade + +### CrystalEncase + +### EncaseOver + +### EncaseUnder + +### FashionLeash + +### ArmsBelts + +### LegsBelts + +### LeftLegsBelts + +### ElitePetsuit + +### ArmsLaces + +### ArmsHardware + +### LegsLaces + +### LegsHardware + +### LeftLegsLaces + +### LeftLegsHardware + +### CyberPetsuit + +### DisplayArms + +### DisplayLegs + +### DisplayLeftLegs + +NippleClamps +ニプルクランプ +### Clamps + +### ClampsBullet + +### NippleClampsRestraint + +RingVibes +リングバイブ +### Rings + +### RingsBullet + +### RingVibesRestraint + +NippleWeights +ニプルウェイト +Weights +重り +### NippleWeightsRestraint + +VibePiercings +バイブピアス +### VibePiercingsBullet + +### VibePiercingsRestraint + +### PostureCollarBasic + +### PostureCollar + +### PostureCollarRim + +### PostureCollarLoop + +### PostureCollarHardware + +### FashionPostureCollarBasic + +### FashionPostureCollar + +### ReverseBinder + +### ReverseBinderLeft + +### ReverseBinderRight + +### ReverseBinderStraps + +### ReverseBinderHardware + +NightWhip +鞭 +### NightWhipLight + +LatexWhip +ラテックスの鞭 +KittyLatexEar +ネコミミヘッドホン +### KittyLatexEarLight + +### KittyLatexEarMuff + +### KittyLatexEarMuffLight2 + +### KittyLatexEarMuffLight1 + +KittyLatexTail +ラテックスの猫の尻尾 +### KittyLatexTailLight + +KittyLatexTail2 +ラテックスの猫の尻尾(2本) +### KittyLatexTail2Light + +KittyLatex +ラテックスキャット +SuccubusWing +サキュバスの翼 +### SuccubusWingBase + +### SuccubusWingBack + +### SuccubusWingLight + +SuccubusHorn +サキュバスの角 +### SuccubusHornRight + +### SuccubusHornLeft + +### SuccubusHornLight + +SuccubusTail +サキュバスの尻尾 +### SuccubusTailLight + +SuccubusClaws +サキュバスの爪 +### SuccubusClawLeft + +### SuccubusClawRight + +SuccubusFeet +サキュバスの足爪 +Succubus +サキュバス +### SlimeBubble + +### BubbleSquishy + +### BubbleSquishyBack + +### LatexSphere + +### LatexSphereCutaway + +### LatexSphereCutawayBack + +### BallSuit + +### BubbleHead + +### FashionBubbleHead + +### BubbleArms + +### BubbleLegs + +### FashionBubbleLegs + + + +### Hair5_FrontE + +### BlankEyes + +### DaiBrows1 + +### DaiBrows2 + +### Glabella + +### Ridge + +### BraRim + +### InnerLines + +### BraUnder + +### BraUnderRim + +### BraStriped + +### Stripes + +### BraCherry + +### Cherry + +### BraRose + +### Rose + +### BraInvertedRose + +### InvertedRose + +### Straps + +### Base + +### Lines + +### PantiesBow + +### PantiesStriped + +### PantiesInvertedRose + +### PantiesCherry + +### PantiesBowStriped + +### PantiesHigh + +### PantiesHighStriped + +### SwimsuitRestraint + +### BlouseShoulderRight + +### SlayerCollar + +### CapeCollar + +### CapeCollarButton + +### CapeCollarRim + +### SlayerCape + +### CapeCollarInner + +### CapeStripe + +### CapeShoulderLeft + +### CapeShoulderRight + +### CapeShoulderLeftButton + +### CapeShoulderRightButton + +### CapeBack + +### LeatherMask + +### Hood + +Gag +猿轡 +### FashionLeatherMask + +### LeatherHood + +### FashionLeatherHood + +### CyberLongMittenLeft + +### CapForeLongMittenLeft + +### CapLongMittenLeft + +### CuffForeLongMittenLeft + +### CuffLongMittenLeft + +### DisplayForeLongMittenLeft + +### DisplayLongMittenLeft + +### LockForeLongMittenLeft + +### LockLongMittenLeft + +### GlowForeLongMittenLeft + +### GlowLongMittenLeft + +### StrapsForeLongMittenLeft + +### StrapsLongMittenLeft + +### UpperCuffLongMittenLeft + +### UpperDisplayLongMittenLeft + +### UpperLockLongMittenLeft + +### UpperGlowLongMittenLeft + +### CyberLongMittenRight + +### CapForeLongMittenRight + +### CapLongMittenRight + +### CuffForeLongMittenRight + +### CuffLongMittenRight + +### DisplayForeLongMittenRight + +### DisplayLongMittenRight + +### LockForeLongMittenRight + +### LockLongMittenRight + +### GlowForeLongMittenRight + +### GlowLongMittenRight + +### StrapsForeLongMittenRight + +### StrapsLongMittenRight + +### UpperCuffLongMittenRight + +### UpperDisplayLongMittenRight + +### UpperLockLongMittenRight + +### UpperGlowLongMittenRight + +### CyberLongMittens + +### CyberMittenLeft + +### MittenLeft + +### ForeMittenLeft + +### CyberMittenRight + +### MittenRight + +### ForeMittenRight + +### CyberMittens + +### CyberArmLeft + +### ArmLongMittenLeft + +### CyberArmRight + +### ArmLongMittenRight + +### UpperCuffForeLongMittenRight + +### CyberArms + +### FashionCyberLongMittens + +### FashionCyberMittens + +### CyberThighLink + +### GlowThighLink + +### CyberAnkleLink + +### GlowAnkleLink + +### FashionCyberThighLink + +### FashionCyberAnkleLink + +### CyberPanties + +### CyberPantiesLining + +### TallSmoothHeels + +### TallSmoothHeelsRestraint + +### NeckCorset2 + +### NeckCorsetRim2 + +### ShinyLatexMuzzle + +### NeckCorsetGag2 + +### NeckCorsetGagRim2 + +### NeckCorsetGag + +### ShinyLatexMuzzleRestraint + +### NeckCorsetRestraint + +### NeckCorsetGagRestraint + +### LatexPetsuit + +### LatexPetsuitGlow + +### GlowArms + +### GlowTorso + +### GlowLegs + +### GlowLeftLegs + +### MiniCape + +### Epaulettes + +### TheRobeOfChastity + +### ChestBase + +### Frill + +### ChestFrill + +### ChestGold + +### Plate + +### ChestPlate + +### GoldBase + +### ChestGoldBase + +### Fabric + +### ChestFabric + +### TheRobeOfChastityRestraint + +### Spats + +### GothicSkirt + +### WaistbandClips + +### Buttons + +### HemLower + +### HemLowerBack + +### HemUpper + +### GothicSkirtLace + +### LaceLower + +### LaceUpper + +### LightMaidKnight_Dress + +### DressChest + +### DressDeco + +### DressDecoBack + +### LightMaidKnight_Bra + +### LightMaidKnight_Top + +### LightMaidKnight_SleeveLeft + +### LightMaidKnight_SleeveRight + +### LightMaidKnight_Sleeves + +### LightMaidKnightHairband + +### Headband + +### HeadbandFrill + +### HeadbandRibbon + +### FootBootLeftHogtie + +### FootShoeLeftHogtie + +### GagNecklace + +### GagNecklaceBall + +### FashionGagNecklace + +### BondageBed + +### BedStraps + +### BedStrapsHogtie + +### LightMaidKnight_Apron + +### ApronChest + +### ApronBack + +### LightMaidKnight_Flower + +### Flower + +### LightMaidKnight_SockRight + +### LightMaidKnight_SockLeft + +### LightMaidKnight_Socks + +### LightMaidKnight_GloveLeft + +### LightMaidKnight_GloveRight + +### LightMaidKnight_Gloves + +### LightMaidKnight_GuardLeft + +### GuardLeft + +### GuardCuffLeft + +### GuardCuff2Left + +### LightMaidKnight_GuardRight + +### GuardRight + +### GuardCuffRight + +### GuardCuff2Right + +### LightMaidKnight_Guards + +### LightMaidKnight_Boots + +### LightMaidKnight_Pauldron + +### PauldronLeft + +### PauldronStrap + +### LightMaidKnight + +### HeavyMaidKnightHairband + +### HeadbandRibbonBack + +### FlowerLeaves + +### HeavyMaidKnight_Dress + +### DressSkirtHem + +### DressSkirtStripe + +### HeavyMaidKnight_SleeveLeft + +### SleeveLeftStripe + +### HeavyMaidKnight_SleeveRight + +### SleeveRightStripe + +### HeavyMaidKnight_ChestArmor + +### ChestArmor + +### HeavyMaidKnight_GloveLeft + +### HeavyMaidKnight_GloveRight + +### HeavyMaidKnight_Gloves + +### HeavyMaidKnight_GauntletLeft + +### HeavyMaidKnight_GauntletRight + +### HeavyMaidKnight_Gauntlets + +### HeavyMaidKnight_PauldronLeft + +### PauldronLeftStraps + +### PauldronLeftHardware + +### HeavyMaidKnight_PauldronRight + +### PauldronRight + +### PauldronRightStraps + +### HeavyMaidKnight_Pauldrons + +### HeavyMaidKnight_SideArmor + +### SideArmor + +### HeavyMaidKnight_Corset + +### HeavyMaidKnight_CorsetRestraint + +### HeavyMaidKnight_Sleeves + +### HeavyMaidKnight_ApronBottom + +### ApronBelt + +### ApronMiniBow + +### ApronCross + +### ApronStripe + +### ApronPattern + +### HeavyMaidKnight_ApronTop + +### ApronChestRuffles + +### ApronChestBelts + +### HeavyMaidKnight_Apron + +### HeavyMaidKnight_WaistBelts + +### BeltsHardware + +### HeavyMaidKnight_WaistPouches + +### Pouches + +### HeavyMaidKnight_Waist + +### HeavyMaidKnight_Boots + +### BootLegLeft + +### BootLegRight + +### HeavyMaidKnight_PantyhoseShorts + +### Pantyhose + +### HeavyMaidKnight_SockRight + +### HeavyMaidKnight_SockLeft + +### HeavyMaidKnight + +### BlondeFront + +### BlondeBangs + +### BlondeBack + +### FangMouth_Double + +### HoodCollar + +### BigBallTeethFang + +### MilitaryJacket_Sleeveless + +### MilitaryUniform_SleeveLeft + +### MilitaryUniform_SleeveRight + +### MilitaryUniform_Sleeves + +### MilitaryJacket + +### WhiteGloveLeft + +### WhiteGloveRight + +### WhiteGloves + +### UniformShirt_Sleeveless + +### UniformShirt_SleeveLeft + +### UniformShirt_SleeveRight + +### UniformShirt_Sleeves + +### UniformShirt + +### MilitaryUniform_Hat + +### Hat + +### HatRim + +### HatCap + +### HatGloriousInsignia + +### HatGloriousInsigniaHS + +### MilitaryUniform_Earphones + +### Headgear + +### HeadgearUnit + +### HeadgearEars + +### HeadgearEarsInner + +### HeadgearBack + +### MilitaryUniform_Searchlight + +### SearchlightPouch + +### Searchlight + +### SearchlightBase + +### SearchlightLens + +### MilitaryUniform_BeltPouch + +### BeltPouch + +### BeltPouchRim + +### MilitaryUniform_Webbing + +### Webbing + +### WebbingSide + +### WebbingHardware + +### WebbingName + +### WebbingUnderbust + +### WebbingUnderbustHardware + +### MilitaryUniform_Skirt + +### MilitaryUniform_Shoes + +### MilitaryUniform_TightsShorts + +### MilitaryUniform_SockLeft + +### MilitaryUniform_SockRight + +### Tights + +### MilitaryUniform_Hairpin + +### Hairpin + +### MilitaryUniform + +### ShirtSleeveLeft + +### ShirtForeArmLeft + +### ShirtSleeveRight + +### ShirtForeArmRight + +### ShirtShoulderRight + +### ShirtDress + +### ShirtDressChest + +### RubyNecklace + +### RubyChain + +### RubyRing + +### RubyGem + +### RubyNecklaceRestraint + +### SigilNecklace + +### SigilChain + +### SigilDisc + +### SigilNecklaceRestraint + +### MetalNecklace + +### MetalChain + +### MetalDisc + +### MetalNecklaceRestraint + +### NecklaceCharm + +### DragonNecklaceRestraint + +### BallTeeth + +### CrystalBallGag + +### CrystalBallGagSmooth + +### GagMetalRivetedStrap + +### OTNStrap + +### OTNStrapRivets + +### FashionGagMetalRivetedStrap + +### CrystalGagNecklace + +### CrystalGagNecklaceBall + +### FashionCrystalGagNecklace + +### LeashCollar + +### LeashCollarHardware + +### BootShoeLeft + +### BootShoeRight + +### Fear + +### RubyHardware + +### KiguMaskSmile + +### MouthSmile + +### FashionKiguMaskSmile + +### OneBarTop + +### OneBarPrisonLatex + + + +### FangMouth + +### FanglessMouth + +### SantaHat + +### HatBack + +### Fluff + +### Orb + +### FestiveArmbinder + +### BinderStrapLeft + +### BinderFluffLeft + +### FestiveHarnessTop + +### StrapTop + +### ButtonsTop + +### FuzzTop + +### FestiveHarnessMid + +### StrapMid + +### ButtonsMid + +### FuzzMid + +### FestiveHarnessStrap + +### StrapBot + +### ButtonsBot + +### FuzzBot + +### FestiveHarness + +### StrapOverbust + +### StrapUnderbust + +### ButtonsUnderbustOver + +### ButtonsUnderbust + +### FuzzUnderbustOver + +### FuzzUnderbust + +### FashionFestiveHarnessTop + +### FashionFestiveHarnessMid + +### FashionFestiveHarnessStrap + +### FashionFestiveHarness + +### FrillyHeadband + +### HeadbandBand + +### HeadbandBow + +### BowHeadband + +### BowHeadbandFrill + +### BackHime + +### HimeBack + +### BackShort + +### BackFlat + +### Bob + +### BobFront + +### FrontStraight2 + +### FrontStraight2_Front + +### FrontStraight2_Overstrap + +### FrontSwept + +### FrontSweptSide + +### Vents + +### VentL + +### VentR + +### VentsInnerR + +### VentsInnerL + +### VentsFront + +### BigBraidBack + +### CurlyPonytail + +### DrillLeft + +### DrillRight + +### Twindrills + +### Twintails + +### PointyAhoge + +### RoundHat + +### HatTop + +### TopHatSmall + +### TopHatSmallBow + +### BlondeFrontM + +### BlondeBangsM + +### BlondeBackM + +### Mascara + +### MascaraL + +### MascaraR + +### Scar + +### PointyAntennae + +### AnthenaL + +### AnthenaR + +### PointyHorns + +### HornL + +### HornR + +### PointyTail + +### Tail + +### WolfEars2 + +### EarLeft + +### EarRight + +### HairclipDual + +### HairclipLower + +### HairclipUpper + +### ChainPanties + +### PantiesChain + +### ChainPanties2 + +### KittyPetCuffsWristLeft + +### KittyPetCuffsWristRight + +### KittyPetCuffsWrists + +### KittyPetCuffsElbowLeft + +### KittyPetCuffsElbowRight + +### KittyPetCuffsElbows + +### KittyPetCuffsArms + +### KittyPetCuffsAnklesLeft + +### KittyPetCuffsAnklesRight + +### KittyPetCuffsAnkles + +### KittyPetCuffsThighLeft + +### KittyPetCuffsThighRight + +### KittyPetCuffsThigh + +### KittyPetCuffsCollar + +### FashionKittyPetCuffsCollar + +### FashionKittyPetCuffsWristLeft + +### FashionKittyPetCuffsWristRight + +### FashionKittyPetCuffsWrists + +### FashionKittyPetCuffsElbowLeft + +### FashionKittyPetCuffsElbowRight + +### FashionKittyPetCuffsElbows + +### FashionKittyPetCuffsArms + +### FashionKittyPetCuffsAnklesLeft + +### FashionKittyPetCuffsAnklesRight + +### FashionKittyPetCuffsAnkles + +### FashionKittyPetCuffsThighLeft + +### FashionKittyPetCuffsThighRight + +### FashionKittyPetCuffsThigh + +### KittyPawCuffsWristLeft + +### KittyPawCuffsWristRight + +### KittyPawCuffsWrists + +### KittyPawCuffsElbowLeft + +### KittyPawCuffsElbowRight + +### KittyPawCuffsElbows + +### KittyPawCuffsArms + +### KittyPawCuffsAnklesLeft + +### KittyPawCuffsAnklesRight + +### KittyPawCuffsAnkles + +### KittyPawCuffsThighLeft + +### KittyPawCuffsThighRight + +### KittyPawCuffsThigh + +### FashionKittyPawCuffsWristLeft + +### FashionKittyPawCuffsWristRight + +### FashionKittyPawCuffsWrists + +### FashionKittyPawCuffsElbowLeft + +### FashionKittyPawCuffsElbowRight + +### FashionKittyPawCuffsElbows + +### FashionKittyPawCuffsArms + +### FashionKittyPawCuffsAnklesLeft + +### FashionKittyPawCuffsAnklesRight + +### FashionKittyPawCuffsAnkles + +### FashionKittyPawCuffsThighLeft + +### FashionKittyPawCuffsThighRight + +### FashionKittyPawCuffsThigh + +### KittyPetLeotardUnder + +### LeotardStripes + +### LeotardChestStripes + +### KittyPetLeotard + +### KittyPetLeotardRestraint + +### KittyPetUniformCollar + +### LeotardChestCollar + +### LeotardChestCollarLeft + +### LeotardChestCollarStripes + +### LeotardChestCollarStripesLeft + +### CollarDecoSymbol + +### ShoulderCuffLeft + +### ShoulderCuffStripeLeft + +### ShoulderCuffRight + +### ShoulderCuffStripeRight + +### KittyPetTail + +### TailStripe + +### KittyPetBlindfold + +### BlindfoldRim + +### BlindfoldBrow + +### FashionKittyPetBlindfold + +### KittyPetSteelCollar + +### FashionKittyPetSteelCollar + +### KittyPetMittenLeft + +### GloveLeftPaw + +### ForeGloveLeftPaw + +### KittyPetMittenRight + +### GloveRightPaw + +### ForeGloveRightPaw + +### KittyPetMittens + +### FashionKittyPetMittenLeft + +### FashionKittyPetMittenRight + +### FashionKittyPetMittens + +### KittyPetEars1 + +### Ears1L + +### Ears1R + +### Ears1InnerL + +### Ears1InnerR + +### KittyPetEars2 + +### Ears2L + +### Ears2R + +### Ears2InnerL + +### Ears2InnerR + +### KittyPetEarmuffs + +### EarmuffersL + +### EarmuffersR + +### KittyPetEarmuffsRestraint + +### KittyPetEars1Restraint + +### KittyPetEars2Restraint + +### KittyPetGag + +### GagCollar + +### KittyPetGagSeamless + +### GagSeamless + +### KittyPetGagMouth + +### GagMouth + +### KittyPetGagMouthSeamless + +### GagMouthSeamless + +### FashionKittyPetGag + +### FashionKittyPetGagSeamless + +### FashionKittyPetGagMouth + +### FashionKittyPetGagMouthSeamless + +### KittyPetsuit + +### ArmsPaws + +### LeftLegsPaws + +### FootLeftHogtiePaws + +### KittyPetSockLeft + +### SockLeftPaws + +### KittyPetSockRight + +### KittyPetSocks + +### KittyPetSocksRestraint + +### KittyPetPawLeft + +### KittyPetPawRight + +### KittyPetPaws + +### KittyPetPawsRestraint + +### KittyPetPawShortLeft + +### KittyPetPawShortRight + +### KittyPetPawsShort + +### KittyPetPawsShortRestraint + +Hide Items +アイテムを非表示 +Sort Items +アイテムをソート +Drop Items +アイテムを地面に置く +Filter Items +フィルター +Rarity +レア度 +Magical +魔法 +Knives +ナイフ +Potions +ポーション +Power +エネルギー +Find In Inventory +インベントリ内を検索 + + +A huge rubber cube rises up out of the floor! +大きな箱型のゴムが湧き出てきた! +The latex cube hardens into a solid, harmless entity. +ラテックスキューブは固まり、ただの置物となった。 +The latex cube slowly engulfs you! (DamageTaken) +ラテックスキューブがゆっくり飲み込んでくる! (DamageTaken) +The latex cube touches you, spreading latex restraints across your body! (+RestraintAdded) +ラテックスキューブに触れられた箇所からゴムが広がっていく! (+RestraintAdded) + + +A small rubber cube rises up out of the floor! +小さな箱型のゴムが湧き出てきた! +Mini Latex Cube +小さなラテックスキューブ +The mini latex cube hardens into a solid, harmless entity. +小さなラテックスキューブは固まり、ただの置物となった。 +The mini latex cube sticks to you! (DamageTaken) +小さなラテックスキューブがくっついてきた! (DamageTaken) +The mini latex cube expands across your body, taking the form of restraints! (+RestraintAdded) +小さなラテックスキューブが広がり、身体に取り付いてきた! (+RestraintAdded) + + +Gigantic Slime +ギガントスライム +The gigantic slime fizzles as its body becomes unstable! +ギガントスライムは身体を維持できなくなり、四散した! +The gigantic slime stretches a pseudopod and engulfs you! (+RestraintAdded) +ギガントスライムが体を伸ばし、包み込んできた! (+RestraintAdded) +The gigantic slime slowly engulfs you! (DamageTaken) +ギガントスライムにゆっくりと飲み込まれる! (DamageTaken) +A group of slimes jump out! +スライム達が飛び出してきた! +A slime jumps out! +スライムが飛び出してきた! +A group of speedy slimes jump out! +素早いスライム達が飛び出してきた! +A speedy slime jumps out! +素早いスライムが飛び出してきた! + + +Chain Sword +チェーンソード +Cut through their defenses and tie them up in the process! +切断と拘束を同時に行う剣。 +Deals slash damage. Adds 10 metal binding. +斬撃属性。10の金属属性拘束値を与える。 +You pick up sword with a bunch of chains attached. +鎖の巻き付いた剣を拾った。 + + +Slime Sword +スライムソード +It wiggles as you move it around. +振ると刀身がうねうねと動く。 +Deals glue damage. Adds 25 slime binding. +ねばねば属性。25のスライム属性拘束値を与える。 +You pick up slime-covered sword. +スライムに覆われた剣を拾った + + +Frost Blade +フロストブレード +As cold as its creator. +造り手のように冷たい。 +Deals 20 bonus ice damage and briefly slows the target. +攻撃時20の氷属性追加ダメージを与え、減速状態にする。 +You pick up an icy sword. +冷たい剣を手に入れた。 + + +Targe +盾 +Hide behind it while you still can. +防げる攻撃は防いでおこう。 ++60 Block. Deals crush damage and stuns for 4 turns. Offhand: Gives the same block bonus. Offhand bonuses from shields do not stack with a currently equipped shield. +打撃属性。装備時ブロック値+60。攻撃が命中した時、4ターンの間スタンさせる。サブウェポン:メイン装備時と同等のブロック値を得る。この効果はメインに装備している武器のブロック値と重複しない。 +You pick up a wooden shield. +木の盾を拾った。 + + +Tower Shield +タワーシールド +Now with more leg room. +体全体を防御できる大盾。 +Slows you down by 1 level. +120 Block, +30 Physical Armor. Deals crush damage and stuns for 7 turns. Offhand: Slows you and gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. +打撃属性。装備時ブロック値+120、物理アーマー+30。減速値1を得る。攻撃が命中した時、7ターンの間スタンさせる。サブウェポン:メイン装備時と同等のブロック値、アーマー、減速値を得る。この効果はメインに装備している武器のブロック値と重複しない。 +You pick up a metal tower shield. +金属で補強された大きな盾を拾った。 + + +Reinforced Shield +強化シールド +New and improved, but also clumsier. +新たに金属の補強が追加された盾。少し扱いにくい。 ++80 Block, +15 Physical Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. +打撃属性。装備時ブロック値+80、物理アーマー+15。攻撃が命中した時、5ターンの間スタンさせる。サブウェポン:メイン装備時と同等のブロック値とアーマーを得る。この効果はメインに装備している武器のブロック値と重複しない。 +You pick up a reinforced shield. +金属で補強された盾を拾った。 + + +Runic Shield +ルーンシールド +For when you've been tied up one too many times... +何度も縛られたあなたに…… ++80 Block, +20 Magic Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. +打撃属性。装備時ブロック値+80、魔法アーマー+20。攻撃が命中した時、5ターンの間スタンさせる。サブウェポン:メイン装備時と同等のブロック値とアーマーを得る。この効果はメインに装備している武器のブロック値と重複しない。 +You pick up a runic shield. +ルーンの刻まれた盾を拾った。 + + +Vanish +バニッシュ +Make the targeted creature invisible, making you totally invisible for Duration turns. Attacking and casting spells reveals your presence but you are still harder to see. +対象と自身を透明にする。 Duration ターンの間継続し、攻撃または詠唱を行うと透明化は解除されるが、見えにくい状態になる。 + + +The slime dissolves your clothing, leaving nothing but rubber against your skin... +スライムが服を溶かし、後にはゴムだけが残った…… + + +Riposte +リポスト +Blocking an enemy attack makes them vulnerable and stuns them briefly. +敵の攻撃をブロックした際、敵は無防備になり数ターンの間スタンする。 +Parry +パリィ ++15 Block while holding a weapon. +武器を装備している間、ブロック値+15 +Dagger Parry +ダガーパリィ ++15 Block while holding a light weapon such as a knife or dagger. +小さな装備をしている間、ブロック値+15 +Steadfast Guard +堅牢 ++5 Block for each 100 max willpower you have, while holding a non-light weapon. +軽くない武器を持っており、気力が最大の時、ブロック値+5。 +The Power of Steel +鉄の力 ++5 Block for each 100 max willpower you have, while holding a weapon that deals physical damage. +物理属性の武器を持っており、気力が最大の時、ブロック値+5。 +Secure Defense +堅忍不抜 ++15-30 Block, based on your percentage of Willpower. +気力の量に応じて、ブロック値+15~30。 + + +You block the EnemyName attack! +EnemyName の攻撃をブロックした! +You block EnemyName! +EnemyName をブロックした! +You dodge EnemyName! +EnemyName を回避した! +You block the EnemyName! +EnemyName の攻撃をブロックした! +You dodge the EnemyName! +EnemyName の拘束を回避した! + + +You resist being bound! +拘束に抵抗した! + + +Self Bondage Enthusiast +自縛愛好家 +Start with a basic self-bondage kit. +いくつかの拘束具を持ってスタートする。 + + +Apprehended +取り押さえ +When you are bound by an enemy attack or spell, you are stunned 1 turn per restraint added. +敵の攻撃や魔法によって拘束されると、付けられた拘束具につき1ターン気絶する。 +Feeble Attacks +弱々しい +All enemies gain 20 physical and magic armor. +全ての敵が20ポイントの物理、魔法アーマーを追加で持つ。 +Glass Cannon +ガラスの鎧 +The effects of you taking damage are increased by 150%. +被ダメージが150%になる。 +The Wand is Mightier +強力な"杖" +Enemies have 30% more hp; Tease damage multiplier to bound targets is increased by 85%. +敵のHPが30%増加し、拘束されたターゲットへ興奮値の上昇率が85%増加する。 +Kinky Armory +拘束具の趣向 + + +Chef +シェフ +You defeat the chef and claim her prize. +シェフを倒して持ち物を奪った! +The chef makes sure you'll never steal again! (DamageTaken) +シェフに泥棒対策をされた! (DamageTaken) +The chef makes sure you'll never steal again! (+RestraintAdded) +シェフに泥棒対策をされた! (+RestraintAdded) +The chef spanks you with her frying pan! (DamageTaken) +シェフがフライパンで叩いてきた! (DamageTaken) + + +As you eat, you look up and notice that someone is not very happy with you. +最後の一口を食べて顔を上げると、不機嫌そうな何者かが立っていた! + + +You find some delicious brownies! +美味しそうなブラウニーを見つけた! +Double Fudge Brownie +段々ブラウニー +You enjoy the brownie one soft, delicious bite at a time. +しっとり柔らかな甘味を楽しもう。 +A decadent blend of butter and chocolate topped with fudge and baked to perfection. +バターとチョコレートでトッピングして完璧に焼き上げたブラウニー。 +Restores 30% willpower. Takes a few turns to eat. +気力を30%回復する。食べるのに数ターンかかる。 + + +A playful ghost now accompanies you on your journey. +いたずら好きの幽霊が憑いてくるようになった。 +The ghost haunting you decides to have a little fun! (+RestraintAdded) +取り憑いている幽霊がいたずらしてきた! (+RestraintAdded) + + +Hemp Rope +麻縄 +The most common type of bondage rope. +最も普及している、緊縛用の縄。 +Soft and comfy. Great for casual wear! +縛り心地が良く、普段着に最適。 + + +Boxtie +高手小手縛り +The ropes squeeze you gently. +縄によるスタンダードな拘束。 +Rope Cuffs +手首縄 +A quick tie for apprehending prisoners. +素早く拘束できる縛り。 +It's not very secure. +簡単に抜け出せる。 +Chest Straps +胸縄 +Chest Harness +胴のハーネス +The finishing touch on a tight and strict piece of ropework. +最後の仕上げ縄。 +Rope Hogtie +縄のホッグタイ +A very strict and tight hogtie, good for subduing unruly captives. +手首と足首をつなぐ拘束。暴れる捕虜を鎮圧するのに最適。 +It holds you strictly in a boxtie. You tug on the rope connecting your feet and struggle. +高手小手縛りと繋がっている。足や手を捩り、無理やり抜け出すしかない。 +It holds you strictly with your back arched. You tug on the rope connecting your feet and struggle. +腕と足のをつなげる縄。足や手を捩り、無理やり抜け出すしかない。 +Rope Belt +縄のベルト +Rope Harness +菱形縛り +A harness that secures your other restraints and makes them tighter. +ほかの縄と組み合わせることで縄抜けしにくくなる。 +Crotch Rope +股縄 +A tight rope impressing upon your most private areas... +股の大事なところを締め付け、擦る縄。 +Wrist Rope +後ろ手縛り +A wrist and elbow tie keeping your arms secured behind your back. +腕と肘を後ろ手に縛る縄。 +Upper Knee Ropes +脚縄(軽) +A tie that hobbles your knees together.. +脚を縛り、歩きにくくするための縄。 +Thigh Ropes +脚縄(中) +Upper Thigh Ropes +脚縄(重) +A tie that hobbles your thighs together.. +脚を縛り、歩きにくくするための縄。 +Ankle Ropes +足縄 +Lower Leg Ropes +足縄(中) +Lower Knee Ropes +足縄(重) +A tie keeping your knees secured together. +足首同士を括り付ける縄。 +Toe Rope +指縄 +A tie keeping your toes tightly together. +両足の親指を括り付ける縄。 +Living Rope Collar +生きている縄の首輪 +This collar is designed to make sure its wearer does not escape their ropes. +着用者を縄で拘束し続けるための首輪。 +It will occasionally cause ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +装備していると、時折どこからともなく液体金属が現れて拘束される。効果は装備している縄の数で増加する。 + + +Notebook Page +ページ + + +You're going to stay with me for a while~ +少し一緒にいましょう? +That's better! Now stay close to me~ +これでよし、離れちゃだめだからね? +Looks like our time is coming to an end... +そろそろ良い時間みたいね…… +Time to bring you back to your place~ +それじゃあお家に帰ろうか! +You've been quite adorable! Until next time~ +とても可愛かったよ、またやらせてね~。 + + +It's time for your walk, miss. +お散歩の時間です、お嬢様。 +Now let's see, where to go... +どこに行こうかな~……。 +I think we've reached a stopping point. +そろそろ目的地かな……。 +I have to put you back now~ +そろそろ帰らないと。 +It's been fun playing with you miss! +楽しかったですね! + + +(reaches for your leash) +(リードに手を伸ばす) +(holds your leash firmly) +(リードをしっかり握る) +(giggles) +(クスクスと笑っている) +(waves goodbye) +(手を振っている) + + +Why don't we go for a walk? +散歩にいかない? +That's better! Now come along~ +一緒に行こうよ、ね! +This has been lots of fun! +とっても楽しかったよ! +I have to go return you~ +そろそろキミを返さないと…… +Good girl~ Let's go again later~ +いい子だね、また今度! + + +It's time for walkies! +ウォーキングの時間よ! +That's a good girl! +いい子ね。 +I want to keep you longer, but I've got things to do. +もっと遊んでいたいけど、やることがあるの。 +It's time to go back to your little house~ +それじゃあお家に帰りましょうね。 +(pats you on the head) +(頭をなでている) + + +It is time for your mandatory exercise. +運動の時間です。 +Please maintain proximity. +離れないように。 +Progress Level: 90% +進捗:90% +Exercise complete. Returning to storage. +規定の運動量に到達。ストレージへと返却。 +Uploading logs to database. Error... no connection. +データベースにログをアップロード中……エラー、接続されていません。 + + +Latex Mimic +ラテックスミミック +The latex mimic melts into a shiny puddle. +ラテックスミミックは溶けて輝く水たまりになった。 +The latex mimic spits out a glob of rubber at you! (+RestraintAdded) +ラテックスミミックは体の一部を飛ばしてきた! (+RestraintAdded) +The latex mimic stretches out an appendage and pulls you toward it! (DamageTaken) +ラテックスミミックが体の一部を伸ばし、引っ張ってきた! (DamageTaken) +The latex mimic engulfs you in sticky rubber! (DamageTaken) +ラテックスミミックがネバネバのゴムの身体に引きずり込んできた! (DamageTaken) + + + + +Item Stack: +スタック数: + + +Heavy +ヘビー +Accessory +アクセサリー +Restraint +拘束 +Enchanted +エンチャント +Mundane +普通 +Can Disassemble +分解可能 +Raw Material +素材 +Armbinders +アームバインダー +Legbinders +レッグバインダー +Boxbinders +ボックスバインダー +Devices +デバイス +Toys +オモチャ +Collars +首輪 +Jackets +拘束衣 +Dresses +ドレス +Ties +縛り +Wrapping +テープ +Gags +猿轡 +Harnesses +ハーネス +Mittens +ミトン +Boots +ブーツ +C. Belts +貞操帯 +C. Bras +貞操ブラ +Maid +メイド +Locked +施錠済み +Accessible +触れられる +Inaccessible +触れられない +Quick-Bind +お手軽拘束 + + + + + + +Lower +脚 + + +Spellbound Rope +呪文の縄 +An enchanted rope with a powerful sealing spell. It cannot be cut by mundane means. +強力な呪文の施された縄。通常の手段で切ることは不可能。 +It almost has a kinky mind of its own. +邪悪な意思を持つロープ。 + + +Spellbound Boxtie +呪文の高手小手縛り +The knots appear to tie themselves together again, making them impossible to undo! +解いても魔法の力で元に戻ろうとする魔法の縄。 +Spellbound Rope Cuffs +呪文の手縄 +Spellbound Ropework +呪文の複雑な縄 +A quick tie for apprehending prisoners, looped through buckles on the hand restraints. +他の縄と組み合わせることで効果を発揮する縛り。 +Strict Spellbound Ropework +呪文のとても複雑な縄 +The finishing touches on a tight and strict piece of ropework. +複雑な縄をきつくしたもの。 +Spellbound Hogtie +呪文のホッグタイ +Spellbound Rope Belt +呪文の縄のベルト +Spellbound Harness +呪文の菱形縛り +Spellbound Crotch Rope +呪文の股縄 +Spellbound Wrist Tie +呪文の後ろ手縛り +Spellbound Knees +呪文の脚縄(軽) +Spellbound Thighs +呪文の脚縄(中) +A tie that holds your legs together.. +脚を縛り、歩きにくくするための縄。 +Spellbound Upper Thighs +呪文の脚縄(重) +A tie that holds your thighs together.. +脚を縛り、歩きにくくするための縄。 +Spellbound Ankles +呪文の足縄(軽) +Spellbound Lower Legs +呪文の足縄(中) +A tie keeping your legs secured together. +足首同士を括り付ける呪文の縄。 +Spellbound Lower Knees +呪文の足縄(重) +Spellbound Toe Rope +呪文の指縄 +A tie keeping your toes secured together. +両足の親指を括り付ける縄。 +Living Spellbound Rope Collar +生きている呪文の縄の首輪 +It will occasionally cause spellbound ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +装備していると、時折どこからともなく呪文の縄が現れて拘束される。効果は装備している縄の数で増加する。 + + + + +A novice-level enchanted rope, relatively trivial to untie but resistant to mundane tools. +初級の付呪が施された縄。一般的な道具にはそこそこの耐性を持つが、簡単に解ける。 +Faintly glows with traces of devious thoughts. +邪な痕跡が薄ら輝いている。 + + +Magic Boxtie +魔法の高手小手縛り +They glow with a trace of magic. +魔法の込められた縄。淡く輝いている。 +Magic Rope Cuffs +魔法の手首縄 +Magic Ropework +魔法のロープワーク +Strict Magic Ropework +とても複雑な魔法の縄 +Magic Hogtie +魔法のホッグタイ +It's very secure. You tug on the rope connecting your feet and struggle. +引っ張ったりもがいたりして緩めるしかない。 +Magic Rope Belt +魔法の縄のベルト +Magic Harness +魔法の菱形縛り +Magic Crotch Rope +魔法の股縄 +Magic Wrist Tie +魔法の後ろ手縛り +Magic Knee Tie +魔法の脚縄(軽) +Magic Thigh Ropes +魔法の脚縄(中) +Magic Upper Thigh Ropes +魔法の脚縄(重) +Magic Ankle Tie +魔法の足縄(軽) +Magic Lower Leg Tie +魔法の足縄(中) +Magic Lower Knee Tie +魔法の足縄(重) +Magic Toe Rope +魔法の指縄 +Living Magic Rope Collar +生きている魔法の縄の首輪 +It will occasionally cause magic ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +装備していると、時折どこからともなく魔法の縄が現れて拘束される。効果は装備している縄の数で増加する。 + + +Celestial Rope +聖なる縄 +Rope that has been exposed to solar energies. +陽光を帯びる、神聖な縄。 +Squeezes the wearer if she tries to escape, so that she knows her place. +抜け出そうとすると、立場をわからせるように締め付けてくる。 + + +Holy Boxtie +聖なる高手小手縛り +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +不思議な癒やしの力を放つ縄。魔法の力で伸びて身体にフィットする。 +Holy Rope Cuffs +聖なる手縄 +Holy Ropework +聖縄のロープワーク +Strict Holy Ropework +とても複雑な聖なる縄 +Holy Hogtie +聖なるホッグタイ +Holy Rope Belt +聖なる縄のベルト +Holy Rope Harness +聖縄の菱形縛り +Holy Crotch Rope +聖なる股縄 +Holy Wrist Rope +聖縄の高手小手縛り +Holy Upper Knee Ropes +聖なる脚縄(軽) +Holy Thigh Ropes +聖なる脚縄(中) +Holy Upper Thigh Ropes +聖なる脚縄(重) +Holy Ankle Ropes +聖なる足縄 +Holy Lower Leg Ropes +聖なる足縄(中) +Holy Lower Knee Ropes +聖なる足縄(重) +Holy Toe Rope +聖なる指縄 +Living Holy Rope Collar +生きている聖なる縄の首輪 +It will occasionally cause holy ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +装備していると、時折どこからともなく聖なる縄が現れて拘束される。効果は装備している縄の数で増加する。 + + + + +Mithril Rope +ミスリルの縄 +Rope made from silver thread, exposed to lunar energies. +銀の糸で作られた、月の力を帯びる縄。 +Lightweight yet unyielding. Truly a high class rope. +軽くて解けにくい、まさに高級ロープ。 + + +Mithril Boxtie +ミスリルの高手小手縛り +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +ミスリルを編んで作られた軽いロープ。滑らかな触り心地だが、切るのは極めて難しい。 +Mithril Rope Cuffs +ミスリルの魔法の手縄 +Mithril Ropework +ミスリルの複雑な縄 +Strict Mithril Ropework +ミスリルのとても複雑な縄 +Mithril Hogtie +ミスリルホグタイ +Mithril Rope Belt +ミスリル縄のベルト +Mithril Rope Harness +ミスリル縄の菱形縛り +Mithril Crotch Rope +ミスリルの股縄 +Mithril Wrist Rope +ミスリルの後ろ手縛り +Mithril Lower Knee Ropes +ミスリルの脚縄(軽) +Mithril Thigh Ropes +ミスリルの脚縄(中) +Mithril Upper Thigh Ropes +ミスリルの脚縄(重) +Mithril Ankle Ropes +ミスリルの足縄(軽) +Mithril Lower Leg Ropes +ミスリルの足縄(中) +Mithril Toe Ropes +ミスリルの指縄 +Living Mithril Rope Collar +生きているミスリルの縄の首輪 +It will occasionally cause mithril ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +装備していると、時折どこからともなくミスリルの縄が現れて拘束される。効果は装備している縄の数で増加する。 + + +Dark Portal +ダークポータル +They are trying to take you somewhere! +どこかに連れて行かれてしまう! + + +### Essence Mote + +### A trainee can use this to focus. + +### Pick this up to gain decaying miscast reduction. + +### Seal Sigil + +### Walk over it to erase it and unlock the next floor. + +The Shadow +影の悪魔 +The Shadow is exorcised... for now. +影の悪魔を一時的に撃退した。 +The Shadow overwhelms you with its power... (+RestraintAdded) +影の悪魔に圧倒された…… (+RestraintAdded) +The Shadow welcomes you to your new future. (DamageTaken) +影の悪魔が閉ざされた未来に誘ってくる…… (DamageTaken) +The Shadow cackles as your restraints are sealed! (DamageTaken) +影の悪魔はケラケラと笑いながら拘束具に封印を施してきた! (DamageTaken) +The Shadow smiles and vanishes. +影の悪魔は不吉な笑みを浮かべながら消え去った。 +The Shadow smiles and vanishes, leaving you locked in a mysterious RNAME... +影の悪魔は不吉な笑みを浮かべながら、奇妙な封印を RNAME に施して消え去った。 + + +Observer +監視者 +The observer is banished into the aether. +監視者はエーテルの彼方に消えていった。 + + +From the Beyond +彼方からの者 + + +You briefly spot your reflection as a reflective cube appears! +鏡のような動く箱に自身の姿が映り込んだ! +Mini Metal Cube +ミニ・リキッドメタルキューブ +The liquid metal cube shatters into glittering dust. +リキッドメタルキューブは輝く灰となり粉々に散っていった。 +The liquid metal cube sticks to you and hardens! (DamageTaken) +リキッドメタルキューブが身体にまとわりつき、硬化していく! (DamageTaken) +The liquid metal cube expands across your body and hardens, taking the form of restraints! (+RestraintAdded) +リキッドメタルキューブが身体にまとわりつき、固くなっていく! (+RestraintAdded) + + +Liquid Metal +液体金属 +Primordial latex infused with mineral form. +原始的なゴム生命体にミネラルを注入した姿。 +Heavy and weighs the wearer down. +とても重いため、着用者の動きが遅くなる。 + + +Liquid Metal (Feet) +液体金属(つま先) +A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. +柔軟でありながら非常に硬い金属物質。重量があるため、回避力が低下し、電導性になる。 +Forming a skintight layer, it will be quite difficult to escape this. +抜け出すのは極めて難しい。 +Liquid Metal (Ankles) +液体金属(足) +Liquid Metal (Legs) +液体金属(脚) +Liquid Metal (Arms) +液体金属(腕) +Liquid Metal (Hands) +液体金属(手) +Liquid Metal (Mouth) +液体金属(口) +Liquid Metal (Head) +液体金属(顔) +Living Liquid Metal Collar +生きている液体金属の首輪 +This collar is designed to make sure its wearer does not escape the metal. +着用者を液体金属で拘束し続けるための首輪。 +It will occasionally cause liquid metal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of liquid metal you have on you. +装備していると、時折どこからともなく液体金属が現れて拘束される。効果は装備している液体金属の数で増加する。 + + +The stairs dissolve right before you! +眼の前の階段が消えていった! +The stairs dissolve as you step onto them, pulling you with them to somewhere else. +階段に足を踏み入れると、それは唐突に消えだしてどこか別の場所へと移動してしまった。 + + +A dark energy enters your body... (DamageDealt) +闇の力が身体に浸透していく…… (DamageDealt) +A dark energy lurks within you. +身体の中に闇の力が潜んでいる。 +You succumb to a dark desire... (+RestraintAdded) +闇の欲望に屈した…… (+RestraintAdded) + + +Observer's Gaze +監視者の眼差し + + +Industrial Tape Wand +工業用テープの杖 +A non-magical tape wand used for creating tight little packages. +純粋な科学力で作られた、梱包用の杖。 +Deals chain damage. 200% binding efficiency. Hitting an enemy applies the Taped debuff for 12 turns, increasing Chain damage to them by 15%. Deal 10 chain damage to adjacent Taped enemies while moving. +チェーン属性。攻撃命中時の拘束値が200%になる。攻撃命中時、12ターンの間テープで拘束し、チェーン属性ダメージが15%上昇する。移動時、隣接しているテープで拘束した敵に10チェーン属性ダメージを与える。 + + +Bag of Goodies +秘密のカバン +Someone's secret stash. +誰かの秘密の遊び道具。 +Deals charm damage. Applies a toy to targets hit for 40 turns. Offhand: Applies a toy to targets you hit. +魅了属性。攻撃が命中した敵に、40ターンの間オモチャを取り付ける。サブウェポン:攻撃が命中した敵にオモチャを取り付ける。 +You find a bag filled with various toys and vibrators... +色々な気持ちよさそうなオモチャがつまったカバンを見つけた…… +You play with yourself using some of the toys in the bag... +カバンの中から取り出したオモチャで自慰をした…… + + +Magic Remote +魔法のリモコン +The key to absolute power. +絶対服従の鍵。 +Triggers long-duration edging on basic attack if the target has a toy. Offhand: Applies short-duration teasing to targets you hit. +対象がオモチャを装備している場合、攻撃時に長時間振動させる。サブウェポン:対象がオモチャを装備している場合、攻撃時に短時間振動させる。 + + +Vibrator Remote +バイブレーター操作 +You click the remote and hear a buzzing noise! +リモコンのボタンを押すと、プラグの振動音が聞こえてきた! +15 charge to powerfully activate vibrators in an area for 15 turns. +エネルギーを15消費して発動する。15ターンの間、選択したエリア内のプラグを振動させる。 + + +10 charge to activate vibrators in an area for 15 turns. +エネルギーを10消費して発動する。15ターンの間、選択したエリア内のプラグを振動させる。 + + +You find a golden crystal. It glows faintly. +黄金色に薄ら輝くクリスタルを見つけた。 +You find a dull, gold-tinted crystal. +くすんだ金色のクリスタルを見つけた。 + + +Save Loadout +ロードアウトを保存 + + +Rubber Stick +ラバースティック +A rubber cylinder without any lewd intentions whatsoever. +ゴムの棒。卑猥が一切ない。 +Deals grope damage. +愛撫属性。 +You pick up a flexible rubber stick. +ぐにゃぐにゃしたゴムの棒を拾った。 + + +Blade of Ejahl +エヤールの剣 +A piece of prized ancient equipment. Magical energy causes it to vibrate intensely. What could it have been used for? +貴重な古代の道具。魔法のエネルギーで激しく振動している。何に使われたのだろう? +Deals grope damage. Can spend 40 charge to add charm damage per hit for 10 turns. +愛撫属性。エネルギーを40消費して発動する。10ターンの間、攻撃命中時に魅了属性の追加ダメージを与える。 +You retrieve the Blade of Ejahl. +エヤールの剣を拾った。 + + +Intense Vibrations: The Blade of Ejahl deals bonus charm damage!!! +強烈な振動:追加で魅了ダメージを与える。 +The Blade of Fla-peh buzzes with great power! +フラペの剣は強烈な振動を発している! +40 charge to deal 30 charm damage per hit for 10 turns. +エネルギーを40消費して発動する。10ターンの間、攻撃命中時に30魅了属性の追加ダメージを与える。 + + +Enchanted Rope +魔法のロープ +She who lives by the rope, is tied up by the rope. +縄に生きる者は、縄に縛られる。 +Deals chain damage and applies 50 points of rope binding. Draws 10 mana per hit to apply 50 extra points of magical binding. If you don't have mana, you fail to control the rope... +チェーン属性。攻撃時に縄で縛り、50の拘束値を与える。攻撃時にマナを10消費し、50の拘束値を追加で与える。マナが無い場合、コントロールに失敗する…… +You find some enchanted rope. +エンチャントが施された縄を見つけた。 +Without mana to control it, the enchanted rope springs back upon you! +縄を操るだけのマナが足りなかった。縄が自分に向かってきた! + + +Light Bow +ショートボウ +Pointy stick delivery system. +鋭い矢をお届けする昔ながらの武器。 +Reload time: None. Deals crush damage on melee. Draws 10 charge and 20 stamina to fire an ordinary arrow, dealing 30 pierce damage. +リロードタイム:なし。近接時:打撃属性ダメージ。エネルギー10とスタミナ20を消費して、普通の矢を放つ。矢は刺突属性で30ダメージを与える。 +You find a wooden bow. +木の弓を見つけた。 +10 charge to fire an arrow. Deals 30 pierce damage. +10エネルギーを消費して矢を放つ。30の刺突属性ダメージを与える。 +Choose projectile path +狙う方向を選択 +Arrow +矢 +You loose an arrow! +矢を放った! + + +Fire Arrows +ファイヤアロー +Converts arrows to fire arrows for 30 extra charge, which deal the arrow damage plus 20 as fire damage in a 3x3 area and stuns briefly. +追加で30のエネルギーを消費し、矢に火をつける。火属性ダメージ20が追加され、命中したマスを中心に3x3エリアの敵を短時間スタンさせる。 +You switch to using fire arrows. +矢に火を付けた! +Fire Arrow +ファイヤアロー + + +Vine Arrows +ヴァインアロー +Converts arrows to all-natural organic versions for 20 extra charge, which apply 80 binding to the target and deal chain damage instead. +追加で20のエネルギーを消費し、矢に自然の力を宿す。拘束値80が追加され、チェーン属性になる。 +You switch to using vine arrows. +矢に自然の力を宿した! +Vine Arrow +ヴァインアロー +A sudden burst of vines overtakes you as you find yourself wrapped up tightly! +つるが急成長し、身体にきつく巻き付いてきた! + + +You find a bow and a glowing crystal. The bow is scribed with runes of duplication. +弓と輝くクリスタルを見つけた。弓には複数のルーン文字が刻まれている。 + + +Crossbow +クロスボウ +Watch where you're pointing that thing! +誤射に気をつけよう。 +Reload time: 3 stationary turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 65 pierce damage. +リロードタイム:3ターン。近接時:打撃ダメージ。エネルギーを15消費し、普通ボルトを放つ。ボルトは刺突属性で65ダメージを与える。 +You find a crossbow. +クロスボウを見つけた。 +20 charge to fire a bolt. Deals 65 pierce damage. +エネルギーを20消費しボルトを放つ。65の刺突属性ダメージを与える。 +Bolt +ボルト +You pull the trigger! +クロスボウの引き金を引いた! + + +Your RestraintName melts off! +RestraintName は溶けた! +Your RestraintName melts faster with the application of fire! +RestraintName は火に当てられて溶けていく! +Your RestraintName hardens with the application of frost! +RestraintName は冷気に当てられて固くなっていく! + + +dmg +ダメージ + + +AMNT Evasion +回避力 AMNT +AMNT% Accuracy +命中率 AMNT% +AMNT Magic Armor +マジックアーマー AMNT +AMNT Physical Armor +物理アーマー AMNT% +AMNT Bondage Resist +拘束抵抗力 AMNT +AMNT TYPE Resist +TYPE 属性の抵抗力 AMNT +AMNT% TYPE Damage +TYPE 属性の威力 AMNT% +AMNT% weapon phys. dmg +物理ダメージ AMNT% +AMNT% weapon magic dmg +武器の魔法ダメージ AMNT% +Infuse weapon AMNT% TYPE +武器の TYPE 属性ダメージ AMNT% +AMNT TYPE on attack +AMNT TYPE 属性追加ダメージ +AMNT Mana Efficiency +MP効率上昇 AMNT +AMNT TYPE Mana Efficiency +MP効率上昇 AMNT TYPE 属性 +AMNT% regen from mana pool +マナプールから得られるマナ AMNT% +AMNT mana pool on capture +敵を捕まえたときマナプールを AMNT 回復する +AMNT% Visibility Reduction +視認性低下 AMNT% +AMNT Distraction Decay +DP AMNT 低下 +AMNT Distraction Per Turn +ターン毎にDP AMNT 上昇 +AMNT AP from attacks +攻撃時にDP AMNT 上昇 + + +After attacking with a teasing weapon: +いかがわしい武器で攻撃した後: + + +Gain AMNT% Spell Damage for DRTN turns +DRTN ターンの間魔法ダメージが AMNT% 増加する + + +Drains mana from the wearer. +着用者からマナを吸収する。 + + +AMNT Stat +AMNT 上昇 + + +Drop On Floor +床に置く + + +Remove +取り外す +Struggle +もがく + + +Leyline Map +レイラインの地図 + + +Harness Plug Gag +ハーネスプラグギャグ +A gag meant to keep people quiet by forcing a plug into their mouth and securing it in place with a strict harness. +口の中に長い棒を押し込み、革のパネルで塞ぐ猿轡。 + + +Your OLDITM transforms into NEWITM! +OLDITM は変化して NEWITM になった! +Your OLDITM gains new properties! +OLDITM は新たな特性を得た! + + +Moon-Cursed Epicenter +月の呪いの根源 +The cursed epicenter disperses into black stardust. +呪いの根源は暗き星屑に霧散した。 +The cursed epicenter retreats as you remove the last of your cursed restraints! +呪われた拘束具がなくなり、楔をなくした呪いの根源は霧散していった。 +The cursed epicenter retreats as you are claimed by something else! +呪いの根源は霧散していった。 +The cursed epicenter assaults your mind with its presence! (DamageDealt) +根源の重圧感に圧倒された! (DamageDealt) +You feel your cursed items turn cold to the touch! +呪われたアイテムに体温を奪われていく! +An cursed collar appears around your neck, feeling cold to the touch. +背筋の凍る感覚とともに、首に呪いの首輪が現れた。 +Cursing Sigil +呪印 +A cursing sigil appears on the ground! +呪印が地面に浮かび上がった! +You are being cursed!!! +呪われた! + + +Star-Cursed Epicenter +星屑の呪いの根源 + + +Moondust Collar +月の首輪 +'You thought you could run forever, didn't you? Fate has a way of always catching up to you...' +「永遠に逃げられるものは存在しない、運命は必ず貴様を捕まえる。」 +Cannot be removed while you are wearing other Star Cursed items. +他の星の呪いを受けた拘束具を取り除かなければ外れない。 +Stardust Collar +星の首輪 + + +The cursed seal on the RestraintName vanishes into a brief veil of stardust. +RestraintName の呪いは星屑のベールに秘匿され、干渉することができない。 +Take AMNT damage to weaken the curse. Excludes shadow, psychic, charm, or damage taken at 0 WP. +WPが1以上の時に、影、精神、魅了以外の属性で AMNT ダメージを受ければ解呪される。 +You struggle uselessly, sealed in your fate. +呪われた運命に抗う術がない。 +You feel your restraints starting to weaken... +拘束具の呪いが弱まっていくのを感じる…… + + +The cursed collar falls off, awaiting its next victim... +呪いの首輪が外れた。次の犠牲者を待っているようだ…… +You must remove all other Star Cursed items before removing the collar. +星の呪いを帯びた拘束具を外さなければ、この首輪を外すことはできない。 + + +Transformation: Items with generic curses transform into Star Cursed items. +変異:通常の呪われたアイテムが星の呪いを帯びたアイテムに変化する。 +With a burst of dark energy, your OLDITM gains new properties! +闇の力に当てられ、 OLDITM が変化した! +With a burst of dark energy, your OLDITM transforms into a NEWITM! +闇の力に当てられ、 OLDITM が NEWITM に変化した! + + +Restoration: While distracted, your Star Cursed restraints regain strength. +再生:発興奮値が上昇した時、星の呪いを帯びたアイテムが回復する。 +With the rush of pleasure, you feel your cursed restraints tighten and strengthen! +快楽を得る度に、呪いの拘束具が強く、きつくなっていく。 + + +Corruption: While in the shadows, you slowly gain corruption. +堕落:影の中にいる間、徐々に堕落していく。 +Your willpower gain and struggle power is less effective due to your corruption. +心の堕落により、気力の回復量ともがく力が低下している。 + + +Seduction: Gain distraction after taking damage. +誘惑:ダメージを受けると興奮値が上昇する。 +Taking damage fills your minds with cursed thoughts... +呪いの力により、痛みが快楽に変わる…… +Having taken damage, your distraction is increasing... +呪いの力により、痛みが快楽に変わる…… + + +Punishment: When you defeat an enemy, you are stunned briefly and enemies are attracted. +罰:敵を倒した時、短時間スタン状態になり、周囲の敵に探知される。 +Dark Voice: You are supposed to be a slave! +闇からの声:奴隷は反抗してはならない。 + + +Submission: At 0 WP, you are restrained if you leave the presence of a hostile. +屈服:敵から離れた時、拘束される。 +Dark Voice: Kneel before your mistress. +闇からの声:主の前に跪け。 +You must submit! Moving away from an enemy at 0 WP will bind you! +服従しなければならない。気力が0のときに敵から離れると、拘束される。 + + +Denial: -10 WP when you try to Let Go. At 0 WP you cannot orgasm. +貞操:絶頂時に気力-10。気力が0の時、絶頂できない。 +Dark Voice: Not yet. +闇からの声:まだイっちゃだめだよ~? +Dark Voice: Your squirming pleases us. +闇からの声:苦しい?もっと苦しんで?私達を楽しませて。 +Dark Voice: It is not your choice to make~ +闇からの声:私達が許可するまで絶頂しちゃだめだからね~? +Dark Voice: You may enjoy yourself, for now~ +闇からの声:存分に快楽を貪りなさい! +Dark Voice: Yes, take in the pleasure... +闇からの声:イけ! +Dark Voice: Enjoy a gift, dear~ +闇からの声:ご褒美だよ、絶頂しなさい。 +As you let go of yourself, the Robe of Chastity loses all effects! +自慰で絶頂すると、貞操の衣は効果を失う +The magic in the Robe of Chastity fades... for now. +貞操の衣の効果が消え去った…… +You have failed to keep the principles of the Paladins... for now. +パラディンの貞節を守れなかった…… + + +You feel vibrations in your leotard as the magically conductive fabric channels your power. +レオタードが震え、生地を通して魔力が全身に伝わってきた。 +Your leotard produces a tingling full-body sensation as it channels your magic! +レオタードに魔力を流し込まれ、全身が敏感になった。 +A tingling sensation serves to remind you of your leotard's magic properties. +ピリピリとした感覚にレオタードの特性を思い出す。 + + +Star: -20 Charm/Psychic Resist +星屑の加護:物理/魅了耐性-20 +Star: +40 all other resists +星屑の加護:他の耐性+40 + + +Mithril Orb +ミスリルオーブ +Shining strings encircle your body! +輝く糸が身体を包み込む! + + +Your cursed items have attracted a powerful cursed spirit! +呪われたアイテムが強力な呪霊を呼び寄せてしまった! + + +The seal on your RESTRAINTNAME is weakening. +RESTRAINTNAME の封印が弱まった! + + +The fighter pouts and runs away! +戦士は拗ねてどこかに行ってしまった! +The fighter knocks you to the ground and binds you! (+RestraintAdded) +戦士に組み伏せられ、拘束具を取り付けられた! (+RestraintAdded) +The fighter strikes you with her weapon! (DamageTaken) +戦士が武器で打ち据えてきた! (DamageTaken) +The fighter takes you down with the back of her weapon! (DamageTaken) +戦士に武器の柄で殴られた! (DamageTaken) +The fighter puts you in a hold and manages to slip on a lock! (DamageTaken) +戦士に拘束具をロックされた! (DamageTaken) +The fighter vanishes and ends up behind you! +戦士が目にも止まらぬ速度で背後に回ってきた! + + + + +The fighter moans loudly and rolls around on the floor! +戦士は大声で呻きのたうち回った! +The fighter wraps her arms around you with bindings in hand! (+RestraintAdded) +戦士に拘束具を巻き付けられた! (+RestraintAdded) +The fighter pins you with her weapon and grabs your breast! (DamageTaken) +戦士に武器で固定され、胸を揉みしだかれた! (DamageTaken) +The fighter enchants her weapon and strikes you! (DamageTaken) +戦士は自らの武器にエンチャントして攻撃してきた! (DamageTaken) +The fighter smiles lasciviously as she dangles a lock in front of you! (DamageTaken) +戦士に拘束具をロックされた! (DamageTaken) +The fighter enchants her weapon and flies forward! +戦士はエンチャントした武器を推力に突進してきた! + + +The fighter drops her weapon and admits defeat! +戦士は武器を落とし、敗北を認めた。 +The fighter feints and strikes, slapping you with the flat of her blade! (DamageTaken) +戦士はフェイントを仕掛け、フラーで打ち据えてきた! (DamageTaken) +The fighter proudly clicks on a lock! (DamageTaken) +戦士に拘束具をロックされた! (DamageTaken) +The fighter briefly vanishes and ends up behind you! +戦士は唐突に姿を消し、背後に回り込んできた! + + +The fighter falls on her knees and begs! +戦士は膝を折り、命乞いをしだした! +The fighter throws an enchanted binding ring at you! (+RestraintAdded) +戦士は魔法の拘束リングを投げつけてきた! (+RestraintAdded) +The fighter throws her weapon at you! (DamageTaken) +戦士は武器を投げつけてきた! (DamageTaken) + + +Casting SPNME +SPNME +The door suddenly locks behind you! +突然ドアがロックされた! + + +Apply To Target +ターゲットを選択 +Purify +解呪 + + +You need to target an NPC +NPCをターゲットに選択する必要がある +Target must be bindable and disabled. +ターゲットは拘束可能で武装解除している必要がある。 +Target acquired! +ターゲット確認 +Truss em up! +ぐるぐるまき! +Choose target to bind +縛るターゲットを選択 +Target Acquired! +ターゲット確認 +Designates the target for bondage and allows you to apply items from the inventory. Can only be applied to entities that are willing or disabled. Some items require higher levels of incapacitation to be applied +拘束対象を指定し、インベントリからアイテムを使用する。拘束されることを望んでいるか、無力化されている対象にのみ使用可能。拘束具によって追加される拘束値は異なる。 + + +The Shoppe +お店 +Journey Selection +運命の分かれ道 +High-Security Prison +監獄 +Doll Sorting Station +人形選別所 + + +A cursed NEWITM flies out of the chest and latches tightly to you! +宝箱から呪われた NEWITM が飛び出し、取り付いてきた! +With a puff of magic, a NEWITM appears on your body! +魔法の閃光と共に、 NEWITM が身体に取り付いた! + + +You draw upon chaotic energies, restoring mana! +混沌の力を引き出し、マナを回復した! +You draw upon chaotic energies, but your mind is unable to hold back the arcane forces! +混沌の力を引き出そうとするが、不安定な力を制御できない! +Your attempt to call upon chaotic energies fails. +混沌の力を引き出そうとするも失敗した。 +You are already at max mana. +マナが最大値だ。 + + +The vibrator holds at full power to drive you over the edge! +最大出力のプラグに責め立てられ、激しい絶頂に至った。 + + +The weapon needs to be loaded to fire. +リロードが必要。 + + +Recurve Bow +リカーブボウ +Curvy, just like its user. +使用者の心のように曲がっている。 +Reload time: 1 turn. Deals crush damage on melee. Draws 14 charge and 35 stamina to fire an ordinary arrow, dealing 40 pierce damage. +リロードタイム:1ターン。近接攻撃時:打撃属性。エネルギーを14とスタミナを35消費し、普通の矢を放つ。矢は40刺突属性ダメージを与える。 +You find a recurve bow. +リカーブボウを見つけた。 +14 charge to fire an arrow. Deals 40 pierce damage. +エネルギーを14消費し、40刺突ダメージを与える矢を放つ。 +Recurve Bow Arrow +矢 +You loose a strong arrow! +強力な矢を放った! + + +Longbow +ロングボウ +Great for building both empires and muscle. +偉大な帝国を築くにも筋肉をつけるにも最適。 +Reload time: 2 turns. Deals crush damage on melee. Draws 18 charge and 60 stamina to fire an ordinary arrow, dealing 60 pierce damage. +リロードタイム:2ターン。近接時:打撃属性。エネルギー18とスタミナを60消費し、普通の矢を放つ。矢は60刺突属性ダメージを与える。 +You find a huge longbow. +大きな弓を見つけた。 +18 charge to fire an arrow. Deals 60 pierce damage. +エネルギーを18消費し、60刺突ダメージを与える矢を放つ。 +Longbow Arrow +矢 +You loose a mighty arrow! +非常に強力な矢を放った! + + +Pistol Crossbow +ピストルクロスボウ +Lethal. Sustainable. Portable. +頑丈で持ち運びしやすく、そして致命的。 +Reload time: 3 turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 45 pierce damage. +リロードタイム:3ターン。近接時:打撃属性。15エネルギーを消費し、普通のボルトを放つ。ボルトは45刺突ダメージを与える。 +You find a pistol crossbow. +ピストルクロスボウを見つけた。 +20 charge to fire a bolt. Deals 45 pierce damage. +エネルギーを20消費し、45刺突ダメージを与える矢を放つ。 +Pistol Bolt +小型ボルト + + +Arbalest +アーバレスト +At this point why not just use a gun? +ここまで来たら銃を使うべきでは? +Reload time: 5 stationary turns. Deals crush damage on melee. Draws 25 charge and no stamina to fire an ordinary arrow, dealing 70 pierce damage, passing through units. +リロードタイム:5ターン。近接時:打撃属性。25エネルギーを消費し、普通のボルトを放つ。ボルトは70刺突ダメージを与え、対象を貫通する。 +You find an arbalest. +アーバレストを見つけた。 +25 charge to fire a bolt. Deals 100 pierce damage. +エネルギーを25消費し、70刺突ダメージを与える矢を放つ。 +Heavy Bolt +ヘビーボルト + + +The RSTNME is removed as the lock comes off. +解錠と同時に RSTNME が外れ落ちた。 +You save the key in your inventory for future use. +未来のために、鍵をカバンにしまった。 + + +You pick up a simple key for the simplest of locks. +シンプルな錠前に使えるシンプルな鍵を拾った。 +Simple Keys +シンプルな鍵束 +You twirl the keys around your finger. +鍵束を指でくるくる回した。 +A handy key for getting out of common handcuffs and shackles. +普通の手錠や枷に使用できる鍵。 +It's not sophisticated enough to work on higher-quality locks, but can be used many times. +複雑な錠前には使えないが、何度も使える。 + + +You twirl a key around your finger. +鍵を指でくるくる回した。 +You twirl a magic key around your finger. Careful not to lose it! +魔法の鍵束を指でくるくる回した。こんなことしてなくしたら世話ないよ! +You fidget with a lockpick. +ロックピックを弄んだ。 + + +You pick up a tool for picking disc detainer locks. +ピッキングの道具を手に入れた。 +Disc Lock Tool +ディスクロックピッカー +You examine the tool. It has a replaceable tip for picking disc detainer locks. +この工具は先端にロックピックを装着して使用するようだ。 +A handy tool for picking disc detainer locks, popularized by a certain pair of professionals. +ある二人組が開発した、ディスクロックの解錠に役立つ道具。 +Features a replaceable head in case an unskilled user breaks it. Requires lockpicks to use. +不慣れなユーザーが壊してしまった場合に備えて、先端が交換可能になっている。使用にはロックピックが必要。 + + + + +Magical Weapon +魔法の武器 + + +Your Submissiveness determines how easily your character can resist the temptations of bondage. +服従度は拘束の誘惑にどれだけ抵抗しやすいかを示す。 +Your Security Level is based on your history, and reputation with the MNFCTN. +手配度は、これまでの行動と MNFCTN との関係に基づく。 +Your Passion determines how likely you are to lose control of yourself involuntarily. +欲情値はどれだけ自身をコントロールできるかを示す。 +Your Frustration affects how quickly your Passion grows. More Frustration = More Passion +欲求不満度は欲情値の成長スピードを示す。欲求不満度が高いほど、欲情値も成長しやすい。 + + +Nivah, Goddess of Dragons +龍の女神 ニーヴァ +Minivir, Goddess of Alchemy +叡智の女神 ミニヴァ +Akasha, Goddess of Magic +魔法の女神 アーカーシャ +Oriel, Goddess of Technology +文明の女神 オーリエル + + +Ninril, Giver of Life +命を与えしもの ニンリル +Matah, Architect of Reality +現世の構築者 マタ +Aether, Keeper of the Cosmos +コスモスの守護者 エーテル +Oblivion, Keeper of Secrets +遍く秘密の守り手 オブリビオン + + +Arcane Energy is stored by casting spells, up to 100% Max mana. +魔法を唱えてマナを消費すると、アーケインエネルギーとして蓄積するようになる。マナの最大値分まで蓄積。 +Battle Rhythm is gained by spending stamina through attacks, up to 40 total. +戦闘のリズムは攻撃でスタミナを消費するごとに得られる。最大40まで。 + + +Arcane Blast +アーケインブラスト +When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. Casting this spell consumes it to deal up 25% Max Mana as Arcane damage. Pierces enemies and walls. +この魔法以外の魔法を唱えてマナを消費すると、その40%をアーケインエネルギーとして蓄積するようになる。マナの最大値まで蓄積。この魔法を使用すると、最大マナの25%を秘術属性ダメージとして与える。敵や壁を貫通する。 +Your eyes glow as energy surges from within! +身体からエネルギーが迸る! + + +Critical Hit! +会心の一撃! +Super Critical! +超会心の一撃! +Surprise Bondage! +奇襲拘束! +Arcane Energy +アーケインエネルギー +Rhythm +リズム +You avoid the attack in a flurry of impressive maneuvers! +華麗な機動で攻撃を回避した! + + +Arcane Barrier +アーケインバリア +When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. When enabled, slowly convert Arcane Energy into a shield at a 1:2 ratio. Max shield is equal to 10% Max Mana. +この魔法以外の魔法を唱えてマナを消費すると、その40%をアーケインエネルギーとして蓄積するようになる。マナの最大値分まで蓄積。有効時、徐々にアーケインエネルギー2をシールド1に変換し続ける。シールドの最大値は最大マナ10%分まで。 + + +You sense that a high value target is near. +近くに価値のあるターゲットがいる。 + + +You push yourself beyond physical limits! +肉体の限界を超えた! +You try to push yourself beyond your capabilities and falter... +肉体の限界を超えられなかった…… +You are already at max stamina. +既にスタミナが最大値だ。 + + +Did the Research +事前調査 +Unlocks advanced tooltips for enemies showing their weaknesses. Also improves hearing by a small amount. +敵の高度な情報を得られるようになる。また、聴覚が僅かに向上する。 + + +Well-Placed Traps +巧妙な罠 +Trap spells always critically strike. +罠呪文が命中した時、常に会心の一撃になる。 + + +Hard to Catch +捕まるものか +Adjacent NPCs count as corners/hooks for purposes of escaping. After being restrained, escape speed and power is increased for 12 turns (escape power is increased by +20% plus 2% of Bondage Resist). Removed if you restrain yourself. +隣接するNPCが、コーナー/フックとして機能する。拘束された後、12ターンの間、抜け出す力が20%+拘束抵抗値の2%増加する。。自縛した場合は効果が解除される。 + + +Struggling is improved and escape is quicker! +もがく力が強くなり、抜け出すスピードが早くなっている。 + + +Akashic Conflux +アカシック・コンフラクス +Costs 100 Arcane Energy and refunds 100 Mana. Bringing memories to life, you call upon your magical knowledge to ignore arm, leg, and verbal spell components for 3 turns. +100アーケインエネルギーを消費し、100マナ得る。意識するだけで魔法を行使できるようになり、3ターンの間、必要部位が使えなくても魔法を唱えられる。 +You can ignore Arm, Leg, and Verbal components! +必要部位が使えなくても魔法を唱えられる! +Magical whisperings circle around you, enabling you to cast spells without components! +ルーンの奔流が周囲を包み、必要部位が使えなくても魔法を唱えられる! +You don't have enough Arcane Energy. You need AMNT. +アーケインエネルギーが足りない。あと AMNT 必要。 + + +Chaotic Overflow +カオス・オーバーフロー +### Draw upon 35 WP to ignore spell components for Duration turns and fully restore your mana. The energy is uncontrollable, so there will be consequences... + +Chaotic energy flows through you!!! +混沌の力が身体を貫いた! +You try to call forth the chaotic energy, but it isn't interested in you anymore... +混沌の力を呼び出そうとするも、呼びかけに応じる気配がない。 +You don't have enough Willpower. You need at least 25%. +気力が足りない。最低でも25%必要。 +You are already full of chaotic energy! +既に混沌の力は最大だ。 +Chaotic energy overtakes you, crystallizing into physical form... +混沌の力が体を覆い、クリスタルになった…… + + +Chaotic energy flows through you! You have a bad feeling about this... +嫌な予感と共に混沌の力が身体中を巡った。 + + +You find a shimmering macaron. +きらめくマカロンを見つけた。 +Heavenly Crunch Macaron +ヘブンリー・クランチ・マカロン +You feel holy energy neutralizing the cursed magic permanently. +聖なる力が呪いの魔法を打ち消した! +Some say it comes from a bakery in heaven itself. Others say it is simply made from lab-grade materials, and actually tastes awful. +ある人は、このマカロンは天国のパン屋から来たと言う。ある者は、このマカロンが珍しい材料で作られただけで、味は最悪だと言う。 +### Purifies and unlocks a cursed item and/or removes all curses from one currently worn item of your choice. + +Congratulations! Your continued patronage has earned you|one (1) round trip to the nearest affiliated shop!|Simply step into the portal to continue...|(the Goddess is not responsible for any mishaps or fraud pertaining to the use of this portal) +いつもご愛顧いただきありがとうございます!この度は特典として、最寄りのお店への往復券を1枚サービスさせていただきます! +(You step through the portal. An unperturbed shopkeeper greets you.)|Another visitor? Oh, it's just you~ +(ポータルに足を踏み入れると、店主の声が聞こえた。)店主:お客さん?ああ、あなたでしたか! +(Enter the portal) +ポータルに入る + + +(It's the return portal) +元の場所に戻る +(You step through the portal and return to your adventure) +ポータルに足を踏み入れ、冒険を再開した + + +Select a restraint to remove the curse from +呪いを解く拘束具を選択 +You don't have any restraints that can be removed +取り外せる拘束具を持っていない。 + + +As you are low on mana, you are unable to store Arcane Energy. +マナが不足している。 +You are recharging your next mana cost reduction. +次のマナコスト軽減をチャージしている。 + + + + +Fast Recharge I +ファストチャージ I +Inner power now recharges after 10 turns instead of 16. +「秘めたる力」のチャージが16ターンから19ターンになる。 + + +Fast Recharge II +ファストチャージ II +Inner power now recharges after 6 turns instead of 16. +「秘めたる力」のチャージが16ターンから6ターンになる。 + + +Precise Targeting +急所狙い +Your first critical hit on a target is 1.5x more powerful. +ターゲットへの最初の会心の一撃の威力が1.5倍になる。 + + +Surprise Bondage +効果的な拘束 +Binding from critical hits is 40% stronger +会心の一撃による拘束力が40%増加する。 + + +High Profile +厳重警備 +Several enemies on each map will be high value, rewarding more gold and items for defeating them but increasing their strength. +マップに配置される敵が増え、倒すとより多くのゴールドやアイテムがもらえるが、敵が強くなる。 + + +You apply the RSTR to the ENNME! (AMNT% bound) +RSTR を ENNME に取り付けた!(拘束値 AMNT%) +You untie the ENNME! (AMNT% bound) +ENNME の拘束を緩めた!(拘束値 AMNT%) ++AMNT Bondage! +拘束値 +AMNT +TargetEnemy receives AMNT binding! +TargetEnemy は AMNT の拘束値を受けた! +TargetEnemy is disabled and receives an increased AMNT binding! +TargetEnemy は弱点を付かれ AMNT の拘束値を受けた! +TargetEnemy resists bondage and receives a reduced AMNT binding! +TargetEnemy にはあまり効いていないようで AMNT の拘束値を受けた。 + + +Target must be helpless. +ターゲットは完全拘束されている必要がある。 +You steal the target's disguise! +ターゲットの衣装を盗んだ! +You remove your disguise. +変装を脱いだ! +You are already wearing that faction's disguise. +既に変装している。 +Steal Disguise +衣装を盗む +Choose target to steal from +衣装を盗むターゲットを選択 +Steal's a helpless enemy's clothes, adding a great deal of distraction to her and stealing her disguise for yourself. Until you recast this on yourself, you gain a stealth bonus against members of the same faction. +完全拘束した敵の服を盗み、彼女の興奮値を大幅に上昇させる。再使用するまで、同じ勢力のメンバーに対して敵対されにくくなる。 + + + + +Unstoppable (Ignore status/bondage) +アンストッパブル(状態異常/拘束無視) +Unflinching (Resist status/bondage) +スーパーアーマー(状態異常/拘束耐性) +Relentless (Stun resist when stunned) +無慈悲(スタン時、次のスタン効果に耐性を得る) +Bulwark (Blocks some explosions) +耐爆(爆発ダメージをブロックする) +Blindsight (See through walls) +ブラインドサイト(壁を見通す) + + +Mana Harvesting +マナハーベスト +Defeating or capturing a spellcaster-type enemy recovers 10 arcane energy, reduced to 1 for other humanoids. +魔法を使う敵を倒した際、エネルギーが10回復する。他の人型を倒した際には1ポイント。 + + +A powerful wind pushes you away!!! +強力な風に押し出された! + + +Staff of Ropes +縄の杖 +An enchanted rope kept in check by a magical seal. Surely this won't backfire... +魔法の封印が施された魔法の縄の杖。こちらに牙を向いたりはしない……はず。 ++20% rope bindings applied. Deals chain damage. Active: Spend 25 mana to unleash the ropes in a wide AoE. +チェーン属性。ロープでの拘束値が20%増加する。アクティブ時:25マナを消費し、範囲内にロープを放つ。 +You pick up a staff of ropes. Finally, a way to contain its power! +縄の杖を拾った。ようやくこの力を封じ込められた! + + +Staff of Belts +ベルトの杖 +Belts within belts, a fractal belt pattern buckled into oblivion. +ベルトが絡まりあってフラクタル構造ができている。 ++20% leather bindings applied. Leather spells apply debuffs for 30% longer. Deals chain damage. Active: Pull an enemy toward you and apply a small amount of bondage. +チェーン属性。革での拘束値が20%増加し、デバフの持続時間が30%伸びる。アクティブ時:敵を手前に引き寄せ、少量の拘束値を加える。 +You pick up a staff of belts wrapped tightly in leather. +革にベルトが絡まった杖を拾った。 + + +Binding Lock +バインディングロック +A LKTYP lock clasps on to one of your restraints! +拘束具に LKTYP の鍵がかかった! +You are caught in a constricting field! (Dmgdlt) +錠前が体に当たった! (Dmgdlt) + + +Resin Coating +樹脂 +A layer of transparent resin derived from Green Latex. Unlike other forms of latex, this one is solid and fixes you in place. +緑のゴムからできた、半透明な樹脂。他のゴムとは違い、囚われると指一本動かせない。 +It's like you're an art piece! If only you had some way to blast it off... +精巧な彫刻のように固められてしまう。どうにかして吹き飛ばす方法があれば…… + + +You hear a motor whirring... +モーターの作動音が聞こえる…… +A bubble of latex surrounds you and inflates, sealing you in! +膨らむゴムの泡に包み込まれた! +A bubble of latex envelops you! +ゴムの泡に包み込まれた! +A ball of latex surrounds you and inflates, sealing around your neck! +ラテックスボールが周囲に現れ、首から下を飲み込まれてしまった! +A ball of latex envelops you! +ラテックスボールに包まれた! +The latex around you dampens your attacks, reducing physical damage by 30% and lowering your sight range. +周囲のラテックスに攻撃を減衰させられる。物理ダメージが30%減少し、視界の範囲が狭くなる。 + + +Latex Ball +ラテックスボール + + +...Lab Assistant? +ラボの研究員……? +You rescue the lab assistant. +ラボの研究員を救った。 +The assistant restrains you! (+RestraintAdded) +研究員に拘束された! (+RestraintAdded) +The assistant gropes you playfully! (DamageTaken) +研究員が愛撫してきた! (DamageTaken) +The assistant applies a lock! (DamageTaken) +研究員に拘束具をロックされた! (DamageTaken) +The assistant splashes a solvent in your face, blinding you! (DamageTaken) +研究員に奇妙な液体をかけられ、目潰しされた! (DamageTaken) +...Glue Technician? +接着剤の技術士……? +You rescue the glue technician. +接着剤の技術士を救った! +The technician slaps adhesive restraints onto your body! (+RestraintAdded) +接着剤の技術士に拘束された! (+RestraintAdded) +The technician polishes your restraints thoroughly! (DamageTaken) +接着剤の技術士が拘束具に塗料を塗ってきた! (DamageTaken) +The technician pours glue on you to make you stay still! (DamageTaken) +接着剤の技術士に接着剤をかけられた! (DamageTaken) +The technician inspects your restraints and adds a lock to spec! (DamageTaken) +接着剤の技術士に拘束具をロックされた! (DamageTaken) + + +Lab Assistant +ラボの研究員 +The assistant envelops herself in her own bubble for protection. +ラボの研究員はプロテクション・バブルの中に避難した! + + +Glue Bomb +接着剤ボム + + +Glue Technician +接着剤の技術士 +The technician trips and glues herself to the floor. +接着剤の技術士は接着剤まみれの床につまずき、動けなくなった! + + +Quite sticky, innit? +かなりベタベタしている。 + + +Bow: This is a ranged weapon with a weapon ability. +弓:アビリティを使用することで、矢を放つことができる。 +Magic: Ignores evasion of ghost type enemies, can be used with abilities that require magic weapons. +魔法:ゴーストタイプの敵の回避力を無視する。魔法武器を必要とするアビリティを使用可能になる。 +Light: Can be used to cut even with bound arms. 50% reduced accuracy penalty from being bound. Can be held in mouth. +軽い:腕を縛られていても、拘束具を切断できる。縛られていることによる命中率ペナルティを50%軽減できる。口にくわえることができる。 +Offhand +サブウェポン +Offhand: This weapon can be dual-wielded by some classes. +サブウェポン:二刀流可能。 +2 Handed +両手持ち +2 Handed: While wielding this as your primary weapon, you cannot wield an offhand weapon. Also this weapon can't be used while arms are tied. +両手持ち:他の武器との二刀流が不可能。腕を縛られている時、この武器は使用できない。 +### Magical Focus + +### Magical Focus: Instead of losing accuracy, the stamina cost is increased when distracted. + +Precision +精密 +Precision: Your arms need to be free to use this weapon. +精密:使用するには両手が自由でなければならない。 +Hands-Free +ハンズフリー +Hands-Free: Weapon can be used without free hands. +ハンズフリー:手を使わずに使用可能。 +Shield +盾 +Shield: This weapon is intended for defensive use. +盾:敵の攻撃を防御できる。 +Heavy: This weapon takes +1 turns to switch to. Cannot be reduced to 0 by perks or upgrades. +重い:武器を変更するのに追加で1ターンかかる。この効果はパーク等で0にできない。 +Massive +巨大 +Massive: This weapon either stuns or slows you after attacking with it. Handle with care! +巨大:この武器で攻撃した後、気絶させるか減速状態にする。取り扱いには注意しよう! +Illumination +灯り +Illumination: This weapon is a light source. +灯り:装備すると光る。 + + +Dual Wield +二刀流 +Designate an Offhand weapon to gain passive effects such as a light source, armor, or extra crit damage.|(Must equip Dual Wield spell to equip an offhand weapon) +空いている手にもう一本の武器を持ち、武器に応じた様々な効果を得る。|(このスキルを使用し、装備する武器を選択する必要がある) + + +Equip Offhand +サブウェポンに装備する +Remove Offhand +サブウェポンを外す + + +Make a ranged attack with the spear. +槍で遠距離を攻撃する。 +Make a ranged attack with the pike. +パイクで遠距離を攻撃する。 + + +Ranged Attack +遠距離攻撃 + + +Combat Training +戦闘訓練 +Your training has granted a number of bonuses:|-Weapon stamina cost is reduced by 1% per 10 current WP, up to a max of 40%.|-Slow effects wear off more quickly.|-While you are above 0 WP you gain 1 slow resist. +戦闘訓練を積んだことにより、様々な効果を得た。|――WP10につき1%スタミナを軽減する。最大40%まで。|――減速効果がより早く切れる。|――WPが0のとき、減速効果を1軽減する。 + + +This is your current offhand weapon. +反対の手に持っている武器 +You are unable to wield this weapon offhand at the moment. +今この武器を振るうことはできない。 +This is your previously held weapon. Click to switch to it. +以前持っていた武器。クリックで変更可能。 + + +You can't hold the WPN in your current state. +今の状態では WPN を持つことはできない。 + + +Charge! +吶喊! +Dash and make an attack attack against a target within 2 tiles. If it deals 20% of their current hp in damage, you knock them back and take their place, otherwise they take +15% max hp crush damage from hitting the wall. If the attack misses, you still dash. Costs stamina equal to your sprint cost plus your attack cost. +2マス以内の目標に向かって素早く突進し、攻撃を行う。相手の現在のHPの20%のダメージを与えた場合、ノックバックさせ、その場所に移動する。走りと攻撃コスト両方分のスタミナを消費する。 +You charge at the target! +相手に向かって突撃した! + + +You need to target an enemy. +敵を選択する必要がある。 +You don't have enough stamina. +スタミナが足りない。 +You need to be able to sprint. +走れない。 +You need to be able to attack. +攻撃できない。 +There is no room to dash! +走るスペースがない。 + + +Tools of the Trade +仕事道具 +Allows you to craft bombs, smoke bombs, flash bombs, and invisibility potions. +爆弾、煙幕弾、閃光爆弾、透明ポーションを作ることができる。 + + +(You start having crafty thoughts...)|(Gunpowder can be obtained from chests or Alchemists)|(Ectoplasm can be obtained from ghosts) +(アイテムを作ろう……)|(火薬は錬金術師や宝箱から入手できる)|(エクトプラズムは幽霊から入手できる) +(You craft a Smoke Bomb) +(煙幕弾を作った) +(You craft 3 Flash Bombs) +(閃光爆弾を3つ作った) +(You craft a Bomb) +(爆弾を作った) +(You craft an Invisibility Potion) +(透明ポーションを作った) +(You don't have the required material) +(必要素材を持っていない) +(Use 1 Gunpowder to make a Smoke Bomb) +(火薬1つで煙幕弾を作る) +(Use 1 Gunpowder and one Ancient Crystal to make 3 Flash Bombs) +(火薬1つと古代のクリスタル1つで閃光爆弾を3つ作る) +(Use 2 Gunpowder to make a Bomb) +(火薬2つで爆弾を作る) +(Use 3 Ectoplasm to make an Invisibility Potion) +(エクトプラズム3つで透明ポーションを作る) + + +Gunpowder +火薬 +You toss some gunpowder on the floor! No picking it back up now... +火薬を地面に撒いた!もう回収はできない…… +Highly flammable. Do not eat. +発火注意。食べないでください。 +Creates gunpowder tiles on the target area, which can be ignited. +指定したエリアに火薬を撒く。撒かれたエリアは発火可能。 +You pick up a sack of gunpowder. +火薬入りの袋を見つけた。 +You toss some gunpowder on the floor! +火薬を地面に撒いた! + + +Dual Wield (Rogue) +二刀流(盗賊) +### Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or extra crit damage.|Rogues cannot wield heavy or massive weapons in the offhand unless they are multiclass.|(Equip Dual Wield spell to equip an offhand weapon, or use the Items menu) + +Dual Wield (Wizard) +二刀流(魔術師) +Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or spell damage bonuses.|Wizards can only wield magic weapons in the offhand unless they are multiclass, and receive +1 slow level if they wield a 2-handed, heavy, or massive magical weapon in the offhand.|(Must equip Dual Wield spell to equip an offhand weapon) +空いている手にもう一本の武器を持ち、武器に応じた様々な効果を得る。|魔術師はマルチクラスでない限り、サブウェポンには魔法の武器のみを持つことができ、両手持ち、重い、大きな魔法の武器を装備した際、減速1を得る。|(このスキルを使用し、装備する武器を選択する必要がある) + + +Arcane Tome +アーケインの書 +Contains advanced formulas and thrilling tales of thirsty wizards. Can not critically strike. +高度な魔法の技術と、知識に飢えた魔法使いのスリリングな物語を収録。会心の一撃が発生しない。 ++5% magic damage. Offhand: Applies passive bonus. +魔法ダメージ+5%。 サブウェポン時:魔法ダメージ+5%。 +You find a magical tome. +魔導書を見つけた。 +Open the book. What can go wrong? +本を開くことの何が悪い? + + +Contains a malevolent spirit that wishes only to tie up damsels. Can not critically strike. +少女を縛るのが大好きな悪鬼が封印されている。会心の一撃が発生しない。 ++10% binding effectiveness. Offhand: Applies passive bonus. +拘束力+10%。 サブウェポン時:拘束力+10%。 +You find a magical tome with a sealed padlock on it. +錠前が施されている本を見つけた。 + + +You know the location of ancient leylines and can draw upon 100 additional mana. +古代のレイラインの場所を知っており、さらに100マナを引き出すことができる。 + + +You don't want to open the book... (need willpower) +本を開くための気力がわかない……(気力が必要) +Chain Spirit +チェーンスピリット +You open the book and suddenly a binding aura surrounds you! +本を開くと、突然拘束のオーラが周囲に現れた! +Mathematical Error +数学的誤り +You open the book to an unfinished page and the magic ink short-circuits! +本を開くと未完成のページが現れ、魔法のインクがショートしてしまった! + + +Cracks begin to form in your RestraintName! +RestraintName に亀裂が入り始めた! +Your RestraintName shatters and falls off! +RestraintName は粉々に砕け落ちた! + + +Load Hotbar +ホットバーをロード +Save Hotbar +ホットバーをセーブ +Clear Hotbar +ホットバーをクリア + + +Confirm clearing hotbar? +本当にホットバーをクリアする? + + +Add to Hotbar +ホットバーに加える + + +Surrender: Your willpower is 0, giving huge penalties to struggling, Block, Evasion, and Bondage Resist. +屈服:気力が0になっている。もがく、防御、回避、拘束回避に大きなペナルティ。 + + +Unbound Keybindings! --> +未設定のキーあり --> +You've not enough keys!!! --> +未設定のキーが大量にあり --> +Update your Keybindings!!! --> +キー設定をしてください。 --> +I have altered the keybindings. Pray I do not alter them further. +キーバインドを変更しました。これ以上変更しないことを祈っています。 + + +Barricade +バリケード +You knock over the barricade! +バリケードは崩れ去った! + + +Anti-Damsel Barrier +少女監禁バリア +You disable the barrier! +バリアは解除された! + + +Barrier +バリア +You shatter the barrier! +バリアは打ち砕かれた! + + +Magical Barrier +魔法のバリア +You destroy the barrier! +魔法のバリアは破壊された! + + +Mass of Shadow Hands +影の手の塊 +You banish the shadow hands! +影の手は払われた! +The shadow hands caress you and latch on! (DamageTaken) +影の手がまとわりつき、大量の手で全身を愛撫してきた! (DamageTaken) +The shadow hands caress you and latch on! (+RestraintAdded) +影の手がまとわりつき、大量の手で全身を愛撫してきた! (+RestraintAdded) + + +Shadow Chains +影の鎖 +You break through the chains! +影の鎖は突き破られた! +Conjured Chains +召喚された鎖 + + +Magic Damage +魔法ダメージ +Physical Damage +物理ダメージ +Special Ability +アビリティ +Ranged +遠距離 +Staff +杖 +Toy +オモチャ +Teasing +イタズラ + + +A rope trap springs upon you! +縄の罠が作動した! +A ribbon trap springs upon you! +リボンの罠が作動した! +A chain trap springs upon you! +鎖の罠が作動した! +Magical vines wrap around you suddenly! +魔法のツタが絡みついてきた! +A belt trap springs upon you! +ベルトの罠が作動した! +You find yourself suddenly bound tightly by magic gear! +気がつくと、魔法の拘束具で拘束されていた! +Magical rubber emerges from the floor and encases you! +地面から湧き出た魔法のゴムに包み込まれてしまった! +Slime appears at your feet and starts encasing you! +スライムが足にまとわりつき、体を覆い始めた! +You find yourself suddenly bound tightly in latex gear! +気がつくと、ラテックスの拘束具で拘束されていた! +A rubber cube rushes out of the floor and engulfs you! +地面からせり上がってきたゴムの箱に取り込まれてしまった! + + +Sharp Claws +鋭利な爪 +While your hands aren't covered, your attacks deal 10 bonus slash damage on hit and you can cut restraints. +手が覆われていない時、攻撃時に追加で10斬撃ダメージを与える。また、拘束具を切断できる。 + + +Powerful Bite +獣の顎 +Gain access to the Bite spell. +野生の魔法を使用可能になる。 + + +Slime Girl +スライムガール +You are a shapeshifting slime, granting +100 Glue Resist and can squeeze thru bars. Escaping is easy, but your powers are sealed while wearing cursed or magic restraints. +姿を変えられるスライムだ。ねばねば耐性が+100され、格子をすり抜けられる。拘束から容易に抜け出せるようになるが、呪いか魔法の拘束具で力を封印される。 +Cybernetic +サイボーグ +You have mechanical parts, granting +10 Physical Armor, +15 Block, and +10% base physical damage. -100 Electric Resist. +機械の体を持っている。物理アーマー+10、防御+15、物理ダメージ+10%、電気耐性-100。 +Magic Blood +魔法使いの血統 +You come from a magical lineage, granting +10 Magic Armor and +10% magic damage. +魔法使いの一族だ。魔法アーマー+10、魔法ダメージ+10%。 +Beast Girl +ケモ少女 +You have animalistic features such as a bite spell, -10% attack stamina cost, and 10 slash damage on hit while hands are free. -100 Charm Resist. +獣の血により、野生魔法を使用できる。攻撃に使用するスタミナ-10%、手が自由な時、10の斬撃属性ダメージを与える。魅了耐性-100。 +Demon Girl +悪魔 +You are related to eldritch entities, granting +50% shadow damage and the ability to teleport between shadows. You are weak to holy restraints and bright light. +禁忌の存在と関わりがある。影属性ダメージ+50%。影の間をてレポートする能力を得る。光や聖なる拘束具に弱くなる。 +You are a minor angel sent to perform a specific task. You are forced to wear a full set of divine restraints, but gain an infinite mana pool, +20 Magic Armor, and +25% magic damage. +特殊な任務を与えられた末端の天使だ。常に神の拘束具を着用しなければならないが、マナプールが無限になり、魔法アーマー+20、魔法ダメージ+25%。 +Elven Ancestry +エルフの血族 +You were blessed with immortality by Ninril, Goddess of Restoration, granting -50% sprint cost and -30 Physical Resist. While your WP is above 0, you regenerate WP and heal nearby allies. +ニンリルの加護を受けている。走りのスタミナ消費-50%、物理耐性-30。気力が1以上のとき、気力が自動回復し、近くの味方を回復する。 +Bast's Blessing +バストの加護 +You were granted undead immortality by Bast, granting a bite, claws, catlike senses, and stamina regen scaling with your current WP. Your WP gain is halved and you get -100 Fire Resist. +バストの不死の加護を受けている。牙と爪、そして猫の感知能力を持ち、スタミナの回復量が現在の気力の量に比例する。気力の回復量が半減し、火耐性-100。 + + +Minefield +地雷原 +Booby traps set by enemies are much more common. +敵が罠を頻繁に設置するようになる。 +Fortified +要塞化 +Barricades set up by enemies do not expire, and enemies set them up even when not alerted. +敵が設置したバリケードが時間で消えなくなり、警戒していなくても設置するようになる。 + + +Pass thru helpless allies +完全拘束された味方を通り過ぎる +Pass thru helpless enemies +完全拘束された敵を通り過ぎる +Pass thru neutrals +中立NPCを通り過ぎる +Pass thru summons +召喚物を通り過ぎる +Pass thru shopkeepers +店主を通り過ぎる +Pass thru special NPCs +特殊NPCを通り過ぎる + + +Stop when enemies are first sighted +敵を発見したら停止 +Suppress during combat +戦闘中は自動移動しない +Step during combat +戦闘中にステップする + + +### 0.1s/turn + +### 1.5s/turn + +### 0.5s/turn + +### 0.01s/turn + +Shadowy Grasp +影の掌握 + + +Magical Tornado +魔法の嵐 +The tornado blasts you with powerful winds! (DamageTaken) +強力な風に吹き飛ばされた! (DamageTaken) +You dispel the tornado! +嵐を解呪した! +Shield of Flame +炎の盾 +You dispel the shield! +炎の盾を解呪した! +Overgrowth +生い茂るツタ +You cut through the overgrowth! +生い茂るツタを刈り取った! +Wall of Water +水の壁 +You dispel the water wall! +水の壁を解呪した! +Ice Spikes +氷の棘 +You break through the ice! +氷の壁を打ち破った! +Earth Monoliths +地のモノリス +You shatter the monoliths! +地のモノリスを粉砕した! +Gravitational Pull +指向性重力波 +The earth emits a deep hum below your feet... +足元から地響きを感じる…… +Electrified Sphere +超電磁スフィア +You smash the electrified sphere! +超電磁スフィアを破壊した! +A bolt of lightning arcs to you! (DamageTaken) +スフィアから放たれる電気に打たれた! (DamageTaken) + + +Earth Keeper +アースキーパー +The earth keeper sinks into the wall. +アースキーパーは壁の中に沈んでいった。 +The earth keeper conjures restraints on your body! (+RestraintAdded) +アースキーパーが身体に拘束具を召喚してきた! (+RestraintAdded) +The earth keeper locks a restraint! +アースキーパーに拘束具をロックされた! +The earth keeper knocks you away with a powerful kick! +アースキーパーに吹き飛ばされた! +The earth keeper massages you gently! (DamageTaken) +アースキーパーに優しくマッサージされた! (DamageTaken) +The earth keeper knocks you away with a strong kick! (DamageTaken) +アースキーパーは強力なキックを繰り出してきた! (DamageTaken) + + +Flame Keeper +フレイムキーパー +The flame keeper steps away into a fiery portal. +フレイムキーパーは燃え盛るポータルに消えていった。 +The flame keeper grabs you, and volcanic restraints emerge from her armor! (+RestraintAdded) +フレイムキーパーに掴まれると、彼女の鎧から燃え盛る拘束具が飛び出してきた! (+RestraintAdded) +The flame keeper locks a restraint! +フレイムキーパーに拘束具をロックされた! +The flame keeper flanks you! +フレイムキーパーが飛び込んできた! +The flame keeper offers a painful caress! (DamageTaken) +フレイムキーパーに熱烈な愛撫をされた! (DamageTaken) +The flame keeper rides forth on a wave of fire! +フレイムキーパーは炎の波に乗って距離を詰めてきた! + + +Smoldering Trail +くすぶる軌道 +Fiery Greatsword +炎の大剣 + + +Tangling Vines +タングルバイン +Enchanted Bubble +魔法の泡 +A bubble of magic water starts forming around you! +周囲に魔法の水の泡が形成され始めた! +The gap in the bubble closes, and you are fully sealed within the bubble! +泡の隙間が閉じ、完全に閉じ込められた! +Magical water reduces your accuracy and slows you significantly! +魔法の泡で命中率と速度が大幅に低下している! +You attack twice! +二回攻撃! +You gain a free move from Combat Maneuvers! +再移動が可能になった! + + +Access denied. +アクセス拒否。 +Facility is under lockdown. +工場はロックダウン中です。 +Please scan ID to continue. +もう一度IDをかざしてください。 + + +Security Door +セキュリティドア +You break through the security door! +セキュリティドアを破った! + + +High Security Door +ハイセキュリティドア +You knock down the security door! +ハイセキュリティドアをぶち破った! + + +Blast Door +ブラストドア +You knock down the blast door! +ブラストドアを破壊した! + + +You sell the ITM for VLU gp. +ITM を VLU ゴールドで売った +You sell #x ITM for VLU gp. +#x 個の ITM を VLU ゴールドで売った + + +Directional Vision +視野が狭い +Your vision is reduced except in the direction you are facing. +向いている方向以外の視界が狭くなる +Inertia +慣性移動 +Turning 180 degrees while moving requires an extra turn +向きを180度変える時、追加のターンが必要になる +Heavy Inertia +超慣性移動 +Turning 90 degrees while moving requires an extra turn +向きを90度変える時、追加のターンが必要になる + + +You turn. +横に向いた +You turn around. +振り向いた + + +Take Command +指揮マスタリー +Unlocks several spells for commanding allies. +味方を指揮するための魔法を覚える + + +Attention! +注目! +Select allies in an area +エリア内の仲間を指定 +Designate allies in a 3x3 area to follow orders. +3x3エリア内の味方を指定し、命令に従うようにする。 +You select the units. +仲間を選択した。 + + +Deselect +選択解除 +Deselect allies in a 3x3 area +3x3エリア内の味方の選択を解除する。 +You deselect the units. +仲間の選択を解除した。 + + +Toggle Selection +選択切り替え +Select ally +仲間を選択 +Toggle an allied unit's selection status. +エリア内の仲間の選択/選択解除を切り替える。 +You toggle the unit's selection. +仲間の選択を切り替えた。 + + +Maneuver +移動 +Select target location +位置を選択 +Order all selected units to move to the targeted point. +選択された味方を指定した位置に動かす。 +You order your units to move! +指定した場所に移動! + + +Hold Position +待機 +Selected units do not pursue enemies. +敵を追っていない味方を選択。 +Free Movement +自由行動 +Cancels Hold Position on selected units. +選択した味方の待機を解除 + + +Deselect All +選択全解除 +Deselects all selected units. +全ての味方の選択を解除する。 +On Me! +追従! +All selected units start following you +全ての選択した味方がついてくる +Disperse +分散 +All selected units stop following you +全ての選択した味方が追従しなくなる +Defensive Order +防御的 +All selected units switch to Defensive mode +全ての選択した味方が敵に対して消極的になる +Aggressive Order +攻撃的 +All selected units switch to Aggressive mode +全ての選択した味方が積極的に攻撃を仕掛ける + + +Unlock using magic +魔法を使って解錠 + + +Include Weapons +武器を含む +Merge Armor +鎧を統合 + + +The NPC does not have enough money left! +十分なお金を持っていないようだ。 + + +You order the ENMY to come to you. +ENMY に近くに来るよう命令を出した。 +You order the ENMY to disperse. +ENMY に分散するよう命令を出した。 +You deselect all allies and select only the ENMY. +ENMY 以外の選択を解除した。 +You remove the ENMY from your party. +ENMY をパーティから追放した。 + + +Anti-Magic +アンチマジック + + +Long ago, war raged across the globe.|Countless lives were lost fighting over pieces of rock in a vast ocean.|People turned to science, religion, and magic, anything to escape this cruel fate. +はるか昔、世界中を巻き込んだ戦争が勃発した。|広大な海に浮かぶ小さな島を巡って、無数の命が失われた。|人々は死から逃れるために、科学、宗教、魔法と、あらゆるものに縋った。 +Then the archmagus, Sariel Vinlaga, discovered the secret of immortality.|Sharing her research across the globe, she laid the groundwork for an era of peace.|A great civilization arose, where magic and technology flourished. +ある日、偉大なる魔術師サリエル・ヴィンラーガは、不死の秘法を発見した。|彼女はこれを世界に広め、平和な時代への基礎を築いた。|魔法と科学の融合した、偉大なる文明が幕を開けた。 +But in the end, Sariel's experiments left her weakened and unable to save herself from death.|Without a leader, the Old Civilization collapsed into tyranny as warlords enslaved thousands.|Refugees fled across the sea in search of a new life, and in time the old empire was forgotten. +しかし、サリエルは探求の果てに衰弱し、死亡してしまう。|偉大な指導者を失った旧文明は愚者による専制が始まり、軍は無辜の市民を次々と捕らえ、奴隷としていった。|残された民は難を逃れようと海を渡り、民を失った旧き帝国は朽ち果て、歴史から姿を消した。 +Hundreds of years later, a group of adventurers found a lost island full of ancient technology.|Countless visitors now flock to the ruins in search of wealth and wisdom...|...Unaware of the devious secrets sealed within long ago. +数百年の後、冒険家たちは古代の技術が眠る島を発見した。|今では、富と力を求めて無数の冒険者が遺跡を訪れている……|……はるか昔に封印された、巨悪の存在に気づかずに。 + + +An item has increased your spell damage! +アイテムが魔法の威力を強化している! + + +AMNT ice damage/turn vs. Frozen +凍結により AMNT 氷属性ダメージを毎ターン与える +AMNT shadow bleed (10 turns) +出血により10ターンの間 AMNT 影属性ダメージを与える + + +Sealing Talisman +封印の護符 +You were hit by one of Fuuka's talismans. Fuuka's magic begins sealing your power! +フウカの護符が身体に張り付いた。力が封じられていくのを感じる。 +You were hit by one of Fuuka's talismans. Fuuka's magic makes you sluggish!! +フウカの護符が身体に張り付いた。彼女の魔力により身体が重く感じる。 +You were hit by one of Fuuka's talismans. Fuuka's magic renders you helpless!!! +フウカの護符が身体に張り付いた。彼女の魔力によりどうすることもできない…… +You were hit by one of Fuuka's talisman projectiles. Fuuka's magic is restricting you! +フウカの護符が身体に張り付いた。彼女の魔力により動きを制限されている。 + + +Sealing Shadows +封印の影 +Shadowy magic is restricting you! +影の魔法に動きを制限される! +A powerful seal holds you in place temporarily!!! +強力な封印により一時的に動きを封じられた! + + +You lock yourself in magical locks! +自身の拘束具に魔法のロックを掛けた! +A collar module comes off with the collar! +首輪と一緒にモジュールが外れた! + + +Shock Module +ショックモジュール +A sinister device used to keep unruly wolfgirls in check. +手のかかるウルフガールを躾けるためのモジュール。 +If it works on them, it sure as heck works on you. It has a warning label that says: 'CAUTION: NOT WATERPROOF' +彼女たちに効くなら、人間にも効く。ラベルにはこう書いてある:水につけるな +Tracking Module +トラッキングモジュール +A homing device used to track unruly pets that wander too far. +よく迷子になるペットを追跡するためのモジュール。 +It has a warning label that says: 'CAUTION: NOT WATERPROOF' +ラベルにはこう書いてある:水につけるな + + +Your RestraintName stops working due to water damage! +RestraintName は水に浸かった影響で動作を停止した! +Your RestraintName sustains water damage from the high-pressure water! +RestraintName は高圧水の影響でダメージを受けた! +The RestraintName fizzles out! +RestraintName は消えた。 +Your RestraintName short-circuits briefly from the electrical damage! +RestraintName がショートした! + + +Quit Game +ゲームをやめる + + +Your RSTRNT glows and its seal vanishes as the shrine's energy fills the air. +祭壇のエネルギーが周囲に満ちると、RSTRNT が光り輝き封印が解かれた。 + + +The seal on your RESTRAINTNAME weakens as you simmer just below the edge. +RESTRAINTNAME の封印は快楽を得るにつれて弱くなっていった。 +Through your determination, you suprress the seal on your RESTRAINTNAME!!! +意を決して RESTRAINTNAME の封印を解いた! +The seal on your RESTRAINTNAME weakens as you maintain your composure. +冷静さを取り戻すにつれ、 RESTRAINTNAME の封印が弱くなった。 +Through your determination, you suprress the seal on your RESTRAINTNAME. +意を決して RESTRAINTNAME の封印を解いた! +You lose focus and the seal on your RESTRAINTNAME strengthens! +集中力を失い、 RESTRAINTNAME の封印が強まってしまった! +The item refuses to budge as you try to take it off. +いくら脱ごうとしても、この拘束具はびくともしない。 + + +The item bears a seal of dark pleasure. You can suppress it by edging yourself. +この拘束具には暗い喜びの印がある。快楽を得ることで、封印を弱められるかもしれない。 + + + + +Saved Outfits +セーブした服装 +Manage this Outfit +衣装の管理 +Change Pose +ポーズ変更 +Quick Color Palette +カラーパレット +Item Color +色 +Item Catalog +カタログ +Layers: +パーツ: +### Hex Code: + +Toggle Struggle UI Mode +UIの拘束具表示 +Change Character Pose +ポーズ変更 +Make Bullets Transparent +弾を透明にする +X-Ray Vision +X-Ray +Show Quick Inventory +クイックインベントリ +Skip Tutorial +チュートリアルをスキップ +Mod Compat Mode (requires reload) +MOD互換モード + + +Welcome to Kinky Dungeon! It looks like this is your first time,|Would you like a brief walkthrough of the interface? +Kinky Dungeonにようこそ!新顔みたいだね!|UIについての説明をする? +(Leave and Disable Tutorial) +(チュートリアルをオフにする) +(Yes Please!) +(チュートリアルを見る) +(It'd like a hands-on lesson) +体験レッスンのようなもの + + +Sure! I can lead you through some excercises in a safe and controlled environment.|This way you can figure things out at your own pace.|To start, choose one of the lessons below: +よし!それじゃあちゃんとした環境でいくつか教えていくね!|そうすれば自分のペースでできるからね!|それじゃあ学びたいことを選んで: +(Give me some rope lessons) +(縄について学びたい) +(Give me a nice leather outfit) +(革の衣装が欲しい) +(I enjoy the cold embrace of steel) +(冷たい鉄が好き) +(I love rubber!) +(ラバー大好き!) +(On second thought, maybe not) +(やめておく) + + +(About that hands-on lesson...) +(体験レッスンについて……) + + +This is you.|Over the course of the game, you will probably get tied up.|The controls to escape are located over your character.|Simply hover the mouse over your character to see them. +この子があなた。|ゲーム中、すぐに縛られることになるだろうね。|拘束から抜け出すためのボタンはこのキャラクターの上にあるよ。|マウスオーバーしてみて。 +There are four main ways to escape restraints:|Struggling, which is effective against flexible and weaker restraints,|Cutting, which depends on your held weapon and the item's properties,|Unbuckle/Untying, which depends on having free hands,|And Unlocking, which is required before you can Unbuckle. +拘束から抜け出すためには、主に4種類の方法があるよ。|まずはもがく。柔軟で、拘束力の弱い拘束具に有効だよ。|次に切断。これは持っている刃物や拘束具の材質によって抜け出しやすさが異なるよ。|次にバックルを外す/ほどく。両手が空いているかどうかによって効率が異なるよ。|最後に解錠。バックルを外す前に必要になるよ。 +These are options for how to display your character.|You don't have to worry about them for now,|but when your character is tied up you may find them useful|...or enjoyable. +次に、キャラクターの表示オプション。|今のところ特に必要はないけど、|キャラクターが縛られているときに役に立つよ。|……もしくは、楽しめるよ。 +This is the buffs bar.|It shows various values and buffs relating to your character.|You can click the gold triangle to expand it,|Showing additional info about your character. +これはバフの表示欄。|キャラクターに付与された様々なバフが表示されるよ。|黄色い三角をクリックすると、全てのバフが表示されて、|詳細が見られるよ。 +These are the action buttons.|You can use them to perform various actions like closing doors or sprinting.|You can also toggle various settings such as automatically passing|through allies or auto-pathing when there are no enemies nearby.|You can also swap between recently used weapons. +これらはアクションボタン。|ドアを閉じたり、走ったりできるよ。|すり抜けやしゃがみはトグル式で切り替えられるよ。|仲間を通過したり、敵が近くにいないときに自動で移動したり。|最近使った武器を素早く切り替えることもできるよ。 +These are various submenus.|Your Inventory is used to brows items and use or equip them.|The Journal contains lore, notes, and hints gathered along your journey.|The Journal also contains info on available quests,|and your reputation with various factions. +ここはサブメニューだよ。|アイテムではアイテムを装備したり使用したりできるよ。|ノートでは関係性やクエスト、集めたノートを見られるよ。|クエストの詳細を見たり、|様々な勢力との関係性も確認できるよ。 +This is the status bar, which gives info on your base stats.|Distraction determines how easy it is to cast spells and resist teasing.|Stamina is required to sprint and attack with a weapon.|Mana is used to cast spells. You have what is called a 'Mana Pool,'|which is excess mana that slowly refills you mana bar until it runs out.|Finally, running out of Willpower makes it much harder to escape bondage. +これはステータスバー。基本ステータスが分かるよ。|興奮値は魔法の失敗率や、愛撫への抵抗力に関係するよ。|スタミナは走ったり攻撃をしたりするときに使うよ。|マナは魔法の詠唱に使うよ。ゲージの下にある白い線がマナプールだよ。|マナが減ると、マナプールからゆっくりと補充されるよ。|気力は減ると拘束から抜け出しにくくなるよ。 +This is the hotbar.|Here you will find various spells and customizable actions.|You can customize it through the Spells submenu by clicking on a spell.|You can also add items, armor, and consumables to it from the Inventory. +これはホットバー。|魔法を初め様々な動作をここから素早く行えるよ。|「魔法」からは魔法を登録できるよ。|「アイテム」からも消耗品や鎧とかを登録できるよ。 +Finally, this is where the message log will be.|It provides a written record of what happened the last few turns.|You can click the 'Log' button to expand the log,|Allowing you to look much further back. +最後に、ここにメッセージのログが表示されるよ。|ここ数ターンの間で何が起こったか記録されているよ。|黄色い三角形をクリックすれば、|より多くのメッセージを表示できるよ。 +Thats it for the UI.|If you want a more hands on tutorial, enter the portal to the top right,|near the training dummies.|You can click on NPCs (such as the ghosts in this room) to talk to them. +UIについてはここまで。|もっとチュートリアルが見たいなら、|上にあるポータルを通ってね。|クリックすればNPC(この部屋にいる幽霊のような存在)と会話できるよ。 + + +Game +ゲーム + + +Search ITMNS: +ITMNS 検索: +Search Items: +アイテム検索: +Search Spells: +検索 + + +Free +自由 +Disarmed!!! +武装解除された! +Show Buffs and Stats +ステータスを見る + + +Remove Devotion +献身をやめる +Devote Yourself +神に仕える +Pray for Assistance +アシスタントを呼ぶ +This shrine bears a request carved in stone: +祭壇の石に願いが刻まれている: +Accept the Quest +クエストを受領 + + +You accept the goddess' quest. +神のクエストを受領した! +You cannot accept that quest right now. +今はクエストを受けられない。 + + +Removes your devotion from this goddess. +献身をやめ、クエストを受けない。 +You are not devoted to this goddess. +この神に仕えていない。 +Guarantees a quest from this goddess on every floor. +フロアごとにこの神からクエストを受注する。 +You are already a devotee of this goddess. +既にこの神に仕えている。 +Offer gold in exchange for help. Destroys the shrine. +お金を寄進し、助力を乞う。祭壇は破壊される。 +Ask for help without offering gold. +寄進なしに助力を乞う。 +You have already prayed at this shrine. +この祭壇では既に助力を乞うている。 +Listen to what the Goddess asks of you. +女神の言葉に耳を傾ける。 +Accept the Goddess' quest. +クエストを受領する +Drink the mana in the shrine. Can be done once. +祭壇の泉にある水を飲み、マナを回復する。一度だけ可能。 +Bottle the mana in the shrine for later. Can be done once. +祭壇の泉にある水を瓶に詰める。一度だけ可能。 + + +Cancel Quest +クエストをキャンセル +Cancels the quest. You will not be penalized. +クエストをキャンセルする。ペナルティなし。 +You can't cancel this quest. +このクエストはキャンセルできない。 +You have no quests currently. +受領しているクエストがない。 + + +A new quest has been added to your Journal. +新しいクエストが日記に記載された。 + + +Find the dressmaker's prized dress and wear it in front of her. +仕立て屋の落としたドレスを探し出し、着てから話しかける。 +Rescue the bandit from false imprisonment. +不当に収監された盗賊を探し出し、助け出す。 +Teach some unruly maids a lesson. +躾のなっていないメイドを探し出し、"教育"する。 +Defeat a rebel leader and show them their place. +逆賊のリーダーを倒し、立場を教えてやる。 +Help the student acquire a scroll! +生徒が探している巻物を渡す。 +You are being chased by a band of relentless poachers. +執拗な狩人達に狙われている。 + + +Slay the Rope Kraken. +ロープクラーケンを討伐する。 +You did not do your quest! The Goddess has decided to punish you. +クエストを達成できなかった。女神を怒らせてしまった。 +You have pleased the Goddess. +女神を喜ばせることができた。 +The Goddess calls you a good girl. +女神にいい娘と褒められた! +Rescue some alchemists from their own experiment. +錬金術師を救出する。 +### Stop rebels from making a pact with primordial beings. + +Decommission some malfunctioning drones. +故障したドローンを機能停止する。 + + +Resolve a dispute between elves and catgirls by tying up both sides. +エルフとバスト教団の争いを調停する。 +Repel a planar incursion by a dangerous demon. +世界を脅かす悪魔を退治する。 +Stop some witches from performing a dubious summoning ritual. +怪しげな召喚儀式を行う魔女達を排除する。 +Defeat a congregation of the Shadow Clan. +影の一族を倒す。 + + + + +The Goddess grants you knowledge of SpellLearned! +褒賞として SpellLearned の知識を頂戴した! +You Goddess grants you +AMOUNT spell points! +褒賞として +AMOUNT スキルポイントを頂戴した! +The Goddess bestows a WeaponAcquired on you! +褒賞として WeaponAcquired を頂戴した! +The Goddess grants you a ArmorAcquired! +褒賞として ArmorAcquired を頂戴した! +The Goddess gives you a heavenly pastry. +褒賞として、天国のお菓子を頂戴した! +The Goddess awards you an ancient key of great importance. +褒賞として、古代の鍵を頂戴した! + + +Game Setup +基本 +Challenge Settings +チャレンジ + + + + +Challenge Settings: +チャレンジ: + + +Advanced +詳細 +Expert Tools +エキスパート + + +Exits locked!|Find NUMBER keys! +出口には鍵がかかっている!|NUMBER の鍵を見つけよう! +Got the keys! +鍵を手に入れた! +Find the keys hidden in the level. Enemies can steal the keys if you aren't careful. +鍵を見つけよう。気をつけないと、敵に鍵を盗まれてしまう。 +There seems to be a locked high-security door. Looks like you need keys to open it. +階段には高度な鍵がかかっている。鍵を見つけよう。 +Exits locked!|Find a lever! +出口には鍵がかかっている!|レバーを見つける +Exits unlocked! +出口には鍵がかかっている! +Lever Hunt +脱出方法:レバーを見つける +Find the lever hidden in the level to unlock the door. +レバーを見つけて鍵を開ける +There seems to be a locked high-security door. Looks like you need to pull a lever to open it. +階段には高度な鍵がかかっている。レバーを引いて鍵を開けよう。 +Exits locked!|Find control panel! +出口には鍵がかかっている!|コントロールパネルを見つける +Panel Hunt +パネルを見つける +Find the control panel hidden in the level to unlock the door. +コントロールパネルを見つけて鍵を開ける +There seems to be a locked high-security door. Looks like you need find a control panel to open it. +階段には高度な鍵がかかっている。コントロールパネルを操作して鍵を開けよう。 +BOSS ROOM +ボス部屋 +BOSS ROOM CLEARED! +ボス部屋(クリア) +Boss +ボスを倒す +Defeat the boss to unlock the door. You can also unlock it by losing to the boss and being penalized. +ボスを倒して鍵を開ける。ボスに負けた場合もペナルティを受けて鍵を開けられる。 +There seems to be a locked high-security door. Looks like you need to defeat the boss to open it. +階段には高度な鍵がかかっている。ボスを倒して鍵を開けよう。 +Exits locked!|Defeat NUMBER TYPE! +出口には鍵がかかっている!|NUMBER の TYPE を倒す +Quota Reached! +規定数に到達 +Bounty +ターゲットを倒す +Defeat the specified targets to unlock the door. +ターゲットを倒して鍵を開ける +There seems to be a locked high-security door. Looks like you need to defeat the targetted enemies to open it. +階段には高度な鍵がかかっている。指定された敵を倒して鍵を開けよう。 +Exits locked!|Defeat TYPE! +出口には鍵がかかっている!|TYPE を倒そう +Miniboss defeated! +小ボス撃破! +Dangerous Bounty +強敵を倒す +Defeat the specified strong enemy to unlock the door. +指定された強力な敵を倒して鍵を開ける +There seems to be a locked high-security door. Looks like you need to defeat the miniboss to open it. +階段には高度な鍵がかかっている。指定された強力な敵を倒して鍵を開けよう。 +Exits locked!|Open NUMBER Chests! +出口には鍵がかかっている!|宝箱を NUMBER 個開けよう。 +Chest Hunt +宝箱を開ける +Unlock the specified number of chests to unlock the door. +指定された数の宝箱を開けてドアを開ける +There seems to be a locked high-security door. Looks like you need to open more chests to open it. +階段には高度な鍵がかかっている。 +Exits locked!|Accept NUMBER Quests! +出口には鍵がかかっている!|クエストを NUMBER 個こなそう。 +Quest Hunt +クエストをこなす +Accept the specified number of goddess quests to unlock the door. +指定された数のクエストを女神から受けて完了させる。 +There seems to be a locked high-security door. Looks like you need to accept more quests to open it. +階段には高度な鍵がかかっている。もっとクエストをこなす必要がある。 +Exits locked!|Trigger NUMBER Traps! +出口には鍵がかかっている!|NUMBER 個のトラップを起動させよう! +Trap Hunt +罠にかかる +Trigger the specified number of traps to unlock the door. +指定された数の罠を起動させる。 +There seems to be a locked high-security door. Looks like you need to trigger more traps to open it. +階段には高度な鍵がかかっている。 +Room bugged. Please Report. +!!!バグです、ご報告お願い致します!!! + + +This door failed to load and cannot be opened. Please report this bug to Ada with a save code. +不具合によりドアが開かない。セーブコードを記録し、ご報告お願いします。 + + +### Exit sealed!|Find the lair! + +### Sigils erased! + +### Dragon defeated! + +### Draconic Seal + +### A dragon has sealed the entrance. Defeat the dragon, or erase the sigil from her lair. + +### A draconic spell keeps the door sealed. You will have to confront its owner. + + + +### Exits locked!|Destroy NUMBER Servers! + +### Security System Compromised! + +### Clearance Granted! + +### Destroy Nevermere Servers + +### Destroy Nevermere servers to unlock the door. + +### Nevermere Inc. placed a computerized lock on the door. Destroy the security servers to pass. + +### Nevermere Server + +### Server smashed! + +### Destroy Drone Servers + +### Destroy Drone Node Servers to unlock the door. + +### The path forward is controlled by several ancient Drone Servers. Destroy them. + +### Drone Server Node + +### Drone node destroyed! + +### Rusty Server Node + +### loud beeping... + +(Cursed) +(呪われている) +(Purified) +(浄化) +of Agility +(疾風) +Precise +精確の +Silent +沈黙の +Blizzard +凍てつく +of Warding +(魔法) +of Freedom +(自由) +of Resistance +(抵抗) +of Power +(力) +Entuned +調律の +Draining +吸収の +of Echoes +(反響) +Infused +属性の +### Explosive + +### Flaming + +Focusing +集中の +of Empowerment +(強化) +of Destruction +(破壊) + + +Phase Dance +フェーズダンス +For 4 turns, your movement does not advance time. Attacking or casting counts as one move and passes time as normal. +4ターンの間、移動で時間が経過しなくなる。攻撃や詠唱は移動としてカウントされ、時間は通常通り経過する。 +You are F A S T +超加速! + + +Double Accel +ダブルアクセル +Slow down time by 1/2 for 10 turns (world time). Stamina regens 50% slower. +10ターンの間、周囲の時間が1/2になる。スタミナ回復量が50%遅くなる。 +Time is slowed by 2x +時の流れが1/2になっている +Triple Accel +トリプルアクセル +Slow down time by 1/3 for 10 turns (world time). Stamina regens 75% slower. +10ターンの間、周囲の時間が1/3になる。スタミナ回復量が75%遅くなる。 +Time is slowed by 3x +時の流れが1/3になっている +Quad Accel +クアドロアクセル +Slow down time by 1/4 for 10 turns (world time). Stamina does not regen. +10ターンの間、周囲の時間が1/4になる。スタミナが回復しなくなる。 +Time is slowed by 4x +時の流れが1/4になっている +Total Accel +フルアクセル +Stop time 10 turns (world time). Stamina does not regen. +10ターンの間、時間を完全に止める。スタミナが回復しなくなる。 +Time has come to a halt... +時は止まった。 + + +Time slows down by 2x! +時の流れが1/2になった! +Double Accel! +ダブルアクセル! +Time slows down by 3x! +時の流れが1/3になった! +Triple Accel! +トリプルアクセル! +Time slows down by 4x! +時の流れが1/4になった! +Quad Accel! +クアドロアクセル! +Time has ceased to pass. +時よ止まれ! +Total Accel! +フルアクセル! + + +You begin to move at lightning speed! +光の速度で動けるようになった! +ACCEL BEGIN! +加速開始! +Not enough mana. +マナが足りない。 +You need to free your legs. +足を自由に使える必要がある。 + + +Swap +スワップ +Choose a target with a clear line of sight to you and switch places with them. +対象と自身の場所を入れ替える。対象は視界内におり、障害物で隔たれていない必要がある。 +You point at the target and swap places with them! +対象と自身の場所を入れ替えた! +You point at the target and try tp swap places, but they resist! +対象と自身の場所を入れ替えようとしたが抵抗された! +You point at the target and try tp swap places, but they resist and the spell fails! +対象と自身の場所を入れ替えようとしたが失敗した! +Choose target to swap with +入れ替える対象を選択 + + +The ENMY blocked your attack, negating it entirely! +ENMY に攻撃を完全に無効化された! +The ENMY blocked your attack, reducing the damage by PCNT%! +ENMY に攻撃をブロックされ、ダメージを PCNT% 軽減された! +The ENMY remains unscathed after putting up a strong defense! +ENMY の強固なブロックで攻撃を完全に無効化された! +The ENMY puts up surprising resistance, reducing the damage by PCNT%. +ENMY は意外な抵抗をみせ、ダメージを PCNT% 軽減された! + + +### no damage + + + +Raise Defenses +ハイガード +Spend 90 stamina to shield yourself from damage equal to your Block. Lasts 10 turns or until you attack. +スタミナを90消費し、自分のブロック値までのダメージから身を守る。10ターン経過、または攻撃するまで継続。 +Evasive Maneuvers +集中回避 +While active, you evade almost all attacks, but your stamina is drained by 50 per turn plus 10 per slow level. The base stamina cost is reduced by your Evasion. +アクティブ時、全ての攻撃を回避するが、ターン毎に50のスタミナを消費する。スタミナの消費量は減速値1につき10増加し、回避力に応じて減少する。 +Break Free +回避のリズム +Consume 20 Battle Rhythm to increase escape power by +20% plus 1% of Bondage Resist. Lasts 60 turns or until your willpower reaches 0. +戦闘のリズムを20消費し、拘束から抜け出す力が20%上昇し、拘束耐性が1%上昇する。60ターン経過、または気力が0になるまで続く。 +Problem Solving +一挙解決 +While active, struggling takes an additional 10 turns, but escape power bonuses from tools and buffs is increased by +(25 + 20% Bondage Resist)% +アクティブ時、「もがく」が10ターン継続するようになり、バフや道具によるボーナスが25+拘束耐性の20%分上昇する。 + + +You run out of strength to keep dodging... +回避に割く集中力がなくなった…… +You can't muster the strength to dodge right now... +今は回避に集中できない…… +You prepare to dodge!!! +回避に意識を集中した! + + +Your expertise and skill provides you with additional tool effectiveness! (+AMOUNT%) +培った知識と技術により、道具を有効活用できた! (+AMOUNT%) + + +You raise your defences! +守備を固めた! +Your defenses are raised! +守備を固めている + + +You don't have the will to break free. +気力が足りない。 +You don't have enough Battle Rhythm. You need 20. +使用するには戦闘のリズムが20必要。 +You channel your fighting spirit into your desire for freedom! +自由への渇望に闘志を燃やした! +Your struggle power is greatly increased!!! +もがく力が大幅に上昇している! + + +The teleportation partially succeeds due to an obstruction, placing you near the intended point. +障害物に阻まれ、指定位置の近くにテレポートした。 +The teleportation fizzles due to obstruction. +障害物に阻まれ、テレポートは失敗した。 +Confirm +決定 +Confirm and OVERWRITE SAVE +上書き保存 +What is your name? +名前を決めてください + + +Enrage +ウォークライ +Scream loudly, causing nearby enemies to investigate and increasing Battle Rhythm by 10. Has a 100 turn cooldown. +大声で叫び、戦闘のリズムを10増加させる。音を発するため、近くの敵を呼び寄せる。クールタイム100ターン。 + + +You shout loudly and shake your fist at the sky! (+10 BR) +大声で叫び、天に拳を突き出した! (+10 BR) +Mmmph! (You can't shout while gagged) +んふぉぉお!(猿轡をかまされていては叫べない) +You are plenty mad enough as is. +クールタイム中 +You are too tired to rage. Perhaps try a warm cozy bed instead? +怒り疲れた。少しベッドで休みたい。 + + +turns +ターン + + +Your shield absorbed AMNT damage. +盾が AMNT のダメージを防いだ。 +You are currently shielded from damage and some spells. +盾のおかげでダメージとある程度の魔法を防げる。 +No offhand weapon set. Activate the spell in your hotbar to set one. +サブウェポンに武器を装備していない。二刀流のスキルを使用し、サブウェポンに持つ武器を決めよう。 + + + + +Flash Portal +フラッシュポータル +After channeling for 2 turns, teleport to a nearby location (including into darkness). All adjacent creatures are teleported with you, in random order. +2ターンかけて詠唱し、視界外を含む近くの場所にワープする。敵が近くにいる場合、その敵もワープする。 +You call upon a misty portal to transport you and nearby creatures! +霧のポータルを呼び出し、自身と近くの存在を転送する! + + +Transportation Portal +トランスポータル +After channeling for 3 turns, teleport to a nearby location (including into darkness). Transports only allies, but they are stunned for the duration. +3ターンかけて詠唱し、視界外を含む近くの場所にワープする。自身と味方のみワープ可能。味方が転送された場合、duration ターンの間気絶する。 +You call upon a misty portal to transport you and your allies! +霧のポータルを呼び出し、自身と近くの存在を転送する! + + +Banishing Portal +バニシングポータル +After channeling for 3 turns, teleport all adjacent creatures to a point you can see. Does not teleport yourself. +3ターンかけて詠唱し、近くにいる全ての敵を、見える範囲内の指定された位置に転送する。自身は転送されない。 +You call upon a misty portal to transport those around you! +霧のポータルを呼び出し、周囲の敵を転送する! + + +Rift +リフト +Tearing a rift in space, you teleport to a location (including into darkness). Leaves behind a rift for 4 turns, which enemies can follow you through. +空間に裂け目を作り、指定された位置にワープする。裂け目は4ターン残り、敵も通ることができる。 +You tear open a hole in space and step through! +空間に裂け目を作り、飛び込んだ! + + +Shadow Dance +シャドーダンス +While standing in a shadowed location, you can teleport to a nearby shadowed location. You can also teleport adjacent to shadow creatures. +影のあるマスに立っている場合のみ発動可能。近くの影のあるマスか影属性の敵の隣にテレポートする。 +You slip between the shadows... +影の中に潜り込んだ…… +Choose a shadow +影を選択 + + +Teleportation Circle A +テレポート・ポイントA +When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. When learned, unlocks teleportation circle B and C as well. +指定した位置を記憶する。記憶した状態で自身に唱えた際、10ターンかけて発動する。自身と近くの味方が記憶した位置にワープする。この魔法を習得した際、ポイントBとCも同時に習得する。 +You begin a teleportation ritual... +転送の準備を始めた…… +Choose a location to put a teleportation circle, or yourself to teleport to the created circle. +記憶する位置を選択するか、自身を選択。 +Teleportation Circle B +テレポート・ポイントB +When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. +指定した位置を記憶する。記憶した状態で自身に唱えた際、10ターンかけて発動する。自身と近くの味方が記憶した位置にワープする。 +Teleportation Circle C +テレポート・ポイントC + + +Nature Spirit +自然の精霊 +The nature spirit returns to the earth from whence it came. +自然の精霊は大地に帰っていった。 + + +Vine Bolt +ヴァインボルト + + +Gunslinger +ガンスリンガー +Weapons abilities and other abilities that cost charge contribute 20% of their cost to Battle Rhythm. +エネルギーを消費する武器アビリティ等を使用した際、消費したエネルギーの20%分を戦闘のリズムに加える。 +Effortless Assault +理に適った攻撃 +Weapon stamina cost is reduced by a percentage equal to your Battle Rhythm. +武器攻撃のスタミナ消費量を、戦闘のリズム%分低減する。 + + ++50 Evasion from using Phase +フェーズにより回避力+50 + + +Blade Dance +ブレードダンス +Costs 60 stamina to dash to an adjacent spot. If you are holding a physical weapon, deals cleave damage to nearby enemies equal to 50% weapon damage. If you have a Light offhand weapon, deal 75% of its damage as well. +スタミナを60消費し、指定したポイントまで攻撃しながら走る。物理属性の武器を持っている場合、近くの敵を薙ぎ払い、武器攻撃力の50%分の斬撃ダメージを与える。サブウェポンに軽い武器を持っている場合、威力が75%になる。 +You spin towards a location, slashing at nearby enemies! +刃を手に舞い踊りながら駆けた! + + +The Shadow Within +内なる影 +Shadow Dance no longer requires you to be in shadow in order to dash to another shadow, but the mana cost is doubled when doing so. +シャドーダンスを使用する際、影のあるマスに立つ必要がなくなる。影のないマスで使用した際、マナコストが2倍になる。 + + + + +Summon Holy Orb +ホーリーオーブ召喚 +Select where to put the holy orb (cannot place on occupied squares) +召喚するマスを選択(既に何かがある位置には召喚不可) +Create a stationary holy orb that lasts indefinitely and heals allies. It also fires blinding bolts at enemies within its aura. If you let go of yourself near a holy orb you are immediately punished. Should not be placed within 8 tiles of each other. +制限時間のない、味方を回復するオーブを召喚する。また、近くの敵を攻撃し、目隠し状態にする。ホーリーオーブの近くで絶頂した場合、罰を受ける。8タイル以内に配置してはならない。 +A holy orb descends, blessing you with its roundness. +ホーリーオーブが降臨し、祝福の光が降り注ぐ! +You call upon the root of all enlightenment! +真実を照らす光に呼びかけた! + + +Holy Orb +ホーリーオーブ +The holy orb returns to its place in the sky. +ホーリーオーブは空に帰っていった。 + + +Holy Bolt +ホーリーボルト + + +The holy orb observes your lack of discipline, and issues a punishment. +ホーリーオーブに監視されていた。戒律を破った罰を受ける…… + + +Divine Chastity Belt +神の貞操帯 +A chastity belt forged in holy light. Only a Goddess' will can release you. +聖なる光によって作り出された貞操帯。神によってのみ解放される。 +There is no way even an angel can free herself. Its divine aura causes vibrators to cease right before you go over the edge. +天使の力を持ってしても外すことのできない貞操帯。神聖なオーラで絶頂直前にプラグを止める。 +Your Divine Chastity Belt causes the vibrators to stop. +貞操帯の放つ神聖なオーラでプラグが停止した。 + + +A chastity belt forged in holy light. Only the will of a Goddess will release you! +聖なる光によって作り出された貞操帯。神によってのみ解放される。 + + +You find a heavenly chastity belt. Who could it be for? +神聖な貞操帯を見つけた。一体誰に使うのだろう? + + +Divine Chastity Bra +神の貞操ブラ +A chastity bra forged in holy light. Only a Goddess' will can release you. +聖なる光によって鍛えられた貞操帯。神のみがこの貞操帯を取り外せる。 +There is no way even an angel can free herself. Its divine aura prevents you from pleasuring yourself. +天使の力を持ってしても外すことのできない貞操ブラ。神聖なオーラで自慰が妨げられる。 +Your Divine Chastity Bra causes your whole body to go numb. +神の貞操ブラの力で体が痺れた! + + +A chastity bra forged in holy light. Only the will of a Goddess will release you! +聖なる光によって鍛えられた貞操帯。神のみがこの貞操帯を取り外せる。 + + +You find a heavenly chastity bra. Who could it be for? +天国の貞操ブラを見つけた。一体誰が置いたのだろう? + + +Heavenly Chastity Belt +天国の貞操帯 +There is no way even an angel can free herself. Its divine aura causes vibrators to dampen right before you go over the edge. +天使の力を持ってしても外すことのできない貞操帯。神聖なオーラで絶頂直前にプラグを止める。 +Your Divine Chastity Belt magically dampens the vibrations just enough to edge you. +貞操帯の放つ神聖なオーラでプラグが停止した。 + + + + +Heavenly Chastity Bra +天国の貞操ブラ +There is no way even an angel can free herself. Its divine aura converts self-pleasure to stamina. +天使の力を持ってしても外すことのできない貞操ブラ。神聖なオーラで快楽をスタミナに変換する。 +The divine aura drains the pleasure from your self-pleasuring and converts it to stamina. +神聖なオーラによって、自慰の快楽をスタミナに変換する。 + + + + + + +Magic Arm Belts +魔法のベルト(腕) +Highly secure belts enchanted with magic. +魔法の施された、頑丈なベルト。 +Magic Leg Belts +魔法のベルト(脚) +Magic Ankle Belts +魔法のベルト(足) +The Liquid Metal starts engulfing you! +液体金属に飲み込まれる! +The Liquid Metal explodes and covers you! +液体金属の爆発に巻き込まれ、身体に付着した! +The Liquid Metal takes advantage of your status and engulfs you! +液体金属に飲み込まれる! + + +Silver Burst +シルバーバースト +Select a liquid metal tile +液体金属のあるマスを選択 +Target a liquid metal tile. After 3 turns, it erupts, spreading more liquid metal and engulfing any nearby creatures. Deals DamageDealt crush damage and applies 80 points of metallic binding. +液体金属のあるマスを選択して使用。3ターン後、噴火して近くの敵を巻き込む。 DamageDealt 打撃ダメージを与え、80の金属拘束値を与える。 +A powerful explosion simmers beneath the surface...' +強大なエネルギーが液体金属の水面下で煮えたぎっている…… + + +The ground shakes as a huge wall of liquid metal approaches! +地を揺らしながら巨大な液体金属の壁が向かってきた! +Liquid Metal Cube +リキッドメタルキューブ +The liquid metal cube dissolves into a huge pile of glittering dust. +リキッドメタルキューブは粉々に爆ぜた。 +The liquid metal cube engulfs you and squeezes tightly! (DamageTaken) +リキッドメタルキューブがきつく飲み込んできた! (DamageTaken) +The liquid metal cube engulfs your body and hardens, taking the form of restraints! (+RestraintAdded) +リキッドメタルキューブに包み込まれ、一部が固まってしまった! (+RestraintAdded) + + +Skeleton Archer +スケルトンアーチャー + + +Cursed Arrow +呪いの矢 + + +Because your hands are unavailable, you kick the target instead. +手が使えないため、代わりに蹴った。 + + + + +Your former owners are looking for you across the seven planes. +前のご主人さまが、7つの世界を超えて探しに来た。 + + +A local business is missing one of their models, and will stop at nothing to find her. +ある会社に所属しているモデルが行方不明になった。どんな手段を使っても、彼女を見つけ出そう。 +The Doll Shoppe +人形店 +Elemental Slavers +精霊の奴隷商 + + +Your duty as a maid is to keep the place clear of dirt and other hazards. +メイドとしての仕事を受けた。ホコリやその他の危険を掃除しよう。 +Dirt Pile +ホコリの山 +You clear out the dirt pile +ホコリの山を綺麗にした。 +A ENMY was lurking inside the dirt pile! +ホコリの山から ENMY が出てきた! +You skipped your duty and left some dirt missing in the last level! +まだフロアにホコリが残っていたようだ…… + + +The Dollmaker does not take no for an answer. +ドールメイカーは拒否を受け付けない。 +Fuuka's shrine maidens would like to have a word with you. +フウカの使いから話があるようだ。 +Your instructor will meet with you at regular intervals for further training. +インストラクターから定期的にトレーニングを受けよう。 + + +Hogtied! +ホッグタイ +Experience a comprehensive rope bondage experience. +ホッグタイの状態でゲームを開始する + + + + +Receive the following restraints: +次の拘束を受ける: +You will be bound with some form of restraint. +何らかの拘束具で縛られることになる。 + + +Gag Geist +ギャグガイスト +The gag geist goes silent. +ギャグガイスト現象は収まった。 +The gag geist teases you playfully!! (DamageTaken) +ギャグガイストが見えない手で愛撫してくる! (DamageTaken) +The gag geist gags the girl with a ghastly grimace! (+RestraintAdded) +ギャグガイストがぞっとするような笑みで猿轡を噛ませてきた! (+RestraintAdded) + + +Poltergeist +ポルターガイスト +The poltergeist goes silent. +ポルターガイスト現象は収まった。 +The poltergeist gropes and teases you playfully, exhausting your stamina! (DamageTaken) +ポルターガイストに愛撫され、体力を消耗してしまった! (DamageTaken) +The poltergeist binds you with... something? (+RestraintAdded) +ポルターガイストが……何かで拘束してきた。(+RestraintAdded) + + +Invisible Gag +透明なボールギャグ +It's a gag, but invisible! +ただのボールギャグ。透明なことを除けば。 +You wonder what color it is. +何色なんだろう? + + +Invisible Blindfold +透明な目隠し +It's a blindfold, but invisible! +ただの目隠し。透明なことを除けば。 +How exactly is this supposed to work? +どうして機能しているのか全くわからない。 + + +Invisible Armbinder +透明なアームバインダー +It's an armbinder, but invisible! +ただのアームバインダー。透明なことを除けば。 + + +Invisible Legbinder +透明なレッグバインダー +It's an legbinder, but invisible! +ただのレッグバインダー。透明なことを除けば。 +This is starting to get cruel... +なんて酷い…… + + +Strangely dressed zombies start approaching you!! +奇妙な格好をしたゾンビが近づいてきた! +A floating chastity item appears and starts flying toward you! +浮遊する貞操帯がこちらに向かってきた! +You hear moaning as the statues start to move... +うめき声とともに像が動き出した…… +Devious tomes emerge from the bookshelves! +本棚から呪いの本が飛び出してきた! +Armed mushrooms emerge from the ground to defend their home! +我が家を守らんと武装したキノコが地面から飛び出してきた! +Playful ghosts slip through the walls, giggling to themselves! +ケラケラと笑いながら壁からいたずら好きな幽霊が飛び出してきた! +Ancient drones drop from the ceiling and come to life! +古代のドローンが天井から落下し、活動を開始した! +You were always being watched... +お前を見ているぞ + + +You find a store of gunpowder! +火薬箱を見つけた! + + +Explosive Barrel +火薬樽 + + +The explosive barrel falls apart and drops its gunpowder. +火薬樽はバラバラになり、火薬が飛び散った。 +The explosive barrel catches fire and explodes! +火薬樽が爆発した! + + +The item demands copious mana, more than you can supply. You'll have to tie up a mage. +この拘束具は大量のマナを要求している。魔法使いを捕まえなければならない。 +The cursed seal glows and pulsates as you struggle fruitlessly. +呪いの拘束具から逃れようともがくと、拘束具が光り出した。 +The curse has been lifted through judicious application of spellcasters. +魔術師を生贄に捧げ、呪いを解くことができた。 +The cursed item drains all of the caster's mana. It demands more. +この呪いの拘束具は着用者のマナを食らい続ける。 + + +Punishment Suit +懲罰用ペットスーツ +A tool used by Nevermere on the most difficult and recalcitrant wolfgirls. +ネバーミアが最も反抗的と認定したウルフガールに使用するペットスーツ。 +Designed to contain superhuman strength, struggling out of this would be a major feat. +常人を遥かに超える者を想定して作られているので、抜け出すのは至難の業。 + + +Shield of (un)Clarity +(不)明瞭のバリア +Channel your clarity of mind into a powerful shield, filling your distraction bar completely and granting a temporary shield equal to 50% of the DP generated. 10% of the DP gained is gained as Desire, which prevents DP decaying below a certain point. +DPをMAXにし、増えた分のDPの50%分のシールドを一時的に獲得する。上昇したDPの10%分の欲情値を獲得し、最低DPが増える。 +You form a... distracting mental barrier, shielding yourself for AMNT damage!!! +情欲のバリアを生成し、 AMNT ダメージ分のシールドを得た! +You are too distracted to form a mental barrier... +バリアを生成するだけの集中力がない…… +You have the mental clarity but not the magical clarity! (not enough mana) +バリアを生成するだけの集中力はあるが、マナが足りない! + + +You have formed a mental barrier... +情欲のバリアで守られている…… + + +Desire Burst +デザイアバースト +### Overload Essence motes in an area, costing 10% max DP worth of Desire each. They explode, dealing (10 + 20% max DP) charm damage to enemies hit. If you don't have enough desire, the damage is reduced proportionally.||(Desire is the heart-shaped meter below your DP bar, and is gained slowly by being distracted) + +### You channel your distraction into the mote, overloading it! + +### You channel your distraction into the motes, overloading them! + +You don't have enough of a desire to do that. +欲情値が足りない。 +### You must target at least one Essence Mote. + +You have the desire but not the mana! +欲望は十分だが、マナが足りない。 + + + + +Your divine-locked restraints can only be removed by completing a shrine quest. +女神の封印が施された拘束具は、祭壇のクエストをクリアすることでしか取り外せない。 + + +The Goddess hates you. That won't work. +機能しない。女神に見放されたようだ。 + + +Harvest +ハーベスト +Requires a slashing weapon equipped. Activate to harvest all adjacent vine tiles, with a 25% chance per tile to obtain a seed.|Seeds can be planted to form gardens, which will grow in 100 turns to become vegetables, which can be eaten to restore WP or sold to the shopkeeper. +斬撃属性の武器が必要。隣接する植物を刈り取り、1マスにつき25%の確率で種を入手できる。種を植えると100ターン後で成長して野菜になり、食べた際にはWPを回復し、販売も可能。 +You twirl your weapon, harvesting AMNT seeds! +刃を振るって草を刈り取り、 AMNT の種を回収した! +There is nothing to harvest. +周囲に刈り取れる草がない。 + + +Telekinesis 101 +テレキネシス入門 +Unlocks telekinetic abilities. Toggle on to equip weapons while bound, but at 0% accuracy. Learn Recover Object. +テレキネシスのスキルツリーを開放する。拘束されていても武器を装備できるが、基礎命中率は0%。「念動力」を習得。 + + +Recover Object +念動力 +Use telekinesis to pick up items and open chests from a distance. Refunds 75% of mana cost if not used to open a chest. +念動力で遠距離からアイテムを取得するか宝箱を開ける。アイテムを取得する場合、75%のマナコストとなる。 +The items float to you! +念動力でアイテムを手繰り寄せた! +There's nothing to pick up. +念動力で取れるものがない。 +The chest is locked. +チェストはロックされているようだ。 +Select a tile with items +アイテムのある位置を選択 + + +Enhanced Recovery +強化念動力 +Upcast to increase range and recover objects in an area. +魔法強化により、距離と範囲が伸びた。 +That container is locked! +施錠されている! +Select an area with items +アイテムのあるエリアを選択 + + +Kinetic Slash +キネティックスラッシュ +Swing an equipped weapon (not unarmed or hands free) in a line, slashing enemies in the way with 20 + 80% weapon damage. Counts as an attack. +10 mana cost if wielding a Heavy weapon. +念動力で線状に武器を振るい、20+武器攻撃力の80%のダメージを与える。この行動は攻撃とみなされ、重い武器を使用した際にはマナコストが10増加する。 +You swing! +念動力で武器を振るった! +Choose where to swing (must not be unarmed or hands free weapon) +武器を振る位置を選択 + + +Kinetic Lance +キネティックランス +Propel your weapon at devastating speed, piercing enemies for 30+160% Weapon Damage and dropping it at the end of the trajectory. Counts as an attack. +15 mana cost if wielding a Heavy weapon. +武器をまっすぐ射出し、30+武器攻撃力の160%のダメージを与える。射出した武器は弾道の終点に落下する。この行動は攻撃とみなされ、重い武器を使用した際にはマナコストが15増加する。 +You propel your weapon forward! +念動力で武器を射出した! +Choose where to launch your weapon. +武器を射出する位置を選択 + + +Sagitta +サジッタ +Fire a projectile. If this projectile hits an enemy, make one attack against an enemy for 10+40% weapon damage. +5 mana cost if wielding a Heavy weapon. +武器から魔力の弾丸を発射し、命中した敵に10+武器攻撃力の40%のダメージを与える。重い武器を使用した際にはマナコストが5増加する。 +You unleash a deadly projectile! +死の弾丸を発射した! +Choose aim direction. +狙う位置を選択 + + +Sagitta Assault +サジッタ・アサルト +After casting Sagitta, you can recast it up to three more times without advancing time. +「サジッタ」を使用した後、3回までターンを進めずに「サジッタ」を使用できる。 + + +Psychokinesis +サイコキネシス +You can ignore components for telekinetic spells, however spells generate distraction (based on mana cost) when cast this way due to the mental strain. Unable to use at 100% DP. +テレキネシス系のスキルを使用する際、必要な部位を拘束されていても使用できるようになる。この方法で詠唱した場合、精神的な負荷により消費したマナコストに応じてDPが増加する。DPが100%の際には使用不可。 + + +Kinetic Mastery +キネティック・マスタリー +Negates the penalty for 2-handed weapons. Also gain the following effects:|-Kinetic spells and Sagitta cost 30% less while wielding a Light weapon.|-Kinetic spells and Sagitta gain +15 base damage when wielding a Heavy weapon. +両手武器のペナルティを無効化する。また、以下の効果を得る。|-軽い武器を装備している時、念動力魔法とサジッタのマナコスト-30%|-重い武器を装備している時、念動力魔法とサジッタの威力+15。 + + +Grasp +グリップ +Cast on an enemy to snare them for 20 turns, or until you leave range/are incapacitated. Cast on a point to throw the grasped enemy in that direction, dealing 40 crush damage if they hit a wall or another enemy. +念動力で敵を捕らえ、20ターン経過か、距離が離れるか、自身が行動不能になるまで移動を封じる。この魔法で敵を捕らえた状態で再度この魔法を使用すると、指定した方向に敵を投げ飛ばし、壁や他の敵に当たると40打撃属性ダメージを与える。 +You grab the ENMY using telekinesis and hold them in place! +ENMY を念動力で捕らえた! +You throw the ENMY! +ENMY を投げ飛ばした! +Choose a target or a location (if a target is currently grasped) +ターゲットか位置を選択 + + +Perfect for a lifestyle of love and peace. +愛と平和を好む者がよく使う。 +Deals crush damage. Stuns on critical. Ouch! +打撃属性。会心の一撃が命中した場合、スタン状態を付与する。痛い! +You pick up a particularly nice rock. +いい感じの石を拾った。 + + +You pick up a device for snuffing out candles and torches. +蝋燭や松明を消す道具を拾った。 +Candle Snuffer +キャンドルスナッファー +You put out the torch. +松明の炎を消した。 +A handy device for putting out torches and lanterns. +松明やランタンの灯りを消すのに便利な道具。 +But why would you want to do that? You hidin' something? +しかしどうしてそんなことを?何か隠し事でも? + + +You find a bag full of sacks. Or is it a sack full of bags? +袋を詰め込んだ袋を見つけた。もしくは袋に詰め込まれた袋を見つけた。 +Recursive Bag +袋入りの袋 +You cover the light source. +明かりを袋で覆った。 +Bags inside a bag of bags inside a bag of bags +袋の中の袋の中の袋の中の袋の中の…… +Can be placed over light sources to cover them. +光源を覆うことができる。 + + +The snuffer doesn't work on that light source. +この光源には使えないようだ。 +The bag can't cover that light source. +この光源には使えないようだ。 +You remove the bag from its light source and place it back inside your bag. +光源から袋を外して袋に入れた。 + + +There. Now it's time to have some fun~ +よし、それじゃあ楽しみましょうか。 +How utterly helpless~ +なんて無力なんでしょうね~。 +Let's see how long you last. +いつまで持つかしら? + + +I've got you! Now let's have some fun! +捕まえた!さあ、楽しみましょうか。 +I think I'll help myself to you for a bit~ +少し手を貸してあげましょうか~? +Gosh, you're so cute like that! +あら、可愛い姿ね! + + +I'm going to have to search you, miss~ +身体検査をさせていただきますね~。 +Let's check your restraints. +拘束具をチェックしますね。 +You look so cute like that, miss! +すごく可愛いですね……♡ + + +All nice and tight. Certainly no longer a threat~ +拘束具は全部いい感じね、もう何もできないでしょ~? +I'm going to make sure you're nice and tight~ +もっときつくしてあげるわ! +Surely nothing can happen now! +どうすることもできないわよね? + + +Rubber Elemental +ゴムの精霊 +The rubber elemental's restraints snap onto her and she falls over hogtied. +ゴムの精霊は誤って自縛してしまった。 +The rubber elemental molds itself into restraints! (+RestraintAdded) +ゴムの精霊は自らの身体を拘束具に変え、取り付いてきた! (+RestraintAdded) +The rubber elemental squeezes you with its appendages! (DamageTaken) +ゴムの精霊が触腕で圧迫してきた! (DamageTaken) +The rubber elemental forms rubber locks around all your restraints! (DamageTaken) +ゴムの精霊に拘束具をロックされた。 (DamageTaken) + + +Your ropes are enchanted with a lesser spell! +ロープがかすかな魔力を帯びた! +Your ropes are enchanted with a magic spell! +ロープが魔力を帯びた! +Your ropes are enchanted with a powerful spell! +ロープが強力な魔力を帯びた! +Your ropes are enchanted with a peerless spell! +ロープは比類なき魔力を帯びた! + + +Shibari Witch +緊縛の魔女 +The shibari witch blows a kiss and says goodbye. +緊縛の魔女は投げキスを寄越し、去っていった。 +The shibari witch ties you tight! (+RestraintAdded) +緊縛の魔女に縛られた! (+RestraintAdded) +The witch rubs your body sensually! (DamageTaken) +魔女が身体を官能的に揉んできた! (DamageTaken) +The Shibari Witch takes your clothes off! +緊縛の魔女に服を脱がされた! + + + + + + +A Hard Place +立ち往生 +While your willpower is 0, your mana pool slowly drains and your max stamina regen point is reduced by 30%. +気力が0の間、マナプールが徐々に減少し、最大スタミナ回復量-30% + + +The Spark of Magic +線香花火 +When your mana pool is exhausted, your attacks deal 50% reduced base damage. +マナプールが枯渇している間、自身の基礎攻撃力-50% + + + + +Burned Out +バーンアウト +Casting spells reduces willpower based on how little distraction you have, also you cannot play with yourself. +魔法を唱えた際、興奮値に応じて気力が下がる。また、自慰ができなくなる + + +Winded +風に吹かれて +While below 10% stamina, evasion is severely reduced and your slow level is increased by 1. +スタミナが10%以下の間、回避が極端に低下し、減速値1を得る + + +Lost One +失われし者 +The being vanishes in front of you. +失われし者は目の前から消えた。 +The being grabs you, causing your body parts to freeze in time!!! (DamageTaken) +失われし者に掴まれた箇所の時間が止まった! (DamageTaken) +The being has already bound you! (+RestraintAdded) +失われし者に既に拘束されていた! (+RestraintAdded) + + +The Timekeeper +タイムキーパー +The Timekeeper releases her grip on the timeline. +タイムキーパーはこの時間軸から飛び去った! +The Timekeeper takes the time to enjoy herself with you... (DamageTaken) +タイムキーパーが楽しむために時間を割いてくれた…… (DamageTaken) +The Timekeeper enacts judgement for disrupting time! (+RestraintAdded) +タイムキーパーに時空を乱した罰を受けた! (+RestraintAdded) + + +Analysis +アナライズ + + +You pick up a latex projector +ラテックスプロジェクターを拾った。 + + +Can't Touch That +触れられない +When both arms and hands are severely bound, you can no longer pick up items without an ally nearby. +腕と手を厳重に縛られている時、近くに仲間が居ない限りアイテムを拾うことができない。 +You can't pick that up without help. +助けなしではアイテムを拾うことができない。 +Grounded +地を這う +When arms are tied and feet are linked, you cannot get up from a kneeling position without help or a wall. +腕を縛られて両足が繋がっている際、仲間か壁が近くに居ないと起き上がることができない。 +You take more time getting up due to your bindings. +拘束のせいで立ち上がるのに時間がかかる。 +You can't get up without help. +補助なしでは立ち上がれない。 +Your ally helps you back up. +仲間が立ち上がるのを助けてくれた。 +You get back up using the corner. +壁の角を使い立ち上がった。 +You get up to your knees using the wall. +壁を使い立ち上がった。 +You're too tied up to close the door. +拘束が厳重でドアを閉めることができない。 +The chest opens on its own. +宝箱がひとりでに開いた。 + + +You can't use your hands for that, but you can crouch to use your mouth. +手を使うことができないが、まだ口を使うことはできる。 + + +Heel Training +ハイヒールトレーニング +Start locked in a pair of heels with no heel training. +ヒールを装備した状態でゲームを開始する。 +Gag Training +ギャグトレーニング +Start locked in a gag with no gag training. +猿轡を装備した状態でゲームを開始する。 +Corset Training +コルセットトレーニング +Start locked in a corset with no corset training. +コルセットを装備した状態でゲームを開始する。 +Sensory Training +感覚トレーニング +Start locked in a blindfold and headphones with no Sensory training. +目隠しとヘッドホンを装備した状態でゲームを開始する。 + + +Hard to Master: Heels +才能がない: ヒール +Heel training is significantly slower. +ハイヒールの熟練度が上がりにくくなる +Hard to Master: Gags +才能がない: 猿轡 +Gag training is significantly slower. +猿轡の熟練度が上がりにくくなる +Hard to Master: Corsets +才能がない: コルセット +Corset training is significantly slower. +コルセットの熟練度が上がりにくくなる +Hard to Master: Sensory +才能がない: 感覚 +Sensory training is significantly slower. +視覚と聴覚の熟練度が上がりにくくなる + + +Head Start: Heels +才能がある: ヒール +Start at Heel training level 5. +ヒールの熟練度が5の状態でゲームを開始する +Head Start: Gags +才能がある: 猿轡 +Start at Gag training level 5. +猿轡の熟練度が5の状態でゲームを開始する +Head Start: Corsets +才能がある: コルセット +Start at Corset training level 5. +コルセットの熟練度が5の状態でゲームを開始する +Head Start: Sensory +才能がある: 感覚 +Start at Sensory training level 5. +視覚と聴覚の熟練度が5の状態でゲームを開始する + + +Classic Heels +クラッシック仕様(ヒール) +Removes Heel Training and tripping mechanic. Restraining heels slow instead. +ヒールの熟練度を取り除く。ヒールを装備した際、減速値を得るのみにする +Trust Fall +すっ転び +Hides the balance meter while wearing heels and/or unsteady. +ヒール装備時、バランスメーターを表示しない + + +Poor Balance +よろよろ +You take longer to get up and are less skilled at wearing high heels. +ハイヒールを履いている時、通常よりもバランスが取りにくくなり、立ち上がるのに更に時間がかかるようになる + + +Balance: AMNT% +バランス: AMNT% +Balance: AMNT% (Sprinting Disabled!!!) +バランス: AMNT% (走れない!) +You lose your balance and fall over!!! +バランスが崩れ、地面に倒れてしまった! +Training Level: AMNT +熟練度: AMNT + + +Favorite +お気に入り +Unfavorite +お気に入り解除 +Drop +地面に置く +Attach +取り付ける +Attached +取付済み + + +Add to Quick Slot 1 +スロット1に装備 +Add to Quick Slot 2 +スロットに2装備 +Add to Quick Slot 3 +スロットに3装備 +Add to Quick Slot 4 +スロットに4装備 + + +Try to Cut +切る +Struggle! +もがく +Try to Unlock +解錠する +Add a Lock +施錠する +Try to Remove +抜け出す +Try to Pick +ピッキング +Examine the Curse +呪いの詳細を見る +Remove the Curse +呪いを取り除く +Feed this to her +食べさせる +Sell for VLU gp +VLU ゴールドで売る +Sell ALL for VLU gp +VLU gp で全て売る +Sell all but one for VLU gp +VLU gp で1つ残して売る + + +You feed the RSTR to the ENNME! (AMNT1/AMNT2 hp) +ENNME に RSTR を与えた! (AMNT1/AMNT2 hp) +Choose a food item or willpower potion +食べ物か気力のポーションを選択 + + +Chain Rune +鎖のルーン +Ribbon Rune +リボンのルーン +Nature Rune +ツタのルーン +Belt Rune +ベルトのルーン +Leather Rune +革のルーン +Latex Rune +ラテックスのルーン +Latex Cube Rune +ラテックスキューブのルーン +Slime Bubble Rune +スライム泡のルーン +Bubble Rune +泡のルーン +Spherical Rune +球体のルーン +Ball Rune +ボールのルーン +Rubber Rune +ラバーのルーン +Slime Rune +スライムのルーン + + ++AMNT gp ++AMNT ゴールド + + +ENMY lets go of herself for AMNT damage! +ENMY は絶頂し、 AMNT のダメージを受けた! + + +Sonar +ソナー +Emit a ping to highlight floors and tiles in a large radius. The ping is audible and attracts enemies to your position. +広範囲に音を放ち、フロアや床をハイライト表示する。発動時に音を放ち、敵が寄ってくる。 + + +You emit a loud noise and listen for echoes... +大きな音を放ち、反響音を聞いた…… +Your mouth is too heavily stuffed! +口に物が詰まっていて発動できない! +You don't have the mana to cast Sonar! +マナが不足している。 +The weights swing around and tug on your nipples! +重りが揺れ、乳首が引っ張られた! + + +More Kinky Furniture +インテリア増加 +Replaces 60% of cages with a different kind of kinky furniture such as display stands. +檻の60%をディスプレイスタンド等のインテリアに置き換える + + +Collection +コレクション + + +Storage +倉庫 +Management +管理 +You don't have anywhere to manage your prisoners! Yet... +まだ囚人がいない。今のところは…… + + +Your collection is empty. Use binding attacks to tie up and capture damsels! +誰も捕まえていない。拘束できる武器で敵を捕まえよう! + + +Personality +性格 +Switch +標準 +Bratty +反抗的 +Corrupted +堕落 +Feral +野生 + + +Status +ステータス +Guest +ゲスト +Servant +使用人 +Manager +マネージャー + + +Opinion +好感度 + + +Prisoner #NUMR/TTL +囚人 #NUMR/TTL +Guest #NUMR/TTL +ゲスト #NUMR/TTL + + +Select a character to examine +詳細を見るキャラクターを選択 +Former Faction: +元派閥: + + +Miku +ミク +Nevermere +ネバーミア +Bounty Hunter +賞金稼ぎ +Dressup Co. +ドレスアップ +Scholarly +魔法学校 +Witch's Coven +魔女 +Warden +看守長 +Curse +呪い +Fungal +キノコ +Bast +バスト +Elemental +精霊 +Royal +ロイヤル + + +Choose default outfit palette: +デフォルトの服装の色: + + +Auto Load Mods +MODを自動で読むこむ +SUSPICIOUS MOD DETECTED +危険なMODを検知 + + +The bright light hurts your dark-adjusted eyes! +明るさに目がくらんだ! + + +Unconventional Warfare +アタッチメント +Select a weapon to attach it to your body. You can have one attached weapon at a time. Attaching it takes 5 turns.|An attached weapon can be equipped without hands and maintains 60% accuracy as long as you have arms or legs unbound. +5ターンかけて、選択した武器1つを体に取り付ける。|取り付けた武器は手を使わずに使用でき、腕や脚が拘束されていない限り60%の命中率を持つ。 + + +Guerilla Fighting +ゲリラ戦法 +Light weapons can be wielded if you have your mouth free, at 75% accuracy. +軽い武器を口で持てるようになる。その際、命中率は75%になる。 + + +Tough Armor (1/2 crit mult while aware) +タフ(視認している間、会心ダメージが半分になる) +Absolute Armor (1/2 crit mult) +絶対的な鎧(会心ダメージが半分になる) + + +### Rename + +### Reset to NME + +Enlarged View +拡大表示 +Back to Game +ゲームに戻る + + +Servants +使用人 +Prisoners +囚人 + + +Promote to Servant +昇格 +Demote +降格 +### Delete Guest + +### Really Delete Guest? + +The ENMY tries to grab you! +ENMY が掴みかかってきた! + + +The ENMY reaches out and gives your breast a squeeze! (DMGDLT) +ENMY に胸を揉みしだかれた! (DMGDLT) +The ENMY squeezes your breasts as you raise your arms for a spell! (DMGDLT) +魔法を唱えようと腕を上げたら ENMY に胸を揉みしだかれた! (DMGDLT) +The ENMY reaches for you and fails! +ENMY の伸ばした手を振り払った! +The ENMY gives your butt a light slap as you cast! (DMGDLT) +魔法を唱えようとしたら ENMY にお尻を軽く叩かれた! (DMGDLT) +The ENMY gives your butt a good slap as you sprint past! (DMGDLT) +すれ違いざまに ENMY に軽くお尻を叩かれた! (DMGDLT) +The ENMY tries to spank you but misses! +ENMY の手を躱した! +The ENMY gives your butt a squeeze! (DMGDLT) +ENMY にお尻を揉まれた! (DMGDLT) +The ENMY gives your butt a squeeze during your cast! (DMGDLT) +魔法を唱えようとしたら ENMY にお尻を揉まれた! (DMGDLT) +The ENMY gives your butt a squeeze from behind! (DMGDLT) +後ろから ENMY にお尻を揉まれた! (DMGDLT) +The ENMY gives your butt a squeeze as you pass by! (DMGDLT) +移動しようとしたら ENMY にお尻を揉まれた! (DMGDLT) +The ENMY reaches for you but misses! +ENMY の手を振り払った! +The ENMY tickles your armpits! (DMGDLT) +ENMY にワキをくすぐられた! (DMGDLT) +The ENMY tickles under your raised arms! (DMGDLT) +魔法を唱えようと腕を上げたら ENMY にワキをくすぐられた! (DMGDLT) +The ENMY tries to tickle you! +ENMY にワキをくすぐられそうになった! +The ENMY tickles your feet! (DMGDLT) +ENMY に足の裏をくすぐられた! (DMGDLT) +The ENMY takes off your shoes and tickles your feet! (DMGDLT) +ENMY に靴を脱がされ、足の裏をくすぐられた! (DMGDLT) +The ENMY pats you gently on the head. (DMGDLT) +ENMY に頭を撫でられた! (DMGDLT) +The ENMY pats you gently on the head as you fail your spell... (DMGDLT) +魔法を唱えようとしたら ENMY に頭を撫でられた! (DMGDLT) +The ENMY tries to pat you on the head but decides not to. +ENMY は頭を撫でようとしてきたが、諦めたようだ。 +The ENMY behind you gives your shoulders a nice massage! (DMGDLT) +ENMY が肩をマッサージしてきた。 (DMGDLT) +The ENMY reaches for your shoulders but you slip free! +ENMY に肩をマッサージされそうになったが、躱した。 +The ENMY calls you cute! (DMGDLT) +ENMY に可愛いと褒められた! (DMGDLT) +The ENMY blushes at your cuteness! +ENMY は赤面している。 +The ENMY makes fun of you! (DMGDLT) +ENMY にバカにされた! (DMGDLT) +The ENMY struggles to find words! +ENMY は必死に罵倒しようとしている! +The ENMY buzzes you with her VTY! (DMGDLT) +ENMY は VTY を使用した! (DMGDLT) +The ENMY catches you and teases you with her VTY! (DMGDLT) +ENMY に掴まれ、 VTY を使われた! (DMGDLT) +The ENMY reaches for her VTY! +ENMY は VTY を使おうとして失敗した! +The ENMY sticks a VTY into you! (DMGDLT) +ENMY に VTY で責められた! (DMGDLT) +The ENMY sticks a stuffing into your open mouth! (DMGDLT) +ENMY が口に詰め物を詰め込んできた! (DMGDLT) +The ENMY reaches for your mouth and fails! +ENMY が口に詰め物を詰め込もうとしてきたが、失敗した! +The ENMY takes advantage of the gag around your neck~ (DMGDLT) +ENMY に猿轡を着けられた! (DMGDLT) +The ENMY reaches for the gag around your neck! +ENMY が猿轡に手を伸ばしてきた! +The ENMY pulls your hands together and sticks a clip between them! (DMGDLT) +ENMY に腕を掴まれ、拘束されてしまった! (DMGDLT) +The ENMY grabs your wrists but you pull away! +ENMY に腕を掴まれたが、無理やり引き剥がした! +The ENMY pulls your weapon away! +ENMY に武器を奪われた! +The ENMY tries to pull your weapon away but you maintain your grip! +ENMY に武器を奪われそうになったが、持ちこたえた! +The ENMY reaches for your inventory but can't quite reach it! +ENMY に懐を探られそうになったが、届かなかったようだ。 + + +More Armbinders +アームバインダー増加 +Armbinders are favored over other heavy bondage. +アームバインダーが優先して選ばれるようになる。 +Less Armbinders +アームバインダー減少 +Armbinders are less favored over other heavy bondage. +アームバインダーがあまり選ばれなくなる。 +More Boxbinders +ボックスバインダー増加 +Boxbinders are favored over other heavy bondage. +ボックスバインダーが優先して選ばれるようになる。 +Less Boxbinders +ボックスバインダー減少 +Boxbinders are less favored over other heavy bondage. +ボックスバインダーがあまり選ばれなくなる。 +More Straitjackets +拘束衣増加 +Straitjackets are favored over other heavy bondage. +拘束衣が優先して選ばれるようになる。 +Less Straitjackets +拘束衣減少 +Straitjackets are less favored over other heavy bondage. +拘束衣があまり選ばれなくなる。 +More Yokes +ヨーク増加 +Yokes are favored over other heavy bondage. +ヨークが優先して選ばれるようになる。 +Less Yokes +ヨーク減少 +Yokes are less favored over other heavy bondage. +ヨークがあまり選ばれなくなる。 + + + (blocked!) +(防御) + (dodged!) +(回避) + + +You crouch and move slowly. +ゆっくりと這いつくばる。 + + +Owned by: +所有者: + + +Warden's Belt +看守長のベルト +You may go on your way, but only as long your freedom is useful to her. +彼女の役に立つ限りは自由でいられる。 +A golden belt that enforces respect for the Goddesses. Breaking spell orbs results in a punishment. +女神の崇拝を表すベルト。オーブを破壊した際に、神罰が下る。 + + +Belt of Privilege +特権のベルト +You've defeated the Warden, proving that you are worthy to take what you want. +看守長を倒した褒美。欲したものを手にする力があることを証明した。 +A golden belt that marks you as a person of great import. -50% rep penalty for breaking orbs. +力の証明となるベルト。オーブを破壊した際、関係性の低下が半分になる。 + + +Sharpshooter +射手 +You teach the warden's servant a lesson. +看守長の使いに教訓を刻んでやった。 +The sharpshooter pulls your arms behind your back! (+RestraintAdded) +射手に後ろ手に拘束された! (+RestraintAdded) +The sharpshooter takes advantage of your weakness and squeezes your breast! (DamageTaken) +射手に弱点を掴まれ、胸を揉みしだかれた! (DamageTaken) +The sharpshooter smiles and clicks a lock on you! (DamageTaken) +射手は笑顔で拘束具をロックしてきた! (DamageTaken) + + +Gladiator +闘士 +The gladiator puts you in a hold and binds you! (+RestraintAdded) +闘士に後ろ手に拘束された! (+RestraintAdded) +The gladiator chuckles as she spanks your butt! (DamageTaken) +闘士に尻を叩かれた! (DamageTaken) +The gladiator smiles and clicks a lock on you! (DamageTaken) +闘士は笑顔で拘束具をロックしてきた! (DamageTaken) + + +The magician conjures some restraints on you! (+RestraintAdded) +魔法使いに後ろ手に拘束された! (+RestraintAdded) +The magician summons tickling hands to tease you! (DamageTaken) +魔法使いは手を召喚し、くすぐってきた! (DamageTaken) +The magician conjures some locks on you! (DamageTaken) +魔法使いは笑顔で拘束具をロックしてきた! (DamageTaken) + + +The Warden +看守長 +The Warden disappears into a trapdoor! +看守長は隠し扉から逃げた! +The Warden forces you to kneel, and presents you with a restraint! (+RestraintAdded) +看守長に跪かされ、拘束具を取り付けられた! (+RestraintAdded) +The Warden whips you with a belt! (DamageTaken) +看守長にベルトの鞭で叩かれた! (DamageTaken) +The Warden tosses some enchanted locks at you! (DamageTaken) +看守長は魔力のこもった錠前を投げつけてきた! (DamageTaken) + + +The Warden falls flat on the ground, exhausted! +看守長は力尽き、地面に倒れ込んだ! +The Warden strikes you with her whip! (DamageTaken) +看守長に鞭で叩かれた! (DamageTaken) +The Warden swings her enchanted whip and conjures locks on your body! (DamageTaken) +看守長が魔法の鞭を振ると、拘束具に錠前が召喚された! (DamageTaken) + + + + + + +(The Warden glances at you)|Oh? What do we have here?|An adventurer?|You're not in my records... +(看守長はこちらをにらみつけてきた)|あら、何事かしら?|冒険者……?|あなたは……記録にはないわね。 +Cut to the chase. Do I have to fight you or not? +戦う?戦わない?どっち? +(She chuckles)|Oh my~|I hope your skills are on the same level as your attitude.|I don't have time for mere troublemakers~ +(彼女は苦笑いしている)|あらあら。|随分と尊大な態度ね。実力に見合っているといいのだけれど。|私の時間を無駄にしたらただじゃ済まないわよ。 +Quite a boast for someone who's about to lose. +ただの通過点にしては大した自信じゃない。 +(SPEAKER grins)|I look forward to testing those claims~ +(SPEAKER はニヤリと笑った)|その態度がいつまで続くか楽しみね~。 +I defeated Fuuka. Now you're next! +墓場の主は倒したわ、次はあなたよ! +(SPEAKER shrugs)|You beat that zombie girl?|She's the weakest of the paladins.|She loves to boast about how she's special,|But she's really just a spoiled brat. +(SPEAKER は肩をすくめている)|あのゾンビ娘を倒したのね。|でも残念、彼女はパラディンの中でも最弱よ。|あの娘はいかに自分が特別かを散々語り散らかしていたでしょうけど、|私から言わせればただの甘やかされたガキよ。 +...Zombie girl? +……ゾンビ娘? +(SPEAKER tilts her head)|Yes, she was around before Vinlaga.|Her magic was gifted to her by the Goddess,|it is only natural that it works on her too. +(SPEAKER は呆れた表情を見せている)|彼女はヴィンラーガの魔法による不死化が始まる前から生きていたの。|そう、彼女の魔法は女神から授かったもの、|一応は、私と同じね。 +...Paladins? +パラディン? +(SPEAKER nods happily)|Divinely-appointed judges, presiding over mortals.|Unlike you, our immortality is earned.|Myself, I captured many defilers long ago.|Is it not fitting that I get to keep them for myself? +(SPEAKER は誇らしげに頷く)|神より任を授かりし、人を裁き、管理する者。|あなたとは違って、私達は神の手によって不死を授かったの。|私はね、昔から罪人を何人も何人も何人も何人も捕らえてきたわ。|そして、ついに神に認められたの。 +It is an honor to fight a worthy opponent. +高名な相手と戦えるなんて光栄なことね。 +(SPEAKER giggles)|That gag suits you nicely~ +(SPEAKER はクスクスと笑っている)|良い猿轡ね、似合ってるわ。 +(SPEAKER grins)|I look forward to it! +(SPEAKER はニヤリと笑った)|楽しみましょう! +You will see soon enough. +すぐに分かるわ! +Indeed! +ええ! +What is this place? +ここは? +(She smiles)|Why, this is my private prison.|I bring only my prettiest toys to stay here with me.|You can see them up there.|(She motions to the north) +(彼女は笑顔で答える)|ここは私の牢獄。|選りすぐりの可愛い子ちゃんを集めているの。|ほら、そこに見えるでしょ?|(彼女は北の方を指さした) +Tell me about your collection +コレクション? +(SPEAKER smiles pleasantly)|Its a fitting reward, isn't it?|Long ago, this mountain was home to a vicious empire.|Machines went out to sea, bringing back countless prisoners.|As commander of the invasion, I earned this title! +(SPEAKER はニコニコしている)|報酬として賜ったの。|かつて、この山には凶悪な帝国があってね。|帝国の機械が海を超えて侵略を繰り返し、人々を捕らえて回っていたの。|そして私は指揮官だったの。看守長というのも、そのときについた渾名よ。 +(SPEAKER grins)|When we stormed the prisons, we encountered many fierce defenders.|Many of them now reside in these halls, earning their rightful punishment. +(SPEAKER はニヤリと笑う)|昔襲った牢獄の守衛達よ。|すごく反抗的でね、今はここで調教しているの。 +Who are the prisoners, anyway? +囚人は誰なの? +(SPEAKER folds her arms)|Is it not holy and just to bring down tyrants? +(SPEAKER は腕を組み語る)|人の世を揺るがす暴君を倒すために聖戦を起こしたのよ。 +Why did the Goddesses intervene? +どうして女神の介入があったの? +(SPEAKER shrugs)|Most of them had already been... conditioned.|It will take centuries to undo centuries of training.|After all, we have plenty of time. +(SPEAKER は肩をすくめている)|もうほとんど調教が終わっているけど……|そうね、何世紀もしてきたんだし、普通の生活に戻るには時間がかかるんじゃないかしら?|まぁ、時間はたっぷりとあるしいいじゃない。 +What about the former prisoners? +釈放された人たちはどうなるの? +(SPEAKER looks to the side)|The leader was nowhere to be found.|The coward fled deeper underground.|Her robot guardians protect her, to this day. +(SPEAKER はふと視線をそらす)|彼女は見つからなかったわ。|地下深くに尻尾を巻いて逃げたの。|彼女は今でも機械の兵隊に囲まれて怯えているでしょうね。 +Can I see the leader of this old civilization? +旧文明の主には会える? +(SPEAKER smirks)|What's the point of going deeper?|The tyrant lost control of her petty empire.|Now the world is safe from her. +(SPEAKER はニヤリと笑った)|降りる意味がないもの。|裸の女王に何ができると?|もう彼女にできることは何もない、だから狩る意味なんて無いのよ。 +So you stopped at the upper floors? +どうして下に降りて彼女を捕まえないの? +(SPEAKER frowns)|Absolutely not.|They are under my strict supervision. +(SPEAKER はむっとしている)|だめよ。|私の監視下にあるのだから、余計な介入はさせないわ。 +Can I talk to the former prisoners? +釈放された人たちと話しても? +(SPEAKER grins)|Very funny.|I heard rumors of an up-and-coming adventurer stirring up trouble.|It seems my intuitions were correct. +(SPEAKER はニッコリと笑っている)|最近のあなたの行動は耳にしているわ。|許すとでも思う? +I hope you don't mind me looting the lower levels~ +大したことしてないんだし、見逃してくれない? +(SPEAKER grins)|Oh please.|Only this era's finest warriors can be part of my collection~|My subordinates take care of the rest. +(SPEAKER はニッコリと笑っている)|私のコレクションになれるのはごく一部。|他は部下に任せているのよ。 +Sounds like you have an impressive collection +とても良いコレクションみたいね +(SPEAKER frowns)|It's easy to take for granted the peace you didn't work for. +(SPEAKER は不機嫌そうにしている)|大した苦労も知らずに言ってくれるじゃない。 +Must be comfy living up here then +ここは快適そうね。 +(SPEAKER scoffs at you)|Adventurers are always like this.|Ever since your kind started prying,|I've had no choice but to enact my own kind of discipline~ +(SPEAKER は嘲笑混じりに返す)|冒険者はいつもそう。|あなた達が無意味な好奇心を振りかざすから、|私達はただ自衛せざるを得なくなっているだけなの。 +What makes you any better than the old rulers? +自分たちが旧文明に取って代わるに足る存在だと? +(SPEAKER smirks at you)|If that were so, then perhaps it would be best not to pry...|Forbidden knowledge has its price, after all. +(SPEAKER は笑いかけてくる)|そうだと思うなら、余計な詮索はやめなさい。|禁断の知識を得るためにはそれなりの対価が必要なんだから…… +It sounds like the gods are trying to hide something +女神は何かを隠しているんじゃ? +(SPEAKER folds her arms)|And what makes you think an old myth would be relevant here?|Would the Archmagus herself lead a rebellion against the divine? +(SPEAKER は腕を組んでいる)|神話の人物が関係あると思ったの?|大魔術師が神々に反旗を翻すと? +Was Sariel Vinlaga the leader of the old civilization? +サリエル・ヴィンラーガは旧文明の主だったの? +(SPEAKER frowns)|You don't trust me? That's too bad... +(SPEAKER はむっとしている)|あら、信じてくれないのね…… +It's the way you keep dodging questions. +はぐらかすつもりね。 +(SPEAKER scoffs)|I'd love to have a word with your sources~ +(SPEAKER は嘲笑で返す)|あら、随分な情報源ね。会ってみたいわ。 +I have it good authority that Vinlaga is here. +ヴィンラーガはこのダンジョンにいる、確かな情報よ。 +(SPEAKER smirks)|Don't believe everything you hear~ +(SPEAKER はニヤニヤと笑っている)|なんでも鵜呑みにしたらだめよ? +Maybe you're right. +そうかもね。 +(SPEAKER pouts)|Old?|Grrr... +(SPEAKER は口をとがらせている)|老婆……?|あなた…… +Says an old woman under the mountain... +「山の下の老婆は語る……」 +I am indeed an adventurer. +私はただの冒険者よ。 +(SPEAKER smiles)|Fascinating. Do keep explaining. +(SPEAKER は笑みを浮かべている)|そう、結構可愛いじゃない。続けて? +(SPEAKER frowns)|That is not the attitude I appreciate from my guests. +(SPEAKER は目に暗い怒りを宿している)|次にそのような態度を取ったら許さないわよ? +I forge my own path. +どいてくれる? +Why should I listen to you? +あなたの言うことなんて聞かないわ。 +(Pout) +(口ごもる) +That's a shame about your records, I'll be going now. +記録については残念だったね、じゃあね。 +Mmpphgh? (Go to pass her) +うぅう?(すれ違う) +(She smirks)|Not so fast, dear~|You'll have to wear a special collar to pass. +(彼女はニヤニヤと笑っている)|まぁ、そんなに急がないで。|この首輪をつけたら通ってもいいわよ。 +I won't wear anyone's collar! +誰かのモノになんてならないわ! +(She smirks)|Tsk tsk. Then you won't pass. +(彼女はニヤニヤと笑っている)|うふふ、それじゃあ通せないわね。 +(She giggles)|How cute!|You're so used to yours that you forgot about it~ +(彼女は笑っている)|あら、|今つけている首輪が気に入ってるの? +Why don't you wear it yourself? +自分につけたらどう? +Hmmph. (Scoff at her) +んふふぅ(彼女を嘲笑う) +(She frowns)|Watch your tongue~ +(彼女は不機嫌そうにしている)|随分な態度ね。 +(She frowns)|I do not wear collars. +(彼女は不機嫌そうにしている)|生意気ね。 +You'd be better off wearing mine instead. +代わりに、あなたに首輪をはめてあげるわ。 +You're missing out~ +見逃してあげようか? +This is a nice place you got here. +悪くない場所ね。 +(Admire the locale) +(この場所を称賛する) +(SPEAKER smiles and nods)|It has existed for a thousand years,|and it shall exist for another thousand.|No thanks, of course, to the adventurers who storm through here,|breaking the orbs as if it all belongs to them... +(SPEAKER は笑顔で頷いている)|素晴らしいでしょう、この牢は1000年も前からここにあるの。|そして1000年後もあり続けるわ。|ああ……ただの冒険者の世辞になんて感謝はしないわ。|あなただって、何個もオーブを壊してきたでしょうから……。 +What are these orbs for anyway? +オーブって何なの? +(SPEAKER looks puzzled)|You don't know? Surely you must be joking? +(SPEAKER は困惑している)|知らないの?冗談でしょう? +(SPEAKER shrugs)|They are important because...|Wait, you're stalling for time, aren't you? +(SPEAKER は肩をすくめている)|とても大切なものなのよ。それはね……|……時間稼ぎのつもりかしら?これは。 +I do not know. +本当にしらない。 +(Sigh) +(ハァ) +Of course I know... +もちろん知っているよ…… +You can trust me. +悪いことはしないわ。 +Mmmph! (Nod eagerly) +んん……(頷く) +(SPEAKER laughs)|Do you think I will trust you just like that? +(SPEAKER は笑っている)|あら、信じるとでも? +(SPEAKER frowns)|You do not know who you're dealing with.|I'll make sure to teach you a lesson. +(SPEAKER はむっとしている)|誰に口を利いているのかわかっていないようね。|いいわ、わからせてあげる。 +Why don't I make you wear it? +力ずくでやってみなさいよ。 +You can try~ +できるものならね。 +There must be a mistake. Sign me up! +何かの間違いでしょ、通して! +(She smiles)|Eager are we?|I don't just record anyone though.|I only care about the strongest adventurers~ +(彼女は不敵な笑顔で応える)|本当かしらね?|私は強者にしか興味がないの。|せいぜい頑張りなさい。 +I am the strongest. +私のほうが強いわ。 +(SPEAKER chuckles)|Then why don't I test your skills? +(SPEAKER はクスクスと笑っている)|それじゃあテストしてあげる。 +(SPEAKER grins)|How about trial by combat? +(SPEAKER はニヤリと笑った)|ええ、どれだけ戦えるかね。 +A test? What kind? +テストですって? +...You're on! +……わかった! +Let's do it! +いくわよ! +You will see how strong I am! +私の力を見せてあげる! +(SPEAKER giggles)|We'll see about that! +(SPEAKER は笑みを浮かべている)|すぐに分かるわ…… +On second thought, maybe not... +やっぱりやめようかな…… +(SPEAKER giggles)|Not so confident, are we? +(SPEAKER は笑みを浮かべている)|自信がないのかしら? +I didn't think it would involve a test... +テストがあるなんて…… + + +(SPEAKER readies her whip)|Allow me to introduce myself properly.|I am The Warden, divinely appointed judge and enforcer.|Those who enter this mountain do so under my watchful eye.|To ensure this, I have crafted a special collar.|It will ensure that you do not defile the holy places.|I can let you through if you accept it~ +(SPEAKER は鞭を構えた)|じゃ、きちんと自己紹介しましょうか。|我こそは監獄の主、法と裁きの神命を賜りし聖人なり。|遍く牢は我が膝下に、遍く罪は逃げ得ない。|我に神授の首輪ありき、|聖地を護りし神の力よ。|……これをつけたら通してあげるわよ~。 +I will never be collared by you! +あなたのコレクションになんかならないわ! +(Shake your head and scoff) +(首を振り小馬鹿にする) +(SPEAKER folds her arms)|So be it. +(SPEAKER は腕を組んでいる)|ふふふ。いいわよ、その態度。 +Tell me about your collection. +コレクションについて教えてくれる? +I'm in charge of my own path. +自分の運命は自分で決めるわ。 +(SPEAKER grins)|Let's see how long you can keep up that attitude~ +(SPEAKER は悍ましい笑みを浮かべている)|その態度がいつまで続くか見せてちょうだい。 +That won't be necessary, miss. +そんなことをしなくてもいいじゃない。 +(SPEAKER smiles)|Oh, it's quite necessary~|Why don't I show you? +(SPEAKER は笑みを浮かべている)|いいえ、必要なの。 +I would rather fight you. +戦いましょう。 +(Fight her) +(戦う) +(SPEAKER shrugs)|Straight and to the point, eh? +(SPEAKER は肩をすくめている)|いい子ね。 + + +Ready yourself! +勝負! +Let's go! +いくわよ! +I guess I have no choice... +やるしかないみたいね…… + + +(SPEAKER grins)|Very impressive.|You may have lost the battle, but you performed admirably~ +(SPEAKER は勝ち誇った笑みを浮かべている)|すごくよかったわ。|あなたは負けたけど、十分楽しませてもらったわ。 +(SPEAKER smiles)|I will let you pass so long as you wear my collar.|(She snaps her fingers and conjures a glowing ring) +(SPEAKER は残酷な笑みを浮かべている)|この首輪をつけたらここを通っていいわよ。|(彼女が指を鳴らすと、輝く首輪が現れた。) +(SPEAKER giggles)|Then your journey ends.|I assume you don't want that.|Now then, as for your collar~|(She snaps her fingers and conjures a glowing ring) +(SPEAKER は)|なら、あなたの旅路もここで終い……|……というのは嫌でしょう?|さて、この首輪をつけてもらうわ。|(彼女が指を鳴らすと、輝く首輪が現れた。) +(SPEAKER chuckles)|Of course it was magic~|Who said a commander had to be defenseless?|(She snaps her fingers and conjures a glowing ring) +(SPEAKER は満足げな笑みを浮かべている)|ええ、素晴らしい魔法でしょう?|ただの管理職だから勝てるとでも思ったのかしら?|(彼女が指を鳴らすと、輝く首輪が現れた。) +Was that magic? +なんて魔法なの…… +I've lost. Now what? +私の負けみたいね。 +I won't submit to you! +あなたなんかに屈したりはしない! +(SPEAKER presents you with your collar...)|(It closes around your neck seamlessly)|Now... you'll be allowed to go free,|but only once you've been sufficiently trained. +(SPEAKER に首輪をはめられた)|(不可思議な力が働いているのか、首に吸い付くように取り付いている)|さて……これで最後ね。|調教が済んだらもう行っていいわよ。 + + +(SPEAKER blocks you with a web of metal bars)|Very impressive!|But did you really think it would be that easy? +(SPEAKER は大量の杭を召喚し、追撃を阻んできた)|面白いわね!|でも、そう簡単にはいかなくてよ!? + + +(SPEAKER crouches down)|Most impressive...|It is not often I lose to an adventurer...|I'd love to get my hands on you eventually~ +(SPEAKER は膝をついた)|そんな……|たかが冒険者風情に……|覚えてなさい…… +(SPEAKER looks surprised)|I did not expect you to be so... compliant.|(She snaps your fingers and tosses you a glowing belt)|This is a special one, reserved for those with divine privilege.|You've earned it. +(SPEAKER は驚いている)|えっと、こんなに素直だとは思わなかったわ。|(彼女は指を鳴らし、ベルトを渡してきた)|神の権能を持つものだけに許された特別製よ。|おめでとう、あなたは勝ち取ったのよ。 +(Wear her belt anyway) +(ベルトを受け取り自身に装着する) +(SPEAKER shakes her head as you force a gag into her mouth)|MMMMMPH! +(頭を振って抵抗する SPEAKER に無理矢理猿轡を噛ませた)|んぁおぉぉ! + + +The ENMY weakens your grip on your weapon! Enemies may disarm you if you stand too close... +ENMY に武器を持つ握力を弱められた!敵に近寄りすぎると武器を外される可能性がある…… + + +Can you link my arm cuffs? +手枷を繋げてほしい +(Hold out your arm cuffs) +(手枷を差し出す) +(The SPEAKER smiles)|Why sure, sweetie, I can help you with that~ +(SPEAKER は笑顔で答える)|ええ、いいわよ。やってあげる。 +(The SPEAKER grins)|What a good girl! +(SPEAKER はニヤニヤと笑っている)|いい子ね! +(The SPEAKER blushes)|Those look like fun! +(SPEAKER は赤面している)|楽しそうですね…… +(The SPEAKER smirks)|Sure thing~ +(SPEAKER はニヤニヤと笑っている)|いいよ~ +(The SPEAKER beeps)|+10 social credit +(SPEAKER は機械音を立てている)|10クレジット追加。 + + +Can you link my leg cuffs? +足枷を繋げてほしい +(Hold out your leg cuffs) +(足枷を差し出す) + + +Cool people wear these indoors. +屋外で着用するオシャレアイテム。 ++25 holy resist. Reduces blind effects. Prevents blinding from light adjustment. +聖属性耐性+25。目潰し効果を軽減する。光量の変化による目潰し効果を防ぐ。 +You find a pair of stylish shades. +イカしたサングラスを見つけた。 + + +Shades +黒眼鏡 + + +Player Background Color +背景の色 + + +An attack causes you to bounce... +衝撃でバウンドした…… + + +You find yourself enveloped in a bubble! +気がつくと泡に包まれていた! +A sphere of latex coalesces around you, trapping you and inflating until tight! +ゴムの球体に閉じ込められた!球体は膨らみ、まとわりついてくる…… +A sphere of latex coalesces around you, trapping you and sealing around your neck! +ゴムの球体が周囲に現れ、首から下を飲み込まれてしまった! +You find yourself enveloped in a slime bubble! +気がつくとスライムの泡に包まれていた! + + +Your RestraintName pops with a loud bang! +RestraintName が大きな音を立てて弾けた! +Your RestraintName starts leaking air! Very, very slowly... +RestraintName からゆっくりと空気が漏れ出した…… + + +Aqua Slime +アクアスライム +The aqua slime melts into a wet puddle. +アクアスライムはただの水たまりになった。 +The aqua slime splashes against you! (DamageTaken) +アクアスライムは飛び散ってきた! (DamageTaken) +The aqua slime expands into a bubble and throws itself at you! (+RestraintAdded) +アクアスライムが体の一部を投げつけてきた! (+RestraintAdded) + + +Aqua Bubble (Head) +水の泡(頭) +A squishy bubble made of a gelatinous substance! +ゲル状の液体でできたふにゃふにゃの泡。 +You can pop it with a sharp enough edge, if you can get your tool in the position... +鋭利なものを使えば穿つことができる。 + + +Aqua Bubble (Arms) +水の泡(腕) + + +Aqua Bubble (Legs) +水の泡(脚) + + +The bubbles on you combine into one big bubble! +体に取り付いた泡が合体して1つの大きな泡になった! + + +The stairs have been locked down for NMB more turns. +NMB ターン経過するまで階段の鍵が開かない。 + + +Curse of Increasing Tightness: Your restraints get tighter over time. +締め付けの呪い:時間の経過と共に拘束がきつくなる。 +Curse of Lethargy: Reduce distraction over time, but miscast chance is increased by AMNT%. +無気力の呪い:時間の経過と共にDPが減少するが、詠唱失敗率が AMNT% 上昇する。 +Curse of Mute: You cannot converse, and verbal spells cost AMNT% more mana. +無言の呪い:会話ができなくなり、口を使う魔法のコストが AMNT% 上昇する。 +Curse of Clumsiness: After casting an arm spell, you drop your currently held weapon. +不器用の呪い:腕を使う魔法を使用した際、手に持っている武器を落とす。 +Curse of Deflection: 50% chance for an attack to be redirected against an adjacent hostile target. +偏向の呪い:50%の確率で攻撃が隣接する別の敵に移る。 + + +Loot Recovery: +戦利品回収: + + +Enabled +オン +You recover important items when you advance floors. +次の階層へ進んだとき、奪われた高価なアイテムを取り戻せる。 +Once items are lost, they are gone for good. +アイテムを奪われた場合、取り戻せなくなる。 +Each item has a 25% chance of appearing in the chest between floors. +25%の確率で、階層間のエリアでアイテムを取り戻せる。 +You find a familiar adventuring outfit! +お気に入りの服を取り戻した! + + +You feel energy flow out of you, activating the floor below! +エネルギーが体から抜け出し、床が活性化した! +You feel energy flow out of you, lighting up a circle on the floor! +エネルギーが体から抜け出し、床のサークルが光り出した! +The floor beneath you drains your mana, but you don't have enough to satisfy it. +床にエネルギーを吸い尽くされた。どうやら足りないようだ。 +The ground beneath you glows with magical energy! +床が魔法のエネルギーで輝きだした! + + +Radiant Light +光 +Banishment of the shadow. +闇を遠ざける +Living Shadow +蠢く闇 +Engulfs the tile in darkness. +周囲を包む闇 + + +Planar Focus +テレポーターの中心 +Absorbs teleportation energies. +テレポートエネルギーを吸収する装置。 + + +Planar Diffractor +テレポーターの回折機 +Diffuses teleportation energies. +テレポートエネルギーを拡散させる装置。 + + +Planar Focusing Crystal +テレポータークリスタル +Amplifies teleportation energies. +テレポートエネルギーを増大させる装置。 + + +Mysterious Plate +奇妙なプレート +What could it be? +なんだろう? +Mana-Charged Plate +マナの満ちたプレート +It seems like it needs more power... +もっとエネルギーが必要みたいだ…… +It's giving off a strange energy! +奇妙なエネルギーを発している! + + +Glass Plate +ガラスのプレート +Looks like it has lighting elements inside. +内側に照明がついている。 + + +Many bars come out of the ground and restrain you! +大量の杭が地面から湧き上がってきた! +One Bar Missile +一本杭 +Restraining Bolt +拘束ボルト +Sealing Bolt +封印のボルト +Bondage Blast +ボンデージブラスト +Magic Missile +マジック・ミサイル +Warden's Cage +看守長の檻 + + +Restricting Bars +拘束杭 +The bars retract into the ground. +杭は地面に引っ込んだ。 + + +Sealing Pillar +封印の柱 +The pillar collapses, causing zombies to rise up! +柱が倒れ、ゾンビが起き上がってきた! + + +Safeword Please +セーフワードは? +Allies don't help you unless you ask first. +仲間は尋ねられるまで助けてくれない。 +Living Collars +生きている首輪 +When you get jailed, you may get a living collar that applies further restraints on you. +牢屋に送られた際、強力な生きた首輪を嵌められる可能性がある。 + + + + +The Warden's cage falls atop you and attaches to the floor with a click. +看守長の檻が落下し、床に固定された。 + + +The restraining bolt emits binding energies! +拘束ボルトは拘束エネルギーを発した! +The restraining bolt flashes and pushes you backward! +拘束ボルトが閃光を放ち、後ずさってしまった! +The restraining bolt transforms into cuffs on impact! +拘束ボルトは衝撃で手枷に変化した! +The restraining bolt pins your cuffs to the wall! +拘束ボルトに手枷を壁に固定された! + + +The spell explodes into restraining energy! +魔法が爆発して拘束エネルギーになった! +The spell explodes and stuns you! +魔法が爆発し、気絶してしまった! +The spell congeals into restraints! +魔法が収束し、拘束具になった! + + +The mage starts channeling her energy! +魔法使いはエネルギーを溜めだした! + + +Warden Cuffs +看守長の手枷 + + + + +Warden Leg Cuffs +看守長の脚枷 + + +Warden Ankle Cuffs +看守長の足枷 + + +Your buttons have been pushed, and not in a pleasant way! +挑発されてカチンときた。非常に不愉快だ。 +Defeat all taunting enemies or stay within the tiles to avoid shame! +全ての敵を倒すか、名誉を守るために留まろう。 +Degradating Taunts +へたな挑発 +You failed to come up with a proper comeback! +適切な切り返しを思いつかなかった! + + +The zone of frost damages you as you are chilled! +寒さでダメージを受けた! +Confirm Path +経路を選択 + + +Navigation Map +ナビゲーションマップ +Choose a path to take by clicking on a highlighted room. +ハイライトされた部屋をクリックして、進む道を選ぼう。 +Other paths will become inaccessible. +他の道には進めなくなる。 +Floor NMB +フロア NMB +Tileset: +タイルセット: +Map Modifier: +できごと: +Layout: +レイアウト: +Controlling Faction: +出現する主な勢力: +Main Objective: +メイン目標: +Points of Interest: +特徴: + + +Magical Study +魔法の書斎 +Maintenance Hall +メンテナンスホール +Ancient Chest +古代の宝箱 +Caldera Passage +カルデラ湖 +Auction Hall +オークション会場 +Dark Altar +闇の祭壇 +Dimensional Rift +次元の裂け目 +Hoard +宝物庫 +### Dragon's Lair + +Witch's Lair +魔女のお茶会 +Mold Infestation +粘菌の増殖 +Bandit Raid +盗賊の襲撃 +### Dragon Sighting + +Slime Infestation +スライムの繁殖 +Wolfgirl Training +ウルフガールの訓練 +Drone Patrol +ドローンの巡回 + + +Shop +お店 +Chamber +大部屋 +Prison +監獄 +Sorting Room +選別所 + + +Click a hotbar slot to assign the current item to it.|You can click the swap button on the right|to switch between your five hotbars.||You can also save and load presets for your hotbar.|These are shared between runs. +画面下のホットバーをクリックしてアイテムを登録可能|ホットバーをセーブ、ロードで|登録した内容を保存及び呼び出しが可能||別のセーブデータ間でも登録した内容を呼び出すことができる + + +You step on the item and tug to pull it taut... +アイテムを足で引っ張った…… +You tug furiously against the leash, pulling it taut! +リードを力いっぱい引っ張った! + + +Silenced Hall +サイレントホール + + +The waist-deep water slows you! +腰まで水に浸かり、うまく進めない! + + +Sariel Vinlaga's Panties +サリエル・ヴィンラーガのパンツ +Legend has it that these were worn by the legendary archmagus herself. +伝説によれば、偉大なる魔術師の身につけていたものだという。 +If you keep them in your mouth, your verbal spells have -50% miscast chance. +10% spell damage. +口に咥えていると、詠唱失敗率-50%、魔法の威力+10%。 +You find a pair of black panties with pink trim, scrunched up in a ball. +丸まっている、ピンクのラインが入った黒いパンツを拾った。 + + +Elven Panties +エルフのパンツ +In faraway lands, they often say that less is more... +「露出は多ければ多い方がいい」遠い国ではそう言われているらしい…… ++11% sprint efficiency +走るスピード+11% +You find a pair of elven panties. +エルフのパンツを拾った。 + + + + +Hood of Fluffoth +フルフォスのフード +Worn by devotees to Fluffoth, demonic ruler of the plush abyss. +ふわふわ界の深淵に潜む悪魔、フルフォスの信者が着用するフード。 +When distraction reaches 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 40 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. +気力が90%になったとき、5x5の範囲に40ふわふわ属性のダメージを与え、3ターンの間移動不能にする攻撃を行う。興奮度が50%以下になるとリチャージされる。クールタイム5ターン。 +When distraction is over 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 30 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. +気力が90%になったとき、5x5の範囲に30ふわふわ属性のダメージを与え、3ターンの間移動不能にする攻撃を行う。興奮度が50%以下になるとリチャージされる。クールタイム5ターン。 +You find a sinister hood made of soft plush. +柔らかい不吉なフードを拾った。 + + +Ceremonial Leotard +式典のレオタード +An article worn by the servants of state in the short-lived kingdom of Ejahl. Its locking mechanism and clothes-dissolving enchantments ensure the wearer understands her role as an extension of the state. +短命の亡国エヤールに身と心を捧げたもののレオタード。衣装を溶かすエンチャントと独特な錠を持つ。 +Its soul crystals harden the mind and dampen changes in willpower, reducing all willpower changes by 25%. +ソウルクリスタルが着用者の意志を不変のものとする。気力の変化値を25%減少させる。 +You find a ceremonial leotard. +式典のレオタードを手に入れた。 + + +The Robe of Chastity +貞操の衣 +### A magical leotard whose power infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. + +It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire. +パラディンの貞節を守っている場合、40ターンの間、ターン毎に欲情値-1%、攻撃を受けたときに2(消費したDPの3%)の聖属性ダメージを相手に与えるオーラを得る。魔力の伝導する生地により、DPの獲得値が50%増加し、消費したマナの8%が欲情値に変換される。 +### A magical leotard infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. + +You retrieve an interesting article dubbed 'the Robe of Chastity. +"貞操の衣"と名付けられた布を見つけた。 + + +Took +ダメージ + + +(As you slay the dragon, it begins shapeshifting into human form!) +(竜を討つと、人の姿に変化した!) + + +Crystal Dragon Queen +クリスタル・ドラゴンの女王 +The crystal dragon shapeshifts back to human form! +クリスタル・ドラゴンは人間の姿になった! +The crystal dragon strikes you with its claws! (DamageTaken) +クリスタル・ドラゴンは爪で引き裂いてきた! (DamageTaken) +The crystal dragon breaths a sparkling dust, which hardens into crystal! (+RestraintAdded) +クリスタル・ドラゴンの吐く息が結晶となり、体中で固まりだした! (+RestraintAdded) +The crystal dragon takes flight and swoops toward you! +クリスタル・ドラゴンは飛び立ち、こちらに向かって急降下してきた! +The crystal dragon takes flight and slams into you! (Stunned!) +クリスタル・ドラゴンの強力な急降下に巻き込まれた!(スタン) +Crystal Dragon Girl +クリスタル・ドラゴンガール +The dragon girl submits to you! +ドラゴンは降伏した! +The dragon girl slams you with several hurled crystals! (DamageTaken) +クリスタル・ドラゴンガールはクリスタルで殴打してきた! (DamageTaken) +The dragon girl conjures a cloud of crystals that solidify! (+RestraintAdded) +クリスタル・ドラゴンガールは凝固するクリスタルを召喚してきた! (+RestraintAdded) +### The dragon girl conjures crystalline locks on you! (+RestraintAdded) + + + +Poison Dragon Queen +ポイズン・ドラゴンの女王 +The poison dragon shapeshifts back to human form! +ポイズン・ドラゴンは人間の姿になった! +The poison dragon strikes you with its claws! (DamageTaken) +ポイズン・ドラゴンは爪で引き裂いてきた! (DamageTaken) +The poison dragon extends many vines from its wings! (+RestraintAdded) +ポイズン・ドラゴンの翼から大量の蔦が伸びてきた! (+RestraintAdded) +The poison dragon takes flight and swoops toward you! +ポイズン・ドラゴンは飛び立ち、こちらに向かって急降下してきた! +The poison dragon takes flight and slams into you! (Stunned!) +ポイズン・ドラゴンの強力な急降下に巻き込まれた!(スタン) +Poison Dragon Girl +ポイズン・ドラゴンガール +The dragon girl slashes you with her venomous nails! (DamageTaken) +ポイズン・ドラゴンガールは毒の爪で引っ掻いてきた! (DamageTaken) +The dragon girl raises vines out of the ground to bind you! (+RestraintAdded) +ポイズン・ドラゴンガールの召喚した蔦に捕らえられた! (+RestraintAdded) +### The dragon girl holds you in place and locks your restraints! (+RestraintAdded) + + + +Ice Dragon Queen +アイス・ドラゴンの女王 +The ice dragon shapeshifts back to human form! +アイス・ドラゴンは人間の姿になった! +The ice dragon strikes you with its claws! (DamageTaken) +アイス・ドラゴンは爪で引き裂いてきた! (DamageTaken) +The ice dragon catches you in its icy breath! (+RestraintAdded) +アイス・ドラゴンの氷のブレスに触れてしまった! (+RestraintAdded) +Ice Dragon Girl +アイス・ドラゴンガール +The dragon girl slams you with several chunks of ice! (DamageTaken) +アイス・ドラゴンガールに氷の礫で打ちすえられた! (DamageTaken) +The dragon girl splashes you with instantly freezing ice! (+RestraintAdded) +アイス・ドラゴンガールに瞬間冷凍された! (+RestraintAdded) +### The dragon girl conjures magical locks on you! (+RestraintAdded) + + + +Shadow Dragon Queen +シャドウ・ドラゴンの女王 +The shadow dragon shapeshifts back to human form! +シャドウ・ドラゴンは人間の姿になった! +The shadow dragon slashes directly at your mind! (DamageTaken) +シャドウ・ドラゴンは心を直接引き裂いてきた! (DamageTaken) +The shadow dragon wraps itself around you many times! (+RestraintAdded) +シャドウ・ドラゴン自身に何度も包まれた! (+RestraintAdded) +Shadow Dragon Girl +シャドウ・ドラゴンガール +The dragon girl stares into your eyes! (DamageTaken) +シャドウ・ドラゴンガールの眼差しに心を奪われた! (DamageTaken) +The dragon girl reaches out with a shadowy grip! (+RestraintAdded) +シャドウ・ドラゴンガールの影の手に捕まった! (+RestraintAdded) +### The dragon girl reaches out and locks your restraints! (+RestraintAdded) + + + +A cage falls from the ceiling on top of you! +天井から檻が落ちてきた! +Crystals grow across your body and encase you! +突如体中のクリスタルが成長し、全身を包み込まれてしまった! +You are encased in a solid block of ice! +氷の中に閉じ込められた! +### A shadowy sphere rises from the ground and wraps over you tightly! + +Shadows coalesce themselves around you in spherical form! +影が全身にまとわりつき、球体に変化した! + + +Crystal Encasement +クリスタル +An overgrowth of magical crystals. Their chaotic energies flood into your mind and displace your thoughts! +急成長した魔法のクリスタル。混沌の力に思考が塗りつぶされていく。 +Being brittle, it will eventually crack and fail. Just keep wiggling... +あまり硬くはないため、いずれは割れるだろう。もがき続けるしかない…… +Ice Encasement +氷漬け +A huge ice cube. It's quite cold in there. +巨大な氷の塊。とても冷たい。 +It will eventually melt! Eventually... +そのうち溶けるだろう……多分。 + + +The Warden's restraints release you... for now. +看守長の拘束から開放された……今だけは。 + + +Chain Hogtie +鎖のホッグタイ +A metal chain holds your back in an arched position. +手と足を繋ぐ鎖の拘束。 + + +A chain connecting your thigh cuffs together. You can still walk, albeit slower than usual. +太ももを繋ぐ鎖。脚の動きが制限される。 +It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. +鋼鉄製で、施錠されている。解錠するとこの拘束具は勝手に外れる。 + + +A chain connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. +足枷同士をつなぐ鎖。歩く程度なら支障はない程度の長さ。 +Ankle Chain (Short) +足枷の鎖(短) +A short chain connecting your ankle cuffs together. You can barely separate your legs with this on. +足枷同士をつなぐ短い鎖。辛うじて足を離せる程度の長さ。 + + +A very short chain connecting your elbow cuffs together. It is quite awkward to remove by yourself. +肘枷同士を繋ぐ鎖。自分で外すのは困難。 +A very short chain connecting your wrist cuffs together. +手枷同士を繋ぐ短い鎖。 + + +Vine Pod +ヴァインポッド +The vine pod explodes into dust! +ヴァインポッドは爆散した! +The vine pod wraps you in vines and squeezes! (DamageTaken) +ヴァインポッドに蔦で締め付けられた! (DamageTaken) +The vine pod launches several vines at you in quick succession! (+RestraintAdded) +ヴァインポッドは大量の蔦を飛ばしてきた! (+RestraintAdded) + + +Sleep Flower +ネムリバナ +The sleep flower explodes into dust! +ネムリバナは爆散した! +The sleep flower sprays pollen into your face! Achoo! (DamageTaken) +ネムリバナに大量の花粉を吹きかけられて……ハクション! (DamageTaken) +The sleep flower launches several vines at you in quick succession! (+RestraintAdded) +ネムリバナは大量の蔦を飛ばしてきた! (+RestraintAdded) + + +Several vine pods sprout out of the ground! +地面から複数のヴァインポッドが生えてきた! +A vine pod sprouts out of the ground! +地面からヴァインポッドが生えてきた! +Several flowers sprout out of the ground! +花々が地面から生えてきた! +A magical flower sprouts out of the ground! +魔法の花が地面から生えてきた! +A wall of ice rises from the ground! +氷の壁がせり上がった! +The dragon's breath poisons you! +毒竜の吐息に侵された! +The dragon girl strikes you with poisonous razor leaves! +ポイズン・ドラゴンガールのカミソリのような毒葉が身体を切り刻む! +The flower releases soporific spores! +花から催涙性の花粉が吐き出された! +Poison Breath +ポイズンブレス + + +Vines reach from the ceiling and lift you into the air! +天井から伸びてきた蔦に宙吊りにされてしまった! + + +Vine Suspension +蔦の吊り拘束 +Vines linked to your bindings that keep you suspended! +蔦に拘束具を掴まれ、宙吊りにされてしまった! +You are left dangling! Maybe if you swing hard enough you can tear the vines... +宙吊りにされている!身体を左右に揺らせば、蔦がちぎれるかもしれない…… + + +### Darkstar Studios - Slimy Science + +### Kocaeli - Doll Storage + +### Kocaeli - Factory + +### Kocaeli - AAA + +### Kocaeli - DD + +### Ada18980 - Playing with fire + +### Ada18980 - Smoking is bad for you + +### Kocaeli - Graveyard + +### Kocaeli - Ancient Tombs + +### Kocaeli - Magic Library + +### Kocaeli - Black Cat + +### Kocaeli - Black Cat 2 + +### Kocaeli - Underground Jungle + +### Kocaeli - Untitled + +### Kocaeli - Lost Temple + +### Kocaeli - Orrery + +### Kocaeli - Bellows + +### Kocaeli - Rubber Facility + +### Kocaeli - Edge of Reality + +### Kocaeli - 1 + +Icy Barrier +アイスバリア +The wall of ice shatters! +氷の壁は崩れ去った! + + +Icy Breath +アイスブレス +Ice Orb +アイスオーブ +The EnemyName breaths in deeply, causing the air around you to chill... +EnemyName が息を深く吐くと、周囲の温度が下がっていく…… + + +Shadow Bubble +影の泡 +The projectile explodes into tight shadow latex, stretching all across your body! +影の弾丸はゴムとなり、全身にまとわりついた! +The dragon dances through the shadows! +シャドウ・ドラゴンは影の中で踊る! + + +You tip over as you try to roll yourself! (oof!) +転がろうとしてひっくり返ってしまった! + + +The shadowy energies surrounding you drain away your mana... +周囲に満ちた影のエネルギーにマナを奪われる…… + + +Shadow Sphere +影の球体 +A giant shadow latex sphere that leaves you rolling around... +影のゴムでできた球体。転げ回っていると…… + + +Dark magics fill the air! +闇の魔力が空気を満たした! + + +Shadow Posture Collar +影の姿勢首輪 +A strict collar that seals your mouth tightly. +口まで伸びる首輪。 +It is made of shadow latex, tougher to cut than normal latex. +通常のゴムよりも頑丈な影のゴムでできている。 + + +Not bad... you made me use 10% of my power. +悪くない……私に1割も本気を出させるなんて。 + + +It's a defunct elevator, likely from the Old Civilization. +旧文明のエレベーターのようだ。既に役割を終えたのか、動く気配はない。 + + +(The elevator beeps and roars to life)|(Its control panel displays a list of options) +(エレベーターは機械音を立てて動き出した)|(コントロールパネルに行き先が表示されている) +(Go to floor 0) +(0階) +(Go to floor 1) +(1階) +(Go to floor 2) +(2階) +(Go to floor 3) +(3階) +(Go to floor 4) +(4階) +(Go to floor 5) +(5階) +(Go to floor 6) +(6階) +(Go to floor 7) +(7階) +(Go to floor 8) +(8階) +(Go to floor 9) +(9階) +(Go to floor 10) +(10階) +(Go to floor 11) +(11階) +(Go to floor 12) +(12階) +(Go to floor 13) +(13階) +(Go to floor 14) +(14階) +(Go to floor 15) +(15階) +(Go to floor 16) +(16階) +(Go to floor 17) +(17階) +(Go to floor 18) +(18階) +(Go to floor 19) +(19階) +(Go to floor 20) +(20階) + + +(The viewscreen depicts a face)|Why hello there adventurer! What brings you? +(モニターに顔が映し出されている)|ご機嫌よう、冒険者さん。何か御用ですか? + + +Hmmmphgm? +あんふぁふぁ? +(The face giggles)|Sadly my language processing systems aren't that good.|Try removing your gag first? +(モニター上の顔は苦笑いを浮かべている)|ごめんなさい、私の言語処理能力はあまり高くないのです。|まずは猿轡を外していただけますか? +(The face smiles)|I am the Facility's vessel, of course!|Sariel called me Oriel, but I don't see her much these days... +(モニター上の顔は笑みを浮かべている)|私はこの施設の管理人。|サリエルは私をオーリエルと呼びました。そういえば、最近彼女には会っていませんね……。 + + +Gffmmphmm? +おーいえふ? +(Oriel smiles)|Ah, it's you again!|It seems like you've found a new toy as well?|I can't understand you, silly~ +(オーリエルは笑っている)|ああ、またあなたでしたか。|新しいおもちゃを見つけたのですか?|申し訳ございませんが、あなたのようなおばかさんの言葉は理解できません。 +Oriel? As in the goddess of technology? +オーリエルって文明の神オーリエル!? +'Goddess'? That seems like an outdated term.|Regardless, I am only a vessel, not the facility itself. +"女神"?些か時代錯誤な言葉ですね。|私はあくまでこの工場の管理人に過ぎません。 + + +(Oriel giggles)|Sweetie, I can't understand you. +(オーリエルはクスクスと笑っている)|うふふ、だからわかりませんよ。 +Can you control the facility? +この工場を制御できるの? +(Oriel frowns)|Adventurers seem to keep asking me that.|In my current state I don't have control over much at all.|But I'm always here to talk! +(オーリエルは眉をひそめた)|冒険者さんはいつも同じことを訊きますね。|今の状態では完全に制御するのは難しいでしょう。|ただ、話し相手にならいつでもなってあげますよ。 + + +Can you turn on the elevator? +エレベーターを動かせる? +I'm sorry, adventurer. I can't do that.|But maybe if you can get rid of all the nearby threats...|They've been under lockdown for a long time.|Just push the button again if it hasn't updated yet. +ごめんなさい。|しかし、近くの脅威を全て排除できれば……|奴らによって長いことエレベーターを動かせずにいるのです。|既に倒しているなら、ボタンを押すだけでいいです。 + + +Mmmph mmm! (Help me!) +はふへふぇ!(助けて!) +(Oriel chuckles)|What was that again?|Sorry~ +(オーリエルは苦笑いしている)|なんて?|すみませんね、もう一度言ってみてください。 +Can you help me out? +助けてくれる? +(Oriel giggles)|I can't do anything for you right now~ +(オーリエルはクスクスと笑っている)|悪いけど何もできそうにありませんね~。 + + +Mmmmm... +んむぅぅ…… +(Oriel smiles)|It's always fun to see you like that~ +(オーリエルは笑みを浮かべている)|あなたを見ていると心が踊りますね~。 +How are you doing? +最近どう? +(Oriel smiles)|Good!|I miss Sariel, though... +(オーリエルは笑みを浮かべている)|悪くないですよ!|サリエルに会えないのは寂しいですが…… + + +RMNME of CHTRNME the ENMYNME +ENMYNME の CHTRNME の RMNME + + +The item is TTT, and will get looser as you progress. +この拘束具は TTT 抜け出す過程で緩くなるだろう。 + + +somewhat tight +ゆるんでいる。 +rather tight +少しゆるんでいる。 +quite tight +少しきつい。 +especially tight +きつい。 +extremely tight +とてもきつい。 +incredibly tight +ものすごくきつい。 + + +somewhat secure +外れそうだ。 +secure +少し外れそうだ。 +quite secure +少し頑丈だ。 +highly secure +頑丈だ。 +extremely secure +とても頑丈だ。 +incredibly secure +ものすごく頑丈だ。 + + +somewhat thick +薄い。 +rather thick +少し薄い。 +quite thick +少し厚い。 +highly thick +厚い。 +extremely thick +とても厚い。 +incredibly thick +ものすごく厚い。 + + +You must first accept the quest before offering at the shrine. +祈る前にクエストを受けなければならない。 + + +Zero Resistance +無抵抗 +Toggle this to set bondage resist, evasion, and block to 0. While enabled, using the 'wait until interrupted' button will not be interrupted when hit or bound. +使用すると、拘束耐性、回避値、ブロック値が0になり、「自動待機」使用時に攻撃や拘束をされても待機し続けるようになる。 + + +The RSTRT feels a little looser! +RSTRT が少し緩んだ! + + +Crystal Armbinder +クリスタルのアームバインダー +A growth of crystals fusing your arms together. Chaotic energies radiate in all directions, causing you to slowly lose control over your desires. +輝くクリスタルでできたアームバインダー。滲み出る混沌の力により、徐々に性欲をコントロールできなくなる。 +Crystals are tough but not unbreakable. +クリスタルは硬いが、壊せないほどではない。 + + +Crystal Ball Gag +クリスタルのボールギャグ +A growth of crystals inside your mouth. It emits a strange, pleasurable sensation. +口の中で成長したクリスタル。触れていると気持ちよくなれる。 + + +Crystal Gag Necklace +クリスタルのボールギャグ(ネックレス) +An arousing accessory made of solid crystal! +クリスタルで作られたえっちなネックレス。 +Simply popping it out of your mouth isn't enough to negate its effects entirely~ +口から外すだけでは、効果を完全に無効化できない。 + + + + +The lock is protected by a seal of repentance. To unlock it you must pay 1 spell point. +錠には悔恨の封印がなされている。1のスキルポイントを捧げなければ封印は解けない。 +The restraint won't budge. +この拘束は破壊できない。 +You perform a ritual to unlock the item! +拘束具を解錠するため、儀式を行った! + + +The lock is protected by a seal of repentance. To unlock it you must pay AMNT spell points! +錠には悔恨の封印がなされている。 AMNT のスキルポイントを捧げなければ封印は解けない。 +You perform a grand ritual to unlock the item! +拘束具を解錠するため、儀式を行った! + + +Warden's Thigh Chain +看守長の脚枷の鎖 +You've stolen something of great value. Now you must give it back. +盗掘の代償。罪は償わなければならない。 + + +Warden's Ankle Chain +看守長の足枷の鎖 +Warden's Ankle Link +看守長の足枷の鎖 +An intense, albeit temporary punishment for breaking the rules. +規則違反に対する重い戒め。 + + +Warden's Elbow Chain +看守長の肘枷の鎖 +Warden's Wrist Chain +看守長の手枷の鎖 + + +ESCP Difficulty: AMNT +ESCP 難易度: AMNT +ESCP Power: AMNT +ESCP 力: AMNT +ESCP Ability: AMNT +ESCP 技術: AMNT +Max ESCP Depth: AMNT% +ESCP 力: AMNT% + + +Cut +切る + + +Your collar channels the vigor of excitement into magical energy! +首輪が興奮を魔力に変換した! +The collar has already squeezed what it can out of you. Clear your mind first! +搾り取れるものが残っていない。一旦落ち着こう。 + + +The guardian deploys a forcefield! +機械がフォースフィールドを展開した! +The guardian deploys a set of forcefields! +機械が複数のフォースフィールドを展開した! + + +Guardian Drone +ガーディアンドローン + + +Cyber Guardian +サイバーワーデン + + +Auto Enforcer Guardian +オートエンフォーサーガーディアン + + + + + + +Time to get you into your uniform~ +お着替えの時間ですよ~。 +You won't be needing any of this. +こんなものは必要ないでしょう。 +There we go, all ready for training! +調教の準備は整いましたね。 + + +Cyber Storage +サイバーストレージ +An all-purpose metal crate equipped with a polycarbonate blast door and steel reinforcement. +ポリカーボネート製のブラストドアと鋼鉄の補強材で作られた金属製の箱。 +Used throughout the reign of the Old Civilization to store slaves and prisoners. +旧文明の時代で奴隷や囚人の保管に使用された箱。 + + +The liquid latex sticks to your skin, forcing an airtight layer! +液体のゴムが全身に密着し、ピッタリと張り付いてきた。 +The latex starts to build up layers, forcing a protective coating... +ゴムが複数の層を形成し始めた。 +The latex starts adhering to your skin, becoming extremely difficult to remove... +ゴムが肌に付着し、剥がすのが困難になった。 +The latex seals you in, rendering escape impossible without alchemical methods. +ゴムに完全に密封された。錬金術的な方法なしに抜け出すのは不可能だろう。 +The liquid latex spray slows you down! +液体ゴムスプレーで動きが遅くなった! + + +Latex Sprayer +ラテックススプレータレット +The turret deactivates after taking too much damage! +タレットはダメージの蓄積により動きを止めた。 +The turret defends itself with a spray of sticky liquid latex! (DamageTaken) +タレットがゴムのスプレーを吹きかけてきた! (DamageTaken) + + +Your latex layer adheres to latex, making struggling more difficult! +ゴムがくっつき合い、もがくのが困難になっている。 +The item sticks to your rubber layer, making it harder to pull off... +ゴムとくっつき合い、引き剥がすのが困難になっている。 +The item hugs your layer tightly, adhering firmly! +しっかりと身体に密着している。 +Your skin is covered in a layer of latex, making escape from cyber restraints harder! +皮膚がゴムで覆われており、サイバー系の拘束具から抜け出しにくくなっている。 + + +Some Exclusions Apply +除外項目 +Goddess shrines do not remove non-binding restraints such as harnesses and cuffs. +女神の祭壇で、枷やハーネスのような拘束力のないものを取り除けなくなる。 + + +Melee Specialization +近接戦闘専門 +Gain 25% base physical damage, but your spells do 50% less damage. +物理ダメージ+25%、魔法ダメージ-50%。 +Melee Expert +近接戦闘の達人 +Gain +20 Accuracy and +10% base physical damage. +命中率+20、物理ダメージ+10%。 + + +Magic Specialization +魔法専門 +Gain 25% spell damage, but your attacks are delayed by 1 turn when attacking. +魔法ダメージ+25%。攻撃時、追加で1ターン消費する。 +Spell Expert +魔法の達人 +Gain -10% miscast chance and +10% spell damage. +詠唱失敗率-10%、魔法ダメージ+10%。 + + +Ranged Specialization +遠距離戦闘専門 +You deal 20% more damage to enemies further than 2 tiles away, but enemies adjacent to you take 60% reduced damage. +2マス以上離れている敵に与えるダメージ+20%、隣接している敵に与えるダメージ-60%。 +Ranged Weapon Expert +遠距離戦闘の達人 +Bows, guns, and other projectile weapons do 10% more damage and consume 10% less charge. +遠距離武器のダメージ+10%、チャージコスト-10%。 + + + + +After casting a DMG spell: +DMG の魔法を唱えた後: +Gain AMNT% DMG Damage for DRTN turns +DRTN ターンの間 DMG の与ダメージが AMNT% 増加する +Gain AMNT DMG Resist for DRTN turns +DRTN ターンの間 DMG に対して AMNT% の耐性を得る +Your elemental damage is increased! +精霊魔法の与ダメージが増加する +Your elemental resistance is increased! +精霊魔法の被ダメージが減少する + + +The overgrown monolith contains an ancient blessing. +苔むしたモノリスから古代の祝福を授かった! +Choose a stat to increase below. +上昇させるステータスを選択 + + +Confirm Choice +選択 + + +Increase max distraction by AMNT%. +最大興奮値が AMNT% 上昇する。 +DP decays faster and more SP is safe from damage. +興奮値がより早く減少し、スタミナダメージを軽減する。 +Increase max stamina by AMNT. +最大スタミナが AMNT 上昇する。 +Increase max mana by AMNT. +最大マナが AMNT 上昇する。 +Increase max willpower by AMNT. +最大気力が AMNT 上昇する。 +Gain +AMNT SP regen/turn. +ターン毎のスタミナ回復量が AMNT 上昇する。 + + +### AMNT1 -> AMNT2 + +### AMNT1 (max) + +You found a magical amulet! Choose one of the following to determine its benefits: +魔法のアミュレットを見つけた。以下の能力を一つ上昇させられる。 +Focus: +50% max distraction and faster decay. +5% stamina protected from damage (base: 30%). +集中力:最大興奮値が50%上昇し、スタミナダメージを5%軽減する(初期30%軽減) +Stamina: +50 max stamina. +スタミナ:最大スタミナが50上昇する。 +Magic: +50 max mana. +魔法:最大マナが50上昇する。 +Willpower: +50 max willpower. +1 stamina regen/turn. +気力:最大気力が50上昇し、ターン毎のスタミナ回復量+1 + + +A mystical orb stands before you. +神秘的なオーブを見つけた。 +You break the orb and gain its secrets. +オーブを破壊し、力を手に入れた。 + + +Stun Resistance! +スタンに抵抗した! + + +Negate Rune +ルーン消去 +Removes a rune on the target tile. If cast on self, removes all runes you've created instead. Casting on an enemy rune restores 10 mana instead. +選択したマスのルーンを消去する。自身に唱えると、自分が設置した全てのルーンを消去する。敵のルーンに唱えると、マナを10回復する。 +You scribe a negation rune! +拒否のルーンを描いた! +Target a single rune, or yourself to negate all your runes. +ルーンか自身を選択。 +You don't have enough mana +マナが足りない。 +The enemy rune is wiped clean. +敵のルーンが掻き消えた。 +You pour negation magic into the ground, but nothing happens. +拒否のルーンを地面に描いたが、何も起こらなかった。 +All of your runes have been removed. +自身の描いた全てのルーンを消去した。 + + +E-Stimulation +電気責め +Replaces most instances of painful electric shocks with stimulating effects instead. +自身の受ける電気ダメージを、スタミナダメージから興奮値の上昇に置き換える。 + + +The energy bolt hits you and sends stimulating energies through you! +電気による痛みで興奮した! + + +You steal a key card. +カードキーを手に入れた。 +Key Card +カードキー +The keycard's shiny surface reflects the light in a mesmerizing way. +カードは魅力的な光沢をしている。 +A piece of identification that contains an access code. +アクセスコードが記された、電子身分証明証。 +You can use it to unlock certain doors. +これを使って特定のドアを解錠できる。 +Your keycard blinks red as the facility remotely locks it! +カードキーが赤く点滅している。セキュリティに権限をロックされてしまったようだ! +Your keycard blinks red as the facility remotely locks it! System Security: 100% +カードキーが赤く点滅し、施設が遠隔ロックされた。システムセキュリティ: 100% +Unauthorized removal detected. System Security: AMNT% +不正な持ち出しを検知。システムセキュリティ: AMNT% +Security breach. Initiating remote lockout. System Security: AMNT% +セキュリティに以上を検知。リモートロックアウト実行。システム・セキュリティ: AMNT% + + +You pick up a flash bomb. +閃光爆弾を拾った。 +You pick up a flashbang grenade. +閃光手榴弾を拾った。 + + +Actions +アクション +Self +自身 +Dialogue +会話 +Ambient +環境 +Kills +討伐 + + +You attack TargetEnemy for DamageDealt total damage. +TargetEnemy に攻撃し、合計 DamageDealt ダメージを与えた。 +You attack TargetEnemy for DamageDealt damage / BondageDealt binding. +TargetEnemy に攻撃し、合計 DamageDealt ダメージとBondageDealt 拘束値を与えた。 +You attack TargetEnemy but don't do any damage. +TargetEnemy に攻撃したが、ダメージを与えられなかった。 +ENMY calls for help! +ENMY は助けを呼んだ! + + +(Go to The Summit) +(セーフエリアへ行く) + + +The Summit is a safe area. Items can be left here without fear of losing them. +セーフエリアでは敵に襲われる心配もなく、アイテムもなくなることはない。 + + +Target an NPC to attach a leash. Enemies and unwilling allies must be tied up to 50% first. Target self to release all leashes, or target a leashed NPC to unleash them. +NPCにリードを取り付ける。敵や反抗的な味方に取り付けるには50%以上の拘束値が必要。自身かリードを装備しているNPCに使用した場合、リードを取り外す。 +Target an NPC to leash, or self to unleash all. +NPCか自身を選択 + + +Brat Handler +力ずくの主従 +Target an NPC with an equipped leash restraint (via Truss'em'up) to attach a leash. Target self to release all leashes, or target a leashed NPC to unleash them. +スキル「ぐるぐるまき!」で拘束した敵にリードを取り付ける。自身を選択するとリードを全て手放し、NPCを選択すると、選択したNPCのリードを手放す。 + + +Clip-On Leash +クリップ式リード +A beloved favorite of pets and trainers alike. +ペットからもトレーナーからも好評。 +You ready the leash... +散歩の時間だ…… +You pick up a leash. +リードを拾った。 + + +You are not in a condition to use a leash on her. +リードを取り付けられる状態じゃない。 +She refuses to be leashed unless you tie her up! +リードを取り付けようとしたら抵抗された。先に拘束しなければ。 +You attach a leash to ENMY. +ENMY にリードを取り付けた・ +You remove your leash from ENMY. +ENMY の持っているリードを外した。 +You let go of all leashes. +自身の持っているリードを全て外した。 + + +Plastic Explosive +プラスチック爆弾 +Has a 60 turn timer, but can be detonated by other explosives. Deals 210 blast damage in a huge radius and leaves behind a huge field of rubble. Enemies hit have their armor reduced by 50 BEFORE taking damage. +設置してから60ターン後に爆発する。設置後に爆発ダメージを受けた場合、即座に爆発する。 超広範囲に210の爆発属性ダメージを与え、周囲に瓦礫を生成する。 この爆風に命中した敵のアーマー値を50減少させる。この効果はダメージ処理の前に行われる。 +It's totally harmless! Probably. +慎重に取り扱えば安全……だろう。 +You set the clock ticking... +爆弾のタイマーをセットした…… + + +Dynamite +ダイナマイト +10 turn fuse with a 25% chance each turn to detonate prematurely. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. +設置してから10ターン後に爆発する。このカウントはターン毎に25%の確率で早まる。 広範囲に140の爆発属性ダメージを与える。 この爆風に命中した敵のアーマー値を20減少させる。この効果はダメージ処理の前に行われる。 +Arguably more dangerous to the user than the target. +敵よりも危険。 +10 turn fuse with a 25% chance each turn to detonate. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. +設置してから10ターンの間、それぞれ25%の確率で爆発する。広範囲に140の爆発属性ダメージを与える。 この爆風に命中した敵のアーマー値を20減少させる。この効果はダメージ処理の前に行われる。 +You light the fuse and pray it doesn't blow up in your face. +眼の前で爆発しないように祈りながら導火線に火をつけた。 + + +You are holding too many leashes! +これ以上リードは持てない! + + +You feel a corrupting influence... (+AMNT Corruption) +魂が堕落していくのを感じた……(+AMNT 堕落) +You feel a restoring influence! (-AMNT Corruption) +魂が浄化されていくのを感じた……(-AMNT 堕落) +Sticky latex fuses itself to your skin! (+AMNT LatexIntegration) +ネバネバのゴムが身体に張り付いてくる!(+AMNT ラテックス拘束) +The latex starts to detach from your skin... (-AMNT Latex Integration) +ゴムが身体から剥がれていく……(-AMNT ラテックス拘束) + + +While you have an evasion penalty, even clumsy enemies... +回避ペナルティがある…… +... will get an accuracy bonus against you in melee range. +……不器用な敵でも命中ボーナスを得られるだろう。 + + +You are more likely to succumb to curses. +呪いにかかりやすくなっている。 + + +### X Offset + +### Y Offset + +### X Scale + +### Y Scale + +### X Pivot + +### Y Pivot + +### Rotation + +### Layer Bonus + +### NoDynamicArmor (0/1) + +### AddPose + +### HideOverridden (0/1) + +### NoOverride (0/1) + +### Hide Pose (e.g. Xray) + +### Require Pose (e.g. ChestArmor) + +### Hide Prefix (e.g Encase) + +### Hide Suffix (e.g TorsoUpper) + +### Protected + +### Displace Amount + +### Erase Amount + +Load from File +ロード +Save to File +セーブ + + +Tip: Slime/Latex tiles only affect entities with less than 45 Glue Resist. +Tips:スライム/ラテックスのマスは、ねばねば耐性が45未満の対象にのみ効果を発揮する。 +Being drenched in water also prevents slime/latex from sticking to you. +水に濡れるとスライムやラテックスが付着しにくくなる。 +Use the interact tool in the bottom right HUD to sleep in a bed. +ベッドをインタラクトすることで、眠ることができる。 + + +Clear Vision +クリアビジョン +Blindfolds are much rarer. +目隠しがとても出現しにくくなる。 +Free the Boob +ノーブラ +Chastity bras are rarer unless you are wearing nipple toys. +乳首にオモチャをつけていない限り、貞操ブラが出現しにくくなる。 +Liberate the Boob +揺らす自由 +Chastity bras are much rarer. +貞操ブラがとても出現しにくくなる。 + + +Find an elevator to the Summit in order to access facilities. +施設を使うためには、エレベーターでセーフゾーンを訪れる必要がある。まずはエレベーターを探そう。 +Visit the Summit to allow additional interactions with this facility. +セーフゾーン訪れて施設を見てみよう。 +### Must visit the Summit or be in a perk shrine to recycle restraints. + ++AMNT% Training/Tick +調教度/ティック +AMNT% ++AMNT% Opinion/Tick +好感度/ティック +AMNT% ++AMNT% Productivity +生産力 +AMNT% +AMNT/MAXX Prisoners Assigned +囚人数 AMNT/MAXX +AMNT/MAXX Servants Assigned +使用人の数 AMNT/MAXX + + +Assign servants as managers to boost the production of other facilities.|Appointing new management results in a loss of efficiency until the next cycle. +使用人をマネージャーとして配属する。|配属者を変更した場合、次のサイクルまで効率が低下する。 +Bondage Dojo +緊縛道場 +Assign servants to perfect the art of walking in heels,wearing tight corsets,|communicating while gagged, and overall flexibility. +使用人を鍛える。ヒールを履いて綺麗に歩けるようになり、きついコルセットを着用できるようになり、|猿轡をしていても完璧に意思の疎通ができるようになり、身体の柔軟性が増す。 +Rescue Operations +救助部隊 +Assign servants to train squads of rescue maids, which you can call in times of need. +使用人をレスキューメイドとして任命する。必要なときに呼び出すことができる。 +Alchemy Lab +錬金工房 +Assign servants to produce potions from base ingredients you acquire in your adventures. +使用人に錬金術を研究させる。手に入れた素材からポーションを作ることができる。 +Recycler +リサイクラー +Convert low tier restraints into raw materials and output higher quality restraints.|Adding more servants increase the conversion speed. +tierの低い拘束具を高tierの拘束具に変換する。|多くの人員を配置することで、変換速度が増加する。 +Cuddle Lounge +ラウンジ +Assign prisoners to the lounge in order to improve servant and prisoner opinion. +好感度を高めるために、囚人をラウンジに配置する。 +Appoint a warden to keep prisoners in check and automatically bind using restraints from storage. +看守を任命して囚人を管理する。倉庫から拘束具を取り出して自動で拘束する。 + + +Recycle Restraints +拘束具をリサイクル + + +Recycle One +一つリサイクル +Recycle ALL! +全てリサイクル +Recycle all but one +一つを残してリサイクル + + +You recycle a ITM +ITM をリサイクルした。 +You recycle #x ITM +#x の ITM をリサイクルした。 + + +You disassemble #x ITM into $x PRD +#x の ITM を解体し、 $x の PRD を得た。 +Disassemble all but one +一つを残して解体 +Disassemble one +一つ解体 + + +You're blocking me. +どいてくれない? +You're in my way! +どいて! +Miss, you're blocking me... +通らせていただけませんか……? +Step aside~ +ちょっと通してくれない? +Path blocked by citizen. +前方ニ障害物。 +*Bumps into you* +(通してほしいようだ) + + + + +Cyber Hogtie Tether +ホッグタイの電子リンク +It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. +サイバーカフから放出されるエネルギー体。いかなる手段でも傷つけることができず、びくともしない。 + + +Cyber Thigh Tether +脚枷の電子リンク +An energy tether connecting your thigh cuffs together. You can still walk, albeit slower than usual. +脚枷同士を流れるエネルギー体。脚の動きは制限されるが、ゆっくりと歩くことはできる。 + + +Cyber Ankle Tether +足枷の電子リンク +An energy tether connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. +足枷同士を流れるエネルギー体。足の動きは制限されるが、ゆっくりと歩くことはできる。 +A short energy tether connecting your ankle cuffs together. You can barely separate your legs with this on. +足枷同士を流れるエネルギー体。足と足の間にほんの少しだけ隙間がある程度。 + + +Cyber Elbow Tether +肘枷の電子リンク +A very short energy tether connecting your elbow cuffs together. It is quite awkward to remove by yourself. +肘枷同士を流れるエネルギー体。自力で取り外すにはかなり手間がかかる。 +Cyber Wrist Tether +手枷の電子リンク +A very short energy tether connecting your wrist cuffs together. +手枷同士を流れるエネルギー体。 + + +Desperate Struggle +最後の抵抗 +Spend 20 WP to shake around violently. Has a chance to loosen restraints you are wearing, based on existing struggle progress. Spreading the effect over multiple restraints reduces the chance of loosening.|Requires 25% or more WP to activate. +気力を20消費し、全力でもがく。装備している拘束具を緩める可能性があるが、対象となる拘束具が増えるごとに緩む確率が減少する。|発動には25%以上の気力が必要。 +None of your restraints will budge. +緩められそうな拘束具がない。 +You thrash around with all your might. +思い切りのたうち回った。 +You don't have the willpower left to struggle... +全力でもがく気力が残っていない…… + + +### f + +### x + +### L + +### m + +### R + + + +Fiber +繊維 +Runes +ルーン + + +Stock: +ストック: +Inputs: +投入: + + +You slip off the conveyor! +コンベアからはじき出された! +The Summit +セーフゾーン + + +Back to Collection +戻る +Edit Restraints +拘束具をセットする + + +Editing Restraints +拘束具をセット中 +Imprison in Furniture +拘束用インテリアで拘束中 +Dropoff Prisoner +囚人を降ろす + + +Module (Utility) +モジュール(その他) +Module (Punishment) +モジュール(懲罰) +~~~ Collar ~~~ +~~~ 首輪 ~~~ +Blindfold / Earplugs +目隠し/耳栓 +Mask/Hood +マスク/フード +Gag / Stuffing +猿轡/詰め物 +Flat Gag +パネルギャグ +Wrists +腕 +Encasement +完全拘束 +Mittens / Tape +ミトン/テープ +Gloves / Tape +グローブ/テープ +Vibes +バイブ +Chastity Bra +貞操帯 +Catsuit / Leotard +キャットスーツ/レオタード +Rear Plug +後ろの穴 +Front Plug +前の穴 +Vibrator +バイブレーター +Chastity Belt +貞操ベルト +Thigh Cuffs +脚枷 +Leg Bondage +足の拘束 +Shins +脛 +Knees +膝 +Toe Cuffs +指枷 +Toe Tie +指の拘束 +Heels +ヒール + + +Equipped: +装備: +Click to Add +クリックして追加 +Apply +決定 +Raw Material: +素材: + + +Free Prisoner +開放する + + +Perk Unlocked: +開放済みスキル: + + +Latex Solvent +ゴム溶剤 +You ready the bottle of Latex Solvent. +溶剤を準備した。 +A potent acid, capable of dissolving slime and latex. +スライムやラテックスを溶かせる強力な酸。 +Deal 90 acid damage to target. Adds a 10% debuff to the cut and struggle resistance of latex restraints currently worn. +90酸ダメージを与える。着用中のラテックス製拘束具の「もがく」「切る」耐性を10%下げる。 + + +Weakened by Latex Solvent (10%) +ゴム溶剤の弱体化(10%) +You spill the solvent on yourself and loosen your latex bonds! +溶剤を自身にかけ、ラテックスの拘束具を緩めた! +You splash the ENMY with latex solvent! +ENMY にゴム溶剤をぶちまけた! + + +You can't use solvents on targets other than yourself while bound. +拘束されている間は自分以外に使えない。 + + +Choose Palette +パレットを選択 +Use Raw Material +素材を使用 +Restraint Palette +拘束のパレット +Choose Restraint +拘束を選択 + + +Def. Palette: +デフォルトのパレット: +Set All Palette +全て選択 + + +Guests +ゲスト + + +Assign to +配置場所 +Remove from +配置をやめる +Can't assign to +配置不可 +### Remove from party to assign + +Imprison +投獄 + + +Opinion: +好感度: +Last Seen on Floor FLR, LOC +最後に見かけたのは FLR 階層の LOC 。 +Present in current level +この階層にいる。 +Captured by FCTN +FCTN に捕まっている +Captured by enemies +どこかに捕まっている + + +Use 'Truss'em'Up' to edit restraints on this NPC +スキル「ぐるぐるまき!」を使用してNPCの拘束具を変更する +The NPC needs tightening, but is unavailable right now +NPC の拘束をより強固にする必要があるが、今はできない +Tighten non-conjured restraints +召喚されていない拘束具を締め直す + + +NPC has escaped! +NPC が逃げ出した! +NPC is likely to escape. +NPC は逃げ出す機会を伺っている。 +NPC has managed to loosen her bonds. +NPC は拘束を緩めている。 + + +Any +全員 +NPC Opinion: +好感度: +NPC Escape Status: +逃走状況: +NPC Binding: +拘束: +NPC Availability: +使用状況: +Favorited: +お気に入り: +Rank: +ランク: +Minor +通常 +Elite +エリート +Miniboss +中ボス + + +Bound +拘束 +At Risk +危険 +Escaped +逃走 +Imprisoned +収監 +Positive +好き +Negative +嫌い +Non-Favorite +お気に入りじゃない + + +Present +使用可能 +Unavailable +使用不可能 + + +Auto Bind Interface +自動拘束インターフェイス +AutoBind +自動拘束 + + +Assign to Facility +施設に配属 + + +Copy Restraints +拘束具をコピー +Paste Restraints from NME +コピー元 NME の拘束具をペースト +No restraints left in inventory +拘束具が足りない +Paste to All! +全てにペースト +OVERWRITE All! +全てに上書き + + +Need Positive Opinion to Promote +昇格させるには好感度が足りない +Remove From Party Before Promoting? +昇格させずにパーティから追放する? + + +Servant Cuddle Points: AMNT (+OPN opinion/cycle) +使用人の幸福度: AMNT (+OPN 追加ポイント/サイクル) +Prisoner Cuddle Points: AMNT (+OPN opinion/cycle) +囚人の幸福度: AMNT (+OPN 追加ポイント/サイクル) +Submissive prisoners and dominant servants add different amounts of opinion per cycle +マゾの囚人とサドの使用人では、追加される好感度の上昇が異なる + + +Release Prisoners +囚人を解放する +Release +解放 + + +### Summon + +### Already present in summit + +### NPC is unavailable + +### Only available in the Summit + + + +Mark +マークを付ける +Unmark +マークを外す +Mark ALL +全員にマークを付ける +Cancel Selection +キャンセル +Release Marked Prisoners! +マークを付けた囚人を解放 +Ransom Marked Prisoners for GP! +マークを付けた囚人の身代金を受け取る +Ransom Value: GP +身代金: GP +Current Gold: GP +所持金: GP +### n/a + +[EXP: AMNT/LMT, +NXT next floor] Heel training reduces balance loss from heels. +[EXP: AMNT/LMT +NXT 次の階層] ヒールトレーニングを積めば、ハイヒールを履いたときに転びにくくなる。 + + +Phase Dance active. Your next move is instant. +フェーズダンスが発動中。追加で移動できる。 +Combat Maneuver active. Your next move is instant. +再移動が発動中。追加で移動できる。 + + +The furniture space is occupied +既に使われている。 +Combat Maneuver: Your next move is instant. +再移動:追加で移動できる。 + + +Appointing managers increases the efficiency of other facilities. +マネージャーを設定することで、施設全体の効率が上昇する。 +Total Efficiency Boost: AMNT% +総合効率アップ: AMNT% +idle +待機 + + +(As you approach the statue, you hear a crumbling sound)|(The stone crumbles along the statue's slender frame)|(...revealing inside a beautiful, and extremely angry catgirl)|Who dares disturb my slumber?|I shall see to it that you receive your punishment! +(奇妙な像に近づくと、それは音を立てて崩れ落ちていく)|(そしてその中から美しくも憤怒に塗れたキャットガールの像が現れた)|我が眠りを妨げるのは何者か?|侵入者には相応しい罰を与えようぞ! + + +Mysterious Statue +奇妙な石像 + + +Select a Binding Slot +スロットを選択 + + +Cost: +コスト: + + +Zoom set to PCNT% +ズーム: PCNT% +You need free arms to tie others! +まずは自分の拘束を解かなくては。 +You can use the quick inventory to bind yourself or others +クイックインベントリから自身や他人を拘束することができる。 +Error. Please screenshot and report. +!!!エラーです。Discordかitch.coにて報告してください!!! +You can't wear that item, regrettably. +残念なことに、これを自身に装着することはできない。 + + +Must be stunned 3+ turns or fully bound +完全に拘束するには3ターン以上のスタンが必要。 +Depends on another item to be added first +最初に追加されるアイテムによる + + +The conjured RSTN vanishes as you remove it. +召喚された RSTN は消え去った。 + + +No free slots to bind in +空きスロットがない。 + + +Reaching Authority +根源への到達 +If arm components are unavailable, you can now apply bindings with verbal components only. Increases range of Truss em Up by 2 and all CMD spells by 1 +腕を使用できない場合でも、口を使用することによって拘束が可能になる。スキル「ぐるぐるまき!」の射程が2増加し、全てのコマンド系スペルの射程が1増加する。 + + +Save Slot +スロット +Load Game +ロード +Load Code +コードをロード +Load Slot 0 +スロット 0 をロード +Load File +ファイルをロード +Save From Code +コードとしてセーブ + + +Delete? +削除しますか? +Import to Slot +スロットにインポート +Invalid Data +無効なデータ +No Data +データなし + + +This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall. +このポータルを通ればノーマルルートに行けるよ。|チュートリアルを完了させてもここに着くよ。 +This is the alternate entrance to the ancient tombs.|It's harder than the normal entrance. +通常ルートとは違う道、古代の遺跡に続いているよ。|ノーマルルートよりも難しいみたいだね。 +This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random. +混沌の神が顕現したみたいだね。|通るエリアがランダムになるよ。 +Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure! +広大なジャングルの中に秘められた古代遺跡を探しに行こう!|カウボーイハットを被って宝探しだ! +You've gotten lost in an ancient doll processing facility.|This journey features mostly lategame tilesets. +古代の人形工場に続いているよ。|主にゲーム後半のエリアが出現するようになっているよ! +You've gotten lost inside an ancient temple to a kinky goddess.|Will you find your way out, or will you find yourself trapped even deeper? +古代の四大神を祀る神殿に迷い込んでしまった!|出口を見つけるのか、それともさらなる深みに沈んでいくのか、それは君次第だ。 +You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed! +廃墟の中をさまよい続け、道に迷ってしまった!|出現するエリアが通常ルートの逆になるよ! + + + (Hard) +(ハード) + (Extreme) +(エクストリーム) + + +Choose Save Slot: +セーブスロット: + + +Standard Route +通常ルート +Alternate Route +ハードルート +Temple Route +神殿ルート +Jungle Route +ジャングルルート +Factory Route +工場ルート +Reverse Route +逆さ道ルート +Chaos Route +ランダムルート +Map Seed: +Seed値: +Will Overwrite NME! +NME を上書きする? + + +Play Slot +プレイ スロット +Play (NO SLOT!) +セーブを選択してください + + +Looks like you might be stuck. Try calling for help (bottom right of UI) +どうしようもなくなったら、助けを呼んでみるといい。(UI右下のボタン) + + +Backup +バックアップ +Restore +復元 +### Extra Options + +### Preview without Armor + + + +### FLR-DGN + +### (NG+AMNT) + + + +Target must be vulnerable. +相手を弱体化状態にさせる必要がある。 +Target must be vulnerable or have casted a verbal spell. +相手が口を使用する魔法を唱えているか、弱体化状態にさせる必要がある。 +Target must have casted a verbal spell. +相手が口を使用する魔法を唱えている必要がある。 + + +Diggy diggy hole +穴掘り +Select a cracked wall. +ひび割れた壁を選択 +You strike the earth! +壁にツルハシを突き立てた! + + +Must select a cracked wall. +ひび割れた壁を選択する必要がある。 +Your arms aren't free to swing the axe! +腕が自由でないとツルハシは振るえない。 +You strike the earth, but it is nothing but solid wall on the other side. +壁にツルハシを突き立てるも、硬い岩盤に突き当たった。 +You strike the earth! It crumbles before you! +ツルハシを突き立てると、壁が崩れ去った! +### Click again to automatically mine the wall with your pickaxe. + +The planar focus resonates with the teleportation magic! +テレポーターがテレポート魔法と共鳴した! +The planar focusing crystal activates! Mana is drained, and turns into bindings! +テレポートクリスタルが起動するが、マナが漏れて拘束具に変化した! +The planar diffractor blocks the teleportation! +回析機がテレポートを阻害した! + + +Set Character Palette +パレットを選択 + + +Reset all Keybindings +キー設定をリセット + + +That item is blocked! You can't remove it. +取り除けない。 + + + min. +最小 + max. +最大 + bonus +ボーナス + penalty +ペナルティ + + +You put it on, why would you want to take it off?~ +わざわざ取り付けておいて、どうして今更外そうとするの? +You'll need an ancient key to unlock the ancient-made collar. +古代の拘束具を外すには古代の鍵が必要だ。 + + +Ancient Worshipper +古代文明の崇拝者 +The ancient worshipper repents of her ways. +古代文明の崇拝者は改心した。 +The ancient worshipper's crystal restraints spread to you! (+RestraintAdded) +古代文明の崇拝者の拘束具が伝播した! (+RestraintAdded) +Crystals start to grow on one of your restraints! (DamageTaken) +クリスタルが成長し、錠を形成した! (DamageTaken) +The ancient worshipper mumbles at you for assistance! (DamageTaken) +古代文明の崇拝者が救いを求め縋ってきた! (DamageTaken) + + +Ancient Congregant +古代文明の信徒 +The ancient congregant repents of her ways. +古代文明の信徒は改心した。 +The ancient congregant's crystal restraints spread to you! (+RestraintAdded) +古代文明の信徒の拘束具が伝播した (+RestraintAdded) +Crystals start to grow on your restraints! (DamageTaken) +クリスタルが成長し、錠を形成した! (DamageTaken) +The ancient congregant mumbles at you for assistance! (DamageTaken) +古代文明の信徒が救いを求め縋ってきた! (DamageTaken) + + +Ancient Hierophant +古代文明の教皇 +The ancient hierophant repents of her ways. +古代文明の教皇は改心した。 +The ancient hierophant's crystal restraints spread to you! (+RestraintAdded) +古代文明の教皇の拘束具が伝播した (+RestraintAdded) +The ancient hierophant mumbles at you for assistance! (DamageTaken) +古代文明の教皇が救いを求め縋ってきた! (DamageTaken) + + +The crystals break off, revealing a keyhole and weakening the item. +結晶が割れ、拘束具の鍵穴が露出した。 +Your distraction causes the crystals to grow back, encasing the lock again! +性欲を浴びてクリスタルが成長し、錠を再び覆ってしまった。 + + +After popping the gag out of your mouth, it hangs loose around your neck. +猿轡を外し、首にぶら下げた。 +The gag is now in your mouth. +猿轡を咥えた。 + + +ERROR: Restraint does not exist. Did you forget to load mods? +エラー:存在しない拘束具を確認。MODの読み込みを忘れていませんか? + + +Gag Necklace +猿轡のネックレス +A cute accessory for those who wish to (not) make a statement. +無口な人(あるいは真逆)の人のためのアクセサリー。 +Functions as a collar. +首輪としても機能する。 + + +No mod info! +MODの詳細情報なし +Wrong patch +誤ったMODです +VERY Outdated! +非常に古いMODです +Outdated! +古いMODです +Check dependencies! +依存先を確認 +Check compatibility! +互換性を確認 +Misc Error +その他のエラー +### v + +Magical disenchantment suspends your living collar for AMNT turns +魔法によって、 AMNT ターンの間生きている首輪を欺く。 + + +### (will add AMNT TPE binding) + +Hardlight +エネルギー +Knocked Out +気絶 +Vine +蔓 + + +Saving... +セーブ中・・・ +Game Saved +セーブ完了 + + +ENMY escapes from the ITMN! +ENMY が ITMN から抜け出した! +ENMY escapes from the ITMN and the item vanishes. +ENMY が召喚された ITMN から抜け出した! +ENMY unlocks the ITMN! +ENMY が ITMN を解錠した! +The conjured ITMN vanishes as it comes off. +召喚された ITMN は外れると同時に消え去った。 + + +AMNT restraints added since last tick~ +最後のティックから AMNT 個の拘束具を囚人に使ったよ。 +AMNT restraints confiscated since last tick~ +最後のティックから AMNT 個の拘束具を回収したよ。 +You have no restraints in storage. Go to the Summit to deposit restraints. +倉庫に拘束具がない。セーフゾーンに行って拘束具を預けてこよう。 + + +Back to Facilities +施設画面へ + + +Your Inventory +自身のインベントリ +Warden's Storage +看守長の倉庫 + + +Store 1 ITMN +ITMN を1つ預ける +Take 1 ITMN +ITMN を1つ取り出す +Store 5 ITMN +ITMN を5つ預ける +Take 5 ITMN +ITMN を5つ取り出す +Store ALL ITMN +ITMN を全て預ける +Take ALL ITMN +ITMN を全て取り出す +Store ALL-1 ITMN +ITMN を1つ除いて全て預ける +Take ALL-1 ITMN +ITMN を1つ除いて全て取り出す +Take Everything +全て取り出す +Deposit All +全て預ける + + +Auto-loot found +取得(自動ルート) + (not picked up) +(何も取得しなかった) + + +Automatically Flip When Moving +移動時に自動的に反転 + + +Go to the summit to deposit restraints +セーフゾーンで拘束具を預けよう。 + + +AMNTx damage when SP is over 50% +SPが50%以上の時、ダメージが AMNT 倍になる。 + + +Barrage of Barrier Orb +バリアオーブ乱れ撃ち +Barrier Orb +バリアオーブ +Barrage of Sealing Talisman +封印の御札乱れ撃ち +Self Unlock +アンロック +Crystal Storm +クリスタルストーム + + +Shadow Walk +シャドウウォーク + + +Your ITMN1 inflates inside your mouth to become a ITMN2! +ITMN1 が口の中で大きくなり、 ITMN2 に変化した! +Bigger Ball Gags +成長したボールギャグ +Smaller ball gags are replaced by their larger versions. +小さなボールギャグが成長した姿。 +Screen effect when letting go +絶頂時のエフェクト +Screen flash when distracted +発情時のエフェクト + + +Essentia Aliquam +エッセンティア・アリカム +Aliquam Orbis +アリカム・オービス +Potio Requiem +レクイエム・ポーション +Ultimate Glue no. 91 +アルティメット接着剤No.91 +Slime Encapsulation +スライム・カプセル +Judgement Bolt +ジャッジメント・ボルト +Flame Bolt +フレイム・ボルト +Electrification +エレクトリファイ +Charming Orb +チャーム・オーブ +Freezing Orb +フリーズ・オーブ +Heavy Ordnance +重火器 +Entangle +タングル +Blessed Orb +ブレスオーブ +Slimy Sphere +スライムスフィア +Rubberization Protocol +ラバー化プロトコル +Latex Encapsulation +ラテックス・カプセル +Red Slime Experiment +赤スライムの実験 +Encasement Protocol +完全拘束プロトコル +Electrical Discharge +エレクトリカル・ディスチャージ +Icebolt +アイスボルト +Bubble Burst +バブルバースト +Electric Orb +エレクトリック・オーブ +Chain Bolt +チェインボルト +Skeleton Minion +スケルトン・ミニオン +Skeleton Minions +スケルトン・ミニオンズ +Flummoxing Orb +フラモックス・オーブ +Crystallize +クリスタライズ +Capture Device +捕獲デバイス +Sedative +鎮静剤 +Slime Barrage +スライムバラージュ +Seal of the 5th Era +第五の時の封印 + + + + +Healing Flash +フラッシュヒール +Undead Frenzy +オコッタ +Command Word +コマンドワード +Rope Ambush +ロープ・アンブッシュ +Defensive Charm +守護符 +### Shield the Witch + +Tracer Rounds +トレース弾 +The Spookening +ビックリ +The Muffling +ツメモノ +Conjure Tickle Hands +サモン・ティクルハンズ +Conjure Gags +サモン・ボールギャグ +Scriptum Ferri +スクリプトゥム:フェリ +Scrimptum Habena +スクリプトゥム:ハヴェナ +Scriptum Ligni +スクリプトゥム:リーニ +Electric Storm +エレクトリック・ストーム +Flower Spores +フラワースポア +Magnum Opus +マグナム・オプス +Latex Integrator +ラテックス・インジェクター +Forcefield Protocol +フォースフィールド・プロトコル +Motivation +テンションアップ +Drone Assault +ドローン攻撃開始 +Tape Drone Assault +テープドローン攻撃開始 +*summon slime mold* +(粘菌召喚) +Vine Growth +ヴァイングロース +Flower Growth +フラワーグロース +Thorn Whip +ソーン・ウィップ +Crystal Surge +クリスタル・サージ +Shadow Shroud +シャドウシュラウド +Shadow Step +シャドウステップ +Ice Wall +アイスウォール +Armor Up +アーマーアップ +Crystal Growth +クリスタルグロース +Shadow Orb +シャドウオーブ +Earthfield +アースフィールド +Soul Beam +ソウルビーム +Summon Shadows +サモン・シャドウ +Observation +悪意の眼差し +Conjure Latex Restraint +ラテックス拘束具召喚 +Rope Sealing +シール・ロープ +Slime Minion +スライムミニオン +Magical Wrappings +マジカル・ラッピング +Capture Bolt +キャプチャーボルト +Training Protocol +トレーニング・プロトコル +Motivation Protocol +モチベーション・プロトコル +Conjure Tickle Hand +サモン・ティクルハンド +Conjure Locks +サモン・ロックズ +Chainstorm +チェーンストーム +Chain Wall +チェーンウォール +Binding Ribbons +リボンバインド +Scriptum Limus +スクリプトゥム:リムス +Scriptum Glacis +スクリプトゥム:グラシス +Scriptim Vinea +スクリプトゥム:ヴィネア +Scriptum Infernus +スクリプトゥム:インフェルヌス +Scriptum Arcanum +スクリプトゥム:アルケナム +Scriptum Celeste +スクリプトゥム:セレステ +Scriptum Electri +スクリプトゥム:エレクトリ +Blessed Rays +ブレス・レイ +Ghostly Pets +幽霊召喚 +Zombie Pets +ゾンビ召喚 +Drone Support +サポートドローン +Doll Training +ドール・トレーニング +Full Capture +フルキャプチャー +Shadow Hands +シャドウハンズ +Obsidian Orbs +オブシディアン・オーブ +Mithril Orbs +ミスリル・オーブ + + + + +(The Warden perks an eyebrow at the sight of you,|before a wide grin overtakes her face)|Ahhh Fuuka. Chosen by the Goddess?|How does it feel to once again be under a leash? +(看守長はこちらを見つめ、眉をひそめた後|ニヤリと笑った。)|あらあらフウカちゃん、女神のもとに下ったのね。|再び鎖をつけられた気分はどう? +Fuuka, take her down. +フウカ、やっておしまい。 +(Send Fuuka to fight her) +(フウカを戦わせる) +That is none of your business. Now kneel. +関係ないでしょ、あなたも捕まえるわ。 +(Fight without listening.) +(話を聞かずに戦う) + + +Blessed Hex +聖六面体 +Hexing Orb +ヘックスオーブ +Hexed Latex Engulf +ヘックス・ラテックス +Hex Binding +ヘックス・バインド + + +### Here you will find various scraps of documents and lore you've recovered throughout your adventures. + +### Your Journal + +### Cover + +### I am writing this journal in the off chance that I do not come return from the Agarthan ruins. If you find this, please make an effort to deliver it back to the surface for the good of all the women lured in by its secrets. + +### Catherine Willows' Journal (preface) + +### Willows 0 + +### As I scaled the mountain, I came across a massive graveyard above the treeline, a grand memorial to those who died before the Great Work. This graveyard extends into the mouth of the cave, and the guards told me not to deface any of the graves, or else the ghosts will come and get me. It would be easier to follow their instructions if there weren't so much treasure still hidden here! After all, most of us are deep in the red after sailing all this way. + +### Catherine Willows' Journal (pg. 7) + +### Willows 7 + +### It's hard to imagine I'm in a cave. Everything is so decorated and well-preserved, it's almost as if decades of adventurers never found their way to this island. In the distant future when every last piece of treasure has been hauled out of here, I imagine they'll set this place up as a tourist attraction. + +### Catherine Willows' Journal (pg. 8) + +### Willows 8 + +### I spoke with a few locals while resupplying at the port. Apparently the village up here is far older than the twenty-some years the Adventurer's Guild has been on the island. The locals call the mountain 'Ejahl,' but the consensus is that this is the site of the legendary city Agartha where the Archmagus herself made her discovery.|(The page is dated about fifty years ago) + +### Catherine Willows' Journal (pg. 14) + +### Willows 14 + +### I made it to a deeper floor today, and was greeted by a skeleton trying to tie me up. Great.|I've looked into the local name for this mountain, 'Ejahl,' and found a footnote in the history books talking about some petty kingdom that laid siege to Agartha. There's no record of them actually winning the siege, though. I've heard there's a massive library somewhere down here, maybe I'll find answers there. + +### Catherine Willows' Journal (pg. 17) + +### Willows 17 + +### There was a warrior in the catacombs today. She appears to have mastered the art of witty comebacks, as I truly could not come up with anything to say that did not further humiliate myself. Fortunately her insults came at her companions' expense, and they allowed me to defeat her in a solitary duel. + +### Catherine Willows' Journal (pg. 20) + +### Willows 20 + +### I almost found myself the recipient of a powerful binding arrow enchanted with force runes. Had I been hit, I would have been knocked back against the walls with my arms pinned by glowing conjured cuffs. Fortunately, this projectile hit a skeleton that was attacking me instead, and I was able to retreat. + +### Catherine Willows' Journal (pg. 21) + +### Willows 21 + +### In my travels I encountered a curious tomb filled with the scent of incense and herbs. Strange statues lined the halls on stone pedestals, standing as an intimidating reminder of what happens to those who disturb the locals...|I encountered resistance from the locals, who seemed to regard outsiders as 'cursed' and sought to capture me in an effort to give me a 'blessing.' I highly doubt that anyone has been truly blessed by their efforts, well-intentioned or not. + +### Catherine Willows' Journal (pg. 24) + +### Willows 24 + +### This 'blessing' of theirs appears to be an old ritual for immortality. I believe these peoples are older than the Great Work, based on the ancient dialect they speak and the outdated script they use.|Whatever the case may be, their method seems inexact and prone to failure, as demonstrated by their near maniacal devotion to 'bless' every adventurer they come across. + +### Catherine Willows' Journal (pg. 25) + +### Willows 25 + +### There are two 'castes' in the Bast cult. The first are the 'blessed,' and the second are their watchful guardians. The unintuitive bit is that the 'blessed' are the ones wrapped up and sealed away inside statues, sarcophagi, and anything else the guardians can stick a person into. The free ones wandering around grabbing people? They're the ones who weren't 'blessed' apparently. + +### Catherine Willows' Journal (pg. 26) + +### Willows 26 + +### I've found it! The Archmagus' library! Much to my chagrin, however, the place has been ransacked by witches and a curious group of mages in search of inspiration from ancient fashion choices. + +### Catherine Willows' Journal (pg. 30) + +### Willows 30 + +### It appears someone got to the Archmagus' writings before I could. Nonetheless, I will continue my search for Vinlaga's personal study. Perhaps her research materials and drafts might shed some light on my condition. + +### Catherine Willows' Journal (pg. 31) + +### Willows 31 + +### I have learned of an ancient artifact, called the Mistress' Staff. Its history and owner are hotly debated, with some attributing it to the Archmagus herself, while others say it was developed by the magical warlords that followed. Most all sources agree that its signature feature is the ability to reverse the effects of the Great Work on any person. + +### Catherine Willows' Journal (pg. 36) + +### Willows 33 + +### There is a treasure trove of ancient history here that the blasted Dressmakers had no use for. I found a map from the 'Kingdom of Ejahl,' with sketches of many islands including this one. Like most of the warlord states, they failed to make a lasting impact on the architecture of the island, but it appears the island was uninhabited for some time between the fall of Agartha and its resettlement by Ejahl. + +### Catherine Willows' Journal (pg. 41) + +### Willows 41 + +### ...I must find it.|They are looking for it.|They CANNOT be allowed to have it. + +### Catherine Willows' Journal (pg. 47) + +### Willows 37 + +### I saw my reflection in a pool of water today. My hair looked much more silver than I remember it. I hope this isn't a side effect of all the magic I'd used to make it to this point. + +### Catherine Willows' Journal (pg. 50) + +### Willows 50 + +### I heard the bandits are looking for the Mistress' Staff. I'm not too worried--they wouldn't know what to do with it. It's that damned witch I'm worried about.|If my astute reader has come this far, you should beware the Silver Witch. She is working with forces that cannot be trusted. + +### Catherine Willows' Journal (pg. 51) + +### Willows 51 + +### It seems I am not alone in my search for the Staff. To whom it may concern: the Great Work is a lie, and it will doom us all. If you care for your soul, you need to break the cycle, and for that we need a key: the Mistress' Staff. + +### Silver Witch's Notes #10 + +### Silver 10 + +### I met an adventurer who managed to erase weeks of golem research in the blink of an eye. This is why we Summoners have to scatter our works far and wide... if only they knew what we are working towards. + +### Silver Witch's Notes #2 + +### Silver 2 + +### The dimensional rift is especially active today. I spoke with some of the voices the other night, they offered me immortality in exchange for material wealth. They must have called the wrong universe or something... + +### Silver Witch's Notes #3 + +### Silver 3 + +### My new golem project did not go as expected. I'd expected the primordial one to answer once I'd opened the gate, but there was nothing but a horde of star demons which I quickly dispatched. Could this mean the source of primordial latex is not outside this universe, as I had thought, but inside? I must investigate further. + +### Silver Witch's Notes #18 + +### Silver 18 + +### She did it again. Barged in on my work and called me a 'purveyor of evil magics,' whatever that means. Magic isn't evil, it was given to us directly by the gods! At least I hid my new golem in a different study of mine... + +### Silver Witch's Notes #15 + +### Silver 15 + +### Throughout my studies I have chased after the existence of a being I call 'the Primordial One.' My theories stem from the following observations:|1)Slimes were not present in ancient history, and appeared during my lifetime as a force of nature.|2)Slime can be transmuted into almost any known material, like a Prima Materia of sorts.|3) A fragment of Sariel's notes, one of my most guarded possessions, discusses the existence of slimes long before they were first observed in the world.|Based on this, I believe the world must have been created through the influence of some primordial being who then left, but must be returning somehow.|I'm sure this being holds the key to repairing our bodies. + +### Silver Witch's Notes on the Primordial One + +### Silver 4 + +### Blast. An adventurer stole one of my notebooks, and now I'm encountering various cultists and weirdos trying to summon the Primordial One themselves. This is why I never bother to publish my works... + +### Silver Witch's Notes #7 + +### Silver 7 + +### I haven't heard of that adventurer in decades. Perhaps her nosiness finally caught up to her? + +### Silver Witch's Notes #106 + +### Silver 106 + +### There is a new presence in the mountain. An opportunist that calls herself 'the Dollmaker.' Claims to be the lost heir to the Kingdom of Ejahl. Please~.|I've seen those hackjobs and reprogrammed wrecks. If there even was a Kingdom of Ejahl, surely their army would consist of more than just scrapped combat drones? + +### Silver Witch's Notes #117 + +### Silver 117 + +### The Kingdom of Ejahl appeared in Agartha 170 years after the death of Sariel Vinlaga. It had three* rulers who vied for the throne at different times:|Diana, Princess of Machinery|Emer, the Warsage|And the Dollmaker, High General of the Kingdom||*Some manuscripts read 'two' + +### The Chronicles of Ejahl + +### Ejahl 1 + +### The Kingdom of Ejahl ruled the island of Agartha for 30 years before its collapse. During the last war, an unknown figure captured the majority of its army and the majority of the population fled by boat. No one was left on the island. + +### The Fall of Ejahl + +### Ejahl 2 + +### Danger Level: Nearly Harmless|A reanimated corpse from before the Great Work. I can't tell if the original soul still inhabits the body, since it can barely speak let alone explain its identity.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Normal|These zombies are more motivated than the others. Their behavior is similar to that of vengeful spirits I've encountered in the depths.||-Denizens of the Dungeon by Catherine Willows + +### Fast Z. + +### Danger Level: Normal|A zombie that can use magic. It doesn't look like any magic I've seen outside the ruins, which makes me think that it was taught to use magic. Some of them have tattoos associated with magic in the old times. Since magic comes from the soul, I assume there is some hint of the original soul still present.|-Denizens of the Dungeon by Catherine Willows + +### Mage Z. + +### Danger Level: High|A zombie with impeccable sword technique. I've never seen an undead handle a sword so smoothly. Probably buried with their weapons and gear, since most of it is aged. Even their binding techniques resemble those in the textbooks rather than modern ropework.||-Denizens of the Dungeon by Catherine Willows + +### Warrior Z. + +### Danger Level: High|A zombie that uses sealing charms and healing magic. Irony aside, I've seen these with rope marks and gag strap marks on their skin and face. It seems like someone is playing with them. Who could that be?||-Denizens of the Dungeon by Catherine Willows + +### Talisman Z. + +### Danger Level: Annoying|A playful spirit residing in the dungeon, taking advantage of any adventurers they come across. They can pass through walls, and most physical weapons go right through them. Using a magical weapon seems to banish them for some time, at least.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Very Annoying|It is said that ghosts are the spirits of pre-Great Work humans whose souls are bound to this world by unfinished dreams and ambitions. But I don't believe a word of that. These little guys care about nothing except humiliating people. Ask me how I know.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Medium|A very playful ghost with a penchant for teasing. It even carries spectral restraints of its own for use in 'games,' which tend to consist of tickling tied up girls.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Low|The feelings of a person who desired wealth in life. While it is unable to claim any physical wealth for itself, it nonetheless will rummage through your pockets and possessions if it gets a chance.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: High|A constricting mass of negative thoughts. According to local myths, the other ghosts attempt to cheer this one up by hugging it, but its wails end up attracting them to your position. Be prepared to take it down lest you find yourself a plaything for the beyond.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: High|While most wizards spend literal centuries mastering the art of magic, there are those lacking the patience or discipline to study magic the old fashioned way. Driven by a need for power, these individuals make contracts with otherworldly beings and become Witches.||-Denizens of the Dungeon by Catherine Willows + +### The Witches' Coven + +### Witches + +### Danger Level: Extreme|A witch gifted in the arts of conjuration. Backed by an army of animated spectral hands and devious tomes, this variety of witch is extremely dangerous. Her close range attacks are slow and unwieldy, but take care not to get surrounded.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: High|They appear to be influential figures in the ancient Bast cult. Not only are they able to wield explosive magics, they can conjure magical wrappings at close range.||-Denizens of the Dungeon by Catherine Willows + +### Bast Mummy + +### Danger Level: Medium|Worshippers of the Cat Goddess. Devoted to the sole task of defending the tombs from outsiders, they are rarely willing to negotiate. Some maintain peak physical prowess, while others can even cast spells.||-Denizens of the Dungeon by Catherine Willows + +### Bast Clerics + +### Rock-solid and form-fitting. + +### Provides minor protection against enemy attacks. Decreases stealth. + +### Adventuring Corset + +### Protects your organs and your sense of style. + +### Provides minor protection against enemy attacks at the cost of flexibility. + +### The best uniform. Has a (lockable) zipper in the back for convenience! + +### Removes excess clothing and adds +10 Evasion. +20 Soap and Glue resist, and being drenched dries faster. + +### Robe of Chastity + +A magical leotard whose power stems directly from the divine. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. +神々から力を授かるためのレオタード。この上に服を着ない限り、着用者の内に秘めた力を引き出す特性を持つ。 +### Chainmail Tank Top + +### Cumbersome, but effective! + +### Provides +10 armor and protection against enemy attacks. Decreases stealth/evasion and makes struggling harder. + +### Chainmail Bikini + +### Covers the important bits, anyway. + +### +20 Bondage Resist. Conducts electricity. + +### Light Plate Armor + +### Knight in shining rest-err, armor! + +### Provides +5 armor and high protection. No impact to stealth or evasion + +### Wizard's Robe + +### I have the power! + +### +30% spell damage and +10 spell ward + +### Chain Skirt + +### A defensive garment providing optimal coverage to the lower torso. + +### Provides medium protection. No impact to stealth or evasion + +### Armored Skirt + +### Gloves with an iron grip. + +### Provides +5 armor and minor protection against enemy attacks. Makes noise when attacking. + +### Leather Gloves + +### Protecting you in style. + +### Provides minor protection against enemy attacks. + +### Steel Pauldrons + +### Dependable protection for the average adventurer. + +### Ranger's Cape + +### Inbued with the powers of moss and ferns and stuff. + +### +25 Evasion. Increases stealth slightly. + +### Oracle's Armbands + +### Armbands made of a slightly magical material. + +### +5% spell damage. +5 Magic Armor. + +### Armored Boots + +### Noisy, but fashionable! + +### Provides +5 armor and protection against enemy attacks. Decreases stealth. + +### Hide Boots + +### For stepping into all kinds of trouble! + +### Generating Map... + +### Mystic wrappings constrict around your body! + +### You'll need a sharp object to cut items. Look for a knife or a piece of scrap on the floor. + +### If you can't get your knife into place, try sitting next to a crack on the wall. + +### Your character will automatically try to lodge the knife into the wall. + +### You'll need to find a cutting weapon with the magic tag to cut magic items. + +### You need to equip your magic cutting weapon to cut magic items. + +### You can surrender in the menu if you want to be treated more gently. + +### That ghost looks less aggressive than the others. Maybe she can help? + +### Need help? Try asking a neutral NPC for assistance! + +### You flanked the enemy! Now attack its weak point for massive damage! + +### Enemies that miss an attack become vulnerable for a turn. + +### Attack them for a guaranteed critical hit! + +### before the attack lands! You can tell the difference by the border of the tiles. + +### Enemy attacks take time to hit. Make sure to step out of the warning tiles, + +### You can dodge out of the way of most projectiles. Avoid the marked tiles. + +### 'Charge' is a unified ammunition for all of your weapons. Recharge it with ancient crystals. + +### Spent crystals can slot into some light fixtures to recharge them, but it requires 100 gold. + +### There is an elevator in this room, but it won't function until you defeat major enemies on this level. + +### If you can't escape from a restraint, try offering gold at a shrine devoted to its goddess. + +### Defeating enemies recovers some willpower. + +### Temporary enemies and summons don't restore anything, however. + +### Attacking a helpless enemy captures her and sends her to your Collection. + +### You can access the Collection in the Items screen, 2nd tab. + +### Conjure Essence Mote + +### Spend 50 DP to conjure a mote of pure spell essence. The mana cost of this spell is decreased based on your maximum DP.|Can only be cast while you have less than 100% DP. + +### You channel your distraction into a tangible orb! + +### You don't have enough distraction! + +### Choose an open space. + +### Choose a tile with no existing mote. + +### You're too distracted to concentrate your distraction! + +### The burst of desire overwhelms you! + +### Psychic Link + +### Deals 20 Psychic damage, then creates a psychic link between you and a single target for 50 turns, splitting distraction gain between the two of you. Requires that you and the target be able to see each other. + +### Target a non-blinded enemy. + +### You briefly lock eyes with the target, forming a psychic link! + +### The psychic link ends between you and the ENMY. + +### Shock Collar + +### Condense your aroused thoughts into stimulating electricity, consuming 30 DP to zap anyone that's currently holding your leash for 40 e-stim damage. 25% chance to stun for a long time, otherwise stuns briefly. Subsequent uses cost 2x the DP. + +### You must be leashed by someone to use this. + +### You don't have enough distraction. + +### You zap your leasher! + +### You are psychically connected! + +### You've used Shock Collar recently and it costs more DP. + + + +### Essence Crystal + +### When you miscast, 50% chance to emit a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. + +### A necklace designed for mages who are novices or easily distracted. It helps recover magical essence lost during miscast. + +### When you miscast, the necklace emits a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. + +### You erase the seal sigil. + +### You absorb the mote, granting miscast reduction. + +### Your necklace emits a mote as a result of miscasting. + +### Your distraction reaches a critical point! -100% miscast chance. + +### While at 100% distraction, you gain -100% miscast chance, but spending too much mana at once may cause you to go over the edge. + +### -100% miscast chance, but casting spells can send you over the edge. + +### The psychic link conducts away some of the intensity... + +### Your linked target lets go of herself, transmitting a wave of pleasure to yourself... + +### FCTN RMTPE + +### PTRN's RMTPE + +### Leads to PLCE + +### (You find a girl clad in a pink catsuit and restrained with straps.)|(She wears a backpack with a note attached to it.)|'My pet here can pick up and deliver restraints for you~'|'Try opening the Facilities tab and depositing restraints!'|'Signed: Your Loyal Warden' + +### It becomes hard to resist the dragon's fury... + +### The dragon overwhelms you with sheer force... + +### Your strength begins to fade... + +### >Entrance + +### >Exit + +### >Stairs + +### Quest(GDSNM) + +### [GDSNM] + + + +### Bed! + +### Silver + +### Mecha + +### chest + +### Lost Items + +### Cache + +### Toy Chest + +### (L) + + + +### (The SPEAKER sits encased in skintight rubber up to her nose.|Though the latex over her mouth is smooth and flat,|you know from her whimpering moans that her mouth|is totally filled with a gag, useless like the rest of her body.|Some sort of stand affixes her to the floor.) + +### (You don't have any solvents that work on latex) + +### (You dissolve her restraints, fumbling around for a while with your bound hands) + +### (You rescue the SPEAKER)|Thank you!|Let's get out of here! + +### (You rescue the SPEAKER)|Mmmmph!|(She wants to keep her gag...) + +### (You are not holding a cutting tool) + +### (You cut her restraints, fumbling around for a while with your bound hands) + +### (You don't have enough mana for Remove Slime) + +### (You utter a word of release to free the SPEAKER)|Many thanks!|Let's go! + +### (You utter a word of release to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) + +### Dissolve the latex with a SLVNT + +### Cut her out with a sharp tool + +### Use Remove Slime to unlock her + +### Local Saves + +### Cloud Saves + +### solvent + +### Latex Doll Stand + +### A stand for your latex dolls, coated in a smooth rubber coating. + +### Has a flange for propping up even dolls wearing chastity belts. + + + +### (The SPEAKER strokes a hand over your body)|It looks like you're carrying some dangerous goods.|Prisoners shouldn't be carrying what doesn't belong to them~ + +### (The SPEAKER folds her hands together)|Miss, I was instructed to make sure you don't have|anything dangerous. I'm going to search you now. + +### (The SPEAKER looks at you plainly)|Did you think you were going to sneak in with all of that? + +### (The SPEAKER smiles)|Let's see, what loot do we have here...|(SPEAKER is going to search you) + +### (The SPEAKER scans you with a red light)|Enumerating contraband...|Please comply for removal. + +### Yes, miss... (Begin search and confiscation) + +### Mmph... (Nod politely) (Begin search and confiscation) + +### No, I refuse! (Fight) + +### Mmph! (Shake your head and fight) + +### Option not available at 0 WP + +### (The SPEAKER starts by removing most of your clothes...) + +### (Next, the SPEAKER looks through your weapons) + +### (Finally, the SPEAKER opens the rest of your bag) + +### (The search is complete)|There! Now let's get you situated~ + +### (The search is complete)|Alright miss, please behave, okay? + + + +### Confiscated AMNTx ITMN! + +### Kept AMNTx ITMN. + +### Sneaked in AMNTx ITMN! + +### GUN + +### The room echoes with the sound of a rubber bullet being fired! + +### Tactical Rubber Bullet + +### A powerful rubber bullet bounces you to the ground! + +### The powerful rubber bullet knocks you down and congeals into Capture Foam! + + + +### Capture Foam (Feet) + +### A sticky foam that spreads quickly and hardens into a tight rubbery layer. + +### A knife won't cut it, it simply reforms around the cut. + +### Capture Foam (Ankles) + +### Capture Foam (Legs) + +### Capture Foam (Arms) + +### Capture Foam (Hands) + +### Capture Foam (Mouth) + +### Capture Foam (Head) + +### Capture Foam Dispenser + +### This collar is designed to make sure its wearer does not escape at all costs. + +### It will occasionally cause Capture Foam to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of Capture Foam you have on you. + + + +### Tactical Rubber + +### An alchemical substance made to be stretchy and more resilient than natural rubber. + +### Developed by kinky alchemists and marketed to PMCs across the islands. + +### Capture Foam + +### A restraining weapon used to apprehend difficult targets. + +### Tactical Rubber (Feet) + +### The end result of capture foam. Strict. Sustainable. Affordable. + +### Tactical Rubber (Ankles) + +### Tactical Rubber (Legs) + +### Tactical Rubber (Arms) + +### Tactical Rubber (Hands) + +### Tactical Rubber (Mouth) + +### Tactical Rubber (Head) + +### Tactical Rubber Collar + +### It will occasionally cause tactical rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. + + + +### Sweeping Strike + +### Headlong Rush + + + +### Maid Squire + +### Maid Knight + +### You humiliate the Maid Squire! + +### You defeat the Maid Knight! For now... she swears revenge. + +### The Squire zips you up in comfy leather gear! + +### The Maid Knight places you in strict bondage! + +### The Squire secures your restraints! + +### The Maid Knight secures your restraints! + +### The Squire dusts you with her duster plug. + +### The Maid Knight sweeps you with her cleaning halberd! + +### The EnemyName retreats! + +### The EnemyName manages to squirm out of sight! + + + +### servers humming... + +### bouncy noises + +### goopy noises + +### bubbling noise + +### rubber squeaking + +### blaring siren + +### You claim the Sweeper. + +### The Sweeper + +### Foe of the unclean. Bringer of neat and tidy workspaces. + +### Deals slash damage. Also deals 30 tickle damage in an area. Has a ranged attack. + +### Make a ranged attack with the Sweeper. + +### You claim the Persuader. + +### The Persuader + +### Military forces sought a solution with higher stopping power after the Great Work made brute force obsolete. Capture Foam rounds are now the standard. + +### Equipped with a duster plug, it deals tickle damage on melee. Can fire a high caliber rubber bullet to deal 80 glue damage from a distance. Takes 3 turns to reload. + +### Make a ranged attack with the Persuader for 25 charge. Deals 80 glue damage. + +### Persuader Round + +### You fire the Persuader! + +### Wait for current save to finish... + +### Please wait for save to finish... + +### Debug Defeat + +### You cast devastating ASCII glyphs! + +### Debug Bind + +### You cast bondage ASCII glyphs! + +### , Floor AMNT + +### Recolor + +### Only collect notable + +### Autorelease escaped + +### NME is not notable enough for your collection. + +### Auto-released NME due to Escape. + +### Your ITMN1 was cursed and transforms into a ITMN2! + +### Equipping Restraint... + +### Equipping Armor... + +### Using Consumable... + +### Struggling... + +### The ITMN1 is purified and returns to being a ITMN2! + +### Reverts if purified with item. + +### ...smaller than expected. + +### Comes with an artistic flair. + +### Set Pivot + +### Toggle click & drag + +### Settings + +### Scroll Controls: + +### Layer Text: diff --git a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_KR.txt b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_KR.txt index 408c1a969..082ab5b08 100644 --- a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_KR.txt +++ b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_KR.txt @@ -1,5 +1,5 @@ -Credits -크레딧 +### By Strait-Laced Games + Credits 크레딧 Patrons @@ -8,24 +8,15 @@ News and Updates 뉴스 및 업데이트 Support @ Patreon 후원 @ Patreon -Thank you to the following awesome people for supporting me at patreon.com/ada18980|cyberjoel|Samantha Lear|Kara|The-Fisher-King|selly-grim|Dex♪|Churro|Gamefan|Shogo|X27|Blox|Slacker|Nikos S.|WATA|Flame|Alexis Octavia|Finn|Dmitri S.|Noxgarm|Siegfried K.|Hellgete -Thank you to the following awesome people for supporting me at patreon.com/ada18980|cyberjoel|Samantha Lear|Kara|The-Fisher-King|selly-grim|Dex♪|Churro|Gamefan|Shogo|X27|Blox|Slacker|Nikos S.|WATA|Flame|Alexis Octavia|Finn|Dmitri S.|Noxgarm|Siegfried K.|Hellgete -|nuzzles|Rest|LoudestQuietPerson|Violet EverGardner|BoopleDoopleson|Dazman1234|linlizheng|Laioken|Mechio|Vikingberserker|PWMRM|devan|LukeB|atetete|Aussie895|0xA4C1B842|Rika|Physicsphail|Loony|Jeremy P.|ItsYahboi9 -|nuzzles|Rest|LoudestQuietPerson|Violet EverGardner|BoopleDoopleson|Dazman1234|linlizheng|Laioken|Mechio|Vikingberserker|PWMRM|devan|LukeB|atetete|Aussie895|0xA4C1B842|Rika|Physicsphail|Loony|Jeremy P.|ItsYahboi9 -|AlexisTheFlame|Chen Yu|Sinohisaki|nnm711|Ron lsrp|Miro|Anthony R.|John T.|Geng114514|塵狐|kamil|Iaysakuya|tsang|Somprad|Thatguu|damit damit|Victor|Hjake2|anton A.|Dakra|CuvyanTaylor| -|AlexisTheFlame|Chen Yu|Sinohisaki|nnm711|Ron lsrp|Miro|Anthony R.|John T.|Geng114514|塵狐|kamil|Iaysakuya|tsang|Somprad|Thatguu|damit damit|Victor|Hjake2|anton A.|Dakra|CuvyanTaylor| -|hanhan|The_rogue1|Tatsuya S.|James K.|Misa|eddy z.|theshrimpyone|Eislobo|OTKTamashii|Michael M.|Jose G.|Minescence|HanQing Z.|hanhan|Shakymunch|Crimson|Arentios|Vini J.|Treemen555|Lordfabricator|ML -|hanhan|The_rogue1|Tatsuya S.|James K.|Misa|eddy z.|theshrimpyone|Eislobo|OTKTamashii|Michael M.|Jose G.|Minescence|HanQing Z.|hanhan|Shakymunch|Crimson|Arentios|Vini J.|Treemen555|Lordfabricator|ML -Hannes|Isaiah L.|darklink11|Cerb|Diablo200 -Hannes|Isaiah L.|darklink11|Cerb|Diablo200 +### Thank you to the following awesome people for supporting me at patreon.com/ada18980 + Back 이전 Next 다음 -Music: kocaeli|Bound enemy graphics: Song|CN Translation: Alexthymia|Code Contributors: Ellie, Demopans, Aelie|Audio:|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi|Door locked.wav - mitchanary - Modified -Music: kocaeli|Bound enemy graphics: Song|CN Translation: Alexthymia|Code Contributors: Ellie, Demopans, Aelie|Audio:|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi|Door locked.wav - mitchanary - Modified -Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators -Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators +### Music: kocaeli, Darkstar Studios|Bound enemy graphics: Song|RU Translation: Osiris|CN Translation: Alexthymia, Mitki, Timeline|KR, JP Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Art: Kjus, Quakehoof, Lumpychan, Kertasu, Koirin, Lightning Rook, Daikinbakuju, Sigma Overlord, dask3|Plasmadragon, GoldieKitsune, SMoonlightM, PureWind, Wyatt Wintersoul|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi + +### Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|AlaskaRobotics - duct tape unroll 3, duct tape unroll 1|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators Language 언어 @@ -35,35 +26,217 @@ Chinese 중국어 Korean 한국어 +### Japanese + +### Spanish + +### French + +### Russian + Mods 모드 Mods Loaded. 모드가 로드되었습니다. -Kinky Dungeon v3.9 -Kinky Dungeon v3.9 + +### Version + +### Kinky Dungeon + +### By Ada18980 + You are an adventurer descending into an ancient underground city of magic. 당신은 마법의 고대 지하 도시로 내려가는 모험가입니다. Beneath its depths lies the Mistress' Staff, an artifact of untold power. 깊은 아래에는 헤아릴 수 없는 힘의 유물인 여주인의 지팡이가 있습니다. Will you prevail against forces unknown, or succumb to its dark secrets? 미지의 세력에 맞서 승리할 것인가, 아니면 어둠의 비밀에 굴복할 것인가? -(This game does not contain spiders or any carnivorous creatures/plants) -(이 게임에는 거미나 육식성 생물/식물이 포함되어 있지 않습니다) -(Check out the latest standalone version at the News and Updates link below!) -(아래 뉴스 및 업데이트 링크에서 최신 독립 실행형 버전을 확인하세요!) -Enable Sounds -소리 활성화 -Enable Drool/Tears -침/눈물 활성화 +### (This game does not contain spiders) + +### GFX + +### Character + +### Main + +### UI + +### Controls + +### Keybindings + +### Show Enemy Binding as % + +### Auto-wait Through Delayed Actions + +### Show Minimap Labels + +### Auto loot all from chests + +### Use Palette regardless of Outfit + +### Apply palettes to Restraints + +### Apply palettes to transforms + +### Don't use character palette + +### Always use character palette + +### Use character palette for default outfit + +### Show Background Art + +### Experimental Rendering (unstable) + +### Mute when Minimized + +### Show DP instead of % + +### Quick Inv only equips to self + +### Override Outfit when Loading Save + +### Save Outfits within Save Files + +### Show free characters on map + +### Detailed jailed NPCs (experimental) + +### Show Struggle Bars + +### Allow Suspicious Mods + +### Auto Load Mods (offline only) + +### Classic Inventory Background + +### Skip Intro + +### No Forced Greetings + +### Show Zoom Buttons + +### Show Restraint Info on Escape Hover + +### Always Show Warnings + +### Always Show Minimap + +### Enable Sound + +### Drool/Tears + Draw Armor 갑옷 그리기 +### Enable Music + +### Async Rendering (beta) + +### Bloom & Glow + +### Transparent UI + +### Turn Counter + +### Flash Screen on Stun + +### Map Particles + +### Distraction Particles + +### Vibration Particles + +### Gag Particle FX + +### Show NPC Status + +### Show Spell Range + +### Trim Edge Walls + +### Fog Shader + +### Light Shader + +### Intense 'Let Go' VFX + +### Enable Toy SFX + Enable Fullscreen 전체 화면 활성화 +### Hi-Res Distortion (Needs Restart) + +### Hi-Res Model (no restart needed) + High Quality Animations 고품질 애니메이션 -Wait Quickly -잠깐 기다려 +### Enemy Animations + +### One-Click Move (when slowed) + +### Latch Shift Key + +### Crotch Rope under panties + +### Chastity over Panties + +### Chastity over Harness + +### Chastity Bra over Bras + +### Simple Color Picker + +### Center Player + +### Draw Buffs on Side + +### Show Trajectory on Auto-Path + +### Show Player Facing + +### Show more learnable spells + +### Show Player Buff Auras + +### Show Enemy Buff Auras + +### Minimalist Enemy Auras + +### Pixelated GFX (needs restart) + +### Auto-Crouch when Tripped + +### Retro Animations + +### Flip Status Bars + +### Reduce Accidental Wall Clicks + +### Enable Nipples + +### Show Nipple Toys Over Bras + +### Hide Nipple Clamps + +### Hide Nipple Piercings + +### Use default palette when no outfit is worn + +### Flip Player Display + +### Grayscale when Blind + +### Faster Floater Fade + +### No Damage Floaters + +### Dynamic Armor (must hide armor) + +### Hide floating weapon display + +### Automatically Take All from Chests Helpless! 무력화! @@ -71,18 +244,31 @@ Evaded! 회피! Blocked! 차단! -Blocked restraint! -구속 차단! +### Resisted Bondage! You bump into a wall. 당신은 벽에 부딪힙니다. + +### Game Resolution: + +### Resolution (needs reload): + Toy Volume: 장난감 볼륨: Music Volume: 음악 볼륨: -Animation Speed: -애니메이션 속도: +### SFX Volume: + +### Animation Time: + +### Map Brightness: + +### Game Font: + +### Button Font: + +### Journey Select a journey. This will determine the ordering of game areas. 여정을 선택하세요. 게임 영역의 순서가 결정됩니다. @@ -93,26 +279,28 @@ Random: A chaotic journey Harder: A more difficult journey 하드: 더 어려운 여정 + Select perks to start with. 시작할때 함께할 특전을 선택하세요. Having 10+ spare points will trigger Hard Mode, granting unique loot. 예비 포인트가 10개 이상 있으면 하드 모드가 시작되어 고유한 전리품을 얻을 수 있습니다. - (HARD MODE ENABLED) - (하드 모드 활성화됨) +### (HARD MODE ENABLED) + Advanced start (choose perks) 고급 시작(특전 선택) -Confirm and start playing! -확인하고 게임을 시작하세요! +### Kinky start + +### Normal start Point Cost: AMOUNT 포인트 비용: AMOUNT Points Available: AMOUNT 사용 가능한 포인트: AMOUNT + Resilient Foes 회복력 있는 적들 -Enemies take 30% less damage. -적이 받는 피해가 30% 감소합니다. +### Enemies have 30% more hp. Strong 강인함 @@ -123,6 +311,7 @@ Helpless You are physically weak. Struggling is much less effective. 당신은 육체적으로 약합니다. 투쟁은 훨씬 덜 효과적입니다. + Flexible 유연함 Slightly boosts the Remove/Unlock option, escaping is 1.5x as fast except picking, and your feet can use items/buckles. @@ -132,6 +321,7 @@ Inflexible You get a penalty to the Remove and Unlock action, and escaping is 0.75x as fast. 제거 및 잠금 해제 작업에 대한 페널티를 받고 탈출이 0.75배 빠릅니다. + Locksmith 자물쇠 장인 You get a bonus to lockpicking, allowing you to pick some high-security locks previously impossible. @@ -141,6 +331,7 @@ Clueless You have no idea how to pick locks. Picking is 0.5x as fast and you can't pick most advanced locks. 당신은 어떻게 자물쇠를 따는지 모릅니다. 따기는 0.5배속이 되며 대부분의 고급 자물쇠를 딸 수 없습니다. + Psychic 초능력 You no longer drop keys and picks, can unlock yourself with bound hands, and don't need hands for items/potions. @@ -150,14 +341,14 @@ Novice All spells above 1st level cost 2x as many spell points. 1레벨 이상의 모든 주문은 주문 포인트의 2배가 필요합니다. + Blessed 축복받음 You can drink mana from the shrine fountains once per floor without chance of punishment. 처벌의 기회 없이 한 층에 한 번 신사 분수에서 마나를 마실 수 있습니다. Cursed 저주받음 -Goddess reputations start at 0 and can never exceed 25. -여신 평판은 0부터 시작하여 25를 초과할 수 없습니다. +### Goddess reputations can never exceed 25. Submissive 순종적임 @@ -168,15 +359,17 @@ Wanted Your security level starts at 100 and cannot go below 70. 당신의 보안 수준은 100에서 시작하며 70 아래로 내려갈 수 없습니다. + Studious 신중함 -You start the game with +3 additional spell points. -+3 추가 주문 포인트로 게임을 시작합니다. +### You start the game with +1 spell point. Your first two spell categories are free. + Meditation 심사 숙고 You slowly regenerate mana, up to a maximum of 50. 천천히 마나를 최대 50까지 재생합니다. + Willpower 의지력 -50% stamina drain from being at high arousal. @@ -186,28 +379,59 @@ Bondage Lover Attempting to escape arouses you. 탈출을 시도할 때마다 흥분합니다. + Focused Dodge 집중 회피 -While your miscast chance is 0%, your base evasion is 25% (multiplicative). -미스캐스팅 확률이 0% 라면 회피율이 25% 증가합니다(곱연산). +### While your miscast chance is 0%, you gain +40 Evasion. + Distracted 산만함 +15% miscast chance (at all times) 미스캐스팅 확률 +15%(합연산) + Brawler 싸움꾼 -Unarmed attacks deal +10 damage. -비무장 상태에서 공격시 +10 의 추가 피해를 입힙니다. +### Unarmed attacks deal +10 damage and being bound does not decrease unarmed damage. + +### Way of the Squish + +### Unarmed attacks deal grope damage against humans. + +### Way of the Spank + +### Unarmed attacks deal pain damage against humans. + +### Way of the Feather + +### Unarmed attacks deal tickle damage against humans. + +### Harmless + +### Unarmed attacks deal half damage and cost 2x as much stamina. + + + Clumsy 어설픔 -0.7x melee hit chance -근접 공격 명중률이 0.7배가 됩니다. +### 0.7x base accuracy + +### Unfocused + +### Accuracy multiplied by 0.9x above 10% distraction, down to 0.6x at 90% distraction. + +### Focused Strikes + +### 90% less accuracy penalty on swung weapons due to distraction. + +### Focused Power + +### 90% less stamina cost penalty on staves and similar weapons distraction. Pristine 깨끗한 -There are no shiny loot objects in the dungeon. -던전에서 반짝이는 전리품이 등장하지 않습니다. +### There are significantly less shiny loot objects in the dungeon. + Lost Technology 잃어버린 기술 Ancient power cores break with use, and cannot be recharged. @@ -223,10 +447,10 @@ Damsel in Chains Metal restraints are harder to escape from. 금속 구속은 탈출하기가 더 어렵습니다. + Forgetful 잊기 쉬운 -You don't remember where you've been in the level. -당신은 당신이 레벨에서 어디에 있었는지 기억하지 못합니다. +### You don't remember where you've been in the level. 30 turn timer. Cursed Locks 저주받은 자물쇠 @@ -242,8 +466,7 @@ Born with an intense submissive desire, you cannot refuse bondage from dialogues Frantic Struggle 광란의 투쟁 -Your struggling is 3 times as fast, but less efficient in terms of stamina. -몸부림이 3배 빠르지만 스태미너 효율은 떨어집니다. +### Your escaping is 3 times as fast, but less efficient in terms of stamina. Escape Artist 탈출 아티스트 @@ -254,6 +477,7 @@ Rope Bunny Rope restraints are harder to escape from. 로프 구속으로부터 탈출하기가 더 어렵습니다. + Slippery 미끄러운 Start with high Latex reputation, and all latex restraints are easier to escape from. @@ -263,10 +487,6 @@ Latex Doll Latex restraints are harder to escape from. 라텍스 구속으로부터 탈출하기가 더 어렵습니다. -Hogtied! -사지 구속! -Start the game trussed up in tight ropes. -팽팽한 밧줄로 묶인 상태로 게임을 시작합니다. Escapee 탈출자 @@ -277,6 +497,7 @@ Leather-Bound Leather restraints are harder to escape from. 가죽 구속으로부터 탈출하기가 더 어렵습니다. + Slayer 살해자 You can cast Elemental spells without having the components, at twice the cost. Start w/ Firebolt. @@ -290,15 +511,33 @@ Magician You can cast Illusion spells without having the components, at twice the cost. Start w/ Shadow Dagger. 구성 요소가 없어도 두 배의 비용으로 일루젼 주문을 시전할 수 있습니다. Shadow Dagger w/ 로 시작하십시오. + Narcoleptic 기면증 You slowly lose stamina over time. 시간이 지남에 따라 천천히 스태미나를 잃습니다. + Stealth Mission 스텔스 미션 -You are harder to detect and there are more chests, but enemies take 30% less damage, are more evasive, and drop no gold. -적에게 잘 감지당하지 않고 상자가 더 많지만 적이 받는 피해가 30% 감소하고, 적의 회피율이 증가하며, 금화를 떨어뜨리지 않습니다. +### You are harder to detect and there are more chests, but enemies have 50% more HP, are more evasive, and drop no gold. + +### Edging Lovers + +### All humanoids that can bind you also apply edging toys. + +### Denial Lovers + +### All humanoids that can bind you also apply denial toys. + +### Pleasure Lovers + +### All humanoids that can bind you also apply pleasurable toys. + +### Teasing Lovers + +### All humanoids that can bind you also apply teasing toys. + Latex Lovers 라텍스 애호가들 All humanoids that can bind you also apply latex restraints. @@ -332,14 +571,14 @@ Conspicuous Enemies detect you more easily. 적들이 당신을 더 쉽게 감지합니다. + Bound Power 바운드 파워 Your damage and evasion increases based on the number of restraints worn, up to +40% when thoroughly bound. 피해와 회피는 착용한 구속의 수에 따라 증가하며, 완전히 구속되면 최대 +40%까지 증가합니다. Kill Squad 킬 스쿼드 -Enemies see you through walls and at greater distance. -적들은 벽을 넘어 더 먼 거리에서 당신을 봅니다. +### Enemies gain increased blindsight and vision radius. Supermarket 슈퍼마켓 @@ -350,6 +589,7 @@ Price Gouging Items are 5x as expensive in the shop. 아이템은 상점에서 5배 더 비쌉니다. + High Security 높은 보안 Picks are weaker, and randomly generated locks are harsher. @@ -367,19 +607,32 @@ Search Party More enemies spawn during sleep. 수면 중에 더 많은 적이 생성됩니다. + No Way Out 도망칠 수 없어 -Enemies will always use the tightest restraints possible and fully bind you. -적들은 항상 가능한 한 가장 엄격한 구속을 사용하고 당신을 완전히 묶을 것입니다. -Graceful Walk -우아한 산책 -You don't lose stamina when walking with one slowing item, unless it binds your legs together. -다리를 묶지 않는 한 둔화 아이템 하나로 걸을 때 스태미나을 잃지 않습니다. +### Enemies will always use the tightest restraints possible regardless of willpower. +10 Security level. + +### Deft Footwork + +### You ignore some consequences of being mildly slowed from heels or slime, and you can cast Leg spells while slowed significantly at 50% miscast chance. + +### Poor Form + +### Slowing effects on you are amplified. + +### Poor Coordination + +### You must have both fingers and arms free to cast arm spells. Hand restraints are more effective on you. + +### Deft Fingering + +### You can cast arm spells using just your fingers, as long as your hands aren't bound. + + Well-Equipped 잘 갖춰짐 -Restraints and traps that are limited by level appear sooner, and enemies will stack many restraints. -레벨 제한이 있는 구속과 ​​함정이 더 빨리 나타나고 적들은 많은 구속을 쌓을 것입니다. +### Restraints and traps that are limited by level appear sooner, and enemies stack more restraints in general. +10 security level. Quick-Draw 퀵 드로우 @@ -390,6 +643,7 @@ Quick-Scribe Switching spells and casting from spellbook does not take a turn. 주문을 전환하고 주문서를 시전하는 것에 턴이 소모되지 않습니다. + Disorganized 무질서한 Switching weapons, learning/choosing spells, and casting from spellbook takes 3 turns. @@ -399,11 +653,25 @@ Savour the Taste Drinking a potion takes 2 turns 포션을 마시는 데 2턴이 걸린다 + Magic Hands 마법의 손 Enemies can add restraints underneath existing restraints. 적들은 기존 구속 아래에 구속을 추가할 수 있습니다. + +### Fully Integrated + +### Start with your body sealed in an adhesive layer of latex. + +### Doll Processing + +### Start atop a conveyor on your way to be sealed away inside the Facility. + +### Cyber Doll + +### Start in full Cyber restraints. + Fuuka's Pet 후우카의 애완동물 Start with Fuuka's collar and a few restraints. @@ -412,6 +680,33 @@ Fuuka Fan Club 후우카 팬클럽 All humanoids that can bind you also apply Fuuka's special restraints. 당신을 구속할 수 있는 모든 인간형 적이 후우카의 특별한 구속을 사용합니다. +### Collected + +### Start with The Warden's special belt which punishes you for defiling spell orbs. + +### Enforcers + +### All humanoids that can bind you also apply The Warden's cuffs. + +### Dollmaker's Minions + +### All humanoids that can bind you also apply Cyber Doll restraints. + +### Doll Hunter V + +### You start with the Dollmaker's Visor. + +### Doll Hunter M + +### You start with the Dollmaker's Mask. + +### Persisting Desires + +### Your dark desires are endless. + +### Sugar Rush + +### Consuming sweets makes you hyperactive, decreasing stamina costs and granting free moves. Vengeance 복수 @@ -430,48 +725,90 @@ Absolute Focus Miscast chance is doubled. 미스캐스트 확률이 2배가 됩니다. + Bound Crusader 바운드 크루세이더 -Goddesses will expect you to wear their restraints as their champion. -여신들은 당신이 그들의 투사로서 그들의 구속을 착용하기를 기대할 것입니다. +### Goddesses will equip restraints upon acceptance of a quest. Nowhere is Safe 안전한 곳은 없다 Beds and furniture are often trapped. 침대와 가구는 종종 함정이 됩니다. + +### Quakehoof Associate + +### Start with the Epsilon Collar, which regenerates mana when you play with yourself. + +### Epsilon Collar + +### A collar reserved for the most prestigious of submissives. + +### Restores mana when you play with yourself, but increases the distraction given. Only works when Desire is below the limit. + + + +### Bullet Hell + +### Hides warning lines for non-AoE bullets and projectiles. + +### Bullet Armageddon + +### Hides warning lines for AoE spells, bullets, and projectiles. + I have... needs 나는... 욕구가 있다 Distraction builds up over time. 산만함은 시간이 지남에 따라 쌓입니다. + Hopeless 절망적임 Willpower decays over time. 의지력은 시간이 지남에 따라 쇠퇴합니다. + Quickness 민첩 Grants Quickness after not moving for 4 turns. Quickness lets you move 1 space without ticking the clock. 4턴 동안 움직이지 않으면 순발력을 얻습니다. 순발력을 사용하면 시간을 재지 않고 1칸 이동할 수 있습니다. + +### Expansive Halls + +### Increases the size of maps by 3 in the long dimension. Maps will be less dense. + +### Gargantuan Halls + +### Increases the size of maps by 6 in the long dimension. Maps will have a mix of tunnels and dead ends. + +### Labyrinthine Halls + +### Increases the size of maps by 9 in the long dimension. Maps will be mostly tunnels. + +### Absurdly Huge Maps + +### (Experimental) Make the maps really really big. Probably breaks the game. + Rigger 리거 -Chain and glue damage increased by 20%. Binding on enemies is 30% stronger. -체인 및 글루 데미지 20% 증가. 적에 대한 바인딩이 30% 강해짐. +### Binding on enemies is 30% stronger. + Pacifist 평화주의자 -All non-glue, non-chain, or non-teasing damage dealt to humanoid enemies is reduced by 90%. -인간형 적에게 가해지는 모든 비접착제, 비사슬 또는 비괴롭힘 피해가 90% 감소합니다. +### All damage dealt to humanoid enemies is reduced by 90% except teasing damage and pain/grope/tickle/charm/psychic/chain/glue. + +### Curse Seeker + +### When you pick up cursed armor or restraints from chests, they equip automatically if able. Burning Desire 불타는 욕망 -While above 70% distraction, you ignite nearby objects and gain +40% fire damage. -산만도가 70% 이상일 때 주변 물체에 불을 붙이고 화염 피해를 +40% 얻습니다. +### While above 70% distraction, you ignite nearby objects and gain +25% fire damage. + Frigid Personality 냉담한 성격 -While at 0% distraction, you gain +10% ice damage and can walk on ice without penalties. -산만함이 0%일 때 +10%의 얼음 피해를 얻고 페널티 없이 얼음 위를 걸을 수 있습니다. +### While below 10% distraction, you gain +10% ice damage and can walk on ice without penalties. Grounded in Reality 현실에 근거 @@ -479,17 +816,15 @@ While at max mana, your attacks deal an additional 30% of their base damage as e 마나가 최대일 때 공격이 기본 피해의 30%를 전기 피해로 추가로 입힙니다. Like the Wind 바람처럼 -While above 95% stamina, you gain +30% evasion and your slow level is reduced by 1. -스태미나 95% 이상일 때 회피율이 30% 증가하고 슬로우 레벨이 1 감소합니다. +### While above 95% stamina, you gain +30 Evasion and your slow level is reduced by 1. Immovable Object 움직일 수 없는 물체 -While above 90% willpower, you gain +150 Restraint Block and Earth buff spells cost half mana. -의지력이 90% 이상인 동안 구속 차단 +150을 얻고 대지 버프 주문은 절반의 마나를 소모합니다. +### While above 90% willpower, you gain +150 Bondage Resist and Earth buff spells cost half mana. + Path of Least Resistance 최소 저항의 길 -While at 0 willpower, you gain +35% evasion and deal 20% of your max willpower as acid damage when restrained. -의지력이 0일 때 구속 시 +35% 회피를 얻고 최대 의지력의 20%를 산성 피해로 입힙니다. +### While at 0 WP, you gain +35 Evasion and deal 20% of your max WP as soap damage when enemies restrain you. Sticky Situation 딱딱한 상황 @@ -502,10 +837,10 @@ Taking chain, poison, and crush damage makes you dizzy. + Kinky Prisoner 변태 죄수 -Guards never remove restraints you are already wearing, unless they are applying something tighter. -경비원은 더 강한 구속을 착용시키는 게 아니면 이미 착용하고 있는 구속을 제거하지 않습니다. +### Guards won't remove restraints unless they have something tighter. +10 Security level. Unfair Doors 불공평한 문 @@ -526,6 +861,7 @@ You grab the doorknob with your wrists and flex it open. You use your flexible feet to open the door. 유연한 발을 사용하여 문을 엽니다. + Poor Technique 부실한 기술 Instead of fizzling, most miscasted projectiles and AoE spells will target you instead. @@ -536,15 +872,13 @@ Instead of fizzling, most miscasted projectiles and AoE spells will target you i - Ticklish 간지럼을 잘탐 You take 50% more tickle damage. 50% 간지럼 피해를 더 받습니다. Stoic 금욕 주의자 -You gain 82% tickle resist. -간지럼 저항이 82% 증가합니다. +### You gain +82 tickle resist. Lascivious 음탕함 @@ -552,8 +886,7 @@ You take 50% more grope damage. 더듬이 피해를 50% 더 받습니다. Unperturbed 침착함 -You gain 82% grope resist. -82% 더듬기 저항을 얻습니다. +### You gain +82 grope resist. Masochist 마조히스트 @@ -561,61 +894,202 @@ Pain is strongly arousing. 고통이 흥분을 유발합니다. Pain Tolerance 통증 내성 -You gain 200% pain resist. -통증 저항이 200% 증가합니다. +### You gain +200 pain resist. Fashionable 유행 When you are jailed, you keep your outfit. 감옥에 갇혔을 때 옷은 그대로 둔다. + Futile Struggles 쓸데없는 투쟁 Lose 2 WP every time you remove a non-trivial restraint. 사소하지 않은 구속을 제거할 때마다 2 WP를 잃습니다. + + Second Wind 세컨드 윈드 -Gain 2 WP every time you remove a non-trivial restraint. -사소하지 않은 구속을 제거할 때마다 2 WP를 얻습니다. +### Regenerate WP when unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, gag, or slows. (Upgrade available in spell tree) +### Second Wind Perk -Dominant -우성 -They're trapped here with you. Ghosts are more helpful, and you can bind enemies that confront you about bondage. -그들은 당신과 함께 여기에 갇혀 있습니다. 유령이 더 도움이 되고 당신은 속박에 대해 당신과 맞서는 적을 묶을 수 있습니다. +### Regenerate WP when you are unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, or gag bondage, and no slows. -Stranger -낯선 사람 -Randomizes your relationship to most factions. -대부분의 파벌과의 관계를 무작위로 지정합니다. -Wrong Neighborhood -잘못된 이웃 -All factions are hostile and united against you. -모든 파벌이 당신에게 적대적이며 단합되어 있습니다. +### Triumphant Wind -Trespasser -불법 침입자 -You lose reputation with the goddesses every time you advance a floor. -한 층 올라갈 때마다 여신들 사이에서 명성을 잃습니다. +### Second Wind now regenerates up to 25% of your max WP -Prisoner -죄인 -Start the game as a submissive prisoner wandering the halls. -복도를 배회하는 순종적인 죄수로 게임을 시작하십시오. +### Mental Defiance -Rusty Bolts -녹슨 볼트 -Most traps have a 25% misfire chance. -대부분의 함정은 25%의 확률로 불발합니다. +### Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While below 25% WP, quickly convert 'Defiance' into WP. -Unmasked -마스크 해제 -Hoods and full-face covering masks do not appear, but blindfolds are more powerful. -후드와 전면 가리는 마스크는 나오지 않지만 눈가리개가 더 강력해집니다. -No Nurses -간호사는 없다 +### Mental Fortitude + +### Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While above 75% WP but below 100%, quickly convert 'Defiance' into WP. Exclusive with Mental Defiance. + + + +### Locked Up + +### While wearing a chastity belt, your Desire lowers when you perform actions such as defeating enemies, opening chests, and breaking orbs. (Upgrades available in spell tree) + +### Locked Up Perk + +### While wearing a chastity belt, your Desire lowers when you perform actions such as capturing, opening chests, and breaking orbs. + +### Controlled Urges + +### Locked Up is 150% effective. Gain +70 psychic/charm resist from a chastity belt and +30 from a chastity bra. While not wearing a chastity belt, your Desire increases slowly. + +### Ready for Training + +### Locked Up is 200% effective. +25% stamina regen per 100 current DP. Playing with yourself is less effective while vibrators are off or set to edge. Slow level is increased by 1 when you aren't wearing any chastity. + +### Efficient Denial + +### Locked Up is 300% effective. When Locked Up triggers, you gain -30% mana costs and +25% physical damage for 7 turns (35 when opening a chest or breaking orbs). You cannot orgasm unless you are wearing a chastity belt, and slow level is increased by 2. + +### Recalcitrant + +### Relinquish the Locked Up perk. One time only. If you take the perk again, there is no going back. + +### Novice Pet + +### You can now sprint while wearing a petsuit. (Upgrades available in spell tree) + +### Novice Pet Training + +### You can now sprint while wearing a petsuit. + +### Eager Pet + +### +1 slow reduction while wearing a petsuit, but sprint costs are increased by 30% when not wearing a petsuit. + +### Experienced Pet + +### +2 slow reduction total while wearing a petsuit (from +1), but sprint costs are increased by 100% (from 30%) when not wearing a petsuit and slow level is increased by +1. + +### Devoted Pet + +### +3 slow reduction total while wearing a petsuit (from +2), but you cannot sprint (from +100% cost) when not wearing a petsuit and slow level is increased by +2 (from +1). + +### Bad Pet + +### Relinquish the Novice Pet perk. One time only. If you take the perk again, there is no going back. + +### You are an expert in wearing a petsuit and your mobility is increased. + +### You are too used to wearing petsuits! Sprinting is impaired. + +### You are a disobedient pet. You should put on a petsuit! + +Dominant +우성 +They're trapped here with you. Ghosts are more helpful, and you can bind enemies that confront you about bondage. +그들은 당신과 함께 여기에 갇혀 있습니다. 유령이 더 도움이 되고 당신은 속박에 대해 당신과 맞서는 적을 묶을 수 있습니다. + + +Stranger +낯선 사람 +Randomizes your relationship to most factions. +대부분의 파벌과의 관계를 무작위로 지정합니다. +Wrong Neighborhood +잘못된 이웃 +All factions are hostile and united against you. +모든 파벌이 당신에게 적대적이며 단합되어 있습니다. +Bandit +적기 +### Start friendly to bandits, and hostile to most other factions. + +Trespasser +불법 침입자 +You lose reputation with the goddesses every time you advance a floor. +한 층 올라갈 때마다 여신들 사이에서 명성을 잃습니다. + + +Prisoner +죄인 +Start the game as a submissive prisoner wandering the halls. +복도를 배회하는 순종적인 죄수로 게임을 시작하십시오. + + +Rusty Bolts +녹슨 볼트 +### Most traps have a 25% misfire chance each time you step on them. + +### Not a Pet + +### Petsuits occur less often. + +Unmasked +마스크 해제 +### Hoods and full-face covering masks do not appear, but blindfolds are more powerful. Does not include kigurumi masks. + +### No Kigurumi Masks + +### Removes face-mimicking masks from the game. + +### No Hoods + +### Removes hoods from the game. + +### No Sense Deprivation + +### Removes sensory deprivation hood/mask from the game. + +### Blackout + +### Blindfolds are stronger. While blindfolded you can only see enemies next to you. + +### No Blindfolds + +### In most cases you will not get blindfolded, except for cloth blindfolds which can be escaped easily. + +### Total Blackout + +### Blindfolds are extremely punishing. + +### Poor Vision + +### Vision radius is significantly reduced. + +### Keen Hearing + +### You can more easily hear enemies and their movements through walls. + +### Archer's Eye + +### +2 vision radius. + +### Night Owl + +### Your vision in dark areas is improved. + +### Fear of the Dark + +### Your vision in dark areas is reduced. + +### Mutually Assured Darkness + +### Darkness is twice as effective in hiding from enemies, but your night vision is also reduced. + +### Stalker + +### Darkness is twice as effective in hiding from enemies. + +### Not a Doll + +### You may still enter Doll Terminals, but enemies will not force you onto doll stands. + +No Nurses +간호사는 없다 Nurses will not appear in the game. 간호사가 게임에 나타나지 않습니다. +### No Police + +### Police-based bounty hunters will not appear in the game. + No Brats 노 브라츠 Submissive enemies won't run away from you. @@ -625,35 +1099,114 @@ Brats Only Submissive enemies will always be bratty and force you to catch them. 복종하는 적들은 항상 뻔뻔할 것이고 당신이 그들을 붙잡도록 강요할 것입니다. -Panic!!! -공황!!! + +### More Tape + +### Tape-wielding enemies (such as Tape Bots) occur more frequently. + +### Less Tape + +### Fewer tape-related enemies will appear, although this does not remove tape entirely. + + + +### No Tape Bots + +### The old civilization did not use tape-based restraints in their capture robots. + +### Less Cable Bots + +### The old civilization used significantly less cable-based restraints in their capture robots. + +### No Resin Bots + +### The old civilization did not use crystal resin-based restraints in their capture robots. + +### Lexx Latex Bots + +### The old civilization used significantly less latex-based restraints in their capture robots. + +### More Encasement + +### Enemies that encase you (e.g slimes, latex cubes) will appear more frequently. + +### Less Encasement + +### Fewer encasement-related enemies will appear, although this does not remove them entirely. + +### More Bubbles + +### Enemies that use bubbles (e.g. aqua slimes, water witches) will appear more frequently. + +### Less Bubbles + +### Fewer bubble-related enemies will appear, although this does not remove them entirely. + + + + + +### Trainee + +### Your training has given you access to the powers of the Trainee class. (Aroused mode only) + +Fighter +싸움꾼 +### Your training has given you access to the powers of the Fighter class. + +Rogue +도적 +### Your training has given you access to the powers of the Rogue class. + +### Wizard + +### Your training has given you access to the powers of the Wizard class. + +Peasant +농부 +### You possess the agricultural mastery of the Peasant class. + + + +### Panic! (Chests) + +### When you open a trapped chest, you are stunned for 2 turns. + +### Panic! (Traps) + When you step on a trap, you are stunned for 2 turns. 함정을 밟으면 2턴간 기절합니다. Panic sets in! (Stunned 2 turns) 공황 상태가 시작됩니다! (기절 2턴) + Butterfingers 미끌거리는 손 Having arms bound prevents you from using your hands to struggle or unlock yourself. 팔을 묶으면 손을 사용하여 몸부림을 치거나 잠금을 해제할 수 없습니다. + Weak Grip 약한 그립 Having arms bound prevents you from holding weapons or potions. 팔을 묶으면 무기나 물약을 들고 다닐 수 없습니다. + You kneel down so you can reach the potion with your mouth... 당신은 물약이 입에 닿을 수 있도록 무릎을 꿇습니다... + Can't Hear You! 안 들려! Being gagged blocks you from casting verbal spells regardless of gag power. 재갈을 문 상태에서는 무조건 언어 주문을 시전할 수 없습니다. +### Smooth Talker + +### Being gagged does not increase your miscast chance for verbal spells unless fully gagged, and reduces gag power by 20%. -Unmasked -마스크 해제 Hoods and full-face covering masks do not appear, but blindfolds are more powerful. -후드와 전면 가리는 마스크는 나오지 않지만 눈가리개가 더 강력합니다. +후드와 전면 가리는 마스크는 나오지 않지만 눈가리개가 더 강력해집니다. + Ball Gag Lover 볼 개그 애호가 @@ -664,11 +1217,13 @@ Muzzle Lover Greatly increases the occurrence of muzzles. 입마개 등장률이 크게 증가합니다. + Armbinder Lover 암바인더 애호가 More armbinders, less straitjackets. 더 많은 암바인더, 더 적은 구속복. + Jacket Lover 자켓 애호가 More straitjackets, less armbinders. @@ -685,12 +1240,12 @@ Wolf Trainee 늑대 훈련생 Start in a uniform of a naughty wolfgirl. 외설적인 늑대소녀의 제복을 입고 시작합니다. -Latex Doll -라텍스 인형 -Start bound in latex restraints. -라텍스 구속구를 입고 시작합니다. -Iron Slave -철의 노예 +### Latex Toy + +### Start bound in lovely latex restraints. + +### Elemental Slave + Start in a full set of magically locked obsidian cuffs. 마법으로 잠긴 흑요석 수갑 풀 세트를 장착하고 시작합니다. @@ -709,6 +1264,12 @@ Magic puts you in a clear state of mind. Casting spells successfully reduces you 마법은 정신을 맑게 해줍니다. 주문을 시전하면 산만함이 감소합니다. +### Unidentified Wear + +### Enchanted (and cursed) wearables and weapons are unidentified until the item is used. + +### Unknown + Copy (clipboard) 복사(클립보드) Paste (clipboard) @@ -721,8 +1282,8 @@ The pressure fans the flames on you, dealing bonus DAMAGEDEALT fire damage! 압력이 당신에게 불길을 부채질하여 보너스 DAMAGEDEALT 화염 피해를 입힙니다! The RestraintName comes off more easily in the presence of water! RestraintName은 물이 있으면 더 쉽게 벗겨집니다! -You slip on the ice! -당신은 얼음에 미끄러집니다! +### You slip on the floor! + The air around you is ablaze! (-DamageDealt SP) 주변 공기가 불타고 있습니다! (-DamageDealt SP) The Goddess of Illusions shrouds you in shadows! @@ -735,10 +1296,22 @@ Your body sinks deeper into a sea of bindings... 당신의 몸은 속박의 바다 속으로 더 깊이 가라앉고 있습니다... You struggle to breath as you are buried alive in squirming ropes... 당신은 꿈틀거리는 밧줄에 산채로 묻혀 숨쉬기 힘들어합니다... -The hands squeeze you tightly... -손들이 당신을 꽉 움켜쥡니다 ... -More hands clasp over your body... -더 많은 손이 당신의 몸을 감싸고 있습니다... +### The slime stretches out over your body... + +### The slime continues to engulf you, blocking out your vision... + +### The slime starts to harden, sealing you inside a rubbery prison... + +### You feel a force compelling you to stop resisting... + +### Your body struggles to move as you feel a power sealing you! + +### The sarcophagus' door slides open as you are slowly pulled inside... + +### The hands squeeze you tightly as a shadowy portal appears... + +### More hands clasp over your body as they pull you toward the portal... + You struggle to breath as you are pulled into the mass of shadow hands... 당신은 그림자 손 덩어리로 끌려가면서 숨쉬기 힘들어합니다... The world goes dark... @@ -746,9 +1319,11 @@ The world goes dark... You wake up in a different place... 당신은 다른 장소에서 깨어납니다... + Arcane Explosion 신비한 폭발 + EnemyName says something incomprehensible! Her spell miscasts! EnemyName이 이해할 수 없는 말을 합니다! 그녀의 주문이 잘못 시전되었습니다! EnemyName fumbles her next move! @@ -756,16 +1331,13 @@ EnemyName이(가) 다음 동작을 더듬고 있습니다! The EnemyName utters a command word on the TargetName! EnemyName이 TargetName에 명령어를 발합니다! -Nipples -젖꼭지 + Nipples 젖꼭지 Breasts 가슴 Panties 팬티 -Panties -팬티 Front 앞쪽 Rear @@ -775,30 +1347,31 @@ Feet Everywhere! 모든 부위! -Physical Armor: -물리적 갑옷: -Magic Armor: -매직 아머: + +### Physical Armor: + +### Magic Armor: + In the Shadows: You are harder to see. 그림자 속에서: 당신은 보기가 더 어렵습니다. Invisible: You are very difficult to see. 보이지 않음: 당신은 보기가 매우 어렵습니다. Quickness: Your next movement is so fast it doesn't advance a turn. 빠름: 다음 이동은 매우 신속해 턴을 소모하지 않습니다. -All Damage Reduction: -모든 피해 감소: +### All Damage Reduction: + You take PERCENT1 DAMAGETYPE damage, based on PERCENT2 DAMAGETYPE resist and PERCENT3 DAMAGECATEGORY modifier. PERCENT2 DAMAGETYPE 저항과 PERCENT3 DAMAGECATEGORY 수정자를 기준으로 PERCENT1 DAMAGETYPE 피해를 받습니다. You deal PERCENT more DAMAGETYPE damage. 당신은 PERCENT 더 많은 DAMAGETYPE 피해를 줍니다. Your bindings are PERCENT more effective. 귀하의 바인딩이 PERCENT 더 효과적입니다. -Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage. -당신의 공격은 기본적으로 DAMAGEDEALT DAMAGETYPE 피해를 입힙니다. -Plugged! -Plugged! -Plugged up!!! -Plugged up!!! +### Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage, for a stamina cost of STMNA. + +### Plugged! + +### Plugged up!!! + Denied! You won't be getting off that easy~ 거부! 그렇게 쉽게 벗어날 수는 없어~ Teasing vibrations... @@ -814,6 +1387,9 @@ Intense vibrations!! Torturous vibrations!!! 고통스러운 진동!!! + +### Your restraints are restrictive! Struggling is less effective without help. + Stunned! You can't move! 기절! 움직일 수 없어! Your vision is impaired! @@ -822,14 +1398,18 @@ Arms are bound! 팔이 묶여있다! Hands are useless! 손을 사용할 수 없습니다! -Movement significantly impaired! -움직임이 상당히 제약됩니다! -Movement slightly impaired. -움직임이 약간 제약됩니다. -Movement severely impaired! -움직임이 심하게 제약되었습니다! -Immobilized! -움직일 수 없음! +### Hands are impaired! Some tasks will be harder... + +### Slow Level 2: Movement significantly impaired! + +### Slow Level 1: Movement slightly impaired. + +### Slow Level 3: Movement severely impaired! + +### Slow Level 4+: Movement is almost impossible. Sprinting and hopping are disabled. + +### Slow Level 10+: Immobilized! + Your mouth is free for potion-drinking and spellcasting activities. 입은 멀쩡합니다. 포션을 섭취하거나 주문을 시전할 수 있습니다. Your vision is clear. @@ -845,15 +1425,21 @@ You are gagged! Verbal miscast chance is increased and your potions are less eff Your mouth is totally filled! You can't drink potions and cant cast verbal spells! 입이 꽉 찼습니다! 포션 섭취는 불가능하며 주문 영창 실패 확률이 매우 높아집니다! + Spell Empowerment! 주문 강화! + +### Let there be light! + You're seeing things... 당신은 사물을보고 있습니다 ... + You've been poisoned! 당신은 중독되었습니다! + -50% MP Cost (Latex) -50% MP 비용(라텍스) -50% MP Cost (Leather) @@ -871,12 +1457,12 @@ Regeneration -50% MP Cost (Illusion) -50% MP 비용(일루젼) + Conductive: When you or an enemy takes electric damage, the other takes half of it as well! 전도성: 당신이나 적이 전기 피해를 입으면 그 상대방도 절반을 입습니다! Lightning Rod: Gain significantly boosted electric resist. 피뢰침: 전기 저항이 크게 증가합니다. -Drenched: Grants fire resist, ice weakness, and makes you conductive. -Drenched: 화염 저항, 얼음 약점을 부여하고 전도성을 부여합니다. +### Drenched: Grants fire resist, ice/electric weakness, and makes you conductive. Chilled: The cold makes it hard to move! You are slowed. 냉기: 추위로 인해 움직이기 어렵습니다! 속도가 느려집니다. @@ -887,17 +1473,18 @@ Unsteady: You're on loose footing. You are easier to hit and are slowed. Ignore Ice Tiles 얼음 타일 무시 + Ignited: You are dealing fire damage to yourself and nearby enemies! 점화: 자신과 주변의 적에게 화염 피해를 입힙니다! You are on fire and taking damage! 당신은 불타고 있고 피해를 입고 있습니다! -Arcane Power: Deals bonus damage when you hit an enemy. -아케인 파워: 적에게 명중하면 추가 피해를 입힙니다. -Arcane Protection: Reduces damage taken, and deals retaliation damage. -아케인 프로텍션: 받는 피해를 줄이고 보복 피해를 입힙니다. -Arcane Cunning: You turn invisible briefly after attacking. -아케인 교활함: 공격 후 잠시 투명해집니다. + +### Divine Punishment: Deals bonus damage when you hit an enemy. + +### Divine Protection: Automatically blocks the next 3 times an enemy tries to bind you. + +### Divine Cunning: You turn invisible briefly after attacking. -MP Cost (Fire) -MP 비용(화염) @@ -908,18 +1495,21 @@ Arcane Cunning: You turn invisible briefly after attacking. -MP Cost (Earth) -MP 비용(땅) + Slime Form: You gain bonuses and can slip through bars! 슬라임 형태: 보너스를 얻고 철창을 통과할 수 있습니다! Shroud: Visibility decreased, evasion increased. 장막: 가시성 감소, 회피 증가. -Camoflage: While holding still, you are very hard to see. -위장: 가만히 있으면 당신을 알아보기 매우 어려워집니다. +### Camoflage: While next to a wall, you are very hard to see. + Stone Skin: Increased armor. 스톤 스킨: 갑옷 증가. Darkblade: Increased damage. 다크블레이드: 데미지 증가. Runic Ward: Increased Magic Armor. 룬 와드: 매직 아머 증가. +### Great Invisibility: It is impossible for enemies to see you. + Invisibility: It is very difficult for enemies to see you. 투명화: 적들이 당신을 보기가 매우 어렵습니다. Lesser Invisibility: It is harder for enemies to see you. @@ -934,15 +1524,23 @@ Sleepy: You are sluggish and have a hard time keeping your eyes open. 졸림: 당신은 게으르고 눈을 뜨고 있는 데 어려움을 겪고 있습니다. Afterimage: Evasion greatly increased. 잔상: 회피율 대폭 상승. -We did it! We made outselves invisible--mmmmph!!! -우리가 해냈어! 우리는 스스로를 보이지 않게 만들었--으읍읍!!! +### We did it! We made ourselves invisible--mmmmph!!! + +### You are not currently attempting to disguise yourself. Click to reenable. + Your restraints are disenchanted, treating them as nonmagical for purposes of cutting. 당신의 구속구에 걸린 마법은 풀렸으며, 자를 때 비마법 상태로 판정됩니다. You can launch another leather restraint instantly! 다른 가죽 구속을 즉시 시작할 수 있습니다! +### You can launch another Sagitta instantly! + +### You have stored willpower. + +### You have consumed a mote of essence, granting miscast chance reduction. -Your motivation is powerful enough your spells cannot be stopped! -당신의 동기는 강력해서 당신의 주문은 멈춰질 수 없습니다! +### You recapture an essence mote and concentrate on its essence! + +### Choose an essence mote to absorb. Locked Down: Struggling power is greatly reduced. 잠김: 투쟁력이 크게 감소합니다. @@ -955,6 +1553,7 @@ Dextrous: You can cast arm spells while tied up. Spell Dance: You can cast leg spells while tied up. 주문 춤: 다리가 묶인 상태에서 주문을 시전할 수 있습니다. + Bondage Buster: Lazor is charging... 본디지 버스터: 레이저가 돌격 중입니다... Katana: Patience is key... @@ -962,12 +1561,11 @@ Katana: Patience is key... Stormbreaker: You have the Power. 스톰브레이커: 당신에게 힘이 있습니다. + Game Setup: 게임 설정: -Choose game mode: -게임 모드 선택: -Beginner: Get a save code every 3 levels, autosave after each floor -초보자: 3레벨마다 저장 코드 받기, 각 층마다 자동 저장 +### Beginner: Get a save code every 3 levels, autosave after each floor + Roguelike: No save codes, only autosave Roguelike: 저장 코드 없음, 자동 저장만 Exciting: Orbs give random spells @@ -975,34 +1573,29 @@ Exciting: Orbs give random spells Kinky: No save codes, orbs give random spells, start with very little Kinky: 저장 코드 없음, 오브는 임의의 주문을 제공합니다. 아주 적은 양으로 시작합니다. -Log -기록 + +### Journal Change Outfit 복장 바꾸기 -Reset Outfit -복장 초기화 -Code -코드 +### Reset to Default + +### Outfit Code + Confirm Reset? 정말 초기화하시겠습니까? -(Copy the code above and save it on your computer to load later) -(이후에 불러오려면 위의 코드를 컴퓨터에 저장하세요) -You come across a black monolith with its face inscribed in runes. -표면에 룬이 새겨진 검은 기둥을 발견했습니다. -You study them, but can't come up with an interpretation. -당신은 그것들을 살펴보지만 해석 할 수 없습니다. -They may still prove useful to future adventurers should you get caught... -당신이 잡히면 미래의 모험가들에게 여전히 유용할 수 있습니다... -(Your game has been saved automatically, but you can save the code for later) -(게임이 자동으로 저장되었지만 나중을 위해 코드를 저장할 수 있습니다.) + +### (Your game has been saved) + +### (Copy the code above and save it on your computer to backup) Continue... 계속... + Menu 메뉴 @@ -1024,20 +1617,20 @@ No, I wish to press on See Perks 특전 보기 + This chest belongs to the FACTION 이 상자는 FACTION에 속합니다. +### This belongs to the FACTION Devious Dungeon Challenge is enabled. 사악한 던전 챌린지가 활성화되었습니다. Waiting for game data... 게임 데이터를 기다리는 중... -You have surrendered to the dungeon and become its prisoner. -당신은 던전에 항복했고 그 포로가 되었습니다. -Day and night, you wait that rescue may come some day. -당신은 언젠가 올지도 모를 구조를 밤낮으로 기다립니다. -Better luck next time! -다음 기회에! + + + + You have reached the end of the playable portion. 플레이 가능 영역의 끝에 도달했습니다. @@ -1045,19 +1638,22 @@ Come back later for new dungeons! 나중에 새로워진 던전으로 돌아오세요! - Got the keys! Find the stairs to go to the next floor. 열쇠를 얻었다! 다음 층으로 가는 계단을 찾으세요. You haven't found the keys for this floor yet. 아직 이 층의 열쇠를 찾지 못했습니다. Missing key 열쇠 미발견 -Chance for a spell to fizzle: -주문을 실패할 확률: -Chance to dodge an attack: Percent% -공격을 회피할 확률: Percent% -Chance to block a level 10 restraint: Percent% -레벨 10 구속을 차단할 확률: Percent% +### You are protected from damage and can't be bound until the shield is broken! + +### Chance for a spell to fizzle: + +### Dodge Chance: Percent%, based on EVASIONSUM Evasion and EVASIONPENALTY% penalty. + +### Block Chance: Percent%, based on BLOCKSUM Block and BLOCKPENALTY% penalty. + +### Chance to resist a level 10 restraint: AMNT1%, based on AMNT2 Bondage Resist and RESBLKPENALTY penalty. + Sight Range: RADIUS 시야 범위: RADIUS Speed: SPD @@ -1072,20 +1668,34 @@ Very Slow 매우 느려짐 Immobile 움직일 수 없음 -Mana slowly recovers from a pool equal to 4x your max mana. Drink potions to restore the pool. -마나는 최대 마나의 4배에 해당하는 웅덩이에서 천천히 회복됩니다. 물약을 마셔 웅덩이를 회복하십시오. -Your minimum distraction increases over time as you encounter distracting things. -시간이 지남에 따라 주의를 산만하게 하는 것들을 만나면 최소한의 주의가 산만해집니다. +### DP: PERCENT% + +### DP: CURRENT/MAX (PERCENT% Desire) + +### SP: CURRENT/MAX + +### Willpower: CURRENT/MAX + +### MP: CURRENT/MAX + +### Mana slowly recovers from a pool equal to POOLMANA. Drink potions to restore the pool. + +### Your Desire is the baseline Distraction you decay toward, and is increased by distracting things. + Stamina recovers more quickly when you aren't spending it. 스테미나는 행동하지 않을 때 더 빨리 회복됩니다. Willpower is restored by food, sleep, and potions. Without willpower, it becomes very difficult to escape. 의지는 음식, 수면, 물약으로 회복됩니다. 의지력이 없으면 탈출하기가 매우 어려워집니다. Charge is used to power various magic items and weapons. 충전은 다양한 마법 아이템과 무기에 전원을 공급하는 데 사용됩니다. +### WP: CURRENT/MAX + +### Charge: PERCENT + Use Potion 포션 사용 - MP - MP +### MP + Go to sleep 잔다. Call for help! @@ -1095,14 +1705,9 @@ Play with yourself Let go... 간닷... -Let go... -간닷... -Play with yourself -스스로.. 한다 -Go to sleep -잔다. -Make noise! -소음을 낸다! + +### Call for Help!!! + Wait until interrupted 중단될 때까지 기다리십시오 Auto-struggle @@ -1111,35 +1716,47 @@ Auto-path 자동 길찾기 Quick-Swap Weapon 퀵 스왑 무기 +Inspect +검사 Pass NPCs 패스 NPC -Close a Door -문 닫기 +### Interact + Sprint/Hop 스프린트/홉 +### Crouch + +### ~ah~ + +### ~mmm~ + +### ~ngh~ + +### ~oh~ -Ahh! -아! -Mmm... -음... -Nnngh... -으응... -Ooooh... -오오오... -(Breaths heavily) -(숨을 크게 들이마신다) -(Moans softly) -(부드럽게 신음) -(Incoherent mumbling) -(말도 안되는 중얼거림) -(Moans loudly) -(크게 신음) (Heavy breathing) (가쁜 호흡) -(Moaning uncontrollably) -(억제할 수 없는 신음) -(Shudders with pleasure) -(기쁨에 몸서리친다) +### (Soft moaning) + +(Incoherent mumbling) +(말도 안되는 중얼거림) +### (Loud moans) + +### (Deep breaths) + +### (Uncontrollable moaning) + +### (Horny noises) + + + +### ~mm~ + +### ~mmph~ + +### ~nnn~ + +### ~mmmmm~ You wait. 기다린다. @@ -1156,6 +1773,7 @@ You wait to regain your composure, shaking with frustration. You are exhausted from spellcasting. 당신은 주문 시전에 지쳤습니다. + You are feeling tired. 당신은 피곤함을 느낍니다. You feel exhausted... @@ -1163,43 +1781,49 @@ You feel exhausted... You feel like you are going to pass out... 당신은 기절할 것 같은 느낍이 듭니다... + Start New Game 새 게임 시작 New Game+ 새 게임+ Continue Last Save 마지막 저장 시점에서 계속 -Load From Code -세이브 코드 로드 -Save Outfit (overwrites!) +### Load Saved Game + +Save Outfit (overwrite!) 옷 저장(덮어쓰기!) +### Save Outfit (Clothes Only!) + Save Keybindings 키 바인딩 저장 Cancel Changes 변경 취소 -Change Keybindings -키바인딩 변경 +### Return + +### Game Options Load from code 세이브 코드 로드 Back to main menu 메인 메뉴로 돌아가기 -Load Mod -모드 로드 +### Load Mod .zip + Delete Mod 모드 삭제 Clear Perks 클리어 특전 -Config -설정 +### Config + Cancel 취소 +### Filter DANGER: Loading a mod will execute ARBITRARY CODE on your machine. 위험: 모드를 로드하면 컴퓨터에서 임의 코드가 실행됩니다. Like connecting to a server, etc. Only load mods from a TRUSTED source. 서버 등에 연결하는 것과 같습니다. 신뢰할 수 있는 소스에서만 모드를 로드합니다. + Up 위로 Down @@ -1230,37 +1854,67 @@ Spell 6 마법 6 Spell 7 마법 7 +### Spell 8 + +### Spell 9 + +### Spell 10 + +### Load Hotbar 1 + +### Load Hotbar 2 + +### Load Hotbar 3 + +### Load Loadout 1 + +### Load Loadout 2 + +### Load Loadout 3 + Cycle Spell Page 주문 페이지 전환 Upcast Spells 주문 강화 Cancel Upcast 주문강화 취소 -Swap Weapon -무기 바꾸기 -Ranged Attack -원거리 공격 +### Swap Weapon 1 + +### Swap Weapon 2 + +### Swap Weapon 3 + +### Swap Weapon 4 + +### Weapon Ability + Wait 대기 -Cancel/Return -취소/반품 +### Cancel/Back + Enter 입력하다 +### Expand Minimap + +### Zoom Out + +### Zoom In + +### Wait till Interrupted + +### Make Noise + +### Play with Self Message Log 메시지 로그 -Close Door -문을 닫다 Pass thru allies 아군 지나가기 Auto-Struggle 자동 몸부림 Auto-Pathfind 자동 길찾기 -Sprint/Hop -스프린트/홉 -Inspect -검사 +### Hide Bullets Quick Inventory 퀵 인벤토리 @@ -1268,70 +1922,84 @@ Inventory 인벤토리 Reputation 평판 +### Journey Map + +### Quests + Spell List 주문 목록 -Logbook -일지 +### Pause Menu + +### Facilities Current Key Pressed 현재 키 눌림 Press a key, then press a button to set that key 키를 누른 다음 버튼을 눌러 해당 키를 설정하십시오. + Floor FLOORNUMBER: DUNGEONNAME FLOORNUMBER 층 : DUNGEONNAME -Lockpicks: -락픽: -Keys: -키: -Magic Keys: -마법 키: -Knife: -나이프: -Mag. Knife: -매기나이프: +### Lockpicks: + +### Keys: + +### Magic Keys: + +### Knife: + +### Mag. Knife: You climb down the stairs. The passage closes behind you. 당신은 계단을 내려갔습니다. 뒤의 통로가 닫힙니다. +### You climb back up the stairs. + You can't climb down until you get out of this leash... 이 목줄에서 벗어날 때까지 내려갈 수 없습니다... You climb down and find yourself in a strange new place. 당신은 아래로 내려가 이상한 새로운 장소에 있는 자신을 발견합니다. + +### plus XXX + Graveyard 묘지 Catacombs 지하 묘지 -Underground Jungle -지하 정글 +### Overgrown Ruins + Lost Temple 잃어버린 사원 -The Bellows -The Bellows +### The Bellows + Rundown Laboratory 버려진 연구소 Forgotten Garden 잊혀진 정원 +### Coastal Grotto + Kingdom of Ice 얼음 왕국 - The Mansion 더 맨션 + Ancient Tombs 고대 무덤 Magic Library 마법 도서관 Crystal Cave 수정 동굴 -Orrery -Orrery +### Cavern + +### Orrery + Training Center 트레이닝 센터 Rubber Facility @@ -1344,6 +2012,39 @@ Doll Storage 인형 보관소 +### Processing + +### Bandit Hideout + +### Ancient Vault + +### Ancient Halls + +### Slave Market + +### Elevator Hall + +### Dark Passageway + +### Caldera Beach + +### Temple of Air + +### Temple of Fire + +### Temple of Water + +### Temple of Ice + +### Temple of Storms + +### Temple of Earth + +### The Edge of Reality + +### Dark Dimension + +### Lair You search through the debris but find nothing of note 당신은 잔해를 뒤졌지만 아무 것도 발견하지 못했습니다. @@ -1362,13 +2063,19 @@ You find a bola, crafted by bandits You find some unexploded ordnance. 폭발하지 않은 무기를 찾았습니다. + You find a key lying atop an open tome! 열린 책 위에 놓여 있는 열쇠를 찾았습니다! +### You find a magical key lying atop an open tome! + You find a useful scroll wedged between some treatises! 당신은 몇몇 논문 사이에 끼워진 유용한 두루마리를 발견했습니다! You find a glowing book containing a binding spell! 속박 주문이 들어 있는 빛나는 책을 찾았습니다! + +### You discover a golden cookie, wrapped in foil. Beside it are two power crystals. + You find a golden key surrounded by strange golden crystals. 이상한 황금 수정으로 둘러싸인 황금 열쇠를 발견합니다. You find a set of strange golden crystals. @@ -1380,6 +2087,7 @@ You find a pack of scrolls used for spellcasting. You find a glowing scroll of purity. 빛나는 순결의 두루마리를 찾았습니다. + The chest contains gold! (+XXX gold) 상자에는 금이 들어 있습니다! (+XXX 골드) The chest contains a glowing magical knife! @@ -1418,14 +2126,22 @@ You find a special collar that lets you absorb energy from potions. 포션에서 에너지를 흡수할 수 있는 특별한 목걸이를 찾았습니다. You find a pair of garish pink high heels with a slippery surface. 미끄러운 표면이 있는 번쩍이는 분홍색 하이힐을 찾았습니다. +### You find a special gag with a feather duster. + +### You find a gas mask suitable for filtering gases. + The pearly chest contains a divine gift! (+ITEMGET) 진주 상자에는 신성한 선물이 들어 있습니다! (+아이템겟) Smoke fills the air around you! 연기가 주변 공기를 채웁니다! +### You find a magical necklace that seems to concentrate magic. + + You recover some of your lost items! 잃어버린 물건을 되찾았군요! + You find a red potion with a sweet scent. 달콤한 향이 나는 빨간 물약을 찾았습니다. You find a blue potion that glows with magical essence. @@ -1445,8 +2161,9 @@ You find a snow-like potion that's cold to the touch. You find a medley of potions. 당신은 여러종류의 물약을 찾았습니다. -Rarity: -희소성: + +### Rarity: + Lesser 저급 Common @@ -1470,10 +2187,10 @@ Angelic Divine 신성한 + Quantity: 수량: -Use Item (Consumes 1) -아이템 사용 (1개 소모) +### Use One way of the fist 주먹의 길 @@ -1482,27 +2199,32 @@ Lockpick Exit Keys 종료 키 -Wizard's Outfit -마법사 의상 + +### Adventurer's Outfit + Your favorite outfit for adventuring. 모험을 위해 가장 좋아하는 복장. -Your original outfit.No bonuses, -당신의 원래 복장. 보너스도, 페널티도 없습니다. +### Your original outfit. No bonuses, no penalties. + +### Tactical Catsuit + +### A sleek catsuit worn by stealth operatives. No frills, no nonsense. + +### Increases stealth by 10% in the dark. Jail Uniform 감옥 제복 The prisoners are kept in revealing outfits to keep them from hiding things. 죄수들은 물건을 숨기지 못하도록 노출이 심한 옷을 입고 있습니다. -A prisoner's 'outfit'. No bonuses, no penalties. -죄수의 '복장'. 보너스도 페널티도 없습니다. +### Designed to make it hard to conceal weapons. Makes you more visible and vulnerable to the cold. + Wolfgirl Suit 늑대소녀수트 An advanced suit designed for sport, breathable and also warm. 스포츠, 통기성 및 따뜻함을 위해 설계된 고급 수트. -No bonuses, no penalties. -보너스도 페널티도 없습니다. +### Made of latex. Resistant to electricity but does not insulate well. Maid Uniform 메이드복 @@ -1511,40 +2233,68 @@ An elegant dress meant to denote a maid's status. Massively increases accuracy against slime mold. 점균류에 대한 정확도가 크게 향상됩니다. -Prisoner Uniform -죄수복 -The uniform of choice for girls captured by the dragonhearts. -드래곤하트에게 사로잡힌 소녀들이 선택한 교복. -Designed to make it hard to conceal weapons. No bonuses, no penalties. -무기를 숨기기 어렵게 설계되었습니다. 보너스도 페널티도 없습니다. + +### Harem Outfit + +### A skimpy outfit with antiquated connotations. + +### Harkening back to an old era. + +### Combat Bikini + +### A minimalist albeit chilly outfit designed for ease of use. + +### Or perhaps it's just sexy... + +### Lingerie + +### A minimalist yet aesthetically pleasing outfit. + +### No bonuses. + + + +### Dragonheart Uniform + +### The uniform of choice for dragonheart of all ranks. + +### It's made of fire-resistant leather, and provides +5 armor. Scientific Uniform 과학 유니폼 An outfit designed to leave little to the imagination. 상상력에 거의 맡기지 않도록 설계된 복장. -No bonuses, no penalties. -보너스도 페널티도 없습니다. +### Resistant to electricity but does not insulate well. Provides significant acid and glue protection for scientific purposes. Latex Catsuit 라텍스 캣수트 An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. 심하게 가공된 슬라임으로 만든 의상. 자연스럽고 매끄러우며 부드럽습니다. -No bonuses, no penalties. -보너스도 페널티도 없습니다. + + +### Doll Catsuit + +### Resistant to electricity but does not insulate well. + +### Cyber Doll Suit + +### A technologically advanced suit designed for long term wear. Despite being watertight and skintight it has cleaning and ventilation ports that plug directly into doll storage fixtures. Shadow Latex Dress 그림자 라텍스 드레스 A minidress made from shadow latex, a favorite of otherwordly patrons. 섀도우 라텍스로 만든 미니드레스, 이세계의 고객이 가장 좋아하는 제품입니다. -No bonuses, no penalties. -보너스도 페널티도 없습니다. +### Resistant to the elements, but is infused with crystals that amplify psychic damage to yourself. + +### Elemental Slave Dress + +### A minidress made to adorn mortal slaves in the elemental planes. Elven Dress 엘프 드레스 A regal minidress worn by visitors to the forest. 숲을 찾는 방문객들이 입는 당당한 미니드레스. -No bonuses, no penalties. -보너스도 페널티도 없습니다. +### Not very good at insulating you from the cold or from touchy fingers. Its elven aura improves accuracy and evasion by +10. Scroll of Sleight 교활한 두루마리 @@ -1555,6 +2305,7 @@ A scroll used by thieves to make their plays in secret. Allows you to cast Arm spells without components for 12 turns. 12턴 동안 팔이 필요한 주문을 조건 없이 시전할 수 있습니다. + Scroll of Purity 순수의 두루마리 The scroll circles around your body and you feel... empty now. @@ -1564,6 +2315,7 @@ A scroll used to enforce chastity within religious orders. Removes all vibrators from your body. 몸에서 모든 진동기를 제거합니다. + Scroll of Speech 연설의 두루마리 The scroll makes your gagged speech slightly more intelligible! @@ -1573,6 +2325,7 @@ A scroll used to help translate different languages. Allows you to cast Verbal spells without components for 12 turns. 12턴 동안 주창이 필요한 주문을 조건 없이 시전할 수 있습니다. + Scroll of Sauntering 유랑의 두루마리 The scroll lets you move your body in swift and accurate ways! @@ -1582,6 +2335,7 @@ A scroll used by dancers to upgrade their moves. Allows you to cast Leg spells without components for 12 turns. 12턴 동안 다리가 필요한 주문을 조건 없이 시전할 수 있습니다. + Ancient Key 고대의 열쇠 Perhaps it has something to do with ancient restraints? @@ -1591,9 +2345,11 @@ An ancient key plated in gold. It doesnt look like it can open anything... You pick up a shining golden key. 당신은 빛나는 황금 열쇠를 줍습니다. + You pick up a ReplaceValue. ReplaceValue 를 선택합니다. + Power Crystal 파워 크리스탈 You hold the crystal and the power flows into you. @@ -1603,36 +2359,35 @@ You're not sure how they charged these... A mysterious device used by the old civilization, powering their ancient devices. 오래된 문명이 고대 장치에 동력을 공급하는 신비한 장치입니다. + You are already full of ancient power. 당신은 이미 고대의 힘으로 가득 차 있습니다. + Spent Power Crystal 소비된 파워 크리스탈 You touch the spent crystal and it siphons 100 gold from your bag! 사용한 수정을 만지면 가방에서 100골드를 빨아들입니다! You are not sure how to charge this back up. 이 백업을 충전하는 방법을 잘 모르겠습니다. -You're not sure how they charged these... -당신은 그들이 이것을 어떻게 충전했는지 확신할 수 없습니다... A mysterious device used by the old civilization, now depleted. 오래된 문명이 사용하던 신비한 장치로, 이제 고갈되었습니다. + Gold 금 Key 열쇠 -A key with traces of magic that fades with one use. -한 번 사용하면 사라지는 마법의 흔적이 있는 열쇠입니다. -Can be used to unlock a restraint, door, or chest. -구속 장치, 문 또는 상자의 잠금을 해제하는 데 사용할 수 있습니다. +### A key. You wonder who it's for? + +### Can be used to unlock one simple or standard-locked restraint, door, or chest. + Magic Key 마법의 열쇠 A glowing key enchanted with magic that fades with one use. 한 번 사용하면 사라지는 마법이 부여된 빛나는 열쇠입니다. -Can be used to unlock a blue lock. -파란 자물쇠를 여는 데 사용할 수 있습니다. -Magic Key -마법의 열쇠 +### Can be used to unlock a runic lock. + A magical key with the power to open blue locks. 파란색 자물쇠를 여는 마법의 열쇠. Blue locks can't be otherwise picked. @@ -1641,34 +2396,24 @@ Magic Knife 매직나이프 A magical blade, suitable against ghosts. 유령에 적합한 마법의 칼날. -Deals shadow damage. Can cut enchanted ropes. -암흑 피해를 입힙니다. 마법이 부여된 로프를 절단할 수 있습니다. +### Deals shadow damage. Can cut enchanted ropes. Offhand: Increase base crit of all magic damage by 20% + Bola 그녀는 A pair of weights attached to a rope. Can be thrown. 밧줄에 연결된 한 쌍의 추. 던질 수 있습니다. Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. 바인딩 90포인트, 체인데미지 40, 대상을 4턴간 속박합니다. -A pair of weights attached to a rope. Can be thrown. -밧줄에 연결된 한 쌍의 추. 던질 수 있습니다. -Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. -바인딩 90포인트, 체인데미지 40, 대상을 4턴간 속박합니다. Bomb 폭탄 -After a 5 turn fuse, deals 100 fire damage in a 3x3 area. -5턴 신관 후, 3x3 지역에 100의 화염 피해를 입힙니다. -Not a toy! -장난감이 아니야! -After a 6 turn fuse, deals 100 fire damage in a 3x3 area. -6턴 퓨즈 후, 3x3 영역에 100의 화염 피해를 입힙니다. +### After a 5 turn fuse, deals 100 blast damage in a 3x3 area. + Not a toy! 장난감이 아니야! You light the fuse! 당신은 퓨즈에 불을 붙였습니다! Knife 칼 -Lockpick -락픽 A tool used to pick locks. 자물쇠를 따는 데 사용되는 도구입니다. Doesn't last forever, but can help in a pinch. @@ -1681,6 +2426,10 @@ Bola x3 볼라 x3 Bomb x3 폭탄 x3 +### Dynamite x2 + +### Plastic Explosive x2 + Mana Potion 마나 물약 You sip the mana potion and feel empowered. @@ -1717,26 +2466,60 @@ Frigid Potion 차가운 물약 You chug the concoction and your senses numb, helping you concentrate. 혼합물을 씹으면 감각이 마비되어 집중하는 데 도움이 됩니다. -A freezing cold bottle with a bitter scent. -쓴 냄새가 나는 차가운 병. +### Like bottled snow. Helps to get your mind on track. + Reduces distraction to 0 and grants additional decay for 50 turns. Can be used while gagged. 산만함을 0으로 줄이고 50턴 동안 추가 감쇠를 부여합니다. 재갈을 물린 상태에서도 사용할 수 있습니다. Smoke Bomb 연기 폭탄 -You toss the smoke bomb and it explodes in your location! -연막탄을 던지면 해당 위치에서 폭발합니다! -A type of pyrotechnic often employed by saboteurs. Can be used without hands. -공작원이 자주 사용하는 폭죽의 일종입니다. 손이 없어도 사용할 수 있습니다. +### You toss the smoke bomb and it starts emitting a deep haze! + +### You ready a smoke bomb... + +### A type of pyrotechnic often employed by saboteurs. Can be rolled and used without hands. + Creates a smoke screen lasting 8 turns. You are harder to see while inside the smoke. 8턴 동안 지속되는 연막을 생성합니다. 연막 안에 있는 동안 보기가 더 어려워집니다. +### Smoke Bomb x3 + +Flash Bomb +플래시 폭탄 +### Flash Bomb x3 + +### Flashbang x3 + +### You toss the flash bomb and the fuse starts ticking... + +### You ready a flash bomb... + +### A type of explosive used by agents. Blinds nearby targets without causing significant injury. + +### Blinds for 20 turns in a 3x3 area. + + + +### Flashbang + +### You toss the flashbang and the fuse starts ticking... + +### You ready a flashbang... + +### A piece of rare special forces equipment. The secrets of its manufacture are strictly kept by the Alchemist's Guild. + +### Blinds for 24 turns in a 3x3 area. Also Slows and Silences them for half the duration. + +### Blinds for 24 turns in a 3x3 area. And also Slows and Silences them for half the duration. + + + Invisibility Potion 투명 물약 You chug the concoction and see your body fading away. 당신은 혼합물을 씹고 몸이 사라지는 것을 봅니다. You feel liquid inside, but you can't see it! 내부에 액체가 느껴지지만 볼 수는 없습니다! -Casts Invisibility on yourself. -자신에게 투명화를 시전합니다. +### Casts Vanish on yourself. + Ectoplasm 외부 원형질 Like a moisturizing cream, except it's made from coagulated souls. @@ -1770,19 +2553,61 @@ It feels cold to the touch. Creates icicles around you for 5-8 turns. They deal 40 damage and freeze for 3 turns. 5~8턴 동안 주위에 고드름을 생성합니다. 40의 피해를 주고 3턴 동안 빙결시킵니다. + +### You steal the doll's identification card. + +### Doll ID + +### You apply a clever trick to reset your visor cooldown. + +### A chip used to identify dolls. She must have dropped it. Either way it contains valuable tech... + +### With enough, it can be used to remove Dollmaker's headwear. + + + +### Heart Amulet + +### You find a donut with sprinkles! + +### Donut (Sprinkles) + +### You enjoy the donut and relish in its sweet delights. + +### A delicious fried snack, covered in a sugary glaze and topped with sprinkles. + +### Restores 10% willpower. Takes a few turns to eat. + +### You pick up a sugar cookie slathered in pink frosting! + +### Good-Girl Gift + +### You slowly eat the cookie, savoring its fluffy texture. + +### It tempts you with sweet promises, but something about it feels off... + +### Restores 15% willpower and adds +5 submissiveness. Takes a few turns to eat. + +### You find a chocolate-chip cookie! + +### Cookie (Chocolate Chip) + +### You enjoy the cookie one chocolatey bite at a time. + +### A delicious baked good made with butter, sugar, and chocolate chips, baked until golden brown. + The potion was less effective due to your gag! 당신의 재갈 때문에 물약의 효과가 떨어졌습니다! + Elven Soap 엘프 비누 You feel the restraints become loose on your skin! 당신은 속박이 당신의 피부에 느슨해지는 것을 느낍니다! The secret to elven cosmetics and blemish-free skin. 엘프 화장품과 잡티 없는 피부의 비밀. -Makes you slippery for 10 turns, boosting all forms of struggling. -10턴 동안 미끄럽게 만들어 모든 형태의 고군분투를 강화합니다. -You feel the restraints become loose on your skin! -구속이 피부에 느슨해지는 것을 느낍니다! +### Makes you slippery for 100 turns, boosting all forms of struggling. + Enchanted Grinder @@ -1793,8 +2618,7 @@ The cutting disc is shining and very sharp. 절단 디스크가 빛나고 매우 날카롭습니다. Grants significantly increased cutting power for a short time. 짧은 시간 동안 절단력이 크게 증가합니다. -The grinder starts spinning for a short time! Its cutting power is immense! -그라인더가 짧은 시간 동안 회전하기 시작합니다! 그 절단력은 엄청납니다! + Dollmaker's Staff 인형 제작자의 지팡이 @@ -1805,67 +2629,67 @@ You remember this being used on someone else. You are unable to control more than 3 dolls. The new doll is protesting and remains bound. 3개 이상의 인형을 제어할 수 없습니다. 새 인형이 항의하고 묶여 있습니다. + Staff of Incineration 소각의 지팡이 A magical weapon made for intermediates to use. 중급자가 사용할 수 있도록 만들어진 마법 무기. -+25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. -+25% 화염 피해. 화염 피해를 입힙니다. 불타는 적은 매 턴마다 추가로 5의 화염 피해를 입습니다. +### +25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. Offhand: Applies %fire damage bonus. + Staff of Storms 폭풍의 지팡이 -A magical weapon made for intermediates to use. -중급자가 사용할 수 있도록 만들어진 마법 무기. -+20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. -+20% 전기 피해. 전기 피해를 입힙니다. 전기 피해에 맞은 적들은 5x5 지역에 15 추가 전기 피해를 줍니다. +### +20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. Offhand: Applies electric damage bonus. + Staff of Frostbite 동상의 지팡이 A magical weapon with a 33% chance to freeze the target for 4 turns. 33% 확률로 대상을 4턴간 얼리는 마법 무기입니다. -+20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. -+20% 얼음 피해. 얼음 피해를 입힙니다. 얼어붙은 적은 턴당 5의 얼음 피해를 입습니다. +### +20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. Offhand: Applies ice damage bonus. + Staff of Binding 속박의 지팡이 A magical weapon made to use on novices. 초심자가 사용하도록 만들어진 마법 무기입니다. -+20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. -+20% 체인 데미지. 체인 데미지를 입히고 대상을 4턴 동안 속박합니다. 결속 효율이 150% 증가합니다. +### +20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. Offhand: Applies chain damage bonus. Arcane Orb 신비한 오브 Look into my eyes... 내 눈을 들여다... -Deals shadow damage. Can be used without hands. Does not benefit from enemies being vulnerable. -암흑 피해를 입힙니다. 손이 없어도 사용할 수 있습니다. 취약한 적에게 도움이 되지 않습니다. +### Deals arcane damage. Can be used without hands. Can not critically strike. + +You find a purple crystal. You feel your mystic powers flood into it. +자주색 수정을 찾았습니다. 신비한 힘이 그 안에 넘쳐나는 것을 느꼈습니다. Staff of Flame 화염의 지팡이 A magical weapon made for novices to use. 초심자가 사용할 수 있도록 만들어진 마법 무기입니다. -+15% fire damage. Deals fire damage. -+15% 화염 피해. 화염 피해를 입힙니다. +### +15% fire damage. Deals fire damage. Offhand: Applies passive bonus. + Staff of Slime 점액의 지팡이 A slimy and magical implement.. 끈적끈적한 마법 도구.. -+10% glue damage. Deals glue damage. -+10% 글루 데미지. 글루 데미지를 줍니다. +### +10% glue damage. Deals glue damage. Offhand: Applies passive bonus. + Staff of Shocking 충격의 지팡이 -A magical weapon made for novices to use. -초심자가 사용할 수 있도록 만들어진 마법 무기입니다. -+10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. -+10% 전기 피해. 전기 피해를 입힙니다. 10% 확률로 3턴 동안 기절시킵니다. +### +10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. Offhand: Applies electric damage bonus. + Staff of Permafrost 영구동토의 지팡이 A magical weapon with a 15% chance to freeze the target for 4 turns. 15% 확률로 대상을 4턴간 얼리는 마법 무기입니다. -+10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration) -+10% 얼음 피해. 얼음 피해를 입힙니다. 적의 동결 효과 지속 시간이 1.5배 증가합니다(최소 +1 지속 시간) +### +10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration). Offhand: Applies ice damage bonus. + Staff of Chains 사슬의 지팡이 A magical weapon made for novices in the art of bondage. 속박 기술의 초보자를 위해 만들어진 마법 무기입니다. -+10% chain damage. Deals chain damage. 150% binding efficiency. -+10% 사슬 손상. 사슬 손상을 입힙니다. 150% 바인딩 효율성. +### +10% chain damage. Deals chain damage. 150% binding efficiency. Offhand: Applies chain damage bonus. + +You pick up a staff of chains. You have fond memories... +당신은 쇠사슬의 지팡이를 집었습니다. 당신은 좋은 추억을 가지고 있습니다... You pick up a staff of binding. You remember these from wizard school... @@ -1879,28 +2703,27 @@ DOLMAKER라는 이름이 적힌 지팡이를 집습니다. You pick up a staff of frostbite. Your hand feels numb just reaching for it. 당신은 동상에 걸린 지팡이를 집어들었습니다. 당신의 손은 그것에 도달하기만 하면 감각이 마비됩니다. -You pick up a staff of chains. You have fond memories... -당신은 쇠사슬의 지팡이를 집었습니다. 당신은 좋은 추억을 가지고 있습니다... + You pick up a staff of the storm. It tingles. 당신은 폭풍우의 지팡이를 집었습니다. 그것은 따끔 거립니다. You pick up a staff of flames. It feels warm. 당신은 불의 지팡이를 집어 들었다. 따뜻하다. -You find a purple crystal. You feel your mystic powers flood into it. -자주색 수정을 찾았습니다. 신비한 힘이 그 안에 넘쳐나는 것을 느꼈습니다. You pick up a staff of slime. 슬라임 지팡이를 집으십시오. You pick up a staff of permafrost. It feels icy to the touch. 당신은 영구 동토층 지팡이를 집어들었습니다. 만지면 차갑게 느껴집니다. + Crop 수확고 For those unruly subs. 그 제멋대로인 잠수함을 위해. -Deals pain damage. Highly distracting. -고통 피해를 입힙니다. 매우 산만합니다. +### Deals pain damage. Highly distracting. Offhand: +5 pain damage on attack for 3 stamina. + You pick up a riding crop. 승마 작물을 줍습니다. + Scissors 가위 Safety first! @@ -1910,15 +2733,17 @@ Deals slash damage. Better than a knife for cutting restraints. You pick up a pair of scissors. 가위를 집으십시오. + Dagger 단검 Designed with subterfuge in mind. 속임수를 염두에 두고 설계되었습니다. -Deals slash damage. Deals 55 pierce damage instead on unaware targets. -베기 피해를 입힙니다. 알지 못하는 대상에게는 대신 55의 관통 피해를 줍니다. +### Deals slash damage. Deals 40 pierce damage instead on unaware targets, before crit modifiers. Offhand: +10% Base Weapon Crit + You pick up a dagger. 너는 단검을 집는다. + Katana 카타나 She who strikes first, hits second. @@ -1928,6 +2753,7 @@ Deals slash damage. Deals up to 50 bonus damage by waiting 10 turns between atta You pick up a katana. 당신은 카타나를 집습니다. + Shadow's Edge 그림자의 가장자리 For those who truly devote themselves to the cause. @@ -1937,17 +2763,19 @@ Deals shadow damage. Damage is doubled against enemies that are in shadow. You pick up Shadow's Edge. 당신은 Shadow's Edge를 선택합니다. + Stormbreaker 스톰브레이커 I have the power! Taking electric damage charges you (1 turn/10dmg). 나에게 힘이 있다! 전격 데미지를 입으면 차지(1턴/10데미지). -Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. -충돌 피해를 입힙니다. 충전 시 해당 지역에 최대 +40의 추가 전기 피해를 입힙니다. +### Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. Gives +100 Electric Resist when held. (can be wielded offhand to apply the Electric Resist) + You pick up Stormbreaker. 당신은 스톰브레이커를 집어들었습니다. + Rapier 레이피어 For the ostentatious and flashy duelist. @@ -1957,6 +2785,7 @@ Deals slash damage. Deals 50 pierce damage instead on vulnerable targets. You pick up some kind of pretentious sword. 당신은 어떤 종류의 허식적인 검을 집어 들었습니다. + Foil 박 En garde! @@ -1966,36 +2795,57 @@ Deals pierce damage. Deals 30 damage instead on vulnerable targets. You pick up a fencing sword. 펜싱 검을 집으십시오. + +### Sledgehammer + +### Do you have what it takes? + +### Deals heavy crush damage and knocks the target back 2 spaces. Deals bonus damage to most solid barricades. + +### You pick up a heavy sledgehammer. + Hammer 망치 -A rather simplistic bludgeoning weapon. -다소 단순한 곤봉 무기입니다. +### A crude way of fixing your problems. + Deals crush damage and knocks the target back. 압살 피해를 입히고 대상을 뒤로 밀쳐냅니다. Flail 도리깨 -A ball on a chain. Very fast and hard to dodge. -사슬에 걸린 공. 매우 빠르고 피하기 어렵습니다. +### Very fast and hard to dodge as long as you know what you're doing. + Also deals 10 damage to targets next to you. Deals crush damage. 옆에 있는 대상에게도 10의 피해를 줍니다. 분쇄 피해를 줍니다. Spear 창 Speak softly and carry a pointy stick. 부드럽게 말하고 뾰족한 막대기를 들고 다니십시오. -Deals pierce damage to the target and one square behind it. -대상과 그 뒤의 한 칸에 관통 피해를 입힙니다. +### Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 2 tiles away. + +### Pike + +### An 11 foot pole, for things you wouldn't want to touch with a 10 foot pole. + +### Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 3 tiles away. + Bolt Cutters 볼트 절단기 -A cutting tool useful as a bludgeon, and also for cutting locks and chains. -곤봉처럼 유용한 절단 도구는 자물쇠와 사슬을 절단하는 데도 사용됩니다. +### The universal key. + Also assists in cutting restraints when equipped. 장착 시 구속 절단에도 도움이 됩니다. -Knife -칼 A go-to for travelers and adventurers. 여행자와 모험가를 위한 곳입니다. -Deals slash damage. -베기 피해를 입힙니다. +### Deals slash damage. Offhand: +10 Block + +### Flashlight + +### A weapon of mass illumination. + +### Provides a highly directional light source. + +### You pick up a flashlight. + Torch 토치 Second only to the mighty towel in usefulness. @@ -2004,22 +2854,22 @@ Deals fire damage. Provides light. 화염 피해를 입힙니다. 빛을 제공합니다. Unarmed 비무장 -Fight with your hands and feet. -손과 발로 싸워라. +### Fight with your hands and feet. Counts as teasing if arms are free. 50% chance to stun target if the target is disarmed. + Deals unarmed damage. 비무장 피해를 입힙니다. Sword 검 -The blade is strong, its edge sharp. -검은 강하고 칼날은 날카롭다. +### the steel is strong, and the blade true. + A fast and accurate weapon that deals slash damage. 베기 피해를 주는 빠르고 정확한 무기입니다. Flamberge 플랑베르주 -A blade forged in a magical fire. -마법의 불로 벼려낸 검. -Deals 20 bonus fire damage on hit. -적중 시 20의 추가 화염 피해를 입힙니다. +### A blade forged in magic fire. + +### Deals 20 bonus slash damage on hit. Offhand: Produces light. + Escort Drone 에스코트 드론 A semi-autonomous drone with a personal defense beam. Does not require hands to equip. @@ -2030,28 +2880,22 @@ Magic Wand 마법의 지팡이 Its powers extend beyond the traditional schools of magic. 그 힘은 전통적인 마법 학교를 넘어섭니다. -Deals charm damage (50% effectiveness vs. non-vulnerable enemies). 20% chance to stun the target for 2 turns. -매력 피해를 입힙니다(취약하지 않은 적에게는 50% 효과). 20% 확률로 대상을 2턴 동안 기절시킵니다. -Feather -깃털 -A feather useful for tickling. -간지럼에 유용한 깃털입니다. -Deals tickle damage (50% effectiveness vs. non-vulnerable enemies). Distracts enemies. -간지러운 피해를 입힙니다(취약하지 않은 적에 대해 50% 효과). 적의 주의를 분산시킵니다. +### Deals charm damage. 20% chance to stun the target for 2 turns. Offhand: +5 charm damage on attack for 3 stamina. + Ice Cube 아이스 큐브 A magical cube of ice that never melts. Convenient! 절대 녹지 않는 마법의 얼음 큐브. 편리합니다! -Deals 10 ice damage with a 10% chance to freeze for 3 turns. -10% 확률로 3턴간 빙결 10 데미지를 줍니다. +### Deals 10 ice damage with a 10% chance to freeze for 1 turn. Slows targets on hit. Offhand: Slows the target. + Rope 로프 A kidnapper's most versatile tool. 납치범의 가장 다재다능한 도구입니다. Deals chain damage and applies 50 points of binding. 체인 데미지를 입히고 바인딩 50점을 적용합니다. -Enchanted Sword -마법에 걸린 검 +### Magic Sword + Slices through ghosts with ease! 유령을 쉽게 베어버리세요! A sword that guides itself toward its target, making it easy to hit with. @@ -2060,32 +2904,38 @@ Dragonslaver 드래곤슬레이버 A powerful weapon with an ancient mechanism that launches binding belts. 속박 벨트를 발사하는 고대 메커니즘을 갖춘 강력한 무기입니다. -Deals slash damage. Drains 0.75% ancient energy to fire a line of belts that deal 40 chain damage and 4 extra binding. -베기 피해를 줍니다. 0.75%의 고대 에너지를 소모하여 40의 사슬 피해와 4의 추가 결속을 제공하는 일련의 벨트를 발사합니다. +### Deals slash damage. Can make ranged attacks.. Drains 0.75% ancient energy to fire a line of belts that deal 40 chain damage and 40 binding. + Metamorphosis 변형 -You can enter slime form for 25 turns, which lets you pass thru bars, +50% evasion, and deals 25 glue damage when attacked. -25턴 동안 슬라임 형태로 들어갈 수 있으며, 철창을 통과할 수 있고 회피율이 50% 증가하며 공격을 받을 때 25의 글루 피해를 줍니다. -Deals glue damage. Roots targets for 2 turns on a hit. -글루 피해를 입힙니다. 명중 시 2턴 동안 대상을 묶습니다. +### You can enter slime form for 25 turns, which lets you pass thru bars, +50 Evasion, and deals 25 glue damage when attacked. + +### Deals glue damage. Roots targets for 2 turns on a hit. Offhand: Roots targets on hit. + Four Seasons 사계절 Activate to reduce the cost of your next fire, water/ice, air/lightning, and earth spell by 50, once per element. 활성화하면 다음 불, 물/얼음, 공기/번개, 대지 주문의 비용이 요소당 한 번씩 50 감소합니다. -Deals shadow damage. +25% fire, ice, acid, crush, electric, pressure damage. -그림자 피해를 입힙니다. 화염, 얼음, 산, 분쇄, 전기, 압력 ​​피해 +25%. +### Deals shadow damage. +25% fire, ice, soap, crush, electric, blast damage. Offhand: Applies passive bonus. + The Arbiter 심판자 I have altered the rules. Pray I do not alter them further. 규칙을 변경했습니다. 더 이상 변경하지 않도록 기도해 주십시오. -Deals chain damage with 200% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Ranged attack: Disarm -200% 바인딩 효율로 체인 데미지를 입히고, 소환 시 +40 암흑 데미지. +25% 글루 및 체인 데미지. 원거리 공격: 무장 해제 -Bondage Buster -본디지 버스터 -Can fire a beam (1 turn channel) that deals 30 electric damage, but charges when not fired, dealing 90 total damage at 10 turns of charge. -30의 전기 피해를 주는 빔(1턴 채널)을 발사할 수 있지만, 발사하지 않으면 충전되어 10턴 충전 시 총 90의 피해를 입힙니다. +### Deals chain damage with 125% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Weapon Ability: Disarm + +Bondage Buster EX +본디지 버스터 EX +### Can fire a beam (1 turn channel) that deals 30 electric damage and applies an equal amount of energy bondage. Charges when not fired, dealing 90 total damage at 10 turns of charge. + Melee mode deals tickle damage and marks enemies as vulnerable for 4 turns. 근접 모드는 간지럼 피해를 입히고 4턴 동안 적을 취약한 것으로 표시합니다. +### Bondage Buster MK II + +### Can fire a beam (3 turn channel) that deals 35 electric damage in an area and applies an equal amount of energy bondage. While charge is below 50%, has a 10% chance to misfire. + +### Melee mode deals tickle damage and marks enemies as vulnerable for 2 turns. + Nevermere Blaster 네버미어 블래스터 Can fire a blast that deals 25 electric damage. @@ -2104,70 +2954,74 @@ Can fire an arrow that makes an enemy extremely lustful, causing them to attack 적을 극도로 음란하게 만들어 다른 사람을 공격하게 만드는 화살을 발사할 수 있습니다. 하급 적에게는 영원히 지속되며, 높은 레벨의 적에게는 30턴, 보스에게는 10턴이 지속됩니다. Moirai's Scissors 모이라이의 가위 -While you have ancient energy, this weapon attacks twice. -고대의 기운이 있는 동안 이 무기는 두 번 공격합니다. -Deals slash damage. Adds up to 30 bonus psychic damage her hit by converting binding into damage. -베기 피해를 입힙니다. 속박을 피해로 변환하여 적중 시 최대 30의 추가 정신 피해를 추가합니다. +### Cutting the threads of fate. + +### Deals slash damage. Ignores up to 100 Magic and Physical armor. Active ability: Spend 50 charge to free all nearby allies and disrobe enemies, increasing charm damage on them by 100% and applying the armor shred. + +### With a single snip of the magic scissors, everyone's clothes fall off. + +### No eligible targets within 4 tiles + Latex Projector 라텍스 프로젝터 Deals crush damage. Can be used to spray a '+' shaped pool of slime. 압살 피해를 입힙니다. '+' 모양의 슬라임 웅덩이를 뿌리는 데 사용할 수 있습니다. -Drains 1.5% ancient energy to create a pool of slime that deals 35 glue damage per tile and slows enemies. -1.5%의 고대 에너지를 소모하여 타일당 35의 접착제 피해를 입히고 적의 속도를 늦추는 점액 웅덩이를 만듭니다. -Enchanted Axe -마법에 걸린 도끼 +### Spend 15 charge to create a pool of slime that deals 35 glue damage per tile and slows enemies. + +### Magic Axe + Sick and vile, like the hearts of your enemies. 원수의 심장처럼 병들고 사악합니다. -Deals shadow damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns. -대상에게 암흑 피해를 입히고 옆에 있는 적에게 20의 암흑 피해를 줍니다. 3턴 동안 둔화시킵니다. +### Deals slash damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns and applies 60 shadow damage bleed over time to enemies around you. + Pickaxe 곡괭이 Used for drilling holes in rock and armor. 바위와 갑옷에 구멍을 뚫는 데 사용됩니다. Deals pierce damage. Reduces enemy armor by 15 for 6 turns. 관통 피해를 줍니다. 6턴 동안 적의 방어력을 15 감소시킵니다. -Enchanted Flail -마법에 걸린 도리깨 +### Magic Flail + A blessed censer that distributes pain equally. 고통을 고르게 나눠주는 축복받은 향로. -Deals crush damage to the target and all enemies near the target. -대상과 대상 주변의 모든 적에게 크러쉬 데미지를 줍니다. -Enchanted Spear -마법에 걸린 창 +### Deals crush damage. Deals 20 bonus holy damage to the target and enemies near the target. + +### Magic Spear + Seeks and pierces hearts with ease. 쉽게 마음을 찾고 꿰뚫는다. -Deals pierce damage to the target and two squares behind it. -대상과 그 뒤의 두 칸에 관통 피해를 입힙니다. -Enchanted Hammer -마법에 걸린 망치 +### Deals pierce damage to the target and two squares behind it. Can be used to make a ranged attack. + +### Magic Hammer + Made of a magical, resonant material. 마법적이고 공명하는 재료로 만들어졌습니다. Deals crush damage and knocks the target back. Helps to bash open restraints while cutting. 압살 피해를 입히고 대상을 뒤로 밀쳐냅니다. 자르는 동안 열린 구속을 부수는 데 도움이 됩니다. -IceBreaker -쇄빙선 -A frigid lightweight hammer with a spike on the end. -끝에 가시가 달린 차갑고 가벼운 망치입니다. +### Icebreaker + +### A frigid magical hammer useful for both climbing up and destroying ice. + Deals crush damage. Deals 3x damage to frozen targets instead of 2x. Triggers Shatter. 압살 피해를 줍니다. 얼어붙은 대상에게는 2배가 아닌 3배의 피해를 줍니다. 산산조각을 트리거합니다. Dreamcatcher 드림캐쳐 Forged in nightmares, woven in steel. Summons a Shadow Warrior on unaware targets for 2% ancient energy. 악몽 속에서 벼려지고 강철로 짜여져 있습니다. 모르는 대상에게 그림자 전사를 소환하여 2%의 고대 에너지를 얻습니다. -Deals shadow damage. Deals up to 30 bonus psychic damage on unaware (100%) or vulnerable (50%) targets. -암흑 피해를 입힙니다. 알지 못하거나(100%) 취약한(50%) 대상에게 최대 30의 추가 정신 피해를 입힙니다. +### Deals shadow damage. Deals up to 30 bonus psychic damage on unaware (100%) or vulnerable (50%) targets. + Axe 도끼 Great for cutting trees that happen to be underground. 우연히 지하에 있는 나무를 베는 데 좋습니다. Also deals 20 damage to enemies next to you. Deals slash damage. 옆에 있는 적에게도 20의 피해를 줍니다. 참격 피해를 입힙니다. -Knife -칼 -Unarmed -비무장 -Accuracy: -정확성: +### Accuracy: + +### Crit Multiplier: + +### Bind Crit Multiplier: + Find the keys.. 열쇠를 찾아라.. Find the exit! @@ -2176,18 +3030,18 @@ You are receiving help from a friendly ally. 당신은 우호적인 동맹으로부터 도움을 받고 있습니다. You found a hook you can use to pull on straps and loops. 스트랩과 루프를 당기는 데 사용할 수 있는 후크를 찾았습니다. -You have access to something sharp and can attempt to cut restraints. -당신은 날카로운 것에 접근할 수 있고 구속을 끊으려고 시도할 수 있습니다. +### You have access to something sharp and can attempt to Cut restraints, or Remove more effectively. + You found a corner to help manipulate buckles and snaps with. 버클과 스냅을 조작하는 데 도움이 되는 모서리를 찾았습니다. You found a crack and could maybe wedge a knife or tool into it to keep it still. 균열을 발견하고 칼이나 도구를 쐐기로 고정하여 고정시킬 수 있습니다. You found something sticky and might be able to pull off fabrics. 끈적끈적한 무언가를 찾았고 천을 떼어낼 수 있을지도 모릅니다. -Evasion: -회피: -Visibility: -가시성: +### Evasion: + +### Visibility: + Submissive: Enemies won't attack you, but they will try to play with you. @@ -2211,6 +3065,7 @@ Immobile! Enclosed! 에워싸는! + You feel a gentle buzz... 잔잔한 울림이 느껴진다... Your toys tease you gently... @@ -2224,18 +3079,22 @@ Your toys vibrate intensely! The vibration is torturous! 진동은 고문입니다! + Edged! 가장자리! -Satisfied~ -만족~ +### Satisfied. Miscast chance is reduced. + + + +### Damage: + +### Bind: + +### Crit: +### SP Cost: -Damage: -손상: -Accuracy: -정확성: -SP Cost: -SP 비용: +### Cut PWR: AMNT% It appears to be a receptacle 수납장인것 같습니다 @@ -2247,8 +3106,8 @@ You place the crystal into the receptacle and it lights up! 크리스탈을 콘센트에 넣으면 불이 들어옵니다! You take the crystal from the receptacle and all goes dark. 당신은 용기에서 수정을 가져오고 모든 것이 어두워집니다. -You try to take the crystal but the cage around it is secured with a purple lock. -당신은 수정을 가져가려고 하지만 그 주위의 우리는 보라색 자물쇠로 잠겨 있습니다. +### You try to take the crystal but the cage around it is secured with a magic purple lock. + Place spent crystal 사용한 크리스탈 배치 VALUE gold vanishes from your satchel as the receptacle explodes and your crystal is recharged! @@ -2256,12 +3115,14 @@ VALUE gold vanishes from your satchel as the receptacle explodes and your crysta Nothing seems to happen 아무 일도 일어나지 않는 것 같아 + The EnemyName grabs you by the RestraintName and keeps you in place! EnemyName은 RestraintName으로 당신을 붙잡고 당신을 제자리에 유지합니다! The EnemyName grabs you and pulls you!!! EnemyName이 당신을 잡고 끌어당깁니다!!! The EnemyName misses you! EnemyName이 당신을 그리워합니다! +### You duck under the EnemyName's attack! You hear a door creak open nearby! 근처에서 문이 삐걱거리는 소리가 들립니다! @@ -2272,29 +3133,38 @@ You hear a door slam shut nearby! You hear a door being shut in the distance. 멀리서 문이 닫히는 소리가 들립니다. + The slime is spreading over your body!!! 점액이 온몸에 퍼진다!!! The slime starts to harden over your skin... 슬라임이 피부 위에서 딱딱해지기 시작합니다... -Angel Courier -엔젤 택배 -You oneshotted her. What kind of devil are you??? -당신은 그녀를 원샷했습니다. 당신은 어떤 종류의 악마입니까 ??? -The angel decides to toy with you while you are trussed up. -당신이 묶여 있는 동안 천사가 당신을 가지고 놀기로 결정했습니다. -The angel snaps her fingers and divine restraints appear on your body! -천사가 손가락을 튕기면 신성한 구속이 당신의 몸에 나타납니다! +### The RESTRAINTNAME creates more bindings out of thin air! (+RestraintAdded) + +### A RESTRAINTNAME has appeared around your neck! Beware of additional restraints! + +### The RESTRAINTNAME has run out of bindings to add and has gone dormant for a period of time. + +### Angel -Angel Courier -엔젤 택배 You subdue the angel! 당신은 천사를 정복! -The angel decides to toy with you while you are trussed up. -당신이 묶여 있는 동안 천사가 당신을 가지고 놀기로 결정했습니다. -The angel snaps her fingers and divine restraints appear on your body! -천사가 손가락을 튕기면 신성한 구속이 당신의 몸에 나타납니다! +### The angel decides to toy with you while you are trussed up. (DamageTaken) + +### The angel snaps her fingers and divine restraints appear on your body! (+RestraintAdded) + +### The angel snaps her fingers and glowing locks appear on your body! + +### Holy Construct + +### You banish the holy construct! + +### The holy construct emits a searing light! (DamageTaken) + +### The holy construct emits a blinding light! (DamageTaken) + +### The holy construct emits a Binding light! (+RestraintAdded) Be not afraid! I am the courier of a local shrine, and I have come to take your offering. 두려워하지 마십시오! 나는 지역 신사의 택배입니다. 당신의 제물을 받으러 왔습니다. @@ -2313,21 +3183,28 @@ For I will first have a little fun... You have brought this upon yourself, after all. 결국 자네가 자초한 일이군. + The angel frowns as you attack her, and glowing rings appear. 당신이 그녀를 공격하자 천사가 눈살을 찌푸리고 빛나는 고리가 나타납니다. + Angel: MMMMMPHH!!! 천사: 으으으읍으읍읍!!! + (The angel looks puzzled and unlocks your divine restraints) (천사가 의아해하며 당신의 신성한 구속을 풀어줍니다) -Your ArmorName blocks the EnemyName's attack, falling off in the process. -당신의 ArmorName이 EnemyName의 공격을 막고 그 과정에서 떨어져 나갑니다. -The EnemyName attacks you, but you block the attack! -EnemyName이 당신을 공격하지만 당신은 공격을 막습니다! -Blocked! -막힌! + +### The EnemyName pulls away your ArmorName!!! + +### There was a bug removing your ArmorName. Please report! + +### The EnemyName bypasses your security to add the RestraintName! + +### The EnemyName tries to restrain you, but you resist the bondage! + +### Resist! Mystic Lock 신비한 자물쇠 @@ -2335,8 +3212,7 @@ The mystic lock fades, allowing you to pass once more. 신비한 자물쇠가 사라져 한 번 더 통과할 수 있습니다. As you cross the threshold, a mystical lock appears to prevent you from stepping back! 문지방을 넘으면 뒤로 물러서지 못하도록 신비한 자물쇠가 나타납니다! -As you cross the threshold, a mystical lock appears to prevent you from stepping back! -문지방을 넘으면 뒤로 물러서지 못하도록 신비한 자물쇠가 나타납니다! + Metal Shield 금속 실드 @@ -2347,6 +3223,7 @@ A metal shield blocks your way! Several metal shields block your way! 여러 개의 금속 방패가 길을 막고 있습니다! + Illusion 환각 The illusion vanishes into thin air. @@ -2355,6 +3232,10 @@ Wall 벽 The wall shatters into pieces, which fade away slowly. 벽이 조각조각 부서지고 조각조각 천천히 사라집니다. +### Locked Door + +### The door lock shatters into pieces. + Earthen Monolith 흙 기둥 The monolith recedes into the ground. @@ -2367,8 +3248,6 @@ Familiar 친숙한 The familiar dissolves into spectral ash. 친근한 것이 유령의 재로 녹아듭니다. -Latex Doll -라텍스 인형 The doll gives in to her desires and squirms around on the ground. 인형은 그녀의 욕망에 굴복하고 땅 위에서 꿈틀거립니다. Storm Crystal @@ -2400,6 +3279,11 @@ Allied Golem The words vanish from the golem's forehead as it crashes down. 골렘이 추락하면서 이마에서 단어가 사라집니다. + +### Shopkeeper + +### You have done a terrible deed. + Crystal Monolith 크리스탈 모노리스 The crystal fades from the monolith. @@ -2413,9 +3297,11 @@ The Orb Guardian dissolves into sand and bone dust. + You feel like you have made a grave mistake. 중대한 실수를 저지른 것처럼 느껴집니다. + Zombie 좀비 The zombie moans and collapses to the ground. @@ -2425,6 +3311,7 @@ The zombie's charms attach to your body (+RestraintAdded) The zombie caresses your body! (DamageTaken) 좀비가 당신의 몸을 어루만집니다! (DamageTaken) + Maidforce Recruit 메이드포스 모집 The maid does a fumbled retreat. @@ -2436,51 +3323,47 @@ The maid snaps a lock on one of your restraints! (DamageTaken) The maid tickles you with her feather duster! (DamageTaken) 메이드가 깃털 먼지털이로 당신을 간지럽힙니다! (DamageTaken) + M.F. 'Unseen Blade' M.F. '보이지 않는 칼날' The maid runs back to the shadows. 하녀가 그림자로 돌아갑니다. The maid uses secure restraints on you! (+RestraintAdded) 메이드가 안전 구속을 사용합니다! (+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -하녀가 당신의 구속 중 하나에 자물쇠를 걸었습니다! (DamageTaken) The maid stealthily rubs your sensitive areas! (DamageTaken) 메이드가 당신의 민감한 부분을 살금살금 문질러줍니다! (DamageTaken) + The maid throws a smoke bomb at the ground! 메이드가 땅에 연막탄을 던집니다! -M.F. 'Unseen Blade' -M.F. '보이지 않는 칼날' -The maid does a fumbled retreat. -하녀가 어설프게 후퇴합니다. + The maid rubs you from many angles! (DamageTaken) 메이드가 여러 각도에서 당신을 문지릅니다! (DamageTaken) + M.F. 'Going Loud' M.F. '큰 소리로' -The maid does a fumbled retreat. -하녀가 어설프게 후퇴합니다. -The maid uses secure restraints on you! (+RestraintAdded) -메이드가 안전 구속을 사용합니다! (+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -하녀가 당신의 구속 중 하나에 자물쇠를 걸었습니다! (DamageTaken) The maid lands a kick and stuns you! (DamageTaken) 메이드가 당신을 발로 차서 기절시킵니다! (DamageTaken) The maid slaps you with a scornful expression! (DamageTaken) 메이드가 비웃는 표정으로 뺨을 때린다! (DamageTaken) + +### Heavy Weapons Maid + +### The maid drops her weapon and runs. + +### The maid bonks you with her weapon! (DamageTaken) + M.F. 'Parasol' M.F. '파라솔' The maid leaps out of sight. 하녀가 시야에서 사라진다. -The maid uses secure restraints on you! (+RestraintAdded) -메이드가 안전 구속을 사용합니다! (+RestraintAdded) -The maid snaps a lock on one of your restraints! (DamageTaken) -하녀가 당신의 구속 중 하나에 자물쇠를 걸었습니다! (DamageTaken) The maid caresses your breasts with a smile! (DamageTaken) 메이드가 미소로 당신의 가슴을 애무합니다! (DamageTaken) + M.F. 'Master Plan' M.F. '기본 계획' The head maid surrenders gracefully. @@ -2494,6 +3377,7 @@ The head maid tickles you strategically! (DamageTaken) You are distracted for a moment and suddenly you find yourself in chastity! 당신은 잠시 주의가 산만해졌는데 갑자기 순결한 자신을 발견하게 됩니다! + Fire Elemental 불의 정령 The fire elemental dissolves into ash. @@ -2514,17 +3398,17 @@ The ranger gropes your chest with a smile on her face! (DamageTaken) 레인저는 웃는 얼굴로 당신의 가슴을 더듬는다! (DamageTaken) The ranger surprises you and binds you! (+RestraintAdded) 레인저가 당신을 놀라게 하고 묶습니다! (+RestraintAdded) +### The ranger slips a lock onto one of your restraints! (DamageTaken) Druid of the Wild 야생의 드루이드 The druid calls forth vines to mask her retreat. 드루이드는 그녀의 후퇴를 가리기 위해 덩굴을 불러냅니다. -The druid calls forth vines to mask her retreat. -드루이드는 그녀의 후퇴를 가리기 위해 덩굴을 불러냅니다. The druid holds your face and kisses you! (DamageTaken) 드루이드는 당신의 얼굴을 잡고 키스합니다! (DamageTaken) The druid binds you with mithril restraints! (+RestraintAdded) 드루이드는 미스릴 구속으로 당신을 속박합니다! (+RestraintAdded) +### The druid tosses a lock from her cloak! It finds you and fastens with a click. (DamageTaken) Water Elemental 물의 정령 @@ -2532,11 +3416,14 @@ The water elemental melts into a pool of water. 물의 정령이 녹아 물웅덩이가 됩니다. The water elemental's song compels you to be bound! (+RestraintAdded) 워터 엘리멘탈의 노래가 당신을 결박하게 합니다! (+RestraintAdded) +### The water elemental sings a song of helplessness. (DamageTaken) + The water elemental's song compels you to step forward and receive a binding! 워터 엘레멘탈의 노래가 당신을 앞으로 나아가게 하고 구속을 받도록 합니다! The water elemental sings an arousing song! (DamageTaken) 물의 정령이 신나는 노래를 부른다! (DamageTaken) + Ice Elemental 아이스 엘리멘탈 The ice elemental melts into a pool of water. @@ -2548,6 +3435,7 @@ The ice elemental creates icy locks on your restraints! The ice elemental gives a chilling touch to your body! (DamageTaken) 얼음의 정령이 당신의 몸을 오싹하게 합니다! (DamageTaken) + Earth Elemental 대지의 정령 The earth elemental sinks into the ground. @@ -2558,8 +3446,9 @@ The earth elemental locks a restraint! 대지의 정령이 속박을 잠급니다! The earth elemental dashes through the earth! 대지의 정령이 대지를 질주한다! -The earth elemental gives you a heavy massage! (DamageTaken) -대지의 정령이 무거운 마사지를 해줍니다! (DamageTaken) +### The earth elemental gives you a soft massage! (DamageTaken) + + Air Elemental 에어 엘리멘탈 @@ -2569,8 +3458,8 @@ The air elemental sneakily slips a restraint on! (+RestraintAdded) 공기의 정령이 살금살금 속박을 걸었습니다! (+RestraintAdded) The air elemental blinks to your position! 공기의 정령이 당신의 위치를 ​​점멸합니다! -The air elemental slips a lock on! -공기의 정령이 잠금을 해제합니다! +### The air elemental slips a lock on! (DamageTaken) + The air elemental spanks you playfully! (DamageTaken) 공기의 정령이 당신을 장난스럽게 때립니다! (DamageTaken) @@ -2584,14 +3473,28 @@ The zombie swiftly wraps you in charms! (+RestraintAdded) The zombie gropes your body! (DamageTaken) 좀비가 당신의 몸을 더듬고 있습니다! (DamageTaken) -Zombie -좀비 -The zombie screams and tumbles to the floor. -좀비가 비명을 지르며 바닥으로 굴러떨어집니다. -The zombie swiftly wraps you in charms! (+RestraintAdded) -좀비는 매력으로 당신을 빠르게 감싸줍니다! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -좀비가 당신의 몸을 더듬고 있습니다! (DamageTaken) + +### Support Drone + +### The support drone retreats to recharge its weapon! + +### The support drone zaps you! (DamageTaken) + +### The Dollmaker commands a drone to attack you! + +### The Dollmaker commands her drones to attack you! + +### Capture Drone + +### The capture drone's latex core overloads! + +### The capture drone grapples you! (DamageTaken) + +### The capture drone wraps you in advanced cables! (+RestraintAdded) + +### The Dollmaker commands a drone to capture you! + +### The Dollmaker commands her drones to capture you! Artistic Zombie 예술적 좀비 @@ -2599,6 +3502,8 @@ The zombie smiles as it collapses to the ground. 좀비가 땅에 쓰러지면서 웃는다. The zombie swiftly ties you! (+RestraintAdded) 좀비가 당신을 재빨리 묶습니다! (+RestraintAdded) +### The zombie is somehow dextrous enough to lock your restraint! (DamageTaken) + The zombie cuddles with your body! (DamageTaken) 좀비가 당신의 몸을 껴안습니다! (DamageTaken) @@ -2609,8 +3514,7 @@ The zombie frowns and disappears in a puff of ice and ribbons. 좀비가 눈살을 찌푸리더니 얼음과 리본을 흩뿌리며 사라진다. The zombie smiles as she wraps you in charms! (+RestraintAdded) 좀비가 당신을 매력으로 감싸며 웃는다! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -좀비가 당신의 몸을 더듬고 있습니다! (DamageTaken) +### The zombie's ribbons form magical locks on your body! (DamageTaken) Talisman Zombie 탈리스만 좀비 @@ -2618,19 +3522,19 @@ The zombie pouts and puts up a shield to let her retreat. 좀비는 입을 삐죽거리며 그녀가 후퇴할 수 있도록 방패를 세웁니다. The zombie giggles as she wraps you in charms! (+RestraintAdded) 좀비는 매력으로 당신을 감싸며 낄낄거립니다! (+RestraintAdded) -The zombie gropes your body! (DamageTaken) -좀비가 당신의 몸을 더듬고 있습니다! (DamageTaken) +### The zombie uses a sealing spell to create magical locks! (DamageTaken) Warrior Zombie 워리어 좀비 -The Warrior zombie yells and falls cinematically. -워리어 좀비가 소리를 지르고 영화처럼 쓰러집니다. -The Warrior zombie uses a traditional binding technique (+RestraintAdded) -전사 좀비는 전통적인 결속 기술을 사용합니다(+RestraintAdded) -The Warrior zombie strikes you with her wooden sword! (+STUN) -워리어 좀비가 목검으로 당신을 공격합니다! (+STUN) -The Warrior zombie runs its fingers along your body! (DamageTaken) -워리어 좀비가 당신의 몸을 따라 손가락을 움직입니다! (DamageTaken) +### The warrior zombie yells and falls cinematically. + +### The warrior zombie uses a traditional binding technique (+RestraintAdded) + +### The warrior zombie strikes you with her wooden sword! (+STUN) + +### The warrior zombie runs its fingers along your body! (DamageTaken) + +### The warrior zombie fights using the way of Sword and Lock. (DamageTaken) Rope Artist 로프 아티스트 @@ -2638,30 +3542,35 @@ The rope artist frowns and walks away, looking defeated. 로프 예술가는 눈살을 찌푸리며 패배한 듯 자리를 떴다. The rope artist performs an intricate technique! (+RestraintAdded) 로프 예술가가 복잡한 기술을 수행합니다! (+RestraintAdded) +### The rope artist sneaks a lock onto you while you weren't looking! (DamageTaken) + The rope artist smiles and tickles your feet! (DamageTaken) 로프 예술가가 웃으며 발을 간지럽힌다! (DamageTaken) + Deputy 대리인 -The Deputy surrenders her donuts. -대리인은 그녀의 도넛을 포기합니다. -The Deputy slaps on some cuffs! (+RestraintAdded) -대리인이 일부 수갑을 때립니다! (+RestraintAdded) -The Deputy tases you! (Stunned!) -대리인이 당신을 맛본다! (기절!) -The Deputy conducts a strip search! (DamageTaken) -대리인 알몸 수색! (DamageTaken) +### The deputy surrenders her donuts. + +### The deputy slaps on some cuffs! (+RestraintAdded) + +### The deputy tases you! (Stunned!) + +### The deputy conducts a strip search! (DamageTaken) + +### The deputy performs a security enhancement procedure! (DamageTaken) Ninja Warrior 닌자 전사 -The warrior retreats into the shadows. -전사는 그림자 속으로 후퇴합니다. -The warrior uses a traditional binding technique (+RestraintAdded) -전사는 전통적인 결속기법을 사용한다(+RestraintAdded) -The warrior tosses a shuriken and hits you! (Stunned!) -전사가 수리검을 던져 때린다! (기절!) -The warrior uses a subduing technique! (DamageTaken) -전사는 제압하는 기술을 사용합니다! (DamageTaken) +### The ninja warrior retreats into the shadows. + +### The ninja warrior uses a traditional binding technique (+RestraintAdded) + +### The ninja warrior tosses a shuriken and hits you! (Stunned!) + +### The ninja warrior uses a lock to give herself the upper hand! (DamageTaken) + +### The ninja warrior uses a subduing technique! (DamageTaken) Ninja Assassin 닌자 암살자 @@ -2671,6 +3580,7 @@ The assassin uses a traditional binding technique (+RestraintAdded) 암살자는 전통적인 바인딩 기술을 사용합니다(+RestraintAdded) The assassin uses a subduing technique! (DamageTaken) 암살자는 제압하는 기술을 사용합니다! (DamageTaken) +### The assassin stealthily locks your restraint! (DamageTaken) Animated Armor 움직이는 갑옷 @@ -2681,6 +3591,7 @@ The Animated Armor는 당신을 족쇄로 구속합니다(+RestraintAdded) The Animated Armor hugs your body with an iron grip! (DamageTaken) Animated Armor는 강철 손잡이로 몸을 감싸줍니다! (DamageTaken) + Mimic 미믹 The mimic spills out its contents. @@ -2690,6 +3601,7 @@ The mimic spits out a restraint which latches onto you! (+RestraintAdded) The mimic tickles you with its tongue! (DamageTaken) 미믹이 혀로 당신을 간지럽힙니다! (DamageTaken) + Skeleton 해골 The Skeleton falls to pieces. @@ -2699,6 +3611,7 @@ The Skeleton restrains you! (+RestraintAdded) The Skeleton tackles you! (DamageTaken) 해골이 당신을 공격합니다! (DamageTaken) + Dragonheart Initiate 드래곤하트 수습생 The Dragonheart Initiate retreats hurriedly. @@ -2707,6 +3620,7 @@ The Dragonheart Initiate apprehends you! (+RestraintAdded) Dragonheart Initiate가 당신을 체포합니다! (+RestraintAdded) The Dragonheart Initiate squeezes your body! (DamageTaken) Dragonheart Initiate가 당신의 몸을 조입니다! (DamageTaken) +### The Dragonheart locks your restraint! (DamageTaken) Dragonheart Shield 용심장 방패 @@ -2719,6 +3633,7 @@ Dragonheart Shield가 당신을 괴롭힙니다! (DamageTaken) The Dragonheart Shield squeezes your body! (DamageTaken) Dragonheart Shield가 몸을 조입니다! (DamageTaken) + Ice Dragonheart 아이스 드래곤하트 The Ice Dragonheart retreats in a blast of snow. @@ -2727,6 +3642,7 @@ The Ice Dragonheart apprehends you! (+RestraintAdded) 얼음 드래곤하트가 당신을 체포합니다! (+RestraintAdded) The Ice Dragonheart gives your body a cold touch! (DamageTaken) 아이스 드래곤하트가 당신의 몸을 차갑게 만져줍니다! (DamageTaken) +### The Dragonheart uses an icy lock on your restraint! (DamageTaken) Poison Dragonheart 포이즌 드래곤하트 @@ -2738,6 +3654,7 @@ The Poison Dragonheart smacks you with her axe! (DamageTaken) 포이즌 드래곤하트가 그녀의 도끼로 당신을 때립니다! (DamageTaken) The Poison Dragonheart thrums her claws across your figure! (DamageTaken) 포이즌 드래곤하트가 발톱으로 당신의 몸을 칩니다! (DamageTaken) +### The Dragonheart locks your restraint using natural magics! (DamageTaken) Crystal Dragonheart 크리스탈 드래곤하트 @@ -2747,6 +3664,7 @@ The Crystal Dragonheart apprehends you! (+RestraintAdded) 크리스탈 드래곤하트가 당신을 체포합니다! (+RestraintAdded) The Crystal Dragonheart squeezes you in a big hug! (DamageTaken) 크리스탈 드래곤하트가 당신을 꼭 껴안습니다! (DamageTaken) +### The Dragonheart grows a crystalline lock on your restraints! (DamageTaken) Many crystals rise up out of the ground! 많은 수정이 땅에서 올라옵니다! @@ -2755,16 +3673,11 @@ A crystal rises up out of the ground! + Statue 동상 The statue topples over! 조각상이 쓰러졌다! -Statue -동상 -The statue topples over and reveals a mechanism! -조각상이 쓰러지고 메커니즘이 드러납니다! -Statue -동상 The statue topples over and reveals a mechanism! 조각상이 쓰러지고 메커니즘이 드러납니다! The statue shoves a gag into your mouth, which inflates to fill the space! (+RestraintAdded) @@ -2772,34 +3685,31 @@ The statue shoves a gag into your mouth, which inflates to fill the space! (+Res The statue kisses your gag! (DamageTaken) 조각상이 당신의 개그에 키스합니다! (DamageTaken) + Chaotic Crystal 혼돈의 수정 The crystal shatters! 크리스탈이 부서진다! -The chaotic crystal leeches willpower from you! (DamageTaken) -혼돈의 수정 거머리가 당신에게서 의지력을 얻습니다! (DamageTaken) +### The chaotic crystal leeches energy from you! (DamageTaken) Grand Chaotic Crystal 대혼돈의 수정 The grand crystal shatters! 대형 수정이 부서진다! -The grand crystal leeches willpower from you! (DamageTaken) -그랜드 크리스탈 거머리가 당신에게서 의지력을 얻습니다! (DamageTaken) +### The grand crystal leeches energy from you! (DamageTaken) + Crystals erupt from the ground and slowly grow around your limbs! (+RestraintAdded) 크리스탈이 땅에서 분출하여 팔다리 주변에서 천천히 자랍니다! (+RestraintAdded) + Soul Crystal 소울 크리스탈 The crystal shatters into a puff of soul dust! 수정이 산산이 부서져 영혼의 가루가 흩어집니다! -The soul crystal leeches willpower from you! (DamageTaken) -영혼 수정이 당신의 의지력을 흡수합니다! (DamageTaken) +### The soul crystal leeches strength from you! (DamageTaken) + Active Soul Crystal 액티브 소울 크리스탈 -The crystal shatters into a puff of soul dust! -수정이 산산이 부서져 영혼의 가루가 흩어집니다! -The soul crystal leeches willpower from you! (DamageTaken) -영혼 수정이 당신의 의지력을 흡수합니다! (DamageTaken) Shadow Dragonheart @@ -2808,11 +3718,18 @@ The Shadow Dragonheart frowns and runs away. 그림자 용심장이 눈살을 찌푸리며 달아난다. The Shadow Dragonheart apprehends you! (+RestraintAdded) 그림자 드래곤하트가 당신을 체포합니다! (+RestraintAdded) +### The Shadow Dragonheart conjures a shadowly lock! (DamageTaken) + The Shadow Dragonheart extends her scythe and pulls you closer!!! 그림자 드래곤하트가 낫을 뻗어 당신을 가까이 끌어당깁니다!!! The Shadow Dragonheart catches you with her scythe! (DamageTaken) 그림자 용심장이 낫으로 당신을 붙잡습니다! (DamageTaken) + + + + + Dragonheart Leader 드래곤하트 리더 The Dragonheart Leader admits defeat. @@ -2823,6 +3740,8 @@ The Dragonheart Leader dashes to you! 드래곤하트 리더가 당신을 향해 돌진합니다! The Dragonheart Leader squeezes your body! (DamageTaken) 드래곤 하트 리더가 당신의 몸을 조입니다! (DamageTaken) +### The Dragonheart Leader uses a lock on you! (DamageTaken) + Rebel Scum! @@ -2836,16 +3755,6 @@ Dragonheart Rebel이 당신을 체포합니다! (+RestraintAdded) The Dragonheart Rebel squeezes your body! (DamageTaken) Dragonheart Rebel이 당신의 몸을 조입니다! (DamageTaken) -Dryad -드라이어드 -The dryad sinks into the ground. -드라이어드가 땅 속으로 가라앉습니다. -The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) -드라이어드가 팔을 뻗어 당신을 덩굴로 감쌉니다! (+RestraintAdded) -The dryad sings a song that mesmerizes you! (DamageTaken) -드라이어드가 당신을 매료시키는 노래를 부릅니다! (DamageTaken) -The dryad tickles you with a leaf! (DamageTaken) -드리야드가 당신을 나뭇잎으로 간지럽힙니다! (DamageTaken) Dryad 드라이어드 @@ -2859,14 +3768,57 @@ The dryad tickles you with a leaf! (DamageTaken) 드리야드가 당신을 나뭇잎으로 간지럽힙니다! (DamageTaken) -Alchemist -연금술사 -The alchemist screams and runs. -연금술사가 비명을 지르며 달려간다. + + +### Highly-Motivated Doll + +### The doll falls to the ground, moaning loudly. + +### The doll rubs her body against yours. You can feel the conduction. (DamageTaken) + +### The doll tackles you and squeezes you with her trembling legs! (DamageTaken) + +### Dollsmith + +### The dollsmith's suit locks her wrists together and renders her helpless. + +### The dollsmith runs a latex-covered finger across your vulnerable body! (DamageTaken) + +### The dollsmith grabs you and applies her favorite doll restraints! (+RestraintAdded) + +### The dollsmith slaps a lock onto your restraints! (DamageTaken) + +### The dollsmith splashes a red latex concoction onto you! (+RestraintAdded) + +### Dollmaker's Apprentice + +### The dollmaker apprentice's suit becomes rigid and locks her limbs in place. + +### The dollmaker's apprentice squeezes your body with her gloved hands! (DamageTaken) + +### The dollmaker's apprentice uses her staff to encase you in doll restraints! (+RestraintAdded) + +### The dollmaker's apprentice slips a lock onto your restraints! (DamageTaken) + +### The dollmaker's apprentice unleashes a powerful latex blast! (+RestraintAdded) + + + +### ...Alchemist? + +### You rescue the alchemist. + The Alchemist restrains you! (+RestraintAdded) 연금술사가 당신을 구속합니다! (+RestraintAdded) The alchemist hugs you in a rubbery embrace! (DamageTaken) 연금술사가 고무 같은 포옹으로 당신을 안아줍니다! (DamageTaken) +### The alchemist uses an ornate-looking lock! (DamageTaken) + +Alchemist +연금술사 +The alchemist screams and runs. +연금술사가 비명을 지르며 달려간다. + Alchemist's Pet 연금술사의 애완동물 @@ -2874,21 +3826,13 @@ The wolfgirl escapes! 늑대소녀 탈출! The wolfgirl lunges at you with a powerful kick! 울프걸이 강력한 발차기로 당신에게 달려듭니다! -The wolfgirl lunges at you with a powerful kick! -울프걸이 강력한 발차기로 당신에게 달려듭니다! The wolfgirl cuddles with you! (DamageTaken) 울프걸이 당신을 껴안고 있어요! (DamageTaken) + Wolfgirl 울프걸 -The wolfgirl escapes! -늑대소녀 탈출! -The wolfgirl lunges at you with a powerful kick! -울프걸이 강력한 발차기로 당신에게 달려듭니다! -The wolfgirl lunges at you with a powerful kick! -울프걸이 강력한 발차기로 당신에게 달려듭니다! -The wolfgirl cuddles with you! (DamageTaken) -울프걸이 당신을 껴안고 있어요! (DamageTaken) + Wolfguard 울프가드 @@ -2896,11 +3840,12 @@ The wolfguard's suit punishes her for poor performance! 울프가드의 수트는 성능 저하로 그녀를 처벌합니다! The wolfguard lunges at you and strikes you! 울프가드가 당신에게 달려들어 공격합니다! -The wolfguard's escort drones electrocute you! (DamageTaken) -울프가드의 호위 드론이 당신을 감전사시킵니다! (DamageTaken) +### The wolfguard's escort drones shock you! (DamageTaken) + The wolfguard's escort drones deploy some restraints! (+RestraintAdded) 울프가드의 호위 드론이 구속을 전개합니다! (+RestraintAdded) + Wolfgirl Trainer 늑대소녀트레이너 The trainer retreats! @@ -2912,6 +3857,7 @@ The wolfgirl trainer secures you in training gear! (+RestraintAdded) The wolfgirl trainer pins you and skillfully locks all of your restraints! 늑대소녀조련사가 당신을 고정시키고 당신의 모든 구속을 능숙하게 잠급니다! + Nevermere Operative 네버미어 오퍼레이티브 The operative does a fumbled retreat! @@ -2923,6 +3869,7 @@ Nevermere Operative가 훈련 장비를 들고 당신을 체포합니다! (+Rest The Nevermere Operative pins you and skillfully locks all of your restraints! 네버미어 오퍼레이티브가 당신을 고정시키고 능숙하게 당신의 모든 구속을 잠급니다! + Trainer's Apprentice 트레이너의 견습생 The trainer's apprentice escapes! @@ -2934,6 +3881,7 @@ The trainer's apprentice secures you in training gear! (+RestraintAdded) The trainer's apprentice adds a lock to your restraints. 트레이너의 견습생이 당신의 구속에 자물쇠를 추가합니다. + The Executive 더 이그제큐티브 The executive surrenders gracefully. @@ -2945,17 +3893,19 @@ The Executive's drones apprehend you! (+RestraintAdded) The Executive's drones apply high-security locks to your restraints! Executive의 드론은 당신의 구속에 높은 보안 잠금 장치를 적용합니다! + Wolf Instructor 늑대 교관 The instructor deploys active camoflague and retreats! 교관이 능동위장을 하고 퇴각! -The instructor disciplies you! (DamageTaken) +The instructor disciplines you! (DamageTaken) 교관이 당신을 징계합니다! (DamageTaken) The instructor applies advanced training gear! (+RestraintAdded) 교관이 고급 트레이닝 장비를 적용! (+Restraint추가) The instructor adds a lock to your restraints. 강사는 구속에 자물쇠를 추가합니다. + Nevermere Drone 네버미어 드론 The drone loses power and falls to the ground! @@ -2965,6 +3915,7 @@ Nevermere 드론이 이륙합니다! You hear buzzing as several Nevermere Drones take to the air! 여러 Nevermere 드론이 공중으로 날아오를 때 윙윙거리는 소리가 들립니다! + Swarm of Tape Drones 테이프 드론 떼 The tape drones lose control and crash all over the place! @@ -2978,6 +3929,7 @@ The tape drones attach additional sticky layers! (DamageTaken) The tape drones circle around you, wrapping you in tape! (+RestraintAdded) 테이프 드론이 당신 주위를 맴돌며 당신을 테이프로 감쌉니다! (+RestraintAdded) + Shield Drone 실드 드론 The drone's power source explodes. @@ -2989,57 +3941,138 @@ Several Shield Drones take flight, their shields interlinking. Drone Explosion 드론 폭발 -Ancient Drone -고대 드론 -The drone fizzles and falls to the ground! -드론이 굉음을 내며 땅에 떨어집니다! -The drone zaps you with a restraining energy ray! (DamageTaken) -드론이 구속 에너지 광선으로 당신을 공격합니다! (DamageTaken) -The drone uses a short-ranged electrocution attack! (DamageTaken) -드론은 단거리 감전사 공격을 사용합니다! (DamageTaken) -The drone deconstructs itself into a set of bindings! -드론이 바인딩 세트로 분해됩니다! - -Ancient Patrol Unit -고대 순찰대 -The patrol unit releases magic smoke and explodes. -순찰대가 마법의 연기를 내뿜으며 폭발한다. -The patrol unit uses a short-ranged electrocution attack! (DamageTaken) -순찰대는 단거리 감전사 공격을 사용합니다! (DamageTaken) -The patrol unit extends its appendages and wraps them around you! -순찰대는 부속지를 뻗어 당신을 감쌉니다! - -Ancient Enforcer Unit -고대 집행자 부대 -The enforcer unit releases magic smoke and explodes. + +### Rusty Drone + +### The drone's mechanisms grind to a halt. + +### The drone uses a short-ranged electric attack! (DamageTaken) + +### The drone disassembles itself, revealing a set of restraining cables! (+RestraintAdded) + +### Rusty Auto Taper + +### The auto taper's mechanisms grind to a halt. + +### The auto taper wraps additional layers of sticky tape! (DamageTaken) + +### The wraps you in many layers of tape! (+RestraintAdded) + +### Rubber Blaster + +### The turret enters an unstable state, about to spread rubber all over! + +### The turret defends itself with a close-range electric attack! (DamageTaken) + +### Rubber Launcher + +### Auto Capture Unit + +### The capture unit releases magic smoke and explodes. + +### The capture unit grabs you securely! (DamageTaken) + +### The capture unit extends its appendages and wraps them around you! (+RestraintAdded) + +### The capture unit releases small drones which lock onto your restraints! (DamageTaken) + +### Auto Tape Unit + +### The tape unit releases magic smoke and explodes. + +### The tape unit applies many layers of tape! (DamageTaken) + +### The tape unit fires off many layers of sticky tape! (+RestraintAdded) + +### The tape unit releases small drones which lock onto your restraints! (DamageTaken) + +### Force Field Unit + +### The forcefield unit releases magic smoke and explodes. + +### The forcefield unit zaps you! (DamageTaken) + +### The forcefield unit extends its appendages and wraps them around you! (+RestraintAdded) + +### The forcefield unit releases small drones which lock onto your restraints! (DamageTaken) + +### Force Field Projector + +### The forcefield erupts into a shower of blue sparks! + +### The robot deploys a forcefield! + +### The robot deploys a set of forcefields! + +### Drone + +The drone fizzles and falls to the ground! +드론이 굉음을 내며 땅에 떨어집니다! +The drone zaps you with a restraining energy ray! (DamageTaken) +드론이 구속 에너지 광선으로 당신을 공격합니다! (DamageTaken) +### The drone attaches to you! (+RestraintAdded) + +### Cyber Warden + +### The cyber warden's suit goes into lockdown, leaving her wiggling helplessly! + +### The cyber warden applies an advanced locking technology! + +### The cyber warden grabs you and applies a self-tightening restraint! (+RestraintAdded) + +### The cyber warden's touch applies a series of quick electrical shocks! (DamageTaken) + +### The cyber warden's touch applies a series of quick electrical shocks! + +### Auto Enforcer Unit + +The enforcer unit releases magic smoke and explodes. 집행부가 마법의 연기를 내뿜으며 폭발한다. The enforcer unit fires many cables that squeeze you! (DamageTaken) 집행 장치는 당신을 압박하는 많은 케이블을 발사합니다! (DamageTaken) -The enforcer fires off restraints that wrap around your body and apprehend you! -집행자가 당신의 몸을 감싼 구속을 발사하고 당신을 체포합니다! +### The enforcer fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) + +### The enforcer releases small drones which lock onto your restraints! (DamageTaken) + +### Artillery Unit + +### The artillery unit releases magic smoke and explodes. + +### The artillery unit fires many cables that squeeze you! (DamageTaken) + +### The artillery fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) + +### The artillery releases small drones which lock onto your restraints! (DamageTaken) The energy bolt hits you and paralyzes you! 에너지 볼트가 당신을 때리고 마비시킵니다! Energy Bolt 에너지 샵 + Alkahestor 알카헤스터 The alkahestor resigns to her fate. alkahestor는 그녀의 운명에 사임합니다. -The Alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded) -Alkahestor가 당신을 감싸는 액체 병을 방출합니다! (+RestraintAdded) +### The alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded) + +### The alkahestor uses an ornate-looking lock! (DamageTaken) + The alkahestor shoves you! (DamageTaken) alkahestor가 당신을 밀었습니다! (DamageTaken) +### ...Alkahestor? + +### You rescue the Alkahestor + +### Latex Homonculus + +### The latex homonculus melts into sticky rubber. + +### The latex homonculus molds itself into restraints! (+RestraintAdded) + +### The latex homonculus slaps you with its appendages! (DamageTaken) + -Latex Elemental -라텍스 엘리멘탈 -The latex elemental melts into sticky rubber. -라텍스 정령이 녹아서 끈적끈적한 고무가 됩니다. -The latex elemental molds itself into restraints! (+RestraintAdded) -라텍스 엘레멘탈이 스스로를 구속합니다! (+RestraintAdded) -The latex elemental slaps you with its appendages! (DamageTaken) -라텍스 엘리멘탈이 부속물로 당신을 때립니다! (DamageTaken) Rope Elemental 로프 엘리멘탈 @@ -3050,6 +4083,7 @@ The rope elemental's limbs lash out at you, wrapping themselves around your body The rope elemental squeezes you tightly! (DamageTaken) 로프 엘리멘탈이 당신을 꽉 조입니다! (DamageTaken) + Leather Elemental 가죽 엘리멘탈 The leather elemental sits down and sulks. @@ -3058,6 +4092,7 @@ The leather elemental wraps her long extremities around your body! (+RestraintAd 가죽 엘리멘탈이 긴 팔다리로 당신의 몸을 감쌉니다! (+RestraintAdded) The leather elemental strikes you with her leather belts! (DamageTaken) 가죽 엘리멘탈이 가죽 벨트로 당신을 공격합니다! (DamageTaken) +### The leather elemental clicks a lock onto your restraints! (DamageTaken) Slime Enthusiast 슬라임 매니아 @@ -3065,8 +4100,9 @@ The slime enthusiast screams and runs. 슬라임 매니아가 비명을 지르며 달려갑니다. The slime enthusiast restrains you! (+RestraintAdded) 슬라임 애호가가 당신을 구속합니다! (+RestraintAdded) -The Slime Enthusiast hugs you in a rubbery embrace! (DamageTaken) -슬라임 매니아가 고무 같은 포옹으로 당신을 안아줍니다! (DamageTaken) +### The slime enthusiast hugs you in a rubbery embrace! (DamageTaken) + +### The slime enthusiast looks happy to make sure your restraints are secure! (DamageTaken) Miner 갱부 @@ -3076,34 +4112,38 @@ The miner restrains you! (+RestraintAdded) 광부가 당신을 구속합니다! (+RestraintAdded) The miner pins you with the haft of her pickaxe! (DamageTaken) 광부가 곡괭이 자루로 당신을 찌르고 있습니다! (DamageTaken) +### The miner pins you with the haft of her pickaxe and adds a lock! (DamageTaken) You hear a fuse going off... 퓨즈가 끊어지는 소리가 들립니다... Miner Bomb 광부 폭탄 -Bandit -적기 + The bandit cries. You should feel bad. 산적이 운다. 기분이 나쁠 것 같다. -Bandit -적기 + The bandit collapses. 적기가 쓰러졌다. The bandit restrains you! (+RestraintAdded) 적기가 당신을 구속합니다! (+RestraintAdded) +### The bandit smiles and applies a lock! (DamageTaken) + The bandit caresses your restrained body! (DamageTaken) 산적은 당신의 구속된 몸을 애무합니다! (DamageTaken) + Shady Dealer 그늘진 딜러 -The bandit dealer flees, leaving her goods behind. -산적 장수가 물건을 두고 도망친다. -The bandit dealer uses some high-quality restraints on you! (+RestraintAdded) -산적 딜러가 당신에게 고급 구속을 사용합니다! (+RestraintAdded) -The bandit kisses and gropes your body! (DamageTaken) -산적이 키스하고 몸을 더듬는다! (DamageTaken) +### The dealer flees, leaving her goods behind. + +### The dealer uses some high-quality restraints on you! (+RestraintAdded) + +### The dealer smiles and applies a lock! (DamageTaken) + +### The dealer kisses and gropes your body! (DamageTaken) + That dagger was laced with something... 그 단검에 무언가가 박혀 있었는데... You hear a shattering of glass, suddenly the air around you feels thick and moist... @@ -3113,6 +4153,7 @@ Poison Dagger Lust Bomb 정욕 폭탄 + Bandit Guard 밴디트 가드 The bandit guard collapses and calls for help. @@ -3121,6 +4162,7 @@ The bandit guard restrains you! (+RestraintAdded) 산적 가드가 당신을 구속합니다! (+RestraintAdded) The bandit rubs and caresses your restrained body! (DamageTaken) 산적은 구속된 당신의 몸을 비비고 어루만집니다! (DamageTaken) +### The bandit scoffs and applies a lock! (DamageTaken) Bandit Chief 도적장 @@ -3130,6 +4172,7 @@ The bandit restrains you tightly! (+RestraintAdded) 산적이 당신을 단단히 제지합니다! (+RestraintAdded) The bandit runs her hands all along your restrained body! (DamageTaken) 산적은 당신의 구속된 몸을 따라 그녀의 손을 움직입니다! (DamageTaken) +### The bandit chuckles and applies a lock! (DamageTaken) Bandit Pet 산적 애완동물 @@ -3137,8 +4180,9 @@ The bandit blushes and runs away. 산적이 얼굴을 붉히며 도망친다. The girl nervously restrains you! (+RestraintAdded) 그녀가 초조하게 당신을 제지합니다! (+RestraintAdded) -The bandit tickes you nervously! (DamageTaken) +The bandit tickles you nervously! (DamageTaken) 도적이 당신을 초조하게 간지럽힙니다! (DamageTaken) +### The bandit pet applies a lock! (DamageTaken) Bandit Hunter 산적 사냥꾼 @@ -3148,6 +4192,7 @@ The bandit hunter restrains you! (+RestraintAdded) 산적 사냥꾼이 당신을 구속합니다! (+RestraintAdded) The bandit hunter caresses your restrained body! (DamageTaken) 산적 사냥꾼이 당신의 구속된 몸을 어루만집니다! (DamageTaken) +### The bandit hunter calls you an amateur and applies a lock! (DamageTaken) Bandit Grappler 산적 그래플러 @@ -3157,18 +4202,24 @@ The bandit grappler loops her chains around you! (+RestraintAdded) 산적 그래플러가 당신 주위에 그녀의 사슬을 감습니다! (+RestraintAdded) The bandit grappler caresses your restrained body! (DamageTaken) 산적 그래플러가 당신의 절제된 몸을 어루만집니다! (DamageTaken) +### The bandit giggles and applies a lock! (DamageTaken) + The bandit grappler hooks you closer!!! 산적 그래플러가 널 더 가까이 끌어당긴다!!! + Mummy 미라 The Mummy collapses and her body vanishes. 미라가 쓰러지고 몸이 사라진다. The Mummy conjures a mystic wrapping! (+RestraintAdded) 미라가 신비로운 포장을 만들어냅니다! (+RestraintAdded) +### The Mummy conjures a magical lock upon you! (DamageTaken) + The Mummy punishes you with a blow from her staff! (DamageTaken) 미라가 지팡이로 당신을 벌합니다! (DamageTaken) + Cursed One 저주받은 자 The Cursed One is drawn into an eldritch portal. @@ -3178,6 +4229,23 @@ The Cursed One's bindings transfer to you! (+RestraintAdded) The Cursed One's bindings emit a strange aura... (DamageTaken) 저주받은 자의 구속이 이상한 기운을 발산합니다... (DamageTaken) + +### Floating Wrapping + +### The wrapping falls to the floor, its magic spent. + +### The floating wrappings attach to you! (+RestraintAdded) + +### The wrappings grip you tightly and squeeze you! (DamageTaken) + +### Animated Sarcophagus + +### The sarcophagus falls to the ground and crumbles. + +### The sarcophagus emits long wrappings that pull you closer! (+RestraintAdded) + +### The sarcophagus emanates a strange power! (DamageTaken) + Bast Warrior 바스트 워리어 The Bast Warrior collapses and meows loudly. @@ -3186,27 +4254,45 @@ The Bast Warrior restrains you! (+RestraintAdded) 바스트 워리어가 너를 구속한다! (+RestraintAdded) The Bast Warrior tickles you with her claws! (DamageTaken) 바스트 워리어가 발톱으로 당신을 간지럽힙니다! (DamageTaken) +### The Bast Warrior pulls out a lock and slips it on! (DamageTaken) + + + +### Bast High Cleric + +### The Bast High Cleric vanishes into a puff of ribbons. + +A ray of light shoots out and paralyzes you! (DamageTaken) +한 줄기 빛이 당신을 마비시킵니다! (DamageTaken) +### The Bast Cleric conjures wrappings upon you! (+RestraintAdded) + +### The Bast Cleric conjures a lock and slips it onto you! (DamageTaken) + Bast Cleric 바스트 클레릭 The Bast Cleric collapses and meows softly. 바스트 클레릭이 쓰러지고 부드럽게 야옹거린다. -A ray of light shoots out and paralyzes you! (DamageTaken) -한 줄기 빛이 당신을 마비시킵니다! (DamageTaken) The Bast Cleric restrains you! (+RestraintAdded) 바스트 클레릭이 당신을 구속합니다! (+RestraintAdded) -A ray of light shoots out and paralyzes you! (DamageTaken) -한 줄기 빛이 당신을 마비시킵니다! (DamageTaken) +### The Bast Cleric pulls out a lock and slips it on! (DamageTaken) + +### High Cleric + +### The High Cleric locks herself in ritual bondage as punishment for failure. + +### The High Cleric holds up her staff and you feel intense vibrations throughout your body! (DamageTaken) + +### The High Cleric summons animated restraints to bind you! (+RestraintAdded) + +### A flurry of mummy wrappings encase you and stun you! (DamageTaken) + +### The High Cleric smiles as she conjures many locks on your restraints! (DamageTaken) -Skeleton -해골 The skeleton falls to pieces. 해골이 산산조각이 난다. -The Skeleton restrains you! (+RestraintAdded) -해골이 당신을 구속합니다! (+RestraintAdded) -The Skeleton tackles you! (DamageTaken) -해골이 당신을 공격합니다! (DamageTaken) + Ghost 귀신 @@ -3214,8 +4300,7 @@ The ghost vanishes. 유령이 사라진다. The Ghost restrains you! (+RestraintAdded) 고스트가 당신을 구속합니다! (+RestraintAdded) -The Ghost tickles you! (DamageTaken) -유령이 당신을 간지럽힙니다! (DamageTaken) +### The Ghost enters your clothing and vanishes! Revenant 레버넌트 @@ -3223,11 +4308,12 @@ The revenant pouts as it vanishes. 사라지는 망령이 입을 삐죽거린다. The revenant restrains you! (+RestraintAdded) 원령이 너를 구속한다! (+RestraintAdded) -The revenant squeezes your breasts! (DamageTaken) -원령이 네 가슴을 조인다! (DamageTaken) +### The revenant squeezes your breasts and slows you! (DamageTaken) + The revenant grabs you and caresses your tummy! (DamageTaken) 망령이 당신을 잡고 배를 어루만집니다! (DamageTaken) + Skeleton Warrior 해골 전사 The skeleton warrior collapses and falls into pieces. @@ -3237,6 +4323,7 @@ The Skeleton lands a wide, crippling blow! (DamageTaken) The Skeleton leashes you! 해골이 당신을 묶습니다! + Skeleton Knight 스켈레톤 나이트 The skeleton knight collapses and falls into pieces. @@ -3246,6 +4333,7 @@ The skeleton apprehends you and pins you with the haft of its axe! (DamageTaken) The skeleton grabs you and slips a black cuff on! (+RestraintAdded) 해골이 당신을 잡고 검은 수갑을 채웁니다! (+RestraintAdded) + Vine Plant 식물이 온다 The plant leaks purple juices everywhere as it wilts. @@ -3257,6 +4345,17 @@ The vine plant wraps its tendrils around you! (+RestraintAdded) The vine plant grips you tightly! (DamageTaken) 덩굴 식물이 당신을 단단히 움켜쥐고 있습니다! (DamageTaken) + +### Vine Spitter + +### The vine spitter leaks purple juices everywhere as it wilts. + +### The vine spitter slaps you with its tendrils! (DamageTaken) + +### The vine spitter wraps its tendrils around you! (+RestraintAdded) + +### The vine spitter grips you tightly! (DamageTaken) + Bramble 가시나무 The brambles are hacked away. @@ -3264,6 +4363,7 @@ The brambles are hacked away. The bramble snares you! (DamageTaken) 가시나무가 당신을 덫에 걸리게 합니다! (DamageTaken) + The red liquid bubbles and several round slimes pop out! 붉은 액체 방울과 여러 개의 둥근 슬라임이 튀어나옵니다! The red liquid bubbles and a round slime pops out! @@ -3273,18 +4373,13 @@ A revenant appears! Fuuka uses a talisman to call forth the spirits of her pets! Fuuka는 부적을 사용하여 애완 동물의 영혼을 불러옵니다! + A pool of latex bubbles and a twisted elemental appears! 라텍스 버블 풀과 뒤틀린 엘리멘탈 등장! -The red liquid bubbles and a round slime pops out! -붉은 액체 방울과 동그란 슬라임이 튀어나옵니다! -Latex Elemental -라텍스 엘리멘탈 -Latex Elemental -라텍스 엘리멘탈 -Red Slime -붉은 슬라임 +### Latex Homunculus + Red Slime 붉은 슬라임 The red slime bounces away. @@ -3294,6 +4389,7 @@ The red slime bounces off you! (DamageTaken) The slime shoves itself into your mouth! (+RestraintAdded) 슬라임이 당신의 입 속으로 밀어넣었습니다! (+RestraintAdded) + Slime Mold 점균류 The slime mold explodes into small puffs. @@ -3303,6 +4399,7 @@ The slime mold is sticky and gross! (DamageTaken) The slime mold attaches itself to your body! (+RestraintAdded) 점균류가 몸에 붙는다! (+RestraintAdded) + Mold Puff 몰드 퍼프 The mold puff explodes into small puffs. @@ -3314,16 +4411,37 @@ The mold puff leaps through the air! The mold puff attaches itself to your body! (+RestraintAdded) 몰드 퍼프가 몸에 착 달라붙는다! (+감지 추가) + Slime Mold Nest 점액 곰팡이 둥지 The slime mold nest erupts into a shower of black particles! 점균류 둥지가 검은 입자의 소나기로 분출합니다! + Many small pieces of slime mold break off! 작은 점균류 조각이 많이 떨어져 나갑니다! A mobile cyst emerges from the slime mold nest! 점균류 둥지에서 움직이는 포낭이 나옵니다! + +### Factory Doll + +### The doll is subdued. + +### Freed Doll + +### The doll returns to her place. + +### Encased Adventurer + +### The encased adventurer loses hope. + +### The encased adventurer moans as she throws herself against you for help! (DamageTaken) + +### The encased adventurer sticks to you as she mumbles incoherently! (DamageTaken) + +### The encased adventurer pleads for help as her slime spreads to you! (+RestraintAdded) + Slime 더러운 것 The slime melts into a puddle. @@ -3333,36 +4451,41 @@ The sticky slime splashes against you! (DamageTaken) The slime attaches itself to your body! (+RestraintAdded) 슬라임이 몸에 붙는다! (+RestraintAdded) + +### Bouncy Slime + +### The bouncy slime splashes against you! (DamageTaken) + +### The bouncy slime leaps to you! + +### The bouncy slime attaches itself to your body! (+RestraintAdded) + Fast Slime 패스트 슬라임 -The slime melts into a puddle. -점액이 녹아서 웅덩이가 됩니다. The sticky slime leaps and splashes against you! (DamageTaken) 끈적끈적한 슬라임이 당신을 향해 튀고 튀었습니다! (DamageTaken) The slime leaps and attaches itself to your body! (+RestraintAdded) 점액이 뛰어올라 몸에 붙는다! (+RestraintAdded) + Large Slime 대형 슬라임 The large slime splits apart! 큰 슬라임이 갈라진다! -The sticky slime splashes against you! (DamageTaken) -끈적끈적한 슬라임이 당신에게 튀었습니다! (DamageTaken) The slime spreads to your body! (+RestraintAdded) 점액이 몸에 퍼진다! (+RestraintAdded) + The slime splits into many smaller droplets! 슬라임이 여러 개의 작은 물방울로 나뉩니다! -Skeleton -해골 + The Skeleton falls into pieces. 해골이 산산조각이 난다. -The Skeleton restrains you! (+RestraintAdded) -해골이 당신을 구속합니다! (+RestraintAdded) The Skeleton latches onto you! 해골이 당신에게 달라붙습니다! + Rope Tentacle 로프 촉수 The rope kraken retreats its tentacle. @@ -3370,6 +4493,7 @@ The rope kraken retreats its tentacle. The rope kraken squeezes you with one of its tentacles! (DamageTaken) 로프 크라켄이 촉수 중 하나로 당신을 조입니다! (DamageTaken) + Rope Kraken 로프 크래킹 The rope kraken devolves into a bundle of premium bondage rope. @@ -3377,6 +4501,7 @@ The rope kraken devolves into a bundle of premium bondage rope. The rope kraken tightly cinches itself around your body! (DamageTaken) 로프 크라켄이 당신의 몸을 단단히 조입니다! (DamageTaken) + Magic Rope 매직 로프 The magic rope returns to being a normal rope. @@ -3386,6 +4511,7 @@ The magic rope wraps itself tightly around your body! (+RestraintAdded) The magic rope wriggles into your outfit! (DamageTaken) 마법의 밧줄이 의상에 꿈틀거립니다! (DamageTaken) + Cloud of Feathers 깃털구름 The feathers fall to the floor. @@ -3393,14 +4519,14 @@ The feathers fall to the floor. The feathers tickle you mercilessly! (DamageTaken) 깃털이 당신을 무자비하게 간질입니다! (DamageTaken) + Cloud of Scarves 스카프 구름 The scarves become knotted and fall to the floor. 스카프가 매듭을 짓고 바닥으로 떨어집니다. The scarves wrap themselves around you! (+RestraintAdded) 스카프가 당신을 감싸고 있습니다! (+RestraintAdded) -The scarves rub against your body, tickling you! (DamageTaken) -스카프가 당신의 몸을 문지르며 당신을 간지럽힙니다! (DamageTaken) +### The scarves rub against your body, wrapping you in fluffy fabric! (DamageTaken) Cloud of Ribbons 리본 구름 @@ -3411,14 +4537,16 @@ The ribbons wrap themselves around you! (+RestraintAdded) The ribbons wrap themselves around you! (DamageTaken) 리본이 당신을 감쌉니다! (DamageTaken) + Gravitating Gag 중력 개그 The gag buckles itself in place and falls. 재갈이 제자리에 고정되어 떨어집니다. The gravitating gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) 중력 개그가 입에 단단히 쐐기를 박고 버클을 채웁니다! (+RestraintAdded) -The gravitating gag rubs itself against your gagged lips! (DamageTaken) -중력 재갈이 재갈이 물린 입술에 문지릅니다! (DamageTaken) +### The gravitating gag rubs itself against your lips! (DamageTaken) + +### The gag dashes to you! Seductive Shackles 매혹적인 족쇄 @@ -3428,6 +4556,7 @@ The shackles force themselves around your limbs and click tightly! (+RestraintAd 족쇄가 팔다리 주위에 힘을 가하고 단단히 클릭합니다! (+RestraintAdded) The shackles click seductively in your face... (DamageTaken) 족쇄가 당신의 얼굴을 매혹적으로 때립니다... (DamageTaken) +### The shackles dash to you! Lurid Legbinder 무시무시한 다리결속사 @@ -3438,6 +4567,7 @@ The legbinder zips itself around your legs and squeezes them together! (+Restrai The legbinder wraps around and squeezes your body! (DamageTaken) 레그바인더가 당신의 몸을 감싸고 조입니다! (DamageTaken) + Bratty Blindfold 건방진 눈가리개 The blindfold floats to the floor. @@ -3446,6 +4576,7 @@ The blindfold buckles itself tightly around your head! (+RestraintAdded) 눈가리개가 머리를 단단히 묶습니다! (+RestraintAdded) The blindfold crawls over your helpless face! (DamageTaken) 눈가리개가 무기력한 얼굴을 기어다닙니다! (DamageTaken) +### The blindfold dashes to you! Amorous Armbinder 사랑의 암바인더 @@ -3456,6 +4587,7 @@ The armbinder slips itself around your arms and pushes your elbows together! (+R The armbinder rubs itself all over your body! (DamageTaken) 암바인더가 온몸을 문지릅니다! (DamageTaken) + Stringent Straitjacket 엄격한 구속복 The straitjacket falls apart. @@ -3465,6 +4597,7 @@ The straitjacket slips itself on over your head and pulls your arms close to you The straitjacket squeezes you tightly! (DamageTaken) 구속복이 당신을 꽉 조입니다! (DamageTaken) + Brusque Belt 브루스크 벨트 The chastity belt falls to the floor with a clang. @@ -3474,6 +4607,7 @@ The chastity belt secures itself around your waist! (+RestraintAdded) The chastity belt buzzes against your body alluringly! (DamageTaken) 정조대가 매혹적으로 몸에 윙윙거린다! (DamageTaken) + Yammering Yoke 야머링 멍에 The yoke falls to the floor with a loud clang. @@ -3483,15 +4617,19 @@ The yoke clasps your arms tightly and forces them to the sides! (+RestraintAdded The yoke makes alluring clicking noises! (DamageTaken) 멍에가 매혹적인 딸깍 소리를 냅니다! (DamageTaken) + Haughty Harness 거만한 하네스 The harness unravels. 하네스가 풀린다. The harness buckles itself tightly around your body! (+RestraintAdded) 벨트가 몸을 단단히 조입니다! (+RestraintAdded) +### The harness dashes to you! + The harness wraps itself around your body and squeezes! (DamageTaken) 하네스가 몸을 감싸고 조입니다! (DamageTaken) + Levitating Locks 공중에 떠 있는 자물쇠 The locks and chains fall to the floor in a loud crash. @@ -3500,9 +4638,20 @@ A lock clicks itself onto one of your restraints! (+RestraintAdded) 자물쇠가 구속 장치 중 하나에 딸깍 소리가 납니다! (+RestraintAdded) A chain locks itself in place on your body! (DamageTaken) 사슬이 당신의 몸을 제자리에 고정시킵니다! (DamageTaken) +### The lock dashes to you! + The floating locks and chains rub themselves across your body! (DamageTaken) 떠다니는 자물쇠와 쇠사슬이 몸을 문지릅니다! (DamageTaken) + +### Masterful Lock + +### The lock falls to the floor, disenchanted. + +### The Masterful Lock clicks seductively in your face! (DamageTaken) + +### The Masterful Lock conjures a lock onto one of your restraints! (DamageTaken) + Conjured Gag 소환된 개그 The conjured gag buckles itself in place and falls. @@ -3512,14 +4661,14 @@ The gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) The gag rubs itself against you! (DamageTaken) 재갈이 몸을 문지른다! (DamageTaken) + Learned Rope 배운 로프 The learned rope untangles into a mess of rope. 숙련된 밧줄이 풀려서 엉망진창이 됩니다. The magic rope wraps itself intricately around your body! (+RestraintAdded) 매직 로프가 당신의 몸을 복잡하게 감쌉니다! (+RestraintAdded) -The magic rope wriggles into your outfit! (DamageTaken) -마법의 밧줄이 의상에 꿈틀거립니다! (DamageTaken) +### The rope dashes to you! Unforseen Rope 뜻밖의 밧줄 @@ -3530,60 +4679,54 @@ The unforseen rope wraps itself clandestinely around your body! (+RestraintAdded The unforseen rope wriggles into your outfit! (DamageTaken) 예기치 않은 밧줄이 당신의 의상에 꿈틀거립니다! (DamageTaken) + Monster Rope 몬스터 로프 The monster rope bundle collapses into a pile of ropes. 몬스터 로프 묶음이 무너져 로프 더미가 되었습니다. The magic rope wraps itself overwhelmingly around your body! (+RestraintAdded) 매직 로프가 몸을 압도적으로 감쌉니다! (+RestraintAdded) -The magic rope wriggles into your outfit! (DamageTaken) -마법의 밧줄이 의상에 꿈틀거립니다! (DamageTaken) + Shock Witch 충격의 마녀 The shock witch vanishes into a cloud of thunder, leaving behind a keyring. 충격 마녀는 열쇠 고리를 남기고 천둥의 구름 속으로 사라졌습니다. -The witch restraints you! (+RestraintAdded) -마녀가 너를 구속한다! (+RestraintAdded) +### The witch restrains you! (+RestraintAdded) + +### The witch dangles a lock in front of you before putting it on! (DamageTaken) + The witch slaps you playfully! (DamageTaken) 마녀가 장난스럽게 널 때린다! (DamageTaken) + Flame Witch 불꽃의 마녀 The flame witch vanishes into a pile of ash. 화염의 마녀가 잿더미 속으로 사라졌습니다. -The witch restraints you! (+RestraintAdded) -마녀가 너를 구속한다! (+RestraintAdded) -The witch slaps you playfully! (DamageTaken) -마녀가 장난스럽게 널 때린다! (DamageTaken) Earth Witch 땅의 마녀 The earth witch vanishes into a pile of ash. 대지의 마녀가 잿더미 속으로 사라졌습니다. -The witch restraints you! (+RestraintAdded) -마녀가 너를 구속한다! (+RestraintAdded) -The witch slaps you playfully! (DamageTaken) -마녀가 장난스럽게 널 때린다! (DamageTaken) + Water Witch 물의 마녀 The water witch vanishes into a pile of ash. 물의 마녀는 잿더미 속으로 사라진다. -The witch restraints you! (+RestraintAdded) -마녀가 너를 구속한다! (+RestraintAdded) -The witch slaps you playfully! (DamageTaken) -마녀가 장난스럽게 널 때린다! (DamageTaken) + + +### Aqua Witch + +### The aqua witch vanishes into a pile of ash. Ice Witch 얼음마녀 The ice witch vanishes into a pile of ash. 얼음 마녀가 잿더미 속으로 사라졌습니다. -The witch restraints you! (+RestraintAdded) -마녀가 너를 구속한다! (+RestraintAdded) -The witch slaps you playfully! (DamageTaken) -마녀가 장난스럽게 널 때린다! (DamageTaken) + @@ -3594,14 +4737,12 @@ Ice Bolt Waterblast 워터블래스트 + Rope Witch 로프 마녀 The rope witch retreats as her animated ropes chase her. 로프 마녀는 애니메이션 로프가 그녀를 쫓는 동안 후퇴합니다. -The witch restraints you! (+RestraintAdded) -마녀가 너를 구속한다! (+RestraintAdded) -The witch slaps you playfully! (DamageTaken) -마녀가 장난스럽게 널 때린다! (DamageTaken) + Magnet Witch 자석 마녀 @@ -3612,33 +4753,45 @@ The witch's restraints fly out and attach themselves to you! (+RestraintAdded) The witch's lightning causes your body to tingle! (DamageTaken) 마녀의 번개는 당신의 몸을 따끔거리게 합니다! (DamageTaken) -Witch's Apprentice -마녀의 견습생 + +### Mage's Apprentice + The apprentice runs off and cries in a corner. 견습생이 도망쳐 구석에서 울고 있습니다. The apprentice animates restraints to wrap around you! (+RestraintAdded) 견습생이 당신을 감싸기 위해 구속을 움직입니다! (+RestraintAdded) +### The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) + The apprentice slaps you playfully! (DamageTaken) 수습생이 장난스럽게 당신을 때립니다! (DamageTaken) + Summoner's Apprentice 소환사의 견습생 -The apprentice runs off and cries in a corner. -견습생이 도망쳐 구석에서 울고 있습니다. The apprentice summons a restraint onto you! (+RestraintAdded) 견습생이 당신에게 구속을 소환합니다! (+RestraintAdded) The apprentice tickles you playfully! (DamageTaken) 수습생이 당신을 장난스럽게 간지럽힙니다! (DamageTaken) + +Witch's Apprentice +마녀의 견습생 +### The witch's apprentice confidently admits defeat. + +### The witch's apprentice conjures magic bindings on you! (+RestraintAdded) + +### The witch's apprentice smiles and summons a lock onto you! (DamageTaken) + +### The witch's apprentice smiles as she squeezes your chest! (DamageTaken) + Latex Apprentice 라텍스 견습생 -The apprentice runs off and cries in a corner. -견습생이 도망쳐 구석에서 울고 있습니다. The apprentice attaches a sticky restraint! (+RestraintAdded) 견습생이 끈끈한 구속을 붙입니다! (+RestraintAdded) The apprentice caresses you playfully! (DamageTaken) 수습생이 당신을 장난스럽게 애무합니다! (DamageTaken) + Chain Witch 사슬 마녀 The chain witch vanishes into a pile of metal dust, leaving behind a keyring. @@ -3650,6 +4803,7 @@ The witch's bindings wrap themselves around you! (+RestraintAdded) The chain witch tugs sensually at your restraints! (DamageTaken) 사슬 마녀가 당신의 구속을 관능적으로 잡아당깁니다! (DamageTaken) + Metal Witch 금속 마녀 The metal witch vanishes into a pile of metal dust, leaving behind a keyring. @@ -3661,65 +4815,84 @@ The metal's bindings wrap themselves around you! (+RestraintAdded) The metal witch tugs sensually at your restraints! (DamageTaken) 금속 마녀가 당신의 구속을 관능적으로 잡아당깁니다! (DamageTaken) + Slime Witch 슬라임 마녀 The slime witch vanishes into a pool of pink slime, leaving behind a keyring. 슬라임 마녀가 열쇠고리를 남기고 분홍색 슬라임 웅덩이 속으로 사라졌습니다. The witch touches her with her sticky grasp! (+RestraintAdded) 마녀가 끈적끈적한 손으로 그녀를 만진다! (+RestraintAdded) +### The witch creates a magical lock made of hardened latex! (DamageTaken) + The witch squeezes your body playfully! (DamageTaken) 마녀가 장난스럽게 당신의 몸을 쥐어짠다! (DamageTaken) + 'High' Wizard '하이' 마법사 The wizard falls asleep. 마법사가 잠이 든다. -The wizard clips a restraint around your neck! -마법사가 당신의 목에 구속을 걸었습니다! -The wizard laughs maniacally as she tickles you! -마법사는 당신을 간지럽히면서 광적으로 웃는다! +### The wizard clips a restraint around your neck! (+RestraintAdded) + +### The wizard clips a lock to your restraints! (DamageTaken) + +### The wizard laughs maniacally as she tickles you! (DamageTaken) FunGal 펀갤 The fun-gal retreats into the ground. 곰팡이가 땅 속으로 후퇴합니다. -The fun-gal clips a restraint around your neck! -곰돌이가 당신의 목을 묶습니다! -The fun-gal rubs your chest with her long, slender fingers! -펑걸이 길고 가느다란 손가락으로 가슴을 문지른다! -Crystal Glyph -크리스탈 문양 +### The fun-gal clips a restraint around your neck! (+RestraintAdded) + +### The fun-gal produces a magical lock on all your restraints! (DamageTaken) + +### The fun-gal rubs your chest with her long, slender fingers! (DamageTaken) + +### Crystal Slash + +### Crystal Bolt + Tailor 재단사 -You murder the tailor! -당신은 재단사를 살해! +### You rob the tailor! Student 학생 -You murder the student! -당신은 학생을 살해! +### You rob the student! Tactician 전술가 -You murder the tactician! -당신은 전술가를 죽인다! +### You rob the tactician! Informant 피조사자 -You murder the informant! -당신은 정보원을 죽인다! +### You rob the informant! Thug 자객 -You murder the thug! -당신은 깡패를 죽인다! +### You rob the thug! + +### Antique Merchant + +### You smash the antique merchant! Blacksmith 대장장이 -You murder the blacksmith! -당신은 대장장이를 살해! +### You rob the blacksmith! + +### Armorer + +### You rob the armorer! + +### Bowyer + +### You rob the bowyer! + +### Not a Kidnapper + +### You bring the kidnapper to justice! Dressmaker 양장점 @@ -3732,6 +4905,7 @@ The dressmaker adds a lock 'just to complete the look, you know?' The dressmaker cuddles your helpless body~ (DamageTaken) 드레스메이커가 무기력한 몸을 안아주네요~ (DamageTaken) + Nurse 간호사 The Nurse checks her notes and runs off. @@ -3743,6 +4917,7 @@ The Nurse adds a lock to keep you from hurting the staff. The Nurse assures you it's going to be alright~ (DamageTaken) 간호사가 괜찮을 거라고 장담합니다~ (DamageTaken) + Librarian 사서 The librarian gets angry and retreats. @@ -3759,45 +4934,48 @@ Stone Door 돌 문 The stone door crumbles! 돌문이 무너진다! -Stone Door -돌문 +### Steel Door + The stone door crumples inward! 돌문이 안으로 구겨진다! +### Control Room Door + +### The door flies open as the Dollmaker chuckles at you! Giant Mushroom 거대한 버섯 The giant mushroom explodes into a cloud of spores!!! 거대한 버섯이 포자 구름으로 폭발합니다!!! -Animated Mushroom -애니메이션 버섯 -The animated mushroom explodes into a cloud of spores!!! -움직이는 버섯이 포자 구름으로 폭발합니다!!! -The animated mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) -움직이는 버섯은 당신의 얼굴에 포자를 뱉고 당신이 산만할 때 당신을 묶습니다! (+RestraintAdded) -The animated mushroom spits spores into your face and tries to tie you! -움직이는 버섯이 당신의 얼굴에 포자를 뱉고 당신을 묶으려고 합니다! -The animated mushroom emits soporific spores! (DamageTaken) -움직이는 버섯이 졸음 포자를 방출합니다! (DamageTaken) - -Happy Mushroom -행복한 버섯 -The happy mushroom explodes into a cloud of spores!!! -행복한 버섯이 포자 구름으로 폭발합니다!!! -The happy mushroom tickles you silly! -행복한 버섯이 바보를 간지럽힌다! -The happy mushroom tickles you silly! (DamageTaken) -행복한 버섯이 당신을 간지럽힙니다! (DamageTaken) -Infected Mushroom -감염된 버섯 -The infected mushroom explodes into a cloud of spores!!! -감염된 버섯이 포자 구름으로 폭발합니다!!! -The infected mushroom gives you a crushing hug! +### Army Mushroom + +### The army mushroom explodes into a cloud of spores!!! + +### The army mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) + +### The army mushroom spits spores into your face and tries to tie you! + +### The army mushroom emits soporific spores! (DamageTaken) + +### Delicious Mushroom + +### The delicious mushroom explodes into a cloud of spores!!! + +### The delicious mushroom tickles you silly! + +### The delicious mushroom tickles you silly! (DamageTaken) + +Infected Mushroom +감염된 버섯 +The infected mushroom explodes into a cloud of spores!!! +감염된 버섯이 포자 구름으로 폭발합니다!!! +The infected mushroom gives you a crushing hug! 감염된 버섯이 당신을 압도합니다! The infected mushroom gives you a crushing hug! (DamageTaken) 감염된 버섯이 당신을 압도합니다! (DamageTaken) + Jailer 교도관 The jailer passes out and drops her possessions! @@ -3809,37 +4987,33 @@ The jailer places some restraints on you! (+RestraintAdded) The jailer plays with you, groping and rubbing your body! 간수는 당신과 놀아요, 당신의 몸을 더듬고 문지릅니다! + The guard checks your restraints to make sure they are secure. 경비원은 구속 장치가 안전한지 확인합니다. + Guard 경비원 The guard passes out and drops her possessions! 경비원이 기절하고 소지품을 떨어뜨립니다! The guard locks your restraints! 경비원이 당신의 구속을 잠급니다! -The jailer places some restraints on you! (+RestraintAdded) -간수가 당신을 구속합니다! (+RestraintAdded) The guard places a NewRestraintName on you 경비원이 당신에게 NewRestraintName을 부여합니다 The guard plays with you, groping and rubbing your body! 경비원이 당신과 놀아요, 당신의 몸을 더듬고 문지릅니다! + Armed Guard 무장 가드 The armed guard retreats, but drops a keyring! 무장한 경비원이 후퇴하지만 열쇠 고리를 떨어뜨립니다! -The guard locks your restraints! -경비원이 당신의 구속을 잠급니다! The guard shocks you and slaps on some restraints! (+RestraintAdded) 경비원이 당신에게 충격을 주고 일부 구속을 때립니다! (+RestraintAdded) -The guard electrocutes you with her taser!!! -경비원이 테이저건으로 감전사시켰어요!!! -The guard electrocutes you with her taser!!! -경비원이 테이저건으로 감전사시켰어요!!! +### The guard shocks you with her taser!!! + +### The EnemyName applies a NewRestraintName over your OldRestraintName -The EnemyName replaces your OldRestraintName with a NewRestraintName -The EnemyName이 귀하의 OldRestraintName을 NewRestraintName으로 대체합니다. The EnemyName removes your OldRestraintName EnemyName이 귀하의 OldRestraintName을 제거합니다 The EnemyName restrains you with a NewRestraintName @@ -3857,16 +5031,6 @@ The master conjurer summons a restraint directly onto you! The master conjurer tickles you playfully! 마스터 마법사가 당신을 장난스럽게 간질입니다! -Master Conjurer -마스터 컨저러 -The conjurer retreats into a portal! -창술사가 포털로 후퇴합니다! -The master conjurer waves a hand, and locks appear on all your restraints! -마스터 마법사가 손을 흔들면 모든 구속에 자물쇠가 나타납니다! -The master conjurer summons a restraint directly onto you! -마스터 컨저러가 당신에게 직접 구속을 소환합니다! -The master conjurer tickles you playfully! -마스터 마법사가 당신을 장난스럽게 간질입니다! Frog 개구리 @@ -3877,6 +5041,7 @@ The frog pulls you with its tongue!!! The frog licks you! 개구리가 당신을 핥아요! + Toad 두꺼비 The toad jumps away! @@ -3886,6 +5051,7 @@ The toad pulls you with its tongue!!! The toad licks you! 두꺼비가 당신을 핥아요! + Shadow Hand 섀도우 핸드 The shadow hand retreats into the darkness... @@ -3894,6 +5060,97 @@ The shadow hand latches onto you!! (+RestraintAdded) 그림자의 손이 당신을 붙잡는다!! (+RestraintAdded) The shadow hand stretches its fingers across your body! (DamageTaken) 그림자 손이 몸 전체에 손가락을 뻗는다! (DamageTaken) +### A dark hand stretches out beyond the shadows... + +### Several dark hands emerge from the shadows! + +### Corrupted Adventurer + +### The corrupted adventurer falls into a deep sleep. + +### The corrupted aventurer's many arms latch onto you! (+RestraintAdded) + +### The corrupted aventurer clicks a lock on from behind you! (DamageTaken) + +### The corrupted adventurer drags her chilling fingers across your vulnerable skin! (DamageTaken) + + + +### Shadowy Ghast + +### The shadowy ghast screeches and disappears... + +### The shadowy ghast latches onto you with its long arms! (+RestraintAdded) + +### The shadowy ghast grips you in its chilling embrace! (DamageTaken) + +### Corrupted Elemental + +### The corrupted elemental dissolves into shadows. + +### The corrupted elemental reaches out and touches you, forming metallic restraints! (+RestraintAdded) + +### The corrupted elemental uses its chains to lock your restraints! (DamageTaken) + +### The corrupted elemental grips you and drains your willpower! (DamageTaken) + +### Star Demon + +### The star demon is exorcised. + +### The star demon places you in shining, starry restraints. (+RestraintAdded) + +### The demon giggles as it locks your restraints! (DamageTaken) + +### The star demon places you under its curse! (DamageTaken) + +### The strings of fate glisten and wrap around you! + +### Many shining strings surround you! + +### Stepping outside of the indicated tiles will result in punishment! + +### Bindings of Fate + +### Moon Demon + +### The moon demon is exorcised. + +### The moon demon places you in shining, starry restraints. (+RestraintAdded) + +### The moon demon places you under its curse! (DamageTaken) + +### The weight of inescapable bondage falls upon you! (DamageTaken) + +### Crushing Fate + +### Void Demon + +### The void demon is exorcised. + +### The void demon places you in dark, glassy restraints. (+RestraintAdded) + +### The void demon places you under its curse! (DamageTaken) + +### You are sucked in by a powerful gravitational force!!! (DamageTaken) + +### You are sucked in by a powerful gravitational force!!! + +### The demon cracks its knuckles as it locks your restraints! (DamageTaken) + +### Cosmic Force + + + +### Demon + +### The demon is exorcised. + +### The demon places you in dark, glassy restraints. (+RestraintAdded) + +### The demon caresses you gently with her sharp nails! (DamageTaken) + +### The demon stuns you with her heavy mace! (+STUN) Tickle Hand 간지럼 손 @@ -3902,6 +5159,7 @@ The hand vanishes! The hand tickles you! (DamageTaken) 손이 간지러워! (DamageTaken) + Tickle Terror 간질 테러 The tickle terror vanishes... for now @@ -3911,68 +5169,53 @@ The monstrous spirit tickles you mercilessly!!! (DamageTaken) The monstrous spirit binds you to make you more vulnerable! (+RestraintAdded) 괴물령이 당신을 속박하여 더욱 취약하게 만듭니다! (+RestraintAdded) + Hug Horror 포옹 공포 The hug horror vanishes... for now 허그 호러는 사라지고... 지금은 The monstrous spirit gives a crushing hug!!! (DamageTaken) 괴물이 뭉클하게 안아준다!!! (DamageTaken) -The monstrous spirit gives a crushing hug!!! (DamageTaken) -괴물이 뭉클하게 안아준다!!! (DamageTaken) +### The monstrous spirit envelops you in tightness, holding you in place! (DamageTaken) + The monstrous spirit's chains latch on! (+RestraintAdded) 괴물 정령의 쇠사슬이 걸렸다! (+RestraintAdded) + Greedy Ghast 욕심쟁이 가스트 The ghast vanishes... for now 유령이 사라진다... 당분간 -The moaning spirit gropes your body!!! (DamageTaken) -신음하는 영혼이 몸을 더듬는다!!! (DamageTaken) +### The moaning spirit runs its hands all across your body!!! (DamageTaken) -Tickle Hand -간지럼 손 -The hand vanishes! -손이 사라진다! -The hand tickles you! (DamageTaken) -손이 간지러워! (DamageTaken) Tome of Chains 사슬의 책 The floating tome burns into ashes! 떠다니는 책이 잿더미가 된다! +### Tome of Belts + +### Tome of Ropes + +### Tome of Bondage + Tome of Light 빛의 책 -The floating tome burns into ashes! -떠다니는 책이 잿더미가 된다! Tome of Magic 마법의 책 -The floating tome burns into ashes! -떠다니는 책이 잿더미가 된다! Tome of Ice 얼음의 책 -The floating tome burns into ashes! -떠다니는 책이 잿더미가 된다! Tome of the Abyss 심연의 책 -The floating tome burns into ashes! -떠다니는 책이 잿더미가 된다! Tome of Nature 자연의 책 -The floating tome burns into ashes! -떠다니는 책이 잿더미가 된다! Tome of Thunder 천둥의 책 -The floating tome burns into ashes! -떠다니는 책이 잿더미가 된다! Tome of Latex 라텍스의 책 -The floating tome burns into ashes! -떠다니는 책이 잿더미가 된다! Tome of Laughs 웃음의 책 -The floating tome burns into ashes! -떠다니는 책이 잿더미가 된다! You are grabbed and led to a prison... @@ -3992,6 +5235,7 @@ The necromancer prepares you for transport! The necromancer rubs your body sensually! 네크로맨서가 당신의 몸을 관능적으로 문지른다! + Filthy Rat 더러운 쥐 The rat skitters back into a hole in the wall. @@ -3999,6 +5243,7 @@ The rat skitters back into a hole in the wall. The filthy rat nibbles at you! (DamageTaken) 더러운 쥐가 널 갉아먹는다! (DamageTaken) + Annoying Bat 성가신 박쥐 You stomp the bat into the ground to make sure it's dead. @@ -4006,6 +5251,7 @@ You stomp the bat into the ground to make sure it's dead. The bat nibbles incessantly at you! (DamageTaken) 박쥐가 끊임없이 당신을 갉아먹어요! (DamageTaken) + Pixie 픽시 The pixie huffs and floats away. @@ -4013,6 +5259,7 @@ The pixie huffs and floats away. The pixie tickles you with a feather! (DamageTaken) 요정이 깃털로 당신을 간지럽힙니다! (DamageTaken) + Orb of Light 빛의 오브 The orb vanishes in a flash of light. @@ -4022,40 +5269,37 @@ The orb blinds you with its intense light!!! (DamageTaken) A light restores the will of its allies! 빛은 아군의 의지를 회복시킵니다! + You do not have enough resources to cast the spell! 당신은 마법을 걸기에 충분한 자원이 없습니다! -You AttackName TargetEnemy for DamageDealt DamageType damage! -DamageDealt DamageType 손상에 대한 AttackName TargetEnemy! -You AttackName TargetEnemy for a decreased DamageDealt DamageType damage! -감소된 DamageDealt DamageType 손상에 대한 AttackName TargetEnemy! -You AttackName TargetEnemy for an increased DamageDealt DamageType damage! -증가된 DamageDealt DamageType 손상에 대한 AttackName TargetEnemy! -You AttackName TargetEnemy for a devastating DamageDealt DamageType damage! -당신은 파괴적인 DamageDealt DamageType 손상에 대해 AttackName TargetEnemy를 공격합니다! -You AttackName TargetEnemy, but your DamageType weapon has no effect! -당신은 TargetEnemy를 공격하지만 DamageType 무기는 효과가 없습니다! -You AttackName TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! -You AttackName TargetEnemy for DamageDealt DamageType damage!, 안티 매직 와드로 감소! AttackName hits TargetEnemy for DamageDealt DamageType damage! AttackName이 TargetEnemy에게 DamageDealt DamageType 손상을 입힙니다! +### AttackName hits TargetEnemy for a decreased DamageDealt DamageType damage! + +AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! +AttackName이 TargetEnemy를 공격하여 DamageDealt DamageType 손상이 증가합니다! +AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! +AttackName이 TargetEnemy를 공격하여 엄청난 DamageDealt DamageType 피해를 입힙니다! +### AttackName hits TargetEnemy, but your DamageType weapon has no effect! + +### AttackName hits TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! + AttackName hits TargetEnemy for a reduced DamageDealt DamageType damage! AttackName이 TargetEnemy를 공격하여 DamageDealt DamageType 손상이 감소했습니다! AttackName hits TargetEnemy but DamageType damage doesn't have any effect! AttackName이 TargetEnemy를 공격하지만 DamageType 피해는 아무 효과가 없습니다! -AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! -AttackName이 TargetEnemy를 공격하여 DamageDealt DamageType 손상이 증가합니다! AttackName hits TargetEnemy for DamageDealt DamageType damage, reduced by an anti-magic ward! AttackName이 TargetEnemy에게 DamageDealt DamageType 손상을 가하고 안티 매직 와드에 의해 감소합니다! -AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! -AttackName이 TargetEnemy를 공격하여 엄청난 DamageDealt DamageType 피해를 입힙니다! -attack -공격 -damage -손상 +### Your attack + +### An effect + You miss the TargetEnemy! 당신은 TargetEnemy를 놓치고 있습니다! Your attack is too feeble to hurt the TargetEnemy! 당신의 공격은 TargetEnemy를 해치기에는 너무 약합니다! +### Your attack was absorbed by the TargetEnemy's shield! + You try to pull the TargetRestraint off... TargetRestraint를 당기려고 합니다... You try to squirm and moan out of the TargetRestraint... @@ -4074,16 +5318,6 @@ Your ally tries to pick the lock on your TargetRestraint... 당신의 동료가 당신의 TargetRestraint를 잠그려고 합니다... You try to pick open the TargetRestraint but break your lockpick. TargetRestraint를 열려고 시도했지만 자물쇠 따기가 깨졌습니다. -You work on picking the TargetRestraint... -TargetRestraint를 선택하는 중입니다... -You work on picking the TargetRestraint... -TargetRestraint를 선택하는 중입니다... -Your trembling hands work on picking the TargetRestraint... -당신의 떨리는 손이 TargetRestraint를 고르느라 애쓰고 있습니다... -You work on picking the TargetRestraint with your powers... -당신은 당신의 힘으로 TargetRestraint를 고르고 있습니다... -Your ally tries to pick the lock on your TargetRestraint... -당신의 동료가 당신의 TargetRestraint를 잠그려고 합니다... You break your lockpick trying to open the TargetRestraint. TargetRestraint를 열려고 시도하다가 락픽을 부수었습니다. You try to remove the TargetRestraint... @@ -4104,8 +5338,6 @@ You try to cut the TargetRestraint with help... 도움을 받아 TargetRestraint를 자르려고 합니다... You break your knife trying to cut the TargetRestraint. TargetRestraint를 자르던 중 칼이 부러졌습니다. -You try to cut the TargetRestraint... -TargetRestraint를 자르려고 합니다... You fiddle with the key on the TargetRestraint... TargetRestraint의 열쇠를 만지작거립니다... Your jittering hands fumble with the key on the TargetRestraint... @@ -4114,23 +5346,18 @@ You concentrate on unlocking the TargetRestraint... 당신은 TargetRestraint의 잠금을 해제하는 데 집중합니다... You work on unlocking the TargetRestraint with help... 당신은 도움을 받아 TargetRestraint의 잠금을 해제하는 작업을 하고 있습니다... -You fiddle with the key on the TargetRestraint... -TargetRestraint의 열쇠를 만지작거립니다... + The lock requires a key. 자물쇠에는 열쇠가 필요합니다. -The lock requires a key. -자물쇠에는 열쇠가 필요합니다. -The lock requires a key. -자물쇠에는 열쇠가 필요합니다. -The green padlock only accepts green keys. -녹색 자물쇠는 녹색 열쇠만 받습니다. -The yellow padlock requires a red and a green key. -노란색 자물쇠는 빨간색과 초록색 열쇠가 필요합니다. -The magical lock only accepts blue keys and can't be picked. -마법의 자물쇠는 파란색 열쇠만 받고 열 수 없습니다. +### The lock can only be opened with a key. + +### The magical lock only accepts magical keys and can't be picked. + The magical lock is guarded with powerful magic. You'll have to wait for it to wear off... 마법의 자물쇠는 강력한 마법으로 지키고 있습니다. 풀리기를 기다려야 합니다... +### The item is cybernetically locked. You will need a key card to unlock it. + This lock requires a command word to unlock. It doesn't have a keyhole. 이 자물쇠를 열려면 명령어가 필요합니다. 열쇠 구멍이 없습니다. You don't have a key for this lock. @@ -4139,52 +5366,73 @@ The lock seems to be magical and rejects all picking attempts! 자물쇠는 마법처럼 보이고 모든 선택 시도를 거부합니다! The lock is definitely magical and forces your pick out! 자물쇠는 확실히 마법과 같으며 선택을 강요합니다! +### The lock is divine. A mortal shouldn't even try to pick it. + +### You must perform your quest! Don't even think of unlocking it... + +### You're not sure a key for this even exists in the mortal realm. + +### The lock is made of solid rubber. You can't pick that. + +### You need something sharp to cut the lock. + The lock doesn't even have a keyhole to pick! 자물쇠에는 열 열쇠 구멍조차 없습니다! +### You need a special tool to pick this kind of lock. + +### The lock is technological and does not use a key. + +### The lock is brimming with security features and is nigh impossible to pick! + +### The lock is encased in magical crystals that block the keyhole. + +### Your distraction makes the crystals regrow immediately after breaking them off. + +### The crystal fragments in the lock make it difficult to pick. + +### You need a key to actually unlock the ex-crystallized lock. The key sticks in the lock and jams, mangling the key! 열쇠가 자물쇠에 꽂혀서 끼어서 열쇠가 망가졌어요! + You unlock the TargetRestraint. 당신은 TargetRestraint 를 잠금 해제합니다. You manage to squeeze out of the TargetRestraint! TargetRestraint 에서 빠져나오는데 성공했습니다! You pick the lock on the TargetRestraint! 당신은 TargetRestraint 의 자물쇠를 따고 있습니다! -You pick the lock on the TargetRestraint! -당신은 TargetRestraint 의 자물쇠를 따고 있습니다! You free yourself from the TargetRestraint! 당신은 TargetRestraint 에서 스스로 빠져나왔습니다! You damage the TargetRestraint enough to escape! 당신은 탈출할 수 있을 정도로 TargetRestraint 에 피해를 가했습니다! + The TargetRestraint is destroyed by your attempts. TargetRestraint 는 당신에 의해 파괴되었습니다. +### The TargetRestraint comes off before taking serious damage. + +### This is as far as you can struggle. You'll have to remove the TargetRestraint some other way. + +### The item is too tight. You'll need to loosen the TargetRestraint somehow first... + +### The item is to tight to get your tool into position. You'll have to first make the TargetRestraint looser. + +### You can't quite get your pick into position. Maybe if you loosened the TargetRestraint first... + +### The TargetRestraint's lock is tucked in securely under straps. You'll have to get it out from under there... + +### After many failed attempts to unlock the TargetRestraint, you realize this lock is more than you can handle. -This is as far as you can struggle. You'll have to remove it some other way. -이것이 당신이 발버둥 칠 수 있는 한계입니다. 다른 방법으로 제거해야 합니다. -The item is too tight. You'll need to loosen it somehow first... -구속이 너무 꽉 조여져 있습니다. 먼저 어떻게든 느슨하게 풀어야 합니다... -The item is to tight to get your tool into position. You'll have to first make it looser. -도구를 원하는 방향으로 잡기가 어렵습니다. 먼저 구속을 느슨하게 만들어야 합니다. -You can't quite get your pick into position. Maybe if you loosened the item first... -락픽을 원하는 방향으로 잡을 수 없습니다. 아마도 먼저 다른 구속을 풀어야 합니다... -The lock is tucked in securely under straps. You'll have to get it out from under there... -자물쇠는 스트랩 아래에 단단히 고정되어 있습니다. 그 아래에서 꺼내야 합니다... - -After numerous failed attempts, you realize that this lock is more than you can handle. -수많은 시도가 실패한 후, 당신은 이 자물쇠가 당신이 감당할 수 있는 것 이상이라는 것을 깨달았습니다. - -You can feel some ply but can't quite make any progress... -당신은 열심히 움직이지만 어떤 진전도 이룰 수 없습니다... -It's just barely out of reach... -거의 손이 닿지 않는 거리에... -Your tool leaves only a scratch... -당신의 도구는 흠집만 남습니다... -The lock is just above your skill level... -자물쇠는 당신의 기술 수준보다 조금 위에 있습니다... -The keyholes are just barely out of reach... -열쇠 구멍은 거의 손이 닿지 않는 곳에 있습니다... +### You can feel some ply but can't quite make any progress against the TargetRestraint... + +### The TargetRestraint's mechanism lies barely out of reach... + +### Your tool leaves only a scratch against the TargetRestraint... + +### The lock on the TargetRestraint is just above your skill level... + +### The keyholes on the TargetRestraint are just barely out of reach... You unlock the TargetRestraint and sigh with relief. TargetRestraint 의 잠금을 해제하고 안도의 한숨을 내쉽니다. @@ -4192,13 +5440,12 @@ You give out a huge moan as you squeeze out of the TargetRestraint! TargetRestraint 를 쥐어짜내면서 큰 신음소리를 냅니다! You pick the lock on the TargetRestraint with a sigh of relief! 당신은 안도의 한숨을 쉬며 TargetRestraint 의 자물쇠를 땁니다! -You pick the lock on the TargetRestraint with a sigh of relief! -당신은 안도의 한숨을 쉬며 TargetRestraint 의 자물쇠를 땁니다! Trembling, you free yourself from the TargetRestraint! 떨면서, 당신은 TargetRestraint 에서 벗어났습니다! You damage the TargetRestraint enough to wiggle out! 당신은 벗어날 수 있을 정도로 TargetRestraint 를 손상시켰습니다! + You stick the knife into a crack in the wall! 당신은 칼을 벽의 갈라진 틈에 꽂습니다! You use your feet to place the knife into a crack! @@ -4208,7178 +5455,8054 @@ You glare at the crack in the wall as you realize you couldn't maneuver the knif You can't hold your knife like this... 당신은 칼을 손에 쥘 수 없습니다... -The item is too secure to struggle out. -아이템이 너무 단단히 고정되어서 발버둥 칠 수 없습니다. -You groan in frustration as you realize the item is too tight to escape. -구속이 탈출하기에 너무 꽉 조여 있다는 사실을 깨닫고 좌절감에 신음합니다. -The item tightens itself as you try to squeeze out! -구속을 벗어나려고 할 수록 더욱 조여집니다! -You will need someone's help to squeeze out. -벗어나려면 누군가의 도움이 필요합니다. -You pull and tug but your other restraints keep it securely in place! -당신은 그것을 잡아당기지만 당신의 다른 구속구가 그것을 제자리에 단단하게 유지합니다! -You groan and tug but nothing budges. You're bound too tightly by something else. -신음하고 잡아당겨도 꿈쩍도 하지 않습니다. 당신은 다른 무언가에 너무 단단히 묶여 있습니다. -You are too tightly bound to have a chance. -당신은 기회를 갖기에는 너무 빡빡합니다. -You shake and moan as you realize your struggles are futile. -당신은 당신의 투쟁이 무익하다는 것을 깨닫고 떨고 신음합니다. -You can't find a keyhole! -열쇠 구멍을 찾을 수 없습니다! -You sigh as you give up trying to find any kind of keyhole. -어떤 종류의 열쇠 구멍을 찾는 것을 포기하면서 한숨을 쉬게 됩니다. -The item can't be unlocked without a special command! -아이템은 특별한 명령 없이는 잠금 해제할 수 없습니다! -You can't reach the keyhole by yourself! -혼자서는 열쇠 구멍에 닿을 수 없습니다! -You can't hold the key to unlock this with. -열쇠를 잡고 있으면 잠금을 해제할 수 없습니다. -Your bound and shaking hands can't even hold the key. -당신의 결박되고 떨리는 손은 열쇠조차 잡을 수 없습니다. -You try, but something is keeping your hands away. -당신은 시도하지만 무언가가 당신의 손을 멀리하고 있습니다. -You flail the key around uselessly but a strap is preventing you! -당신은 쓸데없이 열쇠를 휘두르지만 끈이 당신을 막고 있습니다! -This lock is beyond your skill level! -이 자물쇠는 당신의 기술 수준을 넘어선 것입니다! -You whimper as you realize the lock is far too secure. -자물쇠가 너무 안전하다는 것을 깨닫고 훌쩍거립니다. -There is no visible locking mechanism. -눈에 보이는 잠금 장치가 없습니다. -You can't pick this by yourself, you'll need help. -혼자서 고를 수 없습니다. 도움이 필요합니다. -You can't maneuver the lockpick well enough to unlock it. -자물쇠를 풀 수 있을 만큼 잘 조종할 수 없습니다. -You let out a frustrated sigh as your quivering pick makes no progress. -당신의 떨리는 곡괭이가 진전을 보이지 않자 당신은 답답한 한숨을 내쉬었습니다. -You try to start picking, but the lock is secured by something else. -당신은 채집을 시작하려고 하지만 자물쇠는 다른 것으로 고정되어 있습니다. -You whimper as you realize the lock is shielded by another strap. -자물쇠가 다른 끈으로 가려져 있다는 것을 깨닫고 훌쩍거립니다. - -You wiggle uselessly. Maybe you need some kind of tool... -쓸데없이 꼼지락대네. 뭔가 도구가 필요할지도... -You rub your body against the floor to no avail, and sigh. -바닥에 몸을 문지르며 소용없게 한숨을 내쉰다. -You contort your body but you don't have leverage. Maybe you need some kind of tool... -당신은 몸을 비틀고 있지만 지렛대를 가지고 있지 않습니다. 아마도 당신은 어떤 도구가 필요할 것입니다... -You wiggle madly, trying to push against the restraint. You need more leverage... -당신은 미친 듯이 꿈틀대며 구속에 맞서려고 합니다. 당신은 더 많은 지렛대를 필요로 합니다... - -That doesn't seem to work. Maybe something else will. -그건 통하지 않는 것 같군요. 아마 다른 일이 있을 겁니다. -You squirm helplessly against the furniture. Maybe something else will help more. -당신은 가구에 기대어 힘없이 꿈틀거립니다. 아마도 다른 것이 더 도움이 될 것입니다. -You twist your body trying to use the furniture, but it doesn't seem to work. Try something else. -가구를 쓰려고 몸을 비틀었는데 잘 안 되는 것 같다. 다른 걸 해봐. -You wiggle and squirm, trying to use the furniture to no avail. Try something else. -당신은 가구를 쓸데없이 사용하려고 몸부림치며 꿈틀거립니다. 다른 것을 시도해보세요. - -You need something sharp to loosen the fasteners. -잠금 장치를 풀려면 날카로운 것이 필요합니다. -This is not a job for your fingers right now. You need something sharp. -지금은 손가락으로 할 일이 아닙니다. 날카로운 것이 필요합니다. -There's no way to loosen it without some kind of sharp tool... -날카로운 도구 없이 풀 수 있는 방법은 없어... -You sigh as the material resists all your attempts at breaking through. -재료가 돌파하려는 모든 시도에 저항하므로 한숨을 쉬게 됩니다. - -You need some kind of corner for leverage. -지렛대를 위해 일종의 코너가 필요합니다. -You flail about but cant get any leverage without an edge or corner. -당신은 이리저리 휘둘리지만 가장자리나 모서리 없이는 어떤 영향력도 얻을 수 없습니다. -You need something rough to get the item loose. -물건을 풀려면 거친 것이 필요합니다. -You squirm against the smooth floor to no avail. Maybe if you had some kind of corner... -매끄러운 바닥에 비집고 있으면 아무 소용이 없습니다. 모퉁이가 있다면... - -You need some kind of tool to pull at the knots. -매듭을 당기려면 어떤 종류의 도구가 필요합니다. -You struggle fruitlessly against the knots, but they're too tight. -당신은 매듭에 맞서 헛되이 투쟁하지만 매듭이 너무 빡빡합니다. -You don't have any grip or hook to tug at your restraints with. -당신은 당신의 구속을 잡아당길 그립이나 갈고리가 없습니다. -You cant tug at your restraints with them tightly wrapped against your body. -당신은 당신의 몸에 단단히 감긴 구속을 잡아당길 수 없습니다. - -You need a way to stick the tool in place... -도구를 제자리에 고정할 방법이 필요합니다... -Your trembling hands cant grip anything as they are. -당신의 떨리는 손은 있는 그대로 아무것도 잡을 수 없습니다. -You need something grippy... -뭔가 그립이 필요해... -You rub yourself against the floor to no avail. Maybe if you had something adhesive... -바닥에 몸을 문지르면 아무 소용이 없습니다. 접착제가 있었으면... - - -The fastenings are tightly secured! -잠금 장치가 단단히 고정되어 있습니다! -You roll around tryng to loosen the item to no avail. -당신은 아이템을 풀려고 애쓰지만 아무 소용이 없습니다. -The item tightens itself as you try to undo it! -해제하려고 하면 항목이 조여집니다! -You can't reach it by yourself! -혼자서는 도달할 수 없습니다! -You are too tightly bound to manipulate that item. -당신은 그 아이템을 조작하기에는 너무 빡빡합니다. -Your futile struggles do nothing to loosen the fasteners. -당신의 쓸데없는 투쟁은 잠그개를 풀지 못합니다. -You try to undo the fasteners, but they are blocked by other straps! -패스너를 풀려고 하는데 다른 스트랩에 의해 막혔습니다! -You rub your body uselessly as you find another strap securing the item. -아이템을 고정하는 다른 스트랩을 찾으면 쓸데없이 몸을 문지릅니다. -The item is too durable to cut. -내구도가 너무 높아서 자를 수 없는 아이템입니다. -Your hopeless attempts fail to even leave a scratch. -당신의 가망 없는 시도는 흠집 하나 남기지 못합니다. -You fail to leave even a scratch! -흠집 하나 남기지 못하는군! -You can't get any leverage to cut it with... -당신은 그것을 삭감할 어떤 영향력도 얻을 수 없습니다... -You can't hold the knife firmly enough to cut. -칼을 자를 수 있을 만큼 단단하게 잡을 수 없습니다. -You cry out in your bindings as the knife bounces around uselessly. -칼이 쓸데없이 튕기자 속박된 상태에서 비명을 질렀습니다. -Your arms are kept from having leverage due to another item. -당신의 팔은 다른 아이템으로 인해 영향력을 행사할 수 없습니다. -You fiddle with the tool, but your arms lack leverage due to another item -당신은 도구를 만지작거리지만 다른 아이템 때문에 당신의 팔은 레버리지가 부족합니다. - -You pry at the hands... -당신은 손을 비집고 ... -You moan as the hands squeeze you tightly... -당신은 손이 당신을 꽉 쥐고 신음합니다 ... -There's no way they are just letting go! -그들이 그냥 놓아줄 리가 없어! -You whimper as you realize the hands won't let go no matter what... -무슨 일이 있어도 손이 놓이지 않는다는 것을 깨닫고 신음한다... -You hear dark laughter as you realize the hands won't let go... -당신은 손이 놓이지 않는다는 것을 깨닫고 어두운 웃음소리를 듣습니다... -You hear a dark giggle as fruitlessly try to wiggle free! -자유롭게 꿈틀대려고 애쓸 때 어두운 웃음소리가 들린다! - -You try to pull away! -떠나려고 해! -You blush and try to escape the hands' grip! -당신은 얼굴을 붉히며 손아귀에서 벗어나려고 합니다! -Their grip is too strong... -손아귀가 너무 강하다... -Their grip is too strong... it's hopeless. -그들의 손아귀가 너무 강하다... 가망이 없다. -You're bound too tight to have a chance. -당신은 기회를 갖기에는 너무 빡빡합니다. -You whimper as you realize you're too tightly bound to have a chance. -당신은 당신이 기회를 갖기에는 너무 빡빡하게 묶여 있다는 것을 깨닫고 훌쩍거립니다. - -You work to unlace the corset... -당신은 코르셋을 풀기 위해 노력하고 있습니다... -You hurriedly try to unlace the corset... -서둘러 코르셋을 풀려고 하니... -The corset has no laces to loosen! -코르셋에는 풀 끈이 없다! -You sigh as you can't find any laces to loosen. -풀 수 있는 끈을 찾을 수 없어 한숨을 쉬고 있습니다. -The laces are tied tight! -끈이 꽉 묶였어! -You hopelessly try to untie the lacing but it's just too tight! -가망 없이 끈을 풀려고 하지만 너무 빡빡해요! - -You grasp at the slime, trying to peel it off... -당신은 슬라임을 잡고 떼어내려고 합니다... -You wiggle madly as you try to peel off the slime! -당신은 미친 듯이 몸부림 치며 슬라임을 벗겨내려고 합니다! -The slime reforms as you scoop it away! -점액을 퍼내면 슬라임이 변합니다! -You can't get the slime off at all! -당신은 점액을 전혀 제거할 수 없습니다! -The slime is too fast at reforming! -슬라임의 변신 속도가 너무 빨라요! -The slime reforms too quickly as you try to squirm it off... -분액을 짜내려고 하면 슬라임이 너무 빨리 변형됩니다... - -You grasp around, looking for a seam... -주위를 움켜쥐고 이음새를 찾고... -You wiggle and squeeze yourself in various places, looking for a lead... -여러 곳에서 몸을 비틀고 짜내며 실마리를 찾는다... -The rubber encases you in a solid layer! -고무가 당신을 단단한 층으로 감싸줍니다! -Try as you might, the rubber hugs you completely without any seams! -노력해 보세요. 고무가 이음새 없이 완벽하게 몸을 감싸줍니다! -The rubber is too tight to get any traction... -고무가 너무 빡빡해서 견인력을 얻을 수 없습니다... -The rubber squeezes your body too tightly to get any sort of ply... -고무가 몸을 너무 세게 조여서 움직일 수 없습니다... - -You start peeling off the wrapping... -포장을 벗기기 시작합니다... -You scratch at the wrapping furiously... -포장지를 미친듯이 긁다니... -The material clings to your skin too tightly! -재료가 피부에 너무 꽉 달라붙어요! -You groan in frustration as you try to peel it off but realize it's too sticky. -껍질을 벗기려 하지만 너무 끈적끈적하다는 걸 깨닫고 좌절감에 신음합니다. -You can't grip the edges to peel it off! -벗기기 위해 가장자리를 잡을 수 없습니다! -You make a futile attempt to rub it off. -당신은 그것을 문지르려고 쓸데없는 시도를 합니다. - -You try to wiggle off the chains... -당신은 체인을 흔들려고 시도합니다 ... -You squirm trying to get the chains to fall off... -사슬을 떨어뜨리려고 몸부림치는군... -The chains are magical and wrap themselves back around you of their own accord. -사슬은 마법과도 같으며 저절로 당신을 감쌉니다. -The chains squeeze you tighter as you try to shake them off. -쇠사슬을 떨쳐내려 할 때 쇠사슬이 더 세게 조입니다. -The chains have you bound hopelessly tight! -쇠사슬이 당신을 절망적으로 단단히 묶었습니다! -You sigh and moan as the chains aren't getting any looser. -쇠사슬이 풀리지 않아 한숨을 쉬고 신음합니다. - -You try to untie the ropes... -당신은 밧줄을 풀려고 ... -You contort yourself trying to reach the knots... -매듭을 잡으려다 몸을 비틀어... -The knot ties itself back again as soon as you get it loose! -매듭은 풀자마자 다시 묶입니다! -The knots tighten themselves as soon as you reach them, keeping you tight and secure. -매듭은 손이 닿는 순간 스스로 조여져 단단하고 안전하게 유지됩니다. -You can't reach the knots! -매듭에 닿을 수 없습니다! -Your squirming is in vain as you can't even reach the knots. -당신의 꿈틀거림은 매듭에 닿지도 못하기 때문에 헛된 것입니다. - -You try to pull off the clamps... -너는 클램프를 빼려고 해... -You tug on your clamps trying to get them off! -클램프를 떼어내려고 잡아당겼잖아! -That would really hurt... -그거 진짜 아플텐데... -You realize that would really hurt... -그게 정말 아플 거라는 걸 알잖아... -The clamps tug on your nipples as you squirm! -당신이 꿈틀거릴 때 집게가 당신의 젖꼭지를 잡아당깁니다! -The clamps tug on your nipples as you squirm! -당신이 꿈틀거릴 때 집게가 당신의 젖꼭지를 잡아당깁니다! -The chest is too smooth to help. Maybe if you opened it? -상자가 너무 부드러워서 도움이 안 돼요. 열면 아마? +### The TargetRestraint is too secure to struggle out. -Lockable -잠금 가능 -Non-Lockable -잠글 수 없음 +### You groan in frustration as you realize the TargetRestraint is too tight to escape. -Unlocked -잠금 해제 -Lock Type: -잠금 유형: -Red -빨강 -Simple -심플 -Green -초록 -Blue -파랑 -Purple -보라 -Gold -금 -Yellow -노랑 -Red Lock -빨간 자물쇠 -Simple Lock -심플한 자물쇠 -Green Lock -초록 자물쇠 -Blue Lock -파란 자물쇠 -Purple Lock -보라 자물쇠 -Yellow Lock -노란 자물쇠 +### The TargetRestraint tightens itself as you try to squeeze out! +### You will need someone's help to squeeze out of the TargetRestraint. +### The TargetRestraint flashes magically as the Goddess' curse resists your efforts! +### The TargetRestraint holds firm against your attempts, held back by your restrictions. +### You pull and tug but your other restraints keep the TargetRestraint securely in place! +### You groan and tug but nothing budges on the TargetRestraint. You're bound too tightly by something else. -(G) -(G) -(S) -(S) -(B) -(B) -(G) -(G) -(P) -(P) -(?) -(?) -(Y) -(Y) +### You are too tightly bound to have a chance against the TargetRestraint. -You can't drink that while gagged! -재갈을 물린 상태에서 마실 수 없습니다! -You can't use that without your fingers! -손가락 없이는 사용할 수 없습니다! -You struggle against your bindings but it's too strict!. -당신은 당신의 속박에 맞서 싸우고 있지만 그것은 너무 엄격합니다!. -You drop the pick due to your bound hands! -손이 묶여서 락픽을 떨어뜨렸습니다! -You drop your knife due to your bound hands! -손이 묶인 탓에 칼을 떨어뜨리다니! -You drop the precious knife due to your bound hands! -손이 묶인 탓에 소중한 칼을 떨어뜨렸습니다! -You drop the key due to your bound hands! -손이 묶인 탓에 열쇠를 떨어뜨렸습니다! -You drop the magic key due to your bound hands! -손이 묶인 탓에 마법의 열쇠를 떨어뜨렸습니다! -You drop the magic key due to your bound hands! -손이 묶인 탓에 마법의 열쇠를 떨어뜨렸습니다! +### You shake and moan as you realize your struggles against the TargetRestraint are futile. -Logbook -일지 -Logbook (N) -일지 (N) -Passing... -통과... -Pass NPCs -NPC 통과 -Closing... -닫는중... -Close door -문을 닫다 -Sprinting!!! -달립니다!!! -Sprint! -달리기! -Hopping!!! -도약합니다!!! -Hop! -도약! -You run! -당신은 달립니다! -You hop desperately! -당신은 필사적으로 뜁니다! -Close Door -문 닫기 -Unlock -잠금 해제 -Command -명령 -You utter a command word and release the lock! -당신은 명령 단어를 말하고 자물쇠를 해제합니다! -You mutter an unintelligible command word and your locks do not open. -이해할 수 없는 명령을 중얼거려도 자물쇠가 열리지 않습니다. -You mumble a command word but the lock opens! -당신이 명령 단어를 말하자, 자물쇠가 열립니다! -You mess up saying the command word. The lock stays put! -당신은 명령어를 잘못 말했습니다. 자물쇠는 제자리에 있습니다! -Pick -락픽 -(No way to open) -(열 수 있는 방법이 없습니다) -(She cannot help you) -(그녀는 당신을 도울 수 없습니다) -Offer XXXg -XXXg 제공 -Offer -권하다 -You do not have enough for a proper offering. -적절한 제물을 바칠 만큼 충분하지 않습니다. -The goddess removes some of your restraints! -여신이 당신의 속박을 풀어줍니다! -The goddess restores your mental and physical state! -여신이 당신의 심신을 회복시켜 드립니다! -The goddess teaches you the secrets of SCHOOL. (+1 level) -여신이 학교의 비밀을 가르쳐준다. (+1 level) -The goddess of SCHOOL grants you destructive spellcasting! -학교의 여신이 당신에게 파괴적인 마법을 부여합니다! -The goddess of SCHOOL grants you invisibility on attacks! -SCHOOL의 여신이 공격에 대해 투명화를 부여합니다! -The goddess of SCHOOL grants you protection and retaliation! -SCHOOL의 여신이 당신을 보호하고 보복합니다! -You leave the coins on the altar and they transform into a ItemBought! -동전을 제단에 두면 아이템 구매로 바뀝니다! -object -오브젝트 +### You can't find a keyhole on the TargetRestraint! -It appears to be a receptacle for an ancient crystal. -고대 수정을 담는 그릇인 것 같습니다. -It's a pile of slag emitting a strange magic smoke... -이상한 마력의 연기를 내뿜는 슬래그 더미야... -That object is locked -그 개체는 잠겨 있습니다 -A shrine to the goddess of TYPE. A pool of mana glimmers below. -TYPE의 여신을 모시는 신전. 그 아래에는 마력의 웅덩이가 반짝인다. -A shrine to the goddess of TYPE. -TYPE의 여신을 모시는 신전. -That door is open. Do you want to close it? -그 문은 열려 있습니다. 닫으시겠습니까? -You slam the door and jam it shut! -당신은 문을 쾅 닫고 잼! -Submissiveness -순종 -Security Level -보안 수준 -Undead -언데드 -Latex -라텍스 -Leather -가죽 -Metal -금속 -Ropes -로프 -Restoration -회복 -Elements -정령 -Conjuration -주술 -Illusions -환상 -Commerce -상업 +### You sigh as you give up trying to find any kind of keyhole on the TargetRestraint. -Curses -저주 -Willpower -의지력 +### The TargetRestraint can't be unlocked without a special command! -A tablet inscribed with runes of TYPE. -TYPE 의 룬 문자가 새겨진 서판. -Decypher -해독 -You read the runes and they imbue you with power! -룬을 읽고 힘을 얻습니다! -You try to read the runes but cannot understand them. -당신은 룬을 읽으려고 하지만 이해할 수 없습니다. +### You can't reach the keyhole on the TargetRestraint by yourself! -Allies: -동맹: -Enemies: -적: +### You can't hold the key to unlock the TargetRestraint with. -Nevermere Trainers -네버미어 트레이너 -DressUp Co. -주식회사 드레스업 -Bounty Hunters Guild -현상금 사냥꾼 길드 -Bandits -밴딧 -Constructs -구성 -Witches' Coven -마녀 집회 -School of Magic -마법 학교 -Old Guardians -올드 가디언 -Cult of the Wild -컬트 오브 더 와일드 -Cult of Bast -바스트 숭배 -Alchemists -연금술사 -Elementals -정령들 -Dragonheart Order -드래곤하트 오더 -MaidForce -메이드포스 -Fungal Kingdom -곰팡이 왕국 +### Your bound and shaking hands can't even hold the key for the TargetRestraint. -Wanted -수배 -Delinquent -체납 -Illegal Poacher -불법 밀렵꾼 -Nature -자연 -Surprise! -서프라이즈! +### The goddess punishes you for trying to unlock the TargetRestraint! -Angels -천사 -Demons -악마 +### You are too restricted to get the key into place! -You sense that the chest contains a trap and a lot of gold. -상자에 덫과 많은 금이 들어 있는 것이 느껴집니다. -You sense that the chest is safe to open. -상자를 열어도 안전하다는 느낌이 듭니다. +### You try, but something is keeping your hands away from the TargetRestraint. -Bottle -병 -You drink from the pool and and absorb its energies. -당신은 수영장에서 물을 마시고 그 에너지를 흡수합니다. -You absorb the pool's energies through your face. -당신은 당신의 얼굴을 통해 웅덩이의 에너지를 흡수합니다. -You collect what mana you can in a bottle. -병에 최대한 마나를 모을 수 있습니다. -You drink from the pool and your mana is restored. -수영장에서 물을 마시면 마나가 회복됩니다. -You drink again, but you feel as if you are trespassing. -또 마시지만 무단 침입한 것 같은 느낌이 듭니다. -You drink again, knowing the risk this may entail... -이것이 수반할 수 있는 위험을 알면서 또 마십니다... -You have angered the goddess of TYPE!!! -타입의 여신님을 화나게 하셨습니다!!! -The slime washes off in the fountain!!! -점액이 샘물에 씻겨내려갔어!!! +### You flail the key around uselessly but a strap is preventing you from unlocking the TargetRestraint! -The goddess offers a ItemTraded for ItemCost (NumCurrent/NumMax) -여신은 ItemCost (NumCurrent/NumMax)에 대해 ItemTraded 를 제공합니다. -Next Offer -다음 제안 -Buy -구입 -Cost: ItemCostgp -비용: ItemCostgp +### This lock on the TargetRestraint is beyond your skill level! -You climb down to the next level -당신은 다음 단계로 내려갑니다 +### You whimper as you realize the lock on the TargetRestraint is far too secure. -Level RestraintLevel (Rarity) -Level RestraintLevel(Rarity) +### There is no visible locking mechanism on the TargetRestraint. -Consumable -소모품 -Equipped -갖추어 준 -Weapons -무기 -Outfits -복장 -Wearable -의복 -Miscellaneous -여러 가지 잡다한 +### You can't pick the TargetRestraint by yourself, you'll need help. -The terrain makes noise as you rush across it... -지형은 당신이 그것을 가로질러 돌진할 때 소리를 냅니다... +### You can't maneuver the lockpick well enough to unlock the TargetRestraint. -You can't reach the cuffs on your elbows, the chain is too short... -팔꿈치의 수갑에 닿을 수 없습니다. 체인이 너무 짧습니다... -You contort your arms trying to reach the cuffs on your elbows, to no avail... -팔꿈치의 소맷부리에 닿으려고 팔을 비틀어 봤지만 소용이 없었습니다... -Your elbows are kept together by the elbow cuffs, and you can't reach them. -당신의 팔꿈치는 팔꿈치 커프스로 함께 유지되며 닿을 수 없습니다. +### You let out a frustrated sigh as your quivering pick makes no progress on the TargetRestraint. -The strict chain on the cuffs keeps you from reaching them easily. -소맷부리의 엄격한 체인으로 인해 쉽게 손이 닿지 않습니다. -The cuffs limit your range of motion, making it harder to remove them. -수갑은 운동 범위를 제한하여 제거하기 어렵게 만듭니다. -It's hard to take off the cuffs with your wrists linked together... -손목이 묶인 채 수갑 풀기가 힘들어... +### You try to start picking, but the lock on the TargetRestraint is secured by something else. -You feel drained of energy... -기력이 고갈된 느낌... -Your collar tingles and suddenly you feel weaker... -당신의 옷깃이 간지럽고 갑자기 약해집니다... -Your collar drains your energy as you struggle... -고군분투할 때 옷깃이 에너지를 소모합니다... +### You whimper as you realize the lock on the TargetRestraint is shielded by another strap. -The rope between your legs keeps the toy secure... -다리 사이의 밧줄이 장난감을 안전하게 지켜줍니다... -Try as you might, the toy is held in place tight. -노력해 보세요. 장난감이 제자리에 단단히 고정되어 있습니다. -The toy won't wiggle loose. It's kept in place by your restraints. -장난감이 흔들리지 않습니다. 당신의 구속으로 제자리에 고정됩니다. +### You are distracted from the TargetRestraint by mental images of yourself remaining in bondage... -Your catsuit adheres to latex, making struggling more difficult! -당신의 캣슈트는 라텍스에 달라붙어 투쟁을 더 ​​어렵게 만듭니다! -The item sticks to your rubber catsuit, making it harder to pull off... -아이템이 고무 캣슈트에 달라붙어 벗기가 더 어려워집니다... -The item hugs your catsuit tightly, adhering firmly! -당신의 캣수트를 쫀쫀하게 감싸주는 아이템! +### Your restrictions ruin your dexterity. You can't pick the TargetRestraint. -You hear an ominous click, but nothing seems to happen. Looks like a misfire! -불길한 딸깍 소리가 들리지만 아무 일도 일어나지 않는 것 같습니다. 실화인 것 같습니다! +### You wiggle uselessly in the TargetRestraint. Maybe you need some kind of tool... -Barrel Trap -배럴 트랩 -A booby-trapped barrel with a spring-loaded lid designed to trap you inside! -당신을 안에 가두도록 설계된 용수철이 달린 뚜껑이 있는 부비 트랩 배럴! -You can push the lid off with enough force... -충분한 힘으로 뚜껑을 밀어낼 수 있습니다... -The lid of the barrel suddenly snaps shut as you hide inside!!! -당신이 안에 숨어 있을 때 배럴의 뚜껑이 갑자기 닫힙니다!!! +### You rub your body against the floor to no avail, and sigh as the TargetRestraint stays secure. -Cage Trap -케이지 트랩 -A booby-trapped cage! -부비 트랩 케이지! -Fit for a pretty toy like you~ -너처럼 예쁜 장난감에 딱~ -Display Stand -디스플레이 스탠드 -A display stand, fit for only the prettiest of trophies! -가장 예쁜 트로피만 올려놓을 수 있는 진열대! -Your arms are pinned behind your back and you can barely move! -팔이 등 뒤로 고정되어 거의 움직일 수 없습니다! -You hear a click as the door shuts behind you... -뒤에서 문이 닫힐 때 딸깍하는 소리가 들립니다... +### You contort your body but you don't have leverage on the TargetRestraint. Maybe you need some kind of tool... -You're not fooling anyone... -당신은 아무도 속이지 않습니다 ... -You might be able to fool someone like this... -이런 식으로 사람을 속일 수 있을지도... -You look like you're right at home! -당신은 당신이 바로 집에 있는 것 처럼 보인다! +### You struggle madly, trying to push against the TargetRestraint. You need more leverage... -Restraining Bed -억제 침대 -A bed with a booby trap designed to trap you on top of it! -당신을 그 위에 가두도록 설계된 부비 트랩이 있는 침대! -You have to get out somehow... -어떻게든 나가야지... -Belts emerge from underneath the bed and wrap around you, strapping you down tightly! -벨트가 침대 밑에서 나와 몸을 감싸며 몸을 단단히 묶습니다! +### That doesn't seem to work. Maybe something else will help with the TargetRestraint. -Binding Dress -바인딩 드레스 -It's a devious dress! I hope your elbows are flexible~ -사악한 드레스야! 팔꿈치가 유연했으면 좋겠어~ -So many laces! It would quite a while to put this on normally. That's what magic is for! -끈이 너무 많아! 평소에 이거 신으려면 꽤 시간이 걸릴 거야. 그게 바로 마법이 필요한 이유야! -Ornamental Corset -장식용 코르셋 -Your figure looks gorgeous in this~ -이거 보니 몸매가 멋져요~ -It's so tight you won't be able to undo the laces yourself, dear! -너무 빡빡해서 스스로 끈을 풀 수 없을 거예요, 얘야! +### You squirm helplessly against the furniture. Maybe something else will help with the TargetRestraint. -Fancy Ball Gag -멋진 볼 개그 -A cute ball gag that fills your mouth right up! -입이 떡 벌어지는 귀여운 볼개그! -What's this? it seems to have a magic spell protecting it from harm! -이게 뭐야? 위험으로부터 지켜주는 마법이 있는 것 같아! -Fancy Muzzle -멋진 총구 -A muzzle to keep you from spitting out what's underneath. -아래에 있는 것을 뱉어내지 못하게 하는 총구. -Sorry dear, there's a mystic seal on there to keep it on nice and tight. -미안해, 얘야, 거기에 신비의 봉인이 있어 그것을 단단하고 단단하게 고정할 수 있어. +### You twist your body trying to use the furniture, but it doesn't seem to work. The TargetRestraint remains tight. -Red Binding Dress -레드 바인딩 드레스 -A devious dress that forces the arms into an elbows-touching position. -팔꿈치가 닿는 위치로 팔을 강요하는 교활한 드레스. -It is extremely strict but it is only fabric. The lacing is intricate and will take a long time to remove. -매우 엄격하지만 천일 뿐입니다. 끈이 복잡하고 제거하는 데 시간이 오래 걸립니다. +### You wiggle and squirm, trying to use the furniture to no avail. The TargetRestraint remains tight. -Ornamental Gag -장식 개그 -A gag meant to keep servants of the Resurrection Temple quiet by forcing a dildo into their mouth. -부활의 사원을 섬기는 신하들의 입에 딜도를 억지로 집어넣어 조용히 시키려는 재갈. -It is difficult to pull off and though it is made from white leather, a magic enchantment protects it from cutting. -벗기기 힘들고 흰색 가죽으로 만들어졌지만 마법의 마법이 걸려 있어 잘리지 않는다. +### You need something sharper to get at the TargetRestraint. -Panel Plug Gag -패널 플러그 개그 -A gag meant to keep people quiet by forcing a dildo into their mouth. -딜도를 강제로 입에 넣어 사람들을 조용히 시키기 위한 개그. -It is difficult to pull off and though it is made from supple, heavy duty leather. -부드럽고 튼튼한 가죽으로 만들어졌음에도 불구하고 떼어내기가 어렵습니다. +### This is not a job for your trembling fingers right now. -Fuuka's Collar -후우카의 목걸이 -A collar enchanted with ghastly energy. -끔찍한 기운이 깃든 목걸이. -It seems to react with a pulse of energy whenever a nearby enemy is defeated. -근처의 적이 쓰러질 때마다 에너지의 파동으로 반응하는 것 같습니다. -Your collar pulses, and a revenant appears to avenge the enemy you defeated! -당신의 목걸이가 맥동하고, 당신이 쓰러뜨린 적에게 복수하기 위해 레버넌트가 나타납니다! +### Tugging on the TargetRestraint is useless. Maybe if you had something sharp... -Dress Bustier -드레스 뷔스티에 -A deceptively cruel device, making it impossible to reach your nipples. -당신의 유두에 접근하는 것을 불가능하게 만드는 믿을 수 없을 정도로 잔인한 장치. -Reinforced with steel plates, this will need bolt cutters to take off. -철판으로 보강되어 있어 이륙하려면 볼트 커터가 필요합니다. +### You sigh as the TargetRestraint resists all your attempts at breaking through. -Nipple Massagers -젖꼭지 마사지기 -A pair of little teasers. -작은 티저 한 쌍. -They will make for some great fun! -그들은 큰 재미를 만들 것입니다! +### You fidget with the TargetRestraint but can't reach the clasps without some kind of edge. -Control Harness -컨트롤 하네스 -An advanced harness for controlling high-security prisoners. -보안 수준이 높은 죄수를 통제하기 위한 고급 하네스입니다. -It seems to be made of flexible steel plates. -유연한 철판으로 만들어진 것 같다. +### You flail about but your hands are unable to reach the TargetRestraint. -Tracking Collar -추적 목걸이 -An advanced collar for tracking high-security prisoners. -보안이 철저한 죄수를 추적하기 위한 고급 목걸이입니다. -It seems to be made of flexible steel plates, and it has a high-security lock. -유연한 철판으로 만들어진 것 같고 보안 수준이 높은 잠금 장치가 있습니다. +### You can't reach the clasps on the TargetRestraint. If only you had some other way... -Latex Ball Gag -라텍스 볼 개그 -A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. -볼 개그처럼 생겼지만 내부에 입에 가득 채우는 막대가 있는 기만적인 장치입니다. -The strap is made of a durable but flexible material -스트랩은 튼튼하면서도 유연한 소재로 제작되었습니다 +### You squirm around, rubbing the TargetRestraint against the smooth floor to no avail... -Latex Mask -라텍스 마스크 -A slick layer of blue latex stretched over the mouth. -파란색 라텍스의 매끄러운 층이 입 위에 펼쳐져 있습니다. -It's very tight and makes it hard to move your mouth. -매우 빡빡해서 입을 움직이기가 어렵습니다. +### The knots on the TargetRestraint are too tight to pull apart without a hook. -Wolf Panties -늑대 팬티 -A set of vibrating panties designed to help subdue unruly wolfgirls. -제멋대로인 늑대소녀를 제압하는 데 도움이 되도록 설계된 진동 팬티 세트입니다. -It's incredibly tight and difficult to remove once it's clipped on, but the material is rubber. -엄청나게 빡빡하고 한 번 끼우면 제거하기 어렵지만 재료는 고무입니다. +### You struggle fruitlessly against the knots on the TargetRestraint, but they're too tight. -You don't meet the conditions to equip that. -당신은 그것을 장착할 조건을 충족하지 않습니다. +### The TargetRestraint is too tight against your body. You'll need more leverage to pull it off. -Latex Boxtie Binder -라텍스 Boxtie 바인더 -A secure but comfortable binder meant for long-term wear by the alchemists' pets. -연금술사의 애완동물이 장기간 착용할 수 있는 안전하지만 편안한 바인더입니다. -Made from imbued latex, it will be hard to cut but not impossible. -마력이 깃든 라텍스로 만들어졌으니 자르기는 어렵지만 불가능하지는 않습니다. -Binder Straps Cincher -바인더 스트랩 Cincher -A tight cincher attached to a binder used to ensure restraints will not come off. -고정 장치가 풀리지 않도록 하기 위해 사용되는 바인더에 부착된 꽉 끼는 끈. -It's tied in the back and reinforced with steel boning. -뒤에 묶여 있고 강철 뼈대로 보강되어 있습니다. -Blacksteel Ankle Cuffs -블랙스틸 앵클 커프스 -Highly durable cuffs that can withstand even powerful acid. -강한 산에도 견딜 수 있는 내구성이 뛰어난 커프스. -They are not coming off without the key. -그들은 열쇠 없이는 나오지 않습니다. -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! -Cuffs Chain -커프스 체인 -Highly durable cuffs that can withstand even powerful acid. -강한 산에도 견딜 수 있는 내구성이 뛰어난 커프스. -They are not coming off without the key. -그들은 열쇠 없이는 나오지 않습니다. -The ankle cuff chain detaches! -발목 커프스 체인이 분리되었습니다! -Latex Posture Collar -라텍스 자세 목걸이 -A strict collar that makes it tougher to escape from other items. -다른 아이템에서 벗어나기 어렵게 만드는 엄격한 목걸이. -It has steel boning but could be cut with enough care. -강철 뼈대가 있지만 충분히 주의해서 자를 수 있습니다. -Metal Ballet Heels -메탈 발레 힐 -A pair of strict boots for making pets more manageable. A skilled person can still walk in these. -애완동물을 다루기 쉽게 만드는 엄격한 부츠입니다. 숙련된 사람이라면 이 신발을 신을 수 있습니다. -They are reinforced with metal and impossible to remove with a knife. -금속으로 보강되어 칼로 제거할 수 없습니다. +### You shake yourself around trying to rub off the TargetRestraint, but it's hopeless. -High-Security Armbinder -높은 보안 암밴드 -An mythril armbinder enclosing your hands and arms completely, making your hands useless. -당신의 손과 팔을 완전히 감싸, 당신의 손을 쓸모없게 만드는 미스릴 암바인더. -Made of a flexible, yet durable material, it's going to be really tough to escape. -유연하면서도 내구성이 뛰어난 소재로 만들어져 탈출하기가 정말 어려울 것입니다. -High-Security Legbinder -보안이 철저한 다리 결속기 -An mythril legbinder enclosing your legs, making it difficult to move. -다리를 감싸고 있어 움직이기 어렵게 만드는 미스릴 레그바인더. -Made of a flexible, yet durable material, it's going to be really tough to escape. -유연하면서도 내구성이 뛰어난 소재로 만들어져 탈출하기가 정말 어려울 것입니다. -High-Security Shackles -높은 보안 족쇄 -A pair of mythril shackles around your feet. -발에 두른 미스릴 족쇄. -Nearly indestructable, you are at the mercy of its lock. -거의 파괴 불가능, 당신은 그것의 자물쇠에 자비입니다. -High-Security BallGag -높은 보안 BallGag -A rubber gag shoved tightly between your lips. -입술 사이에 고무 재갈이 꽉 끼어 있습니다. -The mythril straps are nigh-unbreakable, keeping you securely silenced. -미스릴 스트랩은 거의 깨지지 않아 안전하게 침묵할 수 있습니다. +### You need more grip to peel off the TargetRestraint... -Potion Absorber -포션 업소버 -An ancient device that allows direct use of potions even while gagged or bound. -재갈을 물렸거나 묶인 상태에서도 물약을 직접 사용할 수 있게 해주는 고대의 장치입니다. -Also allows fitting of a leash. -또한 가죽 끈을 끼울 수 있습니다. -Potion Absorber -포션 업소버 -An ancient device that allows direct use of potions even while gagged or bound. -재갈을 물렸거나 묶인 상태에서도 물약을 직접 사용할 수 있게 해주는 고대의 장치입니다. -Also allows fitting of a leash. -또한 가죽 끈을 끼울 수 있습니다. -Slime Walkers -슬라임 워커 -A pair of heels coated in a nonstick material. -눌어붙지 않는 소재로 코팅된 힐. -They will slow you down, but you can walk on slime without getting stuck! -그들은 당신을 느리게 할 것이지만, 당신은 갇히지 않고 슬라임 위를 걸을 수 있습니다! -Slime Walkers -슬라임 워커 -A pair of heels coated in a nonstick material. -눌어붙지 않는 소재로 코팅된 힐. -They will slow you down, but you can walk on slime without getting stuck! -그들은 당신을 느리게 할 것이지만, 당신은 갇히지 않고 슬라임 위를 걸을 수 있습니다! +### Your trembling hands cant grip anything as they are, let alone undo the TargetRestraint. -Gloves of Dexterity -손재주 장갑 -A pair of gloves that makes your hits strike with elven grace--and force. -엘프의 우아함과 힘으로 일격을 가하는 장갑입니다. -Increases accuracy by +50. Reduces melee damage by 30%. -정확도가 +50 증가합니다. 근접 데미지가 30% 감소합니다. -Gloves of Dexterity -손재주 장갑 -A pair of gloves that makes your hits strike with elven grace--and force. -엘프의 우아함과 힘으로 일격을 가하는 장갑입니다. -Increases accuracy by +50. Reduces melee damage by 30%. -정확도가 +50 증가합니다. 근접 데미지가 30% 감소합니다. -You find a pair of leather gloves with a magic rune. -마법의 룬이 새겨진 가죽 장갑을 찾았습니다. +### You rub yourself against the floor to no avail... -Bracers of Roaring Tides -울부짖는 파도의 팔보호구 -A pair of bracers that conjures a mighty wave upon attacking. -공격 시 강력한 파동을 불러일으키는 한 쌍의 팔보호구입니다. -Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage. -공격 시 AoE 지연 폭발을 일으켜 적을 기절시키고 10의 산성 피해를 입힙니다. -Bracers of Roaring Tides -울부짖는 파도의 팔보호구 -A pair of bracers that conjures a mighty wave upon attacking. -공격 시 강력한 파동을 불러일으키는 한 쌍의 팔보호구입니다. -Creates an AoE delayed explosion on attack that stuns enemies and deals 10 acid damage. -공격 시 AoE 지연 폭발을 일으켜 적을 기절시키고 10의 산성 피해를 입힙니다. -You find a pair of bracers that are transparent like water. -물처럼 투명한 팔 보호구를 찾았습니다. +### The fastenings are too tight and secure on the TargetRestraint! +### You roll around tryng to loosen the TargetRestraint to no avail. +### The TargetRestraint tightens itself as you try to undo it! +### You can't reach the TargetRestraint by yourself! +### You are too tightly bound to manipulate the TargetRestraint. +### Your futile struggles do nothing to loosen the fasteners on the TargetRestraint. +### You try to undo the fasteners on the TargetRestraint, but they are blocked by other straps! +### You rub your body uselessly as you find another strap securing the TargetRestraint. +### You feel the Goddess' hand keeping the TargetRestraint tightly secured! +### The TargetRestraint is too well-secured to take off with your level of restriction. +### The TargetRestraint is too durable to cut. -You find -찾아 +### Your hopeless attempts fail to even leave a scratch on the TargetRestraint. +### You fail to leave even a scratch on the TargetRestraint! +### You can't get any leverage to cut the TargetRestraint with... +### You can't hold the knife firmly enough to cut the TargetRestraint. +### You cry out in your bindings as the knife bounces against the TargetRestraint uselessly. +### Your arms are kept from having leverage on the TargetRestraint due to another item. +### You fiddle with the tool, but your arms lack leverage on the TargetRestraint due to another item +### Your restrictions limit your cutting power, unable to hurt the TargetRestraint. +### You pry at the TargetRestraint... +### You moan as the TargetRestraint squeeze you tightly... +### There's no way the TargetRestraint are just letting go! +### You whimper as you realize the TargetRestraint won't let go no matter what... +### You hear dark laughter as you realize the TargetRestraint won't let go... -You find -찾아 +### You hear a dark giggle as fruitlessly try to wiggle free from the TargetRestraint! +### You try to pull away from the TargetRestraint! +### You blush and try to escape the TargetRestraint's grip! +### The TargetRestraint's grip is too strong... +### The TargetRestraint's grip is too strong... it's hopeless. +### You're bound too tight to have a chance at shaking off the TargetRestraint. +### You whimper as you give up struggling against the TargetRestraint. +### You wiggle around trying to get the TargetRestraint out... +### You squirm around trying to dislodge the TargetRestraint... +### The TargetRestraint is in too deeply, it won't come out. +### You feel the TargetRestraint slide around inside but it won't come out! +### Your bondage keeps the TargetRestraint firmly in place. +### Your struggling does nothing but shift the TargetRestraint's position inside of you. -You find -찾아 +### The TargetRestraint won't come out. -Collar -목걸이 -A classy leather collar. -고급스러운 가죽 목걸이. -Allows fitting of a leash. -목줄을 끼울 수 있습니다. -Slave Collar -노예목걸이 -A high-security steel collar befitting of a slave. -노예에 걸맞는 보안성이 높은 강철 목걸이. -Allows fitting of a leash. -목줄을 끼울 수 있습니다. -Enchanted Collar -인챈티드 목걸이 -A collar made with magically enchanted materials. It is difficult to cut off. -마법의 마력이 깃든 재료로 만든 목걸이. 잘리기 어렵다. -Allows fitting of a leash. -목줄을 끼울 수 있습니다. -Kitty Collar -키티 목걸이 -A collar made with magically enchanted materials. It is protected by the blessing of Bast. -마법의 마력이 깃든 소재로 만든 목걸이. 바스트의 가호로 지켜지고 있다. -Allows fitting of a leash. -목줄을 끼울 수 있습니다. -Leash -속박 -A leash made from a strong material. -튼튼한 재질로 만든 목줄. -Functions as a handle for moving unruly prisoners. -제멋대로인 죄수를 움직이는 손잡이 역할을 합니다. +### You feel the TargetRestraint slide around but it won't come out! -Prisoner Plug -죄수 플러그 -A teaser to keep you occupied. -당신을 사로잡을 티저. -Buzzes on spellcast, and periodically as well. -주문 시전 시 윙윙거리며 주기적으로 윙윙거립니다. -High-Security Chastity Belt -높은 보안 순결 벨트 -A chastity belt to protect prisoners from themselves. -죄수를 자신으로부터 보호하기 위한 정조대. -Made of a highly durable material. -내구성이 뛰어난 소재로 제작되었습니다. -Blacksteel Chastity Belt -블랙스틸 순결 벨트 -A chastity belt to protect prisoners from themselves. -죄수를 자신으로부터 보호하기 위한 정조대. -Made of a highly durable material. -내구성이 뛰어난 소재로 제작되었습니다. +### Your bondage keeps the TargetRestraint secure in place. -Charms (Arms) -부적(무기) -A band of faintly magic ribbon wrapped tight around your arms. -어렴풋이 마법의 리본이 팔에 단단히 감겨 있습니다. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Charms (Legs) -참(다리) -A band of faintly magic ribbon wrapped tight around your thighs. -허벅지를 단단히 감싸는 희미한 마법의 리본 밴드. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Charms (Feet) -매력(발) -A band of faintly magic ribbon wrapped tight around your ankles. -발목을 단단히 감싸는 희미한 마법의 리본 밴드. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Charms (Head) -참(머리) -A band of faintly magic ribbon wrapped tight around your eyes. -당신의 눈을 팽팽하게 감싼 희미한 마법의 리본 띠. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Charm Gag -매력 개그 -A band of faintly magic ribbon wrapped tight around your mouth. -약하게 마법의 리본이 입 주위를 단단히 감습니다. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Charm Wrapping (Toes) -참 감싸기(발가락) -A layer of faintly magic ribbon wrapped tight around your feet. -어렴풋이 마법의 리본이 발을 단단히 감싸고 있습니다. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Charm Wrapping (Head) -참 포장(머리) -A layer of faintly magic ribbon wrapped tight around your face. -어렴풋이 마법의 리본이 얼굴을 팽팽하게 감쌉니다. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Charm Wrapping (Arms) -참 포장(팔) -A layer of faintly magic ribbon wrapped tight around your body. -어렴풋이 마법의 리본이 몸을 단단히 감쌉니다. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Charm Wrapping (Feet) -참 감싸기(발) -A layer of faintly magic ribbon wrapped tight around your shins. -정강이를 단단하게 감싸는 희미한 마법의 리본. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Charm Wrapping (Legs) -참 포장(다리) -A layer of faintly magic ribbon wrapped tight around your thighs. -허벅지를 감싸는 희미한 마법 리본. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. +### Your struggling does nothing to dislodge the TargetRestraint. -Leather Panel Gag -가죽 패널 개그 -A gag that seals your lips tightly and stuffs your mouth with a ball. -입술을 꽉 물고 볼을 입에 넣는 개그. -The harness is comprehensive and it's locked in place. -벨트는 포괄적이며 제자리에 고정되어 있습니다. -Harness Ball Gag -하네스 볼 개그 -A gag that stuffs your mouth with a large silicone ball. -커다란 실리콘 볼로 입가를 채우는 개그. -The harness is comprehensive and it's locked in place. -벨트는 포괄적이며 제자리에 고정되어 있습니다. -Bast Gag -인피부 개그 -A gag used to silence new initiates of the Bast cult. -바스트 교단의 신입 입회자들을 침묵시키기 위해 사용하는 재갈. -The harness is comprehensive and it's locked in place. -벨트는 포괄적이며 제자리에 고정되어 있습니다. -Bast Muzzle -인피부 총구 -A muzzle used to keep a Bast gag secure. -바스트 개그를 고정하는 데 사용되는 총구입니다. -The leather panel is tough and tight. -가죽 패널은 질기고 빡빡합니다. -Bast Blindfold -인피 눈가리개 -A blindfold used to aid in meditation. -명상에 도움이 되는 눈가리개. -It is padded but still lets some light through. -패딩이 되어 있지만 여전히 약간의 빛이 통과합니다. -Bast Paws -인피 발 -Leather mittens used to pacify new initiates of the Bast cult. -바스트 교단의 새로운 입회자들을 진정시키는 데 사용되는 가죽 벙어리장갑입니다. -They make it hard to manipulate anything at all, but aren't the toughest material. -그것들은 무엇이든 조작하기 어렵게 만들지 만 가장 힘든 재료는 아닙니다. -Bast Suit -바스트 수트 -A skintight suit used on unruly initiates of the Bast cult. -제멋대로인 바스트 교단 입회자들에게 사용되는 몸에 꼭 맞는 옷입니다. -It's nearly impossible to escape without help once locked inside. -한 번 안에 갇히면 도움 없이 탈출하는 것은 거의 불가능합니다. -Bast Petsuit -바스트 펫슈트 -Enhanced suit used for select members of the Bast cult. -바스트 컬트의 선별된 구성원에게 사용되는 향상된 슈트입니다. -It's nearly impossible to escape without help once locked inside. -한 번 안에 갇히면 도움 없이 탈출하는 것은 거의 불가능합니다. -Magic Petsuit -매직 펫수트 -A set of straps and buckles enchanted with a powerful spell to render you helpless. -당신을 무력하게 만드는 강력한 마법이 부여된 스트랩과 버클 세트입니다. -It's warded against cutting by nonmagic blades. -마법이 아닌 칼날에 의한 절단을 방지합니다. +### You work to unlace the TargetRestraint... -Blessed Wrappings (Head) -축복받은 포장(머리) -A band of magic embalming ribbon wrapped tight around your eyes. -당신의 눈을 단단히 감싼 마법의 방부 처리 리본 밴드. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Blessed Wrappings (Gag) -축복받은 포장지(개그) -A band of magic embalming ribbon wrapped tight around your mouth. -당신의 입을 단단히 감싸는 마법의 방부 처리 리본입니다. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Blessed Wrappings (Arms) -축복받은 포장(팔) -A layer of magic embalming ribbon wrapped tight around your body. -당신의 몸을 단단히 감싼 마법의 방부 처리 리본. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Blessed Wrappings (Feet) -축복받은 포장지(발) -A layer of magic embalming ribbon wrapped tight around your shins. -정강이를 단단히 감싸는 마법의 방부 처리 리본. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Blessed Wrappings (Toes) -축복받은 포장지(발가락) -A layer of magic embalming ribbon wrapped tight around your feet. -발에 단단히 감긴 마법의 방부 처리 리본. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. -Blessed Wrappings (Legs) -축복받은 포장지(다리) -A layer of magic embalming ribbon wrapped tight around your thighs. -허벅지를 단단히 감싸는 마법의 방부 처리 리본. -It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. -그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. +### You hurriedly try to unlace the TargetRestraint... +### The TargetRestraint has no laces to loosen! -Autotape (Hands) -오토테이프(손) -Sticky tape made from a metallic material. Used to great effect in police situations. -금속 재질의 점착 테이프. 경찰 상황에서 큰 효과를 발휘합니다. -It's very sticky and seals your hands tightly, making any struggling ineffective. -그것은 매우 끈적거리고 손을 단단히 밀봉하여 고군분투하는 것을 비효율적으로 만듭니다. -Autotape (Head) -오토테이프(헤드) -Sticky tape made from a metallic material. Used to great effect in police situations. -금속 재질의 점착 테이프. 경찰 상황에서 큰 효과를 발휘합니다. -It's very sticky and tough but you could probably get a knife through it. -매우 끈적거리고 질기지만 아마도 칼로 뚫을 수 있을 것입니다. -Autotape (Arms) -오토테이프(무기) -Sticky tape made from a metallic material. Used to great effect in police situations. -금속 재질의 점착 테이프. 경찰 상황에서 큰 효과를 발휘합니다. -It's very sticky and tough but you could probably get a knife through it. -매우 끈적거리고 질기지만 아마도 칼로 뚫을 수 있을 것입니다. -Autotape (Legs) -오토테이프(다리) -Sticky tape made from a metallic material. Used to great effect in police situations. -금속 재질의 점착 테이프. 경찰 상황에서 큰 효과를 발휘합니다. -It's very sticky and tough but you could probably get a knife through it. -매우 끈적거리고 질기지만 아마도 칼로 뚫을 수 있을 것입니다. -Autotape (Ankles) -오토테이프(발목) -Sticky tape made from a metallic material. Used to great effect in police situations. -금속 재질의 점착 테이프. 경찰 상황에서 큰 효과를 발휘합니다. -It's very sticky and tough but you could probably get a knife through it. -매우 끈적거리고 질기지만 아마도 칼로 뚫을 수 있을 것입니다. -Autotape (Feet) -오토테이프(피트) -Sticky tape made from a metallic material. Used to great effect in police situations. -금속 재질의 점착 테이프. 경찰 상황에서 큰 효과를 발휘합니다. -It's very sticky and tough but you could probably get a knife through it. -매우 끈적거리고 질기지만 아마도 칼로 뚫을 수 있을 것입니다. -Autotape (Mouth) -오토테이프(입) -Sticky tape made from a metallic material. Used to great effect in police situations. -금속 재질의 점착 테이프. 경찰 상황에서 큰 효과를 발휘합니다. -It's very sticky and tough but you could probably get a knife through it. -매우 끈적거리고 질기지만 아마도 칼로 뚫을 수 있을 것입니다. +### You sigh as you can't find any laces to loosen on the TargetRestraint. -Stuffing -소 -A stuffing of cloth. -천 채우기. -You could spit it out easily, provided nothing's covering it. -아무것도 덮고 있지 않다면 쉽게 뱉어낼 수 있습니다. -Arm Ropes -팔 밧줄 -Faintly glowing ropes from a magic trap. -마법의 덫에서 희미하게 빛나는 밧줄. -I wonder who was responsible? -누가 책임이 있는지 궁금합니다. -Leg Ropes -다리 로프 -Faintly glowing ropes from a magic trap. -마법의 덫에서 희미하게 빛나는 밧줄. -I wonder who was responsible? -누가 책임이 있는지 궁금합니다. +### The laces of the TargetRestraint are tied tight! -Magic Hogtie -매직 혹티 -It pulls your wrists up to your ankles! So tight! -손목이 발목까지 잡아당겨요! 너무 타이트해요! -The knots appear to tie themselves together again, making them impossible to undo! -매듭이 다시 하나로 묶인 것처럼 보여서 풀 수 없게 됩니다! -Magic Arm Rope -매직 암 로프 -Strongly glowing ropes. -강하게 빛나는 로프. -The knots appear to tie themselves together again, making them impossible to undo! -매듭이 다시 하나로 묶인 것처럼 보여서 풀 수 없게 됩니다! -Magic Rope Cuffs -매직 로프 커프스 -Strongly glowing ropes. -강하게 빛나는 로프. -The knots appear to tie themselves together again, making them impossible to undo! -매듭이 다시 하나로 묶인 것처럼 보여서 풀 수 없게 됩니다! -Magic Ropework -매직 로프워크 -Strongly glowing ropes tied in an intricate pattern, making hand restraints more secure. -복잡한 패턴으로 묶인 강하게 빛나는 로프는 손 보호대를 더 안전하게 만듭니다. -The knots appear to tie themselves together again, making them impossible to undo! -매듭이 다시 하나로 묶인 것처럼 보여서 풀 수 없게 됩니다! -Magic Leg Rope -매직 레그 로프 -Strongly glowing ropes. -강하게 빛나는 로프. -The knots appear to tie themselves together again, making them impossible to undo! -매듭이 다시 하나로 묶인 것처럼 보여서 풀 수 없게 됩니다! -Magic Ankle Rope -매직앵클로프 -Strongly glowing ropes. -강하게 빛나는 로프. -The knots appear to tie themselves together again, making them impossible to undo! -매듭이 다시 하나로 묶인 것처럼 보여서 풀 수 없게 됩니다! -Magic Crotch Rope -매직 가랑이 로프 -Strongly glowing ropes. -강하게 빛나는 로프. -The knots appear to tie themselves together again, making them impossible to undo! -매듭이 다시 하나로 묶인 것처럼 보여서 풀 수 없게 됩니다! -Magic Toe Rope -매직 토 로프 -Strongly glowing ropes. -강하게 빛나는 로프. -The knots appear to tie themselves together again, making them impossible to undo! -매듭이 다시 하나로 묶인 것처럼 보여서 풀 수 없게 됩니다! +### You hopelessly try to untie the lacing on the TargetRestraint, but it's just too tight! -Mithril Hogtie -미스릴 혹티 -It pulls your wrists up to your ankles! So tight! -손목이 발목까지 잡아당겨요! 너무 타이트해요! -Made of woven mithril and enchanted to require magic blades to cut! -미스릴을 엮어 만들었고 마법의 칼날로 자르도록 마법이 부여되었습니다! -Mithril Arm Rope -미스릴 암 로프 -Strongly shining ropes. -강하게 빛나는 로프. -Made of woven mithril and enchanted to require magic blades to cut! -미스릴을 엮어 만들었고 마법의 칼날로 자르도록 마법이 부여되었습니다! -Mithril Leg Rope -미스릴 다리 로프 -Strongly shining ropes. -강하게 빛나는 로프. -Made of woven mithril and enchanted to require magic blades to cut! -미스릴을 엮어 만들었고 마법의 칼날로 자르도록 마법이 부여되었습니다! -Mithril Ankle Rope -미스릴 발목 로프 -Strongly shining ropes. -강하게 빛나는 로프. -Made of woven mithril and enchanted to require magic blades to cut! -미스릴을 엮어 만들었고 마법의 칼날로 자르도록 마법이 부여되었습니다! -Mithril Crotch Rope -미스릴 가랑이 밧줄 -Strongly shining ropes. -강하게 빛나는 로프. -Made of woven mithril and enchanted to require magic blades to cut! -미스릴을 엮어 만들었고 마법의 칼날로 자르도록 마법이 부여되었습니다! -Mithril Rope Harness -미스릴 로프 하네스 -Strongly shining ropes. -강하게 빛나는 로프. -Made of woven mithril and enchanted to require magic blades to cut! -미스릴을 엮어 만들었고 마법의 칼날로 자르도록 마법이 부여되었습니다! -Mithril Toe Rope -미스릴 발가락 밧줄 -Strongly shining ropes. -강하게 빛나는 로프. -Made of woven mithril and enchanted to require magic blades to cut! -미스릴을 엮어 만들었고 마법의 칼날로 자르도록 마법이 부여되었습니다! +### You grasp at the TargetRestraint, trying to peel it off... +### You wiggle madly as you try to peel off the TargetRestraint! +### The TargetRestraint reforms as you scoop it away! -Mithril Collar -미스릴 목걸이 -A collar made from an almost-weightless alloy.. -무게에 가까운 합금으로 만든 목걸이.. -It feels comfortable but it's also really hard. -편안하지만 정말 어렵습니다. +### You can't get the TargetRestraint off at all! -Mithril Cuffs -미스릴 커프스 -A pair of cuffs that make it easy to restrain you. -당신을 쉽게 구속할 수 있는 수갑입니다. -They feel like they aren't even there, but the material is rigid and unyielding. -그들은 거기에 없는 것처럼 느껴지지만 재료는 단단하고 단단합니다. -The enemy attaches your wrist cuffs together! -적이 당신의 손목 수갑을 묶었습니다! +### The TargetRestraint is too fast at reforming! -Cuffs Wrist Chain -커프스 손목 체인 -A pair of cuffs keeping your arms behind your back. -팔을 등 뒤로 고정하는 수갑. -They feel like they aren't even there, but the material is rigid and unyielding. -그들은 거기에 없는 것처럼 느껴지지만 재료는 단단하고 단단합니다. -Your cuffs detatch! -수갑이 풀린다! -The enemy attaches your elbow cuffs together! -적이 당신의 팔꿈치 수갑을 붙입니다! +### The TargetRestraint reforms too quickly as you try to squirm it off... -Cuffs Wrist Chain -커프스 손목 체인 -A full set of cuffs keeping your arms in a strict elbow tie! -엄격한 팔꿈치 넥타이로 팔을 보호하는 풀 세트 커프스! -They feel like they aren't even there, but the material is rigid and unyielding. -그들은 거기에 없는 것처럼 느껴지지만 재료는 단단하고 단단합니다. -Your wrists detatch, leaving your elbows still bound! -팔꿈치가 묶인 채로 손목이 분리됩니다! +### You grasp around, looking for a seam on the TargetRestraint... -Elbow Cuffs Chain -팔꿈치 커프스 체인 -A pair of cuffs keeping your elbows locked together!. -팔꿈치를 함께 고정시켜주는 수갑!. -They feel like they aren't even there, but the material is rigid and unyielding. -그들은 거기에 없는 것처럼 느껴지지만 재료는 단단하고 단단합니다. -Your elbows detatch! -팔꿈치가 분리됩니다! -The enemy attaches your wrist cuffs back together! -적이 손목 수갑을 다시 연결합니다! +### You wiggle and squirm, looking for something to pull at on the TargetRestraint... -Mithril Leg Cuffs -미스릴 레그 커프스 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -They feel like they aren't even there, but the material is rigid and unyielding. -그들은 거기에 없는 것처럼 느껴지지만 재료는 단단하고 단단합니다. -Mithril Ankle Cuffs -미스릴 발목 커프스 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -They feel like they aren't even there, but the material is rigid and unyielding. -그들은 거기에 없는 것처럼 느껴지지만 재료는 단단하고 단단합니다. -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! -Cuffs Chain -커프스 체인 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -They feel like they aren't even there, but the material is rigid and unyielding. -그들은 거기에 없는 것처럼 느껴지지만 재료는 단단하고 단단합니다. -The ankle cuff chain detaches! -발목 커프스 체인이 분리됩니다! +### The TargetRestraint encases you in a solid layer! +### Try as you might, the TargetRestraint hugs you completely without any seams! -Sticky Slime -끈적 끈적한 점액 -A sticky layer of slime keeping you anchored to the ground. -당신을 땅에 고정시켜주는 끈적끈적한 점액층. -It will slow you for a single turn. -한 턴 동안 속도가 느려집니다. -Leather Mittens -가죽 장갑 -A pair of tight leather mittens enclosing your hands. -당신의 손을 감싸는 꽉 끼는 가죽 벙어리장갑. -They make it almost impossible to manipulate keys and tools. Keep your hands to yourself! -그것들은 열쇠와 도구를 조작하는 것을 거의 불가능하게 만듭니다. 손을 조심하세요! -Leather Armbinder -가죽 암바인더 -A tight leather armbinder enclosing your hands and arms completely. -손과 팔을 완전히 감싸는 타이트한 가죽 암바인더. -It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible. -매우 아늑하고 뒷면에 ​​잠글 수 있는 버클로 고정되어 있습니다. 자물쇠를 직접 따는 것은 불가능합니다. -Leather Armbinder Harness -가죽 암바인더 하네스 -Leather belts securing your armbinder tightly. -당신의 암바인더를 단단히 고정시키는 가죽 벨트. -It's quite tight and secured by lockable buckles on your sides. -아주 빡빡하고 옆구리에 잠글 수 있는 버클로 고정되어 있습니다. -The armbinder harness comes off with the armbinder. -암바인더 하네스는 암바인더와 함께 분리됩니다. -The cuff chains come off with the cuffs. -커프 체인은 커프와 함께 분리됩니다. -Handcuffs -수갑 -A pair of steel cuffs locked securely around your wrists. -손목에 단단히 고정된 한 쌍의 강철 수갑입니다. -The lock doesn't seem very complicated. -자물쇠는 그다지 복잡해 보이지 않습니다. -Steel Yoke -스틸 요크 -A steel bar clamped firmly around your wrists and neck, leaving you in a helpless position. -손목과 목에 단단히 조여 무기력한 위치에 놓이게 하는 강철 막대입니다. -This is not something you can pick by yourself... -혼자서 고를 수 있는 게 아니야... -Leather Harness -가죽 하네스 -A leather harness of tight straps buckled around your torso. -몸통에 버클을 채운 꽉 조이는 끈으로 된 가죽 하네스입니다. -It provides an anchor point for enemies to grab onto! -적들이 붙잡을 수 있는 닻을 제공합니다! -Ball Gag -볼 개그 -A gag made of a red squishy material. -붉은 물렁물렁한 재질로 된 개그. -You can't seem to enunciate your spells properly with this in. -이렇게 입력하면 주문을 제대로 발음할 수 없는 것 같습니다. -Tight Ball Gag -타이트 볼 개그 -A gag made of a red squishy material, buckled as tight as it will go. -빨강 물렁물렁한 소재로 만든 개그로, 버클이 최대한 꽉 조여져 있습니다. -You can't seem to enunciate your spells properly with this in. -이렇게 입력하면 주문을 제대로 발음할 수 없는 것 같습니다. -Magic Ball Gag -매직 볼 개그 -A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. -마법이 깃든 개그. 점점 커져 입에 가득 차서 말을 할 수 없게 된다. -It's brimming with conjured energy. A normal knife won't work here! -창조된 에너지로 가득 차 있습니다. 일반 나이프는 여기서 작동하지 않습니다! -Ballet Heels -발레 힐 -A pair of shoes with heels so tall it forces you on your toes. -높은 굽이 있는 신발 한 켤레는 발가락에 힘을 줍니다. -These will take some getting used to. -익숙해지는 데 시간이 좀 걸릴 것입니다. -Leg Irons -레그 아이언 -A pair of solid steel cuffs connecting your ankles inescapably. -어쩔 수 없이 발목을 연결하는 단단한 강철 수갑. -The lock doesn't seem very complicated. -자물쇠는 그다지 복잡해 보이지 않습니다. -Blindfold -눈가리개 -A leather strap secured onto your face and blocking vision. -얼굴에 고정되어 시야를 차단하는 가죽 끈. -You can still see through the gap around your nose. -당신은 여전히 ​​코 주위의 틈을 통해 볼 수 있습니다. +### The TargetRestraint is too tight to get any traction... -Magic Chastity Belt -마법의 정조대 -A belt protected by a magic seal. -마법의 봉인으로 보호되는 벨트. -The shields will open up to accept new toys, but won't let them out... -방패는 새로운 장난감을 받기 위해 열리지만, 그것들을 내보내지는 않을 것입니다... -Steel Chastity Belt -강철 순결 벨트 -A cruel device used for locking magical vibrators in place. -마법 진동기를 제자리에 고정하는 데 사용되는 잔인한 장치입니다. -The shields will open up to accept new toys, but won't let them out... -방패는 새로운 장난감을 받기 위해 열리지만, 그것들을 내보내지는 않을 것입니다... -Prototype Belt -프로토타입 벨트 -A strange device built using unknown technology. -알 수 없는 기술을 사용하여 만든 이상한 장치입니다. -The lock is extremely advanced, and the ports at the bottom readily accept toys but won't let them out... -자물쇠는 매우 고급스럽고, 바닥에 있는 구멍은 장난감을 쉽게 넣을 수 있지만 빼지는 못합니다... -Steel Chastity Bra -스틸 순결 브래지어 -A cruel device used for locking magical massagers in place. -마법 안마기를 제자리에 고정시키는 잔인한 장치입니다. -It won't stop the dungeon's little curses, but will keep you from removing them. -던전의 작은 저주를 막지는 못하겠지만, 당신이 그것들을 제거하지 못하게 할 것입니다. -Ornate Chastity Belt -화려한 정조대 -A cruel device used for locking magical vibrators in place. -마법 진동기를 제자리에 고정하는 데 사용되는 잔인한 장치입니다. -The lock won't come off until the magic wears off in time... -시간이 지나면 마법이 풀릴 때까지 자물쇠는 풀리지 않을 거야... -Ornate Chastity Bra -화려한 순결 브래지어 -A cruel device used for locking magical massagers in place. -마법 안마기를 제자리에 고정시키는 잔인한 장치입니다. -The lock won't come off until the magic wears off in time... -시간이 지나면 마법이 풀릴 때까지 자물쇠는 풀리지 않을 거야... +### The TargetRestraint squeezes your body too tightly to get any sort of ply... -Maid Chastity Belt -메이드 정조대 -A chastity belt used to maintain control over initiate maids. -입회 시녀를 통제하기 위해 사용하는 정조대. -Made of hardened steel. The lock is high-security. -단단한 강철로 만들어졌습니다. 자물쇠는 보안 수준이 높습니다. -Magic Egg -매직 에그 -An energetic little friend that likes to tease you. -당신을 놀리는 것을 좋아하는 에너지 넘치는 작은 친구. -It is charged by residual magic from your spells. -주문에서 남은 마법으로 충전됩니다. -Prototype Egg -프로토타입 에그 -A teaser that periodically vibrates. -주기적으로 진동하는 티저. -High efficiency mana conversion means longer tease duration. -고효율 마나 변환은 더 긴 티즈 지속 시간을 의미합니다. -Vibrating Plug -진동 플러그 -A sizeable plug that makes you happy... a little too happy. -당신을 행복하게 만드는 상당한 플러그... 조금은 너무 행복합니다. -It vibrates periodically and allows orgasms. -그것은 주기적으로 진동하고 오르가즘을 허용합니다. -Teaser Plug -티저 플러그 -A sizeable plug that will tease you but never let you go... -당신을 놀리지만 절대 놓지 않는 큰 플러그... -It vibrates weakly periodically. -주기적으로 약하게 진동합니다. -Torment Plug -토먼트 플러그 -A sizeable plug that will make your life unbearably pleasurable... -당신의 삶을 참을 수 없을 정도로 즐겁게 만들어 줄 커다란 플러그... -It vibrates strongly periodically and has a denial setting. -주기적으로 강하게 진동하며 거부 설정이 있습니다. -Thundering Plug -천둥 플러그 -A sizeable plug that will make your life unbearably pleasurable... -당신의 삶을 참을 수 없을 정도로 즐겁게 만들어 줄 커다란 플러그... -You're going to have the time of your life. -당신은 당신의 인생의 시간을 갖게 될 것입니다. -Maid Egg -메이드 에그 -An energetic little friend that likes to tease you and takes orders from the head maid. -놀리기를 좋아하고 메이드장의 지시를 받는 활기찬 꼬마 친구. -It is charged by residual magic from your spells. -주문에서 남은 마법으로 충전됩니다. +### You start peeling off the TargetRestraint... -Stainless Plug -스테인리스 플러그 -A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... -진동을 일으키지 않는 무거운 플러그지만 확실히 걸어다니는 것을 알아차릴 수 있을 것입니다... -This one goes in the front. -이쪽이 앞에 갑니다. -Stainless Plug -스테인리스 플러그 -A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... -진동을 일으키지 않는 무거운 플러그지만 확실히 걸어다니는 것을 알아차릴 수 있을 것입니다... -This one goes in the back. -이건 뒤로 갑니다. +### You scratch at the TargetRestraint furiously... -Shadow Hand Gag -섀도우 핸드 개그 -It clasps tightly over the mouth and prevents you from casting your spells! -그것은 입을 단단히 움켜쥐고 주문을 시전하는 것을 방지합니다! -You have no choice but to struggle. -고군분투하는 것 외에는 선택의 여지가 없습니다. +### The TargetRestraint clings to your skin too tightly! -Shadow Hands (Legs) -섀도우 핸즈(다리) -They are wrapped around your legs! -그들은 당신의 다리를 감싸고 있습니다! -You have no choice but to struggle. -고군분투하는 것 외에는 선택의 여지가 없습니다. -Shadow Hands (Legs) -섀도우 핸즈(다리) -They are wrapped around your legs! -그들은 당신의 다리를 감싸고 있습니다! -You have no choice but to struggle. -고군분투하는 것 외에는 선택의 여지가 없습니다. +### You groan in frustration as you try to peel the TargetRestraint off but realize it's too sticky. -Shadow Hands (Arms) -섀도우 핸즈(무기) -They are squeezing you tightly! -그들이 당신을 꽉 조이고 있습니다! -You have no choice but to struggle. -고군분투하는 것 외에는 선택의 여지가 없습니다. -Shadow Hands (Arms) -섀도우 핸즈(무기) -They are squeezing you tightly! -그들이 당신을 꽉 조이고 있습니다! -You have no choice but to struggle. -고군분투하는 것 외에는 선택의 여지가 없습니다. +### You can't grip the edges to peel the TargetRestraint off! -Shadow Hands (Feet) -그림자 손(발) -They are holding your feet together! -그들은 당신의 발을 함께 잡고 있습니다! -You have no choice but to struggle. -고군분투하는 것 외에는 선택의 여지가 없습니다. +### You make a futile attempt to rub the TargetRestraint off. -Shadow Hands... -섀도우 핸즈... -They are... uhh... -그들은... 어... -You have no choice but to struggle. -고군분투하는 것 외에는 선택의 여지가 없습니다. +### You try to wiggle off the TargetRestraint... -Wrist Rope -손목 로프 -A box tie keeping your arms secured behind your back. -등 뒤로 팔을 고정시키는 상자 넥타이. -The ropes squeeze you gently. -로프가 당신을 부드럽게 조입니다. -Rope Cuffs -로프 커프스 -A quick tie for apprehending prisoners. -죄수를 체포하기 위한 빠른 넥타이. -It's not very secure. -매우 안전하지 않습니다. -Intricate Ropework -복잡한 로프워크 -A quick tie for apprehending prisoners, looped through buckles on the hand restraints. -수감자를 체포하기 위한 빠른 넥타이로, 손 구속 장치의 버클에 고리가 달려 있습니다. -It's not very secure. -매우 안전하지 않습니다. -Rope Hogtie -밧줄 매춘부 -A very strict and tight hogtie, good for subduing unruly captives. -엄청 엄격하고 빡빡한 창녀로 제멋대로인 포로들을 제압하는 데 좋습니다. -It's very secure. You tug on the rope connecting your feet and struggle. -매우 안전합니다. 발을 연결하는 밧줄을 잡아당기며 몸부림칩니다. -Rope Belt -로프 벨트 -A harness acting as a handle to pull you around -당신을 끌어당기는 손잡이 역할을 하는 하네스 -The ropes squeeze you gently. -로프가 당신을 부드럽게 조입니다. -Rope Harness -로프 하네스 -A harness that secures your other restraints and makes them tighter. -다른 구속 장치를 고정하고 더 단단하게 만드는 하네스. -The ropes squeeze you gently. -로프가 당신을 부드럽게 조입니다. -Crotch Rope -가랑이 밧줄 -A tight rope impressing upon your most private areas... -당신의 가장 은밀한 부분에 감명을 주는 팽팽한 밧줄... -The ropes squeeze you gently. -로프가 당신을 부드럽게 조입니다. -Wrist Rope -손목 로프 -A wrist and elbow tie keeping your arms secured behind your back. -등 뒤로 팔을 고정시키는 손목과 팔꿈치 넥타이. -The ropes squeeze you gently. -로프가 당신을 부드럽게 조입니다. -Leg Ropes -다리 로프 -A tie that hobbles your legs together.. -다리를 절뚝거리게 만드는 넥타이.. -The ropes squeeze you gently. -로프가 당신을 부드럽게 조입니다. -Ankle Ropes -발목 로프 -A tie keeping your feet secured together. -당신의 발을 고정시켜주는 넥타이. -The ropes squeeze you gently. -로프가 당신을 부드럽게 조입니다. +### You squirm trying to get the TargetRestraint to fall off... -Holy Wrist Rope -성스러운 손목 밧줄 -A box tie keeping your arms secured behind your back. -등 뒤로 팔을 고정시키는 상자 넥타이. -They are aware of your movements... -그들은 당신의 움직임을 알고 있습니다... -Holy Rope Cuffs -홀리 로프 커프스 -A quick tie for apprehending prisoners. -죄수를 체포하기 위한 빠른 넥타이. -They are aware of your movements... -그들은 당신의 움직임을 알고 있습니다... -Holy Ropework -신성한 로프워크 -A quick tie for apprehending prisoners, looped through buckles and fasteners. -버클과 패스너로 묶인 죄수를 체포하기 위한 빠른 넥타이. -They are aware of your movements... -그들은 당신의 움직임을 알고 있습니다... -Holy Rope Belt -성스러운 밧줄 허리띠 -A harness acting as a handle to pull you around -당신을 끌어당기는 손잡이 역할을 하는 하네스 -They are aware of your movements... -그들은 당신의 움직임을 알고 있습니다... -Holy Crotch Rope -거룩한 가랑이 밧줄 -A tight rope impressing upon your most private areas... -당신의 가장 은밀한 부분에 감명을 주는 팽팽한 밧줄... -They are aware of your movements... -그들은 당신의 움직임을 알고 있습니다... -Holy Wrist Rope -성스러운 손목 밧줄 -A wrist and elbow tie keeping your arms secured behind your back. -등 뒤로 팔을 고정시키는 손목과 팔꿈치 넥타이. -They are aware of your movements... -그들은 당신의 움직임을 알고 있습니다... -Holy Leg Ropes -신성한 다리 밧줄 -A tie that hobbles your legs together.. -다리를 절뚝거리게 만드는 넥타이.. -They are aware of your movements... -그들은 당신의 움직임을 알고 있습니다... -Holy Ankle Ropes -신성한 발목 로프 -A tie keeping your feet secured together. -당신의 발을 고정시켜주는 넥타이. -They are aware of your movements... -그들은 당신의 움직임을 알고 있습니다... +### The TargetRestraint are magical and wrap themselves back around you of their own accord. -Wrist Vines -손목 덩굴 -A box tie keeping your arms secured behind your back. -등 뒤로 팔을 고정시키는 상자 넥타이. -The vines twitch as they try to wrap around tighter. -덩굴이 더 단단하게 감싸려고 할 때 경련을 일으킵니다. -Vine Harness -포도나무 하네스 -A harness acting as a handle to pull you around -당신을 끌어당기는 손잡이 역할을 하는 하네스 -The vines twitch as they try to wrap around tighter. -덩굴이 더 단단하게 감싸려고 할 때 경련을 일으킵니다. -Leg Vines -다리 덩굴 -A tie that hobbles your legs together.. -다리를 절뚝거리게 만드는 넥타이.. -The vines twitch as they try to wrap around tighter. -덩굴이 더 단단하게 감싸려고 할 때 경련을 일으킵니다. -Ankle Vines -발목 덩굴 -A tie keeping your feet secured together. -당신의 발을 고정시켜주는 넥타이. -The vines twitch as they try to wrap around tighter. -덩굴이 더 단단하게 감싸려고 할 때 경련을 일으킵니다. +### The TargetRestraint squeeze you tighter as you try to shake them off. -Quik-Bind Cuffs -퀵바인드 커프스 -A set of high-security cuffs that are both restrictive and quick to apply. -제한적이며 신속하게 적용할 수 있는 높은 보안 수갑 세트입니다. -It uses a twelve-disc detainer lock. -그것은 12개의 디스크 잠금 장치를 사용합니다. -Wolfbinder -울프바인더 -A sophisticated training system used to keep wolfgirls from scratching their owners. -울프걸이 주인을 긁지 못하도록 하는 정교한 훈련 시스템입니다. -Despite the harsh position, it is padded, breathable, and suitable for long term wear. -가혹한 자세에도 불구하고 패딩 처리되고 통기성이 있으며 장기간 착용하기에 적합합니다. -Smart Training Cuffs -스마트 트레이닝 커프스 -Cuffs with a feature to punish the wearer if they act aggressively. -공격적으로 행동하면 착용자를 처벌하는 기능이 있는 수갑. -They are solid metal and will be hard to remove without the key. -그것들은 단단한 금속이고 열쇠 없이는 제거하기 어려울 것입니다. -Linked Smart Cuffs -연결된 스마트 커프스 -Cuffs with a feature to punish the wearer if they act aggressively. -공격적으로 행동하면 착용자를 처벌하는 기능이 있는 수갑. -Looks like you got yourself in trouble. -곤경에 처한 것 같군요. -Training Harness -트레이닝 하네스 -A harness that keeps a wolfgirl's suit together. It makes escaping more difficult. -울프걸의 옷을 묶어주는 하네스입니다. 탈출을 더 어렵게 만듭니다. -While it is weatherproof and rugged, its straps are merely nylon. -내후성이 있고 견고하지만 끈은 나일론일 뿐입니다. -Training Gag -트레이닝 개그 -A gag used to prevent wolfgirls from biting their owners. -울프걸이 주인을 무는 것을 막기 위해 사용하는 재갈입니다. -It is reinforced with steel cables, so getting it off will be tricky. -강철 케이블로 보강되어 있어 떼어내기가 까다로울 것입니다. -Training Collar -트레이닝 목걸이 -A collar used to keep unruly wolfgirls in check. -제멋대로인 울프걸을 견제하기 위해 사용하는 목걸이입니다. -If it works on them, it sure as heck works on you. -그들에게 효과가 있다면 당신에게도 확실히 효과가 있을 것입니다. -Training Leash -트레이닝 리쉬 -A leash used for training pets. -애완동물 훈련에 사용하는 목줄입니다. -It is a steel cable with a weatherproof rubber coating, and a convenient handle. -내후성 고무 코팅과 편리한 손잡이가 있는 강철 케이블입니다. +### The TargetRestraint have you bound hopelessly tight! -Your ankle cuffs snap together on their own! -당신의 발목 수갑이 저절로 찰칵! -Your ankle cuffs detach! -발목 수갑이 분리됩니다! +### You sigh and moan as the TargetRestraint aren't getting any looser. -Asylum Muzzle -망명 총구 -The nurses use this on noisy patients! -간호사는 시끄러운 환자에게 이것을 사용합니다! -It's sturdy leather... -튼튼한 가죽이라... -Asylum Jacket -망명 재킷 -A straitjacket that keeps patients out of trouble. -환자를 곤경에 빠뜨리는 구속복. -It has many straps and is very difficult to escape. -끈이 많고 탈출하기가 매우 어렵습니다. -Asylum Legbinder -망명 입법자 -This legbinder will keep the patient from kicking the nurses. -이 레그 바인더는 환자가 간호사를 발로 차는 것을 막아줄 것입니다. -It has both laces and straps. -끈과 끈이 모두 있습니다. +### You look around for a fastener on the TargetRestraint... -Asylum Ankle Cuffs -망명 발목 커프스 -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -강화 가죽으로 만든 사슬로 묶은 수갑입니다. 환자를 더 쉽게 잡을 수 있습니다. -They can be thrown from long distances. -장거리에서 던질 수 있습니다. -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! -Cuffs Chain -커프스 체인 -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -강화 가죽으로 만든 사슬로 묶은 수갑입니다. 환자를 더 쉽게 잡을 수 있습니다. -They can be thrown from long distances. -장거리에서 던질 수 있습니다. -The ankle cuff chain detaches! -발목 커프스 체인이 분리됩니다! +### Shivering, you look for a fastener on the TargetRestraint... -Asylum Leg Cuffs -망명 다리 커프스 -A pair of chained cuffs made of reinforced leather. They make patients easier to catch. -강화 가죽으로 만든 사슬로 묶은 수갑입니다. 환자를 더 쉽게 잡을 수 있습니다. -They can be thrown from long distances. -장거리에서 던질 수 있습니다. -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! +### The TargetRestraint has no fastener!!! +### The TargetRestraint is sealed around your body, with no fasteners to speak of! -Transport Jacket -운송 재킷 -This jacket goes over a straitjacket to keep the arms trapped. -이 재킷은 구속복을 덮어서 팔이 갇히지 않도록 합니다. -It makes it extraordinarily difficult to escape the jacket it covers. -그것이 덮는 재킷에서 벗어나기가 매우 어렵습니다. +### The TargetRestraint is firmly sealed around your body. -Asylum Cuffs -망명 커프스 -A pair of leather cuffs that make it easy to restrain you. -당신을 쉽게 묶을 수 있는 가죽 수갑입니다. -They're made of tough cowhide. -그들은 질긴 소가죽으로 만들어졌습니다. -The enemy attaches your wrist cuffs together! -적이 당신의 손목 수갑을 묶었습니다! +### You are sealed in ice. There is no escape. -Wrist Chain -손목 체인 -A pair of leather cuffs keeping your arms behind your back. -등 뒤로 팔을 고정시키는 한 쌍의 가죽 수갑. -They're made of tough cowhide. -그들은 질긴 소가죽으로 만들어졌습니다. -Your cuffs detatch! -수갑이 풀린다! -The enemy attaches your elbow cuffs together! -적이 당신의 팔꿈치 수갑을 붙입니다! +### You try to untie the TargetRestraint... -Wrist Chain -손목 체인 -A full set of leather cuffs keeping your arms in a strict elbow tie! -엄격한 팔꿈치 타이로 팔을 보호하는 가죽 커프스 풀 세트! -They're made of tough cowhide. -그들은 질긴 소가죽으로 만들어졌습니다. -Your wrists detatch, leaving your elbows still bound! -팔꿈치가 묶인 채로 손목이 분리됩니다! +### You contort yourself trying to reach the knots on the TargetRestraint... -Elbow Chain -팔꿈치 사슬 -A pair of leather cuffs keeping your elbows locked together!. -팔꿈치를 함께 고정시켜주는 한 쌍의 가죽 수갑!. -They're made of tough cowhide. -그들은 질긴 소가죽으로 만들어졌습니다. -Your elbows detatch! -팔꿈치가 분리됩니다! -The enemy attaches your wrist cuffs back together! -적이 손목 수갑을 다시 연결합니다! +### The TargetRestraint's knot ties itself back again as soon as you get it loose! +### The knots tighten themselves as soon as you reach them, keeping you trapped in the TargetRestraint. -Comfy Muzzle -편안한 총구 -A lovely muzzle that's extraordinarily comfy! -매우 편안한 사랑스러운 총구! -It's made of an ethereal material... -에일리언 재질로 되어있어요.. -Comfy Straitjacket -편안한 구속복 -A straitjacket that is padded on the inside. -안쪽이 덧대어진 구속복. -It feels tight but is actually made of an ethereal material... -타이트한 느낌이 나지만 실제로는 천상의 소재로 만들어졌습니다... +### You can't reach the knots on the TargetRestraint! -Latex Jacket -라텍스 재킷 -A tight jacket that holds your arms completely useless. -팔을 완전히 쓸모 없게 잡아주는 꽉 끼는 재킷. -It has too much grip to struggle out of, but is made of a fragile material. -힘겨워하기에는 너무 많은 그립력이 있지만 깨지기 쉬운 재료로 만들어졌습니다. -Latex Armbinder -라텍스 암바인더 -A tight armbinder that pins your arms tightly behind your back, enclosed completely. -팔을 등 뒤로 단단히 고정하는 타이트한 암바인더가 완전히 감싸여 있습니다. -It has too much grip to struggle out of, but is made of a fragile material. -힘겨워하기에는 너무 많은 그립력이 있지만 깨지기 쉬운 재료로 만들어졌습니다. -Latex Legbinder -라텍스 레그 바인더 -A tight legbinder that keeps your legs together! -다리를 고정시켜주는 타이트한 레그바인더! -It has too much grip to struggle out of, but is made of a fragile material. -힘겨워하기에는 너무 많은 그립력이 있지만 깨지기 쉬운 재료로 만들어졌습니다. -A tight pair of boots that makes it difficult to walk! -걷기 힘들게 만드는 타이트한 부츠! -It has too much grip to struggle out of, but is made of a fragile material. -힘겨워하기에는 너무 많은 그립력이 있지만 깨지기 쉬운 재료로 만들어졌습니다. -Heavy Latex Corset -무거운 라텍스 코르셋 -An excruciatingly tight corset that hugs your body, with straps securing your other restraints. -다른 구속을 고정하는 끈으로 몸을 감싸는 극도로 조이는 코르셋. -It has too much grip to struggle out of, but is made of a fragile material. -힘겨워하기에는 너무 많은 그립력이 있지만 깨지기 쉬운 재료로 만들어졌습니다. -Blue Latex Catsuit -블루 라텍스 캣수트 -A skintight suit that's stretched on tight. It adheres to latex restraints making struggling more difficult. -꽉 조이는 몸에 꼭 맞는 수트입니다. 라텍스 구속에 달라붙어 고군분투하기가 더 어렵습니다. -Blue latex is silky smooth, very stretchy, and very good at adhering to itself. -파란색 라텍스는 비단결처럼 매끄럽고 신축성이 뛰어나며 접착력이 뛰어납니다. +### Your squirming is in vain as you can't even reach the knots on the TargetRestraint. -Scale Boxtie Binder -스케일 Boxtie 바인더 -A secure but comfortable binder meant for long-term wear by long-term prisoners of the Dragonhearts. -드래곤하트의 장기 포로가 오랫동안 착용할 수 있는 안전하면서도 편안한 바인더입니다. -It is made from durable dragonscale, but secured with ordinary buckles. -튼튼한 용비늘로 만들었지만 일반 버클로 고정되어 있습니다. -Dragonscale Straps -용비늘 스트랩 -A set of straps buckling tightly around your body and secured at the wrists. -당신의 몸을 단단히 감싸고 손목에 고정된 스트랩 세트. -It's made from hard-to-cut dragonscale!!! -잘라내기 힘든 용비늘로 만들었다!!! -Scale Leg Cuffs -스케일 레그 커프스 -A pair of chained cuffs made of dragonscale. They slow your stride. -용비늘로 만든 사슬 수갑입니다. 걸음이 느려집니다. -It's made from hard-to-cut dragonscale!!! -잘라내기 힘든 용비늘로 만들었다!!! -Scale Ankle Cuffs -스케일 앵클 ​​커프스 -A pair of chained cuffs made of dragonscale. They slow your stride. -용비늘로 만든 사슬 수갑입니다. 걸음이 느려집니다. -It's made from hard-to-cut dragonscale!!! -잘라내기 힘든 용비늘로 만들었다!!! -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! -Cuffs Chain -커프스 체인 -A pair of chained cuffs made of dragonscale. They slow your stride. -용비늘로 만든 사슬 수갑입니다. 걸음이 느려집니다. -It's made from hard-to-cut dragonscale!!! -잘라내기 힘든 용비늘로 만들었다!!! -The ankle cuff chain detaches! -발목 커프스 체인이 분리되었습니다! -Dragonscale Boots -용비늘 장화 -A pair of extremely high heels lined with dragonscale. They are hard to walk in. -용 비늘로 안을 댄 매우 높은 굽입니다. 걷기가 어렵습니다. -It's made from hard-to-cut dragonscale!!! -잘라내기 힘든 용비늘로 만들었다!!! -Dragonscale Gag -용비늘 개그 -A gag made of a squishy material and secured with dragonscale straps. -부드러운 재질로 만들어지고 용비늘 끈으로 고정된 개그입니다. -It's made from hard-to-cut dragonscale!!! -잘라내기 힘든 용비늘로 만들었다!!! -Dragonscale Muzzle -용비늘 총구 -A muzzle to keep ball gags pressed firmly into the mouth. -공 개그를 입에 단단히 밀어넣는 총구. -It's made from hard-to-cut dragonscale!!! -잘라내기 힘든 용비늘로 만들었다!!! -Dragon Collar -드래곤 목걸이 -A collar owned by the Dragonhearts, an order of dragonslayers. -드래곤슬레이어 교단인 드래곤하트가 소유한 목걸이. -It's made from hard-to-cut dragonscale!!! -잘라내기 힘든 용비늘로 만들었다!!! +### You try to pull off the TargetRestraint... -Steel Cuffs -스틸 커프스 -A pair of steel cuffs that make it easy to restrain you. -당신을 쉽게 구속할 수 있는 강철 수갑입니다. -They're made of shining steel. -그들은 빛나는 강철로 만들어졌습니다. -The enemy attaches your wrist cuffs together! -적이 당신의 손목 수갑을 묶었습니다! +### You tug on your TargetRestraint trying to get them off! -Steel Wrist Chain -스틸 손목 체인 -A pair of steel cuffs keeping your arms behind your back. -팔을 등 뒤로 고정하는 강철 수갑. -They're made of shining steel. -그들은 빛나는 강철로 만들어졌습니다. -Your cuffs detatch! -수갑이 풀린다! -The enemy attaches your elbow cuffs together! -적이 당신의 팔꿈치 수갑을 붙입니다! +That would really hurt... +그거 진짜 아플텐데... +You realize that would really hurt... +그게 정말 아플 거라는 걸 알잖아... +### The TargetRestraint tug on your nipples as you squirm! -Magnetic Cuffs -마그네틱 커프스 -A pair of bulky cuffs with coils visible on the inside... -내부에 코일이 보이는 부피가 큰 수갑... -They have no visible attachment points... -눈에 보이는 부착 지점이 없습니다... -The electric damage causes your cuffs to attach together! -전기 손상으로 인해 수갑이 함께 부착됩니다! -Magnetic Link -마그네틱 링크 -The magnetic cuffs are rigidly attached! -마그네틱 커프스가 단단히 고정되어 있습니다! -They won't budge! There's a button to release them but it's hard to reach... -꼼짝도 하지 않아! 버튼을 떼는 버튼이 있지만 손이 닿기가 힘들어... -Your cuffs detatch! -수갑이 풀린다! -Magnetic Ankle Cuffs -마그네틱 발목 커프스 -A pair of bulky leg irons with coils visible on the inside. -내부에 코일이 보이는 부피가 큰 레그 아이언 한 쌍. -They have no visible attachment points... -눈에 보이는 부착 지점이 없습니다... -The electric damage causes your ankle cuffs to snap together! -전기 손상으로 인해 발목 수갑이 함께 끊어집니다! -Magnetic Link -마그네틱 링크 -The magnetic cuffs are rigidly attached! -마그네틱 커프스가 단단히 고정되어 있습니다! -They won't budge! There's a button to release them but it's hard to reach... -꼼짝도 하지 않아! 버튼을 떼는 버튼이 있지만 손이 닿기가 힘들어... -Your ankle cuffs detatch! -발목 수갑이 풀린다! +### You paw at the TargetRestraint from inside, hoping to find an opening... +### You flail around inside the TargetRestraint... -Leather Ankle Cuffs -가죽 발목 커프스 -A pair of chained cuffs made of leather. They make it trickier to run away. -가죽으로 만든 쇠사슬 수갑입니다. 도망가기 어렵게 만듭니다. -They're made of tough cowhide. -그들은 질긴 소가죽으로 만들어졌습니다. -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! -Cuffs Chain -커프스 체인 -A pair of chained cuffs made of leather. They make it trickier to run away. -가죽으로 만든 쇠사슬 수갑입니다. 도망가기 어렵게 만듭니다. -They're made of tough cowhide. -그들은 질긴 소가죽으로 만들어졌습니다. -The ankle cuff chain detaches! -발목 커프스 체인이 분리되었습니다! +### The TargetRestraint is completely seamless! -Leather Leg Cuffs -가죽 다리 커프스 -A pair of chained cuffs made of leather. They make it trickier to run away. -가죽으로 만든 쇠사슬 수갑입니다. 도망가기 어렵게 만듭니다. -They're made of tough cowhide. -그들은 질긴 소가죽으로 만들어졌습니다. -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! +### The TargetRestraint is completely seamless! This is hopeless. -Leather Cuffs -가죽 커프스 -A pair of leather cuffs that make it easy to restrain you. -당신을 쉽게 묶을 수 있는 가죽 수갑입니다. -They're made of tough cowhide. -그들은 질긴 소가죽으로 만들어졌습니다. -The enemy attaches your wrist cuffs together! -적이 당신의 손목 수갑을 묶었습니다! +### You are too weak to poke your hand through the TargetRestraint... -Lthr Wrist Chain -Lthr 손목 체인 -A pair of leather cuffs keeping your arms behind your back. -등 뒤로 팔을 고정시키는 한 쌍의 가죽 수갑. -They're made of tough cowhide. -그들은 질긴 소가죽으로 만들어졌습니다. -Your cuffs detatch! -수갑이 풀린다! -The enemy attaches your elbow cuffs together! -적이 당신의 팔꿈치 수갑을 붙입니다! +### You stretch yourself out inside the TargetRestraint! -Lthr Wrist Chain -Lthr 손목 체인 -A full set of leather cuffs keeping your arms in a strict elbow tie! -엄격한 팔꿈치 타이로 팔을 보호하는 가죽 커프스 풀 세트! -They're made of tough cowhide. -그들은 질긴 소가죽으로 만들어졌습니다. -Your wrists detatch, leaving your elbows still bound! -팔꿈치가 묶인 채로 손목이 분리됩니다! +### You bounce around inside the TargetRestraint! -Lthr Elbow Chain -Lthr 팔꿈치 체인 -A pair of leather cuffs keeping your elbows locked together!. -팔꿈치를 함께 고정시켜주는 한 쌍의 가죽 수갑!. -They're made of tough cowhide. -그들은 질긴 소가죽으로 만들어졌습니다. -Your elbows detatch! -팔꿈치가 분리됩니다! -The enemy attaches your wrist cuffs back together! -적이 손목 수갑을 다시 연결합니다! +### The TargetRestraint stretches to accomodate your movements... +### The TargetRestraint tips slightly as you squirm around... -Dragonscale Cuffs -용비늘 수갑 -A pair of cuffs that make it easy to restrain you. -당신을 쉽게 구속할 수 있는 수갑입니다. -They're made of dragonscale. -그들은 용비늘로 만들어졌어. -The enemy attaches your wrist cuffs together! -적이 당신의 손목 수갑을 묶었습니다! +### You are too weak to make even a small dent in the TargetRestraint... -Scale Wrist Chain -비늘 손목 사슬 -A pair of cuffs keeping your arms behind your back. -팔을 등 뒤로 고정하는 수갑. -They're made of dragonscale. -그들은 용비늘로 만들어졌어. -Your cuffs detatch! -수갑이 풀린다! -The enemy attaches your elbow cuffs together! -적이 당신의 팔꿈치 수갑을 붙입니다! +### The TargetRestraint is unyielding despite your attempts... -Scale Wrist Chain -비늘 손목 사슬 -A full set of cuffs keeping your arms in a strict elbow tie! -엄격한 팔꿈치 넥타이로 팔을 보호하는 풀 세트 커프스! -They're made of dragonscale. -그들은 용비늘로 만들어졌어. -Your wrists detatch, leaving your elbows still bound! -팔꿈치가 묶인 채로 손목이 분리됩니다! +### You try to puncture the TargetRestraint... -Scale Elbow Chain -스케일 엘보우 체인 -A pair of cuffs keeping your elbows locked together!. -팔꿈치를 함께 고정시켜주는 수갑!. -They're made of dragonscale. -그들은 용비늘로 만들어졌어. -Your elbows detatch! -팔꿈치가 분리됩니다! -The enemy attaches your wrist cuffs back together! -적이 손목 수갑을 다시 연결합니다! +### You poke around at the TargetRestraint... -Maid Jacket -메이드 재킷 -A bolero jacket keeping your arms pinned snugly. You can't even move them. -팔을 포근하게 잡아주는 볼레로 재킷. 팔을 움직일 수도 없습니다. -There is no hope of struggling out. Better hope you can cut it... -고군분투할 희망은 없다. 그만둘 수 있기를... -Devious Maid Costume -악랄한 메이드 코스튬 -A devious maid outfit that forces the arms into an elbows-touching position. -팔꿈치에 닿도록 강제로 팔을 구부리는 기만적인 메이드 복장. -Makes sure you focus on your work and not fooling around. -작업에 집중하고 장난치지 않도록 합니다. -Reinforced Leather Belt -강화 가죽 허리띠 -A leather belt used to keep your legs hobbled. -다리를 절뚝거릴 때 사용하는 가죽 벨트입니다. -It's made of a very tough reinforced leather. It will take some time to cut. -매우 질긴 강화 가죽으로 만들어졌어. 자르는데 시간이 좀 걸릴 거야. -Steel Cuffs -스틸 커프스 -A pair of steel cuffs used by the Maidforce. -메이드포스가 사용하는 강철 수갑입니다. -They are made of solid steel. -그들은 단단한 강철로 만들어졌습니다. -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! -Linked Steel Cuffs -연결된 스틸 커프스 -A pair of steel cuffs used by the Maidforce. -메이드포스가 사용하는 강철 수갑입니다. -They are made of solid steel. -그들은 단단한 강철로 만들어졌습니다. -The ankle cuff chain detaches! -발목 커프스 체인이 분리됩니다! +### The TargetRestraint is too durable to pop... -Maid Collar -메이드 목걸이 -A collar for operatives of the Maidforce, a group of covert saboteurs. -은밀한 공작원 그룹인 메이드포스 요원의 목걸이. -It's reinforced with metal and guarded with an expert-level lock. -금속으로 보강하고 전문가 수준의 자물쇠로 보호합니다. -Plug Gag -플러그 개그 -A gag with a long, mouth-filling plug that muffles speech completely. -말을 완전히 숨막히는 길고 입안을 가득 채우는 플러그가 달린 개그입니다. -It's made of a very tough reinforced leather. It will take some time to cut. -매우 질긴 강화 가죽으로 만들어졌어. 자르는데 시간이 좀 걸릴 거야. +### The TargetRestraint is too strong despite your best efforts... -Suspicious Mask -수상한 가면 -You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. -당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 덧대진 금속 눈가리개입니다. -A well-fitted mask, covering your entire head neatly and locking in place. -머리 전체를 깔끔하게 덮고 제자리에 고정되는 잘 맞는 마스크. -It has eyeholes for you to see out of, but blocks access to the face. -밖을 볼 수 있는 눈구멍이 있지만 얼굴에 대한 접근은 차단합니다. +### You can't quite get enough force to pop the TargetRestraint... -Obsidian Muzzle -흑요석 총구 -A muzzle made from segmented metal pieces, fitting securely over your face. -분할된 금속 조각으로 만든 주둥이로 얼굴에 단단히 맞습니다. -It's made of a dark, glistening volcanic metal. -그것은 어둡고 반짝이는 화산 금속으로 만들어졌습니다. +### Your attempts to pop the TargetRestraint are futile due to your restraints... -Obsidian Collar -흑요석 목걸이 -A collar made from a warm, shining alloy. -따뜻하고 빛나는 합금으로 만든 목걸이. -It's made of a dark, glistening volcanic metal. -그것은 어둡고 반짝이는 화산 금속으로 만들어졌습니다. +The chest is too smooth to help. Maybe if you opened it? +상자가 너무 부드러워서 도움이 안 돼요. 열면 아마? -Obsidian Cuffs -흑요석 커프스 -A pair of cuffs that make it easy to restrain you. -당신을 쉽게 구속할 수 있는 수갑입니다. -It's made of a dark, glistening volcanic metal. -그것은 어둡고 반짝이는 화산 금속으로 만들어졌습니다. -The enemy attaches your wrist cuffs together! -적이 당신의 손목 수갑을 묶었습니다! -Obs. Wrist Chain -관찰 손목 체인 -A pair of cuffs keeping your arms behind your back. -팔을 등 뒤로 고정하는 수갑. -It's made of a dark, glistening volcanic metal. -그것은 어둡고 반짝이는 화산 금속으로 만들어졌습니다. -Your cuffs detatch! -수갑이 풀린다! -The enemy attaches your elbow cuffs together! -적이 당신의 팔꿈치 수갑을 붙입니다! +Lockable +잠금 가능 +Non-Lockable +잠글 수 없음 -Obs. Wrist Chain -관찰 손목 체인 -A full set of cuffs keeping your arms in a strict elbow tie! -엄격한 팔꿈치 넥타이로 팔을 보호하는 풀 세트 커프스! -It's made of a dark, glistening volcanic metal. -그것은 어둡고 반짝이는 화산 금속으로 만들어졌습니다. -Your wrists detatch, leaving your elbows still bound! -팔꿈치가 묶인 채로 손목이 분리됩니다! -Obs. Elbow Chain -관찰 팔꿈치 사슬 -A pair of cuffs keeping your elbows locked together!. -팔꿈치를 함께 고정시켜주는 수갑!. -It's made of a dark, glistening volcanic metal. -그것은 어둡고 반짝이는 화산 금속으로 만들어졌습니다. -Your elbows detatch! -팔꿈치가 분리됩니다! -The enemy attaches your wrist cuffs back together! -적이 손목 수갑을 다시 연결합니다! +Unlocked +잠금 해제 +### Lock: -Obsidian Leg Cuffs -흑요석 다리 수갑 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -It's made of a dark, glistening volcanic metal. -그것은 어둡고 반짝이는 화산 금속으로 만들어졌습니다. -Obsidian Ankle Cuffs -흑요석 발목 커프스 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -It's made of a dark, glistening volcanic metal. -그것은 어둡고 반짝이는 화산 금속으로 만들어졌습니다. -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! -Cuffs Chain -커프스 체인 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -It's made of a dark, glistening volcanic metal. -그것은 어둡고 반짝이는 화산 금속으로 만들어졌습니다. -The ankle cuff chain detaches! -발목 커프스 체인이 분리됩니다! +Simple +심플 +### Standard +### Secure -Crystal Cuffs -크리스탈 커프스 -A pair of cuffs that make it easy to restrain you. -당신을 쉽게 구속할 수 있는 수갑입니다. -It's made of a glowing, brittle material. -빛나고 부서지기 쉬운 재료로 만들어졌습니다. -The enemy attaches your wrist cuffs together! -적이 당신의 손목 수갑을 묶었습니다! +### Disc -Crystal Wrist Chain -크리스탈 손목 체인 -A pair of cuffs keeping your arms behind your back. -팔을 등 뒤로 고정하는 수갑. -It's made of a glowing, brittle material. -빛나고 부서지기 쉬운 재료로 만들어졌습니다. -Your cuffs detatch! -수갑이 풀린다! -The enemy attaches your elbow cuffs together! -적이 당신의 팔꿈치 수갑을 붙입니다! +Rubber +고무 +### Crystal -Crystal Wrist Chain -크리스탈 손목 체인 -A full set of cuffs keeping your arms in a strict elbow tie! -엄격한 팔꿈치 넥타이로 팔을 보호하는 풀 세트 커프스! -It's made of a glowing, brittle material. -빛나고 부서지기 쉬운 재료로 만들어졌습니다. -Your wrists detatch, leaving your elbows still bound! -팔꿈치가 묶인 채로 손목이 분리됩니다! +### Runic -Crystal Elbow Chain -크리스탈 팔꿈치 체인 -A pair of cuffs keeping your elbows locked together!. -팔꿈치를 함께 고정시켜주는 수갑!. -It's made of a glowing, brittle material. -빛나고 부서지기 쉬운 재료로 만들어졌습니다. -Your elbows detatch! -팔꿈치가 분리됩니다! -The enemy attaches your wrist cuffs back together! -적이 손목 수갑을 다시 연결합니다! +Magic +마법 +### Cyber -Crystal Leg Cuffs -크리스탈 레그 커프스 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -It's made of a glowing, brittle material. -빛나고 부서지기 쉬운 재료로 만들어졌습니다. -Crystal Ankle Cuffs -크리스탈 앵클 커프스 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -It's made of a glowing, brittle material. -빛나고 부서지기 쉬운 재료로 만들어졌습니다. -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! -Cuffs Chain -커프스 체인 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -It's made of a glowing, brittle material. -빛나고 부서지기 쉬운 재료로 만들어졌습니다. -The ankle cuff chain detaches! -발목 커프스 체인이 분리되었습니다! +### Integrated Cyber +### Advanced Cyber +### Ancient +Simple Lock +심플한 자물쇠 +### Standard Lock -Slave Cuffs -슬레이브 커프스 -A pair of cuffs that make it easy to restrain you. -당신을 쉽게 구속할 수 있는 수갑입니다. -It's made of a gold-tinted metal with a magical enchantment. -마법의 마법이 깃든 금빛 금속으로 만들어졌습니다. -The enemy attaches your wrist cuffs together! -적이 당신의 손목 수갑을 묶었습니다! +### Secure Lock -Slave Wrist Chain -노예 손목 사슬 -A pair of cuffs keeping your arms behind your back. -팔을 등 뒤로 고정하는 수갑. -It's made of a gold-tinted metal with a magical enchantment. -마법의 마법이 깃든 금빛 금속으로 만들어졌습니다. -Your cuffs detatch! -수갑이 풀린다! -The enemy attaches your elbow cuffs together! -적이 당신의 팔꿈치 수갑을 붙입니다! +### Disc Lock -Slave Wrist Chain -노예 손목 사슬 -A full set of cuffs keeping your arms in a strict elbow tie! -엄격한 팔꿈치 넥타이로 팔을 보호하는 풀 세트 커프스! -It's made of a gold-tinted metal with a magical enchantment. -마법의 마법이 깃든 금빛 금속으로 만들어졌습니다. -Your wrists detatch, leaving your elbows still bound! -팔꿈치가 묶인 채로 손목이 분리됩니다! +### Rubber Lock -Slave Elbow Chain -슬레이브 엘보우 체인 -A pair of cuffs keeping your elbows locked together!. -팔꿈치를 함께 고정시켜주는 수갑!. -It's made of a gold-tinted metal with a magical enchantment. -마법의 마법이 깃든 금빛 금속으로 만들어졌습니다. -Your elbows detatch! -팔꿈치가 분리됩니다! -The enemy attaches your wrist cuffs back together! -적이 손목 수갑을 다시 연결합니다! +### Divine Lock -Slave Leg Cuffs -노예 다리 수갑 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -It's made of a gold-tinted metal with a magical enchantment. -마법의 마법이 깃든 금빛 금속으로 만들어졌습니다. -Slave Ankle Cuffs -노예 발목 커프스 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -It's made of a gold-tinted metal with a magical enchantment. -마법의 마법이 깃든 금빛 금속으로 만들어졌습니다. -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! -Slave Cuffs Chain -슬레이브 커프스 체인 -A pair of cuffs chaining your legs together. -다리를 묶는 수갑. -It's made of a gold-tinted metal with a magical enchantment. -마법의 마법이 깃든 금빛 금속으로 만들어졌습니다. -The ankle cuff chain detaches! -발목 커프스 체인이 분리되었습니다! +### Crystal Lock +### Runic Lock -High-Tech Gag -하이테크 개그 -A gag with a soft and filling mouthpiece, reinforced with a metallized strap. -부드럽고 속을 채우는 마우스피스가 달린 재갈, 금속 끈으로 강화됨. -It will be impossible to force it out or cut it with just a knife. -그것을 억지로 빼내거나 칼만으로 자르는 것은 불가능할 것입니다. +### Magic Lock -High-Tech Cables (Arms) -하이테크 케이블(암) -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -첨단 금속화 폴리파이버로 만든 케이블입니다. 강철 모서리에 영향을 받지 않습니다! -They are wrapped methodically around your body! -그들은 당신의 몸을 체계적으로 감싸고 있습니다! -High-Tech Cables (Legs) -하이테크 케이블(다리) -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -첨단 금속화 폴리파이버로 만든 케이블입니다. 강철 모서리에 영향을 받지 않습니다! -They are wrapped methodically around your body! -그들은 당신의 몸을 체계적으로 감싸고 있습니다! -High-Tech Cables (Harness) -하이테크 케이블(하네스) -Cables made from a high-tech metallized polyfiber. Impervious to steel edges! -첨단 금속화 폴리파이버로 만든 케이블입니다. 강철 모서리에 영향을 받지 않습니다! -They are wrapped methodically around your body! -그들은 당신의 몸을 체계적으로 감싸고 있습니다! +### Cyber Lock -Magic Ribbons (Arms) -매직 리본(팔) -Those ribbons will hold you tight~ -그 리본이 널 꽉 잡아줄거야~ -I've put a magic seal in that bow-knot to keep it secure! -나는 그것을 안전하게 유지하기 위해 그 활 매듭에 마법의 인장을 넣었습니다! -Magic Ribbons (Legs) -마법의 리본(다리) -Those ribbons will hold you tight~ -그 리본이 널 꽉 잡아줄거야~ -I've put a magic seal in that bow-knot to keep it secure! -나는 그것을 안전하게 유지하기 위해 그 활 매듭에 마법의 인장을 넣었습니다! -Magic Ribbons (Feet) -매직 리본(발) -Those ribbons will hold you tight~ -그 리본이 널 꽉 잡아줄거야~ -I've put a magic seal in that bow-knot to keep it secure! -나는 그것을 안전하게 유지하기 위해 그 활 매듭에 마법의 인장을 넣었습니다! -Magic Ribbons (Harness) -매직 리본(하네스) -Those ribbons will hold you tight~ -그 리본이 널 꽉 잡아줄거야~ -I've put a magic seal in that bow-knot to keep it secure! -나는 그것을 안전하게 유지하기 위해 그 활 매듭에 마법의 인장을 넣었습니다! -Magic Ribbons (Pelvis) -매직 리본(골반) -Those ribbons will hold you tight~ -그 리본이 널 꽉 잡아줄거야~ -I've put a magic seal in that bow-knot to keep it secure! -나는 그것을 안전하게 유지하기 위해 그 활 매듭에 마법의 인장을 넣었습니다! -Magic Ribbons (Mittens) -매직 리본(장갑) -Those ribbons will hold you tight~ -그 리본이 널 꽉 잡아줄거야~ -They are wrapped tightly around your hands with a bow knot! -활 매듭으로 손에 단단히 감겨 있습니다! -Magic Ribbons (Gag) -매직 리본(개그) -Those ribbons will hold you tight~ -그 리본이 널 꽉 잡아줄거야~ -They are wrapped tightly around your mouth with a bow knot! -활 매듭으로 입 주위를 단단히 감쌌습니다! +### Integrated Cyber Lock -Ice (Arms) -얼음(무기) -Frigid restraints made out of ice. -얼음으로 만든 혹독한 구속. -There's no way to remove it without breaking it off. -부수지 않고는 제거할 수 있는 방법이 없습니다. -Ice (Mouth) -얼음(입) -Frigid restraints made out of ice. -얼음으로 만든 혹독한 구속. -There's no way to remove it without breaking it off. -부수지 않고는 제거할 수 있는 방법이 없습니다. -Ice (Body) -아이스(본체) -Frigid restraints made out of ice. -얼음으로 만든 혹독한 구속. -There's no way to remove it without breaking it off. -부수지 않고는 제거할 수 있는 방법이 없습니다. -Ice (Legs) -얼음(다리) -Frigid restraints made out of ice. -얼음으로 만든 혹독한 구속. -There's no way to remove it without breaking it off. -부수지 않고는 제거할 수 있는 방법이 없습니다. +### Advanced Cyber Lock -Glue (Feet) -접착제(피트) -A latex-derived glue that attaches you to the floor! It's very stretchy. -바닥에 달라붙는 라텍스 유래 접착제! 신축성이 매우 뛰어납니다. -Just touching it makes it stick all over... -만지기만 해도 온통 달라붙어... -Glue (Ankles) -접착제(발목) -A latex-derived glue that attaches you to the floor! It's very stretchy. -바닥에 달라붙는 라텍스 유래 접착제! 신축성이 매우 뛰어납니다. -Just touching it makes it stick all over... -만지기만 해도 온통 달라붙어... -Glue (Legs) -접착제(다리) -A latex-derived glue that attaches you to the floor! It's very stretchy. -바닥에 달라붙는 라텍스 유래 접착제! 신축성이 매우 뛰어납니다. -Just touching it makes it stick all over... -만지기만 해도 온통 달라붙어... +### You can't use that while gagged! -Slime (Feet) -슬라임(발) -Sticky slime that adheres to your body. It reacts negatively to mana... -몸에 달라붙는 끈적끈적한 슬라임. 마나에 부정적 반응을 보이는데... -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Slime (Ankles) -슬라임(발목) -Sticky slime that adheres to your body. It reacts negatively to mana... -몸에 달라붙는 끈적끈적한 슬라임. 마나에 부정적 반응을 보이는데... -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Slime (Legs) -슬라임(다리) -Sticky slime that adheres to your body. It reacts negatively to mana... -몸에 달라붙는 끈적끈적한 슬라임. 마나에 부정적 반응을 보이는데... -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Slime (Arms) -슬라임(무기) -Sticky slime that adheres to your body. It reacts negatively to mana... -몸에 달라붙는 끈적끈적한 슬라임. 마나에 부정적 반응을 보이는데... -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Slime (Hands) -슬라임(손) -Sticky slime that adheres to your body. It reacts negatively to mana... -몸에 달라붙는 끈적끈적한 슬라임. 마나에 부정적 반응을 보이는데... -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Slime (Mouth) -슬라임(입) -Sticky slime that adheres to your body. It reacts negatively to mana... -몸에 달라붙는 끈적끈적한 슬라임. 마나에 부정적 반응을 보이는데... -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Slime (Head) -슬라임(머리) -Sticky slime that adheres to your body. It reacts negatively to mana... -몸에 달라붙는 끈적끈적한 슬라임. 마나에 부정적 반응을 보이는데... -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! +You can't use that without your fingers! +손가락 없이는 사용할 수 없습니다! +You struggle against your bindings but it's too strict!. +당신은 당신의 속박에 맞서 싸우고 있지만 그것은 너무 엄격합니다!. +You drop the pick due to your bound hands! +손이 묶여서 락픽을 떨어뜨렸습니다! +You drop your knife due to your bound hands! +손이 묶인 탓에 칼을 떨어뜨리다니! +You drop the precious knife due to your bound hands! +손이 묶인 탓에 소중한 칼을 떨어뜨렸습니다! +You drop the key due to your bound hands! +손이 묶인 탓에 열쇠를 떨어뜨렸습니다! +You drop the magic key due to your bound hands! +손이 묶인 탓에 마법의 열쇠를 떨어뜨렸습니다! +### You insert the card the wrong way and the reader ejects it onto the floor! -Rubber (Feet) -고무(피트) -Sticky rubber that has fused itself into a shell around your body. -몸 주위의 껍질에 융합된 끈적끈적한 고무. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Rubber (Ankles) -고무(발목) -Sticky rubber that has fused itself into a shell around your body. -몸 주위의 껍질에 융합된 끈적끈적한 고무. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Rubber (Legs) -고무(다리) -Sticky rubber that has fused itself into a shell around your body. -몸 주위의 껍질에 융합된 끈적끈적한 고무. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Rubber (Arms) -고무(팔) -Sticky rubber that has fused itself into a shell around your body. -몸 주위의 껍질에 융합된 끈적끈적한 고무. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Rubber (Hands) -고무(손) -Sticky rubber that has fused itself into a shell around your body. -몸 주위의 껍질에 융합된 끈적끈적한 고무. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Rubber (Mouth) -고무(입) -Sticky rubber that has fused itself into a shell around your body. -몸 주위의 껍질에 융합된 끈적끈적한 고무. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Rubber (Head) -고무(헤드) -Sticky rubber that has fused itself into a shell around your body. -몸 주위의 껍질에 융합된 끈적끈적한 고무. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. +### Journal (N) +Passing... +통과... +Closing... +닫는중... +Close door +문을 닫다 +Sprinting!!! +달립니다!!! +Sprint! +달리기! +Hopping!!! +도약합니다!!! +Hop! +도약! +You run! +당신은 달립니다! +You hop desperately! +당신은 필사적으로 뜁니다! +Close Door +문을 닫다 +Unlock +잠금 해제 +Command +명령 +You utter a command word and release the lock! +당신은 명령 단어를 말하고 자물쇠를 해제합니다! +You mutter an unintelligible command word and your locks do not open. +이해할 수 없는 명령을 중얼거려도 자물쇠가 열리지 않습니다. +You mumble a command word but the lock opens! +당신이 명령 단어를 말하자, 자물쇠가 열립니다! +You mess up saying the command word. The lock stays put! +당신은 명령어를 잘못 말했습니다. 자물쇠는 제자리에 있습니다! +### Swipe Keycard +### You swipe your keycard and the lock releases with a hiss! +### You swipe your keycard and the lock beeps 'Access Denied'! -Proto-Slime (Feet) -프로토슬라임(발) -It seems to be a precursor to the slimes everyone is familiar with? -모두에게 친숙한 슬라임의 전조인 것 같죠? -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Proto-Slime (Ankles) -프로토슬라임(발목) -It seems to be a precursor to the slimes everyone is familiar with? -모두에게 친숙한 슬라임의 전조인 것 같죠? -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Proto-Slime (Legs) -프로토슬라임(다리) -It seems to be a precursor to the slimes everyone is familiar with? -모두에게 친숙한 슬라임의 전조인 것 같죠? -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Proto-Slime (Arms) -프로토슬라임(팔) -It seems to be a precursor to the slimes everyone is familiar with? -모두에게 친숙한 슬라임의 전조인 것 같죠? -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Proto-Slime (Hands) -프로토슬라임(손) -It seems to be a precursor to the slimes everyone is familiar with? -모두에게 친숙한 슬라임의 전조인 것 같죠? -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Proto-Slime (Mouth) -프로토슬라임(입) -It seems to be a precursor to the slimes everyone is familiar with? -모두에게 친숙한 슬라임의 전조인 것 같죠? -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! -Proto-Slime (Head) -프로토슬라임(머리) -It seems to be a precursor to the slimes everyone is familiar with? -모두에게 친숙한 슬라임의 전조인 것 같죠? -It is an organic material that reforms around every cut you make! -그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! +### You don't have any card to scan in the slot. -Proto-Rubber (Feet) -원시 고무(피트) -Sticky slime that has fused itself into a shell around your body. -몸 주위에 껍질을 형성한 끈적끈적한 점액입니다. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Proto-Rubber (Ankles) -원시고무(발목) -Sticky slime that has fused itself into a shell around your body. -몸 주위에 껍질을 형성한 끈적끈적한 점액입니다. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Proto-Rubber (Legs) -원시 고무(다리) -Sticky slime that has fused itself into a shell around your body. -몸 주위에 껍질을 형성한 끈적끈적한 점액입니다. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Proto-Rubber (Arms) -원시 고무(팔) -Sticky slime that has fused itself into a shell around your body. -몸 주위에 껍질을 형성한 끈적끈적한 점액입니다. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Proto-Rubber (Hands) -원시 고무(손) -Sticky slime that has fused itself into a shell around your body. -몸 주위에 껍질을 형성한 끈적끈적한 점액입니다. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Proto-Rubber (Mouth) -원시 고무(입) -Sticky slime that has fused itself into a shell around your body. -몸 주위에 껍질을 형성한 끈적끈적한 점액입니다. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. -Proto-Rubber (Head) -원시 고무(헤드) -Sticky slime that has fused itself into a shell around your body. -몸 주위에 껍질을 형성한 끈적끈적한 점액입니다. -There's no struggling out now, but since it's solid it may be cuttable. -지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. +### Use Retinal Scanner +### You scan your eye pattern and the lock releases with a hiss! +### The lock rejects you, citing your lack of authority. -Tape Mittens -테이프 장갑 -Sticky tape that holds your hands into a fist! -손을 주먹으로 잡아주는 점착 테이프! -It's tough to get out of without some kind of grip! -어떤 종류의 그립 없이는 빠져 나오기가 어렵습니다! +### You are blindfolded, so the scanner can't even see your eye! -Arm Chains -암 체인 -Heavy chains keeping your arms securely behind your back. -팔을 등 뒤로 단단히 고정시키는 무거운 사슬. -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... -Leg Chains -다리 사슬 -Heavy chains keeping your legs firmly hobbled. -당신의 다리를 절뚝거리게 만드는 무거운 사슬. -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... -Ankle Chains -발목 체인 -Heavy chains keeping your feet bound together. -당신의 발을 묶어주는 무거운 사슬. -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... -Crotch Chain -가랑이 체인 -Heavy chains that serve as an anchor point around your waist. -허리 주위의 고정점 역할을 하는 무거운 사슬. -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... +### Hack -Magic Arm Chains -암 체인 -Magic chains keeping your arms securely behind your back. -팔을 등 뒤로 단단히 고정시키는 마법의 사슬. -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... -Magic Leg Chains -다리 사슬 -Magic chains keeping your legs firmly hobbled. -당신의 다리를 절뚝거리게 만드는 마법의 사슬. -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... -Magic Ankle Chains -발목 체인 -Magic chains keeping your feet bound together. -발을 묶는 마법의 사슬. -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... -Magic Crotch Chain -가랑이 체인 -Magic chains that serve as an anchor point around your waist. -허리의 고정점 역할을 하는 마법의 사슬. -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... +### You bypass the lock's cyber defenses and release it with a hiss! +### The lock beeps as its security blocks your attempts at release. -Shadow Chains (Arms) -섀도우 체인(무기) -Black chains for those who cross the divines -신을 넘는 자들을 위한 검은 사슬 -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... -Shadow Chains (Legs) -그림자 사슬(다리) -Black chains for those who cross the divines -신을 넘는 자들을 위한 검은 사슬 -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... -Shadow Chains (Ankles) -그림자 사슬(발목) -Black chains for those who cross the divines -신을 넘는 자들을 위한 검은 사슬 -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... -Shadow Chain -그림자 사슬 -Black chains for those who cross the divines -신을 넘는 자들을 위한 검은 사슬 -It doesn't look like a knife is up to the task... -나이프가 할 일이 아닌 것 같은데... +### You have no way to hack the locking system. -Ectoplasmic Chains (Arms) -심령체 사슬(팔) -Ghostly chains from a ghost that just doesn't want to let go. -놓아버리고 싶지 않은 유령의 유령 사슬. -It's made of an ethereal substance. -천상의 물질로 만들어졌습니다. -Ectoplasmic Chains (Legs) -심령체 사슬(다리) -Ghostly chains from a ghost that just doesn't want to let go. -놓아버리고 싶지 않은 유령의 유령 사슬. -It's made of an ethereal substance. -천상의 물질로 만들어졌습니다. -Ectoplasmic Chains (Ankles) -심령체 사슬(발목) -Ghostly chains from a ghost that just doesn't want to let go. -놓아버리고 싶지 않은 유령의 유령 사슬. -It's made of an ethereal substance. -천상의 물질로 만들어졌습니다. -Ectoplasmic Chain -심령체 사슬 -Ghostly chains from a ghost that just doesn't want to let go. -놓아버리고 싶지 않은 유령의 유령 사슬. -It's made of an ethereal substance. -천상의 물질로 만들어졌습니다. +Pick +락픽 +(No way to open) +(열 수 있는 방법이 없습니다) +(She cannot help you) +(그녀는 당신을 도울 수 없습니다) +Offer XXXg +XXXg 제공 +Offer +권하다 +You do not have enough for a proper offering. +적절한 제물을 바칠 만큼 충분하지 않습니다. +The goddess removes some of your restraints! +여신이 당신의 속박을 풀어줍니다! +The goddess restores your mental and physical state! +여신이 당신의 심신을 회복시켜 드립니다! +The goddess teaches you the secrets of SCHOOL. (+1 level) +여신이 학교의 비밀을 가르쳐준다. (+1 level) +The goddess of SCHOOL grants you destructive spellcasting! +학교의 여신이 당신에게 파괴적인 마법을 부여합니다! +The goddess of SCHOOL grants you invisibility on attacks! +SCHOOL의 여신이 공격에 대해 투명화를 부여합니다! +The goddess of SCHOOL grants you protection and retaliation! +SCHOOL의 여신이 당신을 보호하고 보복합니다! +You leave the coins on the altar and they transform into a ItemBought! +동전을 제단에 두면 아이템 구매로 바뀝니다! +object +오브젝트 -Divine Cuffs -신성한 수갑 -It is said that even heaven has its hierarchies... -하늘에도 서열이 있다고 하던데... -Shining cuffs made of holy metal. Nothing can touch it. -신성한 금속으로 만든 빛나는 수갑. 아무것도 건드릴 수 없어. -Divine Cuffs -신성한 수갑 -It is said that even heaven has its hierarchies... -하늘에도 서열이 있다고 하던데... -Shining cuffs made of holy metal. Nothing can touch it. -신성한 금속으로 만든 빛나는 수갑. 아무것도 건드릴 수 없어. -Divine Muzzle -신성한 총구 -It is said that even heaven has its hierarchies... -하늘에도 서열이 있다고 하던데... -A shining muzzle made of holy metal. Nothing can touch it. -신성한 금속으로 만들어진 빛나는 주둥이. 아무것도 건드릴 수 없어. -Blindfold -눈가리개 -A piece of cloth secured onto your face and blocking vision. -천 조각이 얼굴에 고정되어 시야를 가리고 있습니다. -You can still see through the gap around your nose. -당신은 여전히 ​​코 주위의 틈을 통해 볼 수 있습니다. -Knotted Cloth Gag -매듭 천 개그 -A piece of cloth tied in a knot and tied over your mouth. -매듭으로 묶고 입에 묶인 천 조각. -On its own it's not very restrictive. -그 자체로는 그다지 제한적이지 않습니다. -OTN Cloth Gag -OTN 천 개그 -A piece of cloth tightened over your mouth. -당신의 입을 꽉 조이는 천 조각. -On its own it's not very restrictive. -그 자체로는 그다지 제한적이지 않습니다. -Blindfold -눈가리개 -A scarf secured onto your face and blocking vision. -얼굴에 고정되어 시야를 가리는 스카프. -You can still see through the gap around your nose. -당신은 여전히 ​​코 주위의 틈을 통해 볼 수 있습니다. -Scarf Gag -스카프 개그 -A scarf tightened over your mouth. -목도리가 입에 단단히 조여졌습니다. -On its own it's not very restrictive. -그 자체로는 그다지 제한적이지 않습니다. -Scarf Tie -스카프 넥타이 -A scarf wrapped around your body. -몸을 감싸는 스카프. -On its own it's not very restrictive. -그 자체로는 그다지 제한적이지 않습니다. -Scarf Leg Tie -스카프 레그 타이 -A scarf wrapped around your body. -몸을 감싸는 스카프. -On its own it's not very restrictive. -그 자체로는 그다지 제한적이지 않습니다. -Scarf Ankle Tie -스카프 앵클 타이 -A scarf wrapped around your body. -몸을 감싸는 스카프. -On its own it's not very restrictive. -그 자체로는 그다지 제한적이지 않습니다. +It appears to be a receptacle for an ancient crystal. +고대 수정을 담는 그릇인 것 같습니다. +It's a pile of slag emitting a strange magic smoke... +이상한 마력의 연기를 내뿜는 슬래그 더미야... +### That object is locked with a LKTP. -Arm Belts -팔 벨트 -A ludicrous amount of belts secured with a buckle. -버클이 달린 터무니없는 양의 벨트. -Lockable and fully adjustable to ensure snugness. -아늑함을 보장하기 위해 잠글 수 있고 완전히 조절 가능합니다. -Leg Belts -다리 벨트 -A ludicrous amount of belts secured with a buckle. -버클이 달린 터무니없는 양의 벨트. -Lockable and fully adjustable to ensure snugness. -아늑함을 보장하기 위해 잠글 수 있고 완전히 조절 가능합니다. -Ankle Belts -발목 벨트 -A ludicrous amount of belts secured with a buckle. -버클이 달린 터무니없는 양의 벨트. -Lockable and fully adjustable to ensure snugness. -아늑함을 보장하기 위해 잠글 수 있고 완전히 조절 가능합니다. +A shrine to the goddess of TYPE. +TYPE의 여신을 모시는 신전. +That door is open. Do you want to close it? +그 문은 열려 있습니다. 닫으시겠습니까? +You slam the door and jam it shut! +당신은 문을 쾅 닫고 잼! +### Passion -Wrist Cuffs -손목 수갑 -Heavy shackles with a rudimentary lock. -기본적인 자물쇠가 달린 무거운 족쇄. -You could pick these with a hairpin. -머리핀으로 이것을 고를 수 있습니다. -Shackles -족쇄 -Heavy shackles with a rudimentary lock. -기본적인 자물쇠가 달린 무거운 족쇄. -You could pick these with a hairpin. -머리핀으로 이것을 고를 수 있습니다. +Frustration +좌절 +Submissiveness +순종 +Security Level +보안 수준 +Undead +언데드 +Latex +라텍스 +Leather +가죽 +Metal +금속 +Ropes +로프 +Restoration +회복 +Elements +정령 +Conjuration +주술 +Illusions +환상 +Commerce +상업 +### Shrine of SHRINETYPE -Leg Shackles -다리 족쇄 -Heavy shackles with a rudimentary lock. -기본적인 자물쇠가 달린 무거운 족쇄. -You could pick these with a hairpin. -머리핀으로 이것을 고를 수 있습니다. -Ankle Shackles -발목 족쇄 -Heavy shackles with a rudimentary lock. -기본적인 자물쇠가 달린 무거운 족쇄. -You could pick these with a hairpin. -머리핀으로 이것을 고를 수 있습니다. -Ankle Shackles -발목 족쇄 -The enemy attaches your ankle cuffs together! -적이 당신의 발목 수갑을 묶었습니다! -Heavy shackles with a rudimentary lock. -기본적인 자물쇠가 달린 무거운 족쇄. -You could pick these with a hairpin. -머리핀으로 이것을 고를 수 있습니다. -The ankle cuff chain detaches! -발목 커프스 체인이 분리되었습니다! -Steel Muzzle -강철 총구 -A heavy muzzle with a rudimentary lock. -보통 자물쇠가 달린 무거운 주둥이입니다. -You could pick this with a hairpin. -머리핀으로 이것을 고를 수 있습니다. +### Tablet of +### Goddess: +### Goddess Blessing: +### Goddess Curse: -Cursed Collar -저주받은 목줄 -A cold steel collar locked tightly on your neck. -목에 단단히 고정된 차가운 강철 목걸이. -It appears to attract additional enemies to its wearer. -착용자에게 추가 적을 끌어당기는 것 같습니다. +### Mana Bonus: +### Lack of Mana Penalty: -Face -얼굴 -Head -머리 -Mouth -입 -Mouth -입 -Mouth -입 -Ears -귀 -Collar -목걸이 -Neck -목 -Arms -무기 -Hands -소유 -Torso -몸통 -Bra -좋은 -Belt -벨트 -Plug -플러그 -Vibe -바이브 -Piercings -피어싱 -Nipples -젖꼭지 -Butt Plug -엉덩이 플러그 -Legs -다리 -Ankles -발목 -Feet -피트 -Device -장치 +### Your excess mana helps you suppress the enchantment! -You picked up XXX gold. -XXX 골드를 주웠습니다. -You retrieve an ancient power crystal. -당신은 고대의 파워 크리스탈을 되찾았습니다. -You retrieve a spent ancient power crystal. -사용한 고대의 힘 수정을 되찾았습니다. -You pick up a magical amulet and use it to boost your stats. -당신은 마법의 부적을 집어들고 그것을 사용하여 당신의 능력치를 향상시킵니다. -You picked up a knife. -당신은 칼을 집어 들었다. -You picked up a torch. -당신은 횃불을 집어 들었다. -You found a bundle of discarded knives! -버려진 칼 다발을 찾았군요! -You picked up an enchanted knife. -당신은 마법이 부여된 칼을 집어들었습니다. -You picked up a magic knife. -당신은 마법의 칼을 집어들었습니다. -You picked up a lockpick. -자물쇠를 집어 들었어. -You picked up a normal key. -일반 열쇠를 주셨군요. -You picked up a green key. -당신은 녹색 열쇠를 집어들었습니다. -You picked up a blue key. -당신은 파란 열쇠를 집어들었습니다. -You picked up a willpower potion. -당신은 의지력의 물약을 집어 들었습니다. -You picked up a glowing blue mana potion. -빛나는 파란색 마나 물약을 집어 들었습니다. -You picked up a glowing blue orb. -빛나는 푸른 구슬을 집어들었습니다. -You picked up an invisibility potion. -당신은 투명 물약을 집어 들었습니다. -You picked up a handful of ectoplasm. -엑토플라즘 한 움큼 주웠어. -You picked up a green stamina potion. -녹색 스태미나 포션을 주웠어. -You picked up a frigid white potion. -차가운 흰색 물약을 집어 들었습니다. -You found a peculiar note on the ground and keep it in your journal. -당신은 땅에서 특이한 메모를 발견했고 그것을 당신의 일지에 보관했습니다. -You found an uninteresting note on the ground. -지상에서 흥미롭지 않은 메모를 발견했습니다. -You pick up a heavy hammer. -무거운 망치를 들어라. -You pick up a set of bolt cutters. -당신은 볼트 절단기 세트를 집습니다. -You pick up a sharp sword. -당신은 날카로운 검을 집습니다. -You pick up a flamberge. -당신은 플랑베르주를 줍습니다. -You recover your escort drone. -당신은 당신의 호위 드론을 회수합니다. -You pick up a 'magic' wand... -당신은 '마술' 지팡이를 집어들고... -You pick up a magical ice cube. -당신은 마법의 얼음 조각을 집었습니다. -You find some treated hemp rope. -처리된 대마 로프를 찾았습니다. -You pick up a feather. -당신은 깃털을 집습니다. -You pick up a heavy flail. -무거운 도리깨를 들어라. -You pick up a shortspear. -당신은 shortspear를 선택합니다. -You pick up a pickaxe. -당신은 곡괭이를 줍습니다. -You pick up an enchanted sword. -당신은 마법이 부여된 검을 집었습니다. -You pick up an enchanted axe. -당신은 마법에 걸린 도끼를 집었습니다. -You pick up an enchanted hammer. -당신은 마법에 걸린 망치를 집습니다. -You pick up a light hammer that's inscribed 'IceBreaker'. -당신은 'IceBreaker'라고 적힌 가벼운 망치를 집습니다. -You pick up an enchanted spear. -당신은 마법에 걸린 창을 집었습니다. -You pick up an enchanted flail. -당신은 마법에 걸린 도리깨를 집었습니다. -You pick up a powerful axe. -당신은 강력한 도끼를 집습니다. -You pick up a consumable smoke bomb. -소모성 연막탄을 집으십시오. -You picked up a stone trinket with a glowing red sigil. -빛나는 붉은 인장이 있는 돌 장신구를 주웠습니다. -You picked up a wet rock with some kind of symbol on it. -당신은 어떤 상징이 있는 젖은 돌을 집어들었습니다. -You picked up a crystal beautiful as the moon. -달처럼 아름다운 수정을 주웠어. -You picked up a strange device with a sharpened razor disc. -당신은 날카로운 면도날 디스크가 있는 이상한 장치를 집어들었습니다. -You find a strange ancient device with a sharp cutting blade. -예리한 칼날이 달린 이상한 고대 장치를 발견했습니다. -You picked up a stone trinket with a glowing blue sigil. -파란색 인장이 빛나는 돌 장신구를 주웠습니다. -You pick up a bola. -당신은 볼라를 집습니다. -You pick up a bomb! -당신은 폭탄을 집어! -You pick up Dragonslaver. -드래곤 슬레이버를 집으십시오. -You pick up Metamorphosis. -당신은 변태를 선택합니다. -You pick up Four Seasons. -당신은 Four Seasons를 선택합니다. -You pick up The Arbiter. -당신은 The Arbiter를 선택합니다. -You pick up Dreamcatcher. -드림캐쳐 주워. -You retrieve the Bondage Buster. -본디지 버스터를 되찾았습니다. -You retrieve a Nevermere Blaster Mark IV. -Nevermere Blaster Mark IV를 회수했습니다. -You retrieve the Messenger of Love. -당신은 사랑의 메신저를 회수합니다. -You retrieve Moirai's scissors. -당신은 모이라이의 가위를 회수합니다. +### Your mana is too weak to fight the magical enchantment... +Curses +저주 -You pick up a bunch of scrolls! -당신은 많은 두루마리를 집었습니다! -You pick up a Scroll of Sleight. -당신은 교활한 두루마리를 집었습니다. -You pick up a Scroll of Purity. -당신은 순수의 두루마리를 집었습니다. -You pick up a Scroll of Speech. -당신은 연설 두루마리를 집습니다. -You pick up a Scroll of Sauntering. -당신은 소란의 두루마리를 집었습니다. -As you strike again, your weapon is pulled out of your grasp! -다시 공격하면 무기가 손아귀에서 빠져나갑니다! -Your weapon slips out of your hand as you try to cut with it... -네 무기로 베려고 할 때 손에서 빠져나간다... +A tablet inscribed with runes of TYPE. +TYPE 의 룬 문자가 새겨진 서판. +### SHRINETYPE Tablet -You put away the WEAPONNAME -당신은 WEAPONNAME을 집어넣었습니다 -You equip the WEAPONNAME -당신은 WEAPONNAME을 장비합니다 -Unequip -장비 해제 -Equip -갖추어 주다 -Equipped -갖추어 준 +Decypher +해독 +### You read the runes and they fill you with power! +### These runes are meant for someone with less willpower. +You try to read the runes but cannot understand them. +당신은 룬을 읽으려고 하지만 이해할 수 없습니다. +### Allies: +### Enemies: +### Favorable: -Unlit Torch -꺼진 횃불 -Can be lit -점등 가능 -Torch -토치 -Provides light -빛을 제공하다 -Lantern -칸델라 -Provides light -빛을 제공하다 -Magic Lantern -환등기 -Provides light -빛을 제공하다 -Unlit Lantern -꺼진 랜턴 -Can be lit -점등 가능 -Liquid Latex -액체 라텍스 -Engulfs creatures -생물을 삼킨다 -Slime -더러운 것 -Slows creatures -느린 생물 -Ice -얼음 -Chilling and slippery -차갑고 미끄럽다 -Ropes -밧줄 -Looking for a new wearer -새로운 착용자를 찾습니다 -Chains -쇠사슬 -Broken pieces of chain -부러진 사슬 조각 -Belts -벨트 -Pieces of straps and leather -스트랩과 가죽 조각 -Vines -덩굴 -Fierce plantlife -사나운 식물 -Ribbons -고삐 -Empowered with magic -마법으로 강화 -Blessed Wrappings -축복받은 포장지 -Enchanted wrappings -매혹적인 포장 -Summoning Runes -소환의 룬 -Mystical runes used for summoning -소환에 사용되는 신비한 룬 -Embers -여신 -Ignition source. Blocks vision. -점화원. 시야를 차단합니다. -Inferno -지옥 -Deals DAMAGEDEALT fire damage per turn -턴당 DAMAGEDEALT 화염 피해를 입힙니다. -Steam -증기 -Blocks vision -시야 차단 -Smoke -연기 -Blocks vision -시야 차단 -Cracked Earth -금이 간 지구 -Makes creatures unsteady -생물을 불안정하게 만듭니다. +### None -Can be controlled using CMD spells -CMD 주문을 사용하여 제어할 수 있습니다 -Can be controlled using Rubbermancy -러버맨시로 제어 가능 +Nevermere Trainers +네버미어 트레이너 +DressUp Co. +주식회사 드레스업 +Bounty Hunters Guild +현상금 사냥꾼 길드 +Bandits +밴딧 +Constructs +구성 +School of Magic +마법 학교 +Old Guardians +올드 가디언 +Cult of the Wild +컬트 오브 더 와일드 +Cult of Bast +바스트 숭배 +Alchemists +연금술사 +Elementals +정령들 +Dragonheart Order +드래곤하트 오더 +MaidForce +메이드포스 +Fungal Kingdom +곰팡이 왕국 +Nature +자연 -Floor -바닥 -Wall -벽 -Brickwork -벽돌 쌓기 -Doodad -토론 -Furniture -가구 -Table -테이블 -Shrine -신사 -Ruined Shrine -폐허가 된 신전 -Orb Altar -오브 제단 -Empty Altar -빈 제단 -Chest -가슴 -Empty Chest -빈 상자 -Shiny Object -반짝이는 물체 -Shiny Object -반짝이는 물체 -Cracked Wall -금이 간 벽 -Hook -훅 -Entrance -입구 -Exit Stairs -출구 계단 -Mysterious Stairs -신비한 계단 -Ghostly Adventurer -유령 모험가 +Witches' Coven +마녀 집회 +### Love Crafters +### Velvet Pact +### Knights Errant +### Scavengers -Ars Pyrotecnica -아르스 파이로테크니카 -Codex Imaginus -코덱스 이미지너스 -Clavicula Romantica -로맨틱 쇄골 -A book of elemental magic -원소 마법의 책 -A book about conjuration -컨저링에 관한 책 -A book of manipulative spells -조작 마법의 책 +### Fae Tricksters +### Zora's Crew -Components: -구성 요소: -Verbal -언어 적 -Arm Movements -팔의 움직임 -Leg Gestures -다리 제스처 -The incantation comes out as a garbled mess! -주문이 엉망진창으로 나온다! -You can't raise your arms to cast the spell! -주문을 걸기 위해 팔을 들 수는 없습니다! -Your feet are too clumsy to perform the magic gesture! -발이 너무 서툴러서 마법의 몸짓을 할 수 없어! +### Rope Dojo -Next Page -다음 페이지 -Last Page -마지막 페이지 -Random Page (your hands are tied) -랜덤 페이지(손이 묶여 있습니다) +### Doll Shoppe -Verbal -언어 적 -Arms -무기 -Legs -다리 -Misc -기타 -Elements -집단 -Conjuration -주문 -Illusion -환각 -Other -다른 -Strength -힘 -Dexterity -재치 -Intelligence -지능 -Misc -기타 +### Fuuka's Shrine -Learnable -학습 가능 -Unlearned -배우지 않은 -Excl. Upgrades -제외 업그레이드 -Passive -수동적인 -Upcast -배기갱 -Buffs -버프 -DoT -점 -Projectiles -발사체 -Melee -난투 -Area Damage -지역 피해 -Area Denial -지역 거부 -Offense -위반 -Defense -방어 -Fire -불 -Ice -얼음 -Earth -지구 -Air -공기 -Lightning -번개 -Water -물 -Rubber -고무 -Teleport -텔레포트 -Physics -물리학 -Conjuration -주문 -Summoning -소환 -Binding -제본 -Metal -금속 -Rope -로프 -Leather -가죽 -Stealth -몰래 하기 -Projection -투사 -Alteration -변경 -Light -빛 -Shadow -그림자 -Knowledge -지식 -Utility -공익사업 -Upgrades -업그레이드 -Spell Tree -주문 트리 -Willpower -의지력 -Stamina -내구력 -Magic -마법 -Damage -손상 -Distraction -혼란 +### The Collectors -Empower to upcast spells -업캐스트 주문 강화 -Cancel empowerment -권한 부여 취소 -You channel mana through your body! Empowerment level: LEVEL -당신은 당신의 몸을 통해 마나를 전달합니다! 강화 수준: LEVEL -You are already at the maximum empowerment level! -당신은 이미 최대 강화 레벨에 도달했습니다! -You don't have any upcast spells yet. -아직 업캐스트 주문이 없습니다. -Upcast from SPELL -SPELL에서 업캐스트 +### Dollmaker Inc. -You fail to concentrate on the spell and it fizzles! -당신은 주문에 집중하지 못하고 어지러워집니다! -Your gag causes you to mispronounce the magic words! -당신의 개그 때문에 마법의 단어를 잘못 발음하게 됩니다! -The ice drains your concentration! Your mana and stamina are slipping away! -얼음이 집중력을 떨어뜨립니다! 당신의 마나와 스태미나가 빠져나가고 있습니다! -A strange, chaotic energy flows into you! Your will is weakened and your mana fades! -이상하고 혼란스러운 에너지가 당신에게 흘러 들어옵니다! 의지가 약해지고 마나가 사라집니다! -Something gently, constantly tickles you! -무언가 부드럽게, 끊임없이 당신을 간질입니다! +### Adventurer -The ampule shatters on impact! -충격에 앰플이 산산조각! -The gas ampule shatters on impact! -가스 앰플이 충격을 받으면 부서집니다! -The glue ampule shatters on impact! -글루 앰플이 충격에 부서집니다! -The rubber ampule shatters on impact! -고무 앰플은 충격에 산산조각! -The latex ampule shatters on impact and forms a restraint! -라텍스 앰플이 충격에 깨져 구속을 형성! -The latex ampule shatters on impact and coats your body! -라텍스 앰플이 충격에 깨지면서 몸을 코팅! -The latex ampule shatters on impact and sticks to you! -라텍스 앰플이 충격에 깨져 착 달라붙는! -Gas Ampule -가스 앰플 -Glue Ampule -접착제 앰플 -Rubber Ampule -고무 앰플 -Latex Ampule -라텍스 앰플 +### Cursed Spirit -Shadowy chains appear from a rift in space! -어둠의 사슬이 우주의 균열에서 나타납니다! -The roaring inferno deals 10 damage to you! -포효하는 지옥이 당신에게 10의 피해를 입힙니다! +Delinquent +체납 +### Computer Virus -Flame Novice -화염 초보자 -Unlocks fire spells. Learn Firebolt. -불 주문을 잠금 해제합니다. 파이어볼트를 배우세요. -Lightning Novice -번개 초보자 -Unlocks electrice spells. Learn Electrify. -전기 주문을 잠금 해제합니다. 일렉트리파이를 배우십시오. -Water Novice -물 초보자 -Unlocks water spells. Learn Water Ball. -물 주문을 잠금 해제합니다. 워터볼을 배워보세요. -Ice Novice -아이스 노비스 -Unlocks ice spells. Learn Freeze. -얼음 주문을 잠금 해제합니다. 동결을 배우십시오. -Earth Novice -지구 초보자 -Unlocks earth spells. Learn Stone Skin. -대지 주문을 잠금 해제합니다. 스톤 스킨을 배웁니다. -Air Novice -에어 노비스 -Unlocks air spells. Learn Wind Blast. -공기 주문을 잠금 해제합니다. 윈드 블래스트를 배웁니다. +### Extraplanar Entity -Latex 101 -라텍스 101 -Unlocks latex spells. Learn Slime Ball. -라텍스 주문을 잠금 해제합니다. 슬라임볼을 배웁니다. -Metal 101 -금속 101 -Unlocks metal spells. Learn Conjure Cuffs. -금속 주문을 잠금 해제합니다. Conjure Cuffs를 배우십시오. -Rope 101 -로프 101 -Unlocks rope spells. Learn Conjure Ropes. -로프 주문을 잠금 해제합니다. Conjure Ropes를 배우십시오. -Leather 101 -가죽 101 -Unlocks leather spells. Learn Conjure Gag. -가죽 주문을 잠금 해제합니다. Conjure Gag를 배우십시오. -Physics 101 -물리학 101 -Unlocks teleportation and physical manipulation spells. Learn Wall. -순간 이동 및 물리적 조작 주문을 잠금 해제합니다. 벽을 배우십시오. -Summoning 101 -소환 101 -Unlocks summoning spells. Learn Summon Familiar. -소환 주문을 잠금 해제합니다. Summon Familiar를 배우십시오. +### Dubious Witch -Blessing of Shadow -그림자의 축복 -Unlocks shadow spells. Learn Shadow Dagger. -그림자 주문을 잠금 해제합니다. 쉐도우 대거를 배우십시오. -Blessing of Light -빛의 축복 -Unlocks light spells. Learn Flash. -가벼운 주문을 잠금 해제합니다. 플래시를 배우십시오. -Blessing of Obscurity -모호함의 축복 -Unlocks invisibility spells. Learn Camouflage. -보이지 않는 주문을 잠금 해제합니다. 위장을 배우십시오. -Projection Magic -프로젝션 매직 -Unlocks illusory spells. Learn Summon Decoy. -환상적인 주문을 잠금 해제합니다. 소환 미끼를 배웁니다. -Alteration Magic -변경 마법 -Unlocks alteration spells. Learn Confuse. -변경 주문을 잠금 해제합니다. 혼란을 배우십시오. -Arcane Knowledge -신비한 지식 -Unlocks knowledge and critical-strike spells. Learn True Steel, and unlocks advanced tooltips for enemies. -지식과 치명타 주문을 잠금 해제합니다. True Steel을 배우고 적에 대한 고급 툴팁을 잠금 해제합니다. +### Shadow Clan +Illegal Poacher +불법 밀렵꾼 +### Very Angry -Glue -접착제 -The glue attaches to your legs as you try to move through! -움직이려고 할 때 접착제가 다리에 붙습니다! -The glue slows you down! -접착제로 인해 속도가 느려집니다! -The glue slows you down! (-DamageDealt SP) -접착제로 인해 속도가 느려집니다! (-DamageDealt SP) +Surprise! +서프라이즈! +### Fierce Debater -Firebolt -파이어볼트 -Elemental's Firebolt -엘리멘탈의 파이어볼트 -Elemental's Gust -정령의 돌풍 -A ball of flame that does DamageDealt damage. -DamageDealt 피해를 주는 화염구입니다. -You a hurl a firebolt! -당신은 firebolt를 던져! -Choose aim direction -조준 방향 선택 +Angels +천사 +Demons +악마 -Windblast -돌풍 -Three puffs of wind that do DamageDealt pressure damage, stun briefly, and push targets back. -DamageDealt 압력 피해를 입히고 잠시 기절시키고 대상을 뒤로 밀어내는 세 번의 바람 불어넣기. -You press your wrists together and conjure a blast of wind! -당신은 두 손목을 함께 누르고 바람의 돌풍을 불러일으킨다! -Choose aim direction -조준 방향 선택 +You sense that the chest contains a trap and a lot of gold. +상자에 덫과 많은 금이 들어 있는 것이 느껴집니다. +You sense that the chest is safe to open. +상자를 열어도 안전하다는 느낌이 듭니다. -Knife -칼 -Throw one of your knives DamageDealt damage. Lands in the target's tile, but is recoverable afterward. -칼 중 하나를 던져 DamageDealt 데미지를 줍니다. 대상 타일에 착지하지만 나중에 복구할 수 있습니다. -You a throw a knife! -당신은 칼을 던져! -Choose aim direction -조준 방향 선택 +### Drink -Shadow Dagger -섀도우 대거 -A cold shadowy blade that deals DamageDealt damage and pierces all in its path. -DamageDealt 피해를 입히고 경로에 있는 모든 것을 관통하는 차갑고 어두운 칼날입니다. -You a hurl a shadowy dagger! -어둠의 단검을 던지십시오! -Choose aim direction -조준 방향 선택 +Bottle +병 +### You have no restraints to 'offer' to the goddess. -Shadow Slash -그림자 베기 -Shadow Scythe -그림자 낫 -Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. -앞 지역을 가르고 해당 지역에 지연된 DamageDealt 피해를 입히고 잠시 느려지게 합니다. -You create a tear in space with your finger! -당신은 당신의 손가락으로 공간에 눈물을 만듭니다! -Choose aim direction -조준 방향 선택 +### This shrine's mana pool is empty. -Portal -문 -Teleport to a nearby location (including into darkness) with twice the range. -범위가 두 배인 가까운 위치(어둠 속 포함)로 텔레포트합니다. -You call upon a misty portal to transport you! -당신은 당신을 수송하기 위해 안개 낀 포털을 호출합니다! -Choose target location -대상 위치 선택 +You drink from the pool and and absorb its energies. +당신은 수영장에서 물을 마시고 그 에너지를 흡수합니다. +You absorb the pool's energies through your face. +당신은 당신의 얼굴을 통해 웅덩이의 에너지를 흡수합니다. +You collect what mana you can in a bottle. +병에 최대한 마나를 모을 수 있습니다. +You drink from the pool and your mana is restored. +수영장에서 물을 마시면 마나가 회복됩니다. +You drink again, but you feel as if you are trespassing. +또 마시지만 무단 침입한 것 같은 느낌이 듭니다. +You drink again, knowing the risk this may entail... +이것이 수반할 수 있는 위험을 알면서 또 마십니다... +You have angered the goddess of TYPE!!! +타입의 여신님을 화나게 하셨습니다!!! +The slime washes off in the fountain!!! +점액이 샘물에 씻겨내려갔어!!! +### The goddess of TYPE is enraged and curses you with a divine punishment! (+RESTRAINT) -Blink -깜박거리다 -Instantly teleport to a location you can see. -보이는 위치로 순간이동합니다. -You teleport! -당신은 텔레포트! -Choose target location -대상 위치 선택 +The goddess offers a ItemTraded for ItemCost (NumCurrent/NumMax) +여신은 ItemCost (NumCurrent/NumMax)에 대해 ItemTraded 를 제공합니다. +Next Offer +다음 제안 +### Buy (press right) -Ice Shard -얼음 조각 -A shard of ice that does DamageDealt damage and slows for Duration turns. Freezes if already slowed or drenched. -DamageDealt 피해를 입히고 지속 시간 동안 느려지는 얼음 조각입니다. 이미 느려지거나 흠뻑 젖으면 멈춥니다. -You a hurl a shard of ice! -당신은 얼음 조각을 던집니다! -Choose aim direction -조준 방향 선택 +Cost: ItemCostgp +비용: ItemCostgp +### Owned: AMNT -Ice Lance -얼음창 -A quick-moving shard of ice that does DamageDealt damage and slows for Duration turns and passes through enemies. Freezes if already slowed or drenched. -빠르게 움직이는 얼음 조각으로 DamageDealt 피해를 입히고 지속 시간 동안 둔화되며 적을 통과합니다. 이미 둔화되거나 흠뻑 젖으면 얼어붙습니다. -You conjure a mighty spear of ice and hurl it forward! -당신은 강력한 얼음 창을 불러내어 앞으로 던집니다! -Choose aim direction -조준 방향 선택 +You climb down to the next level +당신은 다음 단계로 내려갑니다 -Snowball -스노볼 -A fast orb that leaves behind a frigid cloud of ice. Enemies walking in the cloud take DamageDealt ice damage per tile and are slowed. -차가운 얼음 구름을 남기는 빠른 보주입니다. 구름 속을 걷는 적들은 타일당 DamageDealt 얼음 피해를 입고 느려집니다. -You a hurl a snowy blast! -당신은 눈보라를 던집니다! -Choose aim direction -조준 방향 선택 +Level RestraintLevel (Rarity) +Level RestraintLevel(Rarity) -Winterblast -윈터블래스트 -A piercing orb that leaves a trail of ice. Deals DamageDealt ice damage to enemies hit. -얼음의 흔적을 남기는 꿰뚫는 보주. 적중한 적에게 DamageDealt 얼음 피해를 입힙니다. -You a hurl a frigid orb! -당신은 차가운 구를 던집니다! -Choose aim direction -조준 방향 선택 -Freeze -얼다 -Freeze an adjacent target for Duration turns. -지속 시간 동안 인접한 대상을 얼립니다. -You utter dark words of ice-cold truths. -당신은 얼음처럼 차가운 진실의 어두운 말을 합니다. -Choose a target to freeze -고정할 대상 선택 +### All -Flash Frost -플래시 프로스트 -Deal DamageDealt ice damage in a 3x3 area. Drenched creatures are frozen for 8 turns. -피해 입히기3x3 지역에 얼음 피해를 입힙니다. 흠뻑 젖은 생명체는 8턴 동안 얼어붙습니다. -You recite a frigid poem... -당신은 차가운 시를 낭송합니다... -Choose a 3x3 area to freeze -고정할 3x3 영역 선택 +Consumable +소모품 +Worn +갖추어 준 +Weapons +무기 +Outfits +복장 +### Restraints -Shatter -파편 -Shatter -파편 -When a frozen target thaws or dies, deals DamageDealt ice damage to nearby targets and slow for 4 turns.. -얼어붙은 대상이 녹거나 죽으면 주변 대상에게 DamageDealt 얼음 피해를 입히고 4턴 동안 둔화시킵니다.. - -Ignite -점화 -Ignite -점화 -Ignite a friendly target for Duration turns, dealing DamageDealt fire damage per turn to it and nearby targets. -지속 시간 동안 아군 대상을 불태워 대상과 주변 대상에게 매 턴마다 DamageDealt 화염 피해를 입힙니다. -You spin in a circle, inscribing flames with your feet! -당신은 발로 불꽃을 새기면서 원을 그리며 돌고 있습니다! -Choose a friendly target to ignite -발화할 아군 대상 선택 +Miscellaneous +여러 가지 잡다한 +### Armor -Conjure Chain -사슬을 창조하다 -Magic Chain -매직 체인 -Witch's Chain -마녀의 사슬 -Throws a chain that does DamageDealt chain damage. Targets with 50% or more binding take 50 crush damage and are slowed for 4 turns. -DamageDealt 체인 데미지를 주는 체인을 던집니다. 바인딩이 50% 이상인 대상은 50의 크러쉬 데미지를 받고 4턴 동안 둔화됩니다. -You a hurl a strand of chain! -당신은 체인의 가닥을 던져! -Choose aim direction -조준 방향 선택 +The terrain makes noise as you rush across it... +지형은 당신이 그것을 가로질러 돌진할 때 소리를 냅니다... -Conjure Ropes -밧줄을 불러내다 -Animated Rope -애니메이션 로프 -Launch 3 ropes that deal DamageDealt chain damage each and add 22 rope binding. -각각 DamageDealt 체인 데미지를 주는 3개의 로프를 발사하고 22개의 로프 바인딩을 추가합니다. -You animate a bunch of ropes! -당신은 많은 밧줄을 애니메이션! -Choose aim direction -조준 방향 선택 +You can't reach the cuffs on your elbows, the chain is too short... +팔꿈치의 수갑에 닿을 수 없습니다. 체인이 너무 짧습니다... +You contort your arms trying to reach the cuffs on your elbows, to no avail... +팔꿈치의 소맷부리에 닿으려고 팔을 비틀어 봤지만 소용이 없었습니다... +Your elbows are kept together by the elbow cuffs, and you can't reach them. +당신의 팔꿈치는 팔꿈치 커프스로 함께 유지되며 닿을 수 없습니다. -Steel Torrent -스틸 토렌트 -Steel Rain -강철비 -The plug hits you! (DamageDealt) -플러그가 당신을 때립니다! (DamageDealt) -The plug directs itself between your legs! -플러그가 다리 사이로 향합니다! -Fire 4 Steel Rain in quick succession toward the target point. Best in open spaces. -목표 지점을 향해 빠르게 연속적으로 4개의 강철비를 발사합니다. 개방된 공간에서 최고입니다. -Fires a steel plug that deals DamageDealt piercing damage. Bound targets are Plugged, which increases Distraction over time. -DamageDealt 관통 피해를 주는 강철 플러그를 발사합니다. 묶인 대상은 연결되어 시간이 지남에 따라 산만함이 증가합니다. -You raise your hand and a steel projectile appears! -손을 들면 강철 발사체가 나타납니다! -You raise your hand and several steel projectiles appear! -손을 들면 여러 개의 강철 발사체가 나타납니다! -Choose aim direction -조준 방향 선택 -Choose target point -목표 지점 선택 -Bola -그녀는 -Restraining Device -구속 장치 -The thrown restraining device latches onto you as you struggle to get it off!!! -던져진 구속 장치는 당신이 그것을 내리기 위해 고군분투하는 동안 당신에게 걸쇠가 걸립니다!!! -The restraining device wraps many elastic cables around you!!! -구속 장치는 당신 주위에 많은 탄성 케이블을 감쌉니다!!! +The strict chain on the cuffs keeps you from reaching them easily. +소맷부리의 엄격한 체인으로 인해 쉽게 손이 닿지 않습니다. +The cuffs limit your range of motion, making it harder to remove them. +수갑은 운동 범위를 제한하여 제거하기 어렵게 만듭니다. +It's hard to take off the cuffs with your wrists linked together... +손목이 묶인 채 수갑 풀기가 힘들어... -Bola -그녀는 -Choose aim direction -조준 방향 선택 -You throw a bola! -당신은 볼라를 던집니다! -You ready a bola! -당신은 볼라를 준비했습니다! -You are feeling drowsy... -졸리시죠... +You feel drained of energy... +기력이 고갈된 느낌... +Your collar tingles and suddenly you feel weaker... +당신의 옷깃이 간지럽고 갑자기 약해집니다... +Your collar drains your energy as you struggle... +고군분투할 때 옷깃이 에너지를 소모합니다... -Shadow Strike -섀도우 스트라이크 -Shadow Heel -섀도우 힐 -Runic Ward -룬 와드 -Gives yourself or a creature a magic shield for 50 turns, granting +30 Magic Armor. -자신이나 생물에게 50턴 동안 마법 보호막을 부여하여 +30 마법 갑옷을 부여합니다. -You whisper a word of protection! -당신은 보호의 말을 속삭입니다! -Choose creature to shield -보호할 생물 선택 +The rope between your legs keeps the toy secure... +다리 사이의 밧줄이 장난감을 안전하게 지켜줍니다... +Try as you might, the toy is held in place tight. +노력해 보세요. 장난감이 제자리에 단단히 고정되어 있습니다. +The toy won't wiggle loose. It's kept in place by your restraints. +장난감이 흔들리지 않습니다. 당신의 구속으로 제자리에 고정됩니다. -Afterimage -잔상 -Massively increases a creature's evasion for 5 attacks. Expires after 25 turns. -5회 공격에 대한 생물의 회피를 크게 증가시킵니다. 25턴 후에 만료됩니다. -Your movements intensify! -움직임이 격렬해집니다! -Choose creature to buff -강화할 생물 선택 +Your catsuit adheres to latex, making struggling more difficult! +당신의 캣슈트는 라텍스에 달라붙어 투쟁을 더 ​​어렵게 만듭니다! +The item sticks to your rubber catsuit, making it harder to pull off... +아이템이 고무 캣슈트에 달라붙어 벗기가 더 어려워집니다... +The item hugs your catsuit tightly, adhering firmly! +당신의 캣수트를 쫀쫀하게 감싸주는 아이템! -Magical Sight -마법의 시력 -Highlight the location of interesting magical phenomena for 20 turns -20턴 동안 흥미로운 마법 현상의 위치를 ​​강조 표시 -You analyze the target! -당신은 대상을 분석! -Choose object to analyze -분석할 객체 선택 -Barrier Runes -배리어 룬 -Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns, but doesn't block movement. -DelayTime 턴 동안 발사체의 BlockAmount 손상을 차단하지만 움직임을 차단하지는 않는 1x1 장벽 모놀리스 필드를 생성합니다. -You raise a field of runes with a command word! -당신은 명령어로 룬 필드를 올립니다! -Choose barrier location -장벽 위치 선택 +### Your RSTRN holds you securely, making your struggling ineffectual... -Electric Field -전기장 -Creates a conductive area for Duration turns. Makes all entities in the area Conductive, forcing them to share 50% electric damage. -지속 시간 동안 전도성 영역을 생성합니다. 해당 영역의 모든 엔티티를 전도성으로 만들어 50%의 전기 손상을 공유하도록 합니다. -You energize the targeted area! -목표 지역에 활력을 불어넣습니다! -Choose target 3x3 area -대상 3x3 영역 선택 +### Your RSTRN holds you tight, making it harder to move... -Witch's Electricity -마녀의 전기 -Witch's Electric Orb -마녀의 전기구 -Witch's Electric Burst -마녀의 일렉트릭 버스트 +### Your RSTRN keeps you tied tight, making it harder to escape... -Electrify -깜짝 놀라게 하다 -A delayed shock that deals DamageDealt damage and stuns for Duration turns. -DamageDealt 피해를 입히고 Duration 턴 동안 기절시키는 지연된 충격입니다. -You charge up a burst of electricty! -당신은 전기의 버스트를 충전! -Choose target location -대상 위치 선택 +### The bright light weakens the shadow hands! -The elemental channels the force of the storm! -정령이 폭풍의 힘을 전달합니다! +You hear an ominous click, but nothing seems to happen. Looks like a misfire! +불길한 딸깍 소리가 들리지만 아무 일도 일어나지 않는 것 같습니다. 실화인 것 같습니다! -Fireball -화구 -A slow moving ball of flame that explodes for 120 fire damage to the target and DamageDealt damage to surrounding enemies. -느리게 움직이는 화염구가 폭발하여 대상에게 120의 화염 피해를 주고 주변 적에게 피해를 입힙니다. -You a hurl a fireball! -당신은 불덩어리를 던져! -Choose aim direction -조준 방향 선택 -Incinerate -태워서 재로 만들다 -A tornado of flame that does DamageDealt damage per turn for LifeTime turns. -LifeTime 턴마다 DamageDealt 데미지를 주는 화염의 토네이도입니다. -You conjure a gout of flame! -당신은 화염의 통풍을 요술! -Choose target AoE location -대상 AoE 위치 선택 +Barrel Trap +배럴 트랩 +A booby-trapped barrel with a spring-loaded lid designed to trap you inside! +당신을 안에 가두도록 설계된 용수철이 달린 뚜껑이 있는 부비 트랩 배럴! +You can push the lid off with enough force... +충분한 힘으로 뚜껑을 밀어낼 수 있습니다... +The lid of the barrel suddenly snaps shut as you hide inside!!! +당신이 안에 숨어 있을 때 배럴의 뚜껑이 갑자기 닫힙니다!!! -Hailstorm -우박 폭풍 -A cloud of falling ice that does DamageDealt damage per turn for LifeTime turns and slows. -평생 동안 매 턴마다 DamageDealt 피해를 입히고 느려지게 하는 떨어지는 얼음 구름입니다. -You conjure a flurry of frost! -당신은 서리의 폭풍을 불러일으킵니다! -Choose target AoE location -대상 AoE 위치 선택 -Raincloud -비구름 -After 3 turns, rain falls, creating a 3x3 grid of water and dealing DamageDealt acid damage to enemies within. -3턴 후에 비가 내려 3x3 물 격자를 만들고 DamageDealt 산성 피해를 내부의 적에게 입힙니다. -You create a stormy cloud! -당신은 폭풍우 구름을 만듭니다! -Choose target AoE location -대상 AoE 위치 선택 -Field of Frost -프로스트 필드 -Freezes a 5x5 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. -5x5 영역을 얼립니다(얼음은 개체를 느리게 합니다). 해당 지역의 적들은 라이프타임 턴 동안 매 턴마다 DamageDealt 데미지를 입습니다. -You stomp your foot and call forth the storm! -당신은 발을 구르고 폭풍을 부릅니다! -Choose target AoE location (5x5) -대상 AoE 위치 선택(5x5) -Healing Light -치유의 빛 -Channel to heal 15 hitpoints per turn to summoned allies within a 5x5 area. -정신집중 하여 5x5 영역 내의 소환된 아군의 체력을 턴당 15씩 치료합니다. -You conjure a healing light! -당신은 치유의 빛을 불러일으킵니다! -Choose target AoE location (5x5) -대상 AoE 위치 선택(5x5) +### Sarcophagus -Crackle -크랙클 -Stun Blast -스턴 블래스트 -Storm Bolt -스톰 볼트 -A bolt of lightning that does DamageDealt electric damage to enemies in a 4-range line and briefly stuns. -피해를 입히는 번개 화살4 범위의 적에게 전기 피해를 주고 잠시 기절시킵니다. -Lightning erupts from your fingertips! -손끝에서 번개가 칩니다! -Choose line direction (max range 4 tiles) -선 방향 선택(최대 범위 4타일) +### A glass-walled chamber sealed with enchanting magic. -Tremor -떨림 -Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. -지속 시간 동안 대상 지역의 적을 취약하고 느리게 만들고 DamageDealt 크러시 피해를 입힙니다. -You call forth the rage of the earth. -당신은 땅의 분노를 불러일으킵니다. -Choose AoE -광역 선택 +### Time feels like it's going by quickly outside... -Earthquake -지진 -Channel for 5 turns to send 2 tremors per turn in target area. -5턴 동안 정신을 집중하여 대상 지역에 턴당 2번의 떨림을 보냅니다. -You channel the fury of the earth!!! -당신은 대지의 분노를 전달합니다!!! -Choose AoE -광역 선택 +### Metal Cage -Shock Orb -쇼크 오브 -Shock Orb -쇼크 오브 -A slow-moving orb that deals DamageDealt electric damage to an adjacent enemy each turn. -매 턴 인접한 적에게 피해를 입히는 느리게 움직이는 구체입니다. -You hurl a charged orb! -충전된 구를 던집니다! -Choose aim direction (max range 4 tiles) -조준 방향 선택(최대 범위 4타일) +### A metal cage with rigid bars, too narrow to put your head through. -Lightning Rune -번개의 룬 -Lightning Rune -번개의 룬 -A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 5 turns to setup. -DamageDealt 전기 피해를 입히고 4턴 동안 기절시키는 함정입니다. 설정에 5턴이 걸립니다. -You conjure a charged trap! -당신은 충전된 함정을 불러냅니다! -Choose location for trap -트랩 위치 선택 +### Made for a pretty toy like you~ -Freeze Rune -프리즈 룬 -Freeze Rune -프리즈 룬 -A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 5 turns to setup. -DamageDealt 얼음 피해를 입히고 30턴 동안 동결시키는 함정입니다. 설정에 5턴이 걸립니다. -You conjure an icy trap! -당신은 얼음 덫을 사용합니다! -Choose location for trap -트랩 위치 선택 +Display Stand +디스플레이 스탠드 +A display stand, fit for only the prettiest of trophies! +가장 예쁜 트로피만 올려놓을 수 있는 진열대! +Your arms are pinned behind your back and you can barely move! +팔이 등 뒤로 고정되어 거의 움직일 수 없습니다! +You hear a click as the door shuts behind you... +뒤에서 문이 닫힐 때 딸깍하는 소리가 들립니다... +### The display stand suddenly locks into place around you! -Flame Rune -화염의 룬 -Flame Rune -화염의 룬 -A trap that deals DamageDealt fire damage in an area. Takes 5 turns to setup. -지역에 피해를 입히는 덫입니다.화염 피해를 입힙니다. 설정에 5턴이 걸립니다. -You conjure an incendiary trap! -당신은 소이 함정을 요술! -Choose location for trap -트랩 위치 선택 +### Doll Stand +### A mobile display stand for dolls to keep them in place. -Static Sphere -정적 구체 -Static Sphere -정적 구체 -Conjure a sphere for Duration turns that makes nearby entities Conductive and each turn deals DamageDealt electric damage to one of them. -근처의 엔티티를 전도성으로 만드는 지속 시간 동안 구체를 생성하고 각 턴마다 그들 중 하나에게 DamageDealt 전기 손상을 입힙니다. -You summon a grey, featureless sphere adorned by static! -당신은 정전기로 장식된 회색의 특징 없는 구체를 소환합니다! -You summon a grey, featureless sphere adorned by static! -당신은 정전기로 장식된 회색의 특징 없는 구체를 소환합니다! -Choose sphere location -구체 위치 선택 +### As long as it's... inserted, you won't be going anywhere! +### One Bar Prison -Fissure -열구 -Lava Fissure -용암 균열 -A great fissure erupts from the earth, dealing 70 fire damage to enemies in a 4-range line and dealing 15 damage/turn for 6 turns. -대지에서 큰 균열이 발생하여 4범위 범위의 적에게 70의 화염 피해를 주고 6턴 동안 턴당 15의 피해를 줍니다. -You stomp the ground and the earth opens its gaping maw! -당신이 땅을 밟으면 땅이 입을 벌립니다! -Choose line direction (max range 4 tiles) -선 방향 선택(최대 범위 4타일) +### A devious way to immobilize people. -Lightning Bolt -번갯불 -A bolt of lightning that does DamageDealt damage to enemies in an infinite line and briefly stuns. -무한 선상에 있는 적에게 피해를 입히고 잠시 기절시키는 번개 화살. -You unleash a bolt of lightning! -당신은 번개를 발사합니다! -Choose line direction -선 방향 선택 +### Metal Stand -Corona -코로나 -Corona -코로나 -Binding Light -결속의 빛 -Binding Light -결속의 빛 -Chaos Beam -카오스 빔 -Mystic Beam -미스틱 빔 -A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt fire damage to the first target hit. -2턴 동안 채널링(잠시 기절)하는 광선이 첫 번째 적중한 대상에게 즉시 DamageDealt 화염 피해를 입힙니다. -You charge a powerful beam attack!!! -당신은 강력한 빔 공격을 돌진!!! -Choose line direction -선 방향 선택 +### As long as it's locked around you, you won't be going anywhere! -Icicles -고드름 -Icicle -고드름 -Channel 3 turns to fire 3 icicles that deal DamageDealt ice damage and slow for 4 turns, freezing slowed/drenched targets for 3 turns. -채널 3턴은 DamageDealt 얼음 피해를 입히고 4턴 동안 느려지게 하는 3개의 고드름을 발사하여 3턴 동안 느려지거나 흠뻑 젖은 대상을 얼립니다. -You raise a hand and icicles fly forward! -손을 들면 고드름이 앞으로 날아갑니다! -Choose line direction -선 방향 선택 -Volcanism -화산 활동 -An area of summoned rocks becomes explosive. Deal fire damage to them to ignite, dealing DamageDealt fire damage to adjacent targets. -소환된 바위 지역이 폭발합니다. 화염 피해를 가해 불을 붙이고 인접한 대상에게 피해를 입히는 화염 피해를 입힙니다. -You stomp your foot and magma wells up beneath the ground! -발을 구르면 땅 밑에서 마그마가 솟아오릅니다! -Choose monoliths to enchant -인챈트할 모노리스 선택 +### As long as it's attached, you won't be going anywhere! +You're not fooling anyone... +당신은 아무도 속이지 않습니다 ... +You might be able to fool someone like this... +이런 식으로 사람을 속일 수 있을지도... +You look like you're right at home! +당신은 당신이 바로 집에 있는 것 처럼 보인다! -Coalesce -합체 -Gathers slime and slimed enemies into a central point. Deals DamageDealt glue damage per square of slime and Encases slimed enemies. Costs half mana if there is only slime. -슬라임과 슬라임된 적을 중앙 지점으로 모읍니다. 슬라임 평방당 DamageDealt 접착제 피해를 입히고 슬라임된 적을 둘러쌉니다. 슬라임만 있는 경우 마나가 절반으로 소모됩니다. -You command the slime to draw enemies in! -당신은 슬라임을 명령하여 적을 끌어들입니다! -Choose area containing slime -슬라임이 있는 지역 선택 -Animate Slime -슬라임 움직이기 -Summons up to 3 slimes on slime tiles in an AoE. The slimes are friendly to you. -AoE의 슬라임 타일에서 최대 3개의 슬라임을 소환합니다. 슬라임은 당신에게 우호적입니다. -You concentrate magical energy into the slime, giving it a will of it's own... -당신은 슬라임에 마법의 에너지를 집중시켜 스스로의 의지를 부여합니다... -Choose area containing slime -슬라임이 있는 지역 선택 +Restraining Bed +억제 침대 +A bed with a booby trap designed to trap you on top of it! +당신을 그 위에 가두도록 설계된 부비 트랩이 있는 침대! +You have to get out somehow... +어떻게든 나가야지... +Belts emerge from underneath the bed and wrap around you, strapping you down tightly! +벨트가 침대 밑에서 나와 몸을 감싸며 몸을 단단히 묶습니다! -Animate Large Slime -큰 슬라임 움직이기 -Target an area with at least 3 slime tiles. Summons a large slime that is friendly to you. -슬라임 타일이 3개 이상 있는 지역을 목표로 삼으세요. 당신에게 친숙한 대형 슬라임을 소환합니다. -You concentrate magical energy into the slime, giving it a will of it's own... -당신은 슬라임에 마법의 에너지를 집중시켜 스스로의 의지를 부여합니다... -Choose area containing slime -슬라임이 있는 지역 선택 -Latex Puppet -라텍스 인형 -Target an area containing helpless encased enemies. Transforms up to 3 of them into latex dolls that serve you for a while. -밀폐된 무기력한 적들이 있는 지역을 목표로 삼으세요. 최대 3마리를 한동안 당신을 섬기는 라텍스 인형으로 변신시킵니다. -You concentrate magical energy into your victim's bindings, forcing them to move... -피해자의 속박에 마법 에너지를 집중시켜 강제로 움직이게 합니다... -Choose area containing encased helpless enemies. -갇힌 무기력한 적이 있는 지역을 선택합니다. +Binding Dress +바인딩 드레스 +It's a devious dress! I hope your elbows are flexible~ +사악한 드레스야! 팔꿈치가 유연했으면 좋겠어~ +### So many laces! It would take quite a while to put this on normally. That's what magic is for! -Solidify -굳히다 -Solidifies slime in the area into Latex. Latex adheres to enemies and slowly binds them, escasing them when they are fully bound. -지역의 점액을 라텍스로 굳힙니다. 라텍스는 적에게 달라붙어 천천히 묶고, 완전히 묶였을 때 탈출합니다. -You inscribe a transmutation circle on the floor. -바닥에 변환 원을 새겼습니다. -Choose area containing slime -슬라임이 있는 지역 선택 +Ornamental Corset +장식용 코르셋 +Your figure looks gorgeous in this~ +이거 보니 몸매가 멋져요~ +It's so tight you won't be able to undo the laces yourself, dear! +너무 빡빡해서 스스로 끈을 풀 수 없을 거예요, 얘야! -Slime Repulsion -슬라임 반발 -Gain +50 glue resist. -글루 저항 +50을 얻습니다. -Spread -확산 -Slime in the target area expands by 1 unit in the four cardinal directions. Refreshes duration to 12-20 turns. -대상 지역의 슬라임은 사방으로 1단위 확장됩니다. 지속 시간이 12~20턴으로 갱신됩니다. -The slime spreads! -슬라임이 퍼진다! -Choose area containing slime -슬라임이 있는 지역 선택 +Fancy Ball Gag +멋진 볼 개그 +A cute ball gag that fills your mouth right up! +입이 떡 벌어지는 귀여운 볼개그! +What's this? it seems to have a magic spell protecting it from harm! +이게 뭐야? 위험으로부터 지켜주는 마법이 있는 것 같아! +Fancy Muzzle +멋진 총구 +A muzzle to keep you from spitting out what's underneath. +아래에 있는 것을 뱉어내지 못하게 하는 총구. +Sorry dear, there's a mystic seal on there to keep it on nice and tight. +미안해, 얘야, 거기에 신비의 봉인이 있어 그것을 단단하고 단단하게 고정할 수 있어. -Wall of Slime -슬라임의 벽 -Unlocks horizontal and vertical slime walls that traps enemies who try to pass through. -통과하려는 적을 가두는 수평 및 수직 슬라임 벽을 잠금 해제합니다. -Wall of Slime (Vert) -슬라임 벽(수직) -Creates a vertical wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. -20턴 동안 슬라임의 수직 벽을 생성합니다. 통과하는 적들은 벽에 갇히고 슬라임이 됩니다. -You tap your foot and a wall of slime slowly raises out of the ground. -발을 두드리면 슬라임 벽이 천천히 땅에서 올라옵니다. -Choose vertical wall origin (5 tiles high) -수직 벽 원점 선택(5타일 높이) +### Ornamental Dress -Wall of Slime (Horiz) -슬라임의 벽(Horiz) -Creates a horizontal wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. -20턴 동안 수평으로 슬라임 벽을 생성합니다. 통과하는 적들은 벽에 갇히고 슬라임이 됩니다. -You tap your foot and a wall of slime slowly raises out of the ground. -발을 두드리면 슬라임 벽이 천천히 땅에서 올라옵니다. -Choose horizontal wall origin (5 tiles wide) -수평 벽 원점 선택(폭 5타일) +A devious dress that forces the arms into an elbows-touching position. +팔꿈치가 닿는 위치로 팔을 강요하는 교활한 드레스. +It is extremely strict but it is only fabric. The lacing is intricate and will take a long time to remove. +매우 엄격하지만 천일 뿐입니다. 끈이 복잡하고 제거하는 데 시간이 오래 걸립니다. -Wall of Latex -라텍스 벽 -Unlocks horizontal and vertical latex walls that encase enemies that walk through. -걸어가는 적을 둘러싸는 수평 및 수직 라텍스 벽을 잠금 해제합니다. -Wall of Latex (Vert) -라텍스 벽(Vert) -Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased, take DamageDealt glue damage if not encased, and blinded. -20턴 동안 수직의 라텍스 벽을 생성합니다. 통과하는 적은 둘러싸이고, 둘러싸이지 않으면 DamageDealt 접착제 피해를 입고 눈이 멀게 됩니다. -You tap your foot and a wall of latex stretches out across the corridor. -발을 두드리면 라텍스 벽이 복도를 가로질러 뻗어 있습니다. -Choose vertical wall origin (5 tiles high) -수직 벽 원점 선택(5타일 높이) +Ornamental Gag +장식 개그 +### A gag meant to keep servants of the Resurrection Temple quiet by forcing a plug into their mouth. -Wall of Latex (Horiz) -라텍스 벽(Horiz) -Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased, take DamageDealt glue damage if not encased, and blinded. -20턴 동안 수평의 라텍스 벽을 생성합니다. 통과하는 적은 둘러싸이고, 둘러싸이지 않으면 DamageDealt 접착제 피해를 입고 눈이 멀게 됩니다. -You tap your foot and a wall of latex stretches out across the corridor. -발을 두드리면 라텍스 벽이 복도를 가로질러 뻗어 있습니다. -Choose horizontal wall origin (5 tiles wide) -수평 벽 원점 선택(폭 5타일) +It is difficult to pull off and though it is made from white leather, a magic enchantment protects it from cutting. +벗기기 힘들고 흰색 가죽으로 만들어졌지만 마법의 마법이 걸려 있어 잘리지 않는다. -Earthshape -지구 모양 -Unlocks 3 spells that allow creating mounds, rings, or lines of 50hp, 25 armor rocks. -50hp의 마운드, 고리 또는 선, 25개의 갑옷 바위를 생성할 수 있는 3가지 주문을 잠금 해제합니다. -Earthen monoliths rise from the ground! -흙 기둥이 땅에서 솟아오른다! -An earthen monolith rises from the ground! -흙 기둥이 땅에서 솟아오른다! -Earthshape (Ring) -어스셰이프(반지) -Create a large ring of Earthen Monoliths. They have 50 hitpoints and 25 armor. -거대한 대지 기둥 고리를 만듭니다. 그들은 50의 체력과 25의 방어력을 가지고 있습니다. -You stomp your foot and monoliths emerge in a ring around you! -발을 구르면 돌기둥이 주변에 고리 모양으로 나타납니다! -Choose ring origin -벨소리 출처 선택 +Panel Plug Gag +패널 플러그 개그 +### A gag meant to keep people quiet by forcing a plug into their mouth. -Earthshape (Mound) -Earthshape (마운드) -Create a 3x3 field of Earthen Monoliths. They have 50 hitpoints and 25 armor. -Earthen Monoliths의 3x3 필드를 만듭니다. 그들은 50의 체력과 25의 방어력을 가지고 있습니다. -You stomp your foot and monoliths emerge from the ground! -발을 구르면 땅에서 모놀리스가 나타납니다! -Choose mound origin -마운드 원점 선택 +It is difficult to pull off and though it is made from supple, heavy duty leather. +부드럽고 튼튼한 가죽으로 만들어졌음에도 불구하고 떼어내기가 어렵습니다. -Earthshape (Line) -지구 모양(선) -Create a 4-tile line of Earthen Monoliths. They have 50 hitpoints and 25 armor. -4타일 라인의 대지 기둥을 만듭니다. 그들은 50의 체력과 25의 방어력을 가지고 있습니다. -You stomp your foot and monoliths emerge from the ground! -발을 구르면 땅에서 모놀리스가 나타납니다! -Choose line direction -선 방향 선택 -Rock -바위 -Rock -바위 -Channel 1 turn to launch a rock that deals DamageDealt crush damage and slows for 4 turns. Blocks up to 80 damage. -채널 1턴은 DamageDealt 크러쉬 데미지를 입히고 4턴 동안 둔화시키는 바위를 발사합니다. 최대 80의 피해를 차단합니다. -You raise a stone from the ground and kick it forward! -당신은 땅에서 돌을 들어 앞으로 차! -Choose line direction -선 방향 선택 +Fuuka's Collar +후우카의 목걸이 +A collar enchanted with ghastly energy. +끔찍한 기운이 깃든 목걸이. +It seems to react with a pulse of energy whenever a nearby enemy is defeated. +근처의 적이 쓰러질 때마다 에너지의 파동으로 반응하는 것 같습니다. +Your collar pulses, and a revenant appears to avenge the enemy you defeated! +당신의 목걸이가 맥동하고, 당신이 쓰러뜨린 적에게 복수하기 위해 레버넌트가 나타납니다! -Earth Kick -어스 킥 -Stone Projectile -돌 발사체 -Kick a summoned rock to turn it into a projectile. Deals DamageDealt crush damage in a 3x3 area and slows for 4 turns. -소환된 돌을 발로 차면 발사체로 변합니다. 3x3 지역에 피해를 입히고 4턴 동안 둔화시킵니다. -With a solid kick, you launch one of your monoliths forward! -단단한 킥으로 모놀리스 중 하나를 앞으로 발사합니다! -Choose a monolith to kick -킥할 모노리스를 선택하십시오 -Boulder -둥근 돌 -Boulder -둥근 돌 -Channel 1 turn to launch a huge slow rock that deals DamageDealt crush damage and slows for 8 turns. AoE, collides with summoned rocks. Blocks up to 200 damage. -DamageDealt 크러쉬 데미지를 입히고 8턴 동안 둔화시키는 거대한 슬로우 록을 발사하는 채널 1턴. AoE, 소환된 록과 충돌합니다. 최대 200 데미지를 차단합니다. -You raise a massive boulder from the ground and kick it forward! -당신은 땅에서 거대한 바위를 들어올려 앞으로 차버립니다! -Choose line direction -선 방향 선택 +### Fuuka's Pet Collar +### A collar enchanted with beneficial ghastly energy. -Stamina Up I -스태미나 업 I -Increases maximum SP by 12 -최대 SP 12 증가 +### Your collar pulses, and a revenant appears to assist you! -Iron Will -불굴의 의지 -While you have 100 willpower or more, regain an additional 4 stamina per turn. -의지력이 100 이상일 때 매 턴 스태미나를 추가로 4 회복합니다. -Athlete -운동 선수 -Sprinting costs 40% less stamina. -전력질주 시 스태미나 소모가 40% 감소합니다. -Sneaky -운동화 -You are harder to see when waiting. -기다릴 때 더 보기 힘들어. -Dodge I -닷지 I -+10% evasion -+10% 회피 -Dodge II -닷지 II -+15% evasion (25 total) -+15% 회피(총 25) -Dodge III -닷지 III -+25% evasion (50 total) -+25% 회피(총 50) -Critical Strike -치명타 -Excess accuracy (over 100%) is converted to bonus physical damage percentage at 50% efficiency. -과도한 정확도(100% 이상)는 50% 효율성에서 추가 물리 피해 비율로 변환됩니다. +Dress Bustier +드레스 뷔스티에 +A deceptively cruel device, making it impossible to reach your nipples. +당신의 유두에 접근하는 것을 불가능하게 만드는 믿을 수 없을 정도로 잔인한 장치. +Reinforced with steel plates, this will need bolt cutters to take off. +철판으로 보강되어 있어 이륙하려면 볼트 커터가 필요합니다. -Brute Force -브루트 포스 -When enabled, your attacks deal 10% of your willpower as additional crush damage but cost 10 more stamina. -활성화되면 공격이 의지력의 10%를 추가 크러쉬 데미지로 처리하지만 스태미나가 10 더 소모됩니다. +### Massagers -One With Slime -점액과 하나 -While standing on slime/latex, you can cast rubber spells without components. -슬라임/라텍스 위에 서 있는 동안 구성 요소 없이 고무 주문을 시전할 수 있습니다. +### A pair of little motion-activated teasers. They trigger when you swing your body for an attack. -Convincing Disguise -설득력있는 변장 -While completely covered in slime and not moving, your visibility is reduced considerably. -완전히 점액으로 뒤덮여 움직이지 않는 동안 시야가 상당히 줄어듭니다. +### They will make for some great fun! Type: Edging -Magical Implements -마법 도구 -While holding a magical weapon like a staff or enchanted knife, your mana costs are reduced by 20%. -지팡이나 마법이 부여된 칼과 같은 마법 무기를 들고 있는 동안 마나 비용이 20% 감소합니다. -Mage Circuits -마법사 회로 -Increases the size of the passive mana pool by +100. -패시브 마나 풀의 크기를 +100 늘립니다. -Archmage -대마법사 -Upcasted spells cost 25% less mana. -업캐스팅된 주문의 마나 비용이 25% 감소합니다. +### Advanced Massagers -Temperature Play -온도 놀이 -Fire and Ice damage do 30% more damage to fully bound enemies. -화염과 얼음 피해는 완전히 속박된 적에게 30% 더 많은 피해를 입힙니다. -Fire Hazard -화재 위험 -Fire damage ignites enemies for 5 damage per turn for 6 turns. -화염 피해가 적을 불태워 6턴 동안 매 턴마다 5의 피해를 줍니다. -Frozen Prison -얼어붙은 감옥 -Freezing an enemy applies 10% of the enemy's max hp in binding, plus 10 per turn of freeze. -적을 얼리면 구속된 적의 최대 HP의 10%에 동결 턴당 10이 적용됩니다. -Lightning Rod -피뢰침 -After casting an Air or Storm spell that costs mana, become Conductive and gain 300% electric resist for 3 turns. -마나를 소모하는 바람 또는 폭풍 주문 시전 후 전도성 상태가 되고 3턴 동안 전기 저항이 300% 증가합니다. -Frustration -좌절 -When enabled, enemies in chastity become angry Frustrated Pets when becoming helpless. -활성화하면 순결한 적이 무기력해질 때 분노한 좌절된 애완 동물이 됩니다. +### A pair of sensitive motion-activated teasers. They trigger when you attack or struggle. -Mana Up I -마나업 I -Increases maximum MP by 12 -최대 MP 12 증가 -Mana Up II -파워 업 II -Increases maximum MP by 12 -최대 MP 12 증가 -Mana Up III -파워 업 III -Increases maximum MP by 12 -최대 MP 12 증가 +### Nipple Weights -Strong Mind I -강한 마음 I -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -최대 혼란이 기본의 33%만큼 증가하고 혼란 재생이 턴당 -0.1씩 증가합니다. -Strong Mind II -강한 마음 II -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -최대 혼란이 기본의 33%만큼 증가하고 혼란 재생이 턴당 -0.1씩 증가합니다. -Strong Mind III -강한 마음 III -Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn -최대 혼란이 기본의 33%만큼 증가하고 혼란 재생이 턴당 -0.1씩 증가합니다. +### A pair of dense weights dangling from your sensitive bits. -Expert Wizard -전문가 마법사 -Gives you an additional spell choice slot -추가 주문 선택 슬롯을 제공합니다. -Master Wizard -마스터 마법사 -Gives you an additional spell choice slot -추가 주문 선택 슬롯을 제공합니다. -Legendary Wizard -전설적인 마법사 -Gives you an additional spell choice slot -추가 주문 선택 슬롯을 제공합니다. +### They tend to swing around when attacking or casting arm spells. -More Summons -더 많은 소환 -Increases the permanent summon cap by +1 (from 2 to 3) -영구 소환 한도를 +1 늘립니다(2에서 3으로). -Many Summons -많은 소환 -Increases the permanent summon cap by +1 (from 3 to 4) -영구 소환 한도를 +1 늘립니다(3에서 4로). +### Hi-Tech Massagers -Bomb -폭탄 -Channel for 1 turn for a bomb that does DamageDealt fire damage in an area after DelayTime turns. -DelayTime 턴 이후 해당 지역에 DamageDealt 화염 피해를 주는 폭탄을 위해 1턴 동안 정신을 집중합니다. -Fire in the hole! -구멍에 발사! -Choose target AoE location -대상 AoE 위치 선택 +### A pair of highly-sensitive motion-activated teasers. They detect most forms of motion, including sprinting and hopping. -Rope Snare -로프 스네어 -An invisible trap on the ground that stuns anyone who walks on it for Duration turns and applies 150 points of binding. -지속 시간 동안 그 위를 걷는 모든 사람을 기절시키고 150점의 바인딩을 적용하는 바닥에 있는 보이지 않는 함정. -You set an invisible trap! -보이지 않는 함정을 설치했습니다! -Select where to put the trap (it will be invisible) -함정을 놓을 위치를 선택합니다(보이지 않음). +Control Harness +컨트롤 하네스 +An advanced harness for controlling high-security prisoners. +보안 수준이 높은 죄수를 통제하기 위한 고급 하네스입니다. +It seems to be made of flexible steel plates. +유연한 철판으로 만들어진 것 같다. -Rope Burst -로프 버스트 -An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 40 points of rope binding. Snares for Duration turns. -로프 폭발은 3x3 AoE에서 DamageDealt 체인 피해를 입히고 40포인트의 로프 바인딩을 적용합니다. 지속 시간에 대한 스네어 턴. -You call forth ropes from the abyss! -당신은 심연에서 밧줄을 불러냅니다! -Select center of a a 3x3 AoE -3x3 AoE의 중심 선택 -Leather Package -가죽 패키지 -After conjuring a leather restraint, you can conjure up to three more without advancing time. -가죽 구속을 창조한 후, 시간을 앞당기지 않고 최대 3개까지 더 창조할 수 있습니다. +### Cyber Collar -Conjure Gag -개그를 불러내다 -Conjured Gag -소환된 개그 -The gag forces itself into your mouth and buckles tightly! -개그가 입으로 들어가 단단히 고정됩니다! -The gag hits you! (DamageDealt) -개그가 당신을 때립니다! (DamageDealt) -Summons a gag which deals DamageDealt chain damage and silences for 15 turns. +40 binding if target is not silenced. -DamageDealt 연쇄 피해를 입히고 15턴 동안 침묵시키는 개그를 소환합니다. 대상이 침묵하지 않으면 +40 구속력이 있습니다. -You conjure a gag! -당신은 개그를 요술! -The gag will appear next to you and fly toward the target point. -개그가 옆에 나타나 목표 지점을 향해 날아갑니다. +### An advanced collar for registering prisoners into the facility network. -Conjure Armbinder -암바인더를 창조하다 -Conjured Armbinder -창조된 팔바인더 -The armbinder slips itself around your arms and buckles itself tightly! -암바인더가 팔 주위로 미끄러지며 단단히 고정됩니다! -The armbinder hits you! (DamageDealt) -암 바인더가 당신을 때립니다! (DamageDealt) -Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Blinded/Silenced targets are silenced/blinded for the same time. -DamageDealt 연쇄 피해를 입히고 13턴 동안 무장을 해제하는 암바인더를 소환합니다. 실명/침묵 상태인 대상은 동시에 침묵/실명 상태가 됩니다. -You conjure a armbinder! -당신은 armbinder를 요술! -The armbinder will appear next to you and fly toward the target point. -암바인더가 옆에 나타나 목표 지점을 향해 날아갑니다. +It seems to be made of flexible steel plates, and it has a high-security lock. +유연한 철판으로 만들어진 것 같고 보안 수준이 높은 잠금 장치가 있습니다. -Conjure Leather Cuffs -Conjure 가죽 커프스 -Conjured Leather Cuffs -창조된 가죽 수갑 -The leather cuffs clasp your wrists and pull them tightly! -가죽 수갑이 손목을 꽉 잡아당깁니다! -The leather cuffs hit you! (DamageDealt) -가죽 수갑이 당신을 때렸습니다! (DamageDealt) -Summons a pair of cuffs which deals DamageDealt chain damage and adds 40 binding. Until the target struggles free, attacking the target disarms them for 3 turns. -DamageDealt 연쇄 피해를 입히고 40 바인딩을 추가하는 한 쌍의 수갑을 소환합니다. 대상이 자유롭게 투쟁할 때까지 대상을 공격하면 대상을 3턴 동안 무장 해제합니다. -You conjure leather cuffs! -당신은 가죽 수갑을 불러냅니다! -The cuffs will appear next to you and fly toward the target point. -커프스가 옆에 나타나 목표 지점을 향해 날아갑니다. -Conjure Blindfold -눈가리개 만들기 -Conjured Blindfold -창조된 눈가리개 -The blindfold wraps around your head and buckles tightly! -눈가리개가 머리를 감싸고 버클이 단단히 고정됩니다! -The blindfold hits you! (DamageDealt) -눈가리개가 당신을 때립니다! (DamageDealt) -Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not silenced. -DamageDealt 연쇄 피해를 입히고 20턴 동안 눈을 멀게 하는 눈가리개를 소환합니다. 대상이 침묵하지 않으면 구속력이 +40이 됩니다. -You conjure a blindfold! -당신은 눈가리개를 요술! -The blindfold will appear next to you and fly toward the target point. -눈가리개가 옆에 나타나 목표 지점을 향해 날아갑니다. +Latex Ball Gag +라텍스 볼 개그 +### A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. -Conjure Cuffs -소맷부리 -Conjured Cuffs -컨저드 커프스 -The cuffs pull your wrists together and click tightly! -커프스는 손목을 함께 당기고 단단히 클릭하십시오! -The cuffs hit you! (DamageDealt) -수갑이 당신을 때렸습니다! (DamageDealt) -Summons a pair of cuffs which deals DamageDealt chain damage and disarms for 5 turns. +40 binding if target is not disarmed. -DamageDealt 연쇄 피해를 입히고 5턴 동안 무장 해제시키는 한 쌍의 수갑을 소환합니다. 대상이 무장 해제되지 않은 경우 바인딩 +40. -You conjure a pair of cuffs! -당신은 한 쌍의 수갑을 불러냅니다! -The cuffs will appear next to you and fly toward the target point. -커프스가 옆에 나타나 목표 지점을 향해 날아갑니다. +The strap is made of a durable but flexible material +스트랩은 튼튼하면서도 유연한 소재로 제작되었습니다 +### Large Latex Ball Gag +### A devious device that looks like a large ball gag, but absolutely fills your mouth with a rubber cylinder. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. -Conjure Legbinder -레그바인더를 창조하다 -Conjured Legbinder -창조된 다리결속사 -The legbinder slips itself around your legs and buckles itself tightly! -레그바인더가 다리 주위로 미끄러져 들어가 단단히 고정됩니다! -The legbinder hits you! (DamageDealt) -레그바인더가 당신을 공격합니다! (DamageDealt) -Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. -DamageDealt 연쇄 피해를 입히고 10턴 동안 스네어링하는 레그바인더를 소환합니다. 대상이 스네어링되지 않은 경우 바인딩 +50. -You conjure a legbinder! -레그바인더를 불러내다니! -The legbinder will appear next to you and fly toward the target point. -레그바인더가 옆에 나타나 목표 지점을 향해 날아갑니다. +Latex Mask +라텍스 마스크 +A slick layer of blue latex stretched over the mouth. +파란색 라텍스의 매끄러운 층이 입 위에 펼쳐져 있습니다. +It's very tight and makes it hard to move your mouth. +매우 빡빡해서 입을 움직이기가 어렵습니다. -Conjure Straitjacket -구속복을 창조하다 -Conjured Straitjacket -창조된 구속복 -The straitjacket slips itself around your body and pulls your arms into its sleeves! -구속복은 당신의 몸을 감싸고 당신의 팔을 소매 속으로 끌어당깁니다! -The straitjacket hits you! (DamageDealt) -구속복이 당신을 공격합니다! (DamageDealt) -Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. -DamageDealt 바인딩을 추가하고 14턴 동안 전투 속도를 감소시키는 구속복을 소환합니다. -You conjure a straitjacket! -당신은 구속복을 요술! -The straitjacket will appear next to you and fly toward the target point. -구속복이 옆에 나타나 목표 지점을 향해 날아갑니다. +### Secure Latex Mask +### A slick layer of blue latex stretched over the mouth. It has a lockable strap which prevents it from being removed. -Conjure Harness -하니스를 창조하다 -Conjured Harness -창조된 하네스 -The harness slips itself around your torso and squeezes tightly as each buckle secures itself one by one! -하네스가 몸통 주위로 미끄러지며 각 버클이 하나씩 고정될 때 단단히 조입니다! -The harness hits you! (DamageDealt) -하네스가 당신을 때립니다! (DamageDealt) -Summons a harness which deals DamageDealt crush damage. Adds +50 binding per 25% binding level on target, up to +200. -DamageDealt 크러시 데미지를 입히는 하네스를 소환합니다. 대상에 대한 바인딩 레벨 25%당 바인딩 +50, 최대 +200을 추가합니다. -You conjure a harness! -당신은 하네스를 요술! -The harness will appear next to you and fly toward the target point. -하네스가 옆에 나타나 목표 지점을 향해 날아갑니다. -Firecracker -폭죽 -A small delayed explosion that deals DamageDealt fire damage. -DamageDealt 화염 피해를 주는 작은 지연 폭발입니다. -You shout an incendiary retort! -당신은 선동적인 레토르트를 외칩니다! -Choose AoE location -AoE 위치 선택 -Feather Burst -페더 버스트 -After a brief delay, a small cloud of feathers tickles enemies for DamageDealt damage and +60 distraction for 3 turns. -잠시 후 작은 깃털 구름이 적을 간지럽혀 DamageDealt 피해를 입히고 3턴 동안 주의를 분산시킵니다. -You conjure a burst of frenetic feathers! -당신은 광란의 깃털 폭발을 불러일으킵니다! -Choose AoE location -AoE 위치 선택 +### Rubberized Gloves -Tickle Cloud -간지럼구름 -For 10 turns, disembodied hands tickle a target location for DamageDealt tickle damage. -10턴 동안 실체가 없는 손이 대상 위치를 간지럽혀 DamageDealt 간지럼 피해를 입힙니다. -A swarm of hands holding feathers appears! -깃털을 쥔 손 떼가 나타난다! -Choose location -위치 선택 +### A mass of alchemical latex stretched over your arms, then hardened to the point that you can barely move your fingers! -Frustrated Pet -좌절한 애완동물 -The pet collapses in frustration. -애완 동물은 좌절감에 쓰러집니다. +### Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! -Mana Pet -애완 동물은 어디에 있습니까? -The enemy steals your pet from you! -적이 당신에게서 애완 동물을 훔칩니다! +### Rubberized Socks -Display Doll -디스플레이 인형 -The enemy steals your doll from you! -적이 당신에게서 인형을 훔쳐갑니다! +### A mass of alchemical latex stretched over your legs, then hardened. -Conjure Petsuit -펫슈트를 창조하다 -Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana regen. -무력한 적만 대상으로 삼으세요. 당신을 따라다니는 펫으로 변신시켜 패시브 마나 재생을 증가시킵니다. -You conjure an enchanted petsuit which wraps around your target, forcing her to follow you! -당신은 당신의 목표를 감싸고 그녀가 당신을 따르도록 강요하는 마법에 걸린 펫슈트를 불러냅니다! -You watch in horror as your own creation lunges toward you, binding your hands and feet! -당신의 창조물이 당신의 손과 발을 묶고 당신을 향해 돌진하는 것을 당신은 공포에 질려 지켜보고 있습니다! -Choose a helpless target -무력한 대상을 선택하십시오 +### Rubberized Mask -Conjure Display Stand -진열대를 창조하다 -Target only Helpless enemies. Creates a fixture that increases passive mana regen, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. -무력한 적만 대상으로 삼으십시오. 패시브 마나 재생을 증가시키고, 50 충전을 회복하고, 근처의 적이 50% 더 많은 매혹/정신 피해를 받도록 하는 고정물을 생성합니다. -You conjure a fixture to hold your helpless target in place! -당신은 무기력한 대상을 제자리에 고정시키기 위해 고정물을 불러냅니다! -You watch in horror as your own creation surrounds you, locking you in place with a hefty click! -당신은 당신 자신의 창조물이 당신을 둘러싸고, 큰 딸깍 소리와 함께 당신을 제자리에 고정시키는 것을 공포에 질려 지켜보고 있습니다! -Choose a helpless target -무력한 대상을 선택하십시오 +### A mass of alchemical latex stretched over your entire face, then hardened. +### Rubberized Ball Gag -Lesser Flash -하급 섬광 -Ring -반지 -Flash Bomb -플래시 폭탄 -Sparkles! -반짝! -Mirror Image -미러 이미지 +### A mass of alchemical latex inflated to fill your mouth, then hardened. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +### Rubberized OTN Mask -A flash of light which renders anyone caught within blind for Duration turns -지속 시간 동안 장님 안에 갇힌 사람을 렌더링하는 섬광 -You charge up a bright flash! -당신은 밝은 플래시를 충전! -Select where to center the flash (SpellArea radius) -플래시를 중앙에 둘 위치 선택(SpellArea 반경) +### A mass of alchemical latex stretched over your mouth, then hardened. -A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged. -지속 시간 동안 기절시키는 시끄러운 소리가 돌아서 적을 끌어들입니다. 장거리. -You point and a noise emanates from the location! -가리키면 위치에서 소리가 납니다! -Select where to center the noise (SpellArea radius) -노이즈를 중앙에 둘 위치 선택(SpellArea 반경) +Wolf Panties +늑대 팬티 +A set of vibrating panties designed to help subdue unruly wolfgirls. +제멋대로인 늑대소녀를 제압하는 데 도움이 되도록 설계된 진동 팬티 세트입니다. +It's incredibly tight and difficult to remove once it's clipped on, but the material is rubber. +엄청나게 빡빡하고 한 번 끼우면 제거하기 어렵지만 재료는 고무입니다. -Greater Flash -그레이터 플래시 -A massive flash of light which renders anyone caught within blind for Duration turns -지속 시간 동안 장님 안에 갇힌 사람을 렌더링하는 거대한 빛의 섬광 -You charge up a bright flash! -당신은 밝은 플래시를 충전! -Select where to center the flash (SpellArea radius) -플래시를 중앙에 둘 위치 선택(SpellArea 반경) -Focused Flash -집중 플래시 -Select where to center the flash (SpellArea radius) -플래시를 중앙에 둘 위치 선택(SpellArea 반경) -A focused flash of light which renders anyone caught within blind for Duration turns -지속 시간 동안 장님 안에 갇힌 사람을 렌더링하는 집중된 빛의 섬광 -You slowly charge up a powerful flash! -당신은 천천히 강력한 플래시를 충전합니다! +### You can't equip that. -Shroud -측판 -Smoke Bomb -연기 폭탄 -Sleep Gas -수면 가스 -Select where to center the shroud (SpellArea radius) -슈라우드를 중앙에 배치할 위치 선택(SpellArea 반경) -Creates a cloud for Duration turns that buffs evasion for all creatures. You are temporarily invisible for 8 turns after leaving. -지속 시간 동안 모든 생물의 회피를 강화하는 구름을 생성합니다. 퇴장 후 8턴 동안 일시적으로 투명 상태가 됩니다. -You exhale a misty shroud -당신은 안개 낀 수의를 내뿜습니다. +### Experimental Boxtie Binder -Invisibility -보이지 않는 -Select which creature to buff -강화할 생물 선택 -Make the targeted creature invisible, increasing stealth for Duration turns -대상 생물을 보이지 않게 만들어 지속 시간 동안 스텔스를 높입니다. -You snap your fingers! -당신은 손가락을 스냅! +A secure but comfortable binder meant for long-term wear by the alchemists' pets. +연금술사의 애완동물이 장기간 착용할 수 있는 안전하지만 편안한 바인더입니다. +Made from imbued latex, it will be hard to cut but not impossible. +마력이 깃든 라텍스로 만들어졌으니 자르기는 어렵지만 불가능하지는 않습니다. +### Binder Harness -CMD: Lock -명령: 잠금 -Select which creature to lock -잠글 생물 선택 -Magically locks down a target, preventing them from struggling below the current level of binding until freed by an enemy spellcaster (max 100% binding). -마법으로 대상을 잠그고 적 주문 시전자가 풀어줄 때까지 현재 속박 수준 이하로 고군분투하는 것을 방지합니다(최대 100% 속박). -You say a command word, and magical locks bind your target! -명령어를 말하면 마법의 자물쇠가 목표물을 묶습니다! +### A tight harness attached to a binder used to ensure restraints will not come off. -Chastity -순결 -Select which creature to lock in a belt -벨트에 잠글 생물을 선택하십시오 -Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs and distracts constantly. -비활성화 된 생물을 목표로 삼으십시오. +DamageDealt 바인딩을 추가하고 대상이 플러그를 제거하지 못하도록 방지하고 지속적으로주의를 분산시키는 Chastity를 적용합니다. -You conjure a chastity belt, which latches onto your target! -당신은 당신의 목표물에 고정되는 정조대를 창조합니다! -Your own spell locks you in chastity! -자신의 주문이 당신을 순결에 가두어! -Something fun enters your body... -재미있는 것이 몸에 들어온다... +It's tied in the back and reinforced with steel boning. +뒤에 묶여 있고 강철 뼈대로 보강되어 있습니다. +Latex Posture Collar +라텍스 자세 목걸이 +A strict collar that makes it tougher to escape from other items. +다른 아이템에서 벗어나기 어렵게 만드는 엄격한 목걸이. +It has steel boning but could be cut with enough care. +강철 뼈대가 있지만 충분히 주의해서 자를 수 있습니다. +### Latex Ballet Heels -Zone of Purity -순결의 지대 -Select an area -지역 선택 -Creates an area which applies Chastity constantly to any enemy over 50% bondage that steps inside. -속박이 50% 이상인 적에게 지속적으로 순결을 부여하는 영역을 생성합니다. -You conjure a realm of absolute purity. -당신은 절대적인 순수함의 영역을 불러일으킵니다. +A pair of strict boots for making pets more manageable. A skilled person can still walk in these. +애완동물을 다루기 쉽게 만드는 엄격한 부츠입니다. 숙련된 사람이라면 이 신발을 신을 수 있습니다. +### They are reinforced with top-quality hardened latex. -Zone of Excitement -흥분의 영역 -Select an area -지역 선택 -Creates an area which adds a conjured vibrating toy to enemies that step inside. Toy lasts 30 turns. -내부로 들어오는 적에게 진동하는 진동 장난감을 추가하는 영역을 생성합니다. 장난감은 30턴 동안 지속됩니다. -You conjure a realm of absolute fun! -당신은 절대적인 재미의 영역을 불러일으킵니다! -CMD: Capture -명령: 캡처 -Select which creature to bind -묶을 생물 선택 -Commands nearby restraints to bind a target, dealing DamageDealt chain damage, +50 binding. Ropes snare 3 turns/rope, belts +20 binding/belt, chains deal +15 crush dmg/chain. -근처의 구속 장치에 대상을 묶도록 명령하여 DamageDealt 체인 피해, +50 바인딩을 입힙니다. 로프는 3턴/로프, 벨트는 +20 바인딩/벨트, 체인은 +15 크러시 데미지/체인을 처리합니다. -You say a command word, and the bindings on the ground do your bidding! -당신이 명령을 내리면, 땅에 있는 묶음이 당신의 명령을 따릅니다! -CMD: Disenchant -CMD: 디스인챈트 -Select an area -지역 선택 -Target a large area. Permanently slows constructs, reduces attack speed by 50%, and deals 30 shadow damage. Refunds 50% mana at 3 or more targets. Makes magic bindings easier. -넓은 지역을 대상으로 합니다. 구조물을 영구적으로 느리게 하고, 공격 속도를 50% 감소시키고, 30의 암흑 피해를 입힙니다. 3명 이상의 대상에게 50%의 마나를 돌려줍니다. 마법 바인딩을 더 쉽게 만듭니다. -You say a command word, siphoning the magic from nearby constructs! -명령어를 말하면 근처에 있는 구조물에서 마법을 빨아들입니다! +High-Security Armbinder +높은 보안 암밴드 +### An armbinder enclosing your hands and arms completely, making your hands useless. -CMD: Vibrate -명령: 진동 -Select an area -지역 선택 -Target a large area. Enemies with plugs or toys are teased for Duration turns, taking charm damage each turn. -넓은 지역을 목표로 삼으십시오. 플러그나 장난감을 가진 적들은 지속 시간 동안 놀림을 받으며, 매 턴 매력 피해를 입습니다. -You say a command word, causing all toys in the area to vibrate! -명령어를 말하면 해당 지역의 모든 장난감이 진동합니다! +Made of a flexible, yet durable material, it's going to be really tough to escape. +유연하면서도 내구성이 뛰어난 소재로 만들어져 탈출하기가 정말 어려울 것입니다. +### High-Security Boxbinder -CMD: Explosive Finish -CMD: 폭발성 마무리 -Explosive Finish -폭발적인 마무리 -Select an area -지역 선택 -Target a large area. Consumes enemy distraction to deal up to DamageDealt charm damage, twice if at 90% distraction or more. -넓은 지역을 목표로 삼으십시오. 적의 주의를 분산시켜 최대 DamageDealt 매력 피해를 입히며, 주의가 90% 이상일 경우 두 번 가합니다. -You say a command word, resulting in a surge of energy entering your targets! -명령어를 말하면 대상에 에너지가 급증합니다! +### A boxbinder enclosing your hands and arms completely, making your hands useless. -CMD: Release -명령: 릴리스 -Select an area -지역 선택 -Target bound (but unlocked) targets in a 3x3 area, reducing binding by 100. Removes unlocked restraints on player that are removable. -3x3 영역에서 바인딩된(그러나 잠금 해제된) 타겟을 대상으로 바인딩을 100만큼 줄입니다. 제거 가능한 플레이어의 잠금 해제된 구속을 제거합니다. -You say a command word, causing restraints to loosen! -명령어를 말하면 속박이 풀린다! -You say a command word, but your restraints remain tight! -당신은 명령어를 말하지만 당신의 구속은 여전히 ​​단단합니다! +### High-Security Straitjacket -Remove Slime -점액 제거 -Select a creature or yourself -생물 또는 자신을 선택하십시오 -Remove Slime and Encasement from target creatures in an area. Also removes slime from self. -지역에 있는 대상 생물의 슬라임과 인케이스먼트를 제거합니다. 또한 자신에게서 슬라임을 제거합니다. -You issue a command to the slime! -당신은 슬라임에게 명령을 내립니다! -You whisper a command word, but the slime is already hardened and won't budge... -명령어를 속삭여도 슬라임은 이미 굳어 꼼짝도 하지 않고... +### A straitjacket enclosing your hands and arms completely, making your hands useless. +### High-Security Lockdown Jacket -Binding Vines -속박의 덩굴 -Binding Ropes -바인딩 로프 -Binding Chains -바인딩 체인 -Binding Belts -바인딩 벨트 -Vines rise from the ground and squeeze you! -덩굴이 땅에서 솟아 오르고 당신을 짜냅니다! -Ropes encircle your body and tighten! -밧줄이 몸을 감싸고 조입니다! -Chains wrap around you! -사슬이 당신을 감쌉니다! -A web of belts buckles in place around your body! -벨트 버클이 몸 주위에 제자리에 있습니다! -Vines rise from the ground and squeeze you! (DamageDealt) -덩굴이 땅에서 솟아 오르고 당신을 짜냅니다! (DamageDealt) -Ropes encircle your body and tighten! (DamageDealt) -밧줄이 몸을 감싸고 조입니다! (DamageDealt) -Chains wrap around you! (DamageDealt) -사슬이 당신을 감쌉니다! (DamageDealt) -A web of belts buckles in place around your body! (DamageDealt) -벨트 버클이 몸 주위에 제자리에 있습니다! (DamageDealt) +### This jacket made with extra straps can even be used on top of another jacket for extra security. -Awaken -깨우다 -Awaken -깨우다 -The slime awakens and turns on you!!! -슬라임이 깨어나 당신을 켭니다!!! -Select area to awaken -각성할 지역 선택 -Activates the slime in an area, causing it to deal DamageDealt glue damage. Encases fully bound targets. -지역의 점액을 활성화하여 DamageDealt 접착제 피해를 입힙니다. 완전히 묶인 대상을 감쌉니다. -You command the slime to draw in targets! -당신은 슬라임에게 목표물을 끌어들이도록 명령합니다! +High-Security Legbinder +보안이 철저한 다리 결속기 +An mythril legbinder enclosing your legs, making it difficult to move. +다리를 감싸고 있어 움직이기 어렵게 만드는 미스릴 레그바인더. -CMD: Bind -CMD: 바인드 -Select area to bind -바인딩할 영역 선택 -Commands nearby restraints to bind targets standing on them. Rope: 30 chain dmg/5 turn snare. Chain: 30 crush dmg/8 turn disarm. Belts: 50 binding/3 turns vulnerability. -근처의 구속을 명령하여 그 위에 서 있는 대상을 묶습니다. 로프: 30 체인 데미지/5턴 스네어. 체인: 30 크러쉬 데미지/8턴 해제. 벨트: 50 바인딩/3턴 취약. -You say a command word, and the bindings on the ground do your bidding! -당신이 명령을 내리면, 땅에 있는 묶음이 당신의 명령을 따릅니다! -CMD: Unlock -명령: 잠금 해제 -Select which creature to unlock -잠금 해제할 생물 선택 -On yourself: Removes all purple locks. On a creature: Reduces the target's binding by 20 points. -자신에게: 모든 보라색 자물쇠를 제거합니다. 생물에게: 대상의 바인딩을 20포인트 줄입니다. -You speak a command word! -당신은 명령 단어를 말한다! -None of the locks you are wearing respond to your magic. -당신이 착용하고 있는 자물쇠는 당신의 마법에 반응하지 않습니다. -You can't help her with this. -당신은 그녀를 도울 수 없습니다. -You must target yourself, an enemy, or a locked object. -자신, 적 또는 잠긴 물체를 목표로 삼아야 합니다. +High-Security Shackles +높은 보안 족쇄 +### A pair of hardened steel shackles around your feet. -Lesser Invisibility -하급 투명화 -Select which creature to buff -강화할 생물 선택 -Make the targeted creature invisible, increasing stealth for Duration turns -대상 생물을 보이지 않게 만들어 지속 시간 동안 스텔스를 높입니다. -You become semitransparent! -반투명해진다! +Nearly indestructable, you are at the mercy of its lock. +거의 파괴 불가능, 당신은 그것의 자물쇠에 자비입니다. +### High-Security Ball Gag -Camouflage -위장 -Select yourself -자신을 선택 -Enemies have a harder time noticing you for Duration turns. Cancels if you move, cast, or sleep. -적들은 Duration 턴 동안 당신을 알아차리기가 더 어렵습니다. 당신이 움직이거나, 시전하거나, 잠자면 취소됩니다. -You pose in a clandestine manner. -당신은 은밀하게 포즈를 취합니다. +A rubber gag shoved tightly between your lips. +입술 사이에 고무 재갈이 꽉 끼어 있습니다. +### The cable-reinforced straps are nigh-unbreakable, keeping you securely silenced. -Darkblade -다크블레이드 -Select which creature to buff -강화할 생물 선택 -Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks, whichever is lower. -대상 생물(또는 자신)이 지속 시간 동안 또는 5번의 공격 중 낮은 쪽에서 +20 피해를 얻도록 합니다. -You call forth dark runes on your weapon and arms! -당신은 당신의 무기와 팔에 암흑의 룬을 불러냅니다! +### High-Security Muzzle -Heal -치유하다 -Select which creature to heal -치료할 생물 선택 -Restore 45 hitpoints to an allied creature. -아군 크리쳐의 체력을 45 회복시킵니다. -You utter a word of healing. -치유의 말씀을 하십니다. +### A secure muzzle made with cable-reinforced straps. -Flame Blade -플레임 블레이드 -When enabled: Weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. -활성화 시: 무기 공격 시 마나가 소모되며 인접한 대상에게 30의 화염 피해를 주는 화염 공격을 생성합니다. -Flame Blade -플레임 블레이드 +### It is especially effective at keeping in other gags. -Engulf -삼키다 -When enabled: Your melee attacks deal +20 glue damage and create slime. -활성화 시: 근접 공격이 +20의 글루 피해를 입히고 점액을 생성합니다. +Potion Absorber +포션 업소버 +An ancient device that allows direct use of potions even while gagged or bound. +재갈을 물렸거나 묶인 상태에서도 물약을 직접 사용할 수 있게 해주는 고대의 장치입니다. +Also allows fitting of a leash. +또한 가죽 끈을 끼울 수 있습니다. +Slime Walkers +슬라임 워커 +A pair of heels coated in a nonstick material. +눌어붙지 않는 소재로 코팅된 힐. +They will slow you down, but you can walk on slime without getting stuck! +그들은 당신을 느리게 할 것이지만, 당신은 갇히지 않고 슬라임 위를 걸을 수 있습니다! -Strengthen -강하게 하다 -When enabled: Struggling is more powerful, and your attack damage is increased by +20 if your weapon deals physical damage. -활성화 시: 투쟁이 더 강력해지고, 무기가 물리 피해를 입힐 경우 공격 피해가 +20 증가합니다. -Your body glows with magical energy! -당신의 몸은 마법의 에너지로 빛납니다! -Enhance Will -의지 강화 -When enabled: Miscast chance is halved -활성화 시: 미스캐스팅 확률이 절반으로 감소 -You focus intently! -당신은 열심히 집중! +### Duster Gag -Truesight -트루사이트 -When enabled: Drain mana every turn to see through walls and increase accuracy by 40%. -활성화 시: 매 턴마다 마나를 소모하여 벽을 뚫고 정확도를 40% 높입니다. +### A special gag designed for maids to be useful even while tied up! It's self-locking too! -Heartsense -하트센스 -Highlight the locations of enemies through walls on the map for 12 turns. -12턴 동안 지도에서 벽을 통해 적의 위치를 ​​강조 표시합니다. +### Deals 0.5 tickle damage on attack and adds +30 distraction. Bonus damage vs dirt and mold. -Light -빛 -Produce a bright light for Duration turns. Has no effect in dark rooms. -지속 시간 동안 밝은 빛을 냅니다. 어두운 방에서는 효과가 없습니다. +### Deals 0.5 tickle damage on attack and adds +30 distraction. -Floating Weapon -떠다니는 무기 -When enabled: While hands are bound, you can still use weapons, but attacks cost mana. -활성화 시: 손이 묶여 있는 동안에도 무기를 사용할 수 있지만 공격 시 마나가 소모됩니다. -Levitate -공중에 뜨다 -When enabled and above 0 stamina: Drain 5 mana per step to reduce slow level by 1 (if above 1), or 20 mana to ignore a temporary slow effect. -활성화되고 스태미나가 0 이상인 경우: 단계당 5마나를 소모하여 둔화 수준을 1(1 이상인 경우) 줄이거나 일시적인 둔화 효과를 무시하려면 20마나를 소모합니다. -You levitate over the trap! -당신은 함정 위로 부상! -You snag a tripwire while floating! -떠다니다가 인계철선이 걸렸다! -You levitate forward despite being slowed! -느려도 앞으로 공중부양! -You hover with reduced effect from bindings. -귀속으로 인해 감소된 효과로 호버링합니다. -Iron Blood -철혈 -Select yourself -자신을 선택 -Channel 4 turns: Halves SP cost of melee attacks by 50%, but increases MP cost of spells by 25%. Ends on sleep or recast. -채널 4턴 : 근접 공격의 SP 소모량을 50%로 반감하지만 주문의 MP 소모량을 25% 증가시킨다. 수면 또는 재시전 시 종료된다. -Your skin glows a pale red! -피부가 옅은 붉은색으로 빛납니다! +### Gas Mask -Stone Skin -스톤 스킨 -Select which creature to buff -강화할 생물 선택 -Make the targeted creature (or yourself) gain +20 armor for Duration turns -대상 생물(또는 자신)이 지속 시간 동안 +20 갑옷을 얻도록 합니다. -Your skin takes on the appearance of cracked earth! -당신의 피부는 금이 간 땅처럼 보입니다! +### A respirator designed to protect the wearer from noxious fumes. -The EnemyName gains increased physical armor! -EnemyName의 물리적 방어력이 증가합니다! -The EnemyName buffs the physical armor of her allies! -EnemyName은 아군의 물리 방어력을 강화합니다! -The EnemyName deploys an energy shield to allies! -EnemyName이 아군에게 에너지 보호막을 배치합니다! -The EnemyName activates the vibrators of nearby wolfgirls, greatly motivating them! -EnemyName은 근처 울프걸의 바이브레이터를 작동시켜 큰 동기를 부여합니다! -The EnemyName creates a zone of increased defense! -EnemyName은 강화된 방어 구역을 생성합니다! -EnemyName uses a charm to buff an enemy's Magic Armor and Evasion! -EnemyName은(는) 매력을 사용하여 적의 마법 갑옷과 회피를 버프합니다! -EnemyName uses a glowing talisman to buff an undead's physical armor and speed! -EnemyName은(는) 빛나는 부적을 사용하여 언데드의 물리적 갑옷과 속도를 강화합니다! -You create a zone of increased defense! -강화된 방어 구역을 생성합니다! -You create a protective zone! -보호 구역을 만듭니다! -You create a fan of icicles! -당신은 고드름의 팬을 만듭니다! +### +50 Poison resist. Protects against dizziness caused by sleep gas. Affects speech. -Wall -벽 -Select where to put the wall (cannot place on occupied squares) -벽을 놓을 위치를 선택합니다(점유 중인 사각형에는 놓을 수 없음). -Create a stationary wall for Duration turns. It takes 20% damage from spells. -기간 회전을 위한 고정 벽을 만듭니다. 주문으로부터 20%의 피해를 입습니다. -A wall starts to form! -벽이 형성되기 시작합니다! -You create a line on the ground. -지면에 선을 만듭니다. -True Steel -트루 스틸 -Choose a target. -대상을 선택합니다. -A melee strike that deals DamageDealt slash damage, x2.5 against unaware humanoid enemies. -알지 못하는 인간형 적에게 2.5배의 DamageDealt 베기 피해를 입히는 근접 공격입니다. -You slash with an ethereal blade! -당신은 천상의 칼날로 베어버립니다! -Summon Familiar -서먼 패밀리어 -Select where to put the familiar (cannot place on occupied squares) -패밀리어를 놓을 위치 선택(점유 중인 사각형에는 놓을 수 없음) -Create a familiar that fights by your side for the rest of the level -남은 레벨 동안 옆에서 싸우는 사역마를 만드세요. -A familiar appears! -친숙한 등장! -You create a circle on the ground with your foot! -당신은 발로 땅에 원을 만듭니다! +### The curse on the RestraintName is lifted! -Summon Storm Crystal -폭풍 수정 소환 -Select where to put the storm crystal (cannot place on occupied squares) -폭풍 수정을 놓을 위치 선택(점유 중인 사각형에는 놓을 수 없음) -Create a stationary crystal that casts Crackle on nearby targets for Duration turns. Can be healed to extend duration. -지속 시간 동안 근처의 대상에게 Crackle을 시전하는 고정 수정을 생성합니다. 지속 시간을 연장하기 위해 치료할 수 있습니다. -A crackling crystal emerges from the ground! -딱딱거리는 수정이 땅에서 솟아오른다! -You stomp and the ground shakes! -발을 구르면 땅이 흔들린다! +### Press RIGHT to confirm buy! -Summon Fire Mote -불의 티끌 소환 -Select where to put the fire mote (cannot place on occupied squares) -불 티끌을 놓을 위치를 선택합니다(점유 중인 사각형에는 놓을 수 없음). -Create an orb of fire that follows you and attacks using firebolt. -당신을 따라다니는 불의 구체를 만들고 불화살을 사용하여 공격합니다. -A flaming spirit answers your call! -불타는 정령이 당신의 부름에 응답합니다! -You call upon the plane of Fire! -당신은 불의 차원을 부릅니다! -Summon Earth Mote -서먼 어스 티끌 -Select where to put the earth mote (cannot place on occupied squares) -흙먼지를 놓을 위치 선택(점유 중인 사각형에는 놓을 수 없음) -Create an animated stone that attacks using a strong but slow crush attack. -강력하지만 느린 크러시 공격을 사용하여 공격하는 움직이는 돌을 만듭니다. -A rocky spirit rushes forth from the ground! -바위 같은 정령이 땅에서 튀어나온다! -You call upon the plane of Earth! -당신은 지구의 차원을 호출합니다! -Summon Air Mote -에어모트 소환 -Select where to put the air mote (cannot place on occupied squares) -에어 티끌을 놓을 위치 선택(점유 중인 사각형에는 놓을 수 없음) -Create a dusty mote that attacks using gusts of wind. -돌풍을 이용해 공격하는 먼지 티끌을 만듭니다. -A dust devil arises in front of you! -먼지 악마가 당신 앞에 나타납니다! -You call upon the plane of Air! -당신은 공기의 차원을 호출합니다! -Summon Water Mote -워터모트 소환 -Select where to put the water mote (cannot place on occupied squares) -물티끌을 놓을 위치를 선택합니다(점유 중인 사각형에는 놓을 수 없음). -Create a watery serpent which stuns enemies with its melee attack. -근접 공격으로 적을 기절시키는 물뱀을 만듭니다. -A watery spirit bubbles up from the ground! -물의 정령이 부글거리며 땅에서 솟아오릅니다! -You call upon the plane of Water! -당신은 물의 차원을 호출합니다! -Summon Shadow Warrior -그림자 전사 소환 -Select where to put the shadow warrior (cannot place on occupied squares) -그림자 전사를 배치할 위치 선택(점유 중인 사각형에는 배치할 수 없음) -Call forth a shadow warrior for 16 turns who deals DamageDealt damage every other turn. -매 턴마다 DamageDealt 피해를 입히는 그림자 전사를 16턴 동안 불러냅니다. -...and the abyss answers! -...그리고 심연이 대답합니다! -You call... -당신이 전화... +### You find -Summon Golem -골렘 소환 -Select where to put the golem (cannot place on occupied squares) -골렘을 놓을 위치 선택(점유 중인 사각형에는 놓을 수 없음) -Create a slow but powerful golem to fight by your side -느리지만 강력한 골렘을 만들어 곁에서 싸우세요 -A golem arises! -골렘이 나타났다! -You stomp your foot and draw the words of life on the floor! -당신은 발을 구르고 바닥에 생명의 말을 그립니다! -Summon Decoy -미끼 소환 -Select where to create an illusion (cannot place on occupied squares) -환상을 만들 위치를 선택하십시오(점유 중인 사각형에는 배치할 수 없음). -Create a decoy for Duration turns. It attracts enemy attention and triggers traps. -지속 시간 동안 미끼를 만듭니다. 적의 관심을 끌고 함정을 작동시킵니다. -A shadow of yourself materializes! -자신의 그림자가 구체화된다! -You create a line on the ground and toss in a lock of your hair! -당신은 땅에 선을 만들고 머리카락을 묶습니다! -Feather Explosion -깃털 폭발 -Elastic Grip -탄성 그립 -A latex hand reaches out and pulls an enemy close to you! Base pull strength: 4 -라텍스 손이 손을 뻗어 가까이 있는 적을 끌어당깁니다! 기본 당기기 강도: 4 -You extend a rubbery hand and grab a foe! -당신은 고무 같은 손을 뻗어 적을 잡습니다! -There's an obstacle in the way! -도중에 장애물이 있습니다! -Select a target to pull -끌어올 대상 선택 -Slime Blast -슬라임 블래스트 -Apprentice's Slime -견습생의 점액 -Witch's Slime -마녀의 점액 -Witch's Slime Ball -마녀의 슬라임볼 -A pool of slime deals DamageDealt glue damage to enemies on impact and covers the area in temporary slime. -점액 웅덩이는 적에게 피해를 입히고 적에게 접착제 피해를 주고 일시적인 점액으로 해당 지역을 덮습니다. -You conjure a pool of slime! -당신은 슬라임 웅덩이를 만들어냅니다! -Select where the slime will appear -슬라임이 나타날 위치 선택 -Slime Eruption -슬라임 분출 -A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them friefly. -거대한 슬라임 폭발이 진입하는 적에게 DamageDealt 접착제 피해를 입히고 가볍게 묶습니다. -You conjure an explosion of slime! -당신은 슬라임 폭발을 불러일으킵니다! -Select where the slime will appear -슬라임이 나타날 위치 선택 -Slime Splash -슬라임 스플래쉬 -After one turn, deals DamageDealt glue damage in a small area and spreads slime. -한 턴 후 좁은 지역에 DamageDealt 접착제 피해를 입히고 점액을 퍼뜨립니다. -You conjure a small amount of slime! -당신은 소량의 슬라임을 불러냅니다! -Select where the slime will appear -슬라임이 나타날 위치 선택 -Water Ball -워터볼 -Fast projectile. Deals DamageDealt acid damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. -빠른 투사체. 피해를 입힙니다. 산성 피해를 입힙니다. 흠뻑 젖은 대상은 +35% 전기/얼음, -42% 불, 전기 피해의 50%를 받습니다. -You hurl a ball of water! -당신은 물 공을 던져! -Choose aim direction -조준 방향 선택 -Tidal Sphere -조석구 -Slow moving projectile, deals DamageDealt acid damage to enemies it passes thru. Leaves a large amount of water in its wake. -천천히 움직이는 투사체가 통과하는 적에게 DamageDealt 산성 피해를 줍니다. 지나간 자리에 많은 양의 물을 남깁니다. -You raise a huge mass of water! -당신은 엄청난 양의 물을 끌어올립니다! -Choose aim direction -조준 방향 선택 -The boulder knocks you to the ground! -바위가 당신을 땅에 쓰러뜨립니다! -The water covers you and drenches you! -물이 너를 덮고 적신다! -You step in water and become wet. -물에 들어가 젖게 됩니다. -Ice Breath -아이스 브레스 -A field of icicles that deals DamageDealt damage on a hit and stuns briefly. -명중 시 DamageDealt 피해를 입히고 잠시 기절시키는 고드름 필드입니다. -You breath out a chilling frost! -당신은 차가운 서리를 내뿜습니다! -Select where to put the icicles (SpellArea radius) -고드름을 놓을 위치 선택(SpellArea 반경) -Zombie Orb -좀비 오브 -Lesser Zombie Orb -하급 좀비 오브 -Freezing Zombie Orb -얼어붙는 좀비 오브 -Mystic Bolt -미스틱 볼트 -The mystic bolt paralyzes you! -미스틱 볼트가 당신을 마비시킵니다! +Collar +목걸이 +A classy leather collar. +고급스러운 가죽 목걸이. +Allows fitting of a leash. +목줄을 끼울 수 있습니다. +Slave Collar +노예목걸이 +A high-security steel collar befitting of a slave. +노예에 걸맞는 보안성이 높은 강철 목걸이. +Enchanted Collar +인챈티드 목걸이 +A collar made with magically enchanted materials. It is difficult to cut off. +마법의 마력이 깃든 재료로 만든 목걸이. 잘리기 어렵다. +Kitty Collar +키티 목걸이 +A collar made with magically enchanted materials. It is protected by the blessing of Bast. +마법의 마력이 깃든 소재로 만든 목걸이. 바스트의 가호로 지켜지고 있다. +Leash +속박 +A leash made from a strong material. +튼튼한 재질로 만든 목줄. +Functions as a handle for moving unruly prisoners. +제멋대로인 죄수를 움직이는 손잡이 역할을 합니다. -Rubber Bullets -고무 총알 -You are hit by a fusilade of rubber bullets! -당신은 고무 총알의 fusilade에 맞았습니다! -The rubber bullets congeal into a slimy material on your body! -고무탄이 몸에 끈적끈적한 물질로 응고됩니다! -Nature Blast -네이처 블래스트 -Raging Vines -성난 덩굴 +Prisoner Plug +죄수 플러그 +A teaser to keep you occupied. +당신을 사로잡을 티저. +Buzzes on spellcast, and periodically as well. +주문 시전 시 윙윙거리며 주기적으로 윙윙거립니다. +High-Security Chastity Belt +높은 보안 순결 벨트 +A chastity belt to protect prisoners from themselves. +죄수를 자신으로부터 보호하기 위한 정조대. +Made of a highly durable material. +내구성이 뛰어난 소재로 제작되었습니다. +Blacksteel Chastity Belt +블랙스틸 순결 벨트 -Magic Ribbons -매직 리본 -Magic Belts -매직 벨트 -Slime -더러운 것 -Slime -더러운 것 -You project a pool of sticky slime! -끈적 끈적한 점액 웅덩이를 투사합니다! -Arrow of Love -사랑의 화살 -You loose a glowing arrow! -당신은 빛나는 화살을 잃었습니다! -Bondage Buster -본디지 버스터 -You charge up a beam and fire it! -빔을 충전하고 발사합니다! -You swing your weapon and pull away the target's equipment! -당신은 무기를 휘두르고 대상의 장비를 빼냅니다! -You swing Dragonslaver and it lashes out in a whip-like fashion! -Dragonslaver를 채찍처럼 휘두릅니다! -The slime from your staff coats your body, granting you strange powers! -지팡이에서 나온 점액이 몸을 뒤덮고 특이한 힘을 부여합니다! -The power of the four elements flows through your veins! -당신의 혈관에는 4대 원소의 힘이 흐르고 있습니다! -Firebolt -파이어볼트 -An explosion knocks you to the ground! -폭발이 당신을 땅에 넘어뜨립니다! -Curious Spell -호기심 많은 주문 -You have been flummoxed! -당신은 당황했습니다! +Charms (Arms) +부적(무기) +A band of faintly magic ribbon wrapped tight around your arms. +어렴풋이 마법의 리본이 팔에 단단히 감겨 있습니다. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +그것은 거의 저절로 달라붙지만, 자르거나 잡아당기면 모두 취약해 보입니다. +Charms (Legs) +참(다리) +A band of faintly magic ribbon wrapped tight around your thighs. +허벅지를 단단히 감싸는 희미한 마법의 리본 밴드. +Charms (Feet) +매력(발) +A band of faintly magic ribbon wrapped tight around your ankles. +발목을 단단히 감싸는 희미한 마법의 리본 밴드. +Charms (Head) +참(머리) +### A band of faintly magic ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. -Cuff Bola -커프 볼라 -Throw Syringe -던지기 주사기 -You feel a prick as a small syringe hits you, and you start feeling drowsy... -당신은 작은 주사기가 몸을 찌르는 것을 느끼고, 어지러워집니다... -The thrown cuffs snap shut around your ankles and slow you down!!! -던져진 수갑이 찰칵소리를 내며 발목을 감싸고 당신의 속도를 늦춥니다!!! -Ribbon Burst -리본 버스트 -Spores -포자 -Noxious Spores -유해 포자 -Enticing Spores -유혹하는 포자 -You inhale some spores, and feel a bit sleepy... -포자를 약간 들이마시니 잠이 옵니다... -The spores make you feel excited! -포자가 당신을 흥분시킵니다! -The toxic spores make you feel faint... -독성 포자는 당신을 현기증나게 합니다... +Charm Gag +매력 개그 +### A band of faintly magic ribbon wrapped tight over the mouth. Can be used on vulnerable targets from quick inventory or hotbar. -Magic Hairpin -매직 헤어핀 -The magic hairpin goes for your eyes and forces you to blink! -마법의 머리핀이 당신의 눈을 노리고 강제로 눈을 깜빡이게 합니다! +Charm Wrapping (Toes) +참 감싸기(발가락) +A layer of faintly magic ribbon wrapped tight around your feet. +어렴풋이 마법의 리본이 발을 단단히 감싸고 있습니다. +Charm Wrapping (Head) +참 포장(머리) +A layer of faintly magic ribbon wrapped tight around your face. +어렴풋이 마법의 리본이 얼굴을 팽팽하게 감쌉니다. +Charm Wrapping (Arms) +참 포장(팔) +A layer of faintly magic ribbon wrapped tight around your body. +어렴풋이 마법의 리본이 몸을 단단히 감쌉니다. +Charm Wrapping (Feet) +참 감싸기(발) +A layer of faintly magic ribbon wrapped tight around your shins. +정강이를 단단하게 감싸는 희미한 마법의 리본. +Charm Wrapping (Legs) +참 포장(다리) +A layer of faintly magic ribbon wrapped tight around your thighs. +허벅지를 감싸는 희미한 마법 리본. +### Living Charm Collar -Ice Storm -아이스 스톰 +### This collar is designed to make sure its wearer does not escape their charms. -Icy Aura -아이시 아우라 -Icy Aura -아이시 아우라 +### It will occasionally cause charms to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of charms you have on you. -Slime Ball -슬라임볼 -Witch's Slime Ball -마녀의 슬라임 공 -A ball of slime leaves a trail of sticky slime (40 damage when stepped on). It deals DamageDealt glue damage on a hit. -슬라임 공은 끈적끈적한 슬라임 흔적을 남깁니다(밟았을 때 40 데미지). 적중 시 DamageDealt 접착제 피해를 입힙니다. -You hurl a ball of slime! -슬라임 공을 던집니다! -Choose aim direction -조준 방향 선택 +Leather Panel Gag +가죽 패널 개그 +A gag that seals your lips tightly and stuffs your mouth with a ball. +입술을 꽉 물고 볼을 입에 넣는 개그. +### Keep your mouth to yourself! -Summon Skeleton -스켈레톤 소환 -Mass Summon Skeleton -대량 소환 스켈레톤 -A skeleton arises from bones on the floor! -바닥의 ​​뼈에서 스켈레톤이 나타납니다! -A gang of SummonCount skeletons forms around you! -SummonCount 스켈레톤 무리가 주변에 형성됩니다! -A gang of SummonCount zombies emerges from the floor! -SummonCount 좀비 무리가 바닥에서 나타납니다! -A bunch of gags fly out from your satchel! -가방에서 많은 개그가 날아갑니다! +### Harness Panel Gag -A floating hand appears and cracks its knuckles! -떠다니는 손이 나타나서 너클을 꺾습니다! -A floating gag appears and starts flying toward you! -떠다니는 개그가 나타나 당신을 향해 날아오기 시작합니다! -A set of shackles opens wide and starts going for your wrists! -족쇄 세트가 활짝 열리고 손목을 노리기 시작합니다! -A swarm of shackles approaches you! -족쇄 떼가 당신에게 접근합니다! -A cloud of locks and chains clatters as it levitates toward you! -자물쇠와 사슬의 구름이 당신을 향해 공중부양하면서 달그락거립니다! -A huge cloud of locks and chains clatters as it levitates toward you! -자물쇠와 사슬의 거대한 구름이 당신을 향해 공중부양하면서 달그락거립니다! -Floating hands appear by the conjurer's side as she points her staff! -마술사가 지팡이를 겨누자 떠다니는 손이 그녀 옆에 나타납니다! +The harness is comprehensive and it's locked in place. +벨트는 포괄적이며 제자리에 고정되어 있습니다. +Harness Ball Gag +하네스 볼 개그 +A gag that stuffs your mouth with a large silicone ball. +커다란 실리콘 볼로 입가를 채우는 개그. -Floating books appear near the caster! -시전자 근처에 떠다니는 책 나타납니다! -Dusty tomes appear near the caster! -시전자 근처에 먼지투성이 책이 나타납니다! -Magical books appear near the caster! -시전자 근처에 마법의 책이 나타납니다! -Sinister books appear near the caster! -시전자 근처에 불길한 책이 나타납니다! -Crackling books appear near the caster! -딱딱거리는 책이 캐스터 근처에 나타납니다! -Glowing books appear near the caster! -캐스터 근처에 빛나는 책이 나타납니다! -Rubber-stained books appear near the caster! -고무로 얼룩진 책이 캐스터 근처에 나타납니다! -Flaming books appear near the caster! -캐스터 근처에 불타는 책이 나타납니다! -Frigid books appear near the caster! -캐스터 근처에 차가운 책이 나타납니다! -Devilish books appear near the caster! -캐스터 근처에 마성의 책이 등장! -A floating book appears near the caster! -캐스터 근처에 떠다니는 책이 나타납니다! -A dusty tome appears near the caster! -시전자 근처에 먼지 투성이의 책이 나타납니다! -A magical book appears near the caster! -캐스터 근처에 마법의 책이 나타납니다! -A sinister book appears near the caster! -캐스터 근처에 불길한 책이 나타납니다! -A crackling book appears near the caster! -캐스터 근처에 딱딱거리는 책이 나타납니다! -A glowing book appears near the caster! -캐스터 근처에 빛나는 책이 나타납니다! -A rubber-stained book appears near the caster! -고무로 얼룩진 책이 캐스터 근처에 나타납니다! -A flaming book appears near the caster! -캐스터 근처에 불타는 책이 나타납니다! -A frigid book appears near the caster! -캐스터 근처에 차가운 책이 나타납니다! -A devilish book appears near the caster! -캐스터 근처에 마성의 책이 나타난다! +Bast Gag +인피부 개그 +A gag used to silence new initiates of the Bast cult. +바스트 교단의 신입 입회자들을 침묵시키기 위해 사용하는 재갈. +Bast Muzzle +인피부 총구 +A muzzle used to keep a Bast gag secure. +바스트 개그를 고정하는 데 사용되는 총구입니다. +The leather panel is tough and tight. +가죽 패널은 질기고 빡빡합니다. +Bast Blindfold +인피 눈가리개 +A blindfold used to aid in meditation. +명상에 도움이 되는 눈가리개. +It is padded but still lets some light through. +패딩이 되어 있지만 여전히 약간의 빛이 통과합니다. +Bast Paws +인피 발 +Leather mittens used to pacify new initiates of the Bast cult. +바스트 교단의 새로운 입회자들을 진정시키는 데 사용되는 가죽 벙어리장갑입니다. +They make it hard to manipulate anything at all, but aren't the toughest material. +그것들은 무엇이든 조작하기 어렵게 만들지 만 가장 힘든 재료는 아닙니다. +Bast Suit +바스트 수트 +A skintight suit used on unruly initiates of the Bast cult. +제멋대로인 바스트 교단 입회자들에게 사용되는 몸에 꼭 맞는 옷입니다. +It's nearly impossible to escape without help once locked inside. +한 번 안에 갇히면 도움 없이 탈출하는 것은 거의 불가능합니다. +Bast Petsuit +바스트 펫슈트 +Enhanced suit used for select members of the Bast cult. +바스트 컬트의 선별된 구성원에게 사용되는 향상된 슈트입니다. -Your struggling leaves you aroused because of the RestraintName... -당신의 고군분투는 RestraintName 때문에 당신을 흥분시킵니다... -You feel your restraints squeeze you and tingle with painful sensations! -당신은 당신의 구속이 당신을 압박하고 고통스러운 감각으로 따끔 거림을 느낍니다! -'Do not resist,' whispers a voice in your head... -'저항하지 말라'는 목소리가 머릿속에서 속삭인다... -Your restraints squeeze you painfully without mercy! -당신의 속박은 자비 없이 고통스럽게 당신을 압박합니다! -The crystals emit a powerful energy! -크리스탈이 강력한 에너지를 발산합니다! -You feel your body overflow with energy... -당신은 당신의 몸이 에너지로 넘쳐 흐르는 것을 느낀다... -The crystals react to your struggle attempts with a strange energy! -크리스탈은 당신의 투쟁 시도에 이상한 에너지로 반응합니다! +Magic Petsuit +매직 펫수트 +A set of straps and buckles enchanted with a powerful spell to render you helpless. +당신을 무력하게 만드는 강력한 마법이 부여된 스트랩과 버클 세트입니다. +It's warded against cutting by nonmagic blades. +마법이 아닌 칼날에 의한 절단을 방지합니다. -Cast Spell (XXX turn delay) -Cast Spell (XXX 턴 지연) -You feel the vibrations leaving your body... -진동이 몸을 떠나는 느낌... -You feel your toys start to buzz... -당신은 당신의 장난감이 윙윙거리기 시작하는 것을 느낍니다... -You your toys continue to buzz... -당신의 장난감은 계속 윙윙거립니다... -The EnemyName remotely causes your toys to to buzz!!! -EnemyName은 원격으로 장난감을 윙윙거리게 합니다!!! -You feel the plugs inside you while walking. -걷는 동안 내부의 플러그를 느낍니다. -You feel a gentle buzz... -잔잔한 울림이 느껴진다... -Your toys tease you gently... -당신의 장난감은 당신을 부드럽게 놀립니다 ... -Your toys are vibrating. -장난감이 진동하고 있습니다. -Your toys are buzzing strongly! -당신의 장난감이 강하게 윙윙거리고 있습니다! -Your toys vibrate intensely! -장난감이 격렬하게 진동합니다! -The vibration is torturous! -진동은 고문입니다! -Your toys stop vibrating. -장난감이 진동을 멈춥니다. -You feel slightly full as you move... -움직이면서 약간 포만감이... -Your movement disturbs the plugs inside of you... -당신의 움직임은 당신 내부의 플러그를 방해합니다 ... -The large plugs shift(s) around inside of you... -큰 플러그가 당신 내부에서 움직입니다... -The huge plugs rub(s) around constantly inside of you... -거대한 플러그가 당신의 내부를 끊임없이 문지릅니다... -Your movements are hobbled. -당신의 움직임은 절름발이입니다. -Your hobbled movement disturbs the plugs inside of you. -당신의 절름발이 움직임은 당신 내부의 플러그를 방해합니다. -The large plugs shift(s) around inside of you from your hobbled movement... -절름발이 움직임으로 인해 내부에서 큰 플러그가 이동합니다... -The massive plugs rub(s) around inside of you as you hobble forward... -절뚝거리며 앞으로 나아가면 거대한 마개가 몸 안을 문지릅니다... -You hop forward! -당신은 앞으로 뛰어! -You hop and feel the plugs shifting around inside your body. -당신은 당신의 몸 안에서 플러그가 이동하는 것을 뛰고 느낍니다. -The plugs shift in and out with each hop... -플러그는 각 홉마다 안팎으로 이동합니다 ... -The massive plugs slide in and out mercilessly as you hop... -거대한 플러그는 당신이 뛰는 동안 무자비하게 미끄러져 들어왔다 나갑니다... -You inch forward slowly! -당신은 천천히 앞으로 인치! -You inch forward, feeling the movement of your plugs. -플러그의 움직임을 느끼며 앞으로 조금씩 나아갑니다. -You wiggle your hips inching forward, feeling the plugs inside you... -엉덩이를 조금씩 앞으로 움직이며 내부의 플러그를 느끼며... -You wiggle forward, the massive plugs inside you digging in and out... -당신은 앞으로 꿈틀대고, 당신 안에 있는 거대한 마개들이 파고들고 빠져나갑니다... -You crawl helplessly! -당신은 무기력하게 기어! -You crawl helplessly, feeling the plugs shifting around inside you. -당신은 내부에서 마개가 움직이는 것을 느끼며 무기력하게 기어갑니다. -You crawl and feel the plugs inside you rub around teasingly... -당신은 기어서 내부의 플러그가 장난스럽게 문지르는 것을 느낍니다... -You crawl helplessly, tormented by the massive plugs inside you... -당신은 내부의 거대한 마개에 괴로워하며 무기력하게 기어갑니다... -You are unable to move! -당신은 움직일 수 없습니다! -You wriggle uselessly, feeling the plugs shift inside you! -당신은 쓸데없이 꿈틀거립니다. 당신 안에서 플러그가 움직이는 것을 느끼니까요! -You wriggle uselessly, aroused by the plugs inside you! -당신은 당신 내부의 플러그에 흥분하여 쓸데없이 꿈틀거립니다! -You wriggle uselessly, tormented by the massive plugs inside of you! -당신은 당신 내부의 거대한 플러그에 괴로워하며 쓸데없이 꿈틀거립니다! -You climb into the grate -당신은 창살에 올라 +### Latex Petsuit -Mmmph... -으읍... -Mmmmmmmmm... -으읍읍으읍... -Hhmmpphh... -흐으읍읍... -Gghhhh!!! -으악!!! -Mmmmmphh!!! -읍읍으읍흡!!! -Mmm... -읍... -MMM!!! -읍읍!!! -Mmmmmm. -읍으으. +### A skintight suit that encases you in a tight rubber embrace. -Mmmaaaaahhh... -응으핫... -Mmmmmmmmm~ -으읍읍~ -Unnnghhh... -우읏... -Mmmmmmmphhh.. -읍읍흐으.. -Mmmmmphh~ -읍으읍~ -Mmm~ -으읍~ -Mmmmm~~ -읍읍~~ -Mmmmmm~~~ -으읍읍~~~ +### The thick latex is resistant to even the most determined struggles. -You are blinded! -당신은 눈이 멀었습니다! -You took DamageDealt damage! -DamageDealt 데미지를 입었습니다! -Your own rope trap springs upon you! -당신 자신의 밧줄 덫이 당신을 덮칩니다! -You get caught in sticky slime! -끈적끈적한 슬라임에 걸렸다! -The slime ball sticks to you! -슬라임 볼이 달라붙어! -The slime ball sticks to you and slows you! -슬라임 볼이 당신에게 달라붙어 속도를 늦춥니다! -You feel a powerful sensation run through your body! -당신은 당신의 몸을 통해 흐르는 강력한 감각을 느낀다! -Beams of light wrap around your body and feel warm on your skin! -빛의 광선이 몸을 감싸고 피부가 따뜻해집니다! -Crystals begin to form around your limbs! -팔다리 주위에 수정이 형성되기 시작합니다! -A magic chain secures itself around your body! -마법의 사슬이 당신의 몸을 감싸고 있습니다! -A rope wraps itself around your body! -밧줄이 당신의 몸을 감쌉니다! -A ribbon animates and becomes entwined around you! -리본이 움직이며 당신을 감쌉니다! -A belt buckles itself tightly around your body! -벨트가 몸을 단단히 조입니다! -A vine slithers across your body and tightens! -덩굴이 당신의 몸을 미끄러지듯 지나가며 팽팽해집니다! -The spell hits you and slows you down! -주문이 당신을 때리고 속도를 늦춥니다! -Rope -로프 -Rope Tendrils -로프 텐드릴 -Rope Strike -로프 스트라이크 -Animated Vines -애니메이션 덩굴 -Soul-binding Sigil -영혼을 묶는 시질 -Elven Arrow -엘프 애로우 -The elven arrow flashes and wraps you in mithril ropes! -엘프 화살이 번쩍이며 당신을 미스릴 밧줄로 감쌉니다! -Ropes wrap themselves around your body from all sides! -로프가 사방에서 몸을 감쌉니다! -Ropes wrap themselves around your body from all sides! -로프가 사방에서 몸을 감쌉니다! -Nature magic causes vines to sprout around you! -자연의 마법으로 주변에 덩굴이 돋아납니다! -Your clothes are stripped and replaced! -옷이 벗겨지고 교체됩니다! -Vines tear off your clothes! -덩굴이 당신의 옷을 찢습니다! -Restraints materialize on your body! -당신의 몸에 구속이 구체화됩니다! +Blessed Wrappings (Head) +축복받은 포장(머리) +### A band of magic embalming ribbon wrapped tight around your face. -The orb explodes into a burst of ribbons! -오브가 리본 폭발로 폭발합니다! -The orb tears off your clothes! -오브가 당신의 옷을 찢습니다! +### Blessed Wrappings (Eyes) -Charm Trap -매력 함정 -Ribbon Trap -리본 트랩 -Shackle Trap -족쇄 함정 -Mummy Trap -미라 트랩 -Rope Trap -로프 트랩 -Rope Trap -로프 트랩 -Belt Trap -벨트 트랩 -Cable Trap -케이블 트랩 -Slime Trap -슬라임 트랩 -Chain Trap -체인 트랩 -Gas Trap -가스 트랩 -Gas Trap -가스 트랩 -Sleep Dart -수면 다트 -Sleep Dart -수면 다트 +### A band of magic embalming ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. -A talisman on the floor explodes, sending a cloud of charms flying around you! -바닥에 있던 부적이 폭발하여 매력의 구름이 주위를 맴돌게 합니다! -Magical binding ribbons emerge from the walls! -마법 결속 리본이 벽에서 나온다! -The ceiling opens, letting a lot of shackles fall on you! -천장이 열리고 많은 족쇄가 당신에게 떨어집니다! -Bands of glowing wrappings start flying in from all sides! -빛나는 포장 띠가 사방에서 날아오기 시작합니다! -Ropes slither out towards you from between the bricks! -벽돌 사이에서 당신을 향해 밧줄이 미끄러져 나옵니다! -Ropes fall on you from all sides! -사방에서 밧줄이 떨어진다! -Leather restraints start appearing around you! -가죽 구속이 주변에 나타나기 시작합니다! -high-tech cables come out from the floor! -하이테크 케이블이 바닥에서 나온다! -Slimes pours out from the walls and ceiling! -벽과 천장에서 슬라임이 쏟아져 나온다! -Ethereal chains appear all around you! -에테리얼 체인이 사방에 나타납니다! -You hear the sound of glass breaking, and a cloud of green gas rises around you! -유리가 깨지는 소리가 들리고 녹색 가스 구름이 주위로 솟아오릅니다! -You hear the sound of glass breaking, and a cloud of pink gas rises around you! -유리가 깨지는 소리가 들리고 분홍색 가스 구름이 주변으로 솟아오릅니다! -The charms stick themselves all over your body! -매력이 온 몸에 달라붙는다! -The ribbons tie themselves tightly around your body and won't let go! -리본이 당신의 몸을 단단히 묶고 놓지 않을 것입니다! -Shackles close themselves over your limbs! -족쇄가 팔다리에 스스로를 닫습니다! -The wrappings close in over your body! -래핑이 몸을 감싸고 있습니다! -The ropes wrap themselves around your body! -로프가 당신의 몸을 감싸고 있습니다! -The ropes wrap themselves tightly around your body! -로프가 몸을 단단히 감쌉니다! -The leather restraints attach themselves to your body! -가죽 구속이 몸에 달라붙는다! -The high-tech cables wrap themselves over your body! -하이테크 케이블이 당신의 몸을 감싸고 있습니다! -The slime pours all over you! -점액이 온통 쏟아져요! -The magic chains wrap themselves around your body! -마법의 사슬이 당신의 몸을 감쌉니다! -Your clothes are getting ripped away! -옷이 찢어지고 있어요! -You feel a prick as a small dart hits you, and you start feeling drowsy... -작은 다트가 당신을 때리자 따끔거리는 느낌이 들고 졸음이 오기 시작합니다... -You breathe in the gas, and a wave of pleasure hits your whole body. -가스를 들이마시면 쾌감의 물결이 온몸을 강타합니다. -You breathe in the gas, and feel lethargic... -당신은 가스를 들이마시고 무기력함을 느낍니다... +Blessed Wrappings (Gag) +축복받은 포장지(개그) +### A band of magic embalming ribbon wrapped tight over mouth. Can be used on vulnerable targets from quick inventory or hotbar. -Inventory -인벤토리 -Reputation -평판 -Spells -주문 -Learn New Spells -새로운 주문 배우기 -Click a spell to replace SPELLNAME with. -SPELLNAME을 대체할 주문을 클릭하십시오. -Empty Slot -빈 슬롯 -Back to Spellbook -주문서로 돌아가기 -Return to Game -게임으로 돌아 가기 +Blessed Wrappings (Arms) +축복받은 포장(팔) +A layer of magic embalming ribbon wrapped tight around your body. +당신의 몸을 단단히 감싼 마법의 방부 처리 리본. +Blessed Wrappings (Feet) +축복받은 포장지(발) +A layer of magic embalming ribbon wrapped tight around your shins. +정강이를 단단히 감싸는 마법의 방부 처리 리본. +Blessed Wrappings (Toes) +축복받은 포장지(발가락) +A layer of magic embalming ribbon wrapped tight around your feet. +발에 단단히 감긴 마법의 방부 처리 리본. +### Blessed Wrappings (Hands) +### A layer of magic embalming ribbon wrapped tight around your hands. -Spell Tree -주문 트리 -Elemental Spells -원소 주문 -Conjuration Spells -컨저레이션 주문 -Illusion Spells -일루전 마법 -Upgrades -업그레이드 -Perks -특전 -Perks II -특전 II -Perks III -특전 III +Blessed Wrappings (Legs) +축복받은 포장지(다리) +A layer of magic embalming ribbon wrapped tight around your thighs. +허벅지를 단단히 감싸는 마법의 방부 처리 리본. +### Living Blessed Wrappings Collar -pg. NUM/TOTAL -페이지.NUM/총계 -Spell Points: SPELLPOINTS -주문 포인트: SPELLPOINTS -You need a higher level in SCHOOL magic to learn this spell. -이 주문을 배우려면 더 높은 수준의 SCHOOL 마법이 필요합니다. -You need more spell points. -주문 포인트가 더 필요합니다. -You don't have enough maximum mana to cast this spell! -이 주문을 시전하기에는 최대 마나가 부족합니다! -School: -학교: -Elements -집단 -Conjuration -주문 -Illusion -환각 -Generic -일반적인 -Learn Spell -마법 배우기 -Spell Points: -주문 포인트: +### This collar is designed to make sure its wearer does not escape their wrappings. +### It will occasionally cause blessed wrappings to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of blessed wrappings you have on you. -Level: -수준: -Spell Point Cost: -주문 포인트 비용: - Mana Cost: - 마나 비용: +### Tape (Hands) +### Sleek and shiny tape for the bondage enthusiast. +### A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. -Remove Spell 1 -마법 1 제거 -Remove Spell 2 -마법 2 제거 -Remove Spell 3 -마법 3 제거 -Remove Spell 4 -마법 4 제거 -Remove Spell 5 -마법 5 제거 -Remove Spell 6 -마법 6 제거 -Remove Spell 7 -마법 7 제거 -Replace Spell 1 -교체 마법 1 -Replace Spell 2 -교체 마법 2 -Replace Spell 3 -교체 마법 3 -Replace Spell 4 -교체 마법 4 -Replace Spell 5 -교체 마법 5 -Replace Spell 6 -교체 마법 6 -Replace Spell 7 -교체 마법 7 - Current Spell 1: - 현재 주문 1: - Current Spell 2: - 현재 주문 2: - Current Spell 3: - 현재 주문 3: - Current Spell 4: - 현재 주문 4: - Current Spell 5: - 현재 주문 5: - Current Spell 6: - 현재 주문 6: - Current Spell 7: - 현재 주문 7: - -??? -??? -Unfiled -정리되지 않은 -Bondage Witchery -속박 마술 -Enemy Notes -적 노트 -Graveyard -묘소 -Catacombs -카타콤 -Jungle -밀림 -Temple -절 -Graveyard -묘소 -Graveyard -묘소 -Graveyard -묘소 -Graveyard -묘소 -Graveyard -묘소 -Graveyard -묘소 -Mansion -맨션 -Tombs -무덤 -Library -도서관 -Crystal Cave -크리스탈 케이브 -Graveyard -묘소 -Graveyard -묘소 -Graveyard -묘소 -Graveyard -묘소 -Graveyard -묘소 -Graveyard -묘소 -Graveyard -묘소 +### Tape (Arms) -(Preface from the journal of Catherine Willows, well-known explorer who vanished in the dungeon 30 years ago) I am writing this journal in the off chance that I do not come back in my search for the Mistress' staff. If you find this, please make an effort to deliver it back to the surface for the good of all the young women lured by its secrets. -(30년 전 던전에서 사라진 저명한 탐험가 캐서린 윌로우스의 일지 ​​서문) 여주인의 지팡이를 찾으러 돌아오지 못할까봐 이 일기를 쓰고 있습니다. 이것의 비밀에 이끌린 모든 젊은 여성들의 이익을 위해 그것을 지상으로 되돌려 놓도록 노력해 주십시오. -(Pg. 24 from Catherine Willows' journal) Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?' -(Catherine Willows의 일지에서 24페이지) 여주인의 무덤 위층을 흙손질하는 많은 사람들은 종종 수사학적으로 묻습니다. '보물 상자를 지키는 이상하고 변태적인 함정이 있는 이유는 무엇입니까? 침입자?' -(Pg. 25 from Catherine Willows' journal) ...They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence. -(Catherine Willows의 일지에서 25페이지) ...그들은 중대한 실수를 저질렀습니다. 보물 상자는 갇혀 있는 것이 아니라 금으로 가득 차 있습니다. 그리고 우리는 금이 신에게 기쁨이 된다는 것을 압니다. 정령으로 알려진 하급 신들도 금을 사랑하지만 우리가 알고 있는 신들과는 달리 이 하급 정령들은 제단에서 금을 소비할 수 없습니다. 신이 할 수 있는 것처럼 단번에 급습합니다. 따라서 그들은 금이 있는 곳에 물리적으로 거주하여 천천히 즐거운 본질을 빼내야 합니다. -(Pg. 26 from Catherine Willows' journal) So the question is not why did somebody lay these traps. The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. -(Catherine Willows의 일지에서 26페이지) 따라서 질문은 누군가가 왜 이러한 함정을 설치했는가가 아닙니다. 답은 함정이 전혀 아니라는 것입니다. 그리고 옛 문명이 멸망하고 단지 전체가 땅속으로 가라앉았을 때, 더 이상 영혼을 쫓아내고 그들이 위층에 거주하는 것을 막을 사람이 없었습니다. 정령의... 우리는 여주인이 자신을 둘러싸고 있는 것이 무엇인지 알고 있습니다. -(The note starts with a drawing of a witch with many chains hanging from her body) She can block melee attacks with her chains. However, they conduct lightning and heat directly to her body, and I was able to take out her chains with bolt cutters. -(노트는 그녀의 몸에 많은 사슬이 매달린 마녀의 그림으로 시작됩니다) 그녀는 그녀의 사슬로 근접 공격을 막을 수 있습니다. 그러나 그들은 그녀의 몸에 번개와 열을 직접 전달합니다. 나는 그녀의 사슬을 볼트 절단기. -(The note starts with a drawing of a witch with lightning crackling from her fingertips) Water will cause her to short-circuit. I can't seem to hit her with lightning, though. She always redirects it. -(노트는 손끝에서 번개가 치직거리는 마녀의 그림으로 시작합니다.) 물은 그녀를 단락시킬 것입니다. 하지만 번개로 그녀를 칠 수는 없는 것 같습니다. 그녀는 항상 방향을 바꿉니다. -(The note starts with a drawing of a witch whose body is partly gelatinous) The slime is non-flammable and my attacks pass right through her body... Lightning and ice seem to be effective! -(노트는 몸이 부분적으로 젤라틴인 마녀의 그림으로 시작됩니다.) 슬라임은 불연성이며 내 공격은 그녀의 몸을 바로 통과합니다... 번개와 얼음이 효과적일 것 같습니다! -(The note is from a famous escape artist) Many restraints are applied quite tightly by a skilled rigger. Even removing it will be tough without thrashing around a bit to loosen it. -(유명한 탈출 예술가의 노트) 많은 구속은 숙련된 리거에 의해 꽤 단단하게 적용됩니다. 그것을 풀기 위해 약간의 몸부림을 치지 않고서는 그것을 제거하는 것조차 힘들 것입니다. -(The note is from a famous escape artist) Anything can be unbuckled with enough patience. Having a finger extension such as a lockpick will help. Ultimately, though, what matters is that you have a calm state of mind, free from distraction and hopelessness. -(유명한 탈출 예술가의 쪽지) 인내심만 있으면 뭐든지 풀 수 있습니다. 자물쇠 따개 같은 손가락 확장 장치가 있으면 도움이 됩니다. 가망 없음. -(The note is from a famous cartographer) In my lapse of judgement, I decided to borrow some mana from the nearby shrine to the Latex goddess. While there was no immediate response to my faux pas, I soon found myself pursued by a swarm of slimes! -(유명한 지도 제작자가 보낸 쪽지) 판단력이 부족하여 인근 신사에서 라텍스 여신에게 마나를 빌리기로 결정했습니다. 내 실수에 즉각적인 반응이 없었지만 곧 떼에게 쫓기고 있음을 발견했습니다. 슬라임! -(A letter between bandit leaders) One of my subordinates has been reporting a girl bound in heavy leather restraints running around. I told her that this is normal, people keep all kinds of servants around here. But definitely keep an eye out for intruders! Don't let them fool you! -(도적 두목 사이의 편지) 내 부하 중 한 명이 무거운 가죽 구속에 묶인 소녀가 뛰어다니고 있다고 보고했습니다. 나는 그녀에게 이것이 정상이며 사람들이 이 주변에 모든 종류의 하인을 두었다고 말했습니다. 하지만 침입자를 확실히 주시하십시오. ! 속지 마세요! -(The note is a letter from the school of conjuration) We really would like to know... why did you summon a frog in the laboratory? People are wondering, you know. One of the student's projects got eaten. -(노트는 요술 학교에서 온 편지입니다) 우리는 정말 알고 싶습니다... 왜 실험실에서 개구리를 소환했습니까? 사람들이 궁금해하고 있습니다. 학생의 프로젝트 중 하나가 먹혔습니다. -(You find a carving on the floor, a half-finished magic circle of celestial conjuration. Perhaps a cleric wished to call forth an angel for guidance, before realizing there was a shrine a short walk away, where she could contact the heavens much more easily.) -(당신은 바닥에서 반쯤 완성된 천체 소환 마법진 조각을 발견했습니다. 아마도 한 성직자가 천사를 불러 안내를 받고 싶었을 것입니다. 더 쉽게.) -(It looks like a... receipt) Thank you for your offering to CELESTIAL COMMERCE. Please accept this fine-quality steel blade as compensation for your continued devotion and selflessness. -(...영수증인 것 같습니다) CELESTIAL COMMERCE에 제공해주셔서 감사합니다. 당신의 지속적인 헌신과 이타심에 대한 보상으로 이 고급 강철 칼날을 받아주세요. -(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter than she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. -(필기체 쪽지) 우리 택배기사를 폭행하고 묶인 분께: 환상의 여신의 사당은 이런 식으로 사용해서는 안 됩니다. 음란한 실험 대상을 원하신다면 시도해보세요 그러니 현지인 중 한 명에게 제발 그녀를 묶기 위해 천사 택배를 부르지 마세요. 그녀가 동의했는지, 당신이 돈을 지불했는지는 중요하지 않습니다. 우리 택배는 그들이 수행해야 할 책임이 있습니다. 서명: HERONA, GODDESS of ILLUSIONS의 집행자. -(From an essay titled 'On Celestial Supply Chains') It is known that the heavens seek gold. We do not know why it is that the heavens seek it, but we do know that the Goddesses grant us fragments of their limitless power in exchange for this otherwise-useless metal we dredge up from the earth. They care about it so much that shrines are commonplace, each hosting an angelic courier lying in wait for any adventurer willing to part with hers. -('On Celestial Supply Chains'라는 제목의 에세이에서) 하늘이 금을 찾는다는 것은 알려져 있습니다. 우리는 하늘이 금을 찾는 이유를 알지 못하지만, 여신들이 우리에게 그들의 무한한 힘의 조각을 허락한다는 것은 압니다. 우리가 땅에서 굴착한 이 쓸모없는 금속과 교환하세요. 그들은 그것에 너무 신경을 써서 성소가 흔하고, 각 성소에는 그녀와 헤어질 모험가를 기다리고 있는 천사 같은 짐꾼이 기다리고 있습니다. -They say that the maiden who safeguards the graveyard is kind to her pets... -묘지를 지키는 처녀는 애완동물에게 친절하다고 하던데... -They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Blink out of jail and into the hallway where they kept all my things! -그들은 그들이 내 전설적인 검을 가질 수 있다고 생각했지만... 바보들은 내 다리를 묶는 것을 잊었습니다! 나는 블링크를 감옥에서 나와 그들이 내 모든 것을 보관한 복도로 들어갈 수 있었습니다! -I am writing this from inside prison. Who would have known they cared so much about me using a shrine? Sheesh. -감옥 안에서 이 글을 씁니다. 성소를 쓰면서 이렇게까지 신경을 쓰는 줄 누가 알았겠습니까? 쳇. +### Tape (Legs) -(A drawing of a bunch of zombies, ordered by danger level. Of note are a zombie surrounded by charms, a zombie surrounded by talismans, a zombie warrior with a sword, and... some kind of shrine maiden that you've never seen before) -(위험 수준에 따라 정렬된 좀비 무리의 그림입니다. 부적에 둘러싸인 좀비, 부적에 둘러싸인 좀비, 칼을 든 좀비 전사, 그리고... 이전에 본 적이없는) +### Tape (Feet) -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE) The first thing to understand is that tying someone up is difficult if they are not in a vulnerable position. If your opponent is vulnerable, then binding will be twice as effective! -(BONDAGE WITCHERY: A STUDENT'S GUIDE에서 발췌) 가장 먼저 이해해야 할 것은 취약한 위치에 있지 않은 사람을 묶는 것은 어렵다는 것입니다. 상대가 취약한 경우 바인딩은 두 배의 효과가 있습니다! -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE) Once your opponent is nicely trussed up, you can break their will by ticking them with a Feather, Ice Cube, or Magic Wand. -(BONDAGE WITCHERY: A STUDENT'S GUIDE에서 발췌) 상대가 잘 묶이면 깃털, 아이스 큐브 또는 요술 지팡이로 상대의 의지를 꺾을 수 있습니다. -(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE) Bigger and more resilient opponents are much more effective at breaking out of your binds. Try to deal some damage to them to decrease the speed at which they struggle out of your restraints. -(BONDAGE WITCHERY: A STUDENT'S GUIDE에서 발췌) 더 크고 탄력 있는 상대는 당신의 속박에서 벗어나는 데 훨씬 더 효과적입니다. 그들에게 약간의 피해를 주어 그들이 당신의 속박에서 벗어나는 속도를 줄이십시오. +### Tape (Head) +### Sleek and shiny tape for the bondage enthusiast. Can be used on vulnerable targets from quick inventory or hotbar. -(A drawing of a suit of armor. It reads: DO NOT TRUST) -(갑옷 그림. 읽습니다: 신뢰하지 마십시오) -(The note starts with a drawing of a witch in dark robes with bright pink hair) A necromancer. Powerful spellcaster, weak up close. -(노트는 밝은 분홍색 머리에 어두운 로브를 입은 마녀의 그림으로 시작합니다.) 사령술사. 강력한 주문 캐스터, 가까이서 약합니다. -I can't count how many skeletons I've bashed with my hammer today. They seem so fragile... -오늘 망치로 얼마나 많은 스켈레톤을 두들겼는지 셀 수 없습니다. 너무 연약해 보여요... -(The note is scrawled with wiggling lines) IT SEES ME. I SHOULDN'T HAVE DEFILED THE ROPE GODDESS' ALTAR! -(흔들리는 선으로 메모가 휘갈겨져 있습니다) 저를 봅니다. 로프 여신의 제단을 더럽히지 말았어야 했어요! -It is said that fire and water are opposite planes, but I've noticed that the relation is more lopsided than 'equal and opposite' when they physically manifest. Water elementals resist fire, obviously, but fire elementals are weak to water! It is almost as if the abundance of water in this world causes the fire elementals to become weaker than in their home plane... -불과 물은 정반대라는 말이 있는데, 물리적으로 발현했을 때 '동등'보다 관계가 더 한쪽으로 치우쳐 있다는 것을 알아차렸습니다. 물의 정령은 불에 저항하는 것이 당연하지만 불의 정령은 물에 약합니다! 마치 이 세계의 풍부한 물이 불의 정령을 고향 차원보다 약하게 만드는 것 같습니다... -A drawing of many icicles around pools of water. It instructs you to avoid the pools of water and you can see a figure surrounded by ice shards in the distance being set on fire and smashed with a hammer. -물웅덩이 주변에 많은 고드름이 그려져 있습니다. 물웅덩이를 피하라는 지시를 내리며 멀리서 얼음 조각에 둘러싸인 형체가 불타고 망치로 부수는 모습을 볼 수 있습니다. -The shadow spirits' touch is cold as ice... I have wondered if this temperature property applies to their destructive effects on other types of beings. Unfortunately, I found out the hard way when I tried to summon a shadow creature against an ice elemental... -그림자 정령의 손길은 얼음처럼 차갑습니다... 이 온도 속성이 다른 유형의 존재에 대한 파괴적인 영향에 적용되는지 궁금했습니다. 불행히도 얼음에 대항하여 그림자 생물을 소환하려고 시도했을 때 어려운 방법을 발견했습니다. 원소 같은... -I was being chased by something fast and heavy, and it was about to crush me when I tossed an Ice Shard behind me. It stopped and I didn't care to look back. -나는 빠르고 무거운 무언가에게 쫓기고 있었고, 내가 얼음 조각을 내 뒤로 던졌을 때 그것이 나를 깔아뭉개려고 했다. 그것이 멈췄고 나는 뒤돌아볼 생각도 하지 않았다. -I was walking in the library when I got attacked by a magic book! Fortunately my sword seemed to disapatch it quickly, and I used my spear to stab another one shortly after. -도서관을 걷고 있을 때 마법책의 공격을 받았어요! 다행히도 제 검이 마법책을 빨리 흩어버리는 것 같았고, 얼마 지나지 않아 제 창으로 다른 마법책을 찔렀습니다. -SOMEBODY STABBED MY FROG AND I AM PISSED. -누군가가 내 개구리를 찔렀는데 화가 났어요. -I don't think it's neccessary to tell people that dragons resist fire... right? -드래곤이 불에 약하다고 사람들에게 말할 필요는 없을 것 같은데…? -I've been studying the dragonheart's weaknesses. So far I've found that the ones bearing the powers of ice dragons are actually weak to fire unlike the others, and the ones who summon crystals to block attacks are nonetheless unable to grab a spear to stop it from reaching them. -드래곤하트의 약점을 연구해왔습니다. 지금까지 아이스드래곤의 힘을 지닌 이들은 사실 다른 이들과 달리 불에 약하고, 수정을 소환하여 공격을 막는 이들은 창을 잡지 못하는 것으로 나타났습니다. 닿지 못하도록. +### Tape Gag -They say a ninja can catch a sword in her hands, but can she stop a spear? Ha, thought not! -닌자는 손에 검을 잡을 수 있다고 하지만, 창은 막을 수 있단 말인가? 하, 생각하지 못했다! -(Pg. 54 from Catherine Willows' journal): The post-collapse civilization sought immortality, but they knew that the technologies of the old civilization were a danger to them. So they turned to another school of thought: Magic. -(Catherine Willows의 일지에서 54페이지): 붕괴 후 문명은 불멸을 추구했지만, 그들은 구 문명의 기술이 그들에게 위험하다는 것을 알고 있었습니다. 그래서 그들은 다른 학파인 마법으로 눈을 돌렸습니다. -(Pg. 55 from Catherine Willows' journal): Silk wrappings, enchanted with ten-thousand microscopic runes per cubit, were suffucient to protect their bodies from ageing for millenia. What they didn't realize was that the magic didn't protect their souls. -(Catherine Willows의 일지에서 55페이지): 큐빗당 10,000개의 미세한 룬이 새겨진 실크 포장은 수천 년 동안 몸이 노화되는 것을 방지하기에 충분했습니다. 그들이 깨닫지 못한 것은 마법이 보호하지 못한다는 것입니다. 그들의 영혼. -(Pg. 56 from Catherine Willows' journal): They have no clue what they are doing anymore. To them, this is just another one of their ten-thousand dreams across the aeons. They can no longer tell reality from imagination. -(Catherine Willows의 일지 56페이지): 그들은 더 이상 자신이 무엇을 하고 있는지 전혀 모릅니다. 그들에게 이것은 영겁에 걸친 그들의 만 가지 꿈 중 하나에 불과합니다. 그들은 더 이상 상상과 현실을 구분할 수 없습니다. -Ninjas aren't so tough to fight when their hands are tied behind their back. Good thing I had my pet slime with me~ -닌자는 손이 등 뒤로 묶이면 그렇게 힘들지 않아. 애완용 슬라임이 있어서 다행이야~ -(Pg. 12 from Catherine Willows' addendum): After studying the ancient race of catlike people, I have come to the conclusion that their race met a dual fate. All of them received eternal life in some form or another. To one half it manifested as a blessing, allowing them to walk the halls. To the other it became a curse to them, trapping them in runic wrappings for all eternity. -(Catherine Willows의 부록에서 12페이지): 고양이 같은 고대 종족을 연구한 후, 나는 그들의 종족이 이중 운명을 만났다는 결론에 도달했습니다. 그들 모두는 어떤 형태로든 영생을 받았습니다. 그것은 축복으로 나타나 그들이 복도를 걸을 수 있게 했고, 다른 이들에게는 저주가 되어 그들을 영원히 룬문자에 가두었습니다. -(Pg. 13 from Catherine Willows' addendum): I must issue a correction to the statements written in my journal. The ancients knew what they were doing. Those that were cursed, are blessed, and those who were blessed, are cursed. -(Catherine Willows의 부록에서 13페이지): 내 일지에 적힌 진술을 정정해야 합니다. 고대인들은 자신이 무엇을 하고 있는지 알고 있었습니다. -(It's a copy of an ancient illustration, depicting a cat goddess, an elven goddess, and two groups of catgirls. One group is smiling and standing on pedestals. The other group is frowning and wearing armor meant for war. It looks unfinished, like the author was suddenly grabbed from behind while drawing it) -(고양이 여신, 엘프 여신, 두 그룹의 고양이 소녀를 묘사한 고대 일러스트레이션의 사본입니다. 한 그룹은 미소를 지으며 받침대에 서 있습니다. 다른 그룹은 눈살을 찌푸리고 전쟁용 갑옷을 입고 있습니다. 미완성으로 보입니다. 작가님이 그리다가 갑자기 뒤에서 잡아당긴듯) -(It's a interlinear translation of an ancient letter) Your highness, I have delivered to you the prisoners that you have asked. They are the worst of the worst--thieves, slanderers, sorcerers and seducers. But I must inquire, why is it that we must wrap them in silken scarves, worth twenty gold pieces each? Surely they are being handed over to be disciplined, not to be anointed? -(고대 문자의 행간 번역입니다.) 전하, 저는 당신이 요청한 죄수들을 당신에게 인도했습니다. 그들은 최악의 최악의 도둑, 중상, 마법사, 유혹자입니다. 그러나 나는 묻고 싶습니다. 왜 그것들을 각각 이십 금씩이나 하는 비단 스카프로 싸야 하겠느냐 그들이 기름부음을 받으려 하지 않고 징계하라고 넘겨지는 것이 아니냐 -(It's a record of an interview)|ME: Why are you like this?|MUMMY: Because we are blessed!|ME: Blessed? You've been wrapped up for thousands of years!|MUMMY: A thousand years is nothing compared to the glory that will come!|ME: Why do you have to be wrapped up? There are plenty of you who aren't...|MUMMY: The chosen ones will inherit the land when the goddess returns. -(인터뷰 기록입니다)|나: 왜 이러세요?|엄마: 우리는 축복받았으니까!|나: 축복받았어요? 당신은 수천년 동안 싸여 있었어요!|엄마:천년은 아무것도 아니에요 다가올 영광에 비하면!|ME: 왜 감싸야 합니까? 그렇지 않은 분들이 많이 계십니다...|MUMMY: 여신이 돌아올 때 선택받은 자들이 땅을 물려받게 될 것입니다. -(It's a record of an interview)|ME: Which goddess are you referring to? The goddess of restoration?|MUMMY: The blessed kitty.. she was promised to rule over the lesser goddesses.|ME: Lesser goddesses? Which ones?|MUMMY: YOUR goddesses. The ones you humans created that should not be. Ours is the true offspring of the creators, a goddess created to rule! -(인터뷰 기록입니다)|ME: 어느 여신 말씀이신가요? 회복의 여신?|MUMMY: 축복받은 고양이.. 하급 여신을 다스리기로 약속받았습니다.|ME: 하급 여신? 어느 분 ?|미라: 당신의 여신들. 당신들이 인간이 창조한, 있어서는 안 되는 존재들. 우리는 창조주의 진정한 자손, 통치하기 위해 창조된 여신입니다! -(It's a record of an interview)|ME: What of the elves? Don't they talk about a 'kingdom' too?|MUMMY: Who are the elves?|ME: You know, pointy ears, green hair, a heck of an attitude... they seem in tune with nature.|MUMMY: They sound arrogant.|ME: They are.|MUMMY: Perhaps they know nothing of the promise between our goddess and theirs. -(인터뷰 기록입니다)|ME: 엘프는요? '왕국'에 대해서도 얘기하지 않나요?|MUMMY: 엘프는 누구죠?|ME: 있잖아, 뾰족한 귀, 초록색 머리, 굉장한 태도...그들은 자연과 조화를 이루는 것 같습니다.|MUMMY: 거만하게 들리네요.|ME: 그렇습니다.|MUMMY: 아마도 그들은 우리 여신과 그들의 여신 사이의 약속에 대해 아무것도 모르는 것 같습니다. -(It's a medical record) Patient seems stable... application of the enchanted cloth seems to have stopped the bleeding. It appears that the ancient magic suppresses all forms of injury, even in humans, until it is taken off. -(의료기록입니다) 환자는 안정되어 있는 것 같습니다... 마법이 부여된 천을 바르면 출혈이 멈춘 것 같습니다. 고대의 마법은 모든 형태의 부상을 억제하는 것 같습니다. +### Tape Mouth Wrap -Those damn slimes! They're so sticky and gross... fortunately, I washed myself in the fountain the last time I got caught by one. It came right off! -이 빌어먹을 슬라임들! 너무 끈적끈적하고 징그러워... 다행스럽게도 지난번에 덫에 걸렸을 때 분수대에서 몸을 씻었지. 바로 떨어졌어! -The dragonhearts were a group of dragonslayers, named for their ritual that imbues them with the fiery power and resistance of dragons they've slain. Now they work as mercenaries, and some of them serve a certain Leather goddess. -드래곤 하트는 드래곤 슬레이어 그룹이었으며, 그들이 죽인 드래곤의 불타는 힘과 저항력을 그들에게 부여하는 의식에서 이름을 따왔습니다. 이제 그들은 용병으로 일하고 있으며, 그들 중 일부는 특정 가죽 여신을 섬기고 있습니다. -Yes! I've done it! I have created another red slime! I shall call him Fred, yes, Fred... after the slime I lost in a Shield-related accident a while back... poor Fred... I miss him. -그래! 해냈어! 내가 또 다른 빨간 슬라임을 만들었어! 나는 그를 프레드라고 부를 거야, 그래, 프레드... 얼마 전에 실드 관련 사고로 잃어버린 슬라임을 따서... 불쌍한 프레드... 그가 그리워요. -(Pg. 70 from Catherine Willows' journal): The underground jungle is a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through? -(Catherine Willows의 일지에서 70페이지): 지하 정글은 기이한 현상입니다. 그럼에도 불구하고 천장의 갈라진 틈을 통해 쏟아지는 빛의 수준은 식물을 유지하기에는 너무 희박합니다. 그러나 복원의 여신은 그녀의 고대 지혜에서 이 장소를 보존하기로 결정했습니다. 내가 단지 통과하고 있다는 것을 그녀가 깨달을 때까지 그녀의 드라이어드 중 몇 개를 뚫거나 태워야 합니까? -The unseen maid is the deadliest. -보이지 않는 메이드가 가장 치명적입니다. +### Tape Wrapping (Toes) +### Tape Wrapping (Head) -(The note is blank) -(메모가 비어 있습니다) -The note reads: Mmmmmmmph! Mmmm! MMMMMPH!!!!-- (The entire note is just gagged mumblings...) -메모 내용: 으으으음! 으으으! 으으으음!!!!-- (메모 전체가 재갈을 물린 웅얼거림일 뿐...) -(The note is illegible) -(메모를 읽을 수 없음) -(The note contains a map of a previous floor) -(노트에는 이전 층의 지도가 포함되어 있습니다) -(The note is smeared with some kind of liquid) -(노트에 어떤 종류의 액체가 묻어 있습니다) -(The note contains a cryptic riddle that makes no sense) -(메모에는 말도 안 되는 비밀스러운 수수께끼가 포함되어 있습니다) -(The note contains a list of the writer's likes/dislikes and hard limits) -(노트에는 작가의 좋아요/싫어요 및 하드 제한 목록이 포함되어 있습니다) -The note reads: Please take this beautiful doll somewhere and play with her~ -메모 내용: 이 아름다운 인형을 어디론가 데려가서 놀아주세요~ -(The note contains a manual on fencing. You have always been a terrible fencer) -(노트에는 펜싱에 대한 설명서가 들어 있습니다. 당신은 항상 끔찍한 펜싱 선수였습니다) -(The note contains a magic spell you were taught never to cast under any circumstances) -(노트에는 어떤 상황에서도 절대 걸지 말라고 배운 마법 주문이 들어 있습니다) +### Tape Wrapping (Arms) -The item requires 5 keys and free hands to remove -항목을 제거하려면 5개의 열쇠와 자유로운 손이 필요합니다. -The item is extremely secure with five separate keyholes. -이 항목은 5개의 개별 열쇠 구멍으로 매우 안전합니다. -You insert your 5 keys into the lock and the item finally comes off. -열쇠 5개를 자물쇠에 넣으면 드디어 물건이 벗겨집니다. +### Tape Wrapping (Feet) -This item is tickling you without end! -끝없이 간지럽히는 아이템! -This item inflicts psychic damage when you attack or cast a spell! -이 아이템은 당신이 공격하거나 주문을 시전할 때 심령 피해를 입힙니다! +### Tape Wrapping (Legs) -The item is sealed with a locking spell! You will need a key to dispel the magic. -아이템은 잠금 마법으로 봉인되어 있습니다! 마법을 해제하려면 열쇠가 필요합니다. -You tug on the item but it is magically sealed to your body! -아이템을 잡아당기면 마법처럼 몸에 봉인됩니다! -You insert your magic key into the lock and the item finally comes off! -자물쇠에 마법의 열쇠를 넣으면 드디어 물건이 벗겨집니다! +### Living Tape Collar -The item is protected by a seal of Determination. You must have maximum willpower to remove it. -이 항목은 결의의 인장으로 보호됩니다. 제거하려면 최대한의 의지가 있어야 합니다. -You are unable to muster the willpower to bypass the seal... -당신은 봉인을 우회할 의지력을 소집할 수 없습니다... -Feeling determined, you override the seal and release the item! -결심한 마음으로 봉인을 해제하고 아이템을 해제하십시오! +### This collar is designed to make sure its wearer does not escape their tape. -The lock is protected by a revanent seal. You'll need 25 ectoplasm to disenchant it. -그 자물쇠는 원령 봉인으로 보호되어 있습니다. 마력을 추출하려면 25개의 엑토플라즘이 필요합니다. -Your fingers pass right through the collar. Pity your neck doesn't pass through it. -당신의 손가락은 목걸이를 통과합니다. 목이 통과하지 않는 것이 유감입니다. -You channel ghastly energy into the lock and break the seal!!! -당신은 무시무시한 에너지를 자물쇠에 쏟아부어 봉인을 부수고 있습니다!!! +### It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. -The item seems to drain divine energy from shrines. Maybe that has something to do with it. -신사에서 신성한 기운을 빨아들이는 아이템인 것 같습니다. 그것과 관련이 있는 것 같습니다. -The collar is enchanted with multiple layers of magical seals. -목걸이는 여러 겹의 마법 봉인으로 매혹되어 있습니다. -The collar has absorbed enough energy and pops off! -목걸이가 충분한 에너지를 흡수하고 튀어나옵니다! -That item cant be used. -그 아이템은 사용할 수 없습니다. -You're not sure how to use this key. -이 키를 사용하는 방법을 잘 모르겠습니다. -As soon as you touch the key, all of your gold locks fade to blue! -열쇠를 만지는 순간 모든 금색 자물쇠가 파랗게 변합니다! -You realize there is no keyhole on the device, simply a lock-shaped sigil. -당신은 장치에 열쇠 구멍이 없고 단지 자물쇠 모양의 인장이 있다는 것을 알고 있습니다. -The item loosens and falls off, but you see a red sigil flash and the key suddenly teleports away! -아이템이 헐거워져 떨어지지만 빨간색 인장이 번쩍이고 열쇠가 갑자기 순간이동합니다! -You have in your possession KeyAmount magical, ornate key(s). You might as well try... -당신은 KeyAmount 마법의 화려한 열쇠를 소유하고 있습니다. 시도하는 것이 좋습니다... -You have KeyAmount key(s) for this item. -이 항목에 대한 KeyAmount 키가 있습니다. +### Autotape -The angel helps you struggle and use items -천사는 당신이 고군분투하고 아이템을 사용하도록 도와줍니다 -The ghost helps you struggle and use items -고스트는 당신이 투쟁하고 아이템을 사용하도록 도와줍니다 -The ghost is unhelpful -유령은 도움이 되지 않는다 +### Comes in convenient cartridges for machine loading. -Angel: Greetings! -천사: 안녕! -Angel: Perhaps I can assist with those! -천사: 아마도 내가 그들을 도울 수 있을 것입니다! +### A specialized tape used for capturing purposes during the time of the Old Civilization. Despite its appearance, it contains a gas-permeable membrane that allows ventilation, while its hydrophobic properties resist solvents that would otherwise disrupt the adhesive bond. The adhesive layer is special in that it activates only in contact with other auto-tape, making it safer to use and remove. -Adventurer's Ghost: Well met, traveler! -모험가의 유령: 반갑습니다, 여행자님! -Adventurer's Ghost: Hello again, traveler (giggles). -모험가의 유령: 안녕하세요, 여행자님(웃음). -Adventurer's Ghost: Having fun, girl? -모험가의 유령: 재미 있니, 아가씨? -Adventurer's Ghost: Looking for some trouble, slave? -모험가의 유령: 문제가 생겼나, 노예? -Adventurer's Ghost: I see you, naughty little slave! -모험가의 유령: 당신이 보입니다, 장난꾸러기 꼬마 노예! +### Rubberized Tape -Ghost: I can try to help with those, traveler. -고스트: 내가 도와줄 수 있어, 여행자. -Ghost: Aww, you look like you're having fun... -고스트: 어우, 너 재미있어 보이는데... +### Magic Charms -Ghost: You look great in those, hehe~ -고스트: 그거 잘 어울려요 헤헤~ -Ghost: Please don't bother me. -고스트: 귀찮게 하지 마세요. -Ghost: A good slave doesn't complain. -고스트: 좋은 노예는 불평하지 않는다. +### Magical charms from the ancient graveyard. -Ghost: What's that? I don't understand. -고스트: 그게 뭐야? 이해가 안 돼. -Ghost: Silence is golden. -고스트: 침묵은 금이다. -Ghost: A good slave doesn't speak until addressed. -고스트: 좋은 노예는 말을 하기 전에는 말을 하지 않는다. -Ghost: Aww, so helpless~ -유령: 아, 너무 무기력해~ -Ghost: Trussed up like a good girl~ -유령:착한 여자처럼 묶여~ -Ghost: You're going to stay that way for a good while. -유령: 당분간은 그렇게 지내야지. -Ghost: I love watching you hop around, it's funny! -유령: 나는 네가 뛰어다니는 걸 보는 게 좋아, 재미있어! -Ghost: Just sit there like a good girl~ -고스트: 그냥 착하게 앉아~ -Ghost: I want to see you kneel~ -고스트: 무릎 꿇는거 보고싶어~ -Ghost: Aww, feeling frustrated? -유령: 아, 답답해? -Ghost: Looks like someone's been naughty~ -고스트: 누가 장난을 쳤나 보네~ -Ghost: How's it feel to be under lock and key? -고스트: 자물쇠와 열쇠 아래 있는 기분이 어때? +### Its magic is not enough to protect it from damage, but it is surprisingly effective at restraining both intruders and cursed entities. -You step on a pressure plate and a number of skeletons rise up! -압력판을 밟으면 수많은 스켈레톤들이 일어선다! -You are ambushed by bandits! -도적에게 매복당하고 있습니다! -Armed skeletons appear from passages in the walls! -벽의 통로에서 무장한 스켈레톤이 나타난다! -A wall panel falls down, and an armored skeleton appears! -벽 패널이 무너지고, 갑옷을 입은 스켈레톤이 나타난다! -You are ambushed by ninjas! -닌자에게 매복당했습니다! -A large, wriggling mess of ropes fall from the ceiling! -커다랗고 꿈틀거리는 밧줄 덩어리가 천장에서 떨어집니다! -You are ambushed by dragonhearts! -당신은 드래곤하트에게 매복당하고 있습니다! -You are ambushed by dragonhearts! -당신은 드래곤하트에게 매복당하고 있습니다! -A group of drones surround you! -드론 무리가 당신을 둘러싸고 있습니다! -You are ambushed by wolfgirls! -당신은 늑대소녀에게 매복당하고 있습니다! -You are ambushed by an alkahestor! -당신은 alkahestor에 의해 습격당했습니다! -Small blobs of slime fall from the ceiling! -작은 점액 덩어리가 천장에서 떨어집니다! -You are ambushed by slime researchers! -당신은 슬라임 연구자들에게 습격당했습니다! -A large blob of slime falls from the ceiling! -큰 점액 덩어리가 천장에서 떨어집니다! -In a puff of smoke, a group of fire elementals appear around you! -연기 한가운데 불의 정령 무리가 주변에 나타납니다! -In a flash of fog a group of ice elementals appear around you! -안개 속에서 얼음 정령 무리가 주변에 나타납니다! -In a burst of mist, a group of water elementals appear around you! -폭발하는 안개 속에서 물의 정령 무리가 주변에 나타납니다! -A group of earth elementals rise out of the ground! -대지의 정령 무리가 땅에서 솟아오른다! -You hear pouring liquid and a group of latex elementals come out of the walls! -액체가 쏟아지는 소리가 들리고 라텍스 엘리멘탈 무리가 벽에서 나옵니다! -In a flash of light, a group of air elementals appear around you! -섬광 속에서 바람의 정령 무리가 주변에 나타납니다! -Several ethereal hands appear all around you! -여러 천상의 손이 당신 주위에 나타납니다! -You have stumbled upon a conjurer's study! -당신은 마술사의 연구를 우연히 발견했습니다! -You have stumbled upon a conjurer's study! -당신은 마술사의 연구를 우연히 발견했습니다! -You are ambushed by a group of maids! -당신은 한 무리의 메이드들에게 매복당했습니다! -You are ambushed by a group of maids! -당신은 한 무리의 메이드들에게 매복당했습니다! -You are ambushed by a group of maids! -당신은 한 무리의 메이드들에게 매복당했습니다! -The Head Maid corners you! -메이드장이 당신을 모퉁이로 돌립니다! -A vine crawls from the ground, already wrapping around your feet! -덩굴이 땅에서 기어나와 이미 당신의 발을 감싸고 있습니다! +### Blessed Wrapping -You have broken a magic orb, gaining a Spell Point and angering a goddess. -당신은 마법의 구슬을 부수고 마법 포인트를 얻고 여신을 화나게 했습니다. -You have broken a magic orb, gaining a random spell and angering a goddess. -당신은 마법의 구슬을 깨뜨려 임의의 주문을 얻고 여신을 화나게 했습니다. -Choose one. She will send her minions after you. -하나를 선택하십시오. 그녀는 당신을 따라 그녀의 하수인을 보낼 것입니다. +### A layer of magic embalming ribbon. -An altar stands before you, bestowing a heavenly contract. -천상의 계약을 맺는 제단이 당신 앞에 서 있습니다. -Do you choose to accept its terms? -조건을 수락하시겠습니까? +### It clings of its own accord to intruders and naughty catgirls. -Are you sure? This choice is final. -확실합니까? 이 선택은 최종 결정입니다. +Autotape (Hands) +오토테이프(손) +Sticky tape made from a metallic material. Used to great effect in police situations. +금속 재질의 점착 테이프. 경찰 상황에서 큰 효과를 발휘합니다. +It's very sticky and seals your hands tightly, making any struggling ineffective. +그것은 매우 끈적거리고 손을 단단히 밀봉하여 고군분투하는 것을 비효율적으로 만듭니다. +Autotape (Head) +오토테이프(헤드) +### Sticky tape made from a metallic material. Used to great effect in police situations. Can be used on vulnerable targets from quick inventory or hotbar. -Yes, I will accept. -네, 받아들이겠습니다. -(Accept the contract) -(계약 수락) -I'll think about it. -나는 그것에 대해 생각합니다. +It's very sticky and tough but you could probably get a knife through it. +매우 끈적거리고 질기지만 아마도 칼로 뚫을 수 있을 것입니다. +Autotape (Arms) +오토테이프(무기) +Autotape (Legs) +오토테이프(다리) +Autotape (Ankles) +오토테이프(발목) +Autotape (Feet) +오토테이프(피트) +Autotape (Mouth) +오토테이프(입) +### Autotape (Mouth Wrap) -You are frozen! -당신은 얼었다! -You are chilled! -당신은 차갑다! -Shadowy tendrils wrap around your feet, rooting you in place!!! -그늘진 덩굴손이 당신의 발을 감싸고 당신을 제자리에 고정시킵니다!!! +### Living Auto Tape Collar -You get the feeling that someone is searching for you... -누군가가 당신을 찾고 있다는 느낌이 듭니다 ... -You hear movements all around as you realize you are surrounded!!! -당신은 당신이 둘러싸여 있다는 것을 깨달을 때 주변의 움직임을 듣습니다!!! +### It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. -There is another restraint underneath! -아래에 또 다른 구속이 있습니다! -Your restraints rub you in sensitive places as you move... -움직일 때 구속이 민감한 부분을 문지릅니다... -Indifferent -무관심한 -Angered -분노 -Enraged -성나게 하는 -Cursed -저주 받은 -Thankful -감사합니다 -Pleased -기쁜 -Blessed -축복 받은 +Stuffing +소 +### A stuffing of cloth. Can be applied on vulnerable targets or those who casted a verbal spell last turn. -Neutral -중립적 -Annoyed -짜증이 난 -Hostile -적의 -Wanted -원함 -Friendly -친숙한 -Allied -결연한 -Favorable -유리한 +You could spit it out easily, provided nothing's covering it. +아무것도 덮고 있지 않다면 쉽게 뱉어낼 수 있습니다. -You run up against the TETHER pulling you back. -당신은 당신을 뒤로 당기는 TETHER에 맞서 달려갑니다. -You are yanked back by the TETHER! -당신은 TETHER에 의해 뒤로 당겨졌습니다! -We will be going for a walk. Follow me. -산책하러 갈 거에요. 따라와요. -Don't get comfortable. Im taking you to a new cell. Follow me. -편안해하지 마세요. 새 감방으로 데려가겠습니다. 따라오세요. -We're going to have some fun. Follow me. -재미있게 놀자. 따라와. -I told you to follow me! -따라오라고 했잖아! -I said, FOLLOW ME! -나를 따라와! -I won't repeat myself -반복하지 않겠다 -Then let's put you back in your cell! -그럼 당신을 감방으로 돌려보내자! -I hope you learned your lesson. Now get your butt out of here. -나는 당신이 당신의 교훈을 배웠기를 바랍니다. 이제 여기서 당신의 엉덩이를 꺼내십시오. -You've been a good girl. I hope you don't make the same mistake again. You can leave. -당신은 좋은 여자였습니다. 다시는 같은 실수를 반복하지 않기를 바랍니다. 당신은 떠날 수 있습니다. -That's a good girl. Now behave yourself, okay? You're free to go. -착한 여자야. 이제 예의 바르게 행동해, 알았지? 넌 가도 돼. -Looks like you got yourself in a bind! (she pats your butt playfully) Go make the others happy! -곤란한 것 같군요! (장난스럽게 엉덩이를 두드리며) 가서 다른 사람들을 행복하게 해주세요! -Good girl. -착한 여자 아이. -You'll be making others happy in no time. -당신은 곧 다른 사람들을 행복하게 만들 것입니다. -You're shaping up to be a good slave. -당신은 좋은 노예가 되기 위해 준비하고 있습니다. -I wish I could take you to my room... -내 방으로 데려다 줄 수 있으면 좋겠어... -It seems your training is going well. -훈련은 잘 되고 있는 것 같군요. -Perhaps you are enjoying this, hehe. -이걸 즐기고 있을지도 몰라, 헤헤. -The EnemyName starts adding a RestraintName! -EnemyName이 RestraintName을 추가하기 시작합니다! -You're missing part of your uniform. -제복의 일부가 없어졌습니다. -The EnemyName starts to remove your RestraintName! -EnemyName이 RestraintName을 제거하기 시작합니다! -The EnemyName starts to lock your RestraintName! -EnemyName이 RestraintName을 잠그기 시작합니다! -The EnemyName locks your RestraintName with a LockType! -EnemyName은 LockType으로 RestraintName을 잠급니다! -I am going to change your restraints. Hold still! -제가 당신의 구속을 바꾸겠습니다. 가만히 계십시오! -Looks like somebody forgot to lock those~ -누가 잠그는 걸 잊었나 보군~ +### Living Mithril Collar -Got yourself in trouble, eh? -곤경에 처했어, 응? -Looks like you're shaping up to be a good girl~ -착한 여자로 변신하고 있는 것 같네~ -Oh! Looks like I've made a mistake... -아! 내가 실수한 것 같은데... -404 prisoner not found. Releasing tether. -404 죄수를 찾을 수 없습니다. 밧줄을 풀고 있습니다. +### A collar made from an almost-weightless alloy that adjusts itself to your neck. +### It will occasionally cause mithril to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of mithril you have on you. -A EnemyName appears to check on you. -EnemyName이 당신을 확인하기 위해 나타납니다. -The EnemyName leaves and locks the cell behind her. -EnemyName은 그녀 뒤에 감방을 떠나 잠급니다. +Mithril Collar +미스릴 목걸이 +A collar made from an almost-weightless alloy.. +무게에 가까운 합금으로 만든 목걸이.. +It feels comfortable but it's also really hard. +편안하지만 정말 어렵습니다. -Layered underneath: -아래에 레이어드: -Increased strictness due to: -다음으로 인해 엄격함 증가: -Mana -어디에 -Bondage -속박 -Ask for Aid -도움을 청하다 -Become a Champion -챔피언이 되십시오 -Ask -묻다 -Ask for Rescue -구조 요청 -Offer -권하다 -Offer Penance -속죄를 제안하다 -Current Champion -현재 챔피언 -Switch Champion -스위치 챔피언 +Mithril Cuffs +미스릴 커프스 +A pair of cuffs that make it easy to restrain you. +당신을 쉽게 구속할 수 있는 수갑입니다. +They feel like they aren't even there, but the material is rigid and unyielding. +그들은 거기에 없는 것처럼 느껴지지만 재료는 단단하고 단단합니다. +The enemy attaches your wrist cuffs together! +적이 당신의 손목 수갑을 묶었습니다! -Become the champion of this goddess. Capturing bound enemies will grant +1 rep. -이 여신의 챔피언이 되십시오. 묶인 적을 포획하면 담당자가 +1됩니다. -You are now the champion of the Goddess of GODDESS. -당신은 이제 여신 여신의 챔피언입니다. -For 3 rep the goddess will grant you slipperiness, boosting your struggling. -3렙 동안 여신이 당신에게 미끄러움을 부여하여 당신의 고군분투를 강화할 것입니다. -For 3 rep the goddess will grant you a key. -3렙이면 여신이 당신에게 열쇠를 줄 것입니다. -For 3 rep the goddess will grant you -3렙이면 여신님이 허락해주실거에요 -For 3 rep the goddess -3렙 여신님 -For 3 rep the goddess -3렙 여신님 -For 3 rep the goddess -3렙 여신님 -For 3 rep the goddess -3렙 여신님 -For 3 rep the goddess -3렙 여신님 +Wrist Chain +손목 체인 +A pair of cuffs keeping your arms behind your back. +팔을 등 뒤로 고정하는 수갑. +Your cuffs detatch! +수갑이 풀린다! +The enemy attaches your elbow cuffs together! +적이 당신의 팔꿈치 수갑을 붙입니다! -The goddess will fully restore your mana in exchange for AMOUNT rep -여신은 AMOUNT 담당자와 교환하여 마나를 완전히 회복시켜 줄 것입니다. -The goddess will enjoy seeing you struggle in her bonds (raises submissiveness) -여신은 당신이 그녀의 속박에서 고군분투하는 것을 보고 기뻐할 것입니다(복종을 높임) -The Goddess may decide to send an angel to help you struggle, in exchange for 10 rep -여신은 10렙의 대가로 당신의 투쟁을 돕기 위해 천사를 보내기로 결정할 수 있습니다. +Cuffs Chain +커프스 체인 +A full set of cuffs keeping your arms in a strict elbow tie! +엄격한 팔꿈치 넥타이로 팔을 보호하는 풀 세트 커프스! +Your wrists detatch, leaving your elbows still bound! +팔꿈치가 묶인 채로 손목이 분리됩니다! -The Goddess will expect you to pay AMOUNT gold for +5 rep -여신은 당신이 +5 담당자에 대해 AMOUNT 골드를 지불하기를 기대할 것입니다. -The Goddess hears your plea! -여신께서 당신의 간청을 들으십니다! -The Goddess hears your plea but has decided not to care. -여신은 당신의 간청을 듣지만 상관하지 않기로 결정했습니다. -The Goddess fills your mind with heavenly images as she channels energy through your veins. -여신은 당신의 정맥을 통해 에너지를 전달하면서 하늘의 이미지로 당신의 마음을 채웁니다. +Elbow Chain +팔꿈치 사슬 +### A pair of cuffs keeping your elbows locked together! -Time stops as an angel of heaven appears to collect your payment. -하늘의 천사가 당신의 지불금을 받기 위해 나타나자 시간이 멈춥니다. +Your elbows detatch! +팔꿈치가 분리됩니다! +The enemy attaches your wrist cuffs back together! +적이 손목 수갑을 다시 연결합니다! -You shudder and tremble as a wave of pleasure washes over you! -쾌락의 물결이 당신을 덮칠 때 당신은 몸서리를 칩니다! -You lose control of yourself as you convulse in pleasurable bliss! -즐거운 행복에 경련을 일으키면 자제력을 잃게 됩니다! -You let out a moan as you feel the ecstasy of pleasure! -쾌락의 황홀함을 느끼며 신음소리를 내는구나! -You finally let out a deep breath as you get what you've waited for! -드디어 심호흡을 하고 기다리던 것을 얻었구나! -Your whole body thrashes about as you experience long-awaited pleasure! -오래 기다려온 쾌감에 온 몸이 두근두근! -Your release comes with a bang as your body rocks back and forth! -당신의 몸이 앞뒤로 흔들릴 때 당신의 해방은 강타와 함께 온다! -You wiggle your hips in ecstasy as you experience pure bliss! -순수한 행복을 경험하면서 황홀경에 빠져 엉덩이를 흔듭니다! -You are left gasping for air as you receive your long-awaited orgasm! -오랫동안 기다려온 오르가슴을 느끼며 숨이 막힐 지경입니다! -You finally are left rocking your body wildly in sheer pleasure! -마침내 당신은 순전한 쾌락 속에서 당신의 몸을 격렬하게 흔들게 되었습니다! -A powerful wave of pleasure comes over you as you convulse in ecstasy. -황홀경에 경련을 일으키면 강력한 쾌락의 물결이 밀려옵니다. -Your breathing intensifies as you lose control of yourself! -자제력을 잃으면 호흡이 가빠집니다! -You close your eyes and breath rapidly in anticipation... -당신은 눈을 감고 기대하며 빠르게 숨을 들이쉽니다... -You tilt your head back and moan as your heart beats faster... -고개를 뒤로 젖히고 심장 박동이 빨라지면서 신음소리를 낸다... -You groan with pleasure as you approach the edge... -가장자리에 다다르자 쾌감에 신음한다... -You whimper as you rub your legs together furiously... -당신은 격렬하게 다리를 비비면서 흐느끼는군요... -You feel frustrated as the stimulation isn't quite enough... -자극이 부족해서 답답하시네요... -Your whole body shakes, but you don't quite go over the edge... -온몸이 떨리지만, 끝까지 가지 않는다... -This is starting to feel like torture... -이것은 고문처럼 느껴지기 시작했습니다... -You let out a frustrated scream as the torment continues... -고통이 계속되는 가운데 당신은 답답한 비명을 질렀습니다... -You simmer just under the edge, heart racing, breathing quickly... -당신은 가장자리 바로 아래에서 끓고, 심장이 뛰고, 빠르게 호흡합니다... -You let out an anguished moan as release dances just out of reach... -발표가 손이 닿지 않는 곳에서 춤을 추자 당신은 괴로운 신음을 내뱉었습니다... -You squirm helplessly as your futile struggles simply arouse you more... -당신의 쓸데없는 몸부림이 당신을 더 자극하기 때문에 당신은 속수무책으로 꿈틀거립니다... +Mithril Leg Cuffs +미스릴 레그 커프스 +### A pair of cuffs on your legs. -The vibration suddenly weakens. -진동이 갑자기 약해집니다. -Your toys cease vibrating abruptly. -장난감이 갑자기 진동을 멈춥니다. -The vibrators cut off suddenly, leaving you wanting. -바이브레이터가 갑자기 끊어져서 원하는 대로 남습니다. -The toys turn off at the last moment, cutting you off. -마지막 순간에 장난감이 꺼지고 당신을 차단합니다. -The toys leave you without pleasure as they turn off. -장난감이 꺼지면 즐거움이 없어집니다. -You are left feeling empty as the toys stop vibrating. -장난감이 진동을 멈추면 공허함을 느끼게 됩니다. -You stomp your foot on the ground in frustration as the vibration ceases. -진동이 멈추자 좌절감에 발을 구르며 땅을 밟습니다. -The toys leave you in agony as they cease vibrating. -장난감이 진동을 멈추면서 고통에 빠집니다. -The toys torture you by stopping at the last moment. -장난감은 마지막 순간에 멈추어 당신을 고문합니다. -The toys stop just before you lose yourself. -장난감은 정신을 잃기 직전에 멈춘다. -The toys deny you a chance to finish. -장난감은 당신이 끝낼 기회를 거부합니다. +### The enemy attaches your leg cuffs together! -You try to pleasure yourself, but your chastity belt prevents you! -당신은 자신을 즐겁게 하려고 하지만 당신의 정조대가 당신을 방해합니다! -You play with yourself... -혼자서 놀아요... -You let your hands wander for a moment... -잠시 손을 방황하게 놔두세요... -You squirm your hips and whimper in your bindings... -엉덩이를 꿈틀대고 묶인 채 흐느끼는군... -Your instincts are getting the better of you... -당신의 본능은 점점 더 좋아지고 있습니다... -Your body shudders briefly from pleasure... -쾌감에 잠시 몸이 떨린다... -You are unable to control yourself. -당신은 자신을 통제할 수 없습니다. -You play with yourself using the magic wand... -요술 지팡이로 자기 자신을 가지고 노는구나... -You would never do such a thing. -당신은 절대 그런 짓을 하지 않을 것입니다. -You try to rub your erogenous zones by squirming your legs... -다리를 꿈틀대며 성감대를 문지르려고 하다니... -Your will is draining as you crave release, but can't quite get there without help... -당신이 해방을 갈망하면서 당신의 의지는 고갈되고 있지만, 도움 없이는 거기에 도달할 수 없습니다... -Your will is draining as your heart beats faster and your body trembles... -심장 박동이 빨라지고 몸이 떨리면서 의지가 고갈되고 있습니다... -Your will is draining as you simmer just under the edge... -가장자리 바로 아래에서 끓이는 동안 의지가 고갈되고 있습니다... -Your will is draining as you crave release, and the toys continue to vibrate... -당신이 해방을 갈망함에 따라 당신의 의지는 고갈되고, 장난감들은 계속 진동합니다... -Your will is draining as the toys continue buzzing... -장난감이 계속 윙윙거리는 동안 당신의 의지는 고갈되고 있습니다... -Your will is draining as you are tormented by vibrations... -진동에 시달리면서 의지가 고갈되고 있습니다... +### Thigh Chain -A buzzing vibration wakes you up! -윙윙거리는 진동이 당신을 깨웁니다! +A pair of cuffs chaining your legs together. +다리를 묶는 수갑. +### The leg cuff chain detaches! -Your RestraintName constricts, warning you not to misbehave! -당신의 RestraintName이 오작동하지 않도록 경고하면서 수축합니다! -Your RestraintName tightens painfully to punish your misbehavior! -당신의 RestraintName은 당신의 잘못된 행동을 처벌하기 위해 고통스럽게 조입니다! -Your RestraintName punishes you for your behavior! -귀하의 RestraintName은 귀하의 행동에 대해 귀하를 처벌합니다! -Your RestraintName punishes you and warns you with a harsh beep! -귀하의 RestraintName이 귀하를 처벌하고 거친 신호음으로 경고합니다! -Your RestraintName emits a red flash, causing you to feel faint! -RestraintName이(가) 빨간색 섬광을 발산하여 기절하게 만듭니다! -Your armor makes noise as you move around! -네 갑옷은 움직일 때마다 소리를 낸다! -Your RestraintName lets out an alert! -RestraintName이 경고를 보냅니다! +Mithril Ankle Cuffs +미스릴 발목 커프스 +### A pair of cuffs on your ankles. -A golden lock fades into a blue lock on one of your restraints! -금색 자물쇠가 구속 중 하나의 파란색 자물쇠로 사라집니다! -Your command word is heard and the purple lock(s) click and fall off! -당신의 명령이 들리고 보라색 자물쇠가 찰칵 소리를 내며 떨어집니다! -Your command word is heard and the charger unlocks! -당신의 명령이 들리고 충전기가 잠금 해제됩니다! +The enemy attaches your ankle cuffs together! +적이 당신의 발목 수갑을 묶었습니다! +### Ankle Chain -Are you sure you want to attack? -공격하시겠습니까? -Are you sure you want to go to the next level? (Click self to confirm) -다음 단계로 이동하시겠습니까? (확인하려면 자체 클릭) +The ankle cuff chain detaches! +발목 커프스 체인이 분리되었습니다! +### Your ankle cuff chain is tightened and pulls your feet together! -You shudder as you apply the RestraintName to yourself... -RestraintName을 자신에게 적용하면서 몸서리칩니다... -You insert the RestraintName and close your belt's shield over it, with a click as it locks in place. -RestraintName을 삽입하고 벨트의 실드를 그 위에 닫습니다. 딸깍 소리가 나면서 제자리에 고정됩니다. -You attack the RestraintName and close your bra's shield over it, with a click as it locks in place. -당신은 RestraintName을 공격하고 그 위에 브래지어의 방패를 닫습니다. 딸깍 소리가 나면서 제자리에 고정됩니다. -You slowly put on the RestraintName, amazed at how it seems to mold to your size... -당신은 천천히 RestraintName을 착용하고 그것이 당신의 크기에 어떻게 맞춰지는지에 놀랐습니다... +### Short Ankle Chain +### A pair of cuffs chaining your feet tightly together. +### Your ankle cuff chain loosens! -You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! -당신은 헛되이 발버둥치고 있습니다. 열쇠 구멍도 없고 재료도 거의 깨지지 않습니다! -Ancient Chastity Belt -고대 순결 벨트 -You find a chastity belt, glowing magnificently, along with a strange crystal next to it. -당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 정조대를 발견했습니다. -A chastity belt of sleek, ancient design. While powered, it gives -30% miscast chance due to distraction and slowly regenerates stamina. -매끄럽고 고대 디자인의 정조대입니다. 전원이 공급되는 동안 산만함으로 인한 오시전 확률이 -30% 감소하고 스태미나가 천천히 회복됩니다. -'Belt of the devoted' -'헌신자의 허리띠' -You tug at your chastity belt, but you can't even stick a finger inside because it's so tight... -정조대를 잡아당기는데 너무 꽉 조여서 손가락 하나도 못 집어넣고... +### Living Leather Collar -Ancient Chastity Bra -고대 순결 브래지어 -You find a chastity bra, glowing magnificently, along with a strange crystal next to it. -당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 순결 브래지어를 발견했습니다. -A chastity bra of sleek, ancient design. While powered, it reduces incoming damage by 1. -매끈하고 고대 디자인의 순결 브래지어. 전원이 공급되는 동안 받는 피해가 1 감소합니다. -'Shield of the chaste' -순결의 방패 -You rub your hands along your breasts but feel only hard, unbreakable metal. -가슴을 따라 손을 문지르지만 단단하고 깨지지 않는 금속만 느껴집니다. +### A collar made of tough leather that adjusts itself to your neck. -Ancient Heels -고대 발뒤꿈치 -You find a set of glowing heels, glowing magnificently, along with a strange crystal next to it. -당신은 그 옆에 있는 이상한 수정과 함께 화려하게 빛나는 빛나는 발뒤꿈치 세트를 발견했습니다. -A pair of towering heels, enchanted with combat magic. When powered, they reduce slow level by 1, and deal 25 shadow damage on-hit with brief slow. -전투 마법이 부여된 우뚝 솟은 발뒤꿈치입니다. 전원이 공급되면 둔화 수준이 1 감소하고 적중 시 짧은 둔화와 함께 25의 암흑 피해를 입힙니다. -'Shoes of the graceful' -'우아한 신발' -You can barely stand in these heels. They are rigid, metallic, and unbreakable, yet padded on the inside. -이 발뒤꿈치는 ​​겨우 설 수 있습니다. 단단하고 금속성이며 깨지지 않지만 안쪽은 패딩 처리되어 있습니다. +### It will occasionally cause leather to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of leather you have on you. -Ancient Blindfold -고대 눈가리개 -You a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. -당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 덧대진 금속 눈가리개입니다. -A full-blackout mask. When powered, it negates accuracy penalties due to vision, boosts accuracy by +100%, and boosts melee damage by +10. -완전 암막 마스크입니다. 전원을 켜면 시야로 인한 정확도 페널티가 무효화되고 정확도가 +100% 증가하며 근접 피해가 +10 증가합니다. -'Mask of the Warrior' -'전사의 가면' -You tug at the mask but it won't come off. It's molded so close to your face that no light shines through! -마스크를 잡아당겨도 벗겨지지 않습니다. 마스크가 얼굴에 너무 밀착되어 빛이 비치지 않습니다! +Leather Cuffs +가죽 커프스 +### Made of tough leather. -Ancient Muzzle -고대 총구 -You find a muzzle with a long rubbery plug on the inside, glowing magnificently, along with a strange crystal next to it. -당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 긴 고무 마개가 있는 총구를 발견했습니다. -A muzzle that seals over the face tightly. When powered, it regenerates mana, boosts sneak, and multiplies damage dealt to unaware enemies by 2.5x. -얼굴을 단단히 봉인하는 총구. 전원을 공급하면 마나를 회복하고 은신을 강화하며, 알지 못하는 적에게 주는 피해가 2.5배 증가합니다. -'Muzzle of the Saboteur' -'사보추어의 총구' -You claw at your face, but not only does the soft plug fill your mouth completely, the muzzle itself is nigh-unbreakable! -당신은 당신의 얼굴을 발톱으로 할퀴지만, 부드러운 마개는 당신의 입을 완전히 채울 뿐만 아니라, 주둥이 자체는 거의 부서지지 않습니다! -Ancient Gag -고대 개그 -You find a ball gag harness with a long rubbery plug instead of a ball, glowing magnificently, along with a strange crystal next to it. -공 대신 긴 고무 플러그가 달린 볼 개그 하네스를 발견하고 그 옆에 이상한 수정과 함께 화려하게 빛납니다. -A gag that fills the mouth. When powered, regens mana, reduces miscast by 30%, and boosts damage to enemies that are stunned, frozen, bound, or slowed by 30%. -입을 가득 채우는 재갈. 전원이 공급되면 마나를 재생하고, 잘못된 캐스팅을 30% 줄이고, 기절, 동결, 속박 또는 둔화 상태인 적에게 주는 피해를 30% 증가시킵니다. -'Gag of the Focused' -'집중의 개그' -You tug on the straps at your cheeks, but the straps are so tight the plug doesn't even move! -볼에 끈을 잡아당겼는데 끈이 너무 빡빡해서 플러그가 움직이지도 않습니다! -Ancient Rear Plug -에인션트 리어 플러그 -You find a huge, flexible, segmented plug, along with a strange crystal next to it. -당신은 그 옆에 이상한 수정과 함께 거대하고 유연하며 조각난 플러그를 발견했습니다. -A plug that shocks the wearer when someone disciplines them, after orgasm, and mildly when spellcasting. When powered, reduces miscast chance by 30%. -누군가가 착용자를 징계할 때, 오르가즘 후, 주문 시전 시 가벼운 충격을 주는 플러그입니다. 전원이 공급되면 잘못 시전할 확률이 30% 감소합니다. -'Plug of the Obedient' -'순종의 플러그' -You realize the magical plug has expanded inside your body. It won't come out. -당신은 마법의 플러그가 당신의 몸 안에서 팽창했다는 것을 깨달았습니다. 그것은 나오지 않을 것입니다. -Ancient Plug -고대 플러그 -You find a huge, ribbed plug, along with a strange crystal next to it. -당신은 그 옆에 이상한 수정과 함께 거대하고 늑골이 있는 마개를 발견했습니다. -A plug that denies the wearer constantly and only rarely grants release. When powered, it grants +70% magic resistance (about 40% reduction). -착용자를 지속적으로 거부하고 드물게 해제하는 플러그입니다. 전원을 공급하면 +70%의 마법 저항력을 부여합니다(약 40% 감소). -'Plug of the Perseverant' -'인내의 플러그' -You realize the magical plug has expanded inside your body. It won't come out. -당신은 마법의 플러그가 당신의 몸 안에서 팽창했다는 것을 깨달았습니다. 그것은 나오지 않을 것입니다. -Ancient Stimulator -고대 자극기 -You find a flat, round device with a hole on one side, along with a strange crystal next to it. -당신은 한쪽에 구멍이 있고 그 옆에 이상한 수정이 있는 평평하고 둥근 장치를 발견했습니다. -A device that teases the wearer for casting spells and attacking. When powered, it reduces mana and stamina costs for casting spells and attacking. -주문 시전과 공격에 대해 착용자를 놀리는 장치입니다. 전원이 공급되면 주문 시전과 공격에 필요한 마나와 스태미나 비용이 감소합니다. -'The Persuader' -'설득'' -You realize the magical device has attached to your body using suction. It won't come off! -당신은 마법 장치가 흡입을 통해 당신의 몸에 붙어 있다는 것을 깨달았습니다. 그것은 떨어지지 않을 것입니다! +Leather Leg Cuffs +가죽 다리 커프스 -Ancient Mittens -고대 장갑 -You find a pair of shining gloves, glowing magnificently, along with a strange crystal next to it. -당신은 그 옆에 이상한 수정과 함께 찬란하게 빛나는 빛나는 장갑 한 켤레를 발견했습니다. -Tight mittens that force the hands into fists. When powered, they increase all magic damage to enemies by 40%. -손을 주먹으로 꽉 쥐는 꽉 끼는 벙어리장갑. 전원이 공급되면 적에게 주는 모든 마법 피해가 40% 증가합니다. -'Mittens of Blasting' -'발파 장갑' -You rub your mittens together, but they are unfazed by anything you do to them and your hands are clasped tight. -장갑을 서로 문지르지만, 장갑은 당신이 무엇을 하든 동요하지 않고 손을 꽉 쥐고 있습니다. -Ancient Armbinder -고대 암바인더 -You find a monoglove, glowing magnificently, along with a strange crystal next to it. -당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 모노글러브를 발견했습니다. -An extremely strict armbinder. When powered, reduces miscast chance by 30%, increases all magic damage to enemies by 40%, and increases spell range by 50%. -매우 엄격한 암바인더. 전원이 공급되면 미스캐스팅 확률이 30% 감소하고 적에게 주는 모든 마법 데미지가 40% 증가하며 주문 사거리가 50% 증가합니다. -'Armbinder of the Artillerist' -'포병의 암바더' -You try to wiggle your arms, but they can barely move in this position and are clasped tight. Your arms are sealed. -당신은 당신의 팔을 흔들려고 하지만, 그들은 이 자세에서 간신히 움직일 수 있고 꽉 움켜쥐고 있습니다. 당신의 팔은 봉인되어 있습니다. +Leather Ankle Cuffs +가죽 발목 커프스 -Ancient Ankle Cuffs -고대 발목 수갑 -You find a pair of glowing cuffs, glowing magnificently, along with a strange crystal next to it. -당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 한 쌍의 빛나는 수갑을 발견했습니다. -A pair of cuffs designed for summoners. Heals nearby summons by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power. -소환사를 위해 디자인된 한 쌍의 커프스입니다. 매 턴 주변의 소환수를 15만큼 치유하고 회피를 +50%(2/3까지) 증가시킵니다. 전원 없이 닫힙니다. -'Anklets of the Faithful Friend' -'충실한 친구의 발찌' -You jingle the chains around and realize that these unbreakable restraints won't be coming off. -당신은 쇠사슬을 빙글빙글 돌리고 이 깨지지 않는 구속이 풀리지 않을 것임을 깨닫습니다. -Ancient Ankle Cuffs -고대 발목 수갑 -...when powered down, they snap together, rendering the wearer immobile. -...전원이 꺼지면 서로 찰칵 소리를 내며 착용자를 움직이지 못하게 합니다. -'Anklets of the Unfaithful Friend' -'불성실한 친구의 발찌' -You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! -당신은 헛되이 발버둥치고 있습니다. 열쇠 구멍도 없고 재료도 거의 깨지지 않습니다! +Sticky Slime +끈적 끈적한 점액 +A sticky layer of slime keeping you anchored to the ground. +당신을 땅에 고정시켜주는 끈적끈적한 점액층. +It will slow you for a single turn. +한 턴 동안 속도가 느려집니다. +Leather Mittens +가죽 장갑 +A pair of tight leather mittens enclosing your hands. +당신의 손을 감싸는 꽉 끼는 가죽 벙어리장갑. +They make it almost impossible to manipulate keys and tools. Keep your hands to yourself! +그것들은 열쇠와 도구를 조작하는 것을 거의 불가능하게 만듭니다. 손을 조심하세요! +### Leather Legbinder +### A tight leather legbinder that keeps your feet glued together. -You search for your ancient keys but it seems they were taken away for good. -당신은 고대의 열쇠를 찾았지만 영원히 빼앗긴 것 같습니다. +### It's quite snug and the laces are secured with a lockable panel. Getting at them requires picking the lock. -Random (reduces penalty by 1) -랜덤(페널티 1감소) +Leather Armbinder +가죽 암바인더 +A tight leather armbinder enclosing your hands and arms completely. +손과 팔을 완전히 감싸는 타이트한 가죽 암바인더. +It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible. +매우 아늑하고 뒷면에 ​​잠글 수 있는 버클로 고정되어 있습니다. 자물쇠를 직접 따는 것은 불가능합니다. +### Leather Boxbinder -You don't have any valid targets on your body for that. -신체에 유효한 목표가 없습니다. +### A secure but comfortable binder meant for long-term wear. -The air swirls with traces of pleasing magic... -공기가 즐거운 마법의 흔적으로 소용돌이치고 있습니다... -The spores make you feel sleepy... -포자가 졸음이 온다... +Leather Armbinder Harness +가죽 암바인더 하네스 +Leather belts securing your armbinder tightly. +당신의 암바인더를 단단히 고정시키는 가죽 벨트. +It's quite tight and secured by lockable buckles on your sides. +아주 빡빡하고 옆구리에 잠글 수 있는 버클로 고정되어 있습니다. +The armbinder harness comes off with the armbinder. +암바인더 하네스는 암바인더와 함께 분리됩니다. +### The energy link between your ankle cuffs fizzles into nothing. -DAMAGETYPE: MULTIPLIERx modifier -DAMAGETYPE: MULTIPLIERx 수정자 -Base Physical Armor: AMOUNT -기본 물리 방어구: AMOUNT -Base Magic Armor: AMOUNT -기본 매직 아머: AMOUNT -Base Evasion: AMOUNT% -기본 회피: AMOUNT% -Deals DAMAGETYPE damage -DAMAGETYPE 피해를 입힙니다. -Can disarm (chance: DISARMCHANCE%) -무장 해제 가능(확률: DISARMCHANCE%) -Resistances: -저항: -HP: -HP: -Binding: -바인딩: -Ambivalent -양가적 -Likes you -좋아해 -Loves you -당신을 사랑합니다 -Adores you -당신을 좋아합니다 -Dislikes you -너 싫어 -Hates you -당신을 싫어 -Despises you -너를 경멸한다 -Talking to you -당신 이야기 -Aware of you! -당신을 알고! -Pursuing you! -당신을 쫓는다! -Slightly suspicious -조금 의심스럽다 -Saw something... -뭔가 봤어... -Notices you! -당신을 알아차린다! -Unaware -알지 못하는 -Items carried: -운반된 품목: -...and NUMBER more -...그리고 NUMBER개 더 -Disappears if the caster is stunned -시전자가 기절하면 사라집니다 -Disappears if the caster is defeated -캐스터가 패배하면 사라집니다 -Caster: ENEMYNAME -캐스터: ENEMYNAME -Demise immanent -죽음 임박 +### The energy link between your arm cuffs fizzles into nothing. -Vulnerable -취약 -Stunned -기절 -Snared -올가미 -Slowed -둔화 -Silence -고요 -Disarmed -무장해제 -Blinded -맹인 -Restrained! -억제! -Restricted! -제한된! -Trussed up! -묶여! -Fully Bound! -완전 결속! -Belted -벨트 -Wearing a toy -장난감을 입고 -Vibed! -진동! +### The energy link between your thigh cuffs fizzles into nothing. -Acid -산 -Shadow -그림자 -Ice -얼음 -Ice -얼음 -Fire -불 -Poison -독 -Charm -매력 -Tickle -간지럼 -Grope -더듬다 -Crush -으깨다 -Gravity -중력 -Pierce -내뚫다 -Slash -삭감 -Pain -통증 -Psychic -초능력 -Psychic -초능력 -Psychic -초능력 -Electric -전기 같은 -Pressure -압력 -Chain -사슬 -Charm -매력 -Glue -접착제 -Unarmed -비무장 -Melee -난투 -Magic -마법 -Spell -주문 -Unstoppable -거침없이 -Unflinching -움직이지 않는 +The cuff chains come off with the cuffs. +커프 체인은 커프와 함께 분리됩니다. +### The hogtie link comes off. -You found a magical amulet! Choose one of the following to determine its benefits: -마법의 부적을 찾았습니다! 다음 중 하나를 선택하여 혜택을 확인하십시오. -Focus: +50% max distraction, increased distraction decay. +5% stamina protected from damage (base: 30%). -집중력: +50% 최대 산만함, 산만함 감쇠 증가. +5% 손상으로부터 보호되는 체력(기본: 30%). -Vigour: +50 max stamina, +50% stamina potion effectiveness. -활력: 최대 스태미나 +50, 스태미나 물약 효과 +50%. -Wisdom: +50 max mana. +50% mana potion effectiveness. -지혜: 최대 마나 +50. 마나 물약 효과 +50%. -Fortitude: +50 max willpower, +50% willpower potion effectiveness. +1 stamina regen/turn. -Fortitude: +50 최대 의지력, +50% 의지력 물약 효과. +1 스태미나 재생/턴. - -+Distraction -+산만 -+Stamina -+스태미나 -+Willpower -+의지력 -+Mana -+어디서 +Handcuffs +수갑 +### A pair of steel cuffs locked securely around your wrists. Can be applied on vulnerable targets if targeted from inventory or hotbar. -The EnemyName is vulnerable and took an extra AMOUNT damage! -EnemyName은(는) 취약하고 추가 AMOUNT 피해를 입었습니다! -The EnemyName isn't aware of you and took an extra AMOUNT damage! -EnemyName은(는) 당신을 인식하지 못하고 추가 피해를 입었습니다! -The enemy steals a pick from you! -적이 당신에게서 곡괭이를 훔칩니다! -The enemy takes away your knife! -적이 당신의 칼을 빼앗아갑니다! -The enemy steals a key from your body! -적이 당신의 몸에서 열쇠를 훔칩니다! -The enemy wrests away your magical knife! -적이 당신의 마법 칼을 빼앗아 갑니다! -The enemy takes away your precious magic key! -적이 당신의 소중한 마법의 열쇠를 빼앗아갑니다! -The enemy steals one ITEMSTOLEN from you! -적이 당신에게서 하나의 아이템을 훔칩니다! -You get your stolen items back. -훔친 물건을 되찾게 됩니다. -The EnemyName manages to retreat with your items! -EnemyName은(는) 아이템을 가지고 후퇴합니다! +The lock doesn't seem very complicated. +자물쇠는 그다지 복잡해 보이지 않습니다. +Steel Yoke +스틸 요크 +A steel bar clamped firmly around your wrists and neck, leaving you in a helpless position. +손목과 목에 단단히 조여 무기력한 위치에 놓이게 하는 강철 막대입니다. +### The awkward position makes it difficult to get out of alone. -The orb contains knowledge of SPELL. -구에는 SPELL에 대한 지식이 포함되어 있습니다. -You capture the EnemyName. You can become a champion in the Reputation screen. -EnemyName을 캡처합니다. 평판 화면에서 챔피언이 될 수 있습니다. -You capture the EnemyName. -EnemyName을 캡처합니다. -You capture the EnemyName in the name of the goddess of GODDESS. -당신은 여신의 이름으로 EnemyName을 점령합니다. -You capture the EnemyName, but the goddess of GODDESS would prefer that you be in uniform (wear her restraint). -당신은 EnemyName을 점령하지만, 여신의 여신은 당신이 제복을 입는 것을 선호할 것입니다(제복을 입으십시오). -You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! -당신은 EnemyName을 사로잡았지만, 여신 여신은 당신에게 여러 구속을 요구합니다! -You capture the EnemyName, but the goddess of GODDESS would prefer that you wear some restraints. -당신은 EnemyName을 잡았지만, 여신의 여신은 당신이 구속을 받는 것을 선호할 것입니다. -You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! -당신은 EnemyName을 사로잡았지만, 여신 여신은 당신에게 여러 구속을 요구합니다! -You capture the EnemyName, but have reached the limit for rewards this floor. -당신은 EnemyName을 점령했지만, 이 층의 보상 한도에 도달했습니다. +### Heavy Yoke -The spirit inside the restraint is vengeful and emerges to wreak havoc on the world! -속박 속 정령이 복수심에 불타 세상을 뒤흔들기 위해 등장합니다! +### A series of armor-grade plates cut with precision machining, sandwiched into an unbreakable layer that clasps firmly in place around your neck and wrists. -You hide inside the container... -당신은 컨테이너 안에 숨어 ... -It's a crumpled piece of scrap metal with a sharp edge. -날카로운 모서리를 가진 구겨진 고철 조각입니다. -You use the scrap to try and cut the item. -스크랩을 사용하여 항목을 잘라 봅니다. -You rub the item against the broken object's sharp edges... -깨진 물체의 날카로운 모서리에 물건을 문지릅니다... -A hook hangs at shoulder height. -후크가 어깨 높이에 매달려 있습니다. -You can't reach that with the hook! -갈고리로는 거기에 닿을 수 없습니다! -There's a hook on the wall. -벽에 고리가 있습니다. -The wall is cracked. -벽이 깨졌습니다. -You rub yourself on the corner... -당신은 구석에 몸을 문지르고 ... +### Steel Fiddle -Many ropes emerge around you, removing weaker ropes from your body and binding enemies! -당신 주위에 많은 밧줄이 나타나 당신의 몸에서 더 약한 밧줄을 제거하고 적을 묶습니다! +### A steel fixture keeping your hands in an awkward and submissive position. -Distracted -산만 -Aroused -흥분 -Removes all chastity belts, vibrating restraints, plugs, and removes the option to play with yourself. -모든 순결 벨트, 바이브 구속, 플러그를 제거하고 자위를 할 수 없게 됩니다. -Includes all that good stuff. -모든 좋은(?) 것들을 포함합니다. -Allow Rear Plugs -엉덩이 플러그 허용 -Allow Piercings -피어싱 허용 +### The awkward position prevents you from easily reaching the lock. -Fighter -싸움꾼 -"Start with 200 willpower and 2 spell points, good for escaping and taking blows." -200의 의지력과 2개의 주문 포인트로 시작합니다. 도망치거나 회심의 일격을 가하는 데 좋습니다. -Rogue -도적 -"Start with 200 stamina and 2 spell points, good for sprinting around." -200의 스테미나와 2개의 주문 포인트로 시작합니다. 질주하기에 좋습니다. -Mage -마법사 -"Start with 200 mana and 3 spell points, good for casting spells." -200 마나와 3개의 주문 포인트로 시작합니다. 주문 시전에 좋습니다. -Peasant -농부 -"Start with nothing to your name. For those who want a challenge." -평범하게 시작하세요. 도전을 원하는 분들을 위해. +Leather Harness +가죽 하네스 +A leather harness of tight straps buckled around your torso. +몸통에 버클을 채운 꽉 조이는 끈으로 된 가죽 하네스입니다. +It provides an anchor point for enemies to grab onto! +적들이 붙잡을 수 있는 닻을 제공합니다! +### Rubberized Harness -Choose Spells -주문 선택 -Random Spells -무작위 주문 -Break orbs. Get points. Buy spells. It's that simple. -오브를 깨고. 포인트를 받고. 주문을 사십시오. 이렇게나 간단합니다. -Break orbs and pray you get something good. -오브를 깨고 좋은 것을 나오기를 기도하세요. +### A harness made of latex polymer, resistant to most solvents and corrosion. -Save Codes -세이브 코드 -Roguelike -로그라이크 -Grants a save code every floor you can write down. Autosaves only on floor start. -기록할 수 있는 모든 층에 세이브 코드를 발급합니다. 층 시작 지점에서 자동 저장이 됩니다. -No save codes, forced autosaves. You are in it to win it. -세이브 코드 없음, 강제 자동 저장. 당신은 그것을 이겨낼 수 있습니다. +### Can be worn all day! Also convenient to hold. -Start Playing -시작 -Lock your settings in, nice and tight. -설정을 단단히 고정하세요. -Choose some perks to spice up your run. -진행에 활기를 불어넣을 몇 가지 특전을 선택하세요. +Ball Gag +볼 개그 +### A gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. -This game engages in safe and consensual analytics. -이 게임은 안전하고 합의된 분석에 관여합니다. -It sends data about spell choices, levels reached, etc, to help balance and improve the game. -게임의 균형을 잡고 개선하는 데 도움이 되도록 주문 선택, 도달한 레벨 등에 대한 데이터를 전송합니다. -No personal data is sent or stored. -개인 데이터는 전송되거나 저장되지 않습니다. -Accept -수락 -Don't Track Me -거절 +You can't seem to enunciate your spells properly with this in. +이렇게 입력하면 주문을 제대로 발음할 수 없는 것 같습니다. +### Large Ball Gag -Your key to the stairs is taken away! -계단 열쇠를 빼앗겼습니다! -You found a keyring to the stairs! Now you just need to get there. -계단의 열쇠고리를 찾았군요! 이제 거기까지만 가면 됩니다. -There seems to be a locked high-security door. Looks like you need a key. -잠긴 보안 문이 있는 것 같습니다. 열쇠가 필요한 것 같습니다. +### A mouth-filling gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. -This is a bug. Bosses shouldn't submit -이것은 버그입니다. 보스는 제출하면 안 됩니다. -This is a bug. Bosses shouldn't submit -이것은 버그입니다. 보스는 제출하면 안 됩니다. -This is a bug. Bosses shouldn't submit -이것은 버그입니다. 보스는 제출하면 안 됩니다. +Tight Ball Gag +타이트 볼 개그 +### A gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +### Huge Ball Gag +### A massive gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +### You absolutely can't enunciate your spells properly with this in. +Magic Ball Gag +매직 볼 개그 +### A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +It's brimming with conjured energy. A normal knife won't work here! +창조된 에너지로 가득 차 있습니다. 일반 나이프는 여기서 작동하지 않습니다! +### Anti-Magic Gag -Well well, what have we got here? -글쎄, 우리가 여기서 뭘 얻었지? -You're not here to take away my pets, are you? -당신은 내 애완동물을 데려가려고 여기 온 것이 아니죠? -You'd make a lovely pet... -당신은 사랑스러운 애완 동물을 만들 것입니다 ... -Daww, you're so cute when you're struggling! -다우, 당신이 고군분투하는 모습이 너무 귀여워요! -Let's take you back to your space~ -너의 공간으로 돌아가자~ -You need to be bound tight! -단단히 묶어야 해! -Cleaning up for me, huh? -나를 위해 청소해, 응? -Uh uh, give that back! -어어, 돌려줘! -I see how it is. -나는 그것이 어떤지 봅니다. -I've taken on hundreds of adventurers like you. -나는 너 같은 모험가를 수백 명이나 상대했다. -You don't stand a chance. -넌 기회가 없어. -Your magic is nothing compared to mine! -네 마법은 나에 비하면 아무것도 아니야! -I've been a master wizard for over a thousand years! -나는 천년 넘게 마스터 마법사였습니다! -You call that a spell? -그것을 주문이라고 합니까? -My spells are far superior! -내 주문이 훨씬 뛰어나다! -She won't help you! -그녀는 당신을 돕지 않을 것입니다! -Not yours! -네 것이 아니야! -Oh, that's not going to help~ -아, 소용없어~ -Let's play a game! -게임하자! -Didn't think you would get away, did you? -당신이 도망칠 것이라고 생각하지 않았습니까? -Oh ho~ -오호~ -'Tis but a scratch! - '그냥 ​​흠집이야! -You'll be my pet soon~ -넌 곧 내 애완동물이 될거야~ -Cute~ -귀여워~ -Don't even try~ -시도하지마~ -It's over~ -끝났어~ -Get over here! -이리 와! -Not so slippery now! -지금은 그렇게 미끄럽지 않아! -I'll be taking that~ -내가 가져갈게~ -'Click!' -'딸깍!' +### A gag designed to cripple mages. It's made of a squishy rubbery material. +### It's sealed with a magical spell that rapidly absorbs mana! When it drains 40 mana it will transform into an ordinary gag and inflate. +### Anti-Mage Gag +### A gag designed to cripple experienced spellcasters. It's made of a magic-absorbing rubber. -Catch me if you can! -잡을 수 있으면 잡아 봐! -You'll never get away with this! -넌 이걸로 절대 도망칠 수 없어! -I don't want to be your slave! -당신의 노예가 되고 싶지 않아요! -I've been naughty, looks like I need to be punished... -내가 장난을 쳤어, 벌을 받아야 할 것 같구나... -I've been a bad girl, won't you do something about it? -나는 나쁜 여자 였어, 그것에 대해 뭔가를하지 않을거야? -Mmmph... maybe I talk too much... -흐음... 말이 너무 많은 것 같은데... -Hey! Where do you think you're going? -이봐! 어디로 갈 것 같아? -You look like you're having fun! -너 재밌어 보여! -I have somewhere else in mind for you~ -나는 당신을 위해 다른 곳을 염두에두고 있습니다 ~ -What do you think you're doing with that? -그것으로 무엇을 하고 있다고 생각하십니까? -Looks like you found my keys! Hand them over. -내 열쇠를 찾은 것 같군! 넘겨줘. -You look like a good girl. Come on~ -착한 여자 같으니 이리와~ -Come here, let's play! -이리와, 놀자! -*grins and starts walking toward you* -*웃으며 당신을 향해 걷기 시작합니다* -Hey! Play nice! -이봐! 잘 놀아! -Stop that! Guards! -그만해! 경비병! -You're mine! -넌 내 꺼야! -Sorceress! -마법사! -Get her! -그녀를 갖다! -She's a mage! Stop her! -그녀는 마법사야! 그만둬! -Watch it! -조심해! -Don't touch that! -그걸 만지지 마! -Don't touch that! -그걸 만지지 마! -Don't touch that! -그걸 만지지 마! -We have an escapee! -탈출자가 있습니다! -Not so fast! -너무 빠르지 않아! -Try that again! -다시 해봐! -Do your worst! -최악을 다해! -Got you! -잡았다! -Get back here! -여기로 돌아와! -Missed me! -보고 싶었어! -You're coming with me! -당신은 나와 함께 간다! -Get over here! -이리 와! -Not so slippery now! -지금은 그렇게 미끄럽지 않아! -Hand it over. -그거 넘겨. -Nice and tight! -좋고 꽉! +### You feel the energy flowing out of you! When it drains 100 mana it will transform into an ordinary gag and inflate. +Ballet Heels +발레 힐 +A pair of shoes with heels so tall it forces you on your toes. +높은 굽이 있는 신발 한 켤레는 발가락에 힘을 줍니다. +These will take some getting used to. +익숙해지는 데 시간이 좀 걸릴 것입니다. +### Training Heels -Mmmmph!!! -읍으읍!!! -Mmmmm~ -음~ -Mmmgh! -읍읍! -Mmmmmm <3 -으읍읍 <3 -Mmmmmm~ -음~ -Mmmph~ -흐음~ -*looks at you nervously* -*초조하게 쳐다본다* -*giggles* -*킥킥* -*giggles eagerly* -*간절히 낄낄 웃는다* -Mmmph? -흐음? -Mmmghgh!!! -음!!! -Mmmmph... -음... -Hhhhmph! -헉헉! -Mmmmmmmmm... -으으으읍으읍... -Mmmph! -읍! -Nngghhh! -으악! -Gggghh!!! -으악!!! -Mmmaaghthh! -으읍! -Wwwmmmthhh! -우우으으음! -Mmmmmph! -으읍! -Mmmph. -읍. -Mmmph! -읍! -*looks at you suspiciously* -*당신을 의심스럽게 쳐다봅니다* -*looks at you angrily* -*당신을 화나게 쳐다봅니다* -Mmmmph!!! -읍!!! -Mmmmph! -읍! -*jumps up and down excitedly* -*신나게 위아래로 점프* -*groans* -*신음* -*does a happy dance* -*행복한 춤을 춥니다* -Mmmph!!! -읍!!! -*giggles* -*킥킥* -Mmmph. -읍. -Nngghhh! -으악! -Mmm-hmmm. -음-흠. -Mmmmmmm~ -음~ -Mmmph~ -으흠~ +### A pair of unreasonably high heels owned by you personally. +Leg Irons +레그 아이언 +A pair of solid steel cuffs connecting your ankles inescapably. +어쩔 수 없이 발목을 연결하는 단단한 강철 수갑. +Blindfold +눈가리개 +A leather strap secured onto your face and blocking vision. +얼굴에 고정되어 시야를 차단하는 가죽 끈. +You can still see through the gap around your nose. +당신은 여전히 ​​코 주위의 틈을 통해 볼 수 있습니다. +Magic Chastity Belt +마법의 정조대 +A belt protected by a magic seal. +마법의 봉인으로 보호되는 벨트. +The shields will open up to accept new toys, but won't let them out... +방패는 새로운 장난감을 받기 위해 열리지만, 그것들을 내보내지는 않을 것입니다... +Steel Chastity Belt +강철 순결 벨트 +A cruel device used for locking magical vibrators in place. +마법 진동기를 제자리에 고정하는 데 사용되는 잔인한 장치입니다. +### Blacksteel Belt -Mmmmph!!! -음!!! -Mmmmm~ -음~ -Mmmgh! -음! -Mmmmmm <3 -으음 <3 -Mmmmmm~ -음~ -Mmmph~ -음~ -*Mmmmmm~* -*으음~* -*muffled giggle* -*숨막히는 낄낄거림* -Mmmm~ -음~ -Mmmph? -음? -Mmmghgh!!! -음!!! -Mmmmph... -음... -Hhhhmph! -헉헉! -Mmmmmmmmm... -으으으음으음... -Mmmph! -음! -Nngghhh! -으악! -Gggghh!!! -으악!!! -Mmmaaghthh! -으음! -Wwwmmmthhh! -우우으으음! -Mmmmmph! -으음! -Mmmph. -음. -Mmmph! -음! -Mmmph? -음? -*glows with anger* -*분노로 빛난다* -Mmmmph!!! -음!!! -Mmmmph! -음! -*muffled giggle* -*숨막히는 낄낄거림* -*groans* -*신음* -*muffled giggle* -*숨막히는 낄낄거림* -Mmmph!!! -음!!! -*muffled giggle* -*숨막히는 낄낄거림* -Mmmph. -음. -Nngghhh! -으악! -Mmm-hmmm. -음-흠. -Mmmmmmm~ -음~ -Mmmph~ -음~ +### Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. -You'll never catch me! -넌 날 절대 못 잡을거야! -Where'd you come from? -어디서 오셨어요? -No! Definitely don't like... tie me up and punish me! -안돼! 절대 싫어... 날 묶어 벌을 줘! -I've come to turn myself in~ -반복하러 왔습니다~ -Won't you 'apprehend' me? -나를 '체포'하지 않겠습니까? -I've been a bad girl~ +### Blacksteel Bra + +A cruel device used for locking magical massagers in place. +마법 안마기를 제자리에 고정시키는 잔인한 장치입니다. +Prototype Belt +프로토타입 벨트 +A strange device built using unknown technology. +알 수 없는 기술을 사용하여 만든 이상한 장치입니다. +The lock is extremely advanced, and the ports at the bottom readily accept toys but won't let them out... +자물쇠는 매우 고급스럽고, 바닥에 있는 구멍은 장난감을 쉽게 넣을 수 있지만 빼지는 못합니다... +Steel Chastity Bra +스틸 순결 브래지어 +It won't stop the dungeon's little curses, but will keep you from removing them. +던전의 작은 저주를 막지는 못하겠지만, 당신이 그것들을 제거하지 못하게 할 것입니다. +Ornate Chastity Belt +화려한 정조대 +The lock won't come off until the magic wears off in time... +시간이 지나면 마법이 풀릴 때까지 자물쇠는 풀리지 않을 거야... +Ornate Chastity Bra +화려한 순결 브래지어 + + +Maid Chastity Belt +메이드 정조대 +A chastity belt used to maintain control over initiate maids. +입회 시녀를 통제하기 위해 사용하는 정조대. +Made of hardened steel. The lock is high-security. +단단한 강철로 만들어졌습니다. 자물쇠는 보안 수준이 높습니다. +Magic Egg +매직 에그 +An energetic little friend that likes to tease you. +당신을 놀리는 것을 좋아하는 에너지 넘치는 작은 친구. +### It is charged by residual magic from your spells. Type: Teasing + +Prototype Egg +프로토타입 에그 +A teaser that periodically vibrates. +주기적으로 진동하는 티저. +### High efficiency mana conversion means longer tease duration. Type: Teasing, Pleasure, Edging + +Vibrating Plug +진동 플러그 +A sizeable plug that makes you happy... a little too happy. +당신을 행복하게 만드는 상당한 플러그... 조금은 너무 행복합니다. +### It vibrates periodically and adds distraction when moving. Type: Pleasure + +Teaser Plug +티저 플러그 +A sizeable plug that will tease you but never let you go... +당신을 놀리지만 절대 놓지 않는 큰 플러그... +### It vibrates weakly periodically. Type: Teasing, Denial + +Torment Plug +토먼트 플러그 +A sizeable plug that will make your life unbearably pleasurable... +당신의 삶을 참을 수 없을 정도로 즐겁게 만들어 줄 커다란 플러그... +### It vibrates strongly periodically and has a denial setting. Type: Denial + +Thundering Plug +천둥 플러그 +### Enjoy it while you can. Type: Pleasure, Edging + +### Intense Training Plug + +### An energetic plug that will make your life unbearably pleasurable... + +### You're going to have the time of your life. Type: Pleasure, and lots of it + +### Rear Vibrating Plug + +### A device that attacks from multiple angles. + +### An enjoyable experience. Type: Edging + +Maid Egg +메이드 에그 +An energetic little friend that likes to tease you and takes orders from the head maid. +놀리기를 좋아하고 메이드장의 지시를 받는 활기찬 꼬마 친구. +### It is charged by residual magic from your spells. Type: Teasing, Edging + +### Stainless Plug (F) + +A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... +진동을 일으키지 않는 무거운 플러그지만 확실히 걸어다니는 것을 알아차릴 수 있을 것입니다... +This one goes in the front. +이쪽이 앞에 갑니다. +### Stainless Plug (R) + +This one goes in the back. +이건 뒤로 갑니다. + + +Shadow Hand Gag +섀도우 핸드 개그 +It clasps tightly over the mouth and prevents you from casting your spells! +그것은 입을 단단히 움켜쥐고 주문을 시전하는 것을 방지합니다! +You have no choice but to struggle. +고군분투하는 것 외에는 선택의 여지가 없습니다. +### Shadow Hand Eyes + +### Shadow hands clasped over your eyes, making it hard to see. + +Shadow Hands (Legs) +섀도우 핸즈(다리) +They are wrapped around your legs! +그들은 당신의 다리를 감싸고 있습니다! + + +Shadow Hands (Arms) +섀도우 핸즈(무기) +They are squeezing you tightly! +그들이 당신을 꽉 조이고 있습니다! + + +Shadow Hands (Feet) +그림자 손(발) +They are holding your feet together! +그들은 당신의 발을 함께 잡고 있습니다! + + +Shadow Hands... +섀도우 핸즈... +### They are holding your... uh... + +Wrist Vines +손목 덩굴 +A box tie keeping your arms secured behind your back. +등 뒤로 팔을 고정시키는 상자 넥타이. +The vines twitch as they try to wrap around tighter. +덩굴이 더 단단하게 감싸려고 할 때 경련을 일으킵니다. +Vine Harness +포도나무 하네스 +A harness acting as a handle to pull you around +당신을 끌어당기는 손잡이 역할을 하는 하네스 +Leg Vines +다리 덩굴 +A tie that hobbles your legs together.. +다리를 절뚝거리게 만드는 넥타이.. +Ankle Vines +발목 덩굴 +A tie keeping your feet secured together. +당신의 발을 고정시켜주는 넥타이. + + +### High-Security Cuffs + +### A set of irish-8-style cuffs that are both restrictive and quick to apply. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +### It uses a standard lock rather than a simple one. + +Wolfbinder +울프바인더 +A sophisticated training system used to keep wolfgirls from scratching their owners. +울프걸이 주인을 긁지 못하도록 하는 정교한 훈련 시스템입니다. +Despite the harsh position, it is padded, breathable, and suitable for long term wear. +가혹한 자세에도 불구하고 패딩 처리되고 통기성이 있으며 장기간 착용하기에 적합합니다. +### Wolf Queenbinder + +### This was made to be used during a coup attempt. Unfortunately, its creator ended up wearing it instead, after the coup's failure. + +### Designed to hold the queen of wolves helpless for an indefinite period of time. + +Smart Training Cuffs +스마트 트레이닝 커프스 +Cuffs with a feature to punish the wearer if they act aggressively. +공격적으로 행동하면 착용자를 처벌하는 기능이 있는 수갑. +They are solid metal and will be hard to remove without the key. +그것들은 단단한 금속이고 열쇠 없이는 제거하기 어려울 것입니다. +Linked Smart Cuffs +연결된 스마트 커프스 +Looks like you got yourself in trouble. +곤경에 처한 것 같군요. +Training Harness +트레이닝 하네스 +A harness that keeps a wolfgirl's suit together. It makes escaping more difficult. +울프걸의 옷을 묶어주는 하네스입니다. 탈출을 더 어렵게 만듭니다. +While it is weatherproof and rugged, its straps are merely nylon. +내후성이 있고 견고하지만 끈은 나일론일 뿐입니다. +### Training Mittens + +### When wolfgirls won't keep those pesky claws in line, these will make sure she can't cause too much trouble. + +### Made from strong reinforced fabric, your claws won't do anything to these mittens. + +Training Gag +트레이닝 개그 +A gag used to prevent wolfgirls from biting their owners. +울프걸이 주인을 무는 것을 막기 위해 사용하는 재갈입니다. +It is reinforced with steel cables, so getting it off will be tricky. +강철 케이블로 보강되어 있어 떼어내기가 까다로울 것입니다. +Training Collar +트레이닝 목걸이 +### A collar with a decorative tag used to identify wolfgirls. + +### Also good for identifying people in general. What a great idea! + +Training Leash +트레이닝 리쉬 +A leash used for training pets. +애완동물 훈련에 사용하는 목줄입니다. +It is a steel cable with a weatherproof rubber coating, and a convenient handle. +내후성 고무 코팅과 편리한 손잡이가 있는 강철 케이블입니다. +### Magical Leash + +### A leash made of magical energy, linked to a submissive's collar. + +### Very difficult to break unless you have a strong magical blade. + +Your ankle cuffs snap together on their own! +당신의 발목 수갑이 저절로 찰칵! +Your ankle cuffs detach! +발목 수갑이 분리됩니다! + + +Asylum Muzzle +망명 총구 +The nurses use this on noisy patients! +간호사는 시끄러운 환자에게 이것을 사용합니다! +It's sturdy leather... +튼튼한 가죽이라... +Asylum Jacket +망명 재킷 +A straitjacket that keeps patients out of trouble. +환자를 곤경에 빠뜨리는 구속복. +It has many straps and is very difficult to escape. +끈이 많고 탈출하기가 매우 어렵습니다. +Asylum Legbinder +망명 입법자 +This legbinder will keep the patient from kicking the nurses. +이 레그 바인더는 환자가 간호사를 발로 차는 것을 막아줄 것입니다. +It has both laces and straps. +끈과 끈이 모두 있습니다. + + +Asylum Ankle Cuffs +망명 발목 커프스 +A pair of chained cuffs made of reinforced leather. They make patients easier to catch. +강화 가죽으로 만든 사슬로 묶은 수갑입니다. 환자를 더 쉽게 잡을 수 있습니다. +They can be thrown from long distances. +장거리에서 던질 수 있습니다. + + +Asylum Leg Cuffs +망명 다리 커프스 + + +### They are made of a steel alloy. + + + +Transport Jacket +운송 재킷 +This jacket goes over a straitjacket to keep the arms trapped. +이 재킷은 구속복을 덮어서 팔이 갇히지 않도록 합니다. +It makes it extraordinarily difficult to escape the jacket it covers. +그것이 덮는 재킷에서 벗어나기가 매우 어렵습니다. + + +### Living Asylum Collar + +### A collar made of tough cowhide that adjusts itself to your neck. + +### It will occasionally cause asylum gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of asylum gear you have on you. + +Asylum Cuffs +망명 커프스 +A pair of leather cuffs that make it easy to restrain you. +당신을 쉽게 묶을 수 있는 가죽 수갑입니다. +They're made of tough cowhide. +그들은 질긴 소가죽으로 만들어졌습니다. + + +A pair of leather cuffs keeping your arms behind your back. +등 뒤로 팔을 고정시키는 한 쌍의 가죽 수갑. + + +A full set of leather cuffs keeping your arms in a strict elbow tie! +엄격한 팔꿈치 타이로 팔을 보호하는 가죽 커프스 풀 세트! + + +A pair of leather cuffs keeping your elbows locked together!. +팔꿈치를 함께 고정시켜주는 한 쌍의 가죽 수갑!. + + +Comfy Muzzle +편안한 총구 +A lovely muzzle that's extraordinarily comfy! +매우 편안한 사랑스러운 총구! +It's made of an ethereal material... +에일리언 재질로 되어있어요.. +Comfy Straitjacket +편안한 구속복 +A straitjacket that is padded on the inside. +안쪽이 덧대어진 구속복. +It feels tight but is actually made of an ethereal material... +타이트한 느낌이 나지만 실제로는 천상의 소재로 만들어졌습니다... + + +Latex Jacket +라텍스 재킷 +### A tight jacket that keeps your arms completely useless. + +It has too much grip to struggle out of, but is made of a fragile material. +힘겨워하기에는 너무 많은 그립력이 있지만 깨지기 쉬운 재료로 만들어졌습니다. +### Secure Latex Jacket + +### This straitjacket has extra straps and buckles to make sure you won't be struggling out of it. + +Latex Armbinder +라텍스 암바인더 +A tight armbinder that pins your arms tightly behind your back, enclosed completely. +팔을 등 뒤로 단단히 고정하는 타이트한 암바인더가 완전히 감싸여 있습니다. +### Latex Boxbinder + +Latex Legbinder +라텍스 레그 바인더 +A tight legbinder that keeps your legs together! +다리를 고정시켜주는 타이트한 레그바인더! +### Latex Boots + +A tight pair of boots that makes it difficult to walk! +걷기 힘들게 만드는 타이트한 부츠! +Heavy Latex Corset +무거운 라텍스 코르셋 +An excruciatingly tight corset that hugs your body, with straps securing your other restraints. +다른 구속을 고정하는 끈으로 몸을 감싸는 극도로 조이는 코르셋. +A skintight suit that's stretched on tight. It adheres to latex restraints making struggling more difficult. +꽉 조이는 몸에 꼭 맞는 수트입니다. 라텍스 구속에 달라붙어 고군분투하기가 더 어렵습니다. +Blue latex is silky smooth, very stretchy, and very good at adhering to itself. +파란색 라텍스는 비단결처럼 매끄럽고 신축성이 뛰어나며 접착력이 뛰어납니다. +### Heavy Latex Catsuit + +### A skintight suit that's stretched on tight and made of thick latex. It adheres to latex restraints making struggling more difficult. + +### Blue latex is silky smooth, very stretchy, and very good at adhering to itself. Its thickness makes it particularly resistant to cutting. + +### Latex Mittens + +### A pair of mittens keep your hands out of trouble. They adhere to latex restraints making struggling more difficult. + +### Latex Cube + +### A gelatinous cube that engulfed you at some point in the past. + +### It seems quite content staying where it is. + +### Slime Bubble + +### A squishy and sticky bubble that you can't get out of! + +### It will slow you down severely but can be popped if you can reach a knife... + +### Latex Sphere + +### A giant inflatable sphere that compresses you and leaves you helpless... + +### You can't see out of it nor can you control its movement. If only you could puncture it! + +### Latex Ball Suit + +### A giant inflatable sphere that leaves you rolling around... + +### Your movement is severely hampered, limited to feeble wiggling... + +### Bubble + +### A squishy bubble that you can't get out of! + +Scale Boxtie Binder +스케일 Boxtie 바인더 +A secure but comfortable binder meant for long-term wear by long-term prisoners of the Dragonhearts. +드래곤하트의 장기 포로가 오랫동안 착용할 수 있는 안전하면서도 편안한 바인더입니다. +It is made from durable dragonscale, but secured with ordinary buckles. +튼튼한 용비늘로 만들었지만 일반 버클로 고정되어 있습니다. +Dragonscale Straps +용비늘 스트랩 +A set of straps buckling tightly around your body and secured at the wrists. +당신의 몸을 단단히 감싸고 손목에 고정된 스트랩 세트. +It's made from hard-to-cut dragonscale!!! +잘라내기 힘든 용비늘로 만들었다!!! +### Dragon Queen Straps + +### A sturdy harness completely immobilizes your arms and torso. Made to be used on a queen of dragons. + +### It's made from reinforced dragonscale!!! + +Scale Leg Cuffs +스케일 레그 커프스 +A pair of chained cuffs made of dragonscale. They slow your stride. +용비늘로 만든 사슬 수갑입니다. 걸음이 느려집니다. +Scale Ankle Cuffs +스케일 앵클 ​​커프스 +### Scale Cuffs Chain + +Dragonscale Boots +용비늘 장화 +A pair of extremely high heels lined with dragonscale. They are hard to walk in. +용 비늘로 안을 댄 매우 높은 굽입니다. 걷기가 어렵습니다. +Dragonscale Gag +용비늘 개그 +A gag made of a squishy material and secured with dragonscale straps. +부드러운 재질로 만들어지고 용비늘 끈으로 고정된 개그입니다. +Dragonscale Muzzle +용비늘 총구 +A muzzle to keep ball gags pressed firmly into the mouth. +공 개그를 입에 단단히 밀어넣는 총구. +Dragon Collar +드래곤 목걸이 +A collar owned by the Dragonhearts, an order of dragonslayers. +드래곤슬레이어 교단인 드래곤하트가 소유한 목걸이. + + +Steel Cuffs +스틸 커프스 +A pair of steel cuffs that make it easy to restrain you. +당신을 쉽게 구속할 수 있는 강철 수갑입니다. +They're made of shining steel. +그들은 빛나는 강철로 만들어졌습니다. + + +Steel Wrist Chain +스틸 손목 체인 +A pair of steel cuffs keeping your arms behind your back. +팔을 등 뒤로 고정하는 강철 수갑. + + +Magnetic Cuffs +마그네틱 커프스 +A pair of bulky cuffs with coils visible on the inside... +내부에 코일이 보이는 부피가 큰 수갑... +They have no visible attachment points... +눈에 보이는 부착 지점이 없습니다... +The electric damage causes your cuffs to attach together! +전기 손상으로 인해 수갑이 함께 부착됩니다! + + +Magnetic Link +마그네틱 링크 +The magnetic cuffs are rigidly attached! +마그네틱 커프스가 단단히 고정되어 있습니다! +They won't budge! There's a button to release them but it's hard to reach... +꼼짝도 하지 않아! 버튼을 떼는 버튼이 있지만 손이 닿기가 힘들어... + + +Magnetic Ankle Cuffs +마그네틱 발목 커프스 +A pair of bulky leg irons with coils visible on the inside. +내부에 코일이 보이는 부피가 큰 레그 아이언 한 쌍. +The electric damage causes your ankle cuffs to snap together! +전기 손상으로 인해 발목 수갑이 함께 끊어집니다! + + +Your ankle cuffs detatch! +발목 수갑이 풀린다! + + + + +### Living Blacksteel Collar + +### A collar made of a hardened steel alloy, chemically treated as to be stainless that adjusts itself to your neck. + +### It will occasionally cause blacksteel to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of blacksteel you have on you. + +### Blacksteel Cuffs + +### They are made of a hardened steel alloy, chemically treated as to be stainless. + + + + + +### Blacksteel Leg Cuffs + +Blacksteel Ankle Cuffs +블랙스틸 앵클 커프스 + + + + + + + + +Dragonscale Cuffs +용비늘 수갑 +### They are made from leather cured from the hide of dragons. + + + + + +### Dragonscale Leg Cuffs + +### Dragonscale Ankle Cuffs + + + + + +Maid Jacket +메이드 재킷 +A bolero jacket keeping your arms pinned snugly. You can't even move them. +팔을 포근하게 잡아주는 볼레로 재킷. 팔을 움직일 수도 없습니다. +There is no hope of struggling out. Better hope you can cut it... +고군분투할 희망은 없다. 그만둘 수 있기를... +### Maid Punishment Jacket + +### A bolero straitjacket made for unruly maids. It is extra secure and locked tightly. + +### There is no hope of struggling out. Better get back to work... + +Devious Maid Costume +악랄한 메이드 코스튬 +A devious maid outfit that forces the arms into an elbows-touching position. +팔꿈치에 닿도록 강제로 팔을 구부리는 기만적인 메이드 복장. +Makes sure you focus on your work and not fooling around. +작업에 집중하고 장난치지 않도록 합니다. +Reinforced Leather Belt +강화 가죽 허리띠 +A leather belt used to keep your legs hobbled. +다리를 절뚝거릴 때 사용하는 가죽 벨트입니다. +It's made of a very tough reinforced leather. It will take some time to cut. +매우 질긴 강화 가죽으로 만들어졌어. 자르는데 시간이 좀 걸릴 거야. +### Maid Cuffs + +A pair of steel cuffs used by the Maidforce. +메이드포스가 사용하는 강철 수갑입니다. +They are made of solid steel. +그들은 단단한 강철로 만들어졌습니다. +### Maid Cuff Link + +Maid Collar +메이드 목걸이 +A collar for operatives of the Maidforce, a group of covert saboteurs. +은밀한 공작원 그룹인 메이드포스 요원의 목걸이. +It's reinforced with metal and guarded with an expert-level lock. +금속으로 보강하고 전문가 수준의 자물쇠로 보호합니다. +### Maid Gag + +A gag with a long, mouth-filling plug that muffles speech completely. +말을 완전히 숨막히는 길고 입안을 가득 채우는 플러그가 달린 개그입니다. +### Maid Security Gag + +### A muzzle with a long, mouth-filling plug that muffles speech completely. + +### Reinforced and secured with a disc lock to ensure unruly maids don't skip their duty. + +Suspicious Mask +수상한 가면 +A well-fitted mask, covering your entire head neatly and locking in place. +머리 전체를 깔끔하게 덮고 제자리에 고정되는 잘 맞는 마스크. +It has eyeholes for you to somewhat see out of, but blocks access to the face. +밖을 볼 수 있는 눈구멍이 있지만 얼굴에 대한 접근은 차단합니다. + + +### Happy Face + +### Just put on a happy face and enjoy it. + +### Sensory Hood + +### A well-fitted hood that covers your head and muffles sounds. + +### No eyeholes. Integrated blindfold and gag. Total darkness. + +### Sensory Mask + +### A well-fitted mask that covers your face and muffles sounds. + +### Shadow Heels + +### A set of impractical heels that clasp around your ankles. They make it hard to walk. + +### The material is stronger than leather, and flexes to make struggling difficult. + +### Shadow Jacket + +### A tight straitjacket made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Its grip encases you tightly, but the material is weaker than most metals. + +### Black Hole Jacket + +### Like a black hole, anything that is caught in this jacket has no chance to escape its grasp. + +### Shadow Armbinder + +### A tight armbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Black Hole Armbinder + +### Like a black hole, anything that is caught in this armbinder has no chance to escape its grasp. + +### Shadow Boxbinder + +### A tight boxbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Black Hole Boxbinder + +### Like a black hole, anything that is caught in this boxbinder has no chance to escape its grasp. + +### Shadow Legbinder + +### A tight legbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Shadow Latex Petsuit + +### A tight petsuit made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. + +### Obsidian Yoke + +### A yoke made from shining obsidian, stars glittering in the darkness. It pins your arms uselessly at your sides. + +It's made of a dark, glistening volcanic metal. +그것은 어둡고 반짝이는 화산 금속으로 만들어졌습니다. + + +Obsidian Muzzle +흑요석 총구 +A muzzle made from segmented metal pieces, fitting securely over your face. +분할된 금속 조각으로 만든 주둥이로 얼굴에 단단히 맞습니다. + + +Obsidian Collar +흑요석 목걸이 +A collar made from a warm, shining alloy. +따뜻하고 빛나는 합금으로 만든 목걸이. + + +### Living Obsidian Collar + +### A collar made of a dark, shiny metal that adjusts itself to your neck. You can't help but hear whispering since it is so tight. + +### It will occasionally cause obsidian to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of obsidian you have on you. + +Obsidian Cuffs +흑요석 커프스 +### It's made of a dark, shiny metal. If you hold it close you hear whispering. + + + + + +Obsidian Leg Cuffs +흑요석 다리 수갑 + + +Obsidian Ankle Cuffs +흑요석 발목 커프스 + + +### Living Crystal Collar + +### A collar made of a glowing, brittle material that adjusts itself to your neck. You feel your energy flowing into it... + +### It will occasionally cause crystal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of crystal you have on you. + +Crystal Cuffs +크리스탈 커프스 +### It's made of a glowing, brittle material. You feel your energy flowing into it... + + + + + +Crystal Leg Cuffs +크리스탈 레그 커프스 + + +Crystal Ankle Cuffs +크리스탈 앵클 커프스 + + +### Living Ice Collar + +### A collar made of enchanted ice that adjusts itself to your neck. It won't melt on their own, and the ice chills you to the bone... + +### It will occasionally cause ice to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ice you have on you. + +### Ice Cuffs + +### They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... + + + +A pair of cuffs keeping your elbows locked together!. +팔꿈치를 함께 고정시켜주는 수갑!. + + +### Ice Leg Cuffs + +### Ice Ankle Cuffs + + + +### Living Slave Collar + +### A collar made of a gold-tinted metal with a magical enchantment that adjusts itself to your neck. + +### It will occasionally cause slave gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slave gear you have on you. + +Slave Cuffs +슬레이브 커프스 +It's made of a gold-tinted metal with a magical enchantment. +마법의 마법이 깃든 금빛 금속으로 만들어졌습니다. + + +Slave Wrist Chain +노예 손목 사슬 + + +Slave Elbow Chain +슬레이브 엘보우 체인 + + +Slave Leg Cuffs +노예 다리 수갑 +Slave Ankle Cuffs +노예 발목 커프스 +Slave Cuffs Chain +슬레이브 커프스 체인 + + +High-Tech Gag +하이테크 개그 +A gag with a soft and filling mouthpiece, reinforced with a metallized strap. +부드럽고 속을 채우는 마우스피스가 달린 재갈, 금속 끈으로 강화됨. +It will be impossible to force it out or cut it with just a knife. +그것을 억지로 빼내거나 칼만으로 자르는 것은 불가능할 것입니다. + + +### Nylon Plug Gag + +### A gag with a soft and filling mouthpiece, kept in place by an adjustable nylon strap. + +### It will be impossible to force it out, but can be cut. + +High-Tech Cables (Arms) +하이테크 케이블(암) +### Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! + +They are wrapped methodically around your body! +그들은 당신의 몸을 체계적으로 감싸고 있습니다! +High-Tech Cables (Legs) +하이테크 케이블(다리) +High-Tech Cables (Harness) +하이테크 케이블(하네스) + + +### Nylon Cables (Arms) + +### Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. + +### Nylon Cables (Legs) + +### Nylon Cables (Harness) + +Magic Ribbons +매직 리본 +### Magically sealed ribbons to teach intruders a lesson. + +### The magic is powerful enough to ward off most blades, creating a true predicament for one who is trapped by these. + +Magic Ribbons (Arms) +매직 리본(팔) +Those ribbons will hold you tight~ +그 리본이 널 꽉 잡아줄거야~ +I've put a magic seal in that bow-knot to keep it secure! +나는 그것을 안전하게 유지하기 위해 그 활 매듭에 마법의 인장을 넣었습니다! +Magic Ribbons (Legs) +마법의 리본(다리) +Magic Ribbons (Feet) +매직 리본(발) +Magic Ribbons (Harness) +매직 리본(하네스) +Magic Ribbons (Pelvis) +매직 리본(골반) +Magic Ribbons (Mittens) +매직 리본(장갑) +They are wrapped tightly around your hands with a bow knot! +활 매듭으로 손에 단단히 감겨 있습니다! +Magic Ribbons (Gag) +매직 리본(개그) +They are wrapped tightly around your mouth with a bow knot! +활 매듭으로 입 주위를 단단히 감쌌습니다! +### Living Ribbon Collar + +### This collar is designed to make sure its wearer does not escape the ribbons. + +### It will occasionally cause ribbons to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ribbons you have on you. + + + +Ice (Arms) +얼음(무기) +Frigid restraints made out of ice. +얼음으로 만든 혹독한 구속. +There's no way to remove it without breaking it off. +부수지 않고는 제거할 수 있는 방법이 없습니다. +Ice (Mouth) +얼음(입) +### Ice Ball Gag (Mouth) + +### A cold sphere of magic ice lodged firmly in your mouth. + +### The work of a kinky elemental. It will melt! Eventually. + +Ice (Body) +아이스(본체) +Ice (Legs) +얼음(다리) + + +Glue (Feet) +접착제(피트) +A latex-derived glue that attaches you to the floor! It's very stretchy. +바닥에 달라붙는 라텍스 유래 접착제! 신축성이 매우 뛰어납니다. +Just touching it makes it stick all over... +만지기만 해도 온통 달라붙어... +Glue (Ankles) +접착제(발목) +Glue (Legs) +접착제(다리) + + +Slime (Feet) +슬라임(발) +Sticky slime that adheres to your body. It reacts negatively to mana... +몸에 달라붙는 끈적끈적한 슬라임. 마나에 부정적 반응을 보이는데... +It is an organic material that reforms around every cut you make! +그것은 당신이 만드는 모든 절단 주변을 개혁하는 유기 재료입니다! +Slime (Ankles) +슬라임(발목) +Slime (Legs) +슬라임(다리) +Slime (Arms) +슬라임(무기) +Slime (Hands) +슬라임(손) +Slime (Mouth) +슬라임(입) +Slime (Head) +슬라임(머리) +### Living Slime Collar + +### This collar is designed to make sure its wearer does not escape their slime. + +### It will occasionally cause slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slime you have on you. + + + +### Made from hardened slime. + +### The classic smooth, shiny material for full encasement. + +### A semi-organic substance of alchemical origin. + +### It has a mind of its own, and tends to spread if not properly contained. + +### Proto Rubber + +### Made from hardened proto rubber. + +### A hardened form of the essence of latex. + +### Proto Slime + +### Alchemical rubber in its simplest form. Amorphous. + +### Often forms strange growths, seeking damsels to encase. + +Rubber (Feet) +고무(피트) +### Sticky rubber that has fused itself into a skintight layer. + +There's no struggling out now, but since it's solid it may be cuttable. +지금은 힘들지 않지만 단단하기 때문에 잘릴 수 있습니다. +Rubber (Ankles) +고무(발목) +Rubber (Legs) +고무(다리) +Rubber (Arms) +고무(팔) +Rubber (Hands) +고무(손) +Rubber (Mouth) +고무(입) +Rubber (Head) +고무(헤드) +### Living Rubber Collar + +### This collar is designed to make sure its wearer does not escape their rubber. + +### It will occasionally cause rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. + + + + + +Proto-Slime (Feet) +프로토슬라임(발) +It seems to be a precursor to the slimes everyone is familiar with? +모두에게 친숙한 슬라임의 전조인 것 같죠? +Proto-Slime (Ankles) +프로토슬라임(발목) +Proto-Slime (Legs) +프로토슬라임(다리) +Proto-Slime (Arms) +프로토슬라임(팔) +Proto-Slime (Hands) +프로토슬라임(손) +Proto-Slime (Mouth) +프로토슬라임(입) +Proto-Slime (Head) +프로토슬라임(머리) +### Living Proto-Slime Collar + +### This collar is designed to make sure its wearer does not escape the slime. + +### It will occasionally cause proto-slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-slime you have on you. + + + +Proto-Rubber (Feet) +원시 고무(피트) +### Sticky slime that has fused itself into a skintight layer. + +Proto-Rubber (Ankles) +원시고무(발목) +Proto-Rubber (Legs) +원시 고무(다리) +Proto-Rubber (Arms) +원시 고무(팔) +Proto-Rubber (Hands) +원시 고무(손) +Proto-Rubber (Mouth) +원시 고무(입) +Proto-Rubber (Head) +원시 고무(헤드) +### Living Proto-Rubber Collar + +### This collar is designed to make sure its wearer does not escape the rubber. + +### It will occasionally cause proto-rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-rubber you have on you. + +### Sticky Tape + +### Extra-strength utility tape, for your secure packaging needs. + +### It's quite sticky, the adhesive requires some force to get off. + +Tape Mittens +테이프 장갑 +Sticky tape that holds your hands into a fist! +손을 주먹으로 잡아주는 점착 테이프! +It's tough to get out of without some kind of grip! +어떤 종류의 그립 없이는 빠져 나오기가 어렵습니다! + + +Arm Chains +암 체인 +Heavy chains keeping your arms securely behind your back. +팔을 등 뒤로 단단히 고정시키는 무거운 사슬. +It doesn't look like a knife is up to the task... +나이프가 할 일이 아닌 것 같은데... +Leg Chains +다리 사슬 +Heavy chains keeping your legs firmly hobbled. +당신의 다리를 절뚝거리게 만드는 무거운 사슬. +Ankle Chains +발목 체인 +Heavy chains keeping your feet bound together. +당신의 발을 묶어주는 무거운 사슬. +Crotch Chain +가랑이 체인 +Heavy chains that serve as an anchor point around your waist. +허리 주위의 고정점 역할을 하는 무거운 사슬. + + +Magic Arm Chains +암 체인 +Magic chains keeping your arms securely behind your back. +팔을 등 뒤로 단단히 고정시키는 마법의 사슬. +Magic Leg Chains +다리 사슬 +Magic chains keeping your legs firmly hobbled. +당신의 다리를 절뚝거리게 만드는 마법의 사슬. +Magic Ankle Chains +발목 체인 +Magic chains keeping your feet bound together. +발을 묶는 마법의 사슬. +Magic Crotch Chain +가랑이 체인 +Magic chains that serve as an anchor point around your waist. +허리의 고정점 역할을 하는 마법의 사슬. + + +Shadow Chains (Arms) +섀도우 체인(무기) +Black chains for those who cross the divines +신을 넘는 자들을 위한 검은 사슬 +Shadow Chains (Legs) +그림자 사슬(다리) +Shadow Chains (Ankles) +그림자 사슬(발목) +Shadow Chain +그림자 사슬 + + +Ectoplasmic Chains (Arms) +심령체 사슬(팔) +Ghostly chains from a ghost that just doesn't want to let go. +놓아버리고 싶지 않은 유령의 유령 사슬. +It's made of an ethereal substance. +천상의 물질로 만들어졌습니다. +Ectoplasmic Chains (Legs) +심령체 사슬(다리) +Ectoplasmic Chains (Ankles) +심령체 사슬(발목) +Ectoplasmic Chain +심령체 사슬 + + +Divine Cuffs +신성한 수갑 +It is said that even heaven has its hierarchies... +하늘에도 서열이 있다고 하던데... +Shining cuffs made of holy metal. Nothing can touch it. +신성한 금속으로 만든 빛나는 수갑. 아무것도 건드릴 수 없어. +Divine Muzzle +신성한 총구 +### Keep those lips sealed. + +A shining muzzle made of holy metal. Nothing can touch it. +신성한 금속으로 만들어진 빛나는 주둥이. 아무것도 건드릴 수 없어. +### Divine Gag + +### A shining gag made of holy metal. Nothing can touch it. + +A piece of cloth secured onto your face and blocking vision. +천 조각이 얼굴에 고정되어 시야를 가리고 있습니다. +### Cleave Gag + +### A piece of cloth forced between your lips. + +On its own it's not very restrictive. +그 자체로는 그다지 제한적이지 않습니다. +### Thick Cleave Gag + +### A piece of cloth that makes it hard to speak. + +### It's somewhat effective. + +Knotted Cloth Gag +매듭 천 개그 +A piece of cloth tied in a knot and tied over your mouth. +매듭으로 묶고 입에 묶인 천 조각. +### It's pretty effective at keeping you quiet. + +OTN Cloth Gag +OTN 천 개그 +A piece of cloth tightened over your mouth. +당신의 입을 꽉 조이는 천 조각. +A scarf secured onto your face and blocking vision. +얼굴에 고정되어 시야를 가리는 스카프. +Scarf Gag +스카프 개그 +A scarf tightened over your mouth. +목도리가 입에 단단히 조여졌습니다. +Scarf Tie +스카프 넥타이 +A scarf wrapped around your body. +몸을 감싸는 스카프. +Scarf Leg Tie +스카프 레그 타이 +Scarf Ankle Tie +스카프 앵클 타이 + + +Arm Belts +팔 벨트 +A ludicrous amount of belts secured with a buckle. +버클이 달린 터무니없는 양의 벨트. +Lockable and fully adjustable to ensure snugness. +아늑함을 보장하기 위해 잠글 수 있고 완전히 조절 가능합니다. +Leg Belts +다리 벨트 +Ankle Belts +발목 벨트 + + +### Iron Cuffs + +### Tough shackles with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +You could pick these with a hairpin. +머리핀으로 이것을 고를 수 있습니다. +### Iron Shackles + +### Tough shackles with a rudimentary lock. + +### Tough to walk in. + +### Thumbcuffs + +### Interferes with the use of your hands. + +### Another layer of restriction. + +### Hinged Handcuffs + +### Hinged cuffs with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +### Difficult to unlock, let alone pick by yourself. + +### Heavy Handcuffs + +### A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. + +### The position is too awkward to free yourself, even with a key... + +### Heavy Leg Irons + +### A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. + +### The position is awkward, but it's on your feet so you can remove them yourself if you have free hands. + +### Thigh Shackles + +Heavy shackles with a rudimentary lock. +기본적인 자물쇠가 달린 무거운 족쇄. +### The enemy attaches your leg shackles together! + +### Linked Thigh Shackles + +### The leg shackles chain detaches! + +Ankle Shackles +발목 족쇄 +### Linked Ankle Shackles + +### The enemy attaches your ankle shackles together! + +### The ankle shackles chain detaches! + +Steel Muzzle +강철 총구 +A heavy muzzle with a rudimentary lock. +보통 자물쇠가 달린 무거운 주둥이입니다. +You could pick this with a hairpin. +머리핀으로 이것을 고를 수 있습니다. +### Blacksteel Muzzle + +### A heavy duty steel muzzle with a flexible metal locking pin and straps. + +### Perfect for sealing away those unruly lips. + + + + + +Cursed Collar +저주받은 목줄 +A cold steel collar locked tightly on your neck. +목에 단단히 고정된 차가운 강철 목걸이. +It appears to attract additional enemies to its wearer. +착용자에게 추가 적을 끌어당기는 것 같습니다. + + +Face +얼굴 +Head +머리 +Mouth +입 +Ears +귀 +Neck +목 +Arms +무기 +Hands +소유 +Torso +몸통 +Bra +좋은 +Belt +벨트 +Plug +플러그 +Vibe +바이브 +Piercings +피어싱 +Butt Plug +엉덩이 플러그 +Legs +다리 +Ankles +발목 +Device +장치 + + +### You found an item that was too small to see! + +### You pick up XXX gold. + +You retrieve an ancient power crystal. +당신은 고대의 파워 크리스탈을 되찾았습니다. +You retrieve a spent ancient power crystal. +사용한 고대의 힘 수정을 되찾았습니다. +You pick up a magical amulet and use it to boost your stats. +당신은 마법의 부적을 집어들고 그것을 사용하여 당신의 능력치를 향상시킵니다. +### You pick up a Leyline Map. + +### You pick up a knife. + +### You pick up a torch. + +You found a bundle of discarded knives! +버려진 칼 다발을 찾았군요! +### You pick up a magic knife. + +### You pick up a lockpick. + +### You pick up a normal key. + +### You pick up a green key. + +### You pick up a blue key. + +### You pick up a willpower potion. + +### You pick up a glowing blue mana potion. + +### You pick up a glowing blue orb. + +### You pick up an invisibility potion. + +### You pick up a handful of ectoplasm. + +### You pick up a green stamina potion. + +### You pick up a frigid white potion. + +You found a peculiar note on the ground and keep it in your journal. +당신은 땅에서 특이한 메모를 발견했고 그것을 당신의 일지에 보관했습니다. +You found an uninteresting note on the ground. +지상에서 흥미롭지 않은 메모를 발견했습니다. +You pick up a heavy hammer. +무거운 망치를 들어라. +You pick up a set of bolt cutters. +당신은 볼트 절단기 세트를 집습니다. +You pick up a sharp sword. +당신은 날카로운 검을 집습니다. +You pick up a flamberge. +당신은 플랑베르주를 줍습니다. +You recover your escort drone. +당신은 당신의 호위 드론을 회수합니다. +You pick up a 'magic' wand... +당신은 '마술' 지팡이를 집어들고... +You pick up a magical ice cube. +당신은 마법의 얼음 조각을 집었습니다. +You find some treated hemp rope. +처리된 대마 로프를 찾았습니다. + + +Feather +깃털 +### A feather taken from some large fluffy being. + +### Deals tickle damage. Greatly distracting. Offhand: +1 tickle damage on attack for 3 stamina. Greatly distracting. + +You pick up a feather. +당신은 깃털을 집습니다. + + +### Maid's Feather Duster + +### An instrument used extensively by maidforce agents carrying out their duties. + +### Deals tickle damage. Distracts enemies. Offhand: +15 distraction on attack for 1 stamina. + +### You pick up a feather duster. + + + +### Rope Rune + +### You smash the rune in front of you, and a flash of light enchants nearby ropes! + +### It feels tantalizing to look at. + +### Allows you to enchant ropes into more powerful restraints. + +### You pick up a kinky trinket with a glowing red sigil. + +You pick up a heavy flail. +무거운 도리깨를 들어라. +You pick up a shortspear. +당신은 shortspear를 선택합니다. +### You pick up a long spear. + +You pick up a pickaxe. +당신은 곡괭이를 줍습니다. +You pick up an enchanted sword. +당신은 마법이 부여된 검을 집었습니다. +You pick up an enchanted axe. +당신은 마법에 걸린 도끼를 집었습니다. +You pick up an enchanted hammer. +당신은 마법에 걸린 망치를 집습니다. +You pick up a light hammer that's inscribed 'IceBreaker'. +당신은 'IceBreaker'라고 적힌 가벼운 망치를 집습니다. +You pick up an enchanted spear. +당신은 마법에 걸린 창을 집었습니다. +You pick up an enchanted flail. +당신은 마법에 걸린 도리깨를 집었습니다. +You pick up a powerful axe. +당신은 강력한 도끼를 집습니다. +You pick up a consumable smoke bomb. +소모성 연막탄을 집으십시오. +### You pick up a stone trinket with a glowing red sigil. + +### You pick up a wet rock with some kind of symbol on it. + +### You pick up a crystal beautiful as the moon. + +### You pick up a strange device with a sharpened razor disc. + +You find a strange ancient device with a sharp cutting blade. +예리한 칼날이 달린 이상한 고대 장치를 발견했습니다. +### You pick up a stone trinket with a glowing blue sigil. + +You pick up a bola. +당신은 볼라를 집습니다. +You pick up a bomb! +당신은 폭탄을 집어! +You pick up Dragonslaver. +드래곤 슬레이버를 집으십시오. +You pick up Metamorphosis. +당신은 변태를 선택합니다. +You pick up Four Seasons. +당신은 Four Seasons를 선택합니다. +You pick up The Arbiter. +당신은 The Arbiter를 선택합니다. +You pick up Dreamcatcher. +드림캐쳐 주워. +You retrieve the Bondage Buster EX. +본디지 버스터를 되찾았습니다 EX. +### You salvage a Bondage Buster MK II. + +You retrieve a Nevermere Blaster Mark IV. +Nevermere Blaster Mark IV를 회수했습니다. +You retrieve the Messenger of Love. +당신은 사랑의 메신저를 회수합니다. +You retrieve Moirai's scissors. +당신은 모이라이의 가위를 회수합니다. + + +You pick up a bunch of scrolls! +당신은 많은 두루마리를 집었습니다! +You pick up a Scroll of Sleight. +당신은 교활한 두루마리를 집었습니다. +You pick up a Scroll of Purity. +당신은 순수의 두루마리를 집었습니다. +You pick up a Scroll of Speech. +당신은 연설 두루마리를 집습니다. +You pick up a Scroll of Sauntering. +당신은 소란의 두루마리를 집었습니다. + + +### Your weapon is pulled out of your grasp!!! + +### Your weapon is pulled out of your hand and tossed away by your captor! + +Your weapon slips out of your hand as you try to cut with it... +네 무기로 베려고 할 때 손에서 빠져나간다... + + +You put away the WEAPONNAME +당신은 WEAPONNAME을 집어넣었습니다 +You equip the WEAPONNAME +당신은 WEAPONNAME을 장비합니다 +Unequip +장비 해제 +Equip +갖추어 주다 +Equipped +갖추어 준 + + + + +Unlit Torch +꺼진 횃불 +Can be lit +점등 가능 +Provides light +빛을 제공하다 +Lantern +칸델라 +Magic Lantern +환등기 +Unlit Lantern +꺼진 랜턴 +### Wall Sconce + +### Broken Wall Sconce + +### It is beyond repair. + +### Light Portal + +### Empty Portal + +### Stare into the void... + +Liquid Latex +액체 라텍스 +Engulfs creatures +생물을 삼킨다 +### Engulfs pets (like you) + +Slows creatures +느린 생물 +Glue +접착제 +Ice +얼음 +Chilling and slippery +차갑고 미끄럽다 +Water +물 +### A concentration of moisture. + +Looking for a new wearer +새로운 착용자를 찾습니다 +Chains +쇠사슬 +Broken pieces of chain +부러진 사슬 조각 +Belts +벨트 +Pieces of straps and leather +스트랩과 가죽 조각 +Vines +덩굴 +Fierce plantlife +사나운 식물 +Ribbons +고삐 +Empowered with magic +마법으로 강화 +Blessed Wrappings +축복받은 포장지 +Enchanted wrappings +매혹적인 포장 +Summoning Runes +소환의 룬 +Mystical runes used for summoning +소환에 사용되는 신비한 룬 +### Casting Runes + +### Mystical runes used for casting spells + +### Suspicious Mechanism + +### A suspicious mechanism that seems to have been hastily put together. + +### Suspicious Runes + +### A suspicious magic circle that was scrawled recently. + +Embers +여신 +Ignition source. Blocks vision. +점화원. 시야를 차단합니다. +Inferno +지옥 +Deals DAMAGEDEALT fire damage per turn +턴당 DAMAGEDEALT 화염 피해를 입힙니다. +Steam +증기 +Blocks vision +시야 차단 +Smoke +연기 +Cracked Earth +금이 간 지구 +Makes creatures unsteady +생물을 불안정하게 만듭니다. +### Rubble + +### You don't think insurance will cover this. + +### No putting that back together. + +Can be controlled using CMD spells +CMD 주문을 사용하여 제어할 수 있습니다 +Can be controlled using Rubbermancy +러버맨시로 제어 가능 + + +Floor +바닥 +### Object + +Brickwork +벽돌 쌓기 +Doodad +토론 +Furniture +가구 +Table +테이블 +Shrine +신사 +### Closed Door + +### Open Door + +### Bed + +### Bars + +Ruined Shrine +폐허가 된 신전 +Orb Altar +오브 제단 +Empty Altar +빈 제단 +Chest +가슴 +### Faction Chest + +### Open Chest + +Shiny Object +반짝이는 물체 +Cracked Wall +금이 간 벽 +Hook +훅 +Entrance +입구 +Exit Stairs +출구 계단 +Mysterious Stairs +신비한 계단 +Ghostly Adventurer +유령 모험가 +### Button + +### Conveyor + +### Safety Conveyor + +### Doll Terminal + +### Doll Supply + +### Bondage Machine + +### Empty Fixture + +### Filled Fixture + +### Tablet + + + + + +Ars Pyrotecnica +아르스 파이로테크니카 +Codex Imaginus +코덱스 이미지너스 +Clavicula Romantica +로맨틱 쇄골 +A book of elemental magic +원소 마법의 책 +A book about conjuration +컨저링에 관한 책 +A book of manipulative spells +조작 마법의 책 + + +Verbal +언어 적 +### Vision + +### Components: + +Arm Movements +팔의 움직임 +Leg Gestures +다리 제스처 +### You mumble incoherently trying to cast the spell... + +### You wiggle uselessly trying to cast the spell... + +### Your feet are too clumsy to perform the magic gesture... + +### You are unable to see, so you can't target this spell... + +Next Page +다음 페이지 +Last Page +마지막 페이지 +### >>> + +### <<< + +Random Page (your hands are tied) +랜덤 페이지(손이 묶여 있습니다) + + +Misc +기타 +Other +다른 +Strength +힘 +Dexterity +재치 +Intelligence +지능 + + +### Unique + +### Active + +Upgrades +업그레이드 + + +Learnable +학습 가능 +Unlearned +배우지 않은 +### Learned + +Excl. Upgrades +제외 업그레이드 +Passive +수동적인 +Upcast +배기갱 +Buffs +버프 +DoT +점 +Projectiles +발사체 +Melee +난투 +Area Damage +지역 피해 +Area Denial +지역 거부 +Offense +위반 +Defense +방어 +Fire +불 +Earth +지구 +Air +공기 +Lightning +번개 +Teleport +텔레포트 +Physics +물리학 +Summoning +소환 +Binding +제본 +Stealth +몰래 하기 +Projection +투사 +Alteration +변경 +Light +빛 +Shadow +그림자 +Knowledge +지식 +### Archery + +Utility +공익사업 +Spell Tree +주문 트리 +Stamina +내구력 +Damage +손상 +Distraction +혼란 + + +Empower to upcast spells +업캐스트 주문 강화 +Cancel empowerment +권한 부여 취소 +You channel mana through your body! Empowerment level: LEVEL +당신은 당신의 몸을 통해 마나를 전달합니다! 강화 수준: LEVEL +You are already at the maximum empowerment level! +당신은 이미 최대 강화 레벨에 도달했습니다! +You don't have any upcast spells yet. +아직 업캐스트 주문이 없습니다. +Upcast from SPELL +SPELL에서 업캐스트 + + +You fail to concentrate on the spell and it fizzles! +당신은 주문에 집중하지 못하고 어지러워집니다! +Your gag causes you to mispronounce the magic words! +당신의 개그 때문에 마법의 단어를 잘못 발음하게 됩니다! +### You are too clumsy to perform the leg movements! + +### You can't get a good look at the target! + +### You trip up while casting the spell! + +### You miscast the spell because of a bug. Please report. + +### You wave your arms around and make the wrong symbol with your hands! + +### Your restrained fingers can't make the magic glyphs in time! + + + +The ice drains your concentration! Your mana and stamina are slipping away! +얼음이 집중력을 떨어뜨립니다! 당신의 마나와 스태미나가 빠져나가고 있습니다! +A strange, chaotic energy flows into you! Your will is weakened and your mana fades! +이상하고 혼란스러운 에너지가 당신에게 흘러 들어옵니다! 의지가 약해지고 마나가 사라집니다! +Something gently, constantly tickles you! +무언가 부드럽게, 끊임없이 당신을 간질입니다! + + +The ampule shatters on impact! +충격에 앰플이 산산조각! +The gas ampule shatters on impact! +가스 앰플이 충격을 받으면 부서집니다! +The glue ampule shatters on impact! +글루 앰플이 충격에 부서집니다! +The rubber ampule shatters on impact! +고무 앰플은 충격에 산산조각! +The latex ampule shatters on impact and forms a restraint! +라텍스 앰플이 충격에 깨져 구속을 형성! +The latex ampule shatters on impact and coats your body! +라텍스 앰플이 충격에 깨지면서 몸을 코팅! +The latex ampule shatters on impact and sticks to you! +라텍스 앰플이 충격에 깨져 착 달라붙는! + + +Shadowy chains appear from a rift in space! +어둠의 사슬이 우주의 균열에서 나타납니다! +The roaring inferno deals 10 damage to you! +포효하는 지옥이 당신에게 10의 피해를 입힙니다! + + +### The Reaping + +### +20% damage to plants + +### Magically Iliterate + +### You've never read a magic book. Elemental, Conjuration, and Illusion spells cost 3x as many spell points. + +### Magical Spark + +### Reduce the penalty from Magically Iliterate to 2x. + +### Magical Training + +### Remove the penalty from Magically Iliterate. + +### Reap What You Sow + +### Defeating a non-humanoid enemy causes vines to sprout on their space temporarily. + + + +### Battle Rhythm + +### Stores 10% of the stamina cost of attacks as Rhythm, up to a total of 40. While you have over 10 Rhythm, you gain +10 Block and Evasion. Enemy base accuracy against you is decreased by a % equal to your Rhythm. If an attack misses or is blocked because of this, reduce Rhythm by 25% of the enemy attack power. Decays when not attacking. + +### Limit Surge + +### Spend 40 WP to fully restore Stamina, also stamina gain is increased by 30% for 20 turns. If your Willpower ends up 0 because of this, you are stunned for 2 turns. + +### Battle Trance + +### While at 40 Battle Rhythm, you attack twice per turn. + +### Combat Maneuver + +### When Battle Trance is active, you gain a free move if the target is defeated before the second attack hits. + + + + + +### Devious Ingenuity + +### Trap-type spells and consumables no longer require you to channel them, but still have a delay before arming. + + + + + +### Essence Motes + +### When you miscast a spell, you gain an Essence Mote which appears in a random space next to you. You can consume this mote to gain -100% miscast chance decaying over 10 turns. Walking over the mote also consumes it. + +### Inner Power + +### As a wizard, you are able to draw upon mystical sources of energy that others can't even see. After 16 turns of not casting a spell or attacking, your next spell's mana cost is reduced by 20% of your max mana BEFORE multipliers. Toggled passive spells apply half the cooldown. + +### Battlemage + +### Inner Power cooldown is no longer reset after attacking. + +### Relentless Casting + +### While on cooldown, Inner Power cooldown is no longer reset after casting spells. + +### Arcane Recharge + +### Calling upon chaotic energies, your willpower is assaulted in exchange for power. Deals 80 psychic damage to self and drains 10% of your max Willpower to fully restore mana. Does not refill the mana pool. + +### Way of Pleasure + +### You have chosen the path of absolute pleasure. After letting go of yourself, you restore 50 mana, which can refill the mana pool if you have spare willpower. Blocks Way of Discipline. + +### Intense Power + +### After letting go of yourself, you feel an immense surge of power, increasing magic damage by 40% for 8 turns after you regain control, and by 10% while you remain satisfied. + +### Pleasure Training I + +### You remain satisfied for much less time after letting go. Letting go costs 50% less stamina. + +### Pleasure Training II + +### You are quite difficult to satisfy. Letting go costs 50% less stamina (75% total) and 50% less willpower. + +### Mental Resistance + +### +100 Psychic and Charm Resist. You can no longer let go involuntarily while your WP is above 10% or you are shielded, and willpower drains 70% slower while edged. (click the buff to toggle) + +### Mental Resistance: You cannot orgasm except by choice or below 25% WP. Click to toggle. + +### Mental Resistance: You are allowing yourself to let go. Click to toggle. + + + +### Way of Discipline + +### You have chosen the path of absolute discipline. Being in an Edged state increases passive mana recovery and you regenerate 0.5 mana per turn, restoring the same amount to the Mana Pool if you have willpower to spare. Blocks Way of Pleasure. + +### Way of Denial + +### Harnessing your mental discipline, you regenerate 20 mana each time you are denied, restoring the same amount to the Mana Pool if you have willpower to spare. + + + +Flame Novice +화염 초보자 +Unlocks fire spells. Learn Firebolt. +불 주문을 잠금 해제합니다. 파이어볼트를 배우세요. +Lightning Novice +번개 초보자 +### Unlocks electrice spells. Learn Electrify. Gain increased resistance to blinding from bright lights. + +Water Novice +물 초보자 +Unlocks water spells. Learn Water Ball. +물 주문을 잠금 해제합니다. 워터볼을 배워보세요. +Ice Novice +아이스 노비스 +Unlocks ice spells. Learn Freeze. +얼음 주문을 잠금 해제합니다. 동결을 배우십시오. +Earth Novice +지구 초보자 +Unlocks earth spells. Learn Stone Skin. +대지 주문을 잠금 해제합니다. 스톤 스킨을 배웁니다. +Air Novice +에어 노비스 +Unlocks air spells. Learn Wind Blast. +공기 주문을 잠금 해제합니다. 윈드 블래스트를 배웁니다. + + +Latex 101 +라텍스 101 +Unlocks latex spells. Learn Slime Ball. +라텍스 주문을 잠금 해제합니다. 슬라임볼을 배웁니다. +Metal 101 +금속 101 +Unlocks metal spells. Learn Conjure Cuffs. +금속 주문을 잠금 해제합니다. Conjure Cuffs를 배우십시오. +Rope 101 +로프 101 +Unlocks rope spells. Learn Conjure Ropes. +로프 주문을 잠금 해제합니다. Conjure Ropes를 배우십시오. +Leather 101 +가죽 101 +Unlocks leather spells. Learn Conjure Gag. +가죽 주문을 잠금 해제합니다. Conjure Gag를 배우십시오. +Physics 101 +물리학 101 +### Unlocks teleportation and spatial manipulation spells. Learn Wall. + +Summoning 101 +소환 101 +Unlocks summoning spells. Learn Summon Familiar. +소환 주문을 잠금 해제합니다. Summon Familiar를 배우십시오. + + +Blessing of Shadow +그림자의 축복 +Unlocks shadow spells. Learn Shadow Dagger. +그림자 주문을 잠금 해제합니다. 쉐도우 대거를 배우십시오. +Blessing of Light +빛의 축복 +### Unlocks light spells. Learn Flash. Gain significantly increased resistance to blinding from bright lights. + +Blessing of Obscurity +모호함의 축복 +Unlocks invisibility spells. Learn Camouflage. +보이지 않는 주문을 잠금 해제합니다. 위장을 배우십시오. +Projection Magic +프로젝션 매직 +Unlocks illusory spells. Learn Summon Decoy. +환상적인 주문을 잠금 해제합니다. 소환 미끼를 배웁니다. +Alteration Magic +변경 마법 +Unlocks alteration spells. Learn Confuse. +변경 주문을 잠금 해제합니다. 혼란을 배우십시오. +Arcane Knowledge +신비한 지식 +Unlocks knowledge and critical-strike spells. Learn True Steel, and unlocks advanced tooltips for enemies. +지식과 치명타 주문을 잠금 해제합니다. True Steel을 배우고 적에 대한 고급 툴팁을 잠금 해제합니다. + + +### The glue sticks to you and engulfs your legs! + +The glue slows you down! +접착제로 인해 속도가 느려집니다! +The glue slows you down! (-DamageDealt SP) +접착제로 인해 속도가 느려집니다! (-DamageDealt SP) + + +Firebolt +파이어볼트 +Elemental's Firebolt +엘리멘탈의 파이어볼트 +Elemental's Gust +정령의 돌풍 +### Gust + +### A ball of flame that does DamageDealt damage to one target. + +You a hurl a firebolt! +당신은 firebolt를 던져! +Choose aim direction +조준 방향 선택 + + +Windblast +돌풍 +### Three scattered puffs of wind that do DamageDealt blast damage at close range, stun briefly, and push targets back. + +You press your wrists together and conjure a blast of wind! +당신은 두 손목을 함께 누르고 바람의 돌풍을 불러일으킨다! +### Three puffs of wind in a tight cone that deal DamageDealt blast damage and push targets back. + +### You exhale a mighty wind! + + + +### Throw one of your knives DamageDealt damage. Lands in the target's tile, but is recoverable afterward. + +You a throw a knife! +당신은 칼을 던져! + + +Shadow Dagger +섀도우 대거 +A cold shadowy blade that deals DamageDealt damage and pierces all in its path. +DamageDealt 피해를 입히고 경로에 있는 모든 것을 관통하는 차갑고 어두운 칼날입니다. +You a hurl a shadowy dagger! +어둠의 단검을 던지십시오! + + +Shadow Slash +그림자 베기 +Shadow Scythe +그림자 낫 +### Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. Deals 50% more damage when you are attacking from the shadows. + +You create a tear in space with your finger! +당신은 당신의 손가락으로 공간에 눈물을 만듭니다! + + +Blink +깜박거리다 +### Instantly teleport to an adjacent position and gain +50 evasion for 3 turns. Unlocks Blink and Warp when learned. + +You teleport! +당신은 텔레포트! +### Choose target location (1 tile range) + +### Blink II + +### Instantly teleport up to 2 tiles away. Must have vision of the target point. Stuns an enemy if you teleport behind them. + +### Choose target location (2 tile range) + +### Blink III + +### Instantly teleport up to 3 tiles away. Must have vision of the target point. + +### Choose target location (3 tile range) + +Ice Shard +얼음 조각 +A shard of ice that does DamageDealt damage and slows for Duration turns. Freezes if already slowed or drenched. +DamageDealt 피해를 입히고 지속 시간 동안 느려지는 얼음 조각입니다. 이미 느려지거나 흠뻑 젖으면 멈춥니다. +You a hurl a shard of ice! +당신은 얼음 조각을 던집니다! + + +Ice Lance +얼음창 +A quick-moving shard of ice that does DamageDealt damage and slows for Duration turns and passes through enemies. Freezes if already slowed or drenched. +빠르게 움직이는 얼음 조각으로 DamageDealt 피해를 입히고 지속 시간 동안 둔화되며 적을 통과합니다. 이미 둔화되거나 흠뻑 젖으면 얼어붙습니다. +You conjure a mighty spear of ice and hurl it forward! +당신은 강력한 얼음 창을 불러내어 앞으로 던집니다! + + +Snowball +스노볼 +A fast orb that leaves behind a frigid cloud of ice. Enemies walking in the cloud take DamageDealt ice damage per tile and are slowed. +차가운 얼음 구름을 남기는 빠른 보주입니다. 구름 속을 걷는 적들은 타일당 DamageDealt 얼음 피해를 입고 느려집니다. +You a hurl a snowy blast! +당신은 눈보라를 던집니다! + + +Winterblast +윈터블래스트 +A piercing orb that leaves a trail of ice. Deals DamageDealt ice damage to enemies hit. +얼음의 흔적을 남기는 꿰뚫는 보주. 적중한 적에게 DamageDealt 얼음 피해를 입힙니다. +You a hurl a frigid orb! +당신은 차가운 구를 던집니다! + + +Freeze +얼다 +### Chill an adjacent target for DamageDealt ice damage and slows for Duration turns. Freezes if already slowed or drenched. + +You utter dark words of ice-cold truths. +당신은 얼음처럼 차가운 진실의 어두운 말을 합니다. +Choose a target to freeze +고정할 대상 선택 + + +Flash Frost +플래시 프로스트 +Deal DamageDealt ice damage in a 3x3 area. Drenched creatures are frozen for 8 turns. +피해 입히기3x3 지역에 얼음 피해를 입힙니다. 흠뻑 젖은 생명체는 8턴 동안 얼어붙습니다. +You recite a frigid poem... +당신은 차가운 시를 낭송합니다... +Choose a 3x3 area to freeze +고정할 3x3 영역 선택 + + +Shatter +파편 +When a frozen target thaws or dies, deals DamageDealt ice damage to nearby targets and slow for 4 turns.. +얼어붙은 대상이 녹거나 죽으면 주변 대상에게 DamageDealt 얼음 피해를 입히고 4턴 동안 둔화시킵니다.. + + +Ignite +점화 +Ignite a friendly target for Duration turns, dealing DamageDealt fire damage per turn to it and nearby targets. +지속 시간 동안 아군 대상을 불태워 대상과 주변 대상에게 매 턴마다 DamageDealt 화염 피해를 입힙니다. +You spin in a circle, inscribing flames with your feet! +당신은 발로 불꽃을 새기면서 원을 그리며 돌고 있습니다! +Choose a friendly target to ignite +발화할 아군 대상 선택 + + +Conjure Chain +사슬을 창조하다 +Magic Chain +매직 체인 +### Magic Belt + +Witch's Chain +마녀의 사슬 +Throws a chain that does DamageDealt chain damage. Targets with 50% or more binding take 50 crush damage and are slowed for 4 turns. +DamageDealt 체인 데미지를 주는 체인을 던집니다. 바인딩이 50% 이상인 대상은 50의 크러쉬 데미지를 받고 4턴 동안 둔화됩니다. +You a hurl a strand of chain! +당신은 체인의 가닥을 던져! + + +### Enchant Rope + +### Rope Enchantment + +### Spellbinding + +### Convert rope binding on a target into magical bindings, which are much more powerful. Deals a small amount of arcane damage. + +### You whisper an enchanting tale of rope bondage... + +### Choose targets to tighten the ropes of + +Conjure Ropes +밧줄을 불러내다 +Animated Rope +애니메이션 로프 +### Launch 3 ropes that deal DamageDealt chain damage each and add 32 rope binding. + +You animate a bunch of ropes! +당신은 많은 밧줄을 애니메이션! + + +### Ropestorm + +### Launch 9 ropes that deal DamageDealt chain damage each and add 32 rope binding. Best in open spaces. + +### You animate a sizeable quantity of ropes! + +Steel Torrent +스틸 토렌트 +Steel Rain +강철비 +The plug hits you! (DamageDealt) +플러그가 당신을 때립니다! (DamageDealt) +The plug directs itself between your legs! +플러그가 다리 사이로 향합니다! +Fire 4 Steel Rain in quick succession toward the target point. Best in open spaces. +목표 지점을 향해 빠르게 연속적으로 4개의 강철비를 발사합니다. 개방된 공간에서 최고입니다. +Fires a steel plug that deals DamageDealt piercing damage. Bound targets are Plugged, which increases Distraction over time. +DamageDealt 관통 피해를 주는 강철 플러그를 발사합니다. 묶인 대상은 연결되어 시간이 지남에 따라 산만함이 증가합니다. +You raise your hand and a steel projectile appears! +손을 들면 강철 발사체가 나타납니다! +You raise your hand and several steel projectiles appear! +손을 들면 여러 개의 강철 발사체가 나타납니다! +Choose target point +목표 지점 선택 + + + + +Restraining Device +구속 장치 +The thrown restraining device latches onto you as you struggle to get it off!!! +던져진 구속 장치는 당신이 그것을 내리기 위해 고군분투하는 동안 당신에게 걸쇠가 걸립니다!!! +The restraining device wraps many elastic cables around you!!! +구속 장치는 당신 주위에 많은 탄성 케이블을 감쌉니다!!! + + +### Shadowy Grip + +### A dark hand latches onto you and holds you tight! + +### You are snugly wrapped in glowing ropes! + +### Obsidian Orb + +### Metallic restraints encircle your body! + +### The latex spreads across your limbs and rubberizes, forming a tough barrier! + +### The latex spreads across your limbs and hardens, forming a stretchy layer! + +### The latex clings to you and slows you down, making you vulnerable to the barrage! + +### The latex expands rapidly and slows you down as it hardens into a stretchy layer! + + + +You throw a bola! +당신은 볼라를 던집니다! +You ready a bola! +당신은 볼라를 준비했습니다! + + +You are feeling drowsy... +졸리시죠... + + +Shadow Strike +섀도우 스트라이크 +Shadow Heel +섀도우 힐 + + +Runic Ward +룬 와드 +Gives yourself or a creature a magic shield for 50 turns, granting +30 Magic Armor. +자신이나 생물에게 50턴 동안 마법 보호막을 부여하여 +30 마법 갑옷을 부여합니다. +You whisper a word of protection! +당신은 보호의 말을 속삭입니다! +Choose creature to shield +보호할 생물 선택 + + +Afterimage +잔상 +Massively increases a creature's evasion for 5 attacks. Expires after 25 turns. +5회 공격에 대한 생물의 회피를 크게 증가시킵니다. 25턴 후에 만료됩니다. +Your movements intensify! +움직임이 격렬해집니다! +Choose creature to buff +강화할 생물 선택 + + +Magical Sight +마법의 시력 +Highlight the location of interesting magical phenomena for 20 turns +20턴 동안 흥미로운 마법 현상의 위치를 ​​강조 표시 +You analyze the target! +당신은 대상을 분석! +Choose object to analyze +분석할 객체 선택 + + +Barrier Runes +배리어 룬 +### Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns, but doesn't block movement. + +You raise a field of runes with a command word! +당신은 명령어로 룬 필드를 올립니다! +Choose barrier location +장벽 위치 선택 + + +Electric Field +전기장 +Creates a conductive area for Duration turns. Makes all entities in the area Conductive, forcing them to share 50% electric damage. +지속 시간 동안 전도성 영역을 생성합니다. 해당 영역의 모든 엔티티를 전도성으로 만들어 50%의 전기 손상을 공유하도록 합니다. +You energize the targeted area! +목표 지역에 활력을 불어넣습니다! +Choose target 3x3 area +대상 3x3 영역 선택 + + +### Firey Explosion + +### Icey Explosion + +Witch's Electric Orb +마녀의 전기구 +Witch's Electric Burst +마녀의 일렉트릭 버스트 + + +Electrify +깜짝 놀라게 하다 +A delayed shock that deals DamageDealt damage and stuns for Duration turns. +DamageDealt 피해를 입히고 Duration 턴 동안 기절시키는 지연된 충격입니다. +You charge up a burst of electricty! +당신은 전기의 버스트를 충전! +Choose target location +대상 위치 선택 + + +The elemental channels the force of the storm! +정령이 폭풍의 힘을 전달합니다! + + +Fireball +화구 +### A slow moving ball of flame that explodes for DamageDealt fire damage in a wide area. + +### You a hurl a massive fireball! + +### Fireblast + +### A bolt of flame that explodes for DamageDealt fire damage in an area. + +### You a hurl a blast of flame! + +Incinerate +태워서 재로 만들다 +A tornado of flame that does DamageDealt damage per turn for LifeTime turns. +LifeTime 턴마다 DamageDealt 데미지를 주는 화염의 토네이도입니다. +You conjure a gout of flame! +당신은 화염의 통풍을 요술! +Choose target AoE location +대상 AoE 위치 선택 + + +Hailstorm +우박 폭풍 +A cloud of falling ice that does DamageDealt damage per turn for LifeTime turns and slows. +평생 동안 매 턴마다 DamageDealt 피해를 입히고 느려지게 하는 떨어지는 얼음 구름입니다. +You conjure a flurry of frost! +당신은 서리의 폭풍을 불러일으킵니다! + + +Raincloud +비구름 +After 3 turns, rain falls, creating a 3x3 grid of water and dealing DamageDealt acid damage to enemies within. +3턴 후에 비가 내려 3x3 물 격자를 만들고 DamageDealt 산성 피해를 내부의 적에게 입힙니다. +You create a stormy cloud! +당신은 폭풍우 구름을 만듭니다! + + +Field of Frost +프로스트 필드 +Freezes a 5x5 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. +5x5 영역을 얼립니다(얼음은 개체를 느리게 합니다). 해당 지역의 적들은 라이프타임 턴 동안 매 턴마다 DamageDealt 데미지를 입습니다. +### You stomp your foot and call forth the blizzard! + +Choose target AoE location (5x5) +대상 AoE 위치 선택(5x5) +### Zone of Frost + +### Freezes a 3x3 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. + +### You sweep your foot and call forth the storm! + +### Choose target AoE location (3x3) + +### Cold Feet + +### Freezes a single tile (ice slows entities). Any enemy standing on the tile takes take DamageDealt damage per turn for LifeTime turns. + +### You tap your foot and call forth the frost! + +### Choose target location (1x1) + +Healing Light +치유의 빛 +Channel to heal 15 hitpoints per turn to summoned allies within a 5x5 area. +정신집중 하여 5x5 영역 내의 소환된 아군의 체력을 턴당 15씩 치료합니다. +You conjure a healing light! +당신은 치유의 빛을 불러일으킵니다! + + +Crackle +크랙클 +Storm Bolt +스톰 볼트 +A bolt of lightning that does DamageDealt electric damage to enemies in a 4-range line and briefly stuns. +피해를 입히는 번개 화살4 범위의 적에게 전기 피해를 주고 잠시 기절시킵니다. +Lightning erupts from your fingertips! +손끝에서 번개가 칩니다! +Choose line direction (max range 4 tiles) +선 방향 선택(최대 범위 4타일) + + +Tremor +떨림 +### Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. Creates a slowing field after. + +You call forth the rage of the earth. +당신은 땅의 분노를 불러일으킵니다. +Choose AoE +광역 선택 + + +Earthquake +지진 +Channel for 5 turns to send 2 tremors per turn in target area. +5턴 동안 정신을 집중하여 대상 지역에 턴당 2번의 떨림을 보냅니다. +You channel the fury of the earth!!! +당신은 대지의 분노를 전달합니다!!! + + +Shock Orb +쇼크 오브 +A slow-moving orb that deals DamageDealt electric damage to an adjacent enemy each turn. +매 턴 인접한 적에게 피해를 입히는 느리게 움직이는 구체입니다. +You hurl a charged orb! +충전된 구를 던집니다! +Choose aim direction (max range 4 tiles) +조준 방향 선택(최대 범위 4타일) + + +Lightning Rune +번개의 룬 +### A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 3 turns to setup. 200% crit multiplier. + +You conjure a charged trap! +당신은 충전된 함정을 불러냅니다! +Choose location for trap +트랩 위치 선택 + + +Freeze Rune +프리즈 룬 +### A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 3 turns to setup. 200% crit multiplier. + +You conjure an icy trap! +당신은 얼음 덫을 사용합니다! + + +Flame Rune +화염의 룬 +### A trap that deals DamageDealt fire damage in an area. Takes 3 turns to setup. 200% crit multiplier. + +You conjure an incendiary trap! +당신은 소이 함정을 요술! + + +Conjure a sphere for Duration turns that makes nearby entities Conductive and each turn deals DamageDealt electric damage to one of them. +근처의 엔티티를 전도성으로 만드는 지속 시간 동안 구체를 생성하고 각 턴마다 그들 중 하나에게 DamageDealt 전기 손상을 입힙니다. +You summon a grey, featureless sphere adorned by static! +당신은 정전기로 장식된 회색의 특징 없는 구체를 소환합니다! +Choose sphere location +구체 위치 선택 + + +Fissure +열구 +Lava Fissure +용암 균열 +A great fissure erupts from the earth, dealing 70 fire damage to enemies in a 4-range line and dealing 15 damage/turn for 6 turns. +대지에서 큰 균열이 발생하여 4범위 범위의 적에게 70의 화염 피해를 주고 6턴 동안 턴당 15의 피해를 줍니다. +You stomp the ground and the earth opens its gaping maw! +당신이 땅을 밟으면 땅이 입을 벌립니다! + + +Lightning Bolt +번갯불 +A bolt of lightning that does DamageDealt damage to enemies in an infinite line and briefly stuns. +무한 선상에 있는 적에게 피해를 입히고 잠시 기절시키는 번개 화살. +You unleash a bolt of lightning! +당신은 번개를 발사합니다! +Choose line direction +선 방향 선택 + + +Corona +코로나 +Binding Light +결속의 빛 +Chaos Beam +카오스 빔 +Mystic Beam +미스틱 빔 +### Mystic Barrage + +### A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt holy damage to the first target hit. Blinds for 12 turns. 150% crit multiplier. + +You charge a powerful beam attack!!! +당신은 강력한 빔 공격을 돌진!!! + + +Icicles +고드름 +Icicle +고드름 +Channel 3 turns to fire 3 icicles that deal DamageDealt ice damage and slow for 4 turns, freezing slowed/drenched targets for 3 turns. +채널 3턴은 DamageDealt 얼음 피해를 입히고 4턴 동안 느려지게 하는 3개의 고드름을 발사하여 3턴 동안 느려지거나 흠뻑 젖은 대상을 얼립니다. +You raise a hand and icicles fly forward! +손을 들면 고드름이 앞으로 날아갑니다! + + +Volcanism +화산 활동 +An area of summoned rocks becomes explosive. Deal fire damage to them to ignite, dealing DamageDealt fire damage to adjacent targets. +소환된 바위 지역이 폭발합니다. 화염 피해를 가해 불을 붙이고 인접한 대상에게 피해를 입히는 화염 피해를 입힙니다. +You stomp your foot and magma wells up beneath the ground! +발을 구르면 땅 밑에서 마그마가 솟아오릅니다! +Choose monoliths to enchant +인챈트할 모노리스 선택 + + +Coalesce +합체 +Gathers slime and slimed enemies into a central point. Deals DamageDealt glue damage per square of slime and Encases slimed enemies. Costs half mana if there is only slime. +슬라임과 슬라임된 적을 중앙 지점으로 모읍니다. 슬라임 평방당 DamageDealt 접착제 피해를 입히고 슬라임된 적을 둘러쌉니다. 슬라임만 있는 경우 마나가 절반으로 소모됩니다. +You command the slime to draw enemies in! +당신은 슬라임을 명령하여 적을 끌어들입니다! +Choose area containing slime +슬라임이 있는 지역 선택 + + +Animate Slime +슬라임 움직이기 +Summons up to 3 slimes on slime tiles in an AoE. The slimes are friendly to you. +AoE의 슬라임 타일에서 최대 3개의 슬라임을 소환합니다. 슬라임은 당신에게 우호적입니다. +You concentrate magical energy into the slime, giving it a will of it's own... +당신은 슬라임에 마법의 에너지를 집중시켜 스스로의 의지를 부여합니다... + + +Animate Large Slime +큰 슬라임 움직이기 +Target an area with at least 3 slime tiles. Summons a large slime that is friendly to you. +슬라임 타일이 3개 이상 있는 지역을 목표로 삼으세요. 당신에게 친숙한 대형 슬라임을 소환합니다. + + +Latex Puppet +라텍스 인형 +Target an area containing helpless encased enemies. Transforms up to 3 of them into latex dolls that serve you for a while. +밀폐된 무기력한 적들이 있는 지역을 목표로 삼으세요. 최대 3마리를 한동안 당신을 섬기는 라텍스 인형으로 변신시킵니다. +You concentrate magical energy into your victim's bindings, forcing them to move... +피해자의 속박에 마법 에너지를 집중시켜 강제로 움직이게 합니다... +Choose area containing encased helpless enemies. +갇힌 무기력한 적이 있는 지역을 선택합니다. + + +Solidify +굳히다 +Solidifies slime in the area into Latex. Latex adheres to enemies and slowly binds them, escasing them when they are fully bound. +지역의 점액을 라텍스로 굳힙니다. 라텍스는 적에게 달라붙어 천천히 묶고, 완전히 묶였을 때 탈출합니다. +You inscribe a transmutation circle on the floor. +바닥에 변환 원을 새겼습니다. +### LiquidMetal + +### Solidifies Latex in the area into Liquid Metal. Liquid Metal is slippery, but also adheres to enemies and slowly binds them in metallic bonds. Enemies encased in liquid metal are more susceptible to knockback due to the slippery nature. + +### Choose area containing Latex + +Slime Repulsion +슬라임 반발 +### Gain +50 glue resist. (Having 45 or more Glue Resist negates many negative effects from slime) + +Spread +확산 +Slime in the target area expands by 1 unit in the four cardinal directions. Refreshes duration to 12-20 turns. +대상 지역의 슬라임은 사방으로 1단위 확장됩니다. 지속 시간이 12~20턴으로 갱신됩니다. +The slime spreads! +슬라임이 퍼진다! + + +Wall of Slime +슬라임의 벽 +Unlocks horizontal and vertical slime walls that traps enemies who try to pass through. +통과하려는 적을 가두는 수평 및 수직 슬라임 벽을 잠금 해제합니다. + + +Wall of Slime (Vert) +슬라임 벽(수직) +Creates a vertical wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. +20턴 동안 슬라임의 수직 벽을 생성합니다. 통과하는 적들은 벽에 갇히고 슬라임이 됩니다. +You tap your foot and a wall of slime slowly raises out of the ground. +발을 두드리면 슬라임 벽이 천천히 땅에서 올라옵니다. +Choose vertical wall origin (5 tiles high) +수직 벽 원점 선택(5타일 높이) + + +Wall of Slime (Horiz) +슬라임의 벽(Horiz) +Creates a horizontal wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. +20턴 동안 수평으로 슬라임 벽을 생성합니다. 통과하는 적들은 벽에 갇히고 슬라임이 됩니다. +Choose horizontal wall origin (5 tiles wide) +수평 벽 원점 선택(폭 5타일) + + +Wall of Latex +라텍스 벽 +Unlocks horizontal and vertical latex walls that encase enemies that walk through. +걸어가는 적을 둘러싸는 수평 및 수직 라텍스 벽을 잠금 해제합니다. + + +Wall of Latex (Vert) +라텍스 벽(Vert) +### Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. + +You tap your foot and a wall of latex stretches out across the corridor. +발을 두드리면 라텍스 벽이 복도를 가로질러 뻗어 있습니다. + + +Wall of Latex (Horiz) +라텍스 벽(Horiz) +### Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. + +Earthshape +지구 모양 +Unlocks 3 spells that allow creating mounds, rings, or lines of 50hp, 25 armor rocks. +50hp의 마운드, 고리 또는 선, 25개의 갑옷 바위를 생성할 수 있는 3가지 주문을 잠금 해제합니다. +Earthen monoliths rise from the ground! +흙 기둥이 땅에서 솟아오른다! +An earthen monolith rises from the ground! +흙 기둥이 땅에서 솟아오른다! + + +Earthshape (Ring) +어스셰이프(반지) +Create a large ring of Earthen Monoliths. They have 50 hitpoints and 25 armor. +거대한 대지 기둥 고리를 만듭니다. 그들은 50의 체력과 25의 방어력을 가지고 있습니다. +You stomp your foot and monoliths emerge in a ring around you! +발을 구르면 돌기둥이 주변에 고리 모양으로 나타납니다! +Choose ring origin +벨소리 출처 선택 + + +Earthshape (Mound) +Earthshape (마운드) +Create a 3x3 field of Earthen Monoliths. They have 50 hitpoints and 25 armor. +Earthen Monoliths의 3x3 필드를 만듭니다. 그들은 50의 체력과 25의 방어력을 가지고 있습니다. +You stomp your foot and monoliths emerge from the ground! +발을 구르면 땅에서 모놀리스가 나타납니다! +Choose mound origin +마운드 원점 선택 + + +Earthshape (Line) +지구 모양(선) +Create a 4-tile line of Earthen Monoliths. They have 50 hitpoints and 25 armor. +4타일 라인의 대지 기둥을 만듭니다. 그들은 50의 체력과 25의 방어력을 가지고 있습니다. + + +### Earthshape (Arc) + +### Create a 5-wide arc of Earthen Monoliths. They have 50 hitpoints and 25 armor. + +Rock +바위 +Channel 1 turn to launch a rock that deals DamageDealt crush damage and slows for 4 turns. Blocks up to 80 damage. +채널 1턴은 DamageDealt 크러쉬 데미지를 입히고 4턴 동안 둔화시키는 바위를 발사합니다. 최대 80의 피해를 차단합니다. +You raise a stone from the ground and kick it forward! +당신은 땅에서 돌을 들어 앞으로 차! + + +Earth Kick +어스 킥 +Stone Projectile +돌 발사체 +Kick a summoned rock to turn it into a projectile. Deals DamageDealt crush damage in a 3x3 area and slows for 4 turns. +소환된 돌을 발로 차면 발사체로 변합니다. 3x3 지역에 피해를 입히고 4턴 동안 둔화시킵니다. +With a solid kick, you launch one of your monoliths forward! +단단한 킥으로 모놀리스 중 하나를 앞으로 발사합니다! +Choose a monolith to kick +킥할 모노리스를 선택하십시오 + + +Boulder +둥근 돌 +Channel 1 turn to launch a huge slow rock that deals DamageDealt crush damage and slows for 8 turns. AoE, collides with summoned rocks. Blocks up to 200 damage. +DamageDealt 크러쉬 데미지를 입히고 8턴 동안 둔화시키는 거대한 슬로우 록을 발사하는 채널 1턴. AoE, 소환된 록과 충돌합니다. 최대 200 데미지를 차단합니다. +You raise a massive boulder from the ground and kick it forward! +당신은 땅에서 거대한 바위를 들어올려 앞으로 차버립니다! + + +Stamina Up I +스태미나 업 I +Increases maximum SP by 12 +최대 SP 12 증가 + + +Iron Will +불굴의 의지 +### While you have 100 current willpower or more, regain an additional 4 stamina per turn. + +### Defiance + +### For each 10 current willpower you have over 50, gain +5 Bondage Resist. + +### Willful Struggle + +### For each 10 current willpower you have over 50, gain +1% struggle power. + +### Your willpower provides you with additional strength! (+AMOUNT%) + +Athlete +운동 선수 +Sprinting costs 40% less stamina. +전력질주 시 스태미나 소모가 40% 감소합니다. +Sneaky +운동화 +You are harder to see when waiting. +기다릴 때 더 보기 힘들어. +### Vault + +### You can sprint under flying enemies and through vulnerable, slowed, or disabled enemies. Does not work on immobile enemies such as doors and turrets. + +### Improved Vault + +### You can dash through enemies that aren't immobile. + +Dodge I +닷지 I +### +10 Evasion + +Dodge II +닷지 II +### +15 Evasion (25 total) + +Dodge III +닷지 III +### +25 Evasion (50 total) + +### Strength Up + +### +20% Physical Damage + +### Deadly Aim + +### Increases crit multiplier by a % equal to your Battle Rhythm. + +### Accuracy I + +### +10 Accuracy + +### Accuracy II + +### +15 Accuracy (25 total) + +### Accuracy III + +### +25 Accuracy (50 total) + +### Martial Arts I + +### Unarmed strikes gain 15% accuracy and -10% stamina cost. + +### Martial Arts II + +### Unarmed strikes gain 20% accuracy (35% total) and -15% stamina cost (25% total). + +### Martial Arts III + +### Unarmed strikes gain 25% accuracy (60% total) and -25% stamina cost (50% total). + +### Precise Critical + +### When landing a critical strike with physical damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. + +### Precise Magic + +### When landing a critical strike with magic damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. + +### Magical Overload + +### When landing a critical strike with magic damage, crit multiplier is increased by 25% of your current DP. + + + +Brute Force +브루트 포스 +When enabled, your attacks deal 10% of your willpower as additional crush damage but cost 10 more stamina. +활성화되면 공격이 의지력의 10%를 추가 크러쉬 데미지로 처리하지만 스태미나가 10 더 소모됩니다. + + +One With Slime +점액과 하나 +While standing on slime/latex, you can cast rubber spells without components. +슬라임/라텍스 위에 서 있는 동안 구성 요소 없이 고무 주문을 시전할 수 있습니다. + + +Convincing Disguise +설득력있는 변장 +### While standing still on slime, or fully bound with at least one latex item, you are harder to notice. Each latex restraint you are wearing increases this amount. Can be toggled off by clicking the buff icon. + +Magical Implements +마법 도구 +### While holding a magical weapon like a staff or magic knife, your mana costs are reduced by 20%. + +Mage Circuits +마법사 회로 +### Increases the size of the passive mana pool by +400. + +Archmage +대마법사 +Upcasted spells cost 25% less mana. +업캐스팅된 주문의 마나 비용이 25% 감소합니다. + + +Temperature Play +온도 놀이 +Fire and Ice damage do 30% more damage to fully bound enemies. +화염과 얼음 피해는 완전히 속박된 적에게 30% 더 많은 피해를 입힙니다. +Fire Hazard +화재 위험 +Fire damage ignites enemies for 5 damage per turn for 6 turns. +화염 피해가 적을 불태워 6턴 동안 매 턴마다 5의 피해를 줍니다. +Frozen Prison +얼어붙은 감옥 +### Freezing an enemy applies 10 binding per turn of freeze added, plus brings the enemy to a minimum of 20% binding. + +Lightning Rod +피뢰침 +After casting an Air or Storm spell that costs mana, become Conductive and gain 300% electric resist for 3 turns. +마나를 소모하는 바람 또는 폭풍 주문 시전 후 전도성 상태가 되고 3턴 동안 전기 저항이 300% 증가합니다. +When enabled, enemies in chastity become angry Frustrated Pets when becoming helpless. +활성화하면 순결한 적이 무기력해질 때 분노한 좌절된 애완 동물이 됩니다. + + +Mana Up I +마나업 I +Increases maximum MP by 12 +최대 MP 12 증가 +Mana Up II +파워 업 II +Mana Up III +파워 업 III + + +Strong Mind I +강한 마음 I +Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn +최대 혼란이 기본의 33%만큼 증가하고 혼란 재생이 턴당 -0.1씩 증가합니다. +Strong Mind II +강한 마음 II +Strong Mind III +강한 마음 III + + +Expert Wizard +전문가 마법사 +Gives you an additional spell choice slot +추가 주문 선택 슬롯을 제공합니다. +Master Wizard +마스터 마법사 +Legendary Wizard +전설적인 마법사 + + +More Summons +더 많은 소환 +### Increases the permanent summon cap by +2 (from 2 to 4) + +Many Summons +많은 소환 +### Increases the permanent summon cap by +2 (from 4 to 6) + +### Summon Bomb + +### Channel for 1 turn for a bomb that does DamageDealt blast damage in an area after DelayTime turns. + +Fire in the hole! +구멍에 발사! + + +### An AoE trap on the ground that deals 25 chain damage, roots for 8 turns, and applies 80 points of binding. Takes 3 turns to setup. 200% crit multiplier. + +### You conjure a rope trap! + +Rope Burst +로프 버스트 +### An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 50 points of rope binding. Snares for Duration turns. + +You call forth ropes from the abyss! +당신은 심연에서 밧줄을 불러냅니다! +Select center of a a 3x3 AoE +3x3 AoE의 중심 선택 + + +Leather Package +가죽 패키지 +After conjuring a leather restraint, you can conjure up to three more without advancing time. +가죽 구속을 창조한 후, 시간을 앞당기지 않고 최대 3개까지 더 창조할 수 있습니다. + + +Conjure Leather Cuffs +Conjure 가죽 커프스 +Conjured Leather Cuffs +창조된 가죽 수갑 +The leather cuffs clasp your wrists and pull them tightly! +가죽 수갑이 손목을 꽉 잡아당깁니다! +The leather cuffs hit you! (DamageDealt) +가죽 수갑이 당신을 때렸습니다! (DamageDealt) +Summons a pair of cuffs which deals DamageDealt chain damage and adds 40 binding. Until the target struggles free, attacking the target disarms them for 3 turns. +DamageDealt 연쇄 피해를 입히고 40 바인딩을 추가하는 한 쌍의 수갑을 소환합니다. 대상이 자유롭게 투쟁할 때까지 대상을 공격하면 대상을 3턴 동안 무장 해제합니다. +You conjure leather cuffs! +당신은 가죽 수갑을 불러냅니다! +The cuffs will appear next to you and fly toward the target point. +커프스가 옆에 나타나 목표 지점을 향해 날아갑니다. + + +Conjure Blindfold +눈가리개 만들기 +Conjured Blindfold +창조된 눈가리개 +The blindfold wraps around your head and buckles tightly! +눈가리개가 머리를 감싸고 버클이 단단히 고정됩니다! +The blindfold hits you! (DamageDealt) +눈가리개가 당신을 때립니다! (DamageDealt) +### Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not blinded. + +You conjure a blindfold! +당신은 눈가리개를 요술! +The blindfold will appear next to you and fly toward the target point. +눈가리개가 옆에 나타나 목표 지점을 향해 날아갑니다. + + +Conjure Cuffs +소맷부리 +Conjured Cuffs +컨저드 커프스 +The cuffs pull your wrists together and click tightly! +커프스는 손목을 함께 당기고 단단히 클릭하십시오! +The cuffs hit you! (DamageDealt) +수갑이 당신을 때렸습니다! (DamageDealt) +Summons a pair of cuffs which deals DamageDealt chain damage and disarms for 5 turns. +40 binding if target is not disarmed. +DamageDealt 연쇄 피해를 입히고 5턴 동안 무장 해제시키는 한 쌍의 수갑을 소환합니다. 대상이 무장 해제되지 않은 경우 바인딩 +40. +You conjure a pair of cuffs! +당신은 한 쌍의 수갑을 불러냅니다! + + +Conjure Gag +개그를 불러내다 +The gag forces itself into your mouth and buckles tightly! +개그가 입으로 들어가 단단히 고정됩니다! +The gag hits you! (DamageDealt) +개그가 당신을 때립니다! (DamageDealt) +### Summons a gag which deals DamageDealt chain damage and silences for 8 turns. +40 binding if target is not silenced. + +You conjure a gag! +당신은 개그를 요술! +The gag will appear next to you and fly toward the target point. +개그가 옆에 나타나 목표 지점을 향해 날아갑니다. + + +### Conjure Anti-Magic Gag + +### Conjured Anti-Magic Gag + +### The anti-magic gag forces itself into your mouth and buckles tightly! + +### The anti-magic gag hits you! (DamageDealt) + +### Summons a magic-absorbing gag which deals DamageDealt teasing arcane damage and silences for 15 turns. Applies a debuff that increases miscast chance by 50%. + +### You conjure an anti-magic gag! + + + +Conjure Armbinder +암바인더를 창조하다 +Conjured Armbinder +창조된 팔바인더 +The armbinder slips itself around your arms and buckles itself tightly! +암바인더가 팔 주위로 미끄러지며 단단히 고정됩니다! +The armbinder hits you! (DamageDealt) +암 바인더가 당신을 때립니다! (DamageDealt) +### Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Cannot be blocked. + +You conjure a armbinder! +당신은 armbinder를 요술! +The armbinder will appear next to you and fly toward the target point. +암바인더가 옆에 나타나 목표 지점을 향해 날아갑니다. + + +Conjure Legbinder +레그바인더를 창조하다 +Conjured Legbinder +창조된 다리결속사 +The legbinder slips itself around your legs and buckles itself tightly! +레그바인더가 다리 주위로 미끄러져 들어가 단단히 고정됩니다! +The legbinder hits you! (DamageDealt) +레그바인더가 당신을 공격합니다! (DamageDealt) +### Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. + +You conjure a legbinder! +레그바인더를 불러내다니! +The legbinder will appear next to you and fly toward the target point. +레그바인더가 옆에 나타나 목표 지점을 향해 날아갑니다. + + +### Conjure Latex Gag + +### Conjured Latex Gag + +### Latex Gag + +### Latex Glob + +### The gag forces itself into your mouth and snaps on tightly! + +### The amorphous rubber stretches out into a restraint on your body! + +### The amorphous rubber sticks to you! (DamageDealt) + +### Summons a gag which deals DamageDealt glue damage and silences for 15 turns. +40 binding if target is not silenced. + +### Conjure Latex Armbinder + +### Conjured Latex Armbinder + +### The armbinder slips itself around your arms and snaps on tightly! + +### Summons an armbinder which deals DamageDealt glue damage and disarms for 13 turns. Cannot be blocked. + +### Conjure Latex Legbinder + +### Conjured Latex Legbinder + +### The legbinder slips itself around your legs and snaps on tightly! + +### Summons a legbinder which deals DamageDealt glue damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. + + + +Conjure Straitjacket +구속복을 창조하다 +Conjured Straitjacket +창조된 구속복 +The straitjacket slips itself around your body and pulls your arms into its sleeves! +구속복은 당신의 몸을 감싸고 당신의 팔을 소매 속으로 끌어당깁니다! +The straitjacket hits you! (DamageDealt) +구속복이 당신을 공격합니다! (DamageDealt) +### Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. Cannot be blocked. + +You conjure a straitjacket! +당신은 구속복을 요술! +The straitjacket will appear next to you and fly toward the target point. +구속복이 옆에 나타나 목표 지점을 향해 날아갑니다. + + +Conjure Harness +하니스를 창조하다 +Conjured Harness +창조된 하네스 +The harness slips itself around your torso and squeezes tightly as each buckle secures itself one by one! +하네스가 몸통 주위로 미끄러지며 각 버클이 하나씩 고정될 때 단단히 조입니다! +The harness hits you! (DamageDealt) +하네스가 당신을 때립니다! (DamageDealt) +### Summons a harness which deals DamageDealt chain damage. Adds +50 binding per 25% binding level on target, up to +200. + +You conjure a harness! +당신은 하네스를 요술! +The harness will appear next to you and fly toward the target point. +하네스가 옆에 나타나 목표 지점을 향해 날아갑니다. + + +Firecracker +폭죽 +A small delayed explosion that deals DamageDealt fire damage. +DamageDealt 화염 피해를 주는 작은 지연 폭발입니다. +You shout an incendiary retort! +당신은 선동적인 레토르트를 외칩니다! +Choose AoE location +AoE 위치 선택 + + +Feather Burst +페더 버스트 +After a brief delay, a small cloud of feathers tickles enemies for DamageDealt damage and +60 distraction for 3 turns. +잠시 후 작은 깃털 구름이 적을 간지럽혀 DamageDealt 피해를 입히고 3턴 동안 주의를 분산시킵니다. +You conjure a burst of frenetic feathers! +당신은 광란의 깃털 폭발을 불러일으킵니다! + + +Tickle Cloud +간지럼구름 +For 10 turns, disembodied hands tickle a target location for DamageDealt tickle damage. +10턴 동안 실체가 없는 손이 대상 위치를 간지럽혀 DamageDealt 간지럼 피해를 입힙니다. +A swarm of hands holding feathers appears! +깃털을 쥔 손 떼가 나타난다! +Choose location +위치 선택 + + +Frustrated Pet +좌절한 애완동물 +The pet collapses in frustration. +애완 동물은 좌절감에 쓰러집니다. + + +Mana Pet +애완 동물은 어디에 있습니까? +The enemy steals your pet from you! +적이 당신에게서 애완 동물을 훔칩니다! + + +Display Doll +디스플레이 인형 +The enemy steals your doll from you! +적이 당신에게서 인형을 훔쳐갑니다! + + +Conjure Petsuit +펫슈트를 창조하다 +### Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery from mana pool. + +You conjure an enchanted petsuit which wraps around your target, forcing her to follow you! +당신은 당신의 목표를 감싸고 그녀가 당신을 따르도록 강요하는 마법에 걸린 펫슈트를 불러냅니다! +You watch in horror as your own creation lunges toward you, binding your hands and feet! +당신의 창조물이 당신의 손과 발을 묶고 당신을 향해 돌진하는 것을 당신은 공포에 질려 지켜보고 있습니다! +Choose a helpless target +무력한 대상을 선택하십시오 + + +Conjure Display Stand +진열대를 창조하다 +### Target only Helpless enemies. Creates a fixture that increases passive mana recovery from mana pool, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. + +You conjure a fixture to hold your helpless target in place! +당신은 무기력한 대상을 제자리에 고정시키기 위해 고정물을 불러냅니다! +You watch in horror as your own creation encircles you, locking you in place with a hefty click! +당신은 당신 자신의 창조물이 당신을 둘러싸고, 큰 딸깍 소리와 함께 당신을 제자리에 고정시키는 것을 공포에 질려 지켜보고 있습니다! + + +Lesser Flash +하급 섬광 +Sparkles! +반짝! +Mirror Image +미러 이미지 + + +### A flash of light which renders anyone caught within blind for 7 turns + +You charge up a bright flash! +당신은 밝은 플래시를 충전! +Select where to center the flash (SpellArea radius) +플래시를 중앙에 둘 위치 선택(SpellArea 반경) + + +Ring +반지 +### A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged with a 3 turn delay. + +You point and a noise emanates from the location! +가리키면 위치에서 소리가 납니다! +Select where to center the noise (SpellArea radius) +노이즈를 중앙에 둘 위치 선택(SpellArea 반경) + + +### Holy Blaze + +### Call down a 3x3 area of DamageDealt holy damage. Blinds enemies for 3 turns (and also yourself). + +### You summon a divine aura! + +### Select where to center the blast (SpellArea radius) + +Greater Flash +그레이터 플래시 +### A massive flash of light which renders anyone caught within blind for 16 turns and stuns briefly. + +Focused Flash +집중 플래시 +### A focused flash of light which renders anyone caught within blind for 30 turns and stuns for Duration turns. + +You slowly charge up a powerful flash! +당신은 천천히 강력한 플래시를 충전합니다! + + +Shroud +측판 +Sleep Gas +수면 가스 +Select where to center the shroud (SpellArea radius) +슈라우드를 중앙에 배치할 위치 선택(SpellArea 반경) +Creates a cloud for Duration turns that buffs evasion for all creatures. You are temporarily invisible for 8 turns after leaving. +지속 시간 동안 모든 생물의 회피를 강화하는 구름을 생성합니다. 퇴장 후 8턴 동안 일시적으로 투명 상태가 됩니다. +You exhale a misty shroud +당신은 안개 낀 수의를 내뿜습니다. + + +Invisibility +보이지 않는 +Select which creature to buff +강화할 생물 선택 +Make the targeted creature invisible, increasing stealth for Duration turns +대상 생물을 보이지 않게 만들어 지속 시간 동안 스텔스를 높입니다. +You snap your fingers! +당신은 손가락을 스냅! + + +CMD: Lock +명령: 잠금 +Select which creature to lock +잠글 생물 선택 +Magically locks down a target, preventing them from struggling below the current level of binding until freed by an enemy spellcaster (max 100% binding). +마법으로 대상을 잠그고 적 주문 시전자가 풀어줄 때까지 현재 속박 수준 이하로 고군분투하는 것을 방지합니다(최대 100% 속박). +You say a command word, and magical locks bind your target! +명령어를 말하면 마법의 자물쇠가 목표물을 묶습니다! + + +Chastity +순결 +Select which creature to lock in a belt +벨트에 잠글 생물을 선택하십시오 +### Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs/toys, and distracts constantly. + +You conjure a chastity belt, which latches onto your target! +당신은 당신의 목표물에 고정되는 정조대를 창조합니다! +Your own spell locks you in chastity! +자신의 주문이 당신을 순결에 가두어! +Something fun enters your body... +재미있는 것이 몸에 들어온다... + + +Zone of Purity +순결의 지대 +Select an area +지역 선택 +### Creates an area which applies Chastity constantly to any enemy over with any amount of binding that steps inside. + +You conjure a realm of absolute purity. +당신은 절대적인 순수함의 영역을 불러일으킵니다. + + +Zone of Excitement +흥분의 영역 +Creates an area which adds a conjured vibrating toy to enemies that step inside. Toy lasts 30 turns. +내부로 들어오는 적에게 진동하는 진동 장난감을 추가하는 영역을 생성합니다. 장난감은 30턴 동안 지속됩니다. +You conjure a realm of absolute fun! +당신은 절대적인 재미의 영역을 불러일으킵니다! + + +CMD: Capture +명령: 캡처 +Select which creature to bind +묶을 생물 선택 +Commands nearby restraints to bind a target, dealing DamageDealt chain damage, +50 binding. Ropes snare 3 turns/rope, belts +20 binding/belt, chains deal +15 crush dmg/chain. +근처의 구속 장치에 대상을 묶도록 명령하여 DamageDealt 체인 피해, +50 바인딩을 입힙니다. 로프는 3턴/로프, 벨트는 +20 바인딩/벨트, 체인은 +15 크러시 데미지/체인을 처리합니다. +You say a command word, and the bindings on the ground do your bidding! +당신이 명령을 내리면, 땅에 있는 묶음이 당신의 명령을 따릅니다! + + +CMD: Disenchant +CMD: 디스인챈트 +### Target a large area. Permanently slows constructs, reduces attack speed by 50%, and deals 30 shadow damage. Refunds 50% mana at 3 or more targets. Cast on self to disenchant bindings. + +You say a command word, siphoning the magic from nearby constructs! +명령어를 말하면 근처에 있는 구조물에서 마법을 빨아들입니다! + + +CMD: Vibrate +명령: 진동 +Target a large area. Enemies with plugs or toys are teased for Duration turns, taking charm damage each turn. +넓은 지역을 목표로 삼으십시오. 플러그나 장난감을 가진 적들은 지속 시간 동안 놀림을 받으며, 매 턴 매력 피해를 입습니다. +You say a command word, causing all toys in the area to vibrate! +명령어를 말하면 해당 지역의 모든 장난감이 진동합니다! + + +CMD: Explosive Finish +CMD: 폭발성 마무리 +Explosive Finish +폭발적인 마무리 +Target a large area. Consumes enemy distraction to deal up to DamageDealt charm damage, twice if at 90% distraction or more. +넓은 지역을 목표로 삼으십시오. 적의 주의를 분산시켜 최대 DamageDealt 매력 피해를 입히며, 주의가 90% 이상일 경우 두 번 가합니다. +You say a command word, resulting in a surge of energy entering your targets! +명령어를 말하면 대상에 에너지가 급증합니다! + + +CMD: Release +명령: 릴리스 +Target bound (but unlocked) targets in a 3x3 area, reducing binding by 100. Removes unlocked restraints on player that are removable. +3x3 영역에서 바인딩된(그러나 잠금 해제된) 타겟을 대상으로 바인딩을 100만큼 줄입니다. 제거 가능한 플레이어의 잠금 해제된 구속을 제거합니다. +You say a command word, causing restraints to loosen! +명령어를 말하면 속박이 풀린다! +You say a command word, but your restraints remain tight! +당신은 명령어를 말하지만 당신의 구속은 여전히 ​​단단합니다! + + +Remove Slime +점액 제거 +Select a creature or yourself +생물 또는 자신을 선택하십시오 +Remove Slime and Encasement from target creatures in an area. Also removes slime from self. +지역에 있는 대상 생물의 슬라임과 인케이스먼트를 제거합니다. 또한 자신에게서 슬라임을 제거합니다. +You issue a command to the slime! +당신은 슬라임에게 명령을 내립니다! +You whisper a command word, but the slime is already hardened and won't budge... +명령어를 속삭여도 슬라임은 이미 굳어 꼼짝도 하지 않고... + + +Binding Vines +속박의 덩굴 +Binding Ropes +바인딩 로프 +Binding Chains +바인딩 체인 +Binding Belts +바인딩 벨트 +Vines rise from the ground and squeeze you! +덩굴이 땅에서 솟아 오르고 당신을 짜냅니다! +Ropes encircle your body and tighten! +밧줄이 몸을 감싸고 조입니다! +Chains wrap around you! +사슬이 당신을 감쌉니다! +A web of belts buckles in place around your body! +벨트 버클이 몸 주위에 제자리에 있습니다! +Vines rise from the ground and squeeze you! (DamageDealt) +덩굴이 땅에서 솟아 오르고 당신을 짜냅니다! (DamageDealt) +Ropes encircle your body and tighten! (DamageDealt) +밧줄이 몸을 감싸고 조입니다! (DamageDealt) +Chains wrap around you! (DamageDealt) +사슬이 당신을 감쌉니다! (DamageDealt) +A web of belts buckles in place around your body! (DamageDealt) +벨트 버클이 몸 주위에 제자리에 있습니다! (DamageDealt) + + +Awaken +깨우다 +The slime awakens and turns on you!!! +슬라임이 깨어나 당신을 켭니다!!! +Select area to awaken +각성할 지역 선택 +### Activates the slime in an area, causing it to deal 25 glue damage. Encases fully bound targets. + +You command the slime to draw in targets! +당신은 슬라임에게 목표물을 끌어들이도록 명령합니다! + + +CMD: Bind +CMD: 바인드 +Select area to bind +바인딩할 영역 선택 +Commands nearby restraints to bind targets standing on them. Rope: 30 chain dmg/5 turn snare. Chain: 30 crush dmg/8 turn disarm. Belts: 50 binding/3 turns vulnerability. +근처의 구속을 명령하여 그 위에 서 있는 대상을 묶습니다. 로프: 30 체인 데미지/5턴 스네어. 체인: 30 크러쉬 데미지/8턴 해제. 벨트: 50 바인딩/3턴 취약. + + +CMD: Unlock +명령: 잠금 해제 +Select which creature to unlock +잠금 해제할 생물 선택 +### On yourself: Removes one purple (magical) lock. On a creature: Reduces the target's binding by 20 points. + +You speak a command word! +당신은 명령 단어를 말한다! +None of the locks you are wearing respond to your magic. +당신이 착용하고 있는 자물쇠는 당신의 마법에 반응하지 않습니다. +You can't help her with this. +당신은 그녀를 도울 수 없습니다. +You must target yourself, an enemy, or a locked object. +자신, 적 또는 잠긴 물체를 목표로 삼아야 합니다. +### The command is intricate and you are unable to enunciate it properly! + +### CMD: Greater Unlock + +### On yourself: Removes all purple (magical) locks. On a creature: Reduces the target's binding by 100 points. + +### You speak a powerful command word! + +Lesser Invisibility +하급 투명화 +You become semitransparent! +반투명해진다! + + +Camouflage +위장 +Select yourself +자신을 선택 +### Enemies have a harder time noticing you for Duration turns. Cancels if you move (unless you are near a wall), cast, or sleep. + +You pose in a clandestine manner. +당신은 은밀하게 포즈를 취합니다. + + +Darkblade +다크블레이드 +### Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks, whichever is lower. + +You call forth dark runes on your weapon and arms! +당신은 당신의 무기와 팔에 암흑의 룬을 불러냅니다! + + +Heal +치유하다 +Select which creature to heal +치료할 생물 선택 +Restore 45 hitpoints to an allied creature. +아군 크리쳐의 체력을 45 회복시킵니다. +You utter a word of healing. +치유의 말씀을 하십니다. + + +Flame Blade +플레임 블레이드 +### When enabled: Melee weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. + +### Tentacle Slap + +### You have the power to make tentacles out of slime when you attack. When enabled: Your attacks deal +10 glue damage and create slime. 150% bind efficiency. + +### Chain Strike + +### You have the power to summon chains when you attack. When enabled: Your attacks deal +10 chain damage and create chains. 125% bind efficiency. + +### Ropework + +### You have the power to weave ropes between your attacks. When enabled: Your attacks deal +10 chain damage and create ropes. 400% bind efficiency. + +### Leather Whip + +### You have the power to strike with conjured belts when you attack. When enabled: Your attacks deal +10 pain damage and create belts. 250% bind efficiency. + +### Super Strength + +### When enabled: Struggling is more powerful, and your melee attack damage is increased by +20 if your weapon deals physical damage. + +Your body glows with magical energy! +당신의 몸은 마법의 에너지로 빛납니다! + + +Enhance Will +의지 강화 +When enabled: Miscast chance is halved +활성화 시: 미스캐스팅 확률이 절반으로 감소 +You focus intently! +당신은 열심히 집중! + + +Truesight +트루사이트 +When enabled: Drain mana every turn to see through walls and increase accuracy by 40%. +활성화 시: 매 턴마다 마나를 소모하여 벽을 뚫고 정확도를 40% 높입니다. + + +### Echolocation + +### Close your eyes to dramatically improve your hearing and locate enemies through walls. + +Produce a bright light for Duration turns. Has no effect in dark rooms. +지속 시간 동안 밝은 빛을 냅니다. 어두운 방에서는 효과가 없습니다. + + +Levitate +공중에 뜨다 +When enabled and above 0 stamina: Drain 5 mana per step to reduce slow level by 1 (if above 1), or 20 mana to ignore a temporary slow effect. +활성화되고 스태미나가 0 이상인 경우: 단계당 5마나를 소모하여 둔화 수준을 1(1 이상인 경우) 줄이거나 일시적인 둔화 효과를 무시하려면 20마나를 소모합니다. +You levitate over the trap! +당신은 함정 위로 부상! +You snag a tripwire while floating! +떠다니다가 인계철선이 걸렸다! +You levitate forward despite being slowed! +느려도 앞으로 공중부양! +You hover with reduced effect from bindings. +귀속으로 인해 감소된 효과로 호버링합니다. + + +Iron Blood +철혈 +Channel 4 turns: Halves SP cost of melee attacks by 50%, but increases MP cost of spells by 25%. Ends on sleep or recast. +채널 4턴 : 근접 공격의 SP 소모량을 50%로 반감하지만 주문의 MP 소모량을 25% 증가시킨다. 수면 또는 재시전 시 종료된다. +Your skin glows a pale red! +피부가 옅은 붉은색으로 빛납니다! + + +Stone Skin +스톤 스킨 +Make the targeted creature (or yourself) gain +20 armor for Duration turns +대상 생물(또는 자신)이 지속 시간 동안 +20 갑옷을 얻도록 합니다. +Your skin takes on the appearance of cracked earth! +당신의 피부는 금이 간 땅처럼 보입니다! + + +The EnemyName gains increased physical armor! +EnemyName의 물리적 방어력이 증가합니다! +The EnemyName buffs the physical armor of her allies! +EnemyName은 아군의 물리 방어력을 강화합니다! +The EnemyName deploys an energy shield to allies! +EnemyName이 아군에게 에너지 보호막을 배치합니다! +The EnemyName activates the vibrators of nearby wolfgirls, greatly motivating them! +EnemyName은 근처 울프걸의 바이브레이터를 작동시켜 큰 동기를 부여합니다! +### The EnemyName activates the vibrators of nearby dolls, greatly motivating them! + +The EnemyName creates a zone of increased defense! +EnemyName은 강화된 방어 구역을 생성합니다! +EnemyName uses a charm to buff an enemy's Magic Armor and Evasion! +EnemyName은(는) 매력을 사용하여 적의 마법 갑옷과 회피를 버프합니다! +### EnemyName supports a witch with a magical shield! + +### Shield the Witch! + +EnemyName uses a glowing talisman to buff an undead's physical armor and speed! +EnemyName은(는) 빛나는 부적을 사용하여 언데드의 물리적 갑옷과 속도를 강화합니다! +You create a zone of increased defense! +강화된 방어 구역을 생성합니다! +You create a protective zone! +보호 구역을 만듭니다! +You create a fan of icicles! +당신은 고드름의 팬을 만듭니다! + + +Select where to put the wall (cannot place on occupied squares) +벽을 놓을 위치를 선택합니다(점유 중인 사각형에는 놓을 수 없음). +### Create a stationary wall for Duration turns. It takes 20% damage from spells. Cast on an open door to close it and give it additional armor. + +A wall starts to form! +벽이 형성되기 시작합니다! +You create a line on the ground. +지면에 선을 만듭니다. + + +True Steel +트루 스틸 +Choose a target. +대상을 선택합니다. +A melee strike that deals DamageDealt slash damage, x2.5 against unaware humanoid enemies. +알지 못하는 인간형 적에게 2.5배의 DamageDealt 베기 피해를 입히는 근접 공격입니다. +You slash with an ethereal blade! +당신은 천상의 칼날로 베어버립니다! + + +Summon Familiar +서먼 패밀리어 +Select where to put the familiar (cannot place on occupied squares) +패밀리어를 놓을 위치 선택(점유 중인 사각형에는 놓을 수 없음) +Create a familiar that fights by your side for the rest of the level +남은 레벨 동안 옆에서 싸우는 사역마를 만드세요. +A familiar appears! +친숙한 등장! +You create a circle on the ground with your foot! +당신은 발로 땅에 원을 만듭니다! + + +Summon Storm Crystal +폭풍 수정 소환 +Select where to put the storm crystal (cannot place on occupied squares) +폭풍 수정을 놓을 위치 선택(점유 중인 사각형에는 놓을 수 없음) +Create a stationary crystal that casts Crackle on nearby targets for Duration turns. Can be healed to extend duration. +지속 시간 동안 근처의 대상에게 Crackle을 시전하는 고정 수정을 생성합니다. 지속 시간을 연장하기 위해 치료할 수 있습니다. +A crackling crystal emerges from the ground! +딱딱거리는 수정이 땅에서 솟아오른다! +You stomp and the ground shakes! +발을 구르면 땅이 흔들린다! + + +Summon Fire Mote +불의 티끌 소환 +Select where to put the fire mote (cannot place on occupied squares) +불 티끌을 놓을 위치를 선택합니다(점유 중인 사각형에는 놓을 수 없음). +Create an orb of fire that follows you and attacks using firebolt. +당신을 따라다니는 불의 구체를 만들고 불화살을 사용하여 공격합니다. +A flaming spirit answers your call! +불타는 정령이 당신의 부름에 응답합니다! +You call upon the plane of Fire! +당신은 불의 차원을 부릅니다! + + +Summon Earth Mote +서먼 어스 티끌 +Select where to put the earth mote (cannot place on occupied squares) +흙먼지를 놓을 위치 선택(점유 중인 사각형에는 놓을 수 없음) +Create an animated stone that attacks using a strong but slow crush attack. +강력하지만 느린 크러시 공격을 사용하여 공격하는 움직이는 돌을 만듭니다. +A rocky spirit rushes forth from the ground! +바위 같은 정령이 땅에서 튀어나온다! +You call upon the plane of Earth! +당신은 지구의 차원을 호출합니다! + + +Summon Air Mote +에어모트 소환 +Select where to put the air mote (cannot place on occupied squares) +에어 티끌을 놓을 위치 선택(점유 중인 사각형에는 놓을 수 없음) +Create a dusty mote that attacks using gusts of wind. +돌풍을 이용해 공격하는 먼지 티끌을 만듭니다. +A dust devil arises in front of you! +먼지 악마가 당신 앞에 나타납니다! +You call upon the plane of Air! +당신은 공기의 차원을 호출합니다! + + +Summon Water Mote +워터모트 소환 +Select where to put the water mote (cannot place on occupied squares) +물티끌을 놓을 위치를 선택합니다(점유 중인 사각형에는 놓을 수 없음). +Create a watery serpent which stuns enemies with its melee attack. +근접 공격으로 적을 기절시키는 물뱀을 만듭니다. +A watery spirit bubbles up from the ground! +물의 정령이 부글거리며 땅에서 솟아오릅니다! +You call upon the plane of Water! +당신은 물의 차원을 호출합니다! + + +Summon Shadow Warrior +그림자 전사 소환 +Select where to put the shadow warrior (cannot place on occupied squares) +그림자 전사를 배치할 위치 선택(점유 중인 사각형에는 배치할 수 없음) +Call forth a shadow warrior for 16 turns who deals DamageDealt damage every other turn. +매 턴마다 DamageDealt 피해를 입히는 그림자 전사를 16턴 동안 불러냅니다. +...and the abyss answers! +...그리고 심연이 대답합니다! +You call... +당신이 전화... + + +### Summon Nature Spirit + +### Select where to put the nature spirit (cannot place on occupied squares) + +### Create a natural spirit that fires vine projectiles and has a healing aura that restores HP to allies and regenerates your stamina. + +### A healing wisp appears! + +### You call upon the powers of nature! + + + + + +Summon Golem +골렘 소환 +Select where to put the golem (cannot place on occupied squares) +골렘을 놓을 위치 선택(점유 중인 사각형에는 놓을 수 없음) +Create a slow but powerful golem to fight by your side +느리지만 강력한 골렘을 만들어 곁에서 싸우세요 +A golem arises! +골렘이 나타났다! +You stomp your foot and draw the words of life on the floor! +당신은 발을 구르고 바닥에 생명의 말을 그립니다! + + +Summon Decoy +미끼 소환 +Select where to create an illusion (cannot place on occupied squares) +환상을 만들 위치를 선택하십시오(점유 중인 사각형에는 배치할 수 없음). +Create a decoy for Duration turns. It attracts enemy attention and triggers traps. +지속 시간 동안 미끼를 만듭니다. 적의 관심을 끌고 함정을 작동시킵니다. +A shadow of yourself materializes! +자신의 그림자가 구체화된다! +You create a line on the ground and toss in a lock of your hair! +당신은 땅에 선을 만들고 머리카락을 묶습니다! + + +Feather Explosion +깃털 폭발 + + +Elastic Grip +탄성 그립 +A latex hand reaches out and pulls an enemy close to you! Base pull strength: 4 +라텍스 손이 손을 뻗어 가까이 있는 적을 끌어당깁니다! 기본 당기기 강도: 4 +You extend a rubbery hand and grab a foe! +당신은 고무 같은 손을 뻗어 적을 잡습니다! +There's an obstacle in the way! +도중에 장애물이 있습니다! +Select a target to pull +끌어올 대상 선택 + + +Slime Blast +슬라임 블래스트 +Witch's Slime +마녀의 점액 +### Rubber Explosion + +Witch's Slime Ball +마녀의 슬라임볼 +### Robotic Arm + +A pool of slime deals DamageDealt glue damage to enemies on impact and covers the area in temporary slime. +점액 웅덩이는 적에게 피해를 입히고 적에게 접착제 피해를 주고 일시적인 점액으로 해당 지역을 덮습니다. +You conjure a pool of slime! +당신은 슬라임 웅덩이를 만들어냅니다! +Select where the slime will appear +슬라임이 나타날 위치 선택 + + +Slime Eruption +슬라임 분출 +### A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them briefly. + +You conjure an explosion of slime! +당신은 슬라임 폭발을 불러일으킵니다! + + +Slime Splash +슬라임 스플래쉬 +After one turn, deals DamageDealt glue damage in a small area and spreads slime. +한 턴 후 좁은 지역에 DamageDealt 접착제 피해를 입히고 점액을 퍼뜨립니다. +You conjure a small amount of slime! +당신은 소량의 슬라임을 불러냅니다! + + +Water Ball +워터볼 +### Fast projectile. Deals DamageDealt soap damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. + +You hurl a ball of water! +당신은 물 공을 던져! + + +Tidal Sphere +조석구 +### Slow moving projectile, deals DamageDealt soap damage to enemies it passes thru. Leaves a large amount of water in its wake. + +You raise a huge mass of water! +당신은 엄청난 양의 물을 끌어올립니다! + + +The boulder knocks you to the ground! +바위가 당신을 땅에 쓰러뜨립니다! +The water covers you and drenches you! +물이 너를 덮고 적신다! +You step in water and become wet. +물에 들어가 젖게 됩니다. + + +Ice Breath +아이스 브레스 +A field of icicles that deals DamageDealt damage on a hit and stuns briefly. +명중 시 DamageDealt 피해를 입히고 잠시 기절시키는 고드름 필드입니다. +You breath out a chilling frost! +당신은 차가운 서리를 내뿜습니다! +Select where to put the icicles (SpellArea radius) +고드름을 놓을 위치 선택(SpellArea 반경) + + +### The mummy's curse paralyzes you! + +Rubber Bullets +고무 총알 +You are hit by a fusilade of rubber bullets! +당신은 고무 총알의 fusilade에 맞았습니다! +The rubber bullets congeal into a slimy material on your body! +고무탄이 몸에 끈적끈적한 물질로 응고됩니다! + + +Nature Blast +네이처 블래스트 +Raging Vines +성난 덩굴 + + +Magic Belts +매직 벨트 +You project a pool of sticky slime! +끈적 끈적한 점액 웅덩이를 투사합니다! +Arrow of Love +사랑의 화살 +You loose a glowing arrow! +당신은 빛나는 화살을 잃었습니다! +### Blaster + +You charge up a beam and fire it! +빔을 충전하고 발사합니다! +You swing your weapon and pull away the target's equipment! +당신은 무기를 휘두르고 대상의 장비를 빼냅니다! +You swing Dragonslaver and it lashes out in a whip-like fashion! +Dragonslaver를 채찍처럼 휘두릅니다! +The slime from your staff coats your body, granting you strange powers! +지팡이에서 나온 점액이 몸을 뒤덮고 특이한 힘을 부여합니다! +The power of the four elements flows through your veins! +당신의 혈관에는 4대 원소의 힘이 흐르고 있습니다! +An explosion knocks you to the ground! +폭발이 당신을 땅에 넘어뜨립니다! + + +Curious Spell +호기심 많은 주문 +You have been flummoxed! +당신은 당황했습니다! + + +You feel a prick as a small syringe hits you, and you start feeling drowsy... +당신은 작은 주사기가 몸을 찌르는 것을 느끼고, 어지러워집니다... +The thrown cuffs snap shut around your ankles and slow you down!!! +던져진 수갑이 찰칵소리를 내며 발목을 감싸고 당신의 속도를 늦춥니다!!! +Ribbon Burst +리본 버스트 +Spores +포자 +Noxious Spores +유해 포자 +Enticing Spores +유혹하는 포자 +You inhale some spores, and feel a bit sleepy... +포자를 약간 들이마시니 잠이 옵니다... +The spores make you feel excited! +포자가 당신을 흥분시킵니다! +The toxic spores make you feel faint... +독성 포자는 당신을 현기증나게 합니다... + + +Magic Hairpin +매직 헤어핀 +The magic hairpin goes for your eyes and forces you to blink! +마법의 머리핀이 당신의 눈을 노리고 강제로 눈을 깜빡이게 합니다! + + +Ice Storm +아이스 스톰 + + +Icy Aura +아이시 아우라 + + +Slime Ball +슬라임볼 +### A ball of slime leaves a trail of sticky slime (20 damage when stepped on). It deals DamageDealt glue damage on a hit. + +You hurl a ball of slime! +슬라임 공을 던집니다! + + +Summon Skeleton +스켈레톤 소환 +Mass Summon Skeleton +대량 소환 스켈레톤 +A skeleton arises from bones on the floor! +바닥의 ​​뼈에서 스켈레톤이 나타납니다! +A gang of SummonCount skeletons forms around you! +SummonCount 스켈레톤 무리가 주변에 형성됩니다! +A gang of SummonCount zombies emerges from the floor! +SummonCount 좀비 무리가 바닥에서 나타납니다! +A bunch of gags fly out from your satchel! +가방에서 많은 개그가 날아갑니다! + + +A floating hand appears and cracks its knuckles! +떠다니는 손이 나타나서 너클을 꺾습니다! +A floating gag appears and starts flying toward you! +떠다니는 개그가 나타나 당신을 향해 날아오기 시작합니다! +### A floating blindfold appears and starts flying toward you! + +### A floating yoke appears and starts flying toward you! + +### A floating armbinder appears and starts flying toward you! + +### A floating straitjacket appears and starts flying toward you! + +### A floating harness appears and starts flying toward you! + +A set of shackles opens wide and starts going for your wrists! +족쇄 세트가 활짝 열리고 손목을 노리기 시작합니다! +A swarm of shackles approaches you! +족쇄 떼가 당신에게 접근합니다! +### A swarm of gags approaches you! + +A cloud of locks and chains clatters as it levitates toward you! +자물쇠와 사슬의 구름이 당신을 향해 공중부양하면서 달그락거립니다! +A huge cloud of locks and chains clatters as it levitates toward you! +자물쇠와 사슬의 거대한 구름이 당신을 향해 공중부양하면서 달그락거립니다! +Floating hands appear by the conjurer's side as she points her staff! +마술사가 지팡이를 겨누자 떠다니는 손이 그녀 옆에 나타납니다! + + +Floating books appear near the caster! +시전자 근처에 떠다니는 책 나타납니다! +Dusty tomes appear near the caster! +시전자 근처에 먼지투성이 책이 나타납니다! +Magical books appear near the caster! +시전자 근처에 마법의 책이 나타납니다! +Sinister books appear near the caster! +시전자 근처에 불길한 책이 나타납니다! +Crackling books appear near the caster! +딱딱거리는 책이 캐스터 근처에 나타납니다! +Glowing books appear near the caster! +캐스터 근처에 빛나는 책이 나타납니다! +Rubber-stained books appear near the caster! +고무로 얼룩진 책이 캐스터 근처에 나타납니다! +Flaming books appear near the caster! +캐스터 근처에 불타는 책이 나타납니다! +Frigid books appear near the caster! +캐스터 근처에 차가운 책이 나타납니다! +Devilish books appear near the caster! +캐스터 근처에 마성의 책이 등장! + + +A floating book appears near the caster! +캐스터 근처에 떠다니는 책이 나타납니다! +A dusty tome appears near the caster! +시전자 근처에 먼지 투성이의 책이 나타납니다! +A magical book appears near the caster! +캐스터 근처에 마법의 책이 나타납니다! +A sinister book appears near the caster! +캐스터 근처에 불길한 책이 나타납니다! +A crackling book appears near the caster! +캐스터 근처에 딱딱거리는 책이 나타납니다! +A glowing book appears near the caster! +캐스터 근처에 빛나는 책이 나타납니다! +A rubber-stained book appears near the caster! +고무로 얼룩진 책이 캐스터 근처에 나타납니다! +A flaming book appears near the caster! +캐스터 근처에 불타는 책이 나타납니다! +A frigid book appears near the caster! +캐스터 근처에 차가운 책이 나타납니다! +A devilish book appears near the caster! +캐스터 근처에 마성의 책이 나타난다! + + +Your struggling leaves you aroused because of the RestraintName... +당신의 고군분투는 RestraintName 때문에 당신을 흥분시킵니다... +You feel your restraints squeeze you and tingle with painful sensations! +당신은 당신의 구속이 당신을 압박하고 고통스러운 감각으로 따끔 거림을 느낍니다! +'Do not resist,' whispers a voice in your head... +'저항하지 말라'는 목소리가 머릿속에서 속삭인다... +Your restraints squeeze you painfully without mercy! +당신의 속박은 자비 없이 고통스럽게 당신을 압박합니다! +The crystals emit a powerful energy! +크리스탈이 강력한 에너지를 발산합니다! +You feel your body overflow with energy... +당신은 당신의 몸이 에너지로 넘쳐 흐르는 것을 느낀다... +The crystals react to your struggle attempts with a strange energy! +크리스탈은 당신의 투쟁 시도에 이상한 에너지로 반응합니다! + + +Cast Spell (XXX turn delay) +Cast Spell (XXX 턴 지연) + + +You feel the vibrations leaving your body... +진동이 몸을 떠나는 느낌... +You feel your toys start to buzz... +당신은 당신의 장난감이 윙윙거리기 시작하는 것을 느낍니다... +You your toys continue to buzz... +당신의 장난감은 계속 윙윙거립니다... +### The EnemyName remotely causes your toys to buzz!!! + +You feel the plugs inside you while walking. +걷는 동안 내부의 플러그를 느낍니다. +### Your toys pulse and tingle occasionally. + +### Your toys tease you and buzz gently... + +### Your vibrating toys are difficult to ignore... + +### Your toys buzz strongly, making it difficult to concentrate! + +### You tremble as the toys give off intense vibrations! + +### Your toys torture you with intense pulsations! + +### Your whole body resonates with the intense stimulation! + +### The stimulation is so intense you can hardly breath! + +Your toys stop vibrating. +장난감이 진동을 멈춥니다. +You feel slightly full as you move... +움직이면서 약간 포만감이... +Your movement disturbs the plugs inside of you... +당신의 움직임은 당신 내부의 플러그를 방해합니다 ... +The large plugs shift(s) around inside of you... +큰 플러그가 당신 내부에서 움직입니다... +The huge plugs rub(s) around constantly inside of you... +거대한 플러그가 당신의 내부를 끊임없이 문지릅니다... +Your movements are hobbled. +당신의 움직임은 절름발이입니다. +Your hobbled movement disturbs the plugs inside of you. +당신의 절름발이 움직임은 당신 내부의 플러그를 방해합니다. +The large plugs shift(s) around inside of you from your hobbled movement... +절름발이 움직임으로 인해 내부에서 큰 플러그가 이동합니다... +The massive plugs rub(s) around inside of you as you hobble forward... +절뚝거리며 앞으로 나아가면 거대한 마개가 몸 안을 문지릅니다... +You hop forward! +당신은 앞으로 뛰어! +You hop and feel the plugs shifting around inside your body. +당신은 당신의 몸 안에서 플러그가 이동하는 것을 뛰고 느낍니다. +The plugs shift in and out with each hop... +플러그는 각 홉마다 안팎으로 이동합니다 ... +### The massive plugs slide in and out sensually as you hop... + +### You crawl forward! + +### You crawl and feel the plugs shifting around inside your body. + +### The plugs shift in and out as you crawl... + +### The massive plugs slide in and out sensually as you crawl... + +You inch forward slowly! +당신은 천천히 앞으로 인치! +You inch forward, feeling the movement of your plugs. +플러그의 움직임을 느끼며 앞으로 조금씩 나아갑니다. +You wiggle your hips inching forward, feeling the plugs inside you... +엉덩이를 조금씩 앞으로 움직이며 내부의 플러그를 느끼며... +You wiggle forward, the massive plugs inside you digging in and out... +당신은 앞으로 꿈틀대고, 당신 안에 있는 거대한 마개들이 파고들고 빠져나갑니다... +You crawl helplessly! +당신은 무기력하게 기어! +You crawl helplessly, feeling the plugs shifting around inside you. +당신은 내부에서 마개가 움직이는 것을 느끼며 무기력하게 기어갑니다. +You crawl and feel the plugs inside you rub around teasingly... +당신은 기어서 내부의 플러그가 장난스럽게 문지르는 것을 느낍니다... +You crawl helplessly, tormented by the massive plugs inside you... +당신은 내부의 거대한 마개에 괴로워하며 무기력하게 기어갑니다... +You are unable to move! +당신은 움직일 수 없습니다! +You wriggle uselessly, feeling the plugs shift inside you! +당신은 쓸데없이 꿈틀거립니다. 당신 안에서 플러그가 움직이는 것을 느끼니까요! +You wriggle uselessly, aroused by the plugs inside you! +당신은 당신 내부의 플러그에 흥분하여 쓸데없이 꿈틀거립니다! +You wriggle uselessly, tormented by the massive plugs inside of you! +당신은 당신 내부의 거대한 플러그에 괴로워하며 쓸데없이 꿈틀거립니다! +You climb into the grate +당신은 창살에 올라 + + +Mmmph... +으읍... +Mmmmmmmmm... +으읍읍으읍... +Hhmmpphh... +흐으읍읍... +Gghhhh!!! +으악!!! +Mmmmmphh!!! +읍읍으읍흡!!! +Mmm... +음... +MMM!!! +읍읍!!! +Mmmmmm. +읍으으. + + +Mmmaaaaahhh... +응으핫... +Mmmmmmmmm~ +으읍읍~ +Unnnghhh... +우읏... +Mmmmmmmphhh.. +읍읍흐으.. +Mmmmmphh~ +읍으읍~ +Mmm~ +으읍~ +Mmmmm~~ +읍읍~~ +Mmmmmm~~~ +으읍읍~~~ + + +### Mmph... + +### Mmmm! + +Hmmph. +흐읍읍. +### Mmmm... + +Mmmph. +읍. + + +### Mmmmmmph!!! + +### Gmmmmph! + +### Hmmmmph~!! + +You are blinded! +당신은 눈이 멀었습니다! +### You took DamageTaken damage! + +You get caught in sticky slime! +끈적끈적한 슬라임에 걸렸다! +### You get caught in a sticky slime bubble! + +The slime ball sticks to you! +슬라임 볼이 달라붙어! +The slime ball sticks to you and slows you! +슬라임 볼이 당신에게 달라붙어 속도를 늦춥니다! +You feel a powerful sensation run through your body! +당신은 당신의 몸을 통해 흐르는 강력한 감각을 느낀다! +### You feel a pleasurable sensation run through your body! + +Beams of light wrap around your body and feel warm on your skin! +빛의 광선이 몸을 감싸고 피부가 따뜻해집니다! +Crystals begin to form around your limbs! +팔다리 주위에 수정이 형성되기 시작합니다! +A magic chain secures itself around your body! +마법의 사슬이 당신의 몸을 감싸고 있습니다! +### An animated chain secures itself around your body! + +### A magic rope secures itself around your body! + +### A magic belt secures itself around your body! + +A rope wraps itself around your body! +밧줄이 당신의 몸을 감쌉니다! +A ribbon animates and becomes entwined around you! +리본이 움직이며 당신을 감쌉니다! +A belt buckles itself tightly around your body! +벨트가 몸을 단단히 조입니다! +A vine slithers across your body and tightens! +덩굴이 당신의 몸을 미끄러지듯 지나가며 팽팽해집니다! +The spell hits you and slows you down! +주문이 당신을 때리고 속도를 늦춥니다! +### Witch's Rope + +Rope Tendrils +로프 텐드릴 +### The Blessing + +### A long tendril emerges from the kraken's body! + +### Coiled ropes spring up from the floor! + +### Several glowing wrappings emerge! + +### A glowing wrapping emerges and starts moving toward you! + +Rope Strike +로프 스트라이크 +Animated Vines +애니메이션 덩굴 +Soul-binding Sigil +영혼을 묶는 시질 +Elven Arrow +엘프 애로우 +The elven arrow flashes and wraps you in mithril ropes! +엘프 화살이 번쩍이며 당신을 미스릴 밧줄로 감쌉니다! +Ropes wrap themselves around your body from all sides! +로프가 사방에서 몸을 감쌉니다! +### Wrappings appear and wrap you head to toe! + +### A spell transforms your wrappings into hexed latex! + +### A spell engulfs you in wrappings! + +### Vines sprout around you and grab hold of your limbs! + +Your clothes are stripped and replaced! +옷이 벗겨지고 교체됩니다! +Vines tear off your clothes! +덩굴이 당신의 옷을 찢습니다! +Restraints materialize on your body! +당신의 몸에 구속이 구체화됩니다! + + +The orb explodes into a burst of ribbons! +오브가 리본 폭발로 폭발합니다! +The orb tears off your clothes! +오브가 당신의 옷을 찢습니다! + + +Charm Trap +매력 함정 +Ribbon Trap +리본 트랩 +Shackle Trap +족쇄 함정 +Mummy Trap +미라 트랩 +Rope Trap +로프 트랩 +### Holy Rope Trap + +Belt Trap +벨트 트랩 +Cable Trap +케이블 트랩 +Slime Trap +슬라임 트랩 +Chain Trap +체인 트랩 +### Shadow Latex Trap + +### Demonic Sigil + +### Unstable Crystals + +Gas Trap +가스 트랩 +### Latex Engulfment + +### Latex Spherification + +Sleep Dart +수면 다트 + + +A talisman on the floor explodes, sending a cloud of charms flying around you! +바닥에 있던 부적이 폭발하여 매력의 구름이 주위를 맴돌게 합니다! +Magical binding ribbons emerge from the walls! +마법 결속 리본이 벽에서 나온다! +The ceiling opens, letting a lot of shackles fall on you! +천장이 열리고 많은 족쇄가 당신에게 떨어집니다! +Bands of glowing wrappings start flying in from all sides! +빛나는 포장 띠가 사방에서 날아오기 시작합니다! +Ropes slither out towards you from between the bricks! +벽돌 사이에서 당신을 향해 밧줄이 미끄러져 나옵니다! +Ropes fall on you from all sides! +사방에서 밧줄이 떨어진다! +### A constellation of ropes surrounds you! + +Leather restraints start appearing around you! +가죽 구속이 주변에 나타나기 시작합니다! +high-tech cables come out from the floor! +하이테크 케이블이 바닥에서 나온다! +Slimes pours out from the walls and ceiling! +벽과 천장에서 슬라임이 쏟아져 나온다! +Ethereal chains appear all around you! +에테리얼 체인이 사방에 나타납니다! +### Shadows constrict around you! + +### An otherworldly sigil appears below you! + +### Crystals rise up around you! + +### Something shiny seems to be stretched out over the floor! + +### A rubber bubble starts forming around you! + +### A rubber ball starts forming around you! + +You hear the sound of glass breaking, and a cloud of pink gas rises around you! +유리가 깨지는 소리가 들리고 분홍색 가스 구름이 주변으로 솟아오릅니다! +You hear the sound of glass breaking, and a cloud of green gas rises around you! +유리가 깨지는 소리가 들리고 녹색 가스 구름이 주위로 솟아오릅니다! +The charms stick themselves all over your body! +매력이 온 몸에 달라붙는다! +### A metal pole catches you from below! + +The ribbons tie themselves tightly around your body and won't let go! +리본이 당신의 몸을 단단히 묶고 놓지 않을 것입니다! +Shackles close themselves over your limbs! +족쇄가 팔다리에 스스로를 닫습니다! +The wrappings close in over your body! +래핑이 몸을 감싸고 있습니다! +The ropes wrap themselves around your body! +로프가 당신의 몸을 감싸고 있습니다! +The ropes wrap themselves tightly around your body! +로프가 몸을 단단히 감쌉니다! +### The holy ropes secure themselves upon your body! + +The leather restraints attach themselves to your body! +가죽 구속이 몸에 달라붙는다! +The high-tech cables wrap themselves over your body! +하이테크 케이블이 당신의 몸을 감싸고 있습니다! +The slime pours all over you! +점액이 온통 쏟아져요! +### A giant cube of latex engulfs you! + +### A giant bubble of latex engulfs you and inflates, sealing you in! + +### A giant latex ball swallows you and inflates, sealing around your neck! + +### A sinister power wraps itself around you and solidifies! + +### Dark magics swirl around you and solidify into shiny rubber! + +### Crystals grow and spread across your limbs! + +The magic chains wrap themselves around your body! +마법의 사슬이 당신의 몸을 감쌉니다! +Your clothes are getting ripped away! +옷이 찢어지고 있어요! +You feel a prick as a small dart hits you, and you start feeling drowsy... +작은 다트가 당신을 때리자 따끔거리는 느낌이 들고 졸음이 오기 시작합니다... +You breathe in the gas, and a wave of pleasure hits your whole body. +가스를 들이마시면 쾌감의 물결이 온몸을 강타합니다. +You breathe in the gas, and feel lethargic... +당신은 가스를 들이마시고 무기력함을 느낍니다... +### You hear a mechanism trip... + +### Items + +### Rep + +Spells +주문 +Learn New Spells +새로운 주문 배우기 +Click a spell to replace SPELLNAME with. +SPELLNAME을 대체할 주문을 클릭하십시오. +Empty Slot +빈 슬롯 +Back to Spellbook +주문서로 돌아가기 +Return to Game +게임으로 돌아 가기 + + +### Known Abilities + +Elemental Spells +원소 주문 +Conjuration Spells +컨저레이션 주문 +Illusion Spells +일루전 마법 +Perks +특전 +Perks II +특전 II +Perks III +특전 III + + +pg. NUM/TOTAL +페이지.NUM/총계 +### > + +### < + +Spell Points: SPELLPOINTS +주문 포인트: SPELLPOINTS +You need a higher level in SCHOOL magic to learn this spell. +이 주문을 배우려면 더 높은 수준의 SCHOOL 마법이 필요합니다. +You need more spell points. +주문 포인트가 더 필요합니다. +You don't have enough maximum mana to cast this spell! +이 주문을 시전하기에는 최대 마나가 부족합니다! +### School: + +Generic +일반적인 +### Upgrade + +### Special + +Learn Spell +마법 배우기 +### Spell Points: + + + +### Level: + +### Spell Point Cost: + +### Mana Cost: + + + +Remove Spell 1 +마법 1 제거 +Remove Spell 2 +마법 2 제거 +Remove Spell 3 +마법 3 제거 +Remove Spell 4 +마법 4 제거 +Remove Spell 5 +마법 5 제거 +Remove Spell 6 +마법 6 제거 +Remove Spell 7 +마법 7 제거 +Replace Spell 1 +교체 마법 1 +Replace Spell 2 +교체 마법 2 +Replace Spell 3 +교체 마법 3 +Replace Spell 4 +교체 마법 4 +Replace Spell 5 +교체 마법 5 +Replace Spell 6 +교체 마법 6 +Replace Spell 7 +교체 마법 7 +### Current Spell 1: + +### Current Spell 2: + +### Current Spell 3: + +### Current Spell 4: + +### Current Spell 5: + +### Current Spell 6: + +### Current Spell 7: + +### ??? + +Unfiled +정리되지 않은 +### Adventuring 101 + +### History + +Bondage Witchery +속박 마술 +Enemy Notes +적 노트 +### Overgrown + +Temple +절 +Tombs +무덤 +Library +도서관 +### Bellows + +### Coast + +### Ejahl + +### (A page from the Book of Aeons)|The 'Graveyard' is a peculiar place. Long ago, human beings lived and died just like the animals. When the Old Civilization existed, they would come to bury their dead in the Graveyard. It remains a mystery why so many of the former dead seem to be alive. Some say that when the Old Civilization cast the spell that spell which overcame Death, even those buried in their graves would rise again. Others simply say that there is a powerful necromancer who lives here, toying with the dead as if they were pets... + +### (A page from the Book of Aeons)|Beneath the Graveyard lies a relic of a former age, a network of tombs inhabited by the immortal followers of Bast. Very few were graced with this gift of immortality before the great archmagus, Sariel Vinlaga, stole this power from the gods and granted all humans with the power of immortality. The Bast followers are still set in their ways, hoping for a time when their Goddess will return and rebuild their glorious civilization. + +### (A page from the Book of Aeons)|Some say the 'Catacombs' are older than time itself. When the Old Civilization began to study immortality, no one knew if it would be possible to bring back those who already died. The Catacombs therefore were used to store all of the remains of former humans, so that they too could be revived when the archmagus would finally make her breakthrough. + +### (A page from the Book of Aeons)|They say that Archmagus Sariel Vinlaga studied in this very library. Having gathered together all of human knowledge, magical, spiritual, technological, she tasked her twelve lesser magi with the job of sorting and collating the wealth of knowledge she had acquired. No one knows why she suddenly abandoned it, or why it remains in such disrepair today. + +### (A page from the Book of Aeons)|The Overgown Ruins remain a puzzle to scholars. Hardly any light comes through the cracks in the ceiling, and yet the area teems with life. It is known that the regenerative powers that keep humans from dying relies on an individual's own mana supply. So how do plants and beasts without mana survive? The devout say it is the Goddess of Restoration who preserves the jungle, but could it be that the Old Civilization developed a means of sustaining life underground? + +### (A page from the Book of Aeons)|The problem of Energy has plagued civilization for millenia. Before the leylines were discovered, humankind relied on natural sources of power such as rivers and firewood. When the Crystal Caves were discovered, a great revolution occurred. No longer reliant on natural sources, civilizations could tap the wellsprings of chaotic energy underground to power machinery like never seen before. + +### (A page from the Book of Aeons)|The 'Lost Temple' as they call it, is a subject of great speculation. It seems that its creators worshipped only four creator goddesses, rather than all the Eight. It was perhaps abandoned several hundred years ago when a flood caused great panic, and it seems that this must have occurred before humanity was made immortal by the archmagus, as there are many remains still found inside. + +### (A page from the Book of Aeons)|The Stars have been a mystery to scholars since the beginning of time. At one point, humans believed that every star was a god, and they made offerings by throwing sugar into the night, thinking that as the stars were innumerable, so were the grains of sugar that pleased humans so much. Religion has moved past that, but the Orrery remains a relic from a time when humanity worshipped the stars rather than the Eight. + +### (A page from the Book of Aeons)|The 'Bellows' is the nickname given to the primitive facilities of the Old Civilization, buried deep beneath the ground. While much of it remains in disrepair, many of the Old Civilization's successors have attempted to keep it in good working order, as the technology is precious and impossible to replicate with modern methods. It seems that many of these successors have fallen prey to some delusions about its purpose, as much of the equipment preserved has little use aside from collecting prisoners. + +(Preface from the journal of Catherine Willows, well-known explorer who vanished in the dungeon 30 years ago) I am writing this journal in the off chance that I do not come back in my search for the Mistress' staff. If you find this, please make an effort to deliver it back to the surface for the good of all the young women lured by its secrets. +(30년 전 던전에서 사라진 저명한 탐험가 캐서린 윌로우스의 일지 ​​서문) 여주인의 지팡이를 찾으러 돌아오지 못할까봐 이 일기를 쓰고 있습니다. 이것의 비밀에 이끌린 모든 젊은 여성들의 이익을 위해 그것을 지상으로 되돌려 놓도록 노력해 주십시오. +(Pg. 24 from Catherine Willows' journal) Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?' +(Catherine Willows의 일지에서 24페이지) 여주인의 무덤 위층을 흙손질하는 많은 사람들은 종종 수사학적으로 묻습니다. '보물 상자를 지키는 이상하고 변태적인 함정이 있는 이유는 무엇입니까? 침입자?' +(Pg. 25 from Catherine Willows' journal) ...They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence. +(Catherine Willows의 일지에서 25페이지) ...그들은 중대한 실수를 저질렀습니다. 보물 상자는 갇혀 있는 것이 아니라 금으로 가득 차 있습니다. 그리고 우리는 금이 신에게 기쁨이 된다는 것을 압니다. 정령으로 알려진 하급 신들도 금을 사랑하지만 우리가 알고 있는 신들과는 달리 이 하급 정령들은 제단에서 금을 소비할 수 없습니다. 신이 할 수 있는 것처럼 단번에 급습합니다. 따라서 그들은 금이 있는 곳에 물리적으로 거주하여 천천히 즐거운 본질을 빼내야 합니다. +### (Pg. 26 from Catherine Willows' journal) So the question is not 'why did somebody lay these traps.' The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. + +(The note starts with a drawing of a witch with many chains hanging from her body) She can block melee attacks with her chains. However, they conduct lightning and heat directly to her body, and I was able to take out her chains with bolt cutters. +(노트는 그녀의 몸에 많은 사슬이 매달린 마녀의 그림으로 시작됩니다) 그녀는 그녀의 사슬로 근접 공격을 막을 수 있습니다. 그러나 그들은 그녀의 몸에 번개와 열을 직접 전달합니다. 나는 그녀의 사슬을 볼트 절단기. +(The note starts with a drawing of a witch with lightning crackling from her fingertips) Water will cause her to short-circuit. I can't seem to hit her with lightning, though. She always redirects it. +(노트는 손끝에서 번개가 치직거리는 마녀의 그림으로 시작합니다.) 물은 그녀를 단락시킬 것입니다. 하지만 번개로 그녀를 칠 수는 없는 것 같습니다. 그녀는 항상 방향을 바꿉니다. +(The note starts with a drawing of a witch whose body is partly gelatinous) The slime is non-flammable and my attacks pass right through her body... Lightning and ice seem to be effective! +(노트는 몸이 부분적으로 젤라틴인 마녀의 그림으로 시작됩니다.) 슬라임은 불연성이며 내 공격은 그녀의 몸을 바로 통과합니다... 번개와 얼음이 효과적일 것 같습니다! +(The note is from a famous escape artist) Many restraints are applied quite tightly by a skilled rigger. Even removing it will be tough without thrashing around a bit to loosen it. +(유명한 탈출 예술가의 노트) 많은 구속은 숙련된 리거에 의해 꽤 단단하게 적용됩니다. 그것을 풀기 위해 약간의 몸부림을 치지 않고서는 그것을 제거하는 것조차 힘들 것입니다. +(The note is from a famous escape artist) Anything can be unbuckled with enough patience. Having a finger extension such as a lockpick will help. Ultimately, though, what matters is that you have a calm state of mind, free from distraction and hopelessness. +(유명한 탈출 예술가의 쪽지) 인내심만 있으면 뭐든지 풀 수 있습니다. 자물쇠 따개 같은 손가락 확장 장치가 있으면 도움이 됩니다. 가망 없음. +(The note is from a famous cartographer) In my lapse of judgement, I decided to borrow some mana from the nearby shrine to the Latex goddess. While there was no immediate response to my faux pas, I soon found myself pursued by a swarm of slimes! +(유명한 지도 제작자가 보낸 쪽지) 판단력이 부족하여 인근 신사에서 라텍스 여신에게 마나를 빌리기로 결정했습니다. 내 실수에 즉각적인 반응이 없었지만 곧 떼에게 쫓기고 있음을 발견했습니다. 슬라임! +(A letter between bandit leaders) One of my subordinates has been reporting a girl bound in heavy leather restraints running around. I told her that this is normal, people keep all kinds of servants around here. But definitely keep an eye out for intruders! Don't let them fool you! +(도적 두목 사이의 편지) 내 부하 중 한 명이 무거운 가죽 구속에 묶인 소녀가 뛰어다니고 있다고 보고했습니다. 나는 그녀에게 이것이 정상이며 사람들이 이 주변에 모든 종류의 하인을 두었다고 말했습니다. 하지만 침입자를 확실히 주시하십시오. ! 속지 마세요! +(The note is a letter from the school of conjuration) We really would like to know... why did you summon a frog in the laboratory? People are wondering, you know. One of the student's projects got eaten. +(노트는 요술 학교에서 온 편지입니다) 우리는 정말 알고 싶습니다... 왜 실험실에서 개구리를 소환했습니까? 사람들이 궁금해하고 있습니다. 학생의 프로젝트 중 하나가 먹혔습니다. +(You find a carving on the floor, a half-finished magic circle of celestial conjuration. Perhaps a cleric wished to call forth an angel for guidance, before realizing there was a shrine a short walk away, where she could contact the heavens much more easily.) +(당신은 바닥에서 반쯤 완성된 천체 소환 마법진 조각을 발견했습니다. 아마도 한 성직자가 천사를 불러 안내를 받고 싶었을 것입니다. 더 쉽게.) +(It looks like a... receipt) Thank you for your offering to CELESTIAL COMMERCE. Please accept this fine-quality steel blade as compensation for your continued devotion and selflessness. +(...영수증인 것 같습니다) CELESTIAL COMMERCE에 제공해주셔서 감사합니다. 당신의 지속적인 헌신과 이타심에 대한 보상으로 이 고급 강철 칼날을 받아주세요. +(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter that she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. +(필기체 쪽지) 우리 택배기사를 폭행하고 묶인 분께: 환상의 여신의 사당은 이런 식으로 사용해서는 안 됩니다. 음란한 실험 대상을 원하신다면 시도해보세요 그러니 현지인 중 한 명에게 제발 그녀를 묶기 위해 천사 택배를 부르지 마세요. 그녀가 동의했는지, 당신이 돈을 지불했는지는 중요하지 않습니다. 우리 택배는 그들이 수행해야 할 책임이 있습니다. 서명: HERONA, GODDESS of ILLUSIONS의 집행자. +(From an essay titled 'On Celestial Supply Chains') It is known that the heavens seek gold. We do not know why it is that the heavens seek it, but we do know that the Goddesses grant us fragments of their limitless power in exchange for this otherwise-useless metal we dredge up from the earth. They care about it so much that shrines are commonplace, each hosting an angelic courier lying in wait for any adventurer willing to part with hers. +('On Celestial Supply Chains'라는 제목의 에세이에서) 하늘이 금을 찾는다는 것은 알려져 있습니다. 우리는 하늘이 금을 찾는 이유를 알지 못하지만, 여신들이 우리에게 그들의 무한한 힘의 조각을 허락한다는 것은 압니다. 우리가 땅에서 굴착한 이 쓸모없는 금속과 교환하세요. 그들은 그것에 너무 신경을 써서 성소가 흔하고, 각 성소에는 그녀와 헤어질 모험가를 기다리고 있는 천사 같은 짐꾼이 기다리고 있습니다. +They say that the maiden who safeguards the graveyard is kind to her pets... +묘지를 지키는 처녀는 애완동물에게 친절하다고 하던데... +They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Portal out of jail and into the hallway where they kept all my things! +그들은 그들이 내 전설적인 검을 가질 수 있다고 생각했지만... 바보들은 내 다리를 묶는 것을 잊었습니다! 나는 블링크를 감옥에서 나와 그들이 내 모든 것을 보관한 복도로 들어갈 수 있었습니다! +I am writing this from inside prison. Who would have known they cared so much about me using a shrine? Sheesh. +감옥 안에서 이 글을 씁니다. 성소를 쓰면서 이렇게까지 신경을 쓰는 줄 누가 알았겠습니까? 쳇. + + +(A drawing of a bunch of zombies, ordered by danger level. Of note are a zombie surrounded by charms, a zombie surrounded by talismans, a zombie warrior with a sword, and... some kind of shrine maiden that you've never seen before) +(위험 수준에 따라 정렬된 좀비 무리의 그림입니다. 부적에 둘러싸인 좀비, 부적에 둘러싸인 좀비, 칼을 든 좀비 전사, 그리고... 이전에 본 적이없는) + + +### (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|The first thing to understand is that tying someone up is difficult if they are not in a vulnerable position. If your opponent is vulnerable, then binding will be twice as effective! + +### (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by tickling them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage. + +### (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Bigger and more resilient opponents are much more effective at breaking out of your binds. Try to deal some damage to them to decrease the speed at which they struggle out of your restraints. + +### (An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Many mages utilize magical runes to set traps. If you want to check for traps, try learning the spell 'Magical Sight' in the Illusion school. + +### From Adventuring 101: A guide to combat|Your opponent will become vulnerable in many ways, such as missing you with an attack. You can also teleport to the other side of them when they are attacking you, and this will confuse them briefly.|Vulnerable enemies take extra damage, and are easier to tie up! + +### From Adventuring 101: A guide to combat|Drenching your opponents makes them more vulnerable to ice and electricity, but may increase their resistance to fire. + +### From Adventuring 101: A guide to combat|Hitting enemies with melee damage while they are frozen will break the ice, but this also doubles the damage dealt by the attack. + +### From Adventuring 101: A guide to combat|Did you know that hitting enemies with fire while they are frozen is extra powerful? Enemies take 40% additional damage from fire while frozen, although fire will rapidly unfreeze them. + +### From Adventuring 101: A guide to combat|When you're in a bind, try to play along and look for an opportunity to escape. Fighting back will only make your enemies want to tighten your restraints. + +(A drawing of a suit of armor. It reads: DO NOT TRUST) +(갑옷 그림. 읽습니다: 신뢰하지 마십시오) +(The note starts with a drawing of a witch in dark robes with bright pink hair) A necromancer. Powerful spellcaster, weak up close. +(노트는 밝은 분홍색 머리에 어두운 로브를 입은 마녀의 그림으로 시작합니다.) 사령술사. 강력한 주문 캐스터, 가까이서 약합니다. +I can't count how many skeletons I've bashed with my hammer today. They seem so fragile... +오늘 망치로 얼마나 많은 스켈레톤을 두들겼는지 셀 수 없습니다. 너무 연약해 보여요... +(The note is scrawled with wiggling lines) IT SEES ME. I SHOULDN'T HAVE DEFILED THE ROPE GODDESS' ALTAR! +(흔들리는 선으로 메모가 휘갈겨져 있습니다) 저를 봅니다. 로프 여신의 제단을 더럽히지 말았어야 했어요! +It is said that fire and water are opposite planes, but I've noticed that the relation is more lopsided than 'equal and opposite' when they physically manifest. Water elementals resist fire, obviously, but fire elementals are weak to water! It is almost as if the abundance of water in this world causes the fire elementals to become weaker than in their home plane... +불과 물은 정반대라는 말이 있는데, 물리적으로 발현했을 때 '동등'보다 관계가 더 한쪽으로 치우쳐 있다는 것을 알아차렸습니다. 물의 정령은 불에 저항하는 것이 당연하지만 불의 정령은 물에 약합니다! 마치 이 세계의 풍부한 물이 불의 정령을 고향 차원보다 약하게 만드는 것 같습니다... +A drawing of many icicles around pools of water. It instructs you to avoid the pools of water and you can see a figure surrounded by ice shards in the distance being set on fire and smashed with a hammer. +물웅덩이 주변에 많은 고드름이 그려져 있습니다. 물웅덩이를 피하라는 지시를 내리며 멀리서 얼음 조각에 둘러싸인 형체가 불타고 망치로 부수는 모습을 볼 수 있습니다. +The shadow spirits' touch is cold as ice... I have wondered if this temperature property applies to their destructive effects on other types of beings. Unfortunately, I found out the hard way when I tried to summon a shadow creature against an ice elemental... +그림자 정령의 손길은 얼음처럼 차갑습니다... 이 온도 속성이 다른 유형의 존재에 대한 파괴적인 영향에 적용되는지 궁금했습니다. 불행히도 얼음에 대항하여 그림자 생물을 소환하려고 시도했을 때 어려운 방법을 발견했습니다. 원소 같은... +I was being chased by something fast and heavy, and it was about to crush me when I tossed an Ice Shard behind me. It stopped and I didn't care to look back. +나는 빠르고 무거운 무언가에게 쫓기고 있었고, 내가 얼음 조각을 내 뒤로 던졌을 때 그것이 나를 깔아뭉개려고 했다. 그것이 멈췄고 나는 뒤돌아볼 생각도 하지 않았다. +I was walking in the library when I got attacked by a magic book! Fortunately my sword seemed to disapatch it quickly, and I used my spear to stab another one shortly after. +도서관을 걷고 있을 때 마법책의 공격을 받았어요! 다행히도 제 검이 마법책을 빨리 흩어버리는 것 같았고, 얼마 지나지 않아 제 창으로 다른 마법책을 찔렀습니다. +SOMEBODY STABBED MY FROG AND I AM PISSED. +누군가가 내 개구리를 찔렀는데 화가 났어요. +I don't think it's neccessary to tell people that dragons resist fire... right? +드래곤이 불에 약하다고 사람들에게 말할 필요는 없을 것 같은데…? +I've been studying the dragonheart's weaknesses. So far I've found that the ones bearing the powers of ice dragons are actually weak to fire unlike the others, and the ones who summon crystals to block attacks are nonetheless unable to grab a spear to stop it from reaching them. +드래곤하트의 약점을 연구해왔습니다. 지금까지 아이스드래곤의 힘을 지닌 이들은 사실 다른 이들과 달리 불에 약하고, 수정을 소환하여 공격을 막는 이들은 창을 잡지 못하는 것으로 나타났습니다. 닿지 못하도록. + + +They say a ninja can catch a sword in her hands, but can she stop a spear? Ha, thought not! +닌자는 손에 검을 잡을 수 있다고 하지만, 창은 막을 수 있단 말인가? 하, 생각하지 못했다! +(Pg. 54 from Catherine Willows' journal): The post-collapse civilization sought immortality, but they knew that the technologies of the old civilization were a danger to them. So they turned to another school of thought: Magic. +(Catherine Willows의 일지에서 54페이지): 붕괴 후 문명은 불멸을 추구했지만, 그들은 구 문명의 기술이 그들에게 위험하다는 것을 알고 있었습니다. 그래서 그들은 다른 학파인 마법으로 눈을 돌렸습니다. +(Pg. 55 from Catherine Willows' journal): Silk wrappings, enchanted with ten-thousand microscopic runes per cubit, were suffucient to protect their bodies from ageing for millenia. What they didn't realize was that the magic didn't protect their souls. +(Catherine Willows의 일지에서 55페이지): 큐빗당 10,000개의 미세한 룬이 새겨진 실크 포장은 수천 년 동안 몸이 노화되는 것을 방지하기에 충분했습니다. 그들이 깨닫지 못한 것은 마법이 보호하지 못한다는 것입니다. 그들의 영혼. +(Pg. 56 from Catherine Willows' journal): They have no clue what they are doing anymore. To them, this is just another one of their ten-thousand dreams across the aeons. They can no longer tell reality from imagination. +(Catherine Willows의 일지 56페이지): 그들은 더 이상 자신이 무엇을 하고 있는지 전혀 모릅니다. 그들에게 이것은 영겁에 걸친 그들의 만 가지 꿈 중 하나에 불과합니다. 그들은 더 이상 상상과 현실을 구분할 수 없습니다. +Ninjas aren't so tough to fight when their hands are tied behind their back. Good thing I had my pet slime with me~ +닌자는 손이 등 뒤로 묶이면 그렇게 힘들지 않아. 애완용 슬라임이 있어서 다행이야~ +(Pg. 12 from Catherine Willows' addendum): After studying the ancient race of catlike people, I have come to the conclusion that their race met a dual fate. All of them received eternal life in some form or another. To one half it manifested as a blessing, allowing them to walk the halls. To the other it became a curse to them, trapping them in runic wrappings for all eternity. +(Catherine Willows의 부록에서 12페이지): 고양이 같은 고대 종족을 연구한 후, 나는 그들의 종족이 이중 운명을 만났다는 결론에 도달했습니다. 그들 모두는 어떤 형태로든 영생을 받았습니다. 그것은 축복으로 나타나 그들이 복도를 걸을 수 있게 했고, 다른 이들에게는 저주가 되어 그들을 영원히 룬문자에 가두었습니다. +(Pg. 13 from Catherine Willows' addendum): I must issue a correction to the statements written in my journal. The ancients knew what they were doing. Those that were cursed, are blessed, and those who were blessed, are cursed. +(Catherine Willows의 부록에서 13페이지): 내 일지에 적힌 진술을 정정해야 합니다. 고대인들은 자신이 무엇을 하고 있는지 알고 있었습니다. +(It's a copy of an ancient illustration, depicting a cat goddess, an elven goddess, and two groups of catgirls. One group is smiling and standing on pedestals. The other group is frowning and wearing armor meant for war. It looks unfinished, like the author was suddenly grabbed from behind while drawing it) +(고양이 여신, 엘프 여신, 두 그룹의 고양이 소녀를 묘사한 고대 일러스트레이션의 사본입니다. 한 그룹은 미소를 지으며 받침대에 서 있습니다. 다른 그룹은 눈살을 찌푸리고 전쟁용 갑옷을 입고 있습니다. 미완성으로 보입니다. 작가님이 그리다가 갑자기 뒤에서 잡아당긴듯) +(It's a interlinear translation of an ancient letter) Your highness, I have delivered to you the prisoners that you have asked. They are the worst of the worst--thieves, slanderers, sorcerers and seducers. But I must inquire, why is it that we must wrap them in silken scarves, worth twenty gold pieces each? Surely they are being handed over to be disciplined, not to be anointed? +(고대 문자의 행간 번역입니다.) 전하, 저는 당신이 요청한 죄수들을 당신에게 인도했습니다. 그들은 최악의 최악의 도둑, 중상, 마법사, 유혹자입니다. 그러나 나는 묻고 싶습니다. 왜 그것들을 각각 이십 금씩이나 하는 비단 스카프로 싸야 하겠느냐 그들이 기름부음을 받으려 하지 않고 징계하라고 넘겨지는 것이 아니냐 +(It's a record of an interview)|ME: Why are you like this?|MUMMY: Because we are blessed!|ME: Blessed? You've been wrapped up for thousands of years!|MUMMY: A thousand years is nothing compared to the glory that will come!|ME: Why do you have to be wrapped up? There are plenty of you who aren't...|MUMMY: The chosen ones will inherit the land when the goddess returns. +(인터뷰 기록입니다)|나: 왜 이러세요?|엄마: 우리는 축복받았으니까!|나: 축복받았어요? 당신은 수천년 동안 싸여 있었어요!|엄마:천년은 아무것도 아니에요 다가올 영광에 비하면!|ME: 왜 감싸야 합니까? 그렇지 않은 분들이 많이 계십니다...|MUMMY: 여신이 돌아올 때 선택받은 자들이 땅을 물려받게 될 것입니다. +(It's a record of an interview)|ME: Which goddess are you referring to? The goddess of restoration?|MUMMY: The blessed kitty.. she was promised to rule over the lesser goddesses.|ME: Lesser goddesses? Which ones?|MUMMY: YOUR goddesses. The ones you humans created that should not be. Ours is the true offspring of the creators, a goddess created to rule! +(인터뷰 기록입니다)|ME: 어느 여신 말씀이신가요? 회복의 여신?|MUMMY: 축복받은 고양이.. 하급 여신을 다스리기로 약속받았습니다.|ME: 하급 여신? 어느 분 ?|미라: 당신의 여신들. 당신들이 인간이 창조한, 있어서는 안 되는 존재들. 우리는 창조주의 진정한 자손, 통치하기 위해 창조된 여신입니다! +(It's a record of an interview)|ME: What of the elves? Don't they talk about a 'kingdom' too?|MUMMY: Who are the elves?|ME: You know, pointy ears, green hair, a heck of an attitude... they seem in tune with nature.|MUMMY: They sound arrogant.|ME: They are.|MUMMY: Perhaps they know nothing of the promise between our goddess and theirs. +(인터뷰 기록입니다)|ME: 엘프는요? '왕국'에 대해서도 얘기하지 않나요?|MUMMY: 엘프는 누구죠?|ME: 있잖아, 뾰족한 귀, 초록색 머리, 굉장한 태도...그들은 자연과 조화를 이루는 것 같습니다.|MUMMY: 거만하게 들리네요.|ME: 그렇습니다.|MUMMY: 아마도 그들은 우리 여신과 그들의 여신 사이의 약속에 대해 아무것도 모르는 것 같습니다. +(It's a medical record) Patient seems stable... application of the enchanted cloth seems to have stopped the bleeding. It appears that the ancient magic suppresses all forms of injury, even in humans, until it is taken off. +(의료기록입니다) 환자는 안정되어 있는 것 같습니다... 마법이 부여된 천을 바르면 출혈이 멈춘 것 같습니다. 고대의 마법은 모든 형태의 부상을 억제하는 것 같습니다. + + +### (A record of an ancient... transaction)||The elemental offered us the following from her personal estate:|-one magical lantern that requires no fuel, and can light up the night as if it were day|-one crystal that burns red-hot when kept near metal, providing heat to warm a house|-three enchanted swords imbued with flame|-a hollow glass crystal, used for communication||In exchange, we gave her three wolfgirls we had captured on the surface. + +### I had heard that ancient humans prayed to the stars here, in an effort to find favor when the Eight had forsaken them. So I went and prayed... and let me tell you, it was a lie, an absolute lie. There are only monsters out there. + +### (It is a set of instructions for creating a magic circle to unlock a sealed portal. There are markings in many languages that give conflicting descriptions, claiming that the circle will transmute material to gold, or bring good fortune...) + +### (Two schematic diagrams of ancient drones taken from records. The first is unmodified, and the second has several annotations written in what looks like pink lipstick...) + + + +Those damn slimes! They're so sticky and gross... fortunately, I washed myself in the fountain the last time I got caught by one. It came right off! +이 빌어먹을 슬라임들! 너무 끈적끈적하고 징그러워... 다행스럽게도 지난번에 덫에 걸렸을 때 분수대에서 몸을 씻었지. 바로 떨어졌어! +The dragonhearts were a group of dragonslayers, named for their ritual that imbues them with the fiery power and resistance of dragons they've slain. Now they work as mercenaries, and some of them serve a certain Leather goddess. +드래곤 하트는 드래곤 슬레이어 그룹이었으며, 그들이 죽인 드래곤의 불타는 힘과 저항력을 그들에게 부여하는 의식에서 이름을 따왔습니다. 이제 그들은 용병으로 일하고 있으며, 그들 중 일부는 특정 가죽 여신을 섬기고 있습니다. +### Yes! I've done it! I have created another red slime! I shall call him Fred, yes, Fred. After the red slime I lost in a shield-related accident a while back... |Poor Fred... I miss him. + +### (Pg. 70 from Catherine Willows' journal): The overgrown ruins are a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through? + +The unseen maid is the deadliest. +보이지 않는 메이드가 가장 치명적입니다. + + +(The note is blank) +(메모가 비어 있습니다) +The note reads: Mmmmmmmph! Mmmm! MMMMMPH!!!!-- (The entire note is just gagged mumblings...) +메모 내용: 으으으음! 으으으! 으으으음!!!!-- (메모 전체가 재갈을 물린 웅얼거림일 뿐...) +(The note is illegible) +(메모를 읽을 수 없음) +(The note contains a map of a previous floor) +(노트에는 이전 층의 지도가 포함되어 있습니다) +(The note is smeared with some kind of liquid) +(노트에 어떤 종류의 액체가 묻어 있습니다) +(The note contains a cryptic riddle that makes no sense) +(메모에는 말도 안 되는 비밀스러운 수수께끼가 포함되어 있습니다) +(The note contains a list of the writer's likes/dislikes and hard limits) +(노트에는 작가의 좋아요/싫어요 및 하드 제한 목록이 포함되어 있습니다) +The note reads: Please take this beautiful doll somewhere and play with her~ +메모 내용: 이 아름다운 인형을 어디론가 데려가서 놀아주세요~ +(The note contains a manual on fencing. You have always been a terrible fencer) +(노트에는 펜싱에 대한 설명서가 들어 있습니다. 당신은 항상 끔찍한 펜싱 선수였습니다) +(The note contains a magic spell you were taught never to cast under any circumstances) +(노트에는 어떤 상황에서도 절대 걸지 말라고 배운 마법 주문이 들어 있습니다) + + +The item requires 5 keys and free hands to remove +항목을 제거하려면 5개의 열쇠와 자유로운 손이 필요합니다. +The item is extremely secure with five separate keyholes. +이 항목은 5개의 개별 열쇠 구멍으로 매우 안전합니다. +You insert your 5 keys into the lock and the item finally comes off. +열쇠 5개를 자물쇠에 넣으면 드디어 물건이 벗겨집니다. + + +### [RNAME] + +### Magic-Draining: This item drains your mana quickly up to a limit, then slowly after. + +### Curse of Tickling: This item is tickling you without end! + +### Curse of Punishment: Inflicts psychic damage when you attack or cast a spell. + +### Curse of Illumination: Produces light and makes you easier to see. + +### Curse of Attraction: Women find you irresistable. + +### Curse of Animation: Causes loose restraints to animate and attack you! + +### Curse of Sensitivity: Makes it easier to lose control of yourself. + +### Curse of Distraction: Multiplies DP gain by 1.5x. + +### Curse of Exhaustion: -25% Stamina regen cap. + +### Curse of Futility: Multiplies WP gain by 0.5x. + +### Curse of Submission: Gain submissiveness when you lose control of yourself... + +### The curse is dormant, waiting for the time to strike... + +### Your RESTRAINTNAME glows pink as you feel your mind attacked by hypnotic forces! + +### The item is cursed! Several restraints appear on your body! + +### The item is cursed, but you are so trussed up you hear only sinister laughter... + +### The item is sealed with an icy lock. Perhaps you can melt it somehow? + +### The cursed seal flashes brightly as you struggle fruitlessly against it. + +### The item is sealed with a smoldering lock. Perhaps you just need to put out that fire... + +### The cursed seal glows faintly as you struggle fruitlessly against it. + +### The item contains technological markings. Perhaps applying some electricity will affect it? + +### The cursed seal gives off sparks as you struggle fruitlessly against it. + +### The item contains an alchemical seal. Perhaps Glue damage will overload it? + +### The item stretches as you tug on it, but snaps back to its original place. + +### The item is covered in markings of chains. Perhaps you need to take Chain damage? + +### The item squeezes you tighter as you try to take it off. + +### The item is protected by holy magic. There is nothing you can do to it. + +### You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? + +### This item bears the sigil of the Goddess of Restoration. Perhaps she can help? + +### The item is protected by a magical seal. There is nothing you can do to it. + +### This item bears the sigil of the Goddess of Conjuration. Perhaps she can help? + +### The item is protected by dark secrets. There is nothing you can do to it. + +### This item bears the sigil of the Goddess of Illusions. Perhaps she can help? + +### This item bears the sigil of the Goddess of Elements. Perhaps she can help? + +### The item is protected by an elemental seal. There is nothing you can do to it. + +### You hold the key to the item and it comes loose, draining the key's energy. + +### The item is incribed with mystical runes. Maybe you need a powerful key to unlock it. + +### The lock-shaped rune flashes as you realize struggling is pointless. + +### You overload the magical seal, causing it to vanish and release the item. + +### The item is magically sealed, requiring 200 mana to unlock it (includes mana from mana pool). + +### You tug on the item, but the magic can't be broken with anything other than brute force. + + + + + +The item is sealed with a locking spell! You will need a key to dispel the magic. +아이템은 잠금 마법으로 봉인되어 있습니다! 마법을 해제하려면 열쇠가 필요합니다. +You tug on the item but it is magically sealed to your body! +아이템을 잡아당기면 마법처럼 몸에 봉인됩니다! +You insert your magic key into the lock and the item finally comes off! +자물쇠에 마법의 열쇠를 넣으면 드디어 물건이 벗겨집니다! + + +The item is protected by a seal of Determination. You must have maximum willpower to remove it. +이 항목은 결의의 인장으로 보호됩니다. 제거하려면 최대한의 의지가 있어야 합니다. +You are unable to muster the willpower to bypass the seal... +당신은 봉인을 우회할 의지력을 소집할 수 없습니다... +Feeling determined, you override the seal and release the item! +결심한 마음으로 봉인을 해제하고 아이템을 해제하십시오! + + +The lock is protected by a revenant seal. You'll need 25 ectoplasm to disenchant it. +그 자물쇠는 원령 봉인으로 보호되어 있습니다. 마력을 추출하려면 25개의 엑토플라즘이 필요합니다. +Your fingers pass right through the collar. Pity your neck doesn't pass through it. +당신의 손가락은 목걸이를 통과합니다. 목이 통과하지 않는 것이 유감입니다. +You channel ghastly energy into the lock and break the seal!!! +당신은 무시무시한 에너지를 자물쇠에 쏟아부어 봉인을 부수고 있습니다!!! + + +### It would take many lifetimes to crack the code. You'll have to find another way to break the program... + +### You tug against the straps to no avail. + +### One of your Doll IDs seems to have had corrupted data on it, causing the program to crash and unlock. + +The item seems to drain divine energy from shrines. Maybe that has something to do with it. +신사에서 신성한 기운을 빨아들이는 아이템인 것 같습니다. 그것과 관련이 있는 것 같습니다. +The collar is enchanted with multiple layers of magical seals. +목걸이는 여러 겹의 마법 봉인으로 매혹되어 있습니다. +The collar has absorbed enough energy and pops off! +목걸이가 충분한 에너지를 흡수하고 튀어나옵니다! + + +That item cant be used. +그 아이템은 사용할 수 없습니다. +You're not sure how to use this key. +이 키를 사용하는 방법을 잘 모르겠습니다. +As soon as you touch the key, all of your gold locks fade to blue! +열쇠를 만지는 순간 모든 금색 자물쇠가 파랗게 변합니다! + + +You realize there is no keyhole on the device, simply a lock-shaped sigil. +당신은 장치에 열쇠 구멍이 없고 단지 자물쇠 모양의 인장이 있다는 것을 알고 있습니다. +The item loosens and falls off, but you see a red sigil flash and the key suddenly teleports away! +아이템이 헐거워져 떨어지지만 빨간색 인장이 번쩍이고 열쇠가 갑자기 순간이동합니다! +You have in your possession KeyAmount magical, ornate key(s). You might as well try... +당신은 KeyAmount 마법의 화려한 열쇠를 소유하고 있습니다. 시도하는 것이 좋습니다... +You have KeyAmount key(s) for this item. +이 항목에 대한 KeyAmount 키가 있습니다. + + +The angel helps you struggle and use items +천사는 당신이 고군분투하고 아이템을 사용하도록 도와줍니다 +The ghost helps you struggle and use items +고스트는 당신이 투쟁하고 아이템을 사용하도록 도와줍니다 +The ghost is unhelpful +유령은 도움이 되지 않는다 + + +Angel: Greetings! +천사: 안녕! +Angel: Perhaps I can assist with those! +천사: 아마도 내가 그들을 도울 수 있을 것입니다! + + +Adventurer's Ghost: Well met, traveler! +모험가의 유령: 반갑습니다, 여행자님! +Adventurer's Ghost: Hello again, traveler (giggles). +모험가의 유령: 안녕하세요, 여행자님(웃음). +Adventurer's Ghost: Having fun, girl? +모험가의 유령: 재미 있니, 아가씨? +Adventurer's Ghost: Looking for some trouble, slave? +모험가의 유령: 문제가 생겼나, 노예? +Adventurer's Ghost: I see you, naughty little slave! +모험가의 유령: 당신이 보입니다, 장난꾸러기 꼬마 노예! + + +Ghost: I can try to help with those, traveler. +고스트: 내가 도와줄 수 있어, 여행자. +Ghost: Aww, you look like you're having fun... +고스트: 어우, 너 재미있어 보이는데... + + +Ghost: You look great in those, hehe~ +고스트: 그거 잘 어울려요 헤헤~ +Ghost: Please don't bother me. +고스트: 귀찮게 하지 마세요. +Ghost: A good slave doesn't complain. +고스트: 좋은 노예는 불평하지 않는다. + + +Ghost: What's that? I don't understand. +고스트: 그게 뭐야? 이해가 안 돼. +Ghost: Silence is golden. +고스트: 침묵은 금이다. +Ghost: A good slave doesn't speak until addressed. +고스트: 좋은 노예는 말을 하기 전에는 말을 하지 않는다. +Ghost: Aww, so helpless~ +유령: 아, 너무 무기력해~ +Ghost: Trussed up like a good girl~ +유령:착한 여자처럼 묶여~ +Ghost: You're going to stay that way for a good while. +유령: 당분간은 그렇게 지내야지. +Ghost: I love watching you hop around, it's funny! +유령: 나는 네가 뛰어다니는 걸 보는 게 좋아, 재미있어! +Ghost: Just sit there like a good girl~ +고스트: 그냥 착하게 앉아~ +Ghost: I want to see you kneel~ +고스트: 무릎 꿇는거 보고싶어~ +Ghost: Aww, feeling frustrated? +유령: 아, 답답해? +Ghost: Looks like someone's been naughty~ +고스트: 누가 장난을 쳤나 보네~ +Ghost: How's it feel to be under lock and key? +고스트: 자물쇠와 열쇠 아래 있는 기분이 어때? + + +You step on a pressure plate and a number of skeletons rise up! +압력판을 밟으면 수많은 스켈레톤들이 일어선다! +You are ambushed by bandits! +도적에게 매복당하고 있습니다! +Armed skeletons appear from passages in the walls! +벽의 통로에서 무장한 스켈레톤이 나타난다! +### An armed skeleton drops down from the ceiling! + +A wall panel falls down, and an armored skeleton appears! +벽 패널이 무너지고, 갑옷을 입은 스켈레톤이 나타난다! +### You feel a chill down your spine... + +### You feel a constricting presence... + +### You feel a titillating presence... + +You are ambushed by ninjas! +닌자에게 매복당했습니다! +A large, wriggling mess of ropes fall from the ceiling! +커다랗고 꿈틀거리는 밧줄 덩어리가 천장에서 떨어집니다! +### A rune of growth causes several plants to quickly sprout nearby. + +You are ambushed by dragonhearts! +당신은 드래곤하트에게 매복당하고 있습니다! +### A pack of drones descends from the ceiling! + +### You hear sirens as a group of robots closes in! + +### You stumble upon a group of mages wanting to play dress-up! + +### You step on an open book, only to find a furious librarian staring you down! + +You are ambushed by wolfgirls! +당신은 늑대소녀에게 매복당하고 있습니다! +You are ambushed by an alkahestor! +당신은 alkahestor에 의해 습격당했습니다! +Small blobs of slime fall from the ceiling! +작은 점액 덩어리가 천장에서 떨어집니다! +You are ambushed by slime researchers! +당신은 슬라임 연구자들에게 습격당했습니다! +A large blob of slime falls from the ceiling! +큰 점액 덩어리가 천장에서 떨어집니다! +In a puff of smoke, a group of fire elementals appear around you! +연기 한가운데 불의 정령 무리가 주변에 나타납니다! +In a flash of fog a group of ice elementals appear around you! +안개 속에서 얼음 정령 무리가 주변에 나타납니다! +In a burst of mist, a group of water elementals appear around you! +폭발하는 안개 속에서 물의 정령 무리가 주변에 나타납니다! +A group of earth elementals rise out of the ground! +대지의 정령 무리가 땅에서 솟아오른다! +### You hear pouring liquid and a group of rubber elementals come out of the walls! + +In a flash of light, a group of air elementals appear around you! +섬광 속에서 바람의 정령 무리가 주변에 나타납니다! +Several ethereal hands appear all around you! +여러 천상의 손이 당신 주위에 나타납니다! +You have stumbled upon a conjurer's study! +당신은 마술사의 연구를 우연히 발견했습니다! +You are ambushed by a group of maids! +당신은 한 무리의 메이드들에게 매복당했습니다! +The Head Maid corners you! +메이드장이 당신을 모퉁이로 돌립니다! +A vine crawls from the ground, already wrapping around your feet! +덩굴이 땅에서 기어나와 이미 당신의 발을 감싸고 있습니다! + + +### You find a magic orb, containing a Spell Point. However, a Goddess owns this artifact.. + +### You find a magic orb, containing the SHCL spell 'SPLNME' and angering a goddess. + +### You find a magic orb, containing a random spell and angering a goddess. + +### Should you break it, she will send her minions after you. Which Goddess will you anger? + +An altar stands before you, bestowing a heavenly contract. +천상의 계약을 맺는 제단이 당신 앞에 서 있습니다. +Do you choose to accept its terms? +조건을 수락하시겠습니까? + + +Are you sure? This choice is final. +확실합니까? 이 선택은 최종 결정입니다. + + +Yes, I will accept. +네, 받아들이겠습니다. +(Accept the contract) +(계약 수락) +I'll think about it. +나는 그것에 대해 생각합니다. + + +You are frozen! +당신은 얼었다! +You are chilled! +당신은 차갑다! +Shadowy tendrils wrap around your feet, rooting you in place!!! +그늘진 덩굴손이 당신의 발을 감싸고 당신을 제자리에 고정시킵니다!!! + + +You get the feeling that someone is searching for you... +누군가가 당신을 찾고 있다는 느낌이 듭니다 ... +You hear movements all around as you realize you are surrounded!!! +당신은 당신이 둘러싸여 있다는 것을 깨달을 때 주변의 움직임을 듣습니다!!! + + +There is another restraint underneath! +아래에 또 다른 구속이 있습니다! + + +Your restraints rub you in sensitive places as you move... +움직일 때 구속이 민감한 부분을 문지릅니다... + + +Indifferent +무관심한 +Angered +분노 +Enraged +성나게 하는 +Thankful +감사합니다 +Pleased +기쁜 + + +Neutral +중립적 +Annoyed +짜증이 난 +Hostile +적의 +Friendly +친숙한 +Allied +결연한 +Favorable +유리한 + + +You run up against the TETHER pulling you back. +당신은 당신을 뒤로 당기는 TETHER에 맞서 달려갑니다. +You are yanked back by the TETHER! +당신은 TETHER에 의해 뒤로 당겨졌습니다! +We will be going for a walk. Follow me. +산책하러 갈 거에요. 따라와요. +Don't get comfortable. Im taking you to a new cell. Follow me. +편안해하지 마세요. 새 감방으로 데려가겠습니다. 따라오세요. +We're going to have some fun. Follow me. +재미있게 놀자. 따라와. +I told you to follow me! +따라오라고 했잖아! +I said, FOLLOW ME! +나를 따라와! +I won't repeat myself +반복하지 않겠다 +Then let's put you back in your cell! +그럼 당신을 감방으로 돌려보내자! + + +I hope you learned your lesson. Now get your butt out of here. +나는 당신이 당신의 교훈을 배웠기를 바랍니다. 이제 여기서 당신의 엉덩이를 꺼내십시오. +You've been a good girl. I hope you don't make the same mistake again. You can leave. +당신은 좋은 여자였습니다. 다시는 같은 실수를 반복하지 않기를 바랍니다. 당신은 떠날 수 있습니다. +That's a good girl. Now behave yourself, okay? You're free to go. +착한 여자야. 이제 예의 바르게 행동해, 알았지? 넌 가도 돼. +Looks like you got yourself in a bind! (she pats your butt playfully) Go make the others happy! +곤란한 것 같군요! (장난스럽게 엉덩이를 두드리며) 가서 다른 사람들을 행복하게 해주세요! + + +Good girl. +착한 여자 아이. +You'll be making others happy in no time. +당신은 곧 다른 사람들을 행복하게 만들 것입니다. +You're shaping up to be a good slave. +당신은 좋은 노예가 되기 위해 준비하고 있습니다. +I wish I could take you to my room... +내 방으로 데려다 줄 수 있으면 좋겠어... +It seems your training is going well. +훈련은 잘 되고 있는 것 같군요. +Perhaps you are enjoying this, hehe. +이걸 즐기고 있을지도 몰라, 헤헤. + + +### You've been very good this walk. Here is your reward. + +### The EnemyName gives you a ItemName + +The EnemyName starts adding a RestraintName! +EnemyName이 RestraintName을 추가하기 시작합니다! +You're missing part of your uniform. +제복의 일부가 없어졌습니다. +The EnemyName starts to remove your RestraintName! +EnemyName이 RestraintName을 제거하기 시작합니다! +The EnemyName starts to lock your RestraintName! +EnemyName이 RestraintName을 잠그기 시작합니다! +The EnemyName locks your RestraintName with a LockType! +EnemyName은 LockType으로 RestraintName을 잠급니다! +I am going to change your restraints. Hold still! +제가 당신의 구속을 바꾸겠습니다. 가만히 계십시오! +### Just need to add a little security~ + +Got yourself in trouble, eh? +곤경에 처했어, 응? +Looks like you're shaping up to be a good girl~ +착한 여자로 변신하고 있는 것 같네~ +Oh! Looks like I've made a mistake... +아! 내가 실수한 것 같은데... +404 prisoner not found. Releasing tether. +404 죄수를 찾을 수 없습니다. 밧줄을 풀고 있습니다. + + +### A EnemyName approaches you in your cell. + +A EnemyName appears to check on you. +EnemyName이 당신을 확인하기 위해 나타납니다. +The EnemyName leaves and locks the cell behind her. +EnemyName은 그녀 뒤에 감방을 떠나 잠급니다. + + +Layered underneath: +아래에 레이어드: +### Layered with: + +Increased strictness due to: +다음으로 인해 엄격함 증가: + + +Mana +어디에 +Bondage +속박 +Ask for Aid +도움을 청하다 +Become a Champion +챔피언이 되십시오 +Ask +묻다 +Ask for Rescue +구조 요청 +Offer Penance +속죄를 제안하다 +Current Champion +현재 챔피언 +Switch Champion +스위치 챔피언 + + +Become the champion of this goddess. Capturing bound enemies will grant +1 rep. +이 여신의 챔피언이 되십시오. 묶인 적을 포획하면 담당자가 +1됩니다. +You are now the champion of the Goddess of GODDESS. +당신은 이제 여신 여신의 챔피언입니다. + + +For 3 rep the goddess will grant you slipperiness, boosting your struggling. +3렙 동안 여신이 당신에게 미끄러움을 부여하여 당신의 고군분투를 강화할 것입니다. +For 3 rep the goddess will grant you a key. +3렙이면 여신이 당신에게 열쇠를 줄 것입니다. +### For 3 rep the goddess will grant you + +For 3 rep the goddess +3렙 여신님 +For 3 rep the goddess +3렙 여신님 + + +The goddess will fully restore your mana in exchange for AMOUNT rep +여신은 AMOUNT 담당자와 교환하여 마나를 완전히 회복시켜 줄 것입니다. +The goddess will enjoy seeing you struggle in her bonds (raises submissiveness) +여신은 당신이 그녀의 속박에서 고군분투하는 것을 보고 기뻐할 것입니다(복종을 높임) + + +The Goddess may decide to send an angel to help you struggle, in exchange for 10 rep +여신은 10렙의 대가로 당신의 투쟁을 돕기 위해 천사를 보내기로 결정할 수 있습니다. + + +The Goddess will expect you to pay AMOUNT gold for +5 rep +여신은 당신이 +5 담당자에 대해 AMOUNT 골드를 지불하기를 기대할 것입니다. + + +The Goddess hears your plea! +여신께서 당신의 간청을 들으십니다! +The Goddess hears your plea but has decided not to care. +여신은 당신의 간청을 듣지만 상관하지 않기로 결정했습니다. +The Goddess fills your mind with heavenly images as she channels energy through your veins. +여신은 당신의 정맥을 통해 에너지를 전달하면서 하늘의 이미지로 당신의 마음을 채웁니다. + + +Time stops as an angel of heaven appears to collect your payment. +하늘의 천사가 당신의 지불금을 받기 위해 나타나자 시간이 멈춥니다. + + +You shudder and tremble as a wave of pleasure washes over you! +쾌락의 물결이 당신을 덮칠 때 당신은 몸서리를 칩니다! +You lose control of yourself as you convulse in pleasurable bliss! +즐거운 행복에 경련을 일으키면 자제력을 잃게 됩니다! +You let out a moan as you feel the ecstasy of pleasure! +쾌락의 황홀함을 느끼며 신음소리를 내는구나! +You finally let out a deep breath as you get what you've waited for! +드디어 심호흡을 하고 기다리던 것을 얻었구나! +Your whole body thrashes about as you experience long-awaited pleasure! +오래 기다려온 쾌감에 온 몸이 두근두근! +Your release comes with a bang as your body rocks back and forth! +당신의 몸이 앞뒤로 흔들릴 때 당신의 해방은 강타와 함께 온다! +You wiggle your hips in ecstasy as you experience pure bliss! +순수한 행복을 경험하면서 황홀경에 빠져 엉덩이를 흔듭니다! +You are left gasping for air as you receive your long-awaited orgasm! +오랫동안 기다려온 오르가슴을 느끼며 숨이 막힐 지경입니다! +You finally are left rocking your body wildly in sheer pleasure! +마침내 당신은 순전한 쾌락 속에서 당신의 몸을 격렬하게 흔들게 되었습니다! +A powerful wave of pleasure comes over you as you convulse in ecstasy. +황홀경에 경련을 일으키면 강력한 쾌락의 물결이 밀려옵니다. +Your breathing intensifies as you lose control of yourself! +자제력을 잃으면 호흡이 가빠집니다! + + +You close your eyes and breath rapidly in anticipation... +당신은 눈을 감고 기대하며 빠르게 숨을 들이쉽니다... +You tilt your head back and moan as your heart beats faster... +고개를 뒤로 젖히고 심장 박동이 빨라지면서 신음소리를 낸다... +You groan with pleasure as you approach the edge... +가장자리에 다다르자 쾌감에 신음한다... +You whimper as you rub your legs together furiously... +당신은 격렬하게 다리를 비비면서 흐느끼는군요... +You feel frustrated as the stimulation isn't quite enough... +자극이 부족해서 답답하시네요... +Your whole body shakes, but you don't quite go over the edge... +온몸이 떨리지만, 끝까지 가지 않는다... +This is starting to feel like torture... +이것은 고문처럼 느껴지기 시작했습니다... +You let out a frustrated scream as the torment continues... +고통이 계속되는 가운데 당신은 답답한 비명을 질렀습니다... +You simmer just under the edge, heart racing, breathing quickly... +당신은 가장자리 바로 아래에서 끓고, 심장이 뛰고, 빠르게 호흡합니다... +You let out an anguished moan as release dances just out of reach... +발표가 손이 닿지 않는 곳에서 춤을 추자 당신은 괴로운 신음을 내뱉었습니다... +You squirm helplessly as your futile struggles simply arouse you more... +당신의 쓸데없는 몸부림이 당신을 더 자극하기 때문에 당신은 속수무책으로 꿈틀거립니다... + + +The vibration suddenly weakens. +진동이 갑자기 약해집니다. +Your toys cease vibrating abruptly. +장난감이 갑자기 진동을 멈춥니다. +The vibrators cut off suddenly, leaving you wanting. +바이브레이터가 갑자기 끊어져서 원하는 대로 남습니다. +The toys turn off at the last moment, cutting you off. +마지막 순간에 장난감이 꺼지고 당신을 차단합니다. +The toys leave you without pleasure as they turn off. +장난감이 꺼지면 즐거움이 없어집니다. +You are left feeling empty as the toys stop vibrating. +장난감이 진동을 멈추면 공허함을 느끼게 됩니다. +You stomp your foot on the ground in frustration as the vibration ceases. +진동이 멈추자 좌절감에 발을 구르며 땅을 밟습니다. +The toys leave you in agony as they cease vibrating. +장난감이 진동을 멈추면서 고통에 빠집니다. +The toys torture you by stopping at the last moment. +장난감은 마지막 순간에 멈추어 당신을 고문합니다. +The toys stop just before you lose yourself. +장난감은 정신을 잃기 직전에 멈춘다. +The toys deny you a chance to finish. +장난감은 당신이 끝낼 기회를 거부합니다. + + +You try to pleasure yourself, but your chastity belt prevents you! +당신은 자신을 즐겁게 하려고 하지만 당신의 정조대가 당신을 방해합니다! +You play with yourself... +혼자서 놀아요... +You let your hands wander for a moment... +잠시 손을 방황하게 놔두세요... +You squirm your hips and whimper in your bindings... +엉덩이를 꿈틀대고 묶인 채 흐느끼는군... +Your instincts are getting the better of you... +당신의 본능은 점점 더 좋아지고 있습니다... +Your body shudders briefly from pleasure... +쾌감에 잠시 몸이 떨린다... +You are unable to control yourself. +당신은 자신을 통제할 수 없습니다. +You play with yourself using the magic wand... +요술 지팡이로 자기 자신을 가지고 노는구나... +You would never do such a thing. +당신은 절대 그런 짓을 하지 않을 것입니다. +You try to rub your erogenous zones by squirming your legs... +다리를 꿈틀대며 성감대를 문지르려고 하다니... +Your will is draining as you crave release, but can't quite get there without help... +당신이 해방을 갈망하면서 당신의 의지는 고갈되고 있지만, 도움 없이는 거기에 도달할 수 없습니다... +Your will is draining as your heart beats faster and your body trembles... +심장 박동이 빨라지고 몸이 떨리면서 의지가 고갈되고 있습니다... +Your will is draining as you simmer just under the edge... +가장자리 바로 아래에서 끓이는 동안 의지가 고갈되고 있습니다... +Your will is draining as you crave release, and the toys continue to vibrate... +당신이 해방을 갈망함에 따라 당신의 의지는 고갈되고, 장난감들은 계속 진동합니다... +Your will is draining as the toys continue buzzing... +장난감이 계속 윙윙거리는 동안 당신의 의지는 고갈되고 있습니다... +Your will is draining as you are tormented by vibrations... +진동에 시달리면서 의지가 고갈되고 있습니다... + + +A buzzing vibration wakes you up! +윙윙거리는 진동이 당신을 깨웁니다! + + +Your RestraintName constricts, warning you not to misbehave! +당신의 RestraintName이 오작동하지 않도록 경고하면서 수축합니다! +Your RestraintName tightens painfully to punish your misbehavior! +당신의 RestraintName은 당신의 잘못된 행동을 처벌하기 위해 고통스럽게 조입니다! +Your RestraintName punishes you for your behavior! +귀하의 RestraintName은 귀하의 행동에 대해 귀하를 처벌합니다! +Your RestraintName punishes you and warns you with a harsh beep! +귀하의 RestraintName이 귀하를 처벌하고 거친 신호음으로 경고합니다! +Your RestraintName emits a red flash, causing you to feel faint! +RestraintName이(가) 빨간색 섬광을 발산하여 기절하게 만듭니다! +Your armor makes noise as you move around! +네 갑옷은 움직일 때마다 소리를 낸다! +Your RestraintName lets out an alert! +RestraintName이 경고를 보냅니다! + + +### Your RestraintName stimulates you to hinder your efforts! + +### Your RestraintName stimulates you and beeps loudly! + +A golden lock fades into a blue lock on one of your restraints! +금색 자물쇠가 구속 중 하나의 파란색 자물쇠로 사라집니다! +### Your command word is heard and the magic lock(s) click and fall off! + +Your command word is heard and the charger unlocks! +당신의 명령이 들리고 충전기가 잠금 해제됩니다! + + +Are you sure you want to attack? +공격하시겠습니까? +Are you sure you want to go to the next level? (Click self to confirm) +다음 단계로 이동하시겠습니까? (확인하려면 자체 클릭) + + +You shudder as you apply the RestraintName to yourself... +RestraintName을 자신에게 적용하면서 몸서리칩니다... +You insert the RestraintName and close your belt's shield over it, with a click as it locks in place. +RestraintName을 삽입하고 벨트의 실드를 그 위에 닫습니다. 딸깍 소리가 나면서 제자리에 고정됩니다. +You attack the RestraintName and close your bra's shield over it, with a click as it locks in place. +당신은 RestraintName을 공격하고 그 위에 브래지어의 방패를 닫습니다. 딸깍 소리가 나면서 제자리에 고정됩니다. +You slowly put on the RestraintName, amazed at how it seems to mold to your size... +당신은 천천히 RestraintName을 착용하고 그것이 당신의 크기에 어떻게 맞춰지는지에 놀랐습니다... + + + + +You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! +당신은 헛되이 발버둥치고 있습니다. 열쇠 구멍도 없고 재료도 거의 깨지지 않습니다! + + +Ancient Chastity Belt +고대 순결 벨트 +You find a chastity belt, glowing magnificently, along with a strange crystal next to it. +당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 정조대를 발견했습니다. +A chastity belt of sleek, ancient design. While powered, it gives -30% miscast chance due to distraction and slowly regenerates stamina. +매끄럽고 고대 디자인의 정조대입니다. 전원이 공급되는 동안 산만함으로 인한 오시전 확률이 -30% 감소하고 스태미나가 천천히 회복됩니다. +'Belt of the devoted' +'헌신자의 허리띠' +You tug at your chastity belt, but you can't even stick a finger inside because it's so tight... +정조대를 잡아당기는데 너무 꽉 조여서 손가락 하나도 못 집어넣고... + + +Ancient Chastity Bra +고대 순결 브래지어 +You find a chastity bra, glowing magnificently, along with a strange crystal next to it. +당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 순결 브래지어를 발견했습니다. +### A chastity bra of sleek, ancient design. While powered, it reduces incoming damage from attacks by 20. + +'Shield of the chaste' +순결의 방패 +You rub your hands along your breasts but feel only hard, unbreakable metal. +가슴을 따라 손을 문지르지만 단단하고 깨지지 않는 금속만 느껴집니다. + + +Ancient Heels +고대 발뒤꿈치 +You find a set of glowing heels, glowing magnificently, along with a strange crystal next to it. +당신은 그 옆에 있는 이상한 수정과 함께 화려하게 빛나는 빛나는 발뒤꿈치 세트를 발견했습니다. +A pair of towering heels, enchanted with combat magic. When powered, they reduce slow level by 1, and deal 25 shadow damage on-hit with brief slow. +전투 마법이 부여된 우뚝 솟은 발뒤꿈치입니다. 전원이 공급되면 둔화 수준이 1 감소하고 적중 시 짧은 둔화와 함께 25의 암흑 피해를 입힙니다. +'Shoes of the graceful' +'우아한 신발' +You can barely stand in these heels. They are rigid, metallic, and unbreakable, yet padded on the inside. +이 발뒤꿈치는 ​​겨우 설 수 있습니다. 단단하고 금속성이며 깨지지 않지만 안쪽은 패딩 처리되어 있습니다. + + +Ancient Blindfold +고대 눈가리개 +### You find a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. + +A full-blackout mask. When powered, it negates accuracy penalties due to vision, boosts accuracy by +100%, and boosts melee damage by +10. +완전 암막 마스크입니다. 전원을 켜면 시야로 인한 정확도 페널티가 무효화되고 정확도가 +100% 증가하며 근접 피해가 +10 증가합니다. +'Mask of the Warrior' +'전사의 가면' +You tug at the mask but it won't come off. It's molded so close to your face that no light shines through! +마스크를 잡아당겨도 벗겨지지 않습니다. 마스크가 얼굴에 너무 밀착되어 빛이 비치지 않습니다! + + +Ancient Muzzle +고대 총구 +You find a muzzle with a long rubbery plug on the inside, glowing magnificently, along with a strange crystal next to it. +당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 긴 고무 마개가 있는 총구를 발견했습니다. +A muzzle that seals over the face tightly. When powered, it regenerates mana, boosts sneak, and multiplies damage dealt to unaware enemies by 2.5x. +얼굴을 단단히 봉인하는 총구. 전원을 공급하면 마나를 회복하고 은신을 강화하며, 알지 못하는 적에게 주는 피해가 2.5배 증가합니다. +'Muzzle of the Saboteur' +'사보추어의 총구' +You claw at your face, but not only does the soft plug fill your mouth completely, the muzzle itself is nigh-unbreakable! +당신은 당신의 얼굴을 발톱으로 할퀴지만, 부드러운 마개는 당신의 입을 완전히 채울 뿐만 아니라, 주둥이 자체는 거의 부서지지 않습니다! + + +Ancient Gag +고대 개그 +You find a ball gag harness with a long rubbery plug instead of a ball, glowing magnificently, along with a strange crystal next to it. +공 대신 긴 고무 플러그가 달린 볼 개그 하네스를 발견하고 그 옆에 이상한 수정과 함께 화려하게 빛납니다. +A gag that fills the mouth. When powered, regens mana, reduces miscast by 30%, and boosts damage to enemies that are stunned, frozen, bound, or slowed by 30%. +입을 가득 채우는 재갈. 전원이 공급되면 마나를 재생하고, 잘못된 캐스팅을 30% 줄이고, 기절, 동결, 속박 또는 둔화 상태인 적에게 주는 피해를 30% 증가시킵니다. +'Gag of the Focused' +'집중의 개그' +You tug on the straps at your cheeks, but the straps are so tight the plug doesn't even move! +볼에 끈을 잡아당겼는데 끈이 너무 빡빡해서 플러그가 움직이지도 않습니다! + + +Ancient Rear Plug +에인션트 리어 플러그 +You find a huge, flexible, segmented plug, along with a strange crystal next to it. +당신은 그 옆에 이상한 수정과 함께 거대하고 유연하며 조각난 플러그를 발견했습니다. +A plug that shocks the wearer when someone disciplines them, after orgasm, and mildly when spellcasting. When powered, reduces miscast chance by 30%. +누군가가 착용자를 징계할 때, 오르가즘 후, 주문 시전 시 가벼운 충격을 주는 플러그입니다. 전원이 공급되면 잘못 시전할 확률이 30% 감소합니다. +'Plug of the Obedient' +'순종의 플러그' +You realize the magical plug has expanded inside your body. It won't come out. +당신은 마법의 플러그가 당신의 몸 안에서 팽창했다는 것을 깨달았습니다. 그것은 나오지 않을 것입니다. + + +Ancient Plug +고대 플러그 +You find a huge, ribbed plug, along with a strange crystal next to it. +당신은 그 옆에 이상한 수정과 함께 거대하고 늑골이 있는 마개를 발견했습니다. +A plug that denies the wearer constantly and only rarely grants release. When powered, it grants +70% magic resistance (about 40% reduction). +착용자를 지속적으로 거부하고 드물게 해제하는 플러그입니다. 전원을 공급하면 +70%의 마법 저항력을 부여합니다(약 40% 감소). +'Plug of the Perseverant' +'인내의 플러그' + + +Ancient Stimulator +고대 자극기 +You find a flat, round device with a hole on one side, along with a strange crystal next to it. +당신은 한쪽에 구멍이 있고 그 옆에 이상한 수정이 있는 평평하고 둥근 장치를 발견했습니다. +A device that teases the wearer for casting spells and attacking. When powered, it reduces mana and stamina costs for casting spells and attacking. +주문 시전과 공격에 대해 착용자를 놀리는 장치입니다. 전원이 공급되면 주문 시전과 공격에 필요한 마나와 스태미나 비용이 감소합니다. +'The Persuader' +'설득'' +You realize the magical device has attached to your body using suction. It won't come off! +당신은 마법 장치가 흡입을 통해 당신의 몸에 붙어 있다는 것을 깨달았습니다. 그것은 떨어지지 않을 것입니다! + + +Ancient Mittens +고대 장갑 +You find a pair of shining gloves, glowing magnificently, along with a strange crystal next to it. +당신은 그 옆에 이상한 수정과 함께 찬란하게 빛나는 빛나는 장갑 한 켤레를 발견했습니다. +Tight mittens that force the hands into fists. When powered, they increase all magic damage to enemies by 40%. +손을 주먹으로 꽉 쥐는 꽉 끼는 벙어리장갑. 전원이 공급되면 적에게 주는 모든 마법 피해가 40% 증가합니다. +'Mittens of Blasting' +'발파 장갑' +You rub your mittens together, but they are unfazed by anything you do to them and your hands are clasped tight. +장갑을 서로 문지르지만, 장갑은 당신이 무엇을 하든 동요하지 않고 손을 꽉 쥐고 있습니다. + + +Ancient Armbinder +고대 암바인더 +You find a monoglove, glowing magnificently, along with a strange crystal next to it. +당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 모노글러브를 발견했습니다. +An extremely strict armbinder. When powered, reduces miscast chance by 30%, increases all magic damage to enemies by 40%, and increases spell range by 50%. +매우 엄격한 암바인더. 전원이 공급되면 미스캐스팅 확률이 30% 감소하고 적에게 주는 모든 마법 데미지가 40% 증가하며 주문 사거리가 50% 증가합니다. +'Armbinder of the Artillerist' +'포병의 암바더' +You try to wiggle your arms, but they can barely move in this position and are clasped tight. Your arms are sealed. +당신은 당신의 팔을 흔들려고 하지만, 그들은 이 자세에서 간신히 움직일 수 있고 꽉 움켜쥐고 있습니다. 당신의 팔은 봉인되어 있습니다. + + +Ancient Ankle Cuffs +고대 발목 수갑 +You find a pair of glowing cuffs, glowing magnificently, along with a strange crystal next to it. +당신은 그 옆에 이상한 수정과 함께 화려하게 빛나는 한 쌍의 빛나는 수갑을 발견했습니다. +### A pair of cuffs designed for summoners. Heals nearby allies by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power. + +'Anklets of the Faithful Friend' +'충실한 친구의 발찌' +You jingle the chains around and realize that these unbreakable restraints won't be coming off. +당신은 쇠사슬을 빙글빙글 돌리고 이 깨지지 않는 구속이 풀리지 않을 것임을 깨닫습니다. +...when powered down, they snap together, rendering the wearer immobile. +...전원이 꺼지면 서로 찰칵 소리를 내며 착용자를 움직이지 못하게 합니다. +'Anklets of the Unfaithful Friend' +'불성실한 친구의 발찌' + + + + +You search for your ancient keys but it seems they were taken away for good. +당신은 고대의 열쇠를 찾았지만 영원히 빼앗긴 것 같습니다. + + +### Random (-10% rep loss) + +You don't have any valid targets on your body for that. +신체에 유효한 목표가 없습니다. + + +The air swirls with traces of pleasing magic... +공기가 즐거운 마법의 흔적으로 소용돌이치고 있습니다... +The spores make you feel sleepy... +포자가 졸음이 온다... + + +### Physical Block: AMOUNT + +### Magic Block: AMOUNT + +DAMAGETYPE: MULTIPLIERx modifier +DAMAGETYPE: MULTIPLIERx 수정자 +### Physical Armor: AMOUNT + +### Magic Armor: AMOUNT + +### Evasion: AMOUNT% + +Deals DAMAGETYPE damage +DAMAGETYPE 피해를 입힙니다. +### AMNT% chance to hit you + +Can disarm (chance: DISARMCHANCE%) +무장 해제 가능(확률: DISARMCHANCE%) +Resistances: +저항: +### HP: + +### Shield: + +### Binding: + +Ambivalent +양가적 +Likes you +좋아해 +Loves you +당신을 사랑합니다 +Adores you +당신을 좋아합니다 +Dislikes you +너 싫어 +Hates you +당신을 싫어 +Despises you +너를 경멸한다 +Talking to you +당신 이야기 +Aware of you! +당신을 알고! +Pursuing you! +당신을 쫓는다! +### Ignoring you! + +### Investigating! + +### Suspicious + +Notices you! +당신을 알아차린다! +Unaware +알지 못하는 +Items carried: +운반된 품목: +### Items worn: + +...and NUMBER more +...그리고 NUMBER개 더 +### Takes damage if the caster is stunned + +Disappears if the caster is defeated +캐스터가 패배하면 사라집니다 +Caster: ENEMYNAME +캐스터: ENEMYNAME +### Demise imminent + +Vulnerable +취약 +Stunned +기절 +Snared +올가미 +### Silenced + +Disarmed +무장해제 +Blinded +맹인 +### Apprehended! + +Restrained! +억제! +Restricted! +제한된! +Fully Bound! +완전 결속! +Trussed up! +묶여! +### Tightly Secured! + +### Inescapably + +Belted +벨트 +Wearing a toy +장난감을 입고 +Vibed! +진동! +### Flying + +### Distracted! + +### Soap + +Acid +산 +### Holy + +### Arcane + +Poison +독 +### Poison Gas + +Charm +매력 +Tickle +간지럼 +Grope +더듬다 +Crush +으깨다 +Gravity +중력 +Pierce +내뚫다 +Slash +삭감 +Pain +통증 +### Spirit Draining + +### Mana Draining + +Electric +전기 같은 +### E-Stim + +### Shock + +### Plush + +### Blast + +Chain +사슬 +### Gas + +### Physical + +Spell +주문 +Unstoppable +거침없이 +Unflinching +움직이지 않는 + + +### +Focus + ++Stamina ++스태미나 ++Willpower ++의지력 +### +Magic + +### Discard (destroys it permanently!) + +### You crit the vulnerable EnemyName for AMOUNT extra damage! + +### You crit the unsuspecting EnemyName for AMOUNT extra damage! + +The enemy steals a pick from you! +적이 당신에게서 곡괭이를 훔칩니다! +The enemy takes away your knife! +적이 당신의 칼을 빼앗아갑니다! +The enemy steals a key from your body! +적이 당신의 몸에서 열쇠를 훔칩니다! +The enemy wrests away your magical knife! +적이 당신의 마법 칼을 빼앗아 갑니다! +The enemy takes away your precious magic key! +적이 당신의 소중한 마법의 열쇠를 빼앗아갑니다! +The enemy steals one ITEMSTOLEN from you! +적이 당신에게서 하나의 아이템을 훔칩니다! +You get your stolen items back. +훔친 물건을 되찾게 됩니다. +The EnemyName manages to retreat with your items! +EnemyName은(는) 아이템을 가지고 후퇴합니다! + + +The orb contains knowledge of SPELL. +구에는 SPELL에 대한 지식이 포함되어 있습니다. +You capture the EnemyName. +EnemyName을 캡처합니다. +You capture the EnemyName in the name of the goddess of GODDESS. +당신은 여신의 이름으로 EnemyName을 점령합니다. +You capture the EnemyName, but the goddess of GODDESS would prefer that you be in uniform (wear her restraint). +당신은 EnemyName을 점령하지만, 여신의 여신은 당신이 제복을 입는 것을 선호할 것입니다(제복을 입으십시오). +You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! +당신은 EnemyName을 사로잡았지만, 여신 여신은 당신에게 여러 구속을 요구합니다! +You capture the EnemyName, but the goddess of GODDESS would prefer that you wear some restraints. +당신은 EnemyName을 잡았지만, 여신의 여신은 당신이 구속을 받는 것을 선호할 것입니다. +You capture the EnemyName, but have reached the limit for rewards this floor. +당신은 EnemyName을 점령했지만, 이 층의 보상 한도에 도달했습니다. + + +The spirit inside the restraint is vengeful and emerges to wreak havoc on the world! +속박 속 정령이 복수심에 불타 세상을 뒤흔들기 위해 등장합니다! + + +You hide inside the container... +당신은 컨테이너 안에 숨어 ... +### You hide inside the chest... + +It's a crumpled piece of scrap metal with a sharp edge. +날카로운 모서리를 가진 구겨진 고철 조각입니다. +You use the scrap to try and cut the item. +스크랩을 사용하여 항목을 잘라 봅니다. +You rub the item against the broken object's sharp edges... +깨진 물체의 날카로운 모서리에 물건을 문지릅니다... +A hook hangs at shoulder height. +후크가 어깨 높이에 매달려 있습니다. +### The hook is too high up! You can't reach it... + +There's a hook on the wall. +벽에 고리가 있습니다. +The wall is cracked. +벽이 깨졌습니다. +You rub yourself on the corner... +당신은 구석에 몸을 문지르고 ... + + +Many ropes emerge around you, removing weaker ropes from your body and binding enemies! +당신 주위에 많은 밧줄이 나타나 당신의 몸에서 더 약한 밧줄을 제거하고 적을 묶습니다! + + +### Choose Class: + +### Distraction Mode: + +### Progression Mode: + +### Key Hunt + +### Random + +### Selected + +### You will need to find the key to proceed to the next floor. + +### Each floor will have a random task to unlock the stairs. + +### You will select your task for each floor before you enter. Requires Perk Progression. + +### Perks Mode: + +### Extra + +### Less + +### Much Less + +### No pain, no gain. + +### Gain 20 extra perk points, to give you a false sense of security. + +### Lose 20 perk points, just to keep things interesting. + +### Lose 50 perk points, making things very interesting. + + + +### Perk Progression Mode: + +### Disabled + +### Optional + +### Mandatory + +### Debuffs Only + +### No perks between floors. + +### The standard mode. You may choose between one of three perk altars between floors. + +### A twist on the standard mode. You must choose before progressing. + +### You must pick a debuff between floors before progressing. + + + +### Perk Shrine Bondage: + +### Never + +### Sometimes + +### Always + +### Perk shrines will not offer bondage as part of the deal. + +### Bondage will sometimes be offered alongside perks. + +### Perk shrines are always accompanied by bondage. + + + +### Perk Shrine Bondage Info: + +### Hidden + +### Partial + +### Full + +### You do not know if a perk shrine will apply bondage. + +### You know that a perk shrine will apply bondage, but not what kind. + +### You know the exact restraints a perk shrine will apply. + +### Difficulty: + +### Normal Mode + +### Hard Mode + +### Extreme Mode + +### A supposedly reasonable difficulty curve. + +### Play the game the way it was intended. Cruel and restrictive. + +### Play at your own peril. Unlocked by double-clicking the Hard Mode button. + +Aroused +흥분 +Removes all chastity belts, vibrating restraints, plugs, and removes the option to play with yourself. +모든 순결 벨트, 바이브 구속, 플러그를 제거하고 자위를 할 수 없게 됩니다. +Includes all that good stuff. +모든 좋은(?) 것들을 포함합니다. +### Allow Front Plugs + +Allow Rear Plugs +엉덩이 플러그 허용 +Allow Piercings +피어싱 허용 + + +### Start with 150 willpower and Iron Will, good at melee and blocking attacks. + +### Start with 150 stamina and Sneaky, good at stealth and evasive gameplay. + +### Start with 150 mana and Magical Sight, good at casting spells. + +### Start with nothing to your name. For those who want a challenge. + +### You are a mage, but haven't finished your formal 'training'. Requires Aroused mode. + +### Spell Choice: + +Choose Spells +주문 선택 +Random Spells +무작위 주문 +Break orbs. Get points. Buy spells. It's that simple. +오브를 깨고. 포인트를 받고. 주문을 사십시오. 이렇게나 간단합니다. +Break orbs and pray you get something good. +오브를 깨고 좋은 것을 나오기를 기도하세요. + + +### Save Mode: + +Save Codes +세이브 코드 +Roguelike +로그라이크 +Grants a save code every floor you can write down. Autosaves only on floor start. +기록할 수 있는 모든 층에 세이브 코드를 발급합니다. 층 시작 지점에서 자동 저장이 됩니다. +No save codes, forced autosaves. You are in it to win it. +세이브 코드 없음, 강제 자동 저장. 당신은 그것을 이겨낼 수 있습니다. + + +### Prison Strictness: + +### Easy + +### Strict + +### If you get captured, you might get rescued if you have good relations. + +### If you get captured, you will always get rescued and pay a fee. + +### If you get captured, you are totally on your own. + +Start Playing +시작 +Lock your settings in, nice and tight. +설정을 단단히 고정하세요. +### Start with some perks that increase strictness and immersion. + +Choose some perks to spice up your run. +진행에 활기를 불어넣을 몇 가지 특전을 선택하세요. + + +This game engages in safe and consensual analytics. +이 게임은 안전하고 합의된 분석에 관여합니다. +It sends data about spell choices, levels reached, etc, to help balance and improve the game. +게임의 균형을 잡고 개선하는 데 도움이 되도록 주문 선택, 도달한 레벨 등에 대한 데이터를 전송합니다. +No personal data is sent or stored. +개인 데이터는 전송되거나 저장되지 않습니다. +Accept +수락 +Don't Track Me +거절 +### Proceed + +Your key to the stairs is taken away! +계단 열쇠를 빼앗겼습니다! +You found a keyring to the stairs! Now you just need to get there. +계단의 열쇠고리를 찾았군요! 이제 거기까지만 가면 됩니다. + + +### Behold my SPL! + +### Mmmph... SPL... + +### Oh noes... + +### Ueeee! + +I don't want to be your slave! +당신의 노예가 되고 싶지 않아요! +Catch me if you can! +잡을 수 있으면 잡아 봐! +I've been naughty, looks like I need to be punished... +내가 장난을 쳤어, 벌을 받아야 할 것 같구나... +I've been a bad girl, won't you do something about it? +나는 나쁜 여자 였어, 그것에 대해 뭔가를하지 않을거야? +Mmmph... maybe I talk too much... +흐음... 말이 너무 많은 것 같은데... +Well well, what have we got here? +글쎄, 우리가 여기서 뭘 얻었지? +You're not here to take away my pets, are you? +당신은 내 애완동물을 데려가려고 여기 온 것이 아니죠? +You'd make a lovely pet... +당신은 사랑스러운 애완 동물을 만들 것입니다 ... +Daww, you're so cute when you're struggling! +다우, 당신이 고군분투하는 모습이 너무 귀여워요! +Let's take you back to your space~ +너의 공간으로 돌아가자~ +You need to be bound tight! +단단히 묶어야 해! +Cleaning up for me, huh? +나를 위해 청소해, 응? +Uh uh, give that back! +어어, 돌려줘! +### What do we have here? An intruder? Or a future pet? + +I see how it is. +나는 그것이 어떤지 봅니다. +I've taken on hundreds of adventurers like you. +나는 너 같은 모험가를 수백 명이나 상대했다. +You don't stand a chance. +넌 기회가 없어. +Your magic is nothing compared to mine! +네 마법은 나에 비하면 아무것도 아니야! +I've been a master wizard for over a thousand years! +나는 천년 넘게 마스터 마법사였습니다! +You call that a spell? +그것을 주문이라고 합니까? +My spells are far superior! +내 주문이 훨씬 뛰어나다! +She won't help you! +그녀는 당신을 돕지 않을 것입니다! +Not yours! +네 것이 아니야! +Oh, that's not going to help~ +아, 소용없어~ +Let's play a game! +게임하자! +Didn't think you would get away, did you? +당신이 도망칠 것이라고 생각하지 않았습니까? +Oh ho~ +오호~ +'Tis but a scratch! +'그냥 ​​흠집이야! +You'll be my pet soon~ +넌 곧 내 애완동물이 될거야~ +Cute~ +귀여워~ +Don't even try~ +시도하지마~ +It's over~ +끝났어~ +Get over here! +이리 와! +Not so slippery now! +지금은 그렇게 미끄럽지 않아! +I'll be taking that~ +내가 가져갈게~ +'Click!' +'딸깍!' +### In the name of PTRN, I order you to kneel! + +### You're in my way. + +### Step aside, pet. + +### Get her, my pets! + +### Hey! Don't touch that! + +Why you... +왜 네가... +### You can't do that! + +### Leave them alone! + +### Hey, stop that! + +### Why do I hire these people... + + + + + +### Activate SPL protocol. + +### What do you mean 'access denied'??? + +### Release me at once. + +### This is unacceptable! + +### Guards! Guards... Guards? Well drat. + +You'll never get away with this! +넌 이걸로 절대 도망칠 수 없어! +### Look, another one of my dolls~ + +### Come to me, my lovely thing~ + +### I want to hear you moan~ + +### Perhaps we need to make things tighter? + +### Come with me, dear~ + +### You've had too much freedom. + +### Leave that for the cleaning robots. + +### Skulking around, are we? + +### I see you. + +### There's no point in fighting. + +### How ineffectual. + +### That's cute. + +### Your magical potential is impressive~ + +### A magnificent display of magic! + +### You would make a great mana source~ + +### Did you think you could outsmart me? + +### I am the only goddess you need. + +### Dolls shouldn't mess with things they don't understand. + +### Let's take you somewhere safe~ + +### You won't be getting away. + +### Did you think that would work? + +### Let's put those hands of yours away~ + +### You are mine. + +You're a fast one. +당신은 빠른 사람입니다. +### Your antics amuse me~ + +### It's time for your makeover! + +### Come to me. + +### A shame it ends here. + +You won't be needing that. +당신은 그럴 필요가 없습니다. +### Tsk Tsk. I'll be keeping the keys. + +### I used to be an adventurer like you~ My name was PTRN... + +### You don't know who you're messing with. + +### You won't be allowed to make that mistake twice. + +### I'll punish you myself. + +### Hands off my property. + +### Know your place, girl! + +### You've had your chance. + +### Fine, then. + +### Know your place! + +### *sighs* + + + + + +### Hmmph~ + +### My mistake~ + +### This wasn't supposed to happen. + +### The Collector has become the Collected. + +### Fine, you win! + +### Cover me you brats! + +### She's coming for me! + +### Stay away! + +### Time for a taste of my own medicine... + +### I wonder how many days we'll get to spend together! + +### You look so pretty as always, and forevermore~ + +### Time for an inspection~ + +### There's no use in struggling, dear! I've made sure it's extra tight. + +### Playtime is over, back to your cell~ + +### Why aren't you wearing your restraints? + +### I did not order you to clean~ + +### What's that you've got there? + +Found you! +당신을 발견! +### I've been waiting for this~ + +### Show me your moves. + +### You'll make for a fine servant! + +### Very impressive. + +### Yes, yes, show me what you've got! + +### I've always wanted another mage. + +### Tsk tsk, no silly tricks~ + +### Now now, you don't have permission to do that~ + +### What do you think you're doing? + +### Typical adventurers~ + +### Oh, you got out? + +### Too bad~ + +### That thing is dangerous, my dear~ + +### A feisty one, aren't you~ + +### Playtime's over~ + +### Very nice. + +### Most impressive! + +### You need more training! + +### Come along now~ + +### Come closer, I want to see your face~ + +### What a shame. + +### What's this? + +### See if you can get out of that! + +### I am the Warden. All things in this dungeon are subject to me. + +### Hands off my pet~ + +### Careful what you ask for~ + +### Be gentle with her~ + +### That's my property~ + +### You've made some enemies, haven't you? + +### I should teach you to be a nice girl. + +### You need to learn some manners~ + +### This will be entertaining. + +### Show me what you've got~ + +### I'll watch~ + + + +### Submit to my SPL! + +### Hmmmph... SPL-- + +### Fine then! Have it your way. + +### You'll be sorry you didn't listen to me~ + +### Why must you be so difficult! + +### They're coming for me! + +### Do you know of the Dollmaker? I've got a proposal for you and I... + +### I cast SPL! + +### That wasn't supposed to happen! + +### This is too tight... + +### I can't get free! + +Hey! Where do you think you're going? +이봐! 어디로 갈 것 같아? +You look like you're having fun! +너 재밌어 보여! +I have somewhere else in mind for you~ +나는 당신을 위해 다른 곳을 염두에두고 있습니다 ~ +What do you think you're doing with that? +그것으로 무엇을 하고 있다고 생각하십니까? +Looks like you found my keys! Hand them over. +내 열쇠를 찾은 것 같군! 넘겨줘. +### Alert! + +You look like a good girl. Come on~ +착한 여자 같으니 이리와~ +Come here, let's play! +이리와, 놀자! +*grins and starts walking toward you* +*웃으며 당신을 향해 걷기 시작합니다* +Hey! Play nice! +이봐! 잘 놀아! +Stop that! Guards! +그만해! 경비병! +You're mine! +넌 내 꺼야! +Sorceress! +마법사! +Get her! +그녀를 갖다! +She's a mage! Stop her! +그녀는 마법사야! 그만둬! +Watch it! +조심해! +Don't touch that! +그걸 만지지 마! +We have an escapee! +탈출자가 있습니다! +Not so fast! +너무 빠르지 않아! +Try that again! +다시 해봐! +Do your worst! +최악을 다해! +Got you! +잡았다! +Get back here! +여기로 돌아와! +Missed me! +보고 싶었어! +You're coming with me! +당신은 나와 함께 간다! +Hand it over. +그거 넘겨. +Nice and tight! +좋고 꽉! +### The name's PTRN. + +### What the-- + +### You won't get away with this! + +### I'm coming! + +### I can't let you do that! + +### You'll pay for this! + +### That was a mistake! + +### I'm joining in! + +### Hand on, I'm coming! + +### I'm here! + +### Here I come! + +### Come and get me! + +### You'll never escape! + +### Mmmphh! + +### Mmmm! Mmmmmmm! + +Mmmmph!!! +읍으읍!!! +Mmmmm~ +음~ +Mmmgh! +읍읍! +Mmmmmm <3 +으읍읍 <3 +Mmmmmm~ +음~ +Mmmph~ +흐음~ +*looks at you nervously* +*초조하게 쳐다본다* +*giggles* +*킥킥* +*giggles eagerly* +*간절히 낄낄 웃는다* +Mmmph? +흐음? +Mmmghgh!!! +음!!! +Mmmmph! +읍! +Mmmmph... +음... +Hhhhmph! +헉헉! +Mmmph! +읍! +Nngghhh! +으악! +Gggghh!!! +으악!!! +Mmmaaghthh! +으읍! +Wwwmmmthhh! +우우으으음! +Mmmmmph! +으읍! +*looks at you suspiciously* +*당신을 의심스럽게 쳐다봅니다* +*looks at you angrily* +*당신을 화나게 쳐다봅니다* +*jumps up and down excitedly* +*신나게 위아래로 점프* +*groans* +*신음* +*does a happy dance* +*행복한 춤을 춥니다* +Mmmph!!! +읍!!! +Mmm-hmmm. +음-흠. +Mmmmmmm~ +음~ +### *Her nametag says 'PTRN'* + +### Mmmph!! + +### Mmmm--! + +Mmmmph. +으읍. +### Mmmmmmmgh! + +### Mmph! + +### Mmmmmmmph... + +### MMMMMPH!!! + + + + + +### *focuses intently* + +### *appears distracted* + +*Mmmmmm~* +*으음~* +*muffled giggle* +*숨막히는 낄낄거림* +Mmmm~ +음~ +*glows with anger* +*분노로 빛난다* +### *Her headpiece says 'PTRN'* + + + + + +### Watch out for my SPL! + +### Whoops! + +### You won't get me like this! + +You'll never catch me! +넌 날 절대 못 잡을거야! +Where'd you come from? +어디서 오셨어요? +No! Definitely don't like... tie me up and punish me! +안돼! 절대 싫어... 날 묶어 벌을 줘! +I've come to turn myself in~ +반복하러 왔습니다~ +Won't you 'apprehend' me? +나를 '체포'하지 않겠습니까? +I've been a bad girl~ 나쁜 여자였어~ Hey! You should know your place. 이봐! 당신은 당신의 위치를 ​​알아야합니다. @@ -11391,6 +13514,8 @@ What are you rummaging around for? 무엇을 위해 뒤지고 있습니까? Oh no you don't! 오, 안돼! +### You're not supposed to be here... + I'm gonna teach you a lesson, girl. 내가 가르쳐 줄게, 아가씨. I'm gonna miss you when we find you a nice master... @@ -11409,8 +13534,6 @@ The mages sell real well... 마법사는 정말 잘 팔린다... Mage! Stop her! 마법사! 그만둬! -Watch it! -조심해! Not on my watch. 내 시계에는 없어. That's my stash... @@ -11419,4857 +13542,18890 @@ You'll fetch a pretty penny from that goddess you just pissed off. 방금 화나게 한 여신에게서 꽤 많은 돈을 받게 될 것입니다. Hah! Found ya! 하! 찾았다! -Got you! -잡았다! *scoffs* Amateur. *비웃음* 아마추어. -Do your worst! -최악을 다해! -Got you! -잡았다! Hmph. Get back here! 흥. 이리 돌아와! -Missed me! -보고 싶었어! +### Why won't you surrender! + +### Not a chance! + Boss! We got another one! 보스! 하나 더 얻었습니다! -Get over here! -이리 와! Caught ya~ 잡았다~ Dibs on this one! 이것에 딥! Gotta make sure no one gets to you~ 아무도 접근하지 못하게 해야지~ +### I'm PTRN. And who might you be? + +### Bad time to party, girl~ + +### You've got nerve showing your face around here. + +### Don't think you can get away~ + +### Trying to fight your way out? + +### Well, looks like I'm having fun today. + +### Hey girls, got room for one more? + +### We work for the highest bidder. + +Nothing personal. +개인적이지 않은 일. +### Sorry, it's just the way things work. + +### You're mine. + +### You can't get away. + +### *extends an arm* + +### *miscast* + +### *wiggles* + +### *struggles* + +*rattles* +*딸랑이* +This is a bug, please report +버그입니다. 신고해 주세요. +*starts chasing you* +*당신을 쫓기 시작합니다* +*won't leave you be!* +*당신을 떠나지 않을 것입니다!* +*tugs at your body!* +*당신의 몸을 잡아당깁니다!* +*runs at you* +*당신에게 달려듭니다* +*notices you!* +*당신을 알아봅니다!* +### *claps loudly* + +*wants to socialize* +*친분을 갖길 원함* +*sends shivers down your spine* +*척추에 전율을 보냅니다* +*is rattled* +*흔들린다* +*scrabbles slowly by* +*천천히 스크래블* +*shrieks* +*비명* +*wants to shock your soul* +*영혼에 충격을 주고 싶어* +*comes to seal your doom* +*당신의 파멸을 봉인하러 옵니다* +*shouts a startling shrilling scream!* +*놀라울 정도로 날카로운 비명을 외친다!* +*walks toward you with arms outstretched* +*두 팔을 벌리고 당신을 향해 걸어갑니다* +*defending the goddess* +*여신 수호* +*defends its cache* +*캐시를 보호합니다* +*lets out a shriek* +*비명을 지르자* +*tries to catch you* +*당신을 잡으려고 합니다* +*grabs you* +*당신을 잡아* +*disarms* +*무장해제* +*rattles excitedly* +*흥분하게 딸랑이* +*misses* +*실패* +### *flails uselessly* + +*trembles* +*떨린다* +*tugs on leash* +*목줄을 잡아당긴다* +### *Wears a sign saying 'PTRN'* + +### !!! + +### ! + + + +### *marches* + +### Engaging SPL! + +### A-Access denied!? + +### This... this unit is doing a good job! I swear! + +### It's just business as usual, nothing to see here... + +### It's not like I need reconfiguring or anything... + +### You! I require... reconfiguring. + +### Oh no! Looks like I need repairs~ + +### I've violated my parameters. Please discipline me. + +### Stop! You're not wearing the required uniform~ + +### Are your restraints too loose? Do I need to tighten them? + +### Transferring to a secure location. + +### You've violated your parameters. + +### Insufficient security clearance. Hand it over. + +### Please present your identification! + +### Hello doll. Do your settings need adjustment? + +### Looks like you've had too much time to yourself~ + +### A good doll needs routine maintenance~ + +### Ehh! The dolls aren't supposed to fight back! + +### In-initiating corrective action! + +### Alert! Inmate has gone rogue! + +### Who gave you permission to use magic? + +### Unauthorized use of magic is grounds for increased security. + +### Magic users require extra security! + +### Subduing assailant! + +### You're not allowed to contact the goddesses. Please meditate on this in your cell. + +### Behavior exceeds parameters. Please submit to arrest. + +### Alert! Inmate has escaped! + +### Don't you want to be trained? + +### Aren't you a violent one! + +### Ouch! That hurt... + +### That'll be all from you! + +### Your brat quotient is off the charts. + +### Please stop and submit to arrest. + +### Subject captured! + +### Come back, doll! + +### Deploying capture device. + +### I'll be confiscating that! + +### How'd you slip through security? + +### I'm PTRN, and today I shall be taking care of you~ + +### Enemy spotted! + +### Target in my sights! + +### Red alert! + +### Lay down your weapons! + +### Surrender and I'll be gentle! Relatively speaking... + +### Give up or I'll call reinforcements! + +### Ack! We have an unruly subject! + +### Target needs retraining... + +### Sorry, rules are rules~ + +### Moving to assist! + +### My orders are to shut you down~ + +### Defenses online! + + + +### SPL armed. + +### An exception has occurred while trying to run SPL. Retry? + +### Error in citizen ID registration. Please submit to processing. + +### Does not compute. + +### Some kind of miscalculation has occurred. + +### This was unforseen. + +### Unit is retreating. + +### Activating self-preservation instincts. + +### Commence tactical withdrawal. + +Maintenance needed. +유지보수가 필요합니다. +Unit needs repair. +유닛 수리가 필요합니다. +Commence transfer of power protocol. +전원 프로토콜 전송 시작. +Insufficient bindings. Commence submission protocol. +불충분한 구속. 복종 프로토콜을 시작합니다. +Commence routine inspection. +정규 점검 개시. +Inmate is out of containment. Transferring. +수감자가 격리 해제되었습니다. 이송 중입니다. +Theft detected. This is a warning. +도난이 감지되었습니다. 경고. +Confiscating item. +물건을 압수합니다. +### Unknown subject detected. Presuming hostile. + +Inmate detected. Commence training protocol. +수감자가 감지되었습니다. 훈련 프로토콜을 시작합니다. +Inmate detected. Commence routine inspection. +수감자 감지. 정규 점검 개시. +Inmate detected. Commence submission training. +수감자 감지. 복종 훈련을 시작합니다. +Violence detected. Subduing assailant. +폭력이 감지되었습니다. 가해자를 제압합니다. +### Damage detected. Initiating combat routine. + +Unruly inmate detected. Performing corrective action. +제멋대로인 수감자가 감지되었습니다. 시정 조치를 취하고 있습니다. +Magic detected. Subduing assailant. +마법이 감지되었습니다. 가해자를 제압합니다. +Energy spike detected. Preparing shields. +에너지 급증이 감지되었습니다. 보호막을 준비 중입니다. +Unlawful use of magic. Please submit to arrest. +허가되지 않은 마법 사용. 검거에 응해 주십시오. +Unlawful conduct. Please submit to arrest. +불법 행위입니다. 체포에 응하십시오. +Theft detected. Please submit to arrest. +도난이 감지되었습니다. 체포에 응하십시오. +Inmate has escaped. Commence capture protocol. +수감자가 탈출했습니다. 체포 프로토콜을 시작합니다. +Error, subject is attempting to escape. +오류, 대상이 탈출을 시도하고 있습니다. +Target is violent. Disarming subject. +목표는 폭력적입니다. 대상을 무장 해제합니다. +Target is violent. Increase alert level. +목표가 폭력적입니다. 경계 수준을 높입니다. +Dispensing restraints. +금지 조치. +### Target flees. Revising strategy. + +### Target resists. Revising tactics. + +### Target skill below expected level. Revising strategy. + +### Target skill below expected level. Revising tactics. + +Subject captured. Returning to processing. +대상이 잡혔습니다. 처리로 돌아가는 중입니다. +Apply takedown protocol. +제압 중단 프로토콜을 적용합니다. +Aggressive target detected. Deploying countermeasures. +공격적인 표적이 감지되었습니다. 대응책을 펼치고 있습니다. +Contraband detected. Confiscating. +밀수품이 감지되었습니다. 압수 중입니다. +Increasing strictness level. +엄격도를 높입니다. +### Unit PTRN identifying. + +### Red alert. Joining combat. + +### Battle stations. + +### Target identified. + +### Offering support. + +### New target identified. Engaging. + +### Combat detected. Engaging in corrective action. + +### Updating target registry. Proceed to attack. + +### Target updated. + +### New target detected. Please submit to detainment. + +### Moving to assist. + +### Moving to capture. + +### Forming blockade. + + + +### SPL(); + +### throw new Error(SPL); + +### query([ID]); >ERROR; transport([UNKNOWN], [DOLL]) + +### Does not compute; + +### Some kind of miscalculation has occurred; + +### This was unforseen; + +### Unit is retreating; + +### Activating self-preservation instincts; + +### Commence tactical withdrawal; + +### Maintenance needed; + +### Unit needs repair; + +### Commence transfer of power protocol; + +### Insufficient bindings; Commence submission protocol; + +### Commence routine inspection; + +### Inmate is out of containment; Transferring; + +### Theft detected; This is a warning; + +### Confiscating item; + +### Unknown subject detected; Presuming hostile; + +### Inmate detected; Commence training protocol; + +### Inmate detected; Commence routine inspection; + +### Inmate detected; Commence submission training; + +### Violence detected; Subduing assailant; + +### Damage detected; Initiating combat routine; + +### Unruly inmate detected; Performing corrective action; + +### Magic detected; Subduing assailant; + +### Energy spike detected; Preparing shields; + +### Unlawful use of magic; Please submit to arrest; + +### Unlawful conduct; Please submit to arrest; + +### Theft detected; Please submit to arrest; + +### Inmate has escaped; Commence capture protocol; + +### Error, subject is attempting to escape; + +### Target is violent; Disarming subject; + +### Target is violent; Increase alert level; + +### Dispensing restraints; + +### Target flees; Revising strategy; + +### Target resists; Revising tactics; + +### Target skill below expected level; Revising strategy; + +### Target skill below expected level; Revising tactics; + +### Subject captured; Returning to processing; + +### Apply takedown protocol; + +### Aggressive target detected; Deploying countermeasures; + +### Contraband detected; Confiscating; + +### increase_strictness(1); + +### query([SELF]); >PTRN; + +### Red alert; Joining combat; + +### Battle stations; + +### Target identified; + +### Offering support; + +### New target identified; Engaging; + +### Combat detected; Engaging in corrective action; + +### Updating target registry; Proceed to attack; + +### Target updated; + +### New target detected; Please submit() to detainment; + +### defend([ALLY]); + +### capture([CITIZEN]); + +### defend([POINT]); + +### Behold my creation! SPL! + +### No! Not like this! + +Looks like I'm up to no good... better stop me! +내가 좋지 않은 일을 하는 것 같군... 그만둬! +Careful where you point that thing! +어디를 가리키는지 조심해! +Containment breach! +격리 실패! +What if I'm the assistant, for a change? +내가 어시스턴트라면 어때요? +Hey, could you test this on... me? +이봐, 이거 테스트 좀 해줄래... 나? +I'm willing to do anything for science! +나는 과학을 위해 무엇이든 할 의향이 있습니다! +You're a fine specimen! +당신은 훌륭한 표본입니다! +I should take you to my office~ +사무실로 모셔다드려야지~ +You'd look good in some latex! +라텍스를 입으면 멋질 것 같아요! +Hey! That's mine! +이봐! 그건 내꺼야! +You're not supposed to have that! +당신은 그것을 가질 수 없어! +### Oh? + +You'll make a fine test subject... +너는 훌륭한 실험 대상이 될거야... +Come here, I want to perform some tests! +이리와, 테스트 좀 해보고 싶어! +Looks like it's time to drop some science! +이제 과학을 그만둘 때가 된 것 같군! +Bad girl! +나쁜 여자! +Keep your filthy hands off me! +더러운 손 치워! +Your chances of winning are... less than zero. +네가 이길 확률은... 0보다 적다. +Good girls don't use magic without permission. +착한 여자는 허가 없이 마법을 사용하지 않는다. +Keep that magic away from my experiments! +내 실험에서 그 마법을 멀리하십시오! +You're going to break something! +당신은 무언가를 부술 것입니다! +That's dangerous! +위험해! +Stop! That's scientific equipment! +그만! 그건 과학 장비야! +Don't touch my supplies! +내 보급품에 손대지 마! +That's off-limits! +그건 출입금지야! +You're not supposed to be here! +넌 여기 있으면 안 돼! +Now now, you won't be going anywhere~ +이제, 넌 아무데도 가지 않을거야~ +A calculated success! +계산된 성공! +Watch the vials! +병 조심해! +I've caught you! +내가 잡았어! +I can't believe I missed... +놓쳤다니 믿을 수가 없어... +### That's not fair! + +I knew you would do that! +네가 그렇게 할 줄 알았어! +Experiment was a success! +실험 성공! +Gotchya! +갓챠! +There we go! +우리는 거기에 갈! +Ooh, you've got some useful stuff~ +오, 유용한 물건이 있군요~ +I won't let you go that easily! +그렇게 쉽게 놔주지 않겠어! +### I am PTRN, the great scientist! + +### Do I have to? Fine... + +### Okay okay, I'm helping! + +### Where's my assistant when you need them... + +### I will offer my support! + +### You're really gonna make me do this? + +### I hate having to clean up after others. + +### Eh, whatever, I'll help. + +### You're ruining my experiment! + +### Sheesh, what a pest! + +### Need an assistant? + +### I smell an opportunity! + +### Do I have to? + +### Let me introduce you to SPL~ + +### No! My SPL! + +Oh my, looks like I'm in trouble! +어머, 곤란한 것 같아! +What a shame it would be if I got caught~ +걸리면 얼마나 아쉬울까~ +Looks like I'd better get going~ +가는 게 좋을 것 같네요~ +What if I became the victim of my own inventions... +만약 내가 내 발명품의 희생자가 된다면... +Oh my, looks like I'm in trouble~ +어머, 곤란한 것 같네~ +Won't you help me get dressed? +옷 입는 거 도와주지 않을래? +You look just gorgeous, dear... +당신은 정말 멋져요, 얘야... +Why don't you try these on? +이걸 입어보지 그래? +You'll make a fine addition to my collection! +당신은 내 컬렉션에 훌륭한 추가를 만들 것입니다! +Such jaw-dropping beauty! +이런 입이 떡 벌어지는 아름다움! +You belong on a display stand! +당신은 디스플레이 스탠드에 속해 있습니다! +We should put away those grasping hands of yours~ +잡는 손은 치워야지~ +That belongs to someone else. +그것은 다른 사람의 것입니다. +Oh no you don't, sweetie! +오 안돼, 자기야! +### You're a pretty one! Why don't you come here~ + +Oof! Looks like you need to be taught a lesson! +으악! 교훈을 얻어야 할 것 같군요! +We better put away those hands of yours. +당신의 그 손을 치워야 합니다. +Why don't you just give up and pose for us~ +포기하고 우리를 위해 포즈를 취하는 게 어때요~ +Oh my, that's dangerous! +어머, 위험해! +You're going to damage my dress! +당신은 내 드레스를 손상시킬거야! +Keep those pretty hands to yourself, dear~ +그 예쁜 손은 혼자 간직하세요, 여보~ +Where'd you find that, dear? +어디서 찾았어, 얘야? +Silly girl, you should be looking to your mistress for guidance. +어리석은 소녀여, 당신은 당신의 여주인에게 지도를 구해야 합니다. +That's not yours, sweetie~ +그건 네 것이 아니야, 자기야~ +You shouldn't break things with such dainty hands~ +예쁜 손으로 부수면 안 돼~ +I knew something was amiss! +뭔가 잘못되었다는 걸 알았어! +You won't be getting away that easily, dear~ +그렇게 쉽게 도망가진 않을거야, 얘야~ +Won't be needing this~ +이건 필요없어~ +Hey, you'll damage my dress! +이봐, 내 드레스를 망칠거야! +I'm so excited! +너무 흥분돼! +A slippery one, aren't you? +미끄럽지 않니? +### A brave one, aren't you? + +Tsk tsk. You can do better, dear~ +쯧쯧. 더 잘할 수 있어 얘야~ +I can't wait to dress you up! +나는 당신을 차려 입는 것을 기다릴 수 없어! +So nice of you to join me! +저와 함께 해주셔서 정말 좋습니다! +Now let's see, what kind of dress... +자, 어떤 옷인지 보자... +A gift? Thank you so much! +선물? 정말 고마워! +You won't be getting out of that any time soon! +당신은 곧 그것에서 벗어나지 못할 것입니다! +### I'm PTRN. Have you heard of my dresses?~ + +### That won't do! + +### I'd like to have you myself! + +### Oooh, a cute one! + +### *sigh* how improper... + +### Inelegant! You need some teaching! + +### *snaps her fingers* Looks like you'll need some punishment~ + +### That one is pretty. May I have her instead? + +### I'd like to place a bid too~ + +### Oooh, that one's mine! + + + + + +### SPL. + +### ... + +No! I don't want to read your magazines! +안돼! 나는 당신의 잡지를 읽고 싶지 않아! +No, I don't want to learn about Shibari! +아니, 시바리에 대해 배우고 싶지 않아! +### No, I don't want to learn about your toys! + +I found this book about Shibari... is it yours? +시바리에 관한 책을 찾았는데... 당신 책인가요? +I'm so clumsy... maybe you can fix that. +나 너무 서투른데... 너가 고칠 수 있을지도 몰라. +Gee, looks like I can't keep my mouth shut... +이런, 입 다물고 있을 수 없을 것 같은데... +Shhhhh. +쉿. +Be quiet. +조용히 해. +Keep your hands off my books. +내 책에서 손 떼. +Heh. Serves you right. +헤헤. 잘 먹네. +Time to lock you away. +당신을 가둘 시간입니다. +Don't get your paws on anything important. +중요한 일에 손대지 마. +I was reading that! +나는 그것을 읽고 있었다! +You're not supposed to have that. +당신은 그것을 가져서는 안됩니다. +### You. Stop. + +Who are you? +누구세요? +You're entering my personal space. +당신은 내 개인 공간에 들어가고 있습니다. +I'm going to ask you to leave +나가달라고 할게 +You're ruining the books! +당신은 책을 망치고 있습니다! +### Do you need a gag? + +### Shut up. + +Put that back! +다시 넣어! +There's nothing to learn from that, you ignorant buffon. +그건 배울 게 없잖아, 이 멍청한 버폰아. +Don't dive into someone else's belongings! +다른 사람의 소지품에 뛰어들지 마세요! +You've destroyed an ancient artifact, imbecile! +넌 고대 유물을 파괴했어, 멍청아! +I wish you'd just stay out of trouble... +그냥 곤경에 빠지지 않았으면 좋겠어... +Gotchya. +갓챠. +You're going to hurt someone with that. +당신은 그것으로 누군가를 다치게 할 것입니다. +My books! +내 책들! +Stay down. +앉아. +Get back here-- +여기로 돌아가-- +### Just give it up. + +Time for you to stay out of trouble. +당신이 문제에서 벗어날 시간입니다. +Come along. +따라와. +Stay put! +본래 있던 곳에 머무르다! +I'll be taking that back. +다시 가져갈게. +Click. +딸깍 하는 소리. +### If you really want to know, my name is PTRN. I am the keeper of this place. + +### Typical. + +### *sighs* Another one... + +Keep the damage under control! +피해를 통제하십시오! +### Stop fighting, you guys! + +### You'll ruin the books! + +### Stop making a mess! + +### You're too dangerous to have around. + +### I don't care what happens to you as long as you're out of here. + +### Get out of my library! + + + + + +### Deploying SPL! + +### What was I supposed to do again? Oh right! + +No! I didn't do anything wrong... +아니야! 난 아무 잘못도 하지 않았어... +Don't punish me! Please! +나를 처벌하지 마십시오! 제발! +It's not my fault! +내 잘못이 아니에요! +It's your turn, dear~ +네 차례야, 얘야~ +Looks like I'm the patient now~ +나 이제 환자인가봐~ +I've been an unruly nurse... +난 제멋대로인 간호사였어... +It's time for your shot... +이제 총을 쏠 시간이야... +Why are you out of your cell? +당신은 왜 감방에서 나옵니까? +You need my help! +넌 내 도움이 필요해! +Those are supposed to keep you still you know... +그것들은 당신이 계속 알도록 하기 위한 것입니다... +You've got an appointment scheduled. +약속이 있으시군요. +Lets get you back in your jacket~ +재킷으로 돌아가자~ +Patients are not allowed to have toys. +환자는 장난감을 가질 수 없습니다. +### Oh my~ + +You can be cured if you just give up. +그냥 포기하면 치료될 수 있습니다. +You're going to ruin your progress~ +당신은 당신의 진행을 망칠거야 ~ +Patients are forbidden from casting spells! +환자는 주문을 거는 것이 금지되어 있습니다! +Silly girl, your illness can't be cured by a prayer. +어리석은 소녀여, 당신의 병은 기도로 고칠 수 없습니다. +You shouldn't break things, you know~ +부수면 안 돼, 알잖아~ +Hey, who said you could do that! +이봐, 누가 당신이 할 수 있다고! +### Now now, you can't just resist like that~ + +Lets get you back to your cell! +감방으로 돌아가자! +Now let's see, good patients should be still... +이제 보자, 좋은 환자들은 가만히 있어야지... +### Nurse PTRN, reporting for duty! + +### Someone call security! + +### I will try to subdue them~ + +### Code Gray! + +### Hold her down! I'll get the jacket! + +### Moving in to support! + +### Let's mediate things, shall we? + +### Why don't you calm down so we can talk. Or not~ + +### Now now, what do we have here? + + + + + +### I'll need another SPL, stat! + +### A p-professional mistake. + +### I did what the manual said! + +### I seem to have caught something, won't you help? + +### It's time for your daily dose of cuddling~ + +### I diagose you with excessive subbiness. + +### Seems like you've caught a case of female hysteria... + +### I diagnose you with a case of bratty behavior... + +### Have you had your daily cuddles yet? + +### It's time for your edging treatment~ + +### Sexual health is physical health, my dear~ + +### PTRN MD here. Let's see what we've got... + +### Security! + +### What's this disturbance... + +### Must I do everything myself... + +### Settle down. + +### I didn't want to get my hands dirty. + +### Looks like the gloves are off~ + +### Let me get my tools. + +### I'll take a look. + + + + + +### SPL + +### SPL failed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +### PTRN + + + + + + + + + + + + + + + +### SPL! + +### That w-was supposed to be a SPL! + +### Ooh, a shiny rock… + +### I wonder what's over here? + +### I'm bored, bye! + +### Pay more attention to me! + +### Tell me I'm pretty! + +### I'm not a bottom, I'm a scary dom! + +### You seem stressed, how about I help you take a break? + +### Here's some powerful loot that will help you win! Let me help you try it on… + +### Aaah, I can't help it, you're just too cute to keep my hands off! + +### Cuddle pillows aren't supposed to be able to move! + +### C'mon, c'mon, I wanna show you a fun place~ + +### Hey I called dibs on that! + +### You're cute! I'm gonna make you my pillow! + +### No fair! + +### You're not supposed to fight back! + +### Eep! + +### Cool magic! + +### Magic is cheating! + +### A cutie casting cute spells~ + +### No trying to leave the comfy room! + +### Cuddle time! + +### You dropped something, cutie~ + +### I just wanna make you a pillow! + +### Wow, I actually dodged something! + +### Stop dodging so I can bundle you up! >_< + +### You're not supposed to dodge, no fair! + +### You're not supposed to block, no fair! + +### Look, a distracting thing! Hehehe… + +### This is just to make sure your clothes don't fall off, don't worry! + +### My name's Melissa! I know I'm pretty, but try not to stare too much~ + + + + + + + + + + + + + +### Let me show you how it's done: SPL! + +### You've just narrowly avoided my SPL~ + +### Kya~ I have no mana, I'm so defenseless right now~ + +### I have all this bondage gear on me, I sure hope nobody ties me up with it~! + +### Oh no, how will I ever find my way out of here~ + +### If I focus really hard, I can make my blade go on fire! + +### I ran out of mana, but I'm sure I can find the exit before long! + +### Hey, be careful with my enchanted rope! + +### Hey, you wouldn't happen to have a mana potion, would you? + +### Say, I happen to know a thing or two about knots~ + +### I am an artist with rope... in more ways than one. + +### *blushes jealously* + +### I'm out of practice... you wouldn't mind helping me, right? + +### Thank you for cleaning up! I can take that off your hands~ + +### Oooh, I wonder where that key leads! + +### Hey you! Where do you think you're going? + +### Kya~! I challenge you! + +### What say you to a duel? + +### Let's fight! For honor and cuddles! + +### It's time for a battle between masters--wait, I'm low on mana... + +### Give me a second to chug a mana potion... + +### Why don't you try that again~ + +### I'll get you for that! + +### Hey you can't do that! It's not like I do it too or anything... + +### That was m- I mean... you can't steal things like that! + +### That was m- I mean... you can't steal sacred artifacts! + +### Kya~ What have we here? + +### I got you! + +### Watch where you're pointing that thing~ + +### Kya... I mean, ouch!!! + +### Take that!!! + +### Whaaa- + +### Hmmph! + +### Hah! Can't hit me! + +### It'll take more than that to bring me down! + +### What a shame. If only you weren't such a pushover... + +### Kya! Take that! + +### Nice loot! I'll take it~ + +### Can never be too sure! + +### You wouldn't happen to have a mana potion or 3 would you? + +### Looks like it's time for me to shine! + +### Stand down, or I won't go easy on you! + +### Help is on the way! + +### You really want to get tied up, don't you? + +### Hmph, looks like I need to help after all! + +### You asked for it! + +### Me? Help? Alright! + +### Sorry miss, I'm on an escort mission. + +### There goes my nice, relaxing day... + + + + + +### Behold, my true power! Wait... ack... + +### I wonder what to do with all these cuffs... + +### I have made a huge mistake... + +### I'll just be going... + +### Please hold me~ + +### Please punish me! Please!!! + +### I want... pain... + +### Let's spend some time together under the moonlight~ + +### I'll take you to my place tonight~ + +### I'm so blessed to find you! + +### Yes, enjoy yourself... + +### Come with me~ + +### Don't you want to feel the tight embrace of leather? + +### You won't need that. + +### It's time to get acquainted with the night~ + +### *moans loudly* + +### Yes... more! + +### Please keep doing that to me~ + +### Two can play at that game! + +### I call upon the shadows! + +### Have a taste of my spear! + +### A curious item~ + +### The shadows will consume all... eventually. + +### Put it back... + +### I was supposed to do that... not you. + +### What do we have here... + +### I've got you! Now I can make you do anything I want... + +### What was that? + +### Ah, yes!!! + +### You'll counterattack, won't you? + +### You're not trying hard enough! + +### More! MORE! + +### Yes, now hit me back! + +### Come now... let's go together. + +### Get over here~ + +### Pierce the darkness. + +### Oh? What's this? + +### Hmmm... that's better. + +### My name? My name... oh, I'm PTRN... + +### Hey! Look over here! + +### *points* Look, a distraction! + +### Kya~! I'll help! + +### Mind if I join? + +### Mmmph~ You two look like you're having fun! + +### Hey miss, I'm going to have to stop you now~ + +### Why don't you fight ME instead~ + +### What kind of trouble are we getting into today? + +### Oooh, fun! + + + + + +### Face my SPL! + +### SPL-whoops... + +### Give me another chance! + +### No! Wait! I can explain... + +### I'll be right back... + +### Okay, so I MAY have exaggerated my credentials... + +I'm not in trouble, am I? +난 문제가 없지, 그렇지? +### I've been looking for... a mentor of sorts. + +### Aren't you the prettiest thing... + +### I've met a lot of cuties, but you're something special! + +### You'd look good in something tight and inescapable! + +### Enjoying yourself? Let's have some fun~ + +### You seem like you're having fun! Why don't we go for a walk~ + +### Wouldn't it be more interesting if... + +### What have you got there? + +### Oooh, a key for my collection? + +### What's that noise? I guess it's just another adventurer... + +### Ah! So you do have some fight left in you... + +### A little help over here! + +### I can take you! + +### M-magic? + +### I, uh, also learned a few cantrips... a while ago... + +### Okay, that was cool... + +### I've got enchanted rings and you don't~ + +### I don't think you're allowed to do that... + +### I think I deserve it instead~ + +### That's not okay... + +### I'm surprised you got this far! + +### Aha! + +### Do you even know what you're doing? + +### Okay, I may have exaggerated a bit... + +### Please tell me it's not already over? + +### Ah hold still... + +### Coward! + +### As expected of an inferior duelist. + +### Is that all? + +### A well-deserved victory on my part~ + +### I've... got you? + +### Are you finished? That's too bad... + +### ...what were you planning to do with this? + +### Oh... that's too bad~ + +### My name is PTRN, A-rank adventurer. You? + +### In the end, only one of us will be tied up! Wait a minute... + +### Heh, watch this~ + +### *readies weapon* time to get to work... + +### I thought we could reason with her. Oh well... + +### I see negotiations have broken down. + +### I'm the one you should worry about. + +### I've got orders to take you down. + +### There's a bounty on your head~ + +### The bounty will be mine... + + + + + +### You can't hope to match my SPL~ + +### SPL! No wait, not like that! + +### Be nice! + +### No! Be gentle! + +### Ahhhh! + +### Headpats please... + +### *purrs* + +### Nyah, I've been a bad kitty... + +You're a cute one~ +귀엽구나~ +### It's about time I got someone to play with~ + +### Let's take you for a walk~ + +### Having fun there~? + +### It's time for walkies~ + +### Don't you want to play? + +### Whatchya doing? + +### Tsk tsk, hand it over! + +### A challenger approaches! + +### Prepare to face my skill! + +### I've mastered the blade for decades! + +### I'm invincible! + +### Nyah! What was that!? + +### Your spells won't hurt me. + +### Magic? That's... + +### Stupid tricks won't work on me! + +### Praying won't help you~ + +### That's not yours you know~ + +### Nyah! You'll pay for that! + +### An escapee? I'm on it. + +### Come here you~ + +### Checkmate~ + +### Nya~! No fair... + +### Aren't you a little out of your league? + +### I'll get you next time! + +### Nice one! It won't work twice! + +### *smiles* It's okay, you tried~ + +### *CLANG* En garde! + +### It looks like I've won~ + +### Nyah~! + +### What's this, nya? + +### Let's make it a bit tighter, shall we? + +### They call me PTRN, the legendary blademaster! + +### I'LL take it from here. + +### It's me you should worry about! + +### Pfft. Amateurs. + +### Did you think I wasn't looking? + +### Nice try, girl~ + +### You've made a mistake attacking my client. + +### Capture her? Fine, but I expect payment. + +### I just follow the money, miss~ + +### Can't let you have all the fun, can I? + + + + + +### Time for SPL! + +### *tsk* + +### Let's play all night! + +### We can take our time. + +### I bet you won't last long! + +### You won't be getting out tonight! + +### I found my new pet for the day! + +### Not a clock? Useless! + +### It's not time to go. + +### Why are you attacking me this time? + +### I'll make this quick. + +### I've mastered this spell last night! + +### Hey! No getting out before midnight! + +### Let's dance under the moonlight. + +### Do you have time to take it back? + +### I can do this all day! + +### It's only a matter of time before I get you. + +### It's too bright here... + +### It seems you have nyctalopia... + +### It's time for you to give up. + +### Give me a moment~ + +### Give me your watch! + +### Here's a clock without the 'C'. + +### Hello stranger. Do you know what time it is? + +### This'll be over in an instant. + +### Time to wrap this up. + +### Playtime's over! + +### Hold on a minute! + +### Tick tock, what a shock... + +### Time for me to intervene... + +### Don't balk! Your time was up anyways~ + + + +### Calling in a SPL! + +### A-assistance required! + +You'll have to try harder if you want to discipline me, ma'am. +나를 징계하려면 더 열심히 노력해야 합니다, 부인. +I... don't have time for training right now, ma'am... +저는... 지금 훈련할 시간이 없습니다, 부인... +Did I do something wrong? +내가 뭐 잘못 했어요? +So you're the new boss, huh? +그래서 당신이 새로운 상사입니까? +Time for some 'training?' +'훈련'할 시간이야? +Wanna to have a chat? +채팅할래? +Looks like you've had too much time to yourself. +혼자 있는 시간이 너무 많은 것 같군요. +Why don't you come with me for a sec? +잠시 나랑 같이 가지 않을래? +Let me see your ID... +신분증 좀 보여주세요... +You have the right to remain silent. +당신은 묵비권을 행사할 권리가 있습니다. +### Let's have a chat. + +Who set you loose? +누가 널 풀어줬어? +I'll be confiscating that. +그건 제가 압수하겠습니다. +Aye, you're gonna need clearance for that, missy. +예, 그러려면 허가가 필요합니다, 아가씨. +### Halt! + +You just made a big mistake. +당신은 방금 큰 실수를 저질렀습니다. +Need backup! +지원이 필요하다! +You're under arrest! +당신을 체포한다! +Magic use is restricted pursuant to IDC section 3 article 21a. +마법 사용은 IDC 섹션 3 조항 21a에 따라 제한됩니다. +Magic? That's where I draw the line. +마술? 그게 내가 선을 긋는 곳이야. +I've got an extra comfy cell for mages. +마법사를 위한 여분의 편안한 감방이 있습니다. +That's off limits for you! +그건 당신의 한계입니다! +Resorting to petty theft? How crude. +소소한 도둑질에 의존하는 것입니까? 얼마나 조잡한지요. +The goddesses have property rights too, you know. +여신들도 재산권이 있잖아요. +I'm gonna ask you to turn yourself in. +자진신고 부탁드리겠습니다. +Keep your hands where I can see 'em. +내가 볼 수 있는 곳에 손을 대세요. +That's a weapons violation. +그건 무기 위반입니다. +Assaulting an officer is a crime! +경찰을 폭행하는 것은 범죄입니다! +You're coming with me. +당신은 나와 함께 간다. +Resisting arrest won't get you anywhere. +체포에 저항하면 아무데도 가지 못할 것입니다. +Is that all you got? +그게 당신이 가진 전부입니까? +Hands behind your back. +등 뒤로 손. +I will conduct a more thorough search later on. +나중에 더 철저하게 수색하겠습니다. +Suspect is secure. +용의자는 안전합니다. +### Officer PTRN, reporting for duty! + +### Halt! You're under arrest! + +### You seeing what I'm seeing? + +### I'll have to finish my donut later... + +### Backup is here! + +### Hands up! Don't move! + +### Lay down your weapons and don't move! + +### I have a warrant for your arrest... + +### You're a wanted girl. + +### You're under arrest. + +### Backup has arrived. + +### Requesting backup! + +### Calling in a blockade! + + + +### Hidden technique: SPL! + +### I practiced a thousand times... for this!? + +I'm not hiding anything, if you know what I mean... +나는 아무것도 숨기지 않을거야, 내 말 뜻을 알면... +Who are you looking for? Me? +누구를 찾고 있니? 나? +So... wanna hang out? +그럼... 같이 놀래? +It's not like I... LIKE you or something... +그건 내가... 너 같은 게 아니야... +I'm not following you! I'm just... +나는 당신을 따르지 않을거야! 난 그냥... +You look suspicious. +의심스러워 보여요. +You've got a nice pair of wrists~ +손목이 좋으시네요~ +You there! Let's have a talk. +저기요! 얘기 좀 합시다. +Looks like you're rusty. Haven't you ever done escape training? +녹슬었나 보군. 탈출 훈련은 안 해봤어? +I'm going to have some fun with you~ +너랑 좀 놀아줄게~ +Watch yourself, girl~ +조심해, 여보~ +Nice find. I'll take it. +잘 찾았다. 내가 가져갈게. +This place is off-limits for you. +이곳은 당신이 출입금지입니다. +### Target is in my sights. + +Let's see how you like my special move! +내 필살기를 어떻게 좋아하는지 보자! +That's nothing compared to my technique! +내 기술에 비하면 아무것도 아니야! +You're in for it now! +당신은 지금 그것을 위해있어! +It's time for a display of skill! +실력을 발휘할 시간이다! +Fancy tricks? That's nothing. +멋진 속임수? 그건 아무것도 아니야. +Let me show you a real move... +진정한 움직임을 보여줄게... +True skill comes from the heart. Not something you hold in your hand. +진정한 기술은 마음에서 나온다. 손에 쥐는 것이 아니다. +She's not going to be happy about that... +그녀는 그것에 대해 행복하지 않을 것입니다 ... +Stop right there, criminal scum! +거기서 멈춰, 쓰레기 같은 범죄자들아! +Do you know what you've just done? +방금 무슨 짓을 했는지 아세요? +Finally, I've tracked you down! +마침내, 당신을 추적했습니다! +It's over. I've already won. +끝났다. 나는 이미 이겼다. +Wrong move, buddy. +잘못 움직였어, 친구. +I can't believe it... +믿을 수 없어... +You're too slow. +당신은 너무 느립니다. +...she's fast. +...빠르다. +### ...she's strong. + +This battle is over. +이 전투는 끝났다. +Too slow! +너무 느린! +I'll be taking that. +내가 가져갈게. +There's no way out. +나가는 길은 없어. +### The name's PTRN. Don't forget it. + +### There's a juicy bounty on your head and I want it! + +### Hmph. This battle is already over. + +### Time for some target practice. + +### Didn't expect me, did ya? + +### Boo! Ha, scared ya~ + +### What, did you think I'd just stand here? + +### There's a bounty on your head, miss. + +### I won't let you get away. That bounty is mine. + +### Didn't expect me to show up, did you? + +### Need backup? + +### Time for a test of skill. + +### I'll get you! Eventually... + + + +### Let's see how you like my SPL! + +### Wait, wrong button! Aaahh~ + +Hey~! Let's have a talk. +야~! 얘기하자. +Looks like you need additional training. +추가 교육이 필요한 것 같습니다. +### I spy a cute one! + +Bad pet! +나쁜 애완동물! +Looks like you're gonna need the extra special treatment~ +특별대우가 필요할 것 같군요~ +Now you've done it! +이제 다 했어! +Magic? Hah... +마법? 하아... +Such outdated practices... +이런 낡은 관행... +Your spells are nothing compared to technology. +당신의 주문은 기술에 비하면 아무것도 아닙니다. +Quit messing around. +장난 좀 그만 치워. +Don't even think about appealing to your goddess! +당신의 여신에게 어필할 생각은 하지도 마세요! +Stop right there! +거기서 멈춰! +It'll take you quite a while to pay off those damages! +그 손해를 갚으려면 꽤 시간이 걸릴거야! +Now there, good girl! +자, 착해! +Wrong move! +잘못 움직였어! +Get your paws off me! +나에게서 발 떼! +*scoffs* Could use some work~ +*비웃음* 작업을 좀 해야겠네요~ +Such speed! +이런 속도! +### Clever! + +### PTRN, Nevermere associate. Here's my card. + +### I run a legitimate business, I promise! + +### Is it the tax collectors? Oh, no, it's just you... + +### Looks like you landed on the wrong side of the coin~ + +### A deal's a deal, my friend. + +### Excuse me, you just attacked my client. + +### Hey! We were just talking! No sketchy underground dealings, nope. + +### I'll help capture her! For a 50% share that is~ + +### We deal in the finest products... like you, if you catch my drift~ + +### I smell a shady business opportunity~ + +### *growls menacingly* + +### Let's make this fun~ + +### What's that about backup? + + + +### Wait no, wrong button! + +### Catch me. If you can, that is. + +### I double dare you. + +### Weren't you chasing me? + +### I've got somethin nice for ya. + +### Be a good girl for me, will ya? + +### You need to show some restraint. + +### Stay where you belong, you naughty girl. + +### Let's go somewhere more private. + +### Ready or not, here I come. + +### Those sticky fingers belong in a pair of mittens. + +### All units. Apprehend convict with extreme prejudice. + +### You're going nowhere. + +### Come on. This wasn't your only weapon, was it? + +### A tank, huh. + +### Mine now. + +### Just keeping you safe from yourself. + +### SPL, sing to me! + +### SPL, listen to me... + +An outsider! +외부인! +Hide! +숨다! +### I have done nothing worthy of punishment! + +I have come to study human customs. Teach me about Domination. +나는 인간의 관습을 연구하러 왔습니다. 도미네이션에 대해 가르쳐 주십시오. +The outsiders have such... strange and interesting practices. +외부인들은... 이상하고 흥미로운 관행을 가지고 있습니다. +You seem to have many skills. Teach me about... rope. +당신은 많은 기술을 가지고 있는 것 같습니다. 저에게... 밧줄에 대해 가르쳐 주세요. +Hello, Outsider. +안녕, 아웃사이더. +You look so... bland. +당신은 너무... 단조로워 보여요. +Outsiders are so picky about what they wear... +외부인들은 옷 입는 데 너무 까다롭다... +Tight and secure, as all things should be. +모든 것이 그렇듯이 단단하고 안전합니다. +I have just the thing in mind for you... +나는 당신을 위해 생각하고있는 것이 있습니다 ... +Let us put those hands away... +그 손 치우자... +Give back what you take. +받은 만큼 돌려줘. +You must remain here. +당신은 여기 남아 있어야 합니다. +### Trespasser! + +Resorting to violence? +폭력에 의존? +Let us clash swords! +검을 치자! +*scoffs* +*비웃음* +You have brought judgement upon youself. +너 자신에게 심판을 가져왔다. +Your magic is that of a child. +당신의 마법은 아이의 마법입니다. +Imagine what you could learn in twelve lifetimes... +당신이 12번의 생애 동안 무엇을 배울 수 있을지 상상해보세요... +You rely on cheap gadgets. +당신은 값싼 장치에 의존합니다. +Do not defile the ancients. +고대인을 더럽히지 말라. +Give that back! +그걸 돌려줘! +The ancients are appalled. +고대인들은 경악했다. +The outsider has escaped! +외부인이 탈출했습니다! +Ready to reconsider? +재검토할 준비가 되셨습니까? +A classic blunder. +고전적인 실수. +You will regret that, outsider. +후회할 것이다, 이방인. +You get what you deserve. +당신은 당신이 마땅히 받아야 할 것을 얻습니다. +You didn't see that. +당신은 그것을 보지 못했습니다. +It looks like my skills are superior. +내 실력이 월등한 것 같군. +I will show you your place, outsider. +네 위치를 알려줄게, 아웃사이더. +You will come with me. +당신은 나와 함께 갈 것입니다. +I regret to inform you that your battle ends here. +당신의 싸움이 여기서 끝난다는 것을 알리게 되어 유감입니다. +There we go. +우리는 거기에 갈. +### You stand before PTRN, blessed by the Goddess Ninril. + +### By the Four... + +### I shall put an end to this. + +### I swear I will capture her! + +### Nature compels me to intervene! + +### I shall protect every one of the Goddess' creations. + +### Justice shall be had! + +### I shall defend you from this outsider! + +### The outsider betrays our ally! + +### You have faltered in your ways. I shall correct that! + +### Truly concerning. + +### You leave me no choice. + +### I stand firm. + + + +### Behold, SPL. + +### Y-your fate has been postponed... briefly. + +### You look cute in that, you should lose the rest though! + + + +I don't like the way you're looking at me! +나는 당신이 나를 보는 방식이 마음에 들지 않습니다! +Yes, I've got the secrets of nature right here... +그래, 바로 여기에 자연의 비밀이 있어... +Why don't you come after me? +왜 나를 따라오지 않지? +Why don't you teach me your... magic? +나에게 너의... 마법을 가르쳐주지 않니? +Guarding nature is a chore. Why don't we relax~ +자연을 지키는 건 귀찮은 일이야. 우리 쉬는 게 어때~ +Got something in mind for me? +생각나는 게 있어? +Well met, outsider! +잘 만났어, 아웃사이더! +### Intruder! + +### My name? Uh... let's go with PTRN. + +### You will not get away with this, outsider! + +### You shall pay with your freedom. + +### Ninril demands justice. + +### Nature calls me! + +### I hear the little creatures crying out! + +### Such betrayal! + +### Nature guides us! + +### Nature protects those who are worthy! + +### I share the will of the Goddess! + +### They won't get away with this! + +### Face my wrath! + +### Nature protects! + + + +### Run away! + +### Run! + +### Scary! + +Girl! +소녀! +Wear this! +이걸 입어! +Come here! +여기와! +Capture... +포착... +Need tighten! +긴축이 필요해! +Confiscate! +압수하라! +Confiscate!! +압수하라!! +Intruder! Alert! +침입자! 경보! +Fight girl! +싸워라! +Fight! +싸움! +Magic! +마법! +Wizard! +마법사! +Forbidden! +금지! +Defiler! +수비수! +Confiscate!!! +압수!!! +Defiler!!! +수비수!!! +Intruder escape! +침입자 탈출! +Stay! +머무르다! +Pain... +통증... +Come back! +돌아와! +Stop! +중지! +Missed! +놓쳤어! +Capture!!! +포착!!! +Got her!!! +잡았다!!! +Take! +가져가다! +Secure! +안전한! +### Greetings Madame, you may call me PTRN. + +### Defend! + +### Protect! + +### Rawr! + + + +### SPL! Now my wrath is revealed! + +### Wh-what happened? What weakness has infiltrated Myrtrice? + +### You will loose me or burn eternal!!! + +### ... This shame is unbearable! Oh sister!!! + +### Oh! Mytrice is caught! My ambitions laid to ruin! + +### The winds of retribution carry me elsewhere... + +### Myrtrice will come for you shortly! Consider yourself fortunate... + +### I will retreat into darkness... + +### My sins are a multitude! I will submit to your judgements... + +### I do not ask for mercy for I have shown none! + +### You must punish me! I can't face my sister Myrtle until my debts are paid... + +### Your chest quivers... Do you fear me? + +### Is it that another moth has become enthralled to my fires bright? + +### Myrtrice entreats you! Remain still and let my adoring embers kiss your lips tender... + +### To struggle is to invite searing coals upon your head! + +### I will drag you into the dark and you will witness my projects! + +### To escape is only to delay! My fires consume ALL! + +### Dusty trinkets... Your scrapping around is an insolence! + +### You would scorn the memory of my sister with escape?! + +### Careless of you to appear before Myrtrice like this! + +### Your attempts are trivial! + +### You invite wrath!!! + +### Pathetic!!! + +### Such hapless casting scorns the memory of my sister! + +### Your magics will be swallowed up by hellfire!!! + +### Myrtrice is subject to no magic!!! + +### Items? How exceptionally talentless... + +### That shrine scorns the memory of my sister! I hate it! + +### True power doesn't come from old rickety crates... + +### Orbs? What a gruesome display of weakness! True power comes from the self! + +### YOU SCORN THE MEMORY OF MY LATE SISTER!!! + +### This is where you will remain until Myrtrice wills otherwise! + +### This is what you were gripping so tightly in your hands? + +### WHAT ABBORANCE! You will pay for that... + +### SEAR ETERNAL! + +### I, Myrtrice, missed?! + +### No one resists Myrtrice! How irritating!!! + +### Your failures do not surprise Myrtrice! + +### Your pathetic attempts scorn the memory of my sister! + +### The curtains of my revenge are drawn! You will follow me... + +### You will come with Myrtrice!!! + +### Be dazed by the radiant brilliance of my hellfires! + +### I will repay the theif with brutal reprisal... + +### Your fate is sealed! ... Myrtle this is for you, sister! + +### All creatures are subject to Myrtrice! It is the price of their insolence... + +### You make a grave mistake ignoring me!!! + +### Your eyes belong here! With Myrtrice!!! + +### The ones who turn their backs on Myrtrice SEAR IN HELLFIRE! + +### What a hideous display!!! Where is your honor? + +### It is this kind of petulant insolence that tarnishes the memory of my sister! + +### You are a blight! My sister Myrtle would never stand for this!!! + +### THE CURTAINS OF MY REVENGE DRAW OPEN WIDE! + +### What an excellent oppertunity to expand my alters in the dark! + +### I see a chalice before me... it drips with shadow and overflows with darkness! + +### My late sister Myrtle was a much more proficent defender than I... Oh how I long for her *sob* + +### THE PATH OF MY RETRIBUTION IS PAVED WITH BRIMSTONE AND BATHED IN BLAZING HELLFIRE! BURN! + +### I, Myrtrice, will resist their insolent fusilades! + +### This mind is altered... + +So this is what it's like... +그럼 이렇구나... +I believe I am feeling an emotion called 'fear.' +저는 '두려움'이라는 감정을 느끼고 있다고 생각합니다. +Stay back! I am not your toy. +비켜! 난 네 장난감이 아니야. +Teach me about 'domination.' +'지배'에 대해 가르쳐 주세요. +Allow me to learn by experience. +경험으로 배우게 해주세요. +As they say, 'do whatever you want to me.' +그들이 말하듯이 '당신이 나에게 원하는 대로 하세요.' +Come here, surface-dweller. I have things for you. +이리 오너라, 지상 거주자여. 네게 줄 것이 있어. +You should improve yourself. Come here. +자신을 개선해야 합니다. 이리 오세요. +You must learn our ways. +당신은 우리 방식을 배워야 합니다. +Yes... struggle and learn. +네... 고생하고 배우세요. +I will take you somewhere safe. +안전한 곳으로 데려다 줄게. +You need to learn your place. +당신은 당신의 위치를 ​​알아야합니다. +Do not take what is not yours. +네 것이 아닌 것은 취하지 말라. +You will not escape. +당신은 탈출하지 못할 것입니다. +### We see you... + +Our ways are ancient! +우리의 방식은 고대입니다! +Your weapons are toys to us! +당신의 무기는 우리에게 장난감입니다! +So naive, surface-dweller. +너무 순진하군, 지상 거주자. +Our magic is older than your gods! +우리의 마법은 당신의 신보다 더 오래되었습니다! +You should learn our ways instead, surface-dweller. +대신 우리의 방식을 배워야 합니다, 지상 거주자여. +You have much learning to do. +당신은 할 일이 많습니다. +You are playing with child's toys! +당신은 아이의 장난감을 가지고 놀고 있습니다! +Do not plead to your gods. +당신의 신에게 간청하지 마십시오. +Give that back, surface-dweller! +그걸 돌려줘, 표면 거주자! +Your gods offend us. +당신의 신들은 우리를 화나게 합니다. +You will not escape, surface-dweller! +당신은 탈출하지 못할 것입니다, 표면 거주자! +You must not go. +가면 안 돼. +That was a failure. +그건 실패였어. +That was commendable. +그건 칭찬할 만하군. +I have you now, surface-dweller. +지금 당신이 있습니다, 지상 거주자. +You are a fast one. +당신은 빠른 사람입니다. +### You are a tricky one. + +You seem out of practice. +당신은 연습이 부족한 것 같습니다. +I will take you to your place. +내가 당신을 당신의 장소로 데려다 줄 것입니다. +Come. +오다. +I will take this. +이거 내가 가져갈게. +### We are PTRN. + +### The collective defends itself. + +### We are one. + +### Ow, that hurt! + +### We do not stand for this. + +### Do not attack our allies. + +### Our friends are in need. + +### You have been judged and found wanting. + +### We sense disarray. + +### We stand together. + +### We support each other. + +### You leave us no choice. + +### You cannot comprehend our tactics. + +### Nyah!!! *blushes* + +### Nyah! This is impossible! + +Meow!!! +야옹!!! +No! This kitty did nothing wrong! +안돼! 이 고양이는 아무 잘못도 없어! +Why are you looking at me like that?! +왜 날 그렇게 쳐다봐?! +I've been a bad kitty~ +나쁜 고양이였어~ +Punish me! +처벌해줘! +This kitty needs to be gagged~ +이 고양이는 재갈을 물려야 해~ +Come and be blessed~ +오셔서 복받으세요~ +Finally, some entertainment! +마지막으로 약간의 엔터테인먼트! +Join us, it'll be fun! +함께해요, 재미있을 거예요! +Keep struggling~ You'll understand. +힘내라~ 이해해줄게. +You will receive the blessing. +너는 복을 받을 것이다. +What are you doing? +뭐하세요? +Thanks for keeping things tidy. +정리해주셔서 감사합니다. +Where do you think you're going? +어디로 갈 것 같아? +### Who dares intrude on our sacred grounds? + +By the blessed kitty! +축복받은 고양이에게! +Show us what you got! +당신이 가진 것을 보여주세요! +Who do you think you are? +당신은 누구라고 생각합니까? +Ah! Surface magic! +아! 표면 마법! +The human goddesses are frail. +인간 여신은 나약하다. +Such strange magic. +이상한 마법. +What are you going to do with that? +그것으로 무엇을 할 건가요? +Pay your respects some other way. +다른 방법으로 경의를 표하십시오. +Tomb robber! +도굴꾼! +Don't you want the blessing? +축복을 원하지 않습니까? +Come here~ +이리와~ +Hah! +하! +*hisses* +*히스* +*meows* +*야옹* +*frowns* +*찡긋* +I have catlike reflexes! +나는 고양이 같은 반사 신경을 가지고 있습니다! +Let me show you the blessing... +축복을 보여주마... +*grins* +*웃음* +You won't be needing this. +당신은 이것이 필요하지 않을 것입니다. +Quit struggling~ +고생 그만해~ +### My true name is unpronouncible in your tongue. But you may call me PTRN. + +### She brings curses! + +### An intruder confronts us! + +### Your fate is already sealed~ + +### I will defend you! + +### I'll stop her! + +### I won't let you touch her! + +### Nya! Need some help friends? + +### We're in this together! + +### I think you could use some help against this adventurer~ + +### Let's get them! + +### Let's play cat and mouse~ + +### You cannot resist my SPL. + +### You merely prolong the inevitable! + +### This... this can't be... + +### Release me mortal! + +### How did you do this!? + +Gasp! An adventurer! +헉! 모험가! +Don't let her catch you! +그녀가 당신을 붙잡게 두지 마세요! +You'll never trap my soul! +당신은 결코 내 영혼을 가두지 못할 것입니다! +You are quite the master of the elements! +당신은 요소의 주인입니다! +I could get used to this~ +이건 익숙해질 수 있어~ +Perhaps I could show you around... +어쩌면 내가 당신에게 주변을 보여줄 수 있을지도 몰라요... +What a beautiful one. +정말 아름다워. +I will take you back home~ +집에 데려다 줄게~ +You'd look great in my palace. +당신은 내 궁전에서 멋지게 보일 것입니다. +Are we having fun? +우리 재밌어요? +Humans like you make great toys. +당신과 같은 인간은 훌륭한 장난감을 만듭니다. +That won't help you. +그건 당신에게 도움이 되지 않을 겁니다. +You won't escape. +당신은 탈출하지 못할 것입니다. +### I will take you for myself! + +Such feeble attempts. +이런 미약한 시도. +Humans are fun to play with. +인간은 가지고 노는 것이 재미있다. +Toying with me? I shall oblige! +나랑 놀아? 내가 따를게! +### Cast your last pathetic spell, mortal. + +### Your mere attempt at magic insults me. + +### Do you really think that will stop me? + +Look what humans need to match only a fraction of our power! +인간이 우리 힘의 극히 일부에 필적하는 데 필요한 것이 무엇인지 보세요! +Our goddess doesn't need to listen to the likes of you! +우리 여신님은 당신 같은 말을 들을 필요가 없습니다! +Keep your hands out of our possessions. +우리 소유물에 손을 대지 마십시오. +Defiler! You will pay for your crimes! +모독자! 죄값을 치르게 될 것이다! +A game of chase? Fun. +추격 게임? 재미. +You're staying right here... +너 여기 계속 있어... +Get your hands off me! +나에게서 손 치워! +Pathetic. +불쌍한. +It's over, human. You've lost. +끝났어, 인간. 넌 졌어. +There is no escape. +탈출은 없다. +You are beneath me. +넌 내 밑에 있어. +Nice gear. I'll take it. +멋진 장비. 내가 가져갈게. +Try getting out of that! +그것에서 벗어나보십시오! +### Who am I? You beings may call me PTRN. + +### She thinks she can beat us~ + +### No one will save you. + +### Come and accept your fate. + +### An unruly subject. She needs training. + +### You should consider your actions and their consequences~ + +### Now now, a mortal should know her place! + +### Why don't we turn the tables? + +### It'll be fun seeing you squirm~ + +### We are the keepers of balance. + +### Do not mess with us! + +### I shall take you for myself~ + +### You are no match for my SPL! + +### That wasn't supposed to happen. + +### You won't get me! + +### Nice try! + +### My grandma is tougher than you! + +### Restrain me. + +### Play with me. + +### Lock me up. + +### This won't work. + +### I don't play with young ones. + +### Oh, a lost toy! + +### Ouch! + +### I am stronger than that! + +### That hurts! + +### Nice party trick! + +### Oh, shiny! + +### You won't get away! + +### You can't get away! + +### You are helpless now! + +### Tis but a scratch! + +### Give up! + +### Are you hiding?! + +### You are my pet now! + +### Yoink! + +### You can't get out now! + +### Ah... my SPL... + +### I will be free... even if it takes me a thousand years! + +### Release me you pathetic creature! + +### I will not be contained! + +### Oh no, whatever shall I do! + +### I will be back, mortal! + +### You will never trap me! + +### I yearn for a challenging puzzle! + +### Show me your strongest restraints! + +### I could probably escape anything. + +### Come here my plaything~ + +### Mortals are my favorite toy. + +### It's more fun when you resist! + +### Know your place, mortal~ + +### I will bring you to my lair~ + +### Mortals shouldn't have too much freedom~ + +### Mortals should keep their hands to themselves~ + +### Yes, yes, run away! + +### I like your fighting spirit! + +### You may be weak, but this is quite entertaining~ + +### Dragons are the true heirs of magic. + +### Your magic was stolen from us! + +### This world is ours! OURS! + +### Look what you need to match only a fraction of my power! + +### My treasure! + +### Now is my opportunity! I will have you for myself~ + +### So weak! + +### I have you now~ + +Not so fast~ +그렇게 빠르지 않아~ +### Can't handle it? + +### Ooh shiny! + +### Now you're mine! + +### Bow before me, for I am PTRN! + +### A mortal can't stop us! + +### No one will save you, mortal. + +### I will stop her! + +### Bow down before our might! + +### Dragons are the true rulers of this world! + +### We were destined for greatness until you came along! + +### We are the the true heirs of magic! + +### Hehe~ + +### *chuckles* + +### By the power of SPL! + +### I have failed! + +### Oh no, it's an adventurer! + +### They've come for me! + +### It wasn't my fault! + +### Ready for service! + +### I was sent here to... accompany you, yes! + +### How may I assist you? + +### Do my eyes deceive me, or do I see a sinner? + +### My job is to punish mortals~ + +### Would you hold still? I need to... check something~ + +Cast your last pathetic spell, human. +한심한 마지막 주문을 걸어라, 인간아. +Your magic is weak, human. +당신의 마법은 약합니다, 인간. +It tickles, hehe! +간지러워, 헤헤! + + +### Let's see you face my SPL~ + +### You won't escape my SPL that easily! + +Not the edging training! Anything but that! +가장자리 수련 말고! 뭐든지! +Forgive me! +용서 해줘! +No! Don't punish me! +안돼! 벌주지마! +You look like you've got style... +당신은 스타일이 있는 것 같군요... +I could learn a thing or two from you! +나는 당신에게서 한두 가지를 배울 수 있습니다! +Mind if I just, um, watch? +그냥, 음, 지켜봐도 될까요? +Look, a new recruit! +봐봐, 신병이야! +I'll teach you a thing or two! +내가 한두 가지 가르쳐 줄게! +Let's test your manners~ +매너를 시험해 보자~ +Having fun there? +거기 재미있어? +It's time for your training. +당신의 훈련 시간입니다. +You need to be taught some manners, maid. +예절 좀 가르쳐야지, 메이드. +Good girl. I'll take that to the storage room. +잘했어. 창고로 가져갈게. +I'll be taking those. +내가 가져갈게. +### Who the hell are you? + +Oh, you're approaching me? +아, 나한테 접근하는거야? +You've gotten yourself into a big mess. +당신은 큰 혼란에 빠졌습니다. +You're going to regret that. +당신은 그것을 후회하게 될 것입니다. +A maid uses magic only when told! +메이드는 말만 하면 마법을 쓴다! +I look forward to plugging that mouth of yours. +당신의 입을 막는 것을 기대합니다. +How unruly... What a pain. +얼마나 무질서한가... 얼마나 고통스러운가. +Put that away! +그거 치워! +That's off limits. You need to be punished! +그건 금지야. 벌을 받아야 해! +Thief! Get her! +도둑! 잡아! +Yikes! I'm calling backup! +이크! 백업을 부를게! +Hold still~ +가만히 있어~ +Your tricks won't work on me. +당신의 트릭은 나에게 통하지 않을 것입니다. +Oof... You got me. +으악... 당신이 날 잡았다. +It's over. +끝났어. +Nice one. +좋다. +You missed! +놓쳤어! +I'll hand you over when I'm done with you. +끝나면 넘겨줄게. +Hmph. Stay down. +흠. 가만히 있어. +Give me that. +그걸 줘. +### Mistress PTRN, reporting for duty. + +### No time to waste. + +### Looks like the reports are correct. Stop her! + +### Moving in to assist. + +### You need to be taught a lesson, adventurer. + +### We have a mutual protection contract. Suffice to say, you've violated it. + +### We defend our partners, unlike some people. + +### Target sighted. Taking her down. + +### Our influence is everywhere~ + +### We have orders to stop you! + +### You really think you're special, huh? + +### Combat formation bravo. + +### Ah! Forgive me! + +I'm sorry! I didn't mean to break that vase! +미안해! 그 꽃병을 깨려고 한 건 아니었어! +I won't do it again, I swear! +다시는 그러지 않겠다, 맹세한다! +Please no! I don't want the edging training again! +제발 안돼! 다시는 테두리 훈련을 원하지 않아! +Don't you need a bodyguard, miss? +경호원이 필요하지 않으세요, 아가씨? +Won't you train me, miss? +저를 훈련시키지 않으시겠습니까, 아가씨? +I've been a bad girl... +나쁜 여자였어... +Miss, your uniform is dirty... +아가씨, 교복이 더럽네요... +Why hello miss... +왜 안녕 미스... +Let me fix your outfit... +옷 좀 고쳐주세요... +Hmm, do I need to tighten those? +흠, 이것들을 조여야 합니까? +M-miss... I was told to bring you somewhere... +여보...어디로 데려가라고 했는데... +Umm, miss, you're supposed to report to the head maid... +음, 아가씨, 메이드장에게 보고해야지... +Thanks for picking up. +데리러 와줘서 고마워. +I'll take those to the head maid! +내가 그것을 메이드장에게 가져갈게! +### Someone help! + +Who are you!? +누구세요!? +Oh no! +안 돼! +Miss! You're not allowed to cast that! +미스! 당신은 그것을 캐스팅 할 수 없습니다! +Miss, I have to report that! +아가씨, 신고해야 해요! +Eeep! +윽! +Miss, that's reserved for the head maid! +아가씨, 그건 메이드장 전용입니다! +Thief! I'm reporting this! +도둑! 신고할게! +Oh no! I have to report this! +안돼! 이건 신고해야 해! +I got you! I got you! +내가 잡았어! 내가 잡았어! +Remember your training, remember your training... +훈련을 기억해, 훈련을 기억해... +You're filthy! +더러워! +Hold still... +가만히 있어... +Stay calm... +침착해... +I'll lead you to your cell... +당신을 감방으로 안내하겠습니다... +Come on! +어서 해봐요! +I need to take this... +이거 가져가야지... +I'm sorry... +죄송합니다... +### *Salutes* PTRN reporting for service! + +### I'll help! + +### Stop her! + +### Please be gentle! + +### Ahhh! Stop it! + +### Don't touch her! + +### Wait, you can't do that! + +### Me? Help? Right! + +### I'm sorry miss... + +### I was ordered to capture you... please don't resist. + +### I-I'm coming! + +### Please surrender, miss! + +### I'll just stay here! + +### Loading SPL! + +### Blast... this thing always jams. + +### That thing... it scares me. + +### Please no! I don't want the pleasure training again! + +### Say hello to my little friend! + +### This is where I'd apply my melee training... if I had any! + +### Step back a bit, this isn't fair! + +### Oh yeah? Two can play at that game! + +### Don't bring magic to a gunfight! + +### Didn't think this through, did you? + +### Grenade!!! + +### What's this 'melee' you speak of? + +### What terrible aim! + +### I am bulletproof! + +### Marksman PTRN reporting for service! + +### Opening fire! + +### I'll cover you! + +### Providing cover fire! + +### Cover me, I'm going in! + +### Commence overwatch! + +### Submit to my SPL. + +### Ack! How inelegant! + +I'll be heading out... +난 나갈게... +Looks like I'll be taking my leave. +나 이만 물러날 것 같네. +Looks like I'll be reporting you~ +신고할 것 같네요~ +I was wrong about you. +당신에 대해 내가 틀렸어. +Perhaps you should take my place. +어쩌면 네가 내 자리를 맡아야 할지도 몰라. +Why don't you try being in charge? +당신이 책임자가 되어보는 건 어때요? +Come now, it's time for training. +자, 훈련할 시간이다. +Do you need to be punished? +처벌을 받아야 합니까? +It's time for a test. +시험 시간이야. +A maid remains quiet until asked. +메이드는 물을 때까지 조용히 있습니다. +Come with me. I will train you personally. +나와 함께 가자. 내가 너를 개인적으로 훈련시킬 것이다. +You need to work on your ladylike manners. +당신은 당신의 숙녀다운 매너에 노력해야 합니다. +Good girl, finding lost items. +착한 소녀, 분실물 찾기. +I do not give you permmission to leave. +나는 당신에게 떠나는 것을 허락하지 않습니다. +### Seems I will have to get my hands dirty. + +Do you know who I am? +내가 누군지 알아? +You need to learn some manners! +매너를 배워야 해! +How rude! +얼마나 무례! +There is a more proper way to cast spells... +주문을 거는 더 적절한 방법이 있을 텐데... +Perhaps you need to receive some gag training. +아마도 개그 훈련을 받아야 할 것 같습니다. +You lack discipline, and self-control. +당신은 규율과 자제력이 부족합니다. +Do not use what belongs to others. +다른 사람의 것을 사용하지 마십시오. +A good maid pleads only to her mistress. +좋은 시녀는 여주인에게만 간청합니다. +I will personally attend to your act of disgrace. +나는 당신의 불명예를 개인적으로 돌볼 것입니다. +An unruly pest. +제멋대로인 해충. +Checkmate. +장군. +Like a novice. +초보자처럼. +...Nice one. +...좋다. +Enjoy yourself, dear~ +즐거워라, 얘야~ +Hmph. Nice. +흥. 좋다. +Not even close. +근처에도 안. +I'll be taking you to your cell personally~ +직접 감방으로 모셔다 드릴께요~ +Amateur. +아마추어. +Bad girl. You need discipline. +나쁜 여자야. 규율이 필요해. +I'll be keeping the keys. +열쇠는 내가 맡을게. +### Hmm. You may call me Head Maid PTRN. + +### Looks like we have a guest. + +### I'll be gentle, I promise~ + +### Know your place, dear~ + +### Good girls keep their hands to themselves. + +### You broke the rules, now you'll face the consequences. + +### Hands off our partners. + +### Looks like you've made a few enemies along the way. + +### I won't let you interrupt our plans. + +### Excuse me, we were holding a meeting~ + +### Don't get ahead of yourself. + +### I'll do this myself. + +### I'll support from the rear. + +### Whoops! That wasn't supposed to happen... + +Looks like I've earned some punishment... +벌을 좀 받은 것 같은데... +I'll turn you into a newt! If you don't stop me... +널 도롱뇽으로 만들어줄게! 날 말리지 않으면... +Don't let me get away~ +떠나지마~ +Perhaps you're not so bad after all~ +어쩌면 당신은 그렇게 나쁘지 않을지도 몰라요~ +Why don't you have a little fun... with me? +나랑 좀 놀아주는 게 어때? +Come and get me... +이리와 나를 데리러... +I must say, you've got me under your spell~ +내가 말해야 겠어, 당신은 당신의 주문에 걸렸습니다 ~ +Why aren't you a pretty one... +왜 안 예뻐... +I've got to kiss those tender lips of yours~ +그 부드러운 너의 입술에 키스해야겠어~ +Having fun, little lady? +재미있니, 아가씨? +I'm going to have so much fun with you! +나는 당신과 함께 너무 재미있을 것입니다! +Look at you, pretty and free! +당신을 봐, 예쁘고 자유로워! +Must have misplaced it... +잘못 놓았나봐... +Those are mine! +그건 내 꺼야! +### Well well, what do we have here? + +That's not very nice! +별로 좋지 않아! +Curse you! +당신을 저주! +I'll turn you into a newt! +널 도롱뇽으로 만들어줄게! +Oh, so you've got a spellbook. What's it written in, curse-ive? +아, 마법책이 있군요. 뭐라고 적힌 건가요, 욕설? +Snap, crackle, and pop! +찰칵, 딱딱, 펑! +Looks like I need to seal that foul mouth of yours. +그 더러운 입을 봉인해야 할 것 같군. +### Put that toy away~ + +You'll be praying for freedom soon, my dear~ +너는 곧 자유를 위해 기도하게 될거야, 얘야~ +Oh, breaking into my collection, are you? +오, 내 수집품에 침입한 거지? +Even I wouldn't do such a thing! +나도 그런 짓은 안 할거야! +Witch way to the jail, you say? +감옥으로 가는 마녀의 길이라고요? +Hands off! +손 떼! +Now I got you. +이제 내가 잡았어. +Hmph. +흠. +You've got a lot to learn~ +배울게 많구나~ +You'll be coming with me! +당신은 나와 함께 갈거야! +I'll be yanking your chain~ +체인을 잡아당겨줄게~ +I'll be taking this~ +이거 가져갈게~ +### There, nice and tight dear~ + +### I am the great witch PTRN! + +### Noooo Fred! *grumble* you'll pay for this! + +### Where is that apprentice when you need her... + +I don't have time for this. +이럴 시간 없어. +### Be still, worm. + +### Hands off~! + +### Would you like a taste? + +### Looks like I've found my test subject~ + +### Another test subject! + +### I want her! + +### She's a cute one! + +### Oh no you don't? + +### I'll make you my pet! + +### Tsk tsk, you won't get away! + +### I cast SPL! No, wait... + +### You're just too cute... let me play with you a bit! + +### Come, come closer! I'll be gentle~ + +### Ooh, you just HAVE to be mine! + +### Come, come!... no, not like that. Well, MAYBE like that. + +### My GOODNESS, you're adorable!... c'mere~! + +### You wouldn't happen to be... ticklish? + +### Hold still! I promise it'll be fun. + +### Too much chanting, not enough giggling... let's fix that! + +### What's that? 'Gag me, please'? Gladly! + +### A cute captive AND a spellbook to study? Is it Christmas already?! + +### He~ey, that was mine! + +### Going somewhere, are we? + +### No, I like you right where you are. + +### Goodness, look at you squirm... + +### Oh!... my, you're slippery! + +### Not close enough! + +### My, my, you look too cute in that... + +### I am Stela. But to you, sweetie? Call me Mistress. + +### My FROG!... suppose I need a new familiar... *eyes you with interest* + +### Come closer, I'll be gentle~ + +### Why don't we have a little talk~ + +### My, my, you look too cute... + +### I like you. I'll save you a spot at home~ + +### I cast, umm, SPL! + +### I cast Silence! No, wait-- + +I promise I'll be back later! +나중에 다시 오겠다고 약속할게! +I didn't do anything wrong! +나는 아무 잘못도 하지 않았어! +I won't get in your way, miss! +방해하지 않겠습니다, 아가씨! +Take me as your student, miss! +저를 학생으로 받아주세요, 아가씨! +Won't you teach me? +가르쳐주지 않을래? +I wish to study under your wisdom! +당신의 지혜 아래에서 공부하고 싶습니다! +Mind if I play with you a bit? +나랑 좀 놀아도 될까요? +Oooh! My new friend! +오오! 내 새 친구! +My mistress told me to give you a good time... +내 여주인공이 너에게 좋은 시간을 주라고 했어... +Hehe, having fun? +헤헤, 재미있어? +Miss, won't you come? +아가씨, 안 오세요? +Hey, you're free to play, right~? +야, 놀아도 상관없지~? +Hey, uh, give that back... (blushes) +이봐, 어, 돌려줘... (얼굴을 붉히며) +Um, you have to return those! +음, 그것들을 돌려줘야 해! +### Um! You're not supposed to be here! + +Help me! +도와주세요! +Somebody help! +누가 도와줘! +A battle of wits, huh? +지력의 싸움, 응? +You underestimate my power! +넌 내 힘을 과소평가하고 있어! +I'll show you true skill! +진정한 실력을 보여주겠어! +Please put that down... +그거 내려주세요... +Hey, I used to pray at that shrine... +저기, 그 신사에서 참배를 했었는데... +Hey, my mistress won't appreciate you taking those... +이봐, 내 여주인은 당신이 그것들을 가져가는 것을 좋아하지 않을 것입니다... +The horror! +공포! +You're supposed to be in jail! +넌 감옥에 있어야 해! +Stay with me please. +제발 나와 함께있어. +I got it! +알겠어요! +Be gentle, please! +부드럽게 해주세요! +I did it! +내가 해냈어! +Hey, no fair! +이봐, 공평하지 않아! +Close one! +하나 닫아! +Come along~ +이리와~ +Come here please! +여기에, 제발! +Hah! I'm a genius! +하! 난 천재야! +I'm sorry about this... +미안해, 이거... +### Nice to meet you. I'm PTRN! + +### Don't hurt me! + +### I have classes to attend! + +### There goes my perfect attendance record... + +### What's going on!? + +### I'll save you, Mistress! + +### Me? Capture her? Okay mistress... + +### Okay miss, I'll do that... + +### But he's going to tie me up... + +### Be careful! + +### That's it! You made me mad! + +### I'll just... go. + +### Rise, my minions! + +### ...Hello? Can anyone hear me? + +Sticks and stones may break my bones... but you'll never catch me! +막대기와 돌이 내 뼈를 부러뜨릴 수 있지만... 당신은 결코 나를 잡지 못할 것입니다! +Got a bone to pick with me? +나와 함께 고를 뼈가 있습니까? +I must make my escape! +난 탈출해야 해! +...I need a strong hand. +...강한 손이 필요해. +Ouch, I hit my funny bone... won't you help? +아야, 내 웃긴 뼈를 때렸어... 도와주지 않을래? +Bone appetit~ +식탐~ +I've got a bone to pick with you! +나는 당신과 함께 골라야 할 뼈가 있습니다! +Hey bonehead! What's up? +이봐 멍청아! 무슨 일이야? +Finally, something to toy with after working myself to the bone... +마지막으로, 뼛속까지 노력한 후에 가지고 놀 수 있는 것이... +I find your struggling quite humerus. +나는 당신의 고군분투하는 상완골을 찾습니다. +Come with me, I'll take you someplace grand... +나랑 같이 가, 내가 널 멋진 곳으로 데려다 줄게... +Looks like I get a bone-us! +내가 뼈를 얻는 것 같아! +You're getting under my skin... +당신은 내 피부 아래 점점 ... +Thought you were making a marrow escape, eh? +당신이 골수 탈출을 하고 있다고 생각했습니까? +### I've got a bone to pick with you~ + +You numskull! +이 numskull! +You've got a lot of spine to fight me! +당신은 나와 싸울 수 있는 많은 척추를 가지고 있습니다! +You don't have a leg to stand on... +당신은 서있을 다리가 없습니다 ... +Magic... I feel it in my bones... +마법... 뼛속까지 느껴져... +You've made a grave mistake! +당신은 중대한 실수를 저질렀습니다! +Your spells are pathetic, I'm cracking up~ +너의 주문은 한심하다, 내가 깨겠다~ +You've made a bone-a fide error. +당신은 뼈아픈 실수를 저질렀습니다. +Defiling the shrines... that's where I jaw the line! +사당을 더럽히다니... 내가 턱을 괴는 곳이야! +There's a skele-tonne of things in there and none of them are yours! +거기에는 해골 톤의 물건이 있고 그 중 어느 것도 당신 것이 아닙니다! +You're bad to the bone... +넌 뼛속까지 나빠... +Looks like you're bone to be wild, eh? +당신은 야생에 뼈가있는 것 같습니까? +That'll leave a mark... +그럼 자국이 남겠지... +You're mine now! +넌 지금부터 내거야! +Hold still you bonehead! +가만히 있어라 이 멍청아! +Hah! Such nerve... +하! 이런 신경질... +Make sure that's nice and tight... +그게 멋지고 빡빡한지 확인하세요... +### Spirits whisper my name in hushed tones as I, PTRN, make my appearance! + +### My rule will last centuries... just watch! + +### I will find the answer, even if I die trying. Except I can't, haha! + +### I've got eyes on the back of my skull... + +### You are SO dead to me... + +### What did you just say to me? + +### That's my friend you bonehead! + +### Did you really think I wouldn't see through that? + +### *yawns* Alright alright... + +### Stand straight! + +### Why don't you bend the knee... + +### Who goes there? + +### SPL... + +### Can't... Move... + +### Tight... + +### This... is... fun... + +Scary... +무서운... +Run... Away... +도망쳐...저리... +Play... with... me... +나랑 놀자... +Please... +제발... +Command... Me... +사령부... 나... +Cute... Girl... +귀여운 소녀... +Helpless... +어찌할 수 없는... +Take... +가져가다... +Mine... +내 거... +Shiny... +빛나는... +Intruder... +침입자... +Brains... +두뇌... +Squishy... +스퀴시... +Rude... +무례한... +Mean... +평균... +Ouch... +아야... +Pretty... Lights... +예쁜... 조명... +Sparkles... +반짝반짝... +It... Burns... +불타고있다... +Hey... +여기요... +Defiler... +수비수... +Thief... +도둑... +Give... Hug... +안아 주다... +...Hug... +...껴안다... +### Got... you... + +It's... Cold... +춥습니다... +Friend... +친구... +Come... Back... +돌아와... +### Why... Not... + +### Hee... + +### Ha... + +...Prisoner. +...죄인. +...Get over here... +...이리 와... +...Got you. +...잡았다. +...Shiny... +...빛나는... +...Secure... +...안전한... +### *Her burial cloth reads PTRN* + +### Get her... + +### Must... hug... + +### Come... back... + +### Stop... + +### Come... here... + +### Give... hugs... + +### Must... help... + +### Must... protect... + +### Save... friend... + +The weapon requires power from an Ancient Crystal to function. +무기가 작동하려면 고대 수정의 힘이 필요합니다. +Target an enemy: Attack with Dragonslaver. Target a tile: Spend 8 charge to launch binding belts +적을 대상으로 지정: Dragonslaver로 공격합니다. 타일을 목표로 하십시오: 바인딩 벨트를 시작하려면 8 충전을 소비하십시오. +25 charge to enter Slime Form for 25 turns, and create slime around yourself. +25턴 동안 슬라임 폼에 들어가고, 주변에 슬라임을 생성하려면 25 충전하세요. +50 charge to reduce mana cost of next fire, earth, air, and water spell by 50 (once for each element) +50 충전으로 다음 불, 대지, 공기, 물 주문의 마나 비용을 50으로 줄입니다(각 요소당 한 번) +25 charge to disarm a target for 8 turns, rendering them unable to attack. +25 충전으로 대상을 8턴 동안 무장 해제하여 공격할 수 없게 만듭니다. +5 charge (+2.5 per charge) to channel and fire a beam that deals 30 + 3/charge electric damage, or 90 at max charge. +30 + 3/충전 전기 손상 또는 최대 충전 시 90의 전기 피해를 입히는 빔을 채널링하고 발사하려면 5회 충전(충전당 +2.5회)합니다. +### 10 charge to fire a blast that deals 25 electric damage. + +50 charge to fire an arrow that enrages a target. +표적을 화나게 하는 화살을 발사하려면 50회 충전해야 합니다. +### 50 charge: Free nearby allies and disrobe enemies, increasing charm damage by 100% and removing 100 armor. + +Create a '+' shaped pool of slime that deals 35 glue damage per hit +타격당 35의 접착제 피해를 입히는 '+' 모양의 슬라임 웅덩이를 만듭니다. +Ignite torches and nearby objects +횃불과 주변 물체에 불을 붙입니다. +### Hit a cracked tile. If there is empty space or cracks on the opposite side, it breaks. + +### Preferences + +### Preferences 2 + +### Multiclass + +### Game-Changing + +### Restriction + +### Training + +### Combat + +### Kinks + +### Senses + +Damage and Resists +손상 및 저항 +### Spell Components + +### Threats + +World Generation +세계 세대 +Starting Scenario +시나리오 시작 +Unlockable +잠금 해제 가능 + + +You hand over your weapon reluctantly... +마지못해 무기를 내밀고... + + +(Leave) +(떠나다) +### (...) + +(The SPEAKER frowns)|Don't lie to me. +(화자가 눈살을 찌푸린다)|거짓말하지 마. +(The SPEAKER looks puzzled)|That doesn't seem right... +(발표자가 의아해 보인다)|그건 옳지 않은 것 같은데... +(The SPEAKER chuckles)|What a cute lie. +(발표자 웃음)|정말 귀여운 거짓말이군요. +(The SPEAKER beeps)|Vital signs indicate dishonesty. +(SPEAKER 신호음)|활력 징후는 부정직함을 나타냅니다. + + +(The SPEAKER furrows her brow)|...Excuse me? +(SPEAKER 가 눈썹을 찌푸리며)|...실례합니다. + + +(The SPEAKER tilts her head)|Right, sorry. +(SPEAKER 가 고개를 기울인다)|맞아, 미안해. +(The SPEAKER blushes deeply)|I'm... I'm sorry! Please carry on... +(SPEAKER 가 얼굴을 붉히며)|저...미안합니다! 계속해 주세요... +(The SPEAKER smiles)|Keep up the good work, girl. +(SPEAKER 가 웃는다)|계속 잘 하세요, 아가씨. +(The SPEAKER beeps)|Vital signs indicate honesty. Carry on. +(SPEAKER 신호음)|활력 징후는 정직함을 나타냅니다. 계속하십시오. + + +(The SPEAKER smiles)|Good girl. +(SPEAKER 가 웃는다)|잘했어. +(The SPEAKER smiles)|That's a good girl. +(SPEAKER 가 웃는다)|착한 여자야. +(The SPEAKER smiles)|Thank you. +(SPEAKER 미소)|감사합니다. +(The SPEAKER beeps)|Thank you for complying. +(SPEAKER 가 삐 소리를 낸다)|따라주셔서 감사합니다. + + +(The SPEAKER frowns)|Looks like you'll need to be punished. Get her! +(SPEAKER 가 눈살을 찌푸린다)|처벌을 받아야 할 것 같습니다. 그녀를 잡아요! +(The SPEAKER looks Embarrassed)|Then... then... uh... someone stop her! +(화자가 당황한 듯)|그럼...그럼...어...누군가 말려! +(The SPEAKER grins)|Then allow me to personally show you the rules. +(SPEAKER 가 웃는다)|그럼 제가 개인적으로 규칙을 보여드리겠습니다. +### (The SPEAKER cracks her knuckles)|Finally, I get to have some fun~ + +(The SPEAKER beeps)|Subject is resisting. Begin capture protocol. +(SPEAKER 가 삐 소리를 냄)|피험자가 저항하고 있습니다. 캡처 프로토콜을 시작합니다. + + +(The SPEAKER calls at you)|You're not supposed to be carrying a weapon.|Hand it over. +(SPEAKER 가 당신을 부릅니다)|당신은 무기를 들고 있으면 안 됩니다.|이리 주세요. +(The SPEAKER approaches you)|Contraband detected. Initiating confiscation.|Please comply. +(SPEAKER 가 다가온다)|밀수품이 감지되었습니다. 몰수를 시작합니다.|따라주세요. +### (The SPEAKER blushes)|Umm, miss, I see that you have a weapon there,|could you maybe hand it over? + +### (The SPEAKER smiles at you)|Be a good girl and hand that weapon over,|would you? + +### (The SPEAKER grins and cracks her knuckles)|Are you planning to fight anybody with that?|Or are you gonna hand it over? + +Yes, miss... (Currently held weapon will be lost) +네, 아가씨... (현재 들고 있는 무기는 사라집니다) +Mmph... (Nod politely) (Currently held weapon will be lost) +음... (공손하게 고개를 끄덕인다) (현재 들고 있는 무기는 사라진다) +No, I refuse! +아니요, 거절합니다! +Mmph! (Shake your head) +음! (고개를 흔든다) +The Head Maid asked me to retrieve it. +교장님께서 회수해 달라고 하셨어요. +My mistress needs it for a special spell. +내 여주인이 특별한 주문을 위해 필요해. +It is an offering to the goddess of Elements. +원소의 여신에게 바치는 제물입니다. +It's just a prop for a costume. +의상 소품일 뿐이야. +Are you questioning me? I'm a dragonslayer. +나한테 묻느냐? 나는 용사냥꾼이다. + + +(Continue...) +(계속하다...) + + +(The SPEAKER approaches you in your cell)|Well well, what do we have here? A new guest?|Perhaps I should give you a rundown of your new life~ +(SPEAKER 가 당신의 감방에서 당신에게 접근합니다)|글쎄요, 우리는 무엇을 가지고 있습니까? 새로운 손님?|당신의 새로운 삶에 대한 개요를 알려줘야 할 것 같습니다~ + + +(The SPEAKER chuckles)|Don't tell me you seriously think we're letting you go?|You broke the rules, ignored the warnings.|Your new job is to make the people here happy. +(발표자 웃음)|우리가 당신을 놓아줄 거라고 진지하게 생각하지 말아요?|당신은 규칙을 어겼고 경고를 무시했습니다.|당신의 새로운 임무는 여기 사람들을 행복하게 만드는 것입니다. +(The SPEAKER chuckles)|Hah, looks like you've got lots of training ahead of you.|Soon you'll have too much pleasure for your own good~ +(SPEAKER 웃음)|하, 앞으로 훈련이 많이 남았나 보군요.|곧 당신은 자신의 이익을 위해 너무 많은 즐거움을 갖게 될 것입니다~ +(The SPEAKER giggles)|Don't worry, you'll come to enjoy it soon enough. +(SPEAKER 낄낄거림)|걱정마, 곧 즐기게 될거야. +(The SPEAKER smiles)|Heh, looks like you'll be fitting right in. +(SPEAKER 가 웃는다)|헤, 잘 어울릴 것 같군요. + + +(The SPEAKER chuckles)|You're probably wondering what's in store for you.|It's simple: You behave and do as you're told.|Eventually you will get to roam around.|Don't you dare try to steal anything. +(발표자 웃음)|당신은 아마 당신을 위해 무엇이 준비되어 있는지 궁금할 것입니다.|그것은 간단합니다: 당신은 당신이 시키는 대로 행동하고 행합니다.|결국 당신은 돌아다니게 될 것입니다.|감히 훔치려 하지 마십시오 아무것. +### (The SPEAKER chuckles)|Feisty, aren't you?|Looks like it's going to be an extended stay for you~ + +(The SPEAKER giggles and returns to her work) +(SPEAKER 가 낄낄거리며 일하러 돌아간다) +### (The SPEAKER smiles)|Looks like you'll get the hang of it pretty quickly! + +(New life?) +(새로운 삶?) +(Let her continue) +(계속하자) + + +(Pout at her) +(그녀에게 삐죽) +You can't make me do that! +당신은 내가 그렇게 할 수 없습니다! +(Scream into your gag) +(개그 속으로 비명) +That sounds alright... +괜찮아요... +(Moan into your gag and giggle) +(재갈을 물고 신음하며 킥킥 웃는다) + + +(Glare at her) +(그녀를 노려본다) +Let me out this instant! +이제 당장 나가게 해줘! +(Scream into your gag uselessly) +(쓸데없이 개그에 소리쳐) +I will be a good girl! +나는 좋은 여자가 될거야! +(Giggle and wiggle your body) +(킥킥 몸을 흔들며) + + + + +(The SPEAKER approaches you in your cell)|Back again, are we? Silly girl.|You know we don't take no for an answer. +(SPEAKER 가 당신의 감방에서 당신에게 접근합니다)|다시 돌아왔습니까? 바보 같은 여자.|우리는 대답을 거절하지 않는다는 것을 알고 있습니다. + + +(The SPEAKER smiles back)|Oh, this is a game to you?|Then perhaps I should make it funner for you...|(She leaves and returns with some toys...)|Now hold still! +(화자가 미소를 지으며 대답한다)|오, 이건 너에게 게임이야?|그럼 내가 너를 위해 더 재미있게 만들어야 할 것 같은데...|(그녀는 장난감을 가지고 떠났다가 돌아온다...)|이제 가만히 있어! +(The SPEAKER frowns)|I know exactly what you need... +(SPEAKER 가 눈살을 찌푸린다)|당신에게 필요한 것이 무엇인지 정확히 알고 있습니다... +(The SPEAKER smiles back)|I'm glad you're enjoying yourself.|However, your behavior is still unacceptable.|You need to learn some respect. +(SPEAKER 가 미소를 지으며)|즐거우셨다니 다행입니다.|하지만, 당신의 행동은 여전히 ​​용납할 수 없습니다.|당신은 약간의 존경심을 배울 필요가 있습니다. +(The SPEAKER chuckles)|Looks like you're enjoying your restraints?|Let's make them tighter, shall we? +(SPEAKER 가 웃는다)|자제를 즐기는 것 같나요?|자제를 더 빡세게 합시다, 그렇죠? +(The SPEAKER shrugs)|Well, I hope you learn. +(SPEAKER 가 어깨를 으쓱한다)|글쎄, 나는 네가 배우기를 바란다. +(The SPEAKER looks greedy)|Oh, you have an idea? +(SPEAKER 가 욕심이 많아 보인다)|오, 아이디어가 있어? +(The SPEAKER nods)|I'll put in a good word with you~ +(SPEAKER 가 고개를 끄덕인다)|좋은 말을 해줄게~ +(The SPEAKER shakes her head)|Babe, you know who's going to be blamed|if a max-security prisoner escapes? +(SPEAKER 가 고개를 젓는다)|자기야, 누가 비난을 받을지 알아|만일 최고 보안 죄수가 탈출하면? +### (The SPEAKER shakes her head)|I'll be honest with you, you're not worth the risk.|It'd help if you had more change~ + +(Giggle and smile) +(낄낄 웃으며) +Don't you mean 'more fun'? +'더 재미있다'는 뜻이 아닙니까? +(Giggle and moan) +(낄낄거리며 신음) +(Struggle in your bindings) +(속박 투쟁) +(Pout and glare at her) +(삐죽거리며 그녀를 노려본다) +(Point to the Jailer's coin pouch) +(간수의 동전주머니를 가리키며) +### (Give her BRIBECOST gold) + + + +Why don't you wear it instead? (OFFPERC chance, may aggro) +대신 입는 게 어때? (OFFPERC 기회, 공격적일 수 있음) +(Point to her instead) (OFFPERC chance, may aggro) +(대신 그녀를 가리킨다) (OFFPERC 기회, 공격적일 수 있음) +(The SPEAKER resists and fights back!) +(SPEAKER 가 저항하고 반격한다!) +(The SPEAKER blushes and accepts) +(SPEAKER 가 얼굴을 붉히며 받아들인다) + + + + +(The SPEAKER looks at you curiously)|Oh, you'd be perfect!|Would you please model my latest design? +(SPEAKER 가 당신을 신기하게 바라본다)|오, 당신은 완벽할 거에요!|제 최근 디자인을 모델로 만들어 주시겠어요? +(The SPEAKER holds up a restrictive outfit)|This RESTRAINT might be a tight fit|so hold still while I lace it~ +(SPEAKER 가 제한적인 의상을 들고 있다)|이 RESTRAINT는 딱 맞을 수 있습니다|그러니까 끈을 묶는 동안 가만히 계세요~ +(The SPEAKER giggles)|It looks even better than I thought!|Thank you girl~ +(SPEAKER 낄낄거림)|생각보다 훨씬 좋아보이네요!|고마워요~ +(The SPEAKER sighs and moves away)|Such a shame... +(SPEAKER 가 한숨을 쉬며 멀어진다)|이런 부끄러운 일이... +(The SPEAKER looks disappointed)|Guess I'll find someone else then... +(SPEAKER 가 실망한 듯)|그럼 다른 사람을 찾아봐야지... +(The SPEAKER pouts)|But I just have to see how you look in it! +(SPEAKER 가 삐죽거린다)|하지만 당신이 어떻게 보이는지 봐야겠어요! +(The SPEAKER smiles)|Maybe you'll change your mind when it's on~ +(SPEAKER 가 웃는다)|켜지면 마음이 바뀔지도 몰라~ +(The SPEAKER grumbles)|...fine, but you'd look cute~ +(SPEAKER 투덜거림)|...괜찮아요. 하지만 귀엽게 보이겠죠~ +(The SPEAKER looks bemused)|Changed your mind?|It does look good on you though~ +(SPEAKER 가 어리둥절해 보인다)|마음이 바뀌었나요?|그래도 잘 어울리네요~ +(The SPEAKER snaps her fingers)|(You feel the RESTRAINT magically appear on you)|Aha! Wonderful! You can go now~ +(SPEAKER 가 손가락을 튕긴다)|(제지 장치가 마법처럼 자신에게 나타나는 것을 느낀다)|아하! 멋지군! 이제 가도 돼~ + + +Yes please! +예, 부탁합니다! +(Nod enthusiastically) +(열정적으로 끄덕인다) +(Shake your head) +(악수하다) + + +Of course miss. +물론이죠. +(Nod again) +(다시 고개를 끄덕인다) +Actually, I'd rather not. +사실은 안 하는 게 좋겠어. + + +Fine, I guess. +알았어. +(Giggle and nod) +(낄낄거리며 끄덕인다) +Wait! That's too much! (PERCENT chance to avoid) +잠깐! 너무 많아! (피할 확률이 PERCENT) +(Shake your head and moan) (PERCENT chance to avoid) +(고개를 흔들며 신음) (피할 확률이 PERCENT) + + + + +### (The SPEAKER looks at you with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed? + +(The SPEAKER takes a strange mask from her satchel)|Well, I have the answer right here... +(화자가 가방에서 이상한 가면을 꺼낸다)|글쎄, 바로 여기에 답이 있어... +(The SPEAKER nods seriously)|My hypothesis was correct... +(SPEAKER 가 진지하게 고개를 끄덕인다)|내 가설이 맞았다... +(The SPEAKER frowns)|Such a philistine. Begone. +(화자가 눈살을 찌푸린다)|이런 속물. 물러나. +(The SPEAKER turns away and thinks deeply) +(SPEAKER 가 돌아서며 깊이 생각한다) +(The SPEAKER is lost deep in thought)|Like... become someone else? +(SPEAKER 가 깊은 생각에 잠긴다)|마치... 다른 사람이 되는 것? +(The SPEAKER smiles)|You can be someone else... +(SPEAKER 미소)|넌 다른 사람이 될 수 있어... +(The SPEAKER turns around and keeps pondering)|Hmmm... +(SPEAKER 가 뒤돌아서 계속 생각에 잠긴다)|흠... +(The SPEAKER nods)|I see you are a truth seeker after all. +(SPEAKER 가 고개를 끄덕인다)|당신은 결국 진실을 찾는 사람이군요. +(The SPEAKER lets you go. But then...)|(You feel her clip a RESTRAINT on you from behind!)|There... I shall now observe your behavior. +(SPEAKER 가 당신을 가도록 합니다. 하지만 그때...)|(당신은 그녀의 클립이 뒤에서 당신을 구속하는 것을 느낍니다!)|저기... 이제 당신의 행동을 관찰하겠습니다. + + +Um, sure? +음, 그래? +(Nod seriously) +(진지하게 끄덕인다) +...What? +...뭐? + + +Show me the truth. +나에게 진실을 보여줘. +That's just creepy. +그냥 소름 끼치네요. + + +Fine, you've convinced me. +좋아요, 당신은 저를 설득했습니다. +I don't have time for this. (PERCENT chance to avoid) +이럴 시간이 없어. (피할 확률이 PERCENT) + + + + +### (The SPEAKER smiles as she hides her hands behind her back)|Have you heard of 'sensory deprivation'? + +### (The SPEAKER presents a RESTRAINT)|Well, I have just the thing for you!|It's nice and comfy, and it has earmuffs built in! + +### (The SPEAKER starts pulling the hood over your head)|Let's get you laced in! + +### (The SPEAKER giggles)|Alrighty.|You don't know what you're missing out on~ + +### (The SPEAKER doesn't seem to hear you) + +### (The SPEAKER looks at you with a devious grin)|Oh, but it's so much fun!|You can run around bumping into things!|It's the ultimate adventure! + +### (The SPEAKER chuckles)|Truth be told, I wasn't asking~|Now why don't you kneel for me... + +### (The SPEAKER pouts)|I thought it would be fun... + +### (The SPEAKER surprises you with a crop to the thigh)|(You involuntarily kneel in front of her)|That's better~|Now why don't you say good night~ + +### Of course! I love it! + +(Nod eagerly) +(열심히 끄덕인다) +### I prefer 'situational awareness'. + +### (Shake your head in alarm) + +### Doll me up! + +### Actually, that sounds stifling... + +### That doesn't sound that bad actually... + +(Shake your head and groan) (PERCENT chance to avoid) +(고개를 흔들며 신음) (피할 확률 PERCENT) + + + + +### (The SPEAKER smiles and looks down at you deviously)|Hey there, I have a 'job' for you! + +### (The SPEAKER takes a duster gag from her satchel)|Such a good girl!|So here's what I have for you~|It's a special tool to help keep the place clean. + +### (The SPEAKER grins)|I'm glad we could come to an understanding~|(She takes out a duster gag from her satchel)|Now then, this place is filthy.|Why don't you put this on to help? + +### (The SPEAKER frowns)|Fair enough.|Perhaps you should reconsider your life choices~ + +### (The SPEAKER shrugs)|I'll find someone else... + +### (The SPEAKER reaches out to grab you)|Now now,|You shouldn't skip out on your duties~|(She pulls out a duster gag from her satchel and grins) + +### (The SPEAKER smiles)|Don't be afraid!|(She turns the gag with the round mouth ball clearly visible)|Now open up... + +### (The SPEAKER shrugs)|Fine, I'll get someone else to clean up. + +### (The SPEAKER places the gag in your mouth)|(She then buckles up the straps.)|(You feel a locking mechanism pull the straps in tight...)|Good maid! + +### (The SPEAKER catches you and forces the gag on you)|(You feel it tighten as it locks on securely...)|I don't want to hear it!|Now go and do your job~ + +### I'll do it! + +### I don't like the sound of this. + +Yes miss! +그래 아가씨! +### Actually, maybe not... + +### Okay okay... I'll do it. + +### That gag is far too big! (PERCENT chance to avoid) + + + + + +(The SPEAKER swings an imaginary sword around)|En guar- Oh, you're unarmored!|Do you want to borrow some of mine? +(SPEAKER 가 상상의 검을 휘두른다)|En guar- 오, 당신은 갑옷을 입지 않았군요!|내 것을 좀 빌릴래요? +(The SPEAKER holds up a RESTRAINT)|I found this near an old suit of armor.|I think it's a helmet or something... +(SPEAKER 가 RESTTRAINT를 들어 올린다)|이것은 낡은 갑옷 근처에서 찾았습니다.|투구 같은 것 같은데... +(The SPEAKER winks and locks it on)|I feel much safer already~ +(SPEAKER 가 윙크하고 잠급니다)|이제 훨씬 안전해진 것 같아요~ +(The SPEAKER pouts)|Aww, spoilsport!|(She returns to fighting her imaginary enemies) +(SPEAKER 가 삐죽거린다)|아, 망할 짓이야!|(그녀는 상상의 적과 싸우기 위해 돌아간다) +(The SPEAKER shrugs)|Your loss~ +(SPEAKER 가 어깨를 으쓱한다)|당신의 패배~ +(The SPEAKER grins deviously)|So? It might help...|(The SPEAKER dives at you suddenly!) +(SPEAKER 가 사악하게 웃는다)|그래서? 도움이 될지도...|(SPEAKER 가 갑자기 당신에게 뛰어든다!) +(The SPEAKER giggles)|Close enough, right?|Come on, there's enemies to fight! +(SPEAKER 낄낄거림)|충분히 가깝지, 그렇지?|자, 싸워야 할 적들이 있다! +(The SPEAKER trips over the floor)|AHHHHH!|Maybe I need more protection... +(SPEAKER 가 바닥을 넘어간다)|아아아아아!|보호가 더 필요한 것 같은데... +(The SPEAKER locks it in place quickly)|There, all set for battle now!|(The SPEAKER giggles, cheekily winking at you) +(SPEAKER 가 재빨리 제자리에 고정)|저기, 이제 전투 준비가 모두 끝났습니다!|(SPEAKER 가 낄낄거리며 당신에게 건방진 윙크를 합니다) +(The SPEAKER tightly fastens the muzzle on)|Safe and secure~|(You whimper as the SPEAKER spanks you goodbye) +(SPEAKER 가 총구를 단단히 조입니다)|안전하고 안전합니다~|(SPEAKER 가 당신에게 작별인사를 할 때 당신은 훌쩍거립니다) + + +Extra defense can't hurt... +추가 방어력은 아프지 않아... +(Nod cautiously) +(조심스럽게 끄덕인다) +I'm safe enough. +난 충분히 안전해. + + +A gag? Sounds fun~ +개그? 재밌겠다~ +That's not a helmet! +그건 헬멧이 아니야! + + +Well, it might... +글쎄, 그럴지도... +(Dodge her lunge) (PERCENT chance to avoid) +(돌진을 피함) (피할 확률이 PERCENT) + + + + +(A smirking SPEAKER bumps into you)|So, you're with us now, huh?|I think you need a welcome gift. +(미소 짓는 SPEAKER 가 당신에게 부딪친다)|그래서, 이제 우리와 함께 있군요, 응?|환영 선물이 필요한 것 같아요. +Mmhmm, a gift~|(The SPEAKER leans forward to whisper in your ear)|Is it cold in here, or is it just you? +으음, 선물~|(SPEAKER 가 몸을 앞으로 숙여 귀에 대고 속삭인다)|여기가 추운가요, 아니면 당신만 그런가요? +(You shiver as everything gets colder)|(RESTRAINT forms around you!)|(The SPEAKER blows you a kiss and giggles) +(모든 것이 추워지면서 몸이 떨립니다.)|(RESTRAINT가 주변에 형성됩니다!)|(SPEAKER 가 키스를 날리며 낄낄거립니다.) +(The SPEAKER thinks for a moment)|I really wanted to try this too...|(Sighing, the SPEAKER walks away) +(SPEAKER 가 잠시 생각하다)|나도 이거 해보고 싶었어...|(한숨, SPEAKER 가 가버린다) +(The SPEAKER scowls)|How boring. +(SPEAKER 가 얼굴을 찌푸린다)|얼마나 지루한가. +(The SPEAKER laughs at your protest)|It's so much fun though~|(You feel the temperature drop suddenly) +(당신의 항의에 화자가 웃는다)|그래도 너무 재미있다~|(갑자기 온도가 떨어지는 걸 느낀다) +(The SPEAKER thinks for a moment)|Well, I want to try this anyway~|(You feel the temperature drop suddenly) +(SPEAKER 가 잠시 생각하다)|글쎄, 그래도 해보고 싶어~|(갑자기 온도가 떨어지는 느낌이 든다) +(The temperature returns to normal)|(The SPEAKER seems surprised)|Hmm, that wasn't meant to happen. +(온도가 정상으로 돌아온다)|(SPEAKER 가 놀란 듯하다)|흠, 그럴 리가 없군. +(RESTRAINT solidifies on you as the SPEAKER grins)|It worked! I did it!|Thanks for your, uh, help~ +(RESTRAINT가 당신에게 굳어지고 SPEAKER 가 웃는다)|성공했습니다! 해냈습니다!|도와주셔서 감사합니다~ +(RESTRAINT solidifies on you as the SPEAKER smiles)|Yes! Finally! How's that feel?|(The SPEAKER admires your restraints) +(화자가 미소를 지을 때 자제력이 굳어짐)|네! 드디어! 기분이 어때요?|(화자님이 자제력에 감탄합니다) + + +A gift? +선물? +(Nod warily) +(조심스럽게 끄덕인다) +No thanks. +고맙지 만 사양 할게. + + +Umm... just me? +음... 나만? +Wait, don't make it colder! +잠깐, 더 차갑게 만들지 마! + + +(Shiver and watch as the ice covers you) +(떨고 얼음이 당신을 덮는 것을 지켜보십시오) +(Mutely whimper as the ice covers you) +(얼음이 당신을 덮을 때 조용히 훌쩍) +Ah! T-That's freezing! (PERCENT chance to avoid) +아! 큭-너무 춥네요! (피할 확률이 PERCENT) +(Wriggle to warm up) (PERCENT chance to avoid) +(워밍업을 위해 꿈틀거림) (피할 확률이 PERCENT) + + + + +(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? +(로봇 SPEAKER 가 접근함)|질문: 착한 여자 감지:|제지 필요? +(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? +(SPEAKER 가 삐 소리를 내며 윙윙거린다)|SPEAKER 가 RESTRAINT를 추가합니다.|Acceptable? +(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER 가 주위를 돌며 테이프를 뗀다)|RESTRAINT가 해제되었습니다.|좋은 하루 되세요. +(The SPEAKER buzzes)|Understood. Proceding back to duty. +(SPEAKER 가 윙윙거린다)|알았다. 임무로 돌아가는 중. +(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. +(SPEAKER 가 찰칵 소리를 내며 삐 소리를 냄)|거절이 확인되었습니다.|SPEAKER 가 다시 순찰할 것입니다. +(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. +(SPEAKER 가 윙윙거림)|오류: 답변에 모순이 있습니다.|SPEAKER 가 제한을 추가할 것입니다. +ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. +오류: 수락이 예상됩니다.|문: SPEAKER 가 제한을 추가합니다. +(The SPEAKER makes a whirring noise)|ERROR: SPEAKER out of tape.|Returning to routine. +(SPEAKER 가 윙윙거리는 소리를 냄)|오류: SPEAKER 가 테이프에서 벗어났습니다.|루틴으로 돌아가고 있습니다. +(The SPEAKER launches tape which catches you as you run)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER 가 당신이 달리는 동안 당신을 붙잡는 테이프를 발사합니다)|RESTRAINT가 해제되었습니다.|좋은 하루 되세요. + + +Uh, affirmative? +어, 긍정? +(Nod) +(목례) +Negative. +부정적인. + + +Very acceptable! +매우 수용 가능! +No, I don't want that. +아니, 난 그걸 원하지 않아. + + +If you have to... +해야 한다면... +Go away robot! (PERCENT chance to avoid) +로봇 저리 가! (피할 확률 PERCENT) +(Shake your head rapidly) (PERCENT chance to avoid) +(머리를 빠르게 흔든다) (피할 확률이 PERCENT) + + + + +(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER 가 당신에게 케이블을 쏜다)|RESTRAINT가 해제되었습니다.|좋은 하루 되세요. +(The SPEAKER makes a whirring noise)|ERROR: SPEAKER cable jammed.|Returning to routine. +(SPEAKER에서 윙윙거리는 소리가 납니다.)|오류: SPEAKER 케이블이 걸렸습니다.|루틴으로 돌아가고 있습니다. + + + + + + +(A happy SPEAKER looks at you)|Hey there cutie~|Want to try some scarf bondage? +(행복한 SPEAKER 가 당신을 바라본다)|저기 귀염둥이~|스카프 속박을 해볼래? +(The SPEAKER holds up some scarves)|If you want to try, I've got a few here.|I could give you a RESTRAINT? +(SPEAKER 가 스카프 몇 개를 들고 있다)|관심있으면, 내가 몇 개 갖고 있어.|널 묶어봐도 될까? +(The SPEAKER smiles gently at you as she ties)|I love the silky feeling~|(The SPEAKER tightens all her knots) +(SPEAKER 가 매듭을 지으며 부드럽게 미소짓는다)|매끈한 느낌이 좋아~|(SPEAKER 가 매듭을 조여준다) +(The SPEAKER looks away and nods)|Well... maybe next time. +(발표자가 시선을 돌리고 고개를 끄덕인다)|글쎄... 다음 기회에. +(The SPEAKER shuffles awkwardly)|Oh... well...|Come back if you change your mind~ +(SPEAKER 가 어색하게 뒤섞인다)|아...그럼...|마음이 바뀌면 다시 오세요~ +(The SPEAKER scowls)|Hey, don't back out!|I promise I'll make it comfortable! +(SPEAKER 가 찡그린다)|이봐, 물러서지 마!|편안하게 해줄게 약속할게! +(The SPEAKER frowns)|Too bad, I want to tie someone! +(SPEAKER가 눈살을 찌푸린다)|안타깝지만, 누군가를 묶고 싶어요! +(The SPEAKER drops her scarves)|Aww, really?|I'll go find someone else then... +(SPEAKER 가 스카프를 떨어뜨린다)|아, 정말?|그럼 다른 사람을 찾으러 갈게... +(The SPEAKER beams a smile)|Yay, thank you!|Feels nice, right? +(SPEAKER 가 미소를 짓는다)|예, 감사합니다!|기분이 좋죠? +(The SPEAKER tosses a scarf around you like a lasso)|Not so fast! You cannot escape the fluff! +(SPEAKER 가 올가미처럼 네 주위에 스카프를 던진다)|너무 빠르지 않아! 보풀에서 벗어날 수 없어! + + +Sounds good! +좋아요! +(Nod quickly) +(빠르게 끄덕인다) +Not really. +설마. + + +Please do! +제발! +(Nod and giggle) +(킥킥대며 고개를 끄덕인다) +Not right now. +지금 말고. + + +Well... sure then. +음...좋아요 그럼. +Hey! Stop! (PERCENT chance to avoid) +이봐! 멈춰! (피할 확률 PERCENT) +(Shake your head and whine) (PERCENT chance to avoid) +(고개를 흔들며 칭얼거림) (피할 확률이 PERCENT) + + +### (An excited SPEAKER turns to you)|Eureka, I've done it!|Do you want to see? + +### (The SPEAKER pulls out a pressurized flask)|Behold! A gaseous form of latex!|I've coated the interior with a layer of inert slime to keep it secure.|Here, have a look!|(She holds out the container) + +### (The flask springs a leak)|Oh no! That wasn't supposed to happen!|(The gas crystalizes into a RESTRAINT across your body) + +### (The SPEAKER scoffs)|You'll see... you'll all see! + +(The SPEAKER sighs)|So hard to find good help out here... +(SPEAKER 가 한숨을 쉰다)|여기서 좋은 도움을 찾기가 너무 힘들어... +### (The SPEAKER frowns)|What, do you doubt my results? See for yourself!|(She unscrews the cap) + +### (The green gas starts leaking)|Oh no! It wasn't supposed to do that! + +### (You push her out of the way, but she frowns)|Hmph. This is your fault. + +### (You push her out of the way, but get caught in the cloud yourself)|(The gas crystalizes into a RESTRAINT across your body)|Oh no, that could have been me! + +### (The gas moves toward you, as if by its own will)|(The gas crystalizes into a RESTRAINT across your body)|That wasn't supposed to happen... + +### Seems interesting! + +(Nod slowly) +(천천히 끄덕인다) +### Seems boring. + +### Are you sure this is a good idea? + +### Keep that away from me! + +### I'll stop it! + +### (Run toward her to help) + +### (Run away!) (PERCENT chance to avoid) + + + + + +(A messy looking SPEAKER turns to you)|Hmm, curious. Very curious.|Can you help me with an experiment? +(어지러워 보이는 SPEAKER 가 당신에게 돌아섭니다)|음, 궁금하네요. 매우 궁금하네요.|실험을 도와주실 수 있나요? +(The SPEAKER pulls out a flask)|I isolated some slime, but it's inert.|Would you let me spill some on you? +(SPEAKER 가 플라스크를 꺼낸다.)|점액을 분리했는데 움직이질 않아.|네 몸에 좀 부어봐도 되? +(The SPEAKER tips out the entire flask)|Aha! It's growing again! Fascinating.|(Sticky RESTRAINT clings to you) +(SPEAKER 가 플라스크 전체를 기울인다)|아하! 다시 커지고 있어! 멋져.|(끈적끈적한 구속이 달라붙는다) +(The SPEAKER tuts disapprovingly)|Not one for chemistry, eh? +(SPEAKER 가 혀를 찬다)|화학을 좋아하진 않나보네? +(The SPEAKER glares at you)|You've got no sense of adventure!|For science! +(SPEAKER 가 당신을 노려본다)|당신은 감각이 없어요!|과학을 위해! +Ah, but it'll be quick!|(The SPEAKER begins tipping the flask)|See? It's already moving toward you! +아, 하지만 빨리 될거야!|(SPEAKER 가 플라스크를 기울이기 시작한다)|봐? 이미 너를 향해 움직이고 있어! +(The SPEAKER tosses the slime on you)|(The slime flops off limply)|Ah. Back to the drawing board. +(SPEAKER 가 당신에게 슬라임을 던집니다.)|(슬라임이 철퍽거리며 떨어집니다.)|아. 다시 제도판으로 돌아가야겠네. +(The SPEAKER pours the slime onto you)|That's the spirit girl!|(Sticky RESTRAINT clings to you) +(SPEAKER 가 당신에게 점액을 붓는다)|그 느낌이야!|(끈적끈적한 구속이 당신에게 달라붙는다) +(The SPEAKER tosses the slime on you)|Ha, look, it's alive!|(Sticky RESTRAINT clings to you) +(SPEAKER 가 당신에게 점액을 던진다)|하, 봐, 살아있어!|(끈적끈적한 구속이 당신에게 달라붙는다) + + +Sure. +확신하는. +Absolutely not. +절대 안돼. + + +On me? Sounds fun~ +오 나 말야? 재미있겠다~ +Nope. Not doing that. +아니. 그러지 마. + + +Okay, for science... +좋아, 과학을 위해... +Ah! Don't you dare! (PERCENT chance to avoid) +아! 그러기만 해봐! (피할 확률이 PERCENT) +(Shake your head and whimper) (PERCENT chance to avoid) +(훌쩍거리며 고개를 젓는다) (피할 확률이 PERCENT) + + + + +(A SPEAKER whispers to you)|Ever wonder how wolfgirls feel?|Or why they're so obedient? +(A SPEAKER 가 당신에게 속삭임)|늑대소녀들이 어떻게 느끼는지 궁금한 적이 있나요?|아니면 그들이 왜 그렇게 순종적인지? +(The SPEAKER grins)|I've got a RESTRAINT here~|Wanna give it a try? +(SPEAKER 가 웃는다)|나한테 구속구가 있어요~|한 번 해볼래요? +(The SPEAKER puts on the RESTRAINT)|Perfect. Better behave now~|(The SPEAKER pats your butt) +(SPEAKER 가 구속구를 입힌다)|완벽해. 앞으로 말 잘들으렴~|(SPEAKER 가 엉덩이를 토닥거린다) +(The SPEAKER rolls her eyes)|You've seen wolfgirls, right?|Ah, whatever, go have fun~ +(SPEAKER 가 눈을 굴리며)|늑대소녀본 적 있지?|아, 어쨋든, 잘가~ +(The SPEAKER nods glumly)|Not a fan?|Shame, I am~ +(SPEAKER 가 침울하게 고개를 끄덕인다)|관심없어?|안타깝네 난 있어~ +(The SPEAKER grabs you quickly)|Oh, it's very strict~|And great for being trained... +(SPEAKER 가 당신을 재빨리 붙잡는다)|오, 매우 엄격하다~|그리고 훈련을 받는 것이 좋다... +(The SPEAKER looks at you deviously)|You're going to wear this RESTRAINT,|if you want to or not~ +(SPEAKER 가 당신을 사악하게 바라본다)|넌 이 구속구를 입게 될 거야|원하든 원하지 않든간에 말야~ +(The SPEAKER sulks)|Have it your way then. +(SPEAKER 가 토라짐)|그럼 마음대로 하세요. +(The SPEAKER adds the RESTRAINT)|(You feel her tighten everything before locking it)|Good girl~ +(SPEAKER 가 구속을 추가함)|(그녀가 모든 구속구를 단단하게 조인뒤 잠그는 게 느껴집니다)|착한 아이네~ +(The SPEAKER pushes you to the ground)|I'll make it extra tight for you~|(The RESTRAINT locks tightly onto you) +(SPEAKER 가 널 바닥으로 밀어붙인다)|엄청 꽉 조여줄게~|(RESTRAINT 가 단단하게 조여집니다) + + +Maybe a little~ +조금~ +(Nod excitedly) +(신나게 끄덕인다) +Don't know, don't care. +몰라, 관심 없어. + + +Yes! So much! +네! 엄청요! +That looks too strict! +그건 너무 엄격해 보여요! + + +I- Well- O-Okay~ +나- 음- 오- 알았어~ +(Moan and squirm) +(신음하며 몸부림친다) +I don't want to get stuck! (PERCENT chance to avoid) +갇히고 싶지 않아! (피할 확률이 PERCENT) +(Shake your head worriedly) (PERCENT chance to avoid) +(걱정스럽게 고개를 흔든다) (피할 확률이 PERCENT) + + + + +(A SPEAKER gracefully gestures to you)|So good to see a friendly face~|Care to see some elven goods? +(화자가 우아하게 손짓한다)|친절한 얼굴을 보니 너무 반가워~|엘프 상품 좀 볼래? +(The SPEAKER holds up a RESTRAINT)|These are some of our strictest.|Want to try? +(SPEAKER 가 제지를 들고 있다)|이것들은 우리의 가장 엄격한 것 중 일부입니다.|시도하시겠습니까? +(The SPEAKER smiles sweetly)|Such a good girl~|(The RESTRAINT locks with a loud click) +(SPEAKER 가 상냥하게 웃는다)|착한 여자야~|(큰 소리와 함께 RESTTRAINT가 잠긴다) +(The SPEAKER sagely nods)|As you wish~ +(SPEAKER 가 현명하게 고개를 끄덕인다)|원하는 대로~ +(The SPEAKER frowns briefly)|I understand~ +(SPEAKER 가 짧게 눈살을 찌푸리며)|알겠습니다~ +(The SPEAKER leans closer)|Then you can test their escapability!|(The SPEAKER dives towards you!) +(SPEAKER 가 더 가까이 몸을 기울인다)|그러면 그들의 탈출 가능성을 테스트할 수 있습니다!|(SPEAKER 가 당신을 향해 뛰어듭니다!) +(The SPEAKER shifts her weight back)|I'm afraid I must insist.|(She's gripping a RESTRAINT)|(The SPEAKER dives towards you!) +(SPEAKER 가 체중을 뒤로 이동)|장난을 쳐야겠네요.|(레스트레인트를 움켜쥐고 있습니다)|(SPEAKER 가 당신을 향해 뛰어듭니다!) +(The SPEAKER rolls past harmlessly)|Oh! So fast~ +(SPEAKER 가 무해하게 지나간다)|오! 너무 빨라~ +(The SPEAKER snaps the RESTRAINT on)|There, much better.|Now squirm for me cutie~ +(SPEAKER 가 구속 장치를 찰칵)|거기, 훨씬 나아졌어.|이제 나를 위해 꿈틀거려 귀염둥이~ +(The SPEAKER trips you over)|(Before you can move, the RESTRAINT closes firmly)|Strict, isn't it?~ +(SPEAKER 가 당신을 넘어뜨린다)|(당신이 움직이기도 전에 RESTTRAINT가 단단히 닫힙니다.)|엄격하지 않습니까?~ + + +Of course! +물론! +(Nod happily) +(기쁘게 끄덕인다) +No, thanks. +고맙지 만 사양 할게. + + +Pretty please~ +예뻐주세요~ + + +### Fine... + +(Moan and giggle) +(신음하며 낄낄거린다) +Stop! (PERCENT chance to avoid) +그만! (피할 확률이 PERCENT) + + + + +(A SPEAKER plays with silvery rope)|Hmm, I need to get better with this.|Can I practice on you? +(A SPEAKER play with silvery rope)|흠, 이걸 좀 더 잘해야겠어.|연습해도 될까? +(The SPEAKER grins happily)|Thank you girl~|I'll tie with RESTRAINT then~ +(SPEAKER 가 행복하게 웃는다)|고마워요~|그럼 RESTRAINT로 묶을게요~ +(The SPEAKER binds you tightly)|(The rope is tight, and she's clearly an expert.)|Mmm, not too bad~ +(SPEAKER 가 당신을 단단히 묶습니다.)|(로프가 팽팽하고 그녀는 분명히 전문가입니다.)|음, 나쁘지 않습니다~ +(The SPEAKER pouts indignantly)|Why say yes then?!|(The SPEAKER walks off grumbling) +(SPEAKER 가 화를 내며 입을 삐죽거린다)|그럼 왜 예라고 할까요?!|(SPEAKER 가 투덜거리며 걸어나간다) +(The SPEAKER sighs)|Very well then~ +(SPEAKER 가 한숨을 쉬며)|그럼 좋아요~ +(The SPEAKER pouts indignantly)|Oh no, you don't get out that easy.|You said you'd help! +(SPEAKER 가 화를 내며 입을 삐죽 내밀었다)|오 이런, 그렇게 쉽게 빠져나오지 못하는군.|도와주겠다고 했잖아! +(The SPEAKER smirks)|Ooh, a chance to practice against resistance~|I can't pass that up! +(SPEAKER 가 웃는다)|오, 저항에 맞서 연습할 기회야~|그건 그냥 지나칠 수 없어! +(The SPEAKER can't keep the knots tight)|(Eventually, she gives up)|S-Stupid human... +(SPEAKER는 매듭을 단단히 묶을 수 없습니다)|(결국 그녀는 포기합니다)|S-멍청한 인간... +(The SPEAKER strictly ties you up)|(You can feel she's done this many times)|(She smirks at you as she departs) +(SPEAKER 가 당신을 엄격하게 묶습니다)|(그녀가 이것을 여러 번 했다는 것을 느낄 수 있습니다)|(그녀는 떠날 때 당신에게 히죽 웃습니다) +(The SPEAKER strictly ties you up)|(There's no slack anywhere!)|(She makes a face at you as she leaves) +(SPEAKER는 당신을 엄격하게 묶습니다)|(느슨한 곳이 없습니다!)|(떠나면서 당신에게 얼굴을 찌푸립니다) + + +Any time~ +아무때나~ +I'd rather you didn't. +차라리 그러지 않았으면 좋겠어. + + +Sounds great! +멋지네요! +Actually, I don't want that. +사실, 나는 그것을 원하지 않는다. + + +I'll play along then~ +그럼 같이 놀아줄게~ +(Struggle against her) (PERCENT chance to avoid) +(그녀와 투쟁) (피할 확률 PERCENT) + + + + +(The SPEAKER quickly motions to you)|Hey! Over here!| I got something to show you! +(SPEAKER 가 재빨리 당신을 가리킨다)|이봐! 여기!| 보여줄 게 ​​있어! +(The SPEAKER giggles)|You'll be wearing this~|(A RESTRAINT is in her hands) +(SPEAKER 웃음)|너 이거 입게 될거야~|(억제장치가 그녀의 손에 있다) +(The SPEAKER looks surprised)|Oh, uh, sure!|(They quickly add the RESTRAINT) +(발표자가 놀란 표정을 짓는다)|오, 어, 그렇군요!|(재빨리 구속을 추가합니다) +(The SPEAKER grins sneakily)|I thought you might say that~|But- ahh!|(They drop the item and you slip away) +(SPEAKER 가 살금살금 웃는다)|네가 그렇게 말할 줄 알았는데~|하지만- 아!|(그들이 물건을 떨어뜨리고 너는 미끄러져 나간다) +(The SPEAKER looks angry)|Hey! HEY! I'm talking to-|Ah, forget it. +(SPEAKER 가 화난 듯)|이봐! 이봐! 지금 얘기하고 있는데-|아, 잊어버려. +(The SPEAKER grins sneakily)|I thought you might say that~|But it wasn't a choice... +(SPEAKER 가 살금살금 웃는다)|그렇게 말할 줄 알았는데~|선택이 아니었어... +(The SPEAKER follows you)|Not so fast there~|(She blocks your path) +(SPEAKER 가 당신을 따라옵니다)|그렇게 빠르지 않습니다~|(그녀는 당신의 길을 막습니다) +(The SPEAKER fumbles with the RESTRAINT)|C-Come on, open-|(You quickly walk away) +(SPEAKER 가 구속 장치를 더듬으며)|C-어서, 열어-|(빨리 걸어가세요) +(The SPEAKER adds the RESTRAINT)|Good luck with that one~|(She sounds like she's gloating...) +(화자가 RESTTRAINT를 추가함)|행운을 빌어요~|(화난 것처럼 들리는데...) +(The SPEAKER roughly forces you down)|(Pushing your head down, the RESTRAINT slides on)|(The SPEAKER tugs your hair, then walks away) +(SPEAKER 가 대략적으로 강제로 아래로 내리게 함)|(머리를 내리면 RESTTRAINT가 미끄러짐)|(SPEAKER 가 머리카락을 잡아당긴 다음 걸어갑니다) + + +(Walk over, curiously) +(이상하게 걸어가) +(Don't approach). +(가까이 오지마). +(Don't approach) +(가까이 오지마) + + +Sure! +확신하는! +W-What? No way! +무, 뭐? 안돼! + + +(Let her add the restraint) +(제지 추가하자) +(Moan and nod) +(신음하며 고개를 끄덕인다) + + + + +(The SPEAKER walks over)|You'd make a cute catgirl~|Want help becoming one? +(SPEAKER 가 걸어온다)|귀엽게 캣걸을 만들 수 있겠지~|고양이 소녀가 되는 데 도움이 필요해? +(The SPEAKER grins)|Here, I've got this RESTRAINT.|That'll help! +(SPEAKER 가 웃는다)|여기에 구속 장치가 있습니다.|그게 도움이 될 거에요! +(The SPEAKER gleefully comes closer)|(The RESTRAINT fits snugly)|So adorable! +(SPEAKER 가 유쾌하게 다가온다)|(레스트레인트가 꼭 맞음)|너무 사랑스러워! +(The SPEAKER nods disappointed)|Fair enough~ +(SPEAKER 가 실망하며 고개를 끄덕인다)|괜찮아~ +(The SPEAKER sighs)|Maybe another time~ +(SPEAKER 가 한숨을 쉬며)|다음 기회에~ +(The SPEAKER titters)|It's going on, kitty~ +(SPEAKER 가 큭큭대며)|잘 되고 있어, 고양이~ +(The SPEAKER giggles)|Let's see if you can get away then~|(You see a RESTRAINT in her hand) +(화자 웃음)|그럼 도망칠 수 있는지 보자~|(그녀의 손에 구속 장치가 보인다) +(The SPEAKER whimpers and drops it)|Owwww!|I hit my knee! +(SPEAKER 가 낑낑거리며 떨어뜨린다)|오오오!|무릎을 쳤어요! +(The SPEAKER wiggles happily)|Oh, you're so cute!|Enjoy it~ +(SPEAKER 가 행복하게 꿈틀거림)|오, 너무 귀여워요!|즐기세요~ +(The SPEAKER traps you)|(You feel the RESTRAINT being forced on)|Meow~ +(SPEAKER 가 당신을 가둔다)|(당신은 구속이 강제되는 것을 느낀다)|야옹~ + + +No, not today. +아니, 오늘은 아니야. + + +Yay! +야! +Not like that! +그렇지 않아! + + +Y-Yes miss~ +야-예스~ +(Duck out the way) (PERCENT chance to avoid) +(길 비켜) (피할 확률 PERCENT) + + + + +(A SPEAKER winks at you)|You look like a girl who likes feeling|like a prisoner, am I right? +(A SPEAKER 윙크)|죄수 같은 느낌을 좋아하는 여자 같아 보여요, 맞죠? +(The SPEAKER nods happily)|I knew it! Well, it's your lucky day.|I've got some RESTRAINT for you~ +(SPEAKER 가 행복하게 고개를 끄덕인다)|알고 있었어! 자, 오늘은 너의 행운의 날이야.|너를 위한 구속이 있어~ +(The SPEAKER spins you around)|(You hear the cold metal click shut)|Nice and submissive~ +(SPEAKER 가 당신을 빙글빙글 돌립니다)|(차가운 금속이 닫히는 소리가 들립니다)|착하고 순종적입니다~ +(The SPEAKER shrugs)|It's not for everyone, I guess~ +(SPEAKER 가 어깨를 으쓱한다)|모두를 위한 것은 아닌 것 같아요~ +(The SPEAKER frowns)|Really?|I was so sure... +(SPEAKER 가 눈살을 찌푸린다)|정말요?|확실히... +(The SPEAKER grins maliciously)|I like seeing prisoners though~|And you're right here... +(SPEAKER 가 악의적으로 웃는다)|그래도 죄수를 보는 건 좋아~|그리고 당신은 바로 여기... +(The SPEAKER giggles)|I'm gonna make you one anyway~|(You see a RESTRAINT in her hand) +(SPEAKER 웃음)|어차피 내가 하나 만들어줄게~|(그녀의 손에 있는 구속이 보인다) +(The SPEAKER gulps)|M-Maybe I won't then! +(SPEAKER 가 침을 꿀꺽 삼킨다)|M-그럼 안 할지도 몰라! +(The SPEAKER adds the RESTRAINT)|You're blushing dear~|She doth protest too much? +(SPEAKER 가 제지 추가)|얼굴이 빨개졌구나~|그녀가 너무 항의하는 거지? +(The SPEAKER giggles as she catches you and slaps on the cuffs)|No so fast, dear~ +(SPEAKER 가 당신을 붙잡고 수갑을 찰싹 때리며 낄낄거립니다.)|그렇게 빨리는 안 돼요, 여보~ + + +Maybe a bit~ +조금~ +Not at all. +전혀. + + +(Wiggle excitedly) +(흥분해서 흔들며) +Not like that. +그렇지 않아. + + +O-Okay... +알았어... +(Moan and shiver) +(신음과 떨림) +Don't even try. (PERCENT chance to avoid) +시도하지 마세요. (피할 확률이 PERCENT) + + + + +(A SPEAKER is looking at something)|So comfy... but how?|Hey, you! Come see this! +(A SPEAKER 가 무언가를 보고 있다)|너무 편안해... 근데 어때?|이봐, 너! 이거 보러와! +(The SPEAKER holds up a RESTRAINT)|It's so soft, but so strict~|Want to give it a try? +(SPEAKER 가 RESTRAINT를 들어 올린다)|너무 부드럽지만 너무 엄격해~|한번 해볼까? +(The SPEAKER quickly fastens it on)|(A wave of comfort passes over you)|(The SPEAKER looks on enviously) +(SPEAKER 가 재빨리 고정한다)|(안락의 물결이 당신을 지나간다)|(SPEAKER 가 부러워하며 바라본다) +(The SPEAKER shrugs)|Eh, alright then. +(SPEAKER 가 어깨를 으쓱한다)|어, 그럼. +(The SPEAKER shrugs)|Up to you. +(SPEAKER 가 어깨를 으쓱한다)|당신에게 달렸습니다. +(The SPEAKER frowns)|But it's so comfy!|Here, look, I'll show you... +(SPEAKER 가 눈살을 찌푸린다)|하지만 너무 편해요!|자, 보세요, 보여드릴께요... +(The SPEAKER approaches)|Hey, see this RESTRAINT?|I'm going to put it on you~ +(SPEAKER 가 다가온다)|이봐, 이 RESTRAINT 보여?|붙일게~ +(The SPEAKER looks startled)|Oh! Uh, I guess you're right... +(발표자가 놀란 듯)|오! 어, 당신 말이 맞는 것 같아요... +(The RESTRAINT is buckled firmly in place)|See? Good, huh?|(You sink into the comforting feeling) +(RESTRAINT가 단단히 고정되어 있습니다.)|보이죠? 좋죠?|(편안한 느낌에 빠져듭니다) +(The SPEAKER ignores you)|(The RESTRAINT is buckled firmly in place)|(A wave of comfort passes over you) +(SPEAKER 가 당신을 무시함)|(억제 장치가 제자리에 단단히 고정됨)|(안락의 물결이 당신을 지나감) + + +(Approach) +(접근하다) +(Keep your distance) +(거리를 유지해라) + + +Nope. +아니요. + + +It does look comfortable~ +편해보이네요~ +(Squirm and bow your head) +(비틀거리며 고개를 숙인다) +It looks too strict! (PERCENT chance to avoid) +너무 엄격해 보입니다! (피할 확률이 PERCENT) + + + + +(The SPEAKER brushes past hurriedly)|Careful girl!|Else I'll lock you away~ +(SPEAKER 가 황급히 지나간다)|조심해!|그렇지 않으면 널 가둘게~ +(The SPEAKER looks at you intrigued)|Aren't you something...|How about wearing this RESTRAINT? +(SPEAKER 가 당신을 흥미롭게 바라본다)|당신은 뭔가...|이 구속복을 입는 건 어때? +(The SPEAKER grins and locks it on)|Maybe I should bump into you more~ +(SPEAKER 가 싱긋 웃으며 입을 다물었다)|좀 더 부딪혀야 할 것 같아요~ +(The SPEAKER rolls her eyes)|Run along then girl~ +(SPEAKER 가 눈을 굴리며)|따라와 아가씨~ +(The SPEAKER nods)|Didn't think so~|Oh, and, uh, sorry for the bump. +(SPEAKER 고개 끄덕임)|그렇게 생각하지 않았어~|아, 그리고, 어, 부딪쳐서 미안해. +(The SPEAKER shakes her head)|You don't get off that lightly.|These are going on. +(SPEAKER 가 고개를 젓는다)|그 말을 가볍게 할 수는 없습니다.|이런 일이 벌어지고 있습니다. +(The SPEAKER frowns)|I think I should.|You'll just bother someone else.|(She holds up a RESTRAINT) +(화자가 눈살을 찌푸린다)|제 생각에는 그래야 할 것 같아요.|당신은 다른 사람을 귀찮게 할 뿐입니다.|(그녀는 제지 장치를 들고 있습니다) +(The SPEAKER sighs)|I'll let you off then.|Oh, and, uh, sorry for the bump. +(SPEAKER 가 한숨을 쉬며)|그럼 놓아줄게.|아, 그리고, 어, 부딪쳐서 미안해. +(The SPEAKER adds the RESTRAINT)|(As she's locking it, she giggles)|You're really cute actually~ +(화자가 구속을 추가함)|(잠그면서 낄낄거림)|너 진짜 귀엽다~ +(The SPEAKER stumbles and grimaces)|Ugh! Fine, you can go then.|D-Didn't want to see you tied anyway... +(SPEAKER 가 비틀거리며 얼굴을 찡그린다)|으! 좋아, 그럼 가도 돼.|D-어차피 묶이는 걸 보고 싶지 않았어... + + +That doesn't sound bad... +나쁜 소리는 아닌데... +(Giggle into your gag) +(개그 속으로 키득) +That won't be necessary. +그럴 필요는 없습니다. + + +I'd love to! +하고 싶어요! + + +M-Maybe you should then~ +음-그럼 해봐야겠네요~ +You ran into me! (PERCENT chance to avoid) +너 나랑 마주쳤어! (피할 확률이 PERCENT) + + + + +(A SPEAKER gives you a small curtsy)|Good day.|Care to try part of our uniform? +(A SPEAKER 가 작게 퉁명스럽게 말함)|좋은 하루 되세요.|우리 유니폼 좀 입어보실래요? +(The SPEAKER looks content)|We can offer you this RESTRAINT.|It's a snug fit... +(SPEAKER 가 만족해 보인다)|이 구속을 제공할 수 있습니다.|딱 맞네요... +(The SPEAKER buckles it strictly)|All maids wear this at sometime.|You'd fit right in! +(SPEAKER 가 엄격하게 버클을 채운다)|모든 메이드는 언젠가 이것을 입는다.|당신은 딱 맞을거야! +(The SPEAKER frowns for a second)|Ah, I see.|As you were then. +(SPEAKER 가 잠시 눈살을 찌푸리며)|아, 알겠습니다.|그때처럼. +(The SPEAKER nods)|We hope to see you again nonetheless. +(발표자 고개 끄덕임)|그럼에도 불구하고 다시 뵙기를 바랍니다. +(The SPEAKER glares)|We urge you to reconsider. +(SPEAKER 가 노려본다)|다시 생각해 보시기 바랍니다. +(The SPEAKER has a twinkle in her eye)|We will offer you this RESTRAINT.|You should accept. +(SPEAKER 의 눈이 반짝인다)|우리는 당신에게 이 구속을 제안할 것입니다.|당신은 받아들여야 합니다. +(The SPEAKER pulls an odd smile)|Very well. +(화자가 묘한 미소를 지으며)|아주 좋아. +(The SPEAKER smugly nods)|(With surprising speed, the RESTRAINT locks in place)|Excellent, a good fit. +(SPEAKER 가 멋쩍게 고개를 끄덕인다)|(놀라운 속도로 RESTTRAINT가 제자리에 고정됨)|훌륭합니다. 잘 맞습니다. +### (The SPEAKER covers your mouth with her hand)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly) + +No, thank you. +아니요 괜찮습니다. + + +I accept~ +받아요~ + + +I-I accept... +나, 받아들여... +(Moan and nod slowly) +(신음하며 천천히 고개를 끄덕인다) +No way! (PERCENT chance to avoid) +안돼! (피할 확률이 PERCENT) + + + + +(The SPEAKER looks at you inquisitively)|(Wordlessly, they motion at your body)|(They seem to be asking about restraints) +(SPEAKER 가 당신을 의아하게 쳐다본다)|(말없이, 그들은 당신의 몸을 움직인다)|(그들은 구속에 대해 묻는 것 같다) +(The SPEAKER nods understandingly)|(RESTRAINT appears in their hand)|(They tilt their head at you) +(화자가 이해한다는 듯 고개를 끄덕임)|(RESTRAINT가 손에 나타남)|(그들은 당신에게 고개를 기울입니다) +(The SPEAKER spins around you)|(You feel the oddly cold restraint lock in place)|(The SPEAKER nods and moves away) +(SPEAKER 가 당신 주위를 돕니다)|(당신은 이상하게도 차가운 구속이 제자리에 고정되는 것을 느낍니다)|(SPEAKER 가 고개를 끄덕이며 멀어집니다) +(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) +(SPEAKER 가 당신을 쳐다본다)|(그들은 구속을 치우고 떠납니다) +(The SPEAKER leaves you alone) +(SPEAKER 가 널 내버려둔다) +(The SPEAKER seems to frown)|(RESTRAINT appears in their hand)|(They rapidly approach) +(화자가 눈살을 찌푸리는 것 같다)|(RESTRAINT가 그들의 손에 나타난다)|(그들은 빠르게 다가온다) +(The SPEAKER tilts their head)|(RESTRAINT appears in their hand)|(They come closer) +(SPEAKER 가 고개를 기울인다)|(RESTRAINT가 그들의 손에 나타난다)|(그들이 다가온다) +(The SPEAKER holds you in place)|(You hear the oddly cold material locking)|(They nod at you) +(SPEAKER 가 당신을 제자리에 고정시킵니다)|(이상하게 차가운 물질이 잠기는 소리가 들립니다)|(그들은 당신에게 고개를 끄덕입니다) +(The SPEAKER firmly grabs you)|(The RESTRAINT locks onto your body tightly)|(The oddly cold material makes you shiver) +(SPEAKER 가 당신을 단단히 잡습니다)|(RESTRAINT가 당신의 몸을 단단히 고정시킵니다)|(이상하게 차가운 물체가 당신을 떨게 만듭니다) + + +Y-Yes? +그 - 그래? +(Nod back) +(고개 끄덕인다) +No thank you. +아니요 괜찮습니다. + + +(Smile and prepare yourself) +(미소를 지으며 준비하세요) +(Nod and prepare yourself) +(고개 끄덕이고 준비) +No, not that. +아니, 그게 아니야. + + +W-Whoa! S-Sure... +우와! 으음... + + + + +(A SPEAKER giggles and calls to you)|Hey there~|Fancy seeing some nature?~ +(SPEAKER 가 낄낄거리며 당신을 부른다)|이봐~|자연을 보고 싶니?~ +(The SPEAKER motions with her hands)|(Vines rise from the floor and twirl)|These will bind you nicely... +(SPEAKER 가 손으로 움직인다)|(덩굴이 바닥에서 솟아올라 빙글빙글 돌았다)|이것이 당신을 멋지게 묶을 것입니다... +(The SPEAKER grins and motions again)|(The plants wrap around you quickly)|(You wriggle against the RESTRAINT) +(SPEAKER 가 씩 웃으며 다시 움직인다)|(식물이 빠르게 당신을 감쌉니다)|(당신은 구속에 맞서 꿈틀거립니다) +(The SPEAKER pouts)|Aww... +(SPEAKER 가 삐죽거린다)|아... +(The SPEAKER frowns)|Not even a little? +(SPEAKER 가 눈살을 찌푸린다)|조금도? +(The SPEAKER smirks)|That wasn't a question~ +(SPEAKER 가 웃는다)|그건 질문이 아니었어~ +(The SPEAKER giggles again)|(Vines begin to move around your feet)|Hold still dear~ +(SPEAKER 가 다시 낄낄 웃는다)|(덩굴이 네 발 주위를 움직이기 시작한다)|가만히 있어라~ +(The SPEAKER sighs and nods)|(The vines retreat from you)|Fiiine, you can go~ +(발표자가 한숨을 쉬며 고개를 끄덕인다)|(포도나무가 물러난다)|피이네, 가도 돼~ +(The vines move much faster)|(You feel the RESTRAINT as you squirm)|A gift, from me~ +(덩굴이 훨씬 더 빨리 움직인다)|(움직일 때 구속을 느낀다)|내가 주는 선물~ +(The SPEAKER giggles loudly)|(The vines catch up and pin you down)|(When they let go, you're left with a RESTRAINT) +(SPEAKER 가 큰 소리로 낄낄거림)|(덩굴이 따라붙어 당신을 꼼짝 못하게 합니다.)|(그들이 놓아주면 당신은 구속을 받게 됩니다) + + +Always! +언제나! + + +That sounds exciting! +흥미롭게 들리네요! +Wait, not like this! +잠깐, 이대로는 안돼! + + +W-Well- o-okay... +으-음- 오-알았어... +Don't! (PERCENT chance to avoid) +하지마! (피할 확률이 PERCENT) +(Shake your head) (PERCENT chance to avoid) +(고개를 흔든다) (피할 확률이 PERCENT) + + + + +(A SPEAKER approaches)|Nothing quite beats a strong metal|chain, right? +(SPEAKER 가 다가온다)|강한 금속|사슬만큼 좋은 건 없지? +(The SPEAKER nods happily)|Exactly!|Want one for yourself? +(SPEAKER 가 행복하게 고개를 끄덕인다)|맞아요!|직접 하나 원하세요? +(The SPEAKER wraps a long chain around you)|This should do the trick~|(RESTRAINT settles in place) +(SPEAKER 가 당신을 긴 사슬로 감쌉니다)|이렇게 하면 됩니다~|(RESTRAINT가 자리를 잡습니다) +(The SPEAKER sighs)|Ah well. +(SPEAKER 가 한숨을 쉬며)|아 그렇군요. +(The SPEAKER frowns sadly)|But they make the best noise! +(SPEAKER 가 슬프게 눈살을 찌푸린다)|하지만 그들은 최고의 소리를 낸다! +(The SPEAKER rolls her eyes)|Tough luck then~|You're getting one! +(SPEAKER 가 눈을 굴리며)|그럼 운이 없군~|하나를 얻다니! +(The SPEAKER grins)|See how you feel when|you're wearing one! +(SPEAKER 가 웃는다)|당신이 그것을 입고 있을 때 당신이 어떻게 느끼는지 보십시오! +(The SPEAKER sighs)|Maybe another time then. +(SPEAKER 가 한숨을 쉬며)|그럼 또 한 번. +(The SPEAKER wraps a long chain around you)|(RESTRAINT hugs your body closely)|(You shiver as the cold metal touches you) +(SPEAKER 가 긴 사슬로 당신을 감쌉니다)|(RESTRAINT가 당신의 몸을 꼭 껴안습니다)|(차가운 금속이 당신을 만질 때 당신은 떨립니다) +(The SPEAKER grins as she binds your body)|(RESTRAINT digs into you a little)|Enjoy, cutie~ +(SPEAKER는 그녀가 당신의 몸을 묶으면서 미소를 짓습니다)|(RESTRAINT가 당신을 조금 파헤칩니다)|즐기세요, 귀염둥이~ + + +I love chains! +나는 사슬을 좋아한다! +Plenty beats it. +충분히 이깁니다. + + +Absolutely~ +당연히~ + + +I-If I have to... +저-해야 한다면... +Ah! Cold! (PERCENT chance to avoid) +아! 춥다! (피할 확률이 PERCENT) + + + + +(The SPEAKER nervously walks up to you)|Excuse me miss...|Are you a fan of latex by chance? +(화자가 초조하게 당신에게 다가갑니다)|실례합니다 아가씨...|당신은 우연히 라텍스의 팬입니까? +(The SPEAKER blushes deeply)|Then would you like to try on this RESTRAINT? +(SPEAKER 가 얼굴을 붉히며)|그럼 이 RESTTRAINT를 입어 보시겠습니까? +(The SPEAKER smiles)|You look so good in that! +(SPEAKER 가 웃는다)|너 정말 잘 어울려! +(The SPEAKER frowns)|Aww... +(SPEAKER 가 눈살을 찌푸린다)|아... +(The SPEAKER blushes)|Okay... sorry I asked. +(발표자 얼굴이 붉어짐)|알았어... 물어봐서 미안해. +(The SPEAKER grins and reaches for a RESTRAINT)|Well, too bad-- +(SPEAKER 가 싱긋 웃으며 제지하려고 손을 뻗는다)|글쎄, 안됐군-- +(The SPEAKER grins)|I wasn't offering you a choice...|I was asking if you would LIKE it, hehe~ +(SPEAKER 가 웃는다)|당신에게 선택권을 주는 게 아니었어...|좋아하겠느냐고 물은 거였어, 헤헤~ +(The SPEAKER frowns)|...You're fast! +(발표자가 눈살을 찌푸린다)|...당신은 빠르군요! +(The SPEAKER smiles)|That's right~ +(SPEAKER 미소)|맞아요~ +### (The SPEAKER restrains you and clicks a lock on)|There! Nice and tight! + +Why of course! +물론이죠! + + +That sounds fun! +그거 재미있겠다! +No, I don't want that! +아니, 난 그걸 원하지 않아! + + +Okay, fine... +좋아... +Wait, what? (PERCENT chance to avoid) +잠깐, 뭐라고? (피할 확률이 PERCENT) + + +### (The SPEAKER steps up to you)|Hey girl~|You happen to be a fan of latex? + +### (The SPEAKER smiles)|Then would you like to try on this RESTRAINT? + +### (The SPEAKER chuckles)|Tight and shiny! + +### (The SPEAKER shrugs)|Alright. Sorry I asked. + + + + + +### (The SPEAKER walks up to you)|Say, would you be interested in some 'protection?' + +### (The SPEAKER grins)|Wonderful! You see, I've just recently acquired one of these...|(She shows you a loose RESTRAINT)|I'm not too interested in wearing one myself,|but I thought you'd be a good fit for it? + +### (The SPEAKER blushes as she locks the belt around your waist)|I'm enjoying this more than I thought I would~ + +### (The SPEAKER smiles)|Enjoy your freedom while it lasts~ + +### (The SPEAKER shrugs)|That's okay, just thought I'd ask. + +### (The SPEAKER rubs the smooth metal seductively)|Are you sure?|Adventurers need to take care of themselves.|You don't want to lose control of yourself and run into some curse,|do you? + +### (The SPEAKER gives an evil smile)|What if I wasn't asking? + +### (The SPEAKER sighs)|I'll find some other cutie to wear it, I guess~ + +### (The SPEAKER blushes as she locks the RESTRAINT onto you)|There we go~ + +### (As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Whoops! I guess I acted too soon.|Ah well~ + +(The lock on the RESTRAINT starts glowing...) +(RESTRAINT의 잠금 장치가 빛나기 시작합니다...) + + +### Protection? Certainly! + +### Nah, I'm good. + +### I would love to wear it! + +(Nod again, excited) +(또 끄덕, 흥분) +### ...No thank you. + +(Shake your head, puzzled) +(고개를 저으며 의아해) + + +### Fine. I need the protection anyway. + +### I refuse. (PERCENT chance to avoid) + +(Look at your belt...) +(벨트 좀 봐...) + + + + +(The SPEAKER nervously walks up to you)|Excuse me miss...|Can you help me out? +(SPEAKER 가 초조하게 당신에게 다가갑니다)|실례합니다 아가씨...|도와주실 수 있나요? +### (The SPEAKER blushes deeply)|I found this cursed RESTRAINT and I can't let go of it!|Could you... wear it for me? + +(The SPEAKER smiles)|Thank you so much, miss! +(SPEAKER 가 웃는다)|정말 고마워요, 아가씨! +### (The SPEAKER frowns)|...That does seem rather far-fetched of me to ask. + +(The SPEAKER blushes)|Oh... okay. +(발표자가 얼굴을 붉힌다)|아...알았어. +### (The SPEAKER frowns angrily)|Look, we all know how much you enjoy being restrained~|Do me a favor and wear the RESTRAINT, okay? + +### (The SPEAKER pleads with you)|...point taken. But still!|I'll end up stuck in it for a really long time... + +(The SPEAKER sighs and wears it herself)|(The lock starts glowing brightly...) +(SPEAKER 가 한숨을 쉬며 직접 착용)|(자물쇠가 밝게 빛나기 시작합니다...) +(The SPEAKER looks relieved)|Thank you so much miss!|I won't forget you! +(SPEAKER 가 안도하는 듯)|고마워요, 아가씨!|잊지 않을게요! +### (As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|I'm sorry miss! It was my only choice~ + +I would love to help! +도와주고 싶어요! +### You're asking me to get cursed? + +That sounds like a tempting offer. +그것은 유혹적인 제안처럼 들립니다. +...What? Why would I need to wear it? +...뭐? 내가 왜 입어야 해? + + +Fine. I'll do it because you asked. +알았어. 부탁하니까 해줄게. +I won't help you. Wear it yourself. (PERCENT chance to avoid) +도와주지 않을게. 직접 입어. (피할 확률이 PERCENT) + + + + +(The SPEAKER walks up to you)|We don't get a lot of visitors.|I take it that you enjoy bondage? +(SPEAKER 가 당신에게 다가온다)|방문객이 많지 않습니다.|속박을 즐기시는 걸로 압니다. +(The SPEAKER tilts her head)|Well, I have a RESTRAINT lying around,|and I figured you'd enjoy it. +(SPEAKER 가 고개를 갸웃한다)|글쎄요, 제 주변에 구속 장치가 있는데|즐거우실 거라 생각했습니다. +(The SPEAKER smiles)|I'm glad you like it! +(SPEAKER 가 웃는다)|당신이 좋아해서 기뻐요! +(The SPEAKER frowns)|I guess I'll have to find someone else to wear it. +(SPEAKER 가 눈살을 찌푸린다)|그것을 입을 다른 사람을 찾아야 할 것 같아요. +(The SPEAKER looks disappointed)|Oh well. +(SPEAKER 가 실망한 듯)|아, 그렇군요. +(The SPEAKER grins and reaches toward you!)|Well, I think it'd look great on you! +(SPEAKER 가 씩 웃으며 당신에게 손을 뻗는다!)|음, 당신에게 잘 어울릴 것 같아요! +(The SPEAKER grins)|You don't have a choice, dear~ +(SPEAKER 가 웃는다)|당신은 선택의 여지가 없어요, 얘야~ +(The SPEAKER frowns)|Darn it! Missed my chance. +(화자가 눈살을 찌푸린다)|젠장! 기회를 놓쳤어. +(The SPEAKER smiles)|Good, good~ +(SPEAKER 미소)|좋아 좋아~ + + + + + + + + +(The SPEAKER grins as she sees you)|Hey there sweetie~|I think you'd look good in some ropes! +(SPEAKER 가 당신을 보고 싱긋 웃는다)|안녕하세요 자기야~|로프를 착용하면 멋져 보일 것 같아요! +(The SPEAKER looks at your bound body)|I've got some more ropes for you, babe! +(SPEAKER 가 묶인 몸을 본다)|당신을 위한 밧줄이 더 있어요, 자기야! +(The SPEAKER smiles)|Okay, hold still while I get you rigged up~ +(SPEAKER 미소)|알았어, 내가 장비할 동안 가만히 있어~ +(The SPEAKER slaps your butt as she ties the last knot)|All trussed up~ +(SPEAKER 가 마지막 매듭을 묶으면서 당신의 엉덩이를 찰싹 때립니다)|모두 묶었습니다~ +(The SPEAKER looks disappointed and packs her rope away) +(SPEAKER 가 실망한 표정을 지으며 밧줄을 움켜쥔다) +(The SPEAKER frowns)|Aw. What a missed opportunity! +(화자가 눈살을 찌푸린다)|아. 정말 놓친 기회! +(The SPEAKER grins and reaches for her satchel)|Well, too bad-- +(SPEAKER 가 씩 웃으며 가방에 손을 뻗는다)|글쎄, 안됐군-- +(The SPEAKER grins)|But I've already brought so much rope with me~ +(SPEAKER 가 웃는다)|하지만 이미 밧줄을 너무 많이 가져왔어~ +(The SPEAKER frowns)|Suit yourself. +(SPEAKER 가 눈살을 찌푸린다)|마음대로 해. +(The SPEAKER smiles)|Good girl~ +(SPEAKER 미소)|잘했어~ +(The SPEAKER takes you down and trusses you up tightly)|That'll teach you~ +(SPEAKER 가 당신을 끌어내리고 당신을 단단히 묶습니다)|그게 당신에게 가르쳐 줄 것입니다~ + + +I think so too! +나도 그렇게 생각해! +I don't think so. +나는 그렇게 생각하지 않는다. + + +(Wiggle in place happily) +(행복하게 제자리에서 흔든다) +Actually, I'm having second thoughts... +사실, 생각이 좀 바뀌어서... +(Shake your head nervously) +(초조하게 고개를 흔든다) + + +Fine. You win. +좋아. 네가 이겼어. +Go away! (PERCENT chance to avoid) +저리가! (피할 확률이 PERCENT) + + + + +(The SPEAKER perks her ears as she sees you)|You've got a nice body.|I think it'll do better with some training! +(SPEAKER 가 당신을 보고 귀를 쫑긋 세웁니다)|당신은 몸매가 좋습니다.|운동을 좀 하면 더 잘할 것 같아요! +(The SPEAKER grins and hands you a paper)|Nevermere Training is always looking for new recruits!|I'll just have you sign here... +(SPEAKER 가 웃으며 당신에게 종이를 건네준다)|Nevermere Training은 항상 신입 사원을 찾고 있습니다!|여기에 사인을 하도록 하겠습니다... +(The SPEAKER gets you suited up)|There you go! Now go be a good girl! +(SPEAKER 가 옷을 입혀준다)|자, 간다! 이제 좋은 여자가 되어라! +(The SPEAKER scoffs)|That's what they all say. +(SPEAKER 가 비웃는다)|다들 그렇게 말한다. +(The SPEAKER frowns)|What a shame. +(화자가 눈살을 찌푸린다)|안타까운 일이네요. +(The SPEAKER grins and reaches for her baton)|No? Well, I heard you have some debts to pay~ +(SPEAKER 가 씩 웃으며 지휘봉을 잡는다)|아니요? 갚아야 할 빚이 있다고 들었는데~ +(The SPEAKER grins)|I promise you it's a good deal~ +(SPEAKER 가 웃는다)|좋은 거래라고 약속할게요~ +(The SPEAKER frowns)|Fine. I'll look for other candidates. +(의장이 눈살을 찌푸린다)|좋아요. 다른 후보자를 찾아보겠습니다. +(The SPEAKER smiles)|That's right. Your name, please? +(SPEAKER 가 웃는다)|맞습니다. 이름을 말씀해 주십시오. +(The SPEAKER zaps you and places you in restrictive gear)|Hmph. Unruly girls need training! +(SPEAKER 가 당신을 재촉하고 제한적인 장비를 착용하게 합니다.)|흠. 제멋대로인 소녀들은 훈련이 필요합니다! + + +This sounds like an interesting opportunity. +이것은 흥미로운 기회처럼 들립니다. +No thanks, I know what that entails... +아니요, 그게 무슨 뜻인지 압니다... + + +I'll sign it! +서명하겠습니다! +A contract? No way. +계약? 설마. +(Refuse the contract) +(계약 거부) + + +Fine. I'll sign it... +알았어. 서명할게... +Never! (PERCENT chance to avoid) +절대! (피할 확률이 PERCENT) +(Shake your head and frown) (PERCENT chance to avoid) +(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) + + +(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... +(SPEAKER 가 당신을 보고 짧은 인사를 합니다)|안녕하세요.|당신은 우리가 사용할 수 있는 자질을 가지고 있는 것 같습니다.|당신에게 자리를 제공하게 되어 기쁩니다... +(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... +(SPEAKER 가 목을 가다듬기 전에 잠시 미소를 지음)|멋지다!|여기 유니폼이 있어... +(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. +(SPEAKER 가 버클을 채우고 끈을 아주 세게 잡아당겨...)|(자물쇠 몇 개가 딸깍하는 소리가 들린다...)|멋지군. 첫 번째 작업은 이 바닥을 청소하는 것입니다.|행운을 빕니다. . +(The SPEAKER tilts her head and shrugs)|We are always prepared... +(SPEAKER 가 고개를 갸우뚱하며 어깨를 으쓱한다)|우리는 항상 준비되어 있습니다... +(The SPEAKER nods)|Fair enough. +(SPEAKER 가 고개를 끄덕인다)|그만하면 됐어. +(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... +(SPEAKER 가 씩 웃으며 헐렁한 드레스를 꺼낸다)|당신이 꽤 많은... 적을 만들었다는 것을 상기시켜 드려도 될까요?|그들 중 한 명과 마주치게 된다면 안타까운 일이 될 것입니다... +(The SPEAKER nods proudly)|We are willing to made some changes to our records~ +(SPEAKER 가 자랑스럽게 고개를 끄덕인다)|우리는 기록을 약간 변경할 용의가 있습니다~ +(The SPEAKER frowns)|You won't know what hit you. +(SPEAKER 가 눈살을 찌푸린다)|당신은 무엇이 당신을 때렸는지 모를 것입니다. +(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. +(SPEAKER 미소)|올바른 결정을 내리셨다니 기쁩니다.|이제 첫 번째 작업은 이 바닥을 청소하는 것입니다.|행운을 빕니다. +(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... +(SPEAKER 가 갑자기 당신이 반응할 수 있는 것보다 더 빨리 움직입니다.)|(당신이 아래로 내려가면서 발이 당신의 등을 누르는 것을 느낍니다.)|(그녀는 당신에게 제복을 입히고 단단히 고정시킵니다...)|당신은 추가로 필요합니다. 훈련, 아마... + + +Gladly! +기꺼이! +W-where did you get that uniform? (Refuse) +어, 그 교복 어디서 구했어? (거절) + + + + + + + + + + + + +(The SPEAKER perks her ears as she sees you)|Glory to the blessed kitty!|Are you prepared to join us? +(SPEAKER 가 당신을 보고 귀를 쫑긋 세웁니다)|축복받은 고양이에게 영광을!|우리와 함께할 준비가 되셨습니까? +(The SPEAKER nods happily)|Fantastic! You just need to agree to be nice to cats.|And also we own you now. +(SPEAKER 가 행복하게 고개를 끄덕인다)|멋지다! 고양이에게 친절하게 대하는 데 동의하기만 하면 된다.|그리고 이제 우리는 당신을 소유하고 있다. +(The SPEAKER jumps happily)|Wonderful! Here's your collar! +(SPEAKER 가 행복하게 뛰어오른다)|멋지군! 여기 옷깃이야! +(The SPEAKER whimpers and looks at you)|How mean! +(SPEAKER 가 훌쩍거리며 당신을 바라본다)|정말 못됐군! +(The SPEAKER's ears flop)|Aww... we thought you were cute. +(SPEAKER 의 귀가 쫑긋)|아...귀엽다고 생각했는데. +(The SPEAKER frowns)|Oh? Well, I guess I'll tell the others~ +(SPEAKER 가 찡그린다)|오? 글쎄, 다른 사람들에게 말할 것 같아요~ +(The SPEAKER grins slyly)|You wouldn't hurt the kitties, would you? +(SPEAKER 가 교활하게 웃는다)|당신은 고양이들을 다치게 하지 않을 거에요, 그렇죠? +(The SPEAKER frowns)|Then we'll have to make sure you don't come to harm anyone! +(화자가 눈살을 찌푸린다)|그럼 우리는 당신이 누구에게도 해를 끼치지 않도록 해야 합니다! +(The SPEAKER smiles proudly)|I knew you would pull through! +(SPEAKER 가 자랑스럽게 웃는다)|당신이 이겨낼 줄 알았어! + + +Yes! I love the blessed kity! +예! 축복받은 고양이를 사랑합니다! +No, you guys are a bunch of weirdos. +아니, 너희들은 이상한 놈들이야. + + +Yes! I will be nice to the kitties! +그래! 고양이들에게 잘해줄게! +(Join them) +(그들과 합류) +Wait, I didn't agree to that! (Refuse) +잠깐만요, 동의하지 않았어요! (거절) +(Refuse) +(거절하다) + + +Okay fine... I won't hurt the kitties. (Join them) +알았어 알았어... 고양이들 다치게 하지 않을게. (조인해) + + + + + + +(The SPEAKER does a curtsy)|Why hello there!|You have a wonderful bod-er, book!|Would you like to help me? +(SPEAKER 가 퉁명스럽게 말함)|안녕하세요!|멋진 몸매를 가지셨네요, 책님!|도와주실래요? +(The SPEAKER smiles briefly)|You have an opportunity to model for me!|I need someone to wear all of my wonderful inventions! +(SPEAKER 가 짧게 웃는다)|당신은 나를 위해 모델이 될 기회가 있습니다!|내 모든 멋진 발명품을 착용할 누군가가 필요합니다! +(The SPEAKER laces you up in the tight fabric...)|(You hear the click of a few locks going on...)|Oh my goodness... So pretty!|You'll make a fine assistant! +(SPEAKER 가 당신을 꽉 조이는 천으로 묶습니다...)|(자물쇠 몇 개가 딸깍하는 소리가 들립니다...)|맙소사... 너무 예뻐요!|당신은 훌륭한 조수가 될 것입니다! +(The SPEAKER frowns)|Aw... +(SPEAKER 가 눈살을 찌푸린다)|아... +(The SPEAKER clenches her fist to the ceiling)|Nooooo!!! +(SPEAKER 가 천장을 향해 주먹을 쥔다)|안돼!!! +(The SPEAKER grins and pulls out a frilly dress)|Don't knock it till you try it!|Trust me, it'll be fun! +(SPEAKER 가 웃으며 주름 장식이 달린 드레스를 꺼낸다)|해보기 전에는 노크하지 마세요!|저를 믿으세요, 재미있을 거예요! +(The SPEAKER furrows her brow)|Watch your tongue there, little lady.|Or I'll have to plug it for you... +(SPEAKER 가 미간을 찌푸리며)|혀 조심해, 아가씨.|아니면 내가 당신을 위해 플러그를 꽂아야겠어... +(The SPEAKER folds her arms as ribbons rise up around her)|Suit yourself, hehe~ +(SPEAKER 가 팔짱을 끼고 리본이 그녀 주위로 올라간다)|마음대로 해, 헤헤~ +(The SPEAKER smiles)|Yes! Yes! Wonderful! +(SPEAKER 가 웃는다)|예! 예! 훌륭합니다! + + +Sign me up! +저를 등록하세요! +(Accept the position) +(포지션 수락) +And wear tacky clothes all the time? +항상 촌스러운 옷을 입으시겠습니까? +(Refuse the position) +(입장 거부) + + +Fine... sign me up. +좋아... 등록해. +Why don't you try it on yourself! (PERCENT chance to avoid) +직접 해보는 게 어때! (피할 확률이 PERCENT) + + + + + + + + +(The SPEAKER runs up to you)|Wow! You make a fine specimen-er, I mean...|Nice to meet you! +(SPEAKER 가 당신에게 달려옵니다)|와! 당신은 훌륭한 표본이군요. 제 말은...|만나서 반가워요! +(The SPEAKER smiles)|Now, I have something wonderful in store for you.|(She takes out a blue catsuit)|I'd like you to be my assistant! +(SPEAKER 가 웃는다)|이제, 당신을 위해 준비한 멋진 것이 있습니다.|(그녀는 파란색 캣수트를 꺼냅니다)|당신이 제 비서가 되어주셨으면 합니다! +(The SPEAKER looks excited)|Awesome! Let me help you get in uniform... +(SPEAKER 가 흥분해 보인다)|멋지다! 제복 입는 걸 도와줄게... +(The SPEAKER shrugs)|It was worth a shot... +(SPEAKER 가 어깨를 으쓱한다)|그럴만한 가치가 있었어... +(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|There's just... a lot to do.|That's why I need an assistant. +(화자가 답답해 보인다)|난... 내 일이 미친 짓이 아니야!|그냥... 할 일이 많아.|그래서 조수가 필요해. +(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|We seek only knowledge! +(화자가 답답해 보인다)|그게 아니라... 내 일은 미친 짓이 아니야!|우리는 오직 지식만을 추구한다! +(The SPEAKER frowns)|Time for a test run! +(SPEAKER 가 눈살을 찌푸린다)|테스트 실행 시간입니다! +(The SPEAKER looks happy again)|Thank you! I'm super grateful! +(SPEAKER 가 다시 행복해 보인다)|고맙습니다! 정말 감사합니다! +(The SPEAKER tilts her head)|Fine then. You win.|(As you leave, you hear a 'just kidding' as she breaks a glass vial)|(A suit of blue latex envelops you!) +(SPEAKER 가 고개를 기울인다)|그럼 좋다. 당신이 이겼다.|(떠나면서 그녀가 유리병을 깨면서 '농담'하는 소리가 들린다)|(파란색 라텍스가 당신을 감싼다!) + + +...Hello? +...여보세요? +You guys are crazy. +너희들은 미쳤어. + + +(Accept the offer) +(제안 수락) +(Refuse the offer) +(제안 거절) + + +Fine. I'll be your assistant. +좋아. 내가 너의 비서가 될게. +Go find someone else. (PERCENT chance to avoid) +가서 다른 사람 찾으세요. (피할 확률이 PERCENT) + + + + + + + + +(The SPEAKER greets you)|Normally we don't meddle in mortal affairs.|But you, Outsider, are different.|Let's have a conversation. +(화자가 인사한다)|보통 우리는 인간사에 간섭하지 않는다.|하지만 아웃사이더인 당신은 다르다.|대화를 하자. +(The SPEAKER smiles warmly)|Outsiders have a lower rank in our society.|But it is a rank all the same.|You will be above your mortal peers.|What do you say? +(화자가 따뜻하게 웃는다)|외부인은 우리 사회에서 낮은 지위에 있다.|하지만 그것은 모두 같은 계급이다.|당신은 필멸의 동료들보다 위에 있게 될 것이다.|무슨 말을 합니까? +(The SPEAKER clasps some 'jewelry' around your limbs)|You look beautiful, my dear.|I will leave you to your own affairs until we meet again. +(SPEAKER 가 당신의 팔다리에 '보석'을 움켜쥔다)|당신은 아름다워요, 여보.|우리가 다시 만날 때까지 당신의 일에 맡기겠습니다. +(The SPEAKER turns her head away)|Hmph. I offer you a bargain and you refuse. +(SPEAKER 가 고개를 돌린다)|흠. 내가 당신에게 흥정을 제안했지만 당신은 거절했습니다. +(The SPEAKER turns her head away)|Hmph. As expected. +(SPEAKER 가 고개를 돌린다)|흥. 역시. +(The SPEAKER folds her arms)|If you are not with us, then you are against us.|You shall face the wrath of the wild. +(화자가 팔짱을 낀다)|당신이 우리와 함께하지 않는다면 당신은 우리를 대적하는 것입니다.|당신은 야생의 분노에 직면하게 될 것입니다. +(The SPEAKER frowns)|Hardly slavery!|A mere slave would not be allowed to even set foot in our society. +(화자가 눈살을 찌푸린다)|거의 노예가 아닙니다!|단순한 노예는 우리 사회에 발을 들여놓는 것조차 허용되지 않습니다. +(The SPEAKER frowns)|We will meet again. +(화자가 눈살을 찌푸린다)|우리는 다시 만날 것입니다. +(The SPEAKER nods and smiles)|(She decorates your body with 'jewelry')|I am glad you had a change of heart. +(SPEAKER 가 고개를 끄덕이며 웃는다)|(그녀는 당신의 몸을 '장신구'로 장식합니다)|마음이 바뀌어서 다행입니다. +(The SPEAKER scoffs)|(Her magic suddenly binds you tightly in glowing ropes)|Amateur. +(SPEAKER 가 비웃는다)|(그녀의 마법이 갑자기 당신을 빛나는 밧줄로 단단히 묶는다)|아마추어. + + +I'm interested. (Talk with her) +관심이 있어. (그녀와 이야기해봐) + + +I accept your gracious offer! +당신의 은혜로운 제안을 받아들입니다! +(Accept) +(수용하다) +I won't be a slave to you. +난 당신의 노예가 되지 않겠습니다. + + +Fine, fine... I will accept. +좋아, 좋아... 받아들일게. +No way. (PERCENT chance to avoid) +안돼. (피할 확률이 PERCENT) + + + + + + +(The SPEAKER smiles at you)|Mortal. +(SPEAKER 가 당신에게 미소 짓는다)|필멸자. +(The SPEAKER points to the ground)|Kneel before me and accept your collar. +(SPEAKER 가 땅을 가리키며)|내 앞에 무릎을 꿇고 당신의 옷깃을 받으십시오. +(The SPEAKER snaps her fingers)|(A collar of cold black metal materializes around your neck)|A girl who knows her place! Wonderful... +(SPEAKER 가 손가락을 튕긴다)|(당신의 목에 차갑고 검은 금속 목걸이가 나타난다)|자신의 위치를 ​​아는 소녀! 훌륭하다... +(The SPEAKER scoffs)|Hmmph. Mortals... +(SPEAKER 가 비웃는다)|흠. 필멸자... +(The SPEAKER folds her arms)|Well, look who doesn't know her place~ +(SPEAKER 가 팔짱을 낀다)|글쎄, 누가 자기 위치를 모르나봐~ +(The SPEAKER folds her arms)|I didn't offer you a choice in the matter.|You're mine, I've decided that. +(SPEAKER 가 팔짱을 낀다)|나는 당신에게 그 문제에 대해 선택권을 주지 않았습니다.|당신은 내 꺼야, 내가 결정했어. +(The SPEAKER's eyes begin to glow)|Looks like we'll do this the fun way! +(SPEAKER 의 눈이 빛나기 시작한다)|우리가 이것을 재미있는 방법으로 할 것 같다! +(The SPEAKER smiles)|Wonderful~|Now come along, my pet! +(SPEAKER 가 웃는다)|멋지다~|이제 따라와, 내 애완동물! +(The SPEAKER scoffs and snaps her fingers)|(Metallic restraints come at you from all angles and snap in place tightly)|(A gag forces itself into your mouth)|Now then, what were we saying? +(SPEAKER 가 비웃으며 손가락을 튕긴다)|(금속 구속이 모든 각도에서 당신에게 다가오고 제자리에 단단히 고정됩니다.)|(재갈이 당신의 입에 억지로 박힙니다)|그럼 우리가 뭐라고 하던가요? + + +Yes? +예? +I don't talk to monsters! +나는 괴물과 대화하지 않는다! + + +O-okay. (Kneel) +알았어. (무릎을 꿇고) +(Kneel) +(무릎) +I refuse! +내가 거부! + + +Then it looks like I have no choice. (Join her) +그럼 어쩔 수 없나 보네요. (합류) +I will never bow to you! (PERCENT chance to avoid) +절대 절하지 않겠습니다! (피할 확률이 PERCENT) + + + + + + +(The SPEAKER waves)|You seem like an exceptional individual.|What do you think of joining the Guild? +(SPEAKER 가 손을 흔든다)|당신은 특별한 사람인 것 같습니다.|길드에 가입하는 것에 대해 어떻게 생각하세요? +(The SPEAKER smiles)|Excellent! I'll put in a word with the Guild.|Do note: this will affect your reputation with certain bad actors. +(발표자가 웃는다)|좋아요! 길드에 한마디 하겠습니다.|주의: 이것은 특정 나쁜 배우들에 대한 평판에 영향을 미칠 것입니다. +(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. +(SPEAKER 가 마법 두루마리를 꺼내 서명한다)|(두루마리가 에테르 속으로 사라진다)|행운을 빈다, 프리랜서. +(The SPEAKER nods)|Fair enough. Guild work is not for everyone. +(SPEAKER 가 고개를 끄덕인다)|그렇군요. 길드 작업은 아무나 하는 것이 아닙니다. +(The SPEAKER nods)|Very well, then I won't bother you. +(SPEAKER 가 고개를 끄덕인다)|좋아요, 그럼 귀찮게 하지 않겠습니다. +(The SPEAKER looks dubious)|You know, there's quite a bounty on your head.|I'm sure we could do something about it. +(SPEAKER 가 수상쩍어 보인다)|당신도 알다시피, 당신의 목에는 상당한 현상금이 걸려 있습니다.|우리가 그것에 대해 뭔가를 할 수 있을 것이라고 확신합니다. +(The SPEAKER tilts her head)|Haha, very funny.|We both know that you're not one of those... right? +(SPEAKER 가 고개를 갸웃한다)|하하, 아주 웃기다.|당신이 그런 사람이 아니라는 건 우리 둘 다 알고 있어...맞지? +(The SPEAKER frowns and readies for battle)|My instincts were right. +(SPEAKER 가 눈살을 찌푸리며 전투를 준비한다)|내 직감이 맞았다. +(The SPEAKER suddenly strikes you to the floor)|(You feel a foot on your back as she ties you in a strict rope hogtie...)|(She dusts off her hands)|We'll have a talk when you get out of that, okay? +(SPEAKER 가 갑자기 당신을 바닥으로 내리칩니다.)|(그녀가 당신을 엄격한 밧줄 매춘부로 묶을 때 당신은 당신의 등에 발이 닿는 것을 느낍니다...)|(그녀는 그녀의 손에서 먼지를 털어냅니다.)|당신이 그만둬, 알았지? + + +I have no interest in joining the guild. +길드 가입에는 관심이 없습니다. + + +What if I am one of those bad actors? (Refuse) +내가 그 나쁜 배우들 중 하나라면? (거절) + + +Fine... (Join) +좋아... (참가) +Go away. (PERCENT chance to avoid) +저리가. (피할 확률이 PERCENT) +(Frown at her) (PERCENT chance to avoid) +(얼굴을 찌푸리며) (피할 확률이 PERCENT) + + + + + + + + +(The SPEAKER beeps)|Prisoner 74121 identified.|Subject not registered in database. +(SPEAKER 가 삐 소리를 냄)|수감자 74121이 확인되었습니다.|대상은 데이터베이스에 등록되지 않았습니다. +(The SPEAKER beeps)|Confirming database entry.|Say 'I will be a good girl' to enter database. +(SPEAKER 가 삐 소리를 냄)|데이터베이스 입력 확인 중.|데이터베이스에 들어가려면 '착한 여자가 될게'라고 말하세요. +(The SPEAKER beeps and applies tracking gear)|(The metallic cables click into place with a soft beep)|Prisoner 74121 registered. Good girl. +(SPEAKER 가 신호음을 울리고 추적 장치를 적용함)|(금속 케이블이 부드러운 신호음과 함께 제자리에 고정됨)|죄수 74121이 등록되었습니다. 착합니다. +(The SPEAKER beeps)|Acknowledged. Be warned:|Lost contact with Sections 98, 97, 96, 95...|(The list goes on...) +(SPEAKER 신호음)|확인했습니다. 경고:|섹션 98, 97, 96, 95와 연락 두절...|(목록은 계속됩니다...) +(The SPEAKER beeps)|Acknowledged. Updating records. +(SPEAKER 신호음)|확인했습니다. 기록 업데이트 중. +(The SPEAKER beeps and flashes its lights)|Target acquired. +(SPEAKER 가 신호음을 울리고 조명을 깜박임)|목표물을 획득했습니다. +(The SPEAKER beeps and flashes its lights)|Target has complied. Supplying uniform. +(SPEAKER 가 신호음을 울리고 조명을 깜박임)|목표가 준수했습니다. 유니폼을 공급합니다. +(The SPEAKER beeps and flashes its lights)|Engaging capture protocol. +(SPEAKER에서 신호음이 울리고 조명이 깜박임)|포획 프로토콜을 사용 중입니다. +(The SPEAKER beeps and flashes its lights)| +(SPEAKER에서 신호음이 울리고 표시등이 깜박임)| +(The SPEAKER blasts you with a stunning ray and captures you)|Target neutralized. +(SPEAKER 가 놀라운 광선으로 당신을 폭파하고 당신을 붙잡습니다)|목표물을 무력화시킵니다. + + +Please register me. +저를 등록해주세요. +(Stop to talk to the robot) +(로봇에게 말을 멈추고) +Prisoner 74121? You must be mistaken... +죄수 74121? 착각하셨나봐요... +(Avoid the robot) +(로봇을 피해) + + +Prisoner 74121 reporting. I will be a good girl. +죄수 74121 보고. 착하게 살겠습니다. +Actually, I am an administrator. (Refuse) +사실 저는 관리자입니다. (거절) + + +I'm sorry, I will be a good girl! +미안해, 좋은 여자가 될게! +What? (PERCENT chance to avoid) +뭐? (피할 확률이 PERCENT) + + + + + + +(The SPEAKER smiles)|I used to be an adventurer like you.|Then I joined up with the Dragonhearts! +(SPEAKER 미소)|나도 너 같은 모험가였어.|그때 드래곤하트에 합류했어! +(The SPEAKER clears her throat)|Well, we're actually recruiting!|You're free to join us if you agree to fight for justice! +(화자가 목을 가다듬는다)|음, 우리는 실제로 모집하고 있습니다!|정의를 위해 싸우는 데 동의한다면 우리와 함께 할 수 있습니다! +(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! +(SPEAKER 가 힘차게 악수를 건넸다)|자매 관계에 오신 것을 환영합니다, 모험가님! +### (The SPEAKER tilts her head and shrugs)|Ah well. + +(The SPEAKER frowns)|What is it?|You're not an enemy of justice, are you? +(화자가 눈살을 찌푸리며)|뭐야?|당신은 정의의 적이 아니지, 그렇지? +(The SPEAKER frowns)|...If you won't fight for justice, that makes you an enemy of justice. +(화자가 눈살을 찌푸린다)|...정의를 위해 싸우지 않는다면 정의의 적이 되는 것입니다. +(The SPEAKER frowns and cracks her knuckles)|Looks like my suspicions were right!|Looks like you and I are going to have a little chat... +(SPEAKER 가 눈살을 찌푸리며 손가락 관절을 꺾는다)|제 생각이 맞았나 보군요!|당신과 제가 잡담을 좀 할 것 같군요... +(The SPEAKER giggles)|Hehe, just messin' with ya.|Anyway, welcome to the sisterhood! +(SPEAKER 낄낄거림)|헤헤, 그냥 장난칠 뿐이야.|어쨌든 자매결연에 온 걸 환영해! +(The SPEAKER grabs you and ties you up)|You won't be making trouble like that any time soon. +(SPEAKER 가 당신을 붙잡고 묶습니다.)|언젠가는 그런 문제를 일으키지 않을 것입니다. + + +I wish I could join you. +당신과 함께 할 수 있으면 좋겠습니다. +Please go away. +저리가요. +(Back away) +(뒤로) + + +Great! Sign me up! +좋습니다! 가입하세요! +(Join) +(가입하다) +Fight for justice? Sounds restrictive... +정의를 위해 싸워라? 제약이 많은 것 같은데... + + +Actually, justice doesn't sound bad! +사실, 정의는 나쁘게 들리지 않아! +What are you going to do about it? (PERCENT chance to avoid) +어떻게 하시겠습니까? (피할 확률이 PERCENT) + + + + +(The SPEAKER waves and calls you over)|Looks like you've made a name for yourself.|What do you say to a little agreement? +(SPEAKER 가 손을 흔들며 당신을 부릅니다)|당신은 이름을 알린 것 같습니다.|약간의 합의에 대해 뭐라고 말합니까? +(The SPEAKER clears her throat)|Well, you're currently on our turf.|But we're willing to cut you some slack.|You just have to agree not to attack any of us. +(SPEAKER 가 목을 가다듬는다)|음, 당신은 현재 우리 영역에 있습니다.|하지만 우리는 당신에게 약간의 여유를 줄 용의가 있습니다.|당신은 우리 중 누구도 공격하지 않기로 동의하기만 하면 됩니다. +(The SPEAKER frowns)|Criminals? Girl, we ARE the law around these parts~ +(화자 눈살을 찌푸리며)|범죄자? 여보, 이 부분은 우리가 법이야~ +(The SPEAKER grins)|I like your spunk, girl.|But you're kidding, right? +(SPEAKER 가 웃는다)|난 당신의 엉덩이가 좋아요, 아가씨.|하지만 농담하는 거에요, 그렇죠? +(The SPEAKER raises her fists and smiles)|You're on! +(SPEAKER 가 주먹을 치켜들고 웃는다)|시작합니다! +(The SPEAKER chuckles)|Here's a toast to a new partnership! +(발표자 웃음)|새로운 파트너십을 위한 건배입니다! +(The SPEAKER catches you and trusses you up)|Maybe we'll just have to find you an owner, then!|Hehe. +(SPEAKER 가 당신을 잡아 묶습니다.)|그럼 우리는 당신에게 주인을 찾아야 할 것 같습니다!|헤헤. + + +I'm all ears. +나는 모두 귀입니다. +(Listen closely) +(잘 들어봐) +I don't deal with criminals. +나는 범죄자와 거래하지 않는다. + + +It's a deal! +그것은 거래의! +(Mumble in agreement) +(동의 중얼중얼) +You don't understand. This is MY turf. +당신은 이해하지 못합니다. 이것은 내 영역입니다. +(Scoff at her through your gag) +(개그로 그녀를 비웃는다) + + +Haha, just kidding. I'm with you. +하하, 농담이야. 나랑 같이 있어. +Put 'em up! (PERCENT chance to avoid) +어서 올려! (피할 확률이 PERCENT) + + + + + + + + + + +(The SPEAKER stops walking and speaks)|You there!|It seems your attunement with magic is high.|Join us. +(SPEAKER 가 걸음을 멈추고 말함)|거기 있구나!|마법에 대한 조율이 높은 것 같군.|함께하자. +(The SPEAKER nods calmly)|We will use some special equipment to increase your attunement.|Put these on. +(SPEAKER 가 침착하게 고개를 끄덕인다)|우리는 당신의 조율을 높이기 위해 특별한 장비를 사용할 것입니다.|이걸 입으세요. +(The 'equipment' locks in place)|Excellent. Soon you will be much more powerful. +('장비'가 제자리에 고정됨)|훌륭합니다. 곧 당신은 훨씬 더 강력해질 것입니다. +(The SPEAKER stops talking and walks away.) +(SPEAKER 가 말을 멈추고 자리를 떴다.) +(The SPEAKER walks away like nothing happened.) +(SPEAKER 가 아무 일도 없었다는 듯이 걸어나간다.) +(The SPEAKER frowns slightly)|We are prepared to use force if need be... +(SPEAKER 가 살짝 눈살을 찌푸린다)|우리는 필요하다면 무력을 사용할 준비가 되어 있습니다... +(The SPEAKER stares at you)|Why? Did you not say you wanted to join us? +(SPEAKER 가 당신을 쳐다본다)|왜요? 우리와 함께하고 싶다고 하지 않았나요? +(The SPEAKER frowns)|We have failed to convince the human. +(화자가 눈살을 찌푸린다)|우리는 인간을 설득하는 데 실패했습니다. +(The SPEAKER nods.)|You have made a wise decision. +(SPEAKER 가 고개를 끄덕인다.)|당신은 현명한 결정을 내렸습니다. +(The SPEAKER uses magic to force you.)|There. Try not to succumb to your desires too much. +(SPEAKER는 당신을 강제하기 위해 마법을 사용합니다.)|저기요. 당신의 욕망에 너무 굴복하지 마세요. + + +Um... sure? +음... 확실히? +Get away from me! +나에게서 도망! + + +Shiny... (Put them on) +반짝반짝... (착용) +(Let her put them on you) +(그녀가 당신에게 그것들을 입히게 해주세요) +What? No way! (Refuse) +뭐? 안돼! (거절) + + +Okay, I will wear them... +알았어, 내가 입을게... +Monster! (PERCENT chance to avoid) +괴물! (피할 확률이 PERCENT) + + + + +(The SPEAKER does a short bow as she sees you)|Um... hi!|I have a letter for you... +(SPEAKER 가 당신을 보고 짧은 인사를 합니다)|음... 안녕!|당신에게 줄 편지가 있어요... +(The letter is a contract from the College)|(They want you to sign up as an instructor for apprentices)|(The SPEAKER looks at you nervously.) +(그 편지는 대학에서 온 계약서입니다.)|(그들은 당신이 견습생 강사로 등록하기를 원합니다.)|(SPEAKER 가 당신을 초조하게 바라보고 있습니다.) +(The SPEAKER sighs in relief)|That's good...|(You sign the contract and it vanishes into the aether) +(화자가 안도의 한숨을 내쉬며)|잘됐네요...|(계약서에 서명하면 에테르 속으로 사라집니다) +(The SPEAKER whimpers)|What will I tell them... +(SPEAKER 가 흐느끼며)|그들에게 무엇을 말해야 할까... +(The SPEAKER glares at you)|It's an important message concerning your standing!|With the College! +(SPEAKER 가 당신을 노려본다)|그것은 당신의 지위에 관한 중요한 메시지입니다!|대학과 함께! +(The SPEAKER blushes)|Well...|I was told we would make changes to your academic record,|should you refuse... +(발표자가 얼굴을 붉힌다)|글쎄...|당신의 학업 기록을 변경하겠다고 들었는데|거절하면... +(The SPEAKER frowns)|They told me to make sure you sign...|by any means necessary! +(발표자가 눈살을 찌푸린다)|그들은 당신이 서명했는지 확인하라고 하더군요...|어떤 수단을 써서라도! +(The SPEAKER nods and smiles)|Thank you so much!|I don't know what I would have done if you said no... +(SPEAKER 가 고개를 끄덕이며 웃는다)|정말 감사합니다!|아니라고 했다면 어떻게 했을지 모르겠습니다... +(The SPEAKER frowns and waves her wand)|(A bunch of ropes come out of the ground and restrain you)|Hmmph. I'll tell them you signed it anyway.|I can't go back empty handed. +(SPEAKER 가 눈살을 찌푸리며 지팡이를 흔든다)|(다발의 밧줄이 땅에서 나와 당신을 구속합니다)|흠. 어쨌든 당신이 서명했다고 말하겠습니다.|빈손으로 돌아갈 수 없습니다. + + +Thank you for delivering it. (Read it) +전달해주셔서 감사합니다. (읽어보세요) +(Read the letter) +(편지를 읽으세요) +There's nothing good inside that letter. +그 편지 안에 좋은 건 하나도 없어. + + +Great! Wonderful! +좋아! 훌륭해! +There is no way I'd accept. +내가 받아들일 방법이 없어. + + +Fine. I'll read it. (Join the College as an instructor) +알았어. 읽어볼게. (강사로 학원에 들어와) +This is unethical! I refuse! (PERCENT chance to avoid) +이것은 비윤리적입니다! 거절합니다! (피할 확률이 PERCENT) + + + + + + + + + + + + + + +### (The SPEAKER waves)|Greetings,|I manufacture all sorts of weapons.|Would you like to buy some? + +(The SPEAKER drops her hammer and cracks her knuckles)|Put em up! +(SPEAKER 가 망치를 떨어뜨리고 손가락 마디를 꺾는다)| 올려! +(The SPEAKER looks at you.)|But you already have one? +(SPEAKER 가 당신을 쳐다봅니다.)|그런데 이미 갖고 계시죠? +(The SPEAKER folds her arms)|I don't do charity, ma'am. +(발표자가 팔짱을 끼며)|저는 자선사업을 하지 않습니다, 부인. +### (The SPEAKER smirks)|Another adventurer found this lying around.|I wonder who it's for~ + +### (The SPEAKER smiles)|Now don't be up to no good~|Or else I'll have to put you in cuffs... + +(The SPEAKER nods)|A versatile weapon. One of my favorites. +(SPEAKER 가 고개를 끄덕인다)|다재다능한 무기입니다. 제가 가장 좋아하는 무기 중 하나입니다. +(The SPEAKER nods)|Keep your friends close, and your enemies far away. +(SPEAKER 가 고개를 끄덕인다)|친구는 가까이 두고 적들은 멀리 두십시오. +(The SPEAKER nods)|Handy to have one of these around. +(SPEAKER 가 고개를 끄덕인다)|이것들 중 하나가 있으면 편리합니다. +(The SPEAKER nods)|The best defense is a good offense. +(SPEAKER 가 고개를 끄덕인다)|최선의 방어는 좋은 공격입니다. +### (The SPEAKER nods)|Speak softly and carry a big hammer. + +### (The SPEAKER smiles)|Can never be too prepared~ + +### (The SPEAKER waves)|Hi.|I make armor. Only the finest.|I don't sell it cheap, unlike my twin. + +### (The SPEAKER looks at you.)|Do you have a dealer's license? + +### (The SPEAKER folds her arms)|I don't do charity, girl. + +### (The SPEAKER nods)|The most high-impact of sports bras. + +### (The SPEAKER nods)|These aren't for hiking, just so you know. + +### (The SPEAKER nods)|I've been thinking about making a lockable version... + +### (The SPEAKER nods)|These are sensibly sized, unlike those you see in movies. + +### (The SPEAKER nods)|Sometimes you just have to be flexible. + +### (The SPEAKER nods)|For when you value style over protection... + +### (The SPEAKER nods)|You can never be too careful. + +### (The SPEAKER chuckles)|I hear female adventurers like to wear these for protection.|Or something like that. + +### (The SPEAKER waves)|Hello miss!|What brings you here today? + +### (The SPEAKER folds her arms)|That's not very nice! + +### (The SPEAKER looks at you and smiles.)|Don't you already have one? + +### (The SPEAKER folds her arms)|I don't do charity, miss. + +### (The SPEAKER nods)|Could use a higher heel... + +### (The SPEAKER nods)|Back to the basics. + +### (The SPEAKER smiles)|I see you have good taste! + +### (The SPEAKER nods)|It's a classic!|What's not to like? + +### (The SPEAKER smiles)|It's an upgrade for your best friend! + +### (The SPEAKER shrugs)|It's big and bulky, but I guess it has its uses. + +### (The SPEAKER giggles)|Smile for the camera! + +### (The SPEAKER nods)|It's like mana, but much more portable!|It powers duplication runes so you don't run out of arrows. + +### (The SPEAKER giggles)|I like to include these as a gift with every purchase~ + +### (The SPEAKER whispers in a hushed tone)|Welcome.|I'm not supposed to be here, so|if you don't want to do business, get out.|I only sell in packs of 10, by the way. + +### (The SPEAKER tries to get away)|Damn! + +### (The SPEAKER looks you over and shrugs)|Don't joke around. + +### (The SPEAKER folds her arms)|Don't have money? Better go find some. + +### (The SPEAKER produces a bag of stuffings)|Quite the staple. + +### (The SPEAKER produces a bundle of rope)|Aren't you quite the artist.|That was rhetorical. + +### (The SPEAKER produces some bondage tape)|It only sticks to itself, doesn't leave residue.|Gotta be responsible, you know? + +### (The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally... + +### (The SPEAKER produces a bag of cloth strips)|How tight you tie it depends on how bratty your target is. + + + +### (The SPEAKER rattles as she waves)|Heya!|Looking to buy some ancient treasures?|My antiques shop has just what you need! + +### (The SPEAKER cracks her exposed knuckles)|So you've seen through my disguise... + +### (The SPEAKER looks at you.)|Yours is just fine, dear. + +### (The SPEAKER chuckles)|You don't have enough gold for that, dear.|Try coming back after a good round of looting! + +### (The SPEAKER nods)|My great grandmother used to wear these. + +### (The SPEAKER nods)|Adventurers used to love a good burlap sack.|Nowadays they've got that newfangled magic instead... + +### (The SPEAKER nods)|Back in my day, they used candles for light!|These let you put them out to save wax. + +### (The SPEAKER giggles)|I had all sorts of use for this back on the farm. + +### (Select an item to buy from the SPEAKER) + +### (Attack the SPEAKER?) + +### (Buy ITM# for IC# gp) (Owned: AMNT#) + +### (The SPEAKER sells you the item) + +### (The SPEAKER shakes her head)|I think you'd be better off without that~ + +### (The SPEAKER looks embarassed)|I can't sell you that, miss... + +### (The SPEAKER blushes)|Actually, I was saving that for myself... + +### (The SPEAKER grins)|Good girls don't need one of those~ + +### (The SPEAKER buzzes)|Error, insufficient access privileges. + +### (The SPEAKER giggles at your empty pockets)|You can't afford such things, silly~ + +### (The SPEAKER pauses nervously)|Um miss, I don't think you can afford that... + +### (The SPEAKER frowns)|What does this look like, a charity? + +### (The SPEAKER smules)|You'll have to secure that by other means, I think~ + +### (The SPEAKER beeps)|Insufficient currency. + +### (Look at what she wants to buy) + +You're giving me everything you have. +당신은 당신이 가진 모든 것을 나에게주고 있습니다. +(Flail threateningly at her) +(그녀에게 위협적으로 도리깨질) +(Do it) +(해) +(Back off) +(물러나 다) + + +### (The SPEAKER approaches you with an offer)|Greetings! I am the potion seller.|I buy and sell only the strongest potions!| + +(The SPEAKER doesn't look surprised)|Okay, just let me set these down real quick... +(SPEAKER 는 놀란 표정을 짓지 않는다)|좋아요, 빨리 내려놓겠습니다... +(The SPEAKER smiles)|A spellcaster will have great use for this! +(SPEAKER 가 웃는다)|주문캐스터는 이것을 아주 유용하게 사용할 것입니다! +(The SPEAKER smiles)|Wow! That's a lot of mana!|It requires a skilled mage to tap into, though... +(SPEAKER 가 웃는다)|와우! 엄청난 마나네요!|사용하려면 숙련된 마법사가 필요하지만... +(The SPEAKER smiles)|It fills me with... determination. +(SPEAKER 가 웃는다)|그것은 저를... 결단력으로 가득 채웁니다. +(The SPEAKER smiles)|Refreshing! +(SPEAKER 가 웃는다)|상쾌하다! +(The SPEAKER smiles)|They say a bitter tea cures all ails... +(화자 미소)|그들은 쓴 차가 만병을 치료한다고 하던데... +(The SPEAKER smiles)|An empty flask?|...Oh. +(SPEAKER 미소)|빈 플라스크?|...오. + + +(The SPEAKER approaches you)|My greetings, Outsider!|My throat is parched and I seek the bounties of nature.|Do you have what I seek? +(SPEAKER 가 당신에게 다가옵니다)|안녕하세요, 아웃사이더!|목이 바짝 마르고 자연의 은혜를 찾습니다.|당신은 내가 찾는 것을 가지고 있습니까? +(The SPEAKER doesn't look surprised)|Then let us have a battle of wits! +(SPEAKER 는 놀란 기색이 없다)|그럼 슬기롭게 싸우자! +(The SPEAKER thanks you)|A kind offering! You have my thanks. +(화자 감사합니다)|친절한 제물입니다! 감사합니다. +(The SPEAKER thanks you)|A magnificent offering! You have my thanks. +(화자님 감사합니다)|훌륭한 제안입니다! 감사합니다. +(The SPEAKER tilts her head)|...where did you get this? +(SPEAKER 가 고개를 갸웃한다)|...이거 어디서 났어? +(The SPEAKER thanks you)|A fine trinket!|I will enjoy meditating upon it. +(화자 감사합니다)|좋은 장신구입니다!|명상하는 것을 즐기겠습니다. +(The SPEAKER thanks you)|I sense its flowing essence.|You have my thanks. +(The SPEAKER 가 당신에게 감사합니다)|나는 그것의 흐르는 정수를 느낍니다.|감사합니다. +(The SPEAKER thanks you)|I can feel a great sadness emanating from it.|It calls for warmth. +(The SPEAKER thanks you)|그것에서 뿜어져 나오는 커다란 슬픔을 느낄 수 있어.|따뜻함이 필요해. + + +### (The SPEAKER munches on a donut)|Gee I'm starving!|You wouldn't have something to eat, would you? + +### (The SPEAKER throws a donut in your face)|Ha! Take that! + +### (The SPEAKER smiles)|Yum! Thank you! + +### (The SPEAKER smiles)|Crunchy! My favorite! + +### (The SPEAKER tilts her head)|It smells funny...|Still, it'd be a shame for it to go to waste! + +(The SPEAKER approaches you with an offer)|Hello!|I am searching for magical scrolls.|Would you happen to have any? +(SPEAKER 가 제안을 가지고 당신에게 다가옵니다)|안녕하세요!|마법의 두루마리를 찾고 있습니다.|가지고 계실까요? +(The SPEAKER doesn't look surprised)|Rude! +(발표자는 놀란 기색이 없다)|무례하다! +(The SPEAKER smiles)|Thank you! +(SPEAKER 미소)|감사합니다! +(The SPEAKER raises a brow)|Thank you! This one is rare! +(화자가 이마를 찡그린다)|고마워요! 이건 희귀해요! + + +### (The SPEAKER invites you to a friendly chat)|Back in my day I used to go visit dungeons all the time|But these days I get so lost in my studies...|Say, you don't happen to have some magic supplies on you? + +### (The SPEAKER shrugs)|I guess that's how it is. + +### (The SPEAKER smiles)|Always nice to have some of these! + +### (The SPEAKER smiles)|I can never get enough of these. + +### (The SPEAKER smiles)|Elemental magic, interesting stuff. + +### (The SPEAKER tilts her head)|Why is it wet? + +### (The SPEAKER smiles)|Gladly, this will be useful to my studies. + +### (The SPEAKER smiles)|My legs don't carry me like they used to~ + +### (The SPEAKER smiles)|Always good to have somebody to talk to. + +### (The SPEAKER giggles)|Living dangerously, I see~ + +(The SPEAKER approaches you with an offer)|Hey girl~|You seem like the explorer type.|Happen to have any good finds? +(SPEAKER 가 제안을 가지고 접근함)|이봐 아가씨~|당신은 탐험가 타입인 것 같군요.|혹시 좋은 발견이 있으신가요? +(The SPEAKER frowns)|Well then. +(SPEAKER 가 눈살을 찌푸린다)|그럼. +(The SPEAKER grins)|Are you willing to part with this? +(SPEAKER 가 찡그린다)|이것과 헤어질 의향이 있습니까? +(The SPEAKER smiles)|Aha!|Fantastic. +(SPEAKER 미소)|아하!|멋지다. +(The SPEAKER frowns)|I'll take it, I guess... +(SPEAKER 가 눈살을 찌푸린다)|내가 할게요, 아마... +(The SPEAKER smiles)|Oooh~!|I love technology! +(SPEAKER 가 웃는다)|오오오~!|기술이 좋아요! +### (The SPEAKER nods)|A rare find! + + + +(The SPEAKER surprises you)|Greetings, traveler.|I am looking for tools to aid in my mission. +(SPEAKER 가 당신을 놀라게 함)|안녕하세요, 여행자님.|내 임무에 도움이 될 도구를 찾고 있습니다. +(The SPEAKER doesn't look surprised)|That's how it is, then. +(SPEAKER 는 놀란 기색이 없다)|그럼 그렇구나. +(The SPEAKER bows)|Always be prepared. +(SPEAKER 인사)|항상 준비하십시오. +### (The SPEAKER bows)|Always be extra prepared. + +(The SPEAKER bows)|A bit dangerous, but I'll take it. +(SPEAKER 인사)|약간 위험하지만 내가 할게요. +(The SPEAKER bows)|A tool of the trade. +(SPEAKER 가 절을 한다)|무역의 도구. +(The SPEAKER bows)|A most valuable find. +(발표자 인사)|가장 값진 발견입니다. + + +### (The SPEAKER tilts her shades)|I like to think of myself as a dealer in quality tools. + +### (The SPEAKER reaches for her hip)|I'd think twice if I were you... + +### (The SPEAKER smiles)|Nevermere keeps a tight grip on their blueprints.|Thank you. + +### (The SPEAKER smiles)|There's always a buyer.|That's just the way things are. + +### (The SPEAKER smiles)|Portable. Sustainable. A smart choice. + +### (The SPEAKER smiles)|That's what I'm talking about. + +### (The SPEAKER nods)|Yeah... that'll do. + +### (The SPEAKER looks somewhat crazed)|I'm looking for some heavy ordnance in order to...|...add to my collection.|Anyway, got any bombs? + +### (The SPEAKER reaches for her backpack)|I'll blow you away! + +### (The SPEAKER shrugs)|Cute fireworks, I suppose... + +### (The SPEAKER giggles)|That's what I'm talking about! + +### (The SPEAKER rubs her hands together)|Excellent... + +### (The SPEAKER smiles)|Yes! I can make more bombs! + +### (The SPEAKER takes a whiff of her cigar)|Hey friend. Im in the market for some 'tools,'|...if you catch my frift. + +### (The SPEAKER pulls out a knife)|Thought so. You won't take me that easily! + +### (The SPEAKER nods)|Could help out in a bind. + +### (The SPEAKER chuckles)|Lights out, eh... + +### (The SPEAKER nods)|I could use one of these! + +### (The SPEAKER smiles)|For when things go south... + +### (The SPEAKER smiles)|You can never be too safe. + +### (A distracted SPEAKER munches on a cookie) + +### (The SPEAKER continues eating her snack) + +### (The SPEAKER plucks the cookie out of your hand)|My favorite! + +### (The SPEAKER eats the brownies slowly, savoring every bite)|Kind of dense, but really good! + +### (The SPEAKER takes a bite out of the donut)|A bit heavy on the sprinkles... + +### (The SPEAKER blushes)|This is... my new favorite. + +### (The SPEAKER's eyes widen as she wolfs down the golden cookie)|Truly divine... + + + +### (The SPEAKER is reading a kinky fashion magazine)|Why hello gorgeous~|You seem like you know your way around fashion.|Say, I've been on the hunt for unique designs... + +### (The SPEAKER pouts)|I don't like your attitude. + +### (The SPEAKER smiles)|Classic vintage!|I approve~ + +### (The SPEAKER giggles)|A girls best friend, eh? + +### (The SPEAKER gasps)|What an amazing find!!! + +(The SPEAKER runs up to you)|Hello!|You wouldn't happen to have seen any ghosts lately?|I'm gathering evidence! +(SPEAKER 가 달려온다)|안녕하세요!|최근에 유령을 본 적이 없을까요?|증거를 수집 중입니다! +(The SPEAKER gasps)|You wouldn't! +(SPEAKER 헐떡거림)|당신은 그러지 않을 겁니다! +(The SPEAKER shakes your hand)|Ah! Ghosts love these! +(SPEAKER 가 당신의 손을 흔든다)|아! 유령들이 이걸 좋아해요! +(The SPEAKER smiles)|This looks like strong evidence for my investigation! +(화자 미소)|이것은 내 조사에 대한 강력한 증거처럼 보입니다! +(The SPEAKER grins)|Woah! That's so cool! +(SPEAKER 가 웃는다)|와! 정말 멋져요! + + +### (Look at what she has to sell) + +### (Sell Item0 for ItemCost0 gp) (Owned: AMNT0) + +### (Sell Item1 for ItemCost1 gp) (Owned: AMNT1) + +### (Sell Item2 for ItemCost2 gp) (Owned: AMNT2) + +### (Sell Item3 for ItemCost3 gp) (Owned: AMNT3) + +### (Sell Item4 for ItemCost4 gp) (Owned: AMNT4) + +### (Sell Item5 for ItemCost5 gp) (Owned: AMNT5) + +### (Sell Item6 for ItemCost6 gp) (Owned: AMNT6) + +### (Sell Item7 for ItemCost7 gp) (Owned: AMNT7) + +### (Sell Item8 for ItemCost8 gp) (Owned: AMNT8) + +### (Sell Item9 for ItemCost9 gp) (Owned: AMNT9) + +### (Buy Item0 for ItemCost0 gp) (Owned: AMNT0) + +### (Buy Item1 for ItemCost1 gp) (Owned: AMNT1) + +### (Buy Item2 for ItemCost2 gp) (Owned: AMNT2) + +### (Buy Item3 for ItemCost3 gp) (Owned: AMNT3) + +### (Buy Item4 for ItemCost4 gp) (Owned: AMNT4) + +### (Buy Item5 for ItemCost5 gp) (Owned: AMNT5) + +### (Buy Item6 for ItemCost6 gp) (Owned: AMNT6) + +### (Buy Item7 for ItemCost7 gp) (Owned: AMNT7) + +### (Buy Item8 for ItemCost8 gp) (Owned: AMNT8) + +### (Buy Item9 for ItemCost9 gp) (Owned: AMNT9) + +(The SPEAKER appears in a flash of light)|I come in the name of the Goddess.|I presume you need my aid?|(She will remain and help you with restraints for 50 turns) +(SPEAKER 가 섬광 속에서 나타납니다)|나는 여신의 이름으로 왔습니다.|내 도움이 필요한 것 같습니까?|(그녀는 남아서 50턴 동안 구속을 도와줄 것입니다) +(The SPEAKER gives you two knives)|Don't hurt yourself with these, okay? +(SPEAKER 가 너에게 칼 두 개를 준다)|이걸로 다치지마, 알았지? +(The SPEAKER gives you three picks)|I don't know how you plan to use these... +(SPEAKER 가 당신에게 세 가지 선택권을 줍니다)|나는 당신이 이것들을 어떻게 사용할 계획인지 모르겠습니다... +### (The SPEAKER reluctantly gives you a magic key)|Okay, but remember that these are rare and valuable. + +### (The SPEAKER looks impressed with your predicament)|No angel can remove these without a divine blessing.|Perhaps you should apply for one? *snickers* + +### (The SPEAKER looks impressed with your predicament)|I won't get between you and your quest duties! + +### (The SPEAKER looks impressed with your predicament)|Since you are Blessed by a goddess, I can help you.|(She performs a short prayer and a random divine lock comes off) + +(Ask for 2 knives) +(칼 2개 요청) +(Ask for 3 lockpicks) +(락픽 3개 요청) +(Ask for a magic key) +(마법의 열쇠를 부탁해) +### (Ask for help with a divine lock) + +There is no valid space next to you! +옆에 유효한 공간이 없습니다! + + +(You approach the SPEAKER) +(SPEAKER 에게 접근) +(Threaten) +(협박) +(Really attack?) +(진짜 공격?) +(Attack her) +(그녀를 공격) +(Never mind...) +(그만두자...) +(You decide not to) +(하지 않기로 결정) + + +### (Retaliate) + +### (Really attack? You will be justified and won't take an immediate rep penalty) + +### (Sneak Attack) + +### (Really attack? Target is unaware and will be stunned 1 turn.) + +### (Let me through!!) + +### (Walk past this unit) + +### (Walk past all units) + +### (Confirm? You will move through her for a few turns) + +(Stop following me) +(따라 다니지 말아 줘) +(Confirm? You will have to find the SPEAKER again.) +(확인? SPEAKER를 다시 찾아야 합니다.) +(You decide you still need the help) +(당신은 여전히 ​​도움이 필요하다고 결정했습니다) +(The SPEAKER refuses to follow your orders) +(SPEAKER 가 당신의 명령을 따르기를 거부합니다) + + +### (Remove BINDAMNT binding from her) UNTIETURNS + +### (You remove BINDANTPREV binding from the SPEAKER, excluding actual bindings)|(Use the 'Truss em Up' skill to remove bindings) + +### (Give her a restoration item) + +### (The SPEAKER appreciates the thought!) + +### Must have HP to untie. + +### (AMNT turns) + +### (AMNT turn) + +(Follow me) +(나를 따라와) +(The SPEAKER starts following you) +(SPEAKER 가 당신을 따라오기 시작합니다) +(You decide you don't need the help) +(당신은 도움이 필요하지 않다고 결정했습니다) + + +### (Hold still) + +(The SPEAKER follows your orders) +(SPEAKER 는 당신의 명령을 따릅니다) + + +(Don't stay here) +(여기에 머물지 마세요) +(Confirm?) +(확인?) +(You decide you would rather the SPEAKER stay put) +(당신은 SPEAKER 가 가만히 있기로 결정했습니다) + + +(Switch to Aggressive) +(공격적으로 전환) +(The SPEAKER will now pursue enemies) +(SPEAKER 가 이제 적을 추적합니다) + + +(Switch to Defensive) +(수비로 전환) +(The SPEAKER will stay close to you or its assigned position) +(SPEAKER 는 당신이나 할당된 위치에 가까이 있을 것입니다) + + +### (Flirting) + +### (The SPEAKER smiles)|This will be fun! + +### (The SPEAKER grins)|I will make sure you enjoy yourself~ + +### (The SPEAKER blushes)|Mmm~ Let's do this! + +### (The SPEAKER backs up)|I'm not in trouble, am I? + +### (The SPEAKER beeps)|This unit does not know how to respond... + +### (The SPEAKER moans)|Mmmmmph~ + +### (The SPEAKER appears too busy to discuss with you) + + + + + + + + + + + +### End of line. + +### *slaps your butt* + + + + + +### Error. Subject not complying? + + + + + +### Got yourself locked up, huh? Better go be good now~ + +### *she bumps up against your chastity and sighs* + +### Pleasure controls detected. + +### You've been a bad girl, haven't you? *taps on your chastity gear* + +### Such a naughty girl, getting yourself all locked up like that! + +### I-I know you want release, but you're in this gear for a reason~ + + + + + + + + + + + +### Had fun?~ + +### *turns the toy off and giggles* + + + + + + + + + +### Don't I look quite cuddly? + +### (Move closer, attempting to cuddle) + +### (The SPEAKER smiles)|You do, in fact!|(She inches closer) + +### (The SPEAKER smiles gently)|Aren't you precious~ + +### (The SPEAKER looks flustered)|Well, it's been a long day...|I could use a hug... + +### (The SPEAKER smirks and reaches for your body) + +### (The SPEAKER makes a beeping noise)|Loading cuddle module... + + + +### Got something for me? + +### (Present your body to her~) + +### (The SPEAKER smiles)|Am I thinking what you're thinking? + +### (The SPEAKER grins)|Why yes, I have just the thing~ + +### (The SPEAKER blushes)|Oh... let me check. + +### (The SPEAKER smirks)|Be careful what you ask for~ + +### (The SPEAKER pauses)|Calculating strictness threshold... + +### Yes please! (Hold out your wrists) + +### (Nod and blush) + +### Maybe not... + +### Why don't we have a little fun? + +### (Play with her) + +### (The SPEAKER giggles)|Mmmph~ + + + +### You look quite distracted... + +### (Help her with her distraction) + +### (The SPEAKER nervously smiles)|H-how'd you know? + +### (The SPEAKER smiles)|Indeed I am... Won't you assist me? + +### (The SPEAKER wiggles excitedly)|Y-yes miss! + +### (The SPEAKER shakes her head while blushing)|W-what makes you think that? + +### (The SPEAKER computes something)|Error... + +### (The SPEAKER nods)|Mmmph! + +### (Give her release with a magic wand) + +### (Set her toys to high for a while) + +### (Cuddle with her for 2 turns) + +### (The SPEAKER trembles with pleasure) + +### (The SPEAKER struggles to let go due to her chastity belt) + + + +### Let's go for a walk! + +### (Jump excitedly, presenting your collar for a leash) + +### (The SPEAKER smiles)|Sure! I'll take you for a walk, but only if you behave. + +### (The SPEAKER smiles)|Yes, I haven't had a nice walk in a while~ + +### (The SPEAKER blushes)|Sure! I'll make sure you don't get into trouble~ + +### (The SPEAKER giggles)|Time for walkies! + +### (The SPEAKER calculates)|Routing coordinates... + +(Ask her for help) +(그녀에게 도움을 요청하세요) +(Are you sure? She might see you as being submissive) +(정말입니까? 그녀는 당신을 복종하는 것으로 볼 수 있습니다) +(The SPEAKER prefers you the way you are) +(SPEAKER 는 있는 그대로의 당신을 선호합니다) +(The SPEAKER will help you out of your restraints) +(SPEAKER 가 당신의 속박에서 벗어나도록 도와줄 것입니다) +(You decide to deal with your problems yourself.) +(문제를 스스로 해결하기로 결정했습니다.) +(Plead with her to unlock you with a Command Word) +(명령어를 사용하여 잠금을 해제하도록 그녀에게 간청하십시오) +(Yes!) +(예!) +(The SPEAKER would rather 'conserve her mana') +(SPEAKER는 '마나를 절약'하는 것이 좋습니다) +(The SPEAKER utters a command word on you) +(SPEAKER 가 당신에게 명령을 내립니다) +(Your magical locks continue to restrain you.) +(당신의 마법 자물쇠가 계속 당신을 구속하고 있습니다.) +(Plead with her to unlock your restraints) +(그녀에게 구속을 풀어달라고 간청하십시오) +(The SPEAKER would rather not give up a magic key) +(SPEAKER는 마법의 열쇠를 포기하지 않겠다) +(The SPEAKER doesn't have any keys) +(SPEAKER에는 열쇠가 없습니다) +(The SPEAKER giggles and gives you a key) +(SPEAKER 가 낄낄거리며 열쇠를 준다) +(You remain locked tight.) +(당신은 단단히 잠겨 있습니다.) +(Stop receiving help) +(도움 받지마) +(Confirm? You will have to ask again to get help.) +(확인? 도움을 받으려면 다시 요청해야 합니다.) +(The SPEAKER will no longer help you.) +(SPEAKER는 더 이상 당신을 돕지 않을 것입니다.) +(You sigh as you realize you really need her help.) +(당신은 그녀의 도움이 정말로 필요하다는 것을 깨닫고 한숨을 쉬었습니다.) +### (Kick her out of your party) + +### (Confirm? She will stop following you) + +### (Remove from party) + +### (The SPEAKER understands.) + +### (You decide to keep her.) + +### (Add her to your party) + +### (Confirm? She will follow you across floors. You can only have 3 party members) + +### (Add to party) + +### (The SPEAKER is happy to join you) + +### (You decide not to.) + +(Sell items) +(아이템 판매) +(Buy items) +(아이템 구입) + + +### (Pick up her leash) + +### (Release her leash) + +### Dollmaker + +### The Dollmaker throws a device to the ground, teleporting her instantly! + +### The Dollmaker's necklace flashes as you find yourself suddenly restrained! (+RestraintAdded) + +### The Dollmaker's overbearing presence captivates you~ (DamageTaken) + +### The Dollmaker snaps her fingers as you find yourself locked! (DamageTaken) + +### The Dollmaker sinks into a pool of latex! + +### The Dollmaker suggests that you surrender. (DamageTaken) + +### DOLLMAKER + +### The Dollmaker falls kneeling to the floor, admitting defeat! + +### The Dollmaker snaps her fingers, and many robotic arms restrain you! (+RestraintAdded) + +### The Dollmaker orders you to KNEEL! (DamageTaken) + +Fuuka +후우카 +Fuuka surrounds herself in defensive talismans! +Fuuka는 방어 부적으로 몸을 감쌌습니다! +Fuuka wraps you tightly in restraints! (+RestraintAdded) +Fuuka가 당신을 속박으로 단단히 감쌉니다! (+RestraintAdded) +Fuuka squeezes your breasts and smiles! (DamageTaken) +후우카가 가슴을 쥐어짜며 웃는다! (DamageTaken) +### Fuuka snaps her fingers and all your restraints are locked! (DamageTaken) + +Fuuka surrounds herself in defensive talismans one more time! +Fuuka는 다시 한 번 방어 부적으로 몸을 감쌉니다! +Fuuka wraps you furiously in restraints! (+RestraintAdded) +Fuuka가 당신을 격렬하게 구속합니다! (+RestraintAdded) +Fuuka pouts as she tickles you relentlessly! (DamageTaken) +Fuuka는 가차없이 당신을 간지럽히며 입을 삐죽거립니다! (DamageTaken) + + +(You find a girl wearing an ornate dress)|(She glances at you)|And who might you be? +(화려한 드레스를 입은 소녀를 찾습니다)|(그녀는 당신을 흘끗 봅니다)|그리고 당신은 누구일까요? +I should be asking the same of you. +나도 당신에게 똑같이 물어야 합니다. +(Growl at her) +(그녀에게 으르렁거린다) +(She smiles)|My name is Fuuka, with the letters for Wind and Song.|Are you going to introduce yourself? +(미소 짓는다)|내 이름은 바람과 노래를 뜻하는 Fuuka입니다.|자기 소개를 할 건가요? +What kind of name is that? +어떤 종류의 이름입니까? +(SPEAKER frowns)|It means Windsong!|I bet yours isn't anywhere nearly as cool. +(SPEAKER 찡그린 얼굴)|Windsong을 의미합니다!|네 노래는 그렇게 멋지지 않을 거라고 장담합니다. +(SPEAKER looks enraged)|Because names and meanings are different things!|My name uses the script from the Old Civilization!|You're just a poser! +(화자가 격분한 듯)|이름과 의미는 다르기 때문입니다!|내 이름은 고대 문명의 대본을 사용합니다!|당신은 단지 잘난체하는 사람일 뿐입니다! +Why not just call yourself Windsong? +그냥 자신을 Windsong이라고 부르지 않는 이유는 무엇입니까? +I am an adventurer. +나는 모험가입니다. +(SPEAKER blushes)|Ah, right then... +(SPEAKER 붉어짐)|아, 그럼... +(SPEAKER giggles)|Very well. I don't really care who you are. +(SPEAKER 낄낄거림)|좋아요. 당신이 누군지 별로 신경쓰지 않아요. +I do not need to introduce myself. +나 자신을 소개할 필요가 없습니다. +Neither do I. +나도 마찬가지야. +I'm an adventurer. And who are you? +나는 모험가입니다. 그리고 당신은 누구입니까? +Mmmmm... (Blush) +음... (붉어짐) +(She grins)|My name is Fuuka, with the letters for Wind and Song.|The reincarnated ones call me Windsong,|they aren't very bright though. +(그녀가 웃는다)|내 이름은 바람과 노래의 글자를 가진 후카입니다.|환생자들은 나를 바람송이라고 부르지만|그들은 그다지 밝지는 않습니다. +Reincarnated ones? +환생자들? +(SPEAKER tilts her head)|I believe the term is 'Zombie' in the common tongue. +(SPEAKER 가 고개를 갸웃한다)|일반적인 언어로 '좀비'라는 용어가 있는 것 같아요. +### (SPEAKER enjoys the discussion)|When most people die, their spirits pass on to the next life.|But some stay in this world, and with the right blessings,|one can grant them a second chance!|I plan to give them all proper bodies...|Eventually. + +### How do they get reincarnated? + +### (SPEAKER enjoys the discussion)|No, they're people!|People who died long ago.|Now they live a new life, safeguarded by my Resurrection Arts! + +### Aren't they dolls? They can barely speak. + +### (SPEAKER pouts)|Why you...|Long ago, I made a contract with Ninril to guide lost souls back to her.|Do you doubt her blessing?! + +### Your Resurrection Arts don't seem very effective. + +### (SPEAKER looks puzzled)|People don't die anymore, but there are still lots of souls out there.|Whenever they stumble into the dungeon, searching for answers,|I'm still here, waiting! + +### What do you do now that people don't die? + +### (SPEAKER chortles)|So you've noticed!|As you can see, Ninril is very powerful~ + +### You don't look very old yourself. + +### (SPEAKER frowns)|Divine blessings shouldn't be used for such silly things! + +### Can you resurrect my back? It kind of hurts right now... + +### (SPEAKER smiles)|Those latex-clad idiots don't understand a thing.|Science can only get you so far!|Worship is where it's at! + +### The Alchemists are always looking for a youth potion. + +### (SPEAKER folds her arms)|Oh ho ho~|That's none of your business, for it is also part of my contract|to keep outsiders from interfering with the catacombs below! + +### Do you know what's on the next floor? + +### (SPEAKER blushes)|Nope, nothing at all!|In fact, whatever it is, you won't find it down here!|Now, would you like to become my pet? + +### Do you know anything about the Old Civilization? + +### (SPEAKER shrugs)|Oh really...|Must be the fey playing tricks, hehe... + +### I've seen a few robots running around! + +### (SPEAKER looks nervous)|Oh yeah? Where'd you hear that?|The 'adventurer's guild,' huh?|Why don't you just leave the dead to rest~ + +### I heard there was an ancient facility on this island. + +### (SPEAKER sighs)|Look, the Goddess doesn't tell me everything.|Now then, I have a job to do and some pets to manage.|Please stop asking questions! + +### Is Sariel Vinlaga down here? + +### (SPEAKER frowns)|What's with all the questions!|There totally isn't some kind of doll processing facility here!|Perhaps you're a brainwashed doll yourself? + +### Does DressUp Co. get their 'cyber doll' products from here? + +### (SPEAKER chuckles)|I smell a hint of jealousy~ + +### I don't want to be a pet, so you'll have to force me. + +### (SPEAKER jumps up and down)|You would!?|That's wonderful~|My resurrection magic can make you young again forever!|All you have to do is pledge your soul to Nirin, the Goddess of Restoration! + +### I'd love to be your pet! + +### (SPEAKER pouts)|Hmmph. Suit yourself. + +### Pledge my soul? That changes things... + +(SPEAKER giggles)|Hehe... you sound interested. +(SPEAKER 웃음)|헤헤...흥미가 있는 것 같군요. +(SPEAKER frowns)|Never ask a woman about her age! +(SPEAKER 찡그린다)|절대 여자에게 나이를 묻지 마세요! +I take it you're the hag in charge? +당신이 담당 노파라고 생각합니까? +You are in charge, right? +담당자 맞죠? +(Giggle) +(킬킬 웃음) +Don't mess with me, little girl. +나랑 장난치지마, 꼬마야. +Mmpphgh? (Pout at her) +음? (그녀에게 삐죽) +(She smirks)|So you're that kind of visitor, huh? +(그녀는 웃는다)|그래서 당신은 그런 종류의 손님이군요, 그렇죠? +That's right. How powerful are you? +좋아요. 당신은 얼마나 강력합니까? +(She cracks her knuckles)|I have been practicing the resurrection arts for a thousand years. +(손목을 꺾는다)|나는 천년 동안 부활 술을 수련해 왔다. +(She smiles)|All the zombies you seee in the Graveyard?|They are my pets, and I care for each and every one of them. +(미소 짓는다)|묘지에서 보이는 모든 좀비들?|그들은 내 애완동물이고 나는 그들 모두를 돌본다. +What the heck are 'Resurrection Arts'? +도대체 '부활술'이 뭐야? +It's time for a true display of skill! +진정한 실력을 발휘할 때입니다! +Hmmph. (Look away) +흠. (멀리 봐) +(She grins)|We'll wipe that pout off your face soon enough... +(그녀가 웃는다)|당신의 얼굴에 묻은 그 뾰루지를 곧 닦아줄게요... +(She frowns)|Well, you will soon. +(그녀는 눈살을 찌푸린다)|글쎄, 곧 알게 될거야. +Pfff. Never heard of it. +큭큭 들어 본 적이 없습니다. +I bet I could do better. +내가 더 잘할 수있을거야. +Why does that matter to you? +그게 왜 당신에게 중요합니까? +(Stare at her silently, maintaining your posture) +(자세를 유지하며 말없이 그녀를 응시한다) +(She grins)|I am in charge of this place.|Everything that goes through here goes through me.|You may address me as Fuuka Windsong. +(그녀가 웃는다)|나는 이곳을 책임지고 있습니다.|여기를 통과하는 모든 것은 나를 통과합니다.|당신은 나를 Fuuka Windsong이라고 부를 수 있습니다. +By what authority? +어떤 권한으로? +(SPEAKER tilts her head)|Ummmm.... uh...|The Old Civilization! Of course!|I've been keeping their traditions for centuries. +(SPEAKER 가 고개를 갸웃한다)|음.... 어...|오래된 문명! 물론이죠!|나는 그들의 전통을 수세기 동안 지켜왔습니다. +(SPEAKER blushes)|Umm... That's because...|Oh shut up! +(SPEAKER 얼굴이 붉어짐)|음...그건...|아 닥쳐! +You don't sound too confident. +자신감이 없으신 것 같군요. +Who are you anyway? +어쨌든 당신은 누구입니까? +Fair enough. I am an adventurer. +그럴 수 있지. 나는 모험가입니다. +(SPEAKER giggles)|Is that a challenge? +(SPEAKER 웃음)|그게 도전인가요? +(Nod calmly) +(조용히 끄덕인다) +(SPEAKER grins)|Is that a challenge? +(SPEAKER 가 웃는다)|그게 도전인가요? +We'll see about that. +우리는 그것에 대해 볼 수 있습니다. +Hmmph. (Scoff into your gag) +흐읍읍. (당신의 개그에 비웃는다) +It is indeed! +정말이다! +I'm an adventurer, miss. +저는 모험가입니다, 아가씨. +Mmmpphh~ (Moan and wiggle seductively) +으음~ (매혹적으로 신음하며 흔든다) +(She grins)|Oh look at you!|I'm going to dress you up and make you my pet!|You can have all the scritches and snuggles you want!|My name's Fuuka! +(그녀가 웃는다)|오 봐요!|당신에게 옷을 입히고 내 애완동물로 만들겠습니다!|당신은 원하는 모든 긁힘과 껴안기를 가질 수 있습니다!|내 이름은 Fuuka입니다! +A pet? What kind? +애완 동물? 어떤 종류? +(SPEAKER hops up and down excitedly)|Oh I've got dresses!|And all sorts of fun gear!|Maybe even this huge gag for you to chew on! +(SPEAKER 가 신나게 위아래로 뛰어다님)|오 드레스가 있어요!|그리고 온갖 종류의 재미있는 장비가 있어요!|아마도 당신이 씹을 수 있는 이 거대한 개그까지요! +(SPEAKER grins)|Having second thoughts? +(SPEAKER 가 웃는다)|생각이 바뀌었나요? +That sounds... harsh. +그건... 심한데. +...Maybe +...아마도 +Exciting! +신나는! +That sounds great. But who are you miss? +그거 좋을 거 같아. 하지만 당신은 누구를 그리워합니까? +Mmmmph~ +으읍읍~ +(SPEAKER giggles)|Hehe... We will have so much fun~ +(SPEAKER 낄낄거림)|헤헤... 너무 재미있겠다~ +(SPEAKER giggles)|You don't have to consent, dear~ +(SPEAKER 웃음)|동의하지 않아도 돼, 얘야~ +I never said I consented to being a pet! +나는 내가 애완 동물이되는 데 동의했다고 말한 적이 없습니다! +(Give her a puzzled look and shake your head) +(당황한 표정을 짓고 고개를 흔든다) +No way! +안 돼요! +(Sigh and shrug) +(한숨과 어깨를 으쓱) +(Attack her without saying anything) +(아무 말도 없이 그녀를 공격한다) + + +### (SPEAKER clears her throat)|I am the one tasked with keeping this graveyard pure and holy.|The reincarnated ones who roam this place do so with my permission.|But what of you? I do not remember striking a deal with you.|Are you here to challenge me? + +I do what I want. +나는 내가 원하는 것을 한다. +(Glare at her and scoff) +(그녀를 노려보며 비웃는다) +(SPEAKER makes a big grin)|I take that you wish to challenge me?|Very well!|Come at me! +(SPEAKER 가 활짝 웃는다)|나에게 도전하고 싶다고 생각합니까?|좋아요!|이리 와요! +### About those 'reincarnated ones'... + +You have no power over me +당신은 나에 대한 권한이 없습니다 +Hmmph. (Stand proudly) +으읍. (자랑스럽게 서다) +(SPEAKER smiles)|Then let us fight!|If I win, I will make you my pet.|If you win, I will let you pass. +(SPEAKER 미소)|그럼 우리 싸우자!|내가 이기면 너를 내 애완동물로 만들겠다.|네가 이기면 너를 통과시키겠다. +I don't want to fight, miss... +난 싸우고 싶지 않아, 아가씨... +Mmph! (Shake your head frantically) +읍! (고개를 미친듯이 흔든다) +(SPEAKER giggles)|Come now, I want to see how good you are! +(SPEAKER 웃음)|이리 오세요, 당신이 얼마나 좋은지 보고 싶어요! +Yes, I am here to fight you. +네, 당신과 싸우러 왔습니다. +(SPEAKER smiles)|Then what are we waiting for? +(SPEAKER 미소)|그럼 우리는 무엇을 기다리고 있는 거지? + + +You're on! +당신은 켜져 있습니다! +Hmmmph! +흐읍읍! +Let us duel! +결투하자! +Mmmmmghh! +읍흐읍읍! +I suppose... +아마도... + + +(SPEAKER smiles as she stands over you)|Well well. Look who won. +(SPEAKER 가 당신을 바라보며 미소짓는다)|글쎄요. 누가 이겼는지 보세요. +### (SPEAKER nods and giggles)|Absolutely.|Allow me to present to you, my prized pet collar!|I save it only for my favorite pets.|That's right! You're my favorite pet now~ + +### (SPEAKER giggles)|You're not in a position to resist.|Now then, where did I put that collar... + +### (SPEAKER smiles)|It's a magical spell that seals your power temporarily~|I use it for my pets when they're being unruly...|(She brandishes a collar) Now including you! + +### What's this weird magic? + +You beat me fair and square. +당신은 나를 공정하게 이겼습니다. +Mmmph. (Submit) +읍읍. (수락) +You cheated! +당신은 속였다! +Mmmph! (Struggle weakly) +읍! (약하게 몸부림친다) +(Sigh and accept your fate) +(한숨 쉬고 운명을 받아들여) +(Accept the collar eagerly) +(목걸이를 간절히 받아) +(Accept the collar begrudgingly) +(마지못해 옷깃을 받아) +### (SPEAKER presents you with your collar...)|(She locks it around your neck)|You are free to go now, dear! + +(SPEAKER puts up a wall of talismans to regain her strength)|I'm... I'm not finished yet! +(SPEAKER 가 힘을 되찾기 위해 부적의 벽을 세움)|난... 아직 끝나지 않았어! + + +(SPEAKER is out of breath)|I... can't... believe... it...|She drops her keys... +(SPEAKER 가 숨이 차다)|난... 믿을 수 없어... 믿을 수 없어...|열쇠를 떨어뜨리고... +(SPEAKER looks flabbergasted)|R-really? Okay... I'll give you a reward then... +(SPEAKER 기가 막힌 듯)|R-정말요? 알았어...그럼 보상을 줄게... +### (Submit to her anyway) (Gain a special collar) + +(SPEAKER resists but ultimately you force a gag into her mouth)|MMMMMPH! +(SPEAKER 가 저항하지만 결국 당신은 그녀의 입에 재갈을 물려줍니다)|음음! +(Gag her) +(개그 그녀) + + + + +(This ghost had something to say,|but it appears you've run into a bug instead)|Please report this to Ada18980 on deviantart! +(이 유령이 할 말이 있었는데|하지만 버그에 걸린 것 같습니다)|deviantart에서 Ada18980에게 이 사실을 보고해 주세요! + + +(Continue) +(계속하다) +(Make a smug face as you walk past) +(지나가면서 잘난 체하는 얼굴을 한다) +Thank you! +고맙습니다! +I don't need your advice, strange ghostly person. +네 충고는 필요 없어, 이상한 귀신아. + + +### Oh, those people that locked you up?|I dealt with them.|Now come along, there's no time to waste! + +### (The SPEAKER giggles)|Treasure? The treasure isn't going anywhere.|Plus, I made a few enemies on the way.|We better not wait till they come back. + +### But what about the treasure!? + +### (The SPEAKER ponders your question)|I think we'll have to talk about compensation|AFTER we get out of here. + +### So how much is this going to cost me? + +### (You hear footsteps. It's the SPEAKER!)|Why look at you!|Well you seem to be in a bind, don't you? + +### Not to worry! I'll get you out of here! + +### Hehe, alright! If that's what you want~ + +### (Shake your head and refuse rescue) + +### Actually I was having fun... + +### (The SPEAKER, your longtime friend, smiles)|Well well, if it isn't you again!|I see that you've decided to challenge the dungeon again.|Don't forget to bring some gold back with you,|there's a fee for rescue~ + +### Can you help with these restraints? + +### Pfffmmm hhmmph mmph... (Please Help Me) + +### No can do! Even I can't get those off of you. + +### Caught by...? + +### Hah!|You've been here a million times!|You obviously know how dangerous it is, yes? + +### F-fee? There's a fee? + +### Yep! It'll cost ya!|Quite worth it if you ask me.|Unless you'd like to spend the rest of your life in chains! + +### Will you buy my loot? + +### (Show her your loot) + +### Absolutely! I offer the standard market rate for anything.|I'll take enchanted items too!|I've got plenty of volunteers to check for curses~ + +### Got something you want to show me? + +### (Sell Items) + +### (Sell Whole Stacks of Items) + +### Daww! What a cutie!|(She smiles and pats your head gently) + +### Do you have anything for sale? + +### (Look around for items to buy) + +### I'm sorry sweetie, I don't sell merchandise here.|Who would set up a shop inside a dungeon? That's crazy!|But you adventurers bring in a steady supply of loot,|so if you've got something to sell me, I'll take it off your hands~|You can also talk to my guests, perhaps they have something for you. + +### (Return) + + + +### (The SPEAKER brings you safely back to her shop)|There! Nice and safe.|Now, as for my fee...|That'll be RESCUECOST gold pieces! + +### Right! Here's RESCUECOST gp. + +### Mmmph. (Nod your head and pay RESCUECOST gp) + +### (The SPEAKER smiles)|Pleasure doing business with ya~ + +### Mind adding it to my tab? + +### (Shake your head regrettably.) + +### (The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|But I won't be letting you out of those restraints~ + +### (The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|You're a good customer, after all. + +### (The SPEAKER folds her arms)|Come on now, I can hear the gold jingling in your pocket! + +### Pretty please? I promise I'll pay you back. + +### (Be insistent) + +### (The SPEAKER rubs her chin)|Fine, I believe you.|But I won't be letting you out of those restraints! + +### (The SPEAKER sighs)|Fine, I believe you.|You better believe I won't forget, though! + +### (The SPEAKER folds her arms)|Your adventures have cost me a pretty penny.|I can't stay in business if my clients keep running off without paying.|Look, I'll cut you a deal, you help me, I help you. Fair? + +### (Help her test cursed armors) + +### (Add cursed restraints as collateral) + +### (Wear a collar to help advertise her business) + +### (Wear a catsuit to help advertise her business) + +### (Actually... just pay her the RESCUECOST gold) + +### (The SPEAKER holds up a RESTRAINTNAME)|I've bought some armors from an adventurer lately,|but I don't know if they're safe to wear.|Why don't you try it on for me?|I'll postpone your debt for a later time. + +### (The SPEAKER holds up a RESTRAINTNAME)|I need to make sure you won't go running off again.|This RESTRAINTNAME here has a special seal on it.|I can get you out of it, of course, but you'll have to pay up first. + +### (The SPEAKER holds up a RESTRAINTNAME)|Your captors are quite the market for high-security restraints.|If you get captured by them, maybe they'll see my logo on this collar!|It's quite comfy and secure,|you'll end up feeling more submissive the more your wear it. + +### (The SPEAKER holds up a RESTRAINTNAME)|Your body looks like a great billboard!|This suit will make you so attractive that nobody will be able to resist!|And in the process of, ahem, examining you,|They'll be sure to see my logo! + +### (The SPEAKER folds her arms and nods)|Good girl! I knew you would come clean~ + +### Sure! I accept! + +### (Nod in approval) + +### How about something else? + +### Excellent! Please hold still~|(She fits the RESTRAINTNAME on and a seal awakens)|Whoops! Good thing I didn't sell that one!|I'll let you keep it, it's my treat~ + +### Excellent! Please hold still~|(She fits the RESTRAINTNAME on and nothing happens)|We have a winner!|You can't have it though, not until you pay up~ + +### Wonderful. I look forward to seeing you being delivered, er, coming back,|Lots of treasure in hand!|(She places the RESTRAINTNAME on you and the seal activates. There is no keyhole.) + +### Alright! Why don't you hold still~|(She lifts your hair out of the way and buckles the collar on)|Now go out there and find me some treasure~ + +### You're gonna like it, I guarantee it~|(She pulls out the catsuit from a drawer, dusts it off, and helps you in it)|(There is no zipper or fastener, just a very stretchy neck hole)|(Once it's on and well-fitted, you feel the neck grow less loose...)|(...and pulling the rubber away from your skin becomes impossible)|Beautiful. I'm going to let you go now.|I'm sure your new look will attract many customers! + +### No? That's alright.|I'm sure I'll find someone else to test these on, huehue. + +### Up to you!|You'll still have to pay me eventually~ + +### Your choice~|I am open to further negotiations. + +### Your choice~|Not everyone is up to putting themselves on display like that~ + + + +### (The SPEAKER pats you down and makes sure you're okay)|I can definitely help with those!|But as you know, I help a lot of adventurers just like you.|You know what, I'll give you a discount!|That'll be RESCUECOST gold pieces! + + + +### (The SPEAKER rubs her chin)|Sorry miss!|Cost of doing business, you know?|Why don't you come back with some of that delicious, shiny gold~ + +### (The SPEAKER folds her arms)|Business is business, miss~ + +### (The SPEAKER rubs her chin)|No can do.|Rules are rules~ + +### (The SPEAKER sighs)|Business is business, miss~ + +### (The SPEAKER reluctantly frees you)|...Fine, I'll cut you a deal.|You help me, I help you. Fair? + + + + + + + +The next floor is a normal floor. +다음 층은 일반 층입니다. +This floor is suffering from a slime mold infestation.|Maids have been deployed to deal with the problem.|They could use a hand. +이 바닥은 점균류 감염으로 고통받고 있습니다.|문제를 처리하기 위해 가정부가 배치되었습니다.|그들은 손을 사용할 수 있습니다. +This floor is being ransacked by bandits.|They are armed and dangerous.|But I hear there's a bounty on their heads? +이 층은 도적들에게 약탈당하고 있습니다.|그들은 무장하고 위험합니다.|하지만 그들의 목에 현상금이 걸려 있다고 들었습니다. +A cave dragon was captured in the next floor.|It's brimming with elemental magic,|and there are a lot of interested parties! +다음 층에서 동굴 드래곤이 잡혔어.|원소 마법이 넘쳐나고|관심있는 사람들이 많아! +The witches told me to keep you out.|I'm not exactly capable of doing that,|so feel free to do as you please. +마녀들이 당신을 막으라고 했어요.|나는 그렇게 할 수 없어요.|그러니 마음대로 하세요. +The next floor is overgrown.|I'd watch your feet if I were you. +다음 층은 풀이 무성해.|내가 너라면 네 발을 지켜줄게. +Slimes, slimes EVERYWHERE!|Fortunately there's a slime-harvesting|operation going on. +슬라임, 슬라임이 도처에!|다행히도 슬라임 수확|작업이 진행 중입니다. +The trainers are taking their wolfgirls out for a walk.|I'd steer clear.|Unless you want to become one of their pets~ +조련사들이 늑대소녀들을 데리고 산책을 나가고 있습니다.|비켜가겠습니다.|당신이 그들의 애완동물이 되고 싶지 않다면~ +Rumor has it that one of the cyber-dolls escaped.|Their handlers are looking for her.|They're catching every young girl they can find! +사이버 인형 중 하나가 탈출했다는 소문이 있다.|그들의 조련사가 그녀를 찾고 있다.|그들은 그들이 찾을 수 있는 모든 어린 소녀를 잡고 있다! +This is totally a normal floor.|No doubt about it. +여기는 완전히 평범한 바닥이야.|의심의 여지가 없어. + + +### This is a debug mode journey for testing the latest region. + + + +These are the stairs to the tutorial hall. +여기는 튜토리얼 홀의 계단입니다. + + +Congratulations! You've completed the tutorial!|Now get in there and stay out of trouble~ +축하합니다! 튜토리얼을 완료했습니다!|이제 거기에 들어가서 문제를 피하세요~ + + +Welcome to the dungeon!|Don't panic, this is a turn-based game,|and nothing will happen until you move.|On your left you'll see your character,|displayed with all of the bondage they don't have.|Don't worry, you'll find some soon! +던전에 오신 것을 환영합니다!|당황하지 마세요, 이것은 턴 기반 게임입니다.|당신이 움직이기 전까지는 아무 일도 일어나지 않을 것입니다.|당신의 왼쪽에는 당신의 캐릭터가 보일 것입니다. 없어요.|걱정하지 마세요, 곧 찾을 수 있을 거에요! + + +You might be wondering what all these barrels are for.|Don't worry, they're, uh, totally safe!|When you are inside one you can click on yourself to wait.|Enemies have a hard time seeing you inside a barrel,|so you can wait until they pass by you. +당신은 이 모든 통들이 무엇을 위한 것인지 궁금할 것입니다.|걱정하지 마세요, 그것들은, 어, 완전히 안전합니다!|당신이 그 안에 있을 때 당신은 기다리기 위해 당신 자신을 클릭할 수 있습니다.|적들은 당신이 안에 있는 것을 보는 데 어려움을 겪습니다 그들이 당신을 지나갈 때까지 기다릴 수 있도록 배럴. + + +### On the right you'll see your stats and spells slots.|Your DP, SP, MP, and WP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon. + +Your WP, or willpower, is an important resource.|Without it, escaping from restraints is more difficult.|There is a willpower potion on the floor up there. Go get it! +당신의 WP 또는 의지력은 중요한 자원입니다.|그것 없이는 구속에서 벗어나기가 더 어렵습니다.|저 위 바닥에 의지력 물약이 있습니다. 가서 가져와! +### Oh no! That trap reduced your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack). + +### Another trap!|You'll notice that the trap also drained your stamina considerably, preventing you from sprinting or attacking.|(Note: you can toggle sprinting using the '>>' button on the bottom bar)|You can protect yourself while your stamina regenerates by retreating into the room above.|Close the door by clicking the Close Door button in the bottom bar.| + +### Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the right menu, then navigate to the Spell Tree.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1. + +On the right you'll see your stats and spells slots.|You can click on a spell slot or hit 1-4 on your keyboard to cast a spell|then click on the map for where you want to aim it.|The small wrench icon above them will let you|swap them out for another spell from your spellbook. +오른쪽에는 통계 및 주문 슬롯이 표시됩니다.|주문 슬롯을 클릭하거나 키보드에서 1-4를 눌러 주문을 시전할 수 있습니다|그런 다음 조준할 위치의 지도를 클릭합니다.| 그들 위에 있는 작은 렌치 아이콘을 사용하면 주문서에서 다른 주문으로 교체할 수 있습니다. +There's a zombie over there!|Fortunately zombies are weak to fire.|Firebolt has a very long range,|so simply cast firebolt and click on the zombie.|Repeat until it is dead. +저쪽에 좀비가 있어요!|다행히 좀비는 발사에 약합니다.|파이어볼트는 사거리가 매우 길기 때문에|파이어볼트를 시전하고 좀비를 클릭하기만 하면 됩니다.|죽을 때까지 반복합니다. +### Mana potions restore mana, allowing you to cast spells.|Youll notice that your mana also regenerates slowly.|This mana comes from your mana pool,|which is a thin line displayed under the mana bar.|When that runs out, you can't cast spells anymore! + +Your DP, or Distraction, is a measure of...|How much you are enjoying things.|These sorts of thoughts cloud your mind,|so spellcasting is more difficult when you are distracted.|Go grab the potion over there. +당신의 DP, 즉 산만함은...|당신이 얼마나 즐기고 있는지에 대한 척도입니다.|이러한 종류의 생각은 당신의 마음을 흐리게 합니다|따라서 당신이 산만할 때 주문 시전이 더 어렵습니다.|가서 거기 물약을 가져오세요. +Did you like that?|Anyway, there's a zombie over there. You should drink that potion.|It will clear your mind so you can cast again.|Hurry, or it will get you! +좋았어?|어쨌든 저쪽에 좀비가 있어. 그 물약을 마셔야지.|정신이 맑아져서 다시 시전할 수 있을거야.|서두르지 않으면 잡을거야! + + +That wasn't so hard, was it?|Now then, there's a treasure chest over here. Why don't you open it? +그렇게 힘들지 않았어?|자, 여기 보물상자가 있네. 열어보지 그래? +Yikes, looks like you're in a bind!|No worries, though. There's a key to those cuffs over there.|Simply hover over the cuffs item test on the left side.|Then, click the lock icon to remove the lock.|Finally, click the buckle to remove the cuffs. +이런, 곤경에 처한 것 같군요!|그래도 걱정하지 마세요. 저기 수갑의 열쇠가 있습니다.|왼쪽의 수갑 항목 테스트 위로 마우스를 가져가면 됩니다.|그런 다음 자물쇠 아이콘을 클릭하여 잠그십시오.|마지막으로 버클을 클릭하여 커프스를 제거하십시오. +I think we all know what's in the next chest.|It's important to understand the different ways you can escape.|You can struggle, which costs the most stamina|but makes other struggle methods faster.|You can cut, which requires a knife in hand.|You can remove, which represents untying or unbuckling. +우리 모두는 다음 상자에 무엇이 있는지 알고 있다고 생각합니다.|탈출할 수 있는 다양한 방법을 이해하는 것이 중요합니다.|투쟁할 수 있습니다. 스태미나가 가장 많이 소모되지만|다른 투쟁 방법이 더 빨라집니다.|절단할 수 있습니다. 손에 칼.|제거할 수 있습니다. +Ouch, that looked tight...|Sometimes you won't be able to struggle out of things.|You'll have to find some other way to take it off... +아야, 빡빡해보이는데...|때때로 너는 물건에서 빠져나오지 못할 것이다.|그것을 벗을 다른 방법을 찾아야 할거야... +There's a few zombies up ahead.|Fight your way through and claim the treasure! +앞에 좀비 몇 마리가 있습니다.|전투를 벌여 보물을 차지하세요! + + +You're not feeling it... +당신은 그것을 느끼지 않습니다 ... +You close your eyes but the vibrations keep you from dozing off... +눈을 감아도 진동 때문에 잠이 오지 않는다... + + +(A SPEAKER lies hogtied in front of you)|(She looks at you with pleading eyes,)|(and mumbles incoherently through her gag) +(A SPEAKER 가 당신 앞에 결박되어 누워 있습니다.)|(그녀는 애원하는 눈으로 당신을 바라보고 있습니다.)|(재갈을 물고 중얼중얼 중얼거립니다.) +(A SPEAKER lies hogtied in front of you)|(She looks at you, mumbling and giggling into her gag) +(A SPEAKER 가 당신 앞에 결박되어 누워 있습니다.)|(그녀는 당신을 바라보며 중얼거리고 그녀의 재갈 속으로 낄낄거립니다) +(SPEAKER looks grateful)|Thank you so much|I shall join your party. +(SPEAKER 는 감사해 보인다)|정말 감사합니다|당신의 파티에 합류하겠습니다. +(SPEAKER looks grateful)|Thank you so much miss!|I owe you everything. +(SPEAKER 는 감사해 보인다)|정말 고마워요 아가씨!|당신에게 모든 것을 빚지고 있어요. +(SPEAKER groans and wriggles around uselessly) +(SPEAKER 가 신음하며 쓸데없이 몸부림친다) +(SPEAKER moans and rolls around, blushing deeply) +(SPEAKER 가 신음하며 뒹굴며 얼굴을 붉히며) +Untie her +그녀를 풀어준다 +Make sure she is tight and secure +그녀가 단단하게 꽉 조여져 있는지 확인한다 + + +(A SPEAKER bumps into you while immersed in her thoughts)|Oh! Hello!|Say, you look adorable...|Do you mind helping me find something? +(생각에 잠긴 당신과 마주친 SPEAKER)|오! 여보세요!|말해, 당신은 사랑스러워 보인다...|내가 뭔가 찾는 것을 도와줄래? +(The SPEAKER jumps up and down)|Ah, wonderful!|I've misplaced one of my dresses.|If you could find one, wear it, and bring it to me,|I'd greatly appreciate it! Thanks! +(SPEAKER 가 위아래로 펄쩍펄쩍 뛰며)|아, 멋지군!|내 드레스 중 하나를 잃어버렸어.|찾을 수 있으면 입고, 가져다 줘,|정말 고맙겠어! 고마워! +(The SPEAKER stares at you like a rabid animal)|Wowie! You look gorgeous!|Thank you so much!|(She snaps a photo of you using a magic crystal) +(SPEAKER 가 광견병에 걸린 동물처럼 당신을 응시합니다)|와위! 당신 정말 멋져요!|정말 감사합니다!|(그녀는 마법 수정을 사용하여 당신의 사진을 찍습니다) +(The SPEAKER giggles)|I never said I'd take it off, did I? +(SPEAKER 가 낄낄거린다)|내가 벗겠다고 말한 적 없지? +(The SPEAKER smiles)|Sure thing! +(SPEAKER 가 웃는다)|물론이죠! +(Show interest) +(흥미를 보이다) +I found your dress... +너의 드레스를 찾았어... +Mmmph... (Found the dress!) +으읍읍... (드레스를 발견했다!) +Great! Can you take it off? +엄청난! 벗을 수 있습니까? +Mmmmm! (Struggle) +흐읍읍! (저항한다) + + +(A SPEAKER clutching her books approaches you)|Miss adventurer!|I happen to need a magic scroll of any kind.|It's for my studies. +(책을 움켜쥐고 있는 SPEAKER 가 당신에게 다가온다)|모험가 양!|우연히 어떤 종류의 마법 두루마리가 필요합니다.|내 연구를 위한 것입니다. +(The SPEAKER smiles)|Yes, thank you so much!|It's been so difficult to get them lately.|The magic library is closed off these days,|and there are mean people trying to get the scrolls back... +(SPEAKER 가 미소짓는다)|네, 정말 감사합니다!|요즘 구하기가 너무 힘들어요.|요즘 마법 도서관이 문을 닫았는데|두루마리를 되찾으려는 비열한 사람들이 있어요... +(The SPEAKER is happy)|Thank you so much! +(SPEAKER 가 기뻐함)|정말 감사합니다! +Give her a Scroll of Sauntering +그녀에게 산책의 두루마리를 줘 +Give her a Scroll of Sleight +그녀에게 Sleight의 두루마리를 줘 +Give her a Scroll of Speech +그녀에게 연설 두루마리를 줘 +Give her a Scroll of Purity +그녀에게 순결의 두루마리를 줘 + + +(A SPEAKER looks distraught)|Well met, adventurer!|We have a problem... +(화자가 정신이 나간 듯 보인다)|잘 봤습니다, 모험가님!|문제가 생겼습니다... +(The SPEAKER folds her arms)|A rebel has been causing us problems lately...|If you run into her, give her all you got!|She needs to be brought to justice. +(화자가 팔짱을 낀다)|요즘 반란군이 우리에게 문제를 일으키고 있어...|만약 그녀를 마주치면, 그녀에게 당신이 가진 모든 것을 주세요!|그녀는 정의의 심판을 받아야 합니다. + + +(A SPEAKER scoffs in your direction)|Well? You lookin' for work or no? +(SPEAKER 가 당신을 향해 비웃는다)|글쎄요? 일자리를 구하는 건가요, 없는 건가요? +(The SPEAKER grins)|A bunch of delinquents stormed out recently.|They're looking for a way out of their belts.|Someone oughta show em their place,|if you catch what I'm saying. +(SPEAKER 가 웃는다)|최근에 한 무리의 불량자들이 들이닥쳤습니다.|그들은 벨트에서 벗어날 방법을 찾고 있습니다.|누군가가 그들에게 그들의 위치를 ​​보여줘야 합니다|내가 말하는 것을 이해한다면. + + +(A SPEAKER approaches you in your cell)|Since you've been a bad girl,|we're taking you to the high-security prison. +(감옥에서 SPEAKER 가 접근함)|당신이 나쁜 여자였으니|우리는 당신을 높은 보안 감옥으로 데려갈 것입니다. +(The SPEAKER folds her arms)|Want to or not, you're going. +(SPEAKER 가 팔짱을 끼며)|원하든 원하지 않든, 당신은 갑니다. +(Resist) +(저항하다) +(Submit) +(제출하다) + + +### (A SPEAKER approaches you in your cell)|Looks like you're not in the System.|I'm going to have to take you to sorting. + +### (The SPEAKER grins as her systems glow)|I love my job sometimes~ + +### (The SPEAKER grins)|It means you'll get nicely packaged,|so that we can sort you through the System. + +### W-what does that entail? + +### (The SPEAKER giggles)|That means we'll get to package you up and|decide what to do with you, silly~ + +### Hmmmph? Mmmm! (Act worried and whimper) + +### (The SPEAKER folds her arms)|Mistress Oriel's orders + +### Not in the 'System'? + +### (The SPEAKER giggles)|Don't worry, we'll get you sorted out soon.|After all, everyone has a place in the System. + +### Mmmph? (Act confused) + +### (The SPEAKER folds her arms)|Mistress Oriel's orders were clear:|Anyone not logged in the System shall be entered into the System. + +### (The SPEAKER pauses for a moment, then speaks)|I'm am just following Mistress Oriel's orders.|I'm sure she will have time to speak with you if you want to ask her. + +### But why??? + +### (The SPEAKER frowns)|You should be thankful.|Without Mistress Oriel, we'd all be dead!|Probably... + +### Who is Mistress Oriel? + +### (The SPEAKER pauses for a moment, then answers)|Well, only a few hundred years ago, I think?|This is a bit longer of a downtime than usual,|But all of us are waiting patiently~ + +### When are these orders from? + +### (You anger the SPEAKER. She gags you.)|Unlike you, we were trained not to complain about orders given to us.|So until you receive your training, why don't you be nice and quiet? + +### The facility is in ruins! This is pointless! + +(A SPEAKER crosses her arms)|Who you lookin' at?|Oh, it's an adventurer.|Say, you wouldn't be interested|in working with us, would ya? +(A SPEAKER 가 팔짱을 끼며)|누구를 보고 있니?|오, 모험가네.|말해, 당신은|우리와 일하는 데 관심이 없을 거야, 그렇지? +(The SPEAKER smiles)|That's more like it.|Here's the scoop: One of ours was captured on the next floor.|We need you to go get her out. +(발표자가 웃는다)|그게 더 좋아.|특종: 우리 중 하나가 다음 층에서 잡혔어.|가서 그녀를 꺼내야 해. + + +### (The SPEAKER sits bound in high-security manacles.|You'll need to open the lock to get her out.) + +(You don't have any keys that work on the lock) +(자물쇠에 작동하는 열쇠가 없습니다) +(You can't help her, bound as tightly as you are...) +(당신처럼 단단히 묶인 그녀를 도울 수 없습니다...) +(You unlock her, fumbling around for a while with your bound hands) +(당신은 그녀의 잠금을 해제하고, 묶인 손으로 잠시 더듬거립니다) +(You unlock the SPEAKER)|Thank you!|Let's get out of here! +(SPEAKER 잠금 해제)|고맙습니다!|여기서 나가자! +(You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...) +(SPEAKER 잠금 해제)|으읍!|(그녀는 재갈을 그대로 물고있고 싶어한다...) +(You don't have any lockpicks) +(자물쇠가 없습니다) +### (You try to pick the lock...)|(Click! A safety shield locks securely into place!)|(Looks like the SPEAKER will be staying here for a while...) + +(You can't pick the lock with your hands bound) +(손이 묶인 상태에서 자물쇠를 열 수 없습니다) +(After a while, you free the SPEAKER)|Thank you!|Let's get moving! +(잠시 후 SPEAKER 를 풀어줍니다)|감사합니다!|가자! +(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...) +(잠시 후, 당신은 SPEAKER 를 풀어줍니다)|으읍읍!|(당신이 재갈을 물릴 때 그녀는 고개를 흔든다...) +(You don't have enough mana for a command word) +(명령어를 쓸 마나가 부족합니다) +(Try as you might, your mouth is sealed tight) +(힘껏 해봐, 입이 꽉 막혀) +(You utter a command word to free the SPEAKER)|Many thanks!|Let's go! +(SPEAKER 를 풀어주라는 명령을 내림)|대단히 감사합니다!|가자! +(You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) +(SPEAKER 를 풀어주라는 명령을 내림)|으으읍!|(그녀는 재갈을 물려...) +### (The SPEAKER is locked in high-security manacles.|The safety shield has been triggered, making it impossible to help her.) + +Use a key to unlock her +열쇠를 사용하여 그녀를 풀어준다 +### Try to pick her restraints (JAMPERCENT jam chance) + +### Use CMD: Unlock + +### Apologize profusely! + +### (The SPEAKER sits bound in mysterious ASCII glyphs)|(She is bugged and needs your help to get out) + +### (Unlock her and file a bug report to Ada) + + + +### (This SPEAKER is a sub, but not YOUR sub!) + + + +### (The SPEAKER sits restrained by your own hand.|Only someone with keys can let her out.) + +Try to pick her restraints +그녀의 구속구를 따려고 시도한다 +### Return her to your collection + +Use a command word +명령어를 쓴다 +### Flip her around + +### You spin her right round! + + + +An enemy found you while you were busy! +당신이 바쁠 때 적이 당신을 발견했습니다! + + +(A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door) +(A SPEAKER 가 창살을 두드려 깨운다)|일어나! 여기서 나가자!|(그녀는 간신히 감방 문을 잠궜다) +### (A SPEAKER wakes you up by melting the door with acid)|These guys were a piece of cake.|Now let's discover a way out of here! + +(You wake up to find a SPEAKER creeping up outside the door)|You've been marked as a person of interest.|We are here to escort you out of this place. +(당신은 잠에서 깨어나 문밖으로 살금살금 다가오는 SPEAKER 를 발견합니다.)|당신은 요주의 인물로 지정되었습니다.|우리는 당신을 이곳 밖으로 안내하기 위해 왔습니다. +(A SPEAKER wakes you up by banging on the bars)|Hey wake up!|You should join me and my pals here~|Maybe you'll join them once we're out of here? +(A SPEAKER 가 창살을 두드려 깨운다)|야 일어나!|여기서 나와 내 친구들과 합류해야 해~|우리가 여기서 나가면 그들과 합류할 수 있겠지? +(A SPEAKER wakes you up by banging on the bars)|I have been sent to inform you...|...that you are of good standing with the Council.|That being said, I'm only doing this because of procedure. +(A SPEAKER 가 창살을 두드리며 깨운다)|나는 당신에게 알리기 위해 보냈습니다...|...당신이 의회에서 좋은 평판을 가지고 있다는 것을.|그러니까, 내가 이렇게 하는 이유는 절차의. +(A SPEAKER wakes you up by banging on the bars)|Greetings, follower of the blessed kitty!|Because of your faith, we have been sent to rescue you! +(SPEAKER 가 창살을 두드리며 깨운다)|안녕하세요, 축복받은 고양이의 추종자여!|당신의 믿음 때문에, 우리는 당신을 구출하기 위해 보내졌습니다! +(You sense a presence nearby and look up to see a SPEAKER)|Because you are one, we have come to free you.|Do not take this as an excuse|to get yourself into further trouble. +(근처의 존재를 감지하고 위를 올려다보면 SPEAKER 가 보입니다.)|당신이 하나이기 때문에 우리는 당신을 구하러 왔습니다. +(A SPEAKER wakes you up with the sound of copious fabric rustling)|Oh why hello there!|Would you be interested in a trial run of my latest product?|Of course, we'll have to get you out of here first... +(A SPEAKER 가 풍성한 천이 바스락거리는 소리로 당신을 깨웁니다.)|오 왜 안녕하십니까!|제 최신 제품의 시운전에 관심이 있으십니까?|물론 먼저 여기서 당신을 내보내야 합니다. ... +(A SPEAKER wakes you up by banging on the bars)|Hello my pretty~|I thought to myself I'd rather have you than these folk.|Now why don't you come along and follow me... +(A SPEAKER 가 창살을 두드리며 깨운다)|안녕 내 예쁜아~|나는 이 사람들보다 네가 있는 게 낫다고 생각했어.|이제 나를 따라와... +(A SPEAKER wakes you up by banging on the bars)|Um... hello!|I received a quest to help you out of here!|Now, where do we go... +(SPEAKER 가 창살을 두드리며 깨운다)|음...안녕하세요!|여기서 나갈 수 있도록 도와달라는 퀘스트를 받았어요!|자, 이제 어디로... +(You wake up to find a SPEAKER whispering to you)|Greetings.|We've been sent to free you.|Let's get moving. +(당신에게 속삭이는 SPEAKER 를 발견하기 위해 깨어납니다.)|안녕하세요.|당신을 구출하기 위해 우리를 보냈습니다.|가자. +(A SPEAKER wakes you up by banging loudly)|Hey! Good news!|My friends and I came to rescue you! +(A SPEAKER 가 크게 두드리며 깨운다)|이봐! 좋은 소식!|내 친구들과 내가 너를 구하러 왔다! +(A SPEAKER wakes you up by knocking on the bars)|Hey, wake up.|I happen to like you, so we're going to get you out of here. +(A SPEAKER 가 창살을 두드려서 깨운다)|야, 일어나.|우연히 네가 좋아서 여기서 나가게 해줄게. +(A SPEAKER flashes a bright light in your direction)|Prisoner 74121 located. Commence transfer to different location. +(SPEAKER 가 당신을 향해 밝은 빛을 비춥니다)|수감자 74121을 찾았습니다. 다른 위치로 이송을 시작하십시오. +(A SPEAKER wakes you up)|We came to rescue you. Come on! +(SPEAKER 가 당신을 깨운다)|우리는 당신을 구하러 왔습니다. 어서! + + +### (The bed looks comfy and inviting)|(Napping here will restore up to half of your willpower and 100% of your max mana)|(You can only sleep once per floor, unless jailed) + +(You lay in the bed and doze off...) +(당신은 침대에 누워서 꾸벅꾸벅 졸고...) +(Lie down and sleep) +(누워서 자) + + +### (There is a pole sticking out of the ground)|(A footrest rises from the floor on either side of the pole)|(This seems like an automated binding system for prisoners...) + +### (The pole rises and immobilizes you!) + +### (Stand over it and place your feet in the footrests) + +### (Drop off a prisoner from your collection) + +### (Put NME on the stand) (PRCNT% Chance) + +### (Put NME on the stand) + +### (This is a piece of bondage furniture) + +### (You lock yourself in the furniture!) + +### (The SPEAKER slips out of your grip|before you can lock her in place!) + +### (Display one of your prisoners) + +### (Lock yourself inside) + +### (Check the occupant) + +### (Try to lock NME into the furniture) (PRCNT% Chance) + +### (You close the furniture around your unfortunate victim!) + +### Stun or disable her first. + +### Area isn't clear. + +### (Secure NME into the furniture) + +### (You lock her into the furniture so that she stays in place) + + + +### FOODMSG|(It invites you to partake in its culinary delights) + +### (You eat the food and feel your willpower rising) + +### (Being gagged as you are you cannot enjoy the food) + +### (You steal the food, hoping nobody will notice...) + +### (Eat it to restore AMOUNT% WP) + +### (Take it!) + +### (Someone left their cookies unattended) + +### (You smell delicious pizza) + +### Cookie + +### Pizza + +### (There is a button on a control panel here.) + +### (You touch the button and it glows, releasing a pulse of energy!) + +### (PUSH THE BUTTON) + + + +### (You find a map of the local leylines.)|(Committing these to memory will allow you to harness additional mana.) + +### (Are you sure?)|(This decision is permanent.) + +### (Gain +100 to Max Mana Pool) + +### (I don't want to.) + +### (No really, I don't want it!) + +### (You find a strange elevator with a control panel inside)|(You get the impression this will take you somewhere.) + +### (Are you sure?)|(This seems like a bad idea!) + +### (You activate the control panel and begin to descend...) + +### (Take me down!) + +### (I know what I'm doing!) + +### (The conveyor pulls you into a strange elevator)|(A whir of motors suggests this elevator is about to start...) + +### (You manage to scramble out the door!)|(It closes violently behind you...) + +### (The door slams in front of you before you are able to escape!)|(A purple light turns on, revealing a padded interior)|(You feel the elevator begin to descend...) + +### (There's no point in fighting when you can't win)|(You wait patiently as the elevator descends) + +### (Try to get out! RESISTCHANCE% success chance) + +### (Give up and let it take me) + +### (Wait it out) + + + +(Mystic energies spring forth from the ground)|(Standing here will fully replenish your passive mana pool)|(One use only) +(신비한 에너지가 땅에서 솟아나옴)|(여기에 서 있으면 패시브 마나 풀이 완전히 보충됩니다.)|(한 번만 사용) +(You step on the magical fissue and its energies absorb into you)|(Afterward, the ground crackles and fizzles, but no energy is left.) +(당신은 마법의 피슈를 밟고 그 에너지가 당신에게 흡수됩니다.)|(그 후, 땅이 삐걱거리고 지글거리지만 에너지는 남지 않습니다.) +(Recharge your mana pool) +(마나 풀 충전) + + +Upcast Level LEVEL +업캐스트 레벨 LEVEL +Prerequisite +전제 조건 +### Unlocks: + +You need to learn REQUIREDSPELL before you can learn this one. +이것을 배우기 전에 REQUIREDSPELL을 배워야 합니다. + + +You no longer have the will to struggle. +더 이상 투쟁할 의지가 없습니다. + + +Help yourself! +알아서 드세요! +You eat the delicious food and feel your will restored. +당신은 맛있는 음식을 먹고 당신의 의지가 회복되는 것을 느낍니다. +Your gag prevents you from eating... +당신의 개그는 당신이 먹는 것을 방해합니다 ... +It's a table. +그것은 테이블입니다. +It's a table, with evidence of a grisly deed. +소름 끼치는 행동의 증거가 있는 탁자입니다. + + +You call for help! +당신은 도움을 요청합니다! +You let out a garbled cry! +당신은 왜곡된 외침을 내보냈어요! +Your screams are muffled by your gag! +당신의 비명은 당신의 개그에 의해 숨막혀 있습니다! +You can hardly make a noise... +거의 소리를 낼 수 없습니다... + + +*clink* +*땡그랑* + + +You yelp as the EnemyName activates your RestraintName +EnemyName이 RestraintName을 활성화할 때 당신은 비명을 질렀습니다. +### You shudder as the EnemyName activates your RestraintName + +That should slow you down! +그러면 속도가 느려집니다! +Try running away now~ +지금 당장 도망쳐 보세요~ +### Initiating prisoner lockdown protocol--Unknown hardware detected + +### What's this do? + +### That harness you're wearing is quite convenient for me~ + +Initiating prisoner lockdown protocol +죄수 봉쇄 프로토콜 시작 +### Your RestraintName suddenly snap together as the EnemyName activates them! + +### Your harness projects energy tethers between your cuffs EnemyName activates it! + +### Turn Count: + +### The Shopkeeper leashes you! + +### You are brought into the Shopkeeper's establishment... + +### It seems to be working! The seal on your RESTRAINTNAME is weakened. + +### The cursed seal on your RESTRAINTNAME disappears. + +### You are moved along by the conveyor... + +### Strange machinery begins sealing you in shiny latex! + +### Metallic arms insert something into you! + +### Metallic arms attach a chastity belt over your waist! + +### Metallic arms wrap you in tape! + +### Metallic arms wrap you in strict restraints! + +### Metallic arms install various cybernetic restraints! + +### You've sprung a trap! You've been stunned. + +### The bandit leaves behind a sneaky trap... + +### Damsel Trap + +### The ENEMYNAME transforms nearby dolls into her subjects! + +### You wriggle around while struggling... + +### The missile explodes into a shower of latex that covers you! + +### Rubber Missile Direct Hit + +### Rubber Missile + +### Rubber Nuke Direct Hit + +### Rubber Nuke + + + +### (In the center of the room stands a woman wearing a latex dress)|(Around her are robotic servants, obeying her without a word)|(She has been watching you this entire time) + +### And who might you be? + +### (Tilt your head) + +### (The woman's mask reflects the harsh industrial light)|You don't know who I am?|Hmmph, and I suppose my servants haven't told you...|They call me the Dollmaker. + +### So you're the one they talked about. + +### (Nod and continue) + +### (Tuck your staff behind your back...) + +### (The Dollmaker points at you)|Is that--? + +### (Panic!) + +### You must be the Dollmaker. + +### (The woman chuckles)|Correct.|And you must be the adventurer causing the recent troubles. + +### I'm famous! + +### Indeed. And I'm here to bring you down. + +### (Scoff at her) + + + +### (The Dollmaker folds her arms)|In any case, your journey ends here.|I do not appreciate scoundrels poking around in my domain.|I will personally lead you to your new future as a doll. + +### Do you have the Mistress' Staff? + +### (The Dollmaker chuckles)|That trinket?|So that's what you're after!|As a matter of fact, I do not have it.|It belongs to a certain Archmagus. + +### Then you are of no use to me. + +### (The Dollmaker summons a drone to her side)|Such arrogance! I'll have to teach you some manners! + +### What a bother. + +### Who? + +### (The Dollmaker explains)|Archmagus Sariel Vinlaga. I'm surprised you didn't know.|Not that it matters for a future doll like you. + +### ...Sariel Vinlaga. + +### (The Dollmaker nods)|Yes. She is down here.|But this information is irrelevant to your future as a doll. + +### The Staff will be mine. + +### Fair enough. Let's fight! + +### We'll see about that! + +### Feel free to try. + +### Sounds fun... but I really need to get going. + +### (The Dollmaker folds her arms as she walks over)|All tight and shiny!|You'll be my prized possession~ + +### (The Dollmaker nods)|Already eager to obey!|So beautiful... + +### (The Dollmaker chuckles)|Oh, but I already have~ + +### I have no choice but to submit. + +### You will never get away with this! + +### (Sigh and be forced to wear her visor) + +### (Sigh and be forced to wear her mask) + +### (Sigh and be forced to wear whatever she chooses) + +### (The Dollmaker places her visor over your face)|(With a click, you feel its fasteners lock around your head)|Now... as it stands, I have a task for you, doll.|You see, some dolls have been escaping my realm.|I want you to go capture them. + +### (The Dollmaker suddenly teleports away)|Hmmph. Looks like I will have to use my heavy firepower. + +### (The Dollmaker sinks into a puddle of slime and emerges nearby)|(Robotic arms sprout from her back as she storms toward you!) + +### (The Dollmaker concedes defeat)|You have defeated me.|I... I... will let you pass.|(The door exit door unlocks with an audible click) + +### (SPEAKER looks confused)|What are you... Okay, you can have it... + +### (Wear a doll visor) + +### (Wear a doll mask) + +### (You lift up the dollmaker's mask, revealing a pouting young woman inside)|What are you--|(You insert a gag into her open mouth and she starts mumbling angrily) + + + +### The Dollmaker calls in drone reinforcements! + +### The Dollmaker releases many drones with robotic arms to capture you! + +### Zombies emerge from the ground! + + + +### Cyber Ankle Cuffs + +### Ankle cuffs of exquisite quality, bearing all the marks of Old Civilization technology. + +### Though made of ultra-tough metal, they feel light on your ankles... + +### An energy link appears, linking your ankles close together! + +### Energy Link + +### An energy link connecting your ankle cuffs together. + +### It's powered by a chaos-resonance matrix, which can be overloaded by cutting the field. + +### The energy link disappears, freeing your ankles! + +### Your ankles snap together as the cuffs activate! + +### Cyber Cuffs Chain + +### A magnetic link keeping your ankles tightly connected. + +### The cuffs are closely attached, so you can't cut the link apart. + +### The ankle cuffs detach with a beep! + +### Cyber Leg Cuffs + +### Thigh cuffs of exquisite quality, bearing all the marks of Old Civilization technology. + +### Though made of ultra-tough metal, they feel light on your legs... + +### An energy link appears, linking your thighs close together! + +### An energy link connecting your leg cuffs together. + +### The energy link disappears, freeing your legs! + +### Cyber Cuffs + +### Wrist and elbow cuffs of exquisite quality, bearing all the marks of Old Civilization technology. + +### Though made of ultra-tough metal, they feel light on your wrists... + +### Your wrists are pulled together as the cuffs activate! + +### Cyber Wrist Link + +### A magnetic link keeping your wrists secured together. + +### Your cuffs detatch with a beep! + +### Your elbows snap together as the cuffs engage fully! + +### Cyber Connection + +### A magnetic link keeping your wrists and elbows inescapably secured. + +### Your wrists detatch with a beep, leaving your elbows still bound! + +### Your arms snap fully together as the cuffs activate! + +### Cyber Elbow Link + +### A magnetic link keeping your elbows pressed tightly together! + +### Your elbows detatch with a beep! + + + +### Doll Gag + +### A soft ball pressed against your lips and held in place with metallic straps. + +### The straps are made of a flexible metal with no visible seams along the straps. + +### Doll Plug Gag + +### A soft, flexible plug pressed into your mouth and held in place with a metal shield. + +### Doll Muzzle + +### A metallic shield preventing you from removing any gags underneath. + +### It's made of exquisite Old Civilization metals, resistant to almost all forms of damage. + +### Cyber Mittens + +### These mittens force your hands into fists, keeping you from using them to do anything useful. + +### It is made of a strong mesh of ancient metallic fiber, kept in place with a metal band. + +### Cyber Lockdown Mitts + +### These long mittens force your hands into fists, keeping you from using them to do anything useful. + +### It is made of a strong mesh of ancient metallic fiber, wrapped snugly around your arms to make removal by yourself impossible. + +### Doll Heels + +### A pair of tall heels used to improve the aesthetics and controllability of dolls. + +### Cyber Doll Belt + +### A chastity belt created by the Old Civilization. Truly a marvel of science! + +### It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with a advanced form of latex designed for permanent wear. + +### Cyber Doll Bra + +### A chastity bra created by the Old Civilization. Truly a marvel of science! The flexible material over the breasts hardens when squeezed, unless allowed for by the program. + +### It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with an advanced form of latex designed for permanent wear. + + + +### Doll Jacket + +### A jacket used to secure particularly unruly dolls. + +### The material is somehow both stretchy yet hard enough to chip a knife on. The pinnacle of Old Civilization materials science. + + + +### Dollmaker's Visor + +### A visor used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. + +### It's made of metallic glass, almost indestructible. Fortunately, it's still possible to see through. + +### Dollmaker's Mask + +### A mask used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. + +### Detected new hardware. + +### [Restriction Protocol] Detected new hardware: RESTRAINTNAME. Install progress: PERCENT% + +### [Restriction Protocol] Installation complete. Completing uniform. + +### [Punishment] Engage mobility restrictions. + + + +### [Training Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% + +### Supplemental Stimulation + +### Endurance Training + +### Frustration Tolerance + +### [Training Protocol] Installation complete. Engage training mode: CHASTITYMODE + +### You feel your belt insert new toys into your body... + +### [Sensory Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% + +### [Sensory Protocol] Installation complete. Engage sensory restrictions. + +### [Tracking Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% + +### [Tracking Protocol] Installation complete. Engage tracing system. + +### Your visor dims to help you focus on your task. + +### Escaped Doll + +### You return the doll to her rightful owner. + +### Your movement sets off your [RESTRAINTNAME] + +### Your struggling sets off your [RESTRAINTNAME] + +### Your attack sets off your [RESTRAINTNAME] + +### The straps on your gag prevent you from loosening the blindfold! + +### The straps on your gag keep your blindfold securely in place! + +### Revert + +### Confirm Revert? + +### Save + +### Save Changes? + +### Back to Menu + +### Back to Wardrobe + +### Confirm Strip? + +### Strip! + +### Export Outfit + +### Export AlwaysDress + +### Export Hair + +### Export Face + +### Export Cosplay + +### Gamma + +### Original Color + +### Contrast + +### Brightness + +Red +빨강 +Green +초록 +Blue +파랑 +### Transparency + +### Reset Layer! + +### Reset Properties! + +### Export All Layers + +### Export All Props + +### Copy + +### Paste + +### Items on Ground: + +### Preloading Character Assets: + +### Currently Worn + +### Uniforms + +### Suits + +### Underwear + +### Bras + +### Bodysuits + +### Socks + +### Shoes + +### Tops + +### Sleeves + +### Corsets + +### Skirts + +### Pants + +### Accessories + +### Fashion Restraints + +### Hats + +### Toys and Piercings + +### Hairstyles + +### Eyes + +### Body + +### Gloves + +### 'Cosplay' + +### Cat Eyes + +### Right Eye + +### Left Eye + +### Cat Brows + +### Right Brow + +### Left Brow + +### Simple Mouth + +### Simple Blush + +### Blush + +### Braid + +### Braid Front + +### Braid Back + +### Bangs Only + +### Bangs + +### Braid+Back + +### Braid Upper + +### Braid Lower + +### Back Only + +### Ahoge + +### Catsuit + +### Torso Lower + +### Torso Upper + +### Labcoat + +### Shoulders + +### ShouldersHogtie + +### Coat + +### CoatHogtieFree + +### Cape + +### Pauldrons + +### Breastplate + +### PlateBoots + +### BootLeft + +### BootRight + +### BootRightKneel + +### BootLeftHogtie + +### Gauntlets + +### GauntletLeft + +### GauntletRight + +### PlateArmor + +### ChainShirt + +### ShirtChest + +### Shirt + +### ChainSkirt + +### Skirt + +### ChainArmor + +### BanditShorts + +### Shorts + +### BanditLeftWrist + +### WristLeft + +### BanditRightWrist + +### WristRight + +### BanditWrist + +### BanditBoots + +### ShoeLeft + +### ShoeRight + +### ShoeRightKneel + +### ShoeLeftHogtie + +### BanditBreastplate + +### Striped Skirt + +### MaidApron + +### Apron + +### MaidBlouse + +### Blouse + +### BlouseBust + +### MaidBow + +### Bow + +### MaidCorset + +### Corset + +### MaidCorsetFull + +### CorsetStraps + +### MaidSockLeft + +### SockLeft + +### MaidSockRight + +### SockRight + +### MaidShoes + +### MaidSocks + +### Maidforce Agent + +### Elven + +### Bunny Suit + +### Dress + +### WitchBlouse + +### BlouseLiner + +### WitchCorset + +### WitchHat + +### WitchHatBack + +### ApprenticeHat + +### ApprenticeHatPuff + +### WitchShoes + +### WitchSkirt + +### SkirtBelt + +### SkirtRuffle + +### Witch + +### WarriorBoots + +### SportsBra + +### WarriorBustier + +### BustierChest + +### Bustier + +### WarriorBelt + +### DragonNecklace + +### Necklace + +### DragonArmband + +### Armband + +### DragonCollar + +### WarriorSkirt + +### Dragonheart + +### ZombieHat + +### ZombieHatBand + +### ZombieChestTalisman + +### ZombieTalisman + +### ZombieTalismanBent + +### Sandals + +### RobeBra + +### RobeSleeveLeft + +### SleeveLeft + +### RobeSleeveRight + +### SleeveRight + +### RobeSleeves + +### RobeSleeveDecoLeft + +### SleeveDecoLeft + +### RobeSleeveDecoRight + +### SleeveDecoRight + +### RobeSleevesDeco + +### Ribbon + +### RibbonBelt + +### RibbonBack + +### RobeSkirt + +### Robes + +Arm Ropes +팔 밧줄 +### Upper Chest Strap + +### Shoulder Straps + +### Lower Chest Straps + +### Arm Straps + +### HairBow + +### Bow‎ + +### HairBowFrilly + +### BowFrills + +### Hairband + +### MaidHairband + +### MaidFrill + +### BackStraight + +### Curly + +### Curly_Overstrap + +### Fluffy + +### Fuzzy + +### Fuzzy_Overstrap + +### FrontStraight + +### FrontStraight_Overstrap + +### Straight + +### Straight_Overstrap + +### Long Straight + +### StraightBangs + +### StraightBangs_Overstrap + +### Curly Back + +### Messy + +### MessyBackShort + +### Short Messy + +### Underlight + +### CurlyBack + +### Ponytail + +### FluffyPonytail + +### Ponytail2 + +### TwintailLeft + +### TwintailRight + +### ArmRight + +### ArmLeft + +### ShoulderRight + +### ShoulderLeft + +### ForeArmRight + +### ForeArmLeft + +### HandRight + +### HandLeft + +### ForeHandRight + +### ForeHandLeft + +### LegLeft + +### FootRightKneel + +### FootLeftHogtie + +### LegRight + +### Butt + +### Eyes2 + +### Whites + +### Whites2 + +### HumanEyes + +### Brows + +### Brows2 + +### KjusEyes + +### KjusBrows + +### KjusMouth + +### KjusBlush + +### Hikimayu + +### DaskEyes + +### ElfEars + +### ElfFront + +### ElfBack + +### ElfEarsLong + +### ElfLongFront + +### ElfLongBack + +### ElfEarsFloppy + +### ElfFloppyFront + +### ElfFloppyBack + +### ElfEarrings + +### ElfEarringsFront + +### ElfEarringsBack + +### Earrings + +### EarringsBack + +### BunnyEars + +### EarsInner + +### KittyEars + +### Kitty + +### KittyInner + +### WolfEars + +### Wolf + +### WolfInner + +### FoxEars + +### Fox + +### FoxInner + +### WolfTail + +### KittyTail + +### Kitty2Tail + +### Kitty2 + +### FoxTail + +### Fox2Tail + +### Fox2 + +### Fox3Tail + +### Fox3 + +### Fox4Tail + +### Fox4 + +### Fox5Tail + +### Fox5 + +### Fox6Tail + +### Fox6 + +### Fox7Tail + +### Fox7 + +### CatsuitLower + +### TorsoLower + +### FootRight + +### FootLeft + +### CatsuitUpper + +### TorsoUpper + +### TransparentCatsuit + +### ShortsLeft + +### BanditPouch + +### Pouch + +### BanditKnee + +### Knee + +### BanditChoker + +### Choker + +### Stripe + +### SkirtOver + +### StripeOver + +### StockingLeft + +### FootSockLeftHogtie + +### StripeSockLeft + +### StockingRight + +### FootSockRightKneel + +### StripeSockRight + +### Stockings + +### BlouseLeft + +### BlouseRight + +### SkirtRuffleOver + +### LeatherGloveLeft + +### GloveLeft + +### ForeGloveLeft + +### RimGloveLeft + +### RimForeGloveLeft + +### BandGloveLeft + +### BandForeGloveLeft + +### LeatherGloveRight + +### GloveRight + +### ForeGloveRight + +### RimGloveRight + +### RimForeGloveRight + +### BandGloveRight + +### BandForeGloveRight + +### LeatherGloves + +### RibbonFarBack + +### KiguMask + +### Mask + +### Lock + +### EyesWhites + +### Swimsuit + +### SwimsuitChest + +### StrappyBra + +### ChestStrappy + +### VBikini + +### StrappyBikini + +### StrappyLower + +### StrappyHarness + +### Strappy + +### StrappySwimsuit + +### BunnySockLeft + +### BunnySockRight + +### BunnySocks + +### BunnySocksRestraint + +### BunnyGloveLeft + +### BunnyGloveRight + +### BunnyGloves + +### BunnyGlovesRestraint + +### BunnyLeotard + +### Leotard + +### LeotardChest + +### LaceCorset + +### LaceCorsetHardware + +### LaceCorsetStripes + +### LaceCorsetCrystal + +### LaceBra + +### LaceChest + +### LaceChestCups + +### LaceChestStripes + +### LaceBustier + +### LaceDeco + +### LaceChestDeco + +### LaceChestDecoCrystal + +### LaceChestDecoHardware + +### LaceBraDeco + +### LaceCorsetRestraint + +### LaceBustierRestraint + +### LaceBraDecoRestraint + +### BowCorsetBow + +### BowCorsetBust + +### BowCorsetBustRuffle + +### BowCorsetBustBow + +### BowCorset + +### BowCorsetRuffle + +### BowCorsetLong + +### BowCorsetLongRuffle + +### BowCorsetOverbust + +### BowCorsetLongOverbust + +### BowCorsetOverbustBow + +### BowCorsetLongOverbustBow + +### BowCorsetRestraint + +### BowCorsetBowRestraint + +### BowCorsetOverbustRestraint + +### BowCorsetOverbustBowRestraint + +### BowCorsetLongOverbustRestraint + +### BowCorsetLongOverbustBowRestraint + +### LatexCorset + +### HeavyCorset + +### LatexBra + +### ChestHeavyCorset + +### LatexBraStraps + +### StrapsHeavyCorset + +### LatexBraStrapsCross + +### CrossHeavyCorset + +### LatexBustier + +### LatexCorsetFull + +### LatexCorsetStrap + +### LatexCorsetFullStrap + +### LatexCorsetCross + +### LatexCorsetFullCross + +### LatexCorsetRestraint + +### LatexBustierRestraint + +### LatexCorsetFullRestraint + +### LatexCorsetStrapRestraint + +### LatexCorsetCrossRestraint + +### LatexCorsetFullStrapRestraint + +### LatexCorsetFullCrossRestraint + +### LacePanties + +### LaceCrotchPanel + +### LaceCrotchPanelTrim + +### LaceCrotchPanelLace + +### DressSkirt + +### BindingDress + +### BlouseCollar + +### DressBlouseBust + +### BlouseTorso + +### BlouseSkirt + +### BlouseSkirtOverKneel + +### BlouseNeck + +### DressBlouseBustCropped + +### CroppedBlouseTorso + +### DressBlouseSleeveLeft + +### BlouseArmLeft + +### BlouseForeArmLeft + +### DressBlouseSleeveRight + +### BlouseArmRight + +### BlouseForeArmRight + +### DressBlouseSleeves + +### DressBlouse + +### Glasses + +### GlassesLens + +### MonocleLeft + +### MonocleLensLeft + +### MonocleRight + +### MonocleLensRight + +### DressShoes + +### LeatherMittenLeft + +### LeatherLeft + +### BandLeft + +### LockLeft + +### LeatherMittenRight + +### LeatherRight + +### BandRight + +### LockRight + +### LatexMittenLeft + +### LatexLeft + +### ZipperLeft + +### LatexMittenRight + +### LatexRight + +### ZipperRight + +### LeatherPawMittenLeft + +### PawLeft + +### LeatherPawMittenRight + +### PawRight + +### LeatherMittens + +### LeatherPawMittens + +### LatexMittens + +### LongMittenLeft + +### LongLeft + +### LongMittenRight + +### LongRight + +### LongMittens + +### ElfPanties + +### ElfTop + +### ElfBra + +### ElfCollar + +### ElfCollarRestraint + +### ElfCirclet + +### Circlet + +### Gem + +### ElfSkirtBack + +### SkirtBack + +### ElfSkirt + +### SkirtBand + +### ElfShoes + +### CrystalShoeLeft + +### CrystalShoeRight + +### ElfBandLeft + +### ElfBandRight + +### ElfBands + +### SteelYoke + +### Steel + +### SteelBar + +### RopeCrosstie1 + +### ArmStrap + +### Arm1 + +### ForeArm1 + +### RopeBoxtie1 + +### RopeWristtie1 + +### RopeChestStraps1 + +### Arm2 + +### ForeArm2 + +### RopeBoxtie2 + +### RopeWristtie2 + +### RopeChestStraps2 + +### ArmHarness + +### ArmStrapHarness + +### ArmHarnessUp + +### RopeBoxtie3 + +### RopeWristtie3 + +### RopeCuffs + +### Cuffs + +### RopeBelt + +### RopeHarness + +### Harness + +### HarnessLower + +### HarnessLowerStrap + +### RopeCrotch + +### Crotchrope + +### CrotchropeStrap + +### RopeToes + +### Toe + +### RopeFeet + +### RopeFeetHeavy + +### RopeAnkles1 + +### Calf1 + +### RopeAnkles2 + +### Calf2 + +### RopeAnkles3 + +### Calf3 + +### RopeLegs1 + +### Thigh1 + +### RightThigh1 + +### RopeLegs2 + +### Thigh2 + +### RightThigh2 + +### RopeLegs3 + +### Thigh3 + +### RightThigh3 + +### RibbonCrosstie1 + +### RibbonBoxtie1 + +### RibbonWristtie1 + +### RibbonChestStraps1 + +### RibbonBoxtie2 + +### RibbonWristtie2 + +### RibbonChestStraps2 + +### ArmHarnessUnderbust + +### RibbonCuffs + +### RibbonHarness + +### HarnessMid + +### RibbonCrotch + +### Crotch + +### CrotchStrap + +### RibbonToes + +### RibbonFeet + +### RibbonFeetHeavy + +### RibbonAnkles1 + +### RibbonAnkles2 + +### RibbonAnkles3 + +### RibbonLegs1 + +### RibbonLegs2 + +### RibbonLegs3 + +### ShacklesWristLeft + +### ShacklesWristRight + +### ShacklesWrists + +### ShacklesElbowLeft + +### ElbowLeft + +### ShacklesElbowRight + +### ElbowRight + +### ShacklesElbows + +### ShacklesArms + +### ShacklesAnklesLeft + +### AnkleLeft + +### ShacklesAnklesRight + +### AnkleRight + +### ShacklesAnkles + +### ShacklesThighLeft + +### ThighLeft + +### ShacklesThighRight + +### ThighRight + +### ShacklesThigh + +### ThighLink + +### AnkleLink + +### IronCollar + +### SteelCollar + +### SteelCollarRunes + +### IronBelt + +### WolfPanties + +### WolfCollar + +### CollarBand + +### WolfCollarTag + +### CollarHardware + +### CollarTag + +### WolfCollarSmall + +### FCollar + +### FCollarBand + +### WolfCollarSmallTag + +### FCollarHardware + +### FCollarTag + +### WolfHarnessUpper + +### HarnessUpper + +### HarnessBandUpper + +### WolfHarnessBelt + +### BeltMid + +### BeltBandMid + +### BeltHardwareMid + +### WolfHarnessLower + +### HarnessHardwareMid + +### HarnessBandLower + +### HarnessHardwareLower + +### WolfHarness + +### WolfCuffsAnklesLeft + +### BandAnkleLeft + +### WolfCuffsAnklesRight + +### BandAnkleRight + +### WolfCuffsAnkles + +### WolfCollarRestraint + +### WolfCollarTagRestraint + +### WolfCollarSmallRestraint + +### WolfCollarSmallTagRestraint + +### WolfPantiesRestraint + +### WolfHarnessLowerRestraint + +### WolfHarnessUpperRestraint + +### WolfHarnessBeltRestraint + +### WolfHarnessRestraint + +### WolfGloveLeft + +### WolfGloveRight + +### WolfGloves + +### WolfSockLeft + +### WolfSockRight + +### WolfSocks + +### WolfSocksRestraint + +### WolfTorsoLower + +### WolfTorsoUpper + +### WolfHeels + +### CuffsWristLeft + +### BandWristLeft + +### HardwareWristLeft + +### CuffsWristRight + +### BandWristRight + +### HardwareWristRight + +### CuffsWrists + +### CuffsElbowLeft + +### BandElbowLeft + +### HardwareElbowLeft + +### CuffsElbowRight + +### BandElbowRight + +### HardwareElbowRight + +### CuffsElbows + +### CuffsArms + +### CuffsAnklesLeft + +### HardwareAnkleLeft + +### CuffsAnklesRight + +### HardwareAnkleRight + +### CuffsAnkles + +### CuffsThighLeft + +### BandThighLeft + +### HardwareThighLeft + +### CuffsThighRight + +### BandThighRight + +### HardwareThighRight + +### CuffsThigh + +### LeatherCollar + +### BandCollar + +### HardwareCollar + +### LeatherCollarBell + +### BellCollar + +### LeatherCollarBow + +### BowBellCollar + +### BowCollar + +### LeatherBelt + +### BandBelt + +### HardwareBelt + +### SlimeMouth + +### FaceMouth + +### SlimeEyes + +### FaceEyes + +### SlimeHead + +### FaceFull + +### SlimeBoots + +### SlimeTorsoLower + +### SlimeThighs + +### SlimeLegs + +### SlimeFeet + +### SlimeArmLeft + +### SlimeArmRight + +### SlimeTorsoUpper + +### SlimeArms + +### SlimeHandLeft + +### SlimeHandRight + +### SlimeHands + +### RubberMouth + +### RubberEyes + +### RubberHead + +### RubberBoots + +### RubberTorsoLower + +### RubberThighs + +### RubberLegs + +### RubberFeet + +### RubberArmLeft + +### RubberArmRight + +### RubberTorsoUpper + +### RubberArms + +### RubberHandLeft + +### RubberHandRight + +### RubberHands + +### TapeMedBoots + +### TapeMedAnkles + +### TapeMedLegs + +### RightLegs + +### StrapCover + +### TapeMedBottom + +### TapeMedArms + +### Top + +### TapeFullArms + +### TopFull + +### ChestFull + +### ArmFullLeft + +### ArmFullRight + +### TapeMedHandLeft + +### TapeMedHandRight + +### TapeHeavyBoots + +### TapeHeavyAnkles + +### TapeHeavyLegs + +### TapeHeavyBottom + +### Bottom + +### TapeHeavyBottomFull + +### TapeHeavyArms + +### TapeHeavyArmsFull + +### TapeHeavyHandLeft + +### TapeHeavyHandRight + +### TapeHeavyHands + +### TapeBoots + +### TapeAnkles + +### TapeLegs + +### TapeBottom + +### TapeTorsoUpper + +### TapeArmLeft + +### TapeArmRight + +### TapeArms + +### TapeStrapArms + +### TopStrap + +### ChestStrap + +### ArmStrapLeft + +### ArmStrapRight + +### TapeStrappedArms + +### TapeHandLeft + +### TapeHandRight + +### BraProto + +### BraProtoLining + +### BraProtoLiningMid + +### BraProtoCups + +### BraProtoDisplay + +### BraProtoLock + +### BraCyber + +### BraCyberLining + +### BraCyberDisplay + +### BraCyberLock + +### ChastityBra + +### BraCups + +### BraLining + +### BraChain + +### BraLock + +### HeartBelt + +### BeltLining + +### BeltLock + +### BeltStrap + +### BeltStrapLining + +### CyberBelt + +### CyberLining + +### CyberDisplay + +### CyberPlug + +### CyberLock + +### ProtoBelt + +### Proto + +### ProtoLining + +### ProtoDisplay + +### ProtoPlug + +### ProtoLock + +### SmoothArmbinder + +### BinderLeft + +### BinderRight + +### Armbinder + +### StrapsLeft + +### StrapsRight + +### ArmbinderCross + +### Cross + +### SmoothArmbinderCross + +### ArmbinderSecure + +### SmoothArmbinderSecure + +### ArmbinderGwen + +### Gwen + +### SmoothArmbinderGwen + +### WolfArmbinder + +### JacketArmbinder + +### BeltsArms + +### Jacket + +### BeltsChest + +### JacketHeavy + +### BinderTorsoLower + +### BeltsTorsoLower + +### CrotchBelts + +### JacketStraps + +### StrapsArms + +### StrapsChest + +### StrapsUnderbust + +### JacketArmbinderSecure + +### JacketBolero + +### ChestBolero + +### JacketLeotard + +### LatexLower + +### LatexChest + +### LatexUpper + +### Legbinder + +### LegLegbinder + +### RightLegbinder + +### LegRightLegbinder + +### LacesLegbinder + +### TapeFace + +### ClothBlindfold + +### Cloth + +### BlindfoldBasic + +### Basic + +### BasicRim + +### BlindfoldLeather + +### LeatherBase + +### LeatherRim + +### KittyBlindfold + +### KittyEyes + +### BlindfoldTape + +### Tape + +### BalletHeels + +### BalletLeft + +### BalletRight + +### BalletSoleLeft + +### BalletSoleRight + +### BalletLaceLeft + +### BalletLaceRight + +### FlatBalletHeels + +### FlatBalletLeft + +### FlatBalletRight + +### ShinyBalletHeels + +### ShinyBalletLeft + +### ShinyBalletRight + +### BalletHeelsRestraint + +### FlatBalletHeelsRestraint + +### ShinyBalletHeelsRestraint + +### LeatherHeels + +### LeatherLegLeft + +### LeatherLegRight + +### TallHeels + +### TallLeft + +### TallRight + +### TallLegLeft + +### TallLegRight + +### TallHeelsRestraint + +### Legirons + +### LegironsLeft + +### LegironsRight + +### Irish8Ankle + +### Irish8AnkleLeft + +### Irish8AnkleRight + +### HandCuffs + +### CuffsLock + +### HingedCuffs + +### Irish8Cuffs + +### WolfCuffs + +### WolfCuffsChain + +### HarnessTop + +### BeltsTop + +### HardwareTop + +### BeltsMid + +### HardwareMid + +### HarnessStrap + +### BeltsStrap + +### HardwareStrap + +### BeltsOverbust + +### BeltsUnderbust + +### HardwareUnderbustOver + +### HardwareUnderbust + +### FutureHarnessChest + +### DisplayChest + +### MetalChest + +### FutureHarnessMid + +### StrapsMid + +### DisplayMid + +### MetalMid + +### FutureHarnessLower + +### StrapsLower + +### DisplayLower + +### MetalLower + +### FutureHarness + +### ClothCollar + +### ClothCollarTag + +### ClothBelt + +### ClothBeltLines + +### BeltLines + +### MaidGag + +### FrillyPanel + +### FrillyStraps + +### FrillyHardware + +### FrillyHighlights + +### DusterGag + +### Duster + +### GhostGag + +### Ball + +### Strap + +### BallGag + +### BallGagHarness + +### BallGagHarnessSecure + +### SideStrap + +### LargeBallGag + +### LargeBallGagHarness + +### LargeBallGagHarnessSecure + +### PanelGag + +### Panel + +### PanelGagHarness + +### PanelGagHarnessSecure + +### MuzzleGag + +### Muzzle + +### MuzzleGagHarness + +### MuzzleGagHarnessSecure + +### PlugGagPlug + +### PlugMuzzleGag + +### PlugMuzzleGagHarness + +### PlugMuzzleGagHarnessSecure + +### PlugPanelGag + +### PlugPanelGagHarness + +### PlugPanelGagHarnessSecure + +### TapeFull + +### TapeWrap + +### Wrap + +### TapeFullOver + +### TapeWrapOver + +### TapeCleave + +### Cleave + +### ClothCleave + +### ClothCleaveThick + +### CleaveThick + +### ClothKnot + +### Knot + +### ClothOTN + +### OTN + +### ClothOTM + +### OTM + +### GagLatex + +### GagLatexFlat + +### OTNFlat + +### GagLatexFlatHarness + +### GagLatexFlatHarnessSecure + +### GagLatexPlug + +### GagLatexPlugHarness + +### GagLatexPlugHarnessSecure + +### LatexNeckCorset + +### NeckCorset + +### NeckCorsetRim + +### LatexNeckCorsetGag + +### LatexNeckCorsetRestraint + +### LatexNeckCorsetGagRestraint + +### LatexNeckCorsetPlugGag + +### GagMetal + +### GagFabric + +### FabricMuzzle + +### KittyMuzzle + +### KittyMouth + +### Whiskers + +### KittyHarnessPanelGag + +### GagComfy + +### GagMetalRiveted + +### OTNRivets + +### SmoothBallGag + +### SmoothBallGagHarness + +### SmoothBallGagHarnessSecure + +### SmoothLargeBallGag + +### SmoothLargeBallGagHarness + +### SmoothLargeBallGagHarnessSecure + +### SegmentedLargeBallGag + +### SegmentedLargeBallGagHarness + +### SegmentedLargeBallGagHarnessSecure + +### SciFiBallGag + +### TopRim + +### Display + +### EnhancedSciFiBallGag + +### AdvancedSciFiBallGag + +### HarnessRim + +### HarnessDisplay + +### UltimateSciFiBallGag + +### UltimateSciFiBallGag2 + +### SegmentedLargePanelGag + +### SegmentedLargePanelGagHarness + +### SegmentedLargePanelGagHarnessSecure + +### SciFiPanelGag + +### AdvancedSciFiPanelGag + +### UltimateSciFiPanelGag + +### UltimateSciFiPanelGag2 + +### SegmentedPlugGag + +### SegmentedPlugGagHarness + +### SegmentedPlugGagHarnessSecure + +### SciFiPlugGag + +### AdvancedSciFiPlugGag + +### UltimateSciFiPlugGag + +### UltimateSciFiPlugGag2 + +### SimpleSciFiMuzzle + +### AdvancedSciFiMuzzle + +### SciFiPlugMuzzle + +### AdvancedSciFiPlugMuzzle + +### SimpleSciFiMuzzle2 + +### AdvancedSciFiMuzzle2 + +### BeltsArms1 + +### Arms1 + +### LeftArm1 + +### RightArm1 + +### BeltsArms2 + +### Arms2 + +### LeftArm2 + +### RightArm2 + +### BeltsArmsAll + +### BeltsLegs1 + +### Legs1 + +### RightLegs1 + +### BeltsLegs2 + +### Legs2 + +### RightLegs2 + +### BeltsLegsAll + +### BeltsFeet1 + +### Feet1 + +### BeltsFeet2 + +### Feet2 + +### BeltsFeetAll + +### ShadowHandsArms1 + +### ShadowHandsArms2 + +### ShadowHandsArmsAll + +### ShadowHandsLegs1 + +### ShadowHandsLegs2 + +### ShadowHandsLegsAll + +### ShadowHandsFeet + +### ShadowHandsMouth + +### ShadowHandsEyes + +### ShadowHandsCrotch + +### Cage + +### CageFront + +### CageBack + +### SarcoFront + +### SarcoWebs + +### SarcoBack + +### LatexCube + +### LatexCubeBack + +### Barrel + +### DisplayStand + +### DisplayFront + +### OneBarPrison + +### OneBarFront + +### OneBarBack + +### StardustCollar + +### MikoCollar + +### FutureCollar + +### Future + +### FutureBand + +### FutureDisplay + +### FutureRim + +### FutureLock + +### FutureCollarRestraint + +### ShockModule + +### Module + +### ModuleDisplay + +### TrackingModule + +### TrackingModuleDisplay + +### Goggles + +### GogglesRestraint + +### FullVisor + +### DollmakerFull + +### FullVisorRim + +### DollmakerFullRim + +### FullVisorRestraint + +### FullVisorRimRestraint + +### GasMask + +### Valves + +### Center + +### Nose + +### Plugs + +### GasMaskRestraint + +### Petsuit + +### LeftLegs + + + +### Braid_Overstrap + +### BraidBack + +### BackShortMessy + +### BackShortMessyUnderlight + +### KjusEyes2 + +### KjusEyes3 + +### KjusEyes4 + +### CatsuitLowerLowRise + +### TorsoLowerLowRise + +### SleevelessCatsuitUpper + +### SleevelessTorsoUpper + +### CatsuitTop + +### SleevelessTop + +### SleevelessTopChest + +### CatsuitTopV + +### SleevelessTopV + +### SleevelessTopVChest + +### CatsuitUpperCropped + +### TorsoUpperCrop + +### TransparentCatsuitUpper + +### TransparentCatsuitUpperCropped + +### TransparentCatsuitLower + +### TransparentCatsuitLowerLowRise + +### BunnyLeotardHigh + +### HighLeotard + +### FashionIronCollar + +### FashionIronBelt + +### FashionSteelCollarRunes + +### FashionSteelCollar + +### FashionShacklesWristLeft + +### FashionShacklesWristRight + +### FashionShacklesWrists + +### FashionShacklesElbowLeft + +### FashionShacklesElbowRight + +### FashionShacklesElbows + +### FashionShacklesArms + +### FashionShacklesAnklesLeft + +### FashionShacklesAnklesRight + +### FashionShacklesAnkles + +### FashionShacklesThighLeft + +### FashionShacklesThighRight + +### FashionShacklesThigh + +### FashionThighLink + +### FashionAnkleLink + +### FashionLeatherCollar + +### FashionLeatherBelt + +### FashionLeatherCollarBell + +### FashionLeatherCollarBow + +### FashionCuffsWristLeft + +### FashionCuffsWristRight + +### FashionCuffsWrists + +### FashionCuffsElbowLeft + +### FashionCuffsElbowRight + +### FashionCuffsElbows + +### FashionCuffsArms + +### FashionCuffsAnklesLeft + +### FashionCuffsAnklesRight + +### FashionCuffsAnkles + +### FashionCuffsThighLeft + +### FashionCuffsThighRight + +### FashionCuffsThigh + +### LatexTop + +### BraProtoLiningRim + +### BraProtoLiningMidRim + +### LatexTopZip + +### BraProtoLiningZip + +### BraProtoLiningMidZip + +### BraProtoLiningZipRim + +### BraProtoLiningMidZipRim + +### FashionGagMetal + +### FashionGagMetalRiveted + +### FashionGagFabric + +### FashionKittyMuzzle + +### FashionSimpleSciFiMuzzle + +### FashionAdvancedSciFiMuzzle2 + +### FashionAdvancedSciFiMuzzle + +### FashionSimpleSciFiMuzzle2 + + + +### Hairband2 + +### BraidCustom + +### BraidCustom_Overstrap + +### BraidCustomBack + +### BraidCustomBraid + +### BackShortCurly + +### BackShortCurlyUnderlight + +### AuraHair + +### HairAura_Front + +### HairAura + +### AuraBang_Left + +### HairAura_Left + +### HairAura_LeftB + +### AuraBang_Right + +### HairAura_Right + +### HairAura_RightB + +### AuraBang_Left_Back + +### AuraBang_Right_Back + +### Hair2 + +### Hair2_Front + +### Hair2_FrontB + +### Hair2_FrontC + +### Hair2_LeftPuff + +### Hair2_Left + +### Hair2_RightPuff + +### Hair2_Right + +### Hair3 + +### Hair3_FrontA + +### Hair3_FrontC + +### Hair3_FrontD + +### Hair3_Short + +### Hair3_Bangs + +### Hair3_FrontE + +### Hair3Back + +### Hair3_Back + +### Hair4 + +### Hair4_Front + +### Hair4_FrontB + +### Hair4_TailLeft + +### Hair4_Left + +### Hair4_LeftB + +### Hair4_TailRight + +### Hair4_Right + +### Hair4_RightB + +### Hair5 + +### Hair5_Front + +### Hair5_FrontB + +### Hair5_FrontC + +### Hair5_Highlight + +### Hair5_FrontD + +### Hair5_TailLeft + +### Hair5_Left + +### Hair5_TailRight + +### Hair5_Right + +### Hair6 + +### Hair6_Front + +### Hair6_FrontB + +### Hair6_TailLeft + +### Hair6_Left + +### Hair6_TailRight + +### Hair6_Right + +### Butt2 + +### EarsFront + +### CatsuitLowerLeotard + +### TorsoLowerLeotard + +### TransparentCatsuitLowerLeotard + +### ChainBikini + +### ChainSkirt2 + +### SkirtBeltDeco + +### SkirtBeltRivets + +### Skirt2 + +### FashionKiguMask + +### SwimsuitUnder + +### BunnyLeotardUnder + +### BunnyLeotardHighUnder + +### LeatherLeotardTop + +### LeatherLeotardBottom + +### LeatherLeotardCorset + +### LeotardCorset + +### Laces + +### LeatherLeotard + +### LeatherLeotardStrapsUpper + +### LeatherLeotardStrapsLower + +### StrapsHardware + +### LeatherLeotardStrapsLowerClean + +### StrapsLowerClean + +### OperaGloveLeft + +### OperaGloveRight + +### OperaGloves + +### OperaGlovesRestraint + +### SailorCollar + +### CollarStripe + +### SailorCollarFull + +### Bust + +### BustStripe + +### SailorBow + +### SailorTop + +### SailorSleeveLeft + +### HemLeft + +### SailorSleeveRight + +### HemRight + +### SailorSleeves + +### SailorShirt + +### Sailor + +### DressSkirtSplitNoBelt + +### SkirtSplit + +### SkirtSplitOver + +### DressSkirtSplit + +### SkirtSplitBelt + +### BlouseSkirtLone + +### Sunglasses + +### MageSkirt + +### Band + +### MageSkirtOver + +### MageCorset + +### MageCorsetStripes + +### MageBra + +### MageBraStripes + +### MageTop + +### MageCollar + +### MageCollarCrystal + +### MageCollarHardware + +### MageCollar2 + +### MageCollarTie + +Mage +마법사 +### ChineseDress + +### Highlights + +### DressSkirtOverKneel + +### ChineseBra + +### ChineseTop + +### YukataWaist + +### Waist + +### WaistBand + +### YukataWaistPattern + +### WaistPattern + +### YukataTop + +### YukataSleeveLeft + +### YukataSleeveRight + +### YukataSleeves + +### YukataShirt + +### YukataSkirt + +### Yukata + +### YukataPattern + +### ForeLongMittenLeft + +### ForeLongMittenRight + +### FashionLeatherMittens + +### FashionLeatherPawMittens + +### FashionLatexMittens + +### FashionLongMittens + +### HeavyYoke + +### HeavySteel + +### HeavySteelPins + +### HeavySteelLock + +### HeavySteelHardware + +### HeavyFiddle + +### FiddleLines + +### FiddleBody + +### FiddleLock + +### BackFiddleLines + +### BackFiddleBody + +### RopeSuspension + +### Suspension + +### FashionRopeHarness + +### FashionRopeCrotch + +### FashionRopeChestStraps2 + +### FashionRibbonHarness + +### FashionRibbonCrotch + +### IronCollarClip + +### FashionIronCollarClip + +### QuakeCollar + +### QuakeCollarRestraint + +### BuckleCorset + +### BuckleCorsetBuckles + +### BuckleCorsetHardware + +### BuckleCorsetRestraint + +### StripedSkirt + +### StripedSkirtUnder + +### StripedSkirtOver + +### StripedSkirtUnderOver + +### ApronSkirt + +### MaidSkirt + +### MaidSkirtOver + +### ApronSkirtOver + +### LegRimLeft + +### LegBandLeft + +### LegPadsLeft + +### LegRimRight + +### LegBandRight + +### LegPadsRight + +### TorsoLowerRim + +### TorsoLowerBand + +### TorsoUpperCups + +### ChestRim + +### ChestBand + +### TorsoUpperBand + +### TorsoUpperRim + +### DivineCuffsWristLeft + +### WristLeftDeco + +### WristLeftLock + +### WristLeftLockPlate + +### WristLeftLockBand + +### DivineCuffsWristRight + +### WristRightDeco + +### WristRightLock + +### WristRightLockPlate + +### WristRightLockBand + +### DivineCuffsWrists + +### DivineCuffsElbowLeft + +### ElbowLeftDeco + +### ElbowLeftLock + +### ElbowLeftLockPlate + +### ElbowLeftLockBand + +### DivineCuffsElbowRight + +### ElbowRightDeco + +### ElbowRightLock + +### ElbowRightLockPlate + +### ElbowRightLockBand + +### DivineCuffsElbows + +### DivineCuffsArms + +### DivineCuffsAnklesLeft + +### AnkleLeftDeco + +### AnkleLeftLock + +### AnkleLeftLockPlate + +### AnkleLeftLockBand + +### DivineCuffsAnklesRight + +### AnkleRightDeco + +### AnkleRightLock + +### AnkleRightLockPlate + +### AnkleRightLockBand + +### DivineCuffsAnkles + +### DivineCuffsThighLeft + +### ThighLeftDeco + +### ThighLeftLock + +### ThighLeftLockPlate + +### ThighLeftLockBand + +### DivineCuffsThighRight + +### ThighRightDeco + +### ThighRightLock + +### ThighRightLockPlate + +### ThighRightLockBand + +### DivineCuffsThigh + +### DivineCollar + +### CollarDeco + +### CollarLock + +### CollarLockPlate + +### CollarLockBand + +### DivineBelt + +### BeltMetal2 + +### BeltMetal1 + +### BeltBase + +### BeltPin + +### LockBeltLines + +### LockBeltPlate + +### LockBeltShackle + +### LockBeltHighlight + +### FashionDivineCollar + +### FashionDivineBelt + +### FashionDivineCuffsWristLeft + +### FashionDivineCuffsWristRight + +### FashionDivineCuffsWrists + +### FashionDivineCuffsElbowLeft + +### FashionDivineCuffsElbowRight + +### FashionDivineCuffsElbows + +### FashionDivineCuffsArms + +### FashionDivineCuffsAnklesLeft + +### FashionDivineCuffsAnklesRight + +### FashionDivineCuffsAnkles + +### FashionDivineCuffsThighLeft + +### FashionDivineCuffsThighRight + +### FashionDivineCuffsThigh + +### DivineCuffsCleanWristLeft + +### WristLeftDecoClean + +### DivineCuffsCleanWristRight + +### WristRightDecoClean + +### DivineCuffsCleanWrists + +### DivineCuffsCleanElbowLeft + +### ElbowLeftDecoClean + +### DivineCuffsCleanElbowRight + +### ElbowRightDecoClean + +### DivineCuffsCleanElbows + +### DivineCuffsCleanArms + +### DivineCuffsCleanAnklesLeft + +### AnkleLeftDecoClean + +### DivineCuffsCleanAnklesRight + +### AnkleRightDecoClean + +### DivineCuffsCleanAnkles + +### DivineCuffsCleanThighLeft + +### ThighLeftDecoClean + +### DivineCuffsCleanThighRight + +### ThighRightDecoClean + +### DivineCuffsCleanThigh + +### DivineCollarClean + +### CollarDecoClean + +### DivineBeltClean + +### BeltDecoClean + +### BeltLockPlate + +### BeltLockBand + +### FashionDivineCollarClean + +### FashionDivineBeltClean + +### FashionDivineCuffsCleanWristLeft + +### FashionDivineCuffsCleanWristRight + +### FashionDivineCuffsCleanWrists + +### FashionDivineCuffsCleanElbowLeft + +### FashionDivineCuffsCleanElbowRight + +### FashionDivineCuffsCleanElbows + +### FashionDivineCuffsCleanArms + +### FashionDivineCuffsCleanAnklesLeft + +### FashionDivineCuffsCleanAnklesRight + +### FashionDivineCuffsCleanAnkles + +### FashionDivineCuffsCleanThighLeft + +### FashionDivineCuffsCleanThighRight + +### FashionDivineCuffsCleanThigh + +### SteelCuffsWristLeft + +### RimWristLeft + +### SteelCuffsWristRight + +### RimWristRight + +### SteelCuffsWrists + +### SteelCuffsElbowLeft + +### RimElbowLeft + +### SteelCuffsElbowRight + +### RimElbowRight + +### SteelCuffsElbows + +### SteelCuffsArms + +### SteelCuffsAnklesLeft + +### RimAnkleLeft + +### SteelCuffsAnklesRight + +### RimAnkleRight + +### SteelCuffsAnkles + +### SteelCuffsThighLeft + +### RimThighLeft + +### SteelCuffsThighRight + +### RimThighRight + +### SteelCuffsThigh + +### NeoSteelCollar + +### RimCollar + +### NeoSteelBelt + +### RimBelt + +### FashionNeoSteelCollar + +### FashionNeoSteelBelt + +### FashionSteelCuffsWristLeft + +### FashionSteelCuffsWristRight + +### FashionSteelCuffsWrists + +### FashionSteelCuffsElbowLeft + +### FashionSteelCuffsElbowRight + +### FashionSteelCuffsElbows + +### FashionSteelCuffsArms + +### FashionSteelCuffsAnklesLeft + +### FashionSteelCuffsAnklesRight + +### FashionSteelCuffsAnkles + +### FashionSteelCuffsThighLeft + +### FashionSteelCuffsThighRight + +### FashionSteelCuffsThigh + +### CyberCuffsWristLeft + +### ScreenWristLeft + +### DisplayWristLeft + +### LockWristLeft + +### CyberCuffsWristRight + +### ScreenWristRight + +### DisplayWristRight + +### LockWristRight + +### CyberCuffsWrists + +### CyberCuffsElbowLeft + +### ScreenElbowLeft + +### DisplayElbowLeft + +### LockElbowLeft + +### CyberCuffsElbowRight + +### ScreenElbowRight + +### DisplayElbowRight + +### LockElbowRight + +### CyberCuffsElbows + +### CyberCuffsArms + +### CyberCuffsAnklesLeft + +### ScreenAnkleLeft + +### DisplayAnkleLeft + +### LockAnkleLeft + +### CyberCuffsAnklesRight + +### ScreenAnkleRight + +### DisplayAnkleRight + +### LockAnkleRight + +### CyberCuffsAnkles + +### CyberCuffsThighLeft + +### ScreenThighLeft + +### DisplayThighLeft + +### LockThighLeft + +### CyberCuffsThighRight + +### ScreenThighRight + +### DisplayThighRight + +### LockThighRight + +### CyberCuffsThigh + +### NeoCyberCollar + +### ScreenCollar + +### DisplayCollar + +### LockCollar + +### CyberLinkCollar + +### LinkCollar + +### ScreenLinkCollar + +### DisplayLinkCollar + +### LockLinkCollar + +### NeoCyberBelt + +### ScreenBelt + +### DisplayBelt + +### LockBelt + +### FashionNeoCyberCollar + +### FashionCyberLinkCollar + +### FashionNeoCyberBelt + +### FashionCyberCuffsWristLeft + +### FashionCyberCuffsWristRight + +### FashionCyberCuffsWrists + +### FashionCyberCuffsElbowLeft + +### FashionCyberCuffsElbowRight + +### FashionCyberCuffsElbows + +### FashionCyberCuffsArms + +### FashionCyberCuffsAnklesLeft + +### FashionCyberCuffsAnklesRight + +### FashionCyberCuffsAnkles + +### FashionCyberCuffsThighLeft + +### FashionCyberCuffsThighRight + +### FashionCyberCuffsThigh + +### CrystalCuffsWristLeft + +### CrystalCuffsWristRight + +### CrystalCuffsWrists + +### CrystalCuffsElbowLeft + +### CrystalCuffsElbowRight + +### CrystalCuffsElbows + +### CrystalCuffsArms + +### CrystalCuffsAnklesLeft + +### CrystalCuffsAnklesRight + +### CrystalCuffsAnkles + +### CrystalCuffsThighLeft + +### CrystalCuffsThighRight + +### CrystalCuffsThigh + +### CrystalCollar + +### CrystalBelt + +### FashionCrystalCollar + +### FashionCrystalBelt + +### FashionCrystalCuffsWristLeft + +### FashionCrystalCuffsWristRight + +### FashionCrystalCuffsWrists + +### FashionCrystalCuffsElbowLeft + +### FashionCrystalCuffsElbowRight + +### FashionCrystalCuffsElbows + +### FashionCrystalCuffsArms + +### FashionCrystalCuffsAnklesLeft + +### FashionCrystalCuffsAnklesRight + +### FashionCrystalCuffsAnkles + +### FashionCrystalCuffsThighLeft + +### FashionCrystalCuffsThighRight + +### FashionCrystalCuffsThigh + +### Hobbleskirt + +### FashionBraProto + +### FashionBraCyber + +### FashionChastityBra + +### FashionHeartBelt + +### FashionCyberBelt + +### FashionProtoBelt + +### DivineBeltRunic + +### BeltMetalRunic2 + +### BeltMetalRunic1 + +### FashionDivineBeltRunic + +### DivineBra + +### BraLines + +### BraBase1 + +### BraBase2 + +### BraMetal1 + +### BraMetal2 + +### BraPins + +### BraStraps + +### LockBraLines + +### LockBraPlate + +### LockBraShackle + +### LockBraHighlight + +### FashionDivineBra + +### DivineBraRunic + +### BraMetalRunic1 + +### BraMetalRunic2 + +### BraStrapsRunic + +### FashionDivineBraRunic + +### SteelChastityBelt_Padlock + +### BeltPadlock + +### BeltPadlockPin + +### SteelChastityBelt_Radial + +### BeltRadial + +### SteelChastityBelt_Segu + +### BeltSegu + +### FashionSteelChastityBelt_Padlock + +### FashionSteelChastityBelt_Radial + +### FashionSteelChastityBelt_Segu + +### SteelChastityBra_Padlock + +### BraPadlock + +### BraPadlockPin + +### SteelChastityBra_Radial + +### BraRadial + +### SteelChastityBra_Segu + +### BraSegu + +### FashionSteelChastityBra_Padlock + +### FashionSteelChastityBra_Radial + +### FashionSteelChastityBra_Segu + +### JacketLowerStraps + +### JacketExtraStraps + +### StrapsTorsoLowerExtra + +### CrotchBeltExtra + +### StrapsChestExtra + +### JacketHeavyStraps + +### JacketLower + +### JacketExtra + +### JacketHeavyArmbinder + +### JacketExtraArmbinder + +### JacketHeavyBolero + +### JacketExtraBolero + +### JacketHeavyLeotard + +### JacketExtraLeotard + +### RightLacesLegbinder + +### LegLacesLegbinder + +### FashionClothBlindfold + +### FashionBlindfoldBasic + +### FashionBlindfoldLeather + +### FashionKittyBlindfold + +### FashionBlindfoldTape + +### SmoothHeels + +### TallBalletHeels + +### TallBalletHeelsRestraint + +### CyberBalletHeels + +### GlowBalletLeft + +### GlowBalletRight + +### CyberBalletHeelsRestraint + +### FashionHarnessTop + +### FashionHarnessMid + +### FashionHarnessStrap + +### FashionHarness + +### LockChest + +### LockMid + +### LockLower + +### FashionFutureHarnessLower + +### FashionFutureHarnessMid + +### FashionFutureHarnessChest + +### FashionFutureHarness + +### ClothTop + +### TopChest + +### TopShoulders + +### ClothBra + +### ClothTopBand + +### TopBandChest + +### TopBandRimChest + +### TopBand + +### TopBandRim + +### ClothBraBand + +### NinjaSkirt + +### SkirtBandOver + +### NinjaSockLeft + +### NinjaSockRight + +### NinjaThighLeft + +### NinjaThighRight + +### NinjaKneeLeft + +### KneeLeft + +### NinjaKneeRight + +### KneeRight + +### NinjaSocks + +### NinjaThighs + +### NinjaKnees + +### NinjaShoes + +### Ninja + +### FashionMaidGag + +### FashionDusterGag + +### FashionBallGag + +### FashionBallGagHarness + +### FashionBallGagHarnessSecure + +### FashionPanelGag + +### FashionPanelGagHarness + +### FashionPanelGagHarnessSecure + +### FashionMuzzleGag + +### FashionMuzzleGagHarness + +### FashionMuzzleGagHarnessSecure + +### FashionPlugMuzzleGag + +### FashionPlugMuzzleGagHarness + +### FashionPlugMuzzleGagHarnessSecure + +### FashionPlugPanelGag + +### FashionPlugPanelGagHarness + +### FashionPlugPanelGagHarnessSecure + +### FashionTapeCleave + +### FashionClothKnot + +### FashionClothCleaveThick + +### FashionClothCleave + +### FashionClothOTN + +### FashionClothOTM + +### GagLatexMute + +### MuteLogo + +### GagLatexMuteHarness + +### GagLatexMuteHarnessSecure + +### FashionGagLatex + +### FashionGagLatexFlat + +### FashionGagLatexFlatHarness + +### FashionGagLatexFlatHarnessSecure + +### FashionGagLatexMute + +### FashionGagLatexMuteHarness + +### FashionGagLatexMuteHarnessSecure + +### FashionGagLatexPlug + +### FashionGagLatexPlugHarness + +### FashionGagLatexPlugHarnessSecure + +### FashionLatexNeckCorsetPlugGag + +### FashionKittyHarnessPanelGag + +### FashionSmoothBallGag + +### FashionSegmentedLargePanelGag + +### FashionSegmentedLargePanelGagHarness + +### FashionSciFiPanelGag + +### FashionAdvancedSciFiPanelGag + +### FashionUltimateSciFiPanelGag + +### FashionUltimateSciFiPanelGag2 + +### FashionSegmentedPlugGag + +### FashionSciFiPlugMuzzle + +### FashionAdvancedSciFiPlugMuzzle + +### DivineGag + +### Teeth + +### Metallic + +### FashionDivineGag + +### DivineGagClean + +### GoldClean + +### FashionDivineGagClean + +### DivineMuzzle + +### MuzzleRim + +### MuzzleGold + +### MuzzleHarness + +### MuzzleCollar + +### FashionDivineMuzzle + +### DivineMuzzleClean + +### MuzzleGoldClean + +### FashionDivineMuzzleClean + +### FutureBox + +### Rim + +### Door + +### DoorWindow + +### DoorNumeral + +### BackFade + +### CrystalEncase + +### EncaseOver + +### EncaseUnder + +### FashionLeash + +### ArmsBelts + +### LegsBelts + +### LeftLegsBelts + +### ElitePetsuit + +### ArmsLaces + +### ArmsHardware + +### LegsLaces + +### LegsHardware + +### LeftLegsLaces + +### LeftLegsHardware + +### CyberPetsuit + +### DisplayArms + +### DisplayLegs + +### DisplayLeftLegs + +### NippleClamps + +### Clamps + +### ClampsBullet + +### NippleClampsRestraint + +### RingVibes + +### Rings + +### RingsBullet + +### RingVibesRestraint + +### NippleWeights + +### Weights + +### NippleWeightsRestraint + +### VibePiercings + +### VibePiercingsBullet + +### VibePiercingsRestraint + +### PostureCollarBasic + +### PostureCollar + +### PostureCollarRim + +### PostureCollarLoop + +### PostureCollarHardware + +### FashionPostureCollarBasic + +### FashionPostureCollar + +### ReverseBinder + +### ReverseBinderLeft + +### ReverseBinderRight + +### ReverseBinderStraps + +### ReverseBinderHardware + +### NightWhip + +### NightWhipLight + +### LatexWhip + +### KittyLatexEar + +### KittyLatexEarLight + +### KittyLatexEarMuff + +### KittyLatexEarMuffLight2 + +### KittyLatexEarMuffLight1 + +### KittyLatexTail + +### KittyLatexTailLight + +### KittyLatexTail2 + +### KittyLatexTail2Light + +### KittyLatex + +### SuccubusWing + +### SuccubusWingBase + +### SuccubusWingBack + +### SuccubusWingLight + +### SuccubusHorn + +### SuccubusHornRight + +### SuccubusHornLeft + +### SuccubusHornLight + +### SuccubusTail + +### SuccubusTailLight + +### SuccubusClaws + +### SuccubusClawLeft + +### SuccubusClawRight + +### SuccubusFeet + +### Succubus + +### SlimeBubble + +### BubbleSquishy + +### BubbleSquishyBack + +### LatexSphere + +### LatexSphereCutaway + +### LatexSphereCutawayBack + +### BallSuit + +### BubbleHead + +### FashionBubbleHead + +### BubbleArms + +### BubbleLegs + +### FashionBubbleLegs + + + +### Hair5_FrontE + +### BlankEyes + +### DaiBrows1 + +### DaiBrows2 + +### Glabella + +### Ridge + +### BraRim + +### InnerLines + +### BraUnder + +### BraUnderRim + +### BraStriped + +### Stripes + +### BraCherry + +### Cherry + +### BraRose + +### Rose + +### BraInvertedRose + +### InvertedRose + +### Straps + +### Base + +### Lines + +### PantiesBow + +### PantiesStriped + +### PantiesInvertedRose + +### PantiesCherry + +### PantiesBowStriped + +### PantiesHigh + +### PantiesHighStriped + +### SwimsuitRestraint + +### BlouseShoulderRight + +### SlayerCollar + +### CapeCollar + +### CapeCollarButton + +### CapeCollarRim + +### SlayerCape + +### CapeCollarInner + +### CapeStripe + +### CapeShoulderLeft + +### CapeShoulderRight + +### CapeShoulderLeftButton + +### CapeShoulderRightButton + +### CapeBack + +### LeatherMask + +### Hood + +### Gag + +### FashionLeatherMask + +### LeatherHood + +### FashionLeatherHood + +### CyberLongMittenLeft + +### CapForeLongMittenLeft + +### CapLongMittenLeft + +### CuffForeLongMittenLeft + +### CuffLongMittenLeft + +### DisplayForeLongMittenLeft + +### DisplayLongMittenLeft + +### LockForeLongMittenLeft + +### LockLongMittenLeft + +### GlowForeLongMittenLeft + +### GlowLongMittenLeft + +### StrapsForeLongMittenLeft + +### StrapsLongMittenLeft + +### UpperCuffLongMittenLeft + +### UpperDisplayLongMittenLeft + +### UpperLockLongMittenLeft + +### UpperGlowLongMittenLeft + +### CyberLongMittenRight + +### CapForeLongMittenRight + +### CapLongMittenRight + +### CuffForeLongMittenRight + +### CuffLongMittenRight + +### DisplayForeLongMittenRight + +### DisplayLongMittenRight + +### LockForeLongMittenRight + +### LockLongMittenRight + +### GlowForeLongMittenRight + +### GlowLongMittenRight + +### StrapsForeLongMittenRight + +### StrapsLongMittenRight + +### UpperCuffLongMittenRight + +### UpperDisplayLongMittenRight + +### UpperLockLongMittenRight + +### UpperGlowLongMittenRight + +### CyberLongMittens + +### CyberMittenLeft + +### MittenLeft + +### ForeMittenLeft + +### CyberMittenRight + +### MittenRight + +### ForeMittenRight + +### CyberMittens + +### CyberArmLeft + +### ArmLongMittenLeft + +### CyberArmRight + +### ArmLongMittenRight + +### UpperCuffForeLongMittenRight + +### CyberArms + +### FashionCyberLongMittens + +### FashionCyberMittens + +### CyberThighLink + +### GlowThighLink + +### CyberAnkleLink + +### GlowAnkleLink + +### FashionCyberThighLink + +### FashionCyberAnkleLink + +### CyberPanties + +### CyberPantiesLining + +### TallSmoothHeels + +### TallSmoothHeelsRestraint + +### NeckCorset2 + +### NeckCorsetRim2 + +### ShinyLatexMuzzle + +### NeckCorsetGag2 + +### NeckCorsetGagRim2 + +### NeckCorsetGag + +### ShinyLatexMuzzleRestraint + +### NeckCorsetRestraint + +### NeckCorsetGagRestraint + +### LatexPetsuit + +### LatexPetsuitGlow + +### GlowArms + +### GlowTorso + +### GlowLegs + +### GlowLeftLegs + +### MiniCape + +### Epaulettes + +### TheRobeOfChastity + +### ChestBase + +### Frill + +### ChestFrill + +### ChestGold + +### Plate + +### ChestPlate + +### GoldBase + +### ChestGoldBase + +### Fabric + +### ChestFabric + +### TheRobeOfChastityRestraint + +### Spats + +### GothicSkirt + +### WaistbandClips + +### Buttons + +### HemLower + +### HemLowerBack + +### HemUpper + +### GothicSkirtLace + +### LaceLower + +### LaceUpper + +### LightMaidKnight_Dress + +### DressChest + +### DressDeco + +### DressDecoBack + +### LightMaidKnight_Bra + +### LightMaidKnight_Top + +### LightMaidKnight_SleeveLeft + +### LightMaidKnight_SleeveRight + +### LightMaidKnight_Sleeves + +### LightMaidKnightHairband + +### Headband + +### HeadbandFrill + +### HeadbandRibbon + +### FootBootLeftHogtie + +### FootShoeLeftHogtie + +### GagNecklace + +### GagNecklaceBall + +### FashionGagNecklace + +### BondageBed + +### BedStraps + +### BedStrapsHogtie + +### LightMaidKnight_Apron + +### ApronChest + +### ApronBack + +### LightMaidKnight_Flower + +### Flower + +### LightMaidKnight_SockRight + +### LightMaidKnight_SockLeft + +### LightMaidKnight_Socks + +### LightMaidKnight_GloveLeft + +### LightMaidKnight_GloveRight + +### LightMaidKnight_Gloves + +### LightMaidKnight_GuardLeft + +### GuardLeft + +### GuardCuffLeft + +### GuardCuff2Left + +### LightMaidKnight_GuardRight + +### GuardRight + +### GuardCuffRight + +### GuardCuff2Right + +### LightMaidKnight_Guards + +### LightMaidKnight_Boots + +### LightMaidKnight_Pauldron + +### PauldronLeft + +### PauldronStrap + +### LightMaidKnight + +### HeavyMaidKnightHairband + +### HeadbandRibbonBack + +### FlowerLeaves + +### HeavyMaidKnight_Dress + +### DressSkirtHem + +### DressSkirtStripe + +### HeavyMaidKnight_SleeveLeft + +### SleeveLeftStripe + +### HeavyMaidKnight_SleeveRight + +### SleeveRightStripe + +### HeavyMaidKnight_ChestArmor + +### ChestArmor + +### HeavyMaidKnight_GloveLeft + +### HeavyMaidKnight_GloveRight + +### HeavyMaidKnight_Gloves + +### HeavyMaidKnight_GauntletLeft + +### HeavyMaidKnight_GauntletRight + +### HeavyMaidKnight_Gauntlets + +### HeavyMaidKnight_PauldronLeft + +### PauldronLeftStraps + +### PauldronLeftHardware + +### HeavyMaidKnight_PauldronRight + +### PauldronRight + +### PauldronRightStraps + +### HeavyMaidKnight_Pauldrons + +### HeavyMaidKnight_SideArmor + +### SideArmor + +### HeavyMaidKnight_Corset + +### HeavyMaidKnight_CorsetRestraint + +### HeavyMaidKnight_Sleeves + +### HeavyMaidKnight_ApronBottom + +### ApronBelt + +### ApronMiniBow + +### ApronCross + +### ApronStripe + +### ApronPattern + +### HeavyMaidKnight_ApronTop + +### ApronChestRuffles + +### ApronChestBelts + +### HeavyMaidKnight_Apron + +### HeavyMaidKnight_WaistBelts + +### BeltsHardware + +### HeavyMaidKnight_WaistPouches + +### Pouches + +### HeavyMaidKnight_Waist + +### HeavyMaidKnight_Boots + +### BootLegLeft + +### BootLegRight + +### HeavyMaidKnight_PantyhoseShorts + +### Pantyhose + +### HeavyMaidKnight_SockRight + +### HeavyMaidKnight_SockLeft + +### HeavyMaidKnight + +### BlondeFront + +### BlondeBangs + +### BlondeBack + +### FangMouth_Double + +### HoodCollar + +### BigBallTeethFang + +### MilitaryJacket_Sleeveless + +### MilitaryUniform_SleeveLeft + +### MilitaryUniform_SleeveRight + +### MilitaryUniform_Sleeves + +### MilitaryJacket + +### WhiteGloveLeft + +### WhiteGloveRight + +### WhiteGloves + +### UniformShirt_Sleeveless + +### UniformShirt_SleeveLeft + +### UniformShirt_SleeveRight + +### UniformShirt_Sleeves + +### UniformShirt + +### MilitaryUniform_Hat + +### Hat + +### HatRim + +### HatCap + +### HatGloriousInsignia + +### HatGloriousInsigniaHS + +### MilitaryUniform_Earphones + +### Headgear + +### HeadgearUnit + +### HeadgearEars + +### HeadgearEarsInner + +### HeadgearBack + +### MilitaryUniform_Searchlight + +### SearchlightPouch + +### Searchlight + +### SearchlightBase + +### SearchlightLens + +### MilitaryUniform_BeltPouch + +### BeltPouch + +### BeltPouchRim + +### MilitaryUniform_Webbing + +### Webbing + +### WebbingSide + +### WebbingHardware + +### WebbingName + +### WebbingUnderbust + +### WebbingUnderbustHardware + +### MilitaryUniform_Skirt + +### MilitaryUniform_Shoes + +### MilitaryUniform_TightsShorts + +### MilitaryUniform_SockLeft + +### MilitaryUniform_SockRight + +### Tights + +### MilitaryUniform_Hairpin + +### Hairpin + +### MilitaryUniform + +### ShirtSleeveLeft + +### ShirtForeArmLeft + +### ShirtSleeveRight + +### ShirtForeArmRight + +### ShirtShoulderRight + +### ShirtDress + +### ShirtDressChest + +### RubyNecklace + +### RubyChain + +### RubyRing + +### RubyGem + +### RubyNecklaceRestraint + +### SigilNecklace + +### SigilChain + +### SigilDisc + +### SigilNecklaceRestraint + +### MetalNecklace + +### MetalChain + +### MetalDisc + +### MetalNecklaceRestraint + +### NecklaceCharm + +### DragonNecklaceRestraint + +### BallTeeth + +### CrystalBallGag + +### CrystalBallGagSmooth + +### GagMetalRivetedStrap + +### OTNStrap + +### OTNStrapRivets + +### FashionGagMetalRivetedStrap + +### CrystalGagNecklace + +### CrystalGagNecklaceBall + +### FashionCrystalGagNecklace + +### LeashCollar + +### LeashCollarHardware + +### BootShoeLeft + +### BootShoeRight + +### Fear + +### RubyHardware + +### KiguMaskSmile + +### MouthSmile + +### FashionKiguMaskSmile + +### OneBarTop + +### OneBarPrisonLatex + + + +### FangMouth + +### FanglessMouth + +### SantaHat + +### HatBack + +### Fluff + +### Orb + +### FestiveArmbinder + +### BinderStrapLeft + +### BinderFluffLeft + +### FestiveHarnessTop + +### StrapTop + +### ButtonsTop + +### FuzzTop + +### FestiveHarnessMid + +### StrapMid + +### ButtonsMid + +### FuzzMid + +### FestiveHarnessStrap + +### StrapBot + +### ButtonsBot + +### FuzzBot + +### FestiveHarness + +### StrapOverbust + +### StrapUnderbust + +### ButtonsUnderbustOver + +### ButtonsUnderbust + +### FuzzUnderbustOver + +### FuzzUnderbust + +### FashionFestiveHarnessTop + +### FashionFestiveHarnessMid + +### FashionFestiveHarnessStrap + +### FashionFestiveHarness + +### FrillyHeadband + +### HeadbandBand + +### HeadbandBow + +### BowHeadband + +### BowHeadbandFrill + +### BackHime + +### HimeBack + +### BackShort + +### BackFlat + +### Bob + +### BobFront + +### FrontStraight2 + +### FrontStraight2_Front + +### FrontStraight2_Overstrap + +### FrontSwept + +### FrontSweptSide + +### Vents + +### VentL + +### VentR + +### VentsInnerR + +### VentsInnerL + +### VentsFront + +### BigBraidBack + +### CurlyPonytail + +### DrillLeft + +### DrillRight + +### Twindrills + +### Twintails + +### PointyAhoge + +### RoundHat + +### HatTop + +### TopHatSmall + +### TopHatSmallBow + +### BlondeFrontM + +### BlondeBangsM + +### BlondeBackM + +### Mascara + +### MascaraL + +### MascaraR + +### Scar + +### PointyAntennae + +### AnthenaL + +### AnthenaR + +### PointyHorns + +### HornL + +### HornR + +### PointyTail + +### Tail + +### WolfEars2 + +### EarLeft + +### EarRight + +### HairclipDual + +### HairclipLower + +### HairclipUpper + +### ChainPanties + +### PantiesChain + +### ChainPanties2 + +### KittyPetCuffsWristLeft + +### KittyPetCuffsWristRight + +### KittyPetCuffsWrists + +### KittyPetCuffsElbowLeft + +### KittyPetCuffsElbowRight + +### KittyPetCuffsElbows + +### KittyPetCuffsArms + +### KittyPetCuffsAnklesLeft + +### KittyPetCuffsAnklesRight + +### KittyPetCuffsAnkles + +### KittyPetCuffsThighLeft + +### KittyPetCuffsThighRight + +### KittyPetCuffsThigh + +### KittyPetCuffsCollar + +### FashionKittyPetCuffsCollar + +### FashionKittyPetCuffsWristLeft + +### FashionKittyPetCuffsWristRight + +### FashionKittyPetCuffsWrists + +### FashionKittyPetCuffsElbowLeft + +### FashionKittyPetCuffsElbowRight + +### FashionKittyPetCuffsElbows + +### FashionKittyPetCuffsArms + +### FashionKittyPetCuffsAnklesLeft + +### FashionKittyPetCuffsAnklesRight + +### FashionKittyPetCuffsAnkles + +### FashionKittyPetCuffsThighLeft + +### FashionKittyPetCuffsThighRight + +### FashionKittyPetCuffsThigh + +### KittyPawCuffsWristLeft + +### KittyPawCuffsWristRight + +### KittyPawCuffsWrists + +### KittyPawCuffsElbowLeft + +### KittyPawCuffsElbowRight + +### KittyPawCuffsElbows + +### KittyPawCuffsArms + +### KittyPawCuffsAnklesLeft + +### KittyPawCuffsAnklesRight + +### KittyPawCuffsAnkles + +### KittyPawCuffsThighLeft + +### KittyPawCuffsThighRight + +### KittyPawCuffsThigh + +### FashionKittyPawCuffsWristLeft + +### FashionKittyPawCuffsWristRight + +### FashionKittyPawCuffsWrists + +### FashionKittyPawCuffsElbowLeft + +### FashionKittyPawCuffsElbowRight + +### FashionKittyPawCuffsElbows + +### FashionKittyPawCuffsArms + +### FashionKittyPawCuffsAnklesLeft + +### FashionKittyPawCuffsAnklesRight + +### FashionKittyPawCuffsAnkles + +### FashionKittyPawCuffsThighLeft + +### FashionKittyPawCuffsThighRight + +### FashionKittyPawCuffsThigh + +### KittyPetLeotardUnder + +### LeotardStripes + +### LeotardChestStripes + +### KittyPetLeotard + +### KittyPetLeotardRestraint + +### KittyPetUniformCollar + +### LeotardChestCollar + +### LeotardChestCollarLeft + +### LeotardChestCollarStripes + +### LeotardChestCollarStripesLeft + +### CollarDecoSymbol + +### ShoulderCuffLeft + +### ShoulderCuffStripeLeft + +### ShoulderCuffRight + +### ShoulderCuffStripeRight + +### KittyPetTail + +### TailStripe + +### KittyPetBlindfold + +### BlindfoldRim + +### BlindfoldBrow + +### FashionKittyPetBlindfold + +### KittyPetSteelCollar + +### FashionKittyPetSteelCollar + +### KittyPetMittenLeft + +### GloveLeftPaw + +### ForeGloveLeftPaw + +### KittyPetMittenRight + +### GloveRightPaw + +### ForeGloveRightPaw + +### KittyPetMittens + +### FashionKittyPetMittenLeft + +### FashionKittyPetMittenRight + +### FashionKittyPetMittens + +### KittyPetEars1 + +### Ears1L + +### Ears1R + +### Ears1InnerL + +### Ears1InnerR + +### KittyPetEars2 + +### Ears2L + +### Ears2R + +### Ears2InnerL + +### Ears2InnerR + +### KittyPetEarmuffs + +### EarmuffersL + +### EarmuffersR + +### KittyPetEarmuffsRestraint + +### KittyPetEars1Restraint + +### KittyPetEars2Restraint + +### KittyPetGag + +### GagCollar + +### KittyPetGagSeamless + +### GagSeamless + +### KittyPetGagMouth + +### GagMouth + +### KittyPetGagMouthSeamless + +### GagMouthSeamless + +### FashionKittyPetGag + +### FashionKittyPetGagSeamless + +### FashionKittyPetGagMouth + +### FashionKittyPetGagMouthSeamless + +### KittyPetsuit + +### ArmsPaws + +### LeftLegsPaws + +### FootLeftHogtiePaws + +### KittyPetSockLeft + +### SockLeftPaws + +### KittyPetSockRight + +### KittyPetSocks + +### KittyPetSocksRestraint + +### KittyPetPawLeft + +### KittyPetPawRight + +### KittyPetPaws + +### KittyPetPawsRestraint + +### KittyPetPawShortLeft + +### KittyPetPawShortRight + +### KittyPetPawsShort + +### KittyPetPawsShortRestraint + +### Hide Items + +### Sort Items + +### Drop Items + +### Filter Items + +### Rarity + +### Magical + +### Knives + +### Potions + +### Power + +### Find In Inventory + +### A huge rubber cube rises up out of the floor! + +### The latex cube hardens into a solid, harmless entity. + +### The latex cube slowly engulfs you! (DamageTaken) + +### The latex cube touches you, spreading latex restraints across your body! (+RestraintAdded) + +### A small rubber cube rises up out of the floor! + +### Mini Latex Cube + +### The mini latex cube hardens into a solid, harmless entity. + +### The mini latex cube sticks to you! (DamageTaken) + +### The mini latex cube expands across your body, taking the form of restraints! (+RestraintAdded) + +### Gigantic Slime + +### The gigantic slime fizzles as its body becomes unstable! + +### The gigantic slime stretches a pseudopod and engulfs you! (+RestraintAdded) + +### The gigantic slime slowly engulfs you! (DamageTaken) + +### A group of slimes jump out! + +### A slime jumps out! + +### A group of speedy slimes jump out! + +### A speedy slime jumps out! + +### Chain Sword + +### Cut through their defenses and tie them up in the process! + +### Deals slash damage. Adds 10 metal binding. + +### You pick up sword with a bunch of chains attached. + +### Slime Sword + +### It wiggles as you move it around. + +### Deals glue damage. Adds 25 slime binding. + +### You pick up slime-covered sword. + +### Frost Blade + +### As cold as its creator. + +### Deals 20 bonus ice damage and briefly slows the target. + +### You pick up an icy sword. + +### Targe + +### Hide behind it while you still can. + +### +60 Block. Deals crush damage and stuns for 4 turns. Offhand: Gives the same block bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a wooden shield. + +### Tower Shield + +### Now with more leg room. + +### Slows you down by 1 level. +120 Block, +30 Physical Armor. Deals crush damage and stuns for 7 turns. Offhand: Slows you and gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a metal tower shield. + +### Reinforced Shield + +### New and improved, but also clumsier. + +### +80 Block, +15 Physical Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a reinforced shield. + +### Runic Shield + +### For when you've been tied up one too many times... + +### +80 Block, +20 Magic Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. + +### You pick up a runic shield. + +### Vanish + +### Make the targeted creature invisible, making you totally invisible for Duration turns. Attacking and casting spells reveals your presence but you are still harder to see. + +### The slime dissolves your clothing, leaving nothing but rubber against your skin... + + + +### Riposte + +### Blocking an enemy attack makes them vulnerable and stuns them briefly. + +### Parry + +### +15 Block while holding a weapon. + +### Dagger Parry + +### +15 Block while holding a light weapon such as a knife or dagger. + +### Steadfast Guard + +### +5 Block for each 100 max willpower you have, while holding a non-light weapon. + +### The Power of Steel + +### +5 Block for each 100 max willpower you have, while holding a weapon that deals physical damage. + +### Secure Defense + +### +15-30 Block, based on your percentage of Willpower. + +### You block the EnemyName attack! + +### You block EnemyName! + +### You dodge EnemyName! + +### You block the EnemyName! + +### You dodge the EnemyName! + + + +### You resist being bound! + +### Self Bondage Enthusiast + +### Start with a basic self-bondage kit. + +### Apprehended + +### When you are bound by an enemy attack or spell, you are stunned 1 turn per restraint added. + +### Feeble Attacks + +### All enemies gain 20 physical and magic armor. + +### Glass Cannon + +### The effects of you taking damage are increased by 150%. + +### The Wand is Mightier + +### Enemies have 30% more hp; Tease damage multiplier to bound targets is increased by 85%. + +### Kinky Armory + +### Chef + +### You defeat the chef and claim her prize. + +### The chef makes sure you'll never steal again! (DamageTaken) + +### The chef makes sure you'll never steal again! (+RestraintAdded) + +### The chef spanks you with her frying pan! (DamageTaken) + +### As you eat, you look up and notice that someone is not very happy with you. + +### You find some delicious brownies! + +### Double Fudge Brownie + +### You enjoy the brownie one soft, delicious bite at a time. + +### A decadent blend of butter and chocolate topped with fudge and baked to perfection. + +### Restores 30% willpower. Takes a few turns to eat. + +### A playful ghost now accompanies you on your journey. + +### The ghost haunting you decides to have a little fun! (+RestraintAdded) + +### Hemp Rope + +### The most common type of bondage rope. + +### Soft and comfy. Great for casual wear! + +### Boxtie + +The ropes squeeze you gently. +로프가 당신을 부드럽게 조입니다. +Rope Cuffs +로프 커프스 +A quick tie for apprehending prisoners. +죄수를 체포하기 위한 빠른 넥타이. +It's not very secure. +매우 안전하지 않습니다. +### Chest Straps + +### Chest Harness + +### The finishing touch on a tight and strict piece of ropework. + +Rope Hogtie +밧줄 매춘부 +A very strict and tight hogtie, good for subduing unruly captives. +엄청 엄격하고 빡빡한 창녀로 제멋대로인 포로들을 제압하는 데 좋습니다. +### It holds you strictly in a boxtie. You tug on the rope connecting your feet and struggle. + +### It holds you strictly with your back arched. You tug on the rope connecting your feet and struggle. + +Rope Belt +로프 벨트 +Rope Harness +로프 하네스 +A harness that secures your other restraints and makes them tighter. +다른 구속 장치를 고정하고 더 단단하게 만드는 하네스. +Crotch Rope +가랑이 밧줄 +A tight rope impressing upon your most private areas... +당신의 가장 은밀한 부분에 감명을 주는 팽팽한 밧줄... +Wrist Rope +손목 로프 +A wrist and elbow tie keeping your arms secured behind your back. +등 뒤로 팔을 고정시키는 손목과 팔꿈치 넥타이. +### Upper Knee Ropes + +### A tie that hobbles your knees together.. + +### Thigh Ropes + +### Upper Thigh Ropes + +### A tie that hobbles your thighs together.. + +Ankle Ropes +발목 로프 +### Lower Leg Ropes + +### Lower Knee Ropes + +### A tie keeping your knees secured together. + +### Toe Rope + +### A tie keeping your toes tightly together. + +### Living Rope Collar + +### This collar is designed to make sure its wearer does not escape their ropes. + +### It will occasionally cause ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Notebook Page + +### You're going to stay with me for a while~ + +### That's better! Now stay close to me~ + +### Looks like our time is coming to an end... + +### Time to bring you back to your place~ + +### You've been quite adorable! Until next time~ + +### It's time for your walk, miss. + +### Now let's see, where to go... + +### I think we've reached a stopping point. + +### I have to put you back now~ + +### It's been fun playing with you miss! + +### (reaches for your leash) + +### (holds your leash firmly) + +### (giggles) + +### (waves goodbye) + +### Why don't we go for a walk? + +### That's better! Now come along~ + +### This has been lots of fun! + +### I have to go return you~ + +### Good girl~ Let's go again later~ + +### It's time for walkies! + +### That's a good girl! + +### I want to keep you longer, but I've got things to do. + +### It's time to go back to your little house~ + +### (pats you on the head) + +### It is time for your mandatory exercise. + +### Please maintain proximity. + +### Progress Level: 90% + +### Exercise complete. Returning to storage. + +### Uploading logs to database. Error... no connection. + +### Latex Mimic + +### The latex mimic melts into a shiny puddle. + +### The latex mimic spits out a glob of rubber at you! (+RestraintAdded) + +### The latex mimic stretches out an appendage and pulls you toward it! (DamageTaken) + +### The latex mimic engulfs you in sticky rubber! (DamageTaken) + + + +### Item Stack: + +### Heavy + +### Accessory + +### Restraint + +### Enchanted + +### Mundane + +### Can Disassemble + +### Raw Material + +### Armbinders + +### Legbinders + +### Boxbinders + +### Devices + +### Toys + +### Collars + +### Jackets + +### Dresses + +### Ties + +### Wrapping + +### Gags + +### Harnesses + +### Mittens + +### Boots + +### C. Belts + +### C. Bras + +### Maid + +### Locked + +### Accessible + +### Inaccessible + +### Quick-Bind + + + + + +### Lower + +### Spellbound Rope + +### An enchanted rope with a powerful sealing spell. It cannot be cut by mundane means. + +### It almost has a kinky mind of its own. + +### Spellbound Boxtie + +The knots appear to tie themselves together again, making them impossible to undo! +매듭이 다시 하나로 묶인 것처럼 보여서 풀 수 없게 됩니다! +### Spellbound Rope Cuffs + +### Spellbound Ropework + +A quick tie for apprehending prisoners, looped through buckles on the hand restraints. +수감자를 체포하기 위한 빠른 넥타이로, 손 구속 장치의 버클에 고리가 달려 있습니다. +### Strict Spellbound Ropework + +### The finishing touches on a tight and strict piece of ropework. + +### Spellbound Hogtie + +### Spellbound Rope Belt + +### Spellbound Harness + +### Spellbound Crotch Rope + +### Spellbound Wrist Tie + +### Spellbound Knees + +### Spellbound Thighs + +### A tie that holds your legs together.. + +### Spellbound Upper Thighs + +### A tie that holds your thighs together.. + +### Spellbound Ankles + +### Spellbound Lower Legs + +### A tie keeping your legs secured together. + +### Spellbound Lower Knees + +### Spellbound Toe Rope + +### A tie keeping your toes secured together. + +### Living Spellbound Rope Collar + +### It will occasionally cause spellbound ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### A novice-level enchanted rope, relatively trivial to untie but resistant to mundane tools. + +### Faintly glows with traces of devious thoughts. + +### Magic Boxtie + +### They glow with a trace of magic. + +Magic Rope Cuffs +매직 로프 커프스 +Magic Ropework +매직 로프워크 +### Strict Magic Ropework + +Magic Hogtie +매직 혹티 +It's very secure. You tug on the rope connecting your feet and struggle. +매우 안전합니다. 발을 연결하는 밧줄을 잡아당기며 몸부림칩니다. +### Magic Rope Belt + +### Magic Harness + +Magic Crotch Rope +매직 가랑이 로프 +### Magic Wrist Tie + +### Magic Knee Tie + +### Magic Thigh Ropes + +### Magic Upper Thigh Ropes + +### Magic Ankle Tie + +### Magic Lower Leg Tie + +### Magic Lower Knee Tie + +Magic Toe Rope +매직 토 로프 +### Living Magic Rope Collar + +### It will occasionally cause magic ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Celestial Rope + +### Rope that has been exposed to solar energies. + +### Squeezes the wearer if she tries to escape, so that she knows her place. + +### Holy Boxtie + +### A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. + +Holy Rope Cuffs +홀리 로프 커프스 +Holy Ropework +신성한 로프워크 +### Strict Holy Ropework + +### Holy Hogtie + +Holy Rope Belt +성스러운 밧줄 허리띠 +### Holy Rope Harness + +Holy Crotch Rope +거룩한 가랑이 밧줄 +Holy Wrist Rope +성스러운 손목 밧줄 +### Holy Upper Knee Ropes + +### Holy Thigh Ropes + +### Holy Upper Thigh Ropes + +Holy Ankle Ropes +신성한 발목 로프 +### Holy Lower Leg Ropes + +### Holy Lower Knee Ropes + +### Holy Toe Rope + +### Living Holy Rope Collar + +### It will occasionally cause holy ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Mithril Rope + +### Rope made from silver thread, exposed to lunar energies. + +### Lightweight yet unyielding. Truly a high class rope. + + + +### Mithril Boxtie + +### A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. + +### Mithril Rope Cuffs + +### Mithril Ropework + +### Strict Mithril Ropework + +Mithril Hogtie +미스릴 혹티 +### Mithril Rope Belt + +Mithril Rope Harness +미스릴 로프 하네스 +Mithril Crotch Rope +미스릴 가랑이 밧줄 +### Mithril Wrist Rope + +### Mithril Lower Knee Ropes + +### Mithril Thigh Ropes + +### Mithril Upper Thigh Ropes + +### Mithril Ankle Ropes + +### Mithril Lower Leg Ropes + +### Mithril Toe Ropes + +### Living Mithril Rope Collar + +### It will occasionally cause mithril ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. + + + +### Dark Portal + +### They are trying to take you somewhere! + +### Essence Mote + +### A trainee can use this to focus. + +### Pick this up to gain decaying miscast reduction. + +### Seal Sigil + +### Walk over it to erase it and unlock the next floor. + +### The Shadow + +### The Shadow is exorcised... for now. + +### The Shadow overwhelms you with its power... (+RestraintAdded) + +### The Shadow welcomes you to your new future. (DamageTaken) + +### The Shadow cackles as your restraints are sealed! (DamageTaken) + +### The Shadow smiles and vanishes. + +### The Shadow smiles and vanishes, leaving you locked in a mysterious RNAME... + +### Observer + +### The observer is banished into the aether. + +### From the Beyond + +### You briefly spot your reflection as a reflective cube appears! + +### Mini Metal Cube + +### The liquid metal cube shatters into glittering dust. + +### The liquid metal cube sticks to you and hardens! (DamageTaken) + +### The liquid metal cube expands across your body and hardens, taking the form of restraints! (+RestraintAdded) + + + +### Liquid Metal + +### Primordial latex infused with mineral form. + +### Heavy and weighs the wearer down. + +### Liquid Metal (Feet) + +### A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. + +### Forming a skintight layer, it will be quite difficult to escape this. + +### Liquid Metal (Ankles) + +### Liquid Metal (Legs) + +### Liquid Metal (Arms) + +### Liquid Metal (Hands) + +### Liquid Metal (Mouth) + +### Liquid Metal (Head) + +### Living Liquid Metal Collar + +### This collar is designed to make sure its wearer does not escape the metal. + +### It will occasionally cause liquid metal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of liquid metal you have on you. + + + +### The stairs dissolve right before you! + +### The stairs dissolve as you step onto them, pulling you with them to somewhere else. + +### A dark energy enters your body... (DamageDealt) + +### A dark energy lurks within you. + +### You succumb to a dark desire... (+RestraintAdded) + +### Observer's Gaze + +### Industrial Tape Wand + +### A non-magical tape wand used for creating tight little packages. + +### Deals chain damage. 200% binding efficiency. Hitting an enemy applies the Taped debuff for 12 turns, increasing Chain damage to them by 15%. Deal 10 chain damage to adjacent Taped enemies while moving. + + + +### Bag of Goodies + +### Someone's secret stash. + +### Deals charm damage. Applies a toy to targets hit for 40 turns. Offhand: Applies a toy to targets you hit. + +### You find a bag filled with various toys and vibrators... + +### You play with yourself using some of the toys in the bag... + +### Magic Remote + +### The key to absolute power. + +### Triggers long-duration edging on basic attack if the target has a toy. Offhand: Applies short-duration teasing to targets you hit. + +### Vibrator Remote + +### You click the remote and hear a buzzing noise! + +### 15 charge to powerfully activate vibrators in an area for 15 turns. + +### 10 charge to activate vibrators in an area for 15 turns. + +### You find a golden crystal. It glows faintly. + +### You find a dull, gold-tinted crystal. + +### Save Loadout + +### Rubber Stick + +### A rubber cylinder without any lewd intentions whatsoever. + +### Deals grope damage. + +### You pick up a flexible rubber stick. + +### Blade of Ejahl + +### A piece of prized ancient equipment. Magical energy causes it to vibrate intensely. What could it have been used for? + +### Deals grope damage. Can spend 40 charge to add charm damage per hit for 10 turns. + +### You retrieve the Blade of Ejahl. + +### Intense Vibrations: The Blade of Ejahl deals bonus charm damage!!! + +### The Blade of Fla-peh buzzes with great power! + +### 40 charge to deal 30 charm damage per hit for 10 turns. + +### Enchanted Rope + +### She who lives by the rope, is tied up by the rope. + +### Deals chain damage and applies 50 points of rope binding. Draws 10 mana per hit to apply 50 extra points of magical binding. If you don't have mana, you fail to control the rope... + +### You find some enchanted rope. + +### Without mana to control it, the enchanted rope springs back upon you! + +### Light Bow + +### Pointy stick delivery system. + +### Reload time: None. Deals crush damage on melee. Draws 10 charge and 20 stamina to fire an ordinary arrow, dealing 30 pierce damage. + +### You find a wooden bow. + +### 10 charge to fire an arrow. Deals 30 pierce damage. + +### Choose projectile path + +### Arrow + +### You loose an arrow! + +### Fire Arrows + +### Converts arrows to fire arrows for 30 extra charge, which deal the arrow damage plus 20 as fire damage in a 3x3 area and stuns briefly. + +### You switch to using fire arrows. + +### Fire Arrow + +### Vine Arrows + +### Converts arrows to all-natural organic versions for 20 extra charge, which apply 80 binding to the target and deal chain damage instead. + +### You switch to using vine arrows. + +### Vine Arrow + +### A sudden burst of vines overtakes you as you find yourself wrapped up tightly! + +### You find a bow and a glowing crystal. The bow is scribed with runes of duplication. + +### Crossbow + +### Watch where you're pointing that thing! + +### Reload time: 3 stationary turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 65 pierce damage. + +### You find a crossbow. + +### 20 charge to fire a bolt. Deals 65 pierce damage. + +### Bolt + +### You pull the trigger! + +### Your RestraintName melts off! + +### Your RestraintName melts faster with the application of fire! + +### Your RestraintName hardens with the application of frost! + +### dmg + +### AMNT Evasion + +### AMNT% Accuracy + +### AMNT Magic Armor + +### AMNT Physical Armor + +### AMNT Bondage Resist + +### AMNT TYPE Resist + +### AMNT% TYPE Damage + +### AMNT% weapon phys. dmg + +### AMNT% weapon magic dmg + +### Infuse weapon AMNT% TYPE + +### AMNT TYPE on attack + +### AMNT Mana Efficiency + +### AMNT TYPE Mana Efficiency + +### AMNT% regen from mana pool + +### AMNT mana pool on capture + +### AMNT% Visibility Reduction + +### AMNT Distraction Decay + +### AMNT Distraction Per Turn + +### AMNT AP from attacks + +### After attacking with a teasing weapon: + +### Gain AMNT% Spell Damage for DRTN turns + +### Drains mana from the wearer. + +### AMNT Stat + +### Drop On Floor + +### Remove + +### Struggle + +### Leyline Map + +### Harness Plug Gag + +### A gag meant to keep people quiet by forcing a plug into their mouth and securing it in place with a strict harness. + + + +### Your OLDITM transforms into NEWITM! + +### Your OLDITM gains new properties! + + + +### Moon-Cursed Epicenter + +### The cursed epicenter disperses into black stardust. + +### The cursed epicenter retreats as you remove the last of your cursed restraints! + +### The cursed epicenter retreats as you are claimed by something else! + +### The cursed epicenter assaults your mind with its presence! (DamageDealt) + +### You feel your cursed items turn cold to the touch! + +### An cursed collar appears around your neck, feeling cold to the touch. + +### Cursing Sigil + +### A cursing sigil appears on the ground! + +### You are being cursed!!! + +### Star-Cursed Epicenter + +### Moondust Collar + +### 'You thought you could run forever, didn't you? Fate has a way of always catching up to you...' + +### Cannot be removed while you are wearing other Star Cursed items. + +### Stardust Collar + +### The cursed seal on the RestraintName vanishes into a brief veil of stardust. + +### Take AMNT damage to weaken the curse. Excludes shadow, psychic, charm, or damage taken at 0 WP. + +### You struggle uselessly, sealed in your fate. + +### You feel your restraints starting to weaken... + +### The cursed collar falls off, awaiting its next victim... + +### You must remove all other Star Cursed items before removing the collar. + +### Transformation: Items with generic curses transform into Star Cursed items. + +### With a burst of dark energy, your OLDITM gains new properties! + +### With a burst of dark energy, your OLDITM transforms into a NEWITM! + +### Restoration: While distracted, your Star Cursed restraints regain strength. + +### With the rush of pleasure, you feel your cursed restraints tighten and strengthen! + +### Corruption: While in the shadows, you slowly gain corruption. + +### Your willpower gain and struggle power is less effective due to your corruption. + +### Seduction: Gain distraction after taking damage. + +### Taking damage fills your minds with cursed thoughts... + +### Having taken damage, your distraction is increasing... + +### Punishment: When you defeat an enemy, you are stunned briefly and enemies are attracted. + +### Dark Voice: You are supposed to be a slave! + +### Submission: At 0 WP, you are restrained if you leave the presence of a hostile. + +### Dark Voice: Kneel before your mistress. + +### You must submit! Moving away from an enemy at 0 WP will bind you! + +### Denial: -10 WP when you try to Let Go. At 0 WP you cannot orgasm. + +### Dark Voice: Not yet. + +### Dark Voice: Your squirming pleases us. + +### Dark Voice: It is not your choice to make~ + +### Dark Voice: You may enjoy yourself, for now~ + +### Dark Voice: Yes, take in the pleasure... + +### Dark Voice: Enjoy a gift, dear~ + +### As you let go of yourself, the Robe of Chastity loses all effects! + +### The magic in the Robe of Chastity fades... for now. + +### You have failed to keep the principles of the Paladins... for now. + +### You feel vibrations in your leotard as the magically conductive fabric channels your power. + +### Your leotard produces a tingling full-body sensation as it channels your magic! + +### A tingling sensation serves to remind you of your leotard's magic properties. + +### Star: -20 Charm/Psychic Resist + +### Star: +40 all other resists + +### Mithril Orb + +### Shining strings encircle your body! + +### Your cursed items have attracted a powerful cursed spirit! + +### The seal on your RESTRAINTNAME is weakening. + +### The fighter pouts and runs away! + +### The fighter knocks you to the ground and binds you! (+RestraintAdded) + +### The fighter strikes you with her weapon! (DamageTaken) + +### The fighter takes you down with the back of her weapon! (DamageTaken) + +### The fighter puts you in a hold and manages to slip on a lock! (DamageTaken) + +### The fighter vanishes and ends up behind you! + + + +### The fighter moans loudly and rolls around on the floor! + +### The fighter wraps her arms around you with bindings in hand! (+RestraintAdded) + +### The fighter pins you with her weapon and grabs your breast! (DamageTaken) + +### The fighter enchants her weapon and strikes you! (DamageTaken) + +### The fighter smiles lasciviously as she dangles a lock in front of you! (DamageTaken) + +### The fighter enchants her weapon and flies forward! + + + +### The fighter drops her weapon and admits defeat! + +### The fighter feints and strikes, slapping you with the flat of her blade! (DamageTaken) + +### The fighter proudly clicks on a lock! (DamageTaken) + +### The fighter briefly vanishes and ends up behind you! + +### The fighter falls on her knees and begs! + +### The fighter throws an enchanted binding ring at you! (+RestraintAdded) + +### The fighter throws her weapon at you! (DamageTaken) + +### Casting SPNME + +### The door suddenly locks behind you! + +### Apply To Target + +### Purify + + + +### You need to target an NPC + +### Target must be bindable and disabled. + +### Target acquired! + +### Truss em up! + +### Choose target to bind + +### Target Acquired! + +### Designates the target for bondage and allows you to apply items from the inventory. Can only be applied to entities that are willing or disabled. Some items require higher levels of incapacitation to be applied + +### The Shoppe + +### Journey Selection + +### High-Security Prison + +### Doll Sorting Station + +### A cursed NEWITM flies out of the chest and latches tightly to you! + +### With a puff of magic, a NEWITM appears on your body! + +### You draw upon chaotic energies, restoring mana! + +### You draw upon chaotic energies, but your mind is unable to hold back the arcane forces! + +### Your attempt to call upon chaotic energies fails. + +### You are already at max mana. + +### The vibrator holds at full power to drive you over the edge! + +### The weapon needs to be loaded to fire. + + + +### Recurve Bow + +### Curvy, just like its user. + +### Reload time: 1 turn. Deals crush damage on melee. Draws 14 charge and 35 stamina to fire an ordinary arrow, dealing 40 pierce damage. + +### You find a recurve bow. + +### 14 charge to fire an arrow. Deals 40 pierce damage. + +### Recurve Bow Arrow + +### You loose a strong arrow! + +### Longbow + +### Great for building both empires and muscle. + +### Reload time: 2 turns. Deals crush damage on melee. Draws 18 charge and 60 stamina to fire an ordinary arrow, dealing 60 pierce damage. + +### You find a huge longbow. + +### 18 charge to fire an arrow. Deals 60 pierce damage. + +### Longbow Arrow + +### You loose a mighty arrow! + +### Pistol Crossbow + +### Lethal. Sustainable. Portable. + +### Reload time: 3 turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 45 pierce damage. + +### You find a pistol crossbow. + +### 20 charge to fire a bolt. Deals 45 pierce damage. + +### Pistol Bolt + +### Arbalest + +### At this point why not just use a gun? + +### Reload time: 5 stationary turns. Deals crush damage on melee. Draws 25 charge and no stamina to fire an ordinary arrow, dealing 70 pierce damage, passing through units. + +### You find an arbalest. + +### 25 charge to fire a bolt. Deals 100 pierce damage. + +### Heavy Bolt + +### The RSTNME is removed as the lock comes off. + +### You save the key in your inventory for future use. + +### You pick up a simple key for the simplest of locks. + +### Simple Keys + +### You twirl the keys around your finger. + +### A handy key for getting out of common handcuffs and shackles. + +### It's not sophisticated enough to work on higher-quality locks, but can be used many times. + +### You twirl a key around your finger. + +### You twirl a magic key around your finger. Careful not to lose it! + +### You fidget with a lockpick. + + + +### You pick up a tool for picking disc detainer locks. + +### Disc Lock Tool + +### You examine the tool. It has a replaceable tip for picking disc detainer locks. + +### A handy tool for picking disc detainer locks, popularized by a certain pair of professionals. + +### Features a replaceable head in case an unskilled user breaks it. Requires lockpicks to use. + + + +### Magical Weapon + +### Your Submissiveness determines how easily your character can resist the temptations of bondage. + +### Your Security Level is based on your history, and reputation with the MNFCTN. + +### Your Passion determines how likely you are to lose control of yourself involuntarily. + +### Your Frustration affects how quickly your Passion grows. More Frustration = More Passion + +### Nivah, Goddess of Dragons + +### Minivir, Goddess of Alchemy + +### Akasha, Goddess of Magic + +### Oriel, Goddess of Technology + +### Ninril, Giver of Life + +### Matah, Architect of Reality + +### Aether, Keeper of the Cosmos + +### Oblivion, Keeper of Secrets + +### Arcane Energy is stored by casting spells, up to 100% Max mana. + +### Battle Rhythm is gained by spending stamina through attacks, up to 40 total. + +### Arcane Blast + +### When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. Casting this spell consumes it to deal up 25% Max Mana as Arcane damage. Pierces enemies and walls. + +### Your eyes glow as energy surges from within! + +### Critical Hit! + +### Super Critical! + +### Surprise Bondage! + +### Arcane Energy + +### Rhythm + +### You avoid the attack in a flurry of impressive maneuvers! + +### Arcane Barrier + +### When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. When enabled, slowly convert Arcane Energy into a shield at a 1:2 ratio. Max shield is equal to 10% Max Mana. + +### You sense that a high value target is near. + +### You push yourself beyond physical limits! + +### You try to push yourself beyond your capabilities and falter... + +### You are already at max stamina. + + + +### Did the Research + +### Unlocks advanced tooltips for enemies showing their weaknesses. Also improves hearing by a small amount. + +### Well-Placed Traps + +### Trap spells always critically strike. + +### Hard to Catch + +### Adjacent NPCs count as corners/hooks for purposes of escaping. After being restrained, escape speed and power is increased for 12 turns (escape power is increased by +20% plus 2% of Bondage Resist). Removed if you restrain yourself. + +### Struggling is improved and escape is quicker! + +### Akashic Conflux + +### Costs 100 Arcane Energy and refunds 100 Mana. Bringing memories to life, you call upon your magical knowledge to ignore arm, leg, and verbal spell components for 3 turns. + +### You can ignore Arm, Leg, and Verbal components! + +### Magical whisperings circle around you, enabling you to cast spells without components! + +### You don't have enough Arcane Energy. You need AMNT. + + + +### Chaotic Overflow + +### Draw upon 35 WP to ignore spell components for Duration turns and fully restore your mana. The energy is uncontrollable, so there will be consequences... + +### Chaotic energy flows through you!!! + +### You try to call forth the chaotic energy, but it isn't interested in you anymore... + +### You don't have enough Willpower. You need at least 25%. + +### You are already full of chaotic energy! + +### Chaotic energy overtakes you, crystallizing into physical form... + +### Chaotic energy flows through you! You have a bad feeling about this... + + + +### You find a shimmering macaron. + +### Heavenly Crunch Macaron + +### You feel holy energy neutralizing the cursed magic permanently. + +### Some say it comes from a bakery in heaven itself. Others say it is simply made from lab-grade materials, and actually tastes awful. + +### Purifies and unlocks a cursed item and/or removes all curses from one currently worn item of your choice. + +### Congratulations! Your continued patronage has earned you|one (1) round trip to the nearest affiliated shop!|Simply step into the portal to continue...|(the Goddess is not responsible for any mishaps or fraud pertaining to the use of this portal) + +### (You step through the portal. An unperturbed shopkeeper greets you.)|Another visitor? Oh, it's just you~ + +### (Enter the portal) + +### (It's the return portal) + +### (You step through the portal and return to your adventure) + +### Select a restraint to remove the curse from + +### You don't have any restraints that can be removed + +### As you are low on mana, you are unable to store Arcane Energy. + +### You are recharging your next mana cost reduction. + + + +### Fast Recharge I + +### Inner power now recharges after 10 turns instead of 16. + +### Fast Recharge II + +### Inner power now recharges after 6 turns instead of 16. + + + +### Precise Targeting + +### Your first critical hit on a target is 1.5x more powerful. + +### Surprise Bondage + +### Binding from critical hits is 40% stronger + +### High Profile + +### Several enemies on each map will be high value, rewarding more gold and items for defeating them but increasing their strength. + + + +### You apply the RSTR to the ENNME! (AMNT% bound) + +### You untie the ENNME! (AMNT% bound) + +### +AMNT Bondage! + +### TargetEnemy receives AMNT binding! + +### TargetEnemy is disabled and receives an increased AMNT binding! + +### TargetEnemy resists bondage and receives a reduced AMNT binding! + +### Target must be helpless. + +### You steal the target's disguise! + +### You remove your disguise. + +### You are already wearing that faction's disguise. + +### Steal Disguise + +### Choose target to steal from + +### Steal's a helpless enemy's clothes, adding a great deal of distraction to her and stealing her disguise for yourself. Until you recast this on yourself, you gain a stealth bonus against members of the same faction. + + + +### Unstoppable (Ignore status/bondage) + +### Unflinching (Resist status/bondage) + +### Relentless (Stun resist when stunned) + +### Bulwark (Blocks some explosions) + +### Blindsight (See through walls) + + + +### Mana Harvesting + +### Defeating or capturing a spellcaster-type enemy recovers 10 arcane energy, reduced to 1 for other humanoids. + +### A powerful wind pushes you away!!! + +### Staff of Ropes + +### An enchanted rope kept in check by a magical seal. Surely this won't backfire... + +### +20% rope bindings applied. Deals chain damage. Active: Spend 25 mana to unleash the ropes in a wide AoE. + +### You pick up a staff of ropes. Finally, a way to contain its power! + +### Staff of Belts + +### Belts within belts, a fractal belt pattern buckled into oblivion. + +### +20% leather bindings applied. Leather spells apply debuffs for 30% longer. Deals chain damage. Active: Pull an enemy toward you and apply a small amount of bondage. + +### You pick up a staff of belts wrapped tightly in leather. + +### Binding Lock + +### A LKTYP lock clasps on to one of your restraints! + +### You are caught in a constricting field! (Dmgdlt) + +### Resin Coating + +### A layer of transparent resin derived from Green Latex. Unlike other forms of latex, this one is solid and fixes you in place. + +### It's like you're an art piece! If only you had some way to blast it off... + +### You hear a motor whirring... + +### A bubble of latex surrounds you and inflates, sealing you in! + +### A bubble of latex envelops you! + +### A ball of latex surrounds you and inflates, sealing around your neck! + +### A ball of latex envelops you! + +### The latex around you dampens your attacks, reducing physical damage by 30% and lowering your sight range. + +### Latex Ball + +### ...Lab Assistant? + +### You rescue the lab assistant. + +### The assistant restrains you! (+RestraintAdded) + +### The assistant gropes you playfully! (DamageTaken) + +### The assistant applies a lock! (DamageTaken) + +### The assistant splashes a solvent in your face, blinding you! (DamageTaken) + +### ...Glue Technician? + +### You rescue the glue technician. + +### The technician slaps adhesive restraints onto your body! (+RestraintAdded) + +### The technician polishes your restraints thoroughly! (DamageTaken) + +### The technician pours glue on you to make you stay still! (DamageTaken) + +### The technician inspects your restraints and adds a lock to spec! (DamageTaken) + + + +### Lab Assistant + +### The assistant envelops herself in her own bubble for protection. + +### Glue Bomb + +### Glue Technician + +### The technician trips and glues herself to the floor. + +### Quite sticky, innit? + +### Bow: This is a ranged weapon with a weapon ability. + +### Magic: Ignores evasion of ghost type enemies, can be used with abilities that require magic weapons. + +### Light: Can be used to cut even with bound arms. 50% reduced accuracy penalty from being bound. Can be held in mouth. + +### Offhand + +### Offhand: This weapon can be dual-wielded by some classes. + +### 2 Handed + +### 2 Handed: While wielding this as your primary weapon, you cannot wield an offhand weapon. Also this weapon can't be used while arms are tied. + +### Magical Focus + +### Magical Focus: Instead of losing accuracy, the stamina cost is increased when distracted. + +### Precision + +### Precision: Your arms need to be free to use this weapon. + +### Hands-Free + +### Hands-Free: Weapon can be used without free hands. + +### Shield + +### Shield: This weapon is intended for defensive use. + +### Heavy: This weapon takes +1 turns to switch to. Cannot be reduced to 0 by perks or upgrades. + +### Massive + +### Massive: This weapon either stuns or slows you after attacking with it. Handle with care! + +### Illumination + +### Illumination: This weapon is a light source. + +### Dual Wield + +### Designate an Offhand weapon to gain passive effects such as a light source, armor, or extra crit damage.|(Must equip Dual Wield spell to equip an offhand weapon) + +### Equip Offhand + +### Remove Offhand + +### Make a ranged attack with the spear. + +### Make a ranged attack with the pike. + +Ranged Attack +원거리 공격 + + +### Combat Training + +### Your training has granted a number of bonuses:|-Weapon stamina cost is reduced by 1% per 10 current WP, up to a max of 40%.|-Slow effects wear off more quickly.|-While you are above 0 WP you gain 1 slow resist. + +### This is your current offhand weapon. + +### You are unable to wield this weapon offhand at the moment. + +### This is your previously held weapon. Click to switch to it. + +### You can't hold the WPN in your current state. + +### Charge! + +### Dash and make an attack attack against a target within 2 tiles. If it deals 20% of their current hp in damage, you knock them back and take their place, otherwise they take +15% max hp crush damage from hitting the wall. If the attack misses, you still dash. Costs stamina equal to your sprint cost plus your attack cost. + +### You charge at the target! + +### You need to target an enemy. + +### You don't have enough stamina. + +### You need to be able to sprint. + +### You need to be able to attack. + +### There is no room to dash! + +### Tools of the Trade + +### Allows you to craft bombs, smoke bombs, flash bombs, and invisibility potions. + +### (You start having crafty thoughts...)|(Gunpowder can be obtained from chests or Alchemists)|(Ectoplasm can be obtained from ghosts) + +### (You craft a Smoke Bomb) + +### (You craft 3 Flash Bombs) + +### (You craft a Bomb) + +### (You craft an Invisibility Potion) + +### (You don't have the required material) + +### (Use 1 Gunpowder to make a Smoke Bomb) + +### (Use 1 Gunpowder and one Ancient Crystal to make 3 Flash Bombs) + +### (Use 2 Gunpowder to make a Bomb) + +### (Use 3 Ectoplasm to make an Invisibility Potion) + +### Gunpowder + +### You toss some gunpowder on the floor! No picking it back up now... + +### Highly flammable. Do not eat. + +### Creates gunpowder tiles on the target area, which can be ignited. + +### You pick up a sack of gunpowder. + +### You toss some gunpowder on the floor! + +### Dual Wield (Rogue) + +### Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or extra crit damage.|Rogues cannot wield heavy or massive weapons in the offhand unless they are multiclass.|(Equip Dual Wield spell to equip an offhand weapon, or use the Items menu) + +### Dual Wield (Wizard) + +### Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or spell damage bonuses.|Wizards can only wield magic weapons in the offhand unless they are multiclass, and receive +1 slow level if they wield a 2-handed, heavy, or massive magical weapon in the offhand.|(Must equip Dual Wield spell to equip an offhand weapon) + +### Arcane Tome + +### Contains advanced formulas and thrilling tales of thirsty wizards. Can not critically strike. + +### +5% magic damage. Offhand: Applies passive bonus. + +### You find a magical tome. + +### Open the book. What can go wrong? + +### Contains a malevolent spirit that wishes only to tie up damsels. Can not critically strike. + +### +10% binding effectiveness. Offhand: Applies passive bonus. + +### You find a magical tome with a sealed padlock on it. + +### You know the location of ancient leylines and can draw upon 100 additional mana. + +### You don't want to open the book... (need willpower) + +### Chain Spirit + +### You open the book and suddenly a binding aura surrounds you! + +### Mathematical Error + +### You open the book to an unfinished page and the magic ink short-circuits! + +### Cracks begin to form in your RestraintName! + +### Your RestraintName shatters and falls off! + +### Load Hotbar + +### Save Hotbar + +### Clear Hotbar + +### Confirm clearing hotbar? + +### Add to Hotbar + +### Surrender: Your willpower is 0, giving huge penalties to struggling, Block, Evasion, and Bondage Resist. + +### Unbound Keybindings! --> + +### You've not enough keys!!! --> + +### Update your Keybindings!!! --> + +### I have altered the keybindings. Pray I do not alter them further. + +### Barricade + +### You knock over the barricade! + +### Anti-Damsel Barrier + +### You disable the barrier! + +### Barrier + +### You shatter the barrier! + +### Magical Barrier + +### You destroy the barrier! + +### Mass of Shadow Hands + +### You banish the shadow hands! + +### The shadow hands caress you and latch on! (DamageTaken) + +### The shadow hands caress you and latch on! (+RestraintAdded) + +### Shadow Chains + +### You break through the chains! + +### Conjured Chains + +### Magic Damage + +### Physical Damage + +### Special Ability + +### Ranged + +### Staff + +### Toy + +### Teasing + +### A rope trap springs upon you! + +### A ribbon trap springs upon you! + +### A chain trap springs upon you! + +### Magical vines wrap around you suddenly! + +### A belt trap springs upon you! + +### You find yourself suddenly bound tightly by magic gear! + +### Magical rubber emerges from the floor and encases you! + +### Slime appears at your feet and starts encasing you! + +### You find yourself suddenly bound tightly in latex gear! + +### A rubber cube rushes out of the floor and engulfs you! + +### Sharp Claws + +### While your hands aren't covered, your attacks deal 10 bonus slash damage on hit and you can cut restraints. + +### Powerful Bite + +### Gain access to the Bite spell. + +### Slime Girl + +### You are a shapeshifting slime, granting +100 Glue Resist and can squeeze thru bars. Escaping is easy, but your powers are sealed while wearing cursed or magic restraints. + +### Cybernetic + +### You have mechanical parts, granting +10 Physical Armor, +15 Block, and +10% base physical damage. -100 Electric Resist. + +### Magic Blood + +### You come from a magical lineage, granting +10 Magic Armor and +10% magic damage. + +### Beast Girl + +### You have animalistic features such as a bite spell, -10% attack stamina cost, and 10 slash damage on hit while hands are free. -100 Charm Resist. + +### Demon Girl + +### You are related to eldritch entities, granting +50% shadow damage and the ability to teleport between shadows. You are weak to holy restraints and bright light. + +### You are a minor angel sent to perform a specific task. You are forced to wear a full set of divine restraints, but gain an infinite mana pool, +20 Magic Armor, and +25% magic damage. + +### Elven Ancestry + +### You were blessed with immortality by Ninril, Goddess of Restoration, granting -50% sprint cost and -30 Physical Resist. While your WP is above 0, you regenerate WP and heal nearby allies. + +### Bast's Blessing + +### You were granted undead immortality by Bast, granting a bite, claws, catlike senses, and stamina regen scaling with your current WP. Your WP gain is halved and you get -100 Fire Resist. + + + +### Minefield + +### Booby traps set by enemies are much more common. + +### Fortified + +### Barricades set up by enemies do not expire, and enemies set them up even when not alerted. + + + +### Pass thru helpless allies + +### Pass thru helpless enemies + +### Pass thru neutrals + +### Pass thru summons + +### Pass thru shopkeepers + +### Pass thru special NPCs + +### Stop when enemies are first sighted + +### Suppress during combat + +### Step during combat + +### 0.1s/turn + +### 1.5s/turn + +### 0.5s/turn + +### 0.01s/turn + +### Shadowy Grasp + + + +### Magical Tornado + +### The tornado blasts you with powerful winds! (DamageTaken) + +### You dispel the tornado! + +### Shield of Flame + +### You dispel the shield! + +### Overgrowth + +### You cut through the overgrowth! + +### Wall of Water + +### You dispel the water wall! + +### Ice Spikes + +### You break through the ice! + +### Earth Monoliths + +### You shatter the monoliths! + +### Gravitational Pull + +### The earth emits a deep hum below your feet... + +### Electrified Sphere + +### You smash the electrified sphere! + +### A bolt of lightning arcs to you! (DamageTaken) + +### Earth Keeper + +### The earth keeper sinks into the wall. + +### The earth keeper conjures restraints on your body! (+RestraintAdded) + +### The earth keeper locks a restraint! + +### The earth keeper knocks you away with a powerful kick! + +### The earth keeper massages you gently! (DamageTaken) + +### The earth keeper knocks you away with a strong kick! (DamageTaken) + +### Flame Keeper + +### The flame keeper steps away into a fiery portal. + +### The flame keeper grabs you, and volcanic restraints emerge from her armor! (+RestraintAdded) + +### The flame keeper locks a restraint! + +### The flame keeper flanks you! + +### The flame keeper offers a painful caress! (DamageTaken) + +### The flame keeper rides forth on a wave of fire! + +### Smoldering Trail + +### Fiery Greatsword + + + +### Tangling Vines + +### Enchanted Bubble + +### A bubble of magic water starts forming around you! + +### The gap in the bubble closes, and you are fully sealed within the bubble! + +### Magical water reduces your accuracy and slows you significantly! + +### You attack twice! + +### You gain a free move from Combat Maneuvers! + +### Access denied. + +### Facility is under lockdown. + +### Please scan ID to continue. + +### Security Door + +### You break through the security door! + +### High Security Door + +### You knock down the security door! + +### Blast Door + +### You knock down the blast door! + +### You sell the ITM for VLU gp. + +### You sell #x ITM for VLU gp. + + + +### Directional Vision + +### Your vision is reduced except in the direction you are facing. + +### Inertia + +### Turning 180 degrees while moving requires an extra turn + +### Heavy Inertia + +### Turning 90 degrees while moving requires an extra turn + +### You turn. + +### You turn around. + +### Take Command + +### Unlocks several spells for commanding allies. + +### Attention! + +### Select allies in an area + +### Designate allies in a 3x3 area to follow orders. + +### You select the units. + +### Deselect + +### Deselect allies in a 3x3 area + +### You deselect the units. + +### Toggle Selection + +### Select ally + +### Toggle an allied unit's selection status. + +### You toggle the unit's selection. + +### Maneuver + +### Select target location + +### Order all selected units to move to the targeted point. + +### You order your units to move! + +### Hold Position + +### Selected units do not pursue enemies. + +### Free Movement + +### Cancels Hold Position on selected units. + +### Deselect All + +### Deselects all selected units. + +### On Me! + +### All selected units start following you + +### Disperse + +### All selected units stop following you + +### Defensive Order + +### All selected units switch to Defensive mode + +### Aggressive Order + +### All selected units switch to Aggressive mode + + + +### Unlock using magic + +### Include Weapons + +### Merge Armor + + + +### The NPC does not have enough money left! + +### You order the ENMY to come to you. + +### You order the ENMY to disperse. + +### You deselect all allies and select only the ENMY. + +### You remove the ENMY from your party. + +### Anti-Magic + +### Long ago, war raged across the globe.|Countless lives were lost fighting over pieces of rock in a vast ocean.|People turned to science, religion, and magic, anything to escape this cruel fate. + +### Then the archmagus, Sariel Vinlaga, discovered the secret of immortality.|Sharing her research across the globe, she laid the groundwork for an era of peace.|A great civilization arose, where magic and technology flourished. + +### But in the end, Sariel's experiments left her weakened and unable to save herself from death.|Without a leader, the Old Civilization collapsed into tyranny as warlords enslaved thousands.|Refugees fled across the sea in search of a new life, and in time the old empire was forgotten. + +### Hundreds of years later, a group of adventurers found a lost island full of ancient technology.|Countless visitors now flock to the ruins in search of wealth and wisdom...|...Unaware of the devious secrets sealed within long ago. + +### An item has increased your spell damage! + +### AMNT ice damage/turn vs. Frozen + +### AMNT shadow bleed (10 turns) + +### Sealing Talisman + +### You were hit by one of Fuuka's talismans. Fuuka's magic begins sealing your power! + +### You were hit by one of Fuuka's talismans. Fuuka's magic makes you sluggish!! + +### You were hit by one of Fuuka's talismans. Fuuka's magic renders you helpless!!! + +### You were hit by one of Fuuka's talisman projectiles. Fuuka's magic is restricting you! + +### Sealing Shadows + +### Shadowy magic is restricting you! + +### A powerful seal holds you in place temporarily!!! + +### You lock yourself in magical locks! + +### A collar module comes off with the collar! + +### Shock Module + +### A sinister device used to keep unruly wolfgirls in check. + +### If it works on them, it sure as heck works on you. It has a warning label that says: 'CAUTION: NOT WATERPROOF' + +### Tracking Module + +### A homing device used to track unruly pets that wander too far. + +### It has a warning label that says: 'CAUTION: NOT WATERPROOF' + +### Your RestraintName stops working due to water damage! + +### Your RestraintName sustains water damage from the high-pressure water! + +### The RestraintName fizzles out! + +### Your RestraintName short-circuits briefly from the electrical damage! + +### Quit Game + +### Your RSTRNT glows and its seal vanishes as the shrine's energy fills the air. + +### The seal on your RESTRAINTNAME weakens as you simmer just below the edge. + +### Through your determination, you suprress the seal on your RESTRAINTNAME!!! + +### The seal on your RESTRAINTNAME weakens as you maintain your composure. + +### Through your determination, you suprress the seal on your RESTRAINTNAME. + +### You lose focus and the seal on your RESTRAINTNAME strengthens! + +### The item refuses to budge as you try to take it off. + +### The item bears a seal of dark pleasure. You can suppress it by edging yourself. + + + +### Saved Outfits + +### Manage this Outfit + +### Change Pose + +### Quick Color Palette + +### Item Color + +### Item Catalog + +### Layers: + +### Hex Code: + +### Toggle Struggle UI Mode + +### Change Character Pose + +### Make Bullets Transparent + +### X-Ray Vision + +### Show Quick Inventory + +### Skip Tutorial + +### Mod Compat Mode (requires reload) + +### Welcome to Kinky Dungeon! It looks like this is your first time,|Would you like a brief walkthrough of the interface? + +### (Leave and Disable Tutorial) + +### (Yes Please!) + +### (It'd like a hands-on lesson) + +### Sure! I can lead you through some excercises in a safe and controlled environment.|This way you can figure things out at your own pace.|To start, choose one of the lessons below: + +### (Give me some rope lessons) + +### (Give me a nice leather outfit) + +### (I enjoy the cold embrace of steel) + +### (I love rubber!) + +### (On second thought, maybe not) + +### (About that hands-on lesson...) + +### This is you.|Over the course of the game, you will probably get tied up.|The controls to escape are located over your character.|Simply hover the mouse over your character to see them. + +### There are four main ways to escape restraints:|Struggling, which is effective against flexible and weaker restraints,|Cutting, which depends on your held weapon and the item's properties,|Unbuckle/Untying, which depends on having free hands,|And Unlocking, which is required before you can Unbuckle. + +### These are options for how to display your character.|You don't have to worry about them for now,|but when your character is tied up you may find them useful|...or enjoyable. + +### This is the buffs bar.|It shows various values and buffs relating to your character.|You can click the gold triangle to expand it,|Showing additional info about your character. + +### These are the action buttons.|You can use them to perform various actions like closing doors or sprinting.|You can also toggle various settings such as automatically passing|through allies or auto-pathing when there are no enemies nearby.|You can also swap between recently used weapons. + +### These are various submenus.|Your Inventory is used to brows items and use or equip them.|The Journal contains lore, notes, and hints gathered along your journey.|The Journal also contains info on available quests,|and your reputation with various factions. + +### This is the status bar, which gives info on your base stats.|Distraction determines how easy it is to cast spells and resist teasing.|Stamina is required to sprint and attack with a weapon.|Mana is used to cast spells. You have what is called a 'Mana Pool,'|which is excess mana that slowly refills you mana bar until it runs out.|Finally, running out of Willpower makes it much harder to escape bondage. + +### This is the hotbar.|Here you will find various spells and customizable actions.|You can customize it through the Spells submenu by clicking on a spell.|You can also add items, armor, and consumables to it from the Inventory. + +### Finally, this is where the message log will be.|It provides a written record of what happened the last few turns.|You can click the 'Log' button to expand the log,|Allowing you to look much further back. + +### Thats it for the UI.|If you want a more hands on tutorial, enter the portal to the top right,|near the training dummies.|You can click on NPCs (such as the ghosts in this room) to talk to them. + +### Game + + + +### Search ITMNS: + +### Search Items: + +### Search Spells: + +### Free + +### Disarmed!!! + +### Show Buffs and Stats + + + +### Remove Devotion + +### Devote Yourself + +### Pray for Assistance + +### This shrine bears a request carved in stone: + +### Accept the Quest + +### You accept the goddess' quest. + +### You cannot accept that quest right now. + +### Removes your devotion from this goddess. + +### You are not devoted to this goddess. + +### Guarantees a quest from this goddess on every floor. + +### You are already a devotee of this goddess. + +### Offer gold in exchange for help. Destroys the shrine. + +### Ask for help without offering gold. + +### You have already prayed at this shrine. + +### Listen to what the Goddess asks of you. + +### Accept the Goddess' quest. + +### Drink the mana in the shrine. Can be done once. + +### Bottle the mana in the shrine for later. Can be done once. + +### Cancel Quest + +### Cancels the quest. You will not be penalized. + +### You can't cancel this quest. + +### You have no quests currently. + +### A new quest has been added to your Journal. + +### Find the dressmaker's prized dress and wear it in front of her. + +### Rescue the bandit from false imprisonment. + +### Teach some unruly maids a lesson. + +### Defeat a rebel leader and show them their place. + +### Help the student acquire a scroll! + +### You are being chased by a band of relentless poachers. + +### Slay the Rope Kraken. + +### You did not do your quest! The Goddess has decided to punish you. + +### You have pleased the Goddess. + +### The Goddess calls you a good girl. + +### Rescue some alchemists from their own experiment. + +### Stop rebels from making a pact with primordial beings. + +### Decommission some malfunctioning drones. + +### Resolve a dispute between elves and catgirls by tying up both sides. + +### Repel a planar incursion by a dangerous demon. + +### Stop some witches from performing a dubious summoning ritual. + +### Defeat a congregation of the Shadow Clan. + + + +### The Goddess grants you knowledge of SpellLearned! + +### You Goddess grants you +AMOUNT spell points! + +### The Goddess bestows a WeaponAcquired on you! + +### The Goddess grants you a ArmorAcquired! + +### The Goddess gives you a heavenly pastry. + +### The Goddess awards you an ancient key of great importance. + +### Game Setup + +### Challenge Settings + + + +### Challenge Settings: + +### Advanced + +### Expert Tools + +### Exits locked!|Find NUMBER keys! + +### Got the keys! + +### Find the keys hidden in the level. Enemies can steal the keys if you aren't careful. + +### There seems to be a locked high-security door. Looks like you need keys to open it. + +### Exits locked!|Find a lever! + +### Exits unlocked! + +### Lever Hunt + +### Find the lever hidden in the level to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to pull a lever to open it. + +### Exits locked!|Find control panel! + +### Panel Hunt + +### Find the control panel hidden in the level to unlock the door. + +### There seems to be a locked high-security door. Looks like you need find a control panel to open it. + +### BOSS ROOM + +### BOSS ROOM CLEARED! + +### Boss + +### Defeat the boss to unlock the door. You can also unlock it by losing to the boss and being penalized. + +### There seems to be a locked high-security door. Looks like you need to defeat the boss to open it. + +### Exits locked!|Defeat NUMBER TYPE! + +### Quota Reached! + +### Bounty + +### Defeat the specified targets to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to defeat the targetted enemies to open it. + +### Exits locked!|Defeat TYPE! + +### Miniboss defeated! + +### Dangerous Bounty + +### Defeat the specified strong enemy to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to defeat the miniboss to open it. + +### Exits locked!|Open NUMBER Chests! + +### Chest Hunt + +### Unlock the specified number of chests to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to open more chests to open it. + +### Exits locked!|Accept NUMBER Quests! + +### Quest Hunt + +### Accept the specified number of goddess quests to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to accept more quests to open it. + +### Exits locked!|Trigger NUMBER Traps! + +### Trap Hunt + +### Trigger the specified number of traps to unlock the door. + +### There seems to be a locked high-security door. Looks like you need to trigger more traps to open it. + +### Room bugged. Please Report. + +### This door failed to load and cannot be opened. Please report this bug to Ada with a save code. + + + +### Exit sealed!|Find the lair! + +### Sigils erased! + +### Dragon defeated! + +### Draconic Seal + +### A dragon has sealed the entrance. Defeat the dragon, or erase the sigil from her lair. + +### A draconic spell keeps the door sealed. You will have to confront its owner. + + + +### Exits locked!|Destroy NUMBER Servers! + +### Security System Compromised! + +### Clearance Granted! + +### Destroy Nevermere Servers + +### Destroy Nevermere servers to unlock the door. + +### Nevermere Inc. placed a computerized lock on the door. Destroy the security servers to pass. + +### Nevermere Server + +### Server smashed! + +### Destroy Drone Servers + +### Destroy Drone Node Servers to unlock the door. + +### The path forward is controlled by several ancient Drone Servers. Destroy them. + +### Drone Server Node + +### Drone node destroyed! + +### Rusty Server Node + +### loud beeping... + +### (Cursed) + +### (Purified) + +### of Agility + +### Precise + +### Silent + +### Blizzard + +### of Warding + +### of Freedom + +### of Resistance + +### of Power + +### Entuned + +### Draining + +### of Echoes + +### Infused + +### Explosive + +### Flaming + +### Focusing + +### of Empowerment + +### of Destruction + + + +### Phase Dance + +### For 4 turns, your movement does not advance time. Attacking or casting counts as one move and passes time as normal. + +### You are F A S T + +### Double Accel + +### Slow down time by 1/2 for 10 turns (world time). Stamina regens 50% slower. + +### Time is slowed by 2x + +### Triple Accel + +### Slow down time by 1/3 for 10 turns (world time). Stamina regens 75% slower. + +### Time is slowed by 3x + +### Quad Accel + +### Slow down time by 1/4 for 10 turns (world time). Stamina does not regen. + +### Time is slowed by 4x + +### Total Accel + +### Stop time 10 turns (world time). Stamina does not regen. + +### Time has come to a halt... + +### Time slows down by 2x! + +### Double Accel! + +### Time slows down by 3x! + +### Triple Accel! + +### Time slows down by 4x! + +### Quad Accel! + +### Time has ceased to pass. + +### Total Accel! + +### You begin to move at lightning speed! + +### ACCEL BEGIN! + +### Not enough mana. + +### You need to free your legs. + + + +### Swap + +### Choose a target with a clear line of sight to you and switch places with them. + +### You point at the target and swap places with them! + +### You point at the target and try tp swap places, but they resist! + +### You point at the target and try tp swap places, but they resist and the spell fails! + +### Choose target to swap with + +### The ENMY blocked your attack, negating it entirely! + +### The ENMY blocked your attack, reducing the damage by PCNT%! + +### The ENMY remains unscathed after putting up a strong defense! + +### The ENMY puts up surprising resistance, reducing the damage by PCNT%. + +### no damage + + + +### Raise Defenses + +### Spend 90 stamina to shield yourself from damage equal to your Block. Lasts 10 turns or until you attack. + +### Evasive Maneuvers + +### While active, you evade almost all attacks, but your stamina is drained by 50 per turn plus 10 per slow level. The base stamina cost is reduced by your Evasion. + +### Break Free + +### Consume 20 Battle Rhythm to increase escape power by +20% plus 1% of Bondage Resist. Lasts 60 turns or until your willpower reaches 0. + +### Problem Solving + +### While active, struggling takes an additional 10 turns, but escape power bonuses from tools and buffs is increased by +(25 + 20% Bondage Resist)% + + + +### You run out of strength to keep dodging... + +### You can't muster the strength to dodge right now... + +### You prepare to dodge!!! + +### Your expertise and skill provides you with additional tool effectiveness! (+AMOUNT%) + +### You raise your defences! + +### Your defenses are raised! + + + +### You don't have the will to break free. + +### You don't have enough Battle Rhythm. You need 20. + +### You channel your fighting spirit into your desire for freedom! + +### Your struggle power is greatly increased!!! + +### The teleportation partially succeeds due to an obstruction, placing you near the intended point. + +### The teleportation fizzles due to obstruction. + +### Confirm + +### Confirm and OVERWRITE SAVE + +### What is your name? + +### Enrage + +### Scream loudly, causing nearby enemies to investigate and increasing Battle Rhythm by 10. Has a 100 turn cooldown. + +### You shout loudly and shake your fist at the sky! (+10 BR) + +### Mmmph! (You can't shout while gagged) + +### You are plenty mad enough as is. + +### You are too tired to rage. Perhaps try a warm cozy bed instead? + +### turns + +### Your shield absorbed AMNT damage. + +### You are currently shielded from damage and some spells. + +### No offhand weapon set. Activate the spell in your hotbar to set one. + + + +### Flash Portal + +### After channeling for 2 turns, teleport to a nearby location (including into darkness). All adjacent creatures are teleported with you, in random order. + +### You call upon a misty portal to transport you and nearby creatures! + +### Transportation Portal + +### After channeling for 3 turns, teleport to a nearby location (including into darkness). Transports only allies, but they are stunned for the duration. + +### You call upon a misty portal to transport you and your allies! + +### Banishing Portal + +### After channeling for 3 turns, teleport all adjacent creatures to a point you can see. Does not teleport yourself. + +### You call upon a misty portal to transport those around you! + +### Rift + +### Tearing a rift in space, you teleport to a location (including into darkness). Leaves behind a rift for 4 turns, which enemies can follow you through. + +### You tear open a hole in space and step through! + +### Shadow Dance + +### While standing in a shadowed location, you can teleport to a nearby shadowed location. You can also teleport adjacent to shadow creatures. + +### You slip between the shadows... + +### Choose a shadow + +### Teleportation Circle A + +### When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. When learned, unlocks teleportation circle B and C as well. + +### You begin a teleportation ritual... + +### Choose a location to put a teleportation circle, or yourself to teleport to the created circle. + +### Teleportation Circle B + +### When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. + +### Teleportation Circle C + + + +### Nature Spirit + +### The nature spirit returns to the earth from whence it came. + +### Vine Bolt + + + +### Gunslinger + +### Weapons abilities and other abilities that cost charge contribute 20% of their cost to Battle Rhythm. + +### Effortless Assault + +### Weapon stamina cost is reduced by a percentage equal to your Battle Rhythm. + +### +50 Evasion from using Phase + +### Blade Dance + +### Costs 60 stamina to dash to an adjacent spot. If you are holding a physical weapon, deals cleave damage to nearby enemies equal to 50% weapon damage. If you have a Light offhand weapon, deal 75% of its damage as well. + +### You spin towards a location, slashing at nearby enemies! + +### The Shadow Within + +### Shadow Dance no longer requires you to be in shadow in order to dash to another shadow, but the mana cost is doubled when doing so. + + + +### Summon Holy Orb + +### Select where to put the holy orb (cannot place on occupied squares) + +### Create a stationary holy orb that lasts indefinitely and heals allies. It also fires blinding bolts at enemies within its aura. If you let go of yourself near a holy orb you are immediately punished. Should not be placed within 8 tiles of each other. + +### A holy orb descends, blessing you with its roundness. + +### You call upon the root of all enlightenment! + +### Holy Orb + +### The holy orb returns to its place in the sky. + +### Holy Bolt + +### The holy orb observes your lack of discipline, and issues a punishment. + + + +### Divine Chastity Belt + +### A chastity belt forged in holy light. Only a Goddess' will can release you. + +### There is no way even an angel can free herself. Its divine aura causes vibrators to cease right before you go over the edge. + +### Your Divine Chastity Belt causes the vibrators to stop. + + + +### A chastity belt forged in holy light. Only the will of a Goddess will release you! + +### You find a heavenly chastity belt. Who could it be for? + +### Divine Chastity Bra + +### A chastity bra forged in holy light. Only a Goddess' will can release you. + +### There is no way even an angel can free herself. Its divine aura prevents you from pleasuring yourself. + +### Your Divine Chastity Bra causes your whole body to go numb. + +### A chastity bra forged in holy light. Only the will of a Goddess will release you! + +### You find a heavenly chastity bra. Who could it be for? + +### Heavenly Chastity Belt + +### There is no way even an angel can free herself. Its divine aura causes vibrators to dampen right before you go over the edge. + +### Your Divine Chastity Belt magically dampens the vibrations just enough to edge you. + + + +### Heavenly Chastity Bra + +### There is no way even an angel can free herself. Its divine aura converts self-pleasure to stamina. + +### The divine aura drains the pleasure from your self-pleasuring and converts it to stamina. + + + + + +### Magic Arm Belts + +### Highly secure belts enchanted with magic. + +### Magic Leg Belts + +### Magic Ankle Belts + +### The Liquid Metal starts engulfing you! + +### The Liquid Metal explodes and covers you! + +### The Liquid Metal takes advantage of your status and engulfs you! + + + +### Silver Burst + +### Select a liquid metal tile + +### Target a liquid metal tile. After 3 turns, it erupts, spreading more liquid metal and engulfing any nearby creatures. Deals DamageDealt crush damage and applies 80 points of metallic binding. + +### A powerful explosion simmers beneath the surface...' + +### The ground shakes as a huge wall of liquid metal approaches! + +### Liquid Metal Cube + +### The liquid metal cube dissolves into a huge pile of glittering dust. + +### The liquid metal cube engulfs you and squeezes tightly! (DamageTaken) + +### The liquid metal cube engulfs your body and hardens, taking the form of restraints! (+RestraintAdded) + + + +### Skeleton Archer + +### Cursed Arrow + +### Because your hands are unavailable, you kick the target instead. + + + +### Your former owners are looking for you across the seven planes. + +### A local business is missing one of their models, and will stop at nothing to find her. + +### The Doll Shoppe + +### Elemental Slavers + +### Your duty as a maid is to keep the place clear of dirt and other hazards. + +### Dirt Pile + +### You clear out the dirt pile + +### A ENMY was lurking inside the dirt pile! + +### You skipped your duty and left some dirt missing in the last level! + +### The Dollmaker does not take no for an answer. + +### Fuuka's shrine maidens would like to have a word with you. + +### Your instructor will meet with you at regular intervals for further training. + +Hogtied! +사지 구속! +### Experience a comprehensive rope bondage experience. + + + +### Receive the following restraints: + +### You will be bound with some form of restraint. + + + +### Gag Geist + +### The gag geist goes silent. + +### The gag geist teases you playfully!! (DamageTaken) + +### The gag geist gags the girl with a ghastly grimace! (+RestraintAdded) + +### Poltergeist + +### The poltergeist goes silent. + +### The poltergeist gropes and teases you playfully, exhausting your stamina! (DamageTaken) + +### The poltergeist binds you with... something? (+RestraintAdded) + +### Invisible Gag + +### It's a gag, but invisible! + +### You wonder what color it is. + +### Invisible Blindfold + +### It's a blindfold, but invisible! + +### How exactly is this supposed to work? + +### Invisible Armbinder + +### It's an armbinder, but invisible! + +### Invisible Legbinder + +### It's an legbinder, but invisible! + +### This is starting to get cruel... + + + +### Strangely dressed zombies start approaching you!! + +### A floating chastity item appears and starts flying toward you! + +### You hear moaning as the statues start to move... + +### Devious tomes emerge from the bookshelves! + +### Armed mushrooms emerge from the ground to defend their home! + +### Playful ghosts slip through the walls, giggling to themselves! + +### Ancient drones drop from the ceiling and come to life! + +### You were always being watched... + +### You find a store of gunpowder! + +### Explosive Barrel + +### The explosive barrel falls apart and drops its gunpowder. + +### The explosive barrel catches fire and explodes! + +### The item demands copious mana, more than you can supply. You'll have to tie up a mage. + +### The cursed seal glows and pulsates as you struggle fruitlessly. + +### The curse has been lifted through judicious application of spellcasters. + +### The cursed item drains all of the caster's mana. It demands more. + + + +### Punishment Suit + +### A tool used by Nevermere on the most difficult and recalcitrant wolfgirls. + +### Designed to contain superhuman strength, struggling out of this would be a major feat. + +### Shield of (un)Clarity + +### Channel your clarity of mind into a powerful shield, filling your distraction bar completely and granting a temporary shield equal to 50% of the DP generated. 10% of the DP gained is gained as Desire, which prevents DP decaying below a certain point. + +### You form a... distracting mental barrier, shielding yourself for AMNT damage!!! + +### You are too distracted to form a mental barrier... + +### You have the mental clarity but not the magical clarity! (not enough mana) + +### You have formed a mental barrier... + + + +### Desire Burst + +### Overload Essence motes in an area, costing 10% max DP worth of Desire each. They explode, dealing (10 + 20% max DP) charm damage to enemies hit. If you don't have enough desire, the damage is reduced proportionally.||(Desire is the heart-shaped meter below your DP bar, and is gained slowly by being distracted) + +### You channel your distraction into the mote, overloading it! + +### You channel your distraction into the motes, overloading them! + +### You don't have enough of a desire to do that. + +### You must target at least one Essence Mote. + +### You have the desire but not the mana! + + + +### Your divine-locked restraints can only be removed by completing a shrine quest. + +### The Goddess hates you. That won't work. + + + +### Harvest + +### Requires a slashing weapon equipped. Activate to harvest all adjacent vine tiles, with a 25% chance per tile to obtain a seed.|Seeds can be planted to form gardens, which will grow in 100 turns to become vegetables, which can be eaten to restore WP or sold to the shopkeeper. + +### You twirl your weapon, harvesting AMNT seeds! + +### There is nothing to harvest. + +### Telekinesis 101 + +### Unlocks telekinetic abilities. Toggle on to equip weapons while bound, but at 0% accuracy. Learn Recover Object. + + + +### Recover Object + +### Use telekinesis to pick up items and open chests from a distance. Refunds 75% of mana cost if not used to open a chest. + +### The items float to you! + +### There's nothing to pick up. + +### The chest is locked. + +### Select a tile with items + + + +### Enhanced Recovery + +### Upcast to increase range and recover objects in an area. + +### That container is locked! + +### Select an area with items + + + +### Kinetic Slash + +### Swing an equipped weapon (not unarmed or hands free) in a line, slashing enemies in the way with 20 + 80% weapon damage. Counts as an attack. +10 mana cost if wielding a Heavy weapon. + +### You swing! + +### Choose where to swing (must not be unarmed or hands free weapon) + + + +### Kinetic Lance + +### Propel your weapon at devastating speed, piercing enemies for 30+160% Weapon Damage and dropping it at the end of the trajectory. Counts as an attack. +15 mana cost if wielding a Heavy weapon. + +### You propel your weapon forward! + +### Choose where to launch your weapon. + + + +### Sagitta + +### Fire a projectile. If this projectile hits an enemy, make one attack against an enemy for 10+40% weapon damage. +5 mana cost if wielding a Heavy weapon. + +### You unleash a deadly projectile! + +### Choose aim direction. + + + +### Sagitta Assault + +### After casting Sagitta, you can recast it up to three more times without advancing time. + +### Psychokinesis + +### You can ignore components for telekinetic spells, however spells generate distraction (based on mana cost) when cast this way due to the mental strain. Unable to use at 100% DP. + +### Kinetic Mastery + +### Negates the penalty for 2-handed weapons. Also gain the following effects:|-Kinetic spells and Sagitta cost 30% less while wielding a Light weapon.|-Kinetic spells and Sagitta gain +15 base damage when wielding a Heavy weapon. + +### Grasp + +### Cast on an enemy to snare them for 20 turns, or until you leave range/are incapacitated. Cast on a point to throw the grasped enemy in that direction, dealing 40 crush damage if they hit a wall or another enemy. + +### You grab the ENMY using telekinesis and hold them in place! + +### You throw the ENMY! + +### Choose a target or a location (if a target is currently grasped) + + + +### Perfect for a lifestyle of love and peace. + +### Deals crush damage. Stuns on critical. Ouch! + +### You pick up a particularly nice rock. + + + +### You pick up a device for snuffing out candles and torches. + +### Candle Snuffer + +### You put out the torch. + +### A handy device for putting out torches and lanterns. + +### But why would you want to do that? You hidin' something? + +### You find a bag full of sacks. Or is it a sack full of bags? + +### Recursive Bag + +### You cover the light source. + +### Bags inside a bag of bags inside a bag of bags + +### Can be placed over light sources to cover them. + +### The snuffer doesn't work on that light source. + +### The bag can't cover that light source. + +### You remove the bag from its light source and place it back inside your bag. + +### There. Now it's time to have some fun~ + +### How utterly helpless~ + +### Let's see how long you last. + +### I've got you! Now let's have some fun! + +### I think I'll help myself to you for a bit~ + +### Gosh, you're so cute like that! + +### I'm going to have to search you, miss~ + +### Let's check your restraints. + +### You look so cute like that, miss! + +### All nice and tight. Certainly no longer a threat~ + +### I'm going to make sure you're nice and tight~ + +### Surely nothing can happen now! + +### Rubber Elemental + +### The rubber elemental's restraints snap onto her and she falls over hogtied. + +### The rubber elemental molds itself into restraints! (+RestraintAdded) + +### The rubber elemental squeezes you with its appendages! (DamageTaken) + +### The rubber elemental forms rubber locks around all your restraints! (DamageTaken) + +### Your ropes are enchanted with a lesser spell! + +### Your ropes are enchanted with a magic spell! + +### Your ropes are enchanted with a powerful spell! + +### Your ropes are enchanted with a peerless spell! + + + +### Shibari Witch + +### The shibari witch blows a kiss and says goodbye. + +### The shibari witch ties you tight! (+RestraintAdded) + +### The witch rubs your body sensually! (DamageTaken) + +### The Shibari Witch takes your clothes off! + + + + + +### A Hard Place + +### While your willpower is 0, your mana pool slowly drains and your max stamina regen point is reduced by 30%. + +### The Spark of Magic + +### When your mana pool is exhausted, your attacks deal 50% reduced base damage. + + + + + +### Burned Out + +### Casting spells reduces willpower based on how little distraction you have, also you cannot play with yourself. + +### Winded + +### While below 10% stamina, evasion is severely reduced and your slow level is increased by 1. + +### Lost One + +### The being vanishes in front of you. + +### The being grabs you, causing your body parts to freeze in time!!! (DamageTaken) + +### The being has already bound you! (+RestraintAdded) + +### The Timekeeper + +### The Timekeeper releases her grip on the timeline. + +### The Timekeeper takes the time to enjoy herself with you... (DamageTaken) + +### The Timekeeper enacts judgement for disrupting time! (+RestraintAdded) + +### Analysis + +### You pick up a latex projector + +### Can't Touch That + +### When both arms and hands are severely bound, you can no longer pick up items without an ally nearby. + +### You can't pick that up without help. + +### Grounded + +### When arms are tied and feet are linked, you cannot get up from a kneeling position without help or a wall. + +### You take more time getting up due to your bindings. + +### You can't get up without help. + +### Your ally helps you back up. + +### You get back up using the corner. + +### You get up to your knees using the wall. + +### You're too tied up to close the door. + +### The chest opens on its own. + +### You can't use your hands for that, but you can crouch to use your mouth. + +### Heel Training + +### Start locked in a pair of heels with no heel training. + +### Gag Training + +### Start locked in a gag with no gag training. + +### Corset Training + +### Start locked in a corset with no corset training. + +### Sensory Training + +### Start locked in a blindfold and headphones with no Sensory training. + +### Hard to Master: Heels + +### Heel training is significantly slower. + +### Hard to Master: Gags + +### Gag training is significantly slower. + +### Hard to Master: Corsets + +### Corset training is significantly slower. + +### Hard to Master: Sensory + +### Sensory training is significantly slower. + +### Head Start: Heels + +### Start at Heel training level 5. + +### Head Start: Gags + +### Start at Gag training level 5. + +### Head Start: Corsets + +### Start at Corset training level 5. + +### Head Start: Sensory + +### Start at Sensory training level 5. + +### Classic Heels + +### Removes Heel Training and tripping mechanic. Restraining heels slow instead. + +### Trust Fall + +### Hides the balance meter while wearing heels and/or unsteady. + +### Poor Balance + +### You take longer to get up and are less skilled at wearing high heels. + +### Balance: AMNT% + +### Balance: AMNT% (Sprinting Disabled!!!) + +### You lose your balance and fall over!!! + +### Training Level: AMNT + +### Favorite + +### Unfavorite + +### Drop + +### Attach + +### Attached + +### Add to Quick Slot 1 + +### Add to Quick Slot 2 + +### Add to Quick Slot 3 + +### Add to Quick Slot 4 + +### Try to Cut + +### Struggle! + +### Try to Unlock + +### Add a Lock + +### Try to Remove + +### Try to Pick + +### Examine the Curse + +### Remove the Curse + +### Feed this to her + +### Sell for VLU gp + +### Sell ALL for VLU gp + +### Sell all but one for VLU gp + +### You feed the RSTR to the ENNME! (AMNT1/AMNT2 hp) + +### Choose a food item or willpower potion + +### Chain Rune + +### Ribbon Rune + +### Nature Rune + +### Belt Rune + +### Leather Rune + +### Latex Rune + +### Latex Cube Rune + +### Slime Bubble Rune + +### Bubble Rune + +### Spherical Rune + +### Ball Rune + +### Rubber Rune + +### Slime Rune + +### +AMNT gp + +### ENMY lets go of herself for AMNT damage! + +### Sonar + +### Emit a ping to highlight floors and tiles in a large radius. The ping is audible and attracts enemies to your position. + +### You emit a loud noise and listen for echoes... + +### Your mouth is too heavily stuffed! + +### You don't have the mana to cast Sonar! + +### The weights swing around and tug on your nipples! + + + +### More Kinky Furniture + +### Replaces 60% of cages with a different kind of kinky furniture such as display stands. + +### Collection + +### Storage + +### Management + +### You don't have anywhere to manage your prisoners! Yet... + +### Your collection is empty. Use binding attacks to tie up and capture damsels! + +### Personality + +### Switch + +### Bratty + +### Corrupted + +### Feral + +### Status + +### Guest + +### Servant + +### Manager + +### Opinion + +### Prisoner #NUMR/TTL + +### Guest #NUMR/TTL + + + +### Select a character to examine + +### Former Faction: + + + +### Miku + +### Nevermere + +### Bounty Hunter + +### Dressup Co. + +### Scholarly + +### Witch's Coven + +### Warden + +### Curse + +### Fungal + +### Bast + +### Elemental + +### Royal + +### Choose default outfit palette: + +### Auto Load Mods + +### SUSPICIOUS MOD DETECTED + +### The bright light hurts your dark-adjusted eyes! + +### Unconventional Warfare + +### Select a weapon to attach it to your body. You can have one attached weapon at a time. Attaching it takes 5 turns.|An attached weapon can be equipped without hands and maintains 60% accuracy as long as you have arms or legs unbound. + +### Guerilla Fighting + +### Light weapons can be wielded if you have your mouth free, at 75% accuracy. + + + +### Tough Armor (1/2 crit mult while aware) + +### Absolute Armor (1/2 crit mult) + +### Rename + +### Reset to NME + +### Enlarged View + +### Back to Game + + + +### Servants + +### Prisoners + +### Promote to Servant + +### Demote + +### Delete Guest + +### Really Delete Guest? + +### The ENMY tries to grab you! + +### The ENMY reaches out and gives your breast a squeeze! (DMGDLT) + +### The ENMY squeezes your breasts as you raise your arms for a spell! (DMGDLT) + +### The ENMY reaches for you and fails! + +### The ENMY gives your butt a light slap as you cast! (DMGDLT) + +### The ENMY gives your butt a good slap as you sprint past! (DMGDLT) + +### The ENMY tries to spank you but misses! + +### The ENMY gives your butt a squeeze! (DMGDLT) + +### The ENMY gives your butt a squeeze during your cast! (DMGDLT) + +### The ENMY gives your butt a squeeze from behind! (DMGDLT) + +### The ENMY gives your butt a squeeze as you pass by! (DMGDLT) + +### The ENMY reaches for you but misses! + +### The ENMY tickles your armpits! (DMGDLT) + +### The ENMY tickles under your raised arms! (DMGDLT) + +### The ENMY tries to tickle you! + +### The ENMY tickles your feet! (DMGDLT) + +### The ENMY takes off your shoes and tickles your feet! (DMGDLT) + +### The ENMY pats you gently on the head. (DMGDLT) + +### The ENMY pats you gently on the head as you fail your spell... (DMGDLT) + +### The ENMY tries to pat you on the head but decides not to. + +### The ENMY behind you gives your shoulders a nice massage! (DMGDLT) + +### The ENMY reaches for your shoulders but you slip free! + +### The ENMY calls you cute! (DMGDLT) + +### The ENMY blushes at your cuteness! + +### The ENMY makes fun of you! (DMGDLT) + +### The ENMY struggles to find words! + +### The ENMY buzzes you with her VTY! (DMGDLT) + +### The ENMY catches you and teases you with her VTY! (DMGDLT) + +### The ENMY reaches for her VTY! + +### The ENMY sticks a VTY into you! (DMGDLT) + +### The ENMY sticks a stuffing into your open mouth! (DMGDLT) + +### The ENMY reaches for your mouth and fails! + +### The ENMY takes advantage of the gag around your neck~ (DMGDLT) + +### The ENMY reaches for the gag around your neck! + +### The ENMY pulls your hands together and sticks a clip between them! (DMGDLT) + +### The ENMY grabs your wrists but you pull away! + +### The ENMY pulls your weapon away! + +### The ENMY tries to pull your weapon away but you maintain your grip! + +### The ENMY reaches for your inventory but can't quite reach it! + + + +### More Armbinders + +### Armbinders are favored over other heavy bondage. + +### Less Armbinders + +### Armbinders are less favored over other heavy bondage. + +### More Boxbinders + +### Boxbinders are favored over other heavy bondage. + +### Less Boxbinders + +### Boxbinders are less favored over other heavy bondage. + +### More Straitjackets + +### Straitjackets are favored over other heavy bondage. + +### Less Straitjackets + +### Straitjackets are less favored over other heavy bondage. + +### More Yokes + +### Yokes are favored over other heavy bondage. + +### Less Yokes + +### Yokes are less favored over other heavy bondage. + + + +### (blocked!) + +### (dodged!) + + + +### You crouch and move slowly. + +### Owned by: + +### Warden's Belt + +### You may go on your way, but only as long your freedom is useful to her. + +### A golden belt that enforces respect for the Goddesses. Breaking spell orbs results in a punishment. + +### Belt of Privilege + +### You've defeated the Warden, proving that you are worthy to take what you want. + +### A golden belt that marks you as a person of great import. -50% rep penalty for breaking orbs. + +### Sharpshooter + +### You teach the warden's servant a lesson. + +### The sharpshooter pulls your arms behind your back! (+RestraintAdded) + +### The sharpshooter takes advantage of your weakness and squeezes your breast! (DamageTaken) + +### The sharpshooter smiles and clicks a lock on you! (DamageTaken) + +### Gladiator + +### The gladiator puts you in a hold and binds you! (+RestraintAdded) + +### The gladiator chuckles as she spanks your butt! (DamageTaken) + +### The gladiator smiles and clicks a lock on you! (DamageTaken) + +### The magician conjures some restraints on you! (+RestraintAdded) + +### The magician summons tickling hands to tease you! (DamageTaken) + +### The magician conjures some locks on you! (DamageTaken) + +### The Warden + +### The Warden disappears into a trapdoor! + +### The Warden forces you to kneel, and presents you with a restraint! (+RestraintAdded) + +### The Warden whips you with a belt! (DamageTaken) + +### The Warden tosses some enchanted locks at you! (DamageTaken) + + + +### The Warden falls flat on the ground, exhausted! + +### The Warden strikes you with her whip! (DamageTaken) + +### The Warden swings her enchanted whip and conjures locks on your body! (DamageTaken) + + + + + + + +### (The Warden glances at you)|Oh? What do we have here?|An adventurer?|You're not in my records... + +### Cut to the chase. Do I have to fight you or not? + +### (She chuckles)|Oh my~|I hope your skills are on the same level as your attitude.|I don't have time for mere troublemakers~ + +### Quite a boast for someone who's about to lose. + +### (SPEAKER grins)|I look forward to testing those claims~ + +### I defeated Fuuka. Now you're next! + +### (SPEAKER shrugs)|You beat that zombie girl?|She's the weakest of the paladins.|She loves to boast about how she's special,|But she's really just a spoiled brat. + +### ...Zombie girl? + +### (SPEAKER tilts her head)|Yes, she was around before Vinlaga.|Her magic was gifted to her by the Goddess,|it is only natural that it works on her too. + +### ...Paladins? + +### (SPEAKER nods happily)|Divinely-appointed judges, presiding over mortals.|Unlike you, our immortality is earned.|Myself, I captured many defilers long ago.|Is it not fitting that I get to keep them for myself? + +### It is an honor to fight a worthy opponent. + +### (SPEAKER giggles)|That gag suits you nicely~ + +### (SPEAKER grins)|I look forward to it! + +### You will see soon enough. + +### Indeed! + +### What is this place? + +### (She smiles)|Why, this is my private prison.|I bring only my prettiest toys to stay here with me.|You can see them up there.|(She motions to the north) + +### Tell me about your collection + +### (SPEAKER smiles pleasantly)|Its a fitting reward, isn't it?|Long ago, this mountain was home to a vicious empire.|Machines went out to sea, bringing back countless prisoners.|As commander of the invasion, I earned this title! + +### (SPEAKER grins)|When we stormed the prisons, we encountered many fierce defenders.|Many of them now reside in these halls, earning their rightful punishment. + +### Who are the prisoners, anyway? + +### (SPEAKER folds her arms)|Is it not holy and just to bring down tyrants? + +### Why did the Goddesses intervene? + +### (SPEAKER shrugs)|Most of them had already been... conditioned.|It will take centuries to undo centuries of training.|After all, we have plenty of time. + +### What about the former prisoners? + +### (SPEAKER looks to the side)|The leader was nowhere to be found.|The coward fled deeper underground.|Her robot guardians protect her, to this day. + +### Can I see the leader of this old civilization? + +### (SPEAKER smirks)|What's the point of going deeper?|The tyrant lost control of her petty empire.|Now the world is safe from her. + +### So you stopped at the upper floors? + +### (SPEAKER frowns)|Absolutely not.|They are under my strict supervision. + +### Can I talk to the former prisoners? + +### (SPEAKER grins)|Very funny.|I heard rumors of an up-and-coming adventurer stirring up trouble.|It seems my intuitions were correct. + +### I hope you don't mind me looting the lower levels~ + +### (SPEAKER grins)|Oh please.|Only this era's finest warriors can be part of my collection~|My subordinates take care of the rest. + +### Sounds like you have an impressive collection + +### (SPEAKER frowns)|It's easy to take for granted the peace you didn't work for. + +### Must be comfy living up here then + +### (SPEAKER scoffs at you)|Adventurers are always like this.|Ever since your kind started prying,|I've had no choice but to enact my own kind of discipline~ + +### What makes you any better than the old rulers? + +### (SPEAKER smirks at you)|If that were so, then perhaps it would be best not to pry...|Forbidden knowledge has its price, after all. + +### It sounds like the gods are trying to hide something + +### (SPEAKER folds her arms)|And what makes you think an old myth would be relevant here?|Would the Archmagus herself lead a rebellion against the divine? + +### Was Sariel Vinlaga the leader of the old civilization? + +### (SPEAKER frowns)|You don't trust me? That's too bad... + +### It's the way you keep dodging questions. + +### (SPEAKER scoffs)|I'd love to have a word with your sources~ + +### I have it good authority that Vinlaga is here. + +### (SPEAKER smirks)|Don't believe everything you hear~ + +### Maybe you're right. + +### (SPEAKER pouts)|Old?|Grrr... + +### Says an old woman under the mountain... + +### I am indeed an adventurer. + +### (SPEAKER smiles)|Fascinating. Do keep explaining. + +### (SPEAKER frowns)|That is not the attitude I appreciate from my guests. + +### I forge my own path. + +### Why should I listen to you? + +### (Pout) + +### That's a shame about your records, I'll be going now. + +### Mmpphgh? (Go to pass her) + +### (She smirks)|Not so fast, dear~|You'll have to wear a special collar to pass. + +### I won't wear anyone's collar! + +### (She smirks)|Tsk tsk. Then you won't pass. + +### (She giggles)|How cute!|You're so used to yours that you forgot about it~ + +### Why don't you wear it yourself? + +### Hmmph. (Scoff at her) + +### (She frowns)|Watch your tongue~ + +### (She frowns)|I do not wear collars. + +### You'd be better off wearing mine instead. + +### You're missing out~ + +### This is a nice place you got here. + +### (Admire the locale) + +### (SPEAKER smiles and nods)|It has existed for a thousand years,|and it shall exist for another thousand.|No thanks, of course, to the adventurers who storm through here,|breaking the orbs as if it all belongs to them... + +### What are these orbs for anyway? + +### (SPEAKER looks puzzled)|You don't know? Surely you must be joking? + +### (SPEAKER shrugs)|They are important because...|Wait, you're stalling for time, aren't you? + +### I do not know. + +### (Sigh) + +### Of course I know... + +### You can trust me. + +### Mmmph! (Nod eagerly) + +### (SPEAKER laughs)|Do you think I will trust you just like that? + +### (SPEAKER frowns)|You do not know who you're dealing with.|I'll make sure to teach you a lesson. + +### Why don't I make you wear it? + +### You can try~ + +### There must be a mistake. Sign me up! + +### (She smiles)|Eager are we?|I don't just record anyone though.|I only care about the strongest adventurers~ + +### I am the strongest. + +### (SPEAKER chuckles)|Then why don't I test your skills? + +### (SPEAKER grins)|How about trial by combat? + +### A test? What kind? + +### ...You're on! + +### Let's do it! + +### You will see how strong I am! + +### (SPEAKER giggles)|We'll see about that! + +### On second thought, maybe not... + +### (SPEAKER giggles)|Not so confident, are we? + +### I didn't think it would involve a test... + +### (SPEAKER readies her whip)|Allow me to introduce myself properly.|I am The Warden, divinely appointed judge and enforcer.|Those who enter this mountain do so under my watchful eye.|To ensure this, I have crafted a special collar.|It will ensure that you do not defile the holy places.|I can let you through if you accept it~ + +### I will never be collared by you! + +### (Shake your head and scoff) + +### (SPEAKER folds her arms)|So be it. + +### Tell me about your collection. + +### I'm in charge of my own path. + +### (SPEAKER grins)|Let's see how long you can keep up that attitude~ + +### That won't be necessary, miss. + +### (SPEAKER smiles)|Oh, it's quite necessary~|Why don't I show you? + +### I would rather fight you. + +### (Fight her) + +### (SPEAKER shrugs)|Straight and to the point, eh? + +### Ready yourself! + +### Let's go! + +### I guess I have no choice... + +### (SPEAKER grins)|Very impressive.|You may have lost the battle, but you performed admirably~ + +### (SPEAKER smiles)|I will let you pass so long as you wear my collar.|(She snaps her fingers and conjures a glowing ring) + +### (SPEAKER giggles)|Then your journey ends.|I assume you don't want that.|Now then, as for your collar~|(She snaps her fingers and conjures a glowing ring) + +### (SPEAKER chuckles)|Of course it was magic~|Who said a commander had to be defenseless?|(She snaps her fingers and conjures a glowing ring) + +### Was that magic? + +### I've lost. Now what? + +### I won't submit to you! + +### (SPEAKER presents you with your collar...)|(It closes around your neck seamlessly)|Now... you'll be allowed to go free,|but only once you've been sufficiently trained. + +### (SPEAKER blocks you with a web of metal bars)|Very impressive!|But did you really think it would be that easy? + +### (SPEAKER crouches down)|Most impressive...|It is not often I lose to an adventurer...|I'd love to get my hands on you eventually~ + +### (SPEAKER looks surprised)|I did not expect you to be so... compliant.|(She snaps your fingers and tosses you a glowing belt)|This is a special one, reserved for those with divine privilege.|You've earned it. + +### (Wear her belt anyway) + +### (SPEAKER shakes her head as you force a gag into her mouth)|MMMMMPH! + +### The ENMY weakens your grip on your weapon! Enemies may disarm you if you stand too close... + + + +### Can you link my arm cuffs? + +### (Hold out your arm cuffs) + +### (The SPEAKER smiles)|Why sure, sweetie, I can help you with that~ + +### (The SPEAKER grins)|What a good girl! + +### (The SPEAKER blushes)|Those look like fun! + +### (The SPEAKER smirks)|Sure thing~ + +### (The SPEAKER beeps)|+10 social credit + +### Can you link my leg cuffs? + +### (Hold out your leg cuffs) + + + +### Cool people wear these indoors. + +### +25 holy resist. Reduces blind effects. Prevents blinding from light adjustment. + +### You find a pair of stylish shades. + + + +### Shades + +### Player Background Color + +### An attack causes you to bounce... + +### You find yourself enveloped in a bubble! + +### A sphere of latex coalesces around you, trapping you and inflating until tight! + +### A sphere of latex coalesces around you, trapping you and sealing around your neck! + +### You find yourself enveloped in a slime bubble! + + + +### Your RestraintName pops with a loud bang! + +### Your RestraintName starts leaking air! Very, very slowly... + + + +### Aqua Slime + +### The aqua slime melts into a wet puddle. + +### The aqua slime splashes against you! (DamageTaken) + +### The aqua slime expands into a bubble and throws itself at you! (+RestraintAdded) + +### Aqua Bubble (Head) + +### A squishy bubble made of a gelatinous substance! + +### You can pop it with a sharp enough edge, if you can get your tool in the position... + +### Aqua Bubble (Arms) + +### Aqua Bubble (Legs) + +### The bubbles on you combine into one big bubble! + +### The stairs have been locked down for NMB more turns. + +### Curse of Increasing Tightness: Your restraints get tighter over time. + +### Curse of Lethargy: Reduce distraction over time, but miscast chance is increased by AMNT%. + +### Curse of Mute: You cannot converse, and verbal spells cost AMNT% more mana. + +### Curse of Clumsiness: After casting an arm spell, you drop your currently held weapon. + +### Curse of Deflection: 50% chance for an attack to be redirected against an adjacent hostile target. + +### Loot Recovery: + +### Enabled + +### You recover important items when you advance floors. + +### Once items are lost, they are gone for good. + +### Each item has a 25% chance of appearing in the chest between floors. + +### You find a familiar adventuring outfit! + + + +### You feel energy flow out of you, activating the floor below! + +### You feel energy flow out of you, lighting up a circle on the floor! + +### The floor beneath you drains your mana, but you don't have enough to satisfy it. + +### The ground beneath you glows with magical energy! + +### Radiant Light + +### Banishment of the shadow. + +### Living Shadow + +### Engulfs the tile in darkness. + +### Planar Focus + +### Absorbs teleportation energies. + +### Planar Diffractor + +### Diffuses teleportation energies. + +### Planar Focusing Crystal + +### Amplifies teleportation energies. + +### Mysterious Plate + +### What could it be? + +### Mana-Charged Plate + +### It seems like it needs more power... + +### It's giving off a strange energy! + +### Glass Plate + +### Looks like it has lighting elements inside. + + + +### Many bars come out of the ground and restrain you! + +### One Bar Missile + +### Restraining Bolt + +### Sealing Bolt + +### Bondage Blast + +### Magic Missile + +### Warden's Cage + +### Restricting Bars + +### The bars retract into the ground. + +### Sealing Pillar + +### The pillar collapses, causing zombies to rise up! + +### Safeword Please + +### Allies don't help you unless you ask first. + +### Living Collars + +### When you get jailed, you may get a living collar that applies further restraints on you. + + + +### The Warden's cage falls atop you and attaches to the floor with a click. + +### The restraining bolt emits binding energies! + +### The restraining bolt flashes and pushes you backward! + +### The restraining bolt transforms into cuffs on impact! + +### The restraining bolt pins your cuffs to the wall! + +### The spell explodes into restraining energy! + +### The spell explodes and stuns you! + +### The spell congeals into restraints! + +### The mage starts channeling her energy! + + + +### Warden Cuffs + + + + + +### Warden Leg Cuffs + +### Warden Ankle Cuffs + + + +### Your buttons have been pushed, and not in a pleasant way! + +### Defeat all taunting enemies or stay within the tiles to avoid shame! + +### Degradating Taunts + +### You failed to come up with a proper comeback! + +### The zone of frost damages you as you are chilled! + +### Confirm Path + + + +### Navigation Map + +### Choose a path to take by clicking on a highlighted room. + +### Other paths will become inaccessible. + +### Floor NMB + +### Tileset: + +### Map Modifier: + +### Layout: + +### Controlling Faction: + +### Main Objective: + +### Points of Interest: + +### Magical Study + +### Maintenance Hall + +### Ancient Chest + +### Caldera Passage + +### Auction Hall + +### Dark Altar + +### Dimensional Rift + +### Hoard + +### Dragon's Lair + +### Witch's Lair + +### Mold Infestation + +### Bandit Raid + +### Dragon Sighting + +### Slime Infestation + +### Wolfgirl Training + +### Drone Patrol + +### Shop + +### Chamber + +### Prison + +### Sorting Room + +### Click a hotbar slot to assign the current item to it.|You can click the swap button on the right|to switch between your five hotbars.||You can also save and load presets for your hotbar.|These are shared between runs. + +### You step on the item and tug to pull it taut... + +### You tug furiously against the leash, pulling it taut! + +### Silenced Hall + +### The waist-deep water slows you! + + + +### Sariel Vinlaga's Panties + +### Legend has it that these were worn by the legendary archmagus herself. + +### If you keep them in your mouth, your verbal spells have -50% miscast chance. +10% spell damage. + +### You find a pair of black panties with pink trim, scrunched up in a ball. + + + +### Elven Panties + +### In faraway lands, they often say that less is more... + +### +11% sprint efficiency + +### You find a pair of elven panties. + + + +### Hood of Fluffoth + +### Worn by devotees to Fluffoth, demonic ruler of the plush abyss. + +### When distraction reaches 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 40 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. + +### When distraction is over 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 30 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. + +### You find a sinister hood made of soft plush. + + + +### Ceremonial Leotard + +### An article worn by the servants of state in the short-lived kingdom of Ejahl. Its locking mechanism and clothes-dissolving enchantments ensure the wearer understands her role as an extension of the state. + +### Its soul crystals harden the mind and dampen changes in willpower, reducing all willpower changes by 25%. + +### You find a ceremonial leotard. + + + +### The Robe of Chastity + +### A magical leotard whose power infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. + +### It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire. + +### A magical leotard infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. + +### You retrieve an interesting article dubbed 'the Robe of Chastity. + +### Took + +### (As you slay the dragon, it begins shapeshifting into human form!) + +### Crystal Dragon Queen + +### The crystal dragon shapeshifts back to human form! + +### The crystal dragon strikes you with its claws! (DamageTaken) + +### The crystal dragon breaths a sparkling dust, which hardens into crystal! (+RestraintAdded) + +### The crystal dragon takes flight and swoops toward you! + +### The crystal dragon takes flight and slams into you! (Stunned!) + +### Crystal Dragon Girl + +### The dragon girl submits to you! + +### The dragon girl slams you with several hurled crystals! (DamageTaken) + +### The dragon girl conjures a cloud of crystals that solidify! (+RestraintAdded) + +### The dragon girl conjures crystalline locks on you! (+RestraintAdded) + + + +### Poison Dragon Queen + +### The poison dragon shapeshifts back to human form! + +### The poison dragon strikes you with its claws! (DamageTaken) + +### The poison dragon extends many vines from its wings! (+RestraintAdded) + +### The poison dragon takes flight and swoops toward you! + +### The poison dragon takes flight and slams into you! (Stunned!) + +### Poison Dragon Girl + +### The dragon girl slashes you with her venomous nails! (DamageTaken) + +### The dragon girl raises vines out of the ground to bind you! (+RestraintAdded) + +### The dragon girl holds you in place and locks your restraints! (+RestraintAdded) + + + +### Ice Dragon Queen + +### The ice dragon shapeshifts back to human form! + +### The ice dragon strikes you with its claws! (DamageTaken) + +### The ice dragon catches you in its icy breath! (+RestraintAdded) + +### Ice Dragon Girl + +### The dragon girl slams you with several chunks of ice! (DamageTaken) + +### The dragon girl splashes you with instantly freezing ice! (+RestraintAdded) + +### The dragon girl conjures magical locks on you! (+RestraintAdded) + + + +### Shadow Dragon Queen + +### The shadow dragon shapeshifts back to human form! + +### The shadow dragon slashes directly at your mind! (DamageTaken) + +### The shadow dragon wraps itself around you many times! (+RestraintAdded) + +### Shadow Dragon Girl + +### The dragon girl stares into your eyes! (DamageTaken) + +### The dragon girl reaches out with a shadowy grip! (+RestraintAdded) + +### The dragon girl reaches out and locks your restraints! (+RestraintAdded) + + + +### A cage falls from the ceiling on top of you! + +### Crystals grow across your body and encase you! + +### You are encased in a solid block of ice! + +### A shadowy sphere rises from the ground and wraps over you tightly! + +### Shadows coalesce themselves around you in spherical form! + +### Crystal Encasement + +### An overgrowth of magical crystals. Their chaotic energies flood into your mind and displace your thoughts! + +### Being brittle, it will eventually crack and fail. Just keep wiggling... + +### Ice Encasement + +### A huge ice cube. It's quite cold in there. + +### It will eventually melt! Eventually... + +### The Warden's restraints release you... for now. + +### Chain Hogtie + +### A metal chain holds your back in an arched position. + + + +### A chain connecting your thigh cuffs together. You can still walk, albeit slower than usual. + +### It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. + + + +### A chain connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. + +### Ankle Chain (Short) + +### A short chain connecting your ankle cuffs together. You can barely separate your legs with this on. + +### A very short chain connecting your elbow cuffs together. It is quite awkward to remove by yourself. + +### A very short chain connecting your wrist cuffs together. + + + +### Vine Pod + +### The vine pod explodes into dust! + +### The vine pod wraps you in vines and squeezes! (DamageTaken) + +### The vine pod launches several vines at you in quick succession! (+RestraintAdded) + +### Sleep Flower + +### The sleep flower explodes into dust! + +### The sleep flower sprays pollen into your face! Achoo! (DamageTaken) + +### The sleep flower launches several vines at you in quick succession! (+RestraintAdded) + +### Several vine pods sprout out of the ground! + +### A vine pod sprouts out of the ground! + +### Several flowers sprout out of the ground! + +### A magical flower sprouts out of the ground! + +### A wall of ice rises from the ground! + +### The dragon's breath poisons you! + +### The dragon girl strikes you with poisonous razor leaves! + +### The flower releases soporific spores! + +### Poison Breath + +### Vines reach from the ceiling and lift you into the air! + +### Vine Suspension + +### Vines linked to your bindings that keep you suspended! + +### You are left dangling! Maybe if you swing hard enough you can tear the vines... + +### Darkstar Studios - Slimy Science + +### Kocaeli - Doll Storage + +### Kocaeli - Factory + +### Kocaeli - AAA + +### Kocaeli - DD + +### Ada18980 - Playing with fire + +### Ada18980 - Smoking is bad for you + +### Kocaeli - Graveyard + +### Kocaeli - Ancient Tombs + +### Kocaeli - Magic Library + +### Kocaeli - Black Cat + +### Kocaeli - Black Cat 2 + +### Kocaeli - Underground Jungle + +### Kocaeli - Untitled + +### Kocaeli - Lost Temple + +### Kocaeli - Orrery + +### Kocaeli - Bellows + +### Kocaeli - Rubber Facility + +### Kocaeli - Edge of Reality + +### Kocaeli - 1 + +### Icy Barrier + +### The wall of ice shatters! + +### Icy Breath + +### Ice Orb + +### The EnemyName breaths in deeply, causing the air around you to chill... + +### Shadow Bubble + +### The projectile explodes into tight shadow latex, stretching all across your body! + +### The dragon dances through the shadows! + +### You tip over as you try to roll yourself! (oof!) + +### The shadowy energies surrounding you drain away your mana... + +### Shadow Sphere + +### A giant shadow latex sphere that leaves you rolling around... + +### Dark magics fill the air! + +### Shadow Posture Collar + +### A strict collar that seals your mouth tightly. + +### It is made of shadow latex, tougher to cut than normal latex. + +### Not bad... you made me use 10% of my power. + +### It's a defunct elevator, likely from the Old Civilization. + +### (The elevator beeps and roars to life)|(Its control panel displays a list of options) + +### (Go to floor 0) + +### (Go to floor 1) + +### (Go to floor 2) + +### (Go to floor 3) + +### (Go to floor 4) + +### (Go to floor 5) + +### (Go to floor 6) + +### (Go to floor 7) + +### (Go to floor 8) + +### (Go to floor 9) + +### (Go to floor 10) + +### (Go to floor 11) + +### (Go to floor 12) + +### (Go to floor 13) + +### (Go to floor 14) + +### (Go to floor 15) + +### (Go to floor 16) + +### (Go to floor 17) + +### (Go to floor 18) + +### (Go to floor 19) + +### (Go to floor 20) + +### (The viewscreen depicts a face)|Why hello there adventurer! What brings you? + +### Hmmmphgm? + +### (The face giggles)|Sadly my language processing systems aren't that good.|Try removing your gag first? + +### (The face smiles)|I am the Facility's vessel, of course!|Sariel called me Oriel, but I don't see her much these days... + +### Gffmmphmm? + +### (Oriel smiles)|Ah, it's you again!|It seems like you've found a new toy as well?|I can't understand you, silly~ + +### Oriel? As in the goddess of technology? + +### 'Goddess'? That seems like an outdated term.|Regardless, I am only a vessel, not the facility itself. + +### (Oriel giggles)|Sweetie, I can't understand you. + +### Can you control the facility? + +### (Oriel frowns)|Adventurers seem to keep asking me that.|In my current state I don't have control over much at all.|But I'm always here to talk! + +### Can you turn on the elevator? + +### I'm sorry, adventurer. I can't do that.|But maybe if you can get rid of all the nearby threats...|They've been under lockdown for a long time.|Just push the button again if it hasn't updated yet. + +### Mmmph mmm! (Help me!) + +### (Oriel chuckles)|What was that again?|Sorry~ + +### Can you help me out? + +### (Oriel giggles)|I can't do anything for you right now~ + +### Mmmmm... + +### (Oriel smiles)|It's always fun to see you like that~ + +### How are you doing? + +### (Oriel smiles)|Good!|I miss Sariel, though... + +### RMNME of CHTRNME the ENMYNME + +### The item is TTT, and will get looser as you progress. + +### somewhat tight + +### rather tight + +### quite tight + +### especially tight + +### extremely tight + +### incredibly tight + +### somewhat secure + +### secure + +### quite secure + +### highly secure + +### extremely secure + +### incredibly secure + +### somewhat thick + +### rather thick + +### quite thick + +### highly thick + +### extremely thick + +### incredibly thick + +### You must first accept the quest before offering at the shrine. + +### Zero Resistance + +### Toggle this to set bondage resist, evasion, and block to 0. While enabled, using the 'wait until interrupted' button will not be interrupted when hit or bound. + +### The RSTRT feels a little looser! + +### Crystal Armbinder + +### A growth of crystals fusing your arms together. Chaotic energies radiate in all directions, causing you to slowly lose control over your desires. + +### Crystals are tough but not unbreakable. + +### Crystal Ball Gag + +### A growth of crystals inside your mouth. It emits a strange, pleasurable sensation. + +### Crystal Gag Necklace + +### An arousing accessory made of solid crystal! + +### Simply popping it out of your mouth isn't enough to negate its effects entirely~ + + + +### The lock is protected by a seal of repentance. To unlock it you must pay 1 spell point. + +### The restraint won't budge. + +### You perform a ritual to unlock the item! + + + +### The lock is protected by a seal of repentance. To unlock it you must pay AMNT spell points! + +### You perform a grand ritual to unlock the item! + + + +### Warden's Thigh Chain + +### You've stolen something of great value. Now you must give it back. + +### Warden's Ankle Chain + +### Warden's Ankle Link + +### An intense, albeit temporary punishment for breaking the rules. + +### Warden's Elbow Chain + +### Warden's Wrist Chain + + + +### ESCP Difficulty: AMNT + +### ESCP Power: AMNT + +### ESCP Ability: AMNT + +### Max ESCP Depth: AMNT% + +### Cut + +### Your collar channels the vigor of excitement into magical energy! + +### The collar has already squeezed what it can out of you. Clear your mind first! + +### The guardian deploys a forcefield! + +### The guardian deploys a set of forcefields! + +### Guardian Drone + +### Cyber Guardian + +### Auto Enforcer Guardian + + + + + +### Time to get you into your uniform~ + +### You won't be needing any of this. + +### There we go, all ready for training! + +### Cyber Storage + +### An all-purpose metal crate equipped with a polycarbonate blast door and steel reinforcement. + +### Used throughout the reign of the Old Civilization to store slaves and prisoners. + + + +### The liquid latex sticks to your skin, forcing an airtight layer! + +### The latex starts to build up layers, forcing a protective coating... + +### The latex starts adhering to your skin, becoming extremely difficult to remove... + +### The latex seals you in, rendering escape impossible without alchemical methods. + +### The liquid latex spray slows you down! + +### Latex Sprayer + +### The turret deactivates after taking too much damage! + +### The turret defends itself with a spray of sticky liquid latex! (DamageTaken) + +### Your latex layer adheres to latex, making struggling more difficult! + +### The item sticks to your rubber layer, making it harder to pull off... + +### The item hugs your layer tightly, adhering firmly! + +### Your skin is covered in a layer of latex, making escape from cyber restraints harder! + +### Some Exclusions Apply + +### Goddess shrines do not remove non-binding restraints such as harnesses and cuffs. + +### Melee Specialization + +### Gain 25% base physical damage, but your spells do 50% less damage. + +### Melee Expert + +### Gain +20 Accuracy and +10% base physical damage. + +### Magic Specialization + +### Gain 25% spell damage, but your attacks are delayed by 1 turn when attacking. + +### Spell Expert + +### Gain -10% miscast chance and +10% spell damage. + +### Ranged Specialization + +### You deal 20% more damage to enemies further than 2 tiles away, but enemies adjacent to you take 60% reduced damage. + +### Ranged Weapon Expert + +### Bows, guns, and other projectile weapons do 10% more damage and consume 10% less charge. + + + +### After casting a DMG spell: + +### Gain AMNT% DMG Damage for DRTN turns + +### Gain AMNT DMG Resist for DRTN turns + +### Your elemental damage is increased! + +### Your elemental resistance is increased! + + + +### The overgrown monolith contains an ancient blessing. + +### Choose a stat to increase below. + +### Confirm Choice + +### Increase max distraction by AMNT%. + +### DP decays faster and more SP is safe from damage. + +### Increase max stamina by AMNT. + +### Increase max mana by AMNT. + +### Increase max willpower by AMNT. + +### Gain +AMNT SP regen/turn. + +### AMNT1 -> AMNT2 + +### AMNT1 (max) + +You found a magical amulet! Choose one of the following to determine its benefits: +마법의 부적을 찾았습니다! 다음 중 하나를 선택하여 혜택을 확인하십시오. +### Focus: +50% max distraction and faster decay. +5% stamina protected from damage (base: 30%). + +### Stamina: +50 max stamina. + +### Magic: +50 max mana. + +### Willpower: +50 max willpower. +1 stamina regen/turn. + +### A mystical orb stands before you. + +### You break the orb and gain its secrets. + +### Stun Resistance! + +### Negate Rune + +### Removes a rune on the target tile. If cast on self, removes all runes you've created instead. Casting on an enemy rune restores 10 mana instead. + +### You scribe a negation rune! + +### Target a single rune, or yourself to negate all your runes. + +### You don't have enough mana + +### The enemy rune is wiped clean. + +### You pour negation magic into the ground, but nothing happens. -This is a bug, please report -버그입니다. 신고해 주세요. -*starts chasing you* -*당신을 쫓기 시작합니다* -*won't leave you be!* -*당신을 떠나지 않을 것입니다!* -*tugs at your body!* -*당신의 몸을 잡아당깁니다!* -*runs at you* -*당신에게 달려듭니다* -*notices you!* -*당신을 알아봅니다!* -*wants to socialize* -*친분을 갖길 원함* -*sends shivers down your spine* -*척추에 전율을 보냅니다* -*runs at you* -*당신에게 달려든다* -*is rattled* -*흔들린다* -*scrabbles slowly by* -*천천히 스크래블* -*shrieks* -*비명* -*wants to shock your soul* -*영혼에 충격을 주고 싶어* -*comes to seal your doom* -*당신의 파멸을 봉인하러 옵니다* -*shouts a startling shrilling scream!* -*놀라울 정도로 날카로운 비명을 외친다!* -*walks toward you with arms outstretched* -*두 팔을 벌리고 당신을 향해 걸어갑니다* -*defending the goddess* -*여신 수호* -*defends its cache* -*캐시를 보호합니다* -*lets out a shriek* -*비명을 지르자* -*tries to catch you* -*당신을 잡으려고 합니다* -*grabs you* -*당신을 잡아* -*disarms* -*무장해제* -*is rattled* -*흔들린다* -*rattles excitedly* -*흥분하게 딸랑이* -*misses* -*실패* -*trembles* -*떨린다* -*tugs on leash* -*목줄을 잡아당긴다* -*rattles* -*딸랑이* -*rattles excitedly* -*흥분하게 딸랑이* -*rattles excitedly* -*흥분하게 딸랑이* -*rattles* -*딸랑이* +### All of your runes have been removed. -Bug -벌레 -Maintenance needed. -유지보수가 필요합니다. -Unit needs repair. -유닛 수리가 필요합니다. -Commence transfer of power protocol. -전원 프로토콜 전송 시작. -Insufficient bindings. Commence submission protocol. -불충분한 구속. 복종 프로토콜을 시작합니다. -Commence routine inspection. -정규 점검 개시. -Inmate is out of containment. Transferring. -수감자가 격리 해제되었습니다. 이송 중입니다. -Theft detected. This is a warning. -도난이 감지되었습니다. 경고. -Confiscating item. -물건을 압수합니다. -Inmate detected. Commence training protocol. -수감자가 감지되었습니다. 훈련 프로토콜을 시작합니다. -Inmate detected. Commence routine inspection. -수감자 감지. 정규 점검 개시. -Inmate detected. Commence submission training. -수감자 감지. 복종 훈련을 시작합니다. -Violence detected. Subduing assailant. -폭력이 감지되었습니다. 가해자를 제압합니다. -Damage detected. Initiating combat routine -손상 감지. 전투 루틴 시작. -Unruly inmate detected. Performing corrective action. -제멋대로인 수감자가 감지되었습니다. 시정 조치를 취하고 있습니다. -Magic detected. Subduing assailant. -마법이 감지되었습니다. 가해자를 제압합니다. -Energy spike detected. Preparing shields. -에너지 급증이 감지되었습니다. 보호막을 준비 중입니다. -Unlawful use of magic. Please submit to arrest. -허가되지 않은 마법 사용. 검거에 응해 주십시오. -Violence detected. Subduing assailant. -폭력이 감지되었습니다. 가해자를 제압합니다. -Unlawful conduct. Please submit to arrest. -불법 행위입니다. 체포에 응하십시오. -Theft detected. Please submit to arrest. -도난이 감지되었습니다. 체포에 응하십시오. -Unlawful conduct. Please submit to arrest. -불법 행위입니다. 체포에 응하십시오. -Inmate has escaped. Commence capture protocol. -수감자가 탈출했습니다. 체포 프로토콜을 시작합니다. -Error, subject is attempting to escape. -오류, 대상이 탈출을 시도하고 있습니다. -Target is violent. Disarming subject. -목표는 폭력적입니다. 대상을 무장 해제합니다. -Target is violent. Increase alert level. -목표가 폭력적입니다. 경계 수준을 높입니다. -Dispensing restraints. -금지 조치. -Target resists. Revising strategy. -목표물이 저항한다. 전략 수정. -Target combat skills below expected level. Revising estimates. -기대 이하의 전투 능력을 목표로 합니다. 추정치를 수정합니다. -Subject captured. Returning to processing. -대상이 잡혔습니다. 처리로 돌아가는 중입니다. -Apply takedown protocol. -제압 중단 프로토콜을 적용합니다. -Aggressive target detected. Deploying countermeasures. -공격적인 표적이 감지되었습니다. 대응책을 펼치고 있습니다. -Contraband detected. Confiscating. -밀수품이 감지되었습니다. 압수 중입니다. -Increasing strictness level. -엄격도를 높입니다. -Looks like I'm up to no good... better stop me! -내가 좋지 않은 일을 하는 것 같군... 그만둬! -Careful where you point that thing! -어디를 가리키는지 조심해! -Containment breach! -격리 실패! -What if I'm the assistant, for a change? -내가 어시스턴트라면 어때요? -Hey, could you test this on... me? -이봐, 이거 테스트 좀 해줄래... 나? -I'm willing to do anything for science! -나는 과학을 위해 무엇이든 할 의향이 있습니다! -You're a fine specimen! -당신은 훌륭한 표본입니다! -I should take you to my office~ -사무실로 모셔다드려야지~ -You'd look good in some latex! -라텍스를 입으면 멋질 것 같아요! -Hey! That's mine! -이봐! 그건 내꺼야! -You're not supposed to have that! -당신은 그것을 가질 수 없어! -You'll make a fine test subject... -너는 훌륭한 실험 대상이 될거야... -Come here, I want to perform some tests! -이리와, 테스트 좀 해보고 싶어! -Looks like it's time to drop some science! -이제 과학을 그만둘 때가 된 것 같군! -Bad girl! -나쁜 여자! -Keep your filthy hands off me! -더러운 손 치워! -Your chances of winning are... less than zero. -네가 이길 확률은... 0보다 적다. -Good girls don't use magic without permission. -착한 여자는 허가 없이 마법을 사용하지 않는다. -Keep that magic away from my experiments! -내 실험에서 그 마법을 멀리하십시오! -You're going to break something! -당신은 무언가를 부술 것입니다! -That's dangerous! -위험해! -Stop! That's scientific equipment! -그만! 그건 과학 장비야! -Don't touch my supplies! -내 보급품에 손대지 마! -That's off-limits! -그건 출입금지야! -You're not supposed to be here! -넌 여기 있으면 안 돼! -Now now, you won't be going anywhere~ -이제, 넌 아무데도 가지 않을거야~ -A calculated success! -계산된 성공! -Watch the vials! -병 조심해! -I've caught you! -내가 잡았어! -I can't believe I missed... -놓쳤다니 믿을 수가 없어... -I knew you would do that! -네가 그렇게 할 줄 알았어! -Experiment was a success! -실험 성공! -Gotchya! -갓챠! -There we go! -우리는 거기에 갈! -Ooh, you've got some useful stuff~ -오, 유용한 물건이 있군요~ -I won't let you go that easily! -그렇게 쉽게 놔주지 않겠어! -Oh my, looks like I'm in trouble! -어머, 곤란한 것 같아! -What a shame it would be if I got caught~ -걸리면 얼마나 아쉬울까~ -Looks like I'd better get going~ -가는 게 좋을 것 같네요~ -What if I became the victim of my own inventions... -만약 내가 내 발명품의 희생자가 된다면... -Oh my, looks like I'm in trouble~ -어머, 곤란한 것 같네~ -Won't you help me get dressed? -옷 입는 거 도와주지 않을래? -You look just gorgeous, dear... -당신은 정말 멋져요, 얘야... -Why don't you try these on? -이걸 입어보지 그래? -You'll make a fine addition to my collection! -당신은 내 컬렉션에 훌륭한 추가를 만들 것입니다! -Such jaw-dropping beauty! -이런 입이 떡 벌어지는 아름다움! -You belong on a display stand! -당신은 디스플레이 스탠드에 속해 있습니다! -We should put away those grasping hands of yours~ -잡는 손은 치워야지~ -That belongs to someone else. -그것은 다른 사람의 것입니다. -Oh no you don't, sweetie! -오 안돼, 자기야! -Oof! Looks like you need to be taught a lesson! -으악! 교훈을 얻어야 할 것 같군요! -We better put away those hands of yours. -당신의 그 손을 치워야 합니다. -Why don't you just give up and pose for us~ -포기하고 우리를 위해 포즈를 취하는 게 어때요~ -Oh my, that's dangerous! -어머, 위험해! -You're going to damage my dress! -당신은 내 드레스를 손상시킬거야! -Keep those pretty hands to yourself, dear~ -그 예쁜 손은 혼자 간직하세요, 여보~ -Where'd you find that, dear? -어디서 찾았어, 얘야? -Silly girl, you should be looking to your mistress for guidance. -어리석은 소녀여, 당신은 당신의 여주인에게 지도를 구해야 합니다. -That's not yours, sweetie~ -그건 네 것이 아니야, 자기야~ -You shouldn't break things with such dainty hands~ -예쁜 손으로 부수면 안 돼~ -I knew something was amiss! -뭔가 잘못되었다는 걸 알았어! -You won't be getting away that easily, dear~ -그렇게 쉽게 도망가진 않을거야, 얘야~ -Won't be needing this~ -이건 필요없어~ -Hey, you'll damage my dress! -이봐, 내 드레스를 망칠거야! -I'm so excited! -너무 흥분돼! -A slippery one, aren't you? -미끄럽지 않니? -Tsk tsk. You can do better, dear~ -쯧쯧. 더 잘할 수 있어 얘야~ -I can't wait to dress you up! -나는 당신을 차려 입는 것을 기다릴 수 없어! -So nice of you to join me! -저와 함께 해주셔서 정말 좋습니다! -Now let's see, what kind of dress... -자, 어떤 옷인지 보자... -A gift? Thank you so much! -선물? 정말 고마워! -You won't be getting out of that any time soon! -당신은 곧 그것에서 벗어나지 못할 것입니다! +### E-Stimulation + +### Replaces most instances of painful electric shocks with stimulating effects instead. + +### The energy bolt hits you and sends stimulating energies through you! + +### You steal a key card. + +### Key Card + +### The keycard's shiny surface reflects the light in a mesmerizing way. + +### A piece of identification that contains an access code. + +### You can use it to unlock certain doors. + +### Your keycard blinks red as the facility remotely locks it! + +### Your keycard blinks red as the facility remotely locks it! System Security: 100% + +### Unauthorized removal detected. System Security: AMNT% + +### Security breach. Initiating remote lockout. System Security: AMNT% + +### You pick up a flash bomb. + +### You pick up a flashbang grenade. + +### Actions + +### Self + +### Dialogue + +### Ambient + +### Kills + +### You attack TargetEnemy for DamageDealt total damage. + +### You attack TargetEnemy for DamageDealt damage / BondageDealt binding. + +### You attack TargetEnemy but don't do any damage. + +### ENMY calls for help! + +### (Go to The Summit) + +### The Summit is a safe area. Items can be left here without fear of losing them. + +### Target an NPC to attach a leash. Enemies and unwilling allies must be tied up to 50% first. Target self to release all leashes, or target a leashed NPC to unleash them. + +### Target an NPC to leash, or self to unleash all. + +### Brat Handler + +### Target an NPC with an equipped leash restraint (via Truss'em'up) to attach a leash. Target self to release all leashes, or target a leashed NPC to unleash them. + +### Clip-On Leash + +### A beloved favorite of pets and trainers alike. + +### You ready the leash... + +### You pick up a leash. + +### You are not in a condition to use a leash on her. + +### She refuses to be leashed unless you tie her up! + +### You attach a leash to ENMY. + +### You remove your leash from ENMY. + +### You let go of all leashes. + + + +### Plastic Explosive + +### Has a 60 turn timer, but can be detonated by other explosives. Deals 210 blast damage in a huge radius and leaves behind a huge field of rubble. Enemies hit have their armor reduced by 50 BEFORE taking damage. + +### It's totally harmless! Probably. + +### You set the clock ticking... + +### Dynamite + +### 10 turn fuse with a 25% chance each turn to detonate prematurely. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. + +### Arguably more dangerous to the user than the target. + +### 10 turn fuse with a 25% chance each turn to detonate. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. + +### You light the fuse and pray it doesn't blow up in your face. + +### You are holding too many leashes! + +### You feel a corrupting influence... (+AMNT Corruption) + +### You feel a restoring influence! (-AMNT Corruption) + +### Sticky latex fuses itself to your skin! (+AMNT LatexIntegration) + +### The latex starts to detach from your skin... (-AMNT Latex Integration) + +### While you have an evasion penalty, even clumsy enemies... + +### ... will get an accuracy bonus against you in melee range. + +### You are more likely to succumb to curses. + +### X Offset + +### Y Offset + +### X Scale + +### Y Scale + +### X Pivot + +### Y Pivot + +### Rotation + +### Layer Bonus + +### NoDynamicArmor (0/1) + +### AddPose + +### HideOverridden (0/1) + +### NoOverride (0/1) + +### Hide Pose (e.g. Xray) + +### Require Pose (e.g. ChestArmor) + +### Hide Prefix (e.g Encase) + +### Hide Suffix (e.g TorsoUpper) + +### Protected + +### Displace Amount + +### Erase Amount + +### Load from File + +### Save to File + +### Tip: Slime/Latex tiles only affect entities with less than 45 Glue Resist. + +### Being drenched in water also prevents slime/latex from sticking to you. + +### Use the interact tool in the bottom right HUD to sleep in a bed. + +### Clear Vision + +### Blindfolds are much rarer. + +### Free the Boob + +### Chastity bras are rarer unless you are wearing nipple toys. + +### Liberate the Boob + +### Chastity bras are much rarer. + +### Find an elevator to the Summit in order to access facilities. + +### Visit the Summit to allow additional interactions with this facility. + +### Must visit the Summit or be in a perk shrine to recycle restraints. + +### +AMNT% Training/Tick + +### +AMNT% Opinion/Tick + +### +AMNT% Productivity + +### AMNT/MAXX Prisoners Assigned + +### AMNT/MAXX Servants Assigned + +### Assign servants as managers to boost the production of other facilities.|Appointing new management results in a loss of efficiency until the next cycle. + +### Bondage Dojo + +### Assign servants to perfect the art of walking in heels,wearing tight corsets,|communicating while gagged, and overall flexibility. + +### Rescue Operations + +### Assign servants to train squads of rescue maids, which you can call in times of need. + +### Alchemy Lab + +### Assign servants to produce potions from base ingredients you acquire in your adventures. + +### Recycler + +### Convert low tier restraints into raw materials and output higher quality restraints.|Adding more servants increase the conversion speed. + +### Cuddle Lounge + +### Assign prisoners to the lounge in order to improve servant and prisoner opinion. + +### Appoint a warden to keep prisoners in check and automatically bind using restraints from storage. + +### Recycle Restraints + +### Recycle One + +### Recycle ALL! + +### Recycle all but one + +### You recycle a ITM + +### You recycle #x ITM + +### You disassemble #x ITM into $x PRD + +### Disassemble all but one + +### Disassemble one + +### You're blocking me. + +### You're in my way! + +### Miss, you're blocking me... + +### Step aside~ + +### Path blocked by citizen. + +### *Bumps into you* + + + +### Cyber Hogtie Tether + +### It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. + + + +### Cyber Thigh Tether + +### An energy tether connecting your thigh cuffs together. You can still walk, albeit slower than usual. + + + +### Cyber Ankle Tether + +### An energy tether connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. + +### A short energy tether connecting your ankle cuffs together. You can barely separate your legs with this on. + +### Cyber Elbow Tether +### A very short energy tether connecting your elbow cuffs together. It is quite awkward to remove by yourself. -No! I don't want to read your magazines! -안돼! 나는 당신의 잡지를 읽고 싶지 않아! -No, I don't want to learn about Shibari! -아니, 시바리에 대해 배우고 싶지 않아! -No, I don't want to practice edging and denial! -아니, 난 에징과 부정을 연습하고 싶지 않아! -I found this book about Shibari... is it yours? -시바리에 관한 책을 찾았는데... 당신 책인가요? -I'm so clumsy... maybe you can fix that. -나 너무 서투른데... 너가 고칠 수 있을지도 몰라. -Gee, looks like I can't keep my mouth shut... -이런, 입 다물고 있을 수 없을 것 같은데... -Shhhhh. -쉿. -Be quiet. -조용히 해. -Keep your hands off my books. -내 책에서 손 떼. -Heh. Serves you right. -헤헤. 잘 먹네. -Time to lock you away. -당신을 가둘 시간입니다. -Don't get your paws on anything important. -중요한 일에 손대지 마. -I was reading that! -나는 그것을 읽고 있었다! -You're not supposed to have that. -당신은 그것을 가져서는 안됩니다. -Who are you? -누구세요? -You're entering my personal space. -당신은 내 개인 공간에 들어가고 있습니다. -I'm going to ask you to leave -나가달라고 할게 -You're ruining the books! -당신은 책을 망치고 있습니다! -Keep the damage under control! -피해를 통제하십시오! -Shut up!!! -닥쳐!!! -Put that back! -다시 넣어! -There's nothing to learn from that, you ignorant buffon. -그건 배울 게 없잖아, 이 멍청한 버폰아. -Don't dive into someone else's belongings! -다른 사람의 소지품에 뛰어들지 마세요! -You've destroyed an ancient artifact, imbecile! -넌 고대 유물을 파괴했어, 멍청아! -I wish you'd just stay out of trouble... -그냥 곤경에 빠지지 않았으면 좋겠어... -Gotchya. -갓챠. -You're going to hurt someone with that. -당신은 그것으로 누군가를 다치게 할 것입니다. -My books! -내 책들! -Stay down. -앉아. -Get back here-- -여기로 돌아가-- -Why you... -왜 네가... -Time for you to stay out of trouble. -당신이 문제에서 벗어날 시간입니다. -Come along. -따라와. -Stay put! -본래 있던 곳에 머무르다! -I'll be taking that back. -다시 가져갈게. -Click. -딸깍 하는 소리. +### Cyber Wrist Tether + +### A very short energy tether connecting your wrist cuffs together. + +### Desperate Struggle + +### Spend 20 WP to shake around violently. Has a chance to loosen restraints you are wearing, based on existing struggle progress. Spreading the effect over multiple restraints reduces the chance of loosening.|Requires 25% or more WP to activate. + +### None of your restraints will budge. + +### You thrash around with all your might. + +### You don't have the willpower left to struggle... + + + +### f + +### x + +### L + +### m + +### R + + + +### Fiber + +### Runes + +### Stock: + +### Inputs: + +### You slip off the conveyor! + +### The Summit + +### Back to Collection + +### Edit Restraints + +### Editing Restraints + +### Imprison in Furniture + +### Dropoff Prisoner + +### Module (Utility) + +### Module (Punishment) + +### ~~~ Collar ~~~ + +### Blindfold / Earplugs + +### Mask/Hood + +### Gag / Stuffing + +### Flat Gag + +### Wrists + +### Encasement + +### Mittens / Tape + +### Gloves / Tape + +### Vibes + +### Chastity Bra + +### Catsuit / Leotard + +### Rear Plug + +### Front Plug + +### Vibrator + +### Chastity Belt -No! I didn't do anything wrong... -아니야! 난 아무 잘못도 하지 않았어... -Don't punish me! Please! -나를 처벌하지 마십시오! 제발! -It's not my fault! -내 잘못이 아니에요! -It's your turn, dear~ -네 차례야, 얘야~ -Looks like I'm the patient now~ -나 이제 환자인가봐~ -I've been an unruly nurse... -난 제멋대로인 간호사였어... -It's time for your shot... -이제 총을 쏠 시간이야... -Why are you out of your cell? -당신은 왜 감방에서 나옵니까? -You need my help! -넌 내 도움이 필요해! -Those are supposed to keep you still you know... -그것들은 당신이 계속 알도록 하기 위한 것입니다... -You've got an appointment scheduled. -약속이 있으시군요. -Lets get you back in your jacket~ -재킷으로 돌아가자~ -Patients are not allowed to have toys. -환자는 장난감을 가질 수 없습니다. -Oh no you don't, sweetie! -오 안돼, 자기야! -Oof! Looks like you need to be taught a lesson! -으악! 교훈을 얻어야 할 것 같군요! -You can be cured if you just give up. -그냥 포기하면 치료될 수 있습니다. -You're going to ruin your progress~ -당신은 당신의 진행을 망칠거야 ~ -Oh my, that's dangerous! -어머, 위험해! -Patients are forbidden from casting spells! -환자는 주문을 거는 것이 금지되어 있습니다! -Keep those pretty hands to yourself, dear~ -그 예쁜 손은 혼자 간직하세요, 여보~ -Where'd you find that, dear? -어디서 찾았어, 얘야? -Silly girl, your illness can't be cured by a prayer. -어리석은 소녀여, 당신의 병은 기도로 고칠 수 없습니다. -That's not yours, sweetie~ -그건 네 것이 아니야, 자기야~ -You shouldn't break things, you know~ -부수면 안 돼, 알잖아~ -I knew something was amiss! -뭔가 잘못되었다는 걸 알았어! -You won't be getting away that easily, dear~ -그렇게 쉽게 도망가진 않을거야, 얘야~ -Won't be needing this~ -이건 필요없어~ -Hey, who said you could do that! -이봐, 누가 당신이 할 수 있다고! -I'm so excited! -너무 흥분돼! -A slippery one, aren't you? -미끄럽지 않니? -Tsk tsk. You can do better, dear~ -쯧쯧. 더 잘할 수 있어 얘야~ -Lets get you back to your cell! -감방으로 돌아가자! -So nice of you to join me! -저와 함께 해주셔서 정말 좋습니다! -Now let's see, good patients should be still... -이제 보자, 좋은 환자들은 가만히 있어야지... -A gift? Thank you so much! -선물? 정말 고마워! -You won't be getting out of that any time soon! -당신은 곧 그것에서 벗어나지 못할 것입니다! +### Thigh Cuffs +### Leg Bondage +### Shins +### Knees +### Toe Cuffs +### Toe Tie +### Heels +### Equipped: +### Click to Add +### Apply +### Raw Material: +### Free Prisoner +### Perk Unlocked: +### Latex Solvent +### You ready the bottle of Latex Solvent. +### A potent acid, capable of dissolving slime and latex. +### Deal 90 acid damage to target. Adds a 10% debuff to the cut and struggle resistance of latex restraints currently worn. +### Weakened by Latex Solvent (10%) +### You spill the solvent on yourself and loosen your latex bonds! +### You splash the ENMY with latex solvent! +### You can't use solvents on targets other than yourself while bound. +### Choose Palette +### Use Raw Material +### Restraint Palette +### Choose Restraint +### Def. Palette: +### Set All Palette +### Guests +### Assign to +### Remove from +### Can't assign to +### Remove from party to assign +### Imprison +### Opinion: +### Last Seen on Floor FLR, LOC +### Present in current level +### Captured by FCTN +### Captured by enemies +### Use 'Truss'em'Up' to edit restraints on this NPC +### The NPC needs tightening, but is unavailable right now +### Tighten non-conjured restraints +### NPC has escaped! +### NPC is likely to escape. +### NPC has managed to loosen her bonds. +### Any +### NPC Opinion: +### NPC Escape Status: +### NPC Binding: +### NPC Availability: +### Favorited: +### Rank: +### Minor +### Elite +### Miniboss +### Bound +### At Risk +### Escaped +### Imprisoned +### Positive +### Negative +### Non-Favorite +### Present +### Unavailable +### Auto Bind Interface +### AutoBind +### Assign to Facility +### Copy Restraints +### Paste Restraints from NME -You'll have to try harder if you want to discipline me, ma'am. -나를 징계하려면 더 열심히 노력해야 합니다, 부인. -I... don't have time for training right now, ma'am... -저는... 지금 훈련할 시간이 없습니다, 부인... -Did I do something wrong? -내가 뭐 잘못 했어요? -So you're the new boss, huh? -그래서 당신이 새로운 상사입니까? -Time for some 'training?' -'훈련'할 시간이야? -Wanna to have a chat? -채팅할래? -Looks like you've had too much time to yourself. -혼자 있는 시간이 너무 많은 것 같군요. -Why don't you come with me for a sec? -잠시 나랑 같이 가지 않을래? -Let me see your ID... -신분증 좀 보여주세요... -You have the right to remain silent. -당신은 묵비권을 행사할 권리가 있습니다. -No resisting arrest. -체포에 저항하지 않는다. -Who set you loose? -누가 널 풀어줬어? -I'll be confiscating that. -그건 제가 압수하겠습니다. -Aye, you're gonna need clearance for that, missy. -예, 그러려면 허가가 필요합니다, 아가씨. -You just made a big mistake. -당신은 방금 큰 실수를 저질렀습니다. -Need backup! -지원이 필요하다! -You're under arrest! -당신을 체포한다! -Magic use is restricted pursuant to IDC section 3 article 21a. -마법 사용은 IDC 섹션 3 조항 21a에 따라 제한됩니다. -Magic? That's where I draw the line. -마술? 그게 내가 선을 긋는 곳이야. -I've got an extra comfy cell for mages. -마법사를 위한 여분의 편안한 감방이 있습니다. -You're under arrest! -당신을 체포한다! -That's off limits for you! -그건 당신의 한계입니다! -Resorting to petty theft? How crude. -소소한 도둑질에 의존하는 것입니까? 얼마나 조잡한지요. -The goddesses have property rights too, you know. -여신들도 재산권이 있잖아요. -I'm gonna ask you to turn yourself in. -자진신고 부탁드리겠습니다. -Keep your hands where I can see 'em. -내가 볼 수 있는 곳에 손을 대세요. -That's a weapons violation. -그건 무기 위반입니다. -Assaulting an officer is a crime! -경찰을 폭행하는 것은 범죄입니다! -You're coming with me. -당신은 나와 함께 간다. -Resisting arrest won't get you anywhere. -체포에 저항하면 아무데도 가지 못할 것입니다. -Is that all you got? -그게 당신이 가진 전부입니까? -You have the right to remain silent. -당신은 묵비권을 행사할 권리가 있습니다. -Got you! -잡았다! -Hands behind your back. -등 뒤로 손. -I will conduct a more thorough search later on. -나중에 더 철저하게 수색하겠습니다. -Suspect is secure. -용의자는 안전합니다. +### No restraints left in inventory +### Paste to All! -I'm not in trouble, am I? -난 문제가 없지, 그렇지? -I'm not hiding anything, if you know what I mean... -나는 아무것도 숨기지 않을거야, 내 말 뜻을 알면... -Who are you looking for? Me? -누구를 찾고 있니? 나? -So... wanna hang out? -그럼... 같이 놀래? -It's not like I... LIKE you or something... -그건 내가... 너 같은 게 아니야... -I'm not following you! I'm just... -나는 당신을 따르지 않을거야! 난 그냥... -You look suspicious. -의심스러워 보여요. -You've got a nice pair of wrists~ -손목이 좋으시네요~ -You there! Let's have a talk. -저기요! 얘기 좀 합시다. -Looks like you're rusty. Haven't you ever done escape training? -녹슬었나 보군. 탈출 훈련은 안 해봤어? -I'm going to have some fun with you~ -너랑 좀 놀아줄게~ -Watch yourself, girl~ -조심해, 여보~ -Nice find. I'll take it. -잘 찾았다. 내가 가져갈게. -This place is off-limits for you. -이곳은 당신이 출입금지입니다. -Let's see how you like my special move! -내 필살기를 어떻게 좋아하는지 보자! -That's nothing compared to my technique! -내 기술에 비하면 아무것도 아니야! -You're in for it now! -당신은 지금 그것을 위해있어! -It's time for a display of skill! -실력을 발휘할 시간이다! -Fancy tricks? That's nothing. -멋진 속임수? 그건 아무것도 아니야. -Let me show you a real move... -진정한 움직임을 보여줄게... -True skill comes from the heart. Not something you hold in your hand. -진정한 기술은 마음에서 나온다. 손에 쥐는 것이 아니다. -She's not going to be happy about that... -그녀는 그것에 대해 행복하지 않을 것입니다 ... -Stop right there, criminal scum! -거기서 멈춰, 쓰레기 같은 범죄자들아! -Do you know what you've just done? -방금 무슨 짓을 했는지 아세요? -Finally, I've tracked you down! -마침내, 당신을 추적했습니다! -It's over. I've already won. -끝났다. 나는 이미 이겼다. -Wrong move, buddy. -잘못 움직였어, 친구. -I can't believe it... -믿을 수 없어... -You're too slow. -당신은 너무 느립니다. -...she's fast. -...빠르다. -Nothing personal. -개인적이지 않은 일. -This battle is over. -이 전투는 끝났다. -Get over here! -이리 와! -Too slow! -너무 느린! -I'll be taking that. -내가 가져갈게. -There's no way out. -나가는 길은 없어. +### OVERWRITE All! + +### Need Positive Opinion to Promote + +### Remove From Party Before Promoting? + +### Servant Cuddle Points: AMNT (+OPN opinion/cycle) + +### Prisoner Cuddle Points: AMNT (+OPN opinion/cycle) + +### Submissive prisoners and dominant servants add different amounts of opinion per cycle + + + +### Release Prisoners + +### Release + +### Summon + +### Already present in summit + +### NPC is unavailable + +### Only available in the Summit + + + +### Mark + +### Unmark + +### Mark ALL + +### Cancel Selection + +### Release Marked Prisoners! + +### Ransom Marked Prisoners for GP! + +### Ransom Value: GP + +### Current Gold: GP + +### n/a + +### [EXP: AMNT/LMT, +NXT next floor] Heel training reduces balance loss from heels. + +### Phase Dance active. Your next move is instant. + +### Combat Maneuver active. Your next move is instant. + +### The furniture space is occupied + +### Combat Maneuver: Your next move is instant. + + + +### Appointing managers increases the efficiency of other facilities. + +### Total Efficiency Boost: AMNT% + +### idle + +### (As you approach the statue, you hear a crumbling sound)|(The stone crumbles along the statue's slender frame)|(...revealing inside a beautiful, and extremely angry catgirl)|Who dares disturb my slumber?|I shall see to it that you receive your punishment! + +### Mysterious Statue + +### Select a Binding Slot + +### Cost: + +### Zoom set to PCNT% + +### You need free arms to tie others! + +### You can use the quick inventory to bind yourself or others + +### Error. Please screenshot and report. +### You can't wear that item, regrettably. -I'm not in trouble, am I? -난 문제가 없지, 그렇지? -I'm not hiding anything, if you know what I mean... -나는 아무것도 숨기지 않을거야, 내 말 뜻을 알면... -Who are you looking for? Me? -누구를 찾고 있니? 나? -So... wanna hang out? -그럼... 같이 놀래? -It's not like I... LIKE you or something... -그건 내가... 너 같은 게 아니야... -I'm not following you! I'm just... -나는 당신을 따르지 않을거야! 난 그냥... -You're a cute one~ -귀엽구나~ -You've got a nice pair of wrists~ -손목이 좋으시네요~ -Hey~! Let's have a talk. -야~! 얘기하자. -Looks like you need additional training. -추가 교육이 필요한 것 같습니다. -I'm going to have some fun with you~ -너랑 좀 놀아줄게~ -Watch yourself, girl~ -조심해, 여보~ -Nice find. I'll take it. -잘 찾았다. 내가 가져갈게. -This place is off-limits for you. -이곳은 당신이 출입금지입니다. -Bad pet! -나쁜 애완동물! -Looks like you're gonna need the extra special treatment~ -특별대우가 필요할 것 같군요~ -Now you've done it! -이제 다 했어! -Magic? Hah... -마법? 하아... -Such outdated practices... -이런 낡은 관행... -Your spells are nothing compared to technology. -당신의 주문은 기술에 비하면 아무것도 아닙니다. -Quit messing around. -장난 좀 그만 치워. -Don't even think about appealing to your goddess! -당신의 여신에게 어필할 생각은 하지도 마세요! -Stop right there! -거기서 멈춰! -It'll take you quite a while to pay off those damages! -그 손해를 갚으려면 꽤 시간이 걸릴거야! -Finally, I've tracked you down! -마침내, 당신을 추적했습니다! -Now there, good girl! -자, 착해! -Wrong move! -잘못 움직였어! -Get your paws off me! -나에게서 발 떼! -*scoffs* Could use some work~ -*비웃음* 작업을 좀 해야겠네요~ -Such speed! -이런 속도! -Nothing personal. -개인적이지 않은 일. -This battle is over. -이 전투는 끝났다. -Get over here! -이리 와! -Too slow! -너무 느린! -I'll be taking that. -내가 가져갈게. -There's no way out. -나가는 길은 없어. +### Must be stunned 3+ turns or fully bound +### Depends on another item to be added first -An outsider! -외부인! -Hide! -숨다! -Do not pursue me! -나를 쫓지 마! -I have come to study human customs. Teach me about Domination. -나는 인간의 관습을 연구하러 왔습니다. 도미네이션에 대해 가르쳐 주십시오. -The outsiders have such... strange and interesting practices. -외부인들은... 이상하고 흥미로운 관행을 가지고 있습니다. -You seem to have many skills. Teach me about... rope. -당신은 많은 기술을 가지고 있는 것 같습니다. 저에게... 밧줄에 대해 가르쳐 주세요. -Hello, Outsider. -안녕, 아웃사이더. -You look so... bland. -당신은 너무... 단조로워 보여요. -Outsiders are so picky about what they wear... -외부인들은 옷 입는 데 너무 까다롭다... -Tight and secure, as all things should be. -모든 것이 그렇듯이 단단하고 안전합니다. -I have just the thing in mind for you... -나는 당신을 위해 생각하고있는 것이 있습니다 ... -Let us put those hands away... -그 손 치우자... -Give back what you take. -받은 만큼 돌려줘. -You must remain here. -당신은 여기 남아 있어야 합니다. -Resorting to violence? -폭력에 의존? -Let us clash swords! -검을 치자! -*scoffs* -*비웃음* -You have brought judgement upon youself. -너 자신에게 심판을 가져왔다. -Your magic is that of a child. -당신의 마법은 아이의 마법입니다. -Imagine what you could learn in twelve lifetimes... -당신이 12번의 생애 동안 무엇을 배울 수 있을지 상상해보세요... -You rely on cheap gadgets. -당신은 값싼 장치에 의존합니다. -Do not defile the ancients. -고대인을 더럽히지 말라. -Give that back! -그걸 돌려줘! -The ancients are appalled. -고대인들은 경악했다. -The outsider has escaped! -외부인이 탈출했습니다! -Ready to reconsider? -재검토할 준비가 되셨습니까? -A classic blunder. -고전적인 실수. -You will regret that, outsider. -후회할 것이다, 이방인. -You get what you deserve. -당신은 당신이 마땅히 받아야 할 것을 얻습니다. -You didn't see that. -당신은 그것을 보지 못했습니다. -It looks like my skills are superior. -내 실력이 월등한 것 같군. -I will show you your place, outsider. -네 위치를 알려줄게, 아웃사이더. -You will come with me. -당신은 나와 함께 갈 것입니다. -I regret to inform you that your battle ends here. -당신의 싸움이 여기서 끝난다는 것을 알리게 되어 유감입니다. -You won't be needing that. -당신은 그럴 필요가 없습니다. -There we go. -우리는 거기에 갈. +### The conjured RSTN vanishes as you remove it. +### No free slots to bind in -I don't like the way you're looking at me! -나는 당신이 나를 보는 방식이 마음에 들지 않습니다! -Yes, I've got the secrets of nature right here... -그래, 바로 여기에 자연의 비밀이 있어... -Why don't you come after me? -왜 나를 따라오지 않지? -Why don't you teach me your... magic? -나에게 너의... 마법을 가르쳐주지 않니? -Guarding nature is a chore. Why don't we relax~ -자연을 지키는 건 귀찮은 일이야. 우리 쉬는 게 어때~ -Got something in mind for me? -생각나는 게 있어? -Well met, outsider! -잘 만났어, 아웃사이더! -You look so... bland. -당신은 너무... 단조로워 보여요. -Outsiders are so picky about what they wear... -외부인들은 옷 입는 데 너무 까다롭다... -Tight and secure, as all things should be. -모든 것이 그렇듯이 단단하고 안전합니다. -I have just the thing in mind for you... -나는 당신을 위해 생각하고있는 것이 있습니다 ... -Let us put those hands away... -그 손 치우자... -Give back what you take. -받은 만큼 돌려줘. -You must remain here. -당신은 여기 남아 있어야 합니다. -Resorting to violence? -폭력에 의존? -Let us clash swords! -검을 치자! -*scoffs* -*비웃음* -You have brought judgement upon youself. -너 자신에게 심판을 가져왔다. -Your magic is that of a child. -당신의 마법은 아이의 마법입니다. -Imagine what you could learn in twelve lifetimes... -당신이 12번의 생애 동안 무엇을 배울 수 있을지 상상해보세요... -You rely on cheap gadgets. -당신은 값싼 장치에 의존합니다. -Do not defile the ancients. -고대인을 더럽히지 말라. -Give that back! -그걸 돌려줘! -The ancients are appalled. -고대인들은 경악했다. -The outsider has escaped! -외부인이 탈출했습니다! -Ready to reconsider? -재검토할 준비가 되셨습니까? -A classic blunder. -고전적인 실수. -You will regret that, outsider. -후회할 것이다, 이방인. -You get what you deserve. -당신은 당신이 마땅히 받아야 할 것을 얻습니다. -You didn't see that. -당신은 그것을 보지 못했습니다. -It looks like my skills are superior. -내 실력이 월등한 것 같군. -I will show you your place, outsider. -네 위치를 알려줄게, 아웃사이더. -You will come with me. -당신은 나와 함께 갈 것입니다. -I regret to inform you that your battle ends here. -당신의 싸움이 여기서 끝난다는 것을 알리게 되어 유감입니다. -You won't be needing that. -당신은 그럴 필요가 없습니다. -There we go. -우리는 거기에 갈. +### Reaching Authority + +### If arm components are unavailable, you can now apply bindings with verbal components only. Increases range of Truss em Up by 2 and all CMD spells by 1 + +### Save Slot + +### Load Game + +### Load Code + +### Load Slot 0 + +### Load File + +### Save From Code + +### Delete? + +### Import to Slot + +### Invalid Data + +### No Data + + + +This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall. +여기가 일반 던전 입구입니다.|튜토리얼은 홀 시작 부분에 있습니다. +### This is the alternate entrance to the ancient tombs.|It's harder than the normal entrance. + +This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random. +던전의 이 부분은 혼돈의 여신에 의해 변경되었습니다.|당신이 통과할 영역의 순서는 완전히 무작위입니다. +Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure! +광활한 정글 안에 비밀 사원이 있다는 전설이 있습니다.|중절모를 쓰고 보물을 찾으세요! +### You've gotten lost in an ancient doll processing facility.|This journey features mostly lategame tilesets. + +### You've gotten lost inside an ancient temple to a kinky goddess.|Will you find your way out, or will you find yourself trapped even deeper? + +You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed! +당신은 폐허에서 헤매다 길을 잃었습니다. | 타일셋의 순서가 뒤바뀌었습니다! + + +### (Hard) + +### (Extreme) + +### Choose Save Slot: + +### Standard Route + +### Alternate Route + +### Temple Route + +### Jungle Route + +### Factory Route + +### Reverse Route + +### Chaos Route + +### Map Seed: + +### Will Overwrite NME! + +### Play Slot + +### Play (NO SLOT!) + +### Looks like you might be stuck. Try calling for help (bottom right of UI) + +### Backup +### Restore -Bug -벌레 -Bug -벌레 -Bug -벌레 -This is a bug, please report -버그입니다. 신고해 주세요. -This is a bug, please report -버그입니다. 신고해 주세요. -This is a bug, please report -버그입니다. 신고해 주세요. -Girl! -소녀! -Wear this! -이걸 입어! -Come here! -여기와! -... -... -Capture... -포착... -Need tighten! -긴축이 필요해! -Confiscate! -압수하라! -Confiscate!! -압수하라!! -Intruder! Alert! -침입자! 경보! -Fight girl! -싸워라! -Fight! -싸움! -Magic! -마법! -Wizard! -마법사! -Forbidden! -금지! -Forbidden! -금지! -Defiler! -수비수! -Confiscate!!! -압수!!! -Defiler!!! -수비수!!! -Intruder escape! -침입자 탈출! -Stay! -머무르다! -Got you! -잡았다! -Pain... -통증... -Fight! -싸움! -Come back! -돌아와! -Missed! -놓쳤어! -Capture!!! -포착!!! -Come here! -여기와! -Got her!!! -잡았다!!! -Take! -가져가다! -Secure! -안전한! +### Extra Options +### Preview without Armor -So this is what it's like... -그럼 이렇구나... -I believe I am feeling an emotion called 'fear.' -저는 '두려움'이라는 감정을 느끼고 있다고 생각합니다. -Stay back! I am not your toy. -비켜! 난 네 장난감이 아니야. -Teach me about 'domination.' -'지배'에 대해 가르쳐 주세요. -Allow me to learn by experience. -경험으로 배우게 해주세요. -As they say, 'do whatever you want to me.' -그들이 말하듯이 '당신이 나에게 원하는 대로 하세요.' -Come here, surface-dweller. I have things for you. -이리 오너라, 지상 거주자여. 네게 줄 것이 있어. -You should improve yourself. Come here. -자신을 개선해야 합니다. 이리 오세요. -You must learn our ways. -당신은 우리 방식을 배워야 합니다. -Yes... struggle and learn. -네... 고생하고 배우세요. -I will take you somewhere safe. -안전한 곳으로 데려다 줄게. -You need to learn your place. -당신은 당신의 위치를 ​​알아야합니다. -Do not take what is not yours. -네 것이 아닌 것은 취하지 말라. -You will not escape. -당신은 탈출하지 못할 것입니다. -Our ways are ancient! -우리의 방식은 고대입니다! -Your weapons are toys to us! -당신의 무기는 우리에게 장난감입니다! -So naive, surface-dweller. -너무 순진하군, 지상 거주자. -Our magic is older than your gods! -우리의 마법은 당신의 신보다 더 오래되었습니다! -You should learn our ways instead, surface-dweller. -대신 우리의 방식을 배워야 합니다, 지상 거주자여. -You have much learning to do. -당신은 할 일이 많습니다. -You are playing with child's toys! -당신은 아이의 장난감을 가지고 놀고 있습니다! -Do not plead to your gods. -당신의 신에게 간청하지 마십시오. -Give that back, surface-dweller! -그걸 돌려줘, 표면 거주자! -Your gods offend us. -당신의 신들은 우리를 화나게 합니다. -You will not escape, surface-dweller! -당신은 탈출하지 못할 것입니다, 표면 거주자! -You must not go. -가면 안 돼. -That was a failure. -그건 실패였어. -That was commendable. -그건 칭찬할 만하군. -I have you now, surface-dweller. -지금 당신이 있습니다, 지상 거주자. -You are a fast one. -당신은 빠른 사람입니다. -You seem out of practice. -당신은 연습이 부족한 것 같습니다. -I will take you to your place. -내가 당신을 당신의 장소로 데려다 줄 것입니다. -Come. -오다. -Stay down. -앉아. -I will take this. -이거 내가 가져갈게. -You will not escape. -당신은 탈출하지 못할 것입니다. -Meow!!! -야옹!!! -No! This kitty did nothing wrong! -안돼! 이 고양이는 아무 잘못도 없어! -Why are you looking at me like that?! -왜 날 그렇게 쳐다봐?! -I've been a bad kitty~ -나쁜 고양이였어~ -Punish me! -처벌해줘! -This kitty needs to be gagged~ -이 고양이는 재갈을 물려야 해~ -Come and be blessed~ -오셔서 복받으세요~ -Finally, some entertainment! -마지막으로 약간의 엔터테인먼트! -Join us, it'll be fun! -함께해요, 재미있을 거예요! -Keep struggling~ You'll understand. -힘내라~ 이해해줄게. -You will receive the blessing. -너는 복을 받을 것이다. -What are you doing? -뭐하세요? -Thanks for keeping things tidy. -정리해주셔서 감사합니다. -Where do you think you're going? -어디로 갈 것 같아? -By the blessed kitty! -축복받은 고양이에게! -Show us what you got! -당신이 가진 것을 보여주세요! -Who do you think you are? -당신은 누구라고 생각합니까? -Ah! Surface magic! -아! 표면 마법! -The human goddesses are frail. -인간 여신은 나약하다. -Such strange magic. -이상한 마법. -What are you going to do with that? -그것으로 무엇을 할 건가요? -Pay your respects some other way. -다른 방법으로 경의를 표하십시오. -Tomb robber! -도굴꾼! -By the blessed kitty! -축복받은 고양이에게! -Don't you want the blessing? -축복을 원하지 않습니까? -Come here~ -이리와~ -Hah! -하! -*hisses* -*히스* -*meows* -*야옹* -*frowns* -*찡긋* -I have catlike reflexes! -나는 고양이 같은 반사 신경을 가지고 있습니다! -Let me show you the blessing... -축복을 보여주마... -Come along. -따라와. -*grins* -*웃음* -You won't be needing this. -당신은 이것이 필요하지 않을 것입니다. -Quit struggling~ -고생 그만해~ +### FLR-DGN + +### (NG+AMNT) + + + +### Target must be vulnerable. + +### Target must be vulnerable or have casted a verbal spell. + +### Target must have casted a verbal spell. + + + +### Diggy diggy hole + +### Select a cracked wall. + +### You strike the earth! + +### Must select a cracked wall. + +### Your arms aren't free to swing the axe! + +### You strike the earth, but it is nothing but solid wall on the other side. + +### You strike the earth! It crumbles before you! + +### Click again to automatically mine the wall with your pickaxe. + +### The planar focus resonates with the teleportation magic! + +### The planar focusing crystal activates! Mana is drained, and turns into bindings! + +### The planar diffractor blocks the teleportation! + +### Set Character Palette + +### Reset all Keybindings + +### That item is blocked! You can't remove it. + +### min. + +### max. + +### bonus + +### penalty + +### You put it on, why would you want to take it off?~ + +### You'll need an ancient key to unlock the ancient-made collar. + + + +### Ancient Worshipper + +### The ancient worshipper repents of her ways. + +### The ancient worshipper's crystal restraints spread to you! (+RestraintAdded) + +### Crystals start to grow on one of your restraints! (DamageTaken) + +### The ancient worshipper mumbles at you for assistance! (DamageTaken) + +### Ancient Congregant + +### The ancient congregant repents of her ways. + +### The ancient congregant's crystal restraints spread to you! (+RestraintAdded) + +### Crystals start to grow on your restraints! (DamageTaken) + +### The ancient congregant mumbles at you for assistance! (DamageTaken) + +### Ancient Hierophant + +### The ancient hierophant repents of her ways. + +### The ancient hierophant's crystal restraints spread to you! (+RestraintAdded) + +### The ancient hierophant mumbles at you for assistance! (DamageTaken) + +### The crystals break off, revealing a keyhole and weakening the item. + +### Your distraction causes the crystals to grow back, encasing the lock again! + +### After popping the gag out of your mouth, it hangs loose around your neck. + +### The gag is now in your mouth. +### ERROR: Restraint does not exist. Did you forget to load mods? -Gasp! An adventurer! -헉! 모험가! -Don't let her catch you! -그녀가 당신을 붙잡게 두지 마세요! -You'll never trap my soul! -당신은 결코 내 영혼을 가두지 못할 것입니다! -You are quite the master of the elements! -당신은 요소의 주인입니다! -I could get used to this~ -이건 익숙해질 수 있어~ -Perhaps I could show you around... -어쩌면 내가 당신에게 주변을 보여줄 수 있을지도 몰라요... -What a beautiful one. -정말 아름다워. -I will take you back home~ -집에 데려다 줄게~ -You'd look great in my palace. -당신은 내 궁전에서 멋지게 보일 것입니다. -Are we having fun? -우리 재밌어요? -Get over here! -이리 와! -Humans like you make great toys. -당신과 같은 인간은 훌륭한 장난감을 만듭니다. -That won't help you. -그건 당신에게 도움이 되지 않을 겁니다. -You won't escape. -당신은 탈출하지 못할 것입니다. -Such feeble attempts. -이런 미약한 시도. -Humans are fun to play with. -인간은 가지고 노는 것이 재미있다. -Toying with me? I shall oblige! -나랑 놀아? 내가 따를게! -Cast your last pathetic spell, human. -한심한 마지막 주문을 걸어라, 인간아. -Your magic is weak, human. -당신의 마법은 약합니다, 인간. -It tickles, hehe! -간지러워, 헤헤! -Look what humans need to match only a fraction of our power! -인간이 우리 힘의 극히 일부에 필적하는 데 필요한 것이 무엇인지 보세요! -Our goddess doesn't need to listen to the likes of you! -우리 여신님은 당신 같은 말을 들을 필요가 없습니다! -Keep your hands out of our possessions. -우리 소유물에 손을 대지 마십시오. -Defiler! You will pay for your crimes! -모독자! 죄값을 치르게 될 것이다! -A game of chase? Fun. -추격 게임? 재미. -You're staying right here... -너 여기 계속 있어... -Hah! -하! -Get your hands off me! -나에게서 손 치워! -Pathetic. -불쌍한. -You're a fast one. -당신은 빠른 사람입니다. -Such feeble attempts. -이런 미약한 시도. -It's over, human. You've lost. -끝났어, 인간. 넌 졌어. -There is no escape. -탈출은 없다. -You are beneath me. -넌 내 밑에 있어. -Nice gear. I'll take it. -멋진 장비. 내가 가져갈게. -Try getting out of that! -그것에서 벗어나보십시오! +### Gag Necklace +### A cute accessory for those who wish to (not) make a statement. -Not the edging training! Anything but that! -가장자리 수련 말고! 뭐든지! -Forgive me! -용서 해줘! -No! Don't punish me! -안돼! 벌주지마! -You look like you've got style... -당신은 스타일이 있는 것 같군요... -I could learn a thing or two from you! -나는 당신에게서 한두 가지를 배울 수 있습니다! -Mind if I just, um, watch? -그냥, 음, 지켜봐도 될까요? -Look, a new recruit! -봐봐, 신병이야! -I'll teach you a thing or two! -내가 한두 가지 가르쳐 줄게! -Let's test your manners~ -매너를 시험해 보자~ -Having fun there? -거기 재미있어? -It's time for your training. -당신의 훈련 시간입니다. -You need to be taught some manners, maid. -예절 좀 가르쳐야지, 메이드. -Good girl. I'll take that to the storage room. -잘했어. 창고로 가져갈게. -I'll be taking those. -내가 가져갈게. -Oh, you're approaching me? -아, 나한테 접근하는거야? -You've gotten yourself into a big mess. -당신은 큰 혼란에 빠졌습니다. -You're going to regret that. -당신은 그것을 후회하게 될 것입니다. -A maid uses magic only when told! -메이드는 말만 하면 마법을 쓴다! -I look forward to plugging that mouth of yours. -당신의 입을 막는 것을 기대합니다. -How unruly... What a pain. -얼마나 무질서한가... 얼마나 고통스러운가. -Put that away! -그거 치워! -That's off limits. You need to be punished! -그건 금지야. 벌을 받아야 해! -Thief! Get her! -도둑! 잡아! -Yikes! I'm calling backup! -이크! 백업을 부를게! -Found you! -당신을 발견! -Hold still~ -가만히 있어~ -Your tricks won't work on me. -당신의 트릭은 나에게 통하지 않을 것입니다. -Oof... You got me. -으악... 당신이 날 잡았다. -It's over. -끝났어. -Nice one. -좋다. -You missed! -놓쳤어! -I'll hand you over when I'm done with you. -끝나면 넘겨줄게. -Get over here! -이리 와! -Hmph. Stay down. -흠. 가만히 있어. -Give me that. -그걸 줘. -'Click!' -'딸깍 하는 소리!' +### Functions as a collar. +### No mod info! -I'm sorry! I didn't mean to break that vase! -미안해! 그 꽃병을 깨려고 한 건 아니었어! -I won't do it again, I swear! -다시는 그러지 않겠다, 맹세한다! -Please no! I don't want the edging training again! -제발 안돼! 다시는 테두리 훈련을 원하지 않아! -Don't you need a bodyguard, miss? -경호원이 필요하지 않으세요, 아가씨? -Won't you train me, miss? -저를 훈련시키지 않으시겠습니까, 아가씨? -I've been a bad girl... -나쁜 여자였어... -Miss, your uniform is dirty... -아가씨, 교복이 더럽네요... -Why hello miss... -왜 안녕 미스... -Let me fix your outfit... -옷 좀 고쳐주세요... -Hmm, do I need to tighten those? -흠, 이것들을 조여야 합니까? -M-miss... I was told to bring you somewhere... -여보...어디로 데려가라고 했는데... -Umm, miss, you're supposed to report to the head maid... -음, 아가씨, 메이드장에게 보고해야지... -Thanks for picking up. -데리러 와줘서 고마워. -I'll take those to the head maid! -내가 그것을 메이드장에게 가져갈게! -Who are you!? -누구세요!? -Oh no! -안 돼! -Stop! -중지! -Miss! You're not allowed to cast that! -미스! 당신은 그것을 캐스팅 할 수 없습니다! -Miss, I have to report that! -아가씨, 신고해야 해요! -Magic! -마법! -Eeep! -윽! -Miss, that's reserved for the head maid! -아가씨, 그건 메이드장 전용입니다! -Thief! I'm reporting this! -도둑! 신고할게! -Oh no! I have to report this! -안돼! 이건 신고해야 해! -Oh no! -안 돼! -I got you! I got you! -내가 잡았어! 내가 잡았어! -Try that again! -다시 해봐! -Remember your training, remember your training... -훈련을 기억해, 훈련을 기억해... -You're filthy! -더러워! -Hold still... -가만히 있어... -Stay calm... -침착해... -I'll lead you to your cell... -당신을 감방으로 안내하겠습니다... -Come on! -어서 해봐요! -Got you! -잡았다! -I need to take this... -이거 가져가야지... -I'm sorry... -죄송합니다... +### Wrong patch + +### VERY Outdated! + +### Outdated! + +### Check dependencies! + +### Check compatibility! + +### Misc Error + +### v + +### Magical disenchantment suspends your living collar for AMNT turns + +### (will add AMNT TPE binding) + +### Hardlight + +### Knocked Out + +### Vine + +### Saving... + +### Game Saved + +### ENMY escapes from the ITMN! + +### ENMY escapes from the ITMN and the item vanishes. + +### ENMY unlocks the ITMN! + +### The conjured ITMN vanishes as it comes off. + +### AMNT restraints added since last tick~ + +### AMNT restraints confiscated since last tick~ + +### You have no restraints in storage. Go to the Summit to deposit restraints. + +### Back to Facilities + +### Your Inventory + +### Warden's Storage + +### Store 1 ITMN + +### Take 1 ITMN + +### Store 5 ITMN + +### Take 5 ITMN + +### Store ALL ITMN + +### Take ALL ITMN + +### Store ALL-1 ITMN + +### Take ALL-1 ITMN + +### Take Everything + +### Deposit All + +### Auto-loot found + +### (not picked up) + +### Automatically Flip When Moving + +### Go to the summit to deposit restraints + + + +### AMNTx damage when SP is over 50% + +### Barrage of Barrier Orb +### Barrier Orb -I'll be heading out... -난 나갈게... -Looks like I'll be taking my leave. -나 이만 물러날 것 같네. -Looks like I'll be reporting you~ -신고할 것 같네요~ -I was wrong about you. -당신에 대해 내가 틀렸어. -Perhaps you should take my place. -어쩌면 네가 내 자리를 맡아야 할지도 몰라. -Why don't you try being in charge? -당신이 책임자가 되어보는 건 어때요? -Come now, it's time for training. -자, 훈련할 시간이다. -Do you need to be punished? -처벌을 받아야 합니까? -It's time for a test. -시험 시간이야. -A maid remains quiet until asked. -메이드는 물을 때까지 조용히 있습니다. -Come with me. I will train you personally. -나와 함께 가자. 내가 너를 개인적으로 훈련시킬 것이다. -You need to work on your ladylike manners. -당신은 당신의 숙녀다운 매너에 노력해야 합니다. -Good girl, finding lost items. -착한 소녀, 분실물 찾기. -I do not give you permmission to leave. -나는 당신에게 떠나는 것을 허락하지 않습니다. -Do you know who I am? -내가 누군지 알아? -You need to learn some manners! -매너를 배워야 해! -How rude! -얼마나 무례! -There is a more proper way to cast spells... -주문을 거는 더 적절한 방법이 있을 텐데... -Perhaps you need to receive some gag training. -아마도 개그 훈련을 받아야 할 것 같습니다. -You lack discipline, and self-control. -당신은 규율과 자제력이 부족합니다. -Do not use what belongs to others. -다른 사람의 것을 사용하지 마십시오. -A good maid pleads only to her mistress. -좋은 시녀는 여주인에게만 간청합니다. -Do not take what is not yours. -네 것이 아닌 것은 취하지 말라. -I will personally attend to your act of disgrace. -나는 당신의 불명예를 개인적으로 돌볼 것입니다. -An unruly pest. -제멋대로인 해충. -Checkmate. -장군. -Like a novice. -초보자처럼. -...Nice one. -...좋다. -Enjoy yourself, dear~ -즐거워라, 얘야~ -Hmph. Nice. -흥. 좋다. -Not even close. -근처에도 안. -I'll be taking you to your cell personally~ -직접 감방으로 모셔다 드릴께요~ -Amateur. -아마추어. -Bad girl. You need discipline. -나쁜 여자야. 규율이 필요해. -Hand it over. -그거 넘겨. -I'll be keeping the keys. -열쇠는 내가 맡을게. +### Barrage of Sealing Talisman -Looks like I've earned some punishment... -벌을 좀 받은 것 같은데... -I'll turn you into a newt! If you don't stop me... -널 도롱뇽으로 만들어줄게! 날 말리지 않으면... -Don't let me get away~ -떠나지마~ -Perhaps you're not so bad after all~ -어쩌면 당신은 그렇게 나쁘지 않을지도 몰라요~ -Why don't you have a little fun... with me? -나랑 좀 놀아주는 게 어때? -Come and get me... -이리와 나를 데리러... -I must say, you've got me under your spell~ -내가 말해야 겠어, 당신은 당신의 주문에 걸렸습니다 ~ -Why aren't you a pretty one... -왜 안 예뻐... -I've got to kiss those tender lips of yours~ -그 부드러운 너의 입술에 키스해야겠어~ -Having fun, little lady? -재미있니, 아가씨? -I'm going to have so much fun with you! -나는 당신과 함께 너무 재미있을 것입니다! -Look at you, pretty and free! -당신을 봐, 예쁘고 자유로워! -Must have misplaced it... -잘못 놓았나봐... -Those are mine! -그건 내 꺼야! -That's not very nice! -별로 좋지 않아! -Curse you! -당신을 저주! -I'll turn you into a newt! -널 도롱뇽으로 만들어줄게! -Oh, so you've got a spellbook. What's it written in, curse-ive? -아, 마법책이 있군요. 뭐라고 적힌 건가요, 욕설? -Snap, crackle, and pop! -찰칵, 딱딱, 펑! -Looks like I need to seal that foul mouth of yours. -그 더러운 입을 봉인해야 할 것 같군. -I recognize that thing you're holding! -당신이 들고 있는 것을 알아요! -You'll be praying for freedom soon, my dear~ -너는 곧 자유를 위해 기도하게 될거야, 얘야~ -Oh, breaking into my collection, are you? -오, 내 수집품에 침입한 거지? -Even I wouldn't do such a thing! -나도 그런 짓은 안 할거야! -Witch way to the jail cell, you say? -감옥으로 가는 마녀의 길이라고요? -Hold still~ -가만히 있어~ -Try that again! -다시 해봐! -Hands off! -손 떼! -Now I got you. -이제 내가 잡았어. -Hmph. -흠. -You've got a lot to learn~ -배울게 많구나~ -You'll be coming with me! -당신은 나와 함께 갈거야! -I'll be yanking your chain~ -체인을 잡아당겨줄게~ -Not so fast~ -그렇게 빠르지 않아~ -I'll be taking this~ -이거 가져갈게~ -EnemyName:There, nice and tight dear~ -EnemyName:저기 착하고 빡빡한 얘야~ +### Self Unlock -I promise I'll be back later! -나중에 다시 오겠다고 약속할게! -I didn't do anything wrong! -나는 아무 잘못도 하지 않았어! -I won't get in your way, miss! -방해하지 않겠습니다, 아가씨! -Take me as your student, miss! -저를 학생으로 받아주세요, 아가씨! -Won't you teach me? -가르쳐주지 않을래? -I wish to study under your wisdom! -당신의 지혜 아래에서 공부하고 싶습니다! -Mind if I play with you a bit? -나랑 좀 놀아도 될까요? -Oooh! My new friend! -오오! 내 새 친구! -My mistress told me to give you a good time... -내 여주인공이 너에게 좋은 시간을 주라고 했어... -Hehe, having fun? -헤헤, 재미있어? -Miss, won't you come? -아가씨, 안 오세요? -Hey, you're free to play, right~? -야, 놀아도 상관없지~? -Hey, uh, give that back... (blushes) -이봐, 어, 돌려줘... (얼굴을 붉히며) -Um, you have to return those! -음, 그것들을 돌려줘야 해! -Eeep! -윽! -Help me! -도와주세요! -Somebody help! -누가 도와줘! -A battle of wits, huh? -지력의 싸움, 응? -You underestimate my power! -넌 내 힘을 과소평가하고 있어! -I'll show you true skill! -진정한 실력을 보여주겠어! -Please put that down... -그거 내려주세요... -Hey, I used to pray at that shrine... -저기, 그 신사에서 참배를 했었는데... -Hey, my mistress won't appreciate you taking those... -이봐, 내 여주인은 당신이 그것들을 가져가는 것을 좋아하지 않을 것입니다... -The horror! -공포! -You're supposed to be in jail! -넌 감옥에 있어야 해! -Stay with me please. -제발 나와 함께있어. -I got it! -알겠어요! -Be gentle, please! -부드럽게 해주세요! -I did it! -내가 해냈어! -Hey, no fair! -이봐, 공평하지 않아! -Close one! -하나 닫아! -Come along~ -이리와~ -Come here please! -여기에, 제발! -Hah! I'm a genius! -하! 난 천재야! -I need to take this... -이거 가져가야지... -I'm sorry about this... -미안해, 이거... +### Crystal Storm + +### Shadow Walk + +### Your ITMN1 inflates inside your mouth to become a ITMN2! + +### Bigger Ball Gags + +### Smaller ball gags are replaced by their larger versions. + +### Screen effect when letting go + +### Screen flash when distracted + + + +### Essentia Aliquam + +### Aliquam Orbis + +### Potio Requiem + +### Ultimate Glue no. 91 + +### Slime Encapsulation + +### Judgement Bolt + +### Flame Bolt + +### Electrification + +### Charming Orb + +### Freezing Orb + +### Heavy Ordnance + +### Entangle + +### Blessed Orb + +### Slimy Sphere + +### Rubberization Protocol + +### Latex Encapsulation + +### Red Slime Experiment + +### Encasement Protocol + +### Electrical Discharge + +### Icebolt + +### Bubble Burst + +### Electric Orb + +### Chain Bolt + +### Skeleton Minion + +### Skeleton Minions + +### Flummoxing Orb + +### Crystallize + +### Capture Device + +### Sedative + +### Slime Barrage + +### Seal of the 5th Era + + + +### Healing Flash + +### Undead Frenzy + +### Command Word + +### Rope Ambush -Sticks and stones may break my bones... but you'll never catch me! -막대기와 돌이 내 뼈를 부러뜨릴 수 있지만... 당신은 결코 나를 잡지 못할 것입니다! -Got a bone to pick with me? -나와 함께 고를 뼈가 있습니까? -I must make my escape! -난 탈출해야 해! -...I need a strong hand. -...강한 손이 필요해. -Ouch, I hit my funny bone... won't you help? -아야, 내 웃긴 뼈를 때렸어... 도와주지 않을래? -Bone appetit~ -식탐~ -I've got a bone to pick with you! -나는 당신과 함께 골라야 할 뼈가 있습니다! -Hey bonehead! What's up? -이봐 멍청아! 무슨 일이야? -Finally, something to toy with after working myself to the bone... -마지막으로, 뼛속까지 노력한 후에 가지고 놀 수 있는 것이... -I find your struggling quite humerus. -나는 당신의 고군분투하는 상완골을 찾습니다. -Come with me, I'll take you someplace grand... -나랑 같이 가, 내가 널 멋진 곳으로 데려다 줄게... -Looks like I get a bone-us! -내가 뼈를 얻는 것 같아! -You're getting under my skin... -당신은 내 피부 아래 점점 ... -Thought you were making a marrow escape, eh? -당신이 골수 탈출을 하고 있다고 생각했습니까? -You numskull! -이 numskull! -You've got a lot of spine to fight me! -당신은 나와 싸울 수 있는 많은 척추를 가지고 있습니다! -You don't have a leg to stand on... -당신은 서있을 다리가 없습니다 ... -Magic... I feel it in my bones... -마법... 뼛속까지 느껴져... -You've made a grave mistake! -당신은 중대한 실수를 저질렀습니다! -Your spells are pathetic, I'm cracking up~ -너의 주문은 한심하다, 내가 깨겠다~ -You've made a bone-a fide error. -당신은 뼈아픈 실수를 저질렀습니다. -Defiling the shrines... that's where I jaw the line! -사당을 더럽히다니... 내가 턱을 괴는 곳이야! -There's a skele-tonne of things in there and none of them are yours! -거기에는 해골 톤의 물건이 있고 그 중 어느 것도 당신 것이 아닙니다! -You're bad to the bone... -넌 뼛속까지 나빠... -Looks like you're bone to be wild, eh? -당신은 야생에 뼈가있는 것 같습니까? -You're mine! -넌 내 꺼야! -Hah! -하! -That'll leave a mark... -그럼 자국이 남겠지... -You're mine now! -넌 지금부터 내거야! -Hold still you bonehead! -가만히 있어라 이 멍청아! -Hah! Such nerve... -하! 이런 신경질... -You're coming with me! -당신은 나와 함께 간다! -Get over here! -이리 와! -Not so slippery now! -지금은 그렇게 미끄럽지 않아! -I'll be confiscating that. -그건 제가 압수하겠습니다. -Make sure that's nice and tight... -그게 멋지고 빡빡한지 확인하세요... +### Defensive Charm -Scary... -무서운... -Run... Away... -도망쳐...저리... -*Giggles* -*킥킥* -Play... with... me... -나랑 놀자... -Please... -제발... -Command... Me... -사령부... 나... -Cute... Girl... -귀여운 소녀... -Helpless... -어찌할 수 없는... -Take... -가져가다... -Mine... -내 거... -Shiny... -빛나는... -*giggles* -*킥킥* -Brains... -두뇌... -Squishy... -스퀴시... -Rude... -무례한... -Mean... -평균... -Ouch... -아야... -Pretty... Lights... -예쁜... 조명... -Sparkles... -반짝반짝... -It... Burns... -불타고있다... -Hey... -여기요... -Defiler... -수비수... -Thief... -도둑... -Intruder... -침입자... -Give... Hug... -안아 주다... -...Hug... -...껴안다... -Checkmate... -장군... -It's... Cold... -춥습니다... -Friend... -친구... -Come... Back... -돌아와... -He... hee... -그...히... -...Prisoner. -...죄인. -...Get over here... -...이리 와... -...Got you. -...잡았다. -...Shiny... -...빛나는... -...Secure... -...안전한... +### Shield the Witch -The weapon requires power from an Ancient Crystal to function. -무기가 작동하려면 고대 수정의 힘이 필요합니다. -Target an enemy: Attack with Dragonslaver. Target a tile: Spend 8 charge to launch binding belts -적을 대상으로 지정: Dragonslaver로 공격합니다. 타일을 목표로 하십시오: 바인딩 벨트를 시작하려면 8 충전을 소비하십시오. -25 charge to enter Slime Form for 25 turns, and create slime around yourself. -25턴 동안 슬라임 폼에 들어가고, 주변에 슬라임을 생성하려면 25 충전하세요. -50 charge to reduce mana cost of next fire, earth, air, and water spell by 50 (once for each element) -50 충전으로 다음 불, 대지, 공기, 물 주문의 마나 비용을 50으로 줄입니다(각 요소당 한 번) -25 charge to disarm a target for 8 turns, rendering them unable to attack. -25 충전으로 대상을 8턴 동안 무장 해제하여 공격할 수 없게 만듭니다. -5 charge (+2.5 per charge) to channel and fire a beam that deals 30 + 3/charge electric damage, or 90 at max charge. -30 + 3/충전 전기 손상 또는 최대 충전 시 90의 전기 피해를 입히는 빔을 채널링하고 발사하려면 5회 충전(충전당 +2.5회)합니다. -5 charge to fire a blast that deals 25 electric damage. -25의 전기 피해를 주는 폭발을 발사하려면 5회 충전하십시오. -50 charge to fire an arrow that enrages a target. -표적을 화나게 하는 화살을 발사하려면 50회 충전해야 합니다. -50 charge to enter a frenzy for 10 turns, attacking twice per turn. -50회 충전 시 10턴 동안 광란상태 진입, 매 턴 2회 공격. -Create a '+' shaped pool of slime that deals 35 glue damage per hit -타격당 35의 접착제 피해를 입히는 '+' 모양의 슬라임 웅덩이를 만듭니다. -Ignite torches and nearby objects -횃불과 주변 물체에 불을 붙입니다. -Ignite torches and nearby objects -횃불과 주변 물체에 불을 붙입니다. -Ignite torches and nearby objects -횃불과 주변 물체에 불을 붙입니다. -Ignite torches and nearby objects -횃불과 주변 물체에 불을 붙입니다. +### Tracer Rounds -Toggles -토글 -Locks and Restraints -잠금 및 구속 -General Combat -일반 전투 -Kinks and Preferences -꼬임과 선호도 -Damage and Resists -손상 및 저항 -Wizardry and Sorcery -마법과 마법 -Devious Threats -악의적인 위협 -World Generation -세계 세대 -Starting Scenario -시나리오 시작 -Unlockable -잠금 해제 가능 +### The Spookening -You hand over your weapon reluctantly... -마지못해 무기를 내밀고... +### The Muffling -(Leave) -(떠나다) -(...) -(...) +### Conjure Tickle Hands -(The SPEAKER frowns)|Don't lie to me. -(화자가 눈살을 찌푸린다)|거짓말하지 마. -(The SPEAKER looks puzzled)|That doesn't seem right... -(발표자가 의아해 보인다)|그건 옳지 않은 것 같은데... -(The SPEAKER chuckles)|What a cute lie. -(발표자 웃음)|정말 귀여운 거짓말이군요. -(The SPEAKER beeps)|Vital signs indicate dishonesty. -(SPEAKER 신호음)|활력 징후는 부정직함을 나타냅니다. +### Conjure Gags -(The SPEAKER furrows her brow)|...Excuse me? -(SPEAKER 가 눈썹을 찌푸리며)|...실례합니다. +### Scriptum Ferri -(The SPEAKER tilts her head)|Right, sorry. -(SPEAKER 가 고개를 기울인다)|맞아, 미안해. -(The SPEAKER blushes deeply)|I'm... I'm sorry! Please carry on... -(SPEAKER 가 얼굴을 붉히며)|저...미안합니다! 계속해 주세요... -(The SPEAKER smiles)|Keep up the good work, girl. -(SPEAKER 가 웃는다)|계속 잘 하세요, 아가씨. -(The SPEAKER beeps)|Vital signs indicate honesty. Carry on. -(SPEAKER 신호음)|활력 징후는 정직함을 나타냅니다. 계속하십시오. +### Scrimptum Habena -(The SPEAKER smiles)|Good girl. -(SPEAKER 가 웃는다)|잘했어. -(The SPEAKER smiles)|That's a good girl. -(SPEAKER 가 웃는다)|착한 여자야. -(The SPEAKER smiles)|Thank you. -(SPEAKER 미소)|감사합니다. -(The SPEAKER beeps)|Thank you for complying. -(SPEAKER 가 삐 소리를 낸다)|따라주셔서 감사합니다. +### Scriptum Ligni -(The SPEAKER frowns)|Looks like you'll need to be punished. Get her! -(SPEAKER 가 눈살을 찌푸린다)|처벌을 받아야 할 것 같습니다. 그녀를 잡아요! -(The SPEAKER looks Embarrassed)|Then... then... uh... someone stop her! -(화자가 당황한 듯)|그럼...그럼...어...누군가 말려! -(The SPEAKER grins)|Then allow me to personally show you the rules. -(SPEAKER 가 웃는다)|그럼 제가 개인적으로 규칙을 보여드리겠습니다. -(The SPEAKER beeps)|Subject is resisting. Begin capture protocol. -(SPEAKER 가 삐 소리를 냄)|피험자가 저항하고 있습니다. 캡처 프로토콜을 시작합니다. +### Electric Storm +### Flower Spores -(The SPEAKER calls at you)|You're not supposed to be carrying a weapon.|Hand it over. -(SPEAKER 가 당신을 부릅니다)|당신은 무기를 들고 있으면 안 됩니다.|이리 주세요. -(The SPEAKER approaches you)|Contraband detected. Initiating confiscation.|Please comply. -(SPEAKER 가 다가온다)|밀수품이 감지되었습니다. 몰수를 시작합니다.|따라주세요. -Yes, miss... (Currently held weapon will be lost) -네, 아가씨... (현재 들고 있는 무기는 사라집니다) -Mmph... (Nod politely) (Currently held weapon will be lost) -음... (공손하게 고개를 끄덕인다) (현재 들고 있는 무기는 사라진다) -No, I refuse! -아니요, 거절합니다! -Mmph! (Shake your head) -음! (고개를 흔든다) -The Head Maid asked me to retrieve it. -교장님께서 회수해 달라고 하셨어요. -My mistress needs it for a special spell. -내 여주인이 특별한 주문을 위해 필요해. -It is an offering to the goddess of Elements. -원소의 여신에게 바치는 제물입니다. -It's just a prop for a costume. -의상 소품일 뿐이야. -Are you questioning me? I'm a dragonslayer. -나한테 묻느냐? 나는 용사냥꾼이다. +### Magnum Opus + +### Latex Integrator + +### Forcefield Protocol + +### Motivation + +### Drone Assault + +### Tape Drone Assault + +### *summon slime mold* + +### Vine Growth + +### Flower Growth + +### Thorn Whip + +### Crystal Surge + +### Shadow Shroud + +### Shadow Step + +### Ice Wall + +### Armor Up + +### Crystal Growth + +### Shadow Orb + +### Earthfield + +### Soul Beam + +### Summon Shadows + +### Observation + +### Conjure Latex Restraint + +### Rope Sealing + +### Slime Minion + +### Magical Wrappings + +### Capture Bolt -(Continue...) -(계속하다...) +### Training Protocol -(The SPEAKER approaches you in your cell)|Well well, what do we have here? A new guest?|Perhaps I should give you a rundown of your new life~ -(SPEAKER 가 당신의 감방에서 당신에게 접근합니다)|글쎄요, 우리는 무엇을 가지고 있습니까? 새로운 손님?|당신의 새로운 삶에 대한 개요를 알려줘야 할 것 같습니다~ +### Motivation Protocol -(The SPEAKER chuckles)|Don't tell me you seriously think we're letting you go?|You broke the rules, ignored the warnings.|Your new job is to make the people here happy. -(발표자 웃음)|우리가 당신을 놓아줄 거라고 진지하게 생각하지 말아요?|당신은 규칙을 어겼고 경고를 무시했습니다.|당신의 새로운 임무는 여기 사람들을 행복하게 만드는 것입니다. -(The SPEAKER chuckles)|Hah, looks like you've got lots of training ahead of you.|Soon you'll have too much pleasure for your own good~ -(SPEAKER 웃음)|하, 앞으로 훈련이 많이 남았나 보군요.|곧 당신은 자신의 이익을 위해 너무 많은 즐거움을 갖게 될 것입니다~ -(The SPEAKER giggles)|Don't worry, you'll come to enjoy it soon enough. -(SPEAKER 낄낄거림)|걱정마, 곧 즐기게 될거야. -(The SPEAKER smiles)|Heh, looks like you'll be fitting right in. -(SPEAKER 가 웃는다)|헤, 잘 어울릴 것 같군요. +### Conjure Tickle Hand -(The SPEAKER chuckles)|You're probably wondering what's in store for you.|It's simple: You behave and do as you're told.|Eventually you will get to roam around.|Don't you dare try to steal anything. -(발표자 웃음)|당신은 아마 당신을 위해 무엇이 준비되어 있는지 궁금할 것입니다.|그것은 간단합니다: 당신은 당신이 시키는 대로 행동하고 행합니다.|결국 당신은 돌아다니게 될 것입니다.|감히 훔치려 하지 마십시오 아무것. -(The SPEAKER chuckles)|Babe, you're going to be locked up for a looooong time. -(발표자 웃음)|베이비, 당신은 아주 오랜 시간 동안 감금될 것입니다. -(The SPEAKER giggles and returns to her work) -(SPEAKER 가 낄낄거리며 일하러 돌아간다) -(The SPEAKER smiles)|Wonderful. You'll be meeting your new friends soon! -(SPEAKER 가 웃는다)|멋지네요. 곧 새로운 친구들을 만나게 될 거에요! +### Conjure Locks -(New life?) -(새로운 삶?) -(Let her continue) -(계속하자) +### Chainstorm -(Pout at her) -(그녀에게 삐죽) -You can't make me do that! -당신은 내가 그렇게 할 수 없습니다! -(Scream into your gag) -(개그 속으로 비명) -That sounds alright... -괜찮아요... -(Moan into your gag and giggle) -(재갈을 물고 신음하며 킥킥 웃는다) +### Chain Wall -(Glare at her) -(그녀를 노려본다) -Let me out this instant! -이제 당장 나가게 해줘! -(Scream into your gag uselessly) -(쓸데없이 개그에 소리쳐) -I will be a good girl! -나는 좋은 여자가 될거야! -(Giggle and wiggle your body) -(킥킥 몸을 흔들며) +### Binding Ribbons +### Scriptum Limus +### Scriptum Glacis -(The SPEAKER approaches you in your cell)|Back again, are we? Silly girl.|You know we don't take no for an answer. -(SPEAKER 가 당신의 감방에서 당신에게 접근합니다)|다시 돌아왔습니까? 바보 같은 여자.|우리는 대답을 거절하지 않는다는 것을 알고 있습니다. +### Scriptim Vinea -(The SPEAKER smiles back)|Oh, this is a game to you?|Then perhaps I should make it funner for you...|(She leaves and returns with some toys...)|Now hold still! -(화자가 미소를 지으며 대답한다)|오, 이건 너에게 게임이야?|그럼 내가 너를 위해 더 재미있게 만들어야 할 것 같은데...|(그녀는 장난감을 가지고 떠났다가 돌아온다...)|이제 가만히 있어! -(The SPEAKER frowns)|I know exactly what you need... -(SPEAKER 가 눈살을 찌푸린다)|당신에게 필요한 것이 무엇인지 정확히 알고 있습니다... -(The SPEAKER smiles back)|I'm glad you're enjoying yourself.|However, your behavior is still unacceptable.|You need to learn some respect. -(SPEAKER 가 미소를 지으며)|즐거우셨다니 다행입니다.|하지만, 당신의 행동은 여전히 ​​용납할 수 없습니다.|당신은 약간의 존경심을 배울 필요가 있습니다. -(The SPEAKER chuckles)|Looks like you're enjoying your restraints?|Let's make them tighter, shall we? -(SPEAKER 가 웃는다)|자제를 즐기는 것 같나요?|자제를 더 빡세게 합시다, 그렇죠? -(The SPEAKER shrugs)|Well, I hope you learn. -(SPEAKER 가 어깨를 으쓱한다)|글쎄, 나는 네가 배우기를 바란다. -(The SPEAKER looks greedy)|Oh, you have an idea? -(SPEAKER 가 욕심이 많아 보인다)|오, 아이디어가 있어? -(The SPEAKER nods)|I'll put in a good word with you~ -(SPEAKER 가 고개를 끄덕인다)|좋은 말을 해줄게~ -(The SPEAKER shakes her head)|Babe, you know who's going to be blamed|if a max-security prisoner escapes? -(SPEAKER 가 고개를 젓는다)|자기야, 누가 비난을 받을지 알아|만일 최고 보안 죄수가 탈출하면? +### Scriptum Infernus -(Giggle and smile) -(낄낄 웃으며) -Don't you mean 'more fun'? -'더 재미있다'는 뜻이 아닙니까? -(Giggle and moan) -(낄낄거리며 신음) -(Struggle in your bindings) -(속박 투쟁) -(Pout and glare at her) -(삐죽거리며 그녀를 노려본다) -(Point to the Jailer's coin pouch) -(간수의 동전주머니를 가리키며) -(Give her all your gold) -(그녀에게 당신의 모든 금을 줘) +### Scriptum Arcanum +### Scriptum Celeste +### Scriptum Electri -Why don't you wear it instead? (OFFPERC chance, may aggro) -대신 입는 게 어때? (OFFPERC 기회, 공격적일 수 있음) -(Point to her instead) (OFFPERC chance, may aggro) -(대신 그녀를 가리킨다) (OFFPERC 기회, 공격적일 수 있음) -(The SPEAKER resists and fights back!) -(SPEAKER 가 저항하고 반격한다!) -(The SPEAKER blushes and accepts) -(SPEAKER 가 얼굴을 붉히며 받아들인다) +### Blessed Rays +### Ghostly Pets +### Zombie Pets -(The SPEAKER looks at you curiously)|Oh, you'd be perfect!|Would you please model my latest design? -(SPEAKER 가 당신을 신기하게 바라본다)|오, 당신은 완벽할 거에요!|제 최근 디자인을 모델로 만들어 주시겠어요? -(The SPEAKER holds up a restrictive outfit)|This RESTRAINT might be a tight fit|so hold still while I lace it~ -(SPEAKER 가 제한적인 의상을 들고 있다)|이 RESTRAINT는 딱 맞을 수 있습니다|그러니까 끈을 묶는 동안 가만히 계세요~ -(The SPEAKER giggles)|It looks even better than I thought!|Thank you girl~ -(SPEAKER 낄낄거림)|생각보다 훨씬 좋아보이네요!|고마워요~ -(The SPEAKER sighs and moves away)|Such a shame... -(SPEAKER 가 한숨을 쉬며 멀어진다)|이런 부끄러운 일이... -(The SPEAKER looks disappointed)|Guess I'll find someone else then... -(SPEAKER 가 실망한 듯)|그럼 다른 사람을 찾아봐야지... -(The SPEAKER pouts)|But I just have to see how you look in it! -(SPEAKER 가 삐죽거린다)|하지만 당신이 어떻게 보이는지 봐야겠어요! -(The SPEAKER smiles)|Maybe you'll change your mind when it's on~ -(SPEAKER 가 웃는다)|켜지면 마음이 바뀔지도 몰라~ -(The SPEAKER grumbles)|...fine, but you'd look cute~ -(SPEAKER 투덜거림)|...괜찮아요. 하지만 귀엽게 보이겠죠~ -(The SPEAKER looks bemused)|Changed your mind?|It does look good on you though~ -(SPEAKER 가 어리둥절해 보인다)|마음이 바뀌었나요?|그래도 잘 어울리네요~ -(The SPEAKER snaps her fingers)|(You feel the RESTRAINT magically appear on you)|Aha! Wonderful! You can go now~ -(SPEAKER 가 손가락을 튕긴다)|(제지 장치가 마법처럼 자신에게 나타나는 것을 느낀다)|아하! 멋지군! 이제 가도 돼~ +### Drone Support -Yes please! -예, 부탁합니다! -(Nod enthusiastically) -(열정적으로 끄덕인다) -I don't have time for this. -이럴 시간 없어. -(Shake your head) -(악수하다) +### Doll Training -Of course miss. -물론이죠. -(Nod again) -(다시 고개를 끄덕인다) -Actually, I'd rather not. -사실은 안 하는 게 좋겠어. -(Shake your head) -(악수하다) +### Full Capture -Fine, I guess. -알았어. -(Giggle and nod) -(낄낄거리며 끄덕인다) -Wait! That's too much! (PERCENT chance to avoid) -잠깐! 너무 많아! (피할 확률이 PERCENT) -(Shake your head and moan) (PERCENT chance to avoid) -(고개를 흔들며 신음) (피할 확률이 PERCENT) +### Shadow Hands +### Obsidian Orbs +### Mithril Orbs -(The SPEAKER looks at with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed? -(The SPEAKER 가 철학적인 시각으로 바라본다)|너는...|변하고 싶다고 느낀 적이 있니? -(The SPEAKER takes a strange mask from her satchel)|Well, I have the answer right here... -(화자가 가방에서 이상한 가면을 꺼낸다)|글쎄, 바로 여기에 답이 있어... -(The SPEAKER nods seriously)|My hypothesis was correct... -(SPEAKER 가 진지하게 고개를 끄덕인다)|내 가설이 맞았다... -(The SPEAKER frowns)|Such a philistine. Begone. -(화자가 눈살을 찌푸린다)|이런 속물. 물러나. -(The SPEAKER turns away and thinks deeply) -(SPEAKER 가 돌아서며 깊이 생각한다) -(The SPEAKER is lost deep in thought)|Like... become someone else? -(SPEAKER 가 깊은 생각에 잠긴다)|마치... 다른 사람이 되는 것? -(The SPEAKER smiles)|You can be someone else... -(SPEAKER 미소)|넌 다른 사람이 될 수 있어... -(The SPEAKER turns around and keeps pondering)|Hmmm... -(SPEAKER 가 뒤돌아서 계속 생각에 잠긴다)|흠... -(The SPEAKER nods)|I see you are a truth seeker after all. -(SPEAKER 가 고개를 끄덕인다)|당신은 결국 진실을 찾는 사람이군요. -(The SPEAKER lets you go. But then...)|(You feel her clip a RESTRAINT on you from behind!)|There... I shall now observe your behavior. -(SPEAKER 가 당신을 가도록 합니다. 하지만 그때...)|(당신은 그녀의 클립이 뒤에서 당신을 구속하는 것을 느낍니다!)|저기... 이제 당신의 행동을 관찰하겠습니다. -Um, sure? -음, 그래? -(Nod seriously) -(진지하게 끄덕인다) -...What? -...뭐? -(Shake your head) -(악수하다) -Show me the truth. -나에게 진실을 보여줘. -(Nod again) -(다시 고개를 끄덕인다) -That's just creepy. -그냥 소름 끼치네요. -(Shake your head) -(악수하다) -Fine, you've convinced me. -좋아요, 당신은 저를 설득했습니다. -(Giggle and nod) -(낄낄거리며 끄덕인다) -I don't have time for this. (PERCENT chance to avoid) -이럴 시간이 없어. (피할 확률이 PERCENT) -(Shake your head and moan) (PERCENT chance to avoid) -(고개를 흔들며 신음) (피할 확률이 PERCENT) +### (The Warden perks an eyebrow at the sight of you,|before a wide grin overtakes her face)|Ahhh Fuuka. Chosen by the Goddess?|How does it feel to once again be under a leash? +### Fuuka, take her down. -(The SPEAKER swings an imaginary sword around)|En guar- Oh, you're unarmored!|Do you want to borrow some of mine? -(SPEAKER 가 상상의 검을 휘두른다)|En guar- 오, 당신은 갑옷을 입지 않았군요!|내 것을 좀 빌릴래요? -(The SPEAKER holds up a RESTRAINT)|I found this near an old suit of armor.|I think it's a helmet or something... -(SPEAKER 가 RESTTRAINT를 들어 올린다)|이것은 낡은 갑옷 근처에서 찾았습니다.|투구 같은 것 같은데... -(The SPEAKER winks and locks it on)|I feel much safer already~ -(SPEAKER 가 윙크하고 잠급니다)|이제 훨씬 안전해진 것 같아요~ -(The SPEAKER pouts)|Aww, spoilsport!|(She returns to fighting her imaginary enemies) -(SPEAKER 가 삐죽거린다)|아, 망할 짓이야!|(그녀는 상상의 적과 싸우기 위해 돌아간다) -(The SPEAKER shrugs)|Your loss~ -(SPEAKER 가 어깨를 으쓱한다)|당신의 패배~ -(The SPEAKER grins deviously)|So? It might help...|(The SPEAKER dives at you suddenly!) -(SPEAKER 가 사악하게 웃는다)|그래서? 도움이 될지도...|(SPEAKER 가 갑자기 당신에게 뛰어든다!) -(The SPEAKER giggles)|Close enough, right?|Come on, there's enemies to fight! -(SPEAKER 낄낄거림)|충분히 가깝지, 그렇지?|자, 싸워야 할 적들이 있다! -(The SPEAKER trips over the floor)|AHHHHH!|Maybe I need more protection... -(SPEAKER 가 바닥을 넘어간다)|아아아아아!|보호가 더 필요한 것 같은데... -(The SPEAKER locks it in place quickly)|There, all set for battle now!|(The SPEAKER giggles, cheekily winking at you) -(SPEAKER 가 재빨리 제자리에 고정)|저기, 이제 전투 준비가 모두 끝났습니다!|(SPEAKER 가 낄낄거리며 당신에게 건방진 윙크를 합니다) -(The SPEAKER tightly fastens the muzzle on)|Safe and secure~|(You whimper as the SPEAKER spanks you goodbye) -(SPEAKER 가 총구를 단단히 조입니다)|안전하고 안전합니다~|(SPEAKER 가 당신에게 작별인사를 할 때 당신은 훌쩍거립니다) +### (Send Fuuka to fight her) -Extra defense can't hurt... -추가 방어력은 아프지 않아... -(Nod cautiously) -(조심스럽게 끄덕인다) -I'm safe enough. -난 충분히 안전해. -(Shake your head) -(악수하다) +### That is none of your business. Now kneel. -A gag? Sounds fun~ -개그? 재밌겠다~ -(Nod eagerly) -(열심히 끄덕인다) -That's not a helmet! -그건 헬멧이 아니야! -(Shake your head) -(악수하다) +### (Fight without listening.) -Well, it might... -글쎄, 그럴지도... -(Giggle and nod) -(낄낄거리며 끄덕인다) -(Dodge her lunge) (PERCENT chance to avoid) -(돌진을 피함) (피할 확률이 PERCENT) -(Dodge her lunge) (PERCENT chance to avoid) -(돌진을 피함) (피할 확률이 PERCENT) +### Blessed Hex -(A smirking SPEAKER bumps into you)|So, you're with us now, huh?|I think you need a welcome gift. -(미소 짓는 SPEAKER 가 당신에게 부딪친다)|그래서, 이제 우리와 함께 있군요, 응?|환영 선물이 필요한 것 같아요. -Mmhmm, a gift~|(The SPEAKER leans forward to whisper in your ear)|Is it cold in here, or is it just you? -으음, 선물~|(SPEAKER 가 몸을 앞으로 숙여 귀에 대고 속삭인다)|여기가 추운가요, 아니면 당신만 그런가요? -(You shiver as everything gets colder)|(RESTRAINT forms around you!)|(The SPEAKER blows you a kiss and giggles) -(모든 것이 추워지면서 몸이 떨립니다.)|(RESTRAINT가 주변에 형성됩니다!)|(SPEAKER 가 키스를 날리며 낄낄거립니다.) -(The SPEAKER thinks for a moment)|I really wanted to try this too...|(Sighing, the SPEAKER walks away) -(SPEAKER 가 잠시 생각하다)|나도 이거 해보고 싶었어...|(한숨, SPEAKER 가 가버린다) -(The SPEAKER scowls)|How boring. -(SPEAKER 가 얼굴을 찌푸린다)|얼마나 지루한가. -(The SPEAKER laughs at your protest)|It's so much fun though~|(You feel the temperature drop suddenly) -(당신의 항의에 화자가 웃는다)|그래도 너무 재미있다~|(갑자기 온도가 떨어지는 걸 느낀다) -(The SPEAKER thinks for a moment)|Well, I want to try this anyway~|(You feel the temperature drop suddenly) -(SPEAKER 가 잠시 생각하다)|글쎄, 그래도 해보고 싶어~|(갑자기 온도가 떨어지는 느낌이 든다) -(The temperature returns to normal)|(The SPEAKER seems surprised)|Hmm, that wasn't meant to happen. -(온도가 정상으로 돌아온다)|(SPEAKER 가 놀란 듯하다)|흠, 그럴 리가 없군. -(RESTRAINT solidifies on you as the SPEAKER grins)|It worked! I did it!|Thanks for your, uh, help~ -(RESTRAINT가 당신에게 굳어지고 SPEAKER 가 웃는다)|성공했습니다! 해냈습니다!|도와주셔서 감사합니다~ -(RESTRAINT solidifies on you as the SPEAKER smiles)|Yes! Finally! How's that feel?|(The SPEAKER admires your restraints) -(화자가 미소를 지을 때 자제력이 굳어짐)|네! 드디어! 기분이 어때요?|(화자님이 자제력에 감탄합니다) +### Hexing Orb -A gift? -선물? -(Nod warily) -(조심스럽게 끄덕인다) -No thanks. -고맙지 만 사양 할게. -(Shake your head) -(악수하다) +### Hexed Latex Engulf -Umm... just me? -음... 나만? -(Nod again) -(다시 고개를 끄덕인다) -Wait, don't make it colder! -잠깐, 더 차갑게 만들지 마! -(Shake your head) -(악수하다) +### Hex Binding + +### Here you will find various scraps of documents and lore you've recovered throughout your adventures. + +### Your Journal + +### Cover + +### I am writing this journal in the off chance that I do not come return from the Agarthan ruins. If you find this, please make an effort to deliver it back to the surface for the good of all the women lured in by its secrets. + +### Catherine Willows' Journal (preface) + +### Willows 0 + +### As I scaled the mountain, I came across a massive graveyard above the treeline, a grand memorial to those who died before the Great Work. This graveyard extends into the mouth of the cave, and the guards told me not to deface any of the graves, or else the ghosts will come and get me. It would be easier to follow their instructions if there weren't so much treasure still hidden here! After all, most of us are deep in the red after sailing all this way. + +### Catherine Willows' Journal (pg. 7) + +### Willows 7 + +### It's hard to imagine I'm in a cave. Everything is so decorated and well-preserved, it's almost as if decades of adventurers never found their way to this island. In the distant future when every last piece of treasure has been hauled out of here, I imagine they'll set this place up as a tourist attraction. + +### Catherine Willows' Journal (pg. 8) + +### Willows 8 -(Shiver and watch as the ice covers you) -(떨고 얼음이 당신을 덮는 것을 지켜보십시오) -(Mutely whimper as the ice covers you) -(얼음이 당신을 덮을 때 조용히 훌쩍) -Ah! T-That's freezing! (PERCENT chance to avoid) -아! 큭-너무 춥네요! (피할 확률이 PERCENT) -(Wriggle to warm up) (PERCENT chance to avoid) -(워밍업을 위해 꿈틀거림) (피할 확률이 PERCENT) +### I spoke with a few locals while resupplying at the port. Apparently the village up here is far older than the twenty-some years the Adventurer's Guild has been on the island. The locals call the mountain 'Ejahl,' but the consensus is that this is the site of the legendary city Agartha where the Archmagus herself made her discovery.|(The page is dated about fifty years ago) +### Catherine Willows' Journal (pg. 14) +### Willows 14 -(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? -(로봇 SPEAKER 가 접근함)|질문: 착한 여자 감지:|제지 필요? -(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? -(SPEAKER 가 삐 소리를 내며 윙윙거린다)|SPEAKER 가 RESTRAINT를 추가합니다.|Acceptable? -(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. -(SPEAKER 가 주위를 돌며 테이프를 뗀다)|RESTRAINT가 해제되었습니다.|좋은 하루 되세요. -(The SPEAKER buzzes)|Understood. Proceding back to duty. -(SPEAKER 가 윙윙거린다)|알았다. 임무로 돌아가는 중. -(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. -(SPEAKER 가 찰칵 소리를 내며 삐 소리를 냄)|거절이 확인되었습니다.|SPEAKER 가 다시 순찰할 것입니다. -(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. -(SPEAKER 가 윙윙거림)|오류: 답변에 모순이 있습니다.|SPEAKER 가 제한을 추가할 것입니다. -ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. -오류: 수락이 예상됩니다.|문: SPEAKER 가 제한을 추가합니다. -(The SPEAKER makes a whirring noise)|ERROR: SPEAKER out of tape.|Returning to routine. -(SPEAKER 가 윙윙거리는 소리를 냄)|오류: SPEAKER 가 테이프에서 벗어났습니다.|루틴으로 돌아가고 있습니다. -(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. -(SPEAKER 가 주위를 돌며 테이프를 뗀다)|RESTRAINT가 해제되었습니다.|좋은 하루 되세요. -(The SPEAKER launches tape which catches you as you run)|RESTRAINT dispensed.|Have a nice day. -(SPEAKER 가 당신이 달리는 동안 당신을 붙잡는 테이프를 발사합니다)|RESTRAINT가 해제되었습니다.|좋은 하루 되세요. +### I made it to a deeper floor today, and was greeted by a skeleton trying to tie me up. Great.|I've looked into the local name for this mountain, 'Ejahl,' and found a footnote in the history books talking about some petty kingdom that laid siege to Agartha. There's no record of them actually winning the siege, though. I've heard there's a massive library somewhere down here, maybe I'll find answers there. -Uh, affirmative? -어, 긍정? -(Nod) -(목례) -Negative. -부정적인. -(Shake your head) -(악수하다) +### Catherine Willows' Journal (pg. 17) -Very acceptable! -매우 수용 가능! -(Nod again) -(다시 고개를 끄덕인다) -No, I don't want that. -아니, 난 그걸 원하지 않아. -(Shake your head) -(악수하다) +### Willows 17 -If you have to... -해야 한다면... -(Giggle and nod) -(낄낄거리며 끄덕인다) -Go away robot! (PERCENT chance to avoid) -로봇 저리 가! (피할 확률 PERCENT) -(Shake your head rapidly) (PERCENT chance to avoid) -(머리를 빠르게 흔든다) (피할 확률이 PERCENT) +### There was a warrior in the catacombs today. She appears to have mastered the art of witty comebacks, as I truly could not come up with anything to say that did not further humiliate myself. Fortunately her insults came at her companions' expense, and they allowed me to defeat her in a solitary duel. +### Catherine Willows' Journal (pg. 20) +### Willows 20 -(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? -(로봇 SPEAKER 가 접근함)|질문: 착한 여자 감지:|제지 필요? -(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? -(SPEAKER 가 삐 소리를 내며 윙윙거린다)|SPEAKER 가 RESTRAINT를 추가합니다.|Acceptable? -(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. -(SPEAKER 가 당신에게 케이블을 쏜다)|RESTRAINT가 해제되었습니다.|좋은 하루 되세요. -(The SPEAKER buzzes)|Understood. Proceding back to duty. -(SPEAKER 가 윙윙거린다)|알았다. 임무로 돌아가는 중. -(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. -(SPEAKER 가 찰칵 소리를 내며 삐 소리를 냄)|거절이 확인되었습니다.|SPEAKER 가 다시 순찰할 것입니다. -(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. -(SPEAKER 가 윙윙거림)|오류: 답변에 모순이 있습니다.|SPEAKER 가 제한을 추가할 것입니다. -ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. -오류: 수락이 예상됩니다.|문: SPEAKER 가 제한을 추가합니다. -(The SPEAKER makes a whirring noise)|ERROR: SPEAKER cable jammed.|Returning to routine. -(SPEAKER에서 윙윙거리는 소리가 납니다.)|오류: SPEAKER 케이블이 걸렸습니다.|루틴으로 돌아가고 있습니다. -(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. -(SPEAKER 가 당신에게 케이블을 쏜다)|RESTRAINT가 해제되었습니다.|좋은 하루 되세요. -(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. -(SPEAKER 가 당신에게 케이블을 쏜다)|RESTRAINT가 해제되었습니다.|좋은 하루 되세요. +### I almost found myself the recipient of a powerful binding arrow enchanted with force runes. Had I been hit, I would have been knocked back against the walls with my arms pinned by glowing conjured cuffs. Fortunately, this projectile hit a skeleton that was attacking me instead, and I was able to retreat. -Uh, affirmative? -어, 긍정? -(Nod) -(목례) -Negative. -부정적인. -(Shake your head) -(악수하다) +### Catherine Willows' Journal (pg. 21) -Very acceptable! -매우 수용 가능! -(Nod again) -(다시 고개를 끄덕인다) -No, I don't want that. -아니, 난 그걸 원하지 않아. -(Shake your head) -(악수하다) +### Willows 21 -If you have to... -해야 한다면... -(Giggle and nod) -(낄낄거리며 끄덕인다) -Go away robot! (PERCENT chance to avoid) -로봇 저리 가! (피할 확률 PERCENT) -(Shake your head rapidly) (PERCENT chance to avoid) -(머리를 빠르게 흔든다) (피할 확률이 PERCENT) +### In my travels I encountered a curious tomb filled with the scent of incense and herbs. Strange statues lined the halls on stone pedestals, standing as an intimidating reminder of what happens to those who disturb the locals...|I encountered resistance from the locals, who seemed to regard outsiders as 'cursed' and sought to capture me in an effort to give me a 'blessing.' I highly doubt that anyone has been truly blessed by their efforts, well-intentioned or not. +### Catherine Willows' Journal (pg. 24) +### Willows 24 -(A happy SPEAKER looks at you)|Hey there cutie~|Want to try some scarf bondage? -(행복한 SPEAKER 가 당신을 바라본다)|저기 귀염둥이~|스카프 속박을 해볼래? -(The SPEAKER holds up some scarves)|If you want to try, I've got a few here.|I could give you a RESTRAINT? -(SPEAKER 가 스카프 몇 개를 들고 있다)|관심있으면, 내가 몇 개 갖고 있어.|널 묶어봐도 될까? -(The SPEAKER smiles gently at you as she ties)|I love the silky feeling~|(The SPEAKER tightens all her knots) -(SPEAKER 가 매듭을 지으며 부드럽게 미소짓는다)|매끈한 느낌이 좋아~|(SPEAKER 가 매듭을 조여준다) -(The SPEAKER looks away and nods)|Well... maybe next time. -(발표자가 시선을 돌리고 고개를 끄덕인다)|글쎄... 다음 기회에. -(The SPEAKER shuffles awkwardly)|Oh... well...|Come back if you change your mind~ -(SPEAKER 가 어색하게 뒤섞인다)|아...그럼...|마음이 바뀌면 다시 오세요~ -(The SPEAKER scowls)|Hey, don't back out!|I promise I'll make it comfortable! -(SPEAKER 가 찡그린다)|이봐, 물러서지 마!|편안하게 해줄게 약속할게! -(The SPEAKER frowns)|Too bad, I want to tie someone! -(SPEAKER가 눈살을 찌푸린다)|안타깝지만, 누군가를 묶고 싶어요! -(The SPEAKER drops her scarves)|Aww, really?|I'll go find someone else then... -(SPEAKER 가 스카프를 떨어뜨린다)|아, 정말?|그럼 다른 사람을 찾으러 갈게... -(The SPEAKER beams a smile)|Yay, thank you!|Feels nice, right? -(SPEAKER 가 미소를 짓는다)|예, 감사합니다!|기분이 좋죠? -(The SPEAKER tosses a scarf around you like a lasso)|Not so fast! You cannot escape the fluff! -(SPEAKER 가 올가미처럼 네 주위에 스카프를 던진다)|너무 빠르지 않아! 보풀에서 벗어날 수 없어! +### This 'blessing' of theirs appears to be an old ritual for immortality. I believe these peoples are older than the Great Work, based on the ancient dialect they speak and the outdated script they use.|Whatever the case may be, their method seems inexact and prone to failure, as demonstrated by their near maniacal devotion to 'bless' every adventurer they come across. -Sounds good! -좋아요! -(Nod quickly) -(빠르게 끄덕인다) -Not really. -설마. -(Shake your head) -(고개를 젓는다) +### Catherine Willows' Journal (pg. 25) -Please do! -제발! -(Nod and giggle) -(킥킥대며 고개를 끄덕인다) -Not right now. -지금 말고. -(Shake your head) -(고개를 젓는다) +### Willows 25 -Well... sure then. -음...좋아요 그럼. -(Giggle and moan) -(킥킥대고 신음을 흘린다) -Hey! Stop! (PERCENT chance to avoid) -이봐! 멈춰! (피할 확률 PERCENT) -(Shake your head and whine) (PERCENT chance to avoid) -(고개를 흔들며 칭얼거림) (피할 확률이 PERCENT) +### There are two 'castes' in the Bast cult. The first are the 'blessed,' and the second are their watchful guardians. The unintuitive bit is that the 'blessed' are the ones wrapped up and sealed away inside statues, sarcophagi, and anything else the guardians can stick a person into. The free ones wandering around grabbing people? They're the ones who weren't 'blessed' apparently. +### Catherine Willows' Journal (pg. 26) +### Willows 26 -(A messy looking SPEAKER turns to you)|Hmm, curious. Very curious.|Can you help me with an experiment? -(어지러워 보이는 SPEAKER 가 당신에게 돌아섭니다)|음, 궁금하네요. 매우 궁금하네요.|실험을 도와주실 수 있나요? -(The SPEAKER pulls out a flask)|I isolated some slime, but it's inert.|Would you let me spill some on you? -(SPEAKER 가 플라스크를 꺼낸다.)|점액을 분리했는데 움직이질 않아.|네 몸에 좀 부어봐도 되? -(The SPEAKER tips out the entire flask)|Aha! It's growing again! Fascinating.|(Sticky RESTRAINT clings to you) -(SPEAKER 가 플라스크 전체를 기울인다)|아하! 다시 커지고 있어! 멋져.|(끈적끈적한 구속이 달라붙는다) -(The SPEAKER tuts disapprovingly)|Not one for chemistry, eh? -(SPEAKER 가 혀를 찬다)|화학을 좋아하진 않나보네? -(The SPEAKER sighs)|So hard to find good help out here... -(SPEAKER 가 한숨을 쉰다)|여기서 좋은 도움을 찾기가 너무 힘들어... -(The SPEAKER glares at you)|You've got no sense of adventure!|For science! -(SPEAKER 가 당신을 노려본다)|당신은 감각이 없어요!|과학을 위해! -Ah, but it'll be quick!|(The SPEAKER begins tipping the flask)|See? It's already moving toward you! -아, 하지만 빨리 될거야!|(SPEAKER 가 플라스크를 기울이기 시작한다)|봐? 이미 너를 향해 움직이고 있어! -(The SPEAKER tosses the slime on you)|(The slime flops off limply)|Ah. Back to the drawing board. -(SPEAKER 가 당신에게 슬라임을 던집니다.)|(슬라임이 철퍽거리며 떨어집니다.)|아. 다시 제도판으로 돌아가야겠네. -(The SPEAKER pours the slime onto you)|That's the spirit girl!|(Sticky RESTRAINT clings to you) -(SPEAKER 가 당신에게 점액을 붓는다)|그 느낌이야!|(끈적끈적한 구속이 당신에게 달라붙는다) -(The SPEAKER tosses the slime on you)|Ha, look, it's alive!|(Sticky RESTRAINT clings to you) -(SPEAKER 가 당신에게 점액을 던진다)|하, 봐, 살아있어!|(끈적끈적한 구속이 당신에게 달라붙는다) +### I've found it! The Archmagus' library! Much to my chagrin, however, the place has been ransacked by witches and a curious group of mages in search of inspiration from ancient fashion choices. -Sure. -확신하는. -(Nod slowly) -(천천히 끄덕인다) -Absolutely not. -절대 안돼. -(Shake your head) -(고개를 젓는다) +### Catherine Willows' Journal (pg. 30) -On me? Sounds fun~ -오 나 말야? 재미있겠다~ -(Nod again) -(다시 고개를 끄덕인다) -Nope. Not doing that. -아니. 그러지 마. -(Shake your head) -(고개를 젓는다) +### Willows 30 -Okay, for science... -좋아, 과학을 위해... -(Giggle and nod) -(낄낄거리며 끄덕인다) -Ah! Don't you dare! (PERCENT chance to avoid) -아! 그러기만 해봐! (피할 확률이 PERCENT) -(Shake your head and whimper) (PERCENT chance to avoid) -(훌쩍거리며 고개를 젓는다) (피할 확률이 PERCENT) +### It appears someone got to the Archmagus' writings before I could. Nonetheless, I will continue my search for Vinlaga's personal study. Perhaps her research materials and drafts might shed some light on my condition. +### Catherine Willows' Journal (pg. 31) +### Willows 31 -(A SPEAKER whispers to you)|Ever wonder how wolfgirls feel?|Or why they're so obedient? -(A SPEAKER 가 당신에게 속삭임)|늑대소녀들이 어떻게 느끼는지 궁금한 적이 있나요?|아니면 그들이 왜 그렇게 순종적인지? -(The SPEAKER grins)|I've got a RESTRAINT here~|Wanna give it a try? -(SPEAKER 가 웃는다)|나한테 구속구가 있어요~|한 번 해볼래요? -(The SPEAKER puts on the RESTRAINT)|Perfect. Better behave now~|(The SPEAKER pats your butt) -(SPEAKER 가 구속구를 입힌다)|완벽해. 앞으로 말 잘들으렴~|(SPEAKER 가 엉덩이를 토닥거린다) -(The SPEAKER rolls her eyes)|You've seen wolfgirls, right?|Ah, whatever, go have fun~ -(SPEAKER 가 눈을 굴리며)|늑대소녀본 적 있지?|아, 어쨋든, 잘가~ -(The SPEAKER nods glumly)|Not a fan?|Shame, I am~ -(SPEAKER 가 침울하게 고개를 끄덕인다)|관심없어?|안타깝네 난 있어~ -(The SPEAKER grabs you quickly)|Oh, it's very strict~|And great for being trained... -(SPEAKER 가 당신을 재빨리 붙잡는다)|오, 매우 엄격하다~|그리고 훈련을 받는 것이 좋다... -(The SPEAKER looks at you deviously)|You're going to wear this RESTRAINT,|if you want to or not~ -(SPEAKER 가 당신을 사악하게 바라본다)|넌 이 구속구를 입게 될 거야|원하든 원하지 않든간에 말야~ -(The SPEAKER sulks)|Have it your way then. -(SPEAKER 가 토라짐)|그럼 마음대로 하세요. -(The SPEAKER adds the RESTRAINT)|(You feel her tighten everything before locking it)|Good girl~ -(SPEAKER 가 구속을 추가함)|(그녀가 모든 구속구를 단단하게 조인뒤 잠그는 게 느껴집니다)|착한 아이네~ -(The SPEAKER pushes you to the ground)|I'll make it extra tight for you~|(The RESTRAINT locks tightly onto you) -(SPEAKER 가 널 바닥으로 밀어붙인다)|엄청 꽉 조여줄게~|(RESTRAINT 가 단단하게 조여집니다) +### I have learned of an ancient artifact, called the Mistress' Staff. Its history and owner are hotly debated, with some attributing it to the Archmagus herself, while others say it was developed by the magical warlords that followed. Most all sources agree that its signature feature is the ability to reverse the effects of the Great Work on any person. -Maybe a little~ -조금~ -(Nod excitedly) -(신나게 끄덕인다) -Don't know, don't care. -몰라, 관심 없어. -(Shake your head) -(고개를 젓는다) +### Catherine Willows' Journal (pg. 36) -Yes! So much! -네! 엄청요! -(Nod quickly) -(빠르게 끄덕인다) -That looks too strict! -그건 너무 엄격해 보여요! -(Shake your head) -(악수하다) +### Willows 33 -I- Well- O-Okay~ -나- 음- 오- 알았어~ -(Moan and squirm) -(신음하며 몸부림친다) -I don't want to get stuck! (PERCENT chance to avoid) -갇히고 싶지 않아! (피할 확률이 PERCENT) -(Shake your head worriedly) (PERCENT chance to avoid) -(걱정스럽게 고개를 흔든다) (피할 확률이 PERCENT) +### There is a treasure trove of ancient history here that the blasted Dressmakers had no use for. I found a map from the 'Kingdom of Ejahl,' with sketches of many islands including this one. Like most of the warlord states, they failed to make a lasting impact on the architecture of the island, but it appears the island was uninhabited for some time between the fall of Agartha and its resettlement by Ejahl. +### Catherine Willows' Journal (pg. 41) +### Willows 41 -(A SPEAKER gracefully gestures to you)|So good to see a friendly face~|Care to see some elven goods? -(화자가 우아하게 손짓한다)|친절한 얼굴을 보니 너무 반가워~|엘프 상품 좀 볼래? -(The SPEAKER holds up a RESTRAINT)|These are some of our strictest.|Want to try? -(SPEAKER 가 제지를 들고 있다)|이것들은 우리의 가장 엄격한 것 중 일부입니다.|시도하시겠습니까? -(The SPEAKER smiles sweetly)|Such a good girl~|(The RESTRAINT locks with a loud click) -(SPEAKER 가 상냥하게 웃는다)|착한 여자야~|(큰 소리와 함께 RESTTRAINT가 잠긴다) -(The SPEAKER sagely nods)|As you wish~ -(SPEAKER 가 현명하게 고개를 끄덕인다)|원하는 대로~ -(The SPEAKER frowns briefly)|I understand~ -(SPEAKER 가 짧게 눈살을 찌푸리며)|알겠습니다~ -(The SPEAKER leans closer)|Then you can test their escapability!|(The SPEAKER dives towards you!) -(SPEAKER 가 더 가까이 몸을 기울인다)|그러면 그들의 탈출 가능성을 테스트할 수 있습니다!|(SPEAKER 가 당신을 향해 뛰어듭니다!) -(The SPEAKER shifts her weight back)|I'm afraid I must insist.|(She's gripping a RESTRAINT)|(The SPEAKER dives towards you!) -(SPEAKER 가 체중을 뒤로 이동)|장난을 쳐야겠네요.|(레스트레인트를 움켜쥐고 있습니다)|(SPEAKER 가 당신을 향해 뛰어듭니다!) -(The SPEAKER rolls past harmlessly)|Oh! So fast~ -(SPEAKER 가 무해하게 지나간다)|오! 너무 빨라~ -(The SPEAKER snaps the RESTRAINT on)|There, much better.|Now squirm for me cutie~ -(SPEAKER 가 구속 장치를 찰칵)|거기, 훨씬 나아졌어.|이제 나를 위해 꿈틀거려 귀염둥이~ -(The SPEAKER trips you over)|(Before you can move, the RESTRAINT closes firmly)|Strict, isn't it?~ -(SPEAKER 가 당신을 넘어뜨린다)|(당신이 움직이기도 전에 RESTTRAINT가 단단히 닫힙니다.)|엄격하지 않습니까?~ +### ...I must find it.|They are looking for it.|They CANNOT be allowed to have it. -Of course! -물론! -(Nod happily) -(기쁘게 끄덕인다) -No, thanks. -고맙지 만 사양 할게. -(Shake your head) -(악수하다) +### Catherine Willows' Journal (pg. 47) + +### Willows 37 + +### I saw my reflection in a pool of water today. My hair looked much more silver than I remember it. I hope this isn't a side effect of all the magic I'd used to make it to this point. + +### Catherine Willows' Journal (pg. 50) + +### Willows 50 + +### I heard the bandits are looking for the Mistress' Staff. I'm not too worried--they wouldn't know what to do with it. It's that damned witch I'm worried about.|If my astute reader has come this far, you should beware the Silver Witch. She is working with forces that cannot be trusted. + +### Catherine Willows' Journal (pg. 51) -Pretty please~ -예뻐주세요~ -(Nod eagerly) -(열심히 끄덕인다) -Not really. -설마. -(Shake your head) -(악수하다) +### Willows 51 -. -. -(Moan and giggle) -(신음하며 낄낄거린다) -Stop! (PERCENT chance to avoid) -그만! (피할 확률이 PERCENT) -(Shake your head and moan) (PERCENT chance to avoid) -(고개를 흔들며 신음) (피할 확률이 PERCENT) +### It seems I am not alone in my search for the Staff. To whom it may concern: the Great Work is a lie, and it will doom us all. If you care for your soul, you need to break the cycle, and for that we need a key: the Mistress' Staff. +### Silver Witch's Notes #10 +### Silver 10 -(A SPEAKER plays with silvery rope)|Hmm, I need to get better with this.|Can I practice on you? -(A SPEAKER play with silvery rope)|흠, 이걸 좀 더 잘해야겠어.|연습해도 될까? -(The SPEAKER grins happily)|Thank you girl~|I'll tie with RESTRAINT then~ -(SPEAKER 가 행복하게 웃는다)|고마워요~|그럼 RESTRAINT로 묶을게요~ -(The SPEAKER binds you tightly)|(The rope is tight, and she's clearly and expert.)|Mmm, not too bad~ -(SPEAKER 가 당신을 단단히 묶습니다.)|(로프가 팽팽하고 그녀는 분명히 전문가입니다.)|음, 나쁘지 않습니다~ -(The SPEAKER pouts indignantly)|Why say yes then?!|(The SPEAKER walks off grumbling) -(SPEAKER 가 화를 내며 입을 삐죽거린다)|그럼 왜 예라고 할까요?!|(SPEAKER 가 투덜거리며 걸어나간다) -(The SPEAKER sighs)|Very well then~ -(SPEAKER 가 한숨을 쉬며)|그럼 좋아요~ -(The SPEAKER pouts indignantly)|Oh no, you don't get out that easy.|You said you'd help! -(SPEAKER 가 화를 내며 입을 삐죽 내밀었다)|오 이런, 그렇게 쉽게 빠져나오지 못하는군.|도와주겠다고 했잖아! -(The SPEAKER smirks)|Ooh, a chance to practice against resistance~|I can't pass that up! -(SPEAKER 가 웃는다)|오, 저항에 맞서 연습할 기회야~|그건 그냥 지나칠 수 없어! -(The SPEAKER can't keep the knots tight)|(Eventually, she gives up)|S-Stupid human... -(SPEAKER는 매듭을 단단히 묶을 수 없습니다)|(결국 그녀는 포기합니다)|S-멍청한 인간... -(The SPEAKER strictly ties you up)|(You can feel she's done this many times)|(She smirks at you as she departs) -(SPEAKER 가 당신을 엄격하게 묶습니다)|(그녀가 이것을 여러 번 했다는 것을 느낄 수 있습니다)|(그녀는 떠날 때 당신에게 히죽 웃습니다) -(The SPEAKER strictly ties you up)|(There's no slack anywhere!)|(She makes a face at you as she leaves) -(SPEAKER는 당신을 엄격하게 묶습니다)|(느슨한 곳이 없습니다!)|(떠나면서 당신에게 얼굴을 찌푸립니다) +### I met an adventurer who managed to erase weeks of golem research in the blink of an eye. This is why we Summoners have to scatter our works far and wide... if only they knew what we are working towards. -Any time~ -아무때나~ -(Nod excitedly) -(신나게 끄덕인다) -I'd rather you didn't. -차라리 그러지 않았으면 좋겠어. -(Shake your head) -(악수하다) +### Silver Witch's Notes #2 -Sounds great! -멋지네요! -(Nod again) -(다시 고개를 끄덕인다) -Actually, I don't want that. -사실, 나는 그것을 원하지 않는다. -(Shake your head) -(악수하다) +### Silver 2 -I'll play along then~ -그럼 같이 놀아줄게~ -(Moan and squirm) -(신음하며 몸부림친다) -(Struggle against her) (PERCENT chance to avoid) -(그녀와 투쟁) (피할 확률 PERCENT) -(Struggle against her) (PERCENT chance to avoid) -(그녀와 투쟁) (피할 확률 PERCENT) +### The dimensional rift is especially active today. I spoke with some of the voices the other night, they offered me immortality in exchange for material wealth. They must have called the wrong universe or something... +### Silver Witch's Notes #3 +### Silver 3 -(The SPEAKER quickly motions to you)|Hey! Over here!| I got something to show you! -(SPEAKER 가 재빨리 당신을 가리킨다)|이봐! 여기!| 보여줄 게 ​​있어! -(The SPEAKER giggles)|You'll be wearing this~|(A RESTRAINT is in her hands) -(SPEAKER 웃음)|너 이거 입게 될거야~|(억제장치가 그녀의 손에 있다) -(The SPEAKER looks surprised)|Oh, uh, sure!|(They quickly add the RESTRAINT) -(발표자가 놀란 표정을 짓는다)|오, 어, 그렇군요!|(재빨리 구속을 추가합니다) -(The SPEAKER grins sneakily)|I thought you might say that~|But- ahh!|(They drop the item and you slip away) -(SPEAKER 가 살금살금 웃는다)|네가 그렇게 말할 줄 알았는데~|하지만- 아!|(그들이 물건을 떨어뜨리고 너는 미끄러져 나간다) -(The SPEAKER looks angry)|Hey! HEY! I'm talking to-|Ah, forget it. -(SPEAKER 가 화난 듯)|이봐! 이봐! 지금 얘기하고 있는데-|아, 잊어버려. -(The SPEAKER grins sneakily)|I thought you might say that~|But it wasn't a choice... -(SPEAKER 가 살금살금 웃는다)|그렇게 말할 줄 알았는데~|선택이 아니었어... -(The SPEAKER follows you)|Not so fast there~|(She blocks your path) -(SPEAKER 가 당신을 따라옵니다)|그렇게 빠르지 않습니다~|(그녀는 당신의 길을 막습니다) -(The SPEAKER fumbles with the RESTRAINT)|C-Come on, open-|(You quickly walk away) -(SPEAKER 가 구속 장치를 더듬으며)|C-어서, 열어-|(빨리 걸어가세요) -(The SPEAKER adds the RESTRAINT)|Good luck with that one~|(She sounds like she's gloating...) -(화자가 RESTTRAINT를 추가함)|행운을 빌어요~|(화난 것처럼 들리는데...) -(The SPEAKER roughly forces you down)|(Pushing your head down, the RESTRAINT slides on)|(The SPEAKER tugs your hair, then walks away) -(SPEAKER 가 대략적으로 강제로 아래로 내리게 함)|(머리를 내리면 RESTTRAINT가 미끄러짐)|(SPEAKER 가 머리카락을 잡아당긴 다음 걸어갑니다) +### My new golem project did not go as expected. I'd expected the primordial one to answer once I'd opened the gate, but there was nothing but a horde of star demons which I quickly dispatched. Could this mean the source of primordial latex is not outside this universe, as I had thought, but inside? I must investigate further. -(Walk over, curiously) -(이상하게 걸어가) -(Walk over, curiously) -(이상하게 걸어가) -(Don't approach). -(가까이 오지마). -(Don't approach) -(가까이 오지마) +### Silver Witch's Notes #18 -Sure! -확신하는! -(Nod eagerly) -(열심히 끄덕인다) -W-What? No way! -무, 뭐? 안돼! -(Shake your head) -(악수하다) +### Silver 18 -(Let her add the restraint) -(제지 추가하자) -(Moan and nod) -(신음하며 고개를 끄덕인다) -Stop! (PERCENT chance to avoid) -그만! (피할 확률이 PERCENT) -(Shake your head and groan) (PERCENT chance to avoid) -(고개를 흔들며 신음) (피할 확률 PERCENT) +### She did it again. Barged in on my work and called me a 'purveyor of evil magics,' whatever that means. Magic isn't evil, it was given to us directly by the gods! At least I hid my new golem in a different study of mine... +### Silver Witch's Notes #15 +### Silver 15 -(The SPEAKER walks over)|You'd make a cute catgirl~|Want help becoming one? -(SPEAKER 가 걸어온다)|귀엽게 캣걸을 만들 수 있겠지~|고양이 소녀가 되는 데 도움이 필요해? -(The SPEAKER grins)|Here, I've got this RESTRAINT.|That'll help! -(SPEAKER 가 웃는다)|여기에 구속 장치가 있습니다.|그게 도움이 될 거에요! -(The SPEAKER gleefully comes closer)|(The RESTRAINT fits snugly)|So adorable! -(SPEAKER 가 유쾌하게 다가온다)|(레스트레인트가 꼭 맞음)|너무 사랑스러워! -(The SPEAKER nods disappointed)|Fair enough~ -(SPEAKER 가 실망하며 고개를 끄덕인다)|괜찮아~ -(The SPEAKER sighs)|Maybe another time~ -(SPEAKER 가 한숨을 쉬며)|다음 기회에~ -(The SPEAKER titters)|It's going on, kitty~ -(SPEAKER 가 큭큭대며)|잘 되고 있어, 고양이~ -(The SPEAKER giggles)|Let's see if you can get away then~|(You see a RESTRAINT in her hand) -(화자 웃음)|그럼 도망칠 수 있는지 보자~|(그녀의 손에 구속 장치가 보인다) -(The SPEAKER whimpers and drops it)|Owwww!|I hit my knee! -(SPEAKER 가 낑낑거리며 떨어뜨린다)|오오오!|무릎을 쳤어요! -(The SPEAKER wiggles happily)|Oh, you're so cute!|Enjoy it~ -(SPEAKER 가 행복하게 꿈틀거림)|오, 너무 귀여워요!|즐기세요~ -(The SPEAKER traps you)|(You feel the RESTRAINT being forced on)|Meow~ -(SPEAKER 가 당신을 가둔다)|(당신은 구속이 강제되는 것을 느낀다)|야옹~ +### Throughout my studies I have chased after the existence of a being I call 'the Primordial One.' My theories stem from the following observations:|1)Slimes were not present in ancient history, and appeared during my lifetime as a force of nature.|2)Slime can be transmuted into almost any known material, like a Prima Materia of sorts.|3) A fragment of Sariel's notes, one of my most guarded possessions, discusses the existence of slimes long before they were first observed in the world.|Based on this, I believe the world must have been created through the influence of some primordial being who then left, but must be returning somehow.|I'm sure this being holds the key to repairing our bodies. -Sure! -확신하는! -(Nod excitedly) -(신나게 끄덕인다) -No, not today. -아니, 오늘은 아니야. -(Shake your head) -(악수하다) +### Silver Witch's Notes on the Primordial One -Yay! -야! -(Nod quickly) -(빠르게 끄덕인다) -Not like that! -그렇지 않아! -(Shake your head) -(악수하다) +### Silver 4 -Y-Yes miss~ -야-예스~ -(Moan and squirm) -(신음하며 몸부림친다) -(Duck out the way) (PERCENT chance to avoid) -(길 비켜) (피할 확률 PERCENT) -(Duck out the way) (PERCENT chance to avoid) -(길 비켜) (피할 확률 PERCENT) +### Blast. An adventurer stole one of my notebooks, and now I'm encountering various cultists and weirdos trying to summon the Primordial One themselves. This is why I never bother to publish my works... +### Silver Witch's Notes #7 +### Silver 7 -(A SPEAKER winks at you)|You look like a girl who likes feeling|like a prisoner, am I right? -(A SPEAKER 윙크)|죄수 같은 느낌을 좋아하는 여자 같아 보여요, 맞죠? -(The SPEAKER nods happily)|I knew it! Well, it's your lucky day.|I've got some RESTRAINT for you~ -(SPEAKER 가 행복하게 고개를 끄덕인다)|알고 있었어! 자, 오늘은 너의 행운의 날이야.|너를 위한 구속이 있어~ -(The SPEAKER spins you around)|(You hear the cold metal click shut)|Nice and submissive~ -(SPEAKER 가 당신을 빙글빙글 돌립니다)|(차가운 금속이 닫히는 소리가 들립니다)|착하고 순종적입니다~ -(The SPEAKER shrugs)|It's not for everyone, I guess~ -(SPEAKER 가 어깨를 으쓱한다)|모두를 위한 것은 아닌 것 같아요~ -(The SPEAKER frowns)|Really?|I was so sure... -(SPEAKER 가 눈살을 찌푸린다)|정말요?|확실히... -(The SPEAKER grins maliciously)|I like seeing prisoners though~|And you're right here... -(SPEAKER 가 악의적으로 웃는다)|그래도 죄수를 보는 건 좋아~|그리고 당신은 바로 여기... -(The SPEAKER giggles)|I'm gonna make you one anyway~|(You see a RESTRAINT in her hand) -(SPEAKER 웃음)|어차피 내가 하나 만들어줄게~|(그녀의 손에 있는 구속이 보인다) -(The SPEAKER gulps)|M-Maybe I won't then! -(SPEAKER 가 침을 꿀꺽 삼킨다)|M-그럼 안 할지도 몰라! -(The SPEAKER adds the RESTRAINT)|You're blushing dear~|She doth protest too much? -(SPEAKER 가 제지 추가)|얼굴이 빨개졌구나~|그녀가 너무 항의하는 거지? -(The SPEAKER giggles as she catches you and slaps on the cuffs)|No so fast, dear~ -(SPEAKER 가 당신을 붙잡고 수갑을 찰싹 때리며 낄낄거립니다.)|그렇게 빨리는 안 돼요, 여보~ +### I haven't heard of that adventurer in decades. Perhaps her nosiness finally caught up to her? -Maybe a bit~ -조금~ -(Nod eagerly) -(열심히 끄덕인다) -Not at all. -전혀. -(Shake your head) -(악수하다) +### Silver Witch's Notes #106 -(Wiggle excitedly) -(흥분해서 흔들며) -(Wiggle excitedly) -(흥분해서 흔들며) -Not like that. -그렇지 않아. -(Shake your head) -(악수하다) +### Silver 106 -O-Okay... -알았어... -(Moan and shiver) -(신음과 떨림) -Don't even try. (PERCENT chance to avoid) -시도하지 마세요. (피할 확률이 PERCENT) -(Shake your head and groan) (PERCENT chance to avoid) -(고개를 흔들며 신음) (피할 확률 PERCENT) +### There is a new presence in the mountain. An opportunist that calls herself 'the Dollmaker.' Claims to be the lost heir to the Kingdom of Ejahl. Please~.|I've seen those hackjobs and reprogrammed wrecks. If there even was a Kingdom of Ejahl, surely their army would consist of more than just scrapped combat drones? +### Silver Witch's Notes #117 +### Silver 117 -(A SPEAKER is looking at something)|So comfy... but how?|Hey, you! Come see this! -(A SPEAKER 가 무언가를 보고 있다)|너무 편안해... 근데 어때?|이봐, 너! 이거 보러와! -(The SPEAKER holds up a RESTRAINT)|It's so soft, but so strict~|Want to give it a try? -(SPEAKER 가 RESTRAINT를 들어 올린다)|너무 부드럽지만 너무 엄격해~|한번 해볼까? -(The SPEAKER quickly fastens it on)|(A wave of comfort passes over you)|(The SPEAKER looks on enviously) -(SPEAKER 가 재빨리 고정한다)|(안락의 물결이 당신을 지나간다)|(SPEAKER 가 부러워하며 바라본다) -(The SPEAKER shrugs)|Eh, alright then. -(SPEAKER 가 어깨를 으쓱한다)|어, 그럼. -(The SPEAKER shrugs)|Up to you. -(SPEAKER 가 어깨를 으쓱한다)|당신에게 달렸습니다. -(The SPEAKER frowns)|But it's so comfy!|Here, look, I'll show you... -(SPEAKER 가 눈살을 찌푸린다)|하지만 너무 편해요!|자, 보세요, 보여드릴께요... -(The SPEAKER approaches)|Hey, see this RESTRAINT?|I'm going to put it on you~ -(SPEAKER 가 다가온다)|이봐, 이 RESTRAINT 보여?|붙일게~ -(The SPEAKER looks startled)|Oh! Uh, I guess you're right... -(발표자가 놀란 듯)|오! 어, 당신 말이 맞는 것 같아요... -(The RESTRAINT is buckled firmly in place)|See? Good, huh?|(You sink into the comforting feeling) -(RESTRAINT가 단단히 고정되어 있습니다.)|보이죠? 좋죠?|(편안한 느낌에 빠져듭니다) -(The SPEAKER ignores you)|(The RESTRAINT is buckled firmly in place)|(A wave of comfort passes over you) -(SPEAKER 가 당신을 무시함)|(억제 장치가 제자리에 단단히 고정됨)|(안락의 물결이 당신을 지나감) +### The Kingdom of Ejahl appeared in Agartha 170 years after the death of Sariel Vinlaga. It had three* rulers who vied for the throne at different times:|Diana, Princess of Machinery|Emer, the Warsage|And the Dollmaker, High General of the Kingdom||*Some manuscripts read 'two' -(Approach) -(접근하다) -(Approach) -(접근하다) -(Keep your distance) -(거리를 유지해라) -(Keep your distance) -(거리를 유지해라) +### The Chronicles of Ejahl -Yes please! -예, 부탁합니다! -(Nod happily) -(기쁘게 끄덕인다) -Nope. -아니요. -(Shake your head) -(악수하다) +### Ejahl 1 -It does look comfortable~ -편해보이네요~ -(Squirm and bow your head) -(비틀거리며 고개를 숙인다) -It looks too strict! (PERCENT chance to avoid) -너무 엄격해 보입니다! (피할 확률이 PERCENT) -(Shake your head rapidly) (PERCENT chance to avoid) -(머리를 빠르게 흔든다) (피할 확률이 PERCENT) +### The Kingdom of Ejahl ruled the island of Agartha for 30 years before its collapse. During the last war, an unknown figure captured the majority of its army and the majority of the population fled by boat. No one was left on the island. +### The Fall of Ejahl +### Ejahl 2 -(The SPEAKER brushes past hurriedly)|Careful girl!|Else I'll lock you away~ -(SPEAKER 가 황급히 지나간다)|조심해!|그렇지 않으면 널 가둘게~ -(The SPEAKER looks at you intrigued)|Aren't you something...|How about wearing this RESTRAINT? -(SPEAKER 가 당신을 흥미롭게 바라본다)|당신은 뭔가...|이 구속복을 입는 건 어때? -(The SPEAKER grins and locks it on)|Maybe I should bump into you more~ -(SPEAKER 가 싱긋 웃으며 입을 다물었다)|좀 더 부딪혀야 할 것 같아요~ -(The SPEAKER rolls her eyes)|Run along then girl~ -(SPEAKER 가 눈을 굴리며)|따라와 아가씨~ -(The SPEAKER nods)|Didn't think so~|Oh, and, uh, sorry for the bump. -(SPEAKER 고개 끄덕임)|그렇게 생각하지 않았어~|아, 그리고, 어, 부딪쳐서 미안해. -(The SPEAKER shakes her head)|You don't get off that lightly.|These are going on. -(SPEAKER 가 고개를 젓는다)|그 말을 가볍게 할 수는 없습니다.|이런 일이 벌어지고 있습니다. -(The SPEAKER frowns)|I think I should.|You'll just bother someone else.|(She holds up a RESTRAINT) -(화자가 눈살을 찌푸린다)|제 생각에는 그래야 할 것 같아요.|당신은 다른 사람을 귀찮게 할 뿐입니다.|(그녀는 제지 장치를 들고 있습니다) -(The SPEAKER sighs)|I'll let you off then.|Oh, and, uh, sorry for the bump. -(SPEAKER 가 한숨을 쉬며)|그럼 놓아줄게.|아, 그리고, 어, 부딪쳐서 미안해. -(The SPEAKER adds the RESTRAINT)|(As she's locking it, she giggles)|You're really cute actually~ -(화자가 구속을 추가함)|(잠그면서 낄낄거림)|너 진짜 귀엽다~ -(The SPEAKER stumbles and grimaces)|Ugh! Fine, you can go then.|D-Didn't want to see you tied anyway... -(SPEAKER 가 비틀거리며 얼굴을 찡그린다)|으! 좋아, 그럼 가도 돼.|D-어차피 묶이는 걸 보고 싶지 않았어... +### Danger Level: Nearly Harmless|A reanimated corpse from before the Great Work. I can't tell if the original soul still inhabits the body, since it can barely speak let alone explain its identity.||-Denizens of the Dungeon by Catherine Willows + +### Danger Level: Normal|These zombies are more motivated than the others. Their behavior is similar to that of vengeful spirits I've encountered in the depths.||-Denizens of the Dungeon by Catherine Willows + +### Fast Z. + +### Danger Level: Normal|A zombie that can use magic. It doesn't look like any magic I've seen outside the ruins, which makes me think that it was taught to use magic. Some of them have tattoos associated with magic in the old times. Since magic comes from the soul, I assume there is some hint of the original soul still present.|-Denizens of the Dungeon by Catherine Willows -That doesn't sound bad... -나쁜 소리는 아닌데... -(Giggle into your gag) -(개그 속으로 키득) -That won't be necessary. -그럴 필요는 없습니다. -(Shake your head) -(악수하다) +### Mage Z. -I'd love to! -하고 싶어요! -(Nod quickly) -(빠르게 끄덕인다) -Not right now. -지금 말고. -(Shake your head) -(악수하다) +### Danger Level: High|A zombie with impeccable sword technique. I've never seen an undead handle a sword so smoothly. Probably buried with their weapons and gear, since most of it is aged. Even their binding techniques resemble those in the textbooks rather than modern ropework.||-Denizens of the Dungeon by Catherine Willows -M-Maybe you should then~ -음-그럼 해봐야겠네요~ -(Giggle and moan) -(낄낄거리며 신음) -You ran into me! (PERCENT chance to avoid) -너 나랑 마주쳤어! (피할 확률이 PERCENT) -(Shake your head and moan) (PERCENT chance to avoid) -(고개를 흔들며 신음) (피할 확률이 PERCENT) +### Warrior Z. +### Danger Level: High|A zombie that uses sealing charms and healing magic. Irony aside, I've seen these with rope marks and gag strap marks on their skin and face. It seems like someone is playing with them. Who could that be?||-Denizens of the Dungeon by Catherine Willows +### Talisman Z. -(A SPEAKER gives you a small curtsy)|Good day.|Care to try part of our uniform? -(A SPEAKER 가 작게 퉁명스럽게 말함)|좋은 하루 되세요.|우리 유니폼 좀 입어보실래요? -(The SPEAKER looks content)|We can offer you this RESTRAINT.|It's a snug fit... -(SPEAKER 가 만족해 보인다)|이 구속을 제공할 수 있습니다.|딱 맞네요... -(The SPEAKER buckles it strictly)|All maids wear this at sometime.|You'd fit right in! -(SPEAKER 가 엄격하게 버클을 채운다)|모든 메이드는 언젠가 이것을 입는다.|당신은 딱 맞을거야! -(The SPEAKER frowns for a second)|Ah, I see.|As you were then. -(SPEAKER 가 잠시 눈살을 찌푸리며)|아, 알겠습니다.|그때처럼. -(The SPEAKER nods)|We hope to see you again nonetheless. -(발표자 고개 끄덕임)|그럼에도 불구하고 다시 뵙기를 바랍니다. -(The SPEAKER glares)|We urge you to reconsider. -(SPEAKER 가 노려본다)|다시 생각해 보시기 바랍니다. -(The SPEAKER has a twinkle in her eye)|We will offer you this RESTRAINT.|You should accept. -(SPEAKER 의 눈이 반짝인다)|우리는 당신에게 이 구속을 제안할 것입니다.|당신은 받아들여야 합니다. -(The SPEAKER pulls an odd smile)|Very well. -(화자가 묘한 미소를 지으며)|아주 좋아. -(The SPEAKER smugly nods)|(With surprising speed, the RESTRAINT locks in place)|Excellent, a good fit. -(SPEAKER 가 멋쩍게 고개를 끄덕인다)|(놀라운 속도로 RESTTRAINT가 제자리에 고정됨)|훌륭합니다. 잘 맞습니다. -(The SPEAKER covers your hand with her mouth)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly) -(SPEAKER 가 당신의 손을 입으로 가리고 있습니다.)|쉿, 더 이상 나쁜 결정은 하지 마세요.|(당신은 그녀가 구속을 엄격하게 조이는 것을 느낍니다) +### Danger Level: Annoying|A playful spirit residing in the dungeon, taking advantage of any adventurers they come across. They can pass through walls, and most physical weapons go right through them. Using a magical weapon seems to banish them for some time, at least.||-Denizens of the Dungeon by Catherine Willows -Yes please! -예, 부탁합니다! -(Nod eagerly) -(열심히 끄덕인다) -No, thank you. -아니요 괜찮습니다. -(Shake your head) -(악수하다) +### Danger Level: Very Annoying|It is said that ghosts are the spirits of pre-Great Work humans whose souls are bound to this world by unfinished dreams and ambitions. But I don't believe a word of that. These little guys care about nothing except humiliating people. Ask me how I know.||-Denizens of the Dungeon by Catherine Willows -I accept~ -받아요~ -(Nod again) -(다시 고개를 끄덕인다) -No, thanks. -고맙지 만 사양 할게. -(Shake your head) -(악수하다) +### Danger Level: Medium|A very playful ghost with a penchant for teasing. It even carries spectral restraints of its own for use in 'games,' which tend to consist of tickling tied up girls.||-Denizens of the Dungeon by Catherine Willows -I-I accept... -나, 받아들여... -(Moan and nod slowly) -(신음하며 천천히 고개를 끄덕인다) -No way! (PERCENT chance to avoid) -안돼! (피할 확률이 PERCENT) -(Shake your head and whimper) (PERCENT chance to avoid) -(고개를 흔들며 칭얼거림) (피할 확률이 PERCENT) +### Danger Level: Low|The feelings of a person who desired wealth in life. While it is unable to claim any physical wealth for itself, it nonetheless will rummage through your pockets and possessions if it gets a chance.||-Denizens of the Dungeon by Catherine Willows +### Danger Level: High|A constricting mass of negative thoughts. According to local myths, the other ghosts attempt to cheer this one up by hugging it, but its wails end up attracting them to your position. Be prepared to take it down lest you find yourself a plaything for the beyond.||-Denizens of the Dungeon by Catherine Willows +### Danger Level: High|While most wizards spend literal centuries mastering the art of magic, there are those lacking the patience or discipline to study magic the old fashioned way. Driven by a need for power, these individuals make contracts with otherworldly beings and become Witches.||-Denizens of the Dungeon by Catherine Willows -(The SPEAKER looks at you inquisitively)|(Wordlessly, they motion at your body)|(They seem to be asking about restraints) -(SPEAKER 가 당신을 의아하게 쳐다본다)|(말없이, 그들은 당신의 몸을 움직인다)|(그들은 구속에 대해 묻는 것 같다) -(The SPEAKER nods understandingly)|(RESTRAINT appears in their hand)|(They tilt their head at you) -(화자가 이해한다는 듯 고개를 끄덕임)|(RESTRAINT가 손에 나타남)|(그들은 당신에게 고개를 기울입니다) -(The SPEAKER spins around you)|(You feel the oddly cold restraint lock in place)|(The SPEAKER nods and moves away) -(SPEAKER 가 당신 주위를 돕니다)|(당신은 이상하게도 차가운 구속이 제자리에 고정되는 것을 느낍니다)|(SPEAKER 가 고개를 끄덕이며 멀어집니다) -(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) -(SPEAKER 가 당신을 쳐다본다)|(그들은 구속을 치우고 떠납니다) -(The SPEAKER leaves you alone) -(SPEAKER 가 널 내버려둔다) -(The SPEAKER seems to frown)|(RESTRAINT appears in their hand)|(They rapidly approach) -(화자가 눈살을 찌푸리는 것 같다)|(RESTRAINT가 그들의 손에 나타난다)|(그들은 빠르게 다가온다) -(The SPEAKER tilts their head)|(RESTRAINT appears in their hand)|(They come closer) -(SPEAKER 가 고개를 기울인다)|(RESTRAINT가 그들의 손에 나타난다)|(그들이 다가온다) -(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) -(SPEAKER 가 당신을 쳐다본다)|(그들은 구속을 치우고 떠납니다) -(The SPEAKER holds you in place)|(You hear the oddly cold material locking)|(They nod at you) -(SPEAKER 가 당신을 제자리에 고정시킵니다)|(이상하게 차가운 물질이 잠기는 소리가 들립니다)|(그들은 당신에게 고개를 끄덕입니다) -(The SPEAKER firmly grabs you)|(The RESTRAINT locks onto your body tightly)|(The oddly cold material makes you shiver) -(SPEAKER 가 당신을 단단히 잡습니다)|(RESTRAINT가 당신의 몸을 단단히 고정시킵니다)|(이상하게 차가운 물체가 당신을 떨게 만듭니다) +### The Witches' Coven -Y-Yes? -그 - 그래? -(Nod back) -(고개 끄덕인다) -No thank you. -아니요 괜찮습니다. -(Shake your head) -(악수하다) +### Witches -(Smile and prepare yourself) -(미소를 지으며 준비하세요) -(Nod and prepare yourself) -(고개 끄덕이고 준비) -No, not that. -아니, 그게 아니야. -(Shake your head) -(악수하다) +### Danger Level: Extreme|A witch gifted in the arts of conjuration. Backed by an army of animated spectral hands and devious tomes, this variety of witch is extremely dangerous. Her close range attacks are slow and unwieldy, but take care not to get surrounded.||-Denizens of the Dungeon by Catherine Willows -W-Whoa! S-Sure... -우와! 으음... -(Moan and nod) -(신음하며 고개를 끄덕인다) -Stop! (PERCENT chance to avoid) -그만! (피할 확률이 PERCENT) -(Shake your head and whine) (PERCENT chance to avoid) -(고개를 흔들며 칭얼거림) (피할 확률이 PERCENT) +### Danger Level: High|They appear to be influential figures in the ancient Bast cult. Not only are they able to wield explosive magics, they can conjure magical wrappings at close range.||-Denizens of the Dungeon by Catherine Willows +### Bast Mummy +### Danger Level: Medium|Worshippers of the Cat Goddess. Devoted to the sole task of defending the tombs from outsiders, they are rarely willing to negotiate. Some maintain peak physical prowess, while others can even cast spells.||-Denizens of the Dungeon by Catherine Willows -(A SPEAKER giggles and calls to you)|Hey there~|Fancy seeing some nature?~ -(SPEAKER 가 낄낄거리며 당신을 부른다)|이봐~|자연을 보고 싶니?~ -(The SPEAKER motions with her hands)|(Vines rise from the floor and twirl)|These will bind you nicely... -(SPEAKER 가 손으로 움직인다)|(덩굴이 바닥에서 솟아올라 빙글빙글 돌았다)|이것이 당신을 멋지게 묶을 것입니다... -(The SPEAKER grins and motions again)|(The plants wrap around you quickly)|(You wriggle against the RESTRAINT) -(SPEAKER 가 씩 웃으며 다시 움직인다)|(식물이 빠르게 당신을 감쌉니다)|(당신은 구속에 맞서 꿈틀거립니다) -(The SPEAKER pouts)|Aww... -(SPEAKER 가 삐죽거린다)|아... -(The SPEAKER frowns)|Not even a little? -(SPEAKER 가 눈살을 찌푸린다)|조금도? -(The SPEAKER smirks)|That wasn't a question~ -(SPEAKER 가 웃는다)|그건 질문이 아니었어~ -(The SPEAKER giggles again)|(Vines begin to move around your feet)|Hold still dear~ -(SPEAKER 가 다시 낄낄 웃는다)|(덩굴이 네 발 주위를 움직이기 시작한다)|가만히 있어라~ -(The SPEAKER sighs and nods)|(The vines retreat from you)|Fiiine, you can go~ -(발표자가 한숨을 쉬며 고개를 끄덕인다)|(포도나무가 물러난다)|피이네, 가도 돼~ -(The vines move much faster)|(You feel the RESTRAINT as you squirm)|A gift, from me~ -(덩굴이 훨씬 더 빨리 움직인다)|(움직일 때 구속을 느낀다)|내가 주는 선물~ -(The SPEAKER giggles loudly)|(The vines catch up and pin you down)|(When they let go, you're left with a RESTRAINT) -(SPEAKER 가 큰 소리로 낄낄거림)|(덩굴이 따라붙어 당신을 꼼짝 못하게 합니다.)|(그들이 놓아주면 당신은 구속을 받게 됩니다) +### Bast Clerics -Always! -언제나! -(Nod eagerly) -(열심히 끄덕인다) -Not right now. -지금 말고. -(Shake your head) -(악수하다) +### Rock-solid and form-fitting. -That sounds exciting! -흥미롭게 들리네요! -(Nod happily) -(기쁘게 끄덕인다) -Wait, not like this! -잠깐, 이대로는 안돼! -(Shake your head) -(악수하다) +### Provides minor protection against enemy attacks. Decreases stealth. -W-Well- o-okay... -으-음- 오-알았어... -(Moan and squirm) -(신음하며 몸부림친다) -Don't! (PERCENT chance to avoid) -하지마! (피할 확률이 PERCENT) -(Shake your head) (PERCENT chance to avoid) -(고개를 흔든다) (피할 확률이 PERCENT) +### Adventuring Corset +### Protects your organs and your sense of style. +### Provides minor protection against enemy attacks at the cost of flexibility. -(A SPEAKER approaches)|Nothing quite beats a strong metal|chain, right? -(SPEAKER 가 다가온다)|강한 금속|사슬만큼 좋은 건 없지? -(The SPEAKER nods happily)|Exactly!|Want one for yourself? -(SPEAKER 가 행복하게 고개를 끄덕인다)|맞아요!|직접 하나 원하세요? -(The SPEAKER wraps a long chain around you)|This should do the trick~|(RESTRAINT settles in place) -(SPEAKER 가 당신을 긴 사슬로 감쌉니다)|이렇게 하면 됩니다~|(RESTRAINT가 자리를 잡습니다) -(The SPEAKER sighs)|Ah well. -(SPEAKER 가 한숨을 쉬며)|아 그렇군요. -(The SPEAKER frowns sadly)|But they make the best noise! -(SPEAKER 가 슬프게 눈살을 찌푸린다)|하지만 그들은 최고의 소리를 낸다! -(The SPEAKER rolls her eyes)|Tough luck then~|You're getting one! -(SPEAKER 가 눈을 굴리며)|그럼 운이 없군~|하나를 얻다니! -(The SPEAKER grins)|See how you feel when|you're wearing one! -(SPEAKER 가 웃는다)|당신이 그것을 입고 있을 때 당신이 어떻게 느끼는지 보십시오! -(The SPEAKER sighs)|Maybe another time then. -(SPEAKER 가 한숨을 쉬며)|그럼 또 한 번. -(The SPEAKER wraps a long chain around you)|(RESTRAINT hugs your body closely)|(You shiver as the cold metal touches you) -(SPEAKER 가 긴 사슬로 당신을 감쌉니다)|(RESTRAINT가 당신의 몸을 꼭 껴안습니다)|(차가운 금속이 당신을 만질 때 당신은 떨립니다) -(The SPEAKER grins as she binds your body)|(RESTRAINT digs into you a little)|Enjoy, cutie~ -(SPEAKER는 그녀가 당신의 몸을 묶으면서 미소를 짓습니다)|(RESTRAINT가 당신을 조금 파헤칩니다)|즐기세요, 귀염둥이~ +### The best uniform. Has a (lockable) zipper in the back for convenience! -I love chains! -나는 사슬을 좋아한다! -(Nod happily) -(기쁘게 끄덕인다) -Plenty beats it. -충분히 이깁니다. -(Shake your head) -(악수하다) +### Removes excess clothing and adds +10 Evasion. +20 Soap and Glue resist, and being drenched dries faster. -Absolutely~ -당연히~ -(Nod again) -(다시 고개를 끄덕인다) -Not really. -설마. -(Shake your head) -(악수하다) +### Robe of Chastity -I-If I have to... -저-해야 한다면... -(Moan and squirm) -(신음하며 몸부림친다) -Ah! Cold! (PERCENT chance to avoid) -아! 춥다! (피할 확률이 PERCENT) -(Shake your head and moan) (PERCENT chance to avoid) -(고개를 흔들며 신음) (피할 확률이 PERCENT) +### A magical leotard whose power stems directly from the divine. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. +### Chainmail Tank Top +### Cumbersome, but effective! -(The SPEAKER nervously walks up to you)|Excuse me miss...|Are you a fan of latex by chance? -(화자가 초조하게 당신에게 다가갑니다)|실례합니다 아가씨...|당신은 우연히 라텍스의 팬입니까? -(The SPEAKER blushes deeply)|Then would you like to try on this RESTRAINT? -(SPEAKER 가 얼굴을 붉히며)|그럼 이 RESTTRAINT를 입어 보시겠습니까? -(The SPEAKER smiles)|You look so good in that! -(SPEAKER 가 웃는다)|너 정말 잘 어울려! -(The SPEAKER frowns)|Aww... -(SPEAKER 가 눈살을 찌푸린다)|아... -(The SPEAKER blushes)|Okay... sorry I asked. -(발표자 얼굴이 붉어짐)|알았어... 물어봐서 미안해. -(The SPEAKER grins and reaches for a RESTRAINT)|Well, too bad-- -(SPEAKER 가 싱긋 웃으며 제지하려고 손을 뻗는다)|글쎄, 안됐군-- -(The SPEAKER grins)|I wasn't offering you a choice...|I was asking if you would LIKE it, hehe~ -(SPEAKER 가 웃는다)|당신에게 선택권을 주는 게 아니었어...|좋아하겠느냐고 물은 거였어, 헤헤~ -(The SPEAKER frowns)|...You're fast! -(발표자가 눈살을 찌푸린다)|...당신은 빠르군요! -(The SPEAKER smiles)|That's right~ -(SPEAKER 미소)|맞아요~ -(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight! -(SPEAKER 가 당신을 제지하고 자물쇠를 클릭합니다.)|저기! 멋지고 단단합니다! +### Provides +10 armor and protection against enemy attacks. Decreases stealth/evasion and makes struggling harder. -Why of course! -물론이죠! -(Nod happily) -(기쁘게 끄덕인다) -Not really. -설마. -(Shake your head) -(악수하다) +### Chainmail Bikini -That sounds fun! -그거 재미있겠다! -(Nod again) -(다시 고개를 끄덕인다) -No, I don't want that! -아니, 난 그걸 원하지 않아! -(Shake your head) -(악수하다) +### Covers the important bits, anyway. -Okay, fine... -좋아... -(Moan and giggle) -(신음하며 낄낄거린다) -Wait, what? (PERCENT chance to avoid) -잠깐, 뭐라고? (피할 확률이 PERCENT) -(Shake your head and moan) (PERCENT chance to avoid) -(고개를 흔들며 신음) (피할 확률이 PERCENT) +### +20 Bondage Resist. Conducts electricity. + +### Light Plate Armor + +### Knight in shining rest-err, armor! + +### Provides +5 armor and high protection. No impact to stealth or evasion + +### Wizard's Robe + +### I have the power! + +### +30% spell damage and +10 spell ward + +### Chain Skirt + +### A defensive garment providing optimal coverage to the lower torso. + +### Provides medium protection. No impact to stealth or evasion + +### Armored Skirt + +### Gloves with an iron grip. + +### Provides +5 armor and minor protection against enemy attacks. Makes noise when attacking. + +### Leather Gloves + +### Protecting you in style. + +### Provides minor protection against enemy attacks. + +### Steel Pauldrons +### Dependable protection for the average adventurer. +### Ranger's Cape -(The SPEAKER nervously walks up to you)|Excuse me miss...|Can you help me out? -(SPEAKER 가 초조하게 당신에게 다가갑니다)|실례합니다 아가씨...|도와주실 수 있나요? -(The SPEAKER blushes deeply)|I managed to unlock my RESTRAINT,|but my mistress expects me to wear it!|Do you mind wearing it instead? -(SPEAKER 가 깊이 얼굴을 붉힌다)|나는 내 구속장치를 풀 수 있었지만|내 여주인은 내가 그것을 착용하기를 기대합니다!|대신 그것을 착용하시겠습니까? -(The SPEAKER smiles)|Thank you so much, miss! -(SPEAKER 가 웃는다)|정말 고마워요, 아가씨! -(The SPEAKER frowns)|I'm going to get in trouble... -(SPEAKER 가 눈살을 찌푸리며)|곤경에 빠지겠다... -(The SPEAKER blushes)|Oh... okay. -(발표자가 얼굴을 붉힌다)|아...알았어. -(The SPEAKER frowns angrily)|Look, I know you're in trouble around here.|Just do me a favor. Please.|I need you to wear this RESTRAINT. -(SPEAKER 가 화를 내며 눈살을 찌푸린다)|이봐, 네가 여기서 문제가 있다는 걸 알아.|부탁 하나만 들어줘. 제발.|이 구속 장치를 착용해야 해. -(The SPEAKER pleads with you)|My mistress is a magician!|She put a spell on it that senses if it's being worn.|Please, you have to hurry! -(SPEAKER 가 당신에게 간청합니다)|내 여주인은 마술사입니다!|그녀는 착용 여부를 감지하는 주문을 걸었습니다.|제발, 서둘러야 해요! -(The SPEAKER sighs and wears it herself)|(The lock starts glowing brightly...) -(SPEAKER 가 한숨을 쉬며 직접 착용)|(자물쇠가 밝게 빛나기 시작합니다...) -(The SPEAKER looks relieved)|Thank you so much miss!|I won't forget you! -(SPEAKER 가 안도하는 듯)|고마워요, 아가씨!|잊지 않을게요! -(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Hmmph! Serves you right!| -(뒤돌아보면 SPEAKER 가 당신을 놀라게 합니다.)|(허리 주변에서 딸깍하는 소리가 들립니다.)|흠! 잘 먹겠습니다!| -(The lock on the RESTRAINT starts glowing...) -(RESTRAINT의 잠금 장치가 빛나기 시작합니다...) +### Inbued with the powers of moss and ferns and stuff. -I would love to help! -도와주고 싶어요! -(Nod eagerly) -(열심히 끄덕인다) -Go find someone else. -가서 다른 사람 찾으세요. -(Shake your head) -(악수하다) +### +25 Evasion. Increases stealth slightly. -That sounds like a tempting offer. -그것은 유혹적인 제안처럼 들립니다. -(Nod again, excited) -(또 끄덕, 흥분) -...What? Why would I need to wear it? -...뭐? 내가 왜 입어야 해? -(Shake your head, puzzled) -(고개를 저으며 의아해) +### Oracle's Armbands -Fine. I'll do it because you asked. -알았어. 부탁하니까 해줄게. -(Moan and nod slowly) -(신음하며 천천히 고개를 끄덕인다) -I won't help you. Wear it yourself. (PERCENT chance to avoid) -도와주지 않을게. 직접 입어. (피할 확률이 PERCENT) -(Shake your head) (PERCENT chance to avoid) -(고개를 흔든다) (피할 확률이 PERCENT) +### Armbands made of a slightly magical material. -(Look at your belt...) -(벨트 좀 봐...) +### +5% spell damage. +5 Magic Armor. +### Armored Boots +### Noisy, but fashionable! -(The SPEAKER walks up to you)|We don't get a lot of visitors.|I take it that you enjoy bondage? -(SPEAKER 가 당신에게 다가온다)|방문객이 많지 않습니다.|속박을 즐기시는 걸로 압니다. -(The SPEAKER tilts her head)|Well, I have a RESTRAINT lying around,|and I figured you'd enjoy it. -(SPEAKER 가 고개를 갸웃한다)|글쎄요, 제 주변에 구속 장치가 있는데|즐거우실 거라 생각했습니다. -(The SPEAKER smiles)|I'm glad you like it! -(SPEAKER 가 웃는다)|당신이 좋아해서 기뻐요! -(The SPEAKER frowns)|I guess I'll have to find someone else to wear it. -(SPEAKER 가 눈살을 찌푸린다)|그것을 입을 다른 사람을 찾아야 할 것 같아요. -(The SPEAKER looks disappointed)|Oh well. -(SPEAKER 가 실망한 듯)|아, 그렇군요. -(The SPEAKER grins and reaches toward you!)|Well, I think it'd look great on you! -(SPEAKER 가 씩 웃으며 당신에게 손을 뻗는다!)|음, 당신에게 잘 어울릴 것 같아요! -(The SPEAKER grins)|You don't have a choice, dear~ -(SPEAKER 가 웃는다)|당신은 선택의 여지가 없어요, 얘야~ -(The SPEAKER frowns)|Darn it! Missed my chance. -(화자가 눈살을 찌푸린다)|젠장! 기회를 놓쳤어. -(The SPEAKER smiles)|Good, good~ -(SPEAKER 미소)|좋아 좋아~ -(The SPEAKER restraints you and clicks a lock on)|There! Nice and tight! -(SPEAKER 가 당신을 제지하고 자물쇠를 클릭합니다.)|저기! 멋지고 단단합니다! +### Provides +5 armor and protection against enemy attacks. Decreases stealth. -Why of course! -물론이죠! -(Nod happily) -(기쁘게 끄덕인다) -Not really. -설마. -(Shake your head) -(악수하다) +### Hide Boots -That sounds fun! -그거 재미있겠다! -(Nod again) -(다시 고개를 끄덕인다) -No, I don't want that! -아니, 난 그걸 원하지 않아! -(Shake your head) -(악수하다) +### For stepping into all kinds of trouble! -Okay, fine... -좋아... -(Moan and giggle) -(신음하며 낄낄거린다) -Wait, what? (PERCENT chance to avoid) -잠깐, 뭐라고? (피할 확률이 PERCENT) -(Shake your head and moan) (PERCENT chance to avoid) -(고개를 흔들며 신음) (피할 확률이 PERCENT) +### Generating Map... +### Mystic wrappings constrict around your body! +### You'll need a sharp object to cut items. Look for a knife or a piece of scrap on the floor. +### If you can't get your knife into place, try sitting next to a crack on the wall. -(The SPEAKER grins as she sees you)|Hey there sweetie~|I think you'd look good in some ropes! -(SPEAKER 가 당신을 보고 싱긋 웃는다)|안녕하세요 자기야~|로프를 착용하면 멋져 보일 것 같아요! -(The SPEAKER looks at your bound body)|I've got some more ropes for you, babe! -(SPEAKER 가 묶인 몸을 본다)|당신을 위한 밧줄이 더 있어요, 자기야! -(The SPEAKER smiles)|Okay, hold still while I get you rigged up~ -(SPEAKER 미소)|알았어, 내가 장비할 동안 가만히 있어~ -(The SPEAKER slaps your butt as she ties the last knot)|All trussed up~ -(SPEAKER 가 마지막 매듭을 묶으면서 당신의 엉덩이를 찰싹 때립니다)|모두 묶었습니다~ -(The SPEAKER looks disappointed and packs her rope away) -(SPEAKER 가 실망한 표정을 지으며 밧줄을 움켜쥔다) -(The SPEAKER frowns)|Aw. What a missed opportunity! -(화자가 눈살을 찌푸린다)|아. 정말 놓친 기회! -(The SPEAKER grins and reaches for her satchel)|Well, too bad-- -(SPEAKER 가 씩 웃으며 가방에 손을 뻗는다)|글쎄, 안됐군-- -(The SPEAKER grins)|But I've already brought so much rope with me~ -(SPEAKER 가 웃는다)|하지만 이미 밧줄을 너무 많이 가져왔어~ -(The SPEAKER frowns)|Suit yourself. -(SPEAKER 가 눈살을 찌푸린다)|마음대로 해. -(The SPEAKER smiles)|Good girl~ -(SPEAKER 미소)|잘했어~ -(The SPEAKER takes you down and trusses you up tightly)|That'll teach you~ -(SPEAKER 가 당신을 끌어내리고 당신을 단단히 묶습니다)|그게 당신에게 가르쳐 줄 것입니다~ +### Your character will automatically try to lodge the knife into the wall. -I think so too! -나도 그렇게 생각해! -(Nod excitedly) -(신나게 끄덕인다) -I don't think so. -나는 그렇게 생각하지 않는다. -(Shake your head) -(악수하다) +### You'll need to find a cutting weapon with the magic tag to cut magic items. -Yes miss! -그래 아가씨! -(Wiggle in place happily) -(행복하게 제자리에서 흔든다) -Actually, I'm having second thoughts... -사실, 생각이 좀 바뀌어서... -(Shake your head nervously) -(초조하게 고개를 흔든다) +### You need to equip your magic cutting weapon to cut magic items. -Fine. You win. -좋아. 네가 이겼어. -(Moan and giggle) -(신음하며 낄낄거린다) -Go away! (PERCENT chance to avoid) -저리가! (피할 확률이 PERCENT) -(Shake your head and moan) (PERCENT chance to avoid) -(고개를 흔들며 신음) (피할 확률이 PERCENT) +### You can surrender in the menu if you want to be treated more gently. +### That ghost looks less aggressive than the others. Maybe she can help? +### Need help? Try asking a neutral NPC for assistance! -(The SPEAKER perks her ears as she sees you)|You've got a nice body.|I think it'll do better with some training! -(SPEAKER 가 당신을 보고 귀를 쫑긋 세웁니다)|당신은 몸매가 좋습니다.|운동을 좀 하면 더 잘할 것 같아요! -(The SPEAKER grins and hands you a paper)|Nevermere Training is always looking for new recruits!|I'll just have you sign here... -(SPEAKER 가 웃으며 당신에게 종이를 건네준다)|Nevermere Training은 항상 신입 사원을 찾고 있습니다!|여기에 사인을 하도록 하겠습니다... -(The SPEAKER gets you suited up)|There you go! Now go be a good girl! -(SPEAKER 가 옷을 입혀준다)|자, 간다! 이제 좋은 여자가 되어라! -(The SPEAKER scoffs)|That's what they all say. -(SPEAKER 가 비웃는다)|다들 그렇게 말한다. -(The SPEAKER frowns)|What a shame. -(화자가 눈살을 찌푸린다)|안타까운 일이네요. -(The SPEAKER grins and reaches for her baton)|No? Well, I heard you have some debts to pay~ -(SPEAKER 가 씩 웃으며 지휘봉을 잡는다)|아니요? 갚아야 할 빚이 있다고 들었는데~ -(The SPEAKER grins)|I promise you it's a good deal~ -(SPEAKER 가 웃는다)|좋은 거래라고 약속할게요~ -(The SPEAKER frowns)|Fine. I'll look for other candidates. -(의장이 눈살을 찌푸린다)|좋아요. 다른 후보자를 찾아보겠습니다. -(The SPEAKER smiles)|That's right. Your name, please? -(SPEAKER 가 웃는다)|맞습니다. 이름을 말씀해 주십시오. -(The SPEAKER zaps you and places you in restrictive gear)|Hmph. Unruly girls need training! -(SPEAKER 가 당신을 재촉하고 제한적인 장비를 착용하게 합니다.)|흠. 제멋대로인 소녀들은 훈련이 필요합니다! +### You flanked the enemy! Now attack its weak point for massive damage! -This sounds like an interesting opportunity. -이것은 흥미로운 기회처럼 들립니다. -(Nod excitedly) -(신나게 끄덕인다) -No thanks, I know what that entails... -아니요, 그게 무슨 뜻인지 압니다... -(Shake your head) -(악수하다) +### Enemies that miss an attack become vulnerable for a turn. -I'll sign it! -서명하겠습니다! -(Accept the contract) -(계약 수락) -A contract? No way. -계약? 설마. -(Refuse the contract) -(계약 거부) +### Attack them for a guaranteed critical hit! -Fine. I'll sign it... -알았어. 서명할게... -(Moan and nod) -(신음하며 고개를 끄덕인다) -Never! (PERCENT chance to avoid) -절대! (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### before the attack lands! You can tell the difference by the border of the tiles. +### Enemy attacks take time to hit. Make sure to step out of the warning tiles, -(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(SPEAKER 가 당신을 보고 짧은 인사를 합니다)|안녕하세요.|당신은 우리가 사용할 수 있는 자질을 가지고 있는 것 같습니다.|당신에게 자리를 제공하게 되어 기쁩니다... -(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(SPEAKER 가 목을 가다듬기 전에 잠시 미소를 지음)|멋지다!|여기 유니폼이 있어... -(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(SPEAKER 가 버클을 채우고 끈을 아주 세게 잡아당겨...)|(자물쇠 몇 개가 딸깍하는 소리가 들린다...)|멋지군. 첫 번째 작업은 이 바닥을 청소하는 것입니다.|행운을 빕니다. . -(The SPEAKER tilts her head and shrugs)|We are always prepared... -(SPEAKER 가 고개를 갸우뚱하며 어깨를 으쓱한다)|우리는 항상 준비되어 있습니다... -(The SPEAKER nods)|Fair enough. -(SPEAKER 가 고개를 끄덕인다)|그만하면 됐어. -(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(SPEAKER 가 씩 웃으며 헐렁한 드레스를 꺼낸다)|당신이 꽤 많은... 적을 만들었다는 것을 상기시켜 드려도 될까요?|그들 중 한 명과 마주치게 된다면 안타까운 일이 될 것입니다... -(The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(SPEAKER 가 자랑스럽게 고개를 끄덕인다)|우리는 기록을 약간 변경할 용의가 있습니다~ -(The SPEAKER frowns)|You won't know what hit you. -(SPEAKER 가 눈살을 찌푸린다)|당신은 무엇이 당신을 때렸는지 모를 것입니다. -(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(SPEAKER 미소)|올바른 결정을 내리셨다니 기쁩니다.|이제 첫 번째 작업은 이 바닥을 청소하는 것입니다.|행운을 빕니다. -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(SPEAKER 가 갑자기 당신이 반응할 수 있는 것보다 더 빨리 움직입니다.)|(당신이 아래로 내려가면서 발이 당신의 등을 누르는 것을 느낍니다.)|(그녀는 당신에게 제복을 입히고 단단히 고정시킵니다...)|당신은 추가로 필요합니다. 훈련, 아마... +### You can dodge out of the way of most projectiles. Avoid the marked tiles. -This sounds like an interesting opportunity. -이것은 흥미로운 기회처럼 들립니다. -(Nod excitedly) -(신나게 끄덕인다) -No thanks, I know what that entails... -아니요, 그게 무슨 뜻인지 압니다... -(Shake your head) -(악수하다) +### 'Charge' is a unified ammunition for all of your weapons. Recharge it with ancient crystals. -Gladly! -기꺼이! -(Accept the contract) -(계약 수락) -W-where did you get that uniform? (Refuse) -어, 그 교복 어디서 구했어? (거절) -(Refuse the contract) -(계약 거부) +### Spent crystals can slot into some light fixtures to recharge them, but it requires 100 gold. -Fine. I'll sign it... -알았어. 서명할게... -(Moan and nod) -(신음하며 고개를 끄덕인다) -Never! (PERCENT chance to avoid) -절대! (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### There is an elevator in this room, but it won't function until you defeat major enemies on this level. +### If you can't escape from a restraint, try offering gold at a shrine devoted to its goddess. -(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(SPEAKER 가 당신을 보고 짧은 인사를 합니다)|안녕하세요.|당신은 우리가 사용할 수 있는 자질을 가지고 있는 것 같습니다.|당신에게 자리를 제공하게 되어 기쁩니다... -(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(SPEAKER 가 목을 가다듬기 전에 잠시 미소를 지음)|멋지다!|여기 유니폼이 있어... -(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(SPEAKER 가 버클을 채우고 끈을 아주 세게 잡아당겨...)|(자물쇠 몇 개가 딸깍하는 소리가 들린다...)|멋지군. 첫 번째 작업은 이 바닥을 청소하는 것입니다.|행운을 빕니다. . -(The SPEAKER tilts her head and shrugs)|We are always prepared... -(SPEAKER 가 고개를 갸우뚱하며 어깨를 으쓱한다)|우리는 항상 준비되어 있습니다... -(The SPEAKER nods)|Fair enough. -(SPEAKER 가 고개를 끄덕인다)|그만하면 됐어. -(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(SPEAKER 가 씩 웃으며 헐렁한 드레스를 꺼낸다)|당신이 꽤 많은... 적을 만들었다는 것을 상기시켜 드려도 될까요?|그들 중 한 명과 마주치게 된다면 안타까운 일이 될 것입니다... -(The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(SPEAKER 가 자랑스럽게 고개를 끄덕인다)|우리는 기록을 약간 변경할 용의가 있습니다~ -(The SPEAKER frowns)|You won't know what hit you. -(SPEAKER 가 눈살을 찌푸린다)|당신은 무엇이 당신을 때렸는지 모를 것입니다. -(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(SPEAKER 미소)|올바른 결정을 내리셨다니 기쁩니다.|이제 첫 번째 작업은 이 바닥을 청소하는 것입니다.|행운을 빕니다. -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(SPEAKER 가 갑자기 당신이 반응할 수 있는 것보다 더 빨리 움직입니다.)|(당신이 아래로 내려가면서 발이 당신의 등을 누르는 것을 느낍니다.)|(그녀는 당신에게 제복을 입히고 단단히 고정시킵니다...)|당신은 추가로 필요합니다. 훈련, 아마... +### Defeating enemies recovers some willpower. -This sounds like an interesting opportunity. -이것은 흥미로운 기회처럼 들립니다. -(Nod excitedly) -(신나게 끄덕인다) -No thanks, I know what that entails... -아니요, 그게 무슨 뜻인지 압니다... -(Shake your head) -(악수하다) +### Temporary enemies and summons don't restore anything, however. -Gladly! -기꺼이! -(Accept the contract) -(계약 수락) -W-where did you get that uniform? (Refuse) -어, 그 교복 어디서 구했어? (거절) -(Refuse the contract) -(계약 거부) +### Attacking a helpless enemy captures her and sends her to your Collection. -Fine. I'll sign it... -알았어. 서명할게... -(Moan and nod) -(신음하며 고개를 끄덕인다) -Never! (PERCENT chance to avoid) -절대! (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### You can access the Collection in the Items screen, 2nd tab. +### Conjure Essence Mote +### Spend 50 DP to conjure a mote of pure spell essence. The mana cost of this spell is decreased based on your maximum DP.|Can only be cast while you have less than 100% DP. +### You channel your distraction into a tangible orb! +### You don't have enough distraction! -(The SPEAKER perks her ears as she sees you)|Glory to the blessed kitty!|Are you prepared to join us? -(SPEAKER 가 당신을 보고 귀를 쫑긋 세웁니다)|축복받은 고양이에게 영광을!|우리와 함께할 준비가 되셨습니까? -(The SPEAKER nods happily)|Fantastic! You just need to agree to be nice to cats.|And also we own you now. -(SPEAKER 가 행복하게 고개를 끄덕인다)|멋지다! 고양이에게 친절하게 대하는 데 동의하기만 하면 된다.|그리고 이제 우리는 당신을 소유하고 있다. -(The SPEAKER jumps happily)|Wonderful! Here's your collar! -(SPEAKER 가 행복하게 뛰어오른다)|멋지군! 여기 옷깃이야! -(The SPEAKER whimpers and looks at you)|How mean! -(SPEAKER 가 훌쩍거리며 당신을 바라본다)|정말 못됐군! -(The SPEAKER's ears flop)|Aww... we thought you were cute. -(SPEAKER 의 귀가 쫑긋)|아...귀엽다고 생각했는데. -(The SPEAKER frowns)|Oh? Well, I guess I'll tell the others~ -(SPEAKER 가 찡그린다)|오? 글쎄, 다른 사람들에게 말할 것 같아요~ -(The SPEAKER grins slyly)|You wouldn't hurt the kitties, would you? -(SPEAKER 가 교활하게 웃는다)|당신은 고양이들을 다치게 하지 않을 거에요, 그렇죠? -(The SPEAKER frowns)|Then we'll have to make sure you don't come to harm anyone! -(화자가 눈살을 찌푸린다)|그럼 우리는 당신이 누구에게도 해를 끼치지 않도록 해야 합니다! -(The SPEAKER smiles proudly)|I knew you would pull through! -(SPEAKER 가 자랑스럽게 웃는다)|당신이 이겨낼 줄 알았어! -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(SPEAKER 가 갑자기 당신이 반응할 수 있는 것보다 더 빨리 움직입니다.)|(당신이 아래로 내려가면서 발이 당신의 등을 누르는 것을 느낍니다.)|(그녀는 당신에게 제복을 입히고 단단히 고정시킵니다...)|당신은 추가로 필요합니다. 훈련, 아마... +### Choose an open space. -Yes! I love the blessed kity! -예! 축복받은 고양이를 사랑합니다! -(Nod excitedly) -(신나게 끄덕인다) -No, you guys are a bunch of weirdos. -아니, 너희들은 이상한 놈들이야. -(Shake your head) -(악수하다) +### Choose a tile with no existing mote. -Yes! I will be nice to the kitties! -그래! 고양이들에게 잘해줄게! -(Join them) -(그들과 합류) -Wait, I didn't agree to that! (Refuse) -잠깐만요, 동의하지 않았어요! (거절) -(Refuse) -(거절하다) +### You're too distracted to concentrate your distraction! -Okay fine... I won't hurt the kitties. (Join them) -알았어 알았어... 고양이들 다치게 하지 않을게. (조인해) -(Moan and nod) -(신음하며 고개를 끄덕인다) -Never! (PERCENT chance to avoid) -절대! (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### The burst of desire overwhelms you! +### Psychic Link +### Deals 20 Psychic damage, then creates a psychic link between you and a single target for 50 turns, splitting distraction gain between the two of you. Requires that you and the target be able to see each other. +### Target a non-blinded enemy. +### You briefly lock eyes with the target, forming a psychic link! +### The psychic link ends between you and the ENMY. -(The SPEAKER does a curtsy)|Why hello there!|You have a wonderful bod-er, book!|Would you like to help me? -(SPEAKER 가 퉁명스럽게 말함)|안녕하세요!|멋진 몸매를 가지셨네요, 책님!|도와주실래요? -(The SPEAKER smiles briefly)|You have an opportunity to model for me!|I need someone to wear all of my wonderful inventions! -(SPEAKER 가 짧게 웃는다)|당신은 나를 위해 모델이 될 기회가 있습니다!|내 모든 멋진 발명품을 착용할 누군가가 필요합니다! -(The SPEAKER laces you up in the tight fabric...)|(You hear the click of a few locks going on...)|Oh my goodness... So pretty!|You'll make a fine assistant! -(SPEAKER 가 당신을 꽉 조이는 천으로 묶습니다...)|(자물쇠 몇 개가 딸깍하는 소리가 들립니다...)|맙소사... 너무 예뻐요!|당신은 훌륭한 조수가 될 것입니다! -(The SPEAKER frowns)|Aw... -(SPEAKER 가 눈살을 찌푸린다)|아... -(The SPEAKER clenches her fist to the ceiling)|Nooooo!!! -(SPEAKER 가 천장을 향해 주먹을 쥔다)|안돼!!! -(The SPEAKER grins and pulls out a frilly dress)|Don't knock it till you try it!|Trust me, it'll be fun! -(SPEAKER 가 웃으며 주름 장식이 달린 드레스를 꺼낸다)|해보기 전에는 노크하지 마세요!|저를 믿으세요, 재미있을 거예요! -(The SPEAKER furrows her brow)|Watch your tongue there, little lady.|Or I'll have to plug it for you... -(SPEAKER 가 미간을 찌푸리며)|혀 조심해, 아가씨.|아니면 내가 당신을 위해 플러그를 꽂아야겠어... -(The SPEAKER folds her arms as ribbons rise up around her)|Suit yourself, hehe~ -(SPEAKER 가 팔짱을 끼고 리본이 그녀 주위로 올라간다)|마음대로 해, 헤헤~ -(The SPEAKER smiles)|Yes! Yes! Wonderful! -(SPEAKER 가 웃는다)|예! 예! 훌륭합니다! -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(SPEAKER 가 갑자기 당신이 반응할 수 있는 것보다 더 빨리 움직입니다.)|(당신이 아래로 내려가면서 발이 당신의 등을 누르는 것을 느낍니다.)|(그녀는 당신에게 제복을 입히고 단단히 고정시킵니다...)|당신은 추가로 필요합니다. 훈련, 아마... +### Shock Collar -Sure! -확신하는! -(Nod excitedly) -(신나게 끄덕인다) -Nope. -아니요. -(Shake your head) -(악수하다) +### Condense your aroused thoughts into stimulating electricity, consuming 30 DP to zap anyone that's currently holding your leash for 40 e-stim damage. 25% chance to stun for a long time, otherwise stuns briefly. Subsequent uses cost 2x the DP. -Sign me up! -저를 등록하세요! -(Accept the position) -(포지션 수락) -And wear tacky clothes all the time? -항상 촌스러운 옷을 입으시겠습니까? -(Refuse the position) -(입장 거부) +### You must be leashed by someone to use this. -Fine... sign me up. -좋아... 등록해. -(Moan and nod) -(신음하며 고개를 끄덕인다) -Why don't you try it on yourself! (PERCENT chance to avoid) -직접 해보는 게 어때! (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### You don't have enough distraction. +### You zap your leasher! +### You are psychically connected! +### You've used Shock Collar recently and it costs more DP. +### Essence Crystal -(The SPEAKER runs up to you)|Wow! You make a fine specimen-er, I mean...|Nice to meet you! -(SPEAKER 가 당신에게 달려옵니다)|와! 당신은 훌륭한 표본이군요. 제 말은...|만나서 반가워요! -(The SPEAKER smiles)|Now, I have something wonderful in store for you.|(She takes out a blue catsuit)|I'd like you to be my assistant! -(SPEAKER 가 웃는다)|이제, 당신을 위해 준비한 멋진 것이 있습니다.|(그녀는 파란색 캣수트를 꺼냅니다)|당신이 제 비서가 되어주셨으면 합니다! -(The SPEAKER looks excited)|Awesome! Let me help you get in uniform... -(SPEAKER 가 흥분해 보인다)|멋지다! 제복 입는 걸 도와줄게... -(The SPEAKER shrugs)|It was worth a shot... -(SPEAKER 가 어깨를 으쓱한다)|그럴만한 가치가 있었어... -(The SPEAKER shrugs)|It was worth a shot... -(SPEAKER 가 어깨를 으쓱한다)|그럴만한 가치가 있었어... -(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|There's just... a lot to do.|That's why I need an assistant. -(화자가 답답해 보인다)|난... 내 일이 미친 짓이 아니야!|그냥... 할 일이 많아.|그래서 조수가 필요해. -(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|We seek only knowledge! -(화자가 답답해 보인다)|그게 아니라... 내 일은 미친 짓이 아니야!|우리는 오직 지식만을 추구한다! -(The SPEAKER frowns)|Time for a test run! -(SPEAKER 가 눈살을 찌푸린다)|테스트 실행 시간입니다! -(The SPEAKER looks happy again)|Thank you! I'm super grateful! -(SPEAKER 가 다시 행복해 보인다)|고맙습니다! 정말 감사합니다! -(The SPEAKER tilts her head)|Fine then. You win.|(As you leave, you hear a 'just kidding' as she breaks a glass vial)|(A suit of blue latex envelops you!) -(SPEAKER 가 고개를 기울인다)|그럼 좋다. 당신이 이겼다.|(떠나면서 그녀가 유리병을 깨면서 '농담'하는 소리가 들린다)|(파란색 라텍스가 당신을 감싼다!) +### When you miscast, 50% chance to emit a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. -...Hello? -...여보세요? -(Nod excitedly) -(신나게 끄덕인다) -You guys are crazy. -너희들은 미쳤어. -(Shake your head) -(악수하다) +### A necklace designed for mages who are novices or easily distracted. It helps recover magical essence lost during miscast. -Gladly! -기꺼이! -(Accept the offer) -(제안 수락) -W-where did you get that uniform? (Refuse) -어, 그 교복 어디서 구했어? (거절) -(Refuse the offer) -(제안 거절) +### When you miscast, the necklace emits a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. -Fine. I'll be your assistant. -좋아. 내가 너의 비서가 될게. -(Moan and nod) -(신음하며 고개를 끄덕인다) -Go find someone else. (PERCENT chance to avoid) -가서 다른 사람 찾으세요. (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### You erase the seal sigil. +### You absorb the mote, granting miscast reduction. +### Your necklace emits a mote as a result of miscasting. +### Your distraction reaches a critical point! -100% miscast chance. +### While at 100% distraction, you gain -100% miscast chance, but spending too much mana at once may cause you to go over the edge. +### -100% miscast chance, but casting spells can send you over the edge. +### The psychic link conducts away some of the intensity... -(The SPEAKER greets you)|Normally we don't meddle in mortal affairs.|But you, Outsider, are different.|Let's have a conversation. -(화자가 인사한다)|보통 우리는 인간사에 간섭하지 않는다.|하지만 아웃사이더인 당신은 다르다.|대화를 하자. -(The SPEAKER smiles warmly)|Outsiders have a lower rank in our society.|But it is a rank all the same.|You will be above your mortal peers.|What do you say? -(화자가 따뜻하게 웃는다)|외부인은 우리 사회에서 낮은 지위에 있다.|하지만 그것은 모두 같은 계급이다.|당신은 필멸의 동료들보다 위에 있게 될 것이다.|무슨 말을 합니까? -(The SPEAKER clasps some 'jewelry' around your limbs)|You look beautiful, my dear.|I will leave you to your own affairs until we meet again. -(SPEAKER 가 당신의 팔다리에 '보석'을 움켜쥔다)|당신은 아름다워요, 여보.|우리가 다시 만날 때까지 당신의 일에 맡기겠습니다. -(The SPEAKER turns her head away)|Hmph. I offer you a bargain and you refuse. -(SPEAKER 가 고개를 돌린다)|흠. 내가 당신에게 흥정을 제안했지만 당신은 거절했습니다. -(The SPEAKER turns her head away)|Hmph. As expected. -(SPEAKER 가 고개를 돌린다)|흥. 역시. -(The SPEAKER folds her arms)|If you are not with us, then you are against us.|You shall face the wrath of the wild. -(화자가 팔짱을 낀다)|당신이 우리와 함께하지 않는다면 당신은 우리를 대적하는 것입니다.|당신은 야생의 분노에 직면하게 될 것입니다. -(The SPEAKER frowns)|Hardly slavery!|A mere slave would not be allowed to even set foot in our society. -(화자가 눈살을 찌푸린다)|거의 노예가 아닙니다!|단순한 노예는 우리 사회에 발을 들여놓는 것조차 허용되지 않습니다. -(The SPEAKER frowns)|We will meet again. -(화자가 눈살을 찌푸린다)|우리는 다시 만날 것입니다. -(The SPEAKER nods and smiles)|(She decorates your body with 'jewelry')|I am glad you had a change of heart. -(SPEAKER 가 고개를 끄덕이며 웃는다)|(그녀는 당신의 몸을 '장신구'로 장식합니다)|마음이 바뀌어서 다행입니다. -(The SPEAKER scoffs)|(Her magic suddenly binds you tightly in glowing ropes)|Amateur. -(SPEAKER 가 비웃는다)|(그녀의 마법이 갑자기 당신을 빛나는 밧줄로 단단히 묶는다)|아마추어. +### Your linked target lets go of herself, transmitting a wave of pleasure to yourself... -I'm interested. (Talk with her) -관심이 있어. (그녀와 이야기해봐) -(Nod excitedly) -(신나게 끄덕인다) -No thanks. -고맙지 만 사양 할게. -(Shake your head) -(악수하다) +### FCTN RMTPE -I accept your gracious offer! -당신의 은혜로운 제안을 받아들입니다! -(Accept) -(수용하다) -I won't be a slave to you. -난 당신의 노예가 되지 않겠습니다. -(Refuse) -(거절하다) +### PTRN's RMTPE -Fine, fine... I will accept. -좋아, 좋아... 받아들일게. -(Moan and nod) -(신음하며 고개를 끄덕인다) -No way. (PERCENT chance to avoid) -안돼. (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### Leads to PLCE +### (You find a girl clad in a pink catsuit and restrained with straps.)|(She wears a backpack with a note attached to it.)|'My pet here can pick up and deliver restraints for you~'|'Try opening the Facilities tab and depositing restraints!'|'Signed: Your Loyal Warden' +### It becomes hard to resist the dragon's fury... +### The dragon overwhelms you with sheer force... +### Your strength begins to fade... -(The SPEAKER smiles at you)|Mortal. -(SPEAKER 가 당신에게 미소 짓는다)|필멸자. -(The SPEAKER points to the ground)|Kneel before me and accept your collar. -(SPEAKER 가 땅을 가리키며)|내 앞에 무릎을 꿇고 당신의 옷깃을 받으십시오. -(The SPEAKER snaps her fingers)|(A collar of cold black metal materializes around your neck)|A girl who knows her place! Wonderful... -(SPEAKER 가 손가락을 튕긴다)|(당신의 목에 차갑고 검은 금속 목걸이가 나타난다)|자신의 위치를 ​​아는 소녀! 훌륭하다... -(The SPEAKER scoffs)|Hmmph. Mortals... -(SPEAKER 가 비웃는다)|흠. 필멸자... -(The SPEAKER scoffs)|Hmmph. Mortals... -(SPEAKER 가 비웃는다)|흠. 필멸자... -(The SPEAKER folds her arms)|Well, look who doesn't know her place~ -(SPEAKER 가 팔짱을 낀다)|글쎄, 누가 자기 위치를 모르나봐~ -(The SPEAKER folds her arms)|I didn't offer you a choice in the matter.|You're mine, I've decided that. -(SPEAKER 가 팔짱을 낀다)|나는 당신에게 그 문제에 대해 선택권을 주지 않았습니다.|당신은 내 꺼야, 내가 결정했어. -(The SPEAKER's eyes begin to glow)|Looks like we'll do this the fun way! -(SPEAKER 의 눈이 빛나기 시작한다)|우리가 이것을 재미있는 방법으로 할 것 같다! -(The SPEAKER smiles)|Wonderful~|Now come along, my pet! -(SPEAKER 가 웃는다)|멋지다~|이제 따라와, 내 애완동물! -(The SPEAKER scoffs and snaps her fingers)|(Metallic restraints come at you from all angles and snap in place tightly)|(A gag forces itself into your mouth)|Now then, what were we saying? -(SPEAKER 가 비웃으며 손가락을 튕긴다)|(금속 구속이 모든 각도에서 당신에게 다가오고 제자리에 단단히 고정됩니다.)|(재갈이 당신의 입에 억지로 박힙니다)|그럼 우리가 뭐라고 하던가요? +### >Entrance -Yes? -예? -(Nod excitedly) -(신나게 끄덕인다) -I don't talk to monsters! -나는 괴물과 대화하지 않는다! -(Shake your head) -(악수하다) +### >Exit -O-okay. (Kneel) -알았어. (무릎을 꿇고) -(Kneel) -(무릎) -I refuse! -내가 거부! -(Refuse) -(거절하다) +### >Stairs -Then it looks like I have no choice. (Join her) -그럼 어쩔 수 없나 보네요. (합류) -(Moan and nod) -(신음하며 고개를 끄덕인다) -I will never bow to you! (PERCENT chance to avoid) -절대 절하지 않겠습니다! (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### Quest(GDSNM) +### [GDSNM] +### Bed! +### Silver -(The SPEAKER waves)|You seem like an exceptional individual.|What do you think of joining the Guild? -(SPEAKER 가 손을 흔든다)|당신은 특별한 사람인 것 같습니다.|길드에 가입하는 것에 대해 어떻게 생각하세요? -(The SPEAKER smiles)|Excellent! I'll put in a word with the Guild.|Do note: this will affect your reputation with certain bad actors. -(발표자가 웃는다)|좋아요! 길드에 한마디 하겠습니다.|주의: 이것은 특정 나쁜 배우들에 대한 평판에 영향을 미칠 것입니다. -(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. -(SPEAKER 가 마법 두루마리를 꺼내 서명한다)|(두루마리가 에테르 속으로 사라진다)|행운을 빈다, 프리랜서. -(The SPEAKER nods)|Fair enough. Guild work is not for everyone. -(SPEAKER 가 고개를 끄덕인다)|그렇군요. 길드 작업은 아무나 하는 것이 아닙니다. -(The SPEAKER nods)|Very well, then I won't bother you. -(SPEAKER 가 고개를 끄덕인다)|좋아요, 그럼 귀찮게 하지 않겠습니다. -(The SPEAKER looks dubious)|You know, there's quite a bounty on your head.|I'm sure we could do something about it. -(SPEAKER 가 수상쩍어 보인다)|당신도 알다시피, 당신의 목에는 상당한 현상금이 걸려 있습니다.|우리가 그것에 대해 뭔가를 할 수 있을 것이라고 확신합니다. -(The SPEAKER tilts her head)|Haha, very funny.|We both know that you're not one of those... right? -(SPEAKER 가 고개를 갸웃한다)|하하, 아주 웃기다.|당신이 그런 사람이 아니라는 건 우리 둘 다 알고 있어...맞지? -(The SPEAKER frowns and readies for battle)|My instincts were right. -(SPEAKER 가 눈살을 찌푸리며 전투를 준비한다)|내 직감이 맞았다. -(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. -(SPEAKER 가 마법 두루마리를 꺼내 서명한다)|(두루마리가 에테르 속으로 사라진다)|행운을 빈다, 프리랜서. -(The SPEAKER suddenly strikes you to the floor)|(You feel a foot on your back as she ties you in a strict rope hogtie...)|(She dusts off her hands)|We'll have a talk when you get out of that, okay? -(SPEAKER 가 갑자기 당신을 바닥으로 내리칩니다.)|(그녀가 당신을 엄격한 밧줄 매춘부로 묶을 때 당신은 당신의 등에 발이 닿는 것을 느낍니다...)|(그녀는 그녀의 손에서 먼지를 털어냅니다.)|당신이 그만둬, 알았지? +### Mecha -This sounds like an interesting opportunity. -이것은 흥미로운 기회처럼 들립니다. -(Nod excitedly) -(신나게 끄덕인다) -I have no interest in joining the guild. -길드 가입에는 관심이 없습니다. -(Shake your head) -(악수하다) +### chest -Gladly! -기꺼이! -(Accept the offer) -(제안 수락) -What if I am one of those bad actors? (Refuse) -내가 그 나쁜 배우들 중 하나라면? (거절) -(Refuse the offer) -(제안 거절) +### Lost Items -Fine... (Join) -좋아... (참가) -(Moan and nod) -(신음하며 고개를 끄덕인다) -Go away. (PERCENT chance to avoid) -저리가. (피할 확률이 PERCENT) -(Frown at her) (PERCENT chance to avoid) -(얼굴을 찌푸리며) (피할 확률이 PERCENT) +### Cache +### Toy Chest +### (L) +### (The SPEAKER sits encased in skintight rubber up to her nose.|Though the latex over her mouth is smooth and flat,|you know from her whimpering moans that her mouth|is totally filled with a gag, useless like the rest of her body.|Some sort of stand affixes her to the floor.) +### (You don't have any solvents that work on latex) -(The SPEAKER beeps)|Prisoner 74121 identified.|Subject not registered in database. -(SPEAKER 가 삐 소리를 냄)|수감자 74121이 확인되었습니다.|대상은 데이터베이스에 등록되지 않았습니다. -(The SPEAKER beeps)|Confirming database entry.|Say 'I will be a good girl' to enter database. -(SPEAKER 가 삐 소리를 냄)|데이터베이스 입력 확인 중.|데이터베이스에 들어가려면 '착한 여자가 될게'라고 말하세요. -(The SPEAKER beeps and applies tracking gear)|(The metallic cables click into place with a soft beep)|Prisoner 74121 registered. Good girl. -(SPEAKER 가 신호음을 울리고 추적 장치를 적용함)|(금속 케이블이 부드러운 신호음과 함께 제자리에 고정됨)|죄수 74121이 등록되었습니다. 착합니다. -(The SPEAKER beeps)|Acknowledged. Be warned:|Lost contact with Sections 98, 97, 96, 95...|(The list goes on...) -(SPEAKER 신호음)|확인했습니다. 경고:|섹션 98, 97, 96, 95와 연락 두절...|(목록은 계속됩니다...) -(The SPEAKER beeps)|Acknowledged. Updating records. -(SPEAKER 신호음)|확인했습니다. 기록 업데이트 중. -(The SPEAKER beeps and flashes its lights)|Target acquired. -(SPEAKER 가 신호음을 울리고 조명을 깜박임)|목표물을 획득했습니다. -(The SPEAKER beeps and flashes its lights)|Target has complied. Supplying uniform. -(SPEAKER 가 신호음을 울리고 조명을 깜박임)|목표가 준수했습니다. 유니폼을 공급합니다. -(The SPEAKER beeps and flashes its lights)|Engaging capture protocol. -(SPEAKER에서 신호음이 울리고 조명이 깜박임)|포획 프로토콜을 사용 중입니다. -(The SPEAKER beeps and flashes its lights)| -(SPEAKER에서 신호음이 울리고 표시등이 깜박임)| -(The SPEAKER blasts you with a stunning ray and captures you)|Target neutralized. -(SPEAKER 가 놀라운 광선으로 당신을 폭파하고 당신을 붙잡습니다)|목표물을 무력화시킵니다. +### (You dissolve her restraints, fumbling around for a while with your bound hands) -Please register me. -저를 등록해주세요. -(Stop to talk to the robot) -(로봇에게 말을 멈추고) -Prisoner 74121? You must be mistaken... -죄수 74121? 착각하셨나봐요... -(Avoid the robot) -(로봇을 피해) +### (You rescue the SPEAKER)|Thank you!|Let's get out of here! -Prisoner 74121 reporting. I will be a good girl. -죄수 74121 보고. 착하게 살겠습니다. -(Accept the contract) -(계약 수락) -Actually, I am an administrator. (Refuse) -사실 저는 관리자입니다. (거절) -(Refuse the contract) -(계약 거부) +### (You rescue the SPEAKER)|Mmmmph!|(She wants to keep her gag...) -I'm sorry, I will be a good girl! -미안해, 좋은 여자가 될게! -(Moan and nod) -(신음하며 고개를 끄덕인다) -What? (PERCENT chance to avoid) -뭐? (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### (You are not holding a cutting tool) +### (You cut her restraints, fumbling around for a while with your bound hands) +### (You don't have enough mana for Remove Slime) +### (You utter a word of release to free the SPEAKER)|Many thanks!|Let's go! +### (You utter a word of release to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) +### Dissolve the latex with a SLVNT -(The SPEAKER smiles)|I used to be an adventurer like you.|Then I joined up with the Dragonhearts! -(SPEAKER 미소)|나도 너 같은 모험가였어.|그때 드래곤하트에 합류했어! -(The SPEAKER clears her throat)|Well, we're actually recruiting!|You're free to join us if you agree to fight for justice! -(화자가 목을 가다듬는다)|음, 우리는 실제로 모집하고 있습니다!|정의를 위해 싸우는 데 동의한다면 우리와 함께 할 수 있습니다! -(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! -(SPEAKER 가 힘차게 악수를 건넸다)|자매 관계에 오신 것을 환영합니다, 모험가님! -(The SPEAKER tilts her head and shrugs)|Ah well. -(SPEAKER 가 고개를 기울이고 어깨를 으쓱한다)|아 그렇군요. -(The SPEAKER nods)|Fair enough. -(SPEAKER 가 고개를 끄덕인다)|그만하면 됐어. -(The SPEAKER frowns)|What is it?|You're not an enemy of justice, are you? -(화자가 눈살을 찌푸리며)|뭐야?|당신은 정의의 적이 아니지, 그렇지? -(The SPEAKER frowns)|...If you won't fight for justice, that makes you an enemy of justice. -(화자가 눈살을 찌푸린다)|...정의를 위해 싸우지 않는다면 정의의 적이 되는 것입니다. -(The SPEAKER frowns and cracks her knuckles)|Looks like my suspicions were right!|Looks like you and I are going to have a little chat... -(SPEAKER 가 눈살을 찌푸리며 손가락 관절을 꺾는다)|제 생각이 맞았나 보군요!|당신과 제가 잡담을 좀 할 것 같군요... -(The SPEAKER giggles)|Hehe, just messin' with ya.|Anyway, welcome to the sisterhood! -(SPEAKER 낄낄거림)|헤헤, 그냥 장난칠 뿐이야.|어쨌든 자매결연에 온 걸 환영해! -(The SPEAKER grabs you and ties you up)|You won't be making trouble like that any time soon. -(SPEAKER 가 당신을 붙잡고 묶습니다.)|언젠가는 그런 문제를 일으키지 않을 것입니다. +### Cut her out with a sharp tool -I wish I could join you. -당신과 함께 할 수 있으면 좋겠습니다. -(Nod excitedly) -(신나게 끄덕인다) -Please go away. -저리가요. -(Back away) -(뒤로) +### Use Remove Slime to unlock her -Great! Sign me up! -좋습니다! 가입하세요! -(Join) -(가입하다) -Fight for justice? Sounds restrictive... -정의를 위해 싸워라? 제약이 많은 것 같은데... -(Back away) -(뒤로) +### Local Saves -Actually, justice doesn't sound bad! -사실, 정의는 나쁘게 들리지 않아! -(Moan and nod) -(신음하며 고개를 끄덕인다) -What are you going to do about it? (PERCENT chance to avoid) -어떻게 하시겠습니까? (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### Cloud Saves +### solvent +### Latex Doll Stand +### A stand for your latex dolls, coated in a smooth rubber coating. -(The SPEAKER waves and calls you over)|Looks like you've made a name for yourself.|What do you say to a little agreement? -(SPEAKER 가 손을 흔들며 당신을 부릅니다)|당신은 이름을 알린 것 같습니다.|약간의 합의에 대해 뭐라고 말합니까? -(The SPEAKER clears her throat)|Well, you're currently on our turf.|But we're willing to cut you some slack.|You just have to agree not to attack any of us. -(SPEAKER 가 목을 가다듬는다)|음, 당신은 현재 우리 영역에 있습니다.|하지만 우리는 당신에게 약간의 여유를 줄 용의가 있습니다.|당신은 우리 중 누구도 공격하지 않기로 동의하기만 하면 됩니다. -(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! -(SPEAKER 가 힘차게 악수를 건넸다)|자매 관계에 오신 것을 환영합니다, 모험가님! -(The SPEAKER tilts her head and shrugs)|Ah well. -(SPEAKER 가 고개를 기울이고 어깨를 으쓱한다)|아 그렇군요. -(The SPEAKER nods)|Fair enough. -(SPEAKER 가 고개를 끄덕인다)|그만하면 됐어. -(The SPEAKER frowns)|Criminals? Girl, we ARE the law around these parts~ -(화자 눈살을 찌푸리며)|범죄자? 여보, 이 부분은 우리가 법이야~ -(The SPEAKER grins)|I like your spunk, girl.|But you're kidding, right? -(SPEAKER 가 웃는다)|난 당신의 엉덩이가 좋아요, 아가씨.|하지만 농담하는 거에요, 그렇죠? -(The SPEAKER raises her fists and smiles)|You're on! -(SPEAKER 가 주먹을 치켜들고 웃는다)|시작합니다! -(The SPEAKER chuckles)|Here's a toast to a new partnership! -(발표자 웃음)|새로운 파트너십을 위한 건배입니다! -(The SPEAKER catches you and trusses you up)|Maybe we'll just have to find you an owner, then!|Hehe. -(SPEAKER 가 당신을 잡아 묶습니다.)|그럼 우리는 당신에게 주인을 찾아야 할 것 같습니다!|헤헤. +### Has a flange for propping up even dolls wearing chastity belts. -I'm all ears. -나는 모두 귀입니다. -(Listen closely) -(잘 들어봐) -I don't deal with criminals. -나는 범죄자와 거래하지 않는다. -(Back away) -(뒤로) -It's a deal! -그것은 거래의! -(Mumble in agreement) -(동의 중얼중얼) -You don't understand. This is MY turf. -당신은 이해하지 못합니다. 이것은 내 영역입니다. -(Scoff at her through your gag) -(개그로 그녀를 비웃는다) -Haha, just kidding. I'm with you. -하하, 농담이야. 나랑 같이 있어. -(Moan and nod) -(신음하며 고개를 끄덕인다) -Put 'em up! (PERCENT chance to avoid) -어서 올려! (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### (The SPEAKER strokes a hand over your body)|It looks like you're carrying some dangerous goods.|Prisoners shouldn't be carrying what doesn't belong to them~ +### (The SPEAKER folds her hands together)|Miss, I was instructed to make sure you don't have|anything dangerous. I'm going to search you now. +### (The SPEAKER looks at you plainly)|Did you think you were going to sneak in with all of that? +### (The SPEAKER smiles)|Let's see, what loot do we have here...|(SPEAKER is going to search you) +### (The SPEAKER scans you with a red light)|Enumerating contraband...|Please comply for removal. +### Yes, miss... (Begin search and confiscation) +### Mmph... (Nod politely) (Begin search and confiscation) +### No, I refuse! (Fight) +### Mmph! (Shake your head and fight) +### Option not available at 0 WP -(The SPEAKER stops walking and speaks)|You there!|It seems your attunement with magic is high.|Join us. -(SPEAKER 가 걸음을 멈추고 말함)|거기 있구나!|마법에 대한 조율이 높은 것 같군.|함께하자. -(The SPEAKER nods calmly)|We will use some special equipment to increase your attunement.|Put these on. -(SPEAKER 가 침착하게 고개를 끄덕인다)|우리는 당신의 조율을 높이기 위해 특별한 장비를 사용할 것입니다.|이걸 입으세요. -(The 'equipment' locks in place)|Excellent. Soon you will be much more powerful. -('장비'가 제자리에 고정됨)|훌륭합니다. 곧 당신은 훨씬 더 강력해질 것입니다. -(The SPEAKER stops talking and walks away.) -(SPEAKER 가 말을 멈추고 자리를 떴다.) -(The SPEAKER walks away like nothing happened.) -(SPEAKER 가 아무 일도 없었다는 듯이 걸어나간다.) -(The SPEAKER frowns slightly)|We are prepared to use force if need be... -(SPEAKER 가 살짝 눈살을 찌푸린다)|우리는 필요하다면 무력을 사용할 준비가 되어 있습니다... -(The SPEAKER stares at you)|Why? Did you not say you wanted to join us? -(SPEAKER 가 당신을 쳐다본다)|왜요? 우리와 함께하고 싶다고 하지 않았나요? -(The SPEAKER frowns)|We have failed to convince the human. -(화자가 눈살을 찌푸린다)|우리는 인간을 설득하는 데 실패했습니다. -(The SPEAKER nods.)|You have made a wise decision. -(SPEAKER 가 고개를 끄덕인다.)|당신은 현명한 결정을 내렸습니다. -(The SPEAKER uses magic to force you.)|There. Try not to succumb to your desires too much. -(SPEAKER는 당신을 강제하기 위해 마법을 사용합니다.)|저기요. 당신의 욕망에 너무 굴복하지 마세요. +### (The SPEAKER starts by removing most of your clothes...) -Um... sure? -음... 확실히? -(Nod excitedly) -(신나게 끄덕인다) -Get away from me! -나에게서 도망! -(Shake your head) -(악수하다) +### (Next, the SPEAKER looks through your weapons) -Shiny... (Put them on) -반짝반짝... (착용) -(Let her put them on you) -(그녀가 당신에게 그것들을 입히게 해주세요) -What? No way! (Refuse) -뭐? 안돼! (거절) -(Refuse the contract) -(계약 거부) +### (Finally, the SPEAKER opens the rest of your bag) -Okay, I will wear them... -알았어, 내가 입을게... -(Moan and nod) -(신음하며 고개를 끄덕인다) -Monster! (PERCENT chance to avoid) -괴물! (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### (The search is complete)|There! Now let's get you situated~ +### (The search is complete)|Alright miss, please behave, okay? -(The SPEAKER does a short bow as she sees you)|Um... hi!|I have a letter for you... -(SPEAKER 가 당신을 보고 짧은 인사를 합니다)|음... 안녕!|당신에게 줄 편지가 있어요... -(The letter is a contract from the College)|(They want you to sign up as an instructor for apprentices)|(The SPEAKER looks at you nervously.) -(그 편지는 대학에서 온 계약서입니다.)|(그들은 당신이 견습생 강사로 등록하기를 원합니다.)|(SPEAKER 가 당신을 초조하게 바라보고 있습니다.) -(The SPEAKER sighs in relief)|That's good...|(You sign the contract and it vanishes into the aether) -(화자가 안도의 한숨을 내쉬며)|잘됐네요...|(계약서에 서명하면 에테르 속으로 사라집니다) -(The SPEAKER whimpers)|What will I tell them... -(SPEAKER 가 흐느끼며)|그들에게 무엇을 말해야 할까... -(The SPEAKER whimpers)|What will I tell them... -(SPEAKER 가 흐느끼며)|그들에게 무엇을 말해야 할까... -(The SPEAKER glares at you)|It's an important message concerning your standing!|With the College! -(SPEAKER 가 당신을 노려본다)|그것은 당신의 지위에 관한 중요한 메시지입니다!|대학과 함께! -(The SPEAKER blushes)|Well...|I was told we would make changes to your academic record,|should you refuse... -(발표자가 얼굴을 붉힌다)|글쎄...|당신의 학업 기록을 변경하겠다고 들었는데|거절하면... -(The SPEAKER frowns)|They told me to make sure you sign...|by any means necessary! -(발표자가 눈살을 찌푸린다)|그들은 당신이 서명했는지 확인하라고 하더군요...|어떤 수단을 써서라도! -(The SPEAKER nods and smiles)|Thank you so much!|I don't know what I would have done if you said no... -(SPEAKER 가 고개를 끄덕이며 웃는다)|정말 감사합니다!|아니라고 했다면 어떻게 했을지 모르겠습니다... -(The SPEAKER frowns and waves her wand)|(A bunch of ropes come out of the ground and restrain you)|Hmmph. I'll tell them you signed it anyway.|I can't go back empty handed. -(SPEAKER 가 눈살을 찌푸리며 지팡이를 흔든다)|(다발의 밧줄이 땅에서 나와 당신을 구속합니다)|흠. 어쨌든 당신이 서명했다고 말하겠습니다.|빈손으로 돌아갈 수 없습니다. -Thank you for delivering it. (Read it) -전달해주셔서 감사합니다. (읽어보세요) -(Read the letter) -(편지를 읽으세요) -There's nothing good inside that letter. -그 편지 안에 좋은 건 하나도 없어. -(Shake your head) -(악수하다) +### Confiscated AMNTx ITMN! -Great! Wonderful! -좋아! 훌륭해! -(Accept the contract) -(계약 수락) -There is no way I'd accept. -내가 받아들일 방법이 없어. -(Refuse the contract) -(계약 거부) +### Kept AMNTx ITMN. -Fine. I'll read it. (Join the College as an instructor) -알았어. 읽어볼게. (강사로 학원에 들어와) -(Moan and nod) -(신음하며 고개를 끄덕인다) -This is unethical! I refuse! (PERCENT chance to avoid) -이것은 비윤리적입니다! 거절합니다! (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### Sneaked in AMNTx ITMN! +### GUN +### The room echoes with the sound of a rubber bullet being fired! -(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... -(SPEAKER 가 당신을 보고 짧은 인사를 합니다)|안녕하세요.|당신은 우리가 사용할 수 있는 자질을 가지고 있는 것 같습니다.|당신에게 자리를 제공하게 되어 기쁩니다... -(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... -(SPEAKER 가 목을 가다듬기 전에 잠시 미소를 지음)|멋지다!|여기 유니폼이 있어... -(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. -(SPEAKER 가 버클을 채우고 끈을 아주 세게 잡아당겨...)|(자물쇠 몇 개가 딸깍하는 소리가 들린다...)|멋지군. 첫 번째 작업은 이 바닥을 청소하는 것입니다.|행운을 빕니다. . -(The SPEAKER tilts her head and shrugs)|We are always prepared... -(SPEAKER 가 고개를 갸우뚱하며 어깨를 으쓱한다)|우리는 항상 준비되어 있습니다... -(The SPEAKER nods)|Fair enough. -(SPEAKER 가 고개를 끄덕인다)|그만하면 됐어. -(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... -(SPEAKER 가 씩 웃으며 헐렁한 드레스를 꺼낸다)|당신이 꽤 많은... 적을 만들었다는 것을 상기시켜 드려도 될까요?|그들 중 한 명과 마주치게 된다면 안타까운 일이 될 것입니다... -(The SPEAKER nods proudly)|We are willing to made some changes to our records~ -(SPEAKER 가 자랑스럽게 고개를 끄덕인다)|우리는 기록을 약간 변경할 용의가 있습니다~ -(The SPEAKER frowns)|You won't know what hit you. -(SPEAKER 가 눈살을 찌푸린다)|당신은 무엇이 당신을 때렸는지 모를 것입니다. -(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. -(SPEAKER 미소)|올바른 결정을 내리셨다니 기쁩니다.|이제 첫 번째 작업은 이 바닥을 청소하는 것입니다.|행운을 빕니다. -(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... -(SPEAKER 가 갑자기 당신이 반응할 수 있는 것보다 더 빨리 움직입니다.)|(당신이 아래로 내려가면서 발이 당신의 등을 누르는 것을 느낍니다.)|(그녀는 당신에게 제복을 입히고 단단히 고정시킵니다...)|당신은 추가로 필요합니다. 훈련, 아마... +### Tactical Rubber Bullet -This sounds like an interesting opportunity. -이것은 흥미로운 기회처럼 들립니다. -(Nod excitedly) -(신나게 끄덕인다) -No thanks, I know what that entails... -아니요, 그게 무슨 뜻인지 압니다... -(Shake your head) -(악수하다) +### A powerful rubber bullet bounces you to the ground! + +### The powerful rubber bullet knocks you down and congeals into Capture Foam! + + + +### Capture Foam (Feet) -Gladly! -기꺼이! -(Accept the contract) -(계약 수락) -W-where did you get that uniform? (Refuse) -어, 그 교복 어디서 구했어? (거절) -(Refuse the contract) -(계약 거부) +### A sticky foam that spreads quickly and hardens into a tight rubbery layer. -Fine. I'll sign it... -알았어. 서명할게... -(Moan and nod) -(신음하며 고개를 끄덕인다) -Never! (PERCENT chance to avoid) -절대! (피할 확률이 PERCENT) -(Shake your head and frown) (PERCENT chance to avoid) -(고개를 흔들며 찡그린다) (피할 확률이 PERCENT) +### A knife won't cut it, it simply reforms around the cut. +### Capture Foam (Ankles) +### Capture Foam (Legs) +### Capture Foam (Arms) +### Capture Foam (Hands) +### Capture Foam (Mouth) +### Capture Foam (Head) -(The SPEAKER waves)|Greetings,|I manufacture all sorts of goods.|Would you like to buy some? -(SPEAKER 가 손을 흔든다)|안녕하세요,|나는 모든 종류의 상품을 제조합니다.|사시겠습니까? -(The SPEAKER drops her hammer and cracks her knuckles)|Put em up! -(SPEAKER 가 망치를 떨어뜨리고 손가락 마디를 꺾는다)| 올려! -(The SPEAKER looks at you.)|But you already have one? -(SPEAKER 가 당신을 쳐다봅니다.)|그런데 이미 갖고 계시죠? -(The SPEAKER folds her arms)|I don't do charity, ma'am. -(발표자가 팔짱을 끼며)|저는 자선사업을 하지 않습니다, 부인. -(The SPEAKER nods)|See this magic rune here?|Stick it in any lock, and it opens, just like that!|Only works once, though. -(SPEAKER 가 고개를 끄덕인다)|여기 이 마법의 룬이 보이나요?|아무 자물쇠에 꽂아도 그대로 열립니다!|하지만 한 번만 작동합니다. -(The SPEAKER nods)|A versatile weapon. One of my favorites. -(SPEAKER 가 고개를 끄덕인다)|다재다능한 무기입니다. 제가 가장 좋아하는 무기 중 하나입니다. -(The SPEAKER nods)|Keep your friends close, and your enemies far away. -(SPEAKER 가 고개를 끄덕인다)|친구는 가까이 두고 적들은 멀리 두십시오. -(The SPEAKER nods)|Handy to have one of these around. -(SPEAKER 가 고개를 끄덕인다)|이것들 중 하나가 있으면 편리합니다. -(The SPEAKER nods)|The best defense is a good offense. -(SPEAKER 가 고개를 끄덕인다)|최선의 방어는 좋은 공격입니다. -(The SPEAKER looks puzzled)|Don't know why you want 'em, but sure. -(SPEAKER 가 어리둥절해 보인다)|당신이 왜 그들을 원하는지 모르겠지만, 확실합니다. +### Capture Foam Dispenser +### This collar is designed to make sure its wearer does not escape at all costs. -(The SPEAKER approaches you with an offer)|Greetings! I am a potion trader.|Give me your strongest potions!|I pay cash! -(SPEAKER 가 제안을 가지고 당신에게 접근합니다)|안녕하세요! 저는 물약 상인입니다.|당신의 가장 강력한 물약을 주세요!|현금을 지불합니다! -(The SPEAKER doesn't look surprised)|Okay, just let me set these down real quick... -(SPEAKER 는 놀란 표정을 짓지 않는다)|좋아요, 빨리 내려놓겠습니다... -(The SPEAKER smiles)|A spellcaster will have great use for this! -(SPEAKER 가 웃는다)|주문캐스터는 이것을 아주 유용하게 사용할 것입니다! -(The SPEAKER smiles)|Wow! That's a lot of mana!|It requires a skilled mage to tap into, though... -(SPEAKER 가 웃는다)|와우! 엄청난 마나네요!|사용하려면 숙련된 마법사가 필요하지만... -(The SPEAKER smiles)|It fills me with... determination. -(SPEAKER 가 웃는다)|그것은 저를... 결단력으로 가득 채웁니다. -(The SPEAKER smiles)|Refreshing! -(SPEAKER 가 웃는다)|상쾌하다! -(The SPEAKER smiles)|They say a bitter tea cures all ails... -(화자 미소)|그들은 쓴 차가 만병을 치료한다고 하던데... -(The SPEAKER smiles)|An empty flask?|...Oh. -(SPEAKER 미소)|빈 플라스크?|...오. +### It will occasionally cause Capture Foam to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of Capture Foam you have on you. -(The SPEAKER approaches you)|My greetings, Outsider!|My throat is parched and I seek the bounties of nature.|Do you have what I seek? -(SPEAKER 가 당신에게 다가옵니다)|안녕하세요, 아웃사이더!|목이 바짝 마르고 자연의 은혜를 찾습니다.|당신은 내가 찾는 것을 가지고 있습니까? -(The SPEAKER doesn't look surprised)|Then let us have a battle of wits! -(SPEAKER 는 놀란 기색이 없다)|그럼 슬기롭게 싸우자! -(The SPEAKER thanks you)|A kind offering! You have my thanks. -(화자 감사합니다)|친절한 제물입니다! 감사합니다. -(The SPEAKER thanks you)|A magnificent offering! You have my thanks. -(화자님 감사합니다)|훌륭한 제안입니다! 감사합니다. -(The SPEAKER tilts her head)|...where did you get this? -(SPEAKER 가 고개를 갸웃한다)|...이거 어디서 났어? -(The SPEAKER thanks you)|A fine trinket!|I will enjoy meditating upon it. -(화자 감사합니다)|좋은 장신구입니다!|명상하는 것을 즐기겠습니다. -(The SPEAKER thanks you)|I sense its flowing essence.|You have my thanks. -(The SPEAKER 가 당신에게 감사합니다)|나는 그것의 흐르는 정수를 느낍니다.|감사합니다. -(The SPEAKER thanks you)|I can feel a great sadness emanating from it.|It calls for warmth. -(The SPEAKER thanks you)|그것에서 뿜어져 나오는 커다란 슬픔을 느낄 수 있어.|따뜻함이 필요해. -(The SPEAKER approaches you with an offer)|Hello!|I am searching for magical scrolls.|Would you happen to have any? -(SPEAKER 가 제안을 가지고 당신에게 다가옵니다)|안녕하세요!|마법의 두루마리를 찾고 있습니다.|가지고 계실까요? -(The SPEAKER doesn't look surprised)|Rude! -(발표자는 놀란 기색이 없다)|무례하다! -(The SPEAKER smiles)|Thank you! -(SPEAKER 미소)|감사합니다! -(The SPEAKER smiles)|Thank you! -(SPEAKER 미소)|감사합니다! -(The SPEAKER smiles)|Thank you! -(SPEAKER 미소)|감사합니다! -(The SPEAKER raises a brow)|Thank you! This one is rare! -(화자가 이마를 찡그린다)|고마워요! 이건 희귀해요! -(The SPEAKER approaches you with an offer)|Hey girl~|You seem like the explorer type.|Happen to have any good finds? -(SPEAKER 가 제안을 가지고 접근함)|이봐 아가씨~|당신은 탐험가 타입인 것 같군요.|혹시 좋은 발견이 있으신가요? -(The SPEAKER frowns)|Well then. -(SPEAKER 가 눈살을 찌푸린다)|그럼. -(The SPEAKER grins)|Are you willing to part with this? -(SPEAKER 가 찡그린다)|이것과 헤어질 의향이 있습니까? -(The SPEAKER smiles)|Aha!|Fantastic. -(SPEAKER 미소)|아하!|멋지다. -(The SPEAKER frowns)|I'll take it, I guess... -(SPEAKER 가 눈살을 찌푸린다)|내가 할게요, 아마... -(The SPEAKER smiles)|Oooh~!|I love technology! -(SPEAKER 가 웃는다)|오오오~!|기술이 좋아요! +### Tactical Rubber -(The SPEAKER surprises you)|Greetings, traveler.|I am looking for tools to aid in my mission. -(SPEAKER 가 당신을 놀라게 함)|안녕하세요, 여행자님.|내 임무에 도움이 될 도구를 찾고 있습니다. -(The SPEAKER doesn't look surprised)|That's how it is, then. -(SPEAKER 는 놀란 기색이 없다)|그럼 그렇구나. -(The SPEAKER bows)|Always be prepared. -(SPEAKER 인사)|항상 준비하십시오. -(The SPEAKER bows)|A bit dangerous, but I'll take it. -(SPEAKER 인사)|약간 위험하지만 내가 할게요. -(The SPEAKER bows)|A tool of the trade. -(SPEAKER 가 절을 한다)|무역의 도구. -(The SPEAKER bows)|A most valuable find. -(발표자 인사)|가장 값진 발견입니다. +### An alchemical substance made to be stretchy and more resilient than natural rubber. -(The SPEAKER runs up to you)|Hello!|You wouldn't happen to have seen any ghosts lately?|I'm gathering evidence! -(SPEAKER 가 달려온다)|안녕하세요!|최근에 유령을 본 적이 없을까요?|증거를 수집 중입니다! -(The SPEAKER gasps)|You wouldn't! -(SPEAKER 헐떡거림)|당신은 그러지 않을 겁니다! -(The SPEAKER shakes your hand)|Ah! Ghosts love these! -(SPEAKER 가 당신의 손을 흔든다)|아! 유령들이 이걸 좋아해요! -(The SPEAKER smiles)|This looks like strong evidence for my investigation! -(화자 미소)|이것은 내 조사에 대한 강력한 증거처럼 보입니다! -(The SPEAKER grins)|Woah! That's so cool! -(SPEAKER 가 웃는다)|와! 정말 멋져요! +### Developed by kinky alchemists and marketed to PMCs across the islands. -You're giving me everything you have. -당신은 당신이 가진 모든 것을 나에게주고 있습니다. -(Flail threateningly at her) -(그녀에게 위협적으로 도리깨질) -(Do it) -(해) -(Back off) -(물러나 다) -(Sell Item0 for ItemCost0 gp) -(ItemCost0 gp에 대해 Item0 판매) -(Sell Item1 for ItemCost1 gp) -(ItemCost1gp로 Item1 판매) -(Sell Item2 for ItemCost2 gp) -(ItemCost2 gp에 대해 Item2 판매) -(Sell Item3 for ItemCost3 gp) -(ItemCost3 gp로 Item3 판매) -(Sell Item4 for ItemCost4 gp) -(ItemCost4 gp에 대해 Item4 판매) -(Sell Item5 for ItemCost5 gp) -(ItemCost5gp로 Item5 판매) -(Sell Item6 for ItemCost6 gp) -(ItemCost6 gp에 대해 Item6 판매) -(Sell Item7 for ItemCost7 gp) -(ItemCost7 gp에 대해 Item7 판매) -(Sell Item8 for ItemCost8 gp) -(ItemCost8 gp에 대해 Item8 판매) -(Sell Item9 for ItemCost9 gp) -(ItemCost9 gp로 Item9 판매) - -(Buy Item0 for ItemCost0 gp) -(ItemCost0 gp로 Item0 구매) -(Buy Item1 for ItemCost1 gp) -(ItemCost1 gp로 Item1 구매) -(Buy Item2 for ItemCost2 gp) -(ItemCost2 gp로 Item2 구매) -(Buy Item3 for ItemCost3 gp) -(ItemCost3 gp로 Item3 구매) -(Buy Item4 for ItemCost4 gp) -(ItemCost4 gp로 Item4 구매) -(Buy Item5 for ItemCost5 gp) -(ItemCost5gp로 Item5 구매) -(Buy Item6 for ItemCost6 gp) -(ItemCost6 gp로 Item6 구매) -(Buy Item7 for ItemCost7 gp) -(ItemCost7 gp로 Item7 구매) -(Buy Item8 for ItemCost8 gp) -(ItemCost8 gp로 Item8 구매) -(Buy Item9 for ItemCost9 gp) -(ItemCost9 gp로 Item9 구매) +### Capture Foam -(The SPEAKER appears in a flash of light)|I come in the name of the Goddess.|I presume you need my aid?|(She will remain and help you with restraints for 50 turns) -(SPEAKER 가 섬광 속에서 나타납니다)|나는 여신의 이름으로 왔습니다.|내 도움이 필요한 것 같습니까?|(그녀는 남아서 50턴 동안 구속을 도와줄 것입니다) -(The SPEAKER gives you two knives)|Don't hurt yourself with these, okay? -(SPEAKER 가 너에게 칼 두 개를 준다)|이걸로 다치지마, 알았지? -(The SPEAKER gives you three picks)|I don't know how you plan to use these... -(SPEAKER 가 당신에게 세 가지 선택권을 줍니다)|나는 당신이 이것들을 어떻게 사용할 계획인지 모르겠습니다... -(The SPEAKER reluctantly gives you a magic key)|Okay, these don't grow on trees... -(SPEAKER 가 마지못해 마법의 열쇠를 준다)|좋아, 이건 나무에서 자라지 않아... +### A restraining weapon used to apprehend difficult targets. -(Ask for 2 knives) -(칼 2개 요청) -(Ask for 3 lockpicks) -(락픽 3개 요청) -(Ask for a magic key) -(마법의 열쇠를 부탁해) +### Tactical Rubber (Feet) -There is no valid space next to you! -옆에 유효한 공간이 없습니다! +### The end result of capture foam. Strict. Sustainable. Affordable. +### Tactical Rubber (Ankles) -(You approach the SPEAKER) -(SPEAKER 에게 접근) -(Threaten) -(협박) -(Really attack?) -(진짜 공격?) -(Attack her) -(그녀를 공격) -(Never mind...) -(그만두자...) -(You decide not to) -(하지 않기로 결정) +### Tactical Rubber (Legs) -(Walk past) -(지나간다) -(Walk past) -(지나간다) -(Walk past multiple allies) -(여러 아군 지나서 걸어가기) -(Never mind...) -(그만두자...) -(Confirm? You will walk through her for a few turns) -(확인? 몇 턴 동안 그녀를 통해 걸을 것입니다) -(...) -(...) +### Tactical Rubber (Arms) -(Stop following me) -(따라 다니지 말아 줘) -(Stop following me) -(따라 다니지 말아 줘) -(Never mind...) -(그만두자...) -(Confirm? You will have to find the SPEAKER again.) -(확인? SPEAKER를 다시 찾아야 합니다.) -(You decide you still need the help) -(당신은 여전히 ​​도움이 필요하다고 결정했습니다) -(The SPEAKER refuses to follow your orders) -(SPEAKER 가 당신의 명령을 따르기를 거부합니다) +### Tactical Rubber (Hands) -(Follow me) -(나를 따라와) -(Follow me) -(나를 따라와) -(Never mind...) -(그만두자...) -(The SPEAKER starts following you) -(SPEAKER 가 당신을 따라오기 시작합니다) -(You decide you don't need the help) -(당신은 도움이 필요하지 않다고 결정했습니다) -(The SPEAKER refuses to follow your orders) -(SPEAKER 가 당신의 명령을 따르기를 거부합니다) +### Tactical Rubber (Mouth) -(Stay here) -(여기 있어) -(Stay here) -(여기 있어) -(Never mind...) -(그만두자...) -(The SPEAKER follows your orders) -(SPEAKER 는 당신의 명령을 따릅니다) -(...) -(...) -(The SPEAKER refuses to follow your orders) -(SPEAKER 가 당신의 명령을 따르기를 거부합니다) +### Tactical Rubber (Head) -(Don't stay here) -(여기에 머물지 마세요) -(Don't stay here) -(여기에 머물지 마세요) -(Never mind...) -(그만두자...) -(Confirm?) -(확인?) -(You decide you would rather the SPEAKER stay put) -(당신은 SPEAKER 가 가만히 있기로 결정했습니다) -(The SPEAKER refuses to follow your orders) -(SPEAKER 가 당신의 명령을 따르기를 거부합니다) +### Tactical Rubber Collar -(Switch to Aggressive) -(공격적으로 전환) -(The SPEAKER will now pursue enemies) -(SPEAKER 가 이제 적을 추적합니다) +### It will occasionally cause tactical rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. + + + +### Sweeping Strike + +### Headlong Rush -(Switch to Defensive) -(수비로 전환) -(The SPEAKER will stay close to you or its assigned position) -(SPEAKER 는 당신이나 할당된 위치에 가까이 있을 것입니다) -(Ask her for help) -(그녀에게 도움을 요청하세요) -(Ask her for help) -(그녀에게 도움을 요청하세요) -(Never mind...) -(그만두자...) -(Are you sure? She might see you as being submissive) -(정말입니까? 그녀는 당신을 복종하는 것으로 볼 수 있습니다) -(The SPEAKER prefers you the way you are) -(SPEAKER 는 있는 그대로의 당신을 선호합니다) -(The SPEAKER will help you out of your restraints) -(SPEAKER 가 당신의 속박에서 벗어나도록 도와줄 것입니다) -(You decide to deal with your problems yourself.) -(문제를 스스로 해결하기로 결정했습니다.) -(Plead with her to unlock you with a Command Word) -(명령어를 사용하여 잠금을 해제하도록 그녀에게 간청하십시오) -(Yes!) -(예!) -(Never mind...) -(그만두자...) -(Are you sure? She might see you as being submissive) -(정말입니까? 그녀는 당신을 복종하는 것으로 볼 수 있습니다) -(The SPEAKER would rather 'conserve her mana') -(SPEAKER는 '마나를 절약'하는 것이 좋습니다) -(The SPEAKER utters a command word on you) -(SPEAKER 가 당신에게 명령을 내립니다) -(Your magical locks continue to restrain you.) -(당신의 마법 자물쇠가 계속 당신을 구속하고 있습니다.) -(Plead with her to unlock your restraints) -(그녀에게 구속을 풀어달라고 간청하십시오) -(Yes!) -(예!) -(Never mind...) -(그만두자...) -(Are you sure? She might see you as being submissive) -(정말입니까? 그녀는 당신을 복종하는 것으로 볼 수 있습니다) -(The SPEAKER would rather not give up a magic key) -(SPEAKER는 마법의 열쇠를 포기하지 않겠다) -(The SPEAKER doesn't have any keys) -(SPEAKER에는 열쇠가 없습니다) -(The SPEAKER giggles and gives you a key) -(SPEAKER 가 낄낄거리며 열쇠를 준다) -(You remain locked tight.) -(당신은 단단히 잠겨 있습니다.) -(Stop receiving help) -(도움 받지마) -(Confirm? You will have to ask again to get help.) -(확인? 도움을 받으려면 다시 요청해야 합니다.) -(Stop receiving help) -(도움 받지마) -(Never mind...) -(그만두자...) -(The SPEAKER will no longer help you.) -(SPEAKER는 더 이상 당신을 돕지 않을 것입니다.) -(You sigh as you realize you really need her help.) -(당신은 그녀의 도움이 정말로 필요하다는 것을 깨닫고 한숨을 쉬었습니다.) -(Sell items) -(아이템 판매) -(Buy items) -(아이템 구입) -Fuuka -후우카 -Fuuka surrounds herself in defensive talismans! -Fuuka는 방어 부적으로 몸을 감쌌습니다! -Fuuka wraps you tightly in restraints! (+RestraintAdded) -Fuuka가 당신을 속박으로 단단히 감쌉니다! (+RestraintAdded) -Fuuka squeezes your breasts and smiles! (DamageTaken) -후우카가 가슴을 쥐어짜며 웃는다! (DamageTaken) +### Maid Squire -Angry Fuuka -앵그리 후우카 -Fuuka surrounds herself in defensive talismans one more time! -Fuuka는 다시 한 번 방어 부적으로 몸을 감쌉니다! -Fuuka wraps you furiously in restraints! (+RestraintAdded) -Fuuka가 당신을 격렬하게 구속합니다! (+RestraintAdded) -Fuuka pouts as she tickles you relentlessly! (DamageTaken) -Fuuka는 가차없이 당신을 간지럽히며 입을 삐죽거립니다! (DamageTaken) +### Maid Knight -(You find a girl wearing an ornate dress)|(She glances at you)|And who might you be? -(화려한 드레스를 입은 소녀를 찾습니다)|(그녀는 당신을 흘끗 봅니다)|그리고 당신은 누구일까요? -I should be asking the same of you. -나도 당신에게 똑같이 물어야 합니다. -(Growl at her) -(그녀에게 으르렁거린다) -(She smiles)|My name is Fuuka, with the letters for Wind and Song.|Are you going to introduce yourself? -(미소 짓는다)|내 이름은 바람과 노래를 뜻하는 Fuuka입니다.|자기 소개를 할 건가요? -What kind of name is that? -어떤 종류의 이름입니까? -(SPEAKER frowns)|It means Windsong!|I bet yours isn't anywhere nearly as cool. -(SPEAKER 찡그린 얼굴)|Windsong을 의미합니다!|네 노래는 그렇게 멋지지 않을 거라고 장담합니다. -(SPEAKER looks enraged)|Because names and meanings are different things!|My name uses the script from the Old Civilization!|You're just a poser! -(화자가 격분한 듯)|이름과 의미는 다르기 때문입니다!|내 이름은 고대 문명의 대본을 사용합니다!|당신은 단지 잘난체하는 사람일 뿐입니다! -Why not just call yourself Windsong? -그냥 자신을 Windsong이라고 부르지 않는 이유는 무엇입니까? -(...) -(...) -(...) -(...) -I am an adventurer. -나는 모험가입니다. -Mmmmph. -으읍. -(SPEAKER blushes)|Ah, right then... -(SPEAKER 붉어짐)|아, 그럼... -(...) -(...) -(SPEAKER giggles)|Very well. I don't really care who you are. -(SPEAKER 낄낄거림)|좋아요. 당신이 누군지 별로 신경쓰지 않아요. -I do not need to introduce myself. -나 자신을 소개할 필요가 없습니다. -Neither do I. -나도 마찬가지야. -(...) -(...) -(...) -(...) -I'm an adventurer. And who are you? -나는 모험가입니다. 그리고 당신은 누구입니까? -Mmmmm... (Blush) -음... (붉어짐) -(She grins)|My name is Fuuka, with the letters for Wind and Song.|The reincarnated ones call me Windsong,|they aren't very bright though. -(그녀가 웃는다)|내 이름은 바람과 노래의 글자를 가진 후카입니다.|환생자들은 나를 바람송이라고 부르지만|그들은 그다지 밝지는 않습니다. -Reincarnated ones? -환생자들? -(SPEAKER tilts her head)|I believe the term is 'Zombie' in the common tongue. -(SPEAKER 가 고개를 갸웃한다)|일반적인 언어로 '좀비'라는 용어가 있는 것 같아요. -(SPEAKER enjoys the discussion)|Normally, spirits pass on to the next life.|But with the right tricks, one can keep them here.|I plan to make them all proper bodies...|Eventually. -(SPEAKER 가 토론을 즐긴다)|일반적으로 영혼은 다음 생으로 넘어간다.|그러나 올바른 트릭을 사용하면 여기에 보관할 수 있다.|나는 그것들을 모두 적절한 몸으로 만들 계획이다...|결국. -But... reincarnated? -하지만... 환생했다고? -(...) -(...) -(...) -(...) -I am an adventurer. -나는 모험가입니다. -Mmmmph. -으읍. -(SPEAKER giggles)|Hehe... you sound interested. -(SPEAKER 웃음)|헤헤...흥미가 있는 것 같군요. -(...) -(...) -(SPEAKER frowns)|Never ask a woman about her age! -(SPEAKER 찡그린다)|절대 여자에게 나이를 묻지 마세요! -I take it you're the hag in charge? -당신이 담당 노파라고 생각합니까? -You are in charge, right? -담당자 맞죠? -(Giggle) -(킬킬 웃음) -(...) -(...) -Don't mess with me, little girl. -나랑 장난치지마, 꼬마야. -Mmpphgh? (Pout at her) -음? (그녀에게 삐죽) -(She smirks)|So you're that kind of visitor, huh? -(그녀는 웃는다)|그래서 당신은 그런 종류의 손님이군요, 그렇죠? -That's right. How powerful are you? -좋아요. 당신은 얼마나 강력합니까? -(She cracks her knuckles)|I have been practicing the resurrection arts for a thousand years. -(손목을 꺾는다)|나는 천년 동안 부활 술을 수련해 왔다. -(She smiles)|All the zombies you seee in the Graveyard?|They are my pets, and I care for each and every one of them. -(미소 짓는다)|묘지에서 보이는 모든 좀비들?|그들은 내 애완동물이고 나는 그들 모두를 돌본다. -What the heck are 'Resurrection Arts'? -도대체 '부활술'이 뭐야? -(...) -(...) -(...) -(...) -It's time for a true display of skill! -진정한 실력을 발휘할 때입니다! -Hmmph. (Look away) -흠. (멀리 봐) -(She grins)|We'll wipe that pout off your face soon enough... -(그녀가 웃는다)|당신의 얼굴에 묻은 그 뾰루지를 곧 닦아줄게요... -(Shake your head) -(악수하다) -(She frowns)|Well, you will soon. -(그녀는 눈살을 찌푸린다)|글쎄, 곧 알게 될거야. -Pfff. Never heard of it. -큭큭 들어 본 적이 없습니다. -I bet I could do better. -내가 더 잘할 수있을거야. -(Giggle) -(킬킬 웃음) -(...) -(...) -Why does that matter to you? -그게 왜 당신에게 중요합니까? -(Stare at her silently, maintaining your posture) -(자세를 유지하며 말없이 그녀를 응시한다) -(She grins)|I am in charge of this place.|Everything that goes through here goes through me.|You may address me as Fuuka Windsong. -(그녀가 웃는다)|나는 이곳을 책임지고 있습니다.|여기를 통과하는 모든 것은 나를 통과합니다.|당신은 나를 Fuuka Windsong이라고 부를 수 있습니다. -By what authority? -어떤 권한으로? -(SPEAKER tilts her head)|Ummmm.... uh...|The Old Civilization! Of course!|I've been keeping their traditions for centuries. -(SPEAKER 가 고개를 갸웃한다)|음.... 어...|오래된 문명! 물론이죠!|나는 그들의 전통을 수세기 동안 지켜왔습니다. -(SPEAKER blushes)|Umm... That's because...|Oh shut up! -(SPEAKER 얼굴이 붉어짐)|음...그건...|아 닥쳐! -You don't sound too confident. -자신감이 없으신 것 같군요. -Who are you anyway? -어쨌든 당신은 누구입니까? -Who are you anyway? -어쨌든 당신은 누구입니까? -Fair enough. I am an adventurer. -그럴 수 있지. 나는 모험가입니다. -Hmmph. -흐읍읍. -(SPEAKER giggles)|Is that a challenge? -(SPEAKER 웃음)|그게 도전인가요? -(Nod calmly) -(조용히 끄덕인다) -(SPEAKER grins)|Is that a challenge? -(SPEAKER 가 웃는다)|그게 도전인가요? -We'll see about that. -우리는 그것에 대해 볼 수 있습니다. -Hmmph. (Scoff into your gag) -흐읍읍. (당신의 개그에 비웃는다) -It is indeed! -정말이다! -(Giggle) -(킬킬 웃음) -(...) -(...) -I'm an adventurer, miss. -저는 모험가입니다, 아가씨. -Mmmpphh~ (Moan and wiggle seductively) -으음~ (매혹적으로 신음하며 흔든다) -(She grins)|Oh look at you!|I'm going to dress you up and make you my pet!|You can have all the scritches and snuggles you want!|My name's Fuuka! -(그녀가 웃는다)|오 봐요!|당신에게 옷을 입히고 내 애완동물로 만들겠습니다!|당신은 원하는 모든 긁힘과 껴안기를 가질 수 있습니다!|내 이름은 Fuuka입니다! -A pet? What kind? -애완 동물? 어떤 종류? -(SPEAKER hops up and down excitedly)|Oh I've got dresses!|And all sorts of fun gear!|Maybe even this huge gag for you to chew on! -(SPEAKER 가 신나게 위아래로 뛰어다님)|오 드레스가 있어요!|그리고 온갖 종류의 재미있는 장비가 있어요!|아마도 당신이 씹을 수 있는 이 거대한 개그까지요! -(SPEAKER grins)|Having second thoughts? -(SPEAKER 가 웃는다)|생각이 바뀌었나요? -That sounds... harsh. -그건... 심한데. -...Maybe -...아마도 -Exciting! -신나는! -That sounds great. But who are you miss? -그거 좋을 거 같아. 하지만 당신은 누구를 그리워합니까? -Mmmmph~ -으읍읍~ -(SPEAKER giggles)|Hehe... We will have so much fun~ -(SPEAKER 낄낄거림)|헤헤... 너무 재미있겠다~ -(...) -(...) -(SPEAKER giggles)|You don't have to consent, dear~ -(SPEAKER 웃음)|동의하지 않아도 돼, 얘야~ -I never said I consented to being a pet! -나는 내가 애완 동물이되는 데 동의했다고 말한 적이 없습니다! -(Give her a puzzled look and shake your head) -(당황한 표정을 짓고 고개를 흔든다) -No way! -안 돼요! -(Shake your head) -(악수하다) -(Sigh and shrug) -(한숨과 어깨를 으쓱) -(Attack her without saying anything) -(아무 말도 없이 그녀를 공격한다) +### You humiliate the Maid Squire! -(SPEAKER clears her throat)|I am the one tasked with keeping this graveyard pure and holy.|All who roam this place do so under my express permission.|But what of you? I do not remember striking a deal with you.|Are you here to challenge me? -(SPEAKER 가 목을 가다듬는다)|나는 이 묘지를 순수하고 거룩하게 유지하는 임무를 맡은 사람이다.|이 곳을 돌아다니는 모든 사람들은 나의 명시적인 허가 하에 그렇게 한다.|하지만 당신은? 나는 당신과 거래를 한 기억이 없다. |당신은 나에게 도전하기 위해 여기 왔습니까? -I do what I want. -나는 내가 원하는 것을 한다. -(Glare at her and scoff) -(그녀를 노려보며 비웃는다) -(SPEAKER makes a big grin)|I take that you wish to challenge me?|Very well!|Come at me! -(SPEAKER 가 활짝 웃는다)|나에게 도전하고 싶다고 생각합니까?|좋아요!|이리 와요! -You have no power over me -당신은 나에 대한 권한이 없습니다 -Hmmph. (Stand proudly) -으읍. (자랑스럽게 서다) -(SPEAKER smiles)|Then let us fight!|If I win, I will make you my pet.|If you win, I will let you pass. -(SPEAKER 미소)|그럼 우리 싸우자!|내가 이기면 너를 내 애완동물로 만들겠다.|네가 이기면 너를 통과시키겠다. -I don't want to fight, miss... -난 싸우고 싶지 않아, 아가씨... -Mmph! (Shake your head frantically) -읍! (고개를 미친듯이 흔든다) -(SPEAKER giggles)|Come now, I want to see how good you are! -(SPEAKER 웃음)|이리 오세요, 당신이 얼마나 좋은지 보고 싶어요! -Yes, I am here to fight you. -네, 당신과 싸우러 왔습니다. -(Nod) -(목례) -(SPEAKER smiles)|Then what are we waiting for? -(SPEAKER 미소)|그럼 우리는 무엇을 기다리고 있는 거지? +### You defeat the Maid Knight! For now... she swears revenge. -You're on! -당신은 켜져 있습니다! -Hmmmph! -흐읍읍! -Let us duel! -결투하자! -Mmmmmghh! -읍흐읍읍! -I suppose... -아마도... -Mmmmph... -읍으... +### The Squire zips you up in comfy leather gear! -(SPEAKER smiles as she stands over you)|Well well. Look who won. -(SPEAKER 가 당신을 바라보며 미소짓는다)|글쎄요. 누가 이겼는지 보세요. -(SPEAKER nods)|Absolutely. Now allow me to make my conditions clear.|You will wear my collar from now on.|Then you will be allowed to go. -(SPEAKER 고개 끄덕임)|당연합니다. 이제 제 조건을 분명히 하겠습니다.|지금부터는 제 옷깃을 착용하세요.|그럼 가셔도 됩니다. -(SPEAKER giggles)|You're not in a position to resist.|Now then, let me make myself clear.|I will let you go... but only wearing my collar. -(SPEAKER 킥킥)|당신은 저항할 위치에 있지 않습니다.|자, 그럼 분명히 할게요.|당신을 놓아줄게요...하지만 내 목걸이만 하고 있어요. -You beat me fair and square. -당신은 나를 공정하게 이겼습니다. -Mmmph. (Submit) -읍읍. (수락) -You cheated! -당신은 속였다! -Mmmph! (Struggle weakly) -읍! (약하게 몸부림친다) -(Sigh and accept your fate) -(한숨 쉬고 운명을 받아들여) -(Accept the collar eagerly) -(목걸이를 간절히 받아) -(Accept the collar begrudgingly) -(마지못해 옷깃을 받아) -(SPEAKER presents you with her collar...)|(She locks it around your neck)|You are free to go now, dear! -(SPEAKER 가 당신에게 그녀의 옷깃을 선물합니다...)|(그녀는 당신의 목에 목걸이를 걸었습니다)|당신은 이제 가도 좋습니다, 얘야! +### The Maid Knight places you in strict bondage! -(SPEAKER puts up a wall of talismans to regain her strength)|I'm... I'm not finished yet! -(SPEAKER 가 힘을 되찾기 위해 부적의 벽을 세움)|난... 아직 끝나지 않았어! +### The Squire secures your restraints! -(SPEAKER is out of breath)|I... can't... believe... it...|She drops her keys... -(SPEAKER 가 숨이 차다)|난... 믿을 수 없어... 믿을 수 없어...|열쇠를 떨어뜨리고... -(SPEAKER looks flabbergasted)|R-really? Okay... I'll give you a reward then... -(SPEAKER 기가 막힌 듯)|R-정말요? 알았어...그럼 보상을 줄게... -(Submit to her anyway) -(어쨌든 그녀에게 제출) -(SPEAKER resists but ultimately you force a gag into her mouth)|MMMMMPH! -(SPEAKER 가 저항하지만 결국 당신은 그녀의 입에 재갈을 물려줍니다)|음음! -(Gag her) -(개그 그녀) +### The Maid Knight secures your restraints! +### The Squire dusts you with her duster plug. -(This ghost had something to say,|but it appears you've run into a bug instead)|Please report this to Ada18980 on deviantart! -(이 유령이 할 말이 있었는데|하지만 버그에 걸린 것 같습니다)|deviantart에서 Ada18980에게 이 사실을 보고해 주세요! +### The Maid Knight sweeps you with her cleaning halberd! -(Continue) -(계속하다) -(Make a smug face as you walk past) -(지나가면서 잘난 체하는 얼굴을 한다) -Thank you! -고맙습니다! -Mmmph! -읍읍! -I don't need your advice, strange ghostly person. -네 충고는 필요 없어, 이상한 귀신아. -(Glare at her) -(그녀를 노려본다) +### The EnemyName retreats! + +### The EnemyName manages to squirm out of sight! + + + +### servers humming... + +### bouncy noises + +### goopy noises + +### bubbling noise + +### rubber squeaking + +### blaring siren + +### You claim the Sweeper. + +### The Sweeper +### Foe of the unclean. Bringer of neat and tidy workspaces. -The next floor is a normal floor. -다음 층은 일반 층입니다. -This floor is suffering from a slime mold infestation.|Maids have been deployed to deal with the problem.|They could use a hand. -이 바닥은 점균류 감염으로 고통받고 있습니다.|문제를 처리하기 위해 가정부가 배치되었습니다.|그들은 손을 사용할 수 있습니다. -This floor is being ransacked by bandits.|They are armed and dangerous.|But I hear there's a bounty on their heads? -이 층은 도적들에게 약탈당하고 있습니다.|그들은 무장하고 위험합니다.|하지만 그들의 목에 현상금이 걸려 있다고 들었습니다. -A cave dragon was captured in the next floor.|It's brimming with elemental magic,|and there are a lot of interested parties! -다음 층에서 동굴 드래곤이 잡혔어.|원소 마법이 넘쳐나고|관심있는 사람들이 많아! -The witches told me to keep you out.|I'm not exactly capable of doing that,|so feel free to do as you please. -마녀들이 당신을 막으라고 했어요.|나는 그렇게 할 수 없어요.|그러니 마음대로 하세요. -The next floor is overgrown.|I'd watch your feet if I were you. -다음 층은 풀이 무성해.|내가 너라면 네 발을 지켜줄게. -Slimes, slimes EVERYWHERE!|Fortunately there's a slime-harvesting|operation going on. -슬라임, 슬라임이 도처에!|다행히도 슬라임 수확|작업이 진행 중입니다. -The trainers are taking their wolfgirls out for a walk.|I'd steer clear.|Unless you want to become one of their pets~ -조련사들이 늑대소녀들을 데리고 산책을 나가고 있습니다.|비켜가겠습니다.|당신이 그들의 애완동물이 되고 싶지 않다면~ -Rumor has it that one of the cyber-dolls escaped.|Their handlers are looking for her.|They're catching every young girl they can find! -사이버 인형 중 하나가 탈출했다는 소문이 있다.|그들의 조련사가 그녀를 찾고 있다.|그들은 그들이 찾을 수 있는 모든 어린 소녀를 잡고 있다! -This is totally a normal floor.|No doubt about it. -여기는 완전히 평범한 바닥이야.|의심의 여지가 없어. +### Deals slash damage. Also deals 30 tickle damage in an area. Has a ranged attack. -This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall. -여기가 일반 던전 입구입니다.|튜토리얼은 홀 시작 부분에 있습니다. -This is the entrance to the ancient tombs.|It's harder than the normal entrance. -여기가 고대 무덤의 입구입니다.|이것은 일반 입구보다 어렵다. -This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random. -던전의 이 부분은 혼돈의 여신에 의해 변경되었습니다.|당신이 통과할 영역의 순서는 완전히 무작위입니다. -Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure! -광활한 정글 안에 비밀 사원이 있다는 전설이 있습니다.|중절모를 쓰고 보물을 찾으세요! -You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed! -당신은 폐허에서 헤매다 길을 잃었습니다. | 타일셋의 순서가 뒤바뀌었습니다! +### Make a ranged attack with the Sweeper. -These are the stairs to the tutorial hall. -여기는 튜토리얼 홀의 계단입니다. +### You claim the Persuader. -Congratulations! You've completed the tutorial!|Now get in there and stay out of trouble~ -축하합니다! 튜토리얼을 완료했습니다!|이제 거기에 들어가서 문제를 피하세요~ +### The Persuader -Welcome to the dungeon!|Don't panic, this is a turn-based game,|and nothing will happen until you move.|On your left you'll see your character,|displayed with all of the bondage they don't have.|Don't worry, you'll find some soon! -던전에 오신 것을 환영합니다!|당황하지 마세요, 이것은 턴 기반 게임입니다.|당신이 움직이기 전까지는 아무 일도 일어나지 않을 것입니다.|당신의 왼쪽에는 당신의 캐릭터가 보일 것입니다. 없어요.|걱정하지 마세요, 곧 찾을 수 있을 거에요! +### Military forces sought a solution with higher stopping power after the Great Work made brute force obsolete. Capture Foam rounds are now the standard. -You might be wondering what all these barrels are for.|Don't worry, they're, uh, totally safe!|When you are inside one you can click on yourself to wait.|Enemies have a hard time seeing you inside a barrel,|so you can wait until they pass by you. -당신은 이 모든 통들이 무엇을 위한 것인지 궁금할 것입니다.|걱정하지 마세요, 그것들은, 어, 완전히 안전합니다!|당신이 그 안에 있을 때 당신은 기다리기 위해 당신 자신을 클릭할 수 있습니다.|적들은 당신이 안에 있는 것을 보는 데 어려움을 겪습니다 그들이 당신을 지나갈 때까지 기다릴 수 있도록 배럴. +### Equipped with a duster plug, it deals tickle damage on melee. Can fire a high caliber rubber bullet to deal 80 glue damage from a distance. Takes 3 turns to reload. -On the right you'll see your stats and spells slots.|Your DP, SP, and MP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon.|Below that, two icons allow you to toggle automatic escape and movement modes. -오른쪽에는 통계 및 주문 슬롯이 표시됩니다.|DP, SP 및 MP가 거기에 표시되며 이들이 무엇을 하는지 알아보겠습니다.|그 아래에는 현재 소비 가능한 항목,|금이 표시됩니다. , 현재 장착한 무기.|그 아래 두 개의 아이콘을 사용하여 자동 탈출 및 이동 모드를 전환할 수 있습니다. -Your WP, or willpower, is an important resource.|Without it, escaping from restraints is more difficult.|There is a willpower potion on the floor up there. Go get it! -당신의 WP 또는 의지력은 중요한 자원입니다.|그것 없이는 구속에서 벗어나기가 더 어렵습니다.|저 위 바닥에 의지력 물약이 있습니다. 가서 가져와! -Oh no! That trap wiped out all your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack). -오 이런! 그 함정이 당신의 모든 의지력을 없앴습니다!|다행히 당신은 물약을 가지고 있습니다.|WP 막대 옆에 있는 '+' 아이콘을 클릭하여 마실 수 있습니다.|또한 하단 막대에서 인벤토리로 이동할 수 있습니다. |빠른 인벤토리 아이콘(백팩)도 있습니다. -Another trap!|You'll notice that the trap also drained your stamina considerably, forcing you to kneel.|You can protect yourself while your stamina regenerates by retreating into the room above.|Close the door by clicking the Close Door button in the bottom bar.| -또 다른 함정!|함정으로 인해 스태미나가 상당히 소모되어 무릎을 꿇게 된 것을 알 수 있습니다.|위 방으로 후퇴하면 스태미나가 재생되는 동안 자신을 보호할 수 있습니다.|에서 문 닫기 버튼을 클릭하여 문을 닫으십시오. 하단 표시줄.| +### Make a ranged attack with the Persuader for 25 charge. Deals 80 glue damage. -Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the bottom right.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1. -주문을 시전하는 데 사용되는 MP 또는 마나.|하지만 주문을 시전하려면 하나를 배워야 합니다.|오른쪽 하단의 Spells 버튼을 클릭합니다.|그런 다음 Flame Apprentice를 클릭하고 Firebolt를 잠금 해제하는 방법을 배웁니다. |그런 다음 뒤로 돌아가려면 스페이스바를 누르고 페이지를 전환하려면 오른쪽을 누르십시오.|Firebolt를 클릭하고 학습한 다음 슬롯 1에 할당하십시오. -On the right you'll see your stats and spells slots.|You can click on a spell slot or hit 1-4 on your keyboard to cast a spell|then click on the map for where you want to aim it.|The small wrench icon above them will let you|swap them out for another spell from your spellbook. -오른쪽에는 통계 및 주문 슬롯이 표시됩니다.|주문 슬롯을 클릭하거나 키보드에서 1-4를 눌러 주문을 시전할 수 있습니다|그런 다음 조준할 위치의 지도를 클릭합니다.| 그들 위에 있는 작은 렌치 아이콘을 사용하면 주문서에서 다른 주문으로 교체할 수 있습니다. -There's a zombie over there!|Fortunately zombies are weak to fire.|Firebolt has a very long range,|so simply cast firebolt and click on the zombie.|Repeat until it is dead. -저쪽에 좀비가 있어요!|다행히 좀비는 발사에 약합니다.|파이어볼트는 사거리가 매우 길기 때문에|파이어볼트를 시전하고 좀비를 클릭하기만 하면 됩니다.|죽을 때까지 반복합니다. -Mana potions restore your mana fully. -마나 포션은 마나를 완전히 회복시킵니다. +### Persuader Round -Your DP, or Distraction, is a measure of...|How much you are enjoying things.|These sorts of thoughts cloud your mind,|so spellcasting is more difficult when you are distracted.|Go grab the potion over there. -당신의 DP, 즉 산만함은...|당신이 얼마나 즐기고 있는지에 대한 척도입니다.|이러한 종류의 생각은 당신의 마음을 흐리게 합니다|따라서 당신이 산만할 때 주문 시전이 더 어렵습니다.|가서 거기 물약을 가져오세요. -Did you like that?|Anyway, there's a zombie over there. You should drink that potion.|It will clear your mind so you can cast again.|Hurry, or it will get you! -좋았어?|어쨌든 저쪽에 좀비가 있어. 그 물약을 마셔야지.|정신이 맑아져서 다시 시전할 수 있을거야.|서두르지 않으면 잡을거야! +### You fire the Persuader! +### Wait for current save to finish... -That wasn't so hard, was it?|Now then, there's a treasure chest over here. Why don't you open it? -그렇게 힘들지 않았어?|자, 여기 보물상자가 있네. 열어보지 그래? -Yikes, looks like you're in a bind!|No worries, though. There's a key to those cuffs over there.|Simply hover over the cuffs item test on the left side.|Then, click the lock icon to remove the lock.|Finally, click the buckle to remove the cuffs. -이런, 곤경에 처한 것 같군요!|그래도 걱정하지 마세요. 저기 수갑의 열쇠가 있습니다.|왼쪽의 수갑 항목 테스트 위로 마우스를 가져가면 됩니다.|그런 다음 자물쇠 아이콘을 클릭하여 잠그십시오.|마지막으로 버클을 클릭하여 커프스를 제거하십시오. -I think we all know what's in the next chest.|It's important to understand the different ways you can escape.|You can struggle, which costs the most stamina|but makes other struggle methods faster.|You can cut, which requires a knife in hand.|You can remove, which represents untying or unbuckling. -우리 모두는 다음 상자에 무엇이 있는지 알고 있다고 생각합니다.|탈출할 수 있는 다양한 방법을 이해하는 것이 중요합니다.|투쟁할 수 있습니다. 스태미나가 가장 많이 소모되지만|다른 투쟁 방법이 더 빨라집니다.|절단할 수 있습니다. 손에 칼.|제거할 수 있습니다. -Ouch, that looked tight...|Sometimes you won't be able to struggle out of things.|You'll have to find some other way to take it off... -아야, 빡빡해보이는데...|때때로 너는 물건에서 빠져나오지 못할 것이다.|그것을 벗을 다른 방법을 찾아야 할거야... -There's a few zombies up ahead.|Fight your way through and claim the treasure! -앞에 좀비 몇 마리가 있습니다.|전투를 벌여 보물을 차지하세요! +### Please wait for save to finish... -You're not feeling it... -당신은 그것을 느끼지 않습니다 ... -You close your eyes but the vibrations keep you from dozing off... -눈을 감아도 진동 때문에 잠이 오지 않는다... +### Debug Defeat -(A SPEAKER lies hogtied in front of you)|(She looks at you with pleading eyes,)|(and mumbles incoherently through her gag) -(A SPEAKER 가 당신 앞에 결박되어 누워 있습니다.)|(그녀는 애원하는 눈으로 당신을 바라보고 있습니다.)|(재갈을 물고 중얼중얼 중얼거립니다.) -(A SPEAKER lies hogtied in front of you)|(She looks at you, mumbling and giggling into her gag) -(A SPEAKER 가 당신 앞에 결박되어 누워 있습니다.)|(그녀는 당신을 바라보며 중얼거리고 그녀의 재갈 속으로 낄낄거립니다) -(SPEAKER looks grateful)|Thank you so much|I shall join your party. -(SPEAKER 는 감사해 보인다)|정말 감사합니다|당신의 파티에 합류하겠습니다. -(SPEAKER looks grateful)|Thank you so much miss!|I owe you everything. -(SPEAKER 는 감사해 보인다)|정말 고마워요 아가씨!|당신에게 모든 것을 빚지고 있어요. -(SPEAKER groans and wriggles around uselessly) -(SPEAKER 가 신음하며 쓸데없이 몸부림친다) -(SPEAKER moans and rolls around, blushing deeply) -(SPEAKER 가 신음하며 뒹굴며 얼굴을 붉히며) -Untie her -그녀를 풀어준다 -Make sure she is tight and secure -그녀가 단단하게 꽉 조여져 있는지 확인한다 +### You cast devastating ASCII glyphs! -(A SPEAKER bumps into you while immersed in her thoughts)|Oh! Hello!|Say, you look adorable...|Do you mind helping me find something? -(생각에 잠긴 당신과 마주친 SPEAKER)|오! 여보세요!|말해, 당신은 사랑스러워 보인다...|내가 뭔가 찾는 것을 도와줄래? -(The SPEAKER jumps up and down)|Ah, wonderful!|I've misplaced one of my dresses.|If you could find one, wear it, and bring it to me,|I'd greatly appreciate it! Thanks! -(SPEAKER 가 위아래로 펄쩍펄쩍 뛰며)|아, 멋지군!|내 드레스 중 하나를 잃어버렸어.|찾을 수 있으면 입고, 가져다 줘,|정말 고맙겠어! 고마워! -(The SPEAKER stares at you like a rabid animal)|Wowie! You look gorgeous!|Thank you so much!|(She snaps a photo of you using a magic crystal) -(SPEAKER 가 광견병에 걸린 동물처럼 당신을 응시합니다)|와위! 당신 정말 멋져요!|정말 감사합니다!|(그녀는 마법 수정을 사용하여 당신의 사진을 찍습니다) -(The SPEAKER giggles)|I never said I'd take it off, did I? -(SPEAKER 가 낄낄거린다)|내가 벗겠다고 말한 적 없지? -(The SPEAKER smiles)|Sure thing! -(SPEAKER 가 웃는다)|물론이죠! -(Show interest) -(흥미를 보이다) -I found your dress... -너의 드레스를 찾았어... -Mmmph... (Found the dress!) -으읍읍... (드레스를 발견했다!) -Great! Can you take it off? -엄청난! 벗을 수 있습니까? -Mmmmm! (Struggle) -흐읍읍! (저항한다) +### Debug Bind -(A SPEAKER clutching her books approaches you)|Miss adventurer!|I happen to need a magic scroll of any kind.|It's for my studies. -(책을 움켜쥐고 있는 SPEAKER 가 당신에게 다가온다)|모험가 양!|우연히 어떤 종류의 마법 두루마리가 필요합니다.|내 연구를 위한 것입니다. -(The SPEAKER smiles)|Yes, thank you so much!|It's been so difficult to get them lately.|The magic library is closed off these days,|and there are mean people trying to get the scrolls back... -(SPEAKER 가 미소짓는다)|네, 정말 감사합니다!|요즘 구하기가 너무 힘들어요.|요즘 마법 도서관이 문을 닫았는데|두루마리를 되찾으려는 비열한 사람들이 있어요... -(The SPEAKER is happy)|Thank you so much! -(SPEAKER 가 기뻐함)|정말 감사합니다! -(The SPEAKER is happy)|Thank you so much! -(SPEAKER 가 기뻐함)|정말 감사합니다! -(The SPEAKER is happy)|Thank you so much! -(SPEAKER 가 기뻐함)|정말 감사합니다! -(The SPEAKER is happy)|Thank you so much! -(SPEAKER 가 기뻐함)|정말 감사합니다! -(Show interest) -(흥미를 보이다) -Give her a Scroll of Sauntering -그녀에게 산책의 두루마리를 줘 -Give her a Scroll of Sleight -그녀에게 Sleight의 두루마리를 줘 -Give her a Scroll of Speech -그녀에게 연설 두루마리를 줘 -Give her a Scroll of Purity -그녀에게 순결의 두루마리를 줘 +### You cast bondage ASCII glyphs! -(A SPEAKER looks distraught)|Well met, adventurer!|We have a problem... -(화자가 정신이 나간 듯 보인다)|잘 봤습니다, 모험가님!|문제가 생겼습니다... -(The SPEAKER folds her arms)|A rebel has been causing us problems lately...|If you run into her, give her all you got!|She needs to be brought to justice. -(화자가 팔짱을 낀다)|요즘 반란군이 우리에게 문제를 일으키고 있어...|만약 그녀를 마주치면, 그녀에게 당신이 가진 모든 것을 주세요!|그녀는 정의의 심판을 받아야 합니다. -(Show interest) -(흥미를 보이다) +### , Floor AMNT -(A SPEAKER scoffs in your direction)|Well? You lookin' for work or no? -(SPEAKER 가 당신을 향해 비웃는다)|글쎄요? 일자리를 구하는 건가요, 없는 건가요? -(The SPEAKER grins)|A bunch of delinquents stormed out recently.|They're looking for a way out of their belts.|Someone oughta show em their place,|if you catch what I'm saying. -(SPEAKER 가 웃는다)|최근에 한 무리의 불량자들이 들이닥쳤습니다.|그들은 벨트에서 벗어날 방법을 찾고 있습니다.|누군가가 그들에게 그들의 위치를 ​​보여줘야 합니다|내가 말하는 것을 이해한다면. -(Nod) -(목례) +### Recolor -(A SPEAKER approaches you in your cell)|Since you've been a bad girl,|we're taking you to the high-security prison. -(감옥에서 SPEAKER 가 접근함)|당신이 나쁜 여자였으니|우리는 당신을 높은 보안 감옥으로 데려갈 것입니다. -(The SPEAKER folds her arms)|Want to or not, you're going. -(SPEAKER 가 팔짱을 끼며)|원하든 원하지 않든, 당신은 갑니다. -(Resist) -(저항하다) -(Submit) -(제출하다) +### Only collect notable -(A SPEAKER crosses her arms)|Who you lookin' at?|Oh, it's an adventurer.|Say, you wouldn't be interested|in working with us, would ya? -(A SPEAKER 가 팔짱을 끼며)|누구를 보고 있니?|오, 모험가네.|말해, 당신은|우리와 일하는 데 관심이 없을 거야, 그렇지? -(The SPEAKER smiles)|That's more like it.|Here's the scoop: One of ours was captured on the next floor.|We need you to go get her out. -(발표자가 웃는다)|그게 더 좋아.|특종: 우리 중 하나가 다음 층에서 잡혔어.|가서 그녀를 꺼내야 해. -(Show interest) -(흥미를 보이다) +### Autorelease escaped -(The SPEAKER sits bound in high-security manacles)|You'll need to open the lock to get her out... -(SPEAKER 는 보안이 철저한 수갑에 묶여 있습니다.)|그녀를 꺼내려면 자물쇠를 열어야 합니다... -(You don't have any keys that work on the lock) -(자물쇠에 작동하는 열쇠가 없습니다) -(You can't help her, bound as tightly as you are...) -(당신처럼 단단히 묶인 그녀를 도울 수 없습니다...) -(You unlock her, fumbling around for a while with your bound hands) -(당신은 그녀의 잠금을 해제하고, 묶인 손으로 잠시 더듬거립니다) -(You unlock the SPEAKER)|Thank you!|Let's get out of here! -(SPEAKER 잠금 해제)|고맙습니다!|여기서 나가자! -(You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...) -(SPEAKER 잠금 해제)|으읍!|(그녀는 재갈을 그대로 물고있고 싶어한다...) -(You don't have any lockpicks) -(자물쇠가 없습니다) -(You can't pick the lock with your hands bound) -(손이 묶인 상태에서 자물쇠를 열 수 없습니다) -(After a while, you free the SPEAKER)|Thank you!|Let's get moving! -(잠시 후 SPEAKER 를 풀어줍니다)|감사합니다!|가자! -(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...) -(잠시 후, 당신은 SPEAKER 를 풀어줍니다)|으읍읍!|(당신이 재갈을 물릴 때 그녀는 고개를 흔든다...) -(You don't have enough mana for a command word) -(명령어를 쓸 마나가 부족합니다) -(Try as you might, your mouth is sealed tight) -(힘껏 해봐, 입이 꽉 막혀) -(You utter a command word to free the SPEAKER)|Many thanks!|Let's go! -(SPEAKER 를 풀어주라는 명령을 내림)|대단히 감사합니다!|가자! -(You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) -(SPEAKER 를 풀어주라는 명령을 내림)|으으읍!|(그녀는 재갈을 물려...) +### NME is not notable enough for your collection. -Use a key to unlock her -열쇠를 사용하여 그녀를 풀어준다 -Try to pick her restraints -그녀의 구속구를 따려고 시도한다 -Use a command word -명령어를 쓴다 +### Auto-released NME due to Escape. -An enemy found you while you were busy! -당신이 바쁠 때 적이 당신을 발견했습니다! +### Your ITMN1 was cursed and transforms into a ITMN2! -(A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door) -(A SPEAKER 가 창살을 두드려 깨운다)|일어나! 여기서 나가자!|(그녀는 간신히 감방 문을 잠궜다) -(You wake up to find a SPEAKER creeping up outside the door)|You've been marked as a person of interest.|We are here to escort you out of this place. -(당신은 잠에서 깨어나 문밖으로 살금살금 다가오는 SPEAKER 를 발견합니다.)|당신은 요주의 인물로 지정되었습니다.|우리는 당신을 이곳 밖으로 안내하기 위해 왔습니다. -(A SPEAKER wakes you up by banging on the bars)|Hey wake up!|You should join me and my pals here~|Maybe you'll join them once we're out of here? -(A SPEAKER 가 창살을 두드려 깨운다)|야 일어나!|여기서 나와 내 친구들과 합류해야 해~|우리가 여기서 나가면 그들과 합류할 수 있겠지? -(A SPEAKER wakes you up by banging on the bars)|I have been sent to inform you...|...that you are of good standing with the Council.|That being said, I'm only doing this because of procedure. -(A SPEAKER 가 창살을 두드리며 깨운다)|나는 당신에게 알리기 위해 보냈습니다...|...당신이 의회에서 좋은 평판을 가지고 있다는 것을.|그러니까, 내가 이렇게 하는 이유는 절차의. -(A SPEAKER wakes you up by banging on the bars)|Greetings, follower of the blessed kitty!|Because of your faith, we have been sent to rescue you! -(SPEAKER 가 창살을 두드리며 깨운다)|안녕하세요, 축복받은 고양이의 추종자여!|당신의 믿음 때문에, 우리는 당신을 구출하기 위해 보내졌습니다! -(You sense a presence nearby and look up to see a SPEAKER)|Because you are one, we have come to free you.|Do not take this as an excuse|to get yourself into further trouble. -(근처의 존재를 감지하고 위를 올려다보면 SPEAKER 가 보입니다.)|당신이 하나이기 때문에 우리는 당신을 구하러 왔습니다. -(A SPEAKER wakes you up with the sound of copious fabric rustling)|Oh why hello there!|Would you be interested in a trial run of my latest product?|Of course, we'll have to get you out of here first... -(A SPEAKER 가 풍성한 천이 바스락거리는 소리로 당신을 깨웁니다.)|오 왜 안녕하십니까!|제 최신 제품의 시운전에 관심이 있으십니까?|물론 먼저 여기서 당신을 내보내야 합니다. ... -(A SPEAKER wakes you up by banging on the bars)|Hello my pretty~|I thought to myself I'd rather have you than these folk.|Now why don't you come along and follow me... -(A SPEAKER 가 창살을 두드리며 깨운다)|안녕 내 예쁜아~|나는 이 사람들보다 네가 있는 게 낫다고 생각했어.|이제 나를 따라와... -(A SPEAKER wakes you up by banging on the bars)|Um... hello!|I received a quest to help you out of here!|Now, where do we go... -(SPEAKER 가 창살을 두드리며 깨운다)|음...안녕하세요!|여기서 나갈 수 있도록 도와달라는 퀘스트를 받았어요!|자, 이제 어디로... -(You wake up to find a SPEAKER whispering to you)|Greetings.|We've been sent to free you.|Let's get moving. -(당신에게 속삭이는 SPEAKER 를 발견하기 위해 깨어납니다.)|안녕하세요.|당신을 구출하기 위해 우리를 보냈습니다.|가자. -(A SPEAKER wakes you up by banging loudly)|Hey! Good news!|My friends and I came to rescue you! -(A SPEAKER 가 크게 두드리며 깨운다)|이봐! 좋은 소식!|내 친구들과 내가 너를 구하러 왔다! -(A SPEAKER wakes you up by knocking on the bars)|Hey, wake up.|I happen to like you, so we're going to get you out of here. -(A SPEAKER 가 창살을 두드려서 깨운다)|야, 일어나.|우연히 네가 좋아서 여기서 나가게 해줄게. -(A SPEAKER flashes a bright light in your direction)|Prisoner 74121 located. Commence transfer to different location. -(SPEAKER 가 당신을 향해 밝은 빛을 비춥니다)|수감자 74121을 찾았습니다. 다른 위치로 이송을 시작하십시오. -(A SPEAKER wakes you up)|We came to rescue you. Come on! -(SPEAKER 가 당신을 깨운다)|우리는 당신을 구하러 왔습니다. 어서! +### Equipping Restraint... -(The bed looks comfy and inviting)|(Napping here will restore half of your willpower)|(You can only sleep once per floor) -(침대가 편안하고 매력적으로 보입니다.)|(여기서 낮잠을 자면 의지력이 반으로 회복됩니다.)|(한 층에 한 번만 잘 수 있습니다.) -(You lay in the bed and doze off...) -(당신은 침대에 누워서 꾸벅꾸벅 졸고...) -(Lie down and sleep) -(누워서 자) +### Equipping Armor... -(Mystic energies spring forth from the ground)|(Standing here will fully replenish your passive mana pool)|(One use only) -(신비한 에너지가 땅에서 솟아나옴)|(여기에 서 있으면 패시브 마나 풀이 완전히 보충됩니다.)|(한 번만 사용) -(You step on the magical fissue and its energies absorb into you)|(Afterward, the ground crackles and fizzles, but no energy is left.) -(당신은 마법의 피슈를 밟고 그 에너지가 당신에게 흡수됩니다.)|(그 후, 땅이 삐걱거리고 지글거리지만 에너지는 남지 않습니다.) -(Recharge your mana pool) -(마나 풀 충전) +### Using Consumable... -Upcast from SPELL -SPELL에서 업캐스트 -Upcast Level LEVEL -업캐스트 레벨 LEVEL -Prerequisite -전제 조건 -Unlocks: -잠금 해제: -You need to learn REQUIREDSPELL before you can learn this one. -이것을 배우기 전에 REQUIREDSPELL을 배워야 합니다. +### Struggling... -You no longer have the will to struggle. -더 이상 투쟁할 의지가 없습니다. +### The ITMN1 is purified and returns to being a ITMN2! -Help yourself! -알아서 드세요! -You eat the delicious food and feel your will restored. -당신은 맛있는 음식을 먹고 당신의 의지가 회복되는 것을 느낍니다. -Your gag prevents you from eating... -당신의 개그는 당신이 먹는 것을 방해합니다 ... -It's a table. -그것은 테이블입니다. -It's a table, with evidence of a grisly deed. -소름 끼치는 행동의 증거가 있는 탁자입니다. -Someone left their cookies unattended. -누군가 쿠키를 방치했습니다. -You smell delicious pizza. -당신에게서 맛있는 피자 냄새가 나요. +### Reverts if purified with item. -You call for help! -당신은 도움을 요청합니다! -You let out a garbled cry! -당신은 왜곡된 외침을 내보냈어요! -Your screams are muffled by your gag! -당신의 비명은 당신의 개그에 의해 숨막혀 있습니다! -You can hardly make a noise... -거의 소리를 낼 수 없습니다... +### ...smaller than expected. -*clink* -*땡그랑* +### Comes with an artistic flair. -You yelp as the EnemyName activates your RestraintName -EnemyName이 RestraintName을 활성화할 때 당신은 비명을 질렀습니다. +### Set Pivot -That should slow you down! -그러면 속도가 느려집니다! -Try running away now~ -지금 당장 도망쳐 보세요~ -Initiating prisoner lockdown protocol -죄수 봉쇄 프로토콜 시작 -Your RestraintName suddenly snap together as the EnemyName activates them -EnemyName이 활성화하면 RestraintName이 갑자기 함께 스냅됩니다. +### Toggle click & drag + +### Settings + +### Scroll Controls: +### Layer Text: diff --git a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_RU.txt b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_RU.txt new file mode 100644 index 000000000..33cfa2b6f --- /dev/null +++ b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_RU.txt @@ -0,0 +1,46858 @@ +### By Strait-Laced Games + +### Credits + +### Patrons + +News and Updates +Новости и Обновления +Support @ Patreon +Поддержка @ Patreon +Thank you to the following awesome people for supporting me at patreon.com/ada18980 +Спасибо следующим замечательным людям за поддержку меня на patreon.com/ada18980 +Back +Назад +Next +Вперед +### Music: kocaeli, Darkstar Studios|Bound enemy graphics: Song|RU Translation: Osiris|CN Translation: Alexthymia, Mitki, Timeline|KR, JP Translation: Phantasm|Code Contributors: Ellie, Demopans, Aelie|Art: Kjus, Quakehoof, Lumpychan, Kertasu, Koirin, Lightning Rook, Daikinbakuju, Sigma Overlord, dask3|Plasmadragon, GoldieKitsune, SMoonlightM, PureWind, Wyatt Wintersoul|Potion drink - Jamius|Click - StrikeWhistler - Modified|StoneDoor_Close - AudioTorpedo - Modified|Footstep - Fission9 - Modified|FireSpell - Julien Matthey|LightSwing - qubodup|Heavy Swing - orangesheepdog|Miss - Brsjak - Modified|Clap - DWSD - Modified|'Door, Front, Closing, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|'Door, Front, Opening, A.wav' by InspectorJ (www.jshaw.co.uk) of Freesound.org|Chest Open - spookymodem - Modified|Unlock - BeezleFM|Unbuckle - danhelbling|Scissors - qubodup|Rummage - adcbicycle|Fairy Dust - jacksonacademyashmore|Metal Smash - gristi + +### Door locked.wav - mitchanary - Modified|Coins.wav - Saviraz|Opening the sarcophagus - Breviceps - Modified|Knife Sharpen - Anthousai|Paper Sounds - Bash360 - Modified|Freeze Powerup - JustInvoke - Modified|puddle - patchytherat - Modified|grab 3 - ihitokage - Modified|Gunfire - qubodup - Modified|Brass Falling - movingplaid - Modified|Energy Weapon Laser - rkkaleikau - Modified|Electricity - deleted_user_7146007 - Modified|Dragging a chain out of a sink - Hitrison - Modified|Hihat 7 - TheCoolManARM2 - Modified|Ambientsoundapp - Lightning Storm.wav - Modified|kev_durr - Arc Welding.wav - Modified|32cheeseman32 - SwordDraw01|AlaskaRobotics - duct tape unroll 3, duct tape unroll 1|||ARTISTS AND INSPIRATION|Hotel01 - https://www.pixiv.net/en/users/5944252 - Draws awesome wolfgirls|spark utamaro - For the idea of sentient vibrators + +Language +Язык +English +Английский +Chinese +Китайский +Korean +Корейский +Japanese +Японский +Spanish +Испанский +French +Французский +Russian +Pусский +Mods +Моды +Mods Loaded. +Загруженные моды. +### Restart required! + +### 需要重启! + +### 재시작 필요! + +### Restart please! + +### ¡Reinicio! + +### Rechargement requis! + +### Restart required! + +Version +Версия перевода 5.4.38, версия игры +### Kinky Dungeon + +### 5.4.38 + +By Ada18980 +От Ada18980 +You are an adventurer descending into an ancient underground city of magic. +Вы - искательница приключений, спускающаяся в древний подземный магический город. +Beneath its depths lies the Mistress' Staff, an artifact of untold power. +В его глубинах находится Посох Госпожи, артефакт невыразимой силы. +Will you prevail against forces unknown, or succumb to its dark secrets? +Сумеете ли вы одолеть неведомые силы или поддадитесь их темным тайнам? +(This game does not contain spiders) +(Игра не содержит контента с пауками) +### GFX + +Character +Персонаж +Main +Основные +UI +Интерфейс +Controls +Клавиши +Keybindings +Управление +Show Enemy Binding as % +Показывать скованность врагов в % +### Auto-wait Through Delayed Actions + +Show Minimap Labels +Показывать надписи на миникарте +Auto loot all from chests +Авто-лут всего из сундуков +Use Palette regardless of Outfit +Использовать палитру вне зависимости от наряда +Apply palettes to Restraints +Применять палитры к Ограничениям +Apply palettes to transforms +Применять палитры к трансформациям +Don't use character palette +Не использовать палитру персонажа +Always use character palette +Всегда использовать палитру персонажа +Use character palette for default outfit +Исп. палитру персонажа для экипировки по умолчанию +Show Background Art +Показывать фоновое изображение +Mute when Minimized +Отключать звук при сворачивании +Show Background Art +Показывать фоновое изображение +Show DP instead of % +Показывать DP вместо % +Quick Inv only equips to self +Быстрый инвентарь только для самоэкипировки +Override Outfit when Loading Save +Переопределять Костюм при загрузке сохр. +Save Outfits within Save Files +Сохранять Костюм в файлах сохранения +Show free characters on map +Показывать свободных персонажей на карте +Detailed jailed NPCs (experimental) +Детали о заключенных NPC (экспериментальное) +Show Struggle Bars +Показывать полоску Борьбы +Allow Suspicious Mods +Разрешить недоверенные моды +Auto Load Mods (offline only) +Автозагрузка модов (Только в оффлайне) +Classic Inventory Background +Класический фон инвентаря +Skip Intro +Пропускать интро +No Forced Greetings +Никаких принудит. приветствий +Show Zoom Buttons +Отображать кнопки масштабирования +Show Restraint Info on Escape Hover +Информация об огранич. на окне освобождения +Always Show Warnings +Всегда показывать предупреждения +Always Show Minimap +Всегда показывать миникарту +Enable Sound +Вкл. звук +Drool/Tears +Слюна/Слезы +Draw Armor +Отображать броню +Enable Music +Включить музыку +Async Rendering (beta) +Асинхронный рендеринг (beta) +### Bloom & Glow + +Transparent UI +Прозрачный UI +Turn Counter +Счетчик ходов +Flash Screen on Stun +Вспышка на экране при оглушении +Map Particles +Частицы на карте +Distraction Particles +Частицы при возбуждении +Vibration Particles +Частицы при вибрации +Gag Particle FX +Particle FX у Кляпа +Show NPC Status +Показывать статус NPC +Show Spell Range +Показывать дальность заклинаний +Trim Edge Walls +Выделение краев стен +Fog Shader +Шейдеры тумана +Light Shader +Шейдеры света +Intense 'Let Go' VFX +Интенсивные VFX оргазма +Enable Toy SFX +Звуковые эффекты игрушек +Enable Fullscreen +Полный экран +Hi-Res Distortion (Needs Restart) +Высококач. искажение (Требуется перезагр.) +Hi-Res Model (no restart needed) +Высококач. модельки (Перезагр. не треб.) +High Quality Animations +Высококач. анимации +Enemy Animations +Анимации врагов +One-Click Move (when slowed) +Движение по 1 клику (при замедл.) +Latch Shift Key +Применение Shift только при удерживании +Crotch Rope under panties +Веревка на промежности под трусиками +Chastity over Panties +Целомудрие поверх трусиков +Chastity over Harness +Целомудрие поверх упряжи +Chastity Bra over Bras +Бюстг. целомудрия поверх бюстгальтера +Simple Color Picker +Простой выбор цвета +Center Player +Игрок в центре +Draw Buffs on Side +Отображение баффов сбоку +Show Trajectory on Auto-Path +Отображение траектории на авто-пути +Show Player Facing +Отображать направление взгляда +Show more learnable spells +Показывать больше заклинаний для изучения +Show Player Buff Auras +Показывать баффы-ауры игрока +Show Enemy Buff Auras +Показывать баффы-ауры врагов +Minimalist Enemy Auras +Минималистичные ауры врагов +Pixelated GFX (needs restart) +Пикселизация GFX (требуется перезагр.) +Auto-Crouch when Tripped +Автомат. приседать при спотыкании +Retro Animations +Старые аниамции +Flip Status Bars +Отзеркалить строку состояния +### Reduce Accidental Wall Clicks + +Enable Nipples +Включить соски +Show Nipple Toys Over Bras +Показ. игрушки на соски поверх бюстальт. +Hide Nipple Clamps +Скрыть зажимы на сосках +Hide Nipple Piercings +Скрыть пирсинг сосков +Use default palette when no outfit is worn +Использовать стандарт. палитру когда без костюма +Flip Player Display +Отзеркалить отображение игрока +Grayscale when Blind +Серый фильтр при слепоте +Faster Floater Fade +Ускоренное исчезновение всплыващей инф. +No Damage Floaters +Убрать всплывающую инф. об уроне +### Dynamic Armor (must hide armor) + +Hide floating weapon display +Скрыть всплывающее изображение оружия +Automatically Take All from Chests +Автоматически забирать все из сундуков +Helpless! +Беспомощность! +Evaded! +Уклонение! +Blocked! +Блок! +Resisted Bondage! +Сопротивление ограничителям! +You bump into a wall. +Вы врезаетесь в стену. +Game Resolution: +Разрешение игры: +Resolution (needs reload): +Разрешение (требуется перезагр.): +Toy Volume: +Громкость игрушек: +Music Volume: +Громкость музыки: +SFX Volume: +Громкость эффектов: +Animation Time: +Время анимаций: +Map Brightness: +Яркость карты: +Game Font: +Игровой шрифт: +Button Font: +Шрифт кнопок: +Journey +Путешествие +Select a journey. This will determine the ordering of game areas. +Выберите путешествие. Это определит порядок расположения игровых зон. +Standard: The intended experience +Стандарт: Как задумано разработчиком +Random: A chaotic journey +Случайное: Вас на пути ожидает хаос +Harder: A more difficult journey +Усложнённое: Вас на пути ожидает множество трудностей +Select perks to start with. +Выберите, какие перки вы хотите получить на старте. +Having 10+ spare points will trigger Hard Mode, granting unique loot. +Наличие в запасе 10+ очков активирует Сложный Режим, в котором вас будет ожидать уникальная добыча. + (HARD MODE ENABLED) + (СЛОЖНЫЙ РЕЖИМ ВКЛЮЧЕН) +Advanced start (choose perks) +Продвинутый старт (выберите перки) +Kinky start +Извращенный старт +Normal start +Обычный старт +Point Cost: AMOUNT +Стоимость в очках: AMOUNT +Points Available: AMOUNT +Доступно очков: AMOUNT +Resilient Foes +Выносливые противники +Enemies have 30% more hp. +У врагов на 30% больше здоровья. +Strong +Сильная +Boosts the Struggle option when escaping. +Усиливает эффективность Борьбы при побеге. +Helpless +Беспомощная +You are physically weak. Struggling is much less effective. +Вы физически слабы. Борьба гораздо менее эффективна. +Flexible +Гибкая +Slightly boosts the Remove/Unlock option, escaping is 1.5x as fast except picking, and your feet can use items/buckles. +Немного усиляет опции Снять/Разблокировать, освобождение происходит в 1.5x раза быстрее (за исключением взлома), и вы можете использовать предметы/открывать пряжки ногами. +Inflexible +Негибкая +You get a penalty to the Remove and Unlock action, and escaping is 0.75x as fast. +Опции Снять/Разблокировать получают небольшой штраф, и скорость освобождения уменьшается до 75%. +Locksmith +Мастер взлома +You get a bonus to lockpicking, allowing you to pick some high-security locks previously impossible. +Отмычки становятся эффективнее в ваших руках, позволяя вам вскрывать некоторые ранее неприступные сверх-надежные замки. +Clueless +Невежда +You have no idea how to pick locks. Picking is 0.5x as fast and you can't pick most advanced locks. +Вы не знаете, как правильно вскрывать замки. Скорость взлома уменьшена до 0.5x, и вы не можете более вскрыть большинство продвинутых замков. +Psychic +Телекинетик +You no longer drop keys and picks, can unlock yourself with bound hands, and don't need hands for items/potions. +Отмычки и ключи более не выпадают из ваших рук, вы можете разблокировать себя со связанными руками, и вам более не нужны руки для исп. зелий и предметов. +Novice +Новичок +All spells above 1st level cost 2x as many spell points. +Все заклинания выше 1-ого уровня стоят в 2 раза больше очков способностей. +Blessed +Благословлённая +You can drink mana from the shrine fountains once per floor without chance of punishment. +Один раз за этаж вы можете безнаказанно выпить ману из святилища. +Cursed +Проклятая +Goddess reputations can never exceed 25. +Благосклонность Богинь не может превысить 25. +Submissive +Покорная +Your submissiveness starts at 100 and cannot go below 70. +Ваша покорность начинается со 100 и не может упасть ниже 70. +Wanted +В розыске +Your security level starts at 100 and cannot go below 70. +Ваш уровень опасности стартует со 100 и не может опуститься ниже 70. +Studious +Студент +You start the game with +1 spell point. Your first two spell categories are free. +Вы начинаете игру с 1-им дополнительным очком способностей. Ваши первые две категории заклинаний бесплатны. +Meditation +Медитация +You slowly regenerate mana, up to a maximum of 50. +Вы медленно восполняете ману, максимум до 50. +Willpower +Крепкая воля +-50% stamina drain from being at high arousal. +-50% потери выносливости от высокого возбуждения. +Bondage Lover +Любительница бондажа +Attempting to escape arouses you. +Попытки освободиться вас возбуждают. +Focused Dodge +Концентрация на уклонении +While your miscast chance is 0%, you gain +40 Evasion. +Когда шанс осечки составляет 0%, вы получаете +40 к Уклонению. +Distracted +Отвлечённая ++15% miscast chance (at all times) ++15% шанс осечки (в любое время) +Brawler +Боксёрша +Unarmed attacks deal +10 damage and being bound does not decrease unarmed damage. +Атаки без оружия наносят +10 урона и когда вы связаны, урон, наносимый без оружия, не уменьшается. +Way of the Squish +Путь любви +Unarmed attacks deal grope damage against humans. +Атаки без оружия наносят людям урон ощупыванием. +Way of the Spank +Путь наказания +Unarmed attacks deal pain damage against humans. +Атаки без оружия наносят людям урон болью. +Way of the Feather +Путь веселья +Unarmed attacks deal tickle damage against humans. +Атаки без оружия наносят людям урон щекоткой. +Harmless +Слабачка +Unarmed attacks deal half damage and cost 2x as much stamina. +Атаки без оружия наносят половину урона и требуют в 2 раза больше выносливости. +Clumsy +Неуклюжая +0.7x base accuracy +0.7x базовая точность +Unfocused +Отвлеченная +Accuracy multiplied by 0.9x above 10% distraction, down to 0.6x at 90% distraction. +Точность умножается на 0,9 при 10%-ном возбуждении, и на 0,6 при 90%-ном возбуждении. +Focused Strikes +Сосредоточенные удары +90% less accuracy penalty on swung weapons due to distraction. +На 90% меньше штраф к точности при взмахах оружием из-за возбуждения. +Focused Power +Сосредоточенная сила +90% less stamina cost penalty on staves and similar weapons distraction. +На 90% меньше штраф к потери выносливости оружия типа посохов и похожего из-за возбуждения. +Pristine +После уборки +There are significantly less shiny loot objects in the dungeon. +В подземелье значительно меньше блестящих предметов на полу. +Lost Technology +Потерянные технологии +Ancient power cores break with use, and cannot be recharged. +Древние энергоядра ломаются при использовании и более не могут быть заряжены. +Unchained +Нескованная +Start with high Metal reputation, and all metal restraints are easier to escape from. +Начните с высокой благосклонностью Метала. Вам будет легче освободиться ото всех металлических ограничителей. +Damsel in Chains +Дама в цепях +Metal restraints are harder to escape from. +Вам будет труднее освободиться от металлических ограничителей. +Forgetful +Забывчивая +You don't remember where you've been in the level. 30 turn timer. +Вы не помните, какие места на уровне уже посещали. Таймер 30 ходов. +Cursed Locks +Проклятые замки +Those without keys shall face the Wrath of the Lock. Locked items cannot be cut and are harder to struggle. +Те, у кого нет ключей, встретятся с Гневом Замков. Заблокированные предметы нельзя разрезать, и сними труднее бороться. +The magical warding from the lock protects the item. +Магическая защита замка окутывает весь предмет. +Undeniable +Безотказная +Born with an intense submissive desire, you cannot refuse bondage from dialogues. +Родившись с непреодолимым желанием быть покорной, вы не можете отказаться от предложений бондажа в диалогах. +Frantic Struggle +Неистовое сопротивление +Your escaping is 3 times as fast, but less efficient in terms of stamina. +Вы освобождаетесь в 3 раза быстрее, но общие затраты выносливости становятся выше. +Escape Artist +Гуру верёвок +Start with high Rope reputation, and all rope restraints are easier to escape from. +Начните с высокой благосклонностью Верёвки. Вам будет легче освободиться ото всех верёвочных ограничителей. +Rope Bunny +Связанный кролик +Rope restraints are harder to escape from. +Вам будет труднее освободиться от верёвочных ограничителей. +Slippery +Скользкая +Start with high Latex reputation, and all latex restraints are easier to escape from. +Начните с высокой благосклонностью Латекса. Вам будет легче освободиться ото всех латексных ограничителей. +Latex Doll +Латексная кукла +Latex restraints are harder to escape from. +Вам будет труднее освободиться от латексных ограничителей. +Escapee +Мастер побега +Start with high Leather reputation, and all leather restraints are easier to escape from. +Начните с высокой благосклонностью Кожи. Вам будет легче освободиться ото всех кожаных ограничителей. +Leather-Bound +В кожаных тисках +Leather restraints are harder to escape from. +Вам будет труднее освободиться от кожаных ограничителей. +Slayer +Стихийник +You can cast Elemental spells without having the components, at twice the cost. Start w/ Firebolt. +Вы можете применять Стихийные заклинания без активатора, но за двойную цену. На старте вам будет доступен Огненную стрелу. +Conjurer +Созидатель +You can cast Conjuration spells without having the components, at twice the cost. Start w/ Conjure Chain. +Вы можете применять заклинания Сотворения без активатора, но за двойную цену. На старте вам будут доступны Магические цепи. +Magician +Иллюзионист +You can cast Illusion spells without having the components, at twice the cost. Start w/ Shadow Dagger. +Вы можете применять заклинания Иллюзий без активатора, но за двойную цену. На старте вам будет доступен Теневой кинжал. +Narcoleptic +Нарколепсия +You slowly lose stamina over time. +Вы медленно теряете выносливость. +Stealth Mission +Стелс-миссия +You are harder to detect and there are more chests, but enemies have 50% more HP, are more evasive, and drop no gold. +Вас труднее обнаружить, а вокруг можно найти больше сундуков, но у врагов на 50% больше здоровья, они лучше уклоняются и из них не выпадает золото. +Edging Lovers +Фанаты грани +All humanoids that can bind you also apply edging toys. +Все гуманоиды, которые могут связать вас, также используют игрушки для удержания на грани. +Denial Lovers +Фанаты отрицания +All humanoids that can bind you also apply denial toys. +Все гуманоиды, которые могут связать вас, также используют игрушки с функцией отрицания. +Pleasure Lovers +Фанаты удовольствия +All humanoids that can bind you also apply pleasurable toys. +Все гуманоиды, которые могут связать вас, также используют игрушки, доставляющие удовольствие. +Teasing Lovers +Фанаты поддразнивания +All humanoids that can bind you also apply teasing toys. +Все гуманоиды, которые могут связать вас, также используют дразнящие игрушки. +Latex Lovers +Любительница Латекса +All humanoids that can bind you also apply latex restraints. +Все гуманоиды, которые могут вас связать, также используют латексные ограничители. +Leather Lovers +Любительница Кожи +All humanoids that can bind you also apply leather restraints. +Все гуманоиды, которые могут вас связать, также применяют кожаные ограничители. +Wolfgirl Lovers +Любительница Волчиц +All humanoids that can bind you also apply wolfgirl restraints. +Все гуманоиды, которые могут вас связать, также применяют ограничители серии Волчица. +Maid Lovers +Любительница Горничных +All humanoids that can bind you also apply maid restraints. +Все гуманоиды, которые могут вас связать, также применяют ограничители серии Горничная. +Dress Lovers +Модный приговор +All humanoids that can bind you also apply dress restraints. +Все гуманоиды, которые могут вас связать, также применяют ограничивающую одежду. +Kitty Lovers +Женщина-Кошка +All humanoids that can bind you also apply kitty restraints. +Все гуманоиды, которые могут вас связать, также применяют ограничители серии Кошечка. +Adv Latex Lovers +Ярая Любительница Латекса +All humanoids that can bind you also apply advanced latex restraints. +Все гуманоиды, которые могут вас связать, также применяют усовершенствованные латексные ограничители. +Conspicuous +Шумная +Enemies detect you more easily. +Врагам легче вас обнаружить. +Bound Power +Сила в ограничении +Your damage and evasion increases based on the number of restraints worn, up to +40% when thoroughly bound. +Ваш урон и уклонение увеличиваются в зависимости от количества носимых ограничителей, до +40%, когда вы полностью связаны. +Kill Squad +Миссия невыполнима +Enemies gain increased blindsight and vision radius. +Враги получают улучшенные Слепое Зрение (Видение сквозь стены) и радиус обзора. +Supermarket +Супермаркет +Commerce shrines can appear in levels and have slightly more items. +Святилища Торговли могут появиться на уровнях и имеют больше товаров в ассортименте. +Price Gouging +Монополия +Items are 5x as expensive in the shop. +Товары в магазине стоят в 5 раз дороже. +Supermarket +Супермаркет +Commerce shrines can appear in levels and have slightly more items. +Святилища Торговли могут появиться на уровнях и имеют больше товаров в ассортименте. +Price Gouging +Монополия +Items are 5x as expensive in the shop. +Товары в магазине стоят в 5 раз дороже. +High Security +Строгий режим +Picks are weaker, and randomly generated locks are harsher. +Отмычки слабее, а случайно сгенерированные замки суровее. +Shoddy Knives +Дешевые ножи +Knives break more easily. +Ножи быстрее ломаются. +Oppression +Презренная +Ghosts are less likely to help you. +Призраки куда менее охотно помогают вам. +Search Party +Группа захвата +More enemies spawn during sleep. +Во время сна появляется больше врагов. +No Way Out +Выхода нет +Enemies will always use the tightest restraints possible regardless of willpower. +10 Security level. +Враги всегда будут использовать самые жесткие ограничители, какие только возможны, независимо от силы воли. Уровень опасности +10. +Deft Footwork +Ловкие ноги +You ignore some consequences of being mildly slowed from heels or slime, and you can cast Leg spells while slowed significantly at 50% miscast chance. +Вы игнорируете некоторые последствия умеренного замедления из-за каблуков или слизи, и можете использовать заклинания с активатором Ноги, будучи значительно замедленными, с вероятностью осечки в 50%. +Poor Form +Плохая форма +Slowing effects on you are amplified. +Эффекты замедления на вас усиливаются. +Poor Coordination +Плохая координация +You must have both fingers and arms free to cast arm spells. Hand restraints are more effective on you. +У вас должны быть свободны все пальцы и руки, чтобы произносить заклинания с активатором Руки. Ограничители для рук более эффективны на вас. +Deft Fingering +Ловкие пальцы +You can cast arm spells using just your fingers, as long as your hands aren't bound. +Вы можете произносить заклинания с активатором Рук, используя только пальцы, если ваши ладони не связаны. +Well-Equipped +Хорошая экипировка +Restraints and traps that are limited by level appear sooner, and enemies stack more restraints in general. +10 security level. +Ограничители и ловушки, которые ограничены уровнем, появляются раньше, и в целом враги используют больше ограничителей. Уровень опасности +10. +Quick-Draw +Дикий запад +Switching weapons and spells does not take a turn. +Смена оружия и заклинаний не тратит хода. +Quick-Scribe +Пулемёт +Switching spells and casting from spellbook does not take a turn. +Смена и произнесение заклинаний из общего списка не тратит хода. +Disorganized +Безалаберность +Switching weapons, learning/choosing spells, and casting from spellbook takes 3 turns. +Смена оружия, выбор/изучение заклинаний и применение заклинаний из общего списка занимает 3 хода. +Savour the Taste +Наслаждаясь вкусом +Drinking a potion takes 2 turns +Питье зелий занимает 2 хода +Magic Hands +Фокус-покус +Enemies can add restraints underneath existing restraints. +Враги могут добавлять ограничители под надетые ограничители. +Fully Integrated +Полная интеграция +Start with your body sealed in an adhesive layer of latex. +Начните с того, что ваше тело будет запечатано в липкий слой латекса. +Doll Processing +Процедура куколизации +Start atop a conveyor on your way to be sealed away inside the Facility. +Начинайте с конвейера на пути к запечатыванию внутри Комплекса. +Cyber Doll +Кибер-кукла +Start in full Cyber restraints. +Начните в полном комплекте Кибер-ограничителей. +Fuuka's Pet +Питомец Фууки +Start with Fuuka's collar and a few restraints. +Начните с Ошейником Фууки и еще несколькими ограничителями. +Fuuka Fan Club +Фанк-клуб Фууки +All humanoids that can bind you also apply Fuuka's special restraints. +Все гуманоиды, которые могут вас связать, также применяют ограничители Фууки. +Collected +Часть коллекции +Start with The Warden's special belt which punishes you for defiling spell orbs. +Начните со специальным Поясом Надзирательницы, который наказывает вас за осквернение сфер заклинаний. +Enforcers +Стражи порядка +All humanoids that can bind you also apply The Warden's cuffs. +Все гуманоиды, которые могут сковать вас, также надевают оковы Надзирательницы. +Dollmaker's Minions +Миньоны Кукольницы +All humanoids that can bind you also apply Cyber Doll restraints. +Все гуманоиды, которые могут вас связать, также применяют ограничители серии Кибер-Кукла. +Doll Hunter V +Кукла-охотница В +You start with the Dollmaker's Visor. +Вы начинаете с Визором Кукольницы. +Doll Hunter M +Кукла-охотница М +You start with the Dollmaker's Mask. +Вы начинаете с Маской Кукольницы. +Persisting Desires +Настойчивые желания +Your dark desires are endless. +Ваше темное желание бесконечно. +Sugar Rush +Сахарная лихорадка +Consuming sweets makes you hyperactive, decreasing stamina costs and granting free moves. +Употребление сладостей делает вас гиперактивной, снижая затраты на выносливость и давая бесплатные передвижения. +Vengeance +Возмездие +Defeating an enemy greatly distracts you. +Победа над врагом вас сильно возбуждает. +Berserker Rage +Ярость берсерка +Melee attacks distract you, but melee (including chain) damage increases by up to 30% at max distraction. +Атаки ближнего боя возбуждают вас, но ваш урон в ближнем бою (включая цепной) увеличивается до +30% при максимальном возбуждении. +Unstable Magic +Нестабильная магия +Spells do up to 60% additional damage based on distraction or miscast chance, whichever is higher. +В зависимости от вашего возбуждения или шанса осечки (выбирается наибольшее) заклинания наносят до +60% дополнительного урона. +Absolute Focus +Абсолютный дисфокус +Miscast chance is doubled. +Шанс осечки при произнесении заклинания удваивается. +Bound Crusader +Связанный крестоносец +Goddesses will equip restraints upon acceptance of a quest. +Богини снарядят вас ограничителями после принятия задания. +Nowhere is Safe +Нигде не безопасно +Beds and furniture are often trapped. +Кровати и мебель могут зачастую содержать ловушки. +Quakehoof Associate +Помощник Quakehoof'а +Start with the Epsilon Collar, which regenerates mana when you play with yourself. +Начните с Ошейником Эпсилон, который восстанавливает ману, когда вы играете сами с собой. +Epsilon Collar +Ошейник Эпсилон +A collar reserved for the most prestigious of submissives. +Ошейник, предназначенный для самых элитных сабмиссивов. +Restores mana when you play with yourself, but increases the distraction given. Only works when Desire is below the limit. +Восстанавливает ману, когда вы играете сами с собой, но увеличивает количество получаемого возбуждения. Работает только тогда, когда Желание ниже предела. +Bullet Hell +Адская бомбардировка +Hides warning lines for non-AoE bullets and projectiles. +Скрывает предупреждающие строки для не-АОЕ пуль и снарядов. +Bullet Armageddon +Армагеддон из снарядов +Hides warning lines for AoE spells, bullets, and projectiles. +Скрывает предупреждающие строки для AoE заклинаний, пуль и снарядов. +I have... needs +У меня есть... потребности +Distraction builds up over time. +Возбуждение накапливается со временем. +Hopeless +Безнадёга +Willpower decays over time. +Со временем ваша Сила Воли уменьшается. +Quickness +Ускорение +Grants Quickness after not moving for 4 turns. Quickness lets you move 1 space without ticking the clock. +Если вы не двигаетесь 4 хода, то получаете ускорение. Ускорение позволит вам переместиться на 1 клетку без затраты хода. +Expansive Halls +Обширные залы +Increases the size of maps by 3 in the long dimension. Maps will be less dense. +Увеличивает размер карт на 3 в длину. Карты будут менее плотными. +Gargantuan Halls +Впечатляющие залы +Increases the size of maps by 6 in the long dimension. Maps will have a mix of tunnels and dead ends. +Увеличивает размер карт на 6 в длину. На картах будет много туннелей и тупиков. +Labyrinthine Halls +Настоящий лабиринт +Increases the size of maps by 9 in the long dimension. Maps will be mostly tunnels. +Увеличивает размер карт на 9 в длину. Карты будут в основном состоять из туннелей. +Absurdly Huge Maps +Абсурдно огромные карты +(Experimental) Make the maps really really big. Probably breaks the game. +(Экспериментальные) Делают карты действительно очень большими. Возможно, это сломает игру. +Rigger +Риггер +Binding on enemies is 30% stronger. +Ваше сковывание врагов становится на 30% эффективнее. +Pacifist +Пацифист +All damage dealt to humanoid enemies is reduced by 90% except teasing damage and pain/grope/tickle/charm/psychic/chain/glue. +Весь урон, наносимый гуманоидным врагам, уменьшается на 90%, за исключением урона от боли, ощупывания, щекотки, очарования, психического урона, дразнящего урона, урона цепями или слизью. +Curse Seeker +Искательница проклятий +When you pick up cursed armor or restraints from chests, they equip automatically if able. +Когда вы берете проклятую броню или ограничители из сундуков, они снаряжаются автоматически, если это возможно. +Burning Desire +Жгучее желание +While above 70% distraction, you ignite nearby objects and gain +25% fire damage. +Когда ваше возбуждение превышает 70%, вы начинаете поджигать близлежащие объекты и наносите на +25% больше урона от огня. +Frigid Personality +Холодна как лёд +While below 10% distraction, you gain +10% ice damage and can walk on ice without penalties. +Когда ваше возбуждение меньше 10%, вы наносите на +10% больше ледяного урона и можете ходить по льду без штрафов. +Grounded in Reality +Заземление +While at max mana, your attacks deal an additional 30% of their base damage as electric damage. +Когда ваша мана на максимуме, ваши атаки наносят дополнительные +30% урона в видео урона от электричества. +Like the Wind +Как ветер +While above 95% stamina, you gain +30 Evasion and your slow level is reduced by 1. +Когда у вас больше 95% выносливости, вы получаете +30 к Уклонению, а уровень вашего замедления снижается на 1. +Immovable Object +Непоколебимая +While above 90% willpower, you gain +150 Bondage Resist and Earth buff spells cost half mana. +Когда у вас больше 90% силы воли, вы получаете +150 к сопротивлению сковыванию, а заклинания стихии Земли стоят половину маны. +Path of Least Resistance +Путь наименьшего сопротивления +While at 0 WP, you gain +35 Evasion and deal 20% of your max WP as soap damage when enemies restrain you. +Пока ваша сила воли на 0, вы получаете +35 к уклонению и наносите 20% от максимума вашей силы воли в качестве Смывающего урона когда враги сковывают вас. +Sticky Situation +Липкая ситуация +You take 40% more glue damage. +Вы получаете на 40% больше урона от слизи. +Breathless +Запыхавшаяся +Taking chain, poison, and crush damage makes you dizzy. +При получении цепного урона, урона ядом и дробящего урона у вас начинается головокружение. +Kinky Prisoner +Заключённая-извращенка +Guards won't remove restraints unless they have something tighter. +10 Security level. +Охранники не снимут ваши ограничители, если у них нет чего-нибудь посерьезнее. Уровень опасности +10. +Unfair Doors +Несправедливые двери +Doors are harder to open while your hands are bound. +Открывать двери со связанными руками теперь сложнее. +You rattle the doorknob uselessly and end up banging on the door. +Вы безуспешно дергаете дверную ручку, и в конце концов просто стучите в дверь. +You can't quite get a grip on the doorknob. +Вы никак не можете ухватиться за дверную ручку. +Someone hears you banging and opens the door from the other side! +Кто-то слышит, как вы стучите, и открывает дверь с другой стороны! +Someone notices you fiddling with the door and opens it from the other side! +Кто-то замечает, как вы возитесь за дверью, и открывает ее с другой стороны! +The door squeaks open as the latch wasn't fully engaged. +Дверь со скрипом открывается, так как защелка была задвинута не до конца. +You grab the doorknob with your wrists and flex it open. +Вы хватаетесь за дверную ручку запястьями и, изогнувшись, поворачиваете её. +You use your flexible feet to open the door. +Вы используете свои гибкие ноги, чтобы открыть дверь. +Poor Technique +Плохое исполнение +Instead of fizzling, most miscasted projectiles and AoE spells will target you instead. +Вместо того, чтобы прерваться, большинство неправильно произнесённых AOE-заклинаний и заклинаний-снарядов будут нацелены на вас. +Ticklish +Боязнь щекотки +You take 50% more tickle damage. +Вы получаете на 50% больше урона от щекотки. +Stoic +Стоик +You gain +82 tickle resist. +Вы получаете 82% сопротивления к щекотке. +Lascivious +Блудница +You take 50% more grope damage. +Вы получаете на 50% больше урона от ощупывания. +Unperturbed +Невозмутимая +You gain +82 grope resist. +Вы получаете 82 сопротивления ощупыванию. +Masochist +Мазохистка +Pain is strongly arousing. +Боль вас сильно возбуждает. +Pain Tolerance +Терпимость к боли +You gain +200 pain resist. +Вы получаете +200 сопротивления к боли. +Fashionable +Модница +When you are jailed, you keep your outfit. +Оказавшись в тюрьме, вы сохраните свой наряд. +Futile Struggles +Тщетная борьба +Lose 2 WP every time you remove a non-trivial restraint. +Теряйте 2 WP каждый раз, когда вы снимаете нетривиальный ограничитель. +Second Wind +Второе дыхание +Regenerate WP when unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, gag, or slows. (Upgrade available in spell tree) +Восстанавливает WP когда вы свободны, до 10% от максимального WP.'Свободны' означает отсутствие связывания рук, кистей, ног, повязки на глазах, кляпа во рту и уровня замедления.(Апгрейд доступен в дереве закл.) +Second Wind Perk +Второе дыхание (Перк) +Regenerate WP when you are unimpaired, up to 10% of max WP. Unimpaired means no arm, hand, leg, blindfold, or gag bondage, and no slows. +Восстанавливает WP когда вы свободны, до 10% от максимального WP. 'Свободны' означает отсутствие связывания рук, кистей, ног, повязки на глазах, кляпа во рту и уровня замедления. +Triumphant Wind +Торжествующий ветер +Second Wind now regenerates up to 25% of your max WP +Второе дыхание теперь восстанавливает до 25% вашего максимального WP +Mental Defiance +Ментальное неповиновение +Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While below 25% WP, quickly convert 'Defiance' into WP. +Пассивное: При потере WP от остановки на краю, оргазма, или поддразнивания, накапливает 'Неповиновение' на величину вашего потерянного DP. Переключение: Когда WP ниже 25%, быстро преобразует 'Неповиновение' в WP. +Mental Fortitude +Ментальная стойкость +Passive: Losing WP from edging, letting go, or teasing damage stores 'Defiance', capped at the value of your missing DP. Toggle: While above 75% WP but below 100%, quickly convert 'Defiance' into WP. Exclusive with Mental Defiance. +Пассивное: При потере WP от остановки на краю, оргазма, или поддразнивания, накапливает 'Неповиновение' на величину вашего потерянного DP. Переключение: Когда WP выше 75%, но ниже 100%, быстро преобразует 'Неповиновение' в WP. Несовместимо с 'Ментальное неповиновение'. +Locked Up +Взаперти +While wearing a chastity belt, your Desire lowers when you perform actions such as defeating enemies, opening chests, and breaking orbs. (Upgrades available in spell tree) +Пока вы носите пояс целомудрия, ваше Желание снижается, когда вы побеждаете врагов, открываете сундуки и разбиваете сферы. (Апгрейды доступны в дереве заклинаний) +Locked Up Perk +Взаперти (Перк) +While wearing a chastity belt, your Desire lowers when you perform actions such as capturing, opening chests, and breaking orbs. +Пока вы носите пояс целомудрия, ваше Желание снижается, когда вы захватываете врагов, открываете сундуки и разбиваете сферы. +Controlled Urges +Контролируемые позывы +Locked Up is 150% effective. Gain +70 psychic/charm resist from a chastity belt and +30 from a chastity bra. While not wearing a chastity belt, your Desire increases slowly. +'Взаперти' применяется со 150% эффективностью. Получите +70 сопротивления психическому урона и урону от очарования от пояса целомудрия и +30 от бюстгальтера целомудрия. Пока вы не носите пояс целомудрия, ваше Желание медленно возрастает. +Ready for Training +Готова к тренировке +Locked Up is 200% effective. +25% stamina regen per 100 current DP. Playing with yourself is less effective while vibrators are off or set to edge. Slow level is increased by 1 when you aren't wearing any chastity. +'Взаперти' применяется с 200% эффективностью. +25% к восстановлению выносливости за 100 текущих DP. Самоудовлетворение менее эффективно, когда вибраторы выключены или находятся в режиме удержания на грани. Уровень Замедления увеличивается на 1 когда вы не носите предмет целомудрия. +Efficient Denial +Эффективное отрицание +Locked Up is 300% effective. When Locked Up triggers, you gain -30% mana costs and +25% physical damage for 7 turns (35 when opening a chest or breaking orbs). You cannot orgasm unless you are wearing a chastity belt, and slow level is increased by 2. +'Взаперти' применяется с 300% эффективностью. Когда 'Взаперти' активирована, ваши затраты маны снижаются на 30% и вы получаете +25% психического урона на 7 ходов (35 при открытии сундука или разбивании сферы). Вы не сможете достичь оргазма, если на вас не надет пояс целомудрия, а Уровень Замедления увеличится на 2. +Recalcitrant +Непокорная +Relinquish the Locked Up perk. One time only. If you take the perk again, there is no going back. +Откажитесь от перка 'Взаперти'. Работает только один раз. Если вы снова возьмете этот перк, пути назад не будет. +Novice Pet +Начинающий питомец +You can now sprint while wearing a petsuit. (Upgrades available in spell tree) +Теперь вы можете перейти на спринт нося петсьют. (Апгрейды доступны в дереве заклинаний) +Novice Pet Training +Питомец в начале тренировки +You can now sprint while wearing a petsuit. +Теперь вы можете перейти на спринт только нося петсьют. +Eager Pet +Осваивающийся питомец ++1 slow reduction while wearing a petsuit, but sprint costs are increased by 30% when not wearing a petsuit. +Дает +1 сокращение Замедления пока вы носите петсьют, но затраты на Спринт увеличиваются на 30% когда вы не носите петсьют. +Experienced Pet +Опытный питомец ++2 slow reduction total while wearing a petsuit (from +1), but sprint costs are increased by 100% (from 30%) when not wearing a petsuit and slow level is increased by +1. ++2 сокращение Замедления пока вы носите петсьют (вместо +1), но затраты на Спринт увеличиваются на 100% (вместо 30%) когда вы не носите петсьют, а также при этом Уровень Замедления увеличится на +1. +Devoted Pet +Преданный питомец ++3 slow reduction total while wearing a petsuit (from +2), but you cannot sprint (from +100% cost) when not wearing a petsuit and slow level is increased by +2 (from +1). ++3 сокращение Замедления пока вы носите петсьют (вместо +2), но вы не можете перейти на Спринт (вместо +100% стоимости) когда вы не носите петсьют, а также при этом Уровень Замедления увеличится на +2 (вместо +1). +Bad Pet +Плохой питомец +Relinquish the Novice Pet perk. One time only. If you take the perk again, there is no going back. +Откажитесь от перка 'Начинающий питомец'. Работает только один раз. Если вы снова возьмете этот перк, пути назад не будет. +You are an expert in wearing a petsuit and your mobility is increased. +Вы эксперт в ношении петсьюта, ваша мобильность повышается. +You are too used to wearing petsuits! Sprinting is impaired. +Вы слишком привыкли носить петсьюты! Спринт невозможен. +You are a disobedient pet. You should put on a petsuit! +Непослушный питомец. Тебе следует надеть петсьют! +Dominant +Доминант +They're trapped here with you. Ghosts are more helpful, and you can bind enemies that confront you about bondage. +Это они заперты здесь с вами. Призраке более полезны, и вы можете связывать врагов, которые предлагают связать вас. +Stranger +Незнакомец +Randomizes your relationship to most factions. +Рандомизирует ваши отношения с большинством фракций. +Wrong Neighborhood +Не тот район +All factions are hostile and united against you. +Все фракции враждебны и объединились против вас. +Bandit +Бандитка +Start friendly to bandits, and hostile to most other factions. +Начните с дружелюбных отношений с бандитами и враждебным с большинством других фракций. +Trespasser +Нарушитель +You lose reputation with the goddesses every time you advance a floor. +Вы теряете благосклонность богинь каждый раз, когда вы проходите этаж. +Prisoner +Заключенный +Start the game as a submissive prisoner wandering the halls. +Начните игру как покорный заключенный, бродящий по залам. +Rusty Bolts +Ржавые болты +Most traps have a 25% misfire chance each time you step on them. +Большинство ловушек имеют 25%-ную вероятность не сработать каждый раз, когда вы на них наступаете. +Not a Pet +Я вам не питомец +Petsuits occur less often. +Петсьюты встречаются реже. +Unmasked +Без масок +Hoods and full-face covering masks do not appear, but blindfolds are more powerful. Does not include kigurumi masks. +Капюшоны и маски на всё лицо не встречаются в подземелье, но повязки на глаза более эффективны. Не включает в себя маски кигуруми. +No Kigurumi Masks +Без масок Кигуруми +Removes face-mimicking masks from the game. +Удаляет из игры маски, имитирующие лицо. +No Hoods +Без капюшонов +Removes hoods from the game. +Удаляет из игры капюшоны. +No Sense Deprivation +Без сенсорной депривации +Removes sensory deprivation hood/mask from the game. +Удаляет из игры капюшоны/маски сенсорной депривации. +Blackout +Блэкаут +Blindfolds are stronger. While blindfolded you can only see enemies next to you. +Повязки на глаза теперь эффективное. С завязанными глазами вы можете увидеть только тех врагов, что стоят рядом с вами. +No Blindfolds +Без повязок на глаза +In most cases you will not get blindfolded, except for cloth blindfolds which can be escaped easily. +В большинстве случаев вам не будут завязывать глаза, за исключением матерчатых повязок, которые можно легко снять. +Total Blackout +Полный блэкаут +Blindfolds are extremely punishing. +Повязки на глаза теперь экстремальное наказание. +Poor Vision +Плохое зрение +Vision radius is significantly reduced. +Радиус обзора значительно уменьшается. +Keen Hearing +Острый слух +You can more easily hear enemies and their movements through walls. +Вам будет легче услышать врагов и их передвижения сквозь стены. +Archer's Eye +Глаз лучника ++2 vision radius. ++2 радиуса обзора. +Night Owl +Ночная сова +Your vision in dark areas is improved. +Ваше зрение в темных местах улучшается. +Fear of the Dark +Ужас во тьме +Your vision in dark areas is reduced. +Ваше зрение в темных местах ухудшается. +Mutually Assured Darkness +Обоюдоострая темнота +Darkness is twice as effective in hiding from enemies, but your night vision is also reduced. +Темнота в два раза эффективнее для укрытия от врагов, но ваше ночное зрение также ухудшается. +Stalker +Сталкер +Darkness is twice as effective in hiding from enemies. +Темнота в два раза эффективнее для укрытия от врагов. +Not a Doll +Я не кукла +You may still enter Doll Terminals, but enemies will not force you onto doll stands. +Вы все еще можете войти в Кукольные Терминалы, но враги не поместят вас на кукольные стенды. +No Nurses +Никаких медсестёр +Nurses will not appear in the game. +Медсестры не будут появляться в игре. +No Police +Никакой полиции +Police-based bounty hunters will not appear in the game. +Основанные на полиции охотники за головами не будут появляться в игре. +No Brats +Никаких сорванцов +Submissive enemies won't run away from you. +Покорные враги не убегают от вас. +Brats Only +Только сорванцы +Submissive enemies will always be bratty and force you to catch them. +Покорные враги всегда будут дерзкими и заставят вас ловить их. +More Tape +Больше лент +Tape-wielding enemies (such as Tape Bots) occur more frequently. +Враги, имеющие при себе ленты (такие как ленточные боты) встречаются чаще. +Less Tape +Меньше лент +Fewer tape-related enemies will appear, although this does not remove tape entirely. +Будет появляться меньше врагов, имеющих при себе ленты, хотя это и не удаляет ленты полностью. +No Tape Bots +Никаких ленточных ботов +The old civilization did not use tape-based restraints in their capture robots. +Древняя цивилизация не использовала в своих роботах захвата ограничители на основе лент. +Less Cable Bots +Меньше кабельных ботов +The old civilization used significantly less cable-based restraints in their capture robots. +Древняя цивилизация использовала значительно меньше ограничителей на основе кабелей в своих роботах захвата. +No Resin Bots +Никаких резиновых ботов +The old civilization did not use crystal resin-based restraints in their capture robots. +Древняя цивилизация не использовала в своих роботах захвата ограничители на основе застывающей смолы. +Lexx Latex Bots +Меньше латексных ботов +The old civilization used significantly less latex-based restraints in their capture robots. +Древняя цивилизация использовала значительно меньше ограничителей на основе латекса в своих роботах захвата. +More Encasement +Больше Оболочек +Enemies that encase you (e.g slimes, latex cubes) will appear more frequently. +Враги, которые могут заключить вас в Оболочку (например слаймы, латексные кубы), будут появляться чаще. +Less Encasement +Меньше Оболочек +Fewer encasement-related enemies will appear, although this does not remove them entirely. +Будет появляться меньше врагов, связанных с Оболочками, хотя это не устранит их полностью. +More Bubbles +Больше пузырей +Enemies that use bubbles (e.g. aqua slimes, water witches) will appear more frequently. +Враги, использующие пузыри (например, водяные слизни, водяные ведьмы), будут появляться чаще. +Less Bubbles +Меньше пузырей +Fewer bubble-related enemies will appear, although this does not remove them entirely. +Будет появляться меньше врагов, связанных с пузырями, хотя это не приведет к их полному удалению. +Trainee +Стажер +Your training has given you access to the powers of the Trainee class. (Aroused mode only) +Ваши тренировки дали вам доступ к способностям класса Стажер. (Только похотливый режим) +Fighter +Воительница +Your training has given you access to the powers of the Fighter class. +Ваши тренировки дали вам доступ к способностям класса Воительница. +Rogue +Ассасин +Your training has given you access to the powers of the Rogue class. +Ваши тренировки дали вам доступ к способностям класса Ассасин. +Wizard +Маг +Your training has given you access to the powers of the Wizard class. +Ваши тренировки дали вам доступ к способностям класса Маг. +Peasant +Крестьянка +You possess the agricultural mastery of the Peasant class. +Вы обладаете аграрным мастерством класса Крестьянка. +Panic! (Chests) +Паника! (Сундуки) +When you open a trapped chest, you are stunned for 2 turns. +Когда вы открываете сундук с ловушкой, вы оглушаетесь на 2 хода. +Panic! (Traps) +Паника! (Ловушки) +When you step on a trap, you are stunned for 2 turns. +Когда вы наступаете на ловушку, вы оглушаетесь на 2 хода. +Panic sets in! (Stunned 2 turns) +У вас приступ паники! (Оглушение на 2 хода) +Butterfingers +Скользкие пальцы +Having arms bound prevents you from using your hands to struggle or unlock yourself. +Ограничители на предплечьях мешают вам использовать руки при борьбе или разблокировке. +Weak Grip +Слабая хватка +Having arms bound prevents you from holding weapons or potions. +Ограничители на предплечьях мешают вам удерживать зелья или оружие. +You kneel down so you can reach the potion with your mouth... +Вы встаете на колени, чтобы добраться до зелья своим ротом ... +Can't Hear You! +Не слышу тебя! +Being gagged blocks you from casting verbal spells regardless of gag power. +Любой кляп, вне зависимости от своей строгости, лишает вас возможности произносить заклинания. +Smooth Talker +Язык без костей +Being gagged does not increase your miscast chance for verbal spells unless fully gagged, and reduces gag power by 20%. +Если вам заткнули рот, это не увеличивает ваш шанс осечки при произнесении Словесных заклинаний, если только ваш рот не заткнут полностью, также уменьшает силу кляпа на 20%. +Unmasked +Разоблачение +Hoods and full-face covering masks do not appear, but blindfolds are more powerful. +Капюшоны и маски на всё лицо не встречаются в подземелье, но повязки на глаза более эффективны. +Ball Gag Lover +Любительница кляпов-шариков +Increase occurrence of ball gags, decrease occurrence of muzzles. +В подземелье увеличивается количество кляпов-шариков и уменьшается количество кляпов-намордников. +Muzzle Lover +Любительница намордников +Greatly increases the occurrence of muzzles. +В подземелье значительно увеличивается количество кляпов-намордников. +Armbinder Lover +Любительница армбиндеров +More armbinders, less straitjackets. +Больше армбиндеров, меньше смирительных рубашек. +Jacket Lover +Любительница смирительных рубашек +More straitjackets, less armbinders. +Больше смирительных рубашек, меньше армбиндеров. +Maid Sweeper +Прирождённая горничная +Start in a magically locked maid outfit. +Начните в запечатанной магией одежде горничной. +Wolf Trainee +Волчица-стажёр +Start in a uniform of a naughty wolfgirl. +Начните в униформе непослушной волчицы. +Latex Toy +Латексная игрушка +Start bound in lovely latex restraints. +Начните, будучи в очаровательных латексных ограничителях. +Elemental Slave +Рабыня стихий +Start in a full set of magically locked obsidian cuffs. +Начните с полного набора запечатанных магией обсидиановых кандалов. +Mana Burst +Взрыв маны +While at 100% distraction, you get -100% miscast chance but spending too much mana at once may cause you to go over the edge. +Когда вы возбуждены на 100%, вы получаете -100% к шансу осечки, но большая единоразовая трата маны может вызвать оргазм. +Arousing Magic +Возбуждающая магия +Your magic is powered by otherworldly distracting energies. Casting spells increases distraction based on the mana spent. +Ваша магия пропитана потусторонними возбуждающими эманациями. Применение заклинаний увеличит ваше возбуждение, основываясь на кол-ве затраченной маны. +Clearheaded +Чистый разум +Magic puts you in a clear state of mind. Casting spells successfully reduces your distraction. +Сосредоточившись на магии, вы возвращаете себе здравомыслие. Применение заклинаний уменьшает возбуждение. +Unidentified Wear +Неопознанная экипировка +Enchanted (and cursed) wearables and weapons are unidentified until the item is used. +Зачарованные (и проклятые) предметы экипировки и оружие остаются неопознанными до тех пор, пока они не будут использованы. +Unknown +'Неопознано' +Copy (clipboard) +Копировать в буфер +Paste (clipboard) +Вставить из буфера +DAMAGEDEALT electric damage conducts to you!!! +Вы получаете DAMAGEDEALT урона от электричества!!! +The pressure fans the flames on you, dealing bonus DAMAGEDEALT fire damage! +Давление раздувает пламя на вас, нанося дополнительно DAMAGEDEALT урона от огня! +The RestraintName comes off more easily in the presence of water! +С наличием воды RestraintName снимается гораздо легче! +You slip on the floor! +Вы поскользнулись! +The air around you is ablaze! (-DamageDealt SP) +Воздух вокруг вас пылает! (-DamageDealt SP) +The Goddess of Illusions shrouds you in shadows! +Богиня Иллюзий окутывает вас тенями! +You struggle against your bonds, but a magical force resists! +Вы боретесь со своими оковами, но вам мешает магическая сила! +The ropes squeeze you tighter and tighter... +Веревки всё туже и туже сжимаются вокруг вас... +Your body sinks deeper into a sea of bindings... +Ваше тело всё глубже и глубже погружается в море верёвок... +You struggle to breath as you are buried alive in squirming ropes... +Вы заживо погребены в извивающихся веревках, вам становится труднее дышать... +The slime stretches out over your body... +Слизь растекается по вашему телу... +The slime continues to engulf you, blocking out your vision... +Слизь продолжает окутывать вас, блокируя ваше зрение... +The slime starts to harden, sealing you inside a rubbery prison... +Слизь начинает затвердевать, заключая вас в резиновую тюрьму... +You feel a force compelling you to stop resisting... +Вы чувствуете силу, заставляющую вас прекратить сопротивление... +Your body struggles to move as you feel a power sealing you! +Ваше тело изо всех сил пытается вырваться, но вы чувствуете, как какая-то сила запечатывает вас! +The sarcophagus' door slides open as you are slowly pulled inside... +Створки саркофага открываются, и вас медленно втягивает внутрь... +The hands squeeze you tightly as a shadowy portal appears... +Руки крепко сжимают вас и появляется темный портал... +More hands clasp over your body as they pull you toward the portal... +Еще больше рук обхватывают ваше тело, и они тянут вас к порталу... +You struggle to breath as you are pulled into the mass of shadow hands... +Вам становится трудно дышать, вас всё глубже затягивает в массу теневых рук... +The world goes dark... +Мир погружается во тьму... +You wake up in a different place... +Вы просыпаетесь в другом месте... +Arcane Explosion +Взрыв Арканы +EnemyName says something incomprehensible! Her spell miscasts! +EnemyName говорит что-то нечленораздельное! Её заклинание не срабатывает! +EnemyName fumbles her next move! +EnemyName обдумывает свой следующий ход! +The EnemyName utters a command word on the TargetName! +EnemyName произносит командное слово в сторону TargetName! +Nipples +Соски +Nipples +Соски +Breasts +Грудь +Panties +Трусики +Panties +Трусики +Front +Передняя +Rear +Задняя +Feet +Ступни +Everywhere! +Везде! +Physical Armor: +Физическая защита: +Magic Armor: +Магическая защита: +In the Shadows: You are harder to see. +В тенях: Вас труднее увидеть. +Invisible: You are very difficult to see. +Невидимость: Вас очень трудно увидеть. +Quickness: Your next movement is so fast it doesn't advance a turn. +Ускорение: Ваше следующее движение будет очень быстрым и не потратит ход. +All Damage Reduction: +Уменьшение всего урона: +You take PERCENT1 DAMAGETYPE damage, based on PERCENT2 DAMAGETYPE resist and PERCENT3 DAMAGECATEGORY modifier. +Вы получаете PERCENT1 DAMAGETYPE урона, основываясь на PERCENT2 DAMAGETYPE сопротивлении и PERCENT3 DAMAGECATEGORY модификаторе. +You deal PERCENT more DAMAGETYPE damage. +Вы наносите на PERCENT больше DAMAGETYPE урона. +Your bindings are PERCENT more effective. +Ваши оковы на PERCENT эффективнее. +Your attacks deal a base of DAMAGEDEALT DAMAGETYPE damage, for a stamina cost of STMNA. +Ваши атаки базово наносят DAMAGEDEALT DAMAGETYPE урона, затрачивая при этом STMNA выносливости. +Plugged! +Игрушка внутри! +Plugged up!!! +Затычка!!! +Denied! You won't be getting off that easy~ +Вам отказано! Ты не кончишь так легко~ +Teasing vibrations... +Дразнящая вибрация... +Gentle vibrations... +Нежная вибрация... +Mild vibrations... +Слабая вибрация... +Strong vibrations! +Сильная вибрация! +Intense vibrations!! +Интенсивная вибрация!! +Torturous vibrations!!! +Мучительная вибрация!!! +Your restraints are restrictive! Struggling is less effective without help. +Ваши ограничители сковывают ваши движения! Борьба без посторонней помощи менее эффективна. +Stunned! You can't move! +Оглушение! Вы не можете пошевелиться! +Your vision is impaired! +Ваш обзор ухудшился! +Arms are bound! +Ваши руки связаны! +Hands are useless! +Ваши руки бесполезны! +Hands are impaired! Some tasks will be harder... +Вам трудно управлять руками! Некоторые действия станут сложнее... +Slow Level 2: Movement significantly impaired! +Ур. замедления 2: Движение ощутимо затруднено! +Slow Level 1: Movement slightly impaired. +Ур. замедления 1: Движение слегка затруднено. +Slow Level 3: Movement severely impaired! +Ур. замедления 3: Движение серьезно затруднено! +Slow Level 4+: Movement is almost impossible. Sprinting and hopping are disabled. +Ур. замедления 4+: Передвижение практически невозможно. Спринт и прыжки недоступны. +Slow Level 10+: Immobilized! +Ур. замедления 10+: Обездвиживание! +Your mouth is free for potion-drinking and spellcasting activities. +Ваш рот свободен для питья зелий и колдовства. +Your vision is clear. +Ваше зрение не затруднено. +Your hands are unobstructed. +Ваши руки свободны. +Your arms are free to move as you please. +Ваши руки свободны двигаться так, как вам заблагорассудится. +Your legs are free and unimpeded. +Ваши ноги свободны и ничем не стеснены. +You are gagged! Verbal miscast chance is increased and your potions are less effective! +У вас во рту кляп! Вероятность словесной осечки увеличивается, и ваши зелья становятся менее эффективными! +Your mouth is totally filled! You can't drink potions and cant cast verbal spells! +Ваш рот полностью заполнен! Вы не можете пить зелья и произносить словесные заклинания! +Spell Empowerment! +Усиление Заклинания! +Let there be light! +Да будет свет! +You're seeing things... +Вам мерещится странное... +You've been poisoned! +Вы отравлены! +-50% MP Cost (Latex) +-50% затраты MP (Латекс) +-50% MP Cost (Leather) +-50% затраты MP (Кожа) +-50% MP Cost (Metal) +-50% затраты MP (Метал) +-50% MP Cost (Rope) +-50% затраты MP (Верёвки) +Regeneration +Регенерация +-50% MP Cost (Elements) +-50% затраты MP (Стихии) +-50% MP Cost (Conjuration) +-50% затраты MP (Сотворение) +-50% MP Cost (Illusion) +-50% затраты MP (Иллюзии) +Conductive: When you or an enemy takes electric damage, the other takes half of it as well! +Проводник: Когда вы или враг получаете электрический урон, другой также получает половину этого урона! +Lightning Rod: Gain significantly boosted electric resist. +Громоотвод: Значительно увеличенное электрическое сопротивление. +Drenched: Grants fire resist, ice/electric weakness, and makes you conductive. +Промокшая: Увеличивает сопротивление огню, но также накладывает слабость ко льду/электричеству и делает вас Проводником. +Chilled: The cold makes it hard to move! You are slowed. +Замерзшая: Из-за холода вам трудно двигаться! Вы замедлены. +Slimed: It's sticky and dense! You are slowed and 30% more vulnerable to glue damage. +В слизи: Она липка и плотная! Вы замедлены на 30% и более уязвимы к урону от слизи. +Unsteady: You're on loose footing. You are easier to hit and are slowed. +Неустойчивая: вы находитесь на шаткой поверхности. По вам легче попасть, и вы замедляетесь. +Unsteady: You're on loose footing. You are easier to hit and are slowed. +Неустойчивая: вы находитесь на шаткой поверхности. По вам легче попасть, и вы замедляетесь. +Ignore Ice Tiles +Игнорировать ледяные плитки +Ignited: You are dealing fire damage to yourself and nearby enemies! +Воспламенение: Вы наносите огненный урон себе и ближайшим врагам! +You are on fire and taking damage! +Вы в огне и получаете урон! +Divine Punishment: Deals bonus damage when you hit an enemy. +Божественное наказание: Наносит дополнительный урон при ударе по врагу. +Divine Protection: Automatically blocks the next 3 times an enemy tries to bind you. +Божественная защита: Автоматически блокирует следующие 3 попытки врага сковать вас. +Divine Cunning: You turn invisible briefly after attacking. +Божественная хитрость: После атаки вы ненадолго становитесь невидимыми. +-MP Cost (Fire) +Затраты MP уменьшены (Огонь) +-MP Cost (Air) +Затраты MP уменьшены (Воздух) +-MP Cost (Water) +Затраты MP уменьшены (Вода) +-MP Cost (Earth) +Затраты MP уменьшены (Земля) +Slime Form: You gain bonuses and can slip through bars! +Форма Слайма: Вы получаете бонусы и можете проскользнуть сквозь прутья! +Shroud: Visibility decreased, evasion increased. +Пелена: Заметность уменьшена, уклонение увеличено. +Camoflage: While next to a wall, you are very hard to see. +Камуфляж: Когда вы находитесь рядом со стеной, вас очень трудно разглядеть. +Stone Skin: Increased armor. +Каменная кожа: Броня увеличена. +Darkblade: Increased damage. +Темный клинок: Урон увеличен. +Runic Ward: Increased Magic Armor. +Руническая защита: Увеличена Магическая Защита. +Great Invisibility: It is impossible for enemies to see you. +Великая Невидимость: Враги не могут вас увидеть. +Invisibility: It is very difficult for enemies to see you. +Невидимость: Врагам очень трудно вас увидеть. +Lesser Invisibility: It is harder for enemies to see you. +Слабая невидимость: Врагам труднее вас увидеть. +FULL POWER: Cutting power increased. +ПОЛНАЯ СИЛА: Сила разрезания увеличена. +Graceful: Struggling power increased. +Грациозность: Увеличена эффективность борьбы. +Iron Blood: Reduced melee cost, increased mana costs. +Железная кровь: Снижены затраты выносливости в ближнем бою, увеличены затраты маны. +Sleepy: You are sluggish and have a hard time keeping your eyes open. +Сонливость: Вы чувствуете вялость, и вам трудно держать глаза открытыми. +Afterimage: Evasion greatly increased. +Остаточное изображение: Уклонение значительно увеличено. +We did it! We made ourselves invisible--mmmmph!!! +Мы сделали это! Мы сделали себя невидимыми--ммммфх!!! +You are not currently attempting to disguise yourself. Click to reenable. +В данный момент вы не пытаетесь маскироваться. Нажмите, активировать заново. +Your restraints are disenchanted, treating them as nonmagical for purposes of cutting. +Зачарование с ограничителей снято, теперь вы можете разрезать их как не-зачарованные. +You can launch another leather restraint instantly! +Вы можете мгновенно запустить еще один кожаный ограничитель! +You can launch another Sagitta instantly! +Вы можете мгновенно запустить еще одну Сагитту! +You have stored willpower. +У вас есть сохраненная сила воли. +You have consumed a mote of essence, granting miscast chance reduction. +Вы израсходовали частицу сущности, что снижает вероятность осечки. +You recapture an essence mote and concentrate on its essence! +Вы возвращаете частицу сущности и концентрируетесь на ее существе! +Choose an essence mote to absorb. +Выберите частицу сущности для поглощения. +Locked Down: Struggling power is greatly reduced. +Заблокировано: Эффективность борьбы значительно снижена. +Locked Down: Struggling power is greatly reduced. +Заблокировано: Эффективность борьбы значительно снижена. +Verbose: You can cast verbal spells while gagged. +Говорун: Вы можете произносить словесные заклинания с кляпом во рту. +Dextrous: You can cast arm spells while tied up. +Ловкач: Вы можете выпускать жестовые заклинания со связанными руками +Spell Dance: You can cast leg spells while tied up. +Магический танцор: Вы можете выпускать танцорные заклинания со связанными ногами. +Bondage Buster: Lazor is charging... +Бондаж-бластер: Лазер заряжается... +Katana: Patience is key... +Катана: Главное это терпение... +Stormbreaker: You have the Power. +Разрушитель бурь: У вас есть Сила. +Game Setup: +Настройки игры: +Beginner: Get a save code every 3 levels, autosave after each floor +Новичок: Получайте код сохранения каждые 3 уровня, автосохранение послед каждого этажа +Roguelike: No save codes, only autosave +Рогалик: Никаких кодов сохранения, только автосохранение +Exciting: Orbs give random spells +Волнение: Сферы дают случайные заклинания +Kinky: No save codes, orbs give random spells, start with very little +Извращение: Нет кодов сохранения, шары дают случайные заклинания, начинайте с меньшего +Journal +Записки +Change Outfit +Сменить наряд +Reset to Default +Сбросить наряд +Outfit Code +Код наряда +Confirm Reset? +Подтвердить сброс? +(Your game has been saved) +(Игра была сохранена) +(Copy the code above and save it on your computer to backup) +(Скопируйте код выше и сохраните его на своем компьютере для бэкапа) +Continue... +Продолжить... +Menu +Меню +I will simply wait to see what happens. +Я просто подожду и посмотрю, что произойдет. +Save my current progress. +Сохранить текущий прогресс. +Give up & delete save +Сдаться & Удалить сохранение +Yes, delete my save file! +Да, удалить файл сохранения! +Actually, I will let the enemy capture me instead. +Я хочу позволить врагам взять меня в плен. +Yes, jail me! +Да, схватите меня! +No, I wish to press on +Продолжить игру +See Perks +Список перков +This chest belongs to the FACTION +Этот сундук принадлежит FACTION +This belongs to the FACTION +Это принадлежит FACTION +Devious Dungeon Challenge is enabled. +Испытание Коварного Подземелья включено +Waiting for game data... +Ожидание игровых данных (data)... +You have reached the end of the playable portion. +Вы дошли до конца доступного контента. +Come back later for new dungeons! +Приходите позже за новыми подземельями! +Got the keys! Find the stairs to go to the next floor. +Вы нашли ключ! Найдите лестницу, чтобы спуститься на следующий этаж. +You haven't found the keys for this floor yet. +Вы ещё не нашли ключи на этом этаже. +Missing key +Отсутствует ключ +You are protected from damage and can't be bound until the shield is broken! +Вы защищены от урона и не можете быть связаны до тех пор, пока щит не будет сломан! +Chance for a spell to fizzle: +Шанс провала заклинания: +Dodge Chance: Percent%, based on EVASIONSUM Evasion and EVASIONPENALTY% penalty. +Шанс уклонения: Percent%, основываясь на EVASIONSUM Уклонения и EVASIONPENALTY% штрафа. +Block Chance: Percent%, based on BLOCKSUM Block and BLOCKPENALTY% penalty. +Шанс блока: Percent%, основываясь на BLOCKSUM Блока и BLOCKPENALTY% штрафа. +Chance to resist a level 10 restraint: AMNT1%, based on AMNT2 Bondage Resist and RESBLKPENALTY penalty. +Шанс на сопротивление ограничителю 10-го уровня: AMNT1%, основываясь на AMNT2 Сопротивления Сковыванию и RESBLKPENALTY штрафу. +Sight Range: RADIUS +Видимость: RADIUS +Speed: SPD +Скорость: SPD +Normal +Всё нормально +Stunned! +Ошеломление! +Slowed +Замедление +Very Slow +Сильное Замедление +Immobile +Обездвиживание +### DP: PERCENT% + +DP: CURRENT/MAX (PERCENT% Desire) +DP: CURRENT/MAX (PERCENT% Желание) +### SP: CURRENT/MAX + +Willpower: CURRENT/MAX +Сила воли: CURRENT/MAX +### MP: CURRENT/MAX + +Mana slowly recovers from a pool equal to POOLMANA. Drink potions to restore the pool. +Мана медленно восстанавливается из резерва, равного POOLMANA. Пейте зелья, чтобы восстановить резерв. +Your Desire is the baseline Distraction you decay toward, and is increased by distracting things. +Ваше Желание определяет базовое Возбуждение, к которому то стремится. Оно усиливается за счет возбуждающих вещей. +Stamina recovers more quickly when you aren't spending it. +Выносливость восстанавливается быстрее, когда вы её не расходуете. +Willpower is restored by food, sleep, and potions. Without willpower, it becomes very difficult to escape. +Сила воли восстанавливается с помощью еды, сна и зелий. Освободиться без силы воли становится куда сложнее. +Charge is used to power various magic items and weapons. +Заряд используется для усиления различных магических предметов и оружия. +### WP: CURRENT/MAX + +Charge: PERCENT +Заряд: PERCENT +Use Potion +Выпить зелье +### MP + +Go to sleep +Спать +Call for help! +Позвать на помощь! +Play with yourself +Поиграть с собой +Let go... +Кончить... +Let go... +Кончить... +Play with yourself +Поиграть с собой +Go to sleep +Спать +Call for Help!!! +Позвать на помощь!!! +Wait until interrupted +Ждать, пока вас не прервут +Auto-struggle +Авто-борьба +Auto-path +Авто-путь +Quick-Swap Weapon +Быстрая смена оружия +Inspect +Осмотреть +Pass NPCs +Проходить мимо NPC +Interact +Взаимодействовать +Sprint/Hop +Спринт/Прыжок +Crouch +Присесть +~ah~ +~ах~ +~mmm~ +~ммм~ +~ngh~ +~угх~ +~oh~ +~ох~ +(Heavy breathing) +(Тяжелое дыхание) +(Soft moaning) +(Тихие стоны) +(Incoherent mumbling) +(Бессвязное бормотание) +(Loud moans) +(Громкие стоны) +(Deep breaths) +(Глубокое дыхание) +(Uncontrollable moaning) +(Неконтролируемые стоны) +(Horny noises) +(Похотливые звуки) +~mm~ +~мм~ +~mmph~ +~ммфх~ +~nnn~ +~ннн~ +~mmmmm~ +~ммммм~ +(Heavy breathing) +(Тяжелое дыхание) +(Soft moaning) +(Тихие стоны) +(Incoherent mumbling) +(Бессвязное бормотание) +(Loud moans) +(Громкие стоны) +(Deep breaths) +(Глубокое дыхание) +(Uncontrollable moaning) +(Неконтролируемые стоны) +(Horny noises) +(Похотливые звуки) +You wait. +Вы ждёте. +You wait, legs trembling with arousal. +Вы ждёте, ваши ноги подрагивают от возбуждения. +You wait, trembling and moaning. +Вы ждёте, дрожа и постанывая. +You wait to regain your strength. +Вы ждёте восстановления своих сил. +You wait to regain your composure, panting with frustration. +Задыхаясь от разочарования, вы ждёте, пока к вам вернется самообладание. +You wait to regain your composure, shaking with frustration. +Дрожа от разочарования, вы ждёте, пока к вам вернется самообладание. +You are exhausted from spellcasting. +Вы устали от колдовства. +You are feeling tired. +Вы чувствуете усталость. +You feel exhausted... +Вы чувствуете, что выдохлись... +You feel like you are going to pass out... +Вы чувствуете, что вот-вот потеряете сознание... +Start New Game +Начать новую игру +New Game+ +Новая игра+ +Continue Last Save +Продолжить с последнего сохр. +Load Saved Game +Загрузить из сохранения +Save Outfit (overwrite!) +Сохранить наряд (перезапись!) +Save Outfit (Clothes Only!) +Сохранить наряд (Только одежда!) +Save Keybindings +Сохранить привязку клавиш +Cancel Changes +Отменить изменения +Return +Назад +Keybindings +Управление +Game Options +Настройки +Load from code +Загрузить с помощью кода +Back to main menu +Вернуться в главное меню +Load Mod .zip +Загрузить .zip модификации +Delete Mod +Удалить модификацию +Clear Perks +Очистить перки +Config +Пресет +Cancel +Отмена +Filter +Фильтр +DANGER: Loading a mod will execute ARBITRARY CODE on your machine. +ВНИМАНИЕ: Загрузка мода приведет к выполнению ЧУЖОГО КОДА на вашем устройстве. +Like connecting to a server, etc. Only load mods from a TRUSTED source. +К примеру, подключению к серверу, и т.п. Загружайте моды только из НАДЕЖНЫХ источников. +Up +Вверх +Down +Вниз +Left +Влево +Right +Вправо +Up Left +Вверх-влево +Up Right +Вверх-вправо +Down Left +Вниз-влево +Down Right +Вниз-вправо +Spell 1 +Заклинание 1 +Spell 2 +Заклинание 2 +Spell 3 +Заклинание 3 +Spell 4 +Заклинание 4 +Spell 5 +Заклинание 5 +Spell 6 +Заклинание 6 +Spell 7 +Заклинание 7 +Spell 8 +Заклинание 8 +Spell 9 +Заклинание 9 +Spell 10 +Заклинание 10 +Load Hotbar 1 +Загрузить быструю панель 1 +Load Hotbar 2 +Загрузить быструю панель 2 +Load Hotbar 3 +Загрузить быструю панель 3 +Load Loadout 1 +Применить экипировку 1 +Load Loadout 2 +Применить экипировку 2 +Load Loadout 3 +Применить экипировку 3 +Cycle Spell Page +Следующая страница заклинаний +Upcast Spells +Усилить заклинания +Cancel Upcast +Отменить усиление закл. +Swap Weapon 1 +Сменить оружие (1) +Swap Weapon 2 +Сменить оружие (2) +Swap Weapon 3 +Сменить оружие (3) +Swap Weapon 4 +Сменить оружие (4) +Weapon Ability +Способность оружия +Wait +Ждать +Cancel/Back +Отмена/Назад +Enter +Войти +Inspect +Осмотреть +Expand Minimap +Развернуть миникарту +Zoom Out +Зум дальше +Zoom In +Зум ближе +Wait till Interrupted +Ждать, пока вас не прервут +Make Noise +Издать шум +Crouch +Присесть +Play with Self +Поиграть с собой +Message Log +Игровой лог +Interact +Взаимодействовать +Pass thru allies +Проходить через союзников +Auto-Struggle +Автор-борьба +Auto-Pathfind +Авто-путь +Sprint/Hop +Спринт/Прыжок +Inspect +Осмотреть +Hide Bullets +Скрыть пули +Quick Inventory +Быстрый инвентарь +Inventory +Инвентарь +Reputation +Репутация +Journey Map +Карта путешествия +Quests +Задания +Spell List +Список заклинаний +Journal +Журнал +Pause Menu +Меню паузы +Facilities +Предприятия +Current Key Pressed +В данный момент нажато +Press a key, then press a button to set that key +Нажмите клавишу, а потом выберите функцию, которую хотите на неё назначить +Floor FLOORNUMBER: DUNGEONNAME +Этаж FLOORNUMBER: DUNGEONNAME +Lockpicks: +Отмычки: +Keys: +Ключи: +Magic Keys: +Магические ключи: +Knife: +Ножи: +Mag. Knife: +Маг. ножи: +You climb down the stairs. The passage closes behind you. +Вы спускаетесь по лестнице, а проход закрывается за вами. +You climb back up the stairs. +Вы поднимаетесь обратно по лестнице. +You can't climb down until you get out of this leash... +Вы не сможешь спуститься вниз, пока не освободитесь от поводка... +You climb down and find yourself in a strange new place. +Вы спускаетесь вниз и оказываетесь в новом, незнакомом месте. + plus XXX + +XXX +Graveyard +Кладбище +Catacombs +Катакомбы +Overgrown Ruins +Заросшие руины +Lost Temple +Затерянный храм +The Bellows +Сильфоны +Rundown Laboratory +Захудалая лаборатория +Forgotten Garden +Забытый сад +Coastal Grotto +Прибрежный грот +Kingdom of Ice +Королевство льда +The Mansion +Особняк +Ancient Tombs +Древние катакомбы +Magic Library +Магическая библиотека +Crystal Cave +Кристальная пещера +Cavern +Каверна +Orrery +Планетарий +Training Center +Тренировочный центр +Rubber Facility +Резиновый комплекс +Wizards' Den +Логово магов +Marble Halls +Мраморные залы +Doll Storage +Хранилище кукол +Processing +Фабрика +Processing +Фабрика +Bandit Hideout +Убежище бандитов +Ancient Vault +Древний склеп +Ancient Halls +Древние залы +Slave Market +Рынок рабов +Elevator Hall +Зал с лифтами +Dark Passageway +Темные галереи +Caldera Beach +Пляж кальдеры +Temple of Air +Храм воздуха +Temple of Fire +Храм огня +Temple of Water +Храм воды +Temple of Ice +Храм льда +Temple of Storms +Храм шторма +Temple of Earth +Храм земли +The Edge of Reality +Грань реальности +The Edge of Reality +Грань реальности +Dark Dimension +Темное измерение +Lair +Логово +You search through the debris but find nothing of note +Вы роетесь в мусоре, но не находите ничего примечательного +You find some gold coins in a corner (+XXX gold) +В уголке вы находите несколько золотых (+XXX золота) +You find a lockpick in a crack between the tiles +Вы находите отмычку в щели между плитами +You find a rusty knife among the rocks +Среди камней вы находите ржавый нож +You find an ordinary key +Вы находите обычный ключ +You find a blue key, glowing with magic +Вы находите синий ключ, светящийся от магии +You find a bola, crafted by bandits +Вы находите болас, изготовленный бандитами +You find some unexploded ordnance. +Вы находите несколько неразорвавшихся боеприпасов. +You find a key lying atop an open tome! +Вы находите ключ, лежащий поверх открытого тома! +You find a magical key lying atop an open tome! +Вы находите магический ключ, лежащий поверх открытого тома! +You find a useful scroll wedged between some treatises! +Вы находите полезный свиток, втиснутый между трактатами! +You find a glowing book containing a binding spell! +Вы находите светящуюся книгу, содержащую связывающее заклинание! +You discover a golden cookie, wrapped in foil. Beside it are two power crystals. +Вы обнаруживаете золотистое печенье, завернутое в фольгу. Рядом с ним находятся два энергетических кристалла. +You find a golden key surrounded by strange golden crystals. +Вы находите золотой ключ, окруженный странными золотыми кристаллами. +You find a set of strange golden crystals. +Вы находите набор странных золотых кристаллов. +You find a pack of scrolls used for spellcasting, and some strange golden crystals. +Вы находите пачку свитков для заклинателей, и несколько странных золотых кристаллов. +You find a pack of scrolls used for spellcasting. +Вы находите пачку свитков для заклинателей. +You find a glowing scroll of purity. +Вы находите светящийся свиток чистоты. +The chest contains gold! (+XXX gold) +В сундуке нашлось золото! (+XXX золота) +The chest contains a glowing magical knife! +В сундуке нашелся светящийся магический нож! +The chest contains a keyring with a glowing magic key! +В сундуке нашелся брелок со светящимся магическим ключом! +Someone left their keys here... +Кто-то оставил здесь свои ключи... +You found some bolas left by bandits. +Вы нашли несколько боласов, оставленных бандитами. +You found some high explosives! +Вы нашли взрывчатку! +You find a magic scroll, which you place in your spellbook. (+SpellLearned) +Вы находите волшебный свиток, который помещаете в свою книгу заклинаний. (+SpellLearned) +You find an orb containing magical knowledge! (+AMOUNT spell points) +Вы находите сферу, содержащую магические знания! (+AMOUNT очков способностей) +You find a weapon! (+WeaponAcquired) +Вы нашли оружие! (+WeaponAcquired) +You find a wearable item! (+ArmorAcquired) +Вы нашли экипировку! (+ArmorAcquired) +You find gold and a magic trap! (+RestraintType) (+XXX gold) +Вы нашли золото и магическую ловушку! (+RestraintType) (+XXX золота) +Swirling belts emerge from the chest and leave you bound! (+RestraintType) +Вихрь ремней вырывается из сундука, и вы оказываетесь связанными! (+RestraintType) +You find gold and a chastity belt that locks around your waist! (+RestraintType) (+XXX gold) +Вы находите золото и пояс целомудрия, который застегивается на вашей талии! (+RestraintType) (+XXX золта) +You find gold and a tormenting magical trap! (+RestraintType) (+XXX gold) +Вы находите золото и мучительную магическую ловушку! (+RestraintType) (+XXX золота) +You find gold, plus a filling and tormenting magical trap! (+RestraintType) (+XXX gold) +Вы находите золото, а также наполняющую и мучительную магическую ловушку! (+RestraintType) (+XXX золота) +You find gold, plus a devious magical trap! (+RestraintType) (+XXX gold) +Вы находите золото, а также коварную магическую ловушку! (+RestraintType) (+XXX золота) +Magical runes glow as a trap activates inside the chest! +Магические руны вспыхивают, когда внутри сундука активируется ловушка! +You find a special collar that lets you absorb energy from potions. +Вы находите специальный ошейник, который позволяет вам напрямую поглощать энергию из зелий. +You find a pair of garish pink high heels with a slippery surface. +Вы находите пару ярко-розовых ботинок на высоких каблуках со скользкой подошвой. +You find a special gag with a feather duster. +Вы находите специальный кляп с метелкой из перьев для очистки от пыли. +You find a gas mask suitable for filtering gases. +Вы находите противогаз, подходящий для фильтрации газов. +The pearly chest contains a divine gift! (+ITEMGET) +Блестящий сундучок хранит в себе божественный дар! (+ITEMGET) +Smoke fills the air around you! +Вокруг вас распространяется дым! +You find a magical necklace that seems to concentrate magic. +Вы находите волшебное ожерелье, в котором, кажется, сконцентрировалась магия. +You recover some of your lost items! +Вы возвращаете некоторые из своих потерянных вещей! +You find a red potion with a sweet scent. +Вы находите красное зелье со сладким ароматом. +You find a blue potion that glows with magical essence. +Вы находите синее зелье, которое светится из-за магической энергии. +You find a glowing orb, filled with untapped mana. +Вы находите светящийся шар, наполненный свежей маной. +You find three mana orbs strung together! +Вы находите три шара маны, соединенные вместе! +You find several willpower potions. +Вы найдете несколько зелий для восстановления Силы Воли. +You find several mana potions. +Вы находите несколько зелий маны. +You find a green potion, glowing warm with energy. +Вы находите зеленое зелье, содержащее концентрированную энергию. +You find a snow-like potion that's cold to the touch. +Вы находите белое как снег зелье, которое очень холодное на ощупь. +You find a medley of potions. +Вы находите смесь зелий. +Rarity: +Редкость: +Lesser +Мусор +Common +Обычное +Uncommon +Необычное +Rare +Редкое +Very Rare +Очень редкое +Epic +Эпическое +Legendary +Легендарное +Supreme +Наследное +Mythic +Мифическое +Angelic +Ангельское +Divine +Божественное +Quantity: +Количество: +Use One +Использовать 1 +way of the fist +путь кулака +Lockpick +Отмычка +Exit Keys +Ключ от выхода +Adventurer's Outfit +Одежда авантюристки +Your favorite outfit for adventuring. +Ваш любимый наряд для приключений. +Your original outfit. No bonuses, no penalties. +Ваша обычная одежда. Без бонусов, без штрафов. +Tactical Catsuit +Тактический комбинезон +A sleek catsuit worn by stealth operatives. No frills, no nonsense. +Элегантный комбинезон, который носят оперативники-невидимки. Никаких излишеств, ничего шокирующего. +Increases stealth by 10% in the dark. +Увеличивает скрытность в темноте на 10%. +Jail Uniform +Тюремная униформа +The prisoners are kept in revealing outfits to keep them from hiding things. +Заключенных содержат в откровенной одежде, чтобы они ничего не смогли спрятать. +Designed to make it hard to conceal weapons. Makes you more visible and vulnerable to the cold. +Разработана для того, чтобы затруднить сокрытие оружия. Делает вас более заметной и уязвимой к холоду. +Wolfgirl Suit +Костюм Волчицы +An advanced suit designed for sport, breathable and also warm. +Усовершенствованный костюм, предназначенный для занятий спортом, дышащий и в то же время теплый. +Made of latex. Resistant to electricity but does not insulate well. +Изготовлен из латекса. Устойчив к воздействию электричества, но в остальной защите весьма плох. +Maid Uniform +Униформа горничной +An elegant dress meant to denote a maid's status. +Элегантное платье, призванное подчеркнуть статус горничной. +Massively increases accuracy against slime mold. +Значительно повышает точность в сражении со слаймами. +Harem Outfit +Гаремные одежды +A skimpy outfit with antiquated connotations. +Откровенный наряд с устаревшими мотивами. +Harkening back to an old era. +Воспоминание о старой эпохе. +Combat Bikini +Боевое бикини +A minimalist albeit chilly outfit designed for ease of use. +Минималистичный наряд, созданный ради простоты использования. В нём может быть очень холодно. +Or perhaps it's just sexy... +Или, возможно, это просто сексуально... +Lingerie +Женское белье +A minimalist yet aesthetically pleasing outfit. +Минималистичный, но эстетичный наряд. +No bonuses. +Бонусов нет. +Maid Uniform +Униформа горничной +An elegant dress meant to denote a maid's status. +Элегантное платье, призванное подчеркнуть статус горничной. +Massively increases accuracy against slime mold. +Значительно повышает точность в сражении со слаймами. +Dragonheart Uniform +Униформа драконьего сердца +The uniform of choice for dragonheart of all ranks. +Униформа, которую выбирают все члены Драконьего Сердца. +It's made of fire-resistant leather, and provides +5 armor. +Она сделана из огнеупорной кожи и дает +5 брони. +Scientific Uniform +Научная униформа +An outfit designed to leave little to the imagination. +Наряд, созданный таким образом, чтобы не давать простора воображению. +Resistant to electricity but does not insulate well. Provides significant acid and glue protection for scientific purposes. +Устойчив к воздействию электричества, но плох в изоляции. Обеспечивает значительную защиту от кислоты и клея в научных целях. +Latex Catsuit +Латексный комбинезон +An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. +Наряд, сделанный из прошедшей обработку слизи. Из-за материала он очень гладкий на ощупь. +Resistant to electricity but does not insulate well. Provides significant acid and glue protection for scientific purposes. +Устойчив к воздействию электричества, но плох в изоляции. Обеспечивает значительную защиту от кислоты и клея в научных целях. +Doll Catsuit +Кукольный комбинезон +An outfit made from heavily processed slime. It is naturally silky and smooth to the touch. +Наряд, сделанный из прошедшей обработку слизи. Из-за материала он очень гладкий на ощупь. +Resistant to electricity but does not insulate well. +Устойчив к воздействию электричества, но в остальной защите весьма плох. +Cyber Doll Suit +Костюм Кибер-Куклы +A technologically advanced suit designed for long term wear. Despite being watertight and skintight it has cleaning and ventilation ports that plug directly into doll storage fixtures. +Технологически продвинутый костюм, предназначенный для длительного ношения. Несмотря на то, что он водонепроницаем и плотно прилегает к коже, в нем есть отверстия для чистки и вентиляции, которые подключаются к приспособлениям в кукольном хранилище. +Resistant to electricity but does not insulate well. +Устойчив к воздействию электричества, но в остальной защите весьма плох. +Shadow Latex Dress +Теневое латексное платье +A minidress made from shadow latex, a favorite of otherwordly patrons. +Мини-платье из теневого латекса. Любимое платье покровителей из потустороннего мира. +Resistant to the elements, but is infused with crystals that amplify psychic damage to yourself. +Устойчиво к воздействию стихий, но заряжено кристаллами, которые усиливают получаемый вами Психический урон. +Elemental Slave Dress +Платье рабыни стихий +A minidress made to adorn mortal slaves in the elemental planes. +Мини-платье, созданное для украшения смертных рабынь в измерениях стихий. +Resistant to the elements, but is infused with crystals that amplify psychic damage to yourself. +Устойчиво к воздействию стихий, но заряжено кристаллами, которые усиливают получаемый вами Психический урон. +Elven Dress +Эльфийское платье +A regal minidress worn by visitors to the forest. +Царственное мини-платье, которое одевают посетители леса. +Not very good at insulating you from the cold or from touchy fingers. Its elven aura improves accuracy and evasion by +10. +Не очень хорошо защищает вас от холода или прикосновения пальцев. Но его эльфийская аура повышает точность и уклонение на +10. +Scroll of Sleight +Свиток ловкости +The scroll makes your memories of arm movements clear as day! +Свиток делает ваши воспоминания о свободных руках ясными, будто бы это было вчера! +A scroll used by thieves to make their plays in secret. +Свиток, используемый ворами для их воровских игрищ. +Allows you to cast Arm spells without components for 12 turns. +Позволяет применять жестовые заклинания без рук в течение 12 ходов. +Scroll of Purity +Свиток чистоты +The scroll circles around your body and you feel... empty now. +Свиток вращается вокруг вашего тела, и вы чувствуете... пустоту. +A scroll used to enforce chastity within religious orders. +Свиток, используемый в религиозных орденах для соблюдения целомудрия. +Removes all vibrators from your body. +Удаляет все вибраторы из вашего тела. +Scroll of Speech +Свиток красноречия +The scroll makes your gagged speech slightly more intelligible! +Свиток делает вашу речь с кляпом во рту немного более разборчивой! +A scroll used to help translate different languages. +Свиток, используемый для перевода слов на разные языки. +Allows you to cast Verbal spells without components for 12 turns. +Позволяет применять словесные заклинания без их произношения в течение 12 ходов. +Scroll of Sauntering +Свиток легкой прогулки +The scroll lets you move your body in swift and accurate ways! +Свиток позволяет вам быстро и точно двигать своим телом! +A scroll used by dancers to upgrade their moves. +Свиток, используемый танцорами для улучшения своих движений. +Allows you to cast Leg spells without components for 12 turns. +Позволяет применять танцорные заклинания со связанными ногами в течение 12 ходов. +Ancient Key +Древний ключ +Perhaps it has something to do with ancient restraints? +Возможно, он как-то связан с древними ограничениями? +An ancient key plated in gold. It doesnt look like it can open anything... +Старинный ключ, покрытый золотом. Не похоже, что он может что-то открыть... +You pick up a shining golden key. +Вы подбираете блестящий золотой ключик. +You pick up a ReplaceValue. +Вы подбираете ReplaceValue. +Power Crystal +Энергетический кристалл +You hold the crystal and the power flows into you. +Вы сжимаете кристалл, и в вас вливается сила. +You're not sure how they charged these... +Вы не знаете точно, как они их заряжали... +A mysterious device used by the old civilization, powering their ancient devices. +Таинственное устройство, используемое древней цивилизацией. Приводит в действие их древние устройства. +You are already full of ancient power. +Вы уже полный древней силы. +Spent Power Crystal +Пустой энергетический кристалл +You touch the spent crystal and it siphons 100 gold from your bag! +Вы прикасаетесь к пустому кристаллу, и он выкачивает 100 золотых из вашей сумки! +You are not sure how to charge this back up. +Вы не знаете точно, как зарядить его вновь. +You're not sure how they charged these... +Вы не знаете точно, как они их заряжали... +A mysterious device used by the old civilization, now depleted. +Таинственное устройство, использовавшееся древней цивилизацией, ныне разряженное. +Gold +Золото +Key +Ключ +A key. You wonder who it's for? +Ключ. Вам интересно, для кого это? +Can be used to unlock one simple or standard-locked restraint, door, or chest. +Может использоваться для отпирания одного простого или стандартного замка на ограничителе, двери или сундука. +Magic Key +Магический ключ +A glowing key enchanted with magic that fades with one use. +Зачарованный светящийся ключ, который исчезает при использовании. +Can be used to unlock a runic lock. +Может использоваться для отпирания рунического замка. +Magic Key +Магический ключ +A magical key with the power to open blue locks. +Волшебный ключ, способный открывать синие замки. +Blue locks can't be otherwise picked. +Синие замки не поддаются взлому. +Magic Knife +Магический нож +A magical blade, suitable against ghosts. +Волшебный клинок, предназначенный для борьбы с призраками. +Deals shadow damage. Can cut enchanted ropes. Offhand: Increase base crit of all magic damage by 20% +Наносит урон тьмой. Может перерезать зачарованные веревки. В левой руке: Увеличивает базовый критический показатель всего магического урона на 20%. +Bola +Болас +A pair of weights attached to a rope. Can be thrown. +Пара грузиков, прикрепленных к веревке. Можно метать. +Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. +Применяет 90 очков сковывания, наносит 40 цепного урона, и обездвиживает цель на 4 хода. +A pair of weights attached to a rope. Can be thrown. +Пара грузиков, прикрепленных к веревке. Можно метать. +Deals 90 points of binding, 40 chain damage, and rooting a target for 4 turns. +Применяет 90 очков сковывания, наносит 40 цепного урона, и обездвиживает цель на 4 хода. +Bomb +Бомба +After a 5 turn fuse, deals 100 blast damage in a 3x3 area. +Спустя 5 ходов взрывается, нанося 100 взрывного урона в области 3x3. +Not a toy! +Не игрушка! +After a 5 turn fuse, deals 100 blast damage in a 3x3 area. +Спустя 5 ходов взрывается, нанося 100 взрывного урона в области 3x3. +Not a toy! +Не игрушка! +You light the fuse! +Вы подожгли фитиль! +Knife +Нож +Lockpick +Отмычка +A tool used to pick locks. +Инструмент, используемый для вскрытия замков. +Doesn't last forever, but can help in a pinch. +Её прочность не бесконечна, но она может помочь в крайнем случае. +Lockpick +Отмычка +A tool used to pick locks. +Инструмент, используемый для вскрытия замков. +Doesn't last forever, but can help in a pinch. +Её прочность не бесконечна, но она может помочь в крайнем случае. +lockpick x2 +Отмычки x2 +lockpicks x4 +Отмычки x4 +Bola x3 +Болас x3 +Bomb x3 +Бомба x3 +Dynamite x2 +Динамит x2 +Plastic Explosive x2 +Пластичная взрывчатка х2 +Mana Potion +Зелье Маны +You sip the mana potion and feel empowered. +Вы выпиваете зелье маны и чувствуете прилив энергии. +A rare essence used by mages to recover their strength. +Редкое зелье, используемая магами для восстановления своих сил. +Restores 50% max MP instantly. Excess mana goes into the mana pool. +Мгновенно восстанавливает 50% максимальной Маны. Избыток маны поступает в резерв. +Mana Orb +Шар Маны +You clutch the mana orb and feel its energy. +Вы сжимаете шар маны и чувствуете энергию внутри него. +Mystical energies swirl inside a glass form. +Внутри стеклянной оболочки клубятся мистические энергии. +Adds 200 MP to your mana pool. Requires no hands to use. +Добавляет 200 Маны к вашему резерву. Для использования не требуются руки. +Stamina Potion +Зелье Выносливости +You drink the stamina potion and feel invigorated. +Вы выпиваете зелье выносливости и чувствуете прилив сил. +A potion brimming with heat and energy. +Зелье, содержащее концентрированную энергию. +Restores 50% stamina and 250% more over 25 turns. Effect does not stack. +Восстанавливает 50% выносливости и увеличивает её регенерацию на 250% на 25 ходов. Эффект не складывается. +Willpower Potion +Зелье Силы Воли +You drink the willpower potion and feel motivated. +Вы пьете зелье силы воли и чувствуете прилив уверенности. +A sweet potion, brimming with determination. +Сладкое зелье, наполненное концентрированной решимостью. +Restores 25% willpower instantly. Can be used while gagged. +Мгновенно восстанавливает 25% Силы Воли. Можно использовать с кляпом во рту. +Frigid Potion +Охлаждающее зелье +You chug the concoction and your senses numb, helping you concentrate. +Вы выпиваете отвар большими глотками, и ваши ощущения притупляются, что помогает вам сосредоточиться. +Like bottled snow. Helps to get your mind on track. +Похоже на бутылку со снегом. Помогает направить мысли в нужное русло. +Reduces distraction to 0 and grants additional decay for 50 turns. Can be used while gagged. +Уменьшает Возбуждение до 0 и обеспечивает дополнительное охлаждение на 50 ходов. Можно использовать с кляпом во рту. +Smoke Bomb +Дымовая бомба +You toss the smoke bomb and it starts emitting a deep haze! +Вы бросаете дымовую бомбу, и она начинает испускать густой дым! +You ready a smoke bomb... +Вы подготавливаете дымовую бомбу... +A type of pyrotechnic often employed by saboteurs. Can be rolled and used without hands. +Разновидность пиротехники, часто используемой диверсантами. Может катиться и активироваться без помощи рук. +Creates a smoke screen lasting 8 turns. You are harder to see while inside the smoke. +Создает дымовую завесу на 8 ходов. Вас труднее разглядеть, пока вы находитесь внутри дыма. +Smoke Bomb x3 +Дымовая бомба х3 +A type of pyrotechnic often employed by saboteurs. Can be rolled and used without hands. +Разновидность пиротехники, часто используемой диверсантами. Может катиться и активироваться без помощи рук. +Creates a smoke screen lasting 8 turns. You are harder to see while inside the smoke. +Создает дымовую завесу на 8 ходов. Вас труднее разглядеть, пока вы находитесь внутри дыма. +Flash Bomb +Световая бомба +Flash Bomb x3 +Световая бомба х3 +Flashbang x3 +Светошумовая граната х3 +Smoke Bomb x3 +Дымовая бомба х3 +You toss the flash bomb and the fuse starts ticking... +Вы бросаете световую бомбу, и взрыватель начинает тикать... +You ready a flash bomb... +Вы подготавливаете световую бомбу... +A type of explosive used by agents. Blinds nearby targets without causing significant injury. +Разновидность взрывчатки, используемой агентами. Ослепляет близлежащие цели, не причиняя значительных травм. +Blinds for 20 turns in a 3x3 area. +Ослепляет на 20 ходов в зоне 3х3. +A type of explosive used by agents. Blinds nearby targets without causing significant injury. +Разновидность взрывчатки, используемой агентами. Ослепляет близлежащие цели, не причиняя значительных травм. +Blinds for 20 turns in a 3x3 area. +Ослепляет на 20 ходов в зоне 3х3. +Flashbang +Светошумовая граната +Flashbang x3 +Светошумовая граната х3 +You toss the flashbang and the fuse starts ticking... +Вы бросаете светошумовую гранату, и взрыватель начинает тикать... +Flashbang +Светошумовая граната +You ready a flashbang... +Вы подготавливаете светошумовую гранату... +A piece of rare special forces equipment. The secrets of its manufacture are strictly kept by the Alchemist's Guild. +Часть редчайшего снаряжения спецназовца. Секреты ее изготовления строго охраняются Гильдией Алхимиков. +Blinds for 24 turns in a 3x3 area. Also Slows and Silences them for half the duration. +Ослепляет на 24 хода в зоне 3х3. Также замедляет и накладывает немоту на половину времени действия. +A piece of rare special forces equipment. The secrets of its manufacture are strictly kept by the Alchemist's Guild. +Часть редчайшего снаряжения спецназовца. Секреты ее изготовления строго охраняются Гильдией Алхимиков. +Blinds for 24 turns in a 3x3 area. And also Slows and Silences them for half the duration. +Ослепляет на 24 хода в зоне 3х3. Также замедляет и накладывает немоту на половину времени действия. +Invisibility Potion +Зелье невидимости +You chug the concoction and see your body fading away. +Вы выпиваете отвар большими глотками и наблюдаете, как ваше тело исчезает. +You feel liquid inside, but you can't see it! +Вы чувствуете, что внутри есть жидкость, но не можете ее увидеть! +Casts Vanish on yourself. +Накладывает на вас Исчезновение. +Ectoplasm +Эктоплазма +Like a moisturizing cream, except it's made from coagulated souls. +Похоже на увлажняющий крем, за исключением того, что она сделана из коагулированных душ. +Can be used without hands. Just apply directly to the forehead! +Можно использовать без помощи рук. Просто нанесите себе на лоб! +Makes you harder to see for 10 turns. +Уменьшает вашу заметность на 10 ходов. +Earth Rune +Руна Земли +You smash the rune in front of you, and glowing rocks rise from the earth. +Вы разбиваете руну перед собой, и из земли поднимаются светящиеся камни. +It feels unsettling to look at. +Довольно тревожное зрелище. +Creates a 3x3 area of +20 armor centered on yourself for 9 turns. +Создает вокруг вас зону 3х3 на 9 ходов, которая повышает защиту на 20. +Water Rune +Руна Воды +You crush the rune in your hand, and it turns into water that coats the floor +Вы сжимаете руну в руке, и она превращается в воду, которая заливает пол +It feels slimmy. +Весьма скользкая на ощупь. +Creates a 3x3 area on you for 9 turns. Gives +30 Magic Armor to friendlies, halves enemy speed. +Создает вокруг вас зону 3х3 на 9 ходов, которая повышает магическую защиту вас и ваших союзников на 30, а также вдвое снижает скорость врагов. +Ice Rune +Руна Льда +You smash the rune in front of you, and icicles pierce through the floor! +Вы разбиваете руну перед собой, и пол насквозь пробивают сосульки. +It feels cold to the touch. +Очень холодная. +Creates icicles around you for 5-8 turns. They deal 40 damage and freeze for 3 turns. +Создает вокруг вас сосульки на 5-8 ходов. Они наносят 40 единиц урона и замораживают на 3 хода. +You steal the doll's identification card. +Вы крадете идентификационную карту куклы. +Doll ID +ID Куклы +You apply a clever trick to reset your visor cooldown. +С помощью хитрого трюка вы сбрасываете время перезарядки вашего визора. +A chip used to identify dolls. She must have dropped it. Either way it contains valuable tech... +Чип, используемый для идентификации кукол. Должно быть, она его уронила. В любом случае, он содержит ценную технологию... +With enough, it can be used to remove Dollmaker's headwear. +При достаточном количестве, чипы можно использовать для снятия головного убора Кукольницы. +Heart Amulet +Амулет-сердечко +You find a donut with sprinkles! +Вы нашли пончик с посыпкой! +Donut (Sprinkles) +Пончик (С посыпкой) +You enjoy the donut and relish in its sweet delights. +Вы жуете пончик и наслаждаетесь его сладкими изысканным вкусом. +A delicious fried snack, covered in a sugary glaze and topped with sprinkles. +Вкусная жареная закуска, покрытая сахарной глазурью и посыпкой. +Restores 10% willpower. Takes a few turns to eat. +Восстанавливает 10% силы воли. Чтобы его съесть, потребуется несколько ходов. +You pick up a sugar cookie slathered in pink frosting! +Вы подбираете сахарное печенье, покрытое розовой глазурью! +Good-Girl Gift +Подарок хорошей девочке +You slowly eat the cookie, savoring its fluffy texture. +Вы медленно кушаете печенье, наслаждаясь его текстурой. +It tempts you with sweet promises, but something about it feels off... +Оно искушает вас сладкими обещаниями... Что-то в этом не так... +Restores 15% willpower and adds +5 submissiveness. Takes a few turns to eat. +Восстанавливает 15% силы воли и добавляет +5 к покорности. Чтобы его съесть, потребуется несколько ходов. +You find a chocolate-chip cookie! +Вы нашли Печенье с шоколадной крошкой! +Cookie (Chocolate Chip) +Печенье (С шоколадной крошкой) +You enjoy the cookie one chocolatey bite at a time. +Вы наслаждаетесь сочетанием печеньем и шоколада. +A delicious baked good made with butter, sugar, and chocolate chips, baked until golden brown. +Вкусная выпечка, приготовленная с маслом, сахаром и шоколадной крошкой, выпекается до золотисто-коричневого цвета. +Restores 10% willpower. Takes a few turns to eat. +Восстанавливает 10% силы воли. Чтобы его съесть, потребуется несколько ходов. +The potion was less effective due to your gag! +Из-за вашего кляпа зелье оказалось менее эффективным! +Elven Soap +Эльфийское мыло +You feel the restraints become loose on your skin! +Вы чувствуете, как путы скользят по вашей коже! +The secret to elven cosmetics and blemish-free skin. +Продукт эльфийской косметики и секрет безупречной кожи. +Makes you slippery for 100 turns, boosting all forms of struggling. +Делает вашу кожу скользкой на протяжении 100 ходов, усиливая все формы борьбы. +You feel the restraints become loose on your skin! +Вы чувствуете, как путы скользят по вашей коже! +Enchanted Grinder +Зачарованная болгарка +The grinder starts spinning for a short time! Its cutting power is immense! +На короткое время болгарка начинает вращаться! Её режущая сила огромна! +The cutting disc is shining and very sharp. +Режущий диск блестящий и очень острый. +Grants significantly increased cutting power for a short time. +Обеспечивает значительное увеличение эффективности разрезания на короткое время. +The grinder starts spinning for a short time! Its cutting power is immense! +На короткое время болгарка начинает вращаться! Её режущая сила огромна! +Dollmaker's Staff +Посох кукольницы +You remember this being used on someone else. +Вы помните, что он используется против кого-то еще. ++15% glue damage. Deals psychic damage. Fully bound enemies captured with this weapon become latex dolls which fight with you. ++15% урона слизью. Наносит психический урон. Полностью связанные враги, захваченные с помощью этого оружия, становятся латексными куклами, которые сражаются вместе с вами. +You are unable to control more than 3 dolls. The new doll is protesting and remains bound. +Вы не можете управлять более чем 3 куклами. Четвертая кукла протестует и остается связанной. +Staff of Incineration +Посох поджигателя +A magical weapon made for intermediates to use. +Магическое оружие, созданное для подмастерий на пути мага. ++25% fire damage. Deals fire damage. Burning enemies take an additional 5 fire damage per turn. Offhand: Applies %fire damage bonus. ++25% урона огнём. Наносит урон огнём. Горящие враги получают дополнительно 5 единиц урона от огня за ход. В левой руке: Применяется процентный бонус к огненному урону. +Staff of Storms +Посох бурь +A magical weapon made for intermediates to use. +Магическое оружие, созданное для подмастерий на пути мага. ++20% electric damage. Deals electric damage. Enemies hit by electric damage echo 15 additional Electric damage in a 5x5 area. Offhand: Applies electric damage bonus. ++20% урона электричеством. Наносит урон электричеством. Враги, получившие урон от электричества, разносят 15 дополнительных урона от электричества в зоне 5x5. В левой руке: Применяется бонус к электр. урону. +Staff of Frostbite +Посох обморожения +A magical weapon with a 33% chance to freeze the target for 4 turns. +Магическое оружие с 33% шансом заморозить цель на 4 хода. ++20% ice damage. Deals ice damage. Frozen enemies take 5 ice damage per turn. Offhand: Applies ice damage bonus. ++20% урона льдом. Наносит урон льдом. Замороженные враги получают 5 единиц ледяного урона за ход. В левой руке: Применяется бонус к урону льдом. +Staff of Binding +Посох сковывания +A magical weapon made to use on novices. +Магическое оружие, созданное для новичков на пути мага. ++20% chain damage. Deals chain damage and roots the target for 4 turns. 150% binding efficiency. Offhand: Applies chain damage bonus. ++20% цепного урона. Наносит цепной урон и обездвиживает цель на 4 хода. 150% эффективность сковывания. В левой руке: Применяется бонус к цепному урону. +Arcane Orb +Магическая сфера +Look into my eyes... +Посмотри мне в глаза... +Deals arcane damage. Can be used without hands. Can not critically strike. +Наносит урон арканой. Можно использовать без рук. Не может нанести критический удар. +You find a purple crystal. You feel your mystic powers flood into it. +Вы находите фиолетовый кристалл. Вы чувствуете, как в него вливается ваша магическая сила.. +Staff of Flame +Огненный посох +A magical weapon made for novices to use. +Магическое оружие, созданное для новичков на пути мага. ++15% fire damage. Deals fire damage. Offhand: Applies passive bonus. ++15% урона огнём. Наносит огненный урон. В левой руке: Применяется бонус к огненному урону. +Staff of Slime +Посох слизи +A slimy and magical implement.. +Очень скользкое магическое оружие... ++10% glue damage. Deals glue damage. Offhand: Applies passive bonus. ++10% урона слизью. Наносит урон слизью. В левой руке: Применяется бонус к урону слизью. +Staff of Shocking +Электрический посох +A magical weapon made for novices to use. +Магическое оружие, созданное для новичков на пути мага. ++10% electric damage. Deals electric damage. 10% chance to stun for 3 turns. Offhand: Applies electric damage bonus. ++10% урона электричеством. Наносит урон электричеством. 10% оглушить врага на 3 хода. В левой руке: Применяется бонус к электр. урону. +Staff of Permafrost +Посох вечной мерзлоты +A magical weapon with a 15% chance to freeze the target for 4 turns. +Магическое оружие с 15%-ным шансом заморозить цель на 4 хода. ++10% ice damage. Deals ice damage. Multiplies the duration of freeze effects on enemies by 1.5x (min +1 duration). Offhand: Applies ice damage bonus. ++10% урона льдом. Наносит урон льдом. Увеличивает продолжительность замораживания врагов в 1.5 раза (мин. +1 ход). В левой руке: Применяется бонус к ледяному урону. +Staff of Chains +Посох цепей +A magical weapon made for novices in the art of bondage. +Магическое оружие, созданное для новичков в искусстве бондажа. ++10% chain damage. Deals chain damage. 150% binding efficiency. Offhand: Applies chain damage bonus. ++10% цепного урона. Наносит цепной урон. 150% эффективность сковывания. В левой руке: Применяется бонус к цепному урону. +You pick up a staff of chains. You have fond memories... +Вы подбираете Посох цепей. В вашей памяти всплывают приятные воспоминания... +You pick up a staff of binding. You remember these from wizard school... +Вы подбираете Посох сковывания. Вы помните его по школе волшебства... +You pick up a staff of the storm. Your hair stands on end. +Вы подбираете Посох бури, и ваши волосы встают дыбом. +You pick up a staff of incineration. It rumbles with molten fury. +Вы подбираете Посох поджигателя. Он грохочет от ярости огня. +You pick up a staff with a name on it: DOLLMAKER +Вы подбираете посох с надписью на нем: КУКОЛЬНИЦА +You pick up a staff of frostbite. Your hand feels numb just reaching for it. +Вы подбираете Посох обморожения. Ваша рука немеет, едва вы просто прикасаетесь к нему. +You pick up a staff of the storm. It tingles. +Вы подбираете Посох бурь, и он слабенько ударяет вас током. +You pick up a staff of flames. It feels warm. +Вы подбираете Огненный посох. Он тёплый. +You pick up a staff of slime. +Вы подбираете Посох слизи. +You pick up a staff of permafrost. It feels icy to the touch. +Вы подбираете Посох вечной мерзлоты. На ощупь он как ледяной. +Crop +Хлыст +For those unruly subs. +Для недисциплинированных саб. +Deals pain damage. Highly distracting. Offhand: +5 pain damage on attack for 3 stamina. +Наносит урон Болью. Сильно возбуждает. В левой руке: +5 урона болью при атаке (потребляет дополнительно 3 выносливости). +You pick up a riding crop. +Вы подбираете хлыст для верховой езды. +Scissors +Ножницы +Safety first! +Безопасность превыше всего! +Deals slash damage. Better than a knife for cutting restraints. +Наносит рубящий урон. При разрезания ограничителей показывают себя лучше, чем нож. +You pick up a pair of scissors. +Вы подбираете пару ножниц. +Dagger +Кинжал +Designed with subterfuge in mind. +Прекрасное оружие для ассасина. +Deals slash damage. Deals 40 pierce damage instead on unaware targets, before crit modifiers. Offhand: +10% Base Weapon Crit +Наносит рубящий урон. В случае, если цель не ожидала атаки, нанесет 40 пронзающего урона (перед применением модификатора крит. урона). В левой руке: +10% базового критического урона оружия. +You pick up a dagger. +Вы подбираете кинжал. +Katana +Катана +She who strikes first, hits second. +Та, кто ударит первой, ударит и второй. +Deals slash damage. Deals up to 50 bonus damage by waiting 10 turns between attacks. +Наносит рубящий урон. Наносит до 50 бонусных единиц урона, если между атаками прошло 10 ходов. +You pick up a katana. +Вы подбираете катану. +Shadow's Edge +Острая Тень +For those who truly devote themselves to the cause. +Для тех, кто действительно посвящает себя этому делу. +Deals shadow damage. Damage is doubled against enemies that are in shadow. +Наносит урон тьмой. Урон против врагов, находящихся в тени, удваивается. +You pick up Shadow's Edge. +Вы подбираете Острую Тень. +Stormbreaker +Разрушитель Бурь +I have the power! Taking electric damage charges you (1 turn/10dmg). +У меня есть сила! Получение электрического урона Заряжает вас (1 ход/10 урона). +Deals crush damage. Deals bonus electric damage in an area when charged, up to +40. Gives +100 Electric Resist when held. (can be wielded offhand to apply the Electric Resist) +Наносит дробящий урон. Наносит дополнительный урон от электрического тока в небольшой зоне при Зарядке, до +40. Экипированный дает +100 к сопрот. электричеству. (Сопротивления дается и если держать в левой руке) +You pick up Stormbreaker. +Вы подбираете Разрушитель Бурь. +Rapier +Рапира +For the ostentatious and flashy duelist. +Для эффектных и показушных дуэлей. +Deals slash damage. Deals 50 pierce damage instead on vulnerable targets. +Наносит рубящий урон. Если цель Уязвима, вместо этого нанесёт 50 пронзающего урона. +You pick up some kind of pretentious sword. +Вы подбираете какой-то вычурный клинок. +Foil +Шпага +En garde! +Защищайся! +Deals pierce damage. Deals 30 damage instead on vulnerable targets. +Наносит пронзающий урон. Если цель Уязвима, нанесёт 30 урона. +You pick up a fencing sword. +Вы подбираете оружие фехтовальщика. +Sledgehammer +Кувалда +Do you have what it takes? +У вас есть все, что нужно? +Deals heavy crush damage and knocks the target back 2 spaces. Deals bonus damage to most solid barricades. +Наносит большой дробящий урон и отбрасывает цель на 2 клетки назад. Наносит дополнительный урон большинству прочных баррикад. +You pick up a heavy sledgehammer. +Вы находите тяжелую кувалду. +Hammer +Молот +A crude way of fixing your problems. +Грубый способ решения ваших проблем. +Deals crush damage and knocks the target back. +Наносит дробящий урон и отбрасывает цель назад. +Flail +Цеп +Very fast and hard to dodge as long as you know what you're doing. +Очень быстрый, и от него трудно увернуться, если вы знаете, как им пользоваться. +Also deals 10 damage to targets next to you. Deals crush damage. +Также наносит 10 единиц урона целям рядом с вами. Наносит дробящий урон. +Spear +Копье +Speak softly and carry a pointy stick. +Говорите тихо и носите с собой заостренную палку. +Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 2 tiles away. +Наносит пронзающий урон цели и тому, кто прямо позади нее. Может использоваться для дальней атаки на расстоянии 2 плиток. +Pike +Пика +An 11 foot pole, for things you wouldn't want to touch with a 10 foot pole. +11-футовый (3,35м.) шест для вещей, к которым вы не хотели бы прикасаться 10-футовым шестом. +Deals pierce damage to the target and one square behind it. Can be used to make a ranged attack 3 tiles away. +Наносит пронзающий урон цели и одному квадрату за ней. Может использоваться для дальней атаки на расстоянии 3 плиток. +Bolt Cutters +Болторез +The universal key. +Универсальный ключ. +Also assists in cutting restraints when equipped. +Когда экипирован, также помогает разрезать удерживающие устройства. +Knife +Нож +A go-to for travelers and adventurers. +Отличный 'мультитул' для путешественников и искателей приключений. +Deals slash damage. Offhand: +10 Block +Наносит рубящий урон. В левой руке: +10 к Блоку. +Flashlight +Фонарик +A weapon of mass illumination. +Оружие массового освещения. +Provides a highly directional light source. +Обеспечивает сильный направленный источник света. +You pick up a flashlight. +Вы находите фонарик. +Torch +Факел +Second only to the mighty towel in usefulness. +Уступает по полезности только могучему полотенцу. +Deals fire damage. Provides light. +Наносит урон от огня. Обеспечивает свет. +Unarmed +Без оружия +Fight with your hands and feet. Counts as teasing if arms are free. 50% chance to stun target if the target is disarmed. +Сражайся руками и ногами. Считается поддразниванием, если руки свободны. 50% шанс оглушить цель, если она обезоружена. +Deals unarmed damage. +Наносимый урон считается 'безоружным' уроном. +Sword +Меч +the steel is strong, and the blade true. +Лезвие прочное, кромка острая. +A fast and accurate weapon that deals slash damage. +Быстрое и точное оружие, наносящее рубящий урон. +Flamberge +Фламберг +A blade forged in magic fire. +Клинок, выкованный в магическом огне. +Deals 20 bonus slash damage on hit. Offhand: Produces light. +Наносит 20 дополнительных единиц рубящего урона при попадании. В левой руке: даёт свет. +Escort Drone +Дрон сопровождения +A semi-autonomous drone with a personal defense beam. Does not require hands to equip. +Полуавтономный беспилотник с персональным защитным лучом. Не требует рук для оснащения. +Deals electric damage. 33% chance to stun for 4 turns. +Наносит урон электричеством. С вероятностью 33% оглушит врага на 4 хода. +Magic Wand +Волшебная палочка +Its powers extend beyond the traditional schools of magic. +Её сила выходит за рамки традиционных школ магии. +Deals charm damage. 20% chance to stun the target for 2 turns. Offhand: +5 charm damage on attack for 3 stamina. +Наносит урон Очарованием. С вероятностью 20% оглушит врага на 2 хода. В левой руке: +5 урона Очарованием при атаке (Потребляет дополнительно 3 выносливости). +Ice Cube +Кубик льда +A magical cube of ice that never melts. Convenient! +Волшебный кубик льда, который никогда не тает. Удобно! +Deals 10 ice damage with a 10% chance to freeze for 1 turn. Slows targets on hit. Offhand: Slows the target. +Наносит 10 единиц урона от льда. С вероятностью 10% заморозит врага на 1 ход. В левой руке: Замедляет цель. +Rope +Веревки +A kidnapper's most versatile tool. +Универсальный инструмент похитителя. +Deals chain damage and applies 50 points of binding. +Наносит цепной урон и добавляет 50 единиц сковывания. +Magic Sword +Магический меч +Slices through ghosts with ease! +С легкостью прорубается сквозь призраков! +A sword that guides itself toward its target, making it easy to hit with. +Меч, который сам направляется к своей цели, что облегчает нанесение удара. +Dragonslaver +Убийца драконов +A powerful weapon with an ancient mechanism that launches binding belts. +Мощное оружие с древним механизмом, который запускает связующие ремни. +Deals slash damage. Can make ranged attacks.. Drains 0.75% ancient energy to fire a line of belts that deal 40 chain damage and 40 binding. +Наносит рубящий урон. Может совершать дальние атаки. Расходует 0,75% древней энергии, чтобы запустить линию ремней, которые нанесут 40 цепного урона и наложат 40 сковывания. +Metamorphosis +Метаморфоза +You can enter slime form for 25 turns, which lets you pass thru bars, +50 Evasion, and deals 25 glue damage when attacked. +Вы можете принять форму слизи на 25 ходов, что позволит вам проходить сквозь прутья, даст +50 к уклонению и позволит наносить 25 единиц урона от Слизи при атаке. +Deals glue damage. Roots targets for 2 turns on a hit. Offhand: Roots targets on hit. +Наносит урон Слизью. Обездвиживает цели на 2 хода при попадании. В левой руке: Обездвиживает цель при попадании. +Four Seasons +Четыре времени года +Activate to reduce the cost of your next fire, water/ice, air/lightning, and earth spell by 50, once per element. +Активируйте, чтобы снизить стоимость вашего следующего заклинания огня, воды/льда, воздуха/молнии и земли на 50, один раз за элемент. +Deals shadow damage. +25% fire, ice, soap, crush, electric, blast damage. Offhand: Applies passive bonus. +Наносит урон Тьмою. +25% урона от огня, льда, дробящего оружия, электричества, взрыва, смывающего урона. Левая рука: Применяется пассивный бонус. +The Arbiter +Арбитр +I have altered the rules. Pray I do not alter them further. +Я изменил правила. Молитесь, чтобы этого не повторилось. +Deals chain damage with 125% binding efficiency, +40 shadow damage to summons. +25% glue and chain damage. Weapon Ability: Disarm +Наносит цепной урон со 125%-ной эффективностью сковывания, +40 урона тьмой по суммонам. +25% цепного урона и урона слизью. Способность оружия: Обезоруживание. +Bondage Buster EX +Бондаж-бластер EX +Can fire a beam (1 turn channel) that deals 30 electric damage and applies an equal amount of energy bondage. Charges when not fired, dealing 90 total damage at 10 turns of charge. +Может выстрелить лучом (применяется 1 ход) который наносит 30 единиц электрического урона и накладывает сковывание, числом равное энергии. Заряжается, когда не стреляет, нанося до 90 единиц урона за 10 ходов заряда. +Melee mode deals tickle damage and marks enemies as vulnerable for 4 turns. +В режиме ближнего боя наносит урон от щекотки и делает врагов Уязвимыми на 4 хода. +Bondage Buster MK II +Бондаж-бластер MK II +Can fire a beam (3 turn channel) that deals 35 electric damage in an area and applies an equal amount of energy bondage. While charge is below 50%, has a 10% chance to misfire. +Может выстрелить лучом (применяется 3 хода) который наносит 35 единиц электрического урона по площади и накладывает сковывание, числом равное энергии. При заряде ниже 50% вероятность осечки составляет 10%. +Melee mode deals tickle damage and marks enemies as vulnerable for 2 turns. +В режиме ближнего боя наносит урон от щекотки и делает врагов Уязвимыми на 2 хода. +Nevermere Blaster +Бластер Невермера +Can fire a blast that deals 25 electric damage. +Может выстрелить взрывающимся снарядом, который нанесет 25 урона электричеством. +Melee mode deals tickle damage. +В ближнем бою наносит урон от Щекотки. +Blaster Shot +Выстрел из бластера +You set your blaster to stun and fire! +Вы настраиваете свой бластер на оглушение и стреляете! +Messenger of Love +Посланник любви +Love shines in many ways... +Свет любви укажет истинный путь... +Can fire an arrow that makes an enemy extremely lustful, causing them to attack others. Lasts forever on lesser enemies, 30 turns on high-level enemies, and 10 turns on bosses. +Может выпустить стрелу, которая сделает врага чрезвычайно похотливым, заставив его нападать на других. Действует вечно на слабых врагов, 30 ходов на врагов высокого уровня и 10 ходов на боссов. +Moirai's Scissors +Ножницы Мойры +Cutting the threads of fate. +Перерезая нити судьбы. +Deals slash damage. Ignores up to 100 Magic and Physical armor. Active ability: Spend 50 charge to free all nearby allies and disrobe enemies, increasing charm damage on them by 100% and applying the armor shred. +Наносят рубящий урон. Игнорирует до 100 единиц магической и физической брони. Активная способность: Потратьте 50 заряда, чтобы освободить всех ближайших союзников и раздеть врагов, увеличив наносимый им урон очарованием на 100% и применив раскол брони. +With a single snip of the magic scissors, everyone's clothes fall off. +Один взмах волшебных ножниц и со всех спадает одежда. +No eligible targets within 4 tiles +Нет подходящих целей в радиусе 4 плиток. +Latex Projector +Латексный гранатомёт +Deals crush damage. Can be used to spray a '+' shaped pool of slime. +Наносит дробящий урон. Может использоваться для распыления слизи в форме '+'. +Spend 15 charge to create a pool of slime that deals 35 glue damage per tile and slows enemies. +Расходуя 15 Заряда, создает лужу слизи, которая наносит 35 единиц урона от Слизи за ход и замедляет врагов. +Magic Axe +Магический топор +Sick and vile, like the hearts of your enemies. +Мерзкий и гнусный, как сердца твоих врагов. +Deals slash damage to the target and 20 shadow damage to enemies next to you. Slows for 3 turns and applies 60 shadow damage bleed over time to enemies around you. +Наносит рубящий урон цели и 20 урона тьмой врагам рядом с вами. Замедляет на 3 хода и постепенно наносит 60 единиц урона кровотечением тьмы врагам вокруг вас. +Pickaxe +Кирка +Used for drilling holes in rock and armor. +Используется для проделывания отверстий в скалах и броне. +Deals pierce damage. Reduces enemy armor by 15 for 6 turns. +Наносит пронзающий урон. Уменьшает броню противника на 15 на 6 ходов. +Magic Flail +Магический цеп +A blessed censer that distributes pain equally. +Благословенная кадильница, которое распределяет боль между всеми. +Deals crush damage. Deals 20 bonus holy damage to the target and enemies near the target. +Наносит дробящий урон. Наносит 20 дополнительного урона светом цели и врагам вблизи неё. +Magic Spear +Магическое копье +Seeks and pierces hearts with ease. +С легкостью ищет и пронзает сердца. +Deals pierce damage to the target and two squares behind it. Can be used to make a ranged attack. +Наносит пронзающий урон цели и тем, кто стоит в 2-ух квадратах за нею. Может быть использовано для дальних атак. +Magic Hammer +Магический молот +Made of a magical, resonant material. +Сделан из резонирующего с магией материала. +Deals crush damage and knocks the target back. Helps to bash open restraints while cutting. +Наносит дробящий урон и отбрасывает цель назад. Помогает пробивать ограничители во время резки. +Icebreaker +Ледокол +A frigid magical hammer useful for both climbing up and destroying ice. +Холодный магический молот, полезный как для восхождения, так и для разрушения льда. +Deals crush damage. Deals 3x damage to frozen targets instead of 2x. Triggers Shatter. +Наносит дробящий урон. Наносит 3-кратный урон замороженным целям вместо 2-кратного. Провоцирует Раскалывание. +Dreamcatcher +Ловец снов +Forged in nightmares, woven in steel. Summons a Shadow Warrior on unaware targets for 2% ancient energy. +Выкованный в кошмарах, сотканный из стали. Призывает Теневого воина на не подозревающие цели за 2% древней энергии. +Deals shadow damage. Deals up to 30 bonus psychic damage on unaware (100%) or vulnerable (50%) targets. +Наносит урон тьмой. Наносит до 30 дополнительного психического урона не подозревающим (100%) или уязвимым (50%) целям. +Axe +Топор +Great for cutting trees that happen to be underground. +Отлично подходит для рубки деревьев, которые встречаются в подземелье. +Also deals 20 damage to enemies next to you. Deals slash damage. +Наносит рубящий урон. Также наносит 20 единиц урона врагам рядом с вами. +Knife +Нож +Unarmed +Без оружия +Accuracy: +Точность: +Crit Multiplier: +Множитель Крит. урона: +Bind Crit Multiplier: +Множитель Крит. Сковывания: +Find the keys.. +Нужно найти ключи... +Find the exit! +Можно искать выход! +You are receiving help from a friendly ally. +Вы получаете помощь от дружественного союзника. +You found a hook you can use to pull on straps and loops. +Вы нашли крючок, с помощью которого можно развязать ремешки и петли. +You have access to something sharp and can attempt to Cut restraints, or Remove more effectively. +У вас есть доступ к чему-нибудь острому, и вы можете попытаться Разрезать ограничители, или Удалить с лучшей эффективностью. +You found a corner to help manipulate buckles and snaps with. +Вы нашли уголок, с помощью которого можно попытаться расстегнуть пряжки и защелки. +You found a crack and could maybe wedge a knife or tool into it to keep it still. +Вы нашли трещину и, возможно, могли бы воткнуть в нее нож или другой инструмент, чтобы неподвижно его закрепить. +You found something sticky and might be able to pull off fabrics. +Вы нашли что-то липкое и, возможно, сможете стянуть ткань. +Evasion: +Уклонение: +Visibility: +Заметность: +Submissive: Enemies won't attack you, but they will try to play with you. +Покорная: Враги не атакуют вас, но они попытаются поиграть с вами. +On the Run! Enemies are hostile. +В бегах! Враги жаждут вас поймать. +Prisoner: Enemies won't attack you unless you are out of jail. +Заключенная: Враги не нападут на вас, пока вы не выйдете из тюрьмы. +Freedom +Свобода +Crawling slowly! +Медленное ползание! +Inching slowly! +Медленное передвижение! +Hopping slowly! +Медленные прыжки! +Slowed! +Замедление! +Immobile! +Обездвиживание! +Enclosed! +Заключение! +You feel a gentle buzz... +Вы чувствуете нежную вибрацию... +Your toys tease you gently... +Ваши игрушки нежно дразнят вас... +Your toys are vibrating. +Ваши игрушки вибрируют. +Your toys are buzzing strongly! +Ваши игрушки сильно вибрируют! +Your toys vibrate intensely! +Ваши игрушки словно бы ходят ходуном! +The vibration is torturous! +Эти вибрации мучительны! +Edged! +На грани! +Satisfied. Miscast chance is reduced. +Удовлетворение. Шанс осечки в заклинаниях снижен. +Damage: +Урон: +Bind: +Сковывание: +Crit: +Крит: +Crit: +Крит: +Accuracy: +Точность: +SP Cost: +Трата SP: +Cut PWR: AMNT% +Эф.Разреза: AMNT% +It appears to be a receptacle +Похоже, сюда можно что-то вставляется. +Place live crystal +Поместить заряж. кристалл +Take the crystal +Взять кристалл +You place the crystal into the receptacle and it lights up! +Вы помещаете кристалл в сокет, и он загорается! +You take the crystal from the receptacle and all goes dark. +Вы достаете кристалл из сосуда, и всё вокруг погружается во тьму. +You try to take the crystal but the cage around it is secured with a magic purple lock. +Вы пытаетесь забрать кристалл, но клетка вокруг него заперта магическим фиолетовым замком. +Place spent crystal +Поместить разряж. кристалл +VALUE gold vanishes from your satchel as the receptacle explodes and your crystal is recharged! +VALUE золота исчезает из вашей сумки, после чего сокет передаёт энергию в кристалл, заряжая его! +Nothing seems to happen +Кажется, ничего не происходит +The EnemyName grabs you by the RestraintName and keeps you in place! +EnemyName хватает вас за RestraintName и удерживает на месте! +The EnemyName grabs you and pulls you!!! +EnemyName хватает вас и тянет за собой!!! +The EnemyName misses you! +EnemyName промахивается по вам! +You duck under the EnemyName's attack! +Вы подныривает под атаку EnemyName! +You hear a door creak open nearby! +Вы слышите, как неподалеку со скрипом открывается дверь! +You hear the faint sound of a door opening. +Вы слышите слабый звук открывающейся двери. +You hear a door slam shut nearby! +Вы слышите, как неподалеку хлопает дверь! +You hear a door being shut in the distance. +Вы слышите, как вдалеке закрывается дверь. +The slime is spreading over your body!!! +Слизь расползается по вашему телу!!! +The slime starts to harden over your skin... +Слизь начинает застывать на вашей коже... +The RESTRAINTNAME creates more bindings out of thin air! (+RestraintAdded) +RESTRAINTNAME создает дополнительные ограничители прямо из воздуха! (+RestraintAdded) +A RESTRAINTNAME has appeared around your neck! Beware of additional restraints! +RESTRAINTNAME появляется на вашей шее! Остерегайтесь дополнительных ограничителей! +The RESTRAINTNAME has run out of bindings to add and has gone dormant for a period of time. +RESTRAINTNAME исчерпал добавляемые ограничители и на некоторое время отключился. +Angel +Ангел +You subdue the angel! +Вы подчиняете себе ангела! +The angel decides to toy with you while you are trussed up. (DamageTaken) +Ангел решает поиграть с вами, пока вы связаны. (DamageTaken) +The angel snaps her fingers and divine restraints appear on your body! (+RestraintAdded) +Ангел щелкает пальцами, и на вашем теле появляются божественные оковы! (+RestraintAdded) +The angel snaps her fingers and glowing locks appear on your body! +Ангел щелкает пальцами, и на вашем теле появляются светящиеся замки! +Holy Construct +Священный конструкт +You banish the holy construct! +Вы изгоняете священный конструкт! +The holy construct emits a searing light! (DamageTaken) +Священный конструкт излучает обжигающий свет! (DamageTaken) +The holy construct emits a blinding light! (DamageTaken) +Священный конструкт излучает ослепляющий свет! (DamageTaken) +The holy construct emits a Binding light! (+RestraintAdded) +Священный конструкт излучает сковывающий свет! (+RestraintAdded) +Be not afraid! I am the courier of a local shrine, and I have come to take your offering. +Не бойтесь! Я курьер местного святилища и пришел принять ваше подношение. +Hold still and I will take the offering... +Стой спокойно, а я возьму подношение... +(She takes the gold) +(Она берет золото) +Peace be with you! Goodbye! +Да пребудет с тобою мир! Пока-пока! +You don't have the gold, do you? +У тебя нет золота, не так ли? +But do not fear, we will keep this between you and I... +Но не бойся, мы сохраним это между нами... +For I will first have a little fun... +Но для начала я с тобой немного позабавлюсь... +You have brought this upon yourself, after all. +В конце концов, ты сама на это напросилась. +The angel frowns as you attack her, and glowing rings appear. +Ангел хмурится, когда вы нападаете на неё, и появляются светящиеся кольца. +Angel: MMMMMPHH!!! +Ангел: ММММФФФ!!! +(The angel looks puzzled and unlocks your divine restraints) +(Ангел выглядит озадаченной и разблокирует ваши божественные оковы) +The EnemyName pulls away your ArmorName!!! +EnemyName срывает с вас ArmorName!!! +There was a bug removing your ArmorName. Please report! +Ошибка с удалением ArmorName. Пожалуйста, сообщите об этом! +The EnemyName bypasses your security to add the RestraintName! +EnemyName перебирает ваши ограничители, чтобы добавить RestraintName! +The EnemyName tries to restrain you, but you resist the bondage! +EnemyName пытается сковать вас, но вы сопротивляетесь его оковам! +Resist! +Сопротивление! +Mystic Lock +Мистический замок +The mystic lock fades, allowing you to pass once more. +Мистический замок исчезает, позволяя вам пройти еще раз. +As you cross the threshold, a mystical lock appears to prevent you from stepping back! +Когда вы переступаете порог, появляется мистический замок, который не дает вам сделать шаг назад! +As you cross the threshold, a mystical lock appears to prevent you from stepping back! +Когда вы переступаете порог, появляется мистический замок, который не дает вам сделать шаг назад! +Metal Shield +Металлический щит +The shield falls to the floor. +Щит падает на пол. +A metal shield blocks your way! +Металлический щит преграждает вам путь! +Several metal shields block your way! +Несколько металлических щитов преграждают вам путь! +Illusion +Иллюзия +The illusion vanishes into thin air. +Иллюзия растворяется в воздухе. +Wall +Стена +The wall shatters into pieces, which fade away slowly. +Стена разлетается на куски, которые медленно исчезают. +Locked Door +Запертая дверь +The door lock shatters into pieces. +Дверной замок разлетается на куски. +Earthen Monolith +Земляной монолит +The monolith recedes into the ground. +Монолит уходит в землю. +Static Sphere +Статическая сфера +The sphere shrinks back into the storm dimension. +Сфера сжимается, уходя обратно в измерение шторма. +Familiar +Фамильяр +The familiar dissolves into spectral ash. +Фамильяр растворяется в иллюзорном пепле +Latex Doll +Латексная кукла +The doll gives in to her desires and squirms around on the ground. +Кукла сдаётся своим желаниям и извивается на земле. +Storm Crystal +Штормовой кристалл +The storm crystal shatters into many crackling pieces. +Штормовой кристалл разлетается на множество потрескивающих осколков. +Fire Mote +Огненная частица +The fire mote is extinguished. +Частица огня тухнет. +Air Mote +Воздушная частица +The air mote returns to dust. +Воздушная частица превращается в пыль. +Water Mote +Водяная частица +The water mote turns into a puddle. +Водяная частица превращается в лужицу. +Earth Mote +Частица земли +The earth mote crumbles. +Земляная частица рассыпается. +Shadow Warrior +Теневой Воин +The shadow warrior screeches as it vanishes into mist. +Теневой Воин визжит, исчезая в тумане. +Allied Golem +Голем +The words vanish from the golem's forehead as it crashes down. +Слова исчезают со лба голема, и он падает на землю. +Shopkeeper +Лавочница +You have done a terrible deed. +Вы совершили ужасное деяние. +Shopkeeper +Лавочница +You have done a terrible deed. +Вы совершили ужасное деяние. +Crystal Monolith +Кристаллический монолит +The crystal fades from the monolith. +Кристалл монолита угасает. +Orb Guardian +Страж сферы +The Orb Guardian dissolves into sand and bone dust. +Страж сферы осыпается песком и костяной пылью. +You feel like you have made a grave mistake. +Вы чувствуете, что совершили серьезную ошибку. +Zombie +Зомби +The zombie moans and collapses to the ground. +Зомби стонет и падает на землю. +The zombie's charms attach to your body (+RestraintAdded) +Амулеты зомби прилипают к вашему телу (+RestraintAdded) +The zombie caresses your body! (DamageTaken) +Зомби нежно поглаживает ваше тело! (DamageTaken) +Maidforce Recruit +Рекрут спецотряда горничных +The maid does a fumbled retreat. +Горничная неуклюже отступает. +The maid uses a fast-binding technique! (+RestraintAdded) +Горничная использует технику быстрого связывания! (+RestraintAdded) +The maid snaps a lock on one of your restraints! (DamageTaken) +Горничная защелкивает замок на одном из ваших ограничителей! (DamageTaken) +The maid tickles you with her feather duster! (DamageTaken) +Горничная щекочет вас своей метелкой из перьев! (DamageTaken) +M.F. 'Unseen Blade' +Горничная 'Невидимый Клинок' +The maid runs back to the shadows. +Горничная отступает обратно в тень. +The maid uses secure restraints on you! (+RestraintAdded) +Горничная надевает на вас надежные ограничители! (+RestraintAdded) +The maid snaps a lock on one of your restraints! (DamageTaken) +Горничная защелкивает замок на одном из ваших ограничителей! (DamageTaken) +The maid stealthily rubs your sensitive areas! (DamageTaken) +Горничная украдкой растирает ваши чувствительные места! (DamageTaken) +The maid throws a smoke bomb at the ground! +Горничная бросает на землю дымовую бомбу! +M.F. 'Unseen Blade' +Горничная 'Невидимый Клинок' +The maid does a fumbled retreat. +Горничная неуклюже отступает. +The maid rubs you from many angles! (DamageTaken) +Горничная потирает вас во множестве мест! (DamageTaken) +M.F. 'Going Loud' +Горничная 'Громогласная' +The maid does a fumbled retreat. +Горничная неуклюже отступает. +The maid uses secure restraints on you! (+RestraintAdded) +Горничная надевает на вас надежные ограничители! (+RestraintAdded) +The maid snaps a lock on one of your restraints! (DamageTaken) +Горничная защелкивает замок на одном из ваших ограничителей! (DamageTaken) +The maid lands a kick and stuns you! (DamageTaken) +Горничная наносит удар ногой и оглушает вас! (DamageTaken) +The maid slaps you with a scornful expression! (DamageTaken) +Горничная, с презрительным выражением лица, дает вам пощечину! (DamageTaken) +Heavy Weapons Maid +Горничная с тяжелым оружием +The maid drops her weapon and runs. +Горничная бросает свое оружие и убегает. +The maid uses secure restraints on you! (+RestraintAdded) +Горничная надевает на вас надежные ограничители! (+RestraintAdded) +The maid snaps a lock on one of your restraints! (DamageTaken) +Горничная защелкивает замок на одном из ваших ограничителей! (DamageTaken) +The maid bonks you with her weapon! (DamageTaken) +Горничная делает вам 'боньк' своим оружием! (DamageTaken) +The maid slaps you with a scornful expression! (DamageTaken) +Горничная, с презрительным выражением лица, дает вам пощечину! (DamageTaken) +M.F. 'Parasol' +Горничная 'Парасоль' +The maid leaps out of sight. +Горничная исчезает из виду. +The maid uses secure restraints on you! (+RestraintAdded) +Горничная надевает на вас надежные ограничители! (+RestraintAdded) +The maid snaps a lock on one of your restraints! (DamageTaken) +Горничная защелкивает замок на одном из ваших ограничителей! (DamageTaken) +The maid caresses your breasts with a smile! (DamageTaken) +Горничная с улыбкой ласкает вашу грудь! (DamageTaken) +M.F. 'Master Plan' +Горничная 'Главный Планировщик' +The head maid surrenders gracefully. +Старшая горничная грациозно сдается. +The head maid suddenly whips out a restraint and locks it on! (+RestraintAdded) +Старшая горничная внезапно достает ограничитель и защелкивает его! (+RestraintAdded) +The head maid snaps her fingers and you find your restraints locked! (DamageTaken) +Старшая горничная щелкает пальцами, и вы обнаруживаете, что ваши ограничители заперты! (DamageTaken) +The head maid tickles you strategically! (DamageTaken) +Старшая горничная щекочет вас в самых чувствительных местах! (DamageTaken) +You are distracted for a moment and suddenly you find yourself in chastity! +Вы на мгновение отвлекаетесь и внезапно оказываетесь в целомудрии! +Fire Elemental +Огненный элементаль +The fire elemental dissolves into ash. +Огненный элементаль превращается в пепел. +The fire elemental conjures forged restraints around your limbs! (+RestraintAdded) +Огненный элементаль сотворяет кованые ограничители на ваших конечностях! (+RestraintAdded) +The fire elemental places a heavy lock on your restraint! (DamageTaken) +Огненный элементаль запирает тяжелый замок на одном из ваших ограничителей! (DamageTaken) +The fire elemental touches you with her burning finger! (DamageTaken) +Огненный элементаль прикасается к вам своим горящим пальцем! (DamageTaken) +Ranger of the Wild +Дикий Рейнджер +The ranger disappears into the environment. +Рейнджер растворяется в окружающей среде. +The ranger gropes your chest with a smile on her face! (DamageTaken) +Рейнджер, с улыбкой на лице, ощупывает вашу грудь! (DamageTaken) +The ranger surprises you and binds you! (+RestraintAdded) +Рейнджер внезапно связывает вас! (+RestraintAdded) +The ranger slips a lock onto one of your restraints! (DamageTaken) +Рейнджер защелкивает замок на одном из ваших ограничителей! (DamageTaken) +Druid of the Wild +Дикий Друид +The druid calls forth vines to mask her retreat. +Друид призывает лозы, чтобы замаскировать свое отступление. +The druid calls forth vines to mask her retreat. +Друид призывает лозы, чтобы замаскировать свое отступление. +The druid holds your face and kisses you! (DamageTaken) +Друид удерживает ваше лицо и целует вас! (DamageTaken) +The druid binds you with mithril restraints! (+RestraintAdded) +Друид надевает на вас мифриловые ограничители! (+RestraintAdded) +The druid tosses a lock from her cloak! It finds you and fastens with a click. (DamageTaken) +Друид метает оковы из под своего плаща! Они находят вас и защелкиваются с громким щелчком. (DamageTaken) +Water Elemental +Водный элементаль +The water elemental melts into a pool of water. +Водный элементаль тает, превращаясь в лужу воды. +The water elemental's song compels you to be bound! (+RestraintAdded) +Песня водного элементаля принуждает вас надеть ограничители! (+RestraintAdded) +The water elemental sings a song of helplessness. (DamageTaken) +Водный элементаль поет песню о безнадёжности. (DamageTaken) +The water elemental's song compels you to step forward and receive a binding! +Песня водного элементаля заставляет вас сделать шаг вперед и получить ограничитель! +The water elemental sings an arousing song! (DamageTaken) +Элементаль воды поет возбуждающую песню! (DamageTaken) +Ice Elemental +Ледяной элементаль +The ice elemental melts into a pool of water. +Элементаль льда тает, превращаясь в лужу воды. +The ice elemental touches you, forming tendrils of ice! (+RestraintAdded) +Элементаль льда прикасается к вам, образуя ледяные оковы! (+RestraintAdded) +The ice elemental creates icy locks on your restraints! +Элементаль льда создает ледяные замки на ваших ограничителях! +The ice elemental gives a chilling touch to your body! (DamageTaken) +Элементаль льда касается вашего тела ледяным прикосновением! (DamageTaken) +Earth Elemental +Земляной элементаль +The earth elemental sinks into the ground. +Элементаль земли погружается в землю. +The earth elemental pins you and slaps on some restraints! (+RestraintAdded) +Элементаль земли прижимает вас к себе и надевает ограничители! (+RestraintAdded) +The earth elemental locks a restraint! +Элементаль земли запирает ограничители! +The earth elemental dashes through the earth! +Элементаль земли проносится сквозь землю! +The earth elemental gives you a soft massage! (DamageTaken) +Элементаль земли делает вам мягкий массаж! (DamageTaken) +Air Elemental +Воздушный элементаль +There is no more elemental. Must have been just the wind. +Элементаля больше нет. Остался один лишь слабенький ветерок. +The air elemental sneakily slips a restraint on! (+RestraintAdded) +Элементаль воздуха незаметно надевает ограничитель! (+RestraintAdded) +The air elemental blinks to your position! +Элементаль воздуха телепортируется к вам! +The air elemental slips a lock on! (DamageTaken) +Элементаль воздуха защелкивает замок! (DamageTaken) +The air elemental spanks you playfully! (DamageTaken) +Элементаль воздуха игриво шлепает вас! (DamageTaken) +Angry Zombie +Злой зомби +The zombie screams and tumbles to the floor. +Зомби кричит и падает на пол. +The zombie swiftly wraps you in charms! (+RestraintAdded) +Зомби быстро окутывает вас амулетами! (+RestraintAdded) +The zombie gropes your body! (DamageTaken) +Зомби ощупывает ваше тело! (DamageTaken) +Zombie +Зомби +The zombie screams and tumbles to the floor. +Зомби кричит и падает на пол. +The zombie swiftly wraps you in charms! (+RestraintAdded) +Зомби быстро окутывает вас амулетами! (+RestraintAdded) +The zombie gropes your body! (DamageTaken) +Зомби ощупывает ваше тело! (DamageTaken) +Support Drone +Дрон поддержки +The support drone retreats to recharge its weapon! +Дрон поддержки отступает, чтобы перезарядить свое оружие! +The support drone zaps you! (DamageTaken) +Дрон поддержки бьет вас электрическим током! (DamageTaken) +The Dollmaker commands a drone to attack you! +Кукольница приказывает дрону атаковать вас! +The Dollmaker commands her drones to attack you! +Кукольница приказывает своим дронам атаковать вас! +Capture Drone +Дрон захвата +The capture drone's latex core overloads! +Латексное ядро дрона захвата перегружается! +The capture drone grapples you! (DamageTaken) +Дрон захвата хватает вас! (DamageTaken) +The capture drone wraps you in advanced cables! (+RestraintAdded) +Дрон захвата обвязывает вас усовершенствованными тросами! (+RestraintAdded) +The Dollmaker commands a drone to capture you! +Кукольница приказывает дрону схватить вас! +The Dollmaker commands her drones to capture you! +Кукольница приказывает своим дронам схватить вас! +Artistic Zombie +Артистичный зомби +The zombie smiles as it collapses to the ground. +Зомби улыбается, падая на землю. +The zombie swiftly ties you! (+RestraintAdded) +Зомби быстро связывает вас! (+RestraintAdded) +The zombie is somehow dextrous enough to lock your restraint! (DamageTaken) +Зомби каким-то образом оказывается достаточно ловким, чтобы заблокировать ваши ограничители! (DamageTaken) +The zombie cuddles with your body! (DamageTaken) +Зомби прижимается к вашему телу! (DamageTaken) +Mage Zombie +Зомби маг +The zombie frowns and disappears in a puff of ice and ribbons. +Зомби хмурится и исчезает в облаке льда и лент. +The zombie smiles as she wraps you in charms! (+RestraintAdded) +Зомби улыбается, окутывая вас амулетами! (+RestraintAdded) +The zombie gropes your body! (DamageTaken) +Зомби ощупывает ваше тело! (DamageTaken) +The zombie's ribbons form magical locks on your body! (DamageTaken) +Ленты зомби на вашем теле блокируются волшебными замками! (DamageTaken) +Talisman Zombie +Зомби владыка талисманов +The zombie pouts and puts up a shield to let her retreat. +Зомби надувает губы и выставляет щит, дабы отступить. +The zombie giggles as she wraps you in charms! (+RestraintAdded) +Зомби хихикает, окутывая вас амулетами! (+RestraintAdded) +The zombie gropes your body! (DamageTaken) +Зомби ощупывает ваше тело! (DamageTaken) +The zombie uses a sealing spell to create magical locks! (DamageTaken) +Зомби использует запечатывающее заклинание для создания магических замков! (DamageTaken) +Warrior Zombie +Зомби воин +The warrior zombie yells and falls cinematically. +Зомби-воин кричит и кинематографично падает. +The warrior zombie uses a traditional binding technique (+RestraintAdded) +Зомби-воин использует классическую технику связывания. (+RestraintAdded) +The warrior zombie strikes you with her wooden sword! (+STUN) +Зомби-воин поражает вас своим деревянным мечом! (+STUN) +The warrior zombie runs its fingers along your body! (DamageTaken) +Зомби-воин проводит пальцами по вашему телу! (DamageTaken) +The warrior zombie fights using the way of Sword and Lock. (DamageTaken) +Зомби-воин сражается с помощью техники Меча и Замка. (DamageTaken) +Rope Artist +Любительница веревок +The rope artist frowns and walks away, looking defeated. +Любительница веревок хмурится и уходит с видом побежденной. +The rope artist performs an intricate technique! (+RestraintAdded) +Любительница веревок выполняет сложную технику! (+RestraintAdded) +The rope artist sneaks a lock onto you while you weren't looking! (DamageTaken) +Любительница веревок незаметно накинула на вас замок, пока вы не смотрели! (DamageTaken) +The rope artist smiles and tickles your feet! (DamageTaken) +Любительница веревок улыбается и щекочет вам ноги! (DamageTaken) +Deputy +Шериф +The deputy surrenders her donuts. +Шериф отдает свои пончики. +The deputy slaps on some cuffs! (+RestraintAdded) +Шериф заковывает вас в наручники! (+RestraintAdded) +The deputy tases you! (Stunned!) +Шериф тазерит вас! (Stunned!) +The deputy conducts a strip search! (DamageTaken) +Шериф проводит обыск с раздеванием! (DamageTaken) +The deputy performs a security enhancement procedure! (DamageTaken) +Шериф выполняет процедуру усиления мер безопасности! (DamageTaken) +Ninja Warrior +Ниндзя воин +The ninja warrior retreats into the shadows. +Ниндзя воин отступает в тень. +The ninja warrior uses a traditional binding technique (+RestraintAdded) +Ниндзя воин использует классическую технику связывания. (+RestraintAdded) +The ninja warrior tosses a shuriken and hits you! (Stunned!) +Ниндзя воин бросает сюрикен и попадает в вас! (Stunned!) +The ninja warrior uses a lock to give herself the upper hand! (DamageTaken) +Ниндзя воин использует замок, чтобы получить преимущества! (DamageTaken) +The ninja warrior uses a subduing technique! (DamageTaken) +Ниндзя воин использует усмиряющую технику! (DamageTaken) +Ninja Assassin +Ниндзя ассасин +The assassin retreats into the shadows. +Ассасин отступает в тень. +The assassin uses a traditional binding technique (+RestraintAdded) +Ассасин использует классическую технику связывания. (+RestraintAdded) +The assassin uses a subduing technique! (DamageTaken) +Ассасин использует усмиряющую технику! (DamageTaken) +The assassin stealthily locks your restraint! (DamageTaken) +Ассасин украдкой запирает ваши оковы! (DamageTaken) +Animated Armor +Живая броня +The Animated Armor falls into pieces. +Живая броня разваливается на куски. +The Animated Armor restrains you with shackles (+RestraintAdded) +Живая броня сковывает вас кандалами. (+RestraintAdded) +The Animated Armor hugs your body with an iron grip! (DamageTaken) +Живая броня обнимает вас своей железной хваткой! (DamageTaken) +Mimic +Мимик +The mimic spills out its contents. +Мимик выплевывает свое содержимое. +The mimic spits out a restraint which latches onto you! (+RestraintAdded) +Мимик выплевывает оковы, которая цепляется за вас! (+RestraintAdded) +The mimic tickles you with its tongue! (DamageTaken) +Мимик щекочет вас своим язычком! (DamageTaken) +Skeleton +Скелет +The Skeleton falls to pieces. +Скелет разваливается на куски. +The Skeleton restrains you! (+RestraintAdded) +Скелет сковывает вас! (+RestraintAdded) +The Skeleton tackles you! (DamageTaken) +Скелет лапает вас! (DamageTaken) +Dragonheart Initiate +Посвященный Драконьего Сердца +The Dragonheart Initiate retreats hurriedly. +Посвященный Драконьего Сердца поспешно отступает. +The Dragonheart Initiate apprehends you! (+RestraintAdded) +Посвященный Драконьего Сердца сковывает вас! (+RestraintAdded) +The Dragonheart Initiate squeezes your body! (DamageTaken) +Посвященный Драконьего Сердца стискивает ваше тело! (DamageTaken) +The Dragonheart locks your restraint! (DamageTaken) +Боец Драконьего Сердца запирает ваши ограничители! (DamageTaken) +Dragonheart Shield +Защитник Драконьего Сердца +The Dragonheart Shield makes a tactical retreat. +Защитник Драконьего Сердца совершает тактическое отступление. +The Dragonheart Shield apprehends you! (+RestraintAdded) +Защитник Драконьего Сердца сковывает вас! (+RestraintAdded) +The Dragonheart Shield bonks you! (DamageTaken) +Защитник Драконьего Сердца бьёт вас! (DamageTaken) +The Dragonheart Shield squeezes your body! (DamageTaken) +Защитник Драконьего Сердца стискивает ваше тело! (DamageTaken) +The Dragonheart locks your restraint! (DamageTaken) +Боец Драконьего Сердца запирает ваши ограничители! (DamageTaken) +Ice Dragonheart +Охладитель Драконьего Сердца +The Ice Dragonheart retreats in a blast of snow. +Охладитель Драконьего Сердца отступает под порывами снега. +The Ice Dragonheart apprehends you! (+RestraintAdded) +Охладитель Драконьего Сердца сковывает вас! (+RestraintAdded) +The Ice Dragonheart gives your body a cold touch! (DamageTaken) +Охладитель Драконьего Сердца дотрагивается до вашего тела ледяным прикосновением! (DamageTaken) +The Dragonheart uses an icy lock on your restraint! (DamageTaken) +Охладитель Драконьего Сердца прикрепляет ледяной замок на ваши ограничители! (DamageTaken) +Poison Dragonheart +Отравитель Драконьего Сердца +The Poison Dragonheart retreats in a green mist. +Отравитель Драконьего Сердца отступает в зеленом тумане. +The Poison Dragonheart apprehends you! (+RestraintAdded) +Отравитель Драконьего Сердца сковывает вас! (+RestraintAdded) +The Poison Dragonheart smacks you with her axe! (DamageTaken) +Отравитель Драконьего Сердца бьет вас своим топором! (DamageTaken) +The Poison Dragonheart thrums her claws across your figure! (DamageTaken) +Отравитель Драконьего Сердца проводит когтями по вашему телу! (DamageTaken) +The Dragonheart locks your restraint using natural magics! (DamageTaken) +Представитель Драконьего Сердца запирает ваши ограничители, используя магию природы! (DamageTaken) +Crystal Dragonheart +Кристалломант Драконьего Сердца +The Crystal Dragonheart screams and falls to the ground dramatically. +Кристалломант Драконьего Сердца вскрикивает и драматично падает на землю. +The Crystal Dragonheart apprehends you! (+RestraintAdded) +Кристалломант Драконьего Сердца сковывает вас! (+RestraintAdded) +The Crystal Dragonheart squeezes you in a big hug! (DamageTaken) +Кристалломант Драконьего Сердца сжимает вас в крепких объятиях! (DamageTaken) +The Dragonheart grows a crystalline lock on your restraints! (DamageTaken) +Представитель Драконьего Сердца создает кристаллический замок на ваших ограничителях! (DamageTaken) +Many crystals rise up out of the ground! +Множество кристаллов поднимаются из земли! +A crystal rises up out of the ground! +Кристалл поднимается из земли! +Statue +Статуя +The statue topples over! +Статуя падает! +Statue +Статуя +The statue topples over and reveals a mechanism! +Статуя падает и обнажает механизм! +Statue +Статуя +The statue topples over and reveals a mechanism! +Статуя падает и обнажает механизм! +The statue shoves a gag into your mouth, which inflates to fill the space! (+RestraintAdded) +Статуя засовывает вам в рот кляп, который раздувается, заполняя всё свободное пространство! (+RestraintAdded) +The statue kisses your gag! (DamageTaken) +Статуя целует ваш кляп! (DamageTaken) +Chaotic Crystal +Хаотический кристалл +The crystal shatters! +Кристалл разлетается вдребезги! +The chaotic crystal leeches energy from you! (DamageTaken) +Хаотический кристалл высасывает из вас энергию! (DamageTaken) +Grand Chaotic Crystal +Великий хаотический кристалл +The grand crystal shatters! +Великий кристалл разлетается вдребезги! +The grand crystal leeches energy from you! (DamageTaken) +Великий кристалл высасывает из вас энергию! (DamageTaken) +Crystals erupt from the ground and slowly grow around your limbs! (+RestraintAdded) +Кристаллы вырываются из земли и медленно оборачиваются вокруг ваших конечностей! (+RestraintAdded) +Soul Crystal +Кристалл души +The crystal shatters into a puff of soul dust! +Кристалл разлетается вдребезги, превращаясь в облачко пыли душ! +The soul crystal leeches strength from you! (DamageTaken) +Кристалл души высасывает из тебя силу! (DamageTaken) +Active Soul Crystal +Активный кристалл Души +The crystal shatters into a puff of soul dust! +Кристалл разлетается вдребезги, превращаясь в облачко пыли душ! +The soul crystal leeches strength from you! (DamageTaken) +Кристалл души высасывает из тебя силу! (DamageTaken) +Shadow Dragonheart +Тень Драконьего Сердца +The Shadow Dragonheart frowns and runs away. +Тень Драконьего Сердца хмурится и убегает. +The Shadow Dragonheart apprehends you! (+RestraintAdded) +Тень Драконьего Сердца сковывает вас! (+RestraintAdded) +The Shadow Dragonheart conjures a shadowly lock! (DamageTaken) +Тень Драконьего Сердца сотворяет теневой замок! (DamageTaken) +The Shadow Dragonheart extends her scythe and pulls you closer!!! +Тень Драконьего Сердца взмахивает своей косой и притягивает вас ближе!!! +The Shadow Dragonheart catches you with her scythe! (DamageTaken) +Тень Драконьего Сердца ударяет вас своей косой! (DamageTaken) +Dragonheart Leader +Лидер Драконьего Сердца +The Dragonheart Leader admits defeat. +Лидер Драконьего Сердца признает свое поражение. +The Dragonheart Leader apprehends you! (+RestraintAdded) +Лидер Драконьего Сердца сковывает вас! (+RestraintAdded) +The Dragonheart Leader dashes to you! +Лидер Драконьего Сердца делает к вам рывок! +The Dragonheart Leader squeezes your body! (DamageTaken) +Лидер Драконьего Сердца стискивает ваше тело! (DamageTaken) +The Dragonheart Leader uses a lock on you! (DamageTaken) +Лидер Драконьего Сердца применяет к вам замок! (DamageTaken) +Rebel Scum! +Мятежный отброс! +The Dragonheart Rebel admits defeat. +Мятежница Драконьего Сердца признает свое поражение. +The Dragonheart Rebel apprehends you! (+RestraintAdded) +Мятежница Драконьего Сердца сковывает вас! (+RestraintAdded) +'En garde!' +'Защищайся!' +The Dragonheart Rebel squeezes your body! (DamageTaken) +Мятежница Драконьего Сердца стискивает ваше тело! (DamageTaken) +The Dragonheart Leader uses a lock on you! (DamageTaken) +Лидер Драконьего Сердца применяет к вам замок! (DamageTaken) +Dryad +Дриада +The dryad sinks into the ground. +Дриада погружается в землю. +The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) +Дриада протягивает руку и обвивает вас лозами! (+RestraintAdded) +The dryad sings a song that mesmerizes you! (DamageTaken) +Дриада поет песню, которая завораживает вас! (DamageTaken) +The dryad tickles you with a leaf! (DamageTaken) +Дриада щекочет вас листиком! (DamageTaken) +Dryad +Дриада +The dryad sinks into the ground. +Дриада погружается в землю. +The dryad extends an arm, and she wraps you in vines! (+RestraintAdded) +Дриада протягивает руку и обвивает вас лозами! (+RestraintAdded) +The dryad sings a song that mesmerizes you! (DamageTaken) +Дриада поет песню, которая завораживает вас! (DamageTaken) +The dryad tickles you with a leaf! (DamageTaken) +Дриада щекочет вас листиком! (DamageTaken) +Highly-Motivated Doll +Высокомотивированная кукла +The doll falls to the ground, moaning loudly. +Кукла падает на землю, громко постанывая. +The doll rubs her body against yours. You can feel the conduction. (DamageTaken) +Кукла трется своим телом о ваше. Вы можете почувствовать удары электрическим током. (DamageTaken) +The doll tackles you and squeezes you with her trembling legs! (DamageTaken) +Кукла хватает вас и сжимает своими ножками! (DamageTaken) +Dollsmith +Изготовительница кукол +The dollsmith's suit locks her wrists together and renders her helpless. +Костюм изготовительницы кукол сковывает ее запястья и делает ее беспомощной. +The dollsmith runs a latex-covered finger across your vulnerable body! (DamageTaken) +Изготовительница кукол проводит пальцем, покрытым латексом, по вашему уязвимому телу! (DamageTaken) +The dollsmith grabs you and applies her favorite doll restraints! (+RestraintAdded) +Изготовительница кукол хватает вас и надевает свои любимые кукольные ограничители! (+RestraintAdded) +The dollsmith slaps a lock onto your restraints! (DamageTaken) +Изготовительница кукол защелкивает замок на ваших ограничителях! (DamageTaken) +The dollsmith splashes a red latex concoction onto you! (+RestraintAdded) +Изготовительница кукол брызгает на вас красной латексной смесью! (+RestraintAdded) +Dollmaker's Apprentice +Ученица Кукольницы +The dollmaker apprentice's suit becomes rigid and locks her limbs in place. +Костюм ученицы кукольницы становится жестким и фиксирует ее конечности. +The dollmaker's apprentice squeezes your body with her gloved hands! (DamageTaken) +Ученица Кукольницы сжимает ваше тело руками в перчатках! (DamageTaken) +The dollmaker's apprentice uses her staff to encase you in doll restraints! (+RestraintAdded) +Ученица Кукольницы использует свой посох, чтобы заковать вас в кукольные ограничители! (+RestraintAdded) +The dollmaker's apprentice slips a lock onto your restraints! (DamageTaken) +Ученица Кукольницы защелкивает замок на ваших ограничителях! (DamageTaken) +The dollmaker's apprentice unleashes a powerful latex blast! (+RestraintAdded) +Ученица Кукольницы вызывает мощный латексный взрыв! (+RestraintAdded) +...Alchemist? +...Алхимик? +You rescue the alchemist. +Вы спасаете Алхимика. +The Alchemist restrains you! (+RestraintAdded) +Алхимик связывает вас! (+RestraintAdded) +The alchemist hugs you in a rubbery embrace! (DamageTaken) +Алхимик заключает вас в резиновые объятия! (DamageTaken) +The alchemist uses an ornate-looking lock! (DamageTaken) +Алхимик использует богато украшенный замок! (DamageTaken) +Alchemist +Алхимик +The alchemist screams and runs. +Алхимик кричит и убегает. +The Alchemist restrains you! (+RestraintAdded) +Алхимик связывает вас! (+RestraintAdded) +The alchemist hugs you in a rubbery embrace! (DamageTaken) +Алхимик заключает вас в резиновые объятия! (DamageTaken) +The alchemist uses an ornate-looking lock! (DamageTaken) +Алхимик использует богато украшенный замок! (DamageTaken) +Alchemist's Pet +Питомец Алхимика +The wolfgirl escapes! +Девушка-волчица убегает! +The wolfgirl lunges at you with a powerful kick! +Девушка-волчица набрасывается на вас и бьёт ногой! +The wolfgirl lunges at you with a powerful kick! +Девушка-волчица набрасывается на вас и бьёт ногой! +The wolfgirl cuddles with you! (DamageTaken) +Девушка-волчица прижимает вас к себе! (DamageTaken) +Wolfgirl +Девушка-волчица +The wolfgirl escapes! +Девушка-волчица убегает! +The wolfgirl lunges at you with a powerful kick! +Девушка-волчица набрасывается на вас и бьёт ногой! +The wolfgirl lunges at you with a powerful kick! +Девушка-волчица набрасывается на вас и бьёт ногой! +The wolfgirl cuddles with you! (DamageTaken) +Девушка-волчица прижимает вас к себе! (DamageTaken) +Wolfguard +Волчья стражница +The wolfguard's suit punishes her for poor performance! +Костюм волчьей стражницы наказывает её за плохую работу! +The wolfguard lunges at you and strikes you! +Волчья стражница набрасывается на вас и бьёт изо всех сил! +The wolfguard's escort drones shock you! (DamageTaken) +Дроны сопровождения волчьей стражницы бьют вас электрическим током! (DamageTaken) +The wolfguard's escort drones deploy some restraints! (+RestraintAdded) +Дроны сопровождения волчьей стражницы фиксируют на вас ограничители! (+RestraintAdded) +Wolfgirl Trainer +Дрессировщица девушек-волчиц +The trainer retreats! +Дрессировщица отступает! +The wolfgirl trainer squeezes your breasts playfully! (DamageTaken) +Дрессировщица девушек-волчиц игриво сжимает вашу грудь! (DamageTaken) +The wolfgirl trainer secures you in training gear! (+RestraintAdded) +Дрессировщица девушек-волчиц облачает вас в тренировочное снаряжение! (+RestraintAdded) +The wolfgirl trainer pins you and skillfully locks all of your restraints! +Дрессировщица девушек-волчиц прижимает вас к себе и умело блокирует все ваши ограничители! +Nevermere Operative +Оперативник Невермера +The operative does a fumbled retreat! +Оперативник неуклюже отступает! +The Nevermere Operative smiles and gropes your body! (DamageTaken) +Оперативник Невермера улыбается и ощупывает ваше тело! (DamageTaken) +The Nevermere Operative apprehends you with training gear! (+RestraintAdded) +Оперативник Невермера фиксирует на вас тренировочное снаряжение! (+RestraintAdded) +The Nevermere Operative pins you and skillfully locks all of your restraints! +Оперативник Невермера прижимает вас к себе и умело запирает все ваши оковы! +Trainer's Apprentice +Ученица дрессировщицы +The trainer's apprentice escapes! +Ученица дрессировщицы сбегает! +The trainer's apprentice rubs her claws across your chest playfully! (DamageTaken) +Ученица дрессировщицы игриво проводит когтями по вашей груди! (DamageTaken) +The trainer's apprentice secures you in training gear! (+RestraintAdded) +Ученица дрессировщицы облачает вас в тренировочное снаряжение! (+RestraintAdded) +The trainer's apprentice adds a lock to your restraints. +Ученица дрессировщицы прикрепляет замки к вашим ограничителям. +The Executive +Исполнительный Директор +The executive surrenders gracefully. +Исполнительный директор грациозно сдается. +The Executive makes a persuasive argument! (DamageTaken) +Исполнительный директор приводит убедительный аргумент! (DamageTaken) +The Executive's drones apprehend you! (+RestraintAdded) +Дроны исполнительного директора сковывают вас! (+RestraintAdded) +The Executive's drones apply high-security locks to your restraints! +Дроны исполнительного директора на ваши ограничители сверх-надежные замки! +Wolf Instructor +Волчий инструктор +The instructor deploys active camoflague and retreats! +Инструктор разворачивает активную маскировку и отступает! +The instructor disciplines you! (DamageTaken) +Инструктор дисциплинирует вас! (DamageTaken) +The instructor applies advanced training gear! (+RestraintAdded) +Инструктор облачает вас в новейшее тренировочное снаряжение! (+RestraintAdded) +The instructor adds a lock to your restraints. +Инструктор прикрепляет замки к вашим ограничителям. +Nevermere Drone +Дрон Невермера +The drone loses power and falls to the ground! +Дрон разряжается и падает на землю! +A Nevermere Drone takes off! +Дрон Невермера поднимается в воздух! +You hear buzzing as several Nevermere Drones take to the air! +Вы слышите жужжание, когда несколько Дронов Невермера поднимаются в воздух! +Swarm of Tape Drones +Рой ленточных дронов +The tape drones lose control and crash all over the place! +Ленточные дроны теряют управление и врезаются в стены и пол! +A swarm of tape drones takes flight! +Рой ленточных дронов поднимается в воздух! +The air fills with buzzing as dozens of tiny drones lift off! +Воздух наполняется жужжанием, когда десятки крошечных дронов взлетают в воздух! +The tape drones attach additional sticky layers! (DamageTaken) +Ленточные дроны опутывают вас дополнительными слоями липкой ленты! (DamageTaken) +The tape drones circle around you, wrapping you in tape! (+RestraintAdded) +Ленточные дроны кружат вокруг вас, заворачивая вас в ленту! (+RestraintAdded) +Shield Drone +Дрон защиты +The drone's power source explodes. +Источник питания дрона взрывается. +A Shield Drone takes off! +Дрон защиты поднимается в воздух! +Several Shield Drones take flight, their shields interlinking. +Несколько Дронов защиты взлетают одновременно, их щиты соединяются друг с другом. +Drone Explosion +Взрывающийся Дрон +Rusty Drone +Ржавый дрон +The drone's mechanisms grind to a halt. +Механизмы дрона со скрежетом останавливаются. +The drone uses a short-ranged electric attack! (DamageTaken) +Дрон использует атаку электрическим током с малой дистанции! (DamageTaken) +The drone disassembles itself, revealing a set of restraining cables! (+RestraintAdded) +Дрон обнажает свои внутренности, показывая набор удерживающих тросов! (+RestraintAdded) +Rusty Auto Taper +Ржавый Авто-запаковщик +The auto taper's mechanisms grind to a halt. +Механизмы авто-запаковщика со скрежетом останавливаются. +The auto taper wraps additional layers of sticky tape! (DamageTaken) +Авто-запаковщик оборачивает вас в дополнительные слои липкой ленты! (DamageTaken) +The wraps you in many layers of tape! (+RestraintAdded) +Дрон обматывает вас множеством слоев липкой ленты! (+RestraintAdded) +Rubber Blaster +Резинострел +The turret enters an unstable state, about to spread rubber all over! +Турель переходит в неустойчивое состояние, собираясь разбрызгать повсюду резину! +The turret defends itself with a close-range electric attack! (DamageTaken) +Турель защищается с помощью удара электрическим током с близкого расстояния! (DamageTaken) +Rubber Launcher +Резиномёт +The turret enters an unstable state, about to spread rubber all over! +Турель переходит в неустойчивое состояние, собираясь разбрызгать повсюду резину! +The turret defends itself with a close-range electric attack! (DamageTaken) +Турель защищается с помощью удара электрическим током с близкого расстояния! (DamageTaken) +Auto Capture Unit +Автономный Юнит Захвата +The capture unit releases magic smoke and explodes. +Юнит захвата испускает магический дым и взрывается. +The capture unit grabs you securely! (DamageTaken) +Юнит захвата с силой хватает вас! (DamageTaken) +The capture unit extends its appendages and wraps them around you! (+RestraintAdded) +Юнит захвата вытягивает свои отростки и оборачивает их вокруг вас! (+RestraintAdded) +The capture unit releases small drones which lock onto your restraints! (DamageTaken) +Юнит захвата выпускает маленьких дронов, которые фиксируются на ваших ограничителях! (DamageTaken) +Auto Tape Unit +Автономный Юнит Запаковки +The tape unit releases magic smoke and explodes. +Юнит Запаковки испускает магический дым и взрывается. +The tape unit applies many layers of tape! (DamageTaken) +Юнит Запаковки выпускает множество слоев ленты! (DamageTaken) +The tape unit fires off many layers of sticky tape! (+RestraintAdded) +Юнит Запаковки оборачивает вокруг вас множество слоев липкой ленты! (+RestraintAdded) +The tape unit releases small drones which lock onto your restraints! (DamageTaken) +Юнит Запаковки выпускает маленьких дронов, которые фиксируются на ваших ограничителях! (DamageTaken) +Force Field Unit +Юнит Силового Поля +The forcefield unit releases magic smoke and explodes. +Юнит Силового Поля испускает магический дым и взрывается. +The forcefield unit zaps you! (DamageTaken) +Юнит Силового Поля поражает вас электрическим током! (DamageTaken) +The forcefield unit extends its appendages and wraps them around you! (+RestraintAdded) +Юнит Силового Поля вытягивает свои отростки и оборачивает их вокруг вас! (+RestraintAdded) +The forcefield unit releases small drones which lock onto your restraints! (DamageTaken) +Юнит Силового Поля выпускает маленьких дронов, которые фиксируются на ваших ограничителях! (DamageTaken) +Force Field Projector +Проектор Силового Поля +The forcefield erupts into a shower of blue sparks! +Проектор Силового Поля взрывается с дождем голубых искр! +The robot deploys a forcefield! +Робот создает силовое поле! +The robot deploys a set of forcefields! +Робот создает несколько силовых полей! +Drone +Дрон +The drone fizzles and falls to the ground! +Дрон издает скрежет и падает на землю! +The drone zaps you with a restraining energy ray! (DamageTaken) +Дрон поражает вас сдерживающим энергетическим лучом! (DamageTaken) +The drone uses a short-ranged electric attack! (DamageTaken) +Дрон использует атаку электрическим током с малой дистанции! (DamageTaken) +The drone attaches to you! (+RestraintAdded) +Дрон прикрепляется к вам! (+RestraintAdded) +Cyber Warden +Кибер-надзирательница +The cyber warden's suit goes into lockdown, leaving her wiggling helplessly! +Костюм кибер-надзирательницы отключается, оставляя ее беспомощно извиваться на земле! +The cyber warden applies an advanced locking technology! +Кибер-надзирательница применяет передовую технологию блокировки! +The cyber warden grabs you and applies a self-tightening restraint! (+RestraintAdded) +Кибер-надзирательница хватает вас и надевает самозатягивающееся ограничители! (+RestraintAdded) +The cyber warden's touch applies a series of quick electrical shocks! (DamageTaken) +Прикосновение кибер-надзирательницы вызывает серию быстрых ударов электрическим током! (DamageTaken) +The cyber warden's touch applies a series of quick electrical shocks! +Прикосновение кибер-надзирательницы вызывает серию быстрых ударов электрическим током! +Auto Enforcer Unit +Юнит-Блюститель +The enforcer unit releases magic smoke and explodes. +Блюститель испускает магический дым и взрывается. +The enforcer unit fires many cables that squeeze you! (DamageTaken) +Блюститель запускает множество тросов, которые сдавливают ваше тело! (DamageTaken) +The enforcer fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) +Блюститель выстреливает ограничителями, которые прикрепляются к вашему телу, сковывая вас! (+RestraintAdded) +The enforcer releases small drones which lock onto your restraints! (DamageTaken) +Блюститель выпускает маленьких дронов, которые фиксируются на ваших ограничителях! (DamageTaken) +Artillery Unit +Артиллерийский Юнит +The artillery unit releases magic smoke and explodes. +Артиллерийский Юнит выпускает волшебный дым и взрывается. +The artillery unit fires many cables that squeeze you! (DamageTaken) +Артиллерийский Юнит запускает множество тросов, которые сдавливают ваше тело! (DamageTaken) +The artillery fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) +Артиллерийский Юнит стреляет ограничителями, которые прикрепляются к вашему телу, сковывая вас! (+RestraintAdded) +The artillery releases small drones which lock onto your restraints! (DamageTaken) +Артиллерийский Юнит выпускает маленьких дронов, которые фиксируются на ваших ограничителях! (DamageTaken) +The energy bolt hits you and paralyzes you! +Вас поражает энергетический заряд! Вы парализованы! +Energy Bolt +Энергетический Заряд +Alkahestor +Алкагестор +The alkahestor resigns to her fate. +Алкагестор смиряется со своей судьбой. +The alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded) +Алкагестор выпускает пузырек с жидкостью, которая разливается по вашему телу! (+RestraintAdded) +The alkahestor uses an ornate-looking lock! (DamageTaken) +Алкагестор использует богато украшенный замок! (DamageTaken) +The alkahestor shoves you! (DamageTaken) +Алкагестор толкает вас! (DamageTaken) +...Alkahestor? +...Алкагестор? +You rescue the Alkahestor +Вы спасаете Алкагестора +The alkahestor releases a vial of liquid that wraps around you! (+RestraintAdded) +Алкагестор выпускает пузырек с жидкостью, которая разливается по вашему телу! (+RestraintAdded) +The alkahestor uses an ornate-looking lock! (DamageTaken) +Алкагестор использует богато украшенный замок! (DamageTaken) +The alkahestor shoves you! (DamageTaken) +Алкагестор толкает вас! (DamageTaken) +Latex Homonculus +Латексный гомункул +The latex homonculus melts into sticky rubber. +Латексный гомункул плавится, превращаясь в липкую резину. +The latex homonculus molds itself into restraints! (+RestraintAdded) +Латексный гомункул превращает себя в ограничители! (+RestraintAdded) +The latex homonculus slaps you with its appendages! (DamageTaken) +Латексный гомункул шлепает вас своими отростками! (DamageTaken) +Rope Elemental +Верёвочный элементаль +The rope elemental gets knotted and falls to the floor, inert. +Верёвочный элементаль завязывается узлом и, недвижимый, падает на пол. +The rope elemental's limbs lash out at you, wrapping themselves around your body! (+RestraintAdded) +Конечности Верёвочного элементаля опутывают вас, обвиваясь вокруг вашего тела! (+RestraintAdded) +The rope elemental squeezes you tightly! (DamageTaken) +Верёвочный элементаль крепко сжимает вас! (DamageTaken) +Leather Elemental +Кожаный элементаль +The leather elemental sits down and sulks. +Кожаный элементаль падает и сдувается. +The leather elemental wraps her long extremities around your body! (+RestraintAdded) +Кожаный элементаль обвивает своими длинными конечностями ваше тело! (+RestraintAdded) +The leather elemental strikes you with her leather belts! (DamageTaken) +Кожаный элементаль ударяет вас своими кожаными ремнями! (DamageTaken) +The leather elemental clicks a lock onto your restraints! (DamageTaken) +Кожаный элементаль защелкивает замок на ваших ограничителях! (DamageTaken) +Slime Enthusiast +Любительница слизи +The slime enthusiast screams and runs. +Любительница слизи кричит и убегает. +The slime enthusiast restrains you! (+RestraintAdded) +Любительница слизи вешает на вас ограничитель! (+RestraintAdded) +The slime enthusiast hugs you in a rubbery embrace! (DamageTaken) +Любительница слизи заключает вас в резиновые объятия! (DamageTaken) +The slime enthusiast looks happy to make sure your restraints are secure! (DamageTaken) +Любитель слизи счастлива, убедившись, что ваши ограничители надежно заперты! (DamageTaken) +Miner +Шахтер +The bandit tosses her pick to the ground and complains about her pay. +Бандитка бросает свою кирку на землю и жалуется на свою зарплату. +The miner restrains you! (+RestraintAdded) +Шахтёр вешает на вас ограничитель! (+RestraintAdded) +The miner pins you with the haft of her pickaxe! (DamageTaken) +Шахтер ударяет вас рукояткой своей кирки! (DamageTaken) +The miner pins you with the haft of her pickaxe and adds a lock! (DamageTaken) +Шахтер ударяет вас рукояткой своей кирки и добавляет замок! (DamageTaken) +You hear a fuse going off... +Вы слышите, как срабатывает взрыватель... +Miner Bomb +Бомба шахтёра +Bandit +Бандитка +The bandit cries. You should feel bad. +Бандитка плачет. Вам должно быть стыдно. +Bandit +Бандитка +The bandit collapses. +Баднитка падает на землю. +The bandit restrains you! (+RestraintAdded) +Бандитка вешает на вас ограничители! (+RestraintAdded) +The bandit smiles and applies a lock! (DamageTaken) +Бандитка смеется и защелкивает замок! (DamageTaken) +The bandit caresses your restrained body! (DamageTaken) +Бандитка ласкает ваше скованное тело! (DamageTaken) +Shady Dealer +Теневая торговка +The dealer flees, leaving her goods behind. +Торговка убегает, оставив свой товар. +The dealer uses some high-quality restraints on you! (+RestraintAdded) +Торговка вешает на вас несколько высококачественных ограничителей! (+RestraintAdded) +The dealer smiles and applies a lock! (DamageTaken) +Торговка улыбается и защелкивает замок! (DamageTaken) +The dealer kisses and gropes your body! (DamageTaken) +Торговка целует и ощупывает ваше тело! (DamageTaken) +That dagger was laced with something... +Этот кинжал был чем-то обработан... +You hear a shattering of glass, suddenly the air around you feels thick and moist... +Вы слышите звон бьющегося стекла, внезапно воздух вокруг вас становится густым и влажным... +Poison Dagger +Отравленный кинжал +Lust Bomb +Похотливая бомба +Bandit Guard +Бандитка-защитник +The bandit guard collapses and calls for help. +Бандит-охранник падает на землю и зовет на помощь. +The bandit guard restrains you! (+RestraintAdded) +Бандитка-защитник вешает на вас ограничители! (+RestraintAdded) +The bandit rubs and caresses your restrained body! (DamageTaken) +Бандитка натирает и ласкает ваше скованное тело! (DamageTaken) +The bandit scoffs and applies a lock! (DamageTaken) +Бандитка смеется и защелкивает замок! (DamageTaken) +Bandit Chief +Шеф бандитов +The bandit scoffs and retreats until next time. +Бандитка усмехается и отступает, обещая явиться вновь. +The bandit restrains you tightly! (+RestraintAdded) +Бандитка вешает на вас тугие ограничители! (+RestraintAdded) +The bandit runs her hands all along your restrained body! (DamageTaken) +Бандитка проводит руками по всему твоему скованному телу! (DamageTaken) +The bandit chuckles and applies a lock! (DamageTaken) +Бандитка смеется и защелкивает замок! (DamageTaken) +Bandit Pet +Питомец бандитов +The bandit blushes and runs away. +Бандитка краснеет и убегает. +The girl nervously restrains you! (+RestraintAdded) +Девушка с волнением надевает на вас ограничители! (+RestraintAdded) +The bandit tickles you nervously! (DamageTaken) +Бандитка с волнением щекочет вас! (DamageTaken) +The bandit pet applies a lock! (DamageTaken) +Питомец бандитов защелкивает замок! (DamageTaken) +Bandit Hunter +Бандитка-охотница +The bandit hunter retreats. +Бандитка-охотница отстуает. +The bandit hunter restrains you! (+RestraintAdded) +Бандитка-охотница вешает на вас ограничители! (+RestraintAdded) +The bandit hunter caresses your restrained body! (DamageTaken) +Бандитка-охотница ласкает ваше скованное тело!! (DamageTaken) +The bandit hunter calls you an amateur and applies a lock! (DamageTaken) +Бандитка-охотница называет вас любителем и вешает замок! (DamageTaken) +Bandit Grappler +Бандитка-захватчик +The bandit grappler retreats. +Бандитка-захватчик отступает. +The bandit grappler loops her chains around you! (+RestraintAdded) +Бандитка-захватчик обвивает вас своими цепями! (+RestraintAdded) +The bandit grappler caresses your restrained body! (DamageTaken) +Бандитка-захватчик ласкает ваше скованное тело! (DamageTaken) +The bandit giggles and applies a lock! (DamageTaken) +Бандитка хихикает и защелкивает замок! (DamageTaken) +The bandit grappler hooks you closer!!! +Бандитка-захватчик подтягивает вас поближе!!! +Mummy +Мумия +The Mummy collapses and her body vanishes. +Мумия падает, и ее тело исчезает. +The Mummy conjures a mystic wrapping! (+RestraintAdded) +Мумия создает мистические ленты! (+RestraintAdded) +The Mummy conjures a magical lock upon you! (DamageTaken) +Мумия создает на вас магический замок! (DamageTaken) +The Mummy punishes you with a blow from her staff! (DamageTaken) +Мумия наказывает вас ударом своего посоха! (DamageTaken) +Cursed One +Проклятая +The Cursed One is drawn into an eldritch portal. +Проклятую затягивает в сверхъестественный портал. +The Cursed One's bindings transfer to you! (+RestraintAdded) +Оковы Проклятой переходят на вас! (+RestraintAdded) +The Cursed One's bindings emit a strange aura... (DamageTaken) +Путы Проклятой излучают странную ауру... (DamageTaken) +Floating Wrapping +Летающие бинты +The wrapping falls to the floor, its magic spent. +Бинты падают на землю, их магия исчезает. +The floating wrappings attach to you! (+RestraintAdded) +Летающие бинты оборачиваются вокруг вас! (+RestraintAdded) +The wrappings grip you tightly and squeeze you! (DamageTaken) +Бинты крепко охватывают ваше тело вас и сдавливают его! (DamageTaken) +Animated Sarcophagus +Живой саркофаг +The sarcophagus falls to the ground and crumbles. +Саркофаг падает на землю и рассыпается. +The sarcophagus emits long wrappings that pull you closer! (+RestraintAdded) +Саркофаг испускает длинные ленты, которые притягивают вас ближе! (+RestraintAdded) +The sarcophagus emanates a strange power! (DamageTaken) +Саркофаг излучает странную силу! (DamageTaken) +Bast Warrior +Воин Баст +The Bast Warrior collapses and meows loudly. +Воин Баст падает и начинает громко мяукать. +The Bast Warrior restrains you! (+RestraintAdded) +Воин Баст вешает на вас ограничители! (+RestraintAdded) +The Bast Warrior tickles you with her claws! (DamageTaken) +Воин Баст щекочет вас своими когтями! (DamageTaken) +The Bast Warrior pulls out a lock and slips it on! (DamageTaken) +Воин Баст вытаскивает замочек и защелкивает его на ваших ограничителях! (DamageTaken) +Bast High Cleric +Верховная жрица Баст +The Bast High Cleric vanishes into a puff of ribbons. +Верховная жрица Баст исчезает, превращаясь в клубок лент. +A ray of light shoots out and paralyzes you! (DamageTaken) +Выстрел лучом света парализует вас! (DamageTaken) +The Bast Cleric conjures wrappings upon you! (+RestraintAdded) +Жрица Баст создает на вас ленты! (+RestraintAdded) +A ray of light shoots out and paralyzes you! (DamageTaken) +Выстрел лучом света парализует вас! (DamageTaken) +The Bast Cleric conjures a lock and slips it onto you! (DamageTaken) +Жриц Баст создает замок и защелкивает его на вас! (DamageTaken) +Bast Cleric +Жрица Баст +The Bast Cleric collapses and meows softly. +Жрица Баст падает и начинает тихонько мяукать. +A ray of light shoots out and paralyzes you! (DamageTaken) +Выстрел лучом света парализует вас! (DamageTaken) +The Bast Cleric restrains you! (+RestraintAdded) +Жрица Баст вешает на вас ограничители! (+RestraintAdded) +A ray of light shoots out and paralyzes you! (DamageTaken) +Выстрел лучом света парализует вас! (DamageTaken) +The Bast Cleric pulls out a lock and slips it on! (DamageTaken) +Жрица Баст вытаскивает замочек и защелкивает его на ваших ограничителях! (DamageTaken) +High Cleric +Верховная жрица +The High Cleric locks herself in ritual bondage as punishment for failure. +Верховная жрица заключает себя в ритуальные оковы в качестве наказания за неудачу. +The High Cleric holds up her staff and you feel intense vibrations throughout your body! (DamageTaken) +Верховная жрица поднимает свой посох, и вы ощущаете интенсивные вибрации по всему своему телу! (DamageTaken) +The High Cleric summons animated restraints to bind you! (+RestraintAdded) +Верховная жрица призывает живые оковы, чтобы сковать вас! (+RestraintAdded) +A flurry of mummy wrappings encase you and stun you! (DamageTaken) +Шквал из бинтов мумий окутывает вас и оглушает! (DamageTaken) +The High Cleric smiles as she conjures many locks on your restraints! (DamageTaken) +Верховная жрица улыбается, накладывая множество замков на ваши ограничители! (DamageTaken) +Skeleton +Скелет +The skeleton falls to pieces. +Скелет разваливается на части. +The Skeleton restrains you! (+RestraintAdded) +Скелет сковывает вас! (+RestraintAdded) +The Skeleton tackles you! (DamageTaken) +Скелет лапает вас! (DamageTaken) +Ghost +Призрак +The ghost vanishes. +Призрак исчезает. +The Ghost restrains you! (+RestraintAdded) +Призрак сковывает вас! (+RestraintAdded) +The Ghost enters your clothing and vanishes! +Призрак проникает в вашу одежду и исчезает! +Revenant +Привидение +The revenant pouts as it vanishes. +Привидение надувается и исчезает. +The revenant restrains you! (+RestraintAdded) +Привидение вешает на вас ограничители! (+RestraintAdded) +The revenant squeezes your breasts and slows you! (DamageTaken) +Приведение сжимает вашу грудь и замедляет вас! (DamageTaken) +The revenant grabs you and caresses your tummy! (DamageTaken) +Привидение хватает вас и ласкает ваш животик! (DamageTaken) +Skeleton Warrior +Скелет-воин +The skeleton warrior collapses and falls into pieces. +Скелет-воин падает и разваливается на части. +The Skeleton lands a wide, crippling blow! (DamageTaken) +Скелет наносит широкий, сокрушительный удар! (DamageTaken) +The Skeleton leashes you! +Скелет вешает на вас поводок! +Skeleton Knight +Скелет-рыцарь +The skeleton knight collapses and falls into pieces. +Скелет-рыцарь падает и разваливается на части. +The skeleton apprehends you and pins you with the haft of its axe! (DamageTaken) +Скелет настигает вас и ударяет черенком своего топора! (DamageTaken) +The skeleton grabs you and slips a black cuff on! (+RestraintAdded) +Скелет хватает вас и надевает черные оковы! (+RestraintAdded) +Vine Plant +Живая лоза +The plant leaks purple juices everywhere as it wilts. +Увядая, лоза повсюду распрыскивает пурпурные соки. +The vine plant whips you with its tendrils! (DamageTaken) +Живая лоза хлещет вас своими отростками! (DamageTaken) +The vine plant wraps its tendrils around you! (+RestraintAdded) +Живая лоза обвивает вас своими отростками! (+RestraintAdded) +The vine plant grips you tightly! (DamageTaken) +Живая лоза крепко обхватывает вас! (DamageTaken) +Vine Spitter +Лоза-плевальщица +The vine spitter leaks purple juices everywhere as it wilts. +Лоза-плевальщица, увядая, повсюду разбрызгивает фиолетовый сок. +The vine spitter slaps you with its tendrils! (DamageTaken) +Лоза-плевальщица шлепает вас своими отростками! (DamageTaken) +The vine spitter wraps its tendrils around you! (+RestraintAdded) +Лоза-плевальщица обвивает вас своими усиками! (+RestraintAdded) +The vine spitter grips you tightly! (DamageTaken) +Лоза-плевальщица крепко сжимает вас! (DamageTaken) +Bramble +Терновник +The brambles are hacked away. +Кусты терновника срезаны. +The bramble snares you! (DamageTaken) +Терновник обвивается вокруг вас! (DamageTaken) +The red liquid bubbles and several round slimes pop out! +Красная жидкость пузырится, и из нее выскакивает несколько круглых слизняков! +The red liquid bubbles and a round slime pops out! +Красная жидкость пузырится, и из нее выскакивает круглый слайм! +A revenant appears! +Появляется привидение! +Fuuka uses a talisman to call forth the spirits of her pets! +Фуука использует талисман, чтобы вызвать духов своих питомцев! +A pool of latex bubbles and a twisted elemental appears! +Лужица латекса пузырится, и из неё появляется извращенный элементаль! +The red liquid bubbles and a round slime pops out! +Красная жидкость пузырится, и из нее выскакивает круглый слайм! +Latex Homunculus +Латексный гомункул +Latex Homunculus +Латексный гомункул +Red Slime +Красный слайм +The red slime bounces away. +Красный слайм упрыгивает прочь. +The red slime bounces off you! (DamageTaken) +Красный слайм напрыгивает на вас! (DamageTaken) +The slime shoves itself into your mouth! (+RestraintAdded) +Слизь пытается пролезть вам в рот! (+RestraintAdded) +Slime Mold +Слаймовый плесневик +The slime mold explodes into small puffs. +Слаймовый плесневик взрывается, разлетаясь множеством маленьких частиц. +The slime mold is sticky and gross! (DamageTaken) +Слаймовый плесневик липкий и противный! (DamageTaken) +The slime mold attaches itself to your body! (+RestraintAdded) +Слаймовый плесневик покрывает своей слизью ваше тело! (+RestraintAdded) +Mold Puff +Плесневое облачко +The mold puff explodes into small puffs. +Плесневое облачко взрывается, разлетаясь множеством маленьких частиц. +The mold puff is sticky and gross! (DamageTaken) +Плесневое облачко липкое и противный! (DamageTaken) +The mold puff leaps through the air! +Плесневое облачко высоко подпрыгивает! +The mold puff attaches itself to your body! (+RestraintAdded) +Плесневое облачко прикрепляется к вашему телу! (+RestraintAdded) +Slime Mold Nest +Гнездо слаймовых плесневиков +The slime mold nest erupts into a shower of black particles! +Гнездо слаймовых плесенников взрывается дождем из черных капелек! +Many small pieces of slime mold break off! +Множество маленьких слаймовых плесневиков откалываются от большого слайма! +A mobile cyst emerges from the slime mold nest! +Из гнезда слаймовых плесенников появляется подвижная киста! +Factory Doll +Фабричная кукла +The doll is subdued. +Кукла подавлена. +Freed Doll +Освобожденная кукла +The doll returns to her place. +Кукла возвращается на свое место. +Encased Adventurer +Авантюристка в Оболочке +The encased adventurer loses hope. +Авантюристка в Оболочке теряет надежду. +The encased adventurer moans as she throws herself against you for help! (DamageTaken) +Авантюристка в Оболочке стонет, бросаясь к вам за помощью! (DamageTaken) +The encased adventurer sticks to you as she mumbles incoherently! (DamageTaken) +Авантюристка в Оболочке прилипает к вам, что-то бессвязно бормоча! (DamageTaken) +The encased adventurer pleads for help as her slime spreads to you! (+RestraintAdded) +Авантюристка в Оболочке умоляет о помощи, а в это время слизь с неё перекидывается на вас! (+RestraintAdded) +Slime +Слайм +The slime melts into a puddle. +Слайм тает, превращаясь в лужицу. +The sticky slime splashes against you! (DamageTaken) +Слайм окатывает вас своей липкой слизью! (DamageTaken) +The slime attaches itself to your body! (+RestraintAdded) +Слайм прилипает к вашему телу! (+RestraintAdded) +Bouncy Slime +Упругий слайм +The slime melts into a puddle. +Слайм тает, превращаясь в лужицу. +The bouncy slime splashes against you! (DamageTaken) +Упругий слайм окатывает вас своей липкой слизью! (DamageTaken) +The bouncy slime leaps to you! +Упругий слайм прыгает к вам!! +The bouncy slime attaches itself to your body! (+RestraintAdded) +Упругий слайм прилипает к вашему телу! (+RestraintAdded) +Fast Slime +Быстрый слайм +The slime melts into a puddle. +Слайм тает, превращаясь в лужицу. +The sticky slime leaps and splashes against you! (DamageTaken) +Слайм окатывает вас своей липкой слизью! (DamageTaken) +The slime leaps and attaches itself to your body! (+RestraintAdded) +Слайм прыгает и прилепляется к вашему телу! (+RestraintAdded) +Large Slime +Большой слайм +The large slime splits apart! +Большой слайм распадается! +The sticky slime splashes against you! (DamageTaken) +Слайм окатывает вас своей липкой слизью! (DamageTaken) +The slime spreads to your body! (+RestraintAdded) +Слизь распространяется по вашему телу! (+RestraintAdded) +The slime splits into many smaller droplets! +Слизь распадается на множество более мелких капель! +Skeleton +Скелет +The Skeleton falls into pieces. +Скелет разваливается на куски. +The Skeleton restrains you! (+RestraintAdded) +Скелет сковывает вас! (+RestraintAdded) +The Skeleton latches onto you! +Скелет вцепляется в вас! +Rope Tentacle +Веревочное щупальце +The rope kraken retreats its tentacle. +Веревочный кракен убирает своё щупальце. +The rope kraken squeezes you with one of its tentacles! (DamageTaken) +Веревочный кракен сжимает вас одним из своих щупалец! (DamageTaken) +Rope Kraken +Веревочный кракен +The rope kraken devolves into a bundle of premium bondage rope. +Верёвочный кракен превращается в связку веревок премиум-класса. +The rope kraken tightly cinches itself around your body! (DamageTaken) +Веревочный кракен плотно обвивается вокруг вашего тела! (DamageTaken) +Magic Rope +Волшебная веревка +The magic rope returns to being a normal rope. +Волшебная веревка вновь становится обычной веревкой. +The magic rope wraps itself tightly around your body! (+RestraintAdded) +Волшебная веревка плотно обвивается вокруг вашего тела! (+RestraintAdded) +The magic rope wriggles into your outfit! (DamageTaken) +Волшебная веревка вплетается в ваш наряд! (DamageTaken) +Cloud of Feathers +Облако перьев +The feathers fall to the floor. +Перья падают на пол. +The feathers tickle you mercilessly! (DamageTaken) +Перья безжалостно щекочут вас! (DamageTaken) +Cloud of Scarves +Облако шарфов +The scarves become knotted and fall to the floor. +Шарфы завязываются узлом и падают на пол. +The scarves wrap themselves around you! (+RestraintAdded) +Шарфы обвиваются вокруг вас! (+RestraintAdded) +The scarves rub against your body, wrapping you in fluffy fabric! (DamageTaken) +Шарфы трутся о ваше тело, укутывая вас в ворсистую ткань! (DamageTaken) +Cloud of Ribbons +Облако лент +The ribbons knot themselves in a bow and fall to the floor. +Ленты завязываются бантом и падают на пол. +The ribbons wrap themselves around you! (+RestraintAdded) +Ленты обвиваются вокруг вас! (+RestraintAdded) +The ribbons wrap themselves around you! (DamageTaken) +Ленты обвиваются вокруг вас! (DamageTaken) +Gravitating Gag +Летающий кляп +The gag buckles itself in place and falls. +Кляп сам по себе застегивается и падает на землю. +The gravitating gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) +Летающий кляп втискивается в ваш рот и застегивается вокруг вашей головы! (+RestraintAdded) +The gravitating gag rubs itself against your lips! (DamageTaken) +Летающий кляп трется о ваши губы! (DamageTaken) +The gag dashes to you! +Кляп устремляется к вам! +Seductive Shackles +Соблазняющие кандалы +The shackles' chain breaks as they fall to the floor. +Цепь межу кандалов рвется, и они падают на пол. +The shackles force themselves around your limbs and click tightly! (+RestraintAdded) +Кандалы плотно обхватывают ваши конечности и вы слышите щелчок! (+RestraintAdded) +The shackles click seductively in your face... (DamageTaken) +Кандалы соблазнительно щелкают у вас перед носом... (DamageTaken) +The shackles dash to you! +Кандалы устремляются к вам! +Lurid Legbinder +Зловещий легбиндер +The legbinder unravels. +Легбиндер разрушается. +The legbinder zips itself around your legs and squeezes them together! (+RestraintAdded) +Легбиндер оборачивается вокруг ваших ног и сжимает их вместе! Вы слышите звук застегивающейся молнии! (+RestraintAdded) +The legbinder wraps around and squeezes your body! (DamageTaken) +Легбиндер обволакивает и сдавливает ваше тело! (DamageTaken) +Bratty Blindfold +Своевольная повязка на глаза +The blindfold floats to the floor. +Повязка на глазах падает на пол. +The blindfold buckles itself tightly around your head! (+RestraintAdded) +Повязка плотно застегивается вокруг вашей головы! (+RestraintAdded) +The blindfold crawls over your helpless face! (DamageTaken) +Повязка шлепает по вашему скованному лицу! (DamageTaken) +The blindfold dashes to you! +Повязка на глаза устремляются к вам! +Amorous Armbinder +Влюбчивый армбиндер +The armbinder flops to the floor. +Армбиндер падает на пол. +The armbinder slips itself around your arms and pushes your elbows together! (+RestraintAdded) +Армбиндер обвивается вокруг ваших рук и сводит ваши локти вместе! (+RestraintAdded) +The armbinder rubs itself all over your body! (DamageTaken) +Армбиндер сжимает ваше тело! (DamageTaken) +Stringent Straitjacket +Строгая смирительная рубашка +The straitjacket falls apart. +Смирительная рубашка распускается на ленты. +The straitjacket slips itself on over your head and pulls your arms close to your body! (+RestraintAdded) +Смирительная рубашка проходит через вашу голову и плотно прижимает ваши руки к телу! (+RestraintAdded) +The straitjacket squeezes you tightly! (DamageTaken) +Смирительная рубашка крепко сжимает вас! (DamageTaken) +Brusque Belt +Грубый пояс верности +The chastity belt falls to the floor with a clang. +Пояс верности со звоном падает на пол. +The chastity belt secures itself around your waist! (+RestraintAdded) +Пояс верности застегивается на вашей талии! (+RestraintAdded) +The chastity belt buzzes against your body alluringly! (DamageTaken) +Пояс целомудрия прижимается к вашему телу и начинает сильно вибрировать! (DamageTaken) +Yammering Yoke +Звенящее ярмо +The yoke falls to the floor with a loud clang. +С громким лязгом ярмо падает на землю. +The yoke clasps your arms tightly and forces them to the sides! (+RestraintAdded) +Ярмо плотно обхватывает ваши руки и разводит их в стороны! (+RestraintAdded) +The yoke makes alluring clicking noises! (DamageTaken) +Ярмо издает заманчивые щелкающие звуки! (DamageTaken) +Haughty Harness +Надменная сбруя +The harness unravels. +Сбруя распадается на ремни. +The harness buckles itself tightly around your body! (+RestraintAdded) +Ремни сбруи плотно застегивается вокруг вашего тела! (+RestraintAdded) +The harness dashes to you! +Сбруя устремляются к вам! +The harness wraps itself around your body and squeezes! (DamageTaken) +Сбруя обвивается вокруг вашего тела и затягивается! (DamageTaken) +Levitating Locks +Левитирующие замки +The locks and chains fall to the floor in a loud crash. +Замки и цепочки с грохотом падают на пол. +A lock clicks itself onto one of your restraints! (+RestraintAdded) +Замок защелкивается на одном из ваших ограничителей! (+RestraintAdded) +A chain locks itself in place on your body! (DamageTaken) +Цепочки с замками обвиваются вокруг вашего тела! (DamageTaken) +The lock dashes to you! +Замки устремляются к вам! +The floating locks and chains rub themselves across your body! (DamageTaken) +Левитирующие замки и цепочки трутся о ваше тело! (DamageTaken) +Masterful Lock +Искусный замок +The lock falls to the floor, disenchanted. +Замок падает на пол лишенный магии. +The Masterful Lock clicks seductively in your face! (DamageTaken) +Искусный замок соблазнительно щелкает у вас перед носом! (DamageTaken) +The Masterful Lock conjures a lock onto one of your restraints! (DamageTaken) +Искусный замок создает замок на одном из ваших ограничителей! (DamageTaken) +Conjured Gag +Сотворенный кляп +The conjured gag buckles itself in place and falls. +Сотворенный кляп сам по себе застегивается и падает на землю. +The gag wedges itself firmly in your mouth and buckles itself! (+RestraintAdded) +Кляп втискивается в ваш рот и застегивается вокруг вашей головы! (+RestraintAdded) +The gag rubs itself against you! (DamageTaken) +Кляп трется о ваше тело! (DamageTaken) +Learned Rope +Любопытная веревка +The learned rope untangles into a mess of rope. +Любопытная веревка запутывается в веревочный клубок. +The magic rope wraps itself intricately around your body! (+RestraintAdded) +Волшебная веревка замысловато обвивается вокруг вашего тела! (+RestraintAdded) +The rope dashes to you! +Веревка устремляется к вам! +The magic rope wriggles into your outfit! (DamageTaken) +Волшебная веревка вплетается в ваш наряд! (DamageTaken) +Unforseen Rope +Веревка-невидимка +The unforseen rope is gone... or is it? +Веревка-невидимка исчезла... правда исчезла? +The unforseen rope wraps itself clandestinely around your body! (+RestraintAdded) +Веревка-невидимка незаметно обвивается вокруг вашего тела! (+RestraintAdded) +The unforseen rope wriggles into your outfit! (DamageTaken) +Веревка-невидимка вплетается в ваш наряд! (DamageTaken) +Monster Rope +Веревка-монстр +The monster rope bundle collapses into a pile of ropes. +Верёвка-монстр падает и запутывается в веревочный клубок. +The magic rope wraps itself overwhelmingly around your body! (+RestraintAdded) +Волшебная веревка плотно обвивается вокруг вашего тела! (+RestraintAdded) +The magic rope wriggles into your outfit! (DamageTaken) +Волшебная веревка вплетается в ваш наряд! (DamageTaken) +Shock Witch +Громовая ведьма +The shock witch vanishes into a cloud of thunder, leaving behind a keyring. +Громовая ведьма исчезает в громовом облаке, оставляя после себя связку ключей. +The witch restrains you! (+RestraintAdded) +Ведьма сковывает вас! (+RestraintAdded) +The witch dangles a lock in front of you before putting it on! (DamageTaken) +Ведьма помахивает замочком, после чего прикрепляет его к вам! (DamageTaken) +The witch slaps you playfully! (DamageTaken) +Ведьма игриво шлепает вас! (DamageTaken) +Flame Witch +Огненная ведьма +The flame witch vanishes into a pile of ash. +Огненная ведьма исчезает, превращаясь в кучку пепла. +The witch restrains you! (+RestraintAdded) +Ведьма сковывает вас! (+RestraintAdded) +The witch dangles a lock in front of you before putting it on! (DamageTaken) +Ведьма помахивает замочком, после чего прикрепляет его к вам! (DamageTaken) +The witch slaps you playfully! (DamageTaken) +Ведьма игриво шлепает вас! (DamageTaken) +Earth Witch +Земляная ведьма +The earth witch vanishes into a pile of ash. +Земляная ведьма исчезает, превращаясь в кучку пепла. +The witch restrains you! (+RestraintAdded) +Ведьма сковывает вас! (+RestraintAdded) +The witch dangles a lock in front of you before putting it on! (DamageTaken) +Ведьма помахивает замочком, после чего прикрепляет его к вам! (DamageTaken) +The witch slaps you playfully! (DamageTaken) +Ведьма игриво шлепает вас! (DamageTaken) +Water Witch +Водяная ведьма +The water witch vanishes into a pile of ash. +Водяная ведьма исчезает, превращаясь в кучку пепла. +The witch restrains you! (+RestraintAdded) +Ведьма сковывает вас! (+RestraintAdded) +The witch dangles a lock in front of you before putting it on! (DamageTaken) +Ведьма помахивает замочком, после чего прикрепляет его к вам! (DamageTaken) +The witch slaps you playfully! (DamageTaken) +Ведьма игриво шлепает вас! (DamageTaken) +Aqua Witch +Ведьма вод +The aqua witch vanishes into a pile of ash. +Ведьма вод исчезает, превращаясь в кучку пепла. +The witch restrains you! (+RestraintAdded) +Ведьма сковывает вас! (+RestraintAdded) +The witch dangles a lock in front of you before putting it on! (DamageTaken) +Ведьма помахивает замочком, после чего прикрепляет его к вам! (DamageTaken) +The witch slaps you playfully! (DamageTaken) +Ведьма игриво шлепает вас! (DamageTaken) +Ice Witch +Ледяная ведьма +The ice witch vanishes into a pile of ash. +Ледяная ведьма исчезает, превращаясь в кучку пепла. +The witch restrains you! (+RestraintAdded) +Ведьма сковывает вас! (+RestraintAdded) +The witch dangles a lock in front of you before putting it on! (DamageTaken) +Ведьма помахивает замочком, после чего прикрепляет его к вам! (DamageTaken) +The witch slaps you playfully! (DamageTaken) +Ведьма игриво шлепает вас! (DamageTaken) +Magic Stone +Магический камень +Ice Bolt +Ледяной заряд +Waterblast +Водный взрыв +Rope Witch +Верёвочная ведьма +The rope witch retreats as her animated ropes chase her. +Веревочная ведьма отступает, а её оживлённые веревки начинают преследовать ее саму. +The witch restrains you! (+RestraintAdded) +Ведьма сковывает вас! (+RestraintAdded) +The witch dangles a lock in front of you before putting it on! (DamageTaken) +Ведьма помахивает замочком, после чего прикрепляет его к вам! (DamageTaken) +The witch slaps you playfully! (DamageTaken) +Ведьма игриво шлепает вас! (DamageTaken) +Magnet Witch +Магнитная ведьма +The witch is pulled away by an unseen force. +Незримая сила уносит ведьму прочь. +The witch's restraints fly out and attach themselves to you! (+RestraintAdded) +Ведьма выпускает в вашу сторону ограничители, которые сковывают вас. (+RestraintAdded) +The witch dangles a lock in front of you before putting it on! (DamageTaken) +Ведьма помахивает замочком, после чего прикрепляет его к вам! (DamageTaken) +The witch's lightning causes your body to tingle! (DamageTaken) +Молния ведьмы вызывает покалывание в вашем теле! (DamageTaken) +Mage's Apprentice +Ученица мага +The apprentice runs off and cries in a corner. +Ученица убегает и плачет в углу. +The apprentice animates restraints to wrap around you! (+RestraintAdded) +Ученица оживляет ограничители, чтобы натравить их на вас! (+RestraintAdded) +The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) +Ученица с улыбкой достаёт замок и защелкивает его на ваших ограничителях! (DamageTaken) +The apprentice slaps you playfully! (DamageTaken) +Ученица игриво вас шлепает! (DamageTaken) +Summoner's Apprentice +Ученица призывательницы +The apprentice runs off and cries in a corner. +Ученица убегает и плачет в углу. +The apprentice summons a restraint onto you! (+RestraintAdded) +Ученица призывает ограничители прямо на ваше тело! (+RestraintAdded) +The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) +Ученица с улыбкой достаёт замок и защелкивает его на ваших ограничителях! (DamageTaken) +The apprentice tickles you playfully! (DamageTaken) +Ученица игриво вас щекочет! (DamageTaken) +Witch's Apprentice +Ученица ведьмы +The witch's apprentice confidently admits defeat. +Ученица ведьмы уверенно признает свое поражение. +The witch's apprentice conjures magic bindings on you! (+RestraintAdded) +Ученица ведьмы создает на вас магические оковы! (+RestraintAdded) +The witch's apprentice smiles and summons a lock onto you! (DamageTaken) +Ученица ведьмы улыбается и призывает прямо на вас замок! (DamageTaken) +The witch's apprentice smiles as she squeezes your chest! (DamageTaken) +Ученица ведьмы улыбается, сжимая вашу грудь! (DamageTaken) +Latex Apprentice +Латексная ученица +The apprentice runs off and cries in a corner. +Ученица убегает и плачет в углу. +The apprentice attaches a sticky restraint! (+RestraintAdded) +Ученица достаёт липкие ограничители! (+RestraintAdded) +The apprentice nervously takes out a lock and makes you wear it! (DamageTaken) +Ученица с улыбкой достаёт замок и защелкивает его на ваших ограничителях! (DamageTaken) +The apprentice caresses you playfully! (DamageTaken) +Ученица игриво вас ласкает! (DamageTaken) +Chain Witch +Ведьма цепей +The chain witch vanishes into a pile of metal dust, leaving behind a keyring. +Ведьма цепей исчезает, превращаясь в кучку металлической пыли и оставляя после себя брелок для ключей. +The chain witch locks all of your restraints! +Ведьма цепей запирает все ваши ограничители! +The witch's bindings wrap themselves around you! (+RestraintAdded) +Ведьмины оковы обвиваются вокруг вас! (+RestraintAdded) +The chain witch tugs sensually at your restraints! (DamageTaken) +Ведьма цепей игриво дергает вас за ваши ограничители! (DamageTaken) +Metal Witch +Ведьма металла +The metal witch vanishes into a pile of metal dust, leaving behind a keyring. +Ведьма металла исчезает, превращаясь в кучку металлической пыли и оставляя после себя брелок для ключей. +The metal witch locks all of your restraints! +Ведьма металла запирает все ваши ограничители! +The metal's bindings wrap themselves around you! (+RestraintAdded) +Металлические оковы сами обвиваются вокруг вас! (+RestraintAdded) +The metal witch tugs sensually at your restraints! (DamageTaken) +Ведьма металла игриво дергает вас за ваши ограничители! (DamageTaken) +Slime Witch +Ведьма слизи +The slime witch vanishes into a pool of pink slime, leaving behind a keyring. +Ведьма слизи исчезает в луже розовой слизи, оставляя после себя связку ключей. +The witch touches her with her sticky grasp! (+RestraintAdded) +Ведьма прикасается к вам своими липкими ладонями! (+RestraintAdded) +The witch creates a magical lock made of hardened latex! (DamageTaken) +Ведьма создает волшебный замок из затвердевшего латекса! (DamageTaken) +The witch squeezes your body playfully! (DamageTaken) +Ведьма игриво лапает ваше тело! (DamageTaken) +'High' Wizard +'Высшая' волшебница +The wizard falls asleep. +Волшебница засыпает. +The wizard clips a restraint around your neck! (+RestraintAdded) +Волшебница застегивает ошейник на вашей шее! (+RestraintAdded) +The wizard clips a lock to your restraints! (DamageTaken) +Волшебница защелкивает замок на ваших ограничителях! (DamageTaken) +The wizard laughs maniacally as she tickles you! (DamageTaken) +Волшебница безумно смеется, щекоча вас! (DamageTaken) +FunGal +Зараженная спорами +The fun-gal retreats into the ground. +Заражённая спорами уходит под землю. +The fun-gal clips a restraint around your neck! (+RestraintAdded) +Заражённая спорами застегивает ошейник на вашей шее! (+RestraintAdded) +The fun-gal produces a magical lock on all your restraints! (DamageTaken) +Заражённая спорами создаете волшебные замки на всех ваших ограничителях! (DamageTaken) +The fun-gal rubs your chest with her long, slender fingers! (DamageTaken) +Заражённая спорами трёт вашу грудь своими длинными, тонкими пальцами! (DamageTaken) +Crystal Slash +Кристальный удар +Crystal Bolt +Кристальный заряд +Crystal Bolt +Кристальный заряд +Tailor +Швея +You rob the tailor! +Вы ограбили швею! +Student +Студентка +You rob the student! +Вы ограбили студентку! +Tactician +Тактик +You rob the tactician! +Вы ограбили тактика! +Informant +Информатор +You rob the informant! +Вы ограбили информатора! +Thug +Головорез +You rob the thug! +Вы ограбили головореза! +Antique Merchant +Торговка антиквариатом +You smash the antique merchant! +Вы разгромили торговку антиквариатом! +Blacksmith +Кузнец +You rob the blacksmith! +Вы ограбили кузнеца! +Armorer +Оружейница +You rob the armorer! +Вы ограбили оружейницу! +Bowyer +Лучница +You rob the bowyer! +Вы ограбили лучницу! +Not a Kidnapper +Не похитительница +You bring the kidnapper to justice! +Вы привлекаете похитительницу к ответственности! +Dressmaker +Портниха +The dressmaker storms out in a rage. +Портниха убегает со всех ног. +The dressmaker has you try on one of her new accessories! (+RestraintAdded) +Портниха заставляет вас примерить один из ее новых аксессуаров! (+RestraintAdded) +The dressmaker adds a lock 'just to complete the look, you know?' +Портниха добавляет замок 'просто для завершения образа, понимаешь?' +The dressmaker cuddles your helpless body~ (DamageTaken) +Портниха прижимает к себе ваше беспомощное тело~ (DamageTaken) +Nurse +Медсестра +The Nurse checks her notes and runs off. +Медсестра проверяет свои записи и убегает. +The Nurse tries to pacify this rowdy patient! (+RestraintAdded) +Медсестра пытается утихомирить буйного пациента! (+RestraintAdded) +The Nurse adds a lock to keep you from hurting the staff. +Медсестра добавляет замок, чтобы вы не причинили вреда персоналу. +The Nurse assures you it's going to be alright~ (DamageTaken) +Медсестра уверяет вас, что все будет хорошо~ (DamageTaken) +Librarian +Библиотекарь +The librarian gets angry and retreats. +Библиотекарь сердится и отступает. +The librarian shushes you as she brandishes a restraint! (+RestraintAdded) +Библиотекарь шикает на вас, размахивая ограничителем! (+RestraintAdded) +The librarian snaps her fingers and sends a lock flying at you! +Библиотекарь щелкает пальцем, и в вас летит замок! +The librarian whispers seductively into your ear! (DamageTaken) +Библиотекарь соблазнительно шепчет что-то вам на ухо! (DamageTaken) +Stone Door +Каменная дверь +The stone door crumbles! +Каменная дверь разрушается! +Steel Door +Стальная дверь +The stone door crumples inward! +Дверь проваливается внутрь! +Control Room Door +Дверь диспетчерской +The door flies open as the Dollmaker chuckles at you! +Дверь распахивается, и Кукольница смеется над вами! +Giant Mushroom +Гигантский гриб +The giant mushroom explodes into a cloud of spores!!! +Гигантский гриб взрывается облаком спор!!! +Army Mushroom +Гриб-армеец +The army mushroom explodes into a cloud of spores!!! +Гриб-армеец взрывается облаком спор!!! +The army mushroom spits spores into your face and ties you while you are distracted! (+RestraintAdded) +Гриб-армеец плюет спорами вам в лицо и связывает вас, пока вы отвлечены! (+RestraintAdded) +The army mushroom spits spores into your face and tries to tie you! +Гриб-армеец плюет спорами вам в лицо и пытается связать вас! +The army mushroom emits soporific spores! (DamageTaken) +Гриб-армеец выделяет споры со снотворным! (DamageTaken) +Delicious Mushroom +Вкусный гриб +The delicious mushroom explodes into a cloud of spores!!! +Вкусный гриб взрывается облаком спор!!! +The delicious mushroom tickles you silly! +Вкусный гриб щекочет вас до смеха! +The delicious mushroom tickles you silly! (DamageTaken) +Вкусный гриб щекочет вас до смеха! (DamageTaken) +Infected Mushroom +Зараженный гриб +The infected mushroom explodes into a cloud of spores!!! +Заражённый гриб взрывается облаком!!! +The infected mushroom gives you a crushing hug! +Зараженный гриб крепко обнимает вас! +The infected mushroom gives you a crushing hug! (DamageTaken) +Зараженный гриб крепко обнимает вас! (DamageTaken) +Jailer +Тюремщица +The jailer passes out and drops her possessions! +Тюремщица теряет сознание и роняет свои вещи! +The jailer locks your restraints! +Тюремщица запирает ваши ограничители! +The jailer places some restraints on you! (+RestraintAdded) +Тюремщица надевает на вас ограничители! (+RestraintAdded) +The jailer plays with you, groping and rubbing your body! +Тюремщица играет с вами, ощупывая и потирая ваше тело! +The guard checks your restraints to make sure they are secure. +Охрана проверяет ваши ограничители, чтобы убедиться, что они надежно заперты. +Guard +Охранница +The guard passes out and drops her possessions! +Охранница теряет сознание и роняет свои вещи! +The guard locks your restraints! +Охранница запирает ваши ограничители! +The jailer places some restraints on you! (+RestraintAdded) +Тюремщица надевает на вас ограничители! (+RestraintAdded) +The guard places a NewRestraintName on you +Охранница надевает на вас NewRestraintName +The guard plays with you, groping and rubbing your body! +Охранница играет с вами, ощупывая и потирая ваше тело! +Armed Guard +Вооруженная охранница +The armed guard retreats, but drops a keyring! +Вооруженная охранница отступает, но теряет связку ключей! +The guard locks your restraints! +Охранница запирает ваши ограничители! +The guard shocks you and slaps on some restraints! (+RestraintAdded) +Охранница бьёт вас электрошокером вас и надевает несколько ограничителей! (+RestraintAdded) +The guard shocks you with her taser!!! +Охранница бьёт вас своим электрошокером!!! +The guard shocks you with her taser!!! +Охранница бьёт вас своим электрошокером!!! +The EnemyName applies a NewRestraintName over your OldRestraintName +EnemyName надевает NewRestraintName поверх вашего OldRestraintName +The EnemyName removes your OldRestraintName +EnemyName удаляет ваш OldRestraintName +The EnemyName restrains you with a NewRestraintName +EnemyName надевает на вас NewRestraintName +Master Conjurer +Опытная созидательница +The conjurer retreats into a portal! +Опытная созидательница отступает в портал! +The master conjurer waves a hand, and locks appear on all your restraints! +Опытная созидательница взмахивает рукой, и на всех ваших ограничителях появляются замки! +The master conjurer summons a restraint directly onto you! +Опытная созидательница призывает ограничитель прямо на ваше тело! +The master conjurer tickles you playfully! +Опытная созидательница игриво вас щекочет! +Master Conjurer +Опытная созидательница +The conjurer retreats into a portal! +Опытная созидательница отступает в портал! +The master conjurer waves a hand, and locks appear on all your restraints! +Опытная созидательница взмахивает рукой, и на всех ваших ограничителях появляются замки! +The master conjurer summons a restraint directly onto you! +Опытная созидательница призывает ограничитель прямо на ваше тело! +The master conjurer tickles you playfully! +Опытная созидательница игриво вас щекочет! +Frog +Лягушка +The frog jumps away! +Лягушка упрыгивает прочь! +The frog pulls you with its tongue!!! +Лягушка притягивает вас своим языком!!! +The frog licks you! +Лягушка лижет вас! +Toad +Жаба +The toad jumps away! +Жаба упрыгивает прочь! +The toad pulls you with its tongue!!! +Жаба притягивает вас своим языком!!! +The toad licks you! +Жаба лижет вас! +Shadow Hand +Теневая рука +The shadow hand retreats into the darkness... +Теневая рука отступает в темноту... +The shadow hand latches onto you!! (+RestraintAdded) +Теневая рука вцепляется в вас!! (+RestraintAdded) +The shadow hand stretches its fingers across your body! (DamageTaken) +Теневая рука тянет пальцы к вашему телу! (DamageTaken) +A dark hand stretches out beyond the shadows... +Теневая рука тянется из тени... +Several dark hands emerge from the shadows! +Несколько теневых рук появляются из теней!! +Corrupted Adventurer +Падшая авантюристка +The corrupted adventurer falls into a deep sleep. +Падшая авантюристка погружается в глубокий сон. +The corrupted aventurer's many arms latch onto you! (+RestraintAdded) +Многочисленные руки падшей авантюристки вцепляются в вас! (+RestraintAdded) +The corrupted aventurer clicks a lock on from behind you! (DamageTaken) +Падшая авантюриста защелкивает замок за вашей спиной! (DamageTaken) +The corrupted adventurer drags her chilling fingers across your vulnerable skin! (DamageTaken) +Падшая авантюристка проводит своими леденящими пальцами по вашей уязвимой коже! (DamageTaken) +Shadowy Ghast +Теневой призрак +The shadowy ghast screeches and disappears... +Теневой призрак взвизгивает и исчезает... +The shadowy ghast latches onto you with its long arms! (+RestraintAdded) +Теневой призрак вцепляется в вас своими длинными руками! (+RestraintAdded) +The shadowy ghast grips you in its chilling embrace! (DamageTaken) +Теневой призрак заключает вас в свои леденящие душу объятия! (DamageTaken) +Corrupted Elemental +Оскверненный элементаль +The corrupted elemental dissolves into shadows. +Оскверненный элементаль растворяется в дымке. +The corrupted elemental reaches out and touches you, forming metallic restraints! (+RestraintAdded) +Оскверненный элементаль протягивает руку и касается вас, создавая металлические оковы! (+RestraintAdded) +The corrupted elemental uses its chains to lock your restraints! (DamageTaken) +Оскверненный элементаль использует свои цепи, чтобы запереть ваши ограничители! (DamageTaken) +The corrupted elemental grips you and drains your willpower! (DamageTaken) +Оскверненный элементаль +Star Demon +Звездный демон +The star demon is exorcised. +Звездный демон изгнан. +The star demon places you in shining, starry restraints. (+RestraintAdded) +Звездный демон заключает вас в сияющие звездные оковы. (+RestraintAdded) +The demon giggles as it locks your restraints! (DamageTaken) +Демон хихикает, запирая ваши ограничители! (DamageTaken) +The star demon places you under its curse! (DamageTaken) +Звездный демон накладывает на вас свое проклятие! (DamageTaken) +The strings of fate glisten and wrap around you! +Блестящие нити судьбы обвиваются вокруг вас! +Many shining strings surround you! +Вас опутывает множество сияющих нитей! +Stepping outside of the indicated tiles will result in punishment! +Выход за пределы указанных плиток приведет к наказанию! +Bindings of Fate +Путы Судьбы +Moon Demon +Лунный демон +The moon demon is exorcised. +Лунный демон изгнан. +The moon demon places you in shining, starry restraints. (+RestraintAdded) +Лунный демон заключает вас в сияющие звездные оковы. (+RestraintAdded) +The moon demon places you under its curse! (DamageTaken) +Лунный демон накладывает на вас своё проклятие! (DamageTaken) +The weight of inescapable bondage falls upon you! (DamageTaken) +На вас ложиться тяжесть неизбежного рабства! (DamageTaken) +The demon giggles as it locks your restraints! (DamageTaken) +Демон хихикает, запирая ваши ограничители! (DamageTaken) +Crushing Fate +Тяжесть Судьбы +Void Demon +Демон пустоты +The void demon is exorcised. +Демон пустоты изгнан. +The void demon places you in dark, glassy restraints. (+RestraintAdded) +Демон пустоты заключает вас в темные, стеклоподобные оковы. (+RestraintAdded) +The void demon places you under its curse! (DamageTaken) +Демон пустоты накладывает на вас свое проклятие! (DamageTaken) +You are sucked in by a powerful gravitational force!!! (DamageTaken) +Вас засасывает мощная гравитационная сила!!! (DamageTaken) +You are sucked in by a powerful gravitational force!!! +Вас засасывает мощная гравитационная сила!!! +The demon cracks its knuckles as it locks your restraints! (DamageTaken) +Демон щелкает костяшками пальцев, запирая ваши ограничители! (DamageTaken) +Cosmic Force +Космическая сила +Void Demon +Демон пустоты +The void demon is exorcised. +Демон пустоты изгнан. +The void demon places you in dark, glassy restraints. (+RestraintAdded) +Демон пустоты заключает вас в темные, стеклоподобные оковы. (+RestraintAdded) +The demon giggles as it locks your restraints! (DamageTaken) +Демон хихикает, запирая ваши ограничители! (DamageTaken) +The void demon places you under its curse! (DamageTaken) +Демон пустоты накладывает на вас свое проклятие! (DamageTaken) +Demon +Демон +The demon is exorcised. +Демон изгнан. +The demon places you in dark, glassy restraints. (+RestraintAdded) +Демон пустоты заключает вас в темные, стеклоподобные оковы. (+RestraintAdded) +The demon giggles as it locks your restraints! (DamageTaken) +Демон хихикает, запирая ваши ограничители! (DamageTaken) +The demon caresses you gently with her sharp nails! (DamageTaken) +Демон нежно поглаживает вас своими острыми ногтями! (DamageTaken) +The demon stuns you with her heavy mace! (+STUN) +Демон оглушает вас своей тяжелой булавой! (+STUN) +Tickle Hand +Щекочущая рука +The hand vanishes! +Рука исчезает! +The hand tickles you! (DamageTaken) +Рука щекочет вас! (DamageTaken) +Tickle Terror +Щекочущий Ужас +The tickle terror vanishes... for now +Щекочущий Ужас исчезает... на время. +The monstrous spirit tickles you mercilessly!!! (DamageTaken) +Дух-монстр безжалостно щекочет вас!!! (DamageTaken) +The monstrous spirit binds you to make you more vulnerable! (+RestraintAdded) +Дух-монстр связывает вас, чтобы сделать более уязвимой! (+RestraintAdded) +Hug Horror +Обнимающий Ужас +The hug horror vanishes... for now +Обнимающий Ужас исчезает... на время. +The monstrous spirit gives a crushing hug!!! (DamageTaken) +Дух-монстр заключает вас в сокрушительные объятия!!! (DamageTaken) +The monstrous spirit envelops you in tightness, holding you in place! (DamageTaken) +Дух-монстр крепко обхватывает вас, удерживая на месте! (DamageTaken) +The monstrous spirit's chains latch on! (+RestraintAdded) +Цепи духа-монстра защелкиваются на вас! (+RestraintAdded) +Greedy Ghast +Жадный вурдалак +The ghast vanishes... for now +Вурдалак исчезает... на время. +The moaning spirit runs its hands all across your body!!! (DamageTaken) +Стонущий дух проводит руками по всему вашему телу!!! (DamageTaken) +Tickle Hand +Щекочущая рука +The hand vanishes! +Рука исчезает! +The hand tickles you! (DamageTaken) +Рука щекочет вас! (DamageTaken) +Tome of Chains +Том Цепей +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +Tome of Belts +Том Ремней +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +Tome of Ropes +Том Веревок +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +Tome of Bondage +Том Бондажа +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +Tome of Light +Том Света +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +Tome of Magic +Том Магии +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +Tome of Ice +Том Льда +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +Tome of the Abyss +Том Бездны +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +Tome of Nature +Том Природы +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +Tome of Thunder +Том Грома +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +Tome of Latex +Том Латекса +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +Tome of Laughs +Том Смеха +The floating tome burns into ashes! +Левитирующий том сгорает дотла! +You are grabbed and led to a prison... +Вас захватывают и ведут в тюрьму... +Perhaps they may release you if you behave... +Возможно, они отпустят вас, если вы будете хорошо себя вести... +Necromancer +Некромант +The necromancer faints. Ironic that she couldn't save herself. +Некромант теряет сознание. Ирония судьбы в том, что она может спасти себя. +The necromancer locks all of your restraints! +Некромант запирает все ваши ограничители! +The necromancer prepares you for transport! +Некромант готовит вас к транспортировке! +The necromancer rubs your body sensually! +Некромант чувственно растирает ваше тело! +Filthy Rat +Грязная крыса +The rat skitters back into a hole in the wall. +Крыса юркнула обратно в дыру в стене. +The filthy rat nibbles at you! (DamageTaken) +Грязная крыса кусает вас! (DamageTaken) +Annoying Bat +Раздражающая летучая мышь +You stomp the bat into the ground to make sure it's dead. +Вы втаптываете летучую мышь в землю, чтобы убедиться, что она мертва. +The bat nibbles incessantly at you! (DamageTaken) +Летучая мышь изо всех сил кусает вас! (DamageTaken) +Pixie +Пикси +The pixie huffs and floats away. +Пикси фыркает и уплывает прочь. +The pixie tickles you with a feather! (DamageTaken) +Пикси щекочет вас перышком! (DamageTaken) +Orb of Light +Сфера Света +The orb vanishes in a flash of light. +Сфера исчезает во вспышке света. +The orb blinds you with its intense light!!! (DamageTaken) +Сфера ослепляет вас своим интенсивным светом!!! (DamageTaken) +A light restores the will of its allies! +Свет восстанавливает волю своих союзников! +You do not have enough resources to cast the spell! +У вас недостаточно маны, чтобы произнести заклинание! +AttackName hits TargetEnemy for DamageDealt DamageType damage! +AttackName по TargetEnemy наносит DamageDealt DamageType урона! +AttackName hits TargetEnemy for a decreased DamageDealt DamageType damage! +AttackName поражает TargetEnemy и наносит пониженный урон. Всего DamageDealt DamageType урона! +AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! +AttackName поражает TargetEnemy и наносит повышенный урон. Всего DamageDealt (DamageType) урона! +AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! +AttackName поражает TargetEnemy и наносит сокрушительные DamageDealt (DamageType) урона! +AttackName hits TargetEnemy, but your DamageType weapon has no effect! +AttackName поражает TargetEnemy, но ваше 'DamageType' оружие против него бесполезно! +AttackName hits TargetEnemy for DamageDealt DamageType damage!, reduced by an anti-magic ward! +AttackName по TargetEnemy наносит DamageDealt DamageType урона!, сниженного из-за антимагической защиты! +AttackName hits TargetEnemy for DamageDealt DamageType damage! +AttackName поражает TargetEnemy и наносит DamageDealt (DamageType) урона! +AttackName hits TargetEnemy for a reduced DamageDealt DamageType damage! +AttackName поражает TargetEnemy и наносит сниженный урон. Всего DamageDealt (DamageType) урона! +AttackName hits TargetEnemy but DamageType damage doesn't have any effect! +AttackName поражает TargetEnemy, но (DamageType) урон не оказывает никакого эффекта! +AttackName hits TargetEnemy for an increased DamageDealt DamageType damage! +AttackName поражает TargetEnemy и наносит повышенный урон. Всего DamageDealt (DamageType) урона! +AttackName hits TargetEnemy for DamageDealt DamageType damage, reduced by an anti-magic ward! +AttackName поражает TargetEnemy и наносит DamageDealt DamageType урона, сниженного из-за антимагической защиты! +AttackName hits TargetEnemy for a devastating DamageDealt DamageType damage! +AttackName поражает TargetEnemy и наносит сокрушительные DamageDealt (DamageType) урона! +Your attack +Ваша атака +An effect +Эффективно +You miss the TargetEnemy! +Вы промахиваетесь по TargetEnemy! +Your attack is too feeble to hurt the TargetEnemy! +Ваша атака слишком слаба, чтобы причинить вред TargetEnemy! +Your attack was absorbed by the TargetEnemy's shield! +Ваша атака была поглощена щитом TargetEnemy! +You try to pull the TargetRestraint off... +Вы пытаетесь снять TargetRestraint... +You try to squirm and moan out of the TargetRestraint... +Вы извиваетесь и стонете, пытаясь освободиться от TargetRestraint... +You tug on the TargetRestraint with increased power... +Вы с увеличенной силой дергаете TargetRestraint... +Your ally helps you try to pull the TargetRestraint off... +Ваш союзник помогает вам в попытках снять TargetRestraint... +You work on picking the TargetRestraint... +Вы пытаетесь вскрыть замок на TargetRestraint... +Your trembling hands work on picking the TargetRestraint... +Ваши дрожащие руки работают над вскрытием замка на TargetRestraint... +You work on picking the TargetRestraint with your powers... +Вы изо всех сил стараетесь вскрыть замок на TargetRestraint... +Your ally tries to pick the lock on your TargetRestraint... +Ваш союзник пытается вскрыть замок на TargetRestraint... +You try to pick open the TargetRestraint but break your lockpick. +Вы пытаетесь вскрыть замок на TargetRestraint, но ваша отмычка ломается. +You work on picking the TargetRestraint... +Вы пытаетесь вскрыть замок на TargetRestraint... +You work on picking the TargetRestraint... +Вы пытаетесь вскрыть замок на TargetRestraint... +Your trembling hands work on picking the TargetRestraint... +Ваши дрожащие руки работают над вскрытием замка на TargetRestraint... +You work on picking the TargetRestraint with your powers... +Вы изо всех сил стараетесь вскрыть замок на TargetRestraint... +Your ally tries to pick the lock on your TargetRestraint... +Ваш союзник пытается вскрыть замок на TargetRestraint... +You break your lockpick trying to open the TargetRestraint. +Вы ломаете свою отмычку, пытаясь вскрыть замок на TargetRestraint. +You try to remove the TargetRestraint... +Вы пытаетесь снять TargetRestraint... +You shakily try to remove the TargetRestraint... +Вы неуверенно пытаетесь снять TargetRestraint... +You try to remove the TargetRestraint with a tool... +Вы пытаетесь снять TargetRestraint с помощью инструмента... +Your ally helps you remove the TargetRestraint... +Ваш союзник помогает вам снять TargetRestraint... +You try to cut the TargetRestraint... +Вы пытаетесь разрезать TargetRestraint... +You tremble as you try to cut the TargetRestraint... +Дрожащими руками, вы пытаетесь разрезать TargetRestraint... +You try to cut the TargetRestraint using your tools... +Вы пытаетесь разрезать TargetRestraint с помощью инструментов... +You try to cut the TargetRestraint with help... +С помощью извне, вы пытаетесь разрезать TargetRestraint... +You break your knife trying to cut the TargetRestraint. +Вы ломаете свой нож, пытаясь разрезать TargetRestraint. +You try to cut the TargetRestraint... +Вы пытаетесь разрезать TargetRestraint... +You fiddle with the key on the TargetRestraint... +Вы пытаетесь провернуть ключ в замке на TargetRestraint... +Your jittering hands fumble with the key on the TargetRestraint... +Ваше дрожащие руки пытаются удержать ключ, пока вы открываете замок на TargetRestraint... +You concentrate on unlocking the TargetRestraint... +Вы концентрируетесь на открытии замка на TargetRestraint... +You work on unlocking the TargetRestraint with help... +С помощью извне, вы пытаетесь разблокировать замок на TargetRestraint... +You fiddle with the key on the TargetRestraint... +Вы пытаетесь провернуть ключ в замке на TargetRestraint... +The lock requires a key. +Для открытия этого замка требуется ключ. +The lock requires a key. +Для открытия этого замка требуется ключ. +The lock requires a key. +Для открытия этого замка требуется ключ. +The lock requires a key. +Для открытия этого замка требуется ключ. +The lock can only be opened with a key. +Этот замок может быть открыт только ключом. +The lock requires a key. +Для открытия этого замка требуется ключ. +The magical lock only accepts magical keys and can't be picked. +Волшебный замок можно открыть только магическим ключом. Отмычки бесполезны. +The magical lock is guarded with powerful magic. You'll have to wait for it to wear off... +Волшебный замок защищён могущественной магией. Вам придется подождать, пока чары исчезнут... +The item is cybernetically locked. You will need a key card to unlock it. +Предмет заблокирован с помощью технологий. Для его разблокировки вам понадобится ключ-карта. +The item is cybernetically locked. You will need a key card to unlock it. +Предмет заблокирован с помощью технологий. Для его разблокировки вам понадобится ключ-карта. +The item is cybernetically locked. You will need a key card to unlock it. +Предмет заблокирован с помощью технологий. Для его разблокировки вам понадобится ключ-карта. +This lock requires a command word to unlock. It doesn't have a keyhole. +Для разблокировки этого ограничителя требуется командное слово. В нём нет замочной скважины. +You don't have a key for this lock. +У вас нет ключа от этого замка. +The lock seems to be magical and rejects all picking attempts! +Судя по всему, это волшебный замок, который невозможно взломать! +The lock is definitely magical and forces your pick out! +Этот замок определенно волшебный, он выталкивает все отмычки! +The lock is divine. A mortal shouldn't even try to pick it. +Этот замок божественный. Смертные не должны даже пытаться взломать его. +You must perform your quest! Don't even think of unlocking it... +Вы должны выполнить свое задание! Даже не думайте о том, чтобы отпереть это... +The lock is divine. A mortal shouldn't even try to pick it. +Этот замок божественный. Смертные не должны даже пытаться взломать его. +You're not sure a key for this even exists in the mortal realm. +Вы не уверены, что ключ от него вообще существует в мире смертных. +The lock is made of solid rubber. You can't pick that. +Замок сделан из твердой резины. Вы не сможете взломать его. +You need something sharp to cut the lock. +Вам нужно что-нибудь острое, чтобы срезать замок. +The lock doesn't even have a keyhole to pick! +В этом замке даже нет замочной скважины, в которую можно было бы вставить ключ! +You need a special tool to pick this kind of lock. +Вам нужен специальный инструмент, чтобы вскрыть замок этого типа. +The lock is technological and does not use a key. +Замок является технологичным и не поддерживает использования ключа. +The lock is technological and does not use a key. +Замок является технологичным и не поддерживает использования ключа. +The lock is technological and does not use a key. +Замок является технологичным и не поддерживает использования ключа. +The lock is brimming with security features and is nigh impossible to pick! +Замок оснащен множеством защитных элементов, и взломать его практически невозможно! +The lock is encased in magical crystals that block the keyhole. +Замок помещен в магический кристалл, которые блокирует замочную скважину. +Your distraction makes the crystals regrow immediately after breaking them off. +Ваше возбуждение заставляет кристаллы вырасти снова сразу же после того, как вы их отламываете. +The crystal fragments in the lock make it difficult to pick. +Осколки кристаллов в замке затрудняют вскрытие. +You need a key to actually unlock the ex-crystallized lock. +Вам нужен ключ, чтобы окончательно отпереть ранее кристаллизованный замок. +The key sticks in the lock and jams, mangling the key! +Ключ застревает в замке и тот заклинивает, сгибая ключ! +You unlock the TargetRestraint. +Вы разблокируете замок на TargetRestraint. +You manage to squeeze out of the TargetRestraint! +Вам удаётся вывернуться из TargetRestraint! +You pick the lock on the TargetRestraint! +Вы вскрываете замок на TargetRestraint! +You pick the lock on the TargetRestraint! +Вы вскрываете замок на TargetRestraint! +You free yourself from the TargetRestraint! +Вы освобождаетесь от TargetRestraint! +You damage the TargetRestraint enough to escape! +Достаточно повредив TargetRestraint, у вас получается освободится! +The TargetRestraint is destroyed by your attempts. +TargetRestraint разрушается под вашим натиском. +The TargetRestraint comes off before taking serious damage. +TargetRestraint снимается до получения серьезного урона. +This is as far as you can struggle. You'll have to remove the TargetRestraint some other way. +Дальнейшие попытки бороться с этим ограничителем тщетны. Вам придется снять TargetRestraint другим способом. +The item is too tight. You'll need to loosen the TargetRestraint somehow first... +Ограничитель TargetRestraint слишком тугой. Сначала нужно как-нибудь его ослабить... +The item is to tight to get your tool into position. You'll have to first make the TargetRestraint looser. +Огран. TargetRestraint слишком туго затянут, вы не можете ему противостоять. Сначала вам нужно как-нибудь его ослабить. +You can't quite get your pick into position. Maybe if you loosened the TargetRestraint first... +Вы не можете точно установить отмычку в нужном положении. Возможно, если бы вы сначала ослабили TargetRestraint... +The TargetRestraint's lock is tucked in securely under straps. You'll have to get it out from under there... +Замок на TargetRestraint надежно спрятан под ремнями. Вам нужно как-то достать его оттуда... +After many failed attempts to unlock the TargetRestraint, you realize this lock is more than you can handle. +После многих неудачных попыток разблокировать замок на TargetRestraint, вы осознаете, что с этим замком вам не справиться. +You can feel some ply but can't quite make any progress against the TargetRestraint... +Вы чувствуете некоторые подвижки, но не можете достичь какого либо видимого прогресса в борьбе с TargetRestraint... +The TargetRestraint's mechanism lies barely out of reach... +Механизм ограничителя TargetRestraint находится вне вашей досягаемости... +Your tool leaves only a scratch against the TargetRestraint... +Ваше инструмент оставляет лишь царапину на TargetRestraint... +The lock on the TargetRestraint is just above your skill level... +Замок на ограничителе TargetRestraint находится за гранью вашего мастерства... +The keyholes on the TargetRestraint are just barely out of reach... +Вы не можете достать до замочной скважине на TargetRestraint... +You unlock the TargetRestraint and sigh with relief. +Вы разблокируете замок на TargetRestraint и с облегчением вздыхаете. +You give out a huge moan as you squeeze out of the TargetRestraint! +Вы издаете громкий стон, когда вырываетесь из TargetRestraint! +You pick the lock on the TargetRestraint with a sigh of relief! +Вы взламываете замок на TargetRestraint и с облегчением вздыхаете! +You pick the lock on the TargetRestraint with a sigh of relief! +Вы взламываете замок на TargetRestraint и с облегчением вздыхаете! +Trembling, you free yourself from the TargetRestraint! +Вздрагивая, вы освобождаете себя от TargetRestraint! +You damage the TargetRestraint enough to wiggle out! +Вы наносите достаточный урон TargetRestraint и получаете возможность выпутаться! +You stick the knife into a crack in the wall! +Вы втыкаете нож в трещину на стене! +You use your feet to place the knife into a crack! +Вы используете свои ноги, чтобы засунуть нож в трещину! +You glare at the crack in the wall as you realize you couldn't maneuver the knife if you tried. +Вы пристально смотрите на трещину в стене, понимая, что не смогли бы вставить туда нож, даже если бы попытались. +You can't hold your knife like this... +Вы так не можете удержать свой нож... +The TargetRestraint is too secure to struggle out. +Ограничитель TargetRestraint слишком надёжен, вы не сможете из него так просто выбраться. +You groan in frustration as you realize the TargetRestraint is too tight to escape. +Вы стонете от разочарования, когда понимаете, что ограничитель TargetRestraint слишком тугой, чтобы из него выбраться. +The TargetRestraint tightens itself as you try to squeeze out! +Ограничитель TargetRestraint становится ещё туже, когда вы пытаетесь с ним бороться! +You will need someone's help to squeeze out of the TargetRestraint. +Вам понадобится чья-нибудь помощь, чтобы освободиться от TargetRestraint. +The TargetRestraint flashes magically as the Goddess' curse resists your efforts! +TargetRestraint вспыхивает магией, проклятие Богини противостоит вашим усилиям! +The TargetRestraint holds firm against your attempts, held back by your restrictions. +TargetRestraint стойко противостоит вашим попыткам, удерживаясь вашими ограничителями. +You pull and tug but your other restraints keep the TargetRestraint securely in place! +Вы тянете и дергаете, но другие ваши ограничители надежно фиксируют TargetRestraint на месте! +You groan and tug but nothing budges on the TargetRestraint. You're bound too tightly by something else. +Вы стонете и тянете, но не можете сдвинуть TargetRestraint ни на дюйм. Другой туго затянутый ограничитель мешает вам. +You are too tightly bound to have a chance against the TargetRestraint. +Вы слишком крепко связаны, чтобы иметь шанс противостоять TargetRestraint. +You shake and moan as you realize your struggles against the TargetRestraint are futile. +Вы дрожите и стонете, когда понимаете, что ваша борьба с TargetRestraint тщетна. +You can't find a keyhole on the TargetRestraint! +Вы не можете найти замочную скважину у TargetRestraint! +You sigh as you give up trying to find any kind of keyhole on the TargetRestraint. +Вы вздыхаете, отказываясь от попыток найти какую-либо замочную скважину у TargetRestraint. +The TargetRestraint can't be unlocked without a special command! +TargetRestraint не может быть разблокировано без специальной команды! +You can't reach the keyhole on the TargetRestraint by yourself! +Вы не сможете самостоятельно добраться до замочной скважины на TargetRestraint! +You can't hold the key to unlock the TargetRestraint with. +Вы не можете удержать ключ, чтобы отпереть замок на TargetRestraint. +Your bound and shaking hands can't even hold the key for the TargetRestraint. +Ваши связанные и трясущиеся руки не могут даже удержать ключ, а не то что открыть замок на TargetRestraint. +The goddess punishes you for trying to unlock the TargetRestraint! +Богиня наказывает вас за попытку открыть замок на TargetRestraint! +You are too restricted to get the key into place! +Вы слишком ограничены в действиях, чтобы вставить ключ! +You try, but something is keeping your hands away from the TargetRestraint. +Вы пытаетесь, но что-то удерживает ваши руки далеко от TargetRestraint. +You flail the key around uselessly but a strap is preventing you from unlocking the TargetRestraint! +Вы бесполезно размахиваете ключом, но ремень мешает вам отпереть замок на TargetRestraint! +This lock on the TargetRestraint is beyond your skill level! +Замок на TargetRestraint находится за пределами вашего мастерства! +You whimper as you realize the lock on the TargetRestraint is far too secure. +Вы хнычете, когда понимаете, что замок на TargetRestraint слишком надёжен. +There is no visible locking mechanism on the TargetRestraint. +Вы не видите блокирующего механизма на TargetRestraint. +You can't pick the TargetRestraint by yourself, you'll need help. +Вы не можете взломать замок на TargetRestraint самостоятельно, вам нужна помощь. +You can't maneuver the lockpick well enough to unlock the TargetRestraint. +Вы не можете достаточно хорошо управлять отмычкой, чтобы отпереть замок на TargetRestraint. +You let out a frustrated sigh as your quivering pick makes no progress on the TargetRestraint. +Вы разочарованно вздыхаете, когда ваша дрожащая отмычка не даёт никакого прогресса во взломе замка на TargetRestraint. +You try to start picking, but the lock on the TargetRestraint is secured by something else. +Вы пытаетесь начать взлом, но замок на TargetRestraint чем-то защищён. +You whimper as you realize the lock on the TargetRestraint is shielded by another strap. +Вы хнычете, когда понимаете, что замок на TargetRestraint защищён другим ремнём. +You are distracted from the TargetRestraint by mental images of yourself remaining in bondage... +Вы отвлекаетесь от TargetRestraint, когда в вашей голове возникают образы вас, остающейся в бондаже... +Your restrictions ruin your dexterity. You can't pick the TargetRestraint. +Ваши ограничители снижают вашу ловкость. Вы не можете взломать TargetRestraint. +You wiggle uselessly in the TargetRestraint. Maybe you need some kind of tool... +Вы без толку извиваетесь в TargetRestraint. Может быть, вам поможет какой-нибудь инструмент... +You rub your body against the floor to no avail, and sigh as the TargetRestraint stays secure. +Вы безрезультатно третесь всем телом об пол и вздыхаете, когда ограничитель TargetRestraint остаётся на месте. +You contort your body but you don't have leverage on the TargetRestraint. Maybe you need some kind of tool... +Вы всем телом извиваетесь, но у вас нет рычагов воздействия на TargetRestraint. Может быть, вам поможет какой-нибудь инструмент... +You struggle madly, trying to push against the TargetRestraint. You need more leverage... +Вы яростно боретесь, пытаясь сорвать с себя TargetRestraint. Ваш нужно больше рычагов воздействия... +That doesn't seem to work. Maybe something else will help with the TargetRestraint. +Похоже, это не работает. Может быть что-нибудь ещё сможет вам помочь с TargetRestraint. +You squirm helplessly against the furniture. Maybe something else will help with the TargetRestraint. +Вы беспомощно трётесь о мебель. Может быть что-нибудь ещё сможет вам помочь TargetRestraint. +You twist your body trying to use the furniture, but it doesn't seem to work. The TargetRestraint remains tight. +Вы извиваетесь, трясь о мебель, но, похоже, это не работает. Ограничитель TargetRestraint остаётся таким же тугим. +You wiggle and squirm, trying to use the furniture to no avail. The TargetRestraint remains tight. +Вы ерзаете и извиваетесь, безуспешно пытаясь воспользоваться мебелью. Ограничитель TargetRestraint остаётся таким же тугим. +You need something sharper to get at the TargetRestraint. +Вам нужно что-то более острое, чтобы добраться до TargetRestraint. +This is not a job for your trembling fingers right now. +Сейчас это работа не для ваших дрожащих пальцев. +Tugging on the TargetRestraint is useless. Maybe if you had something sharp... +Дергать за TargetRestraint бесполезно. Может быть, если бы у вас было что-нибудь острое... +You sigh as the TargetRestraint resists all your attempts at breaking through. +Вы вздыхаете, ибо TargetRestraint сопротивляется всем вашим попыткам вырваться. +You fidget with the TargetRestraint but can't reach the clasps without some kind of edge. +Вы вертитесь в TargetRestraint, но не можете добраться до застежки без какого-нибудь угла. +You flail about but your hands are unable to reach the TargetRestraint. +Вы машете руками, но не можете дотянуться до TargetRestraint +You can't reach the clasps on the TargetRestraint. If only you had some other way... +Вы не можете дотянуться до застежек на TargetRestraint. Если бы только у вас был какой-нибудь другой способ... +You squirm around, rubbing the TargetRestraint against the smooth floor to no avail... +Вы извиваетесь, безрезультатно истирая TargetRestraint о гладкий пол... +The knots on the TargetRestraint are too tight to pull apart without a hook. +Узлы на TargetRestraint слишком тугие, чтобы их можно было развязать без крючка. +You struggle fruitlessly against the knots on the TargetRestraint, but they're too tight. +Вы безуспешно боретесь с узлами на TargetRestraint, но они слишком тугие. +The TargetRestraint is too tight against your body. You'll need more leverage to pull it off. +TargetRestraint слишком плотно прилегает к вашему телу. Вам понадобится больше рычагов воздействия, чтобы стянуть его. +You shake yourself around trying to rub off the TargetRestraint, but it's hopeless. +Вы трясете своим телом, пытаясь избавиться от TargetRestraint, но это бесполезно. +You need more grip to peel off the TargetRestraint... +Вам нужно лучшее сцепление, чтобы стянуть TargetRestraint... +Your trembling hands cant grip anything as they are, let alone undo the TargetRestraint. +Ваши дрожащие руки сейчас не могут ничего ухватить, не говоря уже о том, чтобы разобраться с TargetRestraint. +You need more grip to peel off the TargetRestraint... +Вам нужно лучшее сцепление, чтобы стянуть TargetRestraint... +You rub yourself against the floor to no avail... +Вы третесь о пол, но безрезультатно... +The fastenings are too tight and secure on the TargetRestraint! +Застёжки слишком тугие и очень надежно закреплены на TargetRestraint! +You roll around tryng to loosen the TargetRestraint to no avail. +Вы катаетесь по полу, пытаясь ослабить TargetRestraint, но безрезультатно. +The TargetRestraint tightens itself as you try to undo it! +TargetRestraint становится ещё туже, когда вы пытаетесь его оттянуть! +You can't reach the TargetRestraint by yourself! +Вы не можете самостоятельно достать до TargetRestraint! +You are too tightly bound to manipulate the TargetRestraint. +Вы слишком крепко связаны, чтобы как-то воздействовать на TargetRestraint. +Your futile struggles do nothing to loosen the fasteners on the TargetRestraint. +Ваши тщетные усилия никак не помогут ослабить застёжки на TargetRestraint. +You try to undo the fasteners on the TargetRestraint, but they are blocked by other straps! +Вы пытаетесь расстегнуть застежки на TargetRestraint, но они заблокировать другими ремнями! +You rub your body uselessly as you find another strap securing the TargetRestraint. +Вы извиваетесь, пока не находите другую застёжку на TargetRestraint. +You feel the Goddess' hand keeping the TargetRestraint tightly secured! +Вы чувствуете руку Богини, которая удерживает TargetRestraint надёжно запертым! +The TargetRestraint is too well-secured to take off with your level of restriction. +TargetRestraint слишком надежно закреплено, чтобы его можно было снять с вашим уровнем ограничения. +The TargetRestraint is too durable to cut. +Ограничитель TargetRestraint слишком прочный, чтобы его можно было разрезать. +Your hopeless attempts fail to even leave a scratch on the TargetRestraint. +Ваши безнадежные попытки не оставляют даже царапины на TargetRestraint. +You fail to leave even a scratch on the TargetRestraint! +Вам не удастся оставить даже царапины на TargetRestraint! +You can't get any leverage to cut the TargetRestraint with... +Вы не можете найти никаких рычагов, с помощью которых можно было бы ослабить TargetRestraint... +You can't hold the knife firmly enough to cut the TargetRestraint. +Вы не можете достаточно крепко удерживать нож, чтобы разрезать TargetRestraint. +You cry out in your bindings as the knife bounces against the TargetRestraint uselessly. +Вы плачете в своих оковах, когда нож бесполезно отскакивает от TargetRestraint. +Your arms are kept from having leverage on the TargetRestraint due to another item. +Ваши руки не имеют рычагов воздействия на TargetRestraint из-за другого предмета. +You fiddle with the tool, but your arms lack leverage on the TargetRestraint due to another item +Вы возитесь с инструментом,но вашим рукам не хватает рычага для воздействия на TargetRestraint из-за другого предмета. +The TargetRestraint flashes magically as the Goddess' curse resists your efforts! +TargetRestraint вспыхивает магией, проклятие Богини противостоит вашим усилиям! +Your restrictions limit your cutting power, unable to hurt the TargetRestraint. +Из-за ограничения возможностей ваша способность к разрезанию снижается,вы не можете повредить TargetRestraint. +You pry at the TargetRestraint... +Вы дёргаете за TargetRestraint... +You moan as the TargetRestraint squeeze you tightly... +Вы стонете, когда TargetRestraint сжимается ещё сильнее... +There's no way the TargetRestraint are just letting go! +Нет никакого способа легко избавиться от TargetRestraint! +You whimper as you realize the TargetRestraint won't let go no matter what... +Вы хнычите, понимая, что TargetRestraint не отпустит вас, не смотря ни на что... +You hear dark laughter as you realize the TargetRestraint won't let go... +Вы слышите мрачный смех, когда понимаете, что TargetRestraint никуда не денется... +You hear a dark giggle as fruitlessly try to wiggle free from the TargetRestraint! +Вы слышите мрачное хихиканье, пока безуспешно пытаетесь освободиться от TargetRestraint! +You try to pull away from the TargetRestraint! +Вы пытаетесь сорвать с себя TargetRestraint! +You blush and try to escape the TargetRestraint's grip! +Вы краснеете, пытаясь вырваться из хватки ограничителя TargetRestraint! +The TargetRestraint's grip is too strong... +Хватка ограничителя TargetRestraint слишком сильна... +The TargetRestraint's grip is too strong... it's hopeless. +Хватка ограничителя TargetRestraint слишком сильна... Всё бесполезно. +You're bound too tight to have a chance at shaking off the TargetRestraint. +Вы слишком крепко связаны, чтобы чтобы у вас был шанс избавиться от TargetRestraint. +You whimper as you give up struggling against the TargetRestraint. +Вы плачете, поняв безнадежность борьбы с TargetRestraint. +You wiggle around trying to get the TargetRestraint out... +Вы извиваетесь, пытаясь вытащить TargetRestraint... +You squirm around trying to dislodge the TargetRestraint... +Вы извиваетесь, пытаясь сместить TargetRestraint... +The TargetRestraint is in too deeply, it won't come out. +Предмет TargetRestraint засел слишком глубоко, он не выйдет наружу. +You feel the TargetRestraint slide around inside but it won't come out! +Вы чувствуете, как TargetRestraint скользит внутри, но не выходит наружу! +Your bondage keeps the TargetRestraint firmly in place. +Ваши ограничители надежно удерживают TargetRestraint на месте. +Your struggling does nothing but shift the TargetRestraint's position inside of you. +Ваша борьба не приводит ни к чему, кроме смещения TargetRestraint внутри вас. +You wiggle around trying to get the TargetRestraint out... +Вы извиваетесь, пытаясь вытащить TargetRestraint... +You squirm around trying to dislodge the TargetRestraint... +Вы извиваетесь, пытаясь сместить TargetRestraint... +The TargetRestraint won't come out. +TargetRestraint никак не выходит наружу. +You feel the TargetRestraint slide around but it won't come out! +Вы чувствуете, как TargetRestraint скользит по кругу, но никак не выйдет наружу! +Your bondage keeps the TargetRestraint secure in place. +Ваши ограничители более чем надежно удерживают TargetRestraint на месте. +Your struggling does nothing to dislodge the TargetRestraint. +Ваша борьба никак не помогает вытеснить TargetRestraint. +You work to unlace the TargetRestraint... +Вы работаете над тем, чтобы развязать TargetRestraint... +You hurriedly try to unlace the TargetRestraint... +Вы поспешно пытаетесь развязать TargetRestraint... +The TargetRestraint has no laces to loosen! +У TargetRestraint нет шнуровки, которую можно было бы ослабить! +You sigh as you can't find any laces to loosen on the TargetRestraint. +Вы вздыхаете, потому что не можете найти на TargetRestraint шнуровку, которые можно было бы ослабить. +The laces of the TargetRestraint are tied tight! +Шнуровка TargetRestraint туго затянута! +You hopelessly try to untie the lacing on the TargetRestraint, but it's just too tight! +Вы безуспешно пытаетесь развязать шнуровку на TargetRestraint, она слишком тугая! +You grasp at the TargetRestraint, trying to peel it off... +Вы хватаетесь за ограничитель TargetRestraint, пытаясь стянуть его... +You wiggle madly as you try to peel off the TargetRestraint! +Вы безумно извиваетесь, пытаясь стянуть TargetRestraint! +The TargetRestraint reforms as you scoop it away! +TargetRestraint преобразуется, когда вы пытаетесь его стянуть! +You can't get the TargetRestraint off at all! +Вы никак не можете снять TargetRestraint! +The TargetRestraint is too fast at reforming! +TargetRestraint слишком быстро преобразуется! +The TargetRestraint reforms too quickly as you try to squirm it off... +Ограничитель TargetRestraint слишком быстро преобразуется, когда вы пытаетесь из него вывернуться... +You grasp around, looking for a seam on the TargetRestraint... +Вы ощупываете TargetRestraint в поисках швов... +You wiggle and squirm, looking for something to pull at on the TargetRestraint... +Вы ерзаете и извиваетесь, ища, за что бы потянуть TargetRestraint... +The TargetRestraint encases you in a solid layer! +TargetRestraint покрывает вас одним цельным слоем! +Try as you might, the TargetRestraint hugs you completely without any seams! +Как бы вы ни старались, TargetRestraint полностью покрывает ваше тело, без каких-либо швов! +The TargetRestraint is too tight to get any traction... +TargetRestraint сидит слишком туго, его невозможно оттянуть.... +The TargetRestraint squeezes your body too tightly to get any sort of ply... +TargetRestraint слишком сильно сжимает ваше тело, вы не можете найди ни единой складки... +You start peeling off the TargetRestraint... +Вы пытаетесь разорвать TargetRestraint... +You scratch at the TargetRestraint furiously... +Вы яростно царапаете TargetRestraint... +The TargetRestraint clings to your skin too tightly! +TargetRestraint слишком плотно прилегает к вашей коже! +You groan in frustration as you try to peel the TargetRestraint off but realize it's too sticky. +Вы стонете от разочарования, пытаясь снять TargetRestraint, но понимаете, что оно прилипло слишком крепко. +You can't grip the edges to peel the TargetRestraint off! +Вы не можете схватиться за углы, чтобы снять TargetRestraint! +You make a futile attempt to rub the TargetRestraint off. +Вы предпринимаете тщетную попытку стянуть TargetRestraint. +You try to wiggle off the TargetRestraint... +Вы раскачиваете TargetRestraint, пытаясь снять его... +You squirm trying to get the TargetRestraint to fall off... +Вы извиваетесь, пытаясь снять TargetRestraint... +The TargetRestraint are magical and wrap themselves back around you of their own accord. +Ограничитель TargetRestraint зачарован и вновь самостоятельно оборачиваются вокруг вас. +The TargetRestraint squeeze you tighter as you try to shake them off. +Ограничитель TargetRestraint затягивается еще крепче, когда вы пытаетесь расшатать его. +The TargetRestraint have you bound hopelessly tight! +Ограничитель TargetRestraint слишком туго на вас сидит, это безнадёжно! +You sigh and moan as the TargetRestraint aren't getting any looser. +Вы вздыхаете и постанываете, поскольку TargetRestraint не ослабевает ни на йоту. +You look around for a fastener on the TargetRestraint... +Вы ищете застежку на TargetRestraint... +Shivering, you look for a fastener on the TargetRestraint... +Дрожа, вы ищете застежку на TargetRestraint... +The TargetRestraint has no fastener!!! +На TargetRestraint нет застежки!!! +The TargetRestraint is sealed around your body, with no fasteners to speak of! +TargetRestraint герметично облегает ваше тело, и о застежках не может быть и речи! +The TargetRestraint is firmly sealed around your body. +TargetRestraint полностью герметично облегает ваше тело. +You are sealed in ice. There is no escape. +Вы запечатаны во льду. Выхода нет. +You try to untie the TargetRestraint... +Вы пытаетесь развязать TargetRestraint... +You contort yourself trying to reach the knots on the TargetRestraint... +Вы извиваетесь, пытаясь дотянуться до узлов на TargetRestraint... +The TargetRestraint's knot ties itself back again as soon as you get it loose! +Ограничитель TargetRestraint снова завязывается сам собой, как только вы его ослабляете! +The knots tighten themselves as soon as you reach them, keeping you trapped in the TargetRestraint. +Узлы затягиваются сами собой, как только вы дотягиваетесь до них, удерживая вас в TargetRestraint. +You can't reach the knots on the TargetRestraint! +Вы не можете дотянуться до узлов на TargetRestraint! +Your squirming is in vain as you can't even reach the knots on the TargetRestraint. +Вы напрасно извиваетесь, так как даже так вы не можете дотянуться до узлов на TargetRestraint. +You try to pull off the TargetRestraint... +Вы пытаетесь стянуть TargetRestraint... +You tug on your TargetRestraint trying to get them off! +Вы дергаете за ограничитель TargetRestraint, пытаясь его снять! +That would really hurt... +Это было бы действительно больно... +You realize that would really hurt... +Вы осознаете, что это было бы действительно больно... +The TargetRestraint tug on your nipples as you squirm! +TargetRestraint тянет за ваши соски, когда вы извиваетесь! +The TargetRestraint tug on your nipples as you squirm! +TargetRestraint тянет за ваши соски, когда вы извиваетесь! +You paw at the TargetRestraint from inside, hoping to find an opening... +Вы ощупываете TargetRestraint изнутри, надеясь найти выход... +You flail around inside the TargetRestraint... +Вы мечетесь внутри TargetRestraint... +The TargetRestraint is completely seamless! +TargetRestraint полностью герметичен! +The TargetRestraint is completely seamless! This is hopeless. +TargetRestraint полностью герметичен! Это безнадежно. +You are too weak to poke your hand through the TargetRestraint... +Вы слишком слабы, чтобы проткнуть TargetRestraint рукой... +You are too weak to poke your hand through the TargetRestraint... +Вы слишком слабы, чтобы проткнуть TargetRestraint рукой... +You stretch yourself out inside the TargetRestraint! +Вы растягиваете собой TargetRestraint! +You bounce around inside the TargetRestraint! +Вы подпрыгиваете внутри TargetRestraint! +The TargetRestraint stretches to accomodate your movements... +TargetRestraint растягивается, чтобы соответствовать вашим движениям... +The TargetRestraint tips slightly as you squirm around... +TargetRestraint слегка наклоняется, когда вы извиваетесь... +You are too weak to make even a small dent in the TargetRestraint... +Вы слишком слабы, чтобы сделать даже небольшую вмятину в TargetRestraint... +The TargetRestraint is unyielding despite your attempts... +TargetRestraint остается непреклонным, несмотря на все ваши попытки... +You try to puncture the TargetRestraint... +Вы пытаетесь проткнуть TargetRestraint... +You poke around at the TargetRestraint... +Вы тыкаете в TargetRestraint... +The TargetRestraint is too durable to pop... +TargetRestraint слишком прочен, чтобы его можно было лопнуть... +The TargetRestraint is too strong despite your best efforts... +TargetRestraint слишком прочен, все ваши усилия бесполезны... +You can't quite get enough force to pop the TargetRestraint... +Вы не можете приложить достаточно усилий, чтобы лопнуть TargetRestraint... +Your attempts to pop the TargetRestraint are futile due to your restraints... +Ваши попытки лопнуть TargetRestraint бесполезны из-за ваших ограничителей... +The chest is too smooth to help. Maybe if you opened it? +Сундук слишком гладкий, чтобы вам помочь. Может, если вы его откроете?.. +Lockable +Запирающийся +Non-Lockable +Не-запирающийся +Cursed +Проклятый +Unlocked +Не заперто +Lock: +Замок: +Simple +Простой +Standard +Обычный +Standard +Обычный +Standard +Обычный +Secure +Надежный +Disc +Диск +Rubber +Резиновый +Divine +Божественный +Divine +Божественный +Crystal +Кристальный +Simple +Простой +Runic +Рунический +Magic +Магический +Cyber +Кибер +Integrated Cyber +Кибер: интегрированный +Advanced Cyber +Кибер: продвинутый +Ancient +Древний +Simple Lock +Простой замок +Standard Lock +Стандартный замок +Standard Lock +Стандартный замок +Standard Lock +Стандартный замок +Secure Lock +Надежный замок +Disc Lock +Дисковый замок +Rubber Lock +Резиновый замок +Divine Lock +Божественный замок +Divine Lock +Божественный замок +Crystal Lock +Кристальный замок +Simple Lock +Простой замок +Runic Lock +Рунический замок +Magic Lock +Магический замок +Cyber Lock +Кибер замок +Integrated Cyber Lock +Интегрированный кибер замок +Advanced Cyber Lock +Придвинутый кибер замок +You can't use that while gagged! +Вы не можете использовать это с кляпом во рту! +You can't use that without your fingers! +Вы не можете использовать это без своих пальцев! +You struggle against your bindings but it's too strict!. +Вы боретесь со своими ограничителями, но они слишком тугие!. +You drop the pick due to your bound hands! +Вы роняете отмычку из-за своих связанных рук! +You drop your knife due to your bound hands! +Вы роняете нож из-за своих связанных рук! +You drop the precious knife due to your bound hands! +Вы роняете бесценный нож из-за своих связанных рук! +You drop the key due to your bound hands! +Вы роняете ключ из-за своих связанных рук! +You drop the magic key due to your bound hands! +Вы роняете волшебный ключ из-за своих связанных рук! +You insert the card the wrong way and the reader ejects it onto the floor! +Вы вставляете карту неправильно, и считывающее устройство выплевывает ее на пол! +Journal +Журнал +Journal (N) +Журнал (+) +Passing... +Проходим мимо... +Pass NPCs +Проходить мимо NPC +Closing... +Закрываем... +Close door +Закрываем дверь +Sprinting!!! +Бежим!!! +Sprint! +Бежать! +Hopping!!! +Прыгаем!!! +Hop! +Прыгать! +You run! +Вы бежите! +You hop desperately! +Вы отчаянно упрыгиваете! +Close Door +Закрыть дверь +Unlock +Отпереть +Command +Команда +You utter a command word and release the lock! +Вы произносите командное слово и открываете замок! +You mutter an unintelligible command word and your locks do not open. +Вы неразборчиво бормочете командное слово, и ваши замки не открываются. +You mumble a command word but the lock opens! +Вы кое-как произносите командное слово, и замок открывается! +You mess up saying the command word. The lock stays put! +Ты ошиблись, произнося командное слово. Замок остается на месте! +Swipe Keycard +Провести ключ-картой +You swipe your keycard and the lock releases with a hiss! +Вы проводите ключкартой, и замок с шипением открывается! +You swipe your keycard and the lock beeps 'Access Denied'! +Вы проводите ключкартой, и замок издает звуковой сигнал 'Доступ запрещен'! +You don't have any card to scan in the slot. +У вас нет карты, которую можно было бы просканировать в прорези. +Use Retinal Scanner +Использовать сканер сетчатки +You scan your eye pattern and the lock releases with a hiss! +Вы сканируете свой глаз, и замок с шипением отпирается! +The lock rejects you, citing your lack of authority. +Замок отказывает вам, ссылаясь на отсутствие у вас полномочий. +You are blindfolded, so the scanner can't even see your eye! +У вас повязка на глазах, поэтому сканер не может увидеть вашу сетчатку! +Hack +Взломать +You bypass the lock's cyber defenses and release it with a hiss! +Вы обходите киберзащиту замка и он с шипением открывается! +The lock beeps as its security blocks your attempts at release. +Замок издает звуковой сигнал, когда его защита блокирует ваши попытки открыть замок. +You have no way to hack the locking system. +У вас нет возможности взломать систему блокировки. +Pick +Взломать +(No way to open) +(Невозможно открыть) +(She cannot help you) +(Она не может вам помочь) +Offer XXXg +Пожертвовать XXXg +Offer +Пожертвовать +You do not have enough for a proper offering. +У вас недостаточно денег для надлежащего подношения. +The goddess removes some of your restraints! +Богиня снимает некоторые из ваших ограничителей! +The goddess restores your mental and physical state! +Богиня восстанавливает ваше психическое и физическое здоровье! +The goddess teaches you the secrets of SCHOOL. (+1 level) +Богиня обучает вас секретам школы SCHOOL. (+1 уровень) +The goddess of SCHOOL grants you destructive spellcasting! +Богиня школы SCHOOL усиляет ваши заклинания силой разрушения! +The goddess of SCHOOL grants you invisibility on attacks! +Богиня школы SCHOOL дарует вам невидимость при атаках! +The goddess of SCHOOL grants you protection and retaliation! +Богиня школы SCHOOL дарует вам защиту и возмездие! +You leave the coins on the altar and they transform into a ItemBought! +Вы оставляете монеты на алтаре, и они превращаются в ItemBought! +object +объекте +It appears to be a receptacle for an ancient crystal. +Похоже, это вместилище для древнего кристалла. +It's a pile of slag emitting a strange magic smoke... +Это груда шлака, испускающая странный волшебный дым... +That object is locked with a LKTP. +Этот объект заперт при помощи LKTP. +A shrine to the goddess of TYPE. +Божественное святилище: TYPE. +A shrine to the goddess of TYPE. +Божественное святилище: TYPE. +That door is open. Do you want to close it? +Эта дверь открыта. Вы хотите закрыть её? +You slam the door and jam it shut! +Вы захлопываете дверь и запираете её на замок! +Passion +Страстность +Frustration +Разочарование +Submissiveness +Покорность +Security Level +Уровень Опасности +Undead +Нежить +Latex +Латекс +Leather +Кожа +Metal +Металл +Ropes +Верёвки +Restoration +Жизнь +Elements +Стихии +Conjuration +Сотворение +Illusions +Иллюзия +Commerce +Коммерция +Shrine of SHRINETYPE +Святилище: SHRINETYPE +Tablet of +Скрижаль: +Goddess: +Богиня: +Goddess Blessing: +Благословение Богини: +Goddess Curse: +Проклятие Богини: +Mana Bonus: +Бонус к мане: +Lack of Mana Penalty: +Штраф за недостаток маны: +Your excess mana helps you suppress the enchantment! +Избыток маны помогает вам подавить магические чары! +Your mana is too weak to fight the magical enchantment... +Вашей маны слишком мало, чтобы противостоять магическим чарам... +Curses +Проклятия +Willpower +Сила Воли +A tablet inscribed with runes of TYPE. +Скрижаль, исписанная рунами: TYPE. +SHRINETYPE Tablet +Скрижаль: SHRINETYPE +Decypher +Расшифровать +You read the runes and they fill you with power! +Вы читаете руны, и они наполняют вас силой! +These runes are meant for someone with less willpower. +Эти руны предназначены для тех, у кого меньше силы воли. +You try to read the runes but cannot understand them. +Вы пытаетесь прочитать руины, но не можете их понять. +Allies: +Союзники: +Enemies: +Враги: +Favorable: +Партнеры: +None +Нет +Nevermere Trainers +Тренеры Невермера +DressUp Co. +Корпорация Моды +Bounty Hunters Guild +Гильдия Наемников +Bandits +Бандиты +Constructs +Конструкты +School of Magic +Школа Магии +Old Guardians +Древние Стражи +Cult of the Wild +Культ Дикой Природы +Cult of Bast +Культ Баст +Alchemists +Алхимики +Elementals +Элементали +Dragonheart Order +Орден Драконьего Сердца +MaidForce +Спецотряд горничных +Fungal Kingdom +Грибное Царство +Slime +Слизь +Nature +Природа +Witches' Coven +Ковен ведьм +Love Crafters +Мастера любви +Velvet Pact +Бархатный пакт +Knights Errant +Странствующие рыцари +Scavengers +Мусорщики +Fae Tricksters +Хитрые Фейри +Zora's Crew +Бригада Зоры +Rope Dojo +Веревочное додзе +Doll Shoppe +Кукольный магазинчик +Fuuka's Shrine +Святилище Фууки +The Collectors +Коллекционеры +Dollmaker Inc. +Кукольная компания +Adventurer +Искательница приключений +Cursed Spirit +Проклятый дух +Wanted +В розыске +Delinquent +Нарушитель +Computer Virus +Компьютерный вирус +Extraplanar Entity +Экстрапланарная сущность +Dubious Witch +Подозрительная ведьма +Shadow Clan +Теневой клан +Illegal Poacher +Браконьер +Nature +Природа +Very Angry +Очень злая +Surprise! +Сюрприз! +Fierce Debater +Яростный спорщик +Angels +Ангелы +Demons +Демоны +You sense that the chest contains a trap and a lot of gold. +Вы чувствуете, что в сундуке находится ловушка и много золота. +You sense that the chest is safe to open. +Вы чувствуете, что сундук можно безопасно открыть. +Drink +Выпить +Bottle +Наполнить бутылку +You have no restraints to 'offer' to the goddess. +У вас нет ограничителей, чтобы 'преподнести' их богине. +This shrine's mana pool is empty. +Бассейн маны в святилище пуст. +You drink from the pool and and absorb its energies. +Вы пьете из бассейна и впитываете его энергию. +You absorb the pool's energies through your face. +Вы впитываете энергию бассейна своим лицом. +You collect what mana you can in a bottle. +Вы собираете в бутылку столько маны, сколько сможете. +You drink from the pool and your mana is restored. +Вы пьете из бассейна, и ваша мана восстанавливается. +You drink again, but you feel as if you are trespassing. +Вы вновь пьете, но чувствуете себя так, словно вторгаетесь на чужую территорию. +You drink again, knowing the risk this may entail... +Вы вновь пьете, зная, какой риск это может повлечь за собой... +You have angered the goddess of TYPE!!! +Вы разгневали богиню: TYPE!!! +The slime washes off in the fountain!!! +Слизь растворяется в фонтане!!! +The goddess of TYPE is enraged and curses you with a divine punishment! (+RESTRAINT) +Богиня (TYPE) в ярости и обрушивает на вас божественное наказание! (+RESTRAINT) +The goddess offers a ItemTraded for ItemCost (NumCurrent/NumMax) +Богиня предлагает ItemTraded за ItemCost (NumCurrent/NumMax) +Next Offer +Следующее предложение +Buy (press right) +Купить +Cost: ItemCostgp +Стоимость: ItemCostgp +Owned: AMNT +Наличие: AMNT +You climb down to the next level +Вы спускаетесь на следующий уровень +Level RestraintLevel (Rarity) +Уровень RestraintLevel (Rarity) +All +Все +Consumable +Расходники +Worn +Экипировка +Weapons +Оружие +Outfits +Костюмы +Restraints +Ограничители +Miscellaneous +Разное +Armor +Броня +The terrain makes noise as you rush across it... +Вы громко шуршите, пересекая жту местность... +You can't reach the cuffs on your elbows, the chain is too short... +Вы не можете дотянуться до манжет на локтях, цепочка слишком короткая... +You contort your arms trying to reach the cuffs on your elbows, to no avail... +Вы сгибаете руки, пытаясь дотянуться до манжет на локтях, но безрезультатно... +Your elbows are kept together by the elbow cuffs, and you can't reach them. +Ваши локти удерживаются вместе манжетами, и вы не можете дотянуться до них. +The strict chain on the cuffs keeps you from reaching them easily. +Крепкая цепочка на манжетах не позволяет вам легко дотянуться до них. +The cuffs limit your range of motion, making it harder to remove them. +Кандалы ограничивают диапазон ваших движений, из-за чего их становится труднее снять. +It's hard to take off the cuffs with your wrists linked together... +Трудно снять оковы, когда ваши запястья скованы вместе... +You feel drained of energy... +Вы ощущаете утечку энергии... +Your collar tingles and suddenly you feel weaker... +Ваш ошейник подрагивает, и внезапно вы чувствуете слабость... +Your collar drains your energy as you struggle... +Ваш ошейник поглощает вашу энергию, когда вы боретесь...... +The rope between your legs keeps the toy secure... +Веревка между вашими ногами надежно удерживает игрушку...... +Try as you might, the toy is held in place tight. +Как бы вы ни старались, игрушка крепко держится на месте. +The toy won't wiggle loose. It's kept in place by your restraints. +Игрушка имеет ограниченные возможности для движения. Она удерживается на месте вашими ограничителями. +Your catsuit adheres to latex, making struggling more difficult! +Ваш комбинезон липнет к латексу, что затрудняет борьбу! +The item sticks to your rubber catsuit, making it harder to pull off... +Предмет липнет к вашему резиновому комбинезону, из-за чего его труднее стянуть... +The item hugs your catsuit tightly, adhering firmly! +Предмет плотно облегает ваш комбинезон, прочно прилипая к нему! +Your RSTRN holds you securely, making your struggling ineffectual... +Ваше RSTRN надежно сдерживает вас, делая ваше сопротивление неэффективным... +Your RSTRN holds you tight, making it harder to move... +Ваше RSTRN крепко сдавливает вас, затрудняя движение... +Your RSTRN keeps you tied tight, making it harder to escape... +Ваше RSTRN обеспечивает надежность связывания, затрудняя побег... +The bright light weakens the shadow hands! +Яркий свет ослабляет теневые руки! +You hear an ominous click, but nothing seems to happen. Looks like a misfire! +Вы слышите зловещий щелчок, но, кажется, ничего не происходит. Похоже на осечку! +Barrel Trap +Бочкообразная ловушка +A booby-trapped barrel with a spring-loaded lid designed to trap you inside! +Бочка-ловушка минного типа с подпружиненой крышкой, предназначенная для того, чтобы поймать вас внутрь! +You can push the lid off with enough force... +Вы можете отодвинуть крышку, приложив достаточно силы... +The lid of the barrel suddenly snaps shut as you hide inside!!! +Крышка бочки внезапно захлопывается, когда вы оказываетесь внутри!!! +Sarcophagus +Саркофаг +A glass-walled chamber sealed with enchanting magic. +Камера со стеклянными стенами, запечатанная магией зачарования. +Time feels like it's going by quickly outside... +Кажется, что время снаружи летит очень быстро... +Metal Cage +Металлическая клетка +A metal cage with rigid bars, too narrow to put your head through. +Металлическая клетка с жесткими прутьями, слишком узкая, чтобы просунуть голову. +Made for a pretty toy like you~ +Создана для такой милой игрушки, как ты~ +Display Stand +Выставочная подставка +A display stand, fit for only the prettiest of trophies! +Выставочная подставка, подходящая только для самых красивых трофеев! +Your arms are pinned behind your back and you can barely move! +Ваши руки скованы за спиной, и вы едва можете пошевелиться! +You hear a click as the door shuts behind you... +Дверь за вами закрывается и вы слышите щелчок... +The display stand suddenly locks into place around you! +Выставочная подставка внезапно обхватывает и запирает вас! +Doll Stand +Кукольная подставка +A mobile display stand for dolls to keep them in place. +Передвижная подставка для кукол, чтобы удерживать их на месте. +As long as it's... inserted, you won't be going anywhere! +До тех пор, пока вы... экспонат, вы никуда не денетесь! +One Bar Prison +Стержень-тюрьма +A devious way to immobilize people. +Изощренный способ обездвиживания. +As long as it's... inserted, you won't be going anywhere! +До тех пор, пока вы... экспонат, вы никуда не денетесь! +Metal Stand +Металлическая подставка +A devious way to immobilize people. +Изощренный способ обездвижить людей. +As long as it's locked around you, you won't be going anywhere! +Пока она заперта вокруг вас, вы никуда не денетесь! +Doll Stand +Кукольная подставка +A mobile display stand for dolls to keep them in place. +Передвижная подставка для кукол, чтобы удерживать их на месте. +As long as it's attached, you won't be going anywhere! +Пока вы здесь закреплены, вы никак не сможете сбежать! +You're not fooling anyone... +Вы никого не обманете... +You might be able to fool someone like this... +Возможно, подобным образом вам удастся кого-нибудь одурачить... +You look like you're right at home! +Вы выглядите так, словно чувствуете себя здесь прямо как дома! +Restraining Bed +Удерживающая кровать +A bed with a booby trap designed to trap you on top of it! +Кровать с миной-ловушкой, предназначенная для того, чтобы привязать вас к ней! +You have to get out somehow... +Вы должны как-то выбраться отсюда... +Belts emerge from underneath the bed and wrap around you, strapping you down tightly! +Ремни появляются из-под кровати и обвиваются вокруг вас, крепко привязывая! +Binding Dress +Ограничительное Платье +It's a devious dress! I hope your elbows are flexible~ +Что за хитроумное платье! Я надеюсь, что ваши локти достаточно гибкие~ +So many laces! It would take quite a while to put this on normally. That's what magic is for! +Так много шнурков! Потребовалось бы немало времени, чтобы надеть его нормальным путём. Вот для чего нужна магия! +Ornamental Corset +Декоративный Корсет +Your figure looks gorgeous in this~ +В нём ваша фигура выглядит великолепно ~ +It's so tight you won't be able to undo the laces yourself, dear! +Он такой тугой, что ты сама не сможешь развязать шнурки, дорогая! +Fancy Ball Gag +Причудливый кляп в виде шарика +A cute ball gag that fills your mouth right up! +Симпатичный кляп в виде шарика, который полностью заполняет ваш рот! +What's this? it seems to have a magic spell protecting it from harm! +Что это такое? Кажется, на нем есть магическое заклинание, защищающее его от повреждений! +Fancy Muzzle +Причудливый намордник +A muzzle to keep you from spitting out what's underneath. +Намордник, чтобы вы не выплюнули то, что находится под ним. +Sorry dear, there's a mystic seal on there to keep it on nice and tight. +Извини, дорогая, на нём есть мистическая печать, чтобы он держался надежно и плотно. +Ornamental Dress +Декоративное платье +A devious dress that forces the arms into an elbows-touching position. +Изысканное платье, которое заставляет руки соприкасаться локтями. +It is extremely strict but it is only fabric. The lacing is intricate and will take a long time to remove. +Ткань чрезвычайно крепкое, но это всё еще ткань. Шнуровка сложная, и на её развязывание уйдет много времени. +Ornamental Gag +Декоративный кляп +A gag meant to keep servants of the Resurrection Temple quiet by forcing a plug into their mouth. +Кляп, предназначенный для того, чтобы заставить служителей Храма Возрождения замолчать, засунув им в рот пробку. +It is difficult to pull off and though it is made from white leather, a magic enchantment protects it from cutting. +Его трудно снять, и хотя он сделан из белой кожи, магические чары защищают его от разреза. +Panel Plug Gag +Панельный кляп с пробкой +A gag meant to keep people quiet by forcing a plug into their mouth. +Кляп, предназначенный для того, чтобы заставить людей замолчать, засовывая им в рот пробку +It is difficult to pull off and though it is made from supple, heavy duty leather. +Его трудно стянуть, и он сделан из упругой, сверхпрочной кожи. +Fuuka's Collar +Ошейник Фууки +A collar enchanted with ghastly energy. +Ошейник, зачарованный жуткой энергией. +It seems to react with a pulse of energy whenever a nearby enemy is defeated. +Кажется, что он реагирует импульсом энергии на поражение ближайших врагов. +Your collar pulses, and a revenant appears to avenge the enemy you defeated! +Ваш ошейник пульсирует, и появляется призрак, чтобы отомстить за врага, которого вы победили! +Fuuka's Pet Collar +Ошейник питомца Фууки +A collar enchanted with beneficial ghastly energy. +Ошейник, зачарованной благотворной призрачной энергией. +It seems to react with a pulse of energy whenever a nearby enemy is defeated. +Кажется, что он реагирует импульсом энергии на поражение ближайших врагов. +Your collar pulses, and a revenant appears to assist you! +Ваш ошейник пульсирует, и появляется помогающий вам призрак! +Dress Bustier +Платье-бюстье +A deceptively cruel device, making it impossible to reach your nipples. +Обманчиво жестокое приспособление, лишающее вас возможности добраться до своих сосков. +Reinforced with steel plates, this will need bolt cutters to take off. +Укреплено стальными пластинами, для его снятия понадобятся болторезы. +Massagers +Массажеры +A pair of little motion-activated teasers. They trigger when you swing your body for an attack. +Пара маленьких дразнилок, активируемых при движении. Они срабатывают, когда вы резко двигаете своим телом во время атаки. +They will make for some great fun! Type: Edging +С ними будет очень весело! Тип: Удерживание на грани +Advanced Massagers +Усовершенствованные массажеры +A pair of sensitive motion-activated teasers. They trigger when you attack or struggle. +Пара маленьких дразнилок, активируемых при движении. Они срабатывают, когда вы атакуете или Боретесь. +They will make for some great fun! Type: Edging +С ними будет очень весело! Тип: Удерживание на грани +Nipple Weights +Утяжелители для сосков +A pair of dense weights dangling from your sensitive bits. +Пара утяжелителей, свисающих с ваших чувствительных частей. +They tend to swing around when attacking or casting arm spells. +Они могут раскачиваться при атаках или применении заклинаний жестами. +Hi-Tech Massagers +Хай-тек массажеры +A pair of highly-sensitive motion-activated teasers. They detect most forms of motion, including sprinting and hopping. +Пара очень чувствительных дразнилок, активируемых при движении. Они обнаруживают любую форму движения, включая спринт и прыжки. +They will make for some great fun! Type: Edging +С ними будет очень весело! Тип: Удерживание на грани +Control Harness +Надзорная упряжь +An advanced harness for controlling high-security prisoners. +Усовершенствованная упряжь для контроля за заключенными строгого режима. +It seems to be made of flexible steel plates. +Кажется, что она сделана из гибких стальных пластин. +Cyber Collar +Кибер-ошейник +An advanced collar for registering prisoners into the facility network. +Усовершенствованный ошейник для регистрации заключенных в сети комплекса. +It seems to be made of flexible steel plates, and it has a high-security lock. +Похоже, он сделан из гибких стальных пластин и снабжен замком повышенной безопасности. +Latex Ball Gag +Латексный кляп-шарик +A devious device that looks like a ball gag, but has a mouth-filling rod on the inside. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +Хитрое приспособление, похожее на кляп в виде шарика, но с внутренней стороны имеющее стержень для заполнения рта. Может применяться против уязвимых целей или тех, кто в последний ход произнес словесное заклинание, в половину силы. +The strap is made of a durable but flexible material +Ремешок изготовлен из прочного, но эластичного материала. +Large Latex Ball Gag +Большой латексный кляп-шарик +A devious device that looks like a large ball gag, but absolutely fills your mouth with a rubber cylinder. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +Хитрое устройство, похожее на большой кляп-шарик, но полностью заполняющее ваш рот резиновым цилиндром. Может применяться против уязвимых целей или тех, кто в последний ход произнес словесное заклинание, в половину силы. +The strap is made of a durable but flexible material +Ремешок изготовлен из прочного, но эластичного материала. +Latex Mask +Латексная маска +A slick layer of blue latex stretched over the mouth. +Гладкий слой синего латекса закрывает рот. +It's very tight and makes it hard to move your mouth. +Она очень плотная, из-за чего вам трудно двигать ртом. +Secure Latex Mask +Надежная латексная маска +A slick layer of blue latex stretched over the mouth. It has a lockable strap which prevents it from being removed. +Тонкий слой синего латекса, растянутый вокруг рта. Она снабжена фиксирующимся ремешком, который мешает её снять. +It's very tight and makes it hard to move your mouth. +Она очень плотная, из-за чего вам трудно двигать ртом. +Rubberized Gloves +Прорезиненные перчатки +A mass of alchemical latex stretched over your arms, then hardened to the point that you can barely move your fingers! +Масса алхимического латекса разливается по вашим рукам, а затем затвердевает до такой степени, что вы едва можете пошевелить пальцами! +Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! +В отличие от обычной резины, этот материал прочный, упругий и немного липкий! +Rubberized Socks +Прорезиненные носки +A mass of alchemical latex stretched over your legs, then hardened. +Масса алхимического латекса разливается по вашим ногам, а затем затвердевает. +Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! +В отличие от обычной резины, этот материал прочный, упругий и немного липкий! +Rubberized Mask +Прорезиненная маска +A mass of alchemical latex stretched over your entire face, then hardened. +Масса алхимического латекса разливается по вашему лицу, а затем затвердевает. +Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! +В отличие от обычной резины, этот материал прочный, упругий и немного липкий! +Rubberized Ball Gag +Прорезиненный кляп-шарик +A mass of alchemical latex inflated to fill your mouth, then hardened. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +Масса алхимического латекса раздувается, заполняя ваш рот, а затем затвердевает. Может применяться против уязвимых целей или тех, кто в последний ход произнес словесное заклинание, в половину силы. +Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! +В отличие от обычной резины, этот материал прочный, упругий и немного липкий! +Rubberized OTN Mask +Прорезиненная маска-шарф +A mass of alchemical latex stretched over your mouth, then hardened. +Масса алхимического латекса разливается по вашему рту, а затем затвердевает. +Unlike typical rubber, this stuff is durable, flexible, and somewhat sticky! +В отличие от обычной резины, этот материал прочный, упругий и немного липкий! +Wolf Panties +Трусики 'Волчица' +A set of vibrating panties designed to help subdue unruly wolfgirls. +Набор вибрирующих трусиков, предназначенных для того, чтобы помочь усмирить непослушных девушек-волчиц. +It's incredibly tight and difficult to remove once it's clipped on, but the material is rubber. +Они невероятно плотные, и их трудно снять после того, как они окажутся застегнуты, но материал - всё еще резина. +You can't equip that. +Вы не можете это экипировать. +Experimental Boxtie Binder +Экспериментальная упряжь для рук +A secure but comfortable binder meant for long-term wear by the alchemists' pets. +Надежная, но удобная упряжь, предназначенная для длительного ношения домашними животными алхимиков. +Made from imbued latex, it will be hard to cut but not impossible. +Изготовлена из пропитанного латекса, её будет трудно разрезать, но это не невозможно. +Binder Harness +Фиксирующая упряжь +A tight harness attached to a binder used to ensure restraints will not come off. +Тугая упряжь, прикрепляемая к ограничителям. Применяется для того, чтобы ограничители не соскальзывали. +It's tied in the back and reinforced with steel boning. +Она завязывается сзади и усилена стальными косточками. +Latex Posture Collar +Латексный осаночный ошейник +A strict collar that makes it tougher to escape from other items. +Строгий ошейник, который затрудняет снятие других предметов. +It has steel boning but could be cut with enough care. +У него стальные косточки, но при достаточном аккуратности его можно разрезать. +Latex Ballet Heels +Латексные балетки +A pair of strict boots for making pets more manageable. A skilled person can still walk in these. +Пара строгих ботинок для усиления контроля за питомцами. Опытная девушка все же сможет в них ходить. +They are reinforced with top-quality hardened latex. +Они укреплены высококачественным затвердевшим латексом. +High-Security Armbinder +Экстра-надежный армбиндер +An armbinder enclosing your hands and arms completely, making your hands useless. +Армбиндер, полностью закрывающий ваши кисти и руки, делая их бесполезными. +Made of a flexible, yet durable material, it's going to be really tough to escape. +Сделано из гибкого, но прочного материала, выбраться из этой штуки будет действительно непросто. +High-Security Boxbinder +Экстра-надежная сумка для рук +A boxbinder enclosing your hands and arms completely, making your hands useless. +Сумка для рук, полностью закрывающая ваши кисти и руки, делая их бесполезными. +Made of a flexible, yet durable material, it's going to be really tough to escape. +Сделано из гибкого, но прочного материала, выбраться из этой штуки будет действительно непросто. +High-Security Straitjacket +Экстра-надежная смирительная рубашка +A straitjacket enclosing your hands and arms completely, making your hands useless. +Смирительная рубашка полностью блокирует ваши руки и кисти, делая их бесполезными. +Made of a flexible, yet durable material, it's going to be really tough to escape. +Сделано из гибкого, но прочного материала, выбраться из этой штуки будет действительно непросто. +High-Security Lockdown Jacket +Экстра-надежный изолирующий жилет +This jacket made with extra straps can even be used on top of another jacket for extra security. +Этот жилет с дополнительными лямками можно носить даже поверх другого жилета, для большей надежности. +Made of a flexible, yet durable material, it's going to be really tough to escape. +Сделано из гибкого, но прочного материала, выбраться из этой штуки будет действительно непросто. +High-Security Legbinder +Экстра-прочный легбиндер +An mythril legbinder enclosing your legs, making it difficult to move. +Мифриловый Легбиндер обхватывает ваши ноги, затрудняя передвижение. +Made of a flexible, yet durable material, it's going to be really tough to escape. +Сделано из гибкого, но прочного материала, выбраться из этой штуки будет действительно непросто. +High-Security Shackles +Экстра-прочные кандалы +A pair of hardened steel shackles around your feet. +Пара кандалов из закаленной стали вокруг ваших ног. +Nearly indestructable, you are at the mercy of its lock. +Почти неразрушимый, вы находитесь во власти их замка. +High-Security Ball Gag +Экстра-прочный Кляп-Шар +A rubber gag shoved tightly between your lips. +Резиновый кляп, плотно зажатый между вашими губами. +The cable-reinforced straps are nigh-unbreakable, keeping you securely silenced. +Ремни, усиленные тросами, практически не поддаются разрыву, надежно удерживая вас в тишине. +High-Security Muzzle +Экстра-прочный намордник +A secure muzzle made with cable-reinforced straps. +Надежный намордник, идущий в комплекте с ремнями, усиленными тросами. +It is especially effective at keeping in other gags. +Очень эффективен в защите кляпов. +Potion Absorber +Поглотитель зелий +An ancient device that allows direct use of potions even while gagged or bound. +Древнее устройство, позволяющее использовать зелья даже с кляпом во рту или будучи связанными. +Also allows fitting of a leash. +Также позволяет прикрепить поводок. +Potion Absorber +Поглотитель зелий +An ancient device that allows direct use of potions even while gagged or bound. +Древнее устройство, позволяющее использовать зелья даже с кляпом во рту или будучи связанными. +Also allows fitting of a leash. +Также позволяет прикрепить поводок. +Slime Walkers +Слизеходы +A pair of heels coated in a nonstick material. +Пара сапожек на высоких каблуках, покрытых антиадгезивным материалом. +They will slow you down, but you can walk on slime without getting stuck! +Они будут замедлять вас, но вы сможете ходить по слизи, не рискуя прилипнуть! +Slime Walkers +Слизеходы +A pair of heels coated in a nonstick material. +Пара сапожек на высоких каблуках, покрытых антиадгезивным материалом. +They will slow you down, but you can walk on slime without getting stuck! +Они будут замедлять вас, но вы сможете ходить по слизи, не рискуя прилипнуть! +Duster Gag +Кляп-щеточка +A special gag designed for maids to be useful even while tied up! It's self-locking too! +Специальный кляп, предназначенный для горничных, позволяющий им быть полезными, даже когда они связаны! А еще он самоблокирующийся! +Deals 0.5 tickle damage on attack and adds +30 distraction. Bonus damage vs dirt and mold. +Наносит 0.5 ед. урона от щекотки при атаке и добавляет +30 возбуждения. Дополнительный урон против грязи и плесени. +Duster Gag +Кляп-щеточка +A special gag designed for maids to be useful even while tied up! It's self-locking too! +Специальный кляп, предназначенный для горничных, позволяющий им быть полезными, даже когда они связаны! А еще он самоблокирующийся! +Deals 0.5 tickle damage on attack and adds +30 distraction. +Наносит 0.5 ед. урона от щекотки при атаке и добавляет +30 возбуждения. +Gas Mask +Противогаз +A respirator designed to protect the wearer from noxious fumes. +Респиратор, предназначенный для защиты владельца от ядовитых испарений. ++50 Poison resist. Protects against dizziness caused by sleep gas. Affects speech. +Устойчивость к ядам +50. Защищает от головокружения, вызванного усыпляющим газом. Влияет на речь. +Gas Mask +Противогаз +A respirator designed to protect the wearer from noxious fumes. +Респиратор, предназначенный для защиты владельца от ядовитых испарений. ++50 Poison resist. Protects against dizziness caused by sleep gas. Affects speech. +Устойчивость к ядам +50. Защищает от головокружения, вызванного усыпляющим газом. Влияет на речь. +The curse on the RestraintName is lifted! +Проклятие с RestraintName снято! +Press RIGHT to confirm buy! +Нажмите СПРАВА для подтверждения покупки! +You find +Вы находите +You find +Вы находите +You find +Вы находите +Collar +Ошейник +A classy leather collar. +Классический кожаный ошейник. +Allows fitting of a leash. +К нему можно прикрепить поводок. +Slave Collar +Рабский ошейник +A high-security steel collar befitting of a slave. +Сверх-надёжный стальной ошейник, подобающий рабыне. +Allows fitting of a leash. +К нему можно прикрепить поводок. +Enchanted Collar +Зачарованный ошейник +A collar made with magically enchanted materials. It is difficult to cut off. +Ошейник, изготовленный из зачарованных материалов. Его будет трудно разрезать. +Allows fitting of a leash. +К нему можно прикрепить поводок. +Kitty Collar +Кошачий ошейник +A collar made with magically enchanted materials. It is protected by the blessing of Bast. +Ошейник, изготовленный из зачарованных материалов. Он защищен благословением Баст. +Allows fitting of a leash. +К нему можно прикрепить поводок. +Leash +Поводок +A leash made from a strong material. +Поводок из прочного материала. +Functions as a handle for moving unruly prisoners. +Поводок для управлением движений непослушных заключенных. +Prisoner Plug +Пробка узника +A teaser to keep you occupied. +Дразнилка, дабы вы не заскучали. +Buzzes on spellcast, and periodically as well. +Вибрирует при произнесении заклинаний, или просто периодически. +High-Security Chastity Belt +Экстра-прочный Пояс Целомудрия +A chastity belt to protect prisoners from themselves. +Пояс целомудрия для защиты заключенных от самих себя. +Made of a highly durable material. +Изготовлен из очень прочного материала. +Blacksteel Chastity Belt +Пояс Целомудрия из Черной Стали +A chastity belt to protect prisoners from themselves. +Пояс целомудрия для защиты заключенных от самих себя. +Made of a highly durable material. +Изготовлен из очень прочного материала. +Charms (Arms) +Талисманы (Руки) +A band of faintly magic ribbon wrapped tight around your arms. +Полоска слабо зачарованной ленты, туго обернутая вокруг ваших рук. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Charms (Legs) +Талисманы (Ноги) +A band of faintly magic ribbon wrapped tight around your thighs. +Полоска слабо зачарованной ленты, туго обернутая вокруг ваших бедер. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Charms (Feet) +Талисманы (Ступни) +A band of faintly magic ribbon wrapped tight around your ankles. +Полоска слабо зачарованной ленты, туго обернутая вокруг ваших лодыжек. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Charms (Head) +Талисманы (Голова) +A band of faintly magic ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. +Полоска слабо зачарованной ленты, туго обернутая поверх ваших глаз. Может быть использовано для поражения уязвимых целей из быстрого инвентаря или панели быстрого доступа. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Charm Gag +Кляп-талисман +A band of faintly magic ribbon wrapped tight over the mouth. Can be used on vulnerable targets from quick inventory or hotbar. +Полоска слабо зачарованной ленты, туго обернутая поверх вашего рта. Может быть использовано для поражения уязвимых целей из быстрого инвентаря или панели быстрого доступа. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Charm Wrapping (Toes) +Бинты из талисманов (Пальцы ног) +A layer of faintly magic ribbon wrapped tight around your feet. +Слой слабо зачарованной ленты, туго обернутой вокруг ваших стоп. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Charm Wrapping (Head) +Бинты из талисманов (Голова) +A layer of faintly magic ribbon wrapped tight around your face. +Слой слабо зачарованной ленты, туго обернутой вокруг вашего лица. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Charm Wrapping (Arms) +Бинты из талисманов (Руки) +A layer of faintly magic ribbon wrapped tight around your body. +Слой слабо зачарованной ленты, туго обернутой вокруг вашего тела. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Charm Wrapping (Feet) +Бинты из талисманов (Ступни) +A layer of faintly magic ribbon wrapped tight around your shins. +Слой слабо зачарованной ленты, туго обернутой вокруг ваших голеней. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Charm Wrapping (Legs) +Бинты из талисманов (Ноги) +A layer of faintly magic ribbon wrapped tight around your thighs. +Слой слабо зачарованной ленты, туго обернутой вокруг ваших бедер. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Living Charm Collar +Живой ошейник (Талисманы) +This collar is designed to make sure its wearer does not escape their charms. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не сбежит от талисманов. +It will occasionally cause charms to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of charms you have on you. +Иногда он заставляет талисманы появляться из ниоткуда и связывать носителя. Частота срабатывания увеличивается в зависимости от количества талисманов, наложенных на вас. +Leather Panel Gag +Кожаный панельный кляп +A gag that seals your lips tightly and stuffs your mouth with a ball. +Кляп, который плотно закрывает ваши губы и забивает рот шариком. +Keep your mouth to yourself! +Держи свой язык за зубами! +Harness Panel Gag +Панельный кляп с упряжью +A gag that seals your lips tightly and stuffs your mouth with a ball. +Кляп, который плотно закрывает ваши губы и забивает рот шариком. +The harness is comprehensive and it's locked in place. +Ремешок охватывает всю голову, и надёжно фиксирует кляп на своём месте. +Harness Ball Gag +Кляп-упряжь с шариком +A gag that stuffs your mouth with a large silicone ball. +Кляп, который блокирует у вас во рту большой силиконовый шарик. +The harness is comprehensive and it's locked in place. +Ремешок охватывает всю голову, и надёжно фиксирует кляп на своём месте. +Bast Gag +Кляп Баст +A gag used to silence new initiates of the Bast cult. +Кляп, используемый для того, чтобы заставить замолчать новых посвященных культа Баст. +The harness is comprehensive and it's locked in place. +Ремешок охватывает всю голову, и надёжно фиксирует кляп на своём месте. +Bast Muzzle +Намордник Баст +A muzzle used to keep a Bast gag secure. +Намордник, используемый для прикрытия Кляпа Баст. +The leather panel is tough and tight. +Кожаная панель очень прочная и плотная. +Bast Blindfold +Повязка на глаза Баст +A blindfold used to aid in meditation. +Повязка на глаза, используемая для помощи в медитации. +It is padded but still lets some light through. +Она толстая, но все же пропускает немного света. +Bast Paws +Лапы Баст +Leather mittens used to pacify new initiates of the Bast cult. +Кожаные рукавицы, используемые для усмирения новых посвященных культа Баст. +They make it hard to manipulate anything at all, but aren't the toughest material. +В ними трудно чем-либо манипулировать, но это не самый прочный материал. +Bast Suit +Костюм Баст +A skintight suit used on unruly initiates of the Bast cult. +Облегающий костюм, который надевают на непослушных посвященных культа Баст. +It's nearly impossible to escape without help once locked inside. +Окажись ты запертой в нём, будет практически невозможно сбежать без посторонней помощи. +Bast Petsuit +Петсьют Баст +Enhanced suit used for select members of the Bast cult. +Зачарованный костюм, используемый на избранных членов культа Баста. +It's nearly impossible to escape without help once locked inside. +Окажись ты запертой в нём, будет практически невозможно сбежать без посторонней помощи. +Magic Petsuit +Магический петсьют +A set of straps and buckles enchanted with a powerful spell to render you helpless. +Набор ремешков и пряжек, заколдованных мощным заклинанием, которые сделают вас беспомощными. +It's warded against cutting by nonmagic blades. +Он защищен от порезов немагическими лезвиями. +Latex Petsuit +Латексный петсьют +A skintight suit that encases you in a tight rubber embrace. +Облегающий костюм, который заключает вас в плотные резиновые объятия. +The thick latex is resistant to even the most determined struggles. +Толстый латекс устойчив даже к самой решительной борьбе. +Blessed Wrappings (Head) +Благословленные бинты (Голова) +A band of magic embalming ribbon wrapped tight around your face. +Повязка из магических бинтов для бальзамирования, туго обернутая вокруг вашего лица. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Blessed Wrappings (Eyes) +Благословленные бинты (Глаза) +A band of magic embalming ribbon wrapped tight over the eyes. Can be used on vulnerable targets from quick inventory or hotbar. +Повязка из магической бальзамирующей ленты туго обматывается поверх ваших глаз. Может быть использовано для поражения уязвимых целей из быстрого инвентаря или панели быстрого доступа. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Blessed Wrappings (Gag) +Благословленные бинты (Кляп) +A band of magic embalming ribbon wrapped tight over mouth. Can be used on vulnerable targets from quick inventory or hotbar. +Повязка из магической бальзамирующей ленты туго обматывается поверх вашего рта. Может быть использовано для поражения уязвимых целей из быстрого инвентаря или панели быстрого доступа. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Blessed Wrappings (Arms) +Благословленные бинты (Руки) +A layer of magic embalming ribbon wrapped tight around your body. +Повязка из магической бальзамирующей ленты туго обматывается вокруг вашего тела. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Blessed Wrappings (Feet) +Благословленные бинты (Ступни) +A layer of magic embalming ribbon wrapped tight around your shins. +Повязка из магической бальзамирующей ленты туго обматывается вокруг ваших голеней. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Blessed Wrappings (Toes) +Благословленные бинты (Пальцы ног) +A layer of magic embalming ribbon wrapped tight around your feet. +Повязка из магической бальзамирующей ленты туго обматывается вокруг ваших стоп. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Blessed Wrappings (Hands) +Благословленные бинты (Кисти) +A layer of magic embalming ribbon wrapped tight around your hands. +Повязка из магической бальзамирующей ленты туго обматывается вокруг ваших кистей рук. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Blessed Wrappings (Legs) +Благословленные бинты (Ноги) +A layer of magic embalming ribbon wrapped tight around your thighs. +Повязка из магической бальзамирующей ленты туго обматывается вокруг ваших бедер. +It clings, almost of its own accord, but seems vulnerable to both cutting and stretching. +Она очень прочно к вам прилипла, но кажется уязвимой как для разрезания, так и для растяжения. +Living Blessed Wrappings Collar +Живой ошейник (Благословленные бинты) +This collar is designed to make sure its wearer does not escape their wrappings. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель никуда не денется от бинтов. +It will occasionally cause blessed wrappings to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of blessed wrappings you have on you. +Иногда из-за него будут появляться из ниоткуда благословленные бинты и связывать носителя. Частота срабатывания увеличивается в зависимости от количества обернутых вокруг вас благословенных бинтов. +Tape (Hands) +Лента (Кисти) +Sleek and shiny tape for the bondage enthusiast. +Гладкая и блестящая лента для любителей бондажа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Tape (Arms) +Лента (Руки) +Sleek and shiny tape for the bondage enthusiast. +Гладкая и блестящая лента для любителей бондажа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Tape (Legs) +Лента (Ноги) +Sleek and shiny tape for the bondage enthusiast. +Гладкая и блестящая лента для любителей бондажа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Tape (Feet) +ЛЕнта (Ступни) +Sleek and shiny tape for the bondage enthusiast. +Гладкая и блестящая лента для любителей бондажа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Tape (Head) +Лента (Голова) +Sleek and shiny tape for the bondage enthusiast. Can be used on vulnerable targets from quick inventory or hotbar. +Гладкая и блестящая лента для любителей бондажа. Может быть использовано для поражения уязвимых целей из быстрого инвентаря или панели быстрого доступа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Tape Gag +Лента (Кляп) +Sleek and shiny tape for the bondage enthusiast. Can be used on vulnerable targets from quick inventory or hotbar. +Гладкая и блестящая лента для любителей бондажа. Может быть использовано для поражения уязвимых целей из быстрого инвентаря или панели быстрого доступа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Tape Mouth Wrap +Обматывающая лента (Рот) +Sleek and shiny tape for the bondage enthusiast. +Гладкая и блестящая лента для любителей бондажа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Tape Wrapping (Toes) +Обматывающая лента (Пальцы ног) +Sleek and shiny tape for the bondage enthusiast. +Гладкая и блестящая лента для любителей бондажа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Tape Wrapping (Head) +Обматывающая лента (Голова) +Sleek and shiny tape for the bondage enthusiast. +Гладкая и блестящая лента для любителей бондажа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Tape Wrapping (Arms) +Обматывающая лента (Руки) +Sleek and shiny tape for the bondage enthusiast. +Гладкая и блестящая лента для любителей бондажа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Tape Wrapping (Feet) +Обматывающая лента (Ступни) +Sleek and shiny tape for the bondage enthusiast. +Гладкая и блестящая лента для любителей бондажа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Tape Wrapping (Legs) +Обматывающая лента (Ноги) +Sleek and shiny tape for the bondage enthusiast. +Гладкая и блестящая лента для любителей бондажа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Living Tape Collar +Живой ошейник (Ленты) +This collar is designed to make sure its wearer does not escape their tape. +Этот ошейник предназначен для того, чтобы его владелец не смог выскользнуть из-под своих лент. +It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. +Иногда он заставляет ленты появляться из ниоткуда и связывать носителя. Частота срабатывания увеличивается в зависимости от количества лент, наложенных на вас. +Autotape +Скотч +Comes in convenient cartridges for machine loading. +Поставляется в удобных картриджах для загрузки в машины. +A specialized tape used for capturing purposes during the time of the Old Civilization. Despite its appearance, it contains a gas-permeable membrane that allows ventilation, while its hydrophobic properties resist solvents that would otherwise disrupt the adhesive bond. The adhesive layer is special in that it activates only in contact with other auto-tape, making it safer to use and remove. +Специализированная лента, использовавшаяся для фиксации материалов во времена Древней цивилизации. Несмотря на свой внешний вид, она содержит газопроницаемую мембрану, которая обеспечивает вентиляцию, а ее гидрофобные свойства не поддаются воздействию растворителей, которые в противном случае нарушили бы адгезионное соединение. Особенность клеевого слоя в том, что он активируется только при контакте с другим скотчем, что делает его использование и удаление более безопасным. +Rubberized Tape +Прорезиненная лента +Sleek and shiny tape for the bondage enthusiast. +Гладкая и блестящая лента для любителей бондажа. +A stretchy, waterproof tape that sticks only to itself. As such, it can be safely applied and removed from people without causing discomfort. Its stretchiness allows it to be rolled on extra tight, and it won't break if struggled against. +Эластичная, водонепроницаемая лента, которая прилипает только к самой себе. В таком виде ее можно безопасно накладывать на людей и снимать, не причиняя дискомфорта. Эластичность ленты позволяет ее очень туго наматывать и она не порвется от попыток борьбы. +Magic Charms +Магические амулеты +Magical charms from the ancient graveyard. +Магические амулеты с древнего кладбища. +Its magic is not enough to protect it from damage, but it is surprisingly effective at restraining both intruders and cursed entities. +Их магии недостаточно, чтобы защитить их от повреждений, но они на удивление эффективны как для сдерживания незваных гостей, так и проклятых сущностей. +Blessed Wrapping +Благословленные ленты +A layer of magic embalming ribbon. +Слой волшебной ленты для бальзамирования. +It clings of its own accord to intruders and naughty catgirls. +Они сами по себе цепляются за незваных гостей и непослушных девушек-кошек. +Autotape (Hands) +Скотч (Кисти) +Sticky tape made from a metallic material. Used to great effect in police situations. +Липкая лента, изготовленная из металлического материала. Активно используется полицейскими. +It's very sticky and seals your hands tightly, making any struggling ineffective. +Он очень липкий и плотно обхватывает ваши руки, делая любые попытки борьбы неэффективными. +Autotape (Head) +Скотч (Голова) +Sticky tape made from a metallic material. Used to great effect in police situations. Can be used on vulnerable targets from quick inventory or hotbar. +Липкая лента, изготовленная из металлического материала. Активно используется полицейскими. Может быть использовано для поражения уязвимых целей из быстрого инвентаря или панели быстрого доступа. +It's very sticky and tough but you could probably get a knife through it. +Он очень липкий и плотный, но вы, вероятно, могли бы проткнуть его ножом. +Autotape (Arms) +Скотч (Руки) +Sticky tape made from a metallic material. Used to great effect in police situations. +Липкая лента, изготовленная из металлического материала. Активно используется полицейскими. +It's very sticky and tough but you could probably get a knife through it. +Он очень липкий и плотный, но вы, вероятно, могли бы проткнуть его ножом. +Autotape (Legs) +Скотч (Ноги) +Sticky tape made from a metallic material. Used to great effect in police situations. +Липкая лента, изготовленная из металлического материала. Активно используется полицейскими. +It's very sticky and tough but you could probably get a knife through it. +Он очень липкий и плотный, но вы, вероятно, могли бы проткнуть его ножом. +Autotape (Ankles) +Скотч (Лодыжки) +Sticky tape made from a metallic material. Used to great effect in police situations. +Липкая лента, изготовленная из металлического материала. Активно используется полицейскими. +It's very sticky and tough but you could probably get a knife through it. +Он очень липкий и плотный, но вы, вероятно, могли бы проткнуть его ножом. +Autotape (Feet) +Скотч (Ступни) +Sticky tape made from a metallic material. Used to great effect in police situations. +Липкая лента, изготовленная из металлического материала. Активно используется полицейскими. +It's very sticky and tough but you could probably get a knife through it. +Он очень липкий и плотный, но вы, вероятно, могли бы проткнуть его ножом. +Autotape (Mouth) +Скотч (Рот) +Sticky tape made from a metallic material. Used to great effect in police situations. Can be used on vulnerable targets from quick inventory or hotbar. +Липкая лента, изготовленная из металлического материала. Активно используется полицейскими. Может быть использовано для поражения уязвимых целей из быстрого инвентаря или панели быстрого доступа. +It's very sticky and tough but you could probably get a knife through it. +Он очень липкий и плотный, но вы, вероятно, могли бы проткнуть его ножом. +Autotape (Mouth Wrap) +Скотч (Вокруг рта) +Sticky tape made from a metallic material. Used to great effect in police situations. +Липкая лента, изготовленная из металлического материала. Активно используется полицейскими. +It's very sticky and tough but you could probably get a knife through it. +Он очень липкий и плотный, но вы, вероятно, могли бы проткнуть его ножом. +Living Auto Tape Collar +Живой ошейник-запаковщик +This collar is designed to make sure its wearer does not escape their tape. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не выберется из скотча. +It will occasionally cause tape to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of tape you have on you. +Иногда из ниоткуда будут появляться мотки скотча и связывать носителя. Частота срабатывания увеличивается в зависимости от количества обернутых вокруг вас лент. +Stuffing +Набивка рта +A stuffing of cloth. Can be applied on vulnerable targets or those who casted a verbal spell last turn. +Это просто скомканная ткань. Может быть применена к уязвимым целям или к тем, кто произнес словесное заклинание в последний ход. +You could spit it out easily, provided nothing's covering it. +Вы могли бы легко выплюнуть это, при условии, что ваш рот ничего не блокирует. +Living Mithril Collar +Живой ошейник (Мифрил) +A collar made from an almost-weightless alloy that adjusts itself to your neck. +Ошейник, изготовленный из почти невесомого сплава, который сам подстраивается к вашей шее. +It will occasionally cause mithril to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of mithril you have on you. +Иногда из ниоткуда будет появляться мифрил и сковывать носителя. Частота срабатывания увеличивается в зависимости от количества мифрила на вашем теле. +Mithril Collar +Мифриловый ошейник +A collar made from an almost-weightless alloy.. +Ошейник, изготовленный из практически невесомого сплава. +It feels comfortable but it's also really hard. +Он кажется удобным, но в то же время очень тугим. +Mithril Cuffs +Мифриловые манжеты +A pair of cuffs that make it easy to restrain you. +Пара манжет, которые позволяют легко сковать вас. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +The enemy attaches your wrist cuffs together! +Враг скрепляет ваши манжеты на запястьях друг с другом! +Wrist Chain +Цепочка между запястий +A pair of cuffs keeping your arms behind your back. +Пара манжет, удерживающих ваши руки за спиной. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +Your cuffs detatch! +Ваши манжеты расцепляются! +The enemy attaches your elbow cuffs together! +Враг скрепляет ваши манжеты на локтях! +Cuffs Chain +Цепочка между манжет +A full set of cuffs keeping your arms in a strict elbow tie! +Полный комплект манжет, удерживающих ваши руки строго скованными в районе локтей! +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +Your wrists detatch, leaving your elbows still bound! +Ваши запястья расцепляются, однако локти все еще скованы! +Elbow Chain +Цепочка между локтями +A pair of cuffs keeping your elbows locked together! +Пара манжет, удерживающих ваши локти сцепленными друг с другом! +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +Your elbows detatch! +Ваши локти расцепляются! +The enemy attaches your wrist cuffs back together! +Враг снова сковывает ваши манжеты на запястьях! +Mithril Leg Cuffs +Мифриловые манжеты (Ноги) +A pair of cuffs on your legs. +Пара манжет для ваших ног. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +The enemy attaches your leg cuffs together! +Враг сковывает ваши манжеты на ногах! +Thigh Chain +Цепочка между бедер +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +The leg cuff chain detaches! +Цепочка отстегивается от манжет на ногах! +Mithril Ankle Cuffs +Мифриловые манжеты (Лодыжки) +A pair of cuffs on your ankles. +Пара манжет для ваших лодыжек. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Ankle Chain +Цепочка между лодыжек +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +Your ankle cuff chain is tightened and pulls your feet together! +Цепочка между манжет на лодыжках затягивается и стягивает ваши ступни вместе! +Short Ankle Chain +Короткая цепочка между лодыжек +A pair of cuffs chaining your feet tightly together. +Пара манжет, туго стягивающих ваши ноги друг с другом. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +Your ankle cuff chain loosens! +Цепочка между манжет на щиколотках ослабевает! +Living Leather Collar +Живой ошейник (Кожа) +A collar made of tough leather that adjusts itself to your neck. +Ошейник из прочной кожи, который сам подстраивается под вашу шею. +It will occasionally cause leather to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of leather you have on you. +Иногда из ниоткуда будут появляться кожаные изделия и сковывать носителя. Частота срабатывания увеличивается в зависимости от количества кожаных изделий на вашем теле. +Leather Cuffs +Кожаные манжеты +A pair of cuffs that make it easy to restrain you. +Пара манжет, которые позволяют легко сковать вас. +Made of tough leather. +Изготовлены из прочной кожи. +The enemy attaches your wrist cuffs together! +Враг скрепляет ваши манжеты на запястьях друг с другом! +Wrist Chain +Цепочка между запястий +A pair of cuffs keeping your arms behind your back. +Пара манжет, удерживающих ваши руки за спиной. +Made of tough leather. +Изготовлены из прочной кожи. +Your cuffs detatch! +Ваши манжеты расцепляются! +The enemy attaches your elbow cuffs together! +Враг скрепляет ваши манжеты на локтях! +Cuffs Chain +Цепочка между манжет +A full set of cuffs keeping your arms in a strict elbow tie! +Полный комплект манжет, удерживающих ваши руки строго скованными в районе локтей! +Made of tough leather. +Изготовлены из прочной кожи. +Your wrists detatch, leaving your elbows still bound! +Ваши запястья расцепляются, однако локти все еще скованы! +Elbow Chain +Цепочка между локтями +A pair of cuffs keeping your elbows locked together! +Пара манжет, удерживающих ваши локти сцепленными друг с другом! +Made of tough leather. +Изготовлены из прочной кожи. +Your elbows detatch! +Ваши локти расцепляются! +The enemy attaches your wrist cuffs back together! +Враг снова сковывает ваши манжеты на запястьях! +Leather Leg Cuffs +Кожаные манжеты для ног +A pair of cuffs on your legs. +Пара манжет для ваших ног. +Made of tough leather. +Изготовлены из прочной кожи. +The enemy attaches your leg cuffs together! +Враг сковывает ваши манжеты на ногах! +Thigh Chain +Цепочка между бедер +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +Made of tough leather. +Изготовлены из прочной кожи. +The leg cuff chain detaches! +Цепочка отстегивается от манжет на ногах! +Leather Ankle Cuffs +Кожаные манжеты для лодыжек +A pair of cuffs on your ankles. +Пара манжет для ваших лодыжек. +Made of tough leather. +Изготовлены из прочной кожи. +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Ankle Chain +Цепочка между лодыжек +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +Made of tough leather. +Изготовлены из прочной кожи. +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +Your ankle cuff chain is tightened and pulls your feet together! +Цепочка между манжет на лодыжках затягивается и стягивает ваши ступни вместе! +Short Ankle Chain +Короткая цепочка между лодыжек +A pair of cuffs chaining your feet tightly together. +Пара манжет, туго стягивающих ваши ноги друг с другом. +Made of tough leather. +Изготовлены из прочной кожи. +Your ankle cuff chain loosens! +Цепочка между манжет на щиколотках ослабевает! +Sticky Slime +Липкая слизь +A sticky layer of slime keeping you anchored to the ground. +Слой липкой, удерживающий вас на месте. +It will slow you for a single turn. +Она замедляет вас на один ход. +Leather Mittens +Кожаные рукавицы +A pair of tight leather mittens enclosing your hands. +Пара плотных кожаных рукавиц, закрывающих ваши руки. +They make it almost impossible to manipulate keys and tools. Keep your hands to yourself! +Они практически лишают вас возможностью воспользоваться ключами или инструментами. Держите свои руки при себе! +Leather Legbinder +Кожаный легбиндер +A tight leather legbinder that keeps your feet glued together. +Плотный кожаный легбиндер, который удерживает ваши ступни вплотную друг к другу. +It's quite snug and the laces are secured with a lockable panel. Getting at them requires picking the lock. +Он довольно плотный, а шнурки защищены с помощью закрывающейся панели. Чтобы добраться до них, нужно вскрыть замок. +Leather Armbinder +Кожаный армбиндер +A tight leather armbinder enclosing your hands and arms completely. +Плотный кожаный армбиндер, полностью закрывающий ваши руки. +It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible. +Довольно удобно и застегивается сзади на запирающиеся пряжки. Самостоятельно вскрыть замки вы не сможете. +Leather Boxbinder +Кожаная сумка для рук +A secure but comfortable binder meant for long-term wear. +Надежная, но удобная сумка для рук, предназначенная для длительного ношения. +It's quite snug and secured by lockable buckles in the back. Picking the locks yourself is impossible. +Довольно удобно и застегивается сзади на запирающиеся пряжки. Самостоятельно вскрыть замки вы не сможете. +Leather Armbinder Harness +Кожаный армбиндер с ремнями +Leather belts securing your armbinder tightly. +Кожаные ремни надёжно фиксируют ваш армбиндер. +It's quite tight and secured by lockable buckles on your sides. +Он довольно плотный и застегивается на запирающиеся пряжки по бокам. +The armbinder harness comes off with the armbinder. +Блокирующие ремни снимаются вместе с армбиндером. +The energy link between your ankle cuffs fizzles into nothing. +Энергетическая связь между манжетами на лодыжках исчезает. +The energy link between your arm cuffs fizzles into nothing. +Энергетическая связь между манжетами на руках исчезает. +The energy link between your thigh cuffs fizzles into nothing. +Энергетическая связь между манжетами на бедрах исчезает. +The cuff chains come off with the cuffs. +Цепочки для манжет снимаются вместе с манжетами. +The hogtie link comes off. +Перекрестная пряжка отсоединяется. +Handcuffs +Наручники +A pair of steel cuffs locked securely around your wrists. Can be applied on vulnerable targets if targeted from inventory or hotbar. +Пара стальных наручников надежно фиксируется на ваших запястьях. Могут быть применены к уязвимым целям из инвентаря или панели быстрого доступа. +The lock doesn't seem very complicated. +Замок не кажется особо сложным. +Steel Yoke +Стальное ярмо +A steel bar clamped firmly around your wrists and neck, leaving you in a helpless position. +Стальной прут крепко обхватывает ваши запястья и шею, оставляя вас в беспомощном положении. +The awkward position makes it difficult to get out of alone. +Из столь неудобного положения трудно выбраться в одиночку. +Heavy Yoke +Тяжелое ярмо +A series of armor-grade plates cut with precision machining, sandwiched into an unbreakable layer that clasps firmly in place around your neck and wrists. +Несколько бронированных пластин, вырезанных с помощью точной механической обработки, уложенных в неразрывный слой, который надежно фиксируется на шее и запястьях. +The awkward position makes it difficult to get out of alone. +Из столь неудобного положения трудно выбраться в одиночку. +Steel Fiddle +Стальная скрипка +A steel fixture keeping your hands in an awkward and submissive position. +Стальное приспособление, удерживающее ваши руки в неудобном и покорном положении. +The awkward position prevents you from easily reaching the lock. +Неудобное положение не позволяет вам легко дотянуться до замка. +Leather Harness +Кожаная упряжь +A leather harness of tight straps buckled around your torso. +Кожаная упряжь из тугих ремней, застегивающихся вокруг вашего торса. +It provides an anchor point for enemies to grab onto! +На ней есть крючки, за которые могут ухватиться ваши враги! +Rubberized Harness +Прорезиненная упряжь +A harness made of latex polymer, resistant to most solvents and corrosion. +Упряжь, изготовленная из латексного полимера, стойкого к большинству растворителей и коррозии. +Can be worn all day! Also convenient to hold. +Можно носить весь день! Также полезна, если надо что-то закрепить. +Ball Gag +Кляп-шар +A gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +Кляп, сделанный из красного мягкого материала. Может применяться против уязвимых целей или тех, кто в последний ход произнес словесное заклинание, в половину силы. +You can't seem to enunciate your spells properly with this in. +Кажется, с ним вы не можете правильно произносить свои заклинания. +Large Ball Gag +Большой кляп-шарик +A mouth-filling gag made of a red squishy material. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +Заполняющий большую часть рта кляп, изготовленный из красного мягкого материала. Может применяться против уязвимых целей или тех, кто в последний ход произнес словесное заклинание, в половину силы. +You can't seem to enunciate your spells properly with this in. +Кажется, с ним вы не можете правильно произносить свои заклинания. +Tight Ball Gag +Тугой кляп-шар +A gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +Кляп, сделанный из красного мягкого материала. Застегивается настолько туго, насколько это возможно. Может применяться против уязвимых целей или тех, кто в последний ход произнес словесное заклинание, в половину силы. +You can't seem to enunciate your spells properly with this in. +Кажется, с ним вы не можете правильно произносить свои заклинания. +Huge Ball Gag +Огромный кляп-шарик +A massive gag made of a red squishy material, buckled as tight as it will go. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +Массивный кляп из красного мягкого материала, застегивающийся настолько туго, насколько это возможно. Может применяться против уязвимых целей или тех, кто в последний ход произнес словесное заклинание, в половину силы. +You absolutely can't enunciate your spells properly with this in. +Вы абсолютно точно не сможете правильно произносить свои заклинания с ним во рту. +Magic Ball Gag +Магический кляп-шар +A gag enchanted with magic. It grows to fill your mouth so you can hardly speak. Can be applied on vulnerable targets or those who casted a verbal spell last turn, at half strength. +Зачарованный кляп. Он растет и заполняет ваш рот, так что вы едва можете говорить. Может применяться против уязвимых целей или тех, кто в последний ход произнес словесное заклинание, в половину силы. +It's brimming with conjured energy. A normal knife won't work here! +Он защищен энергией сотворения. Обычный нож здесь не подойдет! +Anti-Magic Gag +Антимагический кляп +A gag designed to cripple mages. It's made of a squishy rubbery material. +Кляп, предназначенная для того, чтобы ограничивать магов. Он сделан из мягкого эластичного материала. +It's sealed with a magical spell that rapidly absorbs mana! When it drains 40 mana it will transform into an ordinary gag and inflate. +Он запечатан магическим заклинанием, которое быстро поглощает ману! Когда он истощит 40 единиц маны, он превратится в обычный кляп и раздуется. +Anti-Mage Gag +Антимагический кляп v2 +A gag designed to cripple experienced spellcasters. It's made of a magic-absorbing rubber. +Кляп, предназначенная для того, чтобы вывести из строя опытных заклинателей. Он сделан из поглощающей магию резины. +You feel the energy flowing out of you! When it drains 100 mana it will transform into an ordinary gag and inflate. +Вы чувствуете, как из вас вытекает энергия! Когда он истощит 100 единиц маны, то превратится в обычный кляп и раздуется. +Ballet Heels +Балетки +A pair of shoes with heels so tall it forces you on your toes. +Пара туфель на таких высоких каблуках, что вам приходится вставать на цыпочки. +These will take some getting used to. +Чтобы привыкнуть к ним, потребуется некоторое время. +Training Heels +Тренировочные каблуки +A pair of unreasonably high heels owned by you personally. +Пара неоправданно высоких каблуков, специально для вас. +These will take some getting used to. +Чтобы привыкнуть к ним, потребуется некоторое время. +Leg Irons +Ножные кандалы +A pair of solid steel cuffs connecting your ankles inescapably. +Пара прочных стальных манжет, закрепленных на ваших лодыжках. +The lock doesn't seem very complicated. +Замок не кажется особо сложным. +Blindfold +Повязка на глаза +A leather strap secured onto your face and blocking vision. +Кожаная полоска, закрепленная на вашем лице и закрывающая обзор. +You can still see through the gap around your nose. +Вы все еще можешь видеть через щель около своего носа. +Magic Chastity Belt +Магический пояс целомудрия +A belt protected by a magic seal. +Пояс, защищенный магической печатью. +The shields will open up to accept new toys, but won't let them out... +Щитки могут открыться, чтобы принять новые игрушки, но они уже не выпустят их наружу... +Steel Chastity Belt +Стальной пояс целомудрия +A cruel device used for locking magical vibrators in place. +Жестокое устройство, используемое для фиксации магических вибраторов. +The shields will open up to accept new toys, but won't let them out... +Щитки могут открыться, чтобы принять новые игрушки, но они уже не выпустят их наружу... +Blacksteel Belt +Пояс из черной стали +A cruel device used for locking magical vibrators in place. +Жестокое устройство, используемое для фиксации магических вибраторов. +Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. +Черная сталь - это металл, использовавшийся Древней цивилизацией. Его очень трудно поцарапать, не говоря уже о том, чтобы разрезать. +Blacksteel Bra +Бюстгальтер из черной стали +A cruel device used for locking magical massagers in place. +Жестокое устройство, используемое для фиксации магических массажеров. +Blacksteel is a metal used by the Old Civilization. It is very difficult to scratch, let alone cut. +Черная сталь - это металл, использовавшийся Древней цивилизацией. Его очень трудно поцарапать, не говоря уже о том, чтобы разрезать. +Prototype Belt +Пояс-Прототип +A strange device built using unknown technology. +Странное устройство, созданное с использованием неизвестной технологии. +The lock is extremely advanced, and the ports at the bottom readily accept toys but won't let them out... +Замок чрезвычайно сложный, а отверстия внизу легко принимают игрушки, но не выпускают их наружу... +Steel Chastity Bra +Стальной бюстгальтер целомудрия +A cruel device used for locking magical massagers in place. +Жестокое устройство, используемое для фиксации магических массажеров. +It won't stop the dungeon's little curses, but will keep you from removing them. +Он не остановит маленьких демонёнков подземелья, но помешает вам снять их. +Ornate Chastity Belt +Изысканный пояс целомудрия +A cruel device used for locking magical vibrators in place. +Жестокое устройство, используемое для фиксации магических вибраторов. +The lock won't come off until the magic wears off in time... +Замок не снимется, пока не пройдет время и действие магии не ослабнет... +Ornate Chastity Bra +Изысканный бюстгальтер целомудрия +A cruel device used for locking magical massagers in place. +Жестокое устройство, используемое для фиксации магических массажеров. +The lock won't come off until the magic wears off in time... +Замок не снимется, пока не пройдет время и действие магии не ослабнет... +Maid Chastity Belt +Пояс целомудрия горничной +A chastity belt used to maintain control over initiate maids. +Пояс целомудрия, используемый для контроля над новенькими горничными. +Made of hardened steel. The lock is high-security. +Изготовлен из закаленной стали. Замок имеет высокую степень защиты. +Magic Egg +Магическое яйцо +An energetic little friend that likes to tease you. +Энергичный маленький друг, которому нравится вас дразнить. +It is charged by residual magic from your spells. Type: Teasing +Оно заряжается остаточной магией от ваших заклинаний. Тип: Поддразнивание +Prototype Egg +Яйцо-прототип +A teaser that periodically vibrates. +Периодически вибрирующая дразнилка. +High efficiency mana conversion means longer tease duration. Type: Teasing, Pleasure, Edging +Высокая эффективность преобразования маны даёт большую продолжительность вибрации. Тип: Поддразнивание, Удовольствие, Удержание на грани +Vibrating Plug +Вибрирующая пробка +A sizeable plug that makes you happy... a little too happy. +Большая пробка, которая сделает вас счастливыми... слишком счастливыми. +It vibrates periodically and adds distraction when moving. Type: Pleasure +Она периодически вибрирует и возбуждает при движении. Тип: Удовольствие +Teaser Plug +Пробка-дразнилка +A sizeable plug that will tease you but never let you go... +Большая пробка, которая будет дразнить вас, но никогда не даст кончить... +It vibrates weakly periodically. Type: Teasing, Denial +Она периодически слабо вибрирует. Тип: Поддразнивание, Отрицание +Torment Plug +Мучительная пробка +A sizeable plug that will make your life unbearably pleasurable... +Большая пробка, которая сделает вашу жизнь невыносимо приятной... +It vibrates strongly periodically and has a denial setting. Type: Denial +Она периодически сильно вибрирует, но имеет настройку 'Отказать'. Тип: Отрицание +Thundering Plug +Громоподобная пробка +A sizeable plug that will make your life unbearably pleasurable... +Большая пробка, которая сделает вашу жизнь невыносимо приятной... +Enjoy it while you can. Type: Pleasure, Edging +Наслаждайся этим, пока можешь. Тип: Удовольствие, Удержание на грани +Intense Training Plug +Интенсивная тренировочная пробка +An energetic plug that will make your life unbearably pleasurable... +Энергичная пробка, которая сделает вашу жизнь невыносимо приятной... +You're going to have the time of your life. Type: Pleasure, and lots of it +У вас будет лучшее время в вашей жизни. Тип: Удовольствие, много удовольствия +Rear Vibrating Plug +Вибрирующая пробка (Зад) +A device that attacks from multiple angles. +Устройство, которое атакует с другой стороны. +An enjoyable experience. Type: Edging +Приятный опыт. Тип: Удержание на грани +Maid Egg +Яйцо горничной +An energetic little friend that likes to tease you and takes orders from the head maid. +Энергичная маленькая подружка, которая любит дразнить вас и выполняет приказы старшей горничной. +It is charged by residual magic from your spells. Type: Teasing, Edging +Она заряжается остаточной магией от ваших заклинаний. Тип: Поддразнивание, Удержание на грани +Stainless Plug (F) +Пробка из нержавеющей стали (Перед) +A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... +Увесистая пробка, которая не вибрирует, но вы наверняка заметите, как она отдаётся при ходьбе... +This one goes in the front. +Эта для передней дырочки. +Stainless Plug (R) +Пробка из нержавеющей стали (Зад) +A weighty plug that doesn't vibrate, but you'll certainly notice it walking around... +Увесистая пробка, которая не вибрирует, но вы наверняка заметите, как она отдаётся при ходьбе... +This one goes in the back. +Эта для задней дырочки. +Shadow Hand Gag +Теневые руки (кляп) +It clasps tightly over the mouth and prevents you from casting your spells! +Они плотно закрывают вам рот и не дают произносить заклинания! +You have no choice but to struggle. +У вас нет другого выбора, кроме как бороться. +Shadow Hand Eyes +Теневые руки (Глаза) +Shadow hands clasped over your eyes, making it hard to see. +Теневые руки закрывают ваши глаза, мешая видеть. +You have no choice but to struggle. +У вас нет другого выбора, кроме как бороться. +Shadow Hands (Legs) +Теневые руки (Ноги) +They are wrapped around your legs! +Они схватили вас за ноги! +You have no choice but to struggle. +У вас нет другого выбора, кроме как бороться. +Shadow Hands (Legs) +Теневые руки (Ноги) +They are wrapped around your legs! +Они схватили вас за ноги! +You have no choice but to struggle. +У вас нет другого выбора, кроме как бороться. +Shadow Hands (Arms) +Теневые руки (Руки) +They are squeezing you tightly! +Они крепко сжимают вас! +You have no choice but to struggle. +У вас нет другого выбора, кроме как бороться. +Shadow Hands (Arms) +Теневые руки (Руки) +They are squeezing you tightly! +Они крепко сжимают вас! +You have no choice but to struggle. +У вас нет другого выбора, кроме как бороться. +Shadow Hands (Feet) +Теневые руки (Ступни) +They are holding your feet together! +Они удерживают ваши лодыжки вместе! +You have no choice but to struggle. +У вас нет другого выбора, кроме как бороться. +Shadow Hands... +Теневые руки... +They are holding your... uh... +Они держат вас... уф... +You have no choice but to struggle. +У вас нет другого выбора, кроме как бороться. +Wrist Vines +Лозы на запястьях +A box tie keeping your arms secured behind your back. +Вязь, надежно удерживающая ваши руки за спиной. +The vines twitch as they try to wrap around tighter. +Лозы подёргиваются, пытаясь обвиться плотнее. +Vine Harness +Упряжь из лоз +A harness acting as a handle to pull you around +Упряжь, служащий ручкой для того, чтобы тянуть вас за собой +The vines twitch as they try to wrap around tighter. +Лозы подёргиваются, пытаясь обвиться плотнее. +Leg Vines +Лозы на ногах +A tie that hobbles your legs together.. +Вязь, которая стреноживает ваши ноги.. +The vines twitch as they try to wrap around tighter. +Лозы подёргиваются, пытаясь обвиться плотнее. +Ankle Vines +Лозы на лодыжки +A tie keeping your feet secured together. +Вязь, которая надежно стягивает ваши ноги друг с другом. +The vines twitch as they try to wrap around tighter. +Лозы подёргиваются, пытаясь обвиться плотнее. +High-Security Cuffs +Ультра-надежные манжеты +A set of irish-8-style cuffs that are both restrictive and quick to apply. Can be applied on vulnerable targets if targeted from inventory or hotbar. +Набор манжет в стиле irish-8, которые одновременно являются хорошим ограничителем и быстро надеваются. Могут быть применены к уязвимым целям из инвентаря или панели быстрого доступа. +It uses a standard lock rather than a simple one. +В них используется стандартный замок, а не простой. +Wolfbinder +Волкбиндер +A sophisticated training system used to keep wolfgirls from scratching their owners. +Изощренная система для дрессировки, используемая для того, чтобы волчицы не царапали своих хозяев. +Despite the harsh position, it is padded, breathable, and suitable for long term wear. +Несмотря на требование сохранять строгую позу, она мягкая, дышащая и подходит для длительного ношения. +Wolf Queenbinder +Сдерживатель королевы волков +This was made to be used during a coup attempt. Unfortunately, its creator ended up wearing it instead, after the coup's failure. +Он был создан для использования во время попытки путча. К сожалению, после провала путча он оказался на своем создаете. +Designed to hold the queen of wolves helpless for an indefinite period of time. +Предназначен для того, чтобы держать королеву волчиц в беспомощном состоянии в течение неопределенного периода времени. +Smart Training Cuffs +Умные тренировочные манжеты +Cuffs with a feature to punish the wearer if they act aggressively. +Манжеты с функцией наказания владельца, если он ведет себя агрессивно. +They are solid metal and will be hard to remove without the key. +Они изготовлены из твёрдого металла, и их будет трудно снять без ключа. +Linked Smart Cuffs +Соединяющиеся умные манжеты +Cuffs with a feature to punish the wearer if they act aggressively. +Манжеты с функцией наказания владельца, если он ведет себя агрессивно. +Looks like you got yourself in trouble. +Похоже, вы вляпались в неприятности. +Training Harness +Тренировочная упряжь +A harness that keeps a wolfgirl's suit together. It makes escaping more difficult. +Упряжь, которая дополнительно защищает костюм девушки-волчицы. Она затрудняет побег. +While it is weatherproof and rugged, its straps are merely nylon. +Несмотря на то, что она устойчива к погодным воздействиям и прочна, её ремешки сделаны из простого нейлона. +Training Mittens +Тренировочные варежки +When wolfgirls won't keep those pesky claws in line, these will make sure she can't cause too much trouble. +Когда волчицы не хотят держать свои надоедливые когти в узде, варежки позаботятся о том, чтобы те не доставляли слишком много хлопот. +Made from strong reinforced fabric, your claws won't do anything to these mittens. +Изготовлены из прочной армированной ткани. Ваши когти ничего не сделают с этими варежками. +Training Gag +Тренировочный кляп +A gag used to prevent wolfgirls from biting their owners. +Кляп, используемый для того, чтобы девочки-волчицы не кусали своих хозяев. +It is reinforced with steel cables, so getting it off will be tricky. +Он укреплен стальными тросами, так что снять его будет непросто. +Training Collar +Тренировочный ошейник +A collar with a decorative tag used to identify wolfgirls. +Ошейник с декоративной биркой, используемый для идентификации девушек-волчиц. +Also good for identifying people in general. What a great idea! +Также хорош для идентификации людей в целом. Какая отличная идея! +Training Leash +Тренировочный поводок +A leash used for training pets. +Поводок, используемый для дрессировки домашних животных. +It is a steel cable with a weatherproof rubber coating, and a convenient handle. +Это стальной трос с устойчивым к погодным явлениям резиновым покрытием и удобной ручкой. +Magical Leash +Магический поводок +A leash made of magical energy, linked to a submissive's collar. +Поводок, сделанный из магической энергии и прикрепленный к ошейнику сабмиссива. +Very difficult to break unless you have a strong magical blade. +Очень трудно разорвать, если только у вас нет сильного магического клинка. +Your ankle cuffs snap together on their own! +Манжеты на щиколотках скрепляются сами по себе! +Your ankle cuffs detach! +Манжеты на лодыжках отстегиваются! +Asylum Muzzle +Лечебный намордник +The nurses use this on noisy patients! +Медсестры используют его для лечения шумных пациентов! +It's sturdy leather... +Это прочная кожа... +Asylum Jacket +Лечебная смирительная рубашка +A straitjacket that keeps patients out of trouble. +Смирительная рубашка, которая уберегает пациентов от неприятностей. +It has many straps and is very difficult to escape. +У неё много ремней, и её очень трудно снять. +Asylum Legbinder +Лечебный легбиндер +This legbinder will keep the patient from kicking the nurses. +Этот легбиндер не даст пациенту пинать медсестер. +It has both laces and straps. +У него есть как шнурки, так и ремни. +Asylum Ankle Cuffs +Лечебные манжеты для лодыжек +A pair of chained cuffs made of reinforced leather. They make patients easier to catch. +Пара манжет с цепочкой, сделанная из дублёной кожи. С их помощью пациентов легче поймать. +They can be thrown from long distances. +Их можно бросать с большого расстояния. +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Cuffs Chain +Цепочка между манжет +A pair of chained cuffs made of reinforced leather. They make patients easier to catch. +Пара манжет с цепочкой, сделанная из дублёной кожи. С их помощью пациентов легче поймать. +They can be thrown from long distances. +Их можно бросать с большого расстояния. +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +Asylum Leg Cuffs +Лечебные манжеты для ног +A pair of chained cuffs made of reinforced leather. They make patients easier to catch. +Пара манжет с цепочкой, сделанная из дублёной кожи. С их помощью пациентов легче поймать. +They can be thrown from long distances. +Их можно бросать с большого расстояния. +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Thigh Chain +Цепочка между бедер +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +They are made of a steel alloy. +Они изготовлены из стального сплава. +The leg cuff chain detaches! +Цепочка отстегивается от манжет на ногах! +Transport Jacket +Транспортировочный жилет +This jacket goes over a straitjacket to keep the arms trapped. +Этот жилет надевается поверх смирительной рубашки, чтобы держать руки скованными. +It makes it extraordinarily difficult to escape the jacket it covers. +Из-за него чрезвычайно трудно выбраться из смирительной рубашки, которую он прикрывает. +Living Asylum Collar +Живой ошейник (Лечебница) +A collar made of tough cowhide that adjusts itself to your neck. +Ошейник из прочной коровьей кожи, который сам подстраивается под вашу шею. +It will occasionally cause asylum gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of asylum gear you have on you. +Иногда из ниоткуда будет появляться лечебное снаряжение и сковывать носителя. Частота срабатывания увеличивается в зависимости от количества лечебных ограничителей на вашем теле. +Asylum Cuffs +Лечебные манжеты +A pair of leather cuffs that make it easy to restrain you. +Пара кожаных манжет, которые позволяют легко сковать вас. +They're made of tough cowhide. +Они сделаны из прочной коровьей кожи. +The enemy attaches your wrist cuffs together! +Враг скрепляет ваши манжеты на запястьях друг с другом! +Wrist Chain +Цепочка между запястий +A pair of leather cuffs keeping your arms behind your back. +Пара кожаных манжет, удерживающих ваши руки за спиной. +They're made of tough cowhide. +Они сделаны из прочной коровьей кожи. +Your cuffs detatch! +Ваши манжеты расцепляются! +The enemy attaches your elbow cuffs together! +Враг скрепляет ваши манжеты на локтях! +Wrist Chain +Цепочка между запястий +A full set of leather cuffs keeping your arms in a strict elbow tie! +Полный комплект кожаных манжет, туго сковывающий ваши руки в локтях! +They're made of tough cowhide. +Они сделаны из прочной коровьей кожи. +Your wrists detatch, leaving your elbows still bound! +Ваши запястья расцепляются, однако локти все еще скованы! +Elbow Chain +Цепочка между локтями +A pair of leather cuffs keeping your elbows locked together!. +Пара кожаных манжет, удерживающая ваши локти вместе!. +They're made of tough cowhide. +Они сделаны из прочной коровьей кожи. +Your elbows detatch! +Ваши локти расцепляются! +The enemy attaches your wrist cuffs back together! +Враг снова сковывает ваши манжеты на запястьях! +Comfy Muzzle +Удобный намордник +A lovely muzzle that's extraordinarily comfy! +Прелестный намордник, который необычайно удобен! +It's made of an ethereal material... +Он сделан из эфирного материала... +Comfy Straitjacket +Удобная смирительная рубашка +A straitjacket that is padded on the inside. +Смирительная рубашка с подкладкой внутри. +It feels tight but is actually made of an ethereal material... +На ощупь она плотная, но на самом деле сделана из эфирного материала... +Latex Jacket +Латексная смир. рубашка +A tight jacket that keeps your arms completely useless. +Облегающая рубашка, которая делает ваши руки совершенно бесполезными. +It has too much grip to struggle out of, but is made of a fragile material. +Слишком плотно сидит, чтобы можно было вырваться, но сделано из не самого плотного материала. +Secure Latex Jacket +Надежный латексный жилет +This straitjacket has extra straps and buckles to make sure you won't be struggling out of it. +Эта смирительная рубашка снабжена дополнительными ремешками и пряжками, чтобы вам не удалось из нее вырваться. +It has too much grip to struggle out of, but is made of a fragile material. +Слишком плотно сидит, чтобы можно было вырваться, но сделано из не самого плотного материала. +Latex Armbinder +Латексный армбиндер +A tight armbinder that pins your arms tightly behind your back, enclosed completely. +Тугой армбиндер, который туго скручивает ваши руки за спиной, полностью покрывая их. +It has too much grip to struggle out of, but is made of a fragile material. +Слишком плотно сидит, чтобы можно было вырваться, но сделано из не самого плотного материала. +Latex Boxbinder +Латексная сумка для рук +A secure but comfortable binder meant for long-term wear. +Надежная, но удобная сумка для рук, предназначенная для длительного ношения. +It has too much grip to struggle out of, but is made of a fragile material. +Слишком плотно сидит, чтобы можно было вырваться, но сделано из не самого плотного материала. +Latex Legbinder +Латексный легбиндер +A tight legbinder that keeps your legs together! +Тугой легбиндер, который удерживает ваши ноги вместе! +It has too much grip to struggle out of, but is made of a fragile material. +Слишком плотно сидит, чтобы можно было вырваться, но сделано из не самого плотного материала. +Latex Boots +Латексные ботинки +A tight pair of boots that makes it difficult to walk! +Тесная пара ботинок, в которых трудно ходить! +It has too much grip to struggle out of, but is made of a fragile material. +Слишком плотно сидит, чтобы можно было вырваться, но сделано из не самого плотного материала. +Heavy Latex Corset +Строгий латексный корсет +An excruciatingly tight corset that hugs your body, with straps securing your other restraints. +Мучительно тугой корсет, который врезается в ваше тело, с ремнями, закрепляющими другие ограничители. +It has too much grip to struggle out of, but is made of a fragile material. +Слишком плотно сидит, чтобы можно было вырваться, но сделано из не самого плотного материала. +Latex Catsuit +Латексный комбинезон +A skintight suit that's stretched on tight. It adheres to latex restraints making struggling more difficult. +Очень тугой обтягивающий костюм. Он прилипает к латексным ограничителям, затрудняя борьбу. +Blue latex is silky smooth, very stretchy, and very good at adhering to itself. +Голубой латекс гладкий, как шелк, очень эластичный и очень хорошо прилипает к другим латексным предметом. +Heavy Latex Catsuit +Плотный латексный комбинезон +A skintight suit that's stretched on tight and made of thick latex. It adheres to latex restraints making struggling more difficult. +Очень тугой обтягивающий костюм. Изготовлен из плотного латекса. Очень хорошо прилипает к латексным ремням, что затрудняет борьбу. +Blue latex is silky smooth, very stretchy, and very good at adhering to itself. Its thickness makes it particularly resistant to cutting. +Голубой латекс гладкий, как шелк, очень эластичный и очень хорошо прилипает к другим латексным предметом. Его толщина делает его особенно устойчивым к разрезанию. +Latex Mittens +Латексные варежки +A pair of mittens keep your hands out of trouble. They adhere to latex restraints making struggling more difficult. +Пара варежек убережет ваши руки от неприятностей. Они прилипают к латексным ограничителям, затрудняя борьбу. +It has too much grip to struggle out of, but is made of a fragile material. +Слишком плотно сидит, чтобы можно было вырваться, но сделано из не самого плотного материала. +Latex Cube +Латексный куб +A gelatinous cube that engulfed you at some point in the past. +Желатиновый куб, который поглотил вас в какой-то момент в прошлом. +It seems quite content staying where it is. +Кажется, он вполне доволен тем, что остается там, где есть. +Slime Bubble +Слизевый пузырь +A squishy and sticky bubble that you can't get out of! +Мягкий и липкий пузырь, из которого вы не сможете выбраться! +It will slow you down severely but can be popped if you can reach a knife... +Он сильно замедляет ваше движение, но его можно будет лопнуть, если вы сможете дотянуться до ножа... +Latex Sphere +Латексная сфера +A giant inflatable sphere that compresses you and leaves you helpless... +Гигантская надувная сфера, которая сжимает вас и делает беспомощной... +You can't see out of it nor can you control its movement. If only you could puncture it! +Вы ничего не видите из-за неё и не можете контролировать её движение. Если бы только вы могли проколоть её! +Latex Ball Suit +Латексный костюм-мяч +A giant inflatable sphere that leaves you rolling around... +Гигантский надувной шар, который позволяет вам кататься по земле... +Your movement is severely hampered, limited to feeble wiggling... +Ваши движения сильно затруднены и сводятся к слабым покачиваниям... +Bubble +Пузырь +A squishy bubble that you can't get out of! +Зыбкий пузырь, из которого вы не сможете выбраться! +It will slow you down severely but can be popped if you can reach a knife... +Он сильно замедляет ваше движение, но его можно будет лопнуть, если вы сможете дотянуться до ножа... +Scale Boxtie Binder +Упряжь для рук из чешуи +A secure but comfortable binder meant for long-term wear by long-term prisoners of the Dragonhearts. +Надежная, но удобная упряжь, предназначенная для длительного ношения заключенными Драконьего Сердца. +It is made from durable dragonscale, but secured with ordinary buckles. +Она сделана из прочной драконьей чешуи, но закрепляется обычными пряжками. +Dragonscale Straps +Ремни из драконьей чешуи +A set of straps buckling tightly around your body and secured at the wrists. +Набор ремней, плотно обхватывающих ваше тело и закрепленных на запястьях. +It's made from hard-to-cut dragonscale!!! +Сделано из устойчивой к разрезу драконьей чешуи!!! +Dragon Queen Straps +Ремни Королевы Драконов +A sturdy harness completely immobilizes your arms and torso. Made to be used on a queen of dragons. +Прочная сбруя полностью обездвиживает ваши руки и торс. Сделана специально для королевы драконов. +It's made from reinforced dragonscale!!! +Сделано из укрепленной драконьей чешуи!!! +Scale Leg Cuffs +Ножные манжеты из чешуи +A pair of chained cuffs made of dragonscale. They slow your stride. +Пара манжет с цепочками, сделанная из драконьей чешуи. Они замедляют ваши действия. +It's made from hard-to-cut dragonscale!!! +Сделано из устойчивой к разрезу драконьей чешуи!!! +Scale Ankle Cuffs +Манжеты на лодыжки из чешуи +A pair of chained cuffs made of dragonscale. They slow your stride. +Пара манжет с цепочками, сделанная из драконьей чешуи. Они замедляют ваши действия. +It's made from hard-to-cut dragonscale!!! +Сделано из устойчивой к разрезу драконьей чешуи!!! +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Scale Cuffs Chain +Цепочка между манжет из чешуи +A pair of chained cuffs made of dragonscale. They slow your stride. +Пара манжет с цепочками, сделанная из драконьей чешуи. Они замедляют ваши действия. +It's made from hard-to-cut dragonscale!!! +Сделано из устойчивой к разрезу драконьей чешуи!!! +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +Dragonscale Boots +Сапоги из драконьей чешуи +A pair of extremely high heels lined with dragonscale. They are hard to walk in. +Пара туфель на чрезвычайно высоких каблуках, отделанных драконьей чешуей. В них трудно ходить. +It's made from hard-to-cut dragonscale!!! +Сделано из устойчивой к разрезу драконьей чешуи!!! +Dragonscale Gag +Кляп из драконьей чешуи +A gag made of a squishy material and secured with dragonscale straps. +Кляп сделан из мягкого материала, но закреплен ремешками из драконьей чешуи. +It's made from hard-to-cut dragonscale!!! +Сделано из устойчивой к разрезу драконьей чешуи!!! +Dragonscale Muzzle +Намордник из драконьей чешуи +A muzzle to keep ball gags pressed firmly into the mouth. +Намордник, надёжно и плотно удерживающий кляп-шарик в вашем рту. +It's made from hard-to-cut dragonscale!!! +Сделано из устойчивой к разрезу драконьей чешуи!!! +Dragon Collar +Драконий ошейник +A collar owned by the Dragonhearts, an order of dragonslayers. +Ошейник, принадлежащий Драконьему Сердцу, ордену убийц драконов. +It's made from hard-to-cut dragonscale!!! +Сделано из устойчивой к разрезу драконьей чешуи!!! +Steel Cuffs +Стальные манжеты +A pair of steel cuffs that make it easy to restrain you. +Пара стальных манжет, которые позволят легко сковать вас. +They're made of shining steel. +Они сделаны из блестящей стали. +The enemy attaches your wrist cuffs together! +Враг скрепляет ваши манжеты на запястьях друг с другом! +Steel Wrist Chain +Стальная цепочка (Запястья) +A pair of steel cuffs keeping your arms behind your back. +Пара стальных манжет, удерживающих ваши руки за спиной. +They're made of shining steel. +Они сделаны из блестящей стали. +Your cuffs detatch! +Ваши манжеты расцепляются! +The enemy attaches your elbow cuffs together! +Враг скрепляет ваши манжеты на локтях! +Magnetic Cuffs +Магнитные манжеты +A pair of bulky cuffs with coils visible on the inside... +Пара громоздких манжет с видимыми с внутренней стороны витками... +They have no visible attachment points... +У них нет видимых точек крепления... +The electric damage causes your cuffs to attach together! +Получение электрического урона приводит к тому, что ваши манжеты примагничиваются друг к другу! +Magnetic Link +Магнитная связь +The magnetic cuffs are rigidly attached! +Магнитные манжеты крепко сцеплены друг с другом! +They won't budge! There's a button to release them but it's hard to reach... +Они не сдвинутся с места! Есть кнопка, чтобы их расцепить, но до нее трудно дотянуться... +Your cuffs detatch! +Ваши манжеты расцепляются! +Magnetic Ankle Cuffs +Магнитные манжеты (Лодыжки) +A pair of bulky leg irons with coils visible on the inside. +Пара громоздких ножных кандалов с витками, видимыми с внутренней стороны. +They have no visible attachment points... +У них нет видимых точек крепления... +The electric damage causes your ankle cuffs to snap together! +Получение электрического урона приводит к тому, что ваши манжеты на лодыжках примагничиваются друг к другу! +Magnetic Link +Магнитная связь +The magnetic cuffs are rigidly attached! +Магнитные манжеты крепко сцеплены друг с другом! +They won't budge! There's a button to release them but it's hard to reach... +Они не сдвинутся с места! Есть кнопка, чтобы их расцепить, но до нее трудно дотянуться... +Your ankle cuffs detatch! +Ваши манжеты на лодыжках расцепляются! +Living Blacksteel Collar +Живой ошейник (Черная сталь) +A collar made of a hardened steel alloy, chemically treated as to be stainless that adjusts itself to your neck. +Ошейник, изготовленный из закаленного стального сплава, химически обработанного до свойств нержавеющей стали, который сам подстраивается под вашу шею. +It will occasionally cause blacksteel to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of blacksteel you have on you. +Иногда из ниоткуда будет появляться черную сталь и сковывать носителя. Частота срабатывания увеличивается в зависимости от количества черной стали на вашем теле. +Blacksteel Cuffs +Манжеты из черной стали +A pair of cuffs that make it easy to restrain you. +Пара манжет, которые позволяют легко сковать вас. +They are made of a hardened steel alloy, chemically treated as to be stainless. +Они изготовлены из закаленного стального сплава, химически обработанного до свойств нержавеющей стали. +The enemy attaches your wrist cuffs together! +Враг скрепляет ваши манжеты на запястьях друг с другом! +Wrist Chain +Цепочка между запястий +A pair of cuffs keeping your arms behind your back. +Пара манжет, удерживающих ваши руки за спиной. +They are made of a hardened steel alloy, chemically treated as to be stainless. +Они изготовлены из закаленного стального сплава, химически обработанного до свойств нержавеющей стали. +Your cuffs detatch! +Ваши манжеты расцепляются! +The enemy attaches your elbow cuffs together! +Враг скрепляет ваши манжеты на локтях! +Cuffs Chain +Цепочка между манжет +A full set of cuffs keeping your arms in a strict elbow tie! +Полный комплект манжет, удерживающих ваши руки строго скованными в районе локтей! +They are made of a hardened steel alloy, chemically treated as to be stainless. +Они изготовлены из закаленного стального сплава, химически обработанного до свойств нержавеющей стали. +Your wrists detatch, leaving your elbows still bound! +Ваши запястья расцепляются, однако локти все еще скованы! +Elbow Chain +Цепочка между локтями +A pair of cuffs keeping your elbows locked together! +Пара манжет, удерживающих ваши локти сцепленными друг с другом! +They are made of a hardened steel alloy, chemically treated as to be stainless. +Они изготовлены из закаленного стального сплава, химически обработанного до свойств нержавеющей стали. +Your elbows detatch! +Ваши локти расцепляются! +The enemy attaches your wrist cuffs back together! +Враг снова сковывает ваши манжеты на запястьях! +Blacksteel Leg Cuffs +Манжеты из черной стали (Ноги) +A pair of cuffs on your legs. +Пара манжет для ваших ног. +They are made of a hardened steel alloy, chemically treated as to be stainless. +Они изготовлены из закаленного стального сплава, химически обработанного до свойств нержавеющей стали. +The enemy attaches your leg cuffs together! +Враг сковывает ваши манжеты на ногах! +Thigh Chain +Цепочка между бедер +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +They are made of a hardened steel alloy, chemically treated as to be stainless. +Они изготовлены из закаленного стального сплава, химически обработанного до свойств нержавеющей стали. +The leg cuff chain detaches! +Цепочка отстегивается от манжет на ногах! +Blacksteel Ankle Cuffs +Манжеты из черной стали (Лодыжки) +A pair of cuffs on your ankles. +Пара манжет для ваших лодыжек. +They are made of a hardened steel alloy, chemically treated as to be stainless. +Они изготовлены из закаленного стального сплава, химически обработанного до свойств нержавеющей стали. +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Ankle Chain +Цепочка между лодыжек +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +They are made of a hardened steel alloy, chemically treated as to be stainless. +Они изготовлены из закаленного стального сплава, химически обработанного до свойств нержавеющей стали. +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +Your ankle cuff chain is tightened and pulls your feet together! +Цепочка между манжет на лодыжках затягивается и стягивает ваши ступни вместе! +Short Ankle Chain +Короткая цепочка между лодыжек +A pair of cuffs chaining your feet tightly together. +Пара манжет, туго стягивающих ваши ноги друг с другом. +They are made of a hardened steel alloy, chemically treated as to be stainless. +Они изготовлены из закаленного стального сплава, химически обработанного до свойств нержавеющей стали. +Your ankle cuff chain loosens! +Цепочка между манжет на щиколотках ослабевает! +Dragonscale Cuffs +Манжеты из драконьей чешуи +A pair of cuffs that make it easy to restrain you. +Пара манжет, которые позволяют легко сковать вас. +They are made from leather cured from the hide of dragons. +Они сделаны из кожи, выделанной из шкур драконов. +The enemy attaches your wrist cuffs together! +Враг скрепляет ваши манжеты на запястьях друг с другом! +Wrist Chain +Цепочка между запястий +A pair of cuffs keeping your arms behind your back. +Пара манжет, удерживающих ваши руки за спиной. +They are made from leather cured from the hide of dragons. +Они сделаны из кожи, выделанной из шкур драконов. +Your cuffs detatch! +Ваши манжеты расцепляются! +The enemy attaches your elbow cuffs together! +Враг скрепляет ваши манжеты на локтях! +Cuffs Chain +Цепочка между манжет +A full set of cuffs keeping your arms in a strict elbow tie! +Полный комплект манжет, удерживающих ваши руки строго скованными в районе локтей! +They are made from leather cured from the hide of dragons. +Они сделаны из кожи, выделанной из шкур драконов. +Your wrists detatch, leaving your elbows still bound! +Ваши запястья расцепляются, однако локти все еще скованы! +Elbow Chain +Цепочка между локтями +A pair of cuffs keeping your elbows locked together! +Пара манжет, удерживающих ваши локти сцепленными друг с другом! +They are made from leather cured from the hide of dragons. +Они сделаны из кожи, выделанной из шкур драконов. +Your elbows detatch! +Ваши локти расцепляются! +The enemy attaches your wrist cuffs back together! +Враг снова сковывает ваши манжеты на запястьях! +Dragonscale Leg Cuffs +Манжеты из драконьей чешуи (Ноги) +A pair of cuffs on your legs. +Пара манжет для ваших ног. +They are made from leather cured from the hide of dragons. +Они сделаны из кожи, выделанной из шкур драконов. +The enemy attaches your leg cuffs together! +Враг сковывает ваши манжеты на ногах! +Thigh Chain +Цепочка между бедер +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +They are made from leather cured from the hide of dragons. +Они сделаны из кожи, выделанной из шкур драконов. +The leg cuff chain detaches! +Цепочка отстегивается от манжет на ногах! +Dragonscale Ankle Cuffs +Манжеты из драконьей чешуи (Лодыжки) +A pair of cuffs on your ankles. +Пара манжет для ваших лодыжек. +They are made from leather cured from the hide of dragons. +Они сделаны из кожи, выделанной из шкур драконов. +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Ankle Chain +Цепочка между лодыжек +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +They are made from leather cured from the hide of dragons. +Они сделаны из кожи, выделанной из шкур драконов. +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +Your ankle cuff chain is tightened and pulls your feet together! +Цепочка между манжет на лодыжках затягивается и стягивает ваши ступни вместе! +Short Ankle Chain +Короткая цепочка между лодыжек +A pair of cuffs chaining your feet tightly together. +Пара манжет, туго стягивающих ваши ноги друг с другом. +They are made from leather cured from the hide of dragons. +Они сделаны из кожи, выделанной из шкур драконов. +Your ankle cuff chain loosens! +Цепочка между манжет на щиколотках ослабевает! +Maid Jacket +Жакет горничной +A bolero jacket keeping your arms pinned snugly. You can't even move them. +Жакет-болеро, плотно облегающий ваши руки. Вы никак не можете ими пошевелить. +There is no hope of struggling out. Better hope you can cut it... +Нет никакой надежды вырваться. Лучше надейтесь, что вы сможете его разрезать... +Maid Punishment Jacket +Штрафной жакет горничной +A bolero straitjacket made for unruly maids. It is extra secure and locked tightly. +Смирительная рубашка-болеро, созданная для непослушных горничных. Она очень надежная и туго запирается. +There is no hope of struggling out. Better get back to work... +Нет никакой надежды вырваться. Лучше возвращайтесь к работе... +Devious Maid Costume +Коварный костюм горничной +A devious maid outfit that forces the arms into an elbows-touching position. +Хитрый наряд горничной, который заставляет руки соприкасаться локтями. +Makes sure you focus on your work and not fooling around. +Гарантирует, что вы сосредоточитесь на своей работе и не будете валять дурака. +Reinforced Leather Belt +Укрепленный кожаный ремень +A leather belt used to keep your legs hobbled. +Кожаный ремень, используемый для того, чтобы держать ваши ноги скованными. +It's made of a very tough reinforced leather. It will take some time to cut. +Он сделан из очень прочной укрепленной кожи. Чтобы его разрезать понадобится некоторое время. +Maid Cuffs +Манжеты горничной +A pair of steel cuffs used by the Maidforce. +Пара стальных манжет, которыми пользуется спецотряд горничных. +They are made of solid steel. +Они сделаны из прочной стали. +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Maid Cuff Link +Цепочка между манжет горничной +A pair of steel cuffs used by the Maidforce. +Пара стальных манжет, которыми пользуется спецотряд горничных. +They are made of solid steel. +Они сделаны из прочной стали. +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +Maid Collar +Ошейник горничной +A collar for operatives of the Maidforce, a group of covert saboteurs. +Ошейник для оперативников спецотряда горничных, группы тайных диверсантов. +It's reinforced with metal and guarded with an expert-level lock. +Он укреплен металлом и запирается замком экспертного уровня. +Maid Gag +Кляп горничной +A gag with a long, mouth-filling plug that muffles speech completely. +Кляп с длинной, заполняющей рот пробкой, которая полностью заглушает речь. +It's made of a very tough reinforced leather. It will take some time to cut. +Он сделан из очень прочной укрепленной кожи. Чтобы его разрезать понадобится некоторое время. +Maid Security Gag +Надежный кляп горничной +A muzzle with a long, mouth-filling plug that muffles speech completely. +Намордник с длинной, заполняющей рот пробкой, которая полностью заглушает речь. +Reinforced and secured with a disc lock to ensure unruly maids don't skip their duty. +Укрепленный, и защищенный дисковым замком, чтобы неугомонные горничные не отлынивали от своих обязанностей. +Suspicious Mask +Подозрительная маска +A well-fitted mask, covering your entire head neatly and locking in place. +Хорошо подогнанная маска, аккуратно закрывающая всю голову и надёжно на ней фиксирующаяся. +It has eyeholes for you to somewhat see out of, but blocks access to the face. +В ней есть прорези для глаз, через которые вы можете что-то видеть, но она блокирует доступ к лицу. +Happy Face +Счастливое лицо +Just put on a happy face and enjoy it. +Просто наденьте счастливое лицо и наслаждайтесь им. +It has eyeholes for you to somewhat see out of, but blocks access to the face. +Имеет прорези для глаз, через которые вы можете что-то видеть, но закрывает доступ к лицу. +Sensory Hood +Сенсорный капюшон +A well-fitted hood that covers your head and muffles sounds. +Хорошо прилегающий капюшон, который закрывает голову и приглушает звуки. +No eyeholes. Integrated blindfold and gag. Total darkness. +Отверстий для глаз нет. Встроенная повязка на глаза и кляп. Полная темнота. +Sensory Mask +Сенсорная маска +A well-fitted mask that covers your face and muffles sounds. +Плотно прилегающая маска, закрывающая лицо и приглушающая звуки. +No eyeholes. Integrated blindfold and gag. Total darkness. +Отверстий для глаз нет. Встроенная повязка на глаза и кляп. Полная темнота. +Shadow Heels +Теневые каблуки +A set of impractical heels that clasp around your ankles. They make it hard to walk. +Набор непрактичной обуви на каблуках, которая обхватывают ваши лодыжки. В ней трудно ходить. +The material is stronger than leather, and flexes to make struggling difficult. +Материал прочнее кожи, а также очень гибкий, что затрудняет борьбу. +Shadow Jacket +Теневая смирительная рубашка +A tight straitjacket made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +Обтягивающая смирительная рубашка из потустороннего материала. Поверхность блестящая и отражающая, и вы можете увидеть мерцающие звезды, наблюдая за своим затруднительным положением. +Its grip encases you tightly, but the material is weaker than most metals. +Плотно обхватывает вас, но материал более хрупкий, чем большинство металлов. +Black Hole Jacket +Жилет черной дыры +Like a black hole, anything that is caught in this jacket has no chance to escape its grasp. +Он подобен черной дыре. Все, что попадает в этот жилет, не имеет ни малейшего шанса вырваться из его хватки. +Its grip encases you tightly, but the material is weaker than most metals. +Плотно обхватывает вас, но материал более хрупкий, чем большинство металлов. +Shadow Armbinder +Теневой армбиндер +A tight armbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +Обтягивающий армбиндер из потустороннего материала. Поверхность блестящая и отражающая, и вы можете увидеть мерцающие звезды, наблюдая за своим затруднительным положением. +Its grip encases you tightly, but the material is weaker than most metals. +Плотно обхватывает вас, но материал более хрупкий, чем большинство металлов. +Black Hole Armbinder +Армбиндер черной дыры +Like a black hole, anything that is caught in this armbinder has no chance to escape its grasp. +Он подобен черной дыре. Все, что попадает в этот армбиндер, не имеет ни малейшего шанса вырваться из его хватки. +Its grip encases you tightly, but the material is weaker than most metals. +Плотно обхватывает вас, но материал более хрупкий, чем большинство металлов. +Shadow Boxbinder +Теневая сумка для рук +A tight boxbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +Обтягивающая сумка для рук из потустороннего материала. Поверхность блестящая и отражающая, и вы можете увидеть мерцающие звезды, наблюдая за своим затруднительным положением. +Its grip encases you tightly, but the material is weaker than most metals. +Плотно обхватывает вас, но материал более хрупкий, чем большинство металлов. +Black Hole Boxbinder +Сумка для рук черной дыры +Like a black hole, anything that is caught in this boxbinder has no chance to escape its grasp. +Она подобна черной дыре. Все, что попадет в эту сумку для рук, не имеет ни малейшего шанса вырваться из её хватки. +Its grip encases you tightly, but the material is weaker than most metals. +Плотно обхватывает вас, но материал более хрупкий, чем большинство металлов. +Shadow Legbinder +Теневой легбиндер +A tight legbinder made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +Обтягивающий легбиндер из потустороннего материала. Поверхность блестящая и отражающая, и вы можете увидеть мерцающие звезды, наблюдая за своим затруднительным положением. +Its grip encases you tightly, but the material is weaker than most metals. +Плотно обхватывает вас, но материал более хрупкий, чем большинство металлов. +Shadow Latex Petsuit +Теневой латексный петсьют +A tight petsuit made of an otherworldly material. It is shiny and reflective, and you can see stars twinkling as you observe your predicament. +Облегающий петсьют из необычного материала. Он блестящий и отражает свет, и вы можете видеть, как мерцают звезды, наблюдая за своим затруднительным положением. +Its grip encases you tightly, but the material is weaker than most metals. +Плотно обхватывает вас, но материал более хрупкий, чем большинство металлов. +Obsidian Yoke +Обсидиановое ярмо +A yoke made from shining obsidian, stars glittering in the darkness. It pins your arms uselessly at your sides. +Ярмо из сияющего обсидиана, звезды сверкают в темноте. Оно делает ваши руки бесполезными, фиксируя их по бокам от вашей головы. +It's made of a dark, glistening volcanic metal. +Сделано из темного, блестящего вулканического металла. +Obsidian Muzzle +Обсидиановый намордник +A muzzle made from segmented metal pieces, fitting securely over your face. +Намордник, изготовленный из сегментированых металлических деталей, плотно прилегает к вашему лицу. +It's made of a dark, glistening volcanic metal. +Сделано из темного, блестящего вулканического металла. +Obsidian Collar +Обсидиановый ошейник +A collar made from a warm, shining alloy. +Ошейник из теплого, блестящего сплава. +It's made of a dark, glistening volcanic metal. +Сделано из темного, блестящего вулканического металла. +Living Obsidian Collar +Живой ошейник (Обсидиан) +A collar made of a dark, shiny metal that adjusts itself to your neck. You can't help but hear whispering since it is so tight. +Ошейник из темного блестящего металла, который сам подстраивается под вашу шею. Вы не можете не услышать шепот, так как он очень тугой. +It will occasionally cause obsidian to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of obsidian you have on you. +Иногда из ниоткуда будет появляться обсидиан и сковывать носителя. Частота срабатывания увеличивается в зависимости от количества обсидиана на вашем теле. +Obsidian Cuffs +Обсидиановые манжеты +A pair of cuffs that make it easy to restrain you. +Пара манжет, которые позволяют легко сковать вас. +It's made of a dark, shiny metal. If you hold it close you hear whispering. +Сделаны из темного блестящего металла. Если поднести их к уху, можно услышать шепот. +The enemy attaches your wrist cuffs together! +Враг скрепляет ваши манжеты на запястьях друг с другом! +Wrist Chain +Цепочка между запястий +A pair of cuffs keeping your arms behind your back. +Пара манжет, удерживающих ваши руки за спиной. +It's made of a dark, shiny metal. If you hold it close you hear whispering. +Сделаны из темного блестящего металла. Если поднести их к уху, можно услышать шепот. +Your cuffs detatch! +Ваши манжеты расцепляются! +The enemy attaches your elbow cuffs together! +Враг скрепляет ваши манжеты на локтях! +Cuffs Chain +Цепочка между манжет +A full set of cuffs keeping your arms in a strict elbow tie! +Полный комплект манжет, удерживающих ваши руки строго скованными в районе локтей! +It's made of a dark, shiny metal. If you hold it close you hear whispering. +Сделаны из темного блестящего металла. Если поднести их к уху, можно услышать шепот. +Your wrists detatch, leaving your elbows still bound! +Ваши запястья расцепляются, однако локти все еще скованы! +Elbow Chain +Цепочка между локтями +A pair of cuffs keeping your elbows locked together! +Пара манжет, удерживающих ваши локти сцепленными друг с другом! +It's made of a dark, shiny metal. If you hold it close you hear whispering. +Сделаны из темного блестящего металла. Если поднести их к уху, можно услышать шепот. +Your elbows detatch! +Ваши локти расцепляются! +The enemy attaches your wrist cuffs back together! +Враг снова сковывает ваши манжеты на запястьях! +Obsidian Leg Cuffs +Обсидиановые манжеты (Ноги) +A pair of cuffs on your legs. +Пара манжет для ваших ног. +It's made of a dark, shiny metal. If you hold it close you hear whispering. +Сделаны из темного блестящего металла. Если поднести их к уху, можно услышать шепот. +The enemy attaches your leg cuffs together! +Враг сковывает ваши манжеты на ногах! +Thigh Chain +Цепочка между бедер +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +It's made of a dark, shiny metal. If you hold it close you hear whispering. +Сделаны из темного блестящего металла. Если поднести их к уху, можно услышать шепот. +The leg cuff chain detaches! +Цепочка отстегивается от манжет на ногах! +Obsidian Ankle Cuffs +Обсидиановые манжеты (Лодыжки) +A pair of cuffs on your ankles. +Пара манжет для ваших лодыжек. +It's made of a dark, shiny metal. If you hold it close you hear whispering. +Сделаны из темного блестящего металла. Если поднести их к уху, можно услышать шепот. +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Ankle Chain +Цепочка между лодыжек +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +It's made of a dark, shiny metal. If you hold it close you hear whispering. +Сделаны из темного блестящего металла. Если поднести их к уху, можно услышать шепот. +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +Your ankle cuff chain is tightened and pulls your feet together! +Цепочка между манжет на лодыжках затягивается и стягивает ваши ступни вместе! +Short Ankle Chain +Короткая цепочка между лодыжек +A pair of cuffs chaining your feet tightly together. +Пара манжет, туго стягивающих ваши ноги друг с другом. +It's made of a dark, shiny metal. If you hold it close you hear whispering. +Сделаны из темного блестящего металла. Если поднести их к уху, можно услышать шепот. +Your ankle cuff chain loosens! +Цепочка между манжет на щиколотках ослабевает! +Living Crystal Collar +Живой ошейник (Кристалл) +A collar made of a glowing, brittle material that adjusts itself to your neck. You feel your energy flowing into it... +Ошейник из светящегося, хрупкого материала, который сам подстраивается под вашу шею. Вы чувствуете, как в него перетекает ваша энергия... +It will occasionally cause crystal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of crystal you have on you. +Иногда из ниоткуда будут появляться кристаллы и сковывать носителя. Частота срабатывания увеличивается в зависимости от количества кристаллов на вашем теле. +Crystal Cuffs +Хрустальные манжеты +A pair of cuffs that make it easy to restrain you. +Пара манжет, которые позволяют легко сковать вас. +It's made of a glowing, brittle material. You feel your energy flowing into it... +Сделаны из блестящего хрупкого материала. Вы чувствуете, как ваша энергия перетекает в них... +The enemy attaches your wrist cuffs together! +Враг скрепляет ваши манжеты на запястьях друг с другом! +Wrist Chain +Цепочка между запястий +A pair of cuffs keeping your arms behind your back. +Пара манжет, удерживающих ваши руки за спиной. +It's made of a glowing, brittle material. You feel your energy flowing into it... +Сделаны из блестящего хрупкого материала. Вы чувствуете, как ваша энергия перетекает в них... +Your cuffs detatch! +Ваши манжеты расцепляются! +The enemy attaches your elbow cuffs together! +Враг скрепляет ваши манжеты на локтях! +Cuffs Chain +Цепочка между манжет +A full set of cuffs keeping your arms in a strict elbow tie! +Полный комплект манжет, удерживающих ваши руки строго скованными в районе локтей! +It's made of a glowing, brittle material. You feel your energy flowing into it... +Сделаны из блестящего хрупкого материала. Вы чувствуете, как ваша энергия перетекает в них... +Your wrists detatch, leaving your elbows still bound! +Ваши запястья расцепляются, однако локти все еще скованы! +Elbow Chain +Цепочка между локтями +A pair of cuffs keeping your elbows locked together! +Пара манжет, удерживающих ваши локти сцепленными друг с другом! +It's made of a glowing, brittle material. You feel your energy flowing into it... +Сделаны из блестящего хрупкого материала. Вы чувствуете, как ваша энергия перетекает в них... +Your elbows detatch! +Ваши локти расцепляются! +The enemy attaches your wrist cuffs back together! +Враг снова сковывает ваши манжеты на запястьях! +Crystal Leg Cuffs +Хрустальные манжеты для ног +A pair of cuffs on your legs. +Пара манжет для ваших ног. +It's made of a glowing, brittle material. You feel your energy flowing into it... +Сделаны из блестящего хрупкого материала. Вы чувствуете, как ваша энергия перетекает в них... +The enemy attaches your leg cuffs together! +Враг сковывает ваши манжеты на ногах! +Thigh Chain +Цепочка между бедер +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +It's made of a glowing, brittle material. You feel your energy flowing into it... +Сделаны из блестящего хрупкого материала. Вы чувствуете, как ваша энергия перетекает в них... +The leg cuff chain detaches! +Цепочка отстегивается от манжет на ногах! +Crystal Ankle Cuffs +Хрустальные манжеты для лодыжек +A pair of cuffs on your ankles. +Пара манжет для ваших лодыжек. +It's made of a glowing, brittle material. You feel your energy flowing into it... +Сделаны из блестящего хрупкого материала. Вы чувствуете, как ваша энергия перетекает в них... +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Ankle Chain +Цепочка между лодыжек +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +It's made of a glowing, brittle material. You feel your energy flowing into it... +Сделаны из блестящего хрупкого материала. Вы чувствуете, как ваша энергия перетекает в них... +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +Your ankle cuff chain is tightened and pulls your feet together! +Цепочка между манжет на лодыжках затягивается и стягивает ваши ступни вместе! +Short Ankle Chain +Короткая цепочка между лодыжек +A pair of cuffs chaining your feet tightly together. +Пара манжет, туго стягивающих ваши ноги друг с другом. +It's made of a glowing, brittle material. You feel your energy flowing into it... +Сделаны из блестящего хрупкого материала. Вы чувствуете, как ваша энергия перетекает в них... +Your ankle cuff chain loosens! +Цепочка между манжет на щиколотках ослабевает! +Living Ice Collar +Живой ошейник (Лед) +A collar made of enchanted ice that adjusts itself to your neck. It won't melt on their own, and the ice chills you to the bone... +Ошейник из зачарованного льда, который сам подстраивается под вашу шею. Он не растает сам по себе, а холод пробират вас до костей... +It will occasionally cause ice to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ice you have on you. +Иногда из ниоткуда будет появляться лед и сковывать носителя. Частота срабатывания увеличивается в зависимости от количества льда на вашем теле. +Ice Cuffs +Ледяные манжеты +A pair of cuffs that make it easy to restrain you. +Пара манжет, которые позволяют легко сковать вас. +They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... +Они сделаны из зачарованного льда. Они не растают сами по себе, а холод пробирает вас до костей... +The enemy attaches your wrist cuffs together! +Враг скрепляет ваши манжеты на запястьях друг с другом! +Wrist Chain +Цепочка между запястий +A pair of cuffs keeping your arms behind your back. +Пара манжет, удерживающих ваши руки за спиной. +They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... +Они сделаны из зачарованного льда. Они не растают сами по себе, а холод пробирает вас до костей... +Your cuffs detatch! +Ваши манжеты расцепляются! +The enemy attaches your elbow cuffs together! +Враг скрепляет ваши манжеты на локтях! +Cuffs Chain +Цепочка между манжет +A full set of cuffs keeping your arms in a strict elbow tie! +Полный комплект манжет, удерживающих ваши руки строго скованными в районе локтей! +They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... +Они сделаны из зачарованного льда. Они не растают сами по себе, а холод пробирает вас до костей... +Your wrists detatch, leaving your elbows still bound! +Ваши запястья расцепляются, однако локти все еще скованы! +Elbow Chain +Цепочка между локтями +A pair of cuffs keeping your elbows locked together!. +Пара манжет, удерживающих ваши локти сцепленными друг с другом!. +They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... +Они сделаны из зачарованного льда. Они не растают сами по себе, а холод пробирает вас до костей... +Your elbows detatch! +Ваши локти расцепляются! +The enemy attaches your wrist cuffs back together! +Враг снова сковывает ваши манжеты на запястьях! +Ice Leg Cuffs +Ледяные манжеты (Ноги) +A pair of cuffs on your legs. +Пара манжет для ваших ног. +They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... +Они сделаны из зачарованного льда. Они не растают сами по себе, а холод пробирает вас до костей... +The enemy attaches your leg cuffs together! +Враг сковывает ваши манжеты на ногах! +Thigh Chain +Цепочка между бедер +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... +Они сделаны из зачарованного льда. Они не растают сами по себе, а холод пробирает вас до костей... +The leg cuff chain detaches! +Цепочка отстегивается от манжет на ногах! +Ice Ankle Cuffs +Ледяные манжеты (Лодыжки) +A pair of cuffs on your ankles. +Пара манжет для ваших лодыжек. +They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... +Они сделаны из зачарованного льда. Они не растают сами по себе, а холод пробирает вас до костей... +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Ankle Chain +Цепочка между лодыжек +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... +Они сделаны из зачарованного льда. Они не растают сами по себе, а холод пробирает вас до костей... +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +Your ankle cuff chain is tightened and pulls your feet together! +Цепочка между манжет на лодыжках затягивается и стягивает ваши ступни вместе! +Short Ankle Chain +Короткая цепочка между лодыжек +A pair of cuffs chaining your feet tightly together. +Пара манжет, туго стягивающих ваши ноги друг с другом. +They're made of enchanted ice. They won't melt on their own, and the ice chills you to the bone... +Они сделаны из зачарованного льда. Они не растают сами по себе, а холод пробирает вас до костей... +Your ankle cuff chain loosens! +Цепочка между манжет на щиколотках ослабевает! +Living Slave Collar +Живой ошейник рабыни +A collar made of a gold-tinted metal with a magical enchantment that adjusts itself to your neck. +Ошейник из зачарованного металла золотистого цвета, который сам подстраивается под вашу шею. +It will occasionally cause slave gear to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slave gear you have on you. +Иногда из ниоткуда будет появляться рабское снаряжение и сковывать носителя. Частота срабатывания увеличивается в зависимости от количества рабского снаряжения на вашем теле. +Slave Cuffs +Рабские манжеты +A pair of cuffs that make it easy to restrain you. +Пара манжет, которые позволяют легко сковать вас. +It's made of a gold-tinted metal with a magical enchantment. +Они сделаны из металла золотистого оттенка с магическим зачарованием. +The enemy attaches your wrist cuffs together! +Враг скрепляет ваши манжеты на запястьях друг с другом! +Slave Wrist Chain +Рабская цепочка между запястий +A pair of cuffs keeping your arms behind your back. +Пара манжет, удерживающих ваши руки за спиной. +It's made of a gold-tinted metal with a magical enchantment. +Они сделаны из металла золотистого оттенка с магическим зачарованием. +Your cuffs detatch! +Ваши манжеты расцепляются! +The enemy attaches your elbow cuffs together! +Враг скрепляет ваши манжеты на локтях! +Slave Wrist Chain +Рабская цепочка между запястий +A full set of cuffs keeping your arms in a strict elbow tie! +Полный комплект манжет, удерживающих ваши руки строго скованными в районе локтей! +It's made of a gold-tinted metal with a magical enchantment. +Они сделаны из металла золотистого оттенка с магическим зачарованием. +Your wrists detatch, leaving your elbows still bound! +Ваши запястья расцепляются, однако локти все еще скованы! +Slave Elbow Chain +Рабская цепочка между локтей +A pair of cuffs keeping your elbows locked together! +Пара манжет, удерживающих ваши локти сцепленными друг с другом! +It's made of a gold-tinted metal with a magical enchantment. +Они сделаны из металла золотистого оттенка с магическим зачарованием. +Your elbows detatch! +Ваши локти расцепляются! +The enemy attaches your wrist cuffs back together! +Враг снова сковывает ваши манжеты на запястьях! +Slave Leg Cuffs +Рабские манжеты на ноги +A pair of cuffs on your ankles. +Пара манжет для ваших лодыжек. +It's made of a gold-tinted metal with a magical enchantment. +Они сделаны из металла золотистого оттенка с магическим зачарованием. +Slave Ankle Cuffs +Рабские манжеты на лодыжки +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +It's made of a gold-tinted metal with a magical enchantment. +Они сделаны из металла золотистого оттенка с магическим зачарованием. +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Slave Cuffs Chain +Цепочка между рабских манжет +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +It's made of a gold-tinted metal with a magical enchantment. +Они сделаны из металла золотистого оттенка с магическим зачарованием. +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +High-Tech Gag +Хай-тек кляп +A gag with a soft and filling mouthpiece, reinforced with a metallized strap. +Кляп с мягким заполняющим рот мундштуком, укреплен металлизированным ремешком. +It will be impossible to force it out or cut it with just a knife. +Его невозможно будет выплюнуть или разрезать простым ножом. +Nylon Plug Gag +Кляп с нейлоновой пробкой +A gag with a soft and filling mouthpiece, kept in place by an adjustable nylon strap. +Кляп с мягким и заполняющим рот мундштуком, удерживаемый на месте регулируемым нейлоновым ремешком. +It will be impossible to force it out, but can be cut. +Выплюнуть его будет невозможно, но можно разрезать. +High-Tech Cables (Arms) +Хай-тек тросы (Руки) +Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! +Тросы изготовлены из самозатягивающегося металлизированного поливолокна. Неприступны для стальных лезвий! +They are wrapped methodically around your body! +Они методично оборачиваются вокруг вашего тела! +High-Tech Cables (Legs) +Хай-тек тросы (Ноги) +Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! +Тросы изготовлены из самозатягивающегося металлизированного поливолокна. Неприступны для стальных лезвий! +They are wrapped methodically around your body! +Они методично оборачиваются вокруг вашего тела! +High-Tech Cables (Harness) +Хай-тек тросы (Упряжь) +Cables made from a self-tightening metallized polyfiber. Impervious to steel edges! +Тросы изготовлены из самозатягивающегося металлизированного поливолокна. Неприступны для стальных лезвий! +They are wrapped methodically around your body! +Они методично оборачиваются вокруг вашего тела! +Nylon Cables (Arms) +Нейлоновые тросы (Руки) +Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. +Тросы изготовлены из нейлонового полимера. Очень прочный и самозатягивающийся, но уязвимый для острых краев. +They are wrapped methodically around your body! +Они методично оборачиваются вокруг вашего тела! +Nylon Cables (Legs) +Нейлоновые тросы (Ноги) +Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. +Тросы изготовлены из нейлонового полимера. Очень прочный и самозатягивающийся, но уязвимый для острых краев. +They are wrapped methodically around your body! +Они методично оборачиваются вокруг вашего тела! +Nylon Cables (Harness) +Нейлоновые тросы (Упряжь) +Cables made from nylon polymer. Very strong and self-tightening, but vulnerable to sharp edges. +Тросы изготовлены из нейлонового полимера. Очень прочный и самозатягивающийся, но уязвимый для острых краев. +They are wrapped methodically around your body! +Они методично оборачиваются вокруг вашего тела! +Magic Ribbons +Волшебные ленты +Magically sealed ribbons to teach intruders a lesson. +Запечатанные магией ленты послужат незваным гостям уроком. +The magic is powerful enough to ward off most blades, creating a true predicament for one who is trapped by these. +Магия достаточно сильна, чтобы защитить от большинства лезвий, что создает серьезные трудности для того, кто попадает в эту ловушку. +Magic Ribbons (Arms) +Волшебные ленты (Руки) +Those ribbons will hold you tight~ +Эти ленты хотят вас крепко обнять~ +I've put a magic seal in that bow-knot to keep it secure! +Я прикрепила волшебную печать к этому бантику, дабы повысить надежность! +Magic Ribbons (Legs) +Волшебные ленты (Ноги) +Those ribbons will hold you tight~ +Эти ленты хотят вас крепко обнять~ +I've put a magic seal in that bow-knot to keep it secure! +Я прикрепила волшебную печать к этому бантику, дабы повысить надежность! +Magic Ribbons (Feet) +Волшебные ленты (Ступни) +Those ribbons will hold you tight~ +Эти ленты хотят вас крепко обнять~ +I've put a magic seal in that bow-knot to keep it secure! +Я прикрепила волшебную печать к этому бантику, дабы повысить надежность! +Magic Ribbons (Harness) +Волшебные ленты (Упряжь) +Those ribbons will hold you tight~ +Эти ленты хотят вас крепко обнять~ +I've put a magic seal in that bow-knot to keep it secure! +Я прикрепила волшебную печать к этому бантику, дабы повысить надежность! +Magic Ribbons (Pelvis) +Волшебные ленты (Таз) +Those ribbons will hold you tight~ +Эти ленты хотят вас крепко обнять~ +I've put a magic seal in that bow-knot to keep it secure! +Я прикрепила волшебную печать к этому бантику, дабы повысить надежность! +Magic Ribbons (Mittens) +Волшебные ленты (Варежки) +Those ribbons will hold you tight~ +Эти ленты хотят вас крепко обнять~ +They are wrapped tightly around your hands with a bow knot! +Они туго обхватывают ваши руки и завязываются бантиком! +Magic Ribbons (Gag) +Волшебные ленты (Кляп) +Those ribbons will hold you tight~ +Эти ленты хотят вас крепко обнять~ +They are wrapped tightly around your mouth with a bow knot! +Они туго завязываются вокруг вашего рта, оканчиваясь бантиком! +Living Ribbon Collar +Живой ошейник (Ленты) +This collar is designed to make sure its wearer does not escape the ribbons. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не выберется из лент. +It will occasionally cause ribbons to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of ribbons you have on you. +Иногда из ниоткуда будут появляться ленты и связывать носителя. Частота срабатывания увеличивается в зависимости от количества лент, обернутых вокруг вас. +Ice (Arms) +Лёд (Руки) +Frigid restraints made out of ice. +Холодные оковы, сделанные изо льда. +There's no way to remove it without breaking it off. +Нет никакого способа снять их, не разломав. +Ice (Mouth) +Лёд (Рот) +Frigid restraints made out of ice. +Холодные оковы, сделанные изо льда. +There's no way to remove it without breaking it off. +Нет никакого способа снять их, не разломав. +Ice Ball Gag (Mouth) +Ледяной шарик-кляп (Рот) +A cold sphere of magic ice lodged firmly in your mouth. +Холодная сфера из волшебного льда, прочно застрявшая у вас во рту. +The work of a kinky elemental. It will melt! Eventually. +Работа чудаковатого элементаля. Он растает! Когда-нибудь. +Ice (Body) +Лёд (Тело) +Frigid restraints made out of ice. +Холодные оковы, сделанные изо льда. +There's no way to remove it without breaking it off. +Нет никакого способа снять их, не разломав. +Ice (Legs) +Лёд (Ноги) +Frigid restraints made out of ice. +Холодные оковы, сделанные изо льда. +There's no way to remove it without breaking it off. +Нет никакого способа снять их, не разломав. +Glue (Feet) +Клей (Ноги) +A latex-derived glue that attaches you to the floor! It's very stretchy. +Клей на основе латекса, из-за которого вы прилипаете к полу! Он очень эластичный. +Just touching it makes it stick all over... +Всего одно прикосновение и он уже крепко прилипает к вашему телу... +Glue (Ankles) +Клей (лодыжки) +A latex-derived glue that attaches you to the floor! It's very stretchy. +Клей на основе латекса, из-за которого вы прилипаете к полу! Он очень эластичный. +Just touching it makes it stick all over... +Всего одно прикосновение и он уже крепко прилипает к вашему телу... +Glue (Legs) +Клей (ножки) +A latex-derived glue that attaches you to the floor! It's very stretchy. +Клей на основе латекса, из-за которого вы прилипаете к полу! Он очень эластичный. +Just touching it makes it stick all over... +Всего одно прикосновение и он уже крепко прилипает к вашему телу... +Slime (Feet) +Слизь (Ступни) +Sticky slime that adheres to your body. It reacts negatively to mana... +Липкая слизь, которая крепко прилипает к вашему телу. Она негативно реагирует на ману... +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Slime (Ankles) +Слизь (Лодыжки) +Sticky slime that adheres to your body. It reacts negatively to mana... +Липкая слизь, которая крепко прилипает к вашему телу. Она негативно реагирует на ману... +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Slime (Legs) +Слизь (Ноги) +Sticky slime that adheres to your body. It reacts negatively to mana... +Липкая слизь, которая крепко прилипает к вашему телу. Она негативно реагирует на ману... +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Slime (Arms) +Слизь (Руки) +Sticky slime that adheres to your body. It reacts negatively to mana... +Липкая слизь, которая крепко прилипает к вашему телу. Она негативно реагирует на ману... +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Slime (Hands) +Слизь (Кисти) +Sticky slime that adheres to your body. It reacts negatively to mana... +Липкая слизь, которая крепко прилипает к вашему телу. Она негативно реагирует на ману... +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Slime (Mouth) +Слизь (Рот) +Sticky slime that adheres to your body. It reacts negatively to mana... +Липкая слизь, которая крепко прилипает к вашему телу. Она негативно реагирует на ману... +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Slime (Head) +Слизь (Голова) +Sticky slime that adheres to your body. It reacts negatively to mana... +Липкая слизь, которая крепко прилипает к вашему телу. Она негативно реагирует на ману... +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Living Slime Collar +Живой ошейник (Слизь) +This collar is designed to make sure its wearer does not escape their slime. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не выберется из слизи. +It will occasionally cause slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of slime you have on you. +Иногда он будет из ниоткуда призывать слизь, оборачивающуюся вокруг носителя. Частота срабатывания увеличивается в зависимости от количества слизи, имеющейся на вашем теле. +Rubber +Резина +Made from hardened slime. +Изготовлена из затвердевшей слизи. +The classic smooth, shiny material for full encasement. +Классический гладкий, блестящий материал для полной запаковки. +Slime +Слизь +A semi-organic substance of alchemical origin. +Полуорганическое вещество алхимического происхождения. +It has a mind of its own, and tends to spread if not properly contained. +Оно обладает собственным разумом и имеет тенденцию распространяться, если не хранить его должным образом. +Proto Rubber +Прото-резина +Made from hardened proto rubber. +Изготовлено из затвердевшей прото-резины. +A hardened form of the essence of latex. +Затвердевшая форма сущности латекса. +Proto Slime +Прото-слизь +Alchemical rubber in its simplest form. Amorphous. +Алхимическая резина в её простейшей форме. Аморфная. +Often forms strange growths, seeking damsels to encase. +Часто образует странные поросли, которые ищут девушек для поглощения. +Rubber (Feet) +Резина (Ступни) +Sticky rubber that has fused itself into a skintight layer. +Липкая резина, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Rubber (Ankles) +Резина (Лодыжки) +Sticky rubber that has fused itself into a skintight layer. +Липкая резина, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Rubber (Legs) +Резина (Ноги) +Sticky rubber that has fused itself into a skintight layer. +Липкая резина, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Rubber (Arms) +Резина (Руки) +Sticky rubber that has fused itself into a skintight layer. +Липкая резина, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Rubber (Hands) +Резина (Кисти) +Sticky rubber that has fused itself into a skintight layer. +Липкая резина, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Rubber (Mouth) +Резина (Рот) +Sticky rubber that has fused itself into a skintight layer. +Липкая резина, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Rubber (Head) +Резина (Голова) +Sticky rubber that has fused itself into a skintight layer. +Липкая резина, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Living Rubber Collar +Живой ошейник (Резина) +This collar is designed to make sure its wearer does not escape their rubber. +Этот ошейник предназначен для того, чтобы убедиться, что его владелец не мог выбраться из резины. +It will occasionally cause rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. +Иногда из ниоткуда появляется резина и оборачивается вокруг носителя. Частота срабатывания увеличивается в зависимости от количества резины, имеющейся на вашем теле. +Proto-Slime (Feet) +Протослизь (Ступни) +It seems to be a precursor to the slimes everyone is familiar with? +Похоже, это предшественник слаймов, с которыми все знакомы. +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Proto-Slime (Ankles) +Протослизь (Лодыжки) +It seems to be a precursor to the slimes everyone is familiar with? +Похоже, это предшественник слаймов, с которыми все знакомы. +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Proto-Slime (Legs) +Протослизь (Ноги) +It seems to be a precursor to the slimes everyone is familiar with? +Похоже, это предшественник слаймов, с которыми все знакомы. +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Proto-Slime (Arms) +Протослизь (Руки) +It seems to be a precursor to the slimes everyone is familiar with? +Похоже, это предшественник слаймов, с которыми все знакомы. +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Proto-Slime (Hands) +Протослизь (Кисти) +It seems to be a precursor to the slimes everyone is familiar with? +Похоже, это предшественник слаймов, с которыми все знакомы. +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Proto-Slime (Mouth) +Протослизь (Рот) +It seems to be a precursor to the slimes everyone is familiar with? +Похоже, это предшественник слаймов, с которыми все знакомы. +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Proto-Slime (Head) +Протослизь (Голова) +It seems to be a precursor to the slimes everyone is familiar with? +Похоже, это предшественник слаймов, с которыми все знакомы. +It is an organic material that reforms around every cut you make! +Это органический материал, который перестраивается при каждой попытке его разрезать! +Living Proto-Slime Collar +Живой ошейник (Протослизь) +This collar is designed to make sure its wearer does not escape the slime. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не выберется из слизи. +It will occasionally cause proto-slime to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-slime you have on you. +Время от времени он призывает протослизь из ниоткуда прямо на носителя. Частота срабатывания эффекта увеличивается в зависимости от количества протослизи на вашем теле. +Proto-Rubber (Feet) +Прото-резина (Ступни) +Sticky slime that has fused itself into a skintight layer. +Липкая слизь, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Proto-Rubber (Ankles) +Прото-резина (Лодыжки) +Sticky slime that has fused itself into a skintight layer. +Липкая слизь, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Proto-Rubber (Legs) +Прото-резина (Ноги) +Sticky slime that has fused itself into a skintight layer. +Липкая слизь, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Proto-Rubber (Arms) +Прото-резина (Руки) +Sticky slime that has fused itself into a skintight layer. +Липкая слизь, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Proto-Rubber (Hands) +Прото-резина (Кисти) +Sticky slime that has fused itself into a skintight layer. +Липкая слизь, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Proto-Rubber (Mouth) +Прото-резина (Рот) +Sticky slime that has fused itself into a skintight layer. +Липкая слизь, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Proto-Rubber (Head) +Прото-резина (Голова) +Sticky slime that has fused itself into a skintight layer. +Липкая слизь, которая сгустилась в облегающую кожу оболочку. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас уже поздно бороться с ней, но поскольку она затвердела, её можно разрезать. +Living Proto-Rubber Collar +Живой ошейник (Проторезина) +This collar is designed to make sure its wearer does not escape the rubber. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не выберется из резины. +It will occasionally cause proto-rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of proto-rubber you have on you. +Иногда из ниоткуда будет появляться проторезина и сковывать носителя. Частота срабатывания увеличивается в зависимости от количества проторезины на вас. +Sticky Tape +Липкая лента +Extra-strength utility tape, for your secure packaging needs. +Липкая лента повышенной прочности для обеспечения безопасности упаковки. +It's quite sticky, the adhesive requires some force to get off. +Она довольно липкая, и для ее снятия требуется приложить некоторое усилие. +Tape Mittens +Рукавицы из лент +Sticky tape that holds your hands into a fist! +Липкая лента, которая сжимает ваши кисти рук в кулаки! +It's tough to get out of without some kind of grip! +Из неё трудно выбраться без какой-либо опоры! +Arm Chains +Цепи для рук +Heavy chains keeping your arms securely behind your back. +Тяжелые цепи надежно удерживают ваши руки за спиной. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Leg Chains +Ножные цепи +Heavy chains keeping your legs firmly hobbled. +Тяжелые цепи, надежно сковывающие ваши ноги. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Ankle Chains +Цепи на лодыжки +Heavy chains keeping your feet bound together. +Тяжелые цепи, сковывающие ваши ноги. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Crotch Chain +Цепи на пояс +Heavy chains that serve as an anchor point around your waist. +Тяжелые цепи, обернутые вокруг вашей талии и служащие опорой для других ограничителей. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Magic Arm Chains +Волшебные наручные цепи +Magic chains keeping your arms securely behind your back. +Волшебные цепи надежно удерживают ваши руки за спиной. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Magic Leg Chains +Волшебные ножные цепи +Magic chains keeping your legs firmly hobbled. +Волшебные цепи, надежно сковывающие ваши ноги и уменьшающие вашу мобильность. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Magic Ankle Chains +Волшебные цепочки на лодыжки +Magic chains keeping your feet bound together. +Волшебные цепи, уменьшающие длину вашего шага. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Magic Crotch Chain +Волшебные цепи на пояс +Magic chains that serve as an anchor point around your waist. +Волшебные цепочки, обернутые вокруг вашей талии и служащие опорой для других ограничителей. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Shadow Chains (Arms) +Теневые цепи (Руки) +Black chains for those who cross the divines +Черные цепи для тех, кто переходит дорогу божествам. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Shadow Chains (Legs) +Теневые цепи (Ноги) +Black chains for those who cross the divines +Черные цепи для тех, кто переходит дорогу божествам. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Shadow Chains (Ankles) +Теневые цепи (Лодыжки) +Black chains for those who cross the divines +Черные цепи для тех, кто переходит дорогу божествам. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Shadow Chain +Теневые цепи +Black chains for those who cross the divines +Черные цепи для тех, кто переходит дорогу божествам. +It doesn't look like a knife is up to the task... +Не похоже, что нож справится с этой задачей... +Ectoplasmic Chains (Arms) +Цепи из эктоплазмы (Руки) +Ghostly chains from a ghost that just doesn't want to let go. +Призрачные цепи от призрака, который просто не хочет вас отпускать. +It's made of an ethereal substance. +Они сделаны из эфирной субстанции. +Ectoplasmic Chains (Legs) +Цепи из эктоплазмы (Ноги) +Ghostly chains from a ghost that just doesn't want to let go. +Призрачные цепи от призрака, который просто не хочет вас отпускать. +It's made of an ethereal substance. +Они сделаны из эфирной субстанции. +Ectoplasmic Chains (Ankles) +Цепи из эктоплазмы (Лодыжки) +Ghostly chains from a ghost that just doesn't want to let go. +Призрачные цепи от призрака, который просто не хочет вас отпускать. +It's made of an ethereal substance. +Они сделаны из эфирной субстанции. +Ectoplasmic Chain +Цепи из эктоплазмы +Ghostly chains from a ghost that just doesn't want to let go. +Призрачные цепи от призрака, который просто не хочет вас отпускать. +It's made of an ethereal substance. +Они сделаны из эфирной субстанции. +Divine Cuffs +Божественные манжеты +It is said that even heaven has its hierarchies... +Говорят, что даже на небесах есть своя иерархия... +Shining cuffs made of holy metal. Nothing can touch it. +Сияющие манжеты из священного металла. Ничто не может прикоснуться к ним. +Divine Cuffs +Божественные манжеты +It is said that even heaven has its hierarchies... +Говорят, что даже на небесах есть своя иерархия... +Shining cuffs made of holy metal. Nothing can touch it. +Сияющие манжеты из священного металла. Ничто не может прикоснуться к ним. +Divine Muzzle +Божественный намордник +Keep those lips sealed. +Держите свои уста на замке. +A shining muzzle made of holy metal. Nothing can touch it. +Сияющий намордник, сделанный из священного металла. Ничто не может прикоснуться к нему. +Divine Gag +Божественный кляп +It is said that even heaven has its hierarchies... +Говорят, что даже на небесах есть своя иерархия... +A shining gag made of holy metal. Nothing can touch it. +Сияющий кляп, сделанный из священного металла. Ничто не может прикоснуться к нему. +Blindfold +Повязка на глаза +A piece of cloth secured onto your face and blocking vision. +Кусок ткани, обернутый вокруг вашего лица и закрывающий обзор. +You can still see through the gap around your nose. +Вы все еще можешь видеть через щель около своего носа. +Cleave Gag +Тряпочный кляп +A piece of cloth forced between your lips. +Кусок ткани, зажатый между губами. +On its own it's not very restrictive. +Сам по себе он не очень ограничивает вас. +Thick Cleave Gag +Кляп из толстой ткани +A piece of cloth that makes it hard to speak. +Кусок ткани, затрудняющий речь. +It's somewhat effective. +Кое-как, но эффективен. +Knotted Cloth Gag +Кляп из завязанной узлом ткани +A piece of cloth tied in a knot and tied over your mouth. +Кусок ткани, завязанный узлом и закрывающий вам рот. +It's pretty effective at keeping you quiet. +Он с довольно хорошей эффективностью заставляет вас соблюдать тишину. +OTN Cloth Gag +Кляп из OTN-ткани +A piece of cloth tightened over your mouth. +Кусок ткани, плотно закрывающий ваш рот. +On its own it's not very restrictive. +Ограничитель из него не очень эффективный. +Blindfold +Повязка на глаза +A scarf secured onto your face and blocking vision. +Шарф, завязанный вокруг вашей головы и закрывающий обзор. +You can still see through the gap around your nose. +Вы все еще можешь видеть через щель около своего носа. +Scarf Gag +Кляп из шарфа +A scarf tightened over your mouth. +Шарф туго затянут у вас на рту. +On its own it's not very restrictive. +Ограничитель из него не очень эффективный. +Scarf Tie +Обвязывающий тело шарф +A scarf wrapped around your body. +Шарф, обтянутый вокруг вашего тела. +On its own it's not very restrictive. +Ограничитель из него не очень эффективный. +Scarf Leg Tie +Шарф, сковывающий ноги +A scarf wrapped around your body. +Шарф, обтянутый вокруг вашего тела. +On its own it's not very restrictive. +Ограничитель из него не очень эффективный. +Scarf Ankle Tie +Шарф, сковывающий лодыжки +A scarf wrapped around your body. +Шарф, обтянутый вокруг вашего тела. +On its own it's not very restrictive. +Ограничитель из него не очень эффективный. +Arm Belts +Ремни на руки +A ludicrous amount of belts secured with a buckle. +Смехотворное количество ремней, застегивающихся на пряжку. +Lockable and fully adjustable to ensure snugness. +Легко регулируются и надежно застегиваются для обеспечения плотного прилегания. +Leg Belts +Ремни на ноги +A ludicrous amount of belts secured with a buckle. +Смехотворное количество ремней, застегивающихся на пряжку. +Lockable and fully adjustable to ensure snugness. +Легко регулируются и надежно застегиваются для обеспечения плотного прилегания. +Ankle Belts +Ремни на щиколотки +A ludicrous amount of belts secured with a buckle. +Смехотворное количество ремней, застегивающихся на пряжку. +Lockable and fully adjustable to ensure snugness. +Легко регулируются и надежно застегиваются для обеспечения плотного прилегания. +Iron Cuffs +Железные манжеты +Tough shackles with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. +Прочные кандалы с примитивным замком. Могут быть применены к уязвимым целям из инвентаря или панели быстрого доступа. +You could pick these with a hairpin. +Вы могли бы взломать их шпилькой для волос. +Iron Shackles +Железные кандалы +Tough shackles with a rudimentary lock. +Прочные кандалы с примитивным замком. +Tough to walk in. +В них тяжело ходить. +Thumbcuffs +Наручники для больших пальцев +Interferes with the use of your hands. +Мешают вам пользоваться руками. +Another layer of restriction. +Еще один уровень ограничений. +Thumbcuffs +Наручники для больших пальцев +Interferes with the use of your hands. +Мешают вам пользоваться руками. +Another layer of restriction. +Еще один уровень ограничений. +Hinged Handcuffs +Наручники на петлях +Hinged cuffs with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. +Наручники с примитивным замком. Могут быть применены к уязвимым целям из инвентаря или панели быстрого доступа. +Difficult to unlock, let alone pick by yourself. +Трудно самостоятельно открыть, не говоря уже о том, чтобы взломать. +Heavy Handcuffs +Тяжелые наручники +A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. Can be applied on vulnerable targets if targeted from inventory or hotbar. +Комплект защелкивающихся манжет в стиле 'irish-8' с примитивным замком. Могут быть применены к уязвимым целям из инвентаря или панели быстрого доступа. +The position is too awkward to free yourself, even with a key... +Положение рук в них слишком неудобное, чтобы освободиться самостоятельно, даже с наличием ключа... +Heavy Leg Irons +Тяжелые кандалы для ног +A set of irish-8 style snap-shut cuffs fitted with a rudimentary lock. +Комплект защелкивающихся манжет в стиле 'irish-8' с примитивным замком. +The position is awkward, but it's on your feet so you can remove them yourself if you have free hands. +Положение не очень удобное, но они на ваших ногах, так что вы можете снять их сами, если у вас свободны руки. +Thigh Shackles +Набедренные кандалы +Heavy shackles with a rudimentary lock. +Тяжелые кандалы с примитивным замком. +You could pick these with a hairpin. +Вы могли бы взломать их шпилькой для волос. +The enemy attaches your leg shackles together! +Враг сковывает ваши ножные кандалы вместе! +Linked Thigh Shackles +Цепочка между набедренными кандалами +Heavy shackles with a rudimentary lock. +Тяжелые кандалы с примитивным замком. +You could pick these with a hairpin. +Вы могли бы взломать их шпилькой для волос. +The leg shackles chain detaches! +Цепочка отстегивается от ножных кандалов! +Ankle Shackles +Кандалы на лодыжки +Heavy shackles with a rudimentary lock. +Тяжелые кандалы с примитивным замком. +You could pick these with a hairpin. +Вы могли бы взломать их шпилькой для волос. +Linked Ankle Shackles +Сцепленные кандалы на лодыжках +The enemy attaches your ankle shackles together! +Враг сцепляет ваши кандалы на лодыжках! +Heavy shackles with a rudimentary lock. +Тяжелые кандалы с примитивным замком. +You could pick these with a hairpin. +Вы могли бы взломать их шпилькой для волос. +The ankle shackles chain detaches! +Ваши кандалы на лодыжках больше не сцеплены! +Steel Muzzle +Стальной намордник +A heavy muzzle with a rudimentary lock. +Тяжелый намордник с примитивным замком. +You could pick this with a hairpin. +Вы могла бы взломать его шпилькой для волос. +Blacksteel Muzzle +Намордник из черной стали +A heavy duty steel muzzle with a flexible metal locking pin and straps. +Прочный стальной намордник с гибким металлическим фиксатором и ремешками. +Perfect for sealing away those unruly lips. +Идеально подходит для запечатывания непослушных губ. +Cursed Collar +Проклятый ошейник +A cold steel collar locked tightly on your neck. +Холодный стальной ошейник, плотно обернувшийся вокруг вашей шеи. +It appears to attract additional enemies to its wearer. +Похоже, он привлекает дополнительных врагов к своему владельцу. +Face +Лицо +Head +Голова +Mouth +Рот +Mouth +Рот +Mouth +Рот +Ears +Уши +Collar +Ошейник +Neck +Шея +Arms +Руки +Hands +Кисти +Torso +Торс +Bra +Бюстгальтер +Belt +Пояс +Plug +Пробка +Vibe +Вибратор +Piercings +Пирсинг +Nipples +Соски +Butt Plug +Анальная пробка +Legs +Ноги +Ankles +Лодыжки +Feet +Ступни +Device +Устройство +You found an item that was too small to see! +Вы нашли предмет, который был слишком мал, чтобы его можно было разглядеть! +You pick up XXX gold. +Вы нашли XXX золота. +You retrieve an ancient power crystal. +Вы извлекаете древний энергетический кристалл. +You retrieve a spent ancient power crystal. +Вы извлекаете израсходованный древний энергетический кристалл. +You pick up a magical amulet and use it to boost your stats. +Вы находите волшебный амулет и используете его для повышения своих характеристик. +You pick up a Leyline Map. +Вы находите карту лей-линий. +You pick up a knife. +Вы находите нож. +You pick up a torch. +Вы находите факел. +You found a bundle of discarded knives! +Вы нашли связку выброшенных ножей! +You pick up a magic knife. +Вы находите магический нож. +You pick up a magic knife. +Вы находите магический нож. +You pick up a lockpick. +Вы находите отмычку. +You pick up a normal key. +Вы находите обычный ключ. +You pick up a green key. +Вы находите зеленый ключ. +You pick up a blue key. +Вы находите синий ключ. +You pick up a willpower potion. +Вы находите зелье силы воли. +You pick up a glowing blue mana potion. +Вы находите светящееся голубое зелье маны. +You pick up a glowing blue orb. +Вы находите светящийся голубой шар. +You pick up an invisibility potion. +Вы находите зелье невидимости. +You pick up a handful of ectoplasm. +Вы находите комок эктоплазмы. +You pick up a green stamina potion. +Вы находите зеленое зелье выносливости. +You pick up a frigid white potion. +Вы находите белое охлаждающее зелье. +You found a peculiar note on the ground and keep it in your journal. +Вы находите на земле странную записку и сохраняете её в своем журнале. +You found an uninteresting note on the ground. +Вы находите на земле интересную записку. +You pick up a heavy hammer. +Вы находите тяжелый молот. +You pick up a set of bolt cutters. +Вы находите набор болторезов. +You pick up a sharp sword. +Вы находите острый меч. +You pick up a flamberge. +Вы находите фламберг. +You recover your escort drone. +Вы возвращаете свой дрон сопровождения. +You pick up a 'magic' wand... +Вы находите 'волшебную' палочку... +You pick up a magical ice cube. +Вы находите волшебный кубик льда. +You find some treated hemp rope. +Вы находите моток гладкой пеньковой веревки. +Feather +Перо +A feather taken from some large fluffy being. +Перо, взятое у какого-то большого пушистого существа. +Deals tickle damage. Greatly distracting. Offhand: +1 tickle damage on attack for 3 stamina. Greatly distracting. +Наносит урон щекоткой. Сильно возбуждает. В левой руке: +5 урона щекоткой при атаке (Потребляет дополнительно 3 выносливости). Сильно возбуждает. +You pick up a feather. +Вы находите перо. +Maid's Feather Duster +Перьевая метелка горничных +An instrument used extensively by maidforce agents carrying out their duties. +Инструмент, широко используемый горничными, выполняющими свои обязанности. +Deals tickle damage. Distracts enemies. Offhand: +15 distraction on attack for 1 stamina. +Наносит урон щекоткой. Возбуждает врагов. В левой руке: +15 урона щекоткой при атаке (Потребляет дополнительно 1 выносливости). +You pick up a feather duster. +Вы подбираете метелку с перьями. +Rope Rune +Веревочная руна +You smash the rune in front of you, and a flash of light enchants nearby ropes! +Вы разбиваете руну перед собой, и вспышка света зачаровывает близлежащие веревки! +It feels tantalizing to look at. +Столь манящая на вид. +Allows you to enchant ropes into more powerful restraints. +Позволяет зачаровать веревки, чтобы они стали более мощными ограничителями. +You pick up a kinky trinket with a glowing red sigil. +Вы находите дразнящую безделушку со светящимся красным символом. +You pick up a heavy flail. +Вы находите тяжелый цеп. +You pick up a shortspear. +Вы находите короткое копье. +You pick up a long spear. +Вы находите длинное копье. +You pick up a pickaxe. +Вы находите кирку. +You pick up an enchanted sword. +Вы находите зачарованный меч. +You pick up an enchanted axe. +Вы находите зачарованный топор. +You pick up an enchanted hammer. +Вы находите зачарованный молот. +You pick up a light hammer that's inscribed 'IceBreaker'. +Вы находите легкий молоток с надписью 'Ледокол'. +You pick up an enchanted spear. +Вы находите зачарованное копье. +You pick up an enchanted flail. +Вы находите зачарованный цеп. +You pick up a powerful axe. +Вы находите мощный топор. +You pick up a consumable smoke bomb. +Вы находите одноразовую дымовую бомбу. +You pick up a stone trinket with a glowing red sigil. +Вы находите кусок камня со светящимся красным символом. +You pick up a wet rock with some kind of symbol on it. +Вы находите мокрый камень с каким-то символом на нем. +You pick up a crystal beautiful as the moon. +Вы находите кристалл, прекрасный, как луна. +You pick up a strange device with a sharpened razor disc. +Вы находите странное устройство с заточенным режущим диском. +You find a strange ancient device with a sharp cutting blade. +Вы находите странное древнее устройство с острым режущим лезвием. +You pick up a stone trinket with a glowing blue sigil. +Вы находите кусок камня со светящимся синим символом. +You pick up a bola. +Вы находите болас. +You pick up a bomb! +Вы находите бомбу! +You pick up Dragonslaver. +Вы находите Убийцу Драконов. +You pick up Metamorphosis. +Вы находите Метаморфозу. +You pick up Four Seasons. +Вы находите Четыре Времени Года. +You pick up The Arbiter. +Вы находите Арбитра. +You pick up Dreamcatcher. +Вы находите Ловец Снов. +You retrieve the Bondage Buster EX. +Вы подбираете Бондаж-бластер EX. +You salvage a Bondage Buster MK II. +Вы подбираете Бондаж-бластер MK II. +You retrieve a Nevermere Blaster Mark IV. +Вы подбираете Бластер Невермера Марк-IV. +You retrieve the Messenger of Love. +Вы подбираете Посланника Любви. +You retrieve Moirai's scissors. +Вы подбираете Ножницы Мойры. +You pick up a bunch of scrolls! +Вы находите кучу свитков! +You pick up a Scroll of Sleight. +Вы находите Свиток Ловкости. +You pick up a Scroll of Purity. +Вы находите Свиток Чистоты. +You pick up a Scroll of Speech. +Вы находите свиток Красноречия. +You pick up a Scroll of Sauntering. +Вы находите Свиток Легкой Прогулки. +Your weapon is pulled out of your grasp!!! +Оружие выпадает из ваших рук!!! +Your weapon is pulled out of your hand and tossed away by your captor! +Ваш пленитель вырывает у вас из рук оружие и выбрасывает его прочь! +Your weapon slips out of your hand as you try to cut with it... +Ваше оружие выскальзывает у вас из рук, когда вы пытаетесь нанести им удар... +You put away the WEAPONNAME +Вы убираете WEAPONNAME +You equip the WEAPONNAME +Вы экипируете WEAPONNAME +Unequip +Снять +Equip +Надеть +Equipped +Надето +Unlit Torch +Незажженный факел +Can be lit +Можно зажечь +Torch +Факел +Provides light +Обеспечивает свет +Lantern +Фонарь +Provides light +Обеспечивает свет +Magic Lantern +Волшебный фонарь +Provides light +Обеспечивает свет +Magic Lantern +Волшебный фонарь +Provides light +Обеспечивает свет +Unlit Lantern +Незажженный фонарь +Can be lit +Можно зажечь +Wall Sconce +Настенный канделябр +Provides light +Обеспечивает свет +Broken Wall Sconce +Разбитый настенный канделябр +It is beyond repair. +Ремонту не подлежит. +Light Portal +Световой портал +Provides light +Обеспечивает свет +Empty Portal +Пустой портал +Stare into the void... +Смотрит в пустоту... +Liquid Latex +Жидкий латекс +Engulfs creatures +Окутывает существ +Liquid Latex +Жидкий латекс +Engulfs creatures +Окутывает существ +Liquid Latex +Жидкий латекс +Engulfs creatures +Окутывает существ +Liquid Latex +Жидкий латекс +Engulfs creatures +Окутывает существ +Liquid Latex +Жидкий латекс +Engulfs pets (like you) +Поглощает питомцев (вроде вас) +Liquid Latex +Жидкий латекс +Engulfs pets (like you) +Поглощает питомцев (вроде вас) +Slime +Слизь +Slows creatures +Замедляет существ +Glue +Клей +Slows creatures +Замедляет существ +Ice +Лёд +Chilling and slippery +Холодный и скользкий +Water +Вода +A concentration of moisture. +Тут очень мокро +Ropes +Верёвки +Looking for a new wearer +В поисках нового носителя +Chains +Цепи +Broken pieces of chain +Разорванные куски цепей +Belts +Ремни +Pieces of straps and leather +Кусочки ремней и кожи +Vines +Лозы +Fierce plantlife +Агрессивная растительная жизнь +Ribbons +Ленты +Empowered with magic +Наделенный магией +Blessed Wrappings +Благословенные бинты +Enchanted wrappings +Заколдованные ленты +Summoning Runes +Руна призыва +Mystical runes used for summoning +Мистические руны, используемые для призыва +Casting Runes +Магические руны +Mystical runes used for casting spells +Мистические руны, используемые для произнесения заклинаний +Suspicious Mechanism +Подозрительный механизм +A suspicious mechanism that seems to have been hastily put together. +Подозрительный механизм, который, похоже, был собран наспех. +Suspicious Runes +Подозрительные руны +A suspicious magic circle that was scrawled recently. +Подозрительный магический круг, который был нацарапан недавно. +Embers +Тлеющие угли +Ignition source. Blocks vision. +Источник огня. Уменьшают видимость. +Inferno +Инферно +Deals DAMAGEDEALT fire damage per turn +Наносить DAMAGEDEALT огненного урона за ход +Steam +Пар +Blocks vision +Уменьшает видимость +Smoke +Дым +Blocks vision +Уменьшает видимость +Cracked Earth +Потрескавшаяся земля +Makes creatures unsteady +Делает существ неустойчивыми +Rubble +Обломки +You don't think insurance will cover this. +Вы же не думаете, что страховка это покроет? +Rubble +Обломки +No putting that back together. +Это уже не собрать воедино. +Can be controlled using CMD spells +Можно управлять с помощью командных заклинаний +Can be controlled using Rubbermancy +Можно управлять с помощью магии резины. +Floor +Пол +Wall +Стена +Object +Объект +Object +Объект +Brickwork +Кирпич +Doodad +Неизвестный объект +Furniture +Объект +Table +Стол +Table +Стол +Shrine +Святилище +Closed Door +Закрытая дверь +Open Door +Открытая дверь +Closed Door +Закрытая дверь +Open Door +Открытая дверь +Bed +Кровать +Bars +Решетка +Ruined Shrine +Разрушенное святилище +Orb Altar +Алтарь со сферой +Empty Altar +Пустой алтарь +Chest +Сундук +Faction Chest +Фракционный сундук +Open Chest +Открытый сундук +Shiny Object +Блестящий предмет +Shiny Object +Блестящий предмет +Cracked Wall +Потрескавшаяся стена +Hook +Крючок +Entrance +Вход +Exit Stairs +Лестница +Mysterious Stairs +Таинственная лестница +Ghostly Adventurer +Призрак искателя приключений +Button +Кнопка +Conveyor +Конвеер +Safety Conveyor +Безопасный конвейер +Doll Terminal +Кукольный терминал +Doll Supply +Кукольная станция +Bondage Machine +Бондаж-машина +Empty Fixture +Пустое устройство +Filled Fixture +Заполненное устройство +Tablet +Скрижаль +Ars Pyrotecnica +Арс-Пиротехника +Codex Imaginus +Кодекс воображения +Clavicula Romantica +Чарующая ключица +A book of elemental magic +Книга по магии стихий +A book about conjuration +Книга по сотворению +A book of manipulative spells +Книга заклинаний контроля +Verbal +Слова +Arms +Руки +Legs +Ноги +Vision +Взгляд +Components: +Активация: +Verbal +Слова +Arm Movements +Жесты рук +Leg Gestures +Движения ног +Vision +Взгляд +You mumble incoherently trying to cast the spell... +Вы бессвязно бормочите, пытаясь произнести заклинание... +You wiggle uselessly trying to cast the spell... +Вы бесполезно извиваетесь, пытаясь применить заклинание... +Your feet are too clumsy to perform the magic gesture... +Ваши ноги слишком неповоротливы, чтобы выполнить требуемые движения... +You are unable to see, so you can't target this spell... +Вы не можете видеть, поэтому не можете нацелить это заклинание... +Next Page +Следующая страница +Last Page +Предыдущая страница +### >>> + +### <<< + +Random Page (your hands are tied) +Случайная страница (ваши руки связаны) +Verbal +Слова +Arms +Руки +Legs +Ноги +Misc +Разное +Elements +Стихии +Conjuration +Сотворение +Illusion +Иллюзии +Other +Другое +Strength +Сила +Dexterity +Ловкость +Intelligence +Интеллект +Misc +Разное +Unique +Уникальное +Active +Активное +Upgrades +Апгрейды +Learnable +Можно выучить +Unlearned +Нельзя выучить +Learned +Выучено +Excl. Upgrades +Исключить апгрейды +Passive +Пассивное +Upcast +Усиление +Buffs +Бафф +DoT +ДоТ +Projectiles +Снаряд +Melee +Ближний бой +Area Damage +АоЕ Урон +Area Denial +АоЕ контроль +Offense +Атака +Defense +Защита +Fire +Огонь +Ice +Лёд +Earth +Земля +Air +Воздух +Lightning +Электро +Water +Вода +Rubber +Резина +Rubber +Резина +Teleport +Телепортация +Physics +Физика +Conjuration +Сотворение +Summoning +Призыв +Binding +Сковывание +Metal +Металл +Latex +Латекс +Rope +Веревки +Leather +Кожа +Stealth +Скрытность +Projection +Проекция +Alteration +Преобразование +Light +Свет +Shadow +Тьма +Knowledge +Знания +Archery +Стрельба +Utility +Полезное +Upgrades +Улучшения +Spell Tree +Древо умений +Willpower +Сила воли +Stamina +Выносливость +Magic +Магия +Damage +Урон +Distraction +Возбуждение +Empower to upcast spells +Усилить заклинания +Cancel empowerment +Отменить усиление заклинаний +You channel mana through your body! Empowerment level: LEVEL +Вы направляете ману через свое тело! Уровень усиления: LEVEL +You are already at the maximum empowerment level! +Вы уже находитесь на максимально уровне усиления! +You don't have any upcast spells yet. +У вас еще нет усиляемых заклинаний. +Upcast from SPELL +Усиление SPELL +You fail to concentrate on the spell and it fizzles! +Вам не удается сконцентрироваться на заклинании, и оно распадается! +Your gag causes you to mispronounce the magic words! +Из-за кляпа вы не можете правильно произнести слова заклинания! +You are too clumsy to perform the leg movements! +Ваши ноги слишком неповоротливы, чтобы вы могли выполнять ими движения! +You can't get a good look at the target! +Вы не можете как следует разглядеть цель! +You trip up while casting the spell! +Вы споткнулись во время произнесения заклинания! +You miscast the spell because of a bug. Please report. +Вы неправильно произнесли заклинание из-за бага. Пожалуйста, создайте репорт. +You wave your arms around and make the wrong symbol with your hands! +Вы взмахиваете руками, но ваши кисти создают неправильный символ! +Your restrained fingers can't make the magic glyphs in time! +Ваши скованные пальцы не могут вовремя нарисовать магические символы! +The ice drains your concentration! Your mana and stamina are slipping away! +Лёд лишает вас концентрации! Ваша мана и выносливость ускользают! +A strange, chaotic energy flows into you! Your will is weakened and your mana fades! +Странная, хаотичная энергия вливается в вас! Ваша воля ослаблена, а ваша мана исчезает! +Something gently, constantly tickles you! +Что-то очень нежно, но непрерывно вас щекочет! +The ampule shatters on impact! +Ампула разлетается вдребезги при ударе! +The gas ampule shatters on impact! +Газовая ампула разлетается вдребезги при ударе! +The glue ampule shatters on impact! +Ампула с клеем разлетается вдребезги при ударе! +The rubber ampule shatters on impact! +Ампула с резиной разлетается вдребезги при ударе! +The latex ampule shatters on impact and forms a restraint! +Ампула с латексом разбивается при ударе и превращается в ограничитель! +The latex ampule shatters on impact and coats your body! +Ампула с латексом разбивается при ударе и покрывает ваше тело! +The latex ampule shatters on impact and sticks to you! +Ампула с латексом разбивается при ударе и прилипает к вам! +Shadowy chains appear from a rift in space! +Призрачные цепи появляются из разлома в пространстве! +The roaring inferno deals 10 damage to you! +Ревущее инферно вам 10 единиц урона! +The Reaping +Жатва ++20% damage to plants ++20% урона по растениям +Magically Iliterate +Магическая безграмотность +You've never read a magic book. Elemental, Conjuration, and Illusion spells cost 3x as many spell points. +Вы никогда не читали магических книг. Заклинания стихий, сотворения и иллюзий стоят в 3 раза больше очков способностей. +Magical Spark +Магическая искра +Reduce the penalty from Magically Iliterate to 2x. +Уменьшает штраф от Магической неграмотности до х2. +Magical Training +Обученная магии +Remove the penalty from Magically Iliterate. +Убирает штраф от Магической неграмотности. +Reap What You Sow +Пожинай то, что посеял +Defeating a non-humanoid enemy causes vines to sprout on their space temporarily. +Победа над негуманоидным врагом приводит к тому, что на их месте временно прорастают лозы. +Battle Rhythm +Боевой ритм +Stores 10% of the stamina cost of attacks as Rhythm, up to a total of 40. While you have over 10 Rhythm, you gain +10 Block and Evasion. Enemy base accuracy against you is decreased by a % equal to your Rhythm. If an attack misses or is blocked because of this, reduce Rhythm by 25% of the enemy attack power. Decays when not attacking. +Сохраняет 10% стоимости атак в выносливости как Ритм, всего до 40. Пока у вас более 10 Ритма, вы получаете +10 к Блоку и Уклонению. Базовая точность противника по отношению к вам снижается на %, равный вашему Ритма. Если атака промахивается или блокируется из-за этого, уменьшите Ритм на 25% от силы атаки противника. Уменьшается, когда вас не атакуют. +Limit Surge +Слом лимита +Spend 40 WP to fully restore Stamina, also stamina gain is increased by 30% for 20 turns. If your Willpower ends up 0 because of this, you are stunned for 2 turns. +Потратьте 40 WP, чтобы полностью восстановить Выносливость, также прирост Выносливости увеличивается на 30% на 20 ходов. Если из-за этого ваша сила воли окажется равной 0, вы будете оглушены на 2 хода. +Battle Trance +Боевой транс +While at 40 Battle Rhythm, you attack twice per turn. +Когда у вас 40 Боевого Ритма, вы атакуете дважды за ход. +Combat Maneuver +Боевой маневр +When Battle Trance is active, you gain a free move if the target is defeated before the second attack hits. +Когда активен боевой транс, вы получаете дополнительный ход, если цель побеждена до того, как произойдет вторая атака. +Devious Ingenuity +Коварная изобретательность +Trap-type spells and consumables no longer require you to channel them, but still have a delay before arming. +Заклинания-ловушки и расходуемые предметы больше не требуют, чтобы вы заряжали их, но по-прежнему имеют задержку перед активацией. +Essence Motes +Частицы сущностей +When you miscast a spell, you gain an Essence Mote which appears in a random space next to you. You can consume this mote to gain -100% miscast chance decaying over 10 turns. Walking over the mote also consumes it. +Когда вы ошибаетесь в заклинаниях, вы получаете Частицу Сущности, которая появляется в случайном месте рядом с вами. Вы можете поглотить её, чтобы уменьшить шанс ошибки на -100% на 10 ходов. Перемещение через частицу так же поглощает ее. +Inner Power +Внутренняя сила +As a wizard, you are able to draw upon mystical sources of energy that others can't even see. After 16 turns of not casting a spell or attacking, your next spell's mana cost is reduced by 20% of your max mana BEFORE multipliers. Toggled passive spells apply half the cooldown. +Как маг, вы способны черпать энергию из мистических источников, которые другие даже не могут увидеть. После 16 ходов, когда вы не произносите заклинание и не атакуете, стоимость маны вашего следующего заклинания снижается на 20% от вашей максимальной маны ПЕРЕД перемножением. Переключение пассивных заклинаний запускает половинчатое времени перезарядки этого эффекта. +Battlemage +Боевой маг +Inner Power cooldown is no longer reset after attacking. +Время восстановления Внутренней Силы больше не сбрасывается после атаки. +Relentless Casting +Неутомимый маг +While on cooldown, Inner Power cooldown is no longer reset after casting spells. +Когда на восстановлении, время восстановления Внутренней Силы больше не сбрасывается после применения заклинаний. +Arcane Recharge +Перезарядка арканы +Calling upon chaotic energies, your willpower is assaulted in exchange for power. Deals 80 psychic damage to self and drains 10% of your max Willpower to fully restore mana. Does not refill the mana pool. +Вы взываете к хаотическим энергиям и ваша сила воли жертвуется в обмен на силу. Нанесите себе 80 психического урона и истощите 10% от вашей максимальной силы воли для полного восстановления маны. Не пополняет резерв маны. +Way of Pleasure +Путь удовольствия +You have chosen the path of absolute pleasure. After letting go of yourself, you restore 50 mana, which can refill the mana pool if you have spare willpower. Blocks Way of Discipline. +Вы выбрали путь абсолютного удовольствия. Доводя себя до оргазма, вы восстанавливаете 50 единиц маны, которые могут пополнить резерве маны, если у вас есть запас силы воли. Блокирует Путь Самоконтроля. +Intense Power +Насыщение силой +After letting go of yourself, you feel an immense surge of power, increasing magic damage by 40% for 8 turns after you regain control, and by 10% while you remain satisfied. +Доведя себя до оргазма, вы чувствуете огромный прилив силы, увеличивающий магический урон на 40% на 8 ходов после того, как восстановите контроль, и на 10%, пока вы остаетесь удовлетворенными. +Pleasure Training I +Тренировка удовольствия I +You remain satisfied for much less time after letting go. Letting go costs 50% less stamina. +Вы остаетесь удовлетворенным гораздо меньше времени после того, как доводите себя до оргазма. Довести себя до оргазма стоит на 50% меньше выносливости. +Pleasure Training II +Тренировка удовольствия II +You are quite difficult to satisfy. Letting go costs 50% less stamina (75% total) and 50% less willpower. +Вас довольно трудно удовлетворить. Довести себя до оргазма требует на 50% меньше выносливости (всего -75%) и на 50% меньше силы воли. +Mental Resistance +Ментальное сопротивление ++100 Psychic and Charm Resist. You can no longer let go involuntarily while your WP is above 10% or you are shielded, and willpower drains 70% slower while edged. (click the buff to toggle) ++100 к сопротивлению Психическому урону и урону Очарованием. Вы больше не можете непроизвольно довести себя до оргазма, пока ваше WP выше 10% или у вас есть защита, а сила воли истощается на 70% медленнее, когда вы на грани. (нажмите на бафф для переключения) +Mental Resistance: You cannot orgasm except by choice or below 25% WP. Click to toggle. +Ментальное сопротивление: Вы не можете достичь оргазма иначе, как по собственному выбору или при WP ниже 25%. Нажмите, чтобы переключить. +Mental Resistance: You are allowing yourself to let go. Click to toggle. +Ментальное сопротивление: Вы позволяете себе достигать оргазма. Нажмите, чтобы переключить. +Way of Discipline +Путь самоконтроля +You have chosen the path of absolute discipline. Being in an Edged state increases passive mana recovery and you regenerate 0.5 mana per turn, restoring the same amount to the Mana Pool if you have willpower to spare. Blocks Way of Pleasure. +Вы выбрали путь строгой дисциплины и самоконтроля. Нахождение на грани оргазма увеличивает пассивное восстановление маны, и вы восстанавливаете 0.5 маны за ход, восстанавливая столько же резерва маны, если у вас есть запас силы воли. Блокирует путь удовольствия. +Way of Denial +Путь отрицания +Harnessing your mental discipline, you regenerate 20 mana each time you are denied, restoring the same amount to the Mana Pool if you have willpower to spare. +Используя свой ментальный самоконтроль, вы восстанавливаете 20 единиц маны каждый раз, когда вам отказывают в оргазме, плюс восстанавливаете такое же количество резерва маны, если у вас есть запас силы воли. +Flame Novice +Новичок Огня +Unlocks fire spells. Learn Firebolt. +Открывает огненные заклинания. Изучает Огненную стрелу. +Lightning Novice +Новичок Электро +Unlocks electrice spells. Learn Electrify. Gain increased resistance to blinding from bright lights. +Открывает электрические заклинания. Изучает Электризацию. Дает повышенную устойчивость к ослеплению от яркого света. +Water Novice +Новичок Воды +Unlocks water spells. Learn Water Ball. +Открывает заклинания воды. Изучает Ватербол. +Ice Novice +Новичок Льда +Unlocks ice spells. Learn Freeze. +Открывает ледяные заклинания. Изучает Переохлаждение. +Earth Novice +Новичок Земли +Unlocks earth spells. Learn Stone Skin. +Открывает заклинания земли. Изучает Каменную Кожу. +Air Novice +Новичок Воздуха +Unlocks air spells. Learn Wind Blast. +Открывает воздушные заклинания. Изучает Удар Ветра. +Latex 101 +Латекс 101 +Unlocks latex spells. Learn Slime Ball. +Разблокирует латексные заклинания. Изучает Слаймболл. +Metal 101 +Металл 101 +Unlocks metal spells. Learn Conjure Cuffs. +Открывает металлические заклинания. Изучает Сотворение цепей. +Rope 101 +Веревка 101 +Unlocks rope spells. Learn Conjure Ropes. +Разблокирует заклинания веревки. Изучает Сотворение веревок. +Leather 101 +Кожа 101 +Unlocks leather spells. Learn Conjure Gag. +Разблокирует кожаные заклинания. Изучает Вызов Кляпа. +Physics 101 +Физика 101 +Unlocks teleportation and spatial manipulation spells. Learn Wall. +Открывает заклинания телепортации и манипуляции пространством. Изучает Стену. +Summoning 101 +Призыв 101 +Unlocks summoning spells. Learn Summon Familiar. +Открывает заклинания призыва. Изучает Призыв Фамильяра. +Blessing of Shadow +Благословение Тени +Unlocks shadow spells. Learn Shadow Dagger. +Открывает теневые заклинания. Изучает Теневой Кинжал. +Blessing of Light +Благословение Света +Unlocks light spells. Learn Flash. Gain significantly increased resistance to blinding from bright lights. +Открывает легкие заклинания. Изучает Блеск. Значительно повышается устойчивость к ослеплению от яркого света. +Blessing of Obscurity +Благ. Неизвестности +Unlocks invisibility spells. Learn Camouflage. +Открывает заклинания невидимости. Изучает Камуфляж. +Projection Magic +Магия проекции +Unlocks illusory spells. Learn Summon Decoy. +Открывает иллюзорные заклинания. Изучает Призыв Приманки. +Alteration Magic +Магия изменения +Unlocks alteration spells. Learn Confuse. +Открывает заклинания изменения. Изучает Запутывание. +Arcane Knowledge +Знание Арканы +Unlocks knowledge and critical-strike spells. Learn True Steel, and unlocks advanced tooltips for enemies. +Открывает знания и заклинания критического удара. Изучает Истинную Сталь и открывает расширенные подсказки о врагах. +Glue +Клейкая жижа +The glue sticks to you and engulfs your legs! +Клейкая жижа прилипает к вам и окутывает ваши ноги! +The glue slows you down! +Клейкая жижа замедляет вас! +The glue slows you down! (-DamageDealt SP) +Клейкая жижа замедляет вас! (-DamageDealt SP) +Firebolt +Огненная стрела +Elemental's Firebolt +Элементальная огненная стрела +Elemental's Gust +Стихийный шквал +Gust +Шквал +A ball of flame that does DamageDealt damage to one target. +Огненный шар, наносящий DamageDealt урона одной цели. +You a hurl a firebolt! +Вы выпускаете огненную стрелу! +Choose aim direction +Прицельтесь, выберите направление +Windblast +Удар ветра +Three scattered puffs of wind that do DamageDealt blast damage at close range, stun briefly, and push targets back. +Три разрозненных порыва ветра, которые наносят DamageDealt урона от взрыва на близком расстоянии, ненадолго оглушают и отбрасывают цели назад. +You press your wrists together and conjure a blast of wind! +Вы сжимаете запястья вместе и вызываете Удар Ветра! +Choose aim direction +Прицельтесь, выберите направление +Gust +Шквал +Three puffs of wind in a tight cone that deal DamageDealt blast damage and push targets back. +Три порыва ветра в узком конусе, которые наносят DamageDealt урона от взрыва и отбрасывают цели назад. +You exhale a mighty wind! +Вы выдыхаете могучий ветер! +Choose aim direction +Прицельтесь, выберите направление +Knife +Нож +Throw one of your knives DamageDealt damage. Lands in the target's tile, but is recoverable afterward. +Бросок одного из ваших ножей, наносящий DamageDealt урона. Приземляется на целевую плитку и в последствии может быть поднят обратно. +You a throw a knife! +Вы бросаете нож! +Choose aim direction +Прицельтесь, выберите направление +Shadow Dagger +Кинжал тени +A cold shadowy blade that deals DamageDealt damage and pierces all in its path. +Холодный призрачный клинок, который наносит DamageDealt урона, и пронзает всё на своем пути. +You a hurl a shadowy dagger! +Вы бросаете теневой кинжал! +Choose aim direction +Прицельтесь, выберите направление +Shadow Slash +Теневой удар +Shadow Scythe +Теневая коса +Slice the area in front of you, dealing a delayed DamageDealt damage in an area and slowing briefly. Deals 50% more damage when you are attacking from the shadows. +Разрежьте область перед собой, нанося отложенные DamageDealt урона по области, и ненадолго замедляя врагов. Наносит на 50% больше урона, когда вы атакуете из теней. +You create a tear in space with your finger! +Вы создаете разрыв в пространстве движением своего пальца! +Choose aim direction +Прицельтесь, выберите направление +Blink +Мерцание +Instantly teleport to an adjacent position and gain +50 evasion for 3 turns. Unlocks Blink and Warp when learned. +Мгновенно телепортирует на соседнюю клетку и дарует +50 к уклонению на 3 хода. Разблокирует Мерцание и Пространственный прыжок при изучении. +You teleport! +Вы телепортируетесь! +Choose target location (1 tile range) +Выберите целевое местоположение (В радиусе 1 клетки) +Blink II +Мерцание II +Instantly teleport up to 2 tiles away. Must have vision of the target point. Stuns an enemy if you teleport behind them. +Мгновенно телепортирует на расстояние до 2 клеток. Необходимо видеть целевую точку. Оглушает врага, если вы телепортируетесь позади него. +You teleport! +Вы телепортируетесь! +Choose target location (2 tile range) +Выберите целевое местоположение (В радиусе 2 клеток) +Blink III +Мерцание III +Instantly teleport up to 3 tiles away. Must have vision of the target point. +Мгновенно телепортирует на расстояние до 3 клеток. Необходимо видеть целевую точку. +You teleport! +Вы телепортируетесь! +Choose target location (3 tile range) +Выберите целевое местоположение (В радиусе 3 клеток) +Ice Shard +Осколок льда +A shard of ice that does DamageDealt damage and slows for Duration turns. Freezes if already slowed or drenched. +Осколок льда, который наносит DamageDealt урона и замедляет противника на Duration ходов. Замораживает, если враг уже замедлен или промок. +You a hurl a shard of ice! +Вы швыряете осколок льда! +Choose aim direction +Прицельтесь, выберите направление +Ice Lance +Ледяное копье +A quick-moving shard of ice that does DamageDealt damage and slows for Duration turns and passes through enemies. Freezes if already slowed or drenched. +Быстро движущийся осколок льда, который наносит DamageDealt урона и замедляет на Duration ходов. Также оно прошивает врагов насквозь. Замораживает, если враг уже замедлен или промок. +You conjure a mighty spear of ice and hurl it forward! +Вы создаете могучее ледяное копье и бросаете его во врагов! +Choose aim direction +Прицельтесь, выберите направление +Snowball +Снежок +A fast orb that leaves behind a frigid cloud of ice. Enemies walking in the cloud take DamageDealt ice damage per tile and are slowed. +Быстро летящий шар, который оставляет за собой облака холода. Враги, двигающиеся в облаке, получают урон от льда в размере DamageDealt за плитку и замедляются. +You a hurl a snowy blast! +Вы кидаете снежок! +Choose aim direction +Прицельтесь, выберите направление +Winterblast +Ледяной шар +A piercing orb that leaves a trail of ice. Deals DamageDealt ice damage to enemies hit. +Пронзающий врагов шар, оставляющий за собой ледяной след. Наносит DamageDealt урона льдом пораженным врагам. +You a hurl a frigid orb! +Вы швыряете ледяной шар! +Choose aim direction +Прицельтесь, выберите направление +Freeze +Переохлаждение +Chill an adjacent target for DamageDealt ice damage and slows for Duration turns. Freezes if already slowed or drenched. +Охлаждает соседние цели и наносит им DamageDealt ледяного урона, замедляя на Duration ходов. Замораживает, если цель уже замедлена или промокла. +You utter dark words of ice-cold truths. +Вы произносите мрачные слова ледяной истины. +Choose a target to freeze +Выберите цель для замораживания +Flash Frost +Шоковая заморозка +Deal DamageDealt ice damage in a 3x3 area. Drenched creatures are frozen for 8 turns. +Наносит DamageDealt урона льдом в зоне 3х3. Промокшие существа замораживаются на 8 ходов. +You recite a frigid poem... +Вы читаете хвалебную оду морозу... +Choose a 3x3 area to freeze +Выберите область размером 3х3 +Shatter +Раскол +Shatter +Раскол +When a frozen target thaws or dies, deals DamageDealt ice damage to nearby targets and slow for 4 turns.. +Когда замороженная цель оттаивает или умирает, вокруг неё наносится DamageDealt урона льдом ближайшим целям и замедляет их на 4 хода. +Ignite +Поджог +Ignite +Поджог +Ignite a friendly target for Duration turns, dealing DamageDealt fire damage per turn to it and nearby targets. +Поджигает дружественную цель на Duration ходов, нанося ей и близлежащим целям DamageDealt урона от огня за ход. +You spin in a circle, inscribing flames with your feet! +Ты кружитесь, рисуя ногами языки пламени! +Choose a friendly target to ignite +Выберите дружественную цель для Поджога +Conjure Chain +Сотворение цепей +Magic Chain +Магические цепи +Magic Rope +Магические веревки +Magic Belt +Магические ремни +Witch's Chain +Ведьмовские цепи +Throws a chain that does DamageDealt chain damage. Targets with 50% or more binding take 50 crush damage and are slowed for 4 turns. +Бросает цепь, которая наносит DamageDealt цепного урона. Цели со скованностью 50% или более получают 50 единиц дробящего урона и замедляются на 4 хода. +You a hurl a strand of chain! +Вы швыряете цепь! +Choose aim direction +Прицельтесь, выберите направление +Enchant Rope +Зачаровать веревку +Rope Enchantment +Зачарование веревки +Spellbinding +Наложение чар +Convert rope binding on a target into magical bindings, which are much more powerful. Deals a small amount of arcane damage. +Преобразует сковывание веревкой на цели в магическое сковывание, которые намного мощнее. Наносит небольшое количество урона арканой. +You whisper an enchanting tale of rope bondage... +Вы шепотом рассказываете очаровательную историю о веревочном бондаже... +Choose targets to tighten the ropes of +Выберите цель, чтобы затянуть веревки +Conjure Ropes +Сотворение верёвок +Animated Rope +Живые верёвки +Launch 3 ropes that deal DamageDealt chain damage each and add 32 rope binding. +Запускает 3 веревки, каждая из которых наносит DamageDealt цепного урона, и дополнительно повышает скованность на 32. +You animate a bunch of ropes! +Вы оживляете связку верёвок! +Choose aim direction +Прицельтесь, выберите направление +Ropestorm +Верёвочный шторм +Animated Rope +Оживление веревки +Launch 9 ropes that deal DamageDealt chain damage each and add 32 rope binding. Best in open spaces. +Запустите 9 веревок, каждая из которых нанесет цели цепной урон, и добавит 32 веревочного сковывания. Эффективнее всего на открытых пространствах. +You animate a sizeable quantity of ropes! +Вы оживляете множество веревок! +Choose aim direction +Прицельтесь, выберите направление +Steel Torrent +Стальной поток +Steel Rain +Стальной дождь +The plug hits you! (DamageDealt) +Вас ударяет пробка! (DamageDealt) +The plug directs itself between your legs! +Пробка сама направляется между ваших ног! +Fire 4 Steel Rain in quick succession toward the target point. Best in open spaces. +Выпускает 4 Стальных Дождя в быстрой последовательности в направлении намеченной точки. Лучше всего работет на открытых пространствах. +Fires a steel plug that deals DamageDealt piercing damage. Bound targets are Plugged, which increases Distraction over time. +Выстреливает стальной пробкой, которая наносит DamageDealt пронзающего урона. Пробка остаётся в Связанных целях, что со временем увеличивает их возбуждение. +You raise your hand and a steel projectile appears! +Вы поднимаете руку, и появляется стальной снаряд! +You raise your hand and several steel projectiles appear! +Вы поднимаете руку, и появляется несколько стальных снарядов! +Choose aim direction +Прицельтесь, выберите направление +Choose target point +Выберите целевую точку +Steel Torrent +Стальной поток +Steel Rain +Стальной дождь +Bola +Болас +Restraining Device +Сдерживающее устройство +The thrown restraining device latches onto you as you struggle to get it off!!! +Брошенное сдерживающее устройство цепляется за вас, и вы изо всех сил пытаетесь его снять!!! +The restraining device wraps many elastic cables around you!!! +Удерживающее устройство обматывает вас множеством эластичных тросов!!! +Shadowy Grip +Призрачная хватка +A dark hand latches onto you and holds you tight! +Темная рука вцепляется в вас и крепко держит! +You are snugly wrapped in glowing ropes! +Вы плотно обмотаны светящимися веревками! +Obsidian Orb +Обсидиановый шар +Metallic restraints encircle your body! +Металлические ограничители обхватывают ваше тело! +The latex spreads across your limbs and rubberizes, forming a tough barrier! +Латекс распределяется по вашим конечностям и превращается в резину, образуя прочный барьер! +The latex spreads across your limbs and hardens, forming a stretchy layer! +Латекс распределяется по вашим конечностям и затвердевает, образуя эластичный слой! +The latex clings to you and slows you down, making you vulnerable to the barrage! +Латекс прилипает к вам и замедляет ваши движения, делая вас уязвимыми для атак! +The latex expands rapidly and slows you down as it hardens into a stretchy layer! +Латекс быстро расширяется и замедляет ваши движения, превращаясь в эластичный слой! +Bola +Болас +Choose aim direction +Прицельтесь, выберите направление +You throw a bola! +Вы бросаете болас! +You ready a bola! +Ты раскручиваете болас! +You are feeling drowsy... +Вы чувствуете сонливость... +Shadow Strike +Удар тени +Shadow Heel +Теневой ад +Runic Ward +Рунический оберег +Gives yourself or a creature a magic shield for 50 turns, granting +30 Magic Armor. +Дает вам или иному существу магический щит на 50 ходов, дающий +30 к магической броне. +You whisper a word of protection! +Вы шепчете слова защиты! +Choose creature to shield +Выберите существо для защиты +Afterimage +Остаточные изображения +Massively increases a creature's evasion for 5 attacks. Expires after 25 turns. +Значительно увеличивает уклонение существа на 5 атак. Длится 25 ходов. +Your movements intensify! +Ваши движения ускоряются! +Choose creature to buff +Выберите, какое существо нужно усилить +Magical Sight +Магическое зрение +Highlight the location of interesting magical phenomena for 20 turns +Вы видите местоположение интересных магических явлений в течение 20 ходов. +You analyze the target! +Вы анализируете цель! +Choose object to analyze +Выберите объект для анализа +Barrier Runes +Руны барьера +Creates a 1x1 field of barrier monoliths that blocks BlockAmount damage from projectiles for DelayTime turns, but doesn't block movement. +Создает поле барьерных монолитов размером 1х1, блокирующих BlockAmount урона от снарядов на DelayTime ходов, но не препятствующих движению. +You raise a field of runes with a command word! +Вы создаете поле рун с помощью командного слова! +Choose barrier location +Выберите местоположение барьера +Electric Field +Электрическое поле +Creates a conductive area for Duration turns. Makes all entities in the area Conductive, forcing them to share 50% electric damage. +Создает электропроводящую область на Duration ходов. Делает всех в этом районе Проводниками, заставляя их разделять 50% урона электрическим током. +You energize the targeted area! +Вы электрифицируете целевую область! +Choose target 3x3 area +Выберите целевую область размером 3х3 +Firey Explosion +Огненный взрыв +Icey Explosion +Ледяной взрыв +Witch's Electric Orb +Ведьмин электрический шар +Witch's Electric Burst +Ведьмин электрический разряд +Electrify +Электризация +A delayed shock that deals DamageDealt damage and stuns for Duration turns. +Отложенный удар током, который наносит DamageDealt урона и оглушает на Duration ходов. +You charge up a burst of electricty! +Вы накапливаете заряд энергии! +Choose target location +Выберите целевое местоположение +The elemental channels the force of the storm! +Элементаль направляет силу шторма! +Fireball +Огненный шар +A slow moving ball of flame that explodes for DamageDealt fire damage in a wide area. +Медленно движущийся огненный шар, который взрывается нанося DamageDealt урона от огня по площади. +You a hurl a massive fireball! +Вы швыряете огромный огненный шар! +Choose aim direction +Прицельтесь, выберите направление +Fireblast +Огненный взрыв +A bolt of flame that explodes for DamageDealt fire damage in an area. +Вспышка пламени, которая взрывается и наносит DamageDealt огненного урона по области. +You a hurl a blast of flame! +Вы швыряете сгусток взрывоопасного огня! +Choose aim direction +Прицельтесь, выберите направление +Incinerate +Испепеление +A tornado of flame that does DamageDealt damage per turn for LifeTime turns. +Огненный торнадо, наносящий DamageDealt урона за ход в течение LifeTime ходов. +You conjure a gout of flame! +Вы взываете к огню! +Choose target AoE location +Выберите целевое местоположение AoE +Hailstorm +Буря с градом +A cloud of falling ice that does DamageDealt damage per turn for LifeTime turns and slows. +Облако падающего льда, наносящее DamageDealt урона за ход в течение LifeTime ходов, также замедляет. +You conjure a flurry of frost! +Вы вызываете морозный шквал! +Choose target AoE location +Выберите целевое местоположение AoE +Raincloud +Дождевая туча +After 3 turns, rain falls, creating a 3x3 grid of water and dealing DamageDealt acid damage to enemies within. +Спустя 3 хода выпадает дождь, создавая лужу размером 3х3 и нанося DamageDealt урона от кислоты врагам внутри. +You create a stormy cloud! +Вы создаете грозовую тучу! +Choose target AoE location +Выберите целевое местоположение AoE +Field of Frost +Поле мороза +Freezes a 5x5 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. +Замораживает область размером 5х5 (лед замедляет объекты). Враги в этом районе получают DamageDealt урона за ход в течение LifeTime ходов. +You stomp your foot and call forth the blizzard! +Вы топаете ногой и вызываете метель! +Choose target AoE location (5x5) +Выберите целевое местоположение AoE (5x5) +Zone of Frost +Зона мороза +Freezes a 3x3 area (ice slows entities). Enemies in the area take DamageDealt damage per turn for LifeTime turns. +Замораживает область размером 3х3 (лед замедляет объекты). Враги в этом районе получают DamageDealt урона за ход в течение LifeTime ходов. +You sweep your foot and call forth the storm! +Вы топаете ногой и вызываете шторм! +Choose target AoE location (3x3) +Выберите целевое местоположение AoE (3x3) +Cold Feet +Заморозка ног +Freezes a single tile (ice slows entities). Any enemy standing on the tile takes take DamageDealt damage per turn for LifeTime turns. +Замораживает одну плитку (лед замедляет объекты). Любой враг, стоящий на этой плитке, получает DamageDealt урона за ход в течение LifeTime ходов. +You tap your foot and call forth the frost! +Вы топаете ногой и призываете мороз! +Choose target location (1x1) +Выберите целевое местоположение (1x1) +Healing Light +Исцеляющий свет +Channel to heal 15 hitpoints per turn to summoned allies within a 5x5 area. +Поддерживайте для исцеления 15 здоровья за ход призванным союзникам в пределах зоны 5х5. +You conjure a healing light! +Вы призываете исцеляющий свет! +Choose target AoE location (5x5) +Выберите целевое местоположение AoE (5x5) +Crackle +Треск +Storm Bolt +Штормовой разряд +A bolt of lightning that does DamageDealt electric damage to enemies in a 4-range line and briefly stuns. +Разряд молнии, который наносит DamageDealt урона электричество врагам на расстоянии 4-х плиток и ненадолго оглушает. +Lightning erupts from your fingertips! +Молния срывается с кончиков ваших пальцев! +Choose line direction (max range 4 tiles) +Выберите направление линии (максимальный диапазон 4 плитки) +Tremor +Дрожь +Make vulnerable and slow enemies in targeted area for Duration turns, and deal DamageDealt crush damage. Creates a slowing field after. +Сделайте уязвимыми и замедлите врагов в намеченной области на Duration ходов и наносите DamageDealt дробящего урона. После этого создает зону замедления. +You call forth the rage of the earth. +Вы вызываете ярость земли. +Choose AoE +Выберите AoE +Earthquake +Землетрясение +Channel for 5 turns to send 2 tremors per turn in target area. +Поддерживайте 5 ходов, чтобы посылать по 2 толчка за ход в целевую область. +You channel the fury of the earth!!! +Вы направляете ярость земли!!! +Choose AoE +Выберите AoE +Shock Orb +Шоковый шар +Shock Orb +Шоковый шар +A slow-moving orb that deals DamageDealt electric damage to an adjacent enemy each turn. +Медленно движущийся шар, который наносит урон электрическим током соседнему врагу каждый ход. +You hurl a charged orb! +Вы бросаете искрящийся шар! +Choose aim direction (max range 4 tiles) +Прицельтесь, выберите направление (максимальный диапазон 4 плитки) +Lightning Rune +Руна молнии +Lightning Rune +Руна молнии +A trap that deals DamageDealt electric damage and stuns for 4 turns. Takes 3 turns to setup. 200% crit multiplier. +Ловушка, которая наносит урон электрическим током и оглушает на 4 хода. Для размещения требуется 5 ходов. 200% множитель крит. урона. +You conjure a charged trap! +Вы создаете электрическую ловушку! +Choose location for trap +Выберите местоположение ловушки +Freeze Rune +Замораживающая руна +Freeze Rune +Замораживающая руна +A trap that deals DamageDealt ice damage and freezes for 30 turns. Takes 3 turns to setup. 200% crit multiplier. +Ловушка, которая наносит DamageDealt урона льдом и замораживает на 30 ходов. Для размещения требуется 3 хода. 200% множитель крит. урона. +You conjure an icy trap! +Вы создаете ледяную ловушку! +Choose location for trap +Выберите местоположение ловушки +Flame Rune +Огненная руна +Flame Rune +Огненная руна +A trap that deals DamageDealt fire damage in an area. Takes 3 turns to setup. 200% crit multiplier. +Ловушка, которая наносит DamageDealt урона от огня по области. Для размещения требуется 3 хода. 200% множитель крит. урона. +You conjure an incendiary trap! +Вы создаете огненную ловушку! +Choose location for trap +Выберите местоположение ловушки +Static Sphere +Статическая сфера +Static Sphere +Статическая сфера +Conjure a sphere for Duration turns that makes nearby entities Conductive and each turn deals DamageDealt electric damage to one of them. +Создает сферу на Duration ходов, которая делает близлежащих существ Проводниками, и каждый ход наносит одному из них DamageDealt урона электрическим током. +You summon a grey, featureless sphere adorned by static! +Вы призываете серую, безликую сферу, украшенную всполохами молний! +You summon a grey, featureless sphere adorned by static! +Вы призываете серую, безликую сферу, украшенную всполохами молний! +Choose sphere location +Выберите местоположение сферы +Fissure +Трещина +Lava Fissure +Лавовая трещина +A great fissure erupts from the earth, dealing 70 fire damage to enemies in a 4-range line and dealing 15 damage/turn for 6 turns. +Огромная трещина образуется в земле, нанося 70 единиц урона от огня врагам на линии в 4 плитках и нанося 15 единиц урона за ход в течение 6 ходов. +You stomp the ground and the earth opens its gaping maw! +Вы ударяете ногой о землю, и земля раскрывает свою зияющую пасть! +Choose line direction (max range 4 tiles) +Выберите направление линии (максимальный диапазон 4 плитки) +Lightning Bolt +Удар молнии +A bolt of lightning that does DamageDealt damage to enemies in an infinite line and briefly stuns. +Разряд молнии, который наносит DamageDealt урона врагам на определенной траектории и ненадолго оглушает. +You unleash a bolt of lightning! +Вы выпускаете на волю молнию! +Choose line direction +Выберите направление линии +Corona +Корона +Corona +Корона +Binding Light +Сковывающий свет +Binding Light +Сковывающий свет +Chaos Beam +Луч хаоса +Mystic Beam +Мистический луч +Mystic Barrage +Мистический шквал +A beam of light that channels for 2 turns (stunning you briefly) then instantly deals DamageDealt holy damage to the first target hit. Blinds for 12 turns. 150% crit multiplier. +Луч света, который заряжается в течение 2 ходов (ненадолго оглушая вас), а затем мгновенно наносит DamageDealt урона светом первой цели на пути. Ослепляет на 12 ходов. 150% множитель крит. урона. +You charge a powerful beam attack!!! +Вы атакуете мощным лучом!!! +Choose line direction +Выберите направление линии +Icicles +Сосульки +Icicle +Сосулька +Channel 3 turns to fire 3 icicles that deal DamageDealt ice damage and slow for 4 turns, freezing slowed/drenched targets for 3 turns. +Поддерживается 3 хода, чтобы запустить 3 сосульки, которые наносят DamageDealt ледяного урона, и замедляют на 4 хода, также замораживая уже замедленные/промокшие цели на 3 хода. +You raise a hand and icicles fly forward! +Вы поднимаете руку, и сосульки летят вперед! +Choose line direction +Выберите направление линии +Volcanism +Вулканизм +An area of summoned rocks becomes explosive. Deal fire damage to them to ignite, dealing DamageDealt fire damage to adjacent targets. +Вы делаете призванные монолиты взрывоопасными. Наносите им урон огнем, чтобы они воспламенились, нанося DamageDealt урона огнем соседним целям. +You stomp your foot and magma wells up beneath the ground! +Вы топаете ногой, и из-под земли вырывается магма! +Choose monoliths to enchant +Выберите монолиты для зачарования +Coalesce +Объединение +Gathers slime and slimed enemies into a central point. Deals DamageDealt glue damage per square of slime and Encases slimed enemies. Costs half mana if there is only slime. +Стягивает слизь и покрытых слизью врагов в центральную точку. Наносит DamageDealt урона слизью ща квадрат со слизью и заключает покрытых слизью врагов в Оболочку. Стоит половину маны, если задеват только слизь. +You command the slime to draw enemies in! +Вы приказываете слизи засосать врагов внутрь! +Choose area containing slime +Выберите область, содержащую слизь +Animate Slime +Оживление слаймов +Summons up to 3 slimes on slime tiles in an AoE. The slimes are friendly to you. +Вызывает до 3 слаймов на плитках со слизью в AoE. Эти слаймы дружелюбны к вам. +You concentrate magical energy into the slime, giving it a will of it's own... +Вы концентрируете магическую энергию в слизи, давая ей собственную волю... +Choose area containing slime +Выберите область, содержащую слизь +Animate Large Slime +Оживление большого слайма +Target an area with at least 3 slime tiles. Summons a large slime that is friendly to you. +Нацелитесь на область, где есть как минимум 3 плитки со слизью. Вызывает большого слайма, который дружелюбен к вам. +You concentrate magical energy into the slime, giving it a will of it's own... +Вы концентрируете магическую энергию в слизи, давая ей собственную волю... +Choose area containing slime +Выберите область, содержащую слизь +Latex Puppet +Латексная марионетка +Target an area containing helpless encased enemies. Transforms up to 3 of them into latex dolls that serve you for a while. +Выберите область, где находятся беспомощные враги в оболочке. Превращает до 3-х из них в латексных марионеток, которые прослужат вам некоторое время. +You concentrate magical energy into your victim's bindings, forcing them to move... +Вы концентрируете магическую энергию в оковах вашей жертвы, заставляя ее двигаться... +Choose area containing encased helpless enemies. +Выберите зону, в которой есть беспомощные враги в оболочке. +Solidify +Застынь +Solidifies slime in the area into Latex. Latex adheres to enemies and slowly binds them, escasing them when they are fully bound. +Превращает слизь в зоне в латекс. Латекс прилипает к врагам и медленно окутывает их, заключая в Оболочку, когда они полностью им покроются. +You inscribe a transmutation circle on the floor. +Вы рисуете на полу круг трансмутации. +Choose area containing slime +Выберите область, содержащую слизь +LiquidMetal +Жидкий металл +Solidifies Latex in the area into Liquid Metal. Liquid Metal is slippery, but also adheres to enemies and slowly binds them in metallic bonds. Enemies encased in liquid metal are more susceptible to knockback due to the slippery nature. +Превращает латекс в области в жидкий металл. Жидкий металл скользкий, но прилипает к врагам и медленно сковывает их металлическими узами. Враги, заключенные в жидкий металл, более восприимчивы к отбрасыванию из-за его скользкой природы. +You inscribe a transmutation circle on the floor. +Вы рисуете на полу круг трансмутации. +Choose area containing Latex +Выберите зону, содержащую латекс +Slime Repulsion +Отталкивание слизи +Gain +50 glue resist. (Having 45 or more Glue Resist negates many negative effects from slime) +Получите +50 к сопротивлению к урону Слизью. (Наличие 45 или более сопротивления слизи сводит на нет многие негативные эффекты от слизи) +Spread +Распространение +Slime in the target area expands by 1 unit in the four cardinal directions. Refreshes duration to 12-20 turns. +Слизь в целевой области расширяется на 1 единицу в четырех основных направлениях. Увеличивает продолжительность до 12-20 ходов. +The slime spreads! +Слизь расползается! +Choose area containing slime +Выберите область, содержащую слизь +Wall of Slime +Стена из слизи +Unlocks horizontal and vertical slime walls that traps enemies who try to pass through. +Открывает горизонтальные и вертикальные стены из слизи, которые ловят врагов, пытающихся пройти сквозь них. +Wall of Slime (Vert) +Стена из слизи (Верт.) +Creates a vertical wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. +Создает вертикальную стену из слизи на 20 ходов. Враги, которые проходят сквозь нее, застревают в стене и покрываются слизью. +You tap your foot and a wall of slime slowly raises out of the ground. +Вы постукиваете ногой, и стена слизи медленно поднимается из земли. +Choose vertical wall origin (5 tiles high) +Выберите источник вертикальной стены (высота 5 плиток) +Wall of Slime (Horiz) +Стена из слизи (Гориз.) +Creates a horizontal wall of slime for 20 turns. Enemies that pass through are stuck in the wall and slimed. +Создает горизонтальную стену из слизи на 20 ходов. Враги, которые проходят сквозь нее, застревают в стене и покрываются слизью. +You tap your foot and a wall of slime slowly raises out of the ground. +Вы постукиваете ногой, и стена слизи медленно поднимается из земли. +Choose horizontal wall origin (5 tiles wide) +Выберите источник горизонтальной стены (ширина 5 плиток) +Wall of Latex +Стена из латекса +Unlocks horizontal and vertical latex walls that encase enemies that walk through. +Открывает горизонтальные и вертикальные латексные стены, за которыми скрываются проходящие враги. +Wall of Latex (Vert) +Стена из латекса (Верт) +Creates a vertical wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. +Создает вертикальную стенку из латекса на 20 ходов. Враги, которые проходят через неё, заключаются в Оболочку, в ином случае, если не попадают в Оболочку, получают 50 урона от слизи и Ослепляются. +You tap your foot and a wall of latex stretches out across the corridor. +Вы топаете ногой, и поперек коридора растягивается стена из латекса. +Choose vertical wall origin (5 tiles high) +Выберите источник вертикальной стены (высота 5 плиток) +Wall of Latex (Horiz) +Стена из латекса (Горизонт.) +Creates a horizontal wall of latex for 20 turns. Enemies that pass through are encased, take 50 glue damage if not encased, and blinded. +Создает горизонтальную стенку из латекса на 20 ходов. Враги, которые проходят через неё, заключаются в Оболочку, в ином случае, если не попадают в Оболочку, получают 50 урона от слизи и Ослепляются. +You tap your foot and a wall of latex stretches out across the corridor. +Вы топаете ногой, и поперек коридора растягивается стена из латекса. +Choose horizontal wall origin (5 tiles wide) +Выберите источник горизонтальной стены (ширина 5 плиток) +Earthshape +Терраформинг +Unlocks 3 spells that allow creating mounds, rings, or lines of 50hp, 25 armor rocks. +Открывает 3 заклинания, которые позволяют создавать холмы, кольца или линии с 25 здоровья и 50 защииы. +Earthen monoliths rise from the ground! +Земляные монолиты поднимаются из-под земли! +An earthen monolith rises from the ground! +Земляной монолит поднимается из-под земли! +Earthshape (Ring) +Терраформинг (Кольцо) +Create a large ring of Earthen Monoliths. They have 50 hitpoints and 25 armor. +Создайте большое кольцо из земляных монолитов. У них 50 здоровья и 25 защиты. +You stomp your foot and monoliths emerge in a ring around you! +Вы топаете ногой, и монолиты окружают вас кольцом! +Choose ring origin +Выберите положение кольца +Earthshape (Mound) +Терраформинг (Холм) +Create a 3x3 field of Earthen Monoliths. They have 50 hitpoints and 25 armor. +Создайте поле из земляных монолитов размером 3х3. У них 50 здоровья и 25 защиты. +You stomp your foot and monoliths emerge from the ground! +Вы топаете ногой, и монолиты появляются из-под земли! +Choose mound origin +Выберите положение холма +Earthshape (Line) +Терраформинг (Линия) +Create a 4-tile line of Earthen Monoliths. They have 50 hitpoints and 25 armor. +Создайте линию из земляных монолитов длиной в 4 плитки. У них 50 здоровья и 25 защиты. +You stomp your foot and monoliths emerge from the ground! +Вы топаете ногой, и монолиты появляются из-под земли! +Choose line direction +Выберите направление линии +Earthshape (Arc) +Терраформинг (Дуга) +Create a 5-wide arc of Earthen Monoliths. They have 50 hitpoints and 25 armor. +Создайте дугу из земляных монолитов длиной в 5 плиток. У них 50 здоровья и 25 защиты. +You stomp your foot and monoliths emerge from the ground! +Вы топаете ногой, и монолиты появляются из-под земли! +Choose line direction +Выберите направление линии +Rock +Камень +Rock +Камень +Channel 1 turn to launch a rock that deals DamageDealt crush damage and slows for 4 turns. Blocks up to 80 damage. +Применяя 1 ход, вы можете запустить камень, который нанесёт DamageDealt дробящего урона и замедлит врага на 4 хода. Блокирует до 80 единиц урона. +You raise a stone from the ground and kick it forward! +Вы поднимаете камень с земли и запускаете его вперед! +Choose line direction +Выберите направление линии +Earth Kick +Земляной пинок +Stone Projectile +Каменный снаряд +Kick a summoned rock to turn it into a projectile. Deals DamageDealt crush damage in a 3x3 area and slows for 4 turns. +Ударьте по вызванному камню, чтобы превратить его в снаряд. Наносит DamageDealt дробящего урона в области 3х3 и замедляет на 4 хода. +With a solid kick, you launch one of your monoliths forward! +Сильным ударом вы запускаете один из своих монолитов вперед! +Choose a monolith to kick +Выберите монолит для удара +Boulder +Валун +Boulder +Валун +Channel 1 turn to launch a huge slow rock that deals DamageDealt crush damage and slows for 8 turns. AoE, collides with summoned rocks. Blocks up to 200 damage. +Применяя 1 ход, вы можете запустить огромный медленный камень, который наносит DamageDealt дробящего урона и замедляет на 8 ходов. Наносит АоЕ-урон, столкнувшись с другими вызванными камнями. Блокирует до 200 единиц урона. +You raise a massive boulder from the ground and kick it forward! +Вы поднимаете с земли массивный валун и пинаете его вперед! +Choose line direction +Выберите направление линии +Stamina Up I +Повышение выносливости I +Increases maximum SP by 12 +Увеличивает максимум SP на 12 +Iron Will +Железная воля +While you have 100 current willpower or more, regain an additional 4 stamina per turn. +Пока у вас есть 100 или более Силы Воли, вы восстанавливаете дополнительные 4 Выносливости за ход. +Defiance +Неповиновение +For each 10 current willpower you have over 50, gain +5 Bondage Resist. +За каждые 10 текущих единиц силы воли сверх 50, вы получаете +5 Сопротивления Ограничителям. +Willful Struggle +Воля к борьбе +For each 10 current willpower you have over 50, gain +1% struggle power. +За каждые 10 текущих единиц силы воли сверх 50, вы получаете +5 к эффективности Борьбы. +Your willpower provides you with additional strength! (+AMOUNT%) +Ваша сила воли придает вам дополнительную силу! (+AMOUNT%) +Athlete +Спортсмен +Sprinting costs 40% less stamina. +Спринт требует на 40% меньше выносливости. +Sneaky +Тихоня +You are harder to see when waiting. +Вас труднее заметить, когда вы Ждёте. +Vault +Гимнастка +You can sprint under flying enemies and through vulnerable, slowed, or disabled enemies. Does not work on immobile enemies such as doors and turrets. +Вы можете пробегать спринтом под летающими врагами и через уязвимых, замедленных или выведенных из строя врагов. Не действует на неподвижных врагов, таких как двери и турели. +Improved Vault +Чемпионка по гимнастике +You can dash through enemies that aren't immobile. +Вы можете пробегать спринтом сквозь не-неподвижных врагов. +Dodge I +Уклонение I ++10 Evasion ++10 к Уклонению +Dodge II +Уклонение II ++15 Evasion (25 total) ++15 к Уклонению (всего 25) +Dodge III +Уклонение III ++25 Evasion (50 total) ++25 к Уклонению (всего 50) +Strength Up +Усиление ++20% Physical Damage ++20% физического урона +Deadly Aim +Смертельная точность +Increases crit multiplier by a % equal to your Battle Rhythm. +Увеличивает коэффициент критического удара на %, равный вашему Боевому Ритму. +Accuracy I +Точность I ++10 Accuracy ++10 к Точности +Accuracy II +Точность II ++15 Accuracy (25 total) ++15 к Точности (всего 25) +Accuracy III +Точность III ++25 Accuracy (50 total) ++25 к Точности (всего 50) +Martial Arts I +Боевые искусства I +Unarmed strikes gain 15% accuracy and -10% stamina cost. +Удары без оружия имеют на 15% больше точности и их стомость в выносливости снижается на -10%. +Martial Arts II +Боевые искусства II +Unarmed strikes gain 20% accuracy (35% total) and -15% stamina cost (25% total). +Удары без оружия имеют на 15% больше точности и их стомость в выносливости снижается на -10%. +Martial Arts III +Боевые искусства III +Unarmed strikes gain 25% accuracy (60% total) and -25% stamina cost (50% total). +Удары без оружия имеют на 15% больше точности и их стомость в выносливости снижается на -10%. +Precise Critical +Точный крит +When landing a critical strike with physical damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. +При проведении критического удара с нанесением физического урона точность более 100% преобразуется в дополнительный множитель критического урона с эффективностью 50%. +Precise Magic +Точная магия +When landing a critical strike with magic damage, accuracy over 100% is converted to bonus crit multiplier at 50% efficiency. +При проведении критического удара с нанесением магического урона точность более 100% преобразуется в дополнительный множитель критического урона с эффективностью 50%. +Magical Overload +Магическая перегрузка +When landing a critical strike with magic damage, crit multiplier is increased by 25% of your current DP. +При проведении критического удара с магическим уроном множитель крита увеличивается на 25% от ваших текущих DP. +Brute Force +Грубая сила +When enabled, your attacks deal 10% of your willpower as additional crush damage but cost 10 more stamina. +Когда активировано, ваши атаки наносят 10% вашей силы воли в качестве дополнительного дробящего урона, но требуют на 10 больше выносливости. +One With Slime +Единение со слизью +While standing on slime/latex, you can cast rubber spells without components. +Стоя на слизи/латексе, вы можете произносить резиновые заклинания без движений/слов. +Convincing Disguise +Убедительная маскировка +While standing still on slime, or fully bound with at least one latex item, you are harder to notice. Each latex restraint you are wearing increases this amount. Can be toggled off by clicking the buff icon. +Когда вы неподвижно стоите на слизи или полностью связаны с хотя бы одним латексным предметом, вас становится труднее заметить. Каждый латексный предмет, которое вы носите, увеличивает эффективность способности. Можно переключать, щелкнув по значку баффа. +Magical Implements +Магические орудия +While holding a magical weapon like a staff or magic knife, your mana costs are reduced by 20%. +При наличии в руке магического оружия, такого как посох или магический нож, ваши затраты маны снижаются на 20%. +Mage Circuits +Магические схемы +Increases the size of the passive mana pool by +400. +Увеличивает размер пассивного резерва маны на +400. +Archmage +Верховный маг +Upcasted spells cost 25% less mana. +Усиленные заклинания стоят на 25% меньше маны. +Temperature Play +Температурный перепад +Fire and Ice damage do 30% more damage to fully bound enemies. +Урон от огня и льда увеличивается на 30% по полностью связанным врагам. +Fire Hazard +Пожароопасность +Fire damage ignites enemies for 5 damage per turn for 6 turns. +Урон от огня воспламеняет врагов на 5 единиц урона за ход в течение 6 ходов. +Frozen Prison +Ледяная тюрьма +Freezing an enemy applies 10 binding per turn of freeze added, plus brings the enemy to a minimum of 20% binding. +Замораживание врага накладывает 10 сковывания за каждый ход заморозки, а также доводит сковывание противника минимум до 20%. +Lightning Rod +Громоотвод +After casting an Air or Storm spell that costs mana, become Conductive and gain 300% electric resist for 3 turns. +После произнесения заклинания Воздуха или Шторма, которое требует затрат маны, станьте Проводником и получите 300% сопротивления электричеству на 3 хода. +Frustration +Разочарование +When enabled, enemies in chastity become angry Frustrated Pets when becoming helpless. +Когда включено, враги в целомудрии становятся сердитыми Неудовлетворенными Питомцами, когда оказываются беспомощными. +Mana Up I +Увеличение маны I +Increases maximum MP by 12 +Увеличивает максимальное MP на 12 +Mana Up II +Накопление маны II +Increases maximum MP by 12 +Увеличивает максимальное MP на 12 +Mana Up III +Увеличение маны III +Increases maximum MP by 12 +Увеличивает максимальное MP на 12 +Strong Mind I +Сильный разум I +Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn +Увеличивает максимальное Возбуждение на 33% от базового и Возбуждение уменьшается на 0,1 за ход. +Strong Mind II +Сильный разум II +Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn +Увеличивает максимальное Возбуждение на 33% от базового и Возбуждение уменьшается на 0,1 за ход. +Strong Mind III +Сильный разум III +Increases maximum Distraction by 33% of base and Distraction regen by -0.1 per turn +Увеличивает максимальное Возбуждение на 33% от базового и Возбуждение уменьшается на 0,1 за ход. +Expert Wizard +Опытный волшебник +Gives you an additional spell choice slot +Дает вам дополнительный слот для выбора заклинания +Master Wizard +Волшебник-мастер +Gives you an additional spell choice slot +Дает вам дополнительный слот для выбора заклинания +Legendary Wizard +Легендарный волшебник +Gives you an additional spell choice slot +Дает вам дополнительный слот для выбора заклинания +More Summons +Больше суммонов +Increases the permanent summon cap by +2 (from 2 to 4) +Увеличивает лимит постоянных суммонов на +2 (с 2 до 4) +Many Summons +Еще больше суммонов +Increases the permanent summon cap by +2 (from 4 to 6) +Увеличивает лимит постоянных суммонов на +2 (с 4 до 6) +Summon Bomb +Призыв бомбы +Bomb +Бомба +Channel for 1 turn for a bomb that does DamageDealt blast damage in an area after DelayTime turns. +Применяйте 1 ход для броска бомбы, которая наносит DamageDealt взрывного урона в области спустя DelayTime ходов. +Fire in the hole! +Ложись! +Choose target AoE location +Выберите целевое местоположение AoE +Rope Rune +Руна веревок +Rope Rune +Руна веревок +An AoE trap on the ground that deals 25 chain damage, roots for 8 turns, and applies 80 points of binding. Takes 3 turns to setup. 200% crit multiplier. +AoE-ловушка на земле, которая наносит 25 цепного урона, обездвиживает на 8 ходов и накладывает 80 единиц Сковывания. Для установки требуется 3 хода. Множитель крит. урона 200%. +You conjure a rope trap! +Вы создаете веревочную ловушку! +Choose location for trap +Выберите местоположение ловушки +Rope Burst +Буйство верёвок +An explosion of rope deals DamageDealt chain damage in a 3x3 AoE and applies 50 points of rope binding. Snares for Duration turns. +Верёвочное буйство наносит DamageDealt урона в AoE 3x3, и накладывает 50 очков сковывания верёвкой. Стреноживает на Duration ходов. +You call forth ropes from the abyss! +Вы вызываете веревки из бездны! +Select center of a a 3x3 AoE +Выберите центр AoE 3x3 +Leather Package +Кожаная упаковка +After conjuring a leather restraint, you can conjure up to three more without advancing time. +После создания кожаного ограничителя, вы можете создать еще до трех без затрат времени. +Conjure Leather Cuffs +Сотворение кожаных манжет +Conjured Leather Cuffs +Созданные кожаные манжеты +The leather cuffs clasp your wrists and pull them tightly! +Кожаные манжеты обхватывают ваши запястья и плотно стягивают их! +The leather cuffs hit you! (DamageDealt) +Кожаные манжеты бьют по вам! (DamageDealt) +Summons a pair of cuffs which deals DamageDealt chain damage and adds 40 binding. Until the target struggles free, attacking the target disarms them for 3 turns. +Вызывает пару манжет, которые наносят DamageDealt цепного урона и добавляют 40 единиц сковывания. Пока цель не освободится, атаки по ней обезоруживают её на 3 хода. +You conjure leather cuffs! +Вы призываете кожаные манжеты! +The cuffs will appear next to you and fly toward the target point. +Манжеты появляются рядом с вами и летят к намеченной точке. +Conjure Blindfold +Сотворение повязки на глаза +Conjured Blindfold +Созданная повязка на глаза +The blindfold wraps around your head and buckles tightly! +Повязка на глаза плотно оборачивается вокруг вашей головы! +The blindfold hits you! (DamageDealt) +Повязка на глаза ударяет по вам! (DamageDealt) +Summons a blindfold which deals DamageDealt chain damage and blinds for 20 turns. +40 binding if target is not blinded. +Призывает повязку на глаза, наносящую DamageDealt цепного урона и ослепляющую на 20 ходов. +40 сковывания, если цель не ослеплена. +You conjure a blindfold! +Вы призываете повязку на глаза! +The blindfold will appear next to you and fly toward the target point. +Повязка на глазах появляется рядом с вами и летит к намеченной точке. +Conjure Cuffs +Сотворение манжет +Conjured Cuffs +Созданные манжеты +The cuffs pull your wrists together and click tightly! +Манжеты плотно стягивают ваши запястья вместе и защелкиваются! +The cuffs hit you! (DamageDealt) +Манжеты ударяют по вам! (DamageDealt) +Summons a pair of cuffs which deals DamageDealt chain damage and disarms for 5 turns. +40 binding if target is not disarmed. +Призывает пару манжет, которые наносят DamageDealt цепного урона и обезоруживают на 5 ходов. +40 сковывания если цель не обезоружена. +You conjure a pair of cuffs! +Вы призываете пару манжет! +The cuffs will appear next to you and fly toward the target point. +Манжеты появляются рядом с вами и летят к намеченной точке. +Conjure Gag +Сотворение кляпа +Conjured Gag +Сотворенный кляп +The gag forces itself into your mouth and buckles tightly! +Кляп сам залетает вам в рот и плотно застегивается! +The gag hits you! (DamageDealt) +В вас попадает кляп! (DamageDealt) +Summons a gag which deals DamageDealt chain damage and silences for 8 turns. +40 binding if target is not silenced. +Вызывает кляп, который наносит DamageDealt цепного урона, и накладывает немоту на 8 ходов. Сковывание +40, если цель не находится под немотой. +You conjure a gag! +Вы сотворяете кляп! +The gag will appear next to you and fly toward the target point. +Кляп появится рядом с вами и полетит к намеченной точке. +Conjure Anti-Magic Gag +Сотворение анти-магического кляпа +Conjured Anti-Magic Gag +Сотворенный анти-магический кляп +The anti-magic gag forces itself into your mouth and buckles tightly! +Антимагический кляп самостоятельно врывается вам в рот и туго застегивается! +The anti-magic gag hits you! (DamageDealt) +В вас попадает ани-магический кляп! (DamageDealt) +Summons a magic-absorbing gag which deals DamageDealt teasing arcane damage and silences for 15 turns. Applies a debuff that increases miscast chance by 50%. +Вызывает поглощающий магию кляп, который наносит DamageDealt дразнящего урона арканой, и накладывает немоту на 15 ходов. Накладывает дебафф, увеличивающий вероятность осечки на 50%. +You conjure an anti-magic gag! +Вы сотворяете анти-магический кляп! +The gag will appear next to you and fly toward the target point. +Кляп появится рядом с вами и полетит к намеченной точке. +Conjure Armbinder +Сотворение армбиндера +Conjured Armbinder +Созданный армбиндер +The armbinder slips itself around your arms and buckles itself tightly! +Армбиндер самостоятельно обхватывает ваши руки и плотно застегивается! +The armbinder hits you! (DamageDealt) +В вас попадает армбиндер! (DamageDealt) +Summons an armbinder which deals DamageDealt chain damage and disarms for 13 turns. Cannot be blocked. +Призывает армбиндер, который наносит DamageDealt цепного урона и обезоруживает на 13 ходов. Не может быть блокирован. +You conjure a armbinder! +Вы вызываете армбиндер! +The armbinder will appear next to you and fly toward the target point. +Армбиндер появится рядом с вами и полетит к намеченной точке. +Conjure Legbinder +Сотворение легбиндера +Conjured Legbinder +Созданный легбиндер +The legbinder slips itself around your legs and buckles itself tightly! +Легбиндер плотно обхватывает ваши ноги и самостоятельно затегивается! +The legbinder hits you! (DamageDealt) +В вас попадает легбиндер! (DamageDealt) +Summons a legbinder which deals DamageDealt chain damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. +Призывает легбиндер, который наносит DamageDealt цепного урона и стреноживает на 10 ходов. +50 сковывания если цель не стреножена. Не может быть заблокирован. +You conjure a legbinder! +Вы призываете легбиндер! +The legbinder will appear next to you and fly toward the target point. +Легбиндер появляется рядом с вами и летит к намеченной точке. +Conjure Latex Gag +Сотворение латексного кляпа +Conjured Latex Gag +Сотворенный латексный кляп +Latex Gag +Латексный кляп +Latex Glob +Латексный шарик +The gag forces itself into your mouth and snaps on tightly! +Кляп вонзается вам в рот и туго защелкивается! +The gag forces itself into your mouth and snaps on tightly! +Кляп вонзается вам в рот и туго защелкивается! +The amorphous rubber stretches out into a restraint on your body! +Бесформенная резина растягивается, образуя ограничитель на вашем теле! +The gag hits you! (DamageDealt) +В вас попадает кляп! (DamageDealt) +The gag hits you! (DamageDealt) +В вас попадает кляп! (DamageDealt) +The amorphous rubber sticks to you! (DamageDealt) +Бесформенная резина прилипает к вам! (DamageDealt) +Summons a gag which deals DamageDealt glue damage and silences for 15 turns. +40 binding if target is not silenced. +Призывает кляп, который наносит DamageDealt урона слизью и накладывает немоту на 15 ходов. +40 сковывания, если цель не была нема. +You conjure a gag! +Вы вызываете кляп кляп! +The gag will appear next to you and fly toward the target point. +Кляп появится рядом с вами и полетит к намеченной точке. +Conjure Latex Armbinder +Сотворение латексного армбиндера +Conjured Latex Armbinder +Сотворенный латексный армбиндер +Latex Armbinder +Латексный армбиндер +The armbinder slips itself around your arms and buckles itself tightly! +Армбиндер самостоятельно обхватывает ваши руки и плотно застегивается! +The armbinder hits you! (DamageDealt) +В вас попадает армбиндер! (DamageDealt) +The armbinder slips itself around your arms and snaps on tightly! +Армбиндер обхватывает ваши руки и туго защелкивается! +The armbinder hits you! (DamageDealt) +В вас попадает армбиндер! (DamageDealt) +Summons an armbinder which deals DamageDealt glue damage and disarms for 13 turns. Cannot be blocked. +Призывает армбиндер, который наносит DamageDealt урона слизью и обезоруживает на 13 ходов. Не может быть блокирован. +You conjure a armbinder! +Вы вызываете армбиндер! +The armbinder will appear next to you and fly toward the target point. +Армбиндер появится рядом с вами и полетит к намеченной точке. +Conjure Latex Legbinder +Сотворение латексного легбиндера +Conjured Latex Legbinder +Сотворенный латексный легбиндер +Latex Legbinder +Латексный легбиндер +The legbinder slips itself around your legs and buckles itself tightly! +Легбиндер плотно обхватывает ваши ноги и самостоятельно затегивается! +The legbinder hits you! (DamageDealt) +В вас попадает легбиндер! (DamageDealt) +The legbinder slips itself around your legs and snaps on tightly! +Легбиндер обхватывает ваши ноги и туго защелкивается! +The legbinder hits you! (DamageDealt) +В вас попадает легбиндер! (DamageDealt) +Summons a legbinder which deals DamageDealt glue damage and snares for 10 turns. +50 binding if target is not snared. Cannot be blocked. +Призывает легбиндер, который наносит DamageDealt урона слизью и стреноживает на 10 ходов. +50 сковывания, если цель не была стреножена. Не может быть блокирован. +You conjure a legbinder! +Вы призываете легбиндер! +The legbinder will appear next to you and fly toward the target point. +Легбиндер появляется рядом с вами и летит к намеченной точке. +Conjure Straitjacket +Сотворение смирительной рубашки +Conjured Straitjacket +Созданная симрительная рубашка +The straitjacket slips itself around your body and pulls your arms into its sleeves! +Смирительная рубашка самостоятельно оборачивается вокруг вашего тела и втягивает руки в рукава! +The straitjacket hits you! (DamageDealt) +Смирительная рубашка ударяет вас! (DamageDealt) +Summons a straitjacket which adds DamageDealt binding and reduces struggle speed for 14 turns. Cannot be blocked. +Призывает смирительную рубашку, которая добавляет DamageDealt сковывания и снижает скорость борьбы на 14 ходов. Не может быть блокирована. +You conjure a straitjacket! +Вы призываете смирительную рубашку! +The straitjacket will appear next to you and fly toward the target point. +Смирительная рубашка появляется рядом с вами и летит к намеченной точке. +Conjure Harness +Сотворение упряжи +Conjured Harness +Созданная упряжь +The harness slips itself around your torso and squeezes tightly as each buckle secures itself one by one! +Упряжь обхватывает ваше тело и плотно сжимается! Пряжки самостоятельно застегиваются одна за другой! +The harness hits you! (DamageDealt) +Вас ударяет упряжь! (DamageDealt) +Summons a harness which deals DamageDealt chain damage. Adds +50 binding per 25% binding level on target, up to +200. +Призывает упряжь, наносящую DamageDealt цепного урона. Добавляет +50 сковывания за каждые 25% уровня сковывания цели, вплоть до +200. +You conjure a harness! +Вы призываете упряжь! +The harness will appear next to you and fly toward the target point. +Упряжь появляется рядом с вами и летит к намеченной точке. +Firecracker +Фейерверк +A small delayed explosion that deals DamageDealt fire damage. +Небольшой замедленный взрыв, наносящий DamageDealt урона огнем. +You shout an incendiary retort! +Вы выкрикиваете зажигательную реплику! +Choose AoE location +Выберите местоположение AoE +Feather Burst +Буйство Перьев +After a brief delay, a small cloud of feathers tickles enemies for DamageDealt damage and +60 distraction for 3 turns. +После небольшой задержки маленькое облачко перьев щекочет врагов, нанося DamageDealt урона и добавляя +60 к возбуждению на 3 хода. +You conjure a burst of frenetic feathers! +Вы призываете стаю бешеных перьев! +Choose AoE location +Выберите местоположение AoE +Tickle Cloud +Зона щекотки +For 10 turns, disembodied hands tickle a target location for DamageDealt tickle damage. +В течение 10 ходов бестелесные руки щекочут выбранную локацию, наносят DamageDealt урона от щекотки. +A swarm of hands holding feathers appears! +Появляется лес рук, держащих перья! +Choose location +Выберите местоположение +Frustrated Pet +Неудовлетворённый питомец +The pet collapses in frustration. +Питомец падает в обморок от невозможности получить удовлетворение. +Mana Pet +Мана-питомец +The enemy steals your pet from you! +Враг крадет у вас вашего питомца! +Display Doll +Демонстрационная кукла +The enemy steals your doll from you! +Враг крадет у вас вашу куклу! +Conjure Petsuit +Сотворение петсьюта +Target only Helpless enemies. Transforms them into a pet that follows you and increases your passive mana recovery from mana pool. +Можно применить только на беспомощных врагов. Превращает их в питомцев, которые следуют за вами и увеличивают ваше пассивное восстановление маны из резерва маны. +You conjure an enchanted petsuit which wraps around your target, forcing her to follow you! +Вы призываете магический костюм домашнего животного, который оборачивается вокруг вашей цели, заставляя ее следовать за вами! +You watch in horror as your own creation lunges toward you, binding your hands and feet! +Вы в ужасе наблюдаете, как ваше собственное творение бросается на вас, связывая вас по рукам и ногам! +Choose a helpless target +Выберите беспомощную цель +Conjure Display Stand +Сотворение выставочного стенда +Target only Helpless enemies. Creates a fixture that increases passive mana recovery from mana pool, restores 50 Charge, and makes nearby enemies take 50% more charm/psychic damage. +Можно активировать только на беспомощных врагов. Создает приспособление, которое увеличивает пассивное восстановление маны из резерва маны, восстанавливает 50 Заряда и заставляет ближайших врагов получать на 50% больше психического урона и урона от очарования. +You conjure a fixture to hold your helpless target in place! +Вы создаете приспособление, удерживающее беспомощную цель на месте! +You watch in horror as your own creation encircles you, locking you in place with a hefty click! +Вы в ужасе наблюдаете, как ваше собственное творение сковывает вас, фиксируя на месте с громким щелчком! +Choose a helpless target +Выберите беспомощную цель +Lesser Flash +Малая вспышка +Flash Bomb +Световая бомба +Smoke Bomb +Дымовая бомба +Sparkles! +Ярко! +Mirror Image +Зеркальное отражение +A flash of light which renders anyone caught within blind for 7 turns +Вспышка света, которая делает любого, оказавшегося внутри, слепым на 7 ходов +You charge up a bright flash! +Вы заряжаете яркую вспышку! +Select where to center the flash (SpellArea radius) +Выберите, где применить вспышку (SpellArea радиус) +Ring +Кольцо +A loud noise which stuns for Duration turns and attracts enemies to it. Long-ranged with a 3 turn delay. +Громкий шум, который оглушает на Duration ходов, и привлекает к себе врагов. Увеличенная дальность с задержкой в 3 хода. +You point and a noise emanates from the location! +Вы указываете пальцем, и из этого места разносится шум! +Select where to center the noise (SpellArea radius) +Выберите, где вызвать шум (SpellArea радиус) +Holy Blaze +Святое пламя +Call down a 3x3 area of DamageDealt holy damage. Blinds enemies for 3 turns (and also yourself). +Создает область 3х3, в которой наносит DamageDealt урона светом. Ослепляет врагов на 3 хода (а также вас самих). +You summon a divine aura! +Вы призываете божественную ауру! +Select where to center the blast (SpellArea radius) +Выберите, где сосредоточить удар (радиус SpellArea) +Greater Flash +Большая вспышка +A massive flash of light which renders anyone caught within blind for 16 turns and stuns briefly. +Яркая вспышка света, которая делает любого, оказавшегося внутри, слепым на 16 ходов и ненадолго оглушает. +You charge up a bright flash! +Вы заряжаете яркую вспышку! +Select where to center the flash (SpellArea radius) +Выберите, где применить вспышку (SpellArea радиус) +Focused Flash +Сфокусированная вспышка +Select where to center the flash (SpellArea radius) +Выберите, где применить вспышку (SpellArea радиус) +A focused flash of light which renders anyone caught within blind for 30 turns and stuns for Duration turns. +Сфокусированная вспышка света, которая делает любого, оказавшегося внутри, слепым на 30 ходов и оглушает на Duration ходов. +You slowly charge up a powerful flash! +Вы медленно заряжаете мощную вспышку! +Shroud +Покров +Smoke Bomb +Дымовая бомба +Sleep Gas +Усыпляющий газ +Select where to center the shroud (SpellArea radius) +Выберите, где применить покров (SpellArea радиус) +Creates a cloud for Duration turns that buffs evasion for all creatures. You are temporarily invisible for 8 turns after leaving. +Создает облако на Duration ходов, которое увеличивает уклонение для всех существ. Вы временно невидимы в течение 8 ходов после выхода. +You exhale a misty shroud +Вы выдыхаете туманную пелену +Invisibility +Невидимость +Select which creature to buff +Выберите, какое существо нужно усилить +Make the targeted creature invisible, increasing stealth for Duration turns +Делает целевое существо невидимым, увеличивая скрытность на Duration ходов. +You snap your fingers! +Вы щелкаете пальцами! +CMD: Lock +Команд.Закл: Блокировка +Select which creature to lock +Выберите, к какому существу применить блокировку +Magically locks down a target, preventing them from struggling below the current level of binding until freed by an enemy spellcaster (max 100% binding). +Магически блокирует цель, не позволяя ей бороться ниже текущего уровня скованности, пока ее не освободит вражеский заклинатель (максимальная скованность 100%). +You say a command word, and magical locks bind your target! +Вы произносите командное слово, и магические замки сковывают вашу цель! +Chastity +Целомудрие +Select which creature to lock in a belt +Выберите существу для запирания в поясе. +Target a creature that's disabled. Adds +DamageDealt binding, and applies Chastity which prevents the target from removing plugs/toys, and distracts constantly. +Применяется на существо, которое выведено из строя. Добавляет +DamageDealt Сковывания, и применяет Целомудрие, которое не позволяет цели вынимать пробки/игрушки и постоянно возбуждает. +You conjure a chastity belt, which latches onto your target! +Вы вызываете пояс целомудрия, который защелкивается на вашей цели! +Your own spell locks you in chastity! +Ваше собственное заклинание запирает вас в поясе целомудрия! +Something fun enters your body... +Что-то веселое проникает в ваше тело... +Zone of Purity +Зона чистоты +Select an area +Выберите область +Creates an area which applies Chastity constantly to any enemy over with any amount of binding that steps inside. +Создает область, которая постоянно применяет Целомудрие к любому врагу с любым количеством сковывания, которое проникает внутрь. +You conjure a realm of absolute purity. +Вы создаете царство абсолютной чистоты. +Zone of Excitement +Зона возбуждения +Select an area +Выберите область +Creates an area which adds a conjured vibrating toy to enemies that step inside. Toy lasts 30 turns. +Создает область, которая добавляет заколдованную вибрирующую игрушку врагам, которые заходят внутрь. Игрушка существует 30 ходов. +You conjure a realm of absolute fun! +Вы создаете царство абсолютного веселья! +CMD: Capture +Команд.Закл: Захват +Select which creature to bind +Выберите существо для сковывания +Commands nearby restraints to bind a target, dealing DamageDealt chain damage, +50 binding. Ropes snare 3 turns/rope, belts +20 binding/belt, chains deal +15 crush dmg/chain. +Приказывает ближайшим ограничителям связать цель, нанося DamageDealt цепного урона, и добавляя +50 скованности. Веревки затягиваются на 3 хода/верёвка, ремни добавляют +20 скованности/ремень, цепи наносят +15 дробящего урона/цепь. +You say a command word, and the bindings on the ground do your bidding! +Вы произносите командное слово, и ограничители на земле выполняют ваш приказ! +CMD: Disenchant +Команд.Закл: Рассеивание +Select an area +Выберите область +Target a large area. Permanently slows constructs, reduces attack speed by 50%, and deals 30 shadow damage. Refunds 50% mana at 3 or more targets. Cast on self to disenchant bindings. +Действует в большой зоне. Постоянно замедляет конструкты, снижает скорость атаки на 50% и наносит 30 единиц урона тьмой. Возвращает 50% маны при поражении 3 или более целей. Наложите заклинание на себя, чтобы снять чары с ограничителей. +You say a command word, siphoning the magic from nearby constructs! +Вы произносите командное слово, высасывая магию из близлежащих конструктов! +CMD: Vibrate +Команд.Закл: Вибрация +Select an area +Выберите область +Target a large area. Enemies with plugs or toys are teased for Duration turns, taking charm damage each turn. +Действует в большой зоне. Врагов с пробками или игрушками дразнят в течение Duration ходов, нанося им урон Очарованием каждый ход. +You say a command word, causing all toys in the area to vibrate! +Вы произносите командное слово, заставляя вибрировать все игрушки в округе! +CMD: Explosive Finish +Команд.Закл: Кульминационный взрыв +Explosive Finish +Кульминационный взрыв +Select an area +Выберите область +Target a large area. Consumes enemy distraction to deal up to DamageDealt charm damage, twice if at 90% distraction or more. +Действует в большой зоне. Поглощает Возбуждение врагов, нанося DamageDealt урона Очарованием, удваивается если возбуждение больше 90%. +You say a command word, resulting in a surge of energy entering your targets! +Вы произносите командное слово, в результате чего поток энергии проникает в ваши цели! +CMD: Release +Команд.Закл: Освобождение +Select an area +Выберите область +Target bound (but unlocked) targets in a 3x3 area, reducing binding by 100. Removes unlocked restraints on player that are removable. +Поражает связанные (но не заблокированные) цели в зоне 3x3, уменьшая скованность на 100. Удаляет разблокированные удерживающие устройства на игроке, которые являются съемными. +You say a command word, causing restraints to loosen! +Вы произносите командное слово, в результате чего ограничители ослабевают! +You say a command word, but your restraints remain tight! +Вы произносите командное слово, но ваши ограничители остаются затянутыми! +Remove Slime +Удалить слизь +Select a creature or yourself +Выберите существо или себя +Remove Slime and Encasement from target creatures in an area. Also removes slime from self. +Удаляет слизь и Оболочку с целевых существ в определенной области. Также удаляет слизь с вас. +You issue a command to the slime! +Вы отдаете команду слизи! +You whisper a command word, but the slime is already hardened and won't budge... +Вы шепчете командное слово, но слизь уже затвердела и не поддается... +Binding Vines +Связывающие лозы +Binding Ropes +Связывающие веревки +Binding Chains +Сковывающие цепи +Binding Belts +Сковывающие ремни +Vines rise from the ground and squeeze you! +Лозы поднимаются из земли и опутываются вокруг вас! +Ropes encircle your body and tighten! +Веревки обхватывают ваше тело и затягиваются! +Chains wrap around you! +Цепи обвиваются вокруг вас! +A web of belts buckles in place around your body! +Паутина ремней туго застегивается вокруг вашего тела! +Vines rise from the ground and squeeze you! (DamageDealt) +Лозы поднимаются из земли и сжимают вас! (DamageDealt) +Ropes encircle your body and tighten! (DamageDealt) +Веревки обхватывают ваше тело и затягиваются! (DamageDealt) +Chains wrap around you! (DamageDealt) +Цепи обвиваются вокруг вас! (DamageDealt) +A web of belts buckles in place around your body! (DamageDealt) +Паутина ремней туго застегивается вокруг вашего тела! (DamageDealt) +Awaken +Пробуждение +Awaken +Пробуждение +The slime awakens and turns on you!!! +Слизь пробуждается и нападает на вас!!! +Select area to awaken +Выберите область для пробуждения +Activates the slime in an area, causing it to deal 25 glue damage. Encases fully bound targets. +Активирует слизь в определенной области, заставляя её нанести 25 урона Слизью. Заключает в Оболочку полностью скованные цели. +You command the slime to draw in targets! +Вы приказываете слизи атаковать цели! +CMD: Bind +Команд.Закл: Сковать +Select area to bind +Выберите зону для сковывания +Commands nearby restraints to bind targets standing on them. Rope: 30 chain dmg/5 turn snare. Chain: 30 crush dmg/8 turn disarm. Belts: 50 binding/3 turns vulnerability. +Приказывает ближайшим ограничителям сковывать цели, стоящие на них. Верёвка: 30 цепного урона/5 ходов стреноживание. Цепи: 30 дробящего урона/8 ходов без оружия. Ремни: 50 скованности/3 хода беспомощности. +You say a command word, and the bindings on the ground do your bidding! +Вы произносите командное слово, и ограничители на земле выполняют ваш приказ! +CMD: Unlock +Команд.Закл: Разблокировка +Select which creature to unlock +Выберите, какое существо нужно разблокировать +On yourself: Removes one purple (magical) lock. On a creature: Reduces the target's binding by 20 points. +На себя: Удаляет один фиолетовый (магический) замок. На существ: Уменьшает Сковывание цели на 20 единиц. +You speak a command word! +Вы произносите командное слово! +None of the locks you are wearing respond to your magic. +Ни один из замков, которые вы носите, не поддается вашей магии. +You can't help her with this. +Вы не можете помочь ей этим. +You must target yourself, an enemy, or a locked object. +Вы должны нацелиться на себя, врага или заблокированный объект. +The command is intricate and you are unable to enunciate it properly! +Команда сложная, и вы не в состоянии произнести ее должным образом! +CMD: Greater Unlock +Ком.зак: Великая разблокировка +Select which creature to unlock +Выберите, какое существо нужно разблокировать +On yourself: Removes all purple (magical) locks. On a creature: Reduces the target's binding by 100 points. +На себя: Удаляет все фиолетовые (магические) замки. На существ: Уменьшает Сковывание цели на 100 единиц. +You speak a powerful command word! +Вы произносите мощное командное заклинание! +Lesser Invisibility +Малая невидимость +Select which creature to buff +Выберите, какое существо нужно усилить +Make the targeted creature invisible, increasing stealth for Duration turns +Делает целевое существо невидимым, увеличивая скрытность на Duration ходов. +You become semitransparent! +Вы становитесь полупрозрачными! +Camouflage +Камуфляж +Select yourself +Выберите себя +Enemies have a harder time noticing you for Duration turns. Cancels if you move (unless you are near a wall), cast, or sleep. +Врагам труднее заметить вас в течение Duration ходов. Отменяется, если вы перемещаетесь (если только вы не рядом со стеной), применяете заклинание или спите. +You pose in a clandestine manner. +Вы застываете на месте и маскируетесь. +Darkblade +Темный клинок +Select which creature to buff +Выберите, какое существо нужно усилить +Make the targeted creature (or self) gain +20 damage for Duration turns or 5 attacks, whichever is lower. +Делает так, что целевое существо (или вы сами) получает +20 урона на Duration ходов или 5 атак. +You call forth dark runes on your weapon and arms! +Вы вызываете темные руны на своем оружии и кистях рук! +Heal +Исцеление +Select which creature to heal +Выберите, какое существо нужно исцелить +Restore 45 hitpoints to an allied creature. +Восстановите 45 HP союзному существу. +You utter a word of healing. +Вы произносите заклинание исцеления. +Flame Blade +Огненный клинок +When enabled: Melee weapon attacks cost mana and create a flame strike that deals 30 fire damage to adjacent targets. +Когда включено: Атаки оружием ближнего боя потребляют ману и создают огненный удар, который наносит 30 единиц урона от огня соседним целям. +Flame Blade +Огненный клинок +Tentacle Slap +Удар щупальцем +You have the power to make tentacles out of slime when you attack. When enabled: Your attacks deal +10 glue damage and create slime. 150% bind efficiency. +При атаке у вас есть возможность делать щупальца из слизи. Когда активировано: Ваши атаки наносят +10 урона Слизью и создают слизь. 150% эффективность сковывания. +Chain Strike +Цепной удар +You have the power to summon chains when you attack. When enabled: Your attacks deal +10 chain damage and create chains. 125% bind efficiency. +У вас есть возможность призвать цепи при атаке. Когда включено: Ваши атаки наносят +10 цепного урона и создают цепи. 125% эффективность сковывания. +Ropework +Верёвочное плетение +You have the power to weave ropes between your attacks. When enabled: Your attacks deal +10 chain damage and create ropes. 400% bind efficiency. +У вас есть возможность плести веревки между вашими атаками. Когда включено: Ваши атаки наносят +10 цепного урона и создают веревки. 400% эффективность сковывания. +Leather Whip +Кожаный хлыст +You have the power to strike with conjured belts when you attack. When enabled: Your attacks deal +10 pain damage and create belts. 250% bind efficiency. +При атаке у вас есть возможность наносить удары сотворенными ремнями. Когда активировано: Ваши атаки наносят +10 урона болью и создают ремни. 250% эффективность сковывания. +Super Strength +Сверхсила +When enabled: Struggling is more powerful, and your melee attack damage is increased by +20 if your weapon deals physical damage. +Когда включено: Борьба становится более эффективной, и урон от ваших атак в ближнем бою увеличивается на +20, если ваше оружие наносит физический урон. +Your body glows with magical energy! +Ваше тело светится волшебной энергией! +Enhance Will +Укрепление воли +When enabled: Miscast chance is halved +Когда включено: Шанс осечки уменьшается вдвое +You focus intently! +Вы сосредотачиваетесь! +Truesight +Истинное зрение +When enabled: Drain mana every turn to see through walls and increase accuracy by 40%. +Когда включено: Расходуйте ману каждый ход, чтобы видеть сквозь стены и повысить меткость на 40%. +Echolocation +Эхолокация +Close your eyes to dramatically improve your hearing and locate enemies through walls. +Закройте глаза, чтобы значительно улучшить свой слух и обнаруживать врагов сквозь стены. +Light +Свет +Produce a bright light for Duration turns. Has no effect in dark rooms. +Создаёт яркий свет на Duration ходов. Не оказывает никакого эффекта в помещениях с тьмой. +Levitate +Левитация +When enabled and above 0 stamina: Drain 5 mana per step to reduce slow level by 1 (if above 1), or 20 mana to ignore a temporary slow effect. +При включении и выносливости выше 0: Расходуйте 5 маны за шаг, чтобы снизить уровень замедления на 1 (если выше 1), или 20 маны, чтобы игнорировать временный эффект замедления. +You levitate over the trap! +Вы парите над ловушкой! +You snag a tripwire while floating! +Вы зацепились за растяжку во время левитации! +You levitate forward despite being slowed! +Вы левитируете вперед, несмотря на то, что вас замедляют! +You hover with reduced effect from bindings. +Вы парите, уменьшая эффективность оков. +Iron Blood +Железная кровь +Select yourself +Выберите себя +Channel 4 turns: Halves SP cost of melee attacks by 50%, but increases MP cost of spells by 25%. Ends on sleep or recast. +Применяется за 4 хода: Уменьшают стоимость SP атак ближнего боя на 50%, но увеличивают стоимость MP заклинаний на 25%. Отключается после сна или повторного применения. +Your skin glows a pale red! +Ваша кожа становится бледно-красной! +Stone Skin +Каменная кожа +Select which creature to buff +Выберите, какое существо нужно усилить +Make the targeted creature (or yourself) gain +20 armor for Duration turns +Добавляет целевому существу (или вам) +20 к броне на Duration ходов +Your skin takes on the appearance of cracked earth! +Ваша кожа приобретает вид потрескавшейся земли! +The EnemyName gains increased physical armor! +EnemyName получает увеличение физической брони! +The EnemyName buffs the physical armor of her allies! +EnemyName усиливает физическую броню своих союзников! +The EnemyName deploys an energy shield to allies! +EnemyName накладывает энергетический щит на союзников! +The EnemyName activates the vibrators of nearby wolfgirls, greatly motivating them! +EnemyName активирует вибраторы ближайших девушек-волчиц, мотивируя их! +The EnemyName activates the vibrators of nearby dolls, greatly motivating them! +EnemyName активирует вибраторы ближайших кукол, мотивируя их! +The EnemyName creates a zone of increased defense! +EnemyName создает зону повышенной защиты! +EnemyName uses a charm to buff an enemy's Magic Armor and Evasion! +EnemyName использует амулет для усиления магической брони и уклонения противников! +EnemyName supports a witch with a magical shield! +EnemyName поддерживает ведьму магическим щитом! +Shield the Witch! +Защитить Ведьму! +EnemyName uses a glowing talisman to buff an undead's physical armor and speed! +EnemyName использует светящийся талисман, чтобы усилить физическую броню и скорость нежити! +You create a zone of increased defense! +Вы создаете зону повышенной защиты! +You create a protective zone! +Вы создаете защитную зону! +You create a fan of icicles! +Вы создаете веер из сосулек! +Wall +Стена +Select where to put the wall (cannot place on occupied squares) +Выберите, где разместить стену (нельзя разместить на занятых площадях) +Create a stationary wall for Duration turns. It takes 20% damage from spells. Cast on an open door to close it and give it additional armor. +Создайте неподвижную стену на Duration ходов. Она получает 20% урона от заклинаний. Наложите заклинание на открытую дверь, чтобы закрыть ее и усилить её дополнительной броней. +A wall starts to form! +Стена начинает формирование! +You create a line on the ground. +Вы создаете линию на земле. +True Steel +Истинная сталь +Choose a target. +Выберите цель. +A melee strike that deals DamageDealt slash damage, x2.5 against unaware humanoid enemies. +Удар в ближнем бою наносит DamageDealt рубящего урона, x2.5 по ничего не подозревающим врагам-гуманоидам. +You slash with an ethereal blade! +Вы рубите вечным клинком! +Summon Familiar +Призыв фамильяра +Select where to put the familiar (cannot place on occupied squares) +Выберите, куда поместить фамильяра (нельзя разместить на занятых квадратах) +Create a familiar that fights by your side for the rest of the level +Создайте фамильяра, который будет сражаться на вашей стороне до конца уровня. +A familiar appears! +Фамильяр появляется! +You create a circle on the ground with your foot! +Вы создаете круг на земле своей ногой! +Summon Storm Crystal +Призыв штормового кристалла +Select where to put the storm crystal (cannot place on occupied squares) +Выберите, куда поместить штормовой кристалл (нельзя разместить на занятых площадях) +Create a stationary crystal that casts Crackle on nearby targets for Duration turns. Can be healed to extend duration. +Создаёт стационарный кристалл, который использует Треск на близлежащие цели в течение Duration ходов. Может быть исцелён для продления срока службы. +A crackling crystal emerges from the ground! +Из земли появляется потрескивающий кристалл! +You stomp and the ground shakes! +Вы топаете, и земля сотрясается! +Summon Fire Mote +Призыв огненной частицы +Select where to put the fire mote (cannot place on occupied squares) +Выберите, куда поместить огненную частицу (нельзя разместить на занятых площадях) +Create an orb of fire that follows you and attacks using firebolt. +Создаёт огненный шар, который следует за вами и применяет Огненную стрелу. +A flaming spirit answers your call! +Пылающий дух отвечает на ваш зов! +You call upon the plane of Fire! +Вы взываете к измерению Огня! +Summon Earth Mote +Призыв земляной частицы +Select where to put the earth mote (cannot place on occupied squares) +Выберите, куда поместить земляную частицу (нельзя разместить на занятых площадях) +Create an animated stone that attacks using a strong but slow crush attack. +Создайте живой камень, который атакует с помощью сильной, но медленной дробящей атаки. +A rocky spirit rushes forth from the ground! +Скалистый дух вырывается из-под земли! +You call upon the plane of Earth! +Вы взываете к измерению Земли! +Summon Air Mote +Призыв воздушной частицы +Select where to put the air mote (cannot place on occupied squares) +Выберите, куда поместить воздушную частицу (нельзя разместить на занятых площадях) +Create a dusty mote that attacks using gusts of wind. +Создайте пылевой вихрь, которая атакует с помощью порывов ветра. +A dust devil arises in front of you! +Перед вами возникает пылевой элементаль! +You call upon the plane of Air! +Вы взываешь к измерению Воздуха! +Summon Water Mote +Призыв водяной частицы +Select where to put the water mote (cannot place on occupied squares) +Выберите, куда поместить водяную частицу (нельзя разместить на занятых площадях) +Create a watery serpent which stuns enemies with its melee attack. +Создайте водяного змея, который оглушит врагов своими атаками в ближнем бою. +A watery spirit bubbles up from the ground! +Водный дух пузырьками поднимается из-под земли! +You call upon the plane of Water! +Вы взываете к измерению воды! +Summon Shadow Warrior +Призыв теневого воина +Select where to put the shadow warrior (cannot place on occupied squares) +Выберите, куда поместить теневого воина (нельзя разместить на занятых площадях) +Call forth a shadow warrior for 16 turns who deals DamageDealt damage every other turn. +Вызовите теневого воина на 16 ходов, который наносит DamageDealt урона каждый второй ход. +...and the abyss answers! +...и бездна отвечает! +You call... +Вы взываете... +Summon Nature Spirit +Призыв духа природы +Select where to put the nature spirit (cannot place on occupied squares) +Выберите, куда поместить духа природы (нельзя размещать на занятых площадях) +Create a natural spirit that fires vine projectiles and has a healing aura that restores HP to allies and regenerates your stamina. +Создайте духа природы, который стреляет снарядами-лозами и обладает исцеляющей аурой, восстанавливающей здоровье союзников и вашу выносливость. +A healing wisp appears! +Появляется исцеляющий огонек! +You call upon the powers of nature! +Вы взываете к силам природы! +Summon Golem +Призыв голема +Select where to put the golem (cannot place on occupied squares) +Выберите, куда поместить голема (нельзя разместить на занятых площадях) +Create a slow but powerful golem to fight by your side +Создайте медленного, но мощного голема, который будет сражаться на вашей стороне. +A golem arises! +Голем сформировывается! +You stomp your foot and draw the words of life on the floor! +Вы топаете ногой и рисуете слова жизни на полу! +Summon Decoy +Призыв приманки +Select where to create an illusion (cannot place on occupied squares) +Выберите, где создать иллюзию (нельзя разместить на занятых площадях) +Create a decoy for Duration turns. It attracts enemy attention and triggers traps. +Создаёт приманку на Duration ходов. Она привлекает внимание врага и приводит в действие ловушки. +A shadow of yourself materializes! +Материализуется ваша тень! +You create a line on the ground and toss in a lock of your hair! +Вы рисуете линию на земле и подбрасываете прядь своих волос! +Feather Explosion +Взрыв перьев +Elastic Grip +Эластичный захват +A latex hand reaches out and pulls an enemy close to you! Base pull strength: 4 +Латексная рука протягивается вперёд и притягивает врага поближе к вам! Базовая сила тяги: 4 +You extend a rubbery hand and grab a foe! +Вы вытягиваете резиновую руку и хватаете врага! +There's an obstacle in the way! +На пути находится препятствие! +Select a target to pull +Выберите цель для притягивания +Slime Blast +Взрыв слизи +Witch's Slime +Слизь ведьмы +Rubber Explosion +Взрыв резины +Witch's Slime Ball +Ведьмин шар из слизи +Robotic Arm +Робо-рука +A pool of slime deals DamageDealt glue damage to enemies on impact and covers the area in temporary slime. +Лужа слизи при ударе наносит врагам DamageDealt урона Слизью и временно покрывает область слизью. +You conjure a pool of slime! +Вы создаёте лужу слизи! +Select where the slime will appear +Выберите, где появится слизь +Slime Eruption +Извержение слизи +A huge blast of slime deals DamageDealt glue damage to enemies that enter and binds them briefly. +Огромный взрыв слизи, наносящий врагам DamageDealt урона Слизью и ненадолго их сковывающий. +You conjure an explosion of slime! +Вы вызываете взрыв слизи! +Select where the slime will appear +Выберите, где появится слизь +Slime Splash +Всплеск слизи +After one turn, deals DamageDealt glue damage in a small area and spreads slime. +Через один ход наносит DamageDealt урона Слизью на небольшой площади и разбрызгивает слизь. +You conjure a small amount of slime! +Вы создаете небольшое количество слизи! +Select where the slime will appear +Выберите, где появится слизь +Water Ball +Водяной шар +Fast projectile. Deals DamageDealt soap damage. Drenched targets take +35% electric/ice, -42% fire, & conduct 50% of electric damage. +Быстрый снаряд. Наносит DamageDealt смывающего урона. Залитые цели получают +35% урона от электричества/льда, -42% от огня, и конденсируют 50% электрического урона. +You hurl a ball of water! +Вы швыряете водный шар! +Choose aim direction +Прицельтесь, выберите направление +Tidal Sphere +Приливная сфера +Slow moving projectile, deals DamageDealt soap damage to enemies it passes thru. Leaves a large amount of water in its wake. +Медленно движущийся снаряд, наносит DamageDealt смывающего урона врагам, через которых он проходит. Оставляет за собой большое количество воды. +You raise a huge mass of water! +Вы поднимаете огромную массу воды! +Choose aim direction +Прицельтесь, выберите направление +The boulder knocks you to the ground! +Валун сбивает вас с ног! +The water covers you and drenches you! +Вода накрывает вас, и вы насквощь промокаете! +You step in water and become wet. +Вы вступаете в воду и мокните. +Ice Breath +Ледяной бриз +A field of icicles that deals DamageDealt damage on a hit and stuns briefly. +Поле из сосулек, которое наносит DamageDealt урона при попадании и ненадолго оглушает. +You breath out a chilling frost! +Вы призываете леденящий душу мороз! +Select where to put the icicles (SpellArea radius) +Выберите, куда поместить поле сосулек (SpellArea радиус) +The mummy's curse paralyzes you! +Проклятие мумии парализует вас! +Rubber Bullets +Резиновые пули +You are hit by a fusilade of rubber bullets! +В вас попал град резиновых пуль! +The rubber bullets congeal into a slimy material on your body! +Резиновые пули застывают на вашем теле, превращаясь в липкий материал! +Nature Blast +Взрыв природы +Raging Vines +Бушующие лозы +Magic Ribbons +Волшебные ленты +Magic Belts +Волшебные пояса +Slime +Слизь +Slime +Слизь +You project a pool of sticky slime! +Вы создаете лужу липкой слизи! +Arrow of Love +Стрела любви +You loose a glowing arrow! +Вы выпускаете светящуюся стрелу! +Bondage Buster EX +Бондаж-бластер EX +Bondage Buster EX +Бондаж-бластер EX +Blaster +Бластер +You charge up a beam and fire it! +Ты заряжаете бластер и выстреливаете лучом! +You swing your weapon and pull away the target's equipment! +Вы взмахиваете своим оружием и сбиваете снаряжение цели! +You swing Dragonslaver and it lashes out in a whip-like fashion! +Вы замахиваетесь Убийцей драконов, и он хлещет, словно хлыст! +The slime from your staff coats your body, granting you strange powers! +Слизь с вашего посоха покрывает ваше тело, наделяя вас странными способностями! +The power of the four elements flows through your veins! +Сила четырех стихий течет по вашим венам! +An explosion knocks you to the ground! +Взрыв сбивает вас с ног! +Curious Spell +Курьезное заклинание +You have been flummoxed! +Вы были сбиты с толку! +You feel a prick as a small syringe hits you, and you start feeling drowsy... +Вы чувствуете укол, когда в вас попадает маленький шприц, и начинаете чувствовать сонливость... +The thrown cuffs snap shut around your ankles and slow you down!!! +Наброшенные манжеты защелкиваются вокруг ваших лодыжек и замедляют движение!!! +Ribbon Burst +Взрыв лент +Spores +Споры +Noxious Spores +Ядовитые споры +Enticing Spores +Соблазняющие споры +You inhale some spores, and feel a bit sleepy... +Вы вдыхаете какие-то споры и чувствуете себя немного сонным... +The spores make you feel excited! +Споры вызывают у вас возбуждение! +The toxic spores make you feel faint... +Ядовитые споры вызывают у вас слабость... +Magic Hairpin +Волшебная шпилька +The magic hairpin goes for your eyes and forces you to blink! +Волшебная шпилька попадает вам в глаза и заставляет вас моргать! +Ice Storm +Ледяной шторм +Icy Aura +Ледяная аура +Icy Aura +Ледяная аура +Slime Ball +Шар слизи +Witch's Slime Ball +Ведьмин шар из слизи +A ball of slime leaves a trail of sticky slime (20 damage when stepped on). It deals DamageDealt glue damage on a hit. +Шар слизи оставляет за собой след из липкой слизи (20 урона, если на него наступить). Наносит DamageDealt урона Слизью при попадании. +You hurl a ball of slime! +Вы бросаете шар из слизи. +Choose aim direction +Прицельтесь, выберите направление +Summon Skeleton +Призыв скелетов +Mass Summon Skeleton +Массовый призыв скелетов +A skeleton arises from bones on the floor! +Скелет восстаёт из костей на полу! +A gang of SummonCount skeletons forms around you! +Вокруг вас образуется отряд из SummonCount скелетов! +A gang of SummonCount zombies emerges from the floor! +Отряд из SummonCount зомби появляется из-под земли! +A bunch of gags fly out from your satchel! +Связка кляпов вылетает из вашей сумки! +A floating hand appears and cracks its knuckles! +Появляется парящая рука и похрустывает костяшками пальцев! +A floating gag appears and starts flying toward you! +Появляется левитирующий кляп и начинает лететь к вам! +A floating blindfold appears and starts flying toward you! +Появляется левитирующая повязка на глаза и начинает лететь к вам! +A floating yoke appears and starts flying toward you! +Появляется левитирующее ярмо и начинает лететь к вам! +A floating armbinder appears and starts flying toward you! +Появляется левитирующий армбиндер и начинает лететь к вам! +A floating straitjacket appears and starts flying toward you! +Появляется левитирующая смирительная рубашка и начинает лететь к вам! +A floating harness appears and starts flying toward you! +Появляется левитирующая упряжь и начинает лететь к вам! +A set of shackles opens wide and starts going for your wrists! +Набор кандалов широко раскрывается и нацеливается на ваши запястья! +A swarm of shackles approaches you! +К вам приближается рой кандалов! +A swarm of gags approaches you! +К вам приближается рой кляпов! +A cloud of locks and chains clatters as it levitates toward you! +Облако замков и цепей гремит, левитируя к вам! +A huge cloud of locks and chains clatters as it levitates toward you! +Огромное облако замков и цепей гремит, левитируя к вам! +Floating hands appear by the conjurer's side as she points her staff! +Парящие руки появляются рядом с призывательницей, когда она направляет свой посох! +Floating books appear near the caster! +Парящие книги появляются рядом с заклинателем! +Floating books appear near the caster! +Парящие книги появляются рядом с заклинателем! +Floating books appear near the caster! +Парящие книги появляются рядом с заклинателем! +Floating books appear near the caster! +Парящие книги появляются рядом с заклинателем! +Floating books appear near the caster! +Парящие книги появляются рядом с заклинателем! +Dusty tomes appear near the caster! +Пыльные томики появляются рядом с заклинателем! +Magical books appear near the caster! +Магические книги появляются рядом с заклинателем! +Sinister books appear near the caster! +Зловещие книги появляются рядом с заклинателем! +Crackling books appear near the caster! +Рядом с заклинателем появляются потрескивающие книги! +Glowing books appear near the caster! +Рядом с заклинателем появляются светящиеся книги! +Rubber-stained books appear near the caster! +Рядом с заклинателем появляются книги в резиновых пятнах! +Flaming books appear near the caster! +Пылающие книги появляются рядом с заклинателем! +Frigid books appear near the caster! +Ледяные книги появляются рядом с заклинателем! +Devilish books appear near the caster! +Дьявольские книги появляются рядом с заклинателем! +A floating book appears near the caster! +Рядом с заклинателем появляется парящая книга! +A floating book appears near the caster! +Рядом с заклинателем появляется парящая книга! +A floating book appears near the caster! +Рядом с заклинателем появляется парящая книга! +A floating book appears near the caster! +Рядом с заклинателем появляется парящая книга! +A dusty tome appears near the caster! +Рядом с заклинателем появляется пыльный фолиант! +A magical book appears near the caster! +Рядом с заклинателем появляется магическая книга! +A sinister book appears near the caster! +Рядом с заклинателем появляется зловещая книга! +A crackling book appears near the caster! +Рядом с заклинателем появляется потрескивающая книга! +A glowing book appears near the caster! +Рядом с заклинателем появляется светящаяся книга! +A rubber-stained book appears near the caster! +Рядом с заклинателем появляется книга в резиновых пятнах! +A flaming book appears near the caster! +Рядом с заклинателем появляется пылающая книга! +A frigid book appears near the caster! +Рядом с заклинателем появляется ледяная книга! +A devilish book appears near the caster! +Рядом с заклинателем появляется дьявольская книга! +Your struggling leaves you aroused because of the RestraintName... +Из-за RestraintName вы остаетесь возбужденной после борьбы... +You feel your restraints squeeze you and tingle with painful sensations! +Вы чувствуете, как ваши ограничители сжимают вас, создавая пощипывающие болезненные ощущения! +'Do not resist,' whispers a voice in your head... +'Не сопротивляйся,' шепчет голос в вашей голове... +Your restraints squeeze you painfully without mercy! +Ваши оковы безжалостно сжимают вас до боли! +The crystals emit a powerful energy! +Кристаллы излучают мощную энергию! +You feel your body overflow with energy... +Вы чувствуете, как ваше тело переполняется энергией... +The crystals react to your struggle attempts with a strange energy! +Кристаллы реагируют на ваши попытки борьбы странной энергией! +Cast Spell (XXX turn delay) +Произнести заклинание (задержка хода XXX) +You feel the vibrations leaving your body... +Вы чувствуете, как вибрации оставляют ваше тело... +You feel your toys start to buzz... +Вы чувствуете, что ваши игрушки начинают жужжать... +You your toys continue to buzz... +Ваши игрушки продолжают жужжать... +The EnemyName remotely causes your toys to buzz!!! +EnemyName дистанционно заставляет ваши игрушки жужжать!!! +You feel the plugs inside you while walking. +Вы чувствуете пробки внутри себя во время ходьбы. +Your toys pulse and tingle occasionally. +Ваши игрушки время от времени пульсируют и подрагивают. +Your toys tease you and buzz gently... +Ваши игрушки дразнят вас, тихонько жужжа... +Your vibrating toys are difficult to ignore... +Ваши вибрирующие игрушки трудно игнорировать... +Your toys buzz strongly, making it difficult to concentrate! +Ваши игрушки сильно вибрируют, мешая сосредоточиться! +You tremble as the toys give off intense vibrations! +Вы вздрагиваете, когда игрушки начинают интенсивно вибрировать! +Your toys torture you with intense pulsations! +Ваши игрушки мучают вас интенсивными пульсациями! +Your whole body resonates with the intense stimulation! +Все ваше тело резонирует с интенсивной стимуляцией! +The stimulation is so intense you can hardly breath! +Стимуляция настолько интенсивна, что вы едва можете дышать! +Your toys stop vibrating. +Ваши игрушки перестают вибрировать. +You feel slightly full as you move... +Вы чувствуете легкую наполненность, когда двигаетесь... +Your movement disturbs the plugs inside of you... +Ваше движение беспокоят пробки внутри вас... +The large plugs shift(s) around inside of you... +Большие пробки смещаются внутри вас... +The huge plugs rub(s) around constantly inside of you... +Огромные пробки постоянно трутся о ваши внутренности... +Your movements are hobbled. +Ваши движения скованны. +Your hobbled movement disturbs the plugs inside of you. +Ваше неуклюжее движение беспокоят пробки внутри вас. +The large plugs shift(s) around inside of you from your hobbled movement... +Большие пробки смещаются внутри вас от вашего неуклюжего движения... +The massive plugs rub(s) around inside of you as you hobble forward... +Массивные пробки трутся о вас внутри, когда вы ковыляете вперед... +You hop forward! +Вы прыгаете вперед! +You hop and feel the plugs shifting around inside your body. +Вы подпрыгиваете и чувствуете, как пробки перемещаются внутри вашего тела. +The plugs shift in and out with each hop... +Пробки перемещаются внутрь и наружу с каждым прыжком... +The massive plugs slide in and out sensually as you hop... +Вы четко ощущаете, как массивные пробки скользят внутрь и наружу, когда вы прыгаете... +You crawl forward! +Вы ползете вперед! +You crawl and feel the plugs shifting around inside your body. +Вы ползете и чувствуете, как пробки перемещаются внутри вашего тела. +The plugs shift in and out as you crawl... +Пробки перемещаются внутрь и наружу, когда вы ползете... +The massive plugs slide in and out sensually as you crawl... +Вы четко ощущаете, как массивные пробки скользят внутрь и наружу, когда вы ползете... +You inch forward slowly! +Вы медленно продвигаетесь вперед! +You inch forward, feeling the movement of your plugs. +Вы продвигаетесь на дюйм вперед, чувствуя движение ваших пробок. +You wiggle your hips inching forward, feeling the plugs inside you... +Вы покачиваете бедрами, медленно продвигаясь вперед, чувствуя пробки внутри себя... +You wiggle forward, the massive plugs inside you digging in and out... +ВЫ двигаетесь вперед, и массивные пробки внутри вас входят внутрь и выходят наружу... +You crawl helplessly! +Вы беспомощно ползёте! +You crawl helplessly, feeling the plugs shifting around inside you. +Вы беспомощно ползёте, чувствуя, как внутри вас перемещаются пробки. +You crawl and feel the plugs inside you rub around teasingly... +Вы ползёте и чувствуете, как пробки внутри вас дразняще трутся о ваши внутренности... +You crawl helplessly, tormented by the massive plugs inside you... +Вы беспомощно ползёте, мучимые массивными пробками внутри вас... +You are unable to move! +Вы не можете пошевелиться! +You wriggle uselessly, feeling the plugs shift inside you! +Вы бесполезно извиваетесь, чувствуя, как пробки внутри вас смещаются! +You wriggle uselessly, aroused by the plugs inside you! +Вы бесполезно извиваетесь, возбужденные пробками внутри вас! +You wriggle uselessly, tormented by the massive plugs inside of you! +Вы бесполезно извиваетесь, мучимые массивными пробками внутри вас! +You climb into the grate +Вы пробираетесь через решетку +Mmmph... +Мммфх... +Mmmmmmmmm... +Мммммммм... +Hhmmpphh... +Хммффммм... +Gghhhh!!! +Гфффх!!! +Mmmmmphh!!! +Мммммфхх!!! +Mmm... +Ммм... +MMM!!! +МММ!!! +Mmmmmm. +Мммммм. +Mmmaaaaahhh... +Ммммммхххх... +Mmmmmmmmm~ +Ммммммммм~ +Unnnghhh... +Уумммггх... +Mmmmmmmphhh.. +Ммммммммфх.. +Mmmmmphh~ +Ммммммфх~ +Mmm~ +Ммм~ +Mmmmm~~ +Ммммм~~ +Mmmmmm~~~ +Мммммм~~~ +Mmph... +Ммфх... +Mmmm! +Мммм! +MMM!!! +МММ!!! +Hmmph. +Хммфх. +Mmmm... +Мммм... +Mmmph. +Мммфх. +Mmmmmmph!!! +Ммммммфх!!! +Gmmmmph! +Гммммх! +Hmmmmph~!! +Хммммфх~!! +You are blinded! +Вы ослеплены! +You took DamageTaken damage! +Вы получаете DamageTaken урона! +You get caught in sticky slime! +Вы вязнете в липкой слизи! +You get caught in a sticky slime bubble! +Вы попадаете в пузырь из липкой слизи! +The slime ball sticks to you! +Шар слизи прилипает к вам! +The slime ball sticks to you and slows you! +Шар слизи прилипает к вам и замедляет вас! +You feel a powerful sensation run through your body! +Вы чувствуете, как по вашему телу пробегает ощущение мощи! +You feel a pleasurable sensation run through your body! +Вы чувствуете, как ощущение удовольствия проходит через ваше тело! +Beams of light wrap around your body and feel warm on your skin! +Лучи света окутывают ваше тело и согревают кожу! +Crystals begin to form around your limbs! +Кристаллы начинают формироваться вокруг ваших конечностей! +A magic chain secures itself around your body! +Волшебные цепи оборачиваются вокруг вашего тела! +An animated chain secures itself around your body! +Ожившая цепь обвивается вокруг вашего тела! +A magic rope secures itself around your body! +Волшебная веревка надежно закрепляется, обернувшись вокруг вашего тела! +A magic belt secures itself around your body! +Волшебный пояс надежно закрепляется, обернувшись вокруг вашего тела! +A rope wraps itself around your body! +Веревка обвивается вокруг вашего тела! +A ribbon animates and becomes entwined around you! +Лента оживет и обвивается вокруг вас! +A belt buckles itself tightly around your body! +Ремень туго затягивается на вашем теле! +A vine slithers across your body and tightens! +Лоза скользит по вашему телу и затягивается! +The spell hits you and slows you down! +Заклинание поражает вас и замедляет движение! +Witch's Rope +Ведьмовы веревки +Rope Tendrils +Веревочные завитки +Blessed Wrappings +Благословенные бинты +The Blessing +Благословение +A long tendril emerges from the kraken's body! +Из тела кракена выходит длинный усик! +Coiled ropes spring up from the floor! +Из пола торчат свернутые в спираль веревки! +A long tendril emerges from the kraken's body! +Из тела кракена выходит длинный усик! +Several glowing wrappings emerge! +Появляется несколько светящихся оберток! +A glowing wrapping emerges and starts moving toward you! +Появляются светящиеся бинты и начинают двигаться к вам! +Rope Strike +Верёвочный удар +Animated Vines +Анимированые лозы +Soul-binding Sigil +Сигил связи душ +Elven Arrow +Эльфийская стрела +The elven arrow flashes and wraps you in mithril ropes! +Эльфийская стрела вспыхивает и опутывает вас мифриловыми веревками! +Ropes wrap themselves around your body from all sides! +Веревки обвиваются вокруг вашего тела со всех сторон! +Wrappings appear and wrap you head to toe! +Появляются бинты и укутывает вас с головы до ног! +A spell transforms your wrappings into hexed latex! +Заклинание превращает ваши бинты в заколдованный латекс! +A spell engulfs you in wrappings! +Заклинание окутывает вас бинтами! +Ropes wrap themselves around your body from all sides! +Веревки обвиваются вокруг вашего тела со всех сторон! +Vines sprout around you and grab hold of your limbs! +Лозы прорастают вокруг вас и хватаются за ваши конечности! +Your clothes are stripped and replaced! +Ваша одежда снята и заменена на новую! +Your clothes are stripped and replaced! +Ваша одежда снята и заменена на новую! +Vines tear off your clothes! +Лозы срывают с вас одежду! +Restraints materialize on your body! +Ограничители материализуются на вашем теле! +The orb explodes into a burst of ribbons! +Сфера разлетается на множество лент! +The orb tears off your clothes! +Сфера срывает с вас одежду! +Charm Trap +Ловушка с амулетами +Ribbon Trap +Ленточная ловушка +Shackle Trap +Ловушка с кандалами +Mummy Trap +Ловушка мумий +Rope Trap +Веревочная ловушка +Rope Trap +Веревочная ловушка +Holy Rope Trap +Ловушка освященных верёвок +Belt Trap +Ловушка с ремнями +Cable Trap +Ловушка с тросами +Slime Trap +Ловушка слизи +Chain Trap +Ловушка с цепями +Shadow Latex Trap +Теневая латексная ловушка +Demonic Sigil +Демонический сигил +Unstable Crystals +Нестабильные кристаллы +Gas Trap +Газовая ловушка +Gas Trap +Газовая ловушка +Latex Engulfment +Латексный поглотитель +Latex Engulfment +Латексный поглотитель +Latex Spherification +Латексный сферефикатор +Sleep Dart +Сонный дротик +Sleep Dart +Сонный дротик +A talisman on the floor explodes, sending a cloud of charms flying around you! +Талисман на полу взрывается, и вокруг вас разлетается облако талисманов! +Magical binding ribbons emerge from the walls! +Волшебные бондажные ленты появляются из стен! +The ceiling opens, letting a lot of shackles fall on you! +Потолок открывается, позволяя множеству оков упасть прямиком на вас! +Bands of glowing wrappings start flying in from all sides! +Полосы светящихся бинтов начинают лететь со всех сторон! +Ropes slither out towards you from between the bricks! +Веревки выскальзывают к вам из-под кирпичей! +Ropes fall on you from all sides! +Веревки падают на вас со всех сторон! +A constellation of ropes surrounds you! +Вас окружает плеяда веревок! +Leather restraints start appearing around you! +Вокруг вас начинают появляться кожаные ремни! +high-tech cables come out from the floor! +Высокотехнологичные тросы выползают из пола! +Slimes pours out from the walls and ceiling! +Слизь капает со стен и потолка! +Ethereal chains appear all around you! +Эфирные цепи появляются повсюду вокруг вас! +Shadows constrict around you! +Тени сжимаются вокруг вас! +An otherworldly sigil appears below you! +Под вами появляется сигил потустороннего мира! +Crystals rise up around you! +Вокруг вас поднимаются кристаллы! +Something shiny seems to be stretched out over the floor! +Кажется, что что-то блестящее растянуто на полу! +A rubber bubble starts forming around you! +Вокруг вас начинает образовываться резиновый пузырь! +A rubber ball starts forming around you! +Вокруг вас начинает формироваться резиновый шар! +You hear the sound of glass breaking, and a cloud of pink gas rises around you! +Вы слышите звук бьющегося стекла, и вокруг вас поднимается облако розового газа! +You hear the sound of glass breaking, and a cloud of green gas rises around you! +Вы слышите звук бьющегося стекла, и вокруг вас поднимается облако зеленого газа! +The charms stick themselves all over your body! +Амулеты самостоятельно приклеиваются к вашему телу! +A metal pole catches you from below! +Металлический шест ловит вас снизу! +The ribbons tie themselves tightly around your body and won't let go! +Ленты плотно обвязываются вокруг вашего тела и не собираются вас оптускать! +Shackles close themselves over your limbs! +Кандалы сами собой смыкаются на ваших конечностях! +The wrappings close in over your body! +Бинты плотно облегают ваше тело! +The ropes wrap themselves around your body! +Веревки сами обвиваются вокруг твоего тела! +The ropes wrap themselves tightly around your body! +Веревки плотно обхватывают ваше тело! +The holy ropes secure themselves upon your body! +Священные веревки сами собой завязываются на вашем теле! +The leather restraints attach themselves to your body! +Кожаные ремни сами застёгиваются на вашем теле! +The high-tech cables wrap themselves over your body! +Высокотехнологичные тросы сами обвиваются вокруг вашего тела! +The slime pours all over you! +Слизь обливает вас со всех сторон! +A giant cube of latex engulfs you! +Гигантский куб из латекса поглощает вас! +A giant bubble of latex engulfs you and inflates, sealing you in! +Гигантский пузырь из латекса окутывает вас и надувается, запечатывая внутри! +A giant latex ball swallows you and inflates, sealing around your neck! +Гигантский латексный шар проглатывает вас и надувается, запечатывась вокруг вашей шеи! +A sinister power wraps itself around you and solidifies! +Зловещая сила окутывает вас и затвердевает! +Dark magics swirl around you and solidify into shiny rubber! +Темная магия вихрится вокруг вас и затвердевает в блестящую резину! +Crystals grow and spread across your limbs! +Кристаллы растут и распространяются по вашим конечностям! +The magic chains wrap themselves around your body! +Волшебные цепи сами собой обвиваются вокруг вашего тела! +Your clothes are getting ripped away! +С вас срывают одежду! +You feel a prick as a small dart hits you, and you start feeling drowsy... +Вы чувствуете укол, когда в вас попадает маленький дротик, и начинаете чувствовать сонливость... +You breathe in the gas, and a wave of pleasure hits your whole body. +Вы вдыхаете газ, и волна удовольствия охватывает всё ваше тело. +You breathe in the gas, and feel lethargic... +Вы вдыхаете газ и чувствуете летаргию... +You hear a mechanism trip... +Вы слышите, как срабатывает механизм... +Items +Предметы +Rep +Репутация +Spells +Заклинания +Learn New Spells +Выучить новые заклинания +Click a spell to replace SPELLNAME with. +Щелкните по заклинанию, чтобы заменить его на SPELLNAME. +Empty Slot +Пустой слот +Back to Spellbook +Назад в книгу заклинаний +Return to Game +Вернуться к игре +Return to Game +Вернуться к игре +Known Abilities +Изученные способности +Spell Tree +Древо умений +Elemental Spells +Заклинания стихий +Conjuration Spells +Заклинания сотворения +Illusion Spells +Заклинания иллюзий +Upgrades +Улучшения +Perks +Перки +Perks II +Перки II +Perks III +Перки III +pg. NUM/TOTAL +стр. NUM/TOTAL +### > + +### < + +### >>> + +### <<< + +Spell Points: SPELLPOINTS +Очки способностей: SPELLPOINTS +You need a higher level in SCHOOL magic to learn this spell. +Для изучения этого заклинания вам нужен более высокий уровень в магии 'SCHOOL'. +You need more spell points. +Вам нужно больше очков способностей. +You don't have enough maximum mana to cast this spell! +У вас недостаточно максимальной маны, чтобы произнести это заклинание! +School: +Школа: +Elements +Стихии +Conjuration +Сотворение +Illusion +Иллюзии +Generic +Общее +Upgrade +Апгрейды +Special +Особое +Learn Spell +Выучить заклинание +Spell Points: +Очки способностей: +Level: +Уровень: +Spell Point Cost: +Стоимость в очках способн.: +Mana Cost: +Затраты маны: +Remove Spell 1 +Удалить закл. 1 +Remove Spell 2 +Удалить закл. 2 +Remove Spell 3 +Удалить закл. 3 +Remove Spell 4 +Удалить закл. 4 +Remove Spell 5 +Удалить закл. 5 +Remove Spell 6 +Удалить закл. 6 +Remove Spell 7 +Удалить закл. 7 +Replace Spell 1 +Заменить закл. 1 +Replace Spell 2 +Заменить закл. 2 +Replace Spell 3 +Заменить закл. 3 +Replace Spell 4 +Заменить закл. 4 +Replace Spell 5 +Заменить закл. 5 +Replace Spell 6 +Заменить закл. 6 +Replace Spell 7 +Заменить закл. 7 +Current Spell 1: +Текущее закл. 1: +Current Spell 2: +Текущее закл. 2: +Current Spell 3: +Текущее закл. 3: +Current Spell 4: +Текущее закл. 4: +Current Spell 5: +Текущее закл. 5: +Current Spell 6: +Текущее закл. 6: +Current Spell 7: +Текущее закл. 7: +### ??? + +Unfiled +Не подшито +Adventuring 101 +Авантюрист 101 +History +История +Bondage Witchery +Ведьмовство Бондажа +Enemy Notes +Вражеские записки +Graveyard +Кладбище +Catacombs +Катакомбы +Overgrown +Заросшие руины +Temple +Храм +Tombs +Гробницы +Library +Библиотека +Crystal Cave +Кристальная пещера +Orrery +Планетарий +Bellows +Сильфоны +Coast +Побережье +Ejahl +Эджал +(A page from the Book of Aeons)|The 'Graveyard' is a peculiar place. Long ago, human beings lived and died just like the animals. When the Old Civilization existed, they would come to bury their dead in the Graveyard. It remains a mystery why so many of the former dead seem to be alive. Some say that when the Old Civilization cast the spell that spell which overcame Death, even those buried in their graves would rise again. Others simply say that there is a powerful necromancer who lives here, toying with the dead as if they were pets... +(Страница из Книги Вечности)|'Кладбище' - странное место. Давным-давно люди жили и умирали точно так же, как животные. Когда существовала Древняя цивилизация, её жители приходили хоронить своих умерших на кладбище. Остается загадкой, почему так много бывших умерших кажутся живыми. Некоторые говорят, что когда Древняя цивилизация произнесла заклинание, которое победило Смерть, даже те, кто был похоронен в своих могилах, вновь воскресли. Другие говорят, что здесь просто живет могущественный некромант, который играет с мертвецами, как с домашними животными... +(A page from the Book of Aeons)|Beneath the Graveyard lies a relic of a former age, a network of tombs inhabited by the immortal followers of Bast. Very few were graced with this gift of immortality before the great archmagus, Sariel Vinlaga, stole this power from the gods and granted all humans with the power of immortality. The Bast followers are still set in their ways, hoping for a time when their Goddess will return and rebuild their glorious civilization. +(Страница из Книги Вечности)|Под кладбищем находится реликвия былых времен - сеть гробниц, населенных бессмертными последователями Баст. Очень немногие были удостоены этого дара бессмертия до того, как великий архимаг Сариэль Винлага украла силу бессмертия у богов и даровала её всем людям. Лучшие последователи всё еще стоят на своем, надеясь, что, когда-нибудь Богиня вернется и восстановит их славную цивилизацию. +(A page from the Book of Aeons)|Some say the 'Catacombs' are older than time itself. When the Old Civilization began to study immortality, no one knew if it would be possible to bring back those who already died. The Catacombs therefore were used to store all of the remains of former humans, so that they too could be revived when the archmagus would finally make her breakthrough. +(Страница из Книги Вечности)|Некоторые говорят, что 'Катакомбы' старше самого времени. Когда Древняя цивилизация начала изучать бессмертие, никто не знал, возможно ли будет вернуть тех, кто уже умер. Таким образом, катакомбы использовались для хранения всех останков бывших людей, чтобы их тоже можно было оживить, когда архимаг, наконец, совершит свой прорыв. +(A page from the Book of Aeons)|They say that Archmagus Sariel Vinlaga studied in this very library. Having gathered together all of human knowledge, magical, spiritual, technological, she tasked her twelve lesser magi with the job of sorting and collating the wealth of knowledge she had acquired. No one knows why she suddenly abandoned it, or why it remains in such disrepair today. +(Страница из Книги Вечности)|Говорят, что архимаг Сариэль Винлага училась в этой самой библиотеке. Собрав воедино все человеческие знания, магические, духовные, технологические, она поручила своим двенадцати младшим магам работу по сортировке и сопоставлению богатства приобретенных ею знаний. Никто не знает, почему она вдруг отказалась от библиотеки и почему сегодня она находится в таком плачевном состоянии. +(A page from the Book of Aeons)|The Overgown Ruins remain a puzzle to scholars. Hardly any light comes through the cracks in the ceiling, and yet the area teems with life. It is known that the regenerative powers that keep humans from dying relies on an individual's own mana supply. So how do plants and beasts without mana survive? The devout say it is the Goddess of Restoration who preserves the jungle, but could it be that the Old Civilization developed a means of sustaining life underground? +(Страница из Книги Вечности)|Заросшие руины остаются загадкой для ученых. Сквозь щели в потолке почти не проникает свет, и все же джунгли кишат жизнью. Известно, что регенеративные способности, которые удерживают людей от смерти, зависят от собственного запаса маны индивидуума. Так как же растения и звери выживают без маны? Верующие говорят, что джунгли охраняет Богиня Жизни, но может ли быть так, что это Древняя цивилизация разработала средства поддержания жизни под землей? +(A page from the Book of Aeons)|The problem of Energy has plagued civilization for millenia. Before the leylines were discovered, humankind relied on natural sources of power such as rivers and firewood. When the Crystal Caves were discovered, a great revolution occurred. No longer reliant on natural sources, civilizations could tap the wellsprings of chaotic energy underground to power machinery like never seen before. +(Страница из Книги Вечности)|Проблема Энергии преследовала цивилизацию на протяжении тысячелетий. До того, как были открыты лейлинии, человечество полагалось на естественные источники энергии, такие как реки и дрова. Когда были обнаружены Хрустальные пещеры, произошла великая революция. Больше не полагаясь на природные источники, цивилизации могли использовать подземные источники хаотической энергии для приведения в действие невиданных ранее механизмов. +(A page from the Book of Aeons)|The 'Lost Temple' as they call it, is a subject of great speculation. It seems that its creators worshipped only four creator goddesses, rather than all the Eight. It was perhaps abandoned several hundred years ago when a flood caused great panic, and it seems that this must have occurred before humanity was made immortal by the archmagus, as there are many remains still found inside. +(Страница из Книги Вечности)|'Затерянный храм', как они его называют, является предметом больших спекуляций. Похоже, что его создатели поклонялись только четырем богиням-создательницам, а не всем восьми. Возможно, он был заброшен несколько сотен лет назад, когда всемирный потоп вызвал всеобщую панику, и кажется, что это событие, должно быть, произошло ещё до того, как архимаг сделала человечество бессмертным, поскольку внутри до сих пор можно найти много останков. +(A page from the Book of Aeons)|The Stars have been a mystery to scholars since the beginning of time. At one point, humans believed that every star was a god, and they made offerings by throwing sugar into the night, thinking that as the stars were innumerable, so were the grains of sugar that pleased humans so much. Religion has moved past that, but the Orrery remains a relic from a time when humanity worshipped the stars rather than the Eight. +(Страница из Книги Вечности)|Звезды были загадкой для ученых с незапамятных времен. В какой-то момент люди поверили, что каждая звезда - это бог, и они совершали подношения, разбрасывая сахар в ночи, думая, что поскольку звезд бесчисленное множество, то крупинок сахара, которые так нравятся людям, хватит на всех. Религия ушла в прошлое, но Планетарий остается пережитком тех времен, когда человечество поклонялось звездам, а не Восьмерке. +(A page from the Book of Aeons)|The 'Bellows' is the nickname given to the primitive facilities of the Old Civilization, buried deep beneath the ground. While much of it remains in disrepair, many of the Old Civilization's successors have attempted to keep it in good working order, as the technology is precious and impossible to replicate with modern methods. It seems that many of these successors have fallen prey to some delusions about its purpose, as much of the equipment preserved has little use aside from collecting prisoners. +(Страница из Книги Вечности)|'Сильфоны' - это прозвище, данное примитивным сооружениям Древней цивилизации, погребенным глубоко под землей. Хотя многое в этом месте остается в аварийном состоянии, многие последователи Древней цивилизации пытались поддерживать их в хорошем рабочем состоянии, поскольку технологии ценны и их невозможно воспроизвести современными методами. Похоже, что многие из этих последователей пали жертвой некоторых заблуждений относительно назначения этого места, поскольку большая часть сохранившегося оборудования практически бесполезна, кроме как для захвата заключенных. +(Preface from the journal of Catherine Willows, well-known explorer who vanished in the dungeon 30 years ago) I am writing this journal in the off chance that I do not come back in my search for the Mistress' staff. If you find this, please make an effort to deliver it back to the surface for the good of all the young women lured by its secrets. +(Предисловие из дневника Кэтрин Уиллоус, известной исследовательницы, пропавшей в подземелье 30 лет назад) Я пишу этот дневник на тот случай, если не вернусь с поисков Посоха Госпожи. Если вы найдете его, пожалуйста, приложите все усилия, чтобы вернуть его на поверхность, ради блага всех молодых женщин, соблазненных здешними секретами. +(Pg. 24 from Catherine Willows' journal) Many who trowel the upper levels of the Mistress' tomb often ask rhetorically: 'Why are there weird kinky traps guarding treasure chests? Why not have real, deadly traps if the purpose is to dissuade intruders?' +(Стр. 24 из дневника Кэтрин Уиллоус) Многие, кто исследуют верхние уровни гробницы Госпожи, часто задают риторический вопрос: 'Почему сундуки с сокровищами охраняются странными причудливыми ловушками? Почему бы не устроить настоящие смертельные ловушки, если цель состоит в том, чтобы отпугнуть злоумышленников?' +(Pg. 25 from Catherine Willows' journal) ...They make a crucial mistake: The treasure chests aren't trapped. Rather, they are full of gold. And we know that gold is pleasing to the gods: our economy runs on it, and the gods only make interventions in our day-to-day affairs because we give them gold. Lesser gods, known as spirits, also love gold, but unlike the gods we know, these lesser spirits cannot consume gold on an altar in one fell swoop like the gods can. Therefore, they need to physically inhabit the place where the gold sits, slowly draining it of its pleasing essence. +(Стр. 25 из дневника Кэтрин Уиллоус) ...Они совершают решающую ошибку: сундуки с сокровищами не содержат ловушек. Скорее всего, они полны золота. И мы знаем, что золото угодно богам: наша экономика держится на нем, и боги вмешиваются в наши повседневные дела только потому, что мы даем им золото. Малые боги, известные как духи, также любят золото, но, в отличие от известных нам богов, эти духи не могут уничтожить золото на алтаре одним махом, как это делают боги. Следовательно, им необходимо физически обитать в том месте, где находится золото, медленно высасывая из него его приятную сущность. +(Pg. 26 from Catherine Willows' journal) So the question is not 'why did somebody lay these traps.' The answer is that they are not traps at all. I surmise that the upper floors were once a place of offering for the dead. And when the old civilization perished and the entire complex sank into the ground, there was no longer anyone to drive the spirits away and keep them from inhabiting the upstairs. As for why there are so many restraints in general rather than your typical sort of spirits... well we know what the Mistress surrounded herself with. +(Стр. 26 из дневника Кэтрин Уиллоус) Так что вопрос не в том, зачем кто-то расставил эти ловушки. Ибо истина заключается в том, что это вовсе не ловушки. Я предполагаю, что верхние этажи когда-то были местом подношений умершим. А когда Древняя цивилизация погибла и весь комплекс погрузился под землю, больше не было никого, кто мог бы прогнать духов и не дать им поселиться здесь. Что касается того, почему вообще существует так много ограничителей, вместо привычных нам типов духов... что ж, мы знаем, чем окружала себя Госпожа. +(The note starts with a drawing of a witch with many chains hanging from her body) She can block melee attacks with her chains. However, they conduct lightning and heat directly to her body, and I was able to take out her chains with bolt cutters. +(Заметка начинается с рисунка ведьмы с множеством цепей, свисающих с ее тела) Она может блокировать атаки ближнего боя своими цепями. Однако они пропускают молнию и тепло непосредственно к ее телу, и я смог срезать её цепи с помощью болторезов. +(The note starts with a drawing of a witch with lightning crackling from her fingertips) Water will cause her to short-circuit. I can't seem to hit her with lightning, though. She always redirects it. +(Заметка начинается с рисунка ведьмы с молнией, вылетающей из кончиков ее пальцев) Вода приведет к короткому замыканию. Хотя, кажется, я не могу поразить ее молнией. Она всегда перенаправляет её. +(The note starts with a drawing of a witch whose body is partly gelatinous) The slime is non-flammable and my attacks pass right through her body... Lightning and ice seem to be effective! +(Заметка начинается с рисунка ведьмы, тело которой наполовину гелеобразное) Слизь негорючая, и мои атаки проходят прямо сквозь ее тело... А вот молния и лед, кажется, эффективны! +(The note is from a famous escape artist) Many restraints are applied quite tightly by a skilled rigger. Even removing it will be tough without thrashing around a bit to loosen it. +(Заметка от известного мастера побега) Многие ограничители накладываются довольно туго опытными мастерами. Снять их будет непросто, если немного не повозиться, чтобы ослабить их. +(The note is from a famous escape artist) Anything can be unbuckled with enough patience. Having a finger extension such as a lockpick will help. Ultimately, though, what matters is that you have a calm state of mind, free from distraction and hopelessness. +(Заметка от известного мастера побега) При достаточном терпении можно расстегнуть все, что угодно. Наличие удлинителя для пальцев, такого как отмычка, в этом сильно поможет. Однако, в конечном счете, важно то, чтобы у вас было холодное состояние ума, свободное от рассеянности и безнадежности. +(The note is from a famous cartographer) In my lapse of judgement, I decided to borrow some mana from the nearby shrine to the Latex goddess. While there was no immediate response to my faux pas, I soon found myself pursued by a swarm of slimes! +(Примечание от известного картографа) По своей глупости я решил позаимствовать немного маны в близлежащем святилище богини Латекса. Хотя немедленной реакции на мою оплошность не последовало, вскоре я обнаружил, что меня преследует рой слизняков! +(A letter between bandit leaders) One of my subordinates has been reporting a girl bound in heavy leather restraints running around. I told her that this is normal, people keep all kinds of servants around here. But definitely keep an eye out for intruders! Don't let them fool you! +(Переписка между главарями бандитов) Один из моих подчиненных сообщил о бегающей вокруг девушке, закованной в тяжелые кожаные ограничители. Я сказал ей, что это нормально, люди держат здесь самых разных слуг. Но обязательно следите за незваными гостями! Не позволяйте им одурачить вас! +(The note is a letter from the school of conjuration) We really would like to know... why did you summon a frog in the laboratory? People are wondering, you know. One of the student's projects got eaten. +(Эта записка - письмо из школы сотворения) Мы действительно хотели бы знать... зачем вы призвали лягушку в лаборатории? Люди задаются вопросами, и вы это знаете. Один из студенческих проектов был съеден. +(You find a carving on the floor, a half-finished magic circle of celestial conjuration. Perhaps a cleric wished to call forth an angel for guidance, before realizing there was a shrine a short walk away, where she could contact the heavens much more easily.) +(Вы находите резьбу на полу, наполовину законченный магический круг божественного заклинания. Возможно, жрица хотела призвать ангела для получения наставлений, прежде чем поняла, что в нескольких минутах ходьбы отсюда есть святилище, где ей будет гораздо легче связаться с небесами.) +(It looks like a... receipt) Thank you for your offering to CELESTIAL COMMERCE. Please accept this fine-quality steel blade as compensation for your continued devotion and selflessness. +(Это похоже на... квитанцию) Благодарю вас за ваше подношение НЕБЕСНОЙ КОММЕРЦИИ. Пожалуйста, примите этот клинок из высококачественной стали в качестве благодарности за вашу неизменную преданность и самоотверженность. +(A note written in cursive) To whomever assaulted our courier and left them tied up here: The shrines of the Goddess of ILLUSION are NOT to be used in this manner. If you desire a subject for your lewd experimentations, please attempt to do so on one of the locals and for heaven's sake do not call up an angelic courier just so you may tie her up. It does not matter that she consented, nor that you paid, our couriers have responsibilities that they must attend to. Signed: HERONA, enforcer of the GODDESS of ILLUSIONS. +(Записка, написанная курсивом) Тому, кто напал на нашего курьера и оставил его связанным здесь: Святилища Богини ИЛЛЮЗИЙ НЕ должны использоваться подобным образом. Если вам нужен объект для ваших непристойных экспериментов, пожалуйста, попытайтесь сделать это с кем-нибудь из местных жителей и, ради всего святого, не вызывайте ангельского курьера только для того, чтобы связать ее. Не имеет значения, что она согласилась, или что вы заплатили, у наших курьеров есть обязанности, которые они должны выполнять. Подпись: ХЕРОНА, страж БОГИНИ ИЛЛЮЗИЙ. +(From an essay titled 'On Celestial Supply Chains') It is known that the heavens seek gold. We do not know why it is that the heavens seek it, but we do know that the Goddesses grant us fragments of their limitless power in exchange for this otherwise-useless metal we dredge up from the earth. They care about it so much that shrines are commonplace, each hosting an angelic courier lying in wait for any adventurer willing to part with hers. +(Из эссе под названием 'О небесных цепочках поставок') Известно, что небеса ищут золото. Мы не знаем, почему небеса стремятся к нему, но мы знаем, что Богини даруют нам частички своей безграничной силы в обмен на этот бесполезный в остальном металл, который мы извлекаем из земли. Они желают его настолько сильно, что обычным делом стали святилища, в каждом из которых находится ангельский курьер, поджидающий любого искателя приключений, готового расстаться со своим золотишком. +They say that the maiden who safeguards the graveyard is kind to her pets... +Говорят, что девушка, которая охраняет кладбище, добра к своим питомцам... +They thought they could have my legendary blade... but the fools forgot to tie my legs! I was able to Portal out of jail and into the hallway where they kept all my things! +Они думали, что смогут заполучить мой легендарный клинок... но эти дураки забыли связать мне ноги! Я смогла телепортироваться из тюрьмы в коридор, где хранились все мои вещи! +I am writing this from inside prison. Who would have known they cared so much about me using a shrine? Sheesh. +Я пишу это, находясь в тюрьме. Кто бы мог подумать, что они так сильно заботятся о том, чтобы я не смогла воспользоваться святилищем? Мфффх. +(A drawing of a bunch of zombies, ordered by danger level. Of note are a zombie surrounded by charms, a zombie surrounded by talismans, a zombie warrior with a sword, and... some kind of shrine maiden that you've never seen before) +(Рисунок группы зомби, упорядоченный по уровню опасности. Следует отметить зомби-мага, зомби, окруженного талисманами, зомби-воина с мечом и... какую-то служительницу храма, которую вы никогда раньше не видели) +(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|The first thing to understand is that tying someone up is difficult if they are not in a vulnerable position. If your opponent is vulnerable, then binding will be twice as effective! +(Отрывок из книги 'ВЕДЬМОВА МАГИЯ БОНДАЖА: ПОСОБИЕ ДЛЯ СТУДЕНТОВ')|Первое, что нужно понять, - это то, что связать кого-то трудно, если он не находится в уязвимом положении. Если ваш противник уязвим, то его сковывание будут в два раза эффективнее! +(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Once your opponent is nicely trussed up, you can break their will by tickling them with a Feather, Ice Cube, or Magic Wand. This will deal extra damage. +(Отрывок из книги 'ВЕДЬМОВА МАГИЯ БОНДАЖА: ПОСОБИЕ ДЛЯ СТУДЕНТОВ')| Как только ваш противник будет хорошо связан, вы можете сломить его волю, использовав перо, кубик льда или волшебную палочку. Это нанесет дополнительный урон. +(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Bigger and more resilient opponents are much more effective at breaking out of your binds. Try to deal some damage to them to decrease the speed at which they struggle out of your restraints. +(Отрывок из книги 'ВЕДЬМОВА МАГИЯ БОНДАЖА: ПОСОБИЕ ДЛЯ СТУДЕНТОВ')|Более крупные и выносливые противники гораздо эффективнее вырываются из ваших оков. Попробуйте нанести им некоторый урон, чтобы уменьшить скорость, с которой они вырываются из ваших оков. +(An excerpt from BONDAGE WITCHERY: A STUDENT'S GUIDE)|Many mages utilize magical runes to set traps. If you want to check for traps, try learning the spell 'Magical Sight' in the Illusion school. +(Отрывок из книги 'ВЕДЬМОВА МАГИЯ БОНДАЖА: ПОСОБИЕ ДЛЯ СТУДЕНТОВ')|Многие маги используют магические руны для установки ловушек. Если вы хотите проверить, нет ли по близости ловушек, попробуйте выучить заклинание 'Магическое Зрение' в школе иллюзий. +From Adventuring 101: A guide to combat|Your opponent will become vulnerable in many ways, such as missing you with an attack. You can also teleport to the other side of them when they are attacking you, and this will confuse them briefly.|Vulnerable enemies take extra damage, and are easier to tie up! +От авантюриста 101: Руководство по ведению боя|Ваш противник может стать уязвимым во множестве случаев, например, пропустит от вас атаку. Вы также можете телепортироваться им за спину, когда они нападают на вас, и это ненадолго собьет их с толку.|Уязвимые враги получают дополнительный урон, и их легче связать! +From Adventuring 101: A guide to combat|Drenching your opponents makes them more vulnerable to ice and electricity, but may increase their resistance to fire. +От авантюриста 101: Руководство по ведению боя|Обливание водой ваших противников делает их более уязвимыми для льда и электричества, но может повысить их устойчивость к огню. +From Adventuring 101: A guide to combat|Hitting enemies with melee damage while they are frozen will break the ice, but this also doubles the damage dealt by the attack. +От авантюриста 101: Руководство по ведению боя|Нанесение врагам урона в ближнем бою, пока они заморожены, разрушит лед, но это также удваивает урон, наносимый атакой. +From Adventuring 101: A guide to combat|Did you know that hitting enemies with fire while they are frozen is extra powerful? Enemies take 40% additional damage from fire while frozen, although fire will rapidly unfreeze them. +От авантюриста 101: Руководство по ведению боя|Знаете ли вы, что поражать врагов огнем, пока они заморожены, очень эффективно? Враги получают 40% дополнительного урона от огня во время замораживания, хотя огонь быстро размораживает их. +From Adventuring 101: A guide to combat|When you're in a bind, try to play along and look for an opportunity to escape. Fighting back will only make your enemies want to tighten your restraints. +От авантюриста 101: Руководство по ведению боя|Когда вы оказываетесь в путах, старайтесь подыгрывать и ищите возможность сбежать. Сопротивляясь, вы только заставите ваших врагов захотеть ужесточить ваши ограничения. +(A drawing of a suit of armor. It reads: DO NOT TRUST) +(Рисунок доспехов. На нём написано: 'НЕ ДОВЕРЯЙ') +(The note starts with a drawing of a witch in dark robes with bright pink hair) A necromancer. Powerful spellcaster, weak up close. +(Заметка начинается с рисунка ведьмы в темной мантии с ярко-розовыми волосами) Некромант. Могущественный заклинатель, слабый вблизи. +I can't count how many skeletons I've bashed with my hammer today. They seem so fragile... +Я не могу сосчитать, сколько скелетов я сегодня разбила своим молотком. Они кажутся такими хрупкими... +(The note is scrawled with wiggling lines) IT SEES ME. I SHOULDN'T HAVE DEFILED THE ROPE GODDESS' ALTAR! +(Записка исписана извилистыми линиями) ОНО ВИДИТ МЕНЯ. Я НЕ ДОЛЖНА БЫЛ ОСКВЕРНЯТЬ АЛТАРЬ БОГИНИ ВЕРЁВОК! +It is said that fire and water are opposite planes, but I've noticed that the relation is more lopsided than 'equal and opposite' when they physically manifest. Water elementals resist fire, obviously, but fire elementals are weak to water! It is almost as if the abundance of water in this world causes the fire elementals to become weaker than in their home plane... +Говорят, что огонь и вода - противоположные планы, но я заметил, что их отношения более изощренные, чем 'равные и противоположные', когда они проявляются физически. Водные элементали, очевидно, имеют сопротивление огню, но огненные элементали слабы к воде! Это почти как если бы изобилие воды в этом мире приводило к тому, что элементали огня становились слабее, чем на их родном плане... +A drawing of many icicles around pools of water. It instructs you to avoid the pools of water and you can see a figure surrounded by ice shards in the distance being set on fire and smashed with a hammer. +Рисунок множества льдин вокруг лужиц с водой. Он предписывает вам избегать луж с водой, и вы можете увидеть вдалеке фигуру, окруженную осколками льда, которую жгут огнём и разбивают молотом. +The shadow spirits' touch is cold as ice... I have wondered if this temperature property applies to their destructive effects on other types of beings. Unfortunately, I found out the hard way when I tried to summon a shadow creature against an ice elemental... +Прикосновение духов тьмы холодно, как лед... Я задавалась вопросом, применимо ли это свойство температуры к их разрушительному воздействию на другие типы существ. К сожалению, я убедилась в этом на собственном горьком опыте, когда попыталась вызвать теневое существо против ледяного элементаля... +I was being chased by something fast and heavy, and it was about to crush me when I tossed an Ice Shard behind me. It stopped and I didn't care to look back. +За мной гналось что-то быстрое и тяжелое, и оно вот-вот должно было раздавить меня, когда я бросила ледяной осколок себе за спину. Всё прекратилось, и я не стала оглядываться назад. +I was walking in the library when I got attacked by a magic book! Fortunately my sword seemed to disapatch it quickly, and I used my spear to stab another one shortly after. +Я прогуливалась по библиотеке, когда на меня напала волшебная книга! К счастью, мой меч, казалось, быстро расправился с нею, и вскоре после этого я попробовала использовать свое копье, чтобы пронзить еще одну. +SOMEBODY STABBED MY FROG AND I AM PISSED. +КТО-ТО ПЫРНУЛ НОЖОМ МОЮ ЛЯГУШКУ, И Я ОЧЕНЬ ЗЛА. +I don't think it's neccessary to tell people that dragons resist fire... right? +Я не думаю, что нужно говорить людям, что драконы имеют сопротивление огню... верно? +I've been studying the dragonheart's weaknesses. So far I've found that the ones bearing the powers of ice dragons are actually weak to fire unlike the others, and the ones who summon crystals to block attacks are nonetheless unable to grab a spear to stop it from reaching them. +Я изучала слабые стороны Драконьего Сердца. Пока что я обнаружила, что те, кто обладает силой ледяных драконов, на самом деле уязвимы к огню, в отличие от остальные, а те, кто призывает кристаллы, чтобы блокировать атаки, тем не менее не могут перехватить копье. +They say a ninja can catch a sword in her hands, but can she stop a spear? Ha, thought not! +Говорят, ниндзя может остановить меч своей рукой, но сможет ли она остановить копье? Ха, так и думал, что нет! +(Pg. 54 from Catherine Willows' journal): The post-collapse civilization sought immortality, but they knew that the technologies of the old civilization were a danger to them. So they turned to another school of thought: Magic. +(Стр. 54 из дневника Кэтрин Уиллоус): Цивилизация, возникшая после коллапса, стремилась к бессмертию, но они знали, что технологии Древней цивилизации представляют для них опасность. Поэтому они обратились к другому пути: магии. +(Pg. 55 from Catherine Willows' journal): Silk wrappings, enchanted with ten-thousand microscopic runes per cubit, were suffucient to protect their bodies from ageing for millenia. What they didn't realize was that the magic didn't protect their souls. +(Стр. 55 из дневника Кэтрин Уиллоус) Шелковых бинтов, зачарованных десятью тысячами микроскопических рун на сантиметр квадратный, было достаточно, чтобы защитить их тела от старения на тысячелетия. Чего они не понимали, так это того, что магия не защищала их души. +(Pg. 56 from Catherine Willows' journal): They have no clue what they are doing anymore. To them, this is just another one of their ten-thousand dreams across the aeons. They can no longer tell reality from imagination. +(Стр. 56 из дневника Кэтрин Уиллоус): Они больше не имеют понятия, что делают. Для них это всего лишь еще одна из десяти тысяч их грез на протяжении веков. Они больше не могут отличить реальность от воображения. +Ninjas aren't so tough to fight when their hands are tied behind their back. Good thing I had my pet slime with me~ +С ниндзя не так сложно сражаться, когда их руки связаны за спиной. Хорошо, что у меня был с собой мой питомец слайм~ +(Pg. 12 from Catherine Willows' addendum): After studying the ancient race of catlike people, I have come to the conclusion that their race met a dual fate. All of them received eternal life in some form or another. To one half it manifested as a blessing, allowing them to walk the halls. To the other it became a curse to them, trapping them in runic wrappings for all eternity. +(Стр. 12 из дневника Кэтрин Уиллоус): Изучив древнюю расу людей-кошек, я пришла к выводу, что их расу постигла двойная судьба. Все они получили вечную жизнь в той или иной форме. Для одной половины это проявилось как благословение, позволившее им ходить по залам. Для других это стало проклятием, заключившим их в рунические бинты на всю вечность. +(Pg. 13 from Catherine Willows' addendum): I must issue a correction to the statements written in my journal. The ancients knew what they were doing. Those that were cursed, are blessed, and those who were blessed, are cursed. +(Стр. 13 из дневника Кэтрин Уиллоус): Я должна внести исправления в слова, записанные в моем дневнике. Древние знали, что делали. Те, кто был проклят, благословлены, а те, кто был благословлен, прокляты. +(It's a copy of an ancient illustration, depicting a cat goddess, an elven goddess, and two groups of catgirls. One group is smiling and standing on pedestals. The other group is frowning and wearing armor meant for war. It looks unfinished, like the author was suddenly grabbed from behind while drawing it) +(Это копия древней иллюстрации, изображающей богиню кошек, эльфийскую богиню и две группы девушек-кошек. Одна группа улыбается и стоит на пьедесталах. Другая группа хмурится и носит доспехи, предназначенные для войны. Она выглядит незаконченной, как будто автора внезапно схватили сзади, когда он ее рисовал) +(It's a interlinear translation of an ancient letter) Your highness, I have delivered to you the prisoners that you have asked. They are the worst of the worst--thieves, slanderers, sorcerers and seducers. But I must inquire, why is it that we must wrap them in silken scarves, worth twenty gold pieces each? Surely they are being handed over to be disciplined, not to be anointed? +(Это межстрочный перевод древнего письма) Ваше высочество, я доставил вам пленников, о которых вы просили. Они худшие из худших - воры, клеветники, колдуны и соблазнители. Но я должен спросить, почему мы должны заворачивать их в шелковые бинты, каждый из которых стоит по двадцать золотых монет? Мы ведь передаем их для того, чтобы они были наказаны, а не для того, чтобы они были благословлены? +(It's a record of an interview)|ME: Why are you like this?|MUMMY: Because we are blessed!|ME: Blessed? You've been wrapped up for thousands of years!|MUMMY: A thousand years is nothing compared to the glory that will come!|ME: Why do you have to be wrapped up? There are plenty of you who aren't...|MUMMY: The chosen ones will inherit the land when the goddess returns. +(Это запись интервью)|Я: Почему ты такая?|МУМИЯ: Потому что мы благословлены!|Я: Благословенны? Ты была закутана в бинты на тысячи лет!|МУМИЯ: Тысяча лет - ничто по сравнению с той славой, которая меня ждёт!|Я: Почему ты должна находиться в таком состоянии? Есть много таких, кто не...|МУМИЯ: Избранные унаследуют землю, когда богиня вернется. +(It's a record of an interview)|ME: Which goddess are you referring to? The goddess of restoration?|MUMMY: The blessed kitty.. she was promised to rule over the lesser goddesses.|ME: Lesser goddesses? Which ones?|MUMMY: YOUR goddesses. The ones you humans created that should not be. Ours is the true offspring of the creators, a goddess created to rule! +(Это запись интервью)|Я: О какой богине вы говорите? Богиня жизни?|МУМИЯ: Благословенная кошка... ей было обещано править малыми богинями.|Я: Малые богини? Какие именно?|МУМИЯ: ТВОИ богини. Те, кого вы, люди, создали, которых не должно было быть. Наша - истинное потомство создателей, богиня, созданная для того, чтобы править! +(It's a record of an interview)|ME: What of the elves? Don't they talk about a 'kingdom' too?|MUMMY: Who are the elves?|ME: You know, pointy ears, green hair, a heck of an attitude... they seem in tune with nature.|MUMMY: They sound arrogant.|ME: They are.|MUMMY: Perhaps they know nothing of the promise between our goddess and theirs. +(Это запись интервью)|Я: А как же эльфы? Разве они тоже не говорят о 'королевстве'?|МУМИЯ: Кто такие эльфы?|Я: Знаешь, заостренные уши, зеленые волосы, чертовски манерный вид... они кажутся родственными природе.|МУМИЯ: Звучит как 'высокомерные снобы'.|Я: Так и есть.|МУМИЯ: Возможно, они ничего не знают об обещании, заключенном между нашей богиней и их богинями-близнецами. +(It's a medical record) Patient seems stable... application of the enchanted cloth seems to have stopped the bleeding. It appears that the ancient magic suppresses all forms of injury, even in humans, until it is taken off. +(Это медицинская карта) Состояние пациента кажется стабильным... Наложение зачарованной ткани, похоже, остановило кровотечение. Похоже, что древняя магия подавляет все формы травм, даже у людей. До тех пор, пока её не снимут. +(A record of an ancient... transaction)||The elemental offered us the following from her personal estate:|-one magical lantern that requires no fuel, and can light up the night as if it were day|-one crystal that burns red-hot when kept near metal, providing heat to warm a house|-three enchanted swords imbued with flame|-a hollow glass crystal, used for communication||In exchange, we gave her three wolfgirls we had captured on the surface. +(Запись древней... сделки)||Элементаль предложила нам следующее из своего личного имущества:|-один волшебный фонарь, который не требует топлива и может превратить ночь в день|-один кристалл, который раскаляется докрасна, если держать его рядом с металлом, обеспечивая теплом, способным согреть дом|- три зачарованных меча, наполненных пламенем|-полый стеклянный кристалл, используемый для общения||Взамен мы отдали ей трех девушек-волчиц, которых поймали на поверхности. +I had heard that ancient humans prayed to the stars here, in an effort to find favor when the Eight had forsaken them. So I went and prayed... and let me tell you, it was a lie, an absolute lie. There are only monsters out there. +Я слышал, что древние люди молились здесь звездам, пытаясь обрести благосклонность, когда Восьмерка покинула их. Поэтому я пошел и помолился... И позвольте мне сказать вам, что это была ложь, абсолютная ложь. Там есть только монстры. +(It is a set of instructions for creating a magic circle to unlock a sealed portal. There are markings in many languages that give conflicting descriptions, claiming that the circle will transmute material to gold, or bring good fortune...) +(Это набор инструкций по созданию магического круга, чтобы открыть запечатанный портал. Есть надписи на множестве языков, которые дают противоречивые описания, утверждая, что круг преобразует материал в золото или приносит удачу...) +(Two schematic diagrams of ancient drones taken from records. The first is unmodified, and the second has several annotations written in what looks like pink lipstick...) +(Два схематичных чертежа древних беспилотных летательных аппаратов взяты из записей. Первый не изменен, а на втором есть несколько комментариев, написанных чем-то похожим на розовую помаду ...) +Those damn slimes! They're so sticky and gross... fortunately, I washed myself in the fountain the last time I got caught by one. It came right off! +Эти чертовы слаймы! Они такие липкие и отвратительные... К счастью, когда меня в последний раз поймал один из них, я сразу же умылся в фонтане. И он сразу же отлип! +The dragonhearts were a group of dragonslayers, named for their ritual that imbues them with the fiery power and resistance of dragons they've slain. Now they work as mercenaries, and some of them serve a certain Leather goddess. +Драконьи Сердца были группой истребителей драконов, названной так из-за их ритуала, который наделяет их огненной силой и сопротивляемостью убитых ими драконов. Теперь они работают наемниками, и некоторые из них служат некой Богине Кожи. +Yes! I've done it! I have created another red slime! I shall call him Fred, yes, Fred. After the red slime I lost in a shield-related accident a while back... |Poor Fred... I miss him. +Да! Я сделала это! Я создала еще одного красного слайма! Я буду называть его Фредом, да, Фредом. После красного слайма, которого я потеряла некоторое время назад в результате несчастного случая, связанного со щитом... |Бедный Фред... Я скучаю по нему. +(Pg. 70 from Catherine Willows' journal): The overgrown ruins are a curious phenomenon. The level of light pouring through cracks in the ceiling is nonetheless too sparse to sustain plantlife. And yet the restoration goddess, in her ancient wisdom, has decided to preserve this place. How many of her dryads must I pierce or burn until she realizes I am merely passing through? +(Стр. 70 из дневника Кэтрин Уиллоус): Заросшие руины - любопытное явление. Тем не менее уровень света, проникающего через трещины в потолке, слишком мал для поддержания жизни растений. И все же богиня жизни, в своей древней мудрости, решила сохранить это место. Скольких из ее дриад я должна пронзить или сжечь, пока она не поймет, что я просто прохожу мимо? +The unseen maid is the deadliest. +Невидимая горничная - самая смертоносная. +(The note is blank) +(Эта записка пустая) +The note reads: Mmmmmmmph! Mmmm! MMMMMPH!!!!-- (The entire note is just gagged mumblings...) +Записка гласит: Мммммммф! Мммм! МММММФ!!!!-- (Вся записка - это просто бормотание с кляпом во рту...) +(The note is illegible) +(Записка написана слишком неразборчиво) +(The note contains a map of a previous floor) +(Записка содержит карту предыдущего этажа) +(The note is smeared with some kind of liquid) +(Записка измазана какой-то жидкостью) +(The note contains a cryptic riddle that makes no sense) +(Записка содержит крипто-загадку, которая не имеет смысла) +(The note contains a list of the writer's likes/dislikes and hard limits) +(Записка содержит список симпатий/антипатий автора и то, на что она никогда не согласится) +The note reads: Please take this beautiful doll somewhere and play with her~ +В записке говорится: Пожалуйста, отнесите эту красивую куколку куда-нибудь и поиграйте с ней~ +(The note contains a manual on fencing. You have always been a terrible fencer) +(В записке содержится руководство по фехтованию. Вы всегда были ужасным фехтовальщиком) +(The note contains a magic spell you were taught never to cast under any circumstances) +(В записке содержится магическое заклинание, которое вас учили никогда не произносить ни при каких обстоятельствах) +The item requires 5 keys and free hands to remove +Для снятия предмета требуется 5 ключей и свободные руки +The item is extremely secure with five separate keyholes. +Предмет чрезвычайно надежно защищен пятью отдельными замочными скважинами. +You insert your 5 keys into the lock and the item finally comes off. +Вы вставляете свои 5 ключей в замок, и предмет, наконец, снимается. +### [RNAME] + +Magic-Draining: This item drains your mana quickly up to a limit, then slowly after. +Истощение магии: Этот предмет один раз быстро истощает вашу ману до лимита, в следующие разы этот процесс будет происходить медленнее. +Curse of Tickling: This item is tickling you without end! +Проклятие Щекотки: Этот предмет без конца вас щекочет! +Curse of Punishment: Inflicts psychic damage when you attack or cast a spell. +Проклятие Наказания: наносит психический урон, когда вы атакуете или произносите заклинание. +Curse of Illumination: Produces light and makes you easier to see. +Проклятие Иллюминации: Создает свет и облегчает обнаружение. +Curse of Attraction: Women find you irresistable. +Проклятие Привлекательности: Женщины находят вас неотразимой. +Curse of Animation: Causes loose restraints to animate and attack you! +Проклятие Анимации: Приводит к тому, что ослабленные ограничители оживают и атакуют вас! +Curse of Sensitivity: Makes it easier to lose control of yourself. +Проклятие Чувствительности: облегчает потерю контроля над собой. +Curse of Distraction: Multiplies DP gain by 1.5x. +Проклятие Возбуждения: Увеличивает получаемые DP в 1,5 раза. +Curse of Exhaustion: -25% Stamina regen cap. +Проклятие Истощения: -25% предел регенерации Выносливости. +Curse of Futility: Multiplies WP gain by 0.5x. +Проклятие Тщетности: Уменьшает множитель восполнения WP до 0.5х. +Curse of Submission: Gain submissiveness when you lose control of yourself... +Проклятие Подчинения: Усиливает покорность, когда вы теряете контроль над собой +The curse is dormant, waiting for the time to strike... +Проклятие Дремлет, ожидая своего часа, чтобы нанести коварный удар... +Your RESTRAINTNAME glows pink as you feel your mind attacked by hypnotic forces! +Ваш RESTRAINTNAME светится розовым, и вы чувствуете, что ваш разум атакован гипнотическими силами! +The item is cursed! Several restraints appear on your body! +Этот предмет проклят! На вашем теле появляется несколько ограничителей! +The item is cursed, but you are so trussed up you hear only sinister laughter... +Предмет проклят, но вы и так связаны, так что вы слышите только зловещий смех... +The item is sealed with an icy lock. Perhaps you can melt it somehow? +Предмет запечатан ледяным замком. Может быть, вы сможете как-нибудь растопить его? +The cursed seal flashes brightly as you struggle fruitlessly against it. +Проклятая печать ярко вспыхивает, пока вы безуспешно боретесь с ней. +The item is sealed with a smoldering lock. Perhaps you just need to put out that fire... +Предмет запечатан тлеющим замком. Возможно, вам просто нужно затушить этот огонь... +The cursed seal glows faintly as you struggle fruitlessly against it. +Проклятая печать слабо светится, пока вы безуспешно боретесь с ней. +The item contains technological markings. Perhaps applying some electricity will affect it? +Предмет имеет технологическую метку. Возможно, воздействие электричества повлияет на него? +The cursed seal gives off sparks as you struggle fruitlessly against it. +Проклятая печать испускает искры, пока вы безуспешно с ней боретесь. +The item contains an alchemical seal. Perhaps Glue damage will overload it? +Предмет содержит алхимическую печать. Возможно, урон Слизью перегрузит её? +The item stretches as you tug on it, but snaps back to its original place. +Предмет растягивается, когда вы тянете за него, но возвращается на прежнее место. +The item is covered in markings of chains. Perhaps you need to take Chain damage? +Предмет имеет метку в виде цепочек. Возможно, вам нужно получить Цепной урон? +The item squeezes you tighter as you try to take it off. +Предмет сжимается на вас сильнее, когда вы пытаетесь его снять. +The item is protected by holy magic. There is nothing you can do to it. +Предмет защищен святой магией. Вы ничего не можете с этим поделать. +You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? +Вы молитесь Богине, и символ исчезает! Возможно, вы вернули то, что принадлежало ей по праву? +This item bears the sigil of the Goddess of Restoration. Perhaps she can help? +На этом предмете изображен символ Богини Жизни. Может быть, она сможет помочь? +The item is protected by a magical seal. There is nothing you can do to it. +Этот предмет защищен магической печатью. Вы ничего не сможете с ним сделать. +You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? +Вы молитесь Богине, и символ исчезает! Возможно, вы вернули то, что принадлежало ей по праву? +This item bears the sigil of the Goddess of Conjuration. Perhaps she can help? +На этом предмете изображен символ Богини Сотворения. Может быть, она сможет помочь? +The item is protected by dark secrets. There is nothing you can do to it. +Этот предмет защищен тёмными секретами. Вы ничего не можете с ним сделать. +You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? +Вы молитесь Богине, и символ исчезает! Возможно, вы вернули то, что принадлежало ей по праву? +This item bears the sigil of the Goddess of Illusions. Perhaps she can help? +На этом предмете изображен символ Богини Иллюзий. Может быть, она сможет помочь? +You pray to the Goddess and the sigil vanishes! Perhaps you returned what was rightfully hers? +Вы молитесь Богине, и символ исчезает! Возможно, вы вернули то, что принадлежало ей по праву? +This item bears the sigil of the Goddess of Elements. Perhaps she can help? +На этом предмете изображен символ Богини Стихий. Может быть, она сможет помочь? +The item is protected by an elemental seal. There is nothing you can do to it. +Предмет защищен печатью стихий. Вы ничего не можете с ним сделать. +You hold the key to the item and it comes loose, draining the key's energy. +Вы держите ключ от предмета, и он ослабляется, поглощаю энергию ключа. +The item is incribed with mystical runes. Maybe you need a powerful key to unlock it. +На предмете начертаны мистические руны. Возможно, вам нужен мощный ключ, чтобы отпереть его. +The lock-shaped rune flashes as you realize struggling is pointless. +Руна в форме замка вспыхивает, и вы осознаете, что бороться бессмысленно. +You overload the magical seal, causing it to vanish and release the item. +Вы перегружаете магическую печать, заставляя ее исчезнуть и высвобождая предмет. +The item is magically sealed, requiring 200 mana to unlock it (includes mana from mana pool). +Предмет запечатан магией, для его разблокировки требуется 200 единиц маны (включая ману из резерва). +You tug on the item, but the magic can't be broken with anything other than brute force. +Вы тянете за предмет, но магию нельзя разрушить ничем, кроме грубой силы. +The item is sealed with a locking spell! You will need a key to dispel the magic. +Предмет запечатан запирающим заклинанием! Вам понадобится ключ, чтобы развеять магию. +You tug on the item but it is magically sealed to your body! +Вы тянете за предмет, но он прикреплен к вашему телу с помощью магии! +You insert your magic key into the lock and the item finally comes off! +Вы вставляете свой магический ключ в замок, и предмет, наконец, снимается! +The item is protected by a seal of Determination. You must have maximum willpower to remove it. +Предмет защищен печатью Решимости. Вы должны обладать максимальной силой воли, чтобы снять его. +You are unable to muster the willpower to bypass the seal... +Вы не в состоянии собрать силу воли, чтобы обойти печать... +Feeling determined, you override the seal and release the item! +Преисполнившись решимости, вы снимаете печать и освобождаетесь от предмета! +The lock is protected by a revenant seal. You'll need 25 ectoplasm to disenchant it. +Замок защищен призрачной печатью. Вам понадобится 25 единиц эктоплазмы, чтобы расколдовать его. +Your fingers pass right through the collar. Pity your neck doesn't pass through it. +Ваши пальцы проходят прямо сквозь ошейник. Жаль, что твоя шея не может так же. +You channel ghastly energy into the lock and break the seal!!! +Вы направляете призрачную энергию в замок и ломаете печать!!! +It would take many lifetimes to crack the code. You'll have to find another way to break the program... +Чтобы взломать код, потребовалось бы несколько жизней. Вам придется найти другой способ взлома программы... +You tug against the straps to no avail. +Вы безрезультатно дергаете за ремни. +One of your Doll IDs seems to have had corrupted data on it, causing the program to crash and unlock. +Похоже, что в одном из ваших ID Куклы были повреждены данные, что привело к сбою программы и разблокировке. +The item seems to drain divine energy from shrines. Maybe that has something to do with it. +Этот предмет, похоже, высасывает божественную энергию из святилищ. Может быть, это можно как-то использовать. +The collar is enchanted with multiple layers of magical seals. +Ошейник зачарован несколькими слоями магических печатей. +The collar has absorbed enough energy and pops off! +Ошейник впитал достаточно энергии и снялся! +That item cant be used. +Этот предмет нельзя использовать. +You're not sure how to use this key. +Вы не уверены, как использовать этот ключ. +As soon as you touch the key, all of your gold locks fade to blue! +Как только вы прикасаетесь к ключу, все ваши золотые замки становятся синими! +You realize there is no keyhole on the device, simply a lock-shaped sigil. +Вы понимаете, что на предмете нет замочной скважины, просто символ в форме замка. +The item loosens and falls off, but you see a red sigil flash and the key suddenly teleports away! +Предмет ослабевает и падает, но вы видите, как вспыхивает красный символ, и ключ внезапно телепортируется прочь! +You have in your possession KeyAmount magical, ornate key(s). You might as well try... +В вашем распоряжении есть KeyAmount магических, богато украшенных ключей. Что ж, можно попытаться... +You have KeyAmount key(s) for this item. +У вас есть KeyAmount ключей от этого предмета. +The angel helps you struggle and use items +Ангел помогает вам бороться и использовать предметы +The ghost helps you struggle and use items +Призрак помогает вам бороться и использовать предметы +The ghost is unhelpful +Призрак не может вам помочь +Angel: Greetings! +Ангел: Приветствую тебя! +Angel: Perhaps I can assist with those! +Ангел: Возможно, я смогу помочь с этим! +Adventurer's Ghost: Well met, traveler! +Призрак искателя приключений: Рад встрече, путешественница! +Adventurer's Ghost: Hello again, traveler (giggles). +Призрак искателя приключений: Еще раз привет, путешественница (хихикает). +Adventurer's Ghost: Having fun, girl? +Призрак искателя приключений: Веселишься, девочка? +Adventurer's Ghost: Looking for some trouble, slave? +Призрак искателя приключений: Ищешь неприятностей, рабыня? +Adventurer's Ghost: I see you, naughty little slave! +Призрак искателя приключений: Я вижу тебя, маленькая непослушная рабыня! +Ghost: I can try to help with those, traveler. +Призрак: Я могу попытаться помочь с этим, путешественница. +Ghost: Aww, you look like you're having fun... +Призрак: Оу, ты выглядишь так, будто тебе весело... +Ghost: You look great in those, hehe~ +Призрак: Ты отлично выглядишь в этом, хе-хе~ +Ghost: Please don't bother me. +Призрак: Пожалуйста, не беспокой меня. +Ghost: A good slave doesn't complain. +Призрак: Хорошие рабыни не жалуются. +Ghost: What's that? I don't understand. +Призрак: Что это? Я не понимаю. +Ghost: Silence is golden. +Призрак: Молчание - золото. +Ghost: A good slave doesn't speak until addressed. +Призрак: Хорошая рабыня не разговаривает, пока к ней не обратятся. +Ghost: Aww, so helpless~ +Призрак: Оу, такая беспомощная~ +Ghost: Trussed up like a good girl~ +Призрак: Связан, как хорошая девочка~ +Ghost: You're going to stay that way for a good while. +Призрак: Ты будешь оставаться такой еще долгое время. +Ghost: I love watching you hop around, it's funny! +Призрак: Мне нравится смотреть, как ты прыгаешь, это забавно! +Ghost: Just sit there like a good girl~ +Призрак: Просто сиди здесь, как хорошая девочка~ +Ghost: I want to see you kneel~ +Призрак: Я хочу увидеть, как ты встанешь на колени~ +Ghost: Aww, feeling frustrated? +Призрак: Оу, чувствуешь разочарование? +Ghost: Looks like someone's been naughty~ +Призрак: Похоже, кто-то плохо себя вел~ +Ghost: How's it feel to be under lock and key? +Призрак: Каково это - быть под замком? +You step on a pressure plate and a number of skeletons rise up! +Вы наступаете на нажимную пластину, и несколько скелетов восстают из мертвых! +You are ambushed by bandits! +Вы попали в засаду бандитов! +Armed skeletons appear from passages in the walls! +Вооруженные скелеты появляются из проходов в стенах! +An armed skeleton drops down from the ceiling! +Вооруженный скелет падает с потолка! +A wall panel falls down, and an armored skeleton appears! +Панель в стене падает, и появляется бронированный скелет! +You feel a chill down your spine... +Вы чувствуете холодок, пробегающий по вашей спине... +You feel a constricting presence... +Вы чувствуете чье-то пугающее присутствие... +You feel a titillating presence... +Вы чувствуете чье-то щекочущее присутствие... +You are ambushed by ninjas! +Вы попали в засаду ниндзя! +A large, wriggling mess of ropes fall from the ceiling! +С потолка падает большой, извивающийся клубок веревок! +A rune of growth causes several plants to quickly sprout nearby. +Руна роста заставляет несколько растений поблизости быстро прорасти. +You are ambushed by dragonhearts! +Вы попали в засаду Драконьего Сердца! +You are ambushed by dragonhearts! +Вы попали в засаду Драконьего Сердца! +A pack of drones descends from the ceiling! +Стая дронов спускается с потолка! +You hear sirens as a group of robots closes in! +Вы слышите сирены, и к вам приближается группа роботов! +You stumble upon a group of mages wanting to play dress-up! +Вы натыкаетесь на группу магов, желающих поиграть в переодевания! +You step on an open book, only to find a furious librarian staring you down! +Вы наступаете на открытую книгу, и обнаруживаете разъяренного библиотекаря, уставившегося на вас сверху вниз! +You are ambushed by wolfgirls! +Вы попали в засаду девушек-волчиц! +You are ambushed by an alkahestor! +Вы попали в засаду алкагестора! +Small blobs of slime fall from the ceiling! +Маленькие капельки слизи падают с потолка! +You are ambushed by slime researchers! +Вы попали в засаду исследователей слизи! +A large blob of slime falls from the ceiling! +С потолка падает большая капля слизи! +In a puff of smoke, a group of fire elementals appear around you! +В клубах дыма вокруг вас появляется группа огненных элементалей! +In a flash of fog a group of ice elementals appear around you! +Во вспышке тумана вокруг вас появляется группа ледяных элементалей! +In a burst of mist, a group of water elementals appear around you! +Во вспышке тумана вокруг вас появляется группа водных элементалей! +A group of earth elementals rise out of the ground! +Группа элементалей земли поднимается из-под земли! +You hear pouring liquid and a group of rubber elementals come out of the walls! +Вы слышите, как льется жидкость, и группа резиновых элементалей выходит из стен! +In a flash of light, a group of air elementals appear around you! +Во вспышке света вокруг вас появляется группа элементалей воздуха! +Several ethereal hands appear all around you! +Вокруг вас появляется несколько эфирных рук! +You have stumbled upon a conjurer's study! +Вы наткнулись на исследование мага сотворения! +You have stumbled upon a conjurer's study! +Вы наткнулись на исследование мага сотворения! +You are ambushed by a group of maids! +Вы попали в засаду группы горничных! +You are ambushed by a group of maids! +Вы попали в засаду группы горничных! +You are ambushed by a group of maids! +Вы попали в засаду группы горничных! +The Head Maid corners you! +Старшая горничная загоняет вас в угол! +A vine crawls from the ground, already wrapping around your feet! +Лоза выползает из земли и обвивается вокруг ваших ног! +You find a magic orb, containing a Spell Point. However, a Goddess owns this artifact.. +Вы находите магический шар, содержащий Очко Способностей. Однако этим артефактом владеет Богиня.. +You find a magic orb, containing the SHCL spell 'SPLNME' and angering a goddess. +Вы находите магический шар, содержащий заклинание SHCL 'SPLNME' и гневаете богиню. +You find a magic orb, containing a random spell and angering a goddess. +Вы находите магический шар, содержащий случайное заклинание и гневаете богиню. +Should you break it, she will send her minions after you. Which Goddess will you anger? +Если вы его разобьете, она пошлет за вами своих приспешников. Какую богиню вы разгневаете? +An altar stands before you, bestowing a heavenly contract. +Перед вами стоит алтарь, дарующий небесный контракт. +Do you choose to accept its terms? +Принимаете ли вы его условия? +Are you sure? This choice is final. +Вы уверены? Этот выбор является окончательным. +Yes, I will accept. +Да, я согласна. +(Accept the contract) +(Принять контракт) +I'll think about it. +Я подумаю об этом. +You are frozen! +Вы замерзли! +You are chilled! +Ты переохладились! +Shadowy tendrils wrap around your feet, rooting you in place!!! +Призрачные щупальца обвиваются вокруг ваших ног, удерживая вас на месте!!! +You get the feeling that someone is searching for you... +У вас возникает ощущение, что кто-то ищет вас... +You hear movements all around as you realize you are surrounded!!! +Вы слышите движения вокруг и понимаете, что вы окружены!!! +There is another restraint underneath! +Под этим есть еще один ограничитель! +Your restraints rub you in sensitive places as you move... +Ваши ограничители натирают вас в чувствительных местах, когда вы двигаетесь... +Indifferent +Безразлична +Angered +Разгневана +Enraged +Разъярена +Cursed +Проклята +Thankful +Благодарна +Pleased +Довольна +Blessed +Благословлена +Neutral +Нейтралитет +Annoyed +Раздражение +Hostile +Вражда +Wanted +В розыске +Friendly +Дружелюбие +Allied +Союзник +Favorable +Благосклонно +You run up against the TETHER pulling you back. +Вы натыкаетесь на TETHER, тянущий вас назад. +You are yanked back by the TETHER! +Вас тянут назад за TETHER! +We will be going for a walk. Follow me. +Мы отправимся на прогулку. Следуй за мной. +Don't get comfortable. Im taking you to a new cell. Follow me. +Можешь не спешить обустраиваться. Я отведу тебя в новую камеру. Следуй за мной. +We're going to have some fun. Follow me. +Мы собираемся немного повеселиться. Следуй за мной. +I told you to follow me! +Я сказала тебе следовать за мной! +I said, FOLLOW ME! +Я сказала, СЛЕДУЙ ЗА МНОЙ! +I won't repeat myself +Я не буду повторяться +Then let's put you back in your cell! +Тогда давай посадим тебя обратно в твою камеру! +I hope you learned your lesson. Now get your butt out of here. +Я надеюсь, ты усвоила свой урок. А теперь убирай свою задницу отсюда. +You've been a good girl. I hope you don't make the same mistake again. You can leave. +Ты была хорошей девочкой. Я надеюсь, ты больше не совершишь ту же ошибку. Ты можешь уходить. +That's a good girl. Now behave yourself, okay? You're free to go. +Ты хорошая девочка. Так что теперь веди себя хорошо, ладно? Ты можешь идти. +Looks like you got yourself in a bind! (she pats your butt playfully) Go make the others happy! +Похоже, ты попала в затруднительное положение! (она игриво похлопывает тебя по заднице) Иди и сделай счастливыми других! +Good girl. +Хорошая девочка. +You'll be making others happy in no time. +Ты в мгновение ока сделаешь других счастливыми. +You're shaping up to be a good slave. +Ты становишься хорошей рабыней. +I wish I could take you to my room... +Жаль, что я не могу отвести тебя в свою комнату... +It seems your training is going well. +Похоже, твое обучение проходит хорошо. +Perhaps you are enjoying this, hehe. +Возможно, тебе это нравится, хе-хе. +You've been very good this walk. Here is your reward. +Ты была очень хороша на этой прогулке. Вот твоя награда. +The EnemyName gives you a ItemName +EnemyName дает вам ItemName +The EnemyName starts adding a RestraintName! +EnemyName добавляет вам RestraintName! +You're missing part of your uniform. +У тебя не хватает части униформы. +The EnemyName starts to remove your RestraintName! +EnemyName снимает с вас RestraintName! +The EnemyName starts to lock your RestraintName! +EnemyName запирает ваш RestraintName! +The EnemyName locks your RestraintName with a LockType! +EnemyName запирает ваш RestraintName на LockType! +I am going to change your restraints. Hold still! +Я собираюсь сменить твои оковы. Стой спокойно! +Just need to add a little security~ +Просто нужно немного повысить безопасность~ +Got yourself in trouble, eh? +Вляпалась в неприятности, а? +Looks like you're shaping up to be a good girl~ +Похоже, ты становишься хорошей девочкой~ +Oh! Looks like I've made a mistake... +О! Похоже, я допустил ошибку... +404 prisoner not found. Releasing tether. +404 заключенный не найден. Разрыв связи. +A EnemyName approaches you in your cell. +EnemyName подходит к вам в вашей камере. +A EnemyName appears to check on you. +Появляется EnemyName, чтобы проверить вас. +The EnemyName leaves and locks the cell behind her. +EnemyName уходит и запирает за собой камеру. +Layered underneath: +Прикрыто под: +Layered with: +Наложено на: +Increased strictness due to: +Повышенная строгость из-за: +Mana +Мана +Bondage +Бондаж +Ask for Aid +Попросите о помощи +Become a Champion +Стать чемпионом +Ask +Спросить +Ask for Rescue +Попросить о спасении +Offer +Пожертвовать +Offer Penance +Пожертвовать в качестве покаяние +Current Champion +Действующий чемпион +Switch Champion +Сменить чемпионство +Become the champion of this goddess. Capturing bound enemies will grant +1 rep. +Стать чемпионом этой богини. Захват скованных врагов даст +1 репутации. +You are now the champion of the Goddess of GODDESS. +Теперь вы защитник Богини GODDESS. +For 3 rep the goddess will grant you slipperiness, boosting your struggling. +За 3 репутации богиня дарует вам 'скользкость', усиливая вашу борьбу. +For 3 rep the goddess will grant you a key. +За 3 репутации богиня дарует вам ключ. +For 3 rep the goddess will grant you +За 3 репутации богиня дарует вам +For 3 rep the goddess +За 3 репутации богиня +For 3 rep the goddess +За 3 репутации богиня +For 3 rep the goddess +За 3 репутации богиня +For 3 rep the goddess +За 3 репутации богиня +For 3 rep the goddess +За 3 репутации богиня +The goddess will fully restore your mana in exchange for AMOUNT rep +Богиня полностью восстановит вашу ману в обмен на AMOUNT репутации +The goddess will enjoy seeing you struggle in her bonds (raises submissiveness) +Богине понравится видеть, как вы боретесь с её оковами (повышает покорность) +The Goddess may decide to send an angel to help you struggle, in exchange for 10 rep +Богиня может решить послать ангела, чтобы помочь вам бороться с ограничителями, в обмен на 10 репутации +The Goddess will expect you to pay AMOUNT gold for +5 rep +Богиня ожидает, что вы заплатите AMOUNT золота за +5 к репутации +The Goddess hears your plea! +Богиня услышала вашу мольбу! +The Goddess hears your plea but has decided not to care. +Богиня услышала вашу мольбу, но решила не обращать на нее внимания. +The Goddess fills your mind with heavenly images as she channels energy through your veins. +Богиня наполняет ваш разум небесными образами, направляя энергию по вашим венам. +Time stops as an angel of heaven appears to collect your payment. +Время останавливается, и появляется небесный ангел, чтобы забрать ваш платеж. +You shudder and tremble as a wave of pleasure washes over you! +Вы вздрагиваете и трепещете, когда волна удовольствия захлестывает вас! +You lose control of yourself as you convulse in pleasurable bliss! +Вы теряете контроль над собой, содрогаясь в приятном блаженстве! +You let out a moan as you feel the ecstasy of pleasure! +Вы издаете стон, когда испытываете экстаз наслаждения! +You finally let out a deep breath as you get what you've waited for! +Вы наконец-то делаете глубокий вдох, когда получаете то, чего так долго ждали! +Your whole body thrashes about as you experience long-awaited pleasure! +Все ваше тело трепещет, когда вы испытываете долгожданное удовольствие! +Your release comes with a bang as your body rocks back and forth! +Ваше освобождение наступает со взрывом, когда ваше тело раскачивается взад-вперед! +You wiggle your hips in ecstasy as you experience pure bliss! +Вы покачиваете бедрами в экстазе, испытывая чистое блаженство! +You are left gasping for air as you receive your long-awaited orgasm! +Вам остается только хватать ртом воздух, когда вы получаете свой долгожданный оргазм! +You finally are left rocking your body wildly in sheer pleasure! +Наконец-то! Вам остается только дико дрожать всем телом от чистого удовольствия! +A powerful wave of pleasure comes over you as you convulse in ecstasy. +Мощная волна удовольствия захлестывает вас, когда вы бьетесь в конвульсиях экстаза. +Your breathing intensifies as you lose control of yourself! +Ваше дыхание учащается по мере того, как вы теряете контроль над собой! +You close your eyes and breath rapidly in anticipation... +Вы закрываете глаза и учащенно дышите в предвкушении... +You tilt your head back and moan as your heart beats faster... +Вы откидываете голову назад и стонете, а ваше сердце бьется всё быстрее... +You groan with pleasure as you approach the edge... +Вы стонете от удовольствия, приближаясь к грани... +You whimper as you rub your legs together furiously... +Вы хнычете, яростно потирая ноги друг о друга... +You feel frustrated as the stimulation isn't quite enough... +Вы чувствуете разочарование, поскольку стимуляции недостаточно... +Your whole body shakes, but you don't quite go over the edge... +Все ваше тело трясется, но не переходит грань... +This is starting to feel like torture... +Это начинает походить на пытку... +You let out a frustrated scream as the torment continues... +Вы издаете разочарованный крик, в то время как мучения продолжаются... +You simmer just under the edge, heart racing, breathing quickly... +Вы кипите на грани, сердце бешено колотится, дыхание учащенное... +You let out an anguished moan as release dances just out of reach... +Вы издаете мучительный стон, когда кульминация танцует где-то в недосягаемости... +You squirm helplessly as your futile struggles simply arouse you more... +Вы беспомощно извиваетесь, поскольку ваша тщетная борьба только еще больше возбуждает вас... +The vibration suddenly weakens. +Вибрация внезапно ослабевает. +Your toys cease vibrating abruptly. +Ваши игрушки внезапно перестают вибрировать. +The vibrators cut off suddenly, leaving you wanting. +Вибраторы внезапно отключаются, оставляя вас в одиночестве. +The toys turn off at the last moment, cutting you off. +Игрушки выключаются в последний момент, отрезая вас от кульминации. +The toys leave you without pleasure as they turn off. +Игрушки выключаются и оставляют вас без удовольствия. +You are left feeling empty as the toys stop vibrating. +Вы остаетесь с чувством опустошенности, когда игрушки перестают вибрировать. +You stomp your foot on the ground in frustration as the vibration ceases. +Вы в отчаянии топаете ногой по земле, когда вибрация прекращается. +The toys leave you in agony as they cease vibrating. +Игрушки оставляют вас в агонии, когда перестают вибрировать. +The toys torture you by stopping at the last moment. +Игрушки мучают вас, останавливаясь в последний момент. +The toys stop just before you lose yourself. +Игрушки останавливаются как раз перед тем, как вы потеряете себя. +The toys deny you a chance to finish. +Игрушки лишают вас шанса кончить. +You try to pleasure yourself, but your chastity belt prevents you! +Вы пытаетесь доставить себе удовольствие, но ваш пояс верности мешает вам! +You play with yourself... +Вы играете сами с собой... +You let your hands wander for a moment... +Вы позволяете своим рукам на мгновение блуждать... +You squirm your hips and whimper in your bindings... +Вы третесь бедрами и хнычете в своих путах... +Your instincts are getting the better of you... +Ваши инстинкты берут верх над вами... +Your body shudders briefly from pleasure... +Ваше тело коротко вздрагивает от удовольствия... +You are unable to control yourself. +Вы не в состоянии контролировать себя. +You play with yourself using the magic wand... +Вы играете сами с собой, используя волшебную палочку... +You would never do such a thing. +Вы бы никогда такого не сделали. +You try to rub your erogenous zones by squirming your legs... +Вы пытаетесь потереть свои эрогенные зоны, двигая ногами... +Your will is draining as you crave release, but can't quite get there without help... +Ваша воля истощается, поскольку вы жаждете кульминации, но не можете достичь её без посторонней помощи... +Your will is draining as your heart beats faster and your body trembles... +Ваша воля истощается, ваше сердце бьется быстрее, а тело дрожит... +Your will is draining as you simmer just under the edge... +Ваша воля истощается по мере того, как вы стенаете на самой грани... +Your will is draining as you crave release, and the toys continue to vibrate... +Ваша воля истощается по мере того, как вы всё сильнее жаждете кульминации, а игрушки всё продолжают вибрировать... +Your will is draining as the toys continue buzzing... +Ваша воля истощается по мере того, как игрушки продолжают жужжать... +Your will is draining as you are tormented by vibrations... +Ваша воля истощается, поскольку вас мучают вибрации... +A buzzing vibration wakes you up! +Сильная вибрация будит вас! +Your RestraintName constricts, warning you not to misbehave! +Ваш RestraintName затягивается, предупреждая вас не вести себя плохо! +Your RestraintName tightens painfully to punish your misbehavior! +Ваш RestraintName болезненно затягивается, чтобы наказать вас за недостойное поведение! +Your RestraintName punishes you for your behavior! +Ваш RestraintName наказывает вас за ваше поведение! +Your RestraintName punishes you and warns you with a harsh beep! +Ваш RestraintName наказывает вас и предупреждает резким звуковым сигналом! +Your RestraintName emits a red flash, causing you to feel faint! +Ваш RestraintName испускает красную вспышку, заставляя вас почувствовать слабость! +Your armor makes noise as you move around! +Ваша броня издает шум, когда вы двигаетесь! +Your RestraintName lets out an alert! +Ваш RestraintName испускает сигнал тревоги! +Your RestraintName stimulates you to hinder your efforts! +Ваше RestraintName стимулирует вас, чтобы препятствовать вашим усилиям! +Your RestraintName stimulates you and beeps loudly! +Ваше RestraintName стимулирует вас и подает громкий звуковой сигнал! +A golden lock fades into a blue lock on one of your restraints! +Золотой замок на одном из ваших ограничителей превращается в синий замок! +Your command word is heard and the magic lock(s) click and fall off! +Звучит ваше командное слово, и магические замки отщелкиваются и спадают! +Your command word is heard and the charger unlocks! +Звучит ваше командное слово, и зарядное устройство разблокируется! +Are you sure you want to attack? +Вы уверены, что хотите атаковать? +Are you sure you want to go to the next level? (Click self to confirm) +Вы уверены, что хотите перейти на следующий уровень? (Нажмите на себя для подтверждения) +You shudder as you apply the RestraintName to yourself... +Вы вздрагиваете, когда надеваете на себя RestraintName... +You insert the RestraintName and close your belt's shield over it, with a click as it locks in place. +Вы вставляете RestraintName и закрываете его защитным экраном вашего ремня, который со щелчком фиксируется на месте. +You attack the RestraintName and close your bra's shield over it, with a click as it locks in place. +Вы прижимаете RestraintName и закрываете его щитком вашего бюстгальтера, который со щелчком фиксируется на месте. +You slowly put on the RestraintName, amazed at how it seems to mold to your size... +Вы медленно надеваете RestraintName, поражаясь тому, как оно, кажется, подстраивается под ваш размер... +You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! +Вы боретесь, но всё бестолку. Здесь нет замочной скважины, а материал практически неразрушимый! +Ancient Chastity Belt +Древний пояс целомудрия +You find a chastity belt, glowing magnificently, along with a strange crystal next to it. +Вы находите величественно сияющий пояс целомудрия, а рядом с ним странный кристалл. +A chastity belt of sleek, ancient design. While powered, it gives -30% miscast chance due to distraction and slowly regenerates stamina. +Пояс верности изящного древнего дизайна. Когда заряжен, он дает -30% шанса осечки из-за возбуждения и медленно восстанавливает выносливость. +'Belt of the devoted' +'Пояс посвященной' +You tug at your chastity belt, but you can't even stick a finger inside because it's so tight... +Вы тянете за свой пояс верности, но не можете просунуть внутрь даже палец, ибо он ну слишком тугой... +Ancient Chastity Bra +Древний бюстгальтер целомудрия +You find a chastity bra, glowing magnificently, along with a strange crystal next to it. +Вы находите величественно сияющий бюстгальтер целомудрия, а рядом с ним странный кристалл. +A chastity bra of sleek, ancient design. While powered, it reduces incoming damage from attacks by 20. +Бюстгальтер целомудрия изящного древнего дизайна. Когда заряжен, он уменьшает входящий урон от атак на 20. +'Shield of the chaste' +'Щит целомудренной' +You rub your hands along your breasts but feel only hard, unbreakable metal. +Вы проводите руками по груди, но чувствуете только твердый, неразрушимый металл. +Ancient Heels +Древние каблуки +You find a set of glowing heels, glowing magnificently, along with a strange crystal next to it. +Вы находите пару величественно сияющих туфель на каблуках, а рядом с ними странный кристалл. +A pair of towering heels, enchanted with combat magic. When powered, they reduce slow level by 1, and deal 25 shadow damage on-hit with brief slow. +Пара высоких каблуков, зачарованных боевой магией. Когда заряжены, они уменьшают уровень замедления на 1, и при ударе наносят 25 единиц урона Тьмой с кратковременным замедлением. +'Shoes of the graceful' +'Туфли изящной' +You can barely stand in these heels. They are rigid, metallic, and unbreakable, yet padded on the inside. +Вы едва можете стоять на этих каблуках. Они сделаны из твёрдого металла, неразрушимые, но зато с подкладкой. +Ancient Blindfold +Древняя повязка на глаза +You find a padded metal blindfold, glowing magnificently, along with a strange crystal next to it. +Вы находите величественно сияющую металлическую повязку с подкладкой, а рядом с ней странный кристалл. +A full-blackout mask. When powered, it negates accuracy penalties due to vision, boosts accuracy by +100%, and boosts melee damage by +10. +Маска с полным затемнением. Когда заряжена, она сводит на нет потери точности из-за зрения, повышает точность на +100% и увеличивает урон в ближнем бою на +10. +'Mask of the Warrior' +'Маска воительницы' +You tug at the mask but it won't come off. It's molded so close to your face that no light shines through! +Вы тянете за маску, но она не снимается. Она так плотно прилегает к вашему лицу, что сквозь неё не проникает свет! +Ancient Muzzle +Древний намордник +You find a muzzle with a long rubbery plug on the inside, glowing magnificently, along with a strange crystal next to it. +Вы находите величественно сияющий намордник с длинной резиновой заглушкой внутри, а рядом с ним странный кристалл. +A muzzle that seals over the face tightly. When powered, it regenerates mana, boosts sneak, and multiplies damage dealt to unaware enemies by 2.5x. +Намордник, который плотно прилегает к лицу. Когда заряжен, он восстанавливает ману, повышает скрытность и увеличивает урон, наносимый ничего не подозревающим врагам, в 2,5 раза. +'Muzzle of the Saboteur' +'Молчание диверсанта' +You claw at your face, but not only does the soft plug fill your mouth completely, the muzzle itself is nigh-unbreakable! +Вы хватаетесь за лицо, но мягкая пробка не только полностью заполняет рот, но и сам намордник кажется практически неразрушимым! +Ancient Gag +Древний кляп +You find a ball gag harness with a long rubbery plug instead of a ball, glowing magnificently, along with a strange crystal next to it. +Вы находите величественно сияющий кляп-шарик с длинной резиновой заглушкой с внутренней стороны, а рядом с ним странный кристалл. +A gag that fills the mouth. When powered, regens mana, reduces miscast by 30%, and boosts damage to enemies that are stunned, frozen, bound, or slowed by 30%. +Кляп, который полностью заполняет рот. Когда заряжен, он восстанавливает ману, уменьшает вероятность осечки на 30% и увеличивает урон по оглушенным, замороженным, связанным или замедленным врагам на 30%. +'Gag of the Focused' +'Кляп сосредоточенности' +You tug on the straps at your cheeks, but the straps are so tight the plug doesn't even move! +Вы тянете за ремешки на щеках, но они настолько тугие, что пробка даже не двигается! +Ancient Rear Plug +Древняя анальная пробка +You find a huge, flexible, segmented plug, along with a strange crystal next to it. +Вы находите огромную, гибкую, сегментированую пробку, а рядом с ней странный кристалл. +A plug that shocks the wearer when someone disciplines them, after orgasm, and mildly when spellcasting. When powered, reduces miscast chance by 30%. +Пробка, которая шокирует владельца, когда кто-то поучает его, после оргазма и слегка при произнесении заклинаний. Когда заряжена снижает вероятность осечки при чтении заклинания на 30%. +'Plug of the Obedient' +'Пробка послушания' +You realize the magical plug has expanded inside your body. It won't come out. +Вы осознаете, что волшебная пробка расширилась внутри вашего тела. Она не выйдет наружу. +Ancient Plug +Древняя пробка +You find a huge, ribbed plug, along with a strange crystal next to it. +Вы находите огромную ребристую пробку, а рядом с ней странный кристалл. +A plug that denies the wearer constantly and only rarely grants release. When powered, it grants +70% magic resistance (about 40% reduction). +Пробка, которая постоянно отказывает владельцу в оргазме и лишь изредка позволяет достичь кульминации. Когда заряжена дает +70% к сопротивлению магии (Примерно 40% снижение урона). +'Plug of the Perseverant' +'Пробка упорства' +You realize the magical plug has expanded inside your body. It won't come out. +Вы осознаете, что волшебная пробка расширилась внутри вашего тела. Она не выйдет наружу. +Ancient Stimulator +Древний стимулятор +You find a flat, round device with a hole on one side, along with a strange crystal next to it. +Вы находите плоское круглое устройство с отверстием с одной стороны, а рядом с ним странный кристалл. +A device that teases the wearer for casting spells and attacking. When powered, it reduces mana and stamina costs for casting spells and attacking. +Устройство, которое дразнит владельца за произнесение заклинаний и атаки. Когда заряжено, оно снижает затраты маны и выносливости на произнесение заклинаний и атаку. +'The Persuader' +'Средство убеждения' +You realize the magical device has attached to your body using suction. It won't come off! +Вы понимаете, что волшебное устройство прикрепилось к вашему телу с помощью силы всасывания. Оно не снимется! +Ancient Mittens +Древние варежки +You find a pair of shining gloves, glowing magnificently, along with a strange crystal next to it. +Вы находите пару величественно сияющих варежек, а рядом с ними странный кристалл. +Tight mittens that force the hands into fists. When powered, they increase all magic damage to enemies by 40%. +Плотные варежки, которые сжимают руки в кулаки. Когда заряжены, они увеличивают весь магический урон врагам на 40%. +'Mittens of Blasting' +'Варежки заклинательницы' +You rub your mittens together, but they are unfazed by anything you do to them and your hands are clasped tight. +Вы труте варежки друг о друга, но их не волнует, что вы с ними делаете. Ваши ладони остаются крепко сжаты. +Ancient Armbinder +Древний армбиндер +You find a monoglove, glowing magnificently, along with a strange crystal next to it. +Вы находите величественно сияющий армбиндер, а рядом с ним странный кристалл. +An extremely strict armbinder. When powered, reduces miscast chance by 30%, increases all magic damage to enemies by 40%, and increases spell range by 50%. +Чрезвычайно суровый армбиндер. Когда заряжен, уменьшает вероятность осечки на 30%, увеличивает весь ваш магический урон на 40% и увеличивает дальность применения заклинаний на 50%. +'Armbinder of the Artillerist' +'Армбиндер артиллеристки' +You try to wiggle your arms, but they can barely move in this position and are clasped tight. Your arms are sealed. +Вы пытаетесь пошевелить руками, но они едва могут двигаться в своём положении и крепко прижаты друг к другу. Ваши руки запечатаны. +Ancient Ankle Cuffs +Древние манжеты на лодыжки +You find a pair of glowing cuffs, glowing magnificently, along with a strange crystal next to it. +Вы находите пару величественно сияющих манжет, а рядом с ними странный кристалл. +A pair of cuffs designed for summoners. Heals nearby allies by 15 per turn, and also boosts your evasion by +50% (to 2/3rds). Closes without power. +Пара манжет, предназначенных для призывателей. Исцеляет близлежащих союзников на 15% за ход, а также увеличивает ваше уклонение на +50% (до 2/3). Сковываются при разрядке. +'Anklets of the Faithful Friend' +'Ножные браслеты верного друга' +You jingle the chains around and realize that these unbreakable restraints won't be coming off. +Вы позвякиваете цепями и понимаете, что эти нерушимые оковы не снимутся. +Ancient Ankle Cuffs +Древние манжеты на лодыжки +...when powered down, they snap together, rendering the wearer immobile. +... при потере заряда они примагничиваются друг к другу, лишая владельца мобильности. +'Anklets of the Unfaithful Friend' +'Ножные браслеты неверного друга' +You struggle fruitlessly. There is no keyhole and the material is nigh-unbreakable! +Вы боретесь, но всё бестолку. Здесь нет замочной скважины, а материал практически неразрушимый! +You search for your ancient keys but it seems they were taken away for good. +Вы ищете свои древние ключи, но, похоже, они исчезли навсегда. +Random (-10% rep loss) +Случайно (-10% потери репутации) +You don't have any valid targets on your body for that. +Для этого у вас на теле нет никаких подходящих мишеней. +The air swirls with traces of pleasing magic... +В воздухе витают следы магии удовольствия... +The spores make you feel sleepy... +Споры вызывают у вас сонливость... +Physical Block: AMOUNT +Физической блок: AMOUNT +Magic Block: AMOUNT +Магический блок: AMOUNT +DAMAGETYPE: MULTIPLIERx modifier +DAMAGETYPE: MULTIPLIERx модификатор +Physical Armor: AMOUNT +Физическая защита: AMOUNT +Magic Armor: AMOUNT +Магическая защита: AMOUNT +Evasion: AMOUNT% +Уклонение: AMOUNT% +Deals DAMAGETYPE damage +Наносит DAMAGETYPE урон +AMNT% chance to hit you +С AMNT% шансом попадет по вам +Can disarm (chance: DISARMCHANCE%) +Может разоружить (шанс: DISARMCHANCE%) +Resistances: +Сопротивления: +### HP: + +Shield: +Щит: +Binding: +Сковывание: +Ambivalent +Двойственное +Likes you +Вы ей нравитесь +Loves you +Любит вас +Adores you +Обожает вас +Dislikes you +Не любит вас +Hates you +Ненавидит вас +Despises you +Презирает вас +Talking to you +Говорит с вами +Aware of you! +Знает о вас! +Pursuing you! +Преследует вас! +Ignoring you! +Игнорирует вас! +Investigating! +Осматривается! +Suspicious +Что-то подозревает +Notices you! +Заметила вас! +Unaware +Ничего не подозревает +Items carried: +Предметы с собой: +Items worn: +Надетые предметы: +...and NUMBER more +...и ещё NUMBER +Takes damage if the caster is stunned +Получает урон если заклинатель оглушен +Disappears if the caster is defeated +Исчезает, если заклинатель побежден +Caster: ENEMYNAME +Призыватель: ENEMYNAME +Demise imminent +Неизбежная кончина +Vulnerable +Уязвимость +Stunned +Оглушение +Snared +Стреноживание +Slowed +Замедление +Silenced +Немота +Disarmed +Без оружия +Blinded +Ослепление +Apprehended! +Арестована! +Restrained! +Скована! +Restricted! +Ограничена! +Fully Bound! +Полностью скована! +Trussed up! +Связана! +Tightly Secured! +Плотно связана! +Inescapably +Не сбежать +Trussed up! +Связана! +Trussed up! +Связана! +Helpless! +Беспомощна! +Belted +В поясе +Wearing a toy +С игрушками +Vibed! +Вибрирует! +Flying +Полет +Distracted! +Возбуждена! +Soap +Очищающий +Acid +Кислота +Shadow +Тьма +Holy +Свет +Arcane +Аркана +Ice +Лёд +Ice +Лёд +Fire +Огонь +Poison +Яд +Poison Gas +Ядовитый газ +Charm +Очарование +Tickle +Щекотка +Grope +Ощупывание +Crush +Дробящий +Gravity +Гравитация +Pierce +Пронзающий +Slash +Рубящий +Pain +Боль +Spirit Draining +Истощение духа +Psychic +Психический +Mana Draining +Истощение маны +Electric +Электричество +E-Stim +Э-Стим +Shock +Шок +Plush +Мягкость +Blast +Взрыв +Blast +Взрыв +Chain +Цепной +Gas +Газ +Glue +Слизь +Unarmed +Без оружия +Physical +Физическое +Magic +Магия +Spell +Заклинание +Unstoppable +Неудержимость +Unflinching +Непоколебимость ++Focus ++Разум ++Stamina ++Выносливость ++Willpower ++Сила воли ++Magic ++Магия +Discard (destroys it permanently!) +Выбросить (уничтожает его безвозвратно!) +You crit the vulnerable EnemyName for AMOUNT extra damage! +Вы наносите крит. удар по уязвимому противнику EnemyName, нанося AMOUNT дополнительно урона. +You crit the unsuspecting EnemyName for AMOUNT extra damage! +Вы наносите крит. удар по ничего не подозревающему противнику EnemyName, нанося AMOUNT дополнительно урона. +The enemy steals a pick from you! +Враг крадет у вас кирку! +The enemy takes away your knife! +Враг отбирает у вас нож! +The enemy steals a key from your body! +Враг крадет ключи с вашего тела! +The enemy wrests away your magical knife! +Враг отбирает у вас волшебный нож! +The enemy takes away your precious magic key! +Враг забирает ваш драгоценный волшебный ключ! +The enemy steals one ITEMSTOLEN from you! +Враг крадет один ITEMSTOLEN у вас! +You get your stolen items back. +Вы получаете обратно свои украденные вещи. +The EnemyName manages to retreat with your items! +EnemyName умудряется убежать с вашими вещами! +The orb contains knowledge of SPELL. +Сфера содержит знания о SPELL. +You capture the EnemyName. +Вы пленили EnemyName. +You capture the EnemyName. +Вы пленили EnemyName. +You capture the EnemyName in the name of the goddess of GODDESS. +Вы пленили EnemyName во имя богини GODDESS. +You capture the EnemyName, but the goddess of GODDESS would prefer that you be in uniform (wear her restraint). +Вы пленили EnemyName, но богиня GODDESS предпочла бы, чтобы вы были в униформе (носите ее ограничители). +You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! +Вы пленили EnemyName, но богиня GODDESS требует, чтобы вы надели несколько ограничителей! +You capture the EnemyName, but the goddess of GODDESS would prefer that you wear some restraints. +Вы пленили EnemyName, но богиня GODDESS предпочла бы, чтобы вы носили какие-нибудь ограничители. +You capture the EnemyName, but the goddess of GODDESS demands that you wear several restraints! +Вы пленили EnemyName, но богиня GODDESS требует, чтобы вы надели несколько ограничителей! +You capture the EnemyName, but have reached the limit for rewards this floor. +Вы пленили EnemyName, но достигли предела для получения наград на этом этаже. +The spirit inside the restraint is vengeful and emerges to wreak havoc on the world! +Дух, заключенный в ограничителе, желает мести и появляется, чтобы посеять хаос в мире! +You hide inside the container... +Вы прячетесь внутри контейнера... +You hide inside the chest... +Вы прячетесь внутри сундука... +It's a crumpled piece of scrap metal with a sharp edge. +Это смятый кусок металлолома с острым краем. +You use the scrap to try and cut the item. +Вы используете обломок, чтобы попытаться разрезать предмет. +You rub the item against the broken object's sharp edges... +Вы третесь предметом об острые края обломка... +A hook hangs at shoulder height. +Крючок висит на высоте плеч. +The hook is too high up! You can't reach it... +Крючок слишком высоко! Вы не можеште дотянуться до него... +There's a hook on the wall. +На этой стене есть крючок. +The wall is cracked. +Эта стена треснула. +You rub yourself on the corner... +Вы трётесь об угол... +Many ropes emerge around you, removing weaker ropes from your body and binding enemies! +Вокруг вас появляется множество веревок, снимающих более слабые веревки с вашего тела и связывающих врагов! +Choose Class: +Выберите класс: +Distraction Mode: +Режим возбуждения: +Progression Mode: +Режим прогрессии: +Key Hunt +Охота за ключами +Random +Случайно +Selected +Выбор +You will need to find the key to proceed to the next floor. +Вам нужно будет найти ключ, чтобы подняться на следующий этаж. +Each floor will have a random task to unlock the stairs. +На каждом этаже выполните случайное задание, чтобы открыть лестницу. +You will select your task for each floor before you enter. Requires Perk Progression. +Перед входом на каждый этаж вы выберете задание. Требуется Прогрессия Перков. +Perks Mode: +Режим привилегий: +Standard +Обычный +Extra +Больше +Less +Меньше +Much Less +Гораздо меньше +No pain, no gain. +Не плохо, но и не хорошо. +Gain 20 extra perk points, to give you a false sense of security. +Получите 20 доп. очков привилегий, которые дадут вам ложное чувство безопасности. +Lose 20 perk points, just to keep things interesting. +Потеряйте 20 очков привилегий, просто чтобы сделать приключение интереснее. +Lose 50 perk points, making things very interesting. +Потеряйте 50 очков привилегий, чтобы сделать всё очень интересным. +Perk Progression Mode: +Режим прогрессии перков: +Disabled +Отключено +Optional +Опционально +Mandatory +Обязательно +Debuffs Only +Только дебаффы +No perks between floors. +Без перков между этажами. +The standard mode. You may choose between one of three perk altars between floors. +Стандартный режим. Вы можете выбрать один из трех алтарей с перками между этажами. +A twist on the standard mode. You must choose before progressing. +Стандартный режим с изменением. Вы должны выбрать один алтарь, прежде чем продолжить. +You must pick a debuff between floors before progressing. +Вы должны выбрать дебафф между этажами, прежде чем продолжить. +Perk Shrine Bondage: +Бондаж в святилищах с перками: +Never +Никогда +Sometimes +Иногда +Always +Всегда +Perk shrines will not offer bondage as part of the deal. +Святилища с перками не будут предлагать бондаж как часть сделки. +Bondage will sometimes be offered alongside perks. +Иногда бондаж будет предлагаться вместе с перками. +Perk shrines are always accompanied by bondage. +Святилища с перками всегда сопровождаются бондажом. +Perk Shrine Bondage Info: +Данные о бондаже в свят. с перками: +Hidden +Скрыть +Partial +Частичные +Full +Полные +You do not know if a perk shrine will apply bondage. +Вы не знаете, применит ли святилище перков бондаж. +You know that a perk shrine will apply bondage, but not what kind. +Вы знаете, что святилище перков применит к вам бондаж, но не какой именно. +You know the exact restraints a perk shrine will apply. +Вы знаете точные ограничители, которые будет применять святилище перков. +Difficulty: +Сложность: +Normal Mode +Нормально +Hard Mode +Сложно +Extreme Mode +Экстрим +A supposedly reasonable difficulty curve. +Предположительно разумная кривая сложности. +Play the game the way it was intended. Cruel and restrictive. +Играйте в игру так, как она была задумана. Жестокость и строгость. +Play at your own peril. Unlocked by double-clicking the Hard Mode button. +Играйте на свой страх и риск. Разблокируется двойным щелчком по кнопке 'Сложного' режима. +Distracted +Отвлечённая +Aroused +Похотливая +Removes all chastity belts, vibrating restraints, plugs, and removes the option to play with yourself. +Удаляет все пояса верности, вибрирующие ограничители, пробки и лишает возможности играть с самой собой. +Includes all that good stuff. +Включает в себя все самые лучшие вещи. +Allow Front Plugs +Разрешить пробки спереди +Allow Rear Plugs +Разрешить пробки сзади +Allow Piercings +Разрешать пирсинг +Fighter +Воительница +Start with 150 willpower and Iron Will, good at melee and blocking attacks. +Начните с 150 силы воли и Железной Волей. Хороша в ближнем бою и блокировании атак. +Rogue +Ассасин +Start with 150 stamina and Sneaky, good at stealth and evasive gameplay. +Начните с 150 выносливости и Тихоней. Хорошо разбирается в скрытности и стелс-геймплее. +Wizard +Маг +Start with 150 mana and Magical Sight, good at casting spells. +Начните с 150 единиц маны и магического зрения, хорошо умеете произносить заклинания. +Peasant +Крестьянка +Start with nothing to your name. For those who want a challenge. +Начните с чистого листа. Для тех, кто хочет челлендж. +Trainee +Стажер +You are a mage, but haven't finished your formal 'training'. Requires Aroused mode. +Вы маг, но еще не закончили свое формальное 'обучение'. Требуется режим 'Похотливая'. +Spell Choice: +Выбор заклинания: +Choose Spells +Выбранные заклинания +Random Spells +Случайные заклинания +Break orbs. Get points. Buy spells. It's that simple. +Разбивайте сферы. Получайте очки. Покупайте заклинания. Всё просто. +Break orbs and pray you get something good. +Разбивай сферы и молитесь, чтобы вам выпало что-нибудь хорошее. +Save Mode: +Режим сохранения: +Save Codes +Сейв-коды +Roguelike +Рогалик +Grants a save code every floor you can write down. Autosaves only on floor start. +Предоставляет копируемый код сохранения для каждого этажа. Автосохранение выполняется только в начале этажа. +No save codes, forced autosaves. You are in it to win it. +Никаких кодов сохранения, принудительное автосохранение. Победа или смерть. +Prison Strictness: +Строгость заключения: +Normal +Нормально +Easy +Легко +Strict +Сложно +If you get captured, you might get rescued if you have good relations. +Если вас схватят, вас могут спасти, если у вас есть с кем-то хорошие отношения. +If you get captured, you will always get rescued and pay a fee. +Если вас схватят, вас всегда спасут за определенную плату. +If you get captured, you are totally on your own. +Если вас схватят, вы будете полностью предоставлены сами себе. +Start Playing +Начать игру +Lock your settings in, nice and tight. +Зафиксируйте свои настройки, аккуратно и надежно. +Start with some perks that increase strictness and immersion. +Начните с некоторыми перками, которые повышают сложность и улучшают погружение. +Choose some perks to spice up your run. +Выберите несколько перков, чтобы оживить свою игру. +This game engages in safe and consensual analytics. +Эта игра использует безопасную и согласованную аналитику. +It sends data about spell choices, levels reached, etc, to help balance and improve the game. +Она отправляет данные о выборе заклинаний, достигнутых уровнях и т.д., чтобы помочь сбалансировать и улучшить игру. +No personal data is sent or stored. +Никакие персональные данные не отправляются и не сохраняются. +Accept +Согласиться +Don't Track Me +Не отслеживать ничего +Proceed +Продолжить +Your key to the stairs is taken away! +У вас забрали ключи от лестницы! +You found a keyring to the stairs! Now you just need to get there. +Вы нашли связку ключей от лестницы! Теперь вам просто нужно добраться туда. +Behold my SPL! +Сзади, SPL! +Mmmph... SPL... +Мммфх... SPL... +Oh noes... +Оу ноу... +Ueeee! +Уииии! +I don't want to be your slave! +Я не хочу быть твоей рабыней! +Catch me if you can! +Поймай меня, если сможешь! +Ueeee! +Уииии! +I don't want to be your slave! +Я не хочу быть твоей рабыней! +I've been naughty, looks like I need to be punished... +Я была непослушной, похоже, меня нужно наказать... +I've been a bad girl, won't you do something about it? +Я была плохой девочкой, неужели ты ничего не сделаешь с этим? +Mmmph... maybe I talk too much... +Хммм... может быть, я слишком много болтаю... +Well well, what have we got here? +Так-так, что у нас здесь? +You're not here to take away my pets, are you? +Ты здесь не для того, чтобы забрать моих питомцев, не так ли? +You'd make a lovely pet... +Из тебя получился бы прекрасный питомец... +Daww, you're so cute when you're struggling! +Боже, ты такая милая, когда связана! +Let's take you back to your space~ +Давай вернем тебя на место~ +You need to be bound tight! +Тебя нужно крепко связать! +Cleaning up for me, huh? +Приберешься за мной, а? +Uh uh, give that back! +Э-э-э, отдай это обратно! +What do we have here? An intruder? Or a future pet? +Кто это у нас тут? Вторженец? Или будущий домашний питомец? +I see how it is. +Я знаю, каково это. +I've taken on hundreds of adventurers like you. +Я сражалась с сотнями искателей приключений, подобных тебе. +You don't stand a chance. +У тебя нет ни единого шанса. +Your magic is nothing compared to mine! +Твоя магия ничто по сравнению с моей! +I've been a master wizard for over a thousand years! +Я была магистром более тысячи лет! +You call that a spell? +Ты называешь это заклинанием? +My spells are far superior! +Мои заклинания намного лучше! +She won't help you! +Она тебе не поможет! +Not yours! +Не твое! +Oh, that's not going to help~ +О, это не поможет~ +Let's play a game! +Давай сыграем в игру! +Didn't think you would get away, did you? +Ты ведь не думаешь, что тебе удастся сбежать? +Oh ho~ +Ох-хо-хо~ +'Tis but a scratch! +'Это всего лишь царапина! +You'll be my pet soon~ +Скоро ты станешь моим питомцем~ +Cute~ +Милашка~ +Cute~ +Милашка~ +Don't even try~ +Даже не пытайся~ +Don't even try~ +Даже не пытайся~ +It's over~ +Все кончено~ +Get over here! +Иди сюда! +Not so slippery now! +Теперь не такая верткая! +I'll be taking that~ +Я возьму это~ +'Click!' +'Щелк!' +In the name of PTRN, I order you to kneel! +Именем PTRN, я приказываю тебе встать на колени! +You're in my way. +Ты стоишь у меня на пути. +Step aside, pet. +Отойди в сторону, животное. +Get her, my pets! +Хватайте ее, мои питомцы! +Hey! Don't touch that! +Эй! Не трогай это! +Why you... +Почему ты... +You can't do that! +Ты не можешь этого сделать! +Leave them alone! +Оставь их в покое! +You can't do that! +Ты не можешь этого сделать! +Hey, stop that! +Эй, остановись! +Why do I hire these people... +Почему я наняла этих людей... +Activate SPL protocol. +Активировать протокол SPL. +What do you mean 'access denied'??? +Что еще за 'Отказано в доступе'??? +Release me at once. +Немедленно отпусти меня. +This is unacceptable! +Это неприемлемо! +Guards! Guards... Guards? Well drat. +Стража! Стража... Стража? Вот блин. +Catch me if you can! +Поймай меня, если сможешь! +You'll never get away with this! +Тебе это никогда не сойдет с рук! +I don't want to be your slave! +Я не хочу быть твоей рабыней! +I've been naughty, looks like I need to be punished... +Я была непослушной, похоже, меня нужно наказать... +I've been a bad girl, won't you do something about it? +Я была плохой девочкой, неужели ты ничего не сделаешь с этим? +Mmmph... maybe I talk too much... +Хммм... может быть, я слишком много болтаю... +Look, another one of my dolls~ +Смотри, еще одна из моих кукол~ +Come to me, my lovely thing~ +Иди ко мне, моя прелесть~ +I want to hear you moan~ +Я хочу услышать твои стоны~ +Perhaps we need to make things tighter? +Возможно, нам нужно ужесточить правила? +Come with me, dear~ +Пойдем со мной, дорогая~ +You've had too much freedom. +У тебя было слишком много свободы. +Leave that for the cleaning robots. +Оставь это роботам-уборщикам. +Skulking around, are we? +Шныряем где-то поблизости, не так ли? +I see you. +Я вижу тебя. +There's no point in fighting. +Нет смысла бороться. +How ineffectual. +Все бесполезно. +That's cute. +Это мило. +Your magical potential is impressive~ +Твой магический потенциал впечатляет~ +A magnificent display of magic! +Великолепное проявление магии! +You would make a great mana source~ +Из тебя получился бы отличный источник маны~ +Did you think you could outsmart me? +Неужели ты думала, что сможешь перехитрить меня? +I am the only goddess you need. +Я - единственная богиня, которая тебе нужна. +Dolls shouldn't mess with things they don't understand. +Куклы не должны вмешиваться в то, чего они не понимают. +Oh, that's not going to help~ +О, это не поможет~ +Let's take you somewhere safe~ +Давай отведём тебя в безопасное место~ +You won't be getting away. +Ты никуда не денешься. +Did you think that would work? +Ты думала, это сработает? +Let's put those hands of yours away~ +Давай уберем эти руки подальше~ +You are mine. +Ты моя. +You're a fast one. +А ты шустрая. +You're a fast one. +А ты шустрая. +Your antics amuse me~ +Твои выходки забавляют меня~ +Your antics amuse me~ +Твои выходки забавляют меня~ +It's time for your makeover! +Пришло время для твоего преображения! +Come to me. +Иди ко мне. +A shame it ends here. +Жаль, что на этом все заканчивается. +You won't be needing that. +Тебе это не понадобится. +Tsk Tsk. I'll be keeping the keys. +Тск-тск. Ключи останутся у меня. +I used to be an adventurer like you~ My name was PTRN... +Когда-то я была такой же авантюристкой, как и ты~ Меня звали PTRN... +You don't know who you're messing with. +Ты не знаешь, с кем связываешься. +You won't be allowed to make that mistake twice. +Тебе не позволено совершить эту ошибку дважды. +I'll punish you myself. +Я самолично тебя накажу. +Hands off my property. +Руки прочь от моей собственности. +Know your place, girl! +Знай свое место, девочка! +You've had your chance. +У тебя был шанс. +Fine, then. +Ла-а-адно. +Know your place! +Знай свое место! +You've had your chance. +У тебя был шанс. +*sighs* +*вздыхает* +Hmmph~ +Хммм~ +My mistake~ +Моя ошибка~ +This wasn't supposed to happen. +Этого не должно было случиться. +The Collector has become the Collected. +Коллекционер попал в Коллекцию. +Fine, you win! +Отлично, ты победила! +Cover me you brats! +Прикройте меня, идиоты! +She's coming for me! +Она идет за мной! +Stay away! +Держись подальше! +Time for a taste of my own medicine... +Пришло время попробовать мое собственное лекарство... +I've been a bad girl, won't you do something about it? +Я была плохой девочкой, неужели ты ничего не сделаешь с этим? +Mmmph... maybe I talk too much... +Хммм... может быть, я слишком много болтаю... +I wonder how many days we'll get to spend together! +Интересно, сколько дней мы проведем вместе? +You look so pretty as always, and forevermore~ +Ты выглядишь такой же красивой, как всегда, и так будет всегда~ +Time for an inspection~ +Пришло время инспекции~ +There's no use in struggling, dear! I've made sure it's extra tight. +Бесполезно сопротивляться, дорогая! Я позаботилась о том, чтобы тебе было очень туго. +Playtime is over, back to your cell~ +Время игр закончилось, возвращайся в свою камеру~ +Why aren't you wearing your restraints? +Почему ты носишь свои ограничители? +I did not order you to clean~ +Я не приказывал тебе прибираться~ +What's that you've got there? +Что это у тебя там? +Found you! +Нашла тебя! +I've been waiting for this~ +Я ждала этого~ +Show me your moves. +Покажи мне свои движения. +You'll make for a fine servant! +Из тебя получится отличная служанка! +Very impressive. +Весьма впечатляюще. +Yes, yes, show me what you've got! +Да, да, покажи мне, на что ты способна! +I've always wanted another mage. +Я всегда хотела еще одного. +Tsk tsk, no silly tricks~ +Тсс, тсс, без глупых трюков~ +Now now, you don't have permission to do that~ +Так вот, у тебя нет на это разрешения ~ +What do you think you're doing? +Что, по-твоему, ты делаешь? +Typical adventurers~ +Типичные искатели приключений~ +Oh, you got out? +О, ты выбралась? +Too bad~ +Очень жаль~ +That thing is dangerous, my dear~ +Эта штука опасна, моя дорогая~ +A feisty one, aren't you~ +Ты дерзкая, не так ли?~ +Playtime's over~ +Время игр закончилось~ +Very nice. +Очень хорошо. +Most impressive! +Очень впечатляет! +You need more training! +Тебе нужно больше тренироваться. +You need more training! +Тебе нужно больше тренироваться. +Come along now~ +А теперь пойдем со мной~ +Come closer, I want to see your face~ +Подойди ближе, я хочу видеть твое лицо~ +What a shame. +Какой позор. +What's this? +Что это такое? +See if you can get out of that! +Посмотрим, сможешь ли ты выбраться из этого! +I am the Warden. All things in this dungeon are subject to me. +Я Надзирательница. Все в этом подземелье подчиняется мне. +Hands off my pet~ +Руки прочь от моего питомца~ +Careful what you ask for~ +Будь осторожна со своими просьбами~ +Be gentle with her~ +Будь с ней понежнее~ +Careful what you ask for~ +Будь осторожна со своими просьбами~ +That's my property~ +Это моя собственность~ +Be gentle with her~ +Будь с ней понежнее~ +You've made some enemies, haven't you? +Ты нажила себе много врагов, не так ли? +I should teach you to be a nice girl. +Я должна научить тебя быть хорошей девочкой. +You need to learn some manners~ +Тебе нужно научиться хорошим манерам~ +This will be entertaining. +Это будет забавно. +Show me what you've got~ +Покажи мне, на что ты способна~ +I'll watch~ +Я наблюдаю~ +Submit to my SPL! +Подчинись моему SPL! +Hmmmph... SPL-- +Хмммфх... SPL-- +Fine then! Have it your way. +Тогда ладно! Будь по-твоему. +You'll be sorry you didn't listen to me~ +Ты пожалеешь, что не послушала меня~ +Why must you be so difficult! +Почему с тобой так трудно! +Cover me you brats! +Прикройте меня, идиоты! +They're coming for me! +Они идут за мной! +Stay away! +Держись подальше! +Time for a taste of my own medicine... +Пришло время попробовать мое собственное лекарство... +I've been a bad girl, won't you do something about it? +Я была плохой девочкой, неужели ты ничего не сделаешь с этим? +Mmmph... maybe I talk too much... +Хммм... может быть, я слишком много болтаю... +I wonder how many days we'll get to spend together! +Интересно, сколько дней мы проведем вместе? +You look so pretty as always, and forevermore~ +Ты выглядишь такой же красивой, как всегда, и так будет всегда~ +Time for an inspection~ +Пришло время инспекции~ +There's no use in struggling, dear! I've made sure it's extra tight. +Бесполезно сопротивляться, дорогая! Я позаботилась о том, чтобы тебе было очень туго. +Playtime is over, back to your cell~ +Время игр закончилось, возвращайся в свою камеру~ +Why aren't you wearing your restraints? +Почему ты носишь свои ограничители? +I did not order you to clean~ +Я не приказывал тебе прибираться~ +What's that you've got there? +Что это у тебя там? +Found you! +Нашла тебя! +I've been waiting for this~ +Я ждала этого~ +Show me your moves. +Покажи мне свои движения. +You'll make for a fine servant! +Из тебя получится отличная служанка! +Very impressive. +Весьма впечатляюще. +Yes, yes, show me what you've got! +Да, да, покажи мне, на что ты способна! +I've always wanted another mage. +Я всегда хотела еще одного. +Tsk tsk, no silly tricks~ +Тсс, тсс, без глупых трюков~ +Now now, you don't have permission to do that~ +Так вот, у тебя нет на это разрешения ~ +What do you think you're doing? +Что, по-твоему, ты делаешь? +Typical adventurers~ +Типичные искатели приключений~ +Oh, you got out? +О, ты выбралась? +Too bad~ +Очень жаль~ +That thing is dangerous, my dear~ +Эта штука опасна, моя дорогая~ +A feisty one, aren't you~ +Ты дерзкая, не так ли?~ +Playtime's over~ +Время игр закончилось~ +Very nice. +Очень хорошо. +Most impressive! +Очень впечатляет! +You need more training! +Тебе нужно больше тренироваться. +You need more training! +Тебе нужно больше тренироваться. +Come along now~ +А теперь пойдем со мной~ +Come closer, I want to see your face~ +Подойди ближе, я хочу видеть твое лицо~ +What a shame. +Какой позор. +What's this? +Что это такое? +See if you can get out of that! +Посмотрим, сможешь ли ты выбраться из этого! +Do you know of the Dollmaker? I've got a proposal for you and I... +Ты знаешь о Кукольнице? У меня есть предложение для нас с тобой... +Hands off my pet~ +Руки прочь от моего питомца~ +Careful what you ask for~ +Будь осторожна со своими просьбами~ +Be gentle with her~ +Будь с ней понежнее~ +Careful what you ask for~ +Будь осторожна со своими просьбами~ +That's my property~ +Это моя собственность~ +Be gentle with her~ +Будь с ней понежнее~ +You've made some enemies, haven't you? +Ты нажила себе много врагов, не так ли? +I should teach you to be a nice girl. +Я должна научить тебя быть хорошей девочкой. +You need to learn some manners~ +Тебе нужно научиться хорошим манерам~ +This will be entertaining. +Это будет забавно. +Show me what you've got~ +Покажи мне, на что ты способна~ +I'll watch~ +Я наблюдаю~ +I cast SPL! +Я использую SPL! +That wasn't supposed to happen! +Этого не должно было случиться! +This is too tight... +Это слишком туго... +You'll never get away with this! +Тебе это никогда не сойдет с рук! +I can't get free! +Я не могу освободиться! +Catch me if you can! +Поймай меня, если сможешь! +You'll never get away with this! +Тебе это никогда не сойдет с рук! +I don't want to be your slave! +Я не хочу быть твоей рабыней! +I've been naughty, looks like I need to be punished... +Я была непослушной, похоже, меня нужно наказать... +I've been a bad girl, won't you do something about it? +Я была плохой девочкой, неужели ты ничего не сделаешь с этим? +Mmmph... maybe I talk too much... +Хммм... может быть, я слишком много болтаю... +Hey! Where do you think you're going? +Эй! Куда, по-твоему, ты направляешься? +You look like you're having fun! +Ты выглядишь так, словно тебе весело! +I have somewhere else in mind for you~ +У меня есть для тебя кое-что еще на примете~ +What do you think you're doing with that? +Как ты думаешь, что ты с этим будешь делать? +Looks like you found my keys! Hand them over. +Похоже, ты нашла мои ключи! Отдай их мне. +Alert! +Тревога! +You look like a good girl. Come on~ +Ты выглядишь хорошей девочкой. Иди сюда~ +Come here, let's play! +Иди сюда, давай поиграем! +*grins and starts walking toward you* +*улыбается и направляется к вам* +Hey! Play nice! +Хэй! Веди себя хорошо! +Stop that! Guards! +Прекрати это! Стража! +You're mine! +Ты моя! +Sorceress! +Ведьма! +Get her! +Заберите ее! +She's a mage! Stop her! +Она маг! Остановите ее! +Watch it! +Смотрите! +Don't touch that! +Не трогай это! +Don't touch that! +Не трогай это! +Don't touch that! +Не трогай это! +We have an escapee! +Мы можем спастись! +Not so fast! +Не так быстро! +Try that again! +Попробуй еще раз! +Do your worst! +Сделай это! +Got you! +Попалась! +Get back here! +Возвращайся сюда! +Get back here! +Возвращайся сюда! +Missed me! +Скучала по мне? +Missed me! +Скучала по мне? +You're coming with me! +Ты идешь со мной! +Get over here! +Иди сюда! +Not so slippery now! +Теперь не такая верткая! +Hand it over. +Отдай это мне. +Nice and tight! +Мило и туго! +The name's PTRN. +Мое имя PTRN. +What the-- +Что за-- +You won't get away with this! +Тебе это с рук не сойдет! +I'm coming! +Я иду! +I can't let you do that! +Я не могу позволить тебе сделать это! +You'll pay for this! +Ты заплатишь за это! +That was a mistake! +Это было ошибкой! +I'm joining in! +Я присоединяюсь! +Hand on, I'm coming! +Держи руку на пульсе, я иду! +I'm here! +Я здесь! +Here I come! +Вот и я! +Come and get me! +Давай, поймай меня! +You'll never escape! +Тебе никогда не сбежать! +Mmmphh! +Мммфхх! +Mmmm! Mmmmmmm! +Мммм! Ммммммм! +Mmmmph!!! +Мммммфх!!! +Mmmmm~ +Ммммм~ +Mmmgh! +Мммгх! +Mmmmph!!! +Мммммфх!!! +Mmmmm~ +Ммммм~ +Mmmgh! +Мммгх! +Mmmmmm <3 +Мммммм <3 +Mmmmmm~ +Мммммм~ +Mmmph~ +Ммммфх~ +*looks at you nervously* +*нервозно смотрит на вас* +*giggles* +*хихикает* +*giggles eagerly* +*нетерпеливо хихикает* +Mmmph? +Мммфх? +Mmmghgh!!! +Мммгхгх!!! +Mmmmph! +Ммммфх! +Mmmmph... +Ммммфх... +Hhhhmph! +Хмммфх! +Mmmmmmmmm... +Мммммммм... +Mmmph! +Мммфх! +Nngghhh! +Ннггххх! +Gggghh!!! +Гхх!!! +Mmmaaghthh! +Ммммаагхгх! +Wwwmmmthhh! +Вввммммтх! +Mmmmmph! +Мммммфх! +Mmmph. +Мммфх. +Mmmph! +Мммфх! +*looks at you suspiciously* +*подозрительно на вас смотрит* +*looks at you angrily* +*сердито смотрит на вас* +Mmmmph!!! +Ммммфх!!! +Mmmmph! +Ммммфх! +*jumps up and down excitedly* +*взбудоражено подпрыгивает вверх-вниз* +*groans* +*стонет* +*does a happy dance* +*исполняет счастливый танец* +Mmmph!!! +Ммммфх!!! +Mmmph!!! +Ммммфх!!! +*giggles* +*хихикает* +*giggles* +*хихикает* +Mmmph. +Мммфх. +Nngghhh! +Ннггххх! +Mmm-hmmm. +Ммм-хммм. +Mmmmmmm~ +Ммммммм~ +Mmmph~ +Мммфх~ +*Her nametag says 'PTRN'* +*Ее бейджик гласит 'PTRN'* +Mmmph!! +Мммфх!! +Mmmmmmph!!! +Ммммммфх!!! +Mmmm... +Мммм... +Mmmm--! +Мммм--! +Mmmmph. +Ммммфх. +Mmmmmmmgh! +Мммммммгх! +Mmph! +Ммфх! +Mmm~ +Ммм~ +Mmmmmmmph... +Мммммммфх... +MMMMMPH!!! +МММММФХ!!! +*focuses intently* +*внимательна и сосредоточенна* +*appears distracted* +*выглядит возбужденной* +Mmmmph!!! +Мммммфх!!! +Mmmmm~ +Ммммм~ +Mmmgh! +Мммгх! +Mmmmph!!! +Мммммфх!!! +Mmmmm~ +Ммммм~ +Mmmgh! +Мммгх! +Mmmmmm <3 +Мммммм <3 +Mmmmmm~ +Мммммм~ +Mmmph~ +Ммммфх~ +*Mmmmmm~* +*Мммммм~* +*muffled giggle* +*приглушенный смешок* +Mmmm~ +Мммм~ +Mmmph? +Мммфх? +Mmmghgh!!! +Мммгхгх!!! +Mmmmph! +Ммммфх! +Mmmmph... +Ммммфх... +Hhhhmph! +Хмммфх! +Mmmmmmmmm... +Мммммммм... +Mmmph! +Мммфх! +Nngghhh! +Ннггххх! +Gggghh!!! +Гхх!!! +Mmmaaghthh! +Ммммаагхгх! +Wwwmmmthhh! +Вввммммтх! +Mmmmmph! +Мммммфх! +Mmmph. +Мммфх. +Mmmph! +Мммфх! +Mmmph? +Мммфх? +*glows with anger* +*пылает гневом* +Mmmmph!!! +Ммммфх!!! +Mmmmph! +Ммммфх! +*muffled giggle* +*приглушенный смешок* +*groans* +*стонет* +*muffled giggle* +*приглушенный смешок* +Mmmph!!! +Ммммфх!!! +Mmmph!!! +Ммммфх!!! +*muffled giggle* +*приглушенный смешок* +*muffled giggle* +*приглушенный смешок* +Mmmph. +Мммфх. +Nngghhh! +Ннггххх! +Mmm-hmmm. +Ммм-хммм. +Mmmmmmm~ +Ммммммм~ +Mmmph~ +Мммфх~ +*Her headpiece says 'PTRN'* +*На ее головном уборе написано 'PTRN'* +Mmmph!! +Мммфх!! +Mmmmmmph!!! +Ммммммфх!!! +Mmmm... +Мммм... +Mmmm--! +Мммм--! +Mmmmph. +Ммммфх. +Mmmmmmmgh! +Мммммммгх! +Mmph! +Ммфх! +Mmm~ +Ммм~ +Mmmmmmmph... +Мммммммфх... +MMMMMPH!!! +МММММФХ!!! +Watch out for my SPL! +Узри же SPL! +Whoops! +Упс! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +You'll never catch me! +Ты никогда меня не поймаешь! +Where'd you come from? +Откуда ты взялась? +No! Definitely don't like... tie me up and punish me! +Нет! Мне действительно не нравится... Свяжи меня и накажи! +I've come to turn myself in~ +Я пришла, чтобы сдаться~ +Won't you 'apprehend' me? +Разве вы не 'арестуете' меня? +I've been a bad girl~ +Я была плохой девочкой~ +Hey! You should know your place. +Эй! Ты должна знать свое место. +Look who's enjoying herself~ +Смотрите, кто наслаждается собой~ +Let's put you up for auction! +Давай выставим тебя на аукцион! +What are you rummaging around for? +Чего ты там роешься? +Oh no you don't! +О нет, ты этого не сделаешь! +You're not supposed to be here... +Тебе не положено здесь находиться... +I'm gonna teach you a lesson, girl. +Я собираюсь преподать тебе урок, девочка. +I'm gonna miss you when we find you a nice master... +Я буду скучать по тебе, когда мы найдем тебе хорошего хозяина... +Looks like you need some training, girl. +Похоже, тебе нужно немного потренироваться, девочка. +You picked a bad time to get lost, friend. +Ты выбрала неподходящее время, чтобы заблудиться, подруга. +Never should have come here. +Тебе не следовало приходить сюда. +I used to be an adventurer like you. +Когда-то я была таким же искателем приключений, как и ты. +You must be one of those wizards. +Ты, должно быть, одна из тех волшебниц. +The mages sell real well... +Маги действительно хорошо продаются... +Mage! Stop her! +Маг! Остановите ее! +Watch it! +Смотрите! +Not on my watch. +Не в мое дежурство. +That's my stash... +Это моя заначка... +You'll fetch a pretty penny from that goddess you just pissed off. +Ты получишь хорошие проценты от той богини, которую только что разозлила. +Hah! Found ya! +Хах! Нашла тебя! +Got you! +Попалась! +*scoffs* Amateur. +*издеваясь* Любитель. +Do your worst! +Сделай это! +Got you! +Попалась! +Hmph. Get back here! +Хмф. Вернись сюда! +Why won't you surrender! +Почему ты не хочешь сдаться? +Missed me! +Скучала по мне? +Not a chance! +Ни за что! +Boss! We got another one! +Босс! У нас есть еще одна! +Get over here! +Иди сюда! +Caught ya~ +Поймала тебя~ +Dibs on this one! +Это чур мое! +Gotta make sure no one gets to you~ +Нужно убедиться, что никто до тебя не доберется~ +I'm PTRN. And who might you be? +Я PTRN. А кто же такая ты? +Bad time to party, girl~ +Неподходящее время для веселья, девочка~ +You've got nerve showing your face around here. +У тебя хватает наглости показывать здесь свое лицо. +Don't think you can get away~ +Не думай, что ты сможешь уйти~ +Trying to fight your way out? +Пытаешься пробить путь наружу? +Well, looks like I'm having fun today. +Что ж, похоже, сегодня мне будет весело. +Hey girls, got room for one more? +Эй, девочки, есть местечко еще для одной? +We work for the highest bidder. +Мы работаем на того, кто предложит самую высокую цену. +Nothing personal. +Ничего личного. +Sorry, it's just the way things work. +Извини, просто так все устроено. +I'm coming! +Я иду! +You're mine. +Ты моя. +You can't get away. +Ты не сможешь уйти. +*extends an arm* +*вытягивает руку* +*miscast* +*ошибается в заклинании* +*wiggles* +*извивается* +*struggles* +*борется* +*rattles* +*гремит* +### This is a bug, please report + +### This is a bug, please report + +### This is a bug, please report + +### This is a bug, please report + +### This is a bug, please report + +### This is a bug, please report + +*starts chasing you* +*начинает преследовать вас* +*won't leave you be!* +*я не оставлю тебя в покое!* +*tugs at your body!* +*тянет за ваше тело!* +*runs at you* +*бежит на вас* +*notices you!* +*замечает вас!* +*claps loudly* +*громко хлопает* +*wants to socialize* +*хочет пообщаться* +*sends shivers down your spine* +*мурашки пробегают у вас по спине* +*runs at you* +*бежит на вас* +*is rattled* +*трясется* +*scrabbles slowly by* +*что-то медленно царапает* +*shrieks* +*вопит* +*wants to shock your soul* +*хочет сотрясти вашу душу* +*comes to seal your doom* +*пришла предрешить вашу судьбу* +*shouts a startling shrilling scream!* +*издает пронзительный визг!* +*walks toward you with arms outstretched* +*идет к вам с протянутыми руками* +*defending the goddess* +*защищает богиню* +*defends its cache* +*защищает свой клад* +*lets out a shriek* +*пронзительно кричит* +*tries to catch you* +*пытается поймать вас* +*grabs you* +*хватает вас* +*disarms* +*разоружена* +*is rattled* +*трясется* +*rattles excitedly* +*взволнованно гремит* +*misses* +*промах* +*flails uselessly* +*безуспешно дергается* +*trembles* +*дрожит* +*trembles* +*дрожит* +*tugs on leash* +*пытается сорвать поводок* +*rattles* +*гремит* +*rattles excitedly* +*взволнованно гремит* +*rattles excitedly* +*взволнованно гремит* +*rattles* +*гремит* +*Wears a sign saying 'PTRN'* +*Носит знак с надписью 'PTRN'* +### !!! + +### !!! + +### !!! + +### ! + +### ! + +### ! + +### ! + +*rattles* +*гремит* +### !!! + +*marches* +*топот* +Engaging SPL! +Задействовать SPL! +A-Access denied!? +Д-доступ запрещен?! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +This... this unit is doing a good job! I swear! +Это... этот юнит хорошо справляется со своей работой! Я клянусь! +It's just business as usual, nothing to see here... +Это просто обычный бизнес, здесь не на что смотреть... +It's not like I need reconfiguring or anything... +Не то чтобы мне нужна была реконфигурация или что-то в этом роде... +You! I require... reconfiguring. +Ты! Мне нужна... реконфигурация. +Oh no! Looks like I need repairs~ +О, нет! Похоже, мне нужен ремонт~ +I've violated my parameters. Please discipline me. +Я нарушила свои параметры. Пожалуйста, исправьте меня. +Stop! You're not wearing the required uniform~ +Стоп! На вас нет необходимой униформы~ +Are your restraints too loose? Do I need to tighten them? +Не слишком ли ослабли ваши ремни? Может мне стоит их затянуть? +Transferring to a secure location. +Перенос в безопасное место. +You've violated your parameters. +Вы нарушили свои параметры. +Insufficient security clearance. Hand it over. +Недостаточный допуск к секретной информации. Передай это мне. +Please present your identification! +Пожалуйста, предъявите свое удостоверение личности! +Hello doll. Do your settings need adjustment? +Привет, кукла. Нуждаются ли твои настройки в корректировке? +Looks like you've had too much time to yourself~ +Похоже, у тебя было слишком много времени для себя~ +A good doll needs routine maintenance~ +Хорошая кукла нуждается в регулярном уходе~ +Ehh! The dolls aren't supposed to fight back! +Эй! Куклы не должны сопротивляться! +In-initiating corrective action! +И-инициирование корректирующих действий! +Alert! Inmate has gone rogue! +Тревога! Заключенный вышел из под контроля! +Who gave you permission to use magic? +Кто дал тебе разрешение использовать магию? +Unauthorized use of magic is grounds for increased security. +Несанкционированное использование магии является основанием для повышения строгости. +Magic users require extra security! +Пользователям магии требуется дополнительная строгость! +Subduing assailant! +Усмирение нападавшей! +You're not allowed to contact the goddesses. Please meditate on this in your cell. +Тебе не разрешается связываться с богинями. Пожалуйста, поразмышляй над этим в своей клетке. +Behavior exceeds parameters. Please submit to arrest. +Поведение превышает параметры. Пожалуйста, подчинитесь аресту. +You're not allowed to contact the goddesses. Please meditate on this in your cell. +Тебе не разрешается связываться с богинями. Пожалуйста, поразмышляй над этим в своей клетке. +Alert! Inmate has escaped! +Тревога! Заключенный сбежал! +Don't you want to be trained? +Ты не хочешь пройти обучение? +Aren't you a violent one! +Ну разве ты не жестокий человек! +Ouch! That hurt... +Ой! Это больно... +That'll be all from you! +Это все благодаря тебя! +Your brat quotient is off the charts. +Ваш преступный коэффициент зашкаливает. +Your brat quotient is off the charts. +Ваш преступный коэффициент зашкаливает. +Please stop and submit to arrest. +Пожалуйста, остановитесь и подчинитесь аресту. +Please stop and submit to arrest. +Пожалуйста, остановитесь и подчинитесь аресту. +Subject captured! +Объект захвачен! +Come back, doll! +Вернись назад, кукла! +Deploying capture device. +Развертывание устройства захвата. +I'll be confiscating that! +Я конфискую это! +How'd you slip through security? +Как тебе удалось проскользнуть через охрану? +I'm PTRN, and today I shall be taking care of you~ +Я PTRN, и сегодня я буду заботиться о тебе~ +Enemy spotted! +Враг обнаружен! +Target in my sights! +Цель у меня на прицеле! +Red alert! +Красная тревога! +Lay down your weapons! +Сложите свое оружие! +Surrender and I'll be gentle! Relatively speaking... +Сдавайся, и я буду нежна! Относительно... +Give up or I'll call reinforcements! +Сдавайся, или я вызову подкрепление! +Ack! We have an unruly subject! +Цск! У нас тут буйный субъект! +Target needs retraining... +Цель нуждается в переподготовке... +Sorry, rules are rules~ +Извини, правила есть правила~ +Moving to assist! +Спешу на помощь! +My orders are to shut you down~ +Мне приказано отключить вас~ +Defenses online! +Защита подключена! +SPL armed. +SPL экипирован. +An exception has occurred while trying to run SPL. Retry? +При попытке запустить SPL произошло исключение. Повторить попытку? +Error in citizen ID registration. Please submit to processing. +Ошибка при регистрации ID гражданина. Пожалуйста, согласитесь на обработку. +Does not compute. +Ошибка вычисления. +Some kind of miscalculation has occurred. +Произошел какой-то просчет. +This was unforseen. +Это было непредвиденно. +Unit is retreating. +Юнит отступает. +Activating self-preservation instincts. +Активация инстинктов самосохранения. +Commence tactical withdrawal. +Запуск тактического отхода. +Maintenance needed. +Требуется техническое обслуживание. +Unit needs repair. +Юнит нуждается в ремонте. +Commence transfer of power protocol. +Инициация протокола передачи полномочий. +Insufficient bindings. Commence submission protocol. +Недостаточно оков. Инициация протокола подчинения. +Commence routine inspection. +Инициация плановой проверки. +Inmate is out of containment. Transferring. +Заключенный нарушил политику сдерживания. Перенос. +Theft detected. This is a warning. +Обнаружена кража. Выдано предупреждение. +Confiscating item. +Конфискация предмета. +Unknown subject detected. Presuming hostile. +Обнаружен неизвестный объект. Предположительно враждебный. +Inmate detected. Commence training protocol. +Обнаружен заключенный. Инициация протокола обучения. +Inmate detected. Commence routine inspection. +Обнаружен заключенный. Инициация плановой проверки. +Inmate detected. Commence submission training. +Обнаружен заключенный. Инициация тренировки подчинения. +Violence detected. Subduing assailant. +Обнаружено насилие. Усмирение нападавшего. +Damage detected. Initiating combat routine. +Обнаружено повреждение. Инициация боевого протокола. +Unruly inmate detected. Performing corrective action. +Обнаружен непослушный заключенный. Выполнение корректирующих действий. +Magic detected. Subduing assailant. +Обнаружена магия. Усмирение нападавшего. +Energy spike detected. Preparing shields. +Обнаружен энергетический всплеск. Подготовка щитов. +Unlawful use of magic. Please submit to arrest. +Незаконное использование магии. Пожалуйста, подчинитесь приказу об аресте. +Violence detected. Subduing assailant. +Обнаружено насилие. Усмирение нападавшего. +Unlawful conduct. Please submit to arrest. +Противозаконное поведение. Пожалуйста, подчинитесь приказу об аресте. +Theft detected. Please submit to arrest. +Обнаружена кража. Пожалуйста, подчинитесь приказу об аресте. +Unlawful conduct. Please submit to arrest. +Противозаконное поведение. Пожалуйста, подчинитесь приказу об аресте. +Inmate has escaped. Commence capture protocol. +Заключенный сбежал. Инициирую протокол захвата. +Error, subject is attempting to escape. +Ошибка, субъект пытается сбежать. +Target is violent. Disarming subject. +Цель склонна к насилию. Обезоружить субъекта. +Target is violent. Increase alert level. +Цель склонна к насилию. Повысьте уровень тревоги. +Dispensing restraints. +Выдача ограничителей. +Target flees. Revising strategy. +Цель убегает. Пересмотр стратегии. +Target resists. Revising tactics. +Цель сопротивляется. Пересмотр тактики. +Target skill below expected level. Revising strategy. +Способности цели ниже ожидаемого уровня. Пересмотр стратегии. +Target skill below expected level. Revising tactics. +Способности цели ниже ожидаемого уровня. Пересмотр тактики. +Subject captured. Returning to processing. +Объект захвачен. Возвращаемся к обработке. +Apply takedown protocol. +Инициирую протокол захвата. +Aggressive target detected. Deploying countermeasures. +Обнаружена агрессивная цель. Инициирую контрмеры. +Contraband detected. Confiscating. +Обнаружена контрабанда. Конфискация. +Increasing strictness level. +Повышение уровня строгости. +Unit PTRN identifying. +Юнит PTRN, идентификация. +Red alert. Joining combat. +Красная тревога. Вступаю в бой. +Battle stations. +Боевой пост. +Target identified. +Цель идентифицирована. +Offering support. +Предложена поддержка. +New target identified. Engaging. +Выявлена новая цель. Дружественная. +Combat detected. Engaging in corrective action. +Обнаружен бой. Принятие корректирующих мер. +Updating target registry. Proceed to attack. +Обновление реестра цели. Переход к атаке. +Target updated. +Цель обновлена. +New target detected. Please submit to detainment. +Обнаружена новая цель. Пожалуйста, подчинитесь задержанию. +Moving to assist. +Двигаюсь на помощь. +Moving to capture. +Двигаюсь на захват. +Forming blockade. +Формирование блокады. +### SPL(); + +throw new Error(SPL); +возникла новая Ошибка(SPL); +query([ID]); >ERROR; transport([UNKNOWN], [DOLL]) +запрос([ID]); >ОШИБКА; передача([НЕИЗВЕСТНО], [КУКЛА]) +Does not compute; +Не вычислено; +Some kind of miscalculation has occurred; +Произошла ошибка в расчетах; +This was unforseen; +Это было непредвиденно; +Unit is retreating; +Юнит отступает; +Activating self-preservation instincts; +Активация инстинктов самосохранения; +Commence tactical withdrawal; +Начать тактический отход; +Maintenance needed; +Требуется техническое обслуживание; +Unit needs repair; +Юнит нуждается в ремонте; +Commence transfer of power protocol; +Запустить протокол передачи энергии; +Insufficient bindings; Commence submission protocol; +Недостаточно ограничителей; Запустить протокол подчинения; +Commence routine inspection; +Начинаю плановую проверку; +Inmate is out of containment; Transferring; +Заключенный сбежал из-под стражи; Транспортировка; +Theft detected; This is a warning; +Обнаружена кража; Выдано предупреждение; +Confiscating item; +Конфискация предмета; +Unknown subject detected; Presuming hostile; +Обнаружен неизвестный субъект; Предполагается враждебность; +Inmate detected; Commence training protocol; +Обнаружен заключенный; Начинаю протокол обучения; +Inmate detected; Commence routine inspection; +Обнаружен заключенный; Начинаю плановую проверку; +Inmate detected; Commence submission training; +Обнаружен заключенный; Начинаю тренировку покорности; +Violence detected; Subduing assailant; +Обнаружено насилие; Усмирение нападавшего; +Damage detected; Initiating combat routine; +Обнаружены повреждения; Начало боевых действий; +Unruly inmate detected; Performing corrective action; +Обнаружен непокорный заключенный; Принимаются корректирующие меры; +Magic detected; Subduing assailant; +Обнаружена магия; Подавление нападающего; +Energy spike detected; Preparing shields; +Обнаружен выброс энергии; Подготовка щитов; +Unlawful use of magic; Please submit to arrest; +Незаконное использование магии; Просьба подчиниться аресту; +Violence detected; Subduing assailant; +Обнаружено насилие; Усмирение нападавшего; +Unlawful conduct; Please submit to arrest; +Нарушение закона; Просьба подчиниться аресту; +Theft detected; Please submit to arrest; +Обнаружена кража; Просьба подчиниться аресту; +Unlawful conduct; Please submit to arrest; +Нарушение закона; Просьба подчиниться аресту; +Inmate has escaped; Commence capture protocol; +Заключенный совершил побег; Запустите протокол задержания; +Error, subject is attempting to escape; +Ошибка, субъект пытается совершить побег; +Target is violent; Disarming subject; +Цель агрессивна; Обезоруживаю объект; +Target is violent; Increase alert level; +Цель агрессивна; Повышаю уровень тревоги; +Dispensing restraints; +Выпустить ограничители; +Target flees; Revising strategy; +Цель убегает; Пересматриваю стратегию; +Target resists; Revising tactics; +Цель сопротивляется; Пересматриваю тактику; +Target skill below expected level; Revising strategy; +Навык цели ниже ожидаемого уровня; Пересматриваю стратегию; +Target skill below expected level; Revising tactics; +Навык цели ниже ожидаемого уровня; Пересматриваю тактику; +Subject captured; Returning to processing; +Объект захвачен; Возвращаюсь к обработке; +Apply takedown protocol; +Применяю протокол захвата; +Aggressive target detected; Deploying countermeasures; +Обнаружена агрессивная цель; Принимаются контрмеры; +Contraband detected; Confiscating; +Обнаружена контрабанда; Конфискация; +increase_strictness(1); +увеличение_строгости(1); +query([SELF]); >PTRN; +запрос([Я]); >PTRN; +Red alert; Joining combat; +Красная тревога; Вступаю в бой; +Battle stations; +Боевой пост; +Target identified; +Цель идентифицирована; +Offering support; +Предлагаю поддержку; +New target identified; Engaging; +Идентифицирована новая цель; Вступаю в бой; +Combat detected; Engaging in corrective action; +Обнаружен бой; Запуск корректирующих действий; +Updating target registry; Proceed to attack; +Обновляю реестр целей; Перехожу к атаке; +Target updated; +Цель обновлена; +New target detected; Please submit() to detainment; +Обнаружена новая цель; Пожалуйста, подчинитесь() процедуре задержания; +defend([ALLY]); +защита([СОЮЗНИК]); +capture([CITIZEN]); +захват([ГРАЖДАНИН]); +defend([POINT]); +защита([ТОЧКА]); +Behold my creation! SPL! +Узри мое творение! SPL! +No! Not like this! +Нет! Только не так! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Looks like I'm up to no good... better stop me! +Похоже, я замышляю что-то нехорошее... Лучше останови меня! +Careful where you point that thing! +Осторожнее, смотри куда направляешь эту штуку! +Containment breach! +Нарушение содержания! +What if I'm the assistant, for a change? +Что, если для разнообразия я буду ассистентом? +Hey, could you test this on... me? +Эй, не могла бы ты протестировать это на... мне? +I'm willing to do anything for science! +Я готова на все ради науки! +You're a fine specimen! +Ты прекрасный экземпляр! +I should take you to my office~ +Я должна отвести вас в свой офис~ +You'd look good in some latex! +Ты бы хорошо смотрелась в латексе! +Hey! That's mine! +Эй! Это мое! +You're not supposed to have that! +У тебя не должно этого быть! +Oh? +Ох? +You'll make a fine test subject... +Из тебя получится прекрасный подопытный... +Come here, I want to perform some tests! +Иди сюда, я хочу провести несколько тестов! +Looks like it's time to drop some science! +Похоже, пришло время применить немного науки! +Bad girl! +Плохая девочка! +Keep your filthy hands off me! +Убери от меня свои грязные лапы! +Your chances of winning are... less than zero. +Твои шансы на победу равны... меньше нуля. +Good girls don't use magic without permission. +Хорошие девочки не пользуются магией без разрешения. +Keep that magic away from my experiments! +Держи эту магию подальше от моих экспериментов! +You're going to break something! +Ты сейчас что-нибудь сломаешь! +That's dangerous! +Это опасно! +Stop! That's scientific equipment! +Стоп! Это научное оборудование! +Don't touch my supplies! +Не трогай мои припасы! +That's off-limits! +Тебе сюда нельзя! +You're not supposed to be here! +Тебе не положено здесь находиться! +Now now, you won't be going anywhere~ +Сейчас, сейчас, ты никуда не уйдешь~ +A calculated success! +Рассчитанный успех! +Watch the vials! +Следи за пузырьками! +I've caught you! +Я поймала тебя! +I can't believe I missed... +Я не могу поверить, что промахнулась... +That's not fair! +Это нечестно! +I knew you would do that! +Я знала, что ты это сделаешь! +I knew you would do that! +Я знала, что ты это сделаешь! +Experiment was a success! +Эксперимент удался! +Gotchya! +Попалась! +There we go! +Вот так-то! +Ooh, you've got some useful stuff~ +О, у тебя есть кое-что полезное~ +I won't let you go that easily! +Я так просто тебя не отпущу! +I am PTRN, the great scientist! +Я PTRN, великий ученый! +Do I have to? Fine... +Должна ли я это делать? Ладно... +Okay okay, I'm helping! +Ладно, ладно, я помогаю! +Where's my assistant when you need them... +Где мой ассистент, когда он так нужен?.. +I will offer my support! +Я предлагаю свою поддержку! +You're really gonna make me do this? +Ты действительно собираешься заставить меня сделать это? +I hate having to clean up after others. +Я ненавижу подчищать за другими. +Eh, whatever, I'll help. +Эх, как бы то ни было, я помогу. +You're ruining my experiment! +Ты разрушаешь мой эксперимент! +Sheesh, what a pest! +Твою же, что за вредительница! +Need an assistant? +Нужен ассистент? +I smell an opportunity! +Я чую возможность! +Do I have to? +Должна ли я это делать? +Let me introduce you to SPL~ +Позволь мне представить тебе SPL~ +No! My SPL! +Нет! SPL! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Oh my, looks like I'm in trouble! +Ой, похоже, у меня неприятности! +What a shame it would be if I got caught~ +Какой позор был бы, если бы меня поймали ~ +Looks like I'd better get going~ +Похоже, мне лучше идти~ +What if I became the victim of my own inventions... +Что, если я стану жертвой своих собственных изобретений?.. +Oh my, looks like I'm in trouble~ +Ой, похоже, у меня неприятности ~ +Won't you help me get dressed? +Ты не поможешь мне одеться? +You look just gorgeous, dear... +Ты выглядишь просто великолепно, дорогая... +Why don't you try these on? +Почему бы тебе не примерить это? +You'll make a fine addition to my collection! +Ты станешь прекрасным дополнением к моей коллекции! +Such jaw-dropping beauty! +Такая потрясающая красота! +You belong on a display stand! +Твое место на выставочном стенде! +We should put away those grasping hands of yours~ +Мы должны убрать эти твои беспокойные ручки~ +That belongs to someone else. +Это принадлежит не тебе. +Oh no you don't, sweetie! +О, нет, не надо, милая! +You're a pretty one! Why don't you come here~ +Ты такая хорошенькая! Почему бы тебе не подойти сюда~ +Oof! Looks like you need to be taught a lesson! +Уф! Похоже, тебе нужно преподать урок! +We better put away those hands of yours. +Нам лучше убрать эти твои руки. +Why don't you just give up and pose for us~ +Почему бы тебе просто не сдаться и не попозировать нам~ +Oh my, that's dangerous! +О богини, это опасно! +You're going to damage my dress! +Ты испортишь мое платье! +Keep those pretty hands to yourself, dear~ +Держи свои хорошенькие ручки при себе, дорогая~ +Where'd you find that, dear? +Где ты это нашла, дорогая? +Silly girl, you should be looking to your mistress for guidance. +Глупая девчонка, тебе следовало бы обратиться за наставлением к своей госпоже. +That's not yours, sweetie~ +Это не твое, милая~ +You shouldn't break things with such dainty hands~ +Тебе не следует ломать вещи такими изящными руками~ +I knew something was amiss! +Я знала, что что-то не так! +You won't be getting away that easily, dear~ +Тебе так легко не отделаться, дорогая~ +Won't be needing this~ +Это тебе не понадобится~ +Hey, you'll damage my dress! +Эй, ты испортишь мое платье! +I'm so excited! +Я так взволнована! +A slippery one, aren't you? +А ты весьма верткая, да? +A brave one, aren't you? +А ты храбрая, да? +Tsk tsk. You can do better, dear~ +Тск-тск. Ты можешь лучше, дорогая~ +Tsk tsk. You can do better, dear~ +Тск-тск. Ты можешь лучше, дорогая~ +I can't wait to dress you up! +Мне не терпится нарядить тебя! +So nice of you to join me! +Так мило, что ты присоединилась ко мне! +Now let's see, what kind of dress... +Теперь давайте посмотрим, что это за платье... +A gift? Thank you so much! +Подарок? Большое тебе спасибо! +You won't be getting out of that any time soon! +В ближайшее время ты из этого не выберешься! +I'm PTRN. Have you heard of my dresses?~ +Я PTRN. Ты слышала о моих платьях?~ +That won't do! +Это неприемлемо! +I'd like to have you myself! +Я бы хотела заполучить тебя себе! +Oooh, a cute one! +Оооо, какая милашка! +*sigh* how improper... +*вздох* не подходит... +Inelegant! You need some teaching! +Неэлегантно! Тебя нужно немного поучить! +*snaps her fingers* Looks like you'll need some punishment~ +*щелкает пальцами* Похоже, тебя нужно немножко наказать~ +That one is pretty. May I have her instead? +Она такая симпатичная. Можно мне взять ее вместо тебя? +I'd like to place a bid too~ +Я бы тоже хотела оставить заявку~ +Oooh, that one's mine! +Оооох, она моя! +### SPL. + +### ... + +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +No! I don't want to read your magazines! +Нет! Я не хочу читать твои журналы! +No, I don't want to learn about Shibari! +Нет, я не хочу ничего узнавать о Шибари! +No, I don't want to learn about your toys! +Нет, я не хочу ничего узнавать о твоих игрушках! +I found this book about Shibari... is it yours? +Я нашла эту книгу о Шибари... она твоя? +I'm so clumsy... maybe you can fix that. +Я такая неуклюжая... Может быть, ты сможешь это исправить. +Gee, looks like I can't keep my mouth shut... +Ох, похоже, я не могу держать рот на замке... +Shhhhh. +Тссс. +Be quiet. +Тише. +Keep your hands off my books. +Держи свои руки подальше от моих книг. +Heh. Serves you right. +Хех. Так тебе и надо. +Time to lock you away. +Пришло время запереть тебя. +Don't get your paws on anything important. +Не трогай своими лапами ничего важного. +I was reading that! +Я это читала! +You're not supposed to have that. +У тебя не должно этого быть. +You. Stop. +Ты. Остановись. +Who are you? +Кто ты? +You're entering my personal space. +Ты вторгаешься в мое личное пространство. +I'm going to ask you to leave +Я прошу тебя уйти +You're ruining the books! +Ты портишь книги! +Do you need a gag? +Тебе нужен кляп? +Shut up. +Замолчи. +Put that back! +Положи это обратно! +There's nothing to learn from that, you ignorant buffon. +Ты ничему из этого не научишься, ты, невежественный шут. +Don't dive into someone else's belongings! +Не ройся в чужих вещах! +You've destroyed an ancient artifact, imbecile! +Ты уничтожила древний артефакт, идиотка! +I wish you'd just stay out of trouble... +Я бы хотела, чтобы ты просто держалась подальше от неприятностей... +Gotchya. +Попалась. +You're going to hurt someone with that. +Этим ты причинишь кому-нибудь боль. +My books! +Мои книги! +Stay down. +Стой здесь. +Get back here-- +Вернись сюда-- +Just give it up. +Просто брось это. +Why you... +Почему ты... +Why you... +Почему ты... +Time for you to stay out of trouble. +Тебе пора держаться подальше от неприятностей. +Come along. +Идем. +Stay put! +Оставайся на месте! +I'll be taking that back. +Я беру свои слова обратно. +Click. +Щелк. +If you really want to know, my name is PTRN. I am the keeper of this place. +Если ты действительно хочешь знать, меня зовут PTRN. Я хранитель этого места. +Typical. +Типичная. +*sighs* Another one... +*вздыхает* Еще одна... +Keep the damage under control! +Не разрушай все вокруг! +Stop fighting, you guys! +Прекратите драться, народ! +You'll ruin the books! +Ты испортила книги! +Stop making a mess! +Перестань устраивать беспорядок! +You're too dangerous to have around. +Слишком опасно позволять тебе здесь находиться. +I don't care what happens to you as long as you're out of here. +Мне все равно, что с тобой случится, лишь бы ты убралась отсюда. +Get out of my library! +Убирайся из моей библиотеки! +Deploying SPL! +Разворачиваю SPL! +What was I supposed to do again? Oh right! +Что же мне делать? Ах да! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +No! I didn't do anything wrong... +Нет! Я не сделала ничего плохого... +Don't punish me! Please! +Не наказывай меня! Пожалуйста! +It's not my fault! +Это не моя вина! +It's your turn, dear~ +Теперь твоя очередь, дорогая~ +Looks like I'm the patient now~ +Похоже, теперь я пациент~ +I've been an unruly nurse... +Я была непослушной медсестрой... +It's time for your shot... +Пришло время для твоего укола... +Why are you out of your cell? +Почему ты вышла из своей камеры? +You need my help! +Тебе нужна моя помощь! +Those are supposed to keep you still you know... +Знаешь, это должно тебя успокоить... +You've got an appointment scheduled. +Тебе назначен плановый осмотр. +Lets get you back in your jacket~ +Давай снова наденем на тебя рубашечку~ +Patients are not allowed to have toys. +Пациентам не разрешается иметь при себе игрушки. +Oh no you don't, sweetie! +О, нет, не надо, милая! +Oh my~ +О боги~ +Oof! Looks like you need to be taught a lesson! +Уф! Похоже, тебе нужно преподать урок! +You can be cured if you just give up. +Ты сможешь вылечиться, если просто сдашься. +You're going to ruin your progress~ +Ты собираешься погубить свой прогресс~ +Oh my, that's dangerous! +О богини, это опасно! +Patients are forbidden from casting spells! +Пациентам запрещено произносить заклинания! +Keep those pretty hands to yourself, dear~ +Держи свои хорошенькие ручки при себе, дорогая~ +Where'd you find that, dear? +Где ты это нашла, дорогая? +Silly girl, your illness can't be cured by a prayer. +Глупая девочка, твою болезнь нельзя вылечить молитвой. +That's not yours, sweetie~ +Это не твое, милая~ +You shouldn't break things, you know~ +Ты не должна ломать вещи, знаешь ли~ +I knew something was amiss! +Я знала, что что-то не так! +You won't be getting away that easily, dear~ +Тебе так легко не отделаться, дорогая~ +Won't be needing this~ +Это тебе не понадобится~ +Hey, who said you could do that! +Эй, кто сказал, что ты можешь так делать! +I'm so excited! +Я так взволнована! +A slippery one, aren't you? +А ты весьма верткая, да? +Now now, you can't just resist like that~ +Сейчас, сейчас, ты не можешь просто так сопротивляться~ +Tsk tsk. You can do better, dear~ +Тск-тск. Ты можешь лучше, дорогая~ +Tsk tsk. You can do better, dear~ +Тск-тск. Ты можешь лучше, дорогая~ +Lets get you back to your cell! +Давай вернем тебя в твою камеру! +So nice of you to join me! +Так мило, что ты присоединилась ко мне! +Now let's see, good patients should be still... +Теперь давай посмотрим, хорошие пациенты должны быть спокойными... +A gift? Thank you so much! +Подарок? Большое тебе спасибо! +You won't be getting out of that any time soon! +В ближайшее время ты из этого не выберешься! +Nurse PTRN, reporting for duty! +Медсестра PTRN, явилась на дежурство! +Someone call security! +Кто-нибудь, вызовите охрану! +I will try to subdue them~ +Я постараюсь подчинить их себе~ +Code Gray! +Серый код! +Hold her down! I'll get the jacket! +Держите ее! Я принесу рубашку! +Code Gray! +Серый код! +Moving in to support! +Выдвигаюсь на поддержку! +Let's mediate things, shall we? +Давайте уладим конфликт, хорошо? +Why don't you calm down so we can talk. Or not~ +Почему бы тебе не успокоиться, чтобы мы могли поговорить? Или нет~ +Now now, what do we have here? +Итак, что мы здесь имеем? +I'll need another SPL, stat! +Мне нужно еще SPL, срочно! +A p-professional mistake. +П-профессиональная ошибка. +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +No! I didn't do anything wrong... +Нет! Я не сделала ничего плохого... +Don't punish me! Please! +Не наказывай меня! Пожалуйста! +I did what the manual said! +Я сделал то, что было написано в руководстве! +It's your turn, dear~ +Теперь твоя очередь, дорогая~ +Looks like I'm the patient now~ +Похоже, теперь я пациент~ +I seem to have caught something, won't you help? +Кажется, я что-то подхватила, не поможешь? +It's time for your daily dose of cuddling~ +Пришло время для твоей ежедневной дозы объятий~ +I diagose you with excessive subbiness. +Я ставлю тебе диагноз 'чрезмерная покорность'. +Seems like you've caught a case of female hysteria... +Похоже, ты подхватила приступ женской истерии... +Those are supposed to keep you still you know... +Знаешь, это должно тебя успокоить... +You've got an appointment scheduled. +Тебе назначен плановый осмотр. +Lets get you back in your jacket~ +Давай снова наденем на тебя рубашечку~ +Patients are not allowed to have toys. +Пациентам не разрешается иметь при себе игрушки. +Oh no you don't, sweetie! +О, нет, не надо, милая! +I diagnose you with a case of bratty behavior... +Я диагностирую у тебя случай своевольного поведения... +Have you had your daily cuddles yet? +У тебя уже были ежедневные объятия? +It's time for your edging treatment~ +Пришло время для твоего лечения на грани~ +Sexual health is physical health, my dear~ +Сексуальное здоровье - это физическое здоровье, моя дорогая~ +Oh my, that's dangerous! +О богини, это опасно! +Patients are forbidden from casting spells! +Пациентам запрещено произносить заклинания! +Keep those pretty hands to yourself, dear~ +Держи свои хорошенькие ручки при себе, дорогая~ +Where'd you find that, dear? +Где ты это нашла, дорогая? +Silly girl, your illness can't be cured by a prayer. +Глупая девочка, твою болезнь нельзя вылечить молитвой. +That's not yours, sweetie~ +Это не твое, милая~ +You shouldn't break things, you know~ +Ты не должна ломать вещи, знаешь ли~ +I knew something was amiss! +Я знала, что что-то не так! +You won't be getting away that easily, dear~ +Тебе так легко не отделаться, дорогая~ +Won't be needing this~ +Это тебе не понадобится~ +Hey, who said you could do that! +Эй, кто сказал, что ты можешь так делать! +I'm so excited! +Я так взволнована! +A slippery one, aren't you? +А ты весьма верткая, да? +Now now, you can't just resist like that~ +Сейчас, сейчас, ты не можешь просто так сопротивляться~ +Tsk tsk. You can do better, dear~ +Тск-тск. Ты можешь лучше, дорогая~ +Tsk tsk. You can do better, dear~ +Тск-тск. Ты можешь лучше, дорогая~ +Lets get you back to your cell! +Давай вернем тебя в твою камеру! +So nice of you to join me! +Так мило, что ты присоединилась ко мне! +Now let's see, good patients should be still... +Теперь давай посмотрим, хорошие пациенты должны быть спокойными... +A gift? Thank you so much! +Подарок? Большое тебе спасибо! +You won't be getting out of that any time soon! +В ближайшее время ты из этого не выберешься! +PTRN MD here. Let's see what we've got... +PTRN MD здесь. Давай посмотрим, что у нас тут есть... +Security! +Надежно! +What's this disturbance... +Ну что это за беспокойство... +Must I do everything myself... +Я должна все делать сама... +Settle down. +Располагайся. +I didn't want to get my hands dirty. +Я не хотела пачкать руки. +Looks like the gloves are off~ +Похоже, перчатки сброшены и борьба начинается~ +Must I do everything myself... +Я должна все делать сама... +Let me get my tools. +Дай мне взять мои инструменты. +I'll take a look. +Я посмотрю. +### SPL + +SPL failed +SPL неудача +### PTRN + +### SPL! + +That w-was supposed to be a SPL! +Это д-должно было быть SPL! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Ooh, a shiny rock… +О, блестящий камень… +I wonder what's over here? +Интересно, что здесь? +I'm bored, bye! +Мне скучно, пока! +Pay more attention to me! +Уделяй мне больше внимания! +Tell me I'm pretty! +Скажи мне, что я красивая! +I'm not a bottom, I'm a scary dom! +Я не нижняя, я жуткая доминантша! +You seem stressed, how about I help you take a break? +Ты выглядишь напряженной, как насчет того, чтобы я помогла тебе расслабиться? +Here's some powerful loot that will help you win! Let me help you try it on… +Вот несколько мощных трофеев, которые помогут тебе побеждать! Позволь мне помочь тебе примерить их… +Aaah, I can't help it, you're just too cute to keep my hands off! +Ааа, я ничего не могу с собой поделать, ты слишком милая, чтобы я могла выпустить тебя из своих рук! +Cuddle pillows aren't supposed to be able to move! +Предполагается, что подушки-обнимашки не могут двигаться! +C'mon, c'mon, I wanna show you a fun place~ +Давай, давай, я хочу показать тебе забавное местечко~ +Cuddle pillows aren't supposed to be able to move! +Предполагается, что подушки-обнимашки не могут двигаться! +Hey I called dibs on that! +Эй, я первой нашла это! +Cuddle pillows aren't supposed to be able to move! +Предполагается, что подушки-обнимашки не могут двигаться! +You're cute! I'm gonna make you my pillow! +Ты такая милая! Я собираюсь сделать тебя своей подушкой-обнимашкой! +No fair! +Нечестно! +You're not supposed to fight back! +Ты не должна сопротивляться! +Eep! +И-и-и! +Cool magic! +Классная магия! +Magic is cheating! +Магия - это нечестно! +A cutie casting cute spells~ +Милашка применяет милые заклинания~ +Hey I called dibs on that! +Эй, я первой нашла это! +Hey I called dibs on that! +Эй, я первой нашла это! +Hey I called dibs on that! +Эй, я первой нашла это! +No trying to leave the comfy room! +Даже не пытайся покинуть эту уютную комнатку! +Cuddle time! +Время обниматься! +You dropped something, cutie~ +Ты что-то уронила, милашка~ +No fair! +Нечестно! +I just wanna make you a pillow! +Я просто хочу сделать из тебя подушку-обнимашку! +Wow, I actually dodged something! +Вау, я действительно от чего-то увернулась! +Stop dodging so I can bundle you up! >_< +Перестань уворачиваться, дай мне тебя обернуть! >_< +You're not supposed to dodge, no fair! +Ты не должна уворачиваться, так нечестно! +You're not supposed to block, no fair! +Ты не должна уворачиваться, так нечестно! +C'mon, c'mon, I wanna show you a fun place~ +Давай, давай, я хочу показать тебе забавное местечко~ +C'mon, c'mon, I wanna show you a fun place~ +Давай, давай, я хочу показать тебе забавное местечко~ +Look, a distracting thing! Hehehe… +Смотри, какая прикольная вещица! Хе-хе-хе… +This is just to make sure your clothes don't fall off, don't worry! +Это просто для того, чтобы убедиться, что твоя одежда не спадёт, не волнуйся! +My name's Melissa! I know I'm pretty, but try not to stare too much~ +Меня зовут Мелисса! Я знаю, что я красавица, но постарайся не пялиться слишком пристально~ +Let me show you how it's done: SPL! +Позвольте мне показать тебе, как это делается: SPL! +You've just narrowly avoided my SPL~ +Ты только что чудом избежала моё SPL~ +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Kya~ I have no mana, I'm so defenseless right now~ +Кья~ У меня нет маны, прямо сейчас я так беззащитна~ +I have all this bondage gear on me, I sure hope nobody ties me up with it~! +А у меня при себе уйма бондаж-снаряжения, я очень надеюсь, что никто меня им не свяжет~! +Oh no, how will I ever find my way out of here~ +О нет, как я когда-нибудь найду выход отсюда~ +If I focus really hard, I can make my blade go on fire! +Если я сосредоточусь по-настоящему сильно, я могу заставить свой клинок загореться! +I ran out of mana, but I'm sure I can find the exit before long! +У меня закончилась мана, но я уверена, что скоро смогу найти выход! +Hey, be careful with my enchanted rope! +Эй, будь осторожна с моей зачарованной веревкой! +Hey, you wouldn't happen to have a mana potion, would you? +Эй, у тебя случайно нет зелья маны, а? +Say, I happen to know a thing or two about knots~ +Послушайте, так случилось, что я кое-что смыслю в узлах~ +I am an artist with rope... in more ways than one. +Я мастер обращаться с веревкой... во многих отношениях. +*blushes jealously* +*ревниво краснеет* +Come along now~ +Ладно, пошли~ +I'm out of practice... you wouldn't mind helping me, right? +У меня нет практики... ты ведь не против помочь мне, верно? +Thank you for cleaning up! I can take that off your hands~ +Спасибо, что прибралась! Я могу забрать это из твоих рук~ +Oooh, I wonder where that key leads! +Оооо, интересно, куда ведет этот ключ! +Hey you! Where do you think you're going? +Эй, ты! Как ты думаешь, куда ты направляешься? +Kya~! I challenge you! +Кья~! Я бросаю тебе вызов! +What say you to a duel? +Что ты скажешь о дуэли? +Let's fight! For honor and cuddles! +Давай сражаться! За честь и обнимашки! +It's time for a battle between masters--wait, I'm low on mana... +Пришло время для битвы между мастерами-- подожди, у меня мало маны... +Give me a second to chug a mana potion... +Дай мне секунду, чтобы выпить зелье маны... +Why don't you try that again~ +Почему бы тебе не попробовать это еще раз~ +I'll get you for that! +Ты у меня за это получишь! +Hey you can't do that! It's not like I do it too or anything... +Эй, ты не можешь этого сделать! Не то чтобы я тоже этим занималась или что-то в этом роде... +That was m- I mean... you can't steal things like that! +Это было м- Я имею в виду... ты не можешь красть такие вещи! +That was m- I mean... you can't steal sacred artifacts! +Это было м- Я имею в виду... ты не можешь красть священные артефакты! +Kya~ What have we here? +Кья~ Что это у нас тут? +I got you! +Я поймала тебя! +Watch where you're pointing that thing~ +Смотри, куда ты направляешь эту штуку~ +Kya... I mean, ouch!!! +Кья... Я имею в виду, ай-ай!!! +Take that!!! +Получай!!! +Whaaa- +Ваааа- +Hmmph! +Нммфх! +Hah! Can't hit me! +Ха! Ты не попадешь по мне! +It'll take more than that to bring me down! +Потребуется нечто большее, чтобы сбить меня с ног! +What a shame. If only you weren't such a pushover... +Какой позор. Если бы только ты не была такой слабачкой... +*giggles* +*хихикает* +Kya! Take that! +Кья! Получай! +Nice loot! I'll take it~ +Отличная добыча! Я возьму это~ +Can never be too sure! +Никогда нельзя быть слишком самоуверенной! +You wouldn't happen to have a mana potion or 3 would you? +У тебе случайно нет зелья маны или трех, а? +Looks like it's time for me to shine! +Похоже, пришло время мне засиять! +Stand down, or I won't go easy on you! +Отойди, или я не буду с тобой церемониться! +Help is on the way! +Помощь уже в пути! +You really want to get tied up, don't you? +Ты действительно хочешь оказаться туго связанной, не так ли? +Hmph, looks like I need to help after all! +Хм, похоже, мне все-таки нужна помощь! +You asked for it! +Ты сама напросилась на это! +Me? Help? Alright! +Мне? Помочь? Хорошо! +Sorry miss, I'm on an escort mission. +Извините, мисс, я выполняю задание по сопровождению. +There goes my nice, relaxing day... +Вот и закончился мой приятный, расслабляющий день... +I cast SPL! +Я использую SPL! +Behold, my true power! Wait... ack... +Узри мою истинную силу! Подожди... ай... +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +I wonder what to do with all these cuffs... +Интересно, что делать со всеми этими манжетами?.. +I have made a huge mistake... +Я совершила огромную ошибку... +I'll just be going... +Я просто пойду... +Please hold me~ +Пожалуйста, обними меня~ +Please punish me! Please!!! +Пожалуйста, накажи меня! Пожалуйста!!! +I want... pain... +Я хочу... боли... +Let's spend some time together under the moonlight~ +Давай проведем немного времени вместе при лунном свете~ +I'll take you to my place tonight~ +Сегодня вечером я заберу тебя к себе~ +I'm so blessed to find you! +Я так счастлива, что нашла тебя! +Yes, enjoy yourself... +Да, наслаждайся... +Come with me~ +Пойдем со мной~ +Don't you want to feel the tight embrace of leather? +Разве ты не хочешь ощутить крепкие объятия кожи? +You won't need that. +Тебе это не понадобится. +You won't need that. +Тебе это не понадобится. +It's time to get acquainted with the night~ +Пришло время познакомиться с ночью~ +*moans loudly* +*громко стонет* +Yes... more! +Да... еще! +Please keep doing that to me~ +Пожалуйста, продолжай делать это со мной~ +Two can play at that game! +В эту игру могут играть двое! +I call upon the shadows! +Я взываю ко тьме! +Have a taste of my spear! +Попробуй мое копье на вкус! +A curious item~ +Любопытный предмет~ +The shadows will consume all... eventually. +Тьма поглотит все... в конце концов. +Put it back... +Положи это обратно... +I was supposed to do that... not you. +Я должен была это сделать... а не ты. +What do we have here... +Что мы здесь имеем?.. +I've got you! Now I can make you do anything I want... +Я поймала тебя! Теперь я могу заставить тебя делать все, что захочу... +What was that? +Что это? +Ah, yes!!! +Ах, да!!! +You'll counterattack, won't you? +Ты собираешь контратаковать, да? +You're not trying hard enough! +Ты недостаточно стараешься! +More! MORE! +Еще! ЕЩЕ! +Yes, now hit me back! +Да, а теперь ударь меня в ответ! +Yes, now hit me back! +Да, а теперь ударь меня в ответ! +Come now... let's go together. +Ну же... давай пойдем вместе. +Get over here~ +Иди сюда~ +Pierce the darkness. +Пронзи тьму. +Oh? What's this? +А? Что это такое? +Hmmm... that's better. +Хммм... так-то лучше. +My name? My name... oh, I'm PTRN... +Мое имя? Меня зовут... о, я PTRN... +Hey! Look over here! +Эй! Посмотри сюда! +*points* Look, a distraction! +*указывает пальцем* Смотри, там самолет! +Kya~! I'll help! +Кья~! Я помогу! +Mind if I join? +Не возражаете, если я присоединюсь? +Mmmph~ You two look like you're having fun! +Мммф~ Вы двое выглядите так, словно вам весело! +Hey miss, I'm going to have to stop you now~ +Эй, мисс, я вынуждена вас остановить~ +Why don't you fight ME instead~ +Почему бы вместо этого вам не сразиться со МНОЙ~ +What kind of trouble are we getting into today? +В какие неприятности мы будем сегодня ввязываться? +Oooh, fun! +Оооо, весело! +Face my SPL! +Узри, SPL! +SPL-whoops... +SPL-ойойой... +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Give me another chance! +Дай мне еще один шанс! +No! Wait! I can explain... +Нет, подожди! Я могу объяснить... +I'll be right back... +Я сейчас вернусь... +Okay, so I MAY have exaggerated my credentials... +Ладно, ВОЗМОЖНО, я преувеличила свои заслуги... +I'm not in trouble, am I? +Я ведь не попала в неприятности, нет? +I've been looking for... a mentor of sorts. +Я искала... в каком-то смысле наставника. +Aren't you the prettiest thing... +Разве ты не самая красивая?.. +I've met a lot of cuties, but you're something special! +Я встречала много милашек, но ты - нечто особенное! +You'd look good in something tight and inescapable! +Ты бы хорошо смотрелась в чем-нибудь обтягивающем, из чего нельзя выбраться! +Enjoying yourself? Let's have some fun~ +Наслаждаешься собой? Давайте немного повеселимся~ +You seem like you're having fun! Why don't we go for a walk~ +Похоже, тебе весело! Почему бы нам не прогуляться~ +Wouldn't it be more interesting if... +Разве не было бы интереснее, если бы... +What have you got there? +Что у тебя там? +Oooh, a key for my collection? +Ооо, ключ от моей коллекции? +What's that noise? I guess it's just another adventurer... +Что это за шум? Я думаю, это просто еще один искатель приключений... +Ah! So you do have some fight left in you... +Ах! Значит, в тебе все-таки осталось немного воли к борьбе... +A little help over here! +Небольшая помощь уже здесь! +I can take you! +Я могу отвести тебя! +M-magic? +М-магия? +I, uh, also learned a few cantrips... a while ago... +Я, э-э, также выучил несколько заклинаний... некоторое время назад... +Okay, that was cool... +Ладно, это было круто... +I've got enchanted rings and you don't~ +У меня есть зачарованные кольца, а у тебя нет~ +I don't think you're allowed to do that... +Я не думаю, что тебе позволено это делать... +I think I deserve it instead~ +Я думаю, что вместо тебя я заслуживаю это~ +That's not okay... +Это нехорошо... +I'm surprised you got this far! +Я удивлена, что ты зашла так далеко! +Aha! +Ага! +Do you even know what you're doing? +Ты хоть понимаешь, что делаешь? +Okay, I may have exaggerated a bit... +Ладно, возможно, я немного преувеличила... +Please tell me it's not already over? +Пожалуйста, скажи мне, что это еще не конец? +Ah hold still... +Ах, не двигайся... +Coward! +Трусиха! +As expected of an inferior duelist. +Как и ожидалось от худшего дуэлянта. +Is that all? +И это все? +A well-deserved victory on my part~ +Заслуженная победа с моей стороны~ +I've... got you? +Я... поймала тебя? +Are you finished? That's too bad... +Ты все? Это очень плохо... +...what were you planning to do with this? +...что ты планировала с этим делать? +Oh... that's too bad~ +Ох... это очень плохо~ +My name is PTRN, A-rank adventurer. You? +Меня зовут PTRN, авантюрист ранга А. А ты? +In the end, only one of us will be tied up! Wait a minute... +В конце концов, только один из нас будет связан! Подождите минутку... +Heh, watch this~ +Хех, посмотри на это~ +*readies weapon* time to get to work... +*готовит оружие* пора приниматься за работу... +I thought we could reason with her. Oh well... +Я думала, мы сможем договориться с ней. Ну что ж... +I see negotiations have broken down. +Я вижу, что переговоры провалились. +I'm the one you should worry about. +Я та, о ком тебе следует беспокоиться. +I've got orders to take you down. +У меня приказ сразить тебя. +There's a bounty on your head~ +За твою голову назначена награда~ +The bounty will be mine... +Награда будет моей... +You can't hope to match my SPL~ +Ты не можешь надеяться сравниться с моим SPL~ +SPL! No wait, not like that! +SPL! Нет, подожди, только не так! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Be nice! +Будь милой! +No! Be gentle! +Нет! Будь нежнее! +Ahhhh! +Аааах! +Headpats please... +Погладь меня, пожалуйста... +*purrs* +*мурлычет* +Nyah, I've been a bad kitty... +Ня, я была плохой кошечкой... +You're a cute one~ +Ты такая милая~ +It's about time I got someone to play with~ +Самое время мне с кем-нибудь поиграть~ +Let's take you for a walk~ +Давай прогуляемся с тобой~ +Having fun there~? +Развлекаешься там~? +It's time for walkies~ +Пришло время для прогулки~ +Don't you want to play? +Разве ты не хочешь поиграть? +Whatchya doing? +Че делаем? +Tsk tsk, hand it over! +Тск-тск, давай это сюда! +A challenger approaches! +Приближается претендент! +Prepare to face my skill! +Приготовься встретиться лицом к лицу с моим мастерством! +I've mastered the blade for decades! +Я десятилетиями совершенствовала владение клинком! +I'm invincible! +Я непобедима! +Nyah! What was that!? +Ня! Что это было?! +Your spells won't hurt me. +Твои заклинания не причинят мне вреда. +Magic? That's... +Магия? Это... +Stupid tricks won't work on me! +Глупые трюки на мне не сработают! +Praying won't help you~ +Молитва тебе не поможет~ +That's not yours you know~ +Это не твое, ты же знаешь~ +Nyah! You'll pay for that! +Ня! Ты заплатишь за это! +An escapee? I'm on it. +Беглянка? Я займусь этим. +Come here you~ +Ты, иди сюда~ +Checkmate~ +Шах и мат~ +Nya~! No fair... +Ня~! Нечестно... +Aren't you a little out of your league? +Тебе не кажется, что ты немного не в своей лиге? +I'll get you next time! +В следующий раз я тебе покажу! +Nice one! It won't work twice! +Молодец! Но дважды это не сработает! +*smiles* It's okay, you tried~ +*улыбается* Все в порядке, ты пыталась~ +*CLANG* En garde! +*ЛЯЗГ* Защищайся! +It looks like I've won~ +Похоже, я победила~ +Come here you~ +Ты, иди сюда~ +Nyah~! +Ня~! +What's this, nya? +Что это, ня? +Let's make it a bit tighter, shall we? +Давай сделаем это немного туже, хорошо? +They call me PTRN, the legendary blademaster! +Они называют меня PTRN, легендарный мастер клинка! +I'LL take it from here. +Я позабочусь об этом. +It's me you should worry about! +Это обо мне тебе следует беспокоиться! +Pfft. Amateurs. +Пффф. Любители. +Did you think I wasn't looking? +Ты думала, я не смотрела? +Nice try, girl~ +Хорошая попытка, девочка~ +You've made a mistake attacking my client. +Ты совершила ошибку, напав на мою клиентку. +Capture her? Fine, but I expect payment. +Схватить ее? Хорошо, но я ожидаю оплаты. +I just follow the money, miss~ +Я просто следую за деньгами, мисс~ +Can't let you have all the fun, can I? +Не могу же я позволить тебе получить все удовольствие, не так ли? +Time for SPL! +Время для SPL! +*tsk* +*тск* +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Let's play all night! +Давай играть всю ночь! +Let's play all night! +Давай играть всю ночь! +Let's play all night! +Давай играть всю ночь! +We can take our time. +Мы можем не торопиться. +We can take our time. +Мы можем не торопиться. +We can take our time. +Мы можем не торопиться. +I bet you won't last long! +Держу пари, долго ты не протянешь! +I bet you won't last long! +Держу пари, долго ты не протянешь! +I bet you won't last long! +Держу пари, долго ты не протянешь! +You won't be getting out tonight! +Сегодня ты никуда не выйдешь! +I found my new pet for the day! +Я нашла себе нового питомца на сегодняшний день! +I bet you won't last long! +Держу пари, долго ты не протянешь! +Not a clock? Useless! +Не часы? Бесполезно! +It's not time to go. +Еще не время уходить. +Why are you attacking me this time? +Почему ты напала на меня в это время? +I'll make this quick. +Я сделаю это быстро. +Why are you attacking me this time? +Почему ты напала на меня в это время? +I'll make this quick. +Я сделаю это быстро. +I've mastered this spell last night! +Я освоила это заклинание прошлой ночью! +I've mastered this spell last night! +Я освоила это заклинание прошлой ночью! +I've mastered this spell last night! +Я освоила это заклинание прошлой ночью! +Why are you attacking me this time? +Почему ты напала на меня в это время? +Not a clock? Useless! +Не часы? Бесполезно! +Not a clock? Useless! +Не часы? Бесполезно! +Not a clock? Useless! +Не часы? Бесполезно! +Hey! No getting out before midnight! +Эй! До полуночи никуда не выходить! +Let's dance under the moonlight. +Давай потанцуем при лунном свете. +Do you have time to take it back? +У тебя есть время вернуть все назад? +I can do this all day! +Я могу заниматься этим весь день! +It's only a matter of time before I get you. +Это только вопрос времени, когда я доберусь до тебя. +It's too bright here... +Здесь слишком ярко... +Why are you attacking me this time? +Почему ты напала на меня в это время? +It seems you have nyctalopia... +Похоже, у тебя никталопия... +It seems you have nyctalopia... +Похоже, у тебя никталопия... +I found my new pet for the day! +Я нашла себе нового питомца на сегодняшний день! +It's time for you to give up. +Время тебе сдаваться. +Give me a moment~ +Дай мне секундочку~ +Give me your watch! +Отдай мне свои часы! +Here's a clock without the 'C'. +Вот тебе часы без буквы 'С'. (C/Lock=Замок) +Hello stranger. Do you know what time it is? +Привет, незнакомка. Ты знаешь, какое сейчас время? +This'll be over in an instant. +Это закончится через мгновение. +Time to wrap this up. +Время заворачивать. +Let's dance under the moonlight. +Давай потанцуем при лунном свете. +Playtime's over! +Время игр закончилось! +Hold on a minute! +Подожди минутку! +Tick tock, what a shock... +Тик-так-ток, какой шок... +Time for me to intervene... +Время мне вмешаться. +Don't balk! Your time was up anyways~ +Не упирайся! Твое время все равно вышло~ +Playtime's over! +Время игр закончилось! +I bet you won't last long! +Держу пари, долго ты не протянешь! +Playtime's over! +Время игр закончилось! +Give me a moment~ +Дай мне секундочку~ +Calling in a SPL! +Взываю, SPL! +A-assistance required! +П-помогите мне! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +You'll have to try harder if you want to discipline me, ma'am. +Вам придется больше стараться, если вы хотите приструнить меня, мэм. +I... don't have time for training right now, ma'am... +У меня... сейчас нет времени на тренировки, мэм... +Did I do something wrong? +Я сделала что-то не так? +So you're the new boss, huh? +Так ты новый босс, да? +Time for some 'training?' +Время для небольшой 'тренировки'? +Wanna to have a chat? +Хочешь поболтать? +Looks like you've had too much time to yourself. +Похоже, у тебя было слишком много личного времени. +Why don't you come with me for a sec? +Почему бы тебе на секундочку не пройти со мной? +Let me see your ID... +Позволь мне взглянуть на твое удостоверение личности... +You have the right to remain silent. +Ты имеешь право хранить молчание. +Let's have a chat. +Давайте поговорим. +Who set you loose? +Кто тебя освободил? +I'll be confiscating that. +Я конфискую это. +Aye, you're gonna need clearance for that, missy. +Эй, для этого тебе нужно разрешение, мисси. +Halt! +Остановись! +You just made a big mistake. +Ты только что совершила большую ошибку. +Need backup! +Нужна подмога! +You're under arrest! +Ты арестована! +Magic use is restricted pursuant to IDC section 3 article 21a. +Использование магии ограничено в соответствии со статьей 21а раздела 3 IBC. +Magic? That's where I draw the line. +Магия? Здесь я провожу черту. +I've got an extra comfy cell for mages. +У меня есть очень удобная камера для магов. +You're under arrest! +Ты арестована! +That's off limits for you! +Это для тебя запрещено! +Resorting to petty theft? How crude. +Прибегаешь к мелкому воровству? Как грубо. +The goddesses have property rights too, you know. +Знаешь, у богинь тоже есть права собственности. +I'm gonna ask you to turn yourself in. +Я собираюсь попросить тебя сдаться полиции. +Keep your hands where I can see 'em. +Держи свои руки так, чтобы я могла их видеть. +That's a weapons violation. +Это нарушение правил обращения с оружием. +Assaulting an officer is a crime! +Нападение на офицера - это преступление! +You're coming with me. +Ты идешь со мной. +Resisting arrest won't get you anywhere. +Сопротивление аресту ничего тебе не даст. +Resisting arrest won't get you anywhere. +Сопротивление аресту ничего тебе не даст. +Is that all you got? +Это все, что у тебя есть? +Is that all you got? +Это все, что у тебя есть? +You have the right to remain silent. +Ты имеешь право хранить молчание. +Got you! +Попалась! +Hands behind your back. +Руки за спину. +I will conduct a more thorough search later on. +Позже я проведу более тщательный обыск. +Suspect is secure. +Подозреваемая надежно скована. +Officer PTRN, reporting for duty! +Офицер PTRN, готова к службе! +Halt! You're under arrest! +Стоять! Вы арестованы! +You seeing what I'm seeing? +Ты видишь то же, что и я? +I'll have to finish my donut later... +Мне придется доесть свой пончик позже... +Backup is here! +Подкрепление здесь! +Hands up! Don't move! +Руки вверх! Не двигаться! +Lay down your weapons and don't move! +Сложить оружие и не двигаться! +I have a warrant for your arrest... +У меня есть ордер на твой арест... +You're a wanted girl. +Ты в розыске, девочка +You're under arrest. +Ты арестована. +Backup has arrived. +Прибыло подкрепление. +Requesting backup! +Запрашиваю подкрепление! +Calling in a blockade! +Начать блокаду! +Hidden technique: SPL! +Секретная техника: SPL! +I practiced a thousand times... for this!? +Я тренировалась тысячу раз... ради этого!? +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +I'm not in trouble, am I? +Я ведь не попала в неприятности, нет? +I'm not hiding anything, if you know what I mean... +Я ничего не скрываю, если ты понимаешь, что я имею в виду... +Who are you looking for? Me? +Кого ты ищешь? Меня? +So... wanna hang out? +Итак... хочешь потусоваться? +It's not like I... LIKE you or something... +Это не похоже на меня, ты мне... НРАВИШЬСЯ или что-то в этом роде... +I'm not following you! I'm just... +Я тебя не преследую! Я просто... +You look suspicious. +Ты выглядишь подозрительно. +You've got a nice pair of wrists~ +У тебя красивые запястья~ +You there! Let's have a talk. +Ты здесь! Давай поговорим. +Looks like you're rusty. Haven't you ever done escape training? +Похоже, ты ржавая как железяка. Ты что, никогда не проходила подготовку по побегу? +I'm going to have some fun with you~ +Я собираюсь немного повеселиться с тобой~ +Watch yourself, girl~ +Следи за собой, девочка~ +Nice find. I'll take it. +Хорошая находка. Я возьму это. +This place is off-limits for you. +Это место для тебя под запретом. +Target is in my sights. +Цель у меня на прицеле. +Let's see how you like my special move! +Давай посмотрим, как тебе понравится мой особый прием! +That's nothing compared to my technique! +Это ничто по сравнению с моей техникой! +You're in for it now! +Теперь ты в деле! +It's time for a display of skill! +Пришло время продемонстрировать свое мастерство! +Fancy tricks? That's nothing. +Необычные трюки? Пф, да это ерунда. +Let me show you a real move... +Позволь мне показать тебе настоящие движения... +True skill comes from the heart. Not something you hold in your hand. +Истинное мастерство исходит из сердца. Не то, что ты держишь в руке. +She's not going to be happy about that... +Она вряд ли обрадуется этому... +Stop right there, criminal scum! +Остановись немедленно, преступное отребье! +Do you know what you've just done? +Ты хоть понимаешь, что ты только что сделала? +Finally, I've tracked you down! +Наконец-то я тебя выследила! +It's over. I've already won. +Все кончено. Я уже победила. +Wrong move, buddy. +Неверный ход, подруга. +I can't believe it... +Я не могу в это поверить... +You're too slow. +Ты слишком медлительна. +...she's fast. +...она быстрая +...she's strong. +... она сильная. +Nothing personal. +Ничего личного. +Is that all? +И это все? +This battle is over. +Битва окончена. +Get over here! +Иди сюда! +Too slow! +Слишком медленно! +I'll be taking that. +Я возьму это. +There's no way out. +Отсюда нет выхода. +The name's PTRN. Don't forget it. +Меня зовут PTRN. Не забывай этого. +There's a juicy bounty on your head and I want it! +За твою голову назначена щедрая награда, и я хочу ее получить! +Hmph. This battle is already over. +Хмф. Эта битва уже окончена. +Time for some target practice. +Пора немного потренироваться в стрельбе по мишеням. +Didn't expect me, did ya? +Не ожидала меня, не так ли? +Boo! Ha, scared ya~ +Бу! Ха, напугала тебя~ +What, did you think I'd just stand here? +Что, ты думала, я буду просто стоять на месте? +There's a bounty on your head, miss. +За твою голову назначена награда, мисс. +I won't let you get away. That bounty is mine. +Я не позволю тебе уйти. Эта награда будет моя. +Didn't expect me to show up, did you? +Не ожидала, что я появлюсь, не так ли? +Need backup? +Нужна поддержка? +Time for a test of skill. +Время для проверки мастерства. +I'll get you! Eventually... +Я доберусь до тебя! Когда-нибудь... +Let's see how you like my SPL! +Давай посмотрим, как тебе понравится SPL! +Wait, wrong button! Aaahh~ +Подожди, не так кнопка! А-а-ай~ +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +I'm not in trouble, am I? +Я ведь не попала в неприятности, нет? +I'm not hiding anything, if you know what I mean... +Я ничего не скрываю, если ты понимаешь, что я имею в виду... +Who are you looking for? Me? +Кого ты ищешь? Меня? +So... wanna hang out? +Итак... хочешь потусоваться? +It's not like I... LIKE you or something... +Это не похоже на меня, ты мне... НРАВИШЬСЯ или что-то в этом роде... +I'm not following you! I'm just... +Я тебя не преследую! Я просто... +You're a cute one~ +Ты очень симпатичная~ +You've got a nice pair of wrists~ +У тебя красивые запястья~ +Hey~! Let's have a talk. +Эй~! Давай поговорим. +Looks like you need additional training. +Похоже, тебе нужна дополнительная тренировка. +I'm going to have some fun with you~ +Я собираюсь немного повеселиться с тобой~ +Watch yourself, girl~ +Следи за собой, девочка~ +Nice find. I'll take it. +Хорошая находка. Я возьму это. +This place is off-limits for you. +Это место для тебя под запретом. +I spy a cute one! +Я заметила одну милашку! +Bad pet! +Плохой питомец! +Looks like you're gonna need the extra special treatment~ +Похоже, тебе нужен особый уход~ +Now you've done it! +Ты сделала это! +Magic? Hah... +Магия? Ха... +Such outdated practices... +Такая старомодная практика... +Your spells are nothing compared to technology. +Твои заклинания - ничто по сравнению с технологией. +Quit messing around. +Хватит валять дурака. +Don't even think about appealing to your goddess! +Даже не думай взывать к своей богине! +Stop right there! +Остановись! +It'll take you quite a while to pay off those damages! +Тебе потребуется немало времени, чтобы возместить этот ущерб! +Finally, I've tracked you down! +Наконец-то я тебя выследила! +Now there, good girl! +Ну вот, умница! +Wrong move! +Неверный ход! +Get your paws off me! +Убери от меня свои лапы! +*scoffs* Could use some work~ +*усмехается* Не помешало бы кое-что использовать~ +Such speed! +Такая скорость! +Clever! +Умно! +Nothing personal. +Ничего личного. +Nothing personal. +Ничего личного. +This battle is over. +Битва окончена. +Get over here! +Иди сюда! +Too slow! +Слишком медленно! +I'll be taking that. +Я возьму это. +There's no way out. +Отсюда нет выхода. +PTRN, Nevermere associate. Here's my card. +PTRN, партнер Невермера. Вот моя визитка. +I run a legitimate business, I promise! +Я веду законный бизнес, клянусь! +Is it the tax collectors? Oh, no, it's just you... +Это сборщики налогов? О, нет, это всего лишь ты... +Looks like you landed on the wrong side of the coin~ +Похоже, ты оказалась не на той стороне медали~ +A deal's a deal, my friend. +Сделка есть сделка, друг мой. +Excuse me, you just attacked my client. +Извини, ты просто напала на моего клиента. +Hey! We were just talking! No sketchy underground dealings, nope. +Эй! Мы просто разговаривали! Никаких сомнительных подпольных сделок, нет. +I'll help capture her! For a 50% share that is~ +Я помогу поймать ее! За долю в 50%~ +We deal in the finest products... like you, if you catch my drift~ +Мы имеем дело с лучшими продуктами... как ты, если ты понимаешь, о чем я ~ +I smell a shady business opportunity~ +Я чувствую запах возможности для нелегального бизнеса~ +*growls menacingly* +*угрожающе рычит* +Let's make this fun~ +Давайте сделаем это веселым~ +What's that about backup? +Что там насчет подкрепления? +Let's see how you like my SPL! +Давай посмотрим, как тебе понравится SPL! +Wait no, wrong button! +Подожди, не так кнопка! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Catch me. If you can, that is. +Поймать меня. Если, конечно, сможешь. +I double dare you. +Я дважды бросаю тебе вызов. +Weren't you chasing me? +Разве ты не гналась за мной? +Catch me. If you can, that is. +Поймать меня. Если, конечно, сможешь. +I double dare you. +Я дважды бросаю тебе вызов. +Weren't you chasing me? +Разве ты не гналась за мной? +I've got somethin nice for ya. +У меня есть для тебя кое-что приятное. +Be a good girl for me, will ya? +Будь хорошей девочкой ради меня, ладно? +You need to show some restraint. +Тебе нужно показать несколько ограничителей. +Stay where you belong, you naughty girl. +Оставайся где приказано, непослушная девчонка. +Let's go somewhere more private. +Давай пойдем в более уединенное место. +Watch yourself, girl~ +Следи за собой, девочка~ +Nice find. I'll take it. +Хорошая находка. Я возьму это. +This place is off-limits for you. +Это место для тебя под запретом. +Ready or not, here I come. +Готова ты или нет, но я иду. +Bad pet! +Плохой питомец! +Looks like you're gonna need the extra special treatment~ +Похоже, тебе нужен особый уход~ +Now you've done it! +Ты сделала это! +Magic? Hah... +Магия? Ха... +Such outdated practices... +Такая старомодная практика... +Your spells are nothing compared to technology. +Твои заклинания - ничто по сравнению с технологией. +Quit messing around. +Хватит валять дурака. +Those sticky fingers belong in a pair of mittens. +Эти ловкие пальчики должны быть в варежках. +Those sticky fingers belong in a pair of mittens. +Эти ловкие пальчики должны быть в варежках. +Those sticky fingers belong in a pair of mittens. +Эти ловкие пальчики должны быть в варежках. +All units. Apprehend convict with extreme prejudice. +Всем юнитам. Задержать осужденного любой ценой. +You're going nowhere. +Ты никуда не пойдешь. +Come on. This wasn't your only weapon, was it? +Ну давай же. Это было не единственное твое оружие, не так ли? +Get your paws off me! +Убери от меня свои лапы! +*scoffs* Could use some work~ +*усмехается* Не помешало бы кое-что использовать~ +Such speed! +Такая скорость! +A tank, huh. +Будто танк, хух. +Nothing personal. +Ничего личного. +Nothing personal. +Ничего личного. +This battle is over. +Битва окончена. +You're going nowhere. +Ты никуда не пойдешь. +Too slow! +Слишком медленно! +Mine now. +Теперь моё. +Just keeping you safe from yourself. +Просто защищаю тебя от самой себя. +PTRN, Nevermere associate. Here's my card. +PTRN, партнер Невермера. Вот моя визитка. +I run a legitimate business, I promise! +Я веду законный бизнес, клянусь! +Is it the tax collectors? Oh, no, it's just you... +Это сборщики налогов? О, нет, это всего лишь ты... +Looks like you landed on the wrong side of the coin~ +Похоже, ты оказалась не на той стороне медали~ +A deal's a deal, my friend. +Сделка есть сделка, друг мой. +Excuse me, you just attacked my client. +Извини, ты просто напала на моего клиента. +Hey! We were just talking! No sketchy underground dealings, nope. +Эй! Мы просто разговаривали! Никаких сомнительных подпольных сделок, нет. +I'll help capture her! For a 50% share that is~ +Я помогу поймать ее! За долю в 50%~ +We deal in the finest products... like you, if you catch my drift~ +Мы имеем дело с лучшими продуктами... как ты, если ты понимаешь, о чем я ~ +I smell a shady business opportunity~ +Я чувствую запах возможности для нелегального бизнеса~ +*growls menacingly* +*угрожающе рычит* +Let's make this fun~ +Давайте сделаем это веселым~ +What's that about backup? +Что там насчет подкрепления? +SPL, sing to me! +SPL, пой для меня! +SPL, listen to me... +SPL, слушай меня... +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +An outsider! +Посторонняя! +Hide! +Исчезни! +I have done nothing worthy of punishment! +Я не сделала ничего, заслуживающего наказания! +I have come to study human customs. Teach me about Domination. +Я пришла изучать человеческие обычаи. Научи меня Доминированию. +The outsiders have such... strange and interesting practices. +У чужаков такие... странные и интересные обычаи. +You seem to have many skills. Teach me about... rope. +Похоже, у тебя много навыков. Научи меня... веревкам. +Hello, Outsider. +Привет, чужачка. +You look so... bland. +Ты выглядишь такой... нежной. +Outsiders are so picky about what they wear... +Чужаки так придирчивы к тому, что они носят... +Tight and secure, as all things should be. +Плотно и надежно, как и должно быть во всех вещах. +I have just the thing in mind for you... +У меня есть как раз то, что тебе нужно... +Let us put those hands away... +Давай уберем эти руки подальше... +Give back what you take. +Возвращай то, что берешь. +You must remain here. +Ты должна оставаться здесь. +Trespasser! +Нарушитель! +Resorting to violence? +Прибегаешь к насилию? +Let us clash swords! +Давай скрестим мечи! +*scoffs* +*насмехается* +You have brought judgement upon youself. +Ты навлекла на себя наказание. +Your magic is that of a child. +Твоя магия - это магия ребенка. +Imagine what you could learn in twelve lifetimes... +Представь, чему ты могла бы научиться за двенадцать жизней... +You rely on cheap gadgets. +Ты полагаешься на дешевые гаджеты. +Do not defile the ancients. +Не оскверняй древних. +Give that back! +Отдай обратно! +The ancients are appalled. +Древние возмущены. +The outsider has escaped! +Чужачка сбежала! +Ready to reconsider? +Готова пересмотреть свое решение? +A classic blunder. +Классическая ошибка. +You will regret that, outsider. +Ты пожалеешь об этом, чужачка. +You get what you deserve. +Ты получаешь то, что заслуживаешь. +You didn't see that. +Ты этого не видела. +You didn't see that. +Ты этого не видела. +It looks like my skills are superior. +Похоже, мои навыки лучше. +It looks like my skills are superior. +Похоже, мои навыки лучше. +I will show you your place, outsider. +Я покажу тебе твое место, чужачка. +You will come with me. +Ты пойдешь со мной. +I regret to inform you that your battle ends here. +Я с сожалением сообщаю тебе, что наша битва на этом заканчивается. +You won't be needing that. +Тебе это не понадобится. +There we go. +Давай. +You stand before PTRN, blessed by the Goddess Ninril. +Ты стоишь перед PTRN, благословленной богиней Нинрил. +By the Four... +Клянусь Четырьмя... +I shall put an end to this. +Я положу этому конец. +I swear I will capture her! +Клянусь, я поймаю ее! +Nature compels me to intervene! +Природа вынуждает меня вмешаться! +I shall protect every one of the Goddess' creations. +Я буду защищать каждое из творений Богини. +Justice shall be had! +Справедливость восторжествует! +I shall defend you from this outsider! +Я защищу тебя от этой чужачки! +The outsider betrays our ally! +Чужачка предела нашего союзника! +You have faltered in your ways. I shall correct that! +Ты оступилась на своем пути. Я исправлю это! +Truly concerning. +Относительно верно. +You leave me no choice. +Ты не оставляешь мне выбора. +I stand firm. +Я выстою. +Behold, SPL. +Узри, SPL. +Y-your fate has been postponed... briefly. +Т-ты избежала своей судьбы... ненадолго. +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +An outsider! +Посторонняя! +Hide! +Исчезни! +I have done nothing worthy of punishment! +Я не сделала ничего, заслуживающего наказания! +I have come to study human customs. Teach me about Domination. +Я пришла изучать человеческие обычаи. Научи меня Доминированию. +The outsiders have such... strange and interesting practices. +У чужаков такие... странные и интересные обычаи. +You seem to have many skills. Teach me about... rope. +Похоже, у тебя много навыков. Научи меня... веревкам. +Hello, Outsider. +Привет, чужачка. +You look so... bland. +Ты выглядишь такой... нежной. +Outsiders are so picky about what they wear... +Чужаки так придирчивы к тому, что они носят... +You look cute in that, you should lose the rest though! +В этом ты выглядишь мило, но все остальное тебе нужно снять! +I have just the thing in mind for you... +У меня есть как раз то, что тебе нужно... +Let us put those hands away... +Давай уберем эти руки подальше... +Give back what you take. +Возвращай то, что берешь. +You must remain here. +Ты должна оставаться здесь. +Trespasser! +Нарушитель! +Resorting to violence? +Прибегаешь к насилию? +Let us clash swords! +Давай скрестим мечи! +*scoffs* +*насмехается* +You have brought judgement upon youself. +Ты навлекла на себя наказание. +Your magic is that of a child. +Твоя магия - это магия ребенка. +Imagine what you could learn in twelve lifetimes... +Представь, чему ты могла бы научиться за двенадцать жизней... +You rely on cheap gadgets. +Ты полагаешься на дешевые гаджеты. +Do not defile the ancients. +Не оскверняй древних. +Give that back! +Отдай обратно! +The ancients are appalled. +Древние возмущены. +The outsider has escaped! +Чужачка сбежала! +Ready to reconsider? +Готова пересмотреть свое решение? +A classic blunder. +Классическая ошибка. +You will regret that, outsider. +Ты пожалеешь об этом, чужачка. +You get what you deserve. +Ты получаешь то, что заслуживаешь. +You didn't see that. +Ты этого не видела. +You didn't see that. +Ты этого не видела. +It looks like my skills are superior. +Похоже, мои навыки лучше. +It looks like my skills are superior. +Похоже, мои навыки лучше. +I will show you your place, outsider. +Я покажу тебе твое место, чужачка. +You will come with me. +Ты пойдешь со мной. +I regret to inform you that your battle ends here. +Я с сожалением сообщаю тебе, что наша битва на этом заканчивается. +You won't be needing that. +Тебе это не понадобится. +There we go. +Давай. +You stand before PTRN, blessed by the Goddess Ninril. +Ты стоишь перед PTRN, благословленной богиней Нинрил. +By the Four... +Клянусь Четырьмя... +I shall put an end to this. +Я положу этому конец. +I swear I will capture her! +Клянусь, я поймаю ее! +Nature compels me to intervene! +Природа вынуждает меня вмешаться! +I shall protect every one of the Goddess' creations. +Я буду защищать каждое из творений Богини. +Justice shall be had! +Справедливость восторжествует! +I shall defend you from this outsider! +Я защищу тебя от этой чужачки! +The outsider betrays our ally! +Чужачка предела нашего союзника! +You have faltered in your ways. I shall correct that! +Ты оступилась на своем пути. Я исправлю это! +Truly concerning. +Относительно верно. +You leave me no choice. +Ты не оставляешь мне выбора. +I stand firm. +Я выстою. +### SPL! + +Mmmph! +Мммфх! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +I don't like the way you're looking at me! +Мне не нравится, как ты на меня смотришь! +Yes, I've got the secrets of nature right here... +Да, прямо здесь у меня есть секреты природы... +Why don't you come after me? +Почему бы тебе не последовать за мной? +Why don't you teach me your... magic? +Почему бы тебе не научить меня своей... магии? +Guarding nature is a chore. Why don't we relax~ +Охрана природы - это тяжелая работа. Почему бы нам не расслабиться~ +Got something in mind for me? +У тебя есть что-то на примете для меня? +Well met, outsider! +Рада встрече, чужачка! +You look so... bland. +Ты выглядишь такой... нежной. +Outsiders are so picky about what they wear... +Чужаки так придирчивы к тому, что они носят... +Tight and secure, as all things should be. +Плотно и надежно, как и должно быть во всех вещах. +I have just the thing in mind for you... +У меня есть как раз то, что тебе нужно... +Let us put those hands away... +Давай уберем эти руки подальше... +Give back what you take. +Возвращай то, что берешь. +You must remain here. +Ты должна оставаться здесь. +Intruder! +Вторжение! +Resorting to violence? +Прибегаешь к насилию? +Let us clash swords! +Давай скрестим мечи! +*scoffs* +*насмехается* +You have brought judgement upon youself. +Ты навлекла на себя наказание. +Your magic is that of a child. +Твоя магия - это магия ребенка. +Imagine what you could learn in twelve lifetimes... +Представь, чему ты могла бы научиться за двенадцать жизней... +You rely on cheap gadgets. +Ты полагаешься на дешевые гаджеты. +Do not defile the ancients. +Не оскверняй древних. +Give that back! +Отдай обратно! +The ancients are appalled. +Древние возмущены. +The outsider has escaped! +Чужачка сбежала! +Ready to reconsider? +Готова пересмотреть свое решение? +A classic blunder. +Классическая ошибка. +You will regret that, outsider. +Ты пожалеешь об этом, чужачка. +You get what you deserve. +Ты получаешь то, что заслуживаешь. +You didn't see that. +Ты этого не видела. +You didn't see that. +Ты этого не видела. +It looks like my skills are superior. +Похоже, мои навыки лучше. +It looks like my skills are superior. +Похоже, мои навыки лучше. +I will show you your place, outsider. +Я покажу тебе твое место, чужачка. +You will come with me. +Ты пойдешь со мной. +I regret to inform you that your battle ends here. +Я с сожалением сообщаю тебе, что наша битва на этом заканчивается. +You won't be needing that. +Тебе это не понадобится. +There we go. +Давай. +My name? Uh... let's go with PTRN. +Мое имя? Э-э... давай выберем PTRN. +You will not get away with this, outsider! +Тебе это с рук не сойдет, чужачка! +You shall pay with your freedom. +Ты заплатишь своей свободой. +Ninril demands justice. +Нинрил требует справедливости. +Nature calls me! +Природа зовет меня! +I hear the little creatures crying out! +Я слышу, как взывают маленькие существа! +Such betrayal! +Такое предательство! +Nature guides us! +Природа ведет нас! +Nature protects those who are worthy! +Природа защищает тех, кто достоин! +I share the will of the Goddess! +Я несу волю Богини! +They won't get away with this! +Им это с рук не сойдет! +Face my wrath! +Встреться лицом к лицу с моим гневом! +Nature protects! +Природа защищает! +### SPL! + +### !!! + +Run away! +Беги отсюда! +Run! +Беги! +Scary! +Ужасная! +### This is a bug, please report + +### This is a bug, please report + +### This is a bug, please report + +Girl! +Девочка! +Wear this! +Надень это! +Come here! +Иди сюда! +### ... + +Capture... +Захватили... +Need tighten! +Нужно туже! +Confiscate! +Конфисковать! +Confiscate!! +Конфисковать! +Alert! +Тревога! +Intruder! Alert! +Вторжение! Тревога! +Fight girl! +Бойкая девчонка! +Fight! +Сражайся! +Magic! +Магия! +Wizard! +Чародей! +Forbidden! +Запрещено! +Forbidden! +Запрещено! +Defiler! +Осквернитель! +Confiscate!!! +Конфисковать!!! +Defiler!!! +Осквернитель!!! +Intruder escape! +Незваная гостья сбежала! +Stay! +Стоять! +Got you! +Попалась! +Pain... +Боль... +Fight! +Сражайся! +Come back! +Вернись! +Stop! +Стоять! +Missed! +Упустила! +Missed! +Упустила! +Capture!!! +Захват!!! +Come here! +Иди сюда! +Got her!!! +Поймала ее!!! +Take! +Держать! +Secure! +Сковать! +Greetings Madame, you may call me PTRN. +Приветствую, мадам, вы можете называть меня PTRN. +Defend! +Защищать! +Protect! +Оборонять! +Fight! +Сражаться! +Protect! +Оборонять! +Defend! +Защищать! +Fight! +Сражаться! +Fight! +Сражаться! +Protect! +Оборонять! +Defend! +Защищать! +Rawr! +Рррр! +SPL! Now my wrath is revealed! +SPL! Теперь ты узришь мой гнев! +Wh-what happened? What weakness has infiltrated Myrtrice? +Ч-что случилось? Какая слабость овладела Миртис? +You will loose me or burn eternal!!! +Ты проиграешь мне или будешь гореть вечно!!! +... This shame is unbearable! Oh sister!!! +... Этот позор невыносим! О, сестра!!! +Oh! Mytrice is caught! My ambitions laid to ruin! +Ох! Миртис поймана! Мои амбиции потерпели крах! +The winds of retribution carry me elsewhere... +Ветры возмездия уносят меня в другое место... +Myrtrice will come for you shortly! Consider yourself fortunate... +Миртис скоро вернется за тобой! Считай, что тебе повезло... +I will retreat into darkness... +Я отступаю во тьму... +My sins are a multitude! I will submit to your judgements... +У меня множество грехов! Я подчинюсь твоему суду... +I do not ask for mercy for I have shown none! +Я не прошу о милосердии, ибо я его не проявляла! +You must punish me! I can't face my sister Myrtle until my debts are paid... +Ты должна наказать меня! Я не смогу смотреть в глаза своей сестре Миртл, пока не заплачу по долгам... +Your chest quivers... Do you fear me? +Твоя грудь трепещет... Ты боишься меня? +Is it that another moth has become enthralled to my fires bright? +Неужели еще один мотылек прилетел на мое яркое пламя? +Myrtrice entreats you! Remain still and let my adoring embers kiss your lips tender... +Миртис умоляет тебя! Оставайся неподвижной и позволь моим любвеобильным уголькам нежно поцеловать твои губы... +To struggle is to invite searing coals upon your head! +Бороться - значит навлекать на свою голову жгучие угли! +I will drag you into the dark and you will witness my projects! +Я утащу тебя во тьму, и ты станешь свидетелем моих замыслов! +To escape is only to delay! My fires consume ALL! +Бежать - значит только откладывать! Мои пожары поглотят ВСЕ! +Dusty trinkets... Your scrapping around is an insolence! +Пыльные безделушки... Твоя бесцеремонность - это наглость! +You would scorn the memory of my sister with escape?! +Ты хочешь унизить память о моей сестре своим побегом?! +Careless of you to appear before Myrtrice like this! +Неосторожно с твоей стороны предстать перед Миртис в таком виде! +Your attempts are trivial! +Твои попытки ничтожны! +You invite wrath!!! +Ты навлекла на себя гнев!!! +Pathetic!!! +Жалкая!!! +Such hapless casting scorns the memory of my sister! +Такое неудачное заклинание оскорбляет память о моей сестре! +Your magics will be swallowed up by hellfire!!! +Твоя магия будет поглощена адским пламенем!!! +Myrtrice is subject to no magic!!! +Миртис не подвластна магии!!! +Items? How exceptionally talentless... +Предметы? Какая исключительная бездарность... +That shrine scorns the memory of my sister! I hate it! +Это святилище оскорбляет память о моей сестре! Я ненавижу это! +True power doesn't come from old rickety crates... +Истинная сила исходит не от старых расшатанных клеток... +Orbs? What a gruesome display of weakness! True power comes from the self! +Сферы? Какое ужасное проявление слабости! Истинная сила исходит от нас самих! +YOU SCORN THE MEMORY OF MY LATE SISTER!!! +ТЫ ОСКОРБЛЯЕШЬ ПАМЯТЬ МОЕЙ ПОКОЙНОЙ СЕСТРЫ!!! +This is where you will remain until Myrtrice wills otherwise! +Здесь ты и останешься, пока Миртис не передумает! +This is what you were gripping so tightly in your hands? +Это то, что ты так крепко сжимала в своих руках? +WHAT ABBORANCE! You will pay for that... +КАКОЕ ПРЕНЕБРЕЖЕНИЕ! Ты заплатишь за это... +SEAR ETERNAL! +ВЕЧНОЕ ИССУШЕНИЕ! +I, Myrtrice, missed?! +Я, Миртис, промахнулась?! +No one resists Myrtrice! How irritating!!! +Никто не устоит перед Миртис! Как ты раздражаешь!!! +Your failures do not surprise Myrtrice! +Твои неудачи не удивляют Миртис! +Your pathetic attempts scorn the memory of my sister! +Твои жалкие попытки оскорбляют память моей сестры! +The curtains of my revenge are drawn! You will follow me... +Занавес моей мести опущен! Ты последуешь за мной... +You will come with Myrtrice!!! +Ты пойдешь за Миртис!!! +Be dazed by the radiant brilliance of my hellfires! +Ты будешь ошеломлена ярким сиянием моего адского пламени! +I will repay the theif with brutal reprisal... +Я отплачу ворам жестоким возмездием... +Your fate is sealed! ... Myrtle this is for you, sister! +Твоя судьба предрешена! ... Миртл, это всё ради тебя, сестра! +All creatures are subject to Myrtrice! It is the price of their insolence... +Все существа подчиняются Миртис! Такова цена их наглости... +You make a grave mistake ignoring me!!! +Ты совершаешь серьезную ошибку, игнорируя меня!!! +Your eyes belong here! With Myrtrice!!! +Твоим глазам место здесь! С Миртис!!! +The ones who turn their backs on Myrtrice SEAR IN HELLFIRE! +Те, кто отворачивается от Миртис, СГОРАЮТ В АДСКОМ ПЛАМЕНИ! +What a hideous display!!! Where is your honor? +Что за отвратительное зрелище!!! Где же твоя честь? +It is this kind of petulant insolence that tarnishes the memory of my sister! +Именно такая раздражительная наглость бросает тень на память о моей сестре! +You are a blight! My sister Myrtle would never stand for this!!! +Ты - ходячее проклятие! Моя сестра Миртл никогда бы этого не потерпела!!! +THE CURTAINS OF MY REVENGE DRAW OPEN WIDE! +ЗАНАВЕС МОЕЙ МЕСТИ РАСПАХИВАЕТСЯ НАСТЕЖЬ! +What an excellent oppertunity to expand my alters in the dark! +Какая прекрасная возможность расширить свои возможности в тьме! +I see a chalice before me... it drips with shadow and overflows with darkness! +Я вижу перед собой чашу... она окутана тенью и переполнена тьмой! +My late sister Myrtle was a much more proficent defender than I... Oh how I long for her *sob* +Моя покойная сестра Миртл была гораздо более умелой защитницей, чем я... О, как я тоскую по ней *хнык* +THE PATH OF MY RETRIBUTION IS PAVED WITH BRIMSTONE AND BATHED IN BLAZING HELLFIRE! BURN! +ПУТЬ МОЕГО ВОЗМЕЗДИЯ ВЫМОЩЕН СЕРОЙ И ОМЫТ ПЫЛАЮЩИМ АДСКИМ ПЛАМЕНЕМ! ГОРИ! +I, Myrtrice, will resist their insolent fusilades! +Я, Миртис, буду сопротивляться их дерзким атакам! +### SPL. + +This mind is altered... +Этот разум изменился... +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +So this is what it's like... +Так вот на что это похоже... +I believe I am feeling an emotion called 'fear.' +Мне кажется, я испытываю эмоцию, называемую 'страх'. +Stay back! I am not your toy. +Отойди! Я не твоя игрушка. +Teach me about 'domination.' +Научи меня 'доминированию'. +Allow me to learn by experience. +Позвольте мне учиться на собственном опыте. +As they say, 'do whatever you want to me.' +Как говорится, 'делай со мной все, что хочешь'. +Come here, surface-dweller. I have things for you. +Иди сюда, обитательница поверхности. У меня есть кое-что для тебя. +You should improve yourself. Come here. +Тебе следует совершенствоваться. Иди сюда. +You must learn our ways. +Ты должна научиться нашим обычаям. +Yes... struggle and learn. +Да... борись и учись. +I will take you somewhere safe. +Я отведу тебя в безопасное место. +You need to learn your place. +Тебе нужно знать свое место. +Do not take what is not yours. +Не бери то, что тебе не принадлежит. +You will not escape. +Тебе не сбежать. +We see you... +Мы видим тебя... +Our ways are ancient! +Мы следуем древним путям! +Your weapons are toys to us! +Ваше оружие для нас - игрушки! +So naive, surface-dweller. +Такая наивный, обитательница поверхности. +Our magic is older than your gods! +Наша магия старше ваших богов! +You should learn our ways instead, surface-dweller. +Вместо этого тебе следует изучить наши обычаи, обитательница поверхности. +You have much learning to do. +Тебе еще многому предстоит научиться. +You are playing with child's toys! +Ты играешься с детскими игрушками! +Do not plead to your gods. +Не взывай к своим богам. +Give that back, surface-dweller! +Отдай это обратно, обитательница поверхности! +Your gods offend us. +Ваши боги оскорбляют нас. +You will not escape, surface-dweller! +Тебе не сбежать, обитательница поверхности! +You must not go. +Ты не должна уходить. +That was a failure. +Это был провал. +That was commendable. +Это было достойно. +I have you now, surface-dweller. +Теперь ты у меня в руках, обитательница поверхности. +You are a fast one. +Ты очень шустрая. +You are a tricky one. +Ты очень хитрая. +You seem out of practice. +Похоже, ты давно не практиковалась. +You seem out of practice. +Похоже, ты давно не практиковалась. +I will take you to your place. +Я отведу тебя на твоё место. +Come. +За мной. +Stay down. +Стой здесь. +I will take this. +Я возьму это. +You will not escape. +Тебе не сбежать. +We are PTRN. +Мы - PTRN. +The collective defends itself. +Коллектив защищает себя. +We are one. +Мы едины. +Ow, that hurt! +Ох, это больно! +We do not stand for this. +Мы этого не потерпим. +Do not attack our allies. +Не нападай на наших союзников. +Our friends are in need. +Наши друзья в беде. +You have been judged and found wanting. +Вас осудили и признали неполноценной. +We sense disarray. +Мы чувствуем смятение. +We stand together. +Мы стоим вместе. +We support each other. +Мы поддерживаем друг друга. +You leave us no choice. +Ты не оставляешь нам выбора. +You cannot comprehend our tactics. +Тебе не постичь нашу тактику. +Face my SPL! +Узри, SPL! +Nyah!!! *blushes* +Ня-айк!!! *краснеет* +This is too tight... +Это слишком туго... +Nyah! This is impossible! +Ня! Это невозможно! +I can't get free! +Я не могу освободиться! +Meow!!! +Мяу!!! +No! This kitty did nothing wrong! +Нет! Эта кошечка не сделала ничего плохого! +Why are you looking at me like that?! +Почему ты так на меня смотришь?! +I've been a bad kitty~ +Я была плохой кошечкой~ +Punish me! +Накажи меня! +This kitty needs to be gagged~ +Этой кошечке нужно заткнуть рот кляпом~ +Come and be blessed~ +Приходите и будьте благословлены~ +Finally, some entertainment! +Наконец-то хоть какое-то развлечение! +Join us, it'll be fun! +Присоединяйтесь к нам, это будет весело! +Keep struggling~ You'll understand. +Продолжай бороться~ Ты поймешь. +You will receive the blessing. +Ты получаешь благословение. +What are you doing? +Что ты делаешь? +Thanks for keeping things tidy. +Спасибо, что поддерживаешь порядок. +Where do you think you're going? +Куда, по-твоему, ты направляешься? +Who dares intrude on our sacred grounds? +Кто осмеливается вторгаться на наши священные земли? +By the blessed kitty! +Клянусь священной кошкой! +Show us what you got! +Покажи нам, на что ты способна! +Who do you think you are? +Кем ты себя возомнила? +Ah! Surface magic! +Ах! Поверхностная магия! +The human goddesses are frail. +Человеческие богини хрупки. +Such strange magic. +Такая странная магия. +What are you going to do with that? +Что ты собираешься с этим делать? +Pay your respects some other way. +Засвидетельствуй свое почтение каким-нибудь другим способом. +Tomb robber! +Грабитель гробниц! +By the blessed kitty! +Клянусь священной кошкой! +Don't you want the blessing? +Разве ты не хочешь получить благословение? +Come here~ +Иди сюда~ +Hah! +Хах! +*hisses* +*шипит* +*meows* +*мяукает* +*frowns* +*хмурится* +*frowns* +*хмурится* +I have catlike reflexes! +У меня кошачьи рефлексы! +I have catlike reflexes! +У меня кошачьи рефлексы! +Let me show you the blessing... +Позвольте мне показать тебе благословение... +Come along. +Идем. +*grins* +*ухмыляется* +You won't be needing this. +Тебе это не понадобится. +Quit struggling~ +Перестань бороться~ +My true name is unpronouncible in your tongue. But you may call me PTRN. +Мое настоящее имя непроизносимо на вашем языке. Но ты можешь называть меня PTRN. +She brings curses! +Она приносит проклятия! +An intruder confronts us! +Нам противостоит вторженец! +Your fate is already sealed~ +Твоя судьба уже решена~ +I will defend you! +Я буду защищать тебя! +I'll stop her! +Я остановлю ее! +I won't let you touch her! +Я не позволю тебе прикоснуться к ней! +Nya! Need some help friends? +Ня! Нужна помощь, друзья? +We're in this together! +Мы вместе в этом деле! +I think you could use some help against this adventurer~ +Я думаю, тебе не помешала бы помощь в борьбе с этим авантюристом~ +Let's get them! +Давай схватим их! +I've caught you! +Я поймала тебя! +Let's play cat and mouse~ +Давай поиграем в кошки-мышки~ +You cannot resist my SPL. +Тебе не устоять перед SPL. +You merely prolong the inevitable! +Ты просто оттягиваешь неизбежное! +This... this can't be... +Этого... этого не может быть... +Release me mortal! +Освободи меня, смертная! +How did you do this!? +Как ты это сделала!? +Gasp! An adventurer! +Оу! Искатель приключений! +Don't let her catch you! +Не позволяй ей поймать тебя! +You'll never trap my soul! +Тебе никогда не поймать мою душу в ловушку! +You are quite the master of the elements! +Ты настоящий повелитель стихий! +I could get used to this~ +Я могла бы привыкнуть к этому~ +Perhaps I could show you around... +Возможно, я могла бы показать тебе окрестности... +What a beautiful one. +Какая красивая девушка. +I will take you back home~ +Я отведу тебя обратно домой~ +You'd look great in my palace. +Ты бы отлично смотрелась в моем дворце. +Are we having fun? +Нам весело, ведь так? +Get over here! +Иди сюда! +Humans like you make great toys. +Из таких людей, как ты, получаются отличные игрушки. +That won't help you. +Это тебе не поможет. +You won't escape. +Ты не сбежишь. +I will take you for myself! +Я заберу тебя к себе! +Such feeble attempts. +Такие жалкие попытки. +Humans are fun to play with. +С людьми забавно играть. +Toying with me? I shall oblige! +Поиграешь со мной? Я буду очень признательна! +Cast your last pathetic spell, mortal. +Произнеси свое последнее жалкое заклинание, смертная. +Your mere attempt at magic insults me. +Одна твоя попытка применить магию оскорбляет меня. +Do you really think that will stop me? +Ты действительно думаешь, что это меня остановит? +Look what humans need to match only a fraction of our power! +Посмотрите, что нужно людям, чтобы соответствовать лишь малой толике нашей мощи! +Our goddess doesn't need to listen to the likes of you! +Нашей богине не нужно слушать таких, как ты! +Keep your hands out of our possessions. +Держи свои руки подальше от наших вещей. +Defiler! You will pay for your crimes! +Осквернительница! Ты заплатишь за свои преступления! +A game of chase? Fun. +Игра в догонялки? Весело. +You're staying right here... +Ты останешься здесь... +Hah! +Хах! +Get your hands off me! +Убери от меня свои руки! +Pathetic. +Жалкая. +You're a fast one. +А ты шустрая. +You're a fast one. +А ты шустрая. +Such feeble attempts. +Такие жалкие попытки. +Such feeble attempts. +Такие жалкие попытки. +It's over, human. You've lost. +Все кончено, человек. Ты проиграла. +There is no escape. +Выхода нет. +You are beneath me. +Ты подо мной. +Nice gear. I'll take it. +Отличная экипировка. Я возьму её. +Try getting out of that! +Попробуй выбраться из этого! +Who am I? You beings may call me PTRN. +Кто я? Вы, существа, можете называть меня PTRN. +She thinks she can beat us~ +Она думает, что может победить нас~ +No one will save you. +Никто тебя не спасет. +Come and accept your fate. +Подойди и прими свою судьбу. +An unruly subject. She needs training. +Какая непослушная. Она нуждается в обучении. +You should consider your actions and their consequences~ +Тебе следует обдумывать свои действия и их последствия~ +Now now, a mortal should know her place! +Сейчас сейчас, смертная должна знать свое место! +Why don't we turn the tables? +Почему бы нам не поменяться ролями? +It'll be fun seeing you squirm~ +Будет забавно посмотреть, как ты извиваешься~ +We are the keepers of balance. +Мы - хранители равновесия. +Do not mess with us! +Не связывайся с нами! +I shall take you for myself~ +Я возьму тебя с собой~ +Where do you think you're going? +Куда, по-твоему, ты направляешься? +You are no match for my SPL! +Тебе не сравниться с моим SPL! +That wasn't supposed to happen. +Этого не должно было случиться. +This... this can't be... +Этого... этого не может быть... +Release me mortal! +Освободи меня, смертная! +How did you do this!? +Как ты это сделала!? +You won't get me! +Тебе меня не поймать! +Nice try! +Хорошая попытка! +My grandma is tougher than you! +Моя бабушка крепче тебя! +Restrain me. +Свяжи меня. +Play with me. +Поиграй со мной. +Lock me up. +Запри меня. +This won't work. +Это не сработает. +I don't play with young ones. +Я не играю с такими малышками. +Nice try! +Хорошая попытка! +Are we having fun? +Нам весело, ведь так? +Get over here! +Иди сюда! +Oh, a lost toy! +О, потерянная игрушка! +That won't help you. +Это тебе не поможет. +You won't escape. +Ты не сбежишь. +I will take you for myself! +Я заберу тебя к себе! +Ouch! +Ауч! +I am stronger than that! +Я сильнее этого! +That hurts! +Это больно! +Nice party trick! +Отличная групповая уловка! +Oh, shiny! +О, блестяще! +*sighs* +*вздох* +Look what humans need to match only a fraction of our power! +Посмотрите, что нужно людям, чтобы соответствовать лишь малой толике нашей мощи! +Our goddess doesn't need to listen to the likes of you! +Нашей богине не нужно слушать таких, как ты! +Keep your hands out of our possessions. +Держи свои руки подальше от наших вещей. +Defiler! You will pay for your crimes! +Осквернительница! Ты заплатишь за свои преступления! +You won't get away! +Ты не уйдешь! +You can't get away! +Тебе не уйти! +You are helpless now! +Теперь ты беспомощна! +Tis but a scratch! +Всего лишь царапина! +Give up! +Сдавайся! +I'll get you next time! +В следующий раз я тебя поймаю! +You're a fast one. +Ты шустрая. +Nice try! +Хорошая попытка! +Are you hiding?! +Ты прячешься?! +You are my pet now! +Теперь ты мой питомец! +There is no escape. +Выхода нет. +You are beneath me. +Ты подо мной. +Yoink! +Йойк! +You can't get out now! +Ты не можешь сейчас уйти! +Who am I? You beings may call me PTRN. +Кто я? Вы, существа, можете называть меня PTRN. +She thinks she can beat us~ +Она думает, что может победить нас~ +No one will save you. +Никто тебя не спасет. +Come and accept your fate. +Подойди и прими свою судьбу. +An unruly subject. She needs training. +Какая непослушная. Она нуждается в обучении. +You should consider your actions and their consequences~ +Тебе следует обдумывать свои действия и их последствия~ +Now now, a mortal should know her place! +Сейчас сейчас, смертная должна знать свое место! +Why don't we turn the tables? +Почему бы нам не поменяться ролями? +It'll be fun seeing you squirm~ +Будет забавно посмотреть, как ты извиваешься~ +We are the keepers of balance. +Мы - хранители равновесия. +Do not mess with us! +Не связывайся с нами! +I shall take you for myself~ +Я возьму тебя с собой~ +Where do you think you're going? +Куда, по-твоему, ты направляешься? +You are no match for my SPL! +Тебе не сравниться с моим SPL! +Ah... my SPL... +Ах... SPL... +I will be free... even if it takes me a thousand years! +Я буду свободна... даже если это займет у меня тысячу лет! +Release me you pathetic creature! +Освободи меня, жалкое создание! +I will not be contained! +Я не буду сдержана! +Oh no, whatever shall I do! +О нет, что же мне делать! +I will be back, mortal! +Я вернусь, смертная! +You will never trap me! +Тебе никогда не поймать меня в ловушку! +I yearn for a challenging puzzle! +Я мечтаю о сложной головоломке! +Show me your strongest restraints! +Покажи мне свои самые сильные ограничители! +I could probably escape anything. +Я, наверное, могла бы выбраться из чего угодно. +Come here my plaything~ +Иди сюда, моя игрушка~ +Mortals are my favorite toy. +Смертные - мои любимые игрушки. +It's more fun when you resist! +Гораздо веселее, когда ты сопротивляешься! +Know your place, mortal~ +Знай свое место, смертная~ +I will bring you to my lair~ +Я приведу тебя в свое логово~ +Mortals shouldn't have too much freedom~ +У смертных не должно быть слишком много свободы~ +Mortals should keep their hands to themselves~ +Смертные должны держать свои руки при себе~ +You won't escape. +Ты не выберешься. +Yes, yes, run away! +Да, да, убегай! +I like your fighting spirit! +Мне нравится твой боевой дух! +You may be weak, but this is quite entertaining~ +Может, ты и слаба, но это довольно забавно~ +Face my wrath! +Познай мой гнев! +Dragons are the true heirs of magic. +Драконы - истинные наследники магии. +Your magic was stolen from us! +Твоя магия была украдена у нас! +This world is ours! OURS! +Этот мир принадлежит нам! НАМ! +Look what you need to match only a fraction of my power! +Посмотри, что тебе нужно, чтобы достичь лишь с части моей силы! +My treasure! +Мое сокровище! +My treasure! +Мое сокровище! +My treasure! +Мое сокровище! +Now is my opportunity! I will have you for myself~ +Это моя возможность! Ты будешь моей~ +You're staying right here... +Ты останешься здесь... +Hah! +Хах! +Get your hands off me! +Убери от меня свои руки! +Pathetic. +Жалкая. +You're a fast one. +А ты шустрая. +You're a fast one. +А ты шустрая. +So weak! +Такая слабая! +So weak! +Такая слабая! +I have you now~ +Теперь ты моя~ +Not so fast~ +Не так быстро~ +Can't handle it? +Не можешь справиться с этим? +Ooh shiny! +Ох, блеск! +Now you're mine! +Теперь ты моя! +Bow before me, for I am PTRN! +Склонись передо мной, потому что я - PTRN! +A mortal can't stop us! +Смертная не сможет остановить нас! +No one will save you, mortal. +Никто не спасет тебя, смертная. +I will stop her! +Я остановлю ее! +Bow down before our might! +Склонитесь перед нашей мощью! +Dragons are the true rulers of this world! +Драконы - истинные правители этого мира! +We were destined for greatness until you came along! +Нам было предназначено величие, пока не появилась ты! +Why don't we turn the tables? +Почему бы нам не поменяться ролями? +It'll be fun seeing you squirm~ +Будет забавно посмотреть, как ты извиваешься~ +We are the the true heirs of magic! +Мы - истинные наследники магии! +Hehe~ +Хе-хе~ +Rawr! +Роар! +*chuckles* +*хихикает* +By the power of SPL! +Вкуси силу SPL! +I have failed! +Я ошиблась! +This... this can't be... +Этого... этого не может быть... +Release me mortal! +Освободи меня, смертная! +How did you do this!? +Как ты это сделала!? +Oh no, it's an adventurer! +О нет, это искательница приключений! +They've come for me! +Они пришли за мной! +It wasn't my fault! +Это была не моя вина! +Ready for service! +Готова к службе! +I was sent here to... accompany you, yes! +Меня послали сюда, чтобы... сопровождать тебя, да! +How may I assist you? +Чем я могу тебе помочь? +Do my eyes deceive me, or do I see a sinner? +Мои глаза обманывают меня, или я действительно вижу грешницу? +My job is to punish mortals~ +Моя работа - наказывать смертных~ +Would you hold still? I need to... check something~ +Ты не могла бы замереть? Мне нужно... кое-что проверить~ +Are we having fun? +Нам весело, ведь так? +Get over here! +Иди сюда! +Humans like you make great toys. +Из таких людей, как ты, получаются отличные игрушки. +That won't help you. +Это тебе не поможет. +You won't escape. +Ты не сбежишь. +I will take you for myself! +Я заберу тебя к себе! +Such feeble attempts. +Такие жалкие попытки. +Humans are fun to play with. +С людьми забавно играть. +Toying with me? I shall oblige! +Поиграешь со мной? Я буду очень признательна! +Cast your last pathetic spell, human. +Произнеси свое последнее жалкое заклинание, человечишка. +Your magic is weak, human. +Твоя магия слаба, человечишка. +It tickles, hehe! +Это щекотно, хе-хе! +Look what humans need to match only a fraction of our power! +Посмотрите, что нужно людям, чтобы соответствовать лишь малой толике нашей мощи! +Our goddess doesn't need to listen to the likes of you! +Нашей богине не нужно слушать таких, как ты! +Keep your hands out of our possessions. +Держи свои руки подальше от наших вещей. +Defiler! You will pay for your crimes! +Осквернительница! Ты заплатишь за свои преступления! +A game of chase? Fun. +Игра в догонялки? Весело. +You're staying right here... +Ты останешься здесь... +Hah! +Хах! +Get your hands off me! +Убери от меня свои руки! +Pathetic. +Жалкая. +You're a fast one. +А ты шустрая. +You're a fast one. +А ты шустрая. +Such feeble attempts. +Такие жалкие попытки. +Such feeble attempts. +Такие жалкие попытки. +It's over, human. You've lost. +Все кончено, человек. Ты проиграла. +There is no escape. +Выхода нет. +You are beneath me. +Ты подо мной. +Nice gear. I'll take it. +Отличная экипировка. Я возьму её. +Try getting out of that! +Попробуй выбраться из этого! +Who am I? You beings may call me PTRN. +Кто я? Вы, существа, можете называть меня PTRN. +She thinks she can beat us~ +Она думает, что может победить нас~ +No one will save you. +Никто тебя не спасет. +Come and accept your fate. +Подойди и прими свою судьбу. +An unruly subject. She needs training. +Какая непослушная. Она нуждается в обучении. +You should consider your actions and their consequences~ +Тебе следует обдумывать свои действия и их последствия~ +Now now, a mortal should know her place! +Сейчас сейчас, смертная должна знать свое место! +Why don't we turn the tables? +Почему бы нам не поменяться ролями? +It'll be fun seeing you squirm~ +Будет забавно посмотреть, как ты извиваешься~ +We are the keepers of balance. +Мы - хранители равновесия. +Do not mess with us! +Не связывайся с нами! +I shall take you for myself~ +Я возьму тебя с собой~ +Where do you think you're going? +Куда, по-твоему, ты направляешься? +Let's see you face my SPL~ +Интересно, какое будет у тебя лицо, когда ты узришь SPL~ +You won't escape my SPL that easily! +Ты не могла избежать SPL настолько легко! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Not the edging training! Anything but that! +Только не тренировка на грани! Что угодно, только не это! +Forgive me! +Прости меня! +No! Don't punish me! +Нет, не наказывай меня! +You look like you've got style... +Похоже, у тебя есть стиль... +I could learn a thing or two from you! +Я могла бы кое-чему у тебя поучиться! +Mind if I just, um, watch? +Не возражаешь, если я просто, эм, посмотрю? +Look, a new recruit! +Смотрите, новый рекрут! +I'll teach you a thing or two! +Я научу тебя кое-чему! +Let's test your manners~ +Давай проверим твои манеры~ +Having fun there? +Развлекаешься? +It's time for your training. +Пришло время для твоей тренировки. +You need to be taught some manners, maid. +Тебя нужно научить хорошим манерам, горничная. +Good girl. I'll take that to the storage room. +Хорошая девочка. Я отнесу это в кладовку. +I'll be taking those. +Я возьму это. +Who the hell are you? +Кто ты, черт возьми, такая? +Oh, you're approaching me? +О, ты ко мне? +You've gotten yourself into a big mess. +Ты вляпалась в большую переделку. +You're going to regret that. +Ты еще пожалеешь об этом. +A maid uses magic only when told! +Горничная использует магию только тогда, когда ей говорят! +I look forward to plugging that mouth of yours. +Я с нетерпением жду возможности заткнуть твой ротик. +How unruly... What a pain. +Какая неуправляемая... Какая боль. +Put that away! +Убери это! +That's off limits. You need to be punished! +Это запрещено. Ты должна быть наказана! +Thief! Get her! +Вор! Хватайте ее! +Yikes! I'm calling backup! +Ох! Я вызываю подкрепление! +Found you! +Нашла тебя! +Hold still~ +Стой неподвижно~ +Your tricks won't work on me. +Твои уловки на меня не подействуют. +Oof... You got me. +Уф... Ты поймала меня. +It's over. +Всё кончено. +Nice one. +Неплохо. +Nice one. +Неплохо. +You missed! +Ты промахнулась! +You missed! +Ты промахнулась! +I'll hand you over when I'm done with you. +Я передам тебя, когда закончу с тобой. +Get over here! +Иди сюда! +Hmph. Stay down. +Хмф. Оставайся тут. +Give me that. +Дай мне это. +'Click!' +'Щелк!' +Mistress PTRN, reporting for duty. +Госпожа PTRN, готова к службе. +No time to waste. +Нельзя терять времени. +Looks like the reports are correct. Stop her! +Похоже, доклады были верны. Остановите ее! +Moving in to assist. +Выдвигаюсь на помощь. +You need to be taught a lesson, adventurer. +Тебе нужно преподать урок, искательница приключений. +We have a mutual protection contract. Suffice to say, you've violated it. +У нас контракт о взаимной защите. Достаточно сказать, что ты нарушила его. +We defend our partners, unlike some people. +Мы защищаем наших партнеров, в отличие от некоторых людей. +Target sighted. Taking her down. +Цель замечена. Приступаю к захвату. +Our influence is everywhere~ +Наше влияние повсюду~ +We have orders to stop you! +У нас приказ остановить тебя! +Moving to assist! +Выдвигаюсь на помощь. +You really think you're special, huh? +Ты действительно думаешь, что ты особенная, да? +Combat formation bravo. +Боевое построение 'браво'. +Deploying SPL! +Разворачиваю SPL! +Ah! Forgive me! +Ах, простите меня! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +I'm sorry! I didn't mean to break that vase! +Извините! Я не хотела разбивать эту вазу! +I won't do it again, I swear! +Я больше так не сделаю, клянусь! +Please no! I don't want the edging training again! +Пожалуйста, нет! Я больше не хочу тренировок на грани! +Don't you need a bodyguard, miss? +Вам не нужен телохранитель, мисс? +Won't you train me, miss? +Вы не потренируете меня, мисс? +I've been a bad girl... +Я была плохой девочкой... +Miss, your uniform is dirty... +Мисс, ваша униформа грязная... +Why hello miss... +О, здравствуйте, мисс... +Let me fix your outfit... +Позвольте мне поправить ваш наряд... +Hmm, do I need to tighten those? +Хм, мне нужно затянуть это? +M-miss... I was told to bring you somewhere... +М-мисс... Мне сказали отвести вас кое-куда... +Umm, miss, you're supposed to report to the head maid... +Умм, мисс, вы должны отчитываться перед старшей горничной... +Thanks for picking up. +Спасибо за помощь. +I'll take those to the head maid! +Я отнесу это старшей горничной! +Someone help! +Кто-нибудь, помогите! +Who are you!? +Кто вы такая?! +Oh no! +О нет! +Stop! +Стоять! +Miss! You're not allowed to cast that! +Мисс! Вам не разрешается использовать это! +Miss, I have to report that! +Мисс, я должна сообщить об этом! +Magic! +Магия! +Eeep! +Ииип! +Miss, that's reserved for the head maid! +Мисс, это зарезервировано для старшей горничной! +Thief! I'm reporting this! +Вор! Я доложу об этом! +Oh no! I have to report this! +О нет! Я должна доложить об этом! +Oh no! +О нет! +I got you! I got you! +Я поймала тебя! Я поймала тебя! +Try that again! +Попробуй еще раз! +Remember your training, remember your training... +Помни о своих тренировках, помни о своих тренировках... +You're filthy! +Ты подлая! +Hold still... +Не двигайся... +Hold still... +Не двигайся... +Stay calm... +Стой спокойно... +Stay calm... +Стой спокойно... +I'll lead you to your cell... +Я отведу тебя в твою камеру... +Come on! +Ну давай же! +Got you! +Попалась! +I need to take this... +Мне нужно взять это... +I'm sorry... +Я извиняюсь... +*Salutes* PTRN reporting for service! +*Отдает честь* PTRN сообщает о готовности к службе! +I'll help! +Я помогу! +Stop her! +Остановить ее! +Please be gentle! +Пожалуйста, будь нежной! +Ahhh! Stop it! +Ааах! Прекрати это! +Don't touch her! +Не трогай ее! +Wait, you can't do that! +Подожди, ты не можешь этого сделать! +Me? Help? Right! +Я? Помочь? Хорошо! +I'm sorry miss... +Простите, мисс... +I was ordered to capture you... please don't resist. +Мне было приказано схватить вас... Пожалуйста, не сопротивляйтесь. +I-I'm coming! +Я-я иду! +Please surrender, miss! +Пожалуйста, сдавайтесь, мисс! +I'll just stay here! +Я буду здесь! +Loading SPL! +Загрузка, SPL! +Blast... this thing always jams. +Блин... эту штуку всегда заклинивает. +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +That thing... it scares me. +Эта штука... она пугает меня. +I won't do it again, I swear! +Я больше так не сделаю, клянусь! +Please no! I don't want the pleasure training again! +Пожалуйста, нет! Я больше не хочу тренировок удовольствием! +Don't you need a bodyguard, miss? +Вам не нужен телохранитель, мисс? +Won't you train me, miss? +Вы не потренируете меня, мисс? +I've been a bad girl... +Я была плохой девочкой... +Miss, your uniform is dirty... +Мисс, ваша униформа грязная... +Why hello miss... +О, здравствуйте, мисс... +Let me fix your outfit... +Позвольте мне поправить ваш наряд... +Hmm, do I need to tighten those? +Хм, мне нужно затянуть это? +M-miss... I was told to bring you somewhere... +М-мисс... Мне сказали отвести вас кое-куда... +Umm, miss, you're supposed to report to the head maid... +Умм, мисс, вы должны отчитываться перед старшей горничной... +Thanks for picking up. +Спасибо за помощь. +I'll take those to the head maid! +Я отнесу это старшей горничной! +Say hello to my little friend! +Передай привет моему маленькому другу! +This is where I'd apply my melee training... if I had any! +Вот где я бы применила свои навыки рукопашного боя... если бы они у меня были! +Oh no! +О нет! +Step back a bit, this isn't fair! +Отойди немного назад, это нечестно! +Oh yeah? Two can play at that game! +О, да? В эту игру могут играть двое! +Don't bring magic to a gunfight! +Не привноси магию в перестрелку! +Didn't think this through, did you? +Ты не продумала это до конца, не так ли? +Grenade!!! +Граната!!! +Miss, that's reserved for the head maid! +Мисс, это зарезервировано для старшей горничной! +Thief! I'm reporting this! +Вор! Я доложу об этом! +Oh no! I have to report this! +О нет! Я должна доложить об этом! +Oh no! +О нет! +I got you! I got you! +Я поймала тебя! Я поймала тебя! +Try that again! +Попробуй еще раз! +What's this 'melee' you speak of? +Что это за 'рукопашный бой', о котором ты говоришь? +Got you! +Попалась! +What terrible aim! +Какая ужасная меткость! +I am bulletproof! +Я пуленепробиваемая! +Stay calm... +Стой спокойно... +Stay calm... +Стой спокойно... +I'll lead you to your cell... +Я отведу тебя в твою камеру... +Come on! +Ну давай же! +Got you! +Попалась! +I need to take this... +Мне нужно взять это... +I'm sorry... +Я извиняюсь... +Marksman PTRN reporting for service! +Стрелок PTRN прибыла на службу! +I'll help! +Я помогу! +Opening fire! +Открываю огонь! +I'll cover you! +Я прикрою тебя! +Ahhh! Stop it! +Ааах! Прекрати это! +Don't touch her! +Не трогай ее! +Wait, you can't do that! +Подожди, ты не можешь этого сделать! +Me? Help? Right! +Я? Помочь? Хорошо! +I'm sorry miss... +Простите, мисс... +I was ordered to capture you... please don't resist. +Мне было приказано схватить вас... Пожалуйста, не сопротивляйтесь. +Providing cover fire! +Обеспечиваем огневое прикрытие! +Cover me, I'm going in! +Прикрой меня, я вхожу! +Commence overwatch! +Начинаю наблюдение! +Submit to my SPL. +Преклонись перед SPL. +Ack! How inelegant! +Ай! Как неэлегантно! +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +I'll be heading out... +Я уже ухожу... +Looks like I'll be taking my leave. +Похоже, мне пора уходить. +Looks like I'll be reporting you~ +Похоже, я должна доложить на тебя~ +I was wrong about you. +Я ошибалась на твой счет. +Perhaps you should take my place. +Возможно, тебе следует занять мое место. +Why don't you try being in charge? +Почему бы тебе не попробовать быть главной? +Come now, it's time for training. +А теперь пойдем, пришло время для тренировки. +Do you need to be punished? +Тебя нужно наказать? +It's time for a test. +Пришло время для теста. +A maid remains quiet until asked. +Горничная молчит, пока ее не спросят. +Come with me. I will train you personally. +Пойдем со мной. Я буду обучать тебя лично. +You need to work on your ladylike manners. +Тебе нужно поработать над своими женственными манерами. +Good girl, finding lost items. +Хорошая девочка, находит потерянные вещи. +I do not give you permmission to leave. +Я не давала тебе разрешения уходить. +Seems I will have to get my hands dirty. +Похоже, мне придется запачкать руки. +Do you know who I am? +Ты знаешь, кто я такая? +You need to learn some manners! +Тебе нужно научиться хорошим манерам! +How rude! +Как грубо! +There is a more proper way to cast spells... +Есть более правильный способ произносить заклинания... +Perhaps you need to receive some gag training. +Возможно, тебе нужно немного потренироваться с кляпом во рту. +You lack discipline, and self-control. +Тебе не хватает дисциплины и самоконтроля. +Do not use what belongs to others. +Не пользуйся тем, что принадлежит другим. +A good maid pleads only to her mistress. +Хорошая горничная молится только своей госпоже. +Do not take what is not yours. +Не бери то, что тебе не принадлежит. +I will personally attend to your act of disgrace. +Я лично позабочусь о твоём позорном поступке. +An unruly pest. +Неуправляемый вредитель. +Checkmate. +Мат. +Like a novice. +Как новичка. +...Nice one. +...Отлично. +Enjoy yourself, dear~ +Наслаждайся жизнью, дорогая~ +Hmph. Nice. +Хмф. Славно. +Hmph. Nice. +Хмф. Славно. +Not even close. +Даже не близко. +Not even close. +Даже не близко. +I'll be taking you to your cell personally~ +Я лично отведу тебя в твою камеру~ +Amateur. +Любитель. +Bad girl. You need discipline. +Плохая девочка. Тебе нужна дисциплина. +Hand it over. +Отдай это мне. +I'll be keeping the keys. +Ключи останутся у меня. +Hmm. You may call me Head Maid PTRN. +Хм. Можешь называть меня Старшей Горничной PTRN. +Looks like we have a guest. +Похоже, у нас гость. +I'll be gentle, I promise~ +Я буду нежной, обещаю~ +Know your place, dear~ +Знай свое место, дорогая~ +Good girls keep their hands to themselves. +Хорошие девочки держат свои руки при себе. +You broke the rules, now you'll face the consequences. +Ты нарушила правила, теперь тебе придется столкнуться с последствиями. +Hands off our partners. +Руки прочь от наших партнеров. +Looks like you've made a few enemies along the way. +Похоже, ты нажила себе несколько врагов на своем пути. +I won't let you interrupt our plans. +Я не позволю тебе нарушить наши планы. +Excuse me, we were holding a meeting~ +Извини, мы проводили встречу~ +Don't get ahead of yourself. +Не забегай вперед. +I'll do this myself. +Я сделаю это сама. +I'll support from the rear. +Я буду поддерживать с тыла. +I cast SPL! +Я использую SPL! +Whoops! That wasn't supposed to happen... +Упс! Этого не должно было случиться... +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Looks like I've earned some punishment... +Похоже, я заслужила небольшое наказание... +I'll turn you into a newt! If you don't stop me... +Я превращу тебя в тритона! Если ты меня не остановишь... +Don't let me get away~ +Не дай мне уйти~ +Perhaps you're not so bad after all~ +Возможно, в конце концов ты не так уж и плоха~ +Why don't you have a little fun... with me? +Почему бы тебе немного не повеселиться... со мной? +Come and get me... +Приди и возьми меня... +I must say, you've got me under your spell~ +Должна сказать, ты околдовала меня своими чарами~ +Why aren't you a pretty one... +Почему ты такая черствая?.. +I've got to kiss those tender lips of yours~ +Я должна поцеловать эти твои нежные губы~ +Having fun, little lady? +Развлекаешься, маленькая леди? +I'm going to have so much fun with you! +Мне будет так весело с тобой! +Look at you, pretty and free! +Посмотри на себя, красивая и свободная! +Must have misplaced it... +Похоже, потеряла... +Those are mine! +Это мое! +Well well, what do we have here? +Так-так, что же мы здесь имеем? +That's not very nice! +Это не очень то любезно! +Curse you! +Будь ты проклята! +I'll turn you into a newt! +Я превращу тебя в тритона! +Oh, so you've got a spellbook. What's it written in, curse-ive? +О, так у тебя есть книга заклинаний. На чем это написано, будь я проклята? +Snap, crackle, and pop! +Щелчок, потрескивание и хлоп! +Looks like I need to seal that foul mouth of yours. +Похоже, мне нужно заткнуть твой грязный рот. +Put that toy away~ +Убери эту игрушку~ +You'll be praying for freedom soon, my dear~ +Скоро ты будешь молиться о свободе, моя дорогая~ +Oh, breaking into my collection, are you? +О, ты вламываешься в мою коллекцию, не так ли? +Even I wouldn't do such a thing! +Даже я бы не стала этого делать! +Witch way to the jail, you say? +Ведьмам место в тюрьме, говоришь? +Hold still~ +Стой неподвижно~ +Try that again! +Попробуй еще раз! +Hands off! +Убери руки! +Now I got you. +Теперь у меня есть ты. +Hmph. +Хмф. +Hmph. +Хмф. +You've got a lot to learn~ +Тебе еще многому предстоит научиться~ +You've got a lot to learn~ +Тебе еще многому предстоит научиться~ +You'll be coming with me! +Ты пойдешь со мной! +I'll be yanking your chain~ +Я буду дергать тебя за цепочку~ +Not so fast~ +Не так быстро~ +I'll be taking this~ +Я возьму это~ +There, nice and tight dear~ +Вот так, надежно и туго, дорогуша~ +I am the great witch PTRN! +Я великая ведьма PTRN! +Noooo Fred! *grumble* you'll pay for this! +Нееет, Фред! *ворчит* ты заплатишь за это! +Where is that apprentice when you need her... +Где эта ученица, когда она так нужна... +I don't have time for this. +У меня нет на это времени. +Be still, worm. +Замри, червяк. +Hands off~! +Руки прочь~! +Would you like a taste? +Хочешь попробовать? +Looks like I've found my test subject~ +Похоже, я нашла себе подопытного~ +Another test subject! +Еще один подопытный! +I want her! +Я хочу ее! +She's a cute one! +Она симпатичная! +Oh no you don't? +О, нет, ты не хочешь? +I'll make you my pet! +Я сделаю тебя своим питомцем! +Tsk tsk, you won't get away! +Тск-тск, ты не уйдешь! +I cast SPL! +Я использую SPL! +I cast SPL! No, wait... +Я использую SPL! Нет, стоп... +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Looks like I've earned some punishment... +Похоже, я заслужила небольшое наказание... +I'll turn you into a newt! If you don't stop me... +Я превращу тебя в тритона! Если ты меня не остановишь... +Don't let me get away~ +Не дай мне уйти~ +Perhaps you're not so bad after all~ +Возможно, в конце концов ты не так уж и плоха~ +Why don't you have a little fun... with me? +Почему бы тебе немного не повеселиться... со мной? +Come and get me... +Приди и возьми меня... +You're just too cute... let me play with you a bit! +Ты уж слишком миля... дай мне немного поиграть с тобой! +Come, come closer! I'll be gentle~ +Подойди, подойди ближе! Я буду нежна~ +Ooh, you just HAVE to be mine! +Оох, ты просто ОБЯЗАНА быть моей! +Having fun, little lady? +Развлекаешься, маленькая леди? +Come, come!... no, not like that. Well, MAYBE like that. +Давай, давай!... нет, не так. Ну, МОЖЕТ, и так. +Look at you, pretty and free! +Посмотри на себя, красивая и свободная! +Must have misplaced it... +Похоже, потеряла... +Those are mine! +Это мое! +My GOODNESS, you're adorable!... c'mere~! +Моя БОГИНЯ, ты очаровательна!... иди сюда~! +That's not very nice! +Это не очень то любезно! +You wouldn't happen to be... ticklish? +Ты случайно не... боишься щекотки? +Hold still! I promise it'll be fun. +Стой спокойно! Я обещаю, это будет весело. +Too much chanting, not enough giggling... let's fix that! +Слишком много слов, недостаточно смеха... давай это исправим! +What's that? 'Gag me, please'? Gladly! +Что это такое? 'Заткни мне рот кляпом, пожалуйста?' С удовольствием! +A cute captive AND a spellbook to study? Is it Christmas already?! +Симпатичная пленница ПЛЮС книга заклинаний для изучения? Сейчас Новый Год?! +Put that toy away~ +Убери эту игрушку~ +He~ey, that was mine! +Э~ эй, это мое! +He~ey, that was mine! +Э~ эй, это мое! +He~ey, that was mine! +Э~ эй, это мое! +Going somewhere, are we? +Мы куда-то намылились, ммм? +No, I like you right where you are. +Нет, ты мне нравишься такой, какая ты есть. +Try that again! +Попробуй еще раз! +Hands off! +Убери руки! +Goodness, look at you squirm... +Богини, как же ты извиваешься... +Oh!... my, you're slippery! +Ох!... богини, ты такая верткая! +Oh!... my, you're slippery! +Ох!... богини, ты такая верткая! +Not close enough! +Недостаточно близко! +Not close enough! +Недостаточно близко! +Come, come!... no, not like that. Well, MAYBE like that. +Давай, давай!... нет, не так. Ну, МОЖЕТ, и так. +I'll be yanking your chain~ +Я буду дергать тебя за цепочку~ +Not so fast~ +Не так быстро~ +I'll be taking this~ +Я возьму это~ +My, my, you look too cute in that... +О богини, ты выглядишь в этом слишком мило... +I am Stela. But to you, sweetie? Call me Mistress. +Я Стела. Но тебе, милая, придётся звать меня Госпожой. +My FROG!... suppose I need a new familiar... *eyes you with interest* +Моя ЛЯГУШКА!... похоже, мне нужен новый фамильяр... *смотрит на вас с интересом* +Come closer, I'll be gentle~ +Подойди ближе, я буду нежна~ +Come, come!... no, not like that. Well, MAYBE like that. +Давай, давай!... нет, не так. Ну, МОЖЕТ, и так. +Hold still! I promise it'll be fun. +Стой спокойно! Я обещаю, это будет весело. +Having fun, little lady? +Развлекаешься, маленькая леди? +Ooh, you just HAVE to be mine! +Оох, ты просто ОБЯЗАНА быть моей! +Why don't we have a little talk~ +Почему бы нам немного не поболтать~ +My, my, you look too cute... +О богини, ты выглядишь слишком мило... +I like you. I'll save you a spot at home~ +Ты мне нравишься. Я приберегу для тебя местечко в своем доме~ +Going somewhere, are we? +Мы куда-то намылились, ммм? +Not so fast~ +Не так быстро~ +Why don't we have a little talk~ +Почему бы нам немного не поболтать~ +Going somewhere, are we? +Мы куда-то намылились, ммм? +I cast, umm, SPL! +Я использую, умм, SPL! +I cast Silence! No, wait-- +Я использую Немоту! Нет, подождите-- +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +I promise I'll be back later! +Я обещаю, что вернусь позже! +I didn't do anything wrong! +Я не сделала ничего плохого! +I won't get in your way, miss! +Я не буду стоять у вас на пути, мисс! +Take me as your student, miss! +Возьмите меня в ученики, мисс! +Won't you teach me? +Вы не научите меня? +I wish to study under your wisdom! +Я хочу учиться у вашей мудрости! +Mind if I play with you a bit? +Не возражаешь, если я немного поиграю с тобой? +Oooh! My new friend! +Оооо! Мой новый друг! +My mistress told me to give you a good time... +Моя хозяйка велела мне хорошо провести с тобой время... +Hehe, having fun? +Хе-хе, развлекаешься? +Miss, won't you come? +Мисс, вы не 'придёте'? +Hey, you're free to play, right~? +Эй, ты ведь можешь свободно играть, верно~? +Hey, uh, give that back... (blushes) +Эй, отдай это обратно... (краснеет) +Um, you have to return those! +Эм, ты должна вернуть их! +Um! You're not supposed to be here! +Гм! Тебя не должно здесь быть! +Eeep! +Ииип! +Help me! +Помоги мне! +Somebody help! +Кто-нибудь, помогите! +A battle of wits, huh? +Битва умов, да? +You underestimate my power! +Ты недооцениваешь мою силу! +I'll show you true skill! +Я покажу тебе истинное мастерство! +Please put that down... +Пожалуйста, положи это на место... +Hey, I used to pray at that shrine... +Эй, я часто молилась в этом храме... +Hey, my mistress won't appreciate you taking those... +Эй, моей хозяйке не понравится, что ты их взяла... +The horror! +Какой ужас! +You're supposed to be in jail! +Ты должна быть в тюрьме! +Stay with me please. +Останься со мной, пожалуйста. +I got it! +Я поняла! +Be gentle, please! +Будь нежнее, пожалуйста! +I did it! +Я сделала это! +Hey, no fair! +Эй, это нечестно! +Hey, no fair! +Эй, это нечестно! +Close one! +Почти! +Close one! +Почти! +Come along~ +Пойдем со мной~ +Come here please! +Подойди сюда, пожалуйста! +Hah! I'm a genius! +Хах! Я гений! +I need to take this... +Мне нужно взять это... +I'm sorry about this... +Я сожалею об этом... +Nice to meet you. I'm PTRN! +Приятно познакомиться. Я PTRN! +Don't hurt me! +Не делай мне больно! +I have classes to attend! +Мне нужно на занятия! +There goes my perfect attendance record... +Прощай мой идеальный рекорд посещаемости... +What's going on!? +Что происходит!? +I'll save you, Mistress! +Я спасу вас, госпожа! +Me? Capture her? Okay mistress... +Я? Поймать ее? Хорошо, госпожа... +Okay miss, I'll do that... +Хорошо, мисс, я это сделаю... +But he's going to tie me up... +Но он собирается связать меня... +Be careful! +Будь осторожна! +That's it! You made me mad! +Всё! Ты меня разозлила! +I'll just... go. +Я просто... уйду. +Rise, my minions! +Восстаньте, мои миньоны! +...Hello? Can anyone hear me? +...Алло? Кто-нибудь меня слышит? +This is too tight... +Это слишком туго... +You won't get me like this! +Ты меня так не поймаешь! +I can't get free! +Я не могу освободиться! +Sticks and stones may break my bones... but you'll never catch me! +Палки и камни могут переломать мне кости... но ты никогда меня не поймаешь! +Got a bone to pick with me? +Хочешь перекинуться со мной парой слов? +I must make my escape! +Я должна сбежать! +...I need a strong hand. +...Мне нужна сильная рука. +Ouch, I hit my funny bone... won't you help? +Ой, я задела 'смешную косточку'(прям.перевод-чувство юмора)... Ты не поможешь? +Bone appetit~ +Бон аппетит~ +I've got a bone to pick with you! +Хочу перемыть с тобой косточки! +Hey bonehead! What's up? +Эй, костяная башка! Как дела? +Finally, something to toy with after working myself to the bone... +Наконец-то есть с чем поиграть после того, как я вкалывала до смерти... +I find your struggling quite humerus. +Я нахожу, что у тебя довольно тяжелая плечевая кость. +Come with me, I'll take you someplace grand... +Пойдем со мной, я отведу тебя в какое-нибудь шикарное место... +Looks like I get a bone-us! +Похоже, я попала в косточку! +You're getting under my skin... +Ты действуешь мне на костные нервы... +Thought you were making a marrow escape, eh? +Думала, ты сумела спасти свои кости, а? +I've got a bone to pick with you~ +Мне нужно перетереть с тобой кости~ +You numskull! +Ты тупая костяная башка! +You've got a lot of spine to fight me! +У тебя хватило мужества сразиться со мной! +You don't have a leg to stand on... +У тебя нет ноги, на которую можно опереться... +Magic... I feel it in my bones... +Магия... Я чувствую её всеми своими костями... +You've made a grave mistake! +Ты совершила серьезную ошибку! +Your spells are pathetic, I'm cracking up~ +Твои заклинания настолько жалки, что мои кости хотят смеяться~ +You've made a bone-a fide error. +Ты допустила грубейшую ошибку. +Defiling the shrines... that's where I jaw the line! +Осквернение святыни... Это переходит все черты! +There's a skele-tonne of things in there and none of them are yours! +Там целая куча вещей, и ни одна из них не твоя! +You're bad to the bone... +Ты плохая до мозга костей... +Looks like you're bone to be wild, eh? +Похоже, твои кости готовы быть дикими, а? +You're mine! +Ты моя! +Hah! +Хах! +That'll leave a mark... +Это оставит след... +You're mine now! +Теперь ты моя! +Hold still you bonehead! +Стой смирно, костяная башка! +Hold still you bonehead! +Стой смирно, костяная башка! +Hah! Such nerve... +Хах! Такая нервная... +Hah! Such nerve... +Хах! Такая нервная... +You're coming with me! +Ты идешь со мной! +Get over here! +Иди сюда! +Not so slippery now! +Теперь не такая верткая! +I'll be confiscating that. +Я конфискую это. +Make sure that's nice and tight... +Нужно убедиться, что эта вещица плотно прилегает... +Spirits whisper my name in hushed tones as I, PTRN, make my appearance! +Духи шепчут мое имя приглушенным голосом, когда появляюсь я, PTRN! +My rule will last centuries... just watch! +Мое правление продлится столетия... просто наблюдай! +I will find the answer, even if I die trying. Except I can't, haha! +Я найду ответ, даже если умру, пытаясь. Вот только я не могу умереть, ха-ха! +I've got eyes on the back of my skull... +У меня есть глаза на затылке... +You are SO dead to me... +Ты полностью мертва для меня... +What did you just say to me? +Что ты мне сейчас сказала? +That's my friend you bonehead! +Это мой друг, костяная башка! +Did you really think I wouldn't see through that? +Ты действительно думала, что я не видела это насквозь? +You're bad to the bone... +Ты плохая до мозга костей... +*yawns* Alright alright... +*зевает* Ладно, ладно... +Stand straight! +Стой прямо! +Why don't you bend the knee... +Почему бы тебе не согнуть колено... +Who goes there? +Кто там? +### SPL... + +### !!! + +Can't... Move... +Не могу... Двигаться... +Tight... +Туго... +This... is... fun... +Это... весело... +Scary... +Так жутко... +Run... Away... +Бежать... Прочь... +*giggles* +*хихикает* +Play... with... me... +Поиграй... со... мной... +Please... +Пожалуйста... +Command... Me... +Приказывай... Мне... +Cute... Girl... +Милая... Девочка... +Helpless... +Беспомощная... +Take... +Возьми... +Mine... +Мое... +Shiny... +Блестит... +Intruder... +Вторженец... +*giggles* +*хихикает* +Brains... +Мозги... +Squishy... +Мягко... +Rude... +Грубо... +Mean... +Значит... +Ouch... +Оуч... +Pretty... Lights... +Красивые... Огоньки... +Sparkles... +Искорки... +It... Burns... +Это... Обжигает... +Hey... +Эй... +Defiler... +Осквернитель... +Thief... +Вор... +Intruder... +Вторженец... +Give... Hug... +Дай... Обниму... +...Hug... +...Обниматься... +Got... you... +Ты... Попалась... +It's... Cold... +Это... Холодно... +Friend... +Друг... +Come... Back... +Возвра... щайся... +Why... Not... +Почему... Нет... +Hee... +Хее... +Ha... +Ха... +...Prisoner. +...Заключенная. +...Get over here... +...Иди сюда... +...Got you. +...Попалась. +...Shiny... +...Блестит... +...Secure... +...Надёжно... +*Her burial cloth reads PTRN* +*На ее погребальных одеждах написано PTRN* +Get her... +Схватить её... +Must... hug... +Должна... обнять... +Come... back... +Возвра... щайся... +Stop... +Стой... +Come... here... +Иди... сюда... +Give... hugs... +Обним... машки... +Must... help... +Должна... помочь... +Must... protect... +Должна... защищать... +Save... friend... +Спасти... друга... +Stop... +Стой... +Come... here... +Иди... сюда... +*giggles* +*хихикает* +The weapon requires power from an Ancient Crystal to function. +Для функционирования оружия требуется энергия Древнего кристалла. +Target an enemy: Attack with Dragonslaver. Target a tile: Spend 8 charge to launch binding belts +Прицеливание на врага: Атакуйте с помощью Убийцы Драконов. Прицеливание на плитку: потратьте 8 зарядов, чтобы запустить связывающие ремни. +25 charge to enter Slime Form for 25 turns, and create slime around yourself. +25 заряда, чтобы войти в форму слизи на 25 ходов и создать слизь вокруг себя. +50 charge to reduce mana cost of next fire, earth, air, and water spell by 50 (once for each element) +50 заряда снижают стоимость в мане следующего заклинания огня, земли, воздуха и воды на 50 (по одному разу для каждого элемента) +25 charge to disarm a target for 8 turns, rendering them unable to attack. +25 заряда обезоруживают цель на 8 ходов, лишая ее возможности атаковать. +5 charge (+2.5 per charge) to channel and fire a beam that deals 30 + 3/charge electric damage, or 90 at max charge. +5 заряда (+2,5 за заряд) для атаки лучом, который наносит 30 + 3 за заряд урона электричеством, или 90 при максимальном заряде. +10 charge to fire a blast that deals 25 electric damage. +10 заряда для взрывного выстрела, наносящего 25 единиц урона электричеством. +50 charge to fire an arrow that enrages a target. +50 заряда, чтобы выпустить стрелу, приводящую цель в ярость. +50 charge: Free nearby allies and disrobe enemies, increasing charm damage by 100% and removing 100 armor. +50 заряда: Освобождает ближайших союзников и раздевает врагов, увеличивая урон от очарования на 100% и снимая 100 единиц брони. +Create a '+' shaped pool of slime that deals 35 glue damage per hit +Создайте лужицу слизи в форме '+', которая наносит 35 единиц урона от клея за попадание. +Ignite torches and nearby objects +Поджигает факелы и близлежащие предметы +Ignite torches and nearby objects +Поджигает факелы и близлежащие предметы +Ignite torches and nearby objects +Поджигает факелы и близлежащие предметы +Ignite torches and nearby objects +Поджигает факелы и близлежащие предметы +Hit a cracked tile. If there is empty space or cracks on the opposite side, it breaks. +Ударьте по треснувшей плитке. Если на противоположной стороне есть пустое пространство или трещины, плитка разобьется. +Preferences +Предпочтения +Preferences 2 +Предпочтения 2 +Multiclass +Мультикласс +Game-Changing +Изменение правил игры +Restriction +Ограничения +Training +Обучение +Restraints +Ограничители +Combat +Бой +Kinks +Фетиши +Senses +Ощущения +Damage and Resists +Урон и Сопротивления +Magic +Магия +Spell Components +Активаторы заклинаний +Threats +Угрозы +World Generation +Генерация Мира +Starting Scenario +Начальный Сценарий +Unlockable +Открываемое +You hand over your weapon reluctantly... +Вы неохотно отдаете свое оружие... +(Leave) +(Покинуть) +### (...) + +(The SPEAKER frowns)|Don't lie to me. +(SPEAKER хмурится)|Не лги мне. +(The SPEAKER looks puzzled)|That doesn't seem right... +(SPEAKER выглядит озадаченной)|Это кажется неправильным... +(The SPEAKER chuckles)|What a cute lie. +(SPEAKER хихикает)|Какая милая ложь. +(The SPEAKER beeps)|Vital signs indicate dishonesty. +(SPEAKER издаёт звуки)|Жизненные показатели указывают на нечестность. +(The SPEAKER furrows her brow)|...Excuse me? +(SPEAKER морщит лоб)|...Прошу прощения? +(The SPEAKER tilts her head)|Right, sorry. +(SPEAKER склоняет голову)|Верно, извиняюсь. +(The SPEAKER blushes deeply)|I'm... I'm sorry! Please carry on... +(SPEAKER густо краснеет)|Я... Я извиняюсь! Пожалуйста, продолжай... +(The SPEAKER smiles)|Keep up the good work, girl. +(SPEAKER улыбается)|Продолжай в том же духе, девочка. +(The SPEAKER beeps)|Vital signs indicate honesty. Carry on. +(SPEAKER пищит)|Жизненные показатели указывают на честность. Продолжай. +(The SPEAKER smiles)|Good girl. +(SPEAKER улыбается)|Хорошая девочка. +(The SPEAKER smiles)|That's a good girl. +(SPEAKER улыбается)|Вот это хорошая девочка. +(The SPEAKER smiles)|Thank you. +(SPEAKER улыбается)|Спасибо тебе. +(The SPEAKER beeps)|Thank you for complying. +(SPEAKER издаёт звуки)|Благодарю за сотрудничество. +(The SPEAKER frowns)|Looks like you'll need to be punished. Get her! +(SPEAKER хмурится)|Похоже, тебя нужно наказать. Хватай ее! +(The SPEAKER looks Embarrassed)|Then... then... uh... someone stop her! +(SPEAKER выглядит смущенной)|Тогда... тогда... э-э-э... кто-нибудь, остановите ее! +(The SPEAKER grins)|Then allow me to personally show you the rules. +(SPEAKER ухмыляется)|Тогда позволь мне лично ознакомить тебя с правилами. +(The SPEAKER cracks her knuckles)|Finally, I get to have some fun~ +(SPEAKER хрустит костяшками пальцев)|Наконец-то я могу немного повеселиться.~ +(The SPEAKER beeps)|Subject is resisting. Begin capture protocol. +(SPEAKER издаёт звуки)|Объект сопротивляется. Запустить протокол захвата. +(The SPEAKER calls at you)|You're not supposed to be carrying a weapon.|Hand it over. +(SPEAKER обращается к вам)|Тебе не положено носить оружие.|Отдай это мне. +(The SPEAKER approaches you)|Contraband detected. Initiating confiscation.|Please comply. +(SPEAKER подходит к вам)|Обнаружена контрабанда. Инициирование конфискации.|Пожалуйста, подчинитесь. +(The SPEAKER blushes)|Umm, miss, I see that you have a weapon there,|could you maybe hand it over? +(SPEAKER краснеет)|Ммм, мисс, я вижу, у тебя там оружие,|не могла бы ты его передать мне? +(The SPEAKER smiles at you)|Be a good girl and hand that weapon over,|would you? +(SPEAKER улыбается вам)|Может будешь хорошей девочкой,|и отдашь оружие? +(The SPEAKER grins and cracks her knuckles)|Are you planning to fight anybody with that?|Or are you gonna hand it over? +(SPEAKER ухмыляется и хрустит костяшками пальцев)|Ты собираешься им с кем-нибудь драться?|Или ты отдашь его? +Yes, miss... (Currently held weapon will be lost) +Да, мисс... (Экипированное в данный момент оружие будет утеряно) +Mmph... (Nod politely) (Currently held weapon will be lost) +Ммф... (Вежливо кивните) (Экипированное в данный момент оружие будет утеряно) +No, I refuse! +Нет, я отказываюсь! +Mmph! (Shake your head) +Ммф! (Покачать головой) +The Head Maid asked me to retrieve it. +Старшая горничная попросила меня забрать это. +My mistress needs it for a special spell. +Моей госпоже это нужно для особого заклинания. +It is an offering to the goddess of Elements. +Это подношение Богине Стихий. +It's just a prop for a costume. +Это всего лишь подставка для костюма. +Are you questioning me? I'm a dragonslayer. +Ты сомневаешься во мне? Я убийца драконов. +(Continue...) +(Продолжить...) +(The SPEAKER approaches you in your cell)|Well well, what do we have here? A new guest?|Perhaps I should give you a rundown of your new life~ +(SPEAKER подходит к вам в вашей камере)|Ну-ну, что мы здесь имеем? Новый гость?|Возможно, мне следует вкратце рассказать тебе о твоей новой жизни~ +(The SPEAKER chuckles)|Don't tell me you seriously think we're letting you go?|You broke the rules, ignored the warnings.|Your new job is to make the people here happy. +(SPEAKER хихикает)|Только не говори мне, что ты серьезно думаешь, что мы тебя отпустим?|Ты нарушила правила, проигнорировала предупреждения.|Твоя новая работа - осчастливливать здесь людей. +(The SPEAKER chuckles)|Hah, looks like you've got lots of training ahead of you.|Soon you'll have too much pleasure for your own good~ +(SPEAKER хихикает)|Ха, похоже, у тебя впереди много тренировок.|Скоро ты получишь слишком много удовольствия, но это для твоего же блага~ +(The SPEAKER giggles)|Don't worry, you'll come to enjoy it soon enough. +(SPEAKER усмехается)|Не волнуйся, скоро это начнет тебе нравиться. +(The SPEAKER smiles)|Heh, looks like you'll be fitting right in. +(SPEAKER улыбается)|Хех, похоже, ты отлично сюда вписываешься. +(The SPEAKER chuckles)|You're probably wondering what's in store for you.|It's simple: You behave and do as you're told.|Eventually you will get to roam around.|Don't you dare try to steal anything. +(SPEAKER хихикает)|Ты, наверное, задаешься вопросом, что тебя ждет впереди.|Все просто: ты ведешь себя прилично и делаешь то, что тебе говорят.|В конце концов, ты сможешь выходить погулять.|Но не смей пытаться что-либо украсть. +(The SPEAKER chuckles)|Feisty, aren't you?|Looks like it's going to be an extended stay for you~ +(SPEAKER хихикает)|Дерзкая, значит?|Похоже, тебе предстоит длительное пребывание здесь~ +(The SPEAKER giggles and returns to her work) +(SPEAKER усмехается и возвращается к своей работе) +(The SPEAKER smiles)|Looks like you'll get the hang of it pretty quickly! +(SPEAKER улыбается)|Похоже, ты очень быстро здесь освоишься! +(New life?) +(Новая жизнь?) +(Let her continue) +(Позволить ей продолжать) +(Pout at her) +(Обижаться на неё) +You can't make me do that! +Ты не сможешь заставить меня сделать это! +(Scream into your gag) +(Кричать в свой кляп) +That sounds alright... +Звучит неплохо... +(Moan into your gag and giggle) +(Стонать в свой кляп и хихикать) +(Glare at her) +(Свирепо посмотреть на неё) +Let me out this instant! +Выпустите меня сейчас же! +(Scream into your gag uselessly) +(Беспомощно кричать в свой кляп) +I will be a good girl! +Я буду хорошей девочкой! +(Giggle and wiggle your body) +(Хихикать и покачивать всем телом) +(The SPEAKER approaches you in your cell)|Back again, are we? Silly girl.|You know we don't take no for an answer. +(SPEAKER подходит к вам в вашей камере)|Мы снова вернулись, не так ли? Глупая девчонка.|Ты же знаешь, мы не принимаем 'нет' в качестве ответа. +(The SPEAKER smiles back)|Oh, this is a game to you?|Then perhaps I should make it funner for you...|(She leaves and returns with some toys...)|Now hold still! +(SPEAKER улыбается в ответ)|О, для тебя это игра?|Тогда, возможно, мне следует сделать так, чтобы тебе было веселее...|(Она уходит и возвращается с какими-то игрушками...)|А теперь стой смирно! +(The SPEAKER frowns)|I know exactly what you need... +(SPEAKER хмурится)|Я точно знаю, что тебе нужно... +(The SPEAKER smiles back)|I'm glad you're enjoying yourself.|However, your behavior is still unacceptable.|You need to learn some respect. +(SPEAKER улыбается в ответ)|Я рада, что тебе здесь нравится.|Однако твоё поведение по-прежнему неприемлемо.|Тебе нужно научиться некоторому уважению. +(The SPEAKER chuckles)|Looks like you're enjoying your restraints?|Let's make them tighter, shall we? +(SPEAKER хихикает)|Похоже, тебе нравятся твои ограничители?|Давай сделаем их потуже, хорошо? +(The SPEAKER shrugs)|Well, I hope you learn. +(SPEAKER пожимает плечами)|Что ж, я надеюсь, ты усвоила урок. +(The SPEAKER looks greedy)|Oh, you have an idea? +(SPEAKER выглядит алчной)|О, у тебя есть идея? +(The SPEAKER nods)|I'll put in a good word with you~ +(SPEAKER кивает)|Я замолвлю за тебя словечко~ +(The SPEAKER shakes her head)|Babe, you know who's going to be blamed|if a max-security prisoner escapes? +(SPEAKER качает головой)|Детка, ты знаешь, кого обвинят|если заключенный строгого режима сбежит? +(The SPEAKER shakes her head)|I'll be honest with you, you're not worth the risk.|It'd help if you had more change~ +(SPEAKER качает головой)|Я буду честна с тобой, ты не стоишь такого риска.|Но вот если бы у тебя было больше мелочи~ +(Giggle and smile) +(Хихикать и улыбаться) +Don't you mean 'more fun'? +Разве ты не имеешь в виду 'веселее'? +(Giggle and moan) +(Хихикать и стонать) +(Struggle in your bindings) +(Бороться с оковами) +(Pout and glare at her) +(Надуть губы и свирепо посмотреть на неё) +(Point to the Jailer's coin pouch) +(Указать на мешочек с монетами тюремщика) +(Give her BRIBECOST gold) +(Дать ей BRIBECOST золота) +Why don't you wear it instead? (OFFPERC chance, may aggro) +Почему бы вместо этого тебе не надеть это? (OFFPERC шанс, может вызвать агрессию) +(Point to her instead) (OFFPERC chance, may aggro) +(Вместо этого укажите на нее) (OFFPERC шанс, может вызвать агрессию) +(The SPEAKER resists and fights back!) +(SPEAKER сопротивляется и дает отпор!) +(The SPEAKER blushes and accepts) +(SPEAKER краснеет и соглашается) +(The SPEAKER looks at you curiously)|Oh, you'd be perfect!|Would you please model my latest design? +(SPEAKER смотрит на вас с любопытством)|О, ты идеальна!|Не могла бы ты, пожалуйста, протестировать мой последний дизайн? +(The SPEAKER holds up a restrictive outfit)|This RESTRAINT might be a tight fit|so hold still while I lace it~ +(SPEAKER держит строгий наряд)|Это RESTRAINT может быть тесновато, так что не дергайся, пока я не зашнурую его~ +(The SPEAKER giggles)|It looks even better than I thought!|Thank you girl~ +(SPEAKER смеется)|Оно выглядит даже лучше, чем я думала!|Спасибо тебе, девочка~ +(The SPEAKER sighs and moves away)|Such a shame... +(SPEAKER вздыхает и уходит)|Такой позор... +(The SPEAKER looks disappointed)|Guess I'll find someone else then... +(SPEAKER выглядит разочарованной)|Думаю, тогда я найду кого-нибудь другого... +(The SPEAKER pouts)|But I just have to see how you look in it! +(SPEAKER дуется)|Но я просто хочу посмотреть, как ты в нем выглядишь! +(The SPEAKER smiles)|Maybe you'll change your mind when it's on~ +(SPEAKER улыбается)|Может быть, ты передумаешь, когда наденешь это~ +(The SPEAKER grumbles)|...fine, but you'd look cute~ +(SPEAKER ворчит)|...ладно, но ты бы выглядела мило~ +(The SPEAKER looks bemused)|Changed your mind?|It does look good on you though~ +(SPEAKER выглядит озадаченной)|Ты передумала?|Тебе это действительно подойдёт~ +(The SPEAKER snaps her fingers)|(You feel the RESTRAINT magically appear on you)|Aha! Wonderful! You can go now~ +(SPEAKER щелкает пальцами)|(Вы чувствуете как на вас магическим образом появляется RESTRAINT)|Ого! Замечательно! Теперь ты можешь идти~ +Yes please! +Да, пожалуйста! +(Nod enthusiastically) +(С энтузиазмом кивнуть) +I don't have time for this. +У меня нет на это времени. +(Shake your head) +(Покачать головой) +Of course miss. +Конечно, мисс. +(Nod again) +(Снова кивнуть) +Actually, I'd rather not. +Вообще-то, я бы предпочла этого не делать. +(Shake your head) +(Покачать головой) +Fine, I guess. +Думаю, все в порядке. +(Giggle and nod) +(Усмехнуться и кивнуть) +Wait! That's too much! (PERCENT chance to avoid) +Подожди! Это уже слишком! (PERCENT шанс на избежание) +(Shake your head and moan) (PERCENT chance to avoid) +(Качать головой и стонать) (PERCENT шанс на избежание) +(The SPEAKER looks at you with a philisophical outlook)|Have you ever felt like you wanted to be...|Transformed? +(SPEAKER смотрит на все с философским мировоззрением)|Ты когда-нибудь чувствовала, что хотела бы...|Преобразиться? +(The SPEAKER takes a strange mask from her satchel)|Well, I have the answer right here... +(SPEAKER достает из своей сумки странную маску)|Что ж, у меня есть ответ прямо здесь... +(The SPEAKER nods seriously)|My hypothesis was correct... +(SPEAKER кивает с серьезным видом)|Моя гипотеза оказалась верной... +(The SPEAKER frowns)|Such a philistine. Begone. +(SPEAKER хмурится)|Такая простушка. Убирайся. +(The SPEAKER turns away and thinks deeply) +(SPEAKER отворачивается и глубоко задумывается) +(The SPEAKER is lost deep in thought)|Like... become someone else? +(SPEAKER погружена в глубокие раздумья)|Например... стать кем-то другим? +(The SPEAKER smiles)|You can be someone else... +(SPEAKER улыбается)|Ты можешь быть кем-то другим... +(The SPEAKER turns around and keeps pondering)|Hmmm... +(SPEAKER оборачивается и продолжает размышлять)|Хмм... +(The SPEAKER nods)|I see you are a truth seeker after all. +(SPEAKER кивает)|Я вижу, ты все-таки искатель истины. +(The SPEAKER lets you go. But then...)|(You feel her clip a RESTRAINT on you from behind!)|There... I shall now observe your behavior. +(SPEAKER отпускает вас. Но потом...)|(Вы чувствуете, как она пристёгивает RESTRAINT к вам со спины!)|Итак... Теперь я буду наблюдать за твоим поведением. +Um, sure? +Эм, конечно? +(Nod seriously) +(Серьезно кивнуть) +...What? +...Что? +(Shake your head) +(Покачать головой) +Show me the truth. +Покажи мне правду. +(Nod again) +(Снова кивнуть) +That's just creepy. +Это немного жутковато. +(Shake your head) +(Покачать головой) +Fine, you've convinced me. +Отлично, ты меня убедила. +(Giggle and nod) +(Усмехнуться и кивнуть) +I don't have time for this. (PERCENT chance to avoid) +У меня нет на это времени. (PERCENT шанс на избежание) +(Shake your head and moan) (PERCENT chance to avoid) +(Качать головой и стонать) (PERCENT шанс на избежание) +(The SPEAKER smiles as she hides her hands behind her back)|Have you heard of 'sensory deprivation'? +(SPEAKER улыбается, пряча руки за спину)|Ты слышала о 'сенсорной депривации'? +(The SPEAKER presents a RESTRAINT)|Well, I have just the thing for you!|It's nice and comfy, and it has earmuffs built in! +(SPEAKER демонстрирует RESTRAINT)|Что ж, у меня есть как раз то, что тебе нужно!|Красивый и удобный, а еще есть встроенные наушники! +(The SPEAKER starts pulling the hood over your head)|Let's get you laced in! +(SPEAKER начинает натягивать капюшон вам на голову)|Давай-ка тебя зашнуруем! +(The SPEAKER giggles)|Alrighty.|You don't know what you're missing out on~ +(SPEAKER хихикает)|Хорошо.|Ты не представляешь, чего ты лишаешься~ +(The SPEAKER doesn't seem to hear you) +(SPEAKER, кажется, вас не слышит) +(The SPEAKER looks at you with a devious grin)|Oh, but it's so much fun!|You can run around bumping into things!|It's the ultimate adventure! +(SPEAKER смотрит на вас с хитрой ухмылкой)|О, но это так весело!|Ты можешь бегать и натыкаться на всё подряд!|Это настоящее приключение! +(The SPEAKER chuckles)|Truth be told, I wasn't asking~|Now why don't you kneel for me... +(SPEAKER хихикает)|По правде говоря, я не спрашивала~|А теперь, почему бы тебе не встать передо мной на колени... +(The SPEAKER pouts)|I thought it would be fun... +(SPEAKER надувает губы)|Я подумала, что это будет весело... +(The SPEAKER starts pulling the hood over your head)|Let's get you laced in! +(SPEAKER начинает натягивать капюшон вам на голову)|Давай-ка тебя зашнуруем! +(The SPEAKER surprises you with a crop to the thigh)|(You involuntarily kneel in front of her)|That's better~|Now why don't you say good night~ +(SPEAKER неожиданно ударяет вас по бедру)|(Вы невольно опускаетесь перед ней на колени)|Так-то лучше~|А теперь, почему бы тебе не пожелать спокойной ночи~ +Of course! I love it! +Конечно люблю! +(Nod eagerly) +(Энергично кивать) +I prefer 'situational awareness'. +Я предпочитаю 'понимать ситуацию'. +(Shake your head in alarm) +(Встревоженно качать головой) +Doll me up! +Наряди меня! +(Nod again) +(Снова кивнуть) +Actually, that sounds stifling... +На самом деле, это звучит удушающе... +(Shake your head) +(Покачать головой) +That doesn't sound that bad actually... +На самом деле это звучит не так уж и плохо... +(Giggle and nod) +(Усмехнуться и кивнуть) +I don't have time for this. (PERCENT chance to avoid) +У меня нет на это времени. (PERCENT шанс на избежание) +(Shake your head and groan) (PERCENT chance to avoid) +(Покачать головой и замычать) (PERCENT шанс на избежание) +(The SPEAKER smiles and looks down at you deviously)|Hey there, I have a 'job' for you! +(SPEAKER улыбается и хитро смотрит на вас сверху вниз)|Привет, у меня есть для тебя 'работенка'! +(The SPEAKER takes a duster gag from her satchel)|Such a good girl!|So here's what I have for you~|It's a special tool to help keep the place clean. +(SPEAKER достает кляп с метелкой своей сумки)|Какая хорошая девочка!|Смотри, что у меня есть для тебя~|Это специальный инструмент, помогающий поддерживать чистоту. +(The SPEAKER grins)|I'm glad we could come to an understanding~|(She takes out a duster gag from her satchel)|Now then, this place is filthy.|Why don't you put this on to help? +(SPEAKER ухмыляется)|Я рада, что мы смогли прийти к взаимопониманию~|(Она достает тряпку для кляп-метелку из своей сумки)|Итак, здесь очень грязно.|Почему бы тебе не надеть эту штучку и не помочь нам? +(The SPEAKER frowns)|Fair enough.|Perhaps you should reconsider your life choices~ +(SPEAKER хмурится)|Ладно.|Возможно, тебе следует пересмотреть свой жизненный выбор~ +(The SPEAKER shrugs)|I'll find someone else... +(SPEAKER пожимает плечами)|Я найду кого-нибудь другого... +(The SPEAKER reaches out to grab you)|Now now,|You shouldn't skip out on your duties~|(She pulls out a duster gag from her satchel and grins) +(SPEAKER протягивает руку, чтобы схватить вас)|Ну, ну,|ты не должна пренебрегать своими обязанностями~|(Она достает кляп-метелку из своей сумки и улыбается) +(The SPEAKER smiles)|Don't be afraid!|(She turns the gag with the round mouth ball clearly visible)|Now open up... +(SPEAKER улыбается)|Не бойся!|(Она поворачивает кляп так, чтобы был хорошо виден круглый шарик для рта)|Теперь открой... +(The SPEAKER shrugs)|Fine, I'll get someone else to clean up. +(SPEAKER пожимает плечами)|Хорошо, я попрошу прибраться кого-нибудь другого. +(The SPEAKER places the gag in your mouth)|(She then buckles up the straps.)|(You feel a locking mechanism pull the straps in tight...)|Good maid! +(SPEAKER вставляет кляп вам в рот)|(Затем она застегивает ремни.)|(Вы чувствуете, как запирающий механизм туго натягивает ремни...)|Хорошая горничная! +(The SPEAKER catches you and forces the gag on you)|(You feel it tighten as it locks on securely...)|I don't want to hear it!|Now go and do your job~ +(SPEAKER ловит вас и затыкает вам рот кляпом)|(Вы чувствуете, как он затягивается, очень надежно фиксируясь...)|Я не хочу слышать подобного!|А теперь иди и делай свою работу~ +I'll do it! +Я сделаю это! +(Nod seriously) +(Серьезно кивнуть) +I don't like the sound of this. +Мне не нравится, как это звучит. +(Shake your head) +(Покачать головой) +Yes miss! +Да, мисс! +(Nod again) +(Снова кивнуть) +Actually, maybe not... +На самом деле, наверное, не надо... +(Shake your head) +(Покачать головой) +Okay okay... I'll do it. +Ладно, ладно... Я сделаю это. +(Giggle and nod) +(Усмехнуться и кивнуть) +That gag is far too big! (PERCENT chance to avoid) +Этот кляп слишком большой! (PERCENT шанс на избежание) +(Shake your head and moan) (PERCENT chance to avoid) +(Качать головой и стонать) (PERCENT шанс на избежание) +(The SPEAKER swings an imaginary sword around)|En guar- Oh, you're unarmored!|Do you want to borrow some of mine? +(SPEAKER размахивает воображаемым мечом)|На страж- О, ты без доспехов!|Не хочешь позаимствовать что-нибудь из моих? +(The SPEAKER holds up a RESTRAINT)|I found this near an old suit of armor.|I think it's a helmet or something... +(SPEAKER держит в руках RESTRAINT)|Я нашла это рядом со старыми доспехами.|Я думаю, это шлем или что-то в этом роде... +(The SPEAKER winks and locks it on)|I feel much safer already~ +(SPEAKER подмигивает и запирает замок)|Я уже чувствую себя в гораздо большей безопасности~ +(The SPEAKER pouts)|Aww, spoilsport!|(She returns to fighting her imaginary enemies) +(SPEAKER надувает губки)|О-о-о, обломщица!|(Она возвращается к борьбе со своими воображаемыми врагами) +(The SPEAKER shrugs)|Your loss~ +(SPEAKER пожимает плечами)|Твоя потеря~ +(The SPEAKER grins deviously)|So? It might help...|(The SPEAKER dives at you suddenly!) +(SPEAKER хитро ухмыляется)|Значит так? Тогда...|(SPEAKER внезапно бросается на вас!) +(The SPEAKER giggles)|Close enough, right?|Come on, there's enemies to fight! +(SPEAKER смеется)|Достаточно близко, не так ли?|Давай, здесь есть враги, с которыми нужно сражаться! +(The SPEAKER trips over the floor)|AHHHHH!|Maybe I need more protection... +(SPEAKER падает на землю)|ААААЙ!|Может, мне нужно больше защиты... +(The SPEAKER locks it in place quickly)|There, all set for battle now!|(The SPEAKER giggles, cheekily winking at you) +(SPEAKER быстро фиксирует предмет)|Ну вот, теперь всё готово к бою!|(SPEAKER хихикает, нахально подмигивая вам) +(The SPEAKER tightly fastens the muzzle on)|Safe and secure~|(You whimper as the SPEAKER spanks you goodbye) +(SPEAKER плотно застегивает намордник)|Теперь ты под надёжной защитой~|(Вы хнычите, когда SPEAKER шлепает вас на прощание) +Extra defense can't hurt... +Дополнительная защита не повредит... +(Nod cautiously) +(Осторожно кивнуть) +I'm safe enough. +Я достаточно защищена. +(Shake your head) +(Покачать головой) +A gag? Sounds fun~ +Кляп? Звучит забавно~ +(Nod eagerly) +(Нетерпеливо кивнуть) +That's not a helmet! +Это не шлем! +(Shake your head) +(Покачать головой) +Well, it might... +Что ж, возможно... +(Giggle and nod) +(Усмехнуться и кивнуть) +(Dodge her lunge) (PERCENT chance to avoid) +(Уклониться от её выпада) (PERCENT шанс на избежание) +(Dodge her lunge) (PERCENT chance to avoid) +(Уклониться от её выпада) (PERCENT шанс на избежание) +(A smirking SPEAKER bumps into you)|So, you're with us now, huh?|I think you need a welcome gift. +(Ухмыляющийся SPEAKER врезается в вас)|Итак, теперь ты с нами, да?|Я думаю, тебе нужен приветственный подарок. +Mmhmm, a gift~|(The SPEAKER leans forward to whisper in your ear)|Is it cold in here, or is it just you? +Ммхммм, подарок~|(SPEAKER наклоняется вперед, чтобы прошептать вам на ухо)|Здесь холодно, или это только так кажется? +(You shiver as everything gets colder)|(RESTRAINT forms around you!)|(The SPEAKER blows you a kiss and giggles) +(Вы дрожите, пока становится все холоднее)|(RESTRAINT формируются вокруг вас!)|(SPEAKER посылает вам воздушный поцелуй и смеется) +(The SPEAKER thinks for a moment)|I really wanted to try this too...|(Sighing, the SPEAKER walks away) +(SPEAKER задумывается на мгновение)|Я действительно хотела попробовать это..|(Вздыхая, SPEAKER уходит) +(The SPEAKER scowls)|How boring. +(SPEAKER хмурится)|Как скучно. +(The SPEAKER laughs at your protest)|It's so much fun though~|(You feel the temperature drop suddenly) +(SPEAKER смеется над вашим протестом)|Это так весело~|(Вы чувствуете внезапное понижение температуры) +(The SPEAKER thinks for a moment)|Well, I want to try this anyway~|(You feel the temperature drop suddenly) +(SPEAKER задумывается на мгновение)|Что ж, я вс` равно хочу попробовать это~|(Вы чувствуете внезапное понижение температуры) +(The temperature returns to normal)|(The SPEAKER seems surprised)|Hmm, that wasn't meant to happen. +(Температура возвращается в норму)|(SPEAKER кажется удивленной)|Хм, это не должно было случиться. +(RESTRAINT solidifies on you as the SPEAKER grins)|It worked! I did it!|Thanks for your, uh, help~ +(RESTRAINT застывает на вас в тот момент, как SPEAKER ухмыляется)|Это работает! Я сделала это!|Спасибо за твою, ух, помощь~ +(RESTRAINT solidifies on you as the SPEAKER smiles)|Yes! Finally! How's that feel?|(The SPEAKER admires your restraints) +(RESTRAINT застывает на вас в тот момент, как SPEAKER улыбается)|Да! Наконец-то! Как это ощущается?|(SPEAKER восхищается вашими ограничителями) +A gift? +Подарок? +(Nod warily) +(Осторожно кивнуть) +No thanks. +Нет, спасибо. +(Shake your head) +(Покачать головой) +Umm... just me? +Умм... не кажется? +(Nod again) +(Снова кивнуть) +Wait, don't make it colder! +Подожди, не делай еще холоднее! +(Shake your head) +(Покачать головой) +(Shiver and watch as the ice covers you) +(Дрожать и смотреть, как лед покрывает вас) +(Mutely whimper as the ice covers you) +(Тихо всхлипывать, пока лед покрывает вас) +Ah! T-That's freezing! (PERCENT chance to avoid) +Ах! Оно замерзает! (PERCENT шанс на избежание) +(Wriggle to warm up) (PERCENT chance to avoid) +(Поерзать, чтобы разогреться) (PERCENT шанс на избежание) +(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? +(К вам приближается робот SPEAKER)|ЗАПРОС: Обнаружена хорошая девочка:|Желаешь ограничителей? +(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? +(SPEAKER пищит и жужжит)|SPEAKER использует RESTRAINT.|Приемлимо? +(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER вращается вокруг вас, выпуская ленту)|RESTRAINT применено.|Хорошего дня. +(The SPEAKER buzzes)|Understood. Proceding back to duty. +(SPEAKER жужжит)|Понятно. Возвращаюсь к исполнению своих обязанностей. +(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. +(SPEAKER щелкает и пищит)|Отказ принят к сведению.|SPEAKER возвращается к патрулированию. +(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. +(SPEAKER жужжит)|ОШИБКА: Противоречие в ответе.|УТВЕРЖДЕНИЕ: SPEAKER применит RESTRAINT. +ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. +ОШИБКА: Ожидалось согласие.|ЗАЯВЛЕНИЕ: SPEAKER применит RESTRAINT. +(The SPEAKER makes a whirring noise)|ERROR: SPEAKER out of tape.|Returning to routine. +(SPEAKER издает жужжащий звук)|ОШИБКА: У SPEAKER закончилась лента.|Возвращение к патрулированию. +(The SPEAKER spins around you, releasing tape)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER вращается вокруг вас, выпуская ленту)|RESTRAINT применено.|Хорошего дня. +(The SPEAKER launches tape which catches you as you run)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER запускает ленту, которая обвивается вокруг вас на бегу)|RESTRAINT применено.|Хорошего дня. +Uh, affirmative? +Э-э, подтверждаю? +(Nod) +(Кивнуть) +Negative. +Нет. +(Shake your head) +(Покачать головой) +Very acceptable! +Давай, скорее! +(Nod again) +(Снова кивнуть) +No, I don't want that. +Нет, я этого не хочу. +(Shake your head) +(Покачать головой) +If you have to... +Если тебе так хочется... +(Giggle and nod) +(Усмехнуться и кивнуть) +Go away robot! (PERCENT chance to avoid) +Вали отсюда, робот! (PERCENT шанс на избежание) +(Shake your head rapidly) (PERCENT chance to avoid) +(Быстро замотать головой) (PERCENT шанс на избежание) +(A robotic SPEAKER approaches)|QUERY: Good girl detected:|Restraint desired? +(К вам приближается робот SPEAKER)|ЗАПРОС: Обнаружена хорошая девочка:|Желаешь ограничителей? +(The SPEAKER beeps and whirrs)|SPEAKER will add RESTRAINT.|Acceptable? +(SPEAKER пищит и жужжит)|SPEAKER использует RESTRAINT.|Приемлимо? +(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER выпускает в вас тросами)|RESTRAINT применено.|Хорошего дня. +(The SPEAKER buzzes)|Understood. Proceding back to duty. +(SPEAKER жужжит)|Понятно. Возвращаюсь к исполнению своих обязанностей. +(The SPEAKER clicks and beeps)|Rejection noted.|SPEAKER will return to patrol. +(SPEAKER щелкает и пищит)|Отказ принят к сведению.|SPEAKER возвращается к патрулированию. +(The SPEAKER buzzes)|ERROR: Contradiction in answer.|STATEMENT: SPEAKER will add RESTRAINT. +(SPEAKER жужжит)|ОШИБКА: Противоречие в ответе.|УТВЕРЖДЕНИЕ: SPEAKER применит RESTRAINT. +ERROR: Acceptance expected.|STATEMENT: SPEAKER will add RESTRAINT. +ОШИБКА: Ожидалось согласие.|ЗАЯВЛЕНИЕ: SPEAKER применит RESTRAINT. +(The SPEAKER makes a whirring noise)|ERROR: SPEAKER cable jammed.|Returning to routine. +(SPEAKER издает жужжащий звук)|ОШИБКА: У SPEAKER заклинило кабель.|Возвращение к патрулированию. +(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER выстреливает в вас тросами)|RESTRAINT применено.|Хорошего дня. +(The SPEAKER shoots cables at you)|RESTRAINT dispensed.|Have a nice day. +(SPEAKER выстреливает в вас тросами)|RESTRAINT применено.|Хорошего дня. +Uh, affirmative? +Э-э, подтверждаю? +(Nod) +(Кивнуть) +Negative. +Нет. +(Shake your head) +(Покачать головой) +Very acceptable! +Давай, скорее! +(Nod again) +(Снова кивнуть) +No, I don't want that. +Нет, я этого не хочу. +(Shake your head) +(Покачать головой) +If you have to... +Если тебе так хочется... +(Giggle and nod) +(Усмехнуться и кивнуть) +Go away robot! (PERCENT chance to avoid) +Вали отсюда, робот! (PERCENT шанс на избежание) +(Shake your head rapidly) (PERCENT chance to avoid) +(Быстро замотать головой) (PERCENT шанс на избежание) +(A happy SPEAKER looks at you)|Hey there cutie~|Want to try some scarf bondage? +(Счастливая SPEAKER смотрит на вас)|Привет, милашка~|Хочешь попробовать бондаж с шарфом? +(The SPEAKER holds up some scarves)|If you want to try, I've got a few here.|I could give you a RESTRAINT? +(SPEAKER поднимает несколько шарфов)|Если ты хочешь попробовать, у меня здесь есть несколько штук.|Могу я предоставить тебе RESTRAINT? +(The SPEAKER smiles gently at you as she ties)|I love the silky feeling~|(The SPEAKER tightens all her knots) +(SPEAKER нежно улыбается тебе, занимаясь связыванием)|Мне нравится ощущение шелковистости~|(SPEAKER затягивает узлы) +(The SPEAKER looks away and nods)|Well... maybe next time. +(SPEAKER отводит взгляд и кивает)|Ладно... Может быть, в другой раз. +(The SPEAKER shuffles awkwardly)|Oh... well...|Come back if you change your mind~ +(SPEAKER неловко переминается с ноги на ногу)|О... хорошо...|Возвращайся, если передумаешь~ +(The SPEAKER scowls)|Hey, don't back out!|I promise I'll make it comfortable! +(SPEAKER хмурится)|Эй, не отступайся!|Я обещаю, что сделаю все, чтобы тебе было удобно! +(The SPEAKER frowns)|Too bad, I want to tie someone! +(SPEAKER хмурится)|Жаль, я хочу кого-нибудь связать! +(The SPEAKER drops her scarves)|Aww, really?|I'll go find someone else then... +(SPEAKER отбрасывает свои шарфы)|Ох, правда?|Тогда я пойду поищу кого-нибудь другого... +(The SPEAKER beams a smile)|Yay, thank you!|Feels nice, right? +(SPEAKER лучится улыбкой)|Ура, спасибо тебе!|Приятно на ощупь, правда? +(The SPEAKER tosses a scarf around you like a lasso)|Not so fast! You cannot escape the fluff! +(SPEAKER набрасывает на вас шарф, как лассо)|Не так быстро! Ты не сможешь избежать этой мягкости! +Sounds good! +Звучит заманчиво! +(Nod quickly) +(Быстро кивнуть) +Not really. +Не очень. +(Shake your head) +(Покачать головой) +Please do! +Пожалуйста, сделай это! +(Nod and giggle) +(Кивок и хихиканье) +Not right now. +Не сейчас. +(Shake your head) +(Покачать головой) +Well... sure then. +Что ж... конечно давай. +(Giggle and moan) +(Хихикать и стонать) +Hey! Stop! (PERCENT chance to avoid) +Эй! Остановись! (PERCENT шанс на избежание) +(Shake your head and whine) (PERCENT chance to avoid) +(Качать головой и скулить) (PERCENT шанс на избежание) +(An excited SPEAKER turns to you)|Eureka, I've done it!|Do you want to see? +(Взволнованная SPEAKER поворачивается к вам)|Эврика, я сделала это!|Ты хочешь посмотреть? +(The SPEAKER pulls out a pressurized flask)|Behold! A gaseous form of latex!|I've coated the interior with a layer of inert slime to keep it secure.|Here, have a look!|(She holds out the container) +(SPEAKER достает герметичную колбу)|Смотри! Газообразная форма латекса!|Я покрыла внутреннюю поверхность слоем инертной слизи, чтобы добиться целостности структуры.|Вот, взгляни!|(Она протягивает колбу) +(The flask springs a leak)|Oh no! That wasn't supposed to happen!|(The gas crystalizes into a RESTRAINT across your body) +(Колба дает течь)|О, нет! Этого не должно было случиться!|(Газ кристаллизуется, образуя RESTRAINT на вашем теле) +(The SPEAKER scoffs)|You'll see... you'll all see! +(SPEAKER смеется)|Вы увидите... вы все увидите! +(The SPEAKER sighs)|So hard to find good help out here... +(SPEAKER вздыхает)|Здесь так трудно найти хороших помощников... +(The SPEAKER frowns)|What, do you doubt my results? See for yourself!|(She unscrews the cap) +(SPEAKER хмурится)|Что, ты сомневаешься в моих результатах? Убедись сама!|(Она отвинчивает крышку) +(The green gas starts leaking)|Oh no! It wasn't supposed to do that! +(Зеленый газ начинает вытекать)|О нет! Всё должно было быть не так! +(You push her out of the way, but she frowns)|Hmph. This is your fault. +(Вы отталкиваете ее с дороги, но она лишь хмурится)|Хмпф. Это твоя вина. +(You push her out of the way, but get caught in the cloud yourself)|(The gas crystalizes into a RESTRAINT across your body)|Oh no, that could have been me! +(Вы отталкиваете ее с дороги, но сами попадаете в облако)|(Газ кристаллизуется, образуя RESTRAINT на вашем теле)|О нет, это могла бы быть я! +(The gas moves toward you, as if by its own will)|(The gas crystalizes into a RESTRAINT across your body)|That wasn't supposed to happen... +(Газ движется к вам, как будто по собственной воле)|(Газ кристаллизуется в RESTRAINT на вашем теле)|Этого не должно было случиться... +Seems interesting! +Это кажется интересным! +(Nod slowly) +(Медленно кивнуть) +Seems boring. +Это кажется скучным. +(Shake your head) +(Покачать головой) +Are you sure this is a good idea? +Ты уверена, что это хорошая идея? +(Nod again) +(Снова кивнуть) +Keep that away from me! +Держи это подальше от меня! +(Shake your head) +(Покачать головой) +I'll stop it! +Я разберусь с этим! +(Run toward her to help) +(Бежать к ней, чтобы помочь) +(Run away!) (PERCENT chance to avoid) +(Убегать!) (PERCENT шанс на избежание) +(Run away!) (PERCENT chance to avoid) +(Убегать!) (PERCENT шанс на избежание) +(A messy looking SPEAKER turns to you)|Hmm, curious. Very curious.|Can you help me with an experiment? +(Неряшливо выглядящая SPEAKER поворачивается к вам)|Хм, любопытно. Очень любопытно.|Не могла бы ты помочь мне с экспериментом? +(The SPEAKER pulls out a flask)|I isolated some slime, but it's inert.|Would you let me spill some on you? +(SPEAKER достает колбу)|Я выделила немного слизи, но она инертна.|Ты позволишь мне пролить немного на тебя? +(The SPEAKER tips out the entire flask)|Aha! It's growing again! Fascinating.|(Sticky RESTRAINT clings to you) +(SPEAKER опрокидывает всю колбу)|Ага! Она снова растет! Очаровательно.|(Липкая RESTRAINT цепляется за вас) +(The SPEAKER tuts disapprovingly)|Not one for chemistry, eh? +(SPEAKER неодобрительно хмыкает)|Не любишь химию, да? +(The SPEAKER sighs)|So hard to find good help out here... +(SPEAKER вздыхает)|Здесь так трудно найти хороших помощников... +(The SPEAKER glares at you)|You've got no sense of adventure!|For science! +(SPEAKER пристально смотрит на вас)|У тебя совсем нет тяги к приключениям!|Ради науки! +Ah, but it'll be quick!|(The SPEAKER begins tipping the flask)|See? It's already moving toward you! +Ах, но это будет быстро!|(SPEAKER начинает наклонять колбу)|Видишь? Она уже движется к вам! +(The SPEAKER tosses the slime on you)|(The slime flops off limply)|Ah. Back to the drawing board. +(SPEAKER брызгает на вас слизь)|(Слизь безвольно сползает вниз)|Ах. Придётся начинать всё с начала. +(The SPEAKER pours the slime onto you)|That's the spirit girl!|(Sticky RESTRAINT clings to you) +(SPEAKER выливает на вас слизь)|Вот это дух, девочка!|(Липкая RESTRAINT цепляется за вас) +(The SPEAKER tosses the slime on you)|Ha, look, it's alive!|(Sticky RESTRAINT clings to you) +(SPEAKER обливает вас слизью)|Ха, смотри, она живая!|(Липкая RESTRAINT цепляется за вас) +Sure. +Конечно. +(Nod slowly) +(Медленно кивнуть) +Absolutely not. +Ни в коем случае. +(Shake your head) +(Покачать головой) +On me? Sounds fun~ +На мне? Звучит забавно~ +(Nod again) +(Снова кивнуть) +Nope. Not doing that. +Нет. Не делай этого. +(Shake your head) +(Покачать головой) +Okay, for science... +Ладно, ради науки... +(Giggle and nod) +(Усмехнуться и кивнуть) +Ah! Don't you dare! (PERCENT chance to avoid) +Ах! Не смей! (PERCENT шанс на избежание) +(Shake your head and whimper) (PERCENT chance to avoid) +(Качать головой и хныкать) (PERCENT шанс на избежание) +(A SPEAKER whispers to you)|Ever wonder how wolfgirls feel?|Or why they're so obedient? +(SPEAKER шепчет вам)|Ты когда-нибудь задумывалась, что чувствуют девушки-волчицы?|Или почему они такие послушные? +(The SPEAKER grins)|I've got a RESTRAINT here~|Wanna give it a try? +(SPEAKER усмехается)|У меня есть RESTRAINT~|Хочешь попробовать? +(The SPEAKER puts on the RESTRAINT)|Perfect. Better behave now~|(The SPEAKER pats your butt) +(SPEAKER надевает RESTRAINT)|Идеально. И лучше веди себя прилично~|(SPEAKER похлопывает вас по заднице) +(The SPEAKER rolls her eyes)|You've seen wolfgirls, right?|Ah, whatever, go have fun~ +(SPEAKER закатывает глаза)|Ты ведь видела девушек-волчиц, верно?|А, неважно, иди развлекайся~ +(The SPEAKER nods glumly)|Not a fan?|Shame, I am~ +(SPEAKER мрачно кивает)|Не нравится?|Жаль~ +(The SPEAKER grabs you quickly)|Oh, it's very strict~|And great for being trained... +(SPEAKER быстро хватает вас)|О, это это очень строгая вещица~| И отлично подходит для обучения... +(The SPEAKER looks at you deviously)|You're going to wear this RESTRAINT,|if you want to or not~ +(SPEAKER смотрит на вас хитрым взглядом)|Ты наденешь RESTRAINT,|хочешь ты этого или нет~ +(The SPEAKER sulks)|Have it your way then. +(SPEAKER обижается)| Тогда будь по-твоему. +(The SPEAKER adds the RESTRAINT)|(You feel her tighten everything before locking it)|Good girl~ +(SPEAKER применяет RESTRAINT)|(Вы чувствуете, как предмет всё затягивается, прежде чем быть запертым)|Хорошая девочка~ +(The SPEAKER pushes you to the ground)|I'll make it extra tight for you~|(The RESTRAINT locks tightly onto you) +(SPEAKER прижимает вас к земле)|Я специально затяну для тебя потуже~|(RESTRAINT плотно обвивается вокруг вашего тела) +Maybe a little~ +Может быть, немного~ +(Nod excitedly) +(Взволнованно кивнуть) +Don't know, don't care. +Не знаю, мне все равно. +(Shake your head) +(Покачать головой) +Yes! So much! +Да! Очень! +(Nod quickly) +(Быстро кивнуть) +That looks too strict! +Это выглядит слишком строго! +(Shake your head) +(Покачать головой) +I- Well- O-Okay~ +Я- Ну- О-Окей~ +(Moan and squirm) +(Стонать и ерзать) +I don't want to get stuck! (PERCENT chance to avoid) +Я не хочу в этом застрять! (PERCENT шанс на избежание) +(Shake your head worriedly) (PERCENT chance to avoid) +(Дрожать и качать головой) (PERCENT шанс на избежание) +(A SPEAKER gracefully gestures to you)|So good to see a friendly face~|Care to see some elven goods? +(SPEAKER изящно жестикулирует в вашем направлении)|Так приятно видеть дружелюбное лицо~|Хочешь посмотреть кое-какие эльфийские товары? +(The SPEAKER holds up a RESTRAINT)|These are some of our strictest.|Want to try? +(SPEAKER держит в руках RESTRAINT)|Это один из наших самых строгих.|Хочешь попробовать? +(The SPEAKER smiles sweetly)|Such a good girl~|(The RESTRAINT locks with a loud click) +(SPEAKER мило улыбается)|Такая хорошая девочка~|(RESTRAINT защелкивается с громким щелчком) +(The SPEAKER sagely nods)|As you wish~ +(SPEAKER глубокомысленно кивает)|Как пожелаешь~ +(The SPEAKER frowns briefly)|I understand~ +(SPEAKER нахмуривается)|Я поняла~ +(The SPEAKER leans closer)|Then you can test their escapability!|(The SPEAKER dives towards you!) +(SPEAKER наклоняется ближе)|Тогда ты можешь попытаться из него выбраться!|(SPEAKER резко сближается с вами!) +(The SPEAKER shifts her weight back)|I'm afraid I must insist.|(She's gripping a RESTRAINT)|(The SPEAKER dives towards you!) +(SPEAKER отодвигается назад)|Боюсь, я должна настоять.|(Она держит в руках RESTRAINT)|(SPEAKER резко сближается с вами!) +(The SPEAKER rolls past harmlessly)|Oh! So fast~ +(SPEAKER проскальзывает мимо, не причиняя вреда)|О! Такая быстрая~ +(The SPEAKER snaps the RESTRAINT on)|There, much better.|Now squirm for me cutie~ +(SPEAKER защелкивает RESTRAINT)|Вот так гораздо лучше.|А теперь извивайся для меня, милашка~ +(The SPEAKER trips you over)|(Before you can move, the RESTRAINT closes firmly)|Strict, isn't it?~ +(SPEAKER сбивает вас с ног)|(Прежде чем вы успеваете пошевелиться, RESTRAINT плотно застегивается)|Строгое, не так ли?~ +Of course! +Конечно! +(Nod happily) +(Радостно кивнуть) +No, thanks. +Нет, спасибо. +(Shake your head) +(Покачать головой) +Pretty please~ +Пожалуйста, красавица~ +(Nod eagerly) +(Нетерпеливо кивнуть) +Not really. +Не очень. +(Shake your head) +(Покачать головой) +Fine... +Ладно... +(Moan and giggle) +(Стонать и хихикать) +Stop! (PERCENT chance to avoid) +Стой! (PERCENT шанс на избежание) +(Shake your head and moan) (PERCENT chance to avoid) +(Качать головой и стонать) (PERCENT шанс на избежание) +(A SPEAKER plays with silvery rope)|Hmm, I need to get better with this.|Can I practice on you? +(SPEAKER играет с серебристой веревкой)|Хм, мне нужно больше практиковаться.|Могу я попробовать на тебе? +(The SPEAKER grins happily)|Thank you girl~|I'll tie with RESTRAINT then~ +(SPEAKER счастливо улыбается)|Спасибо тебе, девочка~|Тогда я свяжу тебя RESTRAINT~ +(The SPEAKER binds you tightly)|(The rope is tight, and she's clearly an expert.)|Mmm, not too bad~ +(SPEAKER крепко связывает вас)|(Веревка очень тугая, она явно профессионал)|Ммм, не так уж плохо~ +(The SPEAKER pouts indignantly)|Why say yes then?!|(The SPEAKER walks off grumbling) +(SPEAKER возмущенно надувает губы)|Зачем тогда говорить 'да'?!|(Разочарованная SPEAKER уходит) +(The SPEAKER sighs)|Very well then~ +(SPEAKER вздыхает)|Ладно, хорошо~ +(The SPEAKER pouts indignantly)|Oh no, you don't get out that easy.|You said you'd help! +(SPEAKER возмущенно надувает губы)|О нет, так просто ты не отделаешься.|Ты сказала, что поможешь! +(The SPEAKER smirks)|Ooh, a chance to practice against resistance~|I can't pass that up! +(SPEAKER ухмыляется)|О, шанс попрактиковаться на сопротивляющейся~| Я не могу его упустить! +(The SPEAKER can't keep the knots tight)|(Eventually, she gives up)|S-Stupid human... +(SPEAKER не может туго завязать узлы)|(В конце концов, она сдается)|Г-глупый человечишка... +(The SPEAKER strictly ties you up)|(You can feel she's done this many times)|(She smirks at you as she departs) +(SPEAKER туго вас связывает)|(Вы можешь почувствовать, что она делала это много раз)|(Она ухмыляется вам, уходя) +(The SPEAKER strictly ties you up)|(There's no slack anywhere!)|(She makes a face at you as she leaves) +(SPEAKER туго вас связывает)|(Все узлы очень тугие, нет ни одного некачественного!)|(Она корчит тебе рожу, уходя) +Any time~ +В любое время~ +(Nod excitedly) +(Взволнованно кивнуть) +I'd rather you didn't. +Я бы предпочла, чтобы ты этого не делала. +(Shake your head) +(Покачать головой) +Sounds great! +Звучит заманчиво! +(Nod again) +(Снова кивнуть) +Actually, I don't want that. +На самом деле, я этого не хочу. +(Shake your head) +(Покачать головой) +I'll play along then~ +Тогда я тебе подыграю~ +(Moan and squirm) +(Стонать и ерзать) +(Struggle against her) (PERCENT chance to avoid) +(Бороться с ней) (PERCENT шанс на избежание) +(Struggle against her) (PERCENT chance to avoid) +(Бороться с ней) (PERCENT шанс на избежание) +(The SPEAKER quickly motions to you)|Hey! Over here!| I got something to show you! +(SPEAKER быстро подает вам знак)|Эй! Сюда!| Я хочу тебе кое-что показать! +(The SPEAKER giggles)|You'll be wearing this~|(A RESTRAINT is in her hands) +(SPEAKER смеется)|Ты будешь носить это~|(В её руках виднеется RESTRAINT) +(The SPEAKER looks surprised)|Oh, uh, sure!|(They quickly add the RESTRAINT) +(SPEAKER выглядит удивленной)|О, э-э, конечно!|(Она быстро надевает на вас RESTRAINT) +(The SPEAKER grins sneakily)|I thought you might say that~|But- ahh!|(They drop the item and you slip away) +(SPEAKER украдкой усмехается)|Я так и думал, что ты это скажешь~|Но- ааай!|(Она роняет предмет, и вы ускользаете) +(The SPEAKER looks angry)|Hey! HEY! I'm talking to-|Ah, forget it. +(SPEAKER выглядит сердитой)|Эй! ЭЙ! Я разговариваю с... |Ах, забудь об этом. +(The SPEAKER grins sneakily)|I thought you might say that~|But it wasn't a choice... +(SPEAKER украдкой усмехается)|Я так и думала, что ты это скажешь~|Но у тебя не было выбора... +(The SPEAKER follows you)|Not so fast there~|(She blocks your path) +(SPEAKER следует за вами)|Не так быстро~| (Она преграждает вам путь) +(The SPEAKER fumbles with the RESTRAINT)|C-Come on, open-|(You quickly walk away) +(SPEAKER возится с RESTRAINT)|Д-Давай, открывайся-|(Вы быстро ускользаете) +(The SPEAKER adds the RESTRAINT)|Good luck with that one~|(She sounds like she's gloating...) +(SPEAKER использует RESTRAINT)|Удачи с этой штучкой~|(Звучит так, будто она злорадствует...) +(The SPEAKER roughly forces you down)|(Pushing your head down, the RESTRAINT slides on)|(The SPEAKER tugs your hair, then walks away) +(SPEAKER грубо прижимает вас к земле)|(Опускает вашу голову, и надевает RESTRAINT)|(SPEAKER дергает вас за волосы, а затем уходит) +(Walk over, curiously) +(Подойти и полюбопытствовать) +(Walk over, curiously) +(Подойти и полюбопытствовать) +(Don't approach). +(Не приближаться). +(Don't approach) +(Не приближаться) +Sure! +Конечно! +(Nod eagerly) +(Нетерпеливо кивнуть) +W-What? No way! +Ч-Что? Ни за что! +(Shake your head) +(Покачать головой) +(Let her add the restraint) +(Пусть она наденет ограничитель) +(Moan and nod) +(Простонать и кивнуть) +Stop! (PERCENT chance to avoid) +Стой! (PERCENT шанс на избежание) +(Shake your head and groan) (PERCENT chance to avoid) +(Покачать головой и замычать) (PERCENT шанс на избежание) +(The SPEAKER walks over)|You'd make a cute catgirl~|Want help becoming one? +(SPEAKER подходит к вам)|Из тебя получилась бы милая девушка-кошка~|Хочешь, помогу стать такой? +(The SPEAKER grins)|Here, I've got this RESTRAINT.|That'll help! +(SPEAKER ухмыляется)|Вот, у меня есть этот RESTRAINT.|Это поможет! +(The SPEAKER gleefully comes closer)|(The RESTRAINT fits snugly)|So adorable! +(SPEAKER радостно подходит ближе)|(RESTRAINT плотно облегает ваше тело)|Так очаровательно! +(The SPEAKER nods disappointed)|Fair enough~ +(SPEAKER разочарованно кивает)|Не хочешь, как хочешь~ +(The SPEAKER sighs)|Maybe another time~ +(SPEAKER вздыхает)|Может быть, в другой раз~ +(The SPEAKER titters)|It's going on, kitty~ +(SPEAKER хихикает)|Процесс уже начался, кошечка~ +(The SPEAKER giggles)|Let's see if you can get away then~|(You see a RESTRAINT in her hand) +(SPEAKER смеется)|Давай посмотрим, сможешь ли ты сбежать~|(Вы видите RESTRAINT в ее руке) +(The SPEAKER whimpers and drops it)|Owwww!|I hit my knee! +(SPEAKER хнычет и роняет предмет)|Оууууу!|Я ударилась коленкой! +(The SPEAKER wiggles happily)|Oh, you're so cute!|Enjoy it~ +(SPEAKER радостно извивается)|О, ты такая милая!|Наслаждайся этим~ +(The SPEAKER traps you)|(You feel the RESTRAINT being forced on)|Meow~ +(SPEAKER ловит вас)|(Вы чувствуете, что на вас натягивают RESTRAINT)|Мяу~ +Sure! +Конечно! +(Nod excitedly) +(Взволнованно кивнуть) +No, not today. +Нет, не сегодня. +(Shake your head) +(Покачать головой) +Yay! +Йей! +(Nod quickly) +(Быстро кивнуть) +Not like that! +Только не это! +(Shake your head) +(Покачать головой) +Y-Yes miss~ +Д-да, мисс~ +(Moan and squirm) +(Стонать и ерзать) +(Duck out the way) (PERCENT chance to avoid) +(Уйди с дороги) (PERCENT шанс на избежание) +(Duck out the way) (PERCENT chance to avoid) +(Уйди с дороги) (PERCENT шанс на избежание) +(A SPEAKER winks at you)|You look like a girl who likes feeling|like a prisoner, am I right? +(SPEAKER подмигивает вам)|Ты похожа на девушку, которой нравится чувствовать себя заключенной, я права? +(The SPEAKER nods happily)|I knew it! Well, it's your lucky day.|I've got some RESTRAINT for you~ +(SPEAKER радостно кивает)|Я так и знала! Что ж, сегодня твой счастливый день.|У меня есть для тебя кое-что, RESTRAINT~ +(The SPEAKER spins you around)|(You hear the cold metal click shut)|Nice and submissive~ +(SPEAKER кружится вокруг вас)|(Вы слышите, как холодный металл со щелчком запирается)|Милая и покорная~ +(The SPEAKER shrugs)|It's not for everyone, I guess~ +(SPEAKER пожимает плечами)|Думаю, это не для всех~ +(The SPEAKER frowns)|Really?|I was so sure... +(SPEAKER хмурится)|Правда?|Я была так уверена... +(The SPEAKER grins maliciously)|I like seeing prisoners though~|And you're right here... +(SPEAKER злорадно ухмыляется)|Но мне нравится видеть заключенных~|И ты прямо здесь... +(The SPEAKER giggles)|I'm gonna make you one anyway~|(You see a RESTRAINT in her hand) +(SPEAKER смеется)|Я все равно подарю тебе это~| (Ты видишь, как она сжимает RESTRAINT в руке) +(The SPEAKER gulps)|M-Maybe I won't then! +(SPEAKER сглатывает)|М-Может быть, тогда я этого не сделаю! +(The SPEAKER adds the RESTRAINT)|You're blushing dear~|She doth protest too much? +(SPEAKER использует RESTRAINT)|Ты краснеешь, дорогая~|Она слишком сильно протестует? +(The SPEAKER giggles as she catches you and slaps on the cuffs)|No so fast, dear~ +(SPEAKER хихикает, когда она ловит тебя и надевает наручники)|Не так быстро, дорогая~ +Maybe a bit~ +Может быть, немного~ +(Nod eagerly) +(Нетерпеливо кивнуть) +Not at all. +Нисколько. +(Shake your head) +(Покачать головой) +(Wiggle excitedly) +(Возбужденно ерзать) +(Wiggle excitedly) +(Возбужденно ерзать) +Not like that. +Это не так. +(Shake your head) +(Покачать головой) +O-Okay... +Л-ладно... +(Moan and shiver) +(Стонать и дрожать) +Don't even try. (PERCENT chance to avoid) +Даже не пытайся. (PERCENT шанс на избежание) +(Shake your head and groan) (PERCENT chance to avoid) +(Покачать головой и замычать) (PERCENT шанс на избежание) +(A SPEAKER is looking at something)|So comfy... but how?|Hey, you! Come see this! +(SPEAKER смотрит на что-то)|Так удобно... но как?|Эй, ты! Подойди и посмотри на это! +(The SPEAKER holds up a RESTRAINT)|It's so soft, but so strict~|Want to give it a try? +(SPEAKER держит в руках RESTRAINT)|Так мягко, но так строго~|Хочешь попробовать? +(The SPEAKER quickly fastens it on)|(A wave of comfort passes over you)|(The SPEAKER looks on enviously) +(SPEAKER быстро застегивает ограничитель)|(Вас окатывает волна комфорта)|(SPEAKER смотрит с завистью) +(The SPEAKER shrugs)|Eh, alright then. +(SPEAKER пожимает плечами)|Эх, тогда ладно. +(The SPEAKER shrugs)|Up to you. +(SPEAKER пожимает плечами)|Тебе решать. +(The SPEAKER frowns)|But it's so comfy!|Here, look, I'll show you... +(SPEAKER хмурится)|Но это так удобно!|Вот, смотри, я тебе покажу... +(The SPEAKER approaches)|Hey, see this RESTRAINT?|I'm going to put it on you~ +(SPEAKER подходит)|Эй, видишь этот RESTRAINT?|Я собираюсь надеть его на тебя~ +(The SPEAKER looks startled)|Oh! Uh, I guess you're right... +(SPEAKER выглядит испуганной)|Ой! Э-э, я думаю, ты права... +(The RESTRAINT is buckled firmly in place)|See? Good, huh?|(You sink into the comforting feeling) +(RESTRAINT надежно закрепляется на своём месте)|Видишь? Хорошо, да?|(Вы погружаетесь в успокаивающее чувство) +(The SPEAKER ignores you)|(The RESTRAINT is buckled firmly in place)|(A wave of comfort passes over you) +(SPEAKER игнорирует вас)|(RESTRAINT надежно закрепляется на своём месте)|(Вас окатывает волна комфорта) +(Approach) +(Подойти) +(Approach) +(Подойти) +(Keep your distance) +(Держать дистанцию) +(Keep your distance) +(Держать дистанцию) +Yes please! +Да, пожалуйста! +(Nod happily) +(Радостно кивнуть) +Nope. +Нет. +(Shake your head) +(Покачать головой) +It does look comfortable~ +Действительно, выглядит удобно~ +(Squirm and bow your head) +(Ерзать и склонить голову) +It looks too strict! (PERCENT chance to avoid) +Выглядит слишком строго! (PERCENT шанс на избежание) +(Shake your head rapidly) (PERCENT chance to avoid) +(Быстро замотать головой) (PERCENT шанс на избежание) +(The SPEAKER brushes past hurriedly)|Careful girl!|Else I'll lock you away~ +(SPEAKER торопливо проносится мимо)|Осторожно, девочка!|Иначе я запру тебя~ +(The SPEAKER looks at you intrigued)|Aren't you something...|How about wearing this RESTRAINT? +(SPEAKER смотрит на тебя заинтриговано)|Разве ты не нечто?..|Как насчет того, чтобы надеть этот RESTRAINT? +(The SPEAKER grins and locks it on)|Maybe I should bump into you more~ +(SPEAKER усмехается и запирает ограничитель)|Может быть, мне стоит чаще с тобой сталкиваться~ +(The SPEAKER rolls her eyes)|Run along then girl~ +(SPEAKER закатывает глаза)|Тогда беги, девочка~ +(The SPEAKER nods)|Didn't think so~|Oh, and, uh, sorry for the bump. +(SPEAKER кивает)|Я так не думала~| О, и, э-э, извини за столкновение. +(The SPEAKER shakes her head)|You don't get off that lightly.|These are going on. +(SPEAKER качает головой)|Так легко ты не отделаешься.|Начнём. +(The SPEAKER frowns)|I think I should.|You'll just bother someone else.|(She holds up a RESTRAINT) +(SPEAKER хмурится)|Я думаю, мне следует это сделать.|Ты можешь побеспокоить кого-нибудь другого.|(Она поднимает RESTRAINT) +(The SPEAKER sighs)|I'll let you off then.|Oh, and, uh, sorry for the bump. +(SPEAKER вздыхает)|Тогда я тебя отпущу.| О, и, э-э, извини за столкновение. +(The SPEAKER adds the RESTRAINT)|(As she's locking it, she giggles)|You're really cute actually~ +(SPEAKER применяет RESTRAINT)|(Когда она запирает его, она смеется)|Ты действительно милая~ +(The SPEAKER stumbles and grimaces)|Ugh! Fine, you can go then.|D-Didn't want to see you tied anyway... +(SPEAKER спотыкается и гримасничает)|Тьфу! Отлично, тогда ты можешь идти.|В-Все равно я не хотела увидеть тебя связанной... +That doesn't sound bad... +Звучит не так уж плохо... +(Giggle into your gag) +(Хихикать в свой кляп) +That won't be necessary. +В этом нет необходимости. +(Shake your head) +(Покачать головой) +I'd love to! +Я бы с удовольствием! +(Nod quickly) +(Быстро кивнуть) +Not right now. +Не сейчас. +(Shake your head) +(Покачать головой) +M-Maybe you should then~ +Н-наверно, тебе действительно стоит~ +(Giggle and moan) +(Хихикать и стонать) +You ran into me! (PERCENT chance to avoid) +Это ты столкнулась со мной! (PERCENT шанс на избежание) +(Shake your head and moan) (PERCENT chance to avoid) +(Качать головой и стонать) (PERCENT шанс на избежание) +(A SPEAKER gives you a small curtsy)|Good day.|Care to try part of our uniform? +(SPEAKER делает вам небольшой реверанс)|Хорошего день.|Не хотите примерить часть нашей униформы? +(The SPEAKER looks content)|We can offer you this RESTRAINT.|It's a snug fit... +(SPEAKER выглядит довольной)|Мы можем предложить вам это RESTRAINT.|Она достаточно плотная... +(The SPEAKER buckles it strictly)|All maids wear this at sometime.|You'd fit right in! +(SPEAKER туго застегивает)|Все горничные носят это время от времени.|Вам очень идёт! +(The SPEAKER frowns for a second)|Ah, I see.|As you were then. +(SPEAKER на секунду хмурится)|Ах, я понимаю.|Как пожелаете. +(The SPEAKER nods)|We hope to see you again nonetheless. +(SPEAKER кивает)|Тем не менее, мы надеемся увидеть вас снова. +(The SPEAKER glares)|We urge you to reconsider. +(SPEAKER бросает свирепы взгляд)|Мы настоятельно призываем вас пересмотреть ваше решение. +(The SPEAKER has a twinkle in her eye)|We will offer you this RESTRAINT.|You should accept. +(В глазах SPEAKER виднеются огоньки)|Мы предлагаем вам это RESTRAINT.|Вы должны согласиться. +(The SPEAKER pulls an odd smile)|Very well. +(SPEAKER странно улыбается)|Очень хорошо. +(The SPEAKER smugly nods)|(With surprising speed, the RESTRAINT locks in place)|Excellent, a good fit. +(SPEAKER самодовольно кивает)|(С удивительной скоростью RESTRAINT фиксируется на своём месте)|Отлично, хорошо сидит. +(The SPEAKER covers your mouth with her hand)|Shush, no more bad decisions.|(You feel her buckle the restraint strictly) +(SPEAKER прикрывает вам рот рукой)|Тише, больше никаких плохих решений.|(Вы чувствуете, как она туго затягивает и застегивает ограничитель) +Yes please! +Да, пожалуйста! +(Nod eagerly) +(Нетерпеливо кивнуть) +No, thank you. +Нет, спасибо. +(Shake your head) +(Покачать головой) +I accept~ +Я согласна~ +(Nod again) +(Снова кивнуть) +No, thanks. +Нет, спасибо. +(Shake your head) +(Покачать головой) +I-I accept... +Я с-согласна... +(Moan and nod slowly) +(Застонать и медленно кивнуть) +No way! (PERCENT chance to avoid) +Ни за что! (PERCENT шанс на избежание) +(Shake your head and whimper) (PERCENT chance to avoid) +(Качать головой и хныкать) (PERCENT шанс на избежание) +(The SPEAKER looks at you inquisitively)|(Wordlessly, they motion at your body)|(They seem to be asking about restraints) +(SPEAKER смотрят на вас с любопытством)|(Безмолвно, они двигаются по твоему телу)|(Кажется, они спрашивают об ограничителях) +(The SPEAKER nods understandingly)|(RESTRAINT appears in their hand)|(They tilt their head at you) +(SPEAKER понимающе кивают)|(В их руках появляется RESTRAINT)|(Они наклоняют к вам голову) +(The SPEAKER spins around you)|(You feel the oddly cold restraint lock in place)|(The SPEAKER nods and moves away) +(SPEAKER вращаются вокруг вас)|(Вы чувствуете, как странные холодные оковы фиксируется на вашем теле)|(SPEAKER кивают и уходят) +(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) +(SPEAKER пристально смотрят на вас)|(Они убирают RESTRAINT и уходят) +(The SPEAKER leaves you alone) +(SPEAKER оставляют вас в одиночестве) +(The SPEAKER seems to frown)|(RESTRAINT appears in their hand)|(They rapidly approach) +(SPEAKER кажется, хмурятся)|(В их руках появляется RESTRAINT)|(Они быстро приближаются) +(The SPEAKER tilts their head)|(RESTRAINT appears in their hand)|(They come closer) +(SPEAKER наклоняют головы)|(в их руках появляется RESTRAINT)|(Они подходят ближе) +(The SPEAKER stares at you)|(They put away the RESTRAINT and leave) +(SPEAKER пристально смотрят на вас)|(Они убирают RESTRAINT и уходят) +(The SPEAKER holds you in place)|(You hear the oddly cold material locking)|(They nod at you) +(SPEAKER удерживает вас на месте)|(Вы слышите, как защелкиваются холодные оковы)|(Они кивают вам) +(The SPEAKER firmly grabs you)|(The RESTRAINT locks onto your body tightly)|(The oddly cold material makes you shiver) +(SPEAKER крепко обхватывают вас)|(RESTRAINT плотно прилегает к вашему телу)|(Странно холодный материал заставляет вас дрожать) +Y-Yes? +Д-да? +(Nod back) +(Кивнуть в ответ) +No thank you. +Нет, спасибо. +(Shake your head) +(Покачать головой) +(Smile and prepare yourself) +(Улыбнуться и приготовиться) +(Nod and prepare yourself) +(Кивнуть и приготовиться) +No, not that. +Нет, не надо. +(Shake your head) +(Покачать головой) +W-Whoa! S-Sure... +У-ух! К-конечно... +(Moan and nod) +(Простонать и кивнуть) +Stop! (PERCENT chance to avoid) +Стой! (PERCENT шанс на избежание) +(Shake your head and whine) (PERCENT chance to avoid) +(Качать головой и скулить) (PERCENT шанс на избежание) +(A SPEAKER giggles and calls to you)|Hey there~|Fancy seeing some nature?~ +(SPEAKER хихикает и обращается к вам)|Привет-привет~|Хочешь посмотреть на природу?~ +(The SPEAKER motions with her hands)|(Vines rise from the floor and twirl)|These will bind you nicely... +(SPEAKER жестикулирует)|(Лозы поднимаются с пола и закручиваются вокруг вас)|Они хорошенько тебя свяжут... +(The SPEAKER grins and motions again)|(The plants wrap around you quickly)|(You wriggle against the RESTRAINT) +(SPEAKER улыбается и снова делает жест)|(Растения быстро обвиваются вокруг вас)|(Вы извиваетесь, пытаясь бороться с RESTRAINT) +(The SPEAKER pouts)|Aww... +(SPEAKER надувает губки)|Мфф... +(The SPEAKER frowns)|Not even a little? +(SPEAKER хмурится)|Даже одним глазком? +(The SPEAKER smirks)|That wasn't a question~ +(SPEAKER ухмыляется)|Это был не вопрос~ +(The SPEAKER giggles again)|(Vines begin to move around your feet)|Hold still dear~ +(SPEAKER снова хихикает)|(Лозы начинают обвиваться вокруг ваших ног)|Не двигайся, дорогая~ +(The SPEAKER sighs and nods)|(The vines retreat from you)|Fiiine, you can go~ +(SPEAKER вздыхает и кивает)|(Лозы отступают от вас)|Хорошооо, ты можешь идти~ +(The vines move much faster)|(You feel the RESTRAINT as you squirm)|A gift, from me~ +(Лозы движутся намного быстрее)|(Вы чувствуете RESTRAINT, когда извиваетесь)|Это тебе в подарок от меня~ +(The SPEAKER giggles loudly)|(The vines catch up and pin you down)|(When they let go, you're left with a RESTRAINT) +(SPEAKER громко хихикает)|(Лозы настигают и сжимают вас)|(Когда они вас отпускают, вы остаетесь с RESTRAINT) +Always! +Конечно! +(Nod eagerly) +(Нетерпеливо кивнуть) +Not right now. +Не сейчас. +(Shake your head) +(Покачать головой) +That sounds exciting! +Это звучит захватывающе! +(Nod happily) +(Радостно кивнуть) +Wait, not like this! +Подожди, только не так! +(Shake your head) +(Покачать головой) +W-Well- o-okay... +Хо-хо-хорошо... +(Moan and squirm) +(Стонать и ерзать) +Don't! (PERCENT chance to avoid) +Нет! (PERCENT шанс на избежание) +(Shake your head) (PERCENT chance to avoid) +(Покачать головой) (PERCENT шанс на избежание) +(A SPEAKER approaches)|Nothing quite beats a strong metal|chain, right? +(SPEAKER приближается к вам)|Ничто не сравнится с прочным металлом|цепи, верно? +(The SPEAKER nods happily)|Exactly!|Want one for yourself? +(SPEAKER радостно кивает)|Точно!|Хочешь такое для себя? +(The SPEAKER wraps a long chain around you)|This should do the trick~|(RESTRAINT settles in place) +(SPEAKER обвивает вас длинной цепью)|Это должно тебе понравиться~|(На вас теперь RESTRAINT) +(The SPEAKER sighs)|Ah well. +(SPEAKER вздыхает)|Ну что ж. +(The SPEAKER frowns sadly)|But they make the best noise! +(SPEAKER печально хмурится)|Но они издают самые лучшие звуки! +(The SPEAKER rolls her eyes)|Tough luck then~|You're getting one! +(SPEAKER закатывает глаза)|Тогда тебе не повезло~|Ты всё равно получишь её! +(The SPEAKER grins)|See how you feel when|you're wearing one! +(SPEAKER усмехается)|Посмотрим, что ты почувствуешь, когда|наденешь её! +(The SPEAKER sighs)|Maybe another time then. +(SPEAKER вздыхает)|Тогда, может быть, в другой раз. +(The SPEAKER wraps a long chain around you)|(RESTRAINT hugs your body closely)|(You shiver as the cold metal touches you) +(SPEAKER обвивает вас длинной цепью)|(RESTRAINT тесно облегает ваше тело)|(Вы дрожите, когда холодный металл касается вашей кожи) +(The SPEAKER grins as she binds your body)|(RESTRAINT digs into you a little)|Enjoy, cutie~ +(SPEAKER ухмыляется, когда связывает ваше тело)|(в вас врезается RESTRAINT)|Наслаждайся, милашка~ +I love chains! +Я люблю цепи! +(Nod happily) +(Радостно кивнуть) +Plenty beats it. +Есть много чего и получше +(Shake your head) +(Покачать головой) +Absolutely~ +Абсолютно~ +(Nod again) +(Снова кивнуть) +Not really. +Не очень. +(Shake your head) +(Покачать головой) +I-If I have to... +Я... Если мне придется... +(Moan and squirm) +(Стонать и ерзать) +Ah! Cold! (PERCENT chance to avoid) +Ай! Холодные! (PERCENT шанс на избежание) +(Shake your head and moan) (PERCENT chance to avoid) +(Качать головой и стонать) (PERCENT шанс на избежание) +(The SPEAKER nervously walks up to you)|Excuse me miss...|Are you a fan of latex by chance? +(Нервничающая SPEAKER подходит к вам)|Извините меня, мисс...|Вы случайно не поклонник латекса? +(The SPEAKER blushes deeply)|Then would you like to try on this RESTRAINT? +(SPEAKER сильно краснеет)|Тогда не хотели бы вы примерить это - RESTRAINT? +(The SPEAKER smiles)|You look so good in that! +(SPEAKER улыбается)|Вы так хорошо в этом выглядите! +(The SPEAKER frowns)|Aww... +(SPEAKER хмурится)|Эхх... +(The SPEAKER blushes)|Okay... sorry I asked. +(SPEAKER краснеет)|Ладно... извините, что спросила. +(The SPEAKER grins and reaches for a RESTRAINT)|Well, too bad-- +(SPEAKER ухмыляется и достаёт RESTRAINT)|Что ж, очень жаль-- +(The SPEAKER grins)|I wasn't offering you a choice...|I was asking if you would LIKE it, hehe~ +(SPEAKER усмехается)|Я не давала тебе выбора...|Я спрашивала, НРАВИТСЯ ли тебе это, или нет, хе-хе~ +(The SPEAKER frowns)|...You're fast! +(SPEAKER хмурится)|...Ты быстрая! +(The SPEAKER smiles)|That's right~ +(SPEAKER улыбается)|Это правильно~ +(The SPEAKER restrains you and clicks a lock on)|There! Nice and tight! +(SPEAKER сковывает вас и защелкивает замок)|Вот! Красиво и туго! +Why of course! +Ну конечно! +(Nod happily) +(Радостно кивнуть) +Not really. +Не очень. +(Shake your head) +(Покачать головой) +That sounds fun! +Это звучит забавно! +(Nod again) +(Снова кивнуть) +No, I don't want that! +Нет, я этого не хочу! +(Shake your head) +(Покачать головой) +Okay, fine... +Ладно, хорошо... +(Moan and giggle) +(Стонать и хихикать) +Wait, what? (PERCENT chance to avoid) +Подожди, что? (PERCENT шанс на избежание) +(Shake your head and moan) (PERCENT chance to avoid) +(Качать головой и стонать) (PERCENT шанс на избежание) +(The SPEAKER steps up to you)|Hey girl~|You happen to be a fan of latex? +(SPEAKER подходит к вам)|Привет, девочка~|Ты, случайно, не поклонница латекса? +(The SPEAKER smiles)|Then would you like to try on this RESTRAINT? +(SPEAKER улыбается)|Тогда, может быть, ты хотела бы примерить RESTRAINT? +(The SPEAKER chuckles)|Tight and shiny! +(SPEAKER хихикает)|Облегающее и блестящее! +(The SPEAKER frowns)|Aww... +(SPEAKER хмурится)|Ох... +(The SPEAKER shrugs)|Alright. Sorry I asked. +(SPEAKER пожимает плечами)|Хорошо. Извини за вопрос. +(The SPEAKER grins and reaches for a RESTRAINT)|Well, too bad-- +(SPEAKER ухмыляется и достаёт RESTRAINT)|Что ж, очень жаль-- +(The SPEAKER grins)|I wasn't offering you a choice...|I was asking if you would LIKE it, hehe~ +(SPEAKER усмехается)|Я не давала тебе выбора...|Я спрашивала, НРАВИТСЯ ли тебе это, или нет, хе-хе~ +(The SPEAKER frowns)|...You're fast! +(SPEAKER хмурится)|...Ты быстрая! +(The SPEAKER smiles)|That's right~ +(SPEAKER улыбается)|Это правильно~ +(The SPEAKER restrains you and clicks a lock on)|There! Nice and tight! +(SPEAKER сковывает вас и защелкивает замок)|Вот! Красиво и туго! +Why of course! +Ну конечно! +(Nod happily) +(Радостно кивнуть) +Not really. +Не очень. +(Shake your head) +(Покачать головой) +That sounds fun! +Это звучит забавно! +(Nod again) +(Снова кивнуть) +No, I don't want that! +Нет, я этого не хочу! +(Shake your head) +(Покачать головой) +Okay, fine... +Ладно, хорошо... +(Moan and giggle) +(Стонать и хихикать) +Wait, what? (PERCENT chance to avoid) +Подожди, что? (PERCENT шанс на избежание) +(Shake your head and moan) (PERCENT chance to avoid) +(Качать головой и стонать) (PERCENT шанс на избежание) +(The SPEAKER walks up to you)|Say, would you be interested in some 'protection?' +(SPEAKER подходит к вам)|Скажи, тебя заинтересовала бы кое-какая 'защита'? +(The SPEAKER grins)|Wonderful! You see, I've just recently acquired one of these...|(She shows you a loose RESTRAINT)|I'm not too interested in wearing one myself,|but I thought you'd be a good fit for it? +(SPEAKER улыбается)|Замечательно! Видишь ли, я совсем недавно приобрела один...|(Она демонстрирует вам ослабленный RESTRAINT)|Я не слишком заинтересована в том, чтобы носить его самой,|но я подумала, что он подойдет тебе? +(The SPEAKER blushes as she locks the belt around your waist)|I'm enjoying this more than I thought I would~ +(SPEAKER краснеет, застегивая ремень на вашей талии)|Мне это понравилось больше, чем я думала~ +(The SPEAKER smiles)|Enjoy your freedom while it lasts~ +(SPEAKER улыбается)|Наслаждайтесь своей свободой, пока она есть~ +(The SPEAKER shrugs)|That's okay, just thought I'd ask. +(SPEAKER пожимает плечами)|Ничего страшного, я просто решила спросить. +(The SPEAKER rubs the smooth metal seductively)|Are you sure?|Adventurers need to take care of themselves.|You don't want to lose control of yourself and run into some curse,|do you? +(SPEAKER соблазнительно поглаживает гладкий металл)|Ты уверена?|Искатели приключений должны сами о себе заботиться.|Ты же не хочешь потерять контроль над собой и нарваться на какое-нибудь проклятие, не так ли? +(The SPEAKER gives an evil smile)|What if I wasn't asking? +(SPEAKER злобно улыбается)|А что, если я не спрашивала? +(The SPEAKER sighs)|I'll find some other cutie to wear it, I guess~ +(SPEAKER вздыхает)|Я, наверное, найду какую-нибудь другую красотку, которая наденет его~ +(The SPEAKER blushes as she locks the RESTRAINT onto you)|There we go~ +(SPEAKER краснеет, застегивая на вас RESTRAINT)|Вот и все~ +(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|Whoops! I guess I acted too soon.|Ah well~ +(Когда вы оборачиваетесь, SPEAKER удивляет вас)|(Вы слышите щелчок у себя на поясе)|Упс! Кажется, я поторопилась.|Ну ладно~ +(The lock on the RESTRAINT starts glowing...) +(Замок на RESTRAINT начинает светиться...) +Protection? Certainly! +Защита? Конечно! +(Nod eagerly) +(Энергично кивать) +Nah, I'm good. +Нет, мне и так хорошо. +(Shake your head) +(Покачать головой) +I would love to wear it! +Я бы с удовольствием надела его! +(Nod again, excited) +(Снова кивнуть, взволнованно) +...No thank you. +...Нет, спасибо. +(Shake your head, puzzled) +(Покачать головой, озадаченно) +Fine. I need the protection anyway. +Хорошо. В любом случае, мне нужна защита. +(Moan and nod slowly) +(Застонать и медленно кивнуть) +I refuse. (PERCENT chance to avoid) +Я отказываюсь. (PERCENT шанс на избежание) +(Shake your head) (PERCENT chance to avoid) +(Покачать головой) (PERCENT шанс на избежание) +(Look at your belt...) +(Посмотреть на свой пояс...) +(The SPEAKER nervously walks up to you)|Excuse me miss...|Can you help me out? +(SPEAKER нервничая подходит к вам)|Извините, мисс...|Не могли бы вы мне помочь? +(The SPEAKER blushes deeply)|I found this cursed RESTRAINT and I can't let go of it!|Could you... wear it for me? +(SPEAKER сильно краснеет)|Я нашла это проклятое RESTRAINT и не могу от него избавиться!|Не могли бы вы... надеть это ради меня? +(The SPEAKER smiles)|Thank you so much, miss! +(SPEAKER улыбается)|Большое вам спасибо, мисс! +(The SPEAKER frowns)|...That does seem rather far-fetched of me to ask. +(SPEAKER хмурится)|...Кажется, да, это был немного некорректный вопрос. +(The SPEAKER blushes)|Oh... okay. +(SPEAKER краснеет)|О... хорошо. +(The SPEAKER frowns angrily)|Look, we all know how much you enjoy being restrained~|Do me a favor and wear the RESTRAINT, okay? +(SPEAKER сердито хмурится)|Послушай, мы все знаем, как тебе нравится быть скованной~|Сделай одолжение, надень RESTRAINT, хорошо? +(The SPEAKER pleads with you)|...point taken. But still!|I'll end up stuck in it for a really long time... +(SPEAKER умоляет вас)|...аргумент принят. Но все же!|В конечном итоге я застряну в этом на очень долгое время... +(The SPEAKER sighs and wears it herself)|(The lock starts glowing brightly...) +(SPEAKER вздыхает и надевает его сама)|(Замок начинает ярко светиться...) +(The SPEAKER looks relieved)|Thank you so much miss!|I won't forget you! +(SPEAKER выглядит успокоенной)|Большое тебе спасибо!|Я тебя не забуду! +(As you turn around, the SPEAKER surprises you)|(You hear a click around your waist)|I'm sorry miss! It was my only choice~ +(Когда вы оборачиваетесь, SPEAKER преподносит вам сюрприз)|(вы слышите щелчок у себя за поясом)|Простите, мисс! Это был мой единственный выход~ +(The lock on the RESTRAINT starts glowing...) +(Замок на RESTRAINT начинает светиться...) +I would love to help! +Я бы с удовольствием помогла! +(Nod eagerly) +(Нетерпеливо кивнуть) +You're asking me to get cursed? +Ты просишь меня принять проклятие? +(Shake your head) +(Покачать головой) +That sounds like a tempting offer. +Это звучит как заманчивое предложение. +(Nod again, excited) +(Взволнованный кивок) +...What? Why would I need to wear it? +...Что? Зачем мне его надевать? +(Shake your head, puzzled) +(Озадаченно покачать головой) +Fine. I'll do it because you asked. +Хорошо. Раз ты так просишь, я сделаю это. +(Moan and nod slowly) +(Застонать и медленно кивнуть) +I won't help you. Wear it yourself. (PERCENT chance to avoid) +Я не стану тебе помогать. Надень его сама. (PERCENT шанс на избежание) +(Shake your head) (PERCENT chance to avoid) +(Покачать головой) (PERCENT шанс на избежание) +(Look at your belt...) +(Посмотреть на свой пояс...) +(The SPEAKER walks up to you)|We don't get a lot of visitors.|I take it that you enjoy bondage? +(К вам подходит SPEAKER)|У нас не так много посетителей.|Я так понимаю, тебе нравится бондаж? +(The SPEAKER tilts her head)|Well, I have a RESTRAINT lying around,|and I figured you'd enjoy it. +(SPEAKER наклоняет голову)|Ну, у меня тут где-то валяется RESTRAINT,|так что я думаю, что тебе это понравится. +(The SPEAKER smiles)|I'm glad you like it! +(SPEAKER улыбается)|Я рада, что тебе это нравится! +(The SPEAKER frowns)|I guess I'll have to find someone else to wear it. +(SPEAKER хмурится)|Думаю, мне придется найти кого-нибудь другого, кто наденет это. +(The SPEAKER looks disappointed)|Oh well. +(SPEAKER выглядит разочарованной)|Ну ладно. +(The SPEAKER grins and reaches toward you!)|Well, I think it'd look great on you! +(SPEAKER улыбается и тянется к вам!)|Ну, я думаю, на тебе это смотрелось бы великолепно! +(The SPEAKER grins)|You don't have a choice, dear~ +(SPEAKER усмехается)|У тебя нет выбора, дорогая~ +(The SPEAKER frowns)|Darn it! Missed my chance. +(SPEAKER хмурится)|Вот блин! Упустила свой шанс. +(The SPEAKER smiles)|Good, good~ +(SPEAKER улыбается)|Хорошо, хорошо~ +(The SPEAKER restrains you and clicks a lock on)|There! Nice and tight! +(SPEAKER сковывает вас и защелкивает замок)|Вот! Красиво и туго! +Why of course! +Ну конечно! +(Nod happily) +(Радостно кивнуть) +Not really. +Не очень. +(Shake your head) +(Покачать головой) +That sounds fun! +Это звучит забавно! +(Nod again) +(Снова кивнуть) +No, I don't want that! +Нет, я этого не хочу! +(Shake your head) +(Покачать головой) +Okay, fine... +Ладно, хорошо... +(Moan and giggle) +(Стонать и хихикать) +Wait, what? (PERCENT chance to avoid) +Подожди, что? (PERCENT шанс на избежание) +(Shake your head and moan) (PERCENT chance to avoid) +(Качать головой и стонать) (PERCENT шанс на избежание) +(The SPEAKER grins as she sees you)|Hey there sweetie~|I think you'd look good in some ropes! +(SPEAKER улыбается, когда видит вам)|Привет, милая~|Я думаю, ты бы хорошо смотрелась в каких-нибудь веревках! +(The SPEAKER looks at your bound body)|I've got some more ropes for you, babe! +(SPEAKER смотрит на ваше связанное тело)|У меня есть еще несколько веревок для тебя, детка! +(The SPEAKER smiles)|Okay, hold still while I get you rigged up~ +(SPEAKER улыбается)|Ладно, стой смирно, пока я тебя связываю~ +(The SPEAKER slaps your butt as she ties the last knot)|All trussed up~ +(SPEAKER шлепает вас по заднице, завязывая последний узел)|Теперь ты вся в веревках~ +(The SPEAKER looks disappointed and packs her rope away) +(SPEAKER выглядит разочарованной и убирает свои веревки) +(The SPEAKER frowns)|Aw. What a missed opportunity! +(SPEAKER хмурится)|Ай. Какая упущенная возможность! +(The SPEAKER grins and reaches for her satchel)|Well, too bad-- +(SPEAKER усмехается и тянется за своей сумкой)|Что ж, очень жаль-- +(The SPEAKER grins)|But I've already brought so much rope with me~ +(SPEAKER усмехается)|Но я уже захватила с собой много верёвок~ +(The SPEAKER frowns)|Suit yourself. +(SPEAKER хмурится)|По твоему усмотрению. +(The SPEAKER smiles)|Good girl~ +(SPEAKER улыбается)|Хорошая девочка~ +(The SPEAKER takes you down and trusses you up tightly)|That'll teach you~ +(SPEAKER сбивает вас с ног и крепко связывает)|Это урок для тебя~ +I think so too! +Я тоже так думаю! +(Nod excitedly) +(Взволнованно кивнуть) +I don't think so. +Я так не думаю. +(Shake your head) +(Покачать головой) +Yes miss! +Да, мисс! +(Wiggle in place happily) +(Радостно покачиваться) +Actually, I'm having second thoughts... +На самом деле, я передумала... +(Shake your head nervously) +(Нервно покачать головой) +Fine. You win. +Отлично. Ты победила. +(Moan and giggle) +(Стонать и хихикать) +Go away! (PERCENT chance to avoid) +Отвали! (PERCENT шанс на избежание) +(Shake your head and moan) (PERCENT chance to avoid) +(Качать головой и стонать) (PERCENT шанс на избежание) +(The SPEAKER perks her ears as she sees you)|You've got a nice body.|I think it'll do better with some training! +(SPEAKER навостряет уши, когда видит вас)|У тебя красивое тело.|Я думаю, что с некоторой тренировкой оно станет еще лучше! +(The SPEAKER grins and hands you a paper)|Nevermere Training is always looking for new recruits!|I'll just have you sign here... +(SPEAKER улыбается и протягивает вам бумагу)|Тренировки Невермера - это всегда поиск новых рекрутов!|Я просто попрошу тебя расписаться здесь... +(The SPEAKER gets you suited up)|There you go! Now go be a good girl! +(SPEAKER одевает вас в костюм)|Вот так! А теперь иди и будь хорошей девочкой! +(The SPEAKER scoffs)|That's what they all say. +(SPEAKER усмехается)|То, что они все говорят. +(The SPEAKER frowns)|What a shame. +(SPEAKER хмурится)|Какое упущение. +(The SPEAKER grins and reaches for her baton)|No? Well, I heard you have some debts to pay~ +(SPEAKER усмехается и тянется за своей дубинкой)|Нет? Что ж, я слышала, тебе нужно оплатить кое-какие долги~ +(The SPEAKER grins)|I promise you it's a good deal~ +(SPEAKER усмехается)|Я обещаю тебе, что это выгодная сделка~ +(The SPEAKER frowns)|Fine. I'll look for other candidates. +(SPEAKER хмурится)|Хорошо. Я поищу других кандидатов. +(The SPEAKER smiles)|That's right. Your name, please? +(SPEAKER улыбается)|Отлично. Твоё имя, пожалуйста? +(The SPEAKER zaps you and places you in restrictive gear)|Hmph. Unruly girls need training! +(SPEAKER оглушает вас и надевает на вас ограничители)|Хм. Непослушным девочкам нужна тренировка! +This sounds like an interesting opportunity. +Это звучит как интересная возможность. +(Nod excitedly) +(Взволнованно кивнуть) +No thanks, I know what that entails... +Нет, спасибо, я знаю, что это повлечет за собой... +(Shake your head) +(Покачать головой) +I'll sign it! +Я подпишу! +(Accept the contract) +(Принять контракт) +A contract? No way. +Контракт? Ни за что. +(Refuse the contract) +(Отказаться от контракта) +Fine. I'll sign it... +Хорошо... Я подпишу. +(Moan and nod) +(Простонать и кивнуть) +Never! (PERCENT chance to avoid) +Никогда! (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... +(SPEAKER отвешивает короткий поклон, когда видит вас)|Приветствую.|Похоже, ты обладаешь качествами, которые мы можем использовать.|Я была бы рада предложить тебе работу... +(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... +(SPEAKER коротко улыбается, прежде чем прочистить горло)|Фантастика!|У меня как раз есть форма для тебя, прямо вот здесь... +(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. +(SPEAKER одевает вас, очень туго затягивая шнуровку...)|(Вы слышите щелчок нескольких замков...)|Замечательно. Твоя первая задача - навести порядок на этом этаже.|Удачи. +(The SPEAKER tilts her head and shrugs)|We are always prepared... +(SPEAKER наклоняет голову и пожимает плечами)|Мы всегда готовы... +(The SPEAKER nods)|Fair enough. +(SPEAKER кивает)|Хорошо. +(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... +(SPEAKER ухмыляется и достает откровенное платье)|Могу я напомнить тебе, что ты нажила немало... врагов?|Было бы обидно, если бы ты столкнулась с одним из них... +(The SPEAKER nods proudly)|We are willing to made some changes to our records~ +(SPEAKER гордо кивает)|Мы готовы внести некоторые изменения в наши записи ~ +(The SPEAKER frowns)|You won't know what hit you. +(SPEAKER хмурится)|Ты не поймешь, что тебя поразило. +(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. +(SPEAKER улыбается)|Я рада, что ты приняла правильное решение.|Теперь твоей первой задачей будет навести порядок на этом этаже.|Удачи. +(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... +(SPEAKER внезапно начинает двигаться быстрее, чем вы успеваете среагировать)|(Вы чувствуете, как нога давит вам на спину, и вас прижимают к земле)|(Она надевает на вас форму и туго затягивает ее...)|Я полагаю, тебе потребуется дополнительная тренировка... +This sounds like an interesting opportunity. +Это звучит как интересная возможность. +(Nod excitedly) +(Взволнованно кивнуть) +No thanks, I know what that entails... +Нет, спасибо, я знаю, что это повлечет за собой... +(Shake your head) +(Покачать головой) +Gladly! +С радостью! +(Accept the contract) +(Принять контракт) +W-where did you get that uniform? (Refuse) +Г-где ты взяла эту униформу? (Отказаться) +(Refuse the contract) +(Отказаться от контракта) +Fine. I'll sign it... +Хорошо... Я подпишу. +(Moan and nod) +(Простонать и кивнуть) +Never! (PERCENT chance to avoid) +Никогда! (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... +(SPEAKER отвешивает короткий поклон, когда видит вас)|Приветствую.|Похоже, ты обладаешь качествами, которые мы можем использовать.|Я была бы рада предложить тебе работу... +(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... +(SPEAKER коротко улыбается, прежде чем прочистить горло)|Фантастика!|У меня как раз есть форма для тебя, прямо вот здесь... +(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. +(SPEAKER одевает вас, очень туго затягивая шнуровку...)|(Вы слышите щелчок нескольких замков...)|Замечательно. Твоя первая задача - навести порядок на этом этаже.|Удачи. +(The SPEAKER tilts her head and shrugs)|We are always prepared... +(SPEAKER наклоняет голову и пожимает плечами)|Мы всегда готовы... +(The SPEAKER nods)|Fair enough. +(SPEAKER кивает)|Хорошо. +(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... +(SPEAKER ухмыляется и достает откровенное платье)|Могу я напомнить тебе, что ты нажила немало... врагов?|Было бы обидно, если бы ты столкнулась с одним из них... +(The SPEAKER nods proudly)|We are willing to made some changes to our records~ +(SPEAKER гордо кивает)|Мы готовы внести некоторые изменения в наши записи ~ +(The SPEAKER frowns)|You won't know what hit you. +(SPEAKER хмурится)|Ты не поймешь, что тебя поразило. +(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. +(SPEAKER улыбается)|Я рада, что ты приняла правильное решение.|Теперь твоей первой задачей будет навести порядок на этом этаже.|Удачи. +(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... +(SPEAKER внезапно начинает двигаться быстрее, чем вы успеваете среагировать)|(Вы чувствуете, как нога давит вам на спину, и вас прижимают к земле)|(Она надевает на вас форму и туго затягивает ее...)|Я полагаю, тебе потребуется дополнительная тренировка... +This sounds like an interesting opportunity. +Это звучит как интересная возможность. +(Nod excitedly) +(Взволнованно кивнуть) +No thanks, I know what that entails... +Нет, спасибо, я знаю, что это повлечет за собой... +(Shake your head) +(Покачать головой) +Gladly! +С радостью! +(Accept the contract) +(Принять контракт) +W-where did you get that uniform? (Refuse) +Г-где ты взяла эту униформу? (Отказаться) +(Refuse the contract) +(Отказаться от контракта) +Fine. I'll sign it... +Хорошо... Я подпишу. +(Moan and nod) +(Простонать и кивнуть) +Never! (PERCENT chance to avoid) +Никогда! (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER perks her ears as she sees you)|Glory to the blessed kitty!|Are you prepared to join us? +(SPEAKER навостряет уши, когда видит вас)|Слава благословенной кошке!|Готова ли ты присоединиться к нам? +(The SPEAKER nods happily)|Fantastic! You just need to agree to be nice to cats.|And also we own you now. +(SPEAKER радостно кивает)|Фантастика! Тебе просто нужно согласиться быть милой с кошками.|А еще теперь ты принадлежишь нам. +(The SPEAKER jumps happily)|Wonderful! Here's your collar! +(SPEAKER радостно прыгает)|Замечательно! Вот твой ошейник! +(The SPEAKER whimpers and looks at you)|How mean! +(SPEAKER хнычет и смотрит на вас)|Как подло! +(The SPEAKER's ears flop)|Aww... we thought you were cute. +(SPEAKER дергает ушами)|У-у-у... мы думали, ты милая. +(The SPEAKER frowns)|Oh? Well, I guess I'll tell the others~ +(SPEAKER хмурится)|О? Что ж, думаю, я расскажу об этом остальным~ +(The SPEAKER grins slyly)|You wouldn't hurt the kitties, would you? +(SPEAKER лукаво улыбается)|Ты же не причинишь вреда кошечкам, правда? +(The SPEAKER frowns)|Then we'll have to make sure you don't come to harm anyone! +(SPEAKER хмурится)|Тогда мы должны будем убедиться, что ты никому не причинишь вреда! +(The SPEAKER smiles proudly)|I knew you would pull through! +(SPEAKER гордо улыбается)|Я знала, что ты преодолеешь! +(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... +(SPEAKER внезапно начинает двигаться быстрее, чем вы успеваете среагировать)|(Вы чувствуете, как нога давит вам на спину, и вас прижимают к земле)|(Она надевает на вас форму и туго затягивает ее...)|Я полагаю, тебе потребуется дополнительная тренировка... +Yes! I love the blessed kity! +Да! Я люблю этот благословенную кошку! +(Nod excitedly) +(Взволнованно кивнуть) +No, you guys are a bunch of weirdos. +Нет, ребята, вы просто сборище чудаков. +(Shake your head) +(Покачать головой) +Yes! I will be nice to the kitties! +Да! Я буду милой с кошечками! +(Join them) +(Присоединиться к ним) +Wait, I didn't agree to that! (Refuse) +Подождите, я на это не соглашалась! (Отказаться) +(Refuse) +(Отказаться) +Okay fine... I won't hurt the kitties. (Join them) +Ладно, ладно... Я не причиню вреда кошечкам. (Присоединиться к ним) +(Moan and nod) +(Простонать и кивнуть) +Never! (PERCENT chance to avoid) +Никогда! (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER does a curtsy)|Why hello there!|You have a wonderful bod-er, book!|Would you like to help me? +(SPEAKER делает реверанс)|Здравствуйте!|У вас замечательное тело, дорогуша!|Не хотели бы вы мне помочь? +(The SPEAKER smiles briefly)|You have an opportunity to model for me!|I need someone to wear all of my wonderful inventions! +(SPEAKER коротко улыбается)|У вас есть возможность попозировать для меня!|Мне нужен кто-то, кто носил бы все мои замечательные изобретения! +(The SPEAKER laces you up in the tight fabric...)|(You hear the click of a few locks going on...)|Oh my goodness... So pretty!|You'll make a fine assistant! +(SPEAKER зашнуровывает вас в обтягивающий материал...)|(Вы слышите щелчок нескольких замков...)|О богини... Такая хорошенькая!|Из тебя получится прекрасный помощник! +(The SPEAKER frowns)|Aw... +(SPEAKER хмурится)|Эх... +(The SPEAKER clenches her fist to the ceiling)|Nooooo!!! +(SPEAKER поднимает кулак к потолку)|Нееееет!!! +(The SPEAKER grins and pulls out a frilly dress)|Don't knock it till you try it!|Trust me, it'll be fun! +(SPEAKER улыбается и достает красивое платье)|Не отказывайся от него, пока не попробуешь!|Поверь мне, это будет весело! +(The SPEAKER furrows her brow)|Watch your tongue there, little lady.|Or I'll have to plug it for you... +(SPEAKER морщит лоб)|Следи за своим языком, маленькая леди.|Или мне придется почистить его... +(The SPEAKER folds her arms as ribbons rise up around her)|Suit yourself, hehe~ +(SPEAKER сгибает руки, и ленты поднимаются вокруг нее)|Поступай как знаешь, хе-хе~ +(The SPEAKER smiles)|Yes! Yes! Wonderful! +(SPEAKER улыбается)|Да! Да! Замечательно! +(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... +(SPEAKER внезапно начинает двигаться быстрее, чем вы успеваете среагировать)|(Вы чувствуете, как нога давит вам на спину, и вас прижимают к земле)|(Она надевает на вас форму и туго затягивает ее...)|Я полагаю, тебе потребуется дополнительная тренировка... +Sure! +Конечно! +(Nod excitedly) +(Взволнованно кивнуть) +Nope. +Нет. +(Shake your head) +(Покачать головой) +Sign me up! +Я согласна! +(Accept the position) +(Принять позу) +And wear tacky clothes all the time? +И все время носить эту вульгарную одежду? +(Refuse the position) +(Отказаться от позирования) +Fine... sign me up. +Ладно... я согласна. +(Moan and nod) +(Простонать и кивнуть) +Why don't you try it on yourself! (PERCENT chance to avoid) +Почему бы тебе не опробовать это на себе! (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER runs up to you)|Wow! You make a fine specimen-er, I mean...|Nice to meet you! +(SPEAKER подбегает к вам)|Ух ты! Ты прекрасный образец... э-э, я имею в виду...|Рада с тобой познакомиться! +(The SPEAKER smiles)|Now, I have something wonderful in store for you.|(She takes out a blue catsuit)|I'd like you to be my assistant! +(SPEAKER улыбается)|А теперь... у меня припасено для тебя кое-что замечательное.|(Она достает синий комбинезон)|Я бы хотела, чтобы ты стала моей помощницей! +(The SPEAKER looks excited)|Awesome! Let me help you get in uniform... +(SPEAKER выглядит взволнованной)|Потрясающе! Позволь мне помочь тебе надеть форму... +(The SPEAKER shrugs)|It was worth a shot... +(SPEAKER пожимает плечами)|Стоило попробовать.... +(The SPEAKER shrugs)|It was worth a shot... +(SPEAKER пожимает плечами)|Стоило попробовать.... +(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|There's just... a lot to do.|That's why I need an assistant. +(SPEAKER выглядит расстроенной)|Я не... моя работа не безумная!|Просто... нужно многое сделать.|Вот почему мне нужен помощник. +(The SPEAKER looks frustrated)|I'm not... my work is not crazy!|We seek only knowledge! +(SPEAKER выглядит расстроенной)|Я не... моя работа не безумная!|Мы стремимся только к знаниям! +(The SPEAKER frowns)|Time for a test run! +(SPEAKER хмурится)|Время для тестового запуска! +(The SPEAKER looks happy again)|Thank you! I'm super grateful! +(SPEAKER снова выглядит счастливой)|Спасибо! Я очень благодарна! +(The SPEAKER tilts her head)|Fine then. You win.|(As you leave, you hear a 'just kidding' as she breaks a glass vial)|(A suit of blue latex envelops you!) +(SPEAKER наклоняет голову)|Тогда ладно. Ты победила.|(Когда вы уходите, вы слышите 'шучу', и она разбивает стеклянный флакон)|(Вас окутывает костюм из синего латекса!) +...Hello? +...Привет? +(Nod excitedly) +(Взволнованно кивнуть) +You guys are crazy. +Да вы безумцы! +(Shake your head) +(Покачать головой) +Gladly! +С радостью! +(Accept the offer) +(Принять предложение) +W-where did you get that uniform? (Refuse) +Г-где ты взяла эту униформу? (Отказаться) +(Refuse the offer) +(Отказаться от предложения) +Fine. I'll be your assistant. +Отлично. Я буду твоим помощником. +(Moan and nod) +(Простонать и кивнуть) +Go find someone else. (PERCENT chance to avoid) +Иди и найди кого-нибудь другого. (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER greets you)|Normally we don't meddle in mortal affairs.|But you, Outsider, are different.|Let's have a conversation. +(SPEAKER приветствует вас)|Обычно мы не вмешиваемся в дела смертных.|Но ты, чужачка, другое.|Давай поговорим. +(The SPEAKER smiles warmly)|Outsiders have a lower rank in our society.|But it is a rank all the same.|You will be above your mortal peers.|What do you say? +(SPEAKER тепло улыбается)|Чужаки занимают более низкое положение в нашем обществе.|Но все равно это звание.|Ты будешь выше своих смертных соратников.|Что ты скажешь? +(The SPEAKER clasps some 'jewelry' around your limbs)|You look beautiful, my dear.|I will leave you to your own affairs until we meet again. +(SPEAKER застегивает 'украшения' вокруг ваших конечностей)|Ты прекрасно выглядишь, моя дорогая.|Я оставлю тебя наедине с твоими делами, пока мы не встретимся снова. +(The SPEAKER turns her head away)|Hmph. I offer you a bargain and you refuse. +(SPEAKER отворачивает голову)|Хм. Я предлагаю тебе выгодную сделку, а ты отказываешься. +(The SPEAKER turns her head away)|Hmph. As expected. +(SPEAKER отворачивает голову)|Хм. Как и ожидалось. +(The SPEAKER folds her arms)|If you are not with us, then you are against us.|You shall face the wrath of the wild. +(SPEAKER складывает руки на груди)|Если ты не с нами, значит, ты против нас.|Ты столкнешься лицом к лицу с гневом дикой природы. +(The SPEAKER frowns)|Hardly slavery!|A mere slave would not be allowed to even set foot in our society. +(SPEAKER хмурится)|Какое это рабство!|Простой рабыне не позволили бы даже ступить ногой в наше общество. +(The SPEAKER frowns)|We will meet again. +(SPEAKER хмурится)|Мы еще встретимся. +(The SPEAKER nods and smiles)|(She decorates your body with 'jewelry')|I am glad you had a change of heart. +(SPEAKER кивает и улыбается)|(Она надевает 'украшения' на ваше тело)|Я рада, что ты передумала. +(The SPEAKER scoffs)|(Her magic suddenly binds you tightly in glowing ropes)|Amateur. +(SPEAKER усмехается)|(Её магия внезапно крепко связывает вас светящимися веревками)|Самонадеянная. +I'm interested. (Talk with her) +Ты меня заинтересовала. (Поговорить с ней) +(Nod excitedly) +(Взволнованно кивнуть) +No thanks. +Нет, спасибо. +(Shake your head) +(Покачать головой) +I accept your gracious offer! +Я принимаю твоё любезное предложение! +(Accept) +(Согласиться) +I won't be a slave to you. +Я не буду твоей рабыней. +(Refuse) +(Отказаться) +Fine, fine... I will accept. +Ладно, ладно... Я согласна. +(Moan and nod) +(Простонать и кивнуть) +No way. (PERCENT chance to avoid) +Ни за что. (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER smiles at you)|Mortal. +(SPEAKER улыбается вам)|Смертная. +(The SPEAKER points to the ground)|Kneel before me and accept your collar. +(SPEAKER указывает на землю)|Встань на колени передо мной и прими свой ошейник. +(The SPEAKER snaps her fingers)|(A collar of cold black metal materializes around your neck)|A girl who knows her place! Wonderful... +(SPEAKER щелкает пальцами)|(На вашей шее материализуется ошейник из холодного черного металла)|Девушка, которая знает свое место! Замечательно... +(The SPEAKER scoffs)|Hmmph. Mortals... +(SPEAKER усмехается)|Хммф. Смертные... +(The SPEAKER scoffs)|Hmmph. Mortals... +(SPEAKER усмехается)|Хммф. Смертные... +(The SPEAKER folds her arms)|Well, look who doesn't know her place~ +(SPEAKER складывает руки на груди)|Что ж, похоже, кто-то не знает своего места~ +(The SPEAKER folds her arms)|I didn't offer you a choice in the matter.|You're mine, I've decided that. +(SPEAKER складывает руки на груди)|Я не предлагала тебе выбора в этом вопросе.|Ты моя, я так решила. +(The SPEAKER's eyes begin to glow)|Looks like we'll do this the fun way! +(Глаза SPEAKER начинают светиться)|Похоже, мы пойдем по наиболее веселому маршруту! +(The SPEAKER smiles)|Wonderful~|Now come along, my pet! +(SPEAKER улыбается)|Замечательно~|А теперь пойдем, мой питомец! +(The SPEAKER scoffs and snaps her fingers)|(Metallic restraints come at you from all angles and snap in place tightly)|(A gag forces itself into your mouth)|Now then, what were we saying? +(SPEAKER усмехается и щелкает пальцами)|(Металлические наручники надвигаются на вас со всех сторон и накрепко защелкиваются)|(Кляп сам запихивается вам в рот)|Итак, о чем мы говорили? +Yes? +Да? +(Nod excitedly) +(Взволнованно кивнуть) +I don't talk to monsters! +Я не разговариваю с монстрами! +(Shake your head) +(Покачать головой) +O-okay. (Kneel) +Х-х-хорошо. (Преклонить колени) +(Kneel) +(Преклонить колени) +I refuse! +Я отказываюсь! +(Refuse) +(Отказаться) +Then it looks like I have no choice. (Join her) +Тогда, похоже, у меня нет выбора. (Присоединиться к ней) +(Moan and nod) +(Простонать и кивнуть) +I will never bow to you! (PERCENT chance to avoid) +Я никогда не склонюсь перед тобой! (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER waves)|You seem like an exceptional individual.|What do you think of joining the Guild? +(SPEAKER машет рукой)|Ты кажешься исключительной личностью.|Что ты думаещь о вступлении в Гильдию? +(The SPEAKER smiles)|Excellent! I'll put in a word with the Guild.|Do note: this will affect your reputation with certain bad actors. +(SPEAKER улыбается)|Отлично! Я замолвлю словечко перед Гильдией.|Обрати внимание: это повлияет на твою репутацию среди некоторых плохих ребят. +(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. +(SPEAKER достает волшебный свиток и подписывает его)|(Свиток исчезает в эфире)|Удачи тебе, наемница. +(The SPEAKER nods)|Fair enough. Guild work is not for everyone. +(SPEAKER кивает)|Окей. Работа в гильдии не для всех. +(The SPEAKER nods)|Very well, then I won't bother you. +(SPEAKER кивает)|Хорошо, тогда я не буду тебя беспокоить. +(The SPEAKER looks dubious)|You know, there's quite a bounty on your head.|I'm sure we could do something about it. +(SPEAKER смотрит с сомнением)|Знаешь, за твою голову назначена неплохая награда.|Я уверена, мы могли бы что-нибудь с этим сделать. +(The SPEAKER tilts her head)|Haha, very funny.|We both know that you're not one of those... right? +(SPEAKER наклоняет голову)|Ха-ха, очень смешно.|Мы оба знаем, что ты не одна из этих... верно? +(The SPEAKER frowns and readies for battle)|My instincts were right. +(SPEAKER хмурится и готовится к бою)|Мои инстинкты говорили правду. +(The SPEAKER takes out a magic scroll and signs it)|(The scroll vanishes into the aether)|Good luck out there, freelancer. +(SPEAKER достает волшебный свиток и подписывает его)|(Свиток исчезает в эфире)|Удачи тебе, наемница. +(The SPEAKER suddenly strikes you to the floor)|(You feel a foot on your back as she ties you in a strict rope hogtie...)|(She dusts off her hands)|We'll have a talk when you get out of that, okay? +(SPEAKER внезапно опрокидывает вас на пол)|(Вы чувствуете чью-то ногу на своей спине, и что вас связываю тугой веревочной кабаньей вязью...)|(Она отряхивает руки)|Мы поговорим, когда ты выберешься из этого, хорошо? +This sounds like an interesting opportunity. +Это звучит как интересная возможность. +(Nod excitedly) +(Взволнованно кивнуть) +I have no interest in joining the guild. +У меня нет никакого интереса вступать в гильдию. +(Shake your head) +(Покачать головой) +Gladly! +С радостью! +(Accept the offer) +(Принять предложение) +What if I am one of those bad actors? (Refuse) +Что, если я одина из тех самых плохих ребят? (Отказаться) +(Refuse the offer) +(Отказаться от предложения) +Fine... (Join) +Хорошо... (Присоединиться) +(Moan and nod) +(Простонать и кивнуть) +Go away. (PERCENT chance to avoid) +Уходи. (PERCENT шанс на избежание) +(Frown at her) (PERCENT chance to avoid) +(Хмуро на неё посмотреть) (PERCENT шанс на избежание) +(The SPEAKER beeps)|Prisoner 74121 identified.|Subject not registered in database. +(SPEAKER издает звуковой сигнал)|Опознан заключенный 74121.|Субъект не зарегистрирован в базе данных. +(The SPEAKER beeps)|Confirming database entry.|Say 'I will be a good girl' to enter database. +(SPEAKER издает звуковой сигнал)|Подтверждение ввода в базу данных.|Скажите 'Я буду хорошей девочкой', чтобы зарегистрироваться в базу данных. +(The SPEAKER beeps and applies tracking gear)|(The metallic cables click into place with a soft beep)|Prisoner 74121 registered. Good girl. +(SPEAKER издает звуковой сигнал и активирует механизмы слежения)|(Металлические кабели защелкиваются на вас с тихим звуковым сигналом)|Зарегистрирован заключенный 74121. Хорошая девочка. +(The SPEAKER beeps)|Acknowledged. Be warned:|Lost contact with Sections 98, 97, 96, 95...|(The list goes on...) +(SPEAKER издает звуковой сигнал)|Подтверждено. Предупреждение:|Потеряна связь с секциями 98, 97, 96, 95...|(Перечисление продолжается...) +(The SPEAKER beeps)|Acknowledged. Updating records. +(SPEAKER издает звуковой сигнал)|Подтверждено. Обновление записей. +(The SPEAKER beeps and flashes its lights)|Target acquired. +(SPEAKER издает звуковой сигнал и мигает лампочками)|Цель обнаружена. +(The SPEAKER beeps and flashes its lights)|Target has complied. Supplying uniform. +(SPEAKER издает звуковой сигнал и мигает лампочками)|Цель подтверждена. Поставка униформы. +(The SPEAKER beeps and flashes its lights)|Engaging capture protocol. +(SPEAKER издает звуковой сигнал и мигает лампочками)|Задействован протокол захвата. +(The SPEAKER beeps and flashes its lights)| +(SPEAKER издает звуковой сигнал и мигает лампочками)| +(The SPEAKER blasts you with a stunning ray and captures you)|Target neutralized. +(SPEAKER ослепляет вас ярким лучом и производит захват)|Цель нейтрализована. +Please register me. +Пожалуйста, зарегистрируй меня. +(Stop to talk to the robot) +(Остановитесь, чтобы поговорить с роботом) +Prisoner 74121? You must be mistaken... +Заключенный 74121? Ты, должно быть, ошибаешься... +(Avoid the robot) +(Обойти робота) +Prisoner 74121 reporting. I will be a good girl. +Докладывает заключенный 74121. Я буду хорошей девочкой. +(Accept the contract) +(Принять предложение) +Actually, I am an administrator. (Refuse) +Вообще-то, я администратор. (Отказаться) +(Refuse the contract) +(Отказаться от предложения) +I'm sorry, I will be a good girl! +Прости, я буду хорошей девочкой! +(Moan and nod) +(Простонать и кивнуть) +What? (PERCENT chance to avoid) +Что? (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER smiles)|I used to be an adventurer like you.|Then I joined up with the Dragonhearts! +(SPEAKER улыбается)|Когда-то я была такой же искательницей приключений, как и ты.|Но потом я присоединился к Драконьим Сердцам! +(The SPEAKER clears her throat)|Well, we're actually recruiting!|You're free to join us if you agree to fight for justice! +(SPEAKER прочищает горло)|Что ж, мы сейчас вновь набираем персонал!|Ты можешь присоединиться к нам, если согласишься бороться за справедливость! +(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! +(SPEAKER крепко пожимает вам руку)|Добро пожаловать в сестричество, искательница приключений! +(The SPEAKER tilts her head and shrugs)|Ah well. +(SPEAKER наклоняет голову и пожимает плечами)|Ну что ж. +(The SPEAKER nods)|Fair enough. +(SPEAKER кивает)|Хорошо. +(The SPEAKER frowns)|What is it?|You're not an enemy of justice, are you? +(SPEAKER хмурится)|Что это?|Ты ведь не враг правосудия, я надеюсь? +(The SPEAKER frowns)|...If you won't fight for justice, that makes you an enemy of justice. +(SPEAKER хмурится)|...Если ты не собираешься бороться за справедливость, это делает тебя врагом справедливости. +(The SPEAKER frowns and cracks her knuckles)|Looks like my suspicions were right!|Looks like you and I are going to have a little chat... +(SPEAKER хмурится и хрустит костяшками пальцев)|Похоже, мои подозрения были верны!|Похоже, нам с тобой предстоит немного поболтать... +(The SPEAKER giggles)|Hehe, just messin' with ya.|Anyway, welcome to the sisterhood! +(SPEAKER смеется)|смеется)|Хе-хе, просто шучу.|В любом случае, добро пожаловать в сестричество! +(The SPEAKER grabs you and ties you up)|You won't be making trouble like that any time soon. +(SPEAKER хватает вас и связывает)|В ближайшее время ты не будешь доставлять неприятностей. +I wish I could join you. +Я предпочла бы присоединиться к вам. +(Nod excitedly) +(Взволнованно кивнуть) +Please go away. +Пожалуйста, уходи. +(Back away) +(Отойти) +Great! Sign me up! +Отлично! Запиши меня! +(Join) +(Присоединиться) +Fight for justice? Sounds restrictive... +Бороться за справедливость? Звучит обременительно... +(Back away) +(Отойти) +Actually, justice doesn't sound bad! +На самом деле, правосудие звучит не так уж плохо! +(Moan and nod) +(Простонать и кивнуть) +What are you going to do about it? (PERCENT chance to avoid) +Что ты собираешься сделать по этому поводу? (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER waves and calls you over)|Looks like you've made a name for yourself.|What do you say to a little agreement? +(SPEAKER машет рукой и подзывает вас)|Похоже, ты сделала себе имя.|Что ты скажешь о небольшом соглашении? +(The SPEAKER clears her throat)|Well, you're currently on our turf.|But we're willing to cut you some slack.|You just have to agree not to attack any of us. +(SPEAKER прочищает горло)|Что ж, в данный момент ты находишься на нашей территории.|Но мы готовы дать тебе некоторую поблажку.|Ты просто должна согласиться не нападать ни на кого из нас. +(The SPEAKER gives you a firm handshake)|Welcome to the sisterhood, adventurer! +(SPEAKER крепко пожимает вам руку)|Добро пожаловать в сестричество, искательница приключений! +(The SPEAKER tilts her head and shrugs)|Ah well. +(SPEAKER наклоняет голову и пожимает плечами)|Ну что ж. +(The SPEAKER nods)|Fair enough. +(SPEAKER кивает)|Хорошо. +(The SPEAKER frowns)|Criminals? Girl, we ARE the law around these parts~ +(SPEAKER хмурится)|Преступники? Девочка, мы - закон в этих краях~ +(The SPEAKER grins)|I like your spunk, girl.|But you're kidding, right? +(SPEAKER ухмыляется)|Мне нравится твоя смелость, девочка.|Но ты ведь шутишь, верно? +(The SPEAKER raises her fists and smiles)|You're on! +(SPEAKER поднимает кулаки и улыбается)|Ты принята! +(The SPEAKER chuckles)|Here's a toast to a new partnership! +(SPEAKER хихикает)|Выпьем за нового партнёра! +(The SPEAKER catches you and trusses you up)|Maybe we'll just have to find you an owner, then!|Hehe. +(SPEAKER ловит вас и связывает)|Тогда, наверное, нам просто придется найти для тебя владельца!|Хе-хе. +I'm all ears. +Я вся во внимании. +(Listen closely) +(Внимательно слушать) +I don't deal with criminals. +Я не имею дела с преступниками. +(Back away) +(Отойти) +It's a deal! +Я в деле! +(Mumble in agreement) +(Пробормотать что-то в знак согласия) +You don't understand. This is MY turf. +Ты не понимаешь. Это МОЯ территория. +(Scoff at her through your gag) +(Насмехаться над ней через свой кляп) +Haha, just kidding. I'm with you. +Ха-ха, просто шучу. Я с тобой. +(Moan and nod) +(Простонать и кивнуть) +Put 'em up! (PERCENT chance to avoid) +Руки вверх! (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER stops walking and speaks)|You there!|It seems your attunement with magic is high.|Join us. +(SPEAKER останавливается и говорит)|Ты здесь!|Похоже, у тебя высокое сродство с магией.|Присоединяйся к нам. +(The SPEAKER nods calmly)|We will use some special equipment to increase your attunement.|Put these on. +(SPEAKER спокойно кивает)|Мы будем использовать некоторое специальное оборудование, чтобы усилить твоё сродство.|Надень это. +(The 'equipment' locks in place)|Excellent. Soon you will be much more powerful. +('Оборудование' надежно фиксируется)|Отлично. Скоро ты станешь ещё сильнее. +(The SPEAKER stops talking and walks away.) +(SPEAKER прекращает разговор и уходит.) +(The SPEAKER walks away like nothing happened.) +(SPEAKER уходит как ни в чем не бывало.) +(The SPEAKER frowns slightly)|We are prepared to use force if need be... +(SPEAKER слегка хмурится)|Мы готовы применить силу, если потребуется... +(The SPEAKER stares at you)|Why? Did you not say you wanted to join us? +(SPEAKER пристально смотрит на вас)|Почему? Разве ты не говорила, что хочешь присоединиться к нам? +(The SPEAKER frowns)|We have failed to convince the human. +(SPEAKER хмурится)|Нам не удалось убедить человека. +(The SPEAKER nods.)|You have made a wise decision. +(SPEAKER кивает.)|Ты приняла мудрое решение. +(The SPEAKER uses magic to force you.)|There. Try not to succumb to your desires too much. +(SPEAKER использует магию, чтобы заставить вас.)|Вот. Старайся не слишком поддаваться своим желаниям. +Um... sure? +Эм... конечно? +(Nod excitedly) +(Взволнованно кивнуть) +Get away from me! +Отстань от меня! +(Shake your head) +(Покачать головой) +Shiny... (Put them on) +Блестит... (Надеть их) +(Let her put them on you) +(Позволь ей надеть их на тебя) +What? No way! (Refuse) +Что? Ни за что! (Отказаться) +(Refuse the contract) +(Отказаться от контракта) +Okay, I will wear them... +Хорошо, я надену их... +(Moan and nod) +(Простонать и кивнуть) +Monster! (PERCENT chance to avoid) +Монстр! (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER does a short bow as she sees you)|Um... hi!|I have a letter for you... +(SPEAKER отвешивает короткий поклон, когда видит вас)|Эм... привет!|У меня для тебя письмо... +(The letter is a contract from the College)|(They want you to sign up as an instructor for apprentices)|(The SPEAKER looks at you nervously.) +(Письмо - это контракт из колледжа)|(Они хотят, чтобы вы зарегистрировались в качестве инструктора для учеников)| (SPEAKER нервничая смотрит на вас.) +(The SPEAKER sighs in relief)|That's good...|(You sign the contract and it vanishes into the aether) +(SPEAKER вздыхает с облегчением)|Это хорошо...|(Вы подписываете контракт, и он исчезает в эфире) +(The SPEAKER whimpers)|What will I tell them... +(SPEAKER хнычек)|Что я им скажу?.. +(The SPEAKER whimpers)|What will I tell them... +(SPEAKER хнычек)|Что я им скажу?.. +(The SPEAKER glares at you)|It's an important message concerning your standing!|With the College! +(SPEAKER пристально смотрит на вас)|Это важное сообщение, касающееся вашего положения!|Из Колледжа! +(The SPEAKER blushes)|Well...|I was told we would make changes to your academic record,|should you refuse... +(SPEAKER краснеет)|Хорошо...|Мне сказали, что мы внесем изменения в вашу академическую запись,|если ты откажешься... +(The SPEAKER frowns)|They told me to make sure you sign...|by any means necessary! +(SPEAKER хмурится)|Они сказали мне убедиться, что ты подпишешь...|любыми необходимыми средствами! +(The SPEAKER nods and smiles)|Thank you so much!|I don't know what I would have done if you said no... +(SPEAKER кивает и улыбается)|Большое тебе спасибо!|Я не знаю, что бы я сделала, если бы ты сказала нет... +(The SPEAKER frowns and waves her wand)|(A bunch of ropes come out of the ground and restrain you)|Hmmph. I'll tell them you signed it anyway.|I can't go back empty handed. +(SPEAKER хмурится и взмахивает палочкой)|(Пучок веревок вылетает из под земли и обхватывает вас)|Хммф. Я все равно скажу им, что ты это подписала.|Я не могу вернуться с пустыми руками. +Thank you for delivering it. (Read it) +Спасибо за доставку. (Прочесть письмо) +(Read the letter) +(Прочесть письмо) +There's nothing good inside that letter. +В этом письме не будет ничего хорошего. +(Shake your head) +(Покачать головой) +Great! Wonderful! +Отлично! Замечательно! +(Accept the contract) +(Согласиться) +There is no way I'd accept. +Я бы ни за что не согласилась. +(Refuse the contract) +(Отказаться от контракта) +Fine. I'll read it. (Join the College as an instructor) +Хорошо. Я согласна. (Поступить в Колледж в качестве преподавателя) +(Moan and nod) +(Простонать и кивнуть) +This is unethical! I refuse! (PERCENT chance to avoid) +Это неэтично! Я отказываюсь! (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER does a short bow as she sees you)|Greetings.|You seem to possess qualities we can make use of.|I would be glad to offer you a position... +(SPEAKER отвешивает короткий поклон, когда видит вас)|Приветствую.|Похоже, ты обладаешь качествами, которые мы можем использовать.|Я была бы рада предложить тебе работу... +(The SPEAKER smiles briefly before clearing her throat)|Fantastic!|I have your uniform right here... +(SPEAKER коротко улыбается, прежде чем прочистить горло)|Фантастика!|У меня как раз есть форма для тебя, прямо вот здесь... +(The SPEAKER buckles you in, pulling the lacing extra-tight...)|(You hear the click of a few locks going on...)|Wonderful. Your first task is to clean up this floor.|Good luck. +(SPEAKER одевает вас, очень туго затягивая шнуровку...)|(Вы слышите щелчок нескольких замков...)|Замечательно. Твоя первая задача - навести порядок на этом этаже.|Удачи. +(The SPEAKER tilts her head and shrugs)|We are always prepared... +(SPEAKER наклоняет голову и пожимает плечами)|Мы всегда готовы... +(The SPEAKER nods)|Fair enough. +(SPEAKER кивает)|Хорошо. +(The SPEAKER grins and pulls out a skimpy dress)|Might I remind you that you have made quite a few... enemies?|It would be a shame if you ran into one of them... +(SPEAKER ухмыляется и достает откровенное платье)|Могу я напомнить тебе, что ты нажила немало... врагов?|Было бы обидно, если бы ты столкнулась с одним из них... +(The SPEAKER nods proudly)|We are willing to made some changes to our records~ +(SPEAKER гордо кивает)|Мы готовы внести некоторые изменения в наши записи ~ +(The SPEAKER frowns)|You won't know what hit you. +(SPEAKER хмурится)|Ты не поймешь, что тебя поразило. +(The SPEAKER smiles)|I'm glad you made the right decision.|Now, your first task will be to clean up this floor.|Good luck. +(SPEAKER улыбается)|Я рада, что ты приняла правильное решение.|Теперь твоей первой задачей будет навести порядок на этом этаже.|Удачи. +(The SPEAKER suddenly moves faster than you can react)|(You feel a foot pressing on your back as you are forced down)|(She puts a uniform on you and locks it tight...)|You'll require additional training, I suppose... +(SPEAKER внезапно начинает двигаться быстрее, чем вы успеваете среагировать)|(Вы чувствуете, как нога давит вам на спину, и вас прижимают к земле)|(Она надевает на вас форму и туго затягивает ее...)|Я полагаю, тебе потребуется дополнительная тренировка... +This sounds like an interesting opportunity. +Это звучит как интересная возможность. +(Nod excitedly) +(Взволнованно кивнуть) +No thanks, I know what that entails... +Нет, спасибо, я знаю, что это повлечет за собой... +(Shake your head) +(Покачать головой) +Gladly! +С радостью! +(Accept the contract) +(Принять контракт) +W-where did you get that uniform? (Refuse) +Г-где ты взяла эту униформу? (Отказаться) +(Refuse the contract) +(Отказаться от контракта) +Fine. I'll sign it... +Хорошо... Я подпишу. +(Moan and nod) +(Простонать и кивнуть) +Never! (PERCENT chance to avoid) +Никогда! (PERCENT шанс на избежание) +(Shake your head and frown) (PERCENT chance to avoid) +(Покачать головой и нахмуриться) (PERCENT шанс на избежание) +(The SPEAKER waves)|Greetings,|I manufacture all sorts of weapons.|Would you like to buy some? +(SPEAKER машет рукой)|Приветствую,|я произвожу все виды оружия.|Не хотели бы вы что-нибудь купить? +(The SPEAKER drops her hammer and cracks her knuckles)|Put em up! +(SPEAKER роняет молоток и хрустит костяшками пальцев)|Давай! +(The SPEAKER looks at you.)|But you already have one? +(SPEAKER смотрит на вас.)|Но у тебя уже есть одно? +(The SPEAKER folds her arms)|I don't do charity, ma'am. +(SPEAKER складывает руки на груди)|Я не занимаюсь благотворительностью, мэм. +(The SPEAKER smirks)|Another adventurer found this lying around.|I wonder who it's for~ +(SPEAKER ухмыляется)|Другя искательница приключений нашла это валяющимся на полу.|Интересно, для кого оно предназначено~ +(The SPEAKER smiles)|Now don't be up to no good~|Or else I'll have to put you in cuffs... +(SPEAKER улыбается)|А теперь не замышляй ничего плохого~|Иначе мне придется надеть на тебя наручники... +(The SPEAKER nods)|A versatile weapon. One of my favorites. +(SPEAKER кивает)|Универсальное оружие. Одно из моих любимых. +(The SPEAKER nods)|Keep your friends close, and your enemies far away. +(SPEAKER кивает)|Держи своих друзей близко, а врагов подальше. +(The SPEAKER nods)|Handy to have one of these around. +(SPEAKER кивает)|Удобно иметь при себе такую штуку. +(The SPEAKER nods)|The best defense is a good offense. +(SPEAKER кивает)|Лучшая защита - это умелое нападение. +(The SPEAKER nods)|Speak softly and carry a big hammer. +(SPEAKER кивает)|Говори тихо и носи с собой большой молот. +(The SPEAKER smiles)|Can never be too prepared~ +(SPEAKER улыбается)|Никогда нельзя полностью подготовиться~ +(The SPEAKER waves)|Hi.|I make armor. Only the finest.|I don't sell it cheap, unlike my twin. +(SPEAKER машет рукой)|Привет.|Я делаю доспехи. Только самые лучшие.|И я не продаю их задешево, в отличие от моего близнеца. +(The SPEAKER drops her hammer and cracks her knuckles)|Put em up! +(SPEAKER роняет молоток и хрустит костяшками пальцев)|Давай! +(The SPEAKER looks at you.)|Do you have a dealer's license? +(SPEAKER смотрит на вас.)|У тебя есть лицензия продавца? +(The SPEAKER folds her arms)|I don't do charity, girl. +(SPEAKER складывает руки на груди)|Я не занимаюсь благотворительностью, девочка. +(The SPEAKER nods)|The most high-impact of sports bras. +(SPEAKER кивает)|Самый эффектный спортивный бюстгальтер. +(The SPEAKER nods)|These aren't for hiking, just so you know. +(SPEAKER кивает)|Это не для пеших прогулок, просто чтобы ты знала. +(The SPEAKER nods)|I've been thinking about making a lockable version... +(SPEAKER кивает)|Я подумывала о том, чтобы сделать версию с возможностью блокировки... +(The SPEAKER nods)|These are sensibly sized, unlike those you see in movies. +(SPEAKER кивает)|Они разумного размера, в отличие от тех, что можно увидеть в фильмах. +(The SPEAKER nods)|Sometimes you just have to be flexible. +(SPEAKER кивает)|Иногда просто нужно быть гибкой. +(The SPEAKER nods)|For when you value style over protection... +(SPEAKER кивает)|Для тех, кто ценит стиль превыше защиты... +(The SPEAKER nods)|You can never be too careful. +(SPEAKER улыбается)|Никогда нельзя быть слишком осторожной. +(The SPEAKER chuckles)|I hear female adventurers like to wear these for protection.|Or something like that. +(SPEAKER хихикает)|Я слышала, что искательницам приключений нравится носить это для защиты.|Или что-то в этом роде. +(The SPEAKER chuckles)|I hear female adventurers like to wear these for protection.|Or something like that. +(SPEAKER хихикает)|Я слышала, что искательницам приключений нравится носить это для защиты.|Или что-то в этом роде. +(The SPEAKER waves)|Hello miss!|What brings you here today? +(SPEAKER машет рукой)|Здравствуй!|Что привело тебя сюда сегодня? +(The SPEAKER folds her arms)|That's not very nice! +(SPEAKER складывает руки на груди)|Это не очень приятно! +(The SPEAKER looks at you and smiles.)|Don't you already have one? +(SPEAKER смотрит на вас и улыбается.)|Разве у тебя его еще нет? +(The SPEAKER folds her arms)|I don't do charity, miss. +(SPEAKER складывает руки на груди)|Я не занимаюсь благотворительностью. +(The SPEAKER nods)|Could use a higher heel... +(SPEAKER кивает)|Можно было бы использовать каблук повыше... +(The SPEAKER nods)|Back to the basics. +(SPEAKER кивает)|Возвращаясь к основам. +(The SPEAKER smiles)|I see you have good taste! +(SPEAKER улыбается)|Я вижу, у тебя хороший вкус! +(The SPEAKER nods)|It's a classic!|What's not to like? +(SPEAKER кивает)|Это классика!|Как она может не нравиться? +(The SPEAKER smiles)|It's an upgrade for your best friend! +(SPEAKER улыбается)|Это апгрейд для твоего лучшего друга! +(The SPEAKER shrugs)|It's big and bulky, but I guess it has its uses. +(SPEAKER пожимает плечами)|Он большой и громоздкий, но, думаю, у него есть свое применение. +(The SPEAKER giggles)|Smile for the camera! +(SPEAKER хихикает)|Улыбнись в камеру! +(The SPEAKER nods)|It's like mana, but much more portable!|It powers duplication runes so you don't run out of arrows. +(SPEAKER кивает)|Это как мана, но гораздо более портативный!|Он использует дублирующие руны, так что у тебя не закончатся стрелы. +(The SPEAKER giggles)|I like to include these as a gift with every purchase~ +(SPEAKER хихикает)|Мне нравится включать их в качестве подарка при каждой покупке~ +(The SPEAKER whispers in a hushed tone)|Welcome.|I'm not supposed to be here, so|if you don't want to do business, get out.|I only sell in packs of 10, by the way. +(SPEAKER шепчет приглушенным голосом)|Добро пожаловать.|Меня здесь быть не должно, так что|если ты не хочешь заняться бизнесом, убирайтесь.|Кстати, я продаю только пачками по 10 штук. +(The SPEAKER tries to get away)|Damn! +(SPEAKER пытается уйти)|Черт возьми! +(The SPEAKER looks you over and shrugs)|Don't joke around. +(SPEAKER оглядывает вас и пожимает плечами)|Не шути так. +(The SPEAKER folds her arms)|Don't have money? Better go find some. +(SPEAKER скрещивает руки на груди)|У тебя нет денег? Тогда найди их. +(The SPEAKER produces a bag of stuffings)|Quite the staple. +(SPEAKER достает заполненную сумку)|То, что нужно. +(The SPEAKER produces a bundle of rope)|Aren't you quite the artist.|That was rhetorical. +(SPEAKER достает моток веревки)|Разве ты не настоящий профи?|Это был риторический вопрос. +(The SPEAKER produces some bondage tape)|It only sticks to itself, doesn't leave residue.|Gotta be responsible, you know? +(SPEAKER достает немного ленты для бондажа)|Она приклеивается только к самой себе и не оставляет следов.|Нужно быть ответственной, понимаешь? +(The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally... +(SPEAKER достает пакет с матерчатыми кляпами)|На самом деле, это дело вкуса.|Нет, я не имела в виду это буквально... +(The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally... +(SPEAKER достает пакет с матерчатыми кляпами)|На самом деле, это дело вкуса.|Нет, я не имела в виду это буквально... +(The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally... +(SPEAKER достает пакет с матерчатыми кляпами)|На самом деле, это дело вкуса.|Нет, я не имела в виду это буквально... +(The SPEAKER produces a bag of cloth gags)|It's a matter of taste, really.|No, I didn't mean that literally... +(SPEAKER достает пакет с матерчатыми кляпами)|На самом деле, это дело вкуса.|Нет, я не имела в виду это буквально... +(The SPEAKER produces a bag of cloth strips)|How tight you tie it depends on how bratty your target is. +(SPEAKER достает пакет с полосками ткани)|Насколько туго ты их завяжешь, зависит от того, насколько своенравна твоя цель. +(The SPEAKER rattles as she waves)|Heya!|Looking to buy some ancient treasures?|My antiques shop has just what you need! +(SPEAKER дрожит, когда она машет рукой)|Привет!|Хочешь приобрести какие-нибудь древние сокровища?|В моем антикварном магазине есть как раз то, что тебе нужно! +(The SPEAKER cracks her exposed knuckles)|So you've seen through my disguise... +(SPEAKER хрустит костяшками пальцев)|Итак, ты разгадала мою маскировку... +(The SPEAKER looks at you.)|Yours is just fine, dear. +(SPEAKER смотрит на вас.)|У тебя все в порядке, дорогая. +(The SPEAKER chuckles)|You don't have enough gold for that, dear.|Try coming back after a good round of looting! +(SPEAKER хихикает)|У тебя недостаточно золота для этого, дорогая.|Попробуй вернуться после удачного лутинга! +(The SPEAKER nods)|My great grandmother used to wear these. +(SPEAKER кивает)|Моя великая прабабушка носила тоже самое. +(The SPEAKER nods)|Adventurers used to love a good burlap sack.|Nowadays they've got that newfangled magic instead... +(SPEAKER кивает)|Искателям приключений раньше нравились хорошие джутовые мешки.|В наши дни вместо них появилась эта новомодная магия... +(The SPEAKER nods)|Back in my day, they used candles for light!|These let you put them out to save wax. +(SPEAKER кивает)|В мое время для освещения использовали свечи!|С помощью этого можно тушить их, чтобы сэкономить воск. +(The SPEAKER giggles)|I had all sorts of use for this back on the farm. +(SPEAKER хихикает)|На ферме я находила множество применений для этого. +(Select an item to buy from the SPEAKER) +(Выберите товар для покупки у SPEAKER) +(Attack the SPEAKER?) +(Напасть на SPEAKER?) +(Buy ITM# for IC# gp) (Owned: AMNT#) +(Купить ITM# за IC# зол.) (Имеется: AMNT#) +(The SPEAKER sells you the item) +(SPEAKER продает вам товар) +(The SPEAKER shakes her head)|I think you'd be better off without that~ +(SPEAKER качает головой)|Я думаю, тебе было бы лучше обойтись без этого~ +(The SPEAKER looks embarassed)|I can't sell you that, miss... +(SPEAKER выглядит смущенной)|Я не могу продать вам это, мисс... +(The SPEAKER blushes)|Actually, I was saving that for myself... +(SPEAKER краснеет)|Вообще-то, я приберегала это для себя... +(The SPEAKER grins)|Good girls don't need one of those~ +(SPEAKER ухмыляется)|Хорошим девочкам такое не нужно~ +(The SPEAKER buzzes)|Error, insufficient access privileges. +(SPEAKER жужжит)|Ошибка, недостаточно прав доступа. +(The SPEAKER giggles at your empty pockets)|You can't afford such things, silly~ +(SPEAKER смеется над вашими пустыми карманами)|Ты не можешь позволить себе такие вещи, глупышка~ +(The SPEAKER pauses nervously)|Um miss, I don't think you can afford that... +(SPEAKER делает нервную паузу)|Эм, мисс, я не думаю, что вы можете себе это позволить... +(The SPEAKER frowns)|What does this look like, a charity? +(SPEAKER хмурится)|На что это по-твоему похоже, на благотворительность? +(The SPEAKER smules)|You'll have to secure that by other means, I think~ +(SPEAKER улыбается)|Я думаю, тебе придется закрепить это другими способами~ +(The SPEAKER beeps)|Insufficient currency. +(SPEAKER издает звуковой сигнал)|Недостаточно валюты. +(Look at what she wants to buy) +(Посмотреть, что она хочет купить) +You're giving me everything you have. +Ты отдашь мне все, что у тебя есть. +(Flail threateningly at her) +(Угрожающе замахнуться на нее) +(Do it) +(Сделать это) +(Back off) +(Отступить) +(The SPEAKER approaches you with an offer)|Greetings! I am the potion seller.|I buy and sell only the strongest potions!| +(SPEAKER обращается к вам с предложением)|Приветствую! Я продавец зелий.|Я покупаю и продаю только самые мощные зелья!| +(The SPEAKER doesn't look surprised)|Okay, just let me set these down real quick... +(SPEAKER не выглядит удивленной)|Хорошо, только позвольте мне быстро установить их... +(The SPEAKER smiles)|A spellcaster will have great use for this! +(SPEAKER улыбается)|Заклинателю это очень пригодится! +(The SPEAKER smiles)|Wow! That's a lot of mana!|It requires a skilled mage to tap into, though... +(SPEAKER улыбается)|Вау! Так много маны!|Однако потребуется опытный маг, чтобы подлюкличится к... Хотя... +(The SPEAKER smiles)|It fills me with... determination. +(SPEAKER улыбается)|Оно наполняет меня... решимостью. +(The SPEAKER smiles)|Refreshing! +(SPEAKER улыбается)|Освежает! +(The SPEAKER smiles)|They say a bitter tea cures all ails... +(SPEAKER улыбается)|Говорят, горький чай лечит все болезни... +(The SPEAKER smiles)|An empty flask?|...Oh. +(SPEAKER улыбается)|Пустая склянка?|...Оу. +(The SPEAKER approaches you)|My greetings, Outsider!|My throat is parched and I seek the bounties of nature.|Do you have what I seek? +(SPEAKER подходит к вам)|Мои приветствия, чужачка!|У меня пересохло в горле, и я ищу дары природы.|У тебя есть то, что я ищу? +(The SPEAKER doesn't look surprised)|Then let us have a battle of wits! +(SPEAKER не выглядит удивленной)|Тогда давай устроим битву умов! +(The SPEAKER thanks you)|A kind offering! You have my thanks. +(SPEAKER благодарит вас)|Щедрое подношение! Прими мою благодарность. +(The SPEAKER thanks you)|A magnificent offering! You have my thanks. +(SPEAKER благодарит вас)|Великолепное подношение! Прими мою благодарность. +(The SPEAKER tilts her head)|...where did you get this? +(SPEAKER наклоняет голову)|...где ты это взяла? +(The SPEAKER thanks you)|A fine trinket!|I will enjoy meditating upon it. +(SPEAKER благодарит вас)|Прекрасная безделушка!|Мне будет приятно медитировать с ней. +(The SPEAKER thanks you)|I sense its flowing essence.|You have my thanks. +(SPEAKER благодарит вас)|Я ощущаю эту текучую сущность.|Прими мою благодарность. +(The SPEAKER thanks you)|I can feel a great sadness emanating from it.|It calls for warmth. +(SPEAKER благодарит вас)|Я чувствую огромную печаль, исходящую от этого предмета.|Он требует тепла. +(The SPEAKER munches on a donut)|Gee I'm starving!|You wouldn't have something to eat, would you? +(SPEAKER жует пончик)|Боже, я умираю с голоду!|У тебя не найдется чего-нибудь перекусить, а? +(The SPEAKER throws a donut in your face)|Ha! Take that! +(SPEAKER бросает пончик вам в лицо)|Ха! Схавай! +(The SPEAKER smiles)|Yum! Thank you! +(SPEAKER улыбается)|Ням! Спасибо! +(The SPEAKER smiles)|Crunchy! My favorite! +(SPEAKER улыбается)|Хрустящий! Мой любимый! +(The SPEAKER tilts her head)|It smells funny...|Still, it'd be a shame for it to go to waste! +(SPEAKER наклоняет голову)|Оно странно пахнет...|И все же было бы обидно, если бы оно пропало даром! +(The SPEAKER approaches you with an offer)|Hello!|I am searching for magical scrolls.|Would you happen to have any? +(SPEAKER обращается к вам с предложением)|Здравствуй!|Я ищу магические свитки.|У тебя случайно нет таких? +(The SPEAKER doesn't look surprised)|Rude! +(SPEAKER не выглядит удивленной)|Грубо! +(The SPEAKER smiles)|Thank you! +(SPEAKER улыбается)|Спасибо! +(The SPEAKER smiles)|Thank you! +(SPEAKER улыбается)|Спасибо! +(The SPEAKER smiles)|Thank you! +(SPEAKER улыбается)|Спасибо! +(The SPEAKER raises a brow)|Thank you! This one is rare! +(SPEAKER приподнимает бровь)|Спасибо! Это большая редкость! +(The SPEAKER invites you to a friendly chat)|Back in my day I used to go visit dungeons all the time|But these days I get so lost in my studies...|Say, you don't happen to have some magic supplies on you? +(SPEAKER приглашает вас на дружескую беседу)|Обычно я очень часто хожу в подземелья|Но в последние дни я так погружена в свою учебу...|Скажи, у тебя случайно нет с собой каких-нибудь магических вещиц? +(The SPEAKER shrugs)|I guess that's how it is. +(SPEAKER пожимает плечами)|Я думаю, так оно и есть. +(The SPEAKER smiles)|Always nice to have some of these! +(SPEAKER улыбается)|Всегда приятно получить что-нибудь подобное! +(The SPEAKER smiles)|I can never get enough of these. +(SPEAKER улыбается)|Этого мне никогда не будет мало. +(The SPEAKER smiles)|Elemental magic, interesting stuff. +(SPEAKER улыбается)|Магия стихий, интересная штука. +(The SPEAKER tilts her head)|Why is it wet? +(SPEAKER наклоняет голову)|Почему оно мокрое? +(The SPEAKER smiles)|Elemental magic, interesting stuff. +(SPEAKER улыбается)|Магия стихий, интересная штука. +(The SPEAKER smiles)|Gladly, this will be useful to my studies. +(SPEAKER улыбается)|Спасибо, это будет полезно для моей учебы. +(The SPEAKER smiles)|My legs don't carry me like they used to~ +(SPEAKER улыбается)|Мои ноги уже не несут меня так, как раньше.~ +(The SPEAKER smiles)|Always good to have somebody to talk to. +(SPEAKER улыбается)|Всегда приятно, когда есть с кем поговорить. +(The SPEAKER giggles)|Living dangerously, I see~ +(SPEAKER хихикает)|Жизнь опасна, я понимаю~ +(The SPEAKER approaches you with an offer)|Hey girl~|You seem like the explorer type.|Happen to have any good finds? +(SPEAKER обращается к вам с предложением)|Привет, девочка~|Ты похожа на исследователя.|Случайно нет каких-нибудь хороших находок? +(The SPEAKER frowns)|Well then. +(SPEAKER хмурится)|Ну что ж. +(The SPEAKER grins)|Are you willing to part with this? +(SPEAKER ухмыляется)|Ты готова расстаться с этим? +(The SPEAKER smiles)|Aha!|Fantastic. +(SPEAKER улыбается)|Ага!|Фантастика. +(The SPEAKER frowns)|I'll take it, I guess... +(SPEAKER хмурится)|Думаю, я возьму это... +(The SPEAKER smiles)|Oooh~!|I love technology! +(SPEAKER улыбается)|Ооо~!|Я люблю технологии! +(The SPEAKER nods)|A rare find! +(SPEAKER кивает)|Редкая находка! +(The SPEAKER surprises you)|Greetings, traveler.|I am looking for tools to aid in my mission. +(SPEAKER внезапно приветствует вас)|Приветствую тебя, путешественник.|Я ищу инструменты, которые помогут мне в моей миссии. +(The SPEAKER doesn't look surprised)|That's how it is, then. +(SPEAKER не выглядит удивленной)|Значит, вот как. +(The SPEAKER bows)|Always be prepared. +(SPEAKER кланяется)|Всегда будь готова. +(The SPEAKER bows)|Always be prepared. +(SPEAKER кланяется)|Всегда будь готова. +(The SPEAKER bows)|Always be extra prepared. +(SPEAKER кланяется)|Всегда будь максимально подготовлена. +(The SPEAKER bows)|A bit dangerous, but I'll take it. +(SPEAKER кланяется)|Немного опасно, но я приму это. +(The SPEAKER bows)|A tool of the trade. +(SPEAKER кланяется)|Инструмент торговли. +(The SPEAKER bows)|A most valuable find. +(SPEAKER кланяется)|Ценнейшая находка. +(The SPEAKER tilts her shades)|I like to think of myself as a dealer in quality tools. +(SPEAKER приподнимает темные очки)|Мне нравится думать о себе как о торговце качественными инструментами. +(The SPEAKER reaches for her hip)|I'd think twice if I were you... +(SPEAKER тянется к своему бедру)|На твоем месте я бы дважды подумала... +(The SPEAKER smiles)|Nevermere keeps a tight grip on their blueprints.|Thank you. +(SPEAKER улыбается)|Невермер тщательно следит за своими чертежами.|Спасибо. +(The SPEAKER smiles)|Nevermere keeps a tight grip on their blueprints.|Thank you. +(SPEAKER улыбается)|Невермер тщательно следит за своими чертежами.|Спасибо. +(The SPEAKER smiles)|There's always a buyer.|That's just the way things are. +(SPEAKER улыбается)|Покупатель всегда найдется.|Просто так обстоят дела. +(The SPEAKER smiles)|Portable. Sustainable. A smart choice. +(SPEAKER улыбается)|Портативный. Устойчивый. Разумный выбор. +(The SPEAKER smiles)|That's what I'm talking about. +(SPEAKER улыбается)|Именно об этом я и говорю. +(The SPEAKER nods)|Yeah... that'll do. +(SPEAKER кивает)|Да... этого хватит. +(The SPEAKER looks somewhat crazed)|I'm looking for some heavy ordnance in order to...|...add to my collection.|Anyway, got any bombs? +(SPEAKER выглядит несколько безумной)|Я ищу какое-нибудь тяжелое вооружение, чтобы...|...пополнить свою коллекцию.|В любом случае, у тебя есть несколько бомб? +(The SPEAKER reaches for her backpack)|I'll blow you away! +(SPEAKER тянется к своему рюкзаку)|Да я тебя разнесу! +(The SPEAKER shrugs)|Cute fireworks, I suppose... +(SPEAKER пожимает плечами)|Милый фейерверк, я полагаю... +(The SPEAKER shrugs)|Cute fireworks, I suppose... +(SPEAKER пожимает плечами)|Милый фейерверк, я полагаю... +(The SPEAKER giggles)|That's what I'm talking about! +(SPEAKER хихикает)|Вот о чем я говорю! +(The SPEAKER rubs her hands together)|Excellent... +(SPEAKER потирает руки)|Отлично... +(The SPEAKER smiles)|Yes! I can make more bombs! +(SPEAKER улыбается)|Да! Я могу сделать больше бомб! +(The SPEAKER takes a whiff of her cigar)|Hey friend. Im in the market for some 'tools,'|...if you catch my frift. +(SPEAKER затягивается сигарой)|Привет, друг. Я на рынке в поисках кое-каких 'инструментов'| ...если ты понимаешь, о чем я. +(The SPEAKER pulls out a knife)|Thought so. You won't take me that easily! +(SPEAKER достает нож)|Я так и думала. Ты так просто меня не возьмешь! +(The SPEAKER nods)|Could help out in a bind. +(SPEAKER кивает)|Могу помочь с затруднительным положением. +(The SPEAKER chuckles)|Lights out, eh... +(SPEAKER хихикает)|Отбой, да... +(The SPEAKER nods)|I could use one of these! +(SPEAKER кивает)|Я могла бы использовать одну из них! +(The SPEAKER smiles)|For when things go south... +(SPEAKER улыбается)|На случай, если дела пойдут наперекосяк... +(The SPEAKER smiles)|For when things go south... +(SPEAKER улыбается)|На случай, если дела пойдут наперекосяк... +(The SPEAKER smiles)|For when things go south... +(SPEAKER улыбается)|На случай, если дела пойдут наперекосяк... +(The SPEAKER smiles)|You can never be too safe. +(SPEAKER улыбается)|Ты никогда не можешь быть в полной безопасности. +(A distracted SPEAKER munches on a cookie) +(Отвлеченная SPEAKER жует печенье) +(The SPEAKER continues eating her snack) +(SPEAKER продолжает есть свои снеки) +(The SPEAKER plucks the cookie out of your hand)|My favorite! +(SPEAKER выхватывает печенье у вас из рук)|Мое любимое! +(The SPEAKER eats the brownies slowly, savoring every bite)|Kind of dense, but really good! +(SPEAKER медленно ест брауни, смакуя каждый кусочек)|Немного густоватые, но действительно вкусные! +(The SPEAKER takes a bite out of the donut)|A bit heavy on the sprinkles... +(SPEAKER откусывает кусочек от пончика)|Немного переборщили с посыпкой... +(The SPEAKER blushes)|This is... my new favorite. +(SPEAKER краснеет)|Это... мой новый фаворит. +(The SPEAKER's eyes widen as she wolfs down the golden cookie)|Truly divine... +(Глаза SPEAKER расширяются, когда она с жадностью поглощает золотистое печенье)|Поистине божественно... +(The SPEAKER is reading a kinky fashion magazine)|Why hello gorgeous~|You seem like you know your way around fashion.|Say, I've been on the hunt for unique designs... +(SPEAKER читает журнал магазина извращенной моды)|Привет, красавица~|Похоже, ты разбираешься в моде.|Скажем, я охочусь за уникальными дизайнами... +(The SPEAKER pouts)|I don't like your attitude. +(SPEAKER надувает губки)|Мне не нравится твой вкус. +(The SPEAKER smiles)|Classic vintage!|I approve~ +(SPEAKER улыбается)|Классический винтаж!|Я одобряю~ +(The SPEAKER giggles)|A girls best friend, eh? +(SPEAKER хихикает)|Лучший друг девушки, да? +(The SPEAKER giggles)|A girls best friend, eh? +(SPEAKER хихикает)|Лучший друг девушки, да? +(The SPEAKER gasps)|What an amazing find!!! +(SPEAKER ахает)|Какая потрясающая находка!!! +(The SPEAKER runs up to you)|Hello!|You wouldn't happen to have seen any ghosts lately?|I'm gathering evidence! +(SPEAKER подбегает к вам)|Привет!|Ты, случайно, в последнее время не видела никаких призраков?|Я собираю доказательства! +(The SPEAKER gasps)|You wouldn't! +(SPEAKER выдыхает)|Значит нет! +(The SPEAKER shakes your hand)|Ah! Ghosts love these! +(SPEAKER пожимает вам руку)|Ах! Призракам это нравится! +(The SPEAKER smiles)|This looks like strong evidence for my investigation! +(SPEAKER улыбается)|Это выглядит как веское доказательство для моего расследования! +(The SPEAKER grins)|Woah! That's so cool! +(SPEAKER усмехается)|Ого! Это так круто! +(Look at what she has to sell) +(Посмотреть, что она может продать) +You're giving me everything you have. +Ты отдашь мне все, что у тебя есть. +(Flail threateningly at her) +(Угрожающе замахнуться на нее) +(Do it) +(Сделать это) +(Back off) +(Отступить) +(Sell Item0 for ItemCost0 gp) (Owned: AMNT0) +(Продать Item0 за ItemCost0 зол) (Наличие: AMNT0) +(Sell Item1 for ItemCost1 gp) (Owned: AMNT1) +(Продать Item1 за ItemCost1 зол) (Наличие: AMNT1) +(Sell Item2 for ItemCost2 gp) (Owned: AMNT2) +(Продать Item2 за ItemCost2 зол) (Наличие: AMNT2) +(Sell Item3 for ItemCost3 gp) (Owned: AMNT3) +(Продать Item3 за ItemCost3 зол) (Наличие: AMNT3) +(Sell Item4 for ItemCost4 gp) (Owned: AMNT4) +(Продать Item4 за ItemCost4 зол) (Наличие: AMNT4) +(Sell Item5 for ItemCost5 gp) (Owned: AMNT5) +(Продать Item5 за ItemCost5 зол) (Наличие: AMNT5) +(Sell Item6 for ItemCost6 gp) (Owned: AMNT6) +(Продать Item6 за ItemCost6 зол) (Наличие: AMNT6) +(Sell Item7 for ItemCost7 gp) (Owned: AMNT7) +(Продать Item7 за ItemCost7 зол) (Наличие: AMNT7) +(Sell Item8 for ItemCost8 gp) (Owned: AMNT8) +(Продать Item8 за ItemCost8 зол) (Наличие: AMNT8) +(Sell Item9 for ItemCost9 gp) (Owned: AMNT9) +(Продать Item9 за ItemCost9 зол) (Наличие: AMNT9) +(Buy Item0 for ItemCost0 gp) (Owned: AMNT0) +(Купить Item0 за ItemCost0 зол) (Наличие: AMNT0) +(Buy Item1 for ItemCost1 gp) (Owned: AMNT1) +(Купить Item1 за ItemCost1 зол) (Наличие: AMNT1) +(Buy Item2 for ItemCost2 gp) (Owned: AMNT2) +(Купить Item2 за ItemCost2 зол) (Наличие: AMNT2) +(Buy Item3 for ItemCost3 gp) (Owned: AMNT3) +(Купить Item3 за ItemCost3 зол) (Наличие: AMNT3) +(Buy Item4 for ItemCost4 gp) (Owned: AMNT4) +(Купить Item4 за ItemCost4 зол) (Наличие: AMNT4) +(Buy Item5 for ItemCost5 gp) (Owned: AMNT5) +(Купить Item5 за ItemCost5 зол) (Наличие: AMNT5) +(Buy Item6 for ItemCost6 gp) (Owned: AMNT6) +(Купить Item6 за ItemCost6 зол) (Наличие: AMNT6) +(Buy Item7 for ItemCost7 gp) (Owned: AMNT7) +(Купить Item7 за ItemCost7 зол) (Наличие: AMNT7) +(Buy Item8 for ItemCost8 gp) (Owned: AMNT8) +(Купить Item8 за ItemCost8 зол) (Наличие: AMNT8) +(Buy Item9 for ItemCost9 gp) (Owned: AMNT9) +(Купить Item9 за ItemCost9 зол) (Наличие: AMNT9) +(The SPEAKER appears in a flash of light)|I come in the name of the Goddess.|I presume you need my aid?|(She will remain and help you with restraints for 50 turns) +(SPEAKER появляется во вспышке света)|Я пришел с именем Богини.|Я полагаю, тебе нужна моя помощь?|(Она останется и будет помогать вам с ограничителями в течение 50 ходов) +(The SPEAKER gives you two knives)|Don't hurt yourself with these, okay? +(SPEAKER дает вам два ножа)|Не поранься ими, хорошо? +(The SPEAKER gives you three picks)|I don't know how you plan to use these... +(SPEAKER дает вам три отмычки)|Я не знаю, как ты планируешь это использовать... +(The SPEAKER reluctantly gives you a magic key)|Okay, but remember that these are rare and valuable. +(SPEAKER неохотно дает вам магический ключ)|Ладно, но помни, что они редкие и ценные. +(The SPEAKER looks impressed with your predicament)|No angel can remove these without a divine blessing.|Perhaps you should apply for one? *snickers* +(SPEAKER, похоже, впечатлен вашим затруднительным положением)|Ни один ангел не сможет снять это без божественного благословения.|Может быть, тебе стоит подать заявку на такое? *смешок* +(The SPEAKER looks impressed with your predicament)|I won't get between you and your quest duties! +(SPEAKER, похоже, впечатлен вашим затруднительным положением)|Я не буду вставать между тобой и твоими квестовыми обязанностями! +(The SPEAKER looks impressed with your predicament)|Since you are Blessed by a goddess, I can help you.|(She performs a short prayer and a random divine lock comes off) +(SPEAKER выглядит впечатленным вашим затруднительным положением)|Поскольку ты благословлена богиней, я могу тебе помочь.|(Она произносит короткую молитву, и случайный божественный замок отщелкивается) +(Ask for 2 knives) +(Попросить 2 ножа) +(Ask for 3 lockpicks) +(Попросить 3 отмычки) +(Ask for a magic key) +(Попросить магический ключ) +(Ask for help with a divine lock) +(Попросить помощи с божественным замком) +There is no valid space next to you! +Рядом с вами нет свободного места! +(You approach the SPEAKER) +(Вы подходите к SPEAKER) +(Threaten) +(Угрожать) +(Really attack?) +(Действительно напасть?) +(Attack her) +(Напасть на нее) +(Never mind...) +(Ничего...) +(You decide not to) +(Вы решаете этого не делать) +(Retaliate) +(Отомстить) +(Really attack? You will be justified and won't take an immediate rep penalty) +(Действительно атаковать? Вы будете оправданы и не получите немедленного штрафа к репутации) +(Attack her) +(Напасть на нее) +(Never mind...) +(Ничего...) +(You decide not to) +(Вы решаете этого не делать) +(Sneak Attack) +(Внезапная атака) +(Really attack? Target is unaware and will be stunned 1 turn.) +(Действительно напасть? Цель не ожидает этого и будет оглушена на 1 ход.) +(Attack her) +(Напасть на нее) +(Never mind...) +(Ничего...) +(You decide not to) +(Вы решаете этого не делать) +(Let me through!!) +(Позволь мне пройти!!) +(Walk past this unit) +(Пройти мимо этого юнита) +(Walk past all units) +(Пройти мимо всех юнитов) +(Never mind...) +(Ничего...) +(Confirm? You will move through her for a few turns) +(Подтверждаете? Вы пройдете сквозь неё за несколько ходов) +### (...) + +(Stop following me) +(Перестань следовать за мной) +(Stop following me) +(Перестань следовать за мной) +(Never mind...) +(Ничего...) +(Confirm? You will have to find the SPEAKER again.) +(Подтверждаете? Вам придется снова найти SPEAKER.) +(You decide you still need the help) +(Вы решаете, что вам все еще нужна помощь) +(The SPEAKER refuses to follow your orders) +(SPEAKER отказывается выполнять ваши указания) +(Remove BINDAMNT binding from her) UNTIETURNS +(Снять BINDAMNT оковы с неё) UNTIETURNS +(You remove BINDANTPREV binding from the SPEAKER, excluding actual bindings)|(Use the 'Truss em Up' skill to remove bindings) +(Вы снимаете BINDANTPREV оковы с SPEAKER, исключая актуальные оковы)|(Используйте навык 'Связать их!' для снятия оков) +(Give her a restoration item) +(Дайте ей предмет для восстановления) +(The SPEAKER appreciates the thought!) +(SPEAKER очень признательна!) +Must have HP to untie. +Должна иметь HP для развязывания. +(AMNT turns) +(AMNT ходов) +(AMNT turn) +(AMNT ход) +(Follow me) +(Следуй за мной) +(Follow me) +(Следуй за мной) +(Never mind...) +(Ничего...) +(The SPEAKER starts following you) +(SPEAKER начинает следовать за вами) +(You decide you don't need the help) +(Вы решаете, что вам не нужна помощь) +(The SPEAKER refuses to follow your orders) +(SPEAKER отказывается выполнять ваши указания) +(Hold still) +(Не двигайся) +(Hold still) +(Не двигайся) +(Never mind...) +(Ничего...) +(The SPEAKER follows your orders) +(SPEAKER следует вашему указанию) +### (...) + +(The SPEAKER refuses to follow your orders) +(SPEAKER отказывается выполнять ваши указания) +(Don't stay here) +(Не стой здесь) +(Don't stay here) +(Не стой здесь) +(Never mind...) +(Ничего...) +(Confirm?) +(Подтверждаете?) +(You decide you would rather the SPEAKER stay put) +(Вы решаете, что предпочли бы, чтобы SPEAKER оставалась на месте) +(The SPEAKER refuses to follow your orders) +(SPEAKER отказывается выполнять ваши указания) +(Switch to Aggressive) +(Изменить на Агрессию) +(The SPEAKER will now pursue enemies) +(SPEAKER теперь будет преследовать врагов) +(Switch to Defensive) +(Изменить на Защиту) +(The SPEAKER will stay close to you or its assigned position) +(SPEAKER будет находиться рядом с вами или в назначенном ему месте) +(Flirting) +(Флирт) +(The SPEAKER smiles)|This will be fun! +(SPEAKER улыбается)|Это будет весело! +(The SPEAKER grins)|I will make sure you enjoy yourself~ +(SPEAKER ухмыляется)|Я позабочусь о том, чтобы тебе понравилось~ +(The SPEAKER blushes)|Mmm~ Let's do this! +(SPEAKER краснеет)|Ммм~ Давай сделаем это! +(The SPEAKER backs up)|I'm not in trouble, am I? +(SPEAKER отступает)|Я ведь не попал в неприятности, да? +(The SPEAKER beeps)|This unit does not know how to respond... +(SPEAKER издает звуковой сигнал)|Этот юнит не знает, как отреагировать... +(The SPEAKER moans)|Mmmmmph~ +(SPEAKER стонет)|Мммммфх~ +(The SPEAKER appears too busy to discuss with you) +(SPEAKER похоже, слишком занят, чтобы обсуждать это с вами) +End of line. +Конец очереди. +*slaps your butt* +*шлепает вас по заднице* +Error. Subject not complying? +Ошибка. Субъект не подчиняется? +Got yourself locked up, huh? Better go be good now~ +Сама себя заперла, да? А сейчас лучше веди себя хорошо~ +*she bumps up against your chastity and sighs* +*она натыкается на ваше целомудрие и вздыхает* +Pleasure controls detected. +Обнаружен контроль удовольствия. +You've been a bad girl, haven't you? *taps on your chastity gear* +Ты была плохой девочкой, не так ли? *постукивает по вашей экипировке целомудрия* +Such a naughty girl, getting yourself all locked up like that! +Такая непослушная девочка, сама себя заперла! +I-I know you want release, but you're in this gear for a reason~ +Я-я знаю, ты хочешь освободиться, но ты в этой экипировке не просто так~ +End of line. +Конец очереди. +Had fun?~ +Повеселилась?~ +*turns the toy off and giggles* +*выключает игрушку и хихикает.* +Error. Subject not complying? +Ошибка. Субъект не подчиняется? +Got yourself locked up, huh? Better go be good now~ +Сама себя заперла, да? А сейчас лучше веди себя хорошо~ +*she bumps up against your chastity and sighs* +*она натыкается на ваше целомудрие и вздыхает* +Pleasure controls detected. +Обнаружен контроль удовольствия. +You've been a bad girl, haven't you? *taps on your chastity gear* +Ты была плохой девочкой, не так ли? *постукивает по вашей экипировке целомудрия* +Such a naughty girl, getting yourself all locked up like that! +Такая непослушная девочка, сама себя заперла! +I-I know you want release, but you're in this gear for a reason~ +Я-я знаю, ты хочешь освободиться, но ты в этой экипировке не просто так~ +Don't I look quite cuddly? +Разве я не выгляжу довольно привлекательно? +(Move closer, attempting to cuddle) +(Придвигается ближе, пытаясь обнять) +(The SPEAKER smiles)|You do, in fact!|(She inches closer) +(SPEAKER улыбается)|На самом деле, так оно и есть!|(Она придвигается еще ближе) +(The SPEAKER smiles gently)|Aren't you precious~ +(SPEAKER нежно улыбается)|Разве ты не прелесть~ +(The SPEAKER looks flustered)|Well, it's been a long day...|I could use a hug... +(SPEAKER выглядит взволнованной)|Что ж, это был долгий день...|Я бы не отказалась от обнимашек... +(The SPEAKER smirks and reaches for your body) +(SPEAKER ухмыляется и тянется к вашему телу) +(The SPEAKER makes a beeping noise)|Loading cuddle module... +(SPEAKER издает звуковой сигнал)|Загрузка модуля объятий... +Got something for me? +У тебя есть что-то для меня? +(Present your body to her~) +(Подарить ей свое тело~) +(The SPEAKER smiles)|Am I thinking what you're thinking? +(SPEAKER улыбается)|Я думаю о том же, о чем и ты? +(The SPEAKER grins)|Why yes, I have just the thing~ +(SPEAKER ухмыляется)|Почему бы и нет, у меня как раз есть то, что нужно~ +(The SPEAKER blushes)|Oh... let me check. +(SPEAKER краснеет)|О... позволь мне проверить. +(The SPEAKER smirks)|Be careful what you ask for~ +(SPEAKER ухмыляется)|Будь осторожна с тем, о чем просишь~ +(The SPEAKER pauses)|Calculating strictness threshold... +(SPEAKER приостанавливается)|Вычисляю порог строгости... +Yes please! (Hold out your wrists) +Да, пожалуйста! (Протянуть запястья) +(Nod and blush) +(Кивнуть и покраснеть) +Maybe not... +Может быть и нет... +(Shake your head) +(Покачать головой) +Why don't we have a little fun? +Почему бы нам немного не повеселиться? +(Play with her) +(Поиграть с ней) +(The SPEAKER smiles)|Am I thinking what you're thinking? +(SPEAKER улыбается)|Я думаю о том же, о чем и ты? +(The SPEAKER grins)|Why yes, I have just the thing~ +(SPEAKER ухмыляется)|Почему бы и нет, у меня как раз есть то, что нужно~ +(The SPEAKER blushes)|Oh... let me check. +(SPEAKER краснеет)|О... позволь мне проверить. +(The SPEAKER smirks)|Be careful what you ask for~ +(SPEAKER ухмыляется)|Будь осторожна с тем, о чем просишь~ +(The SPEAKER giggles)|Mmmph~ +(SPEAKER хихикает)|Мммф~ +(The SPEAKER pauses)|Calculating strictness threshold... +(SPEAKER делает паузу)|Рассчитываю порог строгости... +You look quite distracted... +Вы выглядите довольно рассеянной... +(Help her with her distraction) +(Помочь ей с её возбуждением) +(The SPEAKER nervously smiles)|H-how'd you know? +(SPEAKER нервно улыбается)|К-как вы узнали? +(The SPEAKER smiles)|Indeed I am... Won't you assist me? +(SPEAKER улыбается)|Так и есть... Вы не поможете мне? +(The SPEAKER wiggles excitedly)|Y-yes miss! +(SPEAKER возбужденно ерзает)|Д-да, мисс! +(The SPEAKER shakes her head while blushing)|W-what makes you think that? +(SPEAKER качает головой и краснеет)|С чего вы это взяли? +(The SPEAKER computes something)|Error... +(SPEAKER что-то вычисляет)|Ошибка... +(The SPEAKER nods)|Mmmph! +(SPEAKER кивает)|Мммф! +(Give her release with a magic wand) +(Подарить ей разрядку с помощью волшебной палочки) +(Set her toys to high for a while) +(На некоторое время включить ее игрушки) +(Cuddle with her for 2 turns) +(Обнимать её 2 хода) +(The SPEAKER trembles with pleasure) +(SPEAKER дрожит от удовольствия) +(The SPEAKER struggles to let go due to her chastity belt) +(SPEAKER пытается вырваться из своего пояса верности) +Let's go for a walk! +Пойдем на прогулку! +(Jump excitedly, presenting your collar for a leash) +(Возбужденно подпрыгивать, показывая на ошейник с поводком) +(The SPEAKER smiles)|Sure! I'll take you for a walk, but only if you behave. +(SPEAKER улыбается)|Конечно! Я возьму тебя на прогулку, но только если ты будешь хорошо себя вести. +(The SPEAKER smiles)|Yes, I haven't had a nice walk in a while~ +(SPEAKER улыбается)|Да, давненько я не была на приятной прогулке~ +(The SPEAKER blushes)|Sure! I'll make sure you don't get into trouble~ +(SPEAKER краснеет)|Конечно! Я позабочусь, чтобы у тебя не было неприятностей~ +(The SPEAKER giggles)|Time for walkies! +(SPEAKER хихикает)|Время для прогулок! +(The SPEAKER calculates)|Routing coordinates... +(SPEAKER вычисляет)|Координаты маршрута... +(Ask her for help) +(Попросить её о помощи) +(Ask her for help) +(Попросить её о помощи) +(Never mind...) +(Ничего...) +(Are you sure? She might see you as being submissive) +(Вы уверены? Она может счесть вас сабмиссивом) +(The SPEAKER prefers you the way you are) +(SPEAKER предпочитает видеть вас такой, какая вы есть) +(The SPEAKER will help you out of your restraints) +(SPEAKER помогает вам освободиться от ограничителей) +(You decide to deal with your problems yourself.) +(Вы решаете сами справиться со своими проблемами.) +(Plead with her to unlock you with a Command Word) +(Умолять её разблокировать вас Командным Словом) +(Yes!) +(Да!) +(Never mind...) +(Ничего...) +(Are you sure? She might see you as being submissive) +(Вы уверены? Она может счесть вас сабмиссивом) +(The SPEAKER would rather 'conserve her mana') +(SPEAKER предпочла бы 'сберечь свою ману') +(The SPEAKER utters a command word on you) +(SPEAKER произносит командное слово, обращенное к вам) +(Your magical locks continue to restrain you.) +(Ваши магические замки продолжают сдерживать вас.) +(Plead with her to unlock your restraints) +(Умолять её снять с вас оковы) +(Yes!) +(Да!) +(Never mind...) +(Ничего...) +(Are you sure? She might see you as being submissive) +(Вы уверены? Она может счесть вас сабмиссивом) +(The SPEAKER would rather not give up a magic key) +(SPEAKER предпочла бы не отдавать магический ключ) +(The SPEAKER doesn't have any keys) +(У SPEAKER нет никаких ключей) +(The SPEAKER giggles and gives you a key) +(SPEAKER хихикает и дает вам ключ) +(You remain locked tight.) +(Вы остаетесь надежно запертыми.) +(Stop receiving help) +(Остановить получение помощи) +(Confirm? You will have to ask again to get help.) +(Подтверждаете? Вам придется обратиться за помощью еще раз.) +(Stop receiving help) +(Остановить получение помощи) +(Never mind...) +(Ничего...) +(The SPEAKER will no longer help you.) +(SPEAKER больше не будет вам помогать.) +(You sigh as you realize you really need her help.) +(Вы вздыхаете, понимая, что вам действительно нужна ее помощь.) +(Kick her out of your party) +(Исключить её из вашей группы) +(Confirm? She will stop following you) +(Подтверждаете? Она перестанет следовать за вами) +(Remove from party) +(Удалить из группы) +(Never mind...) +(Ничего...) +(The SPEAKER understands.) +(SPEAKER понимает.) +(You decide to keep her.) +(Вы решаете оставить ее у себя.) +(Add her to your party) +(Добавить ее в свою группу) +(Confirm? She will follow you across floors. You can only have 3 party members) +(Подтверждаете? Она будет следовать за вами через этажи. У вас может быть только 3 участника группы) +(Add to party) +(Добавить в группу) +(Never mind...) +(Ничего...) +(The SPEAKER is happy to join you) +(SPEAKER рада присоединиться к вам) +(You decide not to.) +(Вы решаете этого не делать.) +(Sell items) +(Продать предметы) +(Buy items) +(Купить предметы) +(Pick up her leash) +(Взять её поводок) +(Release her leash) +(Отпустить её поводок) +Dollmaker +Кукольница +The Dollmaker throws a device to the ground, teleporting her instantly! +Кукольник бросает устройство на землю и мгновенно телепортируется! +The Dollmaker's necklace flashes as you find yourself suddenly restrained! (+RestraintAdded) +Ожерелье кукольницы вспыхивает, и вы внезапно обнаруживаете, что вас сковывают! (+RestraintAdded) +The Dollmaker's overbearing presence captivates you~ (DamageTaken) +Властное присутствие Кукольницы очаровывает вас~ (DamageTaken) +The Dollmaker snaps her fingers as you find yourself locked! (DamageTaken) +Кукольница щелкает пальцами, и вы оказываетесь запертой! (DamageTaken) +Dollmaker +Кукольница +The Dollmaker sinks into a pool of latex! +Кукольница тонет в луже латекса! +The Dollmaker's necklace flashes as you find yourself suddenly restrained! (+RestraintAdded) +Ожерелье кукольницы вспыхивает, и вы внезапно обнаруживаете, что вас сковывают! (+RestraintAdded) +The Dollmaker suggests that you surrender. (DamageTaken) +Кукольница предлагает вам сдаться. (DamageTaken) +The Dollmaker snaps her fingers as you find yourself locked! (DamageTaken) +Кукольница щелкает пальцами, и вы оказываетесь запертой! (DamageTaken) +DOLLMAKER +КУКОЛЬНИЦА +The Dollmaker falls kneeling to the floor, admitting defeat! +Кукольница опускается на колени, признавая свое поражение! +The Dollmaker snaps her fingers, and many robotic arms restrain you! (+RestraintAdded) +Кукольница щелкает пальцами, и множество роботизированных рук сковывают вас! (+RestraintAdded) +The Dollmaker orders you to KNEEL! (DamageTaken) +Кукольница приказывает вам встать на КОЛЕНИ! (DamageTaken) +The Dollmaker snaps her fingers as you find yourself locked! (DamageTaken) +Кукольница щелкает пальцами, и вы оказываетесь запертой! (DamageTaken) +Fuuka +Фуука +Fuuka surrounds herself in defensive talismans! +Фуука окружает себя защитными талисманами! +Fuuka wraps you tightly in restraints! (+RestraintAdded) +Фуука обертывает вокруг вас тугие ограничители! (+RestraintAdded) +Fuuka squeezes your breasts and smiles! (DamageTaken) +Фуука сжимает вашу грудь и улыбается! (DamageTaken) +Fuuka snaps her fingers and all your restraints are locked! (DamageTaken) +Фуука щелкает пальцами, и все ваши ограничители запираются! (DamageTaken) +Fuuka +Фуука +Fuuka surrounds herself in defensive talismans one more time! +Фуука еще раз окружает себя защитными талисманами! +Fuuka wraps you furiously in restraints! (+RestraintAdded) +Фуука яростно обертывает вокруг вас ограничители! (+RestraintAdded) +Fuuka pouts as she tickles you relentlessly! (DamageTaken) +Фуука надувает губки, безжалостно щекоча вас! (DamageTaken) +Fuuka snaps her fingers and all your restraints are locked! (DamageTaken) +Фуука щелкает пальцами, и все ваши ограничители запираются! (DamageTaken) +(You find a girl wearing an ornate dress)|(She glances at you)|And who might you be? +(Вы видите девушку в изысканном платье)|(Она бросает на вас взгляд)|И кто же ты такая? +I should be asking the same of you. +Я должна была бы спросить то же самое у тебя. +(Growl at her) +(Рычать на нее) +(She smiles)|My name is Fuuka, with the letters for Wind and Song.|Are you going to introduce yourself? +(Она улыбается)|Меня зовут Фуука, с иероглифами, обозначающими Ветер и Песню.|А ты собираешься представиться? +What kind of name is that? +Что это за имя такое? +(SPEAKER frowns)|It means Windsong!|I bet yours isn't anywhere nearly as cool. +(SPEAKER хмурится)|Это означает 'Песня ветра'!|Держу пари, что твое имя и близко не такое классное. +(SPEAKER looks enraged)|Because names and meanings are different things!|My name uses the script from the Old Civilization!|You're just a poser! +(SPEAKER выглядит разъяренной)|Потому что имена и значения - это разные вещи!|В моем имени используется письменность Древней Цивилизации!|Ты просто дура! +Why not just call yourself Windsong? +Почему бы просто не назвать себя Песней Ветра? +### (...) + +### (...) + +I am an adventurer. +Я искательница приключений. +Mmmmph. +Ммммфх. +(SPEAKER blushes)|Ah, right then... +(SPEAKER краснеет)|Ах, тогда ладно... +### (...) + +(SPEAKER giggles)|Very well. I don't really care who you are. +(SPEAKER смеется)|Хорошо-хорошо. На самом деле мне все равно, кто ты такая. +I do not need to introduce myself. +Мне не нужно представляться. +Neither do I. +Мне тоже. +### (...) + +### (...) + +I'm an adventurer. And who are you? +Я искательница приключений. А кто ты такая? +Mmmmm... (Blush) +Ммммм... (Краснеет) +(She grins)|My name is Fuuka, with the letters for Wind and Song.|The reincarnated ones call me Windsong,|they aren't very bright though. +(Она улыбается)|Меня зовут Фуука, символы в моём имени означают Ветер и Песню.|Перерожденные зовут меня Песней Ветра,| хотя они не очень сообразительны. +Reincarnated ones? +Перерожденные? +(SPEAKER tilts her head)|I believe the term is 'Zombie' in the common tongue. +(SPEAKER наклоняет голову)|Я полагаю, что на обычном языке этот термин означает 'Зомби'. +(SPEAKER enjoys the discussion)|When most people die, their spirits pass on to the next life.|But some stay in this world, and with the right blessings,|one can grant them a second chance!|I plan to give them all proper bodies...|Eventually. +(SPEAKER наслаждается обсуждением)|Когда большинство людей умирают, их души переходят в следующую жизнь.|Но некоторые остаются в этом мире, и при правильном благословении|можно дать им второй шанс!|Я планирую дать им всем подходящие тела...|Когда-нибудь. +How do they get reincarnated? +Как они перерождаются? +(SPEAKER enjoys the discussion)|No, they're people!|People who died long ago.|Now they live a new life, safeguarded by my Resurrection Arts! +(SPEAKER наслаждается обсуждением)|Нет, они люди!|Люди, которые умерли давным-давно.|Теперь они живут новой жизнью, защищенные моим Искусством Воскрешения! +Aren't they dolls? They can barely speak. +Разве они не куклы? Они едва могут говорить. +(SPEAKER pouts)|Why you...|Long ago, I made a contract with Ninril to guide lost souls back to her.|Do you doubt her blessing?! +(SPEAKER надувает губки)|Почему ты...|Давным-давно я заключила контракт с Нинрил, чтобы направлять потерянные души обратно к ней.|Ты сомневаешься в ее благословении?! +Your Resurrection Arts don't seem very effective. +Твое искусство Воскрешения кажется не очень эффективным. +(SPEAKER looks puzzled)|People don't die anymore, but there are still lots of souls out there.|Whenever they stumble into the dungeon, searching for answers,|I'm still here, waiting! +(SPEAKER выглядит озадаченной)|Люди больше не умирают, но здесь все еще много душ.|Всякий раз, когда они натыкаются на подземелье в поисках ответов,|я все еще здесь, жду! +What do you do now that people don't die? +Что ты делаешь теперь, когда люди не умирают? +### (...) + +(SPEAKER chortles)|So you've noticed!|As you can see, Ninril is very powerful~ +(SPEAKER хихикает)|Итак, ты заметила!|Как ты можешь видеть, Нинрил очень могущественна~ +You don't look very old yourself. +Ты и сама выглядишь не очень старой. +(SPEAKER frowns)|Divine blessings shouldn't be used for such silly things! +(SPEAKER хмурится)|Божественные благословения не следует использовать для таких глупостей! +Can you resurrect my back? It kind of hurts right now... +Ты можешь воскресить мою спину? Прямо сейчас она немного болит... +(SPEAKER smiles)|Those latex-clad idiots don't understand a thing.|Science can only get you so far!|Worship is where it's at! +(SPEAKER улыбается)|Эти покрытые латексом идиоты ничего не понимают.|Наука может только завести вас в густые дебри!|Поклонение - вот где истина! +The Alchemists are always looking for a youth potion. +Алхимики постоянно ищут зелье молодости. +(SPEAKER folds her arms)|Oh ho ho~|That's none of your business, for it is also part of my contract|to keep outsiders from interfering with the catacombs below! +(SPEAKER складывает руки на груди)|О-хо-хо~|Это не твое дело, потому что это также часть моего контракта|не позволять посторонним вторгаться в катакомбы внизу! +Do you know what's on the next floor? +Ты знаешь, что находится на следующем этаже? +(SPEAKER blushes)|Nope, nothing at all!|In fact, whatever it is, you won't find it down here!|Now, would you like to become my pet? +(SPEAKER краснеет)|Нет, вообще без понятия!|На самом деле, что бы это ни было, внизу ты этого не найдешь!|А теперь, не хочешь ли ты стать моим питомцем? +Do you know anything about the Old Civilization? +Ты знаешь что-нибудь о Древней Цивилизации? +(SPEAKER shrugs)|Oh really...|Must be the fey playing tricks, hehe... +(SPEAKER пожимает плечами)|О, действительно...|Должно быть, феи так прикалываются, хе-хе... +I've seen a few robots running around! +Я видела, как несколько роботов бегали по округе! +(SPEAKER looks nervous)|Oh yeah? Where'd you hear that?|The 'adventurer's guild,' huh?|Why don't you just leave the dead to rest~ +(SPEAKER выглядит нервной)|О, да? Где ты это слышала?| 'Гильдия искателей приключений', хм?|Почему бы тебе просто не оставить мертвых в покое~ +I heard there was an ancient facility on this island. +Я слышала, что на этом острове был комплекс древних. +(SPEAKER sighs)|Look, the Goddess doesn't tell me everything.|Now then, I have a job to do and some pets to manage.|Please stop asking questions! +(SPEAKER вздыхает)|Послушайте, Богиня не говорит мне всего.|Итак, у меня есть работа, которую я должна выполнить.|И несколько питомцев, за которыми нужно ухаживать.|Пожалуйста, перестань задавать вопросы! +Is Sariel Vinlaga down here? +Сариэль Винлага внизу? +(SPEAKER frowns)|What's with all the questions!|There totally isn't some kind of doll processing facility here!|Perhaps you're a brainwashed doll yourself? +(SPEAKER хмурится)|К чему все эти вопросы!|Здесь совершенно точно нет никакого предприятия по производству кукол!|Может быть, ты сама кукла с промытыми мозгами? +Does DressUp Co. get their 'cyber doll' products from here? +Получает ли Корпорация Моды свои продукты 'кибер-кукла' отсюда? +(SPEAKER chuckles)|I smell a hint of jealousy~ +(SPEAKER хихикает)|Я чувствую намек на угрозу~ +I don't want to be a pet, so you'll have to force me. +Я не хочу быть питомцем, так что тебе придется заставить меня. +(SPEAKER jumps up and down)|You would!?|That's wonderful~|My resurrection magic can make you young again forever!|All you have to do is pledge your soul to Nirin, the Goddess of Restoration! +(SPEAKER подпрыгивает вверх-вниз)|Ты бы хотела!?|Это замечательно~|Моя магия воскрешения может сделать тебя молодой навсегда!|Все, что тебе нужно сделать, это отдать свою душу Нирин, богине Восстановления! +I'd love to be your pet! +Я бы хотела быть твоим питомцем! +(SPEAKER pouts)|Hmmph. Suit yourself. +(SPEAKER надувает губки)|Хммфх. Как хочешь. +Pledge my soul? That changes things... +Отдать свою душу? Это все меняет... +### (...) + +I am an adventurer. +Я искательница приключений. +Mmmmph. +Ммммфх. +(SPEAKER giggles)|Hehe... you sound interested. +(SPEAKER смеется)|Хе-хе... похоже, тебе весело. +### (...) + +(SPEAKER frowns)|Never ask a woman about her age! +(SPEAKER хмурится)|Никогда не спрашивай женщину о ее возрасте! +I take it you're the hag in charge? +Я так понимаю, ты здесь главная ведьма? +You are in charge, right? +Ты здесь главная, верно? +(Giggle) +(Хихикать) +### (...) + +Don't mess with me, little girl. +Не связывайся со мной, малышка. +Mmpphgh? (Pout at her) +Ммффхгхф? (Дуться на нее) +(She smirks)|So you're that kind of visitor, huh? +(Она ухмыляется)|Значит, ты гость такого рода, да? +That's right. How powerful are you? +Верно. Насколько ты сильна? +(She cracks her knuckles)|I have been practicing the resurrection arts for a thousand years. +(Она хрустит костяшками пальцев)|Я практикую искусство воскрешения уже тысячу лет. +(She smiles)|All the zombies you seee in the Graveyard?|They are my pets, and I care for each and every one of them. +(Она улыбается)|Все зомби, которых ты видела на кладбище,|это мои домашние животные, и я забочусь о каждом из них. +What the heck are 'Resurrection Arts'? +Что, черт возьми, такое 'Искусство воскрешения'? +### (...) + +### (...) + +It's time for a true display of skill! +Пришло время по-полной проявить свое мастерство! +Hmmph. (Look away) +Хммф. (Отвести взгляд) +(She grins)|We'll wipe that pout off your face soon enough... +(Она улыбается)|Мы достаточно скоро сотрем эту надутую гримасу с твоего лица... +(Shake your head) +(Покачать головой) +(She frowns)|Well, you will soon. +(Она хмурится)|Что ж, скоро узнаешь. +Pfff. Never heard of it. +Пффф. Никогда об этом не слышала. +I bet I could do better. +Держу пари, я могла бы сделать это лучше. +(Giggle) +(Хихикать) +### (...) + +Why does that matter to you? +Почему это имеет для тебя значение? +(Stare at her silently, maintaining your posture) +(Молча смотрите на нее, сохраняя свою позу) +(She grins)|I am in charge of this place.|Everything that goes through here goes through me.|You may address me as Fuuka Windsong. +(Она улыбается)|Я отвечаю за это место.|Все, что происходит здесь, проходит через меня.|Ты можешь обращаться ко мне 'Фуука Песня ветра'. +By what authority? +По какому праву? +(SPEAKER tilts her head)|Ummmm.... uh...|The Old Civilization! Of course!|I've been keeping their traditions for centuries. +(SPEAKER наклоняет голову)|Ммммм.... ух...|Древняя цивилизация! Конечно!|Я храню их традиции на протяжении веков. +(SPEAKER blushes)|Umm... That's because...|Oh shut up! +(SPEAKER краснеет)|Ммм... Это потому, что...|Ох, заткнись! +You don't sound too confident. +Ты звучишь не слишком уверенно. +Who are you anyway? +Кто ты вообще такая? +Who are you anyway? +Кто ты вообще такая? +Fair enough. I am an adventurer. +Логично. Я искатель приключений. +Hmmph. +Хммф. +(SPEAKER giggles)|Is that a challenge? +(SPEAKER смеется)|Это вызов? +(Nod calmly) +(Спокойно кивает) +(SPEAKER grins)|Is that a challenge? +(SPEAKER ухмыляется)|Это вызов? +We'll see about that. +Мы еще посмотрим. +Hmmph. (Scoff into your gag) +Хммф. (Усмехайтесь в свой кляп) +It is indeed! +Это действительно так! +(Giggle) +(Хихикать) +### (...) + +I'm an adventurer, miss. +Я искательница приключений, мисс. +Mmmpphh~ (Moan and wiggle seductively) +Мммпппхх~ (Стонать и соблазнительно извиваться) +(She grins)|Oh look at you!|I'm going to dress you up and make you my pet!|You can have all the scritches and snuggles you want!|My name's Fuuka! +(Она улыбается)|О, посмотри на себя!|Я собираюсь нарядить тебя и сделать своим питомцем!|У тебя могут быть все щипки и прижимания, какие ты захочешь!|Кстати, меня зовут Фуука! +A pet? What kind? +Питомцем? В каком смысле? +(SPEAKER hops up and down excitedly)|Oh I've got dresses!|And all sorts of fun gear!|Maybe even this huge gag for you to chew on! +(SPEAKER возбужденно подпрыгивает)|О, у меня есть платья!|И всевозможные забавные приспособления!|Может быть, даже этот огромный кляп, который ты сможешь пососать! +(SPEAKER grins)|Having second thoughts? +(SPEAKER ухмыляется)|Или у тебя другие мысли? +That sounds... harsh. +Это звучит... жестоко. +...Maybe +...Может быть +Exciting! +Захватывающе! +That sounds great. But who are you miss? +Звучит заманчиво. Но кто вы такая, мисс? +Mmmmph~ +Ммммф~ +(SPEAKER giggles)|Hehe... We will have so much fun~ +(SPEAKER смеется)|Хе-хе... Нам будет очень весело~ +### (...) + +(SPEAKER giggles)|You don't have to consent, dear~ +(SPEAKER смеется)|Ты не обязана соглашаться, дорогая~ +I never said I consented to being a pet! +Я никогда не говорила, что согласна быть питомцем! +(Give her a puzzled look and shake your head) +(Озадаченно взглянуть на неё и покачать головой) +No way! +Ни за что! +(Shake your head) +(Покачать головой) +(Sigh and shrug) +(Вздохнуть и пожать плечами) +(Attack her without saying anything) +(Напасть на нее, ничего не сказав) +(SPEAKER clears her throat)|I am the one tasked with keeping this graveyard pure and holy.|The reincarnated ones who roam this place do so with my permission.|But what of you? I do not remember striking a deal with you.|Are you here to challenge me? +(SPEAKER прочищает горло)|Мне поручено содержать это кладбище в чистоте и святости.|Перерождённые, которые бродят по этому месту, делают это с моего разрешения.|Но что насчет тебя? Я не помню, чтобы позволяла тебе это делать.| Ты здесь, чтобы бросить мне вызов? +I do what I want. +Я делаю то, что хочу. +(Glare at her and scoff) +(Свирепо посмотреть на нее и усмехнуться) +(SPEAKER makes a big grin)|I take that you wish to challenge me?|Very well!|Come at me! +(SPEAKER широко улыбается)|Я так понимаю, ты хочешь бросить мне вызов?|Очень хорошо!|Иди сюда! +About those 'reincarnated ones'... +Об этих 'перерожденных'... +You have no power over me +У тебя нет надо мной власти +Hmmph. (Stand proudly) +Хммф. (Гордо выпрямиться) +(SPEAKER smiles)|Then let us fight!|If I win, I will make you my pet.|If you win, I will let you pass. +(SPEAKER улыбается)|Тогда давай сражаться!|Если я выиграю, я сделаю тебя своим питомцем.|Если ты выиграешь, я дам тебе пройти. +I don't want to fight, miss... +Я не хочу ссориться, мисс... +Mmph! (Shake your head frantically) +Ммфх! (Отчаянно мотать головой) +(SPEAKER giggles)|Come now, I want to see how good you are! +(SPEAKER смеется)|Ну же, я хочу посмотреть, насколько ты хороша! +Yes, I am here to fight you. +Да, я здесь, чтобы сразиться с тобой. +(Nod) +(Кивнуть) +(SPEAKER smiles)|Then what are we waiting for? +(SPEAKER улыбается)|Тогда чего мы ждем? +You're on! +Твой выход! +Hmmmph! +Хммфх! +Let us duel! +Сразимся на дуэли! +Mmmmmghh! +Ммммммхх! +I suppose... +Я полагаю... +Mmmmph... +Ммммфх... +(SPEAKER smiles as she stands over you)|Well well. Look who won. +(SPEAKER улыбается, стоя над тобой)|Ну и ну. Посмотрите, кто победил. +(SPEAKER nods and giggles)|Absolutely.|Allow me to present to you, my prized pet collar!|I save it only for my favorite pets.|That's right! You're my favorite pet now~ +(SPEAKER кивает и хихикает)|Полная победа.|Позвольте мне представить тебе мой драгоценный ошейник для питомцев!|Я храню его только для своих любимых питомцев.|Верно! Теперь ты мой любимый питомец~ +(SPEAKER giggles)|You're not in a position to resist.|Now then, where did I put that collar... +(SPEAKER хихикает)|Ты не в том положении, чтобы сопротивляться.|Итак, куда я положила этот ошейник?.. +(SPEAKER smiles)|It's a magical spell that seals your power temporarily~|I use it for my pets when they're being unruly...|(She brandishes a collar) Now including you! +(SPEAKER улыбается)|Это заклинание, которое временно запечатает твою силу~|Я использую его на своих питомцах, когда они становятся неуправляемыми...|(Она размахивает ошейником) Теперь ты в их числе! +What's this weird magic? +Что это за странная магия? +You beat me fair and square. +Ты победила меня честно. +Mmmph. (Submit) +Ммммфх. (Подчиниться) +You cheated! +Ты жульничала! +Mmmph! (Struggle weakly) +Мммфх! (Пытаться сопротивляется) +(Sigh and accept your fate) +(Вздохнуть и принять свою судьбу) +(Accept the collar eagerly) +(С готовностью принять ошейник) +(Accept the collar begrudgingly) +(Неохотно принять ошейник) +(SPEAKER presents you with your collar...)|(She locks it around your neck)|You are free to go now, dear! +(SPEAKER презентует вам ошейник...)|(Она застегивает его у вас на шее)|Теперь ты можешь идти, дорогуша! +(SPEAKER puts up a wall of talismans to regain her strength)|I'm... I'm not finished yet! +(SPEAKER возводит стену из талисманов, чтобы восстановить свои силы)|Я... Я еще не закончила! +(SPEAKER is out of breath)|I... can't... believe... it...|She drops her keys... +(SPEAKER запыхалась)|Я... не могу... поверить... в это...|Она роняет свои ключи... +(SPEAKER looks flabbergasted)|R-really? Okay... I'll give you a reward then... +(SPEAKER выглядит ошеломленной)|Д-действительно? Хорошо... Тогда я дам тебе награду... +(Submit to her anyway) (Gain a special collar) +(Всё равно подчиниться ей)(На вас наденут специальный ошейник) +(SPEAKER resists but ultimately you force a gag into her mouth)|MMMMMPH! +(SPEAKER сопротивляется, но в конце концов вы засовываете ей в рот кляп)|МММММФХ! +(Gag her) +(Заткнуть её кляпом) +(This ghost had something to say,|but it appears you've run into a bug instead)|Please report this to Ada18980 on deviantart! +(Этот призрак хотел что-то сказать, но, похоже, вместо этого вы столкнулись с ошибкой)|Пожалуйста, отправьте репорт об этом Ada18980 на deviantart! +(Continue) +(Продолжить) +(Make a smug face as you walk past) +(Сделать самодовольное лицо, проходя мимо) +Thank you! +Спасибо! +Mmmph! +Мммфх! +I don't need your advice, strange ghostly person. +Мне не нужны твои советы, странный призрачный человек. +(Glare at her) +(Свирепо посмотреть на неё) +Oh, those people that locked you up?|I dealt with them.|Now come along, there's no time to waste! +О, те люди, которые заперли тебя?|Я разобралась с ними.|А теперь пойдем, нельзя терять времени! +(The SPEAKER giggles)|Treasure? The treasure isn't going anywhere.|Plus, I made a few enemies on the way.|We better not wait till they come back. +(SPEAKER смеется)|Сокровище? Сокровище никуда не денется.|К тому же, по пути я нажила себе несколько врагов.|Нам лучше не ждать, пока они вернутся. +But what about the treasure!? +Но как же быть с сокровищем?! +(The SPEAKER ponders your question)|I think we'll have to talk about compensation|AFTER we get out of here. +(SPEAKER обдумывает ваш вопрос)|Я думаю, нам придется поговорить о компенсации|ПОСЛЕ того, как мы выберемся отсюда. +So how much is this going to cost me? +Итак, во сколько мне это обойдется? +(You hear footsteps. It's the SPEAKER!)|Why look at you!|Well you seem to be in a bind, don't you? +(Вы слышите шаги. Это SPEAKER!)|Посмотрите-ка!| Ты, кажется, попала в затруднительное положение, не так ли? +Not to worry! I'll get you out of here! +Не волнуйся! Я вытащу тебя отсюда! +Hehe, alright! If that's what you want~ +Хе-хе, хорошо! Если это то, чего ты хочешь~ +(Nod slowly) +(Медленно кивнуть) +(Shake your head and refuse rescue) +(Покачать головой и отказаться от спасения) +Yes please! +Да, пожалуйста! +Actually I was having fun... +На самом деле мне тут весело... +(The SPEAKER, your longtime friend, smiles)|Well well, if it isn't you again!|I see that you've decided to challenge the dungeon again.|Don't forget to bring some gold back with you,|there's a fee for rescue~ +(SPEAKER, ваш давний друг, улыбается)|Ого, это же снова ты!|Я вижу, ты решила вновь бросить вызов подземелью.|Не забудь захватить с собой немного золота,|за спасение взимается плата~ +Can you help with these restraints? +Можешь помочь с этими ограничителями? +Pfffmmm hhmmph mmph... (Please Help Me) +Пфффмммм, хххммфх, ммфх... (Пожалуйста, помоги мне) +No can do! Even I can't get those off of you. +Не могу! Даже я не смогу снять это с тебя. +Caught by...? +Спасение...? +Hah!|You've been here a million times!|You obviously know how dangerous it is, yes? +Хах!|Ты была здесь миллион раз!|Ты, очевидно, знаешь, насколько здесь опасно, да? +F-fee? There's a fee? +П-плата? Есть плата? +Yep! It'll cost ya!|Quite worth it if you ask me.|Unless you'd like to spend the rest of your life in chains! +Да! Это будет стоить тебе дорого!|Но по-моему, оно того стоит.|Если только ты не хочешь провести остаток своей жизни в цепях! +Will you buy my loot? +Ты купишь мою добычу? +(Show her your loot) +(Показать ей свою добычу) +Absolutely! I offer the standard market rate for anything.|I'll take enchanted items too!|I've got plenty of volunteers to check for curses~ +Конечно! Я предлагаю стандартную рыночную цену за все, что угодно.|Я также возьму зачарованные предметы!|У меня полно добровольцев для проверки их на наличие проклятий~ +Got something you want to show me? +Есть что-то, что ты хочешь мне показать? +(Sell Items) +(Продать предметы) +(Sell Whole Stacks of Items) +(Продать целые стопки предметов) +Mmmph! +Мммфх! +Daww! What a cutie!|(She smiles and pats your head gently) +Ваау! Какая милашка!|(Она улыбается и нежно гладит вас по голове) +Do you have anything for sale? +У тебя есть что-нибудь на продажу? +(Look around for items to buy) +(Осмотритесь в поисках товаров для покупки) +I'm sorry sweetie, I don't sell merchandise here.|Who would set up a shop inside a dungeon? That's crazy!|But you adventurers bring in a steady supply of loot,|so if you've got something to sell me, I'll take it off your hands~|You can also talk to my guests, perhaps they have something for you. +Прости, милая, я здесь не продаю товары.|Кто бы мог открыть магазин в подземелье? Это безумие!|Но вы, искатели приключений, обеспечиваете постоянный приток добычи,|так что, если у тебя есть что мне продать, я с удовольствие|заберу это из твоих рук~ Ты также можешь поговорить с моими гостями,|возможно, у них есть что-то для тебя. +(Return) +(Назад) +(The SPEAKER brings you safely back to her shop)|There! Nice and safe.|Now, as for my fee...|That'll be RESCUECOST gold pieces! +(SPEAKER доставляет вас в целости и сохранности обратно в ее магазин)|Вот! Хорошо и безопасно.|Теперь, что касается моей оплаты...|За всё с тебя RESCUECOST золотых! +Right! Here's RESCUECOST gp. +Хорошо! Вот RESCUECOST зол. +Mmmph. (Nod your head and pay RESCUECOST gp) +Ммммфх. (Кивнуть головой и заплатить RESCUECOST зол.) +(The SPEAKER smiles)|Pleasure doing business with ya~ +(SPEAKER улыбается)|Приятно иметь с тобой дело~ +Mind adding it to my tab? +Можно добавить это в мой счет? +(Shake your head regrettably.) +(С сожалением покачать головой.) +(The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|But I won't be letting you out of those restraints~ +(SPEAKER потирает подбородок)|А... хм, ну что ж...|Думаю, на этот раз я тебя отпущу.|Но я не позволю тебе освободиться от этих оков~ +(The SPEAKER rubs her chin)|Ah... hmm, well...|I guess I'll let you off this time.|You're a good customer, after all. +(SPEAKER потирает подбородок)|А... хм, ну что ж...|Думаю, на этот раз я тебя отпущу.|В конце концов, ты хороший клиент. +(The SPEAKER folds her arms)|Come on now, I can hear the gold jingling in your pocket! +(SPEAKER складывает руки на груди)|Давай же, я слышу, как золото позвякивает у тебя в кармане! +Pretty please? I promise I'll pay you back. +Ну пожа-а-алуйста? Я обещаю, что верну тебе деньги. +(Be insistent) +(Настаивать) +(The SPEAKER rubs her chin)|Fine, I believe you.|But I won't be letting you out of those restraints! +(SPEAKER потирает подбородок)|Хорошо, я тебе верю.|Но я не позволю тебе освободиться от этих оков! +(The SPEAKER sighs)|Fine, I believe you.|You better believe I won't forget, though! +(SPEAKER вздыхает)|Хорошо, я тебе верю.|Но тебе стоит знать, что я этого не забуду! +(The SPEAKER folds her arms)|Your adventures have cost me a pretty penny.|I can't stay in business if my clients keep running off without paying.|Look, I'll cut you a deal, you help me, I help you. Fair? +(SPEAKER складывает руки на груди)|Твои приключения обошлись мне в кругленькую сумму.|Я не могу оставаться в бизнесе, если мои клиенты продолжают убегать, не заплатив.|Слушай, я заключу с тобой сделку, ты поможешь мне, я помогу тебе. Справедливо? +(Help her test cursed armors) +(Помочь ей протестировать проклятые доспехи) +(Add cursed restraints as collateral) +(Надеть проклятые ограничители в качестве залога) +(Wear a collar to help advertise her business) +(Надеть ошейник, чтобы помочь ей рекламировать бизнес) +(Wear a catsuit to help advertise her business) +(Надеть комбинезон, чтобы помочь ей рекламировать бизнес) +(Actually... just pay her the RESCUECOST gold) +(Все же... просто заплатить ей RESCUECOST золотых) +(The SPEAKER holds up a RESTRAINTNAME)|I've bought some armors from an adventurer lately,|but I don't know if they're safe to wear.|Why don't you try it on for me?|I'll postpone your debt for a later time. +(SPEAKER держит RESTRAINTNAME)|Недавно я купила несколько доспехов у авантюристки,|но я не знаю, безопасно ли их носить.|Почему бы тебе не примерить их для меня?|Я отложу твой долг на более позднее время. +(The SPEAKER holds up a RESTRAINTNAME)|I need to make sure you won't go running off again.|This RESTRAINTNAME here has a special seal on it.|I can get you out of it, of course, but you'll have to pay up first. +(SPEAKER держит RESTRAINTNAME)|Мне нужно убедиться, что ты снова не сбежишь.|На этом RESTRAINTNAME вот тут есть специальная печать.|Я, конечно, могу вытащить тебя из него, но сначала тебе придется заплатить. +(The SPEAKER holds up a RESTRAINTNAME)|Your captors are quite the market for high-security restraints.|If you get captured by them, maybe they'll see my logo on this collar!|It's quite comfy and secure,|you'll end up feeling more submissive the more your wear it. +(SPEAKER держит RESTRAINTNAME)|У твоих похитителей большой спрос на ограничители повышенной надежности.|Если они поймают тебя, возможно, они увидят мой логотип на этом ошейнике!|Он довольно удобный и надежный,|и чем больше ты будешь его носить, тем более покорной будешь себя чувствовать. +(The SPEAKER holds up a RESTRAINTNAME)|Your body looks like a great billboard!|This suit will make you so attractive that nobody will be able to resist!|And in the process of, ahem, examining you,|They'll be sure to see my logo! +(SPEAKER держит RESTRAINTNAME)|Твое тело выглядит как большой рекламный щит!|Этот костюм сделает тебя настолько привлекательной, что никто не сможет устоять!|И в процессе, кхм, изучения тебя, они обязательно увидят мой логотип! +(The SPEAKER folds her arms and nods)|Good girl! I knew you would come clean~ +(SPEAKER складывает руки на груди и кивает)|Хорошая девочка! Я знала, что ты во всем признаешься~ +Sure! I accept! +Конечно! Я согласна! +(Nod in approval) +(Кивнуть в согласие) +How about something else? +Как насчет чего-нибудь другого? +(Shake your head) +(Покачать головой) +Excellent! Please hold still~|(She fits the RESTRAINTNAME on and a seal awakens)|Whoops! Good thing I didn't sell that one!|I'll let you keep it, it's my treat~ +Превосходно! Пожалуйста, не двигайся~|(Она примеряет на вас RESTRAINTNAME, и печать пробуждается)|Упс! Хорошо, что я это не продала!|Я позволю тебе оставить это себе, в знак дружбы~ +Excellent! Please hold still~|(She fits the RESTRAINTNAME on and nothing happens)|We have a winner!|You can't have it though, not until you pay up~ +Превосходно! Пожалуйста, не двигайся~|(Она примеряет на вас RESTRAINTNAME, и ничего не происходит)|У нас есть победитель!|Но ты не получишь это, пока не заплатишь~ +Wonderful. I look forward to seeing you being delivered, er, coming back,|Lots of treasure in hand!|(She places the RESTRAINTNAME on you and the seal activates. There is no keyhole.) +Замечательно. Я с нетерпением жду, когда ты доставишь, э-э, вернешься с кучей сокровищ в руках!|(Она надевает на вас RESTRAINTNAME, и печать активируется. Здесь нет замочной скважины.) +Alright! Why don't you hold still~|(She lifts your hair out of the way and buckles the collar on)|Now go out there and find me some treasure~ +Хорошо! А теперь замри~|(Она убирает ваши волосы в сторону и застегивает ошейник)|А теперь иди и найди мне какое-нибудь сокровище~ +You're gonna like it, I guarantee it~|(She pulls out the catsuit from a drawer, dusts it off, and helps you in it)|(There is no zipper or fastener, just a very stretchy neck hole)|(Once it's on and well-fitted, you feel the neck grow less loose...)|(...and pulling the rubber away from your skin becomes impossible)|Beautiful. I'm going to let you go now.|I'm sure your new look will attract many customers! +Тебе понравится, я гарантирую~|(Она достает комбинезон из ящика, стряхивает с него пыль и помогает вам надеть его)|(В нем нет молнии или застежки, только очень эластичное отверстие для шеи)|(Как только он оказывается надет и расправлен, вы чувствуете, как отверстие на шее затягивается...)|(...и оттянуть резину от вашей кожи становится невозможно)|Красиво. Сейчас я тебя отпущу.|Я уверена, что твой новый образ привлечет множество клиентов! +No? That's alright.|I'm sure I'll find someone else to test these on, huehue. +Нет? Все в порядке.| Я уверена, что найду кого-нибудь другого, на ком можно это протестировать, хехехе. +Up to you!|You'll still have to pay me eventually~ +Решать тебе!|В конце концов тебе все равно придется мне заплатить~ +Your choice~|I am open to further negotiations. +Твой выбор~|Я открыта для дальнейших переговоров. +Your choice~|Not everyone is up to putting themselves on display like that~ +Твой выбор~|Не каждый способен выставлять себя напоказ подобным образом~ +(The SPEAKER pats you down and makes sure you're okay)|I can definitely help with those!|But as you know, I help a lot of adventurers just like you.|You know what, I'll give you a discount!|That'll be RESCUECOST gold pieces! +(SPEAKER похлопывает вас по плечу и убеждается, что с вами все в порядке)|Я определенно могу помочь с этим!|Но, как ты знаешь, я помогаю многим искателям приключений, таким же, как ты.|Знаешь что, я сделаю тебе скидку!|Итого с тебя всего RESCUECOST золотых! +Right! Here's RESCUECOST gp. +Хорошо! Вот RESCUECOST зол. +Mmmph. (Nod your head and pay RESCUECOST gp) +Ммммфх. (Кивнуть головой и заплатить RESCUECOST зол.) +(The SPEAKER smiles)|Pleasure doing business with ya~ +(SPEAKER улыбается)|Приятно иметь с тобой дело~ +Mind adding it to my tab? +Можно добавить это в мой счет? +(Shake your head regrettably.) +(С сожалением покачать головой.) +(The SPEAKER rubs her chin)|Sorry miss!|Cost of doing business, you know?|Why don't you come back with some of that delicious, shiny gold~ +(SPEAKER потирает подбородок)|Извини, мисс!|Издержки ведения бизнеса, понимаешь?|Почему бы тебе не вернуться со стопочкой этого восхитительного, блестящего золота~ +(The SPEAKER rubs her chin)|Sorry miss!|Cost of doing business, you know?|Why don't you come back with some of that delicious, shiny gold~ +(SPEAKER потирает подбородок)|Извини, мисс!|Издержки ведения бизнеса, понимаешь?|Почему бы тебе не вернуться со стопочкой этого восхитительного, блестящего золота~ +(The SPEAKER folds her arms)|Come on now, I can hear the gold jingling in your pocket! +(SPEAKER складывает руки на груди)|Давай же, я слышу, как золото позвякивает у тебя в кармане! +(The SPEAKER folds her arms)|Business is business, miss~ +(SPEAKER складывает руки на груди)|Бизнес есть бизнес, мисс~ +Pretty please? I promise I'll pay you back. +Ну пожа-а-алуйста? Я обещаю, что верну тебе деньги. +(Be insistent) +(Настаивать) +(The SPEAKER rubs her chin)|No can do.|Rules are rules~ +(SPEAKER потирает подбородок)|Ничего не поделаешь.|Правила есть правила~ +(The SPEAKER sighs)|Business is business, miss~ +(SPEAKER вздыхает)|Бизнес есть бизнес, мисс~ +(The SPEAKER reluctantly frees you)|...Fine, I'll cut you a deal.|You help me, I help you. Fair? +(SPEAKER неохотно освобождает вас)|...Хорошо, я заключу с тобой сделку.|Ты помогаешь мне, я помогаю тебе. Справедливо? +(Help her test cursed armors) +(Помочь ей протестировать проклятые доспехи) +(Add cursed restraints as collateral) +(Надеть проклятые ограничители в качестве залога) +(Wear a collar to help advertise her business) +(Надеть ошейник, чтобы помочь ей рекламировать бизнес) +(Wear a catsuit to help advertise her business) +(Надеть комбинезон, чтобы помочь ей рекламировать бизнес) +(Actually... just pay her the RESCUECOST gold) +(Все же... просто заплатить ей RESCUECOST золотых) +(The SPEAKER holds up a RESTRAINTNAME)|I've bought some armors from an adventurer lately,|but I don't know if they're safe to wear.|Why don't you try it on for me?|I'll postpone your debt for a later time. +(SPEAKER держит RESTRAINTNAME)|Недавно я купила несколько доспехов у авантюристки,|но я не знаю, безопасно ли их носить.|Почему бы тебе не примерить их для меня?|Я отложу твой долг на более позднее время. +(The SPEAKER holds up a RESTRAINTNAME)|I need to make sure you won't go running off again.|This RESTRAINTNAME here has a special seal on it.|I can get you out of it, of course, but you'll have to pay up first. +(SPEAKER держит RESTRAINTNAME)|Мне нужно убедиться, что ты снова не сбежишь.|На этом RESTRAINTNAME вот тут есть специальная печать.|Я, конечно, могу вытащить тебя из него, но сначала тебе придется заплатить. +(The SPEAKER holds up a RESTRAINTNAME)|Your captors are quite the market for high-security restraints.|If you get captured by them, maybe they'll see my logo on this collar!|It's quite comfy and secure,|you'll end up feeling more submissive the more your wear it. +(SPEAKER держит RESTRAINTNAME)|У твоих похитителей большой спрос на ограничители повышенной надежности.|Если они поймают тебя, возможно, они увидят мой логотип на этом ошейнике!|Он довольно удобный и надежный,|и чем больше ты будешь его носить, тем более покорной будешь себя чувствовать. +(The SPEAKER holds up a RESTRAINTNAME)|Your body looks like a great billboard!|This suit will make you so attractive that nobody will be able to resist!|And in the process of, ahem, examining you,|They'll be sure to see my logo! +(SPEAKER держит RESTRAINTNAME)|Твое тело выглядит как большой рекламный щит!|Этот костюм сделает тебя настолько привлекательной, что никто не сможет устоять!|И в процессе, кхм, изучения тебя, они обязательно увидят мой логотип! +(The SPEAKER folds her arms and nods)|Good girl! I knew you would come clean~ +(SPEAKER складывает руки на груди и кивает)|Хорошая девочка! Я знала, что ты во всем признаешься~ +Sure! I accept! +Конечно! Я согласна! +(Nod in approval) +(Кивнуть в согласие) +How about something else? +Как насчет чего-нибудь другого? +(Shake your head) +(Покачать головой) +Excellent! Please hold still~|(She fits the RESTRAINTNAME on and a seal awakens)|Whoops! Good thing I didn't sell that one!|I'll let you keep it, it's my treat~ +Превосходно! Пожалуйста, не двигайся~|(Она примеряет на вас RESTRAINTNAME, и печать пробуждается)|Упс! Хорошо, что я это не продала!|Я позволю тебе оставить это себе, в знак дружбы~ +Excellent! Please hold still~|(She fits the RESTRAINTNAME on and nothing happens)|We have a winner!|You can't have it though, not until you pay up~ +Превосходно! Пожалуйста, не двигайся~|(Она примеряет на вас RESTRAINTNAME, и ничего не происходит)|У нас есть победитель!|Но ты не получишь это, пока не заплатишь~ +Wonderful. I look forward to seeing you being delivered, er, coming back,|Lots of treasure in hand!|(She places the RESTRAINTNAME on you and the seal activates. There is no keyhole.) +Замечательно. Я с нетерпением жду, когда ты доставишь, э-э, вернешься с кучей сокровищ в руках!|(Она надевает на вас RESTRAINTNAME, и печать активируется. Здесь нет замочной скважины.) +Alright! Why don't you hold still~|(She lifts your hair out of the way and buckles the collar on)|Now go out there and find me some treasure~ +Хорошо! А теперь замри~|(Она убирает ваши волосы в сторону и застегивает ошейник)|А теперь иди и найди мне какое-нибудь сокровище~ +You're gonna like it, I guarantee it~|(She pulls out the catsuit from a drawer, dusts it off, and helps you in it)|(There is no zipper or fastener, just a very stretchy neck hole)|(Once it's on and well-fitted, you feel the neck grow less loose...)|(...and pulling the rubber away from your skin becomes impossible)|Beautiful. I'm going to let you go now.|I'm sure your new look will attract many customers! +Тебе понравится, я гарантирую~|(Она достает комбинезон из ящика, стряхивает с него пыль и помогает вам надеть его)|(В нем нет молнии или застежки, только очень эластичное отверстие для шеи)|(Как только он оказывается надет и расправлен, вы чувствуете, как отверстие на шее затягивается...)|(...и оттянуть резину от вашей кожи становится невозможно)|Красиво. Сейчас я тебя отпущу.|Я уверена, что твой новый образ привлечет множество клиентов! +No? That's alright.|I'm sure I'll find someone else to test these on, huehue. +Нет? Все в порядке.| Я уверена, что найду кого-нибудь другого, на ком можно это протестировать, хехехе. +Up to you!|You'll still have to pay me eventually~ +Решать тебе!|В конце концов тебе все равно придется мне заплатить~ +Your choice~|I am open to further negotiations. +Твой выбор~|Я открыта для дальнейших переговоров. +Your choice~|Not everyone is up to putting themselves on display like that~ +Твой выбор~|Не каждый способен выставлять себя напоказ подобным образом~ +The next floor is a normal floor. +Следующий этаж - обычный этаж. +This floor is suffering from a slime mold infestation.|Maids have been deployed to deal with the problem.|They could use a hand. +Этот этаж страдает от заражения слаймовыми плесневиками.|Для решения этой проблемы были направлены горничные.|Им не помешала бы помощь. +This floor is being ransacked by bandits.|They are armed and dangerous.|But I hear there's a bounty on their heads? +Этот этаж обыскивают бандиты.|Они вооружены и опасны.|Но я слышала, что за их головы назначена награда. +A cave dragon was captured in the next floor.|It's brimming with elemental magic,|and there are a lot of interested parties! +На следующем этаже был захвачен пещерный дракон.|Он наполнен магией стихий,|и там собралось множество фракций! +The witches told me to keep you out.|I'm not exactly capable of doing that,|so feel free to do as you please. +Ведьмы велели мне держать тебя подальше.|Но я точно не способна на это,|так что не стесняйтесь поступать, как тебе заблагорассудится. +The next floor is overgrown.|I'd watch your feet if I were you. +Следующий этаж зарос.|На твоем месте я бы следила за ногами. +Slimes, slimes EVERYWHERE!|Fortunately there's a slime-harvesting|operation going on. +Слаймы, слаймы ВЕЗДЕ!|К счастью, сейчас идет операция|по ликвидации этих слаймов. +The trainers are taking their wolfgirls out for a walk.|I'd steer clear.|Unless you want to become one of their pets~ +Дрессировщики выводят своих волчиц на прогулку.|Я бы держалась от них подальше.|Если только ты не хочешь стать одним из их питомцев~ +Rumor has it that one of the cyber-dolls escaped.|Their handlers are looking for her.|They're catching every young girl they can find! +Ходят слухи, что одна из киберкукол сбежала.|Их кураторы ищут ее.|Они ловят каждую молодую девушку, которую только могут найти! +This is totally a normal floor.|No doubt about it. +Это совершенно обычный этаж.|В этом нет никаких сомнений. +This is a debug mode journey for testing the latest region. +Это путешествие в режиме отладки для тестирования последнего региона. +These are the stairs to the tutorial hall. +Это лестница, ведущая в учебный зал. +Congratulations! You've completed the tutorial!|Now get in there and stay out of trouble~ +Поздравляю! Вы завершили обучение!|А теперь идите дальше и держитесь подальше от неприятностей~ +Welcome to the dungeon!|Don't panic, this is a turn-based game,|and nothing will happen until you move.|On your left you'll see your character,|displayed with all of the bondage they don't have.|Don't worry, you'll find some soon! +Добро пожаловать в подземелье!|Не паникуйте, это пошаговая игра, и ничего не произойдет, пока вы не сделаете действие.|Слева от себя вы увидите своего персонажа,|отображенного со всеми ограничителями, которых у неё пока нет.|Не волнуйтесь, скоро вы их найдете! +You might be wondering what all these barrels are for.|Don't worry, they're, uh, totally safe!|When you are inside one you can click on yourself to wait.|Enemies have a hard time seeing you inside a barrel,|so you can wait until they pass by you. +Возможно, вам интересно, для чего нужны все эти бочки.| Не волнуйтесь, они, э-э, полностью безопасны!|Когда вы окажетесь внутри одной из них, вы можете нажать на себя, чтобы подождать.|Врагам трудно разглядеть вас внутри бочки, | поэтому вы можете подождать, пока они пройдут мимо вас. +On the right you'll see your stats and spells slots.|Your DP, SP, MP, and WP are displayed there, we'll get into what these do.|Below that you'll see your current consumable items,|your gold, and your currently equipped weapon. +Справа вы увидите свою статистику и слоты для заклинаний.|Там отображаются ваши DP, SP, MP и WP. Скоро мы разберемся, что они делают.|Ниже вы увидите ваши текущие расходные материалы,|ваше золото и ваше текущее оснащенное оружие. +Your WP, or willpower, is an important resource.|Without it, escaping from restraints is more difficult.|There is a willpower potion on the floor up there. Go get it! +Ваша WP, или сила воли, является важным ресурсом.|Без неё освободиться от ограничителей будет сложнее.|Там, наверху, на полу есть зелье силы воли. Идите и возьмите его! +Oh no! That trap reduced your willpower!|Fortunately you have a potion.|You can drink it by clicking the '+' icon next to your WP bar.|You can also go into your Inventory in the bottom bar.|There is also a quick-inventory icon (backpack). +О, нет! Эта ловушка ослабила вашу Силу Воли!|К счастью, у вас есть зелье.|Вы можете выпить его, нажав на значок '+' рядом с вашей WP-панелью.|Вы также можете зайти в свой инвентарь на нижней панели.|Также есть значок быстрого доступа к инвентарю (рюкзак). +Another trap!|You'll notice that the trap also drained your stamina considerably, preventing you from sprinting or attacking.|(Note: you can toggle sprinting using the '>>' button on the bottom bar)|You can protect yourself while your stamina regenerates by retreating into the room above.|Close the door by clicking the Close Door button in the bottom bar.| +Еще одна ловушка!|Вы заметите, что ловушка также значительно истощила вашу выносливость, лишив вас возможности бегать или атаковать.|(Примечание: вы можете переключить спринт, используя кнопку '>>' на нижней панели)|Вы можете защитить себя, пока ваша выносливость восстанавливается, отступив в комнату наверху.|Закройте дверь, нажав кнопку Закрыть Дверь на нижней панели.| +Your MP, or Mana, used used to cast spells.|In order to cast spells though, you need to learn one.|Click the Spells button in the right menu, then navigate to the Spell Tree.|Then click on Flame Apprentice and learn it to unlock Firebolt.|Then, press space to go back, and press Right to switch pages.|Click on Firebolt, learn it, then assign it to slot 1. +Ваш MP, или мана, используется для произнесения заклинаний.|Однако для того, чтобы произносить заклинания, вам нужно выучить одно из них.|Нажмите кнопку 'Заклинания' в правом меню, после перейдите к древу заклинаний.|Затем нажмите на Новичок Огня и изучите его, чтобы разблокировать Огненную стрелу.|Затем нажмите пробел, чтобы вернуться назад, и нажмите Вправо, чтобы переключить страницы.|Нажмите на Огненную стрелу, изучите её, затем назначьте ей слот 1. +On the right you'll see your stats and spells slots.|You can click on a spell slot or hit 1-4 on your keyboard to cast a spell|then click on the map for where you want to aim it.|The small wrench icon above them will let you|swap them out for another spell from your spellbook. +Справа вы увидите свою статистику и слоты для заклинаний.|Вы можете нажать на слот для заклинаний или нажать 1-4 на клавиатуре, чтобы произнести заклинание|затем нажмите на поле, чтобы указать, куда вы хотите его направить.|Маленький значок гаечного ключа над ними позволит вам|заменить их на другое заклинание из вашей книги заклинаний. +There's a zombie over there!|Fortunately zombies are weak to fire.|Firebolt has a very long range,|so simply cast firebolt and click on the zombie.|Repeat until it is dead. +Там зомби!|К счастью, зомби слабы против огня.|У 'Огненной стрелы' очень большая дальность действия,|поэтому просто бросьте 'Огненную стрелу' и нажмите на зомби.|Повторяйте до тех пор, пока он не умрет. +Mana potions restore mana, allowing you to cast spells.|Youll notice that your mana also regenerates slowly.|This mana comes from your mana pool,|which is a thin line displayed under the mana bar.|When that runs out, you can't cast spells anymore! +Зелья маны восстанавливают ману, позволяя вам произносить заклинания.|Вы можете заметить, что ваша мана также медленно восстанавливается сама по себе.|На самом деле эта мана поступает из вашего резерва маны,|который отображается тонкой линией под шкалой маны.|Когда он закончится, вы больше не сможете использовать заклинания! +Your DP, or Distraction, is a measure of...|How much you are enjoying things.|These sorts of thoughts cloud your mind,|so spellcasting is more difficult when you are distracted.|Go grab the potion over there. +Ваше DP, или отвлечение, является определением...|Насколько вам весело.|'Такого рода' мысли затуманивают ваш разум,|а произносить заклинания сложнее, когда вы чем-то отвлечены.|Идите, возьмите вон то зелье. +Did you like that?|Anyway, there's a zombie over there. You should drink that potion.|It will clear your mind so you can cast again.|Hurry, or it will get you! +Вам это понравилось?|В любом случае, вон там зомби. Вам следует выпить это зелье.|Это очистит ваш разум, и вы сможете снова колдовать.|Поторопитесь, или он доберется до вас! +That wasn't so hard, was it?|Now then, there's a treasure chest over here. Why don't you open it? +Это было не так уж трудно, не так ли?|Кстати, здесь есть сундук с сокровищами. Почему бы вам не открыть его? +Yikes, looks like you're in a bind!|No worries, though. There's a key to those cuffs over there.|Simply hover over the cuffs item test on the left side.|Then, click the lock icon to remove the lock.|Finally, click the buckle to remove the cuffs. +Ой, похоже, ты в затруднительном положении!|Впрочем, не беспокойся. Вон там ключ от этих наручников.|Просто наведите курсор на иконку наручников с левой стороны.|Затем нажмите на значок замочка, чтобы снять замок.|Наконец, нажмите на пряжку, чтобы снять манжеты. +I think we all know what's in the next chest.|It's important to understand the different ways you can escape.|You can struggle, which costs the most stamina|but makes other struggle methods faster.|You can cut, which requires a knife in hand.|You can remove, which represents untying or unbuckling. +Я думаю, мы все знаем, что находится в следующем сундуке.|Важно понимать различные способы, которыми вы можете освободиться.|Вы можете бороться, что тратит больше выносливости,|но быстрее других способов освобождения.|Можно резать, для чего требуется нож в руке.|Также вы можете Снять, что означает развязывание или расстегивание ограничителя. +Ouch, that looked tight...|Sometimes you won't be able to struggle out of things.|You'll have to find some other way to take it off... +Ой, он выглядит очень тугим...|Иногда вы не сможете выпутаться из ограничителя.|Вам придется найти какой-нибудь другой способ снять его... +There's a few zombies up ahead.|Fight your way through and claim the treasure! +Впереди несколько зомби.|Проложите себе путь и завладейте сокровищем! +You're not feeling it... +Вы этого не чувствуете... +You close your eyes but the vibrations keep you from dozing off... +Вы закрываете глаза, но вибрации не дают вам задремать... +(A SPEAKER lies hogtied in front of you)|(She looks at you with pleading eyes,)|(and mumbles incoherently through her gag) +(SPEAKER лежит связанная словно кабанчик прямо перед вами)|(Она смотрит на вас умоляющими глазами)|(и что-то бессвязно бормочет сквозь кляп) +(A SPEAKER lies hogtied in front of you)|(She looks at you, mumbling and giggling into her gag) +(SPEAKER лежит связанная словно кабанчик прямо перед вам)|(Она смотрит на вас, бормоча и хихикая в свой кляп) +(SPEAKER looks grateful)|Thank you so much|I shall join your party. +(SPEAKER выглядит благодарной)|Большое тебе спасибо|я присоединюсь к твоей группе. +(SPEAKER looks grateful)|Thank you so much miss!|I owe you everything. +(SPEAKER выглядит благодарной)|Большое тебе спасибо!|Я обязан тебе. +(SPEAKER groans and wriggles around uselessly) +(SPEAKER стонет и бесполезно извивается) +(SPEAKER moans and rolls around, blushing deeply) +(SPEAKER стонет и катается по полу, густо краснея) +Untie her +Развязать ее +Make sure she is tight and secure +Убедиться, что туго и надежно скована +(A SPEAKER bumps into you while immersed in her thoughts)|Oh! Hello!|Say, you look adorable...|Do you mind helping me find something? +(SPEAKER натыкается на вас, погруженная в свои мысли)|О! Привет!|Скажи, милашка...|Ты не против помочь мне кое-что найти? +(The SPEAKER jumps up and down)|Ah, wonderful!|I've misplaced one of my dresses.|If you could find one, wear it, and bring it to me,|I'd greatly appreciate it! Thanks! +(SPEAKER прыгает вверх-вниз)|Ах, замечательно!|Я потеряла одно из своих платьев.|Если бы вы могли найти что-нибудь такое, надеть и принести мне, я была бы вам очень признателен! Спасибо! +(The SPEAKER stares at you like a rabid animal)|Wowie! You look gorgeous!|Thank you so much!|(She snaps a photo of you using a magic crystal) +(SPEAKER смотрит на вас, как бешеное животное)|Ух ты! Ты выглядишь великолепно!|Большое тебе спасибо!|(Она фотографирует тебя с помощью волшебного кристалла) +(The SPEAKER giggles)|I never said I'd take it off, did I? +(SPEAKER смеется)|Я никогда не говорила, что сниму это, не так ли? +(The SPEAKER smiles)|Sure thing! +(SPEAKER улыбается)|Будь уверена! +(Show interest) +(Проявить интерес) +I found your dress... +Я нашла твое платье... +Mmmph... (Found the dress!) +Мфффх... (Нашла платье!) +Great! Can you take it off? +Отлично! Ты можешь это снять? +Mmmmm! (Struggle) +Ммммм! (Бороться) +(A SPEAKER clutching her books approaches you)|Miss adventurer!|I happen to need a magic scroll of any kind.|It's for my studies. +(SPEAKER сжимает в руках свои книги, приближаясь к вам)|Мисс искательница приключений!|Так случилось, что мне понадобился какой-нибудь магический свиток.|Это для моей учебы. +(The SPEAKER smiles)|Yes, thank you so much!|It's been so difficult to get them lately.|The magic library is closed off these days,|and there are mean people trying to get the scrolls back... +(SPEAKER улыбается)|Да, большое спасибо!|В последнее время их было так трудно достать.|Волшебная библиотека в эти дни закрыта, и есть злые люди, пытающиеся вернуть свитки обратно... +(The SPEAKER is happy)|Thank you so much! +(SPEAKER счастлива)|Спасибо тебе большое! +(The SPEAKER is happy)|Thank you so much! +(SPEAKER счастлива)|Спасибо тебе большое! +(The SPEAKER is happy)|Thank you so much! +(SPEAKER счастлива)|Спасибо тебе большое! +(The SPEAKER is happy)|Thank you so much! +(SPEAKER счастлива)|Спасибо тебе большое! +(Show interest) +(Проявить интерес) +Give her a Scroll of Sauntering +Отдать ей Свиток Легкой Прогулки +Give her a Scroll of Sleight +Отдать ей Свиток Ловкости +Give her a Scroll of Speech +Отдать ей Свиток Красноречия +Give her a Scroll of Purity +Отдать ей Свиток Чистоты +(A SPEAKER looks distraught)|Well met, adventurer!|We have a problem... +(SPEAKER выглядит растерянной)|Рада встрече, искатель приключений!|У нас проблема... +(The SPEAKER folds her arms)|A rebel has been causing us problems lately...|If you run into her, give her all you got!|She needs to be brought to justice. +(SPEAKER складывает руки на груди)|В последнее время мятежница доставляет нам проблемы...|Если ты столкнешься с ней, покажи ей все, что у тебя есть!|Она должна быть привлечена к ответственности. +(Show interest) +(Проявить интерес) +(A SPEAKER scoffs in your direction)|Well? You lookin' for work or no? +(SPEAKER посмеивается над вами)|Ну? Ты ищешь работу или нет? +(The SPEAKER grins)|A bunch of delinquents stormed out recently.|They're looking for a way out of their belts.|Someone oughta show em their place,|if you catch what I'm saying. +(SPEAKER усмехается)|Недавно сбежала группа преступников.|Они ищут выход из своих поясов.|Кто-нибудь должен показать им их место, если ты понимаешь, о чем я говорю. +(Nod) +(Кивнуть) +(A SPEAKER approaches you in your cell)|Since you've been a bad girl,|we're taking you to the high-security prison. +(SPEAKER подходит к вам в вашей камере)|Поскольку ты была плохой девочкой, мы отправляем тебя в тюрьму строгого режима. +(The SPEAKER folds her arms)|Want to or not, you're going. +(SPEAKER складывает руки на груди)|Хочешь ты того или нет, но ты идешь. +(Resist) +(Сопротивляться) +(Submit) +(Подчиниться) +(A SPEAKER approaches you in your cell)|Looks like you're not in the System.|I'm going to have to take you to sorting. +(К вам в камере подходит SPEAKER)|Похоже, тебя нет в Системе.|Мне придется отвести тебя на сортировку. +(The SPEAKER grins as her systems glow)|I love my job sometimes~ +(SPEAKER улыбается, когда её системы начинают светиться)|Иногда я люблю свою работу.~ +(Resist) +(Сопротивляться) +(Submit) +(Подчиниться) +(The SPEAKER grins)|It means you'll get nicely packaged,|so that we can sort you through the System. +(SPEAKER ухмыляется)|Это означает, что ты будешь хорошо упакована,|чтобы мы могли распределить тебя по Системе. +W-what does that entail? +Ч-что это значит? +(The SPEAKER giggles)|That means we'll get to package you up and|decide what to do with you, silly~ +(SPEAKER хихикает)|Это значит, что мы упакуем тебя и|решим, что с тобой делать, глупышка~ +Hmmmph? Mmmm! (Act worried and whimper) +Хмммф? Мммм! (Изображать беспокойство и хныкать) +(The SPEAKER folds her arms)|Mistress Oriel's orders +(SPEAKER складывает руки на груди)|Приказы госпожи Ориэль +Not in the 'System'? +Не в 'Системе'? +(The SPEAKER giggles)|Don't worry, we'll get you sorted out soon.|After all, everyone has a place in the System. +(SPEAKER хихикает)|Не волнуйся, мы скоро тебя отсортируем.|В конце концов, у каждого есть свое место в Системе. +Mmmph? (Act confused) +Ммммфх? (Изобразить замешательство) +(The SPEAKER folds her arms)|Mistress Oriel's orders were clear:|Anyone not logged in the System shall be entered into the System. +(SPEAKER складывает руки на груди)|Приказы госпожи Ориэль были четкими:|Любой, кто не зарегистрирован в Системе, будет внесен в Систему. +Not in the 'System'? +Не в 'Системе'? +(The SPEAKER giggles)|Don't worry, we'll get you sorted out soon.|After all, everyone has a place in the System. +(SPEAKER хихикает)|Не волнуйся, мы скоро тебя отсортируем.|В конце концов, у каждого есть свое место в Системе. +Mmmph? (Act confused) +Ммммфх? (Изобразить замешательство) +(The SPEAKER pauses for a moment, then speaks)|I'm am just following Mistress Oriel's orders.|I'm sure she will have time to speak with you if you want to ask her. +(SPEAKER на мгновение замолкает, затем говорит)|Я просто выполняю указания госпожи Ориэль.|Я уверена, что у нее найдется время поговорить с тобой,|если ты захочешь её расспросить. +But why??? +Но почему??? +(The SPEAKER frowns)|You should be thankful.|Without Mistress Oriel, we'd all be dead!|Probably... +(SPEAKER хмурится)|Ты должна быть благодарна.|Без госпожи Ориэль мы все были бы мертвы!|Возможно... +Who is Mistress Oriel? +Кто такая госпожа Ориэль? +(The SPEAKER pauses for a moment, then answers)|Well, only a few hundred years ago, I think?|This is a bit longer of a downtime than usual,|But all of us are waiting patiently~ +(SPEAKER на мгновение замолкает, а затем отвечает)|Ну, я думаю, всего несколько сотен лет назад?|Это время простоя немного больше, чем обычно,|но мы все терпеливо ждем~ +When are these orders from? +Когда поступят эти приказы? +(You anger the SPEAKER. She gags you.)|Unlike you, we were trained not to complain about orders given to us.|So until you receive your training, why don't you be nice and quiet? +(Вы разозлили SPEAKER. Она затыкает вас кляпом.)|В отличие от тебя, нас учили не жаловаться на отданные нам приказы.|Так что, пока ты не пройдешь обучение, почему бы тебе не побыть милой тихоней? +The facility is in ruins! This is pointless! +Комплекс в руинах! Это бессмысленно! +(A SPEAKER crosses her arms)|Who you lookin' at?|Oh, it's an adventurer.|Say, you wouldn't be interested|in working with us, would ya? +(SPEAKER скрещивает руки на груди)|Кто тут у нас?|О, это авантюристка.|Скажи, тебе было бы неинтересно работать с нами, не так ли? +(The SPEAKER smiles)|That's more like it.|Here's the scoop: One of ours was captured on the next floor.|We need you to go get her out. +(SPEAKER улыбается)|Вот это уже больше похоже на правду.|Вот тебе задание: одна из наших была схвачена на следующем этаже.|Нам нужно, чтобы ты пошла и вытащила ее оттуда. +(Show interest) +(Проявить интерес) +(The SPEAKER sits bound in high-security manacles.|You'll need to open the lock to get her out.) +(SPEAKER сидит, закованная в кандалы повышенной надежности.|Вам нужно будет открыть замок, чтобы вытащить ее.) +(You don't have any keys that work on the lock) +(У вас нет никаких ключей, которые подходили бы к замку) +(You can't help her, bound as tightly as you are...) +(Вы не можете помочь ей, ибо она связана так же крепко, как и вы сами...) +(You unlock her, fumbling around for a while with your bound hands) +(Вы освобождаете ее, некоторое время повозившись со связанными руками) +(You unlock the SPEAKER)|Thank you!|Let's get out of here! +(Вы освобождаете SPEAKER)|Спасибо!|Давай убираться отсюда! +(You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...) +(Вы освобождаете SPEAKER)|Мммффхх!|(Она хочет сохранить свой кляп при себе...) +(You don't have any lockpicks) +(У вас нет отмычек) +(You try to pick the lock...)|(Click! A safety shield locks securely into place!)|(Looks like the SPEAKER will be staying here for a while...) +(Вы пытаетесь вскрыть замок...)|(Щелчок! Надежный защитный экран запирается поверх замка!)|(Похоже, SPEAKER пробудет здесь еще некоторое время...) +(You can't pick the lock with your hands bound) +(Вы не сможете вскрыть замок со связанными руками) +(After a while, you free the SPEAKER)|Thank you!|Let's get moving! +(Спустя некоторое время вы освобождаете SPEAKER)|Спасибо!|Давай уходить отсюда! +(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...) +(Спустя некоторое время вы освобождаете SPEAKER)|Мммффх!|(Она качает головой, когда вы тянетесь к её кляпу...) +(You don't have enough mana for a command word) +(У вас недостаточно маны для Командного Слова) +(Try as you might, your mouth is sealed tight) +(Как бы вы ни старались, ваш рот слишком плотно заблокирован) +(You utter a command word to free the SPEAKER)|Many thanks!|Let's go! +(Вы произносите командное слово, чтобы освободить SPEAKER)|Большое спасибо!|Уходим! +(You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) +(Вы произносите командное слово, чтобы освободить SPEAKER)|Ммфффх!|(Она вновь защелкивает свой кляп...) +(The SPEAKER is locked in high-security manacles.|The safety shield has been triggered, making it impossible to help her.) +(SPEAKER сидит, закованная в кандалы повышенной надежности.|Сработал защитный экран, из-за чего помочь ей стало невозможно.) +Use a key to unlock her +Используйте ключ, чтобы отпереть ее +Try to pick her restraints (JAMPERCENT jam chance) +Попробовать взломать её ограничители (JAMPERCENT шанс неудачи) +Use CMD: Unlock +Использовать Команд.Закл: Разблокировка +Apologize profusely! +Приношу свои глубочайшие извинения! +(The SPEAKER sits bound in mysterious ASCII glyphs)|(She is bugged and needs your help to get out) +(SPEAKER сидит, связанная загадочными ASCII символами)|(Она багнулась и нуждается в вашей помощи, чтобы выбраться) +(Unlock her and file a bug report to Ada) +(Отоприте её и отправьте сообщение об ошибке Ada) +(This SPEAKER is a sub, but not YOUR sub!) +(Этот SPEAKER является сабмиссивом, но не ВАШИМ сабмиссивом!) +(The SPEAKER sits restrained by your own hand.|Only someone with keys can let her out.) +(SPEAKER сидит, связанная вашей собственной рукой.|Только тот, у кого есть ключи, может выпустить ее.) +(You don't have any keys that work on the lock) +(У вас нет никаких ключей, которые подходили бы к замку) +(You can't help her, bound as tightly as you are...) +(Вы не можете помочь ей, ибо она связана так же крепко, как и вы сами...) +(You unlock her, fumbling around for a while with your bound hands) +(Вы освобождаете ее, некоторое время повозившись со связанными руками) +(You unlock the SPEAKER)|Thank you!|Let's get out of here! +(Вы освобождаете SPEAKER)|Спасибо!|Давай убираться отсюда! +(You unlock the SPEAKER)|Mmmmph!|(She wants to keep her gag...) +(Вы освобождаете SPEAKER)|Мммффхх!|(Она хочет сохранить свой кляп при себе...) +(You don't have any lockpicks) +(У вас нет отмычек) +(You try to pick the lock...)|(Click! A safety shield locks securely into place!)|(Looks like the SPEAKER will be staying here for a while...) +(Вы пытаетесь вскрыть замок...)|(Щелчок! Надежный защитный экран запирается поверх замка!)|(Похоже, SPEAKER пробудет здесь еще некоторое время...) +(You can't pick the lock with your hands bound) +(Вы не сможете вскрыть замок со связанными руками) +(After a while, you free the SPEAKER)|Thank you!|Let's get moving! +(Спустя некоторое время вы освобождаете SPEAKER)|Спасибо!|Давай уходить отсюда! +(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...) +(Спустя некоторое время вы освобождаете SPEAKER)|Мммффх!|(Она качает головой, когда вы тянетесь к её кляпу...) +(You don't have enough mana for a command word) +(У вас недостаточно маны для Командного Слова) +(Try as you might, your mouth is sealed tight) +(Как бы вы ни старались, ваш рот слишком плотно заблокирован) +(You utter a command word to free the SPEAKER)|Many thanks!|Let's go! +(Вы произносите командное слово, чтобы освободить SPEAKER)|Большое спасибо!|Уходим! +(You utter a command word to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) +(Вы произносите командное слово, чтобы освободить SPEAKER)|Ммфффх!|(Она вновь защелкивает свой кляп...) +(The SPEAKER is locked in high-security manacles.|The safety shield has been triggered, making it impossible to help her.) +(SPEAKER сидит, закованная в кандалы повышенной надежности.|Сработал защитный экран, из-за чего помочь ей стало невозможно.) +Use a key to unlock her +Используйте ключ, чтобы отпереть ее +Try to pick her restraints +Попробовать взломать её ограничители +Return her to your collection +Вернуть её в вашу коллекцию +Use a command word +Использовать командное слово +Flip her around +Перевернуть её +Apologize profusely! +Приношу искренние извинения! +You spin her right round! +Вы вертите ее по кругу! +An enemy found you while you were busy! +Враг нашел вас, пока вы были заняты! +(A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door) +(A SPEAKER будит вас, стуча по решетке)|Просыпайся! Давай убираться отсюда!|(Ей удалось взломать замок на двери вашей камеры) +(A SPEAKER wakes you up by banging on the bars)|Wake up! Let's get out of here!|(She managed to pick the lock on your cell door) +(A SPEAKER будит вас, стуча по решетке)|Просыпайся! Давай убираться отсюда!|(Ей удалось взломать замок на двери вашей камеры) +(A SPEAKER wakes you up by melting the door with acid)|These guys were a piece of cake.|Now let's discover a way out of here! +(SPEAKER будит вас, расплавляя дверь кислотой)|Эти ребята оказались полными тюфяками.|А теперь давайте найдем выход отсюда! +(You wake up to find a SPEAKER creeping up outside the door)|You've been marked as a person of interest.|We are here to escort you out of this place. +(Вы просыпаетесь и обнаруживаете, что SPEAKER подкрадывается к двери)|Вы были отмечены как лицо, представляющее интерес.|Мы здесь, чтобы сопроводить вас из этого места. +(A SPEAKER wakes you up by banging on the bars)|Hey wake up!|You should join me and my pals here~|Maybe you'll join them once we're out of here? +(SPEAKER будит вас, стуча по решетке)|Эй, проснись!|Ты должна присоединиться ко мне и моим приятелям~| Может быть, ты присоединишься к нам, как только мы выберемся отсюда? +(A SPEAKER wakes you up by banging on the bars)|I have been sent to inform you...|...that you are of good standing with the Council.|That being said, I'm only doing this because of procedure. +(SPEAKER будит вас, стуча по решетке)|Меня послали сообщить тебе...|...что ты на хорошем счету у Совета.|Как бы то ни было, я делаю это только из-за приказа. +(A SPEAKER wakes you up by banging on the bars)|Greetings, follower of the blessed kitty!|Because of your faith, we have been sent to rescue you! +(SPEAKER будит вас, стуча по решетке)|Приветствую, последовательница благословенной кошки!|Благодаря твоей вере мы были посланы спасти тебя! +(You sense a presence nearby and look up to see a SPEAKER)|Because you are one, we have come to free you.|Do not take this as an excuse|to get yourself into further trouble. +(Вы чувствуете чье-то присутствие поблизости и поднимаете глаза, замечая SPEAKER)|Поскольку ты одна, мы пришли освободить тебя.|Не воспринимай это как оправдание|для того, чтобы навлечь на себя новые неприятности. +(A SPEAKER wakes you up with the sound of copious fabric rustling)|Oh why hello there!|Would you be interested in a trial run of my latest product?|Of course, we'll have to get you out of here first... +(SPEAKER будит вас звуком шуршания ткани)|О, да, привет!|Ты не заинтересована в тесте моего последнего продукта?|Конечно, сначала нам придется вытащить тебя отсюда... +(A SPEAKER wakes you up by banging on the bars)|Hello my pretty~|I thought to myself I'd rather have you than these folk.|Now why don't you come along and follow me... +(SPEAKER будит вас, стуча по решетке)|Привет, моя красавица~|Я подумала, что лучше бы ты была со мной, чем с этими людьми.|А теперь, почему бы тебе не пойти со мной?.. +(A SPEAKER wakes you up by banging on the bars)|Um... hello!|I received a quest to help you out of here!|Now, where do we go... +(SPEAKER будит вас, стуча по решетке)| Эм... привет!|Я получила задание помочь тебе выбраться отсюда!|Итак, куда мы направляемся?.. +(You wake up to find a SPEAKER whispering to you)|Greetings.|We've been sent to free you.|Let's get moving. +(Вы просыпаетесь и обнаруживаете, что SPEAKER что-то вам шепчет)|Привет.|Нас послали освободить тебя.|Давай, пошевеливайся. +(A SPEAKER wakes you up by banging loudly)|Hey! Good news!|My friends and I came to rescue you! +(SPEAKER будит вас громким стуком)|Эй! Хорошие новости!|Мои друзья и я пришли, чтобы спасти тебя! +(A SPEAKER wakes you up by knocking on the bars)|Hey, wake up.|I happen to like you, so we're going to get you out of here. +(SPEAKER будит вас, стуча по решетке)|Эй, проснись.|Так случилось, что ты мне понравилась, так что мы собираемся вытащить тебя отсюда. +(A SPEAKER flashes a bright light in your direction)|Prisoner 74121 located. Commence transfer to different location. +(SPEAKER мигает ярким светом в вашем направлении)|Заключенная 74121 обнаружена. Начинаю перевод в другое место. +(A SPEAKER wakes you up)|We came to rescue you. Come on! +(SPEAKER будит вас)|Мы пришли, чтобы спасти тебя. Давай же! +(The bed looks comfy and inviting)|(Napping here will restore up to half of your willpower and 100% of your max mana)|(You can only sleep once per floor, unless jailed) +(Кровать выглядит удобной и манящей)|(Сон здесь восстановит до половины вашей силы воли и 100% максимальной маны)|(Вы можете спать только один раз на этаже, не считая времени в камере) +(You lay in the bed and doze off...) +(Вы лежите в постели и отсыпаетесь...) +(Lie down and sleep) +(Лечь и спать) +(There is a pole sticking out of the ground)|(A footrest rises from the floor on either side of the pole)|(This seems like an automated binding system for prisoners...) +(Из земли торчит шест)|(С обеих сторон шеста у пола поднимаются подставки для ног)|(Это похоже на автоматизированную систему связывания заключенных...) +(The pole rises and immobilizes you!) +(Столб поднимается и обездвиживает вас!) +(Stand over it and place your feet in the footrests) +(Встать над ним и поставить ноги на подставки) +(Drop off a prisoner from your collection) +(Передать заключенного из вашей коллекции) +(Put NME on the stand) (PRCNT% Chance) +(Поставить NME на подставку) (PRCNT% Шанс) +(Put NME on the stand) +(Поставить NME на подставку) +(This is a piece of bondage furniture) +(Это предмет мебели для бондажа) +(You lock yourself in the furniture!) +(Вы запираете сами себя в устройстве!) +(The SPEAKER slips out of your grip|before you can lock her in place!) +(SPEAKER выскальзывает у вас из рук|прежде, чем вы успеваете зафиксировать её на месте!) +(Display one of your prisoners) +(Укажите на одного из ваших заключенных) +(Lock yourself inside) +(Запереть внутри саму себя) +(Try to lock NME into the furniture) (PRCNT% Chance) +(Попробовать запереть NME в устройстве) (PRCNT% Шанс) +(You close the furniture around your unfortunate victim!) +(Вы запираете устройство вокруг несчастной жертвы!) +Stun or disable her first. +Сначала оглушите её или выведите из строя. +Area isn't clear. +Зона не очищена. +(Secure NME into the furniture) +(Запереть NME в устройстве) +(You lock her into the furniture so that she stays in place) +(Вы заперли её в устройстве, так что она останется здесь) +FOODMSG|(It invites you to partake in its culinary delights) +FOODMSG|(Приглашаем вас отведать кулинарные изыски) +(You eat the food and feel your willpower rising) +(Вы едите еду и чувствуете, как увеличивается ваша сила воли) +(Being gagged as you are you cannot enjoy the food) +(Поскольку у вас заткнут рот, вы не сможете наслаждаться едой) +(You steal the food, hoping nobody will notice...) +(Вы крадете еду, надеясь, что никто не заметит...) +(Eat it to restore AMOUNT% WP) +(Съесть это, чтобы восполнить AMOUNT% WP) +(Take it!) +(Взять его!) +(Someone left their cookies unattended) +(Кто-то оставил свое печенье без присмотра) +(You smell delicious pizza) +(Ты чувствуете восхитительный запах пиццы) +Cookie +Печенье +Pizza +Пицца +(There is a button on a control panel here.) +(Здесь есть кнопка на панели управления.) +(You touch the button and it glows, releasing a pulse of energy!) +(Вы нажимаете на кнопку, и она светится, высвобождая импульс энергии!) +(PUSH THE BUTTON) +(НАЖАТЬ КНОПКУ) +(You find a map of the local leylines.)|(Committing these to memory will allow you to harness additional mana.) +(Вы находите карту местных лейлиний.)|(Сохранение её в памяти позволит вам использовать дополнительную ману.) +(Are you sure?)|(This decision is permanent.) +(Вы уверены?)|(Это решение является окончательным.) +(Gain +100 to Max Mana Pool) +(Получить +100 к максимальному резерву маны) +(I don't want to.) +(Я не хочу.) +(Gain +100 to Max Mana Pool) +(Получить +100 к максимальному резерву маны) +(No really, I don't want it!) +(Нет, правда, я этого не хочу!) +(You find a strange elevator with a control panel inside)|(You get the impression this will take you somewhere.) +(Вы находите странный лифт с панелью управления внутри)|(У вас создается впечатление, что он вас куда-то доставит.) +(Are you sure?)|(This seems like a bad idea!) +(Вы уверены?)|(Это кажется плохой идеей!) +(You activate the control panel and begin to descend...) +(Вы активируете панель управления и начинаете спуск...) +(Take me down!) +(Отвези меня вниз!) +(I know what I'm doing!) +(Я знаю, что делаю!) +(The conveyor pulls you into a strange elevator)|(A whir of motors suggests this elevator is about to start...) +(Конвейер выводит вас в странный лифт)|(Жужжание моторов говорит о том, что этот лифт вот-вот запустится...) +(You manage to scramble out the door!)|(It closes violently behind you...) +(Вам удается выскочить за дверь!)|(Она резко захлопывается за тобой...) +(The door slams in front of you before you are able to escape!)|(A purple light turns on, revealing a padded interior)|(You feel the elevator begin to descend...) +(Дверь захлопывается перед вами прежде, чем вы успеваете убежать!)|(Загорается фиолетовая лампочка, освещая мягкий интерьер)|(Вы чувствуете, что лифт начинает спускаться ...) +(There's no point in fighting when you can't win)|(You wait patiently as the elevator descends) +(Нет смысла бороться, когда ты не можешь победить)|(Вы терпеливо ждете, пока лифт спускается) +(Try to get out! RESISTCHANCE% success chance) +(Попытаться выбраться! RESISTCHANCE% шанс успеха) +(Give up and let it take me) +(Сдайтесь и позвольте овладеть собой) +(Wait it out) +(Переждите это) +(Mystic energies spring forth from the ground)|(Standing here will fully replenish your passive mana pool)|(One use only) +(Мистические энергии исходят из земли)|(Встав здесь, вы полностью пополните свой пассивный резерв маны)|(Можно использовать только один раз) +(You step on the magical fissue and its energies absorb into you)|(Afterward, the ground crackles and fizzles, but no energy is left.) +(Вы наступаете на магическую трещину, и энергия из нее впитывается в вас)|(После окончания процесса земля потрескивает и шипит, но энергии не ощущается.) +(Recharge your mana pool) +(Пополнить резерв маны) +Upcast from SPELL +Усиление SPELL +Upcast Level LEVEL +Уровень усиления LEVEL +Prerequisite +Предусловие +Unlocks: +Разблокирует: +You need to learn REQUIREDSPELL before you can learn this one. +Вам нужно выучить REQUIREDSPELL, прежде чем вы сможете выучить это заклинание. +You no longer have the will to struggle. +У вас больше нет воли к борьбе. +Help yourself! +Помочь себе! +You eat the delicious food and feel your will restored. +Вы едите вкусную еду и чувствуете, что ваша сила воли восстанавливается. +Your gag prevents you from eating... +Ваш кляп мешает вам есть... +It's a table. +Это стол. +It's a table, with evidence of a grisly deed. +Это стол с доказательствами жутких деяний. +You call for help! +Вы зовете на помощь! +You let out a garbled cry! +Вы издаете искаженный крик! +Your screams are muffled by your gag! +Ваши крики заглушаются кляпом! +You can hardly make a noise... +Вы не можете издать практически ни звука... +*clink* +*звон* +You yelp as the EnemyName activates your RestraintName +Вы вскрикиваете, когда EnemyName активирует ваш RestraintName +You shudder as the EnemyName activates your RestraintName +Вы вздрагиваете, когда EnemyName активирует ваше RestraintName +That should slow you down! +Это должно тебя замедлить! +Try running away now~ +Попробуй сбежать сейчас~ +Initiating prisoner lockdown protocol--Unknown hardware detected +Запускаю протокол изоляции заключенного--Обнаружено неизвестное оборудование +What's this do? +Для чего это нужно? +That harness you're wearing is quite convenient for me~ +Ремни, которые на тебе надеты, для меня очень удобны~ +Initiating prisoner lockdown protocol +Запускаю протокол изоляции заключенного +Your RestraintName suddenly snap together as the EnemyName activates them! +Ваши RestraintName внезапно соединяются, когда EnemyName активирует их! +Your harness projects energy tethers between your cuffs EnemyName activates it! +Ваша сбруя пропускает энергетические нити между вашими оковами, когда EnemyName активирует ее! +Turn Count: +Счетчик ходов: +The Shopkeeper leashes you! +Владелица магазина вешает на вас поводок! +You are brought into the Shopkeeper's establishment... +Вы попадаете в заведение лавочницы... +It seems to be working! The seal on your RESTRAINTNAME is weakened. +Кажется, это работает! Печать на твоём RESTRAINTNAME ослабевает. +The cursed seal on your RESTRAINTNAME disappears. +Проклятая печать на вашем RESTRAINTNAME исчезает. +You are moved along by the conveyor... +Вы перемещаетесь по конвейеру... +Strange machinery begins sealing you in shiny latex! +Странный механизм начинает запечатывать вас в блестящий латекс! +Metallic arms insert something into you! +Металлические руки что-то вставляют в вас! +Metallic arms attach a chastity belt over your waist! +Металлические руки закрепляют пояс верности на вашей талии! +Metallic arms wrap you in tape! +Металлические руки обматывают вас лентой! +Metallic arms wrap you in strict restraints! +Металлические руки заключают вас в надёжные оковы! +Metallic arms install various cybernetic restraints! +Металлические руки устанавливают различные кибернетические ограничители! +You've sprung a trap! You've been stunned. +Вы активировали ловушку! Вы были оглушены. +The bandit leaves behind a sneaky trap... +Бандитка оставляет после себя коварную ловушку... +Damsel Trap +Ловушка для девицы +Damsel Trap +Ловушка для девицы +The ENEMYNAME transforms nearby dolls into her subjects! +ENEMYNAME превращает близлежащих кукол в своих подданных! +The ENEMYNAME transforms nearby dolls into her subjects! +ENEMYNAME превращает близлежащих кукол в своих подданных! +You wriggle around while struggling... +Вы извиваетесь в попытках бороться с ограничителями... +The missile explodes into a shower of latex that covers you! +Ракета взрывается, вызывая ливень из латекса, который накрывает вас! +Rubber Missile Direct Hit +Прямое Попадание Резиновой Ракеты +Rubber Missile +Резиновая Ракета +Rubber Nuke Direct Hit +Прямое Попадание Резиновой Боеголовки +Rubber Nuke +Резиновая Боеголовка +(In the center of the room stands a woman wearing a latex dress)|(Around her are robotic servants, obeying her without a word)|(She has been watching you this entire time) +(В центре комнаты стоит женщина в латексном платье)|(Вокруг нее роботы-слуги, подчиняющиеся ей без единого слова)|(Все это время она наблюдала за вами) +And who might you be? +И кем бы вы могли быть? +(Tilt your head) +(Наклоните голову) +(The woman's mask reflects the harsh industrial light)|You don't know who I am?|Hmmph, and I suppose my servants haven't told you...|They call me the Dollmaker. +(Маска женщины отражает приглушенный промышленный свет)|Ты не знаешь, кто я?|Хм, и я полагаю, мои слуги тебе не сказали...|Они называют меня Кукольницей. +So you're the one they talked about. +Значит, они говорили именно о вас. +(Nod and continue) +(Кивнуть и продолжить) +(Tuck your staff behind your back...) +(Убрать посох за спину...) +(The Dollmaker points at you)|Is that--? +(Кукольница указывает на вас)|Это--? +(Panic!) +(Паника!) +You must be the Dollmaker. +Вы, должно быть, Кукольница. +(The woman chuckles)|Correct.|And you must be the adventurer causing the recent troubles. +(Женщина хихикает)|Правильно.|А ты, должно быть, та самая авантюристка, которая вызвала недавние неприятности. +I'm famous! +Я знаменита! +(Nod happily) +(Радостно кивнуть) +Indeed. And I'm here to bring you down. +Действительно. И я здесь для того, чтобы победить тебя. +(Scoff at her) +(Насмехаться над ней) +(Tuck your staff behind your back...) +(Убрать посох за спину...) +(The Dollmaker points at you)|Is that--? +(Кукольница указывает на вас)|Это--? +(Panic!) +(Паника!) +(Attack her without saying anything) +(Напасть на нее, ничего не сказав) +(The Dollmaker folds her arms)|In any case, your journey ends here.|I do not appreciate scoundrels poking around in my domain.|I will personally lead you to your new future as a doll. +(Кукольница складывает руки на груди)|В любом случае, твоё путешествие заканчивается здесь.|Я не одобряю, когда всяие негодницы шныряют по моим владениям.|Я лично поведу тебя к твоему новому будущему в качестве куклы. +Do you have the Mistress' Staff? +У тебя есть Посох Госпожи? +(The Dollmaker chuckles)|That trinket?|So that's what you're after!|As a matter of fact, I do not have it.|It belongs to a certain Archmagus. +(Кукольница хихикает)|Эта безделушка?|Так вот чего ты ищешь!|На самом деле, у меня его нет.|Он принадлежит некоему архимагу. +Then you are of no use to me. +Тогда ты мне ни к чему. +(The Dollmaker summons a drone to her side)|Such arrogance! I'll have to teach you some manners! +(Кукольница подзывает к себе дрона)|Какое высокомерие!Мне придется научить тебя хорошим манерам! +What a bother. +Какое беспокойство. +Who? +Кто? +(The Dollmaker explains)|Archmagus Sariel Vinlaga. I'm surprised you didn't know.|Not that it matters for a future doll like you. +(Кукольница объясняет)|Архимаг Сариэль Винлага. Я удивлена, что ты не знала.|Не то чтобы это имело значение для будущей куклы вроде тебя. +We'll see about that. +Мы еще посмотрим. +...Sariel Vinlaga. +...Сариэль Винлага. +(The Dollmaker nods)|Yes. She is down here.|But this information is irrelevant to your future as a doll. +(Кукольница кивает)|Да. Она здесь, внизу.|Но эта информация не имеет отношения к твоему кукольному будущему. +The Staff will be mine. +Посох будет моим. +Fair enough. Let's fight! +Достаточно. Время битвы! +We'll see about that! +Посмотрим, кто кого! +Hmmmph! +Хмммфх! +Feel free to try. +Не стесняйся пробовать. +Mmmmmghh! +Ммммгх! +Sounds fun... but I really need to get going. +Звучит забавно... но мне действительно нужно идти. +Mmmmph... +Ммммфх... +(The Dollmaker folds her arms as she walks over)|All tight and shiny!|You'll be my prized possession~ +(Кукольница складывает руки на груди, подходя к вам)|Так туго обтянутая, и такая блестящая!|Ты будешь моей любимой куклой~ +(The Dollmaker nods)|Already eager to obey!|So beautiful... +(Кукольница кивает)|Уже готова повиноваться!|Красавица... +(The Dollmaker chuckles)|Oh, but I already have~ +(Кукольница хихикает)|Ох, но у меня уже есть...~ +I have no choice but to submit. +У меня нет другого выбора, кроме как подчиниться. +Mmmph. (Submit) +Ммммфх. (Подчиниться) +You will never get away with this! +Тебе это никогда не сойдет с рук! +Mmmph! (Struggle weakly) +Ммммфх! (Пытаться сопротивляться) +(Sigh and be forced to wear her visor) +(Вздохнуть и вынужденно надеть визор) +(Sigh and be forced to wear her mask) +(Вздохнуть и вынужденно надеть маску) +(Sigh and be forced to wear whatever she chooses) +(Вздохнуть и вынужденно надеть то, что она выберет) +(The Dollmaker places her visor over your face)|(With a click, you feel its fasteners lock around your head)|Now... as it stands, I have a task for you, doll.|You see, some dolls have been escaping my realm.|I want you to go capture them. +(Кукольница закрывает тебе лицо визором)|(Вы чувствуете, как застежки защелкиваются вокруг вашей головы)|А теперь... когда ты в таком виде, у меня есть задание для тебя, куколка.|Видишь ли, некоторые куклы сбежали из моего царства.|Я хочу, чтобы ты пошла и поймала их. +(The Dollmaker suddenly teleports away)|Hmmph. Looks like I will have to use my heavy firepower. +(Кукольница внезапно телепортируется)|Хммм. Похоже, мне придется использовать свою тяжелую огневую мощь. +(The Dollmaker sinks into a puddle of slime and emerges nearby)|(Robotic arms sprout from her back as she storms toward you!) +(Кукольница погружается в лужу слизи и выныривает неподалеку)|(Роботизированные руки вырастают из ее спины, и она несется к вам!) +(The Dollmaker concedes defeat)|You have defeated me.|I... I... will let you pass.|(The door exit door unlocks with an audible click) +(Кукольница признает свое поражение)|Ты победила меня.|Я... я... позволю тебе пройти.|(Выходная дверь со щелчком открывается) +(SPEAKER looks confused)|What are you... Okay, you can have it... +(SPEAKER выглядит удивленной)|Что ты... Ладно, ты можешь забрать это... +(Wear a doll visor) +(Надеть Визор Куклы) +(SPEAKER looks confused)|What are you... Okay, you can have it... +(SPEAKER выглядит удивленной)|Что ты... Ладно, ты можешь забрать это... +(Wear a doll mask) +(Надеть Кукольную Маску) +(You lift up the dollmaker's mask, revealing a pouting young woman inside)|What are you--|(You insert a gag into her open mouth and she starts mumbling angrily) +(Вы поднимаете маску кукольницы, открывая лицо надувшейся молодую женщины)|Что ты--|(Вы вставляете кляп в ее открытый рот, и она начинает сердито что-то мямлить) +(Gag her) +(Заткнуть её кляпом) +The Dollmaker calls in drone reinforcements! +Кукольница вызывает подкрепление из дронов! +The Dollmaker releases many drones with robotic arms to capture you! +Кукольник выпускает множество дронов с роботизированными руками, чтобы захватить вас! +Zombies emerge from the ground! +Зомби появляются из-под земли! +Cyber Ankle Cuffs +Кибер-манжеты на лодыжки +Ankle cuffs of exquisite quality, bearing all the marks of Old Civilization technology. +Технологичные манжеты на лодыжки, несущие на себе все признаки технологии Древней цивилизации. +Though made of ultra-tough metal, they feel light on your ankles... +Несмотря на то, что они сделаны из сверхпрочного металла, они кажутся очень легкими... +An energy link appears, linking your ankles close together! +Появляется энергетическая связь, соединяющая ваши лодыжки вплотную друг к другу! +Energy Link +Энергетическая связь +An energy link connecting your ankle cuffs together. +Энергетическое звено, соединяющее манжеты на лодыжках вместе. +It's powered by a chaos-resonance matrix, which can be overloaded by cutting the field. +Она питается от матрицы резонанса хаоса, которую можно перегрузить, разрезав поле. +The energy link disappears, freeing your ankles! +Энергетическая связь исчезает, освобождая ваши лодыжки! +Your ankles snap together as the cuffs activate! +Ваши лодыжки стягиваются, когда активируются манжеты! +Cyber Cuffs Chain +Цепочка кибер-манжет +A magnetic link keeping your ankles tightly connected. +Магнитное звено, надежно соединяющее ваши лодыжки. +The cuffs are closely attached, so you can't cut the link apart. +Манжеты плотно прилегают друг к другу, так что вы не сможете разрезать звено. +The ankle cuffs detach with a beep! +Манжеты на щиколотках разъединяются со звуковым сигналом! +Cyber Leg Cuffs +Кибер-манжеты для ног +Thigh cuffs of exquisite quality, bearing all the marks of Old Civilization technology. +Технологичные набедренные манжеты, несущие на себе все признаки технологии Древней цивилизации. +Though made of ultra-tough metal, they feel light on your legs... +Несмотря на то, что они сделаны из сверхпрочного металла, они кажутся очень легкими... +An energy link appears, linking your thighs close together! +Появляется энергетическая связь, соединяющая ваши бедра вплотную друг к другу! +Energy Link +Энергетическая связь +An energy link connecting your leg cuffs together. +Энергетическое звено, соединяющее ваши ножные манжеты прижатыми друг к другу. +It's powered by a chaos-resonance matrix, which can be overloaded by cutting the field. +Она питается от матрицы резонанса хаоса, которую можно перегрузить, разрезав поле. +The energy link disappears, freeing your legs! +Энергетическая связь исчезает, освобождая ваши ноги! +Cyber Cuffs +Кибер-манжеты +Wrist and elbow cuffs of exquisite quality, bearing all the marks of Old Civilization technology. +Технологичные манжеты на запястьях и локтях, несущие на себе все признаки технологии Древней цивилизации. +Though made of ultra-tough metal, they feel light on your wrists... +Несмотря на то, что они сделаны из сверхпрочного металла, они кажутся очень легкими... +Your wrists are pulled together as the cuffs activate! +Ваши запястья стягиваются вместе, когда манжеты активируются! +Cyber Wrist Link +Кибер-связь на запястьях +A magnetic link keeping your wrists secured together. +Магнитное звено, удерживающее ваши запястья прижатыми друг к другу. +The cuffs are closely attached, so you can't cut the link apart. +Манжеты плотно прилегают друг к другу, так что вы не сможете разрезать звено. +Your cuffs detatch with a beep! +Ваши манжеты разъединяются с звуковым сигналом! +Your elbows snap together as the cuffs engage fully! +Ваши локти сжимаются вместе, когда манжеты полностью включаются! +Cyber Connection +Кибер-связь +A magnetic link keeping your wrists and elbows inescapably secured. +Магнитное звено надежно фиксирует ваши запястья и локти. +The cuffs are closely attached, so you can't cut the link apart. +Манжеты плотно прилегают друг к другу, так что вы не сможете разрезать звено. +Your wrists detatch with a beep, leaving your elbows still bound! +Ваши запястья разъединяются со звуковым сигналом, но локти по-прежнему скованы! +Your arms snap fully together as the cuffs activate! +Ваши руки полностью скрепляются вместе, когда активируются манжеты! +Cyber Elbow Link +Кибер-связь на локтях +A magnetic link keeping your elbows pressed tightly together! +Магнитное звено, удерживающее ваши локти плотно прижатыми друг к другу! +The cuffs are closely attached, so you can't cut the link apart. +Манжеты плотно прилегают друг к другу, так что вы не сможете разрезать звено. +Your elbows detatch with a beep! +Ваши локти разъединяются со звуковым сигналом! +Your arms snap fully together as the cuffs activate! +Ваши руки полностью скрепляются вместе, когда активируются манжеты! +Doll Gag +Кукольный кляп +A soft ball pressed against your lips and held in place with metallic straps. +Мягкий шарик прижимается к вашим губам и удерживается на месте металлическими ремешками. +The straps are made of a flexible metal with no visible seams along the straps. +Ремешки изготовлены из гибкого металла без видимых швов вдоль материала. +Doll Plug Gag +Кукольный кляп с пробкой +A soft, flexible plug pressed into your mouth and held in place with a metal shield. +Мягкая, гибкая пробка, вставляемая в рот и удерживаемая на месте металлическим щитком. +The straps are made of a flexible metal with no visible seams along the straps. +Ремешки изготовлены из гибкого металла без видимых швов вдоль материала. +Doll Muzzle +Кукольный намордник +A metallic shield preventing you from removing any gags underneath. +Металлический щиток, предотвращающий извлечение любых кляпов из-под него. +It's made of exquisite Old Civilization metals, resistant to almost all forms of damage. +Этот ограничитель изготовлен из технологичных металлов Древней цивилизации, устойчивых практически ко всем видам повреждений. +Cyber Mittens +Кибер-варежки +These mittens force your hands into fists, keeping you from using them to do anything useful. +Эти варежки сжимают ваши руки в кулаки, не позволяя вам использовать их для чего-либо полезного. +It is made of a strong mesh of ancient metallic fiber, kept in place with a metal band. +Они изготовлены из прочной сетки из древнего металлического волокна, которая удерживается на месте с помощью металлической ленты. +Cyber Lockdown Mitts +Изолирующие кибер-варежки +These long mittens force your hands into fists, keeping you from using them to do anything useful. +Эти длинные варежки сжимают ваши руки в кулаки, не позволяя вам использовать их для чего-либо полезного. +It is made of a strong mesh of ancient metallic fiber, wrapped snugly around your arms to make removal by yourself impossible. +Они изготовлены из прочной сетки из древнего металлического волокна, плотно обхватывающей ваши руки, что делает невозможным самостоятельное снятие. +Doll Heels +Кукольные каблуки +A pair of tall heels used to improve the aesthetics and controllability of dolls. +Пара обуви на высоких каблуках, используемая для улучшения эстетики и управляемости кукол. +It's made of exquisite Old Civilization metals, resistant to almost all forms of damage. +Этот ограничитель изготовлен из технологичных металлов Древней цивилизации, устойчивых практически ко всем видам повреждений. +Cyber Doll Belt +Кукольный кибер-пояс +A chastity belt created by the Old Civilization. Truly a marvel of science! +Пояс целомудрия, созданный Древней цивилизацией. Поистине чудо науки! +It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with a advanced form of latex designed for permanent wear. +Он изготовлен из технологичных металлов Древней цивилизации, устойчивых практически ко всем видам повреждений, и дополнен усовершенствованным видом латекса, предназначенным для постоянного ношения. +Cyber Doll Bra +Кукольный кибер-бюстгальтер +A chastity bra created by the Old Civilization. Truly a marvel of science! The flexible material over the breasts hardens when squeezed, unless allowed for by the program. +Бюстгальтер целомудрия, созданный Древней цивилизацией. Поистине чудо науки! Эластичный материал, закрывающий грудь, твердеет при сжатии, если это не разрешено программой. +It's made of exquisite Old Civilization metals, resistant to almost all forms of damage, and padded with an advanced form of latex designed for permanent wear. +Он изготовлен из технологичных металлов Древней цивилизации, устойчивых практически ко всем видам повреждений, и дополнен усовершенствованным видом латекса, предназначенным для постоянного ношения. +Doll Jacket +Кукольный жакет +A jacket used to secure particularly unruly dolls. +Жакет, используемый для сдерживания особо непослушных кукол. +The material is somehow both stretchy yet hard enough to chip a knife on. The pinnacle of Old Civilization materials science. +Материал каким-то образом одновременно эластичный и в то же время достаточно твердый, чтобы его нельзя было порезать ножом. Вершина материаловедения Древней цивилизации. +Dollmaker's Visor +Визор Кукольницы +A visor used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. +Визор, используемый кукольницей для выдачи всевозможных заданий своим куклам. Дверь на следующий этаж не откроется, пока вы не выполняете свои обязанности по захвату кукол. +It's made of metallic glass, almost indestructible. Fortunately, it's still possible to see through. +Этот ограничитель изготовлен из металлического стекла, практически неразрушимого. К счастью, через это стекло всё еще можно смотреть. +Dollmaker's Mask +Маска Кукольницы +A mask used by the Dollmaker for assigning arbitrary tasks to her dolls. The door to the next level won't open unless you perform your duties capturing dolls. +Маска, используемая кукольницей для выдачи всевозможных заданий своим куклам. Дверь на следующий этаж не откроется, пока вы не выполняете свои обязанности по захвату кукол. +It's made of metallic glass, almost indestructible. Fortunately, it's still possible to see through. +Этот ограничитель изготовлен из металлического стекла, практически неразрушимого. К счастью, через это стекло всё еще можно смотреть. +Detected new hardware. +Обнаружено новое оборудование. +[Restriction Protocol] Detected new hardware: RESTRAINTNAME. Install progress: PERCENT% +[Протокол Ограничения] Обнаружено новое оборудование: RESTRAINTNAME. Прогресс установки: PERCENT% +[Restriction Protocol] Installation complete. Completing uniform. +[Протокол Ограничения] Установка завершена. Завершение униформы. +[Punishment] Engage mobility restrictions. +[Наказание] Задействуется ограничение мобильности. +[Training Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% +[Протокол Тренировки] Обнаружено новое оборудование: RESTRAINTNAME. Прогресс установки: PERCENT% +Supplemental Stimulation +Дополнительная стимуляция +Endurance Training +Тренировка выносливости +Frustration Tolerance +Терпимость к разочарованию +Mental Resistance +Ментальное сопротивление +[Training Protocol] Installation complete. Engage training mode: CHASTITYMODE +[Протокол Тренировки] Установка завершена. Включен тренировочный режим: CHASTITYMODE +You feel your belt insert new toys into your body... +Вы чувствуете, как пояс вставляет новые игрушки в ваше тело... +[Sensory Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% +[Сенсорный Протокол] Обнаружено новое оборудование: RESTRAINTNAME. Прогресс установки: PERCENT% +[Sensory Protocol] Installation complete. Engage sensory restrictions. +[Сенсорный Протокол] Установка завершена. Активация сенсорного ограничения. +[Tracking Protocol] Detected hardware: RESTRAINTNAME. Install progress: PERCENT% +[Протокол Отслеживания] Обнаружено новое оборудование: RESTRAINTNAME. Прогресс установки: PERCENT% +[Tracking Protocol] Installation complete. Engage tracing system. +[Протокол Отслеживания] Установка завершена. Активация системы слежения. +Your visor dims to help you focus on your task. +Ваш визор затемняется, чтобы помочь вам сосредоточиться на своей задаче. +Escaped Doll +Сбежавшая кукла +You return the doll to her rightful owner. +Вы возвращаете куклу ее законному владельцу. +Your movement sets off your [RESTRAINTNAME] +Ваше движение выделяет [RESTRAINTNAME] +Your struggling sets off your [RESTRAINTNAME] +Ваша борьба активирует [RESTRAINTNAME] +Your attack sets off your [RESTRAINTNAME] +Ваши атаки активируют [RESTRAINTNAME] +The straps on your gag prevent you from loosening the blindfold! +Ремешки на вашем кляпе мешают вам ослабить повязку на глазах! +The straps on your gag keep your blindfold securely in place! +Ремешки на вашем кляпе надежно удерживают повязку на глазах! +Revert +Отменить +Confirm Revert? +Подтвердить отмену? +Save +Сохранить +Save Changes? +Сохранить изменения? +Back to Menu +Вернуться в меню +Back to Wardrobe +Вернуться в гардероб +Confirm Strip? +Подтвердить раздевание? +Strip! +Раздеться! +Export Outfit +Экспортировать наряд +Export AlwaysDress +Экспортировать AlwaysDress +Export Hair +Экспорт прически +Export Face +Экспорт лица +Export Cosplay +Экспорт наряда +Gamma +Гамма +Original Color +Оригинальный цвет +Contrast +Контраст +Brightness +Яркость +Red +Красный +Green +Зеленый +Blue +Синий +Transparency +Прозрачность +Reset Layer! +Сбросить слой! +Reset Properties! +Сбросьте свойства! +Export All Layers +Экспортировать все слои +Export All Props +Экспортировать все свойства +Copy +Копировать +Paste +Вставить +Items on Ground: +Предметы на земле: +Preloading Character Assets: +Предзагрузка ассетов персонажа: +Uniforms +Униформа +Suits +Костюмы +Armor +Броня +Underwear +Нижнее белье +Bras +Бюстгальтеры +Bodysuits +Боди +Socks +Чулки +Shoes +Обувь +Tops +Верхнее +Sleeves +Рукава +Corsets +Корсеты +Skirts +Юбки +Pants +Штаны +Accessories +Аксессуары +Fashion Restraints +Модные ограничители +Hats +Шляпы +Toys and Piercings +Игрушки и пирсинг +Hairstyles +Прически +Face +Лицо +Eyes +Глаза +Mouth +Рот +Body +Тело +Gloves +Перчатки +'Cosplay' +'Косплей' +Weapons +Оружие +Cat Eyes +Саt Еyеs +Right Eye +Right Еyе +Left Eye +Lеft Еyе +Cat Brows +Саt Вrоws +Right Brow +Right Вrоw +Left Brow +Lеft Вrоw +Simple Mouth +Simplе Mоuth +Mouth +Mоuth +Simple Blush +Simplе Вlush +Blush +Вlush +Braid +Вrаid +Braid Front +Вrаid Frоnt +Braid Back +Вrаid Васk +Bangs Only +Ваngs Оnly +Bangs +Ваngs +Braid+Back +Вrаid+Васk +Braid Upper +Вrаid Uppеr +Braid Lower +Вrаid Lоwеr +Back Only +Васk Оnly +Braid Upper +Вrаid Uppеr +Ahoge +Аhоgе +Ahoge +Аhоgе +Body +Воdy +Head +Hеаd +Torso +Тоrsо +Catsuit +Саtsuit +Torso Lower +Тоrsо Lоwеr +Torso Upper +Тоrsо Uppеr +Labcoat +Lаbсоаt +Shoulders +Shоuldеrs +ShouldersHogtie +ShоuldеrsHоgtiе +Coat +Соаt +CoatHogtieFree +СоаtHоgtiеFrее +Cape +Саpе +Pauldrons +Pаuldrоns +Pauldrons +Pаuldrоns +Breastplate +Вrеаstplаtе +Breastplate +Вrеаstplаtе +PlateBoots +PlаtеВооts +BootLeft +ВооtLеft +BootRight +ВооtRight +BootRightKneel +ВооtRightKnееl +BootLeftHogtie +ВооtLеftHоgtiе +Gauntlets +Gаuntlеts +GauntletLeft +GаuntlеtLеft +GauntletRight +GаuntlеtRight +PlateArmor +PlаtеАrmоr +Breastplate +Вrеаstplаtе +Pauldrons +Pаuldrоns +BootLeft +ВооtLеft +BootRight +ВооtRight +BootRightKneel +ВооtRightKnееl +BootLeftHogtie +ВооtLеftHоgtiе +GauntletLeft +GаuntlеtLеft +GauntletRight +GаuntlеtRight +ChainShirt +СhаinShirt +ShirtChest +ShirtСhеst +Shirt +Shirt +ChainSkirt +СhаinSkirt +Skirt +Skirt +ChainArmor +СhаinАrmоr +ShirtChest +ShirtСhеst +Shirt +Shirt +Skirt +Skirt +BanditShorts +ВаnditShоrts +Shorts +Shоrts +BanditLeftWrist +ВаnditLеftWrist +WristLeft +WristLеft +BanditRightWrist +ВаnditRightWrist +WristRight +WristRight +BanditWrist +ВаnditWrist +WristLeft +WristLеft +WristRight +WristRight +BanditBoots +ВаnditВооts +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +BanditBreastplate +ВаnditВrеаstplаtе +Breastplate +Вrеаstplаtе +Bandit +Ваndit +Shorts +Shоrts +Breastplate +Вrеаstplаtе +WristLeft +WristLеft +WristRight +WristRight +Striped Skirt +Stripеd Skirt +Skirt +Skirt +MaidApron +MаidАprоn +Apron +Аprоn +MaidBlouse +MаidВlоusе +Blouse +Вlоusе +BlouseBust +ВlоusеВust +MaidBow +MаidВоw +Bow +Воw +MaidCorset +MаidСоrsеt +Corset +Соrsеt +MaidCorsetFull +MаidСоrsеtFull +Corset +Соrsеt +CorsetStraps +СоrsеtStrаps +MaidSockLeft +MаidSосkLеft +SockLeft +SосkLеft +MaidSockRight +MаidSосkRight +SockRight +SосkRight +MaidShoes +MаidShоеs +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +MaidSocks +MаidSосks +SockRight +SосkRight +SockLeft +SосkLеft +Maidforce Agent +Mаidfоrсе Аgеnt +Skirt +Skirt +Blouse +Вlоusе +BlouseBust +ВlоusеВust +Corset +Соrsеt +CorsetStraps +СоrsеtStrаps +SockRight +SосkRight +SockLeft +SосkLеft +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Bow +Воw +Elven +Еlvеn +Bunny Suit +Вunny Suit +Dress +Drеss +WitchBlouse +WitсhВlоusе +Blouse +Вlоusе +BlouseLiner +ВlоusеLinеr +BlouseBust +ВlоusеВust +WitchCorset +WitсhСоrsеt +Corset +Соrsеt +WitchHat +WitсhHаt +WitchHat +WitсhHаt +WitchHatBack +WitсhHаtВасk +ApprenticeHat +АpprеntiсеHаt +ApprenticeHat +АpprеntiсеHаt +ApprenticeHatPuff +АpprеntiсеHаtPuff +WitchShoes +WitсhShоеs +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +WitchSkirt +WitсhSkirt +Skirt +Skirt +SkirtBelt +SkirtВеlt +SkirtRuffle +SkirtRufflе +Witch +Witсh +Skirt +Skirt +SkirtBelt +SkirtВеlt +SkirtRuffle +SkirtRufflе +Corset +Соrsеt +Blouse +Вlоusе +BlouseLiner +ВlоusеLinеr +BlouseBust +ВlоusеВust +WitchHat +WitсhHаt +WitchHatBack +WitсhHаtВасk +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +WarriorBoots +WаrriоrВооts +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +SportsBra +SpоrtsВrа +Bra +Вrа +WarriorBustier +WаrriоrВustiеr +BustierChest +ВustiеrСhеst +Bustier +Вustiеr +WarriorBelt +WаrriоrВеlt +Belt +Веlt +DragonNecklace +DrаgоnNесklасе +Necklace +Nесklасе +DragonArmband +DrаgоnАrmbаnd +Armband +Аrmbаnd +DragonCollar +DrаgоnСоllаr +Collar +Соllаr +WarriorSkirt +WаrriоrSkirt +Skirt +Skirt +Dragonheart +Drаgоnhеаrt +Skirt +Skirt +BustierChest +ВustiеrСhеst +Bustier +Вustiеr +Belt +Веlt +Bra +Вrа +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Collar +Соllаr +Necklace +Nесklасе +Armband +Аrmbаnd +ZombieHat +ZоmbiеHаt +ZombieHat +ZоmbiеHаt +ZombieHatBand +ZоmbiеHаtВаnd +ZombieChestTalisman +ZоmbiеСhеstТаlismаn +ZombieChestTalisman +ZоmbiеСhеstТаlismаn +ZombieTalisman +ZоmbiеТаlismаn +ZombieTalisman +ZоmbiеТаlismаn +ZombieTalismanBent +ZоmbiеТаlismаnВеnt +ZombieTalismanBent +ZоmbiеТаlismаnВеnt +Sandals +Sаndаls +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +RobeBra +RоbеВrа +Bra +Вrа +RobeSleeveLeft +RоbеSlееvеLеft +SleeveLeft +SlееvеLеft +RobeSleeveRight +RоbеSlееvеRight +SleeveRight +SlееvеRight +RobeSleeves +RоbеSlееvеs +SleeveLeft +SlееvеLеft +SleeveRight +SlееvеRight +RobeSleeveDecoLeft +RоbеSlееvеDесоLеft +SleeveDecoLeft +SlееvеDесоLеft +RobeSleeveDecoRight +RоbеSlееvеDесоRight +SleeveDecoRight +SlееvеDесоRight +RobeSleevesDeco +RоbеSlееvеsDесо +SleeveDecoLeft +SlееvеDесоLеft +SleeveDecoRight +SlееvеDесоRight +Ribbon +Ribbоn +RibbonBelt +RibbоnВеlt +RibbonBack +RibbоnВасk +RobeSkirt +RоbеSkirt +Skirt +Skirt +Robes +Rоbеs +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +SleeveLeft +SlееvеLеft +SleeveRight +SlееvеRight +SleeveDecoLeft +SlееvеDесоLеft +SleeveDecoRight +SlееvеDесоRight +Skirt +Skirt +Bra +Вrа +RibbonBelt +RibbоnВеlt +RibbonBack +RibbоnВасk +Arm Ropes +Аrm Rоpеs +Upper Chest Strap +Uppеr Сhеst Strаp +Shoulder Straps +Shоuldеr Strаps +Lower Chest Straps +Lоwеr Сhеst Strаps +Arm Straps +Аrm Strаps +HairBow +HаirВоw +Bow‎ +Воw‎ +HairBowFrilly +HаirВоwFrilly +Bow‎ +Воw‎ +BowFrills +ВоwFrills +Hairband +Hаirbаnd +Hairband +Hаirbаnd +MaidHairband +MаidHаirbаnd +Hairband +Hаirbаnd +MaidFrill +MаidFrill +BackStraight +ВасkStrаight +BackStraight +ВасkStrаight +Curly +Сurly +Curly +Сurly +Curly_Overstrap +Сurly_Оvеrstrаp +Fluffy +Fluffy +Fuzzy +Fuzzy +Fuzzy_Overstrap +Fuzzy_Оvеrstrаp +FrontStraight +FrоntStrаight +FrontStraight +FrоntStrаight +FrontStraight_Overstrap +FrоntStrаight_Оvеrstrаp +Straight +Strаight +Straight +Strаight +Straight_Overstrap +Strаight_Оvеrstrаp +StraightBangs +StrаightВаngs +StraightBangs +StrаightВаngs +StraightBangs_Overstrap +StrаightВаngs_Оvеrstrаp +MessyBack +MеssyВасk +Messy +Mеssy +MessyBackShort +MеssyВасkShоrt +Short Messy +Shоrt Mеssy +Underlight +Undеrlight +CurlyBack +СurlyВасk +Curly Back +Сurly Васk +Underlight +Undеrlight +Ponytail +Pоnytаil +Ponytail +Pоnytаil +FluffyPonytail +FluffyPоnytаil +Ponytail2 +Pоnytаil2 +TwintailLeft +ТwintаilLеft +TwintailLeft +ТwintаilLеft +TwintailRight +ТwintаilRight +TwintailRight +ТwintаilRight +Ahoge +Аhоgе +Head +Hеаd +ArmRight +АrmRight +ArmLeft +АrmLеft +ShoulderRight +ShоuldеrRight +ShoulderLeft +ShоuldеrLеft +ForeArmRight +FоrеАrmRight +ForeArmLeft +FоrеАrmLеft +HandRight +HаndRight +HandLeft +HаndLеft +ForeHandRight +FоrеHаndRight +ForeHandLeft +FоrеHаndLеft +LegLeft +LеgLеft +Torso +Тоrsо +Chest +Сhеst +FootRightKneel +FооtRightKnееl +FootLeftHogtie +FооtLеftHоgtiе +LegRight +LеgRight +Butt +Вutt +Eyes +Еyеs +Eyes2 +Еyеs2 +Whites +Whitеs +Whites2 +Whitеs2 +HumanEyes +HumаnЕyеs +Right Eye +Right Еyе +Left Eye +Lеft Еyе +Whites +Whitеs +Whites2 +Whitеs2 +Brows +Вrоws +Brows2 +Вrоws2 +Mouth +Mоuth +Blush +Вlush +KjusEyes +KjusЕyеs +Right Eye +Right Еyе +Left Eye +Lеft Еyе +Whites +Whitеs +Whites2 +Whitеs2 +KjusBrows +KjusВrоws +Right Brow +Right Вrоw +Left Brow +Lеft Вrоw +KjusMouth +KjusMоuth +Mouth +Mоuth +KjusBlush +KjusВlush +Blush +Вlush +Hikimayu +Hikimаyu +Right Brow +Right Вrоw +Left Brow +Lеft Вrоw +DaskEyes +DаskЕyеs +Right Eye +Right Еyе +Left Eye +Lеft Еyе +Whites +Whitеs +Whites2 +Whitеs2 +ElfEars +ЕlfЕаrs +ElfFront +ЕlfFrоnt +ElfBack +ЕlfВасk +ElfEarsLong +ЕlfЕаrsLоng +ElfLongFront +ЕlfLоngFrоnt +ElfLongBack +ЕlfLоngВасk +ElfEarsFloppy +ЕlfЕаrsFlоppy +ElfFloppyFront +ЕlfFlоppyFrоnt +ElfFloppyBack +ЕlfFlоppyВасk +ElfEarrings +ЕlfЕаrrings +ElfEarringsFront +ЕlfЕаrringsFrоnt +ElfEarringsBack +ЕlfЕаrringsВасk +Earrings +Еаrrings +Earrings +Еаrrings +EarringsBack +ЕаrringsВасk +BunnyEars +ВunnyЕаrs +Ears +Еаrs +EarsInner +ЕаrsInnеr +KittyEars +KittyЕаrs +Kitty +Kitty +KittyInner +KittyInnеr +WolfEars +WоlfЕаrs +Wolf +Wоlf +WolfInner +WоlfInnеr +FoxEars +FоxЕаrs +Fox +Fоx +FoxInner +FоxInnеr +WolfTail +WоlfТаil +Wolf +Wоlf +KittyTail +KittyТаil +Kitty +Kitty +Kitty2Tail +Kitty2Таil +Kitty +Kitty +Kitty2 +Kitty2 +FoxTail +FоxТаil +Fox +Fоx +Fox2Tail +Fоx2Таil +Fox +Fоx +Fox2 +Fоx2 +Fox3Tail +Fоx3Таil +Fox3 +Fоx3 +Fox4Tail +Fоx4Таil +Fox4 +Fоx4 +Fox5Tail +Fоx5Таil +Fox5 +Fоx5 +Fox6Tail +Fоx6Таil +Fox6 +Fоx6 +Fox7Tail +Fоx7Таil +Fox7 +Fоx7 +CatsuitLower +СаtsuitLоwеr +TorsoLower +ТоrsоLоwеr +FootRight +FооtRight +FootRightKneel +FооtRightKnееl +FootLeft +FооtLеft +FootLeftHogtie +FооtLеftHоgtiе +LegRight +LеgRight +LegLeft +LеgLеft +Butt +Вutt +CatsuitUpper +СаtsuitUppеr +ArmRight +АrmRight +ArmLeft +АrmLеft +ShoulderRight +ShоuldеrRight +ShoulderLeft +ShоuldеrLеft +ForeArmRight +FоrеАrmRight +ForeArmLeft +FоrеАrmLеft +HandRight +HаndRight +HandLeft +HаndLеft +ForeHandRight +FоrеHаndRight +ForeHandLeft +FоrеHаndLеft +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +ArmRight +АrmRight +ArmLeft +АrmLеft +ShoulderRight +ShоuldеrRight +ShoulderLeft +ShоuldеrLеft +ForeArmRight +FоrеАrmRight +ForeArmLeft +FоrеАrmLеft +HandRight +HаndRight +HandLeft +HаndLеft +ForeHandRight +FоrеHаndRight +ForeHandLeft +FоrеHаndLеft +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +TorsoLower +ТоrsоLоwеr +FootRight +FооtRight +FootRightKneel +FооtRightKnееl +FootLeft +FооtLеft +FootLeftHogtie +FооtLеftHоgtiе +LegRight +LеgRight +LegLeft +LеgLеft +Butt +Вutt +TransparentCatsuit +ТrаnspаrеntСаtsuit +ArmRight +АrmRight +ArmLeft +АrmLеft +ShoulderRight +ShоuldеrRight +ShoulderLeft +ShоuldеrLеft +ForeArmRight +FоrеАrmRight +ForeArmLeft +FоrеАrmLеft +HandRight +HаndRight +HandLeft +HаndLеft +ForeHandRight +FоrеHаndRight +ForeHandLeft +FоrеHаndLеft +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +TorsoLower +ТоrsоLоwеr +FootRight +FооtRight +FootRightKneel +FооtRightKnееl +FootLeft +FооtLеft +FootLeftHogtie +FооtLеftHоgtiе +LegRight +LеgRight +LegLeft +LеgLеft +Butt +Вutt +Shoulders +Shоuldеrs +ShouldersHogtie +ShоuldеrsHоgtiе +Coat +Соаt +CoatHogtieFree +СоаtHоgtiеFrее +Cape +Саpе +Cape +Саpе +Shoulders +Shоuldеrs +ShouldersHogtie +ShоuldеrsHоgtiе +Cape +Саpе +Pauldrons +Pаuldrоns +Breastplate +Вrеаstplаtе +BootLeft +ВооtLеft +BootRight +ВооtRight +BootRightKneel +ВооtRightKnееl +BootLeftHogtie +ВооtLеftHоgtiе +GauntletLeft +GаuntlеtLеft +GauntletLeft +GаuntlеtLеft +GauntletRight +GаuntlеtRight +GauntletRight +GаuntlеtRight +GauntletRight +GаuntlеtRight +GauntletLeft +GаuntlеtLеft +Breastplate +Вrеаstplаtе +Pauldrons +Pаuldrоns +BootLeft +ВооtLеft +BootRight +ВооtRight +BootRightKneel +ВооtRightKnееl +BootLeftHogtie +ВооtLеftHоgtiе +GauntletRight +GаuntlеtRight +GauntletLeft +GаuntlеtLеft +Shirt +Shirt +ShirtChest +ShirtСhеst +Skirt +Skirt +Shirt +Shirt +ShirtChest +ShirtСhеst +Skirt +Skirt +Shorts +Shоrts +ShortsLeft +ShоrtsLеft +BanditPouch +ВаnditPоuсh +Pouch +Pоuсh +BanditKnee +ВаnditKnее +Knee +Knее +BanditChoker +ВаnditСhоkеr +Choker +Сhоkеr +WristLeft +WristLеft +WristRight +WristRight +WristLeft +WristLеft +WristRight +WristRight +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Breastplate +Вrеаstplаtе +Shorts +Shоrts +ShortsLeft +ShоrtsLеft +Breastplate +Вrеаstplаtе +WristLeft +WristLеft +WristRight +WristRight +Pouch +Pоuсh +Knee +Knее +Choker +Сhоkеr +Skirt +Skirt +Stripe +Stripе +SkirtOver +SkirtОvеr +StripeOver +StripеОvеr +Apron +Аprоn +Blouse +Вlоusе +BlouseBust +ВlоusеВust +Bow +Воw +Corset +Соrsеt +Corset +Соrsеt +CorsetStraps +СоrsеtStrаps +StockingLeft +StосkingLеft +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +StripeSockLeft +StripеSосkLеft +StockingRight +StосkingRight +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +StripeSockRight +StripеSосkRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +StripeSockLeft +StripеSосkLеft +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +StripeSockRight +StripеSосkRight +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Stockings +Stосkings +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +StripeSockRight +StripеSосkRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +StripeSockLeft +StripеSосkLеft +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +StripeSockRight +StripеSосkRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +StripeSockLeft +StripеSосkLеft +Skirt +Skirt +Stripe +Stripе +SkirtOver +SkirtОvеr +StripeOver +StripеОvеr +Blouse +Вlоusе +BlouseBust +ВlоusеВust +Corset +Соrsеt +CorsetStraps +СоrsеtStrаps +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +StripeSockRight +StripеSосkRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +StripeSockLeft +StripеSосkLеft +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Bow +Воw +BowFrills +ВоwFrills +BlouseLeft +ВlоusеLеft +BlouseRight +ВlоusеRight +BlouseLiner +ВlоusеLinеr +BlouseBust +ВlоusеВust +Corset +Соrsеt +WitchHat +WitсhHаt +WitchHatBack +WitсhHаtВасk +ApprenticeHat +АpprеntiсеHаt +ApprenticeHatPuff +АpprеntiсеHаtPuff +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Skirt +Skirt +SkirtOver +SkirtОvеr +SkirtRuffleOver +SkirtRufflеОvеr +SkirtBelt +SkirtВеlt +SkirtRuffle +SkirtRufflе +Skirt +Skirt +SkirtOver +SkirtОvеr +SkirtRuffleOver +SkirtRufflеОvеr +SkirtBelt +SkirtВеlt +SkirtRuffle +SkirtRufflе +Corset +Соrsеt +BlouseLeft +ВlоusеLеft +BlouseRight +ВlоusеRight +BlouseLiner +ВlоusеLinеr +BlouseBust +ВlоusеВust +WitchHat +WitсhHаt +WitchHatBack +WitсhHаtВасk +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Bra +Вrа +Bustier +Вustiеr +BustierChest +ВustiеrСhеst +LeatherGloveLeft +LеаthеrGlоvеLеft +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +RimGloveLeft +RimGlоvеLеft +RimForeGloveLeft +RimFоrеGlоvеLеft +BandGloveLeft +ВаndGlоvеLеft +BandForeGloveLeft +ВаndFоrеGlоvеLеft +LeatherGloveRight +LеаthеrGlоvеRight +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +RimGloveRight +RimGlоvеRight +RimForeGloveRight +RimFоrеGlоvеRight +BandGloveRight +ВаndGlоvеRight +BandForeGloveRight +ВаndFоrеGlоvеRight +LeatherGloves +LеаthеrGlоvеs +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +RimGloveLeft +RimGlоvеLеft +RimForeGloveLeft +RimFоrеGlоvеLеft +BandGloveLeft +ВаndGlоvеLеft +BandForeGloveLeft +ВаndFоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +RimGloveRight +RimGlоvеRight +RimForeGloveRight +RimFоrеGlоvеRight +BandGloveRight +ВаndGlоvеRight +BandForeGloveRight +ВаndFоrеGlоvеRight +Belt +Веlt +Necklace +Nесklасе +Armband +Аrmbаnd +Collar +Соllаr +Skirt +Skirt +SkirtOver +SkirtОvеr +Skirt +Skirt +SkirtOver +SkirtОvеr +Bustier +Вustiеr +BustierChest +ВustiеrСhеst +Belt +Веlt +Bra +Вrа +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Collar +Соllаr +Necklace +Nесklасе +Armband +Аrmbаnd +ZombieHat +ZоmbiеHаt +ZombieHatBand +ZоmbiеHаtВаnd +ZombieChestTalisman +ZоmbiеСhеstТаlismаn +ZombieTalisman +ZоmbiеТаlismаn +ZombieTalismanBent +ZоmbiеТаlismаnВеnt +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Bra +Вrа +Chest +Сhеst +SleeveLeft +SlееvеLеft +SleeveRight +SlееvеRight +SleeveLeft +SlееvеLеft +SleeveRight +SlееvеRight +SleeveDecoLeft +SlееvеDесоLеft +SleeveDecoRight +SlееvеDесоRight +SleeveDecoLeft +SlееvеDесоLеft +SleeveDecoRight +SlееvеDесоRight +RibbonBelt +RibbоnВеlt +RibbonBack +RibbоnВасk +RibbonFarBack +RibbоnFаrВасk +Skirt +Skirt +SkirtOver +SkirtОvеr +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +SleeveLeft +SlееvеLеft +SleeveRight +SlееvеRight +SleeveDecoLeft +SlееvеDесоLеft +SleeveDecoRight +SlееvеDесоRight +Skirt +Skirt +SkirtOver +SkirtОvеr +Bra +Вrа +Chest +Сhеst +RibbonBelt +RibbоnВеlt +RibbonBack +RibbоnВасk +RibbonFarBack +RibbоnFаrВасk +KiguMask +KiguMаsk +Mask +Mаsk +Eyes +Еyеs +Eyes2 +Еyеs2 +Lock +Lосk +EyesWhites +ЕyеsWhitеs +Mouth +Mоuth +Swimsuit +Swimsuit +Swimsuit +Swimsuit +SwimsuitChest +SwimsuitСhеst +StrappyBra +StrаppyВrа +ChestStrappy +СhеstStrаppy +VBikini +VВikini +VBikini +VВikini +StrappyBikini +StrаppyВikini +StrappyLower +StrаppyLоwеr +StrappyHarness +StrаppyHаrnеss +Strappy +Strаppy +StrappySwimsuit +StrаppySwimsuit +ChestStrappy +СhеstStrаppy +Strappy +Strаppy +StrappyLower +StrаppyLоwеr +BunnySockLeft +ВunnySосkLеft +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +BunnySockRight +ВunnySосkRight +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +BunnySocks +ВunnySосks +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +BunnySocksRestraint +ВunnySосksRеstrаint +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +BunnyGloveLeft +ВunnyGlоvеLеft +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +BunnyGloveRight +ВunnyGlоvеRight +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +BunnyGloves +ВunnyGlоvеs +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +BunnyGlovesRestraint +ВunnyGlоvеsRеstrаint +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +BunnyLeotard +ВunnyLеоtаrd +Leotard +Lеоtаrd +LeotardChest +LеоtаrdСhеst +Leotard +Lеоtаrd +LeotardChest +LеоtаrdСhеst +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +LaceCorset +LасеСоrsеt +LaceCorset +LасеСоrsеt +LaceCorsetHardware +LасеСоrsеtHаrdwаrе +LaceCorsetStripes +LасеСоrsеtStripеs +LaceCorsetCrystal +LасеСоrsеtСrystаl +LaceBra +LасеВrа +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LaceBustier +LасеВustiеr +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LaceDeco +LасеDесо +LaceChestDeco +LасеСhеstDесо +LaceChestDecoCrystal +LасеСhеstDесоСrystаl +LaceChestDecoHardware +LасеСhеstDесоHаrdwаrе +LaceBraDeco +LасеВrаDесо +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LaceChestDeco +LасеСhеstDесо +LaceChestDecoCrystal +LасеСhеstDесоСrystаl +LaceChestDecoHardware +LасеСhеstDесоHаrdwаrе +LaceCorsetRestraint +LасеСоrsеtRеstrаint +LaceCorset +LасеСоrsеt +LaceCorsetHardware +LасеСоrsеtHаrdwаrе +LaceCorsetStripes +LасеСоrsеtStripеs +LaceCorsetCrystal +LасеСоrsеtСrystаl +LaceBustierRestraint +LасеВustiеrRеstrаint +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LaceBraDecoRestraint +LасеВrаDесоRеstrаint +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LaceChestDeco +LасеСhеstDесо +LaceChestDecoCrystal +LасеСhеstDесоСrystаl +LaceChestDecoHardware +LасеСhеstDесоHаrdwаrе +BowCorsetBow +ВоwСоrsеtВоw +BowCorsetBow +ВоwСоrsеtВоw +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorsetBustBow +ВоwСоrsеtВustВоw +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorset +ВоwСоrsеt +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetLong +ВоwСоrsеtLоng +BowCorsetLong +ВоwСоrsеtLоng +BowCorsetLongRuffle +ВоwСоrsеtLоngRufflе +BowCorsetOverbust +ВоwСоrsеtОvеrbust +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetLongOverbust +ВоwСоrsеtLоngОvеrbust +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorsetLong +ВоwСоrsеtLоng +BowCorsetLongRuffle +ВоwСоrsеtLоngRufflе +BowCorsetOverbustBow +ВоwСоrsеtОvеrbustВоw +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetBow +ВоwСоrsеtВоw +BowCorsetLongOverbustBow +ВоwСоrsеtLоngОvеrbustВоw +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorsetLong +ВоwСоrsеtLоng +BowCorsetLongRuffle +ВоwСоrsеtLоngRufflе +BowCorsetBow +ВоwСоrsеtВоw +BowCorsetRestraint +ВоwСоrsеtRеstrаint +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetBowRestraint +ВоwСоrsеtВоwRеstrаint +BowCorsetBow +ВоwСоrsеtВоw +BowCorsetOverbustRestraint +ВоwСоrsеtОvеrbustRеstrаint +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetOverbustBowRestraint +ВоwСоrsеtОvеrbustВоwRеstrаint +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetBow +ВоwСоrsеtВоw +BowCorsetLongOverbustRestraint +ВоwСоrsеtLоngОvеrbustRеstrаint +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorsetLong +ВоwСоrsеtLоng +BowCorsetLongRuffle +ВоwСоrsеtLоngRufflе +BowCorsetLongOverbustBowRestraint +ВоwСоrsеtLоngОvеrbustВоwRеstrаint +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorsetLong +ВоwСоrsеtLоng +BowCorsetLongRuffle +ВоwСоrsеtLоngRufflе +BowCorsetBow +ВоwСоrsеtВоw +LatexCorset +LаtеxСоrsеt +HeavyCorset +HеаvyСоrsеt +LatexBra +LаtеxВrа +ChestHeavyCorset +СhеstHеаvyСоrsеt +LatexBraStraps +LаtеxВrаStrаps +StrapsHeavyCorset +StrаpsHеаvyСоrsеt +LatexBraStrapsCross +LаtеxВrаStrаpsСrоss +CrossHeavyCorset +СrоssHеаvyСоrsеt +LatexBustier +LаtеxВustiеr +ChestHeavyCorset +СhеstHеаvyСоrsеt +LatexCorsetFull +LаtеxСоrsеtFull +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +LatexCorsetStrap +LаtеxСоrsеtStrаp +HeavyCorset +HеаvyСоrsеt +StrapsHeavyCorset +StrаpsHеаvyСоrsеt +LatexCorsetFullStrap +LаtеxСоrsеtFullStrаp +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +StrapsHeavyCorset +StrаpsHеаvyСоrsеt +LatexCorsetCross +LаtеxСоrsеtСrоss +HeavyCorset +HеаvyСоrsеt +CrossHeavyCorset +СrоssHеаvyСоrsеt +LatexCorsetFullCross +LаtеxСоrsеtFullСrоss +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +CrossHeavyCorset +СrоssHеаvyСоrsеt +LatexCorsetRestraint +LаtеxСоrsеtRеstrаint +HeavyCorset +HеаvyСоrsеt +LatexBustierRestraint +LаtеxВustiеrRеstrаint +ChestHeavyCorset +СhеstHеаvyСоrsеt +LatexCorsetFullRestraint +LаtеxСоrsеtFullRеstrаint +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +LatexCorsetStrapRestraint +LаtеxСоrsеtStrаpRеstrаint +HeavyCorset +HеаvyСоrsеt +StrapsHeavyCorset +StrаpsHеаvyСоrsеt +LatexCorsetCrossRestraint +LаtеxСоrsеtСrоssRеstrаint +HeavyCorset +HеаvyСоrsеt +CrossHeavyCorset +СrоssHеаvyСоrsеt +LatexCorsetFullStrapRestraint +LаtеxСоrsеtFullStrаpRеstrаint +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +StrapsHeavyCorset +StrаpsHеаvyСоrsеt +LatexCorsetFullCrossRestraint +LаtеxСоrsеtFullСrоssRеstrаint +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +CrossHeavyCorset +СrоssHеаvyСоrsеt +LacePanties +LасеPаntiеs +LaceCrotchPanel +LасеСrоtсhPаnеl +LaceCrotchPanelTrim +LасеСrоtсhPаnеlТrim +LaceCrotchPanelLace +LасеСrоtсhPаnеlLасе +LaceCrotchPanel +LасеСrоtсhPаnеl +LaceCrotchPanel +LасеСrоtсhPаnеl +LaceCrotchPanelTrim +LасеСrоtсhPаnеlТrim +LaceCrotchPanelLace +LасеСrоtсhPаnеlLасе +DressSkirt +DrеssSkirt +Skirt +Skirt +SkirtOver +SkirtОvеr +BindingDress +ВindingDrеss +LaceCorset +LасеСоrsеt +LaceCorsetHardware +LасеСоrsеtHаrdwаrе +LaceCorsetStripes +LасеСоrsеtStripеs +LaceCorsetCrystal +LасеСоrsеtСrystаl +Skirt +Skirt +SkirtOver +SkirtОvеr +LaceCrotchPanel +LасеСrоtсhPаnеl +LaceCrotchPanelTrim +LасеСrоtсhPаnеlТrim +LaceCrotchPanelLace +LасеСrоtсhPаnеlLасе +BlouseCollar +ВlоusеСоllаr +BlouseCollar +ВlоusеСоllаr +DressBlouseBust +DrеssВlоusеВust +BlouseTorso +ВlоusеТоrsо +BlouseSkirt +ВlоusеSkirt +BlouseSkirtOverKneel +ВlоusеSkirtОvеrKnееl +BlouseBust +ВlоusеВust +BlouseNeck +ВlоusеNесk +BlouseCollar +ВlоusеСоllаr +DressBlouseBustCropped +DrеssВlоusеВustСrоppеd +CroppedBlouseTorso +СrоppеdВlоusеТоrsо +BlouseBust +ВlоusеВust +BlouseNeck +ВlоusеNесk +BlouseCollar +ВlоusеСоllаr +DressBlouseSleeveLeft +DrеssВlоusеSlееvеLеft +BlouseArmLeft +ВlоusеАrmLеft +BlouseForeArmLeft +ВlоusеFоrеАrmLеft +DressBlouseSleeveRight +DrеssВlоusеSlееvеRight +BlouseArmRight +ВlоusеАrmRight +BlouseForeArmRight +ВlоusеFоrеАrmRight +DressBlouseSleeves +DrеssВlоusеSlееvеs +BlouseArmLeft +ВlоusеАrmLеft +BlouseForeArmLeft +ВlоusеFоrеАrmLеft +BlouseArmRight +ВlоusеАrmRight +BlouseForeArmRight +ВlоusеFоrеАrmRight +DressBlouse +DrеssВlоusе +BlouseArmLeft +ВlоusеАrmLеft +BlouseForeArmLeft +ВlоusеFоrеАrmLеft +BlouseArmRight +ВlоusеАrmRight +BlouseForeArmRight +ВlоusеFоrеАrmRight +BlouseTorso +ВlоusеТоrsо +BlouseSkirt +ВlоusеSkirt +BlouseSkirtOverKneel +ВlоusеSkirtОvеrKnееl +BlouseBust +ВlоusеВust +BlouseNeck +ВlоusеNесk +BlouseCollar +ВlоusеСоllаr +Glasses +Glаssеs +Glasses +Glаssеs +GlassesLens +GlаssеsLеns +MonocleLeft +MоnосlеLеft +MonocleLeft +MоnосlеLеft +MonocleLensLeft +MоnосlеLеnsLеft +MonocleRight +MоnосlеRight +MonocleRight +MоnосlеRight +MonocleLensRight +MоnосlеLеnsRight +DressShoes +DrеssShоеs +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Skirt +Skirt +SkirtOver +SkirtОvеr +BlouseArmLeft +ВlоusеАrmLеft +BlouseForeArmLeft +ВlоusеFоrеАrmLеft +BlouseArmRight +ВlоusеАrmRight +BlouseForeArmRight +ВlоusеFоrеАrmRight +BlouseTorso +ВlоusеТоrsо +BlouseSkirt +ВlоusеSkirt +BlouseSkirtOverKneel +ВlоusеSkirtОvеrKnееl +BlouseBust +ВlоusеВust +BlouseNeck +ВlоusеNесk +BlouseCollar +ВlоusеСоllаr +LaceCrotchPanel +LасеСrоtсhPаnеl +LaceCrotchPanelTrim +LасеСrоtсhPаnеlТrim +LaceCrotchPanelLace +LасеСrоtсhPаnеlLасе +LaceCorset +LасеСоrsеt +LaceCorsetHardware +LасеСоrsеtHаrdwаrе +LaceCorsetStripes +LасеСоrsеtStripеs +LaceCorsetCrystal +LасеСоrsеtСrystаl +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LeatherMittenLeft +LеаthеrMittеnLеft +LeatherLeft +LеаthеrLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +LeatherMittenRight +LеаthеrMittеnRight +LeatherRight +LеаthеrRight +BandRight +ВаndRight +LockRight +LосkRight +LatexMittenLeft +LаtеxMittеnLеft +LatexLeft +LаtеxLеft +ZipperLeft +ZippеrLеft +LatexMittenRight +LаtеxMittеnRight +LatexRight +LаtеxRight +ZipperRight +ZippеrRight +LeatherPawMittenLeft +LеаthеrPаwMittеnLеft +LeatherLeft +LеаthеrLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +PawLeft +PаwLеft +LeatherPawMittenRight +LеаthеrPаwMittеnRight +LeatherRight +LеаthеrRight +BandRight +ВаndRight +LockRight +LосkRight +PawRight +PаwRight +LeatherMittens +LеаthеrMittеns +LeatherLeft +LеаthеrLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +LeatherRight +LеаthеrRight +BandRight +ВаndRight +LockRight +LосkRight +LeatherPawMittens +LеаthеrPаwMittеns +LeatherLeft +LеаthеrLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +PawLeft +PаwLеft +LeatherRight +LеаthеrRight +BandRight +ВаndRight +LockRight +LосkRight +PawRight +PаwRight +LatexMittens +LаtеxMittеns +LatexLeft +LаtеxLеft +ZipperLeft +ZippеrLеft +LatexRight +LаtеxRight +ZipperRight +ZippеrRight +LongMittenLeft +LоngMittеnLеft +LongLeft +LоngLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +LongMittenRight +LоngMittеnRight +LongRight +LоngRight +BandRight +ВаndRight +LockRight +LосkRight +LongMittens +LоngMittеns +LongLeft +LоngLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +LongRight +LоngRight +BandRight +ВаndRight +LockRight +LосkRight +ElfPanties +ЕlfPаntiеs +Panties +Pаntiеs +ElfTop +ЕlfТоp +Chest +Сhеst +Bra +Вrа +ElfBra +ЕlfВrа +Chest +Сhеst +Bra +Вrа +ElfCollar +ЕlfСоllаr +Collar +Соllаr +ElfCollarRestraint +ЕlfСоllаrRеstrаint +Collar +Соllаr +ElfCirclet +ЕlfСirсlеt +Circlet +Сirсlеt +Gem +Gеm +ElfSkirtBack +ЕlfSkirtВасk +SkirtBack +SkirtВасk +ElfSkirt +ЕlfSkirt +Skirt +Skirt +SkirtBand +SkirtВаnd +SkirtBack +SkirtВасk +ElfShoes +ЕlfShоеs +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +CrystalShoeLeft +СrystаlShоеLеft +CrystalShoeRight +СrystаlShоеRight +ElfBandLeft +ЕlfВаndLеft +BandLeft +ВаndLеft +ElfBandRight +ЕlfВаndRight +BandRight +ВаndRight +ElfBands +ЕlfВаnds +BandLeft +ВаndLеft +BandRight +ВаndRight +Skirt +Skirt +SkirtBand +SkirtВаnd +SkirtBack +SkirtВасk +Chest +Сhеst +Bra +Вrа +BandLeft +ВаndLеft +BandRight +ВаndRight +Circlet +Сirсlеt +Gem +Gеm +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +CrystalShoeLeft +СrystаlShоеLеft +CrystalShoeRight +СrystаlShоеRight +Panties +Pаntiеs +Collar +Соllаr +SteelYoke +StееlYоkе +Steel +Stееl +SteelBar +StееlВаr +RopeCrosstie1 +RоpеСrоsstiе1 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +RopeBoxtie1 +RоpеВоxtiе1 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +RopeWristtie1 +RоpеWristtiе1 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +RopeChestStraps1 +RоpеСhеstStrаps1 +Arm1 +Аrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +RopeBoxtie2 +RоpеВоxtiе2 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +RopeWristtie2 +RоpеWristtiе2 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +RopeChestStraps2 +RоpеСhеstStrаps2 +ArmHarness +АrmHаrnеss +ArmStrapHarness +АrmStrаpHаrnеss +ArmHarnessUp +АrmHаrnеssUp +RopeBoxtie3 +RоpеВоxtiе3 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +ArmHarness +АrmHаrnеss +ArmStrapHarness +АrmStrаpHаrnеss +ArmHarnessUp +АrmHаrnеssUp +RopeWristtie3 +RоpеWristtiе3 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +ArmHarness +АrmHаrnеss +ArmStrapHarness +АrmStrаpHаrnеss +ArmHarnessUp +АrmHаrnеssUp +RopeCuffs +RоpеСuffs +Cuffs +Сuffs +RopeBelt +RоpеВеlt +Belt +Веlt +RopeHarness +RоpеHаrnеss +Harness +Hаrnеss +HarnessLower +HаrnеssLоwеr +HarnessLowerStrap +HаrnеssLоwеrStrаp +RopeCrotch +RоpеСrоtсh +Crotchrope +Сrоtсhrоpе +CrotchropeStrap +СrоtсhrоpеStrаp +RopeToes +RоpеТоеs +Toe +Тое +RopeFeet +RоpеFееt +Ankles +Аnklеs +RopeFeetHeavy +RоpеFееtHеаvy +Ankles +Аnklеs +Toe +Тое +RopeAnkles1 +RоpеАnklеs1 +Calf1 +Саlf1 +RopeAnkles2 +RоpеАnklеs2 +Calf1 +Саlf1 +Calf2 +Саlf2 +RopeAnkles3 +RоpеАnklеs3 +Calf1 +Саlf1 +Calf2 +Саlf2 +Calf3 +Саlf3 +RopeLegs1 +RоpеLеgs1 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +RopeLegs2 +RоpеLеgs2 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +Thigh2 +Тhigh2 +RightThigh2 +RightТhigh2 +RopeLegs3 +RоpеLеgs3 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +Thigh2 +Тhigh2 +RightThigh2 +RightТhigh2 +Thigh3 +Тhigh3 +RightThigh3 +RightТhigh3 +RibbonCrosstie1 +RibbоnСrоsstiе1 +ArmStrap +АrmStrаp +RibbonBoxtie1 +RibbоnВоxtiе1 +Arm1 +Аrm1 +RibbonWristtie1 +RibbоnWristtiе1 +ForeArm1 +FоrеАrm1 +RibbonChestStraps1 +RibbоnСhеstStrаps1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +RibbonBoxtie2 +RibbоnВоxtiе2 +Arm1 +Аrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +RibbonWristtie2 +RibbоnWristtiе2 +ForeArm1 +FоrеАrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +RibbonChestStraps2 +RibbоnСhеstStrаps2 +ArmHarness +АrmHаrnеss +ArmHarnessUnderbust +АrmHаrnеssUndеrbust +ArmStrap +АrmStrаp +ArmHarnessUp +АrmHаrnеssUp +RibbonCuffs +RibbоnСuffs +Cuffs +Сuffs +RibbonBelt +RibbоnВеlt +Belt +Веlt +RibbonHarness +RibbоnHаrnеss +Harness +Hаrnеss +HarnessMid +HаrnеssMid +HarnessLower +HаrnеssLоwеr +HarnessLowerStrap +HаrnеssLоwеrStrаp +RibbonCrotch +RibbоnСrоtсh +Crotch +Сrоtсh +CrotchStrap +СrоtсhStrаp +RibbonToes +RibbоnТоеs +Toe +Тое +RibbonFeet +RibbоnFееt +Feet +Fееt +RibbonFeetHeavy +RibbоnFееtHеаvy +Feet +Fееt +Toe +Тое +RibbonAnkles1 +RibbоnАnklеs1 +Calf1 +Саlf1 +RibbonAnkles2 +RibbоnАnklеs2 +Calf1 +Саlf1 +Calf2 +Саlf2 +RibbonAnkles3 +RibbоnАnklеs3 +Calf1 +Саlf1 +Calf2 +Саlf2 +Calf3 +Саlf3 +RibbonLegs1 +RibbоnLеgs1 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +RibbonLegs2 +RibbоnLеgs2 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +Thigh2 +Тhigh2 +RightThigh2 +RightТhigh2 +RibbonLegs3 +RibbоnLеgs3 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +Thigh2 +Тhigh2 +RightThigh2 +RightТhigh2 +Thigh3 +Тhigh3 +RightThigh3 +RightТhigh3 +ShacklesWristLeft +ShасklеsWristLеft +WristLeft +WristLеft +ShacklesWristRight +ShасklеsWristRight +WristRight +WristRight +ShacklesWrists +ShасklеsWrists +WristLeft +WristLеft +WristRight +WristRight +ShacklesElbowLeft +ShасklеsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +ShacklesElbowRight +ShасklеsЕlbоwRight +ElbowRight +ЕlbоwRight +ShacklesElbows +ShасklеsЕlbоws +ElbowLeft +ЕlbоwLеft +ElbowRight +ЕlbоwRight +ShacklesArms +ShасklеsАrms +WristLeft +WristLеft +WristRight +WristRight +ElbowLeft +ЕlbоwLеft +ElbowRight +ЕlbоwRight +ShacklesAnklesLeft +ShасklеsАnklеsLеft +AnkleLeft +АnklеLеft +ShacklesAnklesRight +ShасklеsАnklеsRight +AnkleRight +АnklеRight +ShacklesAnkles +ShасklеsАnklеs +AnkleRight +АnklеRight +AnkleLeft +АnklеLеft +ShacklesThighLeft +ShасklеsТhighLеft +ThighLeft +ТhighLеft +ShacklesThighRight +ShасklеsТhighRight +ThighRight +ТhighRight +ShacklesThigh +ShасklеsТhigh +ThighRight +ТhighRight +ThighLeft +ТhighLеft +ThighLink +ТhighLink +ThighLink +ТhighLink +AnkleLink +АnklеLink +AnkleLink +АnklеLink +IronCollar +IrоnСоllаr +Collar +Соllаr +SteelCollar +StееlСоllаr +SteelCollar +StееlСоllаr +SteelCollarRunes +StееlСоllаrRunеs +SteelCollar +StееlСоllаr +SteelCollarRunes +StееlСоllаrRunеs +IronBelt +IrоnВеlt +Belt +Веlt +WolfPanties +WоlfPаntiеs +Panties +Pаntiеs +WolfCollar +WоlfСоllаr +Collar +Соllаr +CollarBand +СоllаrВаnd +WolfCollarTag +WоlfСоllаrТаg +Collar +Соllаr +CollarBand +СоllаrВаnd +CollarHardware +СоllаrHаrdwаrе +CollarTag +СоllаrТаg +WolfCollarSmall +WоlfСоllаrSmаll +FCollar +FСоllаr +FCollarBand +FСоllаrВаnd +WolfCollarSmallTag +WоlfСоllаrSmаllТаg +FCollar +FСоllаr +FCollarBand +FСоllаrВаnd +FCollarHardware +FСоllаrHаrdwаrе +FCollarTag +FСоllаrТаg +WolfHarnessUpper +WоlfHаrnеssUppеr +HarnessUpper +HаrnеssUppеr +HarnessBandUpper +HаrnеssВаndUppеr +WolfHarnessBelt +WоlfHаrnеssВеlt +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +WolfHarnessLower +WоlfHаrnеssLоwеr +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +HarnessMid +HаrnеssMid +HarnessHardwareMid +HаrnеssHаrdwаrеMid +HarnessLower +HаrnеssLоwеr +HarnessBandLower +HаrnеssВаndLоwеr +HarnessHardwareLower +HаrnеssHаrdwаrеLоwеr +WolfHarness +WоlfHаrnеss +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +HarnessUpper +HаrnеssUppеr +HarnessBandUpper +HаrnеssВаndUppеr +HarnessMid +HаrnеssMid +HarnessHardwareMid +HаrnеssHаrdwаrеMid +HarnessLower +HаrnеssLоwеr +HarnessBandLower +HаrnеssВаndLоwеr +HarnessHardwareLower +HаrnеssHаrdwаrеLоwеr +WolfCuffsAnklesLeft +WоlfСuffsАnklеsLеft +AnkleLeft +АnklеLеft +BandAnkleLeft +ВаndАnklеLеft +WolfCuffsAnklesRight +WоlfСuffsАnklеsRight +AnkleRight +АnklеRight +BandAnkleRight +ВаndАnklеRight +WolfCuffsAnkles +WоlfСuffsАnklеs +AnkleRight +АnklеRight +BandAnkleRight +ВаndАnklеRight +AnkleLeft +АnklеLеft +BandAnkleLeft +ВаndАnklеLеft +WolfCollarRestraint +WоlfСоllаrRеstrаint +Collar +Соllаr +CollarBand +СоllаrВаnd +WolfCollarTagRestraint +WоlfСоllаrТаgRеstrаint +Collar +Соllаr +CollarBand +СоllаrВаnd +CollarHardware +СоllаrHаrdwаrе +CollarTag +СоllаrТаg +WolfCollarSmallRestraint +WоlfСоllаrSmаllRеstrаint +FCollar +FСоllаr +FCollarBand +FСоllаrВаnd +WolfCollarSmallTagRestraint +WоlfСоllаrSmаllТаgRеstrаint +FCollar +FСоllаr +FCollarBand +FСоllаrВаnd +FCollarHardware +FСоllаrHаrdwаrе +FCollarTag +FСоllаrТаg +WolfPantiesRestraint +WоlfPаntiеsRеstrаint +Panties +Pаntiеs +WolfHarnessLowerRestraint +WоlfHаrnеssLоwеrRеstrаint +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +HarnessMid +HаrnеssMid +HarnessHardwareMid +HаrnеssHаrdwаrеMid +HarnessLower +HаrnеssLоwеr +HarnessBandLower +HаrnеssВаndLоwеr +HarnessHardwareLower +HаrnеssHаrdwаrеLоwеr +WolfHarnessUpperRestraint +WоlfHаrnеssUppеrRеstrаint +HarnessUpper +HаrnеssUppеr +HarnessBandUpper +HаrnеssВаndUppеr +WolfHarnessBeltRestraint +WоlfHаrnеssВеltRеstrаint +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +WolfHarnessRestraint +WоlfHаrnеssRеstrаint +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +HarnessUpper +HаrnеssUppеr +HarnessBandUpper +HаrnеssВаndUppеr +HarnessMid +HаrnеssMid +HarnessHardwareMid +HаrnеssHаrdwаrеMid +HarnessLower +HаrnеssLоwеr +HarnessBandLower +HаrnеssВаndLоwеr +HarnessHardwareLower +HаrnеssHаrdwаrеLоwеr +WolfGloveLeft +WоlfGlоvеLеft +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +RimGloveLeft +RimGlоvеLеft +RimForeGloveLeft +RimFоrеGlоvеLеft +BandGloveLeft +ВаndGlоvеLеft +BandForeGloveLeft +ВаndFоrеGlоvеLеft +WolfGloveRight +WоlfGlоvеRight +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +RimGloveRight +RimGlоvеRight +RimForeGloveRight +RimFоrеGlоvеRight +BandGloveRight +ВаndGlоvеRight +BandForeGloveRight +ВаndFоrеGlоvеRight +WolfGloves +WоlfGlоvеs +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +RimGloveLeft +RimGlоvеLеft +RimForeGloveLeft +RimFоrеGlоvеLеft +BandGloveLeft +ВаndGlоvеLеft +BandForeGloveLeft +ВаndFоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +RimGloveRight +RimGlоvеRight +RimForeGloveRight +RimFоrеGlоvеRight +BandGloveRight +ВаndGlоvеRight +BandForeGloveRight +ВаndFоrеGlоvеRight +WolfSockLeft +WоlfSосkLеft +LegLeft +LеgLеft +WolfSockRight +WоlfSосkRight +LegRight +LеgRight +WolfSocks +WоlfSосks +LegRight +LеgRight +LegLeft +LеgLеft +WolfSocksRestraint +WоlfSосksRеstrаint +LegRight +LеgRight +LegLeft +LеgLеft +WolfTorsoLower +WоlfТоrsоLоwеr +TorsoLower +ТоrsоLоwеr +WolfTorsoUpper +WоlfТоrsоUppеr +Chest +Сhеst +TorsoUpper +ТоrsоUppеr +WolfHeels +WоlfHееls +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Wolf +Wоlf +LegRight +LеgRight +LegLeft +LеgLеft +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +RimGloveLeft +RimGlоvеLеft +RimForeGloveLeft +RimFоrеGlоvеLеft +BandGloveLeft +ВаndGlоvеLеft +BandForeGloveLeft +ВаndFоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +RimGloveRight +RimGlоvеRight +RimForeGloveRight +RimFоrеGlоvеRight +BandGloveRight +ВаndGlоvеRight +BandForeGloveRight +ВаndFоrеGlоvеRight +Chest +Сhеst +TorsoUpper +ТоrsоUppеr +TorsoLower +ТоrsоLоwеr +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +CuffsWristLeft +СuffsWristLеft +WristLeft +WristLеft +BandWristLeft +ВаndWristLеft +HardwareWristLeft +HаrdwаrеWristLеft +CuffsWristRight +СuffsWristRight +WristRight +WristRight +BandWristRight +ВаndWristRight +HardwareWristRight +HаrdwаrеWristRight +CuffsWrists +СuffsWrists +WristLeft +WristLеft +BandWristLeft +ВаndWristLеft +HardwareWristLeft +HаrdwаrеWristLеft +WristRight +WristRight +BandWristRight +ВаndWristRight +HardwareWristRight +HаrdwаrеWristRight +CuffsElbowLeft +СuffsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +BandElbowLeft +ВаndЕlbоwLеft +HardwareElbowLeft +HаrdwаrеЕlbоwLеft +CuffsElbowRight +СuffsЕlbоwRight +ElbowRight +ЕlbоwRight +BandElbowRight +ВаndЕlbоwRight +HardwareElbowRight +HаrdwаrеЕlbоwRight +CuffsElbows +СuffsЕlbоws +ElbowLeft +ЕlbоwLеft +BandElbowLeft +ВаndЕlbоwLеft +HardwareElbowLeft +HаrdwаrеЕlbоwLеft +ElbowRight +ЕlbоwRight +BandElbowRight +ВаndЕlbоwRight +HardwareElbowRight +HаrdwаrеЕlbоwRight +CuffsArms +СuffsАrms +WristLeft +WristLеft +BandWristLeft +ВаndWristLеft +HardwareWristLeft +HаrdwаrеWristLеft +WristRight +WristRight +BandWristRight +ВаndWristRight +HardwareWristRight +HаrdwаrеWristRight +ElbowLeft +ЕlbоwLеft +BandElbowLeft +ВаndЕlbоwLеft +HardwareElbowLeft +HаrdwаrеЕlbоwLеft +ElbowRight +ЕlbоwRight +BandElbowRight +ВаndЕlbоwRight +HardwareElbowRight +HаrdwаrеЕlbоwRight +CuffsAnklesLeft +СuffsАnklеsLеft +AnkleLeft +АnklеLеft +BandAnkleLeft +ВаndАnklеLеft +HardwareAnkleLeft +HаrdwаrеАnklеLеft +CuffsAnklesRight +СuffsАnklеsRight +AnkleRight +АnklеRight +BandAnkleRight +ВаndАnklеRight +HardwareAnkleRight +HаrdwаrеАnklеRight +CuffsAnkles +СuffsАnklеs +AnkleRight +АnklеRight +BandAnkleRight +ВаndАnklеRight +HardwareAnkleRight +HаrdwаrеАnklеRight +AnkleLeft +АnklеLеft +BandAnkleLeft +ВаndАnklеLеft +HardwareAnkleLeft +HаrdwаrеАnklеLеft +CuffsThighLeft +СuffsТhighLеft +ThighLeft +ТhighLеft +BandThighLeft +ВаndТhighLеft +HardwareThighLeft +HаrdwаrеТhighLеft +CuffsThighRight +СuffsТhighRight +ThighRight +ТhighRight +BandThighRight +ВаndТhighRight +HardwareThighRight +HаrdwаrеТhighRight +CuffsThigh +СuffsТhigh +ThighRight +ТhighRight +BandThighRight +ВаndТhighRight +HardwareThighRight +HаrdwаrеТhighRight +ThighLeft +ТhighLеft +BandThighLeft +ВаndТhighLеft +HardwareThighLeft +HаrdwаrеТhighLеft +LeatherCollar +LеаthеrСоllаr +Collar +Соllаr +BandCollar +ВаndСоllаr +HardwareCollar +HаrdwаrеСоllаr +LeatherCollarBell +LеаthеrСоllаrВеll +Collar +Соllаr +BandCollar +ВаndСоllаr +HardwareCollar +HаrdwаrеСоllаr +BellCollar +ВеllСоllаr +LeatherCollarBow +LеаthеrСоllаrВоw +Collar +Соllаr +BandCollar +ВаndСоllаr +HardwareCollar +HаrdwаrеСоllаr +BowBellCollar +ВоwВеllСоllаr +BowCollar +ВоwСоllаr +LeatherBelt +LеаthеrВеlt +Belt +Веlt +BandBelt +ВаndВеlt +HardwareBelt +HаrdwаrеВеlt +SlimeMouth +SlimеMоuth +FaceMouth +FасеMоuth +SlimeEyes +SlimеЕyеs +FaceEyes +FасеЕyеs +SlimeHead +SlimеHеаd +FaceFull +FасеFull +SlimeBoots +SlimеВооts +FootLeft +FооtLеft +FootRight +FооtRight +SlimeTorsoLower +SlimеТоrsоLоwеr +TorsoLower +ТоrsоLоwеr +SlimeThighs +SlimеТhighs +LegLeft +LеgLеft +LegRight +LеgRight +SlimeLegs +SlimеLеgs +LegLeft +LеgLеft +LegRight +LеgRight +TorsoLower +ТоrsоLоwеr +SlimeFeet +SlimеFееt +AnkleLeft +АnklеLеft +AnkleRight +АnklеRight +SlimeArmLeft +SlimеАrmLеft +ArmLeft +АrmLеft +SlimeArmRight +SlimеАrmRight +ArmRight +АrmRight +SlimeTorsoUpper +SlimеТоrsоUppеr +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +SlimeArms +SlimеАrms +ArmLeft +АrmLеft +ArmRight +АrmRight +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +SlimeHandLeft +SlimеHаndLеft +HandLeft +HаndLеft +SlimeHandRight +SlimеHаndRight +HandRight +HаndRight +SlimeHands +SlimеHаnds +HandLeft +HаndLеft +HandRight +HаndRight +RubberMouth +RubbеrMоuth +FaceMouth +FасеMоuth +RubberEyes +RubbеrЕyеs +FaceEyes +FасеЕyеs +RubberHead +RubbеrHеаd +FaceFull +FасеFull +RubberBoots +RubbеrВооts +FootLeft +FооtLеft +FootRight +FооtRight +RubberTorsoLower +RubbеrТоrsоLоwеr +TorsoLower +ТоrsоLоwеr +RubberThighs +RubbеrТhighs +LegLeft +LеgLеft +LegRight +LеgRight +RubberLegs +RubbеrLеgs +LegLeft +LеgLеft +LegRight +LеgRight +TorsoLower +ТоrsоLоwеr +RubberFeet +RubbеrFееt +AnkleLeft +АnklеLеft +AnkleRight +АnklеRight +RubberArmLeft +RubbеrАrmLеft +ArmLeft +АrmLеft +RubberArmRight +RubbеrАrmRight +ArmRight +АrmRight +RubberTorsoUpper +RubbеrТоrsоUppеr +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +RubberArms +RubbеrАrms +ArmLeft +АrmLеft +ArmRight +АrmRight +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +RubberHandLeft +RubbеrHаndLеft +HandLeft +HаndLеft +RubberHandRight +RubbеrHаndRight +HandRight +HаndRight +RubberHands +RubbеrHаnds +HandLeft +HаndLеft +HandRight +HаndRight +TapeMedBoots +ТаpеMеdВооts +Feet +Fееt +TapeMedAnkles +ТаpеMеdАnklеs +Ankles +Аnklеs +TapeMedLegs +ТаpеMеdLеgs +Legs +Lеgs +RightLegs +RightLеgs +StrapCover +StrаpСоvеr +TapeMedBottom +ТаpеMеdВоttоm +TapeMedArms +ТаpеMеdАrms +Top +Тоp +Chest +Сhеst +ArmLeft +АrmLеft +ArmRight +АrmRight +TapeFullArms +ТаpеFullАrms +TopFull +ТоpFull +ChestFull +СhеstFull +ArmFullLeft +АrmFullLеft +ArmFullRight +АrmFullRight +TapeMedHandLeft +ТаpеMеdHаndLеft +HandLeft +HаndLеft +TapeMedHandRight +ТаpеMеdHаndRight +HandRight +HаndRight +TapeHeavyBoots +ТаpеHеаvyВооts +Feet +Fееt +TapeHeavyAnkles +ТаpеHеаvyАnklеs +Ankles +Аnklеs +TapeHeavyLegs +ТаpеHеаvyLеgs +Legs +Lеgs +RightLegs +RightLеgs +StrapCover +StrаpСоvеr +TapeHeavyBottom +ТаpеHеаvyВоttоm +Bottom +Воttоm +TapeHeavyBottomFull +ТаpеHеаvyВоttоmFull +Bottom +Воttоm +Legs +Lеgs +RightLegs +RightLеgs +StrapCover +StrаpСоvеr +TapeHeavyArms +ТаpеHеаvyАrms +Top +Тоp +Chest +Сhеst +ArmLeft +АrmLеft +ArmRight +АrmRight +TapeHeavyArmsFull +ТаpеHеаvyАrmsFull +Top +Тоp +Chest +Сhеst +ArmLeft +АrmLеft +ArmRight +АrmRight +TopFull +ТоpFull +ChestFull +СhеstFull +ArmFullLeft +АrmFullLеft +ArmFullRight +АrmFullRight +TapeHeavyHandLeft +ТаpеHеаvyHаndLеft +HandLeft +HаndLеft +TapeHeavyHandRight +ТаpеHеаvyHаndRight +HandRight +HаndRight +TapeHeavyHands +ТаpеHеаvyHаnds +HandLeft +HаndLеft +HandRight +HаndRight +TapeBoots +ТаpеВооts +Feet +Fееt +TapeAnkles +ТаpеАnklеs +Ankles +Аnklеs +TapeLegs +ТаpеLеgs +Legs +Lеgs +RightLegs +RightLеgs +TapeBottom +ТаpеВоttоm +TapeTorsoUpper +ТаpеТоrsоUppеr +Top +Тоp +TapeArmLeft +ТаpеАrmLеft +ArmLeft +АrmLеft +TapeArmRight +ТаpеАrmRight +ArmRight +АrmRight +TapeArms +ТаpеАrms +ArmLeft +АrmLеft +ArmRight +АrmRight +Top +Тоp +TapeStrapArms +ТаpеStrаpАrms +TopStrap +ТоpStrаp +ChestStrap +СhеstStrаp +ArmStrapLeft +АrmStrаpLеft +ArmStrapRight +АrmStrаpRight +TapeStrappedArms +ТаpеStrаppеdАrms +ArmLeft +АrmLеft +ArmRight +АrmRight +Top +Тоp +TopStrap +ТоpStrаp +ChestStrap +СhеstStrаp +ArmStrapLeft +АrmStrаpLеft +ArmStrapRight +АrmStrаpRight +TapeHandLeft +ТаpеHаndLеft +HandLeft +HаndLеft +TapeHandRight +ТаpеHаndRight +HandRight +HаndRight +BraProto +ВrаPrоtо +BraProto +ВrаPrоtо +BraProtoLining +ВrаPrоtоLining +BraProtoLiningMid +ВrаPrоtоLiningMid +BraProtoCups +ВrаPrоtоСups +BraProtoDisplay +ВrаPrоtоDisplаy +BraProtoLock +ВrаPrоtоLосk +BraCyber +ВrаСybеr +BraCyber +ВrаСybеr +BraCyberLining +ВrаСybеrLining +BraCyberDisplay +ВrаСybеrDisplаy +BraCyberLock +ВrаСybеrLосk +ChastityBra +СhаstityВrа +BraCups +ВrаСups +BraLining +ВrаLining +BraChain +ВrаСhаin +BraLock +ВrаLосk +HeartBelt +HеаrtВеlt +Belt +Веlt +BeltLining +ВеltLining +BeltLock +ВеltLосk +BeltStrap +ВеltStrаp +BeltStrapLining +ВеltStrаpLining +CyberBelt +СybеrВеlt +Cyber +Сybеr +CyberLining +СybеrLining +CyberDisplay +СybеrDisplаy +CyberPlug +СybеrPlug +CyberLock +СybеrLосk +ProtoBelt +PrоtоВеlt +Proto +Prоtо +ProtoLining +PrоtоLining +ProtoDisplay +PrоtоDisplаy +ProtoPlug +PrоtоPlug +ProtoLock +PrоtоLосk +SmoothArmbinder +SmооthАrmbindеr +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +Armbinder +Аrmbindеr +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +StrapsLeft +StrаpsLеft +StrapsRight +StrаpsRight +ArmbinderCross +АrmbindеrСrоss +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +StrapsLeft +StrаpsLеft +StrapsRight +StrаpsRight +Cross +Сrоss +SmoothArmbinderCross +SmооthАrmbindеrСrоss +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +Cross +Сrоss +ArmbinderSecure +АrmbindеrSесurе +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +StrapsLeft +StrаpsLеft +StrapsRight +StrаpsRight +Secure +Sесurе +SmoothArmbinderSecure +SmооthАrmbindеrSесurе +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +Secure +Sесurе +ArmbinderGwen +АrmbindеrGwеn +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +StrapsLeft +StrаpsLеft +StrapsRight +StrаpsRight +Gwen +Gwеn +SmoothArmbinderGwen +SmооthАrmbindеrGwеn +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +Gwen +Gwеn +WolfArmbinder +WоlfАrmbindеr +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +StrapsLeft +StrаpsLеft +StrapsRight +StrаpsRight +WolfHarness +WоlfHаrnеss +JacketArmbinder +JасkеtАrmbindеr +Arms +Аrms +BeltsArms +ВеltsАrms +Jacket +Jасkеt +Arms +Аrms +BeltsArms +ВеltsАrms +Chest +Сhеst +BeltsChest +ВеltsСhеst +JacketHeavy +JасkеtHеаvy +Arms +Аrms +BeltsArms +ВеltsАrms +Chest +Сhеst +BeltsChest +ВеltsСhеst +BinderTorsoLower +ВindеrТоrsоLоwеr +BeltsTorsoLower +ВеltsТоrsоLоwеr +Crotch +Сrоtсh +CrotchBelts +СrоtсhВеlts +JacketStraps +JасkеtStrаps +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +JacketArmbinderSecure +JасkеtАrmbindеrSесurе +Arms +Аrms +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +JacketBolero +JасkеtВоlеrо +Arms +Аrms +ChestBolero +СhеstВоlеrо +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +JacketLeotard +JасkеtLеоtаrd +Arms +Аrms +ChestBolero +СhеstВоlеrо +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +LatexLower +LаtеxLоwеr +LatexChest +LаtеxСhеst +LatexUpper +LаtеxUppеr +Legbinder +Lеgbindеr +Legbinder +Lеgbindеr +LegLegbinder +LеgLеgbindеr +RightLegbinder +RightLеgbindеr +LegRightLegbinder +LеgRightLеgbindеr +LacesLegbinder +LасеsLеgbindеr +TapeFace +ТаpеFасе +Face +Fасе +ClothBlindfold +СlоthВlindfоld +Cloth +Сlоth +BlindfoldBasic +ВlindfоldВаsiс +Basic +Ваsiс +BasicRim +ВаsiсRim +BlindfoldLeather +ВlindfоldLеаthеr +LeatherBase +LеаthеrВаsе +LeatherRim +LеаthеrRim +KittyBlindfold +KittyВlindfоld +LeatherBase +LеаthеrВаsе +LeatherRim +LеаthеrRim +KittyEyes +KittyЕyеs +BlindfoldTape +ВlindfоldТаpе +Tape +Таpе +BalletHeels +ВаllеtHееls +BalletLeft +ВаllеtLеft +BalletRight +ВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +BalletLaceLeft +ВаllеtLасеLеft +BalletLaceRight +ВаllеtLасеRight +FlatBalletHeels +FlаtВаllеtHееls +FlatBalletLeft +FlаtВаllеtLеft +FlatBalletRight +FlаtВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +ShinyBalletHeels +ShinyВаllеtHееls +ShinyBalletLeft +ShinyВаllеtLеft +ShinyBalletRight +ShinyВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +BalletHeelsRestraint +ВаllеtHееlsRеstrаint +BalletLeft +ВаllеtLеft +BalletRight +ВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +BalletLaceLeft +ВаllеtLасеLеft +BalletLaceRight +ВаllеtLасеRight +FlatBalletHeelsRestraint +FlаtВаllеtHееlsRеstrаint +FlatBalletLeft +FlаtВаllеtLеft +FlatBalletRight +FlаtВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +ShinyBalletHeelsRestraint +ShinyВаllеtHееlsRеstrаint +ShinyBalletLeft +ShinyВаllеtLеft +ShinyBalletRight +ShinyВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +LeatherHeels +LеаthеrHееls +LeatherLeft +LеаthеrLеft +LeatherRight +LеаthеrRight +LeatherLegLeft +LеаthеrLеgLеft +LeatherLegRight +LеаthеrLеgRight +TallHeels +ТаllHееls +TallLeft +ТаllLеft +TallRight +ТаllRight +TallLegLeft +ТаllLеgLеft +TallLegRight +ТаllLеgRight +TallHeelsRestraint +ТаllHееlsRеstrаint +TallLeft +ТаllLеft +TallRight +ТаllRight +TallLegLeft +ТаllLеgLеft +TallLegRight +ТаllLеgRight +Legirons +Lеgirоns +LegironsLeft +LеgirоnsLеft +LegironsRight +LеgirоnsRight +Irish8Ankle +Irish8Аnklе +Irish8AnkleLeft +Irish8АnklеLеft +Irish8AnkleRight +Irish8АnklеRight +HandCuffs +HаndСuffs +CuffsLock +СuffsLосk +HandCuffs +HаndСuffs +HingedCuffs +HingеdСuffs +CuffsLock +СuffsLосk +HingedCuffs +HingеdСuffs +Irish8Cuffs +Irish8Сuffs +CuffsLock +СuffsLосk +Irish8Cuffs +Irish8Сuffs +WolfCuffs +WоlfСuffs +WolfCuffs +WоlfСuffs +WolfCuffsChain +WоlfСuffsСhаin +Thumbcuffs +Тhumbсuffs +Thumbcuffs +Тhumbсuffs +HarnessTop +HаrnеssТоp +BeltsTop +ВеltsТоp +HardwareTop +HаrdwаrеТоp +HarnessMid +HаrnеssMid +BeltsMid +ВеltsMid +HardwareMid +HаrdwаrеMid +HarnessStrap +HаrnеssStrаp +BeltsStrap +ВеltsStrаp +HardwareStrap +HаrdwаrеStrаp +Harness +Hаrnеss +BeltsTop +ВеltsТоp +HardwareTop +HаrdwаrеТоp +BeltsOverbust +ВеltsОvеrbust +BeltsUnderbust +ВеltsUndеrbust +HardwareUnderbustOver +HаrdwаrеUndеrbustОvеr +HardwareUnderbust +HаrdwаrеUndеrbust +BeltsMid +ВеltsMid +HardwareMid +HаrdwаrеMid +BeltsStrap +ВеltsStrаp +HardwareStrap +HаrdwаrеStrаp +FutureHarnessChest +FuturеHаrnеssСhеst +StrapsChest +StrаpsСhеst +DisplayChest +DisplаyСhеst +MetalChest +MеtаlСhеst +FutureHarnessMid +FuturеHаrnеssMid +StrapsMid +StrаpsMid +DisplayMid +DisplаyMid +MetalMid +MеtаlMid +FutureHarnessLower +FuturеHаrnеssLоwеr +StrapsLower +StrаpsLоwеr +DisplayLower +DisplаyLоwеr +MetalLower +MеtаlLоwеr +FutureHarness +FuturеHаrnеss +StrapsLower +StrаpsLоwеr +DisplayLower +DisplаyLоwеr +MetalLower +MеtаlLоwеr +StrapsMid +StrаpsMid +DisplayMid +DisplаyMid +MetalMid +MеtаlMid +StrapsChest +StrаpsСhеst +DisplayChest +DisplаyСhеst +MetalChest +MеtаlСhеst +ClothCollar +СlоthСоllаr +Collar +Соllаr +ClothCollarTag +СlоthСоllаrТаg +Collar +Соllаr +CollarTag +СоllаrТаg +ClothBelt +СlоthВеlt +Belt +Веlt +ClothBeltLines +СlоthВеltLinеs +Belt +Веlt +BeltLines +ВеltLinеs +MaidGag +MаidGаg +FrillyPanel +FrillyPаnеl +FrillyStraps +FrillyStrаps +FrillyHardware +FrillyHаrdwаrе +FrillyHighlights +FrillyHighlights +DusterGag +DustеrGаg +FrillyPanel +FrillyPаnеl +FrillyStraps +FrillyStrаps +FrillyHardware +FrillyHаrdwаrе +FrillyHighlights +FrillyHighlights +Duster +Dustеr +GhostGag +GhоstGаg +Ball +Ваll +Strap +Strаp +BallGag +ВаllGаg +Ball +Ваll +Strap +Strаp +BallGagHarness +ВаllGаgHаrnеss +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +BallGagHarnessSecure +ВаllGаgHаrnеssSесurе +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +LargeBallGag +LаrgеВаllGаg +Ball +Ваll +Strap +Strаp +LargeBallGagHarness +LаrgеВаllGаgHаrnеss +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +LargeBallGagHarnessSecure +LаrgеВаllGаgHаrnеssSесurе +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +PanelGag +PаnеlGаg +Panel +Pаnеl +Strap +Strаp +PanelGagHarness +PаnеlGаgHаrnеss +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +PanelGagHarnessSecure +PаnеlGаgHаrnеssSесurе +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +MuzzleGag +MuzzlеGаg +Muzzle +Muzzlе +Strap +Strаp +MuzzleGagHarness +MuzzlеGаgHаrnеss +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +MuzzleGagHarnessSecure +MuzzlеGаgHаrnеssSесurе +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +PlugGagPlug +PlugGаgPlug +Plug +Plug +PlugMuzzleGag +PlugMuzzlеGаg +Muzzle +Muzzlе +Strap +Strаp +Plug +Plug +PlugMuzzleGagHarness +PlugMuzzlеGаgHаrnеss +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +Plug +Plug +PlugMuzzleGagHarnessSecure +PlugMuzzlеGаgHаrnеssSесurе +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Plug +Plug +PlugPanelGag +PlugPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Plug +Plug +PlugPanelGagHarness +PlugPаnеlGаgHаrnеss +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +Plug +Plug +PlugPanelGagHarnessSecure +PlugPаnеlGаgHаrnеssSесurе +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Plug +Plug +Stuffing +Stuffing +Stuffing +Stuffing +TapeFull +ТаpеFull +Full +Full +TapeWrap +ТаpеWrаp +Wrap +Wrаp +TapeFullOver +ТаpеFullОvеr +Full +Full +TapeWrapOver +ТаpеWrаpОvеr +Wrap +Wrаp +TapeCleave +ТаpеСlеаvе +Cleave +Сlеаvе +ClothCleave +СlоthСlеаvе +Cleave +Сlеаvе +ClothCleaveThick +СlоthСlеаvеТhiсk +CleaveThick +СlеаvеТhiсk +ClothKnot +СlоthKnоt +Knot +Knоt +ClothOTN +СlоthОТN +OTN +ОТN +ClothOTM +СlоthОТM +OTM +ОТM +GagLatex +GаgLаtеx +OTN +ОТN +GagLatexFlat +GаgLаtеxFlаt +OTNFlat +ОТNFlаt +GagLatexFlatHarness +GаgLаtеxFlаtHаrnеss +OTNFlat +ОТNFlаt +Harness +Hаrnеss +GagLatexFlatHarnessSecure +GаgLаtеxFlаtHаrnеssSесurе +OTNFlat +ОТNFlаt +Harness +Hаrnеss +SideStrap +SidеStrаp +GagLatexPlug +GаgLаtеxPlug +OTNFlat +ОТNFlаt +Plug +Plug +GagLatexPlugHarness +GаgLаtеxPlugHаrnеss +OTNFlat +ОТNFlаt +Plug +Plug +Harness +Hаrnеss +GagLatexPlugHarnessSecure +GаgLаtеxPlugHаrnеssSесurе +OTNFlat +ОТNFlаt +Plug +Plug +Harness +Hаrnеss +SideStrap +SidеStrаp +LatexNeckCorset +LаtеxNесkСоrsеt +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +LatexNeckCorsetGag +LаtеxNесkСоrsеtGаg +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +OTNFlat +ОТNFlаt +LatexNeckCorsetRestraint +LаtеxNесkСоrsеtRеstrаint +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +LatexNeckCorsetGagRestraint +LаtеxNесkСоrsеtGаgRеstrаint +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +OTNFlat +ОТNFlаt +LatexNeckCorsetPlugGag +LаtеxNесkСоrsеtPlugGаg +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +OTNFlat +ОТNFlаt +Plug +Plug +GagMetal +GаgMеtаl +OTN +ОТN +GagFabric +GаgFаbriс +FabricMuzzle +FаbriсMuzzlе +KittyMuzzle +KittyMuzzlе +FabricMuzzle +FаbriсMuzzlе +KittyMouth +KittyMоuth +Whiskers +Whiskеrs +KittyHarnessPanelGag +KittyHаrnеssPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +KittyMouth +KittyMоuth +GagComfy +GаgСоmfy +FabricMuzzle +FаbriсMuzzlе +GagMetalRiveted +GаgMеtаlRivеtеd +OTN +ОТN +OTNRivets +ОТNRivеts +SmoothBallGag +SmооthВаllGаg +Ball +Ваll +Strap +Strаp +SmoothBallGagHarness +SmооthВаllGаgHаrnеss +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SmoothBallGagHarnessSecure +SmооthВаllGаgHаrnеssSесurе +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +SmoothLargeBallGag +SmооthLаrgеВаllGаg +Ball +Ваll +Strap +Strаp +SmoothLargeBallGagHarness +SmооthLаrgеВаllGаgHаrnеss +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SmoothLargeBallGagHarnessSecure +SmооthLаrgеВаllGаgHаrnеssSесurе +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +SegmentedLargeBallGag +SеgmеntеdLаrgеВаllGаg +Ball +Ваll +Strap +Strаp +SegmentedLargeBallGagHarness +SеgmеntеdLаrgеВаllGаgHаrnеss +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SegmentedLargeBallGagHarnessSecure +SеgmеntеdLаrgеВаllGаgHаrnеssSесurе +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +SciFiBallGag +SсiFiВаllGаg +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +EnhancedSciFiBallGag +ЕnhаnсеdSсiFiВаllGаg +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +Mask +Mаsk +AdvancedSciFiBallGag +АdvаnсеdSсiFiВаllGаg +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +Mask +Mаsk +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +UltimateSciFiBallGag +UltimаtеSсiFiВаllGаg +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +Mask +Mаsk +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +UltimateSciFiBallGag2 +UltimаtеSсiFiВаllGаg2 +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +Mask +Mаsk +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +SegmentedLargePanelGag +SеgmеntеdLаrgеPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +SegmentedLargePanelGagHarness +SеgmеntеdLаrgеPаnеlGаgHаrnеss +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +SegmentedLargePanelGagHarnessSecure +SеgmеntеdLаrgеPаnеlGаgHаrnеssSесurе +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +SideStrap +SidеStrаp +SciFiPanelGag +SсiFiPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +AdvancedSciFiPanelGag +АdvаnсеdSсiFiPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +UltimateSciFiPanelGag +UltimаtеSсiFiPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +UltimateSciFiPanelGag2 +UltimаtеSсiFiPаnеlGаg2 +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +SegmentedPlugGag +SеgmеntеdPlugGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +SegmentedPlugGagHarness +SеgmеntеdPlugGаgHаrnеss +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +SegmentedPlugGagHarnessSecure +SеgmеntеdPlugGаgHаrnеssSесurе +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +SideStrap +SidеStrаp +SciFiPlugGag +SсiFiPlugGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +AdvancedSciFiPlugGag +АdvаnсеdSсiFiPlugGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +UltimateSciFiPlugGag +UltimаtеSсiFiPlugGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +UltimateSciFiPlugGag2 +UltimаtеSсiFiPlugGаg2 +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +SimpleSciFiMuzzle +SimplеSсiFiMuzzlе +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +AdvancedSciFiMuzzle +АdvаnсеdSсiFiMuzzlе +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Mask +Mаsk +SciFiPlugMuzzle +SсiFiPlugMuzzlе +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Plug +Plug +AdvancedSciFiPlugMuzzle +АdvаnсеdSсiFiPlugMuzzlе +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Mask +Mаsk +Plug +Plug +SimpleSciFiMuzzle2 +SimplеSсiFiMuzzlе2 +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +AdvancedSciFiMuzzle2 +АdvаnсеdSсiFiMuzzlе2 +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Mask +Mаsk +BeltsArms1 +ВеltsАrms1 +Arms1 +Аrms1 +LeftArm1 +LеftАrm1 +RightArm1 +RightАrm1 +BeltsArms2 +ВеltsАrms2 +Arms2 +Аrms2 +LeftArm2 +LеftАrm2 +RightArm2 +RightАrm2 +BeltsArmsAll +ВеltsАrmsАll +Arms1 +Аrms1 +LeftArm1 +LеftАrm1 +RightArm1 +RightАrm1 +Arms2 +Аrms2 +LeftArm2 +LеftАrm2 +RightArm2 +RightАrm2 +BeltsLegs1 +ВеltsLеgs1 +Legs1 +Lеgs1 +RightLegs1 +RightLеgs1 +BeltsLegs2 +ВеltsLеgs2 +Legs2 +Lеgs2 +RightLegs2 +RightLеgs2 +BeltsLegsAll +ВеltsLеgsАll +Legs1 +Lеgs1 +RightLegs1 +RightLеgs1 +Legs2 +Lеgs2 +RightLegs2 +RightLеgs2 +BeltsFeet1 +ВеltsFееt1 +Feet1 +Fееt1 +BeltsFeet2 +ВеltsFееt2 +Feet2 +Fееt2 +BeltsFeetAll +ВеltsFееtАll +Feet1 +Fееt1 +Feet2 +Fееt2 +Belt +Веlt +Belt +Веlt +ShadowHandsArms1 +ShаdоwHаndsАrms1 +Arms1 +Аrms1 +ShadowHandsArms2 +ShаdоwHаndsАrms2 +Arms2 +Аrms2 +LeftArm2 +LеftАrm2 +ShadowHandsArmsAll +ShаdоwHаndsАrmsАll +Arms1 +Аrms1 +Arms2 +Аrms2 +LeftArm2 +LеftАrm2 +ShadowHandsLegs1 +ShаdоwHаndsLеgs1 +Legs1 +Lеgs1 +RightLegs1 +RightLеgs1 +ShadowHandsLegs2 +ShаdоwHаndsLеgs2 +Legs2 +Lеgs2 +RightLegs2 +RightLеgs2 +ShadowHandsLegsAll +ShаdоwHаndsLеgsАll +Legs1 +Lеgs1 +RightLegs1 +RightLеgs1 +Legs2 +Lеgs2 +RightLegs2 +RightLеgs2 +ShadowHandsFeet +ShаdоwHаndsFееt +Feet1 +Fееt1 +ShadowHandsMouth +ShаdоwHаndsMоuth +Mouth +Mоuth +ShadowHandsEyes +ShаdоwHаndsЕyеs +Eyes +Еyеs +ShadowHandsCrotch +ShаdоwHаndsСrоtсh +Crotch +Сrоtсh +CrotchStrap +СrоtсhStrаp +Cage +Саgе +CageFront +СаgеFrоnt +CageBack +СаgеВасk +Sarcophagus +Sаrсоphаgus +SarcoFront +SаrсоFrоnt +SarcoWebs +SаrсоWеbs +SarcoBack +SаrсоВасk +Bed +Веd +Bed +Веd +LatexCube +LаtеxСubе +LatexCube +LаtеxСubе +LatexCubeBack +LаtеxСubеВасk +Barrel +Ваrrеl +Barrel +Ваrrеl +DisplayStand +DisplаyStаnd +DisplayFront +DisplаyFrоnt +OneBarPrison +ОnеВаrPrisоn +OneBarFront +ОnеВаrFrоnt +OneBarBack +ОnеВаrВасk +StardustCollar +StаrdustСоllаr +Collar +Соllаr +Leash +Lеаsh +Leash +Lеаsh +MikoCollar +MikоСоllаr +DragonCollar +DrаgоnСоllаr +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +FutureCollar +FuturеСоllаr +Future +Futurе +FutureBand +FuturеВаnd +FutureDisplay +FuturеDisplаy +FutureRim +FuturеRim +FutureLock +FuturеLосk +FutureCollarRestraint +FuturеСоllаrRеstrаint +Future +Futurе +FutureBand +FuturеВаnd +FutureDisplay +FuturеDisplаy +FutureRim +FuturеRim +FutureLock +FuturеLосk +ShockModule +ShосkMоdulе +Module +Mоdulе +ModuleDisplay +MоdulеDisplаy +TrackingModule +ТrасkingMоdulе +TrackingModule +ТrасkingMоdulе +TrackingModuleDisplay +ТrасkingMоdulеDisplаy +Goggles +Gоgglеs +Dollmaker +Dоllmаkеr +GogglesRestraint +GоgglеsRеstrаint +Dollmaker +Dоllmаkеr +FullVisor +FullVisоr +DollmakerFull +DоllmаkеrFull +FullVisorRim +FullVisоrRim +DollmakerFull +DоllmаkеrFull +DollmakerFullRim +DоllmаkеrFullRim +FullVisorRestraint +FullVisоrRеstrаint +DollmakerFull +DоllmаkеrFull +FullVisorRimRestraint +FullVisоrRimRеstrаint +DollmakerFull +DоllmаkеrFull +DollmakerFullRim +DоllmаkеrFullRim +GasMask +GаsMаsk +Mask +Mаsk +Valves +Vаlvеs +Center +Сеntеr +Nose +Nоsе +Plugs +Plugs +GasMaskRestraint +GаsMаskRеstrаint +Mask +Mаsk +Valves +Vаlvеs +Center +Сеntеr +Nose +Nоsе +Plugs +Plugs +Petsuit +Pеtsuit +Arms +Аrms +Legs +Lеgs +LeftLegs +LеftLеgs +Bow +Воw +Bow +Воw +BowFrills +ВоwFrills +Hairband +Hаirbаnd +Hairband +Hаirbаnd +MaidFrill +MаidFrill +Braid +Вrаid +Braid_Overstrap +Вrаid_Оvеrstrаp +BraidBack +ВrаidВасk +BackStraight +ВасkStrаight +Curly +Сurly +Curly_Overstrap +Сurly_Оvеrstrаp +Fuzzy +Fuzzy +Fuzzy_Overstrap +Fuzzy_Оvеrstrаp +FrontStraight +FrоntStrаight +FrontStraight_Overstrap +FrоntStrаight_Оvеrstrаp +Straight +Strаight +Straight_Overstrap +Strаight_Оvеrstrаp +StraightBangs +StrаightВаngs +StraightBangs_Overstrap +StrаightВаngs_Оvеrstrаp +Messy +Mеssy +BackShortMessy +ВасkShоrtMеssy +BackShortMessyUnderlight +ВасkShоrtMеssyUndеrlight +Ponytail +Pоnytаil +Ponytail2 +Pоnytаil2 +TwintailLeft +ТwintаilLеft +TwintailRight +ТwintаilRight +Ahoge +Аhоgе +Head +Hеаd +ArmRight +АrmRight +ArmLeft +АrmLеft +ShoulderRight +ShоuldеrRight +ShoulderLeft +ShоuldеrLеft +ForeArmRight +FоrеАrmRight +ForeArmLeft +FоrеАrmLеft +HandRight +HаndRight +HandLeft +HаndLеft +ForeHandRight +FоrеHаndRight +ForeHandLeft +FоrеHаndLеft +LegLeft +LеgLеft +Torso +Тоrsо +Chest +Сhеst +FootRightKneel +FооtRightKnееl +FootLeftHogtie +FооtLеftHоgtiе +LegRight +LеgRight +Butt +Вutt +Eyes +Еyеs +Eyes2 +Еyеs2 +Whites +Whitеs +Whites2 +Whitеs2 +Eyes +Еyеs +Eyes2 +Еyеs2 +Whites +Whitеs +Whites2 +Whitеs2 +Brows +Вrоws +Brows2 +Вrоws2 +Mouth +Mоuth +Blush +Вlush +Eyes +Еyеs +Eyes2 +Еyеs2 +Whites +Whitеs +Whites2 +Whitеs2 +KjusEyes2 +KjusЕyеs2 +Eyes +Еyеs +Eyes2 +Еyеs2 +Whites +Whitеs +Whites2 +Whitеs2 +KjusEyes3 +KjusЕyеs3 +Eyes +Еyеs +Eyes2 +Еyеs2 +Whites +Whitеs +Whites2 +Whitеs2 +KjusEyes4 +KjusЕyеs4 +Eyes +Еyеs +Eyes2 +Еyеs2 +Whites +Whitеs +Whites2 +Whitеs2 +Brows +Вrоws +Brows2 +Вrоws2 +Mouth +Mоuth +Blush +Вlush +Eyes +Еyеs +Eyes2 +Еyеs2 +Whites +Whitеs +Whites2 +Whitеs2 +ElfFront +ЕlfFrоnt +ElfBack +ЕlfВасk +ElfLongFront +ЕlfLоngFrоnt +ElfLongBack +ЕlfLоngВасk +ElfFloppyFront +ЕlfFlоppyFrоnt +ElfFloppyBack +ЕlfFlоppyВасk +ElfEarringsFront +ЕlfЕаrringsFrоnt +ElfEarringsBack +ЕlfЕаrringsВасk +Earrings +Еаrrings +EarringsBack +ЕаrringsВасk +Ears +Еаrs +EarsInner +ЕаrsInnеr +Kitty +Kitty +KittyInner +KittyInnеr +Wolf +Wоlf +WolfInner +WоlfInnеr +Fox +Fоx +FoxInner +FоxInnеr +Wolf +Wоlf +Kitty +Kitty +Kitty +Kitty +Kitty2 +Kitty2 +Fox +Fоx +Fox +Fоx +Fox2 +Fоx2 +Fox3 +Fоx3 +Fox4 +Fоx4 +Fox5 +Fоx5 +Fox6 +Fоx6 +Fox7 +Fоx7 +TorsoLower +ТоrsоLоwеr +FootRight +FооtRight +FootRightKneel +FооtRightKnееl +FootLeft +FооtLеft +FootLeftHogtie +FооtLеftHоgtiе +LegRight +LеgRight +LegLeft +LеgLеft +Butt +Вutt +CatsuitLowerLowRise +СаtsuitLоwеrLоwRisе +TorsoLowerLowRise +ТоrsоLоwеrLоwRisе +FootRight +FооtRight +FootRightKneel +FооtRightKnееl +FootLeft +FооtLеft +FootLeftHogtie +FооtLеftHоgtiе +LegRight +LеgRight +LegLeft +LеgLеft +Butt +Вutt +ArmRight +АrmRight +ArmLeft +АrmLеft +ShoulderRight +ShоuldеrRight +ShoulderLeft +ShоuldеrLеft +ForeArmRight +FоrеАrmRight +ForeArmLeft +FоrеАrmLеft +HandRight +HаndRight +HandLeft +HаndLеft +ForeHandRight +FоrеHаndRight +ForeHandLeft +FоrеHаndLеft +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +SleevelessCatsuitUpper +SlееvеlеssСаtsuitUppеr +SleevelessTorsoUpper +SlееvеlеssТоrsоUppеr +Chest +Сhеst +CatsuitTop +СаtsuitТоp +SleevelessTop +SlееvеlеssТоp +SleevelessTopChest +SlееvеlеssТоpСhеst +CatsuitTopV +СаtsuitТоpV +SleevelessTopV +SlееvеlеssТоpV +SleevelessTopVChest +SlееvеlеssТоpVСhеst +CatsuitUpperCropped +СаtsuitUppеrСrоppеd +ArmRight +АrmRight +ArmLeft +АrmLеft +ShoulderRight +ShоuldеrRight +ShoulderLeft +ShоuldеrLеft +ForeArmRight +FоrеАrmRight +ForeArmLeft +FоrеАrmLеft +HandRight +HаndRight +HandLeft +HаndLеft +ForeHandRight +FоrеHаndRight +ForeHandLeft +FоrеHаndLеft +TorsoUpperCrop +ТоrsоUppеrСrоp +Chest +Сhеst +ArmRight +АrmRight +ArmLeft +АrmLеft +ShoulderRight +ShоuldеrRight +ShoulderLeft +ShоuldеrLеft +ForeArmRight +FоrеАrmRight +ForeArmLeft +FоrеАrmLеft +HandRight +HаndRight +HandLeft +HаndLеft +ForeHandRight +FоrеHаndRight +ForeHandLeft +FоrеHаndLеft +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +TorsoLower +ТоrsоLоwеr +FootRight +FооtRight +FootRightKneel +FооtRightKnееl +FootLeft +FооtLеft +FootLeftHogtie +FооtLеftHоgtiе +LegRight +LеgRight +LegLeft +LеgLеft +Butt +Вutt +TransparentCatsuitUpper +ТrаnspаrеntСаtsuitUppеr +ArmRight +АrmRight +ArmLeft +АrmLеft +ShoulderRight +ShоuldеrRight +ShoulderLeft +ShоuldеrLеft +ForeArmRight +FоrеАrmRight +ForeArmLeft +FоrеАrmLеft +HandRight +HаndRight +HandLeft +HаndLеft +ForeHandRight +FоrеHаndRight +ForeHandLeft +FоrеHаndLеft +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +TransparentCatsuitUpperCropped +ТrаnspаrеntСаtsuitUppеrСrоppеd +ArmRight +АrmRight +ArmLeft +АrmLеft +ShoulderRight +ShоuldеrRight +ShoulderLeft +ShоuldеrLеft +ForeArmRight +FоrеАrmRight +ForeArmLeft +FоrеАrmLеft +HandRight +HаndRight +HandLeft +HаndLеft +ForeHandRight +FоrеHаndRight +ForeHandLeft +FоrеHаndLеft +TorsoUpperCrop +ТоrsоUppеrСrоp +Chest +Сhеst +TransparentCatsuitLower +ТrаnspаrеntСаtsuitLоwеr +TorsoLower +ТоrsоLоwеr +FootRight +FооtRight +FootRightKneel +FооtRightKnееl +FootLeft +FооtLеft +FootLeftHogtie +FооtLеftHоgtiе +LegRight +LеgRight +LegLeft +LеgLеft +Butt +Вutt +TransparentCatsuitLowerLowRise +ТrаnspаrеntСаtsuitLоwеrLоwRisе +TorsoLowerLowRise +ТоrsоLоwеrLоwRisе +FootRight +FооtRight +FootRightKneel +FооtRightKnееl +FootLeft +FооtLеft +FootLeftHogtie +FооtLеftHоgtiе +LegRight +LеgRight +LegLeft +LеgLеft +Butt +Вutt +ArmRight +АrmRight +ArmLeft +АrmLеft +ShoulderRight +ShоuldеrRight +ShoulderLeft +ShоuldеrLеft +ForeArmRight +FоrеАrmRight +ForeArmLeft +FоrеАrmLеft +HandRight +HаndRight +HandLeft +HаndLеft +ForeHandRight +FоrеHаndRight +ForeHandLeft +FоrеHаndLеft +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +TorsoLower +ТоrsоLоwеr +FootRight +FооtRight +FootRightKneel +FооtRightKnееl +FootLeft +FооtLеft +FootLeftHogtie +FооtLеftHоgtiе +LegRight +LеgRight +LegLeft +LеgLеft +Butt +Вutt +Shoulders +Shоuldеrs +ShouldersHogtie +ShоuldеrsHоgtiе +Coat +Соаt +CoatHogtieFree +СоаtHоgtiеFrее +Cape +Саpе +Shoulders +Shоuldеrs +ShouldersHogtie +ShоuldеrsHоgtiе +Cape +Саpе +Pauldrons +Pаuldrоns +Breastplate +Вrеаstplаtе +BootLeft +ВооtLеft +BootRight +ВооtRight +BootRightKneel +ВооtRightKnееl +BootLeftHogtie +ВооtLеftHоgtiе +GauntletLeft +GаuntlеtLеft +GauntletRight +GаuntlеtRight +GauntletRight +GаuntlеtRight +GauntletLeft +GаuntlеtLеft +Breastplate +Вrеаstplаtе +Pauldrons +Pаuldrоns +BootLeft +ВооtLеft +BootRight +ВооtRight +BootRightKneel +ВооtRightKnееl +BootLeftHogtie +ВооtLеftHоgtiе +GauntletRight +GаuntlеtRight +GauntletLeft +GаuntlеtLеft +Shirt +Shirt +ShirtChest +ShirtСhеst +Skirt +Skirt +Shirt +Shirt +ShirtChest +ShirtСhеst +Skirt +Skirt +Shorts +Shоrts +ShortsLeft +ShоrtsLеft +Pouch +Pоuсh +Knee +Knее +Choker +Сhоkеr +WristLeft +WristLеft +WristRight +WristRight +WristLeft +WristLеft +WristRight +WristRight +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Breastplate +Вrеаstplаtе +Shorts +Shоrts +ShortsLeft +ShоrtsLеft +Breastplate +Вrеаstplаtе +WristLeft +WristLеft +WristRight +WristRight +Pouch +Pоuсh +Knee +Knее +Choker +Сhоkеr +Skirt +Skirt +Stripe +Stripе +SkirtOver +SkirtОvеr +StripeOver +StripеОvеr +Apron +Аprоn +Blouse +Вlоusе +BlouseBust +ВlоusеВust +Bow +Воw +Corset +Соrsеt +Corset +Соrsеt +CorsetStraps +СоrsеtStrаps +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +StripeSockLeft +StripеSосkLеft +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +StripeSockRight +StripеSосkRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +StripeSockLeft +StripеSосkLеft +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +StripeSockRight +StripеSосkRight +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +StripeSockRight +StripеSосkRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +StripeSockLeft +StripеSосkLеft +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +StripeSockRight +StripеSосkRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +StripeSockLeft +StripеSосkLеft +Skirt +Skirt +Stripe +Stripе +SkirtOver +SkirtОvеr +StripeOver +StripеОvеr +Blouse +Вlоusе +BlouseBust +ВlоusеВust +Corset +Соrsеt +CorsetStraps +СоrsеtStrаps +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +StripeSockRight +StripеSосkRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +StripeSockLeft +StripеSосkLеft +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Bow +Воw +BowFrills +ВоwFrills +BlouseLeft +ВlоusеLеft +BlouseRight +ВlоusеRight +BlouseLiner +ВlоusеLinеr +BlouseBust +ВlоusеВust +Corset +Соrsеt +WitchHat +WitсhHаt +WitchHatBack +WitсhHаtВасk +ApprenticeHat +АpprеntiсеHаt +ApprenticeHatPuff +АpprеntiсеHаtPuff +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Skirt +Skirt +SkirtOver +SkirtОvеr +SkirtRuffleOver +SkirtRufflеОvеr +SkirtBelt +SkirtВеlt +SkirtRuffle +SkirtRufflе +Skirt +Skirt +SkirtOver +SkirtОvеr +SkirtRuffleOver +SkirtRufflеОvеr +SkirtBelt +SkirtВеlt +SkirtRuffle +SkirtRufflе +Corset +Соrsеt +BlouseLeft +ВlоusеLеft +BlouseRight +ВlоusеRight +BlouseLiner +ВlоusеLinеr +BlouseBust +ВlоusеВust +WitchHat +WitсhHаt +WitchHatBack +WitсhHаtВасk +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Bra +Вrа +Bustier +Вustiеr +BustierChest +ВustiеrСhеst +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +RimGloveLeft +RimGlоvеLеft +RimForeGloveLeft +RimFоrеGlоvеLеft +BandGloveLeft +ВаndGlоvеLеft +BandForeGloveLeft +ВаndFоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +RimGloveRight +RimGlоvеRight +RimForeGloveRight +RimFоrеGlоvеRight +BandGloveRight +ВаndGlоvеRight +BandForeGloveRight +ВаndFоrеGlоvеRight +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +RimGloveLeft +RimGlоvеLеft +RimForeGloveLeft +RimFоrеGlоvеLеft +BandGloveLeft +ВаndGlоvеLеft +BandForeGloveLeft +ВаndFоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +RimGloveRight +RimGlоvеRight +RimForeGloveRight +RimFоrеGlоvеRight +BandGloveRight +ВаndGlоvеRight +BandForeGloveRight +ВаndFоrеGlоvеRight +Belt +Веlt +Necklace +Nесklасе +Armband +Аrmbаnd +Collar +Соllаr +Skirt +Skirt +SkirtOver +SkirtОvеr +Skirt +Skirt +SkirtOver +SkirtОvеr +Bustier +Вustiеr +BustierChest +ВustiеrСhеst +Belt +Веlt +Bra +Вrа +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Collar +Соllаr +Necklace +Nесklасе +Armband +Аrmbаnd +ZombieHat +ZоmbiеHаt +ZombieHatBand +ZоmbiеHаtВаnd +ZombieChestTalisman +ZоmbiеСhеstТаlismаn +ZombieTalisman +ZоmbiеТаlismаn +ZombieTalismanBent +ZоmbiеТаlismаnВеnt +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Bra +Вrа +Chest +Сhеst +SleeveLeft +SlееvеLеft +SleeveRight +SlееvеRight +SleeveLeft +SlееvеLеft +SleeveRight +SlееvеRight +SleeveDecoLeft +SlееvеDесоLеft +SleeveDecoRight +SlееvеDесоRight +SleeveDecoLeft +SlееvеDесоLеft +SleeveDecoRight +SlееvеDесоRight +RibbonBelt +RibbоnВеlt +RibbonBack +RibbоnВасk +RibbonFarBack +RibbоnFаrВасk +Skirt +Skirt +SkirtOver +SkirtОvеr +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +SleeveLeft +SlееvеLеft +SleeveRight +SlееvеRight +SleeveDecoLeft +SlееvеDесоLеft +SleeveDecoRight +SlееvеDесоRight +Skirt +Skirt +SkirtOver +SkirtОvеr +Bra +Вrа +Chest +Сhеst +RibbonBelt +RibbоnВеlt +RibbonBack +RibbоnВасk +RibbonFarBack +RibbоnFаrВасk +Mask +Mаsk +Eyes +Еyеs +Eyes2 +Еyеs2 +Lock +Lосk +EyesWhites +ЕyеsWhitеs +Mouth +Mоuth +Swimsuit +Swimsuit +SwimsuitChest +SwimsuitСhеst +ChestStrappy +СhеstStrаppy +VBikini +VВikini +StrappyLower +StrаppyLоwеr +Strappy +Strаppy +ChestStrappy +СhеstStrаppy +Strappy +Strаppy +StrappyLower +StrаppyLоwеr +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +Leotard +Lеоtаrd +LeotardChest +LеоtаrdСhеst +BunnyLeotardHigh +ВunnyLеоtаrdHigh +HighLeotard +HighLеоtаrd +LeotardChest +LеоtаrdСhеst +Leotard +Lеоtаrd +LeotardChest +LеоtаrdСhеst +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +LaceCorset +LасеСоrsеt +LaceCorsetHardware +LасеСоrsеtHаrdwаrе +LaceCorsetStripes +LасеСоrsеtStripеs +LaceCorsetCrystal +LасеСоrsеtСrystаl +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LaceChestDeco +LасеСhеstDесо +LaceChestDecoCrystal +LасеСhеstDесоСrystаl +LaceChestDecoHardware +LасеСhеstDесоHаrdwаrе +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LaceChestDeco +LасеСhеstDесо +LaceChestDecoCrystal +LасеСhеstDесоСrystаl +LaceChestDecoHardware +LасеСhеstDесоHаrdwаrе +LaceCorset +LасеСоrsеt +LaceCorsetHardware +LасеСоrsеtHаrdwаrе +LaceCorsetStripes +LасеСоrsеtStripеs +LaceCorsetCrystal +LасеСоrsеtСrystаl +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LaceChestDeco +LасеСhеstDесо +LaceChestDecoCrystal +LасеСhеstDесоСrystаl +LaceChestDecoHardware +LасеСhеstDесоHаrdwаrе +BowCorsetBow +ВоwСоrsеtВоw +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorsetBow +ВоwСоrsеtВоw +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetLong +ВоwСоrsеtLоng +BowCorsetLongRuffle +ВоwСоrsеtLоngRufflе +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorsetLong +ВоwСоrsеtLоng +BowCorsetLongRuffle +ВоwСоrsеtLоngRufflе +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetBow +ВоwСоrsеtВоw +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorsetLong +ВоwСоrsеtLоng +BowCorsetLongRuffle +ВоwСоrsеtLоngRufflе +BowCorsetBow +ВоwСоrsеtВоw +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetBow +ВоwСоrsеtВоw +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorset +ВоwСоrsеt +BowCorsetRuffle +ВоwСоrsеtRufflе +BowCorsetBow +ВоwСоrsеtВоw +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorsetLong +ВоwСоrsеtLоng +BowCorsetLongRuffle +ВоwСоrsеtLоngRufflе +BowCorsetBust +ВоwСоrsеtВust +BowCorsetBustRuffle +ВоwСоrsеtВustRufflе +BowCorsetLong +ВоwСоrsеtLоng +BowCorsetLongRuffle +ВоwСоrsеtLоngRufflе +BowCorsetBow +ВоwСоrsеtВоw +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +StrapsHeavyCorset +StrаpsHеаvyСоrsеt +CrossHeavyCorset +СrоssHеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +HeavyCorset +HеаvyСоrsеt +StrapsHeavyCorset +StrаpsHеаvyСоrsеt +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +StrapsHeavyCorset +StrаpsHеаvyСоrsеt +HeavyCorset +HеаvyСоrsеt +CrossHeavyCorset +СrоssHеаvyСоrsеt +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +CrossHeavyCorset +СrоssHеаvyСоrsеt +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +HeavyCorset +HеаvyСоrsеt +StrapsHeavyCorset +StrаpsHеаvyСоrsеt +HeavyCorset +HеаvyСоrsеt +CrossHeavyCorset +СrоssHеаvyСоrsеt +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +StrapsHeavyCorset +StrаpsHеаvyСоrsеt +HeavyCorset +HеаvyСоrsеt +ChestHeavyCorset +СhеstHеаvyСоrsеt +CrossHeavyCorset +СrоssHеаvyСоrsеt +LaceCrotchPanel +LасеСrоtсhPаnеl +LaceCrotchPanelTrim +LасеСrоtсhPаnеlТrim +LaceCrotchPanelLace +LасеСrоtсhPаnеlLасе +LaceCrotchPanel +LасеСrоtсhPаnеl +LaceCrotchPanelTrim +LасеСrоtсhPаnеlТrim +LaceCrotchPanelLace +LасеСrоtсhPаnеlLасе +Skirt +Skirt +SkirtOver +SkirtОvеr +LaceCorset +LасеСоrsеt +LaceCorsetHardware +LасеСоrsеtHаrdwаrе +LaceCorsetStripes +LасеСоrsеtStripеs +LaceCorsetCrystal +LасеСоrsеtСrystаl +Skirt +Skirt +SkirtOver +SkirtОvеr +LaceCrotchPanel +LасеСrоtсhPаnеl +LaceCrotchPanelTrim +LасеСrоtсhPаnеlТrim +LaceCrotchPanelLace +LасеСrоtсhPаnеlLасе +BlouseCollar +ВlоusеСоllаr +BlouseTorso +ВlоusеТоrsо +BlouseSkirt +ВlоusеSkirt +BlouseSkirtOverKneel +ВlоusеSkirtОvеrKnееl +BlouseBust +ВlоusеВust +BlouseNeck +ВlоusеNесk +BlouseCollar +ВlоusеСоllаr +CroppedBlouseTorso +СrоppеdВlоusеТоrsо +BlouseBust +ВlоusеВust +BlouseNeck +ВlоusеNесk +BlouseCollar +ВlоusеСоllаr +BlouseArmLeft +ВlоusеАrmLеft +BlouseForeArmLeft +ВlоusеFоrеАrmLеft +BlouseArmRight +ВlоusеАrmRight +BlouseForeArmRight +ВlоusеFоrеАrmRight +BlouseArmLeft +ВlоusеАrmLеft +BlouseForeArmLeft +ВlоusеFоrеАrmLеft +BlouseArmRight +ВlоusеАrmRight +BlouseForeArmRight +ВlоusеFоrеАrmRight +BlouseArmLeft +ВlоusеАrmLеft +BlouseForeArmLeft +ВlоusеFоrеАrmLеft +BlouseArmRight +ВlоusеАrmRight +BlouseForeArmRight +ВlоusеFоrеАrmRight +BlouseTorso +ВlоusеТоrsо +BlouseSkirt +ВlоusеSkirt +BlouseSkirtOverKneel +ВlоusеSkirtОvеrKnееl +BlouseBust +ВlоusеВust +BlouseNeck +ВlоusеNесk +BlouseCollar +ВlоusеСоllаr +Glasses +Glаssеs +GlassesLens +GlаssеsLеns +MonocleLeft +MоnосlеLеft +MonocleLensLeft +MоnосlеLеnsLеft +MonocleRight +MоnосlеRight +MonocleLensRight +MоnосlеLеnsRight +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Skirt +Skirt +SkirtOver +SkirtОvеr +BlouseArmLeft +ВlоusеАrmLеft +BlouseForeArmLeft +ВlоusеFоrеАrmLеft +BlouseArmRight +ВlоusеАrmRight +BlouseForeArmRight +ВlоusеFоrеАrmRight +BlouseTorso +ВlоusеТоrsо +BlouseSkirt +ВlоusеSkirt +BlouseSkirtOverKneel +ВlоusеSkirtОvеrKnееl +BlouseBust +ВlоusеВust +BlouseNeck +ВlоusеNесk +BlouseCollar +ВlоusеСоllаr +LaceCrotchPanel +LасеСrоtсhPаnеl +LaceCrotchPanelTrim +LасеСrоtсhPаnеlТrim +LaceCrotchPanelLace +LасеСrоtсhPаnеlLасе +LaceCorset +LасеСоrsеt +LaceCorsetHardware +LасеСоrsеtHаrdwаrе +LaceCorsetStripes +LасеСоrsеtStripеs +LaceCorsetCrystal +LасеСоrsеtСrystаl +LaceChest +LасеСhеst +LaceChestCups +LасеСhеstСups +LaceChestStripes +LасеСhеstStripеs +LeatherLeft +LеаthеrLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +LeatherRight +LеаthеrRight +BandRight +ВаndRight +LockRight +LосkRight +LeatherLeft +LеаthеrLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +PawLeft +PаwLеft +LeatherRight +LеаthеrRight +BandRight +ВаndRight +LockRight +LосkRight +PawRight +PаwRight +LatexLeft +LаtеxLеft +ZipperLeft +ZippеrLеft +LatexRight +LаtеxRight +ZipperRight +ZippеrRight +LeatherLeft +LеаthеrLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +LeatherRight +LеаthеrRight +BandRight +ВаndRight +LockRight +LосkRight +LeatherLeft +LеаthеrLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +PawLeft +PаwLеft +LeatherRight +LеаthеrRight +BandRight +ВаndRight +LockRight +LосkRight +PawRight +PаwRight +LatexLeft +LаtеxLеft +ZipperLeft +ZippеrLеft +LatexRight +LаtеxRight +ZipperRight +ZippеrRight +LongMittenLeft +LоngMittеnLеft +LongLeft +LоngLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +LongMittenRight +LоngMittеnRight +LongRight +LоngRight +BandRight +ВаndRight +LockRight +LосkRight +LongMittens +LоngMittеns +LongLeft +LоngLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +LongRight +LоngRight +BandRight +ВаndRight +LockRight +LосkRight +Panties +Pаntiеs +Chest +Сhеst +Bra +Вrа +Chest +Сhеst +Bra +Вrа +Collar +Соllаr +Collar +Соllаr +Circlet +Сirсlеt +Gem +Gеm +SkirtBack +SkirtВасk +Skirt +Skirt +SkirtBand +SkirtВаnd +SkirtBack +SkirtВасk +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +CrystalShoeLeft +СrystаlShоеLеft +CrystalShoeRight +СrystаlShоеRight +BandLeft +ВаndLеft +BandRight +ВаndRight +BandLeft +ВаndLеft +BandRight +ВаndRight +Skirt +Skirt +SkirtBand +SkirtВаnd +SkirtBack +SkirtВасk +Chest +Сhеst +Bra +Вrа +BandLeft +ВаndLеft +BandRight +ВаndRight +Circlet +Сirсlеt +Gem +Gеm +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +CrystalShoeLeft +СrystаlShоеLеft +CrystalShoeRight +СrystаlShоеRight +Panties +Pаntiеs +Collar +Соllаr +Steel +Stееl +SteelBar +StееlВаr +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +Arm1 +Аrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +ArmHarness +АrmHаrnеss +ArmStrapHarness +АrmStrаpHаrnеss +ArmHarnessUp +АrmHаrnеssUp +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +ArmHarness +АrmHаrnеss +ArmStrapHarness +АrmStrаpHаrnеss +ArmHarnessUp +АrmHаrnеssUp +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +ArmHarness +АrmHаrnеss +ArmStrapHarness +АrmStrаpHаrnеss +ArmHarnessUp +АrmHаrnеssUp +Cuffs +Сuffs +Belt +Веlt +Harness +Hаrnеss +HarnessLower +HаrnеssLоwеr +HarnessLowerStrap +HаrnеssLоwеrStrаp +Crotchrope +Сrоtсhrоpе +CrotchropeStrap +СrоtсhrоpеStrаp +Toe +Тое +Ankles +Аnklеs +Ankles +Аnklеs +Toe +Тое +Calf1 +Саlf1 +Calf1 +Саlf1 +Calf2 +Саlf2 +Calf1 +Саlf1 +Calf2 +Саlf2 +Calf3 +Саlf3 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +Thigh2 +Тhigh2 +RightThigh2 +RightТhigh2 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +Thigh2 +Тhigh2 +RightThigh2 +RightТhigh2 +Thigh3 +Тhigh3 +RightThigh3 +RightТhigh3 +ArmStrap +АrmStrаp +Arm1 +Аrm1 +ForeArm1 +FоrеАrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +Arm1 +Аrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +ForeArm1 +FоrеАrm1 +Arm2 +Аrm2 +ForeArm2 +FоrеАrm2 +ArmHarness +АrmHаrnеss +ArmHarnessUnderbust +АrmHаrnеssUndеrbust +ArmStrap +АrmStrаp +ArmHarnessUp +АrmHаrnеssUp +Cuffs +Сuffs +Belt +Веlt +Harness +Hаrnеss +HarnessMid +HаrnеssMid +HarnessLower +HаrnеssLоwеr +HarnessLowerStrap +HаrnеssLоwеrStrаp +Crotch +Сrоtсh +CrotchStrap +СrоtсhStrаp +Toe +Тое +Feet +Fееt +Feet +Fееt +Toe +Тое +Calf1 +Саlf1 +Calf1 +Саlf1 +Calf2 +Саlf2 +Calf1 +Саlf1 +Calf2 +Саlf2 +Calf3 +Саlf3 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +Thigh2 +Тhigh2 +RightThigh2 +RightТhigh2 +Thigh1 +Тhigh1 +RightThigh1 +RightТhigh1 +Thigh2 +Тhigh2 +RightThigh2 +RightТhigh2 +Thigh3 +Тhigh3 +RightThigh3 +RightТhigh3 +WristLeft +WristLеft +WristRight +WristRight +WristLeft +WristLеft +WristRight +WristRight +ElbowLeft +ЕlbоwLеft +ElbowRight +ЕlbоwRight +ElbowLeft +ЕlbоwLеft +ElbowRight +ЕlbоwRight +WristLeft +WristLеft +WristRight +WristRight +ElbowLeft +ЕlbоwLеft +ElbowRight +ЕlbоwRight +AnkleLeft +АnklеLеft +AnkleRight +АnklеRight +AnkleRight +АnklеRight +AnkleLeft +АnklеLеft +ThighLeft +ТhighLеft +ThighRight +ТhighRight +ThighRight +ТhighRight +ThighLeft +ТhighLеft +ThighLink +ТhighLink +AnkleLink +АnklеLink +Collar +Соllаr +SteelCollar +StееlСоllаr +SteelCollar +StееlСоllаr +SteelCollarRunes +StееlСоllаrRunеs +Belt +Веlt +FashionIronCollar +FаshiоnIrоnСоllаr +Collar +Соllаr +FashionIronBelt +FаshiоnIrоnВеlt +Belt +Веlt +FashionSteelCollarRunes +FаshiоnStееlСоllаrRunеs +SteelCollar +StееlСоllаr +SteelCollarRunes +StееlСоllаrRunеs +FashionSteelCollar +FаshiоnStееlСоllаr +SteelCollar +StееlСоllаr +FashionShacklesWristLeft +FаshiоnShасklеsWristLеft +WristLeft +WristLеft +FashionShacklesWristRight +FаshiоnShасklеsWristRight +WristRight +WristRight +FashionShacklesWrists +FаshiоnShасklеsWrists +WristLeft +WristLеft +WristRight +WristRight +FashionShacklesElbowLeft +FаshiоnShасklеsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +FashionShacklesElbowRight +FаshiоnShасklеsЕlbоwRight +ElbowRight +ЕlbоwRight +FashionShacklesElbows +FаshiоnShасklеsЕlbоws +ElbowLeft +ЕlbоwLеft +ElbowRight +ЕlbоwRight +FashionShacklesArms +FаshiоnShасklеsАrms +WristLeft +WristLеft +WristRight +WristRight +ElbowLeft +ЕlbоwLеft +ElbowRight +ЕlbоwRight +FashionShacklesAnklesLeft +FаshiоnShасklеsАnklеsLеft +AnkleLeft +АnklеLеft +FashionShacklesAnklesRight +FаshiоnShасklеsАnklеsRight +AnkleRight +АnklеRight +FashionShacklesAnkles +FаshiоnShасklеsАnklеs +AnkleRight +АnklеRight +AnkleLeft +АnklеLеft +FashionShacklesThighLeft +FаshiоnShасklеsТhighLеft +ThighLeft +ТhighLеft +FashionShacklesThighRight +FаshiоnShасklеsТhighRight +ThighRight +ТhighRight +FashionShacklesThigh +FаshiоnShасklеsТhigh +ThighRight +ТhighRight +ThighLeft +ТhighLеft +FashionThighLink +FаshiоnТhighLink +ThighLink +ТhighLink +FashionAnkleLink +FаshiоnАnklеLink +AnkleLink +АnklеLink +Panties +Pаntiеs +Collar +Соllаr +CollarBand +СоllаrВаnd +Collar +Соllаr +CollarBand +СоllаrВаnd +CollarHardware +СоllаrHаrdwаrе +CollarTag +СоllаrТаg +FCollar +FСоllаr +FCollarBand +FСоllаrВаnd +FCollar +FСоllаr +FCollarBand +FСоllаrВаnd +FCollarHardware +FСоllаrHаrdwаrе +FCollarTag +FСоllаrТаg +HarnessUpper +HаrnеssUppеr +HarnessBandUpper +HаrnеssВаndUppеr +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +HarnessMid +HаrnеssMid +HarnessHardwareMid +HаrnеssHаrdwаrеMid +HarnessLower +HаrnеssLоwеr +HarnessBandLower +HаrnеssВаndLоwеr +HarnessHardwareLower +HаrnеssHаrdwаrеLоwеr +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +HarnessUpper +HаrnеssUppеr +HarnessBandUpper +HаrnеssВаndUppеr +HarnessMid +HаrnеssMid +HarnessHardwareMid +HаrnеssHаrdwаrеMid +HarnessLower +HаrnеssLоwеr +HarnessBandLower +HаrnеssВаndLоwеr +HarnessHardwareLower +HаrnеssHаrdwаrеLоwеr +AnkleLeft +АnklеLеft +BandAnkleLeft +ВаndАnklеLеft +AnkleRight +АnklеRight +BandAnkleRight +ВаndАnklеRight +AnkleRight +АnklеRight +BandAnkleRight +ВаndАnklеRight +AnkleLeft +АnklеLеft +BandAnkleLeft +ВаndАnklеLеft +Collar +Соllаr +CollarBand +СоllаrВаnd +Collar +Соllаr +CollarBand +СоllаrВаnd +CollarHardware +СоllаrHаrdwаrе +CollarTag +СоllаrТаg +FCollar +FСоllаr +FCollarBand +FСоllаrВаnd +FCollar +FСоllаr +FCollarBand +FСоllаrВаnd +FCollarHardware +FСоllаrHаrdwаrе +FCollarTag +FСоllаrТаg +Panties +Pаntiеs +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +HarnessMid +HаrnеssMid +HarnessHardwareMid +HаrnеssHаrdwаrеMid +HarnessLower +HаrnеssLоwеr +HarnessBandLower +HаrnеssВаndLоwеr +HarnessHardwareLower +HаrnеssHаrdwаrеLоwеr +HarnessUpper +HаrnеssUppеr +HarnessBandUpper +HаrnеssВаndUppеr +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +BeltMid +ВеltMid +BeltBandMid +ВеltВаndMid +BeltHardwareMid +ВеltHаrdwаrеMid +HarnessUpper +HаrnеssUppеr +HarnessBandUpper +HаrnеssВаndUppеr +HarnessMid +HаrnеssMid +HarnessHardwareMid +HаrnеssHаrdwаrеMid +HarnessLower +HаrnеssLоwеr +HarnessBandLower +HаrnеssВаndLоwеr +HarnessHardwareLower +HаrnеssHаrdwаrеLоwеr +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +RimGloveLeft +RimGlоvеLеft +RimForeGloveLeft +RimFоrеGlоvеLеft +BandGloveLeft +ВаndGlоvеLеft +BandForeGloveLeft +ВаndFоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +RimGloveRight +RimGlоvеRight +RimForeGloveRight +RimFоrеGlоvеRight +BandGloveRight +ВаndGlоvеRight +BandForeGloveRight +ВаndFоrеGlоvеRight +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +RimGloveLeft +RimGlоvеLеft +RimForeGloveLeft +RimFоrеGlоvеLеft +BandGloveLeft +ВаndGlоvеLеft +BandForeGloveLeft +ВаndFоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +RimGloveRight +RimGlоvеRight +RimForeGloveRight +RimFоrеGlоvеRight +BandGloveRight +ВаndGlоvеRight +BandForeGloveRight +ВаndFоrеGlоvеRight +LegLeft +LеgLеft +LegRight +LеgRight +LegRight +LеgRight +LegLeft +LеgLеft +LegRight +LеgRight +LegLeft +LеgLеft +TorsoLower +ТоrsоLоwеr +Chest +Сhеst +TorsoUpper +ТоrsоUppеr +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +LegRight +LеgRight +LegLeft +LеgLеft +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +RimGloveLeft +RimGlоvеLеft +RimForeGloveLeft +RimFоrеGlоvеLеft +BandGloveLeft +ВаndGlоvеLеft +BandForeGloveLeft +ВаndFоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +RimGloveRight +RimGlоvеRight +RimForeGloveRight +RimFоrеGlоvеRight +BandGloveRight +ВаndGlоvеRight +BandForeGloveRight +ВаndFоrеGlоvеRight +Chest +Сhеst +TorsoUpper +ТоrsоUppеr +TorsoLower +ТоrsоLоwеr +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +WristLeft +WristLеft +BandWristLeft +ВаndWristLеft +HardwareWristLeft +HаrdwаrеWristLеft +WristRight +WristRight +BandWristRight +ВаndWristRight +HardwareWristRight +HаrdwаrеWristRight +WristLeft +WristLеft +BandWristLeft +ВаndWristLеft +HardwareWristLeft +HаrdwаrеWristLеft +WristRight +WristRight +BandWristRight +ВаndWristRight +HardwareWristRight +HаrdwаrеWristRight +ElbowLeft +ЕlbоwLеft +BandElbowLeft +ВаndЕlbоwLеft +HardwareElbowLeft +HаrdwаrеЕlbоwLеft +ElbowRight +ЕlbоwRight +BandElbowRight +ВаndЕlbоwRight +HardwareElbowRight +HаrdwаrеЕlbоwRight +ElbowLeft +ЕlbоwLеft +BandElbowLeft +ВаndЕlbоwLеft +HardwareElbowLeft +HаrdwаrеЕlbоwLеft +ElbowRight +ЕlbоwRight +BandElbowRight +ВаndЕlbоwRight +HardwareElbowRight +HаrdwаrеЕlbоwRight +WristLeft +WristLеft +BandWristLeft +ВаndWristLеft +HardwareWristLeft +HаrdwаrеWristLеft +WristRight +WristRight +BandWristRight +ВаndWristRight +HardwareWristRight +HаrdwаrеWristRight +ElbowLeft +ЕlbоwLеft +BandElbowLeft +ВаndЕlbоwLеft +HardwareElbowLeft +HаrdwаrеЕlbоwLеft +ElbowRight +ЕlbоwRight +BandElbowRight +ВаndЕlbоwRight +HardwareElbowRight +HаrdwаrеЕlbоwRight +AnkleLeft +АnklеLеft +BandAnkleLeft +ВаndАnklеLеft +HardwareAnkleLeft +HаrdwаrеАnklеLеft +AnkleRight +АnklеRight +BandAnkleRight +ВаndАnklеRight +HardwareAnkleRight +HаrdwаrеАnklеRight +AnkleRight +АnklеRight +BandAnkleRight +ВаndАnklеRight +HardwareAnkleRight +HаrdwаrеАnklеRight +AnkleLeft +АnklеLеft +BandAnkleLeft +ВаndАnklеLеft +HardwareAnkleLeft +HаrdwаrеАnklеLеft +ThighLeft +ТhighLеft +BandThighLeft +ВаndТhighLеft +HardwareThighLeft +HаrdwаrеТhighLеft +ThighRight +ТhighRight +BandThighRight +ВаndТhighRight +HardwareThighRight +HаrdwаrеТhighRight +ThighRight +ТhighRight +BandThighRight +ВаndТhighRight +HardwareThighRight +HаrdwаrеТhighRight +ThighLeft +ТhighLеft +BandThighLeft +ВаndТhighLеft +HardwareThighLeft +HаrdwаrеТhighLеft +Collar +Соllаr +BandCollar +ВаndСоllаr +HardwareCollar +HаrdwаrеСоllаr +Collar +Соllаr +BandCollar +ВаndСоllаr +HardwareCollar +HаrdwаrеСоllаr +BellCollar +ВеllСоllаr +Collar +Соllаr +BandCollar +ВаndСоllаr +HardwareCollar +HаrdwаrеСоllаr +BowBellCollar +ВоwВеllСоllаr +BowCollar +ВоwСоllаr +Belt +Веlt +BandBelt +ВаndВеlt +HardwareBelt +HаrdwаrеВеlt +FashionLeatherCollar +FаshiоnLеаthеrСоllаr +Collar +Соllаr +BandCollar +ВаndСоllаr +HardwareCollar +HаrdwаrеСоllаr +FashionLeatherBelt +FаshiоnLеаthеrВеlt +Belt +Веlt +BandBelt +ВаndВеlt +HardwareBelt +HаrdwаrеВеlt +FashionLeatherCollarBell +FаshiоnLеаthеrСоllаrВеll +Collar +Соllаr +BandCollar +ВаndСоllаr +HardwareCollar +HаrdwаrеСоllаr +BellCollar +ВеllСоllаr +FashionLeatherCollarBow +FаshiоnLеаthеrСоllаrВоw +Collar +Соllаr +BandCollar +ВаndСоllаr +HardwareCollar +HаrdwаrеСоllаr +BowBellCollar +ВоwВеllСоllаr +BowCollar +ВоwСоllаr +FashionCuffsWristLeft +FаshiоnСuffsWristLеft +WristLeft +WristLеft +BandWristLeft +ВаndWristLеft +HardwareWristLeft +HаrdwаrеWristLеft +FashionCuffsWristRight +FаshiоnСuffsWristRight +WristRight +WristRight +BandWristRight +ВаndWristRight +HardwareWristRight +HаrdwаrеWristRight +FashionCuffsWrists +FаshiоnСuffsWrists +WristLeft +WristLеft +BandWristLeft +ВаndWristLеft +HardwareWristLeft +HаrdwаrеWristLеft +WristRight +WristRight +BandWristRight +ВаndWristRight +HardwareWristRight +HаrdwаrеWristRight +FashionCuffsElbowLeft +FаshiоnСuffsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +BandElbowLeft +ВаndЕlbоwLеft +HardwareElbowLeft +HаrdwаrеЕlbоwLеft +FashionCuffsElbowRight +FаshiоnСuffsЕlbоwRight +ElbowRight +ЕlbоwRight +BandElbowRight +ВаndЕlbоwRight +HardwareElbowRight +HаrdwаrеЕlbоwRight +FashionCuffsElbows +FаshiоnСuffsЕlbоws +ElbowLeft +ЕlbоwLеft +BandElbowLeft +ВаndЕlbоwLеft +HardwareElbowLeft +HаrdwаrеЕlbоwLеft +ElbowRight +ЕlbоwRight +BandElbowRight +ВаndЕlbоwRight +HardwareElbowRight +HаrdwаrеЕlbоwRight +FashionCuffsArms +FаshiоnСuffsАrms +WristLeft +WristLеft +BandWristLeft +ВаndWristLеft +HardwareWristLeft +HаrdwаrеWristLеft +WristRight +WristRight +BandWristRight +ВаndWristRight +HardwareWristRight +HаrdwаrеWristRight +ElbowLeft +ЕlbоwLеft +BandElbowLeft +ВаndЕlbоwLеft +HardwareElbowLeft +HаrdwаrеЕlbоwLеft +ElbowRight +ЕlbоwRight +BandElbowRight +ВаndЕlbоwRight +HardwareElbowRight +HаrdwаrеЕlbоwRight +FashionCuffsAnklesLeft +FаshiоnСuffsАnklеsLеft +AnkleLeft +АnklеLеft +BandAnkleLeft +ВаndАnklеLеft +HardwareAnkleLeft +HаrdwаrеАnklеLеft +FashionCuffsAnklesRight +FаshiоnСuffsАnklеsRight +AnkleRight +АnklеRight +BandAnkleRight +ВаndАnklеRight +HardwareAnkleRight +HаrdwаrеАnklеRight +FashionCuffsAnkles +FаshiоnСuffsАnklеs +AnkleRight +АnklеRight +BandAnkleRight +ВаndАnklеRight +HardwareAnkleRight +HаrdwаrеАnklеRight +AnkleLeft +АnklеLеft +BandAnkleLeft +ВаndАnklеLеft +HardwareAnkleLeft +HаrdwаrеАnklеLеft +FashionCuffsThighLeft +FаshiоnСuffsТhighLеft +ThighLeft +ТhighLеft +BandThighLeft +ВаndТhighLеft +HardwareThighLeft +HаrdwаrеТhighLеft +FashionCuffsThighRight +FаshiоnСuffsТhighRight +ThighRight +ТhighRight +BandThighRight +ВаndТhighRight +HardwareThighRight +HаrdwаrеТhighRight +FashionCuffsThigh +FаshiоnСuffsТhigh +ThighRight +ТhighRight +BandThighRight +ВаndТhighRight +HardwareThighRight +HаrdwаrеТhighRight +ThighLeft +ТhighLеft +BandThighLeft +ВаndТhighLеft +HardwareThighLeft +HаrdwаrеТhighLеft +FaceMouth +FасеMоuth +FaceEyes +FасеЕyеs +FaceFull +FасеFull +FootLeft +FооtLеft +FootRight +FооtRight +TorsoLower +ТоrsоLоwеr +LegLeft +LеgLеft +LegRight +LеgRight +LegLeft +LеgLеft +LegRight +LеgRight +TorsoLower +ТоrsоLоwеr +AnkleLeft +АnklеLеft +AnkleRight +АnklеRight +ArmLeft +АrmLеft +ArmRight +АrmRight +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +ArmLeft +АrmLеft +ArmRight +АrmRight +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +HandLeft +HаndLеft +HandRight +HаndRight +HandLeft +HаndLеft +HandRight +HаndRight +FaceMouth +FасеMоuth +FaceEyes +FасеЕyеs +FaceFull +FасеFull +FootLeft +FооtLеft +FootRight +FооtRight +TorsoLower +ТоrsоLоwеr +LegLeft +LеgLеft +LegRight +LеgRight +LegLeft +LеgLеft +LegRight +LеgRight +TorsoLower +ТоrsоLоwеr +AnkleLeft +АnklеLеft +AnkleRight +АnklеRight +ArmLeft +АrmLеft +ArmRight +АrmRight +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +ArmLeft +АrmLеft +ArmRight +АrmRight +TorsoUpper +ТоrsоUppеr +Chest +Сhеst +HandLeft +HаndLеft +HandRight +HаndRight +HandLeft +HаndLеft +HandRight +HаndRight +Feet +Fееt +Ankles +Аnklеs +Legs +Lеgs +RightLegs +RightLеgs +StrapCover +StrаpСоvеr +Top +Тоp +Chest +Сhеst +ArmLeft +АrmLеft +ArmRight +АrmRight +TopFull +ТоpFull +ChestFull +СhеstFull +ArmFullLeft +АrmFullLеft +ArmFullRight +АrmFullRight +HandLeft +HаndLеft +HandRight +HаndRight +Feet +Fееt +Ankles +Аnklеs +Legs +Lеgs +RightLegs +RightLеgs +StrapCover +StrаpСоvеr +Bottom +Воttоm +Bottom +Воttоm +Legs +Lеgs +RightLegs +RightLеgs +StrapCover +StrаpСоvеr +Top +Тоp +Chest +Сhеst +ArmLeft +АrmLеft +ArmRight +АrmRight +Top +Тоp +Chest +Сhеst +ArmLeft +АrmLеft +ArmRight +АrmRight +TopFull +ТоpFull +ChestFull +СhеstFull +ArmFullLeft +АrmFullLеft +ArmFullRight +АrmFullRight +HandLeft +HаndLеft +HandRight +HаndRight +HandLeft +HаndLеft +HandRight +HаndRight +Feet +Fееt +Ankles +Аnklеs +Legs +Lеgs +RightLegs +RightLеgs +Top +Тоp +ArmLeft +АrmLеft +ArmRight +АrmRight +ArmLeft +АrmLеft +ArmRight +АrmRight +Top +Тоp +TopStrap +ТоpStrаp +ChestStrap +СhеstStrаp +ArmStrapLeft +АrmStrаpLеft +ArmStrapRight +АrmStrаpRight +ArmLeft +АrmLеft +ArmRight +АrmRight +Top +Тоp +TopStrap +ТоpStrаp +ChestStrap +СhеstStrаp +ArmStrapLeft +АrmStrаpLеft +ArmStrapRight +АrmStrаpRight +HandLeft +HаndLеft +HandRight +HаndRight +LatexTop +LаtеxТоp +BraProtoLining +ВrаPrоtоLining +BraProtoLiningMid +ВrаPrоtоLiningMid +BraProtoLiningRim +ВrаPrоtоLiningRim +BraProtoLiningMidRim +ВrаPrоtоLiningMidRim +LatexTopZip +LаtеxТоpZip +BraProtoLiningZip +ВrаPrоtоLiningZip +BraProtoLiningMidZip +ВrаPrоtоLiningMidZip +BraProtoLiningZipRim +ВrаPrоtоLiningZipRim +BraProtoLiningMidZipRim +ВrаPrоtоLiningMidZipRim +BraProto +ВrаPrоtо +BraProtoLining +ВrаPrоtоLining +BraProtoLiningMid +ВrаPrоtоLiningMid +BraProtoCups +ВrаPrоtоСups +BraProtoDisplay +ВrаPrоtоDisplаy +BraProtoLock +ВrаPrоtоLосk +BraCyber +ВrаСybеr +BraCyberLining +ВrаСybеrLining +BraCyberDisplay +ВrаСybеrDisplаy +BraCyberLock +ВrаСybеrLосk +BraCups +ВrаСups +BraLining +ВrаLining +BraChain +ВrаСhаin +BraLock +ВrаLосk +Belt +Веlt +BeltLining +ВеltLining +BeltLock +ВеltLосk +BeltStrap +ВеltStrаp +BeltStrapLining +ВеltStrаpLining +Cyber +Сybеr +CyberLining +СybеrLining +CyberDisplay +СybеrDisplаy +CyberPlug +СybеrPlug +CyberLock +СybеrLосk +Proto +Prоtо +ProtoLining +PrоtоLining +ProtoDisplay +PrоtоDisplаy +ProtoPlug +PrоtоPlug +ProtoLock +PrоtоLосk +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +StrapsLeft +StrаpsLеft +StrapsRight +StrаpsRight +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +StrapsLeft +StrаpsLеft +StrapsRight +StrаpsRight +Cross +Сrоss +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +Cross +Сrоss +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +StrapsLeft +StrаpsLеft +StrapsRight +StrаpsRight +Secure +Sесurе +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +Secure +Sесurе +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +StrapsLeft +StrаpsLеft +StrapsRight +StrаpsRight +Gwen +Gwеn +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +Gwen +Gwеn +BinderLeft +ВindеrLеft +BinderRight +ВindеrRight +StrapsLeft +StrаpsLеft +StrapsRight +StrаpsRight +WolfHarness +WоlfHаrnеss +Arms +Аrms +BeltsArms +ВеltsАrms +Arms +Аrms +BeltsArms +ВеltsАrms +Chest +Сhеst +BeltsChest +ВеltsСhеst +Arms +Аrms +BeltsArms +ВеltsАrms +Chest +Сhеst +BeltsChest +ВеltsСhеst +BinderTorsoLower +ВindеrТоrsоLоwеr +BeltsTorsoLower +ВеltsТоrsоLоwеr +Crotch +Сrоtсh +CrotchBelts +СrоtсhВеlts +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +Arms +Аrms +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +Arms +Аrms +ChestBolero +СhеstВоlеrо +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +Arms +Аrms +ChestBolero +СhеstВоlеrо +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +LatexLower +LаtеxLоwеr +LatexChest +LаtеxСhеst +LatexUpper +LаtеxUppеr +Legbinder +Lеgbindеr +LegLegbinder +LеgLеgbindеr +RightLegbinder +RightLеgbindеr +LegRightLegbinder +LеgRightLеgbindеr +LacesLegbinder +LасеsLеgbindеr +Face +Fасе +Cloth +Сlоth +Basic +Ваsiс +BasicRim +ВаsiсRim +LeatherBase +LеаthеrВаsе +LeatherRim +LеаthеrRim +LeatherBase +LеаthеrВаsе +LeatherRim +LеаthеrRim +KittyEyes +KittyЕyеs +Tape +Таpе +BalletLeft +ВаllеtLеft +BalletRight +ВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +BalletLaceLeft +ВаllеtLасеLеft +BalletLaceRight +ВаllеtLасеRight +FlatBalletLeft +FlаtВаllеtLеft +FlatBalletRight +FlаtВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +ShinyBalletLeft +ShinyВаllеtLеft +ShinyBalletRight +ShinyВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +BalletLeft +ВаllеtLеft +BalletRight +ВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +BalletLaceLeft +ВаllеtLасеLеft +BalletLaceRight +ВаllеtLасеRight +FlatBalletLeft +FlаtВаllеtLеft +FlatBalletRight +FlаtВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +ShinyBalletLeft +ShinyВаllеtLеft +ShinyBalletRight +ShinyВаllеtRight +BalletSoleLeft +ВаllеtSоlеLеft +BalletSoleRight +ВаllеtSоlеRight +LeatherLeft +LеаthеrLеft +LeatherRight +LеаthеrRight +LeatherLegLeft +LеаthеrLеgLеft +LeatherLegRight +LеаthеrLеgRight +TallLeft +ТаllLеft +TallRight +ТаllRight +TallLegLeft +ТаllLеgLеft +TallLegRight +ТаllLеgRight +TallLeft +ТаllLеft +TallRight +ТаllRight +TallLegLeft +ТаllLеgLеft +TallLegRight +ТаllLеgRight +LegironsLeft +LеgirоnsLеft +LegironsRight +LеgirоnsRight +Irish8AnkleLeft +Irish8АnklеLеft +Irish8AnkleRight +Irish8АnklеRight +CuffsLock +СuffsLосk +HandCuffs +HаndСuffs +CuffsLock +СuffsLосk +HingedCuffs +HingеdСuffs +CuffsLock +СuffsLосk +Irish8Cuffs +Irish8Сuffs +WolfCuffs +WоlfСuffs +WolfCuffsChain +WоlfСuffsСhаin +Thumbcuffs +Тhumbсuffs +BeltsTop +ВеltsТоp +HardwareTop +HаrdwаrеТоp +BeltsMid +ВеltsMid +HardwareMid +HаrdwаrеMid +BeltsStrap +ВеltsStrаp +HardwareStrap +HаrdwаrеStrаp +BeltsTop +ВеltsТоp +HardwareTop +HаrdwаrеТоp +BeltsOverbust +ВеltsОvеrbust +BeltsUnderbust +ВеltsUndеrbust +HardwareUnderbustOver +HаrdwаrеUndеrbustОvеr +HardwareUnderbust +HаrdwаrеUndеrbust +BeltsMid +ВеltsMid +HardwareMid +HаrdwаrеMid +BeltsStrap +ВеltsStrаp +HardwareStrap +HаrdwаrеStrаp +StrapsChest +StrаpsСhеst +DisplayChest +DisplаyСhеst +MetalChest +MеtаlСhеst +StrapsMid +StrаpsMid +DisplayMid +DisplаyMid +MetalMid +MеtаlMid +StrapsLower +StrаpsLоwеr +DisplayLower +DisplаyLоwеr +MetalLower +MеtаlLоwеr +StrapsLower +StrаpsLоwеr +DisplayLower +DisplаyLоwеr +MetalLower +MеtаlLоwеr +StrapsMid +StrаpsMid +DisplayMid +DisplаyMid +MetalMid +MеtаlMid +StrapsChest +StrаpsСhеst +DisplayChest +DisplаyСhеst +MetalChest +MеtаlСhеst +Collar +Соllаr +Collar +Соllаr +CollarTag +СоllаrТаg +Belt +Веlt +Belt +Веlt +BeltLines +ВеltLinеs +FrillyPanel +FrillyPаnеl +FrillyStraps +FrillyStrаps +FrillyHardware +FrillyHаrdwаrе +FrillyHighlights +FrillyHighlights +FrillyPanel +FrillyPаnеl +FrillyStraps +FrillyStrаps +FrillyHardware +FrillyHаrdwаrе +FrillyHighlights +FrillyHighlights +Duster +Dustеr +Ball +Ваll +Strap +Strаp +Ball +Ваll +Strap +Strаp +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Ball +Ваll +Strap +Strаp +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Panel +Pаnеl +Strap +Strаp +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Muzzle +Muzzlе +Strap +Strаp +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Plug +Plug +Muzzle +Muzzlе +Strap +Strаp +Plug +Plug +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +Plug +Plug +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Plug +Plug +Panel +Pаnеl +Strap +Strаp +Plug +Plug +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +Plug +Plug +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Plug +Plug +Stuffing +Stuffing +Full +Full +Wrap +Wrаp +Full +Full +Wrap +Wrаp +Cleave +Сlеаvе +Cleave +Сlеаvе +CleaveThick +СlеаvеТhiсk +Knot +Knоt +OTN +ОТN +OTM +ОТM +OTN +ОТN +OTNFlat +ОТNFlаt +OTNFlat +ОТNFlаt +Harness +Hаrnеss +OTNFlat +ОТNFlаt +Harness +Hаrnеss +SideStrap +SidеStrаp +OTNFlat +ОТNFlаt +Plug +Plug +OTNFlat +ОТNFlаt +Plug +Plug +Harness +Hаrnеss +OTNFlat +ОТNFlаt +Plug +Plug +Harness +Hаrnеss +SideStrap +SidеStrаp +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +OTNFlat +ОТNFlаt +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +OTNFlat +ОТNFlаt +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +OTNFlat +ОТNFlаt +Plug +Plug +OTN +ОТN +FabricMuzzle +FаbriсMuzzlе +FabricMuzzle +FаbriсMuzzlе +KittyMouth +KittyMоuth +Whiskers +Whiskеrs +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +KittyMouth +KittyMоuth +FabricMuzzle +FаbriсMuzzlе +OTN +ОТN +OTNRivets +ОТNRivеts +Ball +Ваll +Strap +Strаp +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Ball +Ваll +Strap +Strаp +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Ball +Ваll +Strap +Strаp +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +Mask +Mаsk +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +Mask +Mаsk +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +Mask +Mаsk +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +Mask +Mаsk +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +SideStrap +SidеStrаp +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +SideStrap +SidеStrаp +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Mask +Mаsk +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Plug +Plug +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Mask +Mаsk +Plug +Plug +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Mask +Mаsk +FashionGagMetal +FаshiоnGаgMеtаl +OTN +ОТN +FashionGagMetalRiveted +FаshiоnGаgMеtаlRivеtеd +OTN +ОТN +OTNRivets +ОТNRivеts +FashionGagFabric +FаshiоnGаgFаbriс +FabricMuzzle +FаbriсMuzzlе +FashionKittyMuzzle +FаshiоnKittyMuzzlе +FabricMuzzle +FаbriсMuzzlе +KittyMouth +KittyMоuth +Whiskers +Whiskеrs +FashionSimpleSciFiMuzzle +FаshiоnSimplеSсiFiMuzzlе +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +FashionAdvancedSciFiMuzzle2 +FаshiоnАdvаnсеdSсiFiMuzzlе2 +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Mask +Mаsk +FashionAdvancedSciFiMuzzle +FаshiоnАdvаnсеdSсiFiMuzzlе +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Mask +Mаsk +FashionSimpleSciFiMuzzle2 +FаshiоnSimplеSсiFiMuzzlе2 +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Arms1 +Аrms1 +LeftArm1 +LеftАrm1 +RightArm1 +RightАrm1 +Arms2 +Аrms2 +LeftArm2 +LеftАrm2 +RightArm2 +RightАrm2 +Arms1 +Аrms1 +LeftArm1 +LеftАrm1 +RightArm1 +RightАrm1 +Arms2 +Аrms2 +LeftArm2 +LеftАrm2 +RightArm2 +RightАrm2 +Legs1 +Lеgs1 +RightLegs1 +RightLеgs1 +Legs2 +Lеgs2 +RightLegs2 +RightLеgs2 +Legs1 +Lеgs1 +RightLegs1 +RightLеgs1 +Legs2 +Lеgs2 +RightLegs2 +RightLеgs2 +Feet1 +Fееt1 +Feet2 +Fееt2 +Feet1 +Fееt1 +Feet2 +Fееt2 +Belt +Веlt +Arms1 +Аrms1 +Arms2 +Аrms2 +LeftArm2 +LеftАrm2 +Arms1 +Аrms1 +Arms2 +Аrms2 +LeftArm2 +LеftАrm2 +Legs1 +Lеgs1 +RightLegs1 +RightLеgs1 +Legs2 +Lеgs2 +RightLegs2 +RightLеgs2 +Legs1 +Lеgs1 +RightLegs1 +RightLеgs1 +Legs2 +Lеgs2 +RightLegs2 +RightLеgs2 +Feet1 +Fееt1 +Mouth +Mоuth +Eyes +Еyеs +Crotch +Сrоtсh +CrotchStrap +СrоtсhStrаp +CageFront +СаgеFrоnt +CageBack +СаgеВасk +SarcoFront +SаrсоFrоnt +SarcoWebs +SаrсоWеbs +SarcoBack +SаrсоВасk +Bed +Веd +LatexCube +LаtеxСubе +LatexCubeBack +LаtеxСubеВасk +Barrel +Ваrrеl +DisplayFront +DisplаyFrоnt +OneBarFront +ОnеВаrFrоnt +OneBarBack +ОnеВаrВасk +Collar +Соllаr +Leash +Lеаsh +DragonCollar +DrаgоnСоllаr +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +Future +Futurе +FutureBand +FuturеВаnd +FutureDisplay +FuturеDisplаy +FutureRim +FuturеRim +FutureLock +FuturеLосk +Future +Futurе +FutureBand +FuturеВаnd +FutureDisplay +FuturеDisplаy +FutureRim +FuturеRim +FutureLock +FuturеLосk +Module +Mоdulе +ModuleDisplay +MоdulеDisplаy +TrackingModule +ТrасkingMоdulе +TrackingModuleDisplay +ТrасkingMоdulеDisplаy +Dollmaker +Dоllmаkеr +Dollmaker +Dоllmаkеr +DollmakerFull +DоllmаkеrFull +DollmakerFull +DоllmаkеrFull +DollmakerFullRim +DоllmаkеrFullRim +DollmakerFull +DоllmаkеrFull +DollmakerFull +DоllmаkеrFull +DollmakerFullRim +DоllmаkеrFullRim +Mask +Mаsk +Valves +Vаlvеs +Center +Сеntеr +Nose +Nоsе +Plugs +Plugs +Mask +Mаsk +Valves +Vаlvеs +Center +Сеntеr +Nose +Nоsе +Plugs +Plugs +Arms +Аrms +Legs +Lеgs +LeftLegs +LеftLеgs +Hairband2 +Hаirbаnd2 +Hairband +Hаirbаnd +Hairband +Hаirbаnd +BraidCustom +ВrаidСustоm +BraidCustom_Overstrap +ВrаidСustоm_Оvеrstrаp +BraidCustomBack +ВrаidСustоmВасk +BraidCustomBraid +ВrаidСustоmВrаid +BraidCustomBack +ВrаidСustоmВасk +BackShortCurly +ВасkShоrtСurly +BackShortCurlyUnderlight +ВасkShоrtСurlyUndеrlight +AuraHair +АurаHаir +HairAura_Front +HаirАurа_Frоnt +HairAura +HаirАurа +AuraBang_Left +АurаВаng_Lеft +HairAura_Left +HаirАurа_Lеft +HairAura_LeftB +HаirАurа_LеftВ +AuraBang_Right +АurаВаng_Right +HairAura_Right +HаirАurа_Right +HairAura_RightB +HаirАurа_RightВ +AuraBang_Left_Back +АurаВаng_Lеft_Васk +HairAura_Left +HаirАurа_Lеft +HairAura_LeftB +HаirАurа_LеftВ +AuraBang_Right_Back +АurаВаng_Right_Васk +HairAura_Right +HаirАurа_Right +HairAura_RightB +HаirАurа_RightВ +Hair2 +Hаir2 +Hair2_Front +Hаir2_Frоnt +Hair2_FrontB +Hаir2_FrоntВ +Hair2_FrontC +Hаir2_FrоntС +Hair2_LeftPuff +Hаir2_LеftPuff +Hair2_Left +Hаir2_Lеft +Hair2_RightPuff +Hаir2_RightPuff +Hair2_Right +Hаir2_Right +Hair3 +Hаir3 +Hair3_FrontA +Hаir3_FrоntА +Hair3_FrontC +Hаir3_FrоntС +Hair3_FrontD +Hаir3_FrоntD +Hair3_Short +Hаir3_Shоrt +Hair3_FrontA +Hаir3_FrоntА +Hair3_FrontC +Hаir3_FrоntС +Hair3_FrontD +Hаir3_FrоntD +Hair3_Bangs +Hаir3_Ваngs +Hair3_FrontE +Hаir3_FrоntЕ +Hair3Back +Hаir3Васk +Hair3_Back +Hаir3_Васk +Hair4 +Hаir4 +Hair4_Front +Hаir4_Frоnt +Hair4_FrontB +Hаir4_FrоntВ +Hair4_TailLeft +Hаir4_ТаilLеft +Hair4_Left +Hаir4_Lеft +Hair4_LeftB +Hаir4_LеftВ +Hair4_TailRight +Hаir4_ТаilRight +Hair4_Right +Hаir4_Right +Hair4_RightB +Hаir4_RightВ +Hair5 +Hаir5 +Hair5_Front +Hаir5_Frоnt +Hair5_FrontB +Hаir5_FrоntВ +Hair5_FrontC +Hаir5_FrоntС +Hair5_Highlight +Hаir5_Highlight +Hair5_FrontD +Hаir5_FrоntD +Hair5_TailLeft +Hаir5_ТаilLеft +Hair5_Left +Hаir5_Lеft +Hair5_TailRight +Hаir5_ТаilRight +Hair5_Right +Hаir5_Right +Hair6 +Hаir6 +Hair6_Front +Hаir6_Frоnt +Hair6_FrontB +Hаir6_FrоntВ +Hair6_TailLeft +Hаir6_ТаilLеft +Hair6_Left +Hаir6_Lеft +Hair6_TailRight +Hаir6_ТаilRight +Hair6_Right +Hаir6_Right +Butt2 +Вutt2 +Nipples +Nipplеs +Brows +Вrоws +Brows2 +Вrоws2 +EarsFront +ЕаrsFrоnt +CatsuitLowerLeotard +СаtsuitLоwеrLеоtаrd +TorsoLowerLeotard +ТоrsоLоwеrLеоtаrd +TransparentCatsuitLowerLeotard +ТrаnspаrеntСаtsuitLоwеrLеоtаrd +TorsoLowerLeotard +ТоrsоLоwеrLеоtаrd +ChainBikini +СhаinВikini +ShirtChest +ShirtСhеst +ChainSkirt2 +СhаinSkirt2 +SkirtBelt +SkirtВеlt +SkirtBeltDeco +SkirtВеltDесо +SkirtBeltRivets +SkirtВеltRivеts +Skirt2 +Skirt2 +SkirtBelt +SkirtВеlt +SkirtBeltDeco +SkirtВеltDесо +SkirtBeltRivets +SkirtВеltRivеts +Skirt2 +Skirt2 +SkirtBelt +SkirtВеlt +SkirtBeltDeco +SkirtВеltDесо +SkirtBeltRivets +SkirtВеltRivеts +Skirt2 +Skirt2 +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +FashionKiguMask +FаshiоnKiguMаsk +Mask +Mаsk +Eyes +Еyеs +Eyes2 +Еyеs2 +Lock +Lосk +EyesWhites +ЕyеsWhitеs +Mouth +Mоuth +SwimsuitUnder +SwimsuitUndеr +Swimsuit +Swimsuit +SwimsuitChest +SwimsuitСhеst +BunnyLeotardUnder +ВunnyLеоtаrdUndеr +Leotard +Lеоtаrd +LeotardChest +LеоtаrdСhеst +BunnyLeotardHighUnder +ВunnyLеоtаrdHighUndеr +HighLeotard +HighLеоtаrd +LeotardChest +LеоtаrdСhеst +LeatherLeotardTop +LеаthеrLеоtаrdТоp +LeotardChest +LеоtаrdСhеst +LeatherLeotardBottom +LеаthеrLеоtаrdВоttоm +Leotard +Lеоtаrd +LeatherLeotardCorset +LеаthеrLеоtаrdСоrsеt +LeotardCorset +LеоtаrdСоrsеt +Laces +Lасеs +LeatherLeotard +LеаthеrLеоtаrd +LeotardChest +LеоtаrdСhеst +Leotard +Lеоtаrd +LeotardCorset +LеоtаrdСоrsеt +Laces +Lасеs +LeatherLeotardStrapsUpper +LеаthеrLеоtаrdStrаpsUppеr +StrapsChest +StrаpsСhеst +LeatherLeotardStrapsLower +LеаthеrLеоtаrdStrаpsLоwеr +StrapsLower +StrаpsLоwеr +StrapsHardware +StrаpsHаrdwаrе +LeatherLeotardStrapsLowerClean +LеаthеrLеоtаrdStrаpsLоwеrСlеаn +StrapsLowerClean +StrаpsLоwеrСlеаn +StrapsHardware +StrаpsHаrdwаrе +OperaGloveLeft +ОpеrаGlоvеLеft +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +OperaGloveRight +ОpеrаGlоvеRight +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +OperaGloves +ОpеrаGlоvеs +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +OperaGlovesRestraint +ОpеrаGlоvеsRеstrаint +GloveLeft +GlоvеLеft +ForeGloveLeft +FоrеGlоvеLеft +GloveRight +GlоvеRight +ForeGloveRight +FоrеGlоvеRight +SailorCollar +SаilоrСоllаr +Collar +Соllаr +CollarStripe +СоllаrStripе +SailorCollarFull +SаilоrСоllаrFull +Collar +Соllаr +CollarStripe +СоllаrStripе +Bust +Вust +BustStripe +ВustStripе +SailorBow +SаilоrВоw +Ribbon +Ribbоn +SailorTop +SаilоrТоp +Shirt +Shirt +ShirtChest +ShirtСhеst +SailorSleeveLeft +SаilоrSlееvеLеft +SleeveLeft +SlееvеLеft +HemLeft +HеmLеft +SailorSleeveRight +SаilоrSlееvеRight +SleeveRight +SlееvеRight +HemRight +HеmRight +SailorSleeves +SаilоrSlееvеs +SleeveLeft +SlееvеLеft +HemLeft +HеmLеft +SleeveRight +SlееvеRight +HemRight +HеmRight +SailorShirt +SаilоrShirt +SleeveLeft +SlееvеLеft +HemLeft +HеmLеft +SleeveRight +SlееvеRight +HemRight +HеmRight +Shirt +Shirt +ShirtChest +ShirtСhеst +Sailor +Sаilоr +SleeveLeft +SlееvеLеft +HemLeft +HеmLеft +SleeveRight +SlееvеRight +HemRight +HеmRight +Shirt +Shirt +ShirtChest +ShirtСhеst +Collar +Соllаr +CollarStripe +СоllаrStripе +Bust +Вust +BustStripe +ВustStripе +Ribbon +Ribbоn +DressSkirtSplitNoBelt +DrеssSkirtSplitNоВеlt +Skirt +Skirt +SkirtSplit +SkirtSplit +SkirtSplitOver +SkirtSplitОvеr +DressSkirtSplit +DrеssSkirtSplit +Skirt +Skirt +SkirtSplit +SkirtSplit +SkirtSplitOver +SkirtSplitОvеr +SkirtSplitBelt +SkirtSplitВеlt +BlouseSkirt +ВlоusеSkirt +BlouseSkirtLone +ВlоusеSkirtLоnе +BlouseSkirtOverKneel +ВlоusеSkirtОvеrKnееl +Sunglasses +Sunglаssеs +Glasses +Glаssеs +GlassesLens +GlаssеsLеns +MageSkirt +MаgеSkirt +MageSkirt +MаgеSkirt +Band +Ваnd +MageSkirtOver +MаgеSkirtОvеr +MageCorset +MаgеСоrsеt +MageCorset +MаgеСоrsеt +MageCorsetStripes +MаgеСоrsеtStripеs +MageBra +MаgеВrа +MageBra +MаgеВrа +MageBraStripes +MаgеВrаStripеs +MageTop +MаgеТоp +MageBra +MаgеВrа +MageBraStripes +MаgеВrаStripеs +MageCorset +MаgеСоrsеt +MageCorsetStripes +MаgеСоrsеtStripеs +MageCollar +MаgеСоllаr +MageCollar +MаgеСоllаr +MageCollarCrystal +MаgеСоllаrСrystаl +MageCollarHardware +MаgеСоllаrHаrdwаrе +MageCollar2 +MаgеСоllаr2 +MageCollar +MаgеСоllаr +MageCollarCrystal +MаgеСоllаrСrystаl +MageCollarHardware +MаgеСоllаrHаrdwаrе +MageCollarTie +MаgеСоllаrТiе +Mage +Mаgе +MageBra +MаgеВrа +MageBraStripes +MаgеВrаStripеs +MageCorset +MаgеСоrsеt +MageCorsetStripes +MаgеСоrsеtStripеs +MageSkirt +MаgеSkirt +Band +Ваnd +MageSkirtOver +MаgеSkirtОvеr +MageCollar +MаgеСоllаr +MageCollarCrystal +MаgеСоllаrСrystаl +MageCollarHardware +MаgеСоllаrHаrdwаrе +MageCollarTie +MаgеСоllаrТiе +ChineseDress +СhinеsеDrеss +Dress +Drеss +Bra +Вrа +Highlights +Highlights +DressSkirt +DrеssSkirt +DressSkirtOverKneel +DrеssSkirtОvеrKnееl +ChineseBra +СhinеsеВrа +Bra +Вrа +Highlights +Highlights +ChineseTop +СhinеsеТоp +Bra +Вrа +Highlights +Highlights +SkirtSplit +SkirtSplit +SkirtSplitOver +SkirtSplitОvеr +SkirtSplitBelt +SkirtSplitВеlt +MageBra +MаgеВrа +MageBraStripes +MаgеВrаStripеs +MageCorset +MаgеСоrsеt +MageCorsetStripes +MаgеСоrsеtStripеs +MageCollar +MаgеСоllаr +MageCollarCrystal +MаgеСоllаrСrystаl +MageCollarHardware +MаgеСоllаrHаrdwаrе +MageCollarTie +MаgеСоllаrТiе +YukataWaist +YukаtаWаist +Waist +Wаist +WaistBand +WаistВаnd +YukataWaistPattern +YukаtаWаistPаttеrn +WaistPattern +WаistPаttеrn +WaistBand +WаistВаnd +YukataTop +YukаtаТоp +Shirt +Shirt +ShirtChest +ShirtСhеst +YukataSleeveLeft +YukаtаSlееvеLеft +SleeveLeft +SlееvеLеft +YukataSleeveRight +YukаtаSlееvеRight +SleeveRight +SlееvеRight +YukataSleeves +YukаtаSlееvеs +SleeveLeft +SlееvеLеft +SleeveRight +SlееvеRight +YukataShirt +YukаtаShirt +Shirt +Shirt +ShirtChest +ShirtСhеst +SleeveLeft +SlееvеLеft +SleeveRight +SlееvеRight +YukataSkirt +YukаtаSkirt +Skirt +Skirt +SkirtOver +SkirtОvеr +Yukata +Yukаtа +Waist +Wаist +WaistBand +WаistВаnd +Shirt +Shirt +ShirtChest +ShirtСhеst +SleeveLeft +SlееvеLеft +SleeveRight +SlееvеRight +Skirt +Skirt +SkirtOver +SkirtОvеr +YukataPattern +YukаtаPаttеrn +WaistPattern +WаistPаttеrn +WaistBand +WаistВаnd +LongMittenLeft +LоngMittеnLеft +ForeLongMittenLeft +FоrеLоngMittеnLеft +LongMittenRight +LоngMittеnRight +ForeLongMittenRight +FоrеLоngMittеnRight +LongMittenLeft +LоngMittеnLеft +ForeLongMittenLeft +FоrеLоngMittеnLеft +LongMittenRight +LоngMittеnRight +ForeLongMittenRight +FоrеLоngMittеnRight +FashionLeatherMittens +FаshiоnLеаthеrMittеns +LeatherLeft +LеаthеrLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +LeatherRight +LеаthеrRight +BandRight +ВаndRight +LockRight +LосkRight +FashionLeatherPawMittens +FаshiоnLеаthеrPаwMittеns +LeatherLeft +LеаthеrLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +PawLeft +PаwLеft +LeatherRight +LеаthеrRight +BandRight +ВаndRight +LockRight +LосkRight +PawRight +PаwRight +FashionLatexMittens +FаshiоnLаtеxMittеns +LatexLeft +LаtеxLеft +ZipperLeft +ZippеrLеft +LatexRight +LаtеxRight +ZipperRight +ZippеrRight +FashionLongMittens +FаshiоnLоngMittеns +LongMittenLeft +LоngMittеnLеft +ForeLongMittenLeft +FоrеLоngMittеnLеft +BandLeft +ВаndLеft +LockLeft +LосkLеft +LongMittenRight +LоngMittеnRight +ForeLongMittenRight +FоrеLоngMittеnRight +BandRight +ВаndRight +LockRight +LосkRight +CollarHardware +СоllаrHаrdwаrе +HeavyYoke +HеаvyYоkе +HeavySteel +HеаvyStееl +HeavySteelPins +HеаvyStееlPins +HeavySteelLock +HеаvyStееlLосk +HeavySteelHardware +HеаvyStееlHаrdwаrе +HeavyFiddle +HеаvyFiddlе +FiddleLines +FiddlеLinеs +FiddleBody +FiddlеВоdy +FiddleLock +FiddlеLосk +BackFiddleLines +ВасkFiddlеLinеs +BackFiddleBody +ВасkFiddlеВоdy +RopeSuspension +RоpеSuspеnsiоn +Suspension +Suspеnsiоn +Belt +Веlt +FashionRopeHarness +FаshiоnRоpеHаrnеss +Harness +Hаrnеss +HarnessLower +HаrnеssLоwеr +HarnessLowerStrap +HаrnеssLоwеrStrаp +FashionRopeCrotch +FаshiоnRоpеСrоtсh +Crotchrope +Сrоtсhrоpе +CrotchropeStrap +СrоtсhrоpеStrаp +FashionRopeChestStraps2 +FаshiоnRоpеСhеstStrаps2 +ArmHarness +АrmHаrnеss +ArmStrapHarness +АrmStrаpHаrnеss +ArmHarnessUp +АrmHаrnеssUp +FashionRibbonHarness +FаshiоnRibbоnHаrnеss +Harness +Hаrnеss +HarnessMid +HаrnеssMid +HarnessLower +HаrnеssLоwеr +HarnessLowerStrap +HаrnеssLоwеrStrаp +FashionRibbonCrotch +FаshiоnRibbоnСrоtсh +Crotch +Сrоtсh +CrotchStrap +СrоtсhStrаp +IronCollarClip +IrоnСоllаrСlip +Collar +Соllаr +CollarHardware +СоllаrHаrdwаrе +FashionIronCollarClip +FаshiоnIrоnСоllаrСlip +Collar +Соllаr +CollarHardware +СоllаrHаrdwаrе +QuakeCollar +QuаkеСоllаr +Collar +Соllаr +CollarTag +СоllаrТаg +QuakeCollarRestraint +QuаkеСоllаrRеstrаint +Collar +Соllаr +CollarTag +СоllаrТаg +BuckleCorset +ВuсklеСоrsеt +BuckleCorset +ВuсklеСоrsеt +BuckleCorsetBuckles +ВuсklеСоrsеtВuсklеs +BuckleCorsetHardware +ВuсklеСоrsеtHаrdwаrе +BuckleCorsetRestraint +ВuсklеСоrsеtRеstrаint +BuckleCorset +ВuсklеСоrsеt +BuckleCorsetBuckles +ВuсklеСоrsеtВuсklеs +BuckleCorsetHardware +ВuсklеСоrsеtHаrdwаrе +StripedSkirt +StripеdSkirt +StripedSkirt +StripеdSkirt +StripedSkirtUnder +StripеdSkirtUndеr +StripedSkirtOver +StripеdSkirtОvеr +StripedSkirtUnderOver +StripеdSkirtUndеrОvеr +ApronSkirt +АprоnSkirt +MaidSkirt +MаidSkirt +ApronSkirt +АprоnSkirt +MaidSkirtOver +MаidSkirtОvеr +ApronSkirtOver +АprоnSkirtОvеr +LegRimLeft +LеgRimLеft +LegBandLeft +LеgВаndLеft +LegPadsLeft +LеgPаdsLеft +LegRimRight +LеgRimRight +LegBandRight +LеgВаndRight +LegPadsRight +LеgPаdsRight +LegRimRight +LеgRimRight +LegBandRight +LеgВаndRight +LegPadsRight +LеgPаdsRight +LegRimLeft +LеgRimLеft +LegBandLeft +LеgВаndLеft +LegPadsLeft +LеgPаdsLеft +LegRimRight +LеgRimRight +LegBandRight +LеgВаndRight +LegPadsRight +LеgPаdsRight +LegRimLeft +LеgRimLеft +LegBandLeft +LеgВаndLеft +LegPadsLeft +LеgPаdsLеft +TorsoLowerRim +ТоrsоLоwеrRim +TorsoLowerBand +ТоrsоLоwеrВаnd +TorsoUpperCups +ТоrsоUppеrСups +ChestRim +СhеstRim +ChestBand +СhеstВаnd +TorsoUpperBand +ТоrsоUppеrВаnd +TorsoUpperRim +ТоrsоUppеrRim +LegRimRight +LеgRimRight +LegBandRight +LеgВаndRight +LegPadsRight +LеgPаdsRight +LegRimLeft +LеgRimLеft +LegBandLeft +LеgВаndLеft +LegPadsLeft +LеgPаdsLеft +TorsoUpperCups +ТоrsоUppеrСups +ChestRim +СhеstRim +ChestBand +СhеstВаnd +TorsoUpperBand +ТоrsоUppеrВаnd +TorsoUpperRim +ТоrsоUppеrRim +TorsoLowerRim +ТоrsоLоwеrRim +TorsoLowerBand +ТоrsоLоwеrВаnd +DivineCuffsWristLeft +DivinеСuffsWristLеft +WristLeft +WristLеft +WristLeftDeco +WristLеftDесо +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +DivineCuffsWristRight +DivinеСuffsWristRight +WristRight +WristRight +WristRightDeco +WristRightDесо +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +DivineCuffsWrists +DivinеСuffsWrists +WristLeft +WristLеft +WristLeftDeco +WristLеftDесо +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +WristRight +WristRight +WristRightDeco +WristRightDесо +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +DivineCuffsElbowLeft +DivinеСuffsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +ElbowLeftDeco +ЕlbоwLеftDесо +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +DivineCuffsElbowRight +DivinеСuffsЕlbоwRight +ElbowRight +ЕlbоwRight +ElbowRightDeco +ЕlbоwRightDесо +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +DivineCuffsElbows +DivinеСuffsЕlbоws +ElbowLeft +ЕlbоwLеft +ElbowLeftDeco +ЕlbоwLеftDесо +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +ElbowRight +ЕlbоwRight +ElbowRightDeco +ЕlbоwRightDесо +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +DivineCuffsArms +DivinеСuffsАrms +WristLeft +WristLеft +WristLeftDeco +WristLеftDесо +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +WristRight +WristRight +WristRightDeco +WristRightDесо +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +ElbowLeft +ЕlbоwLеft +ElbowLeftDeco +ЕlbоwLеftDесо +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +ElbowRight +ЕlbоwRight +ElbowRightDeco +ЕlbоwRightDесо +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +DivineCuffsAnklesLeft +DivinеСuffsАnklеsLеft +AnkleLeft +АnklеLеft +AnkleLeftDeco +АnklеLеftDесо +AnkleLeftLock +АnklеLеftLосk +AnkleLeftLockPlate +АnklеLеftLосkPlаtе +AnkleLeftLockBand +АnklеLеftLосkВаnd +DivineCuffsAnklesRight +DivinеСuffsАnklеsRight +AnkleRight +АnklеRight +AnkleRightDeco +АnklеRightDесо +AnkleRightLock +АnklеRightLосk +AnkleRightLockPlate +АnklеRightLосkPlаtе +AnkleRightLockBand +АnklеRightLосkВаnd +DivineCuffsAnkles +DivinеСuffsАnklеs +AnkleRight +АnklеRight +AnkleRightDeco +АnklеRightDесо +AnkleRightLock +АnklеRightLосk +AnkleRightLockPlate +АnklеRightLосkPlаtе +AnkleRightLockBand +АnklеRightLосkВаnd +AnkleLeft +АnklеLеft +AnkleLeftDeco +АnklеLеftDесо +AnkleLeftLock +АnklеLеftLосk +AnkleLeftLockPlate +АnklеLеftLосkPlаtе +AnkleLeftLockBand +АnklеLеftLосkВаnd +DivineCuffsThighLeft +DivinеСuffsТhighLеft +ThighLeft +ТhighLеft +ThighLeftDeco +ТhighLеftDесо +ThighLeftLock +ТhighLеftLосk +ThighLeftLockPlate +ТhighLеftLосkPlаtе +ThighLeftLockBand +ТhighLеftLосkВаnd +DivineCuffsThighRight +DivinеСuffsТhighRight +ThighRight +ТhighRight +ThighRightDeco +ТhighRightDесо +ThighRightLock +ТhighRightLосk +ThighRightLockPlate +ТhighRightLосkPlаtе +ThighRightLockBand +ТhighRightLосkВаnd +DivineCuffsThigh +DivinеСuffsТhigh +ThighRight +ТhighRight +ThighRightDeco +ТhighRightDесо +ThighRightLock +ТhighRightLосk +ThighRightLockPlate +ТhighRightLосkPlаtе +ThighRightLockBand +ТhighRightLосkВаnd +ThighLeft +ТhighLеft +ThighLeftDeco +ТhighLеftDесо +ThighLeftLock +ТhighLеftLосk +ThighLeftLockPlate +ТhighLеftLосkPlаtе +ThighLeftLockBand +ТhighLеftLосkВаnd +DivineCollar +DivinеСоllаr +Collar +Соllаr +CollarDeco +СоllаrDесо +CollarLock +СоllаrLосk +CollarLockPlate +СоllаrLосkPlаtе +CollarLockBand +СоllаrLосkВаnd +DivineBelt +DivinеВеlt +BeltLines +ВеltLinеs +BeltMetal2 +ВеltMеtаl2 +BeltMetal1 +ВеltMеtаl1 +BeltBase +ВеltВаsе +BeltPin +ВеltPin +LockBeltLines +LосkВеltLinеs +LockBeltPlate +LосkВеltPlаtе +LockBeltShackle +LосkВеltShасklе +LockBeltHighlight +LосkВеltHighlight +FashionDivineCollar +FаshiоnDivinеСоllаr +Collar +Соllаr +CollarDeco +СоllаrDесо +CollarLock +СоllаrLосk +CollarLockPlate +СоllаrLосkPlаtе +CollarLockBand +СоllаrLосkВаnd +FashionDivineBelt +FаshiоnDivinеВеlt +BeltLines +ВеltLinеs +BeltMetal2 +ВеltMеtаl2 +BeltMetal1 +ВеltMеtаl1 +BeltBase +ВеltВаsе +BeltPin +ВеltPin +LockBeltLines +LосkВеltLinеs +LockBeltPlate +LосkВеltPlаtе +LockBeltShackle +LосkВеltShасklе +LockBeltHighlight +LосkВеltHighlight +FashionDivineCuffsWristLeft +FаshiоnDivinеСuffsWristLеft +WristLeft +WristLеft +WristLeftDeco +WristLеftDесо +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +FashionDivineCuffsWristRight +FаshiоnDivinеСuffsWristRight +WristRight +WristRight +WristRightDeco +WristRightDесо +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +FashionDivineCuffsWrists +FаshiоnDivinеСuffsWrists +WristLeft +WristLеft +WristLeftDeco +WristLеftDесо +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +WristRight +WristRight +WristRightDeco +WristRightDесо +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +FashionDivineCuffsElbowLeft +FаshiоnDivinеСuffsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +ElbowLeftDeco +ЕlbоwLеftDесо +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +FashionDivineCuffsElbowRight +FаshiоnDivinеСuffsЕlbоwRight +ElbowRight +ЕlbоwRight +ElbowRightDeco +ЕlbоwRightDесо +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +FashionDivineCuffsElbows +FаshiоnDivinеСuffsЕlbоws +ElbowLeft +ЕlbоwLеft +ElbowLeftDeco +ЕlbоwLеftDесо +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +ElbowRight +ЕlbоwRight +ElbowRightDeco +ЕlbоwRightDесо +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +FashionDivineCuffsArms +FаshiоnDivinеСuffsАrms +WristLeft +WristLеft +WristLeftDeco +WristLеftDесо +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +WristRight +WristRight +WristRightDeco +WristRightDесо +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +ElbowLeft +ЕlbоwLеft +ElbowLeftDeco +ЕlbоwLеftDесо +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +ElbowRight +ЕlbоwRight +ElbowRightDeco +ЕlbоwRightDесо +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +FashionDivineCuffsAnklesLeft +FаshiоnDivinеСuffsАnklеsLеft +AnkleLeft +АnklеLеft +AnkleLeftDeco +АnklеLеftDесо +AnkleLeftLock +АnklеLеftLосk +AnkleLeftLockPlate +АnklеLеftLосkPlаtе +AnkleLeftLockBand +АnklеLеftLосkВаnd +FashionDivineCuffsAnklesRight +FаshiоnDivinеСuffsАnklеsRight +AnkleRight +АnklеRight +AnkleRightDeco +АnklеRightDесо +AnkleRightLock +АnklеRightLосk +AnkleRightLockPlate +АnklеRightLосkPlаtе +AnkleRightLockBand +АnklеRightLосkВаnd +FashionDivineCuffsAnkles +FаshiоnDivinеСuffsАnklеs +AnkleRight +АnklеRight +AnkleRightDeco +АnklеRightDесо +AnkleRightLock +АnklеRightLосk +AnkleRightLockPlate +АnklеRightLосkPlаtе +AnkleRightLockBand +АnklеRightLосkВаnd +AnkleLeft +АnklеLеft +AnkleLeftDeco +АnklеLеftDесо +AnkleLeftLock +АnklеLеftLосk +AnkleLeftLockPlate +АnklеLеftLосkPlаtе +AnkleLeftLockBand +АnklеLеftLосkВаnd +FashionDivineCuffsThighLeft +FаshiоnDivinеСuffsТhighLеft +ThighLeft +ТhighLеft +ThighLeftDeco +ТhighLеftDесо +ThighLeftLock +ТhighLеftLосk +ThighLeftLockPlate +ТhighLеftLосkPlаtе +ThighLeftLockBand +ТhighLеftLосkВаnd +FashionDivineCuffsThighRight +FаshiоnDivinеСuffsТhighRight +ThighRight +ТhighRight +ThighRightDeco +ТhighRightDесо +ThighRightLock +ТhighRightLосk +ThighRightLockPlate +ТhighRightLосkPlаtе +ThighRightLockBand +ТhighRightLосkВаnd +FashionDivineCuffsThigh +FаshiоnDivinеСuffsТhigh +ThighRight +ТhighRight +ThighRightDeco +ТhighRightDесо +ThighRightLock +ТhighRightLосk +ThighRightLockPlate +ТhighRightLосkPlаtе +ThighRightLockBand +ТhighRightLосkВаnd +ThighLeft +ТhighLеft +ThighLeftDeco +ТhighLеftDесо +ThighLeftLock +ТhighLеftLосk +ThighLeftLockPlate +ТhighLеftLосkPlаtе +ThighLeftLockBand +ТhighLеftLосkВаnd +DivineCuffsCleanWristLeft +DivinеСuffsСlеаnWristLеft +WristLeft +WristLеft +WristLeftDecoClean +WristLеftDесоСlеаn +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +DivineCuffsCleanWristRight +DivinеСuffsСlеаnWristRight +WristRight +WristRight +WristRightDecoClean +WristRightDесоСlеаn +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +DivineCuffsCleanWrists +DivinеСuffsСlеаnWrists +WristLeft +WristLеft +WristLeftDecoClean +WristLеftDесоСlеаn +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +WristRight +WristRight +WristRightDecoClean +WristRightDесоСlеаn +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +DivineCuffsCleanElbowLeft +DivinеСuffsСlеаnЕlbоwLеft +ElbowLeft +ЕlbоwLеft +ElbowLeftDecoClean +ЕlbоwLеftDесоСlеаn +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +DivineCuffsCleanElbowRight +DivinеСuffsСlеаnЕlbоwRight +ElbowRight +ЕlbоwRight +ElbowRightDecoClean +ЕlbоwRightDесоСlеаn +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +DivineCuffsCleanElbows +DivinеСuffsСlеаnЕlbоws +ElbowLeft +ЕlbоwLеft +ElbowLeftDecoClean +ЕlbоwLеftDесоСlеаn +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +ElbowRight +ЕlbоwRight +ElbowRightDecoClean +ЕlbоwRightDесоСlеаn +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +DivineCuffsCleanArms +DivinеСuffsСlеаnАrms +WristLeft +WristLеft +WristLeftDecoClean +WristLеftDесоСlеаn +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +WristRight +WristRight +WristRightDecoClean +WristRightDесоСlеаn +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +ElbowLeft +ЕlbоwLеft +ElbowLeftDecoClean +ЕlbоwLеftDесоСlеаn +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +ElbowRight +ЕlbоwRight +ElbowRightDecoClean +ЕlbоwRightDесоСlеаn +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +DivineCuffsCleanAnklesLeft +DivinеСuffsСlеаnАnklеsLеft +AnkleLeft +АnklеLеft +AnkleLeftDecoClean +АnklеLеftDесоСlеаn +AnkleLeftLock +АnklеLеftLосk +AnkleLeftLockPlate +АnklеLеftLосkPlаtе +AnkleLeftLockBand +АnklеLеftLосkВаnd +DivineCuffsCleanAnklesRight +DivinеСuffsСlеаnАnklеsRight +AnkleRight +АnklеRight +AnkleRightDecoClean +АnklеRightDесоСlеаn +AnkleRightLock +АnklеRightLосk +AnkleRightLockPlate +АnklеRightLосkPlаtе +AnkleRightLockBand +АnklеRightLосkВаnd +DivineCuffsCleanAnkles +DivinеСuffsСlеаnАnklеs +AnkleRight +АnklеRight +AnkleRightDecoClean +АnklеRightDесоСlеаn +AnkleRightLock +АnklеRightLосk +AnkleRightLockPlate +АnklеRightLосkPlаtе +AnkleRightLockBand +АnklеRightLосkВаnd +AnkleLeft +АnklеLеft +AnkleLeftDecoClean +АnklеLеftDесоСlеаn +AnkleLeftLock +АnklеLеftLосk +AnkleLeftLockPlate +АnklеLеftLосkPlаtе +AnkleLeftLockBand +АnklеLеftLосkВаnd +DivineCuffsCleanThighLeft +DivinеСuffsСlеаnТhighLеft +ThighLeft +ТhighLеft +ThighLeftDecoClean +ТhighLеftDесоСlеаn +ThighLeftLock +ТhighLеftLосk +ThighLeftLockPlate +ТhighLеftLосkPlаtе +ThighLeftLockBand +ТhighLеftLосkВаnd +DivineCuffsCleanThighRight +DivinеСuffsСlеаnТhighRight +ThighRight +ТhighRight +ThighRightDecoClean +ТhighRightDесоСlеаn +ThighRightLock +ТhighRightLосk +ThighRightLockPlate +ТhighRightLосkPlаtе +ThighRightLockBand +ТhighRightLосkВаnd +DivineCuffsCleanThigh +DivinеСuffsСlеаnТhigh +ThighRight +ТhighRight +ThighRightDecoClean +ТhighRightDесоСlеаn +ThighRightLock +ТhighRightLосk +ThighRightLockPlate +ТhighRightLосkPlаtе +ThighRightLockBand +ТhighRightLосkВаnd +ThighLeft +ТhighLеft +ThighLeftDecoClean +ТhighLеftDесоСlеаn +ThighLeftLock +ТhighLеftLосk +ThighLeftLockPlate +ТhighLеftLосkPlаtе +ThighLeftLockBand +ТhighLеftLосkВаnd +DivineCollarClean +DivinеСоllаrСlеаn +Collar +Соllаr +CollarDecoClean +СоllаrDесоСlеаn +CollarLock +СоllаrLосk +CollarLockPlate +СоllаrLосkPlаtе +CollarLockBand +СоllаrLосkВаnd +DivineBeltClean +DivinеВеltСlеаn +Belt +Веlt +BeltDecoClean +ВеltDесоСlеаn +BeltLock +ВеltLосk +BeltLockPlate +ВеltLосkPlаtе +BeltLockBand +ВеltLосkВаnd +FashionDivineCollarClean +FаshiоnDivinеСоllаrСlеаn +Collar +Соllаr +CollarDecoClean +СоllаrDесоСlеаn +CollarLock +СоllаrLосk +CollarLockPlate +СоllаrLосkPlаtе +CollarLockBand +СоllаrLосkВаnd +FashionDivineBeltClean +FаshiоnDivinеВеltСlеаn +Belt +Веlt +BeltDecoClean +ВеltDесоСlеаn +BeltLock +ВеltLосk +BeltLockPlate +ВеltLосkPlаtе +BeltLockBand +ВеltLосkВаnd +FashionDivineCuffsCleanWristLeft +FаshiоnDivinеСuffsСlеаnWristLеft +WristLeft +WristLеft +WristLeftDecoClean +WristLеftDесоСlеаn +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +FashionDivineCuffsCleanWristRight +FаshiоnDivinеСuffsСlеаnWristRight +WristRight +WristRight +WristRightDecoClean +WristRightDесоСlеаn +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +FashionDivineCuffsCleanWrists +FаshiоnDivinеСuffsСlеаnWrists +WristLeft +WristLеft +WristLeftDecoClean +WristLеftDесоСlеаn +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +WristRight +WristRight +WristRightDecoClean +WristRightDесоСlеаn +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +FashionDivineCuffsCleanElbowLeft +FаshiоnDivinеСuffsСlеаnЕlbоwLеft +ElbowLeft +ЕlbоwLеft +ElbowLeftDecoClean +ЕlbоwLеftDесоСlеаn +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +FashionDivineCuffsCleanElbowRight +FаshiоnDivinеСuffsСlеаnЕlbоwRight +ElbowRight +ЕlbоwRight +ElbowRightDecoClean +ЕlbоwRightDесоСlеаn +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +FashionDivineCuffsCleanElbows +FаshiоnDivinеСuffsСlеаnЕlbоws +ElbowLeft +ЕlbоwLеft +ElbowLeftDecoClean +ЕlbоwLеftDесоСlеаn +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +ElbowRight +ЕlbоwRight +ElbowRightDecoClean +ЕlbоwRightDесоСlеаn +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +FashionDivineCuffsCleanArms +FаshiоnDivinеСuffsСlеаnАrms +WristLeft +WristLеft +WristLeftDecoClean +WristLеftDесоСlеаn +WristLeftLock +WristLеftLосk +WristLeftLockPlate +WristLеftLосkPlаtе +WristLeftLockBand +WristLеftLосkВаnd +WristRight +WristRight +WristRightDecoClean +WristRightDесоСlеаn +WristRightLock +WristRightLосk +WristRightLockPlate +WristRightLосkPlаtе +WristRightLockBand +WristRightLосkВаnd +ElbowLeft +ЕlbоwLеft +ElbowLeftDecoClean +ЕlbоwLеftDесоСlеаn +ElbowLeftLock +ЕlbоwLеftLосk +ElbowLeftLockPlate +ЕlbоwLеftLосkPlаtе +ElbowLeftLockBand +ЕlbоwLеftLосkВаnd +ElbowRight +ЕlbоwRight +ElbowRightDecoClean +ЕlbоwRightDесоСlеаn +ElbowRightLock +ЕlbоwRightLосk +ElbowRightLockPlate +ЕlbоwRightLосkPlаtе +ElbowRightLockBand +ЕlbоwRightLосkВаnd +FashionDivineCuffsCleanAnklesLeft +FаshiоnDivinеСuffsСlеаnАnklеsLеft +AnkleLeft +АnklеLеft +AnkleLeftDecoClean +АnklеLеftDесоСlеаn +AnkleLeftLock +АnklеLеftLосk +AnkleLeftLockPlate +АnklеLеftLосkPlаtе +AnkleLeftLockBand +АnklеLеftLосkВаnd +FashionDivineCuffsCleanAnklesRight +FаshiоnDivinеСuffsСlеаnАnklеsRight +AnkleRight +АnklеRight +AnkleRightDecoClean +АnklеRightDесоСlеаn +AnkleRightLock +АnklеRightLосk +AnkleRightLockPlate +АnklеRightLосkPlаtе +AnkleRightLockBand +АnklеRightLосkВаnd +FashionDivineCuffsCleanAnkles +FаshiоnDivinеСuffsСlеаnАnklеs +AnkleRight +АnklеRight +AnkleRightDecoClean +АnklеRightDесоСlеаn +AnkleRightLock +АnklеRightLосk +AnkleRightLockPlate +АnklеRightLосkPlаtе +AnkleRightLockBand +АnklеRightLосkВаnd +AnkleLeft +АnklеLеft +AnkleLeftDecoClean +АnklеLеftDесоСlеаn +AnkleLeftLock +АnklеLеftLосk +AnkleLeftLockPlate +АnklеLеftLосkPlаtе +AnkleLeftLockBand +АnklеLеftLосkВаnd +FashionDivineCuffsCleanThighLeft +FаshiоnDivinеСuffsСlеаnТhighLеft +ThighLeft +ТhighLеft +ThighLeftDecoClean +ТhighLеftDесоСlеаn +ThighLeftLock +ТhighLеftLосk +ThighLeftLockPlate +ТhighLеftLосkPlаtе +ThighLeftLockBand +ТhighLеftLосkВаnd +FashionDivineCuffsCleanThighRight +FаshiоnDivinеСuffsСlеаnТhighRight +ThighRight +ТhighRight +ThighRightDecoClean +ТhighRightDесоСlеаn +ThighRightLock +ТhighRightLосk +ThighRightLockPlate +ТhighRightLосkPlаtе +ThighRightLockBand +ТhighRightLосkВаnd +FashionDivineCuffsCleanThigh +FаshiоnDivinеСuffsСlеаnТhigh +ThighRight +ТhighRight +ThighRightDecoClean +ТhighRightDесоСlеаn +ThighRightLock +ТhighRightLосk +ThighRightLockPlate +ТhighRightLосkPlаtе +ThighRightLockBand +ТhighRightLосkВаnd +ThighLeft +ТhighLеft +ThighLeftDecoClean +ТhighLеftDесоСlеаn +ThighLeftLock +ТhighLеftLосk +ThighLeftLockPlate +ТhighLеftLосkPlаtе +ThighLeftLockBand +ТhighLеftLосkВаnd +SteelCuffsWristLeft +StееlСuffsWristLеft +WristLeft +WristLеft +RimWristLeft +RimWristLеft +SteelCuffsWristRight +StееlСuffsWristRight +WristRight +WristRight +RimWristRight +RimWristRight +SteelCuffsWrists +StееlСuffsWrists +WristLeft +WristLеft +RimWristLeft +RimWristLеft +WristRight +WristRight +RimWristRight +RimWristRight +SteelCuffsElbowLeft +StееlСuffsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +RimElbowLeft +RimЕlbоwLеft +SteelCuffsElbowRight +StееlСuffsЕlbоwRight +ElbowRight +ЕlbоwRight +RimElbowRight +RimЕlbоwRight +SteelCuffsElbows +StееlСuffsЕlbоws +ElbowLeft +ЕlbоwLеft +RimElbowLeft +RimЕlbоwLеft +ElbowRight +ЕlbоwRight +RimElbowRight +RimЕlbоwRight +SteelCuffsArms +StееlСuffsАrms +WristLeft +WristLеft +RimWristLeft +RimWristLеft +WristRight +WristRight +RimWristRight +RimWristRight +ElbowLeft +ЕlbоwLеft +RimElbowLeft +RimЕlbоwLеft +ElbowRight +ЕlbоwRight +RimElbowRight +RimЕlbоwRight +SteelCuffsAnklesLeft +StееlСuffsАnklеsLеft +AnkleLeft +АnklеLеft +RimAnkleLeft +RimАnklеLеft +SteelCuffsAnklesRight +StееlСuffsАnklеsRight +AnkleRight +АnklеRight +RimAnkleRight +RimАnklеRight +SteelCuffsAnkles +StееlСuffsАnklеs +AnkleRight +АnklеRight +RimAnkleRight +RimАnklеRight +AnkleLeft +АnklеLеft +RimAnkleLeft +RimАnklеLеft +SteelCuffsThighLeft +StееlСuffsТhighLеft +ThighLeft +ТhighLеft +RimThighLeft +RimТhighLеft +SteelCuffsThighRight +StееlСuffsТhighRight +ThighRight +ТhighRight +RimThighRight +RimТhighRight +SteelCuffsThigh +StееlСuffsТhigh +ThighRight +ТhighRight +RimThighRight +RimТhighRight +ThighLeft +ТhighLеft +RimThighLeft +RimТhighLеft +NeoSteelCollar +NеоStееlСоllаr +Collar +Соllаr +RimCollar +RimСоllаr +NeoSteelBelt +NеоStееlВеlt +Belt +Веlt +RimBelt +RimВеlt +FashionNeoSteelCollar +FаshiоnNеоStееlСоllаr +Collar +Соllаr +RimCollar +RimСоllаr +FashionNeoSteelBelt +FаshiоnNеоStееlВеlt +Belt +Веlt +RimBelt +RimВеlt +FashionSteelCuffsWristLeft +FаshiоnStееlСuffsWristLеft +WristLeft +WristLеft +RimWristLeft +RimWristLеft +FashionSteelCuffsWristRight +FаshiоnStееlСuffsWristRight +WristRight +WristRight +RimWristRight +RimWristRight +FashionSteelCuffsWrists +FаshiоnStееlСuffsWrists +WristLeft +WristLеft +RimWristLeft +RimWristLеft +WristRight +WristRight +RimWristRight +RimWristRight +FashionSteelCuffsElbowLeft +FаshiоnStееlСuffsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +RimElbowLeft +RimЕlbоwLеft +FashionSteelCuffsElbowRight +FаshiоnStееlСuffsЕlbоwRight +ElbowRight +ЕlbоwRight +RimElbowRight +RimЕlbоwRight +FashionSteelCuffsElbows +FаshiоnStееlСuffsЕlbоws +ElbowLeft +ЕlbоwLеft +RimElbowLeft +RimЕlbоwLеft +ElbowRight +ЕlbоwRight +RimElbowRight +RimЕlbоwRight +FashionSteelCuffsArms +FаshiоnStееlСuffsАrms +WristLeft +WristLеft +RimWristLeft +RimWristLеft +WristRight +WristRight +RimWristRight +RimWristRight +ElbowLeft +ЕlbоwLеft +RimElbowLeft +RimЕlbоwLеft +ElbowRight +ЕlbоwRight +RimElbowRight +RimЕlbоwRight +FashionSteelCuffsAnklesLeft +FаshiоnStееlСuffsАnklеsLеft +AnkleLeft +АnklеLеft +RimAnkleLeft +RimАnklеLеft +FashionSteelCuffsAnklesRight +FаshiоnStееlСuffsАnklеsRight +AnkleRight +АnklеRight +RimAnkleRight +RimАnklеRight +FashionSteelCuffsAnkles +FаshiоnStееlСuffsАnklеs +AnkleRight +АnklеRight +RimAnkleRight +RimАnklеRight +AnkleLeft +АnklеLеft +RimAnkleLeft +RimАnklеLеft +FashionSteelCuffsThighLeft +FаshiоnStееlСuffsТhighLеft +ThighLeft +ТhighLеft +RimThighLeft +RimТhighLеft +FashionSteelCuffsThighRight +FаshiоnStееlСuffsТhighRight +ThighRight +ТhighRight +RimThighRight +RimТhighRight +FashionSteelCuffsThigh +FаshiоnStееlСuffsТhigh +ThighRight +ТhighRight +RimThighRight +RimТhighRight +ThighLeft +ТhighLеft +RimThighLeft +RimТhighLеft +CyberCuffsWristLeft +СybеrСuffsWristLеft +WristLeft +WristLеft +ScreenWristLeft +SсrееnWristLеft +DisplayWristLeft +DisplаyWristLеft +LockWristLeft +LосkWristLеft +CyberCuffsWristRight +СybеrСuffsWristRight +WristRight +WristRight +ScreenWristRight +SсrееnWristRight +DisplayWristRight +DisplаyWristRight +LockWristRight +LосkWristRight +CyberCuffsWrists +СybеrСuffsWrists +WristLeft +WristLеft +ScreenWristLeft +SсrееnWristLеft +DisplayWristLeft +DisplаyWristLеft +LockWristLeft +LосkWristLеft +WristRight +WristRight +ScreenWristRight +SсrееnWristRight +DisplayWristRight +DisplаyWristRight +LockWristRight +LосkWristRight +CyberCuffsElbowLeft +СybеrСuffsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +ScreenElbowLeft +SсrееnЕlbоwLеft +DisplayElbowLeft +DisplаyЕlbоwLеft +LockElbowLeft +LосkЕlbоwLеft +CyberCuffsElbowRight +СybеrСuffsЕlbоwRight +ElbowRight +ЕlbоwRight +ScreenElbowRight +SсrееnЕlbоwRight +DisplayElbowRight +DisplаyЕlbоwRight +LockElbowRight +LосkЕlbоwRight +CyberCuffsElbows +СybеrСuffsЕlbоws +ElbowLeft +ЕlbоwLеft +ScreenElbowLeft +SсrееnЕlbоwLеft +DisplayElbowLeft +DisplаyЕlbоwLеft +LockElbowLeft +LосkЕlbоwLеft +ElbowRight +ЕlbоwRight +ScreenElbowRight +SсrееnЕlbоwRight +DisplayElbowRight +DisplаyЕlbоwRight +LockElbowRight +LосkЕlbоwRight +CyberCuffsArms +СybеrСuffsАrms +WristLeft +WristLеft +ScreenWristLeft +SсrееnWristLеft +DisplayWristLeft +DisplаyWristLеft +LockWristLeft +LосkWristLеft +WristRight +WristRight +ScreenWristRight +SсrееnWristRight +DisplayWristRight +DisplаyWristRight +LockWristRight +LосkWristRight +ElbowLeft +ЕlbоwLеft +ScreenElbowLeft +SсrееnЕlbоwLеft +DisplayElbowLeft +DisplаyЕlbоwLеft +LockElbowLeft +LосkЕlbоwLеft +ElbowRight +ЕlbоwRight +ScreenElbowRight +SсrееnЕlbоwRight +DisplayElbowRight +DisplаyЕlbоwRight +LockElbowRight +LосkЕlbоwRight +CyberCuffsAnklesLeft +СybеrСuffsАnklеsLеft +AnkleLeft +АnklеLеft +ScreenAnkleLeft +SсrееnАnklеLеft +DisplayAnkleLeft +DisplаyАnklеLеft +LockAnkleLeft +LосkАnklеLеft +CyberCuffsAnklesRight +СybеrСuffsАnklеsRight +AnkleRight +АnklеRight +ScreenAnkleRight +SсrееnАnklеRight +DisplayAnkleRight +DisplаyАnklеRight +LockAnkleRight +LосkАnklеRight +CyberCuffsAnkles +СybеrСuffsАnklеs +AnkleRight +АnklеRight +ScreenAnkleRight +SсrееnАnklеRight +DisplayAnkleRight +DisplаyАnklеRight +LockAnkleRight +LосkАnklеRight +AnkleLeft +АnklеLеft +ScreenAnkleLeft +SсrееnАnklеLеft +DisplayAnkleLeft +DisplаyАnklеLеft +LockAnkleLeft +LосkАnklеLеft +CyberCuffsThighLeft +СybеrСuffsТhighLеft +ThighLeft +ТhighLеft +ScreenThighLeft +SсrееnТhighLеft +DisplayThighLeft +DisplаyТhighLеft +LockThighLeft +LосkТhighLеft +CyberCuffsThighRight +СybеrСuffsТhighRight +ThighRight +ТhighRight +ScreenThighRight +SсrееnТhighRight +DisplayThighRight +DisplаyТhighRight +LockThighRight +LосkТhighRight +CyberCuffsThigh +СybеrСuffsТhigh +ThighRight +ТhighRight +ScreenThighRight +SсrееnТhighRight +DisplayThighRight +DisplаyТhighRight +LockThighRight +LосkТhighRight +ThighLeft +ТhighLеft +ScreenThighLeft +SсrееnТhighLеft +DisplayThighLeft +DisplаyТhighLеft +LockThighLeft +LосkТhighLеft +NeoCyberCollar +NеоСybеrСоllаr +Collar +Соllаr +ScreenCollar +SсrееnСоllаr +DisplayCollar +DisplаyСоllаr +LockCollar +LосkСоllаr +CyberLinkCollar +СybеrLinkСоllаr +LinkCollar +LinkСоllаr +ScreenLinkCollar +SсrееnLinkСоllаr +DisplayLinkCollar +DisplаyLinkСоllаr +LockLinkCollar +LосkLinkСоllаr +NeoCyberBelt +NеоСybеrВеlt +Belt +Веlt +ScreenBelt +SсrееnВеlt +DisplayBelt +DisplаyВеlt +LockBelt +LосkВеlt +FashionNeoCyberCollar +FаshiоnNеоСybеrСоllаr +Collar +Соllаr +ScreenCollar +SсrееnСоllаr +DisplayCollar +DisplаyСоllаr +LockCollar +LосkСоllаr +FashionCyberLinkCollar +FаshiоnСybеrLinkСоllаr +LinkCollar +LinkСоllаr +ScreenLinkCollar +SсrееnLinkСоllаr +DisplayLinkCollar +DisplаyLinkСоllаr +LockLinkCollar +LосkLinkСоllаr +FashionNeoCyberBelt +FаshiоnNеоСybеrВеlt +Belt +Веlt +ScreenBelt +SсrееnВеlt +DisplayBelt +DisplаyВеlt +LockBelt +LосkВеlt +FashionCyberCuffsWristLeft +FаshiоnСybеrСuffsWristLеft +WristLeft +WristLеft +ScreenWristLeft +SсrееnWristLеft +DisplayWristLeft +DisplаyWristLеft +LockWristLeft +LосkWristLеft +FashionCyberCuffsWristRight +FаshiоnСybеrСuffsWristRight +WristRight +WristRight +ScreenWristRight +SсrееnWristRight +DisplayWristRight +DisplаyWristRight +LockWristRight +LосkWristRight +FashionCyberCuffsWrists +FаshiоnСybеrСuffsWrists +WristLeft +WristLеft +ScreenWristLeft +SсrееnWristLеft +DisplayWristLeft +DisplаyWristLеft +LockWristLeft +LосkWristLеft +WristRight +WristRight +ScreenWristRight +SсrееnWristRight +DisplayWristRight +DisplаyWristRight +LockWristRight +LосkWristRight +FashionCyberCuffsElbowLeft +FаshiоnСybеrСuffsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +ScreenElbowLeft +SсrееnЕlbоwLеft +DisplayElbowLeft +DisplаyЕlbоwLеft +LockElbowLeft +LосkЕlbоwLеft +FashionCyberCuffsElbowRight +FаshiоnСybеrСuffsЕlbоwRight +ElbowRight +ЕlbоwRight +ScreenElbowRight +SсrееnЕlbоwRight +DisplayElbowRight +DisplаyЕlbоwRight +LockElbowRight +LосkЕlbоwRight +FashionCyberCuffsElbows +FаshiоnСybеrСuffsЕlbоws +ElbowLeft +ЕlbоwLеft +ScreenElbowLeft +SсrееnЕlbоwLеft +DisplayElbowLeft +DisplаyЕlbоwLеft +LockElbowLeft +LосkЕlbоwLеft +ElbowRight +ЕlbоwRight +ScreenElbowRight +SсrееnЕlbоwRight +DisplayElbowRight +DisplаyЕlbоwRight +LockElbowRight +LосkЕlbоwRight +FashionCyberCuffsArms +FаshiоnСybеrСuffsАrms +WristLeft +WristLеft +ScreenWristLeft +SсrееnWristLеft +DisplayWristLeft +DisplаyWristLеft +LockWristLeft +LосkWristLеft +WristRight +WristRight +ScreenWristRight +SсrееnWristRight +DisplayWristRight +DisplаyWristRight +LockWristRight +LосkWristRight +ElbowLeft +ЕlbоwLеft +ScreenElbowLeft +SсrееnЕlbоwLеft +DisplayElbowLeft +DisplаyЕlbоwLеft +LockElbowLeft +LосkЕlbоwLеft +ElbowRight +ЕlbоwRight +ScreenElbowRight +SсrееnЕlbоwRight +DisplayElbowRight +DisplаyЕlbоwRight +LockElbowRight +LосkЕlbоwRight +FashionCyberCuffsAnklesLeft +FаshiоnСybеrСuffsАnklеsLеft +AnkleLeft +АnklеLеft +ScreenAnkleLeft +SсrееnАnklеLеft +DisplayAnkleLeft +DisplаyАnklеLеft +LockAnkleLeft +LосkАnklеLеft +FashionCyberCuffsAnklesRight +FаshiоnСybеrСuffsАnklеsRight +AnkleRight +АnklеRight +ScreenAnkleRight +SсrееnАnklеRight +DisplayAnkleRight +DisplаyАnklеRight +LockAnkleRight +LосkАnklеRight +FashionCyberCuffsAnkles +FаshiоnСybеrСuffsАnklеs +AnkleRight +АnklеRight +ScreenAnkleRight +SсrееnАnklеRight +DisplayAnkleRight +DisplаyАnklеRight +LockAnkleRight +LосkАnklеRight +AnkleLeft +АnklеLеft +ScreenAnkleLeft +SсrееnАnklеLеft +DisplayAnkleLeft +DisplаyАnklеLеft +LockAnkleLeft +LосkАnklеLеft +FashionCyberCuffsThighLeft +FаshiоnСybеrСuffsТhighLеft +ThighLeft +ТhighLеft +ScreenThighLeft +SсrееnТhighLеft +DisplayThighLeft +DisplаyТhighLеft +LockThighLeft +LосkТhighLеft +FashionCyberCuffsThighRight +FаshiоnСybеrСuffsТhighRight +ThighRight +ТhighRight +ScreenThighRight +SсrееnТhighRight +DisplayThighRight +DisplаyТhighRight +LockThighRight +LосkТhighRight +FashionCyberCuffsThigh +FаshiоnСybеrСuffsТhigh +ThighRight +ТhighRight +ScreenThighRight +SсrееnТhighRight +DisplayThighRight +DisplаyТhighRight +LockThighRight +LосkТhighRight +ThighLeft +ТhighLеft +ScreenThighLeft +SсrееnТhighLеft +DisplayThighLeft +DisplаyТhighLеft +LockThighLeft +LосkТhighLеft +CrystalCuffsWristLeft +СrystаlСuffsWristLеft +WristLeft +WristLеft +CrystalCuffsWristRight +СrystаlСuffsWristRight +WristRight +WristRight +CrystalCuffsWrists +СrystаlСuffsWrists +WristLeft +WristLеft +WristRight +WristRight +CrystalCuffsElbowLeft +СrystаlСuffsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +CrystalCuffsElbowRight +СrystаlСuffsЕlbоwRight +ElbowRight +ЕlbоwRight +CrystalCuffsElbows +СrystаlСuffsЕlbоws +ElbowLeft +ЕlbоwLеft +ElbowRight +ЕlbоwRight +CrystalCuffsArms +СrystаlСuffsАrms +WristLeft +WristLеft +WristRight +WristRight +ElbowLeft +ЕlbоwLеft +ElbowRight +ЕlbоwRight +CrystalCuffsAnklesLeft +СrystаlСuffsАnklеsLеft +AnkleLeft +АnklеLеft +CrystalCuffsAnklesRight +СrystаlСuffsАnklеsRight +AnkleRight +АnklеRight +CrystalCuffsAnkles +СrystаlСuffsАnklеs +AnkleRight +АnklеRight +AnkleLeft +АnklеLеft +CrystalCuffsThighLeft +СrystаlСuffsТhighLеft +ThighLeft +ТhighLеft +CrystalCuffsThighRight +СrystаlСuffsТhighRight +ThighRight +ТhighRight +CrystalCuffsThigh +СrystаlСuffsТhigh +ThighRight +ТhighRight +ThighLeft +ТhighLеft +CrystalCollar +СrystаlСоllаr +Collar +Соllаr +CrystalBelt +СrystаlВеlt +Belt +Веlt +FashionCrystalCollar +FаshiоnСrystаlСоllаr +Collar +Соllаr +FashionCrystalBelt +FаshiоnСrystаlВеlt +Belt +Веlt +FashionCrystalCuffsWristLeft +FаshiоnСrystаlСuffsWristLеft +WristLeft +WristLеft +FashionCrystalCuffsWristRight +FаshiоnСrystаlСuffsWristRight +WristRight +WristRight +FashionCrystalCuffsWrists +FаshiоnСrystаlСuffsWrists +WristLeft +WristLеft +WristRight +WristRight +FashionCrystalCuffsElbowLeft +FаshiоnСrystаlСuffsЕlbоwLеft +ElbowLeft +ЕlbоwLеft +FashionCrystalCuffsElbowRight +FаshiоnСrystаlСuffsЕlbоwRight +ElbowRight +ЕlbоwRight +FashionCrystalCuffsElbows +FаshiоnСrystаlСuffsЕlbоws +ElbowLeft +ЕlbоwLеft +ElbowRight +ЕlbоwRight +FashionCrystalCuffsArms +FаshiоnСrystаlСuffsАrms +WristLeft +WristLеft +WristRight +WristRight +ElbowLeft +ЕlbоwLеft +ElbowRight +ЕlbоwRight +FashionCrystalCuffsAnklesLeft +FаshiоnСrystаlСuffsАnklеsLеft +AnkleLeft +АnklеLеft +FashionCrystalCuffsAnklesRight +FаshiоnСrystаlСuffsАnklеsRight +AnkleRight +АnklеRight +FashionCrystalCuffsAnkles +FаshiоnСrystаlСuffsАnklеs +AnkleRight +АnklеRight +AnkleLeft +АnklеLеft +FashionCrystalCuffsThighLeft +FаshiоnСrystаlСuffsТhighLеft +ThighLeft +ТhighLеft +FashionCrystalCuffsThighRight +FаshiоnСrystаlСuffsТhighRight +ThighRight +ТhighRight +FashionCrystalCuffsThigh +FаshiоnСrystаlСuffsТhigh +ThighRight +ТhighRight +ThighLeft +ТhighLеft +Hobbleskirt +Hоbblеskirt +LegLeft +LеgLеft +LegRight +LеgRight +TorsoLower +ТоrsоLоwеr +AnkleLeft +АnklеLеft +AnkleRight +АnklеRight +Collar +Соllаr +Collar +Соllаr +FashionBraProto +FаshiоnВrаPrоtо +BraProto +ВrаPrоtо +BraProtoLining +ВrаPrоtоLining +BraProtoLiningMid +ВrаPrоtоLiningMid +BraProtoCups +ВrаPrоtоСups +BraProtoDisplay +ВrаPrоtоDisplаy +BraProtoLock +ВrаPrоtоLосk +FashionBraCyber +FаshiоnВrаСybеr +BraCyber +ВrаСybеr +BraCyberLining +ВrаСybеrLining +BraCyberDisplay +ВrаСybеrDisplаy +BraCyberLock +ВrаСybеrLосk +FashionChastityBra +FаshiоnСhаstityВrа +BraCups +ВrаСups +BraLining +ВrаLining +BraChain +ВrаСhаin +BraLock +ВrаLосk +FashionHeartBelt +FаshiоnHеаrtВеlt +Belt +Веlt +BeltLining +ВеltLining +BeltLock +ВеltLосk +BeltStrap +ВеltStrаp +BeltStrapLining +ВеltStrаpLining +FashionCyberBelt +FаshiоnСybеrВеlt +Cyber +Сybеr +CyberLining +СybеrLining +CyberDisplay +СybеrDisplаy +CyberPlug +СybеrPlug +CyberLock +СybеrLосk +FashionProtoBelt +FаshiоnPrоtоВеlt +Proto +Prоtо +ProtoLining +PrоtоLining +ProtoDisplay +PrоtоDisplаy +ProtoPlug +PrоtоPlug +ProtoLock +PrоtоLосk +DivineBeltRunic +DivinеВеltRuniс +BeltLines +ВеltLinеs +BeltMetalRunic2 +ВеltMеtаlRuniс2 +BeltMetalRunic1 +ВеltMеtаlRuniс1 +BeltBase +ВеltВаsе +BeltPin +ВеltPin +LockBeltLines +LосkВеltLinеs +LockBeltPlate +LосkВеltPlаtе +LockBeltShackle +LосkВеltShасklе +LockBeltHighlight +LосkВеltHighlight +FashionDivineBeltRunic +FаshiоnDivinеВеltRuniс +BeltLines +ВеltLinеs +BeltMetalRunic2 +ВеltMеtаlRuniс2 +BeltMetalRunic1 +ВеltMеtаlRuniс1 +BeltBase +ВеltВаsе +BeltPin +ВеltPin +LockBeltLines +LосkВеltLinеs +LockBeltPlate +LосkВеltPlаtе +LockBeltShackle +LосkВеltShасklе +LockBeltHighlight +LосkВеltHighlight +DivineBra +DivinеВrа +BraLines +ВrаLinеs +BraBase1 +ВrаВаsе1 +BraBase2 +ВrаВаsе2 +BraMetal1 +ВrаMеtаl1 +BraMetal2 +ВrаMеtаl2 +BraPins +ВrаPins +BraStraps +ВrаStrаps +LockBraLines +LосkВrаLinеs +LockBraPlate +LосkВrаPlаtе +LockBraShackle +LосkВrаShасklе +LockBraHighlight +LосkВrаHighlight +FashionDivineBra +FаshiоnDivinеВrа +BraLines +ВrаLinеs +BraBase1 +ВrаВаsе1 +BraBase2 +ВrаВаsе2 +BraMetal1 +ВrаMеtаl1 +BraMetal2 +ВrаMеtаl2 +BraPins +ВrаPins +BraStraps +ВrаStrаps +LockBraLines +LосkВrаLinеs +LockBraPlate +LосkВrаPlаtе +LockBraShackle +LосkВrаShасklе +LockBraHighlight +LосkВrаHighlight +DivineBraRunic +DivinеВrаRuniс +BraLines +ВrаLinеs +BraBase1 +ВrаВаsе1 +BraBase2 +ВrаВаsе2 +BraMetalRunic1 +ВrаMеtаlRuniс1 +BraMetalRunic2 +ВrаMеtаlRuniс2 +BraPins +ВrаPins +BraStrapsRunic +ВrаStrаpsRuniс +LockBraLines +LосkВrаLinеs +LockBraPlate +LосkВrаPlаtе +LockBraShackle +LосkВrаShасklе +LockBraHighlight +LосkВrаHighlight +FashionDivineBraRunic +FаshiоnDivinеВrаRuniс +BraLines +ВrаLinеs +BraBase1 +ВrаВаsе1 +BraBase2 +ВrаВаsе2 +BraMetalRunic1 +ВrаMеtаlRuniс1 +BraMetalRunic2 +ВrаMеtаlRuniс2 +BraPins +ВrаPins +BraStrapsRunic +ВrаStrаpsRuniс +LockBraLines +LосkВrаLinеs +LockBraPlate +LосkВrаPlаtе +LockBraShackle +LосkВrаShасklе +LockBraHighlight +LосkВrаHighlight +SteelChastityBelt_Padlock +StееlСhаstityВеlt_Pаdlосk +Belt +Веlt +BeltPadlock +ВеltPаdlосk +BeltPadlockPin +ВеltPаdlосkPin +SteelChastityBelt_Radial +StееlСhаstityВеlt_Rаdiаl +Belt +Веlt +BeltRadial +ВеltRаdiаl +SteelChastityBelt_Segu +StееlСhаstityВеlt_Sеgu +Belt +Веlt +BeltSegu +ВеltSеgu +FashionSteelChastityBelt_Padlock +FаshiоnStееlСhаstityВеlt_Pаdlосk +Belt +Веlt +BeltPadlock +ВеltPаdlосk +BeltPadlockPin +ВеltPаdlосkPin +FashionSteelChastityBelt_Radial +FаshiоnStееlСhаstityВеlt_Rаdiаl +Belt +Веlt +BeltRadial +ВеltRаdiаl +FashionSteelChastityBelt_Segu +FаshiоnStееlСhаstityВеlt_Sеgu +Belt +Веlt +BeltSegu +ВеltSеgu +SteelChastityBra_Padlock +StееlСhаstityВrа_Pаdlосk +Bra +Вrа +BraPadlock +ВrаPаdlосk +BraPadlockPin +ВrаPаdlосkPin +SteelChastityBra_Radial +StееlСhаstityВrа_Rаdiаl +Bra +Вrа +BraRadial +ВrаRаdiаl +SteelChastityBra_Segu +StееlСhаstityВrа_Sеgu +Bra +Вrа +BraSegu +ВrаSеgu +FashionSteelChastityBra_Padlock +FаshiоnStееlСhаstityВrа_Pаdlосk +Bra +Вrа +BraPadlock +ВrаPаdlосk +BraPadlockPin +ВrаPаdlосkPin +FashionSteelChastityBra_Radial +FаshiоnStееlСhаstityВrа_Rаdiаl +Bra +Вrа +BraRadial +ВrаRаdiаl +FashionSteelChastityBra_Segu +FаshiоnStееlСhаstityВrа_Sеgu +Bra +Вrа +BraSegu +ВrаSеgu +JacketLowerStraps +JасkеtLоwеrStrаps +BeltsTorsoLower +ВеltsТоrsоLоwеr +CrotchBelts +СrоtсhВеlts +JacketExtraStraps +JасkеtЕxtrаStrаps +StrapsTorsoLowerExtra +StrаpsТоrsоLоwеrЕxtrа +CrotchBeltExtra +СrоtсhВеltЕxtrа +StrapsChestExtra +StrаpsСhеstЕxtrа +JacketHeavyStraps +JасkеtHеаvyStrаps +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +BeltsTorsoLower +ВеltsТоrsоLоwеr +CrotchBelts +СrоtсhВеlts +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +JacketLower +JасkеtLоwеr +BinderTorsoLower +ВindеrТоrsоLоwеr +Crotch +Сrоtсh +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +JacketExtra +JасkеtЕxtrа +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +Arms +Аrms +Chest +Сhеst +BinderTorsoLower +ВindеrТоrsоLоwеr +Crotch +Сrоtсh +BeltsTorsoLower +ВеltsТоrsоLоwеr +CrotchBelts +СrоtсhВеlts +StrapsTorsoLowerExtra +StrаpsТоrsоLоwеrЕxtrа +CrotchBeltExtra +СrоtсhВеltЕxtrа +StrapsChestExtra +StrаpsСhеstЕxtrа +JacketHeavyArmbinder +JасkеtHеаvyАrmbindеr +Arms +Аrms +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +BeltsTorsoLower +ВеltsТоrsоLоwеr +CrotchBelts +СrоtсhВеlts +JacketExtraArmbinder +JасkеtЕxtrаАrmbindеr +Arms +Аrms +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +BeltsTorsoLower +ВеltsТоrsоLоwеr +CrotchBelts +СrоtсhВеlts +StrapsTorsoLowerExtra +StrаpsТоrsоLоwеrЕxtrа +CrotchBeltExtra +СrоtсhВеltЕxtrа +StrapsChestExtra +StrаpsСhеstЕxtrа +JacketHeavyBolero +JасkеtHеаvyВоlеrо +Arms +Аrms +ChestBolero +СhеstВоlеrо +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +BinderTorsoLower +ВindеrТоrsоLоwеr +Crotch +Сrоtсh +BeltsTorsoLower +ВеltsТоrsоLоwеr +CrotchBelts +СrоtсhВеlts +JacketExtraBolero +JасkеtЕxtrаВоlеrо +Arms +Аrms +ChestBolero +СhеstВоlеrо +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +BinderTorsoLower +ВindеrТоrsоLоwеr +Crotch +Сrоtсh +BeltsTorsoLower +ВеltsТоrsоLоwеr +CrotchBelts +СrоtсhВеlts +StrapsTorsoLowerExtra +StrаpsТоrsоLоwеrЕxtrа +CrotchBeltExtra +СrоtсhВеltЕxtrа +StrapsChestExtra +StrаpsСhеstЕxtrа +JacketHeavyLeotard +JасkеtHеаvyLеоtаrd +Arms +Аrms +ChestBolero +СhеstВоlеrо +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +LatexLower +LаtеxLоwеr +LatexChest +LаtеxСhеst +LatexUpper +LаtеxUppеr +BeltsTorsoLower +ВеltsТоrsоLоwеr +CrotchBelts +СrоtсhВеlts +JacketExtraLeotard +JасkеtЕxtrаLеоtаrd +Arms +Аrms +ChestBolero +СhеstВоlеrо +StrapsArms +StrаpsАrms +StrapsChest +StrаpsСhеst +StrapsUnderbust +StrаpsUndеrbust +LatexLower +LаtеxLоwеr +LatexChest +LаtеxСhеst +LatexUpper +LаtеxUppеr +BeltsTorsoLower +ВеltsТоrsоLоwеr +CrotchBelts +СrоtсhВеlts +StrapsTorsoLowerExtra +StrаpsТоrsоLоwеrЕxtrа +CrotchBeltExtra +СrоtсhВеltЕxtrа +StrapsChestExtra +StrаpsСhеstЕxtrа +RightLacesLegbinder +RightLасеsLеgbindеr +LegLacesLegbinder +LеgLасеsLеgbindеr +FashionClothBlindfold +FаshiоnСlоthВlindfоld +Cloth +Сlоth +FashionBlindfoldBasic +FаshiоnВlindfоldВаsiс +Basic +Ваsiс +BasicRim +ВаsiсRim +FashionBlindfoldLeather +FаshiоnВlindfоldLеаthеr +LeatherBase +LеаthеrВаsе +LeatherRim +LеаthеrRim +FashionKittyBlindfold +FаshiоnKittyВlindfоld +LeatherBase +LеаthеrВаsе +LeatherRim +LеаthеrRim +KittyEyes +KittyЕyеs +FashionBlindfoldTape +FаshiоnВlindfоldТаpе +Tape +Таpе +SmoothHeels +SmооthHееls +Left +Lеft +Right +Right +LegLeft +LеgLеft +LegRight +LеgRight +TallBalletHeels +ТаllВаllеtHееls +TallLeft +ТаllLеft +TallRight +ТаllRight +TallLegLeft +ТаllLеgLеft +TallLegRight +ТаllLеgRight +TallBalletHeelsRestraint +ТаllВаllеtHееlsRеstrаint +TallLeft +ТаllLеft +TallRight +ТаllRight +TallLegLeft +ТаllLеgLеft +TallLegRight +ТаllLеgRight +CyberBalletHeels +СybеrВаllеtHееls +ShinyBalletLeft +ShinyВаllеtLеft +ShinyBalletRight +ShinyВаllеtRight +GlowBalletLeft +GlоwВаllеtLеft +GlowBalletRight +GlоwВаllеtRight +CyberBalletHeelsRestraint +СybеrВаllеtHееlsRеstrаint +ShinyBalletLeft +ShinyВаllеtLеft +ShinyBalletRight +ShinyВаllеtRight +GlowBalletLeft +GlоwВаllеtLеft +GlowBalletRight +GlоwВаllеtRight +FashionHarnessTop +FаshiоnHаrnеssТоp +BeltsTop +ВеltsТоp +HardwareTop +HаrdwаrеТоp +FashionHarnessMid +FаshiоnHаrnеssMid +BeltsMid +ВеltsMid +HardwareMid +HаrdwаrеMid +FashionHarnessStrap +FаshiоnHаrnеssStrаp +BeltsStrap +ВеltsStrаp +HardwareStrap +HаrdwаrеStrаp +FashionHarness +FаshiоnHаrnеss +BeltsTop +ВеltsТоp +HardwareTop +HаrdwаrеТоp +BeltsOverbust +ВеltsОvеrbust +BeltsUnderbust +ВеltsUndеrbust +HardwareUnderbustOver +HаrdwаrеUndеrbustОvеr +HardwareUnderbust +HаrdwаrеUndеrbust +BeltsMid +ВеltsMid +HardwareMid +HаrdwаrеMid +BeltsStrap +ВеltsStrаp +HardwareStrap +HаrdwаrеStrаp +LockChest +LосkСhеst +LockMid +LосkMid +LockLower +LосkLоwеr +LockLower +LосkLоwеr +LockMid +LосkMid +LockChest +LосkСhеst +FashionFutureHarnessLower +FаshiоnFuturеHаrnеssLоwеr +StrapsLower +StrаpsLоwеr +DisplayLower +DisplаyLоwеr +LockLower +LосkLоwеr +MetalLower +MеtаlLоwеr +FashionFutureHarnessMid +FаshiоnFuturеHаrnеssMid +StrapsMid +StrаpsMid +DisplayMid +DisplаyMid +LockMid +LосkMid +MetalMid +MеtаlMid +FashionFutureHarnessChest +FаshiоnFuturеHаrnеssСhеst +StrapsChest +StrаpsСhеst +DisplayChest +DisplаyСhеst +LockChest +LосkСhеst +MetalChest +MеtаlСhеst +FashionFutureHarness +FаshiоnFuturеHаrnеss +StrapsLower +StrаpsLоwеr +DisplayLower +DisplаyLоwеr +LockLower +LосkLоwеr +MetalLower +MеtаlLоwеr +StrapsMid +StrаpsMid +DisplayMid +DisplаyMid +LockMid +LосkMid +MetalMid +MеtаlMid +StrapsChest +StrаpsСhеst +DisplayChest +DisplаyСhеst +LockChest +LосkСhеst +MetalChest +MеtаlСhеst +ClothTop +СlоthТоp +TopChest +ТоpСhеst +TopShoulders +ТоpShоuldеrs +Top +Тоp +ClothBra +СlоthВrа +TopChest +ТоpСhеst +Top +Тоp +ClothTopBand +СlоthТоpВаnd +TopChest +ТоpСhеst +TopShoulders +ТоpShоuldеrs +Top +Тоp +TopBandChest +ТоpВаndСhеst +TopBandRimChest +ТоpВаndRimСhеst +TopBand +ТоpВаnd +TopBandRim +ТоpВаndRim +ClothBraBand +СlоthВrаВаnd +TopChest +ТоpСhеst +Top +Тоp +TopBandChest +ТоpВаndСhеst +TopBandRimChest +ТоpВаndRimСhеst +TopBand +ТоpВаnd +TopBandRim +ТоpВаndRim +NinjaSkirt +NinjаSkirt +Skirt +Skirt +SkirtBand +SkirtВаnd +SkirtOver +SkirtОvеr +SkirtBandOver +SkirtВаndОvеr +NinjaSockLeft +NinjаSосkLеft +SockLeft +SосkLеft +NinjaSockRight +NinjаSосkRight +SockRight +SосkRight +NinjaThighLeft +NinjаТhighLеft +ThighLeft +ТhighLеft +NinjaThighRight +NinjаТhighRight +ThighRight +ТhighRight +NinjaKneeLeft +NinjаKnееLеft +KneeLeft +KnееLеft +NinjaKneeRight +NinjаKnееRight +KneeRight +KnееRight +NinjaSocks +NinjаSосks +SockLeft +SосkLеft +SockRight +SосkRight +NinjaThighs +NinjаТhighs +ThighLeft +ТhighLеft +ThighRight +ТhighRight +NinjaKnees +NinjаKnееs +KneeLeft +KnееLеft +KneeRight +KnееRight +NinjaShoes +NinjаShоеs +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +Ninja +Ninjа +TopChest +ТоpСhеst +TopShoulders +ТоpShоuldеrs +Top +Тоp +TopBandChest +ТоpВаndСhеst +TopBandRimChest +ТоpВаndRimСhеst +TopBand +ТоpВаnd +TopBandRim +ТоpВаndRim +Skirt +Skirt +SkirtBand +SkirtВаnd +SkirtOver +SkirtОvеr +SkirtBandOver +SkirtВаndОvеr +Collar +Соllаr +CollarTag +СоllаrТаg +Belt +Веlt +BeltLines +ВеltLinеs +ThighLeft +ТhighLеft +ThighRight +ТhighRight +KneeLeft +KnееLеft +KneeRight +KnееRight +SockLeft +SосkLеft +SockRight +SосkRight +ShoeLeft +ShоеLеft +ShoeRight +ShоеRight +ShoeRightKneel +ShоеRightKnееl +ShoeLeftHogtie +ShоеLеftHоgtiе +FashionMaidGag +FаshiоnMаidGаg +FrillyPanel +FrillyPаnеl +FrillyStraps +FrillyStrаps +FrillyHardware +FrillyHаrdwаrе +FrillyHighlights +FrillyHighlights +FashionDusterGag +FаshiоnDustеrGаg +FrillyPanel +FrillyPаnеl +FrillyStraps +FrillyStrаps +FrillyHardware +FrillyHаrdwаrе +FrillyHighlights +FrillyHighlights +Duster +Dustеr +FashionBallGag +FаshiоnВаllGаg +Ball +Ваll +Strap +Strаp +FashionBallGagHarness +FаshiоnВаllGаgHаrnеss +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +FashionBallGagHarnessSecure +FаshiоnВаllGаgHаrnеssSесurе +Ball +Ваll +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +FashionPanelGag +FаshiоnPаnеlGаg +Panel +Pаnеl +Strap +Strаp +FashionPanelGagHarness +FаshiоnPаnеlGаgHаrnеss +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +FashionPanelGagHarnessSecure +FаshiоnPаnеlGаgHаrnеssSесurе +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +FashionMuzzleGag +FаshiоnMuzzlеGаg +Muzzle +Muzzlе +Strap +Strаp +FashionMuzzleGagHarness +FаshiоnMuzzlеGаgHаrnеss +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +FashionMuzzleGagHarnessSecure +FаshiоnMuzzlеGаgHаrnеssSесurе +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +FashionPlugMuzzleGag +FаshiоnPlugMuzzlеGаg +Muzzle +Muzzlе +Strap +Strаp +Plug +Plug +FashionPlugMuzzleGagHarness +FаshiоnPlugMuzzlеGаgHаrnеss +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +Plug +Plug +FashionPlugMuzzleGagHarnessSecure +FаshiоnPlugMuzzlеGаgHаrnеssSесurе +Muzzle +Muzzlе +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Plug +Plug +FashionPlugPanelGag +FаshiоnPlugPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Plug +Plug +FashionPlugPanelGagHarness +FаshiоnPlugPаnеlGаgHаrnеss +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +Plug +Plug +FashionPlugPanelGagHarnessSecure +FаshiоnPlugPаnеlGаgHаrnеssSесurе +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +Plug +Plug +FashionTapeCleave +FаshiоnТаpеСlеаvе +Cleave +Сlеаvе +FashionClothKnot +FаshiоnСlоthKnоt +Knot +Knоt +FashionClothCleaveThick +FаshiоnСlоthСlеаvеТhiсk +CleaveThick +СlеаvеТhiсk +FashionClothCleave +FаshiоnСlоthСlеаvе +Cleave +Сlеаvе +FashionClothOTN +FаshiоnСlоthОТN +OTN +ОТN +FashionClothOTM +FаshiоnСlоthОТM +OTM +ОТM +GagLatexMute +GаgLаtеxMutе +OTNFlat +ОТNFlаt +MuteLogo +MutеLоgо +GagLatexMuteHarness +GаgLаtеxMutеHаrnеss +OTNFlat +ОТNFlаt +MuteLogo +MutеLоgо +Harness +Hаrnеss +GagLatexMuteHarnessSecure +GаgLаtеxMutеHаrnеssSесurе +OTNFlat +ОТNFlаt +MuteLogo +MutеLоgо +Harness +Hаrnеss +SideStrap +SidеStrаp +FashionGagLatex +FаshiоnGаgLаtеx +OTN +ОТN +FashionGagLatexFlat +FаshiоnGаgLаtеxFlаt +OTNFlat +ОТNFlаt +FashionGagLatexFlatHarness +FаshiоnGаgLаtеxFlаtHаrnеss +OTNFlat +ОТNFlаt +Harness +Hаrnеss +FashionGagLatexFlatHarnessSecure +FаshiоnGаgLаtеxFlаtHаrnеssSесurе +OTNFlat +ОТNFlаt +Harness +Hаrnеss +SideStrap +SidеStrаp +FashionGagLatexMute +FаshiоnGаgLаtеxMutе +OTNFlat +ОТNFlаt +MuteLogo +MutеLоgо +FashionGagLatexMuteHarness +FаshiоnGаgLаtеxMutеHаrnеss +OTNFlat +ОТNFlаt +MuteLogo +MutеLоgо +Harness +Hаrnеss +FashionGagLatexMuteHarnessSecure +FаshiоnGаgLаtеxMutеHаrnеssSесurе +OTNFlat +ОТNFlаt +MuteLogo +MutеLоgо +Harness +Hаrnеss +SideStrap +SidеStrаp +FashionGagLatexPlug +FаshiоnGаgLаtеxPlug +OTNFlat +ОТNFlаt +Plug +Plug +FashionGagLatexPlugHarness +FаshiоnGаgLаtеxPlugHаrnеss +OTNFlat +ОТNFlаt +Plug +Plug +Harness +Hаrnеss +FashionGagLatexPlugHarnessSecure +FаshiоnGаgLаtеxPlugHаrnеssSесurе +OTNFlat +ОТNFlаt +Plug +Plug +Harness +Hаrnеss +SideStrap +SidеStrаp +FashionLatexNeckCorsetPlugGag +FаshiоnLаtеxNесkСоrsеtPlugGаg +NeckCorset +NесkСоrsеt +NeckCorsetRim +NесkСоrsеtRim +OTNFlat +ОТNFlаt +Plug +Plug +FashionKittyHarnessPanelGag +FаshiоnKittyHаrnеssPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Harness +Hаrnеss +SideStrap +SidеStrаp +KittyMouth +KittyMоuth +FashionSmoothBallGag +FаshiоnSmооthВаllGаg +Ball +Ваll +Strap +Strаp +FashionSegmentedLargePanelGag +FаshiоnSеgmеntеdLаrgеPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +FashionSegmentedLargePanelGagHarness +FаshiоnSеgmеntеdLаrgеPаnеlGаgHаrnеss +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +FashionSciFiPanelGag +FаshiоnSсiFiPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +FashionAdvancedSciFiPanelGag +FаshiоnАdvаnсеdSсiFiPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +FashionUltimateSciFiPanelGag +FаshiоnUltimаtеSсiFiPаnеlGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +FashionUltimateSciFiPanelGag2 +FаshiоnUltimаtеSсiFiPаnеlGаg2 +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Harness +Hаrnеss +TopRim +ТоpRim +Display +Displаy +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +FashionSegmentedPlugGag +FаshiоnSеgmеntеdPlugGаg +Panel +Pаnеl +Strap +Strаp +Mask +Mаsk +Plug +Plug +FashionSciFiPlugMuzzle +FаshiоnSсiFiPlugMuzzlе +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Plug +Plug +FashionAdvancedSciFiPlugMuzzle +FаshiоnАdvаnсеdSсiFiPlugMuzzlе +HarnessRim +HаrnеssRim +HarnessDisplay +HаrnеssDisplаy +Muzzle +Muzzlе +Mask +Mаsk +Plug +Plug +DivineGag +DivinеGаg +Ball +Ваll +Teeth +Тееth +Harness +Hаrnеss +Gold +Gоld +Metallic +Mеtаlliс +FashionDivineGag +FаshiоnDivinеGаg +Ball +Ваll +Teeth +Тееth +Harness +Hаrnеss +Gold +Gоld +Metallic +Mеtаlliс +DivineGagClean +DivinеGаgСlеаn +Ball +Ваll +Teeth +Тееth +Harness +Hаrnеss +GoldClean +GоldСlеаn +Metallic +Mеtаlliс +FashionDivineGagClean +FаshiоnDivinеGаgСlеаn +Ball +Ваll +Teeth +Тееth +Harness +Hаrnеss +GoldClean +GоldСlеаn +Metallic +Mеtаlliс +DivineMuzzle +DivinеMuzzlе +Muzzle +Muzzlе +MuzzleRim +MuzzlеRim +MuzzleGold +MuzzlеGоld +MuzzleHarness +MuzzlеHаrnеss +MuzzleCollar +MuzzlеСоllаr +FashionDivineMuzzle +FаshiоnDivinеMuzzlе +Muzzle +Muzzlе +MuzzleRim +MuzzlеRim +MuzzleGold +MuzzlеGоld +MuzzleHarness +MuzzlеHаrnеss +MuzzleCollar +MuzzlеСоllаr +DivineMuzzleClean +DivinеMuzzlеСlеаn +Muzzle +Muzzlе +MuzzleRim +MuzzlеRim +MuzzleGoldClean +MuzzlеGоldСlеаn +MuzzleHarness +MuzzlеHаrnеss +MuzzleCollar +MuzzlеСоllаr +FashionDivineMuzzleClean +FаshiоnDivinеMuzzlеСlеаn +Muzzle +Muzzlе +MuzzleRim +MuzzlеRim +MuzzleGoldClean +MuzzlеGоldСlеаn +MuzzleHarness +MuzzlеHаrnеss +MuzzleCollar +MuzzlеСоllаr +FutureBox +FuturеВоx +Rim +Rim +Display +Displаy +Lock +Lосk +Door +Dооr +DoorWindow +DооrWindоw +DoorNumeral +DооrNumеrаl +BackFade +ВасkFаdе +Back +Васk +CrystalEncase +СrystаlЕnсаsе +EncaseOver +ЕnсаsеОvеr +EncaseUnder +ЕnсаsеUndеr +FashionLeash +FаshiоnLеаsh +Leash +Lеаsh +ArmsBelts +АrmsВеlts +LegsBelts +LеgsВеlts +LeftLegsBelts +LеftLеgsВеlts +ElitePetsuit +ЕlitеPеtsuit +Arms +Аrms +ArmsBelts +АrmsВеlts +ArmsLaces +АrmsLасеs +ArmsHardware +АrmsHаrdwаrе +Legs +Lеgs +LegsLaces +LеgsLасеs +LegsHardware +LеgsHаrdwаrе +LegsBelts +LеgsВеlts +LeftLegs +LеftLеgs +LeftLegsBelts +LеftLеgsВеlts +LeftLegsLaces +LеftLеgsLасеs +LeftLegsHardware +LеftLеgsHаrdwаrе +CyberPetsuit +СybеrPеtsuit +Arms +Аrms +ArmsBelts +АrmsВеlts +DisplayArms +DisplаyАrms +Legs +Lеgs +DisplayLegs +DisplаyLеgs +LegsBelts +LеgsВеlts +LeftLegs +LеftLеgs +LeftLegsBelts +LеftLеgsВеlts +DisplayLeftLegs +DisplаyLеftLеgs +NippleClamps +NipplеСlаmps +Clamps +Сlаmps +ClampsBullet +СlаmpsВullеt +NippleClampsRestraint +NipplеСlаmpsRеstrаint +Clamps +Сlаmps +ClampsBullet +СlаmpsВullеt +RingVibes +RingVibеs +Rings +Rings +RingsBullet +RingsВullеt +RingVibesRestraint +RingVibеsRеstrаint +Rings +Rings +RingsBullet +RingsВullеt +NippleWeights +NipplеWеights +Weights +Wеights +NippleWeightsRestraint +NipplеWеightsRеstrаint +Weights +Wеights +VibePiercings +VibеPiеrсings +VibePiercings +VibеPiеrсings +VibePiercingsBullet +VibеPiеrсingsВullеt +Clamps +Сlаmps +ClampsBullet +СlаmpsВullеt +VibePiercingsRestraint +VibеPiеrсingsRеstrаint +VibePiercings +VibеPiеrсings +VibePiercingsBullet +VibеPiеrсingsВullеt +Clamps +Сlаmps +ClampsBullet +СlаmpsВullеt +PostureCollarBasic +PоsturеСоllаrВаsiс +PostureCollar +PоsturеСоllаr +PostureCollarRim +PоsturеСоllаrRim +PostureCollar +PоsturеСоllаr +PostureCollar +PоsturеСоllаr +PostureCollarRim +PоsturеСоllаrRim +PostureCollarLoop +PоsturеСоllаrLооp +PostureCollarHardware +PоsturеСоllаrHаrdwаrе +FashionPostureCollarBasic +FаshiоnPоsturеСоllаrВаsiс +PostureCollar +PоsturеСоllаr +PostureCollarRim +PоsturеСоllаrRim +FashionPostureCollar +FаshiоnPоsturеСоllаr +PostureCollar +PоsturеСоllаr +PostureCollarRim +PоsturеСоllаrRim +PostureCollarLoop +PоsturеСоllаrLооp +PostureCollarHardware +PоsturеСоllаrHаrdwаrе +ReverseBinder +RеvеrsеВindеr +ReverseBinderLeft +RеvеrsеВindеrLеft +ReverseBinderRight +RеvеrsеВindеrRight +ReverseBinderStraps +RеvеrsеВindеrStrаps +ReverseBinderHardware +RеvеrsеВindеrHаrdwаrе +NightWhip +NightWhip +NightWhip +NightWhip +NightWhipLight +NightWhipLight +LatexWhip +LаtеxWhip +LatexWhip +LаtеxWhip +KittyLatexEar +KittyLаtеxЕаr +KittyLatexEar +KittyLаtеxЕаr +KittyLatexEarLight +KittyLаtеxЕаrLight +KittyLatexEarMuff +KittyLаtеxЕаrMuff +KittyLatexEarMuffLight2 +KittyLаtеxЕаrMuffLight2 +KittyLatexEarMuffLight1 +KittyLаtеxЕаrMuffLight1 +KittyLatexTail +KittyLаtеxТаil +KittyLatexTail +KittyLаtеxТаil +KittyLatexTailLight +KittyLаtеxТаilLight +KittyLatexTail2 +KittyLаtеxТаil2 +KittyLatexTail +KittyLаtеxТаil +KittyLatexTail2 +KittyLаtеxТаil2 +KittyLatexTailLight +KittyLаtеxТаilLight +KittyLatexTail2Light +KittyLаtеxТаil2Light +KittyLatex +KittyLаtеx +KittyLatexEar +KittyLаtеxЕаr +KittyLatexEarLight +KittyLаtеxЕаrLight +KittyLatexEarMuff +KittyLаtеxЕаrMuff +KittyLatexEarMuffLight2 +KittyLаtеxЕаrMuffLight2 +KittyLatexEarMuffLight1 +KittyLаtеxЕаrMuffLight1 +KittyLatexTail +KittyLаtеxТаil +KittyLatexTailLight +KittyLаtеxТаilLight +KittyLatexTail2 +KittyLаtеxТаil2 +KittyLatexTail2Light +KittyLаtеxТаil2Light +SuccubusWing +SuссubusWing +SuccubusWingBase +SuссubusWingВаsе +SuccubusWingBack +SuссubusWingВасk +SuccubusWingLight +SuссubusWingLight +SuccubusHorn +SuссubusHоrn +SuccubusHornRight +SuссubusHоrnRight +SuccubusHornLeft +SuссubusHоrnLеft +SuccubusHornLight +SuссubusHоrnLight +SuccubusTail +SuссubusТаil +SuccubusTail +SuссubusТаil +SuccubusTailLight +SuссubusТаilLight +SuccubusClaws +SuссubusСlаws +SuccubusClawLeft +SuссubusСlаwLеft +SuccubusClawRight +SuссubusСlаwRight +SuccubusFeet +SuссubusFееt +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +Succubus +Suссubus +SuccubusHornRight +SuссubusHоrnRight +SuccubusHornLeft +SuссubusHоrnLеft +SuccubusHornLight +SuссubusHоrnLight +SuccubusTail +SuссubusТаil +SuccubusTailLight +SuссubusТаilLight +SuccubusWingBase +SuссubusWingВаsе +SuccubusWingBack +SuссubusWingВасk +SuccubusWingLight +SuссubusWingLight +SuccubusClawLeft +SuссubusСlаwLеft +SuccubusClawRight +SuссubusСlаwRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +Bubble +Вubblе +Bubble +Вubblе +SlimeBubble +SlimеВubblе +Bubble +Вubblе +BubbleSquishy +ВubblеSquishy +BubbleSquishy +ВubblеSquishy +BubbleSquishyBack +ВubblеSquishyВасk +LatexSphere +LаtеxSphеrе +LatexSphere +LаtеxSphеrе +LatexSphereCutaway +LаtеxSphеrеСutаwаy +LatexSphereCutawayBack +LаtеxSphеrеСutаwаyВасk +BallSuit +ВаllSuit +BallSuit +ВаllSuit +BubbleHead +ВubblеHеаd +Head +Hеаd +FashionBubbleHead +FаshiоnВubblеHеаd +Head +Hеаd +BubbleArms +ВubblеАrms +Arms +Аrms +BubbleLegs +ВubblеLеgs +Legs +Lеgs +FashionBubbleLegs +FаshiоnВubblеLеgs +Legs +Lеgs +Hair5_FrontE +Hаir5_FrоntЕ +BlankEyes +ВlаnkЕyеs +Eyes +Еyеs +Eyes2 +Еyеs2 +Whites +Whitеs +Whites2 +Whitеs2 +DaiBrows1 +DаiВrоws1 +Brows +Вrоws +Brows2 +Вrоws2 +DaiBrows2 +DаiВrоws2 +Brows +Вrоws +Brows2 +Вrоws2 +Glabella +Glаbеllа +Ridge +Ridgе +Bra +Вrа +Bra +Вrа +BraRim +ВrаRim +InnerLines +InnеrLinеs +BraUnder +ВrаUndеr +BraUnderRim +ВrаUndеrRim +BraStriped +ВrаStripеd +Bra +Вrа +BraRim +ВrаRim +InnerLines +InnеrLinеs +BraUnder +ВrаUndеr +BraUnderRim +ВrаUndеrRim +Stripes +Stripеs +BraCherry +ВrаСhеrry +Bra +Вrа +BraRim +ВrаRim +InnerLines +InnеrLinеs +BraUnder +ВrаUndеr +BraUnderRim +ВrаUndеrRim +Cherry +Сhеrry +BraRose +ВrаRоsе +Bra +Вrа +BraRim +ВrаRim +InnerLines +InnеrLinеs +BraUnder +ВrаUndеr +BraUnderRim +ВrаUndеrRim +Rose +Rоsе +BraInvertedRose +ВrаInvеrtеdRоsе +Bra +Вrа +BraRim +ВrаRim +InnerLines +InnеrLinеs +BraUnder +ВrаUndеr +BraUnderRim +ВrаUndеrRim +InvertedRose +InvеrtеdRоsе +BraStraps +ВrаStrаps +Straps +Strаps +Panties +Pаntiеs +Base +Ваsе +Lines +Linеs +PantiesBow +PаntiеsВоw +Bow +Воw +PantiesStriped +PаntiеsStripеd +Base +Ваsе +Lines +Linеs +Stripes +Stripеs +PantiesInvertedRose +PаntiеsInvеrtеdRоsе +Base +Ваsе +Lines +Linеs +InvertedRose +InvеrtеdRоsе +PantiesCherry +PаntiеsСhеrry +Base +Ваsе +Lines +Linеs +Cherry +Сhеrry +PantiesBowStriped +PаntiеsВоwStripеd +Base +Ваsе +Lines +Linеs +Bow +Воw +Stripes +Stripеs +PantiesHigh +PаntiеsHigh +Base +Ваsе +Lines +Linеs +PantiesHighStriped +PаntiеsHighStripеd +Base +Ваsе +Lines +Linеs +Stripes +Stripеs +SwimsuitRestraint +SwimsuitRеstrаint +Swimsuit +Swimsuit +SwimsuitChest +SwimsuitСhеst +BlouseShoulderRight +ВlоusеShоuldеrRight +BlouseShoulderRight +ВlоusеShоuldеrRight +BlouseShoulderRight +ВlоusеShоuldеrRight +BlouseShoulderRight +ВlоusеShоuldеrRight +SlayerCollar +SlаyеrСоllаr +CapeCollar +СаpеСоllаr +CapeCollarButton +СаpеСоllаrВuttоn +CapeCollarRim +СаpеСоllаrRim +SlayerCape +SlаyеrСаpе +CapeCollar +СаpеСоllаr +CapeCollarButton +СаpеСоllаrВuttоn +CapeCollarRim +СаpеСоllаrRim +CapeCollarInner +СаpеСоllаrInnеr +Cape +Саpе +CapeStripe +СаpеStripе +CapeShoulderLeft +СаpеShоuldеrLеft +CapeShoulderRight +СаpеShоuldеrRight +CapeShoulderLeftButton +СаpеShоuldеrLеftВuttоn +CapeShoulderRightButton +СаpеShоuldеrRightВuttоn +CapeBack +СаpеВасk +LeatherMask +LеаthеrMаsk +Hood +Hооd +Gag +Gаg +Blindfold +Вlindfоld +FashionLeatherMask +FаshiоnLеаthеrMаsk +Hood +Hооd +Gag +Gаg +Blindfold +Вlindfоld +LeatherHood +LеаthеrHооd +Hood +Hооd +Gag +Gаg +Blindfold +Вlindfоld +WolfEars +WоlfЕаrs +KittyEars +KittyЕаrs +BunnyEars +ВunnyЕаrs +FashionLeatherHood +FаshiоnLеаthеrHооd +Hood +Hооd +Gag +Gаg +Blindfold +Вlindfоld +WolfEars +WоlfЕаrs +KittyEars +KittyЕаrs +BunnyEars +ВunnyЕаrs +CyberLongMittenLeft +СybеrLоngMittеnLеft +CapForeLongMittenLeft +СаpFоrеLоngMittеnLеft +CapLongMittenLeft +СаpLоngMittеnLеft +LongMittenLeft +LоngMittеnLеft +ForeLongMittenLeft +FоrеLоngMittеnLеft +CuffForeLongMittenLeft +СuffFоrеLоngMittеnLеft +CuffLongMittenLeft +СuffLоngMittеnLеft +DisplayForeLongMittenLeft +DisplаyFоrеLоngMittеnLеft +DisplayLongMittenLeft +DisplаyLоngMittеnLеft +LockForeLongMittenLeft +LосkFоrеLоngMittеnLеft +LockLongMittenLeft +LосkLоngMittеnLеft +GlowForeLongMittenLeft +GlоwFоrеLоngMittеnLеft +GlowLongMittenLeft +GlоwLоngMittеnLеft +StrapsForeLongMittenLeft +StrаpsFоrеLоngMittеnLеft +StrapsLongMittenLeft +StrаpsLоngMittеnLеft +UpperCuffLongMittenLeft +UppеrСuffLоngMittеnLеft +UpperDisplayLongMittenLeft +UppеrDisplаyLоngMittеnLеft +UpperLockLongMittenLeft +UppеrLосkLоngMittеnLеft +UpperGlowLongMittenLeft +UppеrGlоwLоngMittеnLеft +CyberLongMittenRight +СybеrLоngMittеnRight +CapForeLongMittenRight +СаpFоrеLоngMittеnRight +CapLongMittenRight +СаpLоngMittеnRight +LongMittenRight +LоngMittеnRight +ForeLongMittenRight +FоrеLоngMittеnRight +CuffForeLongMittenRight +СuffFоrеLоngMittеnRight +CuffLongMittenRight +СuffLоngMittеnRight +DisplayForeLongMittenRight +DisplаyFоrеLоngMittеnRight +DisplayLongMittenRight +DisplаyLоngMittеnRight +LockForeLongMittenRight +LосkFоrеLоngMittеnRight +LockLongMittenRight +LосkLоngMittеnRight +GlowForeLongMittenRight +GlоwFоrеLоngMittеnRight +GlowLongMittenRight +GlоwLоngMittеnRight +StrapsForeLongMittenRight +StrаpsFоrеLоngMittеnRight +StrapsLongMittenRight +StrаpsLоngMittеnRight +UpperCuffLongMittenRight +UppеrСuffLоngMittеnRight +UpperDisplayLongMittenRight +UppеrDisplаyLоngMittеnRight +UpperLockLongMittenRight +UppеrLосkLоngMittеnRight +UpperGlowLongMittenRight +UppеrGlоwLоngMittеnRight +CyberLongMittens +СybеrLоngMittеns +CapForeLongMittenLeft +СаpFоrеLоngMittеnLеft +CapLongMittenLeft +СаpLоngMittеnLеft +LongMittenLeft +LоngMittеnLеft +ForeLongMittenLeft +FоrеLоngMittеnLеft +CuffForeLongMittenLeft +СuffFоrеLоngMittеnLеft +CuffLongMittenLeft +СuffLоngMittеnLеft +DisplayForeLongMittenLeft +DisplаyFоrеLоngMittеnLеft +DisplayLongMittenLeft +DisplаyLоngMittеnLеft +LockForeLongMittenLeft +LосkFоrеLоngMittеnLеft +LockLongMittenLeft +LосkLоngMittеnLеft +GlowForeLongMittenLeft +GlоwFоrеLоngMittеnLеft +GlowLongMittenLeft +GlоwLоngMittеnLеft +StrapsForeLongMittenLeft +StrаpsFоrеLоngMittеnLеft +StrapsLongMittenLeft +StrаpsLоngMittеnLеft +UpperCuffLongMittenLeft +UppеrСuffLоngMittеnLеft +UpperDisplayLongMittenLeft +UppеrDisplаyLоngMittеnLеft +UpperLockLongMittenLeft +UppеrLосkLоngMittеnLеft +UpperGlowLongMittenLeft +UppеrGlоwLоngMittеnLеft +CapForeLongMittenRight +СаpFоrеLоngMittеnRight +CapLongMittenRight +СаpLоngMittеnRight +LongMittenRight +LоngMittеnRight +ForeLongMittenRight +FоrеLоngMittеnRight +CuffForeLongMittenRight +СuffFоrеLоngMittеnRight +CuffLongMittenRight +СuffLоngMittеnRight +DisplayForeLongMittenRight +DisplаyFоrеLоngMittеnRight +DisplayLongMittenRight +DisplаyLоngMittеnRight +LockForeLongMittenRight +LосkFоrеLоngMittеnRight +LockLongMittenRight +LосkLоngMittеnRight +GlowForeLongMittenRight +GlоwFоrеLоngMittеnRight +GlowLongMittenRight +GlоwLоngMittеnRight +StrapsForeLongMittenRight +StrаpsFоrеLоngMittеnRight +StrapsLongMittenRight +StrаpsLоngMittеnRight +UpperCuffLongMittenRight +UppеrСuffLоngMittеnRight +UpperDisplayLongMittenRight +UppеrDisplаyLоngMittеnRight +UpperLockLongMittenRight +UppеrLосkLоngMittеnRight +UpperGlowLongMittenRight +UppеrGlоwLоngMittеnRight +CyberMittenLeft +СybеrMittеnLеft +MittenLeft +MittеnLеft +ForeMittenLeft +FоrеMittеnLеft +CuffForeLongMittenLeft +СuffFоrеLоngMittеnLеft +CuffLongMittenLeft +СuffLоngMittеnLеft +DisplayForeLongMittenLeft +DisplаyFоrеLоngMittеnLеft +DisplayLongMittenLeft +DisplаyLоngMittеnLеft +LockForeLongMittenLeft +LосkFоrеLоngMittеnLеft +LockLongMittenLeft +LосkLоngMittеnLеft +GlowForeLongMittenLeft +GlоwFоrеLоngMittеnLеft +GlowLongMittenLeft +GlоwLоngMittеnLеft +CapForeLongMittenLeft +СаpFоrеLоngMittеnLеft +CapLongMittenLeft +СаpLоngMittеnLеft +CyberMittenRight +СybеrMittеnRight +MittenRight +MittеnRight +ForeMittenRight +FоrеMittеnRight +CuffForeLongMittenRight +СuffFоrеLоngMittеnRight +CuffLongMittenRight +СuffLоngMittеnRight +DisplayForeLongMittenRight +DisplаyFоrеLоngMittеnRight +DisplayLongMittenRight +DisplаyLоngMittеnRight +LockForeLongMittenRight +LосkFоrеLоngMittеnRight +LockLongMittenRight +LосkLоngMittеnRight +GlowForeLongMittenRight +GlоwFоrеLоngMittеnRight +GlowLongMittenRight +GlоwLоngMittеnRight +CapForeLongMittenRight +СаpFоrеLоngMittеnRight +CapLongMittenRight +СаpLоngMittеnRight +CyberMittens +СybеrMittеns +MittenLeft +MittеnLеft +ForeMittenLeft +FоrеMittеnLеft +CuffForeLongMittenLeft +СuffFоrеLоngMittеnLеft +CuffLongMittenLeft +СuffLоngMittеnLеft +DisplayForeLongMittenLeft +DisplаyFоrеLоngMittеnLеft +DisplayLongMittenLeft +DisplаyLоngMittеnLеft +LockForeLongMittenLeft +LосkFоrеLоngMittеnLеft +LockLongMittenLeft +LосkLоngMittеnLеft +GlowForeLongMittenLeft +GlоwFоrеLоngMittеnLеft +GlowLongMittenLeft +GlоwLоngMittеnLеft +CapForeLongMittenLeft +СаpFоrеLоngMittеnLеft +CapLongMittenLeft +СаpLоngMittеnLеft +MittenRight +MittеnRight +ForeMittenRight +FоrеMittеnRight +CuffForeLongMittenRight +СuffFоrеLоngMittеnRight +CuffLongMittenRight +СuffLоngMittеnRight +DisplayForeLongMittenRight +DisplаyFоrеLоngMittеnRight +DisplayLongMittenRight +DisplаyLоngMittеnRight +LockForeLongMittenRight +LосkFоrеLоngMittеnRight +LockLongMittenRight +LосkLоngMittеnRight +GlowForeLongMittenRight +GlоwFоrеLоngMittеnRight +GlowLongMittenRight +GlоwLоngMittеnRight +CapForeLongMittenRight +СаpFоrеLоngMittеnRight +CapLongMittenRight +СаpLоngMittеnRight +CyberArmLeft +СybеrАrmLеft +ArmLongMittenLeft +АrmLоngMittеnLеft +ForeLongMittenLeft +FоrеLоngMittеnLеft +CuffForeLongMittenLeft +СuffFоrеLоngMittеnLеft +CuffLongMittenLeft +СuffLоngMittеnLеft +DisplayForeLongMittenLeft +DisplаyFоrеLоngMittеnLеft +DisplayLongMittenLeft +DisplаyLоngMittеnLеft +LockForeLongMittenLeft +LосkFоrеLоngMittеnLеft +LockLongMittenLeft +LосkLоngMittеnLеft +GlowForeLongMittenLeft +GlоwFоrеLоngMittеnLеft +GlowLongMittenLeft +GlоwLоngMittеnLеft +StrapsForeLongMittenLeft +StrаpsFоrеLоngMittеnLеft +StrapsLongMittenLeft +StrаpsLоngMittеnLеft +UpperCuffLongMittenLeft +UppеrСuffLоngMittеnLеft +UpperDisplayLongMittenLeft +UppеrDisplаyLоngMittеnLеft +UpperLockLongMittenLeft +UppеrLосkLоngMittеnLеft +UpperGlowLongMittenLeft +UppеrGlоwLоngMittеnLеft +CyberArmRight +СybеrАrmRight +ArmLongMittenRight +АrmLоngMittеnRight +ForeLongMittenRight +FоrеLоngMittеnRight +CuffForeLongMittenRight +СuffFоrеLоngMittеnRight +CuffLongMittenRight +СuffLоngMittеnRight +DisplayForeLongMittenRight +DisplаyFоrеLоngMittеnRight +DisplayLongMittenRight +DisplаyLоngMittеnRight +LockForeLongMittenRight +LосkFоrеLоngMittеnRight +LockLongMittenRight +LосkLоngMittеnRight +GlowForeLongMittenRight +GlоwFоrеLоngMittеnRight +GlowLongMittenRight +GlоwLоngMittеnRight +StrapsForeLongMittenRight +StrаpsFоrеLоngMittеnRight +StrapsLongMittenRight +StrаpsLоngMittеnRight +UpperCuffForeLongMittenRight +UppеrСuffFоrеLоngMittеnRight +UpperCuffLongMittenRight +UppеrСuffLоngMittеnRight +UpperDisplayLongMittenRight +UppеrDisplаyLоngMittеnRight +UpperLockLongMittenRight +UppеrLосkLоngMittеnRight +UpperGlowLongMittenRight +UppеrGlоwLоngMittеnRight +CyberArms +СybеrАrms +ArmLongMittenLeft +АrmLоngMittеnLеft +ForeLongMittenLeft +FоrеLоngMittеnLеft +CuffForeLongMittenLeft +СuffFоrеLоngMittеnLеft +CuffLongMittenLeft +СuffLоngMittеnLеft +DisplayForeLongMittenLeft +DisplаyFоrеLоngMittеnLеft +DisplayLongMittenLeft +DisplаyLоngMittеnLеft +LockForeLongMittenLeft +LосkFоrеLоngMittеnLеft +LockLongMittenLeft +LосkLоngMittеnLеft +GlowForeLongMittenLeft +GlоwFоrеLоngMittеnLеft +GlowLongMittenLeft +GlоwLоngMittеnLеft +StrapsForeLongMittenLeft +StrаpsFоrеLоngMittеnLеft +StrapsLongMittenLeft +StrаpsLоngMittеnLеft +UpperCuffLongMittenLeft +UppеrСuffLоngMittеnLеft +UpperDisplayLongMittenLeft +UppеrDisplаyLоngMittеnLеft +UpperLockLongMittenLeft +UppеrLосkLоngMittеnLеft +UpperGlowLongMittenLeft +UppеrGlоwLоngMittеnLеft +ArmLongMittenRight +АrmLоngMittеnRight +ForeLongMittenRight +FоrеLоngMittеnRight +CuffForeLongMittenRight +СuffFоrеLоngMittеnRight +CuffLongMittenRight +СuffLоngMittеnRight +DisplayForeLongMittenRight +DisplаyFоrеLоngMittеnRight +DisplayLongMittenRight +DisplаyLоngMittеnRight +LockForeLongMittenRight +LосkFоrеLоngMittеnRight +LockLongMittenRight +LосkLоngMittеnRight +GlowForeLongMittenRight +GlоwFоrеLоngMittеnRight +GlowLongMittenRight +GlоwLоngMittеnRight +StrapsForeLongMittenRight +StrаpsFоrеLоngMittеnRight +StrapsLongMittenRight +StrаpsLоngMittеnRight +UpperCuffForeLongMittenRight +UppеrСuffFоrеLоngMittеnRight +UpperCuffLongMittenRight +UppеrСuffLоngMittеnRight +UpperDisplayLongMittenRight +UppеrDisplаyLоngMittеnRight +UpperLockLongMittenRight +UppеrLосkLоngMittеnRight +UpperGlowLongMittenRight +UppеrGlоwLоngMittеnRight +FashionCyberLongMittens +FаshiоnСybеrLоngMittеns +CapForeLongMittenLeft +СаpFоrеLоngMittеnLеft +CapLongMittenLeft +СаpLоngMittеnLеft +LongMittenLeft +LоngMittеnLеft +ForeLongMittenLeft +FоrеLоngMittеnLеft +CuffForeLongMittenLeft +СuffFоrеLоngMittеnLеft +CuffLongMittenLeft +СuffLоngMittеnLеft +DisplayForeLongMittenLeft +DisplаyFоrеLоngMittеnLеft +DisplayLongMittenLeft +DisplаyLоngMittеnLеft +LockForeLongMittenLeft +LосkFоrеLоngMittеnLеft +LockLongMittenLeft +LосkLоngMittеnLеft +GlowForeLongMittenLeft +GlоwFоrеLоngMittеnLеft +GlowLongMittenLeft +GlоwLоngMittеnLеft +StrapsForeLongMittenLeft +StrаpsFоrеLоngMittеnLеft +StrapsLongMittenLeft +StrаpsLоngMittеnLеft +UpperCuffLongMittenLeft +UppеrСuffLоngMittеnLеft +UpperDisplayLongMittenLeft +UppеrDisplаyLоngMittеnLеft +UpperLockLongMittenLeft +UppеrLосkLоngMittеnLеft +UpperGlowLongMittenLeft +UppеrGlоwLоngMittеnLеft +CapForeLongMittenRight +СаpFоrеLоngMittеnRight +CapLongMittenRight +СаpLоngMittеnRight +LongMittenRight +LоngMittеnRight +ForeLongMittenRight +FоrеLоngMittеnRight +CuffForeLongMittenRight +СuffFоrеLоngMittеnRight +CuffLongMittenRight +СuffLоngMittеnRight +DisplayForeLongMittenRight +DisplаyFоrеLоngMittеnRight +DisplayLongMittenRight +DisplаyLоngMittеnRight +LockForeLongMittenRight +LосkFоrеLоngMittеnRight +LockLongMittenRight +LосkLоngMittеnRight +GlowForeLongMittenRight +GlоwFоrеLоngMittеnRight +GlowLongMittenRight +GlоwLоngMittеnRight +StrapsForeLongMittenRight +StrаpsFоrеLоngMittеnRight +StrapsLongMittenRight +StrаpsLоngMittеnRight +UpperCuffLongMittenRight +UppеrСuffLоngMittеnRight +UpperDisplayLongMittenRight +UppеrDisplаyLоngMittеnRight +UpperLockLongMittenRight +UppеrLосkLоngMittеnRight +UpperGlowLongMittenRight +UppеrGlоwLоngMittеnRight +FashionCyberMittens +FаshiоnСybеrMittеns +MittenLeft +MittеnLеft +ForeMittenLeft +FоrеMittеnLеft +CuffForeLongMittenLeft +СuffFоrеLоngMittеnLеft +CuffLongMittenLeft +СuffLоngMittеnLеft +DisplayForeLongMittenLeft +DisplаyFоrеLоngMittеnLеft +DisplayLongMittenLeft +DisplаyLоngMittеnLеft +LockForeLongMittenLeft +LосkFоrеLоngMittеnLеft +LockLongMittenLeft +LосkLоngMittеnLеft +GlowForeLongMittenLeft +GlоwFоrеLоngMittеnLеft +GlowLongMittenLeft +GlоwLоngMittеnLеft +CapForeLongMittenLeft +СаpFоrеLоngMittеnLеft +CapLongMittenLeft +СаpLоngMittеnLеft +MittenRight +MittеnRight +ForeMittenRight +FоrеMittеnRight +CuffForeLongMittenRight +СuffFоrеLоngMittеnRight +CuffLongMittenRight +СuffLоngMittеnRight +DisplayForeLongMittenRight +DisplаyFоrеLоngMittеnRight +DisplayLongMittenRight +DisplаyLоngMittеnRight +LockForeLongMittenRight +LосkFоrеLоngMittеnRight +LockLongMittenRight +LосkLоngMittеnRight +GlowForeLongMittenRight +GlоwFоrеLоngMittеnRight +GlowLongMittenRight +GlоwLоngMittеnRight +CapForeLongMittenRight +СаpFоrеLоngMittеnRight +CapLongMittenRight +СаpLоngMittеnRight +CyberThighLink +СybеrТhighLink +ThighLink +ТhighLink +GlowThighLink +GlоwТhighLink +CyberAnkleLink +СybеrАnklеLink +AnkleLink +АnklеLink +GlowAnkleLink +GlоwАnklеLink +FashionCyberThighLink +FаshiоnСybеrТhighLink +ThighLink +ТhighLink +GlowThighLink +GlоwТhighLink +FashionCyberAnkleLink +FаshiоnСybеrАnklеLink +AnkleLink +АnklеLink +GlowAnkleLink +GlоwАnklеLink +CyberPanties +СybеrPаntiеs +CyberPanties +СybеrPаntiеs +CyberPantiesLining +СybеrPаntiеsLining +TallSmoothHeels +ТаllSmооthHееls +TallLeft +ТаllLеft +TallRight +ТаllRight +TallLegLeft +ТаllLеgLеft +TallLegRight +ТаllLеgRight +TallSmoothHeelsRestraint +ТаllSmооthHееlsRеstrаint +TallLeft +ТаllLеft +TallRight +ТаllRight +TallLegLeft +ТаllLеgLеft +TallLegRight +ТаllLеgRight +NeckCorset +NесkСоrsеt +NeckCorset2 +NесkСоrsеt2 +NeckCorsetRim2 +NесkСоrsеtRim2 +ShinyLatexMuzzle +ShinyLаtеxMuzzlе +NeckCorsetGag2 +NесkСоrsеtGаg2 +NeckCorsetGagRim2 +NесkСоrsеtGаgRim2 +NeckCorsetGag +NесkСоrsеtGаg +NeckCorset2 +NесkСоrsеt2 +NeckCorsetRim2 +NесkСоrsеtRim2 +NeckCorsetGag2 +NесkСоrsеtGаg2 +NeckCorsetGagRim2 +NесkСоrsеtGаgRim2 +ShinyLatexMuzzleRestraint +ShinyLаtеxMuzzlеRеstrаint +NeckCorsetGag2 +NесkСоrsеtGаg2 +NeckCorsetGagRim2 +NесkСоrsеtGаgRim2 +NeckCorsetRestraint +NесkСоrsеtRеstrаint +NeckCorset2 +NесkСоrsеt2 +NeckCorsetRim2 +NесkСоrsеtRim2 +NeckCorsetGagRestraint +NесkСоrsеtGаgRеstrаint +NeckCorset2 +NесkСоrsеt2 +NeckCorsetRim2 +NесkСоrsеtRim2 +NeckCorsetGag2 +NесkСоrsеtGаg2 +NeckCorsetGagRim2 +NесkСоrsеtGаgRim2 +LatexPetsuit +LаtеxPеtsuit +Arms +Аrms +Legs +Lеgs +LeftLegs +LеftLеgs +LatexPetsuitGlow +LаtеxPеtsuitGlоw +Arms +Аrms +Legs +Lеgs +LeftLegs +LеftLеgs +GlowArms +GlоwАrms +GlowTorso +GlоwТоrsо +GlowLegs +GlоwLеgs +GlowLeftLegs +GlоwLеftLеgs +MiniCape +MiniСаpе +Cape +Саpе +Epaulettes +Еpаulеttеs +Pauldrons +Pаuldrоns +TheRobeOfChastity +ТhеRоbеОfСhаstity +Base +Ваsе +ChestBase +СhеstВаsе +Frill +Frill +ChestFrill +СhеstFrill +Gold +Gоld +ChestGold +СhеstGоld +Plate +Plаtе +ChestPlate +СhеstPlаtе +GoldBase +GоldВаsе +ChestGoldBase +СhеstGоldВаsе +Fabric +Fаbriс +ChestFabric +СhеstFаbriс +Cape +Саpе +Pauldrons +Pаuldrоns +TheRobeOfChastityRestraint +ТhеRоbеОfСhаstityRеstrаint +Base +Ваsе +ChestBase +СhеstВаsе +Frill +Frill +ChestFrill +СhеstFrill +Gold +Gоld +ChestGold +СhеstGоld +Plate +Plаtе +ChestPlate +СhеstPlаtе +GoldBase +GоldВаsе +ChestGoldBase +СhеstGоldВаsе +Fabric +Fаbriс +ChestFabric +СhеstFаbriс +Cape +Саpе +Pauldrons +Pаuldrоns +Spats +Spаts +Spats +Spаts +GothicSkirt +GоthiсSkirt +Skirt +Skirt +WaistbandClips +WаistbаndСlips +Buttons +Вuttоns +Lines +Linеs +HemLower +HеmLоwеr +HemLowerBack +HеmLоwеrВасk +HemUpper +HеmUppеr +GothicSkirtLace +GоthiсSkirtLасе +Skirt +Skirt +WaistbandClips +WаistbаndСlips +Buttons +Вuttоns +Lines +Linеs +HemLower +HеmLоwеr +HemLowerBack +HеmLоwеrВасk +HemUpper +HеmUppеr +LaceLower +LасеLоwеr +LaceUpper +LасеUppеr +LightMaidKnight_Dress +LightMаidKnight_Drеss +Dress +Drеss +DressChest +DrеssСhеst +DressSkirt +DrеssSkirt +DressDeco +DrеssDесо +DressDecoBack +DrеssDесоВасk +LightMaidKnight_Bra +LightMаidKnight_Вrа +DressChest +DrеssСhеst +LightMaidKnight_Top +LightMаidKnight_Тоp +DressChest +DrеssСhеst +LightMaidKnight_SleeveLeft +LightMаidKnight_SlееvеLеft +ArmLeft +АrmLеft +ForeArmLeft +FоrеАrmLеft +LightMaidKnight_SleeveRight +LightMаidKnight_SlееvеRight +ArmRight +АrmRight +ForeArmRight +FоrеАrmRight +ShoulderRight +ShоuldеrRight +LightMaidKnight_Sleeves +LightMаidKnight_Slееvеs +ArmLeft +АrmLеft +ForeArmLeft +FоrеАrmLеft +ArmRight +АrmRight +ForeArmRight +FоrеАrmRight +ShoulderRight +ShоuldеrRight +LightMaidKnightHairband +LightMаidKnightHаirbаnd +Headband +Hеаdbаnd +HeadbandFrill +HеаdbаndFrill +HeadbandRibbon +HеаdbаndRibbоn +FootBootLeftHogtie +FооtВооtLеftHоgtiе +FootBootLeftHogtie +FооtВооtLеftHоgtiе +FootShoeLeftHogtie +FооtShоеLеftHоgtiе +FootShoeLeftHogtie +FооtShоеLеftHоgtiе +GagNecklace +GаgNесklасе +GagNecklaceBall +GаgNесklасеВаll +GagNecklace +GаgNесklасе +FashionGagNecklace +FаshiоnGаgNесklасе +GagNecklaceBall +GаgNесklасеВаll +GagNecklace +GаgNесklасе +BondageBed +ВоndаgеВеd +Bed +Веd +BedStraps +ВеdStrаps +BedStrapsHogtie +ВеdStrаpsHоgtiе +LightMaidKnight_Apron +LightMаidKnight_Аprоn +ApronChest +АprоnСhеst +Apron +Аprоn +ApronBack +АprоnВасk +LightMaidKnight_Flower +LightMаidKnight_Flоwеr +Flower +Flоwеr +LightMaidKnight_SockRight +LightMаidKnight_SосkRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +LightMaidKnight_SockLeft +LightMаidKnight_SосkLеft +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +LightMaidKnight_Socks +LightMаidKnight_Sосks +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +LightMaidKnight_GloveLeft +LightMаidKnight_GlоvеLеft +GloveLeft +GlоvеLеft +LightMaidKnight_GloveRight +LightMаidKnight_GlоvеRight +GloveRight +GlоvеRight +LightMaidKnight_Gloves +LightMаidKnight_Glоvеs +GloveLeft +GlоvеLеft +GloveRight +GlоvеRight +LightMaidKnight_GuardLeft +LightMаidKnight_GuаrdLеft +GuardLeft +GuаrdLеft +GuardCuffLeft +GuаrdСuffLеft +GuardCuff2Left +GuаrdСuff2Lеft +LightMaidKnight_GuardRight +LightMаidKnight_GuаrdRight +GuardRight +GuаrdRight +GuardCuffRight +GuаrdСuffRight +GuardCuff2Right +GuаrdСuff2Right +LightMaidKnight_Guards +LightMаidKnight_Guаrds +GuardLeft +GuаrdLеft +GuardCuffLeft +GuаrdСuffLеft +GuardCuff2Left +GuаrdСuff2Lеft +GuardRight +GuаrdRight +GuardCuffRight +GuаrdСuffRight +GuardCuff2Right +GuаrdСuff2Right +LightMaidKnight_Boots +LightMаidKnight_Вооts +BootLeft +ВооtLеft +BootRight +ВооtRight +BootRightKneel +ВооtRightKnееl +FootBootLeftHogtie +FооtВооtLеftHоgtiе +LightMaidKnight_Pauldron +LightMаidKnight_Pаuldrоn +PauldronLeft +PаuldrоnLеft +PauldronStrap +PаuldrоnStrаp +LightMaidKnight +LightMаidKnight +Dress +Drеss +DressChest +DrеssСhеst +DressSkirt +DrеssSkirt +DressDeco +DrеssDесо +DressDecoBack +DrеssDесоВасk +ArmLeft +АrmLеft +ForeArmLeft +FоrеАrmLеft +ArmRight +АrmRight +ForeArmRight +FоrеАrmRight +ShoulderRight +ShоuldеrRight +ApronChest +АprоnСhеst +Apron +Аprоn +ApronBack +АprоnВасk +Flower +Flоwеr +PauldronLeft +PаuldrоnLеft +PauldronStrap +PаuldrоnStrаp +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +BootLeft +ВооtLеft +BootRight +ВооtRight +BootRightKneel +ВооtRightKnееl +FootBootLeftHogtie +FооtВооtLеftHоgtiе +GuardLeft +GuаrdLеft +GuardCuffLeft +GuаrdСuffLеft +GuardCuff2Left +GuаrdСuff2Lеft +GuardRight +GuаrdRight +GuardCuffRight +GuаrdСuffRight +GuardCuff2Right +GuаrdСuff2Right +Headband +Hеаdbаnd +HeadbandFrill +HеаdbаndFrill +HeadbandRibbon +HеаdbаndRibbоn +HeavyMaidKnightHairband +HеаvyMаidKnightHаirbаnd +Headband +Hеаdbаnd +HeadbandFrill +HеаdbаndFrill +HeadbandRibbon +HеаdbаndRibbоn +HeadbandRibbonBack +HеаdbаndRibbоnВасk +FlowerLeaves +FlоwеrLеаvеs +FlowerLeaves +FlоwеrLеаvеs +HeavyMaidKnight_Dress +HеаvyMаidKnight_Drеss +Dress +Drеss +DressChest +DrеssСhеst +DressSkirt +DrеssSkirt +DressSkirtHem +DrеssSkirtHеm +DressSkirtStripe +DrеssSkirtStripе +HeavyMaidKnight_SleeveLeft +HеаvyMаidKnight_SlееvеLеft +SleeveLeft +SlееvеLеft +SleeveLeftStripe +SlееvеLеftStripе +ArmLeft +АrmLеft +ForeArmLeft +FоrеАrmLеft +HeavyMaidKnight_SleeveRight +HеаvyMаidKnight_SlееvеRight +SleeveRight +SlееvеRight +SleeveRightStripe +SlееvеRightStripе +ArmRight +АrmRight +ForeArmRight +FоrеАrmRight +ShoulderRight +ShоuldеrRight +HeavyMaidKnight_ChestArmor +HеаvyMаidKnight_СhеstАrmоr +ChestArmor +СhеstАrmоr +HeavyMaidKnight_GloveLeft +HеаvyMаidKnight_GlоvеLеft +GloveLeft +GlоvеLеft +HeavyMaidKnight_GloveRight +HеаvyMаidKnight_GlоvеRight +GloveRight +GlоvеRight +HeavyMaidKnight_Gloves +HеаvyMаidKnight_Glоvеs +GloveLeft +GlоvеLеft +GloveRight +GlоvеRight +HeavyMaidKnight_GauntletLeft +HеаvyMаidKnight_GаuntlеtLеft +GauntletLeft +GаuntlеtLеft +HeavyMaidKnight_GauntletRight +HеаvyMаidKnight_GаuntlеtRight +GauntletRight +GаuntlеtRight +HeavyMaidKnight_Gauntlets +HеаvyMаidKnight_Gаuntlеts +GauntletLeft +GаuntlеtLеft +GauntletRight +GаuntlеtRight +HeavyMaidKnight_PauldronLeft +HеаvyMаidKnight_PаuldrоnLеft +PauldronLeft +PаuldrоnLеft +PauldronLeftStraps +PаuldrоnLеftStrаps +PauldronLeftHardware +PаuldrоnLеftHаrdwаrе +HeavyMaidKnight_PauldronRight +HеаvyMаidKnight_PаuldrоnRight +PauldronRight +PаuldrоnRight +PauldronRightStraps +PаuldrоnRightStrаps +HeavyMaidKnight_Pauldrons +HеаvyMаidKnight_Pаuldrоns +PauldronLeft +PаuldrоnLеft +PauldronLeftStraps +PаuldrоnLеftStrаps +PauldronLeftHardware +PаuldrоnLеftHаrdwаrе +PauldronRight +PаuldrоnRight +PauldronRightStraps +PаuldrоnRightStrаps +HeavyMaidKnight_SideArmor +HеаvyMаidKnight_SidеАrmоr +SideArmor +SidеАrmоr +HeavyMaidKnight_Corset +HеаvyMаidKnight_Соrsеt +Corset +Соrsеt +HeavyMaidKnight_CorsetRestraint +HеаvyMаidKnight_СоrsеtRеstrаint +Corset +Соrsеt +HeavyMaidKnight_Sleeves +HеаvyMаidKnight_Slееvеs +SleeveLeft +SlееvеLеft +SleeveLeftStripe +SlееvеLеftStripе +ArmLeft +АrmLеft +ForeArmLeft +FоrеАrmLеft +SleeveRight +SlееvеRight +SleeveRightStripe +SlееvеRightStripе +ArmRight +АrmRight +ForeArmRight +FоrеАrmRight +ShoulderRight +ShоuldеrRight +HeavyMaidKnight_ApronBottom +HеаvyMаidKnight_АprоnВоttоm +Apron +Аprоn +ApronBelt +АprоnВеlt +ApronMiniBow +АprоnMiniВоw +ApronCross +АprоnСrоss +ApronStripe +АprоnStripе +ApronPattern +АprоnPаttеrn +HeavyMaidKnight_ApronTop +HеаvyMаidKnight_АprоnТоp +ApronChest +АprоnСhеst +ApronChestRuffles +АprоnСhеstRufflеs +ApronChestBelts +АprоnСhеstВеlts +HeavyMaidKnight_Apron +HеаvyMаidKnight_Аprоn +ApronChest +АprоnСhеst +ApronChestRuffles +АprоnСhеstRufflеs +ApronChestBelts +АprоnСhеstВеlts +Apron +Аprоn +ApronBelt +АprоnВеlt +ApronMiniBow +АprоnMiniВоw +ApronCross +АprоnСrоss +ApronStripe +АprоnStripе +ApronPattern +АprоnPаttеrn +HeavyMaidKnight_WaistBelts +HеаvyMаidKnight_WаistВеlts +Belts +Веlts +BeltsHardware +ВеltsHаrdwаrе +HeavyMaidKnight_WaistPouches +HеаvyMаidKnight_WаistPоuсhеs +Pouches +Pоuсhеs +HeavyMaidKnight_Waist +HеаvyMаidKnight_Wаist +Pouches +Pоuсhеs +Belts +Веlts +BeltsHardware +ВеltsHаrdwаrе +HeavyMaidKnight_Boots +HеаvyMаidKnight_Вооts +BootLeft +ВооtLеft +BootRight +ВооtRight +BootRightKneel +ВооtRightKnееl +FootBootLeftHogtie +FооtВооtLеftHоgtiе +BootLegLeft +ВооtLеgLеft +BootLegRight +ВооtLеgRight +HeavyMaidKnight_PantyhoseShorts +HеаvyMаidKnight_PаntyhоsеShоrts +Pantyhose +Pаntyhоsе +HeavyMaidKnight_SockRight +HеаvyMаidKnight_SосkRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +HeavyMaidKnight_SockLeft +HеаvyMаidKnight_SосkLеft +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +Pantyhose +Pаntyhоsе +Pantyhose +Pаntyhоsе +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +HeavyMaidKnight +HеаvyMаidKnight +Dress +Drеss +DressChest +DrеssСhеst +DressSkirt +DrеssSkirt +DressSkirtHem +DrеssSkirtHеm +DressSkirtStripe +DrеssSkirtStripе +SleeveLeft +SlееvеLеft +SleeveLeftStripe +SlееvеLеftStripе +ArmLeft +АrmLеft +ForeArmLeft +FоrеАrmLеft +SleeveRight +SlееvеRight +SleeveRightStripe +SlееvеRightStripе +ArmRight +АrmRight +ForeArmRight +FоrеАrmRight +ShoulderRight +ShоuldеrRight +Apron +Аprоn +ApronBelt +АprоnВеlt +ApronMiniBow +АprоnMiniВоw +ApronCross +АprоnСrоss +ApronStripe +АprоnStripе +ApronPattern +АprоnPаttеrn +ApronChest +АprоnСhеst +ApronChestRuffles +АprоnСhеstRufflеs +ApronChestBelts +АprоnСhеstВеlts +PauldronLeft +PаuldrоnLеft +PauldronLeftStraps +PаuldrоnLеftStrаps +PauldronLeftHardware +PаuldrоnLеftHаrdwаrе +PauldronRight +PаuldrоnRight +PauldronRightStraps +PаuldrоnRightStrаps +GauntletLeft +GаuntlеtLеft +GauntletRight +GаuntlеtRight +Pouches +Pоuсhеs +Belts +Веlts +BeltsHardware +ВеltsHаrdwаrе +SideArmor +SidеАrmоr +ChestArmor +СhеstАrmоr +Corset +Соrsеt +BootLeft +ВооtLеft +BootRight +ВооtRight +BootRightKneel +ВооtRightKnееl +FootBootLeftHogtie +FооtВооtLеftHоgtiе +BootLegLeft +ВооtLеgLеft +BootLegRight +ВооtLеgRight +Pantyhose +Pаntyhоsе +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +Headband +Hеаdbаnd +HeadbandFrill +HеаdbаndFrill +HeadbandRibbon +HеаdbаndRibbоn +HeadbandRibbonBack +HеаdbаndRibbоnВасk +RubyNecklace +RubyNесklасе +RubyChain +RubyСhаin +RubyRing +RubyRing +RubyGem +RubyGеm +RubyNecklaceRestraint +RubyNесklасеRеstrаint +RubyChain +RubyСhаin +RubyRing +RubyRing +RubyGem +RubyGеm +SigilNecklace +SigilNесklасе +SigilChain +SigilСhаin +SigilDisc +SigilDisс +SigilNecklaceRestraint +SigilNесklасеRеstrаint +SigilChain +SigilСhаin +SigilDisc +SigilDisс +MetalNecklace +MеtаlNесklасе +MetalChain +MеtаlСhаin +MetalDisc +MеtаlDisс +MetalNecklaceRestraint +MеtаlNесklасеRеstrаint +MetalChain +MеtаlСhаin +MetalDisc +MеtаlDisс +NecklaceCharm +NесklасеСhаrm +DragonNecklaceRestraint +DrаgоnNесklасеRеstrаint +Necklace +Nесklасе +NecklaceCharm +NесklасеСhаrm +NecklaceCharm +NесklасеСhаrm +CollarHardware +СоllаrHаrdwаrе +CollarHardware +СоllаrHаrdwаrе +CollarHardware +СоllаrHаrdwаrе +CollarHardware +СоllаrHаrdwаrе +CollarHardware +СоllаrHаrdwаrе +CollarHardware +СоllаrHаrdwаrе +BallTeeth +ВаllТееth +BallTeeth +ВаllТееth +BallTeeth +ВаllТееth +BallTeeth +ВаllТееth +BallTeeth +ВаllТееth +BallTeeth +ВаllТееth +CrystalBallGag +СrystаlВаllGаg +Ball +Ваll +Strap +Strаp +CrystalBallGagSmooth +СrystаlВаllGаgSmооth +Ball +Ваll +Strap +Strаp +GagMetalRivetedStrap +GаgMеtаlRivеtеdStrаp +OTN +ОТN +OTNRivets +ОТNRivеts +OTNStrap +ОТNStrаp +OTNStrapRivets +ОТNStrаpRivеts +FashionGagMetalRivetedStrap +FаshiоnGаgMеtаlRivеtеdStrаp +OTN +ОТN +OTNRivets +ОТNRivеts +OTNStrap +ОТNStrаp +OTNStrapRivets +ОТNStrаpRivеts +BallTeeth +ВаllТееth +BallTeeth +ВаllТееth +BallTeeth +ВаllТееth +BallTeeth +ВаllТееth +CrystalGagNecklace +СrystаlGаgNесklасе +CrystalGagNecklaceBall +СrystаlGаgNесklасеВаll +GagNecklace +GаgNесklасе +FashionCrystalGagNecklace +FаshiоnСrystаlGаgNесklасе +CrystalGagNecklaceBall +СrystаlGаgNесklасеВаll +GagNecklace +GаgNесklасе +LeashCollar +LеаshСоllаr +LeashCollarHardware +LеаshСоllаrHаrdwаrе +LeashCollar +LеаshСоllаr +LeashCollarHardware +LеаshСоllаrHаrdwаrе +BootShoeLeft +ВооtShоеLеft +BootShoeRight +ВооtShоеRight +SockLeft +SосkLеft +FootSockLeftHogtie +FооtSосkLеftHоgtiе +SockRight +SосkRight +FootSockRightKneel +FооtSосkRightKnееl +BootShoeLeft +ВооtShоеLеft +BootShoeRight +ВооtShоеRight +Fear +Fеаr +Fear +Fеаr +RubyHardware +RubyHаrdwаrе +RubyHardware +RubyHаrdwаrе +KiguMaskSmile +KiguMаskSmilе +Mask +Mаsk +Eyes +Еyеs +Eyes2 +Еyеs2 +Lock +Lосk +EyesWhites +ЕyеsWhitеs +MouthSmile +MоuthSmilе +FashionKiguMaskSmile +FаshiоnKiguMаskSmilе +Mask +Mаsk +Eyes +Еyеs +Eyes2 +Еyеs2 +Lock +Lосk +EyesWhites +ЕyеsWhitеs +MouthSmile +MоuthSmilе +OneBarTop +ОnеВаrТоp +OneBarPrisonLatex +ОnеВаrPrisоnLаtеx +OneBarTop +ОnеВаrТоp +OneBarFront +ОnеВаrFrоnt +OneBarBack +ОnеВаrВасk +Hide Items +Скрыть предметы +Sort Items +Сортировать предметы +Drop Items +Выкинуть предметы +Filter Items +Фильтр предметов +Rarity +Редкость +Latex +Латекс +Slime +Слизь +Rope +Веревки +Ribbon +Ленты +Cloth +Ткань +Leather +Кожа +Metal +Металл +Cyber +Кибер +Armor +Броня +Special +Особое +Ancient +Древнее +Physical +Физическое +Magical +Магическое +Utility +Полезное +Knives +Ножи +Potions +Зелье +Restoration +Восстановление +Power +Сила +Find In Inventory +Найти в инвентаре +A huge rubber cube rises up out of the floor! +Огромный резиновый куб поднимается из пола! +Latex Cube +Латексный куб +The latex cube hardens into a solid, harmless entity. +Латексный куб затвердевает, превращаясь в твердое, безвредное образование. +The latex cube slowly engulfs you! (DamageTaken) +Латексный куб медленно поглощает вас! (DamageTaken) +The latex cube touches you, spreading latex restraints across your body! (+RestraintAdded) +Латексный куб касается вас, распространяя латексные ограничители по вашему телу! (+RestraintAdded) +A small rubber cube rises up out of the floor! +Маленький резиновый кубик поднимается из пола! +Mini Latex Cube +Латексный мини-кубик +The mini latex cube hardens into a solid, harmless entity. +Латексный мини-кубик затвердевает, превращаясь в твердое, безвредное образование. +The mini latex cube sticks to you! (DamageTaken) +Латексный мини-кубик прилипает к вам! DamageTaken) +The mini latex cube expands across your body, taking the form of restraints! (+RestraintAdded) +Латексный мини-кубик растягивается по вашему телу, принимая форму ограничителей! (+RestraintAdded) +Gigantic Slime +Гигантский слайм +The gigantic slime fizzles as its body becomes unstable! +Гигантский слайм шипит, когда его тело становится нестабильным! +The gigantic slime stretches a pseudopod and engulfs you! (+RestraintAdded) +Гигантский слайм вытягивает псевдококон и поглощает вас! (+RestraintAdded) +The gigantic slime slowly engulfs you! (DamageTaken) +Гигантский слайм медленно поглощает вас! (DamageTaken) +A group of slimes jump out! +Группка слаймов упрыгивает восвояси! +A slime jumps out! +Слайм выскакивает на вас! +A group of speedy slimes jump out! +Группа быстрых слаймов выскакивает на вас! +A speedy slime jumps out! +Быстрый слайм выскакивает на вас! +Chain Sword +Цепной меч +Cut through their defenses and tie them up in the process! +Пробивает их защиту и параллельно с этим связывает! +Deals slash damage. Adds 10 metal binding. +Наносит рубящий урон. Добавляет 10 металлического Сковывания. +You pick up sword with a bunch of chains attached. +Вы находите меч с прикрепленной к нему связкой цепей. +Slime Sword +Слиземеч +It wiggles as you move it around. +Он покачивается, когда вы двигаетесь. +Deals glue damage. Adds 25 slime binding. +Наносит урон Слизью. Добавляет 25 единиц сковывания слизью. +You pick up slime-covered sword. +Вы находите покрытый слизью меч. +Frost Blade +Ледяной клинок +As cold as its creator. +Такой же холодный, как и его создатель. +Deals 20 bonus ice damage and briefly slows the target. +Наносит 20 дополнительного урона от льда и ненадолго замедляет цель. +You pick up an icy sword. +Вы находите ледяной меч. +Targe +Тарджет +Hide behind it while you still can. +Прячьтесь за ним, пока еще можете. ++60 Block. Deals crush damage and stuns for 4 turns. Offhand: Gives the same block bonus. Offhand bonuses from shields do not stack with a currently equipped shield. ++60 Блока. Наносит дробящий урон и оглушает на 4 хода. В левой руке: дает тот же бонус Блока. Бонусы от щита в левой руке не суммируется с бонусами от щита в правой руке. +You pick up a wooden shield. +Вы находите деревянный щит. +Tower Shield +Башенный щит +Now with more leg room. +Теперь больше места для ног. +Slows you down by 1 level. +120 Block, +30 Physical Armor. Deals crush damage and stuns for 7 turns. Offhand: Slows you and gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. ++120 Блока, +30 Физической защиты. Увеличивает уровень замедления на 1. Наносит дробящий урон и оглушает на 7 ходов. В левой руке: Замедляет и дает тот же бонус к блоку и броне. Бонусы от щита в левой руке не суммируется с бонусом от щита в правой руке. +You pick up a metal tower shield. +Вы находите металлический башенный щит. +Reinforced Shield +Усиленный щит +New and improved, but also clumsier. +Новый и улучшенный, но также более нескладный. ++80 Block, +15 Physical Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. ++80 Блока, +15 Физической защиты. Наносит дробящий урон и оглушает на 5 ходов. В левой руке: Дает тот же бонус к блоку и броне. Бонусы от щита в левой руке не суммируется с бонусом от щита в правой руке. +You pick up a reinforced shield. +Вы находите усиленный щит. +Runic Shield +Рунический щит +For when you've been tied up one too many times... +На случай, если вас слишком часто связывали... ++80 Block, +20 Magic Armor. Deals crush damage and stuns for 5 turns. Offhand: Gives the same block and armor bonus. Offhand bonuses from shields do not stack with a currently equipped shield. ++80 Блока, +20 Магической защиты. Наносит дробящий урон и оглушает на 5 ходов. В левой руке: Дает тот же бонус к блоку и броне. Бонусы от щита в левой руке не суммируется с бонусом от щита в правой руке. +You pick up a runic shield. +Вы находите рунический щит. +Vanish +Исчезновение +Select which creature to buff +Выберите, какое существо нужно усилить +Make the targeted creature invisible, making you totally invisible for Duration turns. Attacking and casting spells reveals your presence but you are still harder to see. +Сделайте целевое существо невидимым, что сделает его полностью невидимым на Duration ходов. Атака и произнесение заклинаний раскрывают его присутствие, но его все равно труднее увидеть. +You snap your fingers! +Вы щелкаете пальцами! +The slime dissolves your clothing, leaving nothing but rubber against your skin... +Слизь растворяет вашу одежду, не оставляя на вашей коже ничего, кроме резины... +Riposte +Рипост +Blocking an enemy attack makes them vulnerable and stuns them briefly. +Блокирование вражеской атаки делает врага Уязвимым и ненадолго оглушает. +Parry +Парирование ++15 Block while holding a weapon. ++15 к Блоку с оружием в руке. +Dagger Parry +Парирование кинжалом ++15 Block while holding a light weapon such as a knife or dagger. ++15 к Блоку с легким оружием в руке, таким как нож или кинжал. +Steadfast Guard +Непоколебимая защита ++5 Block for each 100 max willpower you have, while holding a non-light weapon. ++5 Блока за каждые 100 единиц максимальной силы воли, когда вы держите в руках не-легкое оружие. +The Power of Steel +Сила стали ++5 Block for each 100 max willpower you have, while holding a weapon that deals physical damage. ++5 Блока за каждые 100 единиц максимальной силы воли, когда вы держите в руках оружие, наносящее физический урон. +Secure Defense +Надежная защита ++15-30 Block, based on your percentage of Willpower. ++15-30 Блока, в зависимости от вашего процента Силы Воли. +You block the EnemyName attack! +Вы блокируете атаку EnemyName! +You block EnemyName! +Вы блокируете EnemyName! +You dodge EnemyName! +Вы уклоняетесь от EnemyName! +You block the EnemyName! +Вы блокируете EnemyName! +You dodge the EnemyName! +Вы уклоняетесь от EnemyName! +Spell +Заклинание +You resist being bound! +Вы сопротивляетесь сковыванию! +Self Bondage Enthusiast +Энтузиаст самосвязывания +Start with a basic self-bondage kit. +Начните с базовым набором для самосвязывания. +Apprehended +Задержание +When you are bound by an enemy attack or spell, you are stunned 1 turn per restraint added. +Когда вы оказываетесь связаны из-за вражеской атаки или заклинания, вы оглушаетесь на 1 ход за каждый добавленный ограничитель. +Feeble Attacks +Немощные атаки +All enemies gain 20 physical and magic armor. +Все враги получают 20 единиц физической и магической защиты. +Glass Cannon +Стеклянная пушка +The effects of you taking damage are increased by 150%. +Последствия от получения вами урона ухудшаются на 150%. +The Wand is Mightier +Сила волшебной палочки +Enemies have 30% more hp; Tease damage multiplier to bound targets is increased by 85%. +У врагов на 30% больше здоровья; Множитель Дразнящего урона по связанным целям увеличен на 85%. +Kinky Armory +Извращенный арсенал +Chef +Шеф-повар +You defeat the chef and claim her prize. +Вы побеждаете шеф-повара и забираете ее приз. +The chef makes sure you'll never steal again! (DamageTaken) +Шеф-повар решает позаботиться о том, чтобы вы больше никогда не воровали! (DamageTaken) +The chef makes sure you'll never steal again! (+RestraintAdded) +Шеф-повар решает позаботиться о том, чтобы вы больше никогда не воровали! (+RestraintAdded) +The chef spanks you with her frying pan! (DamageTaken) +Шеф-повар шлепает вас своей сковородой! (Нанесен урон) +As you eat, you look up and notice that someone is not very happy with you. +Когда вы начинаете есть, вы поднимаете глаза и замечаете, что кто-то вами не очень доволен. +You find some delicious brownies! +Вы находите вкусные брауни! +Double Fudge Brownie +Брауни с двойной помадкой +You enjoy the brownie one soft, delicious bite at a time. +Вы наслаждаетесь брауни по одному мягкому и вкусному кусочку за раз. +A decadent blend of butter and chocolate topped with fudge and baked to perfection. +Изысканная смесь сливочного масла и шоколада, покрытая сливочной помадкой и запеченная до совершенства. +Restores 30% willpower. Takes a few turns to eat. +Восстанавливает 30% силы воли. Процесс поедания занимает несколько ходов. +A playful ghost now accompanies you on your journey. +Игривый призрак теперь сопровождает вас в вашем путешествии. +The ghost haunting you decides to have a little fun! (+RestraintAdded) +Преследующий вас призрак решает немного повеселиться! (+RestraintAdded) +Hemp Rope +Пеньковая веревка +The most common type of bondage rope. +Самый распространенный вид веревки для бондажа. +Soft and comfy. Great for casual wear! +Мягкая и удобная. Отлично подходит для повседневной носки! +Boxtie +Упряжь для рук. +A box tie keeping your arms secured behind your back. +Вязь, надежно удерживающая ваши руки за спиной. +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Rope Cuffs +Веревочные манжеты +A quick tie for apprehending prisoners. +Быстрая вязь для задержания заключенных. +It's not very secure. +Это не очень надежно. +Chest Straps +Нагрудные ремни +A quick tie for apprehending prisoners. +Быстрая вязь для задержания заключенных. +It's not very secure. +Это не очень надежно. +Chest Harness +Нагрудная упряжь +The finishing touch on a tight and strict piece of ropework. +Последний штрих к тугому и строгому образцу веревочной вязи. +It's not very secure. +Это не очень надежно. +Rope Hogtie +Веревочная кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и тугая вязь, обычно применяемая на кабанах, но также весьма полезная для усмирения непослушных пленников. +It holds you strictly in a boxtie. You tug on the rope connecting your feet and struggle. +Она удерживает ваши руки в строгом положении за спиной. Но вы тянете за веревку, соединяющую ваши ноги, и пытаетесь вырываться. +Rope Hogtie +Веревочная кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и тугая вязь, обычно применяемая на кабанах, но также весьма полезная для усмирения непослушных пленников. +It holds you strictly with your back arched. You tug on the rope connecting your feet and struggle. +Она удерживает вас в очень трудном положении с выгнутой спиной. Но вы можете потянуть за веревку, соединяющую ваши ноги, и попытаться вырываться. +Rope Belt +Верёвочный пояс +A harness acting as a handle to pull you around +Упряжь, служащий ручкой для того, чтобы тянуть вас за собой +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Rope Harness +Верёвочная упряжь +A harness that secures your other restraints and makes them tighter. +Упряжь, которая защищает другие ваши ограничители и плотнее прижимает их к вашему телу. +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Crotch Rope +Веревка для промежности +A tight rope impressing upon your most private areas... +Тугая веревка, воздействующая на ваши самые интимные места... +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Wrist Rope +Верёвка на запястья +A wrist and elbow tie keeping your arms secured behind your back. +Вязь для запястий и локтей, надежно удерживающая ваши руки за спиной. +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Upper Knee Ropes +Веревки (Выше колена) +A tie that hobbles your knees together.. +Вязь, которая стягивает ваши колени.. +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Thigh Ropes +Веревки (Бедра) +A tie that hobbles your legs together.. +Вязь, которая стягивает ваши ноги.. +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Upper Thigh Ropes +Веревки (Верх бедер) +A tie that hobbles your thighs together.. +Вязь, которая стягивает ваши бедра.. +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Ankle Ropes +Верёвка на лодыжки +A tie keeping your feet secured together. +Вязь, которая надежно стягивает ваши ноги друг с другом. +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Lower Leg Ropes +Веревки (Нижняя часть ног) +A tie keeping your feet secured together. +Вязь, которая надежно стягивает ваши ноги друг с другом. +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Lower Knee Ropes +Веревки (Ниже колена) +A tie keeping your knees secured together. +Вязь, которая надежно стягивает ваши колени. +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Toe Rope +Веревка для пальцев ног +A tie keeping your toes tightly together. +Веревка для тугого связывания пальцев ног друг с другом. +The ropes squeeze you gently. +Веревки ласково сжимают вас. +Living Rope Collar +Живой ошейник (Веревки) +This collar is designed to make sure its wearer does not escape their ropes. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не выберется из веревок. +It will occasionally cause ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +Время от времени он призывает веревки из ниоткуда прямо на носителя. Частота срабатывания эффекта увеличивается в зависимости от количества веревок на вашем теле. +Notebook Page +Страница из блокнота +You're going to stay with me for a while~ +Ты останешься со мной на некоторое время~ +That's better! Now stay close to me~ +Так-то лучше! Теперь держись поближе ко мне~ +Looks like our time is coming to an end... +Похоже, наше время подходит к концу... +Time to bring you back to your place~ +Пора вернуть тебя на своё место~ +You've been quite adorable! Until next time~ +Ты была просто очаровательна! До следующего раза~ +It's time for your walk, miss. +Вам пора на прогулку, мисс. +Now let's see, where to go... +Теперь давайте посмотрим, куда мы пойдем... +I think we've reached a stopping point. +Я думаю, мы достигли конца пути. +I have to put you back now~ +Теперь я должна вернуть вас обратно~ +It's been fun playing with you miss! +Было весело играть с вами, мисс! +(reaches for your leash) +(тянется к вашему поводку) +(holds your leash firmly) +(крепко держит ваш поводок) +Mmmmph~ +Ммммфх~ +(giggles) +(хихикает) +(waves goodbye) +(машет на прощание) +Why don't we go for a walk? +Почему бы нам не пойти на прогулку? +That's better! Now come along~ +Так-то лучше! А теперь пойдем~ +This has been lots of fun! +Было очень весело! +I have to go return you~ +Мне нужно вернуть тебя обратно~ +Good girl~ Let's go again later~ +Хорошая девочка~ Давай прогуляемся еще разок попозже~ +It's time for walkies! +Пришло время для прогулки! +That's a good girl! +Хорошая девочка! +I want to keep you longer, but I've got things to do. +Я хочу побыть с тобой подольше, но у меня есть дела. +It's time to go back to your little house~ +Пора возвращаться в твой маленький домик~ +(pats you on the head) +(гладит вас по голове) +It is time for your mandatory exercise. +Пришло время для твоих обязательных упражнений. +Please maintain proximity. +Пожалуйста, оставайся поблизости. +Progress Level: 90% +Уровень прогресса: 90% +Exercise complete. Returning to storage. +Упражнение выполнено. Возвращаемся в хранилище. +Uploading logs to database. Error... no connection. +Загружаем логи в базу данных. Ошибка... нет подключения. +Latex Mimic +Латексный мимик +The latex mimic melts into a shiny puddle. +Латексный мимик истаивает, образуя блестящую лужицу. +The latex mimic spits out a glob of rubber at you! (+RestraintAdded) +Латексный мимик выплевывает в вас шарик резины! (+RestraintAdded) +The latex mimic stretches out an appendage and pulls you toward it! (DamageTaken) +Латексный мимик вытягивает придаток и притягивает вас к себе! (DamageTaken) +The latex mimic engulfs you in sticky rubber! (DamageTaken) +Латексный мимик окутывает вас липкой резиной! (DamageTaken) +Back to Menu +Вернуться в меню +Item Stack: +Наложение предметов: +Ancient +Древнее +Cursed +Проклятое +Heavy +Тяжелое +Mage +Магическое +Light +Легкое +Accessory +Аксессуары +Restraint +Ограничители +Armor +Броня +Special +Особое +Enchanted +Зачарованное +Mundane +Обычное +Can Disassemble +Возможна разборка +Raw Material +Исходный материал +Rope +Веревки +Metal +Металл +Latex +Латекс +Leather +Кожа +Armbinders +Армбиндеры +Legbinders +Легбиндеры +Boxbinders +Сумки для рук +Devices +Устройства +Toys +Игрушки +Collars +Ошейники +Jackets +Смир. Рубашки +Dresses +Платья +Ties +Вязь +Belts +Ремни +Wrapping +Бинты +Cuffs +Манжеты +Chains +Цепи +Corsets +Корсеты +Gags +Кляпы +Harnesses +Упряжи +Mittens +Варежки +Boots +Обувь +Toys +Игрушки +C. Belts +Пояса Ц. +C. Bras +Бюстг. Ц. +Cyber +Кибер +Maid +Горничная +Utility +Полезное +Enchanted +Зачарованное +Unlocked +Разблок. +Locked +Заблок. +Accessible +Доступное +Inaccessible +Недоступное +Quick-Bind +Быстр.связ. +Tape +Ленты +Head +Голова +Neck +Шея +Arms +Руки +Gloves +Перчатки +Chest +Грудь +Torso +Торс +Panties +Трусики +Lower +Низ +Ankles +Лодыжки +Boots +Обувь +Spellbound Rope +Заколдованная веревка +An enchanted rope with a powerful sealing spell. It cannot be cut by mundane means. +Заколдованная веревка с мощным запечатывающим заклинанием. Ее нельзя перерезать обычными средствами. +It almost has a kinky mind of its own. +У нее почти что свой собственный извращенный разум. +Spellbound Boxtie +Зачарованная упряжь для рук +A box tie keeping your arms secured behind your back. +Вязь, надежно удерживающая ваши руки за спиной. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Rope Cuffs +Зачарованные верёвочные манжеты +A quick tie for apprehending prisoners. +Быстрая вязь для задержания заключенных. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Ropework +Зачарованная веревочная вязь +A quick tie for apprehending prisoners, looped through buckles on the hand restraints. +Быстрая вязь для задержания заключенных, продеваемая через пряжки на ограничителях для рук. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Strict Spellbound Ropework +Зачарованная строгая веревочная вязь +The finishing touches on a tight and strict piece of ropework. +Последние штрихи к тугому и строгому образцу веревочной вязи. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Hogtie +Зачарованная кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и тугая вязь, обычно применяемая на кабанах, но также весьма полезная для усмирения непослушных пленников. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Hogtie +Зачарованная кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и тугая вязь, обычно применяемая на кабанах, но также весьма полезная для усмирения непослушных пленников. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Rope Belt +Зачарованный веревочный ремень +A harness acting as a handle to pull you around +Упряжь, служащий ручкой для того, чтобы тянуть вас за собой +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Harness +Зачарованная упряжь +A harness that secures your other restraints and makes them tighter. +Упряжь, которая закрепляет другие ваши ограничители и делает их более тугими. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Crotch Rope +Зачарованная веревка для промежности +A tight rope impressing upon your most private areas... +Тугая веревка, воздействующая на ваши самые интимные зоны... +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Wrist Tie +Зачарованная вязь (Запястья) +A wrist and elbow tie keeping your arms secured behind your back. +Вязь для запястий и локтей, надежно удерживающая ваши руки за спиной. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Knees +Зачарованная вязь (Колени) +A tie that hobbles your knees together.. +Вязь, которая стягивает ваши колени.. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Thighs +Зачарованная вязь (Бедра) +A tie that holds your legs together.. +Вязь, которая стягивает ваши ноги.. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Upper Thighs +Зачарованная вязь (Верх бедер) +A tie that holds your thighs together.. +Вязь, которая стягивает ваши бедра.. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Ankles +Зачарованная вязь (Лодыжки) +A tie keeping your feet secured together. +Вязь, которая надежно стягивает ваши ноги друг с другом. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Lower Legs +Зачарованная вязь (Низ ног) +A tie keeping your legs secured together. +Вязь, которая надежно стягивает ваши ноги. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Lower Knees +Зачарованная вязь (Ниже колена) +A tie keeping your knees secured together. +Вязь, которая надежно стягивает ваши колени. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Spellbound Toe Rope +Зачарованная веревка на пальцы ног +A tie keeping your toes secured together. +Веревка для надежного связывания пальцев ног друг с другом. +The knots appear to tie themselves together again, making them impossible to undo! +Узлы, кажется, снова затягиваются сами собой, что делает невозможным их развязывание! +Living Spellbound Rope Collar +Живой ошейник (Зачарованные веревки) +This collar is designed to make sure its wearer does not escape their ropes. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не выберется из веревок. +It will occasionally cause spellbound ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +Время от времени он призывает зачарованные веревки из ниоткуда прямо на носителя. Частота срабатывания эффекта увеличивается в зависимости от количества веревок на вашем теле. +Magic Rope +Магическая веревка +A novice-level enchanted rope, relatively trivial to untie but resistant to mundane tools. +Зачарованная веревка для начинающих, ее относительно просто развязать, но она устойчива к воздействию обычных инструментов. +Faintly glows with traces of devious thoughts. +Слабо светится от следов коварных замыслов. +Magic Boxtie +Магическая упряжь для рук +A box tie keeping your arms secured behind your back. +Вязь, надежно удерживающая ваши руки за спиной. +They glow with a trace of magic. +Она светится следами магии. +Magic Rope Cuffs +Магические веревочные манжеты +A quick tie for apprehending prisoners. +Быстрая вязь для задержания заключенных. +It's not very secure. +Это не очень надежно. +Magic Ropework +Магическая веревочная вязь +A quick tie for apprehending prisoners, looped through buckles on the hand restraints. +Быстрая вязь для задержания заключенных, продеваемая через пряжки на ограничителях для рук. +It's not very secure. +Это не очень надежно. +Strict Magic Ropework +Магическая строгая веревочная вязь +The finishing touches on a tight and strict piece of ropework. +Последние штрихи к тугому и строгому образцу веревочной вязи. +It's not very secure. +Это не очень надежно. +Magic Hogtie +Магическая кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и тугая вязь, обычно применяемая на кабанах, но также весьма полезная для усмирения непослушных пленников. +It's very secure. You tug on the rope connecting your feet and struggle. +Она очень надежна. Вы дергаете за веревку, соединяющую ваши ноги, в попытках борьбы. +Magic Hogtie +Магическая кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и тугая вязь, обычно применяемая на кабанах, но также весьма полезная для усмирения непослушных пленников. +It's very secure. You tug on the rope connecting your feet and struggle. +Она очень надежна. Вы дергаете за веревку, соединяющую ваши ноги, в попытках борьбы. +Magic Rope Belt +Магический веревочный пояс +A harness acting as a handle to pull you around +Упряжь, служащий ручкой для того, чтобы тянуть вас за собой +They glow with a trace of magic. +Она светится следами магии. +Magic Harness +Магическая упряжь +A harness that secures your other restraints and makes them tighter. +Упряжь, которая закрепляет другие ваши ограничители и делает их более тугими. +They glow with a trace of magic. +Она светится следами магии. +Magic Crotch Rope +Магическая веревка (Промежность) +A tight rope impressing upon your most private areas... +Тугая веревка, воздействующая на ваши самые интимные зоны... +They glow with a trace of magic. +Она светится следами магии. +Magic Wrist Tie +Магическая вязь (Запястья) +A wrist and elbow tie keeping your arms secured behind your back. +Вязь для запястий и локтей, надежно удерживающая ваши руки за спиной. +They glow with a trace of magic. +Она светится следами магии. +Magic Knee Tie +Магическая вязь (Колени) +A tie that hobbles your knees together.. +Вязь, которая стягивает ваши колени.. +They glow with a trace of magic. +Она светится следами магии. +Magic Thigh Ropes +Магические веревки (Бедра) +A tie that hobbles your legs together.. +Вязь, которая стреноживает ваши ноги.. +They glow with a trace of magic. +Она светится следами магии. +Magic Upper Thigh Ropes +Магические веревки (Верх бедер) +A tie that hobbles your thighs together.. +Вязь, которая стягивает ваши бедра.. +They glow with a trace of magic. +Она светится следами магии. +Magic Ankle Tie +Магическая вязь на лодыжки +A tie keeping your feet secured together. +Вязь, которая надежно стягивает ваши ноги друг с другом. +They glow with a trace of magic. +Она светится следами магии. +Magic Lower Leg Tie +Магическая вязь (Низ ног) +A tie keeping your legs secured together. +Вязь, которая надежно стягивает ваши ноги. +They glow with a trace of magic. +Она светится следами магии. +Magic Lower Knee Tie +Магическая вязь (Ниже колена) +A tie keeping your knees secured together. +Вязь, которая надежно стягивает ваши колени. +They glow with a trace of magic. +Она светится следами магии. +Magic Toe Rope +Магическая веревка на пальцы ног +A tie keeping your toes secured together. +Веревка для надежного связывания пальцев ног друг с другом. +They glow with a trace of magic. +Она светится следами магии. +Living Magic Rope Collar +Живой ошейник (Магические веревки) +This collar is designed to make sure its wearer does not escape their ropes. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не выберется из веревок. +It will occasionally cause magic ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +Время от времени он призывает магические веревки из ниоткуда прямо на носителя. Частота срабатывания эффекта увеличивается в зависимости от количества веревок на вашем теле. +Celestial Rope +Небесная веревка +Rope that has been exposed to solar energies. +Веревка, подвергшаяся воздействию энергии солнца. +Squeezes the wearer if she tries to escape, so that she knows her place. +Сжимает носительницу, если она пытается выбраться, чтобы она знала свое место. +Holy Boxtie +Священная упряжь для рук +A box tie keeping your arms secured behind your back. +Вязь, надежно удерживающая ваши руки за спиной. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Rope Cuffs +Манжеты из священной веревки +A quick tie for apprehending prisoners. +Быстрая вязь для задержания заключенных. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Ropework +Священная верёвочная вязь +A quick tie for apprehending prisoners, looped through buckles on the hand restraints. +Быстрая вязь для задержания заключенных, продеваемая через пряжки на ограничителях для рук. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Strict Holy Ropework +Священная строгая веревочная вязь +The finishing touches on a tight and strict piece of ropework. +Последние штрихи к тугому и строгому образцу веревочной вязи. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Hogtie +Священная кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и тугая вязь, обычно применяемая на кабанах, но также весьма полезная для усмирения непослушных пленников. +It holds you strictly in a boxtie. You tug on the rope connecting your feet and struggle. +Она удерживает ваши руки в строгом положении за спиной. Но вы тянете за веревку, соединяющую ваши ноги, и пытаетесь вырываться. +Holy Hogtie +Священная кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и тугая вязь, обычно применяемая на кабанах, но также весьма полезная для усмирения непослушных пленников. +It holds you strictly with your back arched. You tug on the rope connecting your feet and struggle. +Она удерживает вас в очень трудном положении с выгнутой спиной. Но вы можете потянуть за веревку, соединяющую ваши ноги, и попытаться вырываться. +Holy Rope Belt +Священный веревочный ремень +A harness acting as a handle to pull you around +Упряжь, служащий ручкой для того, чтобы тянуть вас за собой +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Rope Harness +Священная веревочная упряжь +A harness that secures your other restraints and makes them tighter. +Упряжь, которая закрепляет другие ваши ограничители и делает их более тугими. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Crotch Rope +Священная веревка для промежности +A tight rope impressing upon your most private areas... +Тугая веревка, воздействующая на ваши самые интимные зоны... +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Wrist Rope +Священная веревка (Запястья) +A wrist and elbow tie keeping your arms secured behind your back. +Вязь для запястий и локтей, надежно удерживающая ваши руки за спиной. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Upper Knee Ropes +Священная веревка (Выше колена) +A tie that hobbles your knees together.. +Вязь, которая стягивает ваши колени.. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Thigh Ropes +Священная веревка (Бедра) +A tie that hobbles your legs together.. +Вязь, которая стреноживает ваши ноги.. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Upper Thigh Ropes +Священная веревка (Верх бедер) +A tie that holds your thighs together.. +Вязь, которая стягивает ваши бедра.. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Ankle Ropes +Священная веревка на лодыжки +A tie keeping your feet secured together. +Вязь, которая надежно стягивает ваши ноги друг с другом. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Lower Leg Ropes +Священная веревка (Низ ног) +A tie keeping your legs secured together. +Вязь, которая надежно стягивает ваши ноги. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Lower Knee Ropes +Священная веревка (Ниже колена) +A tie keeping your knees secured together. +Вязь, которая надежно стягивает ваши колени. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Holy Toe Rope +Священная веревка для пальцев ног +A tie keeping your toes secured together. +Веревка для надежного связывания пальцев ног друг с другом. +A set of ropes that emit a calm, soothing aura. They magically stretch to fit your body. +Набор веревок, которые излучают спокойную, умиротворяющую ауру. Они волшебным образом растягиваются, приспосабливаясь к вашему телу. +Living Holy Rope Collar +Живой ошейник (Священные веревки) +This collar is designed to make sure its wearer does not escape their ropes. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не выберется из веревок. +It will occasionally cause holy ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +Время от времени он призывает священные веревки из ниоткуда прямо на носителя. Частота срабатывания эффекта увеличивается в зависимости от количества веревок на вашем теле. +Mithril Rope +Мифриловая веревка +Rope made from silver thread, exposed to lunar energies. +Веревка, изготовленная из серебряной нити, подвергшаяся воздействию энергии луны. +Lightweight yet unyielding. Truly a high class rope. +Легкая, но прочная. Веревка действительно высокого класса. +Mithril Boxtie +Мифриловая упряжь для рук +A box tie keeping your arms secured behind your back. +Вязь, надежно удерживающая ваши руки за спиной. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Rope Cuffs +Манжеты из мифриловой веревки +A quick tie for apprehending prisoners. +Быстрая вязь для задержания заключенных. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Ropework +Мифриловая веревочная вязь +A quick tie for apprehending prisoners, looped through buckles on the hand restraints. +Быстрая вязь для задержания заключенных, продеваемая через пряжки на ограничителях для рук. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Strict Mithril Ropework +Мифриловая строгая веревочная вязь +The finishing touches on a tight and strict piece of ropework. +Последние штрихи к тугому и строгому образцу веревочной вязи. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Hogtie +Мифриловая кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и тугая вязь, обычно применяемая на кабанах, но также весьма полезная для усмирения непослушных пленников. +It holds you strictly in a boxtie. You tug on the rope connecting your feet and struggle. +Она удерживает ваши руки в строгом положении за спиной. Но вы тянете за веревку, соединяющую ваши ноги, и пытаетесь вырываться. +Mithril Hogtie +Мифриловая кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и тугая вязь, обычно применяемая на кабанах, но также весьма полезная для усмирения непослушных пленников. +It holds you strictly with your back arched. You tug on the rope connecting your feet and struggle. +Она удерживает вас в очень трудном положении с выгнутой спиной. Но вы можете потянуть за веревку, соединяющую ваши ноги, и попытаться вырываться. +Mithril Rope Belt +Пояс из мифриловой веревки +A harness acting as a handle to pull you around +Упряжь, служащий ручкой для того, чтобы тянуть вас за собой +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Rope Harness +Мифриловая веревочная упряжь +A harness that secures your other restraints and makes them tighter. +Упряжь, которая защищает другие ваши ограничители и плотнее прижимает их к вашему телу. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Crotch Rope +Мифриловая веревка для промежности +A tight rope impressing upon your most private areas... +Тугая веревка, воздействующая на ваши самые интимные места... +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Wrist Rope +Мифриловая веревка (Запястья) +A wrist and elbow tie keeping your arms secured behind your back. +Вязь для запястий и локтей, надежно удерживающая ваши руки за спиной. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Lower Knee Ropes +Мифриловая веревка (Ниже колена) +A tie that hobbles your knees together.. +Вязь, которая стягивает ваши колени.. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Thigh Ropes +Мифриловая веревка (Бедра) +A tie that hobbles your thighs together.. +Вязь, которая стягивает ваши бедра.. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Upper Thigh Ropes +Мифриловая веревка (Верх бедер) +A tie that holds your thighs together.. +Вязь, которая стягивает ваши бедра.. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Ankle Ropes +Мифриловая веревка на лодыжки +A tie keeping your feet secured together. +Вязь, которая надежно стягивает ваши ноги друг с другом. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Lower Leg Ropes +Мифриловая веревка (Низ ног) +A tie keeping your legs secured together. +Вязь, которая надежно стягивает ваши ноги. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Lower Knee Ropes +Мифриловая веревка (Ниже колена) +A tie keeping your knees secured together. +Вязь, которая надежно стягивает ваши колени. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Mithril Toe Ropes +Мифриловая веревка для пальцев ног +A tie keeping your toes secured together. +Веревка для надежного связывания пальцев ног друг с другом. +A lightweight rope made out of woven mithril, smooth yet nearly unbreakable. +Легкая веревка, сделанная из переплетенных мифриловых нитей, гибкая, но почти неразрывная. +Living Mithril Rope Collar +Живой ошейник (Мифриловые веревки) +This collar is designed to make sure its wearer does not escape their ropes. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не выберется из веревок. +It will occasionally cause mithril ropes to appear out of nowhere and bind the wearer. Effect increases in speed based on the number of ropes you have on you. +Время от времени он призывает мифриловые веревки из ниоткуда прямо на носителя. Частота срабатывания эффекта увеличивается в зависимости от количества веревок на вашем теле. +Dark Portal +Темный портал +They are trying to take you somewhere! +Они пытаются куда-то вас утащить! +Essence Mote +Частица сущности +A trainee can use this to focus. +Стажер может использовать её для того, чтобы сосредоточиться. +Essence Mote +Частица сущности +Pick this up to gain decaying miscast reduction. +Поднимите её, чтобы уменьшить вероятность осечки. +Seal Sigil +Символ Печати +Walk over it to erase it and unlock the next floor. +Пройдите по нему, чтобы стереть его и открыть путь на следующий этаж. +The Shadow +Тень +The Shadow is exorcised... for now. +Тень изгнана... на данный момент. +The Shadow overwhelms you with its power... (+RestraintAdded) +Тень подавляет вас своей мощью... (+RestraintAdded) +The Shadow welcomes you to your new future. (DamageTaken) +Тень приветствует вас в вашем новом будущем. (DamageTaken) +The Shadow cackles as your restraints are sealed! (DamageTaken) +Тень хихикает, а ваши ограничители запечатываются! (DamageTaken) +The Shadow smiles and vanishes. +Тень улыбается и исчезает. +The Shadow smiles and vanishes, leaving you locked in a mysterious RNAME... +Тень улыбается и исчезает, оставляя вас запертыми в мистическом RNAME... +Observer +Наблюдатель +The observer is banished into the aether. +Наблюдатель изгнан в эфир. +From the Beyond +Из Запределья +You briefly spot your reflection as a reflective cube appears! +Вы мельком вглядываетесь свое отражение, замечая появившийся блестящий куб! +Mini Metal Cube +Металлический мини-куб +The liquid metal cube shatters into glittering dust. +Куб из жидкого металла рассыпается в сверкающую пыль. +The liquid metal cube sticks to you and hardens! (DamageTaken) +Куб из жидкого металла прилипает к вам и затвердевает! (DamageTaken) +The liquid metal cube expands across your body and hardens, taking the form of restraints! (+RestraintAdded) +Куб из жидкого металла расплывается по вашему телу и затвердевает, принимая форму ограничителей! (+RestraintAdded) +Liquid Metal +Жидкий металл +Primordial latex infused with mineral form. +Первичный латекс с добавлением минералов. +Heavy and weighs the wearer down. +Тяжелый сам по себе, а также утяжеляет носящего. +Liquid Metal (Feet) +Жидкий металл (Ступни) +A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. +Металлическая субстанция, одновременно гибкая и твердая. Её вес тянет вас вниз, уменьшая уклонение. Также хорошо проводит электричество. +Forming a skintight layer, it will be quite difficult to escape this. +Субстанция образует обегающий ваше тело слой, от неё будет не так то просто отделаться. +Liquid Metal (Ankles) +Жидкий металл (Лодыжки) +A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. +Металлическая субстанция, одновременно гибкая и твердая. Её вес тянет вас вниз, уменьшая уклонение. Также хорошо проводит электричество. +Forming a skintight layer, it will be quite difficult to escape this. +Субстанция образует обегающий ваше тело слой, от неё будет не так то просто отделаться. +Liquid Metal (Legs) +Жидкий металл (Ноги) +A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. +Металлическая субстанция, одновременно гибкая и твердая. Её вес тянет вас вниз, уменьшая уклонение. Также хорошо проводит электричество. +Forming a skintight layer, it will be quite difficult to escape this. +Субстанция образует обегающий ваше тело слой, от неё будет не так то просто отделаться. +Liquid Metal (Arms) +Жидкий металл (Руки) +A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. +Металлическая субстанция, одновременно гибкая и твердая. Её вес тянет вас вниз, уменьшая уклонение. Также хорошо проводит электричество. +Forming a skintight layer, it will be quite difficult to escape this. +Субстанция образует обегающий ваше тело слой, от неё будет не так то просто отделаться. +Liquid Metal (Hands) +Жидкий металл (Кисти) +A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. +Металлическая субстанция, одновременно гибкая и твердая. Её вес тянет вас вниз, уменьшая уклонение. Также хорошо проводит электричество. +Forming a skintight layer, it will be quite difficult to escape this. +Субстанция образует обегающий ваше тело слой, от неё будет не так то просто отделаться. +Liquid Metal (Mouth) +Жидкий металл (Рот) +A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. +Металлическая субстанция, одновременно гибкая и твердая. Её вес тянет вас вниз, уменьшая уклонение. Также хорошо проводит электричество. +Forming a skintight layer, it will be quite difficult to escape this. +Субстанция образует обегающий ваше тело слой, от неё будет не так то просто отделаться. +Liquid Metal (Head) +Жидкий металл (Голова) +A metallic substance that is both flexible and hard. It weighs you down, reducing evasion, and conducts electricity. +Металлическая субстанция, одновременно гибкая и твердая. Её вес тянет вас вниз, уменьшая уклонение. Также хорошо проводит электричество. +Forming a skintight layer, it will be quite difficult to escape this. +Субстанция образует обегающий ваше тело слой, от неё будет не так то просто отделаться. +Living Liquid Metal Collar +Живой ошейник (Жидкий металл) +This collar is designed to make sure its wearer does not escape the metal. +Этот ошейник предназначен для того, чтобы убедиться, что его носитель не выберется из металла. +It will occasionally cause liquid metal to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of liquid metal you have on you. +Время от времени он призывает жидкий металл из ниоткуда и сковывает им носителя. Частота срабатывания эффекта увеличивается в зависимости от количества жидкого металла на вашем теле. +The stairs dissolve right before you! +Лестница растворяется прямо на ваших глазах! +The stairs dissolve as you step onto them, pulling you with them to somewhere else. +Лестница растворяется, когда вы ступаете на нее, увлекая вас за собой куда-то в иное место. +A dark energy enters your body... (DamageDealt) +Темная энергия проникает в ваше тело... (DamageDealt) +A dark energy lurks within you. +Темная энергия скрывается внутри вас. +You succumb to a dark desire... (+RestraintAdded) +Вы поддаетесь темному желанию... (+RestraintAdded) +Observer's Gaze +Взор наблюдателя +Industrial Tape Wand +Промышленный пленочный жезл +A non-magical tape wand used for creating tight little packages. +Немагический пленочный жезл, используемый для создания маленьких плотных упаковок. +Deals chain damage. 200% binding efficiency. Hitting an enemy applies the Taped debuff for 12 turns, increasing Chain damage to them by 15%. Deal 10 chain damage to adjacent Taped enemies while moving. +Наносит Цепной урон. Эффективность сковывания 200%. Удар по врагу накладывает дебафф 'Упаковка' на 12 ходов, увеличивая получаемый им Цепной урон на 15%. Наносит 10 Цепного урона находящимся рядом врагам в 'Упаковке' во время перемещения. +You pick up a staff of chains. You have fond memories... +Вы подбираете Посох цепей. В вашей памяти всплывают приятные воспоминания... +Bag of Goodies +Сумка с приятностями +Someone's secret stash. +Чей-то тайный запас. +Deals charm damage. Applies a toy to targets hit for 40 turns. Offhand: Applies a toy to targets you hit. +Наносит урон Очарованием. Прикрепляет игрушки к пораженным целям на 40 ходов. В левой руке: Прикрепляет игрушки к целям ваших ударов. +You find a bag filled with various toys and vibrators... +Вы находите сумку, наполненную различными игрушками и вибраторами... +You play with yourself using some of the toys in the bag... +Вы играете с собой, используя некоторые игрушки из сумки... +Magic Remote +Магический пульт +The key to absolute power. +Ключ к абсолютной власти. +Triggers long-duration edging on basic attack if the target has a toy. Offhand: Applies short-duration teasing to targets you hit. +Запускает долговременное удержание на грани при базовой атаке, если у цели есть игрушка. В левой руке: Запускает кратковременное поддразнивание у целей ваших ударов. +You find a bag filled with various toys and vibrators... +Вы находите сумку, наполненную различными игрушками и вибраторами... +Vibrator Remote +Пульт от вибратора +Select an area +Выберите область +You click the remote and hear a buzzing noise! +Вы нажимаете кнопку на пульте дистанционного управления и слышите жужжание! +15 charge to powerfully activate vibrators in an area for 15 turns. +15 заряда для активации вибраторов в усиленном режиме в области на 15 ходов. +Vibrator Remote +Пульт от вибратора +Select an area +Выберите область +You click the remote and hear a buzzing noise! +Вы нажимаете кнопку на пульте дистанционного управления и слышите жужжание! +10 charge to activate vibrators in an area for 15 turns. +10 заряда для активации вибраторов в области на 15 ходов. +You find a golden crystal. It glows faintly. +Вы находите золотой кристалл. Он слабо светится. +You find a dull, gold-tinted crystal. +Вы находите тусклый кристалл с золотистым оттенком. +Save Loadout +Сохранить экипировку +Rubber Stick +Резиновая палка +A rubber cylinder without any lewd intentions whatsoever. +Резиновый цилиндр без какого-либо непристойного предназначения. +Deals grope damage. +Наносит урон ощупыванием. +You pick up a flexible rubber stick. +Вы находите гибкую резиновую палку. +Blade of Ejahl +Клинок Эджал +A piece of prized ancient equipment. Magical energy causes it to vibrate intensely. What could it have been used for? +Часть ценного древнего снаряжения. Магическая энергия заставляет его интенсивно вибрировать. Для чего это бы могло быть использовано? +Deals grope damage. Can spend 40 charge to add charm damage per hit for 10 turns. +Наносит урон ощупыванием. Можно потратить 40 заряда, чтобы добавить урон очарованием при ударе на 10 ходов. +You retrieve the Blade of Ejahl. +Вы находите клинок Клинок Эджал. +Intense Vibrations: The Blade of Ejahl deals bonus charm damage!!! +Интенсивные вибрации: Клинок Эджал наносит дополнительный урон от Очарования!!!¶ +The Blade of Fla-peh buzzes with great power! +Клинок Фла'пех жужжит с огромной силой! +40 charge to deal 30 charm damage per hit for 10 turns. +40 заряда чтобы наносить 30 урона Очарованием за удар в течении 10 ходов. +Enchanted Rope +Зачарованная веревка +She who lives by the rope, is tied up by the rope. +Та, кто 'живет на веревке', связана веревкой. +Deals chain damage and applies 50 points of rope binding. Draws 10 mana per hit to apply 50 extra points of magical binding. If you don't have mana, you fail to control the rope... +Наносит цепной урон и накладывает 50 очков Сковывания верёвками. Потребляет 10 единиц маны за удар, чтобы применить 50 дополнительных единиц магического Сковывания. Если у вас нет маны, вы не сможете контролировать веревку... +You find some enchanted rope. +Вы находите зачарованную веревку. +Without mana to control it, the enchanted rope springs back upon you! +Без маны для управления ею зачарованная веревка бросается к вам! +Light Bow +Легкий лук +Pointy stick delivery system. +Система доставки заостренных палок. +Reload time: None. Deals crush damage on melee. Draws 10 charge and 20 stamina to fire an ordinary arrow, dealing 30 pierce damage. +Время перезарядки: Нет. Наносит дробящий урон в ближнем бою. Для выстрела обычной стрелой требуется 10 заряда и 20 выносливости, наносит 30 единиц пронзающего урона. +You find a wooden bow. +Вы находите деревянный лук. +10 charge to fire an arrow. Deals 30 pierce damage. +10 заряда для выстрела стрелой. Наносит 30 единиц пронзающего урона. +Choose projectile path +Выберите траекторию полета снаряда +Arrow +Стрела +You loose an arrow! +Вы выпускаете стрелу! +Fire Arrows +Огненные стрелы +Converts arrows to fire arrows for 30 extra charge, which deal the arrow damage plus 20 as fire damage in a 3x3 area and stuns briefly. +Преобразует стрелы в огненные за дополнительную плату в 30 заряда. Они наносят обычный урон стрелы плюс 20 единиц урона от огня в зоне 3х3 и ненадолго оглушают. +You switch to using fire arrows. +Вы переключаетесь на использование огненных стрел. +Fire Arrow +Огненная стрела +Vine Arrows +Стрелы-лозы +Converts arrows to all-natural organic versions for 20 extra charge, which apply 80 binding to the target and deal chain damage instead. +Преобразует стрелы в полностью натуральные органические версии за 20 дополнительного заряда. Они накладывают на цель 80 Сковывания и вместо обычного наносят Цепной урон. +You switch to using vine arrows. +Вы переключаетесь на использование стрел-лоз. +Vine Arrow +Стрела-лоза +A sudden burst of vines overtakes you as you find yourself wrapped up tightly! +Вы попадаете под внезапное буйство лоз, и обнаруживаете, что крепко связаны! +You find a bow and a glowing crystal. The bow is scribed with runes of duplication. +Вы находите лук и светящийся кристалл. Лук исписан рунами дупликации. +Crossbow +Арбалет +Watch where you're pointing that thing! +Смотри, куда направляешь эту штуку! +Reload time: 3 stationary turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 65 pierce damage. +Время перезарядки: 3 хода без движения. Наносит дробящий урон в ближнем бою. Потребляет 15 заряда и не требует выносливости для выстрела обычной стрелой, которая нанесет 65 единиц пронзающего урона. +You find a crossbow. +Вы находите арбалет. +20 charge to fire a bolt. Deals 65 pierce damage. +20 заряда для выстрела болтом. Наносит 65 ед. пронзающего урона. +Choose projectile path +Выберите траекторию полета снаряда +Bolt +Болт +You pull the trigger! +Вы нажимаете на спусковой крючок! +Your RestraintName melts off! +Ваше RestraintName тает! +Your RestraintName melts faster with the application of fire! +Ваше RestraintName тает быстрее из-за воздействия огня! +Your RestraintName hardens with the application of frost! +Ваше RestraintName затвердевает из-за воздействия холода! +Unique +Уник. +dmg +урн. +AMNT Evasion +AMNT Уклонение +AMNT% Accuracy +AMNT% Точность +AMNT Magic Armor +AMNT Магическая защита +AMNT Physical Armor +AMNT Физическая защита +AMNT Bondage Resist +AMNT Сопротивление сковыванию +AMNT TYPE Resist +AMNT TYPE Сопротивление +AMNT% TYPE Damage +AMNT% TYPE Урона +AMNT% weapon phys. dmg +AMNT% физ. урон оружия +AMNT% weapon magic dmg +AMNT% маг. урон оружия +Infuse weapon AMNT% TYPE +Инфузия оружия AMNT% TYPE +AMNT TYPE on attack +AMNT TYPE за атаку +AMNT Mana Efficiency +AMNT Эффективность Маны +AMNT TYPE Mana Efficiency +AMNT TYPE Эффективность Маны +AMNT% regen from mana pool +AMNT% восстановление из резерва маны +AMNT mana pool on capture +AMNT резерва маны при захвате +AMNT% Visibility Reduction +AMNT% Снижение заметности +AMNT Distraction Decay +AMNT Спад возбуждения +AMNT Distraction Per Turn +AMNT возбуждения за ход +AMNT AP from attacks +AMNT AP от атак +After attacking with a teasing weapon: +После атаки дразнящим оружием: +Gain AMNT% Spell Damage for DRTN turns +Дает AMNT% к Урону Заклинаний на DRTN ходов +Drains mana from the wearer. +Высасывает ману из носителя. +AMNT Stat +AMNT Стат. +Drop On Floor +Выкинуть на пол +Remove +Снять +Unlock +Разблокировать +Struggle +Бороться +Leyline Map +Карта Лей-линий +Harness Plug Gag +Кляп-затычка с упряжью +A gag meant to keep people quiet by forcing a plug into their mouth and securing it in place with a strict harness. +Кляп, предназначенный для того, чтобы заставить людей замолчать, вставляя затычку в рот и закрепляя ее на месте с помощью строгой упряжи. +It is difficult to pull off and though it is made from supple, heavy duty leather. +Его трудно стянуть, и он сделан из упругой, сверхпрочной кожи. +Your OLDITM transforms into NEWITM! +Ваше OLDITM превращается в NEWITM! +Your OLDITM gains new properties! +Ваше OLDITM приобретает новые свойства! +Moon-Cursed Epicenter +Эпицентр лунного проклятия +The cursed epicenter disperses into black stardust. +Эпицентр проклятия рассеивается в черную звездную пыль. +The cursed epicenter retreats as you remove the last of your cursed restraints! +Эпицентр проклятия отступает, когда вы снимаете последние из своих проклятых оков! +The cursed epicenter retreats as you are claimed by something else! +Эпицентр проклятия отступает, поскольку на вас претендует кто-то другой! +The cursed epicenter assaults your mind with its presence! (DamageDealt) +Эпицентр проклятия атакует ваш разум своим присутствием! (DamageDealt) +You feel your cursed items turn cold to the touch! +Вы чувствуете, что ваши проклятые предметы становятся холодными на ощупь! +An cursed collar appears around your neck, feeling cold to the touch. +На вашей шее появляется холодный проклятый ошейник. +Cursing Sigil +Знак проклятия +A cursing sigil appears on the ground! +На земле появляется знак проклятия! +You are being cursed!!! +На вас наложено проклятие!!! +Star-Cursed Epicenter +Эпицентр звездного проклятия +The cursed epicenter disperses into black stardust. +Эпицентр проклятия рассеивается в черную звездную пыль. +The cursed epicenter retreats as you remove the last of your cursed restraints! +Эпицентр проклятия отступает, когда вы снимаете последние из своих проклятых оков! +The cursed epicenter retreats as you are claimed by something else! +Эпицентр проклятия отступает, поскольку на вас претендует кто-то другой! +Cursing Sigil +Знак проклятия +A cursing sigil appears on the ground! +На земле появляется знак проклятия! +Moondust Collar +Ошейник из лунной пыли +'You thought you could run forever, didn't you? Fate has a way of always catching up to you...' +'Ты думала, что сможешь убегать вечно, не так ли? Но у судьбы всегда есть способ настичь тебя...' +Cannot be removed while you are wearing other Star Cursed items. +Не может быть снят, пока вы носите другие Проклятые Звездами предметы. +Stardust Collar +Ошейник из звездной пыли +'You thought you could run forever, didn't you? Fate has a way of always catching up to you...' +'Ты думала, что сможешь убегать вечно, не так ли? Но у судьбы всегда есть способ настичь тебя...' +Cannot be removed while you are wearing other Star Cursed items. +Не может быть снят, пока вы носите другие Проклятые Звездами предметы. +The cursed seal on the RestraintName vanishes into a brief veil of stardust. +Проклятая печать на RestraintName исчезает, превращаясь в небольшое облачко звездной пыли. +Take AMNT damage to weaken the curse. Excludes shadow, psychic, charm, or damage taken at 0 WP. +Получите AMNT урона, чтобы ослабить проклятие. Не учитывается урон Тьмой, Психический, Очарованием, или урон, получаемый при 0 WP. +You struggle uselessly, sealed in your fate. +Вы безуспешно боретесь, запечатанная в своей судьбе. +You feel your restraints starting to weaken... +Вы чувствуете, что ваши ограничители начинают ослабевать... +The cursed collar falls off, awaiting its next victim... +Проклятый ошейник спадает, ожидая своей следующей жертвы... +You must remove all other Star Cursed items before removing the collar. +Вы должны удалить все остальные Проклятые Звездами предметы, прежде чем сможете снять ошейник. +You struggle uselessly, sealed in your fate. +Вы безуспешно боретесь, запечатанная в своей судьбе. +Transformation: Items with generic curses transform into Star Cursed items. +Трансформация: Предметы с обычными проклятиями превращаются в предметы, Проклятые Звездами. +With a burst of dark energy, your OLDITM gains new properties! +Со всплеском темной энергии ваше OLDITM приобретает новые свойства! +With a burst of dark energy, your OLDITM transforms into a NEWITM! +Со всплеском темной энергии ваше OLDITM превращается в NEWITM! +Restoration: While distracted, your Star Cursed restraints regain strength. +Восстановление: Пока вы возбуждены, ваши Проклятые Звездами ограничители восстанавливают силу. +With the rush of pleasure, you feel your cursed restraints tighten and strengthen! +Параллельно приливу удовольствия вы чувствуете, как ваши проклятые ограничители сжимаются и укрепляются! +Corruption: While in the shadows, you slowly gain corruption. +Осквернение: Находясь в тенях, вы медленно накапливаете скверну. +Your willpower gain and struggle power is less effective due to your corruption. +Ваша сила воли увеличивается, а эффективность борьбы снижается в зависимости от количества скверны. +Seduction: Gain distraction after taking damage. +Соблазн: Вы получаете возбуждение после получения урона. +Taking damage fills your minds with cursed thoughts... +Получение урона наполняет ваш разум проклятыми мыслями... +Having taken damage, your distraction is increasing... +После получения урона ваше возбуждение увеличивается... +Punishment: When you defeat an enemy, you are stunned briefly and enemies are attracted. +Наказание: Когда вы побеждаете врага, вы ненадолго оглушаетесь и привлекаете врагов. +Dark Voice: You are supposed to be a slave! +Голос из тьмы: Ты должна быть рабыней! +Submission: At 0 WP, you are restrained if you leave the presence of a hostile. +Подчинение: Если вы сбежите от врага при 0 WP, то окажетесь в ограничителях. +Dark Voice: Kneel before your mistress. +Голос из тьмы: На колени перед госпожой. +You must submit! Moving away from an enemy at 0 WP will bind you! +Вы должны подчиняться! Уходя от врага на 0 WP вы окажетесь скованы! +Denial: -10 WP when you try to Let Go. At 0 WP you cannot orgasm. +Отрицание: -10 WP, когда вы пытаетесь получить оргазм. При 0 WP вы не сможете достичь оргазма. +Dark Voice: Not yet. +Голос из тьмы: Пока нет. +Dark Voice: Your squirming pleases us. +Голос из тьмы: Нам нравится, как ты извиваешься. +Dark Voice: It is not your choice to make~ +Голос из тьмы: Это не тебе выбирать~ +Dark Voice: You may enjoy yourself, for now~ +Голос из тьмы: Сейчас можешь насладиться собой~ +Dark Voice: Yes, take in the pleasure... +Голос из тьмы: Да, получай удовольствие... +Dark Voice: Enjoy a gift, dear~ +Голос из тьмы: Наслаждайся подарком, милая~ +As you let go of yourself, the Robe of Chastity loses all effects! +Вы доводите себя до оргазма, и Мантия Целомудрия теряет все свои эффекты! +The magic in the Robe of Chastity fades... for now. +Магия в Мантии Целомудрия исчезает... на данный момент. +You have failed to keep the principles of the Paladins... for now. +Вы не смогли соблюсти принципы паладинов... на данный момент. +You feel vibrations in your leotard as the magically conductive fabric channels your power. +Вы ощущаете вибрации в своем трико, когда ткань, обладающая магической проводимостью, направляет вашу энергию. +Your leotard produces a tingling full-body sensation as it channels your magic! +Ваше трико вызывает ощущение покалывания во всем теле, поскольку оно направляет вашу магию! +A tingling sensation serves to remind you of your leotard's magic properties. +Ощущение покалывания напоминает вам о магических свойствах вашего трико. +Star: -20 Charm/Psychic Resist +Звезда: -20 сопротивления Психическому урону и урону Очарованием +Star: +40 all other resists +Звезда: +40 ко всем остальным сопротивлениям +Mithril Orb +Мифриловая сфера +Shining strings encircle your body! +Сияющие нити обхватывают ваше тело! +Your cursed items have attracted a powerful cursed spirit! +Ваши проклятые предметы привлекли могущественного проклятого духа! +The seal on your RESTRAINTNAME is weakening. +Печать на вашем RESTRAINTNAME ослабевает. +Fighter +Воительница +The fighter pouts and runs away! +Воительница надувает губы и убегает! +The fighter knocks you to the ground and binds you! (+RestraintAdded) +Воительница сбивает вас с ног и связывает! (+RestraintAdded) +The fighter strikes you with her weapon! (DamageTaken) +Воительница наносит вам удар своим оружием! (DamageTaken) +The fighter takes you down with the back of her weapon! (DamageTaken) +Воительница сбивает вас с ног тыльной стороной своего оружия! (DamageTaken) +The fighter puts you in a hold and manages to slip on a lock! (DamageTaken) +Воительница берет вас в захват и умудряется защелкнуть замок! +The fighter vanishes and ends up behind you! +Воительница исчезает и оказывается позади вас! +Fighter +Воительница +The fighter moans loudly and rolls around on the floor! +Воительница громко стонет и катается по полу! +The fighter wraps her arms around you with bindings in hand! (+RestraintAdded) +Воительница обхватывает вас руками, в которых вы замечаете ограничители! (+RestraintAdded) +The fighter pins you with her weapon and grabs your breast! (DamageTaken) +Воительница прижимает вас своим оружием и хватает за грудь! (DamageTaken) +The fighter enchants her weapon and strikes you! (DamageTaken) +Воительница зачаровывает свое оружие и атакует вас! (DamageTaken) +The fighter smiles lasciviously as she dangles a lock in front of you! (DamageTaken) +Воительница похотливо улыбается, размахивая перед вами замочком! (DamageTaken) +The fighter enchants her weapon and flies forward! +Воительница зачаровывает свое оружие и бросается вперед! +Fighter +Воительница +The fighter drops her weapon and admits defeat! +Воительница бросает свое оружие и признает поражение! +The fighter knocks you to the ground and binds you! (+RestraintAdded) +Воительница сбивает вас с ног и связывает! (+RestraintAdded) +The fighter feints and strikes, slapping you with the flat of her blade! (DamageTaken) +Воительница делает финт и наносит удар, поражая вас плоской стороной своего клинка! (DamageTaken) +The fighter takes you down with the back of her weapon! (DamageTaken) +Воительница сбивает вас с ног тыльной стороной своего оружия! (DamageTaken) +The fighter proudly clicks on a lock! (DamageTaken) +Воительница гордо щелкает замком! (DamageTaken) +The fighter briefly vanishes and ends up behind you! +Воительница ненадолго исчезает и оказывается позади вас! +Fighter +Воительница +The fighter falls on her knees and begs! +Воительница падает на колени и умоляет! +The fighter throws an enchanted binding ring at you! (+RestraintAdded) +Воительница бросает в вас зачарованное сковывающее кольцо! (+RestraintAdded) +The fighter throws her weapon at you! (DamageTaken) +Воительница бросает в вас свое оружие! (DamageTaken) +The fighter puts you in a hold and manages to slip on a lock! (DamageTaken) +Воительница берет вас в захват и умудряется защелкнуть замок! +The fighter vanishes and ends up behind you! +Воительница исчезает и оказывается позади вас! +Casting SPNME +Применение SPNME +The door suddenly locks behind you! +Дверь внезапно закрывается за вами! +Apply To Target +Применить к цели +Purify +Очищение +You need to target an NPC +Вам нужно нацелиться на NPC +Target must be bindable and disabled. +Цель должна быть поддающейся сковыванию и выведенной из строя. +Target acquired! +Цель выбрана! +Truss em up! +Связать их! +Choose target to bind +Выберите цель для сковывания +Target Acquired! +Цель выбрана! +Designates the target for bondage and allows you to apply items from the inventory. Can only be applied to entities that are willing or disabled. Some items require higher levels of incapacitation to be applied +Определяет цель для сковывания и позволяет вам применять предметы из инвентаря. Может применяться только к добровольцам или недееспособным объектам. Для применения некоторых элементов требуется более высокий уровень недееспособности. +The Shoppe +Магазин +Journey Selection +Выберите Путешествие +Shrine +Святилище +High-Security Prison +Тюрьма строгого режима +Doll Sorting Station +Станция сортировки кукол +The Shoppe +Магазин +A cursed NEWITM flies out of the chest and latches tightly to you! +Проклятый NEWITM вылетает из сундука и плотно застегивается на вас! +With a puff of magic, a NEWITM appears on your body! +С дуновением магии на вашем теле появляется NEWITM! +You draw upon chaotic energies, restoring mana! +Вы черпаете хаотические энергии, восстанавливая ману! +You draw upon chaotic energies, but your mind is unable to hold back the arcane forces! +Вы черпаете хаотические энергии, но ваш разум не в состоянии сдержать таинственные силы! +Your attempt to call upon chaotic energies fails. +Ваша попытка призвать хаотические энергии терпит неудачу. +You are already at max mana. +У вас уже максимум маны. +The vibrator holds at full power to drive you over the edge! +Вибратор работает на полную мощность, чтобы довести вас до грани! +The weapon needs to be loaded to fire. +Оружие должно быть заряжено для стрельбы. +Recurve Bow +Изогнутый лук +Curvy, just like its user. +Изгибы почти как у его владелицы! +Reload time: 1 turn. Deals crush damage on melee. Draws 14 charge and 35 stamina to fire an ordinary arrow, dealing 40 pierce damage. +Время перезарядки: 1 ход. Наносит дробящий урон в ближнем бою. Для выстрела обычной стрелой требуется 14 заряда и 35 единиц выносливости, наносит 40 ед. пронзающего урона. +You find a recurve bow. +Вы находите изогнутый лук. +14 charge to fire an arrow. Deals 40 pierce damage. +14 заряда для выстрела стрелой. Наносит 40 ед. пронзающего урона. +Choose projectile path +Выберите траекторию полета снаряда +Recurve Bow Arrow +Стрела изогнутого лука +You loose a strong arrow! +Вы выпускаете мощную стрелу! +Longbow +Длинный лук +Great for building both empires and muscle. +Отлично подходит как для создания империй, так и для создания мускулов. +Reload time: 2 turns. Deals crush damage on melee. Draws 18 charge and 60 stamina to fire an ordinary arrow, dealing 60 pierce damage. +Время перезарядки: 2 хода. Наносит дробящий урон в ближнем бою. Расходует 18 заряда и 60 единиц выносливости для выстрела обычной стрелой. Наносит 60 единиц пронзающего урона. +You find a huge longbow. +Вы находите огромный длинный лук. +18 charge to fire an arrow. Deals 60 pierce damage. +18 заряда для выстрела стрелой. Наносит 60 ед. пронзающего урона. +Choose projectile path +Выберите траекторию полета снаряда +Longbow Arrow +Стрела для длинного лука +You loose a mighty arrow! +Вы выпускаете сокрушающую стрелу! +Pistol Crossbow +Пистолет-арбалет +Lethal. Sustainable. Portable. +Смертельный. Надежный. Портативный. +Reload time: 3 turns. Deals crush damage on melee. Draws 15 charge and no stamina to fire an ordinary arrow, dealing 45 pierce damage. +Время перезарядки: 3 хода. Наносит дробящий урон в ближнем бою. Потребляет 15 заряда и не потребляет выносливости для обычного выстрела. Наносит 45 единиц пронзающего урона. +You find a pistol crossbow. +Вы находите пистолет-арбалет. +20 charge to fire a bolt. Deals 45 pierce damage. +20 заряда для выстрела болтом. Наносит 60 ед. пронзающего урона. +Choose projectile path +Выберите траекторию полета снаряда +Pistol Bolt +Болт-пуля +You pull the trigger! +Вы нажимаете на спусковой крючок! +Arbalest +Арбалест +At this point why not just use a gun? +Почему бы уже просто не воспользоваться огнестрелом? +Reload time: 5 stationary turns. Deals crush damage on melee. Draws 25 charge and no stamina to fire an ordinary arrow, dealing 70 pierce damage, passing through units. +Время перезарядки: 5 ходов без движения. Наносит дробящий урон в ближнем бою. Потребляет 25 заряда и не потребляет выносливости для обычного выстрела. Наносит 70 единиц пронзающего урона, проходит сквозь юнитов. +You find an arbalest. +Вы находите Арбалест. +25 charge to fire a bolt. Deals 100 pierce damage. +15 заряда для выстрела болтом. Наносит 60 ед. пронзающего урона. +Choose projectile path +Выберите траекторию полета снаряда +Heavy Bolt +Тяжелый болт +You pull the trigger! +Вы нажимаете на спусковой крючок! +The RSTNME is removed as the lock comes off. +RSTNME снимается, как только лишается замка. +You save the key in your inventory for future use. +Вы сохраняете ключ в своем инвентаре для дальнейшего использования. +You pick up a simple key for the simplest of locks. +Вы подбираете простой ключ к самому простому из замков. +Simple Keys +Простой ключ +You twirl the keys around your finger. +Вы крутите ключи на пальце. +A handy key for getting out of common handcuffs and shackles. +Сподручный ключ для снятия обычных наручников и кандалов. +It's not sophisticated enough to work on higher-quality locks, but can be used many times. +Он недостаточно сложен для работы с замками более высокого качества, но может использоваться много раз. +You twirl a key around your finger. +Вы крутите ключ на пальце. +You twirl a magic key around your finger. Careful not to lose it! +Вы крутите магический ключ на пальце. Осторожно, не потеряйте его! +You fidget with a lockpick. +Вы крутите между пальцами отмычку. +You pick up a tool for picking disc detainer locks. +Вы берете в руки инструмент для вскрытия дисковых замков. +Disc Lock Tool +Инструмент для дисковых замков +You examine the tool. It has a replaceable tip for picking disc detainer locks. +Вы осматриваете инструмент. Он оснащен сменным наконечником для вскрытия замков дискового фиксатора. +A handy tool for picking disc detainer locks, popularized by a certain pair of professionals. +Удобный инструмент для вскрытия дисковых замков, популяризированный одной парой профессионалов. +Features a replaceable head in case an unskilled user breaks it. Requires lockpicks to use. +Имеет сменную головку на случай, если ее сломает неквалифицированный пользователь. Для использования требуются отмычки. +Rep +Репутация +Journey +Путешествие +Magical Weapon +Магическое оружие +Your Submissiveness determines how easily your character can resist the temptations of bondage. +Ваша Покорность определяет, насколько легко ваш персонаж сможет противостоять соблазнам бондажа. +Your Security Level is based on your history, and reputation with the MNFCTN. +Ваш Уровень Опасности основан на ваших действиях и репутации с MNFCTN. +Your Passion determines how likely you are to lose control of yourself involuntarily. +Ваша Страстность определяет, насколько велика вероятность того, что вы непроизвольно потеряете контроль над собой. +Your Frustration affects how quickly your Passion grows. More Frustration = More Passion +Ваше Разочарование влияет на то, как быстро растет ваша страсть. Больше разочарования = больше Страстности +Nivah, Goddess of Dragons +Нива, Богиня Драконов +Minivir, Goddess of Alchemy +Минивир, Богиня Алхимии +Akasha, Goddess of Magic +Акаша, Богиня Магии +Oriel, Goddess of Technology +Ориэль, Богиня Технологий +Ninril, Giver of Life +Нинрил, Дарующая Жизнь +Matah, Architect of Reality +Матах, Архитектор Реальности +Aether, Keeper of the Cosmos +Эфир, Хранительница Космоса +Oblivion, Keeper of Secrets +Обливион, Хранительница Тайн +Arcane Energy is stored by casting spells, up to 100% Max mana. +Энергия Арканы накапливается при произнесении заклинаний, максимум до 100% маны. +Battle Rhythm is gained by spending stamina through attacks, up to 40 total. +Боевой Ритм накапливается за счет расхода выносливости на атаки, всего до 40. +Arcane Blast +Взрыв Арканы +When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. Casting this spell consumes it to deal up 25% Max Mana as Arcane damage. Pierces enemies and walls. +Когда вы тратите ману, произнося заклинания, вы накапливаете 40% ее в виде энергии Арканы, максимум до 100% от макс. маны. Произнесение этого заклинания расходует её, нанося 25% от макс. маны в виде урона Арканой. Пробивает врагов и стены. +Your eyes glow as energy surges from within! +Ваши глаза начинают светится, когда энергия буквально выплескивается из вас! +Choose aim direction +Прицельтесь, выберите направление +Critical Hit! +Критический удар! +Super Critical! +Супер-Крит! +Surprise Bondage! +Сюрпрайз-Бондаж! +Arcane Energy +Энергия Арканы +Rhythm +Ритм +You avoid the attack in a flurry of impressive maneuvers! +Вы избегаете атаки с помощью нескольких впечатляющих маневров! +Arcane Barrier +Барьер Арканы +When you spend mana by casting spells, you store up 40% of it as Arcane Energy, up to 100% Max Mana. When enabled, slowly convert Arcane Energy into a shield at a 1:2 ratio. Max shield is equal to 10% Max Mana. +Когда вы тратите ману, произнося заклинания, вы накапливаете 40% ее в виде энергии Арканы, максимум до 100% от макс. маны. При включении, начинается медленное преобразование энергии Арканы в щит в соотношении 1:2. Максимальный щит равен 10% максимальной маны. +You sense that a high value target is near. +Вы чувствуете, что важная цель близко. +You push yourself beyond physical limits! +Вы выводите себя за пределы физических возможностей! +You try to push yourself beyond your capabilities and falter... +Вы пытаетесь превзойти свои возможности и отбросить колебания... +You are already at max stamina. +Вы уже достигли максимальной выносливости. +Did the Research +Проведенные исследования +Unlocks advanced tooltips for enemies showing their weaknesses. Also improves hearing by a small amount. +Открывает расширенные всплывающие подсказки для врагов, показывающие их слабости. Также немного улучшает слух. +Well-Placed Traps +Правильно расставленные ловушки +Trap spells always critically strike. +Заклинания-ловушки всегда наносят критический удар. +Hard to Catch +Неуловимая +Adjacent NPCs count as corners/hooks for purposes of escaping. After being restrained, escape speed and power is increased for 12 turns (escape power is increased by +20% plus 2% of Bondage Resist). Removed if you restrain yourself. +Соседние NPC считаются углами/крюками для освобождения от ограничителей. После сковывания скорость и эффективность освобождения увеличиваются на 12 ходов (Эффектности освобождения увеличивается на +20% плюс 2% от сопротивления сковыванию). Снимается, если вы сковываете сами себя. +Struggling is improved and escape is quicker! +Борьба становится эффективней, а освобождение быстрее! +Akashic Conflux +Слияние Акаши +Costs 100 Arcane Energy and refunds 100 Mana. Bringing memories to life, you call upon your magical knowledge to ignore arm, leg, and verbal spell components for 3 turns. +Стоит 100 Энергии Арканы и возвращает 100 маны. Оживляя воспоминания из жизни, вы призываете свои магические знания, чтобы игнорировать активаторы заклинаний 'руки', 'ноги' и 'уста' в течение 3 ходов. +You can ignore Arm, Leg, and Verbal components! +Вы можете игнорировать активаторы заклинаний 'руки', 'ноги' и 'уста'! +Magical whisperings circle around you, enabling you to cast spells without components! +Магический шепот кружит вокруг вас, позволяя применять заклинания без активаторов! +You don't have enough Arcane Energy. You need AMNT. +У вас недостаточно энергии Арканы. Вам нужно AMNT. +Chaotic Overflow +Хаотическое переполнение +Draw upon 35 WP to ignore spell components for Duration turns and fully restore your mana. The energy is uncontrollable, so there will be consequences... +Пожертвуйте 35 WP, чтобы игнорировать активаторы заклинаний в течение Duration ходов и полностью восстановить свою ману. Энергия неконтролируема, поэтому будут последствия... +Chaotic energy flows through you!!! +Хаотическая энергия течет через вас!!! +You try to call forth the chaotic energy, but it isn't interested in you anymore... +Вы пытаетесь воззвать к энергии хаоса, но она больше не интересуется вами... +You don't have enough Willpower. You need at least 25%. +У вас недостаточно силы воли. Вам нужно как минимум 25%. +You are already full of chaotic energy! +Вы уже полны хаотической энергии! +Chaotic energy overtakes you, crystallizing into physical form... +Хаотическая энергия окутывает вас, кристаллизуясь в физическую форму... +Chaotic energy flows through you! You have a bad feeling about this... +Хаотическая энергия течет сквозь вас! У вас плохое предчувствие по этому поводу... +You find a shimmering macaron. +Вы находите сверкающие пирожные-макароны. +Heavenly Crunch Macaron +Макарон 'Небесный хруст' +You feel holy energy neutralizing the cursed magic permanently. +Вы чувствуете, как энергия света навсегда нейтрализует проклятую магию. +Some say it comes from a bakery in heaven itself. Others say it is simply made from lab-grade materials, and actually tastes awful. +Некоторые говорят, что его готовят в пекарне на небесах. Другие говорят, что он просто сделан из лабораторных материалов и на самом деле ужасен на вкус. +Unlocks a cursed item and/or removes all curses from one currently worn item of your choice. +Разблокирует проклятый предмет и/или снимает все проклятия с одного из носимых в данный момент предметов по вашему выбору. +Congratulations! Your continued patronage has earned you|one (1) round trip to the nearest affiliated shop!|Simply step into the portal to continue...|(the Goddess is not responsible for any mishaps or fraud pertaining to the use of this portal) +Поздравляем! Ваш долгий патронаж принес вам|одну (1) поездку туда и обратно в ближайший дочерний магазин!|Просто войдите в портал...|(Богиня не несет ответственности за любые неприятности или мошенничества, связанные с использованием этого портала) +(You step through the portal. An unperturbed shopkeeper greets you.)|Another visitor? Oh, it's just you~ +(Вы проходите через портал. Невозмутимая владелица магазина приветствует вас.)|Еще один посетитель? О, это всего лишь ты~ +(Enter the portal) +(Войти в портал) +(It's the return portal) +(Это обратный портал) +(You step through the portal and return to your adventure) +(Вы проходите через портал и возвращаетесь к своему приключению) +(Enter the portal) +(Войти в портал) +Select a restraint to remove the curse from +Выберите ограничитель, с которого нужно снять проклятие +You don't have any restraints that can be removed +На вас нет никаких ограничителей, которые можно было бы снять +As you are low on mana, you are unable to store Arcane Energy. +Поскольку у вас мало маны, вы не можете накапливать Энергию Арканы. +You are recharging your next mana cost reduction. +Вы перезаряжаете свое следующее снижение стоимости маны. +Fast Recharge I +Быстрая перезарядка I +Inner power now recharges after 10 turns instead of 16. +Внутренняя сила теперь перезаряжается после 10 ходов вместо 16. +Fast Recharge II +Быстрая перезарядка II +Inner power now recharges after 6 turns instead of 16. +Внутренняя сила теперь перезаряжается после 6 ходов вместо 16. +Precise Targeting +Точное наведение +Your first critical hit on a target is 1.5x more powerful. +Ваш первый критический удар по цели становится в 1,5 раза сильнее. +Surprise Bondage +Сюрпрайз-бондаж +Binding from critical hits is 40% stronger +Сковывание от критических попаданий становится на 40% эффективнее +High Profile +Высокий профиль +Several enemies on each map will be high value, rewarding more gold and items for defeating them but increasing their strength. +Несколько врагов на каждой карте будут считаться важными целями, за победу над ними вы получите больше золота и предметов, но их сила будет увеличена. +You apply the RSTR to the ENNME! (AMNT% bound) +Вы применяете RSTR к ENNME! (AMNT% скована) +You untie the ENNME! (AMNT% bound) +Вы развязываете ENNME! (AMNT% скована) ++AMNT Bondage! ++AMNT Сковывания! +TargetEnemy receives AMNT binding! +TargetEnemy получает AMNT Сковывания! +TargetEnemy is disabled and receives an increased AMNT binding! +TargetEnemy выведена из строя и получает увеличенные AMNT Сковывания! +TargetEnemy resists bondage and receives a reduced AMNT binding! +TargetEnemy сопротивляется связыванию и получает уменьшенные AMNT Сковывания! +You need to target an NPC +Вам нужно нацелиться на NPC +Target must be helpless. +Цель должна быть беспомощной. +You steal the target's disguise! +Вы крадете маскировку цели! +You remove your disguise. +Вы снимаете свою маскировку. +You are already wearing that faction's disguise. +На вас уже надета маскировка этой фракции. +Steal Disguise +Украсть маскировку +Choose target to steal from +Выберите цель, у которой хотите украсть +You steal the target's disguise! +Вы крадете маскировку цели! +Steal's a helpless enemy's clothes, adding a great deal of distraction to her and stealing her disguise for yourself. Until you recast this on yourself, you gain a stealth bonus against members of the same faction. +Украдите одежду беспомощного врага, добавив ей большое число Возбуждения и забрав себе ее фракционную маскировку. Применив эту маскировку на себя, вы получаете бонус скрытности против членов этой фракции. +Unstoppable (Ignore status/bondage) +Неудержимость (Игнорирование статусов/оков) +Unflinching (Resist status/bondage) +Непоколебима (Сопрот. к статусам/оковам) +Relentless (Stun resist when stunned) +Неумолимая (Сопр. оглушению, когда оглушена) +Bulwark (Blocks some explosions) +Бастион (Блокирует некоторые взрывы) +Blindsight (See through walls) +Слепое зрение (Видение сквозь стены) +Mana Harvesting +Сбор маны +Defeating or capturing a spellcaster-type enemy recovers 10 arcane energy, reduced to 1 for other humanoids. +Сражение или пленение врага-заклинателя восстанавливает 10 единиц Энергии Арканы. Уменьшается до 1 в случае других гуманоидов. +A powerful wind pushes you away!!! +Сильный ветер сдувает вас!!! +Staff of Ropes +Посох из веревок +An enchanted rope kept in check by a magical seal. Surely this won't backfire... +Зачарованные веревки, удерживаемая магической печатью. Конечно же, это не приведет к неприятным последствиям... ++20% rope bindings applied. Deals chain damage. Active: Spend 25 mana to unleash the ropes in a wide AoE. ++20% к Сковыванию веревками. Наносит цепной урон. Активация: Потратьте 25 маны, чтобы развязать веревки в обширном AoE. +You pick up a staff of ropes. Finally, a way to contain its power! +Вы находите посох из веревок. Наконец-то, способ сдержать эту силу! +Staff of Belts +Посох из ремней +Belts within belts, a fractal belt pattern buckled into oblivion. +Ремни внутри ремней, фрактальный узор ремней уходит в небытие. ++20% leather bindings applied. Leather spells apply debuffs for 30% longer. Deals chain damage. Active: Pull an enemy toward you and apply a small amount of bondage. ++20% к Сковыванию кожей. Дебаффы от заклинаний 'Кожи' действуют на 30% дольше. Наносит цепной урон. Активация: Притяните врага к себе и примените небольшое количество Сковывания. +You pick up a staff of belts wrapped tightly in leather. +Вы берете в руки посох из ремней, туго обернутых кожей. +Binding Lock +Замок для оков +A LKTYP lock clasps on to one of your restraints! +LKTYP замок защелкивается на одном из ваших ограничителей! +You are caught in a constricting field! (Dmgdlt) +Вы попали в сжимающееся поле! (Dmgdlt) +Resin Coating +Полимерное покрытие +A layer of transparent resin derived from Green Latex. Unlike other forms of latex, this one is solid and fixes you in place. +Слой прозрачной смолы, полученной из зеленого латекса. В отличие от других форм латекса, эта твердая и фиксирует вас на месте. +It's like you're an art piece! If only you had some way to blast it off... +Как будто вы произведение искусства! Если бы только у вас был какой-нибудь способ взорвать его... +You hear a motor whirring... +Вы слышите жужжание мотора... +A bubble of latex surrounds you and inflates, sealing you in! +Пузырь из латекса окутывает вас и надувается, запечатывая вас внутри! +A bubble of latex envelops you! +Вас обхватывает пузырь из латекса! +A ball of latex surrounds you and inflates, sealing around your neck! +Латексный шар обхватывает вас и, надуваясь, запечатывается на шее! +A ball of latex envelops you! +Вас обхватывает латексный шар! +The latex around you dampens your attacks, reducing physical damage by 30% and lowering your sight range. +Латекс вокруг вас ослабляет ваши атаки, уменьшая физический урон на 30% и снижая дальность видимости. +The latex around you dampens your attacks, reducing physical damage by 30% and lowering your sight range. +Латекс вокруг вас ослабляет ваши атаки, уменьшая физический урон на 30% и снижая дальность видимости. +Latex Ball +Латексный шар +...Lab Assistant? +...Лаборантка? +You rescue the lab assistant. +Вы спасаете Лаборатнку. +The assistant restrains you! (+RestraintAdded) +Лаборантка сковывает вас! (+RestraintAdded) +The assistant gropes you playfully! (DamageTaken) +Лаборантка игриво ощупывает вас! (DamageTaken) +The assistant applies a lock! (DamageTaken) +Лаборантка навешивает замок! (DamageTaken) +The assistant splashes a solvent in your face, blinding you! (DamageTaken) +Лаборантка брызгает раствором вам в лицо, ослепляя вас! (DamageTaken) +...Glue Technician? +...Специалист по клею? +You rescue the glue technician. +Вы спасаете специалистку по клею. +The technician slaps adhesive restraints onto your body! (+RestraintAdded) +Специалист по клею прикрепляет на ваше тело клейкие ограничители! (+RestraintAdded) +The technician polishes your restraints thoroughly! (DamageTaken) +Специалист по клею тщательно полирует ваши ограничители! (DamageTaken) +The technician pours glue on you to make you stay still! (DamageTaken) +Специалист по клею обливает вас клеем, чтобы вы потеряли возможность двигаться! (DamageTaken) +The technician inspects your restraints and adds a lock to spec! (DamageTaken) +Специалист по клею проверяет ваши ограничители и добавляет замочки в спецификацию! (DamageTaken) +Lab Assistant +Лаборантка +The assistant envelops herself in her own bubble for protection. +Лаборантка окутывает себя пузырем для защиты. +The assistant restrains you! (+RestraintAdded) +Лаборантка сковывает вас! (+RestraintAdded) +The assistant gropes you playfully! (DamageTaken) +Лаборантка игриво ощупывает вас! (DamageTaken) +The assistant applies a lock! (DamageTaken) +Лаборантка навешивает замок! (DamageTaken) +The assistant splashes a solvent in your face, blinding you! (DamageTaken) +Лаборантка брызгает раствором вам в лицо, ослепляя вас! (DamageTaken) +Glue Bomb +Клеебомба +Glue Technician +Специалист по клею +The technician trips and glues herself to the floor. +Специалист по клею спотыкается и приклеивается к полу. +The technician slaps adhesive restraints onto your body! (+RestraintAdded) +Специалист по клею прикрепляет на ваше тело клейкие ограничители! (+RestraintAdded) +The technician polishes your restraints thoroughly! (DamageTaken) +Специалист по клею тщательно полирует ваши ограничители! (DamageTaken) +The technician pours glue on you to make you stay still! (DamageTaken) +Специалист по клею обливает вас клеем, чтобы вы потеряли возможность двигаться! (DamageTaken) +The technician inspects your restraints and adds a lock to spec! (DamageTaken) +Специалист по клею проверяет ваши ограничители и добавляет замочки в спецификацию! (DamageTaken) +Quite sticky, innit? +Довольно липкое, не так ли? +Bow +Лук +Bow: This is a ranged weapon with a weapon ability. +Лук: Это оружие дальнего боя с оружейной способностью. +Magic +Магия +Magic: Ignores evasion of ghost type enemies, can be used with abilities that require magic weapons. +Магия: Игнорирует уклонение от врагов типа 'призрак', может использоваться со способностями, требующими магического оружия. +Light +Легкое +Light: Can be used to cut even with bound arms. 50% reduced accuracy penalty from being bound. Can be held in mouth. +Легкое: Может использоваться для резки даже со связанными руками. На 50% снижен штраф к точности при связанных руках. Можно держать во рту. +Offhand +Левая рука +Offhand: This weapon can be dual-wielded by some classes. +Левая рука: Некоторые классы могут взять это оружие в левую руку. +2 Handed +Двуручное +2 Handed: While wielding this as your primary weapon, you cannot wield an offhand weapon. Also this weapon can't be used while arms are tied. +Двуручное: Используя это в качестве основного оружия, вы не можете взять оружие в левую руку. Также этим оружием нельзя пользоваться, пока руки связаны. +Magical Focus +Магическая концентрация +Magical Focus: Instead of losing accuracy, the stamina cost is increased when distracted. +Магическая концентрация: Вместо потери точности, при возбуждении увеличивается стоимость в выносливости. +Precision +Прицельное +Precision: Your arms need to be free to use this weapon. +Прицельное: Ваши руки должны быть свободны, чтобы использовать это оружие. +Hands-Free +Свободные руки +Hands-Free: Weapon can be used without free hands. +Свободные руки: Оружием можно пользоваться, не имея свободных рук. +Shield +Щит +Shield: This weapon is intended for defensive use. +Щит: Это оружие предназначено для обороны. +Heavy +Тяжелое +Heavy: This weapon takes +1 turns to switch to. Cannot be reduced to 0 by perks or upgrades. +Тяжелое: Для переключения на это оружие требуется +1 ход. Не может быть уменьшено до 0 с помощью льгот или улучшений. +Massive +Массивное +Massive: This weapon either stuns or slows you after attacking with it. Handle with care! +Массивное: Это оружие либо оглушает, либо замедляет вас после атаки им. Обращайтесь с ним осторожно! +Illumination +Светящееся +Illumination: This weapon is a light source. +Светящееся: Это оружие является источником света. +Dual Wield +Бой двумя оружиями +Designate an Offhand weapon to gain passive effects such as a light source, armor, or extra crit damage.|(Must equip Dual Wield spell to equip an offhand weapon) +Назначьте оружие в левую руку, чтобы получить пассивные эффекты, такие как источник света, защита или дополнительный критический урон.|(Необходимо экипировать способность 'Бой двумя оружиями', чтобы использовать оружие в левой руке) +Equip Offhand +Взять в левую руку +Remove Offhand +Убрать из левой руки +Make a ranged attack with the spear. +Провести дальнюю атаку копьем. +Make a ranged attack with the spear. +Провести дальнюю атаку копьем. +Make a ranged attack with the pike. +Провести дальнюю атаку пикой. +Ranged Attack +Дальняя атака +Combat Training +Боевая подготовка +Your training has granted a number of bonuses:|-Weapon stamina cost is reduced by 1% per 10 current WP, up to a max of 40%.|-Slow effects wear off more quickly.|-While you are above 0 WP you gain 1 slow resist. +Ваши тренировки дали ряд бонусов:|-Потребление выносливости оружием снижается на 1% за каждые 10 имеющихся WP, максимум до 40%.|-Замедляющие эффекты спадают быстрее.|-Пока у вас больше 0 WP, вы получаете 1 сопротивление замедлению. +This is your current offhand weapon. +Это оружие вы сейчас держите в левой руке. +You are unable to wield this weapon offhand at the moment. +В данный момент вы не можете пользоваться этим оружием в левой руке. +This is your previously held weapon. Click to switch to it. +Это предыдущее экипированное вами оружие. Нажмите, чтобы переключиться на него. +You can't hold the WPN in your current state. +Вы не можете удерживать WPN в текущем состоянии. +Charge! +Рывок! +Dash and make an attack attack against a target within 2 tiles. If it deals 20% of their current hp in damage, you knock them back and take their place, otherwise they take +15% max hp crush damage from hitting the wall. If the attack misses, you still dash. Costs stamina equal to your sprint cost plus your attack cost. +Сделайте рывок и атакуйте цель в пределах 2 клеток. Если вы наносите им 20% урона от их текущего здоровья, вы отбрасываете их назад и занимаете их место, в противном случае они получают дробящий урон в размере 15% от макс. здоровья при ударе о стену. Если атака промахивается, вы все равно совершаете рывок. Затраты выносливости равны стоимости вашего спринта плюс стоимость вашей атаки. +You charge at the target! +Вы делаете рывок к цели! +Choose a target. +Выберите цель. +You need to target an enemy. +Вам нужно выбрать врага. +You don't have enough stamina. +У вас недостаточно выносливости. +You need to be able to sprint. +Вам должен быть доступен спринт. +You need to be able to attack. +Вы должны иметь возможность атаковать. +There is no room to dash! +Здесь нет места для рывка! +You missed! +Вы промахиваетесь! +Tools of the Trade +Инструменты ремесленника +Allows you to craft bombs, smoke bombs, flash bombs, and invisibility potions. +Позволяет вам создавать бомбы, дымовые бомбы, световые бомбы и зелья невидимости. +(You start having crafty thoughts...)|(Gunpowder can be obtained from chests or Alchemists)|(Ectoplasm can be obtained from ghosts) +(У вас начинают появляться знания ремесленника...)|(Порох можно достать из сундуков или у алхимиков)|(Эктоплазму можно получить от призраков) +(You craft a Smoke Bomb) +(Вы создаете дымовую бомбу) +(You craft 3 Flash Bombs) +(Вы создаете 3 световых бомбы) +(You craft a Bomb) +(Вы создаете бомбу) +(You craft an Invisibility Potion) +(Вы создаете зелье невидимости) +(You don't have the required material) +(У вас нет необходимых материалов) +(Use 1 Gunpowder to make a Smoke Bomb) +(Использовать 1 порох для изготовления дымовой бомбы) +(Use 1 Gunpowder and one Ancient Crystal to make 3 Flash Bombs) +(Использовать 1 порох и один древний кристалл для создания 3-х световых бомб) +(Use 2 Gunpowder to make a Bomb) +(Использовать 1 порох для изготовления бомбы) +(Use 3 Ectoplasm to make an Invisibility Potion) +(Использовать 3 эктоплазмы для изготовления зелья невидимости) +Gunpowder +Порох +Gunpowder +Порох +You toss some gunpowder on the floor! No picking it back up now... +Вы рассыпаете немного пороха по полу! Теперь его нельзя подобрать обратно... +Highly flammable. Do not eat. +Легко воспламеняется. Не ешьте. +Creates gunpowder tiles on the target area, which can be ignited. +Создает плитки пороха в выбранной точке, которые можно поджечь. +You pick up a sack of gunpowder. +Вы находите мешок с порохом. +You toss some gunpowder on the floor! +Вы бросаете немного пороха на пол! +Dual Wield (Rogue) +Бой двумя оружиями (Ассасин) +Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or extra crit damage.|Rogues cannot wield heavy or massive weapons in the offhand unless they are multiclass.|(Equip Dual Wield spell to equip an offhand weapon, or use the Items menu) +Добавьте на быструю панель и используйте, чтобы назначить оружие в левую руку и получить пассивные эффекты, такие как источник света, защита или дополнительный критический урон.|Разбойники не могут носить тяжелое или массивное оружие в левой руке, если только они не мультиклассовые.|(Экипироуйте способность 'Бой двумя оружиями', чтобы использовать оружие в левой руке|Или используйте Меню Предметов.) +Dual Wield (Wizard) +Бой двумя оружиями (Маг) +Equip to hotbar and cast to designate an Offhand weapon to gain passive effects such as a light source or spell damage bonuses.|Wizards can only wield magic weapons in the offhand unless they are multiclass, and receive +1 slow level if they wield a 2-handed, heavy, or massive magical weapon in the offhand.|(Must equip Dual Wield spell to equip an offhand weapon) +Добавьте на быструю панель и используйте, чтобы назначить оружие в левую руку и получить пассивные эффекты, такие как источник света, защита или дополнительный урон заклинаниями.|Маги могут экипировать в левую руку только магическое оружие, если они не мультиклассовые. Также они получают +1 к уровню замедления, если экипируют в левую руку двуручное, тяжелое или массивное магическое оружие.|(Необходимо экипировать способность 'Бой двумя оружиями', чтобы использовать оружие в левой руке) +Arcane Tome +Фолиант Арканы +Contains advanced formulas and thrilling tales of thirsty wizards. Can not critically strike. +Содержит продвинутые формулы и захватывающие истории о алчущих магах. Не может нанести критический удар. ++5% magic damage. Offhand: Applies passive bonus. ++5% к магическому урону. В левой руке: Применяется пассивный бонус. +You find a magical tome. +Вы находите магический фолиант. +Open the book. What can go wrong? +Откройте книгу. Что может пойти не так? +Tome of Bondage +Фолиант Бондажа +Contains a malevolent spirit that wishes only to tie up damsels. Can not critically strike. +Внутри него живет злой дух, единственное желание которого - связывать девушек. Не может нанести критический удар. ++10% binding effectiveness. Offhand: Applies passive bonus. +Эффективность Сковывания +10%. В левой руке: Применяется пассивный бонус. +You find a magical tome with a sealed padlock on it. +Вы находите магический фолиант, запертый висячим замком. +Open the book. What can go wrong? +Откройте книгу. Что может пойти не так? +Leyline Map +Карта Лей-линий +You know the location of ancient leylines and can draw upon 100 additional mana. +Вы знаете расположение древних лей-линий и можете использовать 100 дополнительных единиц маны. +You don't want to open the book... (need willpower) +Вы не хотите открывать эту книгу... (нужна сила воли) +Chain Spirit +Дух цепей +You open the book and suddenly a binding aura surrounds you! +Вы открываете книгу, и внезапно вас окружает сковывающая аура! +Mathematical Error +Математическая ошибка +You open the book to an unfinished page and the magic ink short-circuits! +Вы открываете книгу на незаконченной странице, и волшебные чернила замыкаются! +Cracks begin to form in your RestraintName! +Yf вашем RestraintName начинают образовываться трещины! +Your RestraintName shatters and falls off! +Ваше RestraintName раскалывается на части, которые падают на землю! +Load Hotbar +Загруз. быстр. панель +Save Hotbar +Сохр. быстр. панель +Clear Hotbar +Очистить быструю панель +Confirm clearing hotbar? +Подтверждаете очищение быстрой панели? +Add to Hotbar +Доб. в быструю панель +Back +Назад +Surrender: Your willpower is 0, giving huge penalties to struggling, Block, Evasion, and Bondage Resist. +Капитуляция: Ваша сила воли равна 0, что дает огромные штрафы на борьбу, блокирование, уклонение и сопротивление сковыванию. +Unbound Keybindings! --> +Не привязанные клавиши! --> +You've not enough keys!!! --> +У вас недостаточно клавиш!!! +Update your Keybindings!!! --> +Обновите привязку клавиш!!! --> +I have altered the keybindings. Pray I do not alter them further. +Я изменил привязки клавиш. Молитесь, чтобы я не изменял их дальше. +Barricade +Баррикада +You knock over the barricade! +Вы опрокидываете баррикаду! +Anti-Damsel Barrier +Барьер от девиц +You disable the barrier! +Вы отключаете барьер! +Barrier +Барьер +You shatter the barrier! +Вы разрушаете барьер! +Magical Barrier +Магический барьер +You destroy the barrier! +Вы уничтожаете барьер! +Mass of Shadow Hands +Масса Теневых рук +You banish the shadow hands! +Вы изгоняете теневые руки! +The shadow hands caress you and latch on! (DamageTaken) +Теневые руки ласкают вас и цепляются за вас! (DamageTaken) +The shadow hands caress you and latch on! (+RestraintAdded) +Теневые руки ласкают вас и цепляются за вас! (+RestraintAdded) +Shadow Chains +Теневые цепи +You break through the chains! +Вы прорываетесь сквозь цепи! +Conjured Chains +Сотворенные цепи +You break through the chains! +Вы прорываетесь сквозь цепи! +Magic +Магическое +Divine +Божественное +Magic Damage +Магический урон +Physical Damage +Физический урон +Special Ability +Особая способность +Ranged +Дальний бой +Melee +Ближний бой +Staff +Посох +Shield +Щит +Toy +Игрушка +Bondage +Бондаж +Teasing +Дразнящее +A rope trap springs upon you! +Под вами активируется веревочная ловушка! +A ribbon trap springs upon you! +Под вами активируется ловушка с лентами! +A chain trap springs upon you! +Под вами активируется ловушка с цепями! +Magical vines wrap around you suddenly! +Вокруг вас внезапно обвиваются магические лозы! +A belt trap springs upon you! +Под вами активируется ловушка с ремнями! +You find yourself suddenly bound tightly by magic gear! +Вы внезапно обнаруживаете, что крепко связаны магическим снаряжением! +Magical rubber emerges from the floor and encases you! +Магическая резина появляется из под земли и окутывает вас! +Slime appears at your feet and starts encasing you! +Слизь появляется у ваших ног и начинает окутывать вас! +You find yourself suddenly bound tightly in latex gear! +Внезапно вы обнаруживаете, что крепко связаны латексным снаряжением! +A rubber cube rushes out of the floor and engulfs you! +Резиновый куб вылетает из под земли и поглощает вас! +Sharp Claws +Острые когти +While your hands aren't covered, your attacks deal 10 bonus slash damage on hit and you can cut restraints. +Пока ваши руки ничем не покрыты, ваши атаки дополнительно наносят 10 рубящего урона, и вы можете разрезать путы. +Powerful Bite +Мощный укус +Gain access to the Bite spell. +Дает доступ к способности Укус. +Slime Girl +Девушка-слайм +You are a shapeshifting slime, granting +100 Glue Resist and can squeeze thru bars. Escaping is easy, but your powers are sealed while wearing cursed or magic restraints. +Вы - слизь-оборотень, получающая сопротивлением слизи +100 и умеющий протискиваться сквозь прутья. Сбежать очень легко, но ваши силы запечатаны, пока вы носите проклятые или магические ограничители. +Cybernetic +Кибернетик +You have mechanical parts, granting +10 Physical Armor, +15 Block, and +10% base physical damage. -100 Electric Resist. +У вас есть механические части, дающие +10 к физической защите, +15 к Блоку и +10% к базовому физическому урону. -100 сопротивления электричеству. +Magic Blood +Магическая кровь +You come from a magical lineage, granting +10 Magic Armor and +10% magic damage. +Вы происходите из магического рода, что дает +10 к магической защите и +10% к магическому урону. +Beast Girl +Зверодевочка +You have animalistic features such as a bite spell, -10% attack stamina cost, and 10 slash damage on hit while hands are free. -100 Charm Resist. +У вас есть анималистические черты, такие как заклинание Укуса, -10% затрат выносливости при атаке и 10 единиц рубящего урона при ударе со свободными руками. -100 сопротивления Очарованию. +Demon Girl +Демоница +You are related to eldritch entities, granting +50% shadow damage and the ability to teleport between shadows. You are weak to holy restraints and bright light. +Вы относитесь к сверхъестественным сущностям, вы получаете +50% урона от тьмы и способность телепортироваться между тенями. Вы слабы перед небесными ограничителями и ярким светом. +Angelic +Ангелица +You are a minor angel sent to perform a specific task. You are forced to wear a full set of divine restraints, but gain an infinite mana pool, +20 Magic Armor, and +25% magic damage. +Вы - малый ангел, посланный для выполнения определенного задания. Вы вынуждены носить полный набор божественных ограничителей, но получаете бесконечный запас маны, +20 к магической защите и +25% к магическому урону. +Elven Ancestry +Эльфийские корни +You were blessed with immortality by Ninril, Goddess of Restoration, granting -50% sprint cost and -30 Physical Resist. While your WP is above 0, you regenerate WP and heal nearby allies. +Нинрил, богиня Жизни, даровала вам благословение бессмертия. Вы получаете -50% стоимости спринта и -30 физического сопротивления. Пока ваш WP выше 0, вы регенерируете WP и лечите ближайших союзников. +Bast's Blessing +Благословение Баст +You were granted undead immortality by Bast, granting a bite, claws, catlike senses, and stamina regen scaling with your current WP. Your WP gain is halved and you get -100 Fire Resist. +Баст даровала вам бессмертие нежити. Вы получаете укус, когти, кошачьи чувства и регенерацию выносливости в соответствии с вашим текущим WP. Ваше восполнение WP уменьшается вдвое, и вы получаете -100 к сопротивлению огню. +Minefield +Минное поле +Booby traps set by enemies are much more common. +Мины-ловушки, устанавливаемые врагами, встречаются гораздо чаще. +Fortified +Укрепление +Barricades set up by enemies do not expire, and enemies set them up even when not alerted. +Срок действия баррикад, установленных врагами, не ограничен, и враги устанавливают их, даже если они не знают о вашем присутствии. +Pass thru helpless allies +Проходить через беспомощных союзников +Pass thru helpless enemies +Проходить через беспомощных врагов +Pass thru allies +Проходить через союзников +Pass thru neutrals +Проходить через нейтралов +Pass thru summons +Проходить через суммонов +Pass thru shopkeepers +Проходить через лавочниц +Pass thru special NPCs +Проходить через особых NPC +Stop when enemies are first sighted +Прекращать при первом появлении врагов +Suppress during combat +Отключать во время боя +Step during combat +Шаг во время боя +0.1s/turn +0.1с/ход +1.5s/turn +1.1с/ход +0.5s/turn +0.5с/ход +0.01s/turn +0.01с/ход +Shadowy Grasp +Призрачная хватка +Magical Tornado +Магический торнадо +The tornado blasts you with powerful winds! (DamageTaken) +Торнадо обрушивает на вас мощные порывы ветра! (DamageTaken) +You dispel the tornado! +Вы рассеиваете торнадо! +Shield of Flame +Щит пламени +You dispel the shield! +Вы рассеиваете щит! +Overgrowth +Заросли +You cut through the overgrowth! +Вы прорываетесь сквозь заросли! +Wall of Water +Водная стена +You dispel the water wall! +Вы рассеиваете водную стену! +Ice Spikes +Ледяные шипы +You break through the ice! +Ты пробиваетесь сквозь лед! +Earth Monoliths +Земляные монолиты +You shatter the monoliths! +Вы разбиваете монолиты! +Gravitational Pull +Гравитационное притяжение +The earth emits a deep hum below your feet... +Земля под вашими ногами издает глубокий гул... +Electrified Sphere +Электрическая сфера +You smash the electrified sphere! +Вы разбиваете электрическую сферу! +A bolt of lightning arcs to you! (DamageTaken) +В вас летит молния! (DamageTaken) +Earth Keeper +Хранительница земли +The earth keeper sinks into the wall. +Хранитель земли погружается в стену. +The earth keeper conjures restraints on your body! (+RestraintAdded) +Хранитель земли сотворяет ограничители на вашем теле! (+RestraintAdded) +The earth keeper locks a restraint! +Хранитель земли запирает ограничитель! +The earth keeper knocks you away with a powerful kick! +Хранитель земли отбрасывает вас мощным ударом ноги! +The earth keeper massages you gently! (DamageTaken) +Хранитель земли нежно массирует вас! (DamageTaken) +The earth keeper knocks you away with a strong kick! (DamageTaken) +Хранитель земли отбрасывает вас сильным ударом ноги! (DamageTaken) +Flame Keeper +Хранительница пламени +The flame keeper steps away into a fiery portal. +Хранительница пламени уходит в огненный портал. +The flame keeper grabs you, and volcanic restraints emerge from her armor! (+RestraintAdded) +Хранительница пламени хватает вас, и из ее доспехов появляются вулканические ограничители! (+RestraintAdded) +The flame keeper locks a restraint! +Хранительница пламени запирает ограничитель! +The flame keeper flanks you! +Хранительница пламени обходит вас с фланга! +The flame keeper offers a painful caress! (DamageTaken) +Хранительница пламени предлагает болезненную ласку! (DamageTaken) +The flame keeper rides forth on a wave of fire! +Хранительница пламени мчится вперед на волне огня! +Smoldering Trail +Тлеющая тропа +Fiery Greatsword +Огненный двуручник +Tangling Vines +Переплетающиеся лозы +Enchanted Bubble +Зачарованный пузырь +A bubble of magic water starts forming around you! +Вокруг вас начинает формироваться пузырь магической воды! +The gap in the bubble closes, and you are fully sealed within the bubble! +Щель в пузыре закрывается, и вы оказываетесь полностью запечатаны внутри пузыря! +Magical water reduces your accuracy and slows you significantly! +Магическая вода снижает вашу точность и значительно замедляет вас! +You attack twice! +Вы атакуете дважды! +You gain a free move from Combat Maneuvers! +Вы получаете свободный ход от Боевых Маневров! +Access denied. +Доступ запрещен. +Facility is under lockdown. +Объект находится под строгой изоляцией. +Please scan ID to continue. +Пожалуйста, чтобы продолжить, отсканируйте свой ID. +Security Door +Защищенная дверь +You break through the security door! +Вы прорываетесь через охраняемую дверь! +High Security Door +Сверх-защищенная дверь +You knock down the security door! +Вы выбиваете защищенную дверь! +Blast Door +Взрывозащищенная дверь +You knock down the blast door! +Вы выбиваете взрывозащищенную дверь! +You sell the ITM for VLU gp. +Вы продаете ITM за VLU зол. +You sell #x ITM for VLU gp. +Вы продаете #x ITM за VLU зол. +You sell #x ITM for VLU gp. +Вы продаете #x ITM за VLU зол. +Directional Vision +Направленное зрение +Your vision is reduced except in the direction you are facing. +Ваше зрение ухудшено, за исключением направления, в котором вы смотрите. +Inertia +Инерция +Turning 180 degrees while moving requires an extra turn +Поворот на 180 градусов во время движения требует дополнительного хода +Heavy Inertia +Сильная инерция +Turning 90 degrees while moving requires an extra turn +Поворот на 90 градусов во время движения требует дополнительного хода +You turn. +Вы поворачиваетесь. +You turn around. +Вы оборачиваетесь. +Take Command +Принять командование +Unlocks several spells for commanding allies. +Открывает несколько способностей для командования союзниками. +Attention! +Внимание! +Select allies in an area +Выберите союзников в области +Designate allies in a 3x3 area to follow orders. +Обозначить союзников в зоне 3х3, чтобы они выполняли приказы. +You select the units. +Вы обозначаете юнитов. +Deselect +Отмена выбора +Select allies in an area +Выберите союзников в области +Deselect allies in a 3x3 area +Отмените обозначение союзников в области 3х3 +You deselect the units. +Вы отменяете обозначение юнитов. +Toggle Selection +Переключить выбор +Select ally +Выберите союзника +Toggle an allied unit's selection status. +Переключите статус обозначение союзного юнита. +You toggle the unit's selection. +Вы переключаете обозначение юнита. +Maneuver +Маневр +Select target location +Выберите точку +Order all selected units to move to the targeted point. +Прикажите всем обозначенным юнитам переместиться в выбранную точку. +You order your units to move! +Вы приказываете своим юнитам переместиться! +Hold Position +Удерживать позицию +Selected units do not pursue enemies. +Обозначенные юниты не преследуют врагов. +Free Movement +Свободное передвижение +Cancels Hold Position on selected units. +Отменяет приказ удерживать позицию у обозначенных юнитов. +Deselect All +Сбросить выбор +Deselects all selected units. +Отменяет обозначение у всех юнитов. +On Me! +За мной! +All selected units start following you +Все обозначенные юниты начинают следовать за вами +Disperse +Рассеяться +All selected units stop following you +Все обозначенные юниты перестают следовать за вами +Defensive Order +Приказ на защиту +All selected units switch to Defensive mode +Все обозначенные юниты переключаются в Оборонительный режим +Aggressive Order +Приказ на агрессию +All selected units switch to Aggressive mode +Все выбранные юниты переключаются в Агрессивный режим +Command +Команды +Unique +Особое +Unlock using magic +Разблокировать с помощью магии +Include Weapons +Включая оружие +Merge Armor +Объединить защиту +You need a special tool to pick this kind of lock. +Вам нужен специальный инструмент, чтобы вскрыть замок этого типа. +The NPC does not have enough money left! +У NPC нет достаточной суммы денег! +You order the ENMY to come to you. +Вы приказываете ENMY подойти к вам. +You order the ENMY to disperse. +Вы приказываете ENMY рассеяться. +You deselect all allies and select only the ENMY. +Вы отменяете обозначение всех союзников и оставляете обозначенной только ENMY. +You remove the ENMY from your party. +Вы удаляете ENMY из своей группы. +Anti-Magic +Анти-Магия +Enchanted +Зачарованное +Cursed +Проклятие +Long ago, war raged across the globe.|Countless lives were lost fighting over pieces of rock in a vast ocean.|People turned to science, religion, and magic, anything to escape this cruel fate. +Давным-давно по всему земному шару бушевала война.|Бесчисленное множество жизней было сгублено в сражениях за обломок скалы в огромном океане.|Люди обращались к науке, религии и магии, ко всему, чему угодно, чтобы избежать этой жестокой участи. +Then the archmagus, Sariel Vinlaga, discovered the secret of immortality.|Sharing her research across the globe, she laid the groundwork for an era of peace.|A great civilization arose, where magic and technology flourished. +Вскоре архимаг Сариэль Винлага открыла секрет бессмертия.|Поделившись своими исследованиями со всем миром, она заложила основу для наступления эры мира.|Возникла великая цивилизация, где процветали и магия и технологии. +But in the end, Sariel's experiments left her weakened and unable to save herself from death.|Without a leader, the Old Civilization collapsed into tyranny as warlords enslaved thousands.|Refugees fled across the sea in search of a new life, and in time the old empire was forgotten. +Но, в конце концов, эксперименты Сариэль ослабили ее и сделали неспособной уберечь себя от смерти.|Без лидера Древняя Цивилизация рухнула в тиранию, воененачальники обратили в рабство тысячи людей.|Беженцы бежали за море в поисках новой жизни, и со временем старая империя канула в лету. +Hundreds of years later, a group of adventurers found a lost island full of ancient technology.|Countless visitors now flock to the ruins in search of wealth and wisdom...|...Unaware of the devious secrets sealed within long ago. +Сотни лет спустя, группа искателей приключений нашла затерянный остров, полный древних технологий.|Бесчисленные исследователи теперь стекаются к руинам в поисках богатства и мудрости...|...Не подозревая о коварных секретах, долгие годы запечатанных внутри. +An item has increased your spell damage! +Этот предмет увеличивает ваш урон от заклинаний! +AMNT ice damage/turn vs. Frozen +AMNT ледяного урона/ход против Замороженных +AMNT shadow bleed (10 turns) +AMNT кровотечения тьмы (10 ходов) +Sealing Talisman +Запечатывающий талисман +You were hit by one of Fuuka's talismans. Fuuka's magic begins sealing your power! +В вас попал один из талисманов Фууки. Магия Фууки начинает запечатывать вашу силу! +You were hit by one of Fuuka's talismans. Fuuka's magic makes you sluggish!! +В вас попал один из талисманов Фууки. Магия Фууки делает вас неповоротливой!! +You were hit by one of Fuuka's talismans. Fuuka's magic renders you helpless!!! +В вас попал один из талисманов Фууки. Магия Фууки делает вас беспомощной!!! +You were hit by one of Fuuka's talisman projectiles. Fuuka's magic is restricting you! +В вас попал один из талисманов-снарядов Фууки. Магия Фууки сковывает вас! +Sealing Shadows +Запечатывающие тени +Shadowy magic is restricting you! +Темная магия сковывает вас! +A powerful seal holds you in place temporarily!!! +Мощная печать временно удерживает вас на месте!!! +You lock yourself in magical locks! +Вы запираете себя на магические замки! +A collar module comes off with the collar! +Вместе с ошейником снимается и модуль ошейника! +Shock Module +Шоковый модуль +A sinister device used to keep unruly wolfgirls in check. +Зловещее устройство, используемое для того, чтобы держать в узде непослушных волчиц. +If it works on them, it sure as heck works on you. It has a warning label that says: 'CAUTION: NOT WATERPROOF' +Если он работает на них, он, конечно же, сработает и на вас. На нем есть предупреждающая надпись: 'ОСТОРОЖНО: НЕ ВОДОНЕПРОНИЦАЕМО' +Tracking Module +Отслеживающий модуль +A homing device used to track unruly pets that wander too far. +Устройство наведения, используемое для отслеживания непослушных питомцев, которые забредают слишком далеко. +It has a warning label that says: 'CAUTION: NOT WATERPROOF' +На нем есть предупреждающая надпись: 'ОСТОРОЖНО: НЕ ВОДОНЕПРОНИЦАЕМО' +Your RestraintName stops working due to water damage! +Ваш RestraintName перестает работать из-за повреждения водой! +Your RestraintName sustains water damage from the high-pressure water! +Ваш RestraintName выдерживает урон от воды под высоким давлением! +The RestraintName fizzles out! +RestraintName отключается! +Your RestraintName short-circuits briefly from the electrical damage! +RestraintName кратковременно уходит в короткое замыкание из-за электрического урона! +Quit Game +Выйти из игры +Your RSTRNT glows and its seal vanishes as the shrine's energy fills the air. +Энергия святилища наполняет воздух. Ваше RSTRNT светится, и печать на нем исчезает. +The seal on your RESTRAINTNAME weakens as you simmer just below the edge. +Печать на RESTRAINTNAME ослабевает, покуда вы томитесь чуть ниже грани. +Through your determination, you suprress the seal on your RESTRAINTNAME!!! +Благодаря своей решимости вы подавляете печать на RESTRAINTNAME!!! +The seal on your RESTRAINTNAME weakens as you maintain your composure. +Печать на RESTRAINTNAME ослабевает, покуда вы сохраняете самообладание. +Through your determination, you suprress the seal on your RESTRAINTNAME. +Благодаря своей решимости вы подавляете печать на RESTRAINTNAME. +You lose focus and the seal on your RESTRAINTNAME strengthens! +Вы теряете концентрацию, а печать на RESTRAINTNAME усиливается! +The item refuses to budge as you try to take it off. +Предмет отказывается сдвинуться с места, как бы вы не пытались его снять. +The item bears a seal of dark pleasure. You can suppress it by edging yourself. +На предмет нанесена печать темного удовольствия. Вы можете подавить ее, удерживая себя на грани. +The seal on your RESTRAINTNAME weakens as you simmer just below the edge. +Печать на RESTRAINTNAME ослабевает, покуда вы томитесь чуть ниже грани. +Through your determination, you suprress the seal on your RESTRAINTNAME!!! +Благодаря своей решимости вы подавляете печать на RESTRAINTNAME!!! +The seal on your RESTRAINTNAME weakens as you maintain your composure. +Печать на RESTRAINTNAME ослабевает, покуда вы сохраняете самообладание. +Through your determination, you suprress the seal on your RESTRAINTNAME. +Благодаря своей решимости вы подавляете печать на RESTRAINTNAME. +You lose focus and the seal on your RESTRAINTNAME strengthens! +Вы теряете концентрацию, а печать на RESTRAINTNAME усиливается! +The item refuses to budge as you try to take it off. +Предмет отказывается сдвинуться с места, как бы вы не пытались его снять. +The item bears a seal of dark pleasure. You can suppress it by edging yourself. +На предмет нанесена печать темного удовольствия. Вы можете подавить ее, удерживая себя на грани. +Saved Outfits +Сохраненные наряды +Manage this Outfit +Изменить текущий наряд +Change Pose +Сменить позу +Quick Color Palette +Быстрая цветовая палитра +Item Color +Цвет предмета +Item Catalog +Каталог Предметов +Layers: +Слои: +Hex Code: +16-ричный код: +Toggle Struggle UI Mode +Переключить UI режим борьбы +Change Character Pose +Изменить позу персонажа +Make Bullets Transparent +Сделать снаряды прозрачными +X-Ray Vision +X-Ray видение +Show Quick Inventory +Показать быстрый инвентарь +Skip Tutorial +Пропустить обучение +Mod Compat Mode (requires reload) +Режим совместимости модов (требуется перезагр.) +Welcome to Kinky Dungeon! It looks like this is your first time,|Would you like a brief walkthrough of the interface? +Добро пожаловать в Kinky Dungeon! Похоже, вы здесь впервые,|хотите ли вы увидеть краткое описание интерфейса? +(Leave and Disable Tutorial) +(Покинуть и отключите обучение) +(Yes Please!) +(Да, пожалуйста!) +(It'd like a hands-on lesson) +(Это как практический урок) +Sure! I can lead you through some excercises in a safe and controlled environment.|This way you can figure things out at your own pace.|To start, choose one of the lessons below: +Отлично! Я могу провести вас через несколько тренировок в безопасной и контролируемой обстановке.|Таким образом, вы сможете разобраться во всем в своем собственном темпе.|Для начала выберите один из приведенных ниже уроков: +(Give me some rope lessons) +(Дай мне несколько уроков по веревкам) +(Give me a nice leather outfit) +(Подари мне красивую кожаную одежду) +(I enjoy the cold embrace of steel) +(Мне нравятся холодные объятия стали) +(I love rubber!) +(Я люблю резину!) +(On second thought, maybe not) +(Если так подумать, лучше не надо) +(About that hands-on lesson...) +(Насчет практического урока...) +This is you.|Over the course of the game, you will probably get tied up.|The controls to escape are located over your character.|Simply hover the mouse over your character to see them. +Это вы.|По ходу игры вас, вероятно, свяжут.|Элементы управления для освобождения расположены поверх вашего персонажа.|Просто наведите курсор мыши на вашего персонажа, чтобы увидеть их. +There are four main ways to escape restraints:|Struggling, which is effective against flexible and weaker restraints,|Cutting, which depends on your held weapon and the item's properties,|Unbuckle/Untying, which depends on having free hands,|And Unlocking, which is required before you can Unbuckle. +Существует четыре основных способа освободиться от ограничителей:|Борьба, которая эффективна против растягивающихся и более хрупких ограничителей,|Разрезание, которое зависит от вашего оружия и свойств предмета,|Расстегивание/Развязывание, которое зависит от наличия свободных рук,|И Разблокировка, которую требуется выполнить, прежде чем вы сможете Расстегнуть. +These are options for how to display your character.|You don't have to worry about them for now,|but when your character is tied up you may find them useful|...or enjoyable. +Это варианты отображения вашего персонажа.|Пока вам не нужно беспокоиться о них,|но когда ваш персонаж будет связан, они могут оказаться полезными|...или доставить удовольствие. +This is the buffs bar.|It shows various values and buffs relating to your character.|You can click the gold triangle to expand it,|Showing additional info about your character. +Это панель усилений (баффов).|На ней отображаются различные значения и баффы, относящиеся к вашему персонажу.|Вы можете нажать на золотой треугольник, чтобы развернуть её и|увидеть дополнительную информацию о вашем персонаже. +These are the action buttons.|You can use them to perform various actions like closing doors or sprinting.|You can also toggle various settings such as automatically passing|through allies or auto-pathing when there are no enemies nearby.|You can also swap between recently used weapons. +Это кнопки действий.|Вы можете использовать их для выполнения различных действий, таких как закрытие дверей или активации спринта.|Вы также можете переключать различные настройки, такие как автоматическое прохождение сквозь|союзников или автоматическое прокладывание маршрута, когда поблизости нет врагов.|Вы также можете переключаться между недавно использованными орудиями. +These are various submenus.|Your Inventory is used to brows items and use or equip them.|The Journal contains lore, notes, and hints gathered along your journey.|The Journal also contains info on available quests,|and your reputation with various factions. +Это различные подменю.|Ваш инвентарь используется для просмотра предметов, которые можно использовать или экипировать.|Журнал содержит знания, заметки и подсказки, собранные во время вашего путешествия.|Также журнал содержит информацию о доступных квестах и вашей репутации в различных фракциях. +This is the status bar, which gives info on your base stats.|Distraction determines how easy it is to cast spells and resist teasing.|Stamina is required to sprint and attack with a weapon.|Mana is used to cast spells. You have what is called a 'Mana Pool,'|which is excess mana that slowly refills you mana bar until it runs out.|Finally, running out of Willpower makes it much harder to escape bondage. +Это панель состояния, в которой отображается информация о ваших основных характеристиках.|Отвлечение определяет, насколько легко вам произносить заклинания и сопротивляться поддразниванию.|Выносливость требуется для спринта и атаки с оружием.|Мана используется для произнесения заклинаний. Так же у вас есть так называемый 'резерв маны',|который представляет собой избыток маны, который медленно пополняет ваш запас маны, пока сам не закончится.|Наконец, истощение силы воли значительно затрудняет освобождение из ограничителей. +This is the hotbar.|Here you will find various spells and customizable actions.|You can customize it through the Spells submenu by clicking on a spell.|You can also add items, armor, and consumables to it from the Inventory. +Это быстрая панель.|Здесь вы найдете различные заклинания и настраиваемые действия.|Вы можете настроить её через подменю 'Заклинания', нажав на заклинание.|Вы также можете добавить на эту панель предметы, броню и расходные материалы из инвентаря. +Finally, this is where the message log will be.|It provides a written record of what happened the last few turns.|You can click the 'Log' button to expand the log,|Allowing you to look much further back. +Наконец, здесь будет находиться лог сообщений.|Он предоставляет письменную запись о том, что произошло за последние несколько ходов.|Вы можете нажать кнопку 'Журнал', чтобы развернуть журнал, что позволит вам заглянуть гораздо дальше в прошлое. +Thats it for the UI.|If you want a more hands on tutorial, enter the portal to the top right,|near the training dummies.|You can click on NPCs (such as the ghosts in this room) to talk to them. +Вот и все, что касается основного интерфейса.|Если вы хотите получить более подробное руководство, зайдите в портал справа вверху,|рядом с учебными манекенами.|Вы можете нажать на неигровых персонажей (например, призраков в этой комнате), чтобы поговорить с ними. +Game +Игра +Menu +Меню +Search ITMNS: +Искать ITMNS: +Search Items: +Поиск предметов: +Search Spells: +Поиск заклинаний: +Free +Свободна +Disarmed!!! +Обезоружена!!! +Show Buffs and Stats +Показать баффы и характеристики +Quests +Задания +Remove Devotion +Отказаться от посвящения +Devote Yourself +Посвятить себя +Pray for Assistance +Молитва о помощи +This shrine bears a request carved in stone: +На этом святилище высечена просьба на камне: +Accept the Quest +Принять задание +You accept the goddess' quest. +Вы принимаете задание богини. +You cannot accept that quest right now. +Вы не можете сейчас принять это задание. +Removes your devotion from this goddess. +Отменяет ваше посвящения этой богине. +You are not devoted to this goddess. +Вы больше не посвящаете себя этой богине. +Guarantees a quest from this goddess on every floor. +Гарантирует квесты от этой богини на каждом этаже. +You are already a devotee of this goddess. +Вы уже являетесь посвященной этой богини. +Offer gold in exchange for help. Destroys the shrine. +Предложить золото в обмен на помощь. Разрушает святилище. +Ask for help without offering gold. +Попросить о помощи, не предлагая золота. +You have already prayed at this shrine. +Вы уже молились в этом храме. +Listen to what the Goddess asks of you. +Послушать, о чем просит вас Богиня. +Accept the Goddess' quest. +Принять заданием Богини. +Drink the mana in the shrine. Can be done once. +Выпить ману из святилища. Можно сделать только один раз. +Bottle the mana in the shrine for later. Can be done once. +Сохранить ману из святилища в бутылке. Можно сделать один раз. +Cancel Quest +Отменить задание +Cancels the quest. You will not be penalized. +Отменяет задание. На вас не будут наложены штрафы. +You can't cancel this quest. +Вы не можете отменить это задание +You have no quests currently. +На данный момент у вас нет заданий. +A new quest has been added to your Journal. +В ваш Журнал добавлено новое задание. +Find the dressmaker's prized dress and wear it in front of her. +Найдите драгоценное платье портнихи и покажитесь в нём перед ней. +Rescue the bandit from false imprisonment. +Спасите бандитку из незаконного заключения. +Teach some unruly maids a lesson. +Преподайте урок нескольким непослушным горничным. +Defeat a rebel leader and show them their place. +Победите лидера повстанцев и покажите им их место. +Help the student acquire a scroll! +Помогите студентке раздобыть свиток! +You are being chased by a band of relentless poachers. +За вами гонится банда безжалостных браконьеров. +Slay the Rope Kraken. +Убейте Веревочного Кракена. +You did not do your quest! The Goddess has decided to punish you. +Вы не выполнили свое задание! Богиня решила наказать вас. +You have pleased the Goddess. +Вы удовлетворили Богиню. +The Goddess calls you a good girl. +Богиня называет вас хорошей девочкой. +Rescue some alchemists from their own experiment. +Спасите нескольких алхимиков от их собственного эксперимента. +You did not do your quest! The Goddess has decided to punish you. +Вы не выполнили свое задание! Богиня решила наказать вас. +You have pleased the Goddess. +Вы удовлетворили Богиню. +The Goddess calls you a good girl. +Богиня называет вас хорошей девочкой. +Stop rebels from making a pact with primordial beings. +Помешайте мятежникам заключить пакт с изначальными существами. +You did not do your quest! The Goddess has decided to punish you. +Вы не выполнили свое задание! Богиня решила наказать вас. +You have pleased the Goddess. +Вы удовлетворили Богиню. +You have pleased the Goddess. +Вы удовлетворили Богиню. +Decommission some malfunctioning drones. +'Выведите из эксплуатации' несколько неисправных дронов. +You did not do your quest! The Goddess has decided to punish you. +Вы не выполнили свое задание! Богиня решила наказать вас. +You have pleased the Goddess. +Вы удовлетворили Богиню. +The Goddess calls you a good girl. +Богиня называет вас хорошей девочкой. +Resolve a dispute between elves and catgirls by tying up both sides. +Разрешите спор между эльфами и девушками-кошками, связав обе стороны. +You did not do your quest! The Goddess has decided to punish you. +Вы не выполнили свое задание! Богиня решила наказать вас. +You have pleased the Goddess. +Вы удовлетворили Богиню. +The Goddess calls you a good girl. +Богиня называет вас хорошей девочкой. +Repel a planar incursion by a dangerous demon. +Отразите планарное вторжение опасного демона. +You did not do your quest! The Goddess has decided to punish you. +Вы не выполнили свое задание! Богиня решила наказать вас. +You have pleased the Goddess. +Вы удовлетворили Богиню. +The Goddess calls you a good girl. +Богиня называет вас хорошей девочкой. +Stop some witches from performing a dubious summoning ritual. +Остановите группу ведьм от проведения сомнительного ритуала призыва. +You did not do your quest! The Goddess has decided to punish you. +Вы не выполнили свое задание! Богиня решила наказать вас. +You have pleased the Goddess. +Вы удовлетворили Богиню. +The Goddess calls you a good girl. +Богиня называет вас хорошей девочкой. +Defeat a congregation of the Shadow Clan. +Победите собравшихся членов Клана Теней. +You did not do your quest! The Goddess has decided to punish you. +Вы не выполнили свое задание! Богиня решила наказать вас. +You have pleased the Goddess. +Вы удовлетворили Богиню. +The Goddess calls you a good girl. +Богиня называет вас хорошей девочкой. +The Goddess grants you knowledge of SpellLearned! +Богиня дарует вам знания о SpellLearned! +You Goddess grants you +AMOUNT spell points! +Ваша Богиня дарует вам +AMOUNT очков способностей! +The Goddess bestows a WeaponAcquired on you! +Богиня дарует вам WeaponAcquired! +The Goddess grants you a ArmorAcquired! +Богиня дарует вам ArmorAcquired! +The Goddess gives you a heavenly pastry. +Богиня угощает вас небесной выпечкой. +The Goddess awards you an ancient key of great importance. +Богиня награждает вас древним ключом, имеющим огромное значение. +Game Setup +Настройки игры +Challenge Settings +Настройки сложности +Challenge Settings: +Настройки сложности: +Simple +Простое +Advanced +Продвинутое +Expert Tools +Проф. инструменты +Exits locked!|Find NUMBER keys! +Выход заперт!|Найдите ключи: NUMBER! +Got the keys! +Ключ у вас! +Key Hunt +Охота за ключами +Find the keys hidden in the level. Enemies can steal the keys if you aren't careful. +Найдите ключи, спрятанные на уровне. Враги могут украсть ключи, если вы не будете осторожны. +There seems to be a locked high-security door. Looks like you need keys to open it. +Похоже, здесь запертая дверь повышенной безопасности. Судя по всему, вам нужны ключи. +Exits locked!|Find a lever! +Выход заперт!|Найдите рычаг! +Exits unlocked! +Выход открыт! +Lever Hunt +Охота за рычагами +Find the lever hidden in the level to unlock the door. +Найдите спрятанный на уровне рычаг, чтобы открыть дверь. +There seems to be a locked high-security door. Looks like you need to pull a lever to open it. +Похоже, здесь запертая дверь повышенной безопасности. Судя по всему, вам нужно найти и потянут рычаг. +Exits locked!|Find control panel! +Выходы заперт!|Найдите панель управления! +Exits unlocked! +Выход открыт! +Panel Hunt +Охота за панелями +Find the control panel hidden in the level to unlock the door. +Найдите спрятанную на уровне панель управления, чтобы открыть дверь. +There seems to be a locked high-security door. Looks like you need find a control panel to open it. +Похоже, здесь запертая дверь повышенной безопасности. Судя по всему, вам нужно найти панель управления. +BOSS ROOM +КОМНАТА БОССА +BOSS ROOM CLEARED! +КОМНАТА БОССА ЗАЧИЩЕНА! +Boss +Босс +Defeat the boss to unlock the door. You can also unlock it by losing to the boss and being penalized. +Победите босса, чтобы открыть дверь. Вы также можете открыть ее, проиграв боссу и получив штраф. +There seems to be a locked high-security door. Looks like you need to defeat the boss to open it. +Похоже, здесь запертая дверь повышенной безопасности. Судя по всему, вам нужно победить босса. +Exits locked!|Defeat NUMBER TYPE! +Выходы заперт!|Победите NUMBER TYPE! +Quota Reached! +Квота достигнута! +Bounty +Охота за головами +Defeat the specified targets to unlock the door. +Уничтожьте заданные цели, чтобы открыть дверь. +There seems to be a locked high-security door. Looks like you need to defeat the targetted enemies to open it. +Похоже, здесь запертая дверь повышенной безопасности. Судя по всему, вам нужно победить помеченных врагов. +Exits locked!|Defeat TYPE! +Выходы заперт!|Победите TYPE! +Miniboss defeated! +Минибосс побежден! +Dangerous Bounty +Опасная охота +Defeat the specified strong enemy to unlock the door. +Победите указанного сильного врага, чтобы открыть дверь. +There seems to be a locked high-security door. Looks like you need to defeat the miniboss to open it. +Похоже, здесь запертая дверь повышенной безопасности. Судя по всему, вам нужно победить минибосса. +Exits locked!|Open NUMBER Chests! +Выходы заперт!|Откройте NUMBER сундуков! +Quota Reached! +Квота достигнута! +Chest Hunt +Охота за сундуками +Unlock the specified number of chests to unlock the door. +Откройте требуемое количество сундуков, чтобы открыть дверь. +There seems to be a locked high-security door. Looks like you need to open more chests to open it. +Похоже, здесь запертая дверь повышенной безопасности. Судя по всему, вам нужно открыть еще несколько сундуков. +Exits locked!|Accept NUMBER Quests! +Выходы заперт!|Примите NUMBER квестов! +Quota Reached! +Квота достигнута! +Quest Hunt +Охота за заданиями +Accept the specified number of goddess quests to unlock the door. +Возьмите требуемое количество заданий богинь, чтобы открыть дверь. +There seems to be a locked high-security door. Looks like you need to accept more quests to open it. +Похоже, здесь запертая дверь повышенной безопасности. Судя по всему, вам нужно принять больше заданий. +Exits locked!|Trigger NUMBER Traps! +Выходы заперт!|Активируйте NUMBER ловушек! +Quota Reached! +Квота достигнута! +Trap Hunt +Охота за ловушками +Trigger the specified number of traps to unlock the door. +Активируйте требуемое количество ловушек, чтобы открыть дверь. +There seems to be a locked high-security door. Looks like you need to trigger more traps to open it. +Похоже, здесь запертая дверь повышенной безопасности. Судя по всему, вам нужно активировать больше ловушек. +Room bugged. Please Report. +В комната произошла ошибка. Пожалуйста, создайте репорт. +None +Нет +This door failed to load and cannot be opened. Please report this bug to Ada with a save code. +Эта дверь не загрузилась и не может быть открыта. Пожалуйста, сообщите об этой ошибке Ada, предоставив сейв-код. +None +Нет +This door failed to load and cannot be opened. Please report this bug to Ada with a save code. +Эта дверь не загрузилась и не может быть открыта. Пожалуйста, сообщите об этой ошибке Ada, предоставив сейв-код. +Exit sealed!|Find the lair! +Выход закрыт!|Найдите логово! +Sigils erased! +Символы стерты! +Dragon defeated! +Дракон повержен! +Draconic Seal +Драконья печать +A dragon has sealed the entrance. Defeat the dragon, or erase the sigil from her lair. +Дракон запечатал выход. Победите дракона или сотрите символ из его логова. +A draconic spell keeps the door sealed. You will have to confront its owner. +Драконье заклинание запечатает дверь. Вам придется сразиться с его владельцем. +Exits locked!|Destroy NUMBER Servers! +Выходы заблокированы!|Уничтожьте серверы х NUMBER! +Security System Compromised! +Система безопасности взломана! +Clearance Granted! +Разрешение получено! +Destroy Nevermere Servers +Уничтожьте серверы Невермера +Destroy Nevermere servers to unlock the door. +Уничтожьте серверы Невермера, чтобы открыть дверь. +Nevermere Inc. placed a computerized lock on the door. Destroy the security servers to pass. +Корпорация Невермер установила на двери электронный замок. Уничтожьте серверы безопасности, чтобы пройти дальше. +Nevermere Server +Сервер Невермера +Server smashed! +Сервер разбит! +Exits locked!|Destroy NUMBER Servers! +Выход заблокирован!|Уничтожьте серверы х NUMBER! +Security System Compromised! +Система безопасности взломана! +Clearance Granted! +Разрешение получено! +Destroy Drone Servers +Уничтожьте серверы Дронов +Destroy Drone Node Servers to unlock the door. +Уничтожьте серверные узлы Дронов, чтобы открыть дверь. +The path forward is controlled by several ancient Drone Servers. Destroy them. +Путь вперед контролируется несколькими древними серверами Дронов. Уничтожьте их. +Drone Server Node +Серверный узел дронов +Drone node destroyed! +Узел дронов уничтожен! +Rusty Server Node +Ржавый серверный узел +Drone node destroyed! +Узел дронов уничтожен! +loud beeping... +громкий звуковой сигнал... +(Cursed) +(Проклято) +(Purified) +(Очищено) +(Purified) +(Очищено) +of Agility +(Ловкость) +Precise +(Точность) +Silent +(Молчание) +Blizzard +(Метель) +of Warding +(Защита) +of Freedom +(Свобода) +of Resistance +(Сопротивление) +of Power +(Сила) +Arcane +(Аркана) +Entuned +(Гармония) +Draining +(Осушение) +of Echoes +(Отголоски) +Infused +(Насыщение) +Explosive +(Взрыв) +Flaming +(Пламя) +Shadow +(Тень) +Focusing +(Сосредоточие) +of Empowerment +(Возможности) +of Destruction +(Разрушение) +Phase Dance +Фазовый танец +For 4 turns, your movement does not advance time. Attacking or casting counts as one move and passes time as normal. +В течение 4 ходов ваше движение не затрачивает время. Атака или применение способности засчитываются как одно движение и время проходит как обычно. +You are F A S T +Вы Б Ы С Т Р Ы +Double Accel +Двойное ускорение +Slow down time by 1/2 for 10 turns (world time). Stamina regens 50% slower. +Замедляет время до 1/2 на 10 ходов (по времени мира). Выносливость восстанавливается на 50% медленнее. +Time is slowed by 2x +Время замедляется в 2 раза +Triple Accel +Тройное ускорение +Slow down time by 1/3 for 10 turns (world time). Stamina regens 75% slower. +Замедляет время до 1/3 на 10 ходов (по времени мира). Выносливость восстанавливается на 75% медленнее. +Time is slowed by 3x +Время замедляется в 3 раза +Quad Accel +Четверное ускорение +Slow down time by 1/4 for 10 turns (world time). Stamina does not regen. +Замедляет время до 1/4 на 10 ходов (по времени мира). Выносливость не восстанавливается. +Time is slowed by 4x +Время замедляется в 4 раза +Total Accel +Абсолютное ускорение +Stop time 10 turns (world time). Stamina does not regen. +Останавливает время на 10 ходов (по времени мира). Выносливость не восстанавливается. +Time has come to a halt... +Время останавливается... +Time slows down by 2x! +Время замедлилось в 2 раза! +Double Accel! +Двойное ускорение! +Time slows down by 3x! +Время замедлилось в 3 раза! +Triple Accel! +Тройное ускорение! +Time slows down by 4x! +Время замедлилось в 4 раза! +Quad Accel! +Четверное ускорение! +Time has ceased to pass. +Время остановило свой ход. +Total Accel! +Абсолютное ускорение! +You begin to move at lightning speed! +Вы начинаете двигаться с молниеносной скоростью! +ACCEL BEGIN! +УСКОРЕНИЕ! +Not enough mana. +Недостаточно маны. +You need to free your legs. +Вам нужно освободить свои ноги. +Swap +Замена +Choose a target with a clear line of sight to you and switch places with them. +Выберите цель, находящуюся в пределах прямой видимости от вас, и поменяйтесь с ней местами. +You point at the target and swap places with them! +Вы указываете на цель и меняетесь с ней местами! +You point at the target and try tp swap places, but they resist! +Вы указываете на цель и пытаетесь поменяться местами, но она сопротивляется! +You point at the target and try tp swap places, but they resist and the spell fails! +Вы указываете на цель и пытаетесь поменяться местами, но она сопротивляется, и заклинание терпит неудачу! +Choose target to swap with +Выберите цель, с которой хотите поменяться местами +The ENMY blocked your attack, negating it entirely! +ENMY блокирует вашу атаку, полностью сводя ее на нет! +The ENMY blocked your attack, reducing the damage by PCNT%! +ENMY блокирует вашу атаку, уменьшая ее урон на PCNT%! +The ENMY remains unscathed after putting up a strong defense! +ENMY не получает повреждений после создания сильной защиты! +The ENMY puts up surprising resistance, reducing the damage by PCNT%. +ENMY оказывает неожиданное сопротивление, уменьшая урон на PCNT%. +no damage +нет урона +Raise Defenses +Усилить защиту +Spend 90 stamina to shield yourself from damage equal to your Block. Lasts 10 turns or until you attack. +Потратьте 90 единиц выносливости, чтобы заблокировать урон, равный вашему Блоку. Длится 10 ходов или до тех пор, пока вы не атакуете. +Evasive Maneuvers +Маневры уклонения +While active, you evade almost all attacks, but your stamina is drained by 50 per turn plus 10 per slow level. The base stamina cost is reduced by your Evasion. +Пока активно, вы уклоняетесь почти от всех атак, но ваша выносливость истощается на 50 за ход плюс на 10 за каждый уровень замедления. Базовая стоимость выносливости снижается за счет вашего Уклонения. +Break Free +Вырваться на свободу +Consume 20 Battle Rhythm to increase escape power by +20% plus 1% of Bondage Resist. Lasts 60 turns or until your willpower reaches 0. +Потратьте 20 Боевого Ритма, чтобы увеличить эффективность освобождения на +20% плюс 1% от Сопротивления Сковыванию. Длится 60 ходов или пока ваша сила воли не достигнет 0. +Problem Solving +Решение проблем +While active, struggling takes an additional 10 turns, but escape power bonuses from tools and buffs is increased by +(25 + 20% Bondage Resist)% +Пока активно, борьба занимает дополнительные 10 ходов, но бонусы к эффективности освобождения от инструментов и баффов увеличиваются на +(25 + 20% от Сопротивления Сковыванию)% +You run out of strength to keep dodging... +У вас заканчиваются силы, вы больше не можете продолжать уклоняться... +You can't muster the strength to dodge right now... +Вы не можете собраться с силами, чтобы начать сейчас эффективно уклоняться... +You prepare to dodge!!! +Вы готовы уклоняться!!! +Your expertise and skill provides you with additional tool effectiveness! (+AMOUNT%) +Ваш опыт и мастерство увеличивают эффективность используемых вами инструментов! (+AMOUNT%) +You don't have enough stamina. +У вас недостаточно выносливости. +You raise your defences! +Вы усиляете свою защиту! +Your defenses are raised! +Ваша защита усилена! +You don't have the will to break free. +У вас недостаточно силы воли, чтобы попытаться вырваться на свободу. +You don't have enough Battle Rhythm. You need 20. +Вам не хватает Боевого Ритма. Вам нужно 20. +You channel your fighting spirit into your desire for freedom! +Вы направляете свой строптивый дух в свое стремление к свободе! +Your struggle power is greatly increased!!! +Ваша эффективность борьбы значительно увеличивается!!! +The teleportation partially succeeds due to an obstruction, placing you near the intended point. +Телепортация завершается лишь частично из-за препятствия, и вы оказываетесь рядом с намеченной точкой. +The teleportation fizzles due to obstruction. +Телепортация завершается неудачно из-за препятствия. +Confirm +Подтвердить +Confirm and OVERWRITE SAVE +Подтвердить и ПЕРЕЗАПИСАТЬ СОХРАНЕНИЕ +What is your name? +Как вас зовут? +Enrage +Ярость +Scream loudly, causing nearby enemies to investigate and increasing Battle Rhythm by 10. Has a 100 turn cooldown. +Громко закричать, заставляя ближайших врагов начать вас искать и увеличивая Боевой Ритм на 10. Имеет время восстановления в 100 ходов. +You shout loudly and shake your fist at the sky! (+10 BR) +Вы громко кричите и потрясаете кулаком в небо! (+10 БР) +Mmmph! (You can't shout while gagged) +Мммфх! (Вы не можете кричать с кляпом во рту) +You are plenty mad enough as is. +Вы и так достаточно яростны. +You are too tired to rage. Perhaps try a warm cozy bed instead? +Вы слишком устали, чтобы войти в ярость. Может быть, вместо этого попробуете лечь в теплую уютную постель? +turns +ходов +Your shield absorbed AMNT damage. +Ваш щит поглощает AMNT урона. +You are currently shielded from damage and some spells. +В данный момент вы защищены от урона и некоторых заклинаний. +No offhand weapon set. Activate the spell in your hotbar to set one. +Нет назначенного в левую руку оружия. Активируйте заклинание на быстрой панели, чтобы назначить оружие. +Flash Portal +Быстрый портал +After channeling for 2 turns, teleport to a nearby location (including into darkness). All adjacent creatures are teleported with you, in random order. +После применения в течении 2 ходов вы телепортируетесь в близлежащее место (в том числе во тьму). Все соседние существа телепортируются вместе с вами в случайном порядке. +You call upon a misty portal to transport you and nearby creatures! +Вы призываете туманный портал, который переносит вас и близлежащих существ! +Choose target location +Выберите целевое местоположение +Transportation Portal +Транспортировочный портал +After channeling for 3 turns, teleport to a nearby location (including into darkness). Transports only allies, but they are stunned for the duration. +После применения в течении 3 ходов вы телепортируетесь в близлежащее место (в том числе во тьму). Транспортирует только союзников, но они оглушаются на некоторое время. +You call upon a misty portal to transport you and your allies! +Вы призываете туманный портал, который переносит вас и ваших союзников! +Choose target location +Выберите целевое местоположение +Banishing Portal +Изгоняющий портал +After channeling for 3 turns, teleport all adjacent creatures to a point you can see. Does not teleport yourself. +Применяется 3 хода. Вы телепортируете всех соседних существ в точку, которую вы можете видеть. Сами вы не телепортируетесь. +You call upon a misty portal to transport those around you! +Вы призываете туманный портал, который переносит всех, кто вас окружается! +Choose target location +Выберите целевое местоположение +Rift +Разлом +Tearing a rift in space, you teleport to a location (including into darkness). Leaves behind a rift for 4 turns, which enemies can follow you through. +Создавая разлом в пространстве, вы телепортируетесь в определенное место (в том числе во тьму). Оставляет за собой разлом на 4 хода, через который враги могут следовать за вами. +You tear open a hole in space and step through! +Вы создаете дыру в пространстве и проходите сквозь нее! +Choose target location +Выберите целевое местоположение +Shadow Dance +Танец теней +While standing in a shadowed location, you can teleport to a nearby shadowed location. You can also teleport adjacent to shadow creatures. +Стоя в затененном месте, вы можете телепортироваться в соседнее затененное место. Вы также можете телепортироваться рядом с теневыми существами. +You slip between the shadows... +Вы проскальзываете между тенями... +Choose a shadow +Выберите тень +Teleportation Circle A +Круг телепортации А +When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. When learned, unlocks teleportation circle B and C as well. +При применении на клетку создает круг телепортации. При применении на себя, после поддержания в течении 10 ходов телепортирует вас и ближайших союзников в круг телепортации. Когда выучено, также открывает круги телепортации B и C. +You begin a teleportation ritual... +Вы начинаете ритуал телепортации... +Choose a location to put a teleportation circle, or yourself to teleport to the created circle. +Выберите клетку для установки круга телепортации или себя, чтобы телепортироваться в созданный круг. +Teleportation Circle B +Круг телепортации В +When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. +При применении на клетку создает круг телепортации. При применении на себя, после поддержания в течении 10 ходов телепортирует вас и ближайших союзников в круг телепортации. +You begin a teleportation ritual... +Вы начинаете ритуал телепортации... +Choose a location to put a teleportation circle, or yourself to teleport to the created circle. +Выберите клетку для установки круга телепортации или себя, чтобы телепортироваться в созданный круг. +Teleportation Circle C +Круг телепортации С +When cast on a point, creates a teleportation circle. When cast on yourself, channel for 10 turns to teleport yourself and nearby allies to the teleportation circle. +При применении на клетку создает круг телепортации. При применении на себя, после поддержания в течении 10 ходов телепортирует вас и ближайших союзников в круг телепортации. +You begin a teleportation ritual... +Вы начинаете ритуал телепортации... +Choose a location to put a teleportation circle, or yourself to teleport to the created circle. +Выберите клетку для установки круга телепортации или себя, чтобы телепортироваться в созданный круг. +Nature Spirit +Дух природы +The nature spirit returns to the earth from whence it came. +Дух природы возвращается в землю, откуда он пришел. +Vine Bolt +Лоза-снаряд +Gunslinger +Стрелок +Weapons abilities and other abilities that cost charge contribute 20% of their cost to Battle Rhythm. +Способности оружия и другие способности, затрачивающие Заряд, вносят 20% от своей стоимости в Боевой Ритм. +Effortless Assault +Атака без усилий +Weapon stamina cost is reduced by a percentage equal to your Battle Rhythm. +Стоимость выносливости у оружия снижается на процент, равный вашему Боевому Ритму. ++50 Evasion from using Phase ++50 к Уклонению от использования Фазирования +Blade Dance +Танец клинков +Costs 60 stamina to dash to an adjacent spot. If you are holding a physical weapon, deals cleave damage to nearby enemies equal to 50% weapon damage. If you have a Light offhand weapon, deal 75% of its damage as well. +За 60 выносливости вы можете рывком переместиться в соседнее место. Если у вас в руках физ. оружие, вы нанесете ближайшим врагам рассекающий урон, равный 50% урона от оружия. Если у вас легкое оружие в левой руке, вы также наносите 75% от его урона. +You spin towards a location, slashing at nearby enemies! +Вы вращаетесь в направлении определенной локации, нанося удары по ближайшим врагам! +Choose target location +Выберите целевое местоположение +The Shadow Within +Тень внутри +Shadow Dance no longer requires you to be in shadow in order to dash to another shadow, but the mana cost is doubled when doing so. +Танец теней больше не требует, чтобы вы находились в тени, чтобы перебежать в другую тень, но при этом затраты маны удваиваются. +Summon Holy Orb +Призыв священного шара +Select where to put the holy orb (cannot place on occupied squares) +Выберите, куда поместить священный шар (нельзя размещать на занятых клетках) +Create a stationary holy orb that lasts indefinitely and heals allies. It also fires blinding bolts at enemies within its aura. If you let go of yourself near a holy orb you are immediately punished. Should not be placed within 8 tiles of each other. +Стационарный свящ. шар, который существует бесконечно и исцеляет союзников. Он также стреляет ослепляющими разрядами по врагам в пределах своей ауры. Если вы достигните оргазма рядом с шаром, вы будете немедленно наказаны. Нельзя размещать на расстоянии менее 8 плиток друг от друга. +A holy orb descends, blessing you with its roundness. +Священный шар ниспускается к вам, благословляя вас своей округлостью. +You call upon the root of all enlightenment! +Вы взываете к корню всего просветления! +Holy Orb +Священный шар +The holy orb returns to its place in the sky. +Священный шар возвращается на свое место в небе. +Holy Bolt +Священный заряд +The holy orb observes your lack of discipline, and issues a punishment. +Священный шар замечает вашу недисциплинированность и назначает наказание. +Divine Chastity Belt +Божественный пояс целомудрия +A chastity belt forged in holy light. Only a Goddess' will can release you. +Пояс целомудрия, выкованный в святом свете. Только воля Богини может освободить вас. +There is no way even an angel can free herself. Its divine aura causes vibrators to cease right before you go over the edge. +Из него нет выхода, даже ангелы не могут себя освободить. Его божественная аура заставляет вибраторы отключаться прямо перед тем, как вы перейдете грань. +Your Divine Chastity Belt causes the vibrators to stop. +Ваш Божественный пояс целомудрия заставляет вибраторы остановиться. +Divine Chastity Belt +Божественный пояс целомудрия +A chastity belt forged in holy light. Only the will of a Goddess will release you! +Пояс целомудрия, выкованный в святом свете. Только воля Богини может освободить вас! +There is no way even an angel can free herself. Its divine aura causes vibrators to cease right before you go over the edge. +Из него нет выхода, даже ангелы не могут себя освободить. Его божественная аура заставляет вибраторы отключаться прямо перед тем, как вы перейдете грань. +You find a heavenly chastity belt. Who could it be for? +Вы находите небесный пояс целомудрия. Для кого он может предназначаться? +Divine Chastity Bra +Божественный бюстгальтер целомудрия +A chastity bra forged in holy light. Only a Goddess' will can release you. +Бюстгальтер целомудрия, выкованный в святом свете. Только воля Богини может освободить вас. +There is no way even an angel can free herself. Its divine aura prevents you from pleasuring yourself. +Из него нет выхода, даже ангелы не могут себя освободить. Его божественная аура мешает вам доставить себе удовольствие. +Your Divine Chastity Bra causes your whole body to go numb. +Ваш божественный бюстгальтер целомудрия заставляет все ваше тело онеметь. +Divine Chastity Bra +Божественный бюстгальтер целомудрия +A chastity bra forged in holy light. Only the will of a Goddess will release you! +Бюстгальтер целомудрия, выкованный в святом свете. Только воля Богини освободит вас! +There is no way even an angel can free herself. Its divine aura prevents you from pleasuring yourself. +Из него нет выхода, даже ангелы не могут себя освободить. Его божественная аура мешает вам доставить себе удовольствие. +You find a heavenly chastity bra. Who could it be for? +Вы находите небесный бюстгальтер целомудрия. Для кого он может предназначаться? +Heavenly Chastity Belt +Небесный пояс целомудрия +A chastity belt forged in holy light. Only a Goddess' will can release you. +Пояс целомудрия, выкованный в святом свете. Только воля Богини может освободить вас. +There is no way even an angel can free herself. Its divine aura causes vibrators to dampen right before you go over the edge. +Из него нет выхода, даже ангелы не могут себя освободить. Его божественная аура заставляет вибраторы замедляться прямо перед тем, как вы перейдете грань. +Your Divine Chastity Belt magically dampens the vibrations just enough to edge you. +Ваш Божественный пояс целомудрия волшебным образом подавляет вибрации ровно настолько, чтобы остановить вас на краю. +Heavenly Chastity Belt +Небесный пояс целомудрия +A chastity belt forged in holy light. Only the will of a Goddess will release you! +Пояс целомудрия, выкованный в святом свете. Только воля Богини может освободить вас. +There is no way even an angel can free herself. Its divine aura causes vibrators to dampen right before you go over the edge. +Из него нет выхода, даже ангелы не могут себя освободить. Его божественная аура заставляет вибраторы замедляться прямо перед тем, как вы перейдете грань. +You find a heavenly chastity belt. Who could it be for? +Вы находите небесный пояс целомудрия. Для кого он может предназначаться? +Heavenly Chastity Bra +Небесный бюстгальтер целомудрия +A chastity bra forged in holy light. Only a Goddess' will can release you. +Бюстгальтер целомудрия, выкованный в святом свете. Только воля Богини может освободить вас. +There is no way even an angel can free herself. Its divine aura converts self-pleasure to stamina. +Из него нет выхода, даже ангелы не могут себя освободить. Его божественная аура конвертирует самоудовлетворение в выносливость. +The divine aura drains the pleasure from your self-pleasuring and converts it to stamina. +Божественная аура поглощает удовольствие от вашего самоудовлетворения и преобразует его в выносливость. +Heavenly Chastity Bra +Небесный бюстгальтер целомудрия +A chastity bra forged in holy light. Only the will of a Goddess will release you! +Бюстгальтер целомудрия, выкованный в святом свете. Только воля Богини освободит вас! +There is no way even an angel can free herself. Its divine aura converts self-pleasure to stamina. +Из него нет выхода, даже ангелы не могут себя освободить. Его божественная аура конвертирует самоудовлетворение в выносливость. +You find a heavenly chastity bra. Who could it be for? +Вы находите небесный бюстгальтер целомудрия. Для кого бы он мог предназначаться? +Magic Arm Belts +Магические ремни на руки +Highly secure belts enchanted with magic. +Ремни повышенной надежности, зачарованные магией. +Lockable and fully adjustable to ensure snugness. +Запираются и точно регулируются для обеспечения плотного прилегания. +Magic Leg Belts +Магические ремни на ноги +Highly secure belts enchanted with magic. +Ремни повышенной надежности, зачарованные магией. +Lockable and fully adjustable to ensure snugness. +Запираются и точно регулируются для обеспечения плотного прилегания. +Magic Ankle Belts +Магические ремни на лодыжки +Highly secure belts enchanted with magic. +Ремни повышенной надежности, зачарованные магией. +Lockable and fully adjustable to ensure snugness. +Запираются и точно регулируются для обеспечения плотного прилегания. +The Liquid Metal starts engulfing you! +Жидкий металл начинает поглощать вас! +The Liquid Metal explodes and covers you! +Жидкий металл взрывается и накрывает вас! +The Liquid Metal takes advantage of your status and engulfs you! +Жидкий металл пользуется вашей ситуацией и поглощает вас! +Silver Burst +Серебряный выброс +Select a liquid metal tile +Выберите клетку с жидким металлом +Target a liquid metal tile. After 3 turns, it erupts, spreading more liquid metal and engulfing any nearby creatures. Deals DamageDealt crush damage and applies 80 points of metallic binding. +Нацелитесь на плитку с жидким металлом. Через 3 хода она взрывается, разбрызгивая большое количество жидкого металла и накрывая им всех находящихся поблизости существ. Наносит DamageDealt дробящего урона и применяет 80 единиц металлического сковывания. +A powerful explosion simmers beneath the surface...' +Мощный взрыв прогремел под поверхностью... +The ground shakes as a huge wall of liquid metal approaches! +Земля содрогается, и округу накрывает дождь из жидкого металла! +Liquid Metal Cube +Куб из жидкого металла +The liquid metal cube dissolves into a huge pile of glittering dust. +Куб из жидкого металла превращается в огромную кучу сверкающей пыли. +The liquid metal cube engulfs you and squeezes tightly! (DamageTaken) +Куб из жидкого металла окутывает вас и крепко сжимает! (DamageTaken) +The liquid metal cube engulfs your body and hardens, taking the form of restraints! (+RestraintAdded) +Куб из жидкого металла окутывает ваше тело и затвердевает, принимая форму ограничителей! (+RestraintAdded) +Skeleton Archer +Скелет-лучник +The Skeleton falls to pieces. +Скелет разваливается на куски. +The Skeleton restrains you! (+RestraintAdded) +Скелет сковывает вас! (+RestraintAdded) +The Skeleton tackles you! (DamageTaken) +Скелет лапает вас! (DamageTaken) +Cursed Arrow +Проклятая стрела +Because your hands are unavailable, you kick the target instead. +Поскольку ваши руки недоступны, вместо просто ударяете по цели. +Your former owners are looking for you across the seven planes. +Ваши бывшие владельцы ищут вас по всем семи планам. +A local business is missing one of their models, and will stop at nothing to find her. +Местная бизнесвумэн потеряла одну из своих моделей и не остановится ни перед чем, чтобы найти ее. +The Doll Shoppe +Кукольный магазин +Elemental Slavers +Стихийные работорговцы +Your duty as a maid is to keep the place clear of dirt and other hazards. +Ваша обязанность как горничной - очистить это место от грязи и других опасностей. +Dirt Pile +Кучка грязи +You clear out the dirt pile +Вы убираете кучку грязи +A ENMY was lurking inside the dirt pile! +Внутри кучки грязи скрывалась ENMY! +You skipped your duty and left some dirt missing in the last level! +Вы проигнорировали свои обязанности и оставили немного грязи на последнем уровне! +The Dollmaker does not take no for an answer. +Кукольница не принимает ответы 'нет' на свои вопросы. +Fuuka's shrine maidens would like to have a word with you. +Служительницы храма Фууки хотели бы поговорить с вами. +Your instructor will meet with you at regular intervals for further training. +Ваш инструктор будет регулярно встречаться с вами для дальнейшего обучения. +Hogtied! +Кабанчик! +Experience a comprehensive rope bondage experience. +Испытайте всесторонний опыт веревочного бондажа. +Receive the following restraints: +Вы получите следующие ограничители: +You will be bound with some form of restraint. +Вы будете скованы с помощью неизвестных ограничителей. +Shadow +(Тень) +Gag Geist +Дух-кляп +The gag geist goes silent. +Дух-кляп замолкает. +The gag geist teases you playfully!! (DamageTaken) +Дух-кляп игриво дразнит вас!! (DamageTaken) +The gag geist gags the girl with a ghastly grimace! (+RestraintAdded) +Дух-кляп с ужасной гримасой затыкает рот девушке! (+RestraintAdded) +Poltergeist +Полтергейст +The poltergeist goes silent. +Полтергейст замолкает. +The poltergeist gropes and teases you playfully, exhausting your stamina! (DamageTaken) +Полтергейст ощупывает и игриво дразнит вас, истощая вашу выносливость! (DamageTaken) +The poltergeist binds you with... something? (+RestraintAdded) +Полтергейст сковывает вас... чем-то? (+RestraintAdded) +Invisible Gag +Невидимый кляп +It's a gag, but invisible! +Это кляп, но он невидимый! +You wonder what color it is. +Вам интересно, какого он цвета. +Invisible Blindfold +Невидимая повязка на глаза +It's a blindfold, but invisible! +Это повязка на глаза, но она невидимая! +How exactly is this supposed to work? +И как именно она должна работать? +Invisible Armbinder +Невидимый армбиндер +It's an armbinder, but invisible! +Это армбиндер, но он невидимый! +You wonder what color it is. +Вам интересно, какого он цвета. +Invisible Legbinder +Невидимый легбиндер +It's an legbinder, but invisible! +Это легбиндер, но он невидимый! +This is starting to get cruel... +Это начинает становиться жестоким... +Strangely dressed zombies start approaching you!! +К вам начинают приближаться странно одетые зомби!! +A floating gag appears and starts flying toward you! +Появляется левитирующий кляп и начинает лететь к вам! +A floating blindfold appears and starts flying toward you! +Появляется левитирующая повязка на глаза и начинает лететь к вам! +A floating yoke appears and starts flying toward you! +Появляется левитирующее ярмо и начинает лететь к вам! +A floating chastity item appears and starts flying toward you! +Появляется предмет целомудрия и начинает лететь к вам! +A floating straitjacket appears and starts flying toward you! +Появляется левитирующая смирительная рубашка и начинает лететь к вам! +A floating harness appears and starts flying toward you! +Появляется левитирующая упряжь и начинает лететь к вам! +A floating harness appears and starts flying toward you! +Появляется левитирующая упряжь и начинает лететь к вам! +A set of shackles opens wide and starts going for your wrists! +Набор кандалов широко раскрывается и нацеливается на ваши запястья! +You hear moaning as the statues start to move... +Статуи начинают двигаться и вы слышите стоны... +Devious tomes emerge from the bookshelves! +С книжных полок вылетают коварные томики! +Armed mushrooms emerge from the ground to defend their home! +Вооруженные грибы появляются из-под земли, чтобы защитить свой дом! +Playful ghosts slip through the walls, giggling to themselves! +Игривые призраки проскальзывают сквозь стены, хихикая себе под нос! +Ancient drones drop from the ceiling and come to life! +Древние дроны включаются и падают с потолка! +You were always being watched... +За вами постоянно следят... +You find a store of gunpowder! +Вы находите склад пороха! +Explosive Barrel +Бочка с взрывчатыми веществами +Explosive Barrel +Бочка с взрывчатыми веществами +The explosive barrel falls apart and drops its gunpowder. +Бочка с взрывчатыми веществами разваливается на части и из нее высыпается порох. +The explosive barrel catches fire and explodes! +Бочка с взрывчатыми веществами загорается и взрывается! +The item demands copious mana, more than you can supply. You'll have to tie up a mage. +Этот предмет требует много маны, больше, чем вы можете предоставить. Вам придется связать мага. +The cursed seal glows and pulsates as you struggle fruitlessly. +Проклятая печать светится и пульсирует, пока вы безуспешно боретесь. +The curse has been lifted through judicious application of spellcasters. +Проклятие было снято благодаря вдумчивой работе заклинателя. +The cursed item drains all of the caster's mana. It demands more. +Проклятый предмет высасывает всю ману заклинателя. Он требует больше. +Punishment Suit +Костюм для наказания +A tool used by Nevermere on the most difficult and recalcitrant wolfgirls. +Инструмент, используемый Невермером для самых трудных и непокорных девушек-волчиц. +Designed to contain superhuman strength, struggling out of this would be a major feat. +Разработан так, чтобы сдержать сверхчеловеческую силу, вырваться из него будет большим подвигом. +Shield of (un)Clarity +Щит (не)ясности +Channel your clarity of mind into a powerful shield, filling your distraction bar completely and granting a temporary shield equal to 50% of the DP generated. 10% of the DP gained is gained as Desire, which prevents DP decaying below a certain point. +Направьте свою ясность ума в мощный щит. Полностью заполняет полосу возбуждения и предоставив временный щит, равный 50% от сгенерированных DP. 10% от полученного DP приобретается как Желание, что предотвращает снижение DP ниже определенного уровня. +You form a... distracting mental barrier, shielding yourself for AMNT damage!!! +Вы формируете... ментальный барьер из возбуждающих мыслей, защищая себя от повреждений!!! +You are too distracted to form a mental barrier... +Вы слишком возбуждены, чтобы создать ментальный барьер... +You have the mental clarity but not the magical clarity! (not enough mana) +У вас есть ясность ума, но не магическая ясность! (недостаточно маны) +You have formed a mental barrier... +Вы сформировали ментальный барьер... +Desire Burst +Взрыв желания +Overload Essence motes in an area, costing 10% max DP worth of Desire each. They explode, dealing (10 + 20% max DP) charm damage to enemies hit. If you don't have enough desire, the damage is reduced proportionally.||(Desire is the heart-shaped meter below your DP bar, and is gained slowly by being distracted) +Перегружайте Частицы Сущности в области, затрачивая Желание, равное 10% максимального DP на каждую. Они взрываются, нанося врагам (10 + 20% макс DP) урона Очарованием. Если у вас недостаточно желания, урон пропорционально уменьшается.|| (Желание - это индикатор с сердечком под вашей шкалой DP, который медленно увеличивается, когда вы возбуждены) +You channel your distraction into the mote, overloading it! +Вы направляете свое возбуждение на частицу, перегружая ее! +You channel your distraction into the motes, overloading them! +Вы направляете свое возбуждение на частицы, перегружая их! +You don't have enough of a desire to do that. +У вас недостаточно желания, чтобы сделать это. +You must target at least one Essence Mote. +Вы должны выбрать хотя бы одну Частицу Сущности. +You have the desire but not the mana! +У вас есть желание, но нет маны! +Your divine-locked restraints can only be removed by completing a shrine quest. +Ваши божественные ограничители можно снять, только выполнив задание в храме. +The Goddess hates you. That won't work. +Богиня ненавидит вас. Это не сработает. +Harvest +Жатва +Requires a slashing weapon equipped. Activate to harvest all adjacent vine tiles, with a 25% chance per tile to obtain a seed.|Seeds can be planted to form gardens, which will grow in 100 turns to become vegetables, which can be eaten to restore WP or sold to the shopkeeper. +Требуется оснащенное режущее оружие. Активируйте, чтобы сделать жатву со всех соседних плиток с лозами, с вероятностью 25% для каждой плитки получить семя.|Семена можно посадить, чтобы сформировать посевы, которые через 100 ходов дадут овощи, которые можно съесть, чтобы восстановить здоровье, или продать владельцу магазина. +You twirl your weapon, harvesting AMNT seeds! +Вы вращаете своим оружием, пожиная AMNT семян! +There is nothing to harvest. +Здесь нечего пожинать. +Telekinesis 101 +Телекинез 101 +Unlocks telekinetic abilities. Toggle on to equip weapons while bound, but at 0% accuracy. Learn Recover Object. +Открывает телекинетические способности. Переключие, чтобы экипировать оружие, будучи связанной, но с точностью 0%. Изучает Сбор Объектов. +Recover Object +Сбор Объектов +Use telekinesis to pick up items and open chests from a distance. Refunds 75% of mana cost if not used to open a chest. +Используйте телекинез, чтобы поднимать предметы и открывать сундуки на расстоянии. Возвращает 75% стоимости маны, если способность не была использована для открытия сундука. +The items float to you! +Предметы левитируют к вам! +There's nothing to pick up. +Поднимать нечего. +The chest is locked. +Сундук заперт. +There's an obstacle in the way! +На пути препятствие! +Select a tile with items +Выберите клетку с предметами +Enhanced Recovery +Улучшенная манипуляция +Upcast to increase range and recover objects in an area. +Активируйте, чтобы увеличить дальность действия и собирать объекты в определенной области. +The items float to you! +Предметы левитируют к вам! +There's nothing to pick up. +Поднимать нечего. +That container is locked! +Этот контейнер заперт! +Select an area with items +Выберите клетку с предметами +Kinetic Slash +Кинетический удар +Swing an equipped weapon (not unarmed or hands free) in a line, slashing enemies in the way with 20 + 80% weapon damage. Counts as an attack. +10 mana cost if wielding a Heavy weapon. +Взмахните снаряженным оружием (не будучи обезоруженной или с 'безручным' оружием) по линии, нанося врагам на пути 20 + 80% урона от оружия. Засчитывается как атака. +10 затрат маны при использовании тяжелого оружия. +You swing! +Вы замахиваетесь оружием! +Choose where to swing (must not be unarmed or hands free weapon) +Выберите, куда нанести удар (не должна быть обезоружена или с 'безручным' оружием) +Kinetic Lance +Кинетическое копье +Propel your weapon at devastating speed, piercing enemies for 30+160% Weapon Damage and dropping it at the end of the trajectory. Counts as an attack. +15 mana cost if wielding a Heavy weapon. +Двигайте свое оружие с разрушительной скоростью, пронзая врагов на 30+160% урона от оружия и отбрасывая их в конец траектории. Засчитывается как атака. +15 к стоимости маны при использовании тяжелого оружия. +You propel your weapon forward! +Ты двигаете свое оружие вперед! +Choose where to launch your weapon. +Выберите, куда запустить свое оружие. +Sagitta +Сагитта +Fire a projectile. If this projectile hits an enemy, make one attack against an enemy for 10+40% weapon damage. +5 mana cost if wielding a Heavy weapon. +Выпустите снаряд. Если этот снаряд попадет во врага, проведите одну атаку против врага, нанося 10+40% урона от оружия. +5 затрат маны при использовании тяжелого оружия. +You unleash a deadly projectile! +Вы выпускаете смертоносный снаряд! +Choose aim direction. +Прицельтесь, выберите направление +Sagitta Assault +Штурм Сагиттой +After casting Sagitta, you can recast it up to three more times without advancing time. +После применения Сагитты вы можете повторить её еще до трех раз без времени перезарядки. +Psychokinesis +Психокинез +You can ignore components for telekinetic spells, however spells generate distraction (based on mana cost) when cast this way due to the mental strain. Unable to use at 100% DP. +Вы можете игнорировать активаторы для телекинетических заклинаний, однако заклинания создают возбуждение (в зависимости от стоимости маны) при наложении таким образом из-за ментального напряжения. Невозможно использовать при 100% DP. +Kinetic Mastery +Кинетическое мастерство +Negates the penalty for 2-handed weapons. Also gain the following effects:|-Kinetic spells and Sagitta cost 30% less while wielding a Light weapon.|-Kinetic spells and Sagitta gain +15 base damage when wielding a Heavy weapon. +Отменяет штраф за двуручное оружие. Также даёт следующие эффекты:|-Кинетические заклинания и Сагитта стоят на 30% дешевле при использовании легкого оружия.|-Кинетические заклинания и Сагитта наносят +15 базового урона при использовании тяжелого оружия. +Grasp +Хватка +Cast on an enemy to snare them for 20 turns, or until you leave range/are incapacitated. Cast on a point to throw the grasped enemy in that direction, dealing 40 crush damage if they hit a wall or another enemy. +Примените это заклинание на врага, чтобы стреножить его на 20 ходов или до тех пор, пока вы не покинете зону действия/не будете выведены из строя. Примените заклинание на точку, чтобы переместить захваченного врага в этом направлении, нанося 40 единиц дробящего урона, если он ударится о стену или другого врага. +You grab the ENMY using telekinesis and hold them in place! +Вы хватаете ENMY с помощью телекинеза и удерживаете его на месте! +You throw the ENMY! +Вы перемещаете ENMY! +Choose a target or a location (if a target is currently grasped) +Выберите цель или точку (если цель в данный момент схвачена) +Rock +Камень +Perfect for a lifestyle of love and peace. +Идеально подходит для образа жизни, полного любви и покоя. +Deals crush damage. Stuns on critical. Ouch! +Наносит дробящий урон. Оглушает при критическом ударе. Ой! +You pick up a particularly nice rock. +Вы находите особенно красивый камень. +You pick up a device for snuffing out candles and torches. +Вы находите устройство для тушения свечей и факелов. +Candle Snuffer +Устройство для тушения свеч +You put out the torch. +Вы тушите факел. +A handy device for putting out torches and lanterns. +Удобное устройство для тушения факелов и фонарей. +But why would you want to do that? You hidin' something? +Но зачем вам это нужно? Вы что-то скрываете? +You find a bag full of sacks. Or is it a sack full of bags? +Вы находите мешок с мешками. (От создателей пакета с пакетами.) +Recursive Bag +Рекурсивный мешок +You cover the light source. +Вы накрываете источник света. +Bags inside a bag of bags inside a bag of bags +Мешки внутри мешка с мешками внутри мешка с мешками... +Can be placed over light sources to cover them. +Можно размещать поверх источников света, чтобы закрывать их. +The snuffer doesn't work on that light source. +Тушитель не сработает на этом источнике света. +The bag can't cover that light source. +Мешок не может закрыть этот источник света. +You remove the bag from its light source and place it back inside your bag. +Вы снимаете мешок с источника света и кладете его обратно в мешок. +There. Now it's time to have some fun~ +Готово. Теперь пришло время немного повеселиться~ +How utterly helpless~ +Какая ты совершенно беспомощная~ +Let's see how long you last. +Давай посмотрим, как долго ты продержишься. +I've got you! Now let's have some fun! +Я поймала тебя! Теперь давай повеселимся! +I think I'll help myself to you for a bit~ +Думаю, я немного помогу тебе~ +Gosh, you're so cute like that! +Боже, ты такая милая! +I'm going to have to search you, miss~ +Мне придется обыскать вас, мисс~ +Let's check your restraints. +Давай проверим твои ремни. +You look so cute like that, miss! +Вы так мило выглядите, мисс! +All nice and tight. Certainly no longer a threat~ +Все хорошо, всё затянуто. Определенно, ты больше не представляешь угрозы~ +I'm going to make sure you're nice and tight~ +Я позабочусь о том, чтобы тебе было хорошо и туго~ +Surely nothing can happen now! +Теперь, конечно, ничего не может случиться! +Rubber Elemental +Резиновый элементаль +The rubber elemental's restraints snap onto her and she falls over hogtied. +Ограничители резинового элементаля защелкиваются на ней, и она падает связанная. +The rubber elemental molds itself into restraints! (+RestraintAdded) +Резиновый элементаль сам превращается в ограничители! (+RestraintAdded) +The rubber elemental squeezes you with its appendages! (DamageTaken) +Резиновый элементаль сжимает вас своими придатками! (DamageTaken) +The rubber elemental forms rubber locks around all your restraints! (DamageTaken) +Резиновый элементаль образует резиновые замки вокруг всех ваших ограничителей! (DamageTaken) +Your ropes are enchanted with a lesser spell! +Ваши веревки зачарованы низшим заклинанием! +Your ropes are enchanted with a magic spell! +Ваши веревки зачарованы магическим заклинанием! +Your ropes are enchanted with a powerful spell! +Ваши веревки зачарованы мощным заклинанием! +Your ropes are enchanted with a peerless spell! +Ваши веревки зачарованы сильнейшим заклинанием! +Shibari Witch +Ведьма шибари +The shibari witch blows a kiss and says goodbye. +Ведьма шибари прощается, посылая воздушный поцелуй. +The shibari witch ties you tight! (+RestraintAdded) +Ведьма шибари крепко связывает вас! (+RestraintAdded) +The witch dangles a lock in front of you before putting it on! (DamageTaken) +Ведьма трясет замком перед вами, прежде чем применить его по назначению! (DamageTaken) +The witch rubs your body sensually! (DamageTaken) +Ведьма чувственно растирает ваше тело! (DamageTaken) +The Shibari Witch takes your clothes off! +Ведьма Шибари снимает с вас одежду! +A Hard Place +Жуткое место +While your willpower is 0, your mana pool slowly drains and your max stamina regen point is reduced by 30%. +Пока ваша сила воли равна 0, ваш резерв маны медленно истощается, а предел регенерации выносливости уменьшает на 30%. +The Spark of Magic +Искра магии +When your mana pool is exhausted, your attacks deal 50% reduced base damage. +Когда ваш резерв маны истощается, ваши атаки наносят на 50% меньше базового урона. +Burned Out +Сожжение +Casting spells reduces willpower based on how little distraction you have, also you cannot play with yourself. +Произнесение заклинаний уменьшает силу воли в зависимости от того, насколько слабо вы возбуждены, также вы не можете 'играть' сами с собой. +Winded +Выдохшаяся +While below 10% stamina, evasion is severely reduced and your slow level is increased by 1. +Пока выносливость ниже 10%, уклонение значительно снижается, а ваш уровень замедления увеличивается на 1. +Lost One +Потерянное +The being vanishes in front of you. +Существо исчезает у вас на глазах. +The being grabs you, causing your body parts to freeze in time!!! (DamageTaken) +Существо хватает вас, заставляя части вашего тела застывать во времени!!! (DamageTaken) +The being has already bound you! (+RestraintAdded) +Существо уже сковало вас! (+RestraintAdded) +The Timekeeper +Хранительница времени +The Timekeeper releases her grip on the timeline. +Хранительница времени ослабляет свою хватку на временной шкале. +The Timekeeper takes the time to enjoy herself with you... (DamageTaken) +Хранительница времени находит время, чтобы повеселиться с вами... (DamageTaken) +The Timekeeper enacts judgement for disrupting time! (+RestraintAdded) +Хранительница времени выносит приговор за нарушение времени! (+RestraintAdded) +Analysis +Анализ +You pick up a latex projector +Вы находите латексный проектор +Can't Touch That +Не могу коснуться +When both arms and hands are severely bound, you can no longer pick up items without an ally nearby. +Когда и руки и кисти сильно связаны, вы больше не сможете поднимать предметы без союзника поблизости. +You can't pick that up without help. +Вы не сможете поднять это без посторонней помощи. +Grounded +Приземление +When arms are tied and feet are linked, you cannot get up from a kneeling position without help or a wall. +Когда у вас связаны руки и ноги, вы не можете встать с колен без посторонней помощи или не опираясь на стену. +You take more time getting up due to your bindings. +Из-за ваших ограничителей вам требуется больше времени, чтобы подняться. +You can't get up without help. +Вы не можете встать без посторонней помощи. +Your ally helps you back up. +Ваш союзник помогает вам подняться. +You get back up using the corner. +Вы поднимаетесь на ноги, используя угол. +You get up to your knees using the wall. +Вы встаете на колени, опираясь на стену. +You're too tied up to close the door. +Вы слишком тяжело связаны, чтобы закрыть дверь. +The chest opens on its own. +Сундук открывается сам по себе. +You can't use your hands for that, but you can crouch to use your mouth. +Вы не можете использовать для этого руки, но можете присесть, чтобы использовать рот. +Heel Training +Тренировка: Каблуки +Start locked in a pair of heels with no heel training. +Начните будучи запертой в паре обуви на каблуках, совершенно не умея на них ходить. +Gag Training +Тренировка: Кляп +Start locked in a gag with no gag training. +Начните с заблокированным во рту кляпом, совершенно не умея ему противостоять. +Corset Training +Тренировка: Корсет +Start locked in a corset with no corset training. +Начните будучи запертой в корсете, совершенно не умея ему противостоять. +Sensory Training +Тренировка: Сенсорика +Start locked in a blindfold and headphones with no Sensory training. +Начните с запертой на ваших глазах повязкой и наушниках, совершенно не умея им противостоять. +Hard to Master: Heels +Трудное освоение: Каблуки +Heel training is significantly slower. +Вы медленнее тренируетесь ходит на каблуках. +Hard to Master: Gags +Трудное освоение: Кляп +Gag training is significantly slower. +Вы медленнее учитесь противостоять кляпу. +Hard to Master: Corsets +Трудное освоение: Корсеты +Corset training is significantly slower. +Вы медленнее учитесь противостоять корсетам. +Hard to Master: Sensory +Трудное освоение: Сенсорика +Sensory training is significantly slower. +Вы медленнее учитесь противостоять сенсорным ограничителям. +Head Start: Heels +Фора: Каблуки +Start at Heel training level 5. +Начните с 5 уровнем умения 'Каблуки'. +Head Start: Gags +Фора: Кляпы +Start at Gag training level 5. +Начните с 5 уровнем умения 'Кляпы'. +Head Start: Corsets +Фора: Корсеты +Start at Corset training level 5. +Начните с 5 уровнем умения 'Коресты'. +Head Start: Sensory +Фора: Сенсорика +Start at Sensory training level 5. +Начните с 5 уровнем умения 'Сенсорика'. +Classic Heels +Классические каблуки +Removes Heel Training and tripping mechanic. Restraining heels slow instead. +Выключается тренировка хождения на каблуках и механизм спотыкания. Вместо этого каблуки замедляют движение. +Trust Fall +Падение на доверии +Hides the balance meter while wearing heels and/or unsteady. +Скрывает индикатор баланса при ношении каблуков и/или неустойчивости. +Poor Balance +Плохой баланс +You take longer to get up and are less skilled at wearing high heels. +Вам требуется больше времени, чтобы встать, и вы менее искусны в ношении высоких каблуков. +Balance: AMNT% +Баланс: AMNT% +Balance: AMNT% (Sprinting Disabled!!!) +Баланс: AMNT% (Спринт отключен!!!) +You lose your balance and fall over!!! +Вы теряете равновесие и падаете!!! +Training Level: AMNT +Уровень умения: AMNT +Use One +Исп. одно +Equip +Надеть +Unequip +Снять +Favorite +Избранное +Unfavorite +Анти-избранное +Add to Hotbar +Доб. в быструю панель +Drop +Выбросить +Attach +Прикрепить +Attached +Прикреплено +Add to Quick Slot 1 +Доб. в быстрый слот 1 +Add to Quick Slot 2 +Доб. в быстрый слот 2 +Add to Quick Slot 3 +Доб. в быстрый слот 3 +Add to Quick Slot 4 +Доб. в быстрый слот 4 +Try to Cut +Попыт. разрезать +Struggle! +Бороться! +Try to Unlock +Попыт. разблокировать +Add a Lock +Добавить замок +Try to Remove +Попыт. снять +Try to Pick +Попыт. взломать +Examine the Curse +Изучить проклятие +Remove the Curse +Снять проклятие +Feed this to her +Скормить это ей +Sell for VLU gp +Продать за VLU зол. +Sell ALL for VLU gp +Продать СТОПКУ за VLU зол. +Sell all but one for VLU gp +Продать всё кроме одного за VLU зол. +You feed the RSTR to the ENNME! (AMNT1/AMNT2 hp) +Вы скармливаете RSTR ENNME! (AMNT1/AMNT2 здоровья) +Choose a food item or willpower potion +Выберите еду или зелье силы воли +Rope Rune +Руна веревок +Chain Rune +Руна цепей +Ribbon Rune +Руна лент +Nature Rune +Руна природы +Belt Rune +Руна ремней +Leather Rune +Руна коди +Latex Rune +Руна латекса +Latex Cube Rune +Руна латексного куба +Slime Bubble Rune +Руна слизевого пузыря +Bubble Rune +Руна пузыря +Spherical Rune +Руна сферы +Ball Rune +Руна шара +Rubber Rune +Руна резины +Slime Rune +Руна слизи ++AMNT gp ++AMNT зол. +Locked +Заперто +ENMY lets go of herself for AMNT damage! +ENMY отпускает вас, нанося AMNT урона! +Sonar +Сонар +Emit a ping to highlight floors and tiles in a large radius. The ping is audible and attracts enemies to your position. +Издает звуковой сигнал, чтобы отметить этажи и плитки в большом радиусе. Звуковой сигнал хорошо слышен и привлекает врагов к вашей позиции. +You emit a loud noise and listen for echoes... +Вы издаете громкий шум и прислушиваетесь к эху... +Your mouth is too heavily stuffed! +Ограничители на вашем рту слишком строгие! +You don't have the mana to cast Sonar! +У вас нет маны, чтобы использовать Сонар! +The weights swing around and tug on your nipples! +Грузики раскачиваются и натягивают ваши соски! +More Kinky Furniture +Больше извращенной мебели +Replaces 60% of cages with a different kind of kinky furniture such as display stands. +Замените 60% клеток другой необычной мебелью, такой как выставочные стенды. +Collection +Коллекция +Collection +Коллекция +Facilities +Предприятия +Training +Тренировка +Storage +Хранилище +Management +Менеджмент +You don't have anywhere to manage your prisoners! Yet... +Вам негде проводить менеджмент своих заключенных! Пока негде... +Your collection is empty. Use binding attacks to tie up and capture damsels! +Ваша коллекция пуста. Используйте связывающие атаки, чтобы связывать и захватывать девушек! +Personality +Личность +Switch +Свитч +Submissive +Сабмиссив +Dominant +Доминант +Bratty +Дерзкая +Drone +Дрон +Corrupted +Извращенная +Feral +Дикая +Status +Статус +Prisoner +Заключенная +Guest +Гость +Servant +Слуга +Manager +Менеджер +Opinion +Мнение +Training +Тренировка +Willpower +Сила воли +Prisoner #NUMR/TTL +Заключенная #NUMR/TTL +Guest #NUMR/TTL +Гость #NUMR/TTL +Select a character to examine +Выберите персонажа для осмотра +Former Faction: +Бывшая фракция: +None +Нет +Prisoner +Заключенная +Miku +Мику +Nevermere +Невермер +Bounty Hunter +Наемники +Dressup Co. +Корпорация Моды +Dollmaker +Кукольница +Latex +Латекс +Rubber +Резина +Slime +Слизь +Alchemist +Алхимики +Scholarly +Ученые +Witch's Coven +Ковен ведьм +Warden +Надзиратель +Curse +Проклятые +Old Guardians +ДревниеСтражи +Fungal +Грибы +Bast +Баст +Bandit +Бандиты +Elven +Эльфы +Divine +Божества +Maid +Служанки +Elemental +Элементали +Royal +Знать +Choose default outfit palette: +Выберите палитру костюма по умолчанию: +Auto Load Mods +Автозагрузка модов +SUSPICIOUS MOD DETECTED +ОБНАРУЖЕН ПОДОЗРИТЕЛЬНЫЙ МОД +The bright light hurts your dark-adjusted eyes! +Яркий свет причиняет боль вашим глазам, привыкшим к темноте! +Unconventional Warfare +Неконвенциальные методы ведения войны +Select a weapon to attach it to your body. You can have one attached weapon at a time. Attaching it takes 5 turns.|An attached weapon can be equipped without hands and maintains 60% accuracy as long as you have arms or legs unbound. +Выберите оружие, чтобы прикрепить его к своему телу. Вы можете прикреплять по одному оружию за раз. Прикрепление занимает 5 ходов.|Прикрепленное оружие может быть экипировано без помощи рук и имеет 60% точности до тех пор, пока у вас не связаны руки или ноги. +Guerilla Fighting +Партизанский бой +Light weapons can be wielded if you have your mouth free, at 75% accuracy. +Легким оружием можно пользоваться, если у вас свободен рот, с точностью 75%. +Tough Armor (1/2 crit mult while aware) +Прочная броня (1/2 множитель крита если осведомлена) +Absolute Armor (1/2 crit mult) +Абсолютная броня (1/2 множитель крита) +Change Outfit +Сменить наряд +Rename +Переименовать +Reset to NME +Сброс на NME +Enlarged View +Увеличить вид +Back to Game +Вернуться в игру +Servants +Слуги +Prisoners +Заключенные +Promote to Servant +Повысить до слуги +Demote +Понизить +Delete Guest +Удалить гостя +Really Delete Guest? +Действительно удалить гостя? +The ENMY tries to grab you! +ENMY пытается схватить вас! +The ENMY reaches out and gives your breast a squeeze! (DMGDLT) +ENMY протягивает руку и сжимает вашу грудь! (DMGDLT) +The ENMY squeezes your breasts as you raise your arms for a spell! (DMGDLT) +ENMY сжимает вашу грудь, стоит вам поднять руки для применения заклинания! (DMGDLT) +The ENMY reaches for you and fails! +ENMY тянется к вам и терпит неудачу! +The ENMY gives your butt a light slap as you cast! (DMGDLT) +ENMY слегка шлепает вас по заднице, пока вы применяете заклинание! (DMGDLT) +The ENMY gives your butt a good slap as you sprint past! (DMGDLT) +ENMY хорошенько шлепает вас по заднице, когда вы пробегаете мимо! (DMGDLT) +The ENMY tries to spank you but misses! +ENMY пытается шлепнуть вас, но промахивается! +The ENMY gives your butt a squeeze! (DMGDLT) +ENMY сжимает вашу задницу! (DMGDLT) +The ENMY gives your butt a squeeze during your cast! (DMGDLT) +ENMY сжимает вашу задницу во время применения заклинания! (DMGDLT) +The ENMY gives your butt a squeeze from behind! (DMGDLT) +ENMY со спины сжимает вашу задницу! (DMGDLT) +The ENMY gives your butt a squeeze as you pass by! (DMGDLT) +ENMY сжимает твою задницу, когда вы проходите мимо! (DMGDLT) +The ENMY reaches for you but misses! +ENMY тянется к вам, но промахивается! +The ENMY tickles your armpits! (DMGDLT) +ENMY щекочет ваши подмышки! (DMGDLT) +The ENMY tickles under your raised arms! (DMGDLT) +ENMY щекочет под вашими поднятыми руками! (DMGDLT) +The ENMY tries to tickle you! +ENMY пытается пощекотать вас! +The ENMY tickles your feet! (DMGDLT) +ENMY щекочет ваши ступни! (DMGDLT) +The ENMY tries to tickle you! +ENMY пытается пощекотать вас! +The ENMY takes off your shoes and tickles your feet! (DMGDLT) +ENMY снимает с вас обувь и щекочет ваши ступни! (DMGDLT) +The ENMY pats you gently on the head. (DMGDLT) +ENMY нежно гладит вас по голове. (DMGDLT) +The ENMY pats you gently on the head as you fail your spell... (DMGDLT) +ENMY нежно гладит тебя по голове, и вы ошибаетесь в заклинании... (DMGDLT) +The ENMY tries to pat you on the head but decides not to. +ENMY пытается погладить вас по голове, но вскоре передумывает. +The ENMY behind you gives your shoulders a nice massage! (DMGDLT) +ENMY позади вас приятно массирует ваши плечи! (DMGDLT) +The ENMY reaches for your shoulders but you slip free! +ENMY тянется к вашим плечам, но вы ускользаете! +The ENMY calls you cute! (DMGDLT) +ENMY называет вас милой! (DMGDLT) +The ENMY blushes at your cuteness! +ENMY краснеет от вашей милоты! +The ENMY makes fun of you! (DMGDLT) +ENMY смеется над вами! (DMGDLT) +The ENMY struggles to find words! +ENMY с трудом подбирает слова! +The ENMY buzzes you with her VTY! (DMGDLT) +ENMY дразнит вас своим VTY! (DMGDLT) +The ENMY catches you and teases you with her VTY! (DMGDLT) +ENMY ловит вас и дразнит своим VTY! (DMGDLT) +The ENMY reaches for her VTY! +ENMY тянется к своему VTY! +The ENMY sticks a VTY into you! (DMGDLT) +ENMY втыкает в вас VTY! (DMGDLT) +The ENMY reaches for her VTY! +ENMY тянется к своему VTY! +The ENMY sticks a stuffing into your open mouth! (DMGDLT) +ENMY засовывает набивку в ваш открытый рот! (DMGDLT) +The ENMY reaches for your mouth and fails! +ENMY тянется к вашему рту и терпит неудачу! +The ENMY takes advantage of the gag around your neck~ (DMGDLT) +ENMY использует в своих интересах кляп у вас на шее~ (DMGDLT) +The ENMY reaches for the gag around your neck! +ENMY тянется к кляпу у вас на шее! +The ENMY pulls your hands together and sticks a clip between them! (DMGDLT) +ENMY сводит ваши руки вместе и вставляет между ними зажим! (DMGDLT) +The ENMY grabs your wrists but you pull away! +ENMY хватает вас за запястья, но вы вырываетесь! +The ENMY pulls your weapon away! +ENMY отбирает у вас оружие! +The ENMY tries to pull your weapon away but you maintain your grip! +ENMY пытается отобрать у вас оружие, но вы сохраняете хватку! +The ENMY reaches for your inventory but can't quite reach it! +ENMY тянется к вашему инвентарю, но не может до него дотянуться! +More Armbinders +Больше армбиндеров +Armbinders are favored over other heavy bondage. +Армбиндеры предпочтительнее других видов тяжелого бондажа. +Less Armbinders +Меньше армбиндеров +Armbinders are less favored over other heavy bondage. +Армбиндеры менее предпочтительны по сравнению с другими видами тяжелого бондажа. +More Boxbinders +Больше сумок для рук +Boxbinders are favored over other heavy bondage. +Сумки для рук предпочтительнее других видов тяжелого бондажа. +Less Boxbinders +Меньше сумок для рук +Boxbinders are less favored over other heavy bondage. +Сумки для рук менее предпочтительны по сравнению с другими видами тяжелого бондажа. +More Straitjackets +Больше смирительных рубашек +Straitjackets are favored over other heavy bondage. +Смирительные рубашки предпочтительнее других видов тяжелого бондажа. +Less Straitjackets +Меньше смирительных рубашек +Straitjackets are less favored over other heavy bondage. +Смирительные рубашки менее предпочтительны по сравнению с другими видами тяжелого бондажа. +More Yokes +Больше ярмо +Yokes are favored over other heavy bondage. +Ярмо предпочтительнее других видов тяжелого бондажа. +Less Yokes +Меньше ярмо +Yokes are less favored over other heavy bondage. +Ярмо менее предпочтительны по сравнению с другими видами тяжелого бондажа. + (blocked!) + (блокировано!) + (dodged!) + (уклонение!) +You crouch and move slowly. +Вы приседаете и двигаетесь медленнее. +Owned by: +Принадлежит: +Warden's Belt +Пояс надзирательницы +You may go on your way, but only as long your freedom is useful to her. +Ты можешь продолжать свой путь, но только до тех пор, пока твоя свобода полезна для нее. +A golden belt that enforces respect for the Goddesses. Breaking spell orbs results in a punishment. +Золотой пояс, который заставляет уважать богинь. Разрушение сфер заклинаний влечет за собой наказание. +Belt of Privilege +Пояс привилегий +You've defeated the Warden, proving that you are worthy to take what you want. +Вы победили Стража, доказав, что достойны получить то, что хотите. +A golden belt that marks you as a person of great import. -50% rep penalty for breaking orbs. +Золотой пояс, который делает вас важной персоной. -50% штрафа репутации за разрушение сфер. +Sharpshooter +Снайпер +You teach the warden's servant a lesson. +Вы преподаете урок слуге надзирательницы. +The sharpshooter pulls your arms behind your back! (+RestraintAdded) +Снайпер заламывает вам руки за спину! (+RestraintAdded) +The sharpshooter takes advantage of your weakness and squeezes your breast! (DamageTaken) +Снайпер пользуется вашей слабостью и сжимает вашу грудь! (DamageTaken) +The sharpshooter smiles and clicks a lock on you! (DamageTaken) +Снайпер улыбается и наводит на вас прицел! (DamageTaken) +Gladiator +Гладиатор +You teach the warden's servant a lesson. +Вы преподаете урок слуге надзирательницы. +The gladiator puts you in a hold and binds you! (+RestraintAdded) +Гладиатор хватает вас и связывает! (+RestraintAdded) +The gladiator chuckles as she spanks your butt! (DamageTaken) +Гладиатор хихикает, шлепая вас по заднице! (DamageTaken) +The gladiator smiles and clicks a lock on you! (DamageTaken) +Гладиаторша улыбается и защелкивает на вас замок! (DamageTaken) +Magician +Магичка +You teach the warden's servant a lesson. +Вы преподаете урок слуге начальника тюрьмы. +The magician conjures some restraints on you! (+RestraintAdded) +Магичка создает на вас ограничители! (+RestraintAdded) +The magician summons tickling hands to tease you! (DamageTaken) +Магичка призывает щекочущие руки, дабы подразнить вас! (DamageTaken) +The magician conjures some locks on you! (DamageTaken) +Магичка создает на вас несколько замков! (DamageTaken) +The Warden +Надзирательница +The Warden disappears into a trapdoor! +Надзирательница исчезает в люке! +The Warden forces you to kneel, and presents you with a restraint! (+RestraintAdded) +Надзирательница заставляет вас встать на колени и одаривает вас ограничителем! (+RestraintAdded) +The Warden whips you with a belt! (DamageTaken) +Надзирательница бьет вас ремнем! (DamageTaken) +The Warden tosses some enchanted locks at you! (DamageTaken) +Надзирательница бросает в вас несколько зачарованных замков! (DamageTaken) +The Warden +Надзирательница +The Warden falls flat on the ground, exhausted! +Надзирательница в изнеможении падает на землю! +The Warden forces you to kneel, and presents you with a restraint! (+RestraintAdded) +Надзирательница заставляет вас встать на колени и одаривает вас ограничителем! (+RestraintAdded) +The Warden strikes you with her whip! (DamageTaken) +Надзирательница бьет вас своим хлыстом! (DamageTaken) +The Warden swings her enchanted whip and conjures locks on your body! (DamageTaken) +Надзирательница взмахивает своим зачарованным хлыстом и создает на вас замки! (DamageTaken) +(The Warden glances at you)|Oh? What do we have here?|An adventurer?|You're not in my records... +(Надзирательница смотрит на вас)|О? Что это у нас тут?|Искатель приключений?|Тебя нет в моих записях... +Cut to the chase. Do I have to fight you or not? +Перейдем к делу. Должна ли я драться с тобой или нет? +(Growl at her) +(Рычать на нее) +(She chuckles)|Oh my~|I hope your skills are on the same level as your attitude.|I don't have time for mere troublemakers~ +(Она хихикает)|О боже~|Я надеюсь, что твои навыки на том же уровне, что и твое дерзость.|У меня нет времени на обычных нарушителей спокойствия~ +Quite a boast for someone who's about to lose. +Неплохое хвастовство для того, кто вот-вот проиграет. +(SPEAKER grins)|I look forward to testing those claims~ +(SPEAKER ухмыляется)|Я с нетерпением жду возможности проверить эти утверждения~ +I defeated Fuuka. Now you're next! +Я победила Фууку. Ты следующая! +(SPEAKER shrugs)|You beat that zombie girl?|She's the weakest of the paladins.|She loves to boast about how she's special,|But she's really just a spoiled brat. +(SPEAKER пожимает плечами)|Ты победила ту девочку-зомби?|Она самая слабая из паладинов.|Она любит хвастаться тем, какая она особенная,|но на самом деле она просто избалованная девчонка. +...Zombie girl? +...Девочку-зомби? +(SPEAKER tilts her head)|Yes, she was around before Vinlaga.|Her magic was gifted to her by the Goddess,|it is only natural that it works on her too. +(SPEAKER наклоняет голову)|Да, она была здесь до Винлаги.|Ее магия была подарена ей Богинями,|и вполне естественно, что она действует и на нее тоже. +...Paladins? +...Паладинов? +(SPEAKER nods happily)|Divinely-appointed judges, presiding over mortals.|Unlike you, our immortality is earned.|Myself, I captured many defilers long ago.|Is it not fitting that I get to keep them for myself? +(SPEAKER весело кивает)|Назначенные божествами судьи, председательствующие над смертными.|В отличие от вас, мы Заслужили бессмертие.|Лично я давным-давно поймала многих осквернителей.|Разве это не логично, что я могу оставить их себе? +### (...) + +### (...) + +### (...) + +### (...) + +It is an honor to fight a worthy opponent. +Для меня большая честь сразиться с достойным противником. +Mmmmph. +Ммммфх. +(SPEAKER giggles)|That gag suits you nicely~ +(SPEAKER хихикает)|Эта шутка тебе очень идет~ +### (...) + +(SPEAKER grins)|I look forward to it! +(SPEAKER ухмыляется)|Я с нетерпением жду этого! +You will see soon enough. +Ты скоро всё увидишь. +Indeed! +Действительно! +### (...) + +### (...) + +What is this place? +Что это за место? +Mmmmm... (Blush) +Ммммм... (Краснеет) +(She smiles)|Why, this is my private prison.|I bring only my prettiest toys to stay here with me.|You can see them up there.|(She motions to the north) +(Она улыбается)|Это моя личная тюрьма.|Я забираю себе только свои самые красивые игрушки.|Ты можешь увидеть их там, наверху.|(Она указывает на север) +Tell me about your collection +Расскажи мне о своей коллекции +(SPEAKER smiles pleasantly)|Its a fitting reward, isn't it?|Long ago, this mountain was home to a vicious empire.|Machines went out to sea, bringing back countless prisoners.|As commander of the invasion, I earned this title! +(SPEAKER приятно улыбается)|Это достойная награда, не так ли?|Давным-давно эта гора была домом для порочной империи.|Машины выходили в море, доставляя обратно бесчисленных пленников.|Как командующая вторжением, я заслужил это звание! +(SPEAKER grins)|When we stormed the prisons, we encountered many fierce defenders.|Many of them now reside in these halls, earning their rightful punishment. +(SPEAKER улыбается)|Когда мы штурмовали тюрьмы, мы столкнулись со многими яростными защитниками.|Многие из них сейчас находятся в этих залах, заслужив свое законное наказание. +Who are the prisoners, anyway? +Кто эти заключенные? +(SPEAKER folds her arms)|Is it not holy and just to bring down tyrants? +(SPEAKER)|Разве это не свято и не справедливо - свергать тиранов? +Why did the Goddesses intervene? +Почему вмешались Богини? +(SPEAKER shrugs)|Most of them had already been... conditioned.|It will take centuries to undo centuries of training.|After all, we have plenty of time. +(SPEAKER пожимает плечами)|Большинство из них уже были.... осуждены.|Потребуются столетия, чтобы свести на нет века тренировок.|Но у нас еще много времени. +What about the former prisoners? +А что насчет бывших заключенных? +(SPEAKER looks to the side)|The leader was nowhere to be found.|The coward fled deeper underground.|Her robot guardians protect her, to this day. +(SPEAKER смотрит в сторону)|Лидера нигде не было видно.|Трусиха сбежала еще глубже под землю.|Роботы-хранители защищают ее и по сей день. +Can I see the leader of this old civilization? +Могу я увидеть лидера этой древней цивилизации? +### (...) + +(SPEAKER smirks)|What's the point of going deeper?|The tyrant lost control of her petty empire.|Now the world is safe from her. +(SPEAKER ухмыляется)|Какой смысл идти ниже?|Тиран потеряла контроль над своей маленькой империей.|Теперь мир в безопасности от нее. +So you stopped at the upper floors? +Так вы остановились на верхних этажах? +(SPEAKER frowns)|Absolutely not.|They are under my strict supervision. +(SPEAKER хмурится)|Ни в коем случае.|Они находятся под моим строгим надзором. +Can I talk to the former prisoners? +Могу я поговорить с бывшими заключенными? +(SPEAKER grins)|Very funny.|I heard rumors of an up-and-coming adventurer stirring up trouble.|It seems my intuitions were correct. +(SPEAKER улыбается)|Очень весело.|До меня дошли слухи о подающей надежды авантюристке, которая создает проблемы.|Похоже, моя интуиция меня не подвела. +I hope you don't mind me looting the lower levels~ +Надеюсь, ты не возражаешь, если я разграблю нижние уровни~ +(SPEAKER grins)|Oh please.|Only this era's finest warriors can be part of my collection~|My subordinates take care of the rest. +(SPEAKER ухмыляется)|О, пожалуйста.|Только лучшие воины этой эпохи могут стать частью моей коллекции~|Мои подчиненные позаботятся об остальном. +Sounds like you have an impressive collection +Похоже, у тебя впечатляющая коллекция +(SPEAKER frowns)|It's easy to take for granted the peace you didn't work for. +(SPEAKER хмурится)|Легко принять как должное мир, ради которого ты не работала. +Must be comfy living up here then +Должно быть, тебе здесь комфортно жить. +(SPEAKER scoffs at you)|Adventurers are always like this.|Ever since your kind started prying,|I've had no choice but to enact my own kind of discipline~ +(SPEAKER насмехается над вами)|Искатели приключений всегда такие.|С тех пор как такие, как ты, начали совать нос в чужие дела,|у меня не было другого выбора, кроме как ввести свои собственные порядки~ +What makes you any better than the old rulers? +Чем вы лучше прежних правителей? +(SPEAKER smirks at you)|If that were so, then perhaps it would be best not to pry...|Forbidden knowledge has its price, after all. +(SPEAKER ухмыляется вам)|Если это так, то, возможно, было бы лучше не совать нос в чужие дела...|В конце концов, запретное знание имеет свою цену. +It sounds like the gods are trying to hide something +Звучит так, словно богини пытаются что-то скрыть +(SPEAKER folds her arms)|And what makes you think an old myth would be relevant here?|Would the Archmagus herself lead a rebellion against the divine? +(SPEAKER складывает руки на груди)|И что заставляет тебя думать, что старые мифы здесь уместны?|Возглавит ли сама Архимаг восстание против божественного? +Was Sariel Vinlaga the leader of the old civilization? +Была ли Сариэль Винлага лидером древней цивилизации? +(SPEAKER frowns)|You don't trust me? That's too bad... +(SPEAKER хмурится)|Ты мне не доверяешь? Это очень плохо... +It's the way you keep dodging questions. +Это из-за того, что ты постоянно уходишь от вопросов. +(SPEAKER scoffs)|I'd love to have a word with your sources~ +(SPEAKER усмехается)|Я бы хотела поговорить с твоими источниками~ +I have it good authority that Vinlaga is here. +У меня есть все основания полагать, что Винлага здесь. +(SPEAKER smirks)|Don't believe everything you hear~ +(SPEAKER ухмыляется)|Не верь всему, что ты слышишь~ +Maybe you're right. +Возможно, ты права. +(SPEAKER pouts)|Old?|Grrr... +(SPEAKER надувает губы)|Старуха?|Гррр... +Says an old woman under the mountain... +Говорит старуха под горой... +### (...) + +I am indeed an adventurer. +Я действительно искатель приключений. +Mmmmph. +Ммммфх. +(SPEAKER smiles)|Fascinating. Do keep explaining. +(SPEAKER улыбается)|Очаровательно. Продолжай объяснять. +### (...) + +(SPEAKER frowns)|That is not the attitude I appreciate from my guests. +(SPEAKER хмурится)|Это не то отношение, которое я ценю в своих гостях. +I forge my own path. +Я сама создаю свой путь. +Why should I listen to you? +Почему я должна вас слушать? +(Pout) +(Надуть губы) +### (...) + +That's a shame about your records, I'll be going now. +Жаль, что так получилось с твоими записями, я пойду. +Mmpphgh? (Go to pass her) +Ммффхгх? (Пройти мимо нее) +(She smirks)|Not so fast, dear~|You'll have to wear a special collar to pass. +(Она ухмыляется)|Не так быстро, дорогая~|Тебе придется надеть специальный ошейник, чтобы пройти. +I won't wear anyone's collar! +Я не буду надевать чей-то ошейник! +(She smirks)|Tsk tsk. Then you won't pass. +(Она ухмыляется)|Тск-тск. Тогда ты не пройдешь. +(She giggles)|How cute!|You're so used to yours that you forgot about it~ +(Она хихикает)|Как мило!|Ты так привык к своему, что забыла об этом~ +### (...) + +Why don't you wear it yourself? +Почему бы тебе самой не надеть его? +Hmmph. (Scoff at her) +Хммфх. (Насмехаться над ней) +(She frowns)|Watch your tongue~ +(Она хмурится)|Следи за своим языком~ +(Shake your head) +(Покачать головой) +(She frowns)|I do not wear collars. +(Она хмурится)|Я не ношу ошейники. +You'd be better off wearing mine instead. +Тебе лучше вместо этого надеть мой. +You're missing out~ +Ты кое-что упускаешь~ +(Giggle) +(Хихикать) +### (...) + +This is a nice place you got here. +У тебя здесь прекрасное местечко. +(Admire the locale) +(Восхититься этим местом) +(SPEAKER smiles and nods)|It has existed for a thousand years,|and it shall exist for another thousand.|No thanks, of course, to the adventurers who storm through here,|breaking the orbs as if it all belongs to them... +(SPEAKER улыбается и кивает)|Оно существовало тысячу лет, и будет существовать еще тысячу.|Конечно, я не скажу спасибо авантюристам, которые врываются сюда,|разбивая сферы, как будто все это принадлежит им... +What are these orbs for anyway? +Для чего вообще нужны эти сферы? +(SPEAKER looks puzzled)|You don't know? Surely you must be joking? +(SPEAKER выглядит озадаченной)|Ты не знаешь? Ты, должно быть, шутишь? +(SPEAKER shrugs)|They are important because...|Wait, you're stalling for time, aren't you? +(SPEAKER пожимает плечами)|Они важны, потому что...|Погоди, ты тянешь время, не так ли? +I do not know. +Я не знаю. +(Sigh) +(Вздохнуть) +Of course I know... +Конечно, я знаю... +You can trust me. +Ты можешь мне доверять. +Mmmph! (Nod eagerly) +Мммфх! (Энергично кивать) +(SPEAKER laughs)|Do you think I will trust you just like that? +(SPEAKER смеется)|Ты думаешь, я вот так просто поверю тебе? +### (...) + +(SPEAKER frowns)|You do not know who you're dealing with.|I'll make sure to teach you a lesson. +(SPEAKER хмурится)|Ты не знаешь, с кем имеешь дело.|Я обязательно преподам тебе урок. +Why don't I make you wear it? +Почему бы мне не заставить тебя надеть это? +Hmmph. (Scoff into your gag) +Хмммфх. (Усмехаться сквозь зубы) +You can try~ +Ты можешь попробовать~ +(Giggle) +(Хихикать) +### (...) + +There must be a mistake. Sign me up! +Это, должно быть, ошибка. Запиши меня! +Mmmpphh~ (Moan and wiggle seductively) +Мммффхх~ (Стонать и соблазнительно покачиваться) +(She smiles)|Eager are we?|I don't just record anyone though.|I only care about the strongest adventurers~ +(Она улыбается)|Такая нетерпеливая?|Я не просто так записываю кого-то.|Я забочусь только о сильнейших искателях приключений~ +I am the strongest. +Я самая сильная. +(SPEAKER chuckles)|Then why don't I test your skills? +(SPEAKER хихикает)|Тогда почему бы мне не проверить твои навыки? +(SPEAKER grins)|How about trial by combat? +(SPEAKER ухмыляется)|Как насчет испытания боем? +A test? What kind? +Тест? Какой именно? +...You're on! +...Я в деле! +Let's do it! +Сделаем это! +You will see how strong I am! +Ты увидишь, какая я сильная! +Mmmmph~ +Ммммфх~ +(SPEAKER giggles)|We'll see about that! +(SPEAKER хихикает)|Это мы еще посмотрим! +### (...) + +On second thought, maybe not... +Если подумать, то, может, и нет... +(SPEAKER giggles)|Not so confident, are we? +(SPEAKER хихикает)|Не очень-то мы уверены в себе, не так ли? +(Give her a puzzled look and shake your head) +(Озадаченно взгляните на нее и покачайте головой) +I didn't think it would involve a test... +Я не думала, что это будет включать в себя тест... +(Shake your head) +(Покачать головой) +(Sigh and shrug) +(Вздохнуть и пожать плечами) +(Attack her without saying anything) +(Напасть на нее, ничего не сказав) +(SPEAKER readies her whip)|Allow me to introduce myself properly.|I am The Warden, divinely appointed judge and enforcer.|Those who enter this mountain do so under my watchful eye.|To ensure this, I have crafted a special collar.|It will ensure that you do not defile the holy places.|I can let you through if you accept it~ +(SPEAKER готовит свой хлыст)|Позволь мне представиться должным образом.|Я Надзирательницы, назначенный божествами судья и блюститель порядка.|Те, кто входит в эту гору, делают это под моим бдительным присмотром.|Чтобы гарантировать это, я изготовила специальный ошейник.|Это гарантирует, что ты не осквернишь святые места.|Я могу пропустить тебя, если ты наденешь его~ +I will never be collared by you! +Я никогда не позволю тебе надеть на меня ошейник! +(Shake your head and scoff) +(Покачать головой и усмехнуться) +(SPEAKER folds her arms)|So be it. +(SPEAKER складывает руки на груди)|Да будет так. +Tell me about your collection. +Расскажи мне о своей коллекции. +I'm in charge of my own path. +Я сама выбираю свой путь. +Hmmph. (Stand proudly) +Хммфх. (Стоять с гордой осанкой) +(SPEAKER grins)|Let's see how long you can keep up that attitude~ +(SPEAKER ухмыляется)|Давай посмотрим, как долго ты сможешь сохранять такую уверенность~ +That won't be necessary, miss. +В этом нет необходимости, мисс. +Mmph! (Shake your head) +Ммфх! (Покачать головой) +(SPEAKER smiles)|Oh, it's quite necessary~|Why don't I show you? +(SPEAKER улыбается)|О, это действительно необходимо~|Почему бы мне не показать тебе? +I would rather fight you. +Я бы предпочла подраться с тобой. +(Fight her) +(Вступить с ней в бой) +(SPEAKER shrugs)|Straight and to the point, eh? +(SPEAKER пожимает плечами)|Прямо и по существу, да? +Ready yourself! +Приготовься! +Hmmmph! +Хмммфх! +Let's go! +Начнем! +Mmmmmghh! +Мммммгхх! +I guess I have no choice... +Думаю, у меня нет выбора... +Mmmmph... +Ммммфх... +(SPEAKER grins)|Very impressive.|You may have lost the battle, but you performed admirably~ +(SPEAKER улыбается)|Весьма впечатляюще.|Возможно, ты проиграла битву, но выступила превосходно~ +(SPEAKER smiles)|I will let you pass so long as you wear my collar.|(She snaps her fingers and conjures a glowing ring) +(SPEAKER улыбается)|Я позволю тебе пройти, если ты оденешь мой ошейник.|(Она щелкает пальцами и создает светящееся кольцо) +(SPEAKER giggles)|Then your journey ends.|I assume you don't want that.|Now then, as for your collar~|(She snaps her fingers and conjures a glowing ring) +(SPEAKER хихикает)|И так твое путешествие заканчивается.|Я полагаю, ты этого не хочешь.|Теперь, что касается твоего ошейника~|(Она щелкает пальцами и создает светящееся кольцо) +(SPEAKER chuckles)|Of course it was magic~|Who said a commander had to be defenseless?|(She snaps her fingers and conjures a glowing ring) +(SPEAKER хихикает)|Конечно, это была магия~|Кто сказал, что командир должен быть беззащитен?|(Она щелкает пальцами и создает светящееся кольцо) +Was that magic? +Это была магия? +I've lost. Now what? +Я проиграла. Что теперь? +Mmmph. (Submit) +Мммфх. (Подчиниться) +I won't submit to you! +Я не подчинюсь тебе! +Mmmph! (Struggle weakly) +Мммфх! (Пытаться сопротивляется) +(Sigh and accept your fate) +(Вздохнуть и принять свою судьбу) +(Accept the collar eagerly) +(С готовностью принять ошейник) +(Accept the collar begrudgingly) +(Неохотно принять ошейник) +(SPEAKER presents you with your collar...)|(It closes around your neck seamlessly)|Now... you'll be allowed to go free,|but only once you've been sufficiently trained. +(SPEAKER презентует вам ошейник...)|(Он легко запирается на шее)|Теперь... тебе будет позволено свободно передвигаться,|но только после того, как ты пройдешь достаточную подготовку. +(SPEAKER blocks you with a web of metal bars)|Very impressive!|But did you really think it would be that easy? +(SPEAKER блокирует вас металлической сеткой)|Очень впечатляет!|Но ты действительно думала, что это будет так просто? +(SPEAKER crouches down)|Most impressive...|It is not often I lose to an adventurer...|I'd love to get my hands on you eventually~ +(SPEAKER приседает)|Действительно впечатляюще...|Я нечасто проигрываю авантюристам...|Я бы хотела, в конце концов, заполучить тебя в свои руки~ +(SPEAKER looks surprised)|I did not expect you to be so... compliant.|(She snaps your fingers and tosses you a glowing belt)|This is a special one, reserved for those with divine privilege.|You've earned it. +(SPEAKER выглядит удивленной)|Я не ожидала, что ты будешь такой... уступчивой.|(Она щелкает пальцами и бросает вам светящийся пояс)|Это особый пояс, предназначенный для тех, у кого есть божественные привилегии.|Ты его заслужила. +(Wear her belt anyway) +(Все равно надеть её ремень) +(SPEAKER shakes her head as you force a gag into her mouth)|MMMMMPH! +(SPEAKER качает головой, когда вы засовываете ей в рот кляп)|МММММФХ! +(Gag her) +(Заткнуть её кляпом) +The ENMY weakens your grip on your weapon! Enemies may disarm you if you stand too close... +ENMY ослабляет вашу хватку на оружии! Враги могут обезоружить вас, если вы встанете слишком близко... +Can you link my arm cuffs? +Не могли бы вы соединить мои манжеты на руках? +(Hold out your arm cuffs) +(Протяните свои руки с манжетами) +(The SPEAKER smiles)|Why sure, sweetie, I can help you with that~ +(SPEAKER улыбается)|Конечно, милая, я могу помочь тебе с этим~ +(The SPEAKER grins)|What a good girl! +(SPEAKER ухмыляется)|Какая хорошая девочка! +(The SPEAKER blushes)|Those look like fun! +(SPEAKER краснеет)|Это выглядит забавно! +(The SPEAKER smirks)|Sure thing~ +(SPEAKER ухмыляется)|Конечно~ +(The SPEAKER beeps)|+10 social credit +(SPEAKER подает звуковой сигнал)|+10 социальных кредитов +Can you link my leg cuffs? +Не могли бы вы соединить мои манжеты на ногах? +(Hold out your leg cuffs) +(Покажите свои ноги с манжетами ) +(The SPEAKER smiles)|Why sure, sweetie, I can help you with that~ +(SPEAKER улыбается)|Конечно, милая, я могу помочь тебе с этим~ +(The SPEAKER grins)|What a good girl! +(SPEAKER ухмыляется)|Какая хорошая девочка! +(The SPEAKER blushes)|Those look like fun! +(SPEAKER краснеет)|Это выглядит забавно! +(The SPEAKER smirks)|Sure thing~ +(SPEAKER ухмыляется)|Конечно~ +(The SPEAKER beeps)|+10 social credit +(SPEAKER подает звуковой сигнал)|+10 социальных кредитов +Sunglasses +Солнечные очки +Cool people wear these indoors. +Крутые ребята носят их в помещении. ++25 holy resist. Reduces blind effects. Prevents blinding from light adjustment. ++25 к сопротивлению свету. Ослабляет эффект слепоты. Предотвращает ослепление при вспышках света. +Sunglasses +Солнечные очки +Cool people wear these indoors. +Крутые ребята носят их в помещении. ++25 holy resist. Reduces blind effects. Prevents blinding from light adjustment. ++25 к сопротивлению свету. Ослабляет эффект слепоты. Предотвращает ослепление при вспышках света. +You find a pair of stylish shades. +Вы находите пару стильных темных очков. +Shades +Темные очки +Cool people wear these indoors. +Крутые ребята носят их в помещении. ++25 holy resist. Reduces blind effects. Prevents blinding from light adjustment. ++25 к сопротивлению свету. Ослабляет эффект слепоты. Предотвращает ослепление при вспышках света. +Sunglasses +Солнечные очки +Cool people wear these indoors. +Крутые ребята носят их в помещении. ++25 holy resist. Reduces blind effects. Prevents blinding from light adjustment. ++25 к сопротивлению свету. Ослабляет эффект слепоты. Предотвращает ослепление при вспышках света. +You find a pair of stylish shades. +Вы находите пару стильных темных очков. +Player Background Color +Цвет фона игрока +An attack causes you to bounce... +Атака заставляет вас отпрыгнуть... +You find yourself enveloped in a bubble! +Вы оказываетесь окутанной пузырем! +A sphere of latex coalesces around you, trapping you and inflating until tight! +Вокруг вас образуется сфера из латекса, которая захватывает вас и надувается до тех пор, пока не станет очень туго! +A sphere of latex coalesces around you, trapping you and sealing around your neck! +Латексная сфера обволакивает вас, обхватывая и плотно запечатываясь вокруг шеи! +You find yourself enveloped in a slime bubble! +Вы оказываетесь окутанным пузырём из слизи! +Your RestraintName pops with a loud bang! +Ваш RestraintName отскакивает с громким хлопком! +Your RestraintName starts leaking air! Very, very slowly... +Из вашего RestraintName начинает выходить воздух! Очень, очень медленно... +no damage +нет урона +Aqua Slime +Аква-слайм +The aqua slime melts into a wet puddle. +Аква-слайм превращается в лужицу. +The aqua slime splashes against you! (DamageTaken) +Аква-слайм брызгается на вас! (DamageTaken) +The aqua slime expands into a bubble and throws itself at you! (+RestraintAdded) +Аква-слайм превращается в пузырь и бросается на вас! (+RestraintAdded) +Aqua Bubble (Head) +Аква-пузырь (Голова) +A squishy bubble made of a gelatinous substance! +Мягкий пузырь, сделанный из желатиновой субстанции! +You can pop it with a sharp enough edge, if you can get your tool in the position... +Вы можете проткнуть его достаточно острой кромкой, если сможете правильно расположить свой инструмент... +Aqua Bubble (Arms) +Аква-пузырь (Руки) +A squishy bubble made of a gelatinous substance! +Мягкий пузырь, сделанный из желатиновой субстанции! +You can pop it with a sharp enough edge, if you can get your tool in the position... +Вы можете проткнуть его достаточно острой кромкой, если сможете правильно расположить свой инструмент... +Aqua Bubble (Legs) +Аква-пузырь (Ноги) +A squishy bubble made of a gelatinous substance! +Мягкий пузырь, сделанный из желатиновой субстанции! +You can pop it with a sharp enough edge, if you can get your tool in the position... +Вы можете проткнуть его достаточно острой кромкой, если сможете правильно расположить свой инструмент... +The bubbles on you combine into one big bubble! +Пузыри на вас объединяются в один большой пузырь! +The stairs have been locked down for NMB more turns. +Лестница закрыта еще на NMB ходов. +Curse of Increasing Tightness: Your restraints get tighter over time. +Проклятие Затягивания: со временем ваши ограничители становятся все туже. +Curse of Lethargy: Reduce distraction over time, but miscast chance is increased by AMNT%. +Проклятие Летаргии: Со временем Возбуждение уменьшается, но вероятность осечки увеличивается на AMNT%. +Curse of Mute: You cannot converse, and verbal spells cost AMNT% more mana. +Проклятие Немоты: вы не можете разговаривать, а словесные заклинания требуют на AMNT% больше маны. +Curse of Clumsiness: After casting an arm spell, you drop your currently held weapon. +Проклятие Неуклюжести: Применив жестовое заклинание вы теряете свое оружие, которое в данный момент держите. +Curse of Deflection: 50% chance for an attack to be redirected against an adjacent hostile target. +Проклятие Отклонения: 50%-ная вероятность перенаправления атаки на соседнюю враждебную цель. +Loot Recovery: +Возвращение добычи: +Enabled +Включено +Disabled +Отключено +Partial +Частично +You recover important items when you advance floors. +Продвигаясь на новый этаж, вы возвращаете важные потерянные предметы. +Once items are lost, they are gone for good. +Если предметы потеряны, они пропадают навсегда. +Each item has a 25% chance of appearing in the chest between floors. +Вероятность появления потерянного предмета в сундуке между этажами составляет 25%. +You find a familiar adventuring outfit! +Вы находите знакомую одежду авантюристки! +You feel energy flow out of you, activating the floor below! +Вы чувствуете, как из вас вытекает энергия, активируя что-то на полу под вами! +You feel energy flow out of you, lighting up a circle on the floor! +Вы чувствуете, как энергия вытекает из вас, образуя круг на полу! +The floor beneath you drains your mana, but you don't have enough to satisfy it. +Пол под вами истощает вашу ману, но вам ее не хватает, чтобы насытить его. +The ground beneath you glows with magical energy! +Земля под вами светится магической энергией! +Radiant Light +Сияющий свет +Banishment of the shadow. +Изгоняет тень. +Living Shadow +Живая тень +Engulfs the tile in darkness. +Погружает плитку в темноту. +Planar Focus +Планарный концентратор +Absorbs teleportation energies. +Поглощает энергию телепортации. +Planar Diffractor +Планарный рассеиватель +Diffuses teleportation energies. +Рассеивает энергию телепортации. +Planar Focusing Crystal +Планарный фокусирующий кристалл +Amplifies teleportation energies. +Усиливает энергию телепортации. +Mysterious Plate +Таинственная пластина +What could it be? +Что бы это могло быть? +Mana-Charged Plate +Пластина, заряженная маной +It seems like it needs more power... +Похоже, ей нужно больше энергии... +Mana-Charged Plate +Пластина, заряженная маной +It's giving off a strange energy! +От неё исходит странная энергия! +Glass Plate +Стеклянная пластина +Looks like it has lighting elements inside. +Похоже, что внутри нее есть светящиеся элементы. +### ??? + +### ??? + +### ??? + +### ??? + +Many bars come out of the ground and restrain you! +Множество стержней выскакивают из земли и удерживают вас! +One Bar Missile +Палка-снаряд +Restraining Bolt +Сдерживающий заряд +Sealing Bolt +Запечатывающий заряд +Bondage Blast +Бондаж-взрыв +Magic Missile +Магический снаряд +Warden's Cage +Клетка Надзирательницы +Restricting Bars +Ограничивающие стержни +The bars retract into the ground. +Стержни втягиваются в землю. +Sealing Pillar +Запечатывающий столб +The pillar collapses, causing zombies to rise up! +Столб разрушается, вызывая восстание зомби! +Safeword Please +Стоп-слово, пожалуйста +Allies don't help you unless you ask first. +Союзники не помогут вам, если вы сначала не попросите. +Living Collars +Живые ошейники +When you get jailed, you may get a living collar that applies further restraints on you. +Когда вас посадят в камеру, вы можете получить живой ошейник, который в будущем будет накладывать на вас дополнительные ограничители. +The Warden's cage falls atop you and attaches to the floor with a click. +Клетка Надзирательницы падает на вас и со щелчком прикрепляется к полу. +The restraining bolt emits binding energies! +Сдерживающий заряд излучает сковывающую энергию! +The restraining bolt flashes and pushes you backward! +Сдерживающий заряд вспыхивает и отбрасывает вас назад! +The restraining bolt transforms into cuffs on impact! +Сдерживающий заряд превращается в манжеты при ударе! +The restraining bolt pins your cuffs to the wall! +Сдерживающий заряд прижимает ваши манжеты к стене! +The spell explodes into restraining energy! +Заклинание взрывается сдерживающей энергией! +The spell explodes and stuns you! +Заклинание взрывается и оглушает вас! +The spell congeals into restraints! +Заклинание превращается в ограничители! +The mage starts channeling her energy! +Маг начинает направлять свою энергию! +Warden Cuffs +Манжеты Надзирательницы +A pair of cuffs that make it easy to restrain you. +Пара манжет, которые позволяют легко сковать вас. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +The enemy attaches your wrist cuffs together! +Враг скрепляет ваши манжеты на запястьях друг с другом! +Wrist Chain +Цепочка между запястий +A pair of cuffs keeping your arms behind your back. +Пара манжет, удерживающих ваши руки за спиной. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +Your cuffs detatch! +Ваши манжеты расцепляются! +The enemy attaches your elbow cuffs together! +Враг скрепляет ваши манжеты на локтях! +Cuffs Chain +Цепочка между манжет +A full set of cuffs keeping your arms in a strict elbow tie! +Полный комплект манжет, удерживающих ваши руки строго скованными в районе локтей! +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +Your wrists detatch, leaving your elbows still bound! +Ваши запястья расцепляются, однако локти все еще скованы! +Elbow Chain +Цепочка между локтями +A pair of cuffs keeping your elbows locked together! +Пара манжет, удерживающих ваши локти сцепленными друг с другом! +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +Your elbows detatch! +Ваши локти расцепляются! +The enemy attaches your wrist cuffs back together! +Враг снова сковывает ваши манжеты на запястьях! +Warden Leg Cuffs +Манжеты Надзирательницы (Ноги) +A pair of cuffs on your legs. +Пара манжет для ваших ног. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +The enemy attaches your leg cuffs together! +Враг сковывает ваши манжеты на ногах! +Thigh Chain +Цепочка между бедер +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +The leg cuff chain detaches! +Цепочка отстегивается от манжет на ногах! +Warden Ankle Cuffs +Манжеты Надзирательницы (Лодыжки) +A pair of cuffs on your ankles. +Пара манжет для ваших лодыжек. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +The enemy attaches your ankle cuffs together! +Враг скрепляет манжеты на ваших лодыжках! +Ankle Chain +Цепочка между лодыжек +A pair of cuffs chaining your legs together. +Пара манжет, сковывающих ваши ноги друг с другом. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +The ankle cuff chain detaches! +Цепочка отстегивается от манжет на лодыжках! +Your ankle cuff chain is tightened and pulls your feet together! +Цепочка между манжет на лодыжках затягивается и стягивает ваши ступни вместе! +Short Ankle Chain +Короткая цепочка между лодыжек +A pair of cuffs chaining your feet tightly together. +Пара манжет, туго стягивающих ваши ноги друг с другом. +They feel like they aren't even there, but the material is rigid and unyielding. +Они практически не ощущаются, но материал жесткий и неподатливый. +Your ankle cuff chain loosens! +Цепочка между манжет на щиколотках ослабевает! +Your buttons have been pushed, and not in a pleasant way! +На ваши кнопки нажали, и не самым приятным образом! +Defeat all taunting enemies or stay within the tiles to avoid shame! +Победите всех дразнящих врагов или оставайтесь в пределах плиток, чтобы избежать позора! +Degradating Taunts +Унизительные насмешки +You failed to come up with a proper comeback! +Вы не смогли должным образом ответить! +The zone of frost damages you as you are chilled! +Зона мороза наносит вам урон, когда вы замерзаете! +Confirm Path +Подтвердить путь +Navigation Map +Навигационная карта +Choose a path to take by clicking on a highlighted room. +Выберите путь, нажав на подсвеченную комнату. +Other paths will become inaccessible. +Другие пути станут недоступны. +Floor NMB +Этаж NMB +Tileset: +Локация: +Map Modifier: +Модификатор карты: +Layout: +Расположение: +Controlling Faction: +Контролирующая фракция: +Main Objective: +Основная цель: +Points of Interest: +Точки интереса: +Magical Study +Магическое знание +Maintenance Hall +Ремонтный зал +Ancient Chest +Древний сундук +Elevator Hall +Зал с лифтами +Dark Passageway +Темный проход +Dark Passageway +Темный проход +Caldera Passage +Проход в кальдеру +Ancient Vault +Древний склеп +Auction Hall +Аукционный зал +Dark Altar +Темный алтарь +Bandit Hideout +Убежище бандитов +Dimensional Rift +Межпространственный разлом +Hoard +Тайное хранилище +Dragon's Lair +Драконье логово +None +Нет +None +Нет +Witch's Lair +Логово ведьм +Mold Infestation +Заражение плесенью +Bandit Raid +Бандитский налет +Dragon Sighting +Взор дракона +Overgrown +Заросли +Slime Infestation +Заражение слизью +Wolfgirl Training +Тренировка волчиц +Drone Patrol +Патруль дронов +Normal +Обычное +Shop +Магазин +Chamber +Камера +Prison +Тюрьма +Sorting Room +Сортировочная комната +Prison +Тюрьма +Lair +Логово +Click a hotbar slot to assign the current item to it.|You can click the swap button on the right|to switch between your five hotbars.||You can also save and load presets for your hotbar.|These are shared between runs. +Щелкните по ячейке панели быстрого доступа, чтобы назначить на неё предмет.|Вы можете нажать кнопку смены справа,|чтобы переключаться между пятью вашими панелями быстрого доступа.||Вы также можете сохранять и загружать пресеты для своей панели быстрого доступа.|Они общие в разных забегах. +You step on the item and tug to pull it taut... +Вы наступаете на предмет и тянете, чтобы он растянулся... +You tug furiously against the leash, pulling it taut! +Вы яростно натягиваете поводок, растягивая его до упора! +Silenced Hall +Тихие залы +The waist-deep water slows you! +Вода по пояс замедляет движение! +Sariel Vinlaga's Panties +Трусики Сариэль Винлага +Legend has it that these were worn by the legendary archmagus herself. +Легенда гласит, что их носила сама легендарная архимагиня. +If you keep them in your mouth, your verbal spells have -50% miscast chance. +10% spell damage. +Если вы будете держать их во рту, вероятность осечки при произнесения ваших словесных уменьшится на 50%. Урон от заклинаний увеличится на 10%. +Sariel Vinlaga's Panties +Трусики Сариэль Винлага +Legend has it that these were worn by the legendary archmagus herself. +Легенда гласит, что их носила сама легендарная архимагиня. +If you keep them in your mouth, your verbal spells have -50% miscast chance. +10% spell damage. +Если вы будете держать их во рту, вероятность осечки при произнесения ваших словесных уменьшится на 50%. Урон от заклинаний увеличится на 10%. +You find a pair of black panties with pink trim, scrunched up in a ball. +Вы находите пару черных трусиков с розовой отделкой, скомканных в комочек. +Elven Panties +Эльфийские трусики +In faraway lands, they often say that less is more... +В далеких землях часто говорят, что меньше значит больше... ++11% sprint efficiency ++11% эффективность спринта +Elven Panties +Эльфийские трусики +In faraway lands, they often say that less is more... +В далеких землях часто говорят, что меньше значит больше... ++11% sprint efficiency ++11% эффективность спринта +You find a pair of elven panties. +Вы находите пару эльфийских трусиков. +Hood of Fluffoth +Плюшевый капюшон +Worn by devotees to Fluffoth, demonic ruler of the plush abyss. +Надевается приверженцами Плюшевости, чтобы сбить с толку демонического правителя Мягкой бездны. +When distraction reaches 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 40 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. +Когда возбуждение достигает 90%, испускайте волну мягкой энергии, которая окутывает цели на площади 5х5. Наносит 40 единиц Мягкого урона и стреноживает на 3 хода. Перезаряжается, когда ваше возбуждение становится ниже 50%. 5 ходов внутреннее восстановление. +Hood of Fluffoth +Плюшевый капюшон +Worn by devotees to Fluffoth, demonic ruler of the plush abyss. +Надевается приверженцами Плюшевости, чтобы сбить с толку демонического правителя Мягкой бездны. +When distraction is over 90%, emit a wave of soft energies that envelops targets a 5x5 area. Deals 30 plush damage and snares for 3 turns. Recharges when your distraction goes below 50%. 5 turn internal cooldown. +Когда возбуждение достигает 90%, испускайте волну мягкой энергии, которая окутывает цели на площади 5х5. Наносит 40 единиц Мягкого урона и стреноживает на 3 хода. Перезаряжается, когда ваше возбуждение становится ниже 50%. 5 ходов внутреннее восстановление. +You find a sinister hood made of soft plush. +Вы находите зловещий капюшон, сделанный из плюшевой ткани. +Ceremonial Leotard +Церемониальное трико +An article worn by the servants of state in the short-lived kingdom of Ejahl. Its locking mechanism and clothes-dissolving enchantments ensure the wearer understands her role as an extension of the state. +Изделие, которое носили государственные служащие в недолговечном королевстве Эджал. Его запирающий механизм и чары, разрушающие одежду, гарантируют, что его обладательница осознает свою роль как представителя государства. +Its soul crystals harden the mind and dampen changes in willpower, reducing all willpower changes by 25%. +Его кристаллы душ укрепляют разум и ослабляют изменения силы воли, уменьшая все изменения силы воли на 25%. +Ceremonial Leotard +Церемониальное трико +An article worn by the servants of state in the short-lived kingdom of Ejahl. Its locking mechanism and clothes-dissolving enchantments ensure the wearer understands her role as an extension of the state. +Изделие, которое носили государственные служащие в недолговечном королевстве Эджал. Его запирающий механизм и чары, разрушающие одежду, гарантируют, что его обладательница осознает свою роль как представителя государства. +Its soul crystals harden the mind and dampen changes in willpower, reducing all willpower changes by 25%. +Его кристаллы душ укрепляют разум и ослабляют изменения силы воли, уменьшая все изменения силы воли на 25%. +You find a ceremonial leotard. +Вы находите Церемониальное трико. +The Robe of Chastity +Мантия целомудрия +A magical leotard whose power infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. +Магическое трико, наполненное силой, которая напоминает божественную, но искусственная. Изготовлено из ткани, которая преобразует глубинные энергии владельца в мощные энергии, пока поверх него не надето никакой одежды. +It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire. +Говорят, что тот, кто следует целомудренным принципам Паладинов, получает затухание Желания на -1%/40 ходов и ауру, наносящую 2 (+3% к отсутствующих DP) урона от света за ход. Действует только на врагов в зоне ближнего боя. Кроме того, магически проводящая ткань обладает стимулирующим действием, в результате чего на 50% увеличивается получаемое возбуждение от всех источников, а 8% потраченной маны преобразуется в Желание. +The Robe of Chastity +Мантия целомудрия +A magical leotard infused with a power resembling divinity, but artificial. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. +Магическое трико, наполненное силой, которая напоминает божественную, но искусственная. Изготовлено из ткани, которая преобразует глубинные энергии владельца в мощные энергии, пока поверх него не надето никакой одежды. +It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire. +Говорят, что тот, кто следует целомудренным принципам Паладинов, получает затухание Желания на -1%/40 ходов и ауру, наносящую 2 (+3% к отсутствующих DP) урона от света за ход. Действует только на врагов в зоне ближнего боя. Кроме того, магически проводящая ткань обладает стимулирующим действием, в результате чего на 50% увеличивается получаемое возбуждение от всех источников, а 8% потраченной маны преобразуется в Желание. +You retrieve an interesting article dubbed 'the Robe of Chastity. +Вы находите интересный предмет под названием 'Мантия целомудрия'. +Took +Получено: +(As you slay the dragon, it begins shapeshifting into human form!) +(Когда вы сражаете дракона, он начинает принимать человеческий облик!) +(As you slay the dragon, it begins shapeshifting into human form!) +(Когда вы сражаете дракона, он начинает принимать человеческий облик!) +(As you slay the dragon, it begins shapeshifting into human form!) +(Когда вы сражаете дракона, он начинает принимать человеческий облик!) +(As you slay the dragon, it begins shapeshifting into human form!) +(Когда вы сражаете дракона, он начинает принимать человеческий облик!) +Crystal Dragon Queen +Королева кристальных драконов +The crystal dragon shapeshifts back to human form! +Кристальный дракон принимает человеческий облик! +The crystal dragon strikes you with its claws! (DamageTaken) +Кристальный дракон поражает вас своими когтями! (DamageTaken) +The crystal dragon breaths a sparkling dust, which hardens into crystal! (+RestraintAdded) +Кристальный дракон выдыхает сверкающую пыль, которая затвердевает и превращается в кристалл! (+RestraintAdded) +The crystal dragon takes flight and swoops toward you! +Кристальный дракон взлетает и устремляется к вам! +The crystal dragon takes flight and slams into you! (Stunned!) +Кристальный дракон взлетает и врезается в вас! (Оглушение!) +Crystal Dragon Girl +Девушка-кристальный дракон +The dragon girl submits to you! +Девушка-дракон подчиняется вам! +The dragon girl slams you with several hurled crystals! (DamageTaken) +Девушка-дракон швыряет в вас несколькими кристаллами! (DamageTaken) +The dragon girl conjures a cloud of crystals that solidify! (+RestraintAdded) +Девушка-дракон создает затвердевающее кристальное облако! (+RestraintAdded) +The dragon girl conjures crystalline locks on you! (+RestraintAdded) +Девушка-дракон создает на вас кристальные замки! (+RestraintAdded) +Poison Dragon Queen +Королева ядовитых драконов +The poison dragon shapeshifts back to human form! +Ядовитый дракон принимает человеческий облик! +The poison dragon strikes you with its claws! (DamageTaken) +Ядовитый дракон поражает вас своими когтями! (DamageTaken) +The poison dragon extends many vines from its wings! (+RestraintAdded) +Ядовитый дракон выпускает из своих крыльев множество лиан! (+RestraintAdded) +The poison dragon takes flight and swoops toward you! +Ядовитый дракон взлетает и устремляется к вам! +The poison dragon takes flight and slams into you! (Stunned!) +Ядовитый дракон взлетает и врезается в вас! ((Оглушение!) +Poison Dragon Girl +Девушка-ядовитый дракон +The dragon girl submits to you! +Девушка-дракон подчиняется вам! +The dragon girl slashes you with her venomous nails! (DamageTaken) +Девушка-дракон вонзает в вас свои ядовитые ногти! (DamageTaken) +The dragon girl raises vines out of the ground to bind you! (+RestraintAdded) +Девушка-дракон поднимает из земли лианы, чтобы связать вас! (+RestraintAdded) +The dragon girl holds you in place and locks your restraints! (+RestraintAdded) +Девушка-дракон удерживает вас на месте и запирает ваши ограничители! (+RestraintAdded) +Ice Dragon Queen +Королева ледяных драконов +The ice dragon shapeshifts back to human form! +Ледяной дракон принимает человеческий облик! +The ice dragon strikes you with its claws! (DamageTaken) +Ледяной дракон поражает вас своими когтями! (DamageTaken) +The ice dragon catches you in its icy breath! (+RestraintAdded) +Ледяной дракон обдает вас своим ледяным дыханием! (+RestraintAdded) +Ice Dragon Girl +Девушка-ледяной дракон +The dragon girl submits to you! +Девушка-дракон подчиняется вам! +The dragon girl slams you with several chunks of ice! (DamageTaken) +Девушка-дракон швыряет в вас несколькими кусками льда! (DamageTaken) +The dragon girl splashes you with instantly freezing ice! (+RestraintAdded) +Девушка-дракон брызгает в вас мгновенно замерзающей водой! (+RestraintAdded) +The dragon girl conjures magical locks on you! (+RestraintAdded) +Девушка-дракон призывает прямо на вас магические замки! (+RestraintAdded) +Shadow Dragon Queen +Королева теневых драконов +The shadow dragon shapeshifts back to human form! +Теневой дракон принимает человеческий облик! +The shadow dragon slashes directly at your mind! (DamageTaken) +Теневой дракон наносит удар прямо по вашему разуму! (DamageTaken) +The shadow dragon wraps itself around you many times! (+RestraintAdded) +Теневой дракон обвивается вокруг вас множество раз! (+RestraintAdded) +Shadow Dragon Girl +Девушка-теневой дракон +The dragon girl submits to you! +Девушка-дракон подчиняется вам! +The dragon girl stares into your eyes! (DamageTaken) +Девушка-дракон пристально смотрит вам в глаза! (DamageTaken) +The dragon girl reaches out with a shadowy grip! (+RestraintAdded) +Девушка-дракон протягивает к вам призрачную руку! (+RestraintAdded) +The dragon girl reaches out and locks your restraints! (+RestraintAdded) +Девушка-дракон протягивает руку и запирает ваши ограничители! (+RestraintAdded) +A cage falls from the ceiling on top of you! +С потолка на вас падает клетка! +Crystals grow across your body and encase you! +Кристаллы покрывают ваше тело и заключают в Оболочку! +You are encased in a solid block of ice! +Вы заключены в Оболочку в виде твердой глыбы льда! +A shadowy sphere rises from the ground and wraps over you tightly! +Темная сфера поднимается из-под земли и плотно окутывает вас! +Shadows coalesce themselves around you in spherical form! +Тени сгущаются вокруг вас в сферическую форму! +Crystal Encasement +Кристальная оболочка +An overgrowth of magical crystals. Their chaotic energies flood into your mind and displace your thoughts! +Заросли магических кристаллов. Их хаотическая энергия проникает в ваш разум и спутывает ваши мысли! +Being brittle, it will eventually crack and fail. Just keep wiggling... +Будучи хрупкой, она в конечном итоге треснет и сломается. Просто продолжайте шевелиться... +Ice Encasement +Ледяная оболочка +A huge ice cube. It's quite cold in there. +Огромный кубик льда. Внутри довольно холодно. +It will eventually melt! Eventually... +Рано или поздно он растает! Когда-нибудь... +The Warden's restraints release you... for now. +Ограничители Надзирательница отпускают вас... на время. +Chain Hogtie +Цепная кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и тугая вязь, обычно применяемая на кабанах, но также весьма полезная для усмирения непослушных пленников. +A metal chain holds your back in an arched position. +Металлическая цепочка удерживает спину в согнутом положении. +Thigh Chain +Цепочка между бедер +A chain connecting your thigh cuffs together. You can still walk, albeit slower than usual. +Цепочка, соединяющая манжеты на бедрах. Вы все еще можете ходить, хотя и медленнее, чем обычно. +It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. +Сделана из стали и защелкивается на замок. Разблокировка замка приведет к ее спадению. +Ankle Chain +Цепочка между лодыжек +A chain connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. +Цепочка, соединяющая манжеты на щиколотках. Дает вам достаточно пространства для ходьбы, хотя и медленнее, чем обычно. +It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. +Сделана из стали и защелкивается на замок. Разблокировка замка приведет к ее спадению. +Ankle Chain (Short) +Короткая цепочка (Лодыжки) +A short chain connecting your ankle cuffs together. You can barely separate your legs with this on. +Короткая цепочка, соединяющая манжеты на щиколотках. С ней вы едва сможете раздвинуть ноги. +It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. +Сделана из стали и защелкивается на замок. Разблокировка замка приведет к ее спадению. +Elbow Chain +Цепочка между локтями +A very short chain connecting your elbow cuffs together. It is quite awkward to remove by yourself. +Очень короткая цепочка, соединяющая манжеты на локтях. Её будет очень неудобно снимать самостоятельно. +It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. +Сделана из стали и защелкивается на замок. Разблокировка замка приведет к ее спадению. +Wrist Chain +Цепочка между запястий +A very short chain connecting your wrist cuffs together. +Очень короткая цепочка, соединяющая манжеты на запястьях друг с другом. +It's made of steel and secured with a lock. Unlocking the lock will cause it to fall loose. +Сделана из стали и защелкивается на замок. Разблокировка замка приведет к ее спадению. +Vine Pod +Стручок лоз +The vine pod explodes into dust! +Стручок лоз разлетается в пыль! +The vine pod wraps you in vines and squeezes! (DamageTaken) +Стручок лоз обвивает вас лианами и сжимает! (DamageTaken) +The vine pod launches several vines at you in quick succession! (+RestraintAdded) +Стручок лоз быстро запускает в вас несколько лиан подряд! (+RestraintAdded) +Sleep Flower +Цветок сна +The sleep flower explodes into dust! +Цветок сна разлетается в пыль! +The sleep flower sprays pollen into your face! Achoo! (DamageTaken) +Цветок сна разбрызгивает пыльцу вам в лицо! Апчхи! (DamageTaken) +The sleep flower launches several vines at you in quick succession! (+RestraintAdded) +Цветок сна быстро запускает в вас несколько лоз! (+RestraintAdded) +Several vine pods sprout out of the ground! +Из земли вырастает несколько стручков лоз! +A vine pod sprouts out of the ground! +Из земли вырастает стручок лоз! +Several flowers sprout out of the ground! +Из земли вырастает несколько цветков! +A magical flower sprouts out of the ground! +Из земли вырастает магический цветок! +A wall of ice rises from the ground! +Из земли вырастает стена льда! +A wall of ice rises from the ground! +Из земли вырастает стена льда! +The dragon's breath poisons you! +Дыхание дракона отравляет вас! +The dragon girl strikes you with poisonous razor leaves! +Девушка-дракон поражает вас ядовитыми листьями-лезвиями! +The flower releases soporific spores! +Цветок выделяет усыпляющие споры! +The flower releases soporific spores! +Цветок выделяет усыпляющие споры! +Poison Breath +Ядовитое дыхание +Vines reach from the ceiling and lift you into the air! +Лозы свисают с потолка и поднимают вас в воздух! +Vine Suspension +Подвеска из лоз +Vines linked to your bindings that keep you suspended! +Лианы обвязываются вокруг ваших ограничителей и удерживают вас в подвешенном состоянии! +You are left dangling! Maybe if you swing hard enough you can tear the vines... +Вы остаетесь висеть! Возможно, если вы будете раскачиваться достаточно сильно, то сможете порвать лианы... +Darkstar Studios - Slimy Science +Darkstar Studios - Наука слаймов +Kocaeli - Doll Storage +Kocaeli - Хранилище Кукол +Kocaeli - Factory +Kocaeli - Фабрика +### Kocaeli - AAA + +### Kocaeli - DD + +Ada18980 - Playing with fire +Ada18980 - Игра с огнем +Ada18980 - Smoking is bad for you +Ada18980 - Курение вредно для вас +Kocaeli - Graveyard +Kocaeli - Кладбище +Kocaeli - Ancient Tombs +Kocaeli - Древние катакомбы +Kocaeli - Magic Library +Kocaeli - Магическая библиотека +Kocaeli - Black Cat +Kocaeli - Черная кошка +Kocaeli - Black Cat 2 +Kocaeli - Черная кошка 2 +Kocaeli - Underground Jungle +Kocaeli - Подземные джунгли +Kocaeli - Untitled +Kocaeli - Без названия +Kocaeli - Lost Temple +Kocaeli - Затерянный храм +Kocaeli - Orrery +Kocaeli - Планетарий +Kocaeli - Bellows +Kocaeli - Сильфоны +Kocaeli - Orrery +Kocaeli - Планетарий +Kocaeli - Rubber Facility +Kocaeli - Резиновый комплекс +Kocaeli - Edge of Reality +Kocaeli - Грань реальности +### Kocaeli - 1 + +Icy Barrier +Ледяной барьер +The wall of ice shatters! +Ледяная стена разрушается! +Icy Breath +Ледяное дыхание +Ice Orb +Ледяной шар +The EnemyName breaths in deeply, causing the air around you to chill... +EnemyName глубоко вдыхает, отчего воздух вокруг вас холодеет... +Shadow Bubble +Теневой пузырь +The projectile explodes into tight shadow latex, stretching all across your body! +Снаряд превращается в плотный теневой латекс, который растягивается по всему вашему телу! +The dragon dances through the shadows! +Дракон перемещается в тенях! +You tip over as you try to roll yourself! (oof!) +Вы переворачиваетесь, пытаясь перекатиться! (Уф!) +The shadowy energies surrounding you drain away your mana... +Окружающая вас темная энергия высасывают вашу ману... +Shadow Sphere +Теневая сфера +A giant shadow latex sphere that leaves you rolling around... +Гигантская теневая латексная сфера, которая заставляет вам кататься по земле... +Your movement is severely hampered, limited to feeble wiggling... +Ваши движения сильно затруднены и сводятся к слабым покачиваниям... +Dark magics fill the air! +Темная магия наполняет воздух! +Dark magics fill the air! +Темная магия наполняет воздух! +Shadow Posture Collar +Теневой осаночный ошейник +A strict collar that seals your mouth tightly. +Строгий воротник, плотно закрывающий ваш рот. +It is made of shadow latex, tougher to cut than normal latex. +Он изготовлен из теневого латекса, который режется куда хуже обычного латекса. +*scoffs* Amateur. +*издевается* Любитель. +Nothing personal. +Ничего личного. +Not bad... you made me use 10% of my power. +Неплохо... вы заставила меня использовать 10% моей силы. +It's a defunct elevator, likely from the Old Civilization. +Это вышедший из строя лифт, вероятно, оставшийся от Древней цивилизации. +(The elevator beeps and roars to life)|(Its control panel displays a list of options) +(Лифт издает сигнал и с ревом возвращается к жизни)|(На панели управления отображается список опций) +(Go to floor 0) +(Ехать на этаж 0) +(Go to floor 1) +(Ехать на этаж 1) +(Go to floor 2) +(Ехать на этаж 2) +(Go to floor 3) +(Ехать на этаж 3) +(Go to floor 4) +(Ехать на этаж 4) +(Go to floor 5) +(Ехать на этаж 5) +(Go to floor 6) +(Ехать на этаж 6) +(Go to floor 7) +(Ехать на этаж 7) +(Go to floor 8) +(Ехать на этаж 8) +(Go to floor 9) +(Ехать на этаж 9) +(Go to floor 10) +(Ехать на этаж 10) +(Go to floor 11) +(Ехать на этаж 11) +(Go to floor 12) +(Ехать на этаж 12) +(Go to floor 13) +(Ехать на этаж 13) +(Go to floor 14) +(Ехать на этаж 14) +(Go to floor 15) +(Ехать на этаж 15) +(Go to floor 16) +(Ехать на этаж 16) +(Go to floor 17) +(Ехать на этаж 17) +(Go to floor 18) +(Ехать на этаж 18) +(Go to floor 19) +(Ехать на этаж 19) +(Go to floor 20) +(Ехать на этаж 20) +(The viewscreen depicts a face)|Why hello there adventurer! What brings you? +(На экране появляется лицо)|Привет, искатель приключений! Что привело тебя сюда? +Hmmmphgm? +Хмммфхгм? +(The face giggles)|Sadly my language processing systems aren't that good.|Try removing your gag first? +(Лицо хихикает)|К сожалению, мои системы обработки языковых данных не настолько хороши.|Попробуй сначала вынуть кляп. +Who are you? +Кто ты? +(The face smiles)|I am the Facility's vessel, of course!|Sariel called me Oriel, but I don't see her much these days... +(Лицо улыбается)|Конечно же, я сосуд Комплекса!|Сариэль называла меня Ориэль, но в последнее время я редко ее вижу... +Gffmmphmm? +Гффммгхмм? +(Oriel smiles)|Ah, it's you again!|It seems like you've found a new toy as well?|I can't understand you, silly~ +(Ориел улыбается)|А, это снова ты!|Похоже, ты нашла себе новую игрушку?|Я не понимаю тебя, глупышка~ +Oriel? As in the goddess of technology? +Ориэль? Тебя зовут как богиню технологий? +'Goddess'? That seems like an outdated term.|Regardless, I am only a vessel, not the facility itself. +'Богиня'? Это кажется устаревшим термином.|В любом случае, я всего лишь сосуд, а не сам комплекс. +Mmmph? +Мммфх? +(Oriel giggles)|Sweetie, I can't understand you. +(Ориэль хихикает)|Милая, я не могу тебя понять. +Can you control the facility? +Ты можешь контролировать комлпекс? +(Oriel frowns)|Adventurers seem to keep asking me that.|In my current state I don't have control over much at all.|But I'm always here to talk! +(Ориэль хмурится)|Авантюристы, как всегда, продолжают спрашивать меня об этом.|В моем нынешнем состоянии я вообще мало что могу контролировать.|Но если хочешь поговорить, я всегда здесь! +Mmmph! +Мммфх! +(Oriel giggles)|Sweetie, I can't understand you. +(Ориэль хихикает)|Милая, я не могу тебя понять. +Can you turn on the elevator? +Ты можешь включить лифт? +I'm sorry, adventurer. I can't do that.|But maybe if you can get rid of all the nearby threats...|They've been under lockdown for a long time.|Just push the button again if it hasn't updated yet. +Прости, авантюристка. Я не могу этого сделать.|Но, может быть, если ты сможешь избавиться от всех угроз поблизости...|Они долгое время были под замком.|Просто нажми на кнопку еще раз, если она еще не обновилась. +Mmmph mmm! (Help me!) +Мммфх ммм! (Помоги мне!) +(Oriel chuckles)|What was that again?|Sorry~ +(Ориэль хихикает)|Что ты там говоришь?|Прости~ +Can you help me out? +Ты можешь мне помочь? +(Oriel giggles)|I can't do anything for you right now~ +(Ориэль хихикает)|Я сейчас ничем не могу тебе помочь~ +Mmmmm... +Ммммм... +(Oriel smiles)|It's always fun to see you like that~ +(Ориэль улыбается)|Всегда весело видеть тебя такой~ +How are you doing? +Как дела? +(Oriel smiles)|Good!|I miss Sariel, though... +(Ориэль улыбается)|Хорошо!|Хотя я скучаю по Сариэль... +### RMNME of CHTRNME the ENMYNME + +The item is TTT, and will get looser as you progress. +Этот предмет TTT, и будет становиться все слабее по мере прогресса. +somewhat tight +немного тугой +rather tight +средне тугой +quite tight +довольно тугой +especially tight +очень тугой +extremely tight +чрезвычайно тугой +incredibly tight +невероятно тугой +somewhat secure +отчасти надежный +secure +надежный +quite secure +довольно надежный +highly secure +очень надежный +extremely secure +чрезвычайно надежный +incredibly secure +невероятно надежный +somewhat thick +слегка затянут +rather thick +средне затянут +quite thick +довольно затянут +highly thick +очень затянут +extremely thick +чрезвычайно затянут +incredibly thick +невероятно затянут +You must first accept the quest before offering at the shrine. +Вы должны сначала принять задание, прежде чем совершать подношение в храме. +Zero Resistance +Нулевое сопротивление +Toggle this to set bondage resist, evasion, and block to 0. While enabled, using the 'wait until interrupted' button will not be interrupted when hit or bound. +Переключите этот параметр, чтобы установить сопротивление сковыванию, уклонение и блок на 0. При включенной функции использование кнопки 'Ждать, пока вас не прервут' не будет прерываться при ударе или связывании. +The RSTRT feels a little looser! +RSTRT чувствуется немного свободнее! +Crystal Armbinder +Кристальный армбиндер +A growth of crystals fusing your arms together. Chaotic energies radiate in all directions, causing you to slowly lose control over your desires. +Нарост кристаллов, сковывающий ваши руки. Хаотические энергии расходятся во все стороны, заставляя вас постепенно терять контроль над своими желаниями. +Crystals are tough but not unbreakable. +Кристаллы прочные, но неразрушимые. +Crystal Ball Gag +Кристальный кляп-шар +A growth of crystals inside your mouth. It emits a strange, pleasurable sensation. +Нарост из кристаллов у вас во рту. Он вызывает странное, но приятное ощущение. +Crystals are tough but not unbreakable. +Кристаллы прочные, но неразрушимые. +Crystal Gag Necklace +Кристальный кляп-ожерелье +An arousing accessory made of solid crystal! +Возбуждающий аксессуар из цельного кристалла! +Simply popping it out of your mouth isn't enough to negate its effects entirely~ +Просто вынуть его изо рта недостаточно, чтобы полностью свести на нет его эффекты~ +The lock is protected by a seal of repentance. To unlock it you must pay 1 spell point. +Замок защищен печатью раскаяния. Чтобы разблокировать его, вы должны заплатить 1 очко заклинания. +The restraint won't budge. +Ограничитель даже не сдвигается. +You perform a ritual to unlock the item! +Вы проводите ритуал, чтобы разблокировать предмет! +The lock is protected by a seal of repentance. To unlock it you must pay AMNT spell points! +Замок защищен печатью раскаяния. Чтобы разблокировать его, вы должны заплатить AMNT очков заклинания. +The restraint won't budge. +Ограничитель даже не сдвигается. +You perform a grand ritual to unlock the item! +Вы проводите великий ритуал, чтобы разблокировать предмет! +Warden's Thigh Chain +Цепочка Надзирательницы (Бедра) +A chain connecting your thigh cuffs together. You can still walk, albeit slower than usual. +Цепочка, соединяющая манжеты на бедрах. Вы все еще можете ходить, хотя и медленнее, чем обычно. +You've stolen something of great value. Now you must give it back. +Вы украли что-то очень ценное. Теперь вы должны вернуть это. +Warden's Ankle Chain +Цепочка Надзирательницы (Лодыжки) +A chain connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. +Цепочка, соединяющая манжеты на щиколотках. Дает вам достаточно пространства для ходьбы, хотя и медленнее, чем обычно. +You've stolen something of great value. Now you must give it back. +Вы украли что-то очень ценное. Теперь вы должны вернуть это. +Warden's Ankle Link +Цепочка Надзирательницы (Лодыжки) +A short chain connecting your ankle cuffs together. You can barely separate your legs with this on. +Короткая цепочка, соединяющая манжеты на щиколотках. С ней вы едва сможете раздвинуть ноги. +An intense, albeit temporary punishment for breaking the rules. +Суровое, хотя и временное наказание за нарушение правил. +Warden's Elbow Chain +Цепочка Надзирательницы (Локти) +A very short chain connecting your elbow cuffs together. It is quite awkward to remove by yourself. +Очень короткая цепочка, соединяющая манжеты на локтях. Её будет очень неудобно снимать самостоятельно. +You've stolen something of great value. Now you must give it back. +Вы украли что-то очень ценное. Теперь вы должны вернуть это. +Warden's Wrist Chain +Цепочка Надзирательницы (Запястья) +A very short chain connecting your wrist cuffs together. +Очень короткая цепочка, соединяющая манжеты на запястьях друг с другом. +An intense, albeit temporary punishment for breaking the rules. +Суровое, хотя и временное наказание за нарушение правил. +ESCP Difficulty: AMNT +(ESCP) Сложность: AMNT +ESCP Power: AMNT +ESCP Сила: AMNT +ESCP Power: AMNT +ESCP Сила: AMNT +ESCP Ability: AMNT +ESCP возможность: AMNT +ESCP Ability: AMNT +ESCP возможность: AMNT +Max ESCP Depth: AMNT% +Макс ESCP глубина: AMNT% +Struggle +Бороться +Remove +Снять +Unlock +Разблокировать +Pick +Взломать +Cut +Разрезать +Your collar channels the vigor of excitement into magical energy! +Ваш ошейник направляет силу возбуждения в магическую энергию! +The collar has already squeezed what it can out of you. Clear your mind first! +Ошейник уже выжал из вас все, что мог. Сначала очистите свой разум! +Force Field Projector +Проектор Силового Поля +The forcefield erupts into a shower of blue sparks! +Проектор Силового Поля взрывается с дождем голубых искр! +The guardian deploys a forcefield! +Страж устанавливает силовое поле! +The guardian deploys a set of forcefields! +Страж устанавливает несколько силовых полей! +Guardian Drone +Дрон-страж +The drone fizzles and falls to the ground! +Дрон издает скрежет и падает на землю! +The drone zaps you with a restraining energy ray! (DamageTaken) +Дрон поражает вас сдерживающим энергетическим лучом! (DamageTaken) +The drone uses a short-ranged electric attack! (DamageTaken) +Дрон использует атаку электрическим током с малой дистанции! (DamageTaken) +The drone attaches to you! (+RestraintAdded) +Дрон прикрепляется к вам! (+RestraintAdded) +Cyber Guardian +Кибер-страж +The cyber warden's suit goes into lockdown, leaving her wiggling helplessly! +Костюм кибер-надзирательницы отключается, оставляя ее беспомощно извиваться на земле! +The cyber warden applies an advanced locking technology! +Кибер-надзирательница применяет передовую технологию блокировки! +The cyber warden grabs you and applies a self-tightening restraint! (+RestraintAdded) +Кибер-надзирательница хватает вас и надевает самозатягивающееся ограничители! (+RestraintAdded) +The cyber warden's touch applies a series of quick electrical shocks! (DamageTaken) +Прикосновение кибер-надзирательницы вызывает серию быстрых ударов электрическим током! (DamageTaken) +The cyber warden's touch applies a series of quick electrical shocks! +Прикосновение кибер-надзирательницы вызывает серию быстрых ударов электрическим током! +Auto Enforcer Guardian +Автоматический блюститель порядка +The enforcer unit releases magic smoke and explodes. +Блюститель испускает магический дым и взрывается. +The enforcer unit fires many cables that squeeze you! (DamageTaken) +Блюститель запускает множество тросов, которые сдавливают ваше тело! (DamageTaken) +The enforcer fires off restraints that wrap around your body and apprehend you! (+RestraintAdded) +Блюститель выстреливает ограничителями, которые прикрепляются к вашему телу, сковывая вас! (+RestraintAdded) +The enforcer releases small drones which lock onto your restraints! (DamageTaken) +Блюститель выпускает маленьких дронов, которые фиксируются на ваших ограничителях! (DamageTaken) +Time to get you into your uniform~ +Пора надеть на тебя униформу~ +You won't be needing any of this. +Тебе больше не понадобится ничего из этого. +There we go, all ready for training! +Вот и всё, готова к тренировке! +Cyber Storage +Кибер-хранилище +An all-purpose metal crate equipped with a polycarbonate blast door and steel reinforcement. +Универсальный металлический контейнер, оснащённый поликарбонатной взрывозащищённой дверью и стальным усилением. +Used throughout the reign of the Old Civilization to store slaves and prisoners. +Использовался во времена правления Древней Цивилизации для хранения рабов и заключённых. +The liquid latex sticks to your skin, forcing an airtight layer! +Жидкий латекс прилипает к вашей коже, создавая воздухонепроницаемый слой! +The latex starts to build up layers, forcing a protective coating... +Латекс начинает наращивать слои, формируя защитное покрытие... +The latex starts adhering to your skin, becoming extremely difficult to remove... +Латекс начинает прилипать к вашей коже, становясь крайне трудным для удаления... +The latex seals you in, rendering escape impossible without alchemical methods. +Латекс запечатывает вас, делая побег невозможным без алхимических методов. +The liquid latex spray slows you down! +Распылитель жидкого латекса замедляет вас! +Latex Sprayer +Латексный распылитель +The turret deactivates after taking too much damage! +Турель деактивируется после получения слишком большого урона! +The turret defends itself with a spray of sticky liquid latex! (DamageTaken) +Турель защищается, распыляя липкий жидкий латекс! (DamageTaken) +Your latex layer adheres to latex, making struggling more difficult! +Ваш латексный слой прилипает к латексу, затрудняя борьбу! +The item sticks to your rubber layer, making it harder to pull off... +Предмет прилипает к вашему резиновому слою, делая его снятие труднее... +The item hugs your layer tightly, adhering firmly! +Предмет плотно облегает ваш слой, крепко прилипая! +Your skin is covered in a layer of latex, making escape from cyber restraints harder! +Ваша кожа покрыта слоем латекса, что затрудняет побег из кибер-ограничений! +Some Exclusions Apply +Есть исключения +Goddess shrines do not remove non-binding restraints such as harnesses and cuffs. +Святилища богинь не снимают не-сковывающие ограничители, такие как сбруи и манжеты. +Melee Specialization +Специализация в ближнем бою +Gain 25% base physical damage, but your spells do 50% less damage. +Получите 25% к базовому физическому урону, но ваши заклинания наносят на 50% меньше урона. +Melee Expert +Эксперт ближнего боя +Gain +20 Accuracy and +10% base physical damage. +Получи +20 к Точности и +10% к базовому физическому урону. +Magic Specialization +Специализация в магии +Gain 25% spell damage, but your attacks are delayed by 1 turn when attacking. +Получите 25% к урону от заклинаний, но ваши атаки имеют задержку в 1 ход при атаке. +Spell Expert +Эксперт заклинаний +Gain -10% miscast chance and +10% spell damage. +Получите -10% к шансу осечки и +10% к урону от заклинаний. +Ranged Specialization +Специализация в дальнем бою +You deal 20% more damage to enemies further than 2 tiles away, but enemies adjacent to you take 60% reduced damage. +Вы наносите на 20% больше урона врагам, находящимся на расстоянии более 2 клеток, но враги, находящиеся рядом с вами, получают на 60% меньше урона. +Ranged Weapon Expert +Эксперт по дальнобойному оружию +Bows, guns, and other projectile weapons do 10% more damage and consume 10% less charge. +Луки, огнестрел и другое оружие со снарядами наносят на 10% больше урона и потребляют на 10% меньше заряда. +After casting a DMG spell: +После применения DMG заклинания: +Gain AMNT% DMG Damage for DRTN turns +Дает AMNT% DMG урона на DRTN ходов +Gain AMNT DMG Resist for DRTN turns +Дает AMNT DMG сопротивления на DRTN ходов +Your elemental damage is increased! +Ваш элементальный урон увеличен! +Your elemental resistance is increased! +Ваше элементальное сопротивление увеличено! +Overgrown +Заросшая +The overgrown monolith contains an ancient blessing. +Заросший монолит содержит древнее благословение. +Choose a stat to increase below. +Выберите параметр, который вы хотите увеличить, ниже. +Confirm Choice +Подтвердите выбор +Distraction +Возбуждение +Stamina +Выносливость +Mana +Мана +Willpower +Сила воли +Increase max distraction by AMNT%. +Увеличить максимальное возбуждение на AMNT%. +DP decays faster and more SP is safe from damage. +DP спадает быстрее, и больше SP защищено от урона. +Increase max stamina by AMNT. +Увеличить максимальную выносливость на AMNT. +Increase max mana by AMNT. +Увеличить максимальную ману на AMNT. +Increase max willpower by AMNT. +Увеличить максимальную силу воли на AMNT. +Gain +AMNT SP regen/turn. +Дает +AMNT SP регенерации/ход. +### AMNT1 -> AMNT2 + +AMNT1 (max) +AMNT1 (макс.) +You found a magical amulet! Choose one of the following to determine its benefits: +Вы нашли магический амулет! Выберите один из следующих вариантов, чтобы определить его бонусы: +Focus: +50% max distraction and faster decay. +5% stamina protected from damage (base: 30%). +Разум:макс.возбуждение +50%, более быстрое затухание.+5% выносливости,защищен. от урона(база:30%). +Stamina: +50 max stamina. +Выносливость: максимальная выносливость +50. +Magic: +50 max mana. +Магия: максимальное количество маны +50. +Willpower: +50 max willpower. +1 stamina regen/turn. +Сила воли: макс. сила воли +50. +A mystical orb stands before you. +Мистическая сфера стоит перед вами. +You break the orb and gain its secrets. +Ты разбиваете сферу и получаете её секреты. +Stun Resistance! +Устойчивость к оглушению! +Negate Rune +Руна отрицания +Removes a rune on the target tile. If cast on self, removes all runes you've created instead. Casting on an enemy rune restores 10 mana instead. +Удаляет руну на выбранной клетке. Если применена на себя, удаляет все созданные вами руны. Применение на вражескую руну восстанавливает 10 маны. +You scribe a negation rune! +Вы чертите руну отрицания! +Target a single rune, or yourself to negate all your runes. +Выбери руну или себя, чтобы удалить все свои руны. +You don't have enough mana +У вас недостаточно маны +The enemy rune is wiped clean. +Вражеская руна стерта. +You pour negation magic into the ground, but nothing happens. +Вы направляете магию отрицания в землю, но ничего не происходит. +All of your runes have been removed. +Все ваши руны удалены. +E-Stimulation +Электростимуляция +Replaces most instances of painful electric shocks with stimulating effects instead. +Заменяет большинство болезненных электрических ударов на стимулирующие эффекты. +The energy bolt hits you and sends stimulating energies through you! +Энергетический заряд попадает в вас, посылая стимулирующую энергию через твоё тело! +You steal a key card. +Вы крадете ключ-карту. +Key Card +Ключ-карта +The keycard's shiny surface reflects the light in a mesmerizing way. +Блестящая поверхность ключ-карты завораживающе отражает свет. +A piece of identification that contains an access code. +Идентификационный предмет, содержащий код доступа. +You can use it to unlock certain doors. +Вы можете использовать её, чтобы открывать определённые двери. +Your keycard blinks red as the facility remotely locks it! +Ваша ключ-карта мигает красным, так как Комплекс дистанционно блокирует её! +Your keycard blinks red as the facility remotely locks it! System Security: 100% +Ваша ключ-карта мигает красным, так как Комплекс дистанционно блокирует её! Безопасность системы: 100% +Unauthorized removal detected. System Security: AMNT% +Обнаружено несанкционированный доступ. Безопасность системы: AMNT% +Security breach. Initiating remote lockout. System Security: AMNT% +Нарушение безопасности. Инициирование удаленной блокировки. Безопасность системы: AMNT% +You pick up a flash bomb. +Вы подобрали световую бомбу. +You pick up a flashbang grenade. +Вы подобрали светошумовую гранату. +Combat +Бой +Actions +Действия +Self +Я +Dialogue +Диалог +Ambient +Окружение +Struggle +Борьба +Items +Предметы +Kills +Убийства +You attack TargetEnemy for DamageDealt total damage. +Вы атакуете TargetEnemy, всего нанося DamageDealt урона. +You attack TargetEnemy for DamageDealt damage / BondageDealt binding. +Вы атакуете TargetEnemy, нанося DamageDealt урона / BondageDealt сковывания. +You attack TargetEnemy but don't do any damage. +Вы атакуете TargetEnemy, но не наносите никакого урона. +ENMY calls for help! +ENMY зовет на помощь! +(Go to The Summit) +(Отправиться на Вершину) +The Summit is a safe area. Items can be left here without fear of losing them. +Вершина - безопасное место. Здесь можно оставлять вещи, не опасаясь их потерять. +Leash +Поводок +Target an NPC to attach a leash. Enemies and unwilling allies must be tied up to 50% first. Target self to release all leashes, or target a leashed NPC to unleash them. +Выберите NPC и возьмите его на поводок. Врагов и нежелающих этого союзников для начала необходимо связать на 50%. Выберите себя, чтобы отпустить все поводки, или NPC на поводке, чтобы отпустить его. +Target an NPC to leash, or self to unleash all. +Выберите NPC для поводка, или себя от отстегивания. +Brat Handler +Укротитель сорванцов +Target an NPC with an equipped leash restraint (via Truss'em'up) to attach a leash. Target self to release all leashes, or target a leashed NPC to unleash them. +Выберите NPC с экипированным ограничителем-поводком (через Связать их!), чтобы взять поводок. Выберите себя, чтобы отпустить все поводки, или NPC на поводке, чтобы отпустить его. +Target an NPC to leash, or self to unleash all. +Выберите NPC для поводка, или себя от отстегивания. +Clip-On Leash +Пристегивающийся поводок +A beloved favorite of pets and trainers alike. +Любимец как домашних животных, так и дрессировщиков. +You ready the leash... +Вы подготовили поводок... +Target an NPC to attach a leash. Enemies and unwilling allies must be tied up to 50% first. Target self to release all leashes, or target a leashed NPC to unleash them. +Выберите NPC и возьмите его на поводок. Врагов и нежелающих этого союзников для начала необходимо связать на 50%. Выберите себя, чтобы отпустить все поводки, или NPC на поводке, чтобы отпустить его. +You pick up a leash. +Вы находите поводок. +You are not in a condition to use a leash on her. +Вы не в том состоянии, чтобы использовать на ней поводк. +She refuses to be leashed unless you tie her up! +Она отказывается быть на поводке, пока вы ее не свяжете! +You attach a leash to ENMY. +Вы берете ENMY на поводок. +You remove your leash from ENMY. +Вы отпускаете ENMY с поводка. +You let go of all leashes. +Вы отпускаете все поводки. +Plastic Explosive +Пластиковая взрывчатка +Has a 60 turn timer, but can be detonated by other explosives. Deals 210 blast damage in a huge radius and leaves behind a huge field of rubble. Enemies hit have their armor reduced by 50 BEFORE taking damage. +Таймер на 60 ходов, но может быть приведена в действие другими взрывами. Наносит 210 единиц урона от взрыва в огромном радиусе и оставляет после себя огромное поле обломков. При ударе противника его броня уменьшается на 50 единиц, прежде чем он получит урон. +It's totally harmless! Probably. +Это абсолютно безвредно! Возможно. +Has a 60 turn timer, but can be detonated by other explosives. Deals 210 blast damage in a huge radius and leaves behind a huge field of rubble. Enemies hit have their armor reduced by 50 BEFORE taking damage. +Таймер на 60 ходов, но может быть приведена в действие другими взрывами. Наносит 210 единиц урона от взрыва в огромном радиусе и оставляет после себя огромное поле обломков. При ударе противника его броня уменьшается на 50 единиц, прежде чем он получит урон. +It's totally harmless! Probably. +Это абсолютно безвредно! Возможно. +You set the clock ticking... +Вы запускаете тикание часов. +Dynamite +Динамит +10 turn fuse with a 25% chance each turn to detonate prematurely. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. +Взрывается через 10 ходов с вероятностью преждевременной детонации в 25% за каждый ход. Наносит 140 единиц урона от взрыва в большом радиусе. При ударе противника его броня уменьшается на 20 единиц, прежде чем он получит урон. +Arguably more dangerous to the user than the target. +Возможно, он более опасен для пользователя, чем для цели. +10 turn fuse with a 25% chance each turn to detonate. Deals 140 blast damage in a large radius. Enemies hit have their armor reduced by 20 BEFORE taking damage. +Взрывается через 10 ходов с вероятностью детонации в 25% за каждый ход. Наносит 140 единиц урона от взрыва в большом радиусе. При ударе противника его броня уменьшается на 20 единиц, прежде чем он получит урон. +Arguably more dangerous to the user than the target. +Возможно, он более опасен для пользователя, чем для цели. +You light the fuse and pray it doesn't blow up in your face. +Вы поджигаете фитиль и молитесь, чтобы он не взорвался у тебя перед носом. +You are holding too many leashes! +Вы держите слишком много поводков! +You feel a corrupting influence... (+AMNT Corruption) +Вы ощущаете воздействие скверны... (+AMNT Скверна) +You feel a restoring influence! (-AMNT Corruption) +Вы ощущаете восстанавливающее воздействие! (-AMNT Скверна) +Sticky latex fuses itself to your skin! (+AMNT LatexIntegration) +Липкий латекс прилипает к вашей коже! (+AMNT Интеграции латекса) +The latex starts to detach from your skin... (-AMNT Latex Integration) +Латекс начинает отделяться от вашей кожи... (-AMNT Интеграции латекса) +While you have an evasion penalty, even clumsy enemies... +Пока у вас есть штраф к уклонению, даже неуклюжие враги... +... will get an accuracy bonus against you in melee range. +... получают против вас бонус к точности в ближнем бою. +You are more likely to succumb to curses. +Вы с большей вероятностью поддадитесь проклятиям. +X Offset +X Смещение +Y Offset +Y Смещение +X Scale +X Масштаб +Y Scale +Y Масштаб +X Pivot +X Поворот +Y Pivot +Y Поворот +Rotation +Вращение +Layer Bonus +Бонусный слой +### NoDynamicArmor (0 or 1) + +### AddPose + +### HideOverridden (0 or 1) + +### NoOverride (0 or 1) + +### Hide Pose (e.g. Xray) + +### Require Pose (e.g. ChestArmor) + +### Hide Prefix (e.g Encase) + +### Hide Suffix (e.g TorsoUpper) + +### Protected + +Load from File +Загрузить из файла +Save to File +Сохранить в файл +Tip: Slime/Latex tiles only affect entities with less than 45 Glue Resist. +Совет: Плитки со слизью/латексом воздействуют только на объекты с сопротивлением Слизи менее 45. +Being drenched in water also prevents slime/latex from sticking to you. +Если вы будете мокрыми, слизь/ атекс также не прилипнет к вам. +Use the interact tool in the bottom right HUD to sleep in a bed. +Используйте инструмент Взаимодействие в правом нижнем углу HUD'а, чтобы спать в кровати. +Clear Vision +Чистое зрение +Blindfolds are much rarer. +Повязки на глаза встречаются гораздо реже. +Free the Boob +Свободу груди +Chastity bras are rarer unless you are wearing nipple toys. +Бюстгальтеры целомудрия встречаются реже, если только вы не носите игрушки для сосков. +Liberate the Boob +Освободим грудь +Chastity bras are much rarer. +Бюстгальтеры целомудрия встречаются гораздо реже. +Find an elevator to the Summit in order to access facilities. +Поднимитесь на Вершину на лифте, чтобы получить доступ к предприятиям. +Visit the Summit to allow additional interactions with this facility. +Посетите Вершину, чтобы получить возможность дополнительного взаимодействия с этим предприятием. +Must visit the Summit or be in a perk shrine to recycle restraints. +Нужно посетить Вершину или святилище перков, чтобы утилизировать ограничители. ++AMNT% Training/Tick ++AMNT% Тренировка/Ход ++AMNT% Opinion/Tick ++AMNT% Мнение/Ход ++AMNT% Productivity ++AMNT% Продуктивность +AMNT/MAXX Prisoners Assigned +AMNT/MAXX Назначено заключенных +AMNT/MAXX Servants Assigned +AMNT/MAXX Назначено слуг +Management +Управление +Assign servants as managers to boost the production of other facilities.|Appointing new management results in a loss of efficiency until the next cycle. +Назначьте слуг управляющими, чтобы увеличить производство на других предприятиях.|Назначение нового руководства приводит к снижению эффективности до следующего цикла. +Bondage Dojo +Бондаж-додзе +Assign servants to perfect the art of walking in heels,wearing tight corsets,|communicating while gagged, and overall flexibility. +Поручите слугам совершенствовать искусство хождения на каблуках, ношения тугих корсетов,|общения с кляпом во рту и общую гибкость. +Rescue Operations +Спасательные операции +Assign servants to train squads of rescue maids, which you can call in times of need. +Поручите слугам обучать отряды горничных-спасательниц, которых вы можете вызвать в случае необходимости. +Alchemy Lab +Лаборатория алхимии +Assign servants to produce potions from base ingredients you acquire in your adventures. +Назначьте слуг готовить зелья из базовых ингредиентов, которые вы приобретете в своих приключениях. +Recycler +Переработчик +Convert low tier restraints into raw materials and output higher quality restraints.|Adding more servants increase the conversion speed. +Перерабатывайте ограничители низкого уровня в сырье и производите ограничители более высокого качества.|Добавление большего количества слуг увеличивает скорость переработки. +Cuddle Lounge +Комната для объятий +Assign prisoners to the lounge in order to improve servant and prisoner opinion. +Закрепите заключенных за комнатой отдыха, чтобы улучшить настроение слуг и заключенных. +Warden +Надзирательница +Appoint a warden to keep prisoners in check and automatically bind using restraints from storage. +Назначьте надзирательницу, которая будет следить за заключенными и автоматически надевать на них ограничители из хранилища. +Recycle Restraints +Переработать ограничители +Recycle One +Переработать одно +Recycle ALL! +Переработать ВСЕ! +Recycle all but one +Перер. все, кроме одного +You recycle a ITM +Вы перерабатываете ITM +You recycle #x ITM +Вы перерабатываете #x ITM +You recycle #x ITM +Вы перерабатываете #x ITM +You disassemble #x ITM into $x PRD +Вы разбираете #x ITM на $x PRD +You disassemble #x ITM into $x PRD +Вы разбираете #x ITM на $x PRD +Disassemble all but one +Разобрать все кроме одного +Disassemble one +Разобрать одно +You're blocking me. +Ты мне мешаешь. +You're in my way! +Ты стоишь у меня на пути! +Miss, you're blocking me... +Мисс, вы мне мешаете... +Step aside~ +Отойди в сторону~ +Path blocked by citizen. +Проход перекрыт гражданином. +*Bumps into you* +*Натыкается на вас* +Cyber Hogtie Tether +Кибер-кабанья вязь +A very strict and tight hogtie, good for subduing unruly captives. +Очень строгая и кабанья вязь, подходит для усмирения непослушных пленников. +It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. +Она поддерживается проектором внутри ваших кибер-манжет. Энергия отталкивает любую силу и, кажется, не ослабевает даже после неоднократных попыток повредить ее. +Cyber Thigh Tether +Кибер-трос (Бедра) +An energy tether connecting your thigh cuffs together. You can still walk, albeit slower than usual. +Энергетический трос, соединяющий ваши набедренные манжеты. Вы все еще можете ходить, хотя и медленнее, чем обычно. +It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. +Она поддерживается проектором внутри ваших кибер-манжет. Энергия отталкивает любую силу и, кажется, не ослабевает даже после неоднократных попыток повредить ее. +Cyber Ankle Tether +Кибер-трос (Лодыжки) +An energy tether connecting your ankle cuffs together. It gives you enough room to walk around, albeit slower than usual. +Энергетический трос, соединяющий манжеты на лодыжках. Дает вам достаточно пространства для ходьбы, хотя и медленнее, чем обычно. +It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. +Она поддерживается проектором внутри ваших кибер-манжет. Энергия отталкивает любую силу и, кажется, не ослабевает даже после неоднократных попыток повредить ее. +Ankle Chain (Short) +Короткий трос (Лодыжки) +A short energy tether connecting your ankle cuffs together. You can barely separate your legs with this on. +Короткий энергетический трос, соединяющий манжеты на лодыжках. С ним вы едва сможете раздвинуть ноги. +It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. +Она поддерживается проектором внутри ваших кибер-манжет. Энергия отталкивает любую силу и, кажется, не ослабевает даже после неоднократных попыток повредить ее. +Cyber Elbow Tether +Кибер-трос (Локти) +A very short energy tether connecting your elbow cuffs together. It is quite awkward to remove by yourself. +Очень короткий энергетический трос, соединяющий ваши манжеты на локтях. Его довольно неудобно снимать самостоятельно. +It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. +Она поддерживается проектором внутри ваших кибер-манжет. Энергия отталкивает любую силу и, кажется, не ослабевает даже после неоднократных попыток повредить ее. +Cyber Wrist Tether +Кибер-трос (Запястья) +A very short energy tether connecting your wrist cuffs together. +Очень короткий энергетический трос, соединяющий ваши манжеты на запястьях вместе. +It is maintained by a projector inside your cyber cuffs. The energy repels any force and doesn't seem to falter even after repeated attempts to damage it. +Она поддерживается проектором внутри ваших кибер-манжет. Энергия отталкивает любую силу и, кажется, не ослабевает даже после неоднократных попыток повредить ее. +Desperate Struggle +Отчаянная борьба +Spend 20 WP to shake around violently. Has a chance to loosen restraints you are wearing, based on existing struggle progress. Spreading the effect over multiple restraints reduces the chance of loosening.|Requires 25% or more WP to activate. +Потратьте 20 WP, чтобы сильно всряхнуть тело. Есть шанс ослабить надетые на вас ограничители, в зависимости от достигнутого прогресса в борьбе. Распространение эффекта на несколько ограничителей снижает вероятность ослабления.|Для активации требуется 25% или более WP. +None of your restraints will budge. +Ни один из ваших ограничителей не поддается. +You thrash around with all your might. +Вы бьетесь изо всех сил. +You don't have the willpower left to struggle... +У тебя не осталось силы воли, чтобы сопротивляться... +### f + +### x + +### L + +### m + +### R + +Owned: AMNT +Наличие: AMNT +Fiber +Волокно +Latex +Латекс +Leather +Кожа +Metal +Металл +Runes +Руны +Stock: +Запас: +Inputs: +Поступление: +You slip off the conveyor! +Вы соскальзываете с конвейера! +The Summit +Вершина +Back to Collection +Вернуться к Коллекции +Edit Restraints +Редактировать ограничители +Editing Restraints +Редактирование ограничителей +Imprison in Furniture +Поместить в устройство +Dropoff Prisoner +Вытащить заключенного +Module (Utility) +Модули (Утилиты) +Leash +Поводок +Module (Punishment) +Модули (Наказания) +~~~ Collar ~~~ +~~~ Ошейник ~~~ +Blindfold / Earplugs +Повязка на глаза / Беруши +Blindfold +Повязка на глаза +Blindfold +Повязка на глаза +Mask/Hood +Маска/Капюшон +Gag / Stuffing +Кляп / Набивка +Gag +Кляп +Flat Gag +Плоский кляп +Muzzle +Намордник +Wrists +Запястья +Bondage +Бондаж +Chest Harness +Упряжь (Грудь) +Encasement +Чехол +Mittens +Варежки +Mittens / Tape +Варежки / Ленты +Gloves / Tape +Перчатки / Ленты +Encasement +Чехол +Piercings +Пирсинг +Weights +Грузики +Vibes +Вибрация +Chastity Bra +Бюст. Целомудрия +Catsuit / Leotard +Кэтсьют / Трико +Harness +Упряжь +Harness +Упряжь +Corset +Корсет +Rear Plug +Передняя пробка +Front Plug +Задняя пробка +Vibrator +Вибратор +Chastity Belt +Пояс целомудрия +Thigh Cuffs +Манжеты (Бедра) +Leg Bondage +Бондаж ног +Legbinder +Легбиндер +Encasement +Чехол +Ankles +Лодыжки +Shins +Голени +Knees +Колени +Encasement +Чехол +Toe Cuffs +Манжеты (Пальцы) +Toe Tie +Вязь (Пальцы) +Heels +Каблуки +Encasement +Чехол +Equipped: +Экипировано: +Click to Add +Нажм. чтоб добавить +Apply +Применить +Raw Material: +Исходный материал: +Free Prisoner +Осободить заключенную +Perk Unlocked: +Разблок. перк: +Latex Solvent +Растворитель латекса +You ready the bottle of Latex Solvent. +У вас наготове бутылка с растворителем для латекса. +A potent acid, capable of dissolving slime and latex. +Сильнодействующая кислота, способная растворять слизь и латекс. +Deal 90 acid damage to target. Adds a 10% debuff to the cut and struggle resistance of latex restraints currently worn. +Наносит цели 90 урона от кислоты. Добавляет 10%-ный дебафф сопротивляемости латексных ограничителей к порезам и борьбе. +Weakened by Latex Solvent (10%) +Ослабляется растворителем для латекса (на 10%) +You spill the solvent on yourself and loosen your latex bonds! +Вы выливаете на себя растворитель и ослабляете свои латексные путы! +You splash the ENMY with latex solvent! +Вы обрызгиваете ENMY латексным растворителем! +Latex Solvent +Растворитель латекса +You can't use solvents on targets other than yourself while bound. +Будучи связанной, вы не можете использовать растворитель на других целях, кроме себя. +Random +Случайно +Choose Palette +Выберите палитру +Use Raw Material +Исп. Исходный материал +Restraint Palette +Палитра ограничителей +Choose Restraint +Выберите ограничитель +Def. Palette: +Обыч. Палитра: +Set All Palette +Устан. палитру на все +Prisoners +Заключенные +Guests +Гости +Assign to +Назначить: +Remove from +Удалить: +Can't assign to +Невозможно назначить: +Remove from party to assign +Удалите из группы для назначения: +Imprison +Посадить в тюрьму +Opinion: +Мнение: +Last Seen on Floor FLR, LOC +Последний раз была замечена на этаже FLR, LOC +Present in current level +Присутствует на текущем уровне +Captured by FCTN +Захвачена FCTN +Captured by enemies +Захвачена врагами +Use 'Truss'em'Up' to edit restraints on this NPC +Используйте 'Связать их', чтобы изменить ограничители этого NPC +The NPC needs tightening, but is unavailable right now +NPC нужно затянуть, но сейчас это невозможно +Tighten non-conjured restraints +Затянуть не-сотворенные ограничители +NPC has escaped! +NPC сбежала! +NPC is likely to escape. +NPC, скорее всего, сбежит. +NPC has managed to loosen her bonds. +NPC удалось ослабить свои путы. +Any +Все +NPC Opinion: +Мнение NPC: +NPC Escape Status: +Статус побега NPC: +NPC Binding: +Сковывание NPC: +NPC Availability: +Пригодность NPC: +Favorited: +Избранное: +Rank: +Ранк: +Minor +Низший +Normal +Обычный +Elite +Элита +Miniboss +Мини-босс +Boss +Босс +Legendary +Легенда +Bound +Скована +Free +Свободна +Secure +Безопасно +At Risk +В зоне риска +Escaped +Сбежала +Imprisoned +Под замком +Positive +Позитивное +Negative +Негативное +Favorite +Избранна +Non-Favorite +Не избранна +Present +Подарок +Unavailable +Недоступна +Auto Bind Interface +Интерфейс авто-сковывания +AutoBind +Авто-сковывание +Assign to Facility +Отправить на производство +Assign to Facility +Отправить на производство +Copy Restraints +Копировать ограничители +Paste Restraints from NME +Вставить ограничения от NME +No restraints left in inventory +В инвентаре не осталось ограничителей +Paste to All! +Вставить ВСЕМ! +OVERWRITE All! +ПЕРЕПИСАТЬ У ВСЕХ! +Need Positive Opinion to Promote +Нужно положительное Мнение для продвижения +Remove From Party Before Promoting? +Удалить из группы перед назначением? +Servant Cuddle Points: AMNT (+OPN opinion/cycle) +Очки Объятия Слуги: AMNT (+OPN мнение/цикл) +Prisoner Cuddle Points: AMNT (+OPN opinion/cycle) +Очки Объятия Заключенной: AMNT (+OPN мнение/цикл) +Submissive prisoners and dominant servants add different amounts of opinion per cycle +Покорные заключенные и доминирующие слуги добавляют разное количество Мнения в каждом цикле +Release Prisoners +Освободить заключенную +Release +Освободить +Summon +Призвать +Already present in summit +Уже на Вершине +NPC is unavailable +NPC недоступен +Only available in the Summit +Доступно только на Вершине +Mark +Пометить +Unmark +Снять метку +Mark ALL +Пометить ВСЕХ +Cancel Selection +Отменить выбор +Release Marked Prisoners! +Освободить помеченных заключенных! +Ransom Marked Prisoners for GP! +Выкупить отмеченных заключенных за GP! +Ransom Value: GP +Стоимость выкупа: GP +Current Gold: GP +Имеется золота: GP +### n/a + +[EXP: AMNT/LMT, +NXT next floor] Heel training reduces balance loss from heels. +[EXP: AMNT/LMT, +NXT следующий этаж] Тренировка на каблуках уменьшает потерю равновесия из-за каблуков. +Phase Dance active. Your next move is instant. +Активен Фазовый танец. Ваш следующий ход мгновенный. +Combat Maneuver active. Your next move is instant. +Активны Боевые Маневры. Ваш следующий ход мгновенный. +The furniture space is occupied +Место в устройте занято +Combat Maneuver: Your next move is instant. +Боевые Маневры: Ваш следующий ход - мгновенный. +Appointing managers increases the efficiency of other facilities. +Назначение управляющих повышает эффективность других производств. +Total Efficiency Boost: AMNT% +Общее повышение эффективности: AMNT% +### idle + +(As you approach the statue, you hear a crumbling sound)|(The stone crumbles along the statue's slender frame)|(...revealing inside a beautiful, and extremely angry catgirl)|Who dares disturb my slumber?|I shall see to it that you receive your punishment! +(Когда вы приближаетесь к статуе, вы слышите звук осыпающегося камня)|(Камень осыпается вдоль стройного каркаса статуи)|(...открывая прекрасную и чрезвычайно сердитую девушку-кошку)|Кто посмел нарушить мой сон?|Я позабочусь о том, чтобы ты понесла наказание! +Mysterious Statue +Таинственная статуя +Select a Binding Slot +Выберите Слот Сковывания +Cost: +Цена: +Zoom set to PCNT% +Масштаб PCNT% +You need free arms to tie others! +Вам нужны свободные руки, чтобы связать других! +You can use the quick inventory to bind yourself or others +Вы можете воспользоваться быстрым инвентарем, чтобы связать себя или других +### Error. Please screenshot and report. + +You can't wear that item, regrettably. +К сожалению, вы не можете носить этот предмет. +Must be stunned 3+ turns or fully bound +Должна быть оглушена 3+ хода или полностью связана +Depends on another item to be added first +Зависит от того, какой другой элемент будет добавлен первым +The conjured RSTN vanishes as you remove it. +Призванное RSTN исчезает, когда вы его снимаете. +No free slots to bind in +Нет свободного слота для сковывания +Reaching Authority +Достижение авторитета +If arm components are unavailable, you can now apply bindings with verbal components only. Increases range of Truss em Up by 2 and all CMD spells by 1 +Если руки недоступны, теперь вы можете накладывать ограничители с помощью слов. Дальность действия 'Связать их' увеличивается на 2, а всех командных заклинаний - на 1 +Save Slot +Сохранить слот +Load Game +Загрузить игру +Load Code +Загрузить из кода +Load Slot 0 +Загрузить слот 0 +Load File +Загрузить файл +Save From Code +Сохранить в код +Delete? +Удалить? +Import to Slot +Импортировать в слот +Invalid Data +Некорректные данные +No Data +Нет данных +This is the normal entrance to the dungeon.|The tutorial is at the beginning of the hall. +Это обычный вход в подземелье.|Обучение находится в начале коридора. +This is the alternate entrance to the ancient tombs.|It's harder than the normal entrance. +Это запасной вход в древние гробницы.|Он сложнее, чем обычный вход. +This part of the dungeon has been altered by the goddess of chaos.|The order of zones you'll go through is totally random. +Эта часть подземелья была изменена богиней хаоса.|Порядок зон, через которые вы будете проходить, совершенно случайный. +Legend has it there is a secret temple within a vast jungle.|Put on your fedora and find some treasure! +Легенда гласит, что в бескрайних джунглях есть тайный храм.|Надень свою фетровую шляпу и найди какое-нибудь сокровище! +You've gotten lost in an ancient doll processing facility.|This journey features mostly lategame tilesets. +Вы заблудились в древнем цехе по подготовке кукол.|В этом путешествии представлены в основном локации поздней игры. +You've gotten lost inside an ancient temple to a kinky goddess.|Will you find your way out, or will you find yourself trapped even deeper? +Вы заблудились в древнем храме извращенной богини.|Найдете ли вы выход или потеряетесь окончательно? +You've gotten yourself lost wandering in the ruins.|The order of tilesets is reversed! +Вы заблудились, блуждая по руинам.|Порядок локаций меняется на противоположный! + (Hard) + (Тяжело) + (Extreme) + (Экстрим) +Choose Save Slot: +Выберите слот сохранения: +Standard Route +Стандартный маршрут +Alternate Route +Альтернативный маршрут +Temple Route +Маршрут храма +Jungle Route +Маршрут джунглей +Factory Route +Маршрут фабрики +Reverse Route +Обратный маршрут +Chaos Route +Хаотический маршрут +Map Seed: +СИД карты: +Will Overwrite NME! +Перезапишет NME! +Play Slot +Играть слот: +Play (NO SLOT!) +Играть (БЕЗ СЛОТА!) +Looks like you might be stuck. Try calling for help (bottom right of UI) +Похоже, вы застряли. Попробуйте позвать на помощь (справа внизу UI) +Backup +Бэкап +Restore +Восстан. +Extra Options +Доп. опции +Preview without Armor +Превью без Брони +Wizard +Маг +### FLR-DGN + +### (NG+AMNT) + +Target must be vulnerable. +Цель должна быть уязвима. +Target must be vulnerable or have casted a verbal spell. +Цель должна быть уязвима или произносить словесное заклинание. +Target must be vulnerable. +Цель должна быть уязвима. +Target must be vulnerable. +Цель должна быть уязвима. +Target must have casted a verbal spell. +Цель должна произносить словесное заклинание. +Diggy diggy hole +Копай, копай дыру +Select a cracked wall. +Выберите потрескавшуюся стену. +You strike the earth! +Вы ударяете о землю. +Must select a cracked wall. +Нужно выбрать потрескавшуюся стену. +Your arms aren't free to swing the axe! +Ваши руки не могут размахнуться топором! +You strike the earth, but it is nothing but solid wall on the other side. +Вы ударяете о землю, но с другой стороны нет ничего, кроме сплошной стены. +You strike the earth! It crumbles before you! +Вы ударяете о землю! Она рушится у вас на глазах! +Click again to automatically mine the wall with your pickaxe. +Нажмите еще раз, чтобы начать автоматически пробивать стену киркой. +The planar focus resonates with the teleportation magic! +Планарный концентратор резонирует с магией телепортации! +The planar focusing crystal activates! Mana is drained, and turns into bindings! +Планарный фокусирующий кристалл активирован! Мана истощается и превращается в оковы! +The planar diffractor blocks the teleportation! +Планарный рассеиватель блокирует телепортацию! +Set Character Palette +Установить палитру персонажа +Reset all Keybindings +Сбросить все привязки клавиш +That item is blocked! You can't remove it. +Этот предмет заперт! Вы не можете его снять. + min. + минимум. + max. + максимум. + bonus + бонус + penalty + штраф +You put it on, why would you want to take it off?~ +Вы сами надели это, так зачем снимать?~ +You'll need an ancient key to unlock the ancient-made collar. +Вам понадобится древний ключ, чтобы отпереть ошейник, изготовленный древними. +Ancient Worshipper +Почитательница древних +The ancient worshipper repents of her ways. +Почитательница древних раскаивается в своих поступках. +The ancient worshipper's crystal restraints spread to you! (+RestraintAdded) +Кристаллические оковы почитательницы древних распространяются и на вас! (+RestraintAdded) +Crystals start to grow on one of your restraints! (DamageTaken) +На одном из ваших ограничителей начинают расти кристаллы! (DamageTaken) +The ancient worshipper mumbles at you for assistance! (DamageTaken) +Почитательница древних бормочет, прося вас о помощи! (DamageTaken) +Ancient Congregant +Прихожанка древних +The ancient congregant repents of her ways. +Прихожанка древних раскаивается в своих поступках. +The ancient congregant's crystal restraints spread to you! (+RestraintAdded) +Кристаллические оковы древней прихожанки распространяются и на вас! (+RestraintAdded) +Crystals start to grow on your restraints! (DamageTaken) +На ваших ограничителях начинают расти кристаллы! (DamageTaken) +The ancient congregant mumbles at you for assistance! (DamageTaken) +Прихожанка древних бормочет, прося вас о помощи! (DamageTaken) +Ancient Hierophant +Иерофант древних +The ancient hierophant repents of her ways. +Иерофант древних раскаивается в своих поступках. +The ancient hierophant's crystal restraints spread to you! (+RestraintAdded) +Кристаллические оковы иерофанта древних распространяются и на вас! (+RestraintAdded) +Crystals start to grow on your restraints! (DamageTaken) +На ваших ограничителях начинают расти кристаллы! (DamageTaken) +The ancient hierophant mumbles at you for assistance! (DamageTaken) +Прихожанка древних бормочет, прося вас о помощи! (DamageTaken) +The crystals break off, revealing a keyhole and weakening the item. +Кристаллы отламываются, открывая замочную скважину и ослабляя предмет. +Your distraction causes the crystals to grow back, encasing the lock again! +Из-за того, что вы возбудились, кристаллы вырастают снова, вновь закрывая замок! +After popping the gag out of your mouth, it hangs loose around your neck. +После того, как вы выплюнули кляп изо рта, он свободно болтается у вас на шее. +The gag is now in your mouth. +Кляп теперь у вас во рту. +ERROR: Restraint does not exist. Did you forget to load mods? +ОШИБКА: Ограничителя не существует. Вы забыли загрузить моды? +Gag Necklace +Кляп-ожерелье +A cute accessory for those who wish to (not) make a statement. +Симпатичный аксессуар для тех, кто хочет (не хочет) заявить о себе. +Functions as a collar. +Работает как ошейник. +No mod info! +Нет информации о моде! +Wrong patch +Неверный патч +VERY Outdated! +ОЧЕНЬ устарел! +Outdated! +ОЧЕНЬ устаревший! +Check dependencies! +Проверьте зависимости! +Check compatibility! +Проверьте совместимость! +Misc Error +Много различных ошибок +### v + +Magical disenchantment suspends your living collar for AMNT turns +Магический рассеиватель зачарований приостанавливает действие вашего живого ошейника на AMNT ходов +(will add AMNT TPE binding) +(добавляет AMNT TPE сковывания) +Hardlight +Тяжелый свет +Magic +Магия +Leather +Кожа +Knocked Out +Сбита с ног +Latex +Латекс +Rope +Веревки +Magic Rope +Магические веревки +Metal +Металл +Slime +Слизь +Tape +Ленты +Vine +Лозы +Ice +Лед +Furniture +Устройства +Wrapping +Бинты +Saving... +Сохранение... +Game Saved +Игра сохранена +ENMY escapes from the ITMN! +ENMY освобождается из ITMN! +ENMY escapes from the ITMN and the item vanishes. +ENMY освобождается из ITMN и предмет исчезает. +ENMY unlocks the ITMN! +ENMY отпирает ITMN! +The conjured ITMN vanishes as it comes off. +Сотворенный ITMN исчезает, когда его снимают. +AMNT restraints added since last tick~ +AMNT ограничителей добавлено с последнего момента~ +AMNT restraints confiscated since last tick~ +AMNT ограничителей конфисковано с последнего момента~ +You have no restraints in storage. Go to the Summit to deposit restraints. +У вас нет ограничителей на складе. Отправляйтесь на Вершину, чтобы отправить ограничители на хранение. +Back to Facilities +Вернуться к производствам +Back to Game +Вернуться к игре +Your Inventory +Ваш инвентарь +Chest +Сундук +Chest +Сундук +Warden's Storage +Хранилище Надзирательницы +Store 1 ITMN +Сдать 1 ITMN +Take 1 ITMN +Взять 1 ITMN +Store 5 ITMN +Сдать 5 ITMN +Take 5 ITMN +Взять 5 ITMN +Store ALL ITMN +Store ВСЕ ITMN +Take ALL ITMN +Взять ВСЕ ITMN +Store ALL-1 ITMN +Сдать ВСЕ-1 ITMN +Take ALL-1 ITMN +Взять ВСЕ-1 ITMN +Take Everything +Взять все +Deposit All +Сдать все +Auto-loot found +Авто-лут нашел: + (not picked up) + (не подбирать) +Automatically Flip When Moving +Автоматически переворачивается при перемещении +Go to the summit to deposit restraints +Поднимитесь на Вершину, чтобы сдать ограничители +AMNTx damage when SP is over 50% +AMNTx урона SP превышает 50% +Barrage of Barrier Orb +Шквал барьерных шаров +Barrier Orb +Барьерный шар +Barrage of Sealing Talisman +Шквал запечатывающих талисманов +Sealing Talisman +Запечатывающий талисман +Self Unlock +Саморазблокировка +Crystal Storm +Кристальный шторм +Shadow Walk +Прогулка в тени +Your ITMN1 inflates inside your mouth to become a ITMN2! +Ваш ITMN1 раздувается у вас во рту, превращаясь в ITMN2! +Bigger Ball Gags +Увеличенный кляп-шар +Smaller ball gags are replaced by their larger versions. +Кляп-шарики меньшего размера заменяются на более крупные. +Screen effect when letting go +Экранный эффект при оргазме +Screen flash when distracted +Вспышки экрана когда возбуждена +Ropestorm +Веревочный шторм +Essentia Aliquam +Эссенция Аликвама +Aliquam Orbis +Аликвама Орбис +Potio Requiem +Реквием по Потио +Ultimate Glue no. 91 +Идеальный клей Н-91 +Slime Encapsulation +Инкапсуляция слизи +Judgement Bolt +Заряд возмездия +Flame Bolt +Заряд пламени +Electrification +Электризация +Charming Orb +Шар Очарования +Freezing Orb +Замораживающий шар +Heavy Ordnance +Тяжелые боеприпасы +Shadow Strike +Удар тенью +Entangle +Запутывание +Blessed Orb +Благословенный шар +Slimy Sphere +Сфера слизи +Rubberization Protocol +Протокол прорезинивания +Latex Encapsulation +Латексная инкапсуляция +Red Slime Experiment +Эксперимент с красной слизью +Encasement Protocol +Протокол упаковки +Encasement Protocol +Протокол упаковки +Electrical Discharge +Электрический разряд +Slime Blast +Взрыв слизи +Icebolt +Ледяная стрела +Water Ball +Водяной шар +Bubble Burst +Взрыв пузыря +Electric Orb +Электрический шар +Chain Bolt +Цепной заряд +Skeleton Minion +Скелет-миньон +Skeleton Minions +Скелеты-миньоны +Flummoxing Orb +Сбивающий с толку шар +Spores +Споры +Crystallize +Кристаллизация +Capture Device +Устройство для захвата +Sedative +Успокоительное +Slime Barrage +Заградительная слизь +Seal of the 5th Era +Печать 5-й эры +Healing Flash +Исцеляющая вспышка +Undead Frenzy +Неистовство нежити +Command Word +Командное слово +Rope Ambush +Веревочная засада +Defensive Charm +Защитный амулет +Shield the Witch +Защита ведьмы +Flashbang +Светошумовая +Tracer Rounds +Трассирующие снаряды +The Spookening +Наводящий ужас +The Muffling +Приглушающий +Conjure Tickle Hands +Создание щекочущих рук +Conjure Gags +Создание кляпов +Scriptum Ferri +Скриптум Ферри +Scrimptum Habena +Скриптум Хабена +Scriptum Ligni +Скриптум Лигни +Electric Storm +Электрический шторм +Icy Breath +Ледяное дыхание +Icy Breath +Ледяное дыхание +Vine Pod +Виноградный стручок +Flower Spores +Цветочные споры +Magnum Opus +Магнум Опус +Latex Integrator +Латексный интегратор +Forcefield Protocol +Протокол силового поля +Motivation +Мотивация +Drone Assault +Атака дронов +Tape Drone Assault +Атака ленточных дронов +*summon slime mold* +*призыв слайма-плесенника* +Vine Growth +Прорастание лоз +Flower Growth +Прорастание цветов +Thorn Whip +Шипастый хлыст +Crystal Surge +Кристальный всплеск +Shadow Shroud +Теневой покров +Shadow Step +Теневой шаг +Shadow Shroud +Теневой покров +Ice Wall +Ледяная стена +Ice Wall +Ледяная стена +Ice Breath +Ледяное дыхание +Armor Up +Усиление брони +Crystal Growth +Рост кристаллов +Shadow Orb +Сфера теней +Armor Up +Усиление брони +Earthfield +Поле земли +Soul Beam +Луч души +Summon Shadows +Призыв теней +Observation +Наблюдение +Conjure Latex Armbinder +Создание латексного армбиденра +Conjure Latex Legbinder +Создание латексного легбиндера +Conjure Latex Gag +Создание латексного кляпа +Conjure Latex Restraint +Создание латексного ограничителя +Rope Sealing +Веревочная печать +Rope Tentacle +Веревочное щупальце +Slime Minion +Слайм-миньон +Magical Wrappings +Магические бинты +Capture Bolt +Фиксирующая стрела +Training Protocol +Тренировочный Протокол +Motivation Protocol +Мотивирующий Протокол +Conjure Tickle Hand +Сотворение щекочущих рук +Conjure Gag +Сотворение кляпа +Conjure Locks +Сотворение замков +Conjure Cuffs +Сотворение манжет +Chainstorm +Цепной шторм +Chain Wall +Цепная стена +Binding Ribbons +Связывающие ленты +Scriptum Limus +Скриптум Лимус +Scriptum Glacis +Скриптум Глацио +Scriptim Vinea +Скриптум Винеа +Scriptum Infernus +Скриптум Инфернус +Scriptum Arcanum +Скриптум Арканум +Scriptum Celeste +Скриптум Целеста +Scriptum Electri +Скриптум Электро +Blessed Rays +Благословенные лучи +Ghostly Pets +Призрачные питомцы +Zombie Pets +Зомби-питомцы +Bondage Blast +Взрыв бондажа +Drone Support +Поддержка дронов +Doll Training +Тренировка кукол +Capture Drone +Дрон-захватчик +Full Capture +Полный захват +Shadow Hands +Теневые руки +Obsidian Orbs +Обсидиановые сферы +Mithril Orbs +Мифриловые сферы +(The Warden perks an eyebrow at the sight of you,|before a wide grin overtakes her face)|Ahhh Fuuka. Chosen by the Goddess?|How does it feel to once again be under a leash? +(Надзирательница приподнимает бровь при виде вас,|после чего ее лицо расплывается в широкой улыбке)|А-а-а, Фуука. Избранная богиней?|Каково это - снова оказаться на привязи? +Fuuka, take her down. +Фуука, уложи её. +(Send Fuuka to fight her) +(Отправить Фууку сражаться с ней) +That is none of your business. Now kneel. +Это не твое дело. А теперь встань на колени. +(Fight without listening.) +(Начать сражение не дослушав.) +Blessed Hex +Благословение колдовства +Hexing Orb +Заколдованная сфера +Hexed Latex Engulf +Заколдованный латексный поглотитель +Hex Binding +Заколдованные оковы +Here you will find various scraps of documents and lore you've recovered throughout your adventures. +Здесь вы найдете различные обрывки документов и исторических справок, которые вы находили во время своих приключений. +Your Journal +Ваш дневник +Cover +Закрыть +I am writing this journal in the off chance that I do not come return from the Agarthan ruins. If you find this, please make an effort to deliver it back to the surface for the good of all the women lured in by its secrets. +Я пишу этот дневник на тот случай, если не вернусь из руин Агарты. Если вы найдете его, пожалуйста, приложите усилия, чтобы вернуть его на поверхность, ради блага всех женщин, которых привлекли здешние тайны. +Catherine Willows' Journal (preface) +Дневник Кэтрин Уиллоус (предисловие) +Willows 0 +Уиллоус 0 +As I scaled the mountain, I came across a massive graveyard above the treeline, a grand memorial to those who died before the Great Work. This graveyard extends into the mouth of the cave, and the guards told me not to deface any of the graves, or else the ghosts will come and get me. It would be easier to follow their instructions if there weren't so much treasure still hidden here! After all, most of us are deep in the red after sailing all this way. +Взбираясь на гору, я наткнулась на огромное кладбище над кромкой деревьев - грандиозный мемориал тем, кто погиб до начала Великого Сотворения. Это кладбище простирается до входа в пещеру, и охранники сказали мне не портить могилы, иначе призраки придут и заберут меня. Было бы проще следовать их указаниям, если бы здесь не было спрятано столько сокровищ! В конце концов, большинство из нас, проплыв весь этот путь, оказались в убытке. +Catherine Willows' Journal (pg. 7) +Дневник Кэтрин Уиллоус (стр. 7) +Willows 7 +Уиллоус 7 +It's hard to imagine I'm in a cave. Everything is so decorated and well-preserved, it's almost as if decades of adventurers never found their way to this island. In the distant future when every last piece of treasure has been hauled out of here, I imagine they'll set this place up as a tourist attraction. +Трудно представить, что я нахожусь в пещере. Все так украшено и хорошо сохранилось, что создается впечатление, будто искатели приключений десятилетиями не попадали на этот остров. В далеком будущем, когда отсюда вывезут все до последнего сокровища, я думаю, это место превратят в туристическую достопримечательность. +Catherine Willows' Journal (pg. 8) +Дневник Кэтрин Уиллоус (стр. 8) +Willows 8 +Уиллоус 8 +I spoke with a few locals while resupplying at the port. Apparently the village up here is far older than the twenty-some years the Adventurer's Guild has been on the island. The locals call the mountain 'Ejahl,' but the consensus is that this is the site of the legendary city Agartha where the Archmagus herself made her discovery.|(The page is dated about fifty years ago) +Я поговорила с несколькими местными жителями, когда пополняла запасы в порту. Очевидно, здешняя деревня намного старше, чем те двадцать с лишним лет, что Гильдия авантюристов провела на острове. Местные жители называют гору 'Эджал', но все сходятся во мнении, что именно здесь находится легендарный город Агарта, где сама Архимаг совершила свое открытие.|(Страница датирована примерно пятидесятилетней давностью) +Catherine Willows' Journal (pg. 14) +Дневник Кэтрин Уиллоус (стр. 14) +Willows 14 +Уиллоус 14 +I made it to a deeper floor today, and was greeted by a skeleton trying to tie me up. Great.|I've looked into the local name for this mountain, 'Ejahl,' and found a footnote in the history books talking about some petty kingdom that laid siege to Agartha. There's no record of them actually winning the siege, though. I've heard there's a massive library somewhere down here, maybe I'll find answers there. +Сегодня я спустилась на более глубокий этаж, и меня встретил скелет, пытавшийся меня связать. Отлично.|Я изучила местное название этой горы, 'Эджал', и нашла в учебниках истории сноску о каком-то маленьком королевстве, которое осадило Агарту. Однако нет никаких записей о том, что они действительно выиграли осаду. Я слышала, что где-то здесь есть огромная библиотека, может быть, я найду там ответы. +Catherine Willows' Journal (pg. 17) +Дневник Кэтрин Уиллоус (стр. 17) +Willows 17 +Уиллоус 17 +There was a warrior in the catacombs today. She appears to have mastered the art of witty comebacks, as I truly could not come up with anything to say that did not further humiliate myself. Fortunately her insults came at her companions' expense, and they allowed me to defeat her in a solitary duel. +Сегодня в катакомбах встретила воина. Похоже, она в совершенстве овладела искусством остроумных замечаний, поскольку я действительно не могу придумать ничего, что не унизило бы меня еще больше. К счастью, ее оскорбления задели и ее товарищей, и они позволили мне победить ее в одиночном поединке. +Catherine Willows' Journal (pg. 20) +Дневник Кэтрин Уиллоус (стр. 20) +Willows 20 +Уиллоус 20 +I almost found myself the recipient of a powerful binding arrow enchanted with force runes. Had I been hit, I would have been knocked back against the walls with my arms pinned by glowing conjured cuffs. Fortunately, this projectile hit a skeleton that was attacking me instead, and I was able to retreat. +В меня чуть не попала мощная связывающая стрела, зачарованная силовыми рунами. Если бы она попала в меня, я была бы отброшена к стене, а мои руки были бы скованы светящимися магическими наручниками. К счастью, этот снаряд попал в скелета, который атаковал меня, и я смогла отступить. +Catherine Willows' Journal (pg. 21) +Дневник Кэтрин Уиллоус (стр. 21) +Willows 21 +Уиллоус 21 +In my travels I encountered a curious tomb filled with the scent of incense and herbs. Strange statues lined the halls on stone pedestals, standing as an intimidating reminder of what happens to those who disturb the locals...|I encountered resistance from the locals, who seemed to regard outsiders as 'cursed' and sought to capture me in an effort to give me a 'blessing.' I highly doubt that anyone has been truly blessed by their efforts, well-intentioned or not. +Во время своих путешествий я наткнулась на любопытную гробницу, наполненную ароматом благовоний и трав. Вдоль стен на каменных пьедесталах выстроились странные статуи, служащие пугающим напоминанием о том, что случается с теми, кто беспокоит местных жителей...|Я столкнулась с сопротивлением местных жителей, которые, казалось, считали чужаков 'проклятыми' и стремились захватить меня в плен, чтобы дать мне 'благословение'. Я сильно сомневаюсь, что кто-то был по-настоящему благословлен их руками, с благими намерениями они это делали или нет. +Catherine Willows' Journal (pg. 24) +Дневник Кэтрин Уиллоус (стр. 24) +Willows 24 +Уиллоус 24 +This 'blessing' of theirs appears to be an old ritual for immortality. I believe these peoples are older than the Great Work, based on the ancient dialect they speak and the outdated script they use.|Whatever the case may be, their method seems inexact and prone to failure, as demonstrated by their near maniacal devotion to 'bless' every adventurer they come across. +Это их 'благословение', по-видимому, является древним ритуалом обретения бессмертия. Я полагаю, что эти народы старше Великого Сотворения, судя по древнему диалекту, на котором они говорят, и устаревшей письменности, которую они используют.|Как бы то ни было, их метод кажется неточным и склонным к провалу, о чем свидетельствует их почти маниакальная преданность 'благословлять' каждого авантюриста, с которым они сталкиваются. +Catherine Willows' Journal (pg. 25) +Дневник Кэтрин Уиллоус (стр. 25) +Willows 25 +Уиллоус 25 +There are two 'castes' in the Bast cult. The first are the 'blessed,' and the second are their watchful guardians. The unintuitive bit is that the 'blessed' are the ones wrapped up and sealed away inside statues, sarcophagi, and anything else the guardians can stick a person into. The free ones wandering around grabbing people? They're the ones who weren't 'blessed' apparently. +В культе Баст есть две 'касты'. Первая - это 'благословенные', а второй - их бдительные стражи. Неочевидно, но 'благословенные' - это те, кого заворачивают и запечатывают внутри статуй, саркофагов и всего остального, куда стражи могут засунуть человека. А свободные, которые бродят вокруг и хватают людей? Это те, кто, по-видимому, не был 'благословлен'. +Catherine Willows' Journal (pg. 26) +Дневник Кэтрин Уиллоус (стр. 26) +Willows 26 +Уиллоус 26 +I've found it! The Archmagus' library! Much to my chagrin, however, the place has been ransacked by witches and a curious group of mages in search of inspiration from ancient fashion choices. +Я нашла её! Библиотека архимага! Однако, к моему большому огорчению, это место было разграблено ведьмами и любопытной группой магов, ищущих вдохновения в тенденциях древней моды. +Catherine Willows' Journal (pg. 30) +Дневник Кэтрин Уиллоус (стр. 30) +Willows 30 +Уиллоус 30 +It appears someone got to the Archmagus' writings before I could. Nonetheless, I will continue my search for Vinlaga's personal study. Perhaps her research materials and drafts might shed some light on my condition. +Похоже, кто-то добрался до трудов архимага раньше меня. Тем не менее я продолжу поиски личного кабинета Винлаги. Возможно, ее материалы и черновики прольют свет на мое состояние. +Catherine Willows' Journal (pg. 31) +Дневник Кэтрин Уиллоус (стр. 31) +Willows 31 +Уиллоус 31 +I have learned of an ancient artifact, called the Mistress' Staff. Its history and owner are hotly debated, with some attributing it to the Archmagus herself, while others say it was developed by the magical warlords that followed. Most all sources agree that its signature feature is the ability to reverse the effects of the Great Work on any person. +Мне стало известно о древнем артефакте, называемом Посохом Госпожи. Его история и владелец вызывают жаркие споры: одни приписывают его самой архимагу, другие утверждают, что он был разработан последующими магическими военачальниками. Большинство источников сходятся во мнении, что его отличительной особенностью является способность обращать вспять эффекты Великого Сотворения на любом существе. +Catherine Willows' Journal (pg. 36) +Дневник Кэтрин Уиллоус (стр. 36) +Willows 33 +Уиллоус 33 +There is a treasure trove of ancient history here that the blasted Dressmakers had no use for. I found a map from the 'Kingdom of Ejahl,' with sketches of many islands including this one. Like most of the warlord states, they failed to make a lasting impact on the architecture of the island, but it appears the island was uninhabited for some time between the fall of Agartha and its resettlement by Ejahl. +Здесь находится сокровищница древней истории, которая не пригодилась проклятым Портнихам. Я нашла карту 'Королевства Эджал' с набросками многих островов, включая этот. Как и большинство государств-военачальников, они не смогли оказать существенного влияния на архитектуру острова, но, похоже, он был необитаем некоторое время между падением Агарты и перезаселением Эджала. +Catherine Willows' Journal (pg. 41) +Дневник Кэтрин Уиллоус (стр. 41) +Willows 41 +Уиллоус 41 +...I must find it.|They are looking for it.|They CANNOT be allowed to have it. +...Я должна найти его.|Они ищут его.|Им НЕЛЬЗЯ позволить его получить. +Catherine Willows' Journal (pg. 47) +Дневник Кэтрин Уиллоус (стр. 47) +Willows 37 +Уиллоус 47 +I saw my reflection in a pool of water today. My hair looked much more silver than I remember it. I hope this isn't a side effect of all the magic I'd used to make it to this point. +Сегодня я увидела свое отражение в луже воды. Мои волосы стали гораздо более серебристыми, чем я их помнила. Надеюсь, это не побочный эффект всей той магии, которую я использовала, чтобы добраться до сюда. +Catherine Willows' Journal (pg. 50) +Дневник Кэтрин Уиллоус (стр. 50) +Willows 50 +Уиллоус 50 +I heard the bandits are looking for the Mistress' Staff. I'm not too worried--they wouldn't know what to do with it. It's that damned witch I'm worried about.|If my astute reader has come this far, you should beware the Silver Witch. She is working with forces that cannot be trusted. +Я слышала, бандиты ищут Посох Госпожи. Я не слишком беспокоюсь - они не знают, что с ним делать. Меня беспокоит эта проклятая ведьма.|Если мой проницательный читатель зашел так далеко, тебе следует остерегаться Серебряной ведьмы. Она работает с силами, которым нельзя доверять. +Catherine Willows' Journal (pg. 51) +Дневник Кэтрин Уиллоус (стр. 51) +Willows 51 +Уиллоус 51 +It seems I am not alone in my search for the Staff. To whom it may concern: the Great Work is a lie, and it will doom us all. If you care for your soul, you need to break the cycle, and for that we need a key: the Mistress' Staff. +Похоже, я не одинока в своих поисках Посоха. Для тех, кого это может касаться: Великое Сотворение - это ложь, и оно обречет нас всех. Если вы заботитесь о своей душе, вам нужно разорвать порочный круг, а для этого нам нужен ключ: Посох Госпожи. +Silver Witch's Notes #10 +Записки Серебряной Ведьмы #10 +Silver 10 +Серебряная 10 +I met an adventurer who managed to erase weeks of golem research in the blink of an eye. This is why we Summoners have to scatter our works far and wide... if only they knew what we are working towards. +Я встретила авантюристку, которой удалось в мгновение ока свести на нет результаты многонедельных исследований голема. Вот почему мы, Призыватели, должны распространять наши работы повсюду... Если бы только они знали, над чем мы работаем. +Silver Witch's Notes #2 +Записки Серебряной Ведьмы #2 +Silver 2 +Серебряная 2 +The dimensional rift is especially active today. I spoke with some of the voices the other night, they offered me immortality in exchange for material wealth. They must have called the wrong universe or something... +Пространственный разлом сегодня особенно активен. Прошлой ночью я разговаривала с какими-то голосами, они предложили мне бессмертие в обмен на материальные блага. Должно быть, они позвонили не в ту вселенную или что-то в этом роде... +Silver Witch's Notes #3 +Записки Серебряной Ведьмы #3 +Silver 3 +Серебряная 3 +My new golem project did not go as expected. I'd expected the primordial one to answer once I'd opened the gate, but there was nothing but a horde of star demons which I quickly dispatched. Could this mean the source of primordial latex is not outside this universe, as I had thought, but inside? I must investigate further. +Мой проект с новым големом пошел не так, как ожидалось. Я ожидала, что изначальный ответит, как только я открою врата, но там не было ничего, кроме орды звездных демонов, с которыми я быстро расправилась. Может ли это означать, что источник первичного латекса находится не за пределами этой вселенной, как я думала, а внутри? Я должна продолжить расследование. +Silver Witch's Notes #18 +Записки Серебряной Ведьмы #18 +Silver 18 +Серебряная 18 +She did it again. Barged in on my work and called me a 'purveyor of evil magics,' whatever that means. Magic isn't evil, it was given to us directly by the gods! At least I hid my new golem in a different study of mine... +Она снова это сделала. Вмешалась в мою работу и назвала меня 'распространителем злой магии', что бы это ни значило. Магия - это не зло, она дана нам непосредственно богами! По крайней мере, я спрятал своего нового голема в другом кабинете... +Silver Witch's Notes #15 +Записки Серебряной Ведьмы #15 +Silver 15 +Серебряная 15 +Throughout my studies I have chased after the existence of a being I call 'the Primordial One.' My theories stem from the following observations:|1)Slimes were not present in ancient history, and appeared during my lifetime as a force of nature.|2)Slime can be transmuted into almost any known material, like a Prima Materia of sorts.|3) A fragment of Sariel's notes, one of my most guarded possessions, discusses the existence of slimes long before they were first observed in the world.|Based on this, I believe the world must have been created through the influence of some primordial being who then left, but must be returning somehow.|I'm sure this being holds the key to repairing our bodies. +На протяжении всей своей учебы я пыталась доказать существование существа, которое я называю 'Изначальным'. Мои теории основаны на следующих наблюдениях:|1) Слизи не существовали в древней истории и появились при моей жизни как сила природы.|2) Слизь может быть преобразована практически в любой известный материал, это своего рода первичная материя.|3) Во фрагменте заметок Сариэль, одном из моих самых ценных сокровищ, рассказывается о существовании слаймов задолго до того, как они впервые появились в мире.|Основываясь на этом, Я верю, что мир, должно быть, был создан под влиянием некоего изначального существа, которое затем покинуло его, но, должно быть, каким-то образом возвращается.|Я уверена, что это существо владеет ключом к починке наших тел. +Silver Witch's Notes on the Primordial One +Заметки Серебряной ведьмы о Изначальных +Silver 4 +Серебряная 4 +Blast. An adventurer stole one of my notebooks, and now I'm encountering various cultists and weirdos trying to summon the Primordial One themselves. This is why I never bother to publish my works... +Блин. Какая-то авантюристка украла одну из моих записных книжек, и теперь я сталкиваюсь с различными сектантами и чудаками, которые сами пытаются вызвать Изначального. Вот почему я никогда не публикую свои работы... +Silver Witch's Notes #7 +Записки Серебряной Ведьмы #7 +Silver 7 +Серебряная 7 +I haven't heard of that adventurer in decades. Perhaps her nosiness finally caught up to her? +Я не слышала об этой авантюристке уже несколько десятилетий. Возможно, ее любопытство наконец-то взяло свое? +Silver Witch's Notes #106 +Записки Серебряной Ведьмы #106 +Silver 106 +Серебряная 106 +There is a new presence in the mountain. An opportunist that calls herself 'the Dollmaker.' Claims to be the lost heir to the Kingdom of Ejahl. Please~.|I've seen those hackjobs and reprogrammed wrecks. If there even was a Kingdom of Ejahl, surely their army would consist of more than just scrapped combat drones? +В горах появился новичок. Авантюристка, называющая себя Кукольницей. Утверждает, что она потерянная наследница Королевства Эджал. Как ей будет угодно~|Я видела эти халтурные работы и перепрограммированные останки. Если бы даже существовало Королевство Эджал, наверняка их армия состояла бы не только из списанных боевых дронов? +Silver Witch's Notes #117 +Записки Серебряной Ведьмы #117 +Silver 117 +Серебряная 117 +The Kingdom of Ejahl appeared in Agartha 170 years after the death of Sariel Vinlaga. It had three* rulers who vied for the throne at different times:|Diana, Princess of Machinery|Emer, the Warsage|And the Dollmaker, High General of the Kingdom||*Some manuscripts read 'two' +Королевство Эджал появилось в Агарте через 170 лет после смерти Сариэль Винлаги. В нем было три* правителя, которые в разное время соперничали за трон:|Диана, принцесса Машинерии|Эмери, Военный мудрец|И Кукольница, верховный генерал Королевства||*В некоторых рукописях написано 'двое' +The Chronicles of Ejahl +Хроники Эджал +Ejahl 1 +Эджал 1 +The Kingdom of Ejahl ruled the island of Agartha for 30 years before its collapse. During the last war, an unknown figure captured the majority of its army and the majority of the population fled by boat. No one was left on the island. +Королевство Эджал управляло островом Агарта в течение 30 лет, прежде чем распалось. Во время последней войны неизвестный захватил в плен большую часть его армии, а большая часть населения бежала на лодках. На острове никого не осталось. +The Fall of Ejahl +Падение Эджал +Ejahl 2 +Эджал 2 +Danger Level: Nearly Harmless|A reanimated corpse from before the Great Work. I can't tell if the original soul still inhabits the body, since it can barely speak let alone explain its identity.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Почти безвредна|Оживший труп времен до Великого Сотворения. Я не могу сказать, обитает ли в теле изначальная душа, поскольку она едва может говорить, не говоря уже о том, чтобы объяснить, кто она такая.||-Обитатели подземелий от Кэтрин Уиллоус +Zombie +Зомби +Zombie +Зомби +Danger Level: Normal|These zombies are more motivated than the others. Their behavior is similar to that of vengeful spirits I've encountered in the depths.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Обычный|Эти зомби более мотивированы, чем остальные. Их поведение похоже на поведение мстительных духов, с которыми я сталкивалась в глубинах.||-Обитатели подземелий от Кэтрин Уиллоус +Angry Zombie +Злой зомби +Fast Z. +Быстрый З. +Danger Level: Normal|A zombie that can use magic. It doesn't look like any magic I've seen outside the ruins, which makes me think that it was taught to use magic. Some of them have tattoos associated with magic in the old times. Since magic comes from the soul, I assume there is some hint of the original soul still present.|-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Обычный|Зомби, который может использовать магию. Это не похоже ни на одну магию, которую я видела за пределами руин, что заставляет меня думать, что их научили этой магии. У некоторых из них есть татуировки, связанные с магией старых времен. Поскольку магия исходит из души, я предполагаю, что в ней все еще присутствует какой-то намек на изначальную душу.|-Обитатели подземелий от Кэтрин Уиллоус +Mage Zombie +Зомби-маг +Mage Z. +Маг З. +Danger Level: High|A zombie with impeccable sword technique. I've never seen an undead handle a sword so smoothly. Probably buried with their weapons and gear, since most of it is aged. Even their binding techniques resemble those in the textbooks rather than modern ropework.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Высокий|Зомби с безупречной техникой владения мечом. Я никогда не видела, чтобы нежить так ловко управлялась с мечом. Вероятно, её похоронили вместе с оружием и снаряжением, поскольку большая часть из него устарела. Даже их техника связывания напоминает скорее ту, что описана в учебниках, чем современную работу с веревками.||-Обитатели подземелий от Кэтрин Уиллоус +Warrior Zombie +Зомби-воин +Warrior Z. +Воин З. +Danger Level: High|A zombie that uses sealing charms and healing magic. Irony aside, I've seen these with rope marks and gag strap marks on their skin and face. It seems like someone is playing with them. Who could that be?||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Высокий|Зомби, использующий запечатывающие чары и магию исцеления. Если отбросить иронию, я видела таких со следами веревки и кляпа на коже и лице. Кажется, что с ними кто-то играет. Кто бы это мог быть?||-Обитатели подземелий от Кэтрин Уиллоус +Talisman Zombie +Зомби владыка талисманов +Talisman Z. +Талисман З. +Danger Level: Annoying|A playful spirit residing in the dungeon, taking advantage of any adventurers they come across. They can pass through walls, and most physical weapons go right through them. Using a magical weapon seems to banish them for some time, at least.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Назойливый|Игривый дух, обитающий в подземелье и использующий в своих интересах любых авантюристов, с которыми сталкивается. Они могут проходить сквозь стены, а большинство видов физического оружия проходят сквозь них. Использование магического оружия, по-видимому, изгоняет их, по крайней мере, на некоторое время.||-Обитатели подземелий от Кэтрин Уиллоус +Ghost +Призрак +Ghost +Призрак +Danger Level: Very Annoying|It is said that ghosts are the spirits of pre-Great Work humans whose souls are bound to this world by unfinished dreams and ambitions. But I don't believe a word of that. These little guys care about nothing except humiliating people. Ask me how I know.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Очень раздражающий|Говорят, что призраки - это духи людей до Великого Сотворения, чьи души привязаны к этому миру из-за незавершенных мечтаний и амбиций. Но я не верю ни единому слову из этого. Этих малышек не волнует ничего, кроме унижения людей. Спроси меня, откуда я знаю.||-Обитатели подземелий от Кэтрин Уиллоус +Poltergeist +Полтергейст +Poltergeist +Полтергейст +Danger Level: Medium|A very playful ghost with a penchant for teasing. It even carries spectral restraints of its own for use in 'games,' which tend to consist of tickling tied up girls.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Средний|Очень игривый призрак, склонный к поддразниваниям. Он даже имеет собственные призрачные ограничители для использования в 'играх', которые, как правило, заключаются в щекотании связанных девушек.||-Обитатели подземелий от Кэтрин Уиллоус +Tickle Terror +Щекочущий Ужас +Tickle Terror +Щекочущий Ужас +Danger Level: Low|The feelings of a person who desired wealth in life. While it is unable to claim any physical wealth for itself, it nonetheless will rummage through your pockets and possessions if it gets a chance.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Низкий|Чувства человека, который стремился к богатству при жизни. Хотя он не может претендовать на какое-либо материальное богатство для себя, он, тем не менее, будет рыться в ваших карманах и вещах, если представится такая возможность.||-Обитатели подземелий от Кэтрин Уиллоус +Greedy Ghast +Жадный вурдалак +Greedy Ghast +Жадный вурдалак +Danger Level: High|A constricting mass of negative thoughts. According to local myths, the other ghosts attempt to cheer this one up by hugging it, but its wails end up attracting them to your position. Be prepared to take it down lest you find yourself a plaything for the beyond.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Высокий|Скопление негативных мыслей. Согласно местным мифам, другие призраки пытаются подбодрить этого призрака, обнимая его, но его вопли в конечном итоге привлекают их к вам. Будьте готовы снять его, чтобы не оказаться игрушкой потусторонних существ.||-Обитатели подземелий от Кэтрин Уиллоус +Hug Horror +Обнимающий Ужас +Hug Horror +Обнимающий Ужас +Danger Level: High|While most wizards spend literal centuries mastering the art of magic, there are those lacking the patience or discipline to study magic the old fashioned way. Driven by a need for power, these individuals make contracts with otherworldly beings and become Witches.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Высокий|В то время как большинство волшебников тратят буквально столетия на овладение искусством магии, есть те, кому не хватает терпения или дисциплины, чтобы изучать магию по старинке. Движимые жаждой власти, эти люди заключают контракты с потусторонними существами и становятся ведьмами.||-Обитатели подземелий от Кэтрин Уиллоус +The Witches' Coven +Ковен ведьм +Witches +Ведьмы +Danger Level: Extreme|A witch gifted in the arts of conjuration. Backed by an army of animated spectral hands and devious tomes, this variety of witch is extremely dangerous. Her close range attacks are slow and unwieldy, but take care not to get surrounded.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Экстремальный|Ведьма, одаренная искусством сотворения. При поддержке армии анимированных призрачных рук и хитроумных фолиантов, эта разновидность ведьм чрезвычайно опасна. Ее атаки с близкого расстояния медленны и громоздки, но будьте осторожны, чтобы не попасть в окружение.||-Обитатели подземелий от Кэтрин Уиллоус +Master Conjurer +Опытная созидательница +Conjurer +Созидатель +Danger Level: High|They appear to be influential figures in the ancient Bast cult. Not only are they able to wield explosive magics, they can conjure magical wrappings at close range.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Высокий|Они, по-видимому, являются влиятельными фигурами в древнем культе Баст. Они не только владеют взрывной магией, но и могут создавать магические бинты на близком расстоянии.||-Обитатели подземелий от Кэтрин Уиллоус +Bast Mummy +Мумия Баст +Mummy +Мумия +Danger Level: Medium|Worshippers of the Cat Goddess. Devoted to the sole task of defending the tombs from outsiders, they are rarely willing to negotiate. Some maintain peak physical prowess, while others can even cast spells.||-Denizens of the Dungeon by Catherine Willows +Уровень опасности: Средний|Почитатели Богини Кошек. Посвятив себя защите гробниц от чужаков, они редко идут на переговоры. Некоторые из них обладают высочайшей физической силой, в то время как другие могут даже творить заклинания.||-Обитатели подземелий от Кэтрин Уиллоус +Bast Clerics +Жрицы Баст +Mummy +Мумия +Breastplate +Нагрудник +Rock-solid and form-fitting. +Прочный и облегающий. +Provides minor protection against enemy attacks. Decreases stealth. +Обеспечивает незначительную защиту от вражеских атак. Снижает скрытность. +Breastplate +Нагрудник +Rock-solid and form-fitting. +Прочный и облегающий. +Provides minor protection against enemy attacks. Decreases stealth. +Обеспечивает незначительную защиту от вражеских атак. Снижает скрытность. +Adventuring Corset +Корсет авантюристки +Protects your organs and your sense of style. +Защищает ваши органы и ваше чувство стиля. +Provides minor protection against enemy attacks at the cost of flexibility. +Обеспечивает незначительную защиту от вражеских атак за счет гибкости. +Adventuring Corset +Корсет авантюристки +Protects your organs and your sense of style. +Защищает ваши органы и ваше чувство стиля. +Provides minor protection against enemy attacks at the cost of flexibility. +Обеспечивает незначительную защиту от вражеских атак за счет гибкости. +Swimsuit +Купальник +The best uniform. Has a (lockable) zipper in the back for convenience! +Лучшая униформа. Для удобства сзади застегивается на (запирающуюся) молнию! +Removes excess clothing and adds +10 Evasion. +20 Soap and Glue resist, and being drenched dries faster. +Снимает лишнюю одежду и дает +10 к уклонению. Устойчивость к Смывающему урону и Слизи увеличивается на +20, а будучи промокшим высыхает быстрее. +Swimsuit +Купальник +The best uniform. Has a (lockable) zipper in the back for convenience! +Лучшая униформа. Для удобства сзади застегивается на (запирающуюся) молнию! +Removes excess clothing and adds +10 Evasion. +20 Soap and Glue resist, and being drenched dries faster. +Снимает лишнюю одежду и дает +10 к уклонению. Устойчивость к Смывающему урону и Слизи увеличивается на +20, а будучи промокшим высыхает быстрее. +Robe of Chastity +Мантия целомудрия +A magical leotard whose power stems directly from the divine. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. +Магическое трико, сила которого исходит непосредственно от божественного. Изготовлено из ткани, которая преобразует глубинные энергии владельца в мощные энергии, пока поверх него не надето никакой одежды. +It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire. +Говорят, что тот, кто следует целомудренным принципам Паладинов, получает затухание Желания на -1%/40 ходов и ауру, наносящую 2 (+3% к отсутствующих DP) урона от света за ход. Действует только на врагов в зоне ближнего боя. Кроме того, магически проводящая ткань обладает стимулирующим действием, в результате чего на 50% увеличивается получаемое возбуждение от всех источников, а 8% потраченной маны преобразуется в Желание. +Robe of Chastity +Мантия целомудрия +A magical leotard whose power stems directly from the divine. Made from a weave that channel's the wearer's deeper energies into powerful energies as long as no clothes are worn over it. +Магическое трико, сила которого исходит непосредственно от божественного. Изготовлено из ткани, которая преобразует глубинные энергии владельца в мощные энергии, пока поверх него не надето никакой одежды. +It is said that whomever follows the chaste principles of the Paladins shall receive -1% Desire decay/ 40 turns and 2 (+3% missing DP) Holy damage/turn aura. Affects only enemies who enter melee range. In addition, the magically conductive fabric is quite stimulating, resulting in 50% increased distraction gain from all sources, and 8% of mana spent converted into Desire. +Говорят, что тот, кто следует целомудренным принципам Паладинов, получает затухание Желания на -1%/40 ходов и ауру, наносящую 2 (+3% к отсутствующих DP) урона от света за ход. Действует только на врагов в зоне ближнего боя. Кроме того, магически проводящая ткань обладает стимулирующим действием, в результате чего на 50% увеличивается получаемое возбуждение от всех источников, а 8% потраченной маны преобразуется в Желание. +Chainmail Tank Top +Кольчужная безрукавка +Cumbersome, but effective! +Громоздкая, но эффективная! +Provides +10 armor and protection against enemy attacks. Decreases stealth/evasion and makes struggling harder. +Дает +10 к броне и защищает от вражеских атак. Уменьшает скрытность / уклонение и усложняет борьбу. +Chainmail Tank Top +Кольчужная безрукавка +Cumbersome, but effective! +Громоздкая, но эффективная! +Provides +10 armor and protection against enemy attacks. Decreases stealth/evasion and makes struggling harder. +Дает +10 к броне и защищает от вражеских атак. Уменьшает скрытность / уклонение и усложняет борьбу. +Chainmail Bikini +Кольчужное бикини +Covers the important bits, anyway. +Во всяком случае, скрывает важные места. ++20 Bondage Resist. Conducts electricity. +Сопротивление сковыванию +20. Проводит электричество. +Chainmail Bikini +Кольчужное бикини +Covers the important bits, anyway. +Во всяком случае, скрывает важные места. ++20 Bondage Resist. Conducts electricity. +Сопротивление сковыванию +20. Проводит электричество. +Light Plate Armor +Легкая пластинчатая броня +Knight in shining rest-err, armor! +Рыцарь в сияющих оков-э-э-э, доспехах! +Provides +5 armor and high protection. No impact to stealth or evasion +Дает +5 к броне и высокую степень защиты. Не влияет на скрытность или уклонение +Light Plate Armor +Легкая пластинчатая броня +Knight in shining rest-err, armor! +Рыцарь в сияющих оков-э-э-э, доспехах! +Provides +5 armor and high protection. No impact to stealth or evasion +Дает +5 к броне и высокую степень защиты. Не влияет на скрытность или уклонение +Wizard's Robe +Мантия волшебника +I have the power! +У меня есть сила! ++30% spell damage and +10 spell ward ++30% урона заклинаний и +10 защиты от заклинаний +Wizard's Robe +Мантия волшебника +I have the power! +У меня есть сила! ++30% spell damage and +10 spell ward ++30% урона заклинаний и +10 защиты от заклинаний +Chain Skirt +Кольчужная юбка +A defensive garment providing optimal coverage to the lower torso. +Защитная одежда, обеспечивающая оптимальное прикрытие нижней части туловища. +Provides medium protection. No impact to stealth or evasion +Обеспечивает среднюю защиту. Не влияет на скрытность или уклонение +Chain Skirt +Кольчужная юбка +A defensive garment providing optimal coverage to the lower torso. +Защитная одежда, обеспечивающая оптимальное прикрытие нижней части туловища. +Provides medium protection. No impact to stealth or evasion +Обеспечивает среднюю защиту. Не влияет на скрытность или уклонение +Armored Skirt +Бронированная юбка +Knight in shining rest-err, armor! +Рыцарь в сияющих оков-э-э-э, доспехах! +Provides +5 armor and high protection. No impact to stealth or evasion +Дает +5 к броне и высокую степень защиты. Не влияет на скрытность или уклонение +Armored Skirt +Бронированная юбка +Knight in shining rest-err, armor! +Рыцарь в сияющих оков-э-э-э, доспехах! +Provides +5 armor and high protection. No impact to stealth or evasion +Дает +5 к броне и высокую степень защиты. Не влияет на скрытность или уклонение +Gauntlets +Латные перчатки +Gloves with an iron grip. +Перчатки с железной хваткой. +Provides +5 armor and minor protection against enemy attacks. Makes noise when attacking. +Дают +5 к броне и незначительную защиту от вражеских атак. При атаке издает шум. +Gauntlets +Латные перчатки +Gloves with an iron grip. +Перчатки с железной хваткой. +Provides +5 armor and minor protection against enemy attacks. Makes noise when attacking. +Дают +5 к броне и незначительную защиту от вражеских атак. При атаке издает шум. +Leather Gloves +Кожаные перчатки +Protecting you in style. +Стильно защищает вас. +Provides minor protection against enemy attacks. +Обеспечивает незначительную защиту от вражеских атак. +Leather Gloves +Кожаные перчатки +Protecting you in style. +Стильно защищает вас. +Provides minor protection against enemy attacks. +Обеспечивает незначительную защиту от вражеских атак. +Steel Pauldrons +Стальные наплечники +Dependable protection for the average adventurer. +Надежная защита для среднего искателя приключений. +Provides minor protection against enemy attacks. +Обеспечивает незначительную защиту от вражеских атак. +Steel Pauldrons +Стальные наплечники +Dependable protection for the average adventurer. +Надежная защита для среднего искателя приключений. +Provides minor protection against enemy attacks. +Обеспечивает незначительную защиту от вражеских атак. +Ranger's Cape +Плащ рейнджера +Inbued with the powers of moss and ferns and stuff. +Наделен свойствами мха, папоротников и прочего. ++25 Evasion. Increases stealth slightly. +Уклонение +25%. Немного увеличивает скрытность. +Ranger's Cape +Плащ рейнджера +Inbued with the powers of moss and ferns and stuff. +Наделен свойствами мха, папоротников и прочего. ++25 Evasion. Increases stealth slightly. +Уклонение +25%. Немного увеличивает скрытность. +Oracle's Armbands +Нарукавник Оракула +Armbands made of a slightly magical material. +Нарукавник сделан из материала, обладающего слабой магической силой. ++5% spell damage. +5 Magic Armor. ++5% урон от заклинаний. +5 магической защиты. +Oracle's Armbands +Нарукавник Оракула +Armbands made of a slightly magical material. +Нарукавник сделан из материала, обладающего слабой магической силой. ++5% spell damage. +5 Magic Armor. ++5% урон от заклинаний. +5 магической защиты. +Armored Boots +Бронированные ботинки +Noisy, but fashionable! +Шумно, но модно! +Provides +5 armor and protection against enemy attacks. Decreases stealth. +Дает +5 к броне и защиту от вражеских атак. Снижает скрытность. +Armored Boots +Бронированные ботинки +Noisy, but fashionable! +Шумно, но модно! +Provides +5 armor and protection against enemy attacks. Decreases stealth. +Дает +5 к броне и защиту от вражеских атак. Снижает скрытность. +Hide Boots +Сыромятные сапоги +For stepping into all kinds of trouble! +Чтобы вляпываться во всевозможные неприятности! +Provides minor protection against enemy attacks. +Обеспечивает небольшую защиту от вражеских атак. +Hide Boots +Сыромятные сапоги +For stepping into all kinds of trouble! +Чтобы вляпываться во всевозможные неприятности! +Provides minor protection against enemy attacks. +Обеспечивает небольшую защиту от вражеских атак. +Generating Map... +Генерация карты... +Mystic wrappings constrict around your body! +Мистические бинты обвиваются вокруг вашего тела! +One Bar Missile +Палка-снаряд +You'll need a sharp object to cut items. Look for a knife or a piece of scrap on the floor. +Вам понадобится острый объект, чтобы резать предмет. Поищите на полу нож или какой-нибудь хлам. +If you can't get your knife into place, try sitting next to a crack on the wall. +Если у вас не получается достать ножом до места, попробуйте присесть рядом с трещиной в стене. +Your character will automatically try to lodge the knife into the wall. +Ваш персонаж автоматически попытается воткнуть нож в стену. +You'll need to find a cutting weapon with the magic tag to cut magic items. +Вам нужно будет найти режущее оружие с магическим тэгом, чтобы разрезать магические предметы. +You need to equip your magic cutting weapon to cut magic items. +Вам нужно экипировать свое магическое режущее оружие, чтобы разрезать магические предметы. +You can surrender in the menu if you want to be treated more gently. +Вы можете сдаться в меню, если хотите, чтобы с вами обращались помягче. +That ghost looks less aggressive than the others. Maybe she can help? +Этот призрак выглядит менее агрессивной, чем остальные. Может быть, она сможет помочь? +Need help? Try asking a neutral NPC for assistance! +Нужна помощь? Попробуйте обратиться за помощью к нейтральному NPC! +You flanked the enemy! Now attack its weak point for massive damage! +Вы обошли врага с фланга! Теперь атакуйте по его слабому месту, чтобы нанести огромный урон! +Enemies that miss an attack become vulnerable for a turn. +Враги, пропустившие атаку, становятся уязвимыми на один ход. +Attack them for a guaranteed critical hit! +Атакуйте их, чтобы получить гарантированный критический удар! +before the attack lands! You can tell the difference by the border of the tiles. +прежде чем начнется атака! Вы можете определить её по границам плиток. +Enemy attacks take time to hit. Make sure to step out of the warning tiles, +Для попадания вражеских атак требуется время. Не забудьте отойти от предупреждающих плиток, +You can dodge out of the way of most projectiles. Avoid the marked tiles. +Вы можете уклоняться от большинства снарядов. Избегайте отмеченных плиток. +'Charge' is a unified ammunition for all of your weapons. Recharge it with ancient crystals. +'Заряд' - это единый боезапас для всего вашего оружия. Восстанавливайте его с помощью древних кристаллов. +Spent crystals can slot into some light fixtures to recharge them, but it requires 100 gold. +Использованные кристаллы можно вставить в некоторые светильники, чтобы перезарядить их, но для этого потребуется 100 золотых. +There is an elevator in this room, but it won't function until you defeat major enemies on this level. +В этой комнате есть лифт, но он не будет работать, пока вы не победите крупных врагов на этом уровне. +If you can't escape from a restraint, try offering gold at a shrine devoted to its goddess. +Если вы не можете вырваться из ограничителей, попробуйте предложить золото в святилище, посвященном их богине. +Defeating enemies recovers some willpower. +Победа над врагами восстанавливает немного силы воли. +Temporary enemies and summons don't restore anything, however. +Однако временные враги и суммоны ничего не восстанавливают. +Attacking a helpless enemy captures her and sends her to your Collection. +Атакуя беспомощного врага, захватите его в плен и отправьте в свою Коллекцию. +You can access the Collection in the Items screen, 2nd tab. +Вы можете получить доступ к коллекции на экране 'Предметы', 2-я вкладка. +Conjure Essence Mote +Сотворение частицы сущности +Spend 50 DP to conjure a mote of pure spell essence. The mana cost of this spell is decreased based on your maximum DP.|Can only be cast while you have less than 100% DP. +Потратьте 50 DP, чтобы сотворить частицу чистой сущности заклинаний. Затраты маны на это заклинание уменьшаются в зависимости от вашего максимального DP.|Можно использовать, только если у вас меньше 100% DP. +You channel your distraction into a tangible orb! +Вы превращаете свое возбуждение в видимую глазу сферу! +You don't have enough distraction! +Вам не хватает возбуждения! +Choose an open space. +Выберите открытое пространство. +Choose a tile with no existing mote. +Выберите плитку, на которой нет существующей частицы. +You're too distracted to concentrate your distraction! +Вы слишком возбуждены, чтобы сосредоточиться на возбуждении! +The burst of desire overwhelms you! +Вспышка желания переполняет вас! +Psychic Link +Психическая связь +Deals 20 Psychic damage, then creates a psychic link between you and a single target for 50 turns, splitting distraction gain between the two of you. Requires that you and the target be able to see each other. +Наносит 20 единиц психического урона, а затем создает психическую связь между вами и одной целью на 50 ходов, распределяя между вами получаемое Возбуждение. Требуется, чтобы вы и цель могли видеть друг друга. +Target a non-blinded enemy. +Выберите не-слепого врага. +You briefly lock eyes with the target, forming a psychic link! +Вы ненадолго смотрите в глаза цели, устанавливая психическую связь! +The psychic link ends between you and the ENMY. +Психическая связь между вами и ENMY разрывается. +Shock Collar +Шокирующий ошейник +Condense your aroused thoughts into stimulating electricity, consuming 30 DP to zap anyone that's currently holding your leash for 40 e-stim damage. 25% chance to stun for a long time, otherwise stuns briefly. Subsequent uses cost 2x the DP. +Преобразуйте свои возбужденные мысли в стимулирующее электричество, потребляя 30 DP, чтобы нанести любому, кто в данный момент держит вас на поводке, 40 единиц урона электростимуляцией. 25% оглушить на длительное время, в противном случае оглушение происходит ненадолго. При последующем использовании затраты DP х2. +You must be leashed by someone to use this. +Кто-то должен держать вас на поводке, чтобы вы использовали это. +You don't have enough distraction. +Вам не хватает возбуждения. +You zap your leasher! +Вы шокируете вашего проводника! +You are psychically connected! +Вы соединены психической связью! +You've used Shock Collar recently and it costs more DP. +Вы недавно пользовались шокирующим ошейником, и он стоит дороже обычного. +Essence Crystal +Кристалл сущности +When you miscast, 50% chance to emit a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. +При осечке у вас есть 50% шансов испустить частицу, которую вы можете поглотить, подойдя поближе. Это значительно снижает вероятность осечки на короткое время. +A necklace designed for mages who are novices or easily distracted. It helps recover magical essence lost during miscast. +Ожерелье предназначенное для магов-новичков или тех, кто легко возбуждается. Оно помогает восстановить магическую эссенцию, потерянную при осечке. +Potion Absorber +Поглотитель зелий +When you miscast, the necklace emits a mote that you can walk over to absorb. It reduces miscast chance greatly for a short time. +При осечке, ожерелье испускает частицу, которую вы можете поглотить, подойдя поближе. Это значительно снижает вероятность осечки на короткое время. +A necklace designed for mages who are novices or easily distracted. It helps recover magical essence lost during miscast. +Ожерелье предназначенное для магов-новичков или тех, кто легко возбуждается. Оно помогает восстановить магическую эссенцию, потерянную при осечке. +You erase the seal sigil. +Вы стираете символ печати. +You absorb the mote, granting miscast reduction. +Вы поглощаете частицу, дающую сопротивление осечке. +Your necklace emits a mote as a result of miscasting. +В результате осечки в передаче ваше ожерелье испускает частицу. +Your distraction reaches a critical point! -100% miscast chance. +Ваше возбуждение достигает критической отметки! -100% шанс осечки. +Mana Burst +Взрыв маны +While at 100% distraction, you gain -100% miscast chance, but spending too much mana at once may cause you to go over the edge. +Возбуждаясь на 100%, вы получаете -100% к шансу осечки, но, потратив слишком много маны за один раз, вы можете перейти грань. +-100% miscast chance, but casting spells can send you over the edge. +-100% шанс осечки, но использование заклинаний может привести к тому, что вы перейдете грань. +The psychic link conducts away some of the intensity... +Психическая связь отводит часть напряжения... +Your linked target lets go of herself, transmitting a wave of pleasure to yourself... +Ваша цель, с которой вы связаны, расслабляется, передавая вам волну удовольствия... +### FCTN RMTPE + +### PTRN's RMTPE + +Leads to PLCE +Ведёт в PLCE +### ??? + +(You find a girl clad in a pink catsuit and restrained with straps.)|(She wears a backpack with a note attached to it.)|'My pet here can pick up and deliver restraints for you~'|'Try opening the Facilities tab and depositing restraints!'|'Signed: Your Loyal Warden' +(Вы видите девушку, одетую в розовый кэтсьют и скованную ремнями.)|(На ней рюкзак с прикрепленной к нему запиской.)|'Мой питомец может забрать и доставить вам ограничители~'|'Попробуйте открыть вкладку 'Производства' и внести ограничители!'|'Подпись: Ваша верная Надзирательница' +It becomes hard to resist the dragon's fury... +Становится трудно противостоять ярости дракона... +The dragon overwhelms you with sheer force... +Дракон подавляет вас своей невероятной силой... +Your strength begins to fade... +Ваша сила начинает таять... +Ghost +Призрак +Orb +Сфера +>Entrance +>Вход +>Exit +>Выход +>Stairs +>Лестница +Quest(GDSNM) +Квест(GDSNM) +### [GDSNM] + +Bed! +Кровать! +Bed +Кровать +Tablet +Скрижаль +Chest +Сундук +Chest +Сундук +Silver +Серебро +Gold +Золото +Gold +Золото +Shadow +(Тень) +Shadow +(Тень) +Kitty +Котенок +Chest +Сундук +Mecha +Меха +Holy +Свет +Chest +Сундук +Blue +Синий +chest +сундук +Chest +Сундук +Chest +Сундук +Lost Items +Потерянные предметы +Cache +Тайник +Chest +Сундук +Chest +Сундук +Toy Chest +Сундук игрушек +### (L) + +(The SPEAKER sits encased in skintight rubber up to her nose.|Though the latex over her mouth is smooth and flat,|you know from her whimpering moans that her mouth|is totally filled with a gag, useless like the rest of her body.|Some sort of stand affixes her to the floor.) +(SPEAKER сидит, запечатанная в плотную резину до самого носа.|Хотя латекс у нее на рту гладкий и плоский,|по ее жалобным стонам вы понимаете, что ее рот|полностью забит кляпом, становясь бесполезным, как и все остальное тело.|Какая-то подставка прижимает ее к полу.) +(You don't have any solvents that work on latex) +(У вас нет растворителей, которые работают с латексом) +(You can't help her, bound as tightly as you are...) +(Вы не можете помочь ей, так как связаны слишком крепко...) +(You dissolve her restraints, fumbling around for a while with your bound hands) +(Вы растворяете нее ограничители, некоторое время возясь со связанными руками) +(You rescue the SPEAKER)|Thank you!|Let's get out of here! +(Вы спасаете SPEAKER)|Спасибо!|Давай убираться отсюда! +(You rescue the SPEAKER)|Mmmmph!|(She wants to keep her gag...) +(Вы спасаете SPEAKER)|Ммммф!|(Она хочет, чтобы кляп остался у неё во рту...) +(You are not holding a cutting tool) +(У вас в руках нет режущего инструмента) +(You can't pick the lock with your hands bound) +(Ты не можете открыть замок со связанными руками) +(You cut her restraints, fumbling around for a while with your bound hands) +(Ты разрезаете ее путы, некоторое время возясь со связанными руками) +(After a while, you free the SPEAKER)|Thank you!|Let's get moving! +(Спустя некоторое время вы освобождаете SPEAKER)|Спасибо!|Давай уходить отсюда! +(After a while, you free the SPEAKER)|Mmmmph!|(She shakes her head when you go for her gag...) +(Спустя некоторое время вы освобождаете SPEAKER)|Мммффх!|(Она качает головой, когда вы тянетесь к её кляпу...) +(You don't have enough mana for Remove Slime) +(У вас недостаточно маны для Удаления Слизи) +(Try as you might, your mouth is sealed tight) +(Как бы вы ни старались, ваш рот плотно запечатан) +(You utter a word of release to free the SPEAKER)|Many thanks!|Let's go! +(Вы произносите слово освобождения, чтобы освободить SPEAKER)|Большое спасибо!|Пошли! +(You utter a word of release to free the SPEAKER)|Mmmmph!|(She locks her gag back on...) +(Вы произносите слово освобождения, чтобы освободить SPEAKER)|Ммммф!|(Она снова вставляет кляп в рот...) +Dissolve the latex with a SLVNT +Растворите латекс с помощью SLVNT +Cut her out with a sharp tool +Разрежьте ее ограничители инструментом для резки +Use Remove Slime to unlock her +Используйте 'Удалить Слизь' для её освобождения +Local Saves +Локальные сохранения +Cloud Saves +Облачные сохранения +solvent +растворитель +Latex Doll Stand +Подставка для латексных кукол +A stand for your latex dolls, coated in a smooth rubber coating. +Подставка для ваших латексных кукол, покрыта гладким резиновым покрытием. +Has a flange for propping up even dolls wearing chastity belts. +Имеет фланец, позволяющий удерживать даже кукол, одетых в пояса верности. +(The SPEAKER strokes a hand over your body)|It looks like you're carrying some dangerous goods.|Prisoners shouldn't be carrying what doesn't belong to them~ +(SPEAKER проводит рукой по вашему телу)|Похоже, ты переносишь какой-то опасный груз.|Заключенные не должны носить с собой то, что им не принадлежит~ +(The SPEAKER folds her hands together)|Miss, I was instructed to make sure you don't have|anything dangerous. I'm going to search you now. +(SPEAKER складывает руки на груди)|Мисс, мне было приказано убедиться, что у тебя нет|ничего опасного. Сейчас я собираюсь тебя обыскать. +(The SPEAKER looks at you plainly)|Did you think you were going to sneak in with all of that? +(SPEAKER уверенно смотрит на вас)|Ты думала, что сможешь проникнуть сюда со всем этим? +(The SPEAKER smiles)|Let's see, what loot do we have here...|(SPEAKER is going to search you) +(SPEAKER улыбается)|Давай посмотрим, что у нас тут за добыча...|(SPEAKER собирается вас обыскать) +(The SPEAKER scans you with a red light)|Enumerating contraband...|Please comply for removal. +(SPEAKER сканирует вас красным светом)|Перечисляет контрабанду...|Пожалуйста, соблюдай требования для удаления. +Yes, miss... (Begin search and confiscation) +Да, мисс... (Начать обыск и конфискацию) +Mmph... (Nod politely) (Begin search and confiscation) +Ммфх... (Вежливо кивните) (Начать обыск и конфискацию) +No, I refuse! (Fight) +Нет, я отказываюсь! (Сражаться) +Mmph! (Shake your head and fight) +Мммфх (Качайте головой и сражайтесь) +Option not available at 0 WP +Опция недоступна на 0 WP +(The SPEAKER starts by removing most of your clothes...) +(SPEAKER начинает с того, что снимает с вас большую часть одежды...) +(Next, the SPEAKER looks through your weapons) +(Далее SPEAKER осматривает ваше оружие) +(Finally, the SPEAKER opens the rest of your bag) +(Наконец, SPEAKER открывает оставшуюся часть вашей сумки) +(The search is complete)|There! Now let's get you situated~ +(Обыск завершен)|Вот! Теперь давай устроим тебя поудобнее~ +(The search is complete)|Alright miss, please behave, okay? +(Обыск)|Хорошо, мисс, пожалуйста, ведите себя прилично, ладно? +Confiscated AMNTx ITMN! +Конфисковано AMNTx ITMN! +Kept AMNTx ITMN. +Сохранено AMNTx ITMN. +Sneaked in AMNTx ITMN! +Спрятано AMNTx ITMN! +GUN +ОГОНЬ +The room echoes with the sound of a rubber bullet being fired! +По комнате разносится звук выстрела резиновой пулей! +Tactical Rubber Bullet +Тактическая резиновая пуля +A powerful rubber bullet bounces you to the ground! +Мощная резиновая пуля отбрасывает вас на землю! +The powerful rubber bullet knocks you down and congeals into Capture Foam! +Мощная резиновая пуля сбивает вас с ног и застывает в Фиксирующей пене! +Capture Foam (Feet) +Фиксирующая пена (Ступни) +A sticky foam that spreads quickly and hardens into a tight rubbery layer. +Липкая пена, которая быстро растекается и застывает плотным эластичным слоем. +A knife won't cut it, it simply reforms around the cut. +Ножом ее не разрежешь, она просто зарастет в месте разреза. +Capture Foam (Ankles) +Фиксирующая пена (Лодыжки) +A sticky foam that spreads quickly and hardens into a tight rubbery layer. +Липкая пена, которая быстро растекается и застывает плотным эластичным слоем. +A knife won't cut it, it simply reforms around the cut. +Ножом ее не разрежешь, она просто зарастет в месте разреза. +Capture Foam (Legs) +Фиксирующая пена (Ноги) +A sticky foam that spreads quickly and hardens into a tight rubbery layer. +Липкая пена, которая быстро растекается и застывает плотным эластичным слоем. +A knife won't cut it, it simply reforms around the cut. +Ножом ее не разрежешь, она просто зарастет в месте разреза. +Capture Foam (Arms) +Фиксирующая пена (Руки) +A sticky foam that spreads quickly and hardens into a tight rubbery layer. +Липкая пена, которая быстро растекается и застывает плотным эластичным слоем. +A knife won't cut it, it simply reforms around the cut. +Ножом ее не разрежешь, она просто зарастет в месте разреза. +Capture Foam (Hands) +Фиксирующая пена (Кисти) +A sticky foam that spreads quickly and hardens into a tight rubbery layer. +Липкая пена, которая быстро растекается и застывает плотным эластичным слоем. +A knife won't cut it, it simply reforms around the cut. +Ножом ее не разрежешь, она просто зарастет в месте разреза. +Capture Foam (Mouth) +Фиксирующая пена (Рот) +A sticky foam that spreads quickly and hardens into a tight rubbery layer. +Липкая пена, которая быстро растекается и застывает плотным эластичным слоем. +A knife won't cut it, it simply reforms around the cut. +Ножом ее не разрежешь, она просто зарастет в месте разреза. +Capture Foam (Head) +Фиксирующая пена (Голова) +A sticky foam that spreads quickly and hardens into a tight rubbery layer. +Липкая пена, которая быстро растекается и застывает плотным эластичным слоем. +A knife won't cut it, it simply reforms around the cut. +Ножом ее не разрежешь, она просто зарастет в месте разреза. +Capture Foam Dispenser +Распылитель фиксирующей пены +This collar is designed to make sure its wearer does not escape at all costs. +Этот ошейник предназначен для того, чтобы его владелец не смог сбежать, любой ценой. +It will occasionally cause Capture Foam to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of Capture Foam you have on you. +Иногда он может привести к появлению пены фиксирующей пены из ниоткуда и сковыванию владельца. Частота срабатывания увеличивается в зависимости от количества фиксирующей пены, которая находится на вас. +Tactical Rubber +Тактическая резина +An alchemical substance made to be stretchy and more resilient than natural rubber. +Это алхимическая субстанция, сделанная более эластичной и более упругой, чем натуральная резина. +Developed by kinky alchemists and marketed to PMCs across the islands. +Разработано извращенными алхимики и продается частным военным компаниям на островах. +Capture Foam +Фиксирующая пена +A restraining weapon used to apprehend difficult targets. +Сдерживающее оружие, используемое для поимки трудных целей. +Developed by kinky alchemists and marketed to PMCs across the islands. +Разработано извращенными алхимики и продается частным военным компаниям на островах. +Tactical Rubber (Feet) +Тактическая резина (Ступни) +The end result of capture foam. Strict. Sustainable. Affordable. +Конечный результат фиксирующей пены. Надежная. Прочная. Экономичная. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас из неё уже не вырвешься, но, поскольку она цельная, ее можно разрезать. +Tactical Rubber (Ankles) +Тактическая резина (Лодыжки) +The end result of capture foam. Strict. Sustainable. Affordable. +Конечный результат фиксирующей пены. Надежная. Прочная. Экономичная. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас из неё уже не вырвешься, но, поскольку она цельная, ее можно разрезать. +Tactical Rubber (Legs) +Тактическая резина (Ноги) +The end result of capture foam. Strict. Sustainable. Affordable. +Конечный результат фиксирующей пены. Надежная. Прочная. Экономичная. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас из неё уже не вырвешься, но, поскольку она цельная, ее можно разрезать. +Tactical Rubber (Arms) +Тактическая резина (Руки) +The end result of capture foam. Strict. Sustainable. Affordable. +Конечный результат фиксирующей пены. Надежная. Прочная. Экономичная. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас из неё уже не вырвешься, но, поскольку она цельная, ее можно разрезать. +Tactical Rubber (Hands) +Тактическая резина (Кисти) +The end result of capture foam. Strict. Sustainable. Affordable. +Конечный результат фиксирующей пены. Надежная. Прочная. Экономичная. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас из неё уже не вырвешься, но, поскольку она цельная, ее можно разрезать. +Tactical Rubber (Mouth) +Тактическая резина (Рот) +The end result of capture foam. Strict. Sustainable. Affordable. +Конечный результат фиксирующей пены. Надежная. Прочная. Экономичная. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас из неё уже не вырвешься, но, поскольку она цельная, ее можно разрезать. +Tactical Rubber (Head) +Тактическая резина (Голова) +The end result of capture foam. Strict. Sustainable. Affordable. +Конечный результат фиксирующей пены. Надежная. Прочная. Экономичная. +There's no struggling out now, but since it's solid it may be cuttable. +Сейчас из неё уже не вырвешься, но, поскольку она цельная, ее можно разрезать. +Tactical Rubber Collar +Ошейник тактической резины +This collar is designed to make sure its wearer does not escape their rubber. +Этот ошейник предназначен для того, чтобы гарантировать, что его носитель не выберется из своей резинуы. +It will occasionally cause tactical rubber to appear out of nowhere and bind the wearer. Effect increases in speed based on the amount of rubber you have on you. +Иногда из ниоткуда будет появляться тактическая резина и сковывать носителя. Частота срабатывания увеличивается в зависимости от количества резины на вас. +Sweeping Strike +Сокрушительный удар +Headlong Rush +Стремительный бросок +Maid Squire +Горничная-оруженосец +Maid Knight +Горничная-рыцарь +You humiliate the Maid Squire! +Вы унижаете Горничную-оруженосца! +You defeat the Maid Knight! For now... she swears revenge. +Ты побеждаете Горничную-рыцаря! Сейчас... она клянется отомстить. +The Squire zips you up in comfy leather gear! +Оруженосец облачает вас в удобную кожаную экипировку! +The Maid Knight places you in strict bondage! +Горничная-рыцарь заковывает вас в строгий бондаж! +The Squire secures your restraints! +Оруженосец запирает ваши ограничители! +The Maid Knight secures your restraints! +Горничная-рыцарь запирает ваши ограничители! +The Squire dusts you with her duster plug. +Оруженосец протирает вас своей щеточкой. +The Maid Knight sweeps you with her cleaning halberd! +Горничная-рыцарь протирает вас своей очищающей алебардой! +The EnemyName retreats! +EnemyName отступает! +The EnemyName manages to squirm out of sight! +EnemyName умудряется скрыться из виду! +servers humming... +серверы гудят... +bouncy noises +упругие звуки +goopy noises +липкие звуки +bubbling noise +булькающий шум +rubber squeaking +скрип резины +blaring siren +рев сирены +You claim the Sweeper. +Вы утверждаете Уборщицу. +The Sweeper +Уборщица +Foe of the unclean. Bringer of neat and tidy workspaces. +Враг грязи. Следит за чистотой на рабочих местах. +Deals slash damage. Also deals 30 tickle damage in an area. Has a ranged attack. +Наносит рубящий урон. Также наносит 30 урона от щекотки по площади. Обладает дальней атакой. +Make a ranged attack with the Sweeper. +Проведите дальнюю атаку с помощью Уборщицы. +You claim the Persuader. +Вы утверждаете Убедителя. +The Persuader +Убедитель +Military forces sought a solution with higher stopping power after the Great Work made brute force obsolete. Capture Foam rounds are now the standard. +Вооруженные силы искали решение с более высокой убойной силой после того, как 'Великое Сотворение' сделало грубую силу устаревшей. Патроны с фиксирующей пеной стали стандартом. +Equipped with a duster plug, it deals tickle damage on melee. Can fire a high caliber rubber bullet to deal 80 glue damage from a distance. Takes 3 turns to reload. +Оснащен щеточкой, наносит урон щекоткой в ближнем бою. Может выстрелить крупнокалиберной резиновой пулей, наносящей 80 единиц урона от слизи на расстоянии. На перезарядку уходит 3 хода. +Make a ranged attack with the Persuader for 25 charge. Deals 80 glue damage. +Проведите дальнюю атаку с помощью 'Убедителя' за 25 заряда. Наносит 80 единиц урона от слизи. +Persuader Round +Раунд Убедителя +You fire the Persuader! +Вы стреляете 'Убедителем'! +### ??? + +Wait for current save to finish... +Дождитесь завершения текущего сохранения... +Please wait for save to finish... +Пожалуйста, дождитесь завершения сохранения... +Debug Defeat +Отладка Поражения +You cast devastating ASCII glyphs! +Вы используете разрушительные символы ASCII! +Debug Bind +Отладка Оков +You cast bondage ASCII glyphs! +Вы используете сковывающие символы ASCII! +Empty Slot +Пустой слот +Floor AMNT +Этаж AMNT +Recolor +Перекраска +Only collect notable +Коллекц. только примечательных +Autorelease escaped +Автоосвобождение при побеге +NME is not notable enough for your collection. +NME не является достаточно примечательной для вашей коллекции. +Auto-released NME due to Escape. +Авто-освобождение NME из-за Побега. +Your ITMN1 was cursed and transforms into a ITMN2! +Ваш ITMN1 был проклят и превращается в ITMN2! +Equipping Restraint... +Экипируются Ограничители... +Equipping Armor... +Экипируется Броня... +Using Consumable... +Используется расходник... +Struggling... +Борьба... +The ITMN1 is cleansed and returns to being a ITMN2! +ITMN1 очищен и снова становится ITMN2! +Reverts if cleansed. +Станет прежнем, если его очистить. +...smaller than expected. +...меньше, чем ожидают. +Comes with an artistic flair. +Поставляется с художественным оформлением. diff --git a/Scripts/Animation.js b/Scripts/Animation.js deleted file mode 100644 index eb5b0fb81..000000000 --- a/Scripts/Animation.js +++ /dev/null @@ -1,178 +0,0 @@ -"use strict"; -/** - * Where animation data is stored. Animation data is only managed client side, nothing should be synced. - * @constant - * @type {object} - The animation data object. - */ -var AnimationPersistentStorage = {}; - -/** - * Types of dynamic data that can be stored. - * @constant - * @enum {string} - */ -var AnimationDataTypes = { - AssetGroup: "AssetGroup", - Base: "", - Canvas: "DynamicPlayerCanvas", - PersistentData: "PersistentData", - Rebuild: "Rebuild", - RefreshTime: "RefreshTime", - RefreshRate: "RefreshRate", -}; - -/** - * Gets the dynamic data storage name for a given item on a given character. - * @param {Character} C - Character wearing the animated object - * @param {AnimationDataTypes} Type - Type of data to query - * @param {Asset} [Asset] - The animated object - * @returns {string} - Contains the name of the persistent data key. - */ -function AnimationGetDynamicDataName(C, Type, Asset) { - return (Type ? Type + "__" : "") + C.AccountName + (Asset ? "__" + Asset.Group.Name + "__" + Asset.Name : ""); -} - -/** - * Gets the persistent data for a given item on a given character. This method should not be called explicitly, use the Data builder passed to the dynamic drawing functions. - * @param {Character} C - Character wearing the animated object - * @param {Asset} Asset - The animated object - * @returns {any} - Contains the persistent data of the animated object, returns a new empty object if it was never initialized previously. - */ -function AnimationPersistentDataGet(C, Asset) { - const PersistentDataName = AnimationGetDynamicDataName(C, AnimationDataTypes.PersistentData, Asset); - if (!AnimationPersistentStorage[PersistentDataName]) { - AnimationPersistentStorage[PersistentDataName] = {}; - } - return AnimationPersistentStorage[PersistentDataName]; -} - -/** - * Sets the maximum animation refresh rate for a given character. - * @param {Character} C - Character wearing the dynamic object - * @param {number} RequestedRate - The maximum refresh rate to request in ms - * @returns {void} - Nothing - */ -function AnimationRequestRefreshRate(C, RequestedRate) { - const key = AnimationGetDynamicDataName(C, AnimationDataTypes.RefreshRate); - let RefreshRate = AnimationPersistentStorage[key] != null ? AnimationPersistentStorage[key] : Infinity; - if (RequestedRate < RefreshRate) { - AnimationPersistentStorage[key] = RequestedRate; - } -} - -/** - * Marks a given character to be redrawn on the next animation refresh. - * @param {Character} C - Character wearing the dynamic object - * @returns {void} - Nothing - */ -function AnimationRequestDraw(C) { - AnimationPersistentStorage[AnimationGetDynamicDataName(C, AnimationDataTypes.Rebuild)] = true; -} - -/** - * Gets the group object for a given character. This method should not be called explicitly, use the Data builder passed to the dynamic drawing functions. - * @param {Character} C - Character wearing the animated object - * @param {string} Name - Name of the animated object - * @returns {object} - Contains the persistent group data, returns a new empty object if it was never initialized previously. - */ -function AnimationGroupGet(C, Name) { - let GroupKey = AnimationGetDynamicDataName(C, AnimationDataTypes.AssetGroup); - if (!AnimationPersistentStorage[GroupKey]) { - AnimationPersistentStorage[GroupKey] = {}; - } - if (!AnimationPersistentStorage[GroupKey][Name]) { - AnimationPersistentStorage[GroupKey][Name] = { Subscriptions: [] }; - } - return AnimationPersistentStorage[GroupKey][Name]; -} - -/** - * Marks a given asset as part of a shared data group. - * @param {Character} C - Character wearing the dynamic object - * @param {Asset} Asset - The animated object - * @param {string} Name - Name of the group to subscribe to. - * @returns {void} - Nothing - */ -function AnimationGroupSubscribe(C, Asset, Name) { - const DataKey = AnimationGetDynamicDataName(C, AnimationDataTypes.PersistentData, Asset); - const Group = AnimationGroupGet(C, Name); - AnimationPersistentDataGet(C, Asset)["GroupData" + Name] = Group; - if (Array.isArray(Group.Subscriptions) && !Group.Subscriptions.includes(DataKey)) { - Group.Subscriptions.push(DataKey); - } -} - -/** - * Generates a temporary canvas used draw on for dynamic assets. - * Careful! The width of the canvas should never be higher than 500px. - * @param {Character} C - Character for which the temporary canvas is - * @param {Asset} A - Asset for which the canvas is - * @param {number} W - Width of the canvas (can be changed later) - * @param {number} H - Height of the canvas (can be changed later) - * @returns {HTMLCanvasElement} - The temporary canvas to use - */ -function AnimationGenerateTempCanvas(C, A, W, H) { - let TempCanvas = document.createElement("canvas"); - TempCanvas.setAttribute('name', AnimationGetDynamicDataName(C, AnimationDataTypes.Canvas, A)); - TempCanvas.width = W ? W : 500; - TempCanvas.height = H ? H : 500; - return TempCanvas; -} - -/** - * Purges all dynamic asset data corresponding to a given character. - * @param {Character} C - The character to delete the animation data of - * @param {boolean} IncludeAll - TRUE if we should delete every animation data for the given character. - * @returns {void} - Nothing - */ -function AnimationPurge(C, IncludeAll) { - const PossibleData = []; - const PossibleCanvas = []; - - // Highlights the data to keep - if (!IncludeAll) { - C.Appearance.forEach((CA) => { - PossibleData.push(AnimationGetDynamicDataName(C, AnimationDataTypes.PersistentData, CA.Asset)); - PossibleCanvas.push(AnimationGetDynamicDataName(C, AnimationDataTypes.Canvas, CA.Asset)); - }); - } - - // Checks if any character specific info is worth being kept - if (IncludeAll || !C.Appearance.find(CA => CA.Asset.DynamicScriptDraw || CA.Asset.DynamicAfterDraw || CA.Asset.DynamicBeforeDraw)) { - delete AnimationPersistentStorage[AnimationGetDynamicDataName(C, AnimationDataTypes.RefreshTime)]; - delete AnimationPersistentStorage[AnimationGetDynamicDataName(C, AnimationDataTypes.Rebuild)]; - delete AnimationPersistentStorage[AnimationGetDynamicDataName(C, AnimationDataTypes.AssetGroup)]; - } - - // Always delete the refresh rate for accurate requested rate. - delete AnimationPersistentStorage[AnimationGetDynamicDataName(C, AnimationDataTypes.RefreshRate)]; - - // Clear no longer needed data (Clear the subscription, then clear the asset data) - for (const key in AnimationPersistentStorage) { - const isCharDataKey = key.startsWith(AnimationDataTypes.PersistentData + "__" + C.AccountName + "__"); - if (isCharDataKey && !PossibleData.includes(key)) { - const Group = AnimationPersistentStorage[key].Group; - if (Group && Array.isArray(Group.Subscriptions)) { - Group.Subscriptions = Group.Subscriptions.filter(k => k != key); - } - delete AnimationPersistentStorage[key]; - } - } - - // Clear no longer needed cached canvases - GLDrawImageCache.forEach((img, key) => { - if (key.startsWith(AnimationDataTypes.Canvas + "__" + + C.AccountName + "__") && !PossibleCanvas.includes(key)) { - GLDrawImageCache.delete(key); - } - }); - - // Clear empty groups when all is done - const GroupKey = AnimationGetDynamicDataName(C, AnimationDataTypes.AssetGroup); - if (AnimationPersistentStorage[GroupKey]) { - for (const key in AnimationPersistentStorage[GroupKey]) { - if (!AnimationPersistentStorage[GroupKey][key].Subscriptions || !Array.isArray(AnimationPersistentStorage[GroupKey][key].Subscriptions) || AnimationPersistentStorage[GroupKey][key].Subscriptions.length == 0) { - delete AnimationPersistentStorage[GroupKey][key]; - } - } - } -} diff --git a/Scripts/Appearance.js b/Scripts/Appearance.js deleted file mode 100644 index 59d49ce91..000000000 --- a/Scripts/Appearance.js +++ /dev/null @@ -1,1471 +0,0 @@ -"use strict"; -var AppearanceBackground = "Dressing"; -var CharacterAppearanceOffset = 0; -var CharacterAppearanceNumPerPage = 9; -var CharacterAppearanceHeaderText = ""; -var CharacterAppearanceHeaderTextTime = 0; -var CharacterAppearanceBackup = null; -var CharacterAppearanceInProgressBackup = null; -var CharacterAppearanceAssets = []; -var CharacterAppearanceColorPickerGroupName = ""; -var CharacterAppearanceColorPickerBackup = ""; -var CharacterAppearanceColorPickerRefreshTimer = null; -/** @type {Character | null} */ -var CharacterAppearanceSelection = null; -var CharacterAppearanceReturnRoom = "MainHall"; -var CharacterAppearanceReturnModule = "Room"; -var CharacterAppearanceWardrobeOffset = 0; -var CharacterAppearanceWardrobeText = ""; -var CharacterAppearanceWardrobeName = ""; -var CharacterAppearanceForceUpCharacter = -1; -var CharacterAppearancePreviousEmoticon = ""; -var CharacterAppearanceMode = ""; -var CharacterAppearanceMenuMode = ""; -var CharacterAppearanceCloth = null; -var AppearanceMenu = []; -var AppearancePreviews = []; -var AppearanceUseCharacterInPreviewsSetting = false; - -const CanvasUpperOverflow = 700; -const CanvasLowerOverflow = 150; -const CanvasDrawHeight = 1000 + CanvasUpperOverflow + CanvasLowerOverflow; - -const AppearancePermissionColors = { - red: ["pink", "red"], - amber: ["#fed8b1", "orange"], - green: ["lime", "green"], -}; - -/** - * Builds all the assets that can be used to dress up the character - * @param {Character} C - The character whose appearance is modified - * @returns {void} - Nothing - */ -function CharacterAppearanceBuildAssets(C) { - - // Adds all items with 0 value and from the appearance category - CharacterAppearanceAssets = []; - for (let A = 0; A < Asset.length; A++) - if ((Asset[A].Value == 0) && (Asset[A].Group.Family == C.AssetFamily) && (Asset[A].Group.Category == "Appearance")) - CharacterAppearanceAssets.push(Asset[A]); - for (let A = 0; A < C.Inventory.length; A++) - if ((C.Inventory[A].Asset != null) && (C.Inventory[A].Asset.Group.Family == C.AssetFamily) && (C.Inventory[A].Asset.Group.Category == "Appearance")) - CharacterAppearanceAssets.push(C.Inventory[A].Asset); - -} - -/** - * Makes sure the character appearance is valid from inventory and asset requirement. This function is called during the login process. - * @param {Character} C - The character whose appearance is checked - * @returns {void} - Nothing - */ -function CharacterAppearanceValidate(C) { - - // Remove any appearance item that's not in inventory - var Refresh = false; - for (let A = C.Appearance.length - 1; A >= 0; A--) - if ((C.Appearance[A].Asset.Value != 0) && (C.Appearance[A].Asset.Group.Category == "Appearance") && !InventoryAvailable(C, C.Appearance[A].Asset.Name, C.Appearance[A].Asset.Group.Name)) { - C.Appearance.splice(A, 1); - Refresh = true; - } - - // Dress back if there are missing appearance items - for (let A = 0; A < AssetGroup.length; A++) - if (!AssetGroup[A].AllowNone && (CharacterAppearanceGetCurrentValue(C, AssetGroup[A].Name, "Name") == "None")) - for (let B = 0; B < Asset.length; B++) - if (Asset[B].Group.Name == AssetGroup[A].Name) { - C.Appearance.push({ Asset: Asset[B], Color: Asset[B].Group.ColorSchema[0] }); - Refresh = true; - break; - } - - // If we must refresh the character and push the appearance to the server - if (Refresh) CharacterRefresh(C); - -} - -/** - * Resets the character to it's default appearance - * @param {Character} C - The character to redress to its default appearance - * @returns {void} - Nothing - */ -function CharacterAppearanceSetDefault(C) { - - // Resets the current appearance and prepares the assets - if (!AppearanceGroupAllowed(C, "ALL")) return; - C.Appearance = []; - C.Pose = []; - if (CharacterAppearanceAssets.length == 0) CharacterAppearanceBuildAssets(C); - - // For each items in the character appearance assets - for (let I = 0; I < CharacterAppearanceAssets.length; I++) - if (CharacterAppearanceAssets[I].Group.IsDefault) { - - // If there's no item in a slot, the first one becomes the default - var MustWear = true; - for (let A = 0; A < C.Appearance.length; A++) - if (C.Appearance[A].Asset.Group.Name == CharacterAppearanceAssets[I].Group.Name) - MustWear = false; - - // No item, we wear it with the default color - if (MustWear) { - var NA = { - Asset: CharacterAppearanceAssets[I], - Color: CharacterAppearanceAssets[I].Group.ColorSchema[0] - }; - C.Appearance.push(NA); - } - - } - - // Loads the new character canvas - CharacterLoadCanvas(C); - -} - -/** - * Checks wether an item group is required for this asset - * @param {Character} C - The character, whose assets are used for the check - * @param {string} GroupName - The name of the group to check - * @returns {boolean} - Returns TRUE if the item group is required from - */ -function CharacterAppearanceRequired(C, GroupName) { - for (let A = 0; A < C.Appearance.length; A++) - if ((C.Appearance[A].Asset.Require != null) && (C.Appearance[A].Asset.Require.indexOf(GroupName) >= 0)) - return true; - return false; -} - -/** - * Checks, wether the item group must be hidden for a certain asset - * @param {Character} C - The character, whose assets are used for the check - * @param {string} GroupName - The name of the group to check - * @returns {boolean} - Returns TRUE if the item group must be hidden and not chosen - */ -function CharacterAppearanceMustHide(C, GroupName) { - for (let A = 0; A < C.Appearance.length; A++) { - if ((C.Appearance[A].Asset.Hide != null) && (C.Appearance[A].Asset.Hide.indexOf(GroupName) >= 0)) return true; - if ((C.Appearance[A].Property != null) && (C.Appearance[A].Property.Hide != null) && (C.Appearance[A].Property.Hide.indexOf(GroupName) >= 0)) return true; - } - return false; -} - -/** - * Sets a full random set of items for a character. Only items that do not have the "Random" property set to false will be used. - * @param {Character} C - The character to dress - * @param {boolean} [ClothOnly=false] - Defines, if only clothes should be used - * @returns {void} - Nothing - */ -function CharacterAppearanceFullRandom(C, ClothOnly=false) { - - // Clear the current appearance - for (let A = C.Appearance.length - 1; A >= 0; A--) - if (C.Appearance[A].Asset.Group.Category == "Appearance") - if ((!ClothOnly || (C.Appearance[A].Asset.Group.AllowNone)) && AppearanceGroupAllowed(C, C.Appearance[A].Asset.Group.Name)) - C.Appearance.splice(A, 1); - - // For each item group (non default items only show at a 8% rate, if it can occasionally happen) - for (let A = 0; A < AssetGroup.length; A++) - if ((AssetGroup[A].Category == "Appearance") && (AssetGroup[A].IsDefault || (AssetGroup[A].Random && Math.random() < 0.08) || CharacterAppearanceRequired(C, AssetGroup[A].Name)) && (!CharacterAppearanceMustHide(C, AssetGroup[A].Name) || !AssetGroup[A].AllowNone) && (CharacterAppearanceGetCurrentValue(C, AssetGroup[A].Name, "Name") == "None") && AppearanceGroupAllowed(C, AssetGroup[A].Name)) { - - // Get the parent size - var ParentSize = ""; - if (AssetGroup[A].ParentSize != "") - ParentSize = CharacterAppearanceGetCurrentValue(C, AssetGroup[A].ParentSize, "Name"); - - // Check for a parent - var R = []; - for (let I = 0; I < CharacterAppearanceAssets.length; I++) - if ((CharacterAppearanceAssets[I].Group.Name == AssetGroup[A].Name) && (CharacterAppearanceAssets[I].ParentItem != null) && ((ParentSize == "") || (CharacterAppearanceAssets[I].Name == ParentSize))) - for (let P = 0; P < C.Appearance.length; P++) - if (C.Appearance[P].Asset.Name == CharacterAppearanceAssets[I].ParentItem) - R.push(CharacterAppearanceAssets[I]); - - // Since there was no parent, get all the possible items - if (R.length == 0) - for (let I = 0; I < CharacterAppearanceAssets.length; I++) - if ((CharacterAppearanceAssets[I].Group.Name == AssetGroup[A].Name) && CharacterAppearanceAssets[I].Random && (CharacterAppearanceAssets[I].ParentItem == null) && ((ParentSize == "") || (CharacterAppearanceAssets[I].Name == ParentSize))) - R.push(CharacterAppearanceAssets[I]); - - // Picks a random item and color and add it - if (R.length > 0) { - var SelectedAsset = InventoryGetRandom(C, AssetGroup[A].Name, R); - // If we found no asset, just move to next group - if (!SelectedAsset) - continue; - /** @type {string|string[]} */ - var SelectedColor = SelectedAsset.Group.ColorSchema[Math.floor(Math.random() * SelectedAsset.Group.ColorSchema.length)]; - if ((SelectedAsset.Group.ColorSchema[0] == "Default") && (Math.random() < 0.5)) SelectedColor = "Default"; - if (SelectedAsset.Group.InheritColor != null) SelectedColor = "Default"; - else if (SelectedAsset.Group.ParentColor != "") - if (CharacterAppearanceGetCurrentValue(C, SelectedAsset.Group.ParentColor, "Color") != "None") - SelectedColor = CharacterAppearanceGetCurrentValue(C, SelectedAsset.Group.ParentColor, "Color"); - // Rare chance of keeping eyes of a different color - if (SelectedAsset.Group.Name == "Eyes2" && Math.random() < 0.995) - for (let A = 0; A < C.Appearance.length; A++) - if (C.Appearance[A].Asset.Group.Name == "Eyes") - SelectedColor = C.Appearance[A].Color; - if (SelectedColor == "Default" && SelectedAsset.DefaultColor != null) SelectedColor = SelectedAsset.DefaultColor; - /** @type {Item} */ - var NA = { - Asset: SelectedAsset, - Color: SelectedColor - }; - C.Appearance.push(NA); - } - - } - - // Refreshes the character - CharacterRefresh(C, false); -} - -/** - * Removes all items that can be removed, making the character naked. Checks for a blocking of CosPlayItem removal. - * @param {Character} C - The character to undress - * @returns {void} - Nothing - */ -function CharacterAppearanceNaked(C) { - - // For each item group (non default items only show at a 20% rate) - for (let A = C.Appearance.length - 1; A >= 0; A--) - if (C.Appearance[A].Asset.Group.AllowNone && (C.Appearance[A].Asset.Group.Category == "Appearance") && (!C.IsOnline() || !(C.OnlineSharedSettings.BlockBodyCosplay && (C.Appearance[A].Asset != null) && (C.Appearance[A].Asset.Group != null) && C.Appearance[A].Asset.Group.BodyCosplay))) - C.Appearance.splice(A, 1); - - // Loads the new character canvas - CharacterLoadCanvas(C); - -} - -/** - * Removes one layer of clothing: outer clothes, then underwear, then body-cosplay clothes, then nothing - * @param {Character} C - The character to undress - * @returns {void} - Nothing - */ -function CharacterAppearanceStripLayer(C) { - var HasClothes = false; - var HasUnderwear = false; - var HasBodyCosplay = false; - - // Find out what the top layer currently is - for (let A = 0; A < C.Appearance.length; A++) { - if (!WardrobeGroupAccessible(C, C.Appearance[A].Asset.Group)) continue; - if (!AppearanceGroupAllowed(C, C.Appearance[A].Asset.Group.Name)) continue; - if (C.Appearance[A].Asset.Group.BodyCosplay || C.Appearance[A].Asset.BodyCosplay) HasBodyCosplay = true; - else if (C.Appearance[A].Asset.Group.Underwear) HasUnderwear = true; - else if (C.Appearance[A].Asset.Group.Clothing) { HasClothes = true; break; } - } - - // Check if there's anything to remove - if (!HasClothes && !HasUnderwear && !HasBodyCosplay) return; - - // Ensure only the top layer is 'true' - HasBodyCosplay = HasBodyCosplay && !HasUnderwear && !HasClothes; - HasUnderwear = HasUnderwear && !HasClothes; - - // Remove assets from the top layer only - var RemoveAsset = false; - for (let A = C.Appearance.length - 1; A >= 0; A--) { - RemoveAsset = false; - if (!WardrobeGroupAccessible(C, C.Appearance[A].Asset.Group)) continue; - if (!AppearanceGroupAllowed(C, C.Appearance[A].Asset.Group.Name)) continue; - if (C.Appearance[A].Asset.Group.BodyCosplay || C.Appearance[A].Asset.BodyCosplay) { - if (HasBodyCosplay) RemoveAsset = true; - } - else if (C.Appearance[A].Asset.Group.Underwear) { - if (HasUnderwear) RemoveAsset = true; - } - else if (C.Appearance[A].Asset.Group.Clothing) { - if (HasClothes) RemoveAsset = true; - } - if (RemoveAsset) { - C.Appearance.splice(A, 1); - } - } - - // Loads the new character canvas - CharacterLoadCanvas(C); -} - -/** - * Builds a filtered and sorted set of appearance layers, each representing a drawable layer of a character's current appearance. Layers - * that will not be drawn (because their asset is not visible or they do not permit the current asset type) are filtered out at this stage. - * @param {Character} C - The character to build the layers for - * @return {AssetLayer[]} - A sorted set of layers, sorted by layer drawing priority - */ -function CharacterAppearanceSortLayers(C) { - var groupAlphas = {}; - var layers = C.DrawAppearance.reduce((layersAcc, item) => { - var asset = item.Asset; - // Only include layers for visible assets - if (asset.Visible && CharacterAppearanceVisible(C, asset.Name, asset.Group.Name) && InventoryChatRoomAllow(asset.Category)) { - // Check if we need to draw a different variation (from type property) - var type = (item.Property && item.Property.Type) || ""; - var layersToDraw = asset.Layer - // Only include layers that permit the current type (if AllowTypes is not defined, also include the layer) - .filter(layer => !layer.AllowTypes || ( - layer.ReverseAllowTypes ? - (type == '' ? layer.ReverseAllowEmptyType : layer.ReverseAllowTypes.some(t => type.includes(t))) : - layer.AllowTypes.includes(type))) - // Hide the layer if its HideAs proxy asset should be hidden - .filter(layer => !layer.HideAs || CharacterAppearanceVisible(C, layer.HideAs.Asset, layer.HideAs.Group)) - // Hide the layer if it should be hidden for the current pose - .filter(layer => !layer.HideForPose || !layer.HideForPose.includes(CommonDrawResolveAssetPose(C, asset, layer))) - .map(layer => { - var drawLayer = Object.assign({}, layer); - // Store any group-level alpha mask definitions - drawLayer.Alpha.forEach(alphaDef => { - if ((alphaDef.Group && alphaDef.Group.length) && (!alphaDef.Type || !Array.isArray(alphaDef.Type) || alphaDef.Type.includes(type))) { - alphaDef.Group.forEach(groupName => { - groupAlphas[groupName] = groupAlphas[groupName] || []; - groupAlphas[groupName].push({Pose: alphaDef.Pose, Masks: alphaDef.Masks}); - }); - } - }); - // If the item has an OverridePriority property, it completely overrides the layer priority - if (item.Property && typeof item.Property.OverridePriority === "number") drawLayer.Priority = item.Property.OverridePriority; - return drawLayer; - }); - Array.prototype.push.apply(layersAcc, layersToDraw); - } - return layersAcc; - }, []); - - // Run back over the layers to apply the group-level alpha mask definitions to the appropriate layers - layers.forEach(layer => { - // If the layer has a HideAs proxy group name, apply those alphas rather than the actual group alphas - const groupName = (layer.HideAs && layer.HideAs.Group) || layer.Asset.Group.Name; - layer.GroupAlpha = []; - if (groupAlphas[groupName]) { - Array.prototype.push.apply(layer.GroupAlpha, groupAlphas[groupName]); - } - }); - - return layers.sort((l1, l2) => { - // If priorities are different, sort by priority - if (l1.Priority !== l2.Priority) return l1.Priority - l2.Priority; - // If the priorities are identical and the layers belong to the same Asset, ensure layer order is preserved - if (l1.Asset === l2.Asset) return l1.Asset.Layer.indexOf(l1) - l1.Asset.Layer.indexOf(l2); - // If priorities are identical, sort alphabetically to maintain consistency - return (l1.Asset.Group.Name + l1.Asset.Name).localeCompare(l2.Asset.Group.Name + l2.Asset.Name); - }); -} - -/** - * Determines whether an item or a whole item group is visible or not - * @param {Character} C - The character whose assets are checked - * @param {string} AssetName - The name of the asset to check - * @param {string} GroupName - The name of the item group to check - * @param {boolean} Recursive - If TRUE, then other items which are themselves hidden will not hide this item. Parameterising this prevents - * infinite loops. - * @returns {boolean} - Returns TRUE if we can show the item or the item group - */ -function CharacterAppearanceVisible(C, AssetName, GroupName, Recursive = true) { - if (CharacterAppearanceItemIsHidden(AssetName, GroupName)) { - C.HasHiddenItems = true; - return false; - } - - if (!C.DrawAppearance) C.DrawAppearance = C.Appearance; - - const assetToCheck = AssetGet(C.AssetFamily, GroupName, AssetName); - if (assetToCheck) { - const Pose = CommonDrawResolveAssetPose(C, assetToCheck); - if (Pose && assetToCheck.HideForPose.includes(Pose)) return false; - } - - for (const item of C.DrawAppearance) { - if (CharacterAppearanceItemIsHidden(item.Asset.Name, item.Asset.Group.Name)) continue; - let HidingItem = false; - let HideItemExclude = InventoryGetItemProperty(item, "HideItemExclude"); - if (HideItemExclude == null) HideItemExclude = []; - const Excluded = HideItemExclude.includes(GroupName + AssetName); - if ((item.Asset.Hide != null) && (item.Asset.Hide.indexOf(GroupName) >= 0) && !Excluded) HidingItem = true; - else if (!Excluded && item.Asset.HideItemAttribute.length && assetToCheck && assetToCheck.Attribute.length) { - HidingItem = item.Asset.HideItemAttribute.some((val) => assetToCheck.Attribute.indexOf(val) !== -1); - } - else if ((item.Property != null) && (item.Property.Hide != null) && (item.Property.Hide.indexOf(GroupName) >= 0) && !Excluded) HidingItem = true; - else if ((item.Asset.HideItem != null) && (item.Asset.HideItem.indexOf(GroupName + AssetName) >= 0)) HidingItem = true; - else if ((item.Property != null) && (item.Property.HideItem != null) && (item.Property.HideItem.indexOf(GroupName + AssetName) >= 0)) HidingItem = true; - if (HidingItem) { - if (Recursive) { - if (CharacterAppearanceVisible(C, item.Asset.Name, item.Asset.Group.Name, false)) { - return false; - } - } - else return false; - } - } - - if (C.Pose != null) - for (let A = 0; A < C.Pose.length; A++) - for (let P = 0; P < Pose.length; P++) - if (Pose[P].Name === C.Pose[A]) - if ((Pose[P].Hide != null) && (Pose[P].Hide.indexOf(GroupName) >= 0)) - return false; - return true; -} - -/** - * Determines whether the player has set this item to not appear on screen - * @param {string} AssetName - The name of the asset to check - * @param {string} GroupName - The name of the item group to check - * @returns {boolean} - TRUE if the item is hidden - */ -function CharacterAppearanceItemIsHidden(AssetName, GroupName) { - for (var H = 0; H < Player.HiddenItems.length; H++) - if (Player.HiddenItems[H].Name == AssetName && Player.HiddenItems[H].Group == GroupName) - return true; - return false; -} - -/** - * Calculates and sets the height modifier which affects the character's vertical position on screen - * @param {Character} C - The character whose height modifier must be calculated - * @returns {void} - Nothing - */ -function CharacterAppearanceSetHeightModifiers(C) { - if (CharacterAppearanceForceUpCharacter != C.MemberNumber) { - let Height = 0; - let HeightRatioProportion = 1; - - // Check if there is any setting to override the standard asset height modifiers - let HeightOverrides = []; - let PoseOverrides = Pose.filter(P => C.Pose != null && C.Pose.indexOf(P.Name) >= 0 && P.OverrideHeight != null).map(P => P.OverrideHeight); - let AssetOverrides = C.DrawAppearance.filter(A => A.Asset.OverrideHeight != null).map(A => A.Asset.OverrideHeight); - let PropertyOverrides = C.DrawAppearance.filter(A => A.Property && A.Property.OverrideHeight != null).map(A => A.Property.OverrideHeight); - HeightOverrides = HeightOverrides.concat(PoseOverrides, AssetOverrides, PropertyOverrides); - - if (HeightOverrides.length > 0) { - // Use the override with highest priority - let TopOverride = HeightOverrides.reduce((a, b) => a.Priority >= b.Priority ? a : b); - Height = TopOverride.Height || 0; - if (TopOverride.HeightRatioProportion != null) HeightRatioProportion = TopOverride.HeightRatioProportion; - } - else { - // Adjust the height based on modifiers on the assets - for (let A = 0; A < C.DrawAppearance.length; A++) - if (CharacterAppearanceVisible(C, C.DrawAppearance[A].Asset.Name, C.DrawAppearance[A].Asset.Group.Name)) { - if (C.DrawAppearance[A].Property && C.DrawAppearance[A].Property.HeightModifier != null) Height += C.DrawAppearance[A].Property.HeightModifier; - else Height += C.DrawAppearance[A].Asset.HeightModifier; - } - } - - // Limit values affectable by Property settings in case invalid values were set via console - if (Height > CanvasLowerOverflow) Height = CanvasLowerOverflow; - if (Height < -CanvasUpperOverflow) Height = -CanvasUpperOverflow; - if (HeightRatioProportion > 1) HeightRatioProportion = 1; - if (HeightRatioProportion < 0) HeightRatioProportion = 0; - - // Set the final modifier values for the character - C.HeightModifier = Height; - C.HeightRatioProportion = HeightRatioProportion; - } - - // Set the height ratio here to avoid lookin it up when drawing. The setting can make all characters full height - C.HeightRatio = Player.VisualSettings && Player.VisualSettings.ForceFullHeight ? 1 : CharacterAppearanceGetCurrentValue(C, "Height", "Zoom"); -} - -/** - * Draws the character canvas - * @param {Character} C - The character to draw - * @returns {void} - Nothing - */ -function CharacterAppearanceBuildCanvas(C) { - // Revert to 2D canvas if webgl isn't active or its context has been lost - if (GLVersion === "No WebGL" || !GLDrawCanvas || !GLDrawCanvas.GL || GLDrawCanvas.GL.isContextLost()) { - CommonDrawCanvasPrepare(C); - CommonDrawAppearanceBuild(C, { - clearRect: (x, y, w, h) => C.Canvas.getContext("2d").clearRect(x, y, w, h), - clearRectBlink: (x, y, w, h) => C.CanvasBlink.getContext("2d").clearRect(x, y, w, h), - drawImage: (src, x, y, alphaMasks, opacity, rotate) => DrawImageCanvas(src, C.Canvas.getContext("2d"), x, y, alphaMasks, opacity, rotate), - drawImageBlink: (src, x, y, alphaMasks, opacity, rotate) => DrawImageCanvas(src, C.CanvasBlink.getContext("2d"), x, y, alphaMasks, opacity, rotate), - drawImageColorize: (src, x, y, color, fullAlpha, alphaMasks, opacity, rotate) => DrawImageCanvasColorize(src, C.Canvas.getContext("2d"), x, y, 1, color, fullAlpha, alphaMasks, opacity, rotate), - drawImageColorizeBlink: (src, x, y, color, fullAlpha, alphaMasks, opacity, rotate) => DrawImageCanvasColorize(src, C.CanvasBlink.getContext("2d"), x, y, 1, color, fullAlpha, alphaMasks, opacity, rotate), - drawCanvas: (Img, x, y, alphaMasks) => DrawCanvas(Img, C.Canvas.getContext("2d"), x, y, alphaMasks), - drawCanvasBlink: (Img, x, y, alphaMasks) => DrawCanvas(Img, C.CanvasBlink.getContext("2d"), x, y, alphaMasks), - }); - } else { - GLDrawAppearanceBuild(C); - } -} - -/** - * Returns a value from the character current appearance - * @param {Character} C - The character to get values from - * @param {string} Group - The name of the group, whose values we want to get - * @param {string} Type - The name of the value, we want to get - * @returns {*} - The return value - */ -function CharacterAppearanceGetCurrentValue(C, Group, Type) { - - // Finds the value - for (let A = 0; A < C.Appearance.length; A++) - if ((C.Appearance[A].Asset.Group.Family == C.AssetFamily) && (C.Appearance[A].Asset.Group.Name == Group)) { - if (Type == "Name") return C.Appearance[A].Asset.Name; - if (Type == "Description") return C.Appearance[A].Asset.Description; - if (Type == "Color") return CommonColorsEqual(C.Appearance[A].Color, C.Appearance[A].Asset.DefaultColor) ? "Default" : C.Appearance[A].Color; - if (Type == "ID") return A; - if (Type == "Effect") return C.Appearance[A].Asset.Effect; - if (Type == "Asset") return C.Appearance[A].Asset; - if (Type == "Full") return C.Appearance[A]; - if (Type == "Zoom") return ((C.Appearance[A].Asset.ZoomModifier == null) || (C.Appearance[A].Asset.ZoomModifier > 1) || (C.Appearance[A].Asset.ZoomModifier < 0.9)) ? 1 : C.Appearance[A].Asset.ZoomModifier; - } - return "None"; - -} - -/** - * Repositions the character horizonally to centre them, since shorter characters will shrink towards the left - * @param {Character} C - The character to reposition - * @param {number} HeightRatio - The character's height ratio - * @returns {number} - The amount to move the character along the X co-ordinate - */ -function CharacterAppearanceXOffset(C, HeightRatio) { - return 500 * (1 - HeightRatio) / 2; -} - -/** - * Repositions the character vertically towards the bottom of the canvas (the 'floor'), since shorter characters will be shrunk towards the - * top HeightRatioProportion controls how much of this offset applies with 1 (max) positioning them on the "floor" and 0 (min) leaving them - * up at the 'ceiling' - * @param {Character} C - The character to reposition - * @param {number} HeightRatio - The character's height ratio - * @param {boolean} [IgnoreUpButton=false] - Whether or not to ignore the up button status - * @returns {number} - The amounnt to move the character along the Y co-ordinate - */ -function CharacterAppearanceYOffset(C, HeightRatio, IgnoreUpButton) { - let HeightModifier = C.HeightModifier; - if (!IgnoreUpButton && CharacterAppearanceForceUpCharacter == C.MemberNumber) { - HeightModifier = 0; - } - return 1000 * (1 - HeightRatio) * C.HeightRatioProportion - HeightModifier * HeightRatio; -} - -/** - * Loads the character appearance screen and keeps a backup of the previous appearance. The function name is created dynamically. - * @returns {void} - Nothing - */ -function AppearanceLoad() { - DialogFocusItem = null; - CharacterAppearanceOffset = 0; - if (!CharacterAppearanceSelection) CharacterAppearanceSelection = Player; - var C = CharacterAppearanceSelection; - CharacterAppearanceBuildAssets(Player); - CharacterAppearanceBackup = CharacterAppearanceStringify(C); - AppearanceMenuBuild(C); - AppearanceUseCharacterInPreviewsSetting = true; -} - -/** - * Build the buttons in the top menu - * @param {Character} C - The character the appearance is being set for - * @returns {void} - Nothing - */ -function AppearanceMenuBuild(C) { - AppearanceMenu = []; - - switch (CharacterAppearanceMode) { - case "": - if (C.ID === 0) { - if (AppearanceGroupAllowed(C, "ALL")) AppearanceMenu.push("Reset"); - if (!DialogItemPermissionMode) AppearanceMenu.push("WearRandom"); - AppearanceMenu.push("Random"); - } else AppearanceMenu.push("WardrobeDisabled"); - AppearanceMenu.push("Naked", "Character", "Next"); - break; - case "Wardrobe": - AppearanceMenu.push("Naked", "Prev", "Next"); - break; - case "Cloth": - if (!DialogItemPermissionMode) { - let Item = InventoryGet(C, C.FocusGroup.Name); - if (Item && Item.Asset.Extended) AppearanceMenu.push(InventoryBlockedOrLimited(C, Item) ? "UseDisabled" : "Use"); - if (C.IsPlayer()) AppearanceMenu.push("WearRandom"); - if (C.IsPlayer()) AppearanceMenu.push("DialogPermissionMode"); - if (C.FocusGroup.AllowNone) AppearanceMenu.push("Naked"); - if (Item && DialogCanColor(C, Item)) { - let ButtonName = ItemColorIsSimple(Item) ? "ColorPick" : "MultiColorPick"; - if (InventoryBlockedOrLimited(C, Item)) ButtonName += "Disabled"; - AppearanceMenu.push(ButtonName); - } - } - if (DialogInventory.length > 9) AppearanceMenu.push("Next"); - break; - } - - // Add the exit buttons - if (CharacterAppearanceMode !== "Color") { - if (!DialogItemPermissionMode) AppearanceMenu.push("Cancel"); - AppearanceMenu.push("Accept"); - } -} - -/** - * Checks if the appearance is locked for the current player - * @param {Character} C - The character to validate - * @param {String} GroupName - The group name to validate, can be "ALL" to check all groups - * @returns {boolean} - Return TRUE if the appearance group isn't blocked - */ -function AppearanceGroupAllowed(C, GroupName) { - return true; -} - -/** - * Run the character appearance selection screen. The function name is created dynamically. - * @returns {void} - Nothing - */ -function AppearanceRun() { - - // Draw the background and the character twice - var C = CharacterAppearanceSelection; - if (CharacterAppearanceHeaderTextTime < CommonTime() && CharacterAppearanceMode == "Cloth") - CharacterAppearanceHeaderText = ""; - if (CharacterAppearanceHeaderText == "") { - if (C.ID == 0) CharacterAppearanceHeaderText = TextGet("SelectYourAppearance"); - else CharacterAppearanceHeaderText = TextGet("SelectSomeoneAppearance").replace("TargetCharacterName", C.Name); - } - DrawCharacter(C, -600, -100 + 4 * C.HeightModifier, 4, false); - DrawCharacter(C, 750, 0, 1); - DrawText(CharacterAppearanceHeaderText, 400, 40, "White", "Black"); - - // When there is an extended item - if (DialogFocusItem != null) { - CommonDynamicFunction("Inventory" + DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Draw()"); - DrawButton(1885, 25, 90, 90, "", "White", "Icons/Exit.png"); - return; - } - - // As soon as the appearance mode changes, rebuild the menu button list - if (CharacterAppearanceMenuMode !== CharacterAppearanceMode) { - CharacterAppearanceMenuMode = CharacterAppearanceMode; - AppearanceMenuBuild(C); - } - - // Draw the menu buttons at the top - AppearanceMenuDraw(); - - // In regular dress-up mode - if (CharacterAppearanceMode == "") { - - // Creates buttons for all groups - for (let A = CharacterAppearanceOffset; A < AssetGroup.length && A < CharacterAppearanceOffset + CharacterAppearanceNumPerPage; A++) - if ((AssetGroup[A].Family == C.AssetFamily) && (AssetGroup[A].Category == "Appearance") && AssetGroup[A].AllowCustomize) { - if (AppearanceGroupAllowed(C, AssetGroup[A].Name)) { - const Item = InventoryGet(C, AssetGroup[A].Name); - const ButtonColor = WardrobeGroupAccessible(C, AssetGroup[A]) ? "White" : "#888"; - if (AssetGroup[A].AllowNone && (AssetGroup[A].Category == "Appearance") && (Item != null) && WardrobeGroupAccessible(C, AssetGroup[A])) - DrawButton(1210, 145 + (A - CharacterAppearanceOffset) * 95, 65, 65, "", ButtonColor, "Icons/Small/Naked.png", TextGet("StripItem")); - DrawBackNextButton(1300, 145 + (A - CharacterAppearanceOffset) * 95, 400, 65, AssetGroup[A].Description + ": " + CharacterAppearanceGetCurrentValue(C, AssetGroup[A].Name, "Description"), ButtonColor, "", - () => WardrobeGroupAccessible(C, AssetGroup[A]) ? CharacterAppearanceNextItem(C, AssetGroup[A].Name, false, true) : "", - () => WardrobeGroupAccessible(C, AssetGroup[A]) ? CharacterAppearanceNextItem(C, AssetGroup[A].Name, true, true) : "", - !WardrobeGroupAccessible(C, AssetGroup[A]), - AssetGroup[A].AllowNone || AppearancePreviewUseCharacter(AssetGroup[A]) ? 65 : null); - var Color = CharacterAppearanceGetCurrentValue(C, AssetGroup[A].Name, "Color"); - const ColorButtonText = ItemColorGetColorButtonText(Color); - const ColorButtonColor = ColorButtonText.startsWith("#") ? ColorButtonText : "#fff"; - const CanCycleColors = !!Item && WardrobeGroupAccessible(C, AssetGroup[A]) && (Item.Asset.ColorableLayerCount > 0 || Item.Asset.Group.ColorSchema.length > 1) && !InventoryBlockedOrLimited(C, Item); - const CanPickColor = CanCycleColors && AssetGroup[A].AllowColorize; - const ColorIsSimple = ItemColorIsSimple(Item); - DrawButton(1725, 145 + (A - CharacterAppearanceOffset) * 95, 160, 65, ColorButtonText, CanCycleColors ? ColorButtonColor : "#aaa", null, null, !CanCycleColors); - DrawButton(1910, 145 + (A - CharacterAppearanceOffset) * 95, 65, 65, "", CanPickColor ? "#fff" : "#aaa", CanPickColor ? ColorIsSimple ? "Icons/Color.png" : "Icons/MultiColor.png" : "Icons/ColorBlocked.png", null, !CanPickColor); - } else DrawText(AssetGroup[A].Description + " " + TextGet("OwnerBlock"), 1600, 177 + (A - CharacterAppearanceOffset) * 95, "White", "Silver"); - } - } - - // In wardrobe mode - if (CharacterAppearanceMode == "Wardrobe") { - - // Draw the wardrobe controls - DrawText(CharacterAppearanceWardrobeText, 1645, 220, "White", "Gray"); - ElementPosition("InputWardrobeName", 1645, 315, 690); - - // Draw 6 wardrobe options - for (let W = CharacterAppearanceWardrobeOffset; W < Player.Wardrobe.length && W < CharacterAppearanceWardrobeOffset + 6; W++) { - DrawButton(1300, 430 + (W - CharacterAppearanceWardrobeOffset) * 95, 500, 65, "", "White", ""); - DrawTextFit((W + 1).toString() + (W < 9 ? ": " : ": ") + Player.WardrobeCharacterNames[W], 1550, 463 + (W - CharacterAppearanceWardrobeOffset) * 95, 496, "Black"); - DrawButton(1820, 430 + (W - CharacterAppearanceWardrobeOffset) * 95, 160, 65, "Save", "White", ""); - } - - } - - // In item coloring mode - if (CharacterAppearanceMode == "Color") { - // Leave the color picker if the item is gone. - if (!InventoryGet(CharacterAppearanceSelection, CharacterAppearanceColorPickerGroupName)) ItemColorCancelAndExit(); - // Draw the color picker - ItemColorDraw(CharacterAppearanceSelection, CharacterAppearanceColorPickerGroupName, 1200, 25, 775, 950, true); - } - - // In cloth selection mode - if (CharacterAppearanceMode == "Cloth") { - // Prepares a 3x3 square of clothes to present all the possible options - let X = 1250; - let Y = 125; - for (let I = DialogInventoryOffset; (I < DialogInventory.length) && (I < DialogInventoryOffset + 9); I++) { - const Item = DialogInventory[I]; - const Hover = MouseIn(X, Y, 225, 275) && !CommonIsMobile; - const Background = AppearanceGetPreviewImageColor(C, Item, Hover); - - if (Item.Hidden) { - DrawPreviewBox(X, Y, "Icons/HiddenItem.png", Item.Asset.Description, { Background }); - } else if (AppearancePreviewUseCharacter(C.FocusGroup)) { - const Z = C.FocusGroup.PreviewZone; - const PreviewCanvas = DrawCharacterSegment(AppearancePreviews[I], Z[0], Z[1], Z[2], Z[3]); - DrawCanvasPreview(X, Y, PreviewCanvas, Item.Asset.Description, { Background, Vibrating: Item.Vibrating, Icons: Item.Icons }); - } else { - DrawAssetPreview(X, Y, Item.Asset, { Background, Vibrating: Item.Vibrating, Icons: Item.Icons }); - } - - setButton(X, Y); - X = X + 250; - if (X > 1800) { - X = 1250; - Y = Y + 300; - } - } - } -} - -/** - * Calculates the background color of the preview image for and item - * @param {Character} C - The character whose appearance we are viewing - * @param {DialogInventoryItem} item - The item to calculate the color for - * @param {boolean} hover - Whether or not the item is currently hovering over the preview image - * @returns {string} - A CSS color string determining the color that the preview icon should be drawn in - */ -function AppearanceGetPreviewImageColor(C, item, hover) { - if (DialogItemPermissionMode && C.ID === 0) { - let permission = "green"; - if (InventoryIsPermissionBlocked(C, item.Asset.Name, item.Asset.Group.Name)) permission = "red"; - else if (InventoryIsPermissionLimited(C, item.Asset.Name, item.Asset.Group.Name)) permission = "amber"; - return item.Worn ? "gray" : AppearancePermissionColors[permission][hover ? 1 : 0]; - } else { - const Unusable = item.SortOrder.startsWith(DialogSortOrder.Unusable.toString()) - || item.SortOrder.startsWith(DialogSortOrder.TargetFavoriteUnusable.toString()) - || item.SortOrder.startsWith(DialogSortOrder.PlayerFavoriteUnusable.toString()); - const Blocked = item.SortOrder.startsWith(DialogSortOrder.Blocked.toString()); - if (hover && !Blocked) return "cyan"; - else if (item.Worn) return "pink"; - else if (Blocked) return "red"; - else if (Unusable) return "gray"; - else if ((item.Craft != null) && (item.Craft.Name != null)) return "#FFFFAF"; - else return "white"; - } -} - -/** - * Draw the top-row menu buttons for the appearance screen - * @returns {void} - Nothing - */ -function AppearanceMenuDraw() { - const X = 2000 - AppearanceMenu.length * 117; - for (let B = 0; B < AppearanceMenu.length; B++) { - const ButtonName = AppearanceMenu[B].replace(/Disabled$/, ""); - const ButtonSuffix = AppearanceMenu[B] === "Character" && !AppearanceUseCharacterInPreviewsSetting ? "Off" : ""; - const ButtonColor = DialogGetMenuButtonColor(AppearanceMenu[B]); - const ButtonDisabled = DialogIsMenuButtonDisabled(AppearanceMenu[B]); - DrawButton(X + 117 * B, 25, 90, 90, "", ButtonColor, "Icons/" + ButtonName + ButtonSuffix + ".png", TextGet(AppearanceMenu[B]), ButtonDisabled); - } -} - -/** - * Create a list of characters with different items from the group applied, to use as the preview images - * @param {Character} C - The character that the dialog inventory has been loaded for - * @param {boolean} buildCanvases - Determines whether the preview canvases need to be (re)built, e.g. for the initial load or due to an appearance change - * @returns {void} - Nothing - */ -function AppearancePreviewBuild(C, buildCanvases) { - AppearancePreviews = []; - if (AppearancePreviewUseCharacter(C.FocusGroup) && DialogInventory) { - // Create a copy of the character appearance without items - const baseAppearance = buildCanvases ? C.Appearance.filter(A => A.Asset.Group.Category === "Appearance") : null; - // If the group being viewed is underwear, remove outer clothes - if (baseAppearance && (C.FocusGroup.Underwear || C.FocusGroup.Name.startsWith("Suit"))) { - for (let A = baseAppearance.length - 1; A >= 0; A--) { - let assetGroup = baseAppearance[A].Asset.Group; - if (assetGroup.Clothing && !assetGroup.Underwear && !assetGroup.BodyCosplay) { - baseAppearance.splice(A, 1); - } - } - } - // Add each preview character to the list, building their canvas if necessary - DialogInventory.forEach(item => { - let PreviewChar = CharacterLoadSimple("AppearancePreview-" + item.Asset.Name); - if (buildCanvases) { - PreviewChar.Appearance = Array.from(baseAppearance); - CharacterAppearanceSetItem(PreviewChar, item.Asset.Group.Name, item.Asset, null, null, null, false); - CharacterRefresh(PreviewChar, false); - } - AppearancePreviews.push(PreviewChar); - }); - } -} - -/** - * Delete all characters created for preview images - * @returns {void} - Nothing - */ -function AppearancePreviewCleanup() { - AppearancePreviews = []; - for (let C = Character.length - 1; C >= 0; C--) { - if (Character[C].AccountName.startsWith("AppearancePreview-")) { - CharacterDelete(Character[C].AccountName); - } - } -} - -/** - * Returns whether the the 3x3 grid "Cloth" appearance mode should include the character in the preview images - * @param {AssetGroup} assetGroup - The group to check - * @returns {boolean} - If TRUE the previews will be drawn with the character - */ -function AppearancePreviewUseCharacter(assetGroup) { - return AppearanceUseCharacterInPreviewsSetting && assetGroup && typeof assetGroup.PreviewZone !== "undefined"; -} - -/** - * Sets an item in the character appearance - * @param {Character} C - The character whose appearance should be changed - * @param {string} Group - The name of the corresponding groupr for the item - * @param {Asset|null} ItemAsset - The asset collection of the item to be changed - * @param {string|string[]} [NewColor] - The new color (as "#xxyyzz" hex value) for that item - * @param {number} [DifficultyFactor=0] - The difficulty, on top of the base asset difficulty, that should be assigned - * to the item - * @param {number} [ItemMemberNumber=-1] - The member number of the player adding the item - defaults to -1 - * @param {boolean} [Refresh=true] - Determines, wether the character should be redrawn after the item change - * @returns {void} - Nothing - */ -function CharacterAppearanceSetItem(C, Group, ItemAsset, NewColor, DifficultyFactor, ItemMemberNumber, Refresh) { - // Sets the difficulty factor - if (DifficultyFactor == null) DifficultyFactor = 0; - - // Removes the previous if we need to - const ID = CharacterAppearanceGetCurrentValue(C, Group, "ID"); - var ItemColor; - if (ID != "None") { - if (CurrentScreen == "Appearance") { - ItemColor = CharacterAppearanceGetCurrentValue(C, Group, "Color"); - if ((ItemColor == null || ItemColor == "Default" || ItemColor == "None") && ItemAsset != null && ItemAsset.DefaultColor != null) ItemColor = ItemAsset.DefaultColor; - } - C.Appearance.splice(ID, 1); - } else if (ItemAsset != null) ItemColor = ItemAsset.DefaultColor ? ItemAsset.DefaultColor : ItemAsset.Group.ColorSchema[0]; - - // Add the new item to the character appearance - if (ItemAsset != null) { - /** @type {Item} */ - const NA = { - Asset: ItemAsset, - Difficulty: parseInt((ItemAsset.Difficulty == null) ? 0 : ItemAsset.Difficulty) + parseInt(DifficultyFactor), - Color: ((NewColor == null) ? ItemColor : NewColor), - Property: ItemAsset.CharacterRestricted ? {ItemMemberNumber: ItemMemberNumber == null ? -1 : ItemMemberNumber} : undefined - }; - C.Appearance.push(NA); - } - - // Draw the character canvas and calculate the effects on the character - if (Refresh == null || Refresh) CharacterRefresh(C, false); - -} - -/** - * Cycle in the appearance assets to find the next item in a group and wear it - * @param {Character} C - The character whose assets are used - * @param {string} Group - The name of the group to cycle - * @param {boolean} [Forward=true] - Sets the direction of the cycling - * @param {boolean} [Description = false] - Determines, wether the description of the item should be returned or not. - * @returns {string} - The Description of the worn item - */ -function CharacterAppearanceNextItem(C, Group, Forward, Description) { - var Current = CharacterAppearanceGetCurrentValue(C, Group, "Name"); - var CAA = CharacterAppearanceAssets.filter(a => a.Group.Name == Group); - if (Description == true && CAA.length == 0) return "None"; - if (Current != "None") { - // If we found the item we move forward or backward if possible - var I = CAA.findIndex(a => a.Name == Current); - if (I >= 0) { - if (Forward == null || Forward) { - if (I + 1 < CAA.length) { - if (Description == true) return CAA[I + 1].Description; - CharacterAppearanceSetItem(C, Group, CAA[I + 1]); - return; - } - } else { - if (I - 1 >= 0) { - if (Description == true) return CAA[I - 1].Description; - CharacterAppearanceSetItem(C, Group, CAA[I - 1]); - return; - } - } - } - } - // Since we didn't found any item, we pick "None" if we had an item or the first or last item - var AG = AssetGroup.find(g => g.Name == Group); - if (Current != "None" && AG != null && AG.AllowNone) { - if (Description == true) return "None"; - CharacterAppearanceSetItem(C, Group, null); - } else if (Forward == null || Forward) { - if (Description == true) return CAA[0].Description; - CharacterAppearanceSetItem(C, Group, CAA[0]); - } else { - if (Description == true) return CAA[CAA.length - 1].Description; - CharacterAppearanceSetItem(C, Group, CAA[CAA.length - 1]); - } - if (Description == true) return "None"; -} - -/** - * Find the next color for the item - * @param {Character} C - The character whose items are cycled - * @param {string} Group - The name of the group for which we are color cycling - * @returns {void} - Nothing - */ -function CharacterAppearanceNextColor(C, Group) { - - // For each item, we first find the item and pick the next one - let Color = CharacterAppearanceGetCurrentValue(C, Group, "Color"); - const G = AssetGroupGet(C.AssetFamily, Group); - if (!G) return; - - // Finds the next color - let Pos = G.ColorSchema.indexOf(Color) + 1; - if ((Pos < 0) || (Pos >= G.ColorSchema.length)) Pos = 0; - Color = G.ColorSchema[Pos]; - - // Sets the color - for (Pos = 0; Pos < C.Appearance.length; Pos++) - if ((C.Appearance[Pos].Asset.Group.Name == Group) && (C.Appearance[Pos].Asset.Group.Family == C.AssetFamily)) { - if (Color == "Default" && C.Appearance[Pos].Asset.DefaultColor != null) Color = C.Appearance[Pos].Asset.DefaultColor; - C.Appearance[Pos].Color = Color; - } - - // Reloads the character canvas - CharacterLoadCanvas(C); -} - -/** - * Moves the offset to get new character appearance items - * @param {Character} C - The character whose visible groups are used for calculation - * @param {number} Move - The amount the next asset group should be moved before it is displayed - * @returns {void} - Nothing - */ -function CharacterAppearanceMoveOffset(C, Move) { - - // Calculate the new offset - CharacterAppearanceOffset = CharacterAppearanceOffset + Move; - if (CharacterAppearanceOffset >= AssetGroup.length) CharacterAppearanceOffset = 0; - if ((AssetGroup[CharacterAppearanceOffset].Category != "Appearance") || !AssetGroup[CharacterAppearanceOffset].AllowCustomize) CharacterAppearanceOffset = 0; - if (CharacterAppearanceOffset < 0) CharacterAppearanceOffset = Math.floor(AssetGroup.length / CharacterAppearanceNumPerPage) * CharacterAppearanceNumPerPage; - -} - -/** - * Sets the color for a specific group - * @param {Character} C - The character whose item group should be colored - * @param {string} Color - The color (in the format "#rrggbb") to be applied to the group - * @param {string} Group - The name of the group, whose color should be changed - * @returns {void} - Nothing - */ -function CharacterAppearanceSetColorForGroup(C, Color, Group) { - for (let A = 0; A < C.Appearance.length; A++) - if (C.Appearance[A].Asset.Group.Name == Group) - C.Appearance[A].Color = Color; - CharacterLoadCanvas(C); -} - -/** - * Handle the clicks in the character appearance selection screen. The function name is created dynamically. - * @returns {void} - Nothing - */ -function AppearanceClick() { - var C = CharacterAppearanceSelection; - - ClearButtons(); - // When there is an extended item - if (DialogFocusItem != null) { - CommonDynamicFunction("Inventory" + DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Click()"); - } - - // In item coloring mode - else if (CharacterAppearanceMode == "Color") { - ItemColorClick(CharacterAppearanceSelection, CharacterAppearanceColorPickerGroupName, 1200, 25, 775, 950, true); - } - - // Selecting a button in the row at the top - else if (MouseYIn(25, 90)) AppearanceMenuClick(C); - - // In regular dress-up mode - else if (CharacterAppearanceMode == "") { - - // If we must remove/restore to default the item - if ((MouseX >= 1210) && (MouseX < 1275) && (MouseY >= 145) && (MouseY < 975)) - for (let A = CharacterAppearanceOffset; A < AssetGroup.length && A < CharacterAppearanceOffset + CharacterAppearanceNumPerPage; A++) - if ((AssetGroup[A].Family == C.AssetFamily) && (AssetGroup[A].Category == "Appearance") && WardrobeGroupAccessible(C, AssetGroup[A]) && AssetGroup[A].AllowNone && (InventoryGet(C, AssetGroup[A].Name) != null)) - if ((MouseY >= 145 + (A - CharacterAppearanceOffset) * 95) && (MouseY <= 210 + (A - CharacterAppearanceOffset) * 95)) - if (AppearanceGroupAllowed(C, AssetGroup[A].Name)) { - InventoryRemove(C, AssetGroup[A].Name, false); - CharacterRefresh(C, false); - } - - // If we must enter the cloth selection mode - if ((MouseX >= 1300) && (MouseX < 1700) && (MouseY >= 145) && (MouseY < 975)) { - C.FocusGroup = null; - for (let A = CharacterAppearanceOffset; A < AssetGroup.length && A < CharacterAppearanceOffset + CharacterAppearanceNumPerPage; A++) - if ((AssetGroup[A].Family == C.AssetFamily) && (AssetGroup[A].Category == "Appearance") && WardrobeGroupAccessible(C, AssetGroup[A])) - if (MouseYIn(145 + (A - CharacterAppearanceOffset) * 95, 65)) - if (AppearanceGroupAllowed(C, AssetGroup[A].Name)) { - if (!AssetGroup[A].AllowNone && !AppearancePreviewUseCharacter(AssetGroup[A])) { - CharacterAppearanceNextItem(C, AssetGroup[A].Name, MouseX > 1500); - } - else { - if (MouseXIn(1300, 65)) CharacterAppearanceNextItem(C, AssetGroup[A].Name, false); - else if (MouseXIn(1635, 65)) CharacterAppearanceNextItem(C, AssetGroup[A].Name, true); - else { - // Open the clothing group screen - C.FocusGroup = AssetGroup[A]; - DialogInventoryBuild(C, null, true); - CharacterAppearanceCloth = InventoryGet(C, C.FocusGroup.Name); - CharacterAppearanceMode = "Cloth"; - return; - } - } - } - - } - - // If we must switch to the next color in the assets - if ((MouseX >= 1725) && (MouseX < 1885) && (MouseY >= 145) && (MouseY < 975)) - for (let A = CharacterAppearanceOffset; A < AssetGroup.length && A < CharacterAppearanceOffset + CharacterAppearanceNumPerPage; A++) { - const Item = InventoryGet(C, AssetGroup[A].Name); - if ((AssetGroup[A].Family == C.AssetFamily) && (AssetGroup[A].Category == "Appearance") && WardrobeGroupAccessible(C, AssetGroup[A]) && Item && (Item.Asset.ColorableLayerCount > 0 || Item.Asset.Group.ColorSchema.length > 1) && !InventoryBlockedOrLimited(C, Item)) - if ((MouseY >= 145 + (A - CharacterAppearanceOffset) * 95) && (MouseY <= 210 + (A - CharacterAppearanceOffset) * 95)) - if (AppearanceGroupAllowed(C, AssetGroup[A].Name)) - CharacterAppearanceNextColor(C, AssetGroup[A].Name); - } - - // If we must open the color panel - if (MouseIn(1910, 145, 65, 830)) - for (let A = CharacterAppearanceOffset; A < AssetGroup.length && A < CharacterAppearanceOffset + CharacterAppearanceNumPerPage; A++) { - const Item = InventoryGet(C, AssetGroup[A].Name); - if ((AssetGroup[A].Family == C.AssetFamily) && (AssetGroup[A].Category == "Appearance") && WardrobeGroupAccessible(C, AssetGroup[A]) && AssetGroup[A].AllowColorize && Item && Item.Asset.ColorableLayerCount > 0 && !InventoryBlockedOrLimited(C, Item)) - if ((MouseY >= 145 + (A - CharacterAppearanceOffset) * 95) && (MouseY <= 210 + (A - CharacterAppearanceOffset) * 95)) - if (AppearanceGroupAllowed(C, AssetGroup[A].Name)) - AppearanceItemColor(C, Item, AssetGroup[A].Name, ""); - } - return; - - } - - - - // In cloth selection mode - else if (CharacterAppearanceMode == "Cloth") { - - // Prepares a 3x3 square of clothes to present all the possible options - var X = 1250; - var Y = 125; - for (let I = DialogInventoryOffset; (I < DialogInventory.length) && (I < DialogInventoryOffset + 9); I++) { - if ((MouseX >= X) && (MouseX < X + 225) && (MouseY >= Y) && (MouseY < Y + 275)) { - var Item = DialogInventory[I]; - const CurrentItem = InventoryGet(C, C.FocusGroup.Name); - const worn = (CurrentItem && (CurrentItem.Asset.Name == Item.Asset.Name)); - - - if (InventoryBlockedOrLimited(C, Item)) return; - if (InventoryAllow(C, Item.Asset)) { - if (worn && CurrentItem.Asset.Extended) { - DialogExtendItem(CurrentItem); - } else { - CharacterAppearanceSetItem(C, C.FocusGroup.Name, DialogInventory[I].Asset); - DialogInventoryBuild(C, DialogInventoryOffset); - AppearanceMenuBuild(C); - } - } - return; - } - X = X + 250; - if (X > 1800) { - X = 1250; - Y = Y + 300; - } - } - - } -} - -/** - * Handles the Click events for the top-row buttons in the Appearance screen - * @param {Character} C - The character the appearance is being set for - * @returns {void} - Nothing - */ -function AppearanceMenuClick(C) { - const X = 2000 - AppearanceMenu.length * 117; - for (let B = 0; B < AppearanceMenu.length; B++) { - if (MouseXIn(X + 117 * B, 90)) { - let Button = AppearanceMenu[B]; - switch (CharacterAppearanceMode) { - case "": - if (Button === "Reset") CharacterAppearanceSetDefault(C); - if (Button === "Wardrobe") CharacterAppearanceWardrobeLoad(C); - if (Button === "WearRandom") CharacterAppearanceFullRandom(C, true); - if (Button === "Random") CharacterAppearanceFullRandom(C); - if (Button === "Naked") CharacterAppearanceStripLayer(C); - if (Button === "Character") AppearanceUseCharacterInPreviewsSetting = !AppearanceUseCharacterInPreviewsSetting; - if (Button === "Next") CharacterAppearanceMoveOffset(C, CharacterAppearanceNumPerPage); - if (Button === "Cancel") CharacterAppearanceExit(C); - if (Button === "Accept") CharacterAppearanceReady(C); - if (Button === "WardrobeDisabled") CharacterAppearanceHeaderText = TextGet("WardrobeDisabled"); - break; - case "Wardrobe": - switch (Button) { - case "Prev": - CharacterAppearanceWardrobeOffset -= 6; - if (CharacterAppearanceWardrobeOffset < 0) CharacterAppearanceWardrobeOffset = Math.max(0, Player.Wardrobe.length - 6); - break; - case "Next": - CharacterAppearanceWardrobeOffset += 6; - if (CharacterAppearanceWardrobeOffset >= Player.Wardrobe.length) CharacterAppearanceWardrobeOffset = 0; - break; - case "Naked": - CharacterAppearanceStripLayer(C); - break; - case "Cancel": - CharacterAppearanceRestore(C, CharacterAppearanceInProgressBackup); - CharacterRefresh(C, false); - CharacterAppearanceWardrobeName = ""; - CharacterAppearanceInProgressBackup = null; - AppearanceExit(); - break; - case "Accept": - CharacterAppearanceWardrobeName = ElementValue("InputWardrobeName"); - CharacterAppearanceInProgressBackup = null; - AppearanceExit(); - break; - } - break; - case "Cloth": - // Extends the current item - if (Button === "Use") { - var Item = InventoryGet(C, C.FocusGroup.Name); - if (Item && Item.Asset.Extended) DialogExtendItem(Item); - } - - // Picks and colors a random item from the group - if (Button === "WearRandom") InventoryWearRandom(C, C.FocusGroup.Name, null, true, true); - - // Opens permission mode - if (Button === "DialogPermissionMode") { - DialogItemPermissionMode = true; - DialogInventoryBuild(C); - } - - // Strips the current item - if (Button === "Naked") CharacterAppearanceSetItem(C, C.FocusGroup.Name, null); - - // Jumps to the cloth page - if (Button === "Next") { - DialogInventoryOffset = DialogInventoryOffset + 9; - if (DialogInventoryOffset >= DialogInventory.length) DialogInventoryOffset = 0; - } - - // Opens the color picker - if (Button === "ColorPick" || Button === "MultiColorPick") { - let Item = InventoryGet(C, C.FocusGroup.Name); - AppearanceItemColor(C, Item, C.FocusGroup.Name, "Cloth"); - } - - // Cancels the selected cloth and reverts it back - if (Button === "Cancel") { - CharacterAppearanceSetItem(C, C.FocusGroup.Name, ((CharacterAppearanceCloth != null) && (CharacterAppearanceCloth.Asset != null)) ? CharacterAppearanceCloth.Asset : null, ((CharacterAppearanceCloth != null) && (CharacterAppearanceCloth.Color != null)) ? CharacterAppearanceCloth.Color : null); - if (CharacterAppearanceCloth != null && CharacterAppearanceCloth.Property != null) { - InventoryGet(C, C.FocusGroup.Name).Property = CharacterAppearanceCloth.Property; - CharacterRefresh(C, false); - } - if (AppearancePreviewUseCharacter(C.FocusGroup)) AppearancePreviewCleanup(); - AppearanceExit(); - } - - // Accepts the new selection - if (Button === "Accept") { - if (DialogItemPermissionMode) { - DialogItemPermissionMode = false; - AppearanceMenuBuild(C); - DialogInventoryBuild(C); - } - else { - if (AppearancePreviewUseCharacter(C.FocusGroup)) AppearancePreviewCleanup(); - AppearanceExit(); - } - } - - // Rebuild the menu buttons as selecting a button here can change what should appear - AppearanceMenuBuild(C); - - break; - } - } - } -} - -/** - * Handle the exiting of the appearance screen. The function name is created dynamically. - * @returns {void} - Nothing - */ -function AppearanceExit() { - // We quit the extended item menu instead, if applicable. - if (CharacterAppearanceMode == "Cloth" && DialogFocusItem) { - DialogLeaveFocusItem(); - return; - } - - if (CharacterAppearanceMode === "Color") { - return ItemColorExitClick(); - } - - if (CharacterAppearanceMode != "") { - CharacterAppearanceMode = ""; - CharacterAppearanceHeaderText = ""; - ElementRemove("InputWardrobeName"); - } else CharacterAppearanceExit(CharacterAppearanceSelection); - - CharacterAppearanceSelection.FocusGroup = null; -} - -/** - * Restore the characters appearance backup, if the exit button is clicked - * @param {Character} C - The character, whose appearance backup should be used - * @returns {void} - Nothing - */ -function CharacterAppearanceExit(C) { - ElementRemove("InputWardrobeName"); - CharacterAppearanceMode = ""; - CharacterAppearanceRestore(C, CharacterAppearanceBackup); - CharacterLoadCanvas(C); - if (C.AccountName != "") CommonSetScreen(CharacterAppearanceReturnModule, CharacterAppearanceReturnRoom); - else CommonSetScreen("Character", "Login"); - CharacterAppearanceReturnRoom = "MainHall"; - CharacterAppearanceReturnModule = "Room"; - CharacterAppearanceHeaderText = ""; - AppearancePreviewCleanup(); - CharacterAppearanceWardrobeName = ""; - if (Player.VisualSettings && AppearanceUseCharacterInPreviewsSetting !== Player.VisualSettings.UseCharacterInPreviews) { - Player.VisualSettings.UseCharacterInPreviews = AppearanceUseCharacterInPreviewsSetting; - ServerAccountUpdate.QueueData({ VisualSettings: Player.VisualSettings }); - } -} - -/** - * Handle the confirmation click in the wardrobe screen. - * @param {Character} C - The character who has been changed - * @returns {void} - Nothing - */ -function CharacterAppearanceReady(C) { - // Exits wardrobe mode - ElementRemove("InputWardrobeName"); - CharacterAppearanceMode = ""; - CharacterAppearanceHeaderText = ""; - - // If there's no error, we continue to the login or main hall if already logged - if (C.AccountName != "") { - CommonSetScreen(CharacterAppearanceReturnModule, CharacterAppearanceReturnRoom); - CharacterAppearanceReturnRoom = "MainHall"; - CharacterAppearanceReturnModule = "Room"; - if (Player.VisualSettings && AppearanceUseCharacterInPreviewsSetting !== Player.VisualSettings.UseCharacterInPreviews) { - Player.VisualSettings.UseCharacterInPreviews = AppearanceUseCharacterInPreviewsSetting; - ServerAccountUpdate.QueueData({ VisualSettings: Player.VisualSettings }); - } - } else CommonSetScreen("Character", "Creation"); - -} - -/** - * Copy the appearance from a character to another - * @param {Character} FromC - The character to copy from - * @param {Character} ToC - The character to copy to - */ -function CharacterAppearanceCopy(FromC, ToC) { - - // Removes any previous appearance asset - for (let A = ToC.Appearance.length - 1; A >= 0; A--) - if ((ToC.Appearance[A].Asset != null) && (ToC.Appearance[A].Asset.Group.Category == "Appearance")) { - ToC.Appearance.splice(A, 1); - } - - // Adds all appearance assets from the first character to the second - for (let A = 0; A < FromC.Appearance.length; A++) - if ((FromC.Appearance[A].Asset != null) && (FromC.Appearance[A].Asset.Group.Category == "Appearance")) - ToC.Appearance.push(FromC.Appearance[A]); - - // Refreshes the second character and saves it if it's the player - CharacterRefresh(ToC); - if (ToC.ID == 0) ServerPlayerAppearanceSync(); - -} - -/** - * Loads the appearance editing screen for a character - * @param {Character} C - The character for whom the appearance screen should be loaded - * @returns {void} - nothing - */ -function CharacterAppearanceLoadCharacter(C) { - CharacterAppearanceSelection = C; - CharacterAppearanceReturnRoom = CurrentScreen; - CharacterAppearanceReturnModule = CurrentModule; - CommonSetScreen("Character", "Appearance"); -} - -/** - * Load wardrobe menu in appearance selection screen - * @param {Character} C - The character whose wardrobe should be loaded - * @returns {void} - Nothing - */ -function CharacterAppearanceWardrobeLoad(C) { - if ((Player.Wardrobe == null) || (Player.Wardrobe.length < 12)) - WardrobeLoadCharacters(true); - else - WardrobeLoadCharacterNames(); - ElementCreateInput("InputWardrobeName", "text", CharacterAppearanceWardrobeName || C.Name, "20"); - CharacterAppearanceMode = "Wardrobe"; - // Always open the wardrobe on the first page - CharacterAppearanceWardrobeOffset = 0; - CharacterAppearanceWardrobeText = TextGet("WardrobeNameInfo"); - CharacterAppearanceInProgressBackup = CharacterAppearanceStringify(C); -} - -/** - * Serialises a character's appearance into an abbreviated string for backup purposes - * @param {Character} C - The character whose appearance should be serialised - * @returns {string} - A serialised version of the character's current appearance - */ -function CharacterAppearanceStringify(C) { - return AppearanceItemStringify(C.Appearance); -} - -function AppearanceItemStringify(Item) { - return JSON.stringify(Item, (key, value) => { - if (key === "Asset") { - return value.Group.Family + "/" + value.Group.Name + "/" + value.Name; - } - return value; - }); -} - -/** - * Restores a character's appearance from a serialised string generated by CharacterAppearanceStringify - * @param {Character} C - The character whose appearance should be restored - * @param {string} backup - The serialised appearance to restore - * @returns {void} - Nothing - */ -function CharacterAppearanceRestore(C, backup) { - C.Appearance = AppearanceItemParse(backup); -} - -function AppearanceItemParse(stringified) { - return JSON.parse(stringified, (key, value) => { - if (key === "Asset") { - const FGA = value.split("/"); - return AssetGet(FGA[0], FGA[1], FGA[2]); - } - return value; - }); -} - -/** - * Opens the color picker for a selected item - * @param {Character} C - The character the appearance is being changed for - * @param {Item} Item - The currently selected item - * @param {string} AssetGroup - The focused group - * @param {string} CurrentMode - The mode to revert to on exiting the color picker - * @returns {void} - */ -function AppearanceItemColor(C, Item, AssetGroup, CurrentMode) { - // Keeps the previous color in backup and creates a text box to enter the color - CharacterAppearanceMode = "Color"; - CharacterAppearanceColorPickerGroupName = AssetGroup; - CharacterAppearanceColorPickerBackup = CharacterAppearanceGetCurrentValue(C, CharacterAppearanceColorPickerGroupName, "Color"); - ItemColorLoad(C, Item, 1200, 25, 775, 950, true); - ItemColorOnExit(() => { - CharacterAppearanceMode = CurrentMode; - if (AppearancePreviewUseCharacter(C.FocusGroup)) { - const item = InventoryGet(C, C.FocusGroup.Name); - const isDifferentColor = item && CharacterAppearanceColorPickerBackup !== item.Color; - const isRemoved = !item && CharacterAppearanceColorPickerBackup !== "None"; - if (isDifferentColor || isRemoved) { - AppearancePreviewBuild(C, true); - } - } - }); -} - -/** - * Combine two sets of appearance changes from the same base, favouring the newer changes where conflicting - * @param {Item[]} BaseAppearance - The previous appearance before either of the other two sets of changes were made - * @param {Item[]} PrevAppearance - The first set of appearance changes - * @param {Item[]} NewAppearance - The second set of appearance changes, overriding any conflicts with the first - * @returns {Item[]} - The final merged appearance - */ -function CharacterAppearanceResolveAppearance(BaseAppearance, PrevAppearance, NewAppearance) { - for (const group of AssetGroup) { - if (group.Category == "Appearance") { - const baseItem = BaseAppearance.find(A => A.Asset.Group.Name == group.Name); - const prevItem = PrevAppearance.find(A => A.Asset.Group.Name == group.Name); - const newItem = NewAppearance.find(A => A.Asset.Group.Name == group.Name); - const resolvedItem = CharacterAppearanceResolveItem(baseItem, prevItem, newItem); - - // Remove and replace the group's item - PrevAppearance = PrevAppearance.filter(A => A.Asset.Group.Name !== group.Name); - if (resolvedItem) { - PrevAppearance = PrevAppearance.concat(resolvedItem); - } - } - } - - return PrevAppearance; -} - -/** - * Select from two potential changes to an item, preferring the newer if different to the original item - * @param {Item} BaseItem - The item before any changes were made - * @param {Item} PrevItem - The first item change - * @param {Item} NewItem - The second item change - * @return {Item} - The item to keep - */ -function CharacterAppearanceResolveItem(BaseItem, PrevItem, NewItem) { - if (BaseItem == null) { - // Add the new item if added, otherwise use the previous item whether one was added or still empty - return NewItem || PrevItem; - } else if (NewItem == null) { - // Remove the item if the newest change removed it - return NewItem; - } else if (AppearanceItemStringify(BaseItem) != AppearanceItemStringify(NewItem)) { - // Use the newest item if changed from the original at all. In future could possibly compare/merge settings instead - return NewItem; - } else { - // Otherwise keep the previous change - return PrevItem; - } -} - -/** - * Merge the incoming appearance changes from the online sync to the currently selected appearance - * @param {Character} C - The character with changes to merge - * @param {Item[]} currentAppearance - The appearance before the sync's changes are applied - * @returns {void} - Nothing - */ -function CharacterAppearanceResolveSync(C, currentAppearance) { - if (CurrentScreen == "Appearance" && C.ID == CharacterAppearanceSelection.ID) { - const baseAppearance = AppearanceItemParse(CharacterAppearanceBackup); - - // Update the individual clothing item to revert to upon exiting the group's menu - if (CharacterAppearanceCloth != null) { - const baseCloth = baseAppearance.find(A => A.Asset.Group.Name == CharacterAppearanceCloth.Asset.Group.Name); - const incomingCloth = C.Appearance.find(A => A.Asset.Group.Name == CharacterAppearanceCloth.Asset.Group.Name); - CharacterAppearanceCloth = CharacterAppearanceResolveItem(baseCloth, incomingCloth, CharacterAppearanceCloth); - } - - // Update the appearance backup to use the synced version - CharacterAppearanceBackup = AppearanceItemStringify(C.Appearance); - // Merge the synced appearance with the ongoing appearance edits - C.Appearance = CharacterAppearanceResolveAppearance(baseAppearance, C.Appearance, currentAppearance); - } -} diff --git a/Scripts/Appearance.ts b/Scripts/Appearance.ts new file mode 100644 index 000000000..bcb424361 --- /dev/null +++ b/Scripts/Appearance.ts @@ -0,0 +1,118 @@ +let CharacterAppearancePreviousEmoticon = null; + +/** + * Resets the character to it's default appearance + */ +function CharacterAppearanceSetDefault(C: Character): void { + C.Appearance = []; + C.Pose = []; + C.Palette = ""; +} + +/** + * Removes all items that can be removed, making the character naked. Checks for a blocking of CosPlayItem removal. + */ +function CharacterAppearanceNaked(C: Character): void { + for (let A = C.Appearance.length - 1; A >= 0; A--) + if (C.Appearance[A].Model && !KDModelIsProtected(C.Appearance[A].Model)) + C.Appearance.splice(A, 1); +} + +/** + * Sets an item in the character appearance + * @param C - The character whose appearance should be changed + * @param Group - The name of the corresponding groupr for the item + * @param ItemAsset - The asset collection of the item to be changed + * @param NewColor - The new color (as "#xxyyzz" hex value) for that item + * @param DifficultyFactor - The difficulty, on top of the base asset difficulty, that should be assigned + * to the item + * @param ItemMemberNumber- The member number of the player adding the item - defaults to -1 + * @param Refresh - Determines, wether the character should be redrawn after the item change + */ +function CharacterAppearanceSetItem(C: Character, Group: string, ItemAsset: any, NewColor: string | string[], DifficultyFactor: number = 0, ItemMemberNumber: number = -1, Refresh: boolean = true): void {} + + +/** + * Serialises a character's appearance into an abbreviated string for backup purposes + * @param C - The character whose appearance should be serialised + * @returns A serialised version of the character's current appearance + */ +function CharacterAppearanceStringify(C: Character, metadata : KDOutfitMetadata): string { + return JSON.stringify({ + metadata: metadata, + appearance: AppearanceItemStringify(C.Appearance), + }); +} + +function AppearanceItemStringify(Item: any[]): string { + for (let r of Item) { + if (r.Model?.Filters) r.Filters = r.Model.Filters; + if (r.Model?.Properties) r.Properties = r.Model.Properties; + } + return JSON.stringify(Item, (key, value) => { + if (key === "Asset") { + return value.Group.Family + "/" + value.Group.Name + "/" + value.Name; + } + if (key === "Model") { + return value.Name; + } + return value; + }); +} + +/** + * Restores a character's appearance from a serialised string generated by CharacterAppearanceStringify + * @param C - The character whose appearance should be restored + * @param backup - The serialised appearance to restore + * @param clothesOnly - The serialised appearance to restore + */ +function CharacterAppearanceRestore(C: Character, backup: string, clothesOnly: boolean = false, noProtected: boolean = false): void { + let parsed = JSON.parse(LZString.decompressFromBase64(backup) || backup); + let newAppearance = AppearanceItemParse(parsed?.metadata ? parsed.appearance : backup); + if (!clothesOnly) { + C.Appearance = newAppearance; + return; + } + let finalAppearance = []; + for (let item of newAppearance) { + if (noProtected || !KDModelIsProtected(item.Model)) { + finalAppearance.push(item); + } + } + if (!noProtected) + for (let item of C.Appearance) { + if (KDModelIsProtected(item.Model)) { + finalAppearance.push(item); + } + } + C.Appearance = finalAppearance; +} + +function AppearanceItemParse(stringified: string): any[] { + let ret: any[] = JSON.parse(stringified, (key, value) => { + if (key === "Model" && ModelDefs[value]) { + return JSON.parse(JSON.stringify(ModelDefs[value])); + } + return value; + }); + + ret = ret.filter((elem) => { + return elem.Model != undefined && ModelDefs[elem.Model.Name] != undefined; + }); + + for (let r of ret) { + if (r.Filters && r.Model && r.Model.Name) r.Model.Filters = r.Filters; + if (r.Properties && r.Model && r.Model.Name) r.Model.Properties = r.Properties; + } + return ret; +} + + +function AppearanceCleanup(C: Character) { + for (let A = 0; A < C.Appearance.length; A++) { + if (!C.Appearance[A].Model || !ModelDefs[C.Appearance[A].Model.Name]) { + C.Appearance.splice(A, 1); + A -= 1; + } + } +} \ No newline at end of file diff --git a/Scripts/Asset.js b/Scripts/Asset.js deleted file mode 100644 index 5da4b4ff3..000000000 --- a/Scripts/Asset.js +++ /dev/null @@ -1,642 +0,0 @@ -//@ts-check -"use strict"; - -/** @type {Asset[]} */ -var Asset = []; -/** @type {AssetGroup[]} */ -var AssetGroup = []; -/** @type {Map} */ -var AssetMap = new Map(); -/** @type {Map} */ -var AssetGroupMap = new Map(); -/** @type {Pose[]} */ -var Pose = []; -/** @type {Map} */ -var AssetActivityMirrorGroups = new Map(); - -/** - * Adds a new asset group to the main list - * @param {IAssetFamily} Family - * @param {AssetGroupDefinition} GroupDef - * @returns {AssetGroup} - */ -function AssetGroupAdd(Family, GroupDef) { - /** @type {AssetGroup} */ - var A = { - Family: Family, - Name: GroupDef.Group, - Description: GroupDef.Group, - Asset: [], - ParentGroupName: (GroupDef.ParentGroup == null) ? "" : GroupDef.ParentGroup, - Category: (GroupDef.Category == null) ? "Appearance" : GroupDef.Category, - IsDefault: (GroupDef.Default == null) ? true : GroupDef.Default, - IsRestraint: (GroupDef.IsRestraint == null) ? false : GroupDef.IsRestraint, - AllowNone: (GroupDef.AllowNone == null) ? true : GroupDef.AllowNone, - AllowColorize: (GroupDef.AllowColorize == null) ? true : GroupDef.AllowColorize, - AllowCustomize: (GroupDef.AllowCustomize == null) ? true : GroupDef.AllowCustomize, - Random: (GroupDef.Random == null) ? true : GroupDef.Random, - ColorSchema: (GroupDef.Color == null) ? ["Default"] : GroupDef.Color, - ParentSize: (GroupDef.ParentSize == null) ? "" : GroupDef.ParentSize, - ParentColor: (GroupDef.ParentColor == null) ? "" : GroupDef.ParentColor, - Clothing: (GroupDef.Clothing == null) ? false : GroupDef.Clothing, - Underwear: (GroupDef.Underwear == null) ? false : GroupDef.Underwear, - BodyCosplay: (GroupDef.BodyCosplay == null) ? false : GroupDef.BodyCosplay, - Hide: GroupDef.Hide, - Block: GroupDef.Block, - Zone: GroupDef.Zone, - SetPose: GroupDef.SetPose, - AllowPose: Array.isArray(GroupDef.AllowPose) ? GroupDef.AllowPose : [], - AllowExpression: GroupDef.AllowExpression, - Effect: Array.isArray(GroupDef.Effect) ? GroupDef.Effect : [], - MirrorGroup: (GroupDef.MirrorGroup == null) ? "" : GroupDef.MirrorGroup, - RemoveItemOnRemove: (GroupDef.RemoveItemOnRemove == null) ? [] : GroupDef.RemoveItemOnRemove, - DrawingPriority: (GroupDef.Priority == null) ? AssetGroup.length : GroupDef.Priority, - DrawingLeft: (GroupDef.Left == null) ? 0 : GroupDef.Left, - DrawingTop: (GroupDef.Top == null) ? 0 : GroupDef.Top, - DrawingFullAlpha: (GroupDef.FullAlpha == null) ? true : GroupDef.FullAlpha, - DrawingBlink: (GroupDef.Blink == null) ? false : GroupDef.Blink, - InheritColor: GroupDef.InheritColor, - FreezeActivePose: Array.isArray(GroupDef.FreezeActivePose) ? GroupDef.FreezeActivePose : [], - PreviewZone: GroupDef.PreviewZone, - DynamicGroupName: GroupDef.DynamicGroupName || GroupDef.Group, - MirrorActivitiesFrom: GroupDef.MirrorActivitiesFrom || null, - ColorSuffix: GroupDef.ColorSuffix, - }; - AssetGroupMap.set(A.Name, A); - AssetActivityMirrorGroupSet(A); - AssetGroup.push(A); - return A; -} - -/** - * Collects the group equivalence classes defined by the MirrorActivitiesFrom property into a map for easy access to - * mirror group sets (i.e. all groups that are mirror activities from, or are mirrored by, each other). - * @param {AssetGroup} group - The group to register - */ -function AssetActivityMirrorGroupSet(group) { - if (group.MirrorActivitiesFrom) { - const mirrorGroups = AssetActivityMirrorGroups.get(group.MirrorActivitiesFrom); - if (mirrorGroups) { - mirrorGroups.push(group); - AssetActivityMirrorGroups.set(group.Name, mirrorGroups); - return; - } - } - AssetActivityMirrorGroups.set(group.Name, [group]); -} - -/** - * Adds a new asset to the main list - * @param {AssetGroup} Group - * @param {AssetDefinition} AssetDef - * @param {ExtendedItemConfig} ExtendedConfig - * @returns {void} - Nothing - */ -function AssetAdd(Group, AssetDef, ExtendedConfig) { - /** @type {Asset} */ - var A = Object.assign({ - Name: AssetDef.Name, - Description: AssetDef.Name, - Group: Group, - ParentItem: AssetDef.ParentItem, - ParentGroupName: AssetDef.ParentGroup, - Enable: (AssetDef.Enable == null) ? true : AssetDef.Enable, - Visible: (AssetDef.Visible == null) ? true : AssetDef.Visible, - Wear: (AssetDef.Wear == null) ? true : AssetDef.Wear, - Activity: (typeof AssetDef.Activity === "string" ? AssetDef.Activity : null), - AllowActivity: Array.isArray(AssetDef.AllowActivity) ? AssetDef.AllowActivity : [], - AllowActivityOn: Array.isArray(AssetDef.AllowActivityOn) ? AssetDef.AllowActivityOn : [], - BuyGroup: AssetDef.BuyGroup, - PrerequisiteBuyGroups: AssetDef.PrerequisiteBuyGroups, - Effect: (AssetDef.Effect == null) ? Group.Effect : AssetDef.Effect, - Bonus: AssetDef.Bonus, - Block: (AssetDef.Block == null) ? Group.Block : AssetDef.Block, - Expose: (AssetDef.Expose == null) ? [] : AssetDef.Expose, - Hide: (AssetDef.Hide == null) ? Group.Hide : AssetDef.Hide, - HideItem: AssetDef.HideItem, - HideItemExclude: AssetDef.HideItemExclude || [], - HideItemAttribute: AssetDef.HideItemAttribute || [], - Require: AssetDef.Require, - SetPose: (AssetDef.SetPose == null) ? Group.SetPose : AssetDef.SetPose, - AllowActivePose: AssetDef.AllowActivePose, - WhitelistActivePose: AssetDef.WhitelistActivePose, - Value: (AssetDef.Value == null) ? 0 : AssetDef.Value, - Difficulty: (AssetDef.Difficulty == null) ? 0 : AssetDef.Difficulty, - SelfBondage: (AssetDef.SelfBondage == null) ? 0 : AssetDef.SelfBondage, - SelfUnlock: (AssetDef.SelfUnlock == null) ? true : AssetDef.SelfUnlock, - ExclusiveUnlock: (AssetDef.ExclusiveUnlock == null) ? false : AssetDef.ExclusiveUnlock, - Random: (AssetDef.Random == null) ? true : AssetDef.Random, - RemoveAtLogin: (AssetDef.RemoveAtLogin == null) ? false : AssetDef.RemoveAtLogin, - WearTime: (AssetDef.Time == null) ? 0 : AssetDef.Time, - RemoveTime: (AssetDef.RemoveTime == null) ? ((AssetDef.Time == null) ? 0 : AssetDef.Time) : AssetDef.RemoveTime, - RemoveTimer: (AssetDef.RemoveTimer == null) ? 0 : AssetDef.RemoveTimer, - MaxTimer: (AssetDef.MaxTimer == null) ? 0 : AssetDef.MaxTimer, - DrawingPriority: AssetDef.Priority, - DrawingLeft: AssetDef.Left, - DrawingTop: AssetDef.Top, - HeightModifier: (AssetDef.Height == null) ? 0 : AssetDef.Height, - ZoomModifier: (AssetDef.Zoom == null) ? 1 : AssetDef.Zoom, - Alpha: AssetDef.Alpha, - Prerequisite: AssetDef.Prerequisite, - Extended: (AssetDef.Extended == null) ? false : AssetDef.Extended, - AlwaysExtend: (AssetDef.AlwaysExtend == null) ? false : AssetDef.AlwaysExtend, - AlwaysInteract: (AssetDef.AlwaysInteract == null) ? false : AssetDef.AlwaysInteract, - AllowLock: typeof AssetDef.AllowLock === "boolean" ? AssetDef.AllowLock : false, - LayerVisibility: (AssetDef.LayerVisibility == null) ? false : AssetDef.LayerVisibility, - IsLock: (AssetDef.IsLock == null) ? false : AssetDef.IsLock, - PickDifficulty: (AssetDef.PickDifficulty == null) ? 0 : AssetDef.PickDifficulty, - OwnerOnly: (AssetDef.OwnerOnly == null) ? false : AssetDef.OwnerOnly, - LoverOnly: (AssetDef.LoverOnly == null) ? false : AssetDef.LoverOnly, - ExpressionTrigger: AssetDef.ExpressionTrigger, - RemoveItemOnRemove: (AssetDef.RemoveItemOnRemove == null) ? Group.RemoveItemOnRemove : Group.RemoveItemOnRemove.concat(AssetDef.RemoveItemOnRemove), - AllowEffect: AssetDef.AllowEffect, - AllowBlock: AssetDef.AllowBlock, - AllowType: AssetDef.AllowType, - DefaultColor: AssetDef.DefaultColor, - Opacity: AssetParseOpacity(AssetDef.Opacity), - MinOpacity: typeof AssetDef.MinOpacity === "number" ? AssetParseOpacity(AssetDef.MinOpacity) : 1, - MaxOpacity: typeof AssetDef.MaxOpacity === "number" ? AssetParseOpacity(AssetDef.MaxOpacity) : 1, - Audio: AssetDef.Audio, - Category: AssetDef.Category, - Fetish: AssetDef.Fetish, - ArousalZone: (AssetDef.ArousalZone == null) ? Group.Name : AssetDef.ArousalZone, - IsRestraint: (AssetDef.IsRestraint == null) ? ((Group.IsRestraint == null) ? false : Group.IsRestraint) : AssetDef.IsRestraint, - BodyCosplay: (AssetDef.BodyCosplay == null) ? Group.BodyCosplay : AssetDef.BodyCosplay, - OverrideBlinking: (AssetDef.OverrideBlinking == null) ? false : AssetDef.OverrideBlinking, - DialogSortOverride: AssetDef.DialogSortOverride, - // @ts-ignore: this has no type, because we are in JS file - DynamicDescription: (typeof AssetDef.DynamicDescription === 'function') ? AssetDef.DynamicDescription : function () { return this.Description; }, - DynamicPreviewImage: (typeof AssetDef.DynamicPreviewImage === 'function') ? AssetDef.DynamicPreviewImage : function () { return ""; }, - DynamicAllowInventoryAdd: (typeof AssetDef.DynamicAllowInventoryAdd === 'function') ? AssetDef.DynamicAllowInventoryAdd : function () { return true; }, - // @ts-ignore: this has no type, because we are in JS file - DynamicExpressionTrigger: (typeof AssetDef.DynamicExpressionTrigger === 'function') ? AssetDef.DynamicExpressionTrigger : function () { return this.ExpressionTrigger; }, - // @ts-ignore: this has no type, because we are in JS file - DynamicName: (typeof AssetDef.DynamicName === 'function') ? AssetDef.DynamicName : function () { return this.Name; }, - DynamicGroupName: (AssetDef.DynamicGroupName || Group.DynamicGroupName), - DynamicActivity: (typeof AssetDef.DynamicActivity === 'function') ? AssetDef.DynamicActivity : function () { return AssetDef.Activity; }, - DynamicAudio: (typeof AssetDef.DynamicAudio === 'function') ? AssetDef.DynamicAudio : null, - CharacterRestricted: typeof AssetDef.CharacterRestricted === 'boolean' ? AssetDef.CharacterRestricted : false, - AllowRemoveExclusive: typeof AssetDef.AllowRemoveExclusive === 'boolean' ? AssetDef.AllowRemoveExclusive : false, - InheritColor: AssetDef.InheritColor, - DynamicBeforeDraw: (typeof AssetDef.DynamicBeforeDraw === 'boolean') ? AssetDef.DynamicBeforeDraw : false, - DynamicAfterDraw: (typeof AssetDef.DynamicAfterDraw === 'boolean') ? AssetDef.DynamicAfterDraw : false, - DynamicScriptDraw: (typeof AssetDef.DynamicScriptDraw === 'boolean') ? AssetDef.DynamicScriptDraw : false, - HasType: (typeof AssetDef.HasType === 'boolean') ? AssetDef.HasType : true, - AllowLockType: AssetDef.AllowLockType, - AllowColorizeAll: typeof AssetDef.AllowColorizeAll === "boolean" ? AssetDef.AllowColorizeAll : true, - AvailableLocations: AssetDef.AvailableLocations || [], - OverrideHeight: AssetDef.OverrideHeight, - FreezeActivePose: Array.isArray(AssetDef.FreezeActivePose) ? AssetDef.FreezeActivePose : - Array.isArray(Group.FreezeActivePose) ? Group.FreezeActivePose : [], - DrawLocks: typeof AssetDef.DrawLocks === "boolean" ? AssetDef.DrawLocks : true, - AllowExpression: AssetDef.AllowExpression, - MirrorExpression: AssetDef.MirrorExpression, - FixedPosition: typeof AssetDef.FixedPosition === "boolean" ? AssetDef.FixedPosition : false, - Layer: [], - ColorableLayerCount: 0, - CustomBlindBackground: typeof AssetDef.CustomBlindBackground === 'string' ? AssetDef.CustomBlindBackground : undefined, - FuturisticRecolor: typeof AssetDef.FuturisticRecolor === 'boolean' ? AssetDef.FuturisticRecolor : false, - FuturisticRecolorDisplay: typeof AssetDef.FuturisticRecolorDisplay === 'boolean' ? AssetDef.FuturisticRecolorDisplay : false, - Attribute: AssetDef.Attribute || [], - PreviewIcons: AssetDef.PreviewIcons || [], - PoseMapping: AssetDef.PoseMapping || {}, - Tint: Array.isArray(AssetDef.Tint) ? AssetDef.Tint : [], - AllowTint: Array.isArray(AssetDef.Tint) && AssetDef.Tint.length > 0, - DefaultTint: typeof AssetDef.DefaultTint === "string" ? AssetDef.DefaultTint : undefined, - CraftGroup: typeof AssetDef.CraftGroup === "string" ? AssetDef.CraftGroup : AssetDef.Name, - ColorSuffix: Group.ColorSuffix, - }, AssetParsePoseProperties(AssetDef, Group.AllowPose.slice())); - - // Ensure opacity value is valid - if (A.MinOpacity > A.Opacity) A.MinOpacity = A.Opacity; - if (A.MaxOpacity < A.Opacity) A.MaxOpacity = A.Opacity; - - A.Layer = AssetBuildLayer(AssetDef, A); - AssetAssignColorIndices(A); - // Unwearable assets are not visible but can be overwritten - if (!A.Wear && AssetDef.Visible != true) A.Visible = false; - Group.Asset.push(A); - AssetMap.set(Group.Name + "/" + A.Name, A); - Asset.push(A); - if (ExtendedConfig) AssetBuildExtended(A, ExtendedConfig); -} - -/** - * Constructs extended item functions for an asset, if extended item configuration exists for the asset. - * @param {Asset} A - The asset to configure - * @param {ExtendedItemConfig} ExtendedConfig - The extended item configuration object for the asset's family - * @returns {void} - Nothing - */ -function AssetBuildExtended(A, ExtendedConfig) { - let AssetConfig = AssetFindExtendedConfig(ExtendedConfig, A.Group.Name, A.Name); - - if (!AssetConfig) { - return; - } - - if (AssetConfig.CopyConfig) { - const Overrides = AssetConfig.Config; - const { GroupName, AssetName } = AssetConfig.CopyConfig; - AssetConfig = AssetFindExtendedConfig(ExtendedConfig, GroupName || A.Group.Name, AssetName); - if (!AssetConfig) { - console.error(`CopyConfig ${GroupName || A.Group.Name}:${AssetName} not found for ${A.Group.Name}:${A.Name}`); - return; - } - if (Overrides) { - const MergedConfig = Object.assign({}, AssetConfig.Config, Overrides); - AssetConfig = Object.assign({}, AssetConfig, {Config: MergedConfig}); - } - } - - switch (AssetConfig.Archetype) { - case ExtendedArchetype.MODULAR: - ModularItemRegister(A, AssetConfig.Config); - break; - case ExtendedArchetype.TYPED: - TypedItemRegister(A, AssetConfig.Config); - break; - case ExtendedArchetype.VIBRATING: - VibratorModeRegister(A, AssetConfig.Config); - break; - case ExtendedArchetype.VARIABLEHEIGHT: - VariableHeightRegister(A, AssetConfig.Config, AssetConfig.Config ? AssetConfig.Config.Property : undefined); - break; - } - A.Archetype = AssetConfig.Archetype; -} - -/** - * Finds the extended item configuration for the provided group and asset name, if any exists - * @param {ExtendedItemConfig} ExtendedConfig - The full extended item configuration object - * @param {string} GroupName - The name of the asset group to find extended configuration for - * @param {string} AssetName - The name of the asset to find extended configuration fo - * @returns {AssetArchetypeConfig | undefined} - The extended asset configuration object for the specified asset, if - * any exists, or undefined otherwise - */ -function AssetFindExtendedConfig(ExtendedConfig, GroupName, AssetName) { - const GroupConfig = ExtendedConfig[GroupName] || {}; - return GroupConfig[AssetName]; -} - -/** - * Builds the layer array for an asset based on the asset definition. One layer is created for each drawable part of - * the asset (excluding the lock). If the asset definition contains no layer definitions, a default layer definition - * will be created. - * @param {AssetDefinition} AssetDefinition - The raw asset definition - * @param {Asset} A - The built asset - * @return {AssetLayer[]} - An array of layer objects representing the drawable layers of the asset - */ -function AssetBuildLayer(AssetDefinition, A) { - var Layers = Array.isArray(AssetDefinition.Layer) ? AssetDefinition.Layer : [{}]; - return Layers.map((Layer, I) => AssetMapLayer(Layer, AssetDefinition, A, I)); -} - -/** - * Maps a layer definition to a drawable layer object - * @param {AssetLayerDefinition} Layer - The raw layer definition - * @param {AssetDefinition} AssetDefinition - The raw asset definition - * @param {Asset} A - The built asset - * @param {number} I - The index of the layer within the asset - * @return {AssetLayer} - A Layer object representing the drawable properties of the given layer - */ -function AssetMapLayer(Layer, AssetDefinition, A, I) { - /** @type {AssetLayer} */ - const L = Object.assign({ - Name: Layer.Name || null, - AllowColorize: AssetLayerAllowColorize(Layer, AssetDefinition, A.Group), - CopyLayerColor: Layer.CopyLayerColor || null, - ColorGroup: Layer.ColorGroup, - HideColoring: typeof Layer.HideColoring === "boolean" ? Layer.HideColoring : false, - AllowTypes: Array.isArray(Layer.AllowTypes) ? Layer.AllowTypes : null, - ModuleType: Array.isArray(Layer.ModuleType) ? Layer.ModuleType : null, - Visibility: typeof Layer.Visibility === "string" ? Layer.Visibility : null, - HasType: typeof Layer.HasType === "boolean" ? Layer.HasType : A.HasType, - ParentGroupName: Layer.ParentGroup, - Priority: Layer.Priority || AssetDefinition.Priority || A.Group.DrawingPriority, - InheritColor: Layer.InheritColor, - Alpha: AssetLayerAlpha(Layer, AssetDefinition, I), - Asset: A, - DrawingLeft: Layer.Left, - DrawingTop: Layer.Top, - HideAs: Layer.HideAs, - FixedPosition: typeof Layer.FixedPosition === "boolean" ? Layer.FixedPosition : false, - HasImage: typeof Layer.HasImage === "boolean" ? Layer.HasImage : true, - Opacity: typeof Layer.Opacity === "number" ? AssetParseOpacity(Layer.Opacity) : 1, - MinOpacity: typeof Layer.MinOpacity === "number" ? AssetParseOpacity(Layer.Opacity) : A.MinOpacity, - MaxOpacity: typeof Layer.MaxOpacity === "number" ? AssetParseOpacity(Layer.Opacity) : A.MaxOpacity, - LockLayer: typeof Layer.LockLayer === "boolean" ? Layer.LockLayer : false, - MirrorExpression: Layer.MirrorExpression, - AllowModuleTypes: Layer.AllowModuleTypes, - ColorIndex: 0, - PoseMapping: Layer.PoseMapping || A.PoseMapping, - }, AssetParsePoseProperties( - Layer, - Array.isArray(A.AllowPose) ? A.AllowPose.slice() : null) - ); - if (L.MinOpacity > L.Opacity) L.MinOpacity = L.Opacity; - if (L.MaxOpacity < L.Opacity) L.MaxOpacity = L.Opacity; - return L; -} - -/** - * Resolves the AllowPose and HideForPose properties on a layer or an asset - * @param {Asset | AssetLayerDefinition} obj - The asset or layer object - * @param {string[] | null} defaultAllowPose - A fallback value for the AllowPose property if it's not defined on the - * object - * @return {{AllowPose: string[] | null, HideForPose: string[]}} - A partial object containing AllowPose and HideForPose - * properties - */ -function AssetParsePoseProperties(obj, defaultAllowPose = null) { - const HideForPose = Array.isArray(obj.HideForPose) ? obj.HideForPose : []; - let AllowPose = Array.isArray(obj.AllowPose) ? obj.AllowPose : defaultAllowPose; - if (HideForPose.length > 0) { - // Automatically add any entries from HideForPose into AllowPose - AllowPose = AllowPose || []; - CommonArrayConcatDedupe(AllowPose, HideForPose); - } - return {AllowPose, HideForPose}; -} - -/** - * Parses and validates asset's opacity - * @param {number|undefined} opacity - * @returns {number} - */ -function AssetParseOpacity(opacity) { - if (typeof opacity === "number" && !isNaN(opacity)) { - return Math.max(0, Math.min(1, opacity)); - } - return 1; -} - -/** - * Determines whether a layer can be colorized, based on the layer definition and its parent asset/group definitions - * @param {AssetLayerDefinition} Layer - The raw layer definition - * @param {AssetDefinition} NewAsset - The raw asset definition - * @param {AssetGroup} Group - The group being processed - * @return {boolean} - Whether or not the layer should be permit colors - */ -function AssetLayerAllowColorize(Layer, NewAsset, Group) { - return typeof Layer.AllowColorize === "boolean" ? Layer.AllowColorize : - typeof NewAsset.AllowColorize === "boolean" ? NewAsset.AllowColorize : - typeof Group.AllowColorize === "boolean" ? Group.AllowColorize : true; -} - -/** - * Builds the alpha mask definitions for a layer, based on the - * @param {AssetLayerDefinition} Layer - The raw layer definition - * @param {AssetDefinition} NewAsset - The raw asset definition - * @param {number} I - The index of the layer within its asset - * @return {AlphaDefinition[]} - a list of alpha mask definitions for the layer - */ -function AssetLayerAlpha(Layer, NewAsset, I) { - var Alpha = Layer.Alpha || []; - // If the layer is the first layer for an asset, add the asset's alpha masks - if (I === 0 && NewAsset.Alpha && NewAsset.Alpha.length) { - Array.prototype.push.apply(Alpha, NewAsset.Alpha); - } - return Alpha; -} - -/** - * Assigns color indices to the layers of an asset. These determine which colors get applied to the layer. Also adds - * a count of colorable layers to the asset definition. - * @param {Asset} A - The built asset - * @returns {void} - Nothing - */ -function AssetAssignColorIndices(A) { - var colorIndex = 0; - /** @type {Record} */ - var colorMap = {}; - A.Layer.forEach(Layer => { - // If the layer can't be colored, we don't need to set a color index - if (!Layer.AllowColorize) return; - - var LayerKey = Layer.CopyLayerColor || Layer.Name; - if (LayerKey === undefined) - LayerKey = "undefined"; - if (LayerKey === null) - LayerKey = "null"; - if (typeof colorMap[LayerKey] === "number") { - Layer.ColorIndex = colorMap[LayerKey]; - } else { - Layer.ColorIndex = colorMap[LayerKey] = colorIndex; - colorIndex++; - } - }); - A.ColorableLayerCount = colorIndex; -} - -/** - * Builds the asset description from the CSV file - * @param {IAssetFamily} Family - * @param {string[][]} CSV - */ -function AssetBuildDescription(Family, CSV) { - - /** @type {Map} */ - const map = new Map(); - - for (const line of CSV) { - if (Array.isArray(line) && line.length === 3) { - if (map.has(`${line[0]}:${line[1]}`)) { - console.warn("Duplicate Asset Description: ", line); - } - map.set(`${line[0]}:${line[1]}`, line[2].trim()); - } else { - console.warn("Bad Asset Description line: ", line); - } - } - - // For each asset group in family - for (const G of AssetGroup) { - if (G.Family !== Family) - continue; - - const res = map.get(`${G.Name}:`); - if (res === undefined) { - G.Description = `MISSING ASSETGROUP DESCRIPTION: ${G.Name}`; - } else { - G.Description = res; - } - } - - // For each asset in the family - for (const A of Asset) { - if (A.Group.Family !== Family) - continue; - - const res = map.get(`${A.Group.Name}:${A.Name}`); - if (res === undefined) { - A.Description = `MISSING ASSET DESCRIPTION: ${A.Group.Name}:${A.Name}`; - } else { - A.Description = res; - } - } - - // Translates the descriptions to a foreign language - TranslationAsset(Family); - -} - -/** - * Loads the description of the assets in a specific language - * @param {IAssetFamily} Family The asset family to load the description for - */ -function AssetLoadDescription(Family) { - - // Finds the full path of the CSV file to use cache - var FullPath = "Assets/" + Family + "/" + Family + ".csv"; - if (CommonCSVCache[FullPath]) { - AssetBuildDescription(Family, CommonCSVCache[FullPath]); - return; - } - - // Opens the file, parse it and returns the result it to build the dialog - CommonGet(FullPath, function () { - if (this.status == 200) { - CommonCSVCache[FullPath] = CommonParseCSV(this.responseText); - AssetBuildDescription(Family, CommonCSVCache[FullPath]); - } - }); - -} - -/** - * Loads a specific asset file - * @param {AssetGroupDefinition[]} Groups - * @param {IAssetFamily} Family - * @param {ExtendedItemConfig} ExtendedConfig - */ -function AssetLoad(Groups, Family, ExtendedConfig) { - - // For each group in the asset file - for (const group of Groups) { - // Creates the asset group - const G = AssetGroupAdd(Family, group); - - // Add each assets in the group 1 by 1 - for (const asset of group.Asset) { - if (typeof asset === "string") - AssetAdd(G, { Name: asset }, ExtendedConfig); - else - AssetAdd(G, asset, ExtendedConfig); - } - } - - // Loads the description of the assets in a specific language - AssetLoadDescription(Family); - -} - -// Reset and load all the assets -function AssetLoadAll() { - Asset = []; - AssetGroup = []; - AssetLoad(AssetFemale3DCG, "Female3DCG", AssetFemale3DCGExtended); - Pose = PoseFemale3DCG; -} - -/** - * Gets a specific asset by family/group/name - * @param {string} Family - The family to search in (Ignored until other family is added) - * @param {string} Group - Name of the group of the searched asset - * @param {string} Name - Name of the searched asset - * @returns {Asset|null} - */ -function AssetGet(Family, Group, Name) { - return AssetMap.get(Group + "/" + Name) || null; -} - -/** - * Gets all activities on a family and name - * @param {string} family - The family to search in - * @returns {Activity[]} - */ -function AssetAllActivities(family) { - if (family == "Female3DCG") - return ActivityFemale3DCG; - return []; -} - -/** - * Gets an activity asset by family and name - * @param {string} family - The family to search in - * @param {string} name - Name of activity to search for - * @returns {Activity|undefined} - */ -function AssetGetActivity(family, name) { - return AssetAllActivities(family).find(a => (a.Name === name)); -} - -/** - * Get the list of all activities on a group for a given family. - * - * @description Note that this just returns activities as defined, no checks are - * actually done on whether the activity makes sense. - * - * @param {string} family - * @param {string} groupname - * @param {"self" | "other" | "any"} onSelf - * @returns {Activity[]} - */ -function AssetActivitiesForGroup(family, groupname, onSelf = "other") { - const activities = AssetAllActivities(family); - /** @type {Activity[]} */ - const defined = []; - activities.forEach(a => { - /** @type {string[] | undefined} */ - let targets; - // Get the correct target list - if (onSelf === "self") { - targets = (typeof a.TargetSelf === "boolean" ? a.Target : a.TargetSelf); - } else if (onSelf === "any") { - targets = a.Target; - if (Array.isArray(a.TargetSelf)) - targets = targets.concat(a.TargetSelf); - } else { - targets = a.Target; - } - if (targets && targets.includes(groupname)) - defined.push(a); - }); - return defined; -} - -/** - * Cleans the given array of assets of any items that no longer exists - * @param {Array.<{Name: string, Group: string}>} AssetArray - The arrays of items to clean - * @returns {Array.<{Name: string, Group: string}>} - The cleaned up array - */ -function AssetCleanArray(AssetArray) { - return AssetArray.filter(({ Group, Name }) => AssetGet('Female3DCG', Group, Name) != null); -} - -/** - * Gets an asset group by the asset family name and group name - * @param {string} Family - The asset family that the group belongs to (Ignored until other family is added) - * @param {string} Group - The name of the asset group to find - * @returns {AssetGroup|null} - The asset group matching the provided family and group name - */ -function AssetGroupGet(Family, Group) { - return AssetGroupMap.get(Group) || null; -} - -/** - * Utility function for retrieving the preview image directory path for an asset - * @param {Asset} A - The asset whose preview path to retrieve - * @returns {string} - The path to the asset's preview image directory - */ -function AssetGetPreviewPath(A) { - return `Assets/${A.Group.Family}/${A.DynamicGroupName}/Preview`; -} - -/** - * Utility function for retrieving the base path of an asset's inventory directory, where extended item scripts are - * held - * @param {Asset} A - The asset whose inventory path to retrieve - * @returns {string} - The path to the asset's inventory directory - */ -function AssetGetInventoryPath(A) { - return `Screens/Inventory/${A.DynamicGroupName}/${A.Name}`; -} diff --git a/Scripts/Audio.js b/Scripts/Audio.js deleted file mode 100644 index a9c3ee792..000000000 --- a/Scripts/Audio.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; - -/** - * Plays a sound at a given volume - * @param {string} src - Source of the audio file to play - * @param {number} [volume] - Volume of the audio in percentage (ranges from 0 to 1) - * @returns {void} - Nothing - */ -function AudioPlayInstantSound(src, volume) { - // TODO remove all reference -} - - diff --git a/Scripts/Character.js b/Scripts/Character.js deleted file mode 100644 index e09c91483..000000000 --- a/Scripts/Character.js +++ /dev/null @@ -1,1191 +0,0 @@ -"use strict"; -/** @type Character[] */ -var Character = []; -var CharacterNextId = 1; - -/** @type Map */ -const CharacterDeafLevels = new Map([ - ["DeafTotal", 4], - ["DeafHeavy", 3], - ["DeafNormal", 2], - ["DeafLight", 1], -]); - -/** @type Map */ -const CharacterBlurLevels = new Map([ - ["BlurTotal", 50], - ["BlurHeavy", 20], - ["BlurNormal", 8], - ["BlurLight", 3], -]); - -/** - * An enum representing the various character archetypes - * ONLINE: The player, or a character representing another online player - * NPC: Any NPC - * SIMPLE: Any simple character, generally used internally and not to represent an actual in-game character - * @type {Record<"ONLINE"|"NPC"|"SIMPLE", CharacterType>} - */ -var CharacterType = { - ONLINE: "online", - NPC: "npc", - SIMPLE: "simple", -}; - -/** - * Loads a character into the buffer, creates it if it does not exist - * @param {number} CharacterID - ID of the character - * @param {string} CharacterAssetFamily - Name of the asset family of the character - * @param {CharacterType} [Type=CharacterType.ONLINE] - The character type - * @returns {Character} - The newly loaded character - */ -function CharacterReset(CharacterID, CharacterAssetFamily, Type = CharacterType.ONLINE) { - - // Prepares the character sheet - /** @type {Character} */ - var NewCharacter = { - ID: CharacterID, - Hooks: null, - Name: "", - Type, - AssetFamily: CharacterAssetFamily, - AccountName: "", - Owner: "", - Lover: "", - Money: 0, - Inventory: [], - Appearance: [], - Stage: "0", - CurrentDialog: "", - Dialog: [], - Reputation: [], - Skill: [], - Pose: [], - DrawPose: [], - DrawAppearance: [], - AllowedActivePose: [], - Effect: [], - Tints: [], - FocusGroup: null, - Canvas: null, - CanvasBlink: null, - MustDraw: false, - BlinkFactor: Math.round(Math.random() * 10) + 10, - AllowItem: true, - BlockItems: [], - LimitedItems: [], - FavoriteItems: [], - HiddenItems: [], - WhiteList: [], - BlackList: [], - HeightModifier: 0, - HeightRatio: 1, - HasHiddenItems: false, - SavedColors: GetDefaultSavedColors(), - CanTalk: function () { - let GagEffect = SpeechGetGagLevel(this, ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemHead", "ItemHood", "ItemNeck", "ItemDevices"]); - return (GagEffect <= 0); - }, - CanWalk: function () { - return ( - (this.Effect.indexOf("Freeze") < 0) && - (this.Effect.indexOf("Tethered") < 0) && - ((this.Pose == null) || (this.Pose.indexOf("Kneel") < 0) || (this.Effect.indexOf("KneelFreeze") < 0)) - ); - }, - CanKneel: function () { - return CharacterCanKneel(this); - }, - CanInteract: function () { - return (this.Effect.indexOf("Block") < 0); - }, - CanChangeOwnClothes: function () { - return this.CanChangeClothesOn(this); - }, - CanChangeClothesOn: function (C) { - if (this.IsPlayer() && C.IsPlayer()) { - return ( - !C.IsRestrained() - ); - } else { - return ( - this.CanInteract() && - C.MemberNumber != null && - C.AllowItem && - !C.IsEnclose() && - !(InventoryGet(CurrentCharacter, "ItemNeck") !== null && - InventoryGet(CurrentCharacter, "ItemNeck").Asset.Name == "ClubSlaveCollar") - ); - } - }, - IsProne: function () { - return (this.Effect.indexOf("Prone") >= 0); - }, - IsRestrained: function () { - return ( - (this.Effect.indexOf("Freeze") >= 0) || - (this.Effect.indexOf("Block") >= 0) || - (this.Effect.indexOf("Prone") >= 0) - ); - }, - /** Look for blindness effects and return the worst (limited by settings), Light: 1, Normal: 2, Heavy: 3 */ - GetBlindLevel: function (eyesOnly = false) { - let blindLevel = 0; - const eyes1 = InventoryGet(this, "Eyes"); - const eyes2 = InventoryGet(this, "Eyes2"); - if (eyes1 && eyes1.Property && eyes1.Property.Expression && eyes2 && eyes2.Property && eyes2.Property.Expression) { - if ((eyes1.Property.Expression === "Closed") && (eyes2.Property.Expression === "Closed")) { - blindLevel += DialogFacialExpressionsSelectedBlindnessLevel; - } - } - if (!eyesOnly) { - if (this.Effect.includes("BlindTotal")) blindLevel += 4; - else if (this.Effect.includes("BlindHeavy")) blindLevel += 3; - else if (this.Effect.includes("BlindNormal")) blindLevel += 2; - else if (this.Effect.includes("BlindLight")) blindLevel += 1; - } - blindLevel = Math.min(3, blindLevel); - // Light sensory deprivation setting limits blindness - if (this.IsPlayer() && this.GameplaySettings && this.GameplaySettings.SensDepChatLog == "SensDepLight") blindLevel = Math.min(2, blindLevel); - return blindLevel; - }, - GetBlurLevel: function() { - if ((this.IsPlayer() && this.GraphicsSettings && !this.GraphicsSettings.AllowBlur) || CommonPhotoMode) { - return 0; - } - let blurLevel = 0; - for (const item of this.Appearance) { - for (const [effect, level] of CharacterBlurLevels.entries()) { - if (InventoryItemHasEffect(item, effect)) { - blurLevel += level; - break; // Only count the highest blur level defined on the item - } - } - } - return blurLevel; - }, - IsLocked: function () { - return this.Effect.indexOf("Lock") > 0; - }, - IsBlind: function () { - return this.GetBlindLevel() > 0; - }, - IsEnclose: function () { - return (this.Effect.indexOf("Enclose") >= 0 || (this.Effect.indexOf("OneWayEnclose") >= 0 && this.ID == 0)); - }, - IsMounted: function () { - return (this.Effect.indexOf("Mounted") >= 0); - }, - IsChaste: function () { - return ((this.Effect.indexOf("Chaste") >= 0) || (this.Effect.indexOf("BreastChaste") >= 0)); - }, - IsVulvaChaste: function () { - return (this.Effect.indexOf("Chaste") >= 0); - }, - IsPlugged: function () { - return (this.Effect.indexOf("IsPlugged") >= 0); - }, - IsButtChaste: function () { - return this.Effect.includes("ButtChaste"); - }, - IsBreastChaste: function () { - return (this.Effect.indexOf("BreastChaste") >= 0); - }, - IsShackled: function () { - return (this.Effect.indexOf("Shackled") >= 0); - }, - IsSlow: function () { - return ( - ((this.Effect.indexOf("Slow") >= 0) || (this.Pose.indexOf("Kneel") >= 0)) && - ((this.ID != 0) || !/** @type {PlayerCharacter} */(this).RestrictionSettings.SlowImmunity) - ); - }, - IsEgged: function () { - return (this.Effect.indexOf("Egged") >= 0); - }, - IsMouthBlocked: function () { - return this.Effect.indexOf("BlockMouth") >= 0; - }, - IsMouthOpen: function () { - return this.Effect.indexOf("OpenMouth") >= 0; - }, - IsVulvaFull: function () { - return this.Effect.indexOf("FillVulva") >= 0; - }, - IsFixedHead: function () { - return this.Effect.includes("FixedHead"); - }, - IsOwned: function () { - return false; - }, - IsOwnedByPlayer: function () { - return false; - }, - IsOwnedByMemberNumber: function (memberNumber) { - return false; - }, - IsOwner: function () { - return false; - }, - IsLoverOfPlayer: function () { - return false; - }, - IsLover: function (C) { - return false; - }, - IsLoverOfMemberNumber: function (memberNumber) { - return false; - }, - GetLoversNumbers: function (MembersOnly) { - return []; - }, - GetDeafLevel: function () { - let deafLevel = 0; - for (const item of this.Appearance) { - for (const [effect, level] of CharacterDeafLevels.entries()) { - if (InventoryItemHasEffect(item, effect)) { - deafLevel += level; - break; // Only count the highest deafness level defined on the item - } - } - } - return deafLevel; - }, - IsLoverPrivate: function () { - return false; - }, - IsKneeling: function () { - return (this.Pose != null && (this.Pose.includes("Kneel") || this.Pose.includes("KneelingSpread"))); - }, - IsNaked: function () { - return CharacterIsNaked(this); - }, - IsDeaf: function () { - return this.GetDeafLevel() > 0; - }, - HasNoItem: function () { - return CharacterHasNoItem(this); - }, - IsEdged: function () { - return CharacterIsEdged(this); - }, - IsPlayer: function () { - return this.ID === 0; - }, - IsOnline: function () { - return this.Type === CharacterType.ONLINE; - }, - IsNpc: function () { - return (this.Type !== CharacterType.ONLINE) && (this.Type !== CharacterType.SIMPLE); - }, - IsSimple: function () { - return this.Type === CharacterType.SIMPLE; - }, - GetDifficulty: function () { - return 1; - }, - IsSuspended: function () { - return this.Pose.includes("Suspension") || this.Effect.includes("Suspended"); - }, - IsInverted: function () { - return this.Pose.indexOf("Suspension") >= 0; - }, - CanChangeToPose: function (Pose) { - return CharacterCanChangeToPose(this, Pose); - }, - GetClumsiness: function () { - return CharacterGetClumsiness(this); - }, - HasEffect: function(Effect) { - return this.Effect.includes(Effect); - }, - HasTints: function() { - if (this.IsPlayer() && this.ImmersionSettings && !this.ImmersionSettings.AllowTints) { - return false; - } - return !CommonPhotoMode && this.Tints.length > 0; - }, - GetTints: function() { - return CharacterGetTints(this); - }, - // Adds a new hook with a Name (determines when the hook will happen, an Instance ID (used to differentiate between different hooks happening at the same time), and a function that is run when the hook is called) - RegisterHook: function (hookName, hookInstance, callback) { - if (!this.Hooks) this.Hooks = new Map(); - - let hooks = this.Hooks.get(hookName); - if (!hooks) { - hooks = new Map(); - this.Hooks.set(hookName, hooks); - } - - if (!hooks.has(hookInstance)) { - hooks.set(hookInstance, callback); - return true; - } - return false; - }, - // Removes a hook based on hookName and hookInstance - UnregisterHook: function (hookName, hookInstance) { - if (!this.Hooks) return false; - - const hooks = this.Hooks.get(hookName); - if (hooks && hooks.delete(hookInstance)) { - if (hooks.size == 0) { - this.Hooks.delete(hookName); - } - return true; - } - - return false; - } - }; - - // If the character doesn't exist, we create it - var CharacterIndex = Character.findIndex(c => c.ID == CharacterID); - if (CharacterIndex == -1) - Character.push(NewCharacter); - else - Character[CharacterIndex] = NewCharacter; - - // Creates the inventory and default appearance - if (CharacterID == 0) { - Player = NewCharacter; - CharacterAppearanceSetDefault(NewCharacter); - } - - // Load the character image - CharacterLoadCanvas(NewCharacter); - - return NewCharacter; -} - - -/** - * Loads the content of a CSV file to build the character dialog. Can override the current screen. - * @param {Character} C - Character for which to build the dialog objects - * @param {string} [Override] - Optional: Path to the specific CSV to build the character dialog with - * @returns {void} - Nothing - */ -function CharacterLoadCSVDialog(C, Override) { - - // Finds the full path of the CSV file to use cache - var FullPath = ((C.ID == 0) ? "Screens/Character/Player/Dialog_Player" : ((Override == null) ? "Screens/" + CurrentModule + "/" + CurrentScreen + "/Dialog_" + C.AccountName : Override)) + ".csv"; - if (CommonCSVCache[FullPath]) { - CharacterBuildDialog(C, CommonCSVCache[FullPath]); - return; - } - - // Opens the file, parse it and returns the result it to build the dialog - CommonGet(FullPath, function () { - if (this.status == 200) { - CommonCSVCache[FullPath] = CommonParseCSV(this.responseText); - CharacterBuildDialog(C, CommonCSVCache[FullPath]); - } - }); - -} - - -/** - * Builds the dialog objects from the character CSV file - * @param {Character} C - Character for which to build the dialog - * @param {string[][]} CSV - Content of the CSV file - * @returns {void} - Nothing - */ -function CharacterBuildDialog(C, CSV) { - - const OnlinePlayer = C.AccountName.indexOf("Online-") >= 0; - C.Dialog = []; - // For each lines in the file - for (let L = 0; L < CSV.length; L++) - if ((CSV[L][0] != null) && (CSV[L][0] != "")) { - - // Creates a dialog object - const D = {}; - D.Stage = CSV[L][0]; - if ((CSV[L][1] != null) && (CSV[L][1].trim() != "")) D.NextStage = CSV[L][1]; - if ((CSV[L][2] != null) && (CSV[L][2].trim() != "")) D.Option = CSV[L][2].replace("DialogCharacterName", C.Name).replace("DialogPlayerName", CharacterNickname(Player)); - if ((CSV[L][3] != null) && (CSV[L][3].trim() != "")) D.Result = CSV[L][3].replace("DialogCharacterName", C.Name).replace("DialogPlayerName", CharacterNickname(Player)); - if ((CSV[L][4] != null) && (CSV[L][4].trim() != "")) D.Function = ((CSV[L][4].trim().substring(0, 6) == "Dialog") ? "" : OnlinePlayer ? "ChatRoom" : CurrentScreen) + CSV[L][4]; - if ((CSV[L][5] != null) && (CSV[L][5].trim() != "")) D.Prerequisite = CSV[L][5]; - if ((CSV[L][6] != null) && (CSV[L][6].trim() != "")) D.Group = CSV[L][6]; - if ((CSV[L][7] != null) && (CSV[L][7].trim() != "")) D.Trait = CSV[L][7]; - C.Dialog.push(D); - - } - - // Translate the dialog if needed - TranslationDialog(C); - - if (C === Player) { - for (const D of C.Dialog) { - if (typeof D.Result === "string") - PlayerDialog.set(D.Stage, D.Result); - } - } -} - -/** - * Attributes a random name for the character, does not select a name in use - * @param {Character} C - Character for which to attribute a name - * @returns {void} - Nothing - */ -function CharacterRandomName(C) { - - // Generates a name from the name bank - var NewName = CharacterName[Math.floor(Math.random() * CharacterName.length)]; - C.Name = NewName; - - // If the name is already taken, we generate a new one - for (let CN = 0; CN < Character.length; CN++) - if ((Character[CN].Name == NewName) && (Character[CN].ID != C.ID)) { - CharacterRandomName(C); - return; - } -} - -/** - * Create a minimal character object - * @param {string} AccName - The account name to give to the character - * @returns {Character} - The created character - */ -function CharacterLoadSimple(AccName) { - // Checks if the character already exists and returns it if it's the case - for (let C = 0; C < Character.length; C++) - if (Character[C].AccountName === AccName) - return Character[C]; - - // Create the new character - const C = CharacterReset(CharacterNextId++, "Female3DCG", CharacterType.SIMPLE); - C.AccountName = AccName; - - // Returns the new character - return C; -} - -/** - * Deletes an NPC from the buffer - * @param {string} NPCType - Account name of the npc to delete - * @returns {void} - Nothing - */ -function CharacterDelete(NPCType) { - for (let C = 0; C < Character.length; C++) - if (Character[C].AccountName == NPCType) { - AnimationPurge(Character[C], true); - Character.splice(C, 1); - return; - } -} - -/** - * Adds a pose to a character's pose list, does not add it if it's already there - * @param {Character} C - Character for which to add a pose to its list - * @param {string} NewPose - The name of the pose to add - * @returns {void} - Nothing - */ -function CharacterAddPose(C, NewPose) { - for (let E = 0; E < NewPose.length; E++) - if (C.Pose.indexOf(NewPose[E]) < 0) - C.Pose.push(NewPose[E]); -} - -/** - * Checks whether the given character can change to the named pose unaided - * @param {Character} C - The character to check - * @param {string} poseName - The name of the pose to check for - * @returns {boolean} - Returns true if the character has no conflicting items and is not prevented from changing to - * the provided pose - */ -function CharacterCanChangeToPose(C, poseName) { - const pose = PoseFemale3DCG.find(P => P.Name === poseName); - if (!pose) return false; - const poseCategory = pose.Category; - if (!CharacterItemsHavePoseAvailable(C, poseCategory, pose.Name)) return false; - return !C.Appearance.some(item => InventoryGetItemProperty(item, "FreezeActivePose").includes(poseCategory)); -} - -/** - * Checks if a certain pose is whitelisted and available for the pose menu - * @param {Character} C - Character to check for the pose - * @param {string|undefined} Type - Pose type to check for within items - * @param {string} Pose - Pose to check for whitelist - * @returns {boolean} - TRUE if the character has the pose available - */ -function CharacterItemsHavePoseAvailable(C, Type, Pose) { - const ConflictingPoses = PoseFemale3DCG.filter(P => P.Name !== Pose && (P.Category == Type || P.Category == "BodyFull")).map(P => P.Name); - - for (let i = 0, Item = null; i < C.Appearance.length; i++) { - Item = C.Appearance[i]; - - const WhitelistActivePose = InventoryGetItemProperty(Item, "WhitelistActivePose"); - if (WhitelistActivePose != null && WhitelistActivePose.includes(Pose)) continue; - - const AllowActivePose = InventoryGetItemProperty(Item, "AllowActivePose"); - if (AllowActivePose != null && AllowActivePose.includes(Pose)) continue; - - const SetPose = InventoryGetItemProperty(Item, "SetPose", true); - if (SetPose != null && SetPose.find(P => ConflictingPoses.includes(P))) return false; - } - return true; -} - -/** - * Checks if a character has a pose from items (not active pose unless an item lets it through) - * @param {Character} C - Character to check for the pose - * @param {string} Pose - Pose to check for within items - * @param {boolean} [ExcludeClothes=false] - Ignore clothing items in the check - * @returns {boolean} - TRUE if the character has the pose - */ -function CharacterItemsHavePose(C, Pose, ExcludeClothes = false) { - if (C.ActivePose != null && C.AllowedActivePose.includes(Pose) && (typeof C.ActivePose == "string" && C.ActivePose == Pose || Array.isArray(C.ActivePose) && C.ActivePose.includes(Pose))) return true; - return CharacterDoItemsSetPose(C, Pose, ExcludeClothes); -} - -/** - * Checks whether the items on a character set a given pose on the character - * @param {Character} C - The character to check - * @param {string} pose - The name of the pose to check for - * @param {boolean} [excludeClothes=false] - Ignore clothing items in the check - * @returns {boolean} - Returns true if the character is wearing an item that sets the given pose, false otherwise - */ -function CharacterDoItemsSetPose(C, pose, excludeClothes = false) { - return C.Appearance - .filter(item => !excludeClothes || !item.Asset.Group.Clothing) - .some(item => { - const setPose = InventoryGetItemProperty(item, "SetPose", true); - return setPose && setPose.includes(pose); - }); -} - -/** - * Checks if a character has a pose type from items (not active pose unless an item lets it through) - * @param {Character} C - Character to check for the pose type - * @param {string} Type - Pose type to check for within items - * @param {boolean} OnlyItems - Whether or not allowed activeposes should be ignored. - * @returns {boolean} - TRUE if the character has the pose type active - */ -function CharacterItemsHavePoseType(C, Type, OnlyItems) { - var PossiblePoses = PoseFemale3DCG.filter(P => P.Category == Type || P.Category == "BodyFull").map(P => P.Name); - - for (let A = 0; A < C.Appearance.length; A++) { - if (!OnlyItems && C.Appearance[A].Asset.AllowActivePose != null && (C.Appearance[A].Asset.AllowActivePose.find(P => PossiblePoses.includes(P) && C.AllowedActivePose.includes(P)))) - return true; - if ((C.Appearance[A].Property != null) && (C.Appearance[A].Property.SetPose != null) && (C.Appearance[A].Property.SetPose.find(P => PossiblePoses.includes(P)))) - return true; - else if (C.Appearance[A].Asset.SetPose != null && (C.Appearance[A].Asset.SetPose.find(P => PossiblePoses.includes(P)))) - return true; - else if (C.Appearance[A].Asset.Group.SetPose != null && (C.Appearance[A].Asset.Group.SetPose.find(P => PossiblePoses.includes(P)))) - return true; - } - return false; -} - -/** - * Refreshes the list of poses for a character. Each pose can only be found once in the pose array - * @param {Character} C - Character for which to refresh the pose list - * @returns {void} - Nothing - */ -function CharacterLoadPose(C) { - C.Pose = []; - C.AllowedActivePose = []; - - for (let i = 0, Item = null; i < C.Appearance.length; i++) { - Item = C.Appearance[i]; - const AllowActivePose = InventoryGetItemProperty(Item, "AllowActivePose"); - if (Array.isArray(AllowActivePose)) AllowActivePose.forEach(Pose => C.AllowedActivePose.push(Pose)); - - const SetPose = InventoryGetItemProperty(Item, "SetPose", true); - if (SetPose != null) CharacterAddPose(C, SetPose); - } - - // Add possible active poses (Bodyfull can only be alone, and cannot have two of upperbody or bodylower) - var Poses = C.Pose.map(CP => PoseFemale3DCG.find(P => P.Name == CP)).filter(P => P); - if (C.ActivePose != null && typeof C.ActivePose == "string") C.ActivePose = [C.ActivePose]; - - if (C.ActivePose != null && Array.isArray(C.ActivePose)) { - var ActivePoses = C.ActivePose - .map(CP => PoseFemale3DCG.find(P => P.Name == CP)) - .filter(P => P); - - for (let P = 0; P < ActivePoses.length; P++) { - var HasPose = C.Pose.includes(ActivePoses[P].Name); - var IsAllowed = C.AllowedActivePose.includes(ActivePoses[P].Name) && CharacterItemsHavePoseAvailable(C, ActivePoses[P].Category, ActivePoses[P].Name); - var MissingGroup = !Poses.find(Pose => Pose.Category == "BodyFull") && !Poses.find(Pose => Pose.Category == ActivePoses[P].Category); - var IsFullBody = C.Pose.length > 0 && ActivePoses[P].Category == "BodyFull"; - if (!HasPose && (IsAllowed || (MissingGroup && !IsFullBody))) - C.Pose.push(ActivePoses[P].Name); - } - } -} - -/** - * Refreshes the list of effects for a character. Each effect can only be found once in the effect array - * @param {Character} C - Character for which to refresh the effect list - * @returns {void} - Nothing - */ -function CharacterLoadEffect(C) { - C.Effect = CharacterGetEffects(C); - CharacterLoadTints(C); -} - -/** - * Returns a list of effects for a character from some or all groups - * @param {Character} C - The character to check - * @param {string[]} [Groups=null] - Optional: The list of groups to consider. If none defined, check all groups - * @param {boolean} [AllowDuplicates=false] - Optional: If true, keep duplicates of the same effect provided they're taken from different groups - * @returns {string[]} - A list of effects - */ -function CharacterGetEffects(C, Groups = null, AllowDuplicates = false) { - let totalEffects = []; - C.Appearance - .filter(A => !Array.isArray(Groups) || Groups.length == 0 || Groups.includes(A.Asset.Group.Name)) - .forEach(item => { - let itemEffects = []; - let overrideAsset = false; - - if (item.Property && Array.isArray(item.Property.Effect)) { - CommonArrayConcatDedupe(itemEffects, item.Property.Effect); - overrideAsset = !!item.Property.OverrideAssetEffect; - } - if (!overrideAsset) { - if (Array.isArray(item.Asset.Effect)) { - CommonArrayConcatDedupe(itemEffects, item.Asset.Effect); - } else if (Array.isArray(item.Asset.Group.Effect)) { - CommonArrayConcatDedupe(itemEffects, item.Asset.Group.Effect); - } - } - - if (AllowDuplicates) { - totalEffects = totalEffects.concat(itemEffects); - } else { - CommonArrayConcatDedupe(totalEffects, itemEffects); - } - }); - return totalEffects; -} - -/** - * Loads a character's tints, resolving tint definitions against items from the character's appearance - * @param {Character} C - Character whose tints should be loaded - * @returns {void} - Nothing - */ -function CharacterLoadTints(C) { - // Tints on non-player characters don't have any effect right now, so don't bother loading them - if (!C.IsPlayer()) { - return; - } - - /** @type {ResolvedTintDefinition[]} */ - const tints = []; - for (const item of C.Appearance) { - /** @type {TintDefinition[]} */ - const itemTints = InventoryGetItemProperty(item, "Tint"); - if (Array.isArray(itemTints)) { - tints.push(...itemTints.map(({Color, Strength, DefaultColor}) => ({Color, Strength, DefaultColor, Item: item}))); - } - } - C.Tints = tints; -} - -/** - * Loads a character's canvas by sorting its appearance and drawing it. - * @param {Character} C - Character to load the canvas for - * @returns {void} - Nothing - */ -function CharacterLoadCanvas(C) { - // Reset the property that tracks if wearing a hidden item - C.HasHiddenItems = false; - - // We add a temporary appearance and pose here so that it can be modified by hooks. We copy the arrays so no hooks can alter the reference accidentally - C.DrawAppearance = AppearanceItemParse(CharacterAppearanceStringify(C)); - C.DrawPose = C.Pose.slice(); // Deep copy of pose array - - - // Run BeforeSortLayers hook - if (C.Hooks && typeof C.Hooks.get == "function") { - let hooks = C.Hooks.get("BeforeSortLayers"); - if (hooks) - hooks.forEach((hook) => hook(C)); // If there's a hook, call it - } - - // Generates a layer array from the character's appearance array, sorted by drawing order - C.AppearanceLayers = CharacterAppearanceSortLayers(C); - - // Run AfterLoadCanvas hooks - if (C.Hooks && typeof C.Hooks.get == "function") { - let hooks = C.Hooks.get("AfterLoadCanvas"); - if (hooks) - hooks.forEach((hook) => hook(C)); // If there's a hook, call it - } - - // Sets the total height modifier for that character - CharacterAppearanceSetHeightModifiers(C); - - // Reload the canvas - CharacterAppearanceBuildCanvas(C); -} - -/** - * Reloads all character canvases in need of being redrawn. - * @returns {void} - Nothing - */ -function CharacterLoadCanvasAll() { - for (let C = 0; C < Character.length; C++) - if (Character[C].MustDraw) { - CharacterLoadCanvas(Character[C]); - Character[C].MustDraw = false; - } -} - -/** - * Refreshes the character parameters (Effects, poses, canvas, settings, etc.) - * @param {Character} C - Character to refresh - * @param {boolean} [Push=true] - Pushes the data to the server if true or null - * @param {boolean} [RefreshDialog=true] - Refreshes the character dialog - * @returns {void} - Nothing - */ -function CharacterRefresh(C, Push, RefreshDialog = true) { - AnimationPurge(C, false); - CharacterLoadEffect(C); - CharacterLoadPose(C); - CharacterLoadCanvas(C); - // Label often looped through checks: - C.RunScripts = (!C.AccountName.startsWith('Online-') || !(Player.OnlineSettings && Player.OnlineSettings.DisableAnimations)) && (!Player.GhostList || Player.GhostList.indexOf(C.MemberNumber) == -1); - C.HasScriptedAssets = !!C.Appearance.find(CA => CA.Asset.DynamicScriptDraw); -} - -/** - * Checks if a character is wearing items (restraints), the slave collar is ignored. - * @param {Character} C - Character to inspect the appearance of - * @returns {boolean} - Returns TRUE if the given character is wearing an item - */ -function CharacterHasNoItem(C) { - for (let A = 0; A < C.Appearance.length; A++) - if ((C.Appearance[A].Asset != null) && (C.Appearance[A].Asset.Group.Category == "Item")) - if (C.Appearance[A].Asset.Group.Name != "ItemNeck" || (C.Appearance[A].Asset.Group.Name == "ItemNeck" && !InventoryOwnerOnlyItem(C.Appearance[A]))) - return false; - return true; -} - -/** - * Checks if a character is naked - * @param {Character} C - Character to inspect the appearance of - * @returns {boolean} - Returns TRUE if the given character is naked - */ -function CharacterIsNaked(C) { - for (const A of C.Appearance) - if ( - (A.Asset != null) && - // Ignore items - (A.Asset.Group.Category == "Appearance") && - // Ignore body parts - A.Asset.Group.AllowNone && - // Always ignore all cosplay items - !A.Asset.BodyCosplay && - !A.Asset.Group.BodyCosplay && - // Ignore cosplay items if they are considered bodypart (BlockBodyCosplay) - ( - C.IsNpc() || - !( - A.Asset.Group.BodyCosplay && - C.OnlineSharedSettings && - C.OnlineSharedSettings.BlockBodyCosplay - ) - ) - ) - return false; - return true; -} - -/** - * Checks if a character is in underwear - * @param {Character} C - Character to inspect the appearance of - * @returns {boolean} - Returns TRUE if the given character is in underwear - */ -function CharacterIsInUnderwear(C) { - for (let A = 0; A < C.Appearance.length; A++) - if ((C.Appearance[A].Asset != null) && (C.Appearance[A].Asset.Group.Category == "Appearance") && C.Appearance[A].Asset.Group.AllowNone && !C.Appearance[A].Asset.BodyCosplay && !C.Appearance[A].Asset.Group.BodyCosplay) - if (!C.Appearance[A].Asset.Group.Underwear) - if (C.IsNpc() || !(C.Appearance[A].Asset.Group.BodyCosplay && C.OnlineSharedSettings && C.OnlineSharedSettings.BlockBodyCosplay)) - return false; - return true; -} - -/** - * Removes all appearance items from the character - * @param {Character} C - Character to undress - * @returns {void} - Nothing - */ -function CharacterNaked(C) { - CharacterAppearanceNaked(C); - CharacterRefresh(C); -} - -/** - * Sets a new pose for the character - * @param {Character} C - Character for which to set the pose - * @param {string} NewPose - Name of the pose to set as active - * @param {boolean} [ForceChange=false] - TRUE if the set pose(s) should overwrite current active pose(s) - * @returns {void} - Nothing - */ -function CharacterSetActivePose(C, NewPose, ForceChange = false) { - if (NewPose == null || ForceChange || C.ActivePose == null) { - C.ActivePose = NewPose; - CharacterRefresh(C, false); - return; - } - - if (C.ActivePose == null) C.ActivePose = []; - if (typeof C.ActivePose == "string") C.ActivePose = [C.ActivePose]; - - const PreviousPoses = C.ActivePose.map(AP => PoseFemale3DCG.find(P => P.Name == AP)).filter(AP => typeof AP == "object"); - const Pose = PoseFemale3DCG.find(P => P.Name == NewPose); - - // We only allow poses of different categories to be matched together - if (Pose && Pose.Category) { - C.ActivePose = PreviousPoses - .filter(PP => PP.AllowMenu && Pose.Category !== "BodyFull" && PP.Category !== "BodyFull" && PP.Category !== Pose.Category) - .map(AP => AP.Name); - C.ActivePose.push(Pose.Name); - } - - // If we reset to base, we remove the poses - if (C.ActivePose.filter(P => P !== "BaseUpper" && P !== "BaseLower").length == 0) C.ActivePose = null; - - CharacterRefresh(C, false); -} - -/** - * Sets a specific facial expression for the character's specified AssetGroup, if there's a timer, the expression will expire after it, a - * timed expression cannot override another one. - * @param {Character} C - Character for which to set the expression of - * @param {string} AssetGroup - Asset group for the expression - * @param {string} Expression - Name of the expression to use - * @param {number} [Timer] - Optional: time the expression will last - * @param {string|string[]} [Color] - Optional: color of the expression to set - * @returns {void} - Nothing - */ -function CharacterSetFacialExpression(C, AssetGroup, Expression, Timer, Color) { - // A normal eye expression is triggered for both eyes - if (AssetGroup == "Eyes") CharacterSetFacialExpression(C, "Eyes2", Expression, Timer); - if (AssetGroup == "Eyes1") AssetGroup = "Eyes"; - - var Ex = InventoryGet(C, AssetGroup); - if ((Timer != null) && (Ex != null) && (Ex.Property != null) && (Ex.Property.Expression != null) && (Ex.Property.Expression != "")) return; - for (let A = 0; A < C.Appearance.length; A++) { - if ((C.Appearance[A].Asset.Group.Name == AssetGroup) && (C.Appearance[A].Asset.Group.AllowExpression)) { - if ((Expression == null) || (C.Appearance[A].Asset.Group.AllowExpression.indexOf(Expression) >= 0)) { - if (!C.Appearance[A].Property) C.Appearance[A].Property = {}; - // Delete any existing removal timer - delete C.Appearance[A].Property.RemoveTimer; - if (C.Appearance[A].Property.Expression != Expression) { - C.Appearance[A].Property.Expression = Expression; - if (Color && CommonColorIsValid(Color)) C.Appearance[A].Color = Color; - CharacterRefresh(C); - } - if (Timer != null) TimerInventoryRemoveSet(C, AssetGroup, Timer); - return; - } - } - } -} - -/** - * Resets the character's facial expression to the default - * @param {Character} C - Character for which to reset the expression of - * @returns {void} - Nothing - */ -function CharacterResetFacialExpression(C) { - for (let A = 0; A < C.Appearance.length; A++) - if (C.Appearance[A].Asset.Group.AllowExpression) - CharacterSetFacialExpression(C, C.Appearance[A].Asset.Group.Name, null); -} - -/** - * Gets the currently selected character - * @returns {Character|null} - Currently selected character - */ -function CharacterGetCurrent() { - if (CurrentScreen == "Appearance" && CharacterAppearanceSelection) return CharacterAppearanceSelection; - return (Player.FocusGroup != null) ? Player : CurrentCharacter; -} - -/** - * Compresses a character wardrobe from an array to a LZ string to use less storage space - * @param {Array.>} Wardrobe - Uncompressed wardrobe - * @returns {string} - The compressed wardrobe - */ -/*function CharacterCompressWardrobe(Wardrobe) { - if (Array.isArray(Wardrobe) && (Wardrobe.length > 0)) { - var CompressedWardrobe = []; - for (let W = 0; W < Wardrobe.length; W++) { - var Arr = []; - if (Wardrobe[W] != null) - for (let A = 0; A < Wardrobe[W].length; A++) - Arr.push([Wardrobe[W][A].Name, Wardrobe[W][A].Group, Wardrobe[W][A].Color, Wardrobe[W][A].Property]); - CompressedWardrobe.push(Arr); - } - return LZString.compressToUTF16(JSON.stringify(CompressedWardrobe)); - } else return ""; -}*/ - - -/** - * Checks if the character is wearing an item that has a specific attribute - * @param {Character} C - The character to test for - * @param {string} Attribute - The name of the attribute that must be allowed - * @returns {boolean} - TRUE if at least one item has that attribute - */ -function CharacterHasItemWithAttribute(C, Attribute) { - return C.Appearance.some(item => { - const attrs = InventoryGetItemProperty(item, "Attribute"); - return attrs && attrs.includes(Attribute); - }); -} - -/** - * Checks if the character is edged or not. The character is edged if every equipped vibrating item on an orgasm zone has the "Edged" effect - * @param {Character} C - The character to check - * @returns {boolean} - TRUE if the character is edged, FALSE otherwise - */ -function CharacterIsEdged(C) { - if (C.ID !== 0 || !C.Effect.includes("Edged")) { - return false; - } - - // Get all zones that allow an orgasm - let OrgasmZones = C.ArousalSettings.Zone - .filter(Zone => Zone.Orgasm) - .map(Zone => Zone.Name); - - // Get every vibrating item acting on an orgasm zone - const VibratingItems = C.Appearance - .filter(A => OrgasmZones.indexOf(A.Asset.ArousalZone) >= 0) - .filter(Item => Item - && Item.Property - && Array.isArray(Item.Property.Effect) - && Item.Property.Effect.includes("Vibrating") - && typeof Item.Property.Intensity === "number" - && Item.Property.Intensity >= 0 - ); - - // Return true if every vibrating item on an orgasm zone has the "Edged" effect - return !!VibratingItems.length && VibratingItems.every(Item => Item.Property.Effect && Item.Property.Effect.includes("Edged")); -} - -/** - * Returns whether the character appears upside-down on the screen which may depend on the player's own inverted status - * @param {Character} C - The character to check - * @returns {boolean} - If TRUE, the character appears upside-down - */ -function CharacterAppearsInverted(C) { - return Player.GraphicsSettings && Player.GraphicsSettings.InvertRoom ? Player.IsInverted() != C.IsInverted() : C.IsInverted(); -} - -/** - * Checks whether the given character can kneel unaided - * @param {Character} C - The character to check - * @returns {boolean} - Returns true if the character is capable of kneeling unaided, false otherwise - */ -function CharacterCanKneel(C) { - if (C.Effect.includes("Freeze") || C.Effect.includes("ForceKneel")) return false; - if (C.Pose == null) return true; - if (C.Pose.includes("Suspension") || C.Pose.includes("Hogtied")) return false; - return C.CanChangeToPose("Kneel"); -} - -/** - * Determines how much the character's view should be darkened based on their blind level. 1 is fully visible, 0 is pitch black. - * @param {Character} C - The character to check - * @param {boolean} [eyesOnly=false] - If TRUE only check whether the character has eyes closed, and ignore item effects - * @returns {number} - The number between 0 (dark) and 1 (bright) that determines screen darkness - */ -function CharacterGetDarkFactor(C, eyesOnly = false) { - let DarkFactor = 1.0; - const blindLevel = C.GetBlindLevel(eyesOnly); - if (blindLevel >= 3) DarkFactor = 0.0; - else if (CommonPhotoMode) DarkFactor = 1.0; - else if (blindLevel === 2) DarkFactor = 0.15; - else if (blindLevel === 1) DarkFactor = 0.3; - return DarkFactor; -} - -/** - * Gets the array of color tints that should be applied for a character in RGBA format. - * @param {Character} C - The character - * @returns {RGBAColor[]} - A list of RGBA tints that are currently affecting the character - */ -function CharacterGetTints(C) { - if (!C.HasTints()) { - return []; - } - /** @type {RGBAColor[]} */ - const tints = C.Tints.map(({Color, Strength, DefaultColor, Item}) => { - let colorIndex = 0; - if (typeof Color === "number") { - colorIndex = Color; - if (typeof Item.Color === "string") { - Color = Item.Color; - } else if (Array.isArray(Item.Color)) { - Color = Item.Color[Color] || "Default"; - } else { - Color = "Default"; - } - } - if (Color === "Default") { - if (Item.Asset.DefaultColor) { - Color = Array.isArray(Item.Asset.DefaultColor) ? Item.Asset.DefaultColor[colorIndex] : Item.Asset.DefaultColor; - } else if (typeof DefaultColor === "string") { - Color = DefaultColor; - } else if (typeof Item.Asset.DefaultTint === "string") { - Color = Item.Asset.DefaultTint; - } - } - const {r, g, b} = DrawHexToRGB(Color); - return {r, g, b, a: Math.max(0, Math.min(Strength, 1))}; - }); - return tints.filter(({a}) => a > 0); -} - -/** - * Gets the clumsiness level of a character. This represents dexterity when interacting with locks etc. and can have a - * maximum value of 5. - * @param {Character} C - The character to check - * @returns {number} - The clumsiness rating of the player, a number between 0 and 5 inclusive. - */ -function CharacterGetClumsiness(C) { - let clumsiness = 0; - if (!C.CanInteract()) clumsiness += 1; - const armItem = InventoryGet(C, "ItemArms"); - if (armItem && armItem.Asset.IsRestraint && InventoryItemHasEffect(armItem, "Block")) clumsiness += 2; - const handItem = InventoryGet(C, "ItemHands"); - if (handItem && handItem.Asset.IsRestraint && InventoryItemHasEffect(handItem, "Block")) clumsiness += 3; - return Math.min(clumsiness, 5); -} - -/** - * Applies hooks to a character based on conditions - * Future hooks go here - * @param {Character} C - The character to check - * @param {boolean} IgnoreHooks - Whether to remove some hooks from the player (such as during character dialog). - * @returns {boolean} - If a hook was applied or removed - */ -function CharacterCheckHooks(C, IgnoreHooks) { - var refresh = false; - if (C && C.DrawAppearance) { - if (!IgnoreHooks && Player.Effect.includes("VRAvatars") && C.Effect.includes("HideRestraints")) { - // Then when that character enters the virtual world, register a hook to strip out restraint layers (if needed): - if (C.RegisterHook("BeforeSortLayers", "HideRestraints", (C) => { - C.DrawAppearance = C.DrawAppearance.filter((Layer) => !(Layer.Asset && Layer.Asset.IsRestraint)); - C.DrawPose = C.DrawPose.filter((Pose) => (Pose != "TapedHands")); - - })) refresh = true; - } else if (C.UnregisterHook("BeforeSortLayers", "HideRestraints")) refresh = true; - - // Hook for layer visibility - // Visibility is a string individual layers have. If an item has any layers with visibility, it should have the LayerVisibility: true property - // We basically check the player's items and see if any are visible that have the LayerVisibility property. - let LayerVisibility = false; - for (let A = 0; A < C.DrawAppearance.length; A++) { - if (C.DrawAppearance[A].Asset && C.DrawAppearance[A].Asset.LayerVisibility) { - LayerVisibility = true; - break; - } - } - if (LayerVisibility) { - // Fancy logic is to use a different hook for when the character is focused - if (IgnoreHooks && (C.UnregisterHook("AfterLoadCanvas", "LayerVisibility") || C.RegisterHook("AfterLoadCanvas", "LayerVisibilityDialog", (C) => { - C.AppearanceLayers = C.AppearanceLayers.filter((Layer) => ( - !Layer.Visibility || - (Layer.Visibility == "Player" && C == Player) || - (Layer.Visibility == "AllExceptPlayerDialog" && C != Player) || - (Layer.Visibility == "Others" && C != Player) || - (Layer.Visibility == "OthersExceptDialog") || - (Layer.Visibility == "Owner" && C.IsOwnedByPlayer()) || - (Layer.Visibility == "Lovers" && C.IsLoverOfPlayer()) || - (Layer.Visibility == "Mistresses") - )); - }))) refresh = true; - // Use the regular hook when the character is not - else if (!IgnoreHooks && (C.UnregisterHook("AfterLoadCanvas", "LayerVisibilityDialog") || C.RegisterHook("AfterLoadCanvas", "LayerVisibility", (C) => { - C.AppearanceLayers = C.AppearanceLayers.filter((Layer) => ( - !Layer.Visibility || - (Layer.Visibility == "Player" && C == Player) || - (Layer.Visibility == "AllExceptPlayerDialog") || - (Layer.Visibility == "Others" && C != Player) || - (Layer.Visibility == "OthersExceptDialog" && C != Player) || - (Layer.Visibility == "Owner" && C.IsOwnedByPlayer()) || - (Layer.Visibility == "Lovers" && C.IsLoverOfPlayer()) || - (Layer.Visibility == "Mistresses") - )); - }))) refresh = true; - - } else if (C.UnregisterHook("AfterLoadCanvas", "LayerVisibility")) refresh = true; - } - - if (refresh) CharacterLoadCanvas(C); - return refresh; -} - -/** - * Returns the nickname of a character, or the name if the nickname isn't valid - * Also validates if the character is a GGTS drone to alter her name - * @param {Character} C - The character breaking from their owner - * @returns {String} - The nickname to return - */ -function CharacterNickname(C) { - let Regex = /^[a-zA-Z\s]*$/; - let Nick = C.Nickname; - if (Nick == null) Nick = ""; - Nick = Nick.trim().substring(0, 20); - if ((Nick == "") || !Regex.test(Nick)) Nick = C.Name; - return Nick; -} - - - -/** - * Loads an NPC into the character array. The appearance is randomized, and a type can be provided to dress them in a given style. - * @param {string} NPCType - Archetype of the NPC - * @returns {NPCCharacter} - The randomly generated NPC - */ -function CharacterLoadNPC(NPCType) { - - // Checks if the NPC already exists and returns it if it's the case - for (let C = 0; C < Character.length; C++) - if (Character[C].AccountName == NPCType) - return Character[C]; - - // Randomize the new character - CharacterReset(CharacterNextId++, "Female3DCG", CharacterType.NPC); - let C = Character[Character.length - 1]; - C.AccountName = NPCType; - CharacterRandomName(C); - CharacterAppearanceBuildAssets(C); - CharacterAppearanceFullRandom(C); - - // Returns the new character - return C; - -} - -/** - * Removes all items except for clothing and slave collars from the character - * @param {Character} C - Character to release - * @returns {void} - Nothing - */ -function CharacterReleaseTotal(C) { - for (let E = C.Appearance.length - 1; E >= 0; E--) { - if (!C.Appearance[E].Asset || C.Appearance[E].Asset.Group.Category != "Appearance") { - if (C.IsOwned() && C.Appearance[E].Asset?.Name == "SlaveCollar") { - // Reset slave collar to the default model if it has a gameplay effect (such as gagging the player) - if (C.Appearance[E].Property && C.Appearance[E].Property.Effect && C.Appearance[E].Property.Effect.length > 0) - delete C.Appearance[E].Property; - } - else { - C.Appearance.splice(E, 1); - } - } - } - CharacterRefresh(C); -} \ No newline at end of file diff --git a/Scripts/Character.ts b/Scripts/Character.ts new file mode 100644 index 000000000..3505d07f7 --- /dev/null +++ b/Scripts/Character.ts @@ -0,0 +1,158 @@ +let Character: Character[] = []; +let CharacterNextId = 1; + +/** + * Loads a character into the buffer, creates it if it does not exist + * @param CharacterID - ID of the character + * @param CharacterAssetFamily - Name of the asset family of the character + * @param Type - The character type + * @returns The newly loaded character + */ +function CharacterReset(CharacterID: number): Character { + + // Prepares the character sheet + let NewCharacter: Character = { + ID: CharacterID, + Name: "", + Palette: "", + Appearance: [], + HeightModifier: 0, + Pose: [], + }; + + // Creates the inventory and default appearance + if (CharacterID == 0 && !DefaultPlayer) { + DefaultPlayer = NewCharacter; + CharacterAppearanceSetDefault(NewCharacter); + } + + + return NewCharacter; +} + + +/** + * Adds a pose to a character's pose list, does not add it if it's already there + * @param C - Character for which to add a pose to its list + * @param NewPose - The name of the pose to add + */ +function CharacterAddPose(C: Character, NewPose: string): void { + for (let E = 0; E < NewPose.length; E++) + if (C.Pose.indexOf(NewPose[E]) < 0) + C.Pose.push(NewPose[E]); +} + + +/** + * Checks if a certain pose is whitelisted and available for the pose menu + * @param C - Character to check for the pose + * @param Type - Pose type to check for within items + * @param Pose - Pose to check for whitelist + * @returns TRUE if the character has the pose available + */ +function CharacterItemsHavePoseAvailable(C: Character, Type: string | undefined, Pose: string): boolean { + return true; +} + +/** + * Checks whether the items on a character set a given pose on the character + * @param C - The character to check + * @param pose - The name of the pose to check for + * @param excludeClothes - Ignore clothing items in the check + * @returns Returns true if the character is wearing an item that sets the given pose, false otherwise + */ +function CharacterDoItemsSetPose(C: Character, pose: string, excludeClothes: boolean = false): boolean { + return false; +} + + + + +/** + * Removes all appearance items from the character + * @param C - Character to undress + */ +function CharacterNaked(C: Character): void { + CharacterAppearanceNaked(C); +} + +/** + * Sets a new pose for the character + * @param C - Character for which to set the pose + * @param NewPose - Name of the pose to set as active + * @param ForceChange - TRUE if the set pose(s) should overwrite current active pose(s) + */ +function CharacterSetActivePose(C: Character, NewPose: string, ForceChange: boolean = false): void {} + +/** + * Sets a specific facial expression for the character's specified AssetGroup, if there's a timer, the expression will expire after it, a + * timed expression cannot override another one. + * @param C - Character for which to set the expression of + * @param AssetGroup - Asset group for the expression + * @param Expression - Name of the expression to use + * @param Timer - Optional: time the expression will last + * @param Color Optional: color of the expression to set + */ +function CharacterSetFacialExpression(C: Character, AssetGroup: string, Expression: string, Timer: number = null, Color: string | string[] = null): void { + if (StandalonePatched) { + // TODO add facial expression handling + return; + } +} + +/** + * Resets the character's facial expression to the default + * @param C - Character for which to reset the expression of + */ +function CharacterResetFacialExpression(C: Character): void { + if (StandalonePatched) { + // TODO add facial expression handling + return; + } +} + +/** + * Gets the currently selected character + */ +function CharacterGetCurrent(): Character | null { + return DefaultPlayer; +} + +/** + * Returns the nickname of a character, or the name if the nickname isn't valid + * Also validates if the character is a GGTS drone to alter her name + * @param C - The character breaking from their owner + * @returns The nickname to return + */ +function CharacterNickname(C: Character): string { + return ""; +} + + + +/** + * Loads an NPC into the character array. The appearance is randomized, and a type can be provided to dress them in a given style. + * @param NPCType - Archetype of the NPC + * @returns The randomly generated NPC + */ +function CharacterLoadNPC(id: number, Name: string, Palette?: string): Character { + const CNew = CharacterReset(id); + CNew.Name = Name; + if (Palette) + CNew.Palette = Palette; + // Returns the new character + return CNew; + +} + +/** + * Removes all items except for clothing and slave collars from the character + * @param C - Character to release + */ +function CharacterReleaseTotal(C: Character): void { + for (let E = C.Appearance.length - 1; E >= 0; E--) { + if (C.Appearance[E].Model?.Restraint) { + C.Appearance.splice(E, 1); + } + } +} \ No newline at end of file diff --git a/Scripts/CharacterName.js b/Scripts/CharacterName.js deleted file mode 100644 index c78117883..000000000 --- a/Scripts/CharacterName.js +++ /dev/null @@ -1,994 +0,0 @@ -"use strict"; -var CharacterName = [ - "Emma", - "Olivia", - "Ava", - "Isabella", - "Sophia", - "Mia", - "Charlotte", - "Amelia", - "Evelyn", - "Abigail", - "Harper", - "Emily", - "Elizabeth", - "Avery", - "Sofia", - "Ella", - "Madison", - "Scarlett", - "Victoria", - "Aria", - "Grace", - "Chloe", - "Camila", - "Penelope", - "Riley", - "Layla", - "Lillian", - "Nora", - "Zoey", - "Mila", - "Aubrey", - "Hannah", - "Lily", - "Addison", - "Eleanor", - "Natalie", - "Luna", - "Savannah", - "Brooklyn", - "Leah", - "Zoe", - "Stella", - "Hazel", - "Ellie", - "Paisley", - "Audrey", - "Skylar", - "Violet", - "Claire", - "Bella", - "Aurora", - "Lucy", - "Anna", - "Samantha", - "Caroline", - "Genesis", - "Aaliyah", - "Kennedy", - "Kinsley", - "Allison", - "Maya", - "Madelyn", - "Adeline", - "Alexa", - "Ariana", - "Elena", - "Gabriella", - "Naomi", - "Alice", - "Sadie", - "Hailey", - "Eva", - "Emilia", - "Autumn", - "Quinn", - "Nevaeh", - "Piper", - "Ruby", - "Serenity", - "Willow", - "Everly", - "Cora", - "Kaylee", - "Lydia", - "Aubree", - "Arianna", - "Eliana", - "Peyton", - "Melanie", - "Gianna", - "Isabelle", - "Valentina", - "Nova", - "Clara", - "Vivian", - "Reagan", - "Mackenzie", - "Madeline", - "Brielle", - "Delilah", - "Isla", - "Rylee", - "Katherine", - "Josephine", - "Ivy", - "Liliana", - "Jade", - "Maria", - "Taylor", - "Hadley", - "Kylie", - "Emery", - "Adalynn", - "Natalia", - "Annabelle", - "Faith", - "Alexandra", - "Ximena", - "Ashley", - "Brianna", - "Raelynn", - "Bailey", - "Mary", - "Athena", - "Andrea", - "Leilani", - "Jasmine", - "Lyla", - "Margaret", - "Alyssa", - "Adalyn", - "Arya", - "Norah", - "Khloe", - "Kayla", - "Eden", - "Eliza", - "Rose", - "Ariel", - "Melody", - "Alexis", - "Isabel", - "Sydney", - "Juliana", - "Lauren", - "Iris", - "Emerson", - "London", - "Morgan", - "Lilly", - "Charlie", - "Aliyah", - "Valeria", - "Arabella", - "Sara", - "Finley", - "Trinity", - "Ryleigh", - "Jordyn", - "Jocelyn", - "Kimberly", - "Esther", - "Molly", - "Valerie", - "Cecilia", - "Anastasia", - "Daisy", - "Reese", - "Laila", - "Mya", - "Amy", - "Teagan", - "Amaya", - "Elise", - "Harmony", - "Paige", - "Adaline", - "Fiona", - "Alaina", - "Nicole", - "Genevieve", - "Lucia", - "Alina", - "Mckenzie", - "Callie", - "Payton", - "Eloise", - "Brooke", - "Londyn", - "Mariah", - "Julianna", - "Rachel", - "Daniela", - "Gracie", - "Catherine", - "Angelina", - "Presley", - "Josie", - "Harley", - "Adelyn", - "Vanessa", - "Makayla", - "Parker", - "Juliette", - "Amara", - "Marley", - "Lila", - "Ana", - "Rowan", - "Alana", - "Michelle", - "Malia", - "Rebecca", - "Brooklynn", - "Brynlee", - "Summer", - "Sloane", - "Leila", - "Sienna", - "Adriana", - "Sawyer", - "Kendall", - "Juliet", - "Destiny", - "Alayna", - "Elliana", - "Diana", - "Hayden", - "Ayla", - "Dakota", - "Angela", - "Noelle", - "Rosalie", - "Joanna", - "Jayla", - "Alivia", - "Lola", - "Emersyn", - "Georgia", - "Selena", - "June", - "Daleyza", - "Tessa", - "Maggie", - "Jessica", - "Remi", - "Delaney", - "Camille", - "Vivienne", - "Hope", - "Mckenna", - "Gemma", - "Olive", - "Alexandria", - "Blakely", - "Izabella", - "Catalina", - "Raegan", - "Journee", - "Gabrielle", - "Lucille", - "Ruth", - "Amiyah", - "Evangeline", - "Blake", - "Thea", - "Amina", - "Giselle", - "Lilah", - "Melissa", - "River", - "Kate", - "Adelaide", - "Charlee", - "Vera", - "Leia", - "Gabriela", - "Zara", - "Jane", - "Journey", - "Elaina", - "Miriam", - "Briella", - "Stephanie", - "Cali", - "Ember", - "Lilliana", - "Aniyah", - "Logan", - "Kamila", - "Brynn", - "Ariella", - "Makenzie", - "Annie", - "Mariana", - "Kali", - "Haven", - "Elsie", - "Nyla", - "Paris", - "Lena", - "Freya", - "Adelynn", - "Lyric", - "Camilla", - "Sage", - "Paislee", - "Talia", - "Alessandra", - "Juniper", - "Fatima", - "Raelyn", - "Amira", - "Arielle", - "Phoebe", - "Kinley", - "Ada", - "Nina", - "Ariah", - "Samara", - "Myla", - "Brinley", - "Cassidy", - "Maci", - "Aspen", - "Allie", - "Keira", - "Kaia", - "Makenna", - "Heaven", - "Joy", - "Lia", - "Madilyn", - "Gracelyn", - "Laura", - "Evelynn", - "Lexi", - "Haley", - "Miranda", - "Kaitlyn", - "Daniella", - "Felicity", - "Jacqueline", - "Evie", - "Angel", - "Danielle", - "Ainsley", - "Dylan", - "Kiara", - "Millie", - "Jordan", - "Maddison", - "Rylie", - "Alicia", - "Maeve", - "Margot", - "Kylee", - "Phoenix", - "Heidi", - "Zuri", - "Alondra", - "Lana", - "Madeleine", - "Gracelynn", - "Kenzie", - "Miracle", - "Shelby", - "Elle", - "Adrianna", - "Bianca", - "Addilyn", - "Kira", - "Veronica", - "Gwendolyn", - "Esmeralda", - "Chelsea", - "Alison", - "Skyler", - "Magnolia", - "Daphne", - "Jenna", - "Everleigh", - "Kyla", - "Braelynn", - "Harlow", - "Annalise", - "Mikayla", - "Dahlia", - "Maliyah", - "Averie", - "Scarlet", - "Kayleigh", - "Luciana", - "Kelsey", - "Nadia", - "Amber", - "Gia", - "Kamryn", - "Yaretzi", - "Carmen", - "Jimena", - "Erin", - "Christina", - "Katie", - "Ryan", - "Viviana", - "Alexia", - "Anaya", - "Serena", - "Katelyn", - "Ophelia", - "Regina", - "Helen", - "Remington", - "Camryn", - "Cadence", - "Royalty", - "Amari", - "Kathryn", - "Skye", - "Emely", - "Jada", - "Ariyah", - "Aylin", - "Saylor", - "Kendra", - "Cheyenne", - "Fernanda", - "Sabrina", - "Francesca", - "Eve", - "Mckinley", - "Frances", - "Sarai", - "Carolina", - "Kennedi", - "Nylah", - "Tatum", - "Alani", - "Lennon", - "Raven", - "Zariah", - "Leslie", - "Winter", - "Abby", - "Mabel", - "Sierra", - "April", - "Willa", - "Carly", - "Jolene", - "Rosemary", - "Aviana", - "Madelynn", - "Selah", - "Renata", - "Lorelei", - "Briana", - "Celeste", - "Wren", - "Charleigh", - "Leighton", - "Annabella", - "Jayleen", - "Braelyn", - "Ashlyn", - "Jazlyn", - "Mira", - "Oakley", - "Malaysia", - "Edith", - "Avianna", - "Maryam", - "Emmalyn", - "Hattie", - "Kensley", - "Macie", - "Bristol", - "Marlee", - "Demi", - "Cataleya", - "Maia", - "Sylvia", - "Itzel", - "Allyson", - "Lilith", - "Melany", - "Kaydence", - "Holly", - "Nayeli", - "Meredith", - "Nia", - "Liana", - "Megan", - "Justice", - "Bethany", - "Alejandra", - "Janelle", - "Elisa", - "Adelina", - "Ashlynn", - "Elianna", - "Aleah", - "Myra", - "Lainey", - "Blair", - "Kassidy", - "Charley", - "Virginia", - "Kara", - "Helena", - "Sasha", - "Julie", - "Michaela", - "Carter", - "Matilda", - "Kehlani", - "Henley", - "Maisie", - "Hallie", - "Jazmin", - "Priscilla", - "Marilyn", - "Cecelia", - "Danna", - "Colette", - "Baylee", - "Elliott", - "Ivanna", - "Cameron", - "Celine", - "Alayah", - "Hanna", - "Imani", - "Angelica", - "Emelia", - "Kalani", - "Alanna", - "Lorelai", - "Macy", - "Karina", - "Addyson", - "Aleena", - "Aisha", - "Johanna", - "Mallory", - "Leona", - "Mariam", - "Kynlee", - "Madilynn", - "Karen", - "Karla", - "Skyla", - "Beatrice", - "Dayana", - "Gloria", - "Milani", - "Savanna", - "Karsyn", - "Rory", - "Giuliana", - "Lauryn", - "Liberty", - "Galilea", - "Aubrie", - "Charli", - "Kyleigh", - "Brylee", - "Jillian", - "Anne", - "Haylee", - "Dallas", - "Azalea", - "Jayda", - "Tiffany", - "Avah", - "Shiloh", - "Bailee", - "Jazmine", - "Esme", - "Coraline", - "Madisyn", - "Elaine", - "Lilian", - "Kyra", - "Kaliyah", - "Kora", - "Octavia", - "Irene", - "Kelly", - "Lacey", - "Laurel", - "Adley", - "Anika", - "Janiyah", - "Dorothy", - "Sutton", - "Julieta", - "Kimber", - "Remy", - "Cassandra", - "Rebekah", - "Collins", - "Elliot", - "Emmy", - "Sloan", - "Hayley", - "Amalia", - "Jemma", - "Jamie", - "Melina", - "Leyla", - "Jaylah", - "Anahi", - "Jaliyah", - "Kailani", - "Harlee", - "Wynter", - "Saige", - "Alessia", - "Monica", - "Anya", - "Antonella", - "Emberly", - "Khaleesi", - "Ivory", - "Greta", - "Maren", - "Alena", - "Emory", - "Alaia", - "Cynthia", - "Addisyn", - "Alia", - "Lylah", - "Angie", - "Ariya", - "Alma", - "Crystal", - "Jayde", - "Aileen", - "Kinslee", - "Siena", - "Zelda", - "Katalina", - "Marie", - "Pearl", - "Reyna", - "Mae", - "Zahra", - "Kailey", - "Jessie", - "Tiana", - "Amirah", - "Madalyn", - "Alaya", - "Lilyana", - "Julissa", - "Armani", - "Lennox", - "Lillie", - "Jolie", - "Laney", - "Roselyn", - "Mara", - "Joelle", - "Rosa", - "Kaylani", - "Bridget", - "Liv", - "Oaklyn", - "Aurelia", - "Clarissa", - "Elyse", - "Marissa", - "Monroe", - "Kori", - "Elsa", - "Rosie", - "Amelie", - "Aitana", - "Aliza", - "Eileen", - "Poppy", - "Emmie", - "Braylee", - "Milana", - "Addilynn", - "Royal", - "Chaya", - "Frida", - "Bonnie", - "Amora", - "Stevie", - "Tatiana", - "Malaya", - "Mina", - "Emerie", - "Reign", - "Zaylee", - "Annika", - "Kenia", - "Linda", - "Kenna", - "Faye", - "Reina", - "Brittany", - "Marina", - "Astrid", - "Kadence", - "Mikaela", - "Jaelyn", - "Briar", - "Kaylie", - "Teresa", - "Bria", - "Hadassah", - "Lilianna", - "Guadalupe", - "Rayna", - "Chanel", - "Lyra", - "Noa", - "Zariyah", - "Laylah", - "Aubrielle", - "Aniya", - "Livia", - "Ellen", - "Meadow", - "Amiya", - "Ellis", - "Elora", - "Milan", - "Hunter", - "Princess", - "Leanna", - "Nathalie", - "Clementine", - "Nola", - "Tenley", - "Simone", - "Lina", - "Marianna", - "Martha", - "Sariah", - "Louisa", - "Noemi", - "Emmeline", - "Kenley", - "Belen", - "Erika", - "Myah", - "Lara", - "Amani", - "Ansley", - "Everlee", - "Maleah", - "Salma", - "Jaelynn", - "Kiera", - "Dulce", - "Nala", - "Natasha", - "Averi", - "Mercy", - "Penny", - "Ariadne", - "Deborah", - "Elisabeth", - "Zaria", - "Hana", - "Kairi", - "Yareli", - "Raina", - "Ryann", - "Lexie", - "Thalia", - "Karter", - "Annabel", - "Christine", - "Estella", - "Keyla", - "Adele", - "Aya", - "Estelle", - "Landry", - "Tori", - "Perla", - "Lailah", - "Miah", - "Rylan", - "Angelique", - "Avalynn", - "Romina", - "Ari", - "Jaycee", - "Jaylene", - "Kai", - "Louise", - "Mavis", - "Scarlette", - "Belle", - "Lea", - "Nalani", - "Rivka", - "Ayleen", - "Calliope", - "Dalary", - "Zaniyah", - "Kaelyn", - "Sky", - "Jewel", - "Joselyn", - "Madalynn", - "Paola", - "Giovanna", - "Isabela", - "Karlee", - "Aubriella", - "Azariah", - "Tinley", - "Dream", - "Claudia", - "Corinne", - "Erica", - "Milena", - "Aliana", - "Kallie", - "Alyson", - "Joyce", - "Tinsley", - "Whitney", - "Emilee", - "Paisleigh", - "Carolyn", - "Jaylee", - "Zoie", - "Frankie", - "Andi", - "Judith", - "Paula", - "Xiomara", - "Aiyana", - "Amia", - "Analia", - "Audrina", - "Hadlee", - "Rayne", - "Amayah", - "Cara", - "Celia", - "Lyanna", - "Opal", - "Amaris", - "Clare", - "Gwen", - "Giana", - "Veda", - "Alisha", - "Davina", - "Rhea", - "Sariyah", - "Noor", - "Danica", - "Kathleen", - "Lillianna", - "Lindsey", - "Maxine", - "Paulina", - "Hailee", - "Harleigh", - "Nancy", - "Jessa", - "Raquel", - "Raylee", - "Zainab", - "Chana", - "Lisa", - "Heavenly", - "Oaklynn", - "Aminah", - "Emmalynn", - "Patricia", - "India", - "Janessa", - "Paloma", - "Ramona", - "Sandra", - "Abril", - "Emmaline", - "Itzayana", - "Kassandra", - "Vienna", - "Marleigh", - "Kailyn", - "Novalee", - "Rosalyn", - "Hadleigh", - "Luella", - "Taliyah", - "Avalyn", - "Barbara", - "Iliana", - "Jana", - "Meilani", - "Aadhya", - "Alannah", - "Blaire", - "Brenda", - "Casey", - "Selene", - "Lizbeth", - "Adrienne", - "Annalee", - "Malani", - "Aliya", - "Miley", - "Nataly", - "Bexley", - "Joslyn", - "Maliah", - "Zion", - "Breanna", - "Melania", - "Estrella", - "Ingrid", - "Jayden", - "Kaya", - "Kaylin", - "Harmoni", - "Arely", - "Jazlynn", - "Kiana", - "Dana", - "Mylah", - "Oaklee", - "Ailani", - "Kailee", - "Marjorie", - "Paityn", - "Courtney", - "Ellianna", - "Jurnee", - "Karlie", - "Evalyn", - "Kenya", - "Magdalena", - "Carla", - "Halle", - "Aryanna", - "Kaiya", - "Kimora", - "Naya", - "Saoirse", - "Susan", - "Desiree", - "Ensley", - "Renee", - "Esperanza", - "Caylee", - "Ellison", - "Kristina", - "Adilynn", - "Anabelle", - "Spencer", - "Tegan", - "Aranza", - "Vada", - "Emerald", - "Florence", - "Marlowe", - "Micah", - "Sonia", - "Sunny", - "Tara", - "Riya", - "Yara", - "Alisa", - "Nathalia", - "Yamileth", - "Saanvi", - "Samira", - "Sylvie", - "Brenna", - "Carlee", - "Jenny", - "Miya", - "Monserrat", - "Zendaya", - "Alora" -]; \ No newline at end of file diff --git a/Scripts/CharacterName.ts b/Scripts/CharacterName.ts new file mode 100644 index 000000000..d7b2caaaf --- /dev/null +++ b/Scripts/CharacterName.ts @@ -0,0 +1,993 @@ +const CharacterName: string[] = [ + "Emma", + "Olivia", + "Ava", + "Isabella", + "Sophia", + "Mia", + "Charlotte", + "Amelia", + "Evelyn", + "Abigail", + "Harper", + "Emily", + "Elizabeth", + "Avery", + "Sofia", + "Ella", + "Madison", + "Scarlett", + "Victoria", + "Aria", + "Grace", + "Chloe", + "Camila", + "Penelope", + "Riley", + "Layla", + "Lillian", + "Nora", + "Zoey", + "Mila", + "Aubrey", + "Hannah", + "Lily", + "Addison", + "Eleanor", + "Natalie", + "Luna", + "Savannah", + "Brooklyn", + "Leah", + "Zoe", + "Stella", + "Hazel", + "Ellie", + "Paisley", + "Audrey", + "Skylar", + "Violet", + "Claire", + "Bella", + "Aurora", + "Lucy", + "Anna", + "Samantha", + "Caroline", + "Genesis", + "Aaliyah", + "Kennedy", + "Kinsley", + "Allison", + "Maya", + "Madelyn", + "Adeline", + "Alexa", + "Ariana", + "Elena", + "Gabriella", + "Naomi", + "Alice", + "Sadie", + "Hailey", + "Eva", + "Emilia", + "Autumn", + "Quinn", + "Nevaeh", + "Piper", + "Ruby", + "Serenity", + "Willow", + "Everly", + "Cora", + "Kaylee", + "Lydia", + "Aubree", + "Arianna", + "Eliana", + "Peyton", + "Melanie", + "Gianna", + "Isabelle", + "Valentina", + "Nova", + "Clara", + "Vivian", + "Reagan", + "Mackenzie", + "Madeline", + "Brielle", + "Delilah", + "Isla", + "Rylee", + "Katherine", + "Josephine", + "Ivy", + "Liliana", + "Jade", + "Maria", + "Taylor", + "Hadley", + "Kylie", + "Emery", + "Adalynn", + "Natalia", + "Annabelle", + "Faith", + "Alexandra", + "Ximena", + "Ashley", + "Brianna", + "Raelynn", + "Bailey", + "Mary", + "Athena", + "Andrea", + "Leilani", + "Jasmine", + "Lyla", + "Margaret", + "Alyssa", + "Adalyn", + "Arya", + "Norah", + "Khloe", + "Kayla", + "Eden", + "Eliza", + "Rose", + "Ariel", + "Melody", + "Alexis", + "Isabel", + "Sydney", + "Juliana", + "Lauren", + "Iris", + "Emerson", + "London", + "Morgan", + "Lilly", + "Charlie", + "Aliyah", + "Valeria", + "Arabella", + "Sara", + "Finley", + "Trinity", + "Ryleigh", + "Jordyn", + "Jocelyn", + "Kimberly", + "Esther", + "Molly", + "Valerie", + "Cecilia", + "Anastasia", + "Daisy", + "Reese", + "Laila", + "Mya", + "Amy", + "Teagan", + "Amaya", + "Elise", + "Harmony", + "Paige", + "Adaline", + "Fiona", + "Alaina", + "Nicole", + "Genevieve", + "Lucia", + "Alina", + "Mckenzie", + "Callie", + "Payton", + "Eloise", + "Brooke", + "Londyn", + "Mariah", + "Julianna", + "Rachel", + "Daniela", + "Gracie", + "Catherine", + "Angelina", + "Presley", + "Josie", + "Harley", + "Adelyn", + "Vanessa", + "Makayla", + "Parker", + "Juliette", + "Amara", + "Marley", + "Lila", + "Ana", + "Rowan", + "Alana", + "Michelle", + "Malia", + "Rebecca", + "Brooklynn", + "Brynlee", + "Summer", + "Sloane", + "Leila", + "Sienna", + "Adriana", + "Sawyer", + "Kendall", + "Juliet", + "Destiny", + "Alayna", + "Elliana", + "Diana", + "Hayden", + "Ayla", + "Dakota", + "Angela", + "Noelle", + "Rosalie", + "Joanna", + "Jayla", + "Alivia", + "Lola", + "Emersyn", + "Georgia", + "Selena", + "June", + "Daleyza", + "Tessa", + "Maggie", + "Jessica", + "Remi", + "Delaney", + "Camille", + "Vivienne", + "Hope", + "Mckenna", + "Gemma", + "Olive", + "Alexandria", + "Blakely", + "Izabella", + "Catalina", + "Raegan", + "Journee", + "Gabrielle", + "Lucille", + "Ruth", + "Amiyah", + "Evangeline", + "Blake", + "Thea", + "Amina", + "Giselle", + "Lilah", + "Melissa", + "River", + "Kate", + "Adelaide", + "Charlee", + "Vera", + "Leia", + "Gabriela", + "Zara", + "Jane", + "Journey", + "Elaina", + "Miriam", + "Briella", + "Stephanie", + "Cali", + "Ember", + "Lilliana", + "Aniyah", + "Logan", + "Kamila", + "Brynn", + "Ariella", + "Makenzie", + "Annie", + "Mariana", + "Kali", + "Haven", + "Elsie", + "Nyla", + "Paris", + "Lena", + "Freya", + "Adelynn", + "Lyric", + "Camilla", + "Sage", + "Paislee", + "Talia", + "Alessandra", + "Juniper", + "Fatima", + "Raelyn", + "Amira", + "Arielle", + "Phoebe", + "Kinley", + "Ada", + "Nina", + "Ariah", + "Samara", + "Myla", + "Brinley", + "Cassidy", + "Maci", + "Aspen", + "Allie", + "Keira", + "Kaia", + "Makenna", + "Heaven", + "Joy", + "Lia", + "Madilyn", + "Gracelyn", + "Laura", + "Evelynn", + "Lexi", + "Haley", + "Miranda", + "Kaitlyn", + "Daniella", + "Felicity", + "Jacqueline", + "Evie", + "Angel", + "Danielle", + "Ainsley", + "Dylan", + "Kiara", + "Millie", + "Jordan", + "Maddison", + "Rylie", + "Alicia", + "Maeve", + "Margot", + "Kylee", + "Phoenix", + "Heidi", + "Zuri", + "Alondra", + "Lana", + "Madeleine", + "Gracelynn", + "Kenzie", + "Miracle", + "Shelby", + "Elle", + "Adrianna", + "Bianca", + "Addilyn", + "Kira", + "Veronica", + "Gwendolyn", + "Esmeralda", + "Chelsea", + "Alison", + "Skyler", + "Magnolia", + "Daphne", + "Jenna", + "Everleigh", + "Kyla", + "Braelynn", + "Harlow", + "Annalise", + "Mikayla", + "Dahlia", + "Maliyah", + "Averie", + "Scarlet", + "Kayleigh", + "Luciana", + "Kelsey", + "Nadia", + "Amber", + "Gia", + "Kamryn", + "Yaretzi", + "Carmen", + "Jimena", + "Erin", + "Christina", + "Katie", + "Ryan", + "Viviana", + "Alexia", + "Anaya", + "Serena", + "Katelyn", + "Ophelia", + "Regina", + "Helen", + "Remington", + "Camryn", + "Cadence", + "Royalty", + "Amari", + "Kathryn", + "Skye", + "Emely", + "Jada", + "Ariyah", + "Aylin", + "Saylor", + "Kendra", + "Cheyenne", + "Fernanda", + "Sabrina", + "Francesca", + "Eve", + "Mckinley", + "Frances", + "Sarai", + "Carolina", + "Kennedi", + "Nylah", + "Tatum", + "Alani", + "Lennon", + "Raven", + "Zariah", + "Leslie", + "Winter", + "Abby", + "Mabel", + "Sierra", + "April", + "Willa", + "Carly", + "Jolene", + "Rosemary", + "Aviana", + "Madelynn", + "Selah", + "Renata", + "Lorelei", + "Briana", + "Celeste", + "Wren", + "Charleigh", + "Leighton", + "Annabella", + "Jayleen", + "Braelyn", + "Ashlyn", + "Jazlyn", + "Mira", + "Oakley", + "Malaysia", + "Edith", + "Avianna", + "Maryam", + "Emmalyn", + "Hattie", + "Kensley", + "Macie", + "Bristol", + "Marlee", + "Demi", + "Cataleya", + "Maia", + "Sylvia", + "Itzel", + "Allyson", + "Lilith", + "Melany", + "Kaydence", + "Holly", + "Nayeli", + "Meredith", + "Nia", + "Liana", + "Megan", + "Justice", + "Bethany", + "Alejandra", + "Janelle", + "Elisa", + "Adelina", + "Ashlynn", + "Elianna", + "Aleah", + "Myra", + "Lainey", + "Blair", + "Kassidy", + "Charley", + "Virginia", + "Kara", + "Helena", + "Sasha", + "Julie", + "Michaela", + "Carter", + "Matilda", + "Kehlani", + "Henley", + "Maisie", + "Hallie", + "Jazmin", + "Priscilla", + "Marilyn", + "Cecelia", + "Danna", + "Colette", + "Baylee", + "Elliott", + "Ivanna", + "Cameron", + "Celine", + "Alayah", + "Hanna", + "Imani", + "Angelica", + "Emelia", + "Kalani", + "Alanna", + "Lorelai", + "Macy", + "Karina", + "Addyson", + "Aleena", + "Aisha", + "Johanna", + "Mallory", + "Leona", + "Mariam", + "Kynlee", + "Madilynn", + "Karen", + "Karla", + "Skyla", + "Beatrice", + "Dayana", + "Gloria", + "Milani", + "Savanna", + "Karsyn", + "Rory", + "Giuliana", + "Lauryn", + "Liberty", + "Galilea", + "Aubrie", + "Charli", + "Kyleigh", + "Brylee", + "Jillian", + "Anne", + "Haylee", + "Dallas", + "Azalea", + "Jayda", + "Tiffany", + "Avah", + "Shiloh", + "Bailee", + "Jazmine", + "Esme", + "Coraline", + "Madisyn", + "Elaine", + "Lilian", + "Kyra", + "Kaliyah", + "Kora", + "Octavia", + "Irene", + "Kelly", + "Lacey", + "Laurel", + "Adley", + "Anika", + "Janiyah", + "Dorothy", + "Sutton", + "Julieta", + "Kimber", + "Remy", + "Cassandra", + "Rebekah", + "Collins", + "Elliot", + "Emmy", + "Sloan", + "Hayley", + "Amalia", + "Jemma", + "Jamie", + "Melina", + "Leyla", + "Jaylah", + "Anahi", + "Jaliyah", + "Kailani", + "Harlee", + "Wynter", + "Saige", + "Alessia", + "Monica", + "Anya", + "Antonella", + "Emberly", + "Khaleesi", + "Ivory", + "Greta", + "Maren", + "Alena", + "Emory", + "Alaia", + "Cynthia", + "Addisyn", + "Alia", + "Lylah", + "Angie", + "Ariya", + "Alma", + "Crystal", + "Jayde", + "Aileen", + "Kinslee", + "Siena", + "Zelda", + "Katalina", + "Marie", + "Pearl", + "Reyna", + "Mae", + "Zahra", + "Kailey", + "Jessie", + "Tiana", + "Amirah", + "Madalyn", + "Alaya", + "Lilyana", + "Julissa", + "Armani", + "Lennox", + "Lillie", + "Jolie", + "Laney", + "Roselyn", + "Mara", + "Joelle", + "Rosa", + "Kaylani", + "Bridget", + "Liv", + "Oaklyn", + "Aurelia", + "Clarissa", + "Elyse", + "Marissa", + "Monroe", + "Kori", + "Elsa", + "Rosie", + "Amelie", + "Aitana", + "Aliza", + "Eileen", + "Poppy", + "Emmie", + "Braylee", + "Milana", + "Addilynn", + "Royal", + "Chaya", + "Frida", + "Bonnie", + "Amora", + "Stevie", + "Tatiana", + "Malaya", + "Mina", + "Emerie", + "Reign", + "Zaylee", + "Annika", + "Kenia", + "Linda", + "Kenna", + "Faye", + "Reina", + "Brittany", + "Marina", + "Astrid", + "Kadence", + "Mikaela", + "Jaelyn", + "Briar", + "Kaylie", + "Teresa", + "Bria", + "Hadassah", + "Lilianna", + "Guadalupe", + "Rayna", + "Chanel", + "Lyra", + "Noa", + "Zariyah", + "Laylah", + "Aubrielle", + "Aniya", + "Livia", + "Ellen", + "Meadow", + "Amiya", + "Ellis", + "Elora", + "Milan", + "Hunter", + "Princess", + "Leanna", + "Nathalie", + "Clementine", + "Nola", + "Tenley", + "Simone", + "Lina", + "Marianna", + "Martha", + "Sariah", + "Louisa", + "Noemi", + "Emmeline", + "Kenley", + "Belen", + "Erika", + "Myah", + "Lara", + "Amani", + "Ansley", + "Everlee", + "Maleah", + "Salma", + "Jaelynn", + "Kiera", + "Dulce", + "Nala", + "Natasha", + "Averi", + "Mercy", + "Penny", + "Ariadne", + "Deborah", + "Elisabeth", + "Zaria", + "Hana", + "Kairi", + "Yareli", + "Raina", + "Ryann", + "Lexie", + "Thalia", + "Karter", + "Annabel", + "Christine", + "Estella", + "Keyla", + "Adele", + "Aya", + "Estelle", + "Landry", + "Tori", + "Perla", + "Lailah", + "Miah", + "Rylan", + "Angelique", + "Avalynn", + "Romina", + "Ari", + "Jaycee", + "Jaylene", + "Kai", + "Louise", + "Mavis", + "Scarlette", + "Belle", + "Lea", + "Nalani", + "Rivka", + "Ayleen", + "Calliope", + "Dalary", + "Zaniyah", + "Kaelyn", + "Sky", + "Jewel", + "Joselyn", + "Madalynn", + "Paola", + "Giovanna", + "Isabela", + "Karlee", + "Aubriella", + "Azariah", + "Tinley", + "Dream", + "Claudia", + "Corinne", + "Erica", + "Milena", + "Aliana", + "Kallie", + "Alyson", + "Joyce", + "Tinsley", + "Whitney", + "Emilee", + "Paisleigh", + "Carolyn", + "Jaylee", + "Zoie", + "Frankie", + "Andi", + "Judith", + "Paula", + "Xiomara", + "Aiyana", + "Amia", + "Analia", + "Audrina", + "Hadlee", + "Rayne", + "Amayah", + "Cara", + "Celia", + "Lyanna", + "Opal", + "Amaris", + "Clare", + "Gwen", + "Giana", + "Veda", + "Alisha", + "Davina", + "Rhea", + "Sariyah", + "Noor", + "Danica", + "Kathleen", + "Lillianna", + "Lindsey", + "Maxine", + "Paulina", + "Hailee", + "Harleigh", + "Nancy", + "Jessa", + "Raquel", + "Raylee", + "Zainab", + "Chana", + "Lisa", + "Heavenly", + "Oaklynn", + "Aminah", + "Emmalynn", + "Patricia", + "India", + "Janessa", + "Paloma", + "Ramona", + "Sandra", + "Abril", + "Emmaline", + "Itzayana", + "Kassandra", + "Vienna", + "Marleigh", + "Kailyn", + "Novalee", + "Rosalyn", + "Hadleigh", + "Luella", + "Taliyah", + "Avalyn", + "Barbara", + "Iliana", + "Jana", + "Meilani", + "Aadhya", + "Alannah", + "Blaire", + "Brenda", + "Casey", + "Selene", + "Lizbeth", + "Adrienne", + "Annalee", + "Malani", + "Aliya", + "Miley", + "Nataly", + "Bexley", + "Joslyn", + "Maliah", + "Zion", + "Breanna", + "Melania", + "Estrella", + "Ingrid", + "Jayden", + "Kaya", + "Kaylin", + "Harmoni", + "Arely", + "Jazlynn", + "Kiana", + "Dana", + "Mylah", + "Oaklee", + "Ailani", + "Kailee", + "Marjorie", + "Paityn", + "Courtney", + "Ellianna", + "Jurnee", + "Karlie", + "Evalyn", + "Kenya", + "Magdalena", + "Carla", + "Halle", + "Aryanna", + "Kaiya", + "Kimora", + "Naya", + "Saoirse", + "Susan", + "Desiree", + "Ensley", + "Renee", + "Esperanza", + "Caylee", + "Ellison", + "Kristina", + "Adilynn", + "Anabelle", + "Spencer", + "Tegan", + "Aranza", + "Vada", + "Emerald", + "Florence", + "Marlowe", + "Micah", + "Sonia", + "Sunny", + "Tara", + "Riya", + "Yara", + "Alisa", + "Nathalia", + "Yamileth", + "Saanvi", + "Samira", + "Sylvie", + "Brenna", + "Carlee", + "Jenny", + "Miya", + "Monserrat", + "Zendaya", + "Alora" +]; \ No newline at end of file diff --git a/Scripts/ColorPicker.js b/Scripts/ColorPicker.js deleted file mode 100644 index e836acd38..000000000 --- a/Scripts/ColorPicker.js +++ /dev/null @@ -1,564 +0,0 @@ -"use strict"; -/** - * A hexadecimal color code - * @typedef {string} HexColor - */ - -/** - * A HSV color value - * @typedef {{ H: number, S: number, V: number }} HSVColor - */ - -/** - * The color picker callback called when selection completes. - * - * @callback ColorPickerCallbackType - * @param {string} Color - * @return {void} - */ - -var ColorPickerX, ColorPickerY, ColorPickerWidth, ColorPickerHeight; -var ColorPickerInitialHSV, ColorPickerLastHSV, ColorPickerHSV, ColorPickerSourceElement; -/** @type ColorPickerCallbackType */ -let ColorPickerCallback; -var ColorPickerCSS; -var ColorPickerIsDefault; -var ColorPickerSelectedFavoriteIndex = null; //A number 0-5 -var ColorPickerFavoritesPage = 0; //current page of favorite colors displayed. -var DefaultSavedColors = []; - -var ColorPickerHueBarHeight = 40; -var ColorPickerSVPanelGap = 20; -var ColorPickerPaletteHeight = 100; -var ColorPickerPaletteGap = 20; -var ColorPickerFavoritesPaletteHeight = 100; -var ColorPickerFavoritesPaletteGap = 20; - -var ColorPickerLayout = { - HueBarOffset: NaN, - HueBarHeight: NaN, - SVPanelOffset: NaN, - SVPanelHeight: NaN, - PaletteOffset: NaN, - PaletteHeight: NaN, - FavoritesPaletteOffset: NaN, - FavoritesPaletteHeight: NaN, - ButtonOffset: NaN, - NextButtonX: NaN, - SaveButtonX: NaN, - PrevButtonX: NaN -}; - -const ColorPickerNumSaved = 18; //number of colors a player is allowed to save, should be multiple of 6 - -/** - * Attaches event listeners required for the color picker to the canvas - * @returns {void} - Nothing - */ -function ColorPickerAttachEventListener() { - var CanvasElement = document.getElementById("MainCanvas"); - if (!CommonIsMobile) { - CanvasElement.addEventListener("mousedown", ColorPickerStartPick); - } - CanvasElement.addEventListener("touchstart", ColorPickerStartPick); -} - -/** - * Removes the color picker related event listeners from the canvas - * @returns {void} - Nothing - */ -function ColorPickerRemoveEventListener() { - var CanvasElement = document.getElementById("MainCanvas"); - CanvasElement.removeEventListener("mousedown", ColorPickerStartPick); - CanvasElement.removeEventListener("touchstart", ColorPickerStartPick); -} - -/** - * When the touch/mouse event begins to be registered. On mobile we only fire it once - * @param {MouseEvent|TouchEvent} Event - The touch/mouse event - * @returns {void} - Nothing - */ -function ColorPickerStartPick(Event) { - // Only fires at first touch on mobile devices - if (Event.changedTouches) { - if (Event.changedTouches.length > 1) return; - } - - var SVPanelOffset = ColorPickerLayout.SVPanelOffset; - var SVPanelHeight = ColorPickerLayout.SVPanelHeight; - var PaletteOffset = ColorPickerLayout.PaletteOffset; - var PaletteHeight = ColorPickerLayout.PaletteHeight; - var FavoritesPaletteOffset = ColorPickerLayout.FavoritesPaletteOffset; - var FavoritesPaletteHeight = ColorPickerLayout.FavoritesPaletteHeight; - - var C = ColorPickerGetCoordinates(Event); - var X = C.X; - var Y = C.Y; - if (X >= ColorPickerX && X < ColorPickerX + ColorPickerWidth) { - if (Y >= ColorPickerY && Y < ColorPickerY + ColorPickerHueBarHeight) { - document.addEventListener("mousemove", ColorPickerPickHue); - document.addEventListener("touchmove", ColorPickerPickHue); - ColorPickerPickHue(Event); - } else if (Y >= SVPanelOffset && Y < SVPanelOffset + SVPanelHeight) { - document.addEventListener("mousemove", ColorPickerPickSV); - document.addEventListener("touchmove", ColorPickerPickSV); - ColorPickerPickSV(Event); - } else if (Y >= PaletteOffset && Y < PaletteOffset + PaletteHeight) { - if (X > ColorPickerX + (ColorPickerWidth / 2)){ - ColorPickerSelectFromPalette(Event); - } else { - ColorPickerSelectButton(Event); - } - } else if (Y >= FavoritesPaletteOffset && Y < FavoritesPaletteOffset + FavoritesPaletteHeight) { - ColorPickerSelectFromFavorites(Event); - } - - document.addEventListener("mouseup", ColorPickerEndPick); - document.addEventListener("touchend", ColorPickerEndPick); - - } else { - ColorPickerSelectedFavoriteIndex = null; - } -} - -/** - * When we stop registering the touch/mouse event, to remove the attached event listeners - * @returns {void} - Nothing - */ -function ColorPickerEndPick() { - document.removeEventListener("mousemove", ColorPickerPickHue); - document.removeEventListener("mousemove", ColorPickerPickSV); - document.removeEventListener("mouseup", ColorPickerEndPick); - - document.removeEventListener("touchmove", ColorPickerPickHue); - document.removeEventListener("touchmove", ColorPickerPickSV); - document.removeEventListener("touchend", ColorPickerEndPick); -} - -/** - * Gets the coordinates of the current event on the canvas - * @param {MouseEvent|TouchEvent} Event - The touch/mouse event - * @returns {{X: number, Y: number}} - Coordinates of the click/touch event on the canvas - */ -function ColorPickerGetCoordinates(Event) { - if (Event.changedTouches) { - // Mobile - var Touch = Event.changedTouches[0]; - TouchMove(Touch); - } else { - // PC - MouseMove(Event); - } - - return { X: MouseX, Y: MouseY }; -} - -/** - * Sets the picked hue based on the Event coordinates on the canvas - * @param {MouseEvent|TouchEvent} Event - The touch/mouse event - * @returns {void} - Nothing - */ -function ColorPickerPickHue(Event) { - var C = ColorPickerGetCoordinates(Event); - ColorPickerHSV.H = Math.max(0, Math.min(1, (C.X - ColorPickerX) / ColorPickerWidth)); - ColorPickerNotify(); -} - -/** - * Sets the picked saturation (SV) based on the Event coordinates on the canvas - * @param {MouseEvent|TouchEvent} Event - The touch/mouse event - * @returns {void} - Nothing - */ -function ColorPickerPickSV(Event) { - var C = ColorPickerGetCoordinates(Event); - var SVPanelOffset = ColorPickerLayout.SVPanelOffset; - var SVPanelHeight = ColorPickerLayout.SVPanelHeight; - - var S = (C.X - ColorPickerX) / ColorPickerWidth; - var V = 1 - (C.Y - SVPanelOffset) / SVPanelHeight; - ColorPickerHSV.S = Math.max(0, Math.min(1, S)); - ColorPickerHSV.V = Math.max(0, Math.min(1, V)); - ColorPickerNotify(); -} - -/** - * Sets the picked HSV from the color palette - * @param {MouseEvent|TouchEvent} Event - The touch/mouse event - * @returns {void} - Nothing - */ -function ColorPickerSelectFromPalette(Event) { - var C = ColorPickerGetCoordinates(Event); - var P = Math.max(0, Math.min(1, (C.X - ColorPickerX) / ColorPickerWidth)); - var HSV = P > 0.75 ? ColorPickerInitialHSV : ColorPickerLastHSV; - ColorPickerHSV = Object.assign({}, HSV); - ColorPickerNotify(); -} - -/** - * Handles clicking on the favorite colors palette - * @param {MouseEvent|TouchEvent} Event - The touch/mouse event - * @returns {void} - Nothing - */ -function ColorPickerSelectFromFavorites(Event) { - var C = ColorPickerGetCoordinates(Event); - var P = Math.max(0, Math.min(1, (C.X - ColorPickerX) / ColorPickerWidth)); - var SelectedIndex = Math.min(Math.floor(P * 6), 5); - - if (SelectedIndex == ColorPickerSelectedFavoriteIndex){ - ColorPickerHSV = Object.assign({}, Player.SavedColors[ColorPickerSelectedFavoriteIndex + (ColorPickerFavoritesPage * 6)]); - ColorPickerNotify(); - ColorPickerSelectedFavoriteIndex = null; - } else { - ColorPickerSelectedFavoriteIndex = SelectedIndex; - } -} - -/** - * Handles the previous, next, and save button functionality for the color picker. - * @param {MouseEvent|TouchEvent} Event - The touch/mouse event - * @returns {void} - Nothing - */ -function ColorPickerSelectButton(Event) { - var C = ColorPickerGetCoordinates(Event); - var X = C.X; - var Y = C.Y; - - if(Y > ColorPickerLayout.ButtonOffset && Y < ColorPickerLayout.ButtonOffset + 90){ - if (X > ColorPickerLayout.NextButtonX && X < ColorPickerLayout.NextButtonX + 90){ - ColorPickerFavoritesPage = (ColorPickerFavoritesPage + 1) % Math.round(ColorPickerNumSaved / 6); - ColorPickerSelectedFavoriteIndex = null; - } else if (X > ColorPickerLayout.SaveButtonX && X < ColorPickerLayout.SaveButtonX + 90){ - if (!(ColorPickerSelectedFavoriteIndex === null)) { - Player.SavedColors[ColorPickerSelectedFavoriteIndex + (ColorPickerFavoritesPage * 6)] = Object.assign({}, ColorPickerHSV); - ServerSend("AccountUpdate", { SavedColors: Player.SavedColors }); - } - } else if (X > ColorPickerLayout.PrevButtonX && X < ColorPickerLayout.PrevButtonX + 90){ - var NumPages = Math.round(ColorPickerNumSaved / 6); - ColorPickerFavoritesPage = (((ColorPickerFavoritesPage - 1) % NumPages) + NumPages) % NumPages; - ColorPickerSelectedFavoriteIndex = null; - } - } -} - -/** - * Alters the color picker display based on the selected value - * @param {boolean} [sourceElementChanged=false] - True if the color was updated by the text input element - * @returns {void} - Nothing - */ -function ColorPickerNotify(sourceElementChanged = false) { - ColorPickerLastHSV = Object.assign({}, ColorPickerHSV); - if (!sourceElementChanged) ColorPickerCSS = ColorPickerHSVToCSS(ColorPickerHSV); - if (ColorPickerCallback) { - ColorPickerCallback(ColorPickerCSS); - } - - if (!sourceElementChanged && ColorPickerSourceElement) { - ColorPickerSourceElement.value = ColorPickerCSS; - } -} - -/** - * Removes the color picker and its listeners from the canvas - * @return {void} - Nothing - */ -function ColorPickerHide() { - ColorPickerSourceElement = null; - ColorPickerInitialHSV = null; - ColorPickerLastHSV = null; - ColorPickerCallback = null; - ColorPickerRemoveEventListener(); -} - -/** - * Checks if two hex color codes are equal, will convert short hand hex codes (#FFF is equal to #FFFFFF) - * @param {HexColor} Color1 - First color to compare - * @param {HexColor} Color2 - Second color to compare - * @returns {boolean} - Returns TRUE if the two colors are the same - */ -function ColorPickerCSSColorEquals(Color1, Color2) { - Color1 = Color1.toUpperCase(); - Color2 = Color2.toUpperCase(); - if (!CommonIsColor(Color1) || !CommonIsColor(Color2)) return false; - // convert short hand hex color to standard format - if (Color1.length == 4) Color1 = "#" + Color1[1] + Color1[1] + Color1[2] + Color1[2] + Color1[3] + Color1[3]; - if (Color2.length == 4) Color2 = "#" + Color2[1] + Color2[1] + Color2[2] + Color2[2] + Color2[3] + Color2[3]; - return Color1 === Color2; -} - -/** - * Draws the color picker on the canvas - * @param {number} X - Coordinate on the X axis - * @param {number} Y - Coordinate on the Y axis - * @param {number} Width - Width of the color picker - * @param {number} Height - Height of the color picker - * @param {HTMLInputElement} Src - Input element that can contain a hex color code - * @param {ColorPickerCallbackType} [Callback] - Callback to execute when the selected color changes - * @returns {void} - Nothing - */ -function ColorPickerDraw(X, Y, Width, Height, Src, Callback) { - - // Calculate Layout - ColorPickerLayout.HueBarHeight = ColorPickerHueBarHeight; - ColorPickerLayout.HueBarOffset = Y; - ColorPickerLayout.FavoritesPaletteHeight = ColorPickerFavoritesPaletteHeight; - ColorPickerLayout.FavoritesPaletteOffset = Y + Height - ColorPickerLayout.FavoritesPaletteHeight; - ColorPickerLayout.PaletteHeight = ColorPickerPaletteHeight; - ColorPickerLayout.PaletteOffset = Y + Height - ColorPickerLayout.PaletteHeight - ColorPickerLayout.FavoritesPaletteHeight - ColorPickerFavoritesPaletteGap; - ColorPickerLayout.SVPanelHeight = Height - ColorPickerLayout.HueBarHeight - ColorPickerLayout.PaletteHeight - ColorPickerSVPanelGap - ColorPickerPaletteGap - ColorPickerLayout.FavoritesPaletteHeight - ColorPickerFavoritesPaletteGap; - ColorPickerLayout.SVPanelOffset = ColorPickerLayout.HueBarOffset + ColorPickerHueBarHeight + ColorPickerSVPanelGap; - ColorPickerLayout.ButtonOffset = ColorPickerLayout.PaletteOffset + ((ColorPickerLayout.PaletteHeight - 90) / 2); - ColorPickerLayout.SaveButtonX = X + (((ColorPickerWidth / 6) - 90) / 2); - ColorPickerLayout.PrevButtonX = X + (ColorPickerWidth / 6) + (((ColorPickerWidth / 6) - 90) / 2); - ColorPickerLayout.NextButtonX = X + (ColorPickerWidth / 3) + (((ColorPickerWidth / 6) - 90) / 2); - - var SVPanelOffset = ColorPickerLayout.SVPanelOffset; - var SVPanelHeight = ColorPickerLayout.SVPanelHeight; - var PaletteOffset = ColorPickerLayout.PaletteOffset; - var PaletteHeight = ColorPickerLayout.PaletteHeight; - var FavoritesPaletteOffset = ColorPickerLayout.FavoritesPaletteOffset; - var FavoritesPaletteHeight = ColorPickerLayout.FavoritesPaletteHeight; - var ButtonOffset = ColorPickerLayout.ButtonOffset; - var NextButtonX = ColorPickerLayout.NextButtonX; - var SaveButtonX = ColorPickerLayout.SaveButtonX; - var PrevButtonX = ColorPickerLayout.PrevButtonX; - - var HSV; - if (ColorPickerInitialHSV == null) { - // Get initial color value based on type of source - var Color; - if (Src instanceof HTMLInputElement) { - ColorPickerSourceElement = Src; - Color = Src.value.trim(); - } else { - if (ColorPickerSourceElement != null) { - ColorPickerSourceElement = null; - } - Color = Src; - } - - HSV = ColorPickerCSSToHSV(Color); - ColorPickerInitialHSV = Object.assign({}, HSV); - ColorPickerLastHSV = Object.assign({}, HSV); - ColorPickerHSV = Object.assign({}, HSV); - ColorPickerCSS = Color; - ColorPickerRemoveEventListener(); // remove possible duplicated attached event listener, just in case - ColorPickerAttachEventListener(); - } else { - // Watch source element change - if (ColorPickerSourceElement != null) { - var UserInputColor = ColorPickerSourceElement.value.trim().toUpperCase(); - if (CommonIsColor(UserInputColor)) { - ColorPickerIsDefault = false; - if (!ColorPickerCSSColorEquals(UserInputColor, ColorPickerCSS)) { - ColorPickerCSS = UserInputColor; - ColorPickerHSV = ColorPickerCSSToHSV(UserInputColor, ColorPickerHSV); - ColorPickerNotify(true); - } - } else if (UserInputColor === "DEFAULT" && !ColorPickerIsDefault) { - ColorPickerIsDefault = true; - if (ColorPickerCallback) ColorPickerCallback("Default"); - } - } - // Use user updated HSV - HSV = ColorPickerHSV; - } - - // Draw Hue Control - var Grad; - Grad = MainCanvas.createLinearGradient(X, Y, X + Width, Y); - Grad.addColorStop(0.00, "#f00"); - Grad.addColorStop(0.16, "#ff0"); - Grad.addColorStop(0.33, "#0f0"); - Grad.addColorStop(0.50, "#0ff"); - Grad.addColorStop(0.66, "#00f"); - Grad.addColorStop(0.83, "#f0f"); - Grad.addColorStop(1.00, "#f00"); - MainCanvas.fillStyle = Grad; - MainCanvas.fillRect(X, Y, Width, ColorPickerHueBarHeight); - - // Draw S/V Panel - DrawRect(X, SVPanelOffset, Width, SVPanelHeight, ColorPickerHSVToCSS({ H: HSV.H, S: 1, V: 1 })); - - Grad = MainCanvas.createLinearGradient(X, SVPanelOffset, X + Width, SVPanelOffset); - Grad.addColorStop(0, "rgba(255, 255, 255, 1)"); - Grad.addColorStop(1, "rgba(255, 255, 255, 0)"); - MainCanvas.fillStyle = Grad; - MainCanvas.fillRect(X, SVPanelOffset, Width, SVPanelHeight); - - Grad = MainCanvas.createLinearGradient(X, SVPanelOffset, X, SVPanelOffset + SVPanelHeight); - Grad.addColorStop(0, "rgba(0, 0, 0, 0)"); - Grad.addColorStop(1, "rgba(0, 0, 0, 1)"); - MainCanvas.fillStyle = Grad; - MainCanvas.fillRect(X, SVPanelOffset, Width, SVPanelHeight); - - if (!ColorPickerIsDefault) { - var CSS = ColorPickerHSVToCSS(HSV); - DrawCircle(X + HSV.S * Width, SVPanelOffset + (1 - HSV.V) * SVPanelHeight, 8, 16, CSS); - DrawCircle(X + HSV.S * Width, SVPanelOffset + (1 - HSV.V) * SVPanelHeight, 14, 4, (HSV.V > 0.8 && HSV.S < 0.2) ? "#333333" : "#FFFFFF"); - } - // Draw Hue Picker - DrawEmptyRect(X + HSV.H * (Width - 20), Y, 20, ColorPickerHueBarHeight, "#FFFFFF"); - - //Draw Buttons (90 by 90 px) centered - let SavedTextAlign = MainCanvas.textAlign; - MainCanvas.textAlign = "center"; - DrawButton(SaveButtonX, ButtonOffset, 90, 90, "", "White", "Icons/Save.png", DialogFindPlayer("ColorSave")); - DrawButton(PrevButtonX, ButtonOffset, 90, 90, "", "White", "Icons/Prev.png", DialogFindPlayer("PrevPage")); - DrawButton(NextButtonX, ButtonOffset, 90, 90, "", "White", "Icons/Next.png", DialogFindPlayer("NextPage")); - MainCanvas.textAlign = SavedTextAlign; - - // Draw Palette - DrawRect(X + (ColorPickerWidth / 2), PaletteOffset, ColorPickerWidth / 4, PaletteHeight, ColorPickerHSVToCSS(ColorPickerLastHSV)); - DrawRect(X + ((ColorPickerWidth / 4) * 3), PaletteOffset, ColorPickerWidth / 4, PaletteHeight, ColorPickerHSVToCSS(ColorPickerInitialHSV)); - - // Draw Favorites Palette - DrawRect(X, FavoritesPaletteOffset, ColorPickerWidth / 6, FavoritesPaletteHeight, ColorPickerHSVToCSS(Player.SavedColors[0 + (ColorPickerFavoritesPage * 6)])); - DrawRect(X + (ColorPickerWidth / 6), FavoritesPaletteOffset, ColorPickerWidth / 6, FavoritesPaletteHeight, ColorPickerHSVToCSS(Player.SavedColors[1 + (ColorPickerFavoritesPage * 6)])); - DrawRect(X + ((ColorPickerWidth / 6) * 2), FavoritesPaletteOffset, ColorPickerWidth / 6, FavoritesPaletteHeight, ColorPickerHSVToCSS(Player.SavedColors[2 + (ColorPickerFavoritesPage * 6)])); - DrawRect(X + ((ColorPickerWidth / 6) * 3), FavoritesPaletteOffset, ColorPickerWidth / 6, FavoritesPaletteHeight, ColorPickerHSVToCSS(Player.SavedColors[3 + (ColorPickerFavoritesPage * 6)])); - DrawRect(X + ((ColorPickerWidth / 6) * 4), FavoritesPaletteOffset, ColorPickerWidth / 6, FavoritesPaletteHeight, ColorPickerHSVToCSS(Player.SavedColors[4 + (ColorPickerFavoritesPage * 6)])); - DrawRect(X + ((ColorPickerWidth / 6) * 5), FavoritesPaletteOffset, ColorPickerWidth / 6, FavoritesPaletteHeight, ColorPickerHSVToCSS(Player.SavedColors[5 + (ColorPickerFavoritesPage * 6)])); - if (ColorPickerSelectedFavoriteIndex !== null) //if a saved color is selected - { - var FavoriteColorX = X + ((ColorPickerWidth / 6) * ColorPickerSelectedFavoriteIndex); - - if (MouseX > FavoriteColorX && MouseX < FavoriteColorX + (ColorPickerWidth / 6) && MouseY > FavoritesPaletteOffset && MouseY < FavoritesPaletteOffset + FavoritesPaletteHeight) { - // If mouse is hovering over selected favorite color slot, change color of highlight. - DrawEmptyRect(X + ((ColorPickerWidth / 6) * ColorPickerSelectedFavoriteIndex), FavoritesPaletteOffset, ColorPickerWidth / 6, FavoritesPaletteHeight, "darkcyan", 10); - } else { // Highlight selected favorite color slot. - DrawEmptyRect(X + ((ColorPickerWidth / 6) * ColorPickerSelectedFavoriteIndex), FavoritesPaletteOffset, ColorPickerWidth / 6, FavoritesPaletteHeight, "cyan", 10); - } - } - - ColorPickerX = X; - ColorPickerY = Y; - ColorPickerWidth = Width; - ColorPickerHeight = Height; - ColorPickerCallback = Callback; -} - -/** - * Parses a hex color code and converts it to a HSV object - * @param {HexColor} Color - Hex color code - * @param {HSVColor} [DefaultHSV] - The HSV to output if the color is not valid - * @returns {HSVColor} - The HSV color from a hex color code - * @see {@link https://gist.github.com/mjackson/5311256} - */ -function ColorPickerCSSToHSV(Color, DefaultHSV) { - Color = Color || "#FFFFFF"; - var M = Color.match(/^#(([0-9a-f]{3})|([0-9a-f]{6}))$/i); - var R, G, B; - if (M) { - var GRP = M[1]; - if (GRP.length == 3) { - R = Number.parseInt(GRP[0] + GRP[0], 16) / 255; - G = Number.parseInt(GRP[1] + GRP[1], 16) / 255; - B = Number.parseInt(GRP[2] + GRP[2], 16) / 255; - } else if (GRP.length == 6) { - R = Number.parseInt(GRP[0] + GRP[1], 16) / 255; - G = Number.parseInt(GRP[2] + GRP[3], 16) / 255; - B = Number.parseInt(GRP[4] + GRP[5], 16) / 255; - } - } - - if (isNaN(R) || isNaN(G) || isNaN(B)) { - return DefaultHSV ? DefaultHSV : { H: 0, S: 0, V: 1 }; - } - - var Max = Math.max(R, G, B); - var Min = Math.min(R, G, B); - var D = Max - Min; - var H = 0; - var S = (Max == 0) ? 0 : D / Max; - var V = Max; - - if (D == 0) { - H = 0; - } else { - if (Max == R) { - H = (G - B) / D + (G < B ? 6 : 0); - } else if (Max == G) { - H = (B - R) / D + 2; - } else { - H = (R - G) / D + 4; - } - H /= 6; - } - - return { H: H, S: S, V: V }; -} - -/** - * Converts a HSV object into a valid hex code to use in the css - * @param {HSVColor} HSV - HSV value to convert - * @returns {HexColor} - Hex color code corresponding to the given HSV - */ -function ColorPickerHSVToCSS(HSV) { - var R, G, B; - var H = HSV.H, S = HSV.S, V = HSV.V; - var I = Math.floor(H * 6); - var F = H * 6 - I; - var P = V * (1 - S); - var Q = V * (1 - F * S); - var T = V * (1 - (1 - F) * S); - - switch (I % 6) { - case 0: R = V; G = T; B = P; break; - case 1: R = Q; G = V; B = P; break; - case 2: R = P; G = V; B = T; break; - case 3: R = P; G = Q; B = V; break; - case 4: R = T; G = P; B = V; break; - case 5: R = V; G = P; B = Q; break; - } - - var RS = Math.floor(R * 255).toString(16).toUpperCase(); - var GS = Math.floor(G * 255).toString(16).toUpperCase(); - var BS = Math.floor(B * 255).toString(16).toUpperCase(); - - if (RS.length == 1) RS = "0" + RS; - if (GS.length == 1) GS = "0" + GS; - if (BS.length == 1) BS = "0" + BS; - - return "#" + RS + GS + BS; -} - -/** - * Returns the array of default colors for the list of favorite colors. - * @returns {HSVColor[]} - Array of default colors - */ -function GetDefaultSavedColors() { - - if (DefaultSavedColors.length == 0) { //sets custom default values if not set yet - DefaultSavedColors[0] = {H: 0, S: 0, V: 0.12549019607843137}; - DefaultSavedColors[1] = {H: 0, S: 0, V: 0.5019607843137255}; - DefaultSavedColors[2] = {H: 0, S: 0, V: 0.7333333333333333}; - DefaultSavedColors[3] = {H: 0, S: 0.24705882352941172, V: 0.6666666666666666}; - DefaultSavedColors[4] = {H: 0.3333333333333333, S: 0.24705882352941172, V: 0.6666666666666666}; - DefaultSavedColors[5] = {H: 0.6666666666666666, S: 0.24705882352941172, V: 0.6666666666666666}; - DefaultSavedColors[6] = {H: 0.16666666666666666, S: 0.24705882352941172, V: 0.6666666666666666}; - DefaultSavedColors[7] = {H: 0.5, S: 0.24705882352941172, V: 0.6666666666666666}; - DefaultSavedColors[8] = {H: 0.8333333333333334, S: 0.24705882352941172, V: 0.6666666666666666}; - DefaultSavedColors[9] = {H: 0, S: 0.7500000000000001, V: 0.8}; - DefaultSavedColors[10] = {H: 0.3333333333333333, S: 0.7500000000000001, V: 0.8}; - DefaultSavedColors[11] = {H: 0.6666666666666666, S: 0.7500000000000001, V: 0.8}; - DefaultSavedColors[12] = {H: 0.16666666666666666, S: 0.7500000000000001, V: 0.8}; - DefaultSavedColors[13] = {H: 0.5, S: 0.7500000000000001, V: 0.8}; - DefaultSavedColors[14] = {H: 0.8333333333333334, S: 0.7500000000000001, V: 0.8}; - DefaultSavedColors[15] = {H: 0, S: 0, V: 0.12549019607843137}; - DefaultSavedColors[16] = {H: 0, S: 0, V: 0.5019607843137255}; - DefaultSavedColors[17] = {H: 0, S: 0, V: 0.7333333333333333}; - DefaultSavedColors[18] = {H: 0, S: 0.24705882352941172, V: 0.6666666666666666}; - - for (let i = 0; i < ColorPickerNumSaved; i++) { //fill rest of slots with white - if (typeof DefaultSavedColors[i] != "object") { - DefaultSavedColors[i] = {H: 0, S: 0, V: 1}; - } - } - } - - var SavedColors = []; - for (let i = 0; i < ColorPickerNumSaved; i++) { - SavedColors[i] = Object.assign({}, DefaultSavedColors[i]); - } - return SavedColors; -} diff --git a/Scripts/Common.js b/Scripts/Common.js deleted file mode 100644 index 29ff4c345..000000000 --- a/Scripts/Common.js +++ /dev/null @@ -1,906 +0,0 @@ -// Main variables -"use strict"; -/** @type {PlayerCharacter} */ -var Player; -/** @type {number|string} */ -var KeyPress = ""; -var CurrentModule; -/** @type {string} */ -var CurrentScreen; -/** @type {ScreenFunctions} */ -var CurrentScreenFunctions; -/** @type {Character|NPCCharacter|null} */ -var CurrentCharacter = null; -var CurrentOnlinePlayers = 0; -var CurrentDarkFactor = 1.0; -var CommonIsMobile = false; -/** @type {Record} */ -var CommonCSVCache = {}; -var CutsceneStage = 0; - -var CommonPhotoMode = false; -var GameVersion = "R0"; -const GameVersionFormat = /^R([0-9]+)(?:(Alpha|Beta)([0-9]+)?)?$/; -var CommonVersionUpdated = false; -var CommonTouchList = null; - -/** - * An enum encapsulating possible chatroom message substitution tags. Character name substitution tags are interpreted - * in chatrooms as follows (assuming the character name is Ben987): - * SOURCE_CHAR: "Ben987" - * DEST_CHAR: "Ben987's" (if character is not self), "her" (if character is self) - * DEST_CHAR_NAME: "Ben987's" - * TARGET_CHAR: "Ben987" (if character is not self), "herself" (if character is self) - * TARGET_CHAR_NAME: "Ben987" - * Additionally, sending the following tags will ensure that asset names in messages are correctly translated by - * recipients: - * ASSET_NAME: (substituted with the localized name of the asset, if available) - * @type {Record<"SOURCE_CHAR"|"DEST_CHAR"|"DEST_CHAR_NAME"|"TARGET_CHAR"|"TARGET_CHAR_NAME"|"ASSET_NAME", CommonChatTags>} - */ -const CommonChatTags = { - SOURCE_CHAR: "SourceCharacter", - DEST_CHAR: "DestinationCharacter", - DEST_CHAR_NAME: "DestinationCharacterName", - TARGET_CHAR: "TargetCharacter", - TARGET_CHAR_NAME: "TargetCharacterName", - ASSET_NAME: "AssetName", -}; - -String.prototype.replaceAt=function(index, character) { - return this.substr(0, index) + character + this.substr(index+character.length); -}; - -/** - * A map of keys to common font stack definitions. Each stack definition is a - * two-item array whose first item is an ordered list of fonts, and whose - * second item is the generic fallback font family (e.g. sans-serif, serif, - * etc.) - * @constant - * @type {Object.} - */ -const CommonFontStacks = { - Arial: [["Arial"], "sans-serif"], - TimesNewRoman: [["Times New Roman", "Times"], "serif"], - Papyrus: [["Papyrus", "Ink Free", "Segoe Script", "Gabriola"], "fantasy"], - ComicSans: [["Comic Sans MS", "Comic Sans", "Brush Script MT", "Segoe Print"], "cursive"], - Impact: [["Impact", "Arial Black", "Franklin Gothic", "Arial"], "sans-serif"], - HelveticaNeue: [["Helvetica Neue", "Helvetica", "Arial"], "sans-serif"], - Verdana: [["Verdana", "Helvetica Neue", "Arial"], "sans-serif"], - CenturyGothic: [["Century Gothic", "Apple Gothic", "AppleGothic", "Futura"], "sans-serif"], - Georgia: [["Georgia", "Times"], "serif"], - CourierNew: [["Courier New", "Courier"], "monospace"], - Copperplate: [["Copperplate", "Copperplate Gothic Light"], "fantasy"], -}; - -/** - * Checks if a variable is a number - * @param {*} n - Variable to check for - * @returns {boolean} - Returns TRUE if the variable is a finite number - */ -function CommonIsNumeric(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -} - -/** - * Gets the current time as a string - * @returns {string} - Returns the current date and time in a yyyy-mm-dd hh:mm:ss format - */ -function CommonGetFormatDate() { - var d = new Date(); - var yyyy = d.getFullYear(); - var mm = d.getMonth() < 9 ? "0" + (d.getMonth() + 1) : (d.getMonth() + 1); // getMonth() is zero-based - var dd = d.getDate() < 10 ? "0" + d.getDate() : d.getDate(); - var hh = d.getHours() < 10 ? "0" + d.getHours() : d.getHours(); - var min = d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes(); - var ss = d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds(); - return `${yyyy}-${mm}-${dd} ${hh}:${min}:${ss}`; -} - -/** - * Detects if the user is on a mobile browser - * @returns {boolean} - Returns TRUE if the user is on a mobile browser - */ -function CommonDetectMobile() { - - // First check - var mobile = ['iphone', 'ipad', 'android', 'blackberry', 'nokia', 'opera mini', 'windows mobile', 'windows phone', 'iemobile', 'mobile/', 'webos', 'kindle']; - for (let i in mobile) if (navigator.userAgent.toLowerCase().indexOf(mobile[i].toLowerCase()) > 0) return true; - - // IPad pro check - if (navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && /MacIntel/.test(navigator.platform)) return true; - - // Second check - if (sessionStorage.desktop) return false; - else if (localStorage.mobile) return true; - - // If nothing is found, we assume desktop - return false; - -} - -/** - * Gets the current browser name and version - * @returns {{Name: string, Version: string}} - Browser info - */ -function CommonGetBrowser() { - var ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; - if (/trident/i.test(M[1])) { - tem = /\brv[ :]+(\d+)/g.exec(ua) || []; - return { Name: "IE", Version: (tem[1] || "N/A") }; - } - if (M[1] === 'Chrome') { - tem = ua.match(/\bOPR|Edge\/(\d+)/); - if (tem != null) return { Name: "Opera", Version: tem[1] || "N/A" }; - } - M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?']; - if ((tem = ua.match(/version\/(\d+)/i)) != null) M.splice(1, 1, tem[1]); - return { Name: M[0] || "N/A", Version: M[1] || "N/A" }; -} - -/** - * Parse a CSV file content into an array - * @param {string} str - Content of the CSV - * @returns {string[][]} Array representing each line of the parsed content, each line itself is split by commands and stored within an array. - */ -function CommonParseCSV(str) { - /** @type {string[][]} */ - var arr = []; - var quote = false; // true means we're inside a quoted field - var c; - var col; - // We remove whitespace on start and end - str = str.replace(/\r\n/g, '\n').trim(); - - // iterate over each character, keep track of current row and column (of the returned array) - for (let row = col = c = 0; c < str.length; c++) { - var cc = str[c], nc = str[c + 1]; // current character, next character - arr[row] = arr[row] || []; // create a new row if necessary - arr[row][col] = arr[row][col] || ''; // create a new column (start with empty string) if necessary - - // If the current character is a quotation mark, and we're inside a - // quoted field, and the next character is also a quotation mark, - // add a quotation mark to the current column and skip the next character - if (cc == '"' && quote && nc == '"') { arr[row][col] += cc; ++c; continue; } - - // If it's just one quotation mark, begin/end quoted field - if (cc == '"') { quote = !quote; continue; } - - // If it's a comma and we're not in a quoted field, move on to the next column - if (cc == ',' && !quote) { ++col; continue; } - - // If it's a newline and we're not in a quoted field, move on to the next - // row and move to column 0 of that new row - if (cc == '\n' && !quote) { ++row; col = 0; continue; } - - // Otherwise, append the current character to the current column - arr[row][col] += cc; - } - return arr; -} - -/** - * Read a CSV file from cache, or fetch it from the server - * @param {string} Array - Name of where the cached text is stored - * @param {string} Path - Path/Group in which the screen is located - * @param {string} Screen - Screen for which the file is for - * @param {string} File - Name of the file to get - * @returns {void} - Nothing - */ -function CommonReadCSV(Array, Path, Screen, File) { - - // Changed from a single path to various arguments and internally concatenate them - // This ternary operator is used to keep backward compatibility - var FullPath = "Screens/" + Path + "/" + Screen + "/" + File + ".csv"; - if (CommonCSVCache[FullPath]) { - window[Array] = CommonCSVCache[FullPath]; - return; - } - - // Opens the file, parse it and returns the result in an Object - CommonGet(FullPath, function () { - if (this.status == 200) { - CommonCSVCache[FullPath] = CommonParseCSV(this.responseText); - window[Array] = CommonCSVCache[FullPath]; - } - }); - - // If a translation file is available, we open the txt file and keep it in cache - var TranslationPath = FullPath.replace(".csv", "_" + TranslationLanguage + ".txt"); - if (TranslationAvailable(TranslationPath)) - CommonGet(TranslationPath, function () { - if (this.status == 200) TranslationCache[TranslationPath] = TranslationParseTXT(this.responseText); - }); - -} - -/** - * AJAX utility to get a file and return its content. By default will retry requests 10 times - * @param {string} Path - Path of the resource to request - * @param {(this: XMLHttpRequest, xhr: XMLHttpRequest) => void} Callback - Callback to execute once the resource is received - * @param {number} [RetriesLeft] - How many more times to retry if the request fails - after this hits zero, an error will be logged - * @returns {void} - Nothing - */ -function CommonGet(Path, Callback, RetriesLeft) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", Path); - xhr.onloadend = function() { - // For non-error responses, call the callback - if (this.status < 400) Callback.bind(this)(xhr); - // Otherwise, retry - else CommonGetRetry(Path, Callback, RetriesLeft); - }; - xhr.onerror = function() { CommonGetRetry(Path, Callback, RetriesLeft); }; - xhr.send(null); -} - -/** - * Retry handler for CommonGet requests. Exponentially backs off retry attempts up to a limit of 1 minute. By default, - * retries up to a maximum of 10 times. - * @param {string} Path - The path of the resource to request - * @param {(this: XMLHttpRequest, xhr: XMLHttpRequest) => void} Callback - Callback to execute once the resource is received - * @param {number} [RetriesLeft] - How many more times to retry - after this hits zero, an error will be logged - * @returns {void} - Nothing - */ -function CommonGetRetry(Path, Callback, RetriesLeft) { - if (typeof RetriesLeft !== "number") RetriesLeft = 10; - if (RetriesLeft <= 0) { - console.error(`GET request to ${Path} failed - no more retries`); - } else { - const retrySeconds = Math.min(Math.pow(2, Math.max(0, 10 - RetriesLeft)), 60); - console.warn(`GET request to ${Path} failed - retrying in ${retrySeconds} second${retrySeconds === 1 ? "" : "s"}...`); - setTimeout(() => CommonGet(Path, Callback, RetriesLeft - 1), retrySeconds * 1000); - } -} - -/** - * Catches the clicks on the main screen and forwards it to the current screen click function if it exists, otherwise it sends it to the dialog click function - * @param {MouseEvent | TouchEvent} event - The event that triggered this - * @returns {void} - Nothing - */ -function CommonClick(event) { - ServerClickBeep(); - if (CurrentCharacter == null) - CurrentScreenFunctions.Click(event); - else - DialogClick(); -} - -/** - * Returns TRUE if a section of the screen is currently touched on a mobile device - * @param {number} X - The X position - * @param {number} Y - The Y position - * @param {number} W - The width of the square - * @param {number} H - The height of the square - * @param {object} TL - Can give a specific touch event instead of the default one - * @returns {boolean} - */ -function CommonTouchActive(X, Y, W, H, TL) { - if (!CommonIsMobile) return false; - if (TL == null) TL = CommonTouchList; - if (TL != null) - for (let Touch of TL) { - let TouchX = Math.round((Touch.pageX - MainCanvas.canvas.offsetLeft) * 2000 / MainCanvas.canvas.clientWidth); - let TouchY = Math.round((Touch.pageY - MainCanvas.canvas.offsetTop) * 1000 / MainCanvas.canvas.clientHeight); - if ((TouchX >= X) && (TouchX <= X + W) && (TouchY >= Y) && (TouchY <= Y + H)) - return true; - } - return false; -} - -/** - * Catches key presses on the main screen and forwards it to the current screen key down function if it exists, otherwise it sends it to the dialog key down function - * @param {KeyboardEvent} event - The event that triggered this - * @returns {void} - Nothing - */ -function CommonKeyDown(event) { - if (CurrentCharacter == null) { - if (CurrentScreenFunctions.KeyDown) - CurrentScreenFunctions.KeyDown(event); - if (ControllerActive == true) { - ControllerSupportKeyDown(); - } - } - else { - StruggleKeyDown(); - if (ControllerActive == true) { - ControllerSupportKeyDown(); - } - } -} - -/** - * Calls a basic dynamic function if it exists, for complex functions, use: CommonDynamicFunctionParams - * @param {string} FunctionName - Name of the function to call - * @returns {void} - Nothing - */ -function CommonDynamicFunction(FunctionName) { - if (typeof window[FunctionName.substr(0, FunctionName.indexOf("("))] === "function") - window[FunctionName.replace("()", "")](); - else - console.log("Trying to launch invalid function: " + FunctionName); -} - - -/** - * Calls a dynamic function with parameters (if it exists), also allow ! in front to reverse the result. The dynamic function is the provided function name in the dialog option object and it is prefixed by the current screen. - * @param {string} FunctionName - Function name to call dynamically - * @returns {*} - Returns what the dynamic function returns or FALSE if the function does not exist - */ -function CommonDynamicFunctionParams(FunctionName) { - - // Gets the reverse (!) sign - var Reverse = false; - if (FunctionName.substring(0, 1) == "!") Reverse = true; - FunctionName = FunctionName.replace("!", ""); - - // Gets the real function name and parameters - var ParamCount = 1; - if (FunctionName.indexOf("()") >= 0) ParamCount = 0; - else ParamCount = FunctionName.split(",").length; - var openParenthesisIndex = FunctionName.indexOf("("); - var closedParenthesisIndex = FunctionName.indexOf(")", openParenthesisIndex); - var Params = FunctionName.substring(openParenthesisIndex + 1, closedParenthesisIndex).split(","); - for (let P = 0; P < Params.length; P++) - Params[P] = Params[P].trim().replace('"', '').replace('"', ''); - FunctionName = FunctionName.substring(0, openParenthesisIndex); - if ((FunctionName.indexOf("Dialog") != 0) && (FunctionName.indexOf("Inventory") != 0) && (FunctionName.indexOf(CurrentScreen) != 0)) FunctionName = CurrentScreen + FunctionName; - - // If it's really a function, we continue - if (typeof window[FunctionName] === "function") { - - // Launches the function with the params and returns the result - var Result = true; - if (ParamCount == 0) Result = window[FunctionName](); - if (ParamCount == 1) Result = window[FunctionName](Params[0]); - if (ParamCount == 2) Result = window[FunctionName](Params[0], Params[1]); - if (ParamCount == 3) Result = window[FunctionName](Params[0], Params[1], Params[2]); - if (Reverse) return !Result; - else return Result; - - } else { - - // Log the error in the console - console.log("Trying to launch invalid function: " + FunctionName); - return false; - - } - -} - - -/** - * Calls a named global function with the passed in arguments, if the named function exists. Differs from - * CommonDynamicFunctionParams in that arguments are not parsed from the passed in FunctionName string, but - * passed directly into the function call, allowing for more complex JS objects to be passed in. This - * function will not log to console if the provided function name does not exist as a global function. - * @param {string} FunctionName - The name of the global function to call - * @param {any[]} [args] - zero or more arguments to be passed to the function (optional) - * @returns {any} - returns the result of the function call, or undefined if the function name isn't valid - */ -function CommonCallFunctionByName(FunctionName/*, ...args */) { - var Function = window[FunctionName]; - if (typeof Function === "function") { - var args = Array.prototype.slice.call(arguments, 1); - return Function.apply(null, args); - } -} - -/** - * Behaves exactly like CommonCallFunctionByName, but logs a warning if the function name is invalid. - * @param {string} FunctionName - The name of the global function to call - * @param {any[]} [args] - zero or more arguments to be passed to the function (optional) - * @returns {any} - returns the result of the function call, or undefined if the function name isn't valid - */ -function CommonCallFunctionByNameWarn(FunctionName/*, ...args */) { - var Function = window[FunctionName]; - if (typeof Function === "function") { - var args = Array.prototype.slice.call(arguments, 1); - return Function.apply(null, args); - } else { - console.warn(`Attempted to call invalid function "${FunctionName}"`); - } -} - -/** - * Sets the current screen and calls the loading script if needed - * @param {string} NewModule - Module of the screen to display - * @param {string} NewScreen - Screen to display - * @returns {void} - Nothing - */ -function CommonSetScreen(NewModule, NewScreen) { - const prevScreen = CurrentScreen; - - if (CurrentScreenFunctions && CurrentScreenFunctions.Unload) { - CurrentScreenFunctions.Unload(); - } - if (ControllerActive == true) { - ClearButtons(); - } - - - // Check for required functions - if (typeof window[`${NewScreen}Run`] !== "function") { - throw Error(`Screen "${NewScreen}": Missing required Run function`); - } - if (typeof window[`${NewScreen}Click`] !== "function") { - throw Error(`Screen "${NewScreen}": Missing required Click function`); - } - - CurrentModule = NewModule; - CurrentScreen = NewScreen; - CurrentScreenFunctions = { - Run: window[`${NewScreen}Run`], - Click: window[`${NewScreen}Click`], - Load: typeof window[`${NewScreen}Load`] === "function" ? window[`${NewScreen}Load`] : undefined, - Unload: typeof window[`${NewScreen}Unload`] === "function" ? window[`${NewScreen}Unload`] : undefined, - Resize: typeof window[`${NewScreen}Resize`] === "function" ? window[`${NewScreen}Resize`] : undefined, - KeyDown: typeof window[`${NewScreen}KeyDown`] === "function" ? window[`${NewScreen}KeyDown`] : undefined, - Exit: typeof window[`${NewScreen}Exit`] === "function" ? window[`${NewScreen}Exit`] : undefined - }; - - CurrentDarkFactor = 1.0; - CommonGetFont.clearCache(); - CommonGetFontName.clearCache(); - TextLoad(); - - if (CurrentScreenFunctions.Load) { - CurrentScreenFunctions.Load(); - } - if (CurrentScreenFunctions.Resize) { - CurrentScreenFunctions.Resize(true); - } - - if (prevScreen == "ChatSearch" || prevScreen == "ChatCreate") - ChatRoomStimulationMessage("Walk"); -} - -/** - * Gets the current time in ms - * @returns {number} - Date in ms - */ -function CommonTime() { - return Date.now(); -} - -/** - * Checks if a given value is a valid HEX color code - * @param {string} Value - Potential HEX color code - * @returns {boolean} - Returns TRUE if the string is a valid HEX color - */ -function CommonIsColor(Value) { - if ((Value == null) || (Value.length < 3)) return false; - //convert short hand hex color to standard format - if (/^#[0-9A-F]{3}$/i.test(Value)) Value = "#" + Value[1] + Value[1] + Value[2] + Value[2] + Value[3] + Value[3]; - return /^#[0-9A-F]{6}$/i.test(Value); -} - -/** - * Checks whether an item's color has a valid value that can be interpreted by the drawing - * functions. Valid values are null, undefined, strings, and an array containing any of the - * aforementioned types. - * @param {*} Color - The Color value to check - * @returns {boolean} - Returns TRUE if the color is a valid item color - */ -function CommonColorIsValid(Color) { - if (Color == null || typeof Color === "string") return true; - if (Array.isArray(Color)) return Color.every(C => C == null || typeof C === "string"); - return false; -} - -/** - * Get a random item from a list while making sure not to pick the previous one. - * @template T - * @param {T} ItemPrevious - Previously selected item from the given list - * @param {T[]} ItemList - List for which to pick a random item from - * @returns {T} - The randomly selected item from the list - */ -function CommonRandomItemFromList(ItemPrevious, ItemList) { - var NewItem = ItemPrevious; - while (NewItem == ItemPrevious) - NewItem = ItemList[Math.floor(Math.random() * ItemList.length)]; - return NewItem; -} - -/** - * Converts a string of numbers split by commas to an array, sanitizes the array by removing all NaN or undefined elements. - * @param {string} s - String of numbers split by commas - * @returns {number[]} - Array of valid numbers from the given string - */ -function CommonConvertStringToArray(s) { - var arr = []; - if (s != "") { - arr = s.split(',').reduce((list, curr) => { - if (!(!curr || Number.isNaN(Number(curr)))) list.push(Number(curr)); - return list; - }, []); - } - return arr; -} - -/** - * Converts an array to a string separated by commas (equivalent of .join(",")) - * @param {Array} Arr - Array to convert to a joined string - * @returns {string} - String of all the array items joined together - */ -function CommonConvertArrayToString(Arr) { - var S = ""; - for (let P = 0; P < Arr.length; P++) { - if (P != 0) S = S + ","; - S = S + Arr[P].toString(); - } - return S; -} - -/** - * Checks whether two item colors are equal. An item color may either be a string or an array of strings. - * @param {string|string[]} C1 - The first color to check - * @param {string|string[]} C2 - The second color to check - * @returns {boolean} - TRUE if C1 and C2 represent the same item color, FALSE otherwise - */ -function CommonColorsEqual(C1, C2) { - if (Array.isArray(C1) && Array.isArray(C2)) { - return CommonArraysEqual(C1, C2); - } - return C1 === C2; -} - -/** - * Checks whether two arrays are equal. The arrays are considered equal if they have the same length and contain the same items in the same - * order, as determined by === comparison - * @param {*[]} a1 - The first array to compare - * @param {*[]} a2 - The second array to compare - * @returns {boolean} - TRUE if both arrays have the same length and contain the same items in the same order, FALSE otherwise - */ -function CommonArraysEqual(a1, a2) { - return a1.length === a2.length && a1.every((item, i) => item === a2[i]); -} - -/** - * Creates a debounced wrapper for the provided function with the provided wait time. The wrapped function will not be called as long as - * the debounced function continues to be called. If the debounced function is called, and then not called again within the wait time, the - * wrapped function will be called. - * @param {function} func - The function to debounce - * @returns {function} - A debounced version of the provided function - */ -function CommonDebounce(func) { - let timeout, args, context, timestamp, result, wait; - - function later() { - const last = CommonTime() - timestamp; - if (last >= 0 && last < wait) { - timeout = setTimeout(later, wait - last); - } else { - timeout = null; - result = func.apply(context, args); - context = args = null; - } - } - - return function (waitInterval/*, ...args */) { - context = this; - wait = waitInterval; - args = Array.prototype.slice.call(arguments, 1); - timestamp = CommonTime(); - if (!timeout) { - timeout = setTimeout(later, wait); - } - return result; - }; -} - -/** - * Creates a throttling wrapper for the provided function with the provided wait time. If the wrapped function has been successfully called - * within the wait time, further call attempts will be delayed until the wait time has passed. - * @param {function} func - The function to throttle - * @returns {function} - A throttled version of the provided function - */ -function CommonThrottle(func) { - let timeout, args, context, timestamp = 0, result; - - function run() { - timeout = null; - result = func.apply(context, args); - timestamp = CommonTime(); - } - - return function (wait/*, ...args */) { - context = this; - args = Array.prototype.slice.call(arguments, 1); - if (!timeout) { - const last = CommonTime() - timestamp; - if (last >= 0 && last < wait) { - timeout = setTimeout(run, wait - last); - } else { - run(); - } - } - return result; - }; -} - -/** - * Creates a wrapper for a function to limit how often it can be called. The player-defined wait interval setting determines the - * allowed frequency. Below 100 ms the function will be throttled and above will be debounced. - * @param {function} func - The function to limit calls of - * @param {number} [minWait=0] - A lower bound for how long the wait interval can be, 0 by default - * @param {number} [maxWait=1000] - An upper bound for how long the wait interval can be, 1 second by default - * @returns {function} - A debounced or throttled version of the function - */ -function CommonLimitFunction(func, minWait = 0, maxWait = 1000) { - const funcDebounced = CommonDebounce(func); - const funcThrottled = CommonThrottle(func); - - return function () { - const wait = Math.min( - Math.max( - Player.GraphicsSettings ? Player.GraphicsSettings.AnimationQuality : 100, minWait - ), - maxWait, - ); - const args = [wait].concat(Array.from(arguments)); - return wait < 100 ? funcThrottled.apply(this, args) : funcDebounced.apply(this, args); - }; -} - -/** - * Creates a simple memoizer. - * The memoized function does calculate its result exactly once and from that point on, uses - * the result stored in a local cache to speed up things. - * @template {Function} T - * @param {T} func - The function to memoize - * @returns {MemoizedFunction} - The result of the memoized function - */ -function CommonMemoize(func) { - var memo = {}; - - /** @type {MemoizedFunction} */ - // @ts-ignore - var memoized = function () { - var index = []; - for (var i = 0; i < arguments.length; i++) { - if (typeof arguments[i] === "object") { - index.push(JSON.stringify(arguments[i])); - } else { - index.push(String(arguments[i])); - } - } // for - if (!(index in memo)) { - memo[index] = func.apply(this, arguments); - } - return memo[index]; - }; // function - - // add a clear cache method - memoized.clearCache = function () { - memo = {}; - }; - return memoized; -} // CommonMemoize - -/** - * Memoized getter function. Returns a font string specifying the player's - * preferred font and the provided size. This is memoized as it is called on - * every frame in many cases. - * @param {number} size - The font size that should be specified in the - * returned font string - * @returns {string} - A font string specifying the requested font size and - * the player's preferred font stack. For example: - * 12px "Courier New", "Courier", monospace - */ -const CommonGetFont = CommonMemoize((size) => { - return `${size}px ${CommonGetFontName()}`; -}); - -/** - * Memoized getter function. Returns a font string specifying the player's - * preferred font stack. This is memoized as it is called on every frame in - * many cases. - * @returns {string} - A font string specifying the player's preferred font - * stack. For example: - * "Courier New", "Courier", monospace - */ -const CommonGetFontName = CommonMemoize(() => { - const pref = Player && Player.GraphicsSettings && Player.GraphicsSettings.Font; - const fontStack = CommonFontStacks[pref] || CommonFontStacks.Arial; - const font = fontStack[0].map(fontName => `"${fontName}"`).join(", "); - return `${font}, ${fontStack[1]}`; -}); - -/** - * Take a screenshot of specified area in "photo mode" and open the image in a new tab - * @param {number} Left - Position of the area to capture from the left of the canvas - * @param {number} Top - Position of the area to capture from the top of the canvas - * @param {number} Width - Width of the area to capture - * @param {number} Height - Height of the area to capture - * @returns {void} - Nothing - */ -function CommonTakePhoto(Left, Top, Width, Height) { - CommonPhotoMode = true; - - // Ensure everything is redrawn once in photo-mode - DrawProcess(0); - - // Capture screen as image URL - const ImgData = /** @type {HTMLCanvasElement} */ (document.getElementById("MainCanvas")).getContext('2d').getImageData(Left, Top, Width, Height); - let PhotoCanvas = document.createElement('canvas'); - PhotoCanvas.width = Width; - PhotoCanvas.height = Height; - PhotoCanvas.getContext('2d').putImageData(ImgData, 0, 0); - const PhotoImg = PhotoCanvas.toDataURL("image/png"); - - // Open the image in a new window - let newWindow = window.open('about:blank', '_blank'); - if (newWindow) { - newWindow.document.write("from canvas"); - newWindow.document.close(); - } else { - console.warn("Popups blocked: Cannot open photo in new tab."); - } - - CommonPhotoMode = false; -} - -/** - * Takes an array of items and converts it to record format - * @param { { Group: string; Name: string; Type?: string|null }[] } arr The array of items - * @returns { { [group: string]: { [name: string]: string[] } } } Output in object foramat - */ -function CommonPackItemArray(arr) { - /** @type { Record> } */ - const res = {}; - for (const I of arr) { - let G = res[I.Group]; - if (G === undefined) { - G = res[I.Group] = {}; - } - let A = G[I.Name]; - if (A === undefined) { - A = G[I.Name] = []; - } - const T = I.Type || ""; - if (!A.includes(T)) { - A.push(T); - } - } - return res; -} - -/** - * Takes an record format of items and converts it to array - * @param { { [group: string]: { [name: string]: string[] } } } arr Object defining items - * @return { { Group: string; Name: string; Type?: string }[] } The array of items - */ -function CommonUnpackItemArray(arr) { - const res = []; - for (const G of Object.keys(arr)) { - for (const A of Object.keys(arr[G])) { - for (const T of arr[G][A]) { - res.push({ Group: G, Name: A, Type: T ? T : undefined }); - } - } - } - return res; -} - -/** - * Compares two version numbers and returns -1/0/1 if Other number is smaller/same/larger than Current one - * @param {string} Current Current version number - * @param {string} Other Other version number - * @returns {-1|0|1} Comparison result - */ -function CommonCompareVersion(Current, Other) { - const CurrentMatch = GameVersionFormat.exec(Current); - const OtherMatch = GameVersionFormat.exec(Other); - if (CurrentMatch == null || OtherMatch == null || isNaN(CurrentMatch[1]) || isNaN(OtherMatch[1])) return -1; - const CurrentVer = [ - Number.parseInt(CurrentMatch[1]), - CurrentMatch[2] === "Alpha" ? 1 : CurrentMatch[2] === "Beta" ? 2 : 3, - Number.parseInt(CurrentMatch[3]) || 0 - ]; - const OtherVer = [ - Number.parseInt(OtherMatch[1]), - OtherMatch[2] === "Alpha" ? 1 : OtherMatch[2] === "Beta" ? 2 : 3, - Number.parseInt(OtherMatch[3]) || 0 - ]; - for (let i = 0; i < 3; i++) { - if (CurrentVer[i] !== OtherVer[i]) { - return /** @type {-1|0|1} */ (Math.sign(OtherVer[i] - CurrentVer[i])); - } - } - return 0; -} - -/** - * A simple deep equality check function which checks whether two objects are equal. The function traverses recursively - * into objects and arrays to check for equality. Primitives and simple types are considered equal as defined by `===`. - * @param {*} obj1 - The first object to compare - * @param {*} obj2 - The second object to compare - * @returns {boolean} - TRUE if both objects are equal, up to arbitrarily deeply nested property values, FALSE - * otherwise. - */ -function CommonDeepEqual(obj1, obj2) { - if (obj1 === obj2) { - return true; - } - - if (obj1 && obj2 && typeof obj1 === "object" && typeof obj2 === "object") { - // If the objects do not share a prototype, they are not equal - if (Object.getPrototypeOf(obj1) !== Object.getPrototypeOf(obj2)) { - return false; - } - - // Get the keys for the objects - const keys1 = Object.keys(obj1); - const keys2 = Object.keys(obj2); - - // If the objects have different numbers of keys, they are not equal - if (keys1.length !== keys2.length) { - return false; - } - - // Sort the keys - keys1.sort(); - keys2.sort(); - return keys1.every((key, i) => { - // If the keys are different, the objects are not equal - if (key !== keys2[i]) { - return false; - } - // Otherwise, compare the values - return CommonDeepEqual(obj1[key], obj2[key]); - }); - } - - return false; -} - -/** - * Adds all items from the source array to the destination array if they aren't already included - * @param {*[]} dest - The destination array - * @param {*[]} src - The source array - * @returns {*[]} - The destination array - */ -function CommonArrayConcatDedupe(dest, src) { - if (Array.isArray(src) && Array.isArray(dest)) { - for (const item of src) { - if (!dest.includes(item)) dest.push(item); - } - } - return dest; -} - -/** - * Common function for removing a padlock from an item and publishing a corresponding chat message (must be called with - * the item's group focused) - * @param {Character} C - The character on whom the item is equipped - * @param {Item} Item - The item to unlock - * @returns {void} - Nothing - */ -function CommonPadlockUnlock(C, Item) { - for (let A = 0; A < C.Appearance.length; A++) { - if (C.Appearance[A].Asset.Group.Name === C.FocusGroup.Name) { - C.Appearance[A] = Item; - break; - } - } - InventoryUnlock(C, C.FocusGroup.Name); - ChatRoomPublishAction(C, Item, null, true, "ActionUnlock"); -} - -/** - * Common noop function - * @returns {void} - Nothing - */ -function CommonNoop() { - // Noop function -} - -/** - * Redirects the address to HTTPS for all production environments, returns the proper heroku server - * @returns {String} - Returns the proper server to use in production or test - */ -function CommonGetServer() { - if ((location.href.indexOf("bondageprojects") < 0) && (location.href.indexOf("bondage-europe") < 0)) return "https://bc-server-test.herokuapp.com/"; - if (location.protocol !== 'https:') location.replace(`https:${location.href.substring(location.protocol.length)}`); - return "https://bondage-club-server.herokuapp.com/"; -} diff --git a/Scripts/Common.ts b/Scripts/Common.ts new file mode 100644 index 000000000..969691cd5 --- /dev/null +++ b/Scripts/Common.ts @@ -0,0 +1,572 @@ +// Main variables +let DefaultPlayer: PlayerCharacter; +let KeyPress: number | string = ""; +let CurrentModule: string; +let CurrentScreen: string; +let CurrentCharacter: Character | null = null; +let CurrentOnlinePlayers = 0; +let CurrentDarkFactor = 1.0; +let CommonIsMobile = false; +let CommonCSVCache: {[_: string]: string[][]} = {}; +let CutsceneStage = 0; + +let CommonPhotoMode = false; +let GameVersion = "R0"; +const GameVersionFormat = /^R([0-9]+)(?:(Alpha|Beta)([0-9]+)?)?$/; +let CommonVersionUpdated = false; +let CommonTouchList = null; + +/** + * An enum encapsulating possible chatroom message substitution tags. Character name substitution tags are interpreted + * in chatrooms as follows (assuming the character name is Ben987): + * SOURCE_CHAR: "Ben987" + * DEST_CHAR: "Ben987's" (if character is not self), "her" (if character is self) + * DEST_CHAR_NAME: "Ben987's" + * TARGET_CHAR: "Ben987" (if character is not self), "herself" (if character is self) + * TARGET_CHAR_NAME: "Ben987" + * Additionally, sending the following tags will ensure that asset names in messages are correctly translated by + * recipients: + * ASSET_NAME: (substituted with the localized name of the asset, if available) + */ +const CommonChatTags = { + SOURCE_CHAR: "SourceCharacter", + DEST_CHAR: "DestinationCharacter", + DEST_CHAR_NAME: "DestinationCharacterName", + TARGET_CHAR: "TargetCharacter", + TARGET_CHAR_NAME: "TargetCharacterName", + ASSET_NAME: "AssetName", +}; + +String.prototype.replaceAt=function(index, character) { + return this.substr(0, index) + character + this.substr(index+character.length); +}; + +/** + * A map of keys to common font stack definitions. Each stack definition is a + * two-item array whose first item is an ordered list of fonts, and whose + * second item is the generic fallback font family (e.g. sans-serif, serif, + * etc.) + */ +const CommonFontStacks = { + Arial: [["Arial"], "sans-serif"], + TimesNewRoman: [["Times New Roman", "Times"], "serif"], + Papyrus: [["Papyrus", "Ink Free", "Segoe Script", "Gabriola"], "fantasy"], + ComicSans: [["Comic Sans MS", "Comic Sans", "Brush Script MT", "Segoe Print"], "cursive"], + Impact: [["Impact", "Arial Black", "Franklin Gothic", "Arial"], "sans-serif"], + HelveticaNeue: [["Helvetica Neue", "Helvetica", "Arial"], "sans-serif"], + Verdana: [["Verdana", "Helvetica Neue", "Arial"], "sans-serif"], + CenturyGothic: [["Century Gothic", "Apple Gothic", "AppleGothic", "Futura"], "sans-serif"], + Georgia: [["Georgia", "Times"], "serif"], + CourierNew: [["Courier New", "Courier"], "monospace"], + Copperplate: [["Copperplate", "Copperplate Gothic Light"], "fantasy"], +}; + +/** + * Checks if a variable is a number + * @param n - Variable to check for + * @returns Returns TRUE if the variable is a finite number + */ +function CommonIsNumeric(n: any): boolean { + return !isNaN(parseFloat(n)) && isFinite(n); +} + +/** + * Gets the current time as a string + * @returns Returns the current date and time in a yyyy-mm-dd hh:mm:ss format + */ +function CommonGetFormatDate(): string { + let d = new Date(); + let yyyy = d.getFullYear(); + let mm = d.getMonth() < 9 ? "0" + (d.getMonth() + 1) : (d.getMonth() + 1); // getMonth() is zero-based + let dd = d.getDate() < 10 ? "0" + d.getDate() : d.getDate(); + let hh = d.getHours() < 10 ? "0" + d.getHours() : d.getHours(); + let min = d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes(); + let ss = d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds(); + return `${yyyy}-${mm}-${dd} ${hh}:${min}:${ss}`; +} + +/** + * Detects if the user is on a mobile browser + * @returns Returns TRUE if the user is on a mobile browser + */ +function CommonDetectMobile(): boolean { + + // First check + let mobile = ['iphone', 'ipad', 'android', 'blackberry', 'nokia', 'opera mini', 'windows mobile', 'windows phone', 'iemobile', 'mobile/', 'webos', 'kindle']; + for (let i in mobile) if (navigator.userAgent.toLowerCase().indexOf(mobile[i].toLowerCase()) > 0) return true; + + // IPad pro check + if (navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && /MacIntel/.test(navigator.platform)) return true; + + // Second check + if (sessionStorage.desktop) return false; + else if (localStorage.mobile) return true; + + // If nothing is found, we assume desktop + return false; + +} + +/** + * Gets the current browser name and version + * @returns Browser info + */ +function CommonGetBrowser(): {Name: string, Version: string} { + let ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; + if (/trident/i.test(M[1])) { + tem = /\brv[ :]+(\d+)/g.exec(ua) || []; + return { Name: "IE", Version: (tem[1] || "N/A") }; + } + if (M[1] === 'Chrome') { + tem = ua.match(/\bOPR|Edge\/(\d+)/); + if (tem != null) return { Name: "Opera", Version: tem[1] || "N/A" }; + } + M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?']; + if ((tem = ua.match(/version\/(\d+)/i)) != null) M.splice(1, 1, tem[1]); + return { Name: M[0] || "N/A", Version: M[1] || "N/A" }; +} + +/** + * Parse a CSV file content into an array + * @param str - Content of the CSV + * @returns Array representing each line of the parsed content, each line itself is split by commands and stored within an array. + */ +function CommonParseCSV(str: string): string[][] { + let arr: string[][] = []; + let quote = false; // true means we're inside a quoted field + let c: number; + let col: number; + // We remove whitespace on start and end + str = str.replace(/\r\n/g, '\n').trim(); + + // iterate over each character, keep track of current row and column (of the returned array) + for (let row = col = c = 0; c < str.length; c++) { + let cc = str[c], nc = str[c + 1]; // current character, next character + arr[row] = arr[row] || []; // create a new row if necessary + arr[row][col] = arr[row][col] || ''; // create a new column (start with empty string) if necessary + + // If the current character is a quotation mark, and we're inside a + // quoted field, and the next character is also a quotation mark, + // add a quotation mark to the current column and skip the next character + if (cc == '"' && quote && nc == '"') { arr[row][col] += cc; ++c; continue; } + + // If it's just one quotation mark, begin/end quoted field + if (cc == '"') { quote = !quote; continue; } + + // If it's a comma and we're not in a quoted field, move on to the next column + if (cc == ',' && !quote) { ++col; continue; } + + // If it's a newline and we're not in a quoted field, move on to the next + // row and move to column 0 of that new row + if (cc == '\n' && !quote) { ++row; col = 0; continue; } + + // Otherwise, append the current character to the current column + arr[row][col] += cc; + } + return arr; +} + +/** + * Read a CSV file from cache, or fetch it from the server + * @param Array - Name of where the cached text is stored + * @param Path - Path/Group in which the screen is located + * @param Screen - Screen for which the file is for + * @param File - Name of the file to get + */ +function CommonReadCSV(Array: string, Path: string, Screen: string, File: string): void { + + // Changed from a single path to various arguments and internally concatenate them + // This ternary operator is used to keep backward compatibility + let FullPath = "Screens/" + Path + "/" + Screen + "/" + File + ".csv"; + if (CommonCSVCache[FullPath]) { + window[Array] = CommonCSVCache[FullPath]; + return; + } + + // Opens the file, parse it and returns the result in an Object + CommonGet(FullPath, function () { + if (this.status == 200) { + CommonCSVCache[FullPath] = CommonParseCSV(this.responseText); + window[Array] = CommonCSVCache[FullPath]; + } + }); + + // If a translation file is available, we open the txt file and keep it in cache + let TranslationPath = FullPath.replace(".csv", "_" + TranslationLanguage + ".txt"); + if (TranslationAvailable(TranslationPath)) + CommonGet(TranslationPath, function () { + if (this.status == 200) TranslationCache[TranslationPath] = TranslationParseTXT(this.responseText); + }); + +} + +/** + * AJAX utility to get a file and return its content. By default will retry requests 10 times + * @param Path - Path of the resource to request + * @param Callback - Callback to execute once the resource is received + * @param RetriesLeft - How many more times to retry if the request fails - after this hits zero, an error will be logged + */ +function CommonGet(Path: string, Callback: (this: XMLHttpRequest, xhr: XMLHttpRequest) => void, RetriesLeft: number = 10): void { + let xhr = new XMLHttpRequest(); + xhr.open("GET", Path); + xhr.onloadend = function() { + // For non-error responses, call the callback + if (this.status < 400) Callback.bind(this)(xhr); + // Otherwise, retry + else CommonGetRetry(Path, Callback, RetriesLeft); + }; + xhr.onerror = function() { CommonGetRetry(Path, Callback, RetriesLeft); }; + xhr.send(null); +} + +/** + * Retry handler for CommonGet requests. Exponentially backs off retry attempts up to a limit of 1 minute. By default, + * retries up to a maximum of 10 times. + * @param Path - The path of the resource to request + * @param Callback - Callback to execute once the resource is received + * @param RetriesLeft - How many more times to retry - after this hits zero, an error will be logged + */ +function CommonGetRetry(Path: string, Callback: (this: XMLHttpRequest, xhr: XMLHttpRequest) => void, RetriesLeft: number = 10): void { + if (RetriesLeft <= 0) { + console.error(`GET request to ${Path} failed - no more retries`); + } else { + const retrySeconds = Math.min(Math.pow(2, Math.max(0, 10 - RetriesLeft)), 60); + console.warn(`GET request to ${Path} failed - retrying in ${retrySeconds} second${retrySeconds === 1 ? "" : "s"}...`); + setTimeout(() => CommonGet(Path, Callback, RetriesLeft - 1), retrySeconds * 1000); + } +} + +/** + * Catches the clicks on the main screen and forwards it to the current screen click function if it exists, otherwise it sends it to the dialog click function + * @param event - The event that triggered this + */ +function CommonClick(event: MouseEvent | TouchEvent): void { + //KinkyDungeonClick(); +} + +/** + * Returns TRUE if a section of the screen is currently touched on a mobile device + * @param X - The X position + * @param Y - The Y position + * @param W - The width of the square + * @param H - The height of the square + * @param TL - Can give a specific touch event instead of the default one + */ +function CommonTouchActive(X: number, Y: number, W: number, H: number, TL: any): boolean { + if (!CommonIsMobile) return false; + if (TL == null) TL = CommonTouchList; + if (TL != null) + for (let Touch of TL) { + let TouchX = Math.round((Touch.pageX - PIXICanvas.offsetLeft) * 2000 / PIXICanvas.clientWidth); + let TouchY = Math.round((Touch.pageY - PIXICanvas.offsetTop) * 1000 / PIXICanvas.clientHeight); + if ((TouchX >= X) && (TouchX <= X + W) && (TouchY >= Y) && (TouchY <= Y + H)) + return true; + } + return false; +} + +/** + * @param event - The event that triggered this + */ +function CommonKeyDown(event: KeyboardEvent): void { + KinkyDungeonKeyDown(); +} + +/** + * Calls a basic dynamic function if it exists, for complex functions, use: CommonDynamicFunctionParams + * @param FunctionName - Name of the function to call + */ +function CommonDynamicFunction(FunctionName: string): void { + if (typeof window[FunctionName.substr(0, FunctionName.indexOf("("))] === "function") + window[FunctionName.replace("()", "")](); + else + console.log("Trying to launch invalid function: " + FunctionName); +} + + +/** + * Calls a dynamic function with parameters (if it exists), also allow ! in front to reverse the result. The dynamic function is the provided function name in the dialog option object and it is prefixed by the current screen. + * @param FunctionName - Function name to call dynamically + * @returns Returns what the dynamic function returns or FALSE if the function does not exist + */ +function CommonDynamicFunctionParams(FunctionName: string): any { + + // Gets the reverse (!) sign + let Reverse = false; + if (FunctionName.substring(0, 1) == "!") Reverse = true; + FunctionName = FunctionName.replace("!", ""); + + // Gets the real function name and parameters + let ParamCount = 1; + if (FunctionName.indexOf("()") >= 0) ParamCount = 0; + else ParamCount = FunctionName.split(",").length; + let openParenthesisIndex = FunctionName.indexOf("("); + let closedParenthesisIndex = FunctionName.indexOf(")", openParenthesisIndex); + let Params = FunctionName.substring(openParenthesisIndex + 1, closedParenthesisIndex).split(","); + for (let P = 0; P < Params.length; P++) + Params[P] = Params[P].trim().replace('"', '').replace('"', ''); + FunctionName = FunctionName.substring(0, openParenthesisIndex); + if ((FunctionName.indexOf("Dialog") != 0) && (FunctionName.indexOf("Inventory") != 0) && (FunctionName.indexOf(CurrentScreen) != 0)) FunctionName = CurrentScreen + FunctionName; + + // If it's really a function, we continue + if (typeof window[FunctionName] === "function") { + + // Launches the function with the params and returns the result + let Result = true; + if (ParamCount == 0) Result = window[FunctionName](); + if (ParamCount == 1) Result = window[FunctionName](Params[0]); + if (ParamCount == 2) Result = window[FunctionName](Params[0], Params[1]); + if (ParamCount == 3) Result = window[FunctionName](Params[0], Params[1], Params[2]); + if (Reverse) return !Result; + else return Result; + + } else { + + // Log the error in the console + console.log("Trying to launch invalid function: " + FunctionName); + return false; + + } + +} + + +/** + * Calls a named global function with the passed in arguments, if the named function exists. Differs from + * CommonDynamicFunctionParams in that arguments are not parsed from the passed in FunctionName string, but + * passed directly into the function call, allowing for more complex JS objects to be passed in. This + * function will not log to console if the provided function name does not exist as a global function. + * @param FunctionName - The name of the global function to call + * @param args - zero or more arguments to be passed to the function (optional) + * @returns Returns the result of the function call, or undefined if the function name isn't valid + */ +function CommonCallFunctionByName(FunctionName: string, ...args: any) { + let Function = window[FunctionName]; + if (typeof Function === "function") { + let args = Array.prototype.slice.call(arguments, 1); + return Function.apply(null, args); + } +} + +/** + * Behaves exactly like CommonCallFunctionByName, but logs a warning if the function name is invalid. + * @param FunctionName - The name of the global function to call + * @param args - zero or more arguments to be passed to the function (optional) + * @returns Returns the result of the function call, or undefined if the function name isn't valid + */ +function CommonCallFunctionByNameWarn(FunctionName: string, ...args: any) { + let Function = window[FunctionName]; + if (typeof Function === "function") { + let args = Array.prototype.slice.call(arguments, 1); + return Function.apply(null, args); + } else { + console.warn(`Attempted to call invalid function "${FunctionName}"`); + } +} + +/** + * Sets the current screen and calls the loading script if needed + * @param NewModule - Module of the screen to display + * @param NewScreen - Screen to display + */ +function CommonSetScreen(NewModule: string, NewScreen: string): void { + + CurrentModule = NewModule; + CurrentScreen = NewScreen; + + CurrentDarkFactor = 1.0; + TextLoad(); +} + +/** + * Gets the current time in ms + */ +function CommonTime(): number { + return Date.now(); +} + +/** + * Checks if a given value is a valid HEX color code + * @param Value - Potential HEX color code + * @returns Returns TRUE if the string is a valid HEX color + */ +function CommonIsColor(Value: string): boolean { + if ((Value == null) || (Value.length < 3)) return false; + //convert short hand hex color to standard format + if (/^#[0-9A-F]{3}$/i.test(Value)) Value = "#" + Value[1] + Value[1] + Value[2] + Value[2] + Value[3] + Value[3]; + return /^#[0-9A-F]{6}$/i.test(Value); +} + +/** + * Checks whether an item's color has a valid value that can be interpreted by the drawing + * functions. Valid values are null, undefined, strings, and an array containing any of the + * aforementioned types. + * @param Color - The Color value to check + * @returns Returns TRUE if the color is a valid item color + */ +function CommonColorIsValid(Color: any): boolean { + if (Color == null || typeof Color === "string") return true; + if (Array.isArray(Color)) return Color.every(C => C == null || typeof C === "string"); + return false; +} + +/** + * Get a random item from a list while making sure not to pick the previous one. + * @param ItemPrevious - Previously selected item from the given list + * @param ItemList - List for which to pick a random item from + * @returns The randomly selected item from the list + */ +function CommonRandomItemFromList(ItemPrevious: T, ItemList: T[]): T { + let NewItem = ItemPrevious; + if (!ItemList) return undefined; + while (NewItem == ItemPrevious) + NewItem = ItemList[Math.floor(Math.random() * ItemList.length)]; + return NewItem; +} + + + +/** + * Checks whether two item colors are equal. An item color may either be a string or an array of strings. + * @param C1 - The first color to check + * @param C2 - The second color to check + * @returns TRUE if C1 and C2 represent the same item color, FALSE otherwise + */ +function CommonColorsEqual(C1: string | string[], C2: string | string[]): boolean { + if (Array.isArray(C1) && Array.isArray(C2)) { + return CommonArraysEqual(C1, C2); + } + return C1 === C2; +} + +/** + * Checks whether two arrays are equal. The arrays are considered equal if they have the same length and contain the same items in the same + * order, as determined by === comparison + * @param a1 - The first array to compare + * @param a2 - The second array to compare + * @returns TRUE if both arrays have the same length and contain the same items in the same order, FALSE otherwise + */ +function CommonArraysEqual(a1: any[], a2: any[]): boolean { + return a1.length === a2.length && a1.every((item, i) => item === a2[i]); +} + + + + +/** + * Takes an array of items and converts it to record format + * @param arr The array of items + * @returns Output in object format + */ +function CommonPackItemArray(arr: {Group: string; Name: string; Type?: string | null}[]): {[group: string]: {[name: string]: string[]}} { + const res = {}; + for (const I of arr) { + let G = res[I.Group]; + if (G === undefined) { + G = res[I.Group] = {}; + } + let A = G[I.Name]; + if (A === undefined) { + A = G[I.Name] = []; + } + const T = I.Type || ""; + if (!A.includes(T)) { + A.push(T); + } + } + return res; +} + +/** + * Takes an record format of items and converts it to array + * @param arr Object defining items + * @return The array of items + */ +function CommonUnpackItemArray(arr: {[group: string]: {[name: string]: string[]}}): {Group: string; Name: string; Type?: string}[] { + const res = []; + for (const G of Object.keys(arr)) { + for (const A of Object.keys(arr[G])) { + for (const T of arr[G][A]) { + res.push({ Group: G, Name: A, Type: T ? T : undefined }); + } + } + } + return res; +} + + +/** + * A simple deep equality check function which checks whether two objects are equal. The function traverses recursively + * into objects and arrays to check for equality. Primitives and simple types are considered equal as defined by `===`. + * @param obj1 - The first object to compare + * @param obj2 - The second object to compare + * @returns TRUE if both objects are equal, up to arbitrarily deeply nested property values, FALSE + * otherwise. + */ +function CommonDeepEqual(obj1: any, obj2: any): boolean { + if (obj1 === obj2) { + return true; + } + + if (obj1 && obj2 && typeof obj1 === "object" && typeof obj2 === "object") { + // If the objects do not share a prototype, they are not equal + if (Object.getPrototypeOf(obj1) !== Object.getPrototypeOf(obj2)) { + return false; + } + + // Get the keys for the objects + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + + // If the objects have different numbers of keys, they are not equal + if (keys1.length !== keys2.length) { + return false; + } + + // Sort the keys + keys1.sort(); + keys2.sort(); + return keys1.every((key, i) => { + // If the keys are different, the objects are not equal + if (key !== keys2[i]) { + return false; + } + // Otherwise, compare the values + return CommonDeepEqual(obj1[key], obj2[key]); + }); + } + + return false; +} + +/** + * Adds all items from the source array to the destination array if they aren't already included + * @param dest - The destination array + * @param src - The source array + * @returns The destination array + */ +function CommonArrayConcatDedupe(dest: T[], src: T[]): T[] { + if (Array.isArray(src) && Array.isArray(dest)) { + for (const item of src) { + if (!dest.includes(item)) dest.push(item); + } + } + return dest; +} + +/** + * Common noop function + */ +function CommonNoop(): void { + // Noop function +} + +/** + * Redirects the address to HTTPS for all production environments, returns the proper heroku server + * @returns Returns the proper server to use in production or test + */ +function CommonGetServer(): string { + if ((location.href.indexOf("bondageprojects") < 0) && (location.href.indexOf("bondage-europe") < 0)) return "https://bc-server-test.herokuapp.com/"; + if (location.protocol !== 'https:') location.replace(`https:${location.href.substring(location.protocol.length)}`); + return "https://bondage-club-server.herokuapp.com/"; +} diff --git a/Scripts/CommonDraw.js b/Scripts/CommonDraw.js deleted file mode 100644 index 49d706395..000000000 --- a/Scripts/CommonDraw.js +++ /dev/null @@ -1,382 +0,0 @@ -"use strict"; - -/** - * Prepares the character's drawing canvases before drawing the character's appearance. - * @param {Character} C - The character to prepare - * @returns {void} - Nothing - */ -function CommonDrawCanvasPrepare(C) { - if (C.Canvas == null) { - C.Canvas = document.createElement("canvas"); - C.Canvas.width = 500; - C.Canvas.height = CanvasDrawHeight; - } else C.Canvas.getContext("2d").clearRect(0, 0, 500, CanvasDrawHeight); - if (C.CanvasBlink == null) { - C.CanvasBlink = document.createElement("canvas"); - C.CanvasBlink.width = 500; - C.CanvasBlink.height = CanvasDrawHeight; - } else C.CanvasBlink.getContext("2d").clearRect(0, 0, 500, CanvasDrawHeight); - - C.MustDraw = true; -} - -/** - * Draws the given character's appearance using the provided drawing callbacks - * @param {Character} C - The character whose appearance to draw - * @param {CommonDrawCallbacks} callbacks - The drawing callbacks to be used - */ -function CommonDrawAppearanceBuild(C, { - clearRect, - clearRectBlink, - drawCanvas, - drawCanvasBlink, - drawImage, - drawImageBlink, - drawImageColorize, - drawImageColorizeBlink, -}) { - const LayerCounts = {}; - - // Loop through all layers in the character appearance - C.AppearanceLayers.forEach((Layer) => { - const A = Layer.Asset; - const AG = A.Group; - const CountKey = AG.Name + "/" + A.Name; - let CA = C.Appearance.find(item => item.Asset === A); - let Property = CA.Property; - - // Count how many layers we've drawn for this asset - LayerCounts[CountKey] = (LayerCounts[CountKey] || 0) + 1; - - // If there's a parent group (parent group of the layer overrides that of the asset, which overrides that of the group) - let ParentGroupName = Layer.ParentGroupName; - if (typeof ParentGroupName === "undefined") ParentGroupName = A.ParentGroupName; - if (typeof ParentGroupName === "undefined") ParentGroupName = AG.ParentGroupName; - let G = ""; - if (ParentGroupName) { - const ParentItem = C.Appearance.find(Item => Item.Asset.Group.Name === ParentGroupName); - if (ParentItem) G = "_" + ParentItem.Asset.Name; - } - - // If there's a pose style we must add (items take priority over groups, layers may override completely) - let Pose = CommonDrawResolveAssetPose(C, A, Layer); - - // Check if we need to draw a different expression (for facial features) - let Expression = ""; - let CurrentExpression = InventoryGetItemProperty(CA, "Expression"); - if (!CurrentExpression && Layer.MirrorExpression) { - const MirroredItem = InventoryGet(C, Layer.MirrorExpression); - CurrentExpression = InventoryGetItemProperty(MirroredItem, "Expression"); - } - if (CurrentExpression) { - const AllowExpression = InventoryGetItemProperty(CA, "AllowExpression", true); - if (CurrentExpression && AllowExpression && AllowExpression.includes(CurrentExpression)) { - Expression = CurrentExpression + "/"; - } - } - - let GroupName = A.DynamicGroupName; - - // Find the X and Y position to draw on - let X = Layer.DrawingLeft != null ? Layer.DrawingLeft : (A.DrawingLeft != null ? A.DrawingLeft : AG.DrawingLeft); - let Y = Layer.DrawingTop != null ? Layer.DrawingTop : (A.DrawingTop != null ? A.DrawingTop : AG.DrawingTop); - if (C.DrawPose && C.DrawPose.length) { - C.DrawPose.forEach(CP => { - const PoseDef = PoseFemale3DCG.find(P => P.Name === CP && P.MovePosition); - if (PoseDef) { - const MovePosition = PoseDef.MovePosition.find(MP => MP.Group === GroupName); - if (MovePosition) { - X += MovePosition.X; - Y += MovePosition.Y; - } - } - }); - } - - // Offset Y to counteract height modifiers for fixed-position assets - let YFixedOffset = 0; - if (A.FixedPosition || Layer.FixedPosition) { - if (C.IsInverted()) { - YFixedOffset = -Y + 1000 - (Y + CharacterAppearanceYOffset(C, C.HeightRatio, true) / C.HeightRatio); - } else { - YFixedOffset = C.HeightModifier + 1000 * (1 - C.HeightRatio) * (1 - C.HeightRatioProportion) / C.HeightRatio; - } - } - Y += YFixedOffset; - - // If we must apply alpha masks to the current image as it is being drawn - Layer.Alpha.forEach(AlphaDef => { - // If no groups are defined and the character's pose matches one of the allowed poses (or no poses are defined) - if ((!AlphaDef.Group || !AlphaDef.Group.length) && - (!AlphaDef.Pose || !Array.isArray(AlphaDef.Pose) || !!CommonDrawFindPose(C, AlphaDef.Pose))) { - AlphaDef.Masks.forEach(rect => { - clearRect(rect[0], rect[1] + CanvasUpperOverflow + YFixedOffset, rect[2], rect[3]); - clearRectBlink(rect[0], rect[1] + CanvasUpperOverflow + YFixedOffset, rect[2], rect[3]); - }); - } - }); - - // Check if we need to draw a different variation (from type property) - const Type = (Property && Property.Type) || ""; - - let L = ""; - let LayerType = Type; - if (Layer.Name) L = "_" + Layer.Name; - if (!Layer.HasType) LayerType = ""; - if (Layer.ModuleType) { - const parsedTypes = Type.split(/([0-9]+)/); - LayerType = Layer.ModuleType.map(key => { - if (!Type) return key + "0"; - const keyIndex = parsedTypes.indexOf(key); - const moduleOption = keyIndex === -1 ? "0" : parsedTypes[keyIndex + 1]; - return Layer.ModuleType + moduleOption; - }).join(""); - } - let Opacity = (Property && typeof Property.Opacity === "number") ? Property.Opacity : Layer.Opacity; - Opacity = Math.min(Layer.MaxOpacity, Math.max(Layer.MinOpacity, Opacity)); - const BlinkExpression = (A.OverrideBlinking ? !AG.DrawingBlink : AG.DrawingBlink) ? "Closed/" : Expression; - /** @type {RectTuple[]} */ - let AlphaMasks = Layer.GroupAlpha - .filter(({ Pose }) => !Pose || !Array.isArray(Pose) || !!CommonDrawFindPose(C, Pose)) - .reduce((Acc, { Masks }) => { - Array.prototype.push.apply(Acc, Masks); - return Acc; - }, []); - - let Color = Array.isArray(CA.Color) ? (CA.Color[Layer.ColorIndex] || AG.ColorSchema[0]) : CA.Color; - - // Fix to legacy appearance data when Hands could be different to BodyUpper - if (GroupName === "Hands") Color = "Default"; - - // If custom default colors are defined and the layer is using - if (Color === "Default" && Property) { - if (Array.isArray(Property.DefaultColor)) { - Color = Property.DefaultColor[Layer.ColorIndex] || "Default"; - } else if (typeof Property.DefaultColor === "string") { - Color = Property.DefaultColor; - } - } - - // Check if we need to copy the color of another asset - const InheritColor = (Color == "Default" ? (Layer.InheritColor || A.InheritColor || AG.InheritColor) : null); - let ColorInherited = false; - if (InheritColor != null) { - const ParentAsset = InventoryGet(C, InheritColor); - if (ParentAsset != null) { - const ParentColor = Array.isArray(ParentAsset.Color) ? ParentAsset.Color[0] : ParentAsset.Color; - Color = CommonDrawColorValid(ParentColor, ParentAsset.Asset.Group) ? ParentColor : "Default"; - ColorInherited = true; - } - } - - - // Before drawing hook, receives all processed data. Any of them can be overriden if returned inside an object. - // CAREFUL! The dynamic function should not contain heavy computations, and should not have any side effects. - // Watch out for object references. - if (A.DynamicBeforeDraw && (!Player.GhostList || Player.GhostList.indexOf(C.MemberNumber) == -1)) { - /** @type {DynamicDrawingData} */ - const DrawingData = { - C, X, Y, CA, GroupName, Color, Opacity, Property, A, G, AG, L, Pose, LayerType, BlinkExpression, - drawCanvas, drawCanvasBlink, AlphaMasks, - PersistentData: () => AnimationPersistentDataGet(C, A), - }; - /** @type {DynamicBeforeDrawOverrides} */ - const OverriddenData = CommonCallFunctionByNameWarn(`Assets${A.Group.Name}${A.Name}BeforeDraw`, DrawingData); - if (typeof OverriddenData === "object") { - for (const key in OverriddenData) { - switch (key) { - case "Property": { - Property = OverriddenData[key]; - break; - } - case "CA": { - CA = OverriddenData[key]; - break; - } - case "GroupName": { - GroupName = OverriddenData[key]; - break; - } - case "Color": { - Color = OverriddenData[key]; - break; - } - case "Opacity": { - Opacity = OverriddenData[key]; - break; - } - case "X": { - X = OverriddenData[key]; - break; - } - case "Y": { - Y = OverriddenData[key]; - break; - } - case "LayerType": { - LayerType = OverriddenData[key]; - break; - } - case "L": { - L = OverriddenData[key]; - break; - } - case "AlphaMasks": { - AlphaMasks = OverriddenData[key]; - break; - } - case "Pose": { - Pose = OverriddenData[key]; - break; - } - } - } - } - } - - // Make any required changes to the color - if (Color === "Default" && A.DefaultColor) { - Color = Array.isArray(A.DefaultColor) ? A.DefaultColor[Layer.ColorIndex] : A.DefaultColor; - } - if (!ColorInherited && !CommonDrawColorValid(Color, AG)) { - Color = "Default"; - } - - // Adjust for the increased canvas size - Y += CanvasUpperOverflow; - AlphaMasks = AlphaMasks.map(([x, y, w, h]) => [x, y + CanvasUpperOverflow + YFixedOffset, w, h]); - - const Rotate = A.FixedPosition && C.IsInverted(); - - const ItemLocked = !!(Property && Property.LockedBy); - - let PoseFolder = typeof Layer.PoseMapping[Pose] === "string" ? Layer.PoseMapping[Pose] : Pose; - if (PoseFolder) PoseFolder += '/'; - if (Layer.HasImage && (!Layer.LockLayer || ItemLocked)) { - /** Check whether the asset requires a custom suffix - * @type {string?} */ - let SuffixName = null; - if ((A.ColorSuffix != null) && (Color != null)) { - SuffixName = (Color.indexOf("#") == 0) ? A.ColorSuffix["HEX_COLOR"] : A.ColorSuffix[Color]; - } - - // Draw the item on the canvas (default or empty means no special color, # means apply a color, regular text means we apply - // that text) - if ((Color != null) && (Color.indexOf("#") == 0) && Layer.AllowColorize) { - const ColorName = (SuffixName != null) ? "_" + SuffixName : "" - - drawImageColorize( - "Assets/" + AG.Family + "/" + GroupName + "/" + PoseFolder + Expression + A.Name + G + LayerType + ColorName + L + ".png", X, Y, - Color, - AG.DrawingFullAlpha, AlphaMasks, Opacity, Rotate - ); - drawImageColorizeBlink( - "Assets/" + AG.Family + "/" + GroupName + "/" + PoseFolder + BlinkExpression + A.Name + G + LayerType + ColorName + L + ".png", X, Y, - Color, AG.DrawingFullAlpha, AlphaMasks, Opacity, Rotate - ); - } else { - let ColorName = ( - (Color == null) - || (Color == "Default") - || (Color == "") - || (Color.length == 1) - || (Color.indexOf("#") == 0) - ) ? "" : "_" + Color; - if (SuffixName != null) { - ColorName = ((SuffixName == "Default") || (SuffixName == "")) ? "" : "_" + SuffixName; - } - - drawImage( - "Assets/" + AG.Family + "/" + GroupName + "/" + PoseFolder + Expression + A.Name + G + LayerType + ColorName + L + ".png", - X, Y, - AlphaMasks, Opacity, Rotate - ); - drawImageBlink( - "Assets/" + AG.Family + "/" + GroupName + "/" + PoseFolder + BlinkExpression + A.Name + G + LayerType + ColorName + L + - ".png", - X, Y, AlphaMasks, Opacity, Rotate - ); - } - } - - // If the item has been locked - if (ItemLocked && A.DrawLocks) { - // How many layers should be drawn for the asset - const DrawableLayerCount = C.AppearanceLayers.filter(AL => AL.Asset === A).length; - - // If we just drew the last drawable layer for this asset, draw the lock too (never colorized) - if (DrawableLayerCount === LayerCounts[CountKey]) { - drawImage( - "Assets/" + AG.Family + "/" + GroupName + "/" + PoseFolder + Expression + A.Name + (A.HasType ? Type : "") + - "_Lock.png", - X, Y, AlphaMasks - ); - drawImageBlink( - "Assets/" + AG.Family + "/" + GroupName + "/" + PoseFolder + BlinkExpression + A.Name + (A.HasType ? Type : "") + - "_Lock.png", X, Y, AlphaMasks); - } - } - - // After drawing hook, receives all processed data. - // CAREFUL! The dynamic function should not contain heavy computations, and should not have any side effects. - // Watch out for object references. - if (A.DynamicAfterDraw && (!Player.GhostList || Player.GhostList.indexOf(C.MemberNumber) == -1)) { - /** @type {DynamicDrawingData} */ - const DrawingData = { - C, X, Y, CA, GroupName, Property, Color, Opacity, A, G, AG, L, Pose, LayerType, BlinkExpression, drawCanvas, drawCanvasBlink, AlphaMasks, - PersistentData: () => AnimationPersistentDataGet(C, A), - }; - CommonCallFunctionByNameWarn(`Assets${A.Group.Name}${A.Name}AfterDraw`, DrawingData); - } - }); -} - -/** - * Determines whether the provided color is valid - * @param {any} Color - The color - * @param {AssetGroup} AssetGroup - The asset group the color is being used fo - * @returns {boolean} - Whether the color is valid - */ -function CommonDrawColorValid(Color, AssetGroup) { - if (Color != null && typeof Color !== "string") { - return false; - } - if (Color != null && Color.indexOf("#") != 0 && AssetGroup.ColorSchema.indexOf(Color) < 0) { - return false; - } - return true; -} - -/** - * Finds the correct pose to draw for drawable layer for the provided character from the provided list of allowed poses - * @param {Character} C - The character to check for poses against - * @param {string[]} AllowedPoses - The list of permitted poses for the current layer - * @return {string} - The name of the pose to draw for the layer, or an empty string if no pose should be drawn - */ -function CommonDrawFindPose(C, AllowedPoses) { - let Pose = ""; - if (AllowedPoses && AllowedPoses.length) { - AllowedPoses.forEach(AllowedPose => { - if (C.DrawPose.includes(AllowedPose)) Pose = AllowedPose; - }); - } - return Pose; -} - -/** - * Finds the pose that should be used when a given asset (and optionally layer) is drawn. - * @param {Character} C - The character whose poses to check - * @param {Asset} A - The asset to check - * @param {AssetLayer} [Layer] - The layer to check (optional) - * @returns {string} - The pose to use when drawing the given asset (or layer) - */ -function CommonDrawResolveAssetPose(C, A, Layer) { - let Pose = ""; - if (C.DrawPose && C.DrawPose.length) { - let AllowPose = Layer && Layer.AllowPose; - if (!Array.isArray(AllowPose)) AllowPose = A.AllowPose; - if (!Array.isArray(AllowPose)) AllowPose = A.Group.AllowPose; - Pose = CommonDrawFindPose(C, AllowPose); - } - return Pose; -} diff --git a/Scripts/ControllerSupport.js b/Scripts/ControllerSupport.js deleted file mode 100644 index 92dadcb4d..000000000 --- a/Scripts/ControllerSupport.js +++ /dev/null @@ -1,795 +0,0 @@ -"use strict"; -/* eslint-disable no-redeclare */ -var ControllerButtonsX = [];//there probably is a way to use just one list, but i don't want to bother and this works anyway -var ControllerButtonsY = []; -var ControllerActive = true; -var ControllerCurrentButton = 0; -var ControllerButtonsRepeat = true; -var ControllerAxesRepeat = false; -var ControllerIgnoreButton = false; -var ControllerAxesRepeatTime = 0; -var ControllerA = 1; -var ControllerB = 0; -var ControllerX = 3; -var ControllerY = 2; -var ControllerTriggerRight = 6; -var ControllerTriggerLeft = 7; -var ControllerStart = 9; -var ControllerSelect = 8; -var ControllerDPadPressLeft = 10; -var ControllerDPadPressRight = 11; -var ControllerStickUpDown = 1; -var ControllerStickLeftRight = 0; -var ControllerStickRight = 1; -var ControllerStickDown = 1; -var ControllerDPadUp = 4; -var ControllerDPadDown = 5; -var ControllerDPadLeft = 6; -var ControllerDPadRight = 7; -var Calibrating = false; -var ControllerStick = false; -var waitasec = false; -var ControllerSensitivity = 5; -var ControllerIgnoreStick = []; -var ControllerDeadZone = 0.01; -var ControllerGameActiveButttons = {}; - -/** - *removes all buttons from the lists - */ -function ClearButtons() { - ControllerButtonsX = []; - ControllerButtonsY = []; -} -/** - * adds a button to the lists - * @param {any} X X value of the button - * @param {any} Y Y value of the button - */ -function setButton(X, Y) { - if (ControllerIgnoreButton == false) { - X += 10; - Y += 10; - if (!ButtonExists(X, Y)) { - ControllerButtonsX.push(X); - ControllerButtonsY.push(Y); - } - } -} -/** - * checks, wether a button is already in the lists (i realise now, that i could have used .includes but it works) - * @param {any} X X value of the button - * @param {any} Y Y value of the button - */ -function ButtonExists(X, Y) { - var g = 0; - var ButtonExists = false; - while (g < ControllerButtonsX.length) { - if (ControllerButtonsX[g] == X && ControllerButtonsY[g] == Y) { - ButtonExists = true; - } - g += 1; - } - return ButtonExists; -} - -/** - * handles the sitck input - * @param {any} axes the raw data of all axes of the controller - */ -function ControllerAxis(axes) { - - // Bondage Brawls handles it's own controls - if ((CurrentScreen == "Platform") || (CurrentScreen == "PlatformDialog")) return; - - //if a value is over 1, it is from a d-pad (some d-pads register as buttons, some d-pads register like this) - var g = 0; - while (g < axes.length) { - if (Math.abs(axes[g]) > 1 && ControllerIgnoreStick.includes(g) == false) { - ControllerIgnoreStick.push(g); - } - g += 1; - } - if (Calibrating == false) { - var g = 0; - while (g < axes.length && ControllerStick == false) { - if (Math.abs(axes[g]) > 0.1 && ControllerIgnoreStick.includes(g) == false) { - ControllerStick = true; - } - g += 1; - } - if (ControllerStick == true && ControllerActive == true) { - if (Math.abs(axes[ControllerStickUpDown]) > ControllerDeadZone) { - MouseY += axes[ControllerStickUpDown] * ControllerStickDown * ControllerSensitivity; - } - if (Math.abs(axes[ControllerStickLeftRight]) > ControllerDeadZone) { - MouseX += axes[ControllerStickLeftRight] * ControllerStickRight * ControllerSensitivity; - } - if (MouseX < 0) { - MouseX = 0; - } - if (MouseX > 2000) { - MouseX = 2000; - } - if (MouseY < 0) { - MouseY = 0; - } - if (MouseY > 1000) { - MouseY = 1000; - } - - } - } - if (Calibrating == true) { - if (PreferenceCalibrationStage == 101) { - var g = 0; - var f = false; - while (g < axes.length && f == false) { - if (Math.abs(axes[g]) > 0.8 && ControllerIgnoreStick.includes(g) == false) { - ControllerStickUpDown = g; - Player.ControllerSettings.ControllerStickUpDown = g; - if (axes[g] > 0) { - ControllerStickDown = -1; - Player.ControllerSettings.ControllerStickDown = -1; - } - if (axes[g] < 0) { - ControllerStickDown = 1; - Player.ControllerSettings.ControllerStickDown = 1; - } - waitasec = true; - PreferenceCalibrationStage = 102; - f = true; - } - g += 1; - } - } - if (PreferenceCalibrationStage == 102) { - if (waitasec == true) { - var g = 0; - var f = false; - while (g < axes.length) { - if (Math.abs(axes[g]) > 0.1 && ControllerIgnoreStick.includes(g) == false) { - f = true; - } - g += 1; - } - if (f == false) { - waitasec = false; - } - } - if (waitasec == false) { - var g = 0; - var f = false; - while (g < axes.length && f == false) { - if (Math.abs(axes[g]) > 0.8 && ControllerIgnoreStick.includes(g) == false) { - ControllerStickLeftRight = g; - Player.ControllerSettings.ControllerStickLeftRight = g; - if (axes[g] > 0) { - ControllerStickRight = 1; - Player.ControllerSettings.ControllerStickRight = 1; - } - if (axes[g] < 0) { - ControllerStickRight = -1; - Player.ControllerSettings.ControllerStickRight = -1; - } - PreferenceCalibrationStage = 0; - Calibrating = false; - f = true; - } - g += 1; - } - } - } - } -} - -/** - * Returns TRUE if current screen is a game that handles the controller, sends the input to that screen - * @param {any} Buttons - The raw button data - * @return {boolean} - */ -function ControllerManagedByGame(Buttons) { - - // Make sure the active buttons are valid - if (ControllerGameActiveButttons.A == null) ControllerGameActiveButttons.A = false; - if (ControllerGameActiveButttons.B == null) ControllerGameActiveButttons.B = false; - if (ControllerGameActiveButttons.X == null) ControllerGameActiveButttons.X = false; - if (ControllerGameActiveButttons.Y == null) ControllerGameActiveButttons.Y = false; - if (ControllerGameActiveButttons.DOWN == null) ControllerGameActiveButttons.DOWN = false; - if (ControllerGameActiveButttons.UP == null) ControllerGameActiveButttons.UP = false; - if (ControllerGameActiveButttons.LEFT == null) ControllerGameActiveButttons.LEFT = false; - if (ControllerGameActiveButttons.RIGHT == null) ControllerGameActiveButttons.RIGHT = false; - - // If the screen manages the controller, we call it - let Managed = false; - if (CurrentScreen == "PlatformDialog") Managed = PlatformDialogController(Buttons); - if (CurrentScreen == "Platform") Managed = PlatformController(Buttons); - - // If managed, we flag the active buttons not to repeat them - if (Managed == true) { - ControllerGameActiveButttons.A = Buttons[ControllerA].pressed; - ControllerGameActiveButttons.B = Buttons[ControllerB].pressed; - ControllerGameActiveButttons.X = Buttons[ControllerX].pressed; - ControllerGameActiveButttons.Y = Buttons[ControllerY].pressed; - ControllerGameActiveButttons.TLEFT = Buttons[ControllerTriggerLeft].pressed; - ControllerGameActiveButttons.TRIGHT = Buttons[ControllerTriggerRight].pressed; - ControllerGameActiveButttons.DOWN = Buttons[ControllerDPadDown].pressed; - ControllerGameActiveButttons.UP = Buttons[ControllerDPadUp].pressed; - ControllerGameActiveButttons.LEFT = Buttons[ControllerDPadLeft].pressed; - ControllerGameActiveButttons.RIGHT = Buttons[ControllerDPadRight].pressed; - } - - // TRUE if the screen managed the controller - return Managed; - -} - -/** - * handles button input - * @param {any} buttons raw buttons data - */ -function ControllerButton(buttons) { - if (ControllerActive == true) { - - //makes sure that no value is undefined - if (buttons[ControllerA] == undefined) { - ControllerA = 1; - } - if (buttons[ControllerB] == undefined) { - ControllerB = 0; - } - if (buttons[ControllerX] == undefined) { - ControllerX = 3; - } - if (buttons[ControllerY] == undefined) { - ControllerY = 2; - } - if (buttons[ControllerStickUpDown] == undefined) { - ControllerStickUpDown = 1; - } - if (buttons[ControllerStickLeftRight] == undefined) { - ControllerStickLeftRight = 0; - } - if (buttons[ControllerStickRight] == undefined) { - ControllerStickRight = 1; - } - if (buttons[ControllerStickDown] == undefined) { - ControllerStickDown = 1; - } - if (buttons[ControllerDPadUp] == undefined) { - ControllerDPadUp = 4; - } - if (buttons[ControllerDPadDown] == undefined) { - ControllerDPadDown = 5; - } - if (buttons[ControllerDPadLeft] == undefined) { - ControllerDPadLeft = 6; - } - if (buttons[ControllerDPadRight] == undefined) { - ControllerDPadRight = 7; - } - - // If a game intercepts the controller inputs - if (ControllerManagedByGame(buttons)) return; - - if (ControllerButtonsRepeat == false) { - if (Calibrating == false) { - if (buttons[ControllerA].pressed == true) { - ControllerClick(); - ControllerButtonsRepeat = true; - } - - if (buttons[ControllerB].pressed == true) { - if (CurrentScreenFunctions.Exit) { - CurrentScreenFunctions.Exit(); - } else if ((CurrentCharacter != null) && Array.isArray(DialogMenuButton) && (DialogMenuButton.indexOf("Exit") >= 0)) { - if (!DialogLeaveFocusItem()) - DialogLeaveItemMenu(); - } else if ((CurrentCharacter != null) && (CurrentScreen == "ChatRoom")) { - DialogLeave(); - } else if ((CurrentCharacter == null) && (CurrentScreen == "ChatRoom") && (document.getElementById("TextAreaChatLog") != null)) { - ElementScrollToEnd("TextAreaChatLog"); - } - ControllerButtonsRepeat = true; - } - - if (buttons[ControllerX].pressed == true) { - KeyPress = 65; - StruggleKeyDown(); - ControllerButtonsRepeat = true; - } - - if (buttons[ControllerY].pressed == true) { - KeyPress = 97; - StruggleKeyDown(); - ControllerButtonsRepeat = true; - } - - if (buttons[ControllerDPadUp].pressed == true) { - ControllerStick = true; - ControllerUp(); - ControllerButtonsRepeat = true; - } - if (buttons[ControllerDPadDown].pressed == true) { - ControllerStick = true; - ControllerDown(); - ControllerButtonsRepeat = true; - } - if (buttons[ControllerDPadLeft].pressed == true) { - ControllerStick = true; - ControllerLeft(); - ControllerButtonsRepeat = true; - } - if (buttons[ControllerDPadRight].pressed == true) { - ControllerStick = true; - ControllerRight(); - ControllerButtonsRepeat = true; - } - } - if (ControllerButtonsRepeat == false) { - if (Calibrating == true) { - if (ControllerButtonsRepeat == false) { - if (PreferenceCalibrationStage == 1) { - var g = 0; - var h = false; - while (g < buttons.length && h == false) { - if (buttons[g].pressed == true) { - ControllerA = g; - Player.ControllerSettings.ControllerA = g; - h = true; - PreferenceCalibrationStage = 2; - ControllerButtonsRepeat = true; - } - g += 1; - } - } - } - - if (ControllerButtonsRepeat == false) { - if (PreferenceCalibrationStage == 2) { - var g = 0; - var h = false; - while (g < buttons.length && h == false) { - if (buttons[g].pressed == true) { - ControllerB = g; - Player.ControllerSettings.ControllerB = g; - h = true; - PreferenceCalibrationStage = 3; - ControllerButtonsRepeat = true; - } - g += 1; - } - } - } - if (ControllerButtonsRepeat == false) { - if (PreferenceCalibrationStage == 3) { - var g = 0; - var h = false; - while (g < buttons.length && h == false) { - if (buttons[g].pressed == true) { - ControllerX = g; - Player.ControllerSettings.ControllerX = g; - h = true; - PreferenceCalibrationStage = 4; - ControllerButtonsRepeat = true; - } - g += 1; - } - } - } - if (ControllerButtonsRepeat == false) { - if (PreferenceCalibrationStage == 4) { - var g = 0; - var h = false; - while (g < buttons.length && h == false) { - if (buttons[g].pressed == true) { - ControllerY = g; - Player.ControllerSettings.ControllerY = g; - h = true; - PreferenceCalibrationStage = 5; - ControllerButtonsRepeat = true; - } - g += 1; - } - } - } - if (ControllerButtonsRepeat == false) { - if (PreferenceCalibrationStage == 5) { - var g = 0; - var h = false; - while (g < buttons.length && h == false) { - if (buttons[g].pressed == true) { - ControllerDPadUp = g; - Player.ControllerSettings.ControllerDPadUp = g; - h = true; - PreferenceCalibrationStage = 6; - ControllerButtonsRepeat = true; - } - g += 1; - } - } - } - if (ControllerButtonsRepeat == false) { - if (PreferenceCalibrationStage == 6) { - var g = 0; - var h = false; - while (g < buttons.length && h == false) { - if (buttons[g].pressed == true) { - ControllerDPadDown = g; - Player.ControllerSettings.ControllerDPadDown = g; - h = true; - PreferenceCalibrationStage = 7; - ControllerButtonsRepeat = true; - } - g += 1; - } - } - } - if (ControllerButtonsRepeat == false) { - if (PreferenceCalibrationStage == 7) { - var g = 0; - var h = false; - while (g < buttons.length && h == false) { - if (buttons[g].pressed == true) { - ControllerDPadLeft = g; - Player.ControllerSettings.ControllerDPadLeft = g; - h = true; - PreferenceCalibrationStage = 8; - ControllerButtonsRepeat = true; - } - g += 1; - } - } - } - if (ControllerButtonsRepeat == false) { - if (PreferenceCalibrationStage == 8) { - var g = 0; - var h = false; - while (g < buttons.length && h == false) { - if (buttons[g].pressed == true) { - ControllerDPadRight = g; - Player.ControllerSettings.ControllerDPadRight = g; - h = true; - PreferenceCalibrationStage = 0; - Calibrating = false; - ControllerButtonsRepeat = true; - } - g += 1; - } - } - } - } - } - } - - - if (ControllerButtonsRepeat == true) { - var g = 0; - var h = false; - while (g < buttons.length && h == false) { - if (buttons[g].pressed == true) { - h = true; - } - g += 1 - } - if (h == false) { - ControllerButtonsRepeat = false; - } - } - } -} - - -//uncomment to test it with keyboard -/** - * handles keyboard inputs in controller mode - * @returns {void} Nothing - */ -function ControllerSupportKeyDown() { - /*i*/// if (KeyPress == 105) ControllerUp(); - /*k*/// if (KeyPress == 107) ControllerDown(); - /*j*/// if (KeyPress == 106) ControllerLeft(); - /*l*/// if (KeyPress == 108) ControllerRight(); - /*space*///if (KeyPress == 32) ControllerClick(); -} -/** - * A -> Click - */ -function ControllerClick() { - if (ControllerActive == true) { - if (ControllerStick == false) { - MouseX = ControllerButtonsX[ControllerCurrentButton]; - MouseY = ControllerButtonsY[ControllerCurrentButton]; - } - CommonClick(null); - } -} -/** - * moves the pointer to either a button in a straight line above it or the closest one above - * (all the commented stuff in the function is for debugging) - */ -function ControllerUp() { - MouseX = ControllerButtonsX[ControllerCurrentButton]; - MouseY = ControllerButtonsY[ControllerCurrentButton]; - // console.log("starting search"); - if (ControllerCurrentButton > ControllerButtonsX.length) ControllerCurrentButton = 0; - var CurrentY = ControllerButtonsY[ControllerCurrentButton]; - var CurrentX = ControllerButtonsX[ControllerCurrentButton]; - var found = false; - while (CurrentY > 0 && found == false) { - CurrentY -= 1; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - } - if (found == false) { - // console.log("round 2"); - var CurrentY = ControllerButtonsY[ControllerCurrentButton]; - var CurrentX = ControllerButtonsX[ControllerCurrentButton]; - var CurrentXX = ControllerButtonsX[ControllerCurrentButton]; - while (CurrentY > 0 && found == false) { - CurrentY -= 1; - var OffsetX = 0; - while (OffsetX < 2000 && found == false) { - OffsetX += 1; - CurrentX = CurrentXX + OffsetX; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - CurrentX = CurrentXX - OffsetX; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - //console.log(OffsetX); - } - //console.log("searching round 2 Y=" + CurrentY); - //console.log("searching round 2 MouseX, MouseY=" + MouseX + ", " + MouseY); - } - } - if (found == false) { - // console.log("not found"); - } -} -/** - * same as ControllerUp() - */ -function ControllerDown() { - MouseX = ControllerButtonsX[ControllerCurrentButton]; - MouseY = ControllerButtonsY[ControllerCurrentButton]; - // console.log("starting search"); - if (ControllerCurrentButton > ControllerButtonsX.length) ControllerCurrentButton = 0; - var CurrentY = ControllerButtonsY[ControllerCurrentButton]; - var CurrentX = ControllerButtonsX[ControllerCurrentButton]; - var found = false; - while (CurrentY < 1000 && found == false) { - CurrentY += 1; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - } - if (CurrentY >= 1000 && found == false) { - // console.log("round 2"); - var CurrentY = ControllerButtonsY[ControllerCurrentButton]; - var CurrentX = ControllerButtonsX[ControllerCurrentButton]; - var CurrentXX = ControllerButtonsX[ControllerCurrentButton]; - while (CurrentY < 1000 && found == false) { - CurrentY += 1; - var OffsetX = 0; - while (OffsetX < 2000 && found == false) { - OffsetX += 1; - CurrentX = CurrentXX + OffsetX; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - CurrentX = CurrentXX - OffsetX; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - //console.log(OffsetX); - } - //console.log("searching round 2 Y=" + CurrentY); - //console.log("searching round 2 MouseX, MouseY=" + MouseX + ", " + MouseY); - } - } - if (found == false) { - // console.log("not found"); - } -} -/** - * same as ControllerUp() - */ -function ControllerLeft() { - MouseX = ControllerButtonsX[ControllerCurrentButton]; - MouseY = ControllerButtonsY[ControllerCurrentButton]; - // console.log("starting search"); - if (ControllerCurrentButton > ControllerButtonsX.length) ControllerCurrentButton = 0; - var CurrentY = ControllerButtonsY[ControllerCurrentButton]; - var CurrentX = ControllerButtonsX[ControllerCurrentButton]; - var found = false; - while (CurrentX > 0 && found == false) { - CurrentX -= 1; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - } - if (found == false) { - // console.log("round 2"); - var CurrentY = ControllerButtonsY[ControllerCurrentButton]; - var CurrentX = ControllerButtonsX[ControllerCurrentButton]; - var CurrentYY = ControllerButtonsY[ControllerCurrentButton]; - while (CurrentX > 0 && found == false) { - CurrentX -= 1; - var OffsetY = 0; - while (OffsetY < 1000 && found == false) { - OffsetY += 1; - CurrentY = CurrentYY + OffsetY; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - CurrentY = CurrentYY - OffsetY; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - //console.log(OffsetX); - } - //console.log("searching round 2 Y=" + CurrentY); - //console.log("searching round 2 MouseX, MouseY=" + MouseX + ", " + MouseY); - } - } - if (found == false) { - // console.log("not found"); - } -} -/** - * same as ControllerUp() - */ -function ControllerRight() { - MouseX = ControllerButtonsX[ControllerCurrentButton]; - MouseY = ControllerButtonsY[ControllerCurrentButton]; - // console.log("starting search"); - if (ControllerCurrentButton > ControllerButtonsX.length) ControllerCurrentButton = 0; - var CurrentY = ControllerButtonsY[ControllerCurrentButton]; - var CurrentX = ControllerButtonsX[ControllerCurrentButton]; - var found = false; - while (CurrentX <= 2000 && found == false) { - CurrentX += 1; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - } - if (found == false) { - // console.log("round 2"); - var CurrentY = ControllerButtonsY[ControllerCurrentButton]; - var CurrentX = ControllerButtonsX[ControllerCurrentButton]; - var CurrentYY = ControllerButtonsY[ControllerCurrentButton]; - while (CurrentX < 2000 && found == false) { - CurrentX += 1; - var OffsetY = 0; - while (OffsetY < 1000 && found == false) { - OffsetY += 1; - CurrentY = CurrentYY + OffsetY; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - CurrentY = CurrentYY - OffsetY; - var f = 0; - while (f < ControllerButtonsX.length && found == false) { - if (CurrentY == ControllerButtonsY[f] && CurrentX == ControllerButtonsX[f]) { - found = true; - MouseX = CurrentX; - MouseY = CurrentY; - ControllerCurrentButton = f; - //console.log("found at X=" + CurrentX + ", Y=" + CurrentY); - } - f += 1; - //console.log("searching: " + CurrentY + " " + CurrentX); //debug - } - //console.log(OffsetX); - } - //console.log("searching round 2 Y=" + CurrentY); - //console.log("searching round 2 MouseX, MouseY=" + MouseX + ", " + MouseY); - } - } - if (found == false) { - // console.log("not found"); - } -} diff --git a/Scripts/Drawing.js b/Scripts/Drawing.js deleted file mode 100644 index e3d80d3b3..000000000 --- a/Scripts/Drawing.js +++ /dev/null @@ -1,1449 +0,0 @@ -"use strict"; -/** - * The main game canvas where everything will be drawn - * @type {CanvasRenderingContext2D} - */ -let MainCanvas; -/** @type {CanvasRenderingContext2D} */ -let TempCanvas; -/** @type {CanvasRenderingContext2D} */ -let ColorCanvas; -/** @type {CanvasRenderingContext2D} */ -let CharacterCanvas; -var DialogLeaveDueToItem = false; - -var BlindFlash = false; -var DrawingBlindFlashTimer = 0; - -// A bank of all the chached images -/** @type {Map} */ -const DrawCacheImage = new Map; -let DrawCacheLoadedImages = 0; -let DrawCacheTotalImages = 0; - -// Last dark factor for blindflash -var DrawLastDarkFactor = 0; - -/** - * A list of the characters that are drawn every frame - * @type {Character[]} - */ -var DrawLastCharacters = []; - -/** - * A list of elements to draw at the end of the drawing process. - * Mostly used for hovering button labels. - * @type {Function[]} - */ -var DrawHoverElements = []; - -/** - * The last canvas position in format `[left, top, width, height]` - */ -var DrawCanvasPosition = [0, 0, 0, 0]; - -/** - * Converts a hex color string to a RGB color - * @param {string} color - Hex color to conver - * @returns {RGBColor} - RGB color - */ -function DrawHexToRGB(color) { - const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; - color = color.replace(shorthandRegex, function (m, r, g, b) { - return r + r + g + g + b + b; - }); - - const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color); - return result ? { - r: parseInt(result[1], 16), - g: parseInt(result[2], 16), - b: parseInt(result[3], 16) - } : { - r: 0, - g: 0, - b: 0 - }; -} - -/** - * Converts a RGB color to a hex color string - * @param {number[]} color - RGB color to conver - * @returns {string} - Hex color string - */ -function DrawRGBToHex(color) { - const rgb = color[2] | (color[1] << 8) | (color[0] << 16); - return '#' + (0x1000000 + rgb).toString(16).slice(1).toUpperCase(); -} - -/** - * Loads the canvas to draw on with its style and event listeners. - * @returns {void} - Nothing - */ -function DrawLoad() { - - // Creates the objects used in the game - MainCanvas = /** @type {HTMLCanvasElement} */ (document.getElementById("MainCanvas")).getContext("2d"); - TempCanvas = document.createElement("canvas").getContext("2d"); - ColorCanvas = document.createElement("canvas").getContext("2d"); - CharacterCanvas = document.createElement("canvas").getContext("2d"); - CharacterCanvas.canvas.width = 500; - CharacterCanvas.canvas.height = CanvasDrawHeight; - document.getElementById("MainCanvas").addEventListener("keypress", KeyDown); - document.getElementById("MainCanvas").tabIndex = 1000; - document.addEventListener("keydown", DocumentKeyDown); - - // Font is fixed for now, color can be set - MainCanvas.font = CommonGetFont(36); - MainCanvas.textAlign = "center"; - MainCanvas.textBaseline = "middle"; - -} - -/** - * Returns the image file from cache or build it from the source - * @param {string} Source - URL of the image - * @returns {HTMLImageElement} - Image file - */ -function DrawGetImage(Source) { - // Search in the cache to find the image and make sure this image is valid - let Img = DrawCacheImage.get(Source); - if (!Img) { - Img = new Image; - DrawCacheImage.set(Source, Img); - // Keep track of image load state - const IsAsset = (Source.indexOf("Assets") >= 0); - if (IsAsset) { - ++DrawCacheTotalImages; - Img.addEventListener("load", function () { - DrawGetImageOnLoad(); - }); - } - - Img.addEventListener("error", function () { - DrawGetImageOnError(Img, IsAsset); - }); - - // Start loading - Img.src = KDModFiles[Source] || Source; - } - - // returns the final image - return Img; -} - -/** - * Reloads all character canvas once all images are loaded - * @returns {void} - Nothing - */ -function DrawGetImageOnLoad() { - ++DrawCacheLoadedImages; - if (DrawCacheLoadedImages == DrawCacheTotalImages) CharacterLoadCanvasAll(); -} - -/** - * Attempts to redownload an image if it previously failed to load - * @param {HTMLImageElement & { errorcount?: number }} Img - Image tag that failed to load - * @param {boolean} IsAsset - Whether or not the image is part of an asset - * @returns {void} - Nothing - */ -function DrawGetImageOnError(Img, IsAsset) { - if (Img.errorcount == null) Img.errorcount = 0; - Img.errorcount += 1; - if (Img.errorcount < 3) { - // eslint-disable-next-line no-self-assign - Img.src = Img.src; - } else { - // Load failed. Display the error in the console and mark it as done. - console.log("Error loading image " + Img.src); - if (IsAsset) DrawGetImageOnLoad(); - } -} - -/** - * Draws the glow under the arousal meter under the screen - * @param {number} X - Position of the meter on the X axis - * @param {number} Y - Position of the meter on the Y axis - * @param {number} Zoom - Zoom factor - * @param {number} Level - Current vibration level on a scale of 0 to 4. Must be INTEGER - * @param {boolean} Animated - Whether or not animations should be played - * @param {boolean} Orgasm - Whether or not the meter is in recover from orgasm mode - * @returns {void} - Nothing - */ -function DrawArousalGlow(X, Y, Zoom, Level, Animated, AnimFactor, Orgasm) { - -} - - -/** - * Draws the arousal meter on screen - * @param {number} X - Position of the meter on the X axis - * @param {number} Y - Position of the meter on the Y axis - * @param {number} Zoom - Zoom factor - * @param {number} Progress - Current progress of the arousal meter - * @param {boolean} Automatic - Wheter or not the arousal is in automatic mode - * @param {boolean} Orgasm - Whether or not the meter is in recover from orgasm mode - * @returns {void} - Nothing - */ -function DrawArousalThermometer(X, Y, Zoom, Progress, Automatic, Orgasm) { - -} - -/** - * Draw the arousal meter next to the player if it is allowed by the character and visible for the player - * @param {Character} C - Character for which to potentially draw the arousal meter - * @param {number} X - Position of the meter on the X axis - * @param {number} Y - Position of the meter on the Y axis - * @param {number} Zoom - Zoom factor - * @returns {void} - Nothing - */ -function DrawArousalMeter(C, X, Y, Zoom) { - -} - -/** - * Refreshes the character if not all images are loaded and draw the character canvas on the main game screen - * @param {Character} C - Character to draw - * @param {number} X - Position of the character on the X axis - * @param {number} Y - Position of the character on the Y axis - * @param {number} Zoom - Zoom factor - * @param {boolean} [IsHeightResizeAllowed=true] - Whether or not the settings allow for the height modifier to be applied - * @param {CanvasRenderingContext2D} [DrawCanvas] - The canvas to draw to; If undefined `MainCanvas` is used - * @returns {void} - Nothing - */ -function DrawCharacter(C, X, Y, Zoom, IsHeightResizeAllowed, DrawCanvas) { - // Record that the character was drawn this frame - DrawLastCharacters.push(C); - - if (!DrawCanvas) DrawCanvas = MainCanvas; - - var OverrideDark = CurrentModule == "MiniGame" || ((Player.Effect.includes("VRAvatars") && C.Effect.includes("VRAvatars"))) || CurrentScreen == "InformationSheet"; - - if ((C != null) && ((C.ID == 0) || (OverrideDark || Player.GetBlindLevel() < 3 ))) { - - CharacterCheckHooks(C, CurrentCharacter != null); - - if (ControllerActive == true) { - setButton(X + 100, Y + 200); - } - - // If there's a fixed image to draw instead of the character - if (C.FixedImage != null) { - DrawImageZoomCanvas(C.FixedImage, DrawCanvas, 0, 0, 500, 1000, X, Y, 500 * Zoom, 1000 * Zoom); - return; - } - - // Run any existing asset scripts - if (C.RunScripts && C.HasScriptedAssets) { - const DynamicAssets = C.Appearance.filter(CA => CA.Asset.DynamicScriptDraw); - DynamicAssets.forEach(Item => - CommonCallFunctionByNameWarn(`Assets${Item.Asset.Group.Name}${Item.Asset.Name}ScriptDraw`, { - C, Item, PersistentData: () => AnimationPersistentDataGet(C, Item.Asset) - }) - ); - - // If we must rebuild the canvas due to an animation - const refreshTimeKey = AnimationGetDynamicDataName(C, AnimationDataTypes.RefreshTime); - const refreshRateKey = AnimationGetDynamicDataName(C, AnimationDataTypes.RefreshRate); - const buildKey = AnimationGetDynamicDataName(C, AnimationDataTypes.Rebuild); - const lastRefresh = AnimationPersistentStorage[refreshTimeKey] || 0; - const refreshRate = AnimationPersistentStorage[refreshRateKey] == null ? 60000 : AnimationPersistentStorage[refreshRateKey]; - if (refreshRate + lastRefresh < CommonTime() && AnimationPersistentStorage[buildKey]) { - CharacterRefresh(C, false); - AnimationPersistentStorage[buildKey] = false; - AnimationPersistentStorage[refreshTimeKey] = CommonTime(); - } - } - - // There's 2 different canvas, one blinking and one that doesn't - let Canvas = (Math.round(CurrentTime / 400) % C.BlinkFactor == 0 && !CommonPhotoMode) ? C.CanvasBlink : C.Canvas; - - // If we must dark the Canvas characters - if ((C.ID != 0) && !OverrideDark && (Player.IsBlind() || Player.HasTints())) { - - CharacterCanvas.globalCompositeOperation = "copy"; - CharacterCanvas.drawImage(Canvas, 0, 0); - // Overlay black rectangle. - CharacterCanvas.globalCompositeOperation = "source-atop"; - - if (Player.IsBlind()) { - const DarkFactor = Math.min(CharacterGetDarkFactor(Player) * 2, 1); - CharacterCanvas.fillStyle = `rgba(0,0,0,${1.0 - DarkFactor})`; - CharacterCanvas.fillRect(0, 0, Canvas.width, Canvas.height); - } - - const Tints = Player.GetTints(); - for (const {r, g, b, a} of Tints) { - CharacterCanvas.fillStyle = `rgba(${r},${g},${b},${a})`; - CharacterCanvas.fillRect(0, 0, Canvas.width, Canvas.height); - } - - Canvas = CharacterCanvas.canvas; - } - - // If we must flip the canvas vertically - const IsInverted = (CurrentScreen != "KinkyDungeon") ? CharacterAppearsInverted(C) : false; - - // Get the height ratio and X & Y offsets based on it - const HeightRatio = (IsHeightResizeAllowed == null || IsHeightResizeAllowed == true) ? C.HeightRatio : 1; - const XOffset = CharacterAppearanceXOffset(C, HeightRatio); - const YOffset = CharacterAppearanceYOffset(C, HeightRatio); - - // Calculate the vertical parameters. In certain cases, cut off anything above the Y value. - const YCutOff = YOffset >= 0 || CurrentScreen == "ChatRoom"; - const YStart = CanvasUpperOverflow + (YCutOff ? -YOffset / HeightRatio : 0); - const SourceHeight = 1000 / HeightRatio + (YCutOff ? 0 : -YOffset / HeightRatio); - const DestY = (IsInverted || YCutOff) ? 0 : YOffset; - - // Apply blur filter if needed - const BlurLevel = Player.GetBlurLevel(); - if (!C.IsPlayer() && !OverrideDark && BlurLevel > 0) { - MainCanvas.filter = `blur(${BlurLevel}px)`; - } - // Draw the character - DrawImageEx(Canvas, X + XOffset * Zoom, Y + DestY * Zoom, { - Canvas: DrawCanvas, - SourcePos: [0, YStart, Canvas.width, SourceHeight], - Width: 500 * HeightRatio * Zoom, - Height: (1000 - DestY) * Zoom, - Invert: IsInverted, - Mirror: IsInverted - }); - MainCanvas.filter = 'none'; - - // Draws the character focus zones if we need too - if ((C.FocusGroup != null) && (C.FocusGroup.Zone != null) && (CurrentScreen != "Preference") && (DialogColor == null)) { - - // Draw all the possible zones in transparent colors (gray if free, yellow if occupied, red if blocker) - for (let A = 0; A < AssetGroup.length; A++) - if (AssetGroup[A].Zone != null && AssetGroup[A].Name != C.FocusGroup.Name) { - let Color = "#80808040"; - if (InventoryGroupIsBlocked(C, AssetGroup[A].Name)) Color = "#88000580"; - else if (InventoryGet(C, AssetGroup[A].Name) != null) Color = "#D5A30080"; - DrawAssetGroupZone(C, AssetGroup[A].Zone, Zoom, X, Y, HeightRatio, Color, 5); - } - - // Draw the focused zone in cyan - DrawAssetGroupZone(C, C.FocusGroup.Zone, Zoom, X, Y, HeightRatio, "cyan"); - } - } -} - -/** - * Draws an asset group zone outline over the character - * @param {Character} C - Character for which to draw the zone - * @param {number[][]} Zone - Zone to be drawn - * @param {number} Zoom - Height ratio of the character - * @param {number} X - Position of the character on the X axis - * @param {number} Y - Position of the character on the Y axis - * @param {number} HeightRatio - The displayed height ratio of the character - * @param {string} Color - Color of the zone outline - * @param {number} [Thickness=3] - Thickness of the outline - * @param {string} FillColor - If non-empty, the color to fill the rectangle with - * @returns {void} - Nothing - */ -function DrawAssetGroupZone(C, Zone, Zoom, X, Y, HeightRatio, Color, Thickness = 3, FillColor = undefined) { - -} - -/** - * Return a semi-transparent copy of a canvas - * @param {HTMLCanvasElement} Canvas - source - * @param {number} [Alpha] - transparency between 0-1 - * @returns {HTMLCanvasElement} - result - */ -function DrawAlpha(Canvas, Alpha) { - // If there's nothing to do simply return the original image - if ((Alpha == null) || (Alpha >= 1.0)) return Canvas; - // Copy the image to the temp canvas - TempCanvas.canvas.width = Canvas.width; - TempCanvas.canvas.height = Canvas.height; - TempCanvas.globalCompositeOperation = "copy"; - TempCanvas.drawImage(Canvas, 0, 0); - // Apply the alpha - TempCanvas.globalCompositeOperation = "destination-in"; - TempCanvas.fillStyle = "rgba(0,0,0," + Alpha + ")"; - TempCanvas.fillRect(0, 0, Canvas.width, Canvas.height); - return TempCanvas.canvas; -} - -/** - * Draws a zoomed image from a source to a specific canvas - * @param {string} Source - URL of the image - * @param {CanvasRenderingContext2D} Canvas - Canvas on which to draw the image - * @param {number} SX - The X coordinate where to start clipping - * @param {number} SY - The Y coordinate where to start clipping - * @param {number} SWidth - The width of the clipped image - * @param {number} SHeight - The height of the clipped image - * @param {number} X - Position of the image on the X axis - * @param {number} Y - Position of the image on the Y axis - * @param {number} Width - Width of the image - * @param {number} Height - Height of the image - * @param {boolean} [Invert] - Flips the image vertically - * @returns {boolean} - whether the image was complete or not - */ -function DrawImageZoomCanvas(Source, Canvas, SX, SY, SWidth, SHeight, X, Y, Width, Height, Invert) { - return DrawImageEx(Source, X, Y, { - Canvas, - SourcePos: [SX, SY, SWidth, SHeight], - Width, - Height, - Invert - }); -} - -/** - * Draws a resized image from a source to the main canvas - * @param {string} Source - URL of the image - * @param {number} X - Position of the image on the X axis - * @param {number} Y - Position of the image on the Y axis - * @param {number} Width - Width of the image after being resized - * @param {number} Height - Height of the image after being resized - * @returns {boolean} - whether the image was complete or not - */ -function DrawImageResize(Source, X, Y, Width, Height) { - return DrawImageEx(Source, X, Y, { Width, Height }); -} - -/** - * Draws a zoomed image from a source to a specific canvas - * @param {string} Source - URL of the image - * @param {CanvasRenderingContext2D} Canvas - Canvas on which to draw the image - * @param {number} X - Position of the image on the X axis - * @param {number} Y - Position of the image on the Y axis - * @param {RectTuple[]} [AlphaMasks] - A list of alpha masks to apply to the asset - * @param {number} [Opacity=1] - The opacity at which to draw the image - * @param {boolean} [Rotate=false] - If the image should be rotated by 180 degrees - * @returns {boolean} - whether the image was complete or not - */ -function DrawImageCanvas(Source, Canvas, X, Y, AlphaMasks, Opacity, Rotate) { - const Img = DrawGetImage(Source); - if (!Img.complete) return false; - if (!Img.naturalWidth) return true; - /** @type {CanvasImageSource} */ - let SourceImage = Img; - if ((AlphaMasks && AlphaMasks.length) || Rotate) { - TempCanvas.canvas.width = Img.width; - TempCanvas.canvas.height = Img.height; - if (Rotate) { - TempCanvas.rotate(Math.PI); - TempCanvas.translate(-TempCanvas.canvas.width, -TempCanvas.canvas.height); - X = 500 - (X + TempCanvas.canvas.width); - Y -= TempCanvas.canvas.height; - } - TempCanvas.drawImage(Img, 0, 0); - if (AlphaMasks && AlphaMasks.length) { - AlphaMasks.forEach(([x, y, w, h]) => TempCanvas.clearRect(x - X, y - Y, w, h)); - } - SourceImage = TempCanvas.canvas; - } - Opacity = typeof Opacity === "number" ? Opacity : 1; - Canvas.save(); - Canvas.globalAlpha = Opacity; - Canvas.drawImage(SourceImage, X, Y); - Canvas.restore(); - return true; -} - - -/** - * Draws a canvas to a specific canvas - * @param {HTMLImageElement | HTMLCanvasElement} Img - Canvas to draw - * @param {CanvasRenderingContext2D} Canvas - Canvas on which to draw the image - * @param {number} X - Position of the image on the X axis - * @param {number} Y - Position of the image on the Y axis - * @param {RectTuple[]} AlphaMasks - A list of alpha masks to apply to the asset - * @returns {boolean} - whether the image was complete or not - */ -function DrawCanvas(Img, Canvas, X, Y, AlphaMasks) { - if (AlphaMasks && AlphaMasks.length) { - TempCanvas.canvas.width = Img.width; - TempCanvas.canvas.height = Img.height; - TempCanvas.drawImage(Img, 0, 0); - AlphaMasks.forEach(([x, y, w, h]) => TempCanvas.clearRect(x - X, y - Y, w, h)); - Canvas.drawImage(TempCanvas.canvas, X, Y); - } else { - Canvas.drawImage(Img, X, Y); - } - return true; -} - -/** - * Draws a specific canvas with a zoom on the main canvas - * @param {HTMLImageElement | HTMLCanvasElement} Canvas - Canvas to draw on the main canvas - * @param {number} X - Position of the canvas on the X axis - * @param {number} Y - Position of the canvas on the Y axis - * @param {number} Zoom - Zoom factor - * @returns {boolean} - whether the image was complete or not - */ -function DrawCanvasZoom(Canvas, X, Y, Zoom) { - return DrawImageEx(Canvas, X, Y, { Zoom }); -} - -/** - * Draws a zoomed image from a source to the canvas and mirrors it from left to right - * @param {string} Source - URL of the image - * @param {number} X - Position of the image on the X axis - * @param {number} Y - Position of the image on the Y axis - * @param {number} Width - Width of the image - * @param {number} Height - Height of the image - * @returns {boolean} - whether the image was complete or not - */ -function DrawImageZoomMirror(Source, X, Y, Width, Height) { - return DrawImageEx(Source, X, Y, { - Width, Height, - Mirror: true - }); -} - -/** - * Draws an image from a source on the main canvas - * @param {string} Source - URL of the image - * @param {number} X - Position of the image on the X axis - * @param {number} Y - Position of the image on the Y axis - * @param {boolean} [Invert] - Flips the image vertically - * @returns {boolean} - whether the image was complete or not - */ -function DrawImage(Source, X, Y, Invert) { - return DrawImageEx(Source, X, Y, { Invert }); -} - -/** - * Draws an image from a source to the specified canvas - * @param {string} Source - URL of the image - * @param {CanvasRenderingContext2D} Canvas - Canvas on which to draw the image - * @param {number} X - Position of the rectangle on the X axis - * @param {number} Y - Position of the rectangle on the Y axis - * @param {number} Zoom - Zoom factor - * @param {string} HexColor - Color of the image to draw - * @param {boolean} FullAlpha - Whether or not it is drawn in full alpha mode - * @param {RectTuple[]} [AlphaMasks] - A list of alpha masks to apply to the asset - * @param {number} [Opacity=1] - The opacity at which to draw the image - * @param {boolean} [Rotate=false] - If the image should be rotated by 180 degrees - * @returns {boolean} - whether the image was complete or not - */ -function DrawImageCanvasColorize(Source, Canvas, X, Y, Zoom, HexColor, FullAlpha, AlphaMasks, Opacity, Rotate) { - - // Make sure that the starting image is loaded - const Img = DrawGetImage(Source); - if (!Img.complete) return false; - if (!Img.naturalWidth) return true; - - // Variable initialization - const width = Img.width; - const height = Img.height; - - // Prepares a canvas to draw the colorized image - ColorCanvas.canvas.width = width; - ColorCanvas.canvas.height = height; - ColorCanvas.globalCompositeOperation = "copy"; - ColorCanvas.drawImage(Img, 0, 0); - - const imageData = ColorCanvas.getImageData(0, 0, width, height); - const data = imageData.data; - - // Get the RGB color used to transform - const rgbColor = DrawHexToRGB(HexColor); - - // We transform each non transparent pixel based on the RGG value - if (FullAlpha) { - for (let p = 0, len = data.length; p < len; p += 4) { - if (data[p + 3] == 0) - continue; - const trans = ((data[p] + data[p + 1] + data[p + 2]) / 383); - data[p + 0] = rgbColor.r * trans; - data[p + 1] = rgbColor.g * trans; - data[p + 2] = rgbColor.b * trans; - } - } else { - for (let p = 0, len = data.length; p < len; p += 4) { - const trans = ((data[p] + data[p + 1] + data[p + 2]) / 383); - if ((data[p + 3] == 0) || (trans < 0.8) || (trans > 1.2)) - continue; - data[p + 0] = rgbColor.r * trans; - data[p + 1] = rgbColor.g * trans; - data[p + 2] = rgbColor.b * trans; - } - } - - // Replace the source image with the modified canvas - ColorCanvas.putImageData(imageData, 0, 0); - if (AlphaMasks && AlphaMasks.length) { - AlphaMasks.forEach(([x, y, w, h]) => ColorCanvas.clearRect(x - X, y - Y, w, h)); - } - - // Rotate the image 180 degrees - if (Rotate) { - ColorCanvas.rotate(Math.PI); - ColorCanvas.translate(-ColorCanvas.canvas.width, -ColorCanvas.canvas.height); - X = 500 - (X + ColorCanvas.canvas.width); - Y -= ColorCanvas.canvas.height; - } - - Opacity = typeof Opacity === "number" ? Opacity : 1; - Canvas.save(); - Canvas.globalAlpha = Opacity; - Canvas.drawImage(ColorCanvas.canvas, 0, 0, Img.width, Img.height, X, Y, Img.width * Zoom, Img.height * Zoom); - Canvas.restore(); - - return true; -} - -/** - * Draws the mirrored version of an image from a source on the canvas - * @param {string} Source - URL of the image - * @param {number} X - Position of the image on the X axis - * @param {number} Y - Position of the image on the Y axis - * @returns {boolean} - whether the image was complete or not - */ -function DrawImageMirror(Source, X, Y) { - return DrawImageEx(Source, X, Y, { Mirror: true }); -} - -/** - * Flips an image vertically - * @param {HTMLImageElement} Img - The image to be inverted - * @returns {HTMLCanvasElement} - Canvas with the inverted image - */ -function DrawImageInvert(Img) { - TempCanvas.canvas.width = Img.width; - TempCanvas.canvas.height = Img.height; - TempCanvas.scale(1, -1); - TempCanvas.translate(0, -Img.height); - TempCanvas.drawImage(Img, 0, 0); - return TempCanvas.canvas; -} - -/** - * Draws an image on canvas, applying all options - * @param {string | HTMLImageElement | HTMLCanvasElement} Source - URL of image or image itself - * @param {number} X - Position of the image on the X axis - * @param {number} Y - Position of the image on the Y axis - * @param {object} options - any extra options, optional - * @param {CanvasRenderingContext2D} [options.Canvas] - Canvas on which to draw the image, defaults to `MainCanvas` - * @param {number} [options.Alpha] - transparency between 0-1 - * @param {[number, number, number, number]} [options.SourcePos] - Area in original image to draw in format `[left, top, width, height]` - * @param {number} [options.Width] - Width of the drawn image, defaults to width of original image - * @param {number} [options.Height] - Height of the drawn image, defaults to height of original image - * @param {boolean} [options.Invert=false] - If image should be flipped vertically - * @param {boolean} [options.Mirror=false] - If image should be flipped horizontally - * @param {number} [options.Zoom=1] - Zoom factor - * @returns {boolean} - whether the image was complete or not - */ -function DrawImageEx( - Source, - X, - Y, - { - Canvas = MainCanvas, - Alpha = 1, - SourcePos, - Width, - Height, - Invert = false, - Mirror = false, - Zoom = 1 - } -) { - if (typeof Source === "string") { - Source = DrawGetImage(Source); - if (!Source.complete) return false; - if (!Source.naturalWidth) return true; - } - - const sizeChanged = Width != null || Height != null; - if (Width == null) { - Width = SourcePos ? SourcePos[2] : Source.width; - } - if (Height == null) { - Height = SourcePos ? SourcePos[3] : Source.height; - } - - Canvas.save(); - - Canvas.globalCompositeOperation = "source-over"; - Canvas.globalAlpha = Alpha; - Canvas.translate(X, Y); - - if (Zoom != 1) { - Canvas.scale(Zoom, Zoom); - } - - if (Invert) { - Canvas.transform(1, 0, 0, -1, 0, Height); - } - - if (Mirror) { - Canvas.transform(-1, 0, 0, 1, Width, 0); - } - - if (SourcePos) { - Canvas.drawImage(Source, SourcePos[0], SourcePos[1], SourcePos[2], SourcePos[3], 0, 0, Width, Height); - } else if (sizeChanged) { - Canvas.drawImage(Source, 0, 0, Width, Height); - } else { - Canvas.drawImage(Source, 0, 0); - } - - Canvas.restore(); - return true; -} - -/** - * Wrapping text in fragments to support languages that do not separate between words using space. - * This function can also break between a long English word if somehow needed in the script. - * @param {string} text - The text to be fragmented. - * @param {number} maxWidth - The max width the text will be filled in. - * @returns {Array} - A list of string that being fragmented. - */ -function fragmentText(text, maxWidth) { - let words = text.split(' '), - lines = [], - line = ""; - - if (MainCanvas.measureText(text).width < maxWidth) { - return [text]; - } - - while (words.length > 0) { - while (MainCanvas.measureText(words[0]).width >= maxWidth) { - let temp = words[0]; - words[0] = temp.slice(0, -1); - if (words.length > 1) { - words[1] = temp.slice(-1) + words[1]; - } else { - words.push(temp.slice(-1)); - } - } - if (MainCanvas.measureText(line + words[0]).width < maxWidth) { - line += words.shift() + " "; - } else { - lines.push(line); - line = ""; - } - if (words.length === 0) { - lines.push(line); - } - } - return lines; -} - -/** - * Reduces the font size progressively until the text fits the wrap size - * @param {string} Text - Text that will be drawn - * @param {number} Width - Width in which the text must fit - * @param {number} MaxLine - Maximum of lines the word can wrap for - * @returns {void} - Nothing - */ -function GetWrapTextSize(Text, Width, MaxLine) { - - // Don't bother if it fits on one line - if (MainCanvas.measureText(Text).width <= Width) return; - - const words = fragmentText(Text, Width); - let line = ''; - - // Find the number of lines - let LineCount = 1; - for (let n = 0; n < words.length; n++) { - const testLine = line + words[n] + ' '; - if (MainCanvas.measureText(testLine).width > Width && n > 0) { - line = words[n] + ' '; - LineCount++; - } else line = testLine; - } - - // If there's too many lines, we launch the function again with size minus 2 - if (LineCount > MaxLine) { - MainCanvas.font = (parseInt(MainCanvas.font.substring(0, 2)) - 2).toString() + "px arial"; - GetWrapTextSize(Text, Width, MaxLine); - } -} - -/** - * Draws a word wrapped text in a rectangle - * @param {string} Text - Text to draw - * @param {number} X - Position of the rectangle on the X axis - * @param {number} Y - Position of the rectangle on the Y axis - * @param {number} Width - Width of the rectangle - * @param {number} Height - Height of the rectangle - * @param {string} ForeColor - Foreground color - * @param {string} [BackColor] - Background color - * @param {number} [MaxLine] - Maximum of lines the word can wrap for - * @returns {void} - Nothing - */ -function DrawTextWrap(Text, X, Y, Width, Height, ForeColor, BackColor, MaxLine) { - if (ControllerActive == true) { - setButton(X, Y); - } - // Draw the rectangle if we need too - if (BackColor != null) { - MainCanvas.beginPath(); - MainCanvas.rect(X, Y, Width, Height); - MainCanvas.fillStyle = BackColor; - MainCanvas.fillRect(X, Y, Width, Height); - MainCanvas.fill(); - MainCanvas.lineWidth = 2; - MainCanvas.strokeStyle = ForeColor; - MainCanvas.stroke(); - MainCanvas.closePath(); - } - if (!Text) return; - - // Sets the text size if there's a maximum number of lines - let TextSize; - if (MaxLine != null) { - TextSize = MainCanvas.font; - GetWrapTextSize(Text, Width, MaxLine); - } - - // Split the text if it wouldn't fit in the rectangle - MainCanvas.fillStyle = ForeColor; - if (MainCanvas.measureText(Text).width > Width) { - const words = fragmentText(Text, Width); - let line = ''; - - // Find the number of lines - let LineCount = 1; - for (let n = 0; n < words.length; n++) { - const testLine = line + words[n] + ' '; - if (MainCanvas.measureText(testLine).width > Width && n > 0) { - line = words[n] + ' '; - LineCount++; - } else line = testLine; - } - - // Splits the words and draw the text - line = ''; - Y = Y - ((LineCount - 1) * 23) + (Height / 2); - for (let n = 0; n < words.length; n++) { - const testLine = line + words[n] + ' '; - if (MainCanvas.measureText(testLine).width > Width && n > 0) { - MainCanvas.fillText(line, X + Width / 2, Y); - line = words[n] + ' '; - Y += 46; - } - else { - line = testLine; - } - } - MainCanvas.fillText(line, X + Width / 2, Y); - - } else MainCanvas.fillText(Text, X + Width / 2, Y + Height / 2); - - // Resets the font text size - if ((MaxLine != null) && (TextSize != null)) - MainCanvas.font = TextSize; - -} - -/** - * Draws a text element on the canvas that will fit on the specified width - * @param {string} Text - Text to draw - * @param {number} X - Position of the text on the X axis - * @param {number} Y - Position of the text on the Y axis - * @param {number} Width - Width in which the text has to fit - * @param {string} Color - Color of the text - * @param {string} [BackColor] - Color of the background - * @returns {void} - Nothing - */ -function DrawTextFit(Text, X, Y, Width, Color, BackColor) { - if (!Text) return; - - // Get text properties - let Result = DrawingGetTextSize(Text, Width); - Text = Result[0]; - MainCanvas.font = CommonGetFont(Result[1].toString()); - - // Draw a back color relief text if needed - if ((BackColor != null) && (BackColor != "")) { - MainCanvas.fillStyle = BackColor; - MainCanvas.fillText(Text, X + 1, Y + 1); - } - - // Restores the font size - MainCanvas.fillStyle = Color; - MainCanvas.fillText(Text, X, Y); - MainCanvas.font = CommonGetFont(36); -} - -/** - * Gets the text size needed to fit inside a given width according to the current font. - * This function is memoized because MainCanvas.measureText(Text) is a major resource hog. - * @param {string} Text - Text to draw - * @param {number} Width - Width in which the text has to fit - * @returns {[string, number]} - Text to draw and its font size - */ -const DrawingGetTextSize = CommonMemoize((Text, Width) => { - // If it doesn't fit, test with smaller and smaller fonts until it fits - let S; - for (S = 36; S >= 10; S = S - 2) { - MainCanvas.font = CommonGetFont(S.toString()); - const metrics = MainCanvas.measureText(Text); - if (metrics.width <= Width) - return [Text, S]; - } - - // Cuts the text if it would go over the box - while (Text.length > 0) { - Text = Text.substr(1); - const metrics = MainCanvas.measureText(Text); - if (metrics.width <= Width) - return [Text, S]; - } -}); - -/** - * Draws a text element on the canvas - * @param {string} Text - Text to draw - * @param {number} X - Position of the text on the X axis - * @param {number} Y - Position of the text on the Y axis - * @param {string} Color - Color of the text - * @param {string} [BackColor] - Color of the background - * @returns {void} - Nothing - */ -function DrawText(Text, X, Y, Color, BackColor) { - if (!Text) return; - - // Draw a back color relief text if needed - if ((BackColor != null) && (BackColor != "")) { - MainCanvas.fillStyle = BackColor; - MainCanvas.fillText(Text, X + 1, Y + 1); - } - - // Split the text on two lines if there's a | - MainCanvas.fillStyle = Color; - MainCanvas.fillText(Text, X, Y); - -} - -/** - * Draws a button component - * @param {number} Left - Position of the component from the left of the canvas - * @param {number} Top - Position of the component from the top of the canvas - * @param {number} Width - Width of the component - * @param {number} Height - Height of the component - * @param {string} Label - Text to display in the button - * @param {string} Color - Color of the component - * @param {string} [Image] - URL of the image to draw inside the button, if applicable - * @param {string} [HoveringText] - Text of the tooltip, if applicable - * @param {boolean} [Disabled] - Disables the hovering options if set to true - * @returns {void} - Nothing - */ -function DrawButton(Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled) { - - if (ControllerActive == true) { - setButton(Left, Top); - } - - // Draw the button rectangle (makes the background color cyan if the mouse is over it) - MainCanvas.beginPath(); - MainCanvas.rect(Left, Top, Width, Height); - MainCanvas.fillStyle = ((MouseX >= Left) && (MouseX <= Left + Width) && (MouseY >= Top) && (MouseY <= Top + Height) && !CommonIsMobile && !Disabled) ? "Cyan" : Color; - MainCanvas.fillRect(Left, Top, Width, Height); - MainCanvas.fill(); - MainCanvas.lineWidth = 2; - MainCanvas.strokeStyle = 'black'; - MainCanvas.stroke(); - MainCanvas.closePath(); - - // Draw the text or image - DrawTextFit(Label, Left + Width / 2, Top + (Height / 2) + 1, Width - 4, "black"); - if ((Image != null) && (Image != "")) DrawImage(Image, Left + 2, Top + 2); - - // Draw the hovering text - if ((HoveringText != null) && (MouseX >= Left) && (MouseX <= Left + Width) && (MouseY >= Top) && (MouseY <= Top + Height) && !CommonIsMobile) { - DrawHoverElements.push(() => DrawButtonHover(Left, Top, Width, Height, HoveringText)); - } -} - -/** - * Draws a checkbox component - * @param {number} Left - Position of the component from the left of the canvas - * @param {number} Top - Position of the component from the top of the canvas - * @param {number} Width - Width of the component - * @param {number} Height - Height of the component - * @param {string} Text - Label associated with the checkbox - * @param {boolean} IsChecked - Whether or not the checkbox is checked - * @param {boolean} [Disabled] - Disables the hovering options if set to true - * @param {string} [TextColor] - Color of the text - * @returns {void} - Nothing - */ -function DrawCheckbox(Left, Top, Width, Height, Text, IsChecked, Disabled = false, TextColor = "Black", CheckImage = "Icons/Checked.png") { - DrawText(Text, Left + 100, Top + 33, TextColor, "Gray"); - DrawButton(Left, Top, Width, Height, "", Disabled ? "#ebebe4" : "White", IsChecked ? CheckImage : "", null, Disabled); -} - -/** - * Draw a back & next button component - * @param {number} Left - Position of the component from the left of the canvas - * @param {number} Top - Position of the component from the top of the canvas - * @param {number} Width - Width of the component - * @param {number} Height - Height of the component - * @param {string} Label - Text inside the component - * @param {string} Color - Color of the component - * @param {string} [Image] - Image URL to draw in the component - * @param {() => string} [BackText] - Text for the back button tooltip - * @param {() => string} [NextText] - Text for the next button tooltip - * @param {boolean} [Disabled] - Disables the hovering options if set to true - * @param {number} [ArrowWidth] - How much of the button the previous/next sections cover. By default, half each. - * @returns {void} - Nothing - */ -function DrawBackNextButton(Left, Top, Width, Height, Label, Color, Image, BackText, NextText, Disabled, ArrowWidth) { - // Set the widths of the previous/next sections to be colored cyan when hovering over them - // By default each covers half the width, together covering the whole button - if (ArrowWidth == null || ArrowWidth > Width / 2) ArrowWidth = Width / 2; - const LeftSplit = Left + ArrowWidth; - const RightSplit = Left + Width - ArrowWidth; - - if (ControllerActive == true) { - setButton(Left, Top); - setButton(Left + Width - ArrowWidth, Top); - } - - // Draw the button rectangle - MainCanvas.beginPath(); - MainCanvas.rect(Left, Top, Width, Height); - MainCanvas.fillStyle = Color; - MainCanvas.fillRect(Left, Top, Width, Height); - if (MouseIn(Left, Top, Width, Height) && !CommonIsMobile && !Disabled) { - MainCanvas.fillStyle = "Cyan"; - if (MouseX > RightSplit) { - MainCanvas.fillRect(RightSplit, Top, ArrowWidth, Height); - } - else if (MouseX <= LeftSplit) { - MainCanvas.fillRect(Left, Top, ArrowWidth, Height); - } else { - MainCanvas.fillRect(Left + ArrowWidth, Top, Width - ArrowWidth * 2, Height); - } - } - else if (CommonIsMobile && ArrowWidth < Width / 2 && !Disabled) { - // Fill in the arrow regions on mobile - MainCanvas.fillStyle = "lightgrey"; - MainCanvas.fillRect(Left, Top, ArrowWidth, Height); - MainCanvas.fillRect(RightSplit, Top, ArrowWidth, Height); - } - MainCanvas.lineWidth = 2; - MainCanvas.strokeStyle = 'black'; - MainCanvas.stroke(); - MainCanvas.closePath(); - - // Draw the text or image - DrawTextFit(Label, Left + Width / 2, Top + (Height / 2) + 1, (CommonIsMobile) ? Width - 6 : Width - 36, "Black"); - if ((Image != null) && (Image != "")) DrawImage(Image, Left + 2, Top + 2); - if (ControllerActive == true) { - setButton(Left + Width / 2, Top); - } - - // Draw the back arrow - MainCanvas.beginPath(); - MainCanvas.fillStyle = "black"; - MainCanvas.moveTo(Left + 15, Top + Height / 5); - MainCanvas.lineTo(Left + 5, Top + Height / 2); - MainCanvas.lineTo(Left + 15, Top + Height - Height / 5); - MainCanvas.stroke(); - MainCanvas.closePath(); - - // Draw the next arrow - MainCanvas.beginPath(); - MainCanvas.fillStyle = "black"; - MainCanvas.moveTo(Left + Width - 15, Top + Height / 5); - MainCanvas.lineTo(Left + Width - 5, Top + Height / 2); - MainCanvas.lineTo(Left + Width - 15, Top + Height - Height / 5); - MainCanvas.stroke(); - MainCanvas.closePath(); - - // Draw the hovering text on the PC - if (CommonIsMobile) return; - if (BackText == null) BackText = () => "MISSING VALUE FOR: BACK TEXT"; - if (NextText == null) NextText = () => "MISSING VALUE FOR: NEXT TEXT"; - if ((MouseX >= Left) && (MouseX <= Left + Width) && (MouseY >= Top) && (MouseY <= Top + Height) && !Disabled) - DrawHoverElements.push(() => { DrawButtonHover(Left, Top, Width, Height, MouseX < LeftSplit ? BackText() : MouseX >= RightSplit ? NextText() : "") }); - -} - -/** - * Draw the hovering text tooltip - * @param {number} Left - Position of the tooltip from the left of the canvas - * @param {number} Top - Position of the tooltip from the top of the canvas - * @param {number} Width - Width of the tooltip - * @param {number} Height - Height of the tooltip - * @param {string} HoveringText - Text to display in the tooltip - * @returns {void} - Nothing - */ -function DrawButtonHover(Left, Top, Width, Height, HoveringText) { - if ((HoveringText != null) && (HoveringText != "")) { - Left = (MouseX > 1000) ? Left - 475 : Left + Width + 25; - Top = Top + (Height - 65) / 2; - MainCanvas.beginPath(); - MainCanvas.rect(Left, Top, 450, 65); - MainCanvas.fillStyle = "#FFFF88"; - MainCanvas.fillRect(Left, Top, 450, 65); - MainCanvas.fill(); - MainCanvas.lineWidth = 2; - MainCanvas.strokeStyle = 'black'; - MainCanvas.stroke(); - MainCanvas.closePath(); - DrawTextFit(HoveringText, Left + 225, Top + 33, 444, "black"); - } -} - -/** - * Draws a basic empty rectangle with a colored outline - * @param {number} Left - Position of the rectangle from the left of the canvas - * @param {number} Top - Position of the rectangle from the top of the canvas - * @param {number} Width - Width of the rectangle - * @param {number} Height - Height of the rectangle - * @param {string} Color - Color of the rectangle outline - * @param {number} [Thickness=3] - Thickness of the rectangle line - * @returns {void} - Nothing - */ -function DrawEmptyRect(Left, Top, Width, Height, Color, Thickness = 3) { - MainCanvas.beginPath(); - MainCanvas.rect(Left, Top, Width, Height); - MainCanvas.lineWidth = Thickness; - MainCanvas.strokeStyle = Color; - MainCanvas.stroke(); -} - -/** - * Draws a basic rectangle filled with a given color - * @param {number} Left - Position of the rectangle from the left of the canvas - * @param {number} Top - Position of the rectangle from the top of the canvas - * @param {number} Width - Width of the rectangle - * @param {number} Height - Height of the rectangle - * @param {string} Color - Color of the rectangle - * @returns {void} - Nothing - */ -function DrawRect(Left, Top, Width, Height, Color) { - MainCanvas.beginPath(); - MainCanvas.fillStyle = Color; - MainCanvas.fillRect(Left, Top, Width, Height); - MainCanvas.fill(); -} - -/** - * Draws a basic circle - * @param {number} CenterX - Position of the center of the circle on the X axis - * @param {number} CenterY - Position of the center of the circle on the Y axis - * @param {number} Radius - Radius of the circle to draw - * @param {number} LineWidth - Width of the line - * @param {string} LineColor - Color of the circle's line - * @param {string} [FillColor] - Color of the space inside the circle - * @param {CanvasRenderingContext2D} [Canvas] - The canvas element to draw onto, defaults to MainCanvas - * @returns {void} - Nothing - */ -function DrawCircle(CenterX, CenterY, Radius, LineWidth, LineColor, FillColor, Canvas) { - if (!Canvas) Canvas = MainCanvas; - Canvas.beginPath(); - Canvas.arc(CenterX, CenterY, Radius, 0, 2 * Math.PI, false); - if (FillColor) { - Canvas.fillStyle = FillColor; - Canvas.fill(); - } - Canvas.lineWidth = LineWidth; - Canvas.strokeStyle = LineColor; - Canvas.stroke(); -} - -/** - * Draws a progress bar with color - * @param {number} x - Position of the bar on the X axis - * @param {number} y - Position of the bar on the Y axis - * @param {number} w - Width of the bar - * @param {number} h - Height of the bar - * @param {number} value - Current progress to display on the bar - * @param {string} [foreground="#66FF66"] - Color of the first part of the bar - * @param {string} [background="red"] - Color of the bar background - * @returns {void} - Nothing - */ -function DrawProgressBar(x, y, w, h, value, foreground = "#66FF66", background = "red") { - if (value < 0) value = 0; - if (value > 100) value = 100; - DrawRect(x, y, w, h, "white"); - DrawRect(x + 2, y + 2, Math.floor((w - 4) * value / 100), h - 4, foreground); - DrawRect(Math.floor(x + 2 + (w - 4) * value / 100), y + 2, Math.floor((w - 4) * (100 - value) / 100), h - 4, background); -} - -/** - * Draws two lines, from one point to a second point then to a third point - * @param {number} x0 - X co-ordinate of starting point - * @param {number} y0 - Y co-ordinate of starting point - * @param {number} x1 - X co-ordinate of mid point - * @param {number} y1 - Y co-ordinate of mid point - * @param {number} x2 - X co-ordinate of end point - * @param {number} y2 - Y co-ordinate of end point - * @param {number} lineWidth - The width of the lines - * @param {string} color - The color of the lines - * @returns {void} - Nothing - */ -function DrawLineCorner(x0, y0, x1, y1, x2, y2, lineWidth = 2, color = "black") { - MainCanvas.beginPath(); - MainCanvas.lineWidth = lineWidth; - MainCanvas.moveTo(x0, y0); - MainCanvas.lineTo(x1, y1); - MainCanvas.lineTo(x2, y2); - MainCanvas.strokeStyle = color; - MainCanvas.stroke(); -} - -/** - * Gets the player's custom background based on type - * @returns {string} - Custom background if applicable, otherwise "" - */ -function DrawGetCustomBackground() { - const blindfold = InventoryGet(Player, "ItemHead"); - const hood = InventoryGet(Player, "ItemHood"); - let customBG = ""; - - if (blindfold && blindfold.Property && blindfold.Property.CustomBlindBackground) { - customBG = blindfold.Property.CustomBlindBackground; - } else if (hood && hood.Property && hood.Property.CustomBlindBackground) { - customBG = hood.Property.CustomBlindBackground; - } - - return customBG; -} - -/** - * Perform a global screen flash effect when a blindfold gets removed - * @param {number} intensity - The player's blind level before the removal - * TODO: that should be merged with DrawScreenFlash somehow - */ -function DrawBlindFlash(intensity) { - DrawingBlindFlashTimer = CurrentTime + 2000 * intensity; - BlindFlash = true; -} - -var DrawScreenFlashTime = 0; -var DrawScreenFlashColor = null; -var DrawScreenFlashStrength = 140; - -/** - * Perform a global screen flash effect - * @param {string} Color - The color to use - * @param {number} Duration - How long should the flash effect be applied, in ms - * @param {number} Intensity - How important is the effect visually - */ -function DrawFlashScreen(Color, Duration, Intensity) { - DrawScreenFlashTime = CommonTime() + Duration; - DrawScreenFlashColor = Color; - DrawScreenFlashStrength = Intensity; -} - -/** - * Gets the alpha of a screen flash. append to a color like "#111111" + DrawGetScreenFlash(FlashTime) - * @param {number} FlashTime - Time remaining as part of the screen flash - * @returns {string} - alpha of screen flash - */ -function DrawGetScreenFlashAlpha(FlashTime) { - let alpha = Math.max(0, Math.min(255, Math.floor(DrawScreenFlashStrength * (1 - Math.exp(-FlashTime/2500))))).toString(16); - if (alpha.length < 2) alpha = "0" + alpha; - return alpha; -} - -/** - * Constantly looping draw process. Draws beeps, handles the screen size, handles the current blindfold state and draws the current screen. - * @param {number} time - The current time for frame - * @returns {void} - Nothing - */ -function DrawProcess(time) { - // Clear the list of characters that were drawn last frame - DrawLastCharacters = []; - - // Gets the current screen background and draw it, it becomes darker in dialog mode or if the character is blindfolded - let B = window[CurrentScreen + "Background"]; - - if ((B != null) && (B != "")) { - const ValidScreenForVFX = CurrentModule != "Character" && B != "Sheet"; - const blurLevel = Player.GetBlurLevel(); - if (ValidScreenForVFX && blurLevel > 0) { - MainCanvas.filter = `blur(${blurLevel}px)`; - } - - let DarkFactor = 1.0; - if (ValidScreenForVFX) { - DarkFactor = CharacterGetDarkFactor(Player) * CurrentDarkFactor; - } - const Invert = Player.GraphicsSettings && Player.GraphicsSettings.InvertRoom && Player.IsInverted(); - - let customBG = DrawGetCustomBackground(); - - if (customBG != "" && ValidScreenForVFX) { - B = customBG; - if (DarkFactor == 0) - DarkFactor = CharacterGetDarkFactor(Player, true); - } - - if (DarkFactor > 0.0) { - if (!DrawImage("Backgrounds/" + B + ".jpg", 0, 0, Invert)) { - // Draw empty background to overdraw old content if background image isn't ready - DrawRect(0, 0, 2000, 1000, "#000"); - } - } - if (DarkFactor < 1.0) DrawRect(0, 0, 2000, 1000, "rgba(0,0,0," + (1.0 - DarkFactor) + ")"); - - if (ValidScreenForVFX) { - const Tints = Player.GetTints(); - for (const {r, g, b, a} of Tints) { - DrawRect(0, 0, 2000, 1000, `rgba(${r},${g},${b},${a})`); - } - } - - MainCanvas.filter = 'none'; - } - - CurrentScreenFunctions.Run(time); - - // Handle screen flash effects - DrawProcessScreenFlash(); - - // Draw Hovering text so they can be above everything else - DrawProcessHoverElements(); - - // Draws beep from online player sent by the server - ServerDrawBeep(); - - - // Checks for screen resize/position change and calls appropriate function - const newCanvasPosition = [MainCanvas.canvas.offsetLeft, MainCanvas.canvas.offsetTop, MainCanvas.canvas.clientWidth, MainCanvas.canvas.clientHeight]; - if (!CommonArraysEqual(newCanvasPosition, DrawCanvasPosition)) { - DrawCanvasPosition = newCanvasPosition; - if (CurrentScreenFunctions.Resize) { - CurrentScreenFunctions.Resize(false); - } - } -} - -/** - * Handles drawing the screen flash effects - * @returns {void} - */ -function DrawProcessScreenFlash() { -} - -/** - * Draws every element that is considered a "hover" element such has button tooltips. - * @returns {void} - Nothing - */ -function DrawProcessHoverElements() { - for (let E = 0; E < DrawHoverElements.length; E++) - if (typeof DrawHoverElements[0] === "function") - (DrawHoverElements.shift())(); -} - -/** - * Draws an asset's preview box - * @param {number} X - Position of the preview box on the X axis - * @param {number} Y - Position of the preview box on the Y axis - * @param {Asset} A - The asset to draw the preview for - * @param {object} [Options] - Additional optional drawing options - * @param {Character} [Options.C] - The character using the item (used to calculate dynamic item descriptions/previews) - * @param {string} [Options.Description] - The preview box description - * @param {string} [Options.Background] - The background color to draw the preview box in - defaults to white - * @param {string} [Options.Foreground] - The foreground (text) color to draw the description in - defaults to black - * @param {boolean} [Options.Vibrating] - Whether or not to add vibration effects to the item - defaults to false - * @param {boolean} [Options.Border] - Whether or not to draw a border around the preview box - * @param {boolean} [Options.Hover] - Whether or not the button should enable hover behavior (background color change) - * @param {string} [Options.HoverBackground] - The background color that should be used on mouse hover, if any - * @param {boolean} [Options.Disabled] - Whether or not the element is disabled (prevents hover functionality) - * @param {InventoryIcon[]} [Options.Icons] - A list of small icons to display in the top-left corner - * @param {object} [Options.Craft] - The crafted properties of the item - * @returns {void} - Nothing - */ -function DrawAssetPreview(X, Y, A, Options) { - let { C, Description, Background, Foreground, Vibrating, Border, Hover, HoverBackground, Disabled, Icons, Craft} = (Options || {}); - const DynamicPreviewImage = C ? A.DynamicPreviewImage(C) : ""; - const Path = `${AssetGetPreviewPath(A)}/${A.Name}${DynamicPreviewImage}.png`; - if ((Description == null) && (Craft != null) && (Craft.Name != null) && (Craft.Name != "")) Description = Craft.Name; - if (Description == null) Description = C ? A.DynamicDescription(C) : A.Description; - DrawPreviewBox(X, Y, Path, Description, { Background, Foreground, Vibrating, Border, Hover, HoverBackground, Disabled, Icons }); - if ((Craft != null) && (Craft.Lock != null) && (Craft.Lock != "")) DrawImageResize("Assets/" + Player.AssetFamily + "/ItemMisc/Preview/" + Craft.Lock + ".png", X + 150, Y + 150, 75, 75); -} - -/** - * Draws an item preview box for the provided image path - * @param {number} X - Position of the preview box on the X axis - * @param {number} Y - Position of the preview box on the Y axis - * @param {string} Path - The path of the image to draw - * @param {string} Description - The preview box description - * @param {object} [Options] - Additional optional drawing options - * @param {string} [Options.Background] - The background color to draw the preview box in - defaults to white - * @param {string} [Options.Foreground] - The foreground (text) color to draw the description in - defaults to black - * @param {boolean} [Options.Vibrating] - Whether or not to add vibration effects to the item - defaults to false - * @param {boolean} [Options.Border] - Whether or not to draw a border around the preview box - * @param {boolean} [Options.Hover] - Whether or not the button should enable hover behavior (background color change) - * @param {string} [Options.HoverBackground] - The background color that should be used on mouse hover, if any - * @param {boolean} [Options.Disabled] - Whether or not the element is disabled (prevents hover functionality) - * @param {InventoryIcon[]} [Options.Icons] - A list of images to draw in the top-left of the preview box - * @returns {void} - Nothing - */ -function DrawPreviewBox(X, Y, Path, Description, Options) { - let {Background, Foreground, Vibrating, Border, Hover, HoverBackground, Disabled, Icons} = (Options || {}); - const Height = Description ? 275 : 225; - Background = Background || "#fff"; - Foreground = Foreground || "#000"; - if (Disabled === true) Background = "#888"; - else if (Hover && MouseHovering(X, Y, 225, Height)) Background = (HoverBackground || "cyan"); - DrawRect(X, Y, 225, Height, Background); - setButton(X, Y); - if (Border) DrawEmptyRect(X, Y, 225, Height, Foreground); - const ImageX = Vibrating ? X + 1 + Math.floor(Math.random() * 3) : X + 2; - const ImageY = Vibrating ? Y + 1 + Math.floor(Math.random() * 3) : Y + 2; - if (Path !== "") DrawImageResize(Path, ImageX, ImageY, 221, 221); - DrawPreviewIcons(Icons, X, Y); - if (Description) DrawTextFit(Description, X + 110, Y + 250, 221, Foreground); -} - -/** - * Draws a list of small icons over a preview box - * @param {InventoryIcon[]} icons - An array of icon names - * @param {number} X - The X co-ordinate to start drawing from - * @param {number} Y - The Y co-ordinate to start drawing from - * @returns {void} - Nothing - */ -function DrawPreviewIcons(icons, X, Y) { -} - -/** - * Draws an item preview box using the provided canvas - * @param {number} X - Position of the preview box on the X axis - * @param {number} Y - Position of the preview box on the Y axis - * @param {HTMLCanvasElement} Canvas - The canvas element containing the image to draw - * @param {string} Description - The preview box description - * @param {object} Options - Additional optional drawing options - * @returns {void} - Nothing - */ -function DrawCanvasPreview(X, Y, Canvas, Description, Options) { - DrawPreviewBox(X, Y, "", Description, Options); - MainCanvas.drawImage(Canvas, X + 2, Y + 2, 221, 221); -} - -/** - * Returns a rectangular subsection of a canvas - * @param {HTMLCanvasElement} Canvas - The source canvas to take a section of - * @param {number} Left - The starting X co-ordinate of the section - * @param {number} Top - The starting Y co-ordinate of the section - * @param {number} Width - The width of the section to take - * @param {number} Height - The height of the section to take - * @returns {HTMLCanvasElement} - The new canvas containing the section - */ -function DrawCanvasSegment(Canvas, Left, Top, Width, Height) { - TempCanvas.canvas.width = Width; - TempCanvas.canvas.height = Height; - TempCanvas.clearRect(0, 0, Width, Height); - TempCanvas.drawImage(Canvas, Left, Top, Width, Height, 0, 0, Width, Height); - return TempCanvas.canvas; -} - -/** - * Returns a rectangular subsection of the character image - * @param {Character} C - The character to copy part of - * @param {number} Left - The starting X co-ordinate of the section - * @param {number} Top - The starting Y co-ordinate of the section - * @param {number} Width - The width of the section to take - * @param {number} Height - The height of the section to take - * @returns {HTMLCanvasElement} - The new canvas containing the section - */ -function DrawCharacterSegment(C, Left, Top, Width, Height) { - return DrawCanvasSegment(C.Canvas, Left, Top + CanvasUpperOverflow, Width, Height); -} diff --git a/Scripts/Drawing.ts b/Scripts/Drawing.ts new file mode 100644 index 000000000..16f2e28af --- /dev/null +++ b/Scripts/Drawing.ts @@ -0,0 +1,208 @@ +/** + * The main game canvas where everything will be drawn + * @type {CanvasRenderingContext2D} + */ +let MainCanvas: CanvasRenderingContext2D; +let TempCanvas: CanvasRenderingContext2D; +let ColorCanvas: CanvasRenderingContext2D; +let CharacterCanvas: CanvasRenderingContext2D; + +let BlindFlash = false; +let DrawingBlindFlashTimer = 0; + +// A bank of all the chached images +const DrawCacheImage: Map = new Map(); +let DrawCacheLoadedImages = 0; +let DrawCacheTotalImages = 0; + +// Last dark factor for blindflash +let DrawLastDarkFactor = 0; + +/** + * A list of the characters that are drawn every frame + */ +let DrawLastCharacters: Character[] = []; + +/** + * A list of elements to draw at the end of the drawing process. + * Mostly used for hovering button labels. + */ +let DrawHoverElements: Function[] = []; + + +/** + * Converts a hex color string to a RGB color + * @param color - Hex color to conver + * @returns RGB color + */ +function DrawHexToRGB(color: string): RGBColor { + const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + color = color.replace(shorthandRegex, function (m, r, g, b) { + return r + r + g + g + b + b; + }); + + const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : { + r: 0, + g: 0, + b: 0 + }; +} + +/** + * Converts a RGB color to a hex color string + * @param color - RGB color to conver + * @returns Hex color string + */ +function DrawRGBToHex(color: number[]): string { + const rgb = color[2] | (color[1] << 8) | (color[0] << 16); + return '#' + (0x1000000 + rgb).toString(16).slice(1).toUpperCase(); +} + +//let PIXIApp = null; +let PIXICanvas = null; + +/** + * Loads the canvas to draw on with its style and event listeners. + */ +function DrawLoad(): void { + //document.body.appendChild(PIXIApp.view); + + /*PIXIApp = new PIXI.Application({ + view: PIXICanvas, + background: '#1099bb' + });*/ + PIXICanvas = KinkyDungeonGetCanvas("MainCanvas"); + // OLD BC + // Creates the objects used in the game + //MainCanvas = /** @type {HTMLCanvasElement} */ (document.getElementById("MainCanvas")).getContext("2d"); + //document.getElementById("MainCanvas").addEventListener("keypress", KeyDown); + //document.getElementById("MainCanvas").tabIndex = 1000; + + // Font is fixed for now, color can be set + //MainCanvas.font = CommonGetFont(36); + //MainCanvas.textAlign = "center"; + //MainCanvas.textBaseline = "middle"; +} + + +/** + * Reloads all character canvas once all images are loaded + */ +function DrawGetImageOnLoad(): void { + ++DrawCacheLoadedImages; +} + +/** + * Attempts to redownload an image if it previously failed to load + * @param Img - Image tag that failed to load + * @param IsAsset - Whether or not the image is part of an asset + */ +function DrawGetImageOnError(Img: HTMLImageElement & { errorcount?: number }, IsAsset: boolean): void { + if (Img.errorcount == null) Img.errorcount = 0; + Img.errorcount += 1; + if (Img.errorcount < 3) { + // eslint-disable-next-line no-self-assign + Img.src = Img.src; + } else { + // Load failed. Display the error in the console and mark it as done. + console.log("Error loading image " + Img.src); + if (IsAsset) DrawGetImageOnLoad(); + } +} + + + +/** + * Draws a basic circle + * @param CenterX - Position of the center of the circle on the X axis + * @param CenterY - Position of the center of the circle on the Y axis + * @param Radius - Radius of the circle to draw + * @param LineWidth - Width of the line + * @param LineColor - Color of the circle's line + * @param FillColor - Color of the space inside the circle + * @param Canvas - The canvas element to draw onto, defaults to MainCanvas + */ +function DrawCircle(CenterX: number, CenterY: number, Radius: number, LineWidth: number, LineColor: string, FillColor: string = null, Canvas: CanvasRenderingContext2D = null): void { + if (!Canvas) Canvas = MainCanvas; + Canvas.beginPath(); + Canvas.arc(CenterX, CenterY, Radius, 0, 2 * Math.PI, false); + if (FillColor) { + Canvas.fillStyle = FillColor; + Canvas.fill(); + } + Canvas.lineWidth = LineWidth; + Canvas.strokeStyle = LineColor; + Canvas.stroke(); +} + +/** + * Draws a progress bar with color + * @param x - Position of the bar on the X axis + * @param y - Position of the bar on the Y axis + * @param w - Width of the bar + * @param h - Height of the bar + * @param value - Current progress to display on the bar + * @param foreground - Color of the first part of the bar + * @param background - Color of the bar background + * @returns Nothing + */ +function DrawProgressBar(x: number, y: number, w: number, h: number, value: number, foreground: string = "#66FF66", background: string = "red"): void { + if (value < 0) value = 0; + if (value > 100) value = 100; + DrawRectKD(kdcanvas, kdpixisprites, `progbar,${x}_${y}_${w}_${h}_${value}`, { + Left: x, + Top: y, + Width: w, + Height: h, + Color: "#aaaaaa", + LineWidth: 2, + zIndex: 100.02, + }); + FillRectKD(kdcanvas, kdpixisprites, `progbar2,${x}_${y}_${w}_${h}_${value}`, { + Left: x + 2, + Top: y + 2, + Width: Math.floor((w - 4) * value / 100), + Height: h - 4, + Color: foreground, + LineWidth: 1, + zIndex: 100.01, + }); + FillRectKD(kdcanvas, kdpixisprites, `progbar3,${x}_${y}_${w}_${h}_${value}`, { + Left:Math.floor(x + 2 + (w - 4) * value / 100), + Top: y + 2, + Width: Math.floor((w - 4) * (100 - value) / 100), + Height: h - 4, + Color: background, + LineWidth: 1, + zIndex: 100, + alpha: 0.8, + }); +} + +/** + * Constantly looping draw process. Draws beeps, handles the screen size, handles the current blindfold state and draws the current screen. + * @param time - The current time for frame + */ +function DrawProcess(time: number): void { + // Clear the list of characters that were drawn last frame + DrawLastCharacters = []; + + KinkyDungeonRun(); + + // Draw Hovering text so they can be above everything else + DrawProcessHoverElements(); +} + +/** + * Draws every element that is considered a "hover" element such has button tooltips. + */ +function DrawProcessHoverElements(): void { + for (let E = 0; E < DrawHoverElements.length; E++) + if (typeof DrawHoverElements[0] === "function") + (DrawHoverElements.shift())(); +} diff --git a/Scripts/DynamicDraw.js b/Scripts/DynamicDraw.js deleted file mode 100644 index 41b8b13ef..000000000 --- a/Scripts/DynamicDraw.js +++ /dev/null @@ -1,388 +0,0 @@ -"use strict"; - -/** - * DynamicDraw.js - * -------------- - * This file contains common utilities for dynamically drawing text onto assets. - * - * An options hash that can be used to customize dynamically drawn text. No options need be specified, and some options are only applicable - * to certain drawing functions. - * @typedef DynamicDrawOptions - * @type {object} - * @property {number} [fontSize] - The target font size. Note that if space is constrained, the actual drawn font size will be reduced - * automatically to fit. Defaults to 30px. - * @property {string} [fontFamily] - The desired font family to draw text in. This can be a single font name, or a full CSS font stack - * (e.g. "'Helvetica', 'Arial', sans-serif"). Defaults to the player's chosen global font. - * @property {CanvasTextAlign} [textAlign] - The text alignment to use. Can be any valid - * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/text-align text alignment}. Not applicable to the {@link DynamicDrawTextArc} - * function. Defaults to "center". - * @property {CanvasTextBaseline} [textBaseline] - The text baseline to use. Can be any valid - * {@link https://developer.mozilla.org/en-us/docs/Web/CSS/vertical-align vertical alignment}. Defaults to "middle". - * @property {string} [color] - The color that the text should be drawn in. Can be any valid CSS color string. Defaults to "#000". - * @property {DynamicDrawTextEffect} [effect] - A dynamic text effect to apply. No effects are applied by default. - * @property {number} [width] - The maximum width of the drawn text. Not applicable to the {@link DynamicDrawTextFromTo} function, as - * constraints are defined by the endpoints. When defined for the {@link DynamicDrawTextArc} function, it defines the maximum width of the - * text perpendicular to the radius line on which the text is centered. Unlimited by default. - * @property {boolean} [contain] - Whether or not the text should be fully contained in the box defined by the from/to coordinates. Only - * applicable to the {@link DynamicDrawTextFromTo} function. Defaults to true. - * @property {number} [angle] - The angle at which the text should be drawn, relative to the center of the circle. Angles are measured - * clockwise in radians starting at the vertical 12 o'clock position. For example 0 corresponds to 12 o'clock, PI/2 corresponds to - * 3 o'clock, PI corresponds to 6 o'clock, and 3PI/2 corresponds to 9 o'clock. Only applicable to the {@link DynamicDrawTextArc} function. - * Defaults to 0. - * @property {number} [radius] - The radius in pixels of the circle whose arc the text should be drawn along. A smaller radius will result - * in a greater text curvature and vice versa. Only applicable to the {@link DynamicDrawTextArc} function. Defaults to 450px. - * @property {number} [maxAngle] - The maximum angle that the text should be drawn along. This effectively determines the maximum length of - * the arc along which the text will be drawn. Only applicable to the {@link DynamicDrawTextArc} function. Defaults to PI (a semicircle). - * @property {DynamicDrawTextDirection} [direction] - The direction the text should be drawn in along the circular arc. Only applicable to - * the {@link DynamicDrawTextArc} function. Defaults to {@link DynamicDrawTextDirection.CLOCKWISE}; - * @property {DynamicDrawTextCurve} [textCurve] - The direction of the curve of the text. This determines whether the center of the text - * curves upwards ({@link DynamicDrawTextCurve.SMILEY}) or downwards ({@link DynamicDrawTextCurve.FROWNY}). Only applicable to the - * {@link DynamicDrawTextArc} function. Defaults to {@link DynamicDrawTextCurve.FROWNY}. - * - * A drawing callback, used to add drawing effects to dynamic text. - * @callback DynamicDrawTextEffectFunction - * @param {string} text - The text to draw - * @param {CanvasRenderingContext2D} ctx - The canvas rendering context - * @param {number} x - The x coordinate at which the text should be drawn - * @param {number} y - The y coordinate at which the text should be drawn - * @param {DynamicDrawOptions} [options] - Additional drawing options - * - * A definition object that wraps the drawing functions that define a dynamic text effect - * @typedef DynamicDrawTextEffectDefinition - * @type {object} - * @property {DynamicDrawTextEffectFunction} [before] - A drawing callback that is called before the dynamic text is drawn - * @property {DynamicDrawTextEffectFunction} [after] - A drawing callback that is called after the dynamic text is drawn - * - * @see {@link DynamicDrawText} - for drawing basic horizontal text. - * @see {@link DynamicDrawTextFromTo} - for drawing text in a straight line between any given two coordinates. - * @see {@link DynamicDrawTextArc} - for drawing text in a circular arc. - */ - -/** - * A common regex that can be used to check whether a given string is permitted for dynamic drawing (the character limitations are primarily - * to restrict the use of control characters and unicode characters that would cause odd behavior). - * @type {RegExp} - */ -const DynamicDrawTextRegex = /^(?:\w|[ ~!$#%*+])*$/; - -/** - * A regex pattern that can be attached to HTML input elements to check for validity - matches the DynamicDrawTextRegex - * @type {string} - */ -const DynamicDrawTextInputPattern = "(?:\\w|[ ~!$#%*+])*"; - -/** - * An array of valid printable characters that are permitted for dynamic drawing (used internally for text measurement purposes) - * @type {string[]} - */ -const DynamicDrawValidTextCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_- ~!$#%*+".split(""); - -/** - * A padding multiplier for text when drawn in an arc. The extra padding helps ensure that the bottoms of characters don't collide - * @type {number} - */ -const DynamicDrawTextArcPaddingRatio = 1.15; - -/** - * Cache for font measurements. These are used to make text which is drawn in an arc look more natural by respecting the widths of - * characters in various fonts. - * @type {Record. - * }>} - */ -const DynamicDrawFontMeasurements = {}; - -/** - * An enum encapsulating the directions that circular text can be drawn in (clockwise and anticlockwise) - * @enum {number} - */ -const DynamicDrawTextDirection = { - CLOCKWISE: 1, - ANTICLOCKWISE: -1, -}; - -/** - * An enum encapsulating the possible curve directions of circular text. Can be "SMILEY" (bottom of text on the outer arc) or "FROWNY" - * (bottom of text on the inner arc). - * @enum {number} - */ -const DynamicDrawTextCurve = { - SMILEY: -1, - FROWNY: 1, -}; - -/** - * An enum encapsulating the available drawing effects that can be applied to dynamic text. - * @enum {string} - */ -const DynamicDrawTextEffect = { - BURN: "burn", -}; - -/** - * The default options that are used for dynamic text drawing. - * @type {DynamicDrawOptions} - */ -const DynamicDrawTextDefaultOptions = { - fontSize: 30, - fontFamily: CommonGetFontName(), - textAlign: "center", - textBaseline: "middle", - color: "#000", - effect: undefined, - width: undefined, - contain: true, - angle: 0, - radius: 450, - maxAngle: Math.PI, - direction: DynamicDrawTextDirection.CLOCKWISE, - textCurve: DynamicDrawTextCurve.FROWNY, -}; - -/** - * Dynamic text effect definitions. The definitions define the drawing effects that can be applied to dynamically drawn text. - * @type {Record.} - */ -const DynamicDrawTextEffects = { - [DynamicDrawTextEffect.BURN]: { - before(text, ctx, x, y, { width }) { - ctx.save(); - ctx.fillStyle = "#000"; - ctx.fillText(text, x - 1, y - 1, width); - ctx.restore(); - }, - }, -}; - -/** - * Pre-loads a font family and calculates font measurements for the family. This should generally be called in an item's load function so - * that font data is loaded in preparation for dynamic font drawing. This will also be called at draw-time, but if the font is already - * pre-loaded, this function will do nothing. - * @param {string} fontFamily - the font family to load. Can be a single font name or a full CSS font stack - * (e.g. "'Helvetica', 'Arial', sans-serif") - * @returns {void} - Nothing - */ -function DynamicDrawLoadFont(fontFamily) { - // If we've already measured the font, do nothing - if (DynamicDrawFontMeasurements[fontFamily]) return; - - const canvas = document.createElement("canvas"); - canvas.width = 20; - canvas.height = 20; - const ctx = canvas.getContext("2d"); - - // Dummy text fill to force the browser to load the font (otherwise it won't get loaded until after the first time - // the text has been populated, causing the first draw to fallback) - ctx.font = `1px ${fontFamily}`; - ctx.fillText("", 0, 0); - - // Measure each of the valid characters in the given font and record the maximum width - let maxWidth = 0; - const measurements = DynamicDrawValidTextCharacters.map(char => { - const width = ctx.measureText(char).width; - if (width > maxWidth) maxWidth = width; - return width; - }); - - // Capture the maximum character width for the font, and set up a relative map for character weights - const weightMap = DynamicDrawFontMeasurements[fontFamily] = { - width: maxWidth, - weights: {}, - }; - - // Normalise the width of each character as a weight relative to the max width - DynamicDrawValidTextCharacters.forEach((char, i) => { - weightMap.weights[char] = measurements[i] / maxWidth; - }); -} - -/** - * Draws the given text to the provided canvas rendering context at the given positions. Text is drawn horizontally, respecting the - * configuration in the provided options (if any). - * @param {string} text - The text to draw - * @param {CanvasRenderingContext2D} ctx - The rendering context to draw the text to - * @param {number} x - The x coordinate at which to draw the text - * @param {number} y - The y coordinate at which to draw the text - * @param {DynamicDrawOptions} options - Additional drawing options - * @returns {void} - Nothing - */ -function DynamicDrawText(text, ctx, x, y, options) { - options = DynamicDrawParseOptions(options); - DynamicDrawTextAndEffects(text, ctx, x, y, options); -} - -/** - * Draws the given text in a straight line between the two provided coordinates. If the contain option is specified, the text will be fully - * contained in the rectangle defined by the from and to positions. - * @param {string} text - The text to draw - * @param {CanvasRenderingContext2D} ctx - The rendering context to draw the text to - * @param {number[]} from - The [x, y] coordinates to start drawing the text at - * @param {number[]} to - The [x, y] coordinates to end drawing the text at - * @param {DynamicDrawOptions} options - Additional drawing options - * @returns {void} - Nothing - */ -function DynamicDrawTextFromTo(text, ctx, from, to, options) { - const { fontSize, contain } = options = DynamicDrawParseOptions(options); - - // From coordinate (x0, y0) - const x0 = from[0]; - const y0 = from[1]; - // To coordinate (x1, y1) - const x1 = to[0]; - const y1 = to[1]; - // Calculate x & y deltas - const dx = x1 - x0; - const dy = y1 - y0; - // Diagonal distance - options.width = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)); - if (contain && dx !== 0) { - // If the text should be fully contained withing the [x0, y0], [x1, y1] box, subtract appropriately - options.width -= 2 * Math.abs(dy / dx) * (fontSize / 2); - } - // Center point (cx, cy) - const cx = x0 + 0.5 * dx; - const cy = y0 + 0.5 * dy; - - // Calculate the angle of the text - let angle; - if (dx === 0) { - // If dx is 0, the text is vertical - angle = dy > 0 ? Math.PI / 2 : -Math.PI / 2; - } else { - angle = Math.atan(dy / dx); - } - // If dx < 0, then we need to rotate 180 degrees to respect directionality - if (dx < 0) angle += Math.PI; - - // Save the canvas state and rotate by the calculated angle about the center point - ctx.save(); - ctx.translate(cx, cy); - ctx.rotate(angle); - ctx.translate(-cx, -cy); - // Draw the text and any dynamic text effects - DynamicDrawTextAndEffects(text, ctx, cx, cy, options); - // Restore the canvas rotation - ctx.restore(); -} - -/** - * Draws the given text in a circular arc at the given [x, y] coordinate. The text will be drawn so that the center of the text is - * positioned on the given coordinates. - * @see {@link DynamicDrawOptions} - * @param {string} text - The text to draw - * @param {CanvasRenderingContext2D} ctx - The rendering context to draw the text to - * @param {number} x - The x coordinate at which to center the text - * @param {number} y - The y coordinate at which to center the text - * @param {DynamicDrawOptions} options - Additional drawing options. These can be used to specify the radius of the circle (determining how - * curved the text appears), as well as the direction along the circle that the text is drawn in (by default, text is drawn clockwise). - * @returns {void} - Nothing - */ -function DynamicDrawTextArc(text, ctx, x, y, options) { - let { fontFamily, angle, radius, width, maxAngle, fontSize, direction, textCurve } = options = DynamicDrawParseOptions(options); - - // Load the font measurements if they haven't already been populated - DynamicDrawLoadFont(fontFamily); - - // Calculate the circle's center based on the desired text position and the angle - const cx = x - radius * Math.sin(angle); - const cy = y - radius * Math.cos(angle); - - // Retrieve the character weight map for the font - const weightMap = DynamicDrawFontMeasurements[fontFamily] || { - width: 1, - weights: {}, - }; - - // Calculate the total weight of the desired text - let totalWeight = 0; - for (let i = 0; i < text.length; i++) { - totalWeight += weightMap.weights[text[i]] || 1; - } - - if (width == null || width > 2 * radius + fontSize) { - width = 2 * radius + fontSize; - } - // Check whether the maximum angle should be constrained by the maximum width - const angleConstraint = 2 * Math.asin(width / (fontSize + 2 * radius)); - maxAngle = Math.min(maxAngle, angleConstraint); - - // Check whether the font size should be constrained by the maximum angle - const baseWidth = weightMap.width * totalWeight * DynamicDrawTextArcPaddingRatio; - const fontSizeConstraint = (2 * maxAngle * radius) / (2 * baseWidth + maxAngle); - options.fontSize = Math.min(fontSize, fontSizeConstraint); - - // Based on the computed font size, calculate the actual angle that the text will occupy (may be less than the max - // angle) - const actualAngle = options.fontSize * baseWidth / radius; - - // Apply drawing options - DynamicDrawApplyOptions(ctx, options); - - // Prepare the canvas by translating to the intended drawing position, then translating over to the center of the - // circle. Then rotate the canvas around to the angle where the text should be draw, and rotate back again half the - // angle occupied by the text - ctx.save(); - ctx.translate(x, y); - ctx.translate(x - cx, y - cy); - ctx.rotate(-angle); - ctx.rotate(-1 * direction * actualAngle / 2); - - // Draw each character in turn, rotating a little before and after each character to space them out evenly - for (let n = 0; n < text.length; n++) { - const char = text[n]; - const rotationAngle = direction * 0.5 * actualAngle * (weightMap.weights[char] || 1) / totalWeight; - ctx.rotate(rotationAngle); - ctx.save(); - ctx.translate(0, -radius); - ctx.transform(direction, 0, 0, textCurve, 0, 0); - DynamicDrawTextAndEffects(char, ctx, 0, 0, options); - ctx.restore(); - ctx.rotate(rotationAngle); - } - - // Restore the canvas back to its original position and orientation - ctx.restore(); -} - -/** - * Internal utility function for drawing text and applying text effects. - * @param {string} text - The text to draw - * @param {CanvasRenderingContext2D} ctx - The rendering context to draw the text to - * @param {number} x - The x coordinate at which to draw the text - * @param {number} y - The y coordinate at which to draw the text - * @param {DynamicDrawOptions} options - Additional drawing options - * @returns {void} - Nothing - */ -function DynamicDrawTextAndEffects(text, ctx, x, y, options) { - DynamicDrawApplyOptions(ctx, options); - const effect = DynamicDrawTextEffects[options.effect] || {}; - if (typeof effect.before === "function") effect.before(text, ctx, x, y, options); - ctx.fillText(text, x, y, options.width); - if (typeof effect.after === "function") effect.after(text, ctx, x, y, options); -} - -/** - * Parses a dynamic drawing options object, returning default values for properties that aren't defined. - * @param {DynamicDrawOptions} [options] - The options object to parse - * @returns {DynamicDrawOptions} - A complete options object, with default values where not specified - */ -function DynamicDrawParseOptions(options) { - options = options || {}; - const parsedOptions = Object.assign({}, DynamicDrawTextDefaultOptions, options); - return parsedOptions; -} - -/** - * Applies a set of dynamic drawing options to a canvas rendering context. This sets the canvas up with the relevant font size, color, etc. - * ready for drawing text - * @param {CanvasRenderingContext2D} ctx - The rendering context to draw the text to - * @param {DynamicDrawOptions} options - The drawing options to apply - * @returns {void} - Nothing - */ -function DynamicDrawApplyOptions(ctx, { fontSize, fontFamily, textAlign, textBaseline, color }) { - ctx.font = `${fontSize}px ${fontFamily}`; - ctx.textAlign = textAlign; - ctx.textBaseline = textBaseline; - ctx.fillStyle = color; -} diff --git a/Scripts/Element.js b/Scripts/Element.js deleted file mode 100644 index 78e7e06e6..000000000 --- a/Scripts/Element.js +++ /dev/null @@ -1,430 +0,0 @@ -"use strict"; - -let KDTextBoxStyle = { - backgroundColor: "#000000a0", - fontFamily: "'Arial', sans-serif", - fontSize: "16px", - color: "#ffffff", - lineHeight: 1.6, -}; - -/** - * Handles the value of a HTML element. It sets the value of the element when the Value parameter is provided or it returns the value when the parameter is omitted - * @param {string} ID - The id of the element for which we want to get/set the value. - * @param {string} [Value] - The value to give to the element (if applicable) - * @returns {string} - The value of the element (When no value parameter was passed to the function) - */ -function ElementValue(ID, Value) { - const e = /** @type {HTMLInputElement} */(document.getElementById(ID)); - if (!e) { - console.error("ElementValue called on a missing element: " + ID.toString); - return ""; - } - - if (Value == null) - return e.value.trim(); - - e.value = Value; - return ""; -} - -/** - * Handles the content of a HTML element. It sets the content of the element when the Content parameter is provided or it returns the value when the parameter is omitted - * @param {string} ID - The id of the element for which we want to get/set the value. - * @param {string} [Content] - The content/inner HTML to give to the element (if applicable) - * @returns {string} - The content of the element (When no Content parameter was passed to the function) - */ -function ElementContent(ID, Content) { - const e = document.getElementById(ID); - if (!e) { - console.error("ElementContent called on a missing element: " + ID.toString()); - return ""; - } - - if (Content == null) - return e.innerHTML; - - e.innerHTML = Content; - return ""; -} - -/** - * Creates a new text area element in the main document. Does not create a new element if there is already an existing one with the same ID - * @param {string} ID - The id of the text area to create. - * @returns {void} - Nothing - */ -function ElementCreateTextArea(ID) { - if (document.getElementById(ID) == null) { - var TextArea = document.createElement("TextArea"); - TextArea.setAttribute("ID", ID); - TextArea.setAttribute("screen-generated", CurrentScreen); - TextArea.setAttribute("name", ID); - TextArea.addEventListener("keydown", KeyDown); - TextArea.className = "HideOnPopup"; - Object.assign(TextArea.style, KDTextBoxStyle); - document.body.appendChild(TextArea); - } -} - -/** - * Creates a new text input element in the main document.Does not create a new element if there is already an existing one with the same ID - * @param {string} ID - The id of the input tag to create. - * @param {string} Type - Type of the input tag to create. - * @param {string} Value - Value of the input tag to create. - * @param {string} [MaxLength] - Maximum input tag of the input to create. - * @returns {HTMLInputElement} - The created HTML input element - */ -function ElementCreateInput(ID, Type, Value, MaxLength) { - if (document.getElementById(ID) == null) { - var Input = document.createElement("input"); - Input.setAttribute("ID", ID); - Input.setAttribute("name", ID); - Input.setAttribute("type", Type); - Input.setAttribute("value", Value); - Input.setAttribute("screen-generated", CurrentScreen); - Input.setAttribute("maxlength", MaxLength); - Input.setAttribute("onfocus", "this.removeAttribute('readonly');"); - Input.addEventListener("keydown", KeyDown); - Input.className = "HideOnPopup"; - document.body.appendChild(Input); - Object.assign(Input.style, KDTextBoxStyle); - return Input; - } -} - -/** - * Creates a new range input element in the main document. Does not create a new element if there is already an - * existing one with the same id - * @param {string} id - The id of the input tag to create - * @param {number} value - The initial value of the input - * @param {number} min - The minimum value of the input - * @param {number} max - The maximum value of the input - * @param {number} step - The increment size of the input - * @param {string} [thumbIcon] - The icon to use for the range input's "thumb" (handle). Can currently be set to "lock" - * or "blindfold". If not set, the slider will have a default appearance with no custom thumb. - * @param {boolean} [vertical] - Whether this range input is a vertical slider (defaults to false) - * @returns {HTMLInputElement} - The created HTML input element - */ -function ElementCreateRangeInput(id, value, min, max, step, thumbIcon, vertical) { - if (document.getElementById(id) == null) { - const input = /** @type {HTMLInputElement} */(document.createElement("input")); - input.setAttribute("id", id); - input.setAttribute("name", id); - input.setAttribute("type", "range"); - input.removeAttribute("readonly"); - input.setAttribute("min", min); - input.setAttribute("max", max); - input.setAttribute("step", step); - input.value = String(value); - if (thumbIcon) input.setAttribute("data-thumb", thumbIcon); - input.setAttribute("onfocus", "this.removeAttribute('readonly');"); - input.addEventListener("keydown", KeyDown); - input.classList.add("HideOnPopup"); - if (vertical) input.classList.add("Vertical"); - document.body.appendChild(input); - Object.assign(input.style, KDTextBoxStyle); - return input; - } -} - -/** - * Creates a dropdown element and adjusts it to the BC look and feel. In the HTML Code this will look like this: - *
-- enclosing div used for css and postioning - * - *
-- the div representing the currently selected item - *
-- div for the various options - *
Option 1
- *
Option n
- *
- *
- * This construct is built automatically and ignores the original select statement. All the logic is handled by - * event handlers that are connected to the various divs. See comments in the code. - * What this function cannot handle at the moment: - * - The size is always set to 1 - * - Multiple selects are impossible - * @param {string} ID - The name of the select item. The outer div will get this name, for positioning. The select - * tag will get the name ID+"-select" - * @param {string[]} Options - The list of options for the current select statement - * @param {EventListenerOrEventListenerObject} [ClickEventListener=null] - An event listener to be called, when the value of the drop down box changes - * @returns {void} - Nothing - */ -function ElementCreateDropdown(ID, Options, ClickEventListener) { - if (document.getElementById(ID) == null) { - // Create the all enclosing
- var CustomSelect = document.createElement("DIV"); - CustomSelect.setAttribute("class", "custom-select"); - CustomSelect.setAttribute("ID", ID); - // Create the tag - if (ClickEventListener != null) Select.addEventListener("change", ClickEventListener); - // Add alle the items to the enclosing - CustomSelect.appendChild(Select); - CustomSelect.appendChild(SelectedItem); - CustomSelect.appendChild(DivOptions); - document.body.appendChild(CustomSelect); - document.addEventListener("click", ElementCloseAllSelect); - } -} - -/** - * Closes all select boxes in the current document, except the current select box - * @param {object} elmnt - The select box to exclude from the closing - * @returns {void} - Nothing - */ -function ElementCloseAllSelect(elmnt) { - /*a function that will close all select boxes in the document, - except the current select box:*/ - var arrNo = []; - var y = document.getElementsByClassName("select-selected"); - for (let i = 0; i < y.length; i++) { - if (elmnt == y[i]) arrNo.push(i); - } - var x = document.getElementsByClassName("select-items"); - for (let i = 0; i < x.length; i++) { - if (arrNo.indexOf(i)) x[i].classList.add("select-hide"); - } -} - -/** - * Creates a new div element in the main document. Does not create a new element if there is already an existing one with the same ID - * @param {string} ID - The id of the div tag to create. - * @returns {void} - Nothing - */ -function ElementCreateDiv(ID) { - if (document.getElementById(ID) == null) { - var Div = document.createElement("div"); - Div.setAttribute("ID", ID); - Div.setAttribute("name", ID); - Div.setAttribute("screen-generated", CurrentScreen); - Div.addEventListener("keydown", KeyDown); - Div.className = "HideOnPopup"; - document.body.appendChild(Div); - } -} - -/** - * Removes an element from the main document - * @param {string} ID - The id of the tag to remove from the document. - * @returns {void} - Nothing - */ -function ElementRemove(ID) { - if (document.getElementById(ID) != null) - document.getElementById(ID).parentNode.removeChild(document.getElementById(ID)); -} - -/** - * Draws an existing HTML element at a specific position within the document. The element is "centered" on the given coordinates by dividing its height and width by two. - * @param {string} ElementID - The id of the input tag to (re-)position. - * @param {number} X - Center point of the element on the X axis. - * @param {number} Y - Center point of the element on the Y axis. - * @param {number} W - Width of the element. - * @param {number} [H] - Height of the element. - * @returns {void} - Nothing - */ -function ElementPosition(ElementID, X, Y, W, H) { - var E = document.getElementById(ElementID); - - if (!E) { - console.warn("A call to ElementPosition was made on non-existent element with ID '" + ElementID + "'"); - return; - } - - // For a vertical slider, swap the width and the height (the transformation is handled by CSS) - if (E.tagName.toLowerCase() === "input" && E.getAttribute("type") === "range" && E.classList.contains("Vertical")) { - var tmp = W; - W = H; - H = tmp; - } - - // Different positions based on the width/height ratio - const HRatio = MainCanvas.canvas.clientHeight / 1000; - const WRatio = MainCanvas.canvas.clientWidth / 2000; - const Font = MainCanvas.canvas.clientWidth <= MainCanvas.canvas.clientHeight * 2 ? MainCanvas.canvas.clientWidth / 50 : MainCanvas.canvas.clientHeight / 25; - const Height = H ? H * HRatio : Font * 1.15; - const Width = W * WRatio - 18; - const Top = MainCanvas.canvas.offsetTop + Y * HRatio - Height / 2; - const Left = MainCanvas.canvas.offsetLeft + (X - W / 2) * WRatio; - - // Sets the element style - Object.assign(E.style, { - fontSize: Font + "px", - fontFamily: CommonGetFontName(), - position: "fixed", - left: Left + "px", - top: Top + "px", - width: Width + "px", - height: Height + "px", - display: "inline" - }); -} - -/** - * Draws an existing HTML element at a specific position within the document. The element will not be centered on its given coordinates unlike the ElementPosition function. - * @param {string} ElementID - The id of the input tag to (re-)position. - * @param {number} Font - The size of the font to use. - * @param {number} X - Starting point of the element on the X axis. - * @param {number} Y - Starting point of the element on the Y axis. - * @param {number} W - Width of the element. - * @param {number} H - Height of the element. - * @returns {void} - Nothing - */ -function ElementPositionFix(ElementID, Font, X, Y, W, H) { - var E = document.getElementById(ElementID); - // Verify the element exists - if (!E) { - console.warn("A call to ElementPositionFix was made on non-existent element with ID '" + ElementID + "'"); - return; - } - - // Different positions based on the width/height ratio - const HRatio = MainCanvas.canvas.clientHeight / 1000; - const WRatio = MainCanvas.canvas.clientWidth / 2000; - Font *= Math.max(HRatio, WRatio); - const Top = MainCanvas.canvas.offsetTop + Y * HRatio; - const Height = H * HRatio; - const Left = MainCanvas.canvas.offsetLeft + X * WRatio; - const Width = W * WRatio; - - // Sets the element style - Object.assign(E.style, { - fontSize: Font + "px", - fontFamily: CommonGetFontName(), - position: "fixed", - left: Left + "px", - top: Top + "px", - width: Width + "px", - height: Height + "px", - display: "inline" - }); - -} - -/** - * Sets a custom data-attribute to a specified value on a specified element - * @param {string} ID - The id of the element to create/set the data attribute of. - * @param {string} Name - Name of the data attribute. ("data-" will be automatically appended to it.) - * @param {string} Value - Value to give to the attribute. - * @returns {void} - Nothing - */ -function ElementSetDataAttribute(ID, Name, Value) { - var element = document.getElementById(ID); - if (element != null) { - element.setAttribute(("data-" + Name).toLowerCase(), Value.toString().toLowerCase()); - } -} - -/** - * Sets an attribute to a specified value on a specified element - * @param {string} ID - The id of the element to create/set the data attribute of. - * @param {string} Name - Name of the attribute. - * @param {string} Value - Value to give to the attribute. - * @returns {void} - Nothing - */ -function ElementSetAttribute(ID, Name, Value) { - var element = document.getElementById(ID); - if (element != null) { - element.setAttribute(Name, Value); - } -} - -/** - * Scrolls to the end of a specified element - * @param {string} ID - The id of the element to scroll down to the bottom of. - * @returns {void} - Nothing - */ -function ElementScrollToEnd(ID) { - var element = document.getElementById(ID); - if (element != null) element.scrollTop = element.scrollHeight; -} - -/** - * Returns the given element's scroll position as a percentage, with the top of the element being close to 0 depending on scroll bar size, and the bottom being around 1. - * To clarify, this is the position of the bottom edge of the scroll bar. - * @param {string} ID - The id of the element to find the scroll percentage of. - * @returns {(number|null)} - A float representing the scroll percentage. - */ -function ElementGetScrollPercentage(ID) { - var element = document.getElementById(ID); - if (element != null) return (element.scrollTop + element.clientHeight) / element.scrollHeight; - - return null; -} - -/** - * Checks if a given HTML element is scrolled to the very bottom. - * @param {string} ID - The id of the element to check for scroll height. - * @returns {boolean} - Returns TRUE if the specified element is scrolled to the very bottom - */ -function ElementIsScrolledToEnd(ID) { - var element = document.getElementById(ID); - return element != null && element.scrollHeight - element.scrollTop - element.clientHeight < 1; -} - -/** - * Gives focus to a specified existing element for non-mobile users. - * @param {string} ID - The id of the element to give focus to. - * @returns {void} - Nothing - */ -function ElementFocus(ID) { - if ((document.getElementById(ID) != null) && !CommonIsMobile) - document.getElementById(ID).focus(); -} - -/** - * Toggles HTML elements that were created by a given screen. When toggled off, they are hidden (not removed) - * @param {string} Screen - Screen for which to hide the elements generated - * @param {boolean} ShouldDisplay - TRUE if we are toggling on the elements, FALSE if we are hiding them. - */ -function ElementToggleGeneratedElements(Screen, ShouldDisplay) { - const generatedElements = Array.from(document.querySelectorAll(`[screen-generated="${Screen}"]`)); - generatedElements.forEach((/** @type {HTMLElement} */ element) => element.style.display = ShouldDisplay ? '' : 'none'); -} diff --git a/Scripts/Element.ts b/Scripts/Element.ts new file mode 100644 index 000000000..9aed28d93 --- /dev/null +++ b/Scripts/Element.ts @@ -0,0 +1,425 @@ +let KDTextBoxStyle = { + backgroundColor: "#000000a0", + fontFamily: "'Courier New', 'Arial', sans-serif", + fontSize: "14px", + color: "#ffffff", + lineHeight: 1.6, +}; + +/** + * Handles the value of a HTML element. It sets the value of the element when the Value parameter is provided or it returns the value when the parameter is omitted + * @param ID - The id of the element for which we want to get/set the value. + * @param Value - The value to give to the element (if applicable) + * @returns The value of the element (When no value parameter was passed to the function) + */ +function ElementValue(ID: string, Value: string | null = null): string { + const e = document.getElementById(ID) as HTMLInputElement; + if (!e) { + console.error("ElementValue called on a missing element: " + ID.toString); + return ""; + } + + if (Value == null) + return e.value.trim(); + + e.value = Value; + return ""; +} + +/** + * Handles the content of a HTML element. It sets the content of the element when the Content parameter is provided or it returns the value when the parameter is omitted + * @param ID - The id of the element for which we want to get/set the value. + * @param Content - The content/inner HTML to give to the element (if applicable) + * @returns The content of the element (When no Content parameter was passed to the function) + */ +function ElementContent(ID: string, Content: string = null): string { + const e = document.getElementById(ID); + if (!e) { + console.error("ElementContent called on a missing element: " + ID.toString()); + return ""; + } + + if (Content == null) + return e.innerHTML; + + e.innerHTML = Content; + return ""; +} + +/** + * Creates a new text area element in the main document. Does not create a new element if there is already an existing one with the same ID + * @param ID - The id of the text area to create. + */ +function ElementCreateTextArea(ID: string): void { + if (document.getElementById(ID) == null) { + var TextArea = document.createElement("TextArea"); + TextArea.setAttribute("ID", ID); + TextArea.setAttribute("screen-generated", CurrentScreen); + TextArea.setAttribute("name", ID); + TextArea.setAttribute("autocapitalize", "off"); + TextArea.setAttribute("autocomplete", "off"); + TextArea.setAttribute("autocorrect", "off"); + TextArea.setAttribute("spellcheck", "false"); + //TextArea.addEventListener("keydown", KeyDown); + TextArea.className = "HideOnPopup"; + Object.assign(TextArea.style, KDTextBoxStyle); + document.body.appendChild(TextArea); + } +} + +/** + * Creates a new text input element in the main document.Does not create a new element if there is already an existing one with the same ID + * @param ID - The id of the input tag to create. + * @param Type - Type of the input tag to create. + * @param Value - Value of the input tag to create. + * @param MaxLength - Maximum input tag of the input to create. + * @returns The created HTML input element + */ +function ElementCreateInput(ID: string, Type: string, Value: string, MaxLength: string = null): HTMLInputElement | undefined { + if (document.getElementById(ID) == null) { + var Input = document.createElement("input"); + Input.setAttribute("ID", ID); + Input.setAttribute("name", ID); + Input.setAttribute("type", Type); + Input.setAttribute("value", Value); + Input.setAttribute("screen-generated", CurrentScreen); + Input.setAttribute("maxlength", MaxLength); + Input.setAttribute("onfocus", "this.removeAttribute('readonly');"); + Input.setAttribute("autocapitalize", "off"); + Input.setAttribute("autocomplete", "off"); + Input.setAttribute("autocorrect", "off"); + Input.setAttribute("spellcheck", "false"); + //Input.addEventListener("keydown", KeyDown); + Input.className = "HideOnPopup"; + document.body.appendChild(Input); + Object.assign(Input.style, KDTextBoxStyle); + return Input; + } +} + +/** + * Creates a new range input element in the main document. Does not create a new element if there is already an + * existing one with the same id + * @param id - The id of the input tag to create + * @param value - The initial value of the input + * @param min - The minimum value of the input + * @param max - The maximum value of the input + * @param step - The increment size of the input + * @param thumbIcon - The icon to use for the range input's "thumb" (handle). Can currently be set to "lock" + * or "blindfold". If not set, the slider will have a default appearance with no custom thumb. + * @param vertical - Whether this range input is a vertical slider (defaults to false) + * @returns The created HTML input element + */ +function ElementCreateRangeInput(id: string, value: number, min: number, max: number, step: number, thumbIcon: string = null, vertical: boolean = false): HTMLInputElement { + if (document.getElementById(id) == null) { + const input = /** @type {HTMLInputElement} */(document.createElement("input")); + input.setAttribute("id", id); + input.setAttribute("name", id); + input.setAttribute("type", "range"); + input.removeAttribute("readonly"); + input.setAttribute("min", min); + input.setAttribute("max", max); + input.setAttribute("step", step); + input.value = String(value); + if (thumbIcon) input.setAttribute("data-thumb", thumbIcon); + input.setAttribute("onfocus", "this.removeAttribute('readonly');"); + //input.addEventListener("keydown", KeyDown); + input.classList.add("HideOnPopup"); + if (vertical) input.classList.add("Vertical"); + document.body.appendChild(input); + Object.assign(input.style, KDTextBoxStyle); + return input; + } +} + +/** + * Creates a dropdown element and adjusts it to the BC look and feel. In the HTML Code this will look like this: + *
-- enclosing div used for css and postioning + * + *
-- the div representing the currently selected item + *
-- div for the various options + *
Option 1
+ *
Option n
+ *
+ *
+ * This construct is built automatically and ignores the original select statement. All the logic is handled by + * event handlers that are connected to the various divs. See comments in the code. + * What this function cannot handle at the moment: + * - The size is always set to 1 + * - Multiple selects are impossible + * @param ID - The name of the select item. The outer div will get this name, for positioning. The select + * tag will get the name ID+"-select" + * @param Options - The list of options for the current select statement + * @param ClickEventListener - An event listener to be called, when the value of the drop down box changes + */ +function ElementCreateDropdown(ID: string, Options: string[], ClickEventListener: EventListenerOrEventListenerObject = null): void { + if (document.getElementById(ID) == null) { + // Create the all enclosing
+ var CustomSelect = document.createElement("DIV"); + CustomSelect.setAttribute("class", "custom-select"); + CustomSelect.setAttribute("ID", ID); + // Create the tag + if (ClickEventListener != null) Select.addEventListener("change", ClickEventListener); + // Add alle the items to the enclosing + CustomSelect.appendChild(Select); + CustomSelect.appendChild(SelectedItem); + CustomSelect.appendChild(DivOptions); + document.body.appendChild(CustomSelect); + document.addEventListener("click", ElementCloseAllSelect); + } +} + +/** + * Closes all select boxes in the current document, except the current select box + * @param elmnt - The select box to exclude from the closing + */ +function ElementCloseAllSelect(elmnt: object): void { + /*a function that will close all select boxes in the document, + except the current select box:*/ + var arrNo = []; + var y = document.getElementsByClassName("select-selected"); + for (let i = 0; i < y.length; i++) { + if (elmnt == y[i]) arrNo.push(i); + } + var x = document.getElementsByClassName("select-items"); + for (let i = 0; i < x.length; i++) { + if (arrNo.indexOf(i)) x[i].classList.add("select-hide"); + } +} + +/** + * Creates a new div element in the main document. Does not create a new element if there is already an existing one with the same ID + * @param ID - The id of the div tag to create. + */ +function ElementCreateDiv(ID: string): void { + if (document.getElementById(ID) == null) { + var Div = document.createElement("div"); + Div.setAttribute("ID", ID); + Div.setAttribute("name", ID); + Div.setAttribute("screen-generated", CurrentScreen); + //Div.addEventListener("keydown", KeyDown); + Div.className = "HideOnPopup"; + document.body.appendChild(Div); + } +} + +/** + * Removes an element from the main document + * @param ID - The id of the tag to remove from the document. + */ +function ElementRemove(ID: string): void { + if (document.getElementById(ID) != null) + document.getElementById(ID).parentNode.removeChild(document.getElementById(ID)); +} + +/** + * Draws an existing HTML element at a specific position within the document. The element is "centered" on the given coordinates by dividing its height and width by two. + * @param ElementID - The id of the input tag to (re-)position. + * @param X - Center point of the element on the X axis. + * @param Y - Center point of the element on the Y axis. + * @param W - Width of the element. + * @param H - Height of the element. + */ +function ElementPosition(ElementID: string, X: number, Y: number, W: number, H: number = null) { + var E = document.getElementById(ElementID); + + if (!E) { + console.warn("A call to ElementPosition was made on non-existent element with ID '" + ElementID + "'"); + return; + } + + // For a vertical slider, swap the width and the height (the transformation is handled by CSS) + if (E.tagName.toLowerCase() === "input" && E.getAttribute("type") === "range" && E.classList.contains("Vertical")) { + var tmp = W; + W = H; + H = tmp; + } + + // Different positions based on the width/height ratio + const HRatio = PIXICanvas.clientHeight / 1000; + const WRatio = PIXICanvas.clientWidth / 2000; + const Font = PIXICanvas.clientWidth <= PIXICanvas.clientHeight * 2 ? PIXICanvas.clientWidth / 50 : PIXICanvas.clientHeight / 25; + const Height = H ? H * HRatio : Font * 1.15; + const Width = W * WRatio - 18; + const Top = PIXICanvas.offsetTop + Y * HRatio - Height / 2; + const Left = PIXICanvas.offsetLeft + (X - W / 2) * WRatio; + + // Sets the element style + Object.assign(E.style, { + fontSize: Font + "px", + fontFamily: KDTextBoxStyle.fontFamily, + position: "fixed", + left: Left + "px", + top: Top + "px", + width: Width + "px", + height: Height + "px", + display: "inline" + }); +} + +/** + * Draws an existing HTML element at a specific position within the document. The element will not be centered on its given coordinates unlike the ElementPosition function. + * @param ElementID - The id of the input tag to (re-)position. + * @param Font - The size of the font to use. + * @param X - Starting point of the element on the X axis. + * @param Y - Starting point of the element on the Y axis. + * @param W - Width of the element. + * @param H - Height of the element. + */ +function ElementPositionFix(ElementID: string, Font: number, X: number, Y: number, W: number, H: number): void { + var E = document.getElementById(ElementID); + // Verify the element exists + if (!E) { + console.warn("A call to ElementPositionFix was made on non-existent element with ID '" + ElementID + "'"); + return; + } + + // Different positions based on the width/height ratio + const HRatio = PIXICanvas.clientHeight / 1000; + const WRatio = PIXICanvas.clientWidth / 2000; + Font *= Math.max(HRatio, WRatio); + const Top = PIXICanvas.offsetTop + Y * HRatio; + const Height = H * HRatio; + const Left = PIXICanvas.offsetLeft + X * WRatio; + const Width = W * WRatio; + + // Sets the element style + Object.assign(E.style, { + fontSize: Font + "px", + fontFamily: KDTextBoxStyle.fontFamily, + position: "fixed", + left: Left + "px", + top: Top + "px", + width: Width + "px", + height: Height + "px", + display: "inline" + }); + +} + +/** + * Sets a custom data-attribute to a specified value on a specified element + * @param ID - The id of the element to create/set the data attribute of. + * @param Name - Name of the data attribute. ("data-" will be automatically appended to it.) + * @param Value - Value to give to the attribute. + */ +function ElementSetDataAttribute(ID: string, Name: string, Value: string): void { + var element = document.getElementById(ID); + if (element != null) { + element.setAttribute(("data-" + Name).toLowerCase(), Value.toString().toLowerCase()); + } +} + +/** + * Sets an attribute to a specified value on a specified element + * @param ID - The id of the element to create/set the data attribute of. + * @param Name - Name of the attribute. + * @param Value - Value to give to the attribute. + */ +function ElementSetAttribute(ID: string, Name: string, Value: string): void { + var element = document.getElementById(ID); + if (element != null) { + element.setAttribute(Name, Value); + } +} + +/** + * Scrolls to the end of a specified element + * @param ID - The id of the element to scroll down to the bottom of. + */ +function ElementScrollToEnd(ID: string): void { + var element = document.getElementById(ID); + if (element != null) element.scrollTop = element.scrollHeight; +} + +/** + * Returns the given element's scroll position as a percentage, with the top of the element being close to 0 depending on scroll bar size, and the bottom being around 1. + * To clarify, this is the position of the bottom edge of the scroll bar. + * @param ID - The id of the element to find the scroll percentage of. + * @returns A float representing the scroll percentage. + */ +function ElementGetScrollPercentage(ID: string): number | null { + var element = document.getElementById(ID); + if (element != null) return (element.scrollTop + element.clientHeight) / element.scrollHeight; + + return null; +} + +/** + * Checks if a given HTML element is scrolled to the very bottom. + * @param ID - The id of the element to check for scroll height. + * @returns Returns TRUE if the specified element is scrolled to the very bottom + */ +function ElementIsScrolledToEnd(ID: string): boolean { + var element = document.getElementById(ID); + return element != null && element.scrollHeight - element.scrollTop - element.clientHeight < 1; +} + +/** + * Gives focus to a specified existing element for non-mobile users. + * @param ID - The id of the element to give focus to. + */ +function ElementFocus(ID: string): void { + if ((document.getElementById(ID) != null) && !CommonIsMobile) + document.getElementById(ID).focus(); +} + +/** + * Toggles HTML elements that were created by a given screen. When toggled off, they are hidden (not removed) + * @param Screen - Screen for which to hide the elements generated + * @param ShouldDisplay - TRUE if we are toggling on the elements, FALSE if we are hiding them. + */ +function ElementToggleGeneratedElements(Screen: string, ShouldDisplay: boolean): void { + const generatedElements = Array.from(document.querySelectorAll(`[screen-generated="${Screen}"]`)); + generatedElements.forEach((element: HTMLElement) => element.style.display = ShouldDisplay ? '' : 'none'); +} diff --git a/Scripts/ExtendedItem.js b/Scripts/ExtendedItem.js deleted file mode 100644 index 6ba35b0fb..000000000 --- a/Scripts/ExtendedItem.js +++ /dev/null @@ -1,496 +0,0 @@ -"use strict"; -/** - * Utility file for handling extended items - */ - -/** - * A lookup for the current pagination offset for all extended item options. Offsets are only recorded if the extended - * item requires pagination. Example format: - * ```json - * { - * "ItemArms/HempRope": 4, - * "ItemArms/Web": 0 - * } - * ``` - * @type {Record} - * @constant - */ -var ExtendedItemOffsets = {}; - -/** The X & Y co-ordinates of each option's button, based on the number to be displayed per page. */ -const ExtendedXY = [ - [], //0 placeholder - [[1385, 500]], //1 option per page - [[1185, 500], [1590, 500]], //2 options per page - [[1080, 500], [1385, 500], [1695, 500]], //3 options per page - [[1185, 400], [1590, 400], [1185, 700], [1590, 700]], //4 options per page - [[1080, 400], [1385, 400], [1695, 400], [1185, 700], [1590, 700]], //5 options per page - [[1080, 400], [1385, 400], [1695, 400], [1080, 700], [1385, 700], [1695, 700]], //6 options per page - [[1020, 400], [1265, 400], [1510, 400], [1755, 400], [1080, 700], [1385, 700], [1695, 700]], //7 options per page - [[1020, 400], [1265, 400], [1510, 400], [1755, 400], [1020, 700], [1265, 700], [1510, 700], [1755, 700]], //8 options per page -]; - -/** The X & Y co-ordinates of each option's button, based on the number to be displayed per page. */ -const ExtendedXYWithoutImages = [ - [], //0 placeholder - [[1400, 450]], //1 option per page - [[1175, 450], [1425, 450]], //2 options per page - [[1175, 450], [1425, 450], [1675, 450]], //3 options per page - [[1175, 450], [1425, 450], [1175, 525], [1425, 525]], //4 options per page - [[1175, 450], [1425, 450], [1675, 450], [1175, 525], [1425, 525]], //5 options per page - [[1175, 450], [1425, 450], [1675, 450], [1175, 525], [1425, 525], [1675, 525]], //6 options per page - [[1050, 450], [1200, 450], [1450, 450], [1700, 450], [1050, 525], [1200, 525], [1425, 525]], //7 options per page - [[1050, 450], [1200, 450], [1450, 450], [1700, 450], [1050, 525], [1200, 525], [1425, 525], [1675, 525]], //8 options per page -]; - -/** The X & Y co-ordinates of each option's button, based on the number to be displayed per page. */ -const ExtendedXYClothes = [ - [], //0 placeholder - [[1385, 450]], //1 option per page - [[1220, 450], [1550, 450]], //2 options per page - [[1140, 450], [1385, 450], [1630, 450]], //3 options per page - [[1220, 400], [1550, 400], [1220, 700], [1550, 700]], //4 options per page - [[1140, 400], [1385, 400], [1630, 400], [1220, 700], [1550, 700]], //5 options per page - [[1140, 400], [1385, 400], [1630, 400], [1140, 700], [1385, 700], [1630, 700]], //6 options per page -]; - -/** Memoization of the requirements check */ -const ExtendedItemRequirementCheckMessageMemo = CommonMemoize(ExtendedItemRequirementCheckMessage); - -/** - * The current display mode - * @type {boolean} - */ -var ExtendedItemPermissionMode = false; - -/** - * Tracks whether a selected option's subscreen is active - if active, the value is the name of the current subscreen's - * corresponding option - * @type {string|null} - */ -var ExtendedItemSubscreen = null; - -/** - * Loads the item extension properties - * @param {ExtendedItemOption[]} Options - An Array of type definitions for each allowed extended type. The first item - * in the array should be the default option. - * @param {string} DialogKey - The dialog key for the message to display prompting the player to select an extended - * type - * @returns {void} Nothing - */ -function ExtendedItemLoad(Options, DialogKey) { - if (!DialogFocusItem.Property) { - const C = CharacterGetCurrent(); - // Default to the first option if no property is set - let InitialProperty = Options[0].Property; - DialogFocusItem.Property = JSON.parse(JSON.stringify(Options[0].Property)); - - // If the default type is not the null type, check whether the default type is blocked - if (InitialProperty && InitialProperty.Type && InventoryBlockedOrLimited(C, DialogFocusItem, InitialProperty.Type)) { - // If the first option is blocked by the character, switch to the null type option - const InitialOption = Options.find(O => O.Property.Type == null); - if (InitialOption) InitialProperty = InitialOption.Property; - } - - // If there is an initial property, set it and update the character - if (InitialProperty) { - DialogFocusItem.Property = JSON.parse(JSON.stringify(InitialProperty)); - CharacterRefresh(C); - } - } - - if (ExtendedItemSubscreen) { - CommonCallFunctionByNameWarn(ExtendedItemFunctionPrefix() + ExtendedItemSubscreen + "Load"); - return; - } - - if (ExtendedItemOffsets[ExtendedItemOffsetKey()] == null) ExtendedItemSetOffset(0); - - DialogExtendedMessage = DialogFindPlayer(DialogKey); -} - -/** - * Draws the extended item type selection screen - * @param {ExtendedItemOption[]} Options - An Array of type definitions for each allowed extended type. The first item - * in the array should be the default option. - * @param {string} DialogPrefix - The prefix to the dialog keys for the display strings describing each extended type. - * The full dialog key will be - * @param {number} [OptionsPerPage] - The number of options displayed on each page - * @param {boolean} [ShowImages=true] - Denotes wether images should be shown for the specific item - * @returns {void} Nothing - */ -function ExtendedItemDraw(Options, DialogPrefix, OptionsPerPage, ShowImages = true) { - // If an option's subscreen is open, it overrides the standard screen - if (ExtendedItemSubscreen) { - CommonCallFunctionByNameWarn(ExtendedItemFunctionPrefix() + ExtendedItemSubscreen + "Draw"); - return; - } - - const C = CharacterGetCurrent(); - const Asset = DialogFocusItem.Asset; - const ItemOptionsOffset = ExtendedItemGetOffset(); - const XYPositions = !Asset.Group.Clothing ? (ShowImages ? ExtendedXY : ExtendedXYWithoutImages) : ExtendedXYClothes; - const ImageHeight = ShowImages ? 220 : 0; - OptionsPerPage = OptionsPerPage || Math.min(Options.length, XYPositions.length - 1); - - // If we have to paginate, draw the back/next button - if (Options.length > OptionsPerPage) { - const currPage = Math.ceil(ExtendedItemGetOffset() / OptionsPerPage) + 1; - const totalPages = Math.ceil(Options.length / OptionsPerPage); - DrawBackNextButton(1675, 240, 300, 90, DialogFindPlayer("Page") + " " + currPage.toString() + " / " + totalPages.toString(), "White", "", () => "", () => ""); - } - - // Draw the header and item - const Locked = InventoryItemHasEffect(DialogFocusItem, "Lock", true); - DrawAssetPreview(1387, 55, Asset, {Icons: Locked ? ["Locked"] : undefined}); - DrawText(DialogExtendedMessage, 1500, 375, "white", "gray"); - - const CurrentOption = Options.find(O => O.Property.Type === DialogFocusItem.Property.Type); - - // Draw the possible variants and their requirements, arranged based on the number per page - for (let I = ItemOptionsOffset; I < Options.length && I < ItemOptionsOffset + OptionsPerPage; I++) { - const PageOffset = I - ItemOptionsOffset; - const X = XYPositions[OptionsPerPage][PageOffset][0]; - const Y = XYPositions[OptionsPerPage][PageOffset][1]; - - const Option = Options[I]; - const OptionType = Option.Property && Option.Property.Type; - const Hover = MouseIn(X, Y, 225, 55 + ImageHeight) && !CommonIsMobile; - const IsSelected = DialogFocusItem.Property.Type == OptionType; - const IsFavorite = InventoryIsFavorite(ExtendedItemPermissionMode ? Player : C, Asset.Name, Asset.Group.Name, OptionType); - const ButtonColor = ExtendedItemGetButtonColor(C, Option, CurrentOption, Hover, IsSelected); - - DrawButton(X, Y, 225, 55 + ImageHeight, "", ButtonColor, null, null, IsSelected); - if (ShowImages) { - DrawImage(`${AssetGetInventoryPath(Asset)}/${Option.Name}.png`, X + 2, Y); - /** @type {InventoryIcon[]} */ - const icons = []; - if (!C.IsPlayer() && InventoryIsAllowedLimited(C, DialogFocusItem, OptionType)) { - icons.push("AllowedLimited"); - } - const FavoriteDetails = DialogGetFavoriteStateDetails(C, Asset, OptionType); - if (FavoriteDetails && FavoriteDetails.Icon) { - icons.push(FavoriteDetails.Icon); - } - DrawPreviewIcons(icons, X + 2, Y); - } - DrawTextFit((IsFavorite && !ShowImages ? "★ " : "") + DialogFindPlayer(DialogPrefix + Option.Name), X + 112, Y + 30 + ImageHeight, 225, "black"); - if (ControllerActive == true) { - setButton(X + 112, Y + 30 + ImageHeight); - } - } - - // Permission mode toggle - DrawButton(1775, 25, 90, 90, "", "White", - ExtendedItemPermissionMode ? "Icons/DialogNormalMode.png" : "Icons/DialogPermissionMode.png", - DialogFindPlayer(ExtendedItemPermissionMode ? "DialogNormalMode" : "DialogPermissionMode")); -} - -/** - * Determine the background color for the item option's button - * @param {Character} C - The character wearing the item - * @param {ExtendedItemOption} Option - A type for the extended item - * @param {ExtendedItemOption} CurrentOption - The currently selected option for the item - * @param {boolean} Hover - TRUE if the mouse cursor is on the button - * @param {boolean} IsSelected - TRUE if the item's current type matches Option - * @returns {string} The name or hex code of the color - */ -function ExtendedItemGetButtonColor(C, Option, CurrentOption, Hover, IsSelected) { - const IsSelfBondage = C.ID === 0; - let ButtonColor; - if (ExtendedItemPermissionMode) { - const PlayerBlocked = InventoryIsPermissionBlocked( - Player, DialogFocusItem.Asset.DynamicName(Player), DialogFocusItem.Asset.Group.Name, - Option.Property.Type, - ); - const PlayerLimited = InventoryIsPermissionLimited( - Player, DialogFocusItem.Asset.Name, DialogFocusItem.Asset.Group.Name, Option.Property.Type); - - if ((IsSelfBondage && IsSelected) || Option.Property.Type == null) { - ButtonColor = "#888888"; - } else if (PlayerBlocked) { - ButtonColor = Hover ? "red" : "pink"; - } else if (PlayerLimited) { - ButtonColor = Hover ? "orange" : "#fed8b1"; - } else { - ButtonColor = Hover ? "green" : "lime"; - } - } else { - const BlockedOrLimited = InventoryBlockedOrLimited(C, DialogFocusItem, Option.Property.Type); - const FailSkillCheck = !!ExtendedItemRequirementCheckMessageMemo(Option, CurrentOption); - - if (IsSelected && !Option.HasSubscreen) { - ButtonColor = "#888888"; - } else if (BlockedOrLimited) { - ButtonColor = "Red"; - } else if (FailSkillCheck) { - ButtonColor = "Pink"; - } else if (IsSelected && Option.HasSubscreen) { - ButtonColor = Hover ? "Cyan" : "LightGreen"; - } else { - ButtonColor = Hover ? "Cyan" : "White"; - } - } - return ButtonColor; -} - -/** - * Handles clicks on the extended item type selection screen - * @param {ExtendedItemOption[]} Options - An Array of type definitions for each allowed extended type. The first item - * in the array should be the default option. - * @param {number} [OptionsPerPage] - The number of options displayed on each page - * @param {boolean} [ShowImages=true] - Denotes wether images are shown for the specific item - * @returns {void} Nothing - */ -function ExtendedItemClick(Options, OptionsPerPage, ShowImages = true) { - const C = CharacterGetCurrent(); - - // If an option's subscreen is open, pass the click into it - if (ExtendedItemSubscreen) { - CommonCallFunctionByNameWarn(ExtendedItemFunctionPrefix() + ExtendedItemSubscreen + "Click", C, Options); - return; - } - - const ItemOptionsOffset = ExtendedItemGetOffset(); - const IsCloth = DialogFocusItem.Asset.Group.Clothing; - const XYPositions = !IsCloth ? ShowImages ? ExtendedXY : ExtendedXYWithoutImages : ExtendedXYClothes; - const ImageHeight = ShowImages ? 220 : 0; - OptionsPerPage = OptionsPerPage || Math.min(Options.length, XYPositions.length - 1); - - // Exit button - if (MouseIn(1885, 25, 90, 90)) { - DialogFocusItem = null; - ExtendedItemPermissionMode = false; - ExtendedItemExit(); - return; - } - - // Permission toggle button - if (MouseIn(1775, 25, 90, 90)) { - ExtendedItemPermissionMode = !ExtendedItemPermissionMode; - } - - // Pagination buttons - if (MouseIn(1675, 240, 150, 90) && Options.length > OptionsPerPage) { - if (ItemOptionsOffset - OptionsPerPage < 0) ExtendedItemSetOffset(OptionsPerPage * (Math.ceil(Options.length / OptionsPerPage) - 1)); - else ExtendedItemSetOffset(ItemOptionsOffset - OptionsPerPage); - } - else if (MouseIn(1825, 240, 150, 90) && Options.length > OptionsPerPage) { - if (ItemOptionsOffset + OptionsPerPage >= Options.length) ExtendedItemSetOffset(0); - else ExtendedItemSetOffset(ItemOptionsOffset + OptionsPerPage); - } - - // Options - for (let I = ItemOptionsOffset; I < Options.length && I < ItemOptionsOffset + OptionsPerPage; I++) { - const PageOffset = I - ItemOptionsOffset; - const X = XYPositions[OptionsPerPage][PageOffset][0]; - const Y = XYPositions[OptionsPerPage][PageOffset][1]; - const Option = Options[I]; - if (MouseIn(X, Y, 225, 55 + ImageHeight)) { - ExtendedItemHandleOptionClick(C, Options, Option); - } - } -} - -/** - * Exit function for the extended item dialog. - * Mainly removes the cache from memory - * @returns {void} - Nothing - */ -function ExtendedItemExit() { - // invalidate the cache - ExtendedItemRequirementCheckMessageMemo.clearCache(); - - // Run the subscreen's Exit function if any - if (ExtendedItemSubscreen) { - CommonCallFunctionByName(ExtendedItemFunctionPrefix() + ExtendedItemSubscreen + "Exit"); - } -} - -/** - * Handler function for setting the type of an extended item - * @param {Character} C - The character wearing the item - * @param {ExtendedItemOption[]} Options - An Array of type definitions for each allowed extended type. The first item - * in the array should be the default option. - * @param {ExtendedItemOption} Option - The selected type definition - * @returns {void} Nothing - */ -function ExtendedItemSetType(C, Options, Option) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - const FunctionPrefix = ExtendedItemFunctionPrefix() + (ExtendedItemSubscreen || ""); - - if (CurrentScreen == "ChatRoom") { - // Call the item's load function - CommonCallFunctionByName(FunctionPrefix + "Load"); - } - - const IsCloth = DialogFocusItem.Asset.Group.Clothing; - const previousOption = TypedItemFindPreviousOption(DialogFocusItem, Options); - - TypedItemSetOption(C, DialogFocusItem, Options, Option, !IsCloth); // Do not sync appearance while in the wardrobe - - // For a restraint, we might publish an action, change the expression or change the dialog of a NPC - if (!IsCloth) { - // If the item triggers an expression, start the expression change - if (Option.Expression) { - InventoryExpressionTriggerApply(C, Option.Expression); - } - - CommonCallFunctionByName(FunctionPrefix + "Exit"); - DialogFocusItem = null; - if (C.ID === 0) { - // Player is using the item on herself - DialogMenuButtonBuild(C); - } else { - // Otherwise, call the item's NPC dialog function, if one exists - CommonCallFunctionByName(FunctionPrefix + "NpcDialog", C, Option, previousOption); - C.FocusGroup = null; - } - } -} - -/** - * Handler function called when an option on the type selection screen is clicked - * @param {Character} C - The character wearing the item - * @param {ExtendedItemOption[]} Options - An Array of type definitions for each allowed extended type. The first item - * in the array should be the default option. - * @param {ExtendedItemOption} Option - The selected type definition - * @returns {void} Nothing - */ -function ExtendedItemHandleOptionClick(C, Options, Option) { - if (ExtendedItemPermissionMode) { - if (Option.Property.Type == null) return; - const worn = C.ID == 0 && DialogFocusItem.Property.Type == Option.Property.Type; - InventoryTogglePermission(DialogFocusItem, Option.Property.Type, worn); - } else { - if (DialogFocusItem.Property.Type === Option.Property.Type && !Option.HasSubscreen) { - return; - } - - const CurrentType = DialogFocusItem.Property.Type || null; - const CurrentOption = Options.find(O => O.Property.Type === CurrentType); - // use the unmemoized function to ensure we make a final check to the requirements - const RequirementMessage = ExtendedItemRequirementCheckMessage(Option, CurrentOption); - if (RequirementMessage) { - DialogExtendedMessage = RequirementMessage; - } else if (Option.HasSubscreen) { - ExtendedItemSubscreen = Option.Name; - CommonCallFunctionByNameWarn(ExtendedItemFunctionPrefix() + ExtendedItemSubscreen + "Load", C, Option); - } else { - ExtendedItemSetType(C, Options, Option); - ExtendedItemExit(); - } - } -} - -/** - * Checks whether the player meets the requirements for an extended type option. This will check against their Bondage - * skill if applying the item to another character, or their Self Bondage skill if applying the item to themselves. - * @param {ExtendedItemOption|ModularItemOption} Option - The selected type definition - * @param {ExtendedItemOption|ModularItemOption} CurrentOption - The current type definition - * @returns {string|null} null if the player meets the option requirements. Otherwise a string message informing them - * of the requirements they do not meet - */ -function ExtendedItemRequirementCheckMessage(Option, CurrentOption) { - const C = CharacterGetCurrent(); - return TypedItemValidateOption(C, DialogFocusItem, Option, CurrentOption) - || ExtendedItemCheckSelfSelect(C, Option) - || ExtendedItemCheckSkillRequirements(C, DialogFocusItem, Option); -} - -/** - * Checks whether the player is able to select an option based on it's self-selection criteria (whether or not the - * wearer may select the option) - * @param {Character} C - The character on whom the bondage is applied - * @param {ExtendedItemOption | ModularItemOption} Option - The option whose requirements should be checked against - * @returns {string | undefined} - undefined if the - */ -function ExtendedItemCheckSelfSelect(C, Option) { - if (C.ID === 0 && Option.AllowSelfSelect === false) { - return DialogFindPlayer("CannotSelfSelect"); - } -} - -/** - * Checks whether the player meets an option's self-bondage/bondage skill level requirements - * @param {Character} C - The character on whom the bondage is applied - * @param {Item} Item - The item whose options are being checked - * @param {ExtendedItemOption|ModularItemOption} Option - The option whose requirements should be checked against - * @returns {string|undefined} - undefined if the player meets the option's skill level requirements. Otherwise returns - * a string message informing them of the requirements they do not meet. - */ -function ExtendedItemCheckSkillRequirements(C, Item, Option) { - return ""; -} - -/** - * Checks whether a change from the given current option to the newly selected option is valid. - * @param {Character} C - The character wearing the item - * @param {Item} Item - The extended item to validate - * @param {ExtendedItemOption|ModularItemOption} Option - The selected option - * @param {ExtendedItemOption|ModularItemOption} CurrentOption - The currently applied option on the item - * @returns {string} - Returns a non-empty message string if the item failed validation, or an empty string otherwise - */ -function ExtendedItemValidate(C, Item, { Prerequisite, Property }, CurrentOption) { - return ""; -} - -/** - * Simple getter for the function prefix used for the currently focused extended item - used for calling standard - * extended item functions (e.g. if the currently focused it is the hemp rope arm restraint, this will return - * "InventoryItemArmsHempRope", allowing functions like InventoryItemArmsHempRopeLoad to be called) - * @returns {string} The extended item function prefix for the currently focused item - */ -function ExtendedItemFunctionPrefix() { - var Asset = DialogFocusItem.Asset; - return "Inventory" + Asset.Group.Name + Asset.Name; -} - -/** - * Simple getter for the key of the currently focused extended item in the ExtendedItemOffsets lookup - * @returns {string} The offset lookup key for the currently focused extended item - */ -function ExtendedItemOffsetKey() { - var Asset = DialogFocusItem.Asset; - return Asset.Group.Name + "/" + Asset.Name; -} - -/** - * Gets the pagination offset of the currently focused extended item - * @returns {number} The pagination offset for the currently focused extended item - */ -function ExtendedItemGetOffset() { - return ExtendedItemOffsets[ExtendedItemOffsetKey()]; -} - -/** - * Sets the pagination offset for the currently focused extended item - * @param {number} Offset - The new offset to set - * @returns {void} Nothing - */ -function ExtendedItemSetOffset(Offset) { - ExtendedItemOffsets[ExtendedItemOffsetKey()] = Offset; -} - -/** - * Maps a chat tag to a dictionary entry for use in item chatroom messages. - * @param {Character} C - The target character - * @param {Asset} asset - The asset for the typed item - * @param {CommonChatTags} tag - The tag to map to a dictionary entry - * @returns {object} - The constructed dictionary entry for the tag - */ -function ExtendedItemMapChatTagToDictionaryEntry(C, asset, tag) { - switch (tag) { - case CommonChatTags.SOURCE_CHAR: - return { Tag: tag, Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }; - case CommonChatTags.DEST_CHAR: - case CommonChatTags.DEST_CHAR_NAME: - case CommonChatTags.TARGET_CHAR: - case CommonChatTags.TARGET_CHAR_NAME: - return { Tag: tag, Text: CharacterNickname(C), MemberNumber: C.MemberNumber }; - case CommonChatTags.ASSET_NAME: - return { Tag: tag, AssetName: asset.Name }; - default: - return null; - } -} diff --git a/Scripts/GLDraw.js b/Scripts/GLDraw.js deleted file mode 100644 index 87dbfbea5..000000000 --- a/Scripts/GLDraw.js +++ /dev/null @@ -1,581 +0,0 @@ -"use strict"; - -/** @type {Map} */ -var GLDrawImageCache = new Map(); - -var GLDrawCacheLoadedImages = 0; -var GLDrawCacheTotalImages = 0; - -/** @type {"webgl2"|"webgl"|"No WebGL"} */ -var GLVersion; - -var GLDrawCanvas; - -/** - * How many seconds to wait before forcefully resetting the canvas after a - * context loss - */ -const GLDrawContextResetSeconds = 10; -/** - * The cooldown in seconds after resetting the canvas. If another context loss - * happens in this cooldown, we'll revert to canvas2d rendering - */ -const GLDrawRevertToDraw2DSeconds = 50; - -let GLDrawContextLostTimeout; -let GLDrawRecoveryMode = false; -let GLDrawCrashTimeout; - -var GLDrawAlphaThreshold = 0.01; -var GLDrawHalfAlphaLow = 0.8 / 256.0; -var GLDrawHalfAlphaHigh = 1.2 / 256.0; - -window.addEventListener('load', GLDrawLoad); - -/** - * Loads WebGL, if not available, use the old canvas engine - * @returns {void} - Nothing - */ -function GLDrawLoad() { - GLDrawCanvas = document.createElement("canvas"); - GLDrawCanvas.width = 1000; - GLDrawCanvas.height = CanvasDrawHeight; - GLVersion = "webgl2"; - let gl = GLDrawCanvas.getContext(GLVersion, GLDrawGetOptions()); - if (!gl) { GLVersion = "webgl"; gl = GLDrawCanvas.getContext(GLVersion, GLDrawGetOptions()); } - if (!gl) { GLVersion = "No WebGL"; GLDrawCanvas.remove(); GLDrawCanvas = null; return; } - - GLDrawCanvas = GLDrawInitCharacterCanvas(GLDrawCanvas); - - // Attach context listeners - GLDrawCanvas.addEventListener("webglcontextlost", GLDrawOnContextLost, false); - GLDrawCanvas.addEventListener("webglcontextrestored", GLDrawOnContextRestored, false); -} - -/** - * Gets the graphical options saved in the player's local storage. - * @returns {WebGLContextAttributes} - WebG context attributes based on saved settings - */ -function GLDrawGetOptions() { - let antialias = true; - /** @type {WebGLPowerPreference} */ - let powerPreference = "default"; - - if (localStorage.getItem("GLDraw-antialiasOff")) antialias = false; - let savedPowerMode = localStorage.getItem("GLDraw-powerPreference"); - if (savedPowerMode && (savedPowerMode == "high-performance" || savedPowerMode == "low-power")) { - powerPreference = savedPowerMode; - } - - return { antialias, powerPreference}; -} - -/** - * Handler for WebGL context lost events - * @param {WebGLContextEvent} event - * @returns {void} - Nothing - */ -function GLDrawOnContextLost(event) { - event.preventDefault(); - console.log("WebGL Drawing disabled: Context Lost. If the context does not restore itself, refresh your page."); - - if (GLDrawRecoveryMode) { - // If the context has been lost again whilst in crash cooldown, revert to canvas2d drawing - return GLDrawRevertToCanvas2D(); - } - - GLDrawContextLostTimeout = setTimeout(() => { - // If the context has not been automatically restored after - console.log(`Context not restored after ${GLDrawContextResetSeconds} seconds... resetting canvas.`); - GLDrawResetCanvas(); - - // After forcefully resetting the canvas, we're in crash cooldown mode - GLDrawRecoveryMode = true; - GLDrawCrashTimeout = setTimeout(() => GLDrawRecoveryMode = false, GLDrawRevertToDraw2DSeconds * 1000); - }, GLDrawContextResetSeconds * 1000); -} - -/** - * Restores the original CharacterAppearanceBuildCanvas function, and cleans up any GLDraw resources. - * @returns {void} - Nothing - */ -function GLDrawRevertToCanvas2D() { - const seconds = GLDrawContextResetSeconds + GLDrawRevertToDraw2DSeconds; - console.log(`WebGL context lost twice within ${seconds} seconds - reverting to canvas2D rendering`); - clearTimeout(GLDrawCrashTimeout); - GLDrawCanvas.remove(); - GLDrawImageCache.clear(); - GLDrawRebuildCharacters(); -} - -/** - * Handler for WebGL context restored events - * @returns {void} - Nothing - */ -function GLDrawOnContextRestored() { - console.log("WebGL: Context restored."); - clearTimeout(GLDrawContextLostTimeout); - GLDrawLoad(); - GLDrawRebuildCharacters(); -} - -/** - * Removes the current GLDraw canvas, clears the image cache, and reloads a fresh canvas. - * @returns {void} - Nothing - */ -function GLDrawResetCanvas() { - GLDrawCanvas.remove(); - GLDrawImageCache.clear(); - GLDrawLoad(); - GLDrawRebuildCharacters(); -} - -/** - * Rebuilds the canvas for any characters that are currently on screen. - * @returns {void} - Nothing - */ -function GLDrawRebuildCharacters() { - for (const C of DrawLastCharacters) { - CharacterAppearanceBuildCanvas(C); - } -} - -/** - * Makes all programs and shaders on the GL context - * @param {WebGL2RenderingContext} gl - The WebGL context of the canvas - * @returns {void} - Nothing - */ -function GLDrawMakeGLProgam(gl) { - const vertexShader = GLDrawCreateShader(gl, GLDrawVertexShaderSource, gl.VERTEX_SHADER); - const fragmentShader = GLDrawCreateShader(gl, GLDrawFragmentShaderSource, gl.FRAGMENT_SHADER); - const fragmentShaderFullAlpha = GLDrawCreateShader(gl, GLDrawFragmentShaderSourceFullAlpha, gl.FRAGMENT_SHADER); - const fragmentShaderHalfAlpha = GLDrawCreateShader(gl, GLDrawFragmentShaderSourceHalfAlpha, gl.FRAGMENT_SHADER); - - gl.program = GLDrawCreateProgram(gl, vertexShader, fragmentShader); - gl.programFull = GLDrawCreateProgram(gl, vertexShader, fragmentShaderFullAlpha); - gl.programHalf = GLDrawCreateProgram(gl, vertexShader, fragmentShaderHalfAlpha); - - gl.program.u_alpha = gl.getUniformLocation(gl.program, "u_alpha"); - gl.programFull.u_color = gl.getUniformLocation(gl.programFull, "u_color"); - gl.programHalf.u_color = gl.getUniformLocation(gl.programHalf, "u_color"); - - gl.textureCache = new Map(); - gl.maskCache = new Map(); -} - -/** - * Initializes a WebGL canvas for characters - * @param {HTMLCanvasElement} [canvas] - The canvas used to draw characters on - * @returns {HTMLCanvasElement} - The prepared canvas - */ -function GLDrawInitCharacterCanvas(canvas) { - if (canvas == null) { - canvas = document.createElement("canvas"); - canvas.width = 1000; - canvas.height = CanvasDrawHeight; - } - if (canvas.GL == null) { - canvas.GL = canvas.getContext(GLVersion); - if (canvas.GL == null) { - canvas.remove(); - return GLDrawInitCharacterCanvas(null); - } - } else { - GLDrawClearRect(canvas.GL, 0, 0, 1000, CanvasDrawHeight); - } - if (canvas.GL.program == null) { - GLDrawMakeGLProgam(canvas.GL); - } - return canvas; -} - -/** - * Source used for the Vertex Shader - * @constant - * @type {string} - */ -var GLDrawVertexShaderSource = ` - attribute vec4 a_position; - attribute vec2 a_texcoord; - - uniform mat4 u_matrix; - - varying vec2 v_texcoord; - - void main() { - gl_Position = u_matrix * a_position; - v_texcoord = a_texcoord; - } -`; - -/** - * Source used for the Fragment Shader - * @constant - * @type {string} - */ -var GLDrawFragmentShaderSource = ` - precision mediump float; - - varying vec2 v_texcoord; - - uniform sampler2D u_texture; - uniform sampler2D u_alpha_texture; - uniform float u_alpha; - - void main() { - vec4 texColor = texture2D(u_texture, v_texcoord); - vec4 alphaColor = texture2D(u_alpha_texture, v_texcoord); - if (texColor.w < ` + GLDrawAlphaThreshold + `) discard; - if (alphaColor.w < ` + GLDrawAlphaThreshold + `) discard; - gl_FragColor = texColor; - gl_FragColor.a *= u_alpha; - } -`; - -/** - * Source used for the Full Alpha Shader - * @constant - * @type {string} - */ -var GLDrawFragmentShaderSourceFullAlpha = ` - precision mediump float; - - varying vec2 v_texcoord; - - uniform sampler2D u_texture; - uniform sampler2D u_alpha_texture; - uniform vec4 u_color; - - void main() { - vec4 texColor = texture2D(u_texture, v_texcoord); - vec4 alphaColor = texture2D(u_alpha_texture, v_texcoord); - if (texColor.w < ` + GLDrawAlphaThreshold + `) discard; - if (alphaColor.w < ` + GLDrawAlphaThreshold + `) discard; - float t = (texColor.x + texColor.y + texColor.z) / 383.0; - gl_FragColor = u_color * vec4(t, t, t, texColor.w); - } -`; - -/** - * Source used for the Half Alpha Shader - * @constant - * @type {string} - */ -var GLDrawFragmentShaderSourceHalfAlpha = ` - precision mediump float; - - varying vec2 v_texcoord; - - uniform sampler2D u_texture; - uniform sampler2D u_alpha_texture; - uniform vec4 u_color; - - void main() { - vec4 texColor = texture2D(u_texture, v_texcoord); - vec4 alphaColor = texture2D(u_alpha_texture, v_texcoord); - if (texColor.w < ` + GLDrawAlphaThreshold + `) discard; - if (alphaColor.w < ` + GLDrawAlphaThreshold + `) discard; - float t = (texColor.x + texColor.y + texColor.z) / 383.0; - if (t < ` + GLDrawHalfAlphaLow + ` || t > ` + GLDrawHalfAlphaHigh + `) { - gl_FragColor = texColor; - } else { - gl_FragColor = u_color * vec4(t, t, t, texColor.w); - } - } -`; - -/** - * Creates a shader for the current WebGL context from a given source - * @param {WebGL2RenderingContext} gl - WebGL context - * @param {string} source - Source of the shader to create - * @param {GLenum} type - The type of the shader to create - * @returns {WebGLShader} - The created WebGL shader - */ -function GLDrawCreateShader(gl, source, type) { - const shader = gl.createShader(type); - gl.shaderSource(shader, source); - gl.compileShader(shader); - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - throw new Error('Could not compile WebGL program. \n\n' + gl.getShaderInfoLog(shader)); - } - return shader; -} - -/** - * Creates the WebGL program from the vertex and fragment shaders - * @param {WebGL2RenderingContext} gl - WebGL context - * @param {WebGLShader} vertexShader - The vertex shader to create the program with - * @param {WebGLShader} fragmentShader - The fragment shader to create the program with - * @returns {WebGLProgram} - The created WebGL program - */ -function GLDrawCreateProgram(gl, vertexShader, fragmentShader) { - const program = gl.createProgram(); - gl.attachShader(program, vertexShader); - gl.attachShader(program, fragmentShader); - gl.linkProgram(program); - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { - throw new Error('Could not compile WebGL program. \n\n' + gl.getProgramInfoLog(program)); - } - - program.a_position = gl.getAttribLocation(program, "a_position"); - program.a_texcoord = gl.getAttribLocation(program, "a_texcoord"); - - program.u_matrix = gl.getUniformLocation(program, "u_matrix"); - program.u_texture = gl.getUniformLocation(program, "u_texture"); - program.u_alpha_texture = gl.getUniformLocation(program, "u_alpha_texture"); - - program.position_buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, program.position_buffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1,]), gl.STATIC_DRAW); - - program.texcoord_buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, program.texcoord_buffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1,]), gl.STATIC_DRAW); - - return program; -} - -/** - * Draws an image from a given url to a WebGLRenderingContext, used when the character is blinking - * @param {string} url - URL of the image to render - * @param {WebGL2RenderingContext} gl - WebGL context - * @param {number} dstX - Position of the image on the X axis - * @param {number} dstY - Position of the image on the Y axis - * @param {string} color - Color of the image to draw - * @param {boolean} fullAlpha - Whether or not the full alpha should be rendered - * @param {RectTuple[]} alphaMasks - A list of alpha masks to apply to the asset - * @param {number} opacity - The opacity at which to draw the image - * @returns {void} - Nothing - */ -function GLDrawImageBlink(url, gl, dstX, dstY, color, fullAlpha, alphaMasks, opacity, rotate) { - GLDrawImage(url, gl, dstX, dstY, GLDrawCanvasBlinkOffset, color, fullAlpha, alphaMasks, opacity, rotate); -} - -/** - * Draws an image from a given url to a WebGLRenderingContext - * @param {string} url - URL of the image to render - * @param {WebGL2RenderingContext} gl - WebGL context - * @param {number} dstX - Position of the image on the X axis - * @param {number} dstY - Position of the image on the Y axis - * @param {number} offsetX - Additional offset to add to the X axis (for blinking) - * @param {string} color - Color of the image to draw - * @param {boolean} fullAlpha - Whether or not the full alpha should be rendered - * @param {RectTuple[]} alphaMasks - A list of alpha masks to apply to the asset - * @param {number} [opacity=1] - The opacity at which to draw the image - * @param {boolean} [rotate=false] - If the image should be rotated by 180 degrees - * @returns {void} - Nothing - */ -function GLDrawImage(url, gl, dstX, dstY, offsetX, color, fullAlpha, alphaMasks, opacity, rotate = false) { - offsetX = offsetX || 0; - opacity = typeof opacity === "number" ? opacity : 1; - const tex = GLDrawLoadImage(gl, url); - const mask = GLDrawLoadMask(gl, tex.width, tex.height, dstX, dstY, alphaMasks); - if (rotate) dstX = 500 - dstX; - const sign = rotate ? -1 : 1; - - const program = (color == null) ? gl.program : (fullAlpha ? gl.programFull : gl.programHalf); - - gl.useProgram(program); - - gl.enable(gl.BLEND); - gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - - gl.bindBuffer(gl.ARRAY_BUFFER, program.position_buffer); - gl.enableVertexAttribArray(program.a_position); - gl.vertexAttribPointer(program.a_position, 2, gl.FLOAT, false, 0, 0); - gl.bindBuffer(gl.ARRAY_BUFFER, program.texcoord_buffer); - gl.enableVertexAttribArray(program.a_texcoord); - gl.vertexAttribPointer(program.a_texcoord, 2, gl.FLOAT, false, 0, 0); - - let matrix = m4.orthographic(0, gl.canvas.width, gl.canvas.height, 0, -1, 1); - matrix = m4.translate(matrix, dstX + offsetX, dstY, 0); - matrix = m4.scale(matrix, sign * tex.width, sign * tex.height, 1); - - gl.uniformMatrix4fv(program.u_matrix, false, matrix); - gl.uniform1i(program.u_texture, 0); - gl.uniform1i(program.u_alpha_texture, 1); - if (program.u_alpha != null) gl.uniform1f(program.u_alpha, opacity); - - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, tex.texture); - gl.activeTexture(gl.TEXTURE1); - gl.bindTexture(gl.TEXTURE_2D, mask); - - if (program.u_color != null) gl.uniform4fv(program.u_color, GLDrawHexToRGBA(color, opacity)); - - gl.drawArrays(gl.TRIANGLES, 0, 6); -} - -/** - * Draws a canvas on the WebGL canvas - * @param {WebGL2RenderingContext} gl - WebGL context - * @param {HTMLImageElement | HTMLCanvasElement} Img - Canvas to get the data of - * @param {number} X - Position of the image on the X axis - * @param {number} Y - Position of the image on the Y axis - * @param {number} blinkOffset - Offset for the blink canvas - * @param {RectTuple[]} alphaMasks - A list of alpha masks to apply to the asset - */ -function GLDraw2DCanvas(gl, Img, X, Y, blinkOffset, alphaMasks) { - const TempCanvasName = Img.getAttribute("name"); - gl.textureCache.delete(TempCanvasName); - GLDrawImageCache.set(TempCanvasName, Img); - GLDrawImage(TempCanvasName, gl, X, Y, blinkOffset, null, null, alphaMasks); -} - -/** - * Sets texture info from image data - * @param {WebGLRenderingContext} gl - WebGL context - * @param {HTMLImageElement} Img - Image to get the data of - * @param {{ width: number; height: number; texture: WebGLTexture; }} textureInfo - Texture information - * @returns {void} - Nothing - */ -function GLDrawBingImageToTextureInfo(gl, Img, textureInfo) { - textureInfo.width = Img.width; - textureInfo.height = Img.height; - gl.bindTexture(gl.TEXTURE_2D, textureInfo.texture); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, Img); -} - -/** - * Loads image texture data - * @param {WebGL2RenderingContext} gl - WebGL context - * @param {string} url - URL of the image - * @returns {{ width: number; height: number; texture: WebGLTexture; }} - The texture info of a given image - */ -function GLDrawLoadImage(gl, url) { - - let textureInfo = gl.textureCache.get(url); - - if (!textureInfo) { - const tex = gl.createTexture(); - - gl.bindTexture(gl.TEXTURE_2D, tex); - /** @type { { width: number; height: number; texture: WebGLTexture; } } */ - textureInfo = { width: 1, height: 1, texture: tex, }; - gl.textureCache.set(url, textureInfo); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - - let Img = GLDrawImageCache.get(url); - - if (Img) { - GLDrawBingImageToTextureInfo(gl, Img, textureInfo); - } else { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0])); - Img = new Image(); - GLDrawImageCache.set(url, Img); - - ++GLDrawCacheTotalImages; - Img.addEventListener('load', function () { - GLDrawBingImageToTextureInfo(gl, Img, textureInfo); - ++GLDrawCacheLoadedImages; - if (GLDrawCacheLoadedImages == GLDrawCacheTotalImages) { Player.MustDraw = true; CharacterLoadCanvasAll(); } - }); - Img.addEventListener('error', function () { - if (Img.errorcount == null) Img.errorcount = 0; - Img.errorcount += 1; - if (Img.errorcount < 3) { - // eslint-disable-next-line no-self-assign - Img.src = Img.src; - } else { - console.log("Error loading image " + Img.src); - ++GLDrawCacheLoadedImages; - if (GLDrawCacheLoadedImages == GLDrawCacheTotalImages) CharacterLoadCanvasAll(); - } - }); - Img.src = KDModFiles[url] || url; - } - } - return textureInfo; -} - -/** - * Loads alpha mask data - * @param {WebGL2RenderingContext} gl - The WebGL context - * @param {number} texWidth - The width of the texture to mask - * @param {number} texHeight - The height of the texture to mask - * @param {number} offsetX - The X offset at which the texture is to be drawn on the target canvas - * @param {number} offsetY - The Y offset at which the texture is to be drawn on the target canvas - * @param {RectTuple[]} alphaMasks - A list of alpha masks to apply to the asset - * @return {WebGLTexture} - The WebGL texture corresponding to the mask - */ -function GLDrawLoadMask(gl, texWidth, texHeight, offsetX, offsetY, alphaMasks) { - alphaMasks = alphaMasks || []; - const key = alphaMasks.length ? JSON.stringify([texWidth, texHeight, offsetX, offsetY, alphaMasks]) : null; - let mask = gl.maskCache.get(key); - - if (!mask) { - const tmpCanvas = document.createElement("canvas"); - tmpCanvas.width = texWidth; - tmpCanvas.height = texHeight; - const ctx = tmpCanvas.getContext("2d"); - ctx.fillRect(0, 0, texWidth, texHeight); - alphaMasks.forEach(([x, y, w, h]) => ctx.clearRect(x - offsetX, y - offsetY, w, h)); - - mask = gl.createTexture(); - - gl.bindTexture(gl.TEXTURE_2D, mask); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, tmpCanvas); - - gl.maskCache.set(key, mask); - } - return mask; -} - -/** - * Clears a rectangle on WebGLRenderingContext - * @param {WebGLRenderingContext} gl - WebGL context - * @param {number} x - Position of the image on the X axis - * @param {number} y - Position of the image on the Y axis - * @param {number} width - Width of the rectangle to clear - * @param {number} height - Height of the rectangle to clear - * @param {number} blinkOffset - Offset in case of a blink draw - * @returns {void} - Nothing - */ -function GLDrawClearRect(gl, x, y, width, height, blinkOffset) { - gl.enable(gl.SCISSOR_TEST); - gl.scissor(x + blinkOffset, y, width, height); - gl.clearColor(0, 0, 0, 0); - gl.clear(gl.COLOR_BUFFER_BIT); - gl.disable(gl.SCISSOR_TEST); -} - -/** - * Converts a hex color to a RGBA color - * @param {string} color - Hex color code to convert to RGBA - * @param {number} alpha - The alpha value to use for the resulting RGBA - * @return {number[]} - Converted color code - */ -function GLDrawHexToRGBA(color, alpha = 1) { - const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; - color = color.replace(shorthandRegex, function (m, r, g, b) { return r + r + g + g + b + b; }); - const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color); - return result ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16), alpha] : [0, 0, 0, alpha]; -} - -/** - * Creates the given character canvas with WebGL - * @param {Character} C - Character to build the canvas for - * @returns {void} - Nothing - */ -function GLDrawAppearanceBuild(C) { - const blinkOffset = 500; - GLDrawClearRect(GLDrawCanvas.GL, 0, 0, 1000, CanvasDrawHeight); - CommonDrawCanvasPrepare(C); - CommonDrawAppearanceBuild(C, { - clearRect: (x, y, w, h) => GLDrawClearRect(GLDrawCanvas.GL, x, CanvasDrawHeight - y - h, w, h, 0), - clearRectBlink: (x, y, w, h) => GLDrawClearRect(GLDrawCanvas.GL, x, CanvasDrawHeight - y - h, w, h, blinkOffset), - drawImage: (src, x, y, alphaMasks, opacity, rotate) => GLDrawImage(src, GLDrawCanvas.GL, x, y, 0, null, null, alphaMasks, opacity, rotate), - drawImageBlink: (src, x, y, alphaMasks, opacity, rotate) => GLDrawImage(src, GLDrawCanvas.GL, x, y, blinkOffset, null, null, alphaMasks, opacity, rotate), - drawImageColorize: (src, x, y, color, fullAlpha, alphaMasks, opacity, rotate) => GLDrawImage(src, GLDrawCanvas.GL, x, y, 0, color, fullAlpha, alphaMasks, opacity, rotate), - drawImageColorizeBlink: (src, x, y, color, fullAlpha, alphaMasks, opacity, rotate) => GLDrawImage(src, GLDrawCanvas.GL, x, y, blinkOffset, color, fullAlpha, alphaMasks, opacity, rotate), - drawCanvas: (Img, x, y, alphaMasks) => GLDraw2DCanvas(GLDrawCanvas.GL, Img, x, y, 0, alphaMasks), - drawCanvasBlink: (Img, x, y, alphaMasks) => GLDraw2DCanvas(GLDrawCanvas.GL, Img, x, y, blinkOffset, alphaMasks), - }); - C.Canvas.getContext("2d").drawImage(GLDrawCanvas, 0, 0); - C.CanvasBlink.getContext("2d").drawImage(GLDrawCanvas, -blinkOffset, 0); -} diff --git a/Scripts/Graph.js b/Scripts/Graph.js deleted file mode 100644 index 3a420afa1..000000000 --- a/Scripts/Graph.js +++ /dev/null @@ -1,187 +0,0 @@ -"use strict"; - -/** - * A class representing a directed graph. The graph consists of string nodes, and edges defined by string to/from - * 2-tuples - */ -class DirectedGraph { - /** - * @param {string[]} vertices - * @param {[string, string][]} edges - */ - constructor(vertices, edges) { - this.vertices = vertices; - this.size = vertices.length; - this.edges = edges; - this.adjacencyList = this.buildAdjacencyList(); - } - - /** - * Constructs and sets the adjacency list for this graph based on its edge definitions - * @returns {Record} - The adjacency list for the graph - */ - buildAdjacencyList() { - /** @type {Record} */ - const adjacencyList = {}; - for (const v of this.vertices) { - adjacencyList[v] = []; - } - for (const [v1, v2] of this.edges) { - if (!adjacencyList[v1].includes(v2)) { - adjacencyList[v1].push(v2); - } - } - return adjacencyList; - } - - /** - * Creates a new subgraph of this graph by removing a given vertex, along with all edges attached to that vertex - * @param {string} vertex - The vertex to remove - * @returns {DirectedGraph} - The subgraph of this graph obtained by removing the given vertex and all attached - * edges - */ - removeVertex(vertex) { - return new DirectedGraph( - this.vertices.filter(v => v !== vertex), - this.edges.filter(e => e[0] !== vertex && e[1] !== vertex), - ); - } - - /** - * Creates a new subgraph of this graph by keeping only the given vertices and any edges between them - * @param {string[]} vertices - The vertices to keep - * @returns {DirectedGraph} - The subgraph of this graph obtained by only keeping the given vertices and any edges - * between them - */ - subgraphFromVertices(vertices) { - return new DirectedGraph( - this.vertices.filter(v => vertices.includes(v)), - this.edges.filter(e => vertices.includes(e[0]) && vertices.includes(e[1])), - ); - } - - /** - * Calculates the strongly connected components of the graph using Tarjan's strongly connected components algorithm. - * See https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm - * @returns {string[][]} - An array containing the strongly connected components of this graph, each represented as - * an array of vertex numbers - */ - getStronglyConnectedComponents() { - let index = 0; - const stack = []; - const components = []; - const vertexMap = {}; - for (const v of this.vertices) { - vertexMap[v] = { vertex: v }; - } - const allEdges = this.edges.map(([v1, v2]) => [vertexMap[v1], vertexMap[v2]]); - - const strongConnect = (v) => { - v.index = index; - v.lowLink = index; - stack.push(v); - v.onStack = true; - index++; - - const successors = allEdges - .filter(([v1, v2]) => v1 === v) - .map(([v1, v2]) => v2); - - for (const w of successors) { - if (w.index == null) { - strongConnect(w); - v.lowLink = Math.min(v.lowLink, w.lowLink); - } else if (w.onStack) { - v.lowLink = Math.min(v.lowLink, w.index); - } - } - - if (v.lowLink === v.index) { - const scc = []; - let w; - do { - w = stack.pop(); - w.onStack = false; - scc.push(w.vertex); - } while (w !== v); - components.push(scc); - } - }; - - for (const v of Object.values(vertexMap)) { - if (v.index == null) { - strongConnect(v); - } - } - - return components; - } - - /** - * Finds all simple cycles in this graph using Johnson's algorithm (see https://epubs.siam.org/doi/10.1137/0204007) - * @returns {string[][]} - */ - findCycles() { - const stack = []; - const blocked = []; - const blockMap = []; - const cycles = []; - /** @type {DirectedGraph} */ - let subgraph = this; - let startVertex; - let currentComponent; - let componentGraph; - - for (let i = 0; i < this.size; i++) { - blockMap.push([]); - } - - const unblock = (v) => { - blocked[v] = false; - for (const w of blockMap[v]) { - if (blocked[w]) unblock(w); - } - }; - - const cycle = (v) => { - let f = false; - stack.push(v); - blocked[v] = true; - for (const w of componentGraph.adjacencyList[v]) { - if (w === startVertex) { - cycles.push(stack.concat(startVertex)); - f = true; - } else if (!blocked[w]) { - if (cycle(w)) { - f = true; - } - } - } - if (f) { - unblock(v); - } else { - for (const w of componentGraph.adjacencyList[v]) { - if (!blockMap[w].includes(v)) { - blockMap[w].push(v); - } - } - } - stack.pop(); - return f; - }; - - for (startVertex of this.vertices) { - const connectedComponents = subgraph.getStronglyConnectedComponents(); - currentComponent = connectedComponents.find(c => c.includes(startVertex)); - componentGraph = subgraph.subgraphFromVertices(currentComponent); - for (const vertex of currentComponent) { - blocked[vertex] = false; - blockMap[vertex] = []; - } - cycle(startVertex); - subgraph = subgraph.removeVertex(startVertex); - } - - return cycles; - } -} diff --git a/Scripts/Inventory.js b/Scripts/Inventory.js deleted file mode 100644 index 3acdb9fa6..000000000 --- a/Scripts/Inventory.js +++ /dev/null @@ -1,1187 +0,0 @@ -"use strict"; - -/** -* Add a new item by group & name to character inventory -* @param {Character} C - The character that gets the new item added to her inventory -* @param {string} NewItemName - The name of the new item to add -* @param {string} NewItemGroup - The group name of the new item to add -* @param {boolean} [Push=true] - Set to TRUE to push to the server -*/ -function InventoryAdd(C, NewItemName, NewItemGroup, Push) { - - // First, we check if the inventory already exists, exit if it's the case - for (let I = 0; I < C.Inventory.length; I++) - if ((C.Inventory[I].Name == NewItemName) && (C.Inventory[I].Group == NewItemGroup)) - return; - - // Create the new item for current character's asset family, group name and item name - var NewItem = InventoryItemCreate(C, NewItemGroup, NewItemName); - - // Only add the item if we found the asset - if (NewItem) { - // Pushes the new item to the inventory queue - C.Inventory.push(NewItem); - - // Sends the new item to the server if it's for the current player - if ((C.ID == 0) && ((Push == null) || Push)) - ServerPlayerInventorySync(); - } -} - -/** -* Adds multiple new items by group & name to the character inventory -* @param {Character} C - The character that gets the new items added to her inventory -* @param {Array.<{ Name: string, Group: string }>} NewItems - The new items to add -* @param {Boolean} [Push=true] - Set to TRUE to push to the server, pushed by default -*/ -function InventoryAddMany(C, NewItems, Push) { - - // Return if data is invalid - if (C == null || !Array.isArray(NewItems)) return; - - var ShouldSync = false; - - // Add each items - for (let NI = 0; NI < NewItems.length; NI++) { - // First, we check if the item already exists in the inventory, continue if it's the case - var ItemExists = false; - for (let I = 0; I < C.Inventory.length; I++) - if ((C.Inventory[I].Name == NewItems[NI].Name) && (C.Inventory[I].Group == NewItems[NI].Group)) { - ItemExists = true; - break; - } - - if (!ItemExists) { - // Create the new item for current character's asset family, group name and item name - var NewItem = InventoryItemCreate(C, NewItems[NI].Group, NewItems[NI].Name); - - // Only add the item if we found the asset - if (NewItem) { - // Pushes the new item to the inventory and flag the refresh - C.Inventory.push(NewItem); - ShouldSync = true; - } - } - } - - // Sends the new item(s) to the server if it's for the current player and an item was added - if ((C.ID == 0) && ((Push == null) || Push) && ShouldSync) ServerPlayerInventorySync(); -} - -/** - * Creates a new item for a character based on asset group and name - * @param {Character} C - The character to create the item for - * @param {string} Group - The name of the asset group the item belongs to - * @param {string} Name - The name of the asset for the item - * @return {InventoryItem | null} A new item for character using the specified asset name, or null if the specified asset could not be - * found in the named group - */ -function InventoryItemCreate(C, Group, Name) { - var NewItemAsset = AssetGet(C.AssetFamily, Group, Name); - if (NewItemAsset) return { Name, Group, Asset: NewItemAsset }; - return null; -} - -/** -* Deletes an item from the character inventory -* @param {Character} C - The character on which we should remove the item -* @param {string} DelItemName - The name of the item to delete -* @param {string} DelItemGroup - The group name of the item to delete -* @param {boolean} [Push=true] - Set to TRUE to push to the server -*/ -function InventoryDelete(C, DelItemName, DelItemGroup, Push) { - - // First, we remove the item from the player inventory - for (let I = 0; I < C.Inventory.length; I++) - if ((C.Inventory[I].Name == DelItemName) && (C.Inventory[I].Group == DelItemGroup)) { - C.Inventory.splice(I, 1); - break; - } - - // Next, we call the player account service to remove the item - if ((C.ID == 0) && ((Push == null) || Push)) - ServerPlayerInventorySync(); - -} - -/** -* Loads the current inventory for a character, can be loaded from an object of Name/Group or a compressed array using -* LZString -* @param {Character} C - The character on which we should load the inventory -* @param {Array|Record} Inventory - An array of Name / Group of items to load -*/ -function InventoryLoad(C, Inventory) { - if (Inventory == null) return; - if (typeof Inventory === "string") { - try { - var Inv = JSON.parse(LZString.decompressFromUTF16(Inventory)); - for (let I = 0; I < Inv.length; I++) - InventoryAdd(C, Inv[I][0], Inv[I][1], false); - } catch(err) { - console.log("Error while loading compressed inventory, no inventory loaded."); - } - } - if (Array.isArray(Inventory)) { - for (let I = 0; I < Inventory.length; I++) - InventoryAdd(C, Inventory[I].Name, Inventory[I].Group, false); - } else if (typeof Inventory === "object") { - for (const G of Object.keys(Inventory)) { - for (const A of Inventory[G]) { - InventoryAdd(C, A, G, false); - } - } - } -} - -/** -* Checks if the character has the inventory available -* @param {Character} C - The character on which we should remove the item -* @param {String} InventoryName - The name of the item to validate -* @param {String} InventoryGroup - The group name of the item to validate -*/ -function InventoryAvailable(C, InventoryName, InventoryGroup) { - for (let I = 0; I < C.Inventory.length; I++) - if ((C.Inventory[I].Name == InventoryName) && (C.Inventory[I].Group == InventoryGroup)) - return true; - return false; -} - -/** -* Returns an error message if a prerequisite clashes with the character's items and clothes -* @param {Character} C - The character on which we check for prerequisites -* @param {String} Prerequisite - The name of the prerequisite -* @returns {String} - The error tag, can be converted to an error message -*/ -function InventoryPrerequisiteMessage(C, Prerequisite) { - switch (Prerequisite) { - // Basic prerequisites that can apply to many items - case "NoItemFeet": return (InventoryGet(C, "ItemFeet") != null) ? "MustFreeFeetFirst" : ""; - case "NoItemArms": return (InventoryGet(C, "ItemArms") != null) ? "MustFreeArmsFirst" : ""; - case "NoItemLegs": return (InventoryGet(C, "ItemLegs") != null) ? "MustFreeLegsFirst" : ""; - case "NoItemHands": return (InventoryGet(C, "ItemHands") != null) ? "MustFreeHandsFirst" : ""; - case "LegsOpen": return CharacterItemsHavePose(C, "LegsClosed") ? "LegsCannotOpen" : ""; - case "CanCloseLegs": return !CharacterItemsHavePoseAvailable(C, "BodyLower", "LegsClosed") && !CharacterItemsHavePose(C, "Kneel") ? "LegsCannotClose" : ""; - case "NotKneeling": return CharacterItemsHavePose(C, "Kneel") ? "MustStandUpFirst" : ""; - case "CanKneel": return C.Effect.includes("BlockKneel") ? "MustBeAbleToKneel" : ""; - case "NotMounted": return C.Effect.includes("Mounted") ? "CannotBeUsedWhenMounted" : ""; - case "NotHorse": return InventoryIsItemInList(C, "ItemDevices", ["WoodenHorse"]) ? "CannotBeUsedWhenMounted" : ""; - case "NotSuspended": return C.IsSuspended() ? "RemoveSuspensionForItem" : ""; - case "NotLifted": return C.Effect.includes("Lifted") ? "RemoveSuspensionForItem" : ""; - case "NotHogtied": return C.Pose.includes("Hogtied") ? "ReleaseHogtieForItem" : ""; - case "NotYoked": return CharacterItemsHavePose(C, "Yoked") ? "CannotBeUsedWhenYoked" : ""; - case "NotKneelingSpread": return C.Pose.includes("KneelingSpread") ? "MustStandUpFirst" : ""; - case "NotChaste": return C.Effect.includes("Chaste") ? "RemoveChastityFirst" : ""; - case "NotChained": return C.Effect.includes("IsChained") ? "RemoveChainForItem" : ""; - case "NoFeetSpreader": return CharacterItemsHavePose(C, "Spread", true) || CharacterItemsHavePose(C, "LegsOpen", true) ? "CannotBeUsedWithFeetSpreader" : ""; - case "NotShackled": return C.Effect.includes("Shackled") ? "RemoveShacklesFirst" : ""; - case "Collared": return (InventoryGet(C, "ItemNeck") == null) ? "MustCollaredFirst" : ""; - case "CannotHaveWand": return InventoryIsItemInList(C, "ItemArms", ["FullLatexSuit"]) ? "CannotHaveWand" : ""; - case "CannotBeSuited": return InventoryIsItemInList(C, "ItemVulva", ["WandBelt", "HempRopeBelt"]) ? "CannotHaveWand" : ""; - case "AllFours": return CharacterItemsHavePose(C, "AllFours") ? "CannotUse" : ""; - case "OnBed": return !C.Effect.includes("OnBed") ? "MustBeOnBed" : ""; - case "CuffedArms": return !C.Effect.includes("CuffedArms") ? "MustBeArmCuffedFirst" : ""; - case "CuffedLegs": return !C.Effect.includes("CuffedFeet") ? "MustBeFeetCuffedFirst" : ""; - case "CuffedFeet": return !C.Effect.includes("CuffedFeet") ? "MustBeFeetCuffedFirst" : ""; - case "CuffedArmsOrEmpty": return (InventoryGet(C, "ItemArms") != null && !C.Effect.includes("CuffedArms")) ? "MustFreeArmsFirst" : ""; - case "CuffedLegsOrEmpty": return (InventoryGet(C, "ItemLegs") != null && !C.Effect.includes("CuffedLegs")) ? "MustFreeLegsFirst" : ""; - case "CuffedFeetOrEmpty": return (InventoryGet(C, "ItemFeet") != null && !C.Effect.includes("CuffedFeet")) ? "MustFreeFeetFirst" : ""; - case "NoOuterClothes": return InventoryHasItemInAnyGroup(C, ["Cloth", "ClothLower"]) ? "RemoveClothesForItem" : ""; - case "NoClothLower": return InventoryHasItemInAnyGroup(C, ["ClothLower"]) ? "RemoveClothesForItem" : ""; - case "NoMaidTray": return InventoryIsItemInList(C, "ItemMisc", ["WoodenMaidTray", "WoodenMaidTrayFull"]) ? "CannotBeUsedWhileServingDrinks" : ""; - case "CanBeCeilingTethered": return InventoryHasItemInAnyGroup(C, ["ItemArms", "ItemTorso", "ItemPelvis"]) ? "" : "AddItemsToUse"; - - // Checks for torso access based on clothes - case "AccessTorso": return !InventoryDoItemsExposeGroup(C, "ItemTorso", ["Cloth"]) ? "RemoveClothesForItem" : ""; - - // Breast items can be blocked by clothes - case "AccessBreast": return !InventoryDoItemsExposeGroup(C, "ItemBreast", ["Cloth"]) || !InventoryDoItemsExposeGroup( - C, "ItemBreast", ["Bra"]) ? "RemoveClothesForItem" : ""; - case "AccessBreastSuitZip": return !InventoryDoItemsExposeGroup(C, "ItemNipplesPiercings", ["Cloth"]) || !InventoryDoItemsExposeGroup( - C, "ItemNipplesPiercings", ["Suit"]) ? "UnZipSuitForItem" : ""; - - // Vulva/Butt items can be blocked by clothes, panties and some socks - case "AccessVulva": return ( - InventoryDoItemsBlockGroup(C, "ItemVulva", ["Cloth", "Socks", "ItemPelvis", "ItemVulvaPiercings"]) - || !InventoryDoItemsExposeGroup(C, "ItemVulva", ["ClothLower", "Panties"]) - ) ? "RemoveClothesForItem" : ""; - - case "AccessButt": return ( - InventoryDoItemsBlockGroup(C, "ItemButt", ["Cloth", "Socks", "ItemPelvis", "ItemVulvaPiercings"]) - || !InventoryDoItemsExposeGroup(C, "ItemButt", ["ClothLower", "Panties"]) - ) ? "RemoveClothesForItem" : ""; - - // Items that require access to a certain character's zone - case "AccessMouth": return C.IsMouthBlocked() ? "CannotBeUsedOverGag" : ""; - case "HoodEmpty": return InventoryGet(C, "ItemHood") ? "CannotBeUsedOverMask" : ""; - case "EyesEmpty": return InventoryGet(C, "ItemHead") ? "CannotBeUsedOverHood" : ""; - - // Some chastity belts have removable vulva shields. This checks for those for items that wish to add something externally. - case "VulvaNotBlockedByBelt": return InventoryDoItemsBlockGroup(C, "ItemVulva", ["ItemPelvis"]) - || InventoryDoItemsBlockGroup(C, "ItemVulva", ["ItemVulvaPiercings"]) - ? "RemoveChastityFirst" : ""; - - // Ensure crotch is empty - case "VulvaEmpty": return (InventoryGet(C, "ItemVulva") != null) ? "MustFreeVulvaFirst" : ""; - case "ClitEmpty": return ((InventoryGet(C, "ItemVulvaPiercings") != null)) ? "MustFreeClitFirst" : ""; - case "ButtEmpty": return ((InventoryGet(C, "ItemButt") != null)) ? "MustFreeButtFirst" : ""; - - // For body parts that must be naked - case "NakedFeet": return InventoryHasItemInAnyGroup(C, ["ItemBoots", "Socks", "Shoes"]) ? "RemoveClothesForItem" : ""; - case "NakedHands": return InventoryHasItemInAnyGroup(C, ["ItemHands", "Gloves"]) ? "RemoveClothesForItem" : ""; - - // Display Frame - case "DisplayFrame": return InventoryHasItemInAnyGroup(C, ["ItemArms", "ItemLegs", "ItemFeet", "ItemBoots"]) - ? "RemoveRestraintsFirst" - : InventoryHasItemInAnyGroup(C, ["Cloth", "ClothLower", "Shoes"]) - ? "RemoveClothesForItem" : ""; - - // Gas mask (Or face covering items going below the chin) - case "GasMask": return InventoryIsItemInList(C, "ItemArms", ["Pillory"]) || InventoryIsItemInList(C, "ItemDevices", ["TheDisplayFrame"]) ? "RemoveRestraintsFirst" : ""; - case "NotMasked": return InventoryIsItemInList(C, "ItemHood", ["OldGasMask"]) ? "RemoveFaceMaskFirst" : ""; - - // Blocked remotes on self - case "RemotesAllowed": return ""; - - // Layered Gags, prevent gags from being equipped over other gags they are incompatible with - case "GagUnique": return InventoryPrerequisiteConflictingGags(C, ["GagFlat", "GagCorset", "GagUnique"]); - case "GagCorset": return InventoryPrerequisiteConflictingGags(C, ["GagCorset"]); - - // There's something in the mouth that's too large to allow that item on - case "NotProtrudingFromMouth": return C.Effect.includes("ProtrudingMouth") ? "CannotBeUsedOverGag" : ""; - - case "NeedsNippleRings": return !InventoryIsItemInList(C, "ItemNipplesPiercings", ["RoundPiercing"]) ? "NeedsNippleRings" : ""; - - // Returns no message, indicating that all prerequisites are fine - default: return ""; - } -} - -/** - * Prerequisite utility function that returns TRUE if the given character has an item equipped in the provided group - * whose name matches one of the names in the provided list. - * @param {Character} C - The character for whom to check equipped items - * @param {String} ItemGroup - The name of the item group to check - * @param {String[]} ItemList - A list of item names to check against - * @returns {boolean} - TRUE if the character has an item from the item list equipped in the named slot, FALSE - * otherwise - */ -function InventoryIsItemInList(C, ItemGroup, ItemList) { - const Item = InventoryGet(C, ItemGroup); - return Item && ItemList.includes(Item.Asset.Name); -} - -/** - * Prerequisite utility function that returns TRUE if the given character has an item equipped in the provided group - * which has the provided prerequisite. - * @param {Character} C - The character whose items should be checked - * @param {String} ItemGroup - The name of the item group to check - * @param {String} Prerequisite - The name of the prerequisite to look for - * @returns {boolean} - TRUE if the character has an item equipped in the named slot which has the named prerequisite, - * FALSE otherwise - */ -function InventoryDoesItemHavePrerequisite(C, ItemGroup, Prerequisite) { - const Item = InventoryGet(C, ItemGroup); - return Item && Item.Asset.Prerequisite && Item.Asset.Prerequisite.includes(Prerequisite); -} - -/** - * Prerequisite utility function to check whether the target group for the given character is blocked by any of the - * given groups to check. - * @param {Character} C - The character whose items should be checked - * @param {String} TargetGroup - The name of the group that should be checked for being blocked - * @param {String[]} GroupsToCheck - The name(s) of the groups whose items should be checked - * @returns {boolean} - TRUE if the character has an item equipped in any of the given groups to check which blocks the - * target group, FALSE otherwise. - */ -function InventoryDoItemsBlockGroup(C, TargetGroup, GroupsToCheck) { - return GroupsToCheck.some((Group) => { - const Item = InventoryGet(C, Group); - return Item && Item.Asset.Block && Item.Asset.Block.includes(TargetGroup); - }); -} - -/** - * Prerequisite utility function to check whether the target group for the given character is exposed by all of the - * given groups to check. - * @param {Character} C - The character whose items should be checked - * @param {String} TargetGroup - The name of the group that should be checked for being exposed - * @param {String[]} GroupsToCheck - The name(s) of the groups whose items should be checked - * @returns {boolean} - FALSE if the character has an item equipped in ANY of the given groups to check that does not - * expose the target group. Returns TRUE otherwise. - */ -function InventoryDoItemsExposeGroup(C, TargetGroup, GroupsToCheck) { - return GroupsToCheck.every((Group) => { - const Item = InventoryGet(C, Group); - return !Item || Item.Asset.Expose.includes(TargetGroup); - }); -} - -/** - * Prerequisite utility function that returns TRUE if the given character has an item equipped in any of the named group - * slots. - * @param {Character} C - The character whose items should be checked - * @param {String[]} GroupList - The list of groups to check for items in - * @returns {boolean} - TRUE if the character has any item equipped in any of the named groups, FALSE otherwise. - */ -function InventoryHasItemInAnyGroup(C, GroupList) { - return GroupList.some(GroupName => !!InventoryGet(C, GroupName)); -} - -/** - * Check if there are any gags with prerequisites that block the new gag from being applied - * @param {Character} C - The character on which we check for prerequisites - * @param {Array} BlockingPrereqs - The prerequisites we check for on lower gags - * @returns {String} - Returns the prerequisite message if the gag is blocked, or an empty string if not - */ -function InventoryPrerequisiteConflictingGags(C, BlockingPrereqs) { - // Index of the gag we're trying to add (1-indexed) - let GagIndex = 4; // By default, assume no gag slots are allowed to conflict - if (C.FocusGroup && C.FocusGroup.Name.startsWith("ItemMouth")) { - // If there's a focus group, calculate the gag index - GagIndex = Number(C.FocusGroup.Name.replace("ItemMouth", "") || 1); - } - const MouthItems = [InventoryGet(C, "ItemMouth"), InventoryGet(C, "ItemMouth2"), InventoryGet(C, "ItemMouth3")]; - let MinBlockingIndex = 0; - for (let i = 0; i < MouthItems.length && !MinBlockingIndex; i++) { - // Find the lowest indexed slot in which there is a gag with a prerequisite that blocks the new gag - let AssetPrerequisites = MouthItems[i] && MouthItems[i].Asset.Prerequisite; - if (!Array.isArray(AssetPrerequisites)) { - AssetPrerequisites = [AssetPrerequisites]; - } - if (AssetPrerequisites.some((Prerequisite) => BlockingPrereqs.includes(Prerequisite))) { - MinBlockingIndex = i + 1; - } - } - // Not allowed to add the new gag if there is a blocking gag anywhere below it - if (MinBlockingIndex && GagIndex > MinBlockingIndex) return "CannotBeUsedOverGag"; - else return ""; -} - -/** - * Returns TRUE if we can add the item, no other items must block that prerequisite - * @param {Character} C - The character on which we check for prerequisites - * @param {Asset} asset - The asset for which prerequisites should be checked. Any item equipped in the asset's group - * will be ignored for the purposes of the prerequisite check. - * @param {string|string[]} [prerequisites=asset.Prerequisite] - An array of prerequisites or a string for a single - * prerequisite. If nothing is provided, the asset's default prerequisites will be used - * @param {boolean} [setDialog=true] - If TRUE, set the screen dialog message at the same time - * @returns {boolean} - TRUE if the item can be added to the character - */ -function InventoryAllow(C, asset, prerequisites = asset.Prerequisite, setDialog = true) { - // Prerequisite can be a string - if (typeof prerequisites === "string") { - prerequisites = [prerequisites]; - } - - // If prerequisite isn't a valid array, return true - if (!Array.isArray(prerequisites)) { - return true; - } - - // Create/load a simple character for prerequisite checking - const checkCharacter = CharacterLoadSimple("InventoryAllow"); - checkCharacter.Appearance = C.Appearance.filter((item) => item.Asset.Group.Name !== asset.Group.Name); - CharacterLoadEffect(checkCharacter); - CharacterLoadPose(checkCharacter); - - let Msg = ""; - prerequisites.some((prerequisite) => (Msg = InventoryPrerequisiteMessage(checkCharacter, prerequisite))); - - return !Msg; -} - -/** -* Gets the current item / cloth worn a specific area (AssetGroup) -* @param {Character} C - The character on which we must check the appearance -* @param {String} AssetGroup - The name of the asset group to scan -* @returns {Item|null} - Returns the appearance which is the item / cloth asset, color and properties -*/ -function InventoryGet(C, AssetGroup) { - for (let A = 0; A < C.Appearance.length; A++) - if ((C.Appearance[A].Asset != null) && (C.Appearance[A].Asset.Group.Family == C.AssetFamily) && (C.Appearance[A].Asset.Group.Name == AssetGroup)) - return C.Appearance[A]; - return null; -} - - -/** -* Makes the character wear an item on a body area -* @param {Character} C - The character that must wear the item -* @param {string} AssetName - The name of the asset to wear -* @param {string} AssetGroup - The name of the asset group to wear -* @param {string | string[]} [ItemColor] - The hex color of the item, can be undefined or "Default" -* @param {number} [Difficulty] - The difficulty, on top of the base asset difficulty, to assign to the item -* @param {number} [MemberNumber] - The member number of the character putting the item on - defaults to -1 -* @param {Object} [Craft] - The crafting properties of the item -*/ -function InventoryWear(C, AssetName, AssetGroup, ItemColor, Difficulty, MemberNumber, Craft) { - const A = AssetGet(C.AssetFamily, AssetGroup, AssetName); - if (!A) return; - CharacterAppearanceSetItem(C, AssetGroup, A, ((ItemColor == null || ItemColor == "Default") && A.DefaultColor != null) ? A.DefaultColor : ItemColor, Difficulty, MemberNumber, false); - let Item = InventoryGet(C, AssetGroup); - CharacterRefresh(C, true); - InventoryExpressionTrigger(C, Item); -} - -/** -* Sets the difficulty to remove an item for a body area -* @param {Character} C - The character that is wearing the item -* @param {String} AssetGroup - The name of the asset group -* @param {number} Difficulty - The new difficulty level to escape from the item -*/ -function InventorySetDifficulty(C, AssetGroup, Difficulty) { - if ((Difficulty >= 0) && (Difficulty <= 100)) - for (let A = 0; A < C.Appearance.length; A++) - if ((C.Appearance[A].Asset != null) && (C.Appearance[A].Asset.Group.Name == AssetGroup)) - C.Appearance[A].Difficulty = Difficulty; - if ((CurrentModule != "Character") && (C.ID == 0)) ServerPlayerAppearanceSync(); -} - -/** -* Returns TRUE if there's already a locked item at a given body area -* @param {Character} C - The character that is wearing the item -* @param {String} AssetGroup - The name of the asset group (body area) -* @param {Boolean} CheckProperties - Set to TRUE to check for additionnal properties -* @returns {Boolean} - TRUE if the item is locked -*/ -function InventoryLocked(C, AssetGroup, CheckProperties) { - var I = InventoryGet(C, AssetGroup); - return ((I != null) && InventoryItemHasEffect(I, "Lock", CheckProperties)); -} - -/** - * Makes the character wear a random item from a body area - * @param {Character} C - The character that must wear the item - * @param {string} GroupName - The name of the asset group (body area) - * @param {number} [Difficulty] - The difficulty, on top of the base asset difficulty, to assign to the item - * @param {boolean} [Refresh=true] - Do not call CharacterRefresh if false - * @param {boolean} [MustOwn=false] - If TRUE, only assets that the character owns can be worn. Otherwise any asset can - * be used - * @param {boolean} [Extend=true] - Whether or not to randomly extend the item (i.e. set the item type), provided it has - * an archetype that supports random extension - * @param {string[]} [AllowedAssets=null] - A list of assets from which one must be selected - * @param {boolean} [IgnoreRequirements=false] - If True, the group being blocked and prerequisites will not prevent the item being added. - * NOTE: Long-term this should be replaced with better checks before calling this function. - * @returns {void} - Nothing - */ -function InventoryWearRandom(C, GroupName, Difficulty, Refresh = true, MustOwn = false, Extend = true, AllowedAssets = null, IgnoreRequirements = false) { - if (InventoryLocked(C, GroupName, true)) { - return; - } - - // Finds the asset group and make sure it's not blocked - const Group = AssetGroupGet(C.AssetFamily, GroupName); - if (!IgnoreRequirements && (!Group || InventoryGroupIsBlocked(C, GroupName))) { - return; - } - const IsClothes = Group.Clothing; - - let AssetList = null; - if (AllowedAssets) { - AssetList = AllowedAssets.map(assetName => Asset.find(A => A.Group.Name == GroupName && A.Name == assetName)); - } - // Restrict the options to assets owned by the character - if (MustOwn) { - CharacterAppearanceBuildAssets(C); - if (AssetList) { - AssetList.filter(A => CharacterAppearanceAssets.some(CAA => CAA.Group.Name == A.Group.Name && CAA.Name == A.Name)); - } else { - AssetList = CharacterAppearanceAssets; - } - } - - // Get and apply a random asset - const SelectedAsset = InventoryGetRandom(C, GroupName, AssetList, IgnoreRequirements); - - // Pick a random color for clothes from their schema - const SelectedColor = IsClothes ? SelectedAsset.Group.ColorSchema[Math.floor(Math.random() * SelectedAsset.Group.ColorSchema.length)] : null; - - CharacterAppearanceSetItem(C, GroupName, SelectedAsset, SelectedColor, Difficulty, null, false); - - if (Extend) { - InventoryRandomExtend(C, GroupName); - } - - if (Refresh) { - CharacterRefresh(C); - } -} - -/** - * Randomly extends an item (sets an item type, etc.) on a character - * @param {Character} C - The character wearing the item - * @param {string} GroupName - The name of the item's group - * @returns {void} - Nothing - */ -function InventoryRandomExtend(C, GroupName) { - const Item = InventoryGet(C, GroupName); - - if (!Item || !Item.Asset.Archetype) { - return; - } - - switch (Item.Asset.Archetype) { - case ExtendedArchetype.TYPED: - TypedItemSetRandomOption(C, Item); - break; - default: - // Archetype does not yet support random extension - break; - } -} - -/** - * Select a random asset from a group, narrowed to the most preferable available options (i.e - * unblocked/visible/unlimited) based on their binary "rank" - * @param {Character} C - The character to pick the asset for - * @param {string} GroupName - The asset group to pick the asset from. Set to an empty string to not filter by group. - * @param {Asset[]} [AllowedAssets] - Optional parameter: A list of assets from which one can be selected. If not provided, - * the full list of all assets is used. - * @param {boolean} [IgnorePrerequisites=false] - If True, skip the step to check whether prerequisites are met - * NOTE: Long-term this should be replaced with better checks before calling this function. - * @returns {Asset|null} - The randomly selected asset or `null` if none found - */ -function InventoryGetRandom(C, GroupName, AllowedAssets, IgnorePrerequisites = false) { - var List = []; - var AssetList = AllowedAssets || Asset; - var RandomOnly = (AllowedAssets == null); - - var MinRank = Math.pow(2, 10); - var BlockedRank = Math.pow(2, 2); - var HiddenRank = Math.pow(2, 1); - var LimitedRank = Math.pow(2, 0); - - for (let A = 0; A < AssetList.length; A++) - if (((AssetList[A].Group.Name == GroupName && AssetList[A].Wear) || GroupName == null || GroupName == "") - && (RandomOnly == false || AssetList[A].Random) - && AssetList[A].Enable - && (IgnorePrerequisites || InventoryAllow(C, AssetList[A], undefined, false))) - { - var CurrRank = 0; - - if (InventoryIsPermissionBlocked(C, AssetList[A].Name, AssetList[A].Group.Name)) { - if (BlockedRank > MinRank) continue; - else CurrRank += BlockedRank; - } - - if (CharacterAppearanceItemIsHidden(AssetList[A].Name, GroupName)) { - if (HiddenRank > MinRank) continue; - else CurrRank += HiddenRank; - } - - if (InventoryIsPermissionLimited(C, AssetList[A].Name, AssetList[A].Group.Name)) { - if (LimitedRank > MinRank) continue; - else CurrRank += LimitedRank; - } - - MinRank = Math.min(MinRank, CurrRank); - List.push({ Asset: AssetList[A], Rank: CurrRank }); - } - - var PreferredList = List.filter(L => L.Rank == MinRank); - if (PreferredList.length == 0) return null; - - return PreferredList[Math.floor(Math.random() * PreferredList.length)].Asset; -} - -/** -* Removes a specific item from a character body area -* @param {Character} C - The character on which we must remove the item -* @param {String} AssetGroup - The name of the asset group (body area) -* @param {boolean} [Refresh] - Whether or not to trigger a character refresh. Defaults to false -*/ -function InventoryRemove(C, AssetGroup, Refresh) { - - const lastblindlevel = Player.GetBlindLevel(); - DrawLastDarkFactor = CharacterGetDarkFactor(Player); - - // First loop to find the item and any sub item to remove with it - for (let E = 0; E < C.Appearance.length; E++) - if (C.Appearance[E].Asset.Group.Name == AssetGroup) { - let AssetToRemove = C.Appearance[E].Asset; - let AssetToCheck = null; - for (let R = 0; R < AssetToRemove.RemoveItemOnRemove.length; R++) { - AssetToCheck = AssetToRemove.RemoveItemOnRemove[R]; - if (!AssetToCheck.Name) { - // Just try to force remove a group, if no item is specified - InventoryRemove(C, AssetToCheck.Group, false); - } else { - let AssetFound = InventoryGet(C, AssetToCheck.Group); - // If a name is specified check if the item is worn - if (AssetFound && (AssetFound.Asset.Name == AssetToCheck.Name)) - // If there is no type check or there is a type check and the item type matches, remove it - if (AssetToCheck.Type) { - if (AssetFound.Property && AssetFound.Property.Type === AssetToCheck.Type) - InventoryRemove(C, AssetToCheck.Group, false); - } else { - InventoryRemove(C, AssetToCheck.Group, false); - } - } - } - } - - // Second loop to find the item again, and remove it from the character appearance - for (let E = 0; E < C.Appearance.length; E++) - if (C.Appearance[E].Asset.Group.Name == AssetGroup) { - C.Appearance.splice(E, 1); - if (Refresh || Refresh == null) CharacterRefresh(C); - - if (Player.GraphicsSettings && Player.GraphicsSettings.DoBlindFlash) { - if (Refresh == false) CharacterLoadEffect(C); // update Effect to get the new blind level - if (lastblindlevel > 0 && Player.GetBlindLevel() === 0) { - DrawBlindFlash(lastblindlevel); - } - } - - return; - } - -} - -/** -* Returns TRUE if the body area (Asset Group) for a character is blocked and cannot be used -* @param {Character} C - The character on which we validate the group -* @param {AssetGroupName} [GroupName] - The name of the asset group (body area), defaults to `C.FocusGroup` -* @param {boolean} [Activity=false] - if TRUE check if activity is allowed on the asset group -* @returns {boolean} - TRUE if the group is blocked -*/ -function InventoryGroupIsBlockedForCharacter(C, GroupName, Activity) { - if (Activity == null) Activity = false; - - // Default to characters focused group - if (GroupName == null) GroupName = C.FocusGroup.Name; - - if (Activity) { - for (let E = 0; E < C.Appearance.length; E++) { - if (!C.Appearance[E].Asset.Group.Clothing && (C.Appearance[E].Asset.AllowActivityOn != null) && (C.Appearance[E].Asset.AllowActivityOn.includes(GroupName))){ - Activity = true; - break; - } else if (!C.Appearance[E].Asset.Group.Clothing && (C.Appearance[E].Property != null) && (C.Appearance[E].Property.AllowActivityOn != null) && (C.Appearance[E].Property.AllowActivityOn.indexOf(GroupName) >= 0)){ - Activity = true; - break; - } else Activity = false; - } - } - - // Items can block each other (hoods blocks gags, belts blocks eggs, etc.) - for (let E = 0; E < C.Appearance.length; E++) { - if (!C.Appearance[E].Asset.Group.Clothing && (C.Appearance[E].Asset.Block != null) && (C.Appearance[E].Asset.Block.includes(GroupName)) && !Activity) return true; - if (!C.Appearance[E].Asset.Group.Clothing && (C.Appearance[E].Property != null) && (C.Appearance[E].Property.Block != null) && Array.isArray(C.Appearance[E].Property.Block) && (C.Appearance[E].Property.Block.indexOf(GroupName) >= 0) && !Activity) return true; - } - - // If another character is enclosed, items other than the enclosing one cannot be used - if ((C.ID != 0) && C.IsEnclose()) { - for (let E = 0; E < C.Appearance.length; E++) - if ((C.Appearance[E].Asset.Group.Name == GroupName) && InventoryItemHasEffect(C.Appearance[E], "Enclose", true)) - return false; - return true; - } - // Nothing is preventing the group from being used - return false; -} - -/** -* Returns TRUE if the body area (Asset Group) for a character is blocked and cannot be used -* Similar to InventoryGroupIsBlockedForCharacter but also blocks groups on all characters if the player is enclosed. -* @param {Character} C - The character on which we validate the group -* @param {string} [GroupName] - The name of the asset group (body area) -* @param {boolean} [Activity] - if TRUE check if activity is allowed on the asset group -* @returns {boolean} - TRUE if the group is blocked -*/ -function InventoryGroupIsBlocked(C, GroupName, Activity) { - if (InventoryGroupIsBlockedForCharacter(C, GroupName, Activity)) return true; - // If the player is enclosed, all groups for another character are blocked - if ((C.ID != 0) && Player.IsEnclose()) return true; - - // Nothing is preventing the group from being used - return false; - -} - -/** -* Returns TRUE if an item has a specific effect -* @param {Item} Item - The item from appearance that must be validated -* @param {EffectName} [Effect] - The name of the effect to validate, can be undefined to check for any effect -* @param {boolean} [CheckProperties=true] - If properties should be checked (defaults to `true`) -* @returns {boolean} `true` if the effect is on the item -*/ -function InventoryItemHasEffect(Item, Effect, CheckProperties = true) { - if (!Item) return false; - if (!Effect) { - return !!( - (Item.Asset && Array.isArray(Item.Asset.Effect) && Item.Asset.Effect.length > 0) || - (CheckProperties && Item.Property && Array.isArray(Item.Property.Effect) && Item.Property.Effect.length > 0) - ); - } else { - return !!( - (Item.Asset && Array.isArray(Item.Asset.Effect) && Item.Asset.Effect.includes(Effect)) || - (CheckProperties && Item.Property && Array.isArray(Item.Property.Effect) && Item.Property.Effect.includes(Effect)) - ); - } -} - -/** -* Returns TRUE if an item lock is pickable -* @param {Item} Item - The item from appearance that must be validated -* @returns {Boolean} - TRUE if PickDifficulty is on the item -*/ -function InventoryItemIsPickable(Item) { - if (!Item) return null; - const lock = InventoryGetLock(Item); - if (lock && lock.Asset && lock.Asset.PickDifficulty && lock.Asset.PickDifficulty > 0) return true; - else return false; -} - -/** - * Returns the value of a given property of an appearance item, prioritizes the Property object. - * @param {object} Item - The appearance item to scan - * @param {string} PropertyName - The property name to get. - * @param {boolean} [CheckGroup=false] - Whether or not to fall back to the item's group if the property is not found on - * Property or Asset. - * @returns {any} - The value of the requested property for the given item. Returns undefined if the property or the - * item itself does not exist. - */ -function InventoryGetItemProperty(Item, PropertyName, CheckGroup=false) { - if (!Item || !PropertyName || !Item.Asset) return; - let Property = Item.Property && Item.Property[PropertyName]; - if (Property === undefined) Property = Item.Asset[PropertyName]; - if (Property === undefined && CheckGroup) Property = Item.Asset.Group[PropertyName]; - return Property; -} - -/** -* Check if we must trigger an expression for the character after an item is used/applied -* @param {Character} C - The character that we must validate -* @param {Item} item - The item from appearance that we must validate -*/ -function InventoryExpressionTrigger(C, item) { - if (item && item.Asset) { - const expressions = item.Asset.DynamicExpressionTrigger(C); - if (expressions) InventoryExpressionTriggerApply(C, expressions); - } -} - -/** - * Apply an item's expression trigger to a character if able - * @param {Character} C - The character to update - * @param {ExpressionTrigger[]} expressions - The expression change to apply to each group - */ -function InventoryExpressionTriggerApply(C, expressions) { - const expressionsAllowed = C.ID === 0 || C.AccountName.startsWith("Online-") ? C.OnlineSharedSettings.ItemsAffectExpressions : true; - if (expressionsAllowed) { - expressions.forEach(expression => { - const targetGroupItem = InventoryGet(C, expression.Group); - if (!targetGroupItem || !targetGroupItem.Property || !targetGroupItem.Property.Expression) { - CharacterSetFacialExpression(C, expression.Group, expression.Name, expression.Timer); - } - }); - } -} - -/** -* Returns the padlock item that locks another item -* @param {Item} Item - The item from appearance that must be scanned -* @returns {Item} - A padlock item or NULL if none -*/ -function InventoryGetLock(Item) { - if ((Item == null) || (Item.Property == null) || (Item.Property.LockedBy == null)) return null; - for (let A = 0; A < Asset.length; A++) - if (Asset[A].IsLock && (Asset[A].Name == Item.Property.LockedBy)) - return { Asset: Asset[A] }; - return null; -} - -/** -* Returns TRUE if the item has an OwnerOnly flag, such as the owner padlock -* @param {Item} Item - The item from appearance that must be scanned -* @returns {Boolean} - TRUE if owner only -*/ -function InventoryOwnerOnlyItem(Item) { - if (Item == null) return false; - if (Item.Asset.OwnerOnly) return true; - if (Item.Asset.Group.Category == "Item") { - var Lock = InventoryGetLock(Item); - if ((Lock != null) && (Lock.Asset.OwnerOnly != null) && Lock.Asset.OwnerOnly) return true; - } - return false; -} - -/** -* Returns TRUE if the item has a LoverOnly flag, such as the lover padlock -* @param {Item} Item - The item from appearance that must be scanned -* @returns {Boolean} - TRUE if lover only -*/ -function InventoryLoverOnlyItem(Item) { - if (Item == null) return false; - if (Item.Asset.LoverOnly) return true; - if (Item.Asset.Group.Category == "Item") { - var Lock = InventoryGetLock(Item); - if ((Lock != null) && (Lock.Asset.LoverOnly != null) && Lock.Asset.LoverOnly) return true; - } - return false; -} - -/** -* Returns TRUE if the character is wearing at least one restraint that's locked with an extra lock -* @param {Character} C - The character to scan -* @returns {Boolean} - TRUE if one restraint with an extra lock is found -*/ -function InventoryCharacterHasLockedRestraint(C) { - if (C.Appearance != null) - for (let A = 0; A < C.Appearance.length; A++) - if (C.Appearance[A].Asset.IsRestraint && (InventoryGetLock(C.Appearance[A]) != null)) - return true; - return false; -} - -/** - * - * @param {Character} C - The character to scan - * @param {String} LockName - The type of lock to check for - * @returns {Boolean} - Returns TRUE if any item has the specified lock locked onto it - */ -function InventoryCharacterIsWearingLock(C, LockName) { - for (let A = 0; A < C.Appearance.length; A++) - if ((C.Appearance[A].Property != null) && (C.Appearance[A].Property.LockedBy == LockName)) - return true; - return false; -} - -/** -* Returns TRUE if the character is wearing at least one item that's a restraint with a OwnerOnly flag, such as the -* owner padlock -* @param {Character} C - The character to scan -* @returns {Boolean} - TRUE if one owner only restraint is found -*/ -function InventoryCharacterHasOwnerOnlyRestraint(C) { - if ((C.Ownership == null) || (C.Ownership.MemberNumber == null) || (C.Ownership.MemberNumber == "")) return false; - if (C.Appearance != null) - for (let A = 0; A < C.Appearance.length; A++) - if (C.Appearance[A].Asset.IsRestraint && InventoryOwnerOnlyItem(C.Appearance[A])) - return true; - return false; -} - -/** -* Returns TRUE if the character is wearing at least one item that's a restraint with a LoverOnly flag, such as the -* lover padlock -* @param {Character} C - The character to scan -* @returns {Boolean} - TRUE if one lover only restraint is found -*/ -function InventoryCharacterHasLoverOnlyRestraint(C) { - if (C.GetLoversNumbers().length == 0) return false; - if (C.Appearance != null) - for (let A = 0; A < C.Appearance.length; A++) { - if (C.Appearance[A].Asset.IsRestraint && InventoryLoverOnlyItem(C.Appearance[A])) - return true; - } - return false; -} - -/** -* Returns TRUE if at least one item on the character can be locked -* @param {Character} C - The character to scan -* @returns {Boolean} - TRUE if at least one item can be locked -*/ -function InventoryHasLockableItems(C) { - return C.Appearance.some((item) => InventoryDoesItemAllowLock(item) && InventoryGetLock(item) == null); -} - -/** - * Determines whether an item in its current state permits locks. - * @param {Item} item - The item to check - * @returns {boolean} - TRUE if the asset's current type permits locks - */ -function InventoryDoesItemAllowLock(item) { - return true; -} - -/** - * Applies a lock to an appearance item of a character - * @param {Character} C - The character on which the lock must be applied - * @param {Item|string} Item - The item from appearance to lock - * @param {Item|string} Lock - The asset of the lock or the name of the lock asset - * @param {number|string} [MemberNumber] - The member number to put on the lock, or message to show - * @param {boolean} [Update=true] - Whether or not to update the character - */ -function InventoryLock(C, Item, Lock, MemberNumber, Update = true) { - if (typeof Item === 'string') Item = InventoryGet(C, Item); - if (typeof Lock === 'string') Lock = { Asset: AssetGet(C.AssetFamily, "ItemMisc", Lock) }; - if (Item && Lock && Lock.Asset.IsLock && InventoryDoesItemAllowLock(Item)) { - if (Item.Property == null) Item.Property = {}; - if (Item.Property.Effect == null) Item.Property.Effect = []; - if (Item.Property.Effect.indexOf("Lock") < 0) Item.Property.Effect.push("Lock"); - Item.Property.LockedBy = /** @type AssetLockType */(Lock.Asset.Name); - if (MemberNumber != null) Item.Property.LockMemberNumber = MemberNumber; - if (Update) { - CharacterRefresh(C, true); - } - } -} - -/** -* Unlocks an item and removes all related properties -* @param {Character} C - The character on which the item must be unlocked -* @param {Item|string} Item - The item from appearance to unlock -*/ -function InventoryUnlock(C, Item) { - if (typeof Item === 'string') Item = InventoryGet(C, Item); - if (Item && Item.Property && Item.Property.Effect) { - ValidationDeleteLock(Item.Property, false); - CharacterRefresh(C); - } -} - -/** -* Applies a random lock on an item -* @param {Character} C - The character on which the item must be locked -* @param {Item} Item - The item from appearance to lock -* @param {Boolean} FromOwner - Set to TRUE if the source is the owner, to apply owner locks -*/ -function InventoryLockRandom(C, Item, FromOwner) { - if (InventoryDoesItemAllowLock(Item)) { - var List = []; - for (let A = 0; A < Asset.length; A++) - if (Asset[A].IsLock && Asset[A].Random && !Asset[A].LoverOnly && (FromOwner || !Asset[A].OwnerOnly)) - List.push(Asset[A]); - if (List.length > 0) { - var Lock = { Asset: InventoryGetRandom(C, null, List) }; - InventoryLock(C, Item, Lock); - } - } -} - -/** -* Applies random locks on each character items that can be locked -* @param {Character} C - The character on which the items must be locked -* @param {Boolean} FromOwner - Set to TRUE if the source is the owner, to apply owner locks -*/ -function InventoryFullLockRandom(C, FromOwner) { - for (let I = 0; I < C.Appearance.length; I++) - if (InventoryGetLock(C.Appearance[I]) == null) - InventoryLockRandom(C, C.Appearance[I], FromOwner); -} - -/** -* Removes all common keys from the player inventory -*/ -function InventoryConfiscateKey() { - InventoryDelete(Player, "MetalCuffsKey", "ItemMisc"); - InventoryDelete(Player, "MetalPadlockKey", "ItemMisc"); - InventoryDelete(Player, "IntricatePadlockKey", "ItemMisc"); - InventoryDelete(Player, "HighSecurityPadlockKey", "ItemMisc"); - InventoryDelete(Player, "Lockpicks", "ItemMisc"); -} - -/** -* Removes the remotes of the vibrators from the player inventory -*/ -function InventoryConfiscateRemote() { - InventoryDelete(Player, "VibratorRemote", "ItemVulva"); - InventoryDelete(Player, "VibratorRemote", "ItemNipples"); - InventoryDelete(Player, "LoversVibratorRemote", "ItemVulva"); - InventoryDelete(Player, "SpankingToysVibeRemote", "ItemHands"); -} - -/** -* Returns TRUE if the item is worn by the character -* @param {Character} C - The character to scan -* @param {String} AssetName - The asset / item name to scan -* @param {String} AssetGroup - The asset group name to scan -* @returns {Boolean} - TRUE if item is worn -*/ -function InventoryIsWorn(C, AssetName, AssetGroup) { - if ((C != null) && (C.Appearance != null) && Array.isArray(C.Appearance)) - for (let A = 0; A < C.Appearance.length; A++) - if ((C.Appearance[A].Asset.Name == AssetName) && (C.Appearance[A].Asset.Group.Name == AssetGroup)) - return true; - return false; -} - -/** - * Toggles an item's permission for the player - * @param {Item} Item - Appearance item to toggle - * @param {string} [Type] - Type of the item to toggle - * @param {boolean} [Worn] - True if the player is changing permissions for an item they're wearing - * @returns {void} - Nothing - */ -function InventoryTogglePermission(Item, Type, Worn) { - const onExtreme = Player.GetDifficulty() >= 3; - const blockAllowed = !Worn && !onExtreme; - const limitedAllowed = !Worn && (!onExtreme || MainHallStrongLocks.includes(Item.Asset.Name)); - - const removeFromPermissions = (B) => B.Name != Item.Asset.Name || B.Group != Item.Asset.Group.Name || B.Type != Type; - const permissionItem = { Name: Item.Asset.Name, Group: Item.Asset.Group.Name, Type: Type }; - if (InventoryIsPermissionBlocked(Player, Item.Asset.Name, Item.Asset.Group.Name, Type)) { - Player.BlockItems = Player.BlockItems.filter(removeFromPermissions); - Player.LimitedItems.push(permissionItem); - } else if (InventoryIsPermissionLimited(Player, Item.Asset.Name, Item.Asset.Group.Name, Type)) { - Player.LimitedItems = Player.LimitedItems.filter(removeFromPermissions); - } else if (InventoryIsFavorite(Player, Item.Asset.Name, Item.Asset.Group.Name, Type)) { - if (blockAllowed) - Player.BlockItems.push(permissionItem); - else if (limitedAllowed) - Player.LimitedItems.push(permissionItem); - Player.FavoriteItems = Player.FavoriteItems.filter(removeFromPermissions); - } else { - Player.FavoriteItems.push(permissionItem); - } - ServerPlayerBlockItemsSync(); -} - -/** -* Returns TRUE if a specific item / asset is blocked by the character item permissions -* @param {Character} C - The character on which we check the permissions -* @param {string} AssetName - The asset / item name to scan -* @param {string} AssetGroup - The asset group name to scan -* @param {string} [AssetType] - The asset type to scan -* @returns {boolean} - TRUE if asset / item is blocked -*/ -function InventoryIsPermissionBlocked(C, AssetName, AssetGroup, AssetType) { - if ((C != null) && (C.BlockItems != null) && Array.isArray(C.BlockItems)) - for (let B = 0; B < C.BlockItems.length; B++) - if ((C.BlockItems[B].Name == AssetName) && (C.BlockItems[B].Group == AssetGroup) && (C.BlockItems[B].Type == AssetType)) - return true; - return false; -} - - -/** -* Returns TRUE if a specific item / asset is favorited by the character item permissions -* @param {Character} C - The character on which we check the permissions -* @param {string} AssetName - The asset / item name to scan -* @param {string} AssetGroup - The asset group name to scan -* @param {string} [AssetType] - The asset type to scan -* @returns {boolean} - TRUE if asset / item is a favorite -*/ -function InventoryIsFavorite(C, AssetName, AssetGroup, AssetType) { - if ((C != null) && (C.FavoriteItems != null) && Array.isArray(C.FavoriteItems)) - for (let B = 0; B < C.FavoriteItems.length; B++) - if ((C.FavoriteItems[B].Name == AssetName) && (C.FavoriteItems[B].Group == AssetGroup) && (C.FavoriteItems[B].Type == AssetType)) - return true; - return false; -} - -/** - * Returns TRUE if a specific item / asset is limited by the character item permissions - * @param {Character} C - The character on which we check the permissions - * @param {string} AssetName - The asset / item name to scan - * @param {string} AssetGroup - The asset group name to scan - * @param {string} [AssetType] - The asset type to scan - * @returns {boolean} - TRUE if asset / item is limited - */ -function InventoryIsPermissionLimited(C, AssetName, AssetGroup, AssetType) { - if ((C != null) && (C.LimitedItems != null) && Array.isArray(C.LimitedItems)) - for (let B = 0; B < C.LimitedItems.length; B++) - if ((C.LimitedItems[B].Name == AssetName) && (C.LimitedItems[B].Group == AssetGroup) && (C.LimitedItems[B].Type == AssetType)) - return true; - return false; -} - -/** - * Returns TRUE if the item is not limited, if the player is an owner or a lover of the character, or on their whitelist - * @param {Character} C - The character on which we check the limited permissions for the item - * @param {Item} Item - The item being interacted with - * @param {String} [ItemType] - The asset type to scan - * @returns {Boolean} - TRUE if item is allowed - */ -function InventoryCheckLimitedPermission(C, Item, ItemType) { - if (!InventoryIsPermissionLimited(C, Item.Asset.DynamicName(Player), Item.Asset.Group.Name, ItemType)) return true; - if ((C.ID == 0) || C.IsLoverOfPlayer() || C.IsOwnedByPlayer()) return true; - if ((C.ItemPermission < 3) && !(C.WhiteList.indexOf(Player.MemberNumber) < 0)) return true; - return false; -} - -/** - * Returns TRUE if a specific item / asset is blocked or limited for the player by the character item permissions - * @param {Character} C - The character on which we check the permissions - * @param {Item} Item - The item being interacted with - * @param {String} [ItemType] - The asset type to scan - * @returns {Boolean} - Returns TRUE if the item cannot be used - */ -function InventoryBlockedOrLimited(C, Item, ItemType) { - let Blocked = InventoryIsPermissionBlocked(C, Item.Asset.DynamicName(Player), Item.Asset.Group.Name, ItemType); - let Limited = !InventoryCheckLimitedPermission(C, Item, ItemType); - return Blocked || Limited; -} - -/** - * Determines whether a given item is an allowed limited item for the player (i.e. has limited permissions, but can be - * used by the player) - * @param {Character} C - The character whose permissions to check - * @param {Item} item - The item to check - * @param {string | undefined} [type] - the item type to check - * @returns {boolean} - Returns TRUE if the given item & type is limited but allowed for the player - */ -function InventoryIsAllowedLimited(C, item, type) { - return !InventoryBlockedOrLimited(C, item, type) && - InventoryIsPermissionLimited(C, item.Asset.Name, item.Asset.Group.Name, type); -} - -/** - * Returns TRUE if the item is a key, having the effect of unlocking other items - * @param {Item} Item - The item to validate - * @returns {Boolean} - TRUE if item is a key - */ -function InventoryIsKey(Item) { - if ((Item == null) || (Item.Asset == null) || (Item.Asset.Effect == null)) return false; - for (let E = 0; E < Item.Asset.Effect.length; E++) - if (Item.Asset.Effect[E].substr(0, 7) == "Unlock-") - return true; - return false; -} - -/** - * Serialises the provided character's inventory into a string for easy comparisons, inventory items are uniquely - * identified by their name and group - * @param {Character} C - The character whose inventory we should serialise - * @return {string} - A simple string representation of the character's inventory - */ -function InventoryStringify(C) { - if (!C || !Array.isArray(C.Inventory)) return ""; - return C.Inventory.map(({ Name, Group }) => Group + Name ).join(); -} - -/** - * Returns TRUE if the inventory category is blocked in the current chat room - * @param {array} Category - An array of string containing all the categories to validate - * @return {boolean} - TRUE if it's blocked - */ -function InventoryChatRoomAllow(Category) { - if ((CurrentScreen == "ChatRoom") && (Category != null) && (Category.length > 0) && (ChatRoomData != null) && (ChatRoomData.BlockCategory != null) && (ChatRoomData.BlockCategory.length > 0)) - for (let C = 0; C < Category.length; C++) - if (ChatRoomData.BlockCategory.indexOf(Category[C]) >= 0) - return false; - return true; -} - -/** - * Applies a preset expression from being shocked to the character if able - * @param {Character} C - The character to update - * @returns {void} - Nothing - */ -function InventoryShockExpression(C) { - const expressions = [ - { Group: "Eyebrows", Name: "Soft", Timer: 10 }, - { Group: "Blush", Name: "Medium", Timer: 15 }, - { Group: "Eyes", Name: "Closed", Timer: 5 }, - ]; - InventoryExpressionTriggerApply(C, expressions); -} - -/** - * Extracts all lock-related properties from an item's property object - * @param {ItemProperties} property - The property object to extract from - * @returns {ItemProperties} - A property object containing only the lock-related properties from the provided property - * object - */ -function InventoryExtractLockProperties(property) { - /** @type {ItemProperties} */ - const lockProperties = {}; - for (const key of Object.keys(property)) { - if (ValidationAllLockProperties.includes(key)) { - lockProperties[key] = JSON.parse(JSON.stringify(property[key])); - } - } - return lockProperties; -} diff --git a/Scripts/Inventory.ts b/Scripts/Inventory.ts new file mode 100644 index 000000000..d18585e90 --- /dev/null +++ b/Scripts/Inventory.ts @@ -0,0 +1,16 @@ +/** +* Gets the current item / cloth worn a specific area (AssetGroup) +* @param C - The character on which we must check the appearance +* @param AssetGroup - The name of the asset group to scan +* @returns Returns the appearance which is the item / cloth asset, color and properties +*/ +function InventoryGet(C: Character, AssetGroup: string): Item | null { + for (let A = 0; A < C.Appearance.length; A++) { + if ((C.Appearance[A].Asset != null) && (C.Appearance[A].Asset.Group.Name == AssetGroup)) + return C.Appearance[A]; + + if ((C.Appearance[A].Model != null) && (C.Appearance[A].Model.Group == AssetGroup)) + return C.Appearance[A]; + } + return null; +} \ No newline at end of file diff --git a/Scripts/KDMods.js b/Scripts/KDMods.js deleted file mode 100644 index 8315059f8..000000000 --- a/Scripts/KDMods.js +++ /dev/null @@ -1,139 +0,0 @@ -"use strict"; - -let KDModsLoaded = false; - -let KDMods = {}; -let KDModIndex = 0; -let KDModCount = 9; -let KDModSpacing = 50; - -function KDDrawMods() { - let count = 0; - let keys = Object.keys(KDMods); - for (let i = KDModIndex; i < keys.length && count < KDModCount; i++) { - DrawTextKD(keys[i], 975, 370 + KDModSpacing * count, "#ffffff", KDTextGray2); - DrawButtonKDEx("moddelete_" + i, (bdata) => { - delete KDMods[keys[i]]; - return true; - }, true, 1275, 350 + KDModSpacing * count, 200, 45, TextGet("KinkyDungeonDeleteMod"), "#ffffff", ""); - count++; - } -} - -function getFileInput() { - let input = document.createElement('input'); - input.type = 'file'; - input.onchange = _this => { - let files = Array.from(input.files); - KDLoadMod(files); - }; - input.click(); -} - -function KDLoadMod(files) { - console.log(files); - for (let f of files) { - if (f && f.name) { - KDMods[f.name] = f; - } - } -} - -async function KDExecuteMods() { - KDAllModFiles = []; - for (let file of Object.values(KDMods)) { - let entries = await model.getEntries(file, {}); - if (entries && entries.length) { - //const filenamesUTF8 = Boolean(!entries.find(entry => !entry.filenameUTF8)); - //const encrypted = Boolean(entries.find(entry => entry.encrypted)); - //encodingInput.value = filenamesUTF8 ? "utf-8" : filenameEncoding || "cp437"; - - entries.forEach((entry, entryIndex) => { - KDAllModFiles.push(entry); - }); - - } - - } - - for (let entry of KDAllModFiles) { - console.log(entry); - const controller = new AbortController(); - const signal = controller.signal; - const blobURL = await model.getURL(entry, { - password: undefined, - onprogress: (index, max) => { - console.log(`Loading progress: ${index},${max}`); - }, - signal - }); - console.log(blobURL); - let blob = await fetch(blobURL).then(r => r.blob()); - console.log(blob); - let reader = new FileReader(); - - if (entry.filename.endsWith('.js') || entry.filename.endsWith('.ks')) { - let file = new File([blob], entry.filename); - // Eval js files. eval() is dangerous. Don't load untrusted mods. - reader.onload = function(event) { - console.log("EXECUTING MOD FILE " + file.name); - if (typeof event.target.result === "string") - // eslint-disable-next-line no-eval - eval(event.target.result); - }; - reader.readAsText(file); - } else { - KDModFiles[KinkyDungeonRootDirectory + entry.filename] = URL.createObjectURL(blob); - KDModFiles[KinkyDungeonRootDirectory + "/" + entry.filename] = KDModFiles[KinkyDungeonRootDirectory + entry.filename]; - - if (entry.filename?.startsWith("Data/")) KDModFiles["Data/" + entry.filename] = URL.createObjectURL(blob); - if (entry.filename?.startsWith("Music/")) KDModFiles["Music/" + entry.filename] = URL.createObjectURL(blob); - } - - } - - if (KDAllModFiles.length > 0) - KDModsLoaded = true; - - KinkyDungeonRefreshRestraintsCache(); - KinkyDungeonRefreshEnemiesCache(); -} - - -if (typeof TransformStream == "undefined") { - const script = document.createElement("script"); - script.src = "lib/web-streams-polyfill.min.js"; - document.body.appendChild(script); -} - - -const model = (() => { - - return { - getEntries(file, options) { - return (new zip.ZipReader(new zip.BlobReader(file))).getEntries(options); - }, - async getURL(entry, options) { - return URL.createObjectURL(await entry.getData(new zip.BlobWriter(), options)); - }, - getEntryFile : function(entry, creationMethod, onend, onprogress) { - var writer, zipFileEntry; - - function getData() { - entry.getData(writer, function(blob) { - var blobURL = creationMethod == "Blob" ? URL.createObjectURL(blob) : zipFileEntry.toURL(); - onend(blobURL); - }, onprogress); - } - //Write the entire file as a blob - if (creationMethod == "Blob") { - writer = new zip.BlobWriter(); - getData(); - } else { - //Use the file writer to write the file clicked by user. - console.log("No blob"); - } - } - }; - -})(); diff --git a/Scripts/KDMods.ts b/Scripts/KDMods.ts new file mode 100644 index 000000000..ae7e5ca1d --- /dev/null +++ b/Scripts/KDMods.ts @@ -0,0 +1,710 @@ +let KDModsLoaded = false; + +let KDMods: Record = {}; +let KDModInfo: Record = {}; +let KDModIndex = 0; +let KDModCount = 9; +let KDModSpacing = 50; + +let KDGetMods = false; +let KDOffline = false; + +let KDModCompat = { + "KinkyDungeonHiddenFactions.push(": "KinkyDungeonHiddenFactionsPush(", + "KDSetNPCLocation(": "KDMovePersistentNPC(", + "KinkyDungeonChangeDesire(": "KDChangeDesire('','','',", + "KinkyDungeonChangeCharge(": "KDChangeCharge('','','',", + "KinkyDungeonChangeWill(": "KDChangeWill('','','',", + "KinkyDungeonChangeStamina(": "KDChangeStamina('','','',", + "KinkyDungeonChangeMana(": "KDChangeMana('','','',", + "KDChangeBalance(": "KDChangeBalanceSrc('','','',", + "KinkyDungeonChangeDistraction(": "KDChangeDistraction('','','',", +}; + +/** For mod compat */ +function CharacterLoadCanvas() {} + +let KDModToggleTab = "None"; +let KDModListPage = 0; +let KDModPage = 0; +let KDModSettings = {}; +let KDModConfigs = {}; +let KDModFileCount = 0; + +interface MODJSON { + modname: string, + moddesc: string, + author: string, + modbuild: number, + gamemajor: number, + gameminor: number, + gamepatch_min: number, + gamepatch_max: number, + /** Higher = earlier */ + priority: number, + /** number is minimum version number UNIMPLEMENTED */ + dependencies?: Record, + /** optional or recommended UNIMPLEMENTED */ + optional?: Record, + /** warn or error UNIMPLEMENTED */ + incompatibilities?: Record, + /** if the mod id is present, loads before. UNIMPLEMENTED */ + loadbefore?: string[], + /** if the mod id is present, loads after. UNIMPLEMENTED */ + loadafter?: string[], + /** if the mod needs to load certain files first, specify them here */ + fileorder?: string[], +} + +function KDLoadModJSON(json: string): MODJSON { + let ret: MODJSON = { + modname: "", + moddesc: "", + author: "", + + modbuild: 0, + gamemajor: 5, + gameminor: 3, + gamepatch_min: -1, + gamepatch_max: -1, + priority: 0, + fileorder: [], + }; + + try { + // Reduce chance of bomb + if (json.length < 100000) { + Object.assign(ret, JSON.parse(json)); + } + } catch (e) { + console.log(e.toString()); + } + + return ret; +} + +async function KDGetModsLoad(execute) { + try { + //@ts-ignore + let API = window.kdAPI; + if (API) { + KDOffline = true; + /*if (localStorage.getItem("KDMods") && JSON.parse(localStorage.getItem("KDMods"))) { + let mods = JSON.parse(localStorage.getItem("KDMods")); + if (mods) + for (let m of mods) { + if (m) { + let fileObject = await API.getFile(m); + if (fileObject) KDMods[fileObject.base] = fileObject.file; + } + } + }*/ + let modFiles = await API.getMods(); + for (let mod of modFiles) { + if (mod.file) { + // Create a Blob using the buffer + const blob = new Blob([mod.file], { type: 'application/octet-stream' }); + + // Create a File object with the Blob + const fileObject = new File([blob], mod.base, { type: 'application/octet-stream' }); + if (fileObject) { + KDMods[mod.base] = fileObject; + } + } + + } + + } + } catch (err) { + // We are online and no local mod loading :() + } + + if (execute) { + KDExecuteMods(); + } else { + await KDUpdateModInfo(); + } +} + +function KDDrawMods() { + if (!KDGetMods && (KDToggles.AutoLoadMods || KDToggles.AutoLoadMods == undefined)) { + KDGetMods = true; + KDGetModsLoad(false); + } + let count = 0; + let keys = KDModLoadOrder.map((ent) => {return ent.name;}); + for (let i = KDModIndex; i < keys.length && count < KDModCount; i++) { + let color = "#222222"; + let info = "KDNoModJSON"; + let name = keys[i]; + let ver = 0; + if (KDModInfo[keys[i]]) { + color = "#ffffff"; + info = ""; + try { + name = KDModInfo[keys[i]].modname || name; // if blank, ignore modname + if (KDModInfo[keys[i]].gamemajor >= 0 && VersionMajor != KDModInfo[keys[i]].gamemajor) { + color = "#ff5277"; + info = "KDModOutdated2"; + } else if (KDModInfo[keys[i]].gameminor >= 0 && VersionMinor != KDModInfo[keys[i]].gameminor) { + color = "#ff8800"; + info = "KDModOutdated3"; + } else if (KDModInfo[keys[i]].gamepatch_min >= 0 && VersionPatch < KDModInfo[keys[i]].gamepatch_min) { + color = "#ffff00"; + info = "KDModOutdated"; + } else if (KDModInfo[keys[i]].gamepatch_max >= 0 && VersionPatch > KDModInfo[keys[i]].gamepatch_max) { + color = "#ffff00"; + info = "KDModOutdated"; + } + + ver = KDModInfo[keys[i]].modbuild; + } catch (e) { + console.log(e.toString()); + color = "#ff00ff"; + info = "KDModMiscError"; + } + } + DrawTextKD(name + (info ? ` (${TextGet(info)})` : (TextGet("KDModVer") + ver)), 975, 370 + KDModSpacing * count, color, KDTextGray2); + if (!KDExecuted) + DrawButtonKDEx("moddelete_" + i, (bdata) => { + delete KDMods[keys[i]]; + delete KDModInfo[keys[i]]; + KDUpdateModInfo(); + return true; + }, true, 1275, 350 + KDModSpacing * count, 200, 45, TextGet("KinkyDungeonDeleteMod"), "#ffffff", ""); + count++; + } +} + +function getFileInput(callback?, ...callbackArgs) { + let input = document.createElement('input'); + input.type = 'file'; + input.multiple = true; + input.onchange = _this => { + let files = Array.from(input.files); + if (callback) {callback(files,...callbackArgs);} + else KDLoadMod(files); + }; + input.click(); +} + +function KDLoadMod(files: any[]) { + console.log(files); + for (let f of files) { + if (f && f.name) { + KDMods[f.name] = f; + KDLoadModJSON[f.name] = null; + } + } + + KDUpdateModInfo(); +} + +let KDExecuted = false; +let KDLoading = false; + +async function KDExecuteModsAndStart() { + await KDExecuteMods(); + + if (!KDToggles.OverrideOutfit) + KinkyDungeonConfigAppearance = false; + KinkyDungeonStartNewGame(true); +} + +/** Updates mod info by unzipping mods and reading the info only */ +async function KDUpdateModInfo() { + while (KDLoading) { + await sleep(100); + } + KDLoading = false; + let errored = false; + let modsProcessed = 0; + let modFiles: {mod: File, name: string, priority: number, fileorder: string[]}[] = []; + try { + KDModLoadOrder = []; + for (let mod of Object.entries(KDMods)) { + let file = mod[1]; + let entries = await model.getEntries(file, {}); + let priority = 0; + let foundInfo = false; + if (entries && entries.length) { + for (let entry of entries) { + let filename = entry.filename.split('/').pop(); + if (filename == 'mod.json') { + foundInfo = true; + const controller = new AbortController(); + const signal = controller.signal; + const blobURL = await model.getURL(entry, { + password: undefined, + onprogress: (index, max) => { + console.log(`Loading progress: ${index},${max}`); + }, + signal + }); + let blob = await fetch(blobURL).then(r => r.blob()); + let reader = new FileReader(); + let file = new File([blob], entry.filename); + + reader.onload = function(event) { + console.log("LOADING MOD INFO " + file.name); + if (typeof event.target.result === "string") { + //@ts-ignore + let res = event.target.result; + let json = KDLoadModJSON(res); + if (json) { + KDModInfo[mod[0]] = json; + if (json.priority) { + priority = json.priority; + } + + modFiles.push({mod: mod[1], name: mod[0], priority: priority, fileorder: json.fileorder}); + + KDModLoadOrder = modFiles.sort((a, b) => { + return (b.priority || 0) - (a.priority || 0); + }).map((ent) => {return {mod: ent.mod, name: ent.name, fileorder: ent.fileorder};}); + modsProcessed += 1; + } + } + }; + await reader.readAsText(file); + + } + } + } + if (!foundInfo) { + modFiles.push({mod: mod[1], name: mod[0], priority: priority, fileorder: []}); + modsProcessed += 1; + } + } + console.log(modFiles); + } catch (e) { + modsProcessed = Object.entries(KDMods).length; + console.log(e.toString()); + errored = true; + KDModLoadOrder = Object.entries(KDMods).map((ent) => {return {mod: ent[1], name: ent[0], fileorder: []};}); + } + while(modsProcessed < Object.entries(KDMods).length) { + await sleep(100); + } + if (!errored) + KDModLoadOrder = modFiles.sort((a, b) => { + return (b.priority || 0) - (a.priority || 0); + }).map((ent) => {return {mod: ent.mod, name: ent.name, fileorder: ent.fileorder};}); + KDLoading = false; + +} + +let KDModLoadOrder: {mod: File, name: string, fileorder: string[]}[] = []; + +async function KDExecuteMods() { + if (KDExecuted) return; + KDExecuted = true; + KDAwaitingModLoad = true; + KDAllModFiles = []; + + await KDUpdateModInfo(); + + if (KDOffline) { + let mods = []; + for (let file of KDModLoadOrder.map((ent) => {return ent.mod;})) { + //@ts-ignore + console.log(file.path); + //@ts-ignore + mods.push(file.path); + } + //@ts-ignore + localStorage.setItem("KDMods", JSON.stringify(mods)); + + await KDUpdateModInfo(); + } + for (let file of KDModLoadOrder.map((ent) => {return ent.mod;})) { + let entries = await model.getEntries(file, {}); + if (entries && entries.length) { + //const filenamesUTF8 = Boolean(!entries.find(entry => !entry.filenameUTF8)); + //const encrypted = Boolean(entries.find(entry => entry.encrypted)); + //encodingInput.value = filenamesUTF8 ? "utf-8" : filenameEncoding || "cp437"; + + entries.forEach((entry, entryIndex) => { + KDAllModFiles.push(entry); + }); + + KDModFileCount++; + + } + + } + + let processMod = async (mod) => { + console.log(`Loading ${mod.name}`) + let fileloader = Promise.resolve(null); + let entries = await model.getEntries(mod.mod, {}); + + // Look through each file and add it if it is missing. We will load files in this + // order with any missing files at the end. + for (let entry of entries) { + if ((!mod.fileorder.includes(entry.filename)) && (!entry.filename.endsWith('.csv'))) { + mod.fileorder.push(entry.filename); + } + } + for (let entry of entries) { + if (entry.filename.endsWith(`EN.csv`)) { + mod.fileorder.push(entry.filename); + } + } + if (TranslationLanguage !== '') { + for (let entry of entries) { + if (entry.filename.endsWith(`${TranslationLanguage}.csv`)) { + mod.fileorder.push(entry.filename); + } + } + } + console.log(mod.fileorder); + + try { + await mod.fileorder.reduce(async (promiseChain, currFile) => { + await promiseChain; + return processFile(currFile, entries); + }, Promise.resolve(null)); + } catch (err) { + console.log(err); + } + } + + let processFile = async (file, entries) => { + console.log("Loading " + file); + try { + const entry = entries.find((ent) => ent.filename == file); + const controller = new AbortController(); + const signal = controller.signal; + const blobURL = await model.getURL(entry, { + password: undefined, + onprogress: (index, max) => { + console.log(`Loading progress: ${index},${max}`); + }, + signal + }); + console.log(blobURL); + let blob = await fetch(blobURL).then(r => r.blob()); + console.log(blob); + + // ignore files that start with . + if (file.startsWith('.')) { + // none + // Translation file. As this may overwrite, we should chain this + } else if (file.endsWith('EN.csv') || ((file.endsWith(`${TranslationLanguage}.csv`)) && (TranslationLanguage !== ''))) { + try { + let reader = new FileReader(); + let file = new File([blob], entry.filename); + reader.onload = function(event) { + console.log(`READING TRANSLATIONS FILE ${file}`); + if (typeof event.target.result === "string") { + //@ts-ignore + let res = event.target.result; + KDLoadTranslations(res); + } + }; + reader.readAsText(file); + } + catch (err) { + console.log(`Error while loading ${file} - ${err}`); + } + // create a thenable promise if the file is a js or ks file. + } else if (file.endsWith('.js') || file.endsWith('.ks')) { + try { + let reader = new FileReader(); + let readfile = new File([blob], entry.filename); + // Eval js files. eval() is dangerous. Don't load untrusted mods. + await new Promise((resolve,reject) => { + reader.onload = async function(event) { + console.log("EXECUTING MOD FILE " + file); + if (typeof event.target.result === "string") { + //@ts-ignore + let res = event.target.result; + if (KDToggles.ModCompat) { + for (let compat of Object.entries(KDModCompat)) { + console.log(`Replacing ${compat[0]} with ${compat[1]}`); // Debugging + const escapedKey = compat[0].replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + res = res.replace(new RegExp(escapedKey, 'g'), compat[1]); + } + } + let evaluated = await eval(res); + resolve(evaluated); + } + }; + reader.readAsText(readfile); + }) + } + catch (err) { + console.log(`Error while loading ${file} - ${err}`); + } + // asset file - just return the promise after loading with PIXI as the load order here won't be critical. + } else { + KDModFiles[KinkyDungeonRootDirectory + file] = URL.createObjectURL(blob); + KDModFiles[KinkyDungeonRootDirectory + "" + file] = KDModFiles[KinkyDungeonRootDirectory + file]; + + if (file?.startsWith("Data/") + || file?.startsWith("DisplacementMaps/") + || file?.startsWith("Models/") + || file?.startsWith("ModelsBack/") + || file?.startsWith("TextureAtlas/") + || file?.startsWith("Music/")) { + KDModFiles[file] = URL.createObjectURL(blob); + KDModFiles[PIXI.utils.path.toAbsolute(file)] = URL.createObjectURL(blob); + } + } + } catch (err) { + console.log(err); + } + } + + try { + await KDModLoadOrder.reduce(async (promiseChain, currMod) => { + await promiseChain; + return processMod(currMod); + }, Promise.resolve(null)); + // All mods should be loaded at this point. + console.log("Finished Loading Mods"); + KDLoadModSettings(); + } catch (err) { + console.log(err); + } + + for (let [k, v] of Object.entries(KDModFiles) as [string, string][]) { + // compat w/ PIXI loading + let ext = PIXI.utils.path.extname(k); + //if (ext) PIXI.Assets.load(); + KDModFiles[PIXI.utils.path.toAbsolute(k)] = v; + PIXI.Assets.resolver.add(k, { + src: v, + format: ext, + }); + PIXI.Assets.resolver.add(PIXI.utils.path.toAbsolute(k), { + src: v, + format: ext, + }); + } + + if (KDAllModFiles.length > 0) + KDModsLoaded = true; + + KDLoadPerks(); + KinkyDungeonRefreshRestraintsCache(); + KinkyDungeonRefreshEnemiesCache(); + KDAwaitingModLoad = false; + + KinkyDungeonSendEvent("afterLoadMods", {}); +} + +function KDDrawModConfigs() { + let XX = KDToggleTab == "Main" ? 940 : 540; + let YYstart = 140; + let YYmax = 800; + let YY = YYstart; + let YYd = 74; + let XXd = 450; + let toggles = Object.keys(KDToggles); + YY = YYstart + 50; + YYd = 80; + let CombarXX = 550; + let modrows = 8; // Number of mods or config options + // Draw text as a title for mod configuration + DrawTextFitKD(`Mod Configuration - ${TextGet("KDModButton" + (KDModToggleTab))}`, 1250, YYstart - 70, 1000, "#ffffff", undefined, 40); + let loadedmods = Object.keys(KDModConfigs); + loadedmods = loadedmods.splice((KDModListPage) * modrows, modrows); // Select only the page of mods for which we are on + loadedmods.forEach((loadedmod) => { + DrawButtonKDEx(TextGet("KDModButton" + (loadedmod)), () => { + console.log("Pressed button for " + loadedmod); + KDModPage = 0; + KDModToggleTab = loadedmod; + return true; + }, true, CombarXX, YY, 300, 64, TextGet("KDModButton" + (loadedmod)), "#ffffff", ""); + YY += YYd; + }) + if (Object.keys(KDModConfigs).length > modrows) { + if (KDModListPage != 0) { + DrawButtonKDEx("KDModConfigListUp", (b) => { + KDModListPage -= 1; + return true; + }, true, CombarXX + 105, YYstart, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Up.png"); + } + if (KDModListPage < (((Object.keys(KDModConfigs).length % modrows) == 0) ? (Object.keys(KDModConfigs).length / modrows - 1) : Math.floor(Object.keys(KDModConfigs).length / modrows))) { + DrawButtonKDEx("KDModConfigListDown", (b) => { + KDModListPage += 1; + return true; + }, true, CombarXX + 105, YYstart + ((YYd) * modrows) + 50, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Down.png"); + } + } + YY = YYstart + 50; + YYd = 80; + let modtoggleoffset = 350; + if (KDModConfigs.hasOwnProperty(KDModToggleTab)) { + let configtabset = KDModConfigs[KDModToggleTab].slice((KDModPage) * (modrows * 2), (KDModPage) * (modrows * 2) + (modrows * 2)); + let modsecondrowoffset = 0; + let modtogglecount = 0; + configtabset.forEach((modbutton) => { + // variable is a toggle of some sort that is expecting a true/false value. + if (modbutton.type == "boolean") { + if (KDModSettings[KDModToggleTab] == undefined) { KDModSettings[KDModToggleTab] = {}}; + if (KDModSettings[KDModToggleTab][modbutton.refvar] == undefined) { KDModSettings[KDModToggleTab][modbutton.refvar] = (modbutton.default != undefined) ? modbutton.default : false}; + var blocking = (typeof modbutton.block == "function") ? modbutton.block() : undefined + DrawCheckboxKDEx(modbutton.refvar, (bdata) => { + KDModSettings[KDModToggleTab][modbutton.refvar] = !KDModSettings[KDModToggleTab][modbutton.refvar] + return true; + }, blocking ? false : true, CombarXX + modtoggleoffset + modsecondrowoffset, YY, 64, 64, TextGet(`KDModButton${modbutton.refvar}`), KDModSettings[KDModToggleTab][modbutton.refvar], false, blocking ? "#888888" : "#ffffff"); + YY += YYd; + } + // variable is a range that cycles by stepcount between rangelow and rangehigh. + else if (modbutton.type == "range") { + if (KDModSettings[KDModToggleTab] == undefined) { KDModSettings[KDModToggleTab] = {}}; + if (KDModSettings[KDModToggleTab][modbutton.refvar] == undefined) { KDModSettings[KDModToggleTab][modbutton.refvar] = (modbutton.default != undefined) ? modbutton.default : ((modbutton.rangehigh + modbutton.rangelow) / 2)}; + var blocking = (typeof modbutton.block == "function") ? modbutton.block() : undefined + // Determine the significant digits from the stepcount - this will be used in a .toFixed operation to ensure we get valid results. + let decimalPlacesInBase = (modbutton.stepcount.toString()).includes('.') ? (modbutton.stepcount.toString()).split('.')[1].length : 0; + // Left to decrement + DrawButtonKDEx(`ModRangeButtonL${modbutton.name}`, (bdata) => { + if (KDModSettings[KDModToggleTab][modbutton.refvar] > modbutton.rangelow) { + KDModSettings[KDModToggleTab][modbutton.refvar] = parseFloat((KDModSettings[KDModToggleTab][modbutton.refvar] - modbutton.stepcount).toFixed(decimalPlacesInBase)) + } + return true; + }, blocking ? false : true, CombarXX + modtoggleoffset + modsecondrowoffset, YY, 64, 64, '<', blocking ? "#888888" : "#ffffff"); + // Label for the button + DrawTextFitKD(`${TextGet(`KDModButton${modbutton.refvar}`)}: ${KDModSettings[KDModToggleTab][modbutton.refvar]}`, CombarXX + modtoggleoffset + 64 + 190 + modsecondrowoffset, YY + 32, 360, blocking ? "#888888" : "#ffffff", undefined, 30); + // Right to increment + DrawButtonKDEx(`ModRangeButtonR${modbutton.name}`, (bdata) => { + if (KDModSettings[KDModToggleTab][modbutton.refvar] < modbutton.rangehigh) { + KDModSettings[KDModToggleTab][modbutton.refvar] = parseFloat((KDModSettings[KDModToggleTab][modbutton.refvar] + modbutton.stepcount).toFixed(decimalPlacesInBase)) + } + return true; + }, blocking ? false : true, CombarXX + modtoggleoffset + 64 + 360 + 20 + modsecondrowoffset, YY, 64, 64, '>', blocking ? "#888888" : "#ffffff"); + YY += YYd; + } + // variable has custom code that wants to run when clicking a button. + else if ((modbutton.type == "custom") || (modbutton.type == "button")) { + if (KDModSettings[KDModToggleTab] == undefined) { KDModSettings[KDModToggleTab] = {}}; + if (KDModSettings[KDModToggleTab][modbutton.refvar] == undefined) { KDModSettings[KDModToggleTab][modbutton.refvar] = (modbutton.default != undefined) ? modbutton.default : false}; + var blocking = (typeof modbutton.block == "function") ? modbutton.block() : undefined + + DrawButtonKDEx(modbutton.name, modbutton.click, blocking ? false : true, CombarXX + modtoggleoffset + modsecondrowoffset, YY, 370, 64, (TextGet(`KDModButton${modbutton.refvar}`) != `KDModButton${modbutton.refvar}`) ? TextGet(`KDModButton${modbutton.refvar}`) : modbutton.name, blocking ? "#888888" : "#ffffff", ""); + YY += YYd; + } + // variable is a spacer - Only print text here. + else if (modbutton.type == "text") { + var blocking = (typeof modbutton.block == "function") ? modbutton.block() : undefined + DrawTextFitKD(`${(modbutton.refvar != undefined) ? TextGet(`KDModButton${modbutton.refvar}`) : ""}`, CombarXX + modtoggleoffset + 64 + 190 + modsecondrowoffset, YY + 32, 480, blocking ? "#888888" : "#ffffff", undefined, 30); + YY += YYd; + } + // variable is a string value - Put an input box here. + else if (modbutton.type == "string") { + let elem = (KDTextField(modbutton.refvar, CombarXX + modtoggleoffset + modsecondrowoffset, YY, 480, 64, undefined, KDModSettings[KDModToggleTab][modbutton.refvar], "100")).Element; + elem.addEventListener('input', function() { + let currValue = elem.value; + KDModSettings[KDModToggleTab][modbutton.refvar] = currValue; + }) + YY += YYd; + } + // variable is a list of options - Similar to range, but we are iterating over an options property. + else if (modbutton.type == "list") { + if (KDModSettings[KDModToggleTab] == undefined) { KDModSettings[KDModToggleTab] = {}}; + if (KDModSettings[KDModToggleTab][modbutton.refvar] == undefined) { modbutton.default }; + var blocking = (typeof modbutton.block == "function") ? modbutton.block() : undefined + // Left to decrement + DrawButtonKDEx(`ModRangeButtonL${modbutton.name}`, (bdata) => { + let newindex = ((modbutton.options.indexOf(KDModSettings[KDModToggleTab][modbutton.refvar])-1) == -1) ? (modbutton.options.length-1) : (modbutton.options.indexOf(KDModSettings[KDModToggleTab][modbutton.refvar])-1); + KDModSettings[KDModToggleTab][modbutton.refvar] = modbutton.options[newindex]; + return true; + }, blocking ? false : true, CombarXX + modtoggleoffset + modsecondrowoffset, YY, 64, 64, '<', blocking ? "#888888" : "#ffffff"); + // Label for the button + DrawTextFitKD(`${TextGet(`KDModButton${modbutton.refvar}`)}: ${KDModSettings[KDModToggleTab][modbutton.refvar]}`, CombarXX + modtoggleoffset + 64 + 190 + modsecondrowoffset, YY + 32, 360, blocking ? "#888888" : "#ffffff", undefined, 30); + // Right to increment + DrawButtonKDEx(`ModRangeButtonR${modbutton.name}`, (bdata) => { + let newindex = ((modbutton.options.indexOf(KDModSettings[KDModToggleTab][modbutton.refvar])+1) == modbutton.options.length) ? (0) : (modbutton.options.indexOf(KDModSettings[KDModToggleTab][modbutton.refvar])+1); + KDModSettings[KDModToggleTab][modbutton.refvar] = modbutton.options[newindex]; + return true; + }, blocking ? false : true, CombarXX + modtoggleoffset + 64 + 360 + 20 + modsecondrowoffset, YY, 64, 64, '>', blocking ? "#888888" : "#ffffff"); + YY += YYd; + } + modtogglecount++; + if (modtogglecount == 8) { + modsecondrowoffset = 550; + YY = YYstart + 50; + } + }) + if (KDModConfigs[KDModToggleTab].length > (modrows * 2)) { + if (KDModPage != 0) { + DrawButtonKDEx("KDModToggleListUp", (b) => { + KDModPage -= 1; + return true; + }, true, CombarXX + 105 + modtoggleoffset * 2, YYstart, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Up.png"); + } + if (KDModPage < (((KDModConfigs[KDModToggleTab].length % (modrows * 2)) == 0) ? (KDModConfigs[KDModToggleTab].length / (modrows * 2) - 1) : Math.floor(KDModConfigs[KDModToggleTab].length / (modrows * 2)))) { + DrawButtonKDEx("KDModToggleListDown", (b) => { + KDModPage += 1; + return true; + }, true, CombarXX + 105 + modtoggleoffset * 2, YYstart + ((YYd) * modrows) + 50, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Down.png"); + } + } + } + DrawButtonKDEx("KBBackOptions", () => { + KinkyDungeonKeybindingsTemp = Object.assign({}, KinkyDungeonKeybindingsTemp); + KinkyDungeonState = "Menu"; + try { + localStorage.setItem("KDModSettings", JSON.stringify(KDModSettings)); + } + catch (err) { + console.error(err); + } + KinkyDungeonSendEvent("afterModConfig", {}); // Mods can register events with this handle in generic events, to do stuff after leaving the mod config window. + return true; + }, true, 975, 880, 550, 64, TextGet("GameReturnToMenuFromOptions"), "#ffffff", ""); +} + +function KDLoadModSettings() { + try { + KDModSettings = JSON.parse(localStorage.getItem('KDModSettings')) + // Assign null objects as {} + if (KDModSettings === null) { KDModSettings = {} } + } + catch (err) { + console.log("Cannot load mod config from local storage.") + } + addTextKey("KDModConfigsButton", "Mod Configuration"); + KinkyDungeonSendEvent("afterModSettingsLoad", {}); +} + +if (typeof TransformStream == "undefined") { + const script = document.createElement("script"); + script.src = "lib/web-streams-polyfill.min.js"; + document.body.appendChild(script); +} + + +const model = (() => { + + return { + getEntries(file, options) { + return (new zip.ZipReader(new zip.BlobReader(file))).getEntries(options); + }, + async getURL(entry, options) { + return URL.createObjectURL(await entry.getData(new zip.BlobWriter(), options)); + }, + getEntryFile : function(entry, creationMethod, onend, onprogress) { + var writer, zipFileEntry; + + function getData() { + entry.getData(writer, function(blob) { + var blobURL = creationMethod == "Blob" ? URL.createObjectURL(blob) : zipFileEntry.toURL(); + onend(blobURL); + }, onprogress); + } + //Write the entire file as a blob + if (creationMethod == "Blob") { + writer = new zip.BlobWriter(); + getData(); + } else { + //Use the file writer to write the file clicked by user. + console.log("No blob"); + } + } + }; + +})(); diff --git a/Scripts/Loader.js b/Scripts/Loader.js deleted file mode 100644 index ede300927..000000000 --- a/Scripts/Loader.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; - -// Loading bar -const PROGRESS_ROOT = document.getElementById('load-progress-root'); -const PROGRESS_BAR = document.getElementById('load-progress-bar'); -const PROGRESS_TEXT = document.getElementById('load-progress-text'); - -function updateProgress(text, num, div) { - const pct = 50 * num / div; - PROGRESS_BAR.style.width = `${pct}%`; - PROGRESS_TEXT.innerText = `${text} ${num} / ${div}`; -} - -updateProgress('Loading...', 0., 1); \ No newline at end of file diff --git a/Scripts/Main.js b/Scripts/Main.js deleted file mode 100644 index 1a8ef8b17..000000000 --- a/Scripts/Main.js +++ /dev/null @@ -1,201 +0,0 @@ -// While we want KD to be backwards compatible with BC, we want to avoid making modifications that are standalone specific to the KD code itself -// These bootstraps must be loaded last, as they replace BC specific KD functionality -KinkyDungeonMainRun = () => {}; -KinkyDungeonMainClick = () => {}; - -ChatRoomChatLog = []; -ChatRoomLastMessage = []; - -PreferenceMessage = ""; - -ChatRoomCharacterUpdate = () => {}; -ChatRoomCharacterItemUpdate = () => {}; - -ArcadeKinkyDungeonEnd = () => {} -KinkyDungeonMultiplayerUpdate = () => {}; - -ArcadeDeviousDungeonChallenge = false; - -const _CharacterAppearanceSetDefault = CharacterAppearanceSetDefault; -const _CharacterAppearanceFullRandom = CharacterAppearanceFullRandom; -const _CharacterLoadCanvas = CharacterLoadCanvas; -const _CharacterRefresh = CharacterRefresh; - -function suppressCanvasUpdate(fn) { - CharacterAppearanceSetDefault = () => {}; - CharacterAppearanceFullRandom = () => {}; - CharacterLoadCanvas = () => {}; - CharacterRefresh = () => {}; - let ret = fn(); - CharacterAppearanceSetDefault = _CharacterAppearanceSetDefault; - CharacterAppearanceFullRandom = _CharacterAppearanceFullRandom; - CharacterLoadCanvas = _CharacterLoadCanvas; - CharacterRefresh = _CharacterRefresh; - return ret; -} - -window.onload = function() { - ArcadeDeviousDungeonChallenge = false; - KinkyDungeonRootDirectory = "Game/"; - - // window.onload in index.html - ServerURL = "foobar"; - CommonIsMobile = CommonDetectMobile(); - TranslationLoad(); - DrawLoad(); - AssetLoadAll(); - ControllerActive = false; - let _TextLoad = TextLoad; // Avoid nonexistent text query - TextLoad = () => {}; - CommonSetScreen("KinkyDungeon", "KinkyDungeonMain"); - TextLoad = _TextLoad; - MainRun(0); - - // LoginLoad - Character = []; - CharacterNextId = 1; - suppressCanvasUpdate(() => CharacterReset(0, "Female3DCG")); - - Player.ArousalSettings = {}; - Player.ArousalSettings.VFXFilter = "VFXFilterHeavy"; - Player.OnlineSharedSettings = {}; - Player.OnlineSharedSettings.ItemsAffectExpressions = true - Player.AudioSettings = {}; - Player.AudioSettings.Volume = 1; - Player.ImmersionSettings = {}; - - CharacterLoadCSVDialog(Player); - - CharacterAppearanceSetDefault(Player); - CurrentCharacter = null; - MiniGameStart("KinkyDungeon", 1, "ArcadeKinkyDungeonEnd"); - - // Default keybindings, these are initialized as part of the Player - KinkyDungeonKeybindings = { - Down: "KeyS", - DownLeft: "KeyZ", - DownRight: "KeyC", - Left: "KeyA", - Right: "KeyD", - Skip: "Space", - Spell1: "Digit1", - Spell2: "Digit2", - Spell3: "Digit3", - Spell4: "Digit4", - Spell5: "Digit5", - Up: "KeyW", - UpLeft: "KeyQ", - UpRight: "KeyE", - Wait: "KeyX", - }; - if (localStorage.getItem("KinkyDungeonKeybindings") && JSON.parse(localStorage.getItem("KinkyDungeonKeybindings"))) { - KinkyDungeonKeybindings = JSON.parse(localStorage.getItem("KinkyDungeonKeybindings")); - } -}; - -/** - * Main game running state, runs the drawing - * @param {number} Timestamp - */ -function MainRun(Timestamp) { - DrawProcess(Timestamp); - TimerProcess(Timestamp); -} - -/** - * When the user presses a key, we send the KeyDown event to the current screen if it can accept it - * @param {KeyboardEvent} event - */ -function KeyDown(event) { - if (event.repeat) return; - KeyPress = event.keyCode || event.which; - CommonKeyDown(event); -} - -/** - * Handler for document-wide keydown event - * @param {KeyboardEvent} event - */ -function DocumentKeyDown(event) { - if (event.repeat) return; - if (event.key == "Escape") { - if (CurrentScreenFunctions.Exit) { - CurrentScreenFunctions.Exit(); - } else if ((CurrentCharacter != null) && Array.isArray(DialogMenuButton) && (DialogMenuButton.indexOf("Exit") >= 0)) { - if (!DialogLeaveFocusItem()) - DialogLeaveItemMenu(); - } else if ((CurrentCharacter != null) && (CurrentScreen == "ChatRoom")) { - DialogLeave(); - } else if ((CurrentCharacter == null) && (CurrentScreen == "ChatRoom") && (document.getElementById("TextAreaChatLog") != null)) { - ElementScrollToEnd("TextAreaChatLog"); - } - } else if (event.key == "Tab") { - KeyDown(event); - } -} - -/** - * When the user clicks, we fire the click event for other screens - * @param {MouseEvent} event - */ -function Click(event) { - if (!CommonIsMobile) { - MouseMove(event); - CommonClick(event); - } -} - -/** - * When the user touches the screen (mobile only), we fire the click event for other screens - * @param {TouchEvent} event - */ -function TouchStart(event) { - if (CommonIsMobile && MainCanvas) { - TouchMove(event.touches[0]); - CommonClick(event); - CommonTouchList = event.touches; - } -} - -/** - * When the user touches the screen (mobile only), we fire the click event for other screens - * @param {TouchEvent} event - */ -function TouchEnd(event) { - if (CommonIsMobile && MainCanvas) - CommonTouchList = event.touches; -} - -/** - * When touch moves, we keep it's position for other scripts - * @param {Touch} touch - */ -function TouchMove(touch) { - if (MainCanvas) { - MouseX = Math.round((touch.pageX - MainCanvas.canvas.offsetLeft) * 2000 / MainCanvas.canvas.clientWidth); - MouseY = Math.round((touch.pageY - MainCanvas.canvas.offsetTop) * 1000 / MainCanvas.canvas.clientHeight); - } -} - -/** - * When mouse move, we keep the mouse position for other scripts - * @param {MouseEvent} event - */ -function MouseMove(event) { - if (MainCanvas) { - MouseX = Math.round(event.offsetX * 2000 / MainCanvas.canvas.clientWidth); - MouseY = Math.round(event.offsetY * 1000 / MainCanvas.canvas.clientHeight); - } -} - -/** - * When the mouse is away from the control, we stop keeping the coordinates, - * we also check for false positives with "relatedTarget" - * @param {MouseEvent} event - */ -function LoseFocus(event) { - if (event.relatedTarget || event.toElement) { - MouseX = -1; - MouseY = -1; - } -} \ No newline at end of file diff --git a/Scripts/Main.ts b/Scripts/Main.ts new file mode 100644 index 000000000..de0123efc --- /dev/null +++ b/Scripts/Main.ts @@ -0,0 +1,190 @@ +//import * as PIXI from "pixi.js" +//import { Viewport } from "../node_modules/pixi-viewport/dist/Viewport"; + +const PIXIWidth = 2000; +const PIXIHeight = 1000; + +let resolution = KDResolutionList[parseFloat(localStorage.getItem("KDResolution")) || 0]; +var PIXIapp = new PIXI.Application({ + //view: document.getElementById("MainCanvas"), + antialias: false, + powerPreference: 'high-performance', + resolution: resolution,//KDResolutionList[parseFloat(localStorage.getItem("KDResolution")) || 0], + width: PIXIWidth, + height: PIXIHeight, +}); + +//PIXI.settings.RESOLUTION = resolution; +PIXI.settings.FILTER_RESOLUTION = resolution; +/* +const viewport = new Viewport({ + worldWidth: 5000, + worldHeight: 5000, + screenWidth: window.innerWidth, + screenHeight: window.innerHeight, + events: PIXIapp.renderer.events, + });*/ + + +document.body.appendChild(PIXIapp.view as any); + +/*kdcanvas.scale.x = resolution; +kdcanvas.scale.y = resolution; +kdui.scale.x = resolution; +kdui.scale.y = resolution;*/ + +PIXIapp.stage.addChild(kdcanvas); +PIXIapp.stage.addChild(kdui); + +let ticker = PIXI.Ticker.shared; + +window.onload = function() { + KinkyDungeonRootDirectory = "Game/"; + pixiview = KinkyDungeonGetCanvas("MainCanvas"); + + // window.onload in index.html + CommonIsMobile = CommonDetectMobile(); + TranslationLoad(); + DrawLoad(); + CommonSetScreen("MiniGame", "KinkyDungeon"); + + // LoginLoad + Character = []; + CharacterNextId = 1; + CharacterReset(0); + + + CurrentCharacter = null; + + // Default keybindings, these are initialized as part of the Player + KDSetDefaultKeybindings(); + KinkyDungeonKeybindings = KinkyDungeonKeybindingsTemp; + if (localStorage.getItem("KinkyDungeonKeybindings") && JSON.parse(localStorage.getItem("KinkyDungeonKeybindings"))) { + KinkyDungeonKeybindings = JSON.parse(localStorage.getItem("KinkyDungeonKeybindings")); + } + + KinkyDungeonLoad(); + + ticker.add(() => { + let Timestamp = performance.now(); + DrawProcess(Timestamp); + + // Increments the time from the last frame + TimerRunInterval = Timestamp - TimerLastTime; + TimerLastTime = Timestamp; + CurrentTime = CurrentTime + TimerRunInterval; + + // At each 1700 ms, we check for timed events (equivalent of 100 cycles at 60FPS) + if (TimerLastCycleCall + 1700 <= CommonTime()) { + TimerLastCycleCall = CommonTime(); + } + }); + + PIXIapp.stage.interactiveChildren = false; + + (PIXIapp.renderer as PIXIRenderer).gl.canvas.addEventListener('webglcontextlost', () => { + console.error('WebGl context lost'); + + //load(); + }); + + + //MainRun(0); +}; + +let TimerRunInterval: number = 0; +let TimerLastTime: number = 0; +let CurrentTime: number = 0; +let TimerLastCycleCall: number = 0; + +/** + * Main game running state, runs the drawing + */ +function MainRun(Timestamp: number): void { + DrawProcess(Timestamp); + + // Increments the time from the last frame + TimerRunInterval = Timestamp - TimerLastTime; + TimerLastTime = Timestamp; + CurrentTime = CurrentTime + TimerRunInterval; + + // At each 1700 ms, we check for timed events (equivalent of 100 cycles at 60FPS) + if (TimerLastCycleCall + 1700 <= CommonTime()) { + TimerLastCycleCall = CommonTime(); + } + + // Launches the main again for the next frame + requestAnimationFrame(MainRun); +} + +/** + * When the user presses a key, we send the KeyDown event to the current screen if it can accept it + */ +function KeyDown(event: KeyboardEvent): void { + if (event.repeat) return; + KeyPress = event.keyCode || event.which; + CommonKeyDown(event); +} + +/** + * When the user clicks, we fire the click event for other screens + */ +function Click(event: MouseEvent): void { + //if (!CommonIsMobile) { + //MouseMove(event); + //CommonClick(event); + //} +} + +/** + * When the user touches the screen (mobile only), we fire the click event for other screens + */ +function TouchStart(event: TouchEvent): void { + /*if (CommonIsMobile && PIXICanvas) { + TouchMove(event.touches[0]); + //CommonClick(event); + CommonTouchList = event.touches; + mouseDown = true; + }*/ +} + +/** + * When the user touches the screen (mobile only), we fire the click event for other screens + */ +function TouchEnd(event: TouchEvent): void { + //if (CommonIsMobile && PIXICanvas) { + //CommonTouchList = event.touches; + //mouseDown = false; + //} +} + +/** + * When touch moves, we keep it's position for other scripts + */ +function TouchMove(touch: Touch): void { + //if (PIXICanvas) { + //MouseX = Math.round((touch.pageX - PIXICanvas.offsetLeft) * 2000 / PIXICanvas.clientWidth); + //MouseY = Math.round((touch.pageY - PIXICanvas.offsetTop) * 1000 / PIXICanvas.clientHeight); + //} +} + +/** + * When mouse move, we keep the mouse position for other scripts + */ +function MouseMove(event: MouseEvent): void { + if (PIXICanvas && (document.activeElement?.id == "MainCanvas" || document.activeElement?.id == PIXICanvas?.id || document.activeElement?.id == '')) { + MouseX = Math.round(event.offsetX * 2000 / PIXICanvas.clientWidth); + MouseY = Math.round(event.offsetY * 1000 / PIXICanvas.clientHeight); + } +} + +/** + * When the mouse is away from the control, we stop keeping the coordinates, + * we also check for false positives with "relatedTarget" + */ +function LoseFocus(event: MouseEvent): void { + if (event.relatedTarget || (event as any).toElement /* toElement is for IE browser compat */) { + MouseX = -1; + MouseY = -1; + } +} diff --git a/Scripts/MiniGame.js b/Scripts/MiniGame.js deleted file mode 100644 index f3b02aa6d..000000000 --- a/Scripts/MiniGame.js +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; -var MiniGameType = ""; -var MiniGameVictory = false; -var MiniGamePerfect = true; -/** @type {number|string} */ -var MiniGameDifficulty = ""; -var MiniGameDifficultyRatio = 1; -var MiniGameAdvancedPayment = 0; -var MiniGameReturnFunction = ""; -var MiniGameProgress = -1; -var MiniGameTimer = 0; -var MiniGameEnded = false; -var MiniGameCheatAvailable = false; - -function MiniGameLoad() { - if (CurrentScreen == "Kidnap" || CurrentScreen == "HorseWalk") CurrentDarkFactor = 0.5; -} - -/** - * Starts a given mini game at a set difficulty and keeps - * @param {string} GameType - Name of the mini-game to launch - * @param {number|string} Difficulty - Difficulty Ration for the mini-game - * @param {string} ReturnFunction - Callback name to execute once the mini-game is over - * @returns {void} - Nothing - */ -function MiniGameStart(GameType, Difficulty, ReturnFunction) { - CurrentCharacter = null; - MiniGameType = GameType; - MiniGameDifficulty = Difficulty; - MiniGameDifficultyRatio = 1; - MiniGameReturnFunction = ReturnFunction; - MiniGameVictory = (Math.random() > 0.5); - MiniGamePerfect = true; - MiniGameProgress = -1; - MiniGameTimer = 0; - MiniGameEnded = false; - MiniGameCheatAvailable = false; - CommonSetScreen("MiniGame", GameType); -} diff --git a/Scripts/ModularItem.js b/Scripts/ModularItem.js deleted file mode 100644 index d6eddf29a..000000000 --- a/Scripts/ModularItem.js +++ /dev/null @@ -1,745 +0,0 @@ -"use strict"; - -/** - * ModularItem.js - * -------------- - * This file contains utilities related to modular extended items (for example the High Security Straitjacket). It is - * generally not necessary to call functions in this file directly - these are called from Asset.js when an item is - * first registered. - * - * A modular item is a typed item, but each type may be comprised of several independent "modules". For example, the - * High Security Straitjacket has 3 different modules: crotch panel (c), arms (a), and crotch straps (s), and each - * module can be configured independently. The resulting type then uses an abbreviated format which represents the - * module values comprising that type. Each module contains a number of options that may be chosen for that module. - * - * For example "c0a1s2" - represents the type where the crotch panel module uses option 0, the arms module uses option - * 1, and the crotch straps module uses option 2. The properties of the type will be derived from a combination of the - * properties of each of the type's module options. For example, difficulty will be calculated by summing up the - * difficulties for each of its module options. - * - * All dialogue for modular items should be added to `Dialog_Player.csv`. To implement a modular item, you need the - * following dialogue entries: - * * "SelectBase" - This is the text that will be displayed on the module selection screen (e.g. - * `ItemArmsHighSecurityStraitJacketSelectBase` - "Configure Straitjacket") - * * For each module: - * * "Select" - This is the text that will be displayed on the module's subscreen - * (e.g. `ItemArmsHighSecurityStraitJacketSelectCrotch` - "Configure crotch panel") - * * "Module" - This is the text that will be used to describe the module (under - * the module's button) in the module selection screen (e.g. `ItemArmsHighSecurityStraitJacketModuleCrotch` - - * "Crotch Panel") - * * For each option: - * * "Option" - This is the text that will be used to describe the - * option (under the option's button) in the module subscreen for the module containing that option (e.g. - * `ItemArmsHighSecurityStraitJacketOptionc0` - "No crotch panel") - * * If the item's chat setting is configured to `PER_MODULE`, you will need a chatroom message for each module, - * which will be sent when that module changes. It should have the format "Set" - * (e.g. `ItemArmsHighSecurityStraitJacketSetCrotch` - "SourceCharacter changed the crotch panel on - * DestinationCharacter straitjacket") - * * If the item's chat setting is configured to `PER_OPTION`, you will need a chatroom message for each option, which - * will be sent when that option is selected. It should have the format - * "Set" (e.g. `ItemArmsHighSecurityStraitJacketSetc0` - - * "SourceCharacter removes the crotch panel from DestinationCharacter straitjacket") - */ - -/** - * The keyword used for the base menu on modular items - * @const {string} - */ -const ModularItemBase = "Base"; - -/** - * A lookup for the modular item configurations for each registered modular item - * @const - * @type {Record} - * @see {@link ModularItemData} - */ -const ModularItemDataLookup = {}; - -/** - * An enum encapsulating the possible chatroom message settings for modular items - * - PER_MODULE - The item has one chatroom message per module (messages for individual options within a module are all - * the same) - * - PER_OPTION - The item has one chatroom message per option (for finer granularity - each individual option within a - * module can have its own chatroom message) - * @type {Record<"PER_MODULE"|"PER_OPTION", ModularItemChatSetting>} - */ -const ModularItemChatSetting = { - PER_MODULE: "perModule", - PER_OPTION: "perOption", -}; - -/** - * How many modules/options to show per page of the modular item screen - * @const {number} - */ -const ModularItemsPerPage = 8; - -/** Memoized requirements check function */ -const ModularItemRequirementCheckMessageMemo = CommonMemoize(ModularItemRequirementMessageCheck); - -/** - * Registers a modular extended item. This automatically creates the item's load, draw and click functions. It will - * also generate the asset's AllowType array, as AllowType arrays on modular items can get long due to the - * multiplicative nature of the item's types, and also converts the AllowModuleTypes property on any asset layers into - * an AllowTypes property, if present. - * @param {Asset} asset - The asset being registered - * @param {ModularItemConfig | undefined} config - The item's modular item configuration - * @returns {void} - Nothing - */ -function ModularItemRegister(asset, config) { - const data = ModularItemCreateModularData(asset, config); - ModularItemCreateLoadFunction(data); - ModularItemCreateDrawFunction(data); - ModularItemCreateClickFunction(data); - ModularItemCreateExitFunction(data); - ModularItemGenerateValidationProperties(data); -} - -/** - * Creates an asset's extended item load function - * @param {ModularItemData} data - The modular item data for the asset - * @returns {void} - Nothing - */ -function ModularItemCreateLoadFunction(data) { - const loadFunctionName = `${data.functionPrefix}Load`; - const loadFunction = function () { - if (!DialogFocusItem.Property) { - const C = CharacterGetCurrent(); - const currentModuleValues = ModularItemParseCurrent(data); - DialogFocusItem.Property = ModularItemMergeModuleValues(data, currentModuleValues); - CharacterRefresh(C); - } - }; - if (data.scriptHooks && data.scriptHooks.load) { - window[loadFunctionName] = function () { - data.scriptHooks.load(loadFunction); - }; - } else window[loadFunctionName] = loadFunction; -} - -/** - * Creates an asset's extended item draw function - * @param {ModularItemData} data - The modular item data for the asset - * @returns {void} - Nothing - */ -function ModularItemCreateDrawFunction(data) { - const drawFunctionName = `${data.functionPrefix}Draw`; - const drawFunction = function () { - const currentModule = data.currentModule || ModularItemBase; - const drawFunction = data.drawFunctions[currentModule]; - return drawFunction(); - }; - if (data.scriptHooks && data.scriptHooks.draw) { - window[drawFunctionName] = function () { - data.scriptHooks.draw(drawFunction); - }; - } else window[drawFunctionName] = drawFunction; -} - -/** - * Creates an asset's extended item click function - * @param {ModularItemData} data - The modular item data for the asset - * @returns {void} - Nothing - */ -function ModularItemCreateClickFunction(data) { - const clickFunctionName = `${data.functionPrefix}Click`; - const clickFunction = function () { - const currentModule = data.currentModule || ModularItemBase; - const clickFunction = data.clickFunctions[currentModule]; - return clickFunction(); - }; - if (data.scriptHooks && data.scriptHooks.click) { - window[clickFunctionName] = function () { - data.scriptHooks.click(clickFunction); - }; - } else window[clickFunctionName] = clickFunction; -} - -/** - * Creates an asset's extended item exit function - * @param {ModularItemData} data - The typed item data for the asset - * @returns {void} - Nothing - */ -function ModularItemCreateExitFunction(data) { - const exitFunctionName = `${data.functionPrefix}Exit`; - if (data.scriptHooks && data.scriptHooks.exit) { - window[exitFunctionName] = function () { - data.scriptHooks.exit(); - }; - } -} - -/** - * Generates an asset's modular item data - * @param {Asset} asset - The asset to generate modular item data for - * @param {ModularItemConfig} config - The item's extended item configuration - * @returns {ModularItemData} - The generated modular item data for the asset - */ -function ModularItemCreateModularData(asset, - { Modules, ChatSetting, ChatTags, ChangeWhenLocked, Dialog, ScriptHooks }) { - const key = `${asset.Group.Name}${asset.Name}`; - Dialog = Dialog || {}; - /** @type {ModularItemData} */ - const data = ModularItemDataLookup[key] = { - asset, - chatSetting: ChatSetting || ModularItemChatSetting.PER_OPTION, - key, - typeCount: 1, - functionPrefix: `Inventory${key}`, - dialogSelectPrefix: Dialog.Select || `${key}Select`, - dialogModulePrefix: Dialog.ModulePrefix || `${key}Module`, - dialogOptionPrefix: Dialog.OptionPrefix || `${key}Option`, - chatMessagePrefix: Dialog.ChatPrefix || `${key}Set`, - chatTags: Array.isArray(ChatTags) ? ChatTags : [ - CommonChatTags.SOURCE_CHAR, - CommonChatTags.DEST_CHAR, - ], - modules: Modules, - currentModule: ModularItemBase, - pages: { [ModularItemBase]: 0 }, - drawData: { [ModularItemBase]: ModularItemCreateDrawData(Modules.length) }, - changeWhenLocked: typeof ChangeWhenLocked === "boolean" ? ChangeWhenLocked : true, - scriptHooks: { - load: ScriptHooks ? ScriptHooks.Load : undefined, - click: ScriptHooks ? ScriptHooks.Click : undefined, - draw: ScriptHooks ? ScriptHooks.Draw : undefined, - exit: ScriptHooks ? ScriptHooks.Exit : undefined, - }, - drawFunctions: {}, - clickFunctions: {}, - }; - data.drawFunctions[ModularItemBase] = ModularItemCreateDrawBaseFunction(data); - data.clickFunctions[ModularItemBase] = ModularItemCreateClickBaseFunction(data); - for (const module of Modules) { - data.pages[module.Name] = 0; - data.drawData[module.Name] = ModularItemCreateDrawData(module.Options.length); - data.drawFunctions[module.Name] = () => ModularItemDrawModule(module, data); - data.clickFunctions[module.Name] = () => ModularItemClickModule(module, data); - data.typeCount *= module.Options.length; - } - return data; -} - -/** - * Generates drawing data for a given module. This includes button positions, whether pagination is necessary, and the - * total page count for that module. - * @param {number} itemCount - The number of items in the module - * @returns {{pageCount: number, paginate: boolean, positions: number[][]}} - An object containing required drawing for - * a module with the given item count. - */ -function ModularItemCreateDrawData(itemCount) { - const positions = []; - const left = 1000; - const width = 1000; - const buttonWidth = 225; - const rows = itemCount > ModularItemsPerPage / 2 ? 2 : 1; - const columns = Math.min(ModularItemsPerPage / 2, Math.ceil(itemCount / rows)); - const top = rows === 1 ? 500 : 400; - const xPadding = Math.floor((width - columns * buttonWidth) / (columns + 1)); - const xSpacing = buttonWidth + xPadding; - const ySpacing = 300; - - for (let i = 0; i < rows; i++) { - for (let j = 0; j < columns; j++) { - positions.push([ - left + xPadding + j * xSpacing, - top + i * ySpacing, - ]); - } - } - - const paginate = itemCount > ModularItemsPerPage; - const pageCount = Math.ceil(itemCount / ModularItemsPerPage); - - return { paginate, pageCount, positions }; -} - -/** - * Creates a modular item's base draw function (for the module selection screen) - * @param {ModularItemData} data - The modular item data for the asset - * @returns {() => void} - The modular item's base draw function - */ -function ModularItemCreateDrawBaseFunction(data) { - return () => { - const currentModuleValues = ModularItemParseCurrent(data); - const buttonDefinitions = data.modules.map((module, i) => ( - /** @type ModularItemButtonDefinition */([ - `${AssetGetInventoryPath(data.asset)}/${module.Key}${currentModuleValues[i]}.png`, - `${data.dialogModulePrefix}${module.Name}`, - CharacterGetCurrent().ID === 0 && module.AllowSelfSelect === false ? "pink" : "white", - ]) - )); - return ModularItemDrawCommon(ModularItemBase, buttonDefinitions, data); - }; -} - -/** - * Maps a modular item option to a button definition for rendering the option's button. - * @param {ModularItemOption} option - The option to draw a button for - * @param {number} optionIndex - The option's index within its parent module - * @param {ModularItemModule} module - A reference to the option's parent module - * @param {ModularItemData} data - The modular item's data - * @param {number} currentOptionIndex - The currently selected option index for the module - * @returns {ModularItemButtonDefinition} - A button definition array representing the provided option - */ -function ModularItemMapOptionToButtonDefinition(option, optionIndex, module, - { asset, dialogOptionPrefix, changeWhenLocked }, currentOptionIndex) { - const optionName = `${module.Key}${optionIndex}`; - let color = "#fff"; - const currentOption = module.Options[currentOptionIndex]; - if (currentOptionIndex === optionIndex) color = "#888"; - else if (ModularItemRequirementCheckMessageMemo(option, currentOption, changeWhenLocked)) color = "pink"; - return [ - `${AssetGetInventoryPath(asset)}/${optionName}.png`, - `${dialogOptionPrefix}${optionName}`, - color, - ]; -} - -/** - * Draws a module screen from the provided button definitions and modular item data. - * @param {string} moduleName - The name of the module whose page is being drawn - * @param {ModularItemButtonDefinition[]} buttonDefinitions - A list of button definitions to draw - * @param {ModularItemData} data - The modular item's data - * @returns {void} - Nothing - */ -function ModularItemDrawCommon(moduleName, buttonDefinitions, { asset, pages, drawData }) { - -} - -/** - * Draws the extended item screen for a given module. - * @param {ModularItemModule} module - The module whose screen to draw - * @param {ModularItemData} data - The modular item's data - * @returns {void} - Nothing - */ -function ModularItemDrawModule(module, data) { - const moduleIndex = data.modules.indexOf(module); - const currentValues = ModularItemParseCurrent(data); - const buttonDefinitions = module.Options.map( - (option, i) => ModularItemMapOptionToButtonDefinition(option, i, module, data, currentValues[moduleIndex])); - ModularItemDrawCommon(module.Name, buttonDefinitions, data); -} - -/** - * Generates a click function for a modular item's module selection screen - * @param {ModularItemData} data - The modular item's data - * @returns {function(): void} - A click handler for the modular item's module selection screen - */ -function ModularItemCreateClickBaseFunction(data) { - const { paginate, pageCount, positions } = data.drawData[ModularItemBase]; - return () => { - ModularItemClickCommon( - { paginate, positions }, - () => { - ModularItemRequirementCheckMessageMemo.clearCache(); - DialogFocusItem = null; - }, - i => { - const pageNumber = Math.min(pageCount - 1, data.pages[ModularItemBase] || 0); - const pageStart = pageNumber * ModularItemsPerPage; - const page = data.modules.slice(pageStart, pageStart + ModularItemsPerPage); - const module = page[i]; - if (module) { - if (CharacterGetCurrent().ID === 0 && module.AllowSelfSelect === false) { - return; - } - ModularItemModuleTransition(module.Name, data); - } - }, - (delta) => ModularItemChangePage(ModularItemBase, delta, data) - ); - }; -} - -/** - * A generic click handler for a module's screen - * @param {ModularItemModule} module - The module whose screen we are currently in - * @param {ModularItemData} data - The modular item's data - * @returns {void} - Nothing - */ -function ModularItemClickModule(module, data) { - const { paginate, pageCount, positions } = data.drawData[module.Name]; - ModularItemClickCommon( - { paginate, positions }, - () => ModularItemModuleTransition(ModularItemBase, data), - i => { - const pageNumber = Math.min(pageCount - 1, data.pages[module.Name] || 0); - const pageStart = pageNumber * ModularItemsPerPage; - const page = module.Options.slice(pageStart, pageStart + ModularItemsPerPage); - const selected = page[i]; - if (selected) ModularItemSetType(module, pageStart + i, data); - }, - (delta) => ModularItemChangePage(module.Name, delta, data) - ); -} - -/** - * A common click handler for modular item screens. Note that pagination is not currently handled, but will be added - * in the future. - * @param {object} drawData - * @param {boolean} drawData.paginate - Whether or not the current screen needs pagination handling - * @param {number[][]} drawData.positions - The button positions to handle clicks for - * @param {function(): void} exitCallback - A callback to be called when the exit button has been clicked - * @param {function(number): void} itemCallback - A callback to be called when an item has been clicked - * @param {function(number): void} paginateCallback - A callback to be called when a pagination button has been clicked - * @returns {void} - Nothing - */ -function ModularItemClickCommon({ paginate, positions }, exitCallback, itemCallback, paginateCallback) { - if (ExtendedItemSubscreen) { - CommonCallFunctionByNameWarn(ExtendedItemFunctionPrefix() + ExtendedItemSubscreen + "Click"); - return; - } - - // Exit button - if (MouseIn(1885, 25, 90, 90)) { - return exitCallback(); - } else if (paginate) { - if (MouseIn(1665, 240, 90, 90)) return paginateCallback(-1); - else if (MouseIn(1775, 240, 90, 90)) return paginateCallback(1); - } - - positions.some((p, i) => { - if (MouseIn(p[0], p[1], 225, 275)) { - itemCallback(i); - return true; - } - }); -} - -/** - * Handles page changing for modules - * @param {string} moduleName - The name of the module whose page should be modified - * @param {number} delta - The page delta to apply to the module's current page - * @param {ModularItemData} data - The modular item's data - * @returns {void} - Nothing - */ -function ModularItemChangePage(moduleName, delta, data) { - const { pageCount } = data.drawData[moduleName]; - const currentPage = data.pages[moduleName]; - data.pages[moduleName] = (currentPage + pageCount + delta) % pageCount; -} - -/** - * Transitions between pages within a modular item's extended item menu - * @param {string} newModule - The name of the new module to transition to - * @param {ModularItemData} data - The modular item's data - * @returns {void} - Nothing - */ -function ModularItemModuleTransition(newModule, data) { - data.currentModule = newModule; -} - -/** - * Parses the focus item's current type into an array representing the currently selected module options - * @param {ModularItemData} data - The modular item's data - * @returns {number[]} - An array of numbers representing the currently selected options for each of the item's modules - */ -function ModularItemParseCurrent({ asset, modules }) { - const type = (DialogFocusItem.Property && DialogFocusItem.Property.Type) || ModularItemConstructType(modules); - return modules.map(module => { - const index = type.indexOf(module.Key); - if (index !== -1) { - const match = type.substring(index + module.Key.length).match(/^\d+/); - if (match) { - return Number(match[0]); - } - } - console.warn(`[${asset.Group.Name}:${asset.Name}] Module ${module.Key} not found in type "${type}"`); - return 0; - }); -} - -/** - * Merges all of the selected module options for a modular item into a single Property object to set on the item - * @param {ModularItemData} data - The modular item's data - * @param {number[]} moduleValues - The numeric values representing the current options for each module - * @returns {ItemProperties} - A property object created from combining each module of the modular item - */ -function ModularItemMergeModuleValues({ asset, modules }, moduleValues) { - const options = modules.map((module, i) => module.Options[moduleValues[i] || 0]); - return options.reduce((mergedProperty, { Property }) => { - Property = Property || {}; - mergedProperty.Difficulty += (Property.Difficulty || 0); - if (Property.CustomBlindBackground) mergedProperty.CustomBlindBackground = Property.CustomBlindBackground; - if (Property.Block) CommonArrayConcatDedupe(mergedProperty.Block, Property.Block); - if (Property.Effect) CommonArrayConcatDedupe(mergedProperty.Effect, Property.Effect); - if (Property.Hide) CommonArrayConcatDedupe(mergedProperty.Hide, Property.Hide); - if (Property.HideItem) CommonArrayConcatDedupe(mergedProperty.HideItem, Property.HideItem); - if (Property.SetPose) mergedProperty.SetPose = CommonArrayConcatDedupe(mergedProperty.SetPose || [], Property.SetPose); - if (Property.AllowActivity) CommonArrayConcatDedupe(mergedProperty.AllowActivity, Property.AllowActivity); - if (Property.Attribute) CommonArrayConcatDedupe(mergedProperty.Attribute, Property.Attribute); - if (typeof Property.OverridePriority === "number") mergedProperty.OverridePriority = Property.OverridePriority; - if (typeof Property.HeightModifier === "number") mergedProperty.HeightModifier = (mergedProperty.HeightModifier || 0) + Property.HeightModifier; - if (Property.OverrideHeight) mergedProperty.OverrideHeight = ModularItemMergeOverrideHeight(mergedProperty.OverrideHeight, Property.OverrideHeight); - if (asset.AllowTint && Property.Tint) mergedProperty.Tint = CommonArrayConcatDedupe(mergedProperty.Tint, Property.Tint); - return mergedProperty; - }, /** @type ItemProperties */({ - Type: ModularItemConstructType(modules, moduleValues), - Difficulty: 0, - CustomBlindBackground: asset.CustomBlindBackground, - Block: Array.isArray(asset.Block) ? asset.Block.slice() : [], - Effect: Array.isArray(asset.Effect) ? asset.Effect.slice() : [], - Hide: Array.isArray(asset.Hide) ? asset.Hide.slice() : [], - HideItem: Array.isArray(asset.HideItem) ? asset.HideItem.slice() : [], - AllowActivity: Array.isArray(asset.AllowActivity) ? asset.AllowActivity.slice() : [], - Attribute: Array.isArray(asset.Attribute) ? asset.Attribute.slice() : [], - Tint: asset.AllowTint ? Array.isArray(asset.Tint) ? asset.Tint.slice() : [] : undefined, - })); -} - -/** - * Generates the type string for a modular item from its modules and their current values. - * @param {AssetOverrideHeight} currentValue - The OverrideHeight for the future item - * @param {AssetOverrideHeight} newValue - The OverrideHeight being merged - * @returns {AssetOverrideHeight | undefined} - A string type generated from the selected option values for each module - */ -function ModularItemMergeOverrideHeight(currentValue, newValue) { - if (typeof newValue.Height === "number" && typeof newValue.Priority === "number" && - (!currentValue || (currentValue.Priority < currentValue.Priority))) - return {Height: newValue.Height, Priority: newValue.Priority}; - return currentValue; -} - -/** - * Generates the type string for a modular item from its modules and their current values. - * @param {ModularItemModule[]} modules - The modules array for the modular item - * @param {number[]} [values] - The numeric values representing the current options for each module - * @returns {string} - A string type generated from the selected option values for each module - */ -function ModularItemConstructType(modules, values) { - values = values || []; - let type = ""; - modules.forEach((module, i) => { - type += module.Key; - type += (values[i] || 0); - }); - return type; -} - -/** - * Sets a modular item's type based on a change in a module's option selection. - * @param {ModularItemModule} module - The module that changed - * @param {number} index - The index of the newly chosen option within the module - * @param {ModularItemData} data - The modular item's data - * @returns {void} - Nothing - */ -function ModularItemSetType(module, index, data) { - const C = CharacterGetCurrent(); - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - const option = module.Options[index]; - const currentModuleValues = ModularItemParseCurrent(data); - const moduleIndex = data.modules.indexOf(module); - const currentOption = module.Options[currentModuleValues[moduleIndex]]; - - // Make a final requirement check before actually modifying the item - const requirementMessage = ModularItemRequirementMessageCheck(option, currentOption, data.changeWhenLocked); - if (requirementMessage) { - DialogExtendedMessage = requirementMessage; - return; - } - - let changed = false; - const newModuleValues = currentModuleValues.map((value, i) => { - if (i === moduleIndex && index !== value) { - changed = true; - return index; - } - return value; - }); - - if (changed) { - // Take a snapshot of the property values that are applied by the current type - const currentProperty = ModularItemMergeModuleValues(data, currentModuleValues); - - // Create a shallow copy of the old property, and remove any module-defined keys from it (should only leave any - // lock-related keys behind) - const newProperty = Object.assign({}, DialogFocusItem.Property); - for (const key of Object.keys(currentProperty)) { - delete newProperty[key]; - } - - // Assign the new property data - DialogFocusItem.Property = Object.assign(newProperty, ModularItemMergeModuleValues(data, newModuleValues)); - - // Reinstate the Lock effect if there's a lock - if (newProperty.LockedBy && !(newProperty.Effect || []).includes("Lock")) { - newProperty.Effect = (newProperty.Effect || []); - newProperty.Effect.push("Lock"); - } - - if (!InventoryDoesItemAllowLock(DialogFocusItem)) { - // If the new type does not permit locking, remove the lock - ValidationDeleteLock(DialogFocusItem.Property, false); - } - - CharacterRefresh(C); - } - - // If the module's option has a subscreen, transition to that screen instead of the main page of the item. - if (option.HasSubscreen) { - ExtendedItemSubscreen = module.Name + index; - CommonCallFunctionByNameWarn(ExtendedItemFunctionPrefix() + ExtendedItemSubscreen + "Load", C); - } else { - ModularItemModuleTransition(ModularItemBase, data); - } -} - -/** - * Publishes the chatroom message for a modular item when one of its modules has changed. - * @param {ModularItemModule} module - The module that changed - * @param {number} previousIndex - The index of the previously selected option within the module - * @param {number} index - The index of the newly chosen option within the module - * @param {ModularItemData} data - The modular item's data - * @returns {void} - Nothing - */ -function ModularItemChatRoomMessage(module, previousIndex, index, { asset, chatSetting, chatTags, chatMessagePrefix }) { - -} - -/** - * Generates an array of all types available for an asset based on its modular item data, filtered by the provided - * predicate function, if needed. - * @param {ModularItemData} data - The modular item's data - * @param {(typeObject: Record) => boolean} [predicate] - An optional predicate for filtering the - * resulting types - * @returns {string[]} - The generated array of types - */ -function ModularItemGenerateTypeList({ modules }, predicate) { - let allowType = [{}]; - modules.forEach((module) => { - let newCombinations = []; - module.Options.forEach((option, i) => { - const newTypes = allowType.map(moduleValues => Object.assign({}, moduleValues, { [module.Key]: i })); - newCombinations = newCombinations.concat(newTypes); - }); - allowType = newCombinations; - }); - if (predicate) allowType = allowType.filter(predicate); - return allowType.map(combination => { - return modules.map(module => `${module.Key}${combination[module.Key]}`).join(""); - }); -} - -/** - * Generates and sets the AllowLock and AllowLockType properties for an asset based on its modular item data. For types - * where two independent options declare conflicting AllowLock properties (i.e. one option declares AllowLock: false and - * another declares AllowLock: true), the resulting type will permit locking (i.e. true overrides false). - * @param {ModularItemData} data - The modular item's data - * @returns {void} - Nothing - */ -function ModularItemGenerateAllowLockType(data) { - const {asset, modules, typeCount} = data; - /** @type {Record} */ - const optionAllowLockMap = {}; - // Create a mapping of partial types (i.e. the "type" for a single module) to their AllowLock values. If the - // corresponding option doesn't explicitly set AllowLock, set the value to null to distinguish between explicit - // and inherited AllowLock (if present, explicit should override inherited) - for (const module of modules) { - for (const [index, option] of Object.entries(module.Options)) { - optionAllowLockMap[`${module.Key}${index}`] = typeof option.AllowLock === "boolean" ? option.AllowLock : null; - } - } - - const allowLockType = ModularItemGenerateTypeList(data, (combination) => { - const typeParts = Object.keys(combination).map((key) => `${key}${combination[key]}`); - // Fallback allowLock value for the type if no option explicitly sets it to true - let allowLock = asset.AllowLock; - for (const typePart of typeParts) { - const optionAllowLock = optionAllowLockMap[typePart]; - if (optionAllowLock) { - // If one of the type's options explicitly sets AllowLock: true, the type permits locks - return true; - } else if (optionAllowLock === false) { - // If an option explicitly sets AllowLock: false, it overrides the asset-level AllowLock - allowLock = false; - } - } - - // If no option set it to true, then return the fallback value (either the asset-level AllowLock, or false if an - // option explicitly overrode it - return allowLock; - }); - - TypedItemSetAllowLockType(asset, allowLockType, typeCount); -} - -/** - * Generates and sets the AllowTypes property on an asset layer based on its AllowModuleTypes property. - * @param {AssetLayer} layer - The layer to generate AllowTypes for - * @param {ModularItemData} data - The modular item's data - * @returns {void} - Nothing - */ -function ModularItemGenerateLayerAllowTypes(layer, data) { - if (Array.isArray(layer.AllowModuleTypes)) { - layer.AllowTypes = true; - layer.ReverseAllowEmptyType = layer.AllowModuleTypes.some(t => t.includes('0')); - layer.ReverseAllowTypes = layer.AllowModuleTypes; - /* - Let's generate every possible value of this cartesian product! - SAID NO ONE EVER. - - const allowedModuleCombinations = layer.AllowModuleTypes.map((shorthand) => { - const regex = /([a-zA-Z]+)(\d+)/g; - const values = []; - let match; - while ((match = regex.exec(shorthand))) { - values.push([match[1], Number.parseInt(match[2])]); - } - return values; - }); - - const GeneratedAllowTypes = ModularItemGenerateTypeList(data, (combination) => { - return allowedModuleCombinations.some(allowedCombination => { - return allowedCombination.every(combo => combination[combo[0]] === combo[1]); - }); - }); - - // Append to the existing AllowTypes - layer.AllowTypes = Array.isArray(layer.AllowTypes) ? layer.AllowTypes : []; - layer.AllowTypes = layer.AllowTypes.concat(GeneratedAllowTypes); - - // When option 0 is an allowed module, it means the undefined/null type is allowed. - if (allowedModuleCombinations.find(arr => arr.find(combo => combo[1] === 0))) { - layer.AllowTypes.push(""); - } - */ - } -} - -/** - * Checks whether the given option can be selected on the currently selected modular item - * @param {ModularItemOption} option - The selected option - * @param {ModularItemOption} currentOption - The currently active option - * @param {boolean} changeWhenLocked - Whether or not the item can be changed when locked - * @returns {string|null} - Returns a string user message if the option's requirements have not been met, otherwise - * returns nothing - */ -function ModularItemRequirementMessageCheck(option, currentOption, changeWhenLocked) { - return "foo"; -} - -/** - * Generates and assigns a modular asset's AllowType, AllowEffect and AllowBlock properties, along with the AllowTypes - * properties on the asset layers based on the values set in its module definitions. - * @param {ModularItemData} data - The modular item's data - * @returns {void} - Nothing - */ -function ModularItemGenerateValidationProperties(data) { - const {asset, modules} = data; - //asset.AllowType = ModularItemGenerateTypeList(data); // Only used in validation - asset.AllowEffect = Array.isArray(asset.AllowEffect) ? asset.AllowEffect.slice() : []; - CommonArrayConcatDedupe(asset.AllowEffect, asset.Effect); - asset.AllowBlock = Array.isArray(asset.Block) ? asset.Block.slice() : []; - for (const module of modules) { - for (const {Property} of module.Options) { - if (Property) { - if (Property.Effect) CommonArrayConcatDedupe(asset.AllowEffect, Property.Effect); - if (Property.Block) CommonArrayConcatDedupe(asset.AllowBlock, Property.Block); - if (Property.Tint && Array.isArray(Property.Tint) && Property.Tint.length > 0) asset.AllowTint = true; - } - } - } - asset.Layer.forEach((layer) => ModularItemGenerateLayerAllowTypes(layer, data)); - //ModularItemGenerateAllowLockType(data); // No locks -} diff --git a/Scripts/Mouse.js b/Scripts/Mouse.js deleted file mode 100644 index 8d814c099..000000000 --- a/Scripts/Mouse.js +++ /dev/null @@ -1,47 +0,0 @@ -"use strict"; -var MouseX = 0; -var MouseY = 0; - -/** - * Check if the mouse position is within the boundaries of a given zone (Useful for UI components) - * @param {number} Left - Starting position on the X axis - * @param {number} Top - Starting position on the Y axis - * @param {number} Width - Width of the zone - * @param {number} Height - Height of the zone - * @returns {boolean} - Returns TRUE if the click occurred in the given zone - */ -function MouseIn(Left, Top, Width, Height) { - return MouseXIn(Left, Width) && MouseYIn(Top, Height); -} - -/** - * Check if the mouse position is within the boundaries of a given zone along the X axis - * @param {number} Left - Starting position on the X axis - * @param {number} Width - Width of the zone - * @returns {boolean} - Returns TRUE if the click occurred in the given zone - */ -function MouseXIn(Left, Width) { - return (MouseX >= Left) && (MouseX <= Left + Width); -} - -/** - * Check if the mouse position is within the boundaries of a given zone along the Y axis - * @param {number} Top - Starting position on the Y axis - * @param {number} Height - Height of the zone - * @returns {boolean} - Returns TRUE if the click occurred in the given zone - */ -function MouseYIn(Top, Height) { - return (MouseY >= Top) && (MouseY <= Top + Height); -} - -/** - * A common check for whether the specified position is being hovered over - * @param {number} Left - Starting position on the X axis - * @param {number} Top - Starting position on the Y axis - * @param {number} Width - Width of the zone - * @param {number} Height - Height of the zone - * @returns {boolean} - Returns TRUE if the mouse is currently hovering over the specified zone - */ -function MouseHovering(Left, Top, Width, Height) { - return MouseIn(Left, Top, Width, Height) && !CommonIsMobile; -} diff --git a/Scripts/Mouse.ts b/Scripts/Mouse.ts new file mode 100644 index 000000000..882593814 --- /dev/null +++ b/Scripts/Mouse.ts @@ -0,0 +1,46 @@ +let MouseX: number = 0; +let MouseY: number = 0; + +/** + * Check if the mouse position is within the boundaries of a given zone (Useful for UI components) + * @param Left - Starting position on the X axis + * @param Top - Starting position on the Y axis + * @param Width - Width of the zone + * @param Height - Height of the zone + * @returns Returns TRUE if the click occurred in the given zone + */ +function MouseIn(Left: number, Top: number, Width: number, Height: number): boolean { + return MouseXIn(Left, Width) && MouseYIn(Top, Height); +} + +/** + * Check if the mouse position is within the boundaries of a given zone along the X axis + * @param Left - Starting position on the X axis + * @param Width - Width of the zone + * @returns Returns TRUE if the click occurred in the given zone + */ +function MouseXIn(Left: number, Width: number): boolean { + return (MouseX >= Left) && (MouseX <= Left + Width); +} + +/** + * Check if the mouse position is within the boundaries of a given zone along the Y axis + * @param Top - Starting position on the Y axis + * @param Height - Height of the zone + * @returns Returns TRUE if the click occurred in the given zone + */ +function MouseYIn(Top: number, Height: number): boolean { + return (MouseY >= Top) && (MouseY <= Top + Height); +} + +/** + * A common check for whether the specified position is being hovered over + * @param Left - Starting position on the X axis + * @param Top - Starting position on the Y axis + * @param Width - Width of the zone + * @param Height - Height of the zone + * @returns Returns TRUE if the mouse is currently hovering over the specified zone + */ +function MouseHovering(Left: number, Top: number, Width: number, Height: number): boolean { + return MouseIn(Left, Top, Width, Height) && !CommonIsMobile; +} diff --git a/Scripts/Notification.js b/Scripts/Notification.js deleted file mode 100644 index 7d21c213b..000000000 --- a/Scripts/Notification.js +++ /dev/null @@ -1,319 +0,0 @@ -"use strict"; - -/** - * An enum for the events in the game that notifications can be raised for - * @enum {string} - */ -const NotificationEventType = { - CHATMESSAGE: "ChatMessage", - CHATJOIN: "ChatJoin", - BEEP: "Beep", - DISCONNECT: "Disconnect", - TEST: "Test", - LARP: "Larp", -}; - -/** - * An enum for the types of notifications that can be raised - * @type {Record<"NONE"|"TITLEPREFIX"|"FAVICON"|"POPUP",NotificationAlertType>} - */ -const NotificationAlertType = { - NONE: 0, - TITLEPREFIX: 1, - FAVICON: 3, - POPUP: 2, -}; - -/** - * An enum for the audio settings for notifications - * @type {Record<"NONE"|"FIRST"|"REPEAT", NotificationAudioType>} - */ -const NotificationAudioType = { - NONE: 0, - FIRST: 1, - REPEAT: 2, -}; - -/** - * An object defining the components of the player's settings for a particular notification event - * @typedef {object} NotificationSetting - * @property {NotificationAlertType} AlertType - The selected type of notification alert to use - * @property {NotificationAudioType} Audio - The selected audio setting to apply - */ - -/** - * A class to track the state of each notification event type and handle actions based on the player's settings - */ -class NotificationEventHandler { - /** - * Creates a new NotificationEventHandler for the specified event type - * @param {NotificationEventType} eventType - The - * @param {NotificationSetting} settings - The player settings corresponding to the event type - */ - constructor(eventType, settings) { - this.eventType = eventType; - this.settings = settings; - this.raisedCount = 0; - this.popup = null; - } - - /** - * Raise a notification - * @param {object} data - Data relating to the event that can be passed into a popup - * @returns {void} - Nothing - */ - raise(data) { - if (this.settings.AlertType !== NotificationAlertType.NONE) { - this.raisedCount++; - - if (this.settings.AlertType === NotificationAlertType.POPUP) { - if (NotificationPopupsEnabled(this.eventType, data)) { - this.raisePopup(data); - } else { - NotificationTitleUpdate(); - } - } - else if (this.settings.AlertType === NotificationAlertType.TITLEPREFIX) { - NotificationTitleUpdate(); - } - else if (this.settings.AlertType === NotificationAlertType.FAVICON) { - NotificationDrawFavicon(false); - } - - if (this.playAudio(false)) { - AudioPlayInstantSound("Audio/BeepAlarm.mp3"); - } - } - } - - /** - * Raise a popup notification - * @param {any} data - Data relating to the event passed into the popup - * @returns {void} - Nothing - */ - raisePopup(data) { - // Determine the popup's options based on the data passed into the event raise call - let icon = "Icons/Logo.png"; - let titleStart = ""; - let titleEnd = ""; - let C = data.character; - if (!C && data.memberNumber) C = Character.find(Char => Char.MemberNumber === data.memberNumber); - if (C && 'icon' in Notification.prototype) icon = DrawCharacterSegment(C, 168, 50, 164, 164).toDataURL("image/png"); - if (data.characterName) titleStart = data.characterName + " - "; - else if (C) titleStart = C.Name + " - "; - if (data.chatRoomName) titleEnd = DialogFindPlayer("NotificationTitleFromRoom").replace("ChatRoomName", "'" + data.chatRoomName + "'"); - - // Define the (supported) options of the popup and create it - let title = titleStart + DialogFindPlayer("NotificationTitle" + this.eventType) + titleEnd; - let options = {}; - if ('silent' in Notification.prototype) options.silent = !this.playAudio(true); - if ('body' in Notification.prototype && data.body) options.body = data.body; - if ('renotify' in Notification.prototype) options.renotify = true; - if ('tag' in Notification.prototype) options.tag = "BondageClub" + this.eventType; - if ('icon' in Notification.prototype) options.icon = icon; - if ('data' in Notification.prototype) options.data = this.eventType; - - // Create the notification - try { - this.popup = new Notification(title, options); - if ('onclick' in Notification.prototype) { - this.popup.onclick = function () { - if ('data' in Notification.prototype) NotificationReset(this.data); - window.focus(); - this.close(); - }; - } - } catch (error) { - console.warn("Failed to create new Notification:\n", error); - } - } - - /** - * Determines whether an audio alert shoud be played - * @param {boolean} usingPopup - If TRUE this indicates that the audio will be played by a popup, rather than an in-game alert - * @returns {boolean} - Whether audio should be played - */ - playAudio(usingPopup) { - if (this.settings.Audio === NotificationAudioType.NONE) { - return false; - } else if (this.eventType === NotificationEventType.BEEP && Player.AudioSettings.PlayBeeps) { - return false; // Sound already played in ServerAccountBeep() - } else if (this.settings.AlertType === NotificationAlertType.POPUP && !usingPopup && 'silent' in Notification.prototype) { - return false; // The popup will play the sound instead - } else if (this.settings.Audio === NotificationAudioType.FIRST && this.raisedCount === 1) { - return true; - } else if (this.settings.Audio === NotificationAudioType.REPEAT) { - return true; - } - } - - /** - * Resets all raised notifications for this event - * @param {boolean} resetingAll - Indicates if all notifications are being reset, to avoid unnecessarily repeating steps for each event type - * @returns {void} - Nothing - */ - reset(resetingAll) { - if (this.raisedCount > 0) { - this.raisedCount = 0; - - if (this.settings.AlertType === NotificationAlertType.POPUP) { - if (this.popup) this.popup.close(); - } - else if (this.settings.AlertType === NotificationAlertType.TITLEPREFIX) { - NotificationTitleUpdate(); - } - else if (this.settings.AlertType === NotificationAlertType.FAVICON) { - NotificationDrawFavicon(resetingAll); - } - } - } -} - -let NotificationEventHandlers; -var NotificationAlertTypeList = []; -var NotificationAudioTypeList = []; - -/** - * Initialise notification variables on startup - * @returns {void} - Nothing - */ -function NotificationLoad() { - // Create the list of event handlers - NotificationEventHandlers = {}; - NotificationEventHandlerSetup(NotificationEventType.CHATMESSAGE, Player.NotificationSettings.ChatMessage); - NotificationEventHandlerSetup(NotificationEventType.CHATJOIN, Player.NotificationSettings.ChatJoin); - NotificationEventHandlerSetup(NotificationEventType.BEEP, Player.NotificationSettings.Beeps); - NotificationEventHandlerSetup(NotificationEventType.DISCONNECT, Player.NotificationSettings.Disconnect); - NotificationEventHandlerSetup(NotificationEventType.TEST, Player.NotificationSettings.Test); - NotificationEventHandlerSetup(NotificationEventType.LARP, Player.NotificationSettings.Larp); - - // Create the alert and audio type lists for the Preferences screen - NotificationAlertTypeList = Object.values(NotificationAlertType); - if (!("Notification" in window)) NotificationAlertTypeList.splice(NotificationAlertTypeList.indexOf(NotificationAlertType.POPUP)); - NotificationAudioTypeList = Object.values(NotificationAudioType); - - // Ensure the image is loaded for the first Favicon notification - DrawGetImage("Icons/Logo.png"); -} - -/** - * Create a handler instance to track and handle notifications of that event type - * @param {NotificationEventType} eventType - * @param {NotificationSetting} setting - */ -function NotificationEventHandlerSetup(eventType, setting) { - NotificationEventHandlers[eventType] = new NotificationEventHandler(eventType, setting); -} - -/** - * Create a new notification - * @param {NotificationEventType} eventType - The type of event that occurred - * @param {object} [data={}] - Data relating to the event that can be passed into a popup - * @returns {void} - Nothing - */ -function NotificationRaise(eventType, data = {}) { - if (NotificationEventHandlers) { - NotificationEventHandlers[eventType].raise(data); - } -} - -/** - * Clear all raised notifications of the specified type - * @param {NotificationEventType} eventType - The type of event to be cleared - * @returns {void} - Nothing - */ -function NotificationReset(eventType) { - if (NotificationEventHandlers) { - NotificationEventHandlers[eventType].reset(false); - } -} - -/** - * Clear all raised notifications - * @returns {void} - Nothing - */ -function NotificationResetAll() { - Object.values(NotificationEventHandlers).forEach(N => N.reset(true)); -} - -/** - * Returns whether popup notifications are permitted - * @param {NotificationEventType} eventType - The type of event that occurred - * @param {object} [data={}] - Data relating to the event that can be passed into a popup - * @returns {boolean} - Whether popups can appear - */ -function NotificationPopupsEnabled(eventType, data) { - if (!("Notification" in window)) { - return false; - } else if (Notification.permission === "granted") { - return true; - } else if (Notification.permission === 'denied') { - return false; - } else if (Notification.permission === 'default') { - Notification.requestPermission().then(() => { - if (Notification.permission === "granted") { - NotificationRaise(eventType, data); - } - }); - return false; - } else { - return false; - } -} - -/** - * Returns the total number of notifications raised for a particular alert type - * @param {NotificationAlertType} alertType - The type of alert to check - * @returns {number} - The total number of notifications - */ -function NotificationGetTotalCount(alertType) { - const totalRaisedCount = Object.values(NotificationEventHandlers) - .filter(n => n.settings.AlertType == alertType) - .reduce((a, b) => a + b.raisedCount, 0); - return totalRaisedCount; -} - -/** - * Sets or clears the notification number in the document header - * @returns {void} - Nothing - */ -function NotificationTitleUpdate() { - const totalRaisedCount = NotificationGetTotalCount(NotificationAlertType.TITLEPREFIX); - const titlePrefix = totalRaisedCount === 0 ? "" : "(" + totalRaisedCount.toString() + ") "; - document.title = titlePrefix + "Bondage Club"; -} - -/** - * Redraws the icon in the tab/window header to show a red circle with the notification count - * @param {boolean} resetingAll - If resetting all notifications, no need to redraw as the total decreases - * @returns {void} - Nothing - */ -function NotificationDrawFavicon(resetingAll) { - let iconUrl = "Icons/Logo.png"; - const totalRaisedCount = Math.min(NotificationGetTotalCount(NotificationAlertType.FAVICON), 99); - if (totalRaisedCount > 0 && !resetingAll) { - // Draw the normal icon first - const iconLength = 75; - let IconCanvas = document.createElement("canvas").getContext("2d"); - IconCanvas.canvas.width = iconLength; - IconCanvas.canvas.height = iconLength; - DrawImageCanvas(iconUrl, IconCanvas, 0, 0); - - // Draw a red circle containing a number - const radius = 29; - const lineWidth = 2; - const circleCentre = iconLength - (radius + lineWidth); - DrawCircle(circleCentre, circleCentre, radius, lineWidth, "Black", "Red", IconCanvas); - const fontSize = radius * 2 * (totalRaisedCount >= 10 ? 0.88 : 1); // Shrink for double-digits - IconCanvas.font = fontSize + "px Comic Sans MS"; - IconCanvas.textAlign = "center"; - IconCanvas.textBaseline = "middle"; - IconCanvas.fillStyle = "White"; - // y is being offset because it wasn't centring for some reason - IconCanvas.fillText(totalRaisedCount.toString(), circleCentre, circleCentre + (radius / 5)); - - // Convert the image into a Data URL - iconUrl = IconCanvas.canvas.toDataURL("image/x-icon"); - } - /** @type {HTMLLinkElement} */ (document.getElementById('favicon')).href = iconUrl; -} diff --git a/Scripts/Patch.js b/Scripts/Patch.js deleted file mode 100644 index def26aa96..000000000 --- a/Scripts/Patch.js +++ /dev/null @@ -1,475 +0,0 @@ -"use strict"; -let ArcadeDeviousChallenge = false; - -var DialogText = ""; -var DialogTextDefault = ""; -var DialogTextDefaultTimer = -1; -var StruggleProgress = -1; -var DialogColor = null; -var DialogExpressionColor = null; -var DialogColorSelect = null; -var DialogPreviousCharacterData = {}; -/** @type DialogInventoryItem[] */ -var DialogInventory = []; -var DialogInventoryOffset = 0; -/** @type {Item|null} */ -var DialogFocusItem = null; -/** @type {Item|null} */ -var DialogFocusSourceItem = null; -var DialogFocusItemColorizationRedrawTimer = null; -/** @type {string[]} */ -var DialogMenuButton = []; -var DialogItemToLock = null; -var DialogAllowBlush = false; -var DialogAllowEyebrows = false; -var DialogAllowFluids = false; -var DialogFacialExpressions = []; -var DialogFacialExpressionsSelected = -1; -var DialogFacialExpressionsSelectedBlindnessLevel = 2; -var DialogSavedExpressionPreviews = []; -/** @type {Pose[][]} */ -var DialogActivePoses = []; -var DialogItemPermissionMode = false; -var DialogExtendedMessage = ""; -var DialogActivityMode = false; -/** @type {Array} */ -var DialogActivity = []; -/** @type {Record<"Enabled" | "Equipped" | "BothFavoriteUsable" | "TargetFavoriteUsable" | "PlayerFavoriteUsable" | "Usable" | "TargetFavoriteUnusable" | "PlayerFavoriteUnusable" | "Unusable" | "Blocked", DialogSortOrder>} */ -var DialogSortOrder = { - Enabled: 1, - Equipped: 2, - BothFavoriteUsable: 3, - TargetFavoriteUsable: 4, - PlayerFavoriteUsable: 5, - Usable: 6, - TargetFavoriteUnusable: 7, - PlayerFavoriteUnusable: 8, - Unusable: 9, - Blocked: 10 -}; -var DialogSelfMenuSelected = null; -var DialogLeaveDueToItem = false; // This allows dynamic items to call DialogLeave() without crashing the game -var DialogLockMenu = false; -var DialogLentLockpicks = false; -var DialogGamingPreviousRoom = ""; -var DialogGamingPreviousModule = ""; -var DialogButtonDisabledTester = /Disabled(For\w+)?$/u; - -/** @type {Map} */ -var PlayerDialog = new Map(); - -/** @type {FavoriteState[]} */ -var DialogFavoriteStateDetails = [ - { - TargetFavorite: true, - PlayerFavorite: true, - Icon: "FavoriteBoth", - UsableOrder: DialogSortOrder.BothFavoriteUsable, - UnusableOrder: DialogSortOrder.TargetFavoriteUnusable - }, - { - TargetFavorite: true, - PlayerFavorite: false, - Icon: "Favorite", - UsableOrder: DialogSortOrder.TargetFavoriteUsable, - UnusableOrder: DialogSortOrder.TargetFavoriteUnusable - }, - { - TargetFavorite: false, - PlayerFavorite: true, - Icon: "FavoritePlayer", - UsableOrder: DialogSortOrder.PlayerFavoriteUsable, - UnusableOrder: DialogSortOrder.PlayerFavoriteUnusable - }, - { - TargetFavorite: false, - PlayerFavorite: false, - Icon: null, - UsableOrder: DialogSortOrder.Usable, - UnusableOrder: DialogSortOrder.Unusable - }, -]; - - -function DialogCanUnlock() { - return true; -} - -// This file patches KD -function CheatFactor() { - return 1; -} - -/** - * Returns the expressions of character C as a single big object - * @param {Character} C - The character whose expressions should be returned - * @returns {object} Expression - The expresssion of a character - */ -function WardrobeGetExpression(C) { - var characterExpression = {}; - ServerAppearanceBundle(C.Appearance).filter(item => item.Property != null && item.Property.Expression != null).forEach(item => characterExpression[item.Group] = item.Property.Expression); - return characterExpression; -} -/** - * Draws the online game images/text needed on the characters - * @param {Character} C - Character to draw the info for - * @param {number} X - Position of the character the X axis - * @param {number} Y - Position of the character the Y axis - * @param {number} Zoom - Amount of zoom the character has (Height) - * @returns {void} - Nothing - */ -function OnlineGameDrawCharacter(C, X, Y, Zoom) { - -} - -/** - * Returns the background color of a dialog menu button based on the button name. - * @param {string} ButtonName - The menu button name - * @returns {string} - The background color that the menu button should use - */ -function DialogGetMenuButtonColor(ButtonName) { - if (DialogIsMenuButtonDisabled(ButtonName)) { - return "#808080"; - } else if (ButtonName === "ColorPick") { - return DialogColorSelect || "#fff"; - } else { - return "#fff"; - } -} -/** - * Determines whether or not a given dialog menu button should be disabled based on the button name. - * @param {string} ButtonName - The menu button name - * @returns {boolean} - TRUE if the menu button should be disabled, FALSE otherwise - */ -function DialogIsMenuButtonDisabled(ButtonName) { - return DialogButtonDisabledTester.test(ButtonName); -} - -/** - * Build the buttons in the top menu - * @param {Character} C - The character for whom the dialog is prepared - * @returns {void} - Nothing - */ -function DialogMenuButtonBuild(C) { - - // The "Exit" button is always available - DialogMenuButton = ["Exit"]; - - /** The item in the current slot */ - const Item = InventoryGet(C, C.FocusGroup.Name); - const ItemBlockedOrLimited = !!Item && InventoryBlockedOrLimited(C, Item); - - // In color picker mode - if (DialogColor != null && Item == null) { - DialogMenuButton.push("ColorCancel"); - DialogMenuButton.push("ColorSelect"); - return; - } - - // Pushes all valid main buttons, based on if the player is restrained, has a blocked group, has the key, etc. - const IsGroupBlocked = InventoryGroupIsBlocked(C); - - if ((DialogInventory != null) && (DialogInventory.length > 12) && ((Player.CanInteract() && !IsGroupBlocked) || DialogItemPermissionMode)) { - DialogMenuButton.push("Next"); - DialogMenuButton.push("Prev"); - } - - if (C.FocusGroup.Name == "ItemMouth" || C.FocusGroup.Name == "ItemMouth2" || C.FocusGroup.Name == "ItemMouth3") - DialogMenuButton.push("ChangeLayersMouth"); - - // Color selection - if (DialogCanColor(C, Item)) DialogMenuButton.push(ItemBlockedOrLimited ? "ColorPickDisabled" : "ColorPick"); - - // Item permission enter/exit - if (C.ID == 0) { - if (DialogItemPermissionMode) DialogMenuButton.push("DialogNormalMode"); - else DialogMenuButton.push("DialogPermissionMode"); - } - - // Make sure the previous button doesn't overflow the menu - if ((DialogMenuButton.length >= 10) && (DialogMenuButton.indexOf("Prev") >= 0)) - DialogMenuButton.splice(DialogMenuButton.indexOf("Prev"), 1); - -} - - -/** - * Checks whether the player can color the given item on the given character - * @param {Character} C - The character on whom the item is equipped - * @param {Item} Item - The item to check the player's ability to color against - * @returns {boolean} - TRUE if the player is able to color the item, FALSE otherwise - */ -function DialogCanColor(C, Item) { - const ItemColorable = !Item || (Item && Item.Asset && Item.Asset.ColorableLayerCount > 0); - return ItemColorable; -} - -/** - * Sort the inventory list by the global variable SortOrder (a fixed number & current language description) - * @returns {void} - Nothing - */ -function DialogInventorySort() { - DialogInventory.sort((a, b) => a.SortOrder.localeCompare(b.SortOrder, undefined, { numeric: true, sensitivity: 'base' })); -} - -/** - * Create a stringified list of the group and the assets currently in the dialog inventory - * @param {Character} C - The character the dialog inventory has been built for - * @returns {string} - The list of assets as a string - */ -function DialogInventoryStringified(C) { - return (C.FocusGroup ? C.FocusGroup.Name : "") + (DialogInventory ? JSON.stringify(DialogInventory.map(I => I.Asset.Name).sort()) : ""); -} - - - -/** - * Adds the item in the dialog list - * @param {Character} C - The character the inventory is being built for - * @param {Item} item - The item to be added to the inventory - * @param {boolean} isWorn - Should be true, if the item is currently being worn, false otherwise - * @param {DialogSortOrder} [sortOrder] - Defines where in the inventory list the item is sorted - * @returns {void} - Nothing - */ -function DialogInventoryAdd(C, item, isWorn, sortOrder) { - if (!DialogItemPermissionMode) { - const asset = item.Asset; - // Make sure we do not duplicate the item in the list, including crafted items - for (let I = 0; I < DialogInventory.length; I++) - if ((DialogInventory[I].Asset.Group.Name == asset.Group.Name) && (DialogInventory[I].Asset.Name == asset.Name)) { - if ((item.Craft == null) && (DialogInventory[I].Craft != null)) continue; - if ((item.Craft != null) && (DialogInventory[I].Craft == null)) continue; - if ((item.Craft != null) && (DialogInventory[I].Craft != null) && (item.Craft.Name != DialogInventory[I].Craft.Name)) continue; - return; - } - } - - // Adds the item to the selection list - const inventoryItem = DialogInventoryCreateItem(C, item, isWorn, sortOrder); - if (item.Craft != null) { - inventoryItem.Craft = item.Craft; - if (inventoryItem.SortOrder.charAt(0) == DialogSortOrder.Usable.toString()) inventoryItem.SortOrder = DialogSortOrder.PlayerFavoriteUsable.toString() + item.Asset.Description; - if (inventoryItem.SortOrder.charAt(0) == DialogSortOrder.Unusable.toString()) inventoryItem.SortOrder = DialogSortOrder.PlayerFavoriteUnusable.toString() + item.Asset.Description; - } - DialogInventory.push(inventoryItem); - -} - - -/** - * Returns settings for an item based on whether the player and target have favorited it, if any - * @param {Character} C - The targeted character - * @param {Asset} asset - The asset to check favorite settings for - * @param {string} [type=null] - The type of the asset to check favorite settings for - * @returns {FavoriteState} - The details to use for the asset - */ -function DialogGetFavoriteStateDetails(C, asset, type = null) { - const isTargetFavorite = InventoryIsFavorite(C, asset.Name, asset.Group.Name, type); - const isPlayerFavorite = C.ID !== 0 && InventoryIsFavorite(Player, asset.Name, asset.Group.Name, type); - return DialogFavoriteStateDetails.find(F => F.TargetFavorite == isTargetFavorite && F.PlayerFavorite == isPlayerFavorite); -} - -/** - * Searches in the dialog for a specific stage keyword and returns that dialog option if we find it, error otherwise - * @param {string} KeyWord - The key word to search for - * @returns {string} - */ -function DialogFindPlayer(KeyWord) { - const res = PlayerDialog.get(KeyWord); - return res !== undefined ? res : `MISSING PLAYER DIALOG: ${KeyWord}`; -} - -/** - * Creates an individual item for the dialog inventory list - * @param {Character} C - The character the inventory is being built for - * @param {Item} item - The item to be added to the inventory - * @param {boolean} isWorn - Should be true if the item is currently being worn, false otherwise - * @param {DialogSortOrder} [sortOrder] - Defines where in the inventory list the item is sorted - * @returns {DialogInventoryItem} - The inventory item - */ -function DialogInventoryCreateItem(C, item, isWorn, sortOrder) { - const asset = item.Asset; - const favoriteStateDetails = DialogGetFavoriteStateDetails(C, asset); - - // Determine the sorting order for the item - if (!DialogItemPermissionMode) { - if (InventoryBlockedOrLimited(C, item)) { - sortOrder = DialogSortOrder.Blocked; - } - else if (sortOrder == null) { - if (asset.DialogSortOverride != null) { - sortOrder = asset.DialogSortOverride; - } else { - if (InventoryAllow(C, asset, undefined, false) && InventoryChatRoomAllow(asset.Category)) { - sortOrder = favoriteStateDetails.UsableOrder; - } else { - sortOrder = favoriteStateDetails.UnusableOrder; - } - } - } - } else if (sortOrder == null) { - sortOrder = DialogSortOrder.Enabled; - } - - // Determine the icons to display in the preview image - let icons = []; - if (favoriteStateDetails.Icon) icons.push(favoriteStateDetails.Icon); - if (InventoryItemHasEffect(item, "Lock", true)) icons.push(isWorn ? "Locked" : "Unlocked"); - if (!C.IsPlayer() && InventoryIsAllowedLimited(C, item)) icons.push("AllowedLimited"); - icons = icons.concat(DialogGetAssetIcons(asset)); - - /** @type {DialogInventoryItem} */ - const inventoryItem = { - Asset: asset, - Worn: isWorn, - // @ts-ignore - Icons: icons, - SortOrder: sortOrder.toString() + asset.Description, - Hidden: CharacterAppearanceItemIsHidden(asset.Name, asset.Group.Name), - Vibrating: isWorn && InventoryItemHasEffect(item, "Vibrating", true) - }; - return inventoryItem; -} - -/** - * Returns a list of icons associated with the asset - * @param {Asset} asset - The asset to get icons for - * @returns {InventoryIcon[]} - A list of icon names - */ -function DialogGetAssetIcons(asset) { - let icons = []; - icons = icons.concat(asset.PreviewIcons); - return icons; -} - -/** - * Build the inventory listing for the dialog which is what's equipped, - * the player's inventory and the character's inventory for that group - * @param {Character} C - The character whose inventory must be built - * @param {number} [Offset] - The offset to be at, if specified. - * @param {boolean} [redrawPreviews=false] - If TRUE and if building a list of preview character images, redraw the canvases - * @returns {void} - Nothing - */ -function DialogInventoryBuild(C, Offset, redrawPreviews = false) { - - // Make sure there's a focused group - DialogInventoryOffset = Offset == null ? 0 : Offset; - const DialogInventoryBefore = DialogInventoryStringified(C); - DialogInventory = []; - if (C.FocusGroup != null) { - - // First, we add anything that's currently equipped - const CurItem = C.Appearance.find(A => A.Asset.Group.Name == C.FocusGroup.Name && A.Asset.DynamicAllowInventoryAdd(C)); - if (CurItem) - DialogInventoryAdd(C, CurItem, true, DialogSortOrder.Enabled); - - // In item permission mode we add all the enable items except the ones already on, unless on Extreme difficulty - if (DialogItemPermissionMode) { - for (const A of C.FocusGroup.Asset) { - if (!A.Enable) - continue; - - if (A.Wear) { - if ((CurItem == null) || (CurItem.Asset.Name != A.Name) || (CurItem.Asset.Group.Name != A.Group.Name)) - DialogInventoryAdd(Player, { Asset: A }, false, DialogSortOrder.Enabled); - } else if (A.IsLock) { - const LockIsWorn = InventoryCharacterIsWearingLock(C, A.Name); - DialogInventoryAdd(Player, { Asset: A }, LockIsWorn, DialogSortOrder.Enabled); - } - } - } else { - - // Second, we add everything from the victim inventory - for (const I of C.Inventory) - if ((I.Asset != null) && (I.Asset.Group.Name == C.FocusGroup.Name) && I.Asset.DynamicAllowInventoryAdd(C)) - DialogInventoryAdd(C, I, false); - - // Third, we add everything from the player inventory if the player isn't the victim - if (C.ID != 0) - for (const I of Player.Inventory) - if ((I.Asset != null) && (I.Asset.Group.Name == C.FocusGroup.Name) && I.Asset.DynamicAllowInventoryAdd(C)) - DialogInventoryAdd(C, I, false); - - // Fourth, we add all free items (especially useful for clothes), or location-specific always available items - for (const A of Asset) - if (A.Group.Name === C.FocusGroup.Name && A.DynamicAllowInventoryAdd(C)) - if (A.Value === 0) - DialogInventoryAdd(C, { Asset: A }, false); - - } - - // Rebuilds the dialog menu and its buttons - DialogInventorySort(); - DialogMenuButtonBuild(C); - - // Build the list of preview images - const DialogInventoryAfter = DialogInventoryStringified(C); - const redraw = redrawPreviews || (DialogInventoryBefore !== DialogInventoryAfter); - AppearancePreviewBuild(C, redraw); - } -} - - -/** - * Shows the extended item menue for a given item, if possible. - * Therefore a dynamic function name is created and then called. - * @param {Item} Item - The item the extended menu should be shown for - * @param {Item} [SourceItem] - The source of the extended menu - * @returns {void} - Nothing - */ -function DialogExtendItem(Item, SourceItem) { - const C = CharacterGetCurrent(); - if (InventoryBlockedOrLimited(C, Item)) return; - StruggleProgress = -1; - DialogLockMenu = false; - DialogColor = null; - DialogFocusItem = Item; - DialogFocusSourceItem = SourceItem; - CommonDynamicFunction("Inventory" + Item.Asset.Group.Name + Item.Asset.Name + "Load()"); -} - - -/** - * Leaves the item menu of the focused item. Constructs a function name from the - * item's asset group name and the item's name and tries to call that. - * @returns {boolean} - Returns true, if an item specific exit function was called, false otherwise - */ -function DialogLeaveFocusItem() { - if (DialogFocusItem != null) { - if (DialogFocusItem.Asset.Extended) { - ExtendedItemExit(); - } - - var funcName = "Inventory" + DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name + "Exit"; - if (typeof window[funcName] === "function") { - window[funcName](); - DialogFocusItem = null; - return true; - } - DialogFocusItem = null; - } - return false; -} - -/** - * Returns a specific reputation value for the player - * @param {string} RepType - Type/name of the reputation to get the value of. - * @returns {number} - Returns the value of the reputation. It can range from 100 to -100, and it defaults to 0 if the player never earned this type of reputation before. - */ -function ReputationGet(RepType) { - return 0; -} -/** Smile and wave */ -function DialogSetReputation(a, b) { -} - -function remap(src) { - return src; -} - -function ChatRoomCharacterUpdate(C) { - // Nothing. -} - - -let KDPatched = true; diff --git a/Scripts/Patch.ts b/Scripts/Patch.ts new file mode 100644 index 000000000..d6b853d39 --- /dev/null +++ b/Scripts/Patch.ts @@ -0,0 +1,53 @@ +// This should be true only for standalone +const StandalonePatched = true; + +const ArcadeDeviousChallenge = false; +const ChatRoomCharacter: Character[] = []; +const ChatRoomChatLog: {Garbled: string, Time: number, SenderName: string}[] = []; +const DialogGamingPreviousRoom: string = ""; +const MiniGameReturnFunction: string = "ArcadeKinkyDungeonEnd"; + + + + +/** + * Returns a specific reputation value for the player + * @param RepType - Type/name of the reputation to get the value of. + * @returns Returns the value of the reputation. It can range from 100 to -100, and it defaults to 0 if the player never earned this type of reputation before. + */ +function ReputationGet(RepType: string): number { return 0; } +function DialogSetReputation(a: string, b: number): void {} + +let ChatRoomCharacterUpdate = (C: Character): void => {} +function ChatRoomPublishCustomAction(msg: string, LeaveDialog: boolean, Dictionary: any): void {} + +const TypedItemDataLookup: {[_: string]: any} = {}; +const ModularItemDataLookup: {[_: string]: any} = {}; + +function TypedItemSetOption(C: PlayerCharacter, item: Item, options: any, option: any, push = false) {} +function TypedItemSetOptionByName(a: Character, b: Item, c: string, d: boolean) {} + +function ExtendedItemSetType(C: any, Options: any, Option: any) {} +function ExtendedItemExit() {} + +let MiniGameVictory = true; + +function InventoryRemove(C: Character, AssetGroup: string, Refresh = false) {} +function InventoryGetLock(Lock: Item): any {} +function InventoryWear(C: Character, AssetName: any, AssetGroup: any, ItemColor?: any, Difficulty?: undefined, MemberNumber?: undefined, Craft?: undefined, Refresh=true) {} +function InventoryLock(C: Character, Item: Item, Lock: string, MemberNumber: number, Update = true) {} +function InventoryUnlock(C: Character, Item: string) {} + +let KDPatched = true; +let ServerURL = "http://localhost:4288"; +function ServerSend(Message: string, Data: any) {} +function ServerPlayerIsInChatRoom() { return false; } + +function CharacterAppearanceLoadCharacter(C: Character): void {} +function CharacterChangeMoney(C: Character, amount: number): void {} + +function DrawImage(Image: string, X: number, Y: number, Invert: boolean = false): boolean { return true; } + +// These two are declared with `let` as they are explicitly and intentionally assignable, for performance optimization in BC +let CharacterAppearanceBuildCanvas = (C: Character): void => {} +let CharacterRefresh = (C: Character, push: boolean = false): void => {} diff --git a/Scripts/Server.js b/Scripts/Server.js deleted file mode 100644 index 68c22d4a7..000000000 --- a/Scripts/Server.js +++ /dev/null @@ -1,398 +0,0 @@ -/** - * A map containing appearance item diffs, keyed according to the item group. Used to compare and validate before/after - * for appearance items. - * @typedef AppearanceDiffMap - * @type {Record.} - */ - -"use strict"; -var ServerSocket = null; -var ServerURL = "http://localhost:4288"; -/** @type { { Message: string; Timer: number; ChatRoomName?: string | null; IsMail?: boolean; } } */ -var ServerBeep = { Message: "", Timer: 0 }; -var ServerIsConnected = false; -var ServerReconnectCount = 0; -var ServerCharacterNicknameRegex = /^[a-zA-Z\s]*$/; - -const ServerScriptMessage = "WARNING! Console scripts can break your account or steal your data. Only run scripts if " + - "you know what you're doing and you trust the source. See " + - "https://gitgud.io/BondageProjects/Bondage-College/-/wikis/Player-Safety#scripts-browser-extensions to learn more about " + - "script safety."; -const ServerScriptWarningStyle = "display: inline-block; color: black; background: #ffe3ad; margin: 16px 0 8px 0; " + - "padding: 8px 4px; font-size: 20px; border: 6px solid #ffa600; font-family: 'Arial', sans-serif; line-height: 1.6;"; - -/** Loads the server by attaching the socket events and their respective callbacks */ -function ServerInit() { - -} - -/** @readonly */ -var ServerAccountUpdate = { - SyncToServer: () => {}, - QueueData: () => {} -}; - -/** - * Sets the connection status of the server and updates the login page message - * @param {boolean} connected - whether or not the websocket connection to the server has been established successfully - * @param {string} [errorMessage] - the error message to display if not connected - */ -function ServerSetConnected(connected, errorMessage) { - ServerIsConnected = connected; -} - -/** - * Callback when receiving a "connect" event on the socket - this will be called on initial connection and on - * successful reconnects. - */ -function ServerConnect() { - ServerSetConnected(true); -} - -/** - * Callback when receiving a "reconnecting" event on the socket - this is called when socket.io initiates a retry after - * a failed connection attempt. - */ -function ServerReconnecting() { - ServerReconnectCount++; -} - -/** - * Callback used to parse received information related to the server - * @param {{OnlinePlayers: number, Time: number}} data - Data object containing the server information - * @returns {void} - Nothing - */ -function ServerInfo(data) { -} - -/** - * Callback used when we are disconnected from the server, try to enter the reconnection mode (relog screen) if the - * user was logged in - * @param {*} data - Error to log - * @param {boolean} [close=false] - close the transport - * @returns {void} - Nothing - */ -function ServerDisconnect(data, close = false) { - -} - -/** - * Returns whether the player is currently in a chatroom or viewing a subscreen while in a chatroom - * @returns {boolean} - True if in a chatroom - */ -function ServerPlayerIsInChatRoom() { - return false; -} - -/** Sends a message with the given data to the server via socket.emit */ -function ServerSend(Message, Data) { -} - -/** - * Syncs Money, owner name and lover name with the server - * @returns {void} - Nothing - */ -function ServerPlayerSync() { -} - -/** - * Syncs the full player inventory to the server. - * @returns {void} - Nothing - */ -function ServerPlayerInventorySync() { -} - -/** - * Syncs player's favorite, blocked, limited and hidden items to the server - * @returns {void} - Nothing - */ -function ServerPlayerBlockItemsSync() { -} - -/** - * Syncs the full player log array to the server. - * @returns {void} - Nothing - */ -function ServerPlayerLogSync() { -} - -/** - * Syncs the full player reputation array to the server. - * @returns {void} - Nothing - */ -function ServerPlayerReputationSync() { -} - -/** - * Syncs the full player skill array to the server. - * @returns {void} - Nothing - */ -function ServerPlayerSkillSync() { -} - -/** - * Syncs player's relations and related info to the server. - * @returns {void} - Nothing - */ -function ServerPlayerRelationsSync() { - -} - -/** - * Prepares an appearance bundle so we can push it to the server. It minimizes it by keeping only the necessary - * information. (Asset name, group name, color, properties and difficulty) - * @param {Item[]} Appearance - The appearance array to bundle - * @returns {AppearanceBundle} - The appearance bundle created from the given appearance array - */ -function ServerAppearanceBundle(Appearance) { - var Bundle = []; - for (let A = 0; A < Appearance.length; A++) { - var N = {}; - N.Group = Appearance[A].Asset.Group.Name; - N.Name = Appearance[A].Asset.Name; - if ((Appearance[A].Color != null) && (Appearance[A].Color != "Default")) N.Color = Appearance[A].Color; - if ((Appearance[A].Difficulty != null) && (Appearance[A].Difficulty != 0)) N.Difficulty = Appearance[A].Difficulty; - if (Appearance[A].Property != null) N.Property = Appearance[A].Property; - if (Appearance[A].Craft != null) N.Craft = Appearance[A].Craft; - Bundle.push(N); - } - return Bundle; -} - -/** - * Loads the appearance assets from a server bundle that only contains the main info (no asset) and validates their - * properties to prevent griefing and respecting permissions in multiplayer - * @param {Character} C - Character for which to load the appearance - * @param {string} AssetFamily - Family of assets used for the appearance array - * @param {AppearanceBundle} Bundle - Bundled appearance - * @param {number} [SourceMemberNumber] - Member number of the user who triggered the change - * @param {boolean} [AppearanceFull=false] - Whether or not the appearance should be assigned to an NPC's AppearanceFull - * property - * @returns {boolean} - Whether or not the appearance bundle update contained invalid items - */ -function ServerAppearanceLoadFromBundle(C, AssetFamily, Bundle, SourceMemberNumber, AppearanceFull=false) { - if (!Array.isArray(Bundle)) { - Bundle = []; - } - - const appearanceDiffs = ServerBuildAppearanceDiff(AssetFamily, C.Appearance, Bundle); - ServerAddRequiredAppearance(AssetFamily, appearanceDiffs); - - if (SourceMemberNumber == null) SourceMemberNumber = C.MemberNumber; - const updateParams = ValidationCreateDiffParams(C, SourceMemberNumber); - - let { appearance, updateValid } = Object.keys(appearanceDiffs) - .reduce(({ appearance, updateValid }, key) => { - const diff = appearanceDiffs[key]; - const { item, valid } = ValidationResolveAppearanceDiff(diff[0], diff[1], updateParams); - if (item) appearance.push(item); - updateValid = updateValid && valid; - return { appearance, updateValid }; - }, { appearance: [], updateValid: true }); - - const cyclicBlockSanitizationResult = ValidationResolveCyclicBlocks(appearance, appearanceDiffs); - appearance = cyclicBlockSanitizationResult.appearance; - updateValid = updateValid && cyclicBlockSanitizationResult.valid; - - if (AppearanceFull) { - C.AppearanceFull = appearance; - } else { - C.Appearance = appearance; - } - - // If the appearance update was invalid, send another update to correct any issues - if (!updateValid && C.ID === 0) { - console.warn("Invalid appearance update bundle received. Updating with sanitized appearance."); - } - return updateValid; -} - -/** - * Builds a diff map for comparing changes to a character's appearance, keyed by asset group name - * @param {string} assetFamily - The asset family of the appearance - * @param {Item[]} appearance - The current appearance to compare against - * @param {AppearanceBundle} bundle - The new appearance bundle - * @returns {AppearanceDiffMap} - An appearance diff map representing the changes that have been made to the character's - * appearance - */ -function ServerBuildAppearanceDiff(assetFamily, appearance, bundle) { - /** @type {AppearanceDiffMap} */ - const diffMap = {}; - appearance.forEach((item) => { - diffMap[item.Asset.Group.Name] = [item, null]; - }); - bundle.forEach((item) => { - const appearanceItem = ServerBundledItemToAppearanceItem(assetFamily, item); - if (appearanceItem) { - const diff = diffMap[item.Group] = (diffMap[item.Group] || [null, null]); - diff[1] = appearanceItem; - } - }); - return diffMap; -} - -/** - * Maps a bundled appearance item, as stored on the server and used for appearance update messages, into a full - * appearance item, as used by the game client - * @param {string} assetFamily - The asset family of the appearance item - * @param {ItemBundle} item - The bundled appearance item - * @returns {Item} - A full appearance item representation of the provided bundled appearance item - */ -function ServerBundledItemToAppearanceItem(assetFamily, item) { - if (!item || typeof item !== "object" || typeof item.Name !== "string" || typeof item.Group !== "string") return null; - - const asset = AssetGet(assetFamily, item.Group, item.Name); - if (!asset) return null; - - return { - Asset: asset, - Difficulty: parseInt(item.Difficulty == null ? 0 : item.Difficulty), - Color: ServerParseColor(asset, item.Color, asset.Group.ColorSchema), - Craft: item.Craft, - Property: item.Property, - }; -} - -/** - * Parses an item color, based on the allowed colorable layers on an asset, and the asset's color schema - * @param {Asset} asset - The asset on which the color is set - * @param {string|string[]} color - The color value to parse - * @param {string[]} schema - The color schema to validate against - * @returns {string|string[]} - A parsed valid item color - */ -function ServerParseColor(asset, color, schema) { - if (Array.isArray(color)) { - if (color.length > asset.ColorableLayerCount) color = color.slice(0, asset.ColorableLayerCount); - return color.map(c => ServerValidateColorAgainstSchema(c, schema)); - } else { - return ServerValidateColorAgainstSchema(color, schema); - } -} - -/** - * Populates an appearance diff map with any required items, to ensure that all asset groups are present that need to - * be. - * @param {string} assetFamily - The asset family for the appearance - * @param {AppearanceDiffMap} diffMap - The appearance diff map to populate - * @returns {void} - Nothing - */ -function ServerAddRequiredAppearance(assetFamily, diffMap) { - AssetGroup.forEach(group => { - // If it's not in the appearance category or is allowed to empty, return - if (group.Category !== "Appearance" || group.AllowNone) return; - // If the current source already has an item in the group, return - if (diffMap[group.Name] && diffMap[group.Name][0]) return; - - const diff = diffMap[group.Name] = diffMap[group.Name] || [null, null]; - - if (group.MirrorGroup) { - // If we need to mirror an item, see if it exists - const itemToMirror = diffMap[group.MirrorGroup] && diffMap[group.MirrorGroup][0]; - if (itemToMirror) { - const mirroredAsset = AssetGet(assetFamily, group.Name, itemToMirror.Asset.Name); - // If there is an item to mirror, copy it and its color - if (mirroredAsset) diff[0] = { Asset: mirroredAsset, Color: itemToMirror.Color }; - } - } - - // If the item still hasn't been filled, use the first item from the group's asset list - if (!diff[0]) { - diff[0] = { Asset: group.Asset[0], Color: group.ColorSchema[0] }; - } - }); -} - -/** - * Validates and returns a color against a color schema - * @param {string} Color - The color to validate - * @param {string[]} Schema - The color schema to validate against (a list of accepted Color values) - * @returns {string} - The color if it is a valid hex color string or part of the color schema, or the default color - * from the color schema otherwise - */ -function ServerValidateColorAgainstSchema(Color, Schema) { - var HexCodeRegex = /^#(?:[0-9a-f]{3}){1,2}$/i; - if (typeof Color === 'string' && (Schema.includes(Color) || HexCodeRegex.test(Color))) return Color; - return Schema[0]; -} - -/** - * Syncs the player appearance with the server - * @returns {void} - Nothing - */ -function ServerPlayerAppearanceSync() { -} - -/** - * Syncs all the private room characters with the server - * @returns {void} - Nothing - */ -function ServerPrivateCharacterSync() { - -} - -/** - * Callback used to parse received information related to a query made by the player such as viewing their online - * friends or current email status - * @param {object} data - Data object containing the query data - * @returns {void} - Nothing - */ -function ServerAccountQueryResult(data) { - -} - -/** - * Callback used to parse received information related to a beep from another account - * @param {object} data - Data object containing the beep object which contain at the very least a name and a member - * number - * @returns {void} - Nothing - */ -function ServerAccountBeep(data) { - -} - - - -/** Draws the last beep sent by the server if the timer is still valid, used during the drawing process */ -function ServerDrawBeep() { - -} - -/** Handles a click on the beep rectangle if mail is included */ -function ServerClickBeep() { - -} - -/** Opens the friendlist from any screen */ -function ServerOpenFriendList() { - -} - -/** - * Callback used to parse received information related to the player ownership data - * @param {object} data - Data object containing the Owner name and Ownership object - * @returns {void} - Nothing - */ -function ServerAccountOwnership(data) { - -} - -/** - * Callback used to parse received information related to the player lovership data - * @param {object} data - Data object containing the Lovership array - * @returns {void} - Nothing - */ -function ServerAccountLovership(data) { - -} - -/** - * Compares the source account and target account to check if we allow using an item - * - * **This function MUST match server's identical function!** - * @param {Character} Source - * @param {Character} Target - * @returns {boolean} - */ -function ServerChatRoomGetAllowItem(Source, Target) { - return false; -} diff --git a/Scripts/Speech.js b/Scripts/Speech.js deleted file mode 100644 index 486799607..000000000 --- a/Scripts/Speech.js +++ /dev/null @@ -1,642 +0,0 @@ -"use strict"; - -const chineseRegex = /\p{Script=Hani}/u; -const chineseRandomGarbledSound = ['啊', '恩', '咕', '唔', '哈', '嗷', '呜']; - -/** - * A lookup mapping the gag effect names to their corresponding gag level numbers. - * @type {Object.} - * @constant - */ -var SpeechGagLevelLookup = { - GagTotal4: 20, - GagTotal3: 16, - GagTotal2: 12, - GagTotal: 8, - GagVeryHeavy: 7, - GagHeavy: 6, - GagMedium: 5, - GagNormal: 4, - GagEasy: 3, - GagLight: 2, - GagVeryLight: 1, -}; - -/** - * Analyzes a phrase to determine if it is a full emote. A full emote is a phrase wrapped in "()" - * @param {string} D - A phrase - * @returns {boolean} - Returns TRUE if the current speech phrase is a full emote (all between parentheses) - */ -function SpeechFullEmote(D) { - return ((D.indexOf("(") == 0 || D.indexOf("(") == 0) && (D.indexOf(")") == D.length - 1 || D.indexOf(")") == D.length - 1)); -} - -/** - * Returns the gag level corresponding to the given effect array, or 0 if the effect array contains no gag effects - * @param {string[]} Effect - The effect to lookup the gag level for - * @return {number} - The gag level corresponding to the given effects - */ -function SpeechGetEffectGagLevel(Effect) { - return Effect.reduce((Modifier, EffectName) => Modifier + (SpeechGagLevelLookup[EffectName] || 0), 0); -} - -/** - * Gets the cumulative gag level of an asset group. Each gagging effect has a specific numeric value. The following - * Effect arrays are used for the calculation: - * - Item.Property.Effect - * - Item.Asset.Effect - * - Item.Asset.Group.Effect - * @param {Character} C - The character, whose assets are used for the check - * @param {string[]} AssetGroups - The name of the asset groups to look through - * @returns {number} - Returns the total gag effect of the character's assets - */ -function SpeechGetGagLevel(C, AssetGroups) { - const effects = CharacterGetEffects(C, AssetGroups, true); - return SpeechGetEffectGagLevel(effects); -} - -/** - * Gets the cumulative gag level of a character - * @param {Character} C - The character, whose assets are used for the check - * @param {boolean} [NoDeaf=false] - Whether or not deafness affects the dialogue - * @returns {number} - Returns the total gag effect of the character's assets - */ -function SpeechGetTotalGagLevel(C, NoDeaf=false) { - let GagEffect = SpeechGetGagLevel(C, ["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemHead", "ItemHood", "ItemNeck", "ItemDevices"]); - - if (C.ID != 0 && !NoDeaf) { - if (Player.GetDeafLevel() >= 7) GagEffect = Math.max(GagEffect, 20); - else if (Player.GetDeafLevel() >= 6) GagEffect = Math.max(GagEffect, 16); - else if (Player.GetDeafLevel() >= 5) GagEffect = Math.max(GagEffect, 12); - else if (Player.GetDeafLevel() >= 4) GagEffect = Math.max(GagEffect, 8); - else if (Player.GetDeafLevel() >= 3) GagEffect = Math.max(GagEffect, 6); - else if (Player.GetDeafLevel() >= 2) GagEffect = Math.max(GagEffect, 4); - else if (Player.GetDeafLevel() >= 1) GagEffect = Math.max(GagEffect, 2); - } - return GagEffect; -} - -/** - * Processes the character's speech, anything between parentheses isn't touched. Effects alter the speech differently according to a character's language. Effects that can be applied are the following: gag talk, baby talk and stuttering. - * @param {Character} C - The character, whose dialog might need to be altered - * @param {string} CD - The character's dialog to alter - * @param {boolean} [NoDeaf=false] - Whether or not deafness affects the dialogue - * @returns {string} - Returns the dialog after speech effects were processed (Garbling, Stuttering, Baby talk) - */ -function SpeechGarble(C, CD, NoDeaf=false) { - let NS = CD; - - let GagEffect = SpeechGetTotalGagLevel(C, NoDeaf); - - - if (GagEffect > 0) NS = SpeechGarbleByGagLevel(GagEffect, CD); - - // No gag effect, we return the regular text - NS = SpeechStutter(C, NS); - NS = SpeechBabyTalk(C, NS); - - return NS; -} - -/** - * A PRNG(Pseudo random number generator) helper to generate random number sequence by seed. - * Stole this function and the function below from {@link https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript stackoverflow} - * @param {number} a - seed 1 - * @param {number} b - seed 2 - * @param {number} c - seed 3 - * @param {number} d - seed 4 - * @returns {function} - The function where it could be used to do PRNG magic. - */ -function sfc32(a, b, c, d) { - return function() { - a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0; - var t = (a + b) | 0; - a = b ^ b >>> 9; - b = c + (c << 3) | 0; - c = (c << 21 | c >>> 11); - d = d + 1 | 0; - t = t + d | 0; - c = c + t | 0; - return (t >>> 0) / 4294967296; - } -} - -/** - * Random seeding tool to generate random seeding sequence that is able to be used. - * This allows the random result always be the same when the seed is the same. - * (This implementation is needed because dialog refreshes every frame, we have to generate garbled text that are the same.) - * (Otherwise it will just keep flashing and changing the text.) - * - * @param {*} seed - The seed to generate random numbers. - * @returns {function} - The function where it could be used to do PRNG magic. - */ -function randomSeeding(seed) { - for (var i = 0, h = 1779033703 ^ seed.length; i < seed.length; i++) { - h = Math.imul(h ^ seed.charCodeAt(i), 3432918353); - h = h << 13 | h >>> 19; - } return function() { - h = Math.imul(h ^ (h >>> 16), 2246822507); - h = Math.imul(h ^ (h >>> 13), 3266489909); - return (h ^= h >>> 16) >>> 0; - } -} - -/** - * Test if the current character parsed in is a Chinese character, and client user is using Chinese. - * This is to prevent garbling Japanese kanji. - * But for chatroom use case where two clients may have different languages - * I don't have a definite solution yet, so let's do this for now to resolve the options not showing up first. - * @param {string} character - * @returns {boolean} - true if is Chinese character, false otherwise. - */ -function isChineseCharacter(character) { - if (TranslationLanguage !== 'CN') return false; - - return chineseRegex.test(character) -} - -/** - * Get the character and determine if it is a Chinese character, if it does, do random garbling according to the gagLevel. - * This is only a hotfix for the issue where Chinese characters are not displayed because they are not properly garbled, - * when showing as options. - * - * @param {string} character - The character needs to be garbled. - * @param {number} gagLevel - Gag level. - * - * @return {string} - The character that being garbled. - */ -function doChineseGarbling(character, gagLevel) { - let garbleRandomChance; - switch(gagLevel) { - case 0: - return character; - case 1: - garbleRandomChance = .8; - break; - // basically for Chinese, it is impossible to understand anything when have ball gags in the mouth. - // It seems like ball gag is at like gagLevel 2, so I decided to heavily garble it start from here. - case 2: - garbleRandomChance = .55; - break; - case 3: - garbleRandomChance = .5; - break; - case 4: - garbleRandomChance = .45; - break; - case 5: - garbleRandomChance = .4; - break; - case 6: - garbleRandomChance = .35; - break; - case 7: - garbleRandomChance = .3; - break; - case 8: - garbleRandomChance = .25; - break; - case 9: case 10: case 11: case 12: - garbleRandomChance = .2; - break; - default: - garbleRandomChance = .1; - } - - const seed = randomSeeding(character + garbleRandomChance.toString()); - const garbleDecision = sfc32(seed(), seed(), seed(), seed()); - - return (garbleDecision() >= garbleRandomChance) - ? chineseRandomGarbledSound[Math.floor(garbleDecision() * chineseRandomGarbledSound.length)] - : character; -} - -/** - * A helper method to check if the character parsed in is one of the following: ' .?!~-。?!,' - * Note: last 4 punctuations are commonly used in CJK languages. - * @param {string} character - The character needs to be checked. - * @returns {boolean} - true if containing one of the following: ' .?!~-', otherwise false. - */ -function isStandardPunctuationOrSpace(character) { - return ' .?!~-。?!,'.includes(character); -} - -/** - * A helper method to check if the character parsed in is one of the following: ' .?!~-_'"。?!,' - * This one was created for lower gag levels or baby talk. So any and all punction can be added to it. - * @param {string} character - The character needs to be checked. - * @returns {boolean} - true if containing one of the following: ' .?!~-_'"。?!,', otherwise false. - */ -function isAnyPunctuationOrSpace(character) { - return ' .?!~-_\'"。?!,'.includes(character); -} - -/** - * Helper method to strip diacritics from characters. - * @param {string} character - character that needs to be stripped. - * @param {Number} gagEffect - The current gag effect level. - * @returns {string} - character that being stripped after garbling. - */ -function stripDiacriticsFromCharacter(character, gagEffect) { - switch (character) { - case 'á': - case 'à': - case 'ã': - case 'â': - return 'a'; - case 'é': - case 'ê': - case 'è': - case 'ë': - return 'e'; - case 'í': - case 'î': - case 'ì': - case 'ï': - return 'i'; - case 'ó': - case 'ô': - case 'ò': - case 'õ': - return 'o'; - case 'ú': - case 'û': - case 'ù': - case 'ü': - return 'u'; - case 'ñ': - return gagEffect >= 5 ? 'm' : 'n'; - case 'ç': - return gagEffect >= 5 ? 'h' : 's'; - } - - // if not any of the above, return itself. - return character; -} - -/** - * check if the character is one of the following: áàãâéèêíìîõóòôúùûñç - * @param {string} character - The character needs to be checked. - * @returns {boolean} - true if is one of the above, otherwise false. - */ -function isAccentedOrLatinCharacter(character) { - return 'áàãâéèêíìîõóòôúùûñç'.includes(character); -} - - -/** - * The core of the speech garble function, usable without being tied to a specific character - * @param {number} GagEffect - The gag level of the speech - * @param {string} CD - The character's dialog to alter - * @return {string} - Garbled text - */ -function SpeechGarbleByGagLevel(GagEffect, CD, IgnoreOOC) { - - // Variables to build the new string and check if we are in a parentheses - var NS = ""; - var Par = false; - if (CD == null) CD = ""; - if (GagEffect === 0) return CD; - - // GagTotal4 always returns mmmmm and muffles some frequent letters entirely, 75% least frequent letters - for (let L = 0; L < CD.length; L++) { - const H = CD.charAt(L).toLowerCase(); - if ((H == "(" || H == '(') && !IgnoreOOC) Par = true; - if (GagEffect >= 20) { - if (Par) NS += CD.charAt(L); - else { - if (isStandardPunctuationOrSpace(H)) NS += H; - else if ('zqjxkvbywgpfucdlhr'.includes(H)) NS += ' '; - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, GagEffect); - else NS += 'm'; - } - } - - // GagTotal3 always returns mmmmm and muffles some relatively frequent letters entirely, 50% least frequent letters - else if (GagEffect >= 16) { - if (Par) NS += CD.charAt(L); - else { - if (isStandardPunctuationOrSpace(H)) NS += H; - else if ('zqjxkvbywgpf'.includes(H)) NS += ' '; - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, GagEffect); - else NS += 'm'; - } - } - - // GagTotal2 always returns mmmmm and muffles some less frequent letters entirely; 25% least frequent letters - else if (GagEffect >= 12) { - if (Par) NS += CD.charAt(L); - else { - if (isStandardPunctuationOrSpace(H)) NS += H; - else if ('zqjxkv'.includes(H)) NS += ' '; - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, GagEffect); - else NS += 'm'; - } - } - - // Total gags always returns mmmmm - else if (GagEffect >= 8) { - if (Par) NS += CD.charAt(L); - else { - if (isStandardPunctuationOrSpace(H)) NS += H; - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, GagEffect); - else NS += 'm'; - } - } - - // VeryHeavy garble - Close to no letter stays the same - else if (GagEffect >= 7) { - if (!Par) { - // Regular characters - if ('aeiouy'.includes(H)) NS += 'e'; - else if ('jklr'.includes(H)) NS += 'a'; - else if ('szh'.includes(H)) NS += 'h'; - else if ('dfgnmwtcqxpv'.includes(H)) NS += 'm'; - else if (isStandardPunctuationOrSpace(H) || H == 'b') NS += H; - - // Accents/Latin characters - else if (isAccentedOrLatinCharacter(H)) NS += stripDiacriticsFromCharacter(H, GagEffect); - - // Cyrillic characters - else if ('аеиоуюля'.includes(H)) NS += 'e'; - else if ('сйх'.includes(H)) NS += 'к'; - else if ('жклру'.includes(H)) NS += 'a'; - else if ('зсгй'.includes(H)) NS += 'г'; - else if ('брвы'.includes(H)) NS += 'ф'; - else if ('дфгнм'.includes(H)) NS += 'м'; - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, GagEffect); - - } else NS += CD.charAt(L); - } - - // Heavy garble - Almost no letter stays the same - else if (GagEffect >= 6) { - if (!Par) { - // Regular characters - if ('aeiouyt'.includes(H)) NS += 'e'; - else if ('cqx'.includes(H)) NS += 'k'; - else if ('jklrw'.includes(H)) NS += 'a'; - else if ('szh'.includes(H)) NS += 'h'; - else if ('bpv'.includes(H)) NS += 'f'; - else if ('dfgnm'.includes(H)) NS += 'm'; - else if (isStandardPunctuationOrSpace(H)) NS += H; - - // Accents/Latin characters - else if (isAccentedOrLatinCharacter(H)) NS += stripDiacriticsFromCharacter(H, GagEffect); - - // Cyrillic characters - else if ('аеиоуюля'.includes(H)) NS += 'e'; - else if ('сйх'.includes(H)) NS += 'к'; - else if ('жклру'.includes(H)) NS += 'a'; - else if ('зсгй'.includes(H)) NS += 'г'; - else if ('брвы'.includes(H)) NS += 'ф'; - else if ('дфгнм'.includes(H)) NS += 'м'; - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, GagEffect); - - } else NS += CD.charAt(L); - } - - // Medium garble - Some letters stays the same - else if (GagEffect >= 5) { - if (!Par) { - // Regular characters - if ('eiouyt'.includes(H)) NS += 'e'; - else if ('cqxk'.includes(H)) NS += 'k'; - else if ('jlrwa'.includes(H)) NS += 'a'; - else if ('szh'.includes(H)) NS += 'h'; - else if ('bpv'.includes(H)) NS += 'f'; - else if ('dfgm'.includes(H)) NS += 'm'; - else if (isStandardPunctuationOrSpace(H) || H == 'n') NS += H; - - // Accents/Latin characters - else if (isAccentedOrLatinCharacter(H)) NS += stripDiacriticsFromCharacter(H, GagEffect); - - // Cyrillic characters - else if ('аеиоуюля'.includes(H)) NS += 'e'; - else if ('сйх'.includes(H)) NS += 'к'; - else if ('жклру'.includes(H)) NS += 'a'; - else if ('зсгй'.includes(H)) NS += 'г'; - else if ('брвы'.includes(H)) NS += 'ф'; - else if ('дфгнм'.includes(H)) NS += 'м'; - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, GagEffect); - - } else NS += CD.charAt(L); - } - - // Normal garble, keep vowels and a few letters the same - else if (GagEffect >= 4) { - if (!Par) { - // Regular characters - if ('vbct'.includes(H)) NS += 'e'; - else if ('qkx'.includes(H)) NS += 'k'; - else if ('wyjlr'.includes(H)) NS += 'a'; - else if ('sz'.includes(H)) NS += 'h'; - else if ('df'.includes(H)) NS += 'm'; - else if (H == "p") NS += 'f'; - else if (H == "g") NS += 'n'; - else if (isAnyPunctuationOrSpace(H) || 'aeioumnh'.includes(H)) NS += H; - - // Accents/Latin characters - else if (isAccentedOrLatinCharacter(H)) NS += stripDiacriticsFromCharacter(H, GagEffect); - - // Cyrillic characters - else if ('вфбп'.includes(H)) NS += 'фы'; - else if ('гкх'.includes(H)) NS += 'к'; - else if ('вужлр'.includes(H)) NS += 'а'; - else if ('ся'.includes(H)) NS += 'х'; - else if ('дф'.includes(H)) NS += 'м'; - else if (H == "р") NS += 'ф'; - else if (H == "г") NS += 'н'; - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, GagEffect); - - } else NS += CD.charAt(L); - } - - // Easy garble, keep vowels and a some letters the same - else if (GagEffect >= 3) { - if (!Par) { - // Regular characters - if ('vbct'.includes(H)) NS += 'e'; - else if ('qkx'.includes(H)) NS += 'k'; - else if ('wyjlr'.includes(H)) NS += 'a'; - else if ('sz'.includes(H)) NS += 's'; - else if (H == "d") NS += 'm'; - else if (H == "p") NS += 'f'; - else if (H == "g") NS += 'h'; - else if (isAnyPunctuationOrSpace(H) || 'aeioumnhf'.includes(H)) NS += H; - - // Accents/Latin characters - else if (isAccentedOrLatinCharacter(H)) NS += stripDiacriticsFromCharacter(H, GagEffect); - - // Cyrillic characters - if ('вфбп'.includes(H)) NS += 'фы'; - else if ('гкх'.includes(H)) NS += 'к'; - else if ('вужлр'.includes(H)) NS += 'а'; - else if ('ся'.includes(H)) NS += 'х'; - else if ('дф'.includes(H)) NS += 'м'; - else if (H == "р") NS += 'ф'; - else if (H == "г") NS += 'н'; - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, GagEffect); - - } else NS += CD.charAt(L); - } - - // Light garble, half of the letters stay the same - else if (GagEffect >= 2) { - if (!Par) { - // Regular characters - if ('ct'.includes(H)) NS += 'e'; - else if ('qkx'.includes(H)) NS += 'k'; - else if ('jlr'.includes(H)) NS += 'a'; - else if (H == "s") NS += 'z'; - else if (H == "z") NS += 's'; - else if (H == "f") NS += 'h'; - else if ('dmg'.includes(H)) NS += 'm'; - else if ('bhnvwpaeiouy'.includes(H) || isAnyPunctuationOrSpace(H)) NS += H; - - // Accents/Latin characters - else if (isAccentedOrLatinCharacter(H)) NS += stripDiacriticsFromCharacter(H, GagEffect); - - // Cyrillic characters - else if ('чц'.includes(H)) NS += 'e'; - else if ('йфв'.includes(H)) NS += 'к'; - else if ('длщя'.includes(H)) NS += 'a'; - else if (H == "з") NS += 'c'; - else if (H == "с") NS += 'з'; - else if ('дфмг'.includes(H)) NS += 'м'; - else if ('апрокенмит'.includes(H)) NS += H; - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, GagEffect); - - } else NS += CD.charAt(L); - } - - // Very Light garble, most of the letters stay the same - else if (GagEffect >= 1) { - if (!Par) { - // Regular characters - if (H == "t") NS += 'e'; - else if ('cqkx'.includes(H)) NS += 'k'; - else if ('jlr'.includes(H)) NS += 'a'; - else if ('dmg'.includes(H)) NS += 'm'; - else if ('bhnvwp'.includes(H) || isAnyPunctuationOrSpace(H) || 'aeiouyfsz'.includes(H)) NS += H; - - // Accents/Latin characters - else if (isAccentedOrLatinCharacter(H)) NS += stripDiacriticsFromCharacter(H, GagEffect); - - // Cyrillic characters - else if ('чц'.includes(H)) NS += 'e'; - else if ('йфв'.includes(H)) NS += 'к'; - else if ('длщя'.includes(H)) NS += 'a'; - else if (H == "з") NS += 'c'; - else if (H == "с") NS += 'з'; - else if ('дфмг'.includes(H)) NS += 'м'; - else if ('апрокенмит'.includes(H)) NS += H; - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, GagEffect); - - } else NS += CD.charAt(L); - } - - if (H == ")" || H == ")") Par = false; - } - - return NS; -} - -/** - * Makes the character stutter if she has a vibrating item and/or is aroused. Stuttering based on arousal is toggled in the character's settings. - * @param {Character} C - The character, whose dialog might need to be altered - * @param {string} CD - The character's dialog to alter - * @returns {string} - Returns the dialog after the stuttering factor was applied - */ -function SpeechStutter(C, CD) { - - // Validate nulls - if (CD == null) CD = ""; - - // Validates that the preferences allow stuttering - if ((C.ArousalSettings == null) || (C.ArousalSettings.AffectStutter !== "None")) { - - // Gets the factor from current arousal - var Factor = 0; - if ((C.ArousalSettings == null) || (C.ArousalSettings.AffectStutter == null) || (C.ArousalSettings.AffectStutter == "Arousal") || (C.ArousalSettings.AffectStutter == "All")) - if ((C.ArousalSettings != null) && (C.ArousalSettings.Progress != null) && (typeof C.ArousalSettings.Progress === "number") && !isNaN(C.ArousalSettings.Progress)) - Factor = Math.floor(C.ArousalSettings.Progress / 20); - - // Checks all items that "eggs" with an intensity, and replaces the factor if it's higher - if (C.IsEgged() && ((C.ArousalSettings == null) || (C.ArousalSettings.AffectStutter == null) || (C.ArousalSettings.AffectStutter == "Vibration") || (C.ArousalSettings.AffectStutter == "All"))) - for (let A = 0; A < C.Appearance.length; A++) { - var Item = C.Appearance[A]; - if (InventoryItemHasEffect(Item, "Egged", true) && Item.Property && Item.Property.Intensity && (typeof Item.Property.Intensity === "number") && !isNaN(Item.Property.Intensity) && (Item.Property.Intensity > Factor)) - Factor = Item.Property.Intensity; - } - - // If the intensity factor is lower than 1, no stuttering occurs and we return the regular text - if (Factor <= 0) return CD; - - // Loops in all letters to create a stuttering effect - var Par = false; - var CS = 1; - var Seed = CD.length; - for (let L = 0; L < CD.length; L++) { - - // Do not stutter the letters between parentheses - var H = CD.charAt(L).toLowerCase(); - if (H == "(") Par = true; - - // If we are not between brackets and at the start of a word, there's a chance to stutter that word - if (!Par && CS >= 0 && (H.match(/[[a-zа-яё]/i))) { - - // Generate a pseudo-random number using a seed, so that the same text always stutters the same way - var R = Math.sin(Seed++) * 10000; - R = R - Math.floor(R); - R = Math.floor(R * 10) + Factor; - if (CS == 1 || R >= 10) { - CD = CD.substring(0, L) + CD.charAt(L) + "-" + CD.substring(L, CD.length); - L += 2; - } - CS = -1; - } - - if (H == " ") CS = 0; - } - return CD; - - } - - // No stutter effect, we return the regular text - return CD; - -} - -/** - * Makes the character talk like a Baby when she has drunk regression milk - * @param {Character} C - The character, whose dialog needs to be altered - * @param {string} CD - The character's dialog to alter - * @returns {string} - Returns the dialog after baby talk was applied - */ -function SpeechBabyTalk(C, CD) { - if (CD == null) CD = ""; - - var Par = false; - var NS = ""; - - if (C.Effect.indexOf("RegressedTalk") >= 0) { - for (let L = 0; L < CD.length; L++) { - var H = CD.charAt(L).toLowerCase(); - if (H == "(") Par = true; - if (!Par) { - if ('kl'.includes(H)) NS += 'w'; - else if (H == "s") NS += 'sh'; - else if (H == "t") NS += 'th'; - else if (isAnyPunctuationOrSpace(H) || H.match('[a-z]')) NS += H; - // Let's do light Chinese garbling for now for ABDL. - else if (isChineseCharacter(H)) NS += doChineseGarbling(H, 1); - } else NS += CD.charAt(L); - - } - return NS; - } - - // Not drunk the milk, we return the regular text - return CD; -} diff --git a/Scripts/Text.js b/Scripts/Text.js deleted file mode 100644 index 6a3422416..000000000 --- a/Scripts/Text.js +++ /dev/null @@ -1,193 +0,0 @@ -"use strict"; - -/** @type {TextCache | null} */ -let TextScreenCache = null; -/** @type {Map} */ -const TextAllScreenCache = new Map; - -/** - * Finds the text value linked to the tag in the buffer - * @param {string} TextTag - Tag for the text to find - * @returns {string} - Returns the text associated to the tag, will return a missing tag text if the tag was not found. - */ -function TextGet(TextTag) { - return TextScreenCache ? TextScreenCache.get(TextTag) : ""; -} - -/** - * Loads the CSV text file of the current screen into the buffer. It will get the CSV from the cache if the file was already fetched from - * the server - * @param {string} [TextGroup] - Screen for which to load the CSV of - * @returns {void} - Nothing - */ -function TextLoad(TextGroup) { - - // Finds the full path of the CSV file to use cache - if ((TextGroup == null) || (TextGroup == "")) TextGroup = CurrentScreen; - const FullPath = "Screens/" + CurrentModule + "/" + TextGroup + "/Text_" + TextGroup + ".csv"; - - TextScreenCache = TextAllScreenCache.get(FullPath); - if (!TextScreenCache) { - TextScreenCache = new TextCache(FullPath, ""); - TextAllScreenCache.set(FullPath, TextScreenCache); - } -} - -/** - * Cache the Module and TextGroup for later use, speeds up first use - * @param {string} Module - * @param {string} TextGroup - */ -function TextPrefetch(Module, TextGroup) { - const FullPath = "Screens/" + Module + "/" + TextGroup + "/Text_" + TextGroup + ".csv"; - if (TextAllScreenCache.has(FullPath)) { - TextAllScreenCache.set(FullPath, new TextCache(FullPath, "MISSING VALUE FOR TAG: ")); - } -} - -/** - * A class that can be used to cache a simple key/value CSV file for easy text lookups. Text lookups will be automatically translated to - * the game's current language, if a translation is available. - */ -class TextCache { - /** - * Creates a new TextCache from the provided CSV file path. - * @param {string} path - The path to the CSV lookup file for this TextCache instance - * @param {string} [warn] - prefix for warning when key is not found - */ - constructor(path, warn = "") { - this.path = path; - this.warn = warn; - this.language = TranslationLanguage; - this.cache = {}; - this.rebuildListeners = []; - this.loaded = false; - this.buildCache(); - } - - /** - * Looks up a string from this TextCache. If the cache contains a value for the provided key and a translation is available, the return - * value will be automatically translated. Otherwise the EN string will be used. If the cache does not contain a value for the requested - * key, the key will be returned. - * @param {string} key - The text key to lookup - * @returns {string} - The text value corresponding to the provided key, translated into the current language, if available - */ - get(key) { - if (!this.loaded) return ""; - if (TranslationLanguage !== this.language) { - this.buildCache(); - } - const value = this.cache[key]; - return (value != null) ? value : (this.warn + key); - } - - /** - * Adds a callback function as a rebuild listener. Rebuild listeners will - * be called whenever the cache has completed a rebuild (either after - * initial construction, or after a language change). - * @param {Function} callback - The callback to register - * @param {boolean} [immediate] - Whether or not the callback should be called on registration - * @returns {Function} - A callback function which can be used to unsubscribe the added listener - */ - onRebuild(callback, immediate = true) { - if (typeof callback === "function") { - this.rebuildListeners.push(callback); - if (immediate) { - callback(); - } - return () => { - this.rebuildListeners = this.rebuildListeners.filter((listener) => listener !== callback); - }; - } - return CommonNoop; - } - - /** - * Kicks off a build of the text lookup cache - * @returns {void} - Nothing - */ - buildCache() { - if (!this.path) return; - this.fetchCsv() - .then((lines) => { - return this.translate(lines); - }) - .then((lines) => { - return this.cacheLines(lines); - }) - .then(() => { - this.rebuildListeners.forEach((listener) => listener(this)); - }); - } - - /** - * Fetches and parses the CSV file for this TextCache - * @returns {Promise} - A promise resolving to an array of string arrays, corresponding to lines of CSV values in the CSV - * file. - */ - fetchCsv() { - if (CommonCSVCache[this.path]) return Promise.resolve(CommonCSVCache[this.path]); - return new Promise((resolve) => { - CommonGet(this.path, (xhr) => { - if (xhr.status === 200) { - CommonCSVCache[this.path] = CommonParseCSV(xhr.responseText); - return resolve(CommonCSVCache[this.path]); - } - return Promise.resolve([]); - }); - }); - } - - /** - * Stores the contents of a CSV file in the TextCache's internal cache - * @param {string[][]} lines - An array of string arrays corresponding to lines in the CSV file - * @returns {void} - Nothing - */ - cacheLines(lines) { - lines.forEach((line) => (this.cache[line[0]] = line[1])); - this.loaded = true; - } - - /** - * Translates the contents of a CSV file into the current game language - * @param {string[][]} lines - An array of string arrays corresponding to lines in the CSV file - * @returns {Promise} - A promise resolving to an array of string arrays corresponding to lines in the CSV file with the - * values translated to the current game language - */ - translate(lines) { - this.language = TranslationLanguage; - const lang = (TranslationLanguage || "").trim().toUpperCase(); - if (!lang || lang === "EN") return Promise.resolve(lines); - - const translationPath = this.path.replace(/\/([^/]+)\.csv$/, `/$1_${lang}.txt`); - if (!TranslationAvailable(translationPath)) { - return Promise.resolve(lines); - } - - if (TranslationCache[translationPath]) { - return Promise.resolve(this.buildTranslations(lines, TranslationCache[translationPath])); - } else { - return new Promise((resolve) => { - CommonGet(translationPath, (xhr) => { - if (xhr.status === 200) { - TranslationCache[translationPath] = TranslationParseTXT(xhr.responseText); - return resolve(this.buildTranslations(lines, TranslationCache[translationPath])); - } - return resolve(lines); - }); - }); - } - } - - /** - * Maps lines of a CSV to equivalent CSV lines with values translated according to the corresponding translation file - * @param {string[][]} lines - An array of string arrays corresponding to lines in the CSV file - * @param {string[]} translations - An array of strings in translation file format (with EN and translated values on alternate lines) - * @returns {string[][]} - An array of string arrays corresponding to lines in the CSV file with the - * values translated to the current game language - */ - buildTranslations(lines, translations) { - let [translationsStringLineCache, translationsLineStringCache] = TranslationStringCachePreBuild(translations, ""); - return lines.map(line => ([line[0], TranslationStringCache(line[1], translationsStringLineCache, translationsLineStringCache)])); - } -} diff --git a/Scripts/Text.ts b/Scripts/Text.ts new file mode 100644 index 000000000..b535f5bc4 --- /dev/null +++ b/Scripts/Text.ts @@ -0,0 +1,273 @@ +let TextScreenCache: TextCache | null = null; +const TextAllScreenCache: Map = new Map(); + +/** + * Finds the text value linked to the tag in the buffer + * @param TextTag - Tag for the text to find + * @returns Returns the text associated to the tag, will return a missing tag text if the tag was not found. + */ +function TextGet(TextTag: string): string { + return TextScreenCache ? TextScreenCache.get(TextTag) : ""; +} + +/** + * Loads the CSV text file of the current screen into the buffer. It will get the CSV from the cache if the file was already fetched from + * the server + * @param TextGroup - Screen for which to load the CSV of + */ +function TextLoad(TextGroup: string = null): void { + + // Finds the full path of the CSV file to use cache + if ((TextGroup == null) || (TextGroup == "")) TextGroup = CurrentScreen; + const FullPath = "Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv"; + + TextScreenCache = TextAllScreenCache.get(FullPath); + if (!TextScreenCache) { + TextScreenCache = new TextCache(FullPath, ""); + TextAllScreenCache.set(FullPath, TextScreenCache); + } +} + +/** + * Cache the Module and TextGroup for later use, speeds up first use + */ +function TextPrefetch(Module: string, TextGroup: string): void { + const FullPath = "Screens/" + Module + "/" + TextGroup + "/Text_" + TextGroup + ".csv"; + if (TextAllScreenCache.has(FullPath)) { + TextAllScreenCache.set(FullPath, new TextCache(FullPath, "MISSING VALUE FOR TAG: ")); + } +} + +/** + * A class that can be used to cache a simple key/value CSV file for easy text lookups. Text lookups will be automatically translated to + * the game's current language, if a translation is available. + */ +class TextCache { + + private path: string; + private warn: string; + private language: string; + cache: Record; + translationcache: any; + private rebuildListeners: any[]; + private loaded: boolean; + + /** + * Creates a new TextCache from the provided CSV file path. + * @param path - The path to the CSV lookup file for this TextCache instance + * @param warn - prefix for warning when key is not found + */ + constructor(path: string, warn: string = "") { + this.path = path; + this.warn = warn; + this.language = TranslationLanguage; + this.cache = {}; + this.translationcache = {}; + this.rebuildListeners = []; + this.loaded = false; + this.buildCache(); + } + + /** + * Gets the current translation path + * @returns {string} + */ + public getPath(): string { + const lang = (TranslationLanguage || "").trim().toUpperCase(); + return this.path.replace(/\/([^/]+)\.csv$/, `/$1_${lang}.txt`); + } + + /** + * Looks up a string from this TextCache. If the cache contains a value for the provided key and a translation is available, the return + * value will be automatically translated. Otherwise the EN string will be used. If the cache does not contain a value for the requested + * key, the key will be returned. + * @param key - The text key to lookup + * @returns The text value corresponding to the provided key, translated into the current language, if available + */ + get(key: string): string { + if (!this.loaded) return ""; + if (TranslationLanguage !== this.language) { + this.buildCache(); + } + const value = this.cache[key]; + return (value != null) ? value : (this.warn + key); + } + + /** + * Adds a callback function as a rebuild listener. Rebuild listeners will + * be called whenever the cache has completed a rebuild (either after + * initial construction, or after a language change). + * @param callback - The callback to register + * @param immediate - Whether or not the callback should be called on registration + * @returns A callback function which can be used to unsubscribe the added listener + */ + onRebuild(callback: Function, immediate: boolean = true): Function { + if (typeof callback === "function") { + this.rebuildListeners.push(callback); + if (immediate) { + callback(); + } + return () => { + this.rebuildListeners = this.rebuildListeners.filter((listener) => listener !== callback); + }; + } + return CommonNoop; + } + + /** + * Kicks off a build of the text lookup cache + */ + buildCache(): void { + if (!this.path) return; + this.fetchCsv() + .then((lines) => { + return this.translate(lines); + }) + .then((lines) => { + return this.cacheLines(lines); + }) + .then(() => { + this.rebuildListeners.forEach((listener) => listener(this)); + }); + } + + /** + * Fetches and parses the CSV file for this TextCache + * @returns A promise resolving to an array of string arrays, corresponding to lines of CSV values in the CSV + * file. + */ + fetchCsv(): Promise { + if (CommonCSVCache[this.path]) return Promise.resolve(CommonCSVCache[this.path]); + return new Promise((resolve) => { + CommonGet(this.path, (xhr) => { + if (xhr.status === 200) { + CommonCSVCache[this.path] = CommonParseCSV(xhr.responseText); + return resolve(CommonCSVCache[this.path]); + } + return Promise.resolve([]); + }); + }); + } + + /** + * Stores the contents of a CSV file in the TextCache's internal cache + * @param lines - An array of string arrays corresponding to lines in the CSV file + * Update 15.12.2023 - Certain languages already have this.cache, so they are not processed + */ + cacheLines(lines: string[][]): void { + this.language = TranslationLanguage; + const lang = (TranslationLanguage || "").trim().toUpperCase(); + if (lang !== "RU") {lines.forEach((line) => (this.cache[line[0]] = line[1]));} + + let newRecord: [string, string][] = []; + for (let pair of PostTranslationRecord) { + if (this.translationcache[pair[1]]) { + this.cache[pair[0]] = this.translationcache[pair[1]] || pair[1]; + } else newRecord.push(pair); + } + PostTranslationRecord = newRecord; + this.loaded = true; + } + + /** + * Translates the contents of a CSV file into the current game language + * @param lines - An array of string arrays corresponding to lines in the CSV file + * @returns A promise resolving to an array of string arrays corresponding to lines in the CSV file with the + * values translated to the current game language + */ + translate(lines: string[][]): Promise { + this.language = TranslationLanguage; + const lang = (TranslationLanguage || "").trim().toUpperCase(); + if (!lang || lang === "EN") return Promise.resolve(lines); + + const translationPath = this.path.replace(/\/([^/]+)\.csv$/, `/$1_${lang}.txt`); + if (!TranslationAvailable(translationPath)) { + return Promise.resolve(lines); + } + + if (TranslationCache[translationPath]) { + return Promise.resolve(this.buildTranslations(lines, TranslationCache[translationPath])); + } else { + return new Promise((resolve) => { + CommonGet(translationPath, (xhr) => { + if (xhr.status === 200) { + TranslationCache[translationPath] = TranslationParseTXT(xhr.responseText); + return resolve(this.buildTranslations(lines, TranslationCache[translationPath])); + } + return resolve(lines); + }); + }); + } + } + + /** + * Maps lines of a CSV to equivalent CSV lines with values translated according to the corresponding translation file + * @param lines - An array of string arrays corresponding to lines in the CSV file + * @param translations - An array of strings in translation file format (with EN and translated values on alternate lines) + * @returns An array of string arrays corresponding to lines in the CSV file with the + * values translated to the current game language + * Update 15.12.2023 - For certain languages (current only RU), the method of transferring to direct writing to this.cache via arrays has been changed + */ + buildTranslations(lines: string[][], translations: string[]): string[][] { + this.language = TranslationLanguage; + const lang = (TranslationLanguage || "").trim().toUpperCase(); + let [translationsStringLineCache, translationsLineStringCache] = TranslationStringCachePreBuild(translations, ""); + + + if (lang === "RU") { + lines.forEach((line, numberl) => (this.cache[line[0]] = this.buildTranslationsRU(line[1], lines, translations, numberl, translationsStringLineCache))); + + for (let entry of translationsStringLineCache.entries()) { + if (!this.cache[entry[0]] && entry[1] % 2 == 0) // even only + this.translationcache[entry[0]] = translationsLineStringCache.get(entry[1] + 1); + } + return []; + } + + for (let entry of translationsStringLineCache.entries()) { + if (entry[1] % 2 == 0) // even only + this.translationcache[entry[0]] = translationsLineStringCache.get(entry[1] + 1); + } + + return lines.map(line => ([line[0], TranslationStringCache(line[1], translationsStringLineCache, translationsLineStringCache)])); + } + /** + * Translates a string to another language from the array, + * the translation is always the one right after the english line + * Works for certain languages as a replacement for TranslationStringCache + * And writes the string directly to this.cache + * @param S - The original english string to translate + * @param massiven - working array + * @param massivru - data from translation file + * @param numberl - index of lines array + * @param {Map} translationsStringLineCache + */ + buildTranslationsRU(S: string, massiven: string[][], massivru: string[], numberl: number, translationsStringLineCache): string { + if (S != null){ + let S1 = S.trim(); + if (S1 !== "") { + try { + let schet = 0; + for (let i = 0; i < numberl; i++) { + if (S1 === massiven[i][1]) {schet = schet + 1;} + } + for (let i = 0; i < (massivru.length); i++) { + if (S1 === massivru[i] && schet === 0) { + let s = massivru[i + 1]; + if (s) { + return s; + } + return S; + } else if (S1 === massivru[i] && schet > 0) { + schet = schet - 1; + } + } + } + catch (e) { + console.warn('TranslationStringCache catch:', S, translationsStringLineCache.get(S1), e); + } + } + } + return S; + } +} diff --git a/Scripts/Timer.js b/Scripts/Timer.js deleted file mode 100644 index 198ceac97..000000000 --- a/Scripts/Timer.js +++ /dev/null @@ -1,167 +0,0 @@ -"use strict"; -var CurrentTime = 0; -var TimerRunInterval = 20; -var TimerLastTime = CommonTime(); -var TimerLastCycleCall = 0; -var TimerLastArousalProgress = 0; -var TimerLastArousalProgressCount = 0; -var TimerLastArousalDecay = 0; - -/** - * Returns the current time from the local computer clock - * @returns {number} - Returns the number of milliseconds - */ -function TimerGetTime() { - return new Date().getTime(); -} - -/** - * Returns a string of the time remaining on a given timer - * @param {number} T - Time to convert to a string in ms - * @returns {string} - The time string in the DD:HH:MM:SS format (Days and hours not displayed if it contains none) - */ -function TimerToString(T) { - var D = Math.floor(T / 86400000).toString(); - var H = Math.floor((T % 86400000) / 3600000).toString(); - var M = Math.floor((T % 3600000) / 60000).toString(); - var S = Math.floor((T % 60000) / 1000).toString(); - if (S.length == 1) S = "0" + S; - if (M.length == 1) M = "0" + M; - if (H.length == 1) H = "0" + H; - return ((D != "0") ? D + ":" : "") + (((D != "0") || (H != "00")) ? H + ":" : "") + M + ":" + S; -} - -/** - * Returns a string of the time remaining on a given timer (Hours and minutes only) - * @param {Date} T - Time to convert to a string in ms - * @returns {string} - The time string in the HH:MM format - */ -function TimerHourToString(T) { - var M = T.getMinutes().toString(); - var H = T.getHours().toString(); - if (M.length == 1) M = "0" + M; - return H + ":" + M; -} - -/** - * Check if we must remove items from characters. (Expressions, items being removed, locks, etc.) - * @returns {void} - Nothing - */ -function TimerInventoryRemove() { - - // Cycles through all items items for all offline characters (player + NPC) - for (let C = 0; C < Character.length; C++) - if (Character[C].IsPlayer() || Character[C].IsNpc()) - for (let A = 0; A < Character[C].Appearance.length; A++) - if ((Character[C].Appearance[A].Property != null) && (Character[C].Appearance[A].Property.RemoveTimer != null)) - if ((typeof Character[C].Appearance[A].Property.RemoveTimer == "number") && (Character[C].Appearance[A].Property.RemoveTimer <= CurrentTime)) { - const LockName = Character[C].Appearance[A].Property.LockedBy; - const ShouldRemoveItem = Character[C].Appearance[A].Property.RemoveItem; - - // Remove any lock or timer - ValidationDeleteLock(Character[C].Appearance[A].Property, false); - - // If we're removing a lock and we're in a chatroom, send a chatroom message - if (LockName && ServerPlayerIsInChatRoom()) { - var Dictionary = [ - {Tag: "DestinationCharacterName", Text: CharacterNickname(Character[C]), MemberNumber: Character[C].MemberNumber}, - {Tag: "FocusAssetGroup", AssetGroupName: Character[C].Appearance[A].Asset.Group.Name}, - {Tag: "LockName", AssetName: LockName} - ]; - ServerSend("ChatRoomChat", {Content: "TimerRelease", Type: "Action", Dictionary}); - } - - // If we must remove the linked item from the character or the facial expression - if (ShouldRemoveItem && Character[C].Appearance[A].Asset.Group.Category === "Item") - InventoryRemove(Character[C], Character[C].Appearance[A].Asset.Group.Name); - else if (Character[C].Appearance[A].Asset.Group.AllowExpression != null) - CharacterSetFacialExpression(Character[C], Character[C].Appearance[A].Asset.Group.Name, null); - else - CharacterRefresh(Character[C]); - - return; - - } - -} - -/** - * Sets a remove timer in seconds for a specific item part / body part - * @param {Character} C - Character for which we are removing an item - * @param {string} AssetGroup - Group targeted by the removal - * @param {number} Timer - Seconds it takes to remove the item - * @returns {void} - Nothing - */ -function TimerInventoryRemoveSet(C, AssetGroup, Timer) { - for (let E = 0; E < C.Appearance.length; E++) - if (C.Appearance[E].Asset.Group.Name == AssetGroup) { - if (C.Appearance[E].Property == null) C.Appearance[E].Property = {}; - C.Appearance[E].Property.RemoveTimer = Math.round(CurrentTime + Timer * 1000); - break; - } - CharacterRefresh(C); -} - -/** - * Random trigger for the NPC owner in a private room. If possible, when triggered it will beep the player anywhere in the club, the player has 2 minutes to get back to her - * @returns {void} - Nothing - */ -function TimerPrivateOwnerBeep() { - -} - - -/** - * Main timer process - * @param {number} Timestamp - Time in ms of the time when the function was called - * @returns {void} - Nothing - */ -function TimerProcess(Timestamp) { - - // Increments the time from the last frame - TimerRunInterval = Timestamp - TimerLastTime; - TimerLastTime = Timestamp; - CurrentTime = CurrentTime + TimerRunInterval; - - // At each 1700 ms, we check for timed events (equivalent of 100 cycles at 60FPS) - if (TimerLastCycleCall + 1700 <= CommonTime()) { - TimerInventoryRemove(); - TimerPrivateOwnerBeep(); - TimerLastCycleCall = CommonTime(); - } - - if (ControllerActive == true) { - if (ControllerCurrentButton >= ControllerButtonsX.length) { - ControllerCurrentButton = 0; - } - DrawRect(MouseX - 5, MouseY - 5, 10, 10, "Cyan"); - } - - // Launches the main again for the next frame - requestAnimationFrame(MainRun); - -} - -/** - * Returns a string of the time remaining on a given timer (Hours, minutes, seconds) - * @param {number} s - Time to convert to a string in ms - * @Returns - The time string in the HH:MM:SS format - */ -function TimermsToTime(s) { - - // Pad to 2 or 3 digits, default is 2 - function pad(n, z) { - z = z || 2; - return ('00' + n).slice(-z); - } - - // Returns the formatted value - var ms = s % 1000; - s = (s - ms) / 1000; - var secs = s % 60; - s = (s - secs) / 60; - var mins = s % 60; - var hrs = (s - mins) / 60; - return pad(hrs) + ':' + pad(mins) + ':' + pad(secs); - -} diff --git a/Scripts/Translation.js b/Scripts/Translation.js deleted file mode 100644 index 37fae36be..000000000 --- a/Scripts/Translation.js +++ /dev/null @@ -1,358 +0,0 @@ -"use strict"; -var TranslationLanguage = "EN"; -var TranslationCache = {}; - -/** - * Dictionary for all supported languages and their files - * @constant - */ -var TranslationDictionary = [ - - { - LanguageCode: "EN", - LanguageName: "English", - EnglishName: "English", - Files: [ - ] - }, - { - LanguageCode: "DE", - LanguageName: "Deutsch", - EnglishName: "German", - Files: [ - "Assets/Female3DCG/Female3DCG_DE.txt", - ] - }, - { - LanguageCode: "FR", - LanguageName: "Français", - EnglishName: "French", - Files: [ - "Assets/Female3DCG/ColorGroups_FR.txt", - "Assets/Female3DCG/Female3DCG_FR.txt", - "Assets/Female3DCG/LayerNames_FR.txt", - ] - }, - { - LanguageCode: "RU", - LanguageName: "Русский", - EnglishName: "Russian", - Files: [ - "Assets/Female3DCG/Female3DCG_RU.txt", - "Assets/Female3DCG/ColorGroups_RU.txt", - "Assets/Female3DCG/LayerNames_RU.txt", - ] - }, - { - LanguageCode: "CN", - LanguageName: "中文", - EnglishName: "Chinese", - Files: [ - "Assets/Female3DCG/ColorGroups_CN.txt", - "Assets/Female3DCG/Female3DCG_CN.txt", - "Assets/Female3DCG/LayerNames_CN.txt", - "Screens/Character/Appearance/Text_Appearance_CN.txt", - "Screens/Character/BackgroundSelection/Text_BackgroundSelection_CN.txt", - "Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_CN.txt", - ] - }, - { - LanguageCode: "KR", - LanguageName: "한국어", - EnglishName: "Korean", - Files: [ - "Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_KR.txt", - ] - }, - { - LanguageCode: "JP", - LanguageName: "Japanese", - EnglishName: "Japanese", - Files: [ - "Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_JP.txt", - ] - }, - { - LanguageCode: "ES", - LanguageName: "Espanol", - EnglishName: "Spanish", - Files: [ - "Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_ES.txt", - ] - }, - -]; - -/** - * Checks if a file can be translated in the selected language - * @param {string} FullPath - Full path of the file to check for a corresponding translation file - * @returns {boolean} - Returns TRUE if a translation is available for the given file - */ -function TranslationAvailable(FullPath) { - var FileName = FullPath.trim().toUpperCase(); - for (let L = 0; L < TranslationDictionary.length; L++) - if (TranslationDictionary[L].LanguageCode == TranslationLanguage) - for (let F = 0; F < TranslationDictionary[L].Files.length; F++) - if (TranslationDictionary[L].Files[F].trim().toUpperCase() == FileName) - return true; - return false; -} - -/** - * Parse a TXT translation file and returns it as an array - * @param {string} str - Content of the translation text file - * @returns {string[]} - Array of strings with each line divided. For each translated line, the english string precedes the translated one in the array. - */ -function TranslationParseTXT(str) { - - const arr = []; - let c; - str = str.replace(/\r\n/g, '\n').trim(); - - // iterate over each character, keep track of current row (of the returned array) - for (let row = c = 0; c < str.length; c++) { - let cc = str[c]; // current character, next character - arr[row] = arr[row] || ""; // create a new row if necessary - if (cc == '\n') { ++row; continue; } // If it's a newline, move on to the next row - arr[row] += cc; // Otherwise, append the current character to the row - } - - // Removes any comment rows (starts with ###) - for (let row = arr.length - 1; row >= 0; row--) - if (arr[row].indexOf("###") == 0) { - arr.splice(row, 1); - } - - // Trims the full translated array - for (let row = 0; row < arr.length; row++) - arr[row] = arr[row].trim(); - return arr; -} - -/** - * Translates a string to another language from the array, the translation is always the one right after the english line - * @param {string} S - The original english string to translate - * @param {string[]} T - The active translation dictionary - * @param {string} CharacterName - Name of the character if it is required to replace it within the string. - * @returns {string} - The translated string - */ -function TranslationString(S, T, CharacterName) { - if ((S != null) && (S.trim() !== "")) { - S = S.trim(); - for (let P = 0; P < T.length - 1; P++) - if (S === T[P].replace("DialogCharacterName", CharacterName).replace("DialogPlayerName", CharacterNickname(Player))) - return T[P + 1].replace("DialogCharacterName", CharacterName).replace("DialogPlayerName", CharacterNickname(Player)); - } - return S; -} - -/** - * build [translationsStringLineCache, translationsLineStringCache] for TranslationStringCache - * @param {string[]} translations - An array of strings in translation file format (with EN and translated values on alternate lines) - * @param {string} CharacterName - Name of the character if it is required to replace it within the string. - * @returns {[Map, Map]} - The translated cache [translationsStringLineCache, translationsLineStringCache] - */ -function TranslationStringCachePreBuild(translations, CharacterName) { - let translationsStringLineCache = new Map(); - let translationsLineStringCache = new Map(); - // for (let P = 0; P < T.length - 1; P++) { - // if (S1 === T[P].replace("DialogCharacterName", CharacterName).replace("DialogPlayerName", CharacterNickname(Player))) - // return T[P + 1].replace("DialogCharacterName", CharacterName).replace("DialogPlayerName", CharacterNickname(Player)); - // } - translations.forEach((T, i) => { - let S = T.replace("DialogCharacterName", CharacterName).replace("DialogPlayerName", CharacterNickname(Player)); - translationsStringLineCache.set(S, i); - translationsLineStringCache.set(i, S); - }) - return [translationsStringLineCache, translationsLineStringCache]; -} - -/** - * Translates a string to another language from the array, - * the translation is always the one right after the english line - * this is the cache mode of TranslationString - * @param {string} S - The original english string to translate - * @param {Map} translationsStringLineCache - The active translation dictionary - * @param {Map} translationsLineStringCache - The active translation dictionary - * @returns {string} - The translated string - */ -function TranslationStringCache(S, translationsStringLineCache, translationsLineStringCache) { - if (S != null) { - let S1 = S.trim(); - if (S1 !== "") { - try { - let l = translationsStringLineCache.get(S1); - if (l) { - // the translation is always the one right after the english line - let s = translationsLineStringCache.get(l + 1); - if (s) { - return s; - } - console.warn('TranslationStringCache lost translationsLineStringCache:', S, l); - } - return S; - } catch (e) { - // ignore - console.warn('TranslationStringCache catch:', S, translationsStringLineCache.get(S1), e); - } - } - } - return S; -} - -/** - * Translates a character dialog from the specified array - * @param {Character} C - The character for which we need to translate the dialog array. - * @param {string[]} T - The active translation dictionary - * @returns {void} - Nothing - */ -function TranslationDialogArray(C, T) { - for (let D = 0; D < C.Dialog.length; D++) { - C.Dialog[D].Option = TranslationString(C.Dialog[D].Option, T, C.Name); - C.Dialog[D].Result = TranslationString(C.Dialog[D].Result, T, C.Name); - } -} - -/** - * Translates a set of tags. Rerenders the login message when on the login page. - * @param {Array.<{Tag: string, Value: string}>} S - Array of current tag-value pairs - * @param {string[]} T - The active translation dictionary - * @returns {void} - Nothing - */ -function TranslationTextArray(S, T) { - for (let P = 0; P < S.length; P++) - S[P].Value = TranslationString(S[P].Value, T, ""); -} - -/** - * Translate a character dialog if the file is in the dictionary - * @param {Character} C - The character for which we want to translate the dialog - * @returns {void} - Nothing - */ -function TranslationDialog(C) { - - // If we play in a foreign language - if ((TranslationLanguage != null) && (TranslationLanguage.trim() != "") && (TranslationLanguage.trim().toUpperCase() != "EN")) { - - var OnlinePlayer = C.AccountName.indexOf("Online-") >= 0; - // Finds the full path of the translation file to use - var FullPath = (OnlinePlayer ? "Screens/Online/ChatRoom/Dialog_Online" : (C.ID == 0) ? "Screens/Character/Player/Dialog_Player" : "Screens/" + CurrentModule + "/" + CurrentScreen + "/Dialog_" + C.AccountName) + "_" + TranslationLanguage + ".txt"; - - // If the translation file is already loaded, we translate from it - if (TranslationCache[FullPath]) { - TranslationDialogArray(C, TranslationCache[FullPath]); - return; - } - - // If the translation is available, we open the txt file, parse it and returns the result to build the dialog - if (TranslationAvailable(FullPath)) - CommonGet(FullPath, function() { - if (this.status == 200) { - TranslationCache[FullPath] = TranslationParseTXT(this.responseText); - TranslationDialogArray(C, TranslationCache[FullPath]); - } - }); - - } - -} - -/** - * Translate an array of tags in the current selected language - * @param {Array.<{Tag: string, Value: string}>} Text - Array of current tag-value pairs - * @returns {void} - Nothing - */ -function TranslationText(Text) { - // If we play in a foreign language - if ((TranslationLanguage != null) && (TranslationLanguage.trim() != "") && (TranslationLanguage.trim().toUpperCase() != "EN")) { - - // Finds the full path of the translation file to use - var FullPath = "Screens/" + CurrentModule + "/" + CurrentScreen + "/Text_" + CurrentScreen + "_" + TranslationLanguage + ".txt"; - - // If the translation file is already loaded, we translate from it - if (TranslationCache[FullPath]) { - TranslationTextArray(Text, TranslationCache[FullPath]); - return; - } - - // If the translation is available, we open the txt file, parse it and returns the result to build the dialog - if (TranslationAvailable(FullPath)) - CommonGet(FullPath, function() { - if (this.status == 200) { - TranslationCache[FullPath] = TranslationParseTXT(this.responseText); - TranslationTextArray(Text, TranslationCache[FullPath]); - } - }); - - } - -} - -/** - * Translates the asset group and asset descriptions based on the given dictionary - * @param {string[]} T - The active translation dictionary - * @returns {void} - Nothing - */ -function TranslationAssetProcess(T) { - for (let A = 0; A < AssetGroup.length; A++) - AssetGroup[A].Description = TranslationString(AssetGroup[A].Description, T, ""); - for (let A = 0; A < Asset.length; A++) - Asset[A].Description = TranslationString(Asset[A].Description, T, ""); -} - -/** - * Translates the description of the assets and groups of an asset family - * @param {string} Family - Name of the asset family to translate - * @returns {void} - Nothing - */ -function TranslationAsset(Family) { - - // If we play in a foreign language - if ((TranslationLanguage != null) && (TranslationLanguage.trim() != "") && (TranslationLanguage.trim().toUpperCase() != "EN")) { - - // Finds the full path of the translation file to use - var FullPath = "Assets/" + Family + "/" + Family + "_" + TranslationLanguage + ".txt"; - - // If the translation file is already loaded, we translate from it - if (TranslationCache[FullPath]) { - TranslationAssetProcess(TranslationCache[FullPath]); - return; - } - - // If the translation is available, we open the txt file, parse it and returns the result to build the dialog - if (TranslationAvailable(FullPath)) - CommonGet(FullPath, function() { - if (this.status == 200) { - TranslationCache[FullPath] = TranslationParseTXT(this.responseText); - TranslationAssetProcess(TranslationCache[FullPath]); - } - }); - - } - -} - -/** - * Changes the current language and save the new selected language to local storage - * @returns {void} - Nothing - */ -function TranslationNextLanguage() { - for (let L = 0; L < TranslationDictionary.length; L++) - if (TranslationDictionary[L].LanguageCode == TranslationLanguage) { - if (L != TranslationDictionary.length - 1) - TranslationLanguage = TranslationDictionary[L + 1].LanguageCode; - else - TranslationLanguage = TranslationDictionary[0].LanguageCode; - localStorage.setItem("BondageClubLanguage", TranslationLanguage); - return; - } -} - -/** - * Loads the previous translation language from local storage if it exists - * @returns {void} - Nothing - */ -function TranslationLoad() { - var L = localStorage.getItem("BondageClubLanguage"); - if (L != null) TranslationLanguage = L; -} diff --git a/Scripts/Translation.ts b/Scripts/Translation.ts new file mode 100644 index 000000000..04403fd94 --- /dev/null +++ b/Scripts/Translation.ts @@ -0,0 +1,361 @@ +let TranslationLanguage = "EN"; +let TranslationCache: Record = {}; + +/** + * Dictionary for all supported languages and their files + * @constant + */ +let TranslationDictionary = [ + + { + LanguageCode: "EN", + LanguageName: "English", + EnglishName: "English", + Files: [ + ] + }, + { + LanguageCode: "DE", + LanguageName: "Deutsch", + EnglishName: "German", + Files: [ + "Assets/Female3DCG/Female3DCG_DE.txt", + ] + }, + { + LanguageCode: "FR", + LanguageName: "Français", + EnglishName: "French", + Files: [ + "Assets/Female3DCG/ColorGroups_FR.txt", + "Assets/Female3DCG/Female3DCG_FR.txt", + "Assets/Female3DCG/LayerNames_FR.txt", + ] + }, + { + LanguageCode: "RU", + LanguageName: "Русский", + EnglishName: "Russian", + Files: [ + "Assets/Female3DCG/Female3DCG_RU.txt", + "Assets/Female3DCG/ColorGroups_RU.txt", + "Assets/Female3DCG/LayerNames_RU.txt", + ] + }, + { + LanguageCode: "CN", + LanguageName: "简体中文", + EnglishName: "Chinese", + Files: [ + "Assets/Female3DCG/ColorGroups_CN.txt", + "Assets/Female3DCG/Female3DCG_CN.txt", + "Assets/Female3DCG/LayerNames_CN.txt", + "Screens/Character/Appearance/Text_Appearance_CN.txt", + "Screens/Character/BackgroundSelection/Text_BackgroundSelection_CN.txt", + "Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_CN.txt", + ] + }, + { + LanguageCode: "KR", + LanguageName: "한국어", + EnglishName: "Korean", + Files: [ + "Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_KR.txt", + ] + }, + { + LanguageCode: "RU", + LanguageName: "한국어", + EnglishName: "Pусский", + Files: [ + "Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_RU.txt", + ] + }, + { + LanguageCode: "JP", + LanguageName: "日本語", + EnglishName: "Japanese", + Files: [ + "Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_JP.txt", + ] + }, + { + LanguageCode: "ES", + LanguageName: "Español", + EnglishName: "Spanish", + Files: [ + "Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon_ES.txt", + ] + }, + +]; + +/** + * Checks if a file can be translated in the selected language + * @param FullPath - Full path of the file to check for a corresponding translation file + * @returns Returns TRUE if a translation is available for the given file + */ +function TranslationAvailable(FullPath: string): boolean { + let FileName = FullPath.trim().toUpperCase(); + for (let L = 0; L < TranslationDictionary.length; L++) + if (TranslationDictionary[L].LanguageCode == TranslationLanguage) + for (let F = 0; F < TranslationDictionary[L].Files.length; F++) + if (TranslationDictionary[L].Files[F].trim().toUpperCase() == FileName) + return true; + return false; +} + +/** + * Parse a TXT translation file and returns it as an array + * @param str - Content of the translation text file + * @returns Array of strings with each line divided. For each translated line, the english string precedes the translated one in the array. + */ +function TranslationParseTXT(str: string): string[] { + + const arr = []; + let c; + str = str.replace(/\r\n/g, '\n').trim(); + + // iterate over each character, keep track of current row (of the returned array) + for (let row = c = 0; c < str.length; c++) { + let cc = str[c]; // current character, next character + arr[row] = arr[row] || ""; // create a new row if necessary + if (cc == '\n') { ++row; continue; } // If it's a newline, move on to the next row + arr[row] += cc; // Otherwise, append the current character to the row + } + + // Removes any comment rows (starts with ### or empty) + for (let row = arr.length - 1; row >= 0; row--) + if (arr[row].indexOf("###") == 0 || arr[row].length == 0) { + arr.splice(row, 1); + } + + // Trims the full translated array + for (let row = 0; row < arr.length; row++) + arr[row] = arr[row].trim(); + return arr; +} + +/** + * Translates a string to another language from the array, the translation is always the one right after the english line + * @param S - The original english string to translate + * @param T - The active translation dictionary + * @param CharacterName - Name of the character if it is required to replace it within the string. + * @returns The translated string + */ +function TranslationString(S: string, T: string[], CharacterName: string): string { + if ((S != null) && (S.trim() !== "")) { + S = S.trim(); + for (let P = 0; P < T.length - 1; P++) + if (S === T[P]) + return T[P + 1]; + } + return S; +} + +/** + * build [translationsStringLineCache, translationsLineStringCache] for TranslationStringCache + * @param translations - An array of strings in translation file format (with EN and translated values on alternate lines) + * @param CharacterName - Name of the character if it is required to replace it within the string. + * @returns The translated cache [translationsStringLineCache, translationsLineStringCache] + */ +function TranslationStringCachePreBuild(translations: string[], CharacterName: string): [Map, Map] { + let translationsStringLineCache = new Map(); + let translationsLineStringCache = new Map(); + translations.forEach((T, i) => { + let S = T; + translationsStringLineCache.set(S, i); + translationsLineStringCache.set(i, S); + }); + return [translationsStringLineCache, translationsLineStringCache]; +} + +/** + * Translates a string to another language from the array, + * the translation is always the one right after the english line + * this is the cache mode of TranslationString + * @param S - The original english string to translate + * @param translationsStringLineCache - The active translation dictionary + * @param translationsLineStringCache - The active translation dictionary + * @returns The translated string + */ +function TranslationStringCache(S: string, translationsStringLineCache: Map, translationsLineStringCache: Map): string { + if (S != null) { + let S1 = S.trim(); + if (S1 !== "") { + try { + let l = translationsStringLineCache.get(S1); + if (l) { + // the translation is always the one right after the english line + let s = translationsLineStringCache.get(l + 1); + if (s) { + return s; + } + console.warn('TranslationStringCache lost translationsLineStringCache:', S, l); + } + return S; + } catch (e) { + // ignore + console.warn('TranslationStringCache catch:', S, translationsStringLineCache.get(S1), e); + } + } + } + return S; +} + + +/** + * Translates a set of tags. Rerenders the login message when on the login page. + * @param S - Array of current tag-value pairs + * @param T - The active translation dictionary + */ +function TranslationTextArray(S: {Tag: string, Value: string}[], T: string[]): void { + for (let P = 0; P < S.length; P++) + S[P].Value = TranslationString(S[P].Value, T, ""); +} + + +/** + * Translate an array of tags in the current selected language + * @param Text - Array of current tag-value pairs + */ +function TranslationText(Text: {Tag: string, Value: string}[]): void { + // If we play in a foreign language + if ((TranslationLanguage != null) && (TranslationLanguage.trim() != "") && (TranslationLanguage.trim().toUpperCase() != "EN")) { + + // Finds the full path of the translation file to use + let FullPath = "Screens/" + CurrentModule + "/" + CurrentScreen + "/Text_" + CurrentScreen + "_" + TranslationLanguage + ".txt"; + + // If the translation file is already loaded, we translate from it + if (TranslationCache[FullPath]) { + TranslationTextArray(Text, TranslationCache[FullPath]); + return; + } + + // If the translation is available, we open the txt file, parse it and returns the result to build the dialog + if (TranslationAvailable(FullPath)) + CommonGet(FullPath, function() { + if (this.status == 200) { + TranslationCache[FullPath] = TranslationParseTXT(this.responseText); + TranslationTextArray(Text, TranslationCache[FullPath]); + } + }); + + } + +} + +/** + * Changes the current language and save the new selected language to local storage + */ +function TranslationNextLanguage(): void { + for (let L = 0; L < TranslationDictionary.length; L++) + if (TranslationDictionary[L].LanguageCode == TranslationLanguage) { + if (L != TranslationDictionary.length - 1) + TranslationLanguage = TranslationDictionary[L + 1].LanguageCode; + else + TranslationLanguage = TranslationDictionary[0].LanguageCode; + localStorage.setItem("BondageClubLanguage", TranslationLanguage); + return; + } +} + +/** + * Loads the previous translation language from local storage if it exists + */ +function TranslationLoad(): void { + let L; + if (localStorage.getItem("LanguageChange") == "1") + { + L = localStorage.getItem("BondageClubLanguage"); + } + else + { + L = GetUserPreferredLanguage(); + if (L != null) localStorage.setItem("BondageClubLanguage",L); + } + + if (L != null) TranslationLanguage = L; +} + +function GetUserPreferredLanguage() { + var languages; + try{languages = Intl.DateTimeFormat().resolvedOptions().locale.split('-');} + catch{languages = navigator.language.split('-');} + if (!languages) { + return ""; + } + + for (let i = 0; i < languages.length; i++) + { + let lang = languages[i]; + if (KDLanguages.includes(lang)) + return lang; + } + return ""; + +} +/** + * Loads an array of texts loaded from a .csv file + * @param text1 - Primary array to load - this will probably be English + * @param text2 - Secondary array to load - this is probably a translation - This part might not be working? + */ +function KDLoadTranslations(text1: string, text2: string = null) { + let parsedkeys = {}; + let parsedkeystranslation = {}; + const text1array = text1.replace(/\r\n?/g, '\n').trim().split('\n'); + text1array.forEach((line: string) => { + try { + let keyloc = line.indexOf(","); + const textkey = line.slice(0,keyloc); + let val = line.slice(keyloc+1); + // Remove quotes if the value string has commas in it. + if ((val.startsWith('"') && (val.endsWith('"'))) || ((val.startsWith("'")) && (val.endsWith("'")))) { + val = val.slice(1,-1); + } + if (textkey === null || val === undefined) { + console.log("Error while parsing line: " + line); + } + else { + parsedkeys[textkey] = val; + } + } + catch (err) { + console.log(err); + } + }) + if (text2 != null) { + const text2array = text2.replace(/\r\n?/g, '\n').trim().split('\n'); + text2array.forEach((line: string) => { + try { + let keyloc = line.indexOf(","); + const textkey = line.slice(0,keyloc); + let val = line.slice(keyloc+1); + // Remove quotes if the value string has commas in it. + if ((val.startsWith('"') && (val.endsWith('"'))) || ((val.startsWith("'")) && (val.endsWith("'")))) { + val = val.slice(1,-1); + } + if (textkey === null || val === undefined) { + console.log("Error while parsing line: " + line); + } + else { + parsedkeystranslation[textkey] = val; + } + } + catch (err) { + console.log(err); + } + }) + } + const keys = Object.keys(parsedkeys) + console.log(parsedkeys); + console.log(parsedkeystranslation); + keys.forEach((key: string) => { + if (parsedkeystranslation[key] != undefined) { + addTextKey(key, (parsedkeystranslation[key].slice('\r'))); + } + else { + addTextKey(key, (parsedkeys[key].slice('\r'))); + } + }) +} \ No newline at end of file diff --git a/Scripts/TypedItem.js b/Scripts/TypedItem.js deleted file mode 100644 index 30179011a..000000000 --- a/Scripts/TypedItem.js +++ /dev/null @@ -1,549 +0,0 @@ -"use strict"; - -/** - * TypedItem.js - * ------------ - * This file contains utilities related to typed extended items (items that allow switching between a selection of - * different states). It is generally not necessary to call functions in this file directly - these are called from - * Asset.js when an item is first registered. - * - * All dialogue for typed items should be added to `Dialog_Player.csv`. To implement a typed item, you need the - * following dialogue entries (these dialogue keys can also be configured through the item's configuration if custom - * dialogue keys are needed): - * * "Select" - This is the text that will be displayed at the top of the extended item screen - * (usually a prompt for the player to select a type) - * * For each type: - * * "" - This is the display name for the given type - * * If the item's chat setting is configured to `TO_ONLY`, you will need a chatroom message for each type, which will - * be sent when that type is selected. It should have the format "Set" (e.g. - * "ItemArmsLatexBoxtieLeotardSetPolished" - "SourceCharacter polishes the latex of DestinationCharacter leotard - * until it's shiny") - * * If the item's chat setting is configured to `FROM_TO`, you will need a chatroom message for each possible type - * pairing, which will be sent when the item's type changes from the first type to the second type. It should have - * the format "SetTo". - */ - -/** - * A lookup for the typed item configurations for each registered typed item - * @const - * @type {Record} - * @see {@link TypedItemData} - */ -const TypedItemDataLookup = {}; - -/** - * An enum encapsulating the possible chatroom message settings for typed items - * - TO_ONLY - The item has one chatroom message per type (indicating that the type has been selected) - * - FROM_TO - The item has a chatroom message for from/to type pairing - * - SILENT - The item doesn't publish an action when a type is selected. - * @type {Record<"TO_ONLY"|"FROM_TO"|"SILENT", TypedItemChatSetting>} - */ -const TypedItemChatSetting = { - TO_ONLY: "toOnly", - FROM_TO: "fromTo", - SILENT: "silent", -}; - -/** - * Registers a typed extended item. This automatically creates the item's load, draw and click functions. It will also - * generate the asset's AllowType array. - * @param {Asset} asset - The asset being registered - * @param {TypedItemConfig | undefined} config - The item's typed item configuration - * @returns {void} - Nothing - */ -function TypedItemRegister(asset, config) { - const data = TypedItemCreateTypedItemData(asset, config); - TypedItemCreateLoadFunction(data); - TypedItemCreateDrawFunction(data); - TypedItemCreateClickFunction(data); - TypedItemCreateExitFunction(data); - TypedItemCreateValidateFunction(data); - TypedItemCreatePublishFunction(data); - TypedItemCreateNpcDialogFunction(data); - TypedItemGenerateAllowType(data); - TypedItemGenerateAllowEffect(data); - TypedItemGenerateAllowBlock(data); - TypedItemGenerateAllowTint(data); - TypedItemGenerateAllowLockType(data); - TypedItemRegisterSubscreens(asset, config); -} - -/** - * Generates an asset's typed item data - * @param {Asset} asset - The asset to generate modular item data for - * @param {TypedItemConfig} config - The item's extended item configuration - * @returns {TypedItemData} - The generated typed item data for the asset - */ -function TypedItemCreateTypedItemData(asset, - { Options, Dialog, ChatTags, Dictionary, ChatSetting, DrawImages, ChangeWhenLocked, Validate, ScriptHooks } -) { - Dialog = Dialog || {}; - const key = `${asset.Group.Name}${asset.Name}`; - return TypedItemDataLookup[key] = { - asset, - options: Options, - key, - functionPrefix: `Inventory${key}`, - dialog: { - load: Dialog.Load || `${key}Select`, - typePrefix: Dialog.TypePrefix || key, - chatPrefix: Dialog.ChatPrefix || `${key}Set`, - npcPrefix: Dialog.NpcPrefix || key, - }, - chatTags: Array.isArray(ChatTags) ? ChatTags : [ - CommonChatTags.SOURCE_CHAR, - CommonChatTags.DEST_CHAR, - ], - scriptHooks: { - load: ScriptHooks ? ScriptHooks.Load : undefined, - click: ScriptHooks ? ScriptHooks.Click : undefined, - draw: ScriptHooks ? ScriptHooks.Draw : undefined, - exit: ScriptHooks ? ScriptHooks.Exit : undefined, - validate: ScriptHooks ? ScriptHooks.Validate : undefined, - }, - dictionary: Dictionary || [], - chatSetting: ChatSetting || TypedItemChatSetting.TO_ONLY, - drawImages: typeof DrawImages === "boolean" ? DrawImages : true, - changeWhenLocked: typeof ChangeWhenLocked === "boolean" ? ChangeWhenLocked : true, - validate: Validate, - }; -} - -/** - * Creates an asset's extended item load function - * @param {TypedItemData} data - The typed item data for the asset - * @returns {void} - Nothing - */ -function TypedItemCreateLoadFunction({ options, functionPrefix, dialog, scriptHooks }) { - const loadFunctionName = `${functionPrefix}Load`; - const loadFunction = function () { - ExtendedItemLoad(options, dialog.load); - }; - if (scriptHooks && scriptHooks.load) { - window[loadFunctionName] = function () { - scriptHooks.load(loadFunction); - }; - } else window[loadFunctionName] = loadFunction; -} - -/** - * Creates an asset's extended item draw function - * @param {TypedItemData} data - The typed item data for the asset - * @returns {void} - Nothing - */ -function TypedItemCreateDrawFunction({ options, functionPrefix, dialog, drawImages, scriptHooks }) { - const drawFunctionName = `${functionPrefix}Draw`; - const drawFunction = function () { - ExtendedItemDraw(options, dialog.typePrefix, null, drawImages); - }; - if (scriptHooks && scriptHooks.draw) { - window[drawFunctionName] = function () { - scriptHooks.draw(drawFunction); - }; - } else window[drawFunctionName] = drawFunction; -} - -/** - * Creates an asset's extended item click function - * @param {TypedItemData} data - The typed item data for the asset - * @returns {void} - Nothing - */ -function TypedItemCreateClickFunction({ options, functionPrefix, drawImages, scriptHooks }) { - const clickFunctionName = `${functionPrefix}Click`; - const clickFunction = function () { - ExtendedItemClick(options, null, drawImages); - }; - if (scriptHooks && scriptHooks.click) { - window[clickFunctionName] = function () { - scriptHooks.click(clickFunction); - }; - } else window[clickFunctionName] = clickFunction; -} - -/** - * Creates an asset's extended item exit function - * @param {TypedItemData} data - The typed item data for the asset - * @returns {void} - Nothing - */ -function TypedItemCreateExitFunction({ functionPrefix, scriptHooks}) { - const exitFunctionName = `${functionPrefix}Exit`; - if (scriptHooks && scriptHooks.exit) { - window[exitFunctionName] = function () { - scriptHooks.exit(); - }; - } -} - -/** - * - * @param {TypedItemData} data - The typed item data for the asset - */ -function TypedItemCreateValidateFunction({ changeWhenLocked, options, functionPrefix, validate, scriptHooks }) { - const validateFunctionName = `${functionPrefix}Validate`; - const validateFunction = function (C, item, option, currentOption) { - let message = ""; - - if (typeof validate === "function") { - message = validate(C, item, option, currentOption); - } - - return message; - }; - if (scriptHooks && scriptHooks.validate) { - window[validateFunctionName] = function (C, item, option, currentOption) { - scriptHooks.validate(validateFunction, C, item, option, currentOption); - }; - } else window[validateFunctionName] = validateFunction; -} - -/** - * Creates an asset's extended item chatroom message publishing function - * @param {TypedItemData} typedItemData - The typed item data for the asset - * @returns {void} - Nothing - */ -function TypedItemCreatePublishFunction(typedItemData) { - const { options, functionPrefix, dialog, chatSetting } = typedItemData; - if (chatSetting === TypedItemChatSetting.SILENT) return; - const publishFunctionName = `${functionPrefix}PublishAction`; - window[publishFunctionName] = function (C, newOption, previousOption) { - /** @type ExtendedItemChatData */ - const chatData = { - C, - previousOption, - newOption, - previousIndex: options.indexOf(previousOption), - newIndex: options.indexOf(newOption), - }; - - let msg = dialog.chatPrefix; - if (typeof msg === "function") { - msg = msg(chatData); - } - - if (chatSetting === TypedItemChatSetting.FROM_TO) msg += `${previousOption.Name}To`; - msg += newOption.Name; - }; -} - -/** - * Creates an asset's extended item NPC dialog function - * @param {TypedItemData} data - The typed item data for the asset - * @returns {void} - Nothing - */ -function TypedItemCreateNpcDialogFunction({ asset, functionPrefix, dialog }) { - const npcDialogFunctionName = `${functionPrefix}NpcDialog`; - window[npcDialogFunctionName] = function (C, option) { - }; -} - -/** - * Generates an asset's AllowType property based on its typed item data. - * @param {TypedItemData} data - The typed item's data - * @returns {void} - Nothing - */ -function TypedItemGenerateAllowType({ asset, options }) { - asset.AllowType = options - .map((option) => option.Property.Type) - .filter(Boolean); -} - -/** - * Generates an asset's AllowEffect property based on its typed item data. - * @param {TypedItemData} data - The typed item's data - * @returns {void} - Nothing - */ -function TypedItemGenerateAllowEffect({asset, options}) { - asset.AllowEffect = Array.isArray(asset.Effect) ? asset.Effect.slice() : []; - for (const option of options) { - CommonArrayConcatDedupe(asset.AllowEffect, option.Property.Effect); - } -} - -/** - * Generates an asset's AllowBlock property based on its typed item data. - * @param {TypedItemData} data - The typed item's data - * @returns {void} - Nothing - */ -function TypedItemGenerateAllowBlock({asset, options}) { - asset.AllowBlock = Array.isArray(asset.Block) ? asset.Block.slice() : []; - for (const option of options) { - CommonArrayConcatDedupe(asset.AllowBlock, option.Property.Block); - } -} - -/** - * Generates an asset's AllowTint property based on its typed item data. - * @param {TypedItemData} data - The typed item's data - * @returns {void} - Nothing - */ -function TypedItemGenerateAllowTint({asset, options}) { - if (asset.AllowTint) { - return; - } - for (const option of options) { - if (option.Property && Array.isArray(option.Property.Tint) && option.Property.Tint.length > 0) { - asset.AllowTint = true; - return; - } - } -} - -/** - * Generates an asset's AllowLockType property based on its typed item data. - * @param {TypedItemData} data - The typed item's data - * @returns {void} - Nothing - */ -function TypedItemGenerateAllowLockType({asset, options}) { - const allowLockType = []; - for (const option of options) { - const type = option.Property && option.Property.Type; - const allowLock = typeof option.AllowLock === "boolean" ? option.AllowLock : asset.AllowLock; - if (allowLock) { - // "" is used to represent the null type in AllowLockType arrays - allowLockType.push(type != null ? type : ""); - } - } - TypedItemSetAllowLockType(asset, allowLockType, options.length); -} - -/** - * Sets the AllowLock and AllowLockType properties on an asset based on an AllowLockType array and the total number of - * possible types. - * @param {Asset} asset - The asset to set properties on - * @param {string[]} allowLockType - The AllowLockType array indicating which of the asset's types permit locks - * @param {number} typeCount - The total number of types available on the asset - * @returns {void} - Nothing - */ -function TypedItemSetAllowLockType(asset, allowLockType, typeCount) { - if (allowLockType.length === 0) { - // If no types are allowed to lock, set AllowLock to false for quick checking - asset.AllowLock = false; - asset.AllowLockType = null; - } else if (allowLockType.length === typeCount) { - // If all types are allowed to lock, set AllowLock to true for quick checking - asset.AllowLock = true; - asset.AllowLockType = null; - } else { - // If it's somewhere in between, set an explicit AllowLockType array - asset.AllowLockType = allowLockType; - } -} - -/** - * @param {Asset} asset - The asset whose subscreen is being registered - * @param {TypedItemConfig} config - The parent item's typed item configuration - */ -function TypedItemRegisterSubscreens(asset, config) { - return config.Options - .filter(option => option.Archetype !== undefined) - .forEach((option, i, options) => { - switch (option.Archetype) { - case ExtendedArchetype.VARIABLEHEIGHT: - VariableHeightRegister(asset, /** @type {VariableHeightConfig} */(option.ArchetypeConfig), option.Property, options); - break; - } - }); -} - -/** - * Constructs the chat message dictionary for the typed item based on the items configuration data. - * @param {ExtendedItemChatData} ChatData - The chat data that triggered the message. - * @param {TypedItemData} data - The typed item data for the asset - * @returns {object[]} - The dictionary for the item based on its required chat tags - */ -function TypedItemBuildChatMessageDictionary(ChatData, { asset, chatTags, dictionary }) { - const BuiltDictionary = chatTags - .map((tag) => ExtendedItemMapChatTagToDictionaryEntry(ChatData.C, asset, tag)) - .filter(Boolean); - - dictionary.forEach(entry => BuiltDictionary.push(entry(ChatData))); - - return BuiltDictionary; -} - -/** - * Returns the options configuration array for a typed item - * @param {string} groupName - The name of the asset group - * @param {string} assetName - The name of the asset - * @returns {ExtendedItemOption[]|null} - The options array for the item, or null if no typed item data was found - */ -function TypedItemGetOptions(groupName, assetName) { - const data = TypedItemDataLookup[`${groupName}${assetName}`]; - return data ? data.options : null; -} - -/** - * Returns a list of typed item option names available for the given asset, or an empty array if the asset is not typed - * @param {string} groupName - The name of the asset group - * @param {string} assetName - The name of the asset - * @returns {string[]} - The option names available for the asset, or an empty array if the asset is not typed or no - * typed item data was found - */ -function TypedItemGetOptionNames(groupName, assetName) { - const options = TypedItemGetOptions(groupName, assetName); - return options ? options.map(option => option.Name) : []; -} - -/** - * Returns the named option configuration object for a typed item - * @param {string} groupName - The name of the asset group - * @param {string} assetName - The name of the asset - * @param {string} optionName - The name of the option - * @returns {ExtendedItemOption|null} - The named option configuration object, or null if none was found - */ -function TypedItemGetOption(groupName, assetName, optionName) { - const options = TypedItemGetOptions(groupName, assetName); - return options ? options.find(option => option.Name === optionName) : null; -} - -/** - * Validates a selected option. A typed item may provide a custom validation function. Returning a non-empty string from - * the validation function indicates that the new option is not compatible with the character's current state (generally - * due to prerequisites or other requirements). - * @param {Character} C - The character on whom the item is equipped - * @param {Item} item - The item whose options are being validated - * @param {ExtendedItemOption|ModularItemOption} option - The new option - * @param {ExtendedItemOption|ModularItemOption} previousOption - The previously applied option - * @returns {string|undefined} - undefined or an empty string if the validation passes. Otherwise, returns a string - * message informing the player of the requirements that are not met. - */ -function TypedItemValidateOption(C, item, option, previousOption) { - const validationFunctionName = `Inventory${item.Asset.Group.Name}${item.Asset.Name}Validate`; - let validationMessage = CommonCallFunctionByName(validationFunctionName, C, item, option, previousOption); - if (!validationMessage || typeof validationMessage !== "string") { - validationMessage = ExtendedItemValidate(C, item, option, previousOption); - } - return validationMessage; -} - -/** - * Sets a typed item's type and properties to the option whose name matches the provided option name parameter. - * @param {Character} C - The character on whom the item is equipped - * @param {Item|string} itemOrGroupName - The item whose type to set, or the group name for the item - * @param {string} optionName - The name of the option to set - * @param {boolean} [push] - Whether or not appearance updates should be persisted (only applies if the character is the - * player) - defaults to false. - * @returns {string|undefined} - undefined or an empty string if the type was set correctly. Otherwise, returns a string - * informing the player of the requirements that are not met. - */ -function TypedItemSetOptionByName(C, itemOrGroupName, optionName, push = false) { - const item = typeof itemOrGroupName === "string" ? InventoryGet(C, itemOrGroupName) : itemOrGroupName; - - if (!item) return; - - const assetName = item.Asset.Name; - const groupName = item.Asset.Group.Name; - const warningMessage = `Cannot set option for ${groupName}:${assetName} to ${optionName}`; - - if (item.Asset.Archetype !== ExtendedArchetype.TYPED) { - const msg = `${warningMessage}: item does not use the typed archetype`; - console.warn(msg); - return msg; - } - - const options = TypedItemGetOptions(groupName, assetName); - const option = options.find(o => o.Name === optionName); - - if (!option) { - const msg = `${warningMessage}: option "${optionName}" does not exist`; - console.warn(msg); - return msg; - } - - return TypedItemSetOption(C, item, options, option, push); -} - -/** - * Sets a typed item's type and properties to the option provided. - * @param {Character} C - The character on whom the item is equipped - * @param {Item} item - The item whose type to set - * @param {ExtendedItemOption[]} options - The typed item options for the item - * @param {ExtendedItemOption} option - The option to set - * @param {boolean} [push] - Whether or not appearance updates should be persisted (only applies if the character is the - * player) - defaults to false. - * @returns {string|undefined} - undefined or an empty string if the type was set correctly. Otherwise, returns a string - * informing the player of the requirements that are not met. - */ -function TypedItemSetOption(C, item, options, option, push = false) { - if (!item || !options || !option) return; - - const previousProperty = item.Property || options[0].Property; - const previousOption = TypedItemFindPreviousOption(item, options); - - const requirementMessage = TypedItemValidateOption(C, item, option, previousOption); - if (requirementMessage) { - return requirementMessage; - } - - // Create a new Property object based on the previous one - const newProperty = Object.assign({}, previousProperty); - // Delete properties added by the previous option - for (const key of Object.keys(previousOption.Property)) { - delete newProperty[key]; - } - // Clone the new properties and use them to extend the existing properties - Object.assign(newProperty, JSON.parse(JSON.stringify(option.Property))); - - // If the item is locked, ensure it has the "Lock" effect - if (newProperty.LockedBy && !(newProperty.Effect || []).includes("Lock")) { - newProperty.Effect = (newProperty.Effect || []); - newProperty.Effect.push("Lock"); - } - - item.Property = newProperty; - - if (!InventoryDoesItemAllowLock(item)) { - // If the new type does not permit locking, remove the lock - ValidationDeleteLock(item.Property, false); - } - - CharacterRefresh(C, push); -} - -/** - * Finds the currently set option on the given typed item - * @param {Item} item - The equipped item - * @param {ExtendedItemOption[]} options - The list of available options for the item - * @returns {ExtendedItemOption} - The option which is currently applied to the item, or the first item in the options - * array if no type is set. - */ -function TypedItemFindPreviousOption(item, options) { - const previousProperty = item.Property || options[0].Property; - const previousType = previousProperty.Type; - return options.find(o => o.Property.Type === previousType) || options[0]; -} - -/** - * Sets a typed item's type to a random option, respecting prerequisites and option validation. - * @param {Character} C - The character on whom the item is equipped - * @param {Item|string} itemOrGroupName - The item whose type to set, or the group name for the item - * @param {boolean} [push] - Whether or not appearance updates should be persisted (only applies if the character is the - * player) - defaults to false. - * @returns {string|undefined} - undefined or an empty string if the type was set correctly. Otherwise, returns a string - * informing the player of the requirements that are not met. - */ -function TypedItemSetRandomOption(C, itemOrGroupName, push = false) { - const item = typeof itemOrGroupName === "string" ? InventoryGet(C, itemOrGroupName) : itemOrGroupName; - - if (!item || item.Asset.Archetype !== ExtendedArchetype.TYPED) { - console.warn("Cannot set random option: item does not exist or does not use the typed archetype"); - return; - } - - /** @type {ExtendedItemOption[]} */ - const allOptions = TypedItemGetOptions(item.Asset.Group.Name, item.Asset.Name); - // Avoid blocked & non-random options - const availableOptions = allOptions - .filter(option => option.Random !== false) - .filter(option => !InventoryBlockedOrLimited(C, item, option.Property.Type)); - - /** @type {ExtendedItemOption} */ - let option; - if (availableOptions.length === 0) { - // If no options are available, use the null type - option = allOptions.find(O => O.Property.Type == null); - } else { - option = CommonRandomItemFromList(null, availableOptions); - } - return TypedItemSetOption(C, item, availableOptions, option, push); -} diff --git a/Scripts/Typedef.d.ts b/Scripts/Typedef.d.ts index aefa9bf05..1866e57cb 100644 --- a/Scripts/Typedef.d.ts +++ b/Scripts/Typedef.d.ts @@ -53,611 +53,10 @@ interface RGBColor { interface RGBAColor extends RGBColor { a: number; } - -type RectTuple = [number, number, number, number]; - //#endregion -//#region Enums -type ExtendedArchetype = "modular" | "typed" | "vibrating" | "variableheight"; - -type TypedItemChatSetting = "toOnly" | "fromTo" | "silent"; -type ModularItemChatSetting = "perModule" | "perOption"; -type CommonChatTags = - | "SourceCharacter" - | "DestinationCharacter" - | "DestinationCharacterName" - | "TargetCharacter" - | "TargetCharacterName" - | "AssetName"; - -type NotificationAudioType = 0 | 1 | 2; -type NotificationAlertType = 0 | 1 | 3 | 2; - -type DialogSortOrder = | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10; - -type CharacterType = "online" | "npc" | "simple"; - -type VibratorIntensity = -1 | 0 | 1 | 2 | 3; - -type VibratorModeSet = "Standard" | "Advanced"; - -type VibratorModeState = "Default" | "Deny" | "Orgasm" | "Rest"; - -type VibratorRemoteAvailability = "Available" | "NoRemote" | "NoRemoteOwnerRuleActive" | "NoLoversRemote" | "RemotesBlocked" | "CannotInteract" | "NoAccess" | "InvalidItem"; - -type EffectName = - "Freeze" | "Prone" | "Block" | "Mounted" | "KneelFreeze" | "ForceKneel" | "BlockKneel" | - - "CuffedFeet" | "CuffedLegs" | "CuffedArms" | "IsChained" | "FixedHead" | - - "Shackled" | "Tethered" | "Enclose" | "OneWayEnclose" | "OnBed" | "Lifted" | "Suspended" | - - "Slow" | "FillVulva" | "IsPlugged" | - - "Egged" | "Vibrating" | - - "Edged" | "DenialMode" | "RuinOrgasms" | - - "Remote" | "UseRemote" | "BlockRemotes" | - - "Lock" | "NotSelfPickable" | - - "Chaste" | "BreastChaste" | "ButtChaste" | - - "Leash" | "CrotchRope" | - - "ReceiveShock" | "TriggerShock" | - - "OpenPermission" | "OpenPermissionArm" | "OpenPermissionLeg" | "OpenPermissionChastity" | - - "BlockMouth" | "OpenMouth" | - - "GagVeryLight" | "GagEasy" | "GagLight" | "GagNormal" | "GagMedium" | "GagHeavy" | "GagVeryHeavy" | "GagTotal" | "GagTotal2" | - - "BlindLight" | "BlindNormal" | "BlindHeavy" | "BlindTotal" | - "BlurLight" | "BlurNormal" | "BlurHeavy" | "BlurTotal" | - "DeafLight" | "DeafNormal" | "DeafHeavy" | "DeafTotal" | - - "VR" | "VRAvatars" | "KinkyDungeonParty" | - - "LightBall" | - - "RegressedTalk" | - - "HideRestraints" | - - "Unlock-MetalPadlock" | "Unlock-OwnerPadlock" | "Unlock-OwnerTimerPadlock" | - "Unlock-LoversPadlock" | "Unlock-LoversTimerPadlock" | - "Unlock-MistressPadlock" | "Unlock-MistressTimerPadlock" | - "Unlock-PandoraPadlock" | "Unlock-MetalCuffs" | "Unlock-" | - - "ProtrudingMouth" | "Wiggling" | - "" - ; - -type AssetGroupItemName = - 'ItemAddon' | 'ItemArms' | 'ItemBoots' | 'ItemBreast' | 'ItemButt' | - 'ItemDevices' | 'ItemEars' | 'ItemFeet' | 'ItemHands' | 'ItemHead' | - 'ItemHood' | 'ItemLegs' | 'ItemMisc' | 'ItemMouth' | 'ItemMouth2' | - 'ItemMouth3' | 'ItemNeck' | 'ItemNeckAccessories' | 'ItemNeckRestraints' | - 'ItemNipples' | 'ItemNipplesPiercings' | 'ItemNose' | 'ItemPelvis' | - 'ItemTorso' | 'ItemTorso2'| 'ItemVulva' | 'ItemVulvaPiercings' | - - 'ItemHidden' /* TODO: investigate, not a real group */ - ; - -type AssetGroupBodyName = - 'Blush' | 'BodyLower' | 'BodyUpper' | 'Bra' | 'Bracelet' | 'Cloth' | - 'ClothAccessory' | 'ClothLower' | 'Corset' | 'Emoticon' | 'Eyebrows' | - 'Eyes' | 'Eyes2' | 'Fluids' | 'Garters' | 'Glasses' | 'Gloves' | - 'HairAccessory1' | 'HairAccessory2' | 'HairAccessory3' | 'HairBack' | - 'HairFront' | 'Hands' | 'Hat' | 'Head' | 'Height' | 'LeftAnklet' | 'Mask' | - 'Mouth' | 'Necklace' | 'Nipples' | 'Panties' | 'Pussy' | 'RightAnklet' | - 'Shoes' | 'Socks' | 'Suit' | 'SuitLower' | 'TailStraps' | 'Wings' - ; - -type AssetGroupName = AssetGroupBodyName | AssetGroupItemName; - -type AssetPoseName = - 'AllFours' | 'BackBoxTie' | 'BackCuffs' | 'BackElbowTouch' | 'BaseLower' | - 'BaseUpper' | 'Hogtied' | 'Horse' | 'Kneel' | 'KneelingSpread' | 'LegsClosed' | - 'LegsOpen' | 'OverTheHead' | 'Spread' | 'Suspension' | 'SuspensionHogtied' | - 'TapedHands' | 'Yoked' | - - /* FIXME: Those are pose categories */ - 'BodyUpper' | 'BodyLower' - ; - -type AssetLockType = - "CombinationPadlock" | "ExclusivePadlock" | "HighSecurityPadlock" | - "IntricatePadlock" | "LoversPadlock" | "LoversTimerPadlock" | - "MetalPadlock" | "MistressPadlock" | "MistressTimerPadlock" | - "OwnerPadlock" | "OwnerTimerPadlock" | "PandoraPadlock" | - "PasswordPadlock" | "SafewordPadlock" | "TimerPadlock" | - "TimerPasswordPadlock" - ; - -//#endregion - -//#region index.html - -/** - * Main game running state, runs the drawing - * @param {number} Timestamp - */ -declare function MainRun(Timestamp: number): void; - -/** - * When the user presses a key, we send the KeyDown event to the current screen if it can accept it - * @param {KeyboardEvent} event - */ -declare function KeyDown(event: KeyboardEvent): void; - -/** - * Handler for document-wide keydown event - * @param {KeyboardEvent} event - */ -declare function DocumentKeyDown(event: KeyboardEvent): void; - -/** - * When the user clicks, we fire the click event for other screens - * @param {MouseEvent} event - */ -declare function Click(event: MouseEvent): void; -/** - * When the user touches the screen (mobile only), we fire the click event for other screens - * @param {TouchEvent} event - */ -declare function TouchStart(event: TouchEvent): void; -/** - * When touch moves, we keep it's position for other scripts - * @param {Touch} touch - */ -declare function TouchMove(touch: Touch): void; - -/** - * When mouse move, we keep the mouse position for other scripts - * @param {MouseEvent} event - */ -declare function MouseMove(event: MouseEvent): void; - -/** - * When the mouse is away from the control, we stop keeping the coordinates, - * we also check for false positives with "relatedTarget" - * @param {MouseEvent} event - */ -declare function LoseFocus(event: MouseEvent): void; - -//#endregion - -//#region Server Messages - -interface IChatRoomGameResponse { - Data: { - KinkyDungeon: any; - OnlineBounty: any; - /* LARP */ - GameProgress?: "Start" | "Stop" | "Next" | "Skip" | "Action"; - Action?: undefined; - Target?: number; - Item?: string; - - /* MagicBattle */ - Spell?: string; - Time?: number; /* ms */ - } - Sender: number; - RNG: number -} - -//#endregion - -//#region Chat - -interface ChatRoom { - Name: string; - Description: string; - Admin: number[]; - Ban: number[]; - Limit: number; - Game: string; - Background: string; - Private: boolean; - Locked: boolean; - BlockCategory: string[]; - Language: string; - Character?: any[]; /* From server, not really a Character object */ -} - -type StimulationAction = "Kneel" | "Walk" | "Struggle" | "StruggleFail" | "Talk"; - -interface StimulationEvent { - /** The chance that this event will trigger at 0 arousal */ - Chance: number; - /** Scaling factor for chance, depending on the arousal */ - ArousalScaling?: number; - /** Scaling factor for chance, depending on the vibe intensity */ - VibeScaling?: number; - /** Scaling factor for chance, depending on the inflation amount */ - InflationScaling?: number; - /** The chance that this event will trigger when talking */ - TalkChance?: number; -} - -type MessageActionType = "Action" | "Chat" | "Whisper" | "Emote" | "Activity" | "Hidden" | - "LocalMessage" | "ServerMessage" | "Status"; - -type MessageContentType = string; - -interface ChatMessageDictionaryEntry { - [k: string]: any; - Tag?: CommonChatTags | string; - Text?: string; - MemberNumber?: number; -} - -type ChatMessageDictionary = ChatMessageDictionaryEntry[]; - -interface IChatRoomMessageBasic { - Content: MessageContentType; - Sender: number; - // SourceMemberNumber: number; -} - -interface IChatRoomMessage extends IChatRoomMessageBasic { - Type: MessageActionType; - Dictionary?: ChatMessageDictionary; - Timeout?: number; -} - -interface IChatRoomSyncBasic { - SourceMemberNumber: number -} - -interface IChatRoomSyncMessage extends IChatRoomSyncBasic, ChatRoom { } - -/** - * A metadata extractor for a given message. - * - * @param data - The chat message to extract from. - * @param sender - The character that sent the message. - * @return An object with the following keys: - * - `metadata`: an object for the extracted metadata (key/value) - * - `substitutions`: an array of [tag, substitutions] to perform on the message. - * @return null if the extraction has nothing to report. - */ -type ChatRoomMessageExtractor = - (data: IChatRoomMessage, sender: Character) => { metadata: object, substitutions: string[][] } | null; - -/** - * A chat message handler. - * - * This is used in ChatRoomMessage to perform filtering and actions on - * the recieved message. You can register one of those with - * ChatRoomRegisterMessageHandler if you need to peek at incoming messages. - * - * Message processing is done in three phases: - * - all pre-handlers are called - * - metadata extraction & tag substitutions are collected - * from the message's dictionary, then latter are applied to - * the message's contents. - * - finally, post-handlers are called. - * - * The handler's priority determines when the handler will get executed: - * - Negative values make the handler run before metadata extraction - * - Positive values make it run afterward. - * In both cases, lower values mean higher priority, so -100 handler will - * run before a -1, and a 1 handler will run before a 100. - * - * The return from the callback determines what will happen: if it's true, - * message processing will stop, making the filter act like a handler. - * If it's false, then it will continue. You can also return an object with - * a `msg` property if the handler is a transformation and wishes to update - * the message's contents inflight and/or a `skip` property if you'd like - * to cause a subsequent handler to not be called. - * - * A few notable priority values are: - * - * -200: ghosted player cutoff - * -1: default Hidden message processing (and cutoff) - * 0: emotes reformatting - * 100: sensory-deprivation processing - * 200: automatic actions on others' cutoff - * 300: sensory-deprivation cutoff. - * 500: usually output handlers. That's when audio, notifications and the - * message being added to the chat happens. - * - * Hidden messages never make it to post-processing. - * - */ -interface ChatRoomMessageHandler { - /** A short description of what the handler does. For debugging purposes */ - Description?: string; - - /** - * This handler's priority, used to determine when the code should run. - */ - Priority: number; - - /** - * Actual action to perform. - * @param data - The chat message to handle. - * @param sender - The character that sent the message. - * @param msg - The formatted string extracted from the message. - * If the handler is in "post" mode, all substitutions have been performed. - * @param metadata - The collected metadata from the message's dictionary, only available in "post" mode. - * @returns {boolean} true if the message was handled and the processing should stop, false otherwise. - */ - Callback: (data: IChatRoomMessage, sender: Character, msg: string, metadata?: any) => boolean | { msg?: string; skip?: (handler: ChatRoomMessageHandler) => boolean }; -} - -//#endregion - -//#region FriendList - -interface IFriendListBeepLogMessage { - MemberNumber?: number; /* undefined for NPCs */ - MemberName: string; - ChatRoomName?: string; - Private: boolean; - ChatRoomSpace?: string; - Sent: boolean; - Time: Date; - Message?: string; -} - -//#endregion - -//#region Assets - -type IAssetFamily = "Female3DCG"; - -interface AssetGroup { - Family: IAssetFamily; - Name: AssetGroupName; - Description: string; - Asset: Asset[]; - ParentGroupName: string; - Category: 'Appearance' | 'Item'; - IsDefault: boolean; - IsRestraint: boolean; - AllowNone: boolean; - AllowColorize: boolean; - AllowCustomize: boolean; - Random?: boolean; - ColorSchema: string[]; - ParentSize: string; - ParentColor: string; - Clothing: boolean; - Underwear: boolean; - BodyCosplay: boolean; - Hide?: string[]; - Block?: AssetGroupItemName[]; - Zone?: [number, number, number, number][]; - SetPose?: string[]; - AllowPose: string[]; - AllowExpression?: string[]; - Effect?: EffectName[]; - MirrorGroup: string; - RemoveItemOnRemove: { Group: string; Name: string; Type?: string }[]; - DrawingPriority: number; - DrawingLeft: number; - DrawingTop: number; - DrawingFullAlpha: boolean; - DrawingBlink: boolean; - InheritColor?: string; - FreezeActivePose: string[]; - PreviewZone?: RectTuple; - DynamicGroupName: AssetGroupName; - MirrorActivitiesFrom: string | null; - - /** A dict mapping colors to custom filename suffices. - The "HEX_COLOR" key is special-cased to apply to all color hex codes. */ - ColorSuffix?: { [string]: string }; -} - -/** An object defining a drawable layer of an asset */ -interface AssetLayer { - /** The name of the layer - may be null if the asset only contains a single default layer */ - Name: string | null; - /** whether or not this layer can be colored */ - AllowColorize: boolean; - /** if not null, specifies that this layer should always copy the color of the named layer */ - CopyLayerColor: string | null; - /** specifies the name of a color group that this layer belongs to. Any layers within the same color group can be colored together via the item color UI */ - ColorGroup?: string; - /** whether or not this layer can be colored in the coloring UI */ - HideColoring: boolean; - /** A list of allowed extended item types that this layer permits - the layer will only be drawn if - the item type matches one of these types. If null, the layer is considered to permit all extended types. */ - AllowTypes: string[] | null; - /** whether or not the layer has separate assets per type. If not, the extended type will not be included in - the URL when fetching the layer's image */ - HasType: boolean; - /** The name of the parent group for this layer. If null, the layer has no parent group. If - undefined, the layer inherits its parent group from it's asset/group. */ - ParentGroupName?: string | null; - /** An array of poses that this layer permits. If set, it will override the poses permitted - by the parent asset/group. */ - AllowPose: string[] | null; - /** An array of poses that this layer should be hidden for. */ - HideForPose: string[]; - /** An array of objects mapping poses to other poses to determine their draw folder */ - PoseMapping?: { [index: string]: string }; - /** The drawing priority of this layer. Inherited from the parent asset/group if not specified in the layer - definition. */ - Priority: number; - InheritColor?: string; - Alpha: AlphaDefinition[]; - /** The asset that this layer belongs to */ - Asset: Asset; - DrawingLeft?: number; - DrawingTop?: number; - HideAs?: { Group: string; Asset?: string }; - /** That layer is drawing at a fixed Y position */ - FixedPosition?: boolean; - HasImage: boolean; - Opacity: number; - MinOpacity: number; - MaxOpacity: number; - LockLayer: boolean; - MirrorExpression?: string; - AllowModuleTypes?: string[]; - /** The coloring index for this layer */ - ColorIndex: number; - /** Any group-specific alpha masks that should be applied when drawing the layer. Only available on layers that have - been created prior to drawing */ - GroupAlpha?: AlphaDefinition[]; - /** A module for which the layer can have types. */ - ModuleType: string[] | null; -} - -/** An object defining a group of alpha masks to be applied when drawing an asset layer */ -interface AlphaDefinition { - /** A list of the group names that the given alpha masks should be applied to. If empty or not present, the -alpha masks will be applied to every layer underneath the present one. */ - Group?: string[]; - /** A list of the poses that the given alpha masks should be applied to. If empty or not present, the alpha -masks will be applied regardless of character pose. */ - Pose?: string[]; - /** A list of the extended types that the given alpha masks should be applied to. If empty or not present, the alpha -masks will be applied regardless of the extended type. */ - Type?: string[]; - /** A list of alpha mask definitions. A definition is a 4-tuple of numbers defining the top left coordinate of -a rectangle and the rectangle's width and height - e.g. [left, top, width, height] */ - Masks: RectTuple[]; -} - -interface TintDefinition { - Color: number | string; - Strength: number; - DefaultColor?: string; -} - -interface ResolvedTintDefinition extends TintDefinition { - Item: Item; -} - -interface ExpressionTrigger { - Group: string; - Name: string; - Timer: number; -} - -interface Asset { - Name: string; - Description: string; - Group: AssetGroup; - ParentItem?: string; - ParentGroupName?: string | null; - Enable: boolean; - Visible: boolean; - Wear: boolean; - Activity: string | null; - AllowActivity?: string[]; - AllowActivityOn?: AssetGroupName[]; - BuyGroup?: string; - PrerequisiteBuyGroups?: string[]; - Effect?: EffectName[]; - Bonus?: string; - Block?: AssetGroupItemName[]; - Expose: string[]; - Hide?: string[]; - HideItem?: string[]; - HideItemExclude: string[]; - HideItemAttribute: string[]; - Require?: string[]; - SetPose?: string[]; - AllowPose: string[] | null; - HideForPose: string[]; - PoseMapping?: { [index: string]: string }; - AllowActivePose?: string[]; - WhitelistActivePose?: string[]; - Value: number; - Difficulty: number; - SelfBondage: number; - SelfUnlock: boolean; - ExclusiveUnlock: boolean; - Random: boolean; - RemoveAtLogin: boolean; - WearTime: number; - RemoveTime: number; - RemoveTimer: number; - MaxTimer: number; - DrawingPriority?: number; - DrawingLeft?: number; - DrawingTop?: number; - HeightModifier: number; - ZoomModifier: number; - Alpha?: AlphaDefinition[]; - Prerequisite?: string | string[]; - Extended: boolean; - AlwaysExtend: boolean; - AlwaysInteract: boolean; - AllowLock: boolean; - LayerVisibility: boolean; - IsLock: boolean; - PickDifficulty: number; - OwnerOnly: boolean; - LoverOnly: boolean; - ExpressionTrigger?: ExpressionTrigger[]; - RemoveItemOnRemove: { Name: string; Group: string; Type?: string; }[]; - AllowEffect?: EffectName[]; - AllowBlock?: AssetGroupItemName[]; - AllowType?: string[]; - DefaultColor?: ItemColor; - Opacity: number; - MinOpacity: number; - MaxOpacity: number; - Audio?: string; - Category?: string[]; - Fetish?: string[]; - CustomBlindBackground?: string; - ArousalZone: string; - IsRestraint: boolean; - BodyCosplay: boolean; - OverrideBlinking: boolean; - DialogSortOverride?: DialogSortOrder; - DynamicDescription: (C: Character) => string; - DynamicPreviewImage: (C: Character) => string; - DynamicAllowInventoryAdd: (C: Character) => boolean; - DynamicExpressionTrigger: (C: Character) => ExpressionTrigger[] | null | undefined; - DynamicName: (C: Character) => string; - DynamicGroupName: AssetGroupName; - DynamicActivity: (C: Character) => string | null | undefined; - DynamicAudio: ((C: Character) => string) | null; - CharacterRestricted: boolean; - AllowRemoveExclusive: boolean; - InheritColor?: string; - DynamicBeforeDraw: boolean; - DynamicAfterDraw: boolean; - DynamicScriptDraw: boolean; - HasType: boolean; - AllowLockType?: string[]; - AllowColorizeAll: boolean; - AvailableLocations: string[]; - OverrideHeight?: AssetOverrideHeight; - FreezeActivePose: string[]; - DrawLocks: boolean; - AllowExpression?: string[]; - MirrorExpression?: string; - FixedPosition: boolean; - Layer: AssetLayer[]; - ColorableLayerCount: number; - Archetype?: string; - Attribute: string[]; - PreviewIcons: InventoryIcon[]; - Tint: TintDefinition[]; - AllowTint: boolean; - DefaultTint?: string; - CraftGroup: string; - ColorSuffix: { [string]: string}; -} - -//#endregion /** An ItemBundle is a minified version of the normal Item */ interface ItemBundle { @@ -665,593 +64,40 @@ interface ItemBundle { Name: string; Difficulty?: number; Color?: ItemColor; - Property?: ItemProperties; - Craft?: CraftedItemProperties; + Property?: any; + Craft?: any; } /** An AppearanceBundle is whole minified appearance of a character */ type AppearanceBundle = ItemBundle[]; -interface Pose { - Name: string; - Category?: 'BodyUpper' | 'BodyLower' | 'BodyFull'; - AllowMenu?: true; - /** Only show in menu if an asset supports it */ - AllowMenuTransient?: true; - OverrideHeight?: AssetOverrideHeight; - Hide?: string[]; - MovePosition?: { Group: string; X: number; Y: number; }[]; -} - -interface Activity { - Name: string; - MaxProgress: number; - Prerequisite: string[]; - Target: string[]; - TargetSelf?: string[] | true; - /** used for setting AutoPunishGagActionFlag */ - MakeSound?: boolean; - /** An action that trigger when that activity is used */ - StimulationAction?: StimulationAction; -} - -interface LogRecord { - Name: string; - Group: string; - Value: number; -} - type ItemColor = string | string[]; /** An item is a pair of asset and its dynamic properties that define a worn asset. */ interface Item { - Asset: Asset; + Asset?: any; + Model?: Model; Color?: ItemColor; + Filters?: Record; + Properties?: Record; Difficulty?: number; - Craft?: CraftedItemProperties; - Property?: ItemProperties; -} - -interface CraftedItemProperties { - Name: string; - MemberName?: string; - MemberNumber?: number; - Description: string; - Property: string; -} - -type FavoriteIcon = "Favorite" | "FavoriteBoth" | "FavoritePlayer"; - -type InventoryIcon = FavoriteIcon | "AllowedLimited" | "Handheld" | "Locked" | "LoverOnly" | "OwnerOnly" | "Unlocked"; - -interface DialogInventoryItem extends Item { - Worn: boolean; - Icons: InventoryIcon[]; - SortOrder: string; - Hidden: boolean; - Vibrating: boolean; -} - -interface InventoryItem { - Group: string; - Name: string; - Asset: Asset; -} - -interface FavoriteState { - TargetFavorite: boolean; - PlayerFavorite: boolean; - Icon: FavoriteIcon; - UsableOrder: DialogSortOrder; - UnusableOrder: DialogSortOrder; -} - -interface Skill { - Type: string; - Level: number; - Progress: number; - Ratio?: number; -} - -interface Reputation { - Type: string; - Value: number; -} - -interface Ownership { - Name: string; - MemberNumber: number; - Stage: number; - Start: number; -} - -interface Lovership { - Name: string; - MemberNumber?: number; - Stage?: number; - Start?: number; - // Bad data sometimes received from server - BeginDatingOfferedByMemberNumber?: unknown; - BeginEngagementOfferedByMemberNumber?: unknown; - BeginWeddingOfferedByMemberNumber?: unknown; -} - -interface ScreenFunctions { - // Required - /** - * Called each frame - * @param {number} time - The current time for frame - */ - Run(time: number): void; - /** - * Called when user clicks on the canvas - * @param {MouseEvent | TouchEvent} event - The event that triggered this - */ - Click(event: MouseEvent | TouchEvent): void; - - // Optional - /** Called when screen is loaded using `CommonSetScreen` */ - Load?(): void; - /** Called when this screen is being replaced */ - Unload?(): void; - /** - * Called when screen size or position changes or after screen load - * @param {boolean} load - If the reason for call was load (`true`) or window resize (`false`) - */ - Resize?(load: boolean): void; - /** - * Called when user presses any key - * @param {KeyboardEvent} event - The event that triggered this - */ - KeyDown?(event: KeyboardEvent): void; - /** Called when user presses Esc */ - Exit?(): void; + Property?: any; } //#region Characters interface Character { ID: number; - /** Only on `Player` */ - OnlineID?: string; - Type: CharacterType; Name: string; - Nickname?: string; - AssetFamily: IAssetFamily | string; - AccountName: string; - Owner: string; - Lover: string; - Money: number; - Inventory: InventoryItem[]; Appearance: Item[]; - Stage: string; - CurrentDialog: string; - Dialog: any[]; - Reputation: Reputation[]; - Skill: Skill[]; Pose: string[]; - Effect: string[]; - Tints: ResolvedTintDefinition[]; - FocusGroup: AssetGroup | null; - Canvas: HTMLCanvasElement | null; - CanvasBlink: HTMLCanvasElement | null; - MustDraw: boolean; - BlinkFactor: number; - AllowItem: boolean; - BlockItems: any[]; - FavoriteItems: any[]; - LimitedItems: any[]; - WhiteList: number[]; + Palette: string; + HeightRatio?: number; HeightModifier: number; MemberNumber?: number; - ItemPermission?: number; - Ownership?: Ownership; - Lovership?: Lovership[]; - CanTalk: () => boolean; - CanWalk: () => boolean; - CanKneel: () => boolean; - CanInteract: () => boolean; - - /** - * Check whether a character can change its own outfit. - * - * @warning Only usable on Player - * @returns {boolean} - TRUE if changing is possible, FALSE otherwise. - */ - CanChangeOwnClothes: () => boolean; - - /** - * Check whether a character can change another one's outfit. - * - * @param {Character} C - The character to check against. - * @returns {boolean} - TRUE if changing is possible, FALSE otherwise. - */ - CanChangeClothesOn: (C: Character) => boolean; - IsProne: () => boolean; - IsRestrained: () => boolean; - IsBlind: () => boolean; - IsEnclose: () => boolean; - IsChaste: () => boolean; - IsVulvaChaste: () => boolean; - IsBreastChaste: () => boolean; - IsButtChaste: () => boolean; - IsEgged: () => boolean; - IsOwned: () => boolean; - IsOwnedByPlayer: () => boolean; - IsOwner: () => boolean; - IsKneeling: () => boolean; - IsNaked: () => boolean; - IsDeaf: () => boolean; - HasNoItem: () => boolean; - IsLoverOfPlayer: () => boolean; - GetLoversNumbers: (MembersOnly?: boolean) => (number | string)[]; - AllowedActivePose: string[]; - HiddenItems: any[]; - HeightRatio: number; - HasHiddenItems: boolean; - SavedColors: HSVColor[]; - GetBlindLevel: (eyesOnly?: boolean) => number; - GetBlurLevel: () => number; - IsLocked: () => boolean; - IsMounted: () => boolean; - IsPlugged: () => boolean; - IsShackled: () => boolean; - IsSlow: () => boolean; - IsMouthBlocked: () => boolean; - IsMouthOpen: () => boolean; - IsVulvaFull: () => boolean; - IsFixedHead: () => boolean; - IsOwnedByMemberNumber: (memberNumber: number) => boolean; - IsLover: (C: Character) => boolean; - IsLoverOfMemberNumber: (memberNumber: number) => boolean; - GetDeafLevel: () => number; - IsLoverPrivate: () => boolean; - IsEdged: () => boolean; - IsPlayer: () => this is PlayerCharacter; - IsOnline: () => boolean; - IsNpc: () => boolean; - IsSimple: () => boolean; - GetDifficulty: () => number; - IsSuspended: () => boolean; - IsInverted: () => boolean; - CanChangeToPose: (Pose: string) => boolean; - GetClumsiness: () => number; - HasEffect: (Effect: string) => boolean; - HasTints: () => boolean; - GetTints: () => RGBAColor[]; - DrawPose?: string[]; - DrawAppearance?: Item[]; - AppearanceLayers?: AssetLayer[]; - Hooks: Map> | null; - RegisterHook: (hookName: string, hookInstance: string, callback: any) => boolean | any; - UnregisterHook: (hookName: string, hookInstance: string) => boolean; - HeightRatioProportion?: number; - // Properties created in other places - ArousalSettings?: { - Active: string; - Visible: string; - ShowOtherMeter: boolean; - AffectExpression: boolean; - AffectStutter: string; - VFX: string; - VFXVibrator: string; - VFXFilter: string; - Progress: number; - ProgressTimer: number; - VibratorLevel: number; - ChangeTime: number; - Activity: any[]; - Zone: any[]; - Fetish: any[]; - OrgasmTimer?: number; - OrgasmStage?: number; - OrgasmCount?: number; - DisableAdvancedVibes: boolean; - }; - AppearanceFull?: Item[]; - // Online character properties - Title?: string; - ActivePose?: any; - LabelColor?: any; - Creation?: any; - Description?: any; - OnlineSharedSettings?: { - AllowFullWardrobeAccess: boolean; - BlockBodyCosplay: boolean; - AllowPlayerLeashing: boolean; - DisablePickingLocksOnSelf: boolean; - GameVersion: string; - ItemsAffectExpressions: boolean; - }; - Game?: { - LARP?: GameLARPParameters, - MagicBattle?: GameMagicBattleParameters, - GGTS?: GameGGTSParameters, - }; - BlackList: number[]; - RunScripts?: boolean; - HasScriptedAssets?: boolean; - Cage?: true | null; - Difficulty?: { - Level: number; - LastChange?: number; - }; - ArousalZoom?: boolean; - FixedImage?: string; - Rule?: LogRecord[]; - Status?: string | null; - StatusTimer?: number; - Crafting?: CraftingItem[]; -} - -type NPCArchetype = - /* Pandora NPCs */ - "MemberNew"|"MemberOld"|"Cosplay"|"Mistress"|"Slave"|"Maid"|"Guard"| - /* Pandora Special */ - "Victim"|"Target"|"Chest"; - -/** NPC Character extension */ -// FIXME: That one should find its way down to NPCCharacter, but -// there's too many accesses to those properties from Character -// to do so. -interface Character { - /** NPC type: Slave, Maid, etc. */ - Archetype?: NPCArchetype; - Love?: number; /** The NPC's love value */ - WillRelease?(): boolean; /** Shop NPC-only: will it release the player when asked */ -} - -/** NPC-only */ -interface NPCCharacter extends Character { - Archetype?: NPCArchetype; - Trait?: NPCTrait[]; - Event?: NPCTrait[]; - Love?: number; -} - -/** College */ -interface NPCCharacter { - GoneAway?: boolean; -} - -/** Asylum */ -interface NPCCharacter { - RunAway?: boolean; -} - -/** Sarah */ -interface Character { - OrgasmMeter?: number; - OrgasmDone?: boolean; -} - -interface KidnapCard { - Move: number; - Value?: number; -} - -/** Kidnap minigame */ -interface Character { - KidnapWillpower?: number; - KidnapMaxWillpower?: number; - KidnapCard?: KidnapCard[]; - KidnapStat?: [number, number, number, number]; -} - -/** Pandora NPCs */ -interface Character { - Recruit?: number; - RecruitOdds?: number; - RandomOdds?: number; - QuizLog?: number[]; - QuizFail?: number; - AllowMove?: boolean; - DrinkValue?: number; - TriggerIntro?: boolean; - FromPandora?: boolean; -} - -/** Magic School */ -interface Character { - House?: string; -} - -/** MovieStudio */ -interface Character { - Friendship?: string; - InterviewCleanCount?: number; -} - -/** Slave market */ -interface Character { - ExpectedTraining?: number; - CurrentTraining?: number; - TrainingIntensity?: number; - TrainingCount?: number; - TrainingCountLow?: number; - TrainingCountHigh?: number; - TrainingCountPerfect?: number; } interface PlayerCharacter extends Character { - // PreferenceInitPlayer() must be updated with defaults, when adding a new setting - ChatSettings?: { - ColorActions: boolean; - ColorActivities: boolean; - ColorEmotes: boolean; - ColorNames: boolean; - ColorTheme: string; - DisplayTimestamps: boolean; - EnterLeave: string; - FontSize: string; - MemberNumbers: string; - MuStylePoses: boolean; - ShowActivities: boolean; - ShowAutomaticMessages: boolean; - ShowBeepChat: boolean; - ShowChatHelp: boolean; - ShrinkNonDialogue: boolean; - WhiteSpace: string; - /** @deprecated */ - AutoBanBlackList?: any; - /** @deprecated */ - AutoBanGhostList?: any; - /** @deprecated */ - SearchFriendsFirst?: any; - /** @deprecated */ - DisableAnimations?: any; - /** @deprecated */ - SearchShowsFullRooms?: any; - }; - VisualSettings?: { - ForceFullHeight?: boolean; - UseCharacterInPreviews?: boolean; - MainHallBackground?: string; - PrivateRoomBackground?: string; - }; - AudioSettings?: { - Volume: number; - PlayBeeps: boolean; - /** Play items sounds in chatrooms */ - PlayItem: boolean; - /** Play sounds only if the player is involved */ - PlayItemPlayerOnly: boolean; - Notifications: boolean; - }; - ControllerSettings?: { - ControllerSensitivity: number; - ControllerDeadZone: number; - ControllerA: number; - ControllerB: number; - ControllerX: number; - ControllerY: number; - ControllerStickUpDown: number; - ControllerStickLeftRight: number; - ControllerStickRight: number; - ControllerStickDown: number; - ControllerDPadUp: number; - ControllerDPadDown: number; - ControllerDPadLeft: number; - ControllerDPadRight: number; - ControllerActive: boolean; - }; - GameplaySettings?: { - SensDepChatLog: string; - BlindDisableExamine: boolean; - DisableAutoRemoveLogin: boolean; - ImmersionLockSetting: boolean; - EnableSafeword: boolean; - DisableAutoMaid: boolean; - OfflineLockedRestrained: boolean; - }; - ImmersionSettings?: { - BlockGaggedOOC: boolean; - StimulationEvents: boolean; - ReturnToChatRoom: boolean; - ReturnToChatRoomAdmin: boolean; - SenseDepMessages: boolean; - ChatRoomMuffle: boolean; - BlindAdjacent: boolean; - AllowTints: boolean; - }; - LastChatRoom?: string; - LastChatRoomBG?: string; - LastChatRoomPrivate?: boolean; - LastChatRoomSize?: number; - LastChatRoomLanguage?: string; - LastChatRoomDesc?: string; - LastChatRoomAdmin?: any[]; - LastChatRoomBan?: any[]; - LastChatRoomBlockCategory?: string[]; - LastChatRoomTimer?: any; - RestrictionSettings?: { - BypassStruggle: boolean; - SlowImmunity: boolean; - BypassNPCPunishments: boolean; - }; - OnlineSettings?: { - AutoBanBlackList: boolean; - AutoBanGhostList: boolean; - DisableAnimations: boolean; - SearchShowsFullRooms: boolean; - SearchFriendsFirst: boolean; - SendStatus?: boolean; - ShowStatus?: boolean; - EnableAfkTimer: boolean; - }; - GraphicsSettings?: { - Font: string; - InvertRoom: boolean; - StimulationFlashes: boolean; - DoBlindFlash: boolean; - AnimationQuality: number; - StimulationFlash: boolean; - SmoothZoom: boolean; - CenterChatrooms: boolean; - AllowBlur: boolean; - } - NotificationSettings?: { - /** @deprecated */ - Audio?: boolean; - Beeps: NotificationSetting; - /** @deprecated */ - Chat?: any; - ChatMessage: NotificationSetting & { - /** @deprecated */ - IncludeActions?: any; - Mention?: boolean; - Normal?: boolean; - Whisper?: boolean; - Activity?: boolean; - }; - /** @deprecated */ - ChatActions?: any; - ChatJoin: NotificationSetting & { - /** @deprecated */ - Enabled?: any; - Owner?: boolean; - Lovers?: boolean; - Friendlist?: boolean; - Subs?: boolean; - }; - Disconnect: NotificationSetting; - Larp: NotificationSetting; - Test: NotificationSetting; - }; - GhostList?: number[]; - Wardrobe?: any[][]; - WardrobeCharacterNames?: string[]; - SavedExpressions?: ({ Group: string, CurrentExpression?: string }[] | null)[]; - SavedColors: HSVColor[]; - FriendList?: number[]; - FriendNames?: Map; - SubmissivesList?: Set; - ChatSearchFilterTerms?: string; -} - -/** Pandora Player extension */ -interface PlayerCharacter { - Infiltration?: { - Punishment?: { - Minutes: number; - Timer?: number; - Background: string; - Difficulty: number; - FightDone?: boolean; - } - Perks?: string; - } -} - -/** Kinky Dungeon Player extension */ -interface PlayerCharacter { - KinkyDungeonKeybindings?: any; - KinkyDungeonExploredLore?: any[]; -} - -interface NPCTrait { - Name: string; - Value: number; } //#endregion @@ -1264,857 +110,6 @@ interface AssetOverrideHeight { HeightRatioProportion?: number; } -/** - * Base properties for extended items - * - * Those are the properties the main game code enforces. - */ -interface ItemPropertiesBase { - Type?: string | null; - Expression?: string; - Difficulty?: number; - OverrideHeight?: AssetOverrideHeight; - HeightModifier?: number; - OverridePriority?: unknown; - DefaultColor?: string; - - Attribute?: string[]; - - AllowActivity?: string[]; - AllowActivityOn?: AssetGroupName[]; - - /** Items hidden by this one */ - HideItem?: string[]; - HideItemExclude?: string[]; - Hide?: AssetGroupName[]; - - /** The groups that this item blocks */ - Block?: AssetGroupItemName[]; - - Effect?: EffectName[]; - OverrideAssetEffect?: boolean; - - Tint?: TintDefinition[]; - - /* Pose-related properties */ - - SetPose?: AssetPoseName[]; - AllowActivePose?: AssetPoseName[]; - AllowPose?: AssetPoseName[]; - WhitelistActivePose?: AssetPoseName[]; - FreezeActivePose?: AssetPoseName[]; - - /* Vibratory-related properties */ - Mode?: VibratorMode; - Intensity?: number; - State?: VibratorModeState; -} - -/** - * Custom properties for extended items - * - * Those are properties that are asset-specific, so the handling might be done - * per-item. - */ -interface ItemPropertiesCustom { - ItemMemberNumber?: number; - - MemberNumber?: number; - - SelfUnlock?: boolean; - - //#region Lock properties - /** Asset name of the lock */ - LockedBy?: AssetLockType; - LockMemberNumber?: number | string; - /** @see BC_Asset.MaxTimer */ - RemoveTimer?: number; - /** `/^[A-Z]{1,8}$/`, Used by `PasswordPadlock`, `SafewordPadlock` and `TimerPasswordPadlock` lock */ - Password?: string; - /** Comma separated numbers */ - LockPickSeed?: string; - /** `/^[0-9]{4}$/`, Used by `CombinationPadlock` lock */ - CombinationNumber?: string; - /** Comma separated numbers; used by `HighSecurityPadlock` */ - MemberNumberListKeys?: string; - /** Used by `PasswordPadlock`, `SafewordPadlock` and `TimerPasswordPadlock` locks */ - Hint?: string; - /** Used by `PasswordPadlock`, `SafewordPadlock` and `TimerPasswordPadlock` locks; if the lock has been set with password */ - LockSet?: boolean; - /** Whether to remove item on timer lock unlock; used by `LoversTimerPadlock`, `MistressTimerPadlock`, `OwnerTimerPadlock`, `TimerPadlock`, `TimerPasswordPadlock` */ - RemoveItem?: boolean; - /** Only for `PasswordPadlock` */ - RemoveOnUnlock?: boolean; - /** Whether time is shown or "Unknown time left"; used by `LoversTimerPadlock`, `MistressTimerPadlock`, `OwnerTimerPadlock`, `TimerPasswordPadlock` */ - ShowTimer?: boolean; - /** Enable input; used by `LoversTimerPadlock`, `MistressTimerPadlock`, `OwnerTimerPadlock`, `TimerPasswordPadlock` */ - EnableRandomInput?: boolean; - /** List of people who publicly modified time on lock; used by `LoversTimerPadlock`, `MistressTimerPadlock`, `OwnerTimerPadlock`, `TimerPasswordPadlock` */ - MemberNumberList?: number[]; - //#endregion - - InflateLevel?: number; - - SuctionLevel?: number; - - /** 1st line of text for user-entered text data */ - Text?: string; - /** 2nd line of text for user-entered text data */ - Text2?: string; - - LockButt?: boolean; - - /* Futuristic Set open permissions */ - - OpenPermission?: boolean; - OpenPermissionArm?: boolean; - OpenPermissionLeg?: boolean; - OpenPermissionChastity?: boolean; - - /** The futuristic bra's heart rate value */ - HeartRate?: number; - /** Is the futuristic bra's heart icon shown */ - HeartIcon?: boolean; - - /* Futuristic gag & panel gag settings */ - AutoPunish?: number; - AutoPunishUndoTime?: number; - AutoPunishUndoTimeSetting?: number; - OriginalSetting?: "Padded" | "LightBall" | "Ball" | "Plug"; - ChatMessage?: boolean; - BlinkState?: number; - Option?: ExtendedItemOption; - - BlockRemotes?: boolean; - - /* Futuristic chastity settings */ - - PunishStruggle?: boolean; - PunishStruggleOther?: boolean; - PunishOrgasm?: boolean; - PunishStandup?: boolean; - PunishSpeech?: number; - PunishRequiredSpeech?: number; - PunishRequiredSpeechWord?: string; - PunishProhibitedSpeech?: number; - PunishProhibitedSpeechWords?: string; - NextShockTime?: number; - - PublicModeCurrent?: number; - PublicModePermission?: number; - - /** The futuristic vibrator's trigger words */ - TriggerValues?: string; - AccessMode?: string; - - /* Pleasure panties settings */ - ShockLevel?: number; - LockCrotch?: boolean; - OrgasmLock?: number; - - /** The number of inserted beads */ - InsertedBeads?: number; - - /** Whether the item displays a chat message or not */ - ShowText?: boolean; - - /** How sensitive the item is to whatever its reacting to */ - Sensitivity?: number; - - /** The asset's draw opacity */ - Opacity?: number; - - CustomBlindBackground?: string; - - /** Number of times the item was triggered; often used by shock collars */ - TriggerCount?: number; - - /** Number of times the suitcase got cracked */ - Iterations?: number; - - /** Allows reverting back to these properties on exiting an extended menu */ - Revert?: boolean; -} - -interface ItemProperties extends ItemPropertiesBase, ItemPropertiesCustom { } - -/** - * An object containing the extended item definition for an asset. - * @template Archetype, Config - */ -interface ExtendedItemAssetConfig { - /** The extended item archetype that this asset uses. */ - Archetype: Archetype; - /** The specific configuration for the item (type will vary based on the item's archetype) */ - Config?: Config; - /** The group name and asset name of a configuration to copy - useful if multiple items share the same config */ - CopyConfig?: { GroupName?: string, AssetName: string }; -} - -/** - * Valid extended item configuration types - */ -type AssetArchetypeConfig = TypedItemAssetConfig | ModularItemAssetConfig | VibratingItemAssetConfig | VariableHeightAssetConfig; - -/** - * An object containing extended item definitions for a group. - * Maps asset names within the group to their extended item configuration - * @see {@link ExtendedItemAssetConfig} - */ -type ExtendedItemGroupConfig = Record; - -/** - * An object containing extended item configurations keyed by group name. - * @see {@link ExtendedItemAssetConfig} - */ -type ExtendedItemConfig = Record; - -/** Defines a single extended item option */ -interface ExtendedItemOption { - /** The name of the type - used for the preview icon and the translation key in the CSV */ - Name: string; - /** The required bondage skill level for this option */ - BondageLevel?: number; - /** The required self-bondage skill level for this option when using it on oneself */ - SelfBondageLevel?: number; - /** The required prerequisites that must be met before this option can be selected */ - Prerequisite?: string | string[]; - /** A custom background for this option that overrides the default */ - CustomBlindBackground?: string; - /** Whether the option permits locking - if not set, defaults to the AllowLock property of the parent asset */ - AllowLock?: boolean; - /** - * Whether or not it should be possible to change from this option to another - * option while the item is locked (if set to `false`, the player must be able to unlock the item to change its type) - - * defaults to `true` - */ - ChangeWhenLocked?: boolean; - /** The Property object to be applied when this option is used */ - Property?: ItemProperties; - /** - * Trigger this expression when changing to this option - * - * FIXME: **Currently broken!** - */ - Expression?: ExpressionTrigger[]; - /** Whether or not the option should open a subscreen in the extended item menu */ - HasSubscreen?: boolean; - /** Whether or not this option can be selected randomly */ - Random?: boolean; - /** Whether or not this option can be selected by the wearer */ - AllowSelfSelect?: boolean; - /** If the option has a subscreen, this can set a particular archetype to use */ - Archetype?: ExtendedArchetype; - /** If the option has an archetype, sets the config to use */ - ArchetypeConfig?: TypedItemConfig | ModularItemConfig | VibratingItemConfig | VariableHeightConfig -} - -/** - * An object containing data about the type change that triggered the chat message - * @param {Character} C - A reference to the character wearing the item - * @param {OptionType} previousOption - The previously selected type option - * @param {OptionType} newOption - The newly selected type option - * @param {number} previousIndex - The index of the previously selected type option in the item's options - * config - * @param {number} newIndex - The index of the newly selected type option in the item's options config - * @template OptionType - */ -interface ExtendedItemChatData { - C: Character; - previousOption: OptionType; - newOption: OptionType; - previousIndex: number; - newIndex: number; -} - -/** - * @param {OptionType} chatData - An object containing data about the type change that triggered the chat message - * @returns {string} - The chat prefix that should be used for this type change - * @template OptionType - */ -type ExtendedItemChatCallback = ( - chatData: ExtendedItemChatData, -) => string; - -/** - * @param {Character} C - A reference to the character wearing the item - * @param {Item} Item - The equipped item - * @param {OptionType} Option - The newly selected option - * @param {OptionType} CurrentOption - The currently selected option - * @returns {string} - Returns a non-empty message string if the item failed validation, or an empty string otherwise - * @template OptionType - */ -type ExtendedItemValidateCallback = ( - C: Character, - Item: Item, - Option: OptionType, - CurrentOption: OptionType, -) => string; - -/** - * @param {ExtendedItemValidateCallback} - The hooked validate function - * @param {Character} C - A reference to the character wearing the item - * @param {Item} Item - The equipped item - * @param {OptionType} Option - The newly selected option - * @param {OptionType} CurrentOption - The currently selected option - * @returns {string} - Returns a non-empty message string if the item failed validation, or an empty string otherwise - * @template OptionType - */ -type ExtendedItemValidateScriptHookCallback = ( - next: ExtendedItemValidateCallback, - C: Character, - Item: Item, - Option: OptionType, - CurrentOption: OptionType, -) => string; - -//#endregion - -//#region Modular items - -/** An object containing the extended item definition for a modular asset. */ -type ModularItemAssetConfig = ExtendedItemAssetConfig<"modular", ModularItemConfig>; - -/** An object defining all of the required configuration for registering a modular item */ -interface ModularItemConfig { - /** The module definitions for the item */ - Modules: ModularItemModule[]; - /** - * The item's chatroom message setting. Determines the level of - * granularity for chatroom messages when the item's module values change. - */ - ChatSetting?: ModularItemChatSetting; - /** - * An optional array of chat tags that should be included in the dictionary of - * the chatroom message when the item's type is changed. - * Defaults to {@link CommonChatTags.SOURCE_CHAR} and {@link CommonChatTags.DEST_CHAR} - */ - ChatTags?: CommonChatTags[]; - /** - * A boolean indicating whether or not the item's type can be changed while the - * item is locked (if set to false, the player must be able to unlock the item to change its type). Defaults to `true` - */ - ChangeWhenLocked?: boolean; - /** The optional text configuration for the item. Custom text keys can be configured within this object */ - Dialog?: ModularItemDialogConfig; - /** - * A recond containing functions that are run on load, click, draw, exit, and validate, with the original archetype function - * and parameters passed on to them. If undefined, these are ignored - */ - ScriptHooks?: { - Load?: (next: () => void) => void; - Click?: (next: () => void) => void; - Draw?: (next: () => void) => void; - Exit?: () => void; - Validate?: ExtendedItemValidateScriptHookCallback; - }; -} - -interface ModularItemDialogConfig { - /** - * The key for the text that will be displayed on the base modular item screen (usually a prompt for the player to - * configure modules). Defaults to `"Select"` - */ - Select?: string; - /** - * A prefix for text keys for the display names of the item's modules. This will be suffixed with the module name to - * get the final key (i.e. `""`). Defaults to `"Module"`. - */ - ModulePrefix?: string; - /** - * A prefix for text keys for the display names of the item's options. This will be suffixed with the option key - * (i.e. `""`. The option key is the module key followed by the option's index within its - * parent module (e.g. `"a3"`). Defaults to `"Option"`. - */ - OptionPrefix?: string; - /** - * A prefix for text keys for chat messages triggered - */ - ChatPrefix?: string | ExtendedItemChatCallback; -} - -/** An object describing a single module for a modular item. */ -interface ModularItemModule { - /** The name of this module - this is usually a human-readable string describing what the - * module represents (e.g. Straps). It is used for display text keys, and should be unique across all of the modules - * for the item. - */ - Name: string; - /** The unique key for this module - this is used as a prefix to designate option names. Each - * options in the module will be named with the module's key, followed by the index of the option within the module's - * Options array. Keys should be alphabetical only (a-z, A-Z) - */ - Key: string; - /** The list of option definitions that can be chosen within this module. */ - Options: ModularItemOption[]; - /** Whether or not this module can be selected by the wearer */ - AllowSelfSelect?: boolean; -} - -/** An object describing a single option within a module for a modular item. */ -interface ModularItemOption { - /** The additional difficulty associated with this option - defaults to 0 */ - Difficulty?: number; - /** The required bondage skill level for this option */ - BondageLevel?: number; - /** The required self-bondage skill level for this option when using it on oneself */ - SelfBondageLevel?: number; - /** The required prerequisites that must be met before this option can be selected */ - Prerequisite?: string | string[]; - /** A custom background for this option that overrides the default */ - CustomBlindBackground?: string; - /** A list of groups that this option blocks - defaults to [] */ - Block?: string[]; - /** A list of groups that this option hides - defaults to [] */ - Hide?: string[]; - /** A list of items that this option hides */ - HideItem?: string[]; - /** The Property object to be applied when this option is used */ - Property?: ItemProperties; - /** Whether the option permits locking - if not set, defaults to the AllowLock property of the parent asset */ - AllowLock?: boolean; - /** - * Whether or not it should be possible to change from this option to another - * option while the item is locked (if set to `false`, the player must be able to unlock the item to change its type) - - * defaults to `true` - */ - ChangeWhenLocked?: boolean; - /** Whether or not the option should open a subscreen in the extended item menu */ - HasSubscreen?: boolean; - /** Override height, uses the highest priority of all modules*/ - OverrideHeight?: AssetOverrideHeight; - /** Whether or not this option can be selected by the wearer */ - AllowSelfSelect?: boolean; - /** Whether that option moves the character up */ - HeightModifier?: number; - /** Whether that option applies effects */ - Effect?: string[]; - /** Whether the option forces a given pose */ - SetPose?: string; - /** If set, the option changes the asset's default priority */ - OverridePriority?: number; - /** A list of activities enabled by that module */ - AllowActivity?: string[]; -} - -/** An object containing modular item configuration for an asset. Contains all of the necessary information for the - * item's load, draw & click handlers. - */ -interface ModularItemData { - /** A reference to the asset that this configuration is tied to */ - asset: Asset; - /** The item's chatroom message setting. Determines the level of - * granularity for chatroom messages when the item's module values change. - */ - chatSetting: ModularItemChatSetting; - /** - * An array of the chat message tags that should be included in the item's - * chatroom messages. Defaults to [{@link CommonChatTags.SOURCE_CHAR}, {@link CommonChatTags.DEST_CHAR}] - */ - chatTags: CommonChatTags[]; - /** The identifying key for the asset, in the format "" */ - key: string; - /** The total number of types permitted by the item */ - typeCount: number; - /** The prefix for generated functions */ - functionPrefix: string; - /** The dialogue prefix for the player prompt that is displayed on each module's menu screen */ - dialogSelectPrefix: string; - /** The dialogue prefix for the name of each module */ - dialogModulePrefix: string; - /** The dialogue prefix for the name of each option */ - dialogOptionPrefix: string; - /** The dialogue prefix that will be used for each of the item's chatroom messages */ - chatMessagePrefix: string | ExtendedItemChatCallback; - /** The module definitions for the modular item */ - modules: ModularItemModule[]; - /** Name of currently active module */ - currentModule: string; - /** A lookup for the current page in the extended item menu for each of the item's modules */ - pages: Record; - /** A lookup for the draw data for each of the item's modules */ - drawData: Record; - /** A lookup for the draw functions for each of the item's modules */ - drawFunctions: Record void>; - /** A lookup for the click functions for each of the item's modules */ - clickFunctions: Record void>; - /** - * A boolean indicating whether or not the item's type can be changed while the - * item is locked (if set to `false`, the player must be able to unlock the item to change its type). Defaults to `true` - */ - changeWhenLocked: boolean; - /** - * A recond containing functions that are run on load, click, draw, exit, and validate, with the original archetype function - * and parameters passed on to them. If undefined, these are ignored - */ - scriptHooks?: { - load?: (next: () => void) => void, - click?: (next: () => void) => void, - draw?: (next: () => void) => void, - exit?: () => void, - validate?: ExtendedItemValidateScriptHookCallback, - }; -} - -/** A 3-tuple (or 2-tuple) containing data for drawing a button in a modular item screen. A button definition takes the - * format: - * ``` - * [imageUrl, textKey, background] - * ``` - * The imageUrl is the URL for the image that should be drawn in the button. - * The textKey is the CSV key for the text that should be displayed in the button. - * The background is an optional CSS color string defining the background color for the button. - */ -type ModularItemButtonDefinition = [string, string] | [string, string, string]; - -//#endregion - -//#region Typed items - -/** An object containing the extended item definition for a modular asset. */ -type TypedItemAssetConfig = ExtendedItemAssetConfig<"typed", TypedItemConfig>; - -/** An object defining all of the required configuration for registering a typed item */ -interface TypedItemConfig { - /** The list of extended item options available for the item */ - Options: ExtendedItemOption[]; - /** The optional text configuration for the item. Custom text keys can be configured within this object */ - Dialog?: TypedItemDialogConfig; - /** - * An optional array of chat tags that should be included in the dictionary of - * the chatroom message when the item's type is changed. - * Defaults to {@link CommonChatTags.SOURCE_CHAR} and {@link CommonChatTags.DEST_CHAR} - */ - ChatTags?: CommonChatTags[]; - /** - * The chat message setting for the item. This can be provided to allow - * finer-grained chatroom message keys for the item. Defaults to {@link TypedItemChatSetting.TO_ONLY} - */ - ChatSetting?: TypedItemChatSetting; - /** A boolean indicating whether or not images should be drawn in this item's extended item menu. Defaults to `true` */ - DrawImages?: boolean; - /** - * A boolean indicating whether or not the item's type can be changed while the - * item is locked (if set to `false`, the player must be able to unlock the item to change its type). Defaults to `true` - */ - ChangeWhenLocked?: boolean; - /** - * An optional validation callback function which can be used by - * items to run additional validation for cases that aren't covered by configuration - */ - Validate?: ExtendedItemValidateCallback; - /** - * Contains custom dictionary entries in the event that the base ones do not suffice. - */ - Dictionary?: TypedItemDictionaryCallback[]; - /** - * A recond containing functions that are run on load, click, draw, exit, and validate, with the original archetype function - * and parameters passed on to them. If undefined, these are ignored - */ - ScriptHooks?: { - Load?: (next: () => void) => void, - Click?: (next: () => void) => void, - Draw?: (next: () => void) => void, - Exit?: () => void, - Validate?: ExtendedItemValidateScriptHookCallback, - }; -} - -interface TypedItemDialogConfig { - /** - * The key for the text that will be displayed at the top of the extended item screen - * (usually a prompt for the player to select a type). Defaults to `"Select"` - */ - Load?: string; - /** - * A prefix for text keys for the display names of the item's individual types. This - * will be suffixed with the option name to get the final key (i.e. `""`). Defaults to - * `""` - */ - TypePrefix?: string; - /** - * A prefix for text keys for chat messages triggered by the item. Chat message keys - * will include the name of the new option, and depending on the chat setting, the name of the previous option: - * - For chat setting `FROM_TO`: `To` - * - For chat setting `TO_ONLY`: `` - * Defaults to `"Set"` - */ - ChatPrefix?: string | ExtendedItemChatCallback; - /** - * A prefix for text keys for NPC dialog. This will be suffixed with the option name - * to get the final NPC dialogue key (i.e. `""`. Defaults to `""` - */ - NpcPrefix?: string; -} - -/** - * An object containing typed item configuration for an asset. Contains all of the necessary information for the item's - * load, draw & click handlers. - */ -interface TypedItemData { - /** The asset reference */ - asset: Asset; - /** The list of extended item options available for the item */ - options: ExtendedItemOption[]; - /** A key uniquely identifying the asset */ - key: string; - /** The common prefix used for all extended item functions associated with the asset */ - functionPrefix: string; - /** A record containing various dialog keys used by the extended item screen */ - dialog: { - /** The dialog key for the item's load text (usually a prompt to select the type) */ - load: string; - /** The prefix used for dialog keys representing the display names of the item's types */ - typePrefix: string; - /** The prefix used for dialog keys representing the item's chatroom messages when its type is changed */ - chatPrefix: string | ExtendedItemChatCallback; - /** The prefix used for dialog keys representing an NPC's reactions to item type changes */ - npcPrefix: string; - }; - /** - * An array of the chat message tags that should be included in the item's - * chatroom messages. Defaults to [{@link CommonChatTags.SOURCE_CHAR}, {@link CommonChatTags.DEST_CHAR}] - */ - chatTags: CommonChatTags[]; - /** - * Contains custom dictionary entries in the event that the base ones do not suffice. - */ - dictionary?: TypedItemDictionaryCallback[]; - /** - * The chat message setting for the item. This can be provided to allow - * finer-grained chatroom message keys for the item. Defaults to {@link TypedItemChatSetting.TO_ONLY} - */ - chatSetting?: TypedItemChatSetting; - /** A boolean indicating whether or not images should be drawn in this item's extended item menu. Defaults to `true` */ - drawImages?: boolean; - /** - * A boolean indicating whether or not the item's type can be changed while the - * item is locked (if set to false, the player must be able to unlock the item to change its type). Defaults to `true` - */ - changeWhenLocked?: boolean; - /** - * An optional validation callback function which can be used by - * items to run additional validation for cases that aren't covered by configuration - */ - validate?: ExtendedItemValidateCallback; - /** - * A recond containing functions that are run on load, click, draw, exit, and validate, with the original archetype function - * and parameters passed on to them. If undefined, these are ignored - */ - scriptHooks?: { - load?: (next: () => void) => void, - click?: (next: () => void) => void, - draw?: (next: () => void) => void, - exit?: () => void, - validate?: ExtendedItemValidateScriptHookCallback, - }; -} - -/** - * @param {object} chatData - An object containing data about the type change that triggered the chat message - * @param {Character} chatData.C - A reference to the character wearing the item - * @param {ExtendedItemOption} chatData.previousOption - The previously selected type option - * @param {ExtendedItemOption} chatData.newOption - The newly selected type option - * @param {number} chatData.previousIndex - The index of the previously selected type option in the item's options - * config - * @param {number} chatData.newIndex - The index of the newly selected type option in the item's options config - * @returns {[{ Tag: string, Text: string }]} - The dictionary entry to append to the dictionary. - */ -type TypedItemDictionaryCallback = ( - chatData: ExtendedItemChatData -) => { Tag: string, Text: string }; - -/** - * A parameter object containing information used to validate and sanitize character appearance update diffs. An - * appearance update has a source character (the player that sent the update) and a target character (the character - * being updated). What is allowed in an update varies depending on the status of the target character in relation to - * the source character (i.e. whether they are the target's lover/owner, or the target themselves, and also whether or - * not they have been whitelisted by the target). - */ -interface AppearanceUpdateParameters { - /** The character whose appearance is being updated */ - C: Character; - /** Whether or not the source player is the same as the target player */ - fromSelf: boolean; - /** - * Whether or not the source player has permissions to use owner-only items (i.e. they are either the target - * themselves, or the target's owner) - */ - fromOwner: boolean; - /** - * Whether or not the source player has permissions to use lover-only items (i.e. they are the target themselves, - * one of the target's lovers, or the target's owner, provided the target's lover rules permit their owner using - * lover-only items) - */ - fromLover: boolean; - /** The member number of the source player */ - sourceMemberNumber: number; -} - -/** - * A wrapper object containing the results of a diff resolution. This includes the final item that the diff resolved to - * (or null if the diff resulted in no item, for example in the case of item removal), along with a valid flag which - * indicates whether or not the diff was fully valid or not. - */ -interface ItemDiffResolution { - /** - * The resulting item after resolution of the item diff, or null if the diff resulted in no item being equipped in - * the given group - */ - item: Item | null; - /** - * Whether or not the diff was fully valid. In most cases, an invalid diff will result in the whole appearance - * update being rolled back, but in some cases the change will be accepted, but some properties may be modified to - * keep the resulting item valid - in both situations, the valid flag will be returned as false, indicating that a - * remedial appearance update should be made by the target player. - */ - valid: boolean; -} - -/** - * A wrapper object containing the results of an appearance validation. Contains a sanitized appearance array and a - * valid flag which indicates whether or not the appearance was fully valid or not. - */ -interface AppearanceValidationWrapper { - /** The resulting appearance after validation */ - appearance: Item[]; - /** - * Whether or not the appearance was valid. A value of false indicates that the appearance has been modified, and a - * remedial appearance update should be made by the target player. - */ - valid: boolean; -} - -//#endregion - -//#region Vibrating Items - -/** An object containing the extended item definition for a vibrating asset. */ -type VibratingItemAssetConfig = ExtendedItemAssetConfig<"vibrating", VibratingItemConfig>; - -/** An object defining all of the required configuration for registering a vibrator item */ -interface VibratingItemConfig { - /** The list of vibrator mode sets that are available on this item */ - Options?: VibratorModeSet[]; -} - -interface VibratingItemData { - /** A key uniquely identifying the asset */ - key: string; - /** The asset reference */ - asset: Asset; - /** The list of extended item options available for the item */ - options: VibratorModeSet[]; - /** The common prefix used for all extended item screen functions associated with the asset */ - functionPrefix: string; - /** The common prefix used for all dynamic asset hook functions for the asset */ - dynamicAssetsFunctionPrefix: string; -} - -/** - * A wrapper object defining a vibrator state and intensity - */ -interface StateAndIntensity { - /** The vibrator state */ - State: VibratorModeState; - /** The vibrator intensity */ - Intensity: VibratorIntensity; -} - -//#endregion - -//#region Variable Height items - -/** An object containing the extended item definition for a variable height asset. */ -type VariableHeightAssetConfig = ExtendedItemAssetConfig<"variableheight", VariableHeightConfig>; - -interface VariableHeightConfig { - /** The highest Y co-ordinate that can be set */ - MaxHeight: number; - /** The lowest Y co-ordinate that can be set */ - MinHeight: number; - /** Settings for the range input element the user can use to change the height */ - Slider: VariableHeightSliderConfig; - /** A record containing various dialog keys used by the extended item screen */ - Dialog: VariableHeightDialogConfig; - /** - * An array of the chat message tags that should be included in the item's - * chatroom messages. Defaults to [{@link CommonChatTags.SOURCE_CHAR}, {@link CommonChatTags.DEST_CHAR}] - */ - ChatTags?: CommonChatTags[]; - /** The function that handles finding the current variable height setting */ - GetHeightFunction?: Function; - /** The function that handles applying the height setting to the character */ - SetHeightFunction?: Function; - /** The default properties for the item, if not provided from an extended item option */ - Property?: ItemProperties; -} - -interface VariableHeightSliderConfig { - /** The name of a supported thumbnail image in \CSS\Styles.css that will show the current position on the slider */ - Icon: string; - /** The Y co-ordinate of the topmost point of the slider */ - Top: number; - /** The height in pixels of the slider */ - Height: number; -} - -interface VariableHeightDialogConfig { - /** - * A prefix for text keys for chat messages triggered by the item. Chat message keys - * will include the name of the new option, and depending on the chat setting, the name of the previous option: - * - For chat setting `FROM_TO`: `To` - * - For chat setting `TO_ONLY`: `` - * Defaults to `"Set"` - */ - ChatPrefix?: string | ExtendedItemChatCallback; - /** - * A prefix for text keys for NPC dialog. This will be suffixed with the option name - * to get the final NPC dialogue key (i.e. `""`. Defaults to `""` - */ - NpcPrefix?: string; -} - -/** - * An object containing typed item configuration for an asset. Contains all of the necessary information for the item's - * load, draw & click handlers. - */ -interface VariableHeightData { - /** The asset reference */ - asset: Asset; - /** A key uniquely identifying the asset */ - key: string; - /** The common prefix used for all extended item functions associated with the asset */ - functionPrefix: string; - /** The highest Y co-ordinate that can be set */ - maxHeight: number; - /** The lowest Y co-ordinate that can be set */ - minHeight: number; - /** Settings for the range input element the user can use to change the height */ - slider: VariableHeightSliderConfig; - /** The initial property to apply */ - defaultProperty: ItemProperties; - /** A record containing various dialog keys used by the extended item screen */ - dialog: { - /** The prefix used for dialog keys representing the item's chatroom messages when its type is changed */ - chatPrefix: string | ExtendedItemChatCallback; - /** The prefix used for dialog keys representing an NPC's reactions to item type changes */ - npcPrefix: string; - }; - /** - * An array of the chat message tags that should be included in the item's - * chatroom messages. Defaults to [{@link CommonChatTags.SOURCE_CHAR}, {@link CommonChatTags.DEST_CHAR}] - */ - chatTags: CommonChatTags[]; - /** The function that handles finding the current variable height setting */ - getHeight: Function; - /** The function that handles applying the height setting to the character */ - setHeight: Function; - /** The list of extended item options the current option was selected from, if applicable */ - parentOptions: ExtendedItemOption[]; -} - -//#endregion type Optional = Omit & Partial>; @@ -2128,74 +123,6 @@ interface ICommand { Clear?: false; } -type PokerPlayerType = "None" | "Set" | "Character"; -type PokerPlayerFamily = "None" | "Player"; - -interface PokerPlayer { - Type: PokerPlayerType; - Family: PokerPlayerFamily; - Name: string; - Chip: number; - - /* Runtime values */ - Difficulty?: number; - Hand?: any[]; - HandValue?: number; - Cloth?: Item; - ClothLower?: Item; - ClothAccessory?: Item; - Panties?: Item; - Bra?: Item; - Character?: Character; - Data?: { - cache: Record; - }; - Image?: void; - TextColor?: string; - TextSingle?: string; - TextMultiple?: string; - WebLink?: string; - Alternate?: void; -} - -// #region Online Games - -/** - * Online game status values. - * - * @property "" - The game is in the setup phase. - * @property "Running" - The game is currently running. - * - * @fix FIXME: "" should really be renamed Setup - */ -type OnlineGameStatus = "" | "Running"; - -interface GameLARPParameters { - Status: OnlineGameStatus; - Class: string; - Team: string; - TimerDelay: number; - Level: { - Name: string; - Level: number; - Progress: number; - }[]; -} - -interface GameMagicBattleParameters { - Status: OnlineGameStatus; - House: string; - TeamType: "FreeForAll" | "House"; -} - -interface GameGGTSParameters { - Level: number; - Time: number; - Strike: number; - Rule: string[]; -} - -// #endregion // #region Audio @@ -2209,230 +136,8 @@ interface AudioEffect { File: string | string[]; } -/** - * Sound effect detector for chat messages. - */ -interface AudioChatAction { - /** Is that action applicable for that chat message? */ - IsAction: (data: IChatRoomMessage) => boolean; - - /** Extracts the actual sound effect from the chat message */ - GetSoundEffect: (data: IChatRoomMessage) => (AudioSoundEffect | string | null); -} - -// #endregion - -// #region Character drawing - -/** - * A callback function used for clearing a rectangular area of a canvas - * @param {number} x - The x coordinate of the left of the rectangle to clear - * @param {number} y - The y coordinate of the top of the rectangle to clear - * @param {number} w - The width of the rectangle to clear - * @param {number} h - The height of the rectangle to clear - */ -type ClearRectCallback = (x: number, y: number, w: number, h: number) => void; - -/** - * A callback function used to draw a canvas on a canvas - * @param {HTMLImageElement | HTMLCanvasElement} Img - The canvas to draw - * @param {number} x - The x coordinate to draw the canvas at - * @param {number} y - The y coordinate to draw the canvas at - */ -type DrawCanvasCallback = ( - img: HTMLImageElement | HTMLCanvasElement, - x: number, - y: number, - alphaMasks?: RectTuple[], -) => void; - -/** - * A callback function used to draw an image to a canvas - * @param {string} src - The URL of the image to draw - * @param {number} x - The x coordinate to draw the image at - * @param {number} y - The y coordinate to draw the image at - * @param {RectTuple[]} [alphaMasks] - A list of alpha masks to apply to the image when drawing - * @param {number} [opacity=1] - The opacity at which to draw the image with - * @param {boolean} [rotate=false] - If the image should be rotated by 180 degrees - */ -type DrawImageCallback = ( - src: string, - x: number, - y: number, - alphasMasks: RectTuple[], - opacity?: number, - rotate?: boolean, -) => void; - -/** - * A callback function used to draw a colorized image to a canvas - * @callback drawImageColorize - * @param {string} src - The URL of the image to draw - * @param {number} x - The x coordinate to draw the image at - * @param {number} y - The y coordinate to draw the image at - * @param {string} color - The color to apply to the image - * @param {boolean} fullAlpha - Whether or not to apply color to the entire image - * @param {RectTuple[]} [alphaMasks] - A list of alpha masks to apply to the image when drawing - * @param {number} [opacity=1] - The opacity at which to draw the image with - * @param {boolean} [rotate=false] - If the image should be rotated by 180 degrees - */ -type DrawImageColorizeCallback = ( - src: string, - x: number, - y: number, - color: string, - fullAlpha: boolean, - alphaMasks?: RectTuple[], - opacity?: number, - rotate?: boolean, -) => void; - -interface CommonDrawCallbacks { - /** - * A callback to clear an area of the main character canvas - */ - clearRect: ClearRectCallback; - /** - * A callback to clear an area of the blink character canvas - */ - clearRectBlink: ClearRectCallback; - /** - * Function used to draw a canvas on top of the normal canvas - */ - drawCanvas: DrawCanvasCallback; - /** - * Function used to draw a canvas on top of the blink canvas - */ - drawCanvasBlink: DrawCanvasCallback; - /** - * A callback to draw an image to the main character canvas - */ - drawImage: DrawImageCallback; - /** - * A callback to draw an image to the blink character canvas - */ - drawImageBlink: DrawImageCallback; - /** - * A callback to draw a colorized image to the main character canvas - */ - drawImageColorize: DrawImageColorizeCallback; - /** - * A callback to draw a colorized image to the blink character canvas - */ - drawImageColorizeBlink: DrawImageColorizeCallback; -} - -interface DynamicDrawingData { - C: Character; - X: number; - Y: number; - CA: Item; - GroupName: AssetGroupName; - Color: string; - Opacity: number; - Property: ItemProperties; - A: Asset; - G: string; - AG: AssetGroup; - L: string; - Pose: string; - LayerType: string; - BlinkExpression: string; - drawCanvas: DrawCanvasCallback; - drawCanvasBlink: DrawCanvasCallback; - AlphaMasks: RectTuple[]; - PersistentData: () => T; -} - -/** - * Drawing overrides that can be returned by a dynamic BeforeDraw function - */ -interface DynamicBeforeDrawOverrides { - Property?: ItemProperties; - CA?: Item; - GroupName?: AssetGroupName; - Color?: ItemColor; - Opacity?: number; - X?: number; - Y?: number; - LayerType?: string; - L?: string; - AlphaMasks?: RectTuple[]; -} - -/** - * A dynamic BeforeDraw callback - */ -type DynamicBeforeDrawCallback = (data: DynamicDrawingData) => DynamicBeforeDrawOverrides; - -/** - * A dynamic AfterDraw callback - */ -type DynamicAfterDrawCallback = (data: DynamicDrawingData) => void; - -/** - * A dynamic ScriptDraw callback - */ -type DynamicScriptDrawCallback = (data: {C: Character, Item: Item, PersistentData: () => T}) => void; - -// #endregion - -//#region Infiltration/Pandora - -type InfiltrationTargetType = "NPC" | "USBKey" | "BDSMPainting" | "GoldCollar" | "GeneralLedger" | "SilverVibrator" | "DiamondRing" | "SignedPhoto" | "PandoraPadlockKeys"; - -interface InfiltrationMissionTarget { - Type: InfiltrationTargetType; - Found: boolean; - Fail: boolean; - Name: string; - PrivateRoom: boolean; -} - -type PandoraDirection = "North" | "South" | "East" | "West"; -type PandoraFloorDirection = "StairsUp" | "StairsDown" | PandoraDirection; -type PandoraFloors = "Ground" | "Second" | "Underground"; - -interface PandoraSpecialRoom { - Floor: "Exit" | "Search" | "Rest" | "Paint"; -} - -interface PandoraBaseRoom { - Floor: PandoraFloors; - Background: string; - Character: NPCCharacter[]; - Path: (PandoraBaseRoom | PandoraSpecialRoom)[]; - PathMap: PandoraBaseRoom[]; - Direction: string[]; - DirectionMap: string[]; - - /* SearchRoom */ - SearchSquare?: { - X: number; - Y: number; - W: number; - H: number; - }[]; - ItemX?: number; - ItemY?: number; - /* PaintRoom */ - Graffiti?: number; +// External globals, added by other libraries +interface Window { + WebFontConfig: object; } - -//#endregion - -//#region Crafting items - -interface CraftingItem { - Name: string; - Description: string; - Property: string; - Color: string; - Lock: AssetLockType; - Item: string; - Private: boolean; - Type: string; -} - -//#endregion diff --git a/Scripts/Validation.js b/Scripts/Validation.js deleted file mode 100644 index 871ccf3bd..000000000 --- a/Scripts/Validation.js +++ /dev/null @@ -1,877 +0,0 @@ -"use strict"; - -// Regexes for lock combination numbers and passwords -const ValidationCombinationNumberRegex = /^\d{4}$/; -const ValidationPasswordRegex = /^[A-Z]{1,8}$/; -const ValidationDefaultCombinationNumber = "0000"; -const ValidationDefaultPassword = "UNLOCK"; -const ValidationRemoveTimerToleranceMs = 5000; -const ValidationNonModifiableLockProperties = ["LockedBy", "LockMemberNumber"]; -const ValidationRestrictedLockProperties = [ - "EnableRandomInput", "RemoveItem", "ShowTimer", "CombinationNumber", "Password", "Hint", "LockSet", "LockPickSeed", -]; -const ValidationTimerLockProperties = ["MemberNumberList", "RemoveTimer"]; -const ValidationAllLockProperties = ValidationNonModifiableLockProperties - .concat(ValidationRestrictedLockProperties) - .concat(ValidationTimerLockProperties) - .concat(["MemberNumberListKeys"]); -const ValidationModifiableProperties = ValidationAllLockProperties.concat(["Effect", "Expression"]); - -/** - * Creates the appearance update parameters used to validate an appearance diff, based on the provided target character - * and the source character's member number. - * @param {Character} C - The target character (to whom the appearance update is being applied) - * @param {number} sourceMemberNumber - The member number of the source player (the person that sent the update) - * @returns {AppearanceUpdateParameters} - Appearance update parameters used based on the relationship between the - * target and source characters - */ -function ValidationCreateDiffParams(C, sourceMemberNumber) { - const fromSelf = false; - const fromOwner = false; - const fromLover = false; - return { C, fromSelf, fromOwner, fromLover, sourceMemberNumber }; -} - -/** - * Resolves an appearance diff based on the previous item, new item, and the appearance update parameters provided. - * Returns an {@link ItemDiffResolution} object containing the final appearance item and a valid flag indicating - * whether or not the new item had to be modified/rolled back. - * @param {Item|null} previousItem - The previous item that the target character had equipped (or null if none) - * @param {Item|null} newItem - The new item to equip (may be identical to the previous item, or null if removing) - * @param {AppearanceUpdateParameters} params - The appearance update parameters that apply to the diff - * @returns {ItemDiffResolution} - The diff resolution - a wrapper object containing the final item and a flag - * indicating whether or not the change was valid. - */ -function ValidationResolveAppearanceDiff(previousItem, newItem, params) { - let result; - if (!previousItem && !newItem) { - result = { item: previousItem, valid: true }; - } else if (!previousItem) { - result = ValidationResolveAddDiff(newItem, params); - } else if (!newItem) { - result = ValidationResolveRemoveDiff(previousItem, params); - } else if (previousItem.Asset === newItem.Asset) { - result = ValidationResolveModifyDiff(previousItem, newItem, params); - } else { - result = ValidationResolveSwapDiff(previousItem, newItem, params); - } - let { item, valid } = result; - // If the diff has resolved to an item, sanitize its properties - if (item) valid = !ValidationSanitizeProperties(params.C, item) && valid; - return { item, valid }; -} - -/** - * Resolves an appearance diff where an item is being added (i.e. there was no previous item in the asset group). Add - * diffs are handled as the composite of two operations: item addition, followed by property modification. First we - * check whether the base item can be added, and then we check that any added properties are permitted. - * @param {Item} newItem - The new item to equip - * @param {AppearanceUpdateParameters} params - The appearance update parameters that apply to the diff - * @returns {ItemDiffResolution} - The diff resolution - a wrapper object containing the final item and a flag - * indicating whether or not the change was valid. - */ -function ValidationResolveAddDiff(newItem, params) { - const canAdd = ValidationCanAddItem(newItem, params); - if (!canAdd) { - console.warn(`Invalid addition of ${ValidationItemWarningMessage(newItem, params)}`); - return { item: null, valid: false }; - } - const itemWithoutProperties = { - Asset: newItem.Asset, - Difficulty: newItem.Difficulty, - Color: newItem.Color, - }; - return ValidationResolveModifyDiff(itemWithoutProperties, newItem, params); -} - -/** - * Resolves an appearance diff where an item is being removed (i.e. there was previously an item in the asset group, but - * it is being removed) - * @param {Item} previousItem - The previous item to remove - * @param {AppearanceUpdateParameters} params - The appearance update parameters that apply to the diff - * @param {boolean} [isSwap] - Whether or not the removal is part of an item swap operation. This will allow certain - * items which cannot normally be removed (e.g. items with `AllowNone: false`) to be removed - * @returns {ItemDiffResolution} - The diff resolution - a wrapper object containing the final item and a flag - * indicating whether or not the change was valid. - */ -function ValidationResolveRemoveDiff(previousItem, params, isSwap) { - const canRemove = ValidationCanRemoveItem(previousItem, params, isSwap); - if (!canRemove) { - console.warn(`Invalid removal of ${ValidationItemWarningMessage(previousItem, params)}`); - } - return { - item: canRemove ? null : previousItem, - valid: canRemove, - }; -} - -/** - * Resolves an appearance diff where an item is being swapped (i.e. there was an item previously in the asset group, but - * the new item uses a different asset to the previous item). Swap diffs are handled as the composite of three - * operations: item removal, item addition, and then property modification. First we check whether the previous item - * can be removed, then whether the new item can be added, and finally we check that any added properties are permitted. - * @param {Item} previousItem - The previous item to remove - * @param {Item} newItem - The new item to add - * @param {AppearanceUpdateParameters} params - The appearance update parameters that apply to the diff - * @returns {ItemDiffResolution} - The diff resolution - a wrapper object containing the final item and a flag - * indicating whether or not the change was valid. - */ -function ValidationResolveSwapDiff(previousItem, newItem, params) { - // First, attempt to remove the previous item - let result = ValidationResolveRemoveDiff(previousItem, params, true); - // If the removal result was valid, attempt to add the new item - if (result.valid) result = ValidationResolveAddDiff(newItem, params); - // If the result is valid, return it - if (result.valid) return result; - // Otherwise, return the previous item and an invalid status - else return { item: previousItem, valid: false }; -} - -/** - * Resolves an appearance diff where an item is being modified (i.e. there was an item previously in the asset group, - * and the new item uses the same asset as the previous item). The function primarily validates modifications to locked - * items - * @param {Item} previousItem - The previous item to remove - * @param {Item} newItem - The new item to add - * @param {AppearanceUpdateParameters} params - The appearance update parameters that apply to the diff - * @returns {ItemDiffResolution} - The diff resolution - a wrapper object containing the final item and a flag - * indicating whether or not the change was valid. - */ -function ValidationResolveModifyDiff(previousItem, newItem, params) { - const { C, fromSelf, sourceMemberNumber } = params; - - // If the update is coming from ourself, it's always permitted - if (fromSelf) return { item: newItem, valid: true }; - - const asset = previousItem.Asset; - const group = asset.Group; - const previousProperty = previousItem.Property || {}; - /** @type {ItemProperties} */ - const newProperty = newItem.Property = newItem.Property || {}; - const itemBlocked = ValidationIsItemBlockedOrLimited(C, sourceMemberNumber, group.Name, asset.Name) || - ValidationIsItemBlockedOrLimited(C, sourceMemberNumber, group.Name, asset.Name, newProperty.Type); - - // If the type has changed and the new type is blocked/limited for the target character, prevent modifications - if (newProperty.Type !== previousProperty.Type && itemBlocked) { - return { item: previousItem, valid: false }; - } - - let valid = ValidationResolveLockModification(previousItem, newItem, params, itemBlocked); - - // If the source wouldn't usually be able to add the item, ensure that some properties are not modified - if (!ValidationCanAddItem(newItem, params)) { - const warningSuffix = ValidationItemWarningMessage(previousItem, params); - // Block changing the color of non-clothing appearance items/cosplay items if the target does not permit that - if (!CommonColorsEqual(newItem.Color, previousItem.Color)) { - console.warn(`Invalid modification of color for item ${warningSuffix}`); - newItem.Color = previousItem.Color; - valid = false; - } - - // Block changing the base difficulty of non-clothing appearance items/cosplay items - if (newItem.Difficulty !== previousItem.Difficulty) { - console.warn(`Invalid modification of difficulty for item ${warningSuffix}`); - newItem.Difficulty = previousItem.Difficulty; - valid = false; - } - - // Block changing properties, but exclude modifiable and lock-related properties, as they get handled separately - const previousKeys = Object.keys(previousProperty) - .filter(key => !ValidationModifiableProperties.includes(key)); - const newKeys = Object.keys(newProperty).filter(key => !ValidationModifiableProperties.includes(key)); - - previousKeys.forEach(key => { - valid = !ValidationCopyProperty(previousProperty, newProperty, key) && valid; - }); - newKeys.forEach((key) => { - if (!previousKeys.includes(key)) { - console.warn(`Invalid modification of property "${key}" for item ${warningSuffix}`); - valid = false; - delete newProperty[key]; - } - }); - } - - if (!Object.keys(newProperty).length) delete newItem.Property; - - return { item: newItem, valid }; -} - -/** - * Resolves modifications to an item's lock properties and returns a boolean to indicate whether or not the - * modifications were valid. - * @param {Item} previousItem - The previous item to remove - * @param {Item} newItem - The new item to add - * @param {AppearanceUpdateParameters} params - The appearance update parameters that apply to the diff - * @param {boolean} itemBlocked - Whether or not the item is blocked or limited for the source player - * @returns {boolean} - true if the lock modifications (if any) were valid, false otherwise - */ -function ValidationResolveLockModification(previousItem, newItem, params, itemBlocked) { - const { C, sourceMemberNumber } = params; - - const previousProperty = previousItem.Property || {}; - const newProperty = newItem.Property = newItem.Property || {}; - - const previousLock = InventoryGetLock(previousItem); - const newLock = InventoryGetLock(newItem); - const notLocked = !previousLock && !newLock; - - if (notLocked || !ValidationLockWasModified(previousProperty, newProperty)) { - return true; - } - - const lockSwapped = !!newLock && !!previousLock && newLock.Asset.Name !== previousLock.Asset.Name; - const lockModified = !!newLock && !!previousLock && !lockSwapped; - const lockRemoved = lockSwapped || (!newLock && !!previousLock); - const lockAdded = lockSwapped || (!!newLock && !previousLock); - const newLockBlocked = !!newLock && ValidationIsItemBlockedOrLimited( - C, sourceMemberNumber, newLock.Asset.Group.Name, newLock.Asset.Name, - ); - - const lockChangeInvalid = (lockRemoved && !ValidationIsLockChangePermitted(previousLock, params, true)) || - (lockAdded && !ValidationIsLockChangePermitted(newLock, params)) || - ((lockAdded || lockModified || lockSwapped) && (newLockBlocked || itemBlocked)); - - if (lockChangeInvalid) { - if (previousLock) { - // If there was a lock previously, reapply the old lock - if (lockRemoved) { - console.warn(`Invalid removal of lock ${ValidationItemWarningMessage(previousLock, params)}`); - } else if (lockSwapped) { - console.warn(`Invalid addition of lock ${ValidationItemWarningMessage(newLock, params)}`); - } else { - console.warn(`Invalid modification of lock ${ValidationItemWarningMessage(newLock, params)}`); - } - InventoryLock(C, newItem, previousLock, previousProperty.LockMemberNumber, false); - ValidationCloneLock(previousProperty, newProperty); - return false; - } else { - // Otherwise, delete any lock - console.warn(`Invalid addition of lock ${ValidationItemWarningMessage(newLock, params)}`); - return !ValidationDeleteLock(newItem.Property); - } - } else if (lockModified) { - // If the lock has been modified, then ensure lock properties don't change (except where they should be able to) - const hasLockPermissions = ValidationIsLockChangePermitted(previousLock, params) && !newLockBlocked; - return !ValidationRollbackInvalidLockProperties(previousProperty, newProperty, hasLockPermissions); - } - - // If there are no other issues, the change is valid - return true; -} - -/** - * Determines whether or not a lock was modified on an item from its previous and new property values - * @param previousProperty - The previous item property - * @param newProperty - The new item property - * @returns {boolean} - true if the item's lock was modified (added/removed/swapped/modified), false otherwise - */ -function ValidationLockWasModified(previousProperty, newProperty) { - return previousProperty.LockedBy !== newProperty.LockedBy || - ValidationAllLockProperties.some((key) => !CommonDeepEqual(previousProperty[key], newProperty[key])); -} - -/** - * Returns a commonly used warning message indicating that an invalid change to an item was made, along with the target - * and source characters' member numbers. - * @param {Item} item - The item being modified - * @param {AppearanceUpdateParameters} params - The appearance update parameters that apply to the diff - * @returns {string} - The warning message - */ -function ValidationItemWarningMessage(item, { C, sourceMemberNumber }) { - return `${item.Asset.Name} on member number ${C.IsNpc() ? C.Name : C.MemberNumber} by member number ${sourceMemberNumber || Player.MemberNumber} blocked`; -} - -/** - * Determines whether or not a lock can be modified based on the lock object and the provided appearance update - * parameters. - * @param {Item} lock - The lock object that is being checked, as returned by {@link InventoryGetLock} - * @param {AppearanceUpdateParameters} params - The appearance update parameters that apply to the diff - * @param {boolean} [remove] - Whether the lock change is a removal - * @returns {boolean} - TRUE if the lock can be modified, FALSE otherwise - */ -function ValidationIsLockChangePermitted(lock, { C, fromOwner, fromLover }, remove = false) { - if (!lock) return true; - if (lock.Asset.OwnerOnly && !fromOwner) return false; - if (lock.Asset.LoverOnly) { - // Owners can always remove lover locks, regardless of lover rules - if (remove && fromOwner) return true; - else return fromLover; - } - return true; -} - -/** - * Copies an item's lock-related properties from one Property object to another based on whether or not the source - * character has permissions to modify the lock. Rolls back any invalid changes to their previous values. - * @param {object} sourceProperty - The original Property object on the item - * @param {object} targetProperty - The Property object on the modified item - * @param {boolean} hasLockPermissions - Whether or not the source character of the appearance change has permission to - * modify the lock (as determined by {@link ValidationIsLockChangePermitted}) - * @returns {boolean} - TRUE if the target Property object was modified as a result of copying (indicating that there - * were invalid changes to the lock), FALSE otherwise - */ -function ValidationRollbackInvalidLockProperties(sourceProperty, targetProperty, hasLockPermissions) { - let changed = false; - for (const key of ValidationNonModifiableLockProperties) { - changed = ValidationCopyProperty(sourceProperty, targetProperty, key) || changed; - } - if (!hasLockPermissions) { - for (const key of ValidationRestrictedLockProperties) { - changed = ValidationCopyProperty(sourceProperty, targetProperty, key) || changed; - } - if (!targetProperty.EnableRandomInput) { - for (const key of ValidationTimerLockProperties) { - changed = ValidationCopyProperty(sourceProperty, targetProperty, key) || changed; - } - } - } - return changed; -} - -/** - * Clones all lock properties from one Property object to another. - * @param {object} sourceProperty - The property object to clone properties from - * @param {object} targetProperty - The property object to clone properties to - * @returns {void} - Nothing - */ -function ValidationCloneLock(sourceProperty, targetProperty) { - for (const key of ValidationAllLockProperties) { - targetProperty[key] = sourceProperty[key]; - } -} - -/** - * Copies the value of a single property key from a source Property object to a target Property object. - * @param {object} sourceProperty - The original Property object on the item - * @param {object} targetProperty - The Property object on the modified item - * @param {string} key - The property key whose value to copy - * @returns {boolean} - TRUE if the target Property object was modified as a result of copying (indicating that there - * were invalid changes to the property), FALSE otherwise - */ -function ValidationCopyProperty(sourceProperty, targetProperty, key) { - if (sourceProperty[key] != null && !CommonDeepEqual(targetProperty[key], sourceProperty[key])) { - targetProperty[key] = sourceProperty[key]; - return true; - } - return false; -} - -/** - * Determines whether an item can be added to the target character, based on the provided appearance update parameters. - * Note that the item's properties are not taken into account at this stage - this merely checks whether the basic item - * can be added. - * @param {Item} newItem - The new item to add - * @param {AppearanceUpdateParameters} params - The appearance update parameters that apply to the diff - * @returns {boolean} - TRUE if the new item can be equipped based on the appearance update parameters, FALSE otherwise - */ -function ValidationCanAddItem(newItem, params) { - const {C, fromSelf, sourceMemberNumber} = params; - - // If the update is coming from ourself, it's always permitted - if (fromSelf) return true; - - // Fall back to common item add/remove validation - return ValidationCanAddOrRemoveItem(newItem, params); -} - -/** - * Determines whether the character described by the `sourceMemberNumber` parameter is permitted to add a given asset to - * the target character `C`, based on the asset's group name, asset name and type (if applicable). This only checks - * against the target character's limited and blocked item lists, not their global item permissions. - * @param {Character} C - The target character - * @param sourceMemberNumber - The member number of the source character - * @param {string} groupName - The name of the asset group for the intended item - * @param {string} assetName - The asset name of the intended item - * @param {string|null} [type] - The type of the intended item - * @returns {boolean} - TRUE if the character with the provided source member number is _not_ allowed to equip the - * described asset on the target character, FALSE otherwise. - */ -function ValidationIsItemBlockedOrLimited(C, sourceMemberNumber, groupName, assetName, type) { - if (C.MemberNumber === sourceMemberNumber) return false; - if (InventoryIsPermissionBlocked(C, assetName, groupName, type)) return true; - if (!InventoryIsPermissionLimited(C, assetName, groupName, type)) return false; - if (C.IsLoverOfMemberNumber(sourceMemberNumber) || C.IsOwnedByMemberNumber(sourceMemberNumber)) return false; - // If item permission is "Owner, Lover, whitelist & Dominants" or below, the source must be on their whitelist - if (C.ItemPermission < 3 && C.WhiteList.includes(sourceMemberNumber)) return false; - // Otherwise, the item is limited, and the source doesn't have permission - return true; -} - -/** - * Determines whether an item can be removed from the target character, based on the provided appearance update - * parameters. - * @param {Item} previousItem - The item to remove - * @param {AppearanceUpdateParameters} params - The appearance update parameters that apply to the diff - * @param {boolean} isSwap - Whether or not the removal is part of a swap, which allows temporary removal of items with - * `AllowNone: false`. - * @returns {boolean} - TRUE if the item can be removed based on the appearance update parameters, FALSE otherwise - */ -function ValidationCanRemoveItem(previousItem, params, isSwap) { - // If we're not swapping, and the asset group can't be empty, always block removal - if (!previousItem.Asset.Group.AllowNone && !isSwap) return false; - - const {fromSelf, fromOwner, fromLover} = params; - - // If the update is coming from ourself, it's always permitted - if (fromSelf) return true; - - const lock = InventoryGetLock(previousItem); - - // If the previous item has AllowRemoveExclusive, allow owner/lover-only items to be removed if they're not locked - if (previousItem.Asset.AllowRemoveExclusive) { - if (InventoryOwnerOnlyItem(previousItem) && (!lock || !lock.Asset.OwnerOnly)) return true; - else if (InventoryLoverOnlyItem(previousItem) && (!lock || !lock.Asset.LoverOnly)) return true; - } - - // Owners can always remove lover locks, regardless of lover rules - if (lock && lock.Asset.LoverOnly && fromOwner) return true; - - // Only owners/lovers can remove lover locks - if (lock && lock.Asset.LoverOnly && !fromLover && !fromOwner) return false; - - // Only owners can remove owner locks - if (lock && lock.Asset.OwnerOnly && !fromOwner) return false; - - // Fall back to common item add/remove validation - return ValidationCanAddOrRemoveItem(previousItem, params); -} - -/** - * Determines whether an item can be added or removed from the target character, based on the provided appearance update - * parameters. - * @param {Item} item - The item to add or remove - * @param {AppearanceUpdateParameters} params - The appearance update parameters that apply to the diff - * @return {boolean} - TRUE if the item can be added or removed based on the appearance update parameters, FALSE - * otherwise - */ -function ValidationCanAddOrRemoveItem(item, { C, fromOwner, fromLover }) { - const asset = item.Asset; - - // If the target does not permit full appearance modification, block changing non-clothing appearance items - const blockFullWardrobeAccess = !(C.OnlineSharedSettings && C.OnlineSharedSettings.AllowFullWardrobeAccess); - if (blockFullWardrobeAccess && asset.Group.Category === "Appearance" && !asset.Group.Clothing) return false; - - // If changing cosplay items is blocked and we're adding/removing a cosplay item, block it - const blockBodyCosplay = C.OnlineSharedSettings && C.OnlineSharedSettings.BlockBodyCosplay; - if (blockBodyCosplay && InventoryGetItemProperty(item, "BodyCosplay", true)) return false; - - // If the item is owner only, only the owner can add/remove it - if (asset.OwnerOnly) return fromOwner; - - // If the item is lover only, only a lover/owner can add/remove it - if (asset.LoverOnly) return fromLover; - - // If the asset does not have the Enable flag, it can't be added/removed - if (!asset.Enable) return false; - - // Otherwise, the item can be added/removed - return true; -} - -/** - * Sanitizes the properties on an appearance item to ensure that no invalid properties are present. This removes invalid - * locks, strips invalid values, and ensures property values are within the constraints defined by an item. - * @param {Character} C - The character on whom the item is equipped - * @param {Item} item - The appearance item to sanitize - * @returns {boolean} - TRUE if the item was modified as part of the sanitization process (indicating that invalid - * properties were present), FALSE otherwise - */ -function ValidationSanitizeProperties(C, item) { - // If the character is an NPC, no validation is needed - if (C.IsNpc()) return false; - - const property = item.Property; - - // If the item doesn't have a property, no validation is needed - if (property == null) return false; - - // If the property is not an object, remove it and return - if (typeof property !== "object") { - console.warn("Removing invalid property:", property); - delete item.Property; - return true; - } - - // Sanitize various properties - let changed = ValidationSanitizeEffects(C, item); - changed = ValidationSanitizeBlocks(C, item) || changed; - changed = ValidationSanitizeSetPose(C, item) || changed; - changed = ValidationSanitizeStringArray(property, "Hide") || changed; - - const asset = item.Asset; - - // If the property has an expression, it needs to be in the asset or group's AllowExpression array - const allowExpression = asset.AllowExpression || asset.Group.AllowExpression || []; - if (property.Expression != null && !allowExpression.includes(property.Expression)) { - console.warn(`Removing invalid expression "${property.Expression}" from ${asset.Name}`); - delete property.Expression; - changed = true; - } - - // Clamp item opacity within the allowed range - if (typeof property.Opacity === "number") { - if (property.Opacity > asset.MaxOpacity) { - property.Opacity = asset.MaxOpacity; - changed = true; - } - if (property.Opacity < asset.MinOpacity) { - property.Opacity = asset.MinOpacity; - changed = true; - } - } - - if (property.Tint && !asset.AllowTint) { - delete property.Tint; - changed = true; - } - - // Block advanced vibrator modes if disabled - if (typeof property.Mode === "string" && C.ArousalSettings && C.ArousalSettings.DisableAdvancedVibes && !VibratorModeOptions[VibratorModeSet.STANDARD].includes(VibratorModeGetOption(property.Mode))) { - console.warn(`Removing invalid mode "${property.Mode}" from ${asset.Name}`); - property.Mode = VibratorModeOptions[VibratorModeSet.STANDARD][0].Name; - changed = true; - } - - return changed; -} - -/** - * Sanitizes the `Effect` array on an item's Property object, if present. This ensures that it is a valid array of - * strings, and that each item in the array is present in the asset's `AllowEffect` array. - * @param {Character} C - The character on whom the item is equipped - * @param {Item} item - The item whose `Effect` property should be sanitized - * @returns {boolean} - TRUE if the item's `Effect` property was modified as part of the sanitization process - * (indicating it was not a valid string array, or that invalid effects were present), FALSE otherwise - */ -function ValidationSanitizeEffects(C, item) { - const property = item.Property; - let changed = ValidationSanitizeStringArray(property, "Effect"); - - // If there is no Effect array, no further sanitization is needed - if (!Array.isArray(property.Effect)) return changed; - - const assetEffect = item.Asset.Effect || []; - const allowEffect = item.Asset.AllowEffect || []; - property.Effect = property.Effect.filter((effect) => { - // The Lock effect is handled by ValidationSanitizeLock - if (effect === "Lock") return true; - // All other effects must be included in the AllowEffect array to be permitted - else if (!assetEffect.includes(effect) && !allowEffect.includes(effect)) { - console.warn(`Filtering out invalid Effect entry on ${item.Asset.Name}:`, effect); - changed = true; - return false; - } else return true; - }); - - return changed; -} - -/** - * Sanitizes the `Block` array on an item's Property object, if present. This ensures that it is a valid array of - * strings, and that each item in the array is present in the either the asset's `Block` or `AllowBlock` array. - * @param {Character} C - The character on whom the item is equipped - * @param {Item} item - The item whose `Block` property should be sanitized - * @returns {boolean} - TRUE if the item's `Block` property was modified as part of the sanitization process - * (indicating it was not a valid string array, or that invalid entries were present), FALSE otherwise - */ -function ValidationSanitizeBlocks(C, item) { - const property = item.Property; - let changed = ValidationSanitizeStringArray(property, "Block"); - - // If there is no Block array, no further sanitization is needed - if (!Array.isArray(property.Block)) return changed; - - const assetBlock = item.Asset.Block || []; - const allowBlock = item.Asset.AllowBlock || []; - // Any Block entry must be included in the AllowBlock list to be permitted - property.Block = property.Block.filter((block) => { - if (!assetBlock.includes(block) && !allowBlock.includes(block)) { - console.warn(`Filtering out invalid Block entry on ${item.Asset.Name}:`, block); - changed = true; - return false; - } else return true; - }); - return changed; -} - -/** - * Sanitizes the `SetPose` array on an item's Property object, if present. This ensures that it is a valid array of - * strings, and that each item in the array is present in the list of poses available in the game. - * @param {Character} C - The character on whom the item is equipped - * @param {Item} item - The item whose `SetPose` property should be sanitized - * @returns {boolean} - TRUE if the item's `SetPose` property was modified as part of the sanitization process - * (indicating it was not a valid string array, or that invalid entries were present), FALSE otherwise - */ -function ValidationSanitizeSetPose(C, item) { - const property = item.Property; - let changed = ValidationSanitizeStringArray(property, "SetPose"); - - // If there is no SetPose array, no further sanitization is needed - if (!Array.isArray(property.SetPose)) return changed; - - // The SetPose array must contain a list of valid pose names - property.SetPose = property.SetPose.filter((pose) => { - if (!PoseFemale3DCGNames.includes(pose)) { - console.warn(`Filtering out invalid SetPose entry on ${item.Asset.Name}:`, pose); - changed = true; - return false; - } else return true; - }); - return changed; -} - -/** - * Sanitizes a property on an object to ensure that it is a valid string array or null/undefined. If the property is not - * a valid array and is not null, it will be deleted from the object. If it is a valid array, any non-string entries - * will be removed. - * @param {object} property - The object whose property should be sanitized - * @param {string} key - The key indicating which property on the object should be sanitized - * @returns {boolean} - TRUE if the object's property was modified as part of the sanitization process (indicating that - * the property was not a valid array, or that it contained a non-string entry), FALSE otherwise - */ -function ValidationSanitizeStringArray(property, key) { - const value = property[key]; - let changed = false; - if (Array.isArray(value)) { - value.filter(str => { - if (typeof str !== "string") { - console.warn(`Filtering out invalid ${key} entry:`, str); - changed = true; - return false; - } else { - return true; - } - }); - } else if (value != null) { - console.warn(`Removing invalid ${key} array:`, value); - delete property[key]; - changed = true; - } - return changed; -} - -/** - * Completely removes a lock from an item's Property object. This removes all lock-related properties, and the "Lock" - * effect from the property object. - * @param {object} property - The Property object to remove the lock from - * @param {boolean} verbose - Whether or not to print console warnings when properties are deleted. Defaults to true. - * @returns {boolean} - TRUE if the Property object was modified as a result of the lock deletion (indicating that at - * least one lock-related property was present), FALSE otherwise - */ -function ValidationDeleteLock(property, verbose = true) { - let changed = false; - if (property) { - ValidationAllLockProperties.forEach(key => { - if (property[key] != null) { - // Special casing for RemoveTimer because it is used for both locks and expressions :( - if (key === "RemoveTimer" && property.Expression != null) return; - // Otherwise remove the property - if (verbose) console.warn("Removing invalid lock property:", key); - delete property[key]; - changed = true; - } - }); - if (Array.isArray(property.Effect)) { - property.Effect = property.Effect.filter(E => { - if (E === "Lock") { - if (verbose) console.warn("Filtering out invalid Lock effect"); - changed = true; - return false; - } else return true; - }); - } - } - return changed; -} - -/** - * Fixes any cyclic blocks in the provided appearance array. The given diff map is used to determine the order in which - * items should be rolled back or removed if block cycles are found (a block cycle being a series of items that block - * each other in a cyclic fashion). - * @param {Item[]} appearance - The appearance to sanitize - * @param {AppearanceDiffMap} diffMap - The appearance diff map which indicates the items that were changed as part of - * the appearance update that triggered this validation - * @returns {AppearanceValidationWrapper} - A wrapper containing the final appearance, with any block cycles removed, - * plus a valid flag indicating whether or not the appearance had to be modified. - */ -function ValidationResolveCyclicBlocks(appearance, diffMap) { - let cycles = ValidationFindBlockCycles(appearance); - let valid = true; - - // Keep rolling items back until there are no block cycles left - while (cycles.length > 0) { - const groups = appearance.map((item) => item.Asset.Group.Name); - - /* @type Map */ - const groupCounts = new Map(); - // Count how many cycles each group appears in - for (const group of groups) { - for (const cycle of cycles) { - if (cycle.includes(group)) { - groupCounts.set(group, (groupCounts.get(group) || 0) + 1); - } - } - } - - // Sort the groups - groups that appear in more cycles should be removed first - const groupsByFrequency = Array.from(groupCounts.entries()) - .sort(([, c1], [, c2]) => c2 - c1) - .map(entry => entry[0]); - - const nonModifiedGroups = []; - /* - * Find the groups that were modified in the provided diff map with changes that may impact blocking. These - * groups are the highest priorities for rollback/removal - */ - const modifiedGroups = groupsByFrequency.filter((group) => { - if (diffMap[group]) { - const [prev, next] = diffMap[group]; - if (!!prev !== !!next) return true; - if (!CommonDeepEqual(prev.Asset.Block, next.Asset.Block)) return true; - const prevPropBlock = prev.Property && prev.Property.Block; - const nextPropBlock = next.Property && next.Property.Block; - if (!CommonDeepEqual(prevPropBlock, nextPropBlock)) return true; - const prevEnclose = InventoryItemHasEffect(prev, "Enclose"); - const nextEnclose = InventoryItemHasEffect(next, "Enclose"); - if (prevEnclose !== nextEnclose) return true; - } - nonModifiedGroups.push(group); - return false; - }); - const groupsByPriority = modifiedGroups.concat(nonModifiedGroups); - - let i = 0; - // Remove groups in priority order until there are no cycles left - while (cycles.length > 0 && i < groupsByPriority.length) { - const groupToRollback = groupsByPriority[i]; - console.warn(`Rolling back group ${groupToRollback} due to block cycles`); - valid = false; - // Modify the appearance by rolling back or removing the item in the current group - appearance = appearance - .map((item) => { - const groupName = item.Asset.Group.Name; - if (groupName === groupToRollback) { - if (modifiedGroups.includes(groupName) && item !== diffMap[groupName][0]) { - /* - * If the group was modified as part of the diff map, and we're not already looking at the - * rolled back item, roll back - */ - return diffMap[groupName][0]; - } else { - // Otherwise remove - return null; - } - } - // If it's not the group we care about, don't modify - return item; - }) - .filter(Boolean); - - // Remove any cycles that contain the group we just removed/rolled back - cycles = cycles.filter(cycle => !cycle.includes(groupToRollback)); - i++; - } - - // Finally, do one more cycle check to verify that the rollbacks didn't reveal more cycles - cycles = ValidationFindBlockCycles(appearance); - } - return { appearance, valid }; -} - -/** - * Finds any block cycles in the given appearance array. Block cycles are groups of items that block each other in a - * cyclic fashion. Block cycles are represented as an array of group names that comprise the cycle. For example: - * ["ItemArms", "ItemDevices", "ItemArms"] - * This indicates that the item in the ItemArms group blocks the item in the ItemDevices group, and vice versa. This - * function returns an array of such block cycles, or an empty array if none were found. - * Be advised that cyclic block checking is relatively expensive, so should only be run when needed - don't run it every - * frame! - * @param {Item[]} appearance - The appearance array to check - * @returns {string[][]} - A list of block cycles, each cycle being represented as an array of group names. - */ -function ValidationFindBlockCycles(appearance) { - const groups = appearance.map((item) => item.Asset.Group.Name); - /** @type {[string, string][]} */ - const edges = []; - /** @type {Map} */ - const edgeMap = new Map(); - /** @type {(from: string, to: string) => void} */ - const recordEdge = (from, to) => { - if (!edgeMap.get(from)) { - edgeMap.set(from, to); - edges.push([from, to]); - } - }; - - for (const item of appearance) { - const blockedGroups = ValidationGetBlockedGroups(item, groups); - for (const group of blockedGroups) { - recordEdge(item.Asset.Group.Name, group); - } - const blockingGroups = ValidationGetPrerequisiteBlockingGroups(item, appearance); - for (const group of blockingGroups) { - recordEdge(group, item.Asset.Group.Name); - } - } - - const graph = new DirectedGraph(groups, edges); - return graph.findCycles(); -} - -/** - * Finds the groups, from a provided list of groups, that are blocked by a given item. - * @param {Item} item - The item to check - * @param {string[]} groupNames - A list of group names that should be used to filter the final block list - * @returns {string[]} - A subset of the provided group names representing the groups that are blocked by the given - * item. - */ -function ValidationGetBlockedGroups(item, groupNames) { - if (InventoryItemHasEffect(item, "Enclose", true)) { - return groupNames.filter(groupName => groupName !== item.Asset.Group.Name); - } - - let blockedGroups = []; - if (Array.isArray(item.Asset.Block)) { - blockedGroups = blockedGroups.concat(item.Asset.Block); - } - if (item.Property && Array.isArray(item.Property.Block)) { - blockedGroups = blockedGroups.concat(item.Property.Block); - } - return blockedGroups.filter(groupName => groupNames.includes(groupName)); -} - -/** - * Finds the groups from the provided appearance array that block a given item due to prerequisites. In this situation, - * an item is considered to be blocking if the target item can't be added with it, but can without it. - * @param {Item} item - The item to check - * @param {Item[]} appearance - The appearance array to check - * @returns {string[]} - A list of group names corresponding to items from the appearance array that block the given - * item due to prerequisites - */ -function ValidationGetPrerequisiteBlockingGroups(item, appearance) { - if (!item.Asset.Prerequisite) return []; - - appearance = appearance.filter((appearanceItem) => appearanceItem.Asset !== item.Asset); - const char = CharacterLoadSimple(`PrerequisiteCheck${item.Asset.Group.Name}`); - /** @type {string[]} */ - const blockingGroups = []; - - for (const checkItem of appearance) { - char.Appearance = appearance; - CharacterLoadEffect(char); - CharacterLoadPose(char); - const allowedWithCheckItem = InventoryAllow(char, item.Asset, undefined, false); - if (!allowedWithCheckItem) { - char.Appearance = appearance.filter((appearanceItem) => appearanceItem.Asset !== checkItem.Asset); - CharacterLoadEffect(char); - CharacterLoadPose(char); - const allowedWithoutCheckItem = InventoryAllow(char, item.Asset, undefined, false); - if (allowedWithoutCheckItem) { - blockingGroups.push(checkItem.Asset.Group.Name); - } - } - } - - return blockingGroups; -} diff --git a/Scripts/VariableHeight.js b/Scripts/VariableHeight.js deleted file mode 100644 index 5ffa681de..000000000 --- a/Scripts/VariableHeight.js +++ /dev/null @@ -1,332 +0,0 @@ -"use strict"; - -/** - * The name of vertical slider element - * @const {string} - */ -const VariableHeightSliderId = "VariableHeightSlider"; - -/** - * The name of the numerical percentage input element - * @const {string} - */ -const VariableHeightNumerId = "VariableHeightNumber"; - -/** - * Tracks the original properties to revert back to if the user cancels their changes - * @type ItemProperties - */ -let VariableHeightPreviousProperty; - -/** - * A lookup for the variable height configurations for each registered variable height item - * @const - * @type {Record} - */ -const VariableHeightDataLookup = {}; - -/** - * Registers a variable height extended item. This automatically creates the item's load, draw and click functions. - * @param {Asset} asset - The asset being registered - * @param {VariableHeightConfig | undefined} config - The variable height configuration - * @param {ItemProperties | undefined} property - The default properties to use - * @param {ExtendedItemOption[]} [parentOptions=null] - The variable height configuration of the option's parent item, if any - * @returns {void} - Nothing - */ -function VariableHeightRegister(asset, config, property, parentOptions = null) { - const data = VariableHeightCreateData(asset, config, property, parentOptions); - VariableHeightCreateLoadFunction(data); - VariableHeightCreateDrawFunction(data); - VariableHeightCreateClickFunction(data); - VariableHeightCreateExitFunction(data); - VariableHeightCreatePublishFunction(data); - VariableHeightCreateNpcDialogFunction(data); -} - -/** - * Generates an asset's variable height data - * @param {Asset} asset - The asset to generate modular item data for - * @param {VariableHeightConfig} config - The variable height configuration - * @returns {VariableHeightData} - The generated variable height data for the asset - */ -function VariableHeightCreateData(asset, - { MaxHeight, MinHeight, Slider, Dialog, ChatTags, GetHeightFunction, SetHeightFunction }, - property, parentOptions) -{ - const key = `${asset.Group.Name}${asset.Name}${property.Type || ""}`; - return VariableHeightDataLookup[key] = { - key, - asset, - functionPrefix: `Inventory${key}`, - maxHeight: MaxHeight, - minHeight: MinHeight, - slider: Slider, - defaultProperty: property, - dialog: { - chatPrefix: Dialog.ChatPrefix || `${key}Set`, - npcPrefix: Dialog.NpcPrefix || key, - }, - chatTags: Array.isArray(ChatTags) ? ChatTags : [ - CommonChatTags.SOURCE_CHAR, - CommonChatTags.DEST_CHAR, - CommonChatTags.TARGET_CHAR, - CommonChatTags.ASSET_NAME - ], - getHeight: GetHeightFunction || VariableHeightGetOverrideHeight, - setHeight: SetHeightFunction || VariableHeightSetOverrideHeight, - parentOptions: parentOptions, - }; -} - -/** - * Creates an asset's extended item load function - * @param {VariableHeightData} data - The variable height data for the asset - * @returns {void} - Nothing - */ -function VariableHeightCreateLoadFunction({ defaultProperty, maxHeight, minHeight, slider, functionPrefix, getHeight, setHeight }) { - // Create the function to apply the user's setting changes - const changeHeight = function (heightValue, elementId) { - VariableHeightChange(heightValue, maxHeight, minHeight, setHeight, elementId); - }; - - // Create the load function - const loadFunctionName = `${functionPrefix}Load`; - window[loadFunctionName] = function () { - let item = DialogFocusItem; - - // Record the previously set properties, reverting back to them on exiting unless otherwise instructed - if ((!VariableHeightPreviousProperty || VariableHeightPreviousProperty.Revert) && item.Property) - { - VariableHeightPreviousProperty = JSON.parse(JSON.stringify(item.Property)); - VariableHeightPreviousProperty.Revert = true; - } - - // Get the item/option's current height setting, initialising it if not set or invalid - let currentHeight = item.Property && item.Property.Type == defaultProperty.Type ? getHeight(item.Property) : null; - if (currentHeight == null) { - const lockProperties = item.Property ? InventoryExtractLockProperties(item.Property) : undefined; - item.Property = Object.assign(JSON.parse(JSON.stringify(defaultProperty)), lockProperties); - - if (item.Property.LockedBy && !(item.Property.Effect || []).includes("Lock")) { - item.Property.Effect = (item.Property.Effect || []); - item.Property.Effect.push("Lock"); - } - - currentHeight = getHeight(item.Property); - } - - // Create the controls and listeners - const heightSlider = ElementCreateRangeInput(VariableHeightSliderId, currentHeight, 0, 1, 0.01, slider.Icon, true); - if (heightSlider) { - heightSlider.addEventListener("input", (e) => changeHeight(Number(e.target.value), VariableHeightSliderId)); - } - const heightNumber = ElementCreateInput(VariableHeightNumerId, "number", String(Math.round(currentHeight * 100)), ""); - if (heightNumber) { - heightNumber.setAttribute("min", "0"); - heightNumber.setAttribute("max", "100"); - heightNumber.addEventListener("change", (e) => changeHeight(Number(e.target.value) / 100, VariableHeightNumerId)); - } - changeHeight(currentHeight, null); - }; -} - -/** - * Creates an asset's extended item draw function - * @param {VariableHeightData} data - The variable height data for the asset - * @returns {void} - Nothing - */ -function VariableHeightCreateDrawFunction({ functionPrefix, asset, slider }) { - const drawFunctionName = `${functionPrefix}Draw`; - window[drawFunctionName] = function () { - const locked = InventoryItemHasEffect(DialogFocusItem, "Lock", true); - DrawAssetPreview(1387, 55, asset, {Icons: locked ? ["Locked"] : undefined}); - DrawText(DialogFindPlayer("VariableHeightSelect"), 1500, 375, "white", "gray"); - - ElementPosition(VariableHeightSliderId, 1140, slider.Top + slider.Height / 2, 100, slider.Height); - - DrawTextFit(DialogFindPlayer("VariableHeightPercent"), 1405, 555, 250, "white", "gray"); - ElementPosition(VariableHeightNumerId, 1640, 550, 175); - - DrawButton(1350, 700, 300, 64, DialogFind(Player, "VariableHeightConfirm"), "White", ""); - }; -} - -/** - * Creates an asset's extended item click function - * @param {VariableHeightData} data - The variable height data for the asset - * @returns {void} - Nothing - */ -function VariableHeightCreateClickFunction({ parentOptions, functionPrefix, dialog, asset, chatTags, getHeight }) { - const clickFunctionName = `${functionPrefix}Click`; - window[clickFunctionName] = function () { - // Exit the screen - if (MouseIn(1885, 25, 90, 90)) { - VariableHeightExit(); - if (!parentOptions) { - DialogFocusItem = null; - } - } - - // Confirm button - if (MouseIn(1350, 700, 300, 64)) { - if (VariableHeightPreviousProperty) { - VariableHeightPreviousProperty.Revert = false; - } - if (parentOptions) { - let option = Object.assign({}, parentOptions.find(o => o.Property.Type == DialogFocusItem.Property.Type)); - option.Property = DialogFocusItem.Property; - const C = CharacterGetCurrent(); - ExtendedItemSetType(C, parentOptions, option); - } else { - if (CurrentScreen == "ChatRoom") { - VariableHeightPublish(dialog, asset, chatTags, getHeight); - } - } - } - }; -} - -/** - * Creates an asset's extended item exit function - * @param {VariableHeightData} data - The variable height data for the asset - * @returns {void} - Nothing - */ -function VariableHeightCreateExitFunction({ functionPrefix }) { - const drawFunctionName = `${functionPrefix}Exit`; - window[drawFunctionName] = VariableHeightExit; -} - -/** - * Creates an asset's extended item chatroom message publishing function - * @param {VariableHeightData} data - The variable height data for the asset - * @returns {void} - Nothing - */ -function VariableHeightCreatePublishFunction({ functionPrefix, dialog, asset, chatTags, getHeight }) { - const loadFunctionName = `${functionPrefix}PublishAction`; - window[loadFunctionName] = function () { - VariableHeightPublish(dialog, asset, chatTags, getHeight); - }; -} - -/** - * Creates an asset's extended item NPC dialog function - * @param {VariableHeightData} data - The variable height data for the asset - * @returns {void} - Nothing - */ -function VariableHeightCreateNpcDialogFunction({ asset, functionPrefix, dialog }) { - const npcDialogFunctionName = `${functionPrefix}NpcDialog`; - window[npcDialogFunctionName] = function (C, option) { - C.CurrentDialog = DialogFind(C, `${dialog.npcPrefix}${option.Name}`, asset.Group.Name); - }; -} - -/** - * Apply the setting change, throttling to limit the refreshes - * @param {Character} C - The character being modified - * @param {Item} item - The item being modified - * @param {number} height - The new height value for the character - * @param {string} fromElementId - The control that triggered the change - * @returns {void} - Nothing - */ -const VariableHeightChange = CommonLimitFunction((height, maxHeight, minHeight, setHeight, fromElementId) => { - // Validate the value - if (isNaN(height) || height < 0 || height > 1 || !DialogFocusItem) return; - - // Round to the nearest 0.01 - height = Math.round(height * 100) / 100; - - // Update values on controls, except the one just changed - if (fromElementId !== VariableHeightSliderId) { - ElementValue(VariableHeightSliderId, height); - } - if (fromElementId !== VariableHeightNumerId) { - ElementValue(VariableHeightNumerId, String(Math.round(height * 100))); - } - - // Apply the new setting - setHeight(DialogFocusItem.Property, height, maxHeight, minHeight); - - // Reload to see the change - const C = CharacterGetCurrent(); - CharacterRefresh(C, false, false); -}); - -/** - * Exit handler for the item's extended item screen. Updates the character and removes UI components. - * @returns {void} - Nothing - */ -function VariableHeightExit() { - // Revert the changes - if (VariableHeightPreviousProperty && VariableHeightPreviousProperty.Revert) { - const C = CharacterGetCurrent(); - DialogFocusItem.Property = JSON.parse(JSON.stringify(VariableHeightPreviousProperty)); - CharacterRefresh(C, false, false); - } - - // Cleanup - VariableHeightPreviousProperty = null; - ElementRemove(VariableHeightSliderId); - ElementRemove(VariableHeightNumerId); - ExtendedItemSubscreen = null; -} - -/** - * Publishes a custom action to the chat for the height change - * @param {Object} dialog - The keywords for the dialog entries to look up - * @param {Asset} asset - The asset for the variable height item - * @param {CommonChatTags[]} chatTags - The tags to map to a dictionary entry - * @param {Function} getHeight - Function to find the current setting from a property - * @returns {void} - Nothing - */ -function VariableHeightPublish(dialog, asset, chatTags, getHeight) { - const newHeight = getHeight(DialogFocusItem.Property); - const prevHeight = getHeight(VariableHeightPreviousProperty); - const msgType = prevHeight !== null && VariableHeightPreviousProperty.Type == DialogFocusItem.Property.Type - ? prevHeight < newHeight ? "Raise" : "Lower" - : ""; - - const C = CharacterGetCurrent(); - const msg = dialog.chatPrefix + msgType; - const dictionary = chatTags - .map((tag) => ExtendedItemMapChatTagToDictionaryEntry(C, asset, tag)) - .filter(Boolean); - ChatRoomPublishCustomAction(msg, true, dictionary); -} - -/** - * Retrieve the current height position override if set, accounting for inversion - * @param {ItemProperties} property - Property of the item determining the variable height - * @returns {number | null} - The height value between 0 and 1, null if missing or invalid - */ -function VariableHeightGetOverrideHeight(property) { - if (property - && property.OverrideHeight - && typeof property.OverrideHeight.Height == "number" - && typeof property.OverrideHeight.HeightRatioProportion == "number") - { - const isInverted = property.SetPose && property.SetPose.includes("Suspension"); - const heightSetting = property.OverrideHeight.HeightRatioProportion; - - return isInverted ? heightSetting : 1 - heightSetting; - } - - return null; -} - -/** - * Reposition the character vertically when upside-down, accounting for height ratio and inversion - * @param {ItemProperties} property - Property of the item determining the variable height - * @param {number} height - The 0 to 1 height setting to use - * @param {number} maxHeight - The maximum number of the item's height range - * @param {number} minHeight - The minimum number of the item's height range - * @returns {void} - Nothing - */ -function VariableHeightSetOverrideHeight(property, height, maxHeight, minHeight) { - if (property && property.OverrideHeight) { - const isInverted = property.SetPose && property.SetPose.includes("Suspension"); - const heightSetting = isInverted ? height : 1 - height; - - property.OverrideHeight.HeightRatioProportion = heightSetting; - property.OverrideHeight.Height = Math.round(maxHeight - heightSetting * (maxHeight - minHeight)); - } -} diff --git a/Scripts/VibratorMode.js b/Scripts/VibratorMode.js deleted file mode 100644 index e2d949c8c..000000000 --- a/Scripts/VibratorMode.js +++ /dev/null @@ -1,739 +0,0 @@ -"use strict"; - -/** - * An enum for the possible vibrator modes - * @readonly - * @enum {string} - */ -var VibratorMode = { - OFF: "Off", - LOW: "Low", - MEDIUM: "Medium", - HIGH: "High", - MAXIMUM: "Maximum", - RANDOM: "Random", - ESCALATE: "Escalate", - TEASE: "Tease", - DENY: "Deny", - EDGE: "Edge", -}; - -/** - * An enum for the possible vibrator states when a vibrator is in a state machine mode - * @type {{DEFAULT: "Default", DENY: "Deny", ORGASM: "Orgasm", REST: "Rest"}} - */ -var VibratorModeState = { - DEFAULT: "Default", - DENY: "Deny", - ORGASM: "Orgasm", - REST: "Rest", -}; - -/** - * An enum for the vibrator configuration sets that a vibrator can have - * @type {{STANDARD: "Standard", ADVANCED: "Advanced"}} - */ -var VibratorModeSet = { - STANDARD: "Standard", - ADVANCED: "Advanced", -}; - -/** - * A record of the various available vibrator sets of vibrator modes - * - * Note: Those really are ExtendedItemOption, but the ability for the advanced - * modes to automatically chose an intensity require a type override. - * VibratorModeSetDynamicProperties that those dynamic properties will - * get turned into the appropriate type. - * - * @type {{ - * Standard: ExtendedItemOption[], - * Advanced: (ExtendedItemOption | { - * Property: { - * Mode: VibratorMode, - * Intensity: number | (() => number), - * Effect: EffectName[] | ((Intensity: number) => EffectName[]), - * } - * })[] - * }} - * @constant - */ -var VibratorModeOptions = { - [VibratorModeSet.STANDARD]: [ - { - Name: "TurnOff", - Property: { - Mode: VibratorMode.OFF, - Intensity: -1, - Effect: ["Egged"], - }, - }, - { - Name: "Low", - Property: { - Mode: VibratorMode.LOW, - Intensity: 0, - Effect: ["Egged", "Vibrating"], - }, - }, - { - Name: "Medium", - Property: { - Mode: VibratorMode.MEDIUM, - Intensity: 1, - Effect: ["Egged", "Vibrating"], - }, - }, - { - Name: "High", - Property: { - Mode: VibratorMode.HIGH, - Intensity: 2, - Effect: ["Egged", "Vibrating"], - }, - }, - { - Name: "Maximum", - Property: { - Mode: VibratorMode.MAXIMUM, - Intensity: 3, - Effect: ["Egged", "Vibrating"], - }, - }, - ], - [VibratorModeSet.ADVANCED]: [ - { - Name: "Random", - Property: { - Mode: VibratorMode.RANDOM, - Intensity: () => CommonRandomItemFromList(null, [-1, 0, 1, 2, 3]), - Effect: (Intensity) => Intensity >= 0 ? ["Egged", "Vibrating"] : ["Egged"], - }, - }, - { - Name: "Escalate", - Property: { - Mode: VibratorMode.ESCALATE, - Intensity: 0, - Effect: ["Egged", "Vibrating"], - }, - }, - { - Name: "Tease", - Property: { - Mode: VibratorMode.TEASE, - Intensity: () => CommonRandomItemFromList(-1, [0, 1, 2, 3]), - Effect: ["Egged", "Vibrating"], - }, - }, - { - Name: "Deny", - Property: { - Mode: VibratorMode.DENY, - Intensity: () => CommonRandomItemFromList(-1, [0, 1, 2, 3]), - Effect: ["Egged", "Vibrating", "Edged"], - }, - }, - { - Name: "Edge", - Property: { - Mode: VibratorMode.EDGE, - Intensity: CommonRandomItemFromList(null, [0, 1]), - Effect: ["Egged", "Vibrating", "Edged"], - }, - }, - ], -}; - -/** - * A lookup for the vibrator configurations for each registered vibrator item - * @const - * @type {Record} - */ -const VibratorModeDataLookup = {}; - -/** - * Registers a vibrator item. This automatically creates the item's load, draw, click and scriptDraw functions. - * @param {Asset} asset - The asset being registered - * @param {VibratingItemConfig | undefined} config - The item's vibrator item configuration - * @returns {void} - Nothing - */ -function VibratorModeRegister(asset, config) { - const data = VibratorModeCreateData(asset, { - Options: [VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED] - }); - VibratorModeCreateLoadFunction(data); - VibratorModeCreateDrawFunction(data); - VibratorModeCreateClickFunction(data); - VibratorModeCreateScriptDrawFunction(data); - VibratorModeSetAssetProperties(data); -} - -/** - * Generates an asset's vibrating item data - * @param {Asset} asset - The asset to generate vibrating item data for - * @param {VibratingItemConfig} config - The item's extended item configuration - * @returns {VibratingItemData} - The generated vibrating item data for the asset - */ -function VibratorModeCreateData(asset, { - Options = [VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED] -} = {}) { - const key = `${asset.Group.Name}${asset.Name}`; - return VibratorModeDataLookup[key] = { - key, - asset, - options: Options, - functionPrefix: `Inventory${key}`, - dynamicAssetsFunctionPrefix: `Assets${key}`, - }; -} - -/** - * Creates an asset's extended item load function - * @param {VibratingItemData} data - The vibrating item data for the asset - * @returns {void} - Nothing - */ -function VibratorModeCreateLoadFunction({ options, functionPrefix }) { - const loadFunctionName = `${functionPrefix}Load`; - window[loadFunctionName] = function() { - VibratorModeLoad(options); - }; -} - -/** - * Creates an asset's extended item draw function - * @param {VibratingItemData} data - The vibrating item data for the asset - * @returns {void} - Nothing - */ -function VibratorModeCreateDrawFunction({ options, functionPrefix }) { - const drawFunctionName = `${functionPrefix}Draw`; - window[drawFunctionName] = function() { - VibratorModeDraw(options); - }; -} - -/** - * Creates an asset's extended item click function - * @param {VibratingItemData} data - The vibrating item data for the asset - * @returns {void} - Nothing - */ -function VibratorModeCreateClickFunction({ options, functionPrefix }) { - const clickFunctionName = `${functionPrefix}Click`; - window[clickFunctionName] = function() { - VibratorModeClick(options); - }; -} - -/** - * Creates an asset's dynamic script draw function - * @param {VibratingItemData} data - The vibrating item data for the asset - * @returns {void} - Nothing - */ -function VibratorModeCreateScriptDrawFunction({ dynamicAssetsFunctionPrefix }) { - const scriptDrawFunctionName = `${dynamicAssetsFunctionPrefix}ScriptDraw`; - window[scriptDrawFunctionName] = VibratorModeScriptDraw; -} - -/** - * Sets asset properties common to all vibrating items - * @param {VibratingItemData} data - The vibrating item data for the asset - * @returns {void} - Nothing - */ -function VibratorModeSetAssetProperties(data) { - const { asset } = data; - asset.DynamicScriptDraw = true; - VibratorModeSetAllowEffect(data); - VibratorModeSetEffect(data); -} - -/** - * Sets the AllowEffect property for a vibrating item - * @param {VibratingItemData} data - The vibrating item data for the asset - * @returns {void} - Nothing - */ -function VibratorModeSetAllowEffect({asset, options}) { - asset.AllowEffect = Array.isArray(asset.AllowEffect) ? [...asset.AllowEffect] : []; - CommonArrayConcatDedupe(asset.AllowEffect, ["Egged", "Vibrating"]); - if (options.includes(VibratorModeSet.ADVANCED)) { - CommonArrayConcatDedupe(asset.AllowEffect, ["Edged"]); - } -} - -/** - * Sets the Effect property for a vibrating item - * @param {VibratingItemData} data - The vibrating item data for the asset - * @returns {void} - Nothing - */ -function VibratorModeSetEffect({asset}) { - asset.Effect = Array.isArray(asset.Effect) ? [...asset.Effect] : []; - CommonArrayConcatDedupe(asset.Effect, ["Egged"]); -} - -/** - * Common load function for vibrators - * @param {VibratorModeSet[]} [Options] - The vibrator mode sets to load the item with - * @returns {void} - Nothing - */ -function VibratorModeLoad(Options) { - var Property = DialogFocusItem.Property; - if (!Property || !Property.Mode) { - Options = (Options && Options.length) ? Options : [VibratorModeSet.STANDARD]; - var FirstOption = VibratorModeOptions[Options[0]][0] || VibratorModeOptions[VibratorModeSet.STANDARD][0]; - VibratorModeSetProperty(DialogFocusItem, FirstOption.Property); - var C = CharacterGetCurrent(); - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, DialogFocusItem.Asset.Group.Name); - } -} - -/** - * Common draw function for vibrators - * @param {VibratorModeSet[]} Options - The vibrator mode sets to draw for the item - * @returns {void} - Nothing - */ -function VibratorModeDraw(Options) { - VibratorModeDrawHeader(); - VibratorModeDrawControls(Options); -} - -/** - * Common draw function for drawing the header of the extended item menu screen for a vibrator - * @returns {void} - Nothing - */ -function VibratorModeDrawHeader() { - const Asset = DialogFocusItem.Asset; - const Vibrating = DialogFocusItem.Property && DialogFocusItem.Property.Intensity != null && DialogFocusItem.Property.Intensity >= 0; - const Locked = InventoryItemHasEffect(DialogFocusItem, "Lock", true); - DrawAssetPreview(1387, 100, Asset, { Vibrating, Icons: Locked ? ["Locked"] : undefined }); -} - -/** - * Common draw function for drawing the control sets of the extended item menu screen for a vibrator - * @param {VibratorModeSet[]} Options - The vibrator mode sets to draw for the item - * @param {number} [Y] - The y-coordinate at which to start drawing the controls - * @returns {void} - Nothing - */ -function VibratorModeDrawControls(Options, Y) { - Y = typeof Y === "number" ? Y : 450; - let C = CharacterGetCurrent(); - Options = Options || [VibratorModeSet.STANDARD]; - var Property = DialogFocusItem.Property; - if (Property == null) return; - var ItemIntensity = DialogFindPlayer("Intensity" + Property.Intensity.toString()).replace("Item", DialogFocusItem.Asset.Description); - DrawText(ItemIntensity, 1500, Y, "white", "gray"); - - Options.forEach((OptionName) => { - var OptionGroup = VibratorModeOptions[OptionName]; - OptionGroup.forEach((Option, I) => { - var X = 1175 + (I % 3) * 225; - if (I % 3 === 0) Y += 75; - var Color = Property.Mode === Option.Property.Mode ? "#888" : (!(OptionName == VibratorModeSet.ADVANCED && C.ArousalSettings && C.ArousalSettings.DisableAdvancedVibes) ? "White" : "Pink"); - DrawButton(X, Y, 200, 55, DialogFindPlayer(Option.Name), Color); - }); - Y += 40; - }); -} - -/** - * Common click function for vibrators - * @param {VibratorModeSet[]} Options - The vibrator mode sets for the item - * @param {number} [Y] - The y-coordinate at which the extended item controls were drawn - * @returns {void} - Nothing - */ -function VibratorModeClick(Options, Y) { - Y = typeof Y === "number" ? Y : 450; - let C = CharacterGetCurrent(); - // Exit Button - if (MouseIn(1885, 25, 90, 85)) DialogFocusItem = null; - - Options.some((OptionName) => { - var OptionGroup = VibratorModeOptions[OptionName]; - var Handled = OptionGroup.some((Option, I) => { - var X = 1175 + (I % 3) * 225; - if (I % 3 === 0) Y += 75; - if (MouseIn(X, Y, 200, 55)) { - if ((Option.Property != null) && (DialogFocusItem.Property != null) && (Option.Property.Mode !== DialogFocusItem.Property.Mode) && !(OptionName == VibratorModeSet.ADVANCED && C.ArousalSettings && C.ArousalSettings.DisableAdvancedVibes)) - VibratorModeSetMode(Option); - return true; - } - }); - Y += 40; - return Handled; - }); -} - -/** - * Gets a vibrator mode from VibratorModeOptions - * @param {VibratorMode} ModeName - The name of the mode from VibratorMode, e.g. VibratorMode.OFF - * @returns {ExtendedItemOption} - The option gotten - */ -function VibratorModeGetOption(ModeName) { - var result = null; - - [VibratorModeSet.STANDARD, VibratorModeSet.ADVANCED].some((OptionName) => { - var OptionGroup = VibratorModeOptions[OptionName]; - var Handled = OptionGroup.some((Option, I) => { - if ((Option.Property != null) && (Option.Property.Mode == ModeName)) { - result = Option; - return true; - } - return false; - }); - return Handled; - }); - - if (result) return result; - return VibratorModeOptions.Standard[0]; - -} - - - -/** - * Sets a new mode for a vibrating item and publishes a corresponding chatroom message - * @param {ExtendedItemOption} Option - The extended item option defining the new mode to be set - * @returns {void} - Nothing - */ -function VibratorModeSetMode(Option) { - var C = CharacterGetCurrent(); - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - var OldIntensity = DialogFocusItem.Property.Intensity; - VibratorModeSetProperty(DialogFocusItem, Option.Property); - CharacterRefresh(C); - ChatRoomCharacterItemUpdate(C, C.FocusGroup.Name); - - var Message; - /** @type {ChatMessageDictionary} */ - var Dictionary = [ - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name }, - ]; - - if (DialogFocusItem.Property.Intensity !== OldIntensity) { - var Direction = DialogFocusItem.Property.Intensity > OldIntensity ? "Increase" : "Decrease"; - Message = "Vibe" + Direction + "To" + DialogFocusItem.Property.Intensity; - } else { - Message = "VibeModeChange"; - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - } - - ChatRoomPublishCustomAction(Message, false, Dictionary); -} - - - -/** - * Helper function to set dynamic properties on an item - * @param {object} Property - The Property object to initialise - * @returns {void} - Nothing - */ -function VibratorModeSetDynamicProperties(Property) { - const NewProperty = Object.assign({}, Property); - if (typeof NewProperty.Intensity === "function") NewProperty.Intensity = NewProperty.Intensity(); - if (typeof NewProperty.Effect === "function") NewProperty.Effect = NewProperty.Effect(NewProperty.Intensity); - else NewProperty.Effect = JSON.parse(JSON.stringify(Property.Effect || [])); - return NewProperty; -} - -/** - * Common dynamic script draw function for vibrators. This function is called every frame. TO make use of dynamic script draw on vibrators, - * ensure your item has a `AssetsScriptDraw` function defined that calls this function, and that your asset - * definition in Female3DCG.js has `DynamicScriptDraw: true` set. See the Heart Piercings for examples. - * @type {DynamicScriptDrawCallback} - */ -function VibratorModeScriptDraw(Data) { - var C = Data.C; - // Only run vibrator updates on the player and NPCs - if (C.ID !== 0 && C.MemberNumber !== null) return; - - var Item = Data.Item; - // No need to update the vibrator if it has no mode - if (!Item.Property || !Item.Property.Mode) return; - - var PersistentData = Data.PersistentData(); - var ModeChanged = Item.Property.Mode !== PersistentData.Mode; - if (ModeChanged || typeof PersistentData.ChangeTime !== "number") PersistentData.ChangeTime = CommonTime() + 60000; - if (ModeChanged || typeof PersistentData.LastChange !== "number") PersistentData.LastChange = CommonTime(); - if (ModeChanged) PersistentData.Mode = Item.Property.Mode; - - if (CommonTime() > PersistentData.ChangeTime) { - CommonCallFunctionByName("VibratorModeUpdate" + Item.Property.Mode, Item, C, PersistentData); - PersistentData.Mode = Item.Property.Mode; - } -} - -/** - * Vibrator update function for the Random mode - * @param {Item} Item - The item that is being updated - * @param {Character} C - The character that the item is equipped on - * @param {object} PersistentData - Persistent animation data for the item - * @returns {void} - Nothing - */ -function VibratorModeUpdateRandom(Item, C, PersistentData) { - var OneMinute = 60000; - var OldIntensity = Item.Property.Intensity; - var Intensity = CommonRandomItemFromList(OldIntensity, [-1, 0, 1, 2, 3]); - var Effect = Intensity === -1 ? ["Egged"] : ["Egged", "Vibrating"]; - VibratorModeSetProperty(Item, { Intensity, Effect }); - // Next update in 1-3 minutes - PersistentData.ChangeTime = Math.floor(CommonTime() + OneMinute + Math.random() * 2 * OneMinute); - VibratorModePublish(C, Item, OldIntensity, Intensity); -} - -/** - * Vibrator update function for the Escalate mode - * @param {Item} Item - The item that is being updated - * @param {Character} C - The character that the item is equipped on - * @param {object} PersistentData - Persistent animation data for the item - * @returns {void} - Nothing - */ -function VibratorModeUpdateEscalate(Item, C, PersistentData) { - var OldIntensity = Item.Property.Intensity; - var Intensity = (OldIntensity + 1) % 4; - // As intensity increases, time between updates decreases - var TimeFactor = Math.pow((5 - Intensity), 1.8); - var TimeToNextUpdate = (8000 + Math.random() * 4000) * TimeFactor; - VibratorModeSetProperty(Item, { Intensity, Effect: ["Egged", "Vibrating"] }); - PersistentData.ChangeTime = Math.floor(CommonTime() + TimeToNextUpdate); - VibratorModePublish(C, Item, OldIntensity, Intensity); -} - -/** - * Vibrator update function for the Tease mode - * @param {Item} Item - The item that is being updated - * @param {Character} C - The character that the item is equipped on - * @param {object} PersistentData - Persistent animation data for the item - * @returns {void} - Nothing - */ -function VibratorModeUpdateTease(Item, C, PersistentData) { - // Tease mode allows orgasm and denial states once arousal gets high enough - VibratorModeUpdateStateBased(Item, C, PersistentData, [VibratorModeState.DENY, VibratorModeState.ORGASM]); -} - -/** - * Vibrator update function for the Deny mode - * @param {Item} Item - The item that is being updated - * @param {Character} C - The character that the item is equipped on - * @param {object} PersistentData - Persistent animation data for the item - * @returns {void} - Nothing - */ -function VibratorModeUpdateDeny(Item, C, PersistentData) { - // Deny mode only allows the denial state on high arousal - VibratorModeUpdateStateBased(Item, C, PersistentData, [VibratorModeState.DENY]); -} - -/** - * Vibrator update function for the Edge mode - * @param {Item} Item - The item that is being updated - * @param {Character} C - The character that the item is equipped on - * @param {object} PersistentData - Persistent animation data for the item - * @returns {void} - Nothing - */ -function VibratorModeUpdateEdge(Item, C, PersistentData) { - var OneMinute = 60000; - var OldIntensity = Item.Property.Intensity; - var Intensity = Math.min(Item.Property.Intensity + 1, 3); - VibratorModeSetProperty(Item, { Intensity, Effect: ["Egged", "Vibrating", "Edged"] }); - if (Intensity === 3) { - // If we've hit max intensity, no more changes needed - PersistentData.ChangeTime = Infinity; - } else { - // Next update 1-2 minutes from now - PersistentData.ChangeTime = Math.floor(CommonTime() + OneMinute + Math.random() * OneMinute); - } - VibratorModePublish(C, Item, OldIntensity, Intensity); -} - -/** - * Vibrator update function for vibrator state machine modes - * @param {Item} Item - The item that is being updated - * @param {Character} C - The character that the item is equipped on - * @param {object} PersistentData - Persistent animation data for the item - * @param {VibratorModeState[]} TransitionsFromDefault - The possible vibrator states that may be transitioned to from - * the default state - * @returns {void} - Nothing - */ -function VibratorModeUpdateStateBased(Item, C, PersistentData, TransitionsFromDefault) { - var Arousal = C.ArousalSettings.Progress; - var TimeSinceLastChange = CommonTime() - PersistentData.LastChange; - var OldState = Item.Property.State || VibratorModeState.DEFAULT; - var OldIntensity = Item.Property.Intensity; - - var NewStateAndIntensity = CommonCallFunctionByName( - "VibratorModeStateUpdate" + OldState, - C, - Arousal, - TimeSinceLastChange, - OldIntensity, - TransitionsFromDefault - ); - var State = NewStateAndIntensity.State; - var Intensity = NewStateAndIntensity.Intensity; - - if (!State) State = VibratorModeState.DEFAULT; - if (typeof Intensity !== "number" || Intensity < -1 || Intensity > 3) Intensity = OldIntensity; - - var Effect = ["Egged"]; - if (State === VibratorModeState.DENY || Item.Property.Mode === VibratorMode.DENY) Effect.push("Edged"); - if (Intensity !== -1) Effect.push("Vibrating"); - - VibratorModeSetProperty(Item, { State, Intensity, Effect }); - Object.assign(PersistentData, { - ChangeTime: CommonTime() + 5000, - LastChange: Intensity !== OldIntensity ? CommonTime() : PersistentData.LastChange, - }); - - VibratorModePublish(C, Item, OldIntensity, Intensity); -} - -/** - * Vibrator update function for vibrator state machine modes in the Default state - * @param {Character} C - The character that the item is equipped on - * @param {number} Arousal - The current arousal of the character - * @param {number} TimeSinceLastChange - The time in milliseconds since the vibrator intensity was last changed - * @param {VibratorIntensity} OldIntensity - The current intensity of the vibrating item - * @param {VibratorModeState[]} TransitionsFromDefault - The possible vibrator states that may be transitioned to from - * the default state - * @returns {StateAndIntensity} - The updated state and intensity of the vibrator - */ -function VibratorModeStateUpdateDefault(C, Arousal, TimeSinceLastChange, OldIntensity, TransitionsFromDefault) { - var OneMinute = 60000; - /** @type {VibratorModeState} */ - var State = VibratorModeState.DEFAULT; - var Intensity = OldIntensity; - // If arousal is high, decide whether to deny or orgasm, based on provided transitions - if (Arousal > 90) State = CommonRandomItemFromList(VibratorModeState.DEFAULT, TransitionsFromDefault); - // If it's been at least a minute since the last intensity change, there's a small chance to change intensity - if (TimeSinceLastChange > OneMinute && Math.random() < 0.1) Intensity = CommonRandomItemFromList(OldIntensity, [0, 1, 2, 3]); - return { State, Intensity }; -} - -/** - * Vibrator update function for vibrator state machine modes in the Deny state - * @param {Character} C - The character that the item is equipped on - * @param {number} Arousal - The current arousal of the character - * @param {number} TimeSinceLastChange - The time in milliseconds since the vibrator intensity was last changed - * @param {VibratorIntensity} OldIntensity - The current intensity of the vibrating item - * the default state - * @returns {StateAndIntensity} - The updated state and intensity of the vibrator - */ -function VibratorModeStateUpdateDeny(C, Arousal, TimeSinceLastChange, OldIntensity) { - var OneMinute = 60000; - /** @type {VibratorModeState} */ - var State = VibratorModeState.DENY; - var Intensity = OldIntensity; - if (Arousal >= 95 && TimeSinceLastChange > OneMinute && Math.random() < 0.2) { - if (Player.IsEdged()) { - // In deny mode, there's a small chance to change to give a fake orgasm and then go to rest mode after a minute - // Here we give the fake orgasm, passing a special parameter that indicates we bypass the usual restriction on Edge - ActivityOrgasmPrepare(C, true); - } - - // Set the vibrator to rest - State = VibratorModeState.REST; - Intensity = -1; - } else if (Arousal >= 95) { - // If arousal is too high, change intensity back down to tease - Intensity = 0; - } else if (TimeSinceLastChange > OneMinute && Math.random() < 0.1) { - // Otherwise, there's a small chance to change intensity if it's been more than a minute since the last change - Intensity = CommonRandomItemFromList(OldIntensity, [0, 1, 2, 3]); - } - return { State, Intensity }; -} - -/** - * Vibrator update function for vibrator state machine modes in the Orgasm state - * @param {Character} C - The character that the item is equipped on - * @param {number} Arousal - The current arousal of the character - * @param {number} TimeSinceLastChange - The time in milliseconds since the vibrator intensity was last changed - * @param {VibratorIntensity} OldIntensity - The current intensity of the vibrating item - * the default state - * @returns {StateAndIntensity} - The updated state and intensity of the vibrator - */ -function VibratorModeStateUpdateOrgasm(C, Arousal, TimeSinceLastChange, OldIntensity) { - var OneMinute = 60000; - /** @type {VibratorModeState} */ - var State = VibratorModeState.ORGASM; - var Intensity = OldIntensity; - if (C.ArousalSettings.OrgasmStage > 0) { - // If we're in orgasm mode and the player is either resisting or mid-orgasm, change back to either rest or default mode - State = Math.random() < 0.75 ? VibratorModeState.REST : VibratorModeState.DEFAULT; - } else if (TimeSinceLastChange > OneMinute && Math.random() < 0.1) { - // Otherwise, if it's been over a minute since the last intensity change, there's a small chance to change intensity - Intensity = CommonRandomItemFromList(OldIntensity, [0, 1, 2, 3]); - } - return { State, Intensity }; -} - -/** - * Vibrator update function for vibrator state machine modes in the Rest state - * @param {Character} C - The character that the item is equipped on - * @param {number} Arousal - The current arousal of the character - * @param {number} TimeSinceLastChange - The time in milliseconds since the vibrator intensity was last changed - * @param {VibratorIntensity} OldIntensity - The current intensity of the vibrating item - * the default state - * @returns {StateAndIntensity} - The updated state and intensity of the vibrator - */ -function VibratorModeStateUpdateRest(C, Arousal, TimeSinceLastChange, OldIntensity) { - var FiveMinutes = 5 * 60000; - var TenMinutes = 10 * 60000; - /** @type {VibratorModeState} */ - var State = VibratorModeState.REST; - /** @type {VibratorIntensity} */ - var Intensity = -1; - if (TimeSinceLastChange > FiveMinutes && Math.random() < Math.pow((TimeSinceLastChange - FiveMinutes) / TenMinutes, 2)) { - // Rest between 5 and 15 minutes (probably of change gets increasingly more likely as time approaches 15 minutes) - State = VibratorModeState.DEFAULT; - Intensity = CommonRandomItemFromList(OldIntensity, [0, 1, 2, 3]); - } - return { State, Intensity }; -} - -/** - * Correctly sets the Property on a vibrator according to the new property. This function preserves persistent effects on the item like lock - * effects. - * @param {Item} Item - The item on which to set the new properties - * @param {object} Property - The new properties to set. The Property object may include dynamic setter functions - * @returns {void} - Nothing - */ -function VibratorModeSetProperty(Item, Property) { - Property = VibratorModeSetDynamicProperties(Property); - if (Item.Property && Array.isArray(Item.Property.Effect)) { - Item.Property.Effect.forEach(Effect => { - if (!["Egged", "Vibrating", "Edged"].includes(Effect)) { - Property.Effect.push(Effect); - } - }); - } - Item.Property = Object.assign({}, Item.Property, Property); -} - -/** - * Publishes a chatroom message for an automatic change in vibrator intensity. Does nothing if the vibrator's intensity - * did not change. - * @param {Character} C - The character that the vibrator is equipped on - * @param {Item} Item - The vibrator item - * @param {number} OldIntensity - The previous intensity of the vibrator - * @param {number} Intensity - The new intensity of the vibrator - * @returns {void} - Nothing - */ -function VibratorModePublish(C, Item, OldIntensity, Intensity) { - // If the intensity hasn't changed, don't publish a chat message - if (OldIntensity === Intensity) return; - - var Direction = Intensity > OldIntensity ? "Increase" : "Decrease"; - /** @type {ChatMessageDictionary} */ - var Dictionary = [ - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "AssetName", AssetName: Item.Asset.Name }, - { Automatic: true }, - ]; - if (Item.Property.ItemMemberNumber) Dictionary.push({ Tag: "ItemMemberNumber", MemberNumber: Item.Property.ItemMemberNumber }); - if (CurrentScreen == "ChatRoom") { - ServerSend("ChatRoomChat", { Content: "Vibe" + Direction + "To" + Intensity, Type: "Action", Dictionary }); - CharacterLoadEffect(C); - ChatRoomCharacterItemUpdate(C, Item.Asset.Group.Name); - ActivityChatRoomArousalSync(C); - } -} diff --git a/Scripts/lib/LZString.js b/Scripts/lib/LZString.js index 04c37cbd7..e4257e470 100644 --- a/Scripts/lib/LZString.js +++ b/Scripts/lib/LZString.js @@ -7,13 +7,13 @@ // http://pieroxy.net/blog/pages/lz-string/testing.html // // LZ-based compression algorithm, version 1.4.4 -var LZString = (function() { +let LZString = (function() { // private property -var f = String.fromCharCode; -var keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; -var keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$"; -var baseReverseDic = {}; +let f = String.fromCharCode; +let keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; +let keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$"; +let baseReverseDic = {}; function getBaseValue(alphabet, character) { if (!baseReverseDic[alphabet]) { @@ -25,10 +25,10 @@ function getBaseValue(alphabet, character) { return baseReverseDic[alphabet][character]; } -var LZString = { +let LZString = { compressToBase64 : function (input) { if (input == null) return ""; - var res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);}); + let res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);}); switch (res.length % 4) { // To produce valid Base64 default: // When could this happen ? case 0 : return res; @@ -57,11 +57,11 @@ var LZString = { //compress into uint8array (UCS-2 big endian format) compressToUint8Array: function (uncompressed) { - var compressed = LZString.compress(uncompressed); - var buf=new Uint8Array(compressed.length*2); // 2 bytes per character + let compressed = LZString.compress(uncompressed); + let buf=new Uint8Array(compressed.length*2); // 2 bytes per character for (let i=0, TotalLen=compressed.length; i>> 8; buf[i*2+1] = current_value % 256; } @@ -73,12 +73,12 @@ var LZString = { if (compressed===null || compressed===undefined){ return LZString.decompress(compressed); } else { - var buf=new Array(compressed.length/2); // 2 bytes per character + let buf=new Array(compressed.length/2); // 2 bytes per character for (let i=0, TotalLen=buf.length; i. */ -/** @type {function ()} */ -var guessLanguage = null; + +// /** @type {GuessLanguage} */ +// let guessLanguage = null; (function (global, undefined) { - guessLanguage = function () { + let guessLanguage = function () { - var models = global._languageData || {}; + let models = global._languageData || {}; if (typeof module === "object" && module.exports === global) { models = require('./_languageData') || {}; } - var MAX_LENGTH = 4096; - var MIN_LENGTH = 20; - var MAX_GRAMS = 300; + let MAX_LENGTH = 4096; + let MIN_LENGTH = 20; + let MAX_GRAMS = 300; - var NAME_MAP = { + let NAME_MAP = { "ab": "Abkhazian", "af": "Afrikaans", "ar": "Arabic", @@ -149,7 +150,7 @@ var guessLanguage = null; "zu": "Zulu" }; - var IANA_MAP = { + let IANA_MAP = { "ab": 12026, "af": 40, "ar": 26020, @@ -240,7 +241,7 @@ var guessLanguage = null; "zh-TW": 22 }; - var SINGLETONS = [ + let SINGLETONS = [ ["Armenian", "hy"], ["Hebrew", "he"], ["Bengali", "bn"], @@ -263,18 +264,18 @@ var guessLanguage = null; ["Pahawh Hmong", "hmn"] ]; - var UNKNOWN = 'unknown'; + let UNKNOWN = 'unknown'; - var BASIC_LATIN = ["en", "ceb", "ha", "so", "tlh", "id", "haw", "la", "sw", "eu", "nr", "nso", "zu", "xh", "ss", "st", "tn", "ts"]; - var EXTENDED_LATIN = ["cs", "af", "pl", "hr", "ro", "sk", "sl", "tr", "hu", "az", "et", "sq", "ca", "es", "fr", "de", "nl", "it", "da", "is", "no", "sv", "fi", "lv", "pt", "ve", "lt", "tl", "cy", "vi"]; - var ALL_LATIN = BASIC_LATIN.concat(EXTENDED_LATIN); - var CYRILLIC = ["ru", "uk", "kk", "uz", "mn", "sr", "mk", "bg", "ky"]; - var ARABIC = ["ar", "fa", "ps", "ur"]; - var DEVANAGARI = ["hi", "ne"]; - var PT = ["pt-BR", "pt-PT"]; + let BASIC_LATIN = ["en", "ceb", "ha", "so", "tlh", "id", "haw", "la", "sw", "eu", "nr", "nso", "zu", "xh", "ss", "st", "tn", "ts"]; + let EXTENDED_LATIN = ["cs", "af", "pl", "hr", "ro", "sk", "sl", "tr", "hu", "az", "et", "sq", "ca", "es", "fr", "de", "nl", "it", "da", "is", "no", "sv", "fi", "lv", "pt", "ve", "lt", "tl", "cy", "vi"]; + let ALL_LATIN = BASIC_LATIN.concat(EXTENDED_LATIN); + let CYRILLIC = ["ru", "uk", "kk", "uz", "mn", "sr", "mk", "bg", "ky"]; + let ARABIC = ["ar", "fa", "ps", "ur"]; + let DEVANAGARI = ["hi", "ne"]; + let PT = ["pt-BR", "pt-PT"]; // Unicode char greedy regex block range matchers - var unicodeBlockTests = { + let unicodeBlockTests = { "Basic Latin": /[\u0000-\u007F]/g, "Latin-1 Supplement": /[\u0080-\u00FF]/g, "Latin Extended-A": /[\u0100-\u017F]/g, @@ -406,17 +407,17 @@ var guessLanguage = null; function findRuns(text) { - var relevantRuns = {}; + let relevantRuns = {}; - for (var key in unicodeBlockTests) { + for (let key in unicodeBlockTests) { // Count the number of characters in each character block. - var charCount = text.match(unicodeBlockTests[key]); + let charCount = text.match(unicodeBlockTests[key]); // return run types that used for 40% or more of the string // always return basic latin if found more than 15% // and extended additional latin if over 10% (for Vietnamese) - var pct = (charCount ? charCount.length : 0) / text.length; + let pct = (charCount ? charCount.length : 0) / text.length; relevantRuns[key] = pct; @@ -427,7 +428,7 @@ var guessLanguage = null; function identify(text) { - var scripts = findRuns(text); + let scripts = findRuns(text); // Identify the language. if (scripts["Hangul Syllables"] + scripts["Hangul Jamo"] + scripts["Hangul Compatibility Jamo"] >= 0.4) { @@ -466,7 +467,7 @@ var guessLanguage = null; } // Try languages with unique scripts - for (var i = 0, l = SINGLETONS.length; i < l; i++) { + for (let i = 0, l = SINGLETONS.length; i < l; i++) { if (scripts[SINGLETONS[i][0]] >= 0.4) { // callback.apply(undefined, [SINGLETONS[i][1]]); return SINGLETONS[i][1]; @@ -482,7 +483,7 @@ var guessLanguage = null; // callback.apply(undefined, [latinLang]); // } // }); - var latinLang = check(text, EXTENDED_LATIN); + let latinLang = check(text, EXTENDED_LATIN); if (latinLang === "pt") { return check(text, PT); } else { @@ -507,13 +508,13 @@ var guessLanguage = null; // return; // } // - // var scores = {}; - // var model = createOrderedModel(sample); - // for (var i = 0, l = langs.length; i < l; i++) { + // let scores = {}; + // let model = createOrderedModel(sample); + // for (let i = 0, l = langs.length; i < l; i++) { // - // var lkey = langs[i].toLowerCase(); + // let lkey = langs[i].toLowerCase(); // - // var knownModel = createKnownModel(lkey) || null; + // let knownModel = createKnownModel(lkey) || null; // // if (!knownModel) { // continue; @@ -523,8 +524,8 @@ var guessLanguage = null; // // } // - // var scoresArr = []; - // for (var index in scores) { + // let scoresArr = []; + // for (let index in scores) { // scoresArr.push([index, scores[index]]); // } // @@ -534,7 +535,7 @@ var guessLanguage = null; // } // // // we want the lowest score, less distance = greater chance of match - // var sortedScores = scoresArr.sort(function (objA, objB) { + // let sortedScores = scoresArr.sort(function (objA, objB) { // return objA[1] - objB[1]; // sort low-to-high // }); // @@ -548,13 +549,13 @@ var guessLanguage = null; return UNKNOWN; } - var scores = {}; - var model = createOrderedModel(sample); - for (var i = 0, l = langs.length; i < l; i++) { + let scores = {}; + let model = createOrderedModel(sample); + for (let i = 0, l = langs.length; i < l; i++) { - var lkey = langs[i].toLowerCase(); + let lkey = langs[i].toLowerCase(); - var knownModel = createKnownModel(lkey) || null; + let knownModel = createKnownModel(lkey) || null; if (!knownModel) { continue; @@ -564,8 +565,8 @@ var guessLanguage = null; } - var scoresArr = []; - for (var index in scores) { + let scoresArr = []; + for (let index in scores) { scoresArr.push([index, scores[index]]); } @@ -575,7 +576,7 @@ var guessLanguage = null; } // we want the lowest score, less distance = greater chance of match - var sortedScores = scoresArr.sort(function (objA, objB) { + let sortedScores = scoresArr.sort(function (objA, objB) { return objA[1] - objB[1]; // sort low-to-high }); @@ -586,13 +587,13 @@ var guessLanguage = null; function createOrderedModel(content) { // Create a list of trigrams in content sorted by frequency. - var trigrams = {}, + let trigrams = {}, sortedTrigrams = []; - var content = content.toLowerCase(); + content = content.toLowerCase(); - var contentArr = content.split(""); - for (var i = 0, l = contentArr.length - 2; i < l; i++) { - var trigramKey = contentArr[i] + contentArr[i + 1] + contentArr[i + 2] + ""; + let contentArr = content.split(""); + for (let i = 0, l = contentArr.length - 2; i < l; i++) { + let trigramKey = contentArr[i] + contentArr[i + 1] + contentArr[i + 2] + ""; if (!trigrams[trigramKey]) { trigrams[trigramKey] = 1; } else { @@ -601,7 +602,7 @@ var guessLanguage = null; } // convert object to array - for (var i in trigrams) { + for (let i in trigrams) { sortedTrigrams[sortedTrigrams.length] = [i, trigrams[i]]; } @@ -611,7 +612,7 @@ var guessLanguage = null; }); } - var knownModelCache = {}; + let knownModelCache = {}; function createKnownModel(key) { // Check if known model has been pre-computed in cache @@ -619,16 +620,16 @@ var guessLanguage = null; return knownModelCache[key]; } - var data = models[key]; + let data = models[key]; if (!data) { return {}; } // Extract known trigram model data - var dataArr = data.match(/([\s\S]{1,3})/g); + let dataArr = data.match(/([\s\S]{1,3})/g); // Contruct known trigram object based on provided raw data - var knownModel = {}; - for (var i = 0, l = dataArr.length; i < l; i++) { + let knownModel = {}; + for (let i = 0, l = dataArr.length; i < l; i++) { knownModel[dataArr[i]] = i; } @@ -640,9 +641,9 @@ var guessLanguage = null; function distance(model, knownModel) { // Calculate the distance to the known model. - var dist = 0; + let dist = 0; - for (var i = 0, l = model.length; i < l; i++) { + for (let i = 0, l = model.length; i < l; i++) { if (knownModel[model[i][0]]) { @@ -659,7 +660,11 @@ var guessLanguage = null; return dist; } + /** + * @typedef {Object} GuessLanguage + */ return { + /** @function */ detect: function (text) { // Return the ISO 639-2 language identifier, i.e. 'en'. @@ -673,6 +678,7 @@ var guessLanguage = null; return identify(text); }, + /** @function */ info: function (text) { // Return language info tuple (id, code, name), i.e. ('en', 26110, 'English'). @@ -686,7 +692,7 @@ var guessLanguage = null; // ]); // }); - var language = this.detect(text); + let language = this.detect(text); if (language === UNKNOWN) { return [UNKNOWN, UNKNOWN, UNKNOWN]; } @@ -694,6 +700,7 @@ var guessLanguage = null; }, + /** @function */ code: function (text) { // Return the language IANA code, i.e. 26110. @@ -707,13 +714,14 @@ var guessLanguage = null; // ]); // }); - var language = this.detect(text); + let language = this.detect(text); if (language === UNKNOWN) { return [-1]; } return IANA_MAP[language]; }, + /** @function */ name: function (text) { // Return the full language name, i.e. 'English'. @@ -727,7 +735,7 @@ var guessLanguage = null; // ]); // }); - var language = this.detect(text); + let language = this.detect(text); if (language === UNKNOWN) { return UNKNOWN; } diff --git a/Scripts/lib/pixi-filters.js b/Scripts/lib/pixi-filters.js new file mode 100644 index 000000000..1be5550a8 --- /dev/null +++ b/Scripts/lib/pixi-filters.js @@ -0,0 +1,2065 @@ +/*! + * pixi-filters - v5.2.0 + * Compiled Tue, 28 Feb 2023 14:24:35 UTC + * + * pixi-filters is licensed under the MIT License. + * http://www.opensource.org/licenses/mit-license + */var __filters=function(f,a,Pe,I){"use strict";var Me=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,De=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + + uniform float gamma; + uniform float contrast; + uniform float saturation; + uniform float brightness; + uniform float red; + uniform float green; + uniform float blue; + uniform float alpha; + + void main(void) + { + vec4 c = texture2D(uSampler, vTextureCoord); + + if (c.a > 0.0) { + c.rgb /= c.a; + + vec3 rgb = pow(c.rgb, vec3(1. / gamma)); + rgb = mix(vec3(.5), mix(vec3(dot(vec3(.2125, .7154, .0721), rgb)), rgb, saturation), contrast); + rgb.r *= red; + rgb.g *= green; + rgb.b *= blue; + c.rgb = rgb * brightness; + + c.rgb *= c.a; + } + + gl_FragColor = c * alpha; + } + `;class ke extends a.Filter{constructor(e){super(Me,De),this.gamma=1,this.saturation=1,this.contrast=1,this.brightness=1,this.red=1,this.green=1,this.blue=1,this.alpha=1,Object.assign(this,e)}apply(e,r,i,o){this.uniforms.gamma=Math.max(this.gamma,1e-4),this.uniforms.saturation=this.saturation,this.uniforms.contrast=this.contrast,this.uniforms.brightness=this.brightness,this.uniforms.red=this.red,this.uniforms.green=this.green,this.uniforms.blue=this.blue,this.uniforms.alpha=this.alpha,e.applyFilter(this,r,i,o)}}var Oe=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Re=` + varying vec2 vTextureCoord; + uniform sampler2D uSampler; + + uniform vec2 uOffset; + + void main(void) + { + vec4 color = vec4(0.0); + + // Sample top left pixel + color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y)); + + // Sample top right pixel + color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y)); + + // Sample bottom right pixel + color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y)); + + // Sample bottom left pixel + color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y)); + + // Average + color *= 0.25; + + gl_FragColor = color; + }`,Ee=` + varying vec2 vTextureCoord; + uniform sampler2D uSampler; + + uniform vec2 uOffset; + uniform vec4 filterClamp; + + void main(void) + { + vec4 color = vec4(0.0); + + // Sample top left pixel + color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw)); + + // Sample top right pixel + color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw)); + + // Sample bottom right pixel + color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw)); + + // Sample bottom left pixel + color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw)); + + // Average + color *= 0.25; + + gl_FragColor = color; + } + `;class T extends a.Filter{constructor(e=4,r=3,i=!1){super(Oe,i?Ee:Re),this._kernels=[],this._blur=4,this._quality=3,this.uniforms.uOffset=new Float32Array(2),this._pixelSize=new a.Point,this.pixelSize=1,this._clamp=i,Array.isArray(e)?this.kernels=e:(this._blur=e,this.quality=r)}apply(e,r,i,o){const s=this._pixelSize.x/r._frame.width,n=this._pixelSize.y/r._frame.height;let l;if(this._quality===1||this._blur===0)l=this._kernels[0]+.5,this.uniforms.uOffset[0]=l*s,this.uniforms.uOffset[1]=l*n,e.applyFilter(this,r,i,o);else{const u=e.getFilterTexture();let h=r,p=u,S;const g=this._quality-1;for(let x=0;xe+r+.5,0))}_generateKernels(){const e=this._blur,r=this._quality,i=[e];if(e>0){let o=e;const s=e/r;for(let n=1;n0?(this._kernels=e,this._quality=e.length,this._blur=Math.max(...e)):(this._kernels=[0],this._quality=1)}get clamp(){return this._clamp}set pixelSize(e){typeof e=="number"?(this._pixelSize.x=e,this._pixelSize.y=e):Array.isArray(e)?(this._pixelSize.x=e[0],this._pixelSize.y=e[1]):e instanceof a.Point?(this._pixelSize.x=e.x,this._pixelSize.y=e.y):(this._pixelSize.x=1,this._pixelSize.y=1)}get pixelSize(){return this._pixelSize}get quality(){return this._quality}set quality(e){this._quality=Math.max(1,Math.round(e)),this._generateKernels()}get blur(){return this._blur}set blur(e){this._blur=e,this._generateKernels()}}var L=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,$e=` + uniform sampler2D uSampler; + varying vec2 vTextureCoord; + + uniform float threshold; + + void main() { + vec4 color = texture2D(uSampler, vTextureCoord); + + // A simple & fast algorithm for getting brightness. + // It's inaccuracy , but good enought for this feature. + float _max = max(max(color.r, color.g), color.b); + float _min = min(min(color.r, color.g), color.b); + float brightness = (_max + _min) * 0.5; + + if(brightness > threshold) { + gl_FragColor = color; + } else { + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); + } + } + `;class je extends a.Filter{constructor(e=.5){super(L,$e),this.threshold=e}get threshold(){return this.uniforms.threshold}set threshold(e){this.uniforms.threshold=e}}var Ie=`uniform sampler2D uSampler; + varying vec2 vTextureCoord; + + uniform sampler2D bloomTexture; + uniform float bloomScale; + uniform float brightness; + + void main() { + vec4 color = texture2D(uSampler, vTextureCoord); + color.rgb *= brightness; + vec4 bloomColor = vec4(texture2D(bloomTexture, vTextureCoord).rgb, 0.0); + bloomColor.rgb *= bloomScale; + gl_FragColor = color + bloomColor; + } + `;const V=class extends a.Filter{constructor(t){super(L,Ie),this.bloomScale=1,this.brightness=1,this._resolution=a.settings.FILTER_RESOLUTION,typeof t=="number"&&(t={threshold:t});const e=Object.assign(V.defaults,t);this.bloomScale=e.bloomScale,this.brightness=e.brightness;const{kernels:r,blur:i,quality:o,pixelSize:s,resolution:n}=e;this._extractFilter=new je(e.threshold),this._extractFilter.resolution=n,this._blurFilter=r?new T(r):new T(i,o),this.pixelSize=s,this.resolution=n}apply(t,e,r,i,o){const s=t.getFilterTexture();this._extractFilter.apply(t,e,s,1,o);const n=t.getFilterTexture();this._blurFilter.apply(t,s,n,1),this.uniforms.bloomScale=this.bloomScale,this.uniforms.brightness=this.brightness,this.uniforms.bloomTexture=n,t.applyFilter(this,e,r,i),t.returnFilterTexture(n),t.returnFilterTexture(s)}get resolution(){return this._resolution}set resolution(t){this._resolution=t,this._extractFilter&&(this._extractFilter.resolution=t),this._blurFilter&&(this._blurFilter.resolution=t)}get threshold(){return this._extractFilter.threshold}set threshold(t){this._extractFilter.threshold=t}get kernels(){return this._blurFilter.kernels}set kernels(t){this._blurFilter.kernels=t}get blur(){return this._blurFilter.blur}set blur(t){this._blurFilter.blur=t}get quality(){return this._blurFilter.quality}set quality(t){this._blurFilter.quality=t}get pixelSize(){return this._blurFilter.pixelSize}set pixelSize(t){this._blurFilter.pixelSize=t}};let N=V;N.defaults={threshold:.5,bloomScale:1,brightness:1,kernels:null,blur:8,quality:4,pixelSize:1,resolution:a.settings.FILTER_RESOLUTION};var Le=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Ve=`varying vec2 vTextureCoord; + + uniform vec4 filterArea; + uniform float pixelSize; + uniform sampler2D uSampler; + + vec2 mapCoord( vec2 coord ) + { + coord *= filterArea.xy; + coord += filterArea.zw; + + return coord; + } + + vec2 unmapCoord( vec2 coord ) + { + coord -= filterArea.zw; + coord /= filterArea.xy; + + return coord; + } + + vec2 pixelate(vec2 coord, vec2 size) + { + return floor(coord / size) * size; + } + + vec2 getMod(vec2 coord, vec2 size) + { + return mod(coord, size) / size; + } + + float character(float n, vec2 p) + { + p = floor(p*vec2(4.0, 4.0) + 2.5); + + if (clamp(p.x, 0.0, 4.0) == p.x) + { + if (clamp(p.y, 0.0, 4.0) == p.y) + { + if (int(mod(n/exp2(p.x + 5.0*p.y), 2.0)) == 1) return 1.0; + } + } + return 0.0; + } + + void main() + { + vec2 coord = mapCoord(vTextureCoord); + + // get the grid position + vec2 pixCoord = pixelate(coord, vec2(pixelSize)); + pixCoord = unmapCoord(pixCoord); + + // sample the color at grid position + vec4 color = texture2D(uSampler, pixCoord); + + // brightness of the color as it's perceived by the human eye + float gray = 0.3 * color.r + 0.59 * color.g + 0.11 * color.b; + + // determine the character to use + float n = 65536.0; // . + if (gray > 0.2) n = 65600.0; // : + if (gray > 0.3) n = 332772.0; // * + if (gray > 0.4) n = 15255086.0; // o + if (gray > 0.5) n = 23385164.0; // & + if (gray > 0.6) n = 15252014.0; // 8 + if (gray > 0.7) n = 13199452.0; // @ + if (gray > 0.8) n = 11512810.0; // # + + // get the mod.. + vec2 modd = getMod(coord, vec2(pixelSize)); + + gl_FragColor = color * character( n, vec2(-1.0) + modd * 2.0); + + } + `;class Ne extends a.Filter{constructor(e=8){super(Le,Ve),this.size=e}get size(){return this.uniforms.pixelSize}set size(e){this.uniforms.pixelSize=e}}var Ge=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Be=`precision mediump float; + + varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform vec4 filterArea; + + uniform float transformX; + uniform float transformY; + uniform vec3 lightColor; + uniform float lightAlpha; + uniform vec3 shadowColor; + uniform float shadowAlpha; + + void main(void) { + vec2 transform = vec2(1.0 / filterArea) * vec2(transformX, transformY); + vec4 color = texture2D(uSampler, vTextureCoord); + float light = texture2D(uSampler, vTextureCoord - transform).a; + float shadow = texture2D(uSampler, vTextureCoord + transform).a; + + color.rgb = mix(color.rgb, lightColor, clamp((color.a - light) * lightAlpha, 0.0, 1.0)); + color.rgb = mix(color.rgb, shadowColor, clamp((color.a - shadow) * shadowAlpha, 0.0, 1.0)); + gl_FragColor = vec4(color.rgb * color.a, color.a); + } + `;class Xe extends a.Filter{constructor(e){super(Ge,Be),this._thickness=2,this._angle=0,this.uniforms.lightColor=new Float32Array(3),this.uniforms.shadowColor=new Float32Array(3),Object.assign(this,{rotation:45,thickness:2,lightColor:16777215,lightAlpha:.7,shadowColor:0,shadowAlpha:.7},e),this.padding=1}_updateTransform(){this.uniforms.transformX=this._thickness*Math.cos(this._angle),this.uniforms.transformY=this._thickness*Math.sin(this._angle)}get rotation(){return this._angle/a.DEG_TO_RAD}set rotation(e){this._angle=e*a.DEG_TO_RAD,this._updateTransform()}get thickness(){return this._thickness}set thickness(e){this._thickness=e,this._updateTransform()}get lightColor(){return a.utils.rgb2hex(this.uniforms.lightColor)}set lightColor(e){a.utils.hex2rgb(e,this.uniforms.lightColor)}get lightAlpha(){return this.uniforms.lightAlpha}set lightAlpha(e){this.uniforms.lightAlpha=e}get shadowColor(){return a.utils.rgb2hex(this.uniforms.shadowColor)}set shadowColor(e){a.utils.hex2rgb(e,this.uniforms.shadowColor)}get shadowAlpha(){return this.uniforms.shadowAlpha}set shadowAlpha(e){this.uniforms.shadowAlpha=e}}class qe extends a.Filter{constructor(e=2,r=4,i=a.settings.FILTER_RESOLUTION,o=5){super();let s,n;typeof e=="number"?(s=e,n=e):e instanceof a.Point?(s=e.x,n=e.y):Array.isArray(e)&&(s=e[0],n=e[1]),this.blurXFilter=new I.BlurFilterPass(!0,s,r,i,o),this.blurYFilter=new I.BlurFilterPass(!1,n,r,i,o),this.blurYFilter.blendMode=a.BLEND_MODES.SCREEN,this.defaultFilter=new Pe.AlphaFilter}apply(e,r,i,o){const s=e.getFilterTexture();this.defaultFilter.apply(e,r,i,o),this.blurXFilter.apply(e,r,s,1),this.blurYFilter.apply(e,s,i,0),e.returnFilterTexture(s)}get blur(){return this.blurXFilter.blur}set blur(e){this.blurXFilter.blur=this.blurYFilter.blur=e}get blurX(){return this.blurXFilter.blur}set blurX(e){this.blurXFilter.blur=e}get blurY(){return this.blurYFilter.blur}set blurY(e){this.blurYFilter.blur=e}}var Ke=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,We=`uniform float radius; + uniform float strength; + uniform vec2 center; + uniform sampler2D uSampler; + varying vec2 vTextureCoord; + + uniform vec4 filterArea; + uniform vec4 filterClamp; + uniform vec2 dimensions; + + void main() + { + vec2 coord = vTextureCoord * filterArea.xy; + coord -= center * dimensions.xy; + float distance = length(coord); + if (distance < radius) { + float percent = distance / radius; + if (strength > 0.0) { + coord *= mix(1.0, smoothstep(0.0, radius / distance, percent), strength * 0.75); + } else { + coord *= mix(1.0, pow(percent, 1.0 + strength * 0.75) * radius / distance, 1.0 - percent); + } + } + coord += center * dimensions.xy; + coord /= filterArea.xy; + vec2 clampedCoord = clamp(coord, filterClamp.xy, filterClamp.zw); + vec4 color = texture2D(uSampler, clampedCoord); + if (coord != clampedCoord) { + color *= max(0.0, 1.0 - length(coord - clampedCoord)); + } + + gl_FragColor = color; + } + `;const G=class extends a.Filter{constructor(t){super(Ke,We),this.uniforms.dimensions=new Float32Array(2),Object.assign(this,G.defaults,t)}apply(t,e,r,i){const{width:o,height:s}=e.filterFrame;this.uniforms.dimensions[0]=o,this.uniforms.dimensions[1]=s,t.applyFilter(this,e,r,i)}get radius(){return this.uniforms.radius}set radius(t){this.uniforms.radius=t}get strength(){return this.uniforms.strength}set strength(t){this.uniforms.strength=t}get center(){return this.uniforms.center}set center(t){this.uniforms.center=t}};let B=G;B.defaults={center:[.5,.5],radius:100,strength:1};var Ye=`const float PI = 3.1415926538; + const float PI_2 = PI*2.; + + varying vec2 vTextureCoord; + varying vec2 vFilterCoord; + uniform sampler2D uSampler; + + const int TYPE_LINEAR = 0; + const int TYPE_RADIAL = 1; + const int TYPE_CONIC = 2; + const int MAX_STOPS = 32; + + uniform int uNumStops; + uniform float uAlphas[3*MAX_STOPS]; + uniform vec3 uColors[MAX_STOPS]; + uniform float uOffsets[MAX_STOPS]; + uniform int uType; + uniform float uAngle; + uniform float uAlpha; + uniform int uMaxColors; + + struct ColorStop { + float offset; + vec3 color; + float alpha; + }; + + mat2 rotate2d(float angle){ + return mat2(cos(angle), -sin(angle), + sin(angle), cos(angle)); + } + + float projectLinearPosition(vec2 pos, float angle){ + vec2 center = vec2(0.5); + vec2 result = pos - center; + result = rotate2d(angle) * result; + result = result + center; + return clamp(result.x, 0., 1.); + } + + float projectRadialPosition(vec2 pos) { + float r = distance(vFilterCoord, vec2(0.5)); + return clamp(2.*r, 0., 1.); + } + + float projectAnglePosition(vec2 pos, float angle) { + vec2 center = pos - vec2(0.5); + float polarAngle=atan(-center.y, center.x); + return mod(polarAngle + angle, PI_2) / PI_2; + } + + float projectPosition(vec2 pos, int type, float angle) { + if (type == TYPE_LINEAR) { + return projectLinearPosition(pos, angle); + } else if (type == TYPE_RADIAL) { + return projectRadialPosition(pos); + } else if (type == TYPE_CONIC) { + return projectAnglePosition(pos, angle); + } + + return pos.y; + } + + void main(void) { + // current/original color + vec4 currentColor = texture2D(uSampler, vTextureCoord); + + // skip calculations if gradient alpha is 0 + if (0.0 == uAlpha) { + gl_FragColor = currentColor; + return; + } + + // project position + float y = projectPosition(vFilterCoord, uType, radians(uAngle)); + + // check gradient bounds + float offsetMin = uOffsets[0]; + float offsetMax = 0.0; + + for (int i = 0; i < MAX_STOPS; i++) { + if (i == uNumStops-1){ // last index + offsetMax = uOffsets[i]; + } + } + + if (y < offsetMin || y > offsetMax) { + gl_FragColor = currentColor; + return; + } + + // limit colors + if (uMaxColors > 0) { + float stepSize = 1./float(uMaxColors); + float stepNumber = float(floor(y/stepSize)); + y = stepSize * (stepNumber + 0.5);// offset by 0.5 to use color from middle of segment + } + + // find color stops + ColorStop from; + ColorStop to; + + for (int i = 0; i < MAX_STOPS; i++) { + if (y >= uOffsets[i]) { + from = ColorStop(uOffsets[i], uColors[i], uAlphas[i]); + to = ColorStop(uOffsets[i+1], uColors[i+1], uAlphas[i+1]); + } + + if (i == uNumStops-1){ // last index + break; + } + } + + // mix colors from stops + vec4 colorFrom = vec4(from.color * from.alpha, from.alpha); + vec4 colorTo = vec4(to.color * to.alpha, to.alpha); + + float segmentHeight = to.offset - from.offset; + float relativePos = y - from.offset;// position from 0 to [segmentHeight] + float relativePercent = relativePos / segmentHeight;// position in percent between [from.offset] and [to.offset]. + + float gradientAlpha = uAlpha * currentColor.a; + vec4 gradientColor = mix(colorFrom, colorTo, relativePercent) * gradientAlpha; + + // mix resulting color with current color + gl_FragColor = gradientColor + currentColor*(1.-gradientColor.a); + } + `,Ue=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + uniform vec4 inputSize; + uniform vec4 outputFrame; + + varying vec2 vTextureCoord; + varying vec2 vFilterCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + vFilterCoord = vTextureCoord * inputSize.xy / outputFrame.zw; + } + `,_=_||{};_.stringify=function(){var t={"visit_linear-gradient":function(e){return t.visit_gradient(e)},"visit_repeating-linear-gradient":function(e){return t.visit_gradient(e)},"visit_radial-gradient":function(e){return t.visit_gradient(e)},"visit_repeating-radial-gradient":function(e){return t.visit_gradient(e)},visit_gradient:function(e){var r=t.visit(e.orientation);return r&&(r+=", "),e.type+"("+r+t.visit(e.colorStops)+")"},visit_shape:function(e){var r=e.value,i=t.visit(e.at),o=t.visit(e.style);return o&&(r+=" "+o),i&&(r+=" at "+i),r},"visit_default-radial":function(e){var r="",i=t.visit(e.at);return i&&(r+=i),r},"visit_extent-keyword":function(e){var r=e.value,i=t.visit(e.at);return i&&(r+=" at "+i),r},"visit_position-keyword":function(e){return e.value},visit_position:function(e){return t.visit(e.value.x)+" "+t.visit(e.value.y)},"visit_%":function(e){return e.value+"%"},visit_em:function(e){return e.value+"em"},visit_px:function(e){return e.value+"px"},visit_literal:function(e){return t.visit_color(e.value,e)},visit_hex:function(e){return t.visit_color("#"+e.value,e)},visit_rgb:function(e){return t.visit_color("rgb("+e.value.join(", ")+")",e)},visit_rgba:function(e){return t.visit_color("rgba("+e.value.join(", ")+")",e)},visit_color:function(e,r){var i=e,o=t.visit(r.length);return o&&(i+=" "+o),i},visit_angular:function(e){return e.value+"deg"},visit_directional:function(e){return"to "+e.value},visit_array:function(e){var r="",i=e.length;return e.forEach(function(o,s){r+=t.visit(o),s0&&r("Invalid input not EOF"),c}function o(){return z(s)}function s(){return n("linear-gradient",t.linearGradient,u)||n("repeating-linear-gradient",t.repeatingLinearGradient,u)||n("radial-gradient",t.radialGradient,S)||n("repeating-radial-gradient",t.repeatingRadialGradient,S)}function n(c,d,m){return l(d,function(C){var we=m();return we&&(y(t.comma)||r("Missing comma before color stops")),{type:c,orientation:we,colorStops:z(Vr)}})}function l(c,d){var m=y(c);if(m){y(t.startCall)||r("Missing (");var C=d(m);return y(t.endCall)||r("Missing )"),C}}function u(){return h()||p()}function h(){return v("directional",t.sideOrCorner,1)}function p(){return v("angular",t.angleValue,1)}function S(){var c,d=g(),m;return d&&(c=[],c.push(d),m=e,y(t.comma)&&(d=g(),d?c.push(d):e=m)),c}function g(){var c=x()||Ir();if(c)c.at=Se();else{var d=j();if(d){c=d;var m=Se();m&&(c.at=m)}else{var C=Te();C&&(c={type:"default-radial",at:C})}}return c}function x(){var c=v("shape",/^(circle)/i,0);return c&&(c.style=Ae()||j()),c}function Ir(){var c=v("shape",/^(ellipse)/i,0);return c&&(c.style=w()||j()),c}function j(){return v("extent-keyword",t.extentKeywords,1)}function Se(){if(v("position",/^at/,0)){var c=Te();return c||r("Missing positioning value"),c}}function Te(){var c=Lr();if(c.x||c.y)return{type:"position",value:c}}function Lr(){return{x:w(),y:w()}}function z(c){var d=c(),m=[];if(d)for(m.push(d);y(t.comma);)d=c(),d?m.push(d):r("One extra comma");return m}function Vr(){var c=Nr();return c||r("Expected color definition"),c.length=w(),c}function Nr(){return Br()||qr()||Xr()||Gr()}function Gr(){return v("literal",t.literalColor,0)}function Br(){return v("hex",t.hexColor,1)}function Xr(){return l(t.rgbColor,function(){return{type:"rgb",value:z(Fe)}})}function qr(){return l(t.rgbaColor,function(){return{type:"rgba",value:z(Fe)}})}function Fe(){return y(t.number)[1]}function w(){return v("%",t.percentageValue,1)||Kr()||Ae()}function Kr(){return v("position-keyword",t.positionKeywords,1)}function Ae(){return v("px",t.pixelValue,1)||v("em",t.emValue,1)}function v(c,d,m){var C=y(d);if(C)return{type:c,value:C[m]}}function y(c){var d,m;return m=/^[\n\r\t\s]+/.exec(e),m&&ze(m[0].length),d=c.exec(e),d&&ze(d[0].length),d}function ze(c){e=e.substr(c)}return function(c){return e=c.toString(),i()}}();var Ze=_.parse;_.stringify;var X={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},q={red:0,orange:60,yellow:120,green:180,blue:240,purple:300};function He(t){var e,r=[],i=1,o;if(typeof t=="string")if(X[t])r=X[t].slice(),o="rgb";else if(t==="transparent")i=0,o="rgb",r=[0,0,0];else if(/^#[A-Fa-f0-9]+$/.test(t)){var s=t.slice(1),n=s.length,l=n<=4;i=1,l?(r=[parseInt(s[0]+s[0],16),parseInt(s[1]+s[1],16),parseInt(s[2]+s[2],16)],n===4&&(i=parseInt(s[3]+s[3],16)/255)):(r=[parseInt(s[0]+s[1],16),parseInt(s[2]+s[3],16),parseInt(s[4]+s[5],16)],n===8&&(i=parseInt(s[6]+s[7],16)/255)),r[0]||(r[0]=0),r[1]||(r[1]=0),r[2]||(r[2]=0),o="rgb"}else if(e=/^((?:rgb|hs[lvb]|hwb|cmyk?|xy[zy]|gray|lab|lchu?v?|[ly]uv|lms)a?)\s*\(([^\)]*)\)/.exec(t)){var u=e[1],h=u==="rgb",s=u.replace(/a$/,"");o=s;var n=s==="cmyk"?4:s==="gray"?1:3;r=e[2].trim().split(/\s*[,\/]\s*|\s+/).map(function(g,x){if(/%$/.test(g))return x===n?parseFloat(g)/100:s==="rgb"?parseFloat(g)*255/100:parseFloat(g);if(s[x]==="h"){if(/deg$/.test(g))return parseFloat(g);if(q[g]!==void 0)return q[g]}return parseFloat(g)}),u===s&&r.push(1),i=h||r[n]===void 0?1:r[n],r=r.slice(0,n)}else t.length>10&&/[0-9](?:\s|\/)/.test(t)&&(r=t.match(/([0-9]+)/g).map(function(p){return parseFloat(p)}),o=t.match(/([a-z])/ig).join("").toLowerCase());else isNaN(t)?Array.isArray(t)||t.length?(r=[t[0],t[1],t[2]],o="rgb",i=t.length===4?t[3]:1):t instanceof Object&&(t.r!=null||t.red!=null||t.R!=null?(o="rgb",r=[t.r||t.red||t.R||0,t.g||t.green||t.G||0,t.b||t.blue||t.B||0]):(o="hsl",r=[t.h||t.hue||t.H||0,t.s||t.saturation||t.S||0,t.l||t.lightness||t.L||t.b||t.brightness]),i=t.a||t.alpha||t.opacity||1,t.opacity!=null&&(i/=100)):(o="rgb",r=[t>>>16,(t&65280)>>>8,t&255]);return{space:o,values:r,alpha:i}}var P={name:"rgb",min:[0,0,0],max:[255,255,255],channel:["red","green","blue"],alias:["RGB"]},M={name:"hsl",min:[0,0,0],max:[360,100,100],channel:["hue","saturation","lightness"],alias:["HSL"],rgb:function(t){var e=t[0]/360,r=t[1]/100,i=t[2]/100,o,s,n,l,u;if(r===0)return u=i*255,[u,u,u];i<.5?s=i*(1+r):s=i+r-i*r,o=2*i-s,l=[0,0,0];for(var h=0;h<3;h++)n=e+1/3*-(h-1),n<0?n++:n>1&&n--,6*n<1?u=o+(s-o)*6*n:2*n<1?u=s:3*n<2?u=o+(s-o)*(2/3-n)*6:u=o,l[h]=u*255;return l}};P.hsl=function(t){var e=t[0]/255,r=t[1]/255,i=t[2]/255,o=Math.min(e,r,i),s=Math.max(e,r,i),n=s-o,l,u,h;return s===o?l=0:e===s?l=(r-i)/n:r===s?l=2+(i-e)/n:i===s&&(l=4+(e-r)/n),l=Math.min(l*60,360),l<0&&(l+=360),h=(o+s)/2,s===o?u=0:h<=.5?u=n/(s+o):u=n/(2-s-o),[l,u*100,h*100]};function Qe(t){Array.isArray(t)&&t.raw&&(t=String.raw(...arguments));var e,r=He(t);if(!r.space)return[];const i=r.space[0]==="h"?M.min:P.min,o=r.space[0]==="h"?M.max:P.max;return e=Array(3),e[0]=Math.min(Math.max(r.values[0],i[0]),o[0]),e[1]=Math.min(Math.max(r.values[1],i[1]),o[1]),e[2]=Math.min(Math.max(r.values[2],i[2]),o[2]),r.space[0]==="h"&&(e=M.rgb(e)),e.push(Math.min(Math.max(r.alpha,0),1)),e}function K(t){switch(typeof t){case"string":return Je(t);case"number":return a.utils.hex2rgb(t);default:return t}}function Je(t){const e=Qe(t);if(!e)throw new Error(`Unable to parse color "${t}" as RGBA.`);return[e[0]/255,e[1]/255,e[2]/255,e[3]]}function et(t){const e=Ze(ut(t));if(e.length===0)throw new Error("Invalid CSS gradient.");if(e.length!==1)throw new Error("Unsupported CSS gradient (multiple gradients is not supported).");const r=e[0],i=tt(r.type),o=rt(r.colorStops),s=nt(r.orientation);return{type:i,stops:o,angle:s}}function tt(t){const e={"linear-gradient":0,"radial-gradient":1};if(!(t in e))throw new Error(`Unsupported gradient type "${t}"`);return e[t]}function rt(t){const e=st(t),r=[];for(let i=0;i{for(let s=o;s6?parseFloat(t.toString().substring(0,6)):t}function nt(t){if(typeof t=="undefined")return 0;if("type"in t&&"value"in t)switch(t.type){case"angular":return parseFloat(t.value);case"directional":return lt(t.value)}return 0}function lt(t){const e={left:270,top:0,bottom:180,right:90,"left top":315,"top left":315,"left bottom":225,"bottom left":225,"right top":45,"top right":45,"right bottom":135,"bottom right":135};if(!(t in e))throw new Error(`Unsupported directional value "${t}"`);return e[t]}function ut(t){let e=t.replace(/\s{2,}/gu," ");return e=e.replace(/;/g,""),e=e.replace(/ ,/g,","),e=e.replace(/\( /g,"("),e=e.replace(/ \)/g,")"),e.trim()}var ct=Object.defineProperty,ft=Object.defineProperties,dt=Object.getOwnPropertyDescriptors,W=Object.getOwnPropertySymbols,ht=Object.prototype.hasOwnProperty,mt=Object.prototype.propertyIsEnumerable,Y=(t,e,r)=>e in t?ct(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,D=(t,e)=>{for(var r in e||(e={}))ht.call(e,r)&&Y(t,r,e[r]);if(W)for(var r of W(e))mt.call(e,r)&&Y(t,r,e[r]);return t},gt=(t,e)=>ft(t,dt(e));const U=90;function vt(t){return[...t].sort((e,r)=>e.offset-r.offset)}const k=class extends a.Filter{constructor(t){t&&"css"in t&&(t=gt(D({},et(t.css||"")),{alpha:t.alpha,maxColors:t.maxColors}));const e=D(D({},k.defaults),t);if(!e.stops||e.stops.length<2)throw new Error("ColorGradientFilter requires at least 2 color stops.");super(Ue,Ye),this._stops=[],this.autoFit=!1,Object.assign(this,e)}get stops(){return this._stops}set stops(t){const e=vt(t),r=new Float32Array(e.length*3),i=0,o=1,s=2;for(let n=0;nn.offset),this.uniforms.uAlphas=e.map(n=>n.alpha),this.uniforms.uNumStops=e.length,this._stops=e}set type(t){this.uniforms.uType=t}get type(){return this.uniforms.uType}set angle(t){this.uniforms.uAngle=t-U}get angle(){return this.uniforms.uAngle+U}set alpha(t){this.uniforms.uAlpha=t}get alpha(){return this.uniforms.uAlpha}set maxColors(t){this.uniforms.uMaxColors=t}get maxColors(){return this.uniforms.uMaxColors}};let F=k;F.LINEAR=0,F.RADIAL=1,F.CONIC=2,F.defaults={type:k.LINEAR,stops:[{offset:0,color:16711680,alpha:1},{offset:1,color:255,alpha:1}],alpha:1,angle:90,maxColors:0};var pt=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,xt=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform sampler2D colorMap; + uniform float _mix; + uniform float _size; + uniform float _sliceSize; + uniform float _slicePixelSize; + uniform float _sliceInnerSize; + void main() { + vec4 color = texture2D(uSampler, vTextureCoord.xy); + + vec4 adjusted; + if (color.a > 0.0) { + color.rgb /= color.a; + float innerWidth = _size - 1.0; + float zSlice0 = min(floor(color.b * innerWidth), innerWidth); + float zSlice1 = min(zSlice0 + 1.0, innerWidth); + float xOffset = _slicePixelSize * 0.5 + color.r * _sliceInnerSize; + float s0 = xOffset + (zSlice0 * _sliceSize); + float s1 = xOffset + (zSlice1 * _sliceSize); + float yOffset = _sliceSize * 0.5 + color.g * (1.0 - _sliceSize); + vec4 slice0Color = texture2D(colorMap, vec2(s0,yOffset)); + vec4 slice1Color = texture2D(colorMap, vec2(s1,yOffset)); + float zOffset = fract(color.b * innerWidth); + adjusted = mix(slice0Color, slice1Color, zOffset); + + color.rgb *= color.a; + } + gl_FragColor = vec4(mix(color, adjusted, _mix).rgb, color.a); + + }`;class yt extends a.Filter{constructor(e,r=!1,i=1){super(pt,xt),this.mix=1,this._size=0,this._sliceSize=0,this._slicePixelSize=0,this._sliceInnerSize=0,this._nearest=!1,this._scaleMode=null,this._colorMap=null,this._scaleMode=null,this.nearest=r,this.mix=i,this.colorMap=e}apply(e,r,i,o){this.uniforms._mix=this.mix,e.applyFilter(this,r,i,o)}get colorSize(){return this._size}get colorMap(){return this._colorMap}set colorMap(e){!e||(e instanceof a.Texture||(e=a.Texture.from(e)),e!=null&&e.baseTexture&&(e.baseTexture.scaleMode=this._scaleMode,e.baseTexture.mipmap=a.MIPMAP_MODES.OFF,this._size=e.height,this._sliceSize=1/this._size,this._slicePixelSize=this._sliceSize/this._size,this._sliceInnerSize=this._slicePixelSize*(this._size-1),this.uniforms._size=this._size,this.uniforms._sliceSize=this._sliceSize,this.uniforms._slicePixelSize=this._slicePixelSize,this.uniforms._sliceInnerSize=this._sliceInnerSize,this.uniforms.colorMap=e),this._colorMap=e)}get nearest(){return this._nearest}set nearest(e){this._nearest=e,this._scaleMode=e?a.SCALE_MODES.NEAREST:a.SCALE_MODES.LINEAR;const r=this._colorMap;r&&r.baseTexture&&(r.baseTexture._glTextures={},r.baseTexture.scaleMode=this._scaleMode,r.baseTexture.mipmap=a.MIPMAP_MODES.OFF,r._updateID++,r.baseTexture.emit("update",r.baseTexture))}updateColorMap(){const e=this._colorMap;e&&e.baseTexture&&(e._updateID++,e.baseTexture.emit("update",e.baseTexture),this.colorMap=e)}destroy(e=!1){this._colorMap&&this._colorMap.destroy(e),super.destroy()}}var Ct=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,_t=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform vec3 color; + uniform float alpha; + + void main(void) { + vec4 currentColor = texture2D(uSampler, vTextureCoord); + gl_FragColor = vec4(mix(currentColor.rgb, color.rgb, currentColor.a * alpha), currentColor.a); + } + `;class bt extends a.Filter{constructor(e=0,r=1){super(Ct,_t),this._color=0,this._alpha=1,this.uniforms.color=new Float32Array(3),this.color=e,this.alpha=r}set color(e){const r=this.uniforms.color;typeof e=="number"?(a.utils.hex2rgb(e,r),this._color=e):(r[0]=e[0],r[1]=e[1],r[2]=e[2],this._color=a.utils.rgb2hex(r))}get color(){return this._color}set alpha(e){this.uniforms.alpha=e,this._alpha=e}get alpha(){return this._alpha}}var St=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Tt=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform vec3 originalColor; + uniform vec3 newColor; + uniform float epsilon; + void main(void) { + vec4 currentColor = texture2D(uSampler, vTextureCoord); + vec3 colorDiff = originalColor - (currentColor.rgb / max(currentColor.a, 0.0000000001)); + float colorDistance = length(colorDiff); + float doReplace = step(colorDistance, epsilon); + gl_FragColor = vec4(mix(currentColor.rgb, (newColor + colorDiff) * currentColor.a, doReplace), currentColor.a); + } + `;class Ft extends a.Filter{constructor(e=16711680,r=0,i=.4){super(St,Tt),this._originalColor=16711680,this._newColor=0,this.uniforms.originalColor=new Float32Array(3),this.uniforms.newColor=new Float32Array(3),this.originalColor=e,this.newColor=r,this.epsilon=i}set originalColor(e){const r=this.uniforms.originalColor;typeof e=="number"?(a.utils.hex2rgb(e,r),this._originalColor=e):(r[0]=e[0],r[1]=e[1],r[2]=e[2],this._originalColor=a.utils.rgb2hex(r))}get originalColor(){return this._originalColor}set newColor(e){const r=this.uniforms.newColor;typeof e=="number"?(a.utils.hex2rgb(e,r),this._newColor=e):(r[0]=e[0],r[1]=e[1],r[2]=e[2],this._newColor=a.utils.rgb2hex(r))}get newColor(){return this._newColor}set epsilon(e){this.uniforms.epsilon=e}get epsilon(){return this.uniforms.epsilon}}var At=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,zt=`precision mediump float; + + varying mediump vec2 vTextureCoord; + + uniform sampler2D uSampler; + uniform vec2 texelSize; + uniform float matrix[9]; + + void main(void) + { + vec4 c11 = texture2D(uSampler, vTextureCoord - texelSize); // top left + vec4 c12 = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - texelSize.y)); // top center + vec4 c13 = texture2D(uSampler, vec2(vTextureCoord.x + texelSize.x, vTextureCoord.y - texelSize.y)); // top right + + vec4 c21 = texture2D(uSampler, vec2(vTextureCoord.x - texelSize.x, vTextureCoord.y)); // mid left + vec4 c22 = texture2D(uSampler, vTextureCoord); // mid center + vec4 c23 = texture2D(uSampler, vec2(vTextureCoord.x + texelSize.x, vTextureCoord.y)); // mid right + + vec4 c31 = texture2D(uSampler, vec2(vTextureCoord.x - texelSize.x, vTextureCoord.y + texelSize.y)); // bottom left + vec4 c32 = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + texelSize.y)); // bottom center + vec4 c33 = texture2D(uSampler, vTextureCoord + texelSize); // bottom right + + gl_FragColor = + c11 * matrix[0] + c12 * matrix[1] + c13 * matrix[2] + + c21 * matrix[3] + c22 * matrix[4] + c23 * matrix[5] + + c31 * matrix[6] + c32 * matrix[7] + c33 * matrix[8]; + + gl_FragColor.a = c22.a; + } + `;class wt extends a.Filter{constructor(e,r=200,i=200){super(At,zt),this.uniforms.texelSize=new Float32Array(2),this.uniforms.matrix=new Float32Array(9),e!==void 0&&(this.matrix=e),this.width=r,this.height=i}get matrix(){return this.uniforms.matrix}set matrix(e){e.forEach((r,i)=>{this.uniforms.matrix[i]=r})}get width(){return 1/this.uniforms.texelSize[0]}set width(e){this.uniforms.texelSize[0]=1/e}get height(){return 1/this.uniforms.texelSize[1]}set height(e){this.uniforms.texelSize[1]=1/e}}var Pt=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Mt=`precision mediump float; + + varying vec2 vTextureCoord; + + uniform sampler2D uSampler; + + void main(void) + { + float lum = length(texture2D(uSampler, vTextureCoord.xy).rgb); + + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); + + if (lum < 1.00) + { + if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) + { + gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); + } + } + + if (lum < 0.75) + { + if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) + { + gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); + } + } + + if (lum < 0.50) + { + if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) + { + gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); + } + } + + if (lum < 0.3) + { + if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) + { + gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); + } + } + } + `;class Dt extends a.Filter{constructor(){super(Pt,Mt)}}var kt=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Ot=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + + uniform vec4 filterArea; + uniform vec2 dimensions; + + const float SQRT_2 = 1.414213; + + const float light = 1.0; + + uniform float curvature; + uniform float lineWidth; + uniform float lineContrast; + uniform bool verticalLine; + uniform float noise; + uniform float noiseSize; + + uniform float vignetting; + uniform float vignettingAlpha; + uniform float vignettingBlur; + + uniform float seed; + uniform float time; + + float rand(vec2 co) { + return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453); + } + + void main(void) + { + vec2 pixelCoord = vTextureCoord.xy * filterArea.xy; + vec2 dir = vec2(vTextureCoord.xy * filterArea.xy / dimensions - vec2(0.5, 0.5)); + + gl_FragColor = texture2D(uSampler, vTextureCoord); + vec3 rgb = gl_FragColor.rgb; + + if (noise > 0.0 && noiseSize > 0.0) + { + pixelCoord.x = floor(pixelCoord.x / noiseSize); + pixelCoord.y = floor(pixelCoord.y / noiseSize); + float _noise = rand(pixelCoord * noiseSize * seed) - 0.5; + rgb += _noise * noise; + } + + if (lineWidth > 0.0) + { + float _c = curvature > 0. ? curvature : 1.; + float k = curvature > 0. ?(length(dir * dir) * 0.25 * _c * _c + 0.935 * _c) : 1.; + vec2 uv = dir * k; + + float v = (verticalLine ? uv.x * dimensions.x : uv.y * dimensions.y) * min(1.0, 2.0 / lineWidth ) / _c; + float j = 1. + cos(v * 1.2 - time) * 0.5 * lineContrast; + rgb *= j; + float segment = verticalLine ? mod((dir.x + .5) * dimensions.x, 4.) : mod((dir.y + .5) * dimensions.y, 4.); + rgb *= 0.99 + ceil(segment) * 0.015; + } + + if (vignetting > 0.0) + { + float outter = SQRT_2 - vignetting * SQRT_2; + float darker = clamp((outter - length(dir) * SQRT_2) / ( 0.00001 + vignettingBlur * SQRT_2), 0.0, 1.0); + rgb *= darker + (1.0 - darker) * (1.0 - vignettingAlpha); + } + + gl_FragColor.rgb = rgb; + } + `;const Z=class extends a.Filter{constructor(t){super(kt,Ot),this.time=0,this.seed=0,this.uniforms.dimensions=new Float32Array(2),Object.assign(this,Z.defaults,t)}apply(t,e,r,i){const{width:o,height:s}=e.filterFrame;this.uniforms.dimensions[0]=o,this.uniforms.dimensions[1]=s,this.uniforms.seed=this.seed,this.uniforms.time=this.time,t.applyFilter(this,e,r,i)}set curvature(t){this.uniforms.curvature=t}get curvature(){return this.uniforms.curvature}set lineWidth(t){this.uniforms.lineWidth=t}get lineWidth(){return this.uniforms.lineWidth}set lineContrast(t){this.uniforms.lineContrast=t}get lineContrast(){return this.uniforms.lineContrast}set verticalLine(t){this.uniforms.verticalLine=t}get verticalLine(){return this.uniforms.verticalLine}set noise(t){this.uniforms.noise=t}get noise(){return this.uniforms.noise}set noiseSize(t){this.uniforms.noiseSize=t}get noiseSize(){return this.uniforms.noiseSize}set vignetting(t){this.uniforms.vignetting=t}get vignetting(){return this.uniforms.vignetting}set vignettingAlpha(t){this.uniforms.vignettingAlpha=t}get vignettingAlpha(){return this.uniforms.vignettingAlpha}set vignettingBlur(t){this.uniforms.vignettingBlur=t}get vignettingBlur(){return this.uniforms.vignettingBlur}};let H=Z;H.defaults={curvature:1,lineWidth:1,lineContrast:.25,verticalLine:!1,noise:0,noiseSize:1,seed:0,vignetting:.3,vignettingAlpha:1,vignettingBlur:.3,time:0};var Rt=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Et=`precision mediump float; + + varying vec2 vTextureCoord; + varying vec4 vColor; + + uniform vec4 filterArea; + uniform sampler2D uSampler; + + uniform float angle; + uniform float scale; + uniform bool grayscale; + + float pattern() + { + float s = sin(angle), c = cos(angle); + vec2 tex = vTextureCoord * filterArea.xy; + vec2 point = vec2( + c * tex.x - s * tex.y, + s * tex.x + c * tex.y + ) * scale; + return (sin(point.x) * sin(point.y)) * 4.0; + } + + void main() + { + vec4 color = texture2D(uSampler, vTextureCoord); + vec3 colorRGB = vec3(color); + + if (grayscale) + { + colorRGB = vec3(color.r + color.g + color.b) / 3.0; + } + + gl_FragColor = vec4(colorRGB * 10.0 - 5.0 + pattern(), color.a); + } + `;class $t extends a.Filter{constructor(e=1,r=5,i=!0){super(Rt,Et),this.scale=e,this.angle=r,this.grayscale=i}get scale(){return this.uniforms.scale}set scale(e){this.uniforms.scale=e}get angle(){return this.uniforms.angle}set angle(e){this.uniforms.angle=e}get grayscale(){return this.uniforms.grayscale}set grayscale(e){this.uniforms.grayscale=e}}var jt=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,It=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform float alpha; + uniform vec3 color; + + uniform vec2 shift; + uniform vec4 inputSize; + + void main(void){ + vec4 sample = texture2D(uSampler, vTextureCoord - shift * inputSize.zw); + + // Premultiply alpha + sample.rgb = color.rgb * sample.a; + + // alpha user alpha + sample *= alpha; + + gl_FragColor = sample; + }`,Lt=Object.defineProperty,Q=Object.getOwnPropertySymbols,Vt=Object.prototype.hasOwnProperty,Nt=Object.prototype.propertyIsEnumerable,J=(t,e,r)=>e in t?Lt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,ee=(t,e)=>{for(var r in e||(e={}))Vt.call(e,r)&&J(t,r,e[r]);if(Q)for(var r of Q(e))Nt.call(e,r)&&J(t,r,e[r]);return t};const O=class extends a.Filter{constructor(t){super(),this.angle=45,this._distance=5,this._resolution=a.settings.FILTER_RESOLUTION;const e=t?ee(ee({},O.defaults),t):O.defaults,{kernels:r,blur:i,quality:o,pixelSize:s,resolution:n}=e;this._offset=new a.ObservablePoint(this._updatePadding,this),this._tintFilter=new a.Filter(jt,It),this._tintFilter.uniforms.color=new Float32Array(4),this._tintFilter.uniforms.shift=this._offset,this._tintFilter.resolution=n,this._blurFilter=r?new T(r):new T(i,o),this.pixelSize=s,this.resolution=n;const{shadowOnly:l,rotation:u,distance:h,offset:p,alpha:S,color:g}=e;this.shadowOnly=l,u!==void 0&&h!==void 0?(this.rotation=u,this.distance=h):this.offset=p,this.alpha=S,this.color=g}apply(t,e,r,i){const o=t.getFilterTexture();this._tintFilter.apply(t,e,o,1),this._blurFilter.apply(t,o,r,i),this.shadowOnly!==!0&&t.applyFilter(this,e,r,0),t.returnFilterTexture(o)}_updatePadding(){const t=Math.max(Math.abs(this._offset.x),Math.abs(this._offset.y));this.padding=t+this.blur*2}_updateShift(){this._tintFilter.uniforms.shift.set(this.distance*Math.cos(this.angle),this.distance*Math.sin(this.angle))}set offset(t){this._offset.copyFrom(t),this._updatePadding()}get offset(){return this._offset}get resolution(){return this._resolution}set resolution(t){this._resolution=t,this._tintFilter&&(this._tintFilter.resolution=t),this._blurFilter&&(this._blurFilter.resolution=t)}get distance(){return this._distance}set distance(t){a.utils.deprecation("5.3.0","DropShadowFilter distance is deprecated, use offset"),this._distance=t,this._updatePadding(),this._updateShift()}get rotation(){return this.angle/a.DEG_TO_RAD}set rotation(t){a.utils.deprecation("5.3.0","DropShadowFilter rotation is deprecated, use offset"),this.angle=t*a.DEG_TO_RAD,this._updateShift()}get alpha(){return this._tintFilter.uniforms.alpha}set alpha(t){this._tintFilter.uniforms.alpha=t}get color(){return a.utils.rgb2hex(this._tintFilter.uniforms.color)}set color(t){a.utils.hex2rgb(t,this._tintFilter.uniforms.color)}get kernels(){return this._blurFilter.kernels}set kernels(t){this._blurFilter.kernels=t}get blur(){return this._blurFilter.blur}set blur(t){this._blurFilter.blur=t,this._updatePadding()}get quality(){return this._blurFilter.quality}set quality(t){this._blurFilter.quality=t}get pixelSize(){return this._blurFilter.pixelSize}set pixelSize(t){this._blurFilter.pixelSize=t}};let te=O;te.defaults={offset:{x:4,y:4},color:0,alpha:.5,shadowOnly:!1,kernels:null,blur:2,quality:3,pixelSize:1,resolution:a.settings.FILTER_RESOLUTION};var Gt=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Bt=`precision mediump float; + + varying vec2 vTextureCoord; + + uniform sampler2D uSampler; + uniform float strength; + uniform vec4 filterArea; + + + void main(void) + { + vec2 onePixel = vec2(1.0 / filterArea); + + vec4 color; + + color.rgb = vec3(0.5); + + color -= texture2D(uSampler, vTextureCoord - onePixel) * strength; + color += texture2D(uSampler, vTextureCoord + onePixel) * strength; + + color.rgb = vec3((color.r + color.g + color.b) / 3.0); + + float alpha = texture2D(uSampler, vTextureCoord).a; + + gl_FragColor = vec4(color.rgb * alpha, alpha); + } + `;class Xt extends a.Filter{constructor(e=5){super(Gt,Bt),this.strength=e}get strength(){return this.uniforms.strength}set strength(e){this.uniforms.strength=e}}var qt=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Kt=`// precision highp float; + + varying vec2 vTextureCoord; + uniform sampler2D uSampler; + + uniform vec4 filterArea; + uniform vec4 filterClamp; + uniform vec2 dimensions; + uniform float aspect; + + uniform sampler2D displacementMap; + uniform float offset; + uniform float sinDir; + uniform float cosDir; + uniform int fillMode; + + uniform float seed; + uniform vec2 red; + uniform vec2 green; + uniform vec2 blue; + + const int TRANSPARENT = 0; + const int ORIGINAL = 1; + const int LOOP = 2; + const int CLAMP = 3; + const int MIRROR = 4; + + void main(void) + { + vec2 coord = (vTextureCoord * filterArea.xy) / dimensions; + + if (coord.x > 1.0 || coord.y > 1.0) { + return; + } + + float cx = coord.x - 0.5; + float cy = (coord.y - 0.5) * aspect; + float ny = (-sinDir * cx + cosDir * cy) / aspect + 0.5; + + // displacementMap: repeat + // ny = ny > 1.0 ? ny - 1.0 : (ny < 0.0 ? 1.0 + ny : ny); + + // displacementMap: mirror + ny = ny > 1.0 ? 2.0 - ny : (ny < 0.0 ? -ny : ny); + + vec4 dc = texture2D(displacementMap, vec2(0.5, ny)); + + float displacement = (dc.r - dc.g) * (offset / filterArea.x); + + coord = vTextureCoord + vec2(cosDir * displacement, sinDir * displacement * aspect); + + if (fillMode == CLAMP) { + coord = clamp(coord, filterClamp.xy, filterClamp.zw); + } else { + if( coord.x > filterClamp.z ) { + if (fillMode == TRANSPARENT) { + discard; + } else if (fillMode == LOOP) { + coord.x -= filterClamp.z; + } else if (fillMode == MIRROR) { + coord.x = filterClamp.z * 2.0 - coord.x; + } + } else if( coord.x < filterClamp.x ) { + if (fillMode == TRANSPARENT) { + discard; + } else if (fillMode == LOOP) { + coord.x += filterClamp.z; + } else if (fillMode == MIRROR) { + coord.x *= -filterClamp.z; + } + } + + if( coord.y > filterClamp.w ) { + if (fillMode == TRANSPARENT) { + discard; + } else if (fillMode == LOOP) { + coord.y -= filterClamp.w; + } else if (fillMode == MIRROR) { + coord.y = filterClamp.w * 2.0 - coord.y; + } + } else if( coord.y < filterClamp.y ) { + if (fillMode == TRANSPARENT) { + discard; + } else if (fillMode == LOOP) { + coord.y += filterClamp.w; + } else if (fillMode == MIRROR) { + coord.y *= -filterClamp.w; + } + } + } + + gl_FragColor.r = texture2D(uSampler, coord + red * (1.0 - seed * 0.4) / filterArea.xy).r; + gl_FragColor.g = texture2D(uSampler, coord + green * (1.0 - seed * 0.3) / filterArea.xy).g; + gl_FragColor.b = texture2D(uSampler, coord + blue * (1.0 - seed * 0.2) / filterArea.xy).b; + gl_FragColor.a = texture2D(uSampler, coord).a; + } + `;const R=class extends a.Filter{constructor(t){super(qt,Kt),this.offset=100,this.fillMode=R.TRANSPARENT,this.average=!1,this.seed=0,this.minSize=8,this.sampleSize=512,this._slices=0,this._offsets=new Float32Array(1),this._sizes=new Float32Array(1),this._direction=-1,this.uniforms.dimensions=new Float32Array(2),this._canvas=document.createElement("canvas"),this._canvas.width=4,this._canvas.height=this.sampleSize,this.texture=a.Texture.from(this._canvas,{scaleMode:a.SCALE_MODES.NEAREST}),Object.assign(this,R.defaults,t)}apply(t,e,r,i){const{width:o,height:s}=e.filterFrame;this.uniforms.dimensions[0]=o,this.uniforms.dimensions[1]=s,this.uniforms.aspect=s/o,this.uniforms.seed=this.seed,this.uniforms.offset=this.offset,this.uniforms.fillMode=this.fillMode,t.applyFilter(this,e,r,i)}_randomizeSizes(){const t=this._sizes,e=this._slices-1,r=this.sampleSize,i=Math.min(this.minSize/r,.9/this._slices);if(this.average){const o=this._slices;let s=1;for(let n=0;n0;r--){const i=Math.random()*r>>0,o=t[r];t[r]=t[i],t[i]=o}}_randomizeOffsets(){for(let t=0;t0?i:0,u=i<0?-i:0;r.fillStyle=`rgba(${l}, ${u}, 0, 1)`,r.fillRect(0,o>>0,t,n+1>>0),o+=n}e.baseTexture.update(),this.uniforms.displacementMap=e}set sizes(t){const e=Math.min(this._slices,t.length);for(let r=0;r 0.) { + result.rgb += (average - result.rgb) * (1. - 1. / (1.001 - uSaturation)); + } else { + result.rgb -= (average - result.rgb) * uSaturation; + } + + // lightness + result.rgb = mix(result.rgb, vec3(ceil(uLightness)) * color.a, abs(uLightness)); + + // alpha + gl_FragColor = mix(color, result, uAlpha); + } + `;const ae=class extends a.Filter{constructor(t){super(tr,rr),this._hue=0;const e=Object.assign({},ae.defaults,t);Object.assign(this,e)}get hue(){return this._hue}set hue(t){this._hue=t,this.uniforms.uHue=this._hue*(Math.PI/180)}get alpha(){return this.uniforms.uAlpha}set alpha(t){this.uniforms.uAlpha=t}get colorize(){return this.uniforms.uColorize}set colorize(t){this.uniforms.uColorize=t}get lightness(){return this.uniforms.uLightness}set lightness(t){this.uniforms.uLightness=t}get saturation(){return this.uniforms.uSaturation}set saturation(t){this.uniforms.uSaturation=t}};let ne=ae;ne.defaults={hue:0,saturation:0,lightness:0,colorize:!1,alpha:1};var ir=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,or=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform vec4 filterArea; + + uniform vec2 uVelocity; + uniform int uKernelSize; + uniform float uOffset; + + const int MAX_KERNEL_SIZE = 2048; + + // Notice: + // the perfect way: + // int kernelSize = min(uKernelSize, MAX_KERNELSIZE); + // BUT in real use-case , uKernelSize < MAX_KERNELSIZE almost always. + // So use uKernelSize directly. + + void main(void) + { + vec4 color = texture2D(uSampler, vTextureCoord); + + if (uKernelSize == 0) + { + gl_FragColor = color; + return; + } + + vec2 velocity = uVelocity / filterArea.xy; + float offset = -uOffset / length(uVelocity) - 0.5; + int k = uKernelSize - 1; + + for(int i = 0; i < MAX_KERNEL_SIZE - 1; i++) { + if (i == k) { + break; + } + vec2 bias = velocity * (float(i) / float(k) + offset); + color += texture2D(uSampler, vTextureCoord + bias); + } + gl_FragColor = color / float(uKernelSize); + } + `;class sr extends a.Filter{constructor(e=[0,0],r=5,i=0){super(ir,or),this.kernelSize=5,this.uniforms.uVelocity=new Float32Array(2),this._velocity=new a.ObservablePoint(this.velocityChanged,this),this.setVelocity(e),this.kernelSize=r,this.offset=i}apply(e,r,i,o){const{x:s,y:n}=this.velocity;this.uniforms.uKernelSize=s!==0||n!==0?this.kernelSize:0,e.applyFilter(this,r,i,o)}set velocity(e){this.setVelocity(e)}get velocity(){return this._velocity}setVelocity(e){if(Array.isArray(e)){const[r,i]=e;this._velocity.set(r,i)}else this._velocity.copyFrom(e)}velocityChanged(){this.uniforms.uVelocity[0]=this._velocity.x,this.uniforms.uVelocity[1]=this._velocity.y,this.padding=(Math.max(Math.abs(this._velocity.x),Math.abs(this._velocity.y))>>0)+1}set offset(e){this.uniforms.uOffset=e}get offset(){return this.uniforms.uOffset}}var ar=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,nr=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + + uniform float epsilon; + + const int MAX_COLORS = %maxColors%; + + uniform vec3 originalColors[MAX_COLORS]; + uniform vec3 targetColors[MAX_COLORS]; + + void main(void) + { + gl_FragColor = texture2D(uSampler, vTextureCoord); + + float alpha = gl_FragColor.a; + if (alpha < 0.0001) + { + return; + } + + vec3 color = gl_FragColor.rgb / alpha; + + for(int i = 0; i < MAX_COLORS; i++) + { + vec3 origColor = originalColors[i]; + if (origColor.r < 0.0) + { + break; + } + vec3 colorDiff = origColor - color; + if (length(colorDiff) < epsilon) + { + vec3 targetColor = targetColors[i]; + gl_FragColor = vec4((targetColor + colorDiff) * alpha, alpha); + return; + } + } + } + `;class lr extends a.Filter{constructor(e,r=.05,i=e.length){super(ar,nr.replace(/%maxColors%/g,i.toFixed(0))),this._replacements=[],this._maxColors=0,this.epsilon=r,this._maxColors=i,this.uniforms.originalColors=new Float32Array(i*3),this.uniforms.targetColors=new Float32Array(i*3),this.replacements=e}set replacements(e){const r=this.uniforms.originalColors,i=this.uniforms.targetColors,o=e.length;if(o>this._maxColors)throw new Error(`Length of replacements (${o}) exceeds the maximum colors length (${this._maxColors})`);r[o*3]=-1;for(let s=0;s 0.5) then: 1 - 2 * (1 - dst) * (1 - src) + return vec3((dst.x <= 0.5) ? (2.0 * src.x * dst.x) : (1.0 - 2.0 * (1.0 - dst.x) * (1.0 - src.x)), + (dst.y <= 0.5) ? (2.0 * src.y * dst.y) : (1.0 - 2.0 * (1.0 - dst.y) * (1.0 - src.y)), + (dst.z <= 0.5) ? (2.0 * src.z * dst.z) : (1.0 - 2.0 * (1.0 - dst.z) * (1.0 - src.z))); + } + + + void main() + { + gl_FragColor = texture2D(uSampler, vTextureCoord); + vec3 color = gl_FragColor.rgb; + + if (sepia > 0.0) + { + float gray = (color.x + color.y + color.z) / 3.0; + vec3 grayscale = vec3(gray); + + color = Overlay(SEPIA_RGB, grayscale); + + color = grayscale + sepia * (color - grayscale); + } + + vec2 coord = vTextureCoord * filterArea.xy / dimensions.xy; + + if (vignetting > 0.0) + { + float outter = SQRT_2 - vignetting * SQRT_2; + vec2 dir = vec2(vec2(0.5, 0.5) - coord); + dir.y *= dimensions.y / dimensions.x; + float darker = clamp((outter - length(dir) * SQRT_2) / ( 0.00001 + vignettingBlur * SQRT_2), 0.0, 1.0); + color.rgb *= darker + (1.0 - darker) * (1.0 - vignettingAlpha); + } + + if (scratchDensity > seed && scratch != 0.0) + { + float phase = seed * 256.0; + float s = mod(floor(phase), 2.0); + float dist = 1.0 / scratchDensity; + float d = distance(coord, vec2(seed * dist, abs(s - seed * dist))); + if (d < seed * 0.6 + 0.4) + { + highp float period = scratchDensity * 10.0; + + float xx = coord.x * period + phase; + float aa = abs(mod(xx, 0.5) * 4.0); + float bb = mod(floor(xx / 0.5), 2.0); + float yy = (1.0 - bb) * aa + bb * (2.0 - aa); + + float kk = 2.0 * period; + float dw = scratchWidth / dimensions.x * (0.75 + seed); + float dh = dw * kk; + + float tine = (yy - (2.0 - dh)); + + if (tine > 0.0) { + float _sign = sign(scratch); + + tine = s * tine / period + scratch + 0.1; + tine = clamp(tine + 1.0, 0.5 + _sign * 0.5, 1.5 + _sign * 0.5); + + color.rgb *= tine; + } + } + } + + if (noise > 0.0 && noiseSize > 0.0) + { + vec2 pixelCoord = vTextureCoord.xy * filterArea.xy; + pixelCoord.x = floor(pixelCoord.x / noiseSize); + pixelCoord.y = floor(pixelCoord.y / noiseSize); + // vec2 d = pixelCoord * noiseSize * vec2(1024.0 + seed * 512.0, 1024.0 - seed * 512.0); + // float _noise = snoise(d) * 0.5; + float _noise = rand(pixelCoord * noiseSize * seed) - 0.5; + color += _noise * noise; + } + + gl_FragColor.rgb = color; + } + `;const le=class extends a.Filter{constructor(t,e=0){super(ur,cr),this.seed=0,this.uniforms.dimensions=new Float32Array(2),typeof t=="number"?(this.seed=t,t=void 0):this.seed=e,Object.assign(this,le.defaults,t)}apply(t,e,r,i){var o,s;this.uniforms.dimensions[0]=(o=e.filterFrame)==null?void 0:o.width,this.uniforms.dimensions[1]=(s=e.filterFrame)==null?void 0:s.height,this.uniforms.seed=this.seed,t.applyFilter(this,e,r,i)}set sepia(t){this.uniforms.sepia=t}get sepia(){return this.uniforms.sepia}set noise(t){this.uniforms.noise=t}get noise(){return this.uniforms.noise}set noiseSize(t){this.uniforms.noiseSize=t}get noiseSize(){return this.uniforms.noiseSize}set scratch(t){this.uniforms.scratch=t}get scratch(){return this.uniforms.scratch}set scratchDensity(t){this.uniforms.scratchDensity=t}get scratchDensity(){return this.uniforms.scratchDensity}set scratchWidth(t){this.uniforms.scratchWidth=t}get scratchWidth(){return this.uniforms.scratchWidth}set vignetting(t){this.uniforms.vignetting=t}get vignetting(){return this.uniforms.vignetting}set vignettingAlpha(t){this.uniforms.vignettingAlpha=t}get vignettingAlpha(){return this.uniforms.vignettingAlpha}set vignettingBlur(t){this.uniforms.vignettingBlur=t}get vignettingBlur(){return this.uniforms.vignettingBlur}};let ue=le;ue.defaults={sepia:.3,noise:.3,noiseSize:1,scratch:.5,scratchDensity:.3,scratchWidth:1,vignetting:.3,vignettingAlpha:1,vignettingBlur:.3};var fr=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,dr=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform vec4 filterClamp; + + uniform float uAlpha; + uniform vec2 uThickness; + uniform vec4 uColor; + uniform bool uKnockout; + + const float DOUBLE_PI = 2. * 3.14159265358979323846264; + const float ANGLE_STEP = \${angleStep}; + + float outlineMaxAlphaAtPos(vec2 pos) { + if (uThickness.x == 0. || uThickness.y == 0.) { + return 0.; + } + + vec4 displacedColor; + vec2 displacedPos; + float maxAlpha = 0.; + + for (float angle = 0.; angle <= DOUBLE_PI; angle += ANGLE_STEP) { + displacedPos.x = vTextureCoord.x + uThickness.x * cos(angle); + displacedPos.y = vTextureCoord.y + uThickness.y * sin(angle); + displacedColor = texture2D(uSampler, clamp(displacedPos, filterClamp.xy, filterClamp.zw)); + maxAlpha = max(maxAlpha, displacedColor.a); + } + + return maxAlpha; + } + + void main(void) { + vec4 sourceColor = texture2D(uSampler, vTextureCoord); + vec4 contentColor = sourceColor * float(!uKnockout); + float outlineAlpha = uAlpha * outlineMaxAlphaAtPos(vTextureCoord.xy) * (1.-sourceColor.a); + vec4 outlineColor = vec4(vec3(uColor) * outlineAlpha, outlineAlpha); + gl_FragColor = contentColor + outlineColor; + } + `;const A=class extends a.Filter{constructor(t=1,e=0,r=.1,i=1,o=!1){super(fr,dr.replace(/\$\{angleStep\}/,A.getAngleStep(r))),this._thickness=1,this._alpha=1,this._knockout=!1,this.uniforms.uThickness=new Float32Array([0,0]),this.uniforms.uColor=new Float32Array([0,0,0,1]),this.uniforms.uAlpha=i,this.uniforms.uKnockout=o,Object.assign(this,{thickness:t,color:e,quality:r,alpha:i,knockout:o})}static getAngleStep(t){const e=Math.max(t*A.MAX_SAMPLES,A.MIN_SAMPLES);return(Math.PI*2/e).toFixed(7)}apply(t,e,r,i){this.uniforms.uThickness[0]=this._thickness/e._frame.width,this.uniforms.uThickness[1]=this._thickness/e._frame.height,this.uniforms.uAlpha=this._alpha,this.uniforms.uKnockout=this._knockout,t.applyFilter(this,e,r,i)}get alpha(){return this._alpha}set alpha(t){this._alpha=t}get color(){return a.utils.rgb2hex(this.uniforms.uColor)}set color(t){a.utils.hex2rgb(t,this.uniforms.uColor)}get knockout(){return this._knockout}set knockout(t){this._knockout=t}get thickness(){return this._thickness}set thickness(t){this._thickness=t,this.padding=t}};let E=A;E.MIN_SAMPLES=1,E.MAX_SAMPLES=100;var hr=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,mr=`precision mediump float; + + varying vec2 vTextureCoord; + + uniform vec2 size; + uniform sampler2D uSampler; + + uniform vec4 filterArea; + + vec2 mapCoord( vec2 coord ) + { + coord *= filterArea.xy; + coord += filterArea.zw; + + return coord; + } + + vec2 unmapCoord( vec2 coord ) + { + coord -= filterArea.zw; + coord /= filterArea.xy; + + return coord; + } + + vec2 pixelate(vec2 coord, vec2 size) + { + return floor( coord / size ) * size; + } + + void main(void) + { + vec2 coord = mapCoord(vTextureCoord); + + coord = pixelate(coord, size); + + coord = unmapCoord(coord); + + gl_FragColor = texture2D(uSampler, coord); + } + `;class gr extends a.Filter{constructor(e=10){super(hr,mr),this.size=e}get size(){return this.uniforms.size}set size(e){typeof e=="number"&&(e=[e,e]),this.uniforms.size=e}}var vr=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,pr=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform vec4 filterArea; + + uniform float uRadian; + uniform vec2 uCenter; + uniform float uRadius; + uniform int uKernelSize; + + const int MAX_KERNEL_SIZE = 2048; + + void main(void) + { + vec4 color = texture2D(uSampler, vTextureCoord); + + if (uKernelSize == 0) + { + gl_FragColor = color; + return; + } + + float aspect = filterArea.y / filterArea.x; + vec2 center = uCenter.xy / filterArea.xy; + float gradient = uRadius / filterArea.x * 0.3; + float radius = uRadius / filterArea.x - gradient * 0.5; + int k = uKernelSize - 1; + + vec2 coord = vTextureCoord; + vec2 dir = vec2(center - coord); + float dist = length(vec2(dir.x, dir.y * aspect)); + + float radianStep = uRadian; + if (radius >= 0.0 && dist > radius) { + float delta = dist - radius; + float gap = gradient; + float scale = 1.0 - abs(delta / gap); + if (scale <= 0.0) { + gl_FragColor = color; + return; + } + radianStep *= scale; + } + radianStep /= float(k); + + float s = sin(radianStep); + float c = cos(radianStep); + mat2 rotationMatrix = mat2(vec2(c, -s), vec2(s, c)); + + for(int i = 0; i < MAX_KERNEL_SIZE - 1; i++) { + if (i == k) { + break; + } + + coord -= center; + coord.y *= aspect; + coord = rotationMatrix * coord; + coord.y /= aspect; + coord += center; + + vec4 sample = texture2D(uSampler, coord); + + // switch to pre-multiplied alpha to correctly blur transparent images + // sample.rgb *= sample.a; + + color += sample; + } + + gl_FragColor = color / float(uKernelSize); + } + `;class xr extends a.Filter{constructor(e=0,r=[0,0],i=5,o=-1){super(vr,pr),this._angle=0,this.angle=e,this.center=r,this.kernelSize=i,this.radius=o}apply(e,r,i,o){this.uniforms.uKernelSize=this._angle!==0?this.kernelSize:0,e.applyFilter(this,r,i,o)}set angle(e){this._angle=e,this.uniforms.uRadian=e*Math.PI/180}get angle(){return this._angle}get center(){return this.uniforms.uCenter}set center(e){this.uniforms.uCenter=e}get radius(){return this.uniforms.uRadius}set radius(e){(e<0||e===1/0)&&(e=-1),this.uniforms.uRadius=e}}var yr=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Cr=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + + uniform vec4 filterArea; + uniform vec4 filterClamp; + uniform vec2 dimensions; + + uniform bool mirror; + uniform float boundary; + uniform vec2 amplitude; + uniform vec2 waveLength; + uniform vec2 alpha; + uniform float time; + + float rand(vec2 co) { + return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453); + } + + void main(void) + { + vec2 pixelCoord = vTextureCoord.xy * filterArea.xy; + vec2 coord = pixelCoord / dimensions; + + if (coord.y < boundary) { + gl_FragColor = texture2D(uSampler, vTextureCoord); + return; + } + + float k = (coord.y - boundary) / (1. - boundary + 0.0001); + float areaY = boundary * dimensions.y / filterArea.y; + float v = areaY + areaY - vTextureCoord.y; + float y = mirror ? v : vTextureCoord.y; + + float _amplitude = ((amplitude.y - amplitude.x) * k + amplitude.x ) / filterArea.x; + float _waveLength = ((waveLength.y - waveLength.x) * k + waveLength.x) / filterArea.y; + float _alpha = (alpha.y - alpha.x) * k + alpha.x; + + float x = vTextureCoord.x + cos(v * 6.28 / _waveLength - time) * _amplitude; + x = clamp(x, filterClamp.x, filterClamp.z); + + vec4 color = texture2D(uSampler, vec2(x, y)); + + gl_FragColor = color * _alpha; + } + `;const ce=class extends a.Filter{constructor(t){super(yr,Cr),this.time=0,this.uniforms.amplitude=new Float32Array(2),this.uniforms.waveLength=new Float32Array(2),this.uniforms.alpha=new Float32Array(2),this.uniforms.dimensions=new Float32Array(2),Object.assign(this,ce.defaults,t)}apply(t,e,r,i){var o,s;this.uniforms.dimensions[0]=(o=e.filterFrame)==null?void 0:o.width,this.uniforms.dimensions[1]=(s=e.filterFrame)==null?void 0:s.height,this.uniforms.time=this.time,t.applyFilter(this,e,r,i)}set mirror(t){this.uniforms.mirror=t}get mirror(){return this.uniforms.mirror}set boundary(t){this.uniforms.boundary=t}get boundary(){return this.uniforms.boundary}set amplitude(t){this.uniforms.amplitude[0]=t[0],this.uniforms.amplitude[1]=t[1]}get amplitude(){return this.uniforms.amplitude}set waveLength(t){this.uniforms.waveLength[0]=t[0],this.uniforms.waveLength[1]=t[1]}get waveLength(){return this.uniforms.waveLength}set alpha(t){this.uniforms.alpha[0]=t[0],this.uniforms.alpha[1]=t[1]}get alpha(){return this.uniforms.alpha}};let fe=ce;fe.defaults={mirror:!0,boundary:.5,amplitude:[0,20],waveLength:[30,100],alpha:[1,1],time:0};var _r=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,br=`precision mediump float; + + varying vec2 vTextureCoord; + + uniform sampler2D uSampler; + uniform vec4 filterArea; + uniform vec2 red; + uniform vec2 green; + uniform vec2 blue; + + void main(void) + { + gl_FragColor.r = texture2D(uSampler, vTextureCoord + red/filterArea.xy).r; + gl_FragColor.g = texture2D(uSampler, vTextureCoord + green/filterArea.xy).g; + gl_FragColor.b = texture2D(uSampler, vTextureCoord + blue/filterArea.xy).b; + gl_FragColor.a = texture2D(uSampler, vTextureCoord).a; + } + `;class Sr extends a.Filter{constructor(e=[-10,0],r=[0,10],i=[0,0]){super(_r,br),this.red=e,this.green=r,this.blue=i}get red(){return this.uniforms.red}set red(e){this.uniforms.red=e}get green(){return this.uniforms.green}set green(e){this.uniforms.green=e}get blue(){return this.uniforms.blue}set blue(e){this.uniforms.blue=e}}var Tr=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Fr=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform vec4 filterArea; + uniform vec4 filterClamp; + + uniform vec2 center; + + uniform float amplitude; + uniform float wavelength; + // uniform float power; + uniform float brightness; + uniform float speed; + uniform float radius; + + uniform float time; + + const float PI = 3.14159; + + void main() + { + float halfWavelength = wavelength * 0.5 / filterArea.x; + float maxRadius = radius / filterArea.x; + float currentRadius = time * speed / filterArea.x; + + float fade = 1.0; + + if (maxRadius > 0.0) { + if (currentRadius > maxRadius) { + gl_FragColor = texture2D(uSampler, vTextureCoord); + return; + } + fade = 1.0 - pow(currentRadius / maxRadius, 2.0); + } + + vec2 dir = vec2(vTextureCoord - center / filterArea.xy); + dir.y *= filterArea.y / filterArea.x; + float dist = length(dir); + + if (dist <= 0.0 || dist < currentRadius - halfWavelength || dist > currentRadius + halfWavelength) { + gl_FragColor = texture2D(uSampler, vTextureCoord); + return; + } + + vec2 diffUV = normalize(dir); + + float diff = (dist - currentRadius) / halfWavelength; + + float p = 1.0 - pow(abs(diff), 2.0); + + // float powDiff = diff * pow(p, 2.0) * ( amplitude * fade ); + float powDiff = 1.25 * sin(diff * PI) * p * ( amplitude * fade ); + + vec2 offset = diffUV * powDiff / filterArea.xy; + + // Do clamp : + vec2 coord = vTextureCoord + offset; + vec2 clampedCoord = clamp(coord, filterClamp.xy, filterClamp.zw); + vec4 color = texture2D(uSampler, clampedCoord); + if (coord != clampedCoord) { + color *= max(0.0, 1.0 - length(coord - clampedCoord)); + } + + // No clamp : + // gl_FragColor = texture2D(uSampler, vTextureCoord + offset); + + color.rgb *= 1.0 + (brightness - 1.0) * p * fade; + + gl_FragColor = color; + } + `;const de=class extends a.Filter{constructor(t=[0,0],e,r=0){super(Tr,Fr),this.center=t,Object.assign(this,de.defaults,e),this.time=r}apply(t,e,r,i){this.uniforms.time=this.time,t.applyFilter(this,e,r,i)}get center(){return this.uniforms.center}set center(t){this.uniforms.center=t}get amplitude(){return this.uniforms.amplitude}set amplitude(t){this.uniforms.amplitude=t}get wavelength(){return this.uniforms.wavelength}set wavelength(t){this.uniforms.wavelength=t}get brightness(){return this.uniforms.brightness}set brightness(t){this.uniforms.brightness=t}get speed(){return this.uniforms.speed}set speed(t){this.uniforms.speed=t}get radius(){return this.uniforms.radius}set radius(t){this.uniforms.radius=t}};let he=de;he.defaults={amplitude:30,wavelength:160,brightness:1,speed:500,radius:-1};var Ar=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,zr=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform sampler2D uLightmap; + uniform vec4 filterArea; + uniform vec2 dimensions; + uniform vec4 ambientColor; + void main() { + vec4 diffuseColor = texture2D(uSampler, vTextureCoord); + vec2 lightCoord = (vTextureCoord * filterArea.xy) / dimensions; + vec4 light = texture2D(uLightmap, lightCoord); + vec3 ambient = ambientColor.rgb * ambientColor.a; + vec3 intensity = ambient + light.rgb; + vec3 finalColor = diffuseColor.rgb * intensity; + gl_FragColor = vec4(finalColor, diffuseColor.a); + } + `;class wr extends a.Filter{constructor(e,r=0,i=1){super(Ar,zr),this._color=0,this.uniforms.dimensions=new Float32Array(2),this.uniforms.ambientColor=new Float32Array([0,0,0,i]),this.texture=e,this.color=r}apply(e,r,i,o){var s,n;this.uniforms.dimensions[0]=(s=r.filterFrame)==null?void 0:s.width,this.uniforms.dimensions[1]=(n=r.filterFrame)==null?void 0:n.height,e.applyFilter(this,r,i,o)}get texture(){return this.uniforms.uLightmap}set texture(e){this.uniforms.uLightmap=e}set color(e){const r=this.uniforms.ambientColor;typeof e=="number"?(a.utils.hex2rgb(e,r),this._color=e):(r[0]=e[0],r[1]=e[1],r[2]=e[2],r[3]=e[3],this._color=a.utils.rgb2hex(r))}get color(){return this._color}get alpha(){return this.uniforms.ambientColor[3]}set alpha(e){this.uniforms.ambientColor[3]=e}}var Pr=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Mr=`varying vec2 vTextureCoord; + + uniform sampler2D uSampler; + uniform float blur; + uniform float gradientBlur; + uniform vec2 start; + uniform vec2 end; + uniform vec2 delta; + uniform vec2 texSize; + + float random(vec3 scale, float seed) + { + return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed); + } + + void main(void) + { + vec4 color = vec4(0.0); + float total = 0.0; + + float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0); + vec2 normal = normalize(vec2(start.y - end.y, end.x - start.x)); + float radius = smoothstep(0.0, 1.0, abs(dot(vTextureCoord * texSize - start, normal)) / gradientBlur) * blur; + + for (float t = -30.0; t <= 30.0; t++) + { + float percent = (t + offset - 0.5) / 30.0; + float weight = 1.0 - abs(percent); + vec4 sample = texture2D(uSampler, vTextureCoord + delta / texSize * percent * radius); + sample.rgb *= sample.a; + color += sample * weight; + total += weight; + } + + color /= total; + color.rgb /= color.a + 0.00001; + + gl_FragColor = color; + } + `;class $ extends a.Filter{constructor(e){var r,i;super(Pr,Mr),this.uniforms.blur=e.blur,this.uniforms.gradientBlur=e.gradientBlur,this.uniforms.start=(r=e.start)!=null?r:new a.Point(0,window.innerHeight/2),this.uniforms.end=(i=e.end)!=null?i:new a.Point(600,window.innerHeight/2),this.uniforms.delta=new a.Point(30,30),this.uniforms.texSize=new a.Point(window.innerWidth,window.innerHeight),this.updateDelta()}updateDelta(){this.uniforms.delta.x=0,this.uniforms.delta.y=0}get blur(){return this.uniforms.blur}set blur(e){this.uniforms.blur=e}get gradientBlur(){return this.uniforms.gradientBlur}set gradientBlur(e){this.uniforms.gradientBlur=e}get start(){return this.uniforms.start}set start(e){this.uniforms.start=e,this.updateDelta()}get end(){return this.uniforms.end}set end(e){this.uniforms.end=e,this.updateDelta()}}class me extends ${updateDelta(){const e=this.uniforms.end.x-this.uniforms.start.x,r=this.uniforms.end.y-this.uniforms.start.y,i=Math.sqrt(e*e+r*r);this.uniforms.delta.x=e/i,this.uniforms.delta.y=r/i}}class ge extends ${updateDelta(){const e=this.uniforms.end.x-this.uniforms.start.x,r=this.uniforms.end.y-this.uniforms.start.y,i=Math.sqrt(e*e+r*r);this.uniforms.delta.x=-r/i,this.uniforms.delta.y=e/i}}const ve=class extends a.Filter{constructor(t,e,r,i){super(),typeof t=="number"&&(a.utils.deprecation("5.3.0","TiltShiftFilter constructor arguments is deprecated, use options."),t={blur:t,gradientBlur:e,start:r,end:i}),t=Object.assign({},ve.defaults,t),this.tiltShiftXFilter=new me(t),this.tiltShiftYFilter=new ge(t)}apply(t,e,r,i){const o=t.getFilterTexture();this.tiltShiftXFilter.apply(t,e,o,1),this.tiltShiftYFilter.apply(t,o,r,i),t.returnFilterTexture(o)}get blur(){return this.tiltShiftXFilter.blur}set blur(t){this.tiltShiftXFilter.blur=this.tiltShiftYFilter.blur=t}get gradientBlur(){return this.tiltShiftXFilter.gradientBlur}set gradientBlur(t){this.tiltShiftXFilter.gradientBlur=this.tiltShiftYFilter.gradientBlur=t}get start(){return this.tiltShiftXFilter.start}set start(t){this.tiltShiftXFilter.start=this.tiltShiftYFilter.start=t}get end(){return this.tiltShiftXFilter.end}set end(t){this.tiltShiftXFilter.end=this.tiltShiftYFilter.end=t}};let pe=ve;pe.defaults={blur:100,gradientBlur:600,start:void 0,end:void 0};var Dr=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,kr=`varying vec2 vTextureCoord; + + uniform sampler2D uSampler; + uniform float radius; + uniform float angle; + uniform vec2 offset; + uniform vec4 filterArea; + + vec2 mapCoord( vec2 coord ) + { + coord *= filterArea.xy; + coord += filterArea.zw; + + return coord; + } + + vec2 unmapCoord( vec2 coord ) + { + coord -= filterArea.zw; + coord /= filterArea.xy; + + return coord; + } + + vec2 twist(vec2 coord) + { + coord -= offset; + + float dist = length(coord); + + if (dist < radius) + { + float ratioDist = (radius - dist) / radius; + float angleMod = ratioDist * ratioDist * angle; + float s = sin(angleMod); + float c = cos(angleMod); + coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c); + } + + coord += offset; + + return coord; + } + + void main(void) + { + + vec2 coord = mapCoord(vTextureCoord); + + coord = twist(coord); + + coord = unmapCoord(coord); + + gl_FragColor = texture2D(uSampler, coord ); + + } + `;const xe=class extends a.Filter{constructor(t){super(Dr,kr),Object.assign(this,xe.defaults,t)}get offset(){return this.uniforms.offset}set offset(t){this.uniforms.offset=t}get radius(){return this.uniforms.radius}set radius(t){this.uniforms.radius=t}get angle(){return this.uniforms.angle}set angle(t){this.uniforms.angle=t}};let ye=xe;ye.defaults={radius:200,angle:4,padding:20,offset:new a.Point};var Or=`attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + + uniform mat3 projectionMatrix; + + varying vec2 vTextureCoord; + + void main(void) + { + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + }`,Rr=`varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform vec4 filterArea; + + uniform vec2 uCenter; + uniform float uStrength; + uniform float uInnerRadius; + uniform float uRadius; + + const float MAX_KERNEL_SIZE = \${maxKernelSize}; + + // author: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/ + highp float rand(vec2 co, float seed) { + const highp float a = 12.9898, b = 78.233, c = 43758.5453; + highp float dt = dot(co + seed, vec2(a, b)), sn = mod(dt, 3.14159); + return fract(sin(sn) * c + seed); + } + + void main() { + + float minGradient = uInnerRadius * 0.3; + float innerRadius = (uInnerRadius + minGradient * 0.5) / filterArea.x; + + float gradient = uRadius * 0.3; + float radius = (uRadius - gradient * 0.5) / filterArea.x; + + float countLimit = MAX_KERNEL_SIZE; + + vec2 dir = vec2(uCenter.xy / filterArea.xy - vTextureCoord); + float dist = length(vec2(dir.x, dir.y * filterArea.y / filterArea.x)); + + float strength = uStrength; + + float delta = 0.0; + float gap; + if (dist < innerRadius) { + delta = innerRadius - dist; + gap = minGradient; + } else if (radius >= 0.0 && dist > radius) { // radius < 0 means it's infinity + delta = dist - radius; + gap = gradient; + } + + if (delta > 0.0) { + float normalCount = gap / filterArea.x; + delta = (normalCount - delta) / normalCount; + countLimit *= delta; + strength *= delta; + if (countLimit < 1.0) + { + gl_FragColor = texture2D(uSampler, vTextureCoord); + return; + } + } + + // randomize the lookup values to hide the fixed number of samples + float offset = rand(vTextureCoord, 0.0); + + float total = 0.0; + vec4 color = vec4(0.0); + + dir *= strength; + + for (float t = 0.0; t < MAX_KERNEL_SIZE; t++) { + float percent = (t + offset) / MAX_KERNEL_SIZE; + float weight = 4.0 * (percent - percent * percent); + vec2 p = vTextureCoord + dir * percent; + vec4 sample = texture2D(uSampler, p); + + // switch to pre-multiplied alpha to correctly blur transparent images + // sample.rgb *= sample.a; + + color += sample * weight; + total += weight; + + if (t > countLimit){ + break; + } + } + + color /= total; + // switch back from pre-multiplied alpha + // color.rgb /= color.a + 0.00001; + + gl_FragColor = color; + } + `,Ce=Object.getOwnPropertySymbols,Er=Object.prototype.hasOwnProperty,$r=Object.prototype.propertyIsEnumerable,jr=(t,e)=>{var r={};for(var i in t)Er.call(t,i)&&e.indexOf(i)<0&&(r[i]=t[i]);if(t!=null&&Ce)for(var i of Ce(t))e.indexOf(i)<0&&$r.call(t,i)&&(r[i]=t[i]);return r};const _e=class extends a.Filter{constructor(t){const e=Object.assign(_e.defaults,t),{maxKernelSize:r}=e,i=jr(e,["maxKernelSize"]);super(Or,Rr.replace("${maxKernelSize}",r.toFixed(1))),Object.assign(this,i)}get center(){return this.uniforms.uCenter}set center(t){this.uniforms.uCenter=t}get strength(){return this.uniforms.uStrength}set strength(t){this.uniforms.uStrength=t}get innerRadius(){return this.uniforms.uInnerRadius}set innerRadius(t){this.uniforms.uInnerRadius=t}get radius(){return this.uniforms.uRadius}set radius(t){(t<0||t===1/0)&&(t=-1),this.uniforms.uRadius=t}};let be=_e;return be.defaults={strength:.1,center:[0,0],innerRadius:0,radius:-1,maxKernelSize:32},f.AdjustmentFilter=ke,f.AdvancedBloomFilter=N,f.AsciiFilter=Ne,f.BevelFilter=Xe,f.BloomFilter=qe,f.BulgePinchFilter=B,f.CRTFilter=H,f.ColorGradientFilter=F,f.ColorMapFilter=yt,f.ColorOverlayFilter=bt,f.ColorReplaceFilter=Ft,f.ConvolutionFilter=wt,f.CrossHatchFilter=Dt,f.DotFilter=$t,f.DropShadowFilter=te,f.EmbossFilter=Xt,f.GlitchFilter=b,f.GlowFilter=ie,f.GodrayFilter=se,f.GrayscaleFilter=er,f.HslAdjustmentFilter=ne,f.KawaseBlurFilter=T,f.MotionBlurFilter=sr,f.MultiColorReplaceFilter=lr,f.OldFilmFilter=ue,f.OutlineFilter=E,f.PixelateFilter=gr,f.RGBSplitFilter=Sr,f.RadialBlurFilter=xr,f.ReflectionFilter=fe,f.ShockwaveFilter=he,f.SimpleLightmapFilter=wr,f.TiltShiftAxisFilter=$,f.TiltShiftFilter=pe,f.TiltShiftXFilter=me,f.TiltShiftYFilter=ge,f.TwistFilter=ye,f.ZoomBlurFilter=be,Object.defineProperty(f,"__esModule",{value:!0}),f}({},PIXI,PIXI.filters,PIXI.filters);Object.assign(PIXI.filters,__filters); + //# sourceMappingURL=pixi-filters.js.map \ No newline at end of file diff --git a/TextureAtlas/DisplaceAtlas.tps b/TextureAtlas/DisplaceAtlas.tps new file mode 100644 index 000000000..822a4f846 --- /dev/null +++ b/TextureAtlas/DisplaceAtlas.tps @@ -0,0 +1,2194 @@ + + + + fileFormatVersion + 6 + texturePackerVersion + 7.1.0 + autoSDSettings + + + scale + 1 + extension + + spriteFilter + + acceptFractionalValues + + maxTextureSize + + width + -1 + height + -1 + + + + allowRotation + + shapeDebug + + dpi + 72 + dataFormat + pixijs4 + textureFileName + + flipPVR + + pvrQualityLevel + 3 + astcQualityLevel + 2 + basisUniversalQualityLevel + 2 + etc1QualityLevel + 70 + etc2QualityLevel + 70 + dxtCompressionMode + DXT_PERCEPTUAL + ditherType + NearestNeighbour + backgroundColor + 0 + libGdx + + filtering + + x + Linear + y + Linear + + + shapePadding + 2 + jpgQuality + 80 + pngOptimizationLevel + 1 + webpQualityLevel + 101 + textureSubPath + + textureFormat + webp + borderPadding + 2 + maxTextureSize + + width + 2048 + height + 2048 + + fixedTextureSize + + width + -1 + height + -1 + + algorithmSettings + + algorithm + MaxRects + freeSizeMode + Fast + sizeConstraints + AnySize + forceSquared + + maxRects + + heuristic + Best + + basic + + sortBy + Best + order + Ascending + + polygon + + alignToGrid + 1 + + + dataFileNames + + data + + name + displace{n}.json + + + multiPackMode + MultiPackAuto + forceIdenticalLayout + + outputFormat + RGBA8888 + alphaHandling + ReduceBorderArtifacts + contentProtection + + key + + + autoAliasEnabled + + trimSpriteNames + + prependSmartFolderName + + autodetectAnimations + + globalSpriteSettings + + scale + 0.25 + scaleMode + Fast + extrude + 1 + trimThreshold + 1 + trimMargin + 1 + trimMode + Trim + tracerTolerance + 200 + heuristicMask + + defaultPivotPoint + 0,0 + writePivotPoints + + + individualSpriteSettings + + ../DisplacementMaps/AnkleCuffLeftClosed.png + ../DisplacementMaps/AnkleCuffLeftKneel.png + ../DisplacementMaps/AnkleCuffLeftKneelClosed.png + ../DisplacementMaps/AnkleCuffLeftSpread.png + ../DisplacementMaps/AnkleCuffRightClosed.png + ../DisplacementMaps/AnkleCuffRightSpread.png + ../DisplacementMaps/AnklesSquishClosed.png + ../DisplacementMaps/AnklesSquishKneel.png + ../DisplacementMaps/BallSuit.png + ../DisplacementMaps/BalletCuffsClosed.png + ../DisplacementMaps/BalletCuffsSpread.png + ../DisplacementMaps/BalletEraseSpread.png + ../DisplacementMaps/BalletRightEraseClosed.png + ../DisplacementMaps/BalletRightEraseKneel.png + ../DisplacementMaps/BalletSpread.png + ../DisplacementMaps/BedStrapsHogtieBoxtie.png + ../DisplacementMaps/Belt.png + ../DisplacementMaps/BeltFeet1SquishKneelClosed.png + ../DisplacementMaps/BeltFeet2SquishClosed.png + ../DisplacementMaps/BeltFeet2SquishKneelClosed.png + ../DisplacementMaps/BeltLegs1SquishClosed.png + ../DisplacementMaps/BeltLegs2SquishClosed.png + ../DisplacementMaps/BeltLegs2SquishKneelClosed.png + ../DisplacementMaps/BeltSquish.png + ../DisplacementMaps/BootsClosed.png + ../DisplacementMaps/BootsHogtie.png + ../DisplacementMaps/BootsKneel.png + ../DisplacementMaps/BootsKneelClosed.png + ../DisplacementMaps/BootsShortClosed.png + ../DisplacementMaps/BootsShortHogtie.png + ../DisplacementMaps/BootsShortKneel.png + ../DisplacementMaps/BootsShortKneelClosed.png + ../DisplacementMaps/BootsShortSpread.png + ../DisplacementMaps/BootsSpread.png + ../DisplacementMaps/Bubble.png + ../DisplacementMaps/Bubble2.png + ../DisplacementMaps/Calf1SquishClosed.png + ../DisplacementMaps/Calf1SquishKneelClosed.png + ../DisplacementMaps/Calf2SquishClosed.png + ../DisplacementMaps/Calf2SquishHogtie.png + ../DisplacementMaps/Calf2SquishKneelClosed.png + ../DisplacementMaps/Calf3SquishClosed.png + ../DisplacementMaps/Calf3SquishHogtie.png + ../DisplacementMaps/Calf3SquishKneelClosed.png + ../DisplacementMaps/CrystalErase.png + ../DisplacementMaps/FrogThigh1SquishKneel.png + ../DisplacementMaps/FrogThigh1SquishKneelClosed.png + ../DisplacementMaps/FrogThigh2SquishKneel.png + ../DisplacementMaps/FrogThigh2SquishKneelClosed.png + ../DisplacementMaps/FrogThigh3SquishKneel.png + ../DisplacementMaps/FrogThigh3SquishKneelClosed.png + ../DisplacementMaps/FutureBox.png + ../DisplacementMaps/HarnessSquish.png + ../DisplacementMaps/Heels2Kneel.png + ../DisplacementMaps/Heels2KneelClosed.png + ../DisplacementMaps/Heels2Spread.png + ../DisplacementMaps/HeelsEraseClosed.png + ../DisplacementMaps/HeelsKneelClosed.png + ../DisplacementMaps/HeelsRightErase.png + ../DisplacementMaps/HeelsRightErase2.png + ../DisplacementMaps/HeelsRightErase2Closed.png + ../DisplacementMaps/HeelsRightEraseClosed.png + ../DisplacementMaps/HeelsSpread.png + ../DisplacementMaps/LegbinderSquishClosed.png + ../DisplacementMaps/MittLFree.png + ../DisplacementMaps/MittRYoked.png + ../DisplacementMaps/MittsFree.png + ../DisplacementMaps/MittsFront.png + ../DisplacementMaps/MittsYoked.png + ../DisplacementMaps/Sarco.png + ../DisplacementMaps/SlimeCorsetErase.png + ../DisplacementMaps/SlimeThighsClosed.png + ../DisplacementMaps/SockLSquish_LongClosed.png + ../DisplacementMaps/SockLSquish_LongHogtie.png + ../DisplacementMaps/SockLSquish_LongKneel.png + ../DisplacementMaps/SockLSquish_LongKneelClosed.png + ../DisplacementMaps/SockLSquish_LongSpread.png + ../DisplacementMaps/SockLSquish_MidClosed.png + ../DisplacementMaps/SockLSquish_MidHogtie.png + ../DisplacementMaps/SockLSquish_MidKneel.png + ../DisplacementMaps/SockLSquish_MidKneelClosed.png + ../DisplacementMaps/SockLSquish_MidSpread.png + ../DisplacementMaps/SockLSquish_ShortClosed.png + ../DisplacementMaps/SockLSquish_ShortKneel.png + ../DisplacementMaps/SockLSquish_ShortKneelClosed.png + ../DisplacementMaps/SockLSquish_ShortSpread.png + ../DisplacementMaps/SockRSquish_LongClosed.png + ../DisplacementMaps/SockRSquish_LongHogtie.png + ../DisplacementMaps/SockRSquish_LongKneel.png + ../DisplacementMaps/SockRSquish_LongKneelClosed.png + ../DisplacementMaps/SockRSquish_LongSpread.png + ../DisplacementMaps/SockRSquish_MidClosed.png + ../DisplacementMaps/SockRSquish_MidHogtie.png + ../DisplacementMaps/SockRSquish_MidKneel.png + ../DisplacementMaps/SockRSquish_MidKneelClosed.png + ../DisplacementMaps/SockRSquish_MidSpread.png + ../DisplacementMaps/SockRSquish_ShortClosed.png + ../DisplacementMaps/SockRSquish_ShortSpread.png + ../DisplacementMaps/TapeAnklesSquishClosed.png + ../DisplacementMaps/TapeArmsBoxtie.png + ../DisplacementMaps/TapeClosed.png + ../DisplacementMaps/TapeFullRightCrossed.png + ../DisplacementMaps/TapeFullRightWristtie.png + ../DisplacementMaps/TapeMedLeftBoxtie.png + ../DisplacementMaps/TapeMedLeftCrossed.png + ../DisplacementMaps/TapeMedLeftWristtie.png + ../DisplacementMaps/TapeTopLeftBoxtie.png + ../DisplacementMaps/TapeTopLeftCrossed.png + ../DisplacementMaps/TapeTopLeftWristtie.png + ../DisplacementMaps/TapeTopRightBoxtie.png + ../DisplacementMaps/TapeTopRightCrossed.png + ../DisplacementMaps/TapeTopRightWristtie.png + ../DisplacementMaps/Template_Closed.png + ../DisplacementMaps/Template_ClosedL.png + ../DisplacementMaps/Template_ClosedR.png + ../DisplacementMaps/Template_Free.png + ../DisplacementMaps/Template_Hogtie.png + ../DisplacementMaps/Template_HogtieL.png + ../DisplacementMaps/Template_HogtieR.png + ../DisplacementMaps/Template_Kneel.png + ../DisplacementMaps/Template_KneelClosedL.png + ../DisplacementMaps/Template_KneelClosedR.png + ../DisplacementMaps/Template_KneelL.png + ../DisplacementMaps/Template_KneelR.png + ../DisplacementMaps/Thigh1SquishClosed.png + ../DisplacementMaps/Thigh1SquishHogtie.png + ../DisplacementMaps/Thigh1SquishKneelClosed.png + ../DisplacementMaps/Thigh2SquishClosed.png + ../DisplacementMaps/Thigh2SquishHogtie.png + ../DisplacementMaps/Thigh2SquishKneelClosed.png + ../DisplacementMaps/Thigh3SquishClosed.png + ../DisplacementMaps/Thigh3SquishHogtie.png + ../DisplacementMaps/Thigh3SquishKneelClosed.png + ../DisplacementMaps/ThighCuffsLeftClosed.png + ../DisplacementMaps/ThighCuffsLeftKneel.png + ../DisplacementMaps/ThighCuffsLeftKneelClosed.png + ../DisplacementMaps/ThighCuffsRightKneel.png + ../DisplacementMaps/Yoke.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 620,877,1240,1754 + scale9Paddings + 620,877,1240,1754 + scale9FromFile + + + ../DisplacementMaps/Arm1SquishBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 510,447,1019,894 + scale9Paddings + 510,447,1019,894 + scale9FromFile + + + ../DisplacementMaps/Arm1SquishWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 482,357,963,713 + scale9Paddings + 482,357,963,713 + scale9FromFile + + + ../DisplacementMaps/Arm2SquishBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 508,342,1016,683 + scale9Paddings + 508,342,1016,683 + scale9FromFile + + + ../DisplacementMaps/Arm2SquishWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 492,335,985,670 + scale9Paddings + 492,335,985,670 + scale9FromFile + + + ../DisplacementMaps/ArmHarnessSquish.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 410,225,821,449 + scale9Paddings + 410,225,821,449 + scale9FromFile + + + ../DisplacementMaps/ArmStrapCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 381,452,761,905 + scale9Paddings + 381,452,761,905 + scale9FromFile + + + ../DisplacementMaps/BalletClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 426,877,851,1754 + scale9Paddings + 426,877,851,1754 + scale9FromFile + + + ../DisplacementMaps/BalletCuffsHogtie.png + ../DisplacementMaps/BalletHogtie.png + ../DisplacementMaps/Heels2Hogtie.png + ../DisplacementMaps/HeelsHogtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 3,2,6,4 + scale9Paddings + 3,2,6,4 + scale9FromFile + + + ../DisplacementMaps/BalletCuffsKneel.png + ../DisplacementMaps/BalletKneel.png + ../DisplacementMaps/LegbinderSquishKneelClosed.png + ../DisplacementMaps/PetsuitSquish.png + ../DisplacementMaps/SlimeThighsKneelClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 519,609,1037,1217 + scale9Paddings + 519,609,1037,1217 + scale9FromFile + + + ../DisplacementMaps/BalletCuffsKneelClosed.png + ../DisplacementMaps/BalletKneelClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 511,590,1021,1181 + scale9Paddings + 511,590,1021,1181 + scale9FromFile + + + ../DisplacementMaps/BalletErase.png + ../DisplacementMaps/BalletRightErase.png + ../DisplacementMaps/HeelsErase.png + ../DisplacementMaps/HeelsEraseSpread.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 0,0,1,1 + scale9Paddings + 0,0,1,1 + scale9FromFile + + + ../DisplacementMaps/BedStrapsHogtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 620,613,1240,1226 + scale9Paddings + 620,613,1240,1226 + scale9FromFile + + + ../DisplacementMaps/BeltFeet1SquishClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 412,744,824,1487 + scale9Paddings + 412,744,824,1487 + scale9FromFile + + + ../DisplacementMaps/BeltLegs1SquishHogtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 262,564,524,1127 + scale9Paddings + 262,564,524,1127 + scale9FromFile + + + ../DisplacementMaps/BeltLegs1SquishKneelClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 257,477,513,955 + scale9Paddings + 257,477,513,955 + scale9FromFile + + + ../DisplacementMaps/BeltLegs2SquishHogtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 282,627,564,1253 + scale9Paddings + 282,627,564,1253 + scale9FromFile + + + ../DisplacementMaps/BinderLeftBoxtie.png + ../DisplacementMaps/BinderRightBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 482,400,963,800 + scale9Paddings + 482,400,963,800 + scale9FromFile + + + ../DisplacementMaps/BinderLeftWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 505,400,1009,800 + scale9Paddings + 505,400,1009,800 + scale9FromFile + + + ../DisplacementMaps/BinderRightWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 505,393,1009,785 + scale9Paddings + 505,393,1009,785 + scale9FromFile + + + ../DisplacementMaps/Breastplate.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 449,376,899,751 + scale9Paddings + 449,376,899,751 + scale9FromFile + + + ../DisplacementMaps/BubbleHead.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 620,657,1240,1313 + scale9Paddings + 620,657,1240,1313 + scale9FromFile + + + ../DisplacementMaps/BustHuge.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 620,457,1240,913 + scale9Paddings + 620,457,1240,913 + scale9FromFile + + + ../DisplacementMaps/ButtSleeves.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 433,548,866,1095 + scale9Paddings + 433,548,866,1095 + scale9FromFile + + + ../DisplacementMaps/CorsetSquish.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 620,220,1240,440 + scale9Paddings + 620,220,1240,440 + scale9FromFile + + + ../DisplacementMaps/CorsetSquishTight.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 522,477,1043,955 + scale9Paddings + 522,477,1043,955 + scale9FromFile + + + ../DisplacementMaps/CrotchropeSquished.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 449,432,897,863 + scale9Paddings + 449,432,897,863 + scale9FromFile + + + ../DisplacementMaps/CuffLeftCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 8,3,15,7 + scale9Paddings + 8,3,15,7 + scale9FromFile + + + ../DisplacementMaps/CuffLeftFree.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 539,559,1079,1117 + scale9Paddings + 539,559,1079,1117 + scale9FromFile + + + ../DisplacementMaps/CuffLeftFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 14,6,29,13 + scale9Paddings + 14,6,29,13 + scale9FromFile + + + ../DisplacementMaps/CuffLeftYoked.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 570,291,1139,581 + scale9Paddings + 570,291,1139,581 + scale9FromFile + + + ../DisplacementMaps/CuffRightCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 11,8,21,17 + scale9Paddings + 11,8,21,17 + scale9FromFile + + + ../DisplacementMaps/CuffRightFree.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 286,427,573,855 + scale9Paddings + 286,427,573,855 + scale9FromFile + + + ../DisplacementMaps/CuffRightFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 10,7,19,14 + scale9Paddings + 10,7,19,14 + scale9FromFile + + + ../DisplacementMaps/CuffRightYoked.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 264,268,529,535 + scale9Paddings + 264,268,529,535 + scale9FromFile + + + ../DisplacementMaps/CuffsSquishCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 345,433,690,867 + scale9Paddings + 345,433,690,867 + scale9FromFile + + + ../DisplacementMaps/CuffsSquishFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 433,341,866,681 + scale9Paddings + 433,341,866,681 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffLeftBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 498,382,996,763 + scale9Paddings + 498,382,996,763 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffLeftCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 487,385,974,771 + scale9Paddings + 487,385,974,771 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffLeftFree.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 486,405,971,810 + scale9Paddings + 486,405,971,810 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffLeftFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 494,385,987,769 + scale9Paddings + 494,385,987,769 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffLeftUp.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 531,198,1063,395 + scale9Paddings + 531,198,1063,395 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffLeftWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 491,442,981,884 + scale9Paddings + 491,442,981,884 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffLeftYoked.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 537,455,1074,909 + scale9Paddings + 537,455,1074,909 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffRightBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 371,424,743,847 + scale9Paddings + 371,424,743,847 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffRightCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 352,446,704,891 + scale9Paddings + 352,446,704,891 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffRightFree.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 384,430,767,859 + scale9Paddings + 384,430,767,859 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffRightFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 337,428,673,856 + scale9Paddings + 337,428,673,856 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffRightUp.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 390,310,779,620 + scale9Paddings + 390,310,779,620 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffRightWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 351,465,703,929 + scale9Paddings + 351,465,703,929 + scale9FromFile + + + ../DisplacementMaps/ElbowCuffRightYoked.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 378,450,755,900 + scale9Paddings + 378,450,755,900 + scale9FromFile + + + ../DisplacementMaps/EraseCorset.png + ../DisplacementMaps/Null.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 1,1,1,1 + scale9Paddings + 1,1,1,1 + scale9FromFile + + + ../DisplacementMaps/EraseCorsetEncase.png + ../DisplacementMaps/EraseCorsetKneel.png + ../DisplacementMaps/EraseCorsetKneelEncase.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 483,560,965,1120 + scale9Paddings + 483,560,965,1120 + scale9FromFile + + + ../DisplacementMaps/EraseSkirtSplit.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 446,605,893,1210 + scale9Paddings + 446,605,893,1210 + scale9FromFile + + + ../DisplacementMaps/Fiddle.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 620,558,1240,1115 + scale9Paddings + 620,558,1240,1115 + scale9FromFile + + + ../DisplacementMaps/ForeArm1SquishWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 487,437,974,873 + scale9Paddings + 487,437,974,873 + scale9FromFile + + + ../DisplacementMaps/ForeArm2SquishWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 620,382,1240,765 + scale9Paddings + 620,382,1240,765 + scale9FromFile + + + ../DisplacementMaps/GuardLeftFree.png + ../DisplacementMaps/GuardLeftFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 620,435,1240,871 + scale9Paddings + 620,435,1240,871 + scale9FromFile + + + ../DisplacementMaps/GuardLeftYoked.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 535,314,1071,627 + scale9Paddings + 535,314,1071,627 + scale9FromFile + + + ../DisplacementMaps/GuardRightFree.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 301,415,601,831 + scale9Paddings + 301,415,601,831 + scale9FromFile + + + ../DisplacementMaps/GuardRightFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 287,362,574,723 + scale9Paddings + 287,362,574,723 + scale9FromFile + + + ../DisplacementMaps/GuardRightYoked.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 229,339,458,677 + scale9Paddings + 229,339,458,677 + scale9FromFile + + + ../DisplacementMaps/Heels2Closed.png + ../DisplacementMaps/HeelsClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 4,4,9,8 + scale9Paddings + 4,4,9,8 + scale9FromFile + + + ../DisplacementMaps/HeelsKneel.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 515,567,1030,1133 + scale9Paddings + 515,567,1030,1133 + scale9FromFile + + + ../DisplacementMaps/HideBoxtieHand.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 395,392,790,784 + scale9Paddings + 395,392,790,784 + scale9FromFile + + + ../DisplacementMaps/JacketArmsBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 467,399,934,797 + scale9Paddings + 467,399,934,797 + scale9FromFile + + + ../DisplacementMaps/JacketArmsCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 480,409,961,817 + scale9Paddings + 480,409,961,817 + scale9FromFile + + + ../DisplacementMaps/JacketArmsWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 483,464,967,928 + scale9Paddings + 483,464,967,928 + scale9FromFile + + + ../DisplacementMaps/JacketBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 478,409,956,817 + scale9Paddings + 478,409,956,817 + scale9FromFile + + + ../DisplacementMaps/JacketCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 476,462,951,923 + scale9Paddings + 476,462,951,923 + scale9FromFile + + + ../DisplacementMaps/JacketWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 456,446,912,891 + scale9Paddings + 456,446,912,891 + scale9FromFile + + + ../DisplacementMaps/LaceChest.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 429,373,857,747 + scale9Paddings + 429,373,857,747 + scale9FromFile + + + ../DisplacementMaps/Leg1SquishClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 511,382,1023,763 + scale9Paddings + 511,382,1023,763 + scale9FromFile + + + ../DisplacementMaps/LegbinderSquishHogtie.png + ../DisplacementMaps/SlimeThighsHogtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 464,700,929,1399 + scale9Paddings + 464,700,929,1399 + scale9FromFile + + + ../DisplacementMaps/LightMaidRightArmErase.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 445,439,891,878 + scale9Paddings + 445,439,891,878 + scale9FromFile + + + ../DisplacementMaps/MittLCrossed.png + ../DisplacementMaps/MittRCrossed.png + ../DisplacementMaps/MittsCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 3,3,5,5 + scale9Paddings + 3,3,5,5 + scale9FromFile + + + ../DisplacementMaps/MittLFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 400,348,800,697 + scale9Paddings + 400,348,800,697 + scale9FromFile + + + ../DisplacementMaps/MittLYoked.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 582,291,1164,581 + scale9Paddings + 582,291,1164,581 + scale9FromFile + + + ../DisplacementMaps/MittRFree.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 241,395,481,789 + scale9Paddings + 241,395,481,789 + scale9FromFile + + + ../DisplacementMaps/MittRFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 620,339,1240,677 + scale9Paddings + 620,339,1240,677 + scale9FromFile + + + ../DisplacementMaps/ReversePrayer.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 486,412,971,825 + scale9Paddings + 486,412,971,825 + scale9FromFile + + + ../DisplacementMaps/SlimeLeftClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 436,853,872,1705 + scale9Paddings + 436,853,872,1705 + scale9FromFile + + + ../DisplacementMaps/SlimeRightClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 417,865,833,1729 + scale9Paddings + 417,865,833,1729 + scale9FromFile + + + ../DisplacementMaps/SockLSquish_ShortHogtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 15,14,30,29 + scale9Paddings + 15,14,30,29 + scale9FromFile + + + ../DisplacementMaps/SockRSquish_ShortHogtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 16,18,31,36 + scale9Paddings + 16,18,31,36 + scale9FromFile + + + ../DisplacementMaps/SockRSquish_ShortKneel.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 14,11,27,21 + scale9Paddings + 14,11,27,21 + scale9FromFile + + + ../DisplacementMaps/SockRSquish_ShortKneelClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 14,13,29,25 + scale9Paddings + 14,13,29,25 + scale9FromFile + + + ../DisplacementMaps/SovietHatErase.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 369,127,737,253 + scale9Paddings + 369,127,737,253 + scale9FromFile + + + ../DisplacementMaps/TapeAnklesSquishHogtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 1,2,3,5 + scale9Paddings + 1,2,3,5 + scale9FromFile + + + ../DisplacementMaps/TapeAnklesSquishKneel.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 483,601,965,1201 + scale9Paddings + 483,601,965,1201 + scale9FromFile + + + ../DisplacementMaps/TapeAnklesSquishKneelClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 457,582,913,1164 + scale9Paddings + 457,582,913,1164 + scale9FromFile + + + ../DisplacementMaps/TapeFullLeft.png + ../DisplacementMaps/TapeFullRight.png + ../DisplacementMaps/TapeHeavyLeft.png + ../DisplacementMaps/TapeHeavyRight.png + ../DisplacementMaps/TapeLightLeft.png + ../DisplacementMaps/TapeLightRight.png + ../DisplacementMaps/TapeMedLeft.png + ../DisplacementMaps/TapeMedRight.png + ../DisplacementMaps/TapeTopLeft.png + ../DisplacementMaps/TapeTopRight.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 4,4,8,8 + scale9Paddings + 4,4,8,8 + scale9FromFile + + + ../DisplacementMaps/TapeFullLeftBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 498,318,996,636 + scale9Paddings + 498,318,996,636 + scale9FromFile + + + ../DisplacementMaps/TapeFullLeftCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 503,318,1005,636 + scale9Paddings + 503,318,1005,636 + scale9FromFile + + + ../DisplacementMaps/TapeFullLeftWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 471,314,941,629 + scale9Paddings + 471,314,941,629 + scale9FromFile + + + ../DisplacementMaps/TapeFullRightBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 281,351,561,701 + scale9Paddings + 281,351,561,701 + scale9FromFile + + + ../DisplacementMaps/TapeHeavyLeftBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 488,438,975,875 + scale9Paddings + 488,438,975,875 + scale9FromFile + + + ../DisplacementMaps/TapeHeavyLeftCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 494,442,987,884 + scale9Paddings + 494,442,987,884 + scale9FromFile + + + ../DisplacementMaps/TapeHeavyLeftWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 458,435,915,869 + scale9Paddings + 458,435,915,869 + scale9FromFile + + + ../DisplacementMaps/TapeHeavyRightBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 280,395,559,789 + scale9Paddings + 280,395,559,789 + scale9FromFile + + + ../DisplacementMaps/TapeHeavyRightCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 438,443,877,885 + scale9Paddings + 438,443,877,885 + scale9FromFile + + + ../DisplacementMaps/TapeHeavyRightWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 281,467,561,934 + scale9Paddings + 281,467,561,934 + scale9FromFile + + + ../DisplacementMaps/TapeLightLeftBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 508,413,1017,825 + scale9Paddings + 508,413,1017,825 + scale9FromFile + + + ../DisplacementMaps/TapeLightLeftCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 478,445,956,890 + scale9Paddings + 478,445,956,890 + scale9FromFile + + + ../DisplacementMaps/TapeLightLeftWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 462,453,923,906 + scale9Paddings + 462,453,923,906 + scale9FromFile + + + ../DisplacementMaps/TapeLightRightBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 272,393,543,787 + scale9Paddings + 272,393,543,787 + scale9FromFile + + + ../DisplacementMaps/TapeLightRightCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 278,413,557,827 + scale9Paddings + 278,413,557,827 + scale9FromFile + + + ../DisplacementMaps/TapeLightRightWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 281,429,563,857 + scale9Paddings + 281,429,563,857 + scale9FromFile + + + ../DisplacementMaps/TapeMedRightBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 317,423,633,845 + scale9Paddings + 317,423,633,845 + scale9FromFile + + + ../DisplacementMaps/TapeMedRightCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 302,413,603,827 + scale9Paddings + 302,413,603,827 + scale9FromFile + + + ../DisplacementMaps/TapeMedRightWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 307,458,614,917 + scale9Paddings + 307,458,614,917 + scale9FromFile + + + ../DisplacementMaps/ThighCuffsLeftSpread.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 543,595,1086,1191 + scale9Paddings + 543,595,1086,1191 + scale9FromFile + + + ../DisplacementMaps/ThighCuffsRightClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 314,628,629,1255 + scale9Paddings + 314,628,629,1255 + scale9FromFile + + + ../DisplacementMaps/ThighCuffsRightKneelClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 297,513,593,1025 + scale9Paddings + 297,513,593,1025 + scale9FromFile + + + ../DisplacementMaps/ThighCuffsRightSpread.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 273,615,546,1229 + scale9Paddings + 273,615,546,1229 + scale9FromFile + + + ../DisplacementMaps/TightBelt.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 460,446,919,893 + scale9Paddings + 460,446,919,893 + scale9FromFile + + + ../DisplacementMaps/TightUpperSquish.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 403,359,805,718 + scale9Paddings + 403,359,805,718 + scale9FromFile + + + ../DisplacementMaps/Xray.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 426,843,853,1685 + scale9Paddings + 426,843,853,1685 + scale9FromFile + + + ../DisplacementMaps/XrayBra.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 431,379,861,759 + scale9Paddings + 431,379,861,759 + scale9FromFile + + + ../DisplacementMaps/XrayFace.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 407,207,815,413 + scale9Paddings + 407,207,815,413 + scale9FromFile + + + ../DisplacementMaps/XrayPanties.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 446,544,891,1087 + scale9Paddings + 446,544,891,1087 + scale9FromFile + + + + fileLists + + default + + files + + ../DisplacementMaps + + + + ignoreFileList + + replaceList + + ignoredWarnings + + large-max-texture-size + pixijs-multipack-2023-05-25 + + commonDivisorX + 1 + commonDivisorY + 1 + packNormalMaps + + autodetectNormalMaps + + normalMapFilter + + normalMapSuffix + + normalMapSheetFileName + + exporterProperties + + + diff --git a/TextureAtlas/GameAtlas.tps b/TextureAtlas/GameAtlas.tps new file mode 100644 index 000000000..128b709d1 --- /dev/null +++ b/TextureAtlas/GameAtlas.tps @@ -0,0 +1,4641 @@ + + + + fileFormatVersion + 6 + texturePackerVersion + 7.1.0 + autoSDSettings + + + scale + 1 + extension + + spriteFilter + + acceptFractionalValues + + maxTextureSize + + width + -1 + height + -1 + + + + allowRotation + + shapeDebug + + dpi + 72 + dataFormat + pixijs4 + textureFileName + + flipPVR + + pvrQualityLevel + 3 + astcQualityLevel + 2 + basisUniversalQualityLevel + 2 + etc1QualityLevel + 70 + etc2QualityLevel + 70 + dxtCompressionMode + DXT_PERCEPTUAL + ditherType + NearestNeighbour + backgroundColor + 0 + libGdx + + filtering + + x + Linear + y + Linear + + + shapePadding + 0 + jpgQuality + 80 + pngOptimizationLevel + 1 + webpQualityLevel + 101 + textureSubPath + + textureFormat + png + borderPadding + 0 + maxTextureSize + + width + 2048 + height + 2048 + + fixedTextureSize + + width + -1 + height + -1 + + algorithmSettings + + algorithm + MaxRects + freeSizeMode + Fast + sizeConstraints + AnySize + forceSquared + + maxRects + + heuristic + Best + + basic + + sortBy + Best + order + Ascending + + polygon + + alignToGrid + 1 + + + dataFileNames + + data + + name + game{n}.json + + + multiPackMode + MultiPackAuto + forceIdenticalLayout + + outputFormat + RGBA8888 + alphaHandling + ClearTransparentPixels + contentProtection + + key + + + autoAliasEnabled + + trimSpriteNames + + prependSmartFolderName + + autodetectAnimations + + globalSpriteSettings + + scale + 1 + scaleMode + Smooth + extrude + 1 + trimThreshold + 1 + trimMargin + 1 + trimMode + Trim + tracerTolerance + 200 + heuristicMask + + defaultPivotPoint + 0,0 + writePivotPoints + + + individualSpriteSettings + + ../Game/Aura.png + ../Game/Bullets/AMGagBolt.png + ../Game/Bullets/AMGagBoltHit.png + ../Game/Bullets/AllyCrackle.png + ../Game/Bullets/AllyCrackleHit.png + ../Game/Bullets/AllyCrackleTrail.png + ../Game/Bullets/AllyCrackleTrailHit.png + ../Game/Bullets/AllyFirebolt.png + ../Game/Bullets/AllyFireboltHit.png + ../Game/Bullets/AllyHolyBolt.png + ../Game/Bullets/AllyHolyBoltHit.png + ../Game/Bullets/AllyShadowStrike.png + ../Game/Bullets/AllyShadowStrikeHit.png + ../Game/Bullets/AllyWindBlast.png + ../Game/Bullets/AllyWindBlastHit.png + ../Game/Bullets/AmpuleBlue.png + ../Game/Bullets/AmpuleBlueHit.png + ../Game/Bullets/AmpuleGreen.png + ../Game/Bullets/AmpuleGreenHit.png + ../Game/Bullets/AmpuleRed.png + ../Game/Bullets/AmpuleRedHit.png + ../Game/Bullets/AmpuleYellow.png + ../Game/Bullets/AmpuleYellowHit.png + ../Game/Bullets/ArcaneBlast.png + ../Game/Bullets/ArcaneBlastHit.png + ../Game/Bullets/AreaElectrifyHit.png + ../Game/Bullets/ArmbinderBolt.png + ../Game/Bullets/ArmbinderBoltHit.png + ../Game/Bullets/ArrowBolt.png + ../Game/Bullets/ArrowBoltHeavy.png + ../Game/Bullets/ArrowBoltHeavyHit.png + ../Game/Bullets/ArrowBoltHit.png + ../Game/Bullets/ArrowBoltPistol.png + ../Game/Bullets/ArrowBoltPistolHit.png + ../Game/Bullets/ArrowLongbow.png + ../Game/Bullets/ArrowLongbowHit.png + ../Game/Bullets/ArrowNormal.png + ../Game/Bullets/ArrowNormalHit.png + ../Game/Bullets/ArrowRecurve.png + ../Game/Bullets/ArrowRecurveHit.png + ../Game/Bullets/ArrowVine.png + ../Game/Bullets/ArrowVineHit.png + ../Game/Bullets/AwakenStrikeHit.png + ../Game/Bullets/BanditBola.png + ../Game/Bullets/BanditBolaHit.png + ../Game/Bullets/BanditBoltaHit.png + ../Game/Bullets/BearTrap.png + ../Game/Bullets/BearTrapHit.png + ../Game/Bullets/BeltStrike.png + ../Game/Bullets/BeltStrikeHit.png + ../Game/Bullets/BigBoulderLaunch.png + ../Game/Bullets/BigBoulderLaunchHit.png + ../Game/Bullets/BindBeltHit.png + ../Game/Bullets/BindChainHit.png + ../Game/Bullets/BindFabricHit.png + ../Game/Bullets/BindRopeHit.png + ../Game/Bullets/BindVineHit.png + ../Game/Bullets/BindWrappingHit.png + ../Game/Bullets/BlasterBlast.png + ../Game/Bullets/BlasterBlastHit.png + ../Game/Bullets/BlindfoldBolt.png + ../Game/Bullets/BlindfoldBoltHit.png + ../Game/Bullets/Blink.png + ../Game/Bullets/BlinkHit.png + ../Game/Bullets/BondageBust.png + ../Game/Bullets/BondageBustBeam.png + ../Game/Bullets/BondageBustBeamHit.png + ../Game/Bullets/BondageBustBeamTrail.png + ../Game/Bullets/BondageBustBeamTrailHit.png + ../Game/Bullets/BondageBustHit.png + ../Game/Bullets/Boulder.png + ../Game/Bullets/BoulderHit.png + ../Game/Bullets/BoulderKicked.png + ../Game/Bullets/BoulderKickedHit.png + ../Game/Bullets/BoulderLaunch.png + ../Game/Bullets/BoulderLaunchHit.png + ../Game/Bullets/Bubbleexp.png + ../Game/Bullets/BubbleexpHit.png + ../Game/Bullets/CelestialBolt.png + ../Game/Bullets/CelestialBoltHit.png + ../Game/Bullets/ChainBolt.png + ../Game/Bullets/ChainBoltHit.png + ../Game/Bullets/ClericBeam.png + ../Game/Bullets/ClericBeamBeam.png + ../Game/Bullets/ClericBeamBeamHit.png + ../Game/Bullets/ClericBeamBeamTrail.png + ../Game/Bullets/ClericBeamBeamTrailHit.png + ../Game/Bullets/ClericBeamHit.png + ../Game/Bullets/ColdFeet.png + ../Game/Bullets/ColdFeetHit.png + ../Game/Bullets/Corona.png + ../Game/Bullets/CoronaBeam.png + ../Game/Bullets/CoronaBeamHit.png + ../Game/Bullets/CoronaBeamTrail.png + ../Game/Bullets/CoronaBeamTrailHit.png + ../Game/Bullets/CoronaHit.png + ../Game/Bullets/Crackle.png + ../Game/Bullets/CrackleHit.png + ../Game/Bullets/CrackleTrail.png + ../Game/Bullets/CrackleTrailHit.png + ../Game/Bullets/CrystalBolt.png + ../Game/Bullets/CrystalBoltHit.png + ../Game/Bullets/CrystalBoltMany.png + ../Game/Bullets/CrystalBoltManyHit.png + ../Game/Bullets/CrystalBoltSingle.png + ../Game/Bullets/CrystalBoltSingleHit.png + ../Game/Bullets/CrystalPuff.png + ../Game/Bullets/CrystalPuffHit.png + ../Game/Bullets/CrystalShock.png + ../Game/Bullets/CrystalShockHit.png + ../Game/Bullets/CuffsBolt.png + ../Game/Bullets/CuffsBoltHit.png + ../Game/Bullets/CursedArrow.png + ../Game/Bullets/CursedArrowHit.png + ../Game/Bullets/Dagger.png + ../Game/Bullets/DaggerHit.png + ../Game/Bullets/DistractionBurstBullet.png + ../Game/Bullets/DragonIceBolt.png + ../Game/Bullets/DragonIceBoltHit.png + ../Game/Bullets/DragonSlash.png + ../Game/Bullets/DragonSlashHit.png + ../Game/Bullets/DragonVine.png + ../Game/Bullets/DragonVineHit.png + ../Game/Bullets/DryadBlast.png + ../Game/Bullets/DryadBlastHit.png + ../Game/Bullets/EarthformLine.png + ../Game/Bullets/EarthformLineHit.png + ../Game/Bullets/EarthformLineTrail.png + ../Game/Bullets/EarthformLineTrailHit.png + ../Game/Bullets/ElasticGripHit.png + ../Game/Bullets/ElectricEffect.png + ../Game/Bullets/Electrify.png + ../Game/Bullets/ElectrifyHit.png + ../Game/Bullets/ElfArrow.png + ../Game/Bullets/ElfArrowHit.png + ../Game/Bullets/EncaseBolt.png + ../Game/Bullets/EncaseBoltDrone.png + ../Game/Bullets/EncaseBoltDroneHit.png + ../Game/Bullets/EncaseBoltHit.png + ../Game/Bullets/EnemyBlast.png + ../Game/Bullets/EnemyBlastHit.png + ../Game/Bullets/EnemyCorona.png + ../Game/Bullets/EnemyCoronaBeam.png + ../Game/Bullets/EnemyCoronaBeamHit.png + ../Game/Bullets/EnemyCoronaBeamTrail.png + ../Game/Bullets/EnemyCoronaBeamTrailHit.png + ../Game/Bullets/EnemyCoronaHit.png + ../Game/Bullets/EnemyLatexArmbinderBolt.png + ../Game/Bullets/EnemyLatexArmbinderBoltHit.png + ../Game/Bullets/EnemyLatexGagBolt.png + ../Game/Bullets/EnemyLatexGagBoltHit.png + ../Game/Bullets/EnemyLatexLegbinderBolt.png + ../Game/Bullets/EnemyLatexLegbinderBoltHit.png + ../Game/Bullets/EnemyLatexRestraintBolt.png + ../Game/Bullets/EnemyLatexRestraintBoltHit.png + ../Game/Bullets/EnemyMiscastHit.png + ../Game/Bullets/EnemySteelRainBurst.png + ../Game/Bullets/EnemySteelRainBurstHit.png + ../Game/Bullets/EnemySteelRainPlug.png + ../Game/Bullets/EnemySteelRainPlugHit.png + ../Game/Bullets/EnemySummonLatexArmbinder.png + ../Game/Bullets/EnemySummonLatexArmbinderHit.png + ../Game/Bullets/EnemySummonLatexGag.png + ../Game/Bullets/EnemySummonLatexGagHit.png + ../Game/Bullets/EnemySummonLatexLegbinder.png + ../Game/Bullets/EnemySummonLatexLegbinderHit.png + ../Game/Bullets/EnemySummonLatexRestraint.png + ../Game/Bullets/EnemySummonLatexRestraintHit.png + ../Game/Bullets/EnemyWindBlast.png + ../Game/Bullets/EnemyWindBlastHit.png + ../Game/Bullets/EnemyWinterblast.png + ../Game/Bullets/EnemyWinterblastHit.png + ../Game/Bullets/Firebolt.png + ../Game/Bullets/FireboltHit.png + ../Game/Bullets/Fireexp.png + ../Game/Bullets/FireexpHit.png + ../Game/Bullets/Fissure.png + ../Game/Bullets/FissureHit.png + ../Game/Bullets/FissureTrail.png + ../Game/Bullets/FissureTrailHit.png + ../Game/Bullets/FlameRune.png + ../Game/Bullets/FlameRuneHit.png + ../Game/Bullets/FreezeHit.png + ../Game/Bullets/FreezeRune.png + ../Game/Bullets/FreezeRuneHit.png + ../Game/Bullets/FuukaOrb.png + ../Game/Bullets/FuukaOrbHit.png + ../Game/Bullets/FuukaOrbMulti.png + ../Game/Bullets/FuukaOrbMultiHit.png + ../Game/Bullets/GagBolt.png + ../Game/Bullets/GagBoltHit.png + ../Game/Bullets/GlueHit.png + ../Game/Bullets/GreaterShield.png + ../Game/Bullets/GreaterShieldHit.png + ../Game/Bullets/Gust.png + ../Game/Bullets/GustHit.png + ../Game/Bullets/Hairpin.png + ../Game/Bullets/HairpinHit.png + ../Game/Bullets/HarnessBolt.png + ../Game/Bullets/HarnessBoltHit.png + ../Game/Bullets/Heal2Hit.png + ../Game/Bullets/HeartArrow.png + ../Game/Bullets/HeartArrowHit.png + ../Game/Bullets/HeatBolt.png + ../Game/Bullets/HeatBoltHit.png + ../Game/Bullets/HeatBolt_2.png + ../Game/Bullets/HeelShadowStrike.png + ../Game/Bullets/HeelShadowStrikeHit.png + ../Game/Bullets/HexOrb.png + ../Game/Bullets/HexOrbHit.png + ../Game/Bullets/HexWrapping.png + ../Game/Bullets/HexWrappingHit.png + ../Game/Bullets/HighBolt.png + ../Game/Bullets/HighBoltHit.png + ../Game/Bullets/IceBreathHit.png + ../Game/Bullets/IceDragonBreath.png + ../Game/Bullets/IceDragonBreathHit.png + ../Game/Bullets/IceDragonBreathPrepare.png + ../Game/Bullets/IceDragonBreathPrepareHit.png + ../Game/Bullets/IceDragonBreathTrail.png + ../Game/Bullets/IceDragonBreathTrailHit.png + ../Game/Bullets/IceLance.png + ../Game/Bullets/IceLanceHit.png + ../Game/Bullets/IceOrb.png + ../Game/Bullets/IceOrbHit.png + ../Game/Bullets/IceSlow.png + ../Game/Bullets/IceSlowHit.png + ../Game/Bullets/IceSlowPrepare.png + ../Game/Bullets/IceSlowPrepareHit.png + ../Game/Bullets/IceSlowTrail.png + ../Game/Bullets/IceSlowTrailHit.png + ../Game/Bullets/Icebolt.png + ../Game/Bullets/IceboltHit.png + ../Game/Bullets/Iceexp.png + ../Game/Bullets/IceexpHit.png + ../Game/Bullets/IceruneHit.png + ../Game/Bullets/Icicle.png + ../Game/Bullets/IcicleHit.png + ../Game/Bullets/Icicles.png + ../Game/Bullets/IciclesHit.png + ../Game/Bullets/Knife.png + ../Game/Bullets/KnifeHit.png + ../Game/Bullets/LatexArmbinderBolt.png + ../Game/Bullets/LatexArmbinderBoltHit.png + ../Game/Bullets/LatexBubble.png + ../Game/Bullets/LatexBubbleHit.png + ../Game/Bullets/LatexBubbleTrail.png + ../Game/Bullets/LatexBubbleexp.png + ../Game/Bullets/LatexBubbleexpHit.png + ../Game/Bullets/LatexGagBolt.png + ../Game/Bullets/LatexGagBoltHit.png + ../Game/Bullets/LatexLegbinderBolt.png + ../Game/Bullets/LatexLegbinderBoltHit.png + ../Game/Bullets/LatexSpray.png + ../Game/Bullets/LatexSprayHit.png + ../Game/Bullets/LatexWallHoriz.png + ../Game/Bullets/LatexWallHorizHit.png + ../Game/Bullets/LatexWallVert.png + ../Game/Bullets/LatexWallVertHit.png + ../Game/Bullets/Leap.png + ../Game/Bullets/LeapHit.png + ../Game/Bullets/LeatherCuffsBolt.png + ../Game/Bullets/LeatherCuffsBoltHit.png + ../Game/Bullets/LegbinderBolt.png + ../Game/Bullets/LegbinderBoltHit.png + ../Game/Bullets/LightningBolt.png + ../Game/Bullets/LightningBoltHit.png + ../Game/Bullets/LightningBoltTrail.png + ../Game/Bullets/LightningBoltTrailHit.png + ../Game/Bullets/LightningRune.png + ../Game/Bullets/LightningRuneHit.png + ../Game/Bullets/LightningRuneStrike.png + ../Game/Bullets/LightningRuneStrikeHit.png + ../Game/Bullets/LockBullet.png + ../Game/Bullets/LockBulletHit.png + ../Game/Bullets/MagicBelt.png + ../Game/Bullets/MagicBeltHit.png + ../Game/Bullets/MagicChain.png + ../Game/Bullets/MagicChainHit.png + ../Game/Bullets/MagicMissile.png + ../Game/Bullets/MagicMissile2.png + ../Game/Bullets/MagicMissile2Hit.png + ../Game/Bullets/MagicMissileHit.png + ../Game/Bullets/MagicRope.png + ../Game/Bullets/MagicRopeHit.png + ../Game/Bullets/ManyCables.png + ../Game/Bullets/ManyCablesHit.png + ../Game/Bullets/ManyChains.png + ../Game/Bullets/ManyChainsHit.png + ../Game/Bullets/ManyMithrilBolts.png + ../Game/Bullets/ManyMithrilBoltsHit.png + ../Game/Bullets/ManyObsidianBolts.png + ../Game/Bullets/ManyObsidianBoltsHit.png + ../Game/Bullets/ManyOrbs.png + ../Game/Bullets/ManyOrbsHit.png + ../Game/Bullets/ManyShadowHands.png + ../Game/Bullets/ManyShadowHandsHit.png + ../Game/Bullets/ManySlimes.png + ../Game/Bullets/ManySlimesHit.png + ../Game/Bullets/MiniCable.png + ../Game/Bullets/MiniCableHit.png + ../Game/Bullets/MiniSlime.png + ../Game/Bullets/MiniSlimeHit.png + ../Game/Bullets/Minigun.png + ../Game/Bullets/MinigunHit.png + ../Game/Bullets/MithrilBolt.png + ../Game/Bullets/MithrilBoltHit.png + ../Game/Bullets/MonolithBeam.png + ../Game/Bullets/MonolithBeamBeam.png + ../Game/Bullets/MonolithBeamBeamHit.png + ../Game/Bullets/MonolithBeamBeamTrail.png + ../Game/Bullets/MonolithBeamBeamTrailHit.png + ../Game/Bullets/MonolithBeamHit.png + ../Game/Bullets/MummyBolt.png + ../Game/Bullets/MummyBoltHit.png + ../Game/Bullets/NatureMoteBolt.png + ../Game/Bullets/NatureMoteBoltHit.png + ../Game/Bullets/NurseBola.png + ../Game/Bullets/NurseBolaHit.png + ../Game/Bullets/NurseSyringe.png + ../Game/Bullets/NurseSyringeHit.png + ../Game/Bullets/ObserverBeam.png + ../Game/Bullets/ObserverBeamBeam.png + ../Game/Bullets/ObserverBeamBeamHit.png + ../Game/Bullets/ObserverBeamBeamTrail.png + ../Game/Bullets/ObserverBeamBeamTrailHit.png + ../Game/Bullets/ObserverBeamHit.png + ../Game/Bullets/ObsidianBolt.png + ../Game/Bullets/ObsidianBoltHit.png + ../Game/Bullets/OneBarMissile.png + ../Game/Bullets/OneBarMissileHit.png + ../Game/Bullets/OrgasmStrikeHit.png + ../Game/Bullets/PlayerBola.png + ../Game/Bullets/PlayerBolaHit.png + ../Game/Bullets/PlayerRubberSniper.png + ../Game/Bullets/PlayerRubberSniperHit.png + ../Game/Bullets/PoisonDagger.png + ../Game/Bullets/PoisonDaggerHit.png + ../Game/Bullets/PoisonDragonBlast.png + ../Game/Bullets/PoisonDragonBlastHit.png + ../Game/Bullets/RecoverObjectHit.png + ../Game/Bullets/RedSlime.png + ../Game/Bullets/RedSlimeHit.png + ../Game/Bullets/RestrainingBolt.png + ../Game/Bullets/RestrainingBoltHit.png + ../Game/Bullets/RestrainingDevice.png + ../Game/Bullets/RestrainingDeviceHit.png + ../Game/Bullets/Ribbons.png + ../Game/Bullets/RibbonsHit.png + ../Game/Bullets/RobotBolt.png + ../Game/Bullets/RobotBoltHit.png + ../Game/Bullets/RopeBolt.png + ../Game/Bullets/RopeBoltHit.png + ../Game/Bullets/RopeBoltLaunch.png + ../Game/Bullets/RopeBoltLaunchHit.png + ../Game/Bullets/RopeBoltLaunchMany.png + ../Game/Bullets/RopeBoltLaunchManyHit.png + ../Game/Bullets/RopeBoltLaunchSingle.png + ../Game/Bullets/RopeBoltLaunchSingleHit.png + ../Game/Bullets/RubberBolt.png + ../Game/Bullets/RubberBoltHit.png + ../Game/Bullets/RubberBullets.png + ../Game/Bullets/RubberBulletsHit.png + ../Game/Bullets/RubberMissile.png + ../Game/Bullets/RubberMissileHit.png + ../Game/Bullets/RubberNuke.png + ../Game/Bullets/RubberNukeHit.png + ../Game/Bullets/RubberSlimeHit.png + ../Game/Bullets/RubberSniper.png + ../Game/Bullets/RubberSniperHit.png + ../Game/Bullets/SagittaBolt.png + ../Game/Bullets/SagittaBoltHit.png + ../Game/Bullets/SealingBolt.png + ../Game/Bullets/SealingBoltHit.png + ../Game/Bullets/ShadowBolt.png + ../Game/Bullets/ShadowBoltHit.png + ../Game/Bullets/ShadowBubble.png + ../Game/Bullets/ShadowBubbleHit.png + ../Game/Bullets/ShadowDance.png + ../Game/Bullets/ShadowDanceHit.png + ../Game/Bullets/ShadowGraspMulti.png + ../Game/Bullets/ShadowGraspMultiHit.png + ../Game/Bullets/ShadowOrb.png + ../Game/Bullets/ShadowOrbHit.png + ../Game/Bullets/ShadowShroudGirl.png + ../Game/Bullets/ShadowShroudGirlHit.png + ../Game/Bullets/ShadowSlashTrail.png + ../Game/Bullets/ShadowSlashTrailHit.png + ../Game/Bullets/ShadowStrike.png + ../Game/Bullets/ShadowStrikeHit.png + ../Game/Bullets/Shield.png + ../Game/Bullets/ShieldHit.png + ../Game/Bullets/Shock.png + ../Game/Bullets/ShockHit.png + ../Game/Bullets/ShockStrikeHit.png + ../Game/Bullets/SingleBelt.png + ../Game/Bullets/SingleBeltHit.png + ../Game/Bullets/SingleRibbon.png + ../Game/Bullets/SingleRibbonHit.png + ../Game/Bullets/SleepDart.png + ../Game/Bullets/SleepDartHit.png + ../Game/Bullets/SlimeBall.png + ../Game/Bullets/SlimeBallHit.png + ../Game/Bullets/SlimeBallTrail.png + ../Game/Bullets/SlimeEruptionHit.png + ../Game/Bullets/SlimeHit.png + ../Game/Bullets/SlimePuddle.png + ../Game/Bullets/SlimePuddleHit.png + ../Game/Bullets/SlimeSplash.png + ../Game/Bullets/SlimeSplashHit.png + ../Game/Bullets/SlimeWallHoriz.png + ../Game/Bullets/SlimeWallHorizHit.png + ../Game/Bullets/SlimeWallVert.png + ../Game/Bullets/SlimeWallVertHit.png + ../Game/Bullets/Slimethrower.png + ../Game/Bullets/Slimethrower2.png + ../Game/Bullets/Slimethrower2Hit.png + ../Game/Bullets/SlimethrowerHit.png + ../Game/Bullets/SmokePuff.png + ../Game/Bullets/SmokePuffHit.png + ../Game/Bullets/Snare.png + ../Game/Bullets/SnareHit.png + ../Game/Bullets/SnareHitHit.png + ../Game/Bullets/Snowball.png + ../Game/Bullets/SnowballHit.png + ../Game/Bullets/StaticSphereStrikeHit.png + ../Game/Bullets/SteamPuff.png + ../Game/Bullets/SteamPuffHit.png + ../Game/Bullets/SteelRainBurst.png + ../Game/Bullets/SteelRainBurstHit.png + ../Game/Bullets/SteelRainPlug.png + ../Game/Bullets/SteelRainPlugHit.png + ../Game/Bullets/StraitjacketBolt.png + ../Game/Bullets/StraitjacketBoltHit.png + ../Game/Bullets/Summon.png + ../Game/Bullets/SummonAMGag.png + ../Game/Bullets/SummonAMGagHit.png + ../Game/Bullets/SummonArmbinder.png + ../Game/Bullets/SummonArmbinderHit.png + ../Game/Bullets/SummonBlindfold.png + ../Game/Bullets/SummonBlindfoldHit.png + ../Game/Bullets/SummonCrystals.png + ../Game/Bullets/SummonCrystalsHit.png + ../Game/Bullets/SummonCuffs.png + ../Game/Bullets/SummonCuffsHit.png + ../Game/Bullets/SummonGag.png + ../Game/Bullets/SummonGagHit.png + ../Game/Bullets/SummonHarness.png + ../Game/Bullets/SummonHarnessHit.png + ../Game/Bullets/SummonHit.png + ../Game/Bullets/SummonLatexArmbinder.png + ../Game/Bullets/SummonLatexArmbinderHit.png + ../Game/Bullets/SummonLatexElemental.png + ../Game/Bullets/SummonLatexGag.png + ../Game/Bullets/SummonLatexGagHit.png + ../Game/Bullets/SummonLatexLegbinder.png + ../Game/Bullets/SummonLatexLegbinderHit.png + ../Game/Bullets/SummonLeatherCuffs.png + ../Game/Bullets/SummonLeatherCuffsHit.png + ../Game/Bullets/SummonLegbinder.png + ../Game/Bullets/SummonLegbinderHit.png + ../Game/Bullets/SummonRedSlime.png + ../Game/Bullets/SummonSingleRedSlime.png + ../Game/Bullets/SummonStraitjacket.png + ../Game/Bullets/SummonStraitjacketHit.png + ../Game/Bullets/TickleCloud.png + ../Game/Bullets/TickleCloudHit.png + ../Game/Bullets/TrapSleepDart.png + ../Game/Bullets/TrapSleepDartHit.png + ../Game/Bullets/TrueSteelHit.png + ../Game/Bullets/VineSlimeBall.png + ../Game/Bullets/VineSlimeBallHit.png + ../Game/Bullets/Vineexp.png + ../Game/Bullets/VineexpHit.png + ../Game/Bullets/Wall.png + ../Game/Bullets/WaterBall.png + ../Game/Bullets/WaterBallHit.png + ../Game/Bullets/WindBlast.png + ../Game/Bullets/WindBlastHit.png + ../Game/Bullets/WitchBoulder.png + ../Game/Bullets/WitchBoulderHit.png + ../Game/Bullets/WitchChainBolt.png + ../Game/Bullets/WitchChainBoltHit.png + ../Game/Bullets/WitchElectricOrb.png + ../Game/Bullets/WitchElectricOrbHit.png + ../Game/Bullets/WitchElectrify.png + ../Game/Bullets/WitchElectrifyHit.png + ../Game/Bullets/WitchIcebolt.png + ../Game/Bullets/WitchIceboltHit.png + ../Game/Bullets/WitchRope.png + ../Game/Bullets/WitchRopeHit.png + ../Game/Bullets/WitchSlimeBall.png + ../Game/Bullets/WitchSlimeBallHit.png + ../Game/Bullets/WitchSlimeBallTrail.png + ../Game/Bullets/WitchSlimeHit.png + ../Game/Bullets/WitchWaterBall.png + ../Game/Bullets/WitchWaterBallHit.png + ../Game/Bullets/WolfCrackle.png + ../Game/Bullets/WolfCrackleHit.png + ../Game/Bullets/WolfCrackleTrail.png + ../Game/Bullets/WolfCrackleTrailHit.png + ../Game/Bullets/ZombieOrb.png + ../Game/Bullets/ZombieOrbHit.png + ../Game/Bullets/ZombieOrbIce.png + ../Game/Bullets/ZombieOrbIceHit.png + ../Game/Bullets/ZombieOrbMini.png + ../Game/Bullets/ZombieOrbMiniHit.png + ../Game/Conditions/ArmorBuff.png + ../Game/Conditions/ArmorDebuff.png + ../Game/Conditions/Aware.png + ../Game/Conditions/Bind.png + ../Game/Conditions/Blind.png + ../Game/Conditions/BlockBuff.png + ../Game/Conditions/BoundLevel.png + ../Game/Conditions/Buff.png + ../Game/Conditions/DamageAmp.png + ../Game/Conditions/Debuff.png + ../Game/Conditions/Dialogue.png + ../Game/Conditions/Disarm.png + ../Game/Conditions/EvasionBuff.png + ../Game/Conditions/Freeze.png + ../Game/Conditions/Heart.png + ../Game/Conditions/Peace.png + ../Game/Conditions/ShieldBuff.png + ../Game/Conditions/ShieldDebuff.png + ../Game/Conditions/Shop.png + ../Game/Conditions/Silence.png + ../Game/Conditions/Slow.png + ../Game/Conditions/Slow_3.png + ../Game/Conditions/Sneak.png + ../Game/Conditions/Stun.png + ../Game/Conditions/Teleporting.png + ../Game/Conditions/Thought/Angry.png + ../Game/Conditions/Thought/Annoyed.png + ../Game/Conditions/Thought/Aware.png + ../Game/Conditions/Thought/Blind.png + ../Game/Conditions/Thought/Confused.png + ../Game/Conditions/Thought/Embarrassed.png + ../Game/Conditions/Thought/Fire.png + ../Game/Conditions/Thought/Freeze.png + ../Game/Conditions/Thought/GiveUp.png + ../Game/Conditions/Thought/Happy.png + ../Game/Conditions/Thought/Idle.png + ../Game/Conditions/Thought/Jail.png + ../Game/Conditions/Thought/Laugh.png + ../Game/Conditions/Thought/Lose.png + ../Game/Conditions/Thought/Play.png + ../Game/Conditions/Thought/PlayDone.png + ../Game/Conditions/Thought/Search.png + ../Game/Conditions/Thought/Sense.png + ../Game/Conditions/Thought/Shoot.png + ../Game/Conditions/Thought/Status.png + ../Game/Conditions/Thought/Struggle.png + ../Game/Conditions/Thought/Thought.png + ../Game/Conditions/Tired.png + ../Game/Conditions/Vulnerable.png + ../Game/Conditions/VulnerableBlocked.png + ../Game/Conditions/vp.png + ../Game/Cursor.png + ../Game/DamageTypes/acid.png + ../Game/DamageTypes/chain.png + ../Game/DamageTypes/charm.png + ../Game/DamageTypes/cold.png + ../Game/DamageTypes/crush.png + ../Game/DamageTypes/drain.png + ../Game/DamageTypes/electric.png + ../Game/DamageTypes/fire.png + ../Game/DamageTypes/frost.png + ../Game/DamageTypes/glue.png + ../Game/DamageTypes/grope.png + ../Game/DamageTypes/happygas.png + ../Game/DamageTypes/ice.png + ../Game/DamageTypes/magic.png + ../Game/DamageTypes/melee.png + ../Game/DamageTypes/pain.png + ../Game/DamageTypes/pierce.png + ../Game/DamageTypes/poison.png + ../Game/DamageTypes/slash.png + ../Game/DamageTypes/souldrain.png + ../Game/DamageTypes/stun.png + ../Game/DamageTypes/tickle.png + ../Game/DamageTypes/unarmed.png + ../Game/DamageTypes/unflinching.png + ../Game/DamageTypes/unstoppable.png + ../Game/EffectTiles/Acid.png + ../Game/EffectTiles/Belts.png + ../Game/EffectTiles/BoobyTrap.png + ../Game/EffectTiles/BoobyTrapMagic.png + ../Game/EffectTiles/Bubble.png + ../Game/EffectTiles/Chains.png + ../Game/EffectTiles/Chill.png + ../Game/EffectTiles/Cracked.png + ../Game/EffectTiles/CrackedFrozen.png + ../Game/EffectTiles/DistractionMote.png + ../Game/EffectTiles/DistractionMoteContact.png + ../Game/EffectTiles/EdgeOrb.png + ../Game/EffectTiles/EdgeOrbDead.png + ../Game/EffectTiles/Ember.png + ../Game/EffectTiles/Fabric.png + ../Game/EffectTiles/FabricGreen.png + ../Game/EffectTiles/FateBoundGround.png + ../Game/EffectTiles/Fireflies.png + ../Game/EffectTiles/Glue.png + ../Game/EffectTiles/Gunpowder.png + ../Game/EffectTiles/Ice.png + ../Game/EffectTiles/Ignition.png + ../Game/EffectTiles/IllusOrb.png + ../Game/EffectTiles/IllusOrbDead.png + ../Game/EffectTiles/Inferno.png + ../Game/EffectTiles/Inferno_0.png + ../Game/EffectTiles/Inferno_1.png + ../Game/EffectTiles/Inferno_2.png + ../Game/EffectTiles/Inferno_3.png + ../Game/EffectTiles/Lantern.png + ../Game/EffectTiles/LanternUnlit.png + ../Game/EffectTiles/Latex.png + ../Game/EffectTiles/LatexBlue.png + ../Game/EffectTiles/LatexGreen.png + ../Game/EffectTiles/LatexThin.png + ../Game/EffectTiles/LatexThinBlue.png + ../Game/EffectTiles/LatexThinGreen.png + ../Game/EffectTiles/LiquidMetal.png + ../Game/EffectTiles/Magicflies.png + ../Game/EffectTiles/ManaEmpty.png + ../Game/EffectTiles/ManaFull.png + ../Game/EffectTiles/ManaPartial.png + ../Game/EffectTiles/MotionLamp.png + ../Game/EffectTiles/MotionLampLight.png + ../Game/EffectTiles/NoTeleportPlate.png + ../Game/EffectTiles/OrbLantern.png + ../Game/EffectTiles/Portals/CommercePortal.png + ../Game/EffectTiles/Portals/CommercePortalReturn.png + ../Game/EffectTiles/Portals/DarkPortal.png + ../Game/EffectTiles/Portals/Portal.png + ../Game/EffectTiles/PressurePlate.png + ../Game/EffectTiles/PressurePlateActive.png + ../Game/EffectTiles/PressurePlateHold.png + ../Game/EffectTiles/PressurePlateOneUse.png + ../Game/EffectTiles/Radiance.png + ../Game/EffectTiles/Ropes.png + ../Game/EffectTiles/Rubble.png + ../Game/EffectTiles/RubbleNoMend.png + ../Game/EffectTiles/Runes.png + ../Game/EffectTiles/RunesTrap.png + ../Game/EffectTiles/Sack.png + ../Game/EffectTiles/SealSigil.png + ../Game/EffectTiles/Sleet.png + ../Game/EffectTiles/Slime.png + ../Game/EffectTiles/SlimeBurning.png + ../Game/EffectTiles/SlimeFrozen.png + ../Game/EffectTiles/Smoke.png + ../Game/EffectTiles/Soap.png + ../Game/EffectTiles/Sparks.png + ../Game/EffectTiles/SpikeTrap.png + ../Game/EffectTiles/SpikeTrapActive.png + ../Game/EffectTiles/SpikeTrapSeen.png + ../Game/EffectTiles/StarryTrail.png + ../Game/EffectTiles/Steam.png + ../Game/EffectTiles/TauntGround.png + ../Game/EffectTiles/TeleportPlate.png + ../Game/EffectTiles/TeleportPlateMana.png + ../Game/EffectTiles/Torch.png + ../Game/EffectTiles/TorchOrb.png + ../Game/EffectTiles/TorchOrbNoPanel.png + ../Game/EffectTiles/TorchUnlit.png + ../Game/EffectTiles/Vines.png + ../Game/EffectTiles/Water.png + ../Game/EffectTiles/WaterFrozen.png + ../Game/EffectTiles/Wire.png + ../Game/EffectTiles/WireEnd.png + ../Game/EffectTiles/WireHoriz.png + ../Game/EffectTiles/WireSparks.png + ../Game/EffectTiles/WireSparksAct.png + ../Game/EffectTiles/WireVert.png + ../Game/Enemies/AcidBarrel.png + ../Game/Enemies/Adventurer_Brat_Fighter.png + ../Game/Enemies/Adventurer_Dom_Fighter.png + ../Game/Enemies/Adventurer_Sub_Fighter.png + ../Game/Enemies/Adventurer_Switch_Fighter.png + ../Game/Enemies/AirMote.png + ../Game/Enemies/Alchemist.png + ../Game/Enemies/AlchemistPet.png + ../Game/Enemies/Alkahestor.png + ../Game/Enemies/Ally.png + ../Game/Enemies/AllyDoll.png + ../Game/Enemies/AmpuleBlueHit.png + ../Game/Enemies/Angel.png + ../Game/Enemies/AngelHostile.png + ../Game/Enemies/AnimArmbinder.png + ../Game/Enemies/AnimBlindfold.png + ../Game/Enemies/AnimChastity.png + ../Game/Enemies/AnimHarness.png + ../Game/Enemies/AnimLegbinder.png + ../Game/Enemies/AnimStraitjacket.png + ../Game/Enemies/AnimYoke.png + ../Game/Enemies/AnimatedArmor.png + ../Game/Enemies/AntiqueQuest.png + ../Game/Enemies/Apprentice.png + ../Game/Enemies/Apprentice2.png + ../Game/Enemies/ApprenticeQuest.png + ../Game/Enemies/ApprenticeSlime.png + ../Game/Enemies/AquaSlime.png + ../Game/Enemies/ArmorerQuest.png + ../Game/Enemies/Bandit.png + ../Game/Enemies/BanditChief.png + ../Game/Enemies/BanditGrappler.png + ../Game/Enemies/BanditGuard.png + ../Game/Enemies/BanditHunter.png + ../Game/Enemies/BanditMerchant.png + ../Game/Enemies/BanditPet.png + ../Game/Enemies/BanditQuest.png + ../Game/Enemies/Barricade.png + ../Game/Enemies/BarricadeAir.png + ../Game/Enemies/BarricadeBlastDoor.png + ../Game/Enemies/BarricadeConcrete.png + ../Game/Enemies/BarricadeEarth.png + ../Game/Enemies/BarricadeElectric.png + ../Game/Enemies/BarricadeFire.png + ../Game/Enemies/BarricadeHighSecurityDoor.png + ../Game/Enemies/BarricadeIce.png + ../Game/Enemies/BarricadeLight.png + ../Game/Enemies/BarricadeMagic.png + ../Game/Enemies/BarricadeMetal.png + ../Game/Enemies/BarricadeRobot.png + ../Game/Enemies/BarricadeSecurityDoor.png + ../Game/Enemies/BarricadeShadow.png + ../Game/Enemies/BarricadeShadowMetal.png + ../Game/Enemies/BarricadeVine.png + ../Game/Enemies/BarricadeWater.png + ../Game/Enemies/Bat.png + ../Game/Enemies/BigSlime.png + ../Game/Enemies/BindableEnemies/Alchemist.png + ../Game/Enemies/BindableEnemies/AlchemistPet.png + ../Game/Enemies/BindableEnemies/Alkahestor.png + ../Game/Enemies/BindableEnemies/AllyDoll.png + ../Game/Enemies/BindableEnemies/AngelHostile.png + ../Game/Enemies/BindableEnemies/Apprentice.png + ../Game/Enemies/BindableEnemies/Apprentice2.png + ../Game/Enemies/BindableEnemies/ApprenticeQuest.png + ../Game/Enemies/BindableEnemies/ApprenticeSlime.png + ../Game/Enemies/BindableEnemies/Bandit.png + ../Game/Enemies/BindableEnemies/BanditChief.png + ../Game/Enemies/BindableEnemies/BanditGrappler.png + ../Game/Enemies/BindableEnemies/BanditGuard.png + ../Game/Enemies/BindableEnemies/BanditHunter.png + ../Game/Enemies/BindableEnemies/BanditMerchant.png + ../Game/Enemies/BindableEnemies/BanditPet.png + ../Game/Enemies/BindableEnemies/BanditQuest.png + ../Game/Enemies/BindableEnemies/BlindZombie.png + ../Game/Enemies/BindableEnemies/Cleric.png + ../Game/Enemies/BindableEnemies/Conjurer.png + ../Game/Enemies/BindableEnemies/Deputy.png + ../Game/Enemies/BindableEnemies/Dragon.png + ../Game/Enemies/BindableEnemies/DragonCrystal.png + ../Game/Enemies/BindableEnemies/DragonIce.png + ../Game/Enemies/BindableEnemies/DragonLeader.png + ../Game/Enemies/BindableEnemies/DragonPoison.png + ../Game/Enemies/BindableEnemies/DragonShadow.png + ../Game/Enemies/BindableEnemies/DragonShield.png + ../Game/Enemies/BindableEnemies/DragonheartQuest.png + ../Game/Enemies/BindableEnemies/Dressmaker.png + ../Game/Enemies/BindableEnemies/Dryad.png + ../Game/Enemies/BindableEnemies/ElementalAir.png + ../Game/Enemies/BindableEnemies/ElementalEarth.png + ../Game/Enemies/BindableEnemies/ElementalFire.png + ../Game/Enemies/BindableEnemies/ElementalIce.png + ../Game/Enemies/BindableEnemies/ElementalLatex.png + ../Game/Enemies/BindableEnemies/ElementalLeather.png + ../Game/Enemies/BindableEnemies/ElementalRope.png + ../Game/Enemies/BindableEnemies/ElementalWater.png + ../Game/Enemies/BindableEnemies/Elf.png + ../Game/Enemies/BindableEnemies/ElfRanger.png + ../Game/Enemies/BindableEnemies/EncasedDoll.png + ../Game/Enemies/BindableEnemies/FastZombie.png + ../Game/Enemies/BindableEnemies/Fungal.png + ../Game/Enemies/BindableEnemies/Fuuka1.png + ../Game/Enemies/BindableEnemies/Guard.png + ../Game/Enemies/BindableEnemies/GuardHeavy.png + ../Game/Enemies/BindableEnemies/HighWizard.png + ../Game/Enemies/BindableEnemies/JungleDryad.png + ../Game/Enemies/BindableEnemies/Librarian.png + ../Game/Enemies/BindableEnemies/MageZombie.png + ../Game/Enemies/BindableEnemies/Maidforce.png + ../Game/Enemies/BindableEnemies/MaidforceHead.png + ../Game/Enemies/BindableEnemies/MaidforceMafia.png + ../Game/Enemies/BindableEnemies/MaidforcePara.png + ../Game/Enemies/BindableEnemies/MaidforceStalker.png + ../Game/Enemies/BindableEnemies/MeleeCleric.png + ../Game/Enemies/BindableEnemies/Miner.png + ../Game/Enemies/BindableEnemies/Mummy.png + ../Game/Enemies/BindableEnemies/Nawashi.png + ../Game/Enemies/BindableEnemies/NawashiZombie.png + ../Game/Enemies/BindableEnemies/Necromancer.png + ../Game/Enemies/BindableEnemies/Ninja.png + ../Game/Enemies/BindableEnemies/NinjaStalker.png + ../Game/Enemies/BindableEnemies/Nurse.png + ../Game/Enemies/BindableEnemies/SamuraiZombie.png + ../Game/Enemies/BindableEnemies/Skeleton.png + ../Game/Enemies/BindableEnemies/SlimeEnthusiast.png + ../Game/Enemies/BindableEnemies/SummonedZombie.png + ../Game/Enemies/BindableEnemies/TalismanZombie.png + ../Game/Enemies/BindableEnemies/WitchChain.png + ../Game/Enemies/BindableEnemies/WitchEarth.png + ../Game/Enemies/BindableEnemies/WitchFlame.png + ../Game/Enemies/BindableEnemies/WitchIce.png + ../Game/Enemies/BindableEnemies/WitchMagnet.png + ../Game/Enemies/BindableEnemies/WitchMetal.png + ../Game/Enemies/BindableEnemies/WitchRope.png + ../Game/Enemies/BindableEnemies/WitchShock.png + ../Game/Enemies/BindableEnemies/WitchSlime.png + ../Game/Enemies/BindableEnemies/WitchWater.png + ../Game/Enemies/BindableEnemies/Wolfgirl.png + ../Game/Enemies/BindableEnemies/WolfgirlPet.png + ../Game/Enemies/BlacksmithQuest.png + ../Game/Enemies/BlindZombie.png + ../Game/Enemies/Book.png + ../Game/Enemies/BookArcane.png + ../Game/Enemies/BookBelt.png + ../Game/Enemies/BookBondage.png + ../Game/Enemies/BookCelestial.png + ../Game/Enemies/BookChain.png + ../Game/Enemies/BookElectric.png + ../Game/Enemies/BookForbidden.png + ../Game/Enemies/BookIce.png + ../Game/Enemies/BookNature.png + ../Game/Enemies/BookRope.png + ../Game/Enemies/BookSlime.png + ../Game/Enemies/BookTickle.png + ../Game/Enemies/BotMissile.png + ../Game/Enemies/BowyerQuest.png + ../Game/Enemies/Bramble.png + ../Game/Enemies/Bunny_Favourite.png + ../Game/Enemies/CaptureBot.png + ../Game/Enemies/ChainBeing.png + ../Game/Enemies/ChainWall.png + ../Game/Enemies/ChaoticCrystal.png + ../Game/Enemies/ChaoticCrystalActive.png + ../Game/Enemies/Chef.png + ../Game/Enemies/Cleric.png + ../Game/Enemies/ClericHigh.png + ../Game/Enemies/Conjurer.png + ../Game/Enemies/ConjurerTickler.png + ../Game/Enemies/CorruptedAdventurer.png + ../Game/Enemies/CuffedGirl.png + ../Game/Enemies/CuffedGirl2.png + ../Game/Enemies/CuffedGirl3.png + ../Game/Enemies/Cuffs.png + ../Game/Enemies/CustomSprite/Alisa.png + ../Game/Enemies/CustomSprite/Hilda.png + ../Game/Enemies/CustomSprite/Melissa.png + ../Game/Enemies/CustomSprite/Myrtrice.png + ../Game/Enemies/CustomSprite/Myrtrice2.png + ../Game/Enemies/CustomSprite/Myrtrice3.png + ../Game/Enemies/CustomSprite/Nara.png + ../Game/Enemies/CustomSprite/Parov.png + ../Game/Enemies/CustomSprite/Rai.png + ../Game/Enemies/CustomSprite/Rai2.png + ../Game/Enemies/CustomSprite/Rook.png + ../Game/Enemies/CustomSprite/Selly.png + ../Game/Enemies/CustomSprite/Viola.png + ../Game/Enemies/CustomSpriteBound/Alisa.png + ../Game/Enemies/CustomSpriteBound/Hilda.png + ../Game/Enemies/CustomSpriteBound/Melissa.png + ../Game/Enemies/CustomSpriteBound/Myrtrice.png + ../Game/Enemies/CustomSpriteBound/Myrtrice2.png + ../Game/Enemies/CustomSpriteBound/Myrtrice3.png + ../Game/Enemies/CustomSpriteBound/Nara.png + ../Game/Enemies/CustomSpriteBound/Rai.png + ../Game/Enemies/CustomSpriteBound/Rai2.png + ../Game/Enemies/CustomSpriteBound/Rook.png + ../Game/Enemies/CustomSpriteBound/Selly.png + ../Game/Enemies/CustomSpriteBound/Viola.png + ../Game/Enemies/Cyborg.png + ../Game/Enemies/CyborgBerserker.png + ../Game/Enemies/CyborgEnforcer.png + ../Game/Enemies/CyborgGuardian.png + ../Game/Enemies/Decoy.png + ../Game/Enemies/Demon.png + ../Game/Enemies/DemonEye.png + ../Game/Enemies/DemonMoon.png + ../Game/Enemies/DemonStar.png + ../Game/Enemies/DemonVoid.png + ../Game/Enemies/Deputy.png + ../Game/Enemies/DirtPile.png + ../Game/Enemies/DollDoor.png + ../Game/Enemies/DollTransport.png + ../Game/Enemies/Dollmaker.png + ../Game/Enemies/DollmakerBoss1.png + ../Game/Enemies/DollmakerBoss2.png + ../Game/Enemies/DollmakerBoss3.png + ../Game/Enemies/DollmakerBoss3b.png + ../Game/Enemies/DollmakerMechanic.png + ../Game/Enemies/DollmakerTarget.png + ../Game/Enemies/Dollsmith.png + ../Game/Enemies/DollsmithDoll.png + ../Game/Enemies/DoorLock.png + ../Game/Enemies/Dragon.png + ../Game/Enemies/DragonCrystal.png + ../Game/Enemies/DragonFlower.png + ../Game/Enemies/DragonGirlCrystal.png + ../Game/Enemies/DragonGirlIce.png + ../Game/Enemies/DragonGirlPoison.png + ../Game/Enemies/DragonGirlShadow.png + ../Game/Enemies/DragonIce.png + ../Game/Enemies/DragonLeader.png + ../Game/Enemies/DragonLeaderDuelist.png + ../Game/Enemies/DragonPoison.png + ../Game/Enemies/DragonShadow.png + ../Game/Enemies/DragonShield.png + ../Game/Enemies/DragonVineFlower.png + ../Game/Enemies/DragonVinePlant.png + ../Game/Enemies/DragonheartQuest.png + ../Game/Enemies/Dressmaker.png + ../Game/Enemies/DressmakerQuest.png + ../Game/Enemies/Drone.png + ../Game/Enemies/DroneGuardian.png + ../Game/Enemies/DroneNode.png + ../Game/Enemies/Dryad.png + ../Game/Enemies/EarthMote.png + ../Game/Enemies/EarthenMonolith.png + ../Game/Enemies/ElementalAir.png + ../Game/Enemies/ElementalEarth.png + ../Game/Enemies/ElementalFire.png + ../Game/Enemies/ElementalIce.png + ../Game/Enemies/ElementalLatex.png + ../Game/Enemies/ElementalLeather.png + ../Game/Enemies/ElementalRope.png + ../Game/Enemies/ElementalRubber.png + ../Game/Enemies/ElementalWater.png + ../Game/Enemies/Elf.png + ../Game/Enemies/ElfRanger.png + ../Game/Enemies/EncasedDoll.png + ../Game/Enemies/EncasedDollMetal.png + ../Game/Enemies/EncasedFactoryDoll.png + ../Game/Enemies/EncasedFactoryDollMetal.png + ../Game/Enemies/EnforcerBot.png + ../Game/Enemies/EnforcerBotGuardian.png + ../Game/Enemies/EpicenterCursed.png + ../Game/Enemies/EpicenterCursed2.png + ../Game/Enemies/ExplosiveBarrel.png + ../Game/Enemies/FactoryDoll.png + ../Game/Enemies/FaithfulZombie.png + ../Game/Enemies/FastSlime.png + ../Game/Enemies/FastZombie.png + ../Game/Enemies/Feathers.png + ../Game/Enemies/FireElemental.png + ../Game/Enemies/ForceField.png + ../Game/Enemies/ForcefieldBot.png + ../Game/Enemies/FreeDoll.png + ../Game/Enemies/Frog.png + ../Game/Enemies/Fungal.png + ../Game/Enemies/Fuuka1.png + ../Game/Enemies/Fuuka2.png + ../Game/Enemies/FuukaPillar.png + ../Game/Enemies/Gag.png + ../Game/Enemies/GagGeist.png + ../Game/Enemies/GasBarrel.png + ../Game/Enemies/Ghost.png + ../Game/Enemies/GhostAdventurer.png + ../Game/Enemies/GhostDark.png + ../Game/Enemies/GiantMushroom.png + ../Game/Enemies/GlueTechnician.png + ../Game/Enemies/Golem.png + ../Game/Enemies/GreaterSkeleton.png + ../Game/Enemies/GreedyGhast.png + ../Game/Enemies/Guard.png + ../Game/Enemies/GuardHeavy.png + ../Game/Enemies/HeavySkeleton.png + ../Game/Enemies/HighWizard.png + ../Game/Enemies/HolyConstruct.png + ../Game/Enemies/HolyOrb.png + ../Game/Enemies/HugHorror.png + ../Game/Enemies/IceWall.png + ../Game/Enemies/Jailer.png + ../Game/Enemies/JungleDryad.png + ../Game/Enemies/KeeperEarth.png + ../Game/Enemies/KeeperFire.png + ../Game/Enemies/LabAssistant.png + ../Game/Enemies/LatexCube.png + ../Game/Enemies/LatexCubeHidden.png + ../Game/Enemies/LatexCubeMetal.png + ../Game/Enemies/LatexCubeSmall.png + ../Game/Enemies/LatexCubeSmallHidden.png + ../Game/Enemies/LatexSprayer.png + ../Game/Enemies/LatexStorageTank.png + ../Game/Enemies/LearnedRope.png + ../Game/Enemies/LesserSkeleton.png + ../Game/Enemies/Librarian.png + ../Game/Enemies/LiquidMetalCube.png + ../Game/Enemies/Lock.png + ../Game/Enemies/LockMaster.png + ../Game/Enemies/MageZombie.png + ../Game/Enemies/Magician_Sparkle.png + ../Game/Enemies/MaidKnightHeavy.png + ../Game/Enemies/MaidKnightHeavy_Equip.png + ../Game/Enemies/MaidKnightLight.png + ../Game/Enemies/MaidKnightLight_Aim.png + ../Game/Enemies/MaidKnightLight_Equip.png + ../Game/Enemies/Maidforce.png + ../Game/Enemies/MaidforceHead.png + ../Game/Enemies/MaidforceMafia.png + ../Game/Enemies/MaidforceMini.png + ../Game/Enemies/MaidforcePara.png + ../Game/Enemies/MaidforceQuest.png + ../Game/Enemies/MaidforceStalker.png + ../Game/Enemies/MaidforceStalkerImage.png + ../Game/Enemies/MeleeCleric.png + ../Game/Enemies/MikoGhost.png + ../Game/Enemies/Mimic.png + ../Game/Enemies/MimicLatex.png + ../Game/Enemies/Miner.png + ../Game/Enemies/Monolith.png + ../Game/Enemies/MonsterRope.png + ../Game/Enemies/Mummy.png + ../Game/Enemies/MummyCursed.png + ../Game/Enemies/MummyElevator.png + ../Game/Enemies/Mushy.png + ../Game/Enemies/MushyHappy.png + ../Game/Enemies/MushySick.png + ../Game/Enemies/NakedElemental.png + ../Game/Enemies/NatureSpirit.png + ../Game/Enemies/Nawashi.png + ../Game/Enemies/NawashiZombie.png + ../Game/Enemies/Necromancer.png + ../Game/Enemies/Ninja.png + ../Game/Enemies/NinjaStalker.png + ../Game/Enemies/Nurse.png + ../Game/Enemies/Observer.png + ../Game/Enemies/OldDrone.png + ../Game/Enemies/OldDroneNode.png + ../Game/Enemies/OldTapeDrone.png + ../Game/Enemies/OneBar.png + ../Game/Enemies/OrbGuardian.png + ../Game/Enemies/OrbOfLight.png + ../Game/Enemies/Pet.png + ../Game/Enemies/PetChastity.png + ../Game/Enemies/PetDisplay.png + ../Game/Enemies/PinkAlchemist.png + ../Game/Enemies/PinkAlkahestor.png + ../Game/Enemies/PinkGlueTechnician.png + ../Game/Enemies/PinkLabAssistant.png + ../Game/Enemies/Pixie.png + ../Game/Enemies/PlayerGag.png + ../Game/Enemies/Poltergeist.png + ../Game/Enemies/PrisonerBandit.png + ../Game/Enemies/Rat.png + ../Game/Enemies/RedSlime.png + ../Game/Enemies/Ribbons.png + ../Game/Enemies/RopeElemental.png + ../Game/Enemies/RopeKraken.png + ../Game/Enemies/RopeMinion.png + ../Game/Enemies/RopeSnake.png + ../Game/Enemies/RubberBarrel.png + ../Game/Enemies/RubberSilo.png + ../Game/Enemies/RubberTurret.png + ../Game/Enemies/SamuraiZombie.png + ../Game/Enemies/SarcoKraken.png + ../Game/Enemies/SarcoMinion.png + ../Game/Enemies/Scarves.png + ../Game/Enemies/ShadowGhast.png + ../Game/Enemies/ShadowHand.png + ../Game/Enemies/ShadowWarrior.png + ../Game/Enemies/ShadyQuest.png + ../Game/Enemies/ShopkeeperRescue.png + ../Game/Enemies/ShopkeeperStart.png + ../Game/Enemies/ShrineMaiden.png + ../Game/Enemies/ShrineMaiden_2.png + ../Game/Enemies/Skeleton.png + ../Game/Enemies/SkeletonArcher.png + ../Game/Enemies/Sleuth.png + ../Game/Enemies/Slime.png + ../Game/Enemies/SlimeAdv.png + ../Game/Enemies/SlimeEnthusiast.png + ../Game/Enemies/SlimeKraken.png + ../Game/Enemies/SlimeMold.png + ../Game/Enemies/SlimeMoldLeaper.png + ../Game/Enemies/SlimeMoldSpawner.png + ../Game/Enemies/SmallSlime.png + ../Game/Enemies/SmallSlimeLeaper.png + ../Game/Enemies/SoulCrystal.png + ../Game/Enemies/SoulCrystalActive.png + ../Game/Enemies/StaticSphere.png + ../Game/Enemies/Statue.png + ../Game/Enemies/StatueDart.png + ../Game/Enemies/StatueGag.png + ../Game/Enemies/SteelDoor.png + ../Game/Enemies/StoneDoor.png + ../Game/Enemies/StormCrystal.png + ../Game/Enemies/SummonedCaptureDrone.png + ../Game/Enemies/SummonedDrone.png + ../Game/Enemies/SummonedSkeleton.png + ../Game/Enemies/SummonedZombie.png + ../Game/Enemies/TalismanZombie.png + ../Game/Enemies/TapeBot.png + ../Game/Enemies/TapeDrone.png + ../Game/Enemies/TheWarden1.png + ../Game/Enemies/TheWarden2.png + ../Game/Enemies/TickleHand.png + ../Game/Enemies/TickleHandSlave.png + ../Game/Enemies/TickleTerror.png + ../Game/Enemies/TimeGhost.png + ../Game/Enemies/Toad.png + ../Game/Enemies/UnforseenRope.png + ../Game/Enemies/VinePlant.png + ../Game/Enemies/VineSpitter.png + ../Game/Enemies/Wall.png + ../Game/Enemies/WallDoor.png + ../Game/Enemies/WardenArcher.png + ../Game/Enemies/WardenFighter.png + ../Game/Enemies/WardenMage.png + ../Game/Enemies/Water.png + ../Game/Enemies/WaterMote.png + ../Game/Enemies/WitchApprentice.png + ../Game/Enemies/WitchAqua.png + ../Game/Enemies/WitchChain.png + ../Game/Enemies/WitchEarth.png + ../Game/Enemies/WitchFlame.png + ../Game/Enemies/WitchIce.png + ../Game/Enemies/WitchMagnet.png + ../Game/Enemies/WitchMetal.png + ../Game/Enemies/WitchRope.png + ../Game/Enemies/WitchShibari.png + ../Game/Enemies/WitchShock.png + ../Game/Enemies/WitchSlime.png + ../Game/Enemies/WitchWater.png + ../Game/Enemies/WolfApprentice.png + ../Game/Enemies/WolfDrone.png + ../Game/Enemies/WolfExecutive.png + ../Game/Enemies/WolfGuard.png + ../Game/Enemies/WolfInstructor.png + ../Game/Enemies/WolfOperative.png + ../Game/Enemies/WolfServer.png + ../Game/Enemies/WolfShieldDrone.png + ../Game/Enemies/WolfTapeDrones.png + ../Game/Enemies/Wolfgirl.png + ../Game/Enemies/WolfgirlPet.png + ../Game/EnemiesBound/Adventurer_Brat.png + ../Game/EnemiesBound/Adventurer_Dom.png + ../Game/EnemiesBound/Adventurer_Sub.png + ../Game/EnemiesBound/Adventurer_Switch.png + ../Game/EnemiesBound/Alchemist.png + ../Game/EnemiesBound/AlchemistPet.png + ../Game/EnemiesBound/Alkahestor.png + ../Game/EnemiesBound/AllyDoll.png + ../Game/EnemiesBound/Angel.png + ../Game/EnemiesBound/Apprentice.png + ../Game/EnemiesBound/Apprentice2.png + ../Game/EnemiesBound/ApprenticeSlime.png + ../Game/EnemiesBound/Bandit.png + ../Game/EnemiesBound/BanditChief.png + ../Game/EnemiesBound/BanditGrappler.png + ../Game/EnemiesBound/BanditHunter.png + ../Game/EnemiesBound/BanditPet.png + ../Game/EnemiesBound/ChainBeing.png + ../Game/EnemiesBound/Cleric.png + ../Game/EnemiesBound/ClericHigh.png + ../Game/EnemiesBound/Conjurer.png + ../Game/EnemiesBound/ConjurerTickler.png + ../Game/EnemiesBound/CorruptedAdventurer.png + ../Game/EnemiesBound/CuffedGirl.png + ../Game/EnemiesBound/CuffedGirl2.png + ../Game/EnemiesBound/Cyborg.png + ../Game/EnemiesBound/CyborgBerserker.png + ../Game/EnemiesBound/CyborgEnforcer.png + ../Game/EnemiesBound/CyborgGuardian.png + ../Game/EnemiesBound/Demon.png + ../Game/EnemiesBound/Deputy.png + ../Game/EnemiesBound/Dollmaker.png + ../Game/EnemiesBound/DollmakerBoss.png + ../Game/EnemiesBound/Dragon.png + ../Game/EnemiesBound/DragonCrystal.png + ../Game/EnemiesBound/DragonIce.png + ../Game/EnemiesBound/DragonLeader.png + ../Game/EnemiesBound/DragonPoison.png + ../Game/EnemiesBound/DragonShadow.png + ../Game/EnemiesBound/DragonShield.png + ../Game/EnemiesBound/Dressmaker.png + ../Game/EnemiesBound/Dryad.png + ../Game/EnemiesBound/Elemental.png + ../Game/EnemiesBound/ElementalAir.png + ../Game/EnemiesBound/ElementalEarth.png + ../Game/EnemiesBound/ElementalFire.png + ../Game/EnemiesBound/ElementalIce.png + ../Game/EnemiesBound/ElementalLatex.png + ../Game/EnemiesBound/ElementalLeather.png + ../Game/EnemiesBound/ElementalRope.png + ../Game/EnemiesBound/ElementalRubber.png + ../Game/EnemiesBound/ElementalWater.png + ../Game/EnemiesBound/Elf.png + ../Game/EnemiesBound/ElfRanger.png + ../Game/EnemiesBound/EncasedDoll.png + ../Game/EnemiesBound/EncasedFactoryDoll.png + ../Game/EnemiesBound/EncasedFactoryDollMetal.png + ../Game/EnemiesBound/FactoryDoll.png + ../Game/EnemiesBound/FastZombie.png + ../Game/EnemiesBound/Fuuka.png + ../Game/EnemiesBound/GlueTechnician.png + ../Game/EnemiesBound/GreaterSkeleton.png + ../Game/EnemiesBound/Guard.png + ../Game/EnemiesBound/GuardHeavy.png + ../Game/EnemiesBound/Head/Alchemist.png + ../Game/EnemiesBound/Head/AlchemistPet.png + ../Game/EnemiesBound/Head/Alkahestor.png + ../Game/EnemiesBound/Head/AllyDoll.png + ../Game/EnemiesBound/Head/Angel.png + ../Game/EnemiesBound/Head/Apprentice.png + ../Game/EnemiesBound/Head/Apprentice2.png + ../Game/EnemiesBound/Head/ApprenticeSlime.png + ../Game/EnemiesBound/Head/Bandit.png + ../Game/EnemiesBound/Head/BanditChief.png + ../Game/EnemiesBound/Head/BanditGrappler.png + ../Game/EnemiesBound/Head/BanditHunter.png + ../Game/EnemiesBound/Head/BanditPet.png + ../Game/EnemiesBound/Head/CherubFire.png + ../Game/EnemiesBound/Head/Cleric.png + ../Game/EnemiesBound/Head/Conjurer.png + ../Game/EnemiesBound/Head/ConjurerTickler.png + ../Game/EnemiesBound/Head/Dragon.png + ../Game/EnemiesBound/Head/DragonCrystal.png + ../Game/EnemiesBound/Head/DragonIce.png + ../Game/EnemiesBound/Head/DragonLeader.png + ../Game/EnemiesBound/Head/DragonPoison.png + ../Game/EnemiesBound/Head/DragonShadow.png + ../Game/EnemiesBound/Head/DragonShield.png + ../Game/EnemiesBound/Head/Dressmaker.png + ../Game/EnemiesBound/Head/Dryad.png + ../Game/EnemiesBound/Head/Elemental.png + ../Game/EnemiesBound/Head/ElementalAir.png + ../Game/EnemiesBound/Head/ElementalEarth.png + ../Game/EnemiesBound/Head/ElementalFire.png + ../Game/EnemiesBound/Head/ElementalIce.png + ../Game/EnemiesBound/Head/ElementalLatex.png + ../Game/EnemiesBound/Head/ElementalLeather.png + ../Game/EnemiesBound/Head/ElementalRope.png + ../Game/EnemiesBound/Head/ElementalWater.png + ../Game/EnemiesBound/Head/Elf.png + ../Game/EnemiesBound/Head/ElfRanger.png + ../Game/EnemiesBound/Head/EncasedDoll.png + ../Game/EnemiesBound/Head/FastZombie.png + ../Game/EnemiesBound/Head/GreaterSkeleton.png + ../Game/EnemiesBound/Head/Guard.png + ../Game/EnemiesBound/Head/GuardHeavy.png + ../Game/EnemiesBound/Head/HeavySkeleton.png + ../Game/EnemiesBound/Head/HighWizard.png + ../Game/EnemiesBound/Head/Jailer.png + ../Game/EnemiesBound/Head/JungleDryad.png + ../Game/EnemiesBound/Head/LesserSkeleton.png + ../Game/EnemiesBound/Head/MageZombie.png + ../Game/EnemiesBound/Head/Maid.png + ../Game/EnemiesBound/Head/MaidforceHead.png + ../Game/EnemiesBound/Head/MaidforceMafia.png + ../Game/EnemiesBound/Head/MaidforcePara.png + ../Game/EnemiesBound/Head/MaidforceStalker.png + ../Game/EnemiesBound/Head/MeleeCleric.png + ../Game/EnemiesBound/Head/Miner.png + ../Game/EnemiesBound/Head/Mummy.png + ../Game/EnemiesBound/Head/MummyCursed.png + ../Game/EnemiesBound/Head/Nawashi.png + ../Game/EnemiesBound/Head/NawashiZombie.png + ../Game/EnemiesBound/Head/Necromancer.png + ../Game/EnemiesBound/Head/Ninja.png + ../Game/EnemiesBound/Head/NinjaStalker.png + ../Game/EnemiesBound/Head/SamuraiZombie.png + ../Game/EnemiesBound/Head/Skeleton.png + ../Game/EnemiesBound/Head/SlimeAdv.png + ../Game/EnemiesBound/Head/SlimeEnthusiast.png + ../Game/EnemiesBound/Head/TalismanZombie.png + ../Game/EnemiesBound/Head/TemplateHead.png + ../Game/EnemiesBound/Head/Witch.png + ../Game/EnemiesBound/Head/WitchChain.png + ../Game/EnemiesBound/Head/WitchEarth.png + ../Game/EnemiesBound/Head/WitchFlame.png + ../Game/EnemiesBound/Head/WitchIce.png + ../Game/EnemiesBound/Head/WitchShock.png + ../Game/EnemiesBound/Head/WitchSlime.png + ../Game/EnemiesBound/Head/WitchWater.png + ../Game/EnemiesBound/Head/WolfExecutive.png + ../Game/EnemiesBound/Head/WolfGuard.png + ../Game/EnemiesBound/Head/WolfOperative.png + ../Game/EnemiesBound/Head/Wolfgirl.png + ../Game/EnemiesBound/Head/WolfgirlPet.png + ../Game/EnemiesBound/Head/Zombie.png + ../Game/EnemiesBound/HeavySkeleton.png + ../Game/EnemiesBound/HighWizard.png + ../Game/EnemiesBound/HolyConstruct.png + ../Game/EnemiesBound/Jailer.png + ../Game/EnemiesBound/JungleDryad.png + ../Game/EnemiesBound/LabAssistant.png + ../Game/EnemiesBound/LesserSkeleton.png + ../Game/EnemiesBound/Librarian.png + ../Game/EnemiesBound/MageZombie.png + ../Game/EnemiesBound/Maid.png + ../Game/EnemiesBound/MaidKnightHeavy.png + ../Game/EnemiesBound/MaidKnightLight.png + ../Game/EnemiesBound/MaidforceHead.png + ../Game/EnemiesBound/MaidforceMafia.png + ../Game/EnemiesBound/MaidforceMini.png + ../Game/EnemiesBound/MaidforcePara.png + ../Game/EnemiesBound/MaidforceStalker.png + ../Game/EnemiesBound/MeleeCleric.png + ../Game/EnemiesBound/Miner.png + ../Game/EnemiesBound/Mummy.png + ../Game/EnemiesBound/MummyCursed.png + ../Game/EnemiesBound/Nawashi.png + ../Game/EnemiesBound/NawashiZombie.png + ../Game/EnemiesBound/Necromancer.png + ../Game/EnemiesBound/Ninja.png + ../Game/EnemiesBound/NinjaStalker.png + ../Game/EnemiesBound/Nurse.png + ../Game/EnemiesBound/SamuraiZombie.png + ../Game/EnemiesBound/Skeleton.png + ../Game/EnemiesBound/SlimeAdv.png + ../Game/EnemiesBound/SlimeEnthusiast.png + ../Game/EnemiesBound/TalismanZombie.png + ../Game/EnemiesBound/TapedDoll.png + ../Game/EnemiesBound/TheWarden.png + ../Game/EnemiesBound/WardenArcher.png + ../Game/EnemiesBound/WardenFighter.png + ../Game/EnemiesBound/WardenMage.png + ../Game/EnemiesBound/Witch.png + ../Game/EnemiesBound/WitchApprentice.png + ../Game/EnemiesBound/WitchChain.png + ../Game/EnemiesBound/WitchEarth.png + ../Game/EnemiesBound/WitchFlame.png + ../Game/EnemiesBound/WitchIce.png + ../Game/EnemiesBound/WitchRope.png + ../Game/EnemiesBound/WitchShock.png + ../Game/EnemiesBound/WitchSlime.png + ../Game/EnemiesBound/WitchWater.png + ../Game/EnemiesBound/WolfExecutive.png + ../Game/EnemiesBound/WolfGuard.png + ../Game/EnemiesBound/WolfOperative.png + ../Game/EnemiesBound/Wolfgirl.png + ../Game/EnemiesBound/WolfgirlPet.png + ../Game/EnemiesBound/Zombie.png + ../Game/FloorGeneric/Angel.png + ../Game/FloorGeneric/AngelTied.png + ../Game/FloorGeneric/Bars.png + ../Game/FloorGeneric/Bed.png + ../Game/FloorGeneric/BondageMachine/ChastityHoriz.png + ../Game/FloorGeneric/BondageMachine/ChastityVert.png + ../Game/FloorGeneric/BondageMachine/DollHoriz.png + ../Game/FloorGeneric/BondageMachine/DollVert.png + ../Game/FloorGeneric/BondageMachine/LatexHoriz.png + ../Game/FloorGeneric/BondageMachine/LatexVert.png + ../Game/FloorGeneric/BondageMachine/MetalHoriz.png + ../Game/FloorGeneric/BondageMachine/MetalVert.png + ../Game/FloorGeneric/BondageMachine/PlugHoriz.png + ../Game/FloorGeneric/BondageMachine/PlugVert.png + ../Game/FloorGeneric/BondageMachine/TapeHoriz.png + ../Game/FloorGeneric/BondageMachine/TapeVert.png + ../Game/FloorGeneric/Cage.png + ../Game/FloorGeneric/Charger.png + ../Game/FloorGeneric/ChargerCrystal.png + ../Game/FloorGeneric/ChargerSpent.png + ../Game/FloorGeneric/Chest.png + ../Game/FloorGeneric/ChestBlue.png + ../Game/FloorGeneric/ChestBlueOpen.png + ../Game/FloorGeneric/ChestDark.png + ../Game/FloorGeneric/ChestDarkOpen.png + ../Game/FloorGeneric/ChestGold.png + ../Game/FloorGeneric/ChestGoldOpen.png + ../Game/FloorGeneric/ChestOpen.png + ../Game/FloorGeneric/ChestPearl.png + ../Game/FloorGeneric/ChestPearlOpen.png + ../Game/FloorGeneric/ChestShadow.png + ../Game/FloorGeneric/ChestShadowOpen.png + ../Game/FloorGeneric/ChestSilver.png + ../Game/FloorGeneric/ChestSilverOpen.png + ../Game/FloorGeneric/Chests/Kitty.png + ../Game/FloorGeneric/Chests/KittyOpen.png + ../Game/FloorGeneric/Chests/Robot.png + ../Game/FloorGeneric/Chests/RobotOpen.png + ../Game/FloorGeneric/ClamBed.png + ../Game/FloorGeneric/CollapsedStairs.png + ../Game/FloorGeneric/CommercePortal.png + ../Game/FloorGeneric/CommercePortalReturn.png + ../Game/FloorGeneric/Conveyor/Conveyor.png + ../Game/FloorGeneric/Conveyor/Down.png + ../Game/FloorGeneric/Conveyor/DownLeft.png + ../Game/FloorGeneric/Conveyor/DownOff.png + ../Game/FloorGeneric/Conveyor/DownOn.png + ../Game/FloorGeneric/Conveyor/DownRight.png + ../Game/FloorGeneric/Conveyor/DownSwitch.png + ../Game/FloorGeneric/Conveyor/Left.png + ../Game/FloorGeneric/Conveyor/LeftDown.png + ../Game/FloorGeneric/Conveyor/LeftOff.png + ../Game/FloorGeneric/Conveyor/LeftOn.png + ../Game/FloorGeneric/Conveyor/LeftRightDown.png + ../Game/FloorGeneric/Conveyor/LeftRightUp.png + ../Game/FloorGeneric/Conveyor/LeftSwitch.png + ../Game/FloorGeneric/Conveyor/LeftUp.png + ../Game/FloorGeneric/Conveyor/Right.png + ../Game/FloorGeneric/Conveyor/RightDown.png + ../Game/FloorGeneric/Conveyor/RightOff.png + ../Game/FloorGeneric/Conveyor/RightOn.png + ../Game/FloorGeneric/Conveyor/RightSwitch.png + ../Game/FloorGeneric/Conveyor/RightUp.png + ../Game/FloorGeneric/Conveyor/SafetyDown.png + ../Game/FloorGeneric/Conveyor/SafetyLeft.png + ../Game/FloorGeneric/Conveyor/SafetyRight.png + ../Game/FloorGeneric/Conveyor/SafetyUp.png + ../Game/FloorGeneric/Conveyor/Up.png + ../Game/FloorGeneric/Conveyor/UpDownLeft.png + ../Game/FloorGeneric/Conveyor/UpDownRight.png + ../Game/FloorGeneric/Conveyor/UpLeft.png + ../Game/FloorGeneric/Conveyor/UpOff.png + ../Game/FloorGeneric/Conveyor/UpOn.png + ../Game/FloorGeneric/Conveyor/UpRight.png + ../Game/FloorGeneric/Conveyor/UpSwitch.png + ../Game/FloorGeneric/Crack.png + ../Game/FloorGeneric/CrackHoriz.png + ../Game/FloorGeneric/CrackLeft.png + ../Game/FloorGeneric/CrackNone.png + ../Game/FloorGeneric/CrackRight.png + ../Game/FloorGeneric/CrackVert.png + ../Game/FloorGeneric/CrystalBase.png + ../Game/FloorGeneric/DimensionRift.png + ../Game/FloorGeneric/DisplayEgyptian.png + ../Game/FloorGeneric/DisplayStand.png + ../Game/FloorGeneric/DollDropoff.png + ../Game/FloorGeneric/DollDropoffD.png + ../Game/FloorGeneric/DollDropoffL.png + ../Game/FloorGeneric/DollDropoffR.png + ../Game/FloorGeneric/DollStand.png + ../Game/FloorGeneric/DollSupply.png + ../Game/FloorGeneric/DollTerminal.png + ../Game/FloorGeneric/Doors/CyberDoor.png + ../Game/FloorGeneric/Doors/CyberDoorOpen.png + ../Game/FloorGeneric/Doors/CyberDoorVert.png + ../Game/FloorGeneric/Doors/CyberDoorVertCont.png + ../Game/FloorGeneric/Doors/CyberDoorVertOpen.png + ../Game/FloorGeneric/Doors/CyberDoorVertOpenCont.png + ../Game/FloorGeneric/Dummy0.png + ../Game/FloorGeneric/Dummy1.png + ../Game/FloorGeneric/Dummy2.png + ../Game/FloorGeneric/Elevator.png + ../Game/FloorGeneric/ElevatorDisabled.png + ../Game/FloorGeneric/EmptyPipe.png + ../Game/FloorGeneric/Fireflies.png + ../Game/FloorGeneric/FutureBox.png + ../Game/FloorGeneric/Ghost.png + ../Game/FloorGeneric/GhostImportant.png + ../Game/FloorGeneric/HappyGas.png + ../Game/FloorGeneric/HookHigh.png + ../Game/FloorGeneric/HookLow.png + ../Game/FloorGeneric/IceBase.png + ../Game/FloorGeneric/Invis.png + ../Game/FloorGeneric/Lantern.png + ../Game/FloorGeneric/LatexDisplayStand.png + ../Game/FloorGeneric/LatexPipe.png + ../Game/FloorGeneric/Leyline.png + ../Game/FloorGeneric/LightRays.png + ../Game/FloorGeneric/LightRaysDoll.png + ../Game/FloorGeneric/Magicflies.png + ../Game/FloorGeneric/Orb.png + ../Game/FloorGeneric/Perk.png + ../Game/FloorGeneric/Pizza.png + ../Game/FloorGeneric/Portal.png + ../Game/FloorGeneric/Rubble.png + ../Game/FloorGeneric/Sarcophagus.png + ../Game/FloorGeneric/SarcophagusGone.png + ../Game/FloorGeneric/Scrap.png + ../Game/FloorGeneric/ShadowBase.png + ../Game/FloorGeneric/Signal/AutoLock.png + ../Game/FloorGeneric/Signal/Button.png + ../Game/FloorGeneric/SpiralStairsDown.png + ../Game/FloorGeneric/SpiralStairsUp.png + ../Game/FloorGeneric/Spores.png + ../Game/FloorGeneric/StairsDown.png + ../Game/FloorGeneric/StairsUp.png + ../Game/FloorGeneric/SummitTeleporter.png + ../Game/FloorGeneric/Table.png + ../Game/FloorGeneric/TableCookies.png + ../Game/FloorGeneric/TablePizza.png + ../Game/FloorGeneric/TablePlate.png + ../Game/FloorGeneric/Tablet.png + ../Game/FloorGeneric/TabletCursed.png + ../Game/FloorGeneric/TabletDetermination.png + ../Game/FloorGeneric/TabletDetermination_2.png + ../Game/FloorGeneric/TabletHeart.png + ../Game/FloorGeneric/TabletSpent.png + ../Game/FloorGeneric/TiedCourier.png + ../Game/FloorGeneric/Torch.png + ../Game/FloorGeneric/TorchOrb.png + ../Game/FloorGeneric/Viewscreen.png + ../Game/FloorGeneric/VineBase.png + ../Game/FloorGeneric/Water.png + ../Game/FloorGeneric/WaterFoam.png + ../Game/Floors/Floor_DemonTransition/Barrel.png + ../Game/Floors/Floor_DemonTransition/Bars.png + ../Game/Floors/Floor_DemonTransition/BarsVert.png + ../Game/Floors/Floor_DemonTransition/BarsVertCont.png + ../Game/Floors/Floor_DemonTransition/Brickwork.png + ../Game/Floors/Floor_DemonTransition/Doodad.png + ../Game/Floors/Floor_DemonTransition/Door.png + ../Game/Floors/Floor_DemonTransition/DoorOpen.png + ../Game/Floors/Floor_DemonTransition/DoorVert.png + ../Game/Floors/Floor_DemonTransition/DoorVertCont.png + ../Game/Floors/Floor_DemonTransition/DoorVertOpen.png + ../Game/Floors/Floor_DemonTransition/DoorVertOpenCont.png + ../Game/Floors/Floor_DemonTransition/Floor.png + ../Game/Floors/Floor_DemonTransition/Grate.png + ../Game/Floors/Floor_DemonTransition/GrateHoriz.png + ../Game/Floors/Floor_DemonTransition/GrateVert.png + ../Game/Floors/Floor_DemonTransition/MimicBlock.png + ../Game/Floors/Floor_DemonTransition/OrbEmpty.png + ../Game/Floors/Floor_DemonTransition/RubbleLooted.png + ../Game/Floors/Floor_DemonTransition/Shrine.png + ../Game/Floors/Floor_DemonTransition/ShrineBroken.png + ../Game/Floors/Floor_DemonTransition/ShrineC.png + ../Game/Floors/Floor_DemonTransition/ShrineEmpty.png + ../Game/Floors/Floor_DemonTransition/Trap.png + ../Game/Floors/Floor_DemonTransition/Wall.png + ../Game/Floors/Floor_DemonTransition/WallR.png + ../Game/Floors/Floor_DemonTransition/WallRVert.png + ../Game/Floors/Floor_DemonTransition/WallVert.png + ../Game/Floors/Floor_bel/Barrel.png + ../Game/Floors/Floor_bel/Bars.png + ../Game/Floors/Floor_bel/BarsVert.png + ../Game/Floors/Floor_bel/BarsVertCont.png + ../Game/Floors/Floor_bel/Brickwork.png + ../Game/Floors/Floor_bel/DollDropoff.png + ../Game/Floors/Floor_bel/Doodad.png + ../Game/Floors/Floor_bel/Door.png + ../Game/Floors/Floor_bel/DoorOpen.png + ../Game/Floors/Floor_bel/DoorVert.png + ../Game/Floors/Floor_bel/DoorVertCont.png + ../Game/Floors/Floor_bel/DoorVertOpen.png + ../Game/Floors/Floor_bel/DoorVertOpenCont.png + ../Game/Floors/Floor_bel/Floor.png + ../Game/Floors/Floor_bel/Grate.png + ../Game/Floors/Floor_bel/GrateHoriz.png + ../Game/Floors/Floor_bel/GrateVert.png + ../Game/Floors/Floor_bel/MimicBlock.png + ../Game/Floors/Floor_bel/OrbEmpty.png + ../Game/Floors/Floor_bel/RubbleLooted.png + ../Game/Floors/Floor_bel/Shrine.png + ../Game/Floors/Floor_bel/ShrineBroken.png + ../Game/Floors/Floor_bel/ShrineC.png + ../Game/Floors/Floor_bel/ShrineEmpty.png + ../Game/Floors/Floor_bel/StairsDown.png + ../Game/Floors/Floor_bel/StairsUp.png + ../Game/Floors/Floor_bel/Trap.png + ../Game/Floors/Floor_bel/Wall.png + ../Game/Floors/Floor_bel/WallR.png + ../Game/Floors/Floor_bel/WallRVert.png + ../Game/Floors/Floor_bel/WallVert.png + ../Game/Floors/Floor_cat/Barrel.png + ../Game/Floors/Floor_cat/Bars.png + ../Game/Floors/Floor_cat/BarsOld.png + ../Game/Floors/Floor_cat/BarsVert.png + ../Game/Floors/Floor_cat/BarsVertCont.png + ../Game/Floors/Floor_cat/Brickwork.png + ../Game/Floors/Floor_cat/Doodad.png + ../Game/Floors/Floor_cat/Door.png + ../Game/Floors/Floor_cat/DoorOpen.png + ../Game/Floors/Floor_cat/DoorVert.png + ../Game/Floors/Floor_cat/DoorVertCont.png + ../Game/Floors/Floor_cat/DoorVertOpen.png + ../Game/Floors/Floor_cat/DoorVertOpenCont.png + ../Game/Floors/Floor_cat/Floor.png + ../Game/Floors/Floor_cat/Grate.png + ../Game/Floors/Floor_cat/GrateHoriz.png + ../Game/Floors/Floor_cat/GrateVert.png + ../Game/Floors/Floor_cat/MimicBlock.png + ../Game/Floors/Floor_cat/OrbEmpty.png + ../Game/Floors/Floor_cat/RubbleLooted.png + ../Game/Floors/Floor_cat/Shrine.png + ../Game/Floors/Floor_cat/ShrineBroken.png + ../Game/Floors/Floor_cat/ShrineC.png + ../Game/Floors/Floor_cat/ShrineEmpty.png + ../Game/Floors/Floor_cat/StairsDown.png + ../Game/Floors/Floor_cat/StairsUp.png + ../Game/Floors/Floor_cat/Trap.png + ../Game/Floors/Floor_cat/Wall.png + ../Game/Floors/Floor_cat/WallR.png + ../Game/Floors/Floor_cat/WallRVert.png + ../Game/Floors/Floor_cat/WallVert.png + ../Game/Floors/Floor_cav/Barrel.png + ../Game/Floors/Floor_cav/Bars.png + ../Game/Floors/Floor_cav/BarsOld.png + ../Game/Floors/Floor_cav/BarsVert.png + ../Game/Floors/Floor_cav/BarsVertCont.png + ../Game/Floors/Floor_cav/Brickwork.png + ../Game/Floors/Floor_cav/Doodad.png + ../Game/Floors/Floor_cav/Door.png + ../Game/Floors/Floor_cav/DoorOpen.png + ../Game/Floors/Floor_cav/DoorVert.png + ../Game/Floors/Floor_cav/DoorVertCont.png + ../Game/Floors/Floor_cav/DoorVertOpen.png + ../Game/Floors/Floor_cav/DoorVertOpenCont.png + ../Game/Floors/Floor_cav/Floor.png + ../Game/Floors/Floor_cav/Grate.png + ../Game/Floors/Floor_cav/GrateHoriz.png + ../Game/Floors/Floor_cav/GrateVert.png + ../Game/Floors/Floor_cav/MimicBlock.png + ../Game/Floors/Floor_cav/OrbEmpty.png + ../Game/Floors/Floor_cav/RubbleLooted.png + ../Game/Floors/Floor_cav/Shrine.png + ../Game/Floors/Floor_cav/ShrineBroken.png + ../Game/Floors/Floor_cav/ShrineC.png + ../Game/Floors/Floor_cav/ShrineEmpty.png + ../Game/Floors/Floor_cav/StairsDown.png + ../Game/Floors/Floor_cav/StairsUp.png + ../Game/Floors/Floor_cav/Trap.png + ../Game/Floors/Floor_cav/Wall.png + ../Game/Floors/Floor_cav/WallR.png + ../Game/Floors/Floor_cav/WallRVert.png + ../Game/Floors/Floor_cav/WallVert.png + ../Game/Floors/Floor_cry/Barrel.png + ../Game/Floors/Floor_cry/Bars.png + ../Game/Floors/Floor_cry/BarsOld.png + ../Game/Floors/Floor_cry/BarsVert.png + ../Game/Floors/Floor_cry/BarsVertCont.png + ../Game/Floors/Floor_cry/Brickwork.png + ../Game/Floors/Floor_cry/Doodad.png + ../Game/Floors/Floor_cry/Door.png + ../Game/Floors/Floor_cry/DoorOpen.png + ../Game/Floors/Floor_cry/DoorVert.png + ../Game/Floors/Floor_cry/DoorVertCont.png + ../Game/Floors/Floor_cry/DoorVertOpen.png + ../Game/Floors/Floor_cry/DoorVertOpenCont.png + ../Game/Floors/Floor_cry/Floor.png + ../Game/Floors/Floor_cry/Grate.png + ../Game/Floors/Floor_cry/GrateHoriz.png + ../Game/Floors/Floor_cry/GrateVert.png + ../Game/Floors/Floor_cry/MimicBlock.png + ../Game/Floors/Floor_cry/OrbEmpty.png + ../Game/Floors/Floor_cry/RubbleLooted.png + ../Game/Floors/Floor_cry/Shrine.png + ../Game/Floors/Floor_cry/ShrineBroken.png + ../Game/Floors/Floor_cry/ShrineC.png + ../Game/Floors/Floor_cry/ShrineEmpty.png + ../Game/Floors/Floor_cry/StairsDown.png + ../Game/Floors/Floor_cry/StairsUp.png + ../Game/Floors/Floor_cry/Trap.png + ../Game/Floors/Floor_cry/Wall.png + ../Game/Floors/Floor_cry/WallR.png + ../Game/Floors/Floor_cry/WallRVert.png + ../Game/Floors/Floor_cry/WallVert.png + ../Game/Floors/Floor_cst/Barrel.png + ../Game/Floors/Floor_cst/Bars.png + ../Game/Floors/Floor_cst/BarsVert.png + ../Game/Floors/Floor_cst/BarsVertCont.png + ../Game/Floors/Floor_cst/Brickwork.png + ../Game/Floors/Floor_cst/Doodad.png + ../Game/Floors/Floor_cst/Door.png + ../Game/Floors/Floor_cst/DoorOpen.png + ../Game/Floors/Floor_cst/DoorVert.png + ../Game/Floors/Floor_cst/DoorVertCont.png + ../Game/Floors/Floor_cst/DoorVertOpen.png + ../Game/Floors/Floor_cst/DoorVertOpenCont.png + ../Game/Floors/Floor_cst/Floor.png + ../Game/Floors/Floor_cst/Giant Bubble.png + ../Game/Floors/Floor_cst/Grate.png + ../Game/Floors/Floor_cst/GrateHoriz.png + ../Game/Floors/Floor_cst/GrateVert.png + ../Game/Floors/Floor_cst/MimicBlock.png + ../Game/Floors/Floor_cst/OrbEmpty.png + ../Game/Floors/Floor_cst/RubbleLooted.png + ../Game/Floors/Floor_cst/Shrine.png + ../Game/Floors/Floor_cst/ShrineBroken.png + ../Game/Floors/Floor_cst/ShrineC.png + ../Game/Floors/Floor_cst/ShrineEmpty.png + ../Game/Floors/Floor_cst/Trap.png + ../Game/Floors/Floor_cst/Wall.png + ../Game/Floors/Floor_cst/WallR.png + ../Game/Floors/Floor_cst/WallRVert.png + ../Game/Floors/Floor_cst/WallVert.png + ../Game/Floors/Floor_grv/Barrel.png + ../Game/Floors/Floor_grv/Bars.png + ../Game/Floors/Floor_grv/BarsVert.png + ../Game/Floors/Floor_grv/BarsVertCont.png + ../Game/Floors/Floor_grv/Brickwork.png + ../Game/Floors/Floor_grv/Doodad.png + ../Game/Floors/Floor_grv/Door.png + ../Game/Floors/Floor_grv/DoorOpen.png + ../Game/Floors/Floor_grv/DoorVert.png + ../Game/Floors/Floor_grv/DoorVertCont.png + ../Game/Floors/Floor_grv/DoorVertOpen.png + ../Game/Floors/Floor_grv/DoorVertOpenCont.png + ../Game/Floors/Floor_grv/Floor.png + ../Game/Floors/Floor_grv/Grate.png + ../Game/Floors/Floor_grv/GrateHoriz.png + ../Game/Floors/Floor_grv/GrateVert.png + ../Game/Floors/Floor_grv/MimicBlock.png + ../Game/Floors/Floor_grv/OrbEmpty.png + ../Game/Floors/Floor_grv/RubbleLooted.png + ../Game/Floors/Floor_grv/Shrine.png + ../Game/Floors/Floor_grv/ShrineBroken.png + ../Game/Floors/Floor_grv/ShrineC.png + ../Game/Floors/Floor_grv/ShrineEmpty.png + ../Game/Floors/Floor_grv/StairsDown.png + ../Game/Floors/Floor_grv/StairsUp.png + ../Game/Floors/Floor_grv/Trap.png + ../Game/Floors/Floor_grv/Wall.png + ../Game/Floors/Floor_grv/WallR.png + ../Game/Floors/Floor_grv/WallRVert.png + ../Game/Floors/Floor_grv/WallVert.png + ../Game/Floors/Floor_jng/Barrel.png + ../Game/Floors/Floor_jng/Bars.png + ../Game/Floors/Floor_jng/BarsVert.png + ../Game/Floors/Floor_jng/BarsVertCont.png + ../Game/Floors/Floor_jng/Brickwork.png + ../Game/Floors/Floor_jng/Doodad.png + ../Game/Floors/Floor_jng/Door.png + ../Game/Floors/Floor_jng/DoorOpen.png + ../Game/Floors/Floor_jng/DoorVert.png + ../Game/Floors/Floor_jng/DoorVertCont.png + ../Game/Floors/Floor_jng/DoorVertOpen.png + ../Game/Floors/Floor_jng/DoorVertOpenCont.png + ../Game/Floors/Floor_jng/Floor.png + ../Game/Floors/Floor_jng/Grate.png + ../Game/Floors/Floor_jng/GrateHoriz.png + ../Game/Floors/Floor_jng/GrateVert.png + ../Game/Floors/Floor_jng/MimicBlock.png + ../Game/Floors/Floor_jng/OrbEmpty.png + ../Game/Floors/Floor_jng/RubbleLooted.png + ../Game/Floors/Floor_jng/Shrine.png + ../Game/Floors/Floor_jng/ShrineBroken.png + ../Game/Floors/Floor_jng/ShrineC.png + ../Game/Floors/Floor_jng/ShrineEmpty.png + ../Game/Floors/Floor_jng/Trap.png + ../Game/Floors/Floor_jng/Wall.png + ../Game/Floors/Floor_jng/WallR.png + ../Game/Floors/Floor_jng/WallRVert.png + ../Game/Floors/Floor_jng/WallVert.png + ../Game/Floors/Floor_jngWild/Barrel.png + ../Game/Floors/Floor_jngWild/Bars.png + ../Game/Floors/Floor_jngWild/BarsVert.png + ../Game/Floors/Floor_jngWild/BarsVertCont.png + ../Game/Floors/Floor_jngWild/Brickwork.png + ../Game/Floors/Floor_jngWild/Doodad.png + ../Game/Floors/Floor_jngWild/Door.png + ../Game/Floors/Floor_jngWild/DoorOpen.png + ../Game/Floors/Floor_jngWild/DoorVert.png + ../Game/Floors/Floor_jngWild/DoorVertCont.png + ../Game/Floors/Floor_jngWild/DoorVertOpen.png + ../Game/Floors/Floor_jngWild/DoorVertOpenCont.png + ../Game/Floors/Floor_jngWild/Floor.png + ../Game/Floors/Floor_jngWild/Grate.png + ../Game/Floors/Floor_jngWild/GrateHoriz.png + ../Game/Floors/Floor_jngWild/GrateVert.png + ../Game/Floors/Floor_jngWild/MimicBlock.png + ../Game/Floors/Floor_jngWild/OrbEmpty.png + ../Game/Floors/Floor_jngWild/RubbleLooted.png + ../Game/Floors/Floor_jngWild/Shrine.png + ../Game/Floors/Floor_jngWild/ShrineBroken.png + ../Game/Floors/Floor_jngWild/ShrineC.png + ../Game/Floors/Floor_jngWild/ShrineEmpty.png + ../Game/Floors/Floor_jngWild/StairsDown.png + ../Game/Floors/Floor_jngWild/StairsUp.png + ../Game/Floors/Floor_jngWild/Trap.png + ../Game/Floors/Floor_jngWild/Wall.png + ../Game/Floors/Floor_jngWild/WallR.png + ../Game/Floors/Floor_jngWild/WallRVert.png + ../Game/Floors/Floor_jngWild/WallVert.png + ../Game/Floors/Floor_lib/Barrel.png + ../Game/Floors/Floor_lib/Bars.png + ../Game/Floors/Floor_lib/BarsVert.png + ../Game/Floors/Floor_lib/BarsVertCont.png + ../Game/Floors/Floor_lib/Brickwork.png + ../Game/Floors/Floor_lib/Doodad.png + ../Game/Floors/Floor_lib/Door.png + ../Game/Floors/Floor_lib/DoorOpen.png + ../Game/Floors/Floor_lib/DoorVert.png + ../Game/Floors/Floor_lib/DoorVertCont.png + ../Game/Floors/Floor_lib/DoorVertOpen.png + ../Game/Floors/Floor_lib/DoorVertOpenCont.png + ../Game/Floors/Floor_lib/Floor.png + ../Game/Floors/Floor_lib/Grate.png + ../Game/Floors/Floor_lib/GrateHoriz.png + ../Game/Floors/Floor_lib/GrateVert.png + ../Game/Floors/Floor_lib/MimicBlock.png + ../Game/Floors/Floor_lib/OrbEmpty.png + ../Game/Floors/Floor_lib/RubbleLooted.png + ../Game/Floors/Floor_lib/Shrine.png + ../Game/Floors/Floor_lib/ShrineBroken.png + ../Game/Floors/Floor_lib/ShrineC.png + ../Game/Floors/Floor_lib/ShrineEmpty.png + ../Game/Floors/Floor_lib/StairsDown.png + ../Game/Floors/Floor_lib/StairsUp.png + ../Game/Floors/Floor_lib/Tile.png + ../Game/Floors/Floor_lib/Trap.png + ../Game/Floors/Floor_lib/Wall.png + ../Game/Floors/Floor_lib/WallR.png + ../Game/Floors/Floor_lib/WallRVert.png + ../Game/Floors/Floor_lib/WallVert.png + ../Game/Floors/Floor_ore/Barrel.png + ../Game/Floors/Floor_ore/Bars.png + ../Game/Floors/Floor_ore/BarsOld.png + ../Game/Floors/Floor_ore/BarsVert.png + ../Game/Floors/Floor_ore/BarsVertCont.png + ../Game/Floors/Floor_ore/Brickwork.png + ../Game/Floors/Floor_ore/Doodad.png + ../Game/Floors/Floor_ore/Door.png + ../Game/Floors/Floor_ore/DoorOpen.png + ../Game/Floors/Floor_ore/DoorVert.png + ../Game/Floors/Floor_ore/DoorVertCont.png + ../Game/Floors/Floor_ore/DoorVertOpen.png + ../Game/Floors/Floor_ore/DoorVertOpenCont.png + ../Game/Floors/Floor_ore/Floor.png + ../Game/Floors/Floor_ore/Grate.png + ../Game/Floors/Floor_ore/GrateHoriz.png + ../Game/Floors/Floor_ore/GrateVert.png + ../Game/Floors/Floor_ore/Light.png + ../Game/Floors/Floor_ore/MimicBlock.png + ../Game/Floors/Floor_ore/OrbEmpty.png + ../Game/Floors/Floor_ore/RubbleLooted.png + ../Game/Floors/Floor_ore/Shrine.png + ../Game/Floors/Floor_ore/ShrineBroken.png + ../Game/Floors/Floor_ore/ShrineC.png + ../Game/Floors/Floor_ore/ShrineEmpty.png + ../Game/Floors/Floor_ore/StairsDown.png + ../Game/Floors/Floor_ore/StairsUp.png + ../Game/Floors/Floor_ore/Trap.png + ../Game/Floors/Floor_ore/Wall.png + ../Game/Floors/Floor_ore/WallVert.png + ../Game/Floors/Floor_shoppe/Barrel.png + ../Game/Floors/Floor_shoppe/Bars.png + ../Game/Floors/Floor_shoppe/BarsVert.png + ../Game/Floors/Floor_shoppe/BarsVertCont.png + ../Game/Floors/Floor_shoppe/Brickwork.png + ../Game/Floors/Floor_shoppe/Doodad.png + ../Game/Floors/Floor_shoppe/Door.png + ../Game/Floors/Floor_shoppe/DoorOpen.png + ../Game/Floors/Floor_shoppe/DoorVert.png + ../Game/Floors/Floor_shoppe/DoorVertCont.png + ../Game/Floors/Floor_shoppe/DoorVertOpen.png + ../Game/Floors/Floor_shoppe/DoorVertOpenCont.png + ../Game/Floors/Floor_shoppe/Floor.png + ../Game/Floors/Floor_shoppe/Grate.png + ../Game/Floors/Floor_shoppe/GrateHoriz.png + ../Game/Floors/Floor_shoppe/GrateVert.png + ../Game/Floors/Floor_shoppe/MimicBlock.png + ../Game/Floors/Floor_shoppe/OrbEmpty.png + ../Game/Floors/Floor_shoppe/RubbleLooted.png + ../Game/Floors/Floor_shoppe/Shrine.png + ../Game/Floors/Floor_shoppe/ShrineBroken.png + ../Game/Floors/Floor_shoppe/ShrineC.png + ../Game/Floors/Floor_shoppe/ShrineEmpty.png + ../Game/Floors/Floor_shoppe/Tile.png + ../Game/Floors/Floor_shoppe/Trap.png + ../Game/Floors/Floor_shoppe/Wall.png + ../Game/Floors/Floor_shoppe/WallR.png + ../Game/Floors/Floor_shoppe/WallRVert.png + ../Game/Floors/Floor_shoppe/WallVert.png + ../Game/Floors/Floor_shrine/Barrel.png + ../Game/Floors/Floor_shrine/Bars.png + ../Game/Floors/Floor_shrine/BarsOld.png + ../Game/Floors/Floor_shrine/BarsVert.png + ../Game/Floors/Floor_shrine/BarsVertCont.png + ../Game/Floors/Floor_shrine/Brickwork.png + ../Game/Floors/Floor_shrine/Doodad.png + ../Game/Floors/Floor_shrine/Door.png + ../Game/Floors/Floor_shrine/DoorOpen.png + ../Game/Floors/Floor_shrine/DoorVert.png + ../Game/Floors/Floor_shrine/DoorVertCont.png + ../Game/Floors/Floor_shrine/DoorVertOpen.png + ../Game/Floors/Floor_shrine/DoorVertOpenCont.png + ../Game/Floors/Floor_shrine/Floor.png + ../Game/Floors/Floor_shrine/Grate.png + ../Game/Floors/Floor_shrine/GrateHoriz.png + ../Game/Floors/Floor_shrine/GrateVert.png + ../Game/Floors/Floor_shrine/MimicBlock.png + ../Game/Floors/Floor_shrine/OrbEmpty.png + ../Game/Floors/Floor_shrine/RubbleLooted.png + ../Game/Floors/Floor_shrine/Shrine.png + ../Game/Floors/Floor_shrine/ShrineBroken.png + ../Game/Floors/Floor_shrine/ShrineC.png + ../Game/Floors/Floor_shrine/ShrineEmpty.png + ../Game/Floors/Floor_shrine/Trap.png + ../Game/Floors/Floor_shrine/Wall.png + ../Game/Floors/Floor_shrine/WallR.png + ../Game/Floors/Floor_shrine/WallRVert.png + ../Game/Floors/Floor_shrine/WallVert.png + ../Game/Floors/Floor_tmb/Barrel.png + ../Game/Floors/Floor_tmb/Bars.png + ../Game/Floors/Floor_tmb/BarsOld.png + ../Game/Floors/Floor_tmb/BarsVert.png + ../Game/Floors/Floor_tmb/BarsVertCont.png + ../Game/Floors/Floor_tmb/Brickwork.png + ../Game/Floors/Floor_tmb/Doodad.png + ../Game/Floors/Floor_tmb/Door.png + ../Game/Floors/Floor_tmb/DoorOpen.png + ../Game/Floors/Floor_tmb/DoorVert.png + ../Game/Floors/Floor_tmb/DoorVertCont.png + ../Game/Floors/Floor_tmb/DoorVertOpen.png + ../Game/Floors/Floor_tmb/DoorVertOpenCont.png + ../Game/Floors/Floor_tmb/Empty.png + ../Game/Floors/Floor_tmb/Floor.png + ../Game/Floors/Floor_tmb/Grate.png + ../Game/Floors/Floor_tmb/GrateHoriz.png + ../Game/Floors/Floor_tmb/GrateVert.png + ../Game/Floors/Floor_tmb/MimicBlock.png + ../Game/Floors/Floor_tmb/OrbEmpty.png + ../Game/Floors/Floor_tmb/RubbleLooted.png + ../Game/Floors/Floor_tmb/Shrine.png + ../Game/Floors/Floor_tmb/ShrineBroken.png + ../Game/Floors/Floor_tmb/ShrineC.png + ../Game/Floors/Floor_tmb/ShrineEmpty.png + ../Game/Floors/Floor_tmb/StairsDown.png + ../Game/Floors/Floor_tmb/StairsUp.png + ../Game/Floors/Floor_tmb/Trap.png + ../Game/Floors/Floor_tmb/Wall.png + ../Game/Floors/Floor_tmb/WallR.png + ../Game/Floors/Floor_tmb/WallRVert.png + ../Game/Floors/Floor_tmb/WallVert.png + ../Game/Floors/Floor_tmp/Barrel.png + ../Game/Floors/Floor_tmp/Bars.png + ../Game/Floors/Floor_tmp/BarsOld.png + ../Game/Floors/Floor_tmp/BarsVert.png + ../Game/Floors/Floor_tmp/BarsVertCont.png + ../Game/Floors/Floor_tmp/Brickwork.png + ../Game/Floors/Floor_tmp/Doodad.png + ../Game/Floors/Floor_tmp/Door.png + ../Game/Floors/Floor_tmp/DoorOpen.png + ../Game/Floors/Floor_tmp/DoorVert.png + ../Game/Floors/Floor_tmp/DoorVertCont.png + ../Game/Floors/Floor_tmp/DoorVertOpen.png + ../Game/Floors/Floor_tmp/DoorVertOpenCont.png + ../Game/Floors/Floor_tmp/Floor.png + ../Game/Floors/Floor_tmp/Grate.png + ../Game/Floors/Floor_tmp/GrateHoriz.png + ../Game/Floors/Floor_tmp/GrateVert.png + ../Game/Floors/Floor_tmp/MimicBlock.png + ../Game/Floors/Floor_tmp/OrbEmpty.png + ../Game/Floors/Floor_tmp/RubbleLooted.png + ../Game/Floors/Floor_tmp/Shrine.png + ../Game/Floors/Floor_tmp/ShrineBroken.png + ../Game/Floors/Floor_tmp/ShrineC.png + ../Game/Floors/Floor_tmp/ShrineEmpty.png + ../Game/Floors/Floor_tmp/StairsDown.png + ../Game/Floors/Floor_tmp/StairsUp.png + ../Game/Floors/Floor_tmp/Trap.png + ../Game/Floors/Floor_tmp/Wall.png + ../Game/Floors/Floor_tmp/WallR.png + ../Game/Floors/Floor_tmp/WallRVert.png + ../Game/Floors/Floor_tmp/WallVert.png + ../Game/Floors/Floor_vault/Barrel.png + ../Game/Floors/Floor_vault/Bars.png + ../Game/Floors/Floor_vault/BarsVert.png + ../Game/Floors/Floor_vault/BarsVertCont.png + ../Game/Floors/Floor_vault/Brickwork.png + ../Game/Floors/Floor_vault/DollDropoff.png + ../Game/Floors/Floor_vault/Doodad.png + ../Game/Floors/Floor_vault/Door.png + ../Game/Floors/Floor_vault/DoorOpen.png + ../Game/Floors/Floor_vault/DoorVert.png + ../Game/Floors/Floor_vault/DoorVertCont.png + ../Game/Floors/Floor_vault/DoorVertOpen.png + ../Game/Floors/Floor_vault/DoorVertOpenCont.png + ../Game/Floors/Floor_vault/Floor.png + ../Game/Floors/Floor_vault/Grate.png + ../Game/Floors/Floor_vault/GrateHoriz.png + ../Game/Floors/Floor_vault/GrateVert.png + ../Game/Floors/Floor_vault/MimicBlock.png + ../Game/Floors/Floor_vault/OrbEmpty.png + ../Game/Floors/Floor_vault/RubbleLooted.png + ../Game/Floors/Floor_vault/Shrine.png + ../Game/Floors/Floor_vault/ShrineBroken.png + ../Game/Floors/Floor_vault/ShrineC.png + ../Game/Floors/Floor_vault/ShrineEmpty.png + ../Game/Floors/Floor_vault/StairsDown.png + ../Game/Floors/Floor_vault/StairsUp.png + ../Game/Floors/Floor_vault/Trap.png + ../Game/Floors/Floor_vault/Wall.png + ../Game/Floors/Floor_vault/WallR.png + ../Game/Floors/Floor_vault/WallRVert.png + ../Game/Floors/Floor_vault/WallVert.png + ../Game/InventoryAction/Attach.png + ../Game/InventoryAction/Bondage.png + ../Game/InventoryAction/CommandWord.png + ../Game/InventoryAction/Cookie.png + ../Game/InventoryAction/CurseInfo.png + ../Game/InventoryAction/CurseStruggle.png + ../Game/InventoryAction/CurseUnlock.png + ../Game/InventoryAction/Cut.png + ../Game/InventoryAction/Disassemble.png + ../Game/InventoryAction/Drop.png + ../Game/InventoryAction/Equip.png + ../Game/InventoryAction/Favorite.png + ../Game/InventoryAction/Hotbar.png + ../Game/InventoryAction/Lock.png + ../Game/InventoryAction/Macaron.png + ../Game/InventoryAction/Offhand.png + ../Game/InventoryAction/Pick.png + ../Game/InventoryAction/Quickslot.png + ../Game/InventoryAction/Recolor.png + ../Game/InventoryAction/Recycle.png + ../Game/InventoryAction/RecycleBulk.png + ../Game/InventoryAction/RecycleExcess.png + ../Game/InventoryAction/Remove.png + ../Game/InventoryAction/RemoveOffhand.png + ../Game/InventoryAction/Sell.png + ../Game/InventoryAction/SellBulk.png + ../Game/InventoryAction/SellExcess.png + ../Game/InventoryAction/Struggle.png + ../Game/InventoryAction/Unequip.png + ../Game/InventoryAction/Unfavorite.png + ../Game/InventoryAction/Use.png + ../Game/Items/AncientPowerSource.png + ../Game/Items/AncientPowerSourceSpent.png + ../Game/Items/Arbiter.png + ../Game/Items/ArcaneCrystal.png + ../Game/Items/ArcaneTome.png + ../Game/Items/Axe.png + ../Game/Items/BagOfGoodies.png + ../Game/Items/Blaster.png + ../Game/Items/BlueKey.png + ../Game/Items/Bola.png + ../Game/Items/BoltCutters.png + ../Game/Items/Bomb.png + ../Game/Items/BondageBuster.png + ../Game/Items/BondageTome.png + ../Game/Items/Bow.png + ../Game/Items/BowRecurve.png + ../Game/Items/Brownies.png + ../Game/Items/C4.png + ../Game/Items/ChainSword.png + ../Game/Items/Claymore.png + ../Game/Items/Crop.png + ../Game/Items/Crossbow.png + ../Game/Items/CrossbowHeavy.png + ../Game/Items/CrossbowPistol.png + ../Game/Items/CuffKeys.png + ../Game/Items/DarkKatana.png + ../Game/Items/DildoBat.png + ../Game/Items/DildoBatPlus.png + ../Game/Items/Dirk.png + ../Game/Items/DiscPick.png + ../Game/Items/DivineTear.png + ../Game/Items/DollID.png + ../Game/Items/Dragonslaver.png + ../Game/Items/Dreamcatcher.png + ../Game/Items/Duster.png + ../Game/Items/Dynamite.png + ../Game/Items/EarthRune.png + ../Game/Items/Ectoplasm.png + ../Game/Items/ElfCrystal.png + ../Game/Items/EnchKnife.png + ../Game/Items/EnchantedGrinder.png + ../Game/Items/EscortDrone.png + ../Game/Items/Feather.png + ../Game/Items/Flail.png + ../Game/Items/Flamberge.png + ../Game/Items/FlashBomb.png + ../Game/Items/Flashbang.png + ../Game/Items/Flashlight.png + ../Game/Items/Foil.png + ../Game/Items/FourSeasons.png + ../Game/Items/FrostSword.png + ../Game/Items/Gold.png + ../Game/Items/GoldenTicket.png + ../Game/Items/Group/ItemArms.png + ../Game/Items/Group/ItemBoots.png + ../Game/Items/Group/ItemBreast.png + ../Game/Items/Group/ItemButt.png + ../Game/Items/Group/ItemDevices.png + ../Game/Items/Group/ItemFeet.png + ../Game/Items/Group/ItemHands.png + ../Game/Items/Group/ItemHead.png + ../Game/Items/Group/ItemLegs.png + ../Game/Items/Group/ItemMouth.png + ../Game/Items/Group/ItemNeck.png + ../Game/Items/Group/ItemNeckAccessories.png + ../Game/Items/Group/ItemNeckRestraints.png + ../Game/Items/Group/ItemNipples.png + ../Game/Items/Group/ItemPelvis.png + ../Game/Items/Group/ItemTorso.png + ../Game/Items/Group/ItemVulva.png + ../Game/Items/Group/ItemVulvaPiercings.png + ../Game/Items/Gunpowder.png + ../Game/Items/Hammer.png + ../Game/Items/Heart.png + ../Game/Items/IceBreaker.png + ../Game/Items/IceCube.png + ../Game/Items/IceRune.png + ../Game/Items/Katana.png + ../Game/Items/KeyCard.png + ../Game/Items/Keyring.png + ../Game/Items/Knife.png + ../Game/Items/Knives.png + ../Game/Items/LeashItem.png + ../Game/Items/LeylineMap.png + ../Game/Items/Longbow.png + ../Game/Items/Lore.png + ../Game/Items/MagicAxe.png + ../Game/Items/MagicFlail.png + ../Game/Items/MagicHammer.png + ../Game/Items/MagicRope.png + ../Game/Items/MagicSpear.png + ../Game/Items/MagicSword.png + ../Game/Items/ManaOrb.png + ../Game/Items/Maul.png + ../Game/Items/MessengerOfLove.png + ../Game/Items/MistressKey.png + ../Game/Items/MoiraiScissors.png + ../Game/Items/Persuader.png + ../Game/Items/Pick.png + ../Game/Items/Pickaxe.png + ../Game/Items/Pike.png + ../Game/Items/PotionFrigid.png + ../Game/Items/PotionInvisibility.png + ../Game/Items/PotionMana.png + ../Game/Items/PotionStamina.png + ../Game/Items/PotionWill.png + ../Game/Items/Rapier.png + ../Game/Items/RedKey.png + ../Game/Items/Restraint.png + ../Game/Items/Restraint/Ancient.png + ../Game/Items/Restraint/Armbinders.png + ../Game/Items/Restraint/AutoTape.png + ../Game/Items/Restraint/BallGags.png + ../Game/Items/Restraint/Belts.png + ../Game/Items/Restraint/Blindfolds.png + ../Game/Items/Restraint/Boxbinders.png + ../Game/Items/Restraint/Charms.png + ../Game/Items/Restraint/Chastity.png + ../Game/Items/Restraint/ChastityBelts.png + ../Game/Items/Restraint/Gags.png + ../Game/Items/Restraint/Glue.png + ../Game/Items/Restraint/Harnesses.png + ../Game/Items/Restraint/HolyRope.png + ../Game/Items/Restraint/Ice.png + ../Game/Items/Restraint/Latex.png + ../Game/Items/Restraint/Leashes.png + ../Game/Items/Restraint/LeatherCuffs.png + ../Game/Items/Restraint/Legbinders.png + ../Game/Items/Restraint/MagicBelts.png + ../Game/Items/Restraint/MithrilRope.png + ../Game/Items/Restraint/MysticDuctTape.png + ../Game/Items/Restraint/Obsidian.png + ../Game/Items/Restraint/PanelGags.png + ../Game/Items/Restraint/PlugGags.png + ../Game/Items/Restraint/Plugs.png + ../Game/Items/Restraint/Ribbons.png + ../Game/Items/Restraint/RopeSnake.png + ../Game/Items/Restraint/Rubber.png + ../Game/Items/Restraint/ShadowLatex.png + ../Game/Items/Restraint/Slime.png + ../Game/Items/Restraint/SteelPlugs.png + ../Game/Items/Restraint/Straitjackets.png + ../Game/Items/Restraint/StrongMagicRopes.png + ../Game/Items/Restraint/SupremeBelt.png + ../Game/Items/Restraint/Tape.png + ../Game/Items/Restraint/Ties.png + ../Game/Items/Restraint/Vibes.png + ../Game/Items/Restraint/VinylTape.png + ../Game/Items/Restraint/WeakMagicRopes.png + ../Game/Items/Restraint/Yokes.png + ../Game/Items/Restraint/liquidMetal.png + ../Game/Items/Rock.png + ../Game/Items/Rope.png + ../Game/Items/RopeRune.png + ../Game/Items/SackOfSacks.png + ../Game/Items/Scissors.png + ../Game/Items/Scroll.png + ../Game/Items/ScrollArms.png + ../Game/Items/ScrollLegs.png + ../Game/Items/ScrollPurity.png + ../Game/Items/ScrollVerbal.png + ../Game/Items/Scrolls.png + ../Game/Items/Shield.png + ../Game/Items/ShieldMagic.png + ../Game/Items/ShieldReinforced.png + ../Game/Items/ShieldTower.png + ../Game/Items/SlimeClaymore.png + ../Game/Items/SlimeSword.png + ../Game/Items/Slimethrower.png + ../Game/Items/SmokeBomb.png + ../Game/Items/Snuffer.png + ../Game/Items/Spear.png + ../Game/Items/StaffBind.png + ../Game/Items/StaffChain.png + ../Game/Items/StaffDoll.png + ../Game/Items/StaffElectric.png + ../Game/Items/StaffFlame.png + ../Game/Items/StaffFrostbite.png + ../Game/Items/StaffGlue.png + ../Game/Items/StaffIncineration.png + ../Game/Items/StaffPermafrost.png + ../Game/Items/StaffStorm.png + ../Game/Items/StaffTape.png + ../Game/Items/StormBreaker.png + ../Game/Items/Sweeper.png + ../Game/Items/Sword.png + ../Game/Items/TheEncaser.png + ../Game/Items/Torch.png + ../Game/Items/Unarmed.png + ../Game/Items/UniversalSolvent.png + ../Game/Items/VibeRemote.png + ../Game/Items/VibeWand.png + ../Game/Items/WaterRune.png + ../Game/Lock.png + ../Game/Particles/ShockCollarHit.png + ../Game/ShopBasic/2C4.png + ../Game/ShopBasic/2Dynamite.png + ../Game/ShopBasic/3Bola.png + ../Game/ShopBasic/3Bomb.png + ../Game/ShopBasic/3Flash.png + ../Game/ShopBasic/3Flashbang.png + ../Game/ShopBasic/3Smoke.png + ../Game/ShopBasic/BlueKey.png + ../Game/ShopBasic/DivineBelt.png + ../Game/ShopBasic/DivineBelt2.png + ../Game/ShopBasic/Lockpick.png + ../Game/ShopBasic/RedKey.png + ../Game/ShopBasic/SlimeWalkers.png + ../Game/ShrineAura.png + ../Game/ShrineAuraQuest.png + ../Game/SpellRange.png + ../Game/SpellReady.png + ../Game/Spells/AirMote.png + ../Game/Spells/AkashicConflux.png + ../Game/Spells/Ally.png + ../Game/Spells/AllyAggressive.png + ../Game/Spells/AllyAttention.png + ../Game/Spells/AllyCancelHold.png + ../Game/Spells/AllyDefensive.png + ../Game/Spells/AllyDeselect.png + ../Game/Spells/AllyDeselectAll.png + ../Game/Spells/AllyDisperse.png + ../Game/Spells/AllyFireboltHit.png + ../Game/Spells/AllyHold.png + ../Game/Spells/AllyMove.png + ../Game/Spells/AllyOnMe.png + ../Game/Spells/AllyToggle.png + ../Game/Spells/Analyze.png + ../Game/Spells/Animate.png + ../Game/Spells/AnimateLarge.png + ../Game/Spells/AnimatePuppet.png + ../Game/Spells/ApprenticeAir.png + ../Game/Spells/ApprenticeEarth.png + ../Game/Spells/ApprenticeFire.png + ../Game/Spells/ApprenticeIce.png + ../Game/Spells/ApprenticeLightning.png + ../Game/Spells/ApprenticeMagic.png + ../Game/Spells/ApprenticeWater.png + ../Game/Spells/ArcaneBarrier.png + ../Game/Spells/ArcaneBlast.png + ../Game/Spells/ArrowFireSpell.png + ../Game/Spells/ArrowVineSpell.png + ../Game/Spells/Awaken.png + ../Game/Spells/BanishPortal.png + ../Game/Spells/BattleRhythm.png + ../Game/Spells/BattleTrance.png + ../Game/Spells/BigBoulderLaunch.png + ../Game/Spells/BladeDance.png + ../Game/Spells/Blink.png + ../Game/Spells/Bomb.png + ../Game/Spells/Bondage.png + ../Game/Spells/BoulderKick.png + ../Game/Spells/BoulderLaunch.png + ../Game/Spells/BreakFree.png + ../Game/Spells/Camo.png + ../Game/Spells/CanUpcast.png + ../Game/Spells/ChainBolt.png + ../Game/Spells/ChainStrike.png + ../Game/Spells/ChaoticOverflow.png + ../Game/Spells/Charge.png + ../Game/Spells/Chastity.png + ../Game/Spells/Coalesce.png + ../Game/Spells/ColdFeet.png + ../Game/Spells/CommandBind.png + ../Game/Spells/CommandCapture.png + ../Game/Spells/CommandDisenchant.png + ../Game/Spells/CommandOrgasm.png + ../Game/Spells/CommandRelease.png + ../Game/Spells/CommandSlime.png + ../Game/Spells/CommandVibrate.png + ../Game/Spells/CommandWord.png + ../Game/Spells/CommandWordGreater.png + ../Game/Spells/Corona.png + ../Game/Spells/Crackle.png + ../Game/Spells/Dagger.png + ../Game/Spells/Decoy.png + ../Game/Spells/DesperateStruggle.png + ../Game/Spells/DisplayStand.png + ../Game/Spells/DistractionBurst.png + ../Game/Spells/DistractionCast.png + ../Game/Spells/DistractionShield.png + ../Game/Spells/EarthMote.png + ../Game/Spells/Earthform.png + ../Game/Spells/EarthformArc.png + ../Game/Spells/EarthformLine.png + ../Game/Spells/EarthformMound.png + ../Game/Spells/EarthformRing.png + ../Game/Spells/Earthquake.png + ../Game/Spells/ElasticGrip.png + ../Game/Spells/Electrify.png + ../Game/Spells/Empower.png + ../Game/Spells/EmpowerCancel.png + ../Game/Spells/EmpowerFail.png + ../Game/Spells/EnchantRope.png + ../Game/Spells/EnemySense.png + ../Game/Spells/Engulf.png + ../Game/Spells/Enrage.png + ../Game/Spells/Evasion.png + ../Game/Spells/EvasiveManeuvers.png + ../Game/Spells/FeatherCloud.png + ../Game/Spells/FireElemental.png + ../Game/Spells/Fireball.png + ../Game/Spells/Fireblast.png + ../Game/Spells/Firebolt.png + ../Game/Spells/Firecracker.png + ../Game/Spells/FirstWind.png + ../Game/Spells/FirstWindHigher.png + ../Game/Spells/Fissure.png + ../Game/Spells/FlameBlade.png + ../Game/Spells/FlameRune.png + ../Game/Spells/Flash.png + ../Game/Spells/FlashBomb.png + ../Game/Spells/FlashFreeze.png + ../Game/Spells/FleetFooted.png + ../Game/Spells/FloatingWeapon.png + ../Game/Spells/FocusedFlash.png + ../Game/Spells/Freeze.png + ../Game/Spells/FreezeRune.png + ../Game/Spells/Frustration.png + ../Game/Spells/Golem.png + ../Game/Spells/GreaterFlash.png + ../Game/Spells/GreaterInvisibility.png + ../Game/Spells/GreaterShield.png + ../Game/Spells/Gust.png + ../Game/Spells/Hailstorm.png + ../Game/Spells/Heal.png + ../Game/Spells/Heal2.png + ../Game/Spells/HolyOrb.png + ../Game/Spells/IceBreath.png + ../Game/Spells/IceLance.png + ../Game/Spells/IceOrb.png + ../Game/Spells/Icebolt.png + ../Game/Spells/Icicles.png + ../Game/Spells/Ignite.png + ../Game/Spells/Ignition.png + ../Game/Spells/Incinerate.png + ../Game/Spells/Invisibility.png + ../Game/Spells/IronBlood.png + ../Game/Spells/KineticLance.png + ../Game/Spells/Knife.png + ../Game/Spells/LatexWall.png + ../Game/Spells/LatexWallHoriz.png + ../Game/Spells/LatexWallVert.png + ../Game/Spells/Leap.png + ../Game/Spells/Leap2.png + ../Game/Spells/Leap3.png + ../Game/Spells/LeashSkill.png + ../Game/Spells/LeatherBurst.png + ../Game/Spells/LeatherWhip.png + ../Game/Spells/Light.png + ../Game/Spells/LightningBolt.png + ../Game/Spells/LightningRune.png + ../Game/Spells/LimitSurge.png + ../Game/Spells/LiquidMetal.png + ../Game/Spells/LiquidMetalBurst.png + ../Game/Spells/Lockdown.png + ../Game/Spells/MakeEssenceMote.png + ../Game/Spells/ManaRecharge.png + ../Game/Spells/NatureSpirit.png + ../Game/Spells/NegateRune.png + ../Game/Spells/Offhand.png + ../Game/Spells/OrgasmResist.png + ../Game/Spells/Petsuit.png + ../Game/Spells/ProblemSolving.png + ../Game/Spells/PsychicLink.png + ../Game/Spells/Quickness.png + ../Game/Spells/Quickness2.png + ../Game/Spells/Quickness3.png + ../Game/Spells/Quickness4.png + ../Game/Spells/Quickness5.png + ../Game/Spells/Rainstorm.png + ../Game/Spells/RaiseDefenses.png + ../Game/Spells/RecoverObject.png + ../Game/Spells/RecoverObject2.png + ../Game/Spells/Ring.png + ../Game/Spells/RingOfSlime.png + ../Game/Spells/RopeBoltLaunch.png + ../Game/Spells/RopeBoltLaunchMany.png + ../Game/Spells/RopeStrike.png + ../Game/Spells/Ropework.png + ../Game/Spells/Sagitta.png + ../Game/Spells/ShadowBlade.png + ../Game/Spells/ShadowDance.png + ../Game/Spells/ShadowSlash.png + ../Game/Spells/ShadowWarrior.png + ../Game/Spells/Shatter.png + ../Game/Spells/Shield.png + ../Game/Spells/Shock.png + ../Game/Spells/ShockCollar.png + ../Game/Spells/Shroud.png + ../Game/Spells/Sleet.png + ../Game/Spells/Slime.png + ../Game/Spells/SlimeBall.png + ../Game/Spells/SlimeEruption.png + ../Game/Spells/SlimeSplash.png + ../Game/Spells/SlimeToLatex.png + ../Game/Spells/SlimeWall.png + ../Game/Spells/SlimeWallHoriz.png + ../Game/Spells/SlimeWallVert.png + ../Game/Spells/Snare.png + ../Game/Spells/Snowball.png + ../Game/Spells/Sonar.png + ../Game/Spells/Sowing.png + ../Game/Spells/SpellChoiceUp1.png + ../Game/Spells/SpellChoiceUp2.png + ../Game/Spells/SpellChoiceUp3.png + ../Game/Spells/SpellFail.png + ../Game/Spells/SpellFailPartial.png + ../Game/Spells/Spread.png + ../Game/Spells/StaticSphere.png + ../Game/Spells/SteelRainBurst.png + ../Game/Spells/SteelRainPlug.png + ../Game/Spells/StoneSkin.png + ../Game/Spells/StormCrystal.png + ../Game/Spells/Strength.png + ../Game/Spells/SummonAMGag.png + ../Game/Spells/SummonArmbinder.png + ../Game/Spells/SummonBlindfold.png + ../Game/Spells/SummonCuffs.png + ../Game/Spells/SummonGag.png + ../Game/Spells/SummonHarness.png + ../Game/Spells/SummonLatexArmbinder.png + ../Game/Spells/SummonLatexGag.png + ../Game/Spells/SummonLatexLegbinder.png + ../Game/Spells/SummonLeatherCuffs.png + ../Game/Spells/SummonLegbinder.png + ../Game/Spells/SummonStraitjacket.png + ../Game/Spells/SummonUp1.png + ../Game/Spells/SummonUp2.png + ../Game/Spells/SummonYoke.png + ../Game/Spells/Swap.png + ../Game/Spells/TelekineticSlash.png + ../Game/Spells/Thunderstorm.png + ../Game/Spells/TickleCloud.png + ../Game/Spells/TidalBall.png + ../Game/Spells/ToolsOfTheTrade.png + ../Game/Spells/TransportationPortal.png + ../Game/Spells/Tremor.png + ../Game/Spells/TrueSight.png + ../Game/Spells/TrueSteel.png + ../Game/Spells/UnconventionalWarfare.png + ../Game/Spells/Volcanism.png + ../Game/Spells/Wall.png + ../Game/Spells/WaterBall.png + ../Game/Spells/WaterMote.png + ../Game/Spells/WindBlast.png + ../Game/Spells/ZeroResistance.png + ../Game/Spells/ZoneOfExcitement.png + ../Game/Spells/ZoneOfFrost.png + ../Game/Spells/ZoneOfPurity.png + ../Game/Sprint.png + ../Game/Target.png + ../Game/TargetAction.png + ../Game/TargetAttack.png + ../Game/TargetMove.png + ../Game/TargetPass.png + ../Game/TargetSpell.png + ../Game/TargetSub.png + ../Game/TargetTalk.png + ../Game/UI/AutoBindCopy.png + ../Game/UI/AutoBindPaste.png + ../Game/UI/AutoBindPasteAll.png + ../Game/UI/AutoBindPasteAllOver.png + ../Game/UI/CollectionFilter/Available.png + ../Game/UI/CollectionFilter/Bound.png + ../Game/UI/CollectionFilter/EscapeRisk.png + ../Game/UI/CollectionFilter/Escaped.png + ../Game/UI/CollectionFilter/Free.png + ../Game/UI/CollectionFilter/Imprisoned.png + ../Game/UI/CollectionFilter/Negative.png + ../Game/UI/CollectionFilter/Positive.png + ../Game/UI/CollectionFilter/Rank0.png + ../Game/UI/CollectionFilter/Rank1.png + ../Game/UI/CollectionFilter/Rank2.png + ../Game/UI/CollectionFilter/Rank3.png + ../Game/UI/CollectionFilter/Rank4.png + ../Game/UI/CollectionFilter/Rank5.png + ../Game/UI/CollectionFilter/Safe.png + ../Game/UI/CollectionFilter/Unavailable.png + ../Game/UI/CollectionTab/AutoBind.png + ../Game/UI/CollectionTab/FacilityQuick.png + ../Game/UI/CollectionTab/Release.png + ../Game/UI/Crosshair.png + ../Game/UI/Cycle.png + ../Game/UI/Facility/AlchemyLab.png + ../Game/UI/Facility/CuddleLounge.png + ../Game/UI/Facility/Gear.png + ../Game/UI/Facility/MaidQuarters.png + ../Game/UI/Facility/Management.png + ../Game/UI/Facility/Recycler.png + ../Game/UI/Facility/RescueTeam.png + ../Game/UI/Facility/TrainingDojo.png + ../Game/UI/Facility/Warden.png + ../Game/UI/ItemAura.png + ../Game/UI/ItemAuraBG.png + ../Game/UI/MapMod/Bandit.png + ../Game/UI/MapMod/Dragon.png + ../Game/UI/MapMod/Mold.png + ../Game/UI/MapMod/None.png + ../Game/UI/MapMod/Plant.png + ../Game/UI/MapMod/Robot.png + ../Game/UI/MapMod/Slime.png + ../Game/UI/MapMod/Witch.png + ../Game/UI/MapMod/Wolf.png + ../Game/UI/NavMap/basic.png + ../Game/UI/NavMap/boss.png + ../Game/UI/NavMap/shop.png + ../Game/UI/PathDisplay.png + ../Game/UI/PlayerFacing.png + ../Game/UI/Rank/Rank0.png + ../Game/UI/Rank/Rank1.png + ../Game/UI/Rank/Rank2.png + ../Game/UI/Rank/Rank3.png + ../Game/UI/Rank/Rank4.png + ../Game/UI/Rank/Rank5.png + ../Game/UI/Recycler/Armor.png + ../Game/UI/Recycler/Chastity.png + ../Game/UI/Recycler/Latex.png + ../Game/UI/Recycler/Leather.png + ../Game/UI/Recycler/Leather2.png + ../Game/UI/Recycler/Rope.png + ../Game/UI/Recycler/Tape.png + ../Game/UI/Resource/Latex.png + ../Game/UI/Resource/Leather.png + ../Game/UI/Resource/Metal.png + ../Game/UI/Resource/Rope.png + ../Game/UI/Resource/Rune.png + ../Game/WarningAlly.png + ../Game/WarningBacking.png + ../Game/WarningBackingHighlight.png + ../Game/WarningColor.png + ../Game/WarningColorBasic.png + ../Game/WarningColorSpecial.png + ../Game/WarningColorSpecialBasic.png + ../Game/WarningColorSpell.png + ../Game/WarningHighlightAlly.png + ../Game/WarningHighlightSpecialBasic.png + ../Game/WarningMove.png + ../Game/WeakBinding.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 18,18,36,36 + scale9Paddings + 18,18,36,36 + scale9FromFile + + + ../Game/Aura/Airbender0.png + ../Game/Aura/Airbender1.png + ../Game/Aura/Airbender2.png + ../Game/Aura/Armored.png + ../Game/Aura/Aura.png + ../Game/Aura/AuraSeal.png + ../Game/Aura/AuraX.png + ../Game/Aura/BondageBuster.png + ../Game/Aura/Chastity.png + ../Game/Aura/Conduction.png + ../Game/Aura/Disrobe.png + ../Game/Aura/DistractionShield.png + ../Game/Aura/DoublePlugged.png + ../Game/Aura/Drenched.png + ../Game/Aura/EnergyShield.png + ../Game/Aura/Fast.png + ../Game/Aura/Flaming.png + ../Game/Aura/Glow.png + ../Game/Aura/Glued.png + ../Game/Aura/HealingAura.png + ../Game/Aura/Heart.png + ../Game/Aura/LatexBubble.png + ../Game/Aura/Missiles0.png + ../Game/Aura/Missiles1.png + ../Game/Aura/Missiles2.png + ../Game/Aura/Missiles3.png + ../Game/Aura/Missiles4.png + ../Game/Aura/Muscle.png + ../Game/Aura/NoWP.png + ../Game/Aura/Null.png + ../Game/Aura/Plugged.png + ../Game/Aura/PsychicLink.png + ../Game/Aura/Reload.png + ../Game/Aura/Select.png + ../Game/Aura/Slimed.png + ../Game/Aura/Toy.png + ../Game/Aura/WaterBubble.png + ../Game/Enemies/DragonQueenCrystal.png + ../Game/Enemies/DragonQueenIce.png + ../Game/Enemies/DragonQueenPoison.png + ../Game/Enemies/DragonQueenShadow.png + ../Game/UI/DollmakerTarget.png + ../Game/UI/HighValueTarget.png + ../Game/UI/StageTarget.png + ../Game/Vision.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 36,36,72,72 + scale9Paddings + 36,36,72,72 + scale9FromFile + + + ../Game/AutoStruggle.png + ../Game/AutoStruggleOff.png + ../Game/Buckle.png + ../Game/Buffs/curse/Blocked.png + ../Game/CurseInfo.png + ../Game/CurseUnlock.png + ../Game/FastMove.png + ../Game/FastMoveOff.png + ../Game/HideFalse.png + ../Game/HideFull.png + ../Game/HideMost.png + ../Game/HideStruggle.png + ../Game/HideTrue.png + ../Game/Locks/Blind.png + ../Game/Locks/Blocked.png + ../Game/Locks/Blue.png + ../Game/Locks/Crystal.png + ../Game/Locks/Curse.png + ../Game/Locks/Cyber.png + ../Game/Locks/Cyber2.png + ../Game/Locks/Cyber3.png + ../Game/Locks/Disc.png + ../Game/Locks/Divine.png + ../Game/Locks/Divine2.png + ../Game/Locks/Dollmaker.png + ../Game/Locks/ExCrystal.png + ../Game/Locks/Fuuka.png + ../Game/Locks/Gold.png + ../Game/Locks/Grey.png + ../Game/Locks/HiSec.png + ../Game/Locks/Purple.png + ../Game/Locks/Red.png + ../Game/Locks/Red_Hi.png + ../Game/Locks/Red_Med.png + ../Game/Locks/Rubber.png + ../Game/Locks/StarCurse.png + ../Game/Locks/White.png + ../Game/Poses/SetPose.png + ../Game/Struggle.png + ../Game/UI/BulletTransparency.png + ../Game/UI/XRay0.png + ../Game/UI/XRay1.png + ../Game/UI/XRay2.png + ../Game/UseTool.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 14,14,28,28 + scale9Paddings + 14,14,28,28 + scale9FromFile + + + ../Game/Backpack.png + ../Game/BackpackOpen.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 14,22,28,43 + scale9Paddings + 14,22,28,43 + scale9FromFile + + + ../Game/Buffs/BlankBuff.png + ../Game/Buffs/BuffDots.png + ../Game/Buffs/BuffDotsSide.png + ../Game/Buffs/Denied.png + ../Game/Buffs/Edged.png + ../Game/Buffs/Help.png + ../Game/Buffs/HelpCorner.png + ../Game/Buffs/HelpCrack.png + ../Game/Buffs/HelpHook.png + ../Game/Buffs/HelpSharp.png + ../Game/Buffs/HelpSticky.png + ../Game/Buffs/Plugged.png + ../Game/Buffs/PluggedFull.png + ../Game/Buffs/Satisfied.png + ../Game/Buffs/Vibe0.png + ../Game/Buffs/Vibe1.png + ../Game/Buffs/Vibe2.png + ../Game/Buffs/Vibe3.png + ../Game/Buffs/Vibe4.png + ../Game/Buffs/Vibe5.png + ../Game/Buffs/armor.png + ../Game/Buffs/boost.png + ../Game/Buffs/boostmixed.png + ../Game/Buffs/boundArms.png + ../Game/Buffs/boundBlind.png + ../Game/Buffs/boundGag.png + ../Game/Buffs/boundGagFull.png + ../Game/Buffs/boundHands.png + ../Game/Buffs/boundHandsPartial.png + ../Game/Buffs/boundImmobile.png + ../Game/Buffs/boundSlow1.png + ../Game/Buffs/boundSlow2.png + ../Game/Buffs/boundSlow3.png + ../Game/Buffs/boundSlow4.png + ../Game/Buffs/boundStun.png + ../Game/Buffs/buff/buff.png + ../Game/Buffs/buff/buffAkashicConflux.png + ../Game/Buffs/buff/buffAnalyze.png + ../Game/Buffs/buff/buffArcaneEnergy.png + ../Game/Buffs/buff/buffAvatarAir.png + ../Game/Buffs/buff/buffAvatarEarth.png + ../Game/Buffs/buff/buffAvatarFire.png + ../Game/Buffs/buff/buffAvatarWater.png + ../Game/Buffs/buff/buffBattleRhythm.png + ../Game/Buffs/buff/buffBattleTrance.png + ../Game/Buffs/buff/buffBoundByFate.png + ../Game/Buffs/buff/buffBurning.png + ../Game/Buffs/buff/buffCamo.png + ../Game/Buffs/buff/buffChaoticOverflow.png + ../Game/Buffs/buff/buffChillWalk.png + ../Game/Buffs/buff/buffChilled.png + ../Game/Buffs/buff/buffConduction.png + ../Game/Buffs/buff/buffCorrupted.png + ../Game/Buffs/buff/buffCorruptionStat.png + ../Game/Buffs/buff/buffCursed.png + ../Game/Buffs/buff/buffCursedDistract.png + ../Game/Buffs/buff/buffCursingCircle.png + ../Game/Buffs/buff/buffCutting.png + ../Game/Buffs/buff/buffDildoBatBuff.png + ../Game/Buffs/buff/buffDisenchantSelf.png + ../Game/Buffs/buff/buffDistractionCast.png + ../Game/Buffs/buff/buffDistractionShield.png + ../Game/Buffs/buff/buffDrenched.png + ../Game/Buffs/buff/buffEmpower.png + ../Game/Buffs/buff/buffForcedSubmission.png + ../Game/Buffs/buff/buffFuukaOrb.png + ../Game/Buffs/buff/buffGreaterInvisibility.png + ../Game/Buffs/buff/buffHaunted.png + ../Game/Buffs/buff/buffHighValueFound.png + ../Game/Buffs/buff/buffIgnite.png + ../Game/Buffs/buff/buffInnerPowerArcaneStore.png + ../Game/Buffs/buff/buffInvisibility.png + ../Game/Buffs/buff/buffLatexBubble.png + ../Game/Buffs/buff/buffLatexIntegrationStat.png + ../Game/Buffs/buff/buffLeatherBurst.png + ../Game/Buffs/buff/buffLightningRod.png + ../Game/Buffs/buff/buffManaBurst.png + ../Game/Buffs/buff/buffManaRegenSuspend.png + ../Game/Buffs/buff/buffNoWP.png + ../Game/Buffs/buff/buffNovicePet.png + ../Game/Buffs/buff/buffNovicePetBad.png + ../Game/Buffs/buff/buffNovicePetVeryBad.png + ../Game/Buffs/buff/buffPoisonDagger.png + ../Game/Buffs/buff/buffRaiseDefenses.png + ../Game/Buffs/buff/buffRogueEscape.png + ../Game/Buffs/buff/buffSagittaAssault.png + ../Game/Buffs/buff/buffScrollArms.png + ../Game/Buffs/buff/buffScrollLegs.png + ../Game/Buffs/buff/buffScrollVerbal.png + ../Game/Buffs/buff/buffShadowSeal.png + ../Game/Buffs/buff/buffShockCollarCD.png + ../Game/Buffs/buff/buffSlimeMimic.png + ../Game/Buffs/buff/buffSlimed.png + ../Game/Buffs/buff/buffSlippery.png + ../Game/Buffs/buff/buffSpellDamageResist.png + ../Game/Buffs/buff/buffSpellDamageUp.png + ../Game/Buffs/buff/buffStoneSkin.png + ../Game/Buffs/buff/buffTablet.png + ../Game/Buffs/buff/buffTabletConjure.png + ../Game/Buffs/buff/buffTabletElements.png + ../Game/Buffs/buff/buffTabletIllusion.png + ../Game/Buffs/buff/buffTabletLatex.png + ../Game/Buffs/buff/buffTabletLeather.png + ../Game/Buffs/buff/buffTabletMetal.png + ../Game/Buffs/buff/buffTabletRope.png + ../Game/Buffs/buff/buffTabletWill.png + ../Game/Buffs/buff/buffTaunted.png + ../Game/Buffs/buff/buffTraineeWP.png + ../Game/Buffs/buff/buffUnsteady.png + ../Game/Buffs/buff/buffWaterBubble.png + ../Game/Buffs/buff/buffd_OrgasmResist.png + ../Game/Buffs/buff/buffd_SlimeMimic.png + ../Game/Buffs/buff/buffe_OrgasmResist.png + ../Game/Buffs/curse/Blind.png + ../Game/Buffs/curse/Blue.png + ../Game/Buffs/curse/Curse.png + ../Game/Buffs/curse/Disc.png + ../Game/Buffs/curse/Divine.png + ../Game/Buffs/curse/Dollmaker.png + ../Game/Buffs/curse/Fuuka.png + ../Game/Buffs/curse/Gold.png + ../Game/Buffs/curse/HiSec.png + ../Game/Buffs/curse/Purple.png + ../Game/Buffs/curse/Red.png + ../Game/Buffs/curse/Red_Hi.png + ../Game/Buffs/curse/Red_Med.png + ../Game/Buffs/curse/Rubber.png + ../Game/Buffs/curse/StarCurse.png + ../Game/Buffs/curse/White.png + ../Game/Buffs/damageresist.png + ../Game/Buffs/debuff.png + ../Game/Buffs/dmg.png + ../Game/Buffs/dmgPlus/dmg.png + ../Game/Buffs/dmgPlus/dmgacid.png + ../Game/Buffs/dmgPlus/dmgarcane.png + ../Game/Buffs/dmgPlus/dmgbind.png + ../Game/Buffs/dmgPlus/dmgchain.png + ../Game/Buffs/dmgPlus/dmgcharm.png + ../Game/Buffs/dmgPlus/dmgcold.png + ../Game/Buffs/dmgPlus/dmgcrush.png + ../Game/Buffs/dmgPlus/dmgelectric.png + ../Game/Buffs/dmgPlus/dmgfire.png + ../Game/Buffs/dmgPlus/dmgglue.png + ../Game/Buffs/dmgPlus/dmggrope.png + ../Game/Buffs/dmgPlus/dmghappygas.png + ../Game/Buffs/dmgPlus/dmgice.png + ../Game/Buffs/dmgPlus/dmgmagic.png + ../Game/Buffs/dmgPlus/dmgmelee.png + ../Game/Buffs/dmgPlus/dmgpain.png + ../Game/Buffs/dmgPlus/dmgpierce.png + ../Game/Buffs/dmgPlus/dmgplush.png + ../Game/Buffs/dmgPlus/dmgpoison.png + ../Game/Buffs/dmgPlus/dmgslash.png + ../Game/Buffs/dmgPlus/dmgsoap.png + ../Game/Buffs/dmgPlus/dmgsoul.png + ../Game/Buffs/dmgPlus/dmgspell.png + ../Game/Buffs/dmgPlus/dmgstun.png + ../Game/Buffs/dmgPlus/dmgtickle.png + ../Game/Buffs/dmgPlus/dmgunarmed.png + ../Game/Buffs/dmgacid.png + ../Game/Buffs/dmgarcane.png + ../Game/Buffs/dmgchain.png + ../Game/Buffs/dmgcharm.png + ../Game/Buffs/dmgcold.png + ../Game/Buffs/dmgcrush.png + ../Game/Buffs/dmgelectric.png + ../Game/Buffs/dmgfire.png + ../Game/Buffs/dmgglue.png + ../Game/Buffs/dmggrope.png + ../Game/Buffs/dmghappygas.png + ../Game/Buffs/dmgholy.png + ../Game/Buffs/dmgice.png + ../Game/Buffs/dmgmagic.png + ../Game/Buffs/dmgmelee.png + ../Game/Buffs/dmgpain.png + ../Game/Buffs/dmgpierce.png + ../Game/Buffs/dmgplush.png + ../Game/Buffs/dmgpoison.png + ../Game/Buffs/dmgslash.png + ../Game/Buffs/dmgsoap.png + ../Game/Buffs/dmgsoul.png + ../Game/Buffs/dmgstun.png + ../Game/Buffs/dmgtickle.png + ../Game/Buffs/dmgunarmed.png + ../Game/Buffs/info.png + ../Game/Buffs/infoAccuracy.png + ../Game/Buffs/infoAccuracyBuff.png + ../Game/Buffs/infoAccuracyDebuff.png + ../Game/Buffs/infoBlock.png + ../Game/Buffs/infoDamageMelee.png + ../Game/Buffs/infoEvasion.png + ../Game/Buffs/infoJailFree.png + ../Game/Buffs/infoJailPrisoner.png + ../Game/Buffs/infoJailSubmissive.png + ../Game/Buffs/infoKey.png + ../Game/Buffs/infoMiscast.png + ../Game/Buffs/infoMiscastDebuff.png + ../Game/Buffs/infoNoKey.png + ../Game/Buffs/invisible.png + ../Game/Buffs/kinkbuff.png + ../Game/Buffs/perk/perk.png + ../Game/Buffs/perk/perkBerserkerRage.png + ../Game/Buffs/perk/perkBoundPower.png + ../Game/Buffs/perk/perkBurningDesire.png + ../Game/Buffs/perk/perkFrigidPersonality.png + ../Game/Buffs/perk/perkGroundedInReality.png + ../Game/Buffs/perk/perkImmovableObject.png + ../Game/Buffs/perk/perkLeastResistance.png + ../Game/Buffs/perk/perkLikeTheWind.png + ../Game/Buffs/perk/perkPacifist.png + ../Game/Buffs/perk/perkPathOfLeastResistance.png + ../Game/Buffs/perk/perkUnstableMagic.png + ../Game/Buffs/quickness.png + ../Game/Buffs/restraintblock.png + ../Game/Buffs/restriction.png + ../Game/Buffs/shadow.png + ../Game/Buffs/shield.png + ../Game/Buffs/spellarmor.png + ../Game/Buffs/status/freeArms.png + ../Game/Buffs/status/freeEyes.png + ../Game/Buffs/status/freeHands.png + ../Game/Buffs/status/freeLegs.png + ../Game/Buffs/status/freeMouth.png + ../Game/Buffs/training/Heels.png + ../Game/Buffs/visibility.png + ../Game/Buffs/weaponTag/bow.png + ../Game/Buffs/weaponTag/clumsy.png + ../Game/Buffs/weaponTag/heavy.png + ../Game/Buffs/weaponTag/illum.png + ../Game/Buffs/weaponTag/light.png + ../Game/Buffs/weaponTag/magic.png + ../Game/Buffs/weaponTag/massive.png + ../Game/Buffs/weaponTag/noHands.png + ../Game/Buffs/weaponTag/offhand.png + ../Game/Buffs/weaponTag/shield.png + ../Game/Buffs/weaponTag/stamPenType_Staff.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 12,12,23,23 + scale9Paddings + 12,12,23,23 + scale9FromFile + + + ../Game/Bullets/ArcaneStrikeHit.png + ../Game/Bullets/AreaElectrify.png + ../Game/Bullets/ArrowFire.png + ../Game/Bullets/ArrowFireHit.png + ../Game/Bullets/BearTrapStrike.png + ../Game/Bullets/BearTrapStrikeHit.png + ../Game/Bullets/BigBoulder.png + ../Game/Bullets/BigBoulderHit.png + ../Game/Bullets/BladeDanceBullet.png + ../Game/Bullets/Bomb.png + ../Game/Bullets/BombHit.png + ../Game/Bullets/BombItem.png + ../Game/Bullets/BombItemHit.png + ../Game/Bullets/BoundByFate.png + ../Game/Bullets/BoundByFateHit.png + ../Game/Bullets/BubbleBurst.png + ../Game/Bullets/BubbleBurstHit.png + ../Game/Bullets/BubbleBurstLatex.png + ../Game/Bullets/BubbleBurstLatexHit.png + ../Game/Bullets/BubbleBurstSlime.png + ../Game/Bullets/BubbleBurstSlimeHit.png + ../Game/Bullets/C4Item.png + ../Game/Bullets/C4ItemHit.png + ../Game/Bullets/CrystalSlash.png + ../Game/Bullets/CrystalSlashHit.png + ../Game/Bullets/DarkShroud.png + ../Game/Bullets/DarkShroudHit.png + ../Game/Bullets/DragonFlowerSpores.png + ../Game/Bullets/DragonFlowerSporesHit.png + ../Game/Bullets/DynamiteItem.png + ../Game/Bullets/DynamiteItemHit.png + ../Game/Bullets/Earthfield.png + ../Game/Bullets/EarthfieldHit.png + ../Game/Bullets/Earthrune.png + ../Game/Bullets/EarthruneHit.png + ../Game/Bullets/EffectEnemyCM1H.png + ../Game/Bullets/EffectEnemyCM1Hit.png + ../Game/Bullets/EffectEnemyCM2.png + ../Game/Bullets/EffectEnemyCM2Hit.png + ../Game/Bullets/EffectEnemyCM3.png + ../Game/Bullets/EffectEnemyCM3Hit.png + ../Game/Bullets/EffectEnemyLock1H.png + ../Game/Bullets/EffectEnemyLock1Hit.png + ../Game/Bullets/EnemyFlash.png + ../Game/Bullets/EnemyFlashBomb.png + ../Game/Bullets/EnemyFlashBombHit.png + ../Game/Bullets/EnemyFlashHit.png + ../Game/Bullets/Entangle.png + ../Game/Bullets/EntangleHit.png + ../Game/Bullets/FeatherCloud.png + ../Game/Bullets/FeatherCloudHit.png + ../Game/Bullets/Feathers.png + ../Game/Bullets/FeathersHit.png + ../Game/Bullets/Fireball.png + ../Game/Bullets/FireballHit.png + ../Game/Bullets/Fireblast.png + ../Game/Bullets/FireblastHit.png + ../Game/Bullets/Firecracker.png + ../Game/Bullets/FirecrackerHit.png + ../Game/Bullets/FlameRuneStrike.png + ../Game/Bullets/FlameRuneStrikeHit.png + ../Game/Bullets/FlameStrike.png + ../Game/Bullets/FlameStrikeHit.png + ../Game/Bullets/Flash.png + ../Game/Bullets/FlashBomb.png + ../Game/Bullets/FlashBombHit.png + ../Game/Bullets/FlashHit.png + ../Game/Bullets/FlashbangHit.png + ../Game/Bullets/FreezeRuneStrike.png + ../Game/Bullets/FreezeRuneStrikeHit.png + ../Game/Bullets/Glue.png + ../Game/Bullets/GlueBomb.png + ../Game/Bullets/GlueBombHit.png + ../Game/Bullets/GravityPull.png + ../Game/Bullets/GravityPullEarth.png + ../Game/Bullets/GravityPullEarthHit.png + ../Game/Bullets/GravityPullHit.png + ../Game/Bullets/GreaterFlash.png + ../Game/Bullets/GreaterFlashHit.png + ../Game/Bullets/HeavySlash.png + ../Game/Bullets/HeavySlashHit.png + ../Game/Bullets/HexLatexExplosion.png + ../Game/Bullets/HexLatexExplosionHit.png + ../Game/Bullets/IceBreath.png + ../Game/Bullets/IceBreathChannel.png + ../Game/Bullets/IceBreathChannelHit.png + ../Game/Bullets/Icerune.png + ../Game/Bullets/IgnitionHit.png + ../Game/Bullets/Incinerate.png + ../Game/Bullets/IncinerateHit.png + ../Game/Bullets/KineticLanceHit.png + ../Game/Bullets/LiquidMetalBurst.png + ../Game/Bullets/LiquidMetalBurstHit.png + ../Game/Bullets/LustBomb.png + ../Game/Bullets/LustBombHit.png + ../Game/Bullets/MagicMissileChannel.png + ../Game/Bullets/MagicMissileChannelHit.png + ../Game/Bullets/MinerBomb.png + ../Game/Bullets/MinerBombHit.png + ../Game/Bullets/MirrorImage.png + ../Game/Bullets/OrbHealHit.png + ../Game/Bullets/PoisonBreath.png + ../Game/Bullets/PoisonBreathHit.png + ../Game/Bullets/Raincloud.png + ../Game/Bullets/RaincloudHit.png + ../Game/Bullets/RibbonBurst.png + ../Game/Bullets/RibbonBurstHit.png + ../Game/Bullets/Ring.png + ../Game/Bullets/RingHit.png + ../Game/Bullets/RopeEngulf.png + ../Game/Bullets/RopeEngulfHit.png + ../Game/Bullets/RopeEngulfWeak.png + ../Game/Bullets/RopeEngulfWeakHit.png + ../Game/Bullets/RopeRuneStrike.png + ../Game/Bullets/RopeRuneStrikeHit.png + ../Game/Bullets/RopeStrike.png + ../Game/Bullets/RopeStrikeHit.png + ../Game/Bullets/RubberMissileExplosionHit.png + ../Game/Bullets/RubberSlime.png + ../Game/Bullets/RuneTrap_Belt.png + ../Game/Bullets/RuneTrap_BeltHit.png + ../Game/Bullets/RuneTrap_Bubble.png + ../Game/Bullets/RuneTrap_BubbleHit.png + ../Game/Bullets/RuneTrap_Chain.png + ../Game/Bullets/RuneTrap_ChainHit.png + ../Game/Bullets/RuneTrap_Latex.png + ../Game/Bullets/RuneTrap_LatexBall.png + ../Game/Bullets/RuneTrap_LatexBallHit.png + ../Game/Bullets/RuneTrap_LatexHit.png + ../Game/Bullets/RuneTrap_LatexSphere.png + ../Game/Bullets/RuneTrap_LatexSphereHit.png + ../Game/Bullets/RuneTrap_Leather.png + ../Game/Bullets/RuneTrap_LeatherHit.png + ../Game/Bullets/RuneTrap_Ribbon.png + ../Game/Bullets/RuneTrap_RibbonHit.png + ../Game/Bullets/RuneTrap_Rope.png + ../Game/Bullets/RuneTrap_RopeHit.png + ../Game/Bullets/RuneTrap_Rubber.png + ../Game/Bullets/RuneTrap_RubberHit.png + ../Game/Bullets/RuneTrap_Slime.png + ../Game/Bullets/RuneTrap_SlimeBubble.png + ../Game/Bullets/RuneTrap_SlimeBubbleHit.png + ../Game/Bullets/RuneTrap_SlimeHit.png + ../Game/Bullets/RuneTrap_VacCube.png + ../Game/Bullets/RuneTrap_VacCubeHit.png + ../Game/Bullets/RuneTrap_Vine.png + ../Game/Bullets/RuneTrap_VineHit.png + ../Game/Bullets/SagittaHit.png + ../Game/Bullets/SarcoEngulf.png + ../Game/Bullets/SarcoEngulfHit.png + ../Game/Bullets/SarcoHex.png + ../Game/Bullets/SarcoHexHit.png + ../Game/Bullets/ShadowGrasp.png + ../Game/Bullets/ShadowGraspHit.png + ../Game/Bullets/ShadowScythe.png + ../Game/Bullets/ShadowScytheHit.png + ../Game/Bullets/ShadowShroud.png + ../Game/Bullets/ShadowShroudHit.png + ../Game/Bullets/ShadowSlash.png + ../Game/Bullets/ShadowSlashHit.png + ../Game/Bullets/Shatter.png + ../Game/Bullets/ShatterStrikeHit.png + ../Game/Bullets/Shroud.png + ../Game/Bullets/ShroudHit.png + ../Game/Bullets/SleepGas.png + ../Game/Bullets/SleepGasHit.png + ../Game/Bullets/Slime.png + ../Game/Bullets/SmokeBomb.png + ../Game/Bullets/SmokeBombHit.png + ../Game/Bullets/SoulCrystalBind.png + ../Game/Bullets/SoulCrystalBind_2.png + ../Game/Bullets/SpikeTrap.png + ../Game/Bullets/SpikeTrapHit.png + ../Game/Bullets/Spores.png + ../Game/Bullets/SporesHappy.png + ../Game/Bullets/SporesHappyHit.png + ../Game/Bullets/SporesHit.png + ../Game/Bullets/SporesSickHit.png + ../Game/Bullets/SporesSickHity.png + ../Game/Bullets/SummonCaptureDrones.png + ../Game/Bullets/SummonDrones.png + ../Game/Bullets/SummonSkeleton.png + ../Game/Bullets/SummonSkeletons.png + ../Game/Bullets/SummonZombies.png + ../Game/Bullets/Taunt.png + ../Game/Bullets/TauntHit.png + ../Game/Bullets/Thunderstorm.png + ../Game/Bullets/ThunderstormHit.png + ../Game/Bullets/TidalBall.png + ../Game/Bullets/TidalBallHit.png + ../Game/Bullets/TomeArcaneHit.png + ../Game/Bullets/TomeBondageHit.png + ../Game/Bullets/TrapCableWeak.png + ../Game/Bullets/TrapCableWeakHit.png + ../Game/Bullets/TrapCharmWeak.png + ../Game/Bullets/TrapCharmWeakHit.png + ../Game/Bullets/TrapCrystal.png + ../Game/Bullets/TrapCrystalHit.png + ../Game/Bullets/TrapLatex.png + ../Game/Bullets/TrapLatexBall.png + ../Game/Bullets/TrapLatexBallHit.png + ../Game/Bullets/TrapLatexBubble.png + ../Game/Bullets/TrapLatexBubbleHit.png + ../Game/Bullets/TrapLatexHit.png + ../Game/Bullets/TrapLeatherWeak.png + ../Game/Bullets/TrapLeatherWeakHit.png + ../Game/Bullets/TrapLustCloud.png + ../Game/Bullets/TrapLustCloudHit.png + ../Game/Bullets/TrapMagicChainsWeak.png + ../Game/Bullets/TrapMagicChainsWeakHit.png + ../Game/Bullets/TrapMummyWeak.png + ../Game/Bullets/TrapMummyWeakHit.png + ../Game/Bullets/TrapObsidian.png + ../Game/Bullets/TrapObsidianHit.png + ../Game/Bullets/TrapRibbons.png + ../Game/Bullets/TrapRibbonsHit.png + ../Game/Bullets/TrapRopeHoly.png + ../Game/Bullets/TrapRopeHolyHit.png + ../Game/Bullets/TrapRopeStrong.png + ../Game/Bullets/TrapRopeStrongHit.png + ../Game/Bullets/TrapRopeWeak.png + ../Game/Bullets/TrapRopeWeakHit.png + ../Game/Bullets/TrapSCloud.png + ../Game/Bullets/TrapSCloudHit.png + ../Game/Bullets/TrapShackleWeak.png + ../Game/Bullets/TrapShackleWeakHit.png + ../Game/Bullets/TrapSlimeWeak.png + ../Game/Bullets/TrapSlimeWeakHit.png + ../Game/Bullets/TremorHit.png + ../Game/Bullets/WardenCageDrop.png + ../Game/Bullets/WardenCageDropHit.png + ../Game/Bullets/WaterRune.png + ../Game/Bullets/WaterRuneHit.png + ../Game/Bullets/WitchElectricBurst.png + ../Game/Bullets/WitchElectricBurstHit.png + ../Game/Bullets/WitchSlime.png + ../Game/Bullets/ZoneOfExcitement.png + ../Game/Bullets/ZoneOfExcitementHit.png + ../Game/Bullets/ZoneOfPurity.png + ../Game/Bullets/ZoneOfPurityHit.png + ../Game/VisionNeg.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 54,54,108,108 + scale9Paddings + 54,54,108,108 + scale9FromFile + + + ../Game/Bullets/BigThunderstorm.png + ../Game/Bullets/BigThunderstormHit.png + ../Game/Bullets/CrushingFate.png + ../Game/Bullets/CrushingFateHit.png + ../Game/Bullets/CursingCircle.png + ../Game/Bullets/CursingCircle2.png + ../Game/Bullets/CursingCircle2Hit.png + ../Game/Bullets/CursingCircleHit.png + ../Game/Bullets/Earthquake.png + ../Game/Bullets/EarthquakeHit.png + ../Game/Bullets/ExplosiveBarrelHit.png + ../Game/Bullets/FocusedFlash.png + ../Game/Bullets/FocusedFlashHit.png + ../Game/Bullets/FreedomHit.png + ../Game/Bullets/Heal.png + ../Game/Bullets/HealHit.png + ../Game/Bullets/RubberNukeExplosionHit.png + ../Game/Bullets/Sleet.png + ../Game/Bullets/SleetHit.png + ../Game/Bullets/SlimeEruption.png + ../Game/Bullets/ThunderstormOld.png + ../Game/Bullets/VolcanicStrikeHit.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 90,90,180,180 + scale9Paddings + 90,90,180,180 + scale9FromFile + + + ../Game/Bullets/CrystalShockBolt.png + ../Game/Bullets/CrystalShockBoltHit.png + ../Game/Bullets/EnchantRope.png + ../Game/Bullets/EnemyEnchantRope.png + ../Game/Bullets/EnemyEnchantRope2.png + ../Game/Bullets/EnemyEnchantRope2Hit.png + ../Game/Bullets/EnemyEnchantRopeHit.png + ../Game/Bullets/FlashFreezeHit.png + ../Game/Bullets/Hailstorm.png + ../Game/Bullets/HailstormHit.png + ../Game/Bullets/Rainstorm.png + ../Game/Bullets/RainstormHit.png + ../Game/Bullets/TrapShadowLatex.png + ../Game/Bullets/TrapShadowLatexHit.png + ../Game/Bullets/ZoneOfFrost.png + ../Game/Bullets/ZoneOfFrostHit.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 53,53,106,106 + scale9Paddings + 53,53,106,106 + scale9FromFile + + + ../Game/Bullets/KineticLance.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 54,54,108,109 + scale9Paddings + 54,54,108,109 + scale9FromFile + + + ../Game/ChangeSpell.png + ../Game/UI/Expand.png + ../Game/UI/Labels.png + ../Game/UI/LabelsChest.png + ../Game/UI/LabelsOther.png + ../Game/UI/LabelsShrine.png + ../Game/UI/Shrink.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 10,10,19,19 + scale9Paddings + 10,10,19,19 + scale9FromFile + + + ../Game/Class/Fighter.png + ../Game/Class/Mage.png + ../Game/Class/Peasant.png + ../Game/Class/Rogue.png + ../Game/UI/Sleep.png + ../Game/UI/SleepVibe.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 18,15,35,30 + scale9Paddings + 18,15,35,30 + scale9FromFile + + + ../Game/Color.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 6,6,11,11 + scale9Paddings + 6,6,11,11 + scale9FromFile + + + ../Game/ColorPicker.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 76,75,151,150 + scale9Paddings + 76,75,151,150 + scale9FromFile + + + ../Game/Cut.png + ../Game/LockJam.png + ../Game/UI/AutoPass/Allies.png + ../Game/UI/AutoPass/HelplessAllies.png + ../Game/UI/AutoPass/HelplessEnemies.png + ../Game/UI/AutoPass/Neutral.png + ../Game/UI/AutoPass/Shop.png + ../Game/UI/AutoPass/Special.png + ../Game/UI/AutoPass/Summons.png + ../Game/UI/AutoPath/StepDuringCombat.png + ../Game/UI/AutoPath/SuppressBeforeCombat.png + ../Game/UI/AutoPath/SuppressDuringCombat.png + ../Game/UI/AutoStruggle.png + ../Game/UI/AutoWait/Fast.png + ../Game/UI/AutoWait/Normal.png + ../Game/UI/AutoWait/Slow.png + ../Game/UI/AutoWait/VeryFast.png + ../Game/UI/Checked.png + ../Game/UI/CrouchOff.png + ../Game/UI/CrouchOn.png + ../Game/UI/Door.png + ../Game/UI/DoorClose.png + ../Game/UI/Edged.png + ../Game/UI/Help.png + ../Game/UI/HelpGag.png + ../Game/UI/Inspect.png + ../Game/UI/Interact.png + ../Game/UI/LetGo.png + ../Game/UI/Log/Action.png + ../Game/UI/Log/Ambient.png + ../Game/UI/Log/Combat.png + ../Game/UI/Log/Dialogue.png + ../Game/UI/Log/Items.png + ../Game/UI/Log/Kills.png + ../Game/UI/Log/Self.png + ../Game/UI/Log/Struggle.png + ../Game/UI/NoPass.png + ../Game/UI/NoSprint.png + ../Game/UI/Pass.png + ../Game/UI/Play.png + ../Game/UI/Sprint.png + ../Game/UI/Status.png + ../Game/UI/Wait.png + ../Game/UI/WaitJail.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 15,15,30,30 + scale9Paddings + 15,15,30,30 + scale9FromFile + + + ../Game/DialogBackground.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 250,250,500,500 + scale9Paddings + 250,250,500,500 + scale9FromFile + + + ../Game/Down.png + ../Game/Up.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 22,9,43,18 + scale9Paddings + 22,9,43,18 + scale9FromFile + + + ../Game/GFX/Talisman.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 128,36,256,72 + scale9Paddings + 128,36,256,72 + scale9FromFile + + + ../Game/GameLogo.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 128,92,256,184 + scale9Paddings + 128,92,256,184 + scale9FromFile + + + ../Game/InvDrop.png + ../Game/InvFilter.png + ../Game/InvHide.png + ../Game/InvSort.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 29,14,58,28 + scale9Paddings + 29,14,58,28 + scale9FromFile + + + ../Game/InvHidden.png + ../Game/InvItemDrop.png + ../Game/InvItemSort.png + ../Game/InvItemSortLeft.png + ../Game/InvItemSortRight.png + ../Game/InvVisible.png + ../Game/UI/Crossout.png + ../Game/UI/Demote.png + ../Game/UI/Dress.png + ../Game/UI/Facility_Prisoners.png + ../Game/UI/Facility_Servants.png + ../Game/UI/Facility_X.png + ../Game/UI/Imprison.png + ../Game/UI/Promote.png + ../Game/UI/Rename.png + ../Game/UI/Restrain.png + ../Game/UI/RestrainBack.png + ../Game/UI/RestrainFree.png + ../Game/UI/Tighten.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 19,19,38,38 + scale9Paddings + 19,19,38,38 + scale9FromFile + + + ../Game/Items/Cookie.png + ../Game/Items/CookieJailer.png + ../Game/Items/Donut.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 8,8,16,16 + scale9Paddings + 8,8,16,16 + scale9FromFile + + + ../Game/Items/Restraint/ArmbinderHarness.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 179,179,359,359 + scale9Paddings + 179,179,359,359 + scale9FromFile + + + ../Game/Items/Restraint/BindingDress.png + ../Game/Items/Restraint/BitGagHarness.png + ../Game/Items/Restraint/Bracers.png + ../Game/Items/Restraint/Breastplate.png + ../Game/Items/Restraint/Bustier.png + ../Game/Items/Restraint/ChainBikini.png + ../Game/Items/Restraint/ChainTunic.png + ../Game/Items/Restraint/ChastityBras.png + ../Game/Items/Restraint/ClothGag.png + ../Game/Items/Restraint/ClothGagOver.png + ../Game/Items/Restraint/CyberLink.png + ../Game/Items/Restraint/EssenceNecklace.png + ../Game/Items/Restraint/Gauntlets.png + ../Game/Items/Restraint/Handcuffs.png + ../Game/Items/Restraint/HingedCuffs.png + ../Game/Items/Restraint/Irish8Cuffs.png + ../Game/Items/Restraint/LatexOTNGag.png + ../Game/Items/Restraint/LeatherBoots.png + ../Game/Items/Restraint/LeatherGloves.png + ../Game/Items/Restraint/Legirons.png + ../Game/Items/Restraint/MagicArmbands.png + ../Game/Items/Restraint/Maid.png + ../Game/Items/Restraint/Mittens.png + ../Game/Items/Restraint/RedLatexOTNGag.png + ../Game/Items/Restraint/SarielPanties.png + ../Game/Items/Restraint/ScarfGag.png + ../Game/Items/Restraint/SteelArmor.png + ../Game/Items/Restraint/SteelBoots.png + ../Game/Items/Restraint/SteelSkirt.png + ../Game/Items/Restraint/Stuffing.png + ../Game/Items/Restraint/Sunglasses.png + ../Game/Items/Restraint/Sunglasses2.png + ../Game/Items/Restraint/Swimsuit.png + ../Game/Items/Restraint/Thumbcuffs.png + ../Game/Items/Restraint/WiredVibe.png + ../Game/Items/Restraint/WolfCuffs.png + ../Game/Items/Sunglasses.png + ../Game/Outfits/BlueSuit.png + ../Game/Outfits/Bountyhunter.png + ../Game/Outfits/Default.png + ../Game/Outfits/Dragon.png + ../Game/Outfits/Elven.png + ../Game/Outfits/JailUniform.png + ../Game/Outfits/Maid.png + ../Game/Outfits/OutfitDefault.png + ../Game/Outfits/Wolfgirl.png + ../Game/ShopBasic/BlueSuit.png + ../Game/ShopBasic/Bountyhunter.png + ../Game/ShopBasic/Default.png + ../Game/ShopBasic/Dragon.png + ../Game/ShopBasic/Elven.png + ../Game/ShopBasic/JailUniform.png + ../Game/ShopBasic/Maid.png + ../Game/ShopBasic/MaidUniform.png + ../Game/ShopBasic/OutfitDefault.png + ../Game/ShopBasic/Wolfgirl.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 50,50,100,100 + scale9Paddings + 50,50,100,100 + scale9FromFile + + + ../Game/Items/Restraint/Catsuits.png + ../Game/Items/Restraint/Collars.png + ../Game/Items/Restraint/Corsets.png + ../Game/Items/Restraint/FlatGags.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 61,61,122,122 + scale9Paddings + 61,61,122,122 + scale9FromFile + + + ../Game/Items/Restraint/Cuffs.png + ../Game/Items/Restraint/Metal.png + ../Game/UI/Recycler/Metal.png + ../Game/UI/Recycler/Metal2.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 18,18,37,36 + scale9Paddings + 18,18,37,36 + scale9FromFile + + + ../Game/Items/Restraint/Cyber.png + ../Game/Items/Restraint/Modules.png + ../Game/Items/Restraint/Posture.png + ../Game/UI/Recycler/Cyber.png + ../Game/UI/Recycler/Dress.png + ../Game/UI/Recycler/Module.png + ../Game/UI/Recycler/Toys.png + ../Game/UI/Recycler/Wolf.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 24,24,47,47 + scale9Paddings + 24,24,47,47 + scale9FromFile + + + ../Game/Items/Restraint/CyberMittens.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 34,36,67,72 + scale9Paddings + 34,36,67,72 + scale9FromFile + + + ../Game/Items/Restraint/DivineBelt.png + ../Game/Items/Restraint/DivineBelt2.png + ../Game/Items/Restraint/DivineBra.png + ../Game/Items/Restraint/DivineBra2.png + ../Game/Items/Restraint/HighCollars.png + ../Game/ShopBasic/PotionCollar.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 78,78,155,155 + scale9Paddings + 78,78,155,155 + scale9FromFile + + + ../Game/Items/Restraint/ElvenPanties.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 174,174,349,349 + scale9Paddings + 174,174,349,349 + scale9FromFile + + + ../Game/Items/Restraint/NippleClamps.png + ../Game/Items/Restraint/NippleClamps2.png + ../Game/Items/Restraint/NippleClamps3.png + ../Game/Items/Restraint/NippleWeights.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 30,30,60,60 + scale9Paddings + 30,30,60,60 + scale9FromFile + + + ../Game/Items/Restraint/Petsuits.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 375,438,750,875 + scale9Paddings + 375,438,750,875 + scale9FromFile + + + ../Game/Items/Restraint/ReversePrayer.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 250,300,500,600 + scale9Paddings + 250,300,500,600 + scale9FromFile + + + ../Game/Items/Restraint/RobeOfChastity.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 63,63,125,125 + scale9Paddings + 63,63,125,125 + scale9FromFile + + + ../Game/Layers.png + ../Game/UI/Floppy.png + ../Game/UI/Load.png + ../Game/UI/Reset.png + ../Game/UI/Restore.png + ../Game/UI/Safe.png + ../Game/UI/SetPalette.png + ../Game/UI/UsePotionAncient.png + ../Game/UI/UsePotionFrigid.png + ../Game/UI/UsePotionInject.png + ../Game/UI/UsePotionMana.png + ../Game/UI/UsePotionStamina.png + ../Game/UI/UsePotionUnavailable.png + ../Game/UI/UsePotionWill.png + ../Game/UI/savedColor_copy.png + ../Game/UI/savedColor_paste.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 11,11,22,22 + scale9Paddings + 11,11,22,22 + scale9FromFile + + + ../Game/Light.png + ../Game/Lighting.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 81,81,162,162 + scale9Paddings + 81,81,162,162 + scale9FromFile + + + ../Game/MagicBook.png + ../Game/MagicBookNew.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 160,121,320,241 + scale9Paddings + 160,121,320,241 + scale9FromFile + + + ../Game/Particles/Heart.png + ../Game/UI/Heart.png + ../Game/UI/HeartExtreme.png + ../Game/UI/RallyWill.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 4,4,7,7 + scale9Paddings + 4,4,7,7 + scale9FromFile + + + ../Game/Particles/HeartPink.png + ../Game/Particles/HeartPurple.png + ../Game/Particles/VibeHeart.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 5,5,10,10 + scale9Paddings + 5,5,10,10 + scale9FromFile + + + ../Game/Particles/PinkGlow.png + ../Game/Particles/SealSigil.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 64,64,128,128 + scale9Paddings + 64,64,128,128 + scale9FromFile + + + ../Game/Particles/Shockwave.png + ../Game/Particles/ShockwaveDesire.png + ../Game/Particles/ShockwaveEnemy.png + ../Game/Particles/ShockwaveShield.png + ../Game/Particles/Slash.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 128,128,256,256 + scale9Paddings + 128,128,256,256 + scale9FromFile + + + ../Game/Particles/mmm.png + ../Game/Particles/nnn.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 13,13,25,25 + scale9Paddings + 13,13,25,25 + scale9FromFile + + + ../Game/Poses/BlushExtreme.png + ../Game/Poses/BlushHigh.png + ../Game/Poses/BlushLow.png + ../Game/Poses/BlushMedium.png + ../Game/Poses/BlushNeutral.png + ../Game/Poses/Boxtie.png + ../Game/Poses/Brows2Angry.png + ../Game/Poses/Brows2Annoyed.png + ../Game/Poses/Brows2Neutral.png + ../Game/Poses/Brows2Sad.png + ../Game/Poses/Brows2Surprised.png + ../Game/Poses/BrowsAngry.png + ../Game/Poses/BrowsAnnoyed.png + ../Game/Poses/BrowsNeutral.png + ../Game/Poses/BrowsSad.png + ../Game/Poses/BrowsSurprised.png + ../Game/Poses/Closed.png + ../Game/Poses/Crossed.png + ../Game/Poses/Eyes2Angry.png + ../Game/Poses/Eyes2Closed.png + ../Game/Poses/Eyes2Dazed.png + ../Game/Poses/Eyes2Heart.png + ../Game/Poses/Eyes2Neutral.png + ../Game/Poses/Eyes2Sly.png + ../Game/Poses/Eyes2Surprised.png + ../Game/Poses/EyesAngry.png + ../Game/Poses/EyesClosed.png + ../Game/Poses/EyesDazed.png + ../Game/Poses/EyesHeart.png + ../Game/Poses/EyesNeutral.png + ../Game/Poses/EyesSly.png + ../Game/Poses/EyesSurprised.png + ../Game/Poses/FearPose.png + ../Game/Poses/Free.png + ../Game/Poses/Front.png + ../Game/Poses/Hogtie.png + ../Game/Poses/Kneel.png + ../Game/Poses/KneelClosed.png + ../Game/Poses/MouthDazed.png + ../Game/Poses/MouthDistracted.png + ../Game/Poses/MouthEmbarrassed.png + ../Game/Poses/MouthFrown.png + ../Game/Poses/MouthNeutral.png + ../Game/Poses/MouthPout.png + ../Game/Poses/MouthSmile.png + ../Game/Poses/MouthSurprised.png + ../Game/Poses/NoFearPose.png + ../Game/Poses/Spread.png + ../Game/Poses/Up.png + ../Game/Poses/Wristtie.png + ../Game/Poses/Yoked.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 12,11,23,23 + scale9Paddings + 12,11,23,23 + scale9FromFile + + + ../Game/Ranged.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 13,22,25,43 + scale9Paddings + 13,22,25,43 + scale9FromFile + + + ../Game/SimpleLogo.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 175,75,350,150 + scale9Paddings + 175,75,350,150 + scale9FromFile + + + ../Game/Spell1.png + ../Game/Spell2.png + ../Game/Spell3.png + ../Game/Spell4.png + ../Game/Spell5.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 22,14,43,28 + scale9Paddings + 22,14,43,28 + scale9FromFile + + + ../Game/SprintWarning.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 36,5,73,10 + scale9Paddings + 36,5,73,10 + scale9FromFile + + + ../Game/UI/Aim.png + ../Game/UI/BoxSmall.png + ../Game/UI/GrabClosed.png + ../Game/UI/GrabOpen.png + ../Game/UI/MiniMap/Bars.png + ../Game/UI/MiniMap/Bed.png + ../Game/UI/MiniMap/ChargerCrystal.png + ../Game/UI/MiniMap/ChargerEmpty.png + ../Game/UI/MiniMap/Chest.png + ../Game/UI/MiniMap/DoorClosed.png + ../Game/UI/MiniMap/DoorOpen.png + ../Game/UI/MiniMap/Ghost.png + ../Game/UI/MiniMap/Grate.png + ../Game/UI/MiniMap/Key.png + ../Game/UI/MiniMap/Orb.png + ../Game/UI/MiniMap/Shrine.png + ../Game/UI/MiniMap/ShrineMana.png + ../Game/UI/MiniMap/ShrineManaQuest.png + ../Game/UI/MiniMap/ShrineQuest.png + ../Game/UI/MiniMap/Stairs.png + ../Game/UI/MiniMap/StairsDown.png + ../Game/UI/MiniMap/Tablet.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 6,6,12,12 + scale9Paddings + 6,6,12,12 + scale9FromFile + + + ../Game/UI/BoxLarge.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 11,11,21,21 + scale9Paddings + 11,11,21,21 + scale9FromFile + + + ../Game/UI/BoxTiny.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 2,2,3,3 + scale9Paddings + 2,2,3,3 + scale9FromFile + + + ../Game/UI/Buttons/Mark.png + ../Game/UI/Buttons/MarkAll.png + ../Game/UI/Buttons/Ransom.png + ../Game/UI/Buttons/Release.png + ../Game/UI/Buttons/RemoveGuest.png + ../Game/UI/Buttons/RemoveGuestConfirm.png + ../Game/UI/Buttons/Summon.png + ../Game/UI/Buttons/Unmark.png + ../Game/UI/Buttons/UnmarkAll.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 20,20,40,40 + scale9Paddings + 20,20,40,40 + scale9FromFile + + + ../Game/UI/CheckSmall.png + ../Game/UI/Plus.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 8,8,15,15 + scale9Paddings + 8,8,15,15 + scale9FromFile + + + ../Game/UI/Conjured.png + ../Game/UI/Hands.png + ../Game/UI/accuracy.png + ../Game/UI/escaped.png + ../Game/UI/escapegrace.png + ../Game/UI/evasion.png + ../Game/UI/jail.png + ../Game/UI/key.png + ../Game/UI/miscast.png + ../Game/UI/restraint_key.png + ../Game/UI/restraint_key_2.png + ../Game/UI/restraint_nokey.png + ../Game/UI/speed.png + ../Game/UI/vision.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 9,9,18,18 + scale9Paddings + 9,9,18,18 + scale9FromFile + + + ../Game/UI/Disperse.png + ../Game/UI/Move.png + ../Game/UI/Recall.png + ../Game/UI/Select.png + ../Game/UI/X.png + ../Game/UI/Xgold.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 9,8,17,17 + scale9Paddings + 9,8,17,17 + scale9FromFile + + + ../Game/UI/Exit.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 22,22,43,43 + scale9Paddings + 22,22,43,43 + scale9FromFile + + + ../Game/UI/LogDown.png + ../Game/UI/LogUp.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 10,10,21,21 + scale9Paddings + 10,10,21,21 + scale9FromFile + + + ../Game/UI/Revert.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 12,12,24,24 + scale9Paddings + 12,12,24,24 + scale9FromFile + + + ../Game/UI/SideRoom/BanditFort.png + ../Game/UI/SideRoom/Caldera.png + ../Game/UI/SideRoom/DemonTransition.png + ../Game/UI/SideRoom/ElevatorEgyptian.png + ../Game/UI/SideRoom/ElevatorEgyptian2.png + ../Game/UI/SideRoom/ElevatorRoom.png + ../Game/UI/SideRoom/GoldVault.png + ../Game/UI/SideRoom/Unknown.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 4,4,8,8 + scale9Paddings + 4,4,8,8 + scale9FromFile + + + ../Game/UI/Star.png + ../Game/UI/StarOff.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 7,7,14,14 + scale9Paddings + 7,7,14,14 + scale9FromFile + + + ../Game/UI/Tick.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 5,10,9,21 + scale9Paddings + 5,10,9,21 + scale9FromFile + + + ../Game/UI/TickPerk.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 4,9,7,17 + scale9Paddings + 4,9,7,17 + scale9FromFile + + + ../Game/UI/Wrench.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 7,7,13,13 + scale9Paddings + 7,7,13,13 + scale9FromFile + + + ../Game/UI/ZoomIn.png + ../Game/UI/ZoomOut.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 9,9,19,18 + scale9Paddings + 9,9,19,18 + scale9FromFile + + + ../Game/UI/button_game.png + ../Game/UI/button_logbook.png + ../Game/UI/button_menu.png + ../Game/UI/button_reputation.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 11,14,21,28 + scale9Paddings + 11,14,21,28 + scale9FromFile + + + ../Game/UI/button_inventory.png + ../Game/UI/button_spells.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 13,14,25,28 + scale9Paddings + 13,14,25,28 + scale9FromFile + + + ../Game/UI/circleborder.png + ../Game/UI/clouduploadicon.png + ../Game/UI/greyColor.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 16,16,32,32 + scale9Paddings + 16,16,32,32 + scale9FromFile + + + ../Game/WarningHighlight.png + ../Game/WarningHighlightBasic.png + ../Game/WarningHighlightSpecial.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 19,19,37,37 + scale9Paddings + 19,19,37,37 + scale9FromFile + + + + fileLists + + default + + files + + ../Game + + + + ignoreFileList + + replaceList + + ignoredWarnings + + commonDivisorX + 1 + commonDivisorY + 1 + packNormalMaps + + autodetectNormalMaps + + normalMapFilter + + normalMapSuffix + + normalMapSheetFileName + + exporterProperties + + + diff --git a/TextureAtlas/TextureAtlas.tps b/TextureAtlas/TextureAtlas.tps new file mode 100644 index 000000000..bf25d2111 --- /dev/null +++ b/TextureAtlas/TextureAtlas.tps @@ -0,0 +1,5837 @@ + + + + fileFormatVersion + 6 + texturePackerVersion + 7.1.0 + autoSDSettings + + + scale + 1 + extension + + spriteFilter + + acceptFractionalValues + + maxTextureSize + + width + -1 + height + -1 + + + + allowRotation + + shapeDebug + + dpi + 72 + dataFormat + pixijs4 + textureFileName + + flipPVR + + pvrQualityLevel + 3 + astcQualityLevel + 2 + basisUniversalQualityLevel + 2 + etc1QualityLevel + 70 + etc2QualityLevel + 70 + dxtCompressionMode + DXT_PERCEPTUAL + ditherType + NearestNeighbour + backgroundColor + 0 + libGdx + + filtering + + x + Linear + y + Linear + + + shapePadding + 2 + jpgQuality + 80 + pngOptimizationLevel + 1 + webpQualityLevel + 101 + textureSubPath + + textureFormat + webp + borderPadding + 2 + maxTextureSize + + width + 2048 + height + 2048 + + fixedTextureSize + + width + -1 + height + -1 + + algorithmSettings + + algorithm + MaxRects + freeSizeMode + Fast + sizeConstraints + AnySize + forceSquared + + maxRects + + heuristic + Best + + basic + + sortBy + Best + order + Ascending + + polygon + + alignToGrid + 1 + + + dataFileNames + + data + + name + atlas{n}.json + + + multiPackMode + MultiPackAuto + forceIdenticalLayout + + outputFormat + RGBA8888 + alphaHandling + ReduceBorderArtifacts + contentProtection + + key + + + autoAliasEnabled + + trimSpriteNames + + prependSmartFolderName + + autodetectAnimations + + globalSpriteSettings + + scale + 0.5 + scaleMode + Fast + extrude + 1 + trimThreshold + 1 + trimMargin + 1 + trimMode + Trim + tracerTolerance + 200 + heuristicMask + + defaultPivotPoint + 0,0 + writePivotPoints + + + individualSpriteSettings + + ../Models/Armbinder/BinderLeftBoxtie.png + ../Models/Armbinder/BinderLeftWristtie.png + ../Models/Armbinder/BinderRightBoxtie.png + ../Models/Armbinder/CrossBoxtie.png + ../Models/Armbinder/CrossWristtie.png + ../Models/Armbinder/GwenBoxtie.png + ../Models/Armbinder/GwenWristtie.png + ../Models/Armbinder/SecureBoxtie.png + ../Models/Armbinder/SecureWristtie.png + ../Models/Armbinder/StrapsLeftBoxtie.png + ../Models/Armbinder/StrapsLeftWristtie.png + ../Models/Armbinder/StrapsRightBoxtie.png + ../Models/Armbinder/StrapsRightWristtie.png + ../Models/Armbinder/WolfHarness.png + ../Models/ArmorChain/Panties.png + ../Models/ArmorChain/PantiesChain.png + ../Models/ArmorChain/PantiesChainClosed.png + ../Models/ArmorChain/PantiesChainKneel.png + ../Models/ArmorChain/PantiesClosed.png + ../Models/ArmorChain/PantiesKneel.png + ../Models/ArmorChain/Shirt.png + ../Models/ArmorChain/ShirtChest.png + ../Models/ArmorChain/ShirtChestFree.png + ../Models/ArmorChain/ShirtChestHogtie.png + ../Models/ArmorChain/ShirtChestUp.png + ../Models/ArmorChain/ShirtHogtie.png + ../Models/ArmorChain/ShirtUp.png + ../Models/ArmorChain/Skirt.png + ../Models/ArmorChain/Skirt2.png + ../Models/ArmorChain/Skirt2CrotchStrap.png + ../Models/ArmorChain/Skirt2Hogtie.png + ../Models/ArmorChain/Skirt2HogtieCrotchStrap.png + ../Models/ArmorChain/Skirt2Kneel.png + ../Models/ArmorChain/Skirt2KneelCrotchStrap.png + ../Models/ArmorChain/SkirtBelt.png + ../Models/ArmorChain/SkirtBeltDeco.png + ../Models/ArmorChain/SkirtBeltDecoKneel.png + ../Models/ArmorChain/SkirtBeltKneel.png + ../Models/ArmorChain/SkirtBeltRivets.png + ../Models/ArmorChain/SkirtBeltRivetsKneel.png + ../Models/ArmorChain/SkirtCrotchStrap.png + ../Models/ArmorChain/SkirtHogtie.png + ../Models/ArmorChain/SkirtHogtieCrotchStrap.png + ../Models/ArmorChain/SkirtKneel.png + ../Models/ArmorChain/SkirtKneelCrotchStrap.png + ../Models/ArmorPlate/BootLeftClosed.png + ../Models/ArmorPlate/BootLeftHogtie.png + ../Models/ArmorPlate/BootLeftKneel.png + ../Models/ArmorPlate/BootLeftKneelClosed.png + ../Models/ArmorPlate/BootLeftSpread.png + ../Models/ArmorPlate/BootRightClosed.png + ../Models/ArmorPlate/BootRightKneel.png + ../Models/ArmorPlate/BootRightSpread.png + ../Models/ArmorPlate/Breastplate.png + ../Models/ArmorPlate/BreastplateHogtie.png + ../Models/ArmorPlate/FootBootLeftHogtie.png + ../Models/ArmorPlate/GauntletLeftCrossed.png + ../Models/ArmorPlate/GauntletLeftFree.png + ../Models/ArmorPlate/GauntletLeftFront.png + ../Models/ArmorPlate/GauntletLeftYoked.png + ../Models/ArmorPlate/GauntletRightBoxtie.png + ../Models/ArmorPlate/GauntletRightCrossed.png + ../Models/ArmorPlate/GauntletRightFree.png + ../Models/ArmorPlate/GauntletRightFront.png + ../Models/ArmorPlate/GauntletRightYoked.png + ../Models/ArmorPlate/PauldronsFree.png + ../Models/ArmorPlate/PauldronsHogtie.png + ../Models/ArmorPlate/PauldronsYoked.png + ../Models/Bandit/Breastplate.png + ../Models/Bandit/BreastplateHogtie.png + ../Models/Bandit/Choker.png + ../Models/Bandit/ChokerHogtie.png + ../Models/Bandit/KneeClosed.png + ../Models/Bandit/KneeKneel.png + ../Models/Bandit/KneeSpread.png + ../Models/Bandit/PouchClosed.png + ../Models/Bandit/PouchKneel.png + ../Models/Bandit/PouchSpread.png + ../Models/Bandit/ShoeLeftClosed.png + ../Models/Bandit/ShoeLeftHogtie.png + ../Models/Bandit/ShoeLeftKneel.png + ../Models/Bandit/ShoeLeftKneelClosed.png + ../Models/Bandit/ShoeLeftSpread.png + ../Models/Bandit/ShoeRightClosed.png + ../Models/Bandit/ShoeRightKneel.png + ../Models/Bandit/ShoeRightSpread.png + ../Models/Bandit/ShortsClosed.png + ../Models/Bandit/ShortsKneel.png + ../Models/Bandit/ShortsKneelClosed.png + ../Models/Bandit/ShortsLeftClosed.png + ../Models/Bandit/ShortsLeftKneel.png + ../Models/Bandit/ShortsLeftKneelClosed.png + ../Models/Bandit/ShortsLeftSpread.png + ../Models/Bandit/ShortsSpread.png + ../Models/Bandit/ShoulderPad.png + ../Models/Bandit/ShoulderPadHogtie.png + ../Models/Bandit/WristLeftFree.png + ../Models/Bandit/WristLeftFront.png + ../Models/Bandit/WristLeftYoked.png + ../Models/Bandit/WristRightFree.png + ../Models/Bandit/WristRightFront.png + ../Models/Bandit/WristRightYoked.png + ../Models/Belts/Arms1.png + ../Models/Belts/Arms2.png + ../Models/Belts/Belt.png + ../Models/Belts/Feet1Closed.png + ../Models/Belts/Feet1Kneel.png + ../Models/Belts/Feet1KneelClosed.png + ../Models/Belts/Feet2Closed.png + ../Models/Belts/Feet2Kneel.png + ../Models/Belts/Feet2KneelClosed.png + ../Models/Belts/LeftArm1Boxtie.png + ../Models/Belts/LeftArm1Wristtie.png + ../Models/Belts/LeftArm2Boxtie.png + ../Models/Belts/LeftArm2Wristtie.png + ../Models/Belts/Legs1Closed.png + ../Models/Belts/Legs1Kneel.png + ../Models/Belts/Legs1KneelClosed.png + ../Models/Belts/Legs2Closed.png + ../Models/Belts/Legs2Kneel.png + ../Models/Belts/Legs2KneelClosed.png + ../Models/Belts/RightArm1Boxtie.png + ../Models/Belts/RightArm1Wristtie.png + ../Models/Belts/RightArm2Boxtie.png + ../Models/Belts/RightLegs1Kneel.png + ../Models/Belts/RightLegs1KneelClosed.png + ../Models/Belts/RightLegs2Kneel.png + ../Models/Belts/RightLegs2KneelClosed.png + ../Models/Blindfold/KittyEyes.png + ../Models/Blindfold/LeatherBase.png + ../Models/Blindfold/LeatherRim.png + ../Models/Body/ArmLeftBoxtie.png + ../Models/Body/ArmLeftCrossed.png + ../Models/Body/ArmLeftFree.png + ../Models/Body/ArmLeftFront.png + ../Models/Body/ArmLeftUp.png + ../Models/Body/ArmLeftWristtie.png + ../Models/Body/ArmLeftYoked.png + ../Models/Body/ArmRightBoxtie.png + ../Models/Body/ArmRightCrossed.png + ../Models/Body/ArmRightFree.png + ../Models/Body/ArmRightFront.png + ../Models/Body/ArmRightUp.png + ../Models/Body/ArmRightWristtie.png + ../Models/Body/ArmRightYoked.png + ../Models/Body/ButtKneel.png + ../Models/Body/CalfLeftHogtie.png + ../Models/Body/Chest.png + ../Models/Body/Eyes.png + ../Models/Body/FootLeftHogtie.png + ../Models/Body/FootRightHogtie.png + ../Models/Body/FootRightKneel.png + ../Models/Body/ForeArmLeftCrossed.png + ../Models/Body/ForeArmLeftFront.png + ../Models/Body/ForeArmRightCrossed.png + ../Models/Body/ForeArmRightFront.png + ../Models/Body/HandLeftFree.png + ../Models/Body/HandLeftFront.png + ../Models/Body/HandLeftYoked.png + ../Models/Body/HandRightBoxtie.png + ../Models/Body/HandRightFree.png + ../Models/Body/HandRightFront.png + ../Models/Body/HandRightYoked.png + ../Models/Body/Head.png + ../Models/Body/HeadBigGag.png + ../Models/Body/HeadGag.png + ../Models/Body/HeadNoEar.png + ../Models/Body/HeadNoEarBigGag.png + ../Models/Body/HeadNoEarGag.png + ../Models/Body/LegLeftClosed.png + ../Models/Body/LegLeftHogtie.png + ../Models/Body/LegLeftKneel.png + ../Models/Body/LegLeftKneelClosed.png + ../Models/Body/LegLeftSpread.png + ../Models/Body/LegRightClosed.png + ../Models/Body/LegRightHogtie.png + ../Models/Body/LegRightKneel.png + ../Models/Body/LegRightKneelClosed.png + ../Models/Body/LegRightSpread.png + ../Models/Body/Nipples.png + ../Models/Body/ShoulderLeftUp.png + ../Models/Body/ShoulderRightUp.png + ../Models/Body/Torso.png + ../Models/Body/TorsoChastity.png + ../Models/Body/TorsoClosed.png + ../Models/Body/TorsoClosedChastity.png + ../Models/Body/TorsoSpread.png + ../Models/Body/TorsoSpreadChastity.png + ../Models/Bra/Bra.png + ../Models/Bra/BraRim.png + ../Models/Bra/BraUnder.png + ../Models/Bra/BraUnderRim.png + ../Models/Bra/Cherry.png + ../Models/Bra/InnerLines.png + ../Models/Bra/InvertedRose.png + ../Models/Bra/Rose.png + ../Models/Bra/Straps.png + ../Models/Bra/StrapsTied.png + ../Models/Bra/StrapsUp.png + ../Models/Bra/Stripes.png + ../Models/Bubble/Arms.png + ../Models/Bubble/BallSuit.png + ../Models/Bubble/BallSuitSeam.png + ../Models/Bubble/Bubble.png + ../Models/Bubble/BubbleSquishy.png + ../Models/Bubble/BubbleSquishyBack.png + ../Models/Bubble/Collar.png + ../Models/Bubble/CuffsArms.png + ../Models/Bubble/Head.png + ../Models/Bubble/LatexSphere.png + ../Models/Bubble/LatexSphereCutaway.png + ../Models/Bubble/LatexSphereCutawayBack.png + ../Models/Bubble/Legs.png + ../Models/Bunny/Ears.png + ../Models/Bunny/EarsFront.png + ../Models/Bunny/EarsInner.png + ../Models/Bunny/FootSockLeftHogtie.png + ../Models/Bunny/FootSockRightKneel.png + ../Models/Bunny/ForeGloveLeftCrossed.png + ../Models/Bunny/ForeGloveLeftFront.png + ../Models/Bunny/ForeGloveRightCrossed.png + ../Models/Bunny/ForeGloveRightFront.png + ../Models/Bunny/GloveLeftBoxtie.png + ../Models/Bunny/GloveLeftCrossed.png + ../Models/Bunny/GloveLeftFree.png + ../Models/Bunny/GloveLeftFront.png + ../Models/Bunny/GloveLeftUp.png + ../Models/Bunny/GloveLeftWristtie.png + ../Models/Bunny/GloveLeftYoked.png + ../Models/Bunny/GloveRightBoxtie.png + ../Models/Bunny/GloveRightCrossed.png + ../Models/Bunny/GloveRightFree.png + ../Models/Bunny/GloveRightFront.png + ../Models/Bunny/GloveRightUp.png + ../Models/Bunny/GloveRightWristtie.png + ../Models/Bunny/GloveRightYoked.png + ../Models/Bunny/HighLeotard.png + ../Models/Bunny/HighLeotardClosed.png + ../Models/Bunny/HighLeotardKneel.png + ../Models/Bunny/LegSockLeftClosed.png + ../Models/Bunny/LegSockLeftHogtie.png + ../Models/Bunny/LegSockLeftSpread.png + ../Models/Bunny/LegSockRightClosed.png + ../Models/Bunny/LegSockRightHogtie.png + ../Models/Bunny/LegSockRightSpread.png + ../Models/Bunny/Leotard.png + ../Models/Bunny/LeotardChest.png + ../Models/Bunny/LeotardClosed.png + ../Models/Bunny/LeotardKneel.png + ../Models/Bunny/SockLeftClosed.png + ../Models/Bunny/SockLeftHogtie.png + ../Models/Bunny/SockLeftKneel.png + ../Models/Bunny/SockLeftKneelClosed.png + ../Models/Bunny/SockLeftSpread.png + ../Models/Bunny/SockRightClosed.png + ../Models/Bunny/SockRightHogtie.png + ../Models/Bunny/SockRightKneel.png + ../Models/Bunny/SockRightKneelClosed.png + ../Models/Bunny/SockRightSpread.png + ../Models/Cape/CapeHogtie.png + ../Models/Cape/CapeKneel.png + ../Models/Cape/CapeSpread.png + ../Models/Cape/CapeYoked.png + ../Models/Cape/CoatHogtieFree.png + ../Models/Cape/ShouldersHogtie.png + ../Models/Cape/ShouldersHogtieFree.png + ../Models/Cape/ShouldersKneel.png + ../Models/Cape/ShouldersSpread.png + ../Models/Cape/ShouldersUp.png + ../Models/Cape/ShouldersYoked.png + ../Models/Catsuit/ArmLeftBoxtie.png + ../Models/Catsuit/ArmLeftCrossed.png + ../Models/Catsuit/ArmLeftFree.png + ../Models/Catsuit/ArmLeftFront.png + ../Models/Catsuit/ArmLeftHogtie.png + ../Models/Catsuit/ArmLeftUp.png + ../Models/Catsuit/ArmLeftWristtie.png + ../Models/Catsuit/ArmLeftYoked.png + ../Models/Catsuit/ArmRightBoxtie.png + ../Models/Catsuit/ArmRightCrossed.png + ../Models/Catsuit/ArmRightFree.png + ../Models/Catsuit/ArmRightFront.png + ../Models/Catsuit/ArmRightHogtie.png + ../Models/Catsuit/ArmRightUp.png + ../Models/Catsuit/ArmRightWristtie.png + ../Models/Catsuit/ArmRightYoked.png + ../Models/Catsuit/ButtHogtie.png + ../Models/Catsuit/ButtKneel.png + ../Models/Catsuit/Chest.png + ../Models/Catsuit/ChestHogtie.png + ../Models/Catsuit/FootLeftClosed.png + ../Models/Catsuit/FootLeftHogtie.png + ../Models/Catsuit/FootLeftKneel.png + ../Models/Catsuit/FootLeftKneelClosed.png + ../Models/Catsuit/FootLeftSpread.png + ../Models/Catsuit/FootRightClosed.png + ../Models/Catsuit/FootRightKneel.png + ../Models/Catsuit/FootRightSpread.png + ../Models/Catsuit/ForeArmLeftCrossed.png + ../Models/Catsuit/ForeArmLeftFront.png + ../Models/Catsuit/ForeArmRightCrossed.png + ../Models/Catsuit/ForeArmRightFront.png + ../Models/Catsuit/HandLeftFree.png + ../Models/Catsuit/HandLeftFront.png + ../Models/Catsuit/HandLeftYoked.png + ../Models/Catsuit/HandRightBoxtie.png + ../Models/Catsuit/HandRightFree.png + ../Models/Catsuit/HandRightFront.png + ../Models/Catsuit/HandRightYoked.png + ../Models/Catsuit/LegLeftClosed.png + ../Models/Catsuit/LegLeftHogtie.png + ../Models/Catsuit/LegLeftKneel.png + ../Models/Catsuit/LegLeftKneelClosed.png + ../Models/Catsuit/LegLeftSpread.png + ../Models/Catsuit/LegRightClosed.png + ../Models/Catsuit/LegRightHogtie.png + ../Models/Catsuit/LegRightKneel.png + ../Models/Catsuit/LegRightKneelClosed.png + ../Models/Catsuit/LegRightSpread.png + ../Models/Catsuit/ShoulderLeftUp.png + ../Models/Catsuit/ShoulderRightUp.png + ../Models/Catsuit/SleevelessTop.png + ../Models/Catsuit/SleevelessTopChest.png + ../Models/Catsuit/SleevelessTopV.png + ../Models/Catsuit/SleevelessTopVChest.png + ../Models/Catsuit/SleevelessTorsoUpper.png + ../Models/Catsuit/SleevelessTorsoUpperHogtie.png + ../Models/Catsuit/TorsoBand.png + ../Models/Catsuit/TorsoLower.png + ../Models/Catsuit/TorsoLowerClosed.png + ../Models/Catsuit/TorsoLowerHogtie.png + ../Models/Catsuit/TorsoLowerLeotard.png + ../Models/Catsuit/TorsoLowerLowRise.png + ../Models/Catsuit/TorsoLowerLowRiseClosed.png + ../Models/Catsuit/TorsoLowerLowRiseSpread.png + ../Models/Catsuit/TorsoLowerPanties.png + ../Models/Catsuit/TorsoLowerSpread.png + ../Models/Catsuit/TorsoUpper.png + ../Models/Catsuit/TorsoUpperCrop.png + ../Models/Catsuit/TorsoUpperHogtie.png + ../Models/Chastity/Belt.png + ../Models/Chastity/BeltLining.png + ../Models/Chastity/BeltLock.png + ../Models/Chastity/BeltStrap.png + ../Models/Chastity/BeltStrapLining.png + ../Models/Chastity/BraChain.png + ../Models/Chastity/BraCups.png + ../Models/Chastity/BraCyber.png + ../Models/Chastity/BraCyberDisplay.png + ../Models/Chastity/BraCyberLining.png + ../Models/Chastity/BraCyberLock.png + ../Models/Chastity/BraLining.png + ../Models/Chastity/BraLock.png + ../Models/Chastity/BraProto.png + ../Models/Chastity/BraProtoCups.png + ../Models/Chastity/BraProtoDisplay.png + ../Models/Chastity/BraProtoLining.png + ../Models/Chastity/BraProtoLiningMid.png + ../Models/Chastity/BraProtoLiningMidRim.png + ../Models/Chastity/BraProtoLiningMidZip.png + ../Models/Chastity/BraProtoLiningMidZipRim.png + ../Models/Chastity/BraProtoLiningRim.png + ../Models/Chastity/BraProtoLiningZip.png + ../Models/Chastity/BraProtoLiningZipRim.png + ../Models/Chastity/BraProtoLock.png + ../Models/Chastity/Cyber.png + ../Models/Chastity/CyberDisplay.png + ../Models/Chastity/CyberLining.png + ../Models/Chastity/CyberLock.png + ../Models/Chastity/CyberPanties.png + ../Models/Chastity/CyberPantiesClosed.png + ../Models/Chastity/CyberPantiesLining.png + ../Models/Chastity/CyberPantiesLiningClosed.png + ../Models/Chastity/CyberPlug.png + ../Models/Chastity/Proto.png + ../Models/Chastity/ProtoDisplay.png + ../Models/Chastity/ProtoLining.png + ../Models/Chastity/ProtoLock.png + ../Models/Chastity/ProtoPlug.png + ../Models/China/Bra.png + ../Models/China/Dress.png + ../Models/China/DressSkirt.png + ../Models/China/DressSkirtClosed.png + ../Models/China/DressSkirtClosedCrotchStrap.png + ../Models/China/DressSkirtCrotchStrap.png + ../Models/China/DressSkirtKneel.png + ../Models/China/DressSkirtKneelCrotchStrap.png + ../Models/China/DressSkirtOverKneel.png + ../Models/China/Highlights.png + ../Models/Collars/Choker.png + ../Models/Collars/DragonCollar.png + ../Models/Collars/Future.png + ../Models/Collars/FutureBand.png + ../Models/Collars/FutureDisplay.png + ../Models/Collars/FutureLock.png + ../Models/Collars/FutureRim.png + ../Models/Collars/Leash.png + ../Models/Collars/NeckCorset.png + ../Models/Collars/NeckCorsetRim.png + ../Models/Collars/Quake.png + ../Models/Collars/QuakeHogtie.png + ../Models/Collars/Simple.png + ../Models/Collars/TrackingModule.png + ../Models/Collars/TrackingModuleDisplay.png + ../Models/Corsets/BuckleCorset.png + ../Models/Corsets/BuckleCorsetBuckles.png + ../Models/Corsets/BuckleCorsetHardware.png + ../Models/Corsets/ChestHeavyCorset.png + ../Models/Corsets/CrossHeavyCorset.png + ../Models/Corsets/HeavyCorset.png + ../Models/Corsets/HeavyCorsetKneel.png + ../Models/Corsets/StrapsHeavyCorset.png + ../Models/Crystal/EncaseOver.png + ../Models/Crystal/EncaseUnder.png + ../Models/CrystalCuffs/AnkleLeftClosed.png + ../Models/CrystalCuffs/AnkleLeftKneel.png + ../Models/CrystalCuffs/AnkleLeftKneelClosed.png + ../Models/CrystalCuffs/AnkleLeftSpread.png + ../Models/CrystalCuffs/AnkleLinkSpread.png + ../Models/CrystalCuffs/AnkleRightClosed.png + ../Models/CrystalCuffs/AnkleRightSpread.png + ../Models/CrystalCuffs/Belt.png + ../Models/CrystalCuffs/Collar.png + ../Models/CrystalCuffs/CollarHardware.png + ../Models/CrystalCuffs/ElbowLeftBoxtie.png + ../Models/CrystalCuffs/ElbowLeftFree.png + ../Models/CrystalCuffs/ElbowLeftFront.png + ../Models/CrystalCuffs/ElbowLeftUp.png + ../Models/CrystalCuffs/ElbowLeftWristtie.png + ../Models/CrystalCuffs/ElbowLeftYoked.png + ../Models/CrystalCuffs/ElbowRightBoxtie.png + ../Models/CrystalCuffs/ElbowRightFront.png + ../Models/CrystalCuffs/ElbowRightUp.png + ../Models/CrystalCuffs/ElbowRightWristtie.png + ../Models/CrystalCuffs/ElbowRightYoked.png + ../Models/CrystalCuffs/SteelCollar.png + ../Models/CrystalCuffs/SteelCollarRunes.png + ../Models/CrystalCuffs/ThighLeftClosed.png + ../Models/CrystalCuffs/ThighLeftKneel.png + ../Models/CrystalCuffs/ThighLeftKneelClosed.png + ../Models/CrystalCuffs/ThighLeftSpread.png + ../Models/CrystalCuffs/ThighLinkSpread.png + ../Models/CrystalCuffs/ThighRightClosed.png + ../Models/CrystalCuffs/ThighRightKneel.png + ../Models/CrystalCuffs/ThighRightKneelClosed.png + ../Models/CrystalCuffs/ThighRightSpread.png + ../Models/CrystalCuffs/WristLeftFree.png + ../Models/CrystalCuffs/WristLeftFront.png + ../Models/CrystalCuffs/WristLeftYoked.png + ../Models/CrystalCuffs/WristRightCrossed.png + ../Models/CrystalCuffs/WristRightFree.png + ../Models/CrystalCuffs/WristRightFront.png + ../Models/CrystalCuffs/WristRightYoked.png + ../Models/Cuffs/AnkleLeftClosed.png + ../Models/Cuffs/AnkleLeftKneel.png + ../Models/Cuffs/AnkleLeftKneelClosed.png + ../Models/Cuffs/AnkleLeftSpread.png + ../Models/Cuffs/AnkleLinkSpread.png + ../Models/Cuffs/AnkleRightClosed.png + ../Models/Cuffs/AnkleRightSpread.png + ../Models/Cuffs/Belt.png + ../Models/Cuffs/Collar.png + ../Models/Cuffs/CollarHardware.png + ../Models/Cuffs/ElbowLeftBoxtie.png + ../Models/Cuffs/ElbowLeftFree.png + ../Models/Cuffs/ElbowLeftFront.png + ../Models/Cuffs/ElbowLeftUp.png + ../Models/Cuffs/ElbowLeftWristtie.png + ../Models/Cuffs/ElbowLeftYoked.png + ../Models/Cuffs/ElbowRightBoxtie.png + ../Models/Cuffs/ElbowRightFront.png + ../Models/Cuffs/ElbowRightUp.png + ../Models/Cuffs/ElbowRightWristtie.png + ../Models/Cuffs/ElbowRightYoked.png + ../Models/Cuffs/SteelCollar.png + ../Models/Cuffs/SteelCollarRunes.png + ../Models/Cuffs/ThighLeftClosed.png + ../Models/Cuffs/ThighLeftKneel.png + ../Models/Cuffs/ThighLeftKneelClosed.png + ../Models/Cuffs/ThighLeftSpread.png + ../Models/Cuffs/ThighLinkSpread.png + ../Models/Cuffs/ThighLinkSpreadHigh.png + ../Models/Cuffs/ThighRightClosed.png + ../Models/Cuffs/ThighRightKneel.png + ../Models/Cuffs/ThighRightKneelClosed.png + ../Models/Cuffs/ThighRightSpread.png + ../Models/Cuffs/WristLeftFree.png + ../Models/Cuffs/WristLeftFront.png + ../Models/Cuffs/WristLeftYoked.png + ../Models/Cuffs/WristRightCrossed.png + ../Models/Cuffs/WristRightFree.png + ../Models/Cuffs/WristRightFront.png + ../Models/Cuffs/WristRightYoked.png + ../Models/CyberArms/CuffForeLongMittenLeftFront.png + ../Models/CyberArms/CuffForeLongMittenRightCrossed.png + ../Models/CyberArms/CuffForeLongMittenRightFront.png + ../Models/CyberArms/CuffLongMittenLeftBoxtie.png + ../Models/CyberArms/CuffLongMittenLeftFree.png + ../Models/CyberArms/CuffLongMittenLeftFront.png + ../Models/CyberArms/CuffLongMittenLeftUp.png + ../Models/CyberArms/CuffLongMittenLeftWristtie.png + ../Models/CyberArms/CuffLongMittenLeftYoked.png + ../Models/CyberArms/CuffLongMittenRightBoxtie.png + ../Models/CyberArms/CuffLongMittenRightCrossed.png + ../Models/CyberArms/CuffLongMittenRightFree.png + ../Models/CyberArms/CuffLongMittenRightFront.png + ../Models/CyberArms/CuffLongMittenRightUp.png + ../Models/CyberArms/CuffLongMittenRightWristtie.png + ../Models/CyberArms/CuffLongMittenRightYoked.png + ../Models/CyberArms/DisplayLongMittenLeftBoxtie.png + ../Models/CyberArms/DisplayLongMittenLeftCrossed.png + ../Models/CyberArms/DisplayLongMittenLeftFree.png + ../Models/CyberArms/DisplayLongMittenLeftFront.png + ../Models/CyberArms/DisplayLongMittenLeftWristtie.png + ../Models/CyberArms/DisplayLongMittenLeftYoked.png + ../Models/CyberArms/DisplayLongMittenRightYoked.png + ../Models/CyberArms/ForeLongMittenLeftCrossed.png + ../Models/CyberArms/ForeLongMittenLeftFront.png + ../Models/CyberArms/ForeLongMittenRightCrossed.png + ../Models/CyberArms/ForeLongMittenRightFront.png + ../Models/CyberArms/GlowForeLongMittenLeftFront.png + ../Models/CyberArms/GlowForeLongMittenRightFront.png + ../Models/CyberArms/GlowLongMittenLeftBoxtie.png + ../Models/CyberArms/GlowLongMittenLeftCrossed.png + ../Models/CyberArms/GlowLongMittenLeftFree.png + ../Models/CyberArms/GlowLongMittenLeftFront.png + ../Models/CyberArms/GlowLongMittenLeftWristtie.png + ../Models/CyberArms/GlowLongMittenLeftYoked.png + ../Models/CyberArms/GlowLongMittenRightBoxtie.png + ../Models/CyberArms/GlowLongMittenRightCrossed.png + ../Models/CyberArms/GlowLongMittenRightFree.png + ../Models/CyberArms/GlowLongMittenRightFront.png + ../Models/CyberArms/GlowLongMittenRightYoked.png + ../Models/CyberArms/LockLongMittenLeftBoxtie.png + ../Models/CyberArms/LockLongMittenLeftCrossed.png + ../Models/CyberArms/LockLongMittenLeftFree.png + ../Models/CyberArms/LockLongMittenLeftFront.png + ../Models/CyberArms/LockLongMittenLeftWristtie.png + ../Models/CyberArms/LockLongMittenLeftYoked.png + ../Models/CyberArms/LockLongMittenRightWristtie.png + ../Models/CyberArms/LockLongMittenRightYoked.png + ../Models/CyberArms/LongMittenLeftBoxtie.png + ../Models/CyberArms/LongMittenLeftCrossed.png + ../Models/CyberArms/LongMittenLeftFree.png + ../Models/CyberArms/LongMittenLeftFront.png + ../Models/CyberArms/LongMittenLeftUp.png + ../Models/CyberArms/LongMittenLeftWristtie.png + ../Models/CyberArms/LongMittenLeftYoked.png + ../Models/CyberArms/LongMittenRightBoxtie.png + ../Models/CyberArms/LongMittenRightCrossed.png + ../Models/CyberArms/LongMittenRightFree.png + ../Models/CyberArms/LongMittenRightFront.png + ../Models/CyberArms/LongMittenRightUp.png + ../Models/CyberArms/LongMittenRightWristtie.png + ../Models/CyberArms/LongMittenRightYoked.png + ../Models/CyberArms/StrapsForeLongMittenLeftCrossed.png + ../Models/CyberArms/StrapsForeLongMittenLeftFront.png + ../Models/CyberArms/StrapsForeLongMittenRightCrossed.png + ../Models/CyberArms/StrapsForeLongMittenRightFront.png + ../Models/CyberArms/StrapsLongMittenLeftBoxtie.png + ../Models/CyberArms/StrapsLongMittenLeftCrossed.png + ../Models/CyberArms/StrapsLongMittenLeftFree.png + ../Models/CyberArms/StrapsLongMittenLeftUp.png + ../Models/CyberArms/StrapsLongMittenLeftWristtie.png + ../Models/CyberArms/StrapsLongMittenLeftYoked.png + ../Models/CyberArms/StrapsLongMittenRightBoxtie.png + ../Models/CyberArms/StrapsLongMittenRightCrossed.png + ../Models/CyberArms/StrapsLongMittenRightFree.png + ../Models/CyberArms/StrapsLongMittenRightUp.png + ../Models/CyberArms/StrapsLongMittenRightYoked.png + ../Models/CyberCuffs/AnkleLeftClosed.png + ../Models/CyberCuffs/AnkleLeftKneel.png + ../Models/CyberCuffs/AnkleLeftKneelClosed.png + ../Models/CyberCuffs/AnkleLeftSpread.png + ../Models/CyberCuffs/AnkleRightClosed.png + ../Models/CyberCuffs/AnkleRightSpread.png + ../Models/CyberCuffs/Belt.png + ../Models/CyberCuffs/Collar.png + ../Models/CyberCuffs/DisplayAnkleLeftClosed.png + ../Models/CyberCuffs/DisplayAnkleLeftKneel.png + ../Models/CyberCuffs/DisplayAnkleLeftKneelClosed.png + ../Models/CyberCuffs/DisplayAnkleLeftSpread.png + ../Models/CyberCuffs/DisplayAnkleRightClosed.png + ../Models/CyberCuffs/DisplayAnkleRightSpread.png + ../Models/CyberCuffs/DisplayBelt.png + ../Models/CyberCuffs/DisplayCollar.png + ../Models/CyberCuffs/DisplayElbowLeftBoxtie.png + ../Models/CyberCuffs/DisplayElbowLeftFree.png + ../Models/CyberCuffs/DisplayElbowLeftFront.png + ../Models/CyberCuffs/DisplayElbowLeftUp.png + ../Models/CyberCuffs/DisplayElbowLeftWristtie.png + ../Models/CyberCuffs/DisplayElbowLeftYoked.png + ../Models/CyberCuffs/DisplayElbowRightBoxtie.png + ../Models/CyberCuffs/DisplayElbowRightFront.png + ../Models/CyberCuffs/DisplayElbowRightUp.png + ../Models/CyberCuffs/DisplayElbowRightWristtie.png + ../Models/CyberCuffs/DisplayElbowRightYoked.png + ../Models/CyberCuffs/DisplayLinkCollar.png + ../Models/CyberCuffs/DisplayThighLeftClosed.png + ../Models/CyberCuffs/DisplayThighLeftKneel.png + ../Models/CyberCuffs/DisplayThighLeftKneelClosed.png + ../Models/CyberCuffs/DisplayThighLeftSpread.png + ../Models/CyberCuffs/DisplayThighRightClosed.png + ../Models/CyberCuffs/DisplayThighRightKneel.png + ../Models/CyberCuffs/DisplayThighRightKneelClosed.png + ../Models/CyberCuffs/DisplayThighRightSpread.png + ../Models/CyberCuffs/DisplayWristLeftFree.png + ../Models/CyberCuffs/DisplayWristLeftFront.png + ../Models/CyberCuffs/DisplayWristLeftYoked.png + ../Models/CyberCuffs/DisplayWristRightCrossed.png + ../Models/CyberCuffs/DisplayWristRightFree.png + ../Models/CyberCuffs/DisplayWristRightFront.png + ../Models/CyberCuffs/DisplayWristRightYoked.png + ../Models/CyberCuffs/ElbowLeftBoxtie.png + ../Models/CyberCuffs/ElbowLeftFree.png + ../Models/CyberCuffs/ElbowLeftFront.png + ../Models/CyberCuffs/ElbowLeftUp.png + ../Models/CyberCuffs/ElbowLeftWristtie.png + ../Models/CyberCuffs/ElbowLeftYoked.png + ../Models/CyberCuffs/ElbowRightBoxtie.png + ../Models/CyberCuffs/ElbowRightFront.png + ../Models/CyberCuffs/ElbowRightUp.png + ../Models/CyberCuffs/ElbowRightWristtie.png + ../Models/CyberCuffs/ElbowRightYoked.png + ../Models/CyberCuffs/LinkCollar.png + ../Models/CyberCuffs/LockAnkleLeftClosed.png + ../Models/CyberCuffs/LockAnkleLeftKneel.png + ../Models/CyberCuffs/LockAnkleLeftKneelClosed.png + ../Models/CyberCuffs/LockAnkleLeftSpread.png + ../Models/CyberCuffs/LockAnkleRightClosed.png + ../Models/CyberCuffs/LockAnkleRightSpread.png + ../Models/CyberCuffs/LockBelt.png + ../Models/CyberCuffs/LockCollar.png + ../Models/CyberCuffs/LockElbowLeftBoxtie.png + ../Models/CyberCuffs/LockElbowLeftFree.png + ../Models/CyberCuffs/LockElbowLeftFront.png + ../Models/CyberCuffs/LockElbowLeftUp.png + ../Models/CyberCuffs/LockElbowLeftWristtie.png + ../Models/CyberCuffs/LockElbowLeftYoked.png + ../Models/CyberCuffs/LockElbowRightBoxtie.png + ../Models/CyberCuffs/LockElbowRightFront.png + ../Models/CyberCuffs/LockElbowRightUp.png + ../Models/CyberCuffs/LockElbowRightWristtie.png + ../Models/CyberCuffs/LockElbowRightYoked.png + ../Models/CyberCuffs/LockLinkCollar.png + ../Models/CyberCuffs/LockThighLeftClosed.png + ../Models/CyberCuffs/LockThighLeftKneel.png + ../Models/CyberCuffs/LockThighLeftKneelClosed.png + ../Models/CyberCuffs/LockThighLeftSpread.png + ../Models/CyberCuffs/LockThighRightClosed.png + ../Models/CyberCuffs/LockThighRightKneel.png + ../Models/CyberCuffs/LockThighRightKneelClosed.png + ../Models/CyberCuffs/LockThighRightSpread.png + ../Models/CyberCuffs/LockWristLeftFree.png + ../Models/CyberCuffs/LockWristLeftFront.png + ../Models/CyberCuffs/LockWristLeftYoked.png + ../Models/CyberCuffs/LockWristRightCrossed.png + ../Models/CyberCuffs/LockWristRightFree.png + ../Models/CyberCuffs/LockWristRightFront.png + ../Models/CyberCuffs/LockWristRightYoked.png + ../Models/CyberCuffs/ScreenAnkleLeftClosed.png + ../Models/CyberCuffs/ScreenAnkleLeftKneel.png + ../Models/CyberCuffs/ScreenAnkleLeftKneelClosed.png + ../Models/CyberCuffs/ScreenAnkleLeftSpread.png + ../Models/CyberCuffs/ScreenAnkleRightClosed.png + ../Models/CyberCuffs/ScreenAnkleRightSpread.png + ../Models/CyberCuffs/ScreenBelt.png + ../Models/CyberCuffs/ScreenCollar.png + ../Models/CyberCuffs/ScreenElbowLeftBoxtie.png + ../Models/CyberCuffs/ScreenElbowLeftFree.png + ../Models/CyberCuffs/ScreenElbowLeftFront.png + ../Models/CyberCuffs/ScreenElbowLeftUp.png + ../Models/CyberCuffs/ScreenElbowLeftWristtie.png + ../Models/CyberCuffs/ScreenElbowLeftYoked.png + ../Models/CyberCuffs/ScreenElbowRightBoxtie.png + ../Models/CyberCuffs/ScreenElbowRightFront.png + ../Models/CyberCuffs/ScreenElbowRightUp.png + ../Models/CyberCuffs/ScreenElbowRightWristtie.png + ../Models/CyberCuffs/ScreenElbowRightYoked.png + ../Models/CyberCuffs/ScreenLinkCollar.png + ../Models/CyberCuffs/ScreenThighLeftClosed.png + ../Models/CyberCuffs/ScreenThighLeftKneel.png + ../Models/CyberCuffs/ScreenThighLeftKneelClosed.png + ../Models/CyberCuffs/ScreenThighLeftSpread.png + ../Models/CyberCuffs/ScreenThighRightClosed.png + ../Models/CyberCuffs/ScreenThighRightKneel.png + ../Models/CyberCuffs/ScreenThighRightKneelClosed.png + ../Models/CyberCuffs/ScreenThighRightSpread.png + ../Models/CyberCuffs/ScreenWristLeftFree.png + ../Models/CyberCuffs/ScreenWristLeftFront.png + ../Models/CyberCuffs/ScreenWristLeftYoked.png + ../Models/CyberCuffs/ScreenWristRightCrossed.png + ../Models/CyberCuffs/ScreenWristRightFree.png + ../Models/CyberCuffs/ScreenWristRightFront.png + ../Models/CyberCuffs/ScreenWristRightYoked.png + ../Models/CyberCuffs/ThighLeftClosed.png + ../Models/CyberCuffs/ThighLeftKneel.png + ../Models/CyberCuffs/ThighLeftKneelClosed.png + ../Models/CyberCuffs/ThighLeftSpread.png + ../Models/CyberCuffs/ThighRightClosed.png + ../Models/CyberCuffs/ThighRightKneel.png + ../Models/CyberCuffs/ThighRightKneelClosed.png + ../Models/CyberCuffs/ThighRightSpread.png + ../Models/CyberCuffs/WristLeftFree.png + ../Models/CyberCuffs/WristLeftFront.png + ../Models/CyberCuffs/WristLeftYoked.png + ../Models/CyberCuffs/WristRightCrossed.png + ../Models/CyberCuffs/WristRightFree.png + ../Models/CyberCuffs/WristRightFront.png + ../Models/CyberCuffs/WristRightYoked.png + ../Models/CyberHeels/GlowBalletLeftClosed.png + ../Models/CyberHeels/GlowBalletLeftHogtie.png + ../Models/CyberHeels/GlowBalletLeftKneel.png + ../Models/CyberHeels/GlowBalletLeftKneelClosed.png + ../Models/CyberHeels/GlowBalletLeftSpread.png + ../Models/CyberHeels/GlowBalletRightClosed.png + ../Models/CyberHeels/GlowBalletRightKneel.png + ../Models/CyberHeels/GlowBalletRightSpread.png + ../Models/CyberHeels/ShinyBalletLeftClosed.png + ../Models/CyberHeels/ShinyBalletLeftHogtie.png + ../Models/CyberHeels/ShinyBalletLeftKneel.png + ../Models/CyberHeels/ShinyBalletLeftKneelClosed.png + ../Models/CyberHeels/ShinyBalletLeftSpread.png + ../Models/CyberHeels/ShinyBalletRightClosed.png + ../Models/CyberHeels/ShinyBalletRightKneel.png + ../Models/CyberHeels/ShinyBalletRightSpread.png + ../Models/CyberLink/AnkleLinkSpread.png + ../Models/CyberLink/GlowAnkleLinkSpread.png + ../Models/CyberLink/GlowThighLinkSpread.png + ../Models/CyberLink/GlowThighLinkSpreadHigh.png + ../Models/CyberLink/ThighLinkSpread.png + ../Models/CyberLink/ThighLinkSpreadHigh.png + ../Models/CyberMitts/ArmLongMittenLeftBoxtie.png + ../Models/CyberMitts/ArmLongMittenLeftCrossed.png + ../Models/CyberMitts/ArmLongMittenLeftFree.png + ../Models/CyberMitts/ArmLongMittenLeftFront.png + ../Models/CyberMitts/ArmLongMittenLeftUp.png + ../Models/CyberMitts/ArmLongMittenLeftWristtie.png + ../Models/CyberMitts/ArmLongMittenLeftYoked.png + ../Models/CyberMitts/ArmLongMittenRightBoxtie.png + ../Models/CyberMitts/ArmLongMittenRightCrossed.png + ../Models/CyberMitts/ArmLongMittenRightFree.png + ../Models/CyberMitts/ArmLongMittenRightFront.png + ../Models/CyberMitts/ArmLongMittenRightUp.png + ../Models/CyberMitts/ArmLongMittenRightWristtie.png + ../Models/CyberMitts/ArmLongMittenRightYoked.png + ../Models/CyberMitts/CapForeLongMittenLeftFront.png + ../Models/CyberMitts/CapForeLongMittenRightFront.png + ../Models/CyberMitts/CapLongMittenLeftCrossed.png + ../Models/CyberMitts/CapLongMittenLeftFree.png + ../Models/CyberMitts/CapLongMittenLeftYoked.png + ../Models/CyberMitts/CapLongMittenRightBoxtie.png + ../Models/CyberMitts/CapLongMittenRightCrossed.png + ../Models/CyberMitts/CapLongMittenRightFree.png + ../Models/CyberMitts/CapLongMittenRightYoked.png + ../Models/CyberMitts/CuffForeLongMittenLeftFront.png + ../Models/CyberMitts/CuffForeLongMittenRightCrossed.png + ../Models/CyberMitts/CuffForeLongMittenRightFront.png + ../Models/CyberMitts/CuffLongMittenLeftBoxtie.png + ../Models/CyberMitts/CuffLongMittenLeftFree.png + ../Models/CyberMitts/CuffLongMittenLeftFront.png + ../Models/CyberMitts/CuffLongMittenLeftUp.png + ../Models/CyberMitts/CuffLongMittenLeftWristtie.png + ../Models/CyberMitts/CuffLongMittenLeftYoked.png + ../Models/CyberMitts/CuffLongMittenRightBoxtie.png + ../Models/CyberMitts/CuffLongMittenRightCrossed.png + ../Models/CyberMitts/CuffLongMittenRightFree.png + ../Models/CyberMitts/CuffLongMittenRightFront.png + ../Models/CyberMitts/CuffLongMittenRightUp.png + ../Models/CyberMitts/CuffLongMittenRightWristtie.png + ../Models/CyberMitts/CuffLongMittenRightYoked.png + ../Models/CyberMitts/DisplayLongMittenLeftBoxtie.png + ../Models/CyberMitts/DisplayLongMittenLeftCrossed.png + ../Models/CyberMitts/DisplayLongMittenLeftFree.png + ../Models/CyberMitts/DisplayLongMittenLeftFront.png + ../Models/CyberMitts/DisplayLongMittenLeftWristtie.png + ../Models/CyberMitts/DisplayLongMittenLeftYoked.png + ../Models/CyberMitts/DisplayLongMittenRightYoked.png + ../Models/CyberMitts/ForeLongMittenLeftCrossed.png + ../Models/CyberMitts/ForeLongMittenLeftFront.png + ../Models/CyberMitts/ForeLongMittenRightCrossed.png + ../Models/CyberMitts/ForeLongMittenRightFront.png + ../Models/CyberMitts/ForeMittenLeftCrossed.png + ../Models/CyberMitts/ForeMittenLeftFront.png + ../Models/CyberMitts/ForeMittenRightCrossed.png + ../Models/CyberMitts/ForeMittenRightFront.png + ../Models/CyberMitts/GlowForeLongMittenLeftFront.png + ../Models/CyberMitts/GlowForeLongMittenRightFront.png + ../Models/CyberMitts/GlowLongMittenLeftBoxtie.png + ../Models/CyberMitts/GlowLongMittenLeftCrossed.png + ../Models/CyberMitts/GlowLongMittenLeftFree.png + ../Models/CyberMitts/GlowLongMittenLeftFront.png + ../Models/CyberMitts/GlowLongMittenLeftWristtie.png + ../Models/CyberMitts/GlowLongMittenLeftYoked.png + ../Models/CyberMitts/GlowLongMittenRightBoxtie.png + ../Models/CyberMitts/GlowLongMittenRightCrossed.png + ../Models/CyberMitts/GlowLongMittenRightFree.png + ../Models/CyberMitts/GlowLongMittenRightFront.png + ../Models/CyberMitts/GlowLongMittenRightYoked.png + ../Models/CyberMitts/LockLongMittenLeftBoxtie.png + ../Models/CyberMitts/LockLongMittenLeftCrossed.png + ../Models/CyberMitts/LockLongMittenLeftFree.png + ../Models/CyberMitts/LockLongMittenLeftFront.png + ../Models/CyberMitts/LockLongMittenLeftWristtie.png + ../Models/CyberMitts/LockLongMittenLeftYoked.png + ../Models/CyberMitts/LockLongMittenRightWristtie.png + ../Models/CyberMitts/LockLongMittenRightYoked.png + ../Models/CyberMitts/LongMittenLeftBoxtie.png + ../Models/CyberMitts/LongMittenLeftCrossed.png + ../Models/CyberMitts/LongMittenLeftFree.png + ../Models/CyberMitts/LongMittenLeftFront.png + ../Models/CyberMitts/LongMittenLeftUp.png + ../Models/CyberMitts/LongMittenLeftWristtie.png + ../Models/CyberMitts/LongMittenLeftYoked.png + ../Models/CyberMitts/LongMittenRightBoxtie.png + ../Models/CyberMitts/LongMittenRightCrossed.png + ../Models/CyberMitts/LongMittenRightFree.png + ../Models/CyberMitts/LongMittenRightFront.png + ../Models/CyberMitts/LongMittenRightUp.png + ../Models/CyberMitts/LongMittenRightWristtie.png + ../Models/CyberMitts/LongMittenRightYoked.png + ../Models/CyberMitts/MittenLeftBoxtie.png + ../Models/CyberMitts/MittenLeftCrossed.png + ../Models/CyberMitts/MittenLeftFree.png + ../Models/CyberMitts/MittenLeftFront.png + ../Models/CyberMitts/MittenLeftUp.png + ../Models/CyberMitts/MittenLeftWristtie.png + ../Models/CyberMitts/MittenLeftYoked.png + ../Models/CyberMitts/MittenRightBoxtie.png + ../Models/CyberMitts/MittenRightCrossed.png + ../Models/CyberMitts/MittenRightFree.png + ../Models/CyberMitts/MittenRightFront.png + ../Models/CyberMitts/MittenRightUp.png + ../Models/CyberMitts/MittenRightWristtie.png + ../Models/CyberMitts/MittenRightYoked.png + ../Models/CyberMitts/StrapsForeLongMittenLeftCrossed.png + ../Models/CyberMitts/StrapsForeLongMittenLeftFront.png + ../Models/CyberMitts/StrapsForeLongMittenRightCrossed.png + ../Models/CyberMitts/StrapsForeLongMittenRightFront.png + ../Models/CyberMitts/StrapsLongMittenLeftBoxtie.png + ../Models/CyberMitts/StrapsLongMittenLeftCrossed.png + ../Models/CyberMitts/StrapsLongMittenLeftFree.png + ../Models/CyberMitts/StrapsLongMittenLeftUp.png + ../Models/CyberMitts/StrapsLongMittenLeftWristtie.png + ../Models/CyberMitts/StrapsLongMittenLeftYoked.png + ../Models/CyberMitts/StrapsLongMittenRightBoxtie.png + ../Models/CyberMitts/StrapsLongMittenRightCrossed.png + ../Models/CyberMitts/StrapsLongMittenRightFree.png + ../Models/CyberMitts/StrapsLongMittenRightUp.png + ../Models/CyberMitts/StrapsLongMittenRightYoked.png + ../Models/CyberMitts/UpperCuffForeLongMittenLeftFront.png + ../Models/CyberMitts/UpperCuffForeLongMittenRightCrossed.png + ../Models/CyberMitts/UpperCuffForeLongMittenRightFront.png + ../Models/CyberMitts/UpperCuffLongMittenLeftBoxtie.png + ../Models/CyberMitts/UpperCuffLongMittenLeftFree.png + ../Models/CyberMitts/UpperCuffLongMittenLeftFront.png + ../Models/CyberMitts/UpperCuffLongMittenLeftUp.png + ../Models/CyberMitts/UpperCuffLongMittenLeftWristtie.png + ../Models/CyberMitts/UpperCuffLongMittenLeftYoked.png + ../Models/CyberMitts/UpperCuffLongMittenRightBoxtie.png + ../Models/CyberMitts/UpperCuffLongMittenRightCrossed.png + ../Models/CyberMitts/UpperCuffLongMittenRightFree.png + ../Models/CyberMitts/UpperCuffLongMittenRightFront.png + ../Models/CyberMitts/UpperCuffLongMittenRightUp.png + ../Models/CyberMitts/UpperCuffLongMittenRightWristtie.png + ../Models/CyberMitts/UpperCuffLongMittenRightYoked.png + ../Models/CyberMitts/UpperDisplayLongMittenLeftBoxtie.png + ../Models/CyberMitts/UpperDisplayLongMittenLeftCrossed.png + ../Models/CyberMitts/UpperDisplayLongMittenLeftFree.png + ../Models/CyberMitts/UpperDisplayLongMittenLeftFront.png + ../Models/CyberMitts/UpperDisplayLongMittenLeftWristtie.png + ../Models/CyberMitts/UpperDisplayLongMittenLeftYoked.png + ../Models/CyberMitts/UpperDisplayLongMittenRightYoked.png + ../Models/CyberMitts/UpperGlowForeLongMittenLeftFront.png + ../Models/CyberMitts/UpperGlowForeLongMittenRightFront.png + ../Models/CyberMitts/UpperGlowLongMittenLeftBoxtie.png + ../Models/CyberMitts/UpperGlowLongMittenLeftCrossed.png + ../Models/CyberMitts/UpperGlowLongMittenLeftFree.png + ../Models/CyberMitts/UpperGlowLongMittenLeftFront.png + ../Models/CyberMitts/UpperGlowLongMittenLeftWristtie.png + ../Models/CyberMitts/UpperGlowLongMittenLeftYoked.png + ../Models/CyberMitts/UpperGlowLongMittenRightBoxtie.png + ../Models/CyberMitts/UpperGlowLongMittenRightCrossed.png + ../Models/CyberMitts/UpperGlowLongMittenRightFree.png + ../Models/CyberMitts/UpperGlowLongMittenRightFront.png + ../Models/CyberMitts/UpperGlowLongMittenRightYoked.png + ../Models/CyberMitts/UpperLockLongMittenLeftBoxtie.png + ../Models/CyberMitts/UpperLockLongMittenLeftCrossed.png + ../Models/CyberMitts/UpperLockLongMittenLeftFree.png + ../Models/CyberMitts/UpperLockLongMittenLeftFront.png + ../Models/CyberMitts/UpperLockLongMittenLeftWristtie.png + ../Models/CyberMitts/UpperLockLongMittenLeftYoked.png + ../Models/CyberMitts/UpperLockLongMittenRightWristtie.png + ../Models/CyberMitts/UpperLockLongMittenRightYoked.png + ../Models/CyberPetsuit/Arms.png + ../Models/CyberPetsuit/ArmsBelts.png + ../Models/CyberPetsuit/DisplayArms.png + ../Models/CyberPetsuit/DisplayLeftLegsKneel.png + ../Models/CyberPetsuit/DisplayLeftLegsKneelClosed.png + ../Models/CyberPetsuit/DisplayLegsHogtie.png + ../Models/CyberPetsuit/DisplayLegsKneel.png + ../Models/CyberPetsuit/DisplayLegsKneelClosed.png + ../Models/CyberPetsuit/LeftLegsBeltsKneel.png + ../Models/CyberPetsuit/LeftLegsBeltsKneelClosed.png + ../Models/CyberPetsuit/LeftLegsKneel.png + ../Models/CyberPetsuit/LeftLegsKneelClosed.png + ../Models/CyberPetsuit/LegsBeltsHogtie.png + ../Models/CyberPetsuit/LegsBeltsKneel.png + ../Models/CyberPetsuit/LegsBeltsKneelClosed.png + ../Models/CyberPetsuit/LegsHogtie.png + ../Models/CyberPetsuit/LegsKneel.png + ../Models/CyberPetsuit/LegsKneelClosed.png + ../Models/CyberPetsuit/Petsuit.png + ../Models/CyberPetsuit/StrapsArms.png + ../Models/DivineBelt/BeltBase.png + ../Models/DivineBelt/BeltBaseNoLock.png + ../Models/DivineBelt/BeltLines.png + ../Models/DivineBelt/BeltMetal1.png + ../Models/DivineBelt/BeltMetal2.png + ../Models/DivineBelt/BeltMetalRunic1.png + ../Models/DivineBelt/BeltMetalRunic2.png + ../Models/DivineBelt/BeltPin.png + ../Models/DivineBelt/BraBase1.png + ../Models/DivineBelt/BraBase2.png + ../Models/DivineBelt/BraLines.png + ../Models/DivineBelt/BraMetal1.png + ../Models/DivineBelt/BraMetal2.png + ../Models/DivineBelt/BraMetalRunic1.png + ../Models/DivineBelt/BraMetalRunic2.png + ../Models/DivineBelt/BraPins.png + ../Models/DivineBelt/BraStraps.png + ../Models/DivineBelt/BraStrapsRunic.png + ../Models/DivineBelt/LockBeltHighlight.png + ../Models/DivineBelt/LockBeltLines.png + ../Models/DivineBelt/LockBeltPlate.png + ../Models/DivineBelt/LockBeltShackle.png + ../Models/DivineBelt/LockBraHighlight.png + ../Models/DivineBelt/LockBraLines.png + ../Models/DivineBelt/LockBraPlate.png + ../Models/DivineBelt/LockBraShackle.png + ../Models/DivineCuffs/AnkleLeftClosed.png + ../Models/DivineCuffs/AnkleLeftDecoCleanClosed.png + ../Models/DivineCuffs/AnkleLeftDecoCleanKneel.png + ../Models/DivineCuffs/AnkleLeftDecoCleanSpread.png + ../Models/DivineCuffs/AnkleLeftDecoClosed.png + ../Models/DivineCuffs/AnkleLeftDecoKneel.png + ../Models/DivineCuffs/AnkleLeftDecoSpread.png + ../Models/DivineCuffs/AnkleLeftKneel.png + ../Models/DivineCuffs/AnkleLeftKneelClosed.png + ../Models/DivineCuffs/AnkleLeftLockBandClosed.png + ../Models/DivineCuffs/AnkleLeftLockBandSpread.png + ../Models/DivineCuffs/AnkleLeftLockClosed.png + ../Models/DivineCuffs/AnkleLeftLockKneel.png + ../Models/DivineCuffs/AnkleLeftLockPlateClosed.png + ../Models/DivineCuffs/AnkleLeftLockPlateKneel.png + ../Models/DivineCuffs/AnkleLeftLockPlateSpread.png + ../Models/DivineCuffs/AnkleLeftLockSpread.png + ../Models/DivineCuffs/AnkleLeftSpread.png + ../Models/DivineCuffs/AnkleLinkSpread.png + ../Models/DivineCuffs/AnkleRightClosed.png + ../Models/DivineCuffs/AnkleRightDecoCleanClosed.png + ../Models/DivineCuffs/AnkleRightDecoCleanSpread.png + ../Models/DivineCuffs/AnkleRightDecoClosed.png + ../Models/DivineCuffs/AnkleRightDecoSpread.png + ../Models/DivineCuffs/AnkleRightLockBandClosed.png + ../Models/DivineCuffs/AnkleRightLockBandSpread.png + ../Models/DivineCuffs/AnkleRightLockClosed.png + ../Models/DivineCuffs/AnkleRightLockPlateClosed.png + ../Models/DivineCuffs/AnkleRightLockPlateSpread.png + ../Models/DivineCuffs/AnkleRightLockSpread.png + ../Models/DivineCuffs/AnkleRightSpread.png + ../Models/DivineCuffs/Belt.png + ../Models/DivineCuffs/BeltDeco.png + ../Models/DivineCuffs/BeltDecoClean.png + ../Models/DivineCuffs/BeltLock.png + ../Models/DivineCuffs/BeltLockBand.png + ../Models/DivineCuffs/BeltLockPlate.png + ../Models/DivineCuffs/Collar.png + ../Models/DivineCuffs/CollarDeco.png + ../Models/DivineCuffs/CollarDecoClean.png + ../Models/DivineCuffs/CollarLock.png + ../Models/DivineCuffs/CollarLockBand.png + ../Models/DivineCuffs/CollarLockPlate.png + ../Models/DivineCuffs/ElbowLeftBoxtie.png + ../Models/DivineCuffs/ElbowLeftDecoBoxtie.png + ../Models/DivineCuffs/ElbowLeftDecoCleanBoxtie.png + ../Models/DivineCuffs/ElbowLeftDecoCleanFree.png + ../Models/DivineCuffs/ElbowLeftDecoCleanFront.png + ../Models/DivineCuffs/ElbowLeftDecoCleanUp.png + ../Models/DivineCuffs/ElbowLeftDecoCleanWristtie.png + ../Models/DivineCuffs/ElbowLeftDecoCleanYoked.png + ../Models/DivineCuffs/ElbowLeftDecoFree.png + ../Models/DivineCuffs/ElbowLeftDecoFront.png + ../Models/DivineCuffs/ElbowLeftDecoUp.png + ../Models/DivineCuffs/ElbowLeftDecoWristtie.png + ../Models/DivineCuffs/ElbowLeftDecoYoked.png + ../Models/DivineCuffs/ElbowLeftFree.png + ../Models/DivineCuffs/ElbowLeftFront.png + ../Models/DivineCuffs/ElbowLeftLockBandBoxtie.png + ../Models/DivineCuffs/ElbowLeftLockBandFree.png + ../Models/DivineCuffs/ElbowLeftLockBandFront.png + ../Models/DivineCuffs/ElbowLeftLockBandUp.png + ../Models/DivineCuffs/ElbowLeftLockBandWristtie.png + ../Models/DivineCuffs/ElbowLeftLockBoxtie.png + ../Models/DivineCuffs/ElbowLeftLockFree.png + ../Models/DivineCuffs/ElbowLeftLockFront.png + ../Models/DivineCuffs/ElbowLeftLockPlateBoxtie.png + ../Models/DivineCuffs/ElbowLeftLockPlateFree.png + ../Models/DivineCuffs/ElbowLeftLockPlateFront.png + ../Models/DivineCuffs/ElbowLeftLockPlateUp.png + ../Models/DivineCuffs/ElbowLeftLockPlateWristtie.png + ../Models/DivineCuffs/ElbowLeftLockUp.png + ../Models/DivineCuffs/ElbowLeftLockWristtie.png + ../Models/DivineCuffs/ElbowLeftUp.png + ../Models/DivineCuffs/ElbowLeftWristtie.png + ../Models/DivineCuffs/ElbowLeftYoked.png + ../Models/DivineCuffs/ElbowRightBoxtie.png + ../Models/DivineCuffs/ElbowRightDecoBoxtie.png + ../Models/DivineCuffs/ElbowRightDecoCleanBoxtie.png + ../Models/DivineCuffs/ElbowRightDecoCleanFront.png + ../Models/DivineCuffs/ElbowRightDecoCleanUp.png + ../Models/DivineCuffs/ElbowRightDecoCleanYoked.png + ../Models/DivineCuffs/ElbowRightDecoFront.png + ../Models/DivineCuffs/ElbowRightDecoUp.png + ../Models/DivineCuffs/ElbowRightDecoYoked.png + ../Models/DivineCuffs/ElbowRightFront.png + ../Models/DivineCuffs/ElbowRightLockBandBoxtie.png + ../Models/DivineCuffs/ElbowRightLockBandFront.png + ../Models/DivineCuffs/ElbowRightLockBandUp.png + ../Models/DivineCuffs/ElbowRightLockBoxtie.png + ../Models/DivineCuffs/ElbowRightLockFront.png + ../Models/DivineCuffs/ElbowRightLockPlateBoxtie.png + ../Models/DivineCuffs/ElbowRightLockPlateFront.png + ../Models/DivineCuffs/ElbowRightLockPlateUp.png + ../Models/DivineCuffs/ElbowRightLockUp.png + ../Models/DivineCuffs/ElbowRightUp.png + ../Models/DivineCuffs/ElbowRightWristtie.png + ../Models/DivineCuffs/ElbowRightYoked.png + ../Models/DivineCuffs/SteelCollar.png + ../Models/DivineCuffs/SteelCollarRunes.png + ../Models/DivineCuffs/ThighLeftClosed.png + ../Models/DivineCuffs/ThighLeftDecoCleanClosed.png + ../Models/DivineCuffs/ThighLeftDecoCleanKneel.png + ../Models/DivineCuffs/ThighLeftDecoCleanKneelClosed.png + ../Models/DivineCuffs/ThighLeftDecoCleanSpread.png + ../Models/DivineCuffs/ThighLeftDecoClosed.png + ../Models/DivineCuffs/ThighLeftDecoKneel.png + ../Models/DivineCuffs/ThighLeftDecoKneelClosed.png + ../Models/DivineCuffs/ThighLeftDecoSpread.png + ../Models/DivineCuffs/ThighLeftKneel.png + ../Models/DivineCuffs/ThighLeftKneelClosed.png + ../Models/DivineCuffs/ThighLeftLockBandClosed.png + ../Models/DivineCuffs/ThighLeftLockBandKneel.png + ../Models/DivineCuffs/ThighLeftLockBandKneelClosed.png + ../Models/DivineCuffs/ThighLeftLockBandSpread.png + ../Models/DivineCuffs/ThighLeftLockClosed.png + ../Models/DivineCuffs/ThighLeftLockKneel.png + ../Models/DivineCuffs/ThighLeftLockKneelClosed.png + ../Models/DivineCuffs/ThighLeftLockPlateClosed.png + ../Models/DivineCuffs/ThighLeftLockPlateKneel.png + ../Models/DivineCuffs/ThighLeftLockPlateKneelClosed.png + ../Models/DivineCuffs/ThighLeftLockPlateSpread.png + ../Models/DivineCuffs/ThighLeftLockSpread.png + ../Models/DivineCuffs/ThighLeftSpread.png + ../Models/DivineCuffs/ThighLinkSpread.png + ../Models/DivineCuffs/ThighRightClosed.png + ../Models/DivineCuffs/ThighRightDecoCleanClosed.png + ../Models/DivineCuffs/ThighRightDecoCleanKneel.png + ../Models/DivineCuffs/ThighRightDecoCleanKneelClosed.png + ../Models/DivineCuffs/ThighRightDecoCleanSpread.png + ../Models/DivineCuffs/ThighRightDecoClosed.png + ../Models/DivineCuffs/ThighRightDecoKneel.png + ../Models/DivineCuffs/ThighRightDecoKneelClosed.png + ../Models/DivineCuffs/ThighRightDecoSpread.png + ../Models/DivineCuffs/ThighRightKneel.png + ../Models/DivineCuffs/ThighRightKneelClosed.png + ../Models/DivineCuffs/ThighRightLockBandClosed.png + ../Models/DivineCuffs/ThighRightLockBandKneel.png + ../Models/DivineCuffs/ThighRightLockBandSpread.png + ../Models/DivineCuffs/ThighRightLockClosed.png + ../Models/DivineCuffs/ThighRightLockKneel.png + ../Models/DivineCuffs/ThighRightLockPlateClosed.png + ../Models/DivineCuffs/ThighRightLockPlateKneel.png + ../Models/DivineCuffs/ThighRightLockPlateSpread.png + ../Models/DivineCuffs/ThighRightLockSpread.png + ../Models/DivineCuffs/ThighRightSpread.png + ../Models/DivineCuffs/WristLeftDecoCleanFree.png + ../Models/DivineCuffs/WristLeftDecoCleanFront.png + ../Models/DivineCuffs/WristLeftDecoCleanYoked.png + ../Models/DivineCuffs/WristLeftDecoFree.png + ../Models/DivineCuffs/WristLeftDecoFront.png + ../Models/DivineCuffs/WristLeftDecoYoked.png + ../Models/DivineCuffs/WristLeftFree.png + ../Models/DivineCuffs/WristLeftFront.png + ../Models/DivineCuffs/WristLeftLockBandFree.png + ../Models/DivineCuffs/WristLeftLockBandKneel.png + ../Models/DivineCuffs/WristLeftLockFree.png + ../Models/DivineCuffs/WristLeftLockPlateFree.png + ../Models/DivineCuffs/WristLeftYoked.png + ../Models/DivineCuffs/WristRightCrossed.png + ../Models/DivineCuffs/WristRightDecoCleanCrossed.png + ../Models/DivineCuffs/WristRightDecoCleanFree.png + ../Models/DivineCuffs/WristRightDecoCleanFront.png + ../Models/DivineCuffs/WristRightDecoCleanYoked.png + ../Models/DivineCuffs/WristRightDecoCrossed.png + ../Models/DivineCuffs/WristRightDecoFree.png + ../Models/DivineCuffs/WristRightDecoFront.png + ../Models/DivineCuffs/WristRightDecoYoked.png + ../Models/DivineCuffs/WristRightFree.png + ../Models/DivineCuffs/WristRightFront.png + ../Models/DivineCuffs/WristRightLockBandCrossed.png + ../Models/DivineCuffs/WristRightLockCrossed.png + ../Models/DivineCuffs/WristRightLockPlateCrossed.png + ../Models/DivineCuffs/WristRightYoked.png + ../Models/DivineGag/Ball.png + ../Models/DivineGag/Gold.png + ../Models/DivineGag/GoldClean.png + ../Models/DivineGag/Harness.png + ../Models/DivineGag/Metallic.png + ../Models/DivineGag/Muzzle.png + ../Models/DivineGag/MuzzleCollar.png + ../Models/DivineGag/MuzzleGold.png + ../Models/DivineGag/MuzzleGoldClean.png + ../Models/DivineGag/MuzzleHarness.png + ../Models/DivineGag/MuzzleRim.png + ../Models/DivineGag/Teeth.png + ../Models/Dress/Band.png + ../Models/Dress/BandCrotchStrap.png + ../Models/Dress/BandKneel.png + ../Models/Dress/BandKneelCrotchStrap.png + ../Models/Dress/BlouseArmLeftBoxtie.png + ../Models/Dress/BlouseArmLeftCrossed.png + ../Models/Dress/BlouseArmLeftFree.png + ../Models/Dress/BlouseArmLeftFront.png + ../Models/Dress/BlouseArmLeftUp.png + ../Models/Dress/BlouseArmLeftWristtie.png + ../Models/Dress/BlouseArmLeftYoked.png + ../Models/Dress/BlouseArmRightBoxtie.png + ../Models/Dress/BlouseArmRightCrossed.png + ../Models/Dress/BlouseArmRightFree.png + ../Models/Dress/BlouseArmRightFront.png + ../Models/Dress/BlouseArmRightUp.png + ../Models/Dress/BlouseArmRightWristtie.png + ../Models/Dress/BlouseArmRightYoked.png + ../Models/Dress/BlouseBust.png + ../Models/Dress/BlouseBustBoxtie.png + ../Models/Dress/BlouseBustBoxtieChesttied.png + ../Models/Dress/BlouseBustChesttied.png + ../Models/Dress/BlouseBustUp.png + ../Models/Dress/BlouseBustUpChesttied.png + ../Models/Dress/BlouseCollar.png + ../Models/Dress/BlouseCollarBoxtie.png + ../Models/Dress/BlouseCollarUp.png + ../Models/Dress/BlouseForeArmLeftCrossed.png + ../Models/Dress/BlouseForeArmLeftFront.png + ../Models/Dress/BlouseForeArmRightCrossed.png + ../Models/Dress/BlouseForeArmRightFront.png + ../Models/Dress/BlouseNeck.png + ../Models/Dress/BlouseNeckBoxtie.png + ../Models/Dress/BlouseNeckUp.png + ../Models/Dress/BlouseShoulderRightUp.png + ../Models/Dress/BlouseSkirt.png + ../Models/Dress/BlouseSkirtKneel.png + ../Models/Dress/BlouseSkirtLone.png + ../Models/Dress/BlouseSkirtLoneKneel.png + ../Models/Dress/BlouseSkirtOverKneel.png + ../Models/Dress/BlouseSkirtUnder.png + ../Models/Dress/BlouseTorso.png + ../Models/Dress/BlouseTorsoKneel.png + ../Models/Dress/BowCorset.png + ../Models/Dress/BowCorsetBow.png + ../Models/Dress/BowCorsetBust.png + ../Models/Dress/BowCorsetBustRuffle.png + ../Models/Dress/BowCorsetLong.png + ../Models/Dress/BowCorsetLongRuffle.png + ../Models/Dress/BowCorsetRuffle.png + ../Models/Dress/CroppedBlouseTorso.png + ../Models/Dress/CroppedBlouseTorsoKneel.png + ../Models/Dress/Glasses.png + ../Models/Dress/GlassesLens.png + ../Models/Dress/LaceChest.png + ../Models/Dress/LaceChestCups.png + ../Models/Dress/LaceChestDeco.png + ../Models/Dress/LaceChestDecoCrystal.png + ../Models/Dress/LaceChestDecoHardware.png + ../Models/Dress/LaceChestStripes.png + ../Models/Dress/LaceCorset.png + ../Models/Dress/LaceCorsetCrystal.png + ../Models/Dress/LaceCorsetHardware.png + ../Models/Dress/LaceCorsetStripes.png + ../Models/Dress/LaceCrotchPanel.png + ../Models/Dress/LaceCrotchPanelLace.png + ../Models/Dress/LaceCrotchPanelTrim.png + ../Models/Dress/MageBra.png + ../Models/Dress/MageBraStripes.png + ../Models/Dress/MageCollar.png + ../Models/Dress/MageCollarCrystal.png + ../Models/Dress/MageCollarHardware.png + ../Models/Dress/MageCollarTie.png + ../Models/Dress/MageCorset.png + ../Models/Dress/MageCorsetStripes.png + ../Models/Dress/MageSkirt.png + ../Models/Dress/MageSkirtCrotchStrap.png + ../Models/Dress/MageSkirtKneel.png + ../Models/Dress/MageSkirtKneelCrotchStrap.png + ../Models/Dress/MageSkirtOverKneel.png + ../Models/Dress/MageSkirtOverKneelCrotchStrap.png + ../Models/Dress/MonocleLeft.png + ../Models/Dress/MonocleLensLeft.png + ../Models/Dress/MonocleLensRight.png + ../Models/Dress/MonocleRight.png + ../Models/Dress/ShoeLeftClosed.png + ../Models/Dress/ShoeLeftHogtie.png + ../Models/Dress/ShoeLeftKneel.png + ../Models/Dress/ShoeLeftKneelClosed.png + ../Models/Dress/ShoeLeftSpread.png + ../Models/Dress/ShoeRightClosed.png + ../Models/Dress/ShoeRightKneel.png + ../Models/Dress/ShoeRightSpread.png + ../Models/Dress/Skirt.png + ../Models/Dress/SkirtClosed.png + ../Models/Dress/SkirtClosedCrotchStrap.png + ../Models/Dress/SkirtCrotchStrap.png + ../Models/Dress/SkirtKneel.png + ../Models/Dress/SkirtKneelCrotchStrap.png + ../Models/Dress/SkirtOverKneel.png + ../Models/Dress/SkirtOverKneelCrotchStrap.png + ../Models/Dress/SkirtSplit.png + ../Models/Dress/SkirtSplitBelt.png + ../Models/Dress/SkirtSplitClosed.png + ../Models/Dress/SkirtSplitKneel.png + ../Models/Dress/SkirtSplitOverKneel.png + ../Models/Ears/Earrings.png + ../Models/Ears/EarringsBack.png + ../Models/Ears/ElfBack.png + ../Models/Ears/ElfEarringsBack.png + ../Models/Ears/ElfEarringsFront.png + ../Models/Ears/ElfFloppyBack.png + ../Models/Ears/ElfFloppyFront.png + ../Models/Ears/ElfFront.png + ../Models/Ears/ElfLongBack.png + ../Models/Ears/ElfLongFront.png + ../Models/Ears/Fox.png + ../Models/Ears/FoxInner.png + ../Models/Ears/Kitty.png + ../Models/Ears/KittyInner.png + ../Models/Ears/Wolf.png + ../Models/Ears/WolfInner.png + ../Models/Elf/BandLeftBoxtie.png + ../Models/Elf/BandLeftFree.png + ../Models/Elf/BandLeftUp.png + ../Models/Elf/BandLeftWristtie.png + ../Models/Elf/BandLeftYoked.png + ../Models/Elf/BandRightBoxtie.png + ../Models/Elf/BandRightFree.png + ../Models/Elf/BandRightFront.png + ../Models/Elf/BandRightUp.png + ../Models/Elf/BandRightWristtie.png + ../Models/Elf/BandRightYoked.png + ../Models/Elf/Bra.png + ../Models/Elf/Chest.png + ../Models/Elf/Circlet.png + ../Models/Elf/CircletGem.png + ../Models/Elf/Collar.png + ../Models/Elf/CollarHardware.png + ../Models/Elf/CrystalShoeLeftClosed.png + ../Models/Elf/CrystalShoeLeftSpread.png + ../Models/Elf/CrystalShoeRightClosed.png + ../Models/Elf/CrystalShoeRightSpread.png + ../Models/Elf/Panties.png + ../Models/Elf/ShoeLeftClosed.png + ../Models/Elf/ShoeLeftHogtie.png + ../Models/Elf/ShoeLeftKneel.png + ../Models/Elf/ShoeLeftSpread.png + ../Models/Elf/ShoeRightClosed.png + ../Models/Elf/ShoeRightKneel.png + ../Models/Elf/ShoeRightSpread.png + ../Models/Elf/Skirt.png + ../Models/Elf/SkirtBack.png + ../Models/Elf/SkirtBackKneel.png + ../Models/Elf/SkirtBand.png + ../Models/Elf/SkirtBandKneel.png + ../Models/Elf/SkirtCrotchStrap.png + ../Models/Elf/SkirtKneel.png + ../Models/Elf/SkirtKneelCrotchStrap.png + ../Models/Expressions/Fear.png + ../Models/Expressions/Tears_Light.png + ../Models/EyesKertasu/EyesWhitesAngry.png + ../Models/EyesKertasu/EyesWhitesBase.png + ../Models/EyesKertasu/EyesWhitesClosed.png + ../Models/EyesKertasu/EyesWhitesDazed.png + ../Models/EyesKertasu/EyesWhitesNeutral.png + ../Models/EyesKertasu/EyesWhitesSurprised.png + ../Models/FaceKjus/Brows2Angry.png + ../Models/Festive/BinderFluffLeftBoxtie.png + ../Models/Festive/BinderFluffLeftWristtie.png + ../Models/Festive/BinderLeftBoxtie.png + ../Models/Festive/BinderLeftWristtie.png + ../Models/Festive/BinderRightBoxtie.png + ../Models/Festive/BinderStrapLeftBoxtie.png + ../Models/Festive/BinderStrapLeftWristtie.png + ../Models/Festive/ButtonsBot.png + ../Models/Festive/ButtonsMid.png + ../Models/Festive/ButtonsTop.png + ../Models/Festive/ButtonsTopTied.png + ../Models/Festive/ButtonsTopUp.png + ../Models/Festive/ButtonsUnderbust.png + ../Models/Festive/ButtonsUnderbustOver.png + ../Models/Festive/Fluff.png + ../Models/Festive/FluffHogtie.png + ../Models/Festive/FuzzBot.png + ../Models/Festive/FuzzBotClosed.png + ../Models/Festive/FuzzMid.png + ../Models/Festive/FuzzTop.png + ../Models/Festive/FuzzTopTied.png + ../Models/Festive/FuzzTopUp.png + ../Models/Festive/FuzzUnderbust.png + ../Models/Festive/FuzzUnderbustOver.png + ../Models/Festive/HardwareUnderbust.png + ../Models/Festive/Hat.png + ../Models/Festive/HatBackHogtie.png + ../Models/Festive/HatHogtie.png + ../Models/Festive/Orb.png + ../Models/Festive/OrbHogtie.png + ../Models/Festive/StrapBot.png + ../Models/Festive/StrapBotClosed.png + ../Models/Festive/StrapMid.png + ../Models/Festive/StrapOverbust.png + ../Models/Festive/StrapTop.png + ../Models/Festive/StrapTopTied.png + ../Models/Festive/StrapTopUp.png + ../Models/Festive/StrapUnderbust.png + ../Models/Fiddle/BackFiddleBody.png + ../Models/Fiddle/BackFiddleLines.png + ../Models/Fiddle/FiddleBody.png + ../Models/Fiddle/FiddleLines.png + ../Models/Fiddle/FiddleLock.png + ../Models/Furniture/Barrel.png + ../Models/Furniture/Bed.png + ../Models/Furniture/BedHogtie.png + ../Models/Furniture/BedStraps.png + ../Models/Furniture/BedStrapsHogtie.png + ../Models/Furniture/BedStrapsHogtieBoxtie.png + ../Models/Furniture/CageBack.png + ../Models/Furniture/CageFront.png + ../Models/Furniture/DisplayFront.png + ../Models/Furniture/DisplayFrontHogtie.png + ../Models/Furniture/LatexCube.png + ../Models/Furniture/LatexCubeBack.png + ../Models/Furniture/OneBarBackClosed.png + ../Models/Furniture/OneBarBackClosedHeels.png + ../Models/Furniture/OneBarBackSpread.png + ../Models/Furniture/OneBarBackSpreadHeels.png + ../Models/Furniture/OneBarFrontClosed.png + ../Models/Furniture/OneBarFrontClosedHeels.png + ../Models/Furniture/OneBarFrontSpread.png + ../Models/Furniture/OneBarFrontSpreadHeels.png + ../Models/Furniture/OneBarTopClosed.png + ../Models/Furniture/OneBarTopClosedHeels.png + ../Models/Furniture/OneBarTopSpread.png + ../Models/Furniture/OneBarTopSpreadHeels.png + ../Models/Furniture/SarcoBack.png + ../Models/Furniture/SarcoFront.png + ../Models/Furniture/SarcoWebs.png + ../Models/FutureBox/Back.png + ../Models/FutureBox/BackFade.png + ../Models/FutureBox/Display.png + ../Models/FutureBox/Door.png + ../Models/FutureBox/DoorNumeral.png + ../Models/FutureBox/DoorWindow.png + ../Models/FutureBox/Lock.png + ../Models/FutureBox/Rim.png + ../Models/FutureHarness/DisplayChest.png + ../Models/FutureHarness/DisplayLower.png + ../Models/FutureHarness/DisplayMid.png + ../Models/FutureHarness/LockChest.png + ../Models/FutureHarness/LockLower.png + ../Models/FutureHarness/LockMid.png + ../Models/FutureHarness/MetalChest.png + ../Models/FutureHarness/MetalLower.png + ../Models/FutureHarness/MetalMid.png + ../Models/FutureHarness/StrapsChest.png + ../Models/FutureHarness/StrapsLower.png + ../Models/FutureHarness/StrapsLowerSpread.png + ../Models/FutureHarness/StrapsMid.png + ../Models/GagLatex/NeckCorset.png + ../Models/GagLatex/NeckCorsetRim.png + ../Models/GagLeather/CrystalGagNecklaceBall.png + ../Models/GagLeather/GagNecklace.png + ../Models/GagLeather/GagNecklaceBall.png + ../Models/Gothic/Buttons.png + ../Models/Gothic/HemLower.png + ../Models/Gothic/HemLowerBackCrotchStrap.png + ../Models/Gothic/HemLowerCrotchStrap.png + ../Models/Gothic/HemLowerKneel.png + ../Models/Gothic/HemLowerKneelCrotchStrap.png + ../Models/Gothic/HemUpper.png + ../Models/Gothic/HemUpperCrotchStrap.png + ../Models/Gothic/HemUpperKneel.png + ../Models/Gothic/HemUpperKneelCrotchStrap..png + ../Models/Gothic/LaceLower.png + ../Models/Gothic/LaceLowerCrotchStrap.png + ../Models/Gothic/LaceLowerKneel.png + ../Models/Gothic/LaceLowerKneelCrotchStrap..png + ../Models/Gothic/LaceUpper.png + ../Models/Gothic/LaceUpperCrotchStrap.png + ../Models/Gothic/LaceUpperKneel.png + ../Models/Gothic/LaceUpperKneelCrotchStrap..png + ../Models/Gothic/Lines.png + ../Models/Gothic/LinesCrotchStrap.png + ../Models/Gothic/LinesKneel.png + ../Models/Gothic/LinesKneelCrotchStrap..png + ../Models/Gothic/Skirt.png + ../Models/Gothic/SkirtCrotchStrap.png + ../Models/Gothic/SkirtKneel.png + ../Models/Gothic/SkirtKneelCrotchStrap.png + ../Models/Gothic/WaistbandClips.png + ../Models/Hair/Ahoge.png + ../Models/Hair/BackFlat.png + ../Models/Hair/BackShort.png + ../Models/Hair/BackShortCurly.png + ../Models/Hair/BackShortCurlyUnderlight.png + ../Models/Hair/BackShortMessy.png + ../Models/Hair/BackShortMessyUnderlight.png + ../Models/Hair/BackStraight.png + ../Models/Hair/BigBraidBack.png + ../Models/Hair/Bob.png + ../Models/Hair/BobFront.png + ../Models/Hair/Bow.png + ../Models/Hair/BowFrills.png + ../Models/Hair/Braid.png + ../Models/Hair/BraidBack.png + ../Models/Hair/BraidCustom.png + ../Models/Hair/BraidCustomBack.png + ../Models/Hair/BraidCustomBraid.png + ../Models/Hair/BraidCustom_Overstrap.png + ../Models/Hair/Braid_Overstrap.png + ../Models/Hair/Curly.png + ../Models/Hair/CurlyPonytail.png + ../Models/Hair/Curly_Overstrap.png + ../Models/Hair/DrillLeft.png + ../Models/Hair/DrillRight.png + ../Models/Hair/FrontLongBang.png + ../Models/Hair/FrontStraight.png + ../Models/Hair/FrontStraight2.png + ../Models/Hair/FrontStraight2_Front.png + ../Models/Hair/FrontStraight2_Overstrap.png + ../Models/Hair/FrontStraight_Overstrap.png + ../Models/Hair/FrontSwept.png + ../Models/Hair/FrontSweptSide.png + ../Models/Hair/Fuzzy.png + ../Models/Hair/Fuzzy_Overstrap.png + ../Models/Hair/Hairband.png + ../Models/Hair/HimeBack.png + ../Models/Hair/MaidFrill.png + ../Models/Hair/MaidHairband.png + ../Models/Hair/Messy.png + ../Models/Hair/Ponytail.png + ../Models/Hair/Ponytail2.png + ../Models/Hair/Straight.png + ../Models/Hair/StraightBangs.png + ../Models/Hair/StraightBangs_Overstrap.png + ../Models/Hair/Straight_Overstrap.png + ../Models/Hair/TwintailLeft.png + ../Models/Hair/TwintailRight.png + ../Models/Hair/VentL.png + ../Models/Hair/VentR.png + ../Models/Hair/Vents.png + ../Models/Hair/VentsFront.png + ../Models/Hair/VentsInnerL.png + ../Models/Hair/VentsInnerR.png + ../Models/Hair2/BlondeBack.png + ../Models/Hair2/BlondeBackM.png + ../Models/Hair2/BlondeBangs.png + ../Models/Hair2/BlondeBangsM.png + ../Models/Hair2/BlondeFront.png + ../Models/Hair2/BlondeFrontM.png + ../Models/Hair2/Hair2_Front.png + ../Models/Hair2/Hair2_FrontB.png + ../Models/Hair2/Hair2_FrontC.png + ../Models/Hair2/Hair2_Left.png + ../Models/Hair2/Hair2_Right.png + ../Models/Hair2/Hair3_Back.png + ../Models/Hair2/Hair3_FrontA.png + ../Models/Hair2/Hair3_FrontB.png + ../Models/Hair2/Hair3_FrontC.png + ../Models/Hair2/Hair3_FrontD.png + ../Models/Hair2/Hair3_FrontE.png + ../Models/Hair2/Hair4_Front.png + ../Models/Hair2/Hair4_FrontB.png + ../Models/Hair2/Hair4_Left.png + ../Models/Hair2/Hair4_LeftB.png + ../Models/Hair2/Hair4_Right.png + ../Models/Hair2/Hair4_RightB.png + ../Models/Hair2/Hair5_Front.png + ../Models/Hair2/Hair5_FrontB.png + ../Models/Hair2/Hair5_FrontC.png + ../Models/Hair2/Hair5_FrontD.png + ../Models/Hair2/Hair5_FrontE.png + ../Models/Hair2/Hair5_Left.png + ../Models/Hair2/Hair5_Right.png + ../Models/Hair2/Hair6_Front.png + ../Models/Hair2/Hair6_FrontB.png + ../Models/Hair2/Hair6_Left.png + ../Models/Hair2/Hair6_Right.png + ../Models/Hair2/HairAura.png + ../Models/Hair2/HairAura_Front.png + ../Models/Hair2/HairAura_Left.png + ../Models/Hair2/HairAura_LeftB.png + ../Models/Hair2/HairAura_Right.png + ../Models/Hair2/HairAura_RightB.png + ../Models/Handcuffs/CuffsLockFront.png + ../Models/Handcuffs/HandCuffsFront.png + ../Models/Handcuffs/HingedCuffsFront.png + ../Models/Handcuffs/Irish8AnkleLeftClosed.png + ../Models/Handcuffs/Irish8AnkleLeftKneelClosed.png + ../Models/Handcuffs/Irish8AnkleRightClosed.png + ../Models/Handcuffs/Irish8CuffsFront.png + ../Models/Handcuffs/LegironsLeftClosed.png + ../Models/Handcuffs/LegironsLeftKneel.png + ../Models/Handcuffs/LegironsLeftKneelClosed.png + ../Models/Handcuffs/LegironsLeftSpread.png + ../Models/Handcuffs/LegironsRightClosed.png + ../Models/Handcuffs/LegironsRightSpread.png + ../Models/Handcuffs/ThumbcuffsFront.png + ../Models/Handcuffs/WolfCuffsChainFront.png + ../Models/Handcuffs/WolfCuffsFront.png + ../Models/Harness/BeltsMid.png + ../Models/Harness/BeltsOverbust.png + ../Models/Harness/BeltsStrap.png + ../Models/Harness/BeltsStrapClosed.png + ../Models/Harness/BeltsTopBoxtie.png + ../Models/Harness/BeltsTopFree.png + ../Models/Harness/BeltsTopUp.png + ../Models/Harness/BeltsTopWristtie.png + ../Models/Harness/BeltsTopYoked.png + ../Models/Harness/BeltsUnderbust.png + ../Models/Harness/HardwareMid.png + ../Models/Harness/HardwareStrap.png + ../Models/Harness/HardwareTop.png + ../Models/Harness/HardwareUnderbust.png + ../Models/Harness/HardwareUnderbustOver.png + ../Models/Hat/BowHeadband.png + ../Models/Hat/BowHeadbandFrill.png + ../Models/Hat/Hat.png + ../Models/Hat/HatBack.png + ../Models/Hat/HatTop.png + ../Models/Hat/Headband.png + ../Models/Hat/HeadbandBand.png + ../Models/Hat/HeadbandBow.png + ../Models/Hat/HeadbandFrill.png + ../Models/Hat/Ribbon.png + ../Models/Hat/TopHatSmall.png + ../Models/Hat/TopHatSmallBow.png + ../Models/Heels/BalletLaceLeftClosed.png + ../Models/Heels/BalletLaceLeftSpread.png + ../Models/Heels/BalletLaceRightClosed.png + ../Models/Heels/BalletLaceRightSpread.png + ../Models/Heels/BalletLeftClosed.png + ../Models/Heels/BalletLeftHogtie.png + ../Models/Heels/BalletLeftKneel.png + ../Models/Heels/BalletLeftKneelClosed.png + ../Models/Heels/BalletLeftSpread.png + ../Models/Heels/BalletRightClosed.png + ../Models/Heels/BalletRightKneel.png + ../Models/Heels/BalletRightSpread.png + ../Models/Heels/BalletSoleLeftClosed.png + ../Models/Heels/BalletSoleLeftHogtie.png + ../Models/Heels/BalletSoleLeftKneel.png + ../Models/Heels/BalletSoleLeftKneelClosed.png + ../Models/Heels/BalletSoleLeftSpread.png + ../Models/Heels/BalletSoleRightClosed.png + ../Models/Heels/BalletSoleRightKneel.png + ../Models/Heels/BalletSoleRightSpread.png + ../Models/Heels/FlatBalletLeftClosed.png + ../Models/Heels/FlatBalletLeftHogtie.png + ../Models/Heels/FlatBalletLeftKneel.png + ../Models/Heels/FlatBalletLeftKneelClosed.png + ../Models/Heels/FlatBalletLeftSpread.png + ../Models/Heels/FlatBalletRightClosed.png + ../Models/Heels/FlatBalletRightKneel.png + ../Models/Heels/FlatBalletRightSpread.png + ../Models/Heels/LeatherLeftClosed.png + ../Models/Heels/LeatherLeftHogtie.png + ../Models/Heels/LeatherLeftKneel.png + ../Models/Heels/LeatherLeftKneelClosed.png + ../Models/Heels/LeatherLeftSpread.png + ../Models/Heels/LeatherLegLeftHogtie.png + ../Models/Heels/LeatherLegRightHogtie.png + ../Models/Heels/LeatherLegRightKneel.png + ../Models/Heels/LeatherLegRightKneelClosed.png + ../Models/Heels/LeatherRightClosed.png + ../Models/Heels/LeatherRightHogtie.png + ../Models/Heels/LeatherRightKneel.png + ../Models/Heels/LeatherRightSpread.png + ../Models/Heels/ShinyBalletLeftClosed.png + ../Models/Heels/ShinyBalletLeftHogtie.png + ../Models/Heels/ShinyBalletLeftKneel.png + ../Models/Heels/ShinyBalletLeftKneelClosed.png + ../Models/Heels/ShinyBalletLeftSpread.png + ../Models/Heels/ShinyBalletRightClosed.png + ../Models/Heels/ShinyBalletRightKneel.png + ../Models/Heels/ShinyBalletRightSpread.png + ../Models/Heels/TallLeftClosed.png + ../Models/Heels/TallLeftHogtie.png + ../Models/Heels/TallLeftKneel.png + ../Models/Heels/TallLeftKneelClosed.png + ../Models/Heels/TallLeftSpread.png + ../Models/Heels/TallLegLeftHogtie.png + ../Models/Heels/TallLegLeftKneel.png + ../Models/Heels/TallLegLeftKneelClosed.png + ../Models/Heels/TallLegRightHogtie.png + ../Models/Heels/TallLegRightKneel.png + ../Models/Heels/TallLegRightKneelClosed.png + ../Models/Heels/TallRightClosed.png + ../Models/Heels/TallRightHogtie.png + ../Models/Heels/TallRightKneel.png + ../Models/Heels/TallRightSpread.png + ../Models/Jacket/ArmsBoxtie.png + ../Models/Jacket/ArmsCrossed.png + ../Models/Jacket/ArmsWristtie.png + ../Models/Jacket/BeltsArmsBoxtie.png + ../Models/Jacket/BeltsArmsCrossed.png + ../Models/Jacket/BeltsArmsWristtie.png + ../Models/Jacket/BeltsChestBoxtie.png + ../Models/Jacket/BeltsChestCrossed.png + ../Models/Jacket/BeltsChestWristtie.png + ../Models/Jacket/BeltsTorsoLower.png + ../Models/Jacket/BeltsTorsoLowerBoxtie.png + ../Models/Jacket/BeltsTorsoLowerCrossed.png + ../Models/Jacket/BeltsTorsoLowerWristtie.png + ../Models/Jacket/BinderTorsoLower.png + ../Models/Jacket/ChestBoleroBoxtie.png + ../Models/Jacket/ChestBoleroCrossed.png + ../Models/Jacket/ChestBoleroWristtie.png + ../Models/Jacket/ChestBoxtie.png + ../Models/Jacket/ChestCrossed.png + ../Models/Jacket/ChestWristtie.png + ../Models/Jacket/Crotch.png + ../Models/Jacket/CrotchBeltExtra.png + ../Models/Jacket/CrotchBelts.png + ../Models/Jacket/CrotchlessBinderTorsoLower.png + ../Models/Jacket/LatexBand.png + ../Models/Jacket/LatexChest.png + ../Models/Jacket/LatexLower.png + ../Models/Jacket/LatexUpper.png + ../Models/Jacket/StrapsArmsBoxtie.png + ../Models/Jacket/StrapsArmsCrossed.png + ../Models/Jacket/StrapsArmsWristtie.png + ../Models/Jacket/StrapsChestBoxtie.png + ../Models/Jacket/StrapsChestCrossed.png + ../Models/Jacket/StrapsChestExtra.png + ../Models/Jacket/StrapsChestWristtie.png + ../Models/Jacket/StrapsTorsoLowerBoxtie.png + ../Models/Jacket/StrapsTorsoLowerCrossed.png + ../Models/Jacket/StrapsTorsoLowerExtra.png + ../Models/Jacket/StrapsTorsoLowerWristtie.png + ../Models/Jacket/StrapsUnderbust.png + ../Models/Jacket/TorsoLower.png + ../Models/Jacket/TorsoLowerCrossed.png + ../Models/Kigu/Brows.png + ../Models/Kigu/Eyes.png + ../Models/Kigu/Eyes2.png + ../Models/Kigu/EyesWhites.png + ../Models/Kigu/Lock.png + ../Models/Kigu/Mask.png + ../Models/Kigu/MaskGag.png + ../Models/Kigu/Mouth.png + ../Models/KittyLatex/KittyLatexEar.png + ../Models/KittyLatex/KittyLatexEarLight.png + ../Models/KittyLatex/KittyLatexEarMuff.png + ../Models/KittyLatex/KittyLatexEarMuffLight1.png + ../Models/KittyLatex/KittyLatexEarMuffLight2.png + ../Models/KittyLatex/KittyLatexTail.png + ../Models/KittyLatex/KittyLatexTail2.png + ../Models/KittyLatex/KittyLatexTail2Light.png + ../Models/KittyLatex/KittyLatexTailLight.png + ../Models/KittyPawCuffs/AnkleLeftClosed.png + ../Models/KittyPawCuffs/AnkleLeftKneel.png + ../Models/KittyPawCuffs/AnkleLeftKneelClosed.png + ../Models/KittyPawCuffs/AnkleLeftSpread.png + ../Models/KittyPawCuffs/AnkleRightClosed.png + ../Models/KittyPawCuffs/AnkleRightSpread.png + ../Models/KittyPawCuffs/BandAnkleLeftClosed.png + ../Models/KittyPawCuffs/BandAnkleLeftKneel.png + ../Models/KittyPawCuffs/BandAnkleLeftKneelClosed.png + ../Models/KittyPawCuffs/BandAnkleLeftSpread.png + ../Models/KittyPawCuffs/BandAnkleRightClosed.png + ../Models/KittyPawCuffs/BandAnkleRightSpread.png + ../Models/KittyPawCuffs/BandElbowLeftBoxtie.png + ../Models/KittyPawCuffs/BandElbowLeftFree.png + ../Models/KittyPawCuffs/BandElbowLeftFront.png + ../Models/KittyPawCuffs/BandElbowLeftUp.png + ../Models/KittyPawCuffs/BandElbowLeftWristtie.png + ../Models/KittyPawCuffs/BandElbowLeftYoked.png + ../Models/KittyPawCuffs/BandElbowRightBoxtie.png + ../Models/KittyPawCuffs/BandElbowRightCrossed.png + ../Models/KittyPawCuffs/BandElbowRightFront.png + ../Models/KittyPawCuffs/BandElbowRightUp.png + ../Models/KittyPawCuffs/BandElbowRightWristtie.png + ../Models/KittyPawCuffs/BandElbowRightYoked.png + ../Models/KittyPawCuffs/BandThighLeftClosed.png + ../Models/KittyPawCuffs/BandThighLeftKneel.png + ../Models/KittyPawCuffs/BandThighLeftKneelClosed.png + ../Models/KittyPawCuffs/BandThighLeftSpread.png + ../Models/KittyPawCuffs/BandThighRightClosed.png + ../Models/KittyPawCuffs/BandThighRightKneel.png + ../Models/KittyPawCuffs/BandThighRightKneelClosed.png + ../Models/KittyPawCuffs/BandThighRightSpread.png + ../Models/KittyPawCuffs/BandWristLeftFree.png + ../Models/KittyPawCuffs/BandWristLeftFront.png + ../Models/KittyPawCuffs/BandWristLeftYoked.png + ../Models/KittyPawCuffs/BandWristRightCrossed.png + ../Models/KittyPawCuffs/BandWristRightFree.png + ../Models/KittyPawCuffs/BandWristRightFront.png + ../Models/KittyPawCuffs/BandWristRightYoked.png + ../Models/KittyPawCuffs/ElbowLeftBoxtie.png + ../Models/KittyPawCuffs/ElbowLeftCrossed.png + ../Models/KittyPawCuffs/ElbowLeftFree.png + ../Models/KittyPawCuffs/ElbowLeftFront.png + ../Models/KittyPawCuffs/ElbowLeftUp.png + ../Models/KittyPawCuffs/ElbowLeftWristtie.png + ../Models/KittyPawCuffs/ElbowLeftYoked.png + ../Models/KittyPawCuffs/ElbowRightBoxtie.png + ../Models/KittyPawCuffs/ElbowRightCrossed.png + ../Models/KittyPawCuffs/ElbowRightFront.png + ../Models/KittyPawCuffs/ElbowRightUp.png + ../Models/KittyPawCuffs/ElbowRightWristtie.png + ../Models/KittyPawCuffs/ElbowRightYoked.png + ../Models/KittyPawCuffs/LockAnkleLeftClosed.png + ../Models/KittyPawCuffs/LockAnkleLeftKneel.png + ../Models/KittyPawCuffs/LockAnkleLeftKneelClosed.png + ../Models/KittyPawCuffs/LockAnkleLeftSpread.png + ../Models/KittyPawCuffs/LockAnkleRightClosed.png + ../Models/KittyPawCuffs/LockAnkleRightSpread.png + ../Models/KittyPawCuffs/LockElbowLeftBoxtie.png + ../Models/KittyPawCuffs/LockElbowLeftFree.png + ../Models/KittyPawCuffs/LockElbowLeftFront.png + ../Models/KittyPawCuffs/LockElbowLeftUp.png + ../Models/KittyPawCuffs/LockElbowLeftWristtie.png + ../Models/KittyPawCuffs/LockElbowLeftYoked.png + ../Models/KittyPawCuffs/LockElbowRightBoxtie.png + ../Models/KittyPawCuffs/LockElbowRightCrossed.png + ../Models/KittyPawCuffs/LockElbowRightFront.png + ../Models/KittyPawCuffs/LockElbowRightUp.png + ../Models/KittyPawCuffs/LockElbowRightWristtie.png + ../Models/KittyPawCuffs/LockElbowRightYoked.png + ../Models/KittyPawCuffs/LockThighLeftClosed.png + ../Models/KittyPawCuffs/LockThighLeftKneel.png + ../Models/KittyPawCuffs/LockThighLeftKneelClosed.png + ../Models/KittyPawCuffs/LockThighLeftSpread.png + ../Models/KittyPawCuffs/LockThighRightClosed.png + ../Models/KittyPawCuffs/LockThighRightKneel.png + ../Models/KittyPawCuffs/LockThighRightKneelClosed.png + ../Models/KittyPawCuffs/LockThighRightSpread.png + ../Models/KittyPawCuffs/LockWristLeftFree.png + ../Models/KittyPawCuffs/LockWristLeftFront.png + ../Models/KittyPawCuffs/LockWristLeftYoked.png + ../Models/KittyPawCuffs/LockWristRightCrossed.png + ../Models/KittyPawCuffs/LockWristRightFree.png + ../Models/KittyPawCuffs/LockWristRightFront.png + ../Models/KittyPawCuffs/LockWristRightYoked.png + ../Models/KittyPawCuffs/ThighLeftClosed.png + ../Models/KittyPawCuffs/ThighLeftKneel.png + ../Models/KittyPawCuffs/ThighLeftKneelClosed.png + ../Models/KittyPawCuffs/ThighLeftSpread.png + ../Models/KittyPawCuffs/ThighRightClosed.png + ../Models/KittyPawCuffs/ThighRightKneel.png + ../Models/KittyPawCuffs/ThighRightKneelClosed.png + ../Models/KittyPawCuffs/ThighRightSpread.png + ../Models/KittyPawCuffs/WristLeftFree.png + ../Models/KittyPawCuffs/WristLeftFront.png + ../Models/KittyPawCuffs/WristLeftYoked.png + ../Models/KittyPawCuffs/WristRightCrossed.png + ../Models/KittyPawCuffs/WristRightFree.png + ../Models/KittyPawCuffs/WristRightFront.png + ../Models/KittyPawCuffs/WristRightYoked.png + ../Models/KittyPet/Band.png + ../Models/KittyPet/Blindfold.png + ../Models/KittyPet/BlindfoldBrow.png + ../Models/KittyPet/BlindfoldRim.png + ../Models/KittyPet/BlindfoldSmall.png + ../Models/KittyPet/BlindfoldSmallStrap.png + ../Models/KittyPet/BlindfoldStich.png + ../Models/KittyPet/BlindfoldStrap.png + ../Models/KittyPet/Collar.png + ../Models/KittyPet/CollarDeco.png + ../Models/KittyPet/CollarDecoSymbol.png + ../Models/KittyPet/CollarStripe.png + ../Models/KittyPet/EarmuffersL.png + ../Models/KittyPet/EarmuffersR.png + ../Models/KittyPet/Ears1InnerL.png + ../Models/KittyPet/Ears1InnerR.png + ../Models/KittyPet/Ears1L.png + ../Models/KittyPet/Ears1R.png + ../Models/KittyPet/Ears2InnerL.png + ../Models/KittyPet/Ears2InnerR.png + ../Models/KittyPet/Ears2L.png + ../Models/KittyPet/Ears2R.png + ../Models/KittyPet/Gag.png + ../Models/KittyPet/GagCollar.png + ../Models/KittyPet/GagMouth.png + ../Models/KittyPet/GagMouthSeamless.png + ../Models/KittyPet/GagSeamless.png + ../Models/KittyPet/HeadHarness.png + ../Models/KittyPet/HeadHarnessRing.png + ../Models/KittyPet/Leotard.png + ../Models/KittyPet/LeotardChest.png + ../Models/KittyPet/LeotardChestCollar.png + ../Models/KittyPet/LeotardChestCollarLeft.png + ../Models/KittyPet/LeotardChestCollarLeftTied.png + ../Models/KittyPet/LeotardChestCollarStripes.png + ../Models/KittyPet/LeotardChestCollarStripesLeft.png + ../Models/KittyPet/LeotardChestCollarStripesLeftTied.png + ../Models/KittyPet/LeotardChestCollarStripesUp.png + ../Models/KittyPet/LeotardChestCollarUp.png + ../Models/KittyPet/LeotardChestStripes.png + ../Models/KittyPet/LeotardChestTied.png + ../Models/KittyPet/LeotardChestUp.png + ../Models/KittyPet/LeotardClosed.png + ../Models/KittyPet/LeotardStripes.png + ../Models/KittyPet/ShoulderCuffLeft.png + ../Models/KittyPet/ShoulderCuffRight.png + ../Models/KittyPet/ShoulderCuffStripeLeft.png + ../Models/KittyPet/ShoulderCuffStripeRight.png + ../Models/KittyPet/Tail.png + ../Models/KittyPet/TailStripe.png + ../Models/KittyPetCuffs/AnkleLeftClosed.png + ../Models/KittyPetCuffs/AnkleLeftKneel.png + ../Models/KittyPetCuffs/AnkleLeftKneelClosed.png + ../Models/KittyPetCuffs/AnkleLeftSpread.png + ../Models/KittyPetCuffs/AnkleRightClosed.png + ../Models/KittyPetCuffs/AnkleRightSpread.png + ../Models/KittyPetCuffs/BandAnkleLeftClosed.png + ../Models/KittyPetCuffs/BandAnkleLeftKneel.png + ../Models/KittyPetCuffs/BandAnkleLeftKneelClosed.png + ../Models/KittyPetCuffs/BandAnkleLeftSpread.png + ../Models/KittyPetCuffs/BandAnkleRightClosed.png + ../Models/KittyPetCuffs/BandAnkleRightSpread.png + ../Models/KittyPetCuffs/BandCollar.png + ../Models/KittyPetCuffs/BandElbowLeftBoxtie.png + ../Models/KittyPetCuffs/BandElbowLeftFree.png + ../Models/KittyPetCuffs/BandElbowLeftFront.png + ../Models/KittyPetCuffs/BandElbowLeftUp.png + ../Models/KittyPetCuffs/BandElbowLeftWristtie.png + ../Models/KittyPetCuffs/BandElbowLeftYoked.png + ../Models/KittyPetCuffs/BandElbowRightBoxtie.png + ../Models/KittyPetCuffs/BandElbowRightCrossed.png + ../Models/KittyPetCuffs/BandElbowRightFront.png + ../Models/KittyPetCuffs/BandElbowRightUp.png + ../Models/KittyPetCuffs/BandElbowRightWristtie.png + ../Models/KittyPetCuffs/BandElbowRightYoked.png + ../Models/KittyPetCuffs/BandThighLeftClosed.png + ../Models/KittyPetCuffs/BandThighLeftKneel.png + ../Models/KittyPetCuffs/BandThighLeftKneelClosed.png + ../Models/KittyPetCuffs/BandThighLeftSpread.png + ../Models/KittyPetCuffs/BandThighRightClosed.png + ../Models/KittyPetCuffs/BandThighRightKneel.png + ../Models/KittyPetCuffs/BandThighRightKneelClosed.png + ../Models/KittyPetCuffs/BandThighRightSpread.png + ../Models/KittyPetCuffs/BandWristLeftFree.png + ../Models/KittyPetCuffs/BandWristLeftFront.png + ../Models/KittyPetCuffs/BandWristLeftYoked.png + ../Models/KittyPetCuffs/BandWristRightCrossed.png + ../Models/KittyPetCuffs/BandWristRightFree.png + ../Models/KittyPetCuffs/BandWristRightFront.png + ../Models/KittyPetCuffs/BandWristRightYoked.png + ../Models/KittyPetCuffs/Collar.png + ../Models/KittyPetCuffs/ElbowLeftBoxtie.png + ../Models/KittyPetCuffs/ElbowLeftCrossed.png + ../Models/KittyPetCuffs/ElbowLeftFree.png + ../Models/KittyPetCuffs/ElbowLeftFront.png + ../Models/KittyPetCuffs/ElbowLeftUp.png + ../Models/KittyPetCuffs/ElbowLeftWristtie.png + ../Models/KittyPetCuffs/ElbowLeftYoked.png + ../Models/KittyPetCuffs/ElbowRightBoxtie.png + ../Models/KittyPetCuffs/ElbowRightCrossed.png + ../Models/KittyPetCuffs/ElbowRightFront.png + ../Models/KittyPetCuffs/ElbowRightUp.png + ../Models/KittyPetCuffs/ElbowRightWristtie.png + ../Models/KittyPetCuffs/ElbowRightYoked.png + ../Models/KittyPetCuffs/ThighLeftClosed.png + ../Models/KittyPetCuffs/ThighLeftKneel.png + ../Models/KittyPetCuffs/ThighLeftKneelClosed.png + ../Models/KittyPetCuffs/ThighLeftSpread.png + ../Models/KittyPetCuffs/ThighRightClosed.png + ../Models/KittyPetCuffs/ThighRightKneel.png + ../Models/KittyPetCuffs/ThighRightKneelClosed.png + ../Models/KittyPetCuffs/ThighRightSpread.png + ../Models/KittyPetCuffs/WristLeftFree.png + ../Models/KittyPetCuffs/WristLeftFront.png + ../Models/KittyPetCuffs/WristLeftYoked.png + ../Models/KittyPetCuffs/WristRightCrossed.png + ../Models/KittyPetCuffs/WristRightFree.png + ../Models/KittyPetCuffs/WristRightFront.png + ../Models/KittyPetCuffs/WristRightYoked.png + ../Models/KittyPetPaws/FootLeftHogtie.png + ../Models/KittyPetPaws/FootLeftHogtiePaws.png + ../Models/KittyPetPaws/FootRightKneel.png + ../Models/KittyPetPaws/ForeGloveLeftCrossed.png + ../Models/KittyPetPaws/ForeGloveLeftFront.png + ../Models/KittyPetPaws/ForeGloveLeftPawFront.png + ../Models/KittyPetPaws/ForeGloveRightCrossed.png + ../Models/KittyPetPaws/ForeGloveRightFront.png + ../Models/KittyPetPaws/ForeGloveRightPawFront.png + ../Models/KittyPetPaws/GloveLeftBoxtie.png + ../Models/KittyPetPaws/GloveLeftCrossed.png + ../Models/KittyPetPaws/GloveLeftFree.png + ../Models/KittyPetPaws/GloveLeftFront.png + ../Models/KittyPetPaws/GloveLeftPawYoked.png + ../Models/KittyPetPaws/GloveLeftUp.png + ../Models/KittyPetPaws/GloveLeftWristtie.png + ../Models/KittyPetPaws/GloveLeftYoked.png + ../Models/KittyPetPaws/GloveRightBoxtie.png + ../Models/KittyPetPaws/GloveRightCrossed.png + ../Models/KittyPetPaws/GloveRightFree.png + ../Models/KittyPetPaws/GloveRightFront.png + ../Models/KittyPetPaws/GloveRightPawFree.png + ../Models/KittyPetPaws/GloveRightPawYoked.png + ../Models/KittyPetPaws/GloveRightUp.png + ../Models/KittyPetPaws/GloveRightWristtie.png + ../Models/KittyPetPaws/GloveRightYoked.png + ../Models/KittyPetPaws/SockLeftClosed.png + ../Models/KittyPetPaws/SockLeftHogtie.png + ../Models/KittyPetPaws/SockLeftKneel.png + ../Models/KittyPetPaws/SockLeftKneel.png.png + ../Models/KittyPetPaws/SockLeftKneelClosed.png + ../Models/KittyPetPaws/SockLeftPawsKneel.png + ../Models/KittyPetPaws/SockLeftPawsKneelClosed.png + ../Models/KittyPetPaws/SockLeftSpread.png + ../Models/KittyPetPaws/SockRightClosed.png + ../Models/KittyPetPaws/SockRightHogtie.png + ../Models/KittyPetPaws/SockRightKneel.png + ../Models/KittyPetPaws/SockRightKneelClosed.png + ../Models/KittyPetPaws/SockRightSpread.png + ../Models/KittyPetPawsShort/FootLeftHogtie.png + ../Models/KittyPetPawsShort/FootLeftHogtiePaws.png + ../Models/KittyPetPawsShort/FootRightKneel.png + ../Models/KittyPetPawsShort/SockLeftClosed.png + ../Models/KittyPetPawsShort/SockLeftHogtie.png + ../Models/KittyPetPawsShort/SockLeftKneel.png + ../Models/KittyPetPawsShort/SockLeftKneelClosed.png + ../Models/KittyPetPawsShort/SockLeftPawsKneel.png + ../Models/KittyPetPawsShort/SockLeftPawsKneelClosed.png + ../Models/KittyPetPawsShort/SockLeftSpread.png + ../Models/KittyPetPawsShort/SockRightClosed.png + ../Models/KittyPetPawsShort/SockRightHogtie.png + ../Models/KittyPetPawsShort/SockRightKneel.png + ../Models/KittyPetPawsShort/SockRightKneelClosed.png + ../Models/KittyPetPawsShort/SockRightSpread.png + ../Models/KittyPetSocks/FootLeftHogtie.png + ../Models/KittyPetSocks/FootLeftHogtiePaws.png + ../Models/KittyPetSocks/FootRightKneel.png + ../Models/KittyPetSocks/SockLeftClosed.png + ../Models/KittyPetSocks/SockLeftHogtie.png + ../Models/KittyPetSocks/SockLeftKneel.png + ../Models/KittyPetSocks/SockLeftKneelClosed.png + ../Models/KittyPetSocks/SockLeftPawsKneel.png + ../Models/KittyPetSocks/SockLeftPawsKneelClosed.png + ../Models/KittyPetSocks/SockLeftSpread.png + ../Models/KittyPetSocks/SockRightClosed.png + ../Models/KittyPetSocks/SockRightHogtie.png + ../Models/KittyPetSocks/SockRightKneel.png + ../Models/KittyPetSocks/SockRightKneelClosed.png + ../Models/KittyPetSocks/SockRightSpread.png + ../Models/KittyPetSocksShort/FootLeftHogtie.png + ../Models/KittyPetSocksShort/FootLeftHogtiePaws.png + ../Models/KittyPetSocksShort/FootRightKneel.png + ../Models/KittyPetSocksShort/SockLeftClosed.png + ../Models/KittyPetSocksShort/SockLeftHogtie.png + ../Models/KittyPetSocksShort/SockLeftKneel.png + ../Models/KittyPetSocksShort/SockLeftKneelClosed.png + ../Models/KittyPetSocksShort/SockLeftPawsKneel.png + ../Models/KittyPetSocksShort/SockLeftPawsKneelClosed.png + ../Models/KittyPetSocksShort/SockLeftSpread.png + ../Models/KittyPetSocksShort/SockRightClosed.png + ../Models/KittyPetSocksShort/SockRightHogtie.png + ../Models/KittyPetSocksShort/SockRightKneel.png + ../Models/KittyPetSocksShort/SockRightKneelClosed.png + ../Models/KittyPetSocksShort/SockRightSpread.png + ../Models/KittyPetsuit/Arms.png + ../Models/KittyPetsuit/ArmsPaws.png + ../Models/KittyPetsuit/Collar.png + ../Models/KittyPetsuit/FootLeftHogtie.png + ../Models/KittyPetsuit/FootLeftHogtiePaws.png + ../Models/KittyPetsuit/FootRightKneel.png + ../Models/KittyPetsuit/LeftLegsKneel.png + ../Models/KittyPetsuit/LeftLegsKneelClosed.png + ../Models/KittyPetsuit/LeftLegsPawsKneel.png + ../Models/KittyPetsuit/LeftLegsPawsKneelClosed.png + ../Models/KittyPetsuit/LegsHogtie.png + ../Models/KittyPetsuit/LegsKneel.png + ../Models/KittyPetsuit/LegsKneelClosed.png + ../Models/KittyPetsuit/Leotard.png + ../Models/KittyPetsuit/LeotardChest.png + ../Models/KittyPetsuit/LeotardHogtie.png + ../Models/Labcoat/CapeHogtie.png + ../Models/Labcoat/CapeKneel.png + ../Models/Labcoat/CapeSpread.png + ../Models/Labcoat/CapeYoked.png + ../Models/Labcoat/CoatHogtieFree.png + ../Models/Labcoat/CoatKneel.png + ../Models/Labcoat/CoatSpread.png + ../Models/Labcoat/CoatYoked.png + ../Models/Labcoat/ShouldersHogtie.png + ../Models/Labcoat/ShouldersHogtieFree.png + ../Models/Labcoat/ShouldersKneel.png + ../Models/Labcoat/ShouldersSpread.png + ../Models/Labcoat/ShouldersUp.png + ../Models/Labcoat/ShouldersYoked.png + ../Models/LatexPetsuit/Arms.png + ../Models/LatexPetsuit/ArmsBelts.png + ../Models/LatexPetsuit/GlowArms.png + ../Models/LatexPetsuit/GlowLeftLegsKneel.png + ../Models/LatexPetsuit/GlowLeftLegsKneelClosed.png + ../Models/LatexPetsuit/GlowLegsHogtie.png + ../Models/LatexPetsuit/GlowLegsKneel.png + ../Models/LatexPetsuit/GlowLegsKneelClosed.png + ../Models/LatexPetsuit/GlowTorso.png + ../Models/LatexPetsuit/LeftLegsBeltsKneel.png + ../Models/LatexPetsuit/LeftLegsBeltsKneelClosed.png + ../Models/LatexPetsuit/LeftLegsKneel.png + ../Models/LatexPetsuit/LeftLegsKneelClosed.png + ../Models/LatexPetsuit/LegsBeltsHogtie.png + ../Models/LatexPetsuit/LegsBeltsKneel.png + ../Models/LatexPetsuit/LegsBeltsKneelClosed.png + ../Models/LatexPetsuit/LegsHogtie.png + ../Models/LatexPetsuit/LegsKneel.png + ../Models/LatexPetsuit/LegsKneelClosed.png + ../Models/Leash/Leash.png + ../Models/Leash/LeashCollar.png + ../Models/Leash/LeashCollarHardware.png + ../Models/Leash/LeashCrossed.png + ../Models/Leash/LeashFree.png + ../Models/Leash/LeashFront.png + ../Models/Leash/LeashHogtie.png + ../Models/Leash/LeashHogtiePulled.png + ../Models/Leash/LeashKneel.png + ../Models/Leash/LeashKneelPulled.png + ../Models/Leash/LeashPulled.png + ../Models/LeatherCuffs/AnkleLeftClosed.png + ../Models/LeatherCuffs/AnkleLeftKneel.png + ../Models/LeatherCuffs/AnkleLeftKneelClosed.png + ../Models/LeatherCuffs/AnkleLeftSpread.png + ../Models/LeatherCuffs/AnkleRightClosed.png + ../Models/LeatherCuffs/AnkleRightSpread.png + ../Models/LeatherCuffs/BandAnkleLeftClosed.png + ../Models/LeatherCuffs/BandAnkleLeftKneel.png + ../Models/LeatherCuffs/BandAnkleLeftKneelClosed.png + ../Models/LeatherCuffs/BandAnkleLeftSpread.png + ../Models/LeatherCuffs/BandAnkleRightClosed.png + ../Models/LeatherCuffs/BandAnkleRightSpread.png + ../Models/LeatherCuffs/BandBelt.png + ../Models/LeatherCuffs/BandCollar.png + ../Models/LeatherCuffs/BandElbowLeftBoxtie.png + ../Models/LeatherCuffs/BandElbowLeftFree.png + ../Models/LeatherCuffs/BandElbowLeftFront.png + ../Models/LeatherCuffs/BandElbowLeftUp.png + ../Models/LeatherCuffs/BandElbowLeftWristtie.png + ../Models/LeatherCuffs/BandElbowLeftYoked.png + ../Models/LeatherCuffs/BandElbowRightBoxtie.png + ../Models/LeatherCuffs/BandElbowRightFront.png + ../Models/LeatherCuffs/BandElbowRightUp.png + ../Models/LeatherCuffs/BandElbowRightWristtie.png + ../Models/LeatherCuffs/BandElbowRightYoked.png + ../Models/LeatherCuffs/BandThighLeftClosed.png + ../Models/LeatherCuffs/BandThighLeftKneel.png + ../Models/LeatherCuffs/BandThighLeftKneelClosed.png + ../Models/LeatherCuffs/BandThighLeftSpread.png + ../Models/LeatherCuffs/BandThighRightClosed.png + ../Models/LeatherCuffs/BandThighRightKneel.png + ../Models/LeatherCuffs/BandThighRightKneelClosed.png + ../Models/LeatherCuffs/BandThighRightSpread.png + ../Models/LeatherCuffs/BandWristLeftFree.png + ../Models/LeatherCuffs/BandWristLeftFront.png + ../Models/LeatherCuffs/BandWristLeftYoked.png + ../Models/LeatherCuffs/BandWristRightCrossed.png + ../Models/LeatherCuffs/BandWristRightFree.png + ../Models/LeatherCuffs/BandWristRightFront.png + ../Models/LeatherCuffs/BandWristRightYoked.png + ../Models/LeatherCuffs/BellCollar.png + ../Models/LeatherCuffs/Belt.png + ../Models/LeatherCuffs/BowBellCollar.png + ../Models/LeatherCuffs/BowCollar.png + ../Models/LeatherCuffs/Collar.png + ../Models/LeatherCuffs/ElbowLeftBoxtie.png + ../Models/LeatherCuffs/ElbowLeftFree.png + ../Models/LeatherCuffs/ElbowLeftFront.png + ../Models/LeatherCuffs/ElbowLeftUp.png + ../Models/LeatherCuffs/ElbowLeftWristtie.png + ../Models/LeatherCuffs/ElbowLeftYoked.png + ../Models/LeatherCuffs/ElbowRightBoxtie.png + ../Models/LeatherCuffs/ElbowRightFront.png + ../Models/LeatherCuffs/ElbowRightUp.png + ../Models/LeatherCuffs/ElbowRightWristtie.png + ../Models/LeatherCuffs/ElbowRightYoked.png + ../Models/LeatherCuffs/HardwareAnkleLeftClosed.png + ../Models/LeatherCuffs/HardwareAnkleLeftKneel.png + ../Models/LeatherCuffs/HardwareAnkleLeftKneelClosed.png + ../Models/LeatherCuffs/HardwareAnkleLeftSpread.png + ../Models/LeatherCuffs/HardwareAnkleRightClosed.png + ../Models/LeatherCuffs/HardwareAnkleRightSpread.png + ../Models/LeatherCuffs/HardwareBelt.png + ../Models/LeatherCuffs/HardwareCollar.png + ../Models/LeatherCuffs/HardwareElbowLeftBoxtie.png + ../Models/LeatherCuffs/HardwareElbowLeftFree.png + ../Models/LeatherCuffs/HardwareElbowLeftFront.png + ../Models/LeatherCuffs/HardwareElbowLeftUp.png + ../Models/LeatherCuffs/HardwareElbowLeftWristtie.png + ../Models/LeatherCuffs/HardwareElbowLeftYoked.png + ../Models/LeatherCuffs/HardwareElbowRightBoxtie.png + ../Models/LeatherCuffs/HardwareElbowRightFront.png + ../Models/LeatherCuffs/HardwareElbowRightUp.png + ../Models/LeatherCuffs/HardwareElbowRightWristtie.png + ../Models/LeatherCuffs/HardwareElbowRightYoked.png + ../Models/LeatherCuffs/HardwareThighLeftClosed.png + ../Models/LeatherCuffs/HardwareThighLeftKneel.png + ../Models/LeatherCuffs/HardwareThighLeftKneelClosed.png + ../Models/LeatherCuffs/HardwareThighLeftSpread.png + ../Models/LeatherCuffs/HardwareThighRightClosed.png + ../Models/LeatherCuffs/HardwareThighRightKneel.png + ../Models/LeatherCuffs/HardwareThighRightKneelClosed.png + ../Models/LeatherCuffs/HardwareThighRightSpread.png + ../Models/LeatherCuffs/HardwareWristLeftFree.png + ../Models/LeatherCuffs/HardwareWristLeftFront.png + ../Models/LeatherCuffs/HardwareWristLeftYoked.png + ../Models/LeatherCuffs/HardwareWristRightCrossed.png + ../Models/LeatherCuffs/HardwareWristRightFree.png + ../Models/LeatherCuffs/HardwareWristRightFront.png + ../Models/LeatherCuffs/HardwareWristRightYoked.png + ../Models/LeatherCuffs/ThighLeftClosed.png + ../Models/LeatherCuffs/ThighLeftKneel.png + ../Models/LeatherCuffs/ThighLeftKneelClosed.png + ../Models/LeatherCuffs/ThighLeftSpread.png + ../Models/LeatherCuffs/ThighRightClosed.png + ../Models/LeatherCuffs/ThighRightKneel.png + ../Models/LeatherCuffs/ThighRightKneelClosed.png + ../Models/LeatherCuffs/ThighRightSpread.png + ../Models/LeatherCuffs/WristLeftFree.png + ../Models/LeatherCuffs/WristLeftFront.png + ../Models/LeatherCuffs/WristLeftYoked.png + ../Models/LeatherCuffs/WristRightCrossed.png + ../Models/LeatherCuffs/WristRightFree.png + ../Models/LeatherCuffs/WristRightFront.png + ../Models/LeatherCuffs/WristRightYoked.png + ../Models/LeatherLeotard/Laces.png + ../Models/LeatherLeotard/Leotard.png + ../Models/LeatherLeotard/LeotardChest.png + ../Models/LeatherLeotard/LeotardClosed.png + ../Models/LeatherLeotard/LeotardCorset.png + ../Models/LeatherLeotard/StrapsArms.png + ../Models/LeatherLeotard/StrapsChest.png + ../Models/LeatherLeotard/StrapsHardware.png + ../Models/LeatherLeotard/StrapsLower.png + ../Models/LeatherLeotard/StrapsLowerClean.png + ../Models/LeatherLeotard/StrapsLowerCleanClosed.png + ../Models/LeatherLeotard/StrapsLowerClosed.png + ../Models/LeatherPetsuit/Arms.png + ../Models/LeatherPetsuit/ArmsBelts.png + ../Models/LeatherPetsuit/ArmsHardware.png + ../Models/LeatherPetsuit/ArmsLaces.png + ../Models/LeatherPetsuit/LeftLegsBeltsKneel.png + ../Models/LeatherPetsuit/LeftLegsBeltsKneelClosed.png + ../Models/LeatherPetsuit/LeftLegsHardwareKneel.png + ../Models/LeatherPetsuit/LeftLegsHardwareKneelClosed.png + ../Models/LeatherPetsuit/LeftLegsKneel.png + ../Models/LeatherPetsuit/LeftLegsKneelClosed.png + ../Models/LeatherPetsuit/LeftLegsLacesKneel.png + ../Models/LeatherPetsuit/LeftLegsLacesKneelClosed.png + ../Models/LeatherPetsuit/LegsBeltsHogtie.png + ../Models/LeatherPetsuit/LegsBeltsKneel.png + ../Models/LeatherPetsuit/LegsBeltsKneelClosed.png + ../Models/LeatherPetsuit/LegsHardwareHogtie.png + ../Models/LeatherPetsuit/LegsHogtie.png + ../Models/LeatherPetsuit/LegsKneel.png + ../Models/LeatherPetsuit/LegsKneelClosed.png + ../Models/LeatherPetsuit/LegsLacesHogtie.png + ../Models/Legbinder/LacesLegbinderClosed.png + ../Models/Legbinder/LacesLegbinderKneelClosed.png + ../Models/Legbinder/LegLacesLegbinderClosed.png + ../Models/Legbinder/LegLegbinderClosed.png + ../Models/Legbinder/LegLegbinderHogtie.png + ../Models/Legbinder/LegLegbinderKneelClosed.png + ../Models/Legbinder/LegRightLegbinderClosed.png + ../Models/Legbinder/LegbinderClosed.png + ../Models/Legbinder/LegbinderHogtie.png + ../Models/Legbinder/LegbinderKneelClosed.png + ../Models/Legbinder/RightLacesLegbinderKneelClosed.png + ../Models/Legbinder/RightLegbinderClosed.png + ../Models/Legbinder/RightLegbinderHogtie.png + ../Models/Legbinder/RightLegbinderKneelClosed.png + ../Models/Maid/Apron.png + ../Models/Maid/ApronKneel.png + ../Models/Maid/Blouse.png + ../Models/Maid/BlouseBust.png + ../Models/Maid/Bow.png + ../Models/Maid/Corset.png + ../Models/Maid/CorsetStraps.png + ../Models/Maid/CorsetStrapsBoxtie.png + ../Models/Maid/CorsetStrapsUp.png + ../Models/Maid/FootSockLeftHogtie.png + ../Models/Maid/FootSockRightKneel.png + ../Models/Maid/ShoeLeftClosed.png + ../Models/Maid/ShoeLeftHogtie.png + ../Models/Maid/ShoeLeftKneel.png + ../Models/Maid/ShoeLeftKneelClosed.png + ../Models/Maid/ShoeLeftSpread.png + ../Models/Maid/ShoeRightClosed.png + ../Models/Maid/ShoeRightKneel.png + ../Models/Maid/ShoeRightSpread.png + ../Models/Maid/Skirt.png + ../Models/Maid/SkirtClosed.png + ../Models/Maid/SkirtClosedCrotchStrap.png + ../Models/Maid/SkirtCrotchStrap.png + ../Models/Maid/SkirtKneel.png + ../Models/Maid/SkirtKneelCrotchStrap.png + ../Models/Maid/SkirtOverKneel.png + ../Models/Maid/SkirtOverKneelCrotchStrap.png + ../Models/Maid/SockLeftClosed.png + ../Models/Maid/SockLeftHogtie.png + ../Models/Maid/SockLeftKneel.png + ../Models/Maid/SockLeftKneelClosed.png + ../Models/Maid/SockLeftSpread.png + ../Models/Maid/SockRightClosed.png + ../Models/Maid/SockRightHogtie.png + ../Models/Maid/SockRightKneel.png + ../Models/Maid/SockRightKneelClosed.png + ../Models/Maid/SockRightSpread.png + ../Models/Maid/Stripe.png + ../Models/Maid/StripeClosed.png + ../Models/Maid/StripeClosedCrotchStrap.png + ../Models/Maid/StripeCrotchStrap.png + ../Models/Maid/StripeKneel.png + ../Models/Maid/StripeKneelCrotchStrap.png + ../Models/Maid/StripeOverKneel.png + ../Models/Maid/StripeOverKneelCrotchStrap.png + ../Models/Maid/StripeSockLeftClosed.png + ../Models/Maid/StripeSockLeftHogtie.png + ../Models/Maid/StripeSockLeftKneel.png + ../Models/Maid/StripeSockLeftKneelClosed.png + ../Models/Maid/StripeSockLeftSpread.png + ../Models/Maid/StripeSockRightClosed.png + ../Models/Maid/StripeSockRightHogtie.png + ../Models/Maid/StripeSockRightKneel.png + ../Models/Maid/StripeSockRightKneelClosed.png + ../Models/Maid/StripeSockRightSpread.png + ../Models/MaidKnightHeavy/Apron.png + ../Models/MaidKnightHeavy/ApronBelt.png + ../Models/MaidKnightHeavy/ApronBeltHogtie.png + ../Models/MaidKnightHeavy/ApronBeltKneel.png + ../Models/MaidKnightHeavy/ApronChest.png + ../Models/MaidKnightHeavy/ApronChestBelts.png + ../Models/MaidKnightHeavy/ApronChestBeltsUp.png + ../Models/MaidKnightHeavy/ApronChestRufflesBoxtie.png + ../Models/MaidKnightHeavy/ApronChestRufflesCrossed.png + ../Models/MaidKnightHeavy/ApronChestRufflesFree.png + ../Models/MaidKnightHeavy/ApronChestRufflesFront.png + ../Models/MaidKnightHeavy/ApronChestRufflesUp.png + ../Models/MaidKnightHeavy/ApronChestRufflesWristtie.png + ../Models/MaidKnightHeavy/ApronChestRufflesYoked.png + ../Models/MaidKnightHeavy/ApronCross.png + ../Models/MaidKnightHeavy/ApronCrossHogtie.png + ../Models/MaidKnightHeavy/ApronCrossKneel.png + ../Models/MaidKnightHeavy/ApronHogtie.png + ../Models/MaidKnightHeavy/ApronKneel.png + ../Models/MaidKnightHeavy/ApronMiniBow.png + ../Models/MaidKnightHeavy/ApronMiniBowHogtie.png + ../Models/MaidKnightHeavy/ApronMiniBowKneel.png + ../Models/MaidKnightHeavy/ApronPattern.png + ../Models/MaidKnightHeavy/ApronPatternHogtie.png + ../Models/MaidKnightHeavy/ApronPatternKneel.png + ../Models/MaidKnightHeavy/ApronStripe.png + ../Models/MaidKnightHeavy/ApronStripeHogtie.png + ../Models/MaidKnightHeavy/ApronStripeKneel.png + ../Models/MaidKnightHeavy/ArmLeftBoxtie.png + ../Models/MaidKnightHeavy/ArmLeftCrossed.png + ../Models/MaidKnightHeavy/ArmLeftFree.png + ../Models/MaidKnightHeavy/ArmLeftFront.png + ../Models/MaidKnightHeavy/ArmLeftStripeBoxtie.png + ../Models/MaidKnightHeavy/ArmLeftStripeCrossed.png + ../Models/MaidKnightHeavy/ArmLeftStripeFree.png + ../Models/MaidKnightHeavy/ArmLeftStripeFront.png + ../Models/MaidKnightHeavy/ArmLeftStripeUp.png + ../Models/MaidKnightHeavy/ArmLeftStripeWristtie.png + ../Models/MaidKnightHeavy/ArmLeftStripeYoked.png + ../Models/MaidKnightHeavy/ArmLeftUp.png + ../Models/MaidKnightHeavy/ArmLeftWristtie.png + ../Models/MaidKnightHeavy/ArmLeftYoked.png + ../Models/MaidKnightHeavy/ArmRightBoxtie.png + ../Models/MaidKnightHeavy/ArmRightCrossed.png + ../Models/MaidKnightHeavy/ArmRightFree.png + ../Models/MaidKnightHeavy/ArmRightFront.png + ../Models/MaidKnightHeavy/ArmRightStripeBoxtie.png + ../Models/MaidKnightHeavy/ArmRightStripeCrossed.png + ../Models/MaidKnightHeavy/ArmRightStripeFree.png + ../Models/MaidKnightHeavy/ArmRightStripeFront.png + ../Models/MaidKnightHeavy/ArmRightStripeUp.png + ../Models/MaidKnightHeavy/ArmRightStripeWristtie.png + ../Models/MaidKnightHeavy/ArmRightStripeYoked.png + ../Models/MaidKnightHeavy/ArmRightUp.png + ../Models/MaidKnightHeavy/ArmRightWristtie.png + ../Models/MaidKnightHeavy/ArmRightYoked.png + ../Models/MaidKnightHeavy/Belts.png + ../Models/MaidKnightHeavy/BeltsHardware.png + ../Models/MaidKnightHeavy/BootLeftClosed.png + ../Models/MaidKnightHeavy/BootLeftHogtie.png + ../Models/MaidKnightHeavy/BootLeftKneel.png + ../Models/MaidKnightHeavy/BootLeftKneelClosed.png + ../Models/MaidKnightHeavy/BootLeftSpread.png + ../Models/MaidKnightHeavy/BootLegLeftClosed.png + ../Models/MaidKnightHeavy/BootLegLeftHogtie.png + ../Models/MaidKnightHeavy/BootLegLeftKneel.png + ../Models/MaidKnightHeavy/BootLegLeftKneelClosed.png + ../Models/MaidKnightHeavy/BootLegLeftSpread.png + ../Models/MaidKnightHeavy/BootLegRightClosed.png + ../Models/MaidKnightHeavy/BootLegRightHogtie.png + ../Models/MaidKnightHeavy/BootLegRightKneel.png + ../Models/MaidKnightHeavy/BootLegRightKneelClosed.png + ../Models/MaidKnightHeavy/BootLegRightSpread.png + ../Models/MaidKnightHeavy/BootRightClosed.png + ../Models/MaidKnightHeavy/BootRightKneel.png + ../Models/MaidKnightHeavy/BootRightSpread.png + ../Models/MaidKnightHeavy/BootShoeLeftClosed.png + ../Models/MaidKnightHeavy/BootShoeLeftKneel.png + ../Models/MaidKnightHeavy/BootShoeLeftKneelClosed.png + ../Models/MaidKnightHeavy/BootShoeLeftSpread.png + ../Models/MaidKnightHeavy/BootShoeRightClosed.png + ../Models/MaidKnightHeavy/BootShoeRightSpread.png + ../Models/MaidKnightHeavy/ChestArmor.png + ../Models/MaidKnightHeavy/Corset.png + ../Models/MaidKnightHeavy/CorsetOrig.png + ../Models/MaidKnightHeavy/Dress.png + ../Models/MaidKnightHeavy/DressChestBoxtie.png + ../Models/MaidKnightHeavy/DressChestFree.png + ../Models/MaidKnightHeavy/DressChestUp.png + ../Models/MaidKnightHeavy/DressChestWristtie.png + ../Models/MaidKnightHeavy/DressChestYoked.png + ../Models/MaidKnightHeavy/DressSkirt.png + ../Models/MaidKnightHeavy/DressSkirtHem.png + ../Models/MaidKnightHeavy/DressSkirtHemHogtie.png + ../Models/MaidKnightHeavy/DressSkirtHemKneel.png + ../Models/MaidKnightHeavy/DressSkirtHogtie.png + ../Models/MaidKnightHeavy/DressSkirtKneel.png + ../Models/MaidKnightHeavy/DressSkirtStripe.png + ../Models/MaidKnightHeavy/DressSkirtStripeHogtie.png + ../Models/MaidKnightHeavy/DressSkirtStripeKneel.png + ../Models/MaidKnightHeavy/FootBootLeftHogtie.png + ../Models/MaidKnightHeavy/FootSockLeftHogtie.png + ../Models/MaidKnightHeavy/FootSockRightKneel.png + ../Models/MaidKnightHeavy/ForeArmLeftCrossed.png + ../Models/MaidKnightHeavy/ForeArmLeftFront.png + ../Models/MaidKnightHeavy/ForeArmRightCrossed.png + ../Models/MaidKnightHeavy/ForeArmRightFront.png + ../Models/MaidKnightHeavy/GauntletLeftBoxtie.png + ../Models/MaidKnightHeavy/GauntletLeftCrossed.png + ../Models/MaidKnightHeavy/GauntletLeftFree.png + ../Models/MaidKnightHeavy/GauntletLeftFront.png + ../Models/MaidKnightHeavy/GauntletLeftUp.png + ../Models/MaidKnightHeavy/GauntletLeftWristtie.png + ../Models/MaidKnightHeavy/GauntletLeftYoked.png + ../Models/MaidKnightHeavy/GauntletRightCrossed.png + ../Models/MaidKnightHeavy/GauntletRightFree.png + ../Models/MaidKnightHeavy/GauntletRightFront.png + ../Models/MaidKnightHeavy/GauntletRightUp.png + ../Models/MaidKnightHeavy/GauntletRightYoked.png + ../Models/MaidKnightHeavy/GloveLeftFree.png + ../Models/MaidKnightHeavy/GloveLeftFront.png + ../Models/MaidKnightHeavy/GloveLeftYoked.png + ../Models/MaidKnightHeavy/GloveRightBoxtie.png + ../Models/MaidKnightHeavy/GloveRightCrossed.png + ../Models/MaidKnightHeavy/GloveRightFree.png + ../Models/MaidKnightHeavy/GloveRightFront.png + ../Models/MaidKnightHeavy/GloveRightYoked.png + ../Models/MaidKnightHeavy/Headband.png + ../Models/MaidKnightHeavy/HeadbandFrill.png + ../Models/MaidKnightHeavy/HeadbandRibbon.png + ../Models/MaidKnightHeavy/HeadbandRibbonBack.png + ../Models/MaidKnightHeavy/PantyhoseClosed.png + ../Models/MaidKnightHeavy/PantyhoseHogtie.png + ../Models/MaidKnightHeavy/PantyhoseKneel.png + ../Models/MaidKnightHeavy/PantyhoseKneelClosed.png + ../Models/MaidKnightHeavy/PantyhoseSpread.png + ../Models/MaidKnightHeavy/PauldronLeft.png + ../Models/MaidKnightHeavy/PauldronLeftHardware.png + ../Models/MaidKnightHeavy/PauldronLeftHardwareUp.png + ../Models/MaidKnightHeavy/PauldronLeftHardwareYoked.png + ../Models/MaidKnightHeavy/PauldronLeftStraps.png + ../Models/MaidKnightHeavy/PauldronLeftStrapsUp.png + ../Models/MaidKnightHeavy/PauldronLeftStrapsYoked.png + ../Models/MaidKnightHeavy/PauldronLeftUp.png + ../Models/MaidKnightHeavy/PauldronLeftYoked.png + ../Models/MaidKnightHeavy/PauldronRight.png + ../Models/MaidKnightHeavy/PauldronRightStraps.png + ../Models/MaidKnightHeavy/PauldronRightStrapsUp.png + ../Models/MaidKnightHeavy/PauldronRightStrapsYoked.png + ../Models/MaidKnightHeavy/PauldronRightUp.png + ../Models/MaidKnightHeavy/PauldronRightYoked.png + ../Models/MaidKnightHeavy/Pouches.png + ../Models/MaidKnightHeavy/ShoulderRightUp.png + ../Models/MaidKnightHeavy/SideArmor.png + ../Models/MaidKnightHeavy/SleeveLeftBoxtie.png + ../Models/MaidKnightHeavy/SleeveLeftCrossed.png + ../Models/MaidKnightHeavy/SleeveLeftFree.png + ../Models/MaidKnightHeavy/SleeveLeftFront.png + ../Models/MaidKnightHeavy/SleeveLeftStripeFree.png + ../Models/MaidKnightHeavy/SleeveLeftUp.png + ../Models/MaidKnightHeavy/SleeveLeftWristtie.png + ../Models/MaidKnightHeavy/SleeveLeftYoked.png + ../Models/MaidKnightHeavy/SleeveRightBoxtie.png + ../Models/MaidKnightHeavy/SleeveRightCrossed.png + ../Models/MaidKnightHeavy/SleeveRightFree.png + ../Models/MaidKnightHeavy/SleeveRightFront.png + ../Models/MaidKnightHeavy/SleeveRightUp.png + ../Models/MaidKnightHeavy/SleeveRightWristtie.png + ../Models/MaidKnightHeavy/SleeveRightYoked.png + ../Models/MaidKnightHeavy/SockLeftClosed.png + ../Models/MaidKnightHeavy/SockLeftHogtie.png + ../Models/MaidKnightHeavy/SockLeftKneel.png + ../Models/MaidKnightHeavy/SockLeftKneelClosed.png + ../Models/MaidKnightHeavy/SockLeftSpread.png + ../Models/MaidKnightHeavy/SockRightClosed.png + ../Models/MaidKnightHeavy/SockRightHogtie.png + ../Models/MaidKnightHeavy/SockRightKneel.png + ../Models/MaidKnightHeavy/SockRightKneelClosed.png + ../Models/MaidKnightHeavy/SockRightSpread.png + ../Models/MaidKnightLight/Apron.png + ../Models/MaidKnightLight/ApronBack.png + ../Models/MaidKnightLight/ApronChest.png + ../Models/MaidKnightLight/ApronChestBoxtie.png + ../Models/MaidKnightLight/ApronChestCrossed.png + ../Models/MaidKnightLight/ApronChestFront.png + ../Models/MaidKnightLight/ApronChestUp.png + ../Models/MaidKnightLight/ApronChestYoked.png + ../Models/MaidKnightLight/ApronHogtie.png + ../Models/MaidKnightLight/ApronKneel.png + ../Models/MaidKnightLight/ArmLeftBoxtie.png + ../Models/MaidKnightLight/ArmLeftCrossed.png + ../Models/MaidKnightLight/ArmLeftFree.png + ../Models/MaidKnightLight/ArmLeftFront.png + ../Models/MaidKnightLight/ArmLeftUp.png + ../Models/MaidKnightLight/ArmLeftWristtie.png + ../Models/MaidKnightLight/ArmLeftYoked.png + ../Models/MaidKnightLight/ArmRightBoxtie.png + ../Models/MaidKnightLight/ArmRightCrossed.png + ../Models/MaidKnightLight/ArmRightFree.png + ../Models/MaidKnightLight/ArmRightFront.png + ../Models/MaidKnightLight/ArmRightUp.png + ../Models/MaidKnightLight/ArmRightWristtie.png + ../Models/MaidKnightLight/ArmRightYoked.png + ../Models/MaidKnightLight/BootLeftClosed.png + ../Models/MaidKnightLight/BootLeftHogtie.png + ../Models/MaidKnightLight/BootLeftKneel.png + ../Models/MaidKnightLight/BootLeftKneelClosed.png + ../Models/MaidKnightLight/BootLeftSpread.png + ../Models/MaidKnightLight/BootRightClosed.png + ../Models/MaidKnightLight/BootRightKneel.png + ../Models/MaidKnightLight/BootRightSpread.png + ../Models/MaidKnightLight/Dress.png + ../Models/MaidKnightLight/DressChestBoxtie.png + ../Models/MaidKnightLight/DressChestFree.png + ../Models/MaidKnightLight/DressChestUp.png + ../Models/MaidKnightLight/DressChestWristtie.png + ../Models/MaidKnightLight/DressChestYoked.png + ../Models/MaidKnightLight/DressDeco.png + ../Models/MaidKnightLight/DressDecoBack.png + ../Models/MaidKnightLight/DressKneel.png + ../Models/MaidKnightLight/DressSkirt.png + ../Models/MaidKnightLight/DressSkirtHogtie.png + ../Models/MaidKnightLight/DressSkirtKneel.png + ../Models/MaidKnightLight/Flower.png + ../Models/MaidKnightLight/FlowerLeaves.png + ../Models/MaidKnightLight/FootBootLeftHogtie.png + ../Models/MaidKnightLight/FootSockLeftHogtie.png + ../Models/MaidKnightLight/FootSockRightKneel.png + ../Models/MaidKnightLight/ForeArmLeftCrossed.png + ../Models/MaidKnightLight/ForeArmLeftFront.png + ../Models/MaidKnightLight/ForeArmRightCrossed.png + ../Models/MaidKnightLight/ForeArmRightFront.png + ../Models/MaidKnightLight/GloveLeftFree.png + ../Models/MaidKnightLight/GloveLeftFront.png + ../Models/MaidKnightLight/GloveLeftYoked.png + ../Models/MaidKnightLight/GloveRightBoxtie.png + ../Models/MaidKnightLight/GloveRightCrossed.png + ../Models/MaidKnightLight/GloveRightFree.png + ../Models/MaidKnightLight/GloveRightFront.png + ../Models/MaidKnightLight/GloveRightYoked.png + ../Models/MaidKnightLight/GuardCuff2LeftCrossed.png + ../Models/MaidKnightLight/GuardCuff2LeftFree.png + ../Models/MaidKnightLight/GuardCuff2LeftFront.png + ../Models/MaidKnightLight/GuardCuff2LeftUp.png + ../Models/MaidKnightLight/GuardCuff2LeftWristtie.png + ../Models/MaidKnightLight/GuardCuff2LeftYoked.png + ../Models/MaidKnightLight/GuardCuff2RightBoxtie.png + ../Models/MaidKnightLight/GuardCuff2RightCrossed.png + ../Models/MaidKnightLight/GuardCuff2RightFree.png + ../Models/MaidKnightLight/GuardCuff2RightFront.png + ../Models/MaidKnightLight/GuardCuff2RightUp.png + ../Models/MaidKnightLight/GuardCuff2RightYoked.png + ../Models/MaidKnightLight/GuardCuffLeftCrossed.png + ../Models/MaidKnightLight/GuardCuffLeftFree.png + ../Models/MaidKnightLight/GuardCuffLeftFront.png + ../Models/MaidKnightLight/GuardCuffLeftUp.png + ../Models/MaidKnightLight/GuardCuffLeftWristtie.png + ../Models/MaidKnightLight/GuardCuffLeftYoked.png + ../Models/MaidKnightLight/GuardCuffRightBoxtie.png + ../Models/MaidKnightLight/GuardCuffRightCrossed.png + ../Models/MaidKnightLight/GuardCuffRightFree.png + ../Models/MaidKnightLight/GuardCuffRightFront.png + ../Models/MaidKnightLight/GuardCuffRightUp.png + ../Models/MaidKnightLight/GuardCuffRightYoked.png + ../Models/MaidKnightLight/GuardLeftCrossed.png + ../Models/MaidKnightLight/GuardLeftFree.png + ../Models/MaidKnightLight/GuardLeftFront.png + ../Models/MaidKnightLight/GuardLeftUp.png + ../Models/MaidKnightLight/GuardLeftWristtie.png + ../Models/MaidKnightLight/GuardLeftYoked.png + ../Models/MaidKnightLight/GuardRightBoxtie.png + ../Models/MaidKnightLight/GuardRightCrossed.png + ../Models/MaidKnightLight/GuardRightFree.png + ../Models/MaidKnightLight/GuardRightFront.png + ../Models/MaidKnightLight/GuardRightUp.png + ../Models/MaidKnightLight/GuardRightYoked.png + ../Models/MaidKnightLight/Headband.png + ../Models/MaidKnightLight/HeadbandFrill.png + ../Models/MaidKnightLight/HeadbandRibbon.png + ../Models/MaidKnightLight/PauldronLeft.png + ../Models/MaidKnightLight/PauldronLeftBoxtie.png + ../Models/MaidKnightLight/PauldronLeftCrossed.png + ../Models/MaidKnightLight/PauldronLeftFront.png + ../Models/MaidKnightLight/PauldronLeftUp.png + ../Models/MaidKnightLight/PauldronLeftWristtie.png + ../Models/MaidKnightLight/PauldronLeftYoked.png + ../Models/MaidKnightLight/PauldronStrap.png + ../Models/MaidKnightLight/PauldronStrapBoxtie.png + ../Models/MaidKnightLight/PauldronStrapCrossed.png + ../Models/MaidKnightLight/PauldronStrapFront.png + ../Models/MaidKnightLight/PauldronStrapUp.png + ../Models/MaidKnightLight/PauldronStrapWristtie.png + ../Models/MaidKnightLight/PauldronStrapYoked.png + ../Models/MaidKnightLight/ShoulderRightUp.png + ../Models/MaidKnightLight/SockLeftClosed.png + ../Models/MaidKnightLight/SockLeftHogtie.png + ../Models/MaidKnightLight/SockLeftKneel.png + ../Models/MaidKnightLight/SockLeftKneelClosed.png + ../Models/MaidKnightLight/SockLeftSpread.png + ../Models/MaidKnightLight/SockRightClosed.png + ../Models/MaidKnightLight/SockRightHogtie.png + ../Models/MaidKnightLight/SockRightKneel.png + ../Models/MaidKnightLight/SockRightKneelClosed.png + ../Models/MaidKnightLight/SockRightSpread.png + ../Models/Mittens/BandLeftFree.png + ../Models/Mittens/BandLeftFront.png + ../Models/Mittens/BandLeftYoked.png + ../Models/Mittens/BandRightFree.png + ../Models/Mittens/BandRightFront.png + ../Models/Mittens/BandRightYoked.png + ../Models/Mittens/ForeLongMittenLeftCrossed.png + ../Models/Mittens/ForeLongMittenLeftFront.png + ../Models/Mittens/ForeLongMittenRightCrossed.png + ../Models/Mittens/ForeLongMittenRightFront.png + ../Models/Mittens/LatexLeftFree.png + ../Models/Mittens/LatexLeftFront.png + ../Models/Mittens/LatexLeftYoked.png + ../Models/Mittens/LatexRightBoxtie.png + ../Models/Mittens/LatexRightCrossed.png + ../Models/Mittens/LatexRightFree.png + ../Models/Mittens/LatexRightFront.png + ../Models/Mittens/LatexRightYoked.png + ../Models/Mittens/LeatherLeftFree.png + ../Models/Mittens/LeatherLeftFront.png + ../Models/Mittens/LeatherLeftYoked.png + ../Models/Mittens/LeatherRightBoxtie.png + ../Models/Mittens/LeatherRightCrossed.png + ../Models/Mittens/LeatherRightFree.png + ../Models/Mittens/LeatherRightFront.png + ../Models/Mittens/LeatherRightYoked.png + ../Models/Mittens/LockLeftFree.png + ../Models/Mittens/LockLeftFront.png + ../Models/Mittens/LockLeftYoked.png + ../Models/Mittens/LockRightFree.png + ../Models/Mittens/LockRightFront.png + ../Models/Mittens/LockRightYoked.png + ../Models/Mittens/LongMittenLeftBoxtie.png + ../Models/Mittens/LongMittenLeftCrossed.png + ../Models/Mittens/LongMittenLeftFree.png + ../Models/Mittens/LongMittenLeftFront.png + ../Models/Mittens/LongMittenLeftUp.png + ../Models/Mittens/LongMittenLeftWristtie.png + ../Models/Mittens/LongMittenLeftYoked.png + ../Models/Mittens/LongMittenRightBoxtie.png + ../Models/Mittens/LongMittenRightCrossed.png + ../Models/Mittens/LongMittenRightFree.png + ../Models/Mittens/LongMittenRightFront.png + ../Models/Mittens/LongMittenRightUp.png + ../Models/Mittens/LongMittenRightWristtie.png + ../Models/Mittens/LongMittenRightYoked.png + ../Models/Mittens/PawLeftFree.png + ../Models/Mittens/PawLeftFront.png + ../Models/Mittens/PawLeftYoked.png + ../Models/Mittens/PawRightFree.png + ../Models/Mittens/PawRightFront.png + ../Models/Mittens/PawRightYoked.png + ../Models/Mittens/ZipperLeftFree.png + ../Models/Mittens/ZipperLeftFront.png + ../Models/Mittens/ZipperLeftYoked.png + ../Models/Mittens/ZipperRightFree.png + ../Models/Mittens/ZipperRightFront.png + ../Models/Mittens/ZipperRightYoked.png + ../Models/Necklace/MetalChain.png + ../Models/Necklace/MetalDisc.png + ../Models/Necklace/RubyChain.png + ../Models/Necklace/RubyGem.png + ../Models/Necklace/RubyHardware.png + ../Models/Necklace/RubyRing.png + ../Models/Necklace/SigilChain.png + ../Models/Necklace/SigilDisc.png + ../Models/Ninja/Belt.png + ../Models/Ninja/BeltLines.png + ../Models/Ninja/Collar.png + ../Models/Ninja/CollarTag.png + ../Models/Ninja/KneeLeftClosed.png + ../Models/Ninja/KneeLeftHogtie.png + ../Models/Ninja/KneeLeftKneel.png + ../Models/Ninja/KneeLeftKneelClosed.png + ../Models/Ninja/KneeLeftSpread.png + ../Models/Ninja/KneeRightClosed.png + ../Models/Ninja/KneeRightHogtie.png + ../Models/Ninja/KneeRightKneel.png + ../Models/Ninja/KneeRightKneelClosed.png + ../Models/Ninja/KneeRightSpread.png + ../Models/Ninja/LegLeftHogtie.png + ../Models/Ninja/ShoeLeftClosed.png + ../Models/Ninja/ShoeLeftHogtie.png + ../Models/Ninja/ShoeLeftKneel.png + ../Models/Ninja/ShoeLeftKneelClosed.png + ../Models/Ninja/ShoeLeftSpread.png + ../Models/Ninja/ShoeRightClosed.png + ../Models/Ninja/ShoeRightKneel.png + ../Models/Ninja/ShoeRightSpread.png + ../Models/Ninja/Skirt.png + ../Models/Ninja/SkirtBand.png + ../Models/Ninja/SkirtBandCrotchStrap.png + ../Models/Ninja/SkirtBandKneel.png + ../Models/Ninja/SkirtBandKneelCrotchStrap.png + ../Models/Ninja/SkirtBandOverKneel.png + ../Models/Ninja/SkirtCrotchStrap.png + ../Models/Ninja/SkirtKneel.png + ../Models/Ninja/SkirtKneelCrotchStrap.png + ../Models/Ninja/SkirtOverKneel.png + ../Models/Ninja/SkirtOverKneelCrotchStrap.png + ../Models/Ninja/SockLeftClosed.png + ../Models/Ninja/SockLeftHogtie.png + ../Models/Ninja/SockLeftKneel.png + ../Models/Ninja/SockLeftKneelClosed.png + ../Models/Ninja/SockLeftSpread.png + ../Models/Ninja/SockRightClosed.png + ../Models/Ninja/SockRightKneel.png + ../Models/Ninja/SockRightSpread.png + ../Models/Ninja/ThighLeftClosed.png + ../Models/Ninja/ThighLeftHogtie.png + ../Models/Ninja/ThighLeftKneel.png + ../Models/Ninja/ThighLeftKneelClosed.png + ../Models/Ninja/ThighLeftSpread.png + ../Models/Ninja/ThighRightClosed.png + ../Models/Ninja/ThighRightHogtie.png + ../Models/Ninja/ThighRightKneel.png + ../Models/Ninja/ThighRightKneelClosed.png + ../Models/Ninja/ThighRightSpread.png + ../Models/Ninja/Top.png + ../Models/Ninja/TopBand.png + ../Models/Ninja/TopBandChest.png + ../Models/Ninja/TopBandChestTied.png + ../Models/Ninja/TopBandChestUp.png + ../Models/Ninja/TopBandRim.png + ../Models/Ninja/TopBandRimChest.png + ../Models/Ninja/TopBandRimChestTied.png + ../Models/Ninja/TopBandRimChestUp.png + ../Models/Ninja/TopChest.png + ../Models/Ninja/TopChestTied.png + ../Models/Ninja/TopChestUp.png + ../Models/Ninja/TopShoulders.png + ../Models/Ninja/TopShouldersTied.png + ../Models/Ninja/TopShouldersUp.png + ../Models/Nipples/Clamps.png + ../Models/Nipples/ClampsBullet.png + ../Models/Nipples/Rings.png + ../Models/Nipples/RingsBullet.png + ../Models/Nipples/VibePiercings.png + ../Models/Nipples/VibePiercingsBullet.png + ../Models/Nipples/Weights.png + ../Models/OperaGloves/ForeGloveLeftCrossed.png + ../Models/OperaGloves/ForeGloveLeftFront.png + ../Models/OperaGloves/ForeGloveRightCrossed.png + ../Models/OperaGloves/ForeGloveRightFront.png + ../Models/OperaGloves/GloveLeftBoxtie.png + ../Models/OperaGloves/GloveLeftCrossed.png + ../Models/OperaGloves/GloveLeftFree.png + ../Models/OperaGloves/GloveLeftFront.png + ../Models/OperaGloves/GloveLeftUp.png + ../Models/OperaGloves/GloveLeftWristtie.png + ../Models/OperaGloves/GloveLeftYoked.png + ../Models/OperaGloves/GloveRightBoxtie.png + ../Models/OperaGloves/GloveRightCrossed.png + ../Models/OperaGloves/GloveRightFree.png + ../Models/OperaGloves/GloveRightFront.png + ../Models/OperaGloves/GloveRightUp.png + ../Models/OperaGloves/GloveRightWristtie.png + ../Models/OperaGloves/GloveRightYoked.png + ../Models/Panties/Base.png + ../Models/Panties/BaseClosed.png + ../Models/Panties/BaseKneel.png + ../Models/Panties/Bow.png + ../Models/Panties/Cherry.png + ../Models/Panties/CherryClosed.png + ../Models/Panties/CherryKneel.png + ../Models/Panties/InvertedRose.png + ../Models/Panties/InvertedRoseClosed.png + ../Models/Panties/InvertedRoseKneel.png + ../Models/Panties/Lace.png + ../Models/Panties/LacesKneel.png + ../Models/Panties/Lines.png + ../Models/Panties/LinesClosed.png + ../Models/Panties/LinesKneel.png + ../Models/Panties/Stripes.png + ../Models/Panties/StripesClosed.png + ../Models/Panties/StripesKneel.png + ../Models/PantiesHigh/Base.png + ../Models/PantiesHigh/BaseClosed.png + ../Models/PantiesHigh/Lines.png + ../Models/PantiesHigh/LinesClosed.png + ../Models/PantiesHigh/Stripes.png + ../Models/PantiesHigh/StripesClosed.png + ../Models/Petsuit/Arms.png + ../Models/Petsuit/ArmsBelts.png + ../Models/Petsuit/LeftLegsBeltsKneel.png + ../Models/Petsuit/LeftLegsBeltsKneelClosed.png + ../Models/Petsuit/LeftLegsKneel.png + ../Models/Petsuit/LeftLegsKneelClosed.png + ../Models/Petsuit/LegsBeltsHogtie.png + ../Models/Petsuit/LegsBeltsKneel.png + ../Models/Petsuit/LegsBeltsKneelClosed.png + ../Models/Petsuit/LegsHogtie.png + ../Models/Petsuit/LegsKneel.png + ../Models/Petsuit/LegsKneelClosed.png + ../Models/Petsuit/Petsuit.png + ../Models/Petsuit/Petsuit.psd + ../Models/Pony/Collar.png + ../Models/Pony/CollarTag.png + ../Models/Pony/CollarTagHogtie.png + ../Models/Ribbon/Arm1Boxtie.png + ../Models/Ribbon/Arm1Up.png + ../Models/Ribbon/Arm1Wristtie.png + ../Models/Ribbon/Arm2Boxtie.png + ../Models/Ribbon/Arm2Up.png + ../Models/Ribbon/Arm2Wristtie.png + ../Models/Ribbon/ArmHarness.png + ../Models/Ribbon/ArmHarnessUnderbust.png + ../Models/Ribbon/ArmStrapCrossed.png + ../Models/Ribbon/Belt.png + ../Models/Ribbon/Bow.png + ../Models/Ribbon/BowCrotch.png + ../Models/Ribbon/BowFront.png + ../Models/Ribbon/Calf1Closed.png + ../Models/Ribbon/Calf1KneelClosed.png + ../Models/Ribbon/Calf2Closed.png + ../Models/Ribbon/Calf2Hogtie.png + ../Models/Ribbon/Calf2KneelClosed.png + ../Models/Ribbon/Calf3Closed.png + ../Models/Ribbon/Calf3Hogtie.png + ../Models/Ribbon/Calf3KneelClosed.png + ../Models/Ribbon/Crotch.png + ../Models/Ribbon/CrotchStrap.png + ../Models/Ribbon/Cuffs.png + ../Models/Ribbon/FeetClosed.png + ../Models/Ribbon/Harness.png + ../Models/Ribbon/HarnessLower.png + ../Models/Ribbon/HarnessLowerStrap.png + ../Models/Ribbon/HarnessMid.png + ../Models/Ribbon/HarnessMidFlattened.png + ../Models/Ribbon/LegsKneel.png + ../Models/Ribbon/RightThigh1KneelClosed.png + ../Models/Ribbon/RightThigh2KneelClosed.png + ../Models/Ribbon/RightThigh3KneelClosed.png + ../Models/Ribbon/Thigh1Closed.png + ../Models/Ribbon/Thigh1KneelClosed.png + ../Models/Ribbon/Thigh2Closed.png + ../Models/Ribbon/Thigh2KneelClosed.png + ../Models/Ribbon/Thigh3Closed.png + ../Models/Ribbon/Thigh3KneelClosed.png + ../Models/Ribbon/ToeClosed.png + ../Models/Ribbon/TopArmHarness.png + ../Models/Ribbon/TopArmHarnessUnderbust.png + ../Models/Ribbon/TopArmStrapCrossed.png + ../Models/Ribbon/TopArmsBoxtie.png + ../Models/Ribbon/TopArmsUp.png + ../Models/Ribbon/TopArmsWristtie.png + ../Models/Ribbon/TopBelt.png + ../Models/Ribbon/TopBowBoxtie.png + ../Models/Ribbon/TopBowCrotch.png + ../Models/Ribbon/TopBowWristtie.png + ../Models/Ribbon/TopCalf1Closed.png + ../Models/Ribbon/TopCalf1KneelClosed.png + ../Models/Ribbon/TopCalf2Closed.png + ../Models/Ribbon/TopCalf2KneelClosed.png + ../Models/Ribbon/TopCalf3Closed.png + ../Models/Ribbon/TopCalf3KneelClosed.png + ../Models/Ribbon/TopCrotch.png + ../Models/Ribbon/TopCrotchStrap.png + ../Models/Ribbon/TopCuffs.png + ../Models/Ribbon/TopFeetClosed.png + ../Models/Ribbon/TopHarness.png + ../Models/Ribbon/TopHarnessLower.png + ../Models/Ribbon/TopHarnessMid.png + ../Models/Ribbon/TopHarnessMidFlattened.png + ../Models/Ribbon/TopLegsKneel.png + ../Models/Ribbon/TopRightThigh1KneelClosed.png + ../Models/Ribbon/TopRightThigh2KneelClosed.png + ../Models/Ribbon/TopRightThigh3KneelClosed.png + ../Models/Ribbon/TopThigh1Closed.png + ../Models/Ribbon/TopThigh1KneelClosed.png + ../Models/Ribbon/TopThigh2Closed.png + ../Models/Ribbon/TopThigh2KneelClosed.png + ../Models/Ribbon/TopThigh3Closed.png + ../Models/Ribbon/TopThigh3KneelClosed.png + ../Models/Ribbon/TopToeClosed.png + ../Models/RobeOfChastity/BaseClosed.png + ../Models/RobeOfChastity/BaseKneel.png + ../Models/RobeOfChastity/BaseSpread.png + ../Models/RobeOfChastity/Cape.png + ../Models/RobeOfChastity/CapeKneel.png + ../Models/RobeOfChastity/ChestBase.png + ../Models/RobeOfChastity/ChestBaseTied.png + ../Models/RobeOfChastity/ChestFabric.png + ../Models/RobeOfChastity/ChestFabricTied.png + ../Models/RobeOfChastity/ChestFrill.png + ../Models/RobeOfChastity/ChestGold.png + ../Models/RobeOfChastity/ChestGoldBase.png + ../Models/RobeOfChastity/ChestGoldBaseTied.png + ../Models/RobeOfChastity/ChestGoldTied.png + ../Models/RobeOfChastity/ChestPlate.png + ../Models/RobeOfChastity/FabricClosed.png + ../Models/RobeOfChastity/FabricKneel.png + ../Models/RobeOfChastity/FabricSpread.png + ../Models/RobeOfChastity/FrillClosed.png + ../Models/RobeOfChastity/FrillKneel.png + ../Models/RobeOfChastity/FrillSpread.png + ../Models/RobeOfChastity/GoldBaseClosed.png + ../Models/RobeOfChastity/GoldBaseKneel.png + ../Models/RobeOfChastity/GoldBaseSpread.png + ../Models/RobeOfChastity/GoldClosed.png + ../Models/RobeOfChastity/GoldKneel.png + ../Models/RobeOfChastity/GoldSpread.png + ../Models/RobeOfChastity/PauldronsFree.png + ../Models/RobeOfChastity/PauldronsTied.png + ../Models/RobeOfChastity/PauldronsYoked.png + ../Models/RobeOfChastity/PlateClosed.png + ../Models/RobeOfChastity/PlateKneel.png + ../Models/RobeOfChastity/PlateSpread.png + ../Models/Robes/Bra.png + ../Models/Robes/Chest.png + ../Models/Robes/PantsClosed.png + ../Models/Robes/PantsKneel.png + ../Models/Robes/PantsSpread.png + ../Models/Robes/RibbonBack.png + ../Models/Robes/RibbonBackHogtie.png + ../Models/Robes/RibbonBackKneel.png + ../Models/Robes/RibbonBelt.png + ../Models/Robes/ShoeLeftClosed.png + ../Models/Robes/ShoeLeftHogtie.png + ../Models/Robes/ShoeLeftKneel.png + ../Models/Robes/ShoeLeftKneelClosed.png + ../Models/Robes/ShoeLeftSpread.png + ../Models/Robes/ShoeRightClosed.png + ../Models/Robes/ShoeRightKneel.png + ../Models/Robes/ShoeRightSpread.png + ../Models/Robes/Skirt.png + ../Models/Robes/SkirtClosed.png + ../Models/Robes/SkirtClosedCrotchStrap.png + ../Models/Robes/SkirtCrotchStrap.png + ../Models/Robes/SkirtKneel.png + ../Models/Robes/SkirtKneelCrotchStrap.png + ../Models/Robes/SkirtKneel_LeftLegCrotchStrap.png + ../Models/Robes/SkirtOverKneel.png + ../Models/Robes/SkirtOverKneelCrotchStrap.png + ../Models/Robes/SleeveDecoLeftFree.png + ../Models/Robes/SleeveDecoLeftFront.png + ../Models/Robes/SleeveDecoLeftYoked.png + ../Models/Robes/SleeveDecoRightFree.png + ../Models/Robes/SleeveDecoRightFront.png + ../Models/Robes/SleeveDecoRightYoked.png + ../Models/Robes/SleeveLeftBoxtie.png + ../Models/Robes/SleeveLeftBoxtieRopesUpper.png + ../Models/Robes/SleeveLeftBoxtieTight.png + ../Models/Robes/SleeveLeftFree.png + ../Models/Robes/SleeveLeftFreeTight.png + ../Models/Robes/SleeveLeftFront.png + ../Models/Robes/SleeveLeftFrontTight.png + ../Models/Robes/SleeveLeftUp.png + ../Models/Robes/SleeveLeftWristtie.png + ../Models/Robes/SleeveLeftWristtieRopesUpper.png + ../Models/Robes/SleeveLeftWristtieTight.png + ../Models/Robes/SleeveLeftYoked.png + ../Models/Robes/SleeveLeftYokedTight.png + ../Models/Robes/SleeveRightBoxtie.png + ../Models/Robes/SleeveRightBoxtieRopesUpper.png + ../Models/Robes/SleeveRightBoxtieTight.png + ../Models/Robes/SleeveRightFree.png + ../Models/Robes/SleeveRightFreeTight.png + ../Models/Robes/SleeveRightFront.png + ../Models/Robes/SleeveRightFrontTight.png + ../Models/Robes/SleeveRightUp.png + ../Models/Robes/SleeveRightWristtie.png + ../Models/Robes/SleeveRightWristtieRopesUpper.png + ../Models/Robes/SleeveRightWristtieTight.png + ../Models/Robes/SleeveRightYoked.png + ../Models/Robes/SleeveRightYokedTight.png + ../Models/Robes/ZombieChestTalisman.png + ../Models/Robes/ZombieChestTalismanKneel.png + ../Models/Robes/ZombieHat.png + ../Models/Robes/ZombieHatBand.png + ../Models/Robes/ZombieTalisman.png + ../Models/Robes/ZombieTalismanBent.png + ../Models/Rope/AnklesClosed.png + ../Models/Rope/AnklesClosedOver.png + ../Models/Rope/AnklesKneel.png + ../Models/Rope/AnklesKneelOver.png + ../Models/Rope/Arm1Boxtie.png + ../Models/Rope/Arm1OverBoxtie.png + ../Models/Rope/Arm1OverWristtie.png + ../Models/Rope/Arm1Up.png + ../Models/Rope/Arm1Wristtie.png + ../Models/Rope/Arm2Boxtie.png + ../Models/Rope/Arm2Up.png + ../Models/Rope/Arm2Wristtie.png + ../Models/Rope/ArmHarness.png + ../Models/Rope/ArmHarnessUnder.png + ../Models/Rope/ArmStrapCrossed.png + ../Models/Rope/ArmStrapHarnessCrossed.png + ../Models/Rope/Belt.png + ../Models/Rope/Calf1Closed.png + ../Models/Rope/Calf1ClosedOver.png + ../Models/Rope/Calf1KneelClosed.png + ../Models/Rope/Calf1KneelClosedOver.png + ../Models/Rope/Calf2Closed.png + ../Models/Rope/Calf2ClosedOver.png + ../Models/Rope/Calf2Hogtie.png + ../Models/Rope/Calf2HogtieOver.png + ../Models/Rope/Calf2KneelClosed.png + ../Models/Rope/Calf2KneelClosedOver.png + ../Models/Rope/Calf3Closed.png + ../Models/Rope/Calf3ClosedOver.png + ../Models/Rope/Calf3Hogtie.png + ../Models/Rope/Calf3HogtieOver.png + ../Models/Rope/Calf3KneelClosed.png + ../Models/Rope/Calf3KneelClosedOver.png + ../Models/Rope/Crotchrope.png + ../Models/Rope/CrotchropeKneel.png + ../Models/Rope/CrotchropeStrap.png + ../Models/Rope/CuffsCrossed.png + ../Models/Rope/CuffsFront.png + ../Models/Rope/ForeArm1Wristtie.png + ../Models/Rope/ForeArm2Wristtie.png + ../Models/Rope/FrogThigh1Kneel.png + ../Models/Rope/FrogThigh1KneelClosed.png + ../Models/Rope/FrogThigh2Kneel.png + ../Models/Rope/FrogThigh2KneelClosed.png + ../Models/Rope/FrogThigh3Kneel.png + ../Models/Rope/FrogThigh3KneelClosed.png + ../Models/Rope/Harness.png + ../Models/Rope/HarnessLower.png + ../Models/Rope/HarnessLowerKneel.png + ../Models/Rope/HarnessLowerStrap.png + ../Models/Rope/LeftFrogtieHogtie.png + ../Models/Rope/LeftFrogtieKneel.png + ../Models/Rope/LeftFrogtieKneelClosed.png + ../Models/Rope/RightFrogtieKneel.png + ../Models/Rope/RightFrogtieKneelClosed.png + ../Models/Rope/RightThigh1KneelClosed.png + ../Models/Rope/RightThigh1KneelClosedOver.png + ../Models/Rope/RightThigh2KneelClosed.png + ../Models/Rope/RightThigh2KneelClosedOver.png + ../Models/Rope/RightThigh3KneelClosed.png + ../Models/Rope/RightThigh3KneelClosedOver.png + ../Models/Rope/Suspension.png + ../Models/Rope/Thigh1Closed.png + ../Models/Rope/Thigh1ClosedOver.png + ../Models/Rope/Thigh1KneelClosed.png + ../Models/Rope/Thigh1KneelClosedOver.png + ../Models/Rope/Thigh2Closed.png + ../Models/Rope/Thigh2ClosedOver.png + ../Models/Rope/Thigh2KneelClosed.png + ../Models/Rope/Thigh2KneelClosedOver.png + ../Models/Rope/Thigh3Closed.png + ../Models/Rope/Thigh3ClosedOver.png + ../Models/Rope/Thigh3KneelClosed.png + ../Models/Rope/Thigh3KneelClosedOver.png + ../Models/Rope/ToeClosed.png + ../Models/RopeOld/ArmsBoxtie.png + ../Models/RopeOld/ArmsWristtie.png + ../Models/RopeOld/ChestLower.png + ../Models/RopeOld/ChestUpper.png + ../Models/RopeOld/ShoulderStraps.png + ../Models/Rubber/AnkleLeftClosed.png + ../Models/Rubber/AnkleLeftKneelClosed.png + ../Models/Rubber/AnkleRightClosed.png + ../Models/Rubber/ArmLeftBoxtie.png + ../Models/Rubber/ArmLeftCrossed.png + ../Models/Rubber/ArmLeftFront.png + ../Models/Rubber/ArmLeftUp.png + ../Models/Rubber/ArmLeftWristtie.png + ../Models/Rubber/ArmRightBoxtie.png + ../Models/Rubber/ArmRightCrossed.png + ../Models/Rubber/ArmRightFront.png + ../Models/Rubber/ArmRightUp.png + ../Models/Rubber/ArmRightWristtie.png + ../Models/Rubber/Chest.png + ../Models/Rubber/ChestBoxtie.png + ../Models/Rubber/ChestCrossed.png + ../Models/Rubber/ChestWristtie.png + ../Models/Rubber/FaceEyes.png + ../Models/Rubber/FaceFull.png + ../Models/Rubber/FaceMouth.png + ../Models/Rubber/FootLeftClosed.png + ../Models/Rubber/FootLeftHogtie.png + ../Models/Rubber/FootLeftKneelClosed.png + ../Models/Rubber/FootRightClosed.png + ../Models/Rubber/FootRightKneel.png + ../Models/Rubber/HandLeftFree.png + ../Models/Rubber/HandLeftFront.png + ../Models/Rubber/HandLeftYoked.png + ../Models/Rubber/HandRightBoxtie.png + ../Models/Rubber/HandRightFree.png + ../Models/Rubber/HandRightFront.png + ../Models/Rubber/HandRightYoked.png + ../Models/Rubber/LegLeftClosed.png + ../Models/Rubber/LegLeftHogtie.png + ../Models/Rubber/LegLeftKneel.png + ../Models/Rubber/LegLeftKneelClosed.png + ../Models/Rubber/LegRightClosed.png + ../Models/Rubber/LegRightHogtie.png + ../Models/Rubber/LegRightKneel.png + ../Models/Rubber/LegRightKneelClosed.png + ../Models/Rubber/TorsoLower.png + ../Models/Rubber/TorsoLowerKneel.png + ../Models/Rubber/TorsoUpper.png + ../Models/SMoonlight/BallMittens.png + ../Models/SMoonlight/PostureCollar.png + ../Models/SMoonlight/PostureCollarHardware.png + ../Models/SMoonlight/PostureCollarLoop.png + ../Models/SMoonlight/PostureCollarRim.png + ../Models/SMoonlight/ReverseBinderHardware.png + ../Models/SMoonlight/ReverseBinderLeft.png + ../Models/SMoonlight/ReverseBinderRight.png + ../Models/SMoonlight/ReverseBinderStraps.png + ../Models/Sailor/Bust.png + ../Models/Sailor/BustStripe.png + ../Models/Sailor/Collar.png + ../Models/Sailor/CollarStripe.png + ../Models/Sailor/CollarStripeTied.png + ../Models/Sailor/CollarStripeUp.png + ../Models/Sailor/CollarStripeYoked.png + ../Models/Sailor/CollarTied.png + ../Models/Sailor/CollarUp.png + ../Models/Sailor/CollarYoked.png + ../Models/Sailor/HemLeft.png + ../Models/Sailor/HemLeftTied.png + ../Models/Sailor/HemLeftUp.png + ../Models/Sailor/HemLeftYoked.png + ../Models/Sailor/HemRight.png + ../Models/Sailor/HemRightTied.png + ../Models/Sailor/HemRightUp.png + ../Models/Sailor/HemRightYoked.png + ../Models/Sailor/Ribbon.png + ../Models/Sailor/RibbonTied.png + ../Models/Sailor/RibbonUp.png + ../Models/Sailor/RibbonYoked.png + ../Models/Sailor/Shirt.png + ../Models/Sailor/ShirtChest.png + ../Models/Sailor/ShirtChestTied.png + ../Models/Sailor/ShirtChestUp.png + ../Models/Sailor/ShirtChestYoked.png + ../Models/Sailor/ShirtKneel.png + ../Models/Sailor/SleeveLeft.png + ../Models/Sailor/SleeveLeftTied.png + ../Models/Sailor/SleeveLeftUp.png + ../Models/Sailor/SleeveLeftYoked.png + ../Models/Sailor/SleeveRight.png + ../Models/Sailor/SleeveRightTied.png + ../Models/Sailor/SleeveRightUp.png + ../Models/Sailor/SleeveRightYoked.png + ../Models/Shades/Glasses.png + ../Models/Shades/GlassesLens.png + ../Models/ShadowHands/Arms1.png + ../Models/ShadowHands/Arms2.png + ../Models/ShadowHands/Crotch.png + ../Models/ShadowHands/CrotchStrap.png + ../Models/ShadowHands/Feet1Closed.png + ../Models/ShadowHands/Feet1KneelClosed.png + ../Models/ShadowHands/LeftArm2Boxtie.png + ../Models/ShadowHands/LeftArm2Wristtie.png + ../Models/ShadowHands/Legs1Closed.png + ../Models/ShadowHands/Legs1Kneel.png + ../Models/ShadowHands/Legs1KneelClosed.png + ../Models/ShadowHands/Legs2Closed.png + ../Models/ShadowHands/Legs2Kneel.png + ../Models/ShadowHands/Legs2KneelClosed.png + ../Models/ShadowHands/RightLegs1Kneel.png + ../Models/ShadowHands/RightLegs1KneelClosed.png + ../Models/ShadowHands/RightLegs2Kneel.png + ../Models/ShadowHands/RightLegs2KneelClosed.png + ../Models/Skirts/ApronSkirt.png + ../Models/Skirts/ApronSkirtClosed.png + ../Models/Skirts/ApronSkirtClosedCrotchStrap.png + ../Models/Skirts/ApronSkirtCrotchStrap.png + ../Models/Skirts/ApronSkirtHogtie.png + ../Models/Skirts/ApronSkirtHogtieCrotchStrap.png + ../Models/Skirts/ApronSkirtKneel.png + ../Models/Skirts/ApronSkirtKneelCrotchStrap.png + ../Models/Skirts/ApronSkirtOverKneel.png + ../Models/Skirts/ApronSkirtOverKneelCrotchStrap.png + ../Models/Skirts/MaidSkirt.png + ../Models/Skirts/MaidSkirtClosed.png + ../Models/Skirts/MaidSkirtClosedCrotchStrap.png + ../Models/Skirts/MaidSkirtCrotchStrap.png + ../Models/Skirts/MaidSkirtHogtie.png + ../Models/Skirts/MaidSkirtHogtieCrotchStrap.png + ../Models/Skirts/MaidSkirtKneel.png + ../Models/Skirts/MaidSkirtKneelCrotchStrap.png + ../Models/Skirts/MaidSkirtOverKneel.png + ../Models/Skirts/MaidSkirtOverKneelCrotchStrap.png + ../Models/Skirts/StripedSkirt.png + ../Models/Skirts/StripedSkirtClosed.png + ../Models/Skirts/StripedSkirtClosedCrotchStrap.png + ../Models/Skirts/StripedSkirtCrotchStrap.png + ../Models/Skirts/StripedSkirtHogtie.png + ../Models/Skirts/StripedSkirtHogtieCrotchStrap.png + ../Models/Skirts/StripedSkirtKneel.png + ../Models/Skirts/StripedSkirtKneelCrotchStrap.png + ../Models/Skirts/StripedSkirtOverKneel.png + ../Models/Skirts/StripedSkirtOverKneelCrotchStrap.png + ../Models/Skirts/StripedSkirtUnder.png + ../Models/Skirts/StripedSkirtUnderClosed.png + ../Models/Skirts/StripedSkirtUnderClosedCrotchStrap.png + ../Models/Skirts/StripedSkirtUnderCrotchStrap.png + ../Models/Skirts/StripedSkirtUnderHogtie.png + ../Models/Skirts/StripedSkirtUnderHogtieCrotchStrap.png + ../Models/Skirts/StripedSkirtUnderKneel.png + ../Models/Skirts/StripedSkirtUnderKneelCrotchStrap.png + ../Models/Skirts/StripedSkirtUnderOverKneel.png + ../Models/Skirts/StripedSkirtUnderOverKneelCrotchStrap.png + ../Models/Slayer/Cape.png + ../Models/Slayer/CapeBackUp.png + ../Models/Slayer/CapeBackYoked.png + ../Models/Slayer/CapeCollar.png + ../Models/Slayer/CapeCollarButton.png + ../Models/Slayer/CapeCollarInner.png + ../Models/Slayer/CapeCollarRim.png + ../Models/Slayer/CapeShoulderLeft.png + ../Models/Slayer/CapeShoulderLeftButton.png + ../Models/Slayer/CapeShoulderLeftButtonTied.png + ../Models/Slayer/CapeShoulderLeftButtonUp.png + ../Models/Slayer/CapeShoulderLeftButtonYoked.png + ../Models/Slayer/CapeShoulderLeftTied.png + ../Models/Slayer/CapeShoulderLeftUp.png + ../Models/Slayer/CapeShoulderLeftYoked.png + ../Models/Slayer/CapeShoulderRight.png + ../Models/Slayer/CapeShoulderRightButtonUp.png + ../Models/Slayer/CapeShoulderRightTied.png + ../Models/Slayer/CapeShoulderRightUp.png + ../Models/Slayer/CapeShoulderRightYoked.png + ../Models/Slayer/CapeStripe.png + ../Models/Slayer/CapeStripeTied.png + ../Models/Slayer/CapeStripeUp.png + ../Models/Slayer/CapeStripeYoked.png + ../Models/Slayer/CapeTied.png + ../Models/Slayer/CapeUp.png + ../Models/Slayer/CapeYoked.png + ../Models/Slime/AnkleLeftClosed.png + ../Models/Slime/AnkleLeftKneelClosed.png + ../Models/Slime/AnkleRightClosed.png + ../Models/Slime/ArmLeftBoxtie.png + ../Models/Slime/ArmLeftCrossed.png + ../Models/Slime/ArmLeftFront.png + ../Models/Slime/ArmLeftUp.png + ../Models/Slime/ArmLeftWristtie.png + ../Models/Slime/ArmRightBoxtie.png + ../Models/Slime/ArmRightCrossed.png + ../Models/Slime/ArmRightFront.png + ../Models/Slime/ArmRightUp.png + ../Models/Slime/ArmRightWristtie.png + ../Models/Slime/Chest.png + ../Models/Slime/ChestBoxtie.png + ../Models/Slime/ChestCrossed.png + ../Models/Slime/ChestWristtie.png + ../Models/Slime/FaceEyes.png + ../Models/Slime/FaceFull.png + ../Models/Slime/FaceMouth.png + ../Models/Slime/FootLeftClosed.png + ../Models/Slime/FootLeftHogtie.png + ../Models/Slime/FootLeftKneelClosed.png + ../Models/Slime/FootRightClosed.png + ../Models/Slime/FootRightKneel.png + ../Models/Slime/HandLeftFree.png + ../Models/Slime/HandLeftFront.png + ../Models/Slime/HandLeftYoked.png + ../Models/Slime/HandRightBoxtie.png + ../Models/Slime/HandRightFree.png + ../Models/Slime/HandRightFront.png + ../Models/Slime/HandRightYoked.png + ../Models/Slime/LegLeftClosed.png + ../Models/Slime/LegLeftHogtie.png + ../Models/Slime/LegLeftKneel.png + ../Models/Slime/LegLeftKneelClosed.png + ../Models/Slime/LegRightClosed.png + ../Models/Slime/LegRightHogtie.png + ../Models/Slime/LegRightKneel.png + ../Models/Slime/LegRightKneelClosed.png + ../Models/Slime/TorsoLower.png + ../Models/Slime/TorsoLowerKneel.png + ../Models/Slime/TorsoUpper.png + ../Models/SmoothHeels/LeftClosed.png + ../Models/SmoothHeels/LeftHogtie.png + ../Models/SmoothHeels/LeftKneel.png + ../Models/SmoothHeels/LeftKneelClosed.png + ../Models/SmoothHeels/LeftSpread.png + ../Models/SmoothHeels/LegLeftHogtie.png + ../Models/SmoothHeels/LegRightHogtie.png + ../Models/SmoothHeels/LegRightKneel.png + ../Models/SmoothHeels/LegRightKneelClosed.png + ../Models/SmoothHeels/RightClosed.png + ../Models/SmoothHeels/RightHogtie.png + ../Models/SmoothHeels/RightKneel.png + ../Models/SmoothHeels/RightSpread.png + ../Models/Spats/SpatsClosed.png + ../Models/Spats/SpatsKneel.png + ../Models/Spats/SpatsKneelClosed.png + ../Models/Spats/SpatsSpread.png + ../Models/SteelChastity/Belt.png + ../Models/SteelChastity/BeltPadlock.png + ../Models/SteelChastity/BeltPadlockPin.png + ../Models/SteelChastity/BeltRadial.png + ../Models/SteelChastity/BeltSegu.png + ../Models/SteelChastity/Bra.png + ../Models/SteelChastity/BraPadlock.png + ../Models/SteelChastity/BraPadlockPin.png + ../Models/SteelChastity/BraRadial.png + ../Models/SteelChastity/BraSegu.png + ../Models/SteelCuffs/AnkleLeftClosed.png + ../Models/SteelCuffs/AnkleLeftKneel.png + ../Models/SteelCuffs/AnkleLeftKneelClosed.png + ../Models/SteelCuffs/AnkleLeftSpread.png + ../Models/SteelCuffs/AnkleRightClosed.png + ../Models/SteelCuffs/AnkleRightSpread.png + ../Models/SteelCuffs/Belt.png + ../Models/SteelCuffs/Collar.png + ../Models/SteelCuffs/ElbowLeftBoxtie.png + ../Models/SteelCuffs/ElbowLeftFree.png + ../Models/SteelCuffs/ElbowLeftFront.png + ../Models/SteelCuffs/ElbowLeftUp.png + ../Models/SteelCuffs/ElbowLeftWristtie.png + ../Models/SteelCuffs/ElbowLeftYoked.png + ../Models/SteelCuffs/ElbowRightBoxtie.png + ../Models/SteelCuffs/ElbowRightFront.png + ../Models/SteelCuffs/ElbowRightUp.png + ../Models/SteelCuffs/ElbowRightWristtie.png + ../Models/SteelCuffs/ElbowRightYoked.png + ../Models/SteelCuffs/RimAnkleLeftClosed.png + ../Models/SteelCuffs/RimAnkleLeftKneel.png + ../Models/SteelCuffs/RimAnkleLeftKneelClosed.png + ../Models/SteelCuffs/RimAnkleLeftSpread.png + ../Models/SteelCuffs/RimAnkleRightClosed.png + ../Models/SteelCuffs/RimAnkleRightSpread.png + ../Models/SteelCuffs/RimBelt.png + ../Models/SteelCuffs/RimCollar.png + ../Models/SteelCuffs/RimElbowLeftBoxtie.png + ../Models/SteelCuffs/RimElbowLeftFree.png + ../Models/SteelCuffs/RimElbowLeftFront.png + ../Models/SteelCuffs/RimElbowLeftUp.png + ../Models/SteelCuffs/RimElbowLeftWristtie.png + ../Models/SteelCuffs/RimElbowLeftYoked.png + ../Models/SteelCuffs/RimElbowRightBoxtie.png + ../Models/SteelCuffs/RimElbowRightFront.png + ../Models/SteelCuffs/RimElbowRightUp.png + ../Models/SteelCuffs/RimElbowRightWristtie.png + ../Models/SteelCuffs/RimElbowRightYoked.png + ../Models/SteelCuffs/RimThighLeftClosed.png + ../Models/SteelCuffs/RimThighLeftKneel.png + ../Models/SteelCuffs/RimThighLeftKneelClosed.png + ../Models/SteelCuffs/RimThighLeftSpread.png + ../Models/SteelCuffs/RimThighRightClosed.png + ../Models/SteelCuffs/RimThighRightKneel.png + ../Models/SteelCuffs/RimThighRightKneelClosed.png + ../Models/SteelCuffs/RimThighRightSpread.png + ../Models/SteelCuffs/RimWristLeftFree.png + ../Models/SteelCuffs/RimWristLeftFront.png + ../Models/SteelCuffs/RimWristLeftYoked.png + ../Models/SteelCuffs/RimWristRightCrossed.png + ../Models/SteelCuffs/RimWristRightFree.png + ../Models/SteelCuffs/RimWristRightFront.png + ../Models/SteelCuffs/RimWristRightYoked.png + ../Models/SteelCuffs/ThighLeftClosed.png + ../Models/SteelCuffs/ThighLeftKneel.png + ../Models/SteelCuffs/ThighLeftKneelClosed.png + ../Models/SteelCuffs/ThighLeftSpread.png + ../Models/SteelCuffs/ThighRightClosed.png + ../Models/SteelCuffs/ThighRightKneel.png + ../Models/SteelCuffs/ThighRightKneelClosed.png + ../Models/SteelCuffs/ThighRightSpread.png + ../Models/SteelCuffs/WristLeftFree.png + ../Models/SteelCuffs/WristLeftFront.png + ../Models/SteelCuffs/WristLeftYoked.png + ../Models/SteelCuffs/WristRightCrossed.png + ../Models/SteelCuffs/WristRightFree.png + ../Models/SteelCuffs/WristRightFront.png + ../Models/SteelCuffs/WristRightYoked.png + ../Models/Succubus/FootSockLeftHogtie.png + ../Models/Succubus/FootSockRightKneel.png + ../Models/Succubus/SockLeftClosed.png + ../Models/Succubus/SockLeftKneel.png + ../Models/Succubus/SockLeftKneelClosed.png + ../Models/Succubus/SockLeftSpread.png + ../Models/Succubus/SockRightClosed.png + ../Models/Succubus/SockRightSpread.png + ../Models/Succubus/SuccubusClawLeftFree.png + ../Models/Succubus/SuccubusClawLeftFront.png + ../Models/Succubus/SuccubusClawLeftYoked.png + ../Models/Succubus/SuccubusClawRightFree.png + ../Models/Succubus/SuccubusClawRightFront.png + ../Models/Succubus/SuccubusClawRightYoked.png + ../Models/Succubus/SuccubusHornLeft.png + ../Models/Succubus/SuccubusHornLight.png + ../Models/Succubus/SuccubusHornRight.png + ../Models/Succubus/SuccubusTail.png + ../Models/Succubus/SuccubusTailLight.png + ../Models/Succubus/SuccubusWingBack.png + ../Models/Succubus/SuccubusWingBase.png + ../Models/Succubus/SuccubusWingLight.png + ../Models/Succubus/bac/SuccubusClawLeftFree.png + ../Models/Succubus/bac/SuccubusClawLeftFront.png + ../Models/Succubus/bac/SuccubusClawLeftYoked.png + ../Models/Succubus/bac/SuccubusClawRightFree.png + ../Models/Succubus/bac/SuccubusClawRightFront.png + ../Models/Succubus/bac/SuccubusClawRightYoked.png + ../Models/Swimsuit/ChestStrappyBoxtie.png + ../Models/Swimsuit/ChestStrappyFree.png + ../Models/Swimsuit/ChestStrappyUp.png + ../Models/Swimsuit/ChestStrappyWristtie.png + ../Models/Swimsuit/ChestStrappyYoked.png + ../Models/Swimsuit/Strappy.png + ../Models/Swimsuit/StrappyLower.png + ../Models/Swimsuit/StrappyLowerClosed.png + ../Models/Swimsuit/SwimsuitChestBoxtie.png + ../Models/Swimsuit/SwimsuitChestFree.png + ../Models/Swimsuit/SwimsuitChestFront.png + ../Models/Swimsuit/SwimsuitChestUp.png + ../Models/Swimsuit/SwimsuitChestWristtie.png + ../Models/Swimsuit/SwimsuitChestYoked.png + ../Models/Swimsuit/SwimsuitClosed.png + ../Models/Swimsuit/SwimsuitKneel.png + ../Models/Swimsuit/SwimsuitSpread.png + ../Models/Swimsuit/VBikini.png + ../Models/Swimsuit/VBikiniClosed.png + ../Models/Tails/Fox.png + ../Models/Tails/Fox2.png + ../Models/Tails/Fox3.png + ../Models/Tails/Fox4.png + ../Models/Tails/Fox5.png + ../Models/Tails/Fox6.png + ../Models/Tails/Fox7.png + ../Models/Tails/Kitty.png + ../Models/Tails/Kitty2.png + ../Models/Tails/Wolf.png + ../Models/TallBallet/TallLeftClosed.png + ../Models/TallBallet/TallLeftHogtie.png + ../Models/TallBallet/TallLeftKneel.png + ../Models/TallBallet/TallLeftKneelClosed.png + ../Models/TallBallet/TallLeftSpread.png + ../Models/TallBallet/TallLegLeftHogtie.png + ../Models/TallBallet/TallLegLeftKneel.png + ../Models/TallBallet/TallLegLeftKneelClosed.png + ../Models/TallBallet/TallLegRightHogtie.png + ../Models/TallBallet/TallLegRightKneel.png + ../Models/TallBallet/TallLegRightKneelClosed.png + ../Models/TallBallet/TallRightClosed.png + ../Models/TallBallet/TallRightKneel.png + ../Models/TallBallet/TallRightSpread.png + ../Models/TallSmoothHeels/TallLeftClosed.png + ../Models/TallSmoothHeels/TallLeftHogtie.png + ../Models/TallSmoothHeels/TallLeftKneel.png + ../Models/TallSmoothHeels/TallLeftKneelClosed.png + ../Models/TallSmoothHeels/TallLeftSpread.png + ../Models/TallSmoothHeels/TallLegLeftHogtie.png + ../Models/TallSmoothHeels/TallLegLeftKneel.png + ../Models/TallSmoothHeels/TallLegLeftKneelClosed.png + ../Models/TallSmoothHeels/TallLegRightHogtie.png + ../Models/TallSmoothHeels/TallLegRightKneel.png + ../Models/TallSmoothHeels/TallLegRightKneelClosed.png + ../Models/TallSmoothHeels/TallRightClosed.png + ../Models/TallSmoothHeels/TallRightHogtie.png + ../Models/TallSmoothHeels/TallRightKneel.png + ../Models/TallSmoothHeels/TallRightSpread.png + ../Models/TapeHeavy/AnklesClosed.png + ../Models/TapeHeavy/AnklesHogtie.png + ../Models/TapeHeavy/AnklesKneelClosed.png + ../Models/TapeHeavy/ArmFullLeftBoxtie.png + ../Models/TapeHeavy/ArmFullLeftCrossed.png + ../Models/TapeHeavy/ArmFullLeftWristtie.png + ../Models/TapeHeavy/ArmFullRightBoxtie.png + ../Models/TapeHeavy/ArmFullRightCrossed.png + ../Models/TapeHeavy/ArmFullRightWristtie.png + ../Models/TapeHeavy/ArmLeftBoxtie.png + ../Models/TapeHeavy/ArmLeftCrossed.png + ../Models/TapeHeavy/ArmLeftWristtie.png + ../Models/TapeHeavy/ArmRightBoxtie.png + ../Models/TapeHeavy/ArmRightCrossed.png + ../Models/TapeHeavy/ArmRightWristtie.png + ../Models/TapeHeavy/BottomClosed.png + ../Models/TapeHeavy/BottomHogtie.png + ../Models/TapeHeavy/BottomKneel.png + ../Models/TapeHeavy/BottomKneelClosed.png + ../Models/TapeHeavy/Chest.png + ../Models/TapeHeavy/ChestBoxtie.png + ../Models/TapeHeavy/ChestCrossed.png + ../Models/TapeHeavy/ChestPetsuit.png + ../Models/TapeHeavy/ChestStrap.png + ../Models/TapeHeavy/ChestWristtie.png + ../Models/TapeHeavy/Collar.png + ../Models/TapeHeavy/FeetClosed.png + ../Models/TapeHeavy/FeetHogtie.png + ../Models/TapeHeavy/FeetKneel.png + ../Models/TapeHeavy/HandLeftFree.png + ../Models/TapeHeavy/HandLeftFront.png + ../Models/TapeHeavy/HandLeftYoked.png + ../Models/TapeHeavy/HandRightBoxtie.png + ../Models/TapeHeavy/HandRightFree.png + ../Models/TapeHeavy/HandRightFront.png + ../Models/TapeHeavy/HandRightYoked.png + ../Models/TapeHeavy/LegsClosed.png + ../Models/TapeHeavy/LegsHogtie.png + ../Models/TapeHeavy/LegsKneel.png + ../Models/TapeHeavy/LegsKneelClosed.png + ../Models/TapeHeavy/PetsuitTopArms.png + ../Models/TapeHeavy/PetsuitTopBody.png + ../Models/TapeHeavy/PetsuitTopHands.png + ../Models/TapeHeavy/PetsuitTopTapedHands.png + ../Models/TapeHeavy/RightLegsClosed.png + ../Models/TapeHeavy/RightLegsHogtie.png + ../Models/TapeHeavy/RightLegsKneel.png + ../Models/TapeHeavy/RightLegsKneelClosed.png + ../Models/TapeHeavy/StrapCover.png + ../Models/TapeHeavy/TopBoxtie.png + ../Models/TapeHeavy/TopCrossed.png + ../Models/TapeHeavy/TopFullBoxtie.png + ../Models/TapeHeavy/TopFullCrossed.png + ../Models/TapeHeavy/TopFullWristtie.png + ../Models/TapeHeavy/TopWristtie.png + ../Models/TapeLight/AnklesClosed.png + ../Models/TapeLight/AnklesHogtie.png + ../Models/TapeLight/AnklesKneelClosed.png + ../Models/TapeLight/ArmLeftBoxtie.png + ../Models/TapeLight/ArmLeftCrossed.png + ../Models/TapeLight/ArmLeftWristtie.png + ../Models/TapeLight/ArmRightBoxtie.png + ../Models/TapeLight/ArmRightCrossed.png + ../Models/TapeLight/ArmRightWristtie.png + ../Models/TapeLight/ArmStrapLeftBoxtie.png + ../Models/TapeLight/ArmStrapLeftCrossed.png + ../Models/TapeLight/ArmStrapLeftWristtie.png + ../Models/TapeLight/ArmStrapRightBoxtie.png + ../Models/TapeLight/ArmStrapRightCrossed.png + ../Models/TapeLight/ArmStrapRightWristtie.png + ../Models/TapeLight/BottomClosed.png + ../Models/TapeLight/BottomHogtie.png + ../Models/TapeLight/BottomKneel.png + ../Models/TapeLight/BottomKneelClosed.png + ../Models/TapeLight/Chest.png + ../Models/TapeLight/ChestPetsuit.png + ../Models/TapeLight/ChestStrap.png + ../Models/TapeLight/FeetClosed.png + ../Models/TapeLight/FeetKneel.png + ../Models/TapeLight/HandLeftFree.png + ../Models/TapeLight/HandLeftFront.png + ../Models/TapeLight/HandLeftYoked.png + ../Models/TapeLight/HandRightBoxtie.png + ../Models/TapeLight/HandRightFree.png + ../Models/TapeLight/HandRightFront.png + ../Models/TapeLight/HandRightYoked.png + ../Models/TapeLight/LegsClosed.png + ../Models/TapeLight/LegsHogtie.png + ../Models/TapeLight/LegsKneel.png + ../Models/TapeLight/LegsKneelClosed.png + ../Models/TapeLight/PetsuitTopArms.png + ../Models/TapeLight/PetsuitTopBody.png + ../Models/TapeLight/PetsuitTopHands.png + ../Models/TapeLight/PetsuitTopTapedHands.png + ../Models/TapeLight/RightLegsClosed.png + ../Models/TapeLight/RightLegsHogtie.png + ../Models/TapeLight/RightLegsKneel.png + ../Models/TapeLight/RightLegsKneelClosed.png + ../Models/TapeLight/StrapCover.png + ../Models/TapeLight/TopBoxtie.png + ../Models/TapeLight/TopCrossed.png + ../Models/TapeLight/TopWristtie.png + ../Models/TapeMed/AnklesClosed.png + ../Models/TapeMed/AnklesHogtie.png + ../Models/TapeMed/AnklesKneelClosed.png + ../Models/TapeMed/ArmFullLeftBoxtie.png + ../Models/TapeMed/ArmFullLeftCrossed.png + ../Models/TapeMed/ArmFullLeftWristtie.png + ../Models/TapeMed/ArmFullRightBoxtie.png + ../Models/TapeMed/ArmFullRightCrossed.png + ../Models/TapeMed/ArmFullRightWristtie.png + ../Models/TapeMed/ArmLeftBoxtie.png + ../Models/TapeMed/ArmLeftCrossed.png + ../Models/TapeMed/ArmLeftWristtie.png + ../Models/TapeMed/ArmRightBoxtie.png + ../Models/TapeMed/ArmRightCrossed.png + ../Models/TapeMed/ArmRightWristtie.png + ../Models/TapeMed/ArmStrapLeftBoxtie.png + ../Models/TapeMed/ArmStrapLeftCrossed.png + ../Models/TapeMed/ArmStrapLeftWristtie.png + ../Models/TapeMed/ArmStrapRightBoxtie.png + ../Models/TapeMed/ArmStrapRightCrossed.png + ../Models/TapeMed/ArmStrapRightWristtie.png + ../Models/TapeMed/BottomClosed.png + ../Models/TapeMed/BottomHogtie.png + ../Models/TapeMed/BottomKneel.png + ../Models/TapeMed/BottomKneelClosed.png + ../Models/TapeMed/Chest.png + ../Models/TapeMed/ChestFull.png + ../Models/TapeMed/ChestPetsuit.png + ../Models/TapeMed/ChestStrap.png + ../Models/TapeMed/FeetClosed.png + ../Models/TapeMed/FeetKneel.png + ../Models/TapeMed/HandLeftFree.png + ../Models/TapeMed/HandLeftFront.png + ../Models/TapeMed/HandLeftYoked.png + ../Models/TapeMed/HandRightBoxtie.png + ../Models/TapeMed/HandRightFree.png + ../Models/TapeMed/HandRightFront.png + ../Models/TapeMed/HandRightYoked.png + ../Models/TapeMed/LegsClosed.png + ../Models/TapeMed/LegsHogtie.png + ../Models/TapeMed/LegsKneel.png + ../Models/TapeMed/LegsKneelClosed.png + ../Models/TapeMed/PetsuitTopArms.png + ../Models/TapeMed/PetsuitTopBody.png + ../Models/TapeMed/PetsuitTopHands.png + ../Models/TapeMed/PetsuitTopTapedHands.png + ../Models/TapeMed/RightLegsClosed.png + ../Models/TapeMed/RightLegsHogtie.png + ../Models/TapeMed/RightLegsKneel.png + ../Models/TapeMed/RightLegsKneelClosed.png + ../Models/TapeMed/StrapCover.png + ../Models/TapeMed/TopBoxtie.png + ../Models/TapeMed/TopCrossed.png + ../Models/TapeMed/TopFullBoxtie.png + ../Models/TapeMed/TopFullCrossed.png + ../Models/TapeMed/TopFullWristtie.png + ../Models/TapeMed/TopStrapBoxtie.png + ../Models/TapeMed/TopStrapCrossed.png + ../Models/TapeMed/TopStrapWristtie.png + ../Models/TapeMed/TopWristtie.png + ../Models/Uniform/ArmLeftBoxtie.png + ../Models/Uniform/ArmLeftCrossed.png + ../Models/Uniform/ArmLeftFree.png + ../Models/Uniform/ArmLeftFront.png + ../Models/Uniform/ArmLeftUp.png + ../Models/Uniform/ArmLeftWristtie.png + ../Models/Uniform/ArmLeftYoked.png + ../Models/Uniform/ArmRightBoxtie.png + ../Models/Uniform/ArmRightCrossed.png + ../Models/Uniform/ArmRightFree.png + ../Models/Uniform/ArmRightFront.png + ../Models/Uniform/ArmRightUp.png + ../Models/Uniform/ArmRightWristtie.png + ../Models/Uniform/ArmRightYoked.png + ../Models/Uniform/BeltPouch.png + ../Models/Uniform/BeltPouchRim.png + ../Models/Uniform/Dress.png + ../Models/Uniform/DressChestBoxtie.png + ../Models/Uniform/DressChestFree.png + ../Models/Uniform/DressChestUp.png + ../Models/Uniform/DressChestWristtie.png + ../Models/Uniform/DressChestYoked.png + ../Models/Uniform/DressSkirt.png + ../Models/Uniform/DressSkirtHogtie.png + ../Models/Uniform/DressSkirtKneel.png + ../Models/Uniform/FootSockLeftHogtie.png + ../Models/Uniform/FootSockRightKneel.png + ../Models/Uniform/ForeArmLeftCrossed.png + ../Models/Uniform/ForeArmLeftFront.png + ../Models/Uniform/ForeArmRightCrossed.png + ../Models/Uniform/ForeArmRightFront.png + ../Models/Uniform/Hairpin.png + ../Models/Uniform/Hat.png + ../Models/Uniform/HatCap.png + ../Models/Uniform/HatGloriousInsignia.png + ../Models/Uniform/HatGloriousInsigniaHS.png + ../Models/Uniform/HatRim.png + ../Models/Uniform/Headgear.png + ../Models/Uniform/HeadgearBack.png + ../Models/Uniform/HeadgearEars.png + ../Models/Uniform/HeadgearEarsInner.png + ../Models/Uniform/HeadgearUnit.png + ../Models/Uniform/PantyhoseClosed.png + ../Models/Uniform/PantyhoseHogtie.png + ../Models/Uniform/PantyhoseKneel.png + ../Models/Uniform/PantyhoseKneelClosed.png + ../Models/Uniform/PantyhoseSpread.png + ../Models/Uniform/Searchlight.png + ../Models/Uniform/SearchlightBase.png + ../Models/Uniform/SearchlightLens.png + ../Models/Uniform/SearchlightPouch.png + ../Models/Uniform/ShoeLeftClosed.png + ../Models/Uniform/ShoeLeftHogtie.png + ../Models/Uniform/ShoeLeftKneel.png + ../Models/Uniform/ShoeLeftKneelClosed.png + ../Models/Uniform/ShoeLeftSpread.png + ../Models/Uniform/ShoeRightClosed.png + ../Models/Uniform/ShoeRightKneel.png + ../Models/Uniform/ShoeRightSpread.png + ../Models/Uniform/ShoulderRightUp.png + ../Models/Uniform/Skirt.png + ../Models/Uniform/SkirtBand.png + ../Models/Uniform/SkirtBandKneel.png + ../Models/Uniform/SkirtKneel.png + ../Models/Uniform/SleeveLeftBoxtie.png + ../Models/Uniform/SleeveLeftCrossed.png + ../Models/Uniform/SleeveLeftFree.png + ../Models/Uniform/SleeveLeftFront.png + ../Models/Uniform/SleeveLeftUp.png + ../Models/Uniform/SleeveLeftWristtie.png + ../Models/Uniform/SleeveLeftYoked.png + ../Models/Uniform/SleeveRightBoxtie.png + ../Models/Uniform/SleeveRightCrossed.png + ../Models/Uniform/SleeveRightFree.png + ../Models/Uniform/SleeveRightFront.png + ../Models/Uniform/SleeveRightUp.png + ../Models/Uniform/SleeveRightWristtie.png + ../Models/Uniform/SleeveRightYoked.png + ../Models/Uniform/SockLeftClosed.png + ../Models/Uniform/SockLeftHogtie.png + ../Models/Uniform/SockLeftKneel.png + ../Models/Uniform/SockLeftKneelClosed.png + ../Models/Uniform/SockLeftSpread.png + ../Models/Uniform/SockRightClosed.png + ../Models/Uniform/SockRightHogtie.png + ../Models/Uniform/SockRightKneel.png + ../Models/Uniform/SockRightKneelClosed.png + ../Models/Uniform/SockRightSpread.png + ../Models/Uniform/Webbing.png + ../Models/Uniform/WebbingHardware.png + ../Models/Uniform/WebbingName.png + ../Models/Uniform/WebbingSide.png + ../Models/Uniform/WebbingSideTied.png + ../Models/Uniform/WebbingSideUp.png + ../Models/Uniform/WebbingSideWristtie.png + ../Models/Uniform/WebbingSideYoked.png + ../Models/Uniform/WebbingUnderbust.png + ../Models/Uniform/WebbingUnderbustHardware.png + ../Models/Uniform/WebbingUp.png + ../Models/Uniform/WebbingWristtie.png + ../Models/UniformShirt/Dress.png + ../Models/UniformShirt/DressChestBoxtie.png + ../Models/UniformShirt/DressChestFree.png + ../Models/UniformShirt/DressChestUp.png + ../Models/UniformShirt/DressChestWristtie.png + ../Models/UniformShirt/DressChestYoked.png + ../Models/UniformShirt/ForeArmLeftCrossed.png + ../Models/UniformShirt/ForeArmLeftFront.png + ../Models/UniformShirt/ForeArmRightCrossed.png + ../Models/UniformShirt/ForeArmRightFront.png + ../Models/UniformShirt/ForeGloveLeftFront.png + ../Models/UniformShirt/ForeGloveRightCrossed.png + ../Models/UniformShirt/ForeGloveRightFront.png + ../Models/UniformShirt/GloveLeftFree.png + ../Models/UniformShirt/GloveLeftYoked.png + ../Models/UniformShirt/GloveRightBoxtie.png + ../Models/UniformShirt/GloveRightFree.png + ../Models/UniformShirt/GloveRightYoked.png + ../Models/UniformShirt/ShoulderRightUp.png + ../Models/UniformShirt/SleeveLeftBoxtie.png + ../Models/UniformShirt/SleeveLeftCrossed.png + ../Models/UniformShirt/SleeveLeftFree.png + ../Models/UniformShirt/SleeveLeftFront.png + ../Models/UniformShirt/SleeveLeftUp.png + ../Models/UniformShirt/SleeveLeftWristtie.png + ../Models/UniformShirt/SleeveLeftYoked.png + ../Models/UniformShirt/SleeveRightBoxtie.png + ../Models/UniformShirt/SleeveRightCrossed.png + ../Models/UniformShirt/SleeveRightFree.png + ../Models/UniformShirt/SleeveRightFront.png + ../Models/UniformShirt/SleeveRightUp.png + ../Models/UniformShirt/SleeveRightWristtie.png + ../Models/UniformShirt/SleeveRightYoked.png + ../Models/Vibe/Band.png + ../Models/Vibe/Remote.png + ../Models/Vibe/Wire.png + ../Models/Visors/Dollmaker.png + ../Models/Visors/DollmakerFull.png + ../Models/Visors/DollmakerFullRim.png + ../Models/Warrior/ArmbandBoxtie.png + ../Models/Warrior/ArmbandFree.png + ../Models/Warrior/ArmbandWristtie.png + ../Models/Warrior/ArmbandYoked.png + ../Models/Warrior/BandForeGloveLeftFront.png + ../Models/Warrior/BandForeGloveRightFront.png + ../Models/Warrior/BandGloveLeftFree.png + ../Models/Warrior/BandGloveLeftYoked.png + ../Models/Warrior/BandGloveRightFree.png + ../Models/Warrior/BandGloveRightYoked.png + ../Models/Warrior/Belt.png + ../Models/Warrior/BeltCharm.png + ../Models/Warrior/Bra.png + ../Models/Warrior/BraYoked.png + ../Models/Warrior/Bustier.png + ../Models/Warrior/BustierChest.png + ../Models/Warrior/Collar.png + ../Models/Warrior/FootShoeLeftHogtie.png + ../Models/Warrior/ForeGloveLeftFront.png + ../Models/Warrior/ForeGloveRightFront.png + ../Models/Warrior/GloveLeftFree.png + ../Models/Warrior/GloveLeftYoked.png + ../Models/Warrior/GloveRightBoxtie.png + ../Models/Warrior/GloveRightFree.png + ../Models/Warrior/GloveRightYoked.png + ../Models/Warrior/Necklace.png + ../Models/Warrior/NecklaceCharm.png + ../Models/Warrior/RimForeGloveLeftFront.png + ../Models/Warrior/RimForeGloveRightFront.png + ../Models/Warrior/RimGloveLeftFree.png + ../Models/Warrior/RimGloveLeftYoked.png + ../Models/Warrior/RimGloveRightFree.png + ../Models/Warrior/RimGloveRightYoked.png + ../Models/Warrior/ShoeLeftClosed.png + ../Models/Warrior/ShoeLeftClosedRopesAnkle.png + ../Models/Warrior/ShoeLeftHogtie.png + ../Models/Warrior/ShoeLeftKneel.png + ../Models/Warrior/ShoeLeftKneelClosed.png + ../Models/Warrior/ShoeLeftKneelClosedRopesAnkle.png + ../Models/Warrior/ShoeLeftSpread.png + ../Models/Warrior/ShoeRightClosed.png + ../Models/Warrior/ShoeRightClosedRopesAnkle.png + ../Models/Warrior/ShoeRightKneel.png + ../Models/Warrior/ShoeRightSpread.png + ../Models/Warrior/Skirt.png + ../Models/Warrior/SkirtCrotchStrap.png + ../Models/Warrior/SkirtKneel.png + ../Models/Warrior/SkirtKneelCrotchStrap.png + ../Models/Warrior/SkirtOverKneel.png + ../Models/Warrior/SkirtOverKneelCrotchStrap.png + ../Models/Weapon/LatexWhipFree.png + ../Models/Weapon/NightWhipFree.png + ../Models/Weapon/NightWhipLightFree.png + ../Models/Witch/ApprenticeHat.png + ../Models/Witch/ApprenticeHatPuff.png + ../Models/Witch/BlouseBust.png + ../Models/Witch/BlouseBustUp.png + ../Models/Witch/BlouseLeftBoxtie.png + ../Models/Witch/BlouseLeftFree.png + ../Models/Witch/BlouseLeftFront.png + ../Models/Witch/BlouseLeftUp.png + ../Models/Witch/BlouseLeftWristtie.png + ../Models/Witch/BlouseLeftYoked.png + ../Models/Witch/BlouseLiner.png + ../Models/Witch/BlouseRightBoxtie.png + ../Models/Witch/BlouseRightFree.png + ../Models/Witch/BlouseRightFront.png + ../Models/Witch/BlouseRightUp.png + ../Models/Witch/BlouseRightWristtie.png + ../Models/Witch/BlouseRightYoked.png + ../Models/Witch/Corset.png + ../Models/Witch/ShoeLeftClosed.png + ../Models/Witch/ShoeLeftHogtie.png + ../Models/Witch/ShoeLeftKneel.png + ../Models/Witch/ShoeLeftKneelClosed.png + ../Models/Witch/ShoeLeftSpread.png + ../Models/Witch/ShoeRightClosed.png + ../Models/Witch/ShoeRightKneel.png + ../Models/Witch/ShoeRightSpread.png + ../Models/Witch/Skirt.png + ../Models/Witch/SkirtBelt.png + ../Models/Witch/SkirtBeltClosed.png + ../Models/Witch/SkirtBeltKneel.png + ../Models/Witch/SkirtClosed.png + ../Models/Witch/SkirtClosedCrotchStrap.png + ../Models/Witch/SkirtCrotchStrap.png + ../Models/Witch/SkirtKneel.png + ../Models/Witch/SkirtKneelCrotchStrap.png + ../Models/Witch/SkirtOverKneel.png + ../Models/Witch/SkirtOverKneelCrotchStrap.png + ../Models/Witch/SkirtRuffle.png + ../Models/Witch/SkirtRuffleClosed.png + ../Models/Witch/SkirtRuffleClosedCrotchStrap.png + ../Models/Witch/SkirtRuffleCrotchStrap.png + ../Models/Witch/SkirtRuffleKneel.png + ../Models/Witch/SkirtRuffleKneelCrotchStrap.png + ../Models/Witch/SkirtRuffleOverKneel.png + ../Models/Witch/SkirtRuffleOverKneelCrotchStrap.png + ../Models/Witch/SkirtSplit.png + ../Models/Witch/SkirtSplitClosed.png + ../Models/Witch/SkirtSplitKneel.png + ../Models/Witch/SkirtSplitOverKneel.png + ../Models/Witch/WitchHat.png + ../Models/Witch/WitchHatBack.png + ../Models/Wolf/AnkleLeftClosed.png + ../Models/Wolf/AnkleLeftKneel.png + ../Models/Wolf/AnkleLeftKneelClosed.png + ../Models/Wolf/AnkleLeftSpread.png + ../Models/Wolf/AnkleRightClosed.png + ../Models/Wolf/AnkleRightSpread.png + ../Models/Wolf/BandAnkleLeftClosed.png + ../Models/Wolf/BandAnkleLeftKneel.png + ../Models/Wolf/BandAnkleLeftKneelClosed.png + ../Models/Wolf/BandAnkleLeftSpread.png + ../Models/Wolf/BandAnkleRightClosed.png + ../Models/Wolf/BandAnkleRightSpread.png + ../Models/Wolf/BeltBandMid.png + ../Models/Wolf/BeltHardwareMid.png + ../Models/Wolf/BeltMid.png + ../Models/Wolf/Collar.png + ../Models/Wolf/CollarBand.png + ../Models/Wolf/CollarHardware.png + ../Models/Wolf/CollarTag.png + ../Models/Wolf/FCollar.png + ../Models/Wolf/FCollarBand.png + ../Models/Wolf/FCollarHardware.png + ../Models/Wolf/FCollarTag.png + ../Models/Wolf/HarnessBandLower.png + ../Models/Wolf/HarnessBandLowerClosed.png + ../Models/Wolf/HarnessBandLowerKneel.png + ../Models/Wolf/HarnessBandUpper.png + ../Models/Wolf/HarnessHardwareLower.png + ../Models/Wolf/HarnessHardwareLowerClosed.png + ../Models/Wolf/HarnessHardwareLowerKneel.png + ../Models/Wolf/HarnessHardwareMid.png + ../Models/Wolf/HarnessHardwareMidKneel.png + ../Models/Wolf/HarnessLower.png + ../Models/Wolf/HarnessLowerClosed.png + ../Models/Wolf/HarnessLowerKneel.png + ../Models/Wolf/HarnessMid.png + ../Models/Wolf/HarnessMidKneel.png + ../Models/Wolf/HarnessUpper.png + ../Models/Wolf/Module.png + ../Models/Wolf/ModuleDisplay.png + ../Models/Wolf/Panties.png + ../Models/Wolf/PantiesClosed.png + ../Models/Wolf/PantiesKneel.png + ../Models/WolfCatsuit/BandForeGloveLeftFront.png + ../Models/WolfCatsuit/BandForeGloveRightFront.png + ../Models/WolfCatsuit/BandGloveLeftFree.png + ../Models/WolfCatsuit/BandGloveLeftYoked.png + ../Models/WolfCatsuit/BandGloveRightFree.png + ../Models/WolfCatsuit/BandGloveRightYoked.png + ../Models/WolfCatsuit/ButtKneel.png + ../Models/WolfCatsuit/Chest.png + ../Models/WolfCatsuit/Chest2.png + ../Models/WolfCatsuit/ChestBand.png + ../Models/WolfCatsuit/ChestRim.png + ../Models/WolfCatsuit/ForeGloveLeftCrossed.png + ../Models/WolfCatsuit/ForeGloveLeftFront.png + ../Models/WolfCatsuit/ForeGloveRightCrossed.png + ../Models/WolfCatsuit/ForeGloveRightFront.png + ../Models/WolfCatsuit/GloveLeftBoxtie.png + ../Models/WolfCatsuit/GloveLeftCrossed.png + ../Models/WolfCatsuit/GloveLeftFree.png + ../Models/WolfCatsuit/GloveLeftFront.png + ../Models/WolfCatsuit/GloveLeftUp.png + ../Models/WolfCatsuit/GloveLeftWristtie.png + ../Models/WolfCatsuit/GloveLeftYoked.png + ../Models/WolfCatsuit/GloveRightBoxtie.png + ../Models/WolfCatsuit/GloveRightCrossed.png + ../Models/WolfCatsuit/GloveRightFree.png + ../Models/WolfCatsuit/GloveRightFront.png + ../Models/WolfCatsuit/GloveRightUp.png + ../Models/WolfCatsuit/GloveRightWristtie.png + ../Models/WolfCatsuit/GloveRightYoked.png + ../Models/WolfCatsuit/LegBandLeftClosed.png + ../Models/WolfCatsuit/LegBandLeftHogtie.png + ../Models/WolfCatsuit/LegBandLeftKneel.png + ../Models/WolfCatsuit/LegBandLeftKneelClosed.png + ../Models/WolfCatsuit/LegBandLeftSpread.png + ../Models/WolfCatsuit/LegBandRightClosed.png + ../Models/WolfCatsuit/LegBandRightHogtie.png + ../Models/WolfCatsuit/LegBandRightKneel.png + ../Models/WolfCatsuit/LegBandRightKneelClosed.png + ../Models/WolfCatsuit/LegBandRightSpread.png + ../Models/WolfCatsuit/LegLeftClosed.png + ../Models/WolfCatsuit/LegLeftHogtie.png + ../Models/WolfCatsuit/LegLeftKneel.png + ../Models/WolfCatsuit/LegLeftKneelClosed.png + ../Models/WolfCatsuit/LegLeftSpread.png + ../Models/WolfCatsuit/LegPadsLeftClosed.png + ../Models/WolfCatsuit/LegPadsLeftHogtie.png + ../Models/WolfCatsuit/LegPadsLeftKneel.png + ../Models/WolfCatsuit/LegPadsLeftKneelClosed.png + ../Models/WolfCatsuit/LegPadsLeftSpread.png + ../Models/WolfCatsuit/LegPadsRightClosed.png + ../Models/WolfCatsuit/LegPadsRightHogtie.png + ../Models/WolfCatsuit/LegPadsRightKneel.png + ../Models/WolfCatsuit/LegPadsRightKneelClosed.png + ../Models/WolfCatsuit/LegPadsRightSpread.png + ../Models/WolfCatsuit/LegRightClosed.png + ../Models/WolfCatsuit/LegRightHogtie.png + ../Models/WolfCatsuit/LegRightKneel.png + ../Models/WolfCatsuit/LegRightKneelClosed.png + ../Models/WolfCatsuit/LegRightSpread.png + ../Models/WolfCatsuit/LegRimLeftClosed.png + ../Models/WolfCatsuit/LegRimLeftHogtie.png + ../Models/WolfCatsuit/LegRimLeftKneel.png + ../Models/WolfCatsuit/LegRimLeftKneelClosed.png + ../Models/WolfCatsuit/LegRimLeftSpread.png + ../Models/WolfCatsuit/LegRimRightClosed.png + ../Models/WolfCatsuit/LegRimRightHogtie.png + ../Models/WolfCatsuit/LegRimRightKneel.png + ../Models/WolfCatsuit/LegRimRightKneelClosed.png + ../Models/WolfCatsuit/LegRimRightSpread.png + ../Models/WolfCatsuit/RimForeGloveLeftFront.png + ../Models/WolfCatsuit/RimForeGloveRightFront.png + ../Models/WolfCatsuit/RimGloveLeftFree.png + ../Models/WolfCatsuit/RimGloveLeftYoked.png + ../Models/WolfCatsuit/RimGloveRightFree.png + ../Models/WolfCatsuit/RimGloveRightYoked.png + ../Models/WolfCatsuit/ShoeLeftClosed.png + ../Models/WolfCatsuit/ShoeLeftHogtie.png + ../Models/WolfCatsuit/ShoeLeftKneel.png + ../Models/WolfCatsuit/ShoeLeftKneelClosed.png + ../Models/WolfCatsuit/ShoeLeftSpread.png + ../Models/WolfCatsuit/ShoeRightClosed.png + ../Models/WolfCatsuit/ShoeRightKneel.png + ../Models/WolfCatsuit/ShoeRightSpread.png + ../Models/WolfCatsuit/TorsoLower.png + ../Models/WolfCatsuit/TorsoLowerBand.png + ../Models/WolfCatsuit/TorsoLowerBandClosed.png + ../Models/WolfCatsuit/TorsoLowerBandKneel.png + ../Models/WolfCatsuit/TorsoLowerClosed.png + ../Models/WolfCatsuit/TorsoLowerKneel.png + ../Models/WolfCatsuit/TorsoLowerRim.png + ../Models/WolfCatsuit/TorsoLowerRimClosed.png + ../Models/WolfCatsuit/TorsoLowerRimKneel.png + ../Models/WolfCatsuit/TorsoUpper.png + ../Models/WolfCatsuit/TorsoUpper2.png + ../Models/WolfCatsuit/TorsoUpperBand.png + ../Models/WolfCatsuit/TorsoUpperBeltBuckle.png + ../Models/WolfCatsuit/TorsoUpperBeltStrap.png + ../Models/WolfCatsuit/TorsoUpperCups.png + ../Models/WolfCatsuit/TorsoUpperRim.png + ../Models/Yoke/HeavySteel.png + ../Models/Yoke/HeavySteelHardware.png + ../Models/Yoke/HeavySteelLock.png + ../Models/Yoke/HeavySteelPins.png + ../Models/Yoke/Steel.png + ../Models/Yoke/SteelBar.png + ../Models/Yukata/Shirt.png + ../Models/Yukata/ShirtChest.png + ../Models/Yukata/ShirtChestTied.png + ../Models/Yukata/ShirtChestUp.png + ../Models/Yukata/ShirtChestYoked.png + ../Models/Yukata/Skirt.png + ../Models/Yukata/SkirtClosed.png + ../Models/Yukata/SkirtClosedCrotchStrap.png + ../Models/Yukata/SkirtCrotchStrap.png + ../Models/Yukata/SkirtHogtie.png + ../Models/Yukata/SkirtHogtieCrotchStrap.png + ../Models/Yukata/SkirtKneel.png + ../Models/Yukata/SkirtKneelCrotchStrap.png + ../Models/Yukata/SkirtOverKneel.png + ../Models/Yukata/SkirtOverKneelCrotchStrap.png + ../Models/Yukata/SleeveLeftBoxtie.png + ../Models/Yukata/SleeveLeftFree.png + ../Models/Yukata/SleeveLeftFront.png + ../Models/Yukata/SleeveLeftUp.png + ../Models/Yukata/SleeveLeftWristtie.png + ../Models/Yukata/SleeveLeftYoked.png + ../Models/Yukata/SleeveRightBoxtie.png + ../Models/Yukata/SleeveRightFree.png + ../Models/Yukata/SleeveRightFront.png + ../Models/Yukata/SleeveRightUp.png + ../Models/Yukata/SleeveRightWristtie.png + ../Models/Yukata/SleeveRightYoked.png + ../Models/Yukata/Waist.png + ../Models/Yukata/WaistBand.png + ../Models/Yukata/WaistPattern.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 620,877,1240,1754 + scale9Paddings + 620,877,1240,1754 + scale9FromFile + + + ../Models/Armbinder/BinderRightWristtie.png + ../Models/Body/Butt2.png + ../Models/Festive/BinderRightWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 0,0,1,1 + scale9Paddings + 0,0,1,1 + scale9FromFile + + + ../Models/Belts/RightArm2Wristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 3,3,5,7 + scale9Paddings + 3,3,5,7 + scale9FromFile + + + ../Models/Blindfold/Basic.png + ../Models/Blindfold/BasicRim.png + ../Models/Blindfold/Cloth.png + ../Models/Blindfold/Tape.png + ../Models/Bubble/Gag.png + ../Models/FaceDask/Eyes2Angry.png + ../Models/FaceDask/Eyes2Closed.png + ../Models/FaceDask/Eyes2Dazed.png + ../Models/FaceDask/Eyes2Heart.png + ../Models/FaceDask/Eyes2Neutral.png + ../Models/FaceDask/Eyes2Sly.png + ../Models/FaceDask/Eyes2Surprised.png + ../Models/FaceDask/EyesAngry.png + ../Models/FaceDask/EyesClosed.png + ../Models/FaceDask/EyesDazed.png + ../Models/FaceDask/EyesHeart.png + ../Models/FaceDask/EyesNeutral.png + ../Models/FaceDask/EyesSly.png + ../Models/FaceDask/EyesSurprised.png + ../Models/FaceDask/WhitesEyes2Angry.png + ../Models/FaceDask/WhitesEyes2Closed.png + ../Models/FaceDask/WhitesEyes2Dazed.png + ../Models/FaceDask/WhitesEyes2Heart.png + ../Models/FaceDask/WhitesEyes2Neutral.png + ../Models/FaceDask/WhitesEyes2Sly.png + ../Models/FaceDask/WhitesEyes2Surprised.png + ../Models/FaceDask/WhitesEyesAngry.png + ../Models/FaceDask/WhitesEyesClosed.png + ../Models/FaceDask/WhitesEyesDazed.png + ../Models/FaceDask/WhitesEyesHeart.png + ../Models/FaceDask/WhitesEyesNeutral.png + ../Models/FaceDask/WhitesEyesSly.png + ../Models/FaceDask/WhitesEyesSurprised.png + ../Models/FaceKjus/BlushExtreme.png + ../Models/FaceKoi/BlushExtreme.png + ../Models/FaceKoi/BlushHigh.png + ../Models/FaceKoi/BlushLow.png + ../Models/FaceKoi/BlushMedium.png + ../Models/FaceKoi/Brows2Angry.png + ../Models/FaceKoi/Brows2Annoyed.png + ../Models/FaceKoi/Brows2Neutral.png + ../Models/FaceKoi/Brows2Sad.png + ../Models/FaceKoi/Brows2Surprised.png + ../Models/FaceKoi/BrowsAngry.png + ../Models/FaceKoi/BrowsAnnoyed.png + ../Models/FaceKoi/BrowsNeutral.png + ../Models/FaceKoi/BrowsSad.png + ../Models/FaceKoi/BrowsSurprised.png + ../Models/FaceKoi/Eyes2Angry.png + ../Models/FaceKoi/Eyes2Closed.png + ../Models/FaceKoi/Eyes2Dazed.png + ../Models/FaceKoi/Eyes2Heart.png + ../Models/FaceKoi/Eyes2Neutral.png + ../Models/FaceKoi/Eyes2Sly.png + ../Models/FaceKoi/Eyes2Surprised.png + ../Models/FaceKoi/EyesAngry.png + ../Models/FaceKoi/EyesClosed.png + ../Models/FaceKoi/EyesDazed.png + ../Models/FaceKoi/EyesHeart.png + ../Models/FaceKoi/EyesNeutral.png + ../Models/FaceKoi/EyesSly.png + ../Models/FaceKoi/EyesSurprised.png + ../Models/FaceKoi/HumanEyes2Angry.png + ../Models/FaceKoi/HumanEyes2Closed.png + ../Models/FaceKoi/HumanEyes2Dazed.png + ../Models/FaceKoi/HumanEyes2Heart.png + ../Models/FaceKoi/HumanEyes2Neutral.png + ../Models/FaceKoi/HumanEyes2Sly.png + ../Models/FaceKoi/HumanEyes2Surprised.png + ../Models/FaceKoi/HumanEyesAngry.png + ../Models/FaceKoi/HumanEyesClosed.png + ../Models/FaceKoi/HumanEyesDazed.png + ../Models/FaceKoi/HumanEyesHeart.png + ../Models/FaceKoi/HumanEyesNeutral.png + ../Models/FaceKoi/HumanEyesSly.png + ../Models/FaceKoi/HumanEyesSurprised.png + ../Models/FaceKoi/MouthDazed.png + ../Models/FaceKoi/MouthDistracted.png + ../Models/FaceKoi/MouthEmbarrassed.png + ../Models/FaceKoi/MouthFrown.png + ../Models/FaceKoi/MouthNeutral.png + ../Models/FaceKoi/MouthPout.png + ../Models/FaceKoi/MouthSmile.png + ../Models/FaceKoi/MouthSurprised.png + ../Models/FaceKoi/WhitesEyes2Angry.png + ../Models/FaceKoi/WhitesEyes2Closed.png + ../Models/FaceKoi/WhitesEyes2Dazed.png + ../Models/FaceKoi/WhitesEyes2Heart.png + ../Models/FaceKoi/WhitesEyes2Neutral.png + ../Models/FaceKoi/WhitesEyes2Sly.png + ../Models/FaceKoi/WhitesEyes2Surprised.png + ../Models/FaceKoi/WhitesEyesAngry.png + ../Models/FaceKoi/WhitesEyesClosed.png + ../Models/FaceKoi/WhitesEyesDazed.png + ../Models/FaceKoi/WhitesEyesHeart.png + ../Models/FaceKoi/WhitesEyesNeutral.png + ../Models/FaceKoi/WhitesEyesSly.png + ../Models/FaceKoi/WhitesEyesSurprised.png + ../Models/FaceKoiBlank/Eyes2Angry.png + ../Models/FaceKoiBlank/Eyes2Closed.png + ../Models/FaceKoiBlank/Eyes2Dazed.png + ../Models/FaceKoiBlank/Eyes2Heart.png + ../Models/FaceKoiBlank/Eyes2Neutral.png + ../Models/FaceKoiBlank/Eyes2Sly.png + ../Models/FaceKoiBlank/Eyes2Surprised.png + ../Models/FaceKoiBlank/EyesAngry.png + ../Models/FaceKoiBlank/EyesClosed.png + ../Models/FaceKoiBlank/EyesDazed.png + ../Models/FaceKoiBlank/EyesHeart.png + ../Models/FaceKoiBlank/EyesNeutral.png + ../Models/FaceKoiBlank/EyesSly.png + ../Models/FaceKoiBlank/EyesSurprised.png + ../Models/FaceKoiBlank/WhitesEyes2Angry.png + ../Models/FaceKoiBlank/WhitesEyes2Closed.png + ../Models/FaceKoiBlank/WhitesEyes2Dazed.png + ../Models/FaceKoiBlank/WhitesEyes2Heart.png + ../Models/FaceKoiBlank/WhitesEyes2Neutral.png + ../Models/FaceKoiBlank/WhitesEyes2Sly.png + ../Models/FaceKoiBlank/WhitesEyes2Surprised.png + ../Models/FaceKoiBlank/WhitesEyesAngry.png + ../Models/FaceKoiBlank/WhitesEyesClosed.png + ../Models/FaceKoiBlank/WhitesEyesDazed.png + ../Models/FaceKoiBlank/WhitesEyesHeart.png + ../Models/FaceKoiBlank/WhitesEyesNeutral.png + ../Models/FaceKoiBlank/WhitesEyesSly.png + ../Models/FaceKoiBlank/WhitesEyesSurprised.png + ../Models/GagCloth/Cleave.png + ../Models/GagCloth/CleaveThick.png + ../Models/GagCloth/Knot.png + ../Models/GagCloth/OTM.png + ../Models/GagCloth/OTN.png + ../Models/GagFrilly/Duster.png + ../Models/GagFrilly/FrillyHardware.png + ../Models/GagFrilly/FrillyHighlights.png + ../Models/GagFrilly/FrillyPanel.png + ../Models/GagFrilly/FrillyStraps.png + ../Models/GagFrilly/FrillyStrapsOld.png + ../Models/GagLatex/Harness.png + ../Models/GagLatex/LatexPlug.png + ../Models/GagLatex/MuteLogo.png + ../Models/GagLatex/OTN.png + ../Models/GagLatex/OTNFlat.png + ../Models/GagLatex/SideStrap.png + ../Models/GagLeather/Ball.png + ../Models/GagLeather/Ball2Fang.png + ../Models/GagLeather/BallFang.png + ../Models/GagLeather/BallHarness.png + ../Models/GagLeather/BallHarnessLarge.png + ../Models/GagLeather/BallSideStrap.png + ../Models/GagLeather/BallStrap.png + ../Models/GagLeather/BallTeeth_Teeth.png + ../Models/GagLeather/BallTeeth_Teeth2Fang.png + ../Models/GagLeather/BallTeeth_TeethDeep.png + ../Models/GagLeather/BallTeeth_TeethDeep2Fang.png + ../Models/GagLeather/BallTeeth_TeethDeepFang.png + ../Models/GagLeather/BallTeeth_TeethFang.png + ../Models/GagLeather/Ball_Teeth.png + ../Models/GagLeather/Ball_Teeth2Fang.png + ../Models/GagLeather/Ball_TeethDeep.png + ../Models/GagLeather/Ball_TeethDeep2Fang.png + ../Models/GagLeather/Ball_TeethDeepFang.png + ../Models/GagLeather/Ball_TeethFang.png + ../Models/GagLeather/BigBall.png + ../Models/GagLeather/BigBall2Fang.png + ../Models/GagLeather/BigBallFang.png + ../Models/GagLeather/BigBallStrap.png + ../Models/GagLeather/BigBallTeethFang.png + ../Models/GagLeather/BigBallTeethFang2.png + ../Models/GagLeather/CrystalBall.png + ../Models/GagLeather/FabricMuzzle.png + ../Models/GagLeather/GhostBall.png + ../Models/GagLeather/GhostBall2Fang.png + ../Models/GagLeather/GhostBallFang.png + ../Models/GagLeather/GhostBallStrap.png + ../Models/GagLeather/KittyMouth.png + ../Models/GagLeather/LargeBallHarness.png + ../Models/GagLeather/Muzzle.png + ../Models/GagLeather/MuzzleHarness.png + ../Models/GagLeather/MuzzleSideStrap.png + ../Models/GagLeather/MuzzleStrap.png + ../Models/GagLeather/Panel.png + ../Models/GagLeather/PanelHarness.png + ../Models/GagLeather/PanelSideStrap.png + ../Models/GagLeather/PanelStrap.png + ../Models/GagLeather/Plug.png + ../Models/GagLeather/Whiskers.png + ../Models/GagMetal/Ball.png + ../Models/GagMetal/Ball2Fang.png + ../Models/GagMetal/BallFang.png + ../Models/GagMetal/BallHarness.png + ../Models/GagMetal/BallHarnessLarge.png + ../Models/GagMetal/BallHarnessSegmented.png + ../Models/GagMetal/BallHarnessSegmentedLarge.png + ../Models/GagMetal/BallSideStrap.png + ../Models/GagMetal/BallStrap.png + ../Models/GagMetal/BallTeeth_Teeth.png + ../Models/GagMetal/BallTeeth_Teeth2Fang.png + ../Models/GagMetal/BallTeeth_TeethDeep.png + ../Models/GagMetal/BallTeeth_TeethDeep2Fang.png + ../Models/GagMetal/BallTeeth_TeethDeepFang.png + ../Models/GagMetal/BallTeeth_TeethFang.png + ../Models/GagMetal/Ball_Teeth.png + ../Models/GagMetal/Ball_Teeth2Fang.png + ../Models/GagMetal/Ball_TeethDeep.png + ../Models/GagMetal/Ball_TeethDeep2Fang.png + ../Models/GagMetal/Ball_TeethDeepFang.png + ../Models/GagMetal/Ball_TeethFang.png + ../Models/GagMetal/BigBall.png + ../Models/GagMetal/BigBall2Fang.png + ../Models/GagMetal/BigBallFang.png + ../Models/GagMetal/BigBallStrap.png + ../Models/GagMetal/BigBallStrapSegmented.png + ../Models/GagMetal/BigBallTeethFang.png + ../Models/GagMetal/BigBallTeethFang2.png + ../Models/GagMetal/Display.png + ../Models/GagMetal/HarnessDisplay.png + ../Models/GagMetal/HarnessMask.png + ../Models/GagMetal/HarnessMaskDisplay.png + ../Models/GagMetal/HarnessRim.png + ../Models/GagMetal/OTN.png + ../Models/GagMetal/OTNRivets.png + ../Models/GagMetal/OTNStrap.png + ../Models/GagMetal/OTNStrapRivets.png + ../Models/GagMetal/Rim.png + ../Models/GagMetal/SciFiMuzzle.png + ../Models/GagMetal/SciFiMuzzle2.png + ../Models/GagMetal/SciFiPanel.png + ../Models/GagMetal/SciFiPlug.png + ../Models/GagTape/Cleave.png + ../Models/GagTape/Face.png + ../Models/GagTape/Full.png + ../Models/GagTape/Stuffing.png + ../Models/GagTape/Wrap.png + ../Models/Gasmask/Center.png + ../Models/Gasmask/Mask.png + ../Models/Gasmask/Nose.png + ../Models/Gasmask/Plugs.png + ../Models/Gasmask/Valves.png + ../Models/Kigu/MouthSmile.png + ../Models/ShadowHands/Eyes.png + ../Models/ShadowHands/Mouth.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 160,166,321,332 + scale9Paddings + 160,166,321,332 + scale9FromFile + + + ../Models/CyberArms/CuffForeLongMittenLeftCrossed.png + ../Models/CyberArms/GlowForeLongMittenLeftCrossed.png + ../Models/CyberArms/LockForeLongMittenLeftCrossed.png + ../Models/CyberArms/LockForeLongMittenLeftFront.png + ../Models/CyberArms/LockForeLongMittenRightCrossed.png + ../Models/CyberArms/LockForeLongMittenRightFront.png + ../Models/CyberArms/LockLongMittenRightBoxtie.png + ../Models/CyberArms/LockLongMittenRightCrossed.png + ../Models/CyberArms/LockLongMittenRightFree.png + ../Models/CyberArms/LockLongMittenRightFront.png + ../Models/CyberMitts/CuffForeLongMittenLeftCrossed.png + ../Models/CyberMitts/GlowForeLongMittenLeftCrossed.png + ../Models/CyberMitts/LockForeLongMittenLeftCrossed.png + ../Models/CyberMitts/LockForeLongMittenLeftFront.png + ../Models/CyberMitts/LockForeLongMittenRightCrossed.png + ../Models/CyberMitts/LockForeLongMittenRightFront.png + ../Models/CyberMitts/LockLongMittenRightBoxtie.png + ../Models/CyberMitts/LockLongMittenRightCrossed.png + ../Models/CyberMitts/LockLongMittenRightFree.png + ../Models/CyberMitts/LockLongMittenRightFront.png + ../Models/CyberMitts/UpperCuffForeLongMittenLeftCrossed.png + ../Models/CyberMitts/UpperGlowForeLongMittenLeftCrossed.png + ../Models/CyberMitts/UpperLockForeLongMittenLeftCrossed.png + ../Models/CyberMitts/UpperLockForeLongMittenLeftFront.png + ../Models/CyberMitts/UpperLockForeLongMittenRightCrossed.png + ../Models/CyberMitts/UpperLockForeLongMittenRightFront.png + ../Models/CyberMitts/UpperLockLongMittenRightBoxtie.png + ../Models/CyberMitts/UpperLockLongMittenRightCrossed.png + ../Models/CyberMitts/UpperLockLongMittenRightFree.png + ../Models/CyberMitts/UpperLockLongMittenRightFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 17,10,33,19 + scale9Paddings + 17,10,33,19 + scale9FromFile + + + ../Models/CyberArms/CuffLongMittenLeftCrossed.png + ../Models/CyberMitts/CapLongMittenLeftFront.png + ../Models/CyberMitts/CapLongMittenLeftUp.png + ../Models/CyberMitts/CapLongMittenLeftWristtie.png + ../Models/CyberMitts/CapLongMittenRightFront.png + ../Models/CyberMitts/CapLongMittenRightUp.png + ../Models/CyberMitts/CuffLongMittenLeftCrossed.png + ../Models/CyberMitts/UpperCuffLongMittenLeftCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 7,6,13,12 + scale9Paddings + 7,6,13,12 + scale9FromFile + + + ../Models/CyberArms/DisplayForeLongMittenLeftCrossed.png + ../Models/CyberArms/DisplayForeLongMittenLeftFront.png + ../Models/CyberArms/DisplayForeLongMittenRightCrossed.png + ../Models/CyberArms/DisplayForeLongMittenRightFront.png + ../Models/CyberArms/DisplayLongMittenLeftUp.png + ../Models/CyberArms/DisplayLongMittenRightBoxtie.png + ../Models/CyberArms/DisplayLongMittenRightCrossed.png + ../Models/CyberArms/DisplayLongMittenRightFree.png + ../Models/CyberArms/DisplayLongMittenRightFront.png + ../Models/CyberArms/DisplayLongMittenRightUp.png + ../Models/CyberArms/DisplayLongMittenRightWristtie.png + ../Models/CyberMitts/DisplayForeLongMittenLeftCrossed.png + ../Models/CyberMitts/DisplayForeLongMittenLeftFront.png + ../Models/CyberMitts/DisplayForeLongMittenRightCrossed.png + ../Models/CyberMitts/DisplayForeLongMittenRightFront.png + ../Models/CyberMitts/DisplayLongMittenLeftUp.png + ../Models/CyberMitts/DisplayLongMittenRightBoxtie.png + ../Models/CyberMitts/DisplayLongMittenRightCrossed.png + ../Models/CyberMitts/DisplayLongMittenRightFree.png + ../Models/CyberMitts/DisplayLongMittenRightFront.png + ../Models/CyberMitts/DisplayLongMittenRightUp.png + ../Models/CyberMitts/DisplayLongMittenRightWristtie.png + ../Models/CyberMitts/UpperDisplayForeLongMittenLeftCrossed.png + ../Models/CyberMitts/UpperDisplayForeLongMittenLeftFront.png + ../Models/CyberMitts/UpperDisplayForeLongMittenRightCrossed.png + ../Models/CyberMitts/UpperDisplayForeLongMittenRightFront.png + ../Models/CyberMitts/UpperDisplayLongMittenLeftUp.png + ../Models/CyberMitts/UpperDisplayLongMittenRightBoxtie.png + ../Models/CyberMitts/UpperDisplayLongMittenRightCrossed.png + ../Models/CyberMitts/UpperDisplayLongMittenRightFree.png + ../Models/CyberMitts/UpperDisplayLongMittenRightFront.png + ../Models/CyberMitts/UpperDisplayLongMittenRightUp.png + ../Models/CyberMitts/UpperDisplayLongMittenRightWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 4,3,7,6 + scale9Paddings + 4,3,7,6 + scale9FromFile + + + ../Models/CyberArms/GlowForeLongMittenRightCrossed.png + ../Models/CyberMitts/GlowForeLongMittenRightCrossed.png + ../Models/CyberMitts/UpperGlowForeLongMittenRightCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 9,8,18,15 + scale9Paddings + 9,8,18,15 + scale9FromFile + + + ../Models/CyberArms/GlowLongMittenLeftUp.png + ../Models/CyberMitts/GlowLongMittenLeftUp.png + ../Models/CyberMitts/UpperGlowLongMittenLeftUp.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 14,13,27,25 + scale9Paddings + 14,13,27,25 + scale9FromFile + + + ../Models/CyberArms/GlowLongMittenRightUp.png + ../Models/CyberMitts/GlowLongMittenRightUp.png + ../Models/CyberMitts/UpperGlowLongMittenRightUp.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 13,13,25,25 + scale9Paddings + 13,13,25,25 + scale9FromFile + + + ../Models/CyberArms/GlowLongMittenRightWristtie.png + ../Models/CyberMitts/GlowLongMittenRightWristtie.png + ../Models/CyberMitts/UpperGlowLongMittenRightWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 15,12,30,25 + scale9Paddings + 15,12,30,25 + scale9FromFile + + + ../Models/CyberArms/LockLongMittenLeftUp.png + ../Models/CyberArms/LockLongMittenRightUp.png + ../Models/CyberMitts/LockLongMittenLeftUp.png + ../Models/CyberMitts/LockLongMittenRightUp.png + ../Models/CyberMitts/UpperLockLongMittenLeftUp.png + ../Models/CyberMitts/UpperLockLongMittenRightUp.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 12,6,24,12 + scale9Paddings + 12,6,24,12 + scale9FromFile + + + ../Models/CyberArms/StrapsLongMittenLeftFront.png + ../Models/CyberArms/StrapsLongMittenRightFront.png + ../Models/CyberMitts/StrapsLongMittenLeftFront.png + ../Models/CyberMitts/StrapsLongMittenRightFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 9,8,19,15 + scale9Paddings + 9,8,19,15 + scale9FromFile + + + ../Models/CyberArms/StrapsLongMittenRightWristtie.png + ../Models/CyberMitts/StrapsLongMittenRightWristtie.png + ../Models/UniformShirt/GloveLeftFront.png + ../Models/Warrior/BandGloveLeftFront.png + ../Models/Warrior/GloveLeftFront.png + ../Models/Warrior/RimGloveLeftFront.png + ../Models/WolfCatsuit/BandGloveLeftFront.png + ../Models/WolfCatsuit/RimGloveLeftFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 7,7,14,14 + scale9Paddings + 7,7,14,14 + scale9FromFile + + + ../Models/CyberMitts/CapForeLongMittenLeftCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 11,8,21,15 + scale9Paddings + 11,8,21,15 + scale9FromFile + + + ../Models/CyberMitts/CapForeLongMittenRightCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 18,15,36,30 + scale9Paddings + 18,15,36,30 + scale9FromFile + + + ../Models/CyberMitts/CapLongMittenLeftBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 6,3,13,7 + scale9Paddings + 6,3,13,7 + scale9FromFile + + + ../Models/CyberMitts/CapLongMittenRightWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 9,10,19,20 + scale9Paddings + 9,10,19,20 + scale9FromFile + + + ../Models/EyesDai1/Brows2Angry.png + ../Models/EyesDai1/RidgeAngry.png + ../Models/EyesDai1/RidgeSad.png + ../Models/EyesDai2/Brows2Angry.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 351,177,703,355 + scale9Paddings + 351,177,703,355 + scale9FromFile + + + ../Models/EyesDai1/Brows2Annoyed.png + ../Models/EyesDai2/Brows2Annoyed.png + ../Models/FaceKjus/Brows2Annoyed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 359,202,717,405 + scale9Paddings + 359,202,717,405 + scale9FromFile + + + ../Models/EyesDai1/Brows2Neutral.png + ../Models/EyesDai2/Brows2Neutral.png + ../Models/FaceKjus/Brows2Neutral.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 362,212,725,423 + scale9Paddings + 362,212,725,423 + scale9FromFile + + + ../Models/EyesDai1/Brows2Sad.png + ../Models/EyesDai2/Brows2Sad.png + ../Models/FaceKjus/Brows2Sad.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 363,266,726,531 + scale9Paddings + 363,266,726,531 + scale9FromFile + + + ../Models/EyesDai1/Brows2Surprised.png + ../Models/EyesDai2/Brows2Surprised.png + ../Models/FaceKjus/Brows2Surprised.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 407,251,813,502 + scale9Paddings + 407,251,813,502 + scale9FromFile + + + ../Models/EyesDai1/BrowsAngry.png + ../Models/EyesDai2/BrowsAngry.png + ../Models/FaceKjus/BrowsAngry.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 347,203,693,407 + scale9Paddings + 347,203,693,407 + scale9FromFile + + + ../Models/EyesDai1/BrowsAnnoyed.png + ../Models/EyesDai2/BrowsAnnoyed.png + ../Models/FaceKjus/BrowsAnnoyed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 382,213,765,427 + scale9Paddings + 382,213,765,427 + scale9FromFile + + + ../Models/EyesDai1/BrowsNeutral.png + ../Models/EyesDai2/BrowsNeutral.png + ../Models/FaceKjus/BrowsNeutral.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 372,230,743,461 + scale9Paddings + 372,230,743,461 + scale9FromFile + + + ../Models/EyesDai1/BrowsSad.png + ../Models/EyesDai2/BrowsSad.png + ../Models/FaceKjus/BrowsSad.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 403,258,805,515 + scale9Paddings + 403,258,805,515 + scale9FromFile + + + ../Models/EyesDai1/BrowsSurprised.png + ../Models/EyesDai2/BrowsSurprised.png + ../Models/FaceKjus/BrowsSurprised.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 369,205,738,409 + scale9Paddings + 369,205,738,409 + scale9FromFile + + + ../Models/EyesK2/Eyes2Angry.png + ../Models/EyesK2/Eyes2Closed.png + ../Models/EyesK2/Eyes2Dazed.png + ../Models/EyesK2/Eyes2Neutral.png + ../Models/EyesK2/Eyes2Surprised.png + ../Models/EyesK2/EyesAngry.png + ../Models/EyesK2/EyesClosed.png + ../Models/EyesK2/EyesDazed.png + ../Models/EyesK2/EyesNeutral.png + ../Models/EyesK2/EyesSurprised.png + ../Models/EyesK2/WhitesEyes2Angry.png + ../Models/EyesK2/WhitesEyes2Closed.png + ../Models/EyesK2/WhitesEyes2Dazed.png + ../Models/EyesK2/WhitesEyes2Neutral.png + ../Models/EyesK2/WhitesEyes2Surprised.png + ../Models/EyesK2/WhitesEyesAngry.png + ../Models/EyesK2/WhitesEyesClosed.png + ../Models/EyesK2/WhitesEyesDazed.png + ../Models/EyesK2/WhitesEyesNeutral.png + ../Models/EyesK2/WhitesEyesSurprised.png + ../Models/EyesK3/Eyes2Angry.png + ../Models/EyesK3/Eyes2Closed.png + ../Models/EyesK3/Eyes2Dazed.png + ../Models/EyesK3/Eyes2Neutral.png + ../Models/EyesK3/Eyes2Surprised.png + ../Models/EyesK3/EyesAngry.png + ../Models/EyesK3/EyesClosed.png + ../Models/EyesK3/EyesDazed.png + ../Models/EyesK3/EyesNeutral.png + ../Models/EyesK3/EyesSurprised.png + ../Models/EyesK3/WhitesEyes2Angry.png + ../Models/EyesK3/WhitesEyes2Closed.png + ../Models/EyesK3/WhitesEyes2Dazed.png + ../Models/EyesK3/WhitesEyes2Neutral.png + ../Models/EyesK3/WhitesEyes2Surprised.png + ../Models/EyesK3/WhitesEyesAngry.png + ../Models/EyesK3/WhitesEyesClosed.png + ../Models/EyesK3/WhitesEyesDazed.png + ../Models/EyesK3/WhitesEyesNeutral.png + ../Models/EyesK3/WhitesEyesSurprised.png + ../Models/EyesK4/Eyes2Angry.png + ../Models/EyesK4/Eyes2Closed.png + ../Models/EyesK4/Eyes2Dazed.png + ../Models/EyesK4/Eyes2Neutral.png + ../Models/EyesK4/Eyes2Surprised.png + ../Models/EyesK4/EyesAngry.png + ../Models/EyesK4/EyesClosed.png + ../Models/EyesK4/EyesDazed.png + ../Models/EyesK4/EyesNeutral.png + ../Models/EyesK4/EyesSurprised.png + ../Models/EyesK4/WhitesEyes2Angry.png + ../Models/EyesK4/WhitesEyes2Closed.png + ../Models/EyesK4/WhitesEyes2Dazed.png + ../Models/EyesK4/WhitesEyes2Neutral.png + ../Models/EyesK4/WhitesEyes2Surprised.png + ../Models/EyesK4/WhitesEyesAngry.png + ../Models/EyesK4/WhitesEyesClosed.png + ../Models/EyesK4/WhitesEyesDazed.png + ../Models/EyesK4/WhitesEyesNeutral.png + ../Models/EyesK4/WhitesEyesSurprised.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 390,280,781,559 + scale9Paddings + 390,280,781,559 + scale9FromFile + + + ../Models/EyesK2/Eyes2Heart.png + ../Models/EyesK2/WhitesEyes2Heart.png + ../Models/EyesK3/Eyes2Heart.png + ../Models/EyesK3/WhitesEyes2Heart.png + ../Models/EyesK4/Eyes2Heart.png + ../Models/EyesK4/WhitesEyes2Heart.png + ../Models/FaceKjus/Eyes2Angry.png + ../Models/FaceKjus/Eyes2Dazed.png + ../Models/FaceKjus/Eyes2Heart.png + ../Models/FaceKjus/WhitesEyes2Angry.png + ../Models/FaceKjus/WhitesEyes2Dazed.png + ../Models/FaceKjus/WhitesEyes2Heart.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 376,207,753,413 + scale9Paddings + 376,207,753,413 + scale9FromFile + + + ../Models/EyesK2/Eyes2Sly.png + ../Models/EyesK2/WhitesEyes2Sly.png + ../Models/EyesK3/Eyes2Sly.png + ../Models/EyesK3/WhitesEyes2Sly.png + ../Models/EyesK4/Eyes2Sly.png + ../Models/EyesK4/WhitesEyes2Sly.png + ../Models/FaceKjus/Eyes2Closed.png + ../Models/FaceKjus/Eyes2Sly.png + ../Models/FaceKjus/WhitesEyes2Closed.png + ../Models/FaceKjus/WhitesEyes2Sly.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 379,213,759,425 + scale9Paddings + 379,213,759,425 + scale9FromFile + + + ../Models/EyesK2/EyesHeart.png + ../Models/EyesK2/WhitesEyesHeart.png + ../Models/EyesK3/EyesHeart.png + ../Models/EyesK3/WhitesEyesHeart.png + ../Models/EyesK4/EyesHeart.png + ../Models/EyesK4/WhitesEyesHeart.png + ../Models/FaceKjus/EyesAngry.png + ../Models/FaceKjus/EyesDazed.png + ../Models/FaceKjus/EyesHeart.png + ../Models/FaceKjus/WhitesEyesAngry.png + ../Models/FaceKjus/WhitesEyesDazed.png + ../Models/FaceKjus/WhitesEyesHeart.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 362,213,725,425 + scale9Paddings + 362,213,725,425 + scale9FromFile + + + ../Models/EyesK2/EyesSly.png + ../Models/EyesK2/WhitesEyesSly.png + ../Models/EyesK3/EyesSly.png + ../Models/EyesK3/WhitesEyesSly.png + ../Models/EyesK4/EyesSly.png + ../Models/EyesK4/WhitesEyesSly.png + ../Models/FaceKjus/EyesClosed.png + ../Models/FaceKjus/EyesSly.png + ../Models/FaceKjus/WhitesEyesClosed.png + ../Models/FaceKjus/WhitesEyesSly.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 426,262,851,524 + scale9Paddings + 426,262,851,524 + scale9FromFile + + + ../Models/FaceDask/Brows2Angry.png + ../Models/FaceDask/Brows2Annoyed.png + ../Models/FaceDask/Brows2Neutral.png + ../Models/FaceDask/Brows2Sad.png + ../Models/FaceDask/Brows2Surprised.png + ../Models/FaceDask/BrowsAngry.png + ../Models/FaceDask/BrowsAnnoyed.png + ../Models/FaceDask/BrowsNeutral.png + ../Models/FaceDask/BrowsSad.png + ../Models/FaceDask/BrowsSurprised.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 350,200,700,400 + scale9Paddings + 350,200,700,400 + scale9FromFile + + + ../Models/FaceFang/MouthDazed.png + ../Models/FaceFang2/MouthDazed.png + ../Models/FaceFangless/MouthDazed.png + ../Models/FaceKjus/MouthDazed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 353,227,705,455 + scale9Paddings + 353,227,705,455 + scale9FromFile + + + ../Models/FaceFang/MouthDistracted.png + ../Models/FaceFang2/MouthDistracted.png + ../Models/FaceFangless/MouthDistracted.png + ../Models/FaceKjus/MouthDistracted.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 373,237,745,474 + scale9Paddings + 373,237,745,474 + scale9FromFile + + + ../Models/FaceFang/MouthEmbarrassed.png + ../Models/FaceFang/MouthFrown.png + ../Models/FaceFang2/MouthEmbarrassed.png + ../Models/FaceFang2/MouthFrown.png + ../Models/FaceFangless/MouthEmbarrassed.png + ../Models/FaceFangless/MouthFrown.png + ../Models/FaceKjus/MouthEmbarrassed.png + ../Models/FaceKjus/MouthFrown.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 377,230,754,461 + scale9Paddings + 377,230,754,461 + scale9FromFile + + + ../Models/FaceFang/MouthNeutral.png + ../Models/FaceFang2/MouthNeutral.png + ../Models/FaceFangless/MouthNeutral.png + ../Models/FaceKjus/MouthNeutral.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 382,230,763,461 + scale9Paddings + 382,230,763,461 + scale9FromFile + + + ../Models/FaceFang/MouthPout.png + ../Models/FaceFang2/MouthPout.png + ../Models/FaceFangless/MouthPout.png + ../Models/FaceKjus/MouthPout.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 375,229,749,457 + scale9Paddings + 375,229,749,457 + scale9FromFile + + + ../Models/FaceFang/MouthSmile.png + ../Models/FaceFang2/MouthSmile.png + ../Models/FaceFangless/MouthSmile.png + ../Models/FaceKjus/MouthSmile.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 350,218,699,435 + scale9Paddings + 350,218,699,435 + scale9FromFile + + + ../Models/FaceFang/MouthSurprised.png + ../Models/FaceFang2/MouthSurprised.png + ../Models/FaceFangless/MouthSurprised.png + ../Models/FaceKjus/MouthSurprised.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 377,225,754,450 + scale9Paddings + 377,225,754,450 + scale9FromFile + + + ../Models/FaceKjus/BlushHigh.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 429,243,857,485 + scale9Paddings + 429,243,857,485 + scale9FromFile + + + ../Models/FaceKjus/BlushLow.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 372,216,743,433 + scale9Paddings + 372,216,743,433 + scale9FromFile + + + ../Models/FaceKjus/BlushMedium.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 417,291,833,581 + scale9Paddings + 417,291,833,581 + scale9FromFile + + + ../Models/FaceKjus/Eyes2Neutral.png + ../Models/FaceKjus/WhitesEyes2Neutral.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 404,275,807,551 + scale9Paddings + 404,275,807,551 + scale9FromFile + + + ../Models/FaceKjus/Eyes2Surprised.png + ../Models/FaceKjus/EyesSurprised.png + ../Models/FaceKjus/WhitesEyes2Surprised.png + ../Models/FaceKjus/WhitesEyesSurprised.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 396,250,791,501 + scale9Paddings + 396,250,791,501 + scale9FromFile + + + ../Models/FaceKjus/EyesNeutral.png + ../Models/FaceKjus/WhitesEyesNeutral.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 373,230,745,461 + scale9Paddings + 373,230,745,461 + scale9FromFile + + + ../Models/GagLatex/NeckCorset2.png + ../Models/GagLatex/NeckCorsetGag2.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 392,243,783,485 + scale9Paddings + 392,243,783,485 + scale9FromFile + + + ../Models/GagLatex/NeckCorsetGagRim2.png + ../Models/GagLatex/NeckCorsetRim2.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 382,238,763,475 + scale9Paddings + 382,238,763,475 + scale9FromFile + + + ../Models/Hood/Blindfold.png + ../Models/Hood/BunnyEars.png + ../Models/Hood/Gag.png + ../Models/Hood/KittyEars.png + ../Models/Hood/WolfEars.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 376,239,751,479 + scale9Paddings + 376,239,751,479 + scale9FromFile + + + ../Models/Hood/Hood.png + ../Models/Hood/HoodCollar.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 376,210,751,419 + scale9Paddings + 376,210,751,419 + scale9FromFile + + + ../Models/MaidKnightHeavy/SleeveRightStripeFree.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 6,6,11,11 + scale9Paddings + 6,6,11,11 + scale9FromFile + + + ../Models/Ninja/SkirtBandOverKneelCrotchStrap.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 2,2,5,5 + scale9Paddings + 2,2,5,5 + scale9FromFile + + + ../Models/Ninja/SockRightHogtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 1,1,1,2 + scale9Paddings + 1,1,1,2 + scale9FromFile + + + ../Models/Ninja/SockRightKneelClosed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 1,1,3,2 + scale9Paddings + 1,1,3,2 + scale9FromFile + + + ../Models/Pointy/Ahoge.png + ../Models/Pointy/AnthenaL.png + ../Models/Pointy/AnthenaR.png + ../Models/Pointy/HornL.png + ../Models/Pointy/HornR.png + ../Models/Pointy/Tail.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 428,538,855,1075 + scale9Paddings + 428,538,855,1075 + scale9FromFile + + + ../Models/SMoonlight/BondageHarness.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 240,325,481,651 + scale9Paddings + 240,325,481,651 + scale9FromFile + + + ../Models/SMoonlight/RPArmbinder Back.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 250,300,500,600 + scale9Paddings + 250,300,500,600 + scale9FromFile + + + ../Models/SMoonlight/RpArmbinder Secure.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 225,338,450,675 + scale9Paddings + 225,338,450,675 + scale9FromFile + + + ../Models/UniformShirt/ForeGloveLeftCrossed.png + ../Models/Warrior/BandForeGloveLeftCrossed.png + ../Models/Warrior/ForeGloveLeftCrossed.png + ../Models/Warrior/RimForeGloveLeftCrossed.png + ../Models/WolfCatsuit/BandForeGloveLeftCrossed.png + ../Models/WolfCatsuit/RimForeGloveLeftCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 2,6,3,11 + scale9Paddings + 2,6,3,11 + scale9FromFile + + + ../Models/UniformShirt/GloveLeftBoxtie.png + ../Models/Warrior/BandGloveLeftBoxtie.png + ../Models/Warrior/GloveLeftBoxtie.png + ../Models/Warrior/RimGloveLeftBoxtie.png + ../Models/WolfCatsuit/BandGloveLeftBoxtie.png + ../Models/WolfCatsuit/RimGloveLeftBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 9,6,19,12 + scale9Paddings + 9,6,19,12 + scale9FromFile + + + ../Models/UniformShirt/GloveLeftCrossed.png + ../Models/Warrior/BandGloveLeftCrossed.png + ../Models/Warrior/GloveLeftCrossed.png + ../Models/Warrior/RimGloveLeftCrossed.png + ../Models/WolfCatsuit/BandGloveLeftCrossed.png + ../Models/WolfCatsuit/RimGloveLeftCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 11,4,21,7 + scale9Paddings + 11,4,21,7 + scale9FromFile + + + ../Models/UniformShirt/GloveLeftUp.png + ../Models/Warrior/BandGloveLeftUp.png + ../Models/Warrior/GloveLeftUp.png + ../Models/Warrior/RimGloveLeftUp.png + ../Models/WolfCatsuit/BandGloveLeftUp.png + ../Models/WolfCatsuit/RimGloveLeftUp.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 8,8,15,15 + scale9Paddings + 8,8,15,15 + scale9FromFile + + + ../Models/UniformShirt/GloveLeftWristtie.png + ../Models/Warrior/BandGloveLeftWristtie.png + ../Models/Warrior/GloveLeftWristtie.png + ../Models/Warrior/RimGloveLeftWristtie.png + ../Models/WolfCatsuit/BandGloveLeftWristtie.png + ../Models/WolfCatsuit/RimGloveLeftWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 12,6,24,11 + scale9Paddings + 12,6,24,11 + scale9FromFile + + + ../Models/UniformShirt/GloveRightCrossed.png + ../Models/Warrior/BandGloveRightCrossed.png + ../Models/Warrior/GloveRightCrossed.png + ../Models/Warrior/RimGloveRightCrossed.png + ../Models/WolfCatsuit/BandGloveRightCrossed.png + ../Models/WolfCatsuit/RimGloveRightCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 2,1,3,1 + scale9Paddings + 2,1,3,1 + scale9FromFile + + + ../Models/UniformShirt/GloveRightFront.png + ../Models/Warrior/BandGloveRightFront.png + ../Models/Warrior/GloveRightFront.png + ../Models/Warrior/RimGloveRightFront.png + ../Models/WolfCatsuit/BandGloveRightFront.png + ../Models/WolfCatsuit/RimGloveRightFront.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 2,1,5,1 + scale9Paddings + 2,1,5,1 + scale9FromFile + + + ../Models/UniformShirt/GloveRightUp.png + ../Models/Warrior/BandGloveRightUp.png + ../Models/Warrior/GloveRightUp.png + ../Models/Warrior/RimGloveRightUp.png + ../Models/WolfCatsuit/BandGloveRightUp.png + ../Models/WolfCatsuit/RimGloveRightUp.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 3,2,5,5 + scale9Paddings + 3,2,5,5 + scale9FromFile + + + ../Models/UniformShirt/GloveRightWristtie.png + ../Models/Warrior/BandGloveRightWristtie.png + ../Models/Warrior/GloveRightWristtie.png + ../Models/Warrior/RimGloveRightWristtie.png + ../Models/WolfCatsuit/BandGloveRightWristtie.png + ../Models/WolfCatsuit/RimGloveRightWristtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 4,5,8,9 + scale9Paddings + 4,5,8,9 + scale9FromFile + + + ../Models/Warrior/BandForeGloveRightCrossed.png + ../Models/Warrior/ForeGloveRightCrossed.png + ../Models/Warrior/RimForeGloveRightCrossed.png + ../Models/WolfCatsuit/BandForeGloveRightCrossed.png + ../Models/WolfCatsuit/RimForeGloveRightCrossed.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 9,13,18,25 + scale9Paddings + 9,13,18,25 + scale9FromFile + + + ../Models/Warrior/BandGloveRightBoxtie.png + ../Models/WolfCatsuit/BandGloveRightBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 2,2,4,3 + scale9Paddings + 2,2,4,3 + scale9FromFile + + + ../Models/Warrior/RimGloveRightBoxtie.png + ../Models/WolfCatsuit/RimGloveRightBoxtie.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 2,2,5,4 + scale9Paddings + 2,2,5,4 + scale9FromFile + + + ../Models/Wolfgirl/EarLeft.png + ../Models/Wolfgirl/EarRight.png + ../Models/Wolfgirl/HairclipLower.png + ../Models/Wolfgirl/HairclipUpper.png + ../Models/Wolfgirl/MascaraL.png + ../Models/Wolfgirl/MascaraR.png + ../Models/Wolfgirl/Scar.png + + pivotPoint + 0,0 + spriteScale + 1 + scale9Enabled + + scale9Borders + 173,220,347,439 + scale9Paddings + 173,220,347,439 + scale9FromFile + + + + fileLists + + default + + files + + ../Models + + + + ignoreFileList + + replaceList + + ignoredWarnings + + large-max-texture-size + pixijs-multipack-2023-05-25 + + commonDivisorX + 1 + commonDivisorY + 1 + packNormalMaps + + autodetectNormalMaps + + normalMapFilter + + normalMapSuffix + + normalMapSheetFileName + + exporterProperties + + + diff --git a/TextureAtlas/atlas0.json b/TextureAtlas/atlas0.json new file mode 100644 index 000000000..b3838020f --- /dev/null +++ b/TextureAtlas/atlas0.json @@ -0,0 +1,2800 @@ +{"frames": { + +"Models/Armbinder/BinderRightWristtie.png": +{ + "frame": {"x":2042,"y":2016,"w":1,"h":1}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":1,"h":1}, + "sourceSize": {"w":1,"h":1} +}, +"Models/Belts/RightArm2Wristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":6,"h":7} +}, +"Models/Body/Butt2.png": +{ + "frame": {"x":2042,"y":2016,"w":1,"h":1}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":1,"h":1}, + "sourceSize": {"w":1,"h":1} +}, +"Models/Body/LegLeftKneel.png": +{ + "frame": {"x":3,"y":1761,"w":521,"h":284}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":801,"w":521,"h":284}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/LegLeftKneelClosed.png": +{ + "frame": {"x":528,"y":1761,"w":523,"h":283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":386,"y":801,"w":523,"h":283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/TorsoSpread.png": +{ + "frame": {"x":1247,"y":1166,"w":354,"h":591}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":359,"w":354,"h":591}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmLeftFree.png": +{ + "frame": {"x":1247,"y":3,"w":194,"h":397}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":662,"y":406,"w":194,"h":397}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/LegLeftKneel.png": +{ + "frame": {"x":1055,"y":1761,"w":386,"h":283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":801,"w":386,"h":283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/Leash.png": +{ + "frame": {"x":3,"y":3,"w":1240,"h":1754}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":1240,"h":1754}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberArms/CuffLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":12} +}, +"Models/CyberArms/CuffLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/DisplayForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberArms/DisplayForeLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberArms/DisplayForeLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberArms/DisplayForeLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberArms/DisplayLongMittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberArms/DisplayLongMittenRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberArms/DisplayLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberArms/DisplayLongMittenRightFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberArms/DisplayLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberArms/DisplayLongMittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberArms/DisplayLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberArms/GlowForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberArms/GlowForeLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":18,"h":15} +}, +"Models/CyberArms/GlowLongMittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":27,"h":26} +}, +"Models/CyberArms/GlowLongMittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":26,"h":26} +}, +"Models/CyberArms/GlowLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":30,"h":25} +}, +"Models/CyberArms/LockForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberArms/LockForeLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberArms/LockForeLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberArms/LockForeLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberArms/LockLongMittenLeftBoxtie.png": +{ + "frame": {"x":1431,"y":947,"w":10,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":757,"y":527,"w":10,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LockLongMittenLeftCrossed.png": +{ + "frame": {"x":1431,"y":902,"w":10,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":759,"y":537,"w":10,"h":19}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LockLongMittenLeftFront.png": +{ + "frame": {"x":1431,"y":925,"w":10,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":758,"y":538,"w":10,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LockLongMittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":12} +}, +"Models/CyberArms/LockLongMittenRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberArms/LockLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberArms/LockLongMittenRightFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberArms/LockLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberArms/LockLongMittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":12} +}, +"Models/CyberArms/LockLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":19,"h":16} +}, +"Models/CyberArms/StrapsLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":19,"h":16} +}, +"Models/CyberArms/StrapsLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":14} +}, +"Models/CyberCuffs/DisplayAnkleLeftKneel.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayAnkleLeftKneelClosed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockAnkleLeftKneel.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockAnkleLeftKneelClosed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockLinkCollar.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenLinkCollar.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":22,"h":15} +}, +"Models/CyberMitts/CapForeLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":36,"h":30} +}, +"Models/CyberMitts/CapLongMittenLeftBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":13,"h":7} +}, +"Models/CyberMitts/CapLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":12} +}, +"Models/CyberMitts/CapLongMittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":12} +}, +"Models/CyberMitts/CapLongMittenLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":12} +}, +"Models/CyberMitts/CapLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":12} +}, +"Models/CyberMitts/CapLongMittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":12} +}, +"Models/CyberMitts/CapLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":19,"h":20} +}, +"Models/CyberMitts/CuffForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/CuffLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":12} +}, +"Models/CyberMitts/CuffLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/DisplayForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/DisplayForeLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/DisplayForeLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/DisplayForeLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/DisplayLongMittenLeftBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/DisplayLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/DisplayLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/DisplayLongMittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/DisplayLongMittenLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/DisplayLongMittenLeftYoked.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/DisplayLongMittenRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/DisplayLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/DisplayLongMittenRightFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/DisplayLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/DisplayLongMittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/DisplayLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/DisplayLongMittenRightYoked.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ForeMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ForeMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1989,"w":3,"h":4}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":521,"w":3,"h":4}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/GlowForeLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":18,"h":15} +}, +"Models/CyberMitts/GlowLongMittenLeftBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowLongMittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":27,"h":26} +}, +"Models/CyberMitts/GlowLongMittenLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowLongMittenRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowLongMittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":26,"h":26} +}, +"Models/CyberMitts/GlowLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":30,"h":25} +}, +"Models/CyberMitts/LockForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/LockForeLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/LockForeLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/LockForeLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/LockLongMittenLeftBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LockLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LockLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LockLongMittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":12} +}, +"Models/CyberMitts/LockLongMittenLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LockLongMittenLeftYoked.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LockLongMittenRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/LockLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/LockLongMittenRightFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/LockLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/LockLongMittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":12} +}, +"Models/CyberMitts/LockLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LockLongMittenRightYoked.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":19,"h":16} +}, +"Models/CyberMitts/StrapsLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":19,"h":16} +}, +"Models/CyberMitts/StrapsLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":14} +}, +"Models/CyberMitts/UpperCuffForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/UpperCuffForeLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffForeLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffForeLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenRightFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperDisplayForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/UpperDisplayForeLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/UpperDisplayForeLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/UpperDisplayForeLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/UpperDisplayLongMittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/UpperDisplayLongMittenRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/UpperDisplayLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/UpperDisplayLongMittenRightFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/UpperDisplayLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/UpperDisplayLongMittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/UpperDisplayLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":6} +}, +"Models/CyberMitts/UpperGlowForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/UpperGlowForeLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowForeLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":18,"h":15} +}, +"Models/CyberMitts/UpperGlowForeLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":27,"h":26} +}, +"Models/CyberMitts/UpperGlowLongMittenRightFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":26,"h":26} +}, +"Models/CyberMitts/UpperGlowLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":30,"h":25} +}, +"Models/CyberMitts/UpperLockForeLongMittenLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/UpperLockForeLongMittenLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/UpperLockForeLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/UpperLockForeLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/UpperLockLongMittenLeftBoxtie.png": +{ + "frame": {"x":1431,"y":947,"w":10,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":757,"y":527,"w":10,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperLockLongMittenLeftCrossed.png": +{ + "frame": {"x":1431,"y":902,"w":10,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":759,"y":537,"w":10,"h":19}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperLockLongMittenLeftFree.png": +{ + "frame": {"x":1431,"y":966,"w":10,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":765,"y":523,"w":10,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperLockLongMittenLeftFront.png": +{ + "frame": {"x":1431,"y":925,"w":10,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":758,"y":538,"w":10,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperLockLongMittenLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":12} +}, +"Models/CyberMitts/UpperLockLongMittenRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/UpperLockLongMittenRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/UpperLockLongMittenRightFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/UpperLockLongMittenRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":33,"h":20} +}, +"Models/CyberMitts/UpperLockLongMittenRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":12} +}, +"Models/CyberMitts/UpperLockLongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightLockPlateBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/Teeth.png": +{ + "frame": {"x":1659,"y":1747,"w":43,"h":10}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":584,"y":331,"w":43,"h":10}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/RidgeSad.png": +{ + "frame": {"x":1431,"y":985,"w":10,"h":11}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":252,"w":10,"h":11}, + "sourceSize": {"w":703,"h":355} +}, +"Models/FaceKoi/Brows2Surprised.png": +{ + "frame": {"x":1605,"y":1747,"w":50,"h":10}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":142,"y":137,"w":50,"h":10}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/BrowsAnnoyed.png": +{ + "frame": {"x":1998,"y":1747,"w":46,"h":7}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":56,"y":151,"w":46,"h":7}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/MouthDazed.png": +{ + "frame": {"x":1957,"y":1747,"w":37,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":117,"y":244,"w":37,"h":9}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Festive/BinderRightWristtie.png": +{ + "frame": {"x":2042,"y":2016,"w":1,"h":1}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":1,"h":1}, + "sourceSize": {"w":1,"h":1} +}, +"Models/GagLeather/BigBallTeethFang.png": +{ + "frame": {"x":1780,"y":1747,"w":13,"h":10}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":138,"y":233,"w":13,"h":10}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BigBallTeethFang2.png": +{ + "frame": {"x":1706,"y":1747,"w":42,"h":10}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":109,"y":233,"w":42,"h":10}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/KittyMouth.png": +{ + "frame": {"x":1915,"y":1747,"w":38,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":111,"y":255,"w":38,"h":9}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BigBallTeethFang.png": +{ + "frame": {"x":1797,"y":1747,"w":13,"h":10}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":138,"y":233,"w":13,"h":10}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BigBallTeethFang2.png": +{ + "frame": {"x":1706,"y":1747,"w":42,"h":10}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":109,"y":233,"w":42,"h":10}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Gothic/HemUpperCrotchStrap.png": +{ + "frame": {"x":1445,"y":1761,"w":600,"h":224}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":287,"y":827,"w":600,"h":224}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/LinesKneel.png": +{ + "frame": {"x":1445,"y":3,"w":600,"h":419}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":297,"y":669,"w":600,"h":419}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/SkirtKneel.png": +{ + "frame": {"x":1445,"y":426,"w":600,"h":392}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":297,"y":669,"w":600,"h":392}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/SkirtKneelCrotchStrap.png": +{ + "frame": {"x":1445,"y":822,"w":600,"h":340}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":296,"y":669,"w":600,"h":340}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/HardwareUnderbustOver.png": +{ + "frame": {"x":1752,"y":1747,"w":24,"h":10}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":520,"w":24,"h":10}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockThighLeftKneel.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockThighLeftKneelClosed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockWristLeftFree.png": +{ + "frame": {"x":1431,"y":1000,"w":10,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":808,"y":794,"w":10,"h":8}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockLeftHogtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockRightHogtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockRightKneel.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockRightKneelClosed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockLeftHogtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockRightHogtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockRightKneel.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockRightKneelClosed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/RightLegbinderKneelClosed.png": +{ + "frame": {"x":1247,"y":902,"w":180,"h":260}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":324,"y":822,"w":180,"h":260}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftStripeFront.png": +{ + "frame": {"x":1833,"y":1747,"w":78,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":717,"y":613,"w":78,"h":9}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightStripeBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightStripeFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightStripeWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronLeftHardwareUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronRightStraps.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveRightStripeFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":11,"h":11} +}, +"Models/MaidKnightLight/GuardCuff2LeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffRightCrossed.png": +{ + "frame": {"x":1431,"y":1055,"w":4,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":694,"w":4,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LockLeftFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/PawLeftFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/ZipperLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/ZipperLeftYoked.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/ZipperRightFree.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/ZipperRightFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/ZipperRightYoked.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SkirtBandOverKneelCrotchStrap.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":5,"h":5} +}, +"Models/Ninja/SockRightHogtie.png": +{ + "frame": {"x":2042,"y":2010,"w":2,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":2,"h":2}, + "sourceSize": {"w":2,"h":2} +}, +"Models/Ninja/SockRightKneelClosed.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":3,"h":2} +}, +"Models/Ninja/TopBandChestUp.png": +{ + "frame": {"x":1247,"y":667,"w":194,"h":231}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":397,"w":194,"h":231}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopShouldersUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Arm2Boxtie.png": +{ + "frame": {"x":1445,"y":1989,"w":326,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":484,"w":326,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftUp.png": +{ + "frame": {"x":1247,"y":404,"w":194,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":665,"y":167,"w":194,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Arm1Wristtie.png": +{ + "frame": {"x":1775,"y":1989,"w":263,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":580,"w":263,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnderOverKneelCrotchStrap.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderLeftButton.png": +{ + "frame": {"x":1824,"y":1747,"w":5,"h":10}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":771,"y":494,"w":5,"h":10}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderLeftButtonTied.png": +{ + "frame": {"x":1431,"y":1031,"w":5,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":768,"y":511,"w":5,"h":8}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderLeftButtonYoked.png": +{ + "frame": {"x":1431,"y":1043,"w":5,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":795,"y":471,"w":5,"h":8}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderRightButtonUp.png": +{ + "frame": {"x":1431,"y":1012,"w":8,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":547,"y":302,"w":8,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmFullLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmFullRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmStrapLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmStrapRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/BottomKneel.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/BottomKneelClosed.png": +{ + "frame": {"x":1431,"y":1062,"w":4,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":395,"y":840,"w":4,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/Chest.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ChestPetsuit.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/StrapCover.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmFullLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmFullRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmStrapLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmStrapRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/DressChestUp.png": +{ + "frame": {"x":1605,"y":1166,"w":440,"h":577}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":355,"w":440,"h":577}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/ForeGloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":4,"h":11} +}, +"Models/UniformShirt/GloveLeftBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":19,"h":12} +}, +"Models/UniformShirt/GloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":22,"h":8} +}, +"Models/UniformShirt/GloveLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":14} +}, +"Models/UniformShirt/GloveLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":15,"h":16} +}, +"Models/UniformShirt/GloveLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":11} +}, +"Models/UniformShirt/GloveRightCrossed.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":3,"h":2} +}, +"Models/UniformShirt/GloveRightFront.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":5,"h":2} +}, +"Models/UniformShirt/GloveRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":6,"h":5} +}, +"Models/UniformShirt/GloveRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":10} +}, +"Models/Warrior/BandForeGloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":4,"h":11} +}, +"Models/Warrior/BandForeGloveRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":18,"h":26} +}, +"Models/Warrior/BandGloveLeftBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":19,"h":12} +}, +"Models/Warrior/BandGloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":22,"h":8} +}, +"Models/Warrior/BandGloveLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":14} +}, +"Models/Warrior/BandGloveLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":15,"h":16} +}, +"Models/Warrior/BandGloveLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":11} +}, +"Models/Warrior/BandGloveRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":4,"h":4} +}, +"Models/Warrior/BandGloveRightCrossed.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":3,"h":2} +}, +"Models/Warrior/BandGloveRightFront.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":5,"h":2} +}, +"Models/Warrior/BandGloveRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":6,"h":5} +}, +"Models/Warrior/BandGloveRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":10} +}, +"Models/Warrior/ForeGloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":4,"h":11} +}, +"Models/Warrior/ForeGloveRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":18,"h":26} +}, +"Models/Warrior/GloveLeftBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":19,"h":12} +}, +"Models/Warrior/GloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":22,"h":8} +}, +"Models/Warrior/GloveLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":14} +}, +"Models/Warrior/GloveLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":15,"h":16} +}, +"Models/Warrior/GloveLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":11} +}, +"Models/Warrior/GloveRightCrossed.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":3,"h":2} +}, +"Models/Warrior/GloveRightFront.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":5,"h":2} +}, +"Models/Warrior/GloveRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":6,"h":5} +}, +"Models/Warrior/GloveRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":10} +}, +"Models/Warrior/RimForeGloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":4,"h":11} +}, +"Models/Warrior/RimForeGloveRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":18,"h":26} +}, +"Models/Warrior/RimGloveLeftBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":19,"h":12} +}, +"Models/Warrior/RimGloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":22,"h":8} +}, +"Models/Warrior/RimGloveLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":14} +}, +"Models/Warrior/RimGloveLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":15,"h":16} +}, +"Models/Warrior/RimGloveLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":11} +}, +"Models/Warrior/RimGloveRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":5,"h":4} +}, +"Models/Warrior/RimGloveRightCrossed.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":3,"h":2} +}, +"Models/Warrior/RimGloveRightFront.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":5,"h":2} +}, +"Models/Warrior/RimGloveRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":6,"h":5} +}, +"Models/Warrior/RimGloveRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":10} +}, +"Models/Wolf/ModuleDisplay.png": +{ + "frame": {"x":1814,"y":1747,"w":6,"h":10}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":647,"y":412,"w":6,"h":10}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/BandForeGloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":4,"h":11} +}, +"Models/WolfCatsuit/BandForeGloveRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":18,"h":26} +}, +"Models/WolfCatsuit/BandGloveLeftBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":19,"h":12} +}, +"Models/WolfCatsuit/BandGloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":22,"h":8} +}, +"Models/WolfCatsuit/BandGloveLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":14} +}, +"Models/WolfCatsuit/BandGloveLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":15,"h":16} +}, +"Models/WolfCatsuit/BandGloveLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":11} +}, +"Models/WolfCatsuit/BandGloveRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":4,"h":4} +}, +"Models/WolfCatsuit/BandGloveRightCrossed.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":3,"h":2} +}, +"Models/WolfCatsuit/BandGloveRightFront.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":5,"h":2} +}, +"Models/WolfCatsuit/BandGloveRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":6,"h":5} +}, +"Models/WolfCatsuit/BandGloveRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":10} +}, +"Models/WolfCatsuit/RimForeGloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":4,"h":11} +}, +"Models/WolfCatsuit/RimForeGloveRightCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":18,"h":26} +}, +"Models/WolfCatsuit/RimGloveLeftBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":19,"h":12} +}, +"Models/WolfCatsuit/RimGloveLeftCrossed.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":22,"h":8} +}, +"Models/WolfCatsuit/RimGloveLeftFront.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":14,"h":14} +}, +"Models/WolfCatsuit/RimGloveLeftUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":15,"h":16} +}, +"Models/WolfCatsuit/RimGloveLeftWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":24,"h":11} +}, +"Models/WolfCatsuit/RimGloveRightBoxtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":5,"h":4} +}, +"Models/WolfCatsuit/RimGloveRightCrossed.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":3,"h":2} +}, +"Models/WolfCatsuit/RimGloveRightFront.png": +{ + "frame": {"x":2042,"y":2004,"w":3,"h":2}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":5,"h":2} +}, +"Models/WolfCatsuit/RimGloveRightUp.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":6,"h":5} +}, +"Models/WolfCatsuit/RimGloveRightWristtie.png": +{ + "frame": {"x":2042,"y":1997,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":8,"h":10} +}}, +"animations": { + "Models/Belts/Arms": ["Models/Belts/Arms1.png","Models/Belts/Arms2.png"], + "Models/DivineBelt/BeltMetal": ["Models/DivineBelt/BeltMetal1.png","Models/DivineBelt/BeltMetal2.png"], + "Models/DivineBelt/BeltMetalRunic": ["Models/DivineBelt/BeltMetalRunic1.png","Models/DivineBelt/BeltMetalRunic2.png"], + "Models/DivineBelt/BraBase": ["Models/DivineBelt/BraBase1.png","Models/DivineBelt/BraBase2.png"], + "Models/DivineBelt/BraMetal": ["Models/DivineBelt/BraMetal1.png","Models/DivineBelt/BraMetal2.png"], + "Models/DivineBelt/BraMetalRunic": ["Models/DivineBelt/BraMetalRunic1.png","Models/DivineBelt/BraMetalRunic2.png"], + "Models/KittyLatex/KittyLatexEarMuffLight": ["Models/KittyLatex/KittyLatexEarMuffLight1.png","Models/KittyLatex/KittyLatexEarMuffLight2.png"], + "Models/ShadowHands/Arms": ["Models/ShadowHands/Arms1.png","Models/ShadowHands/Arms2.png"], + "Models/Tails/Fox": ["Models/Tails/Fox2.png","Models/Tails/Fox3.png","Models/Tails/Fox4.png","Models/Tails/Fox5.png","Models/Tails/Fox6.png","Models/Tails/Fox7.png"] +}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas0.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas0.webp b/TextureAtlas/atlas0.webp new file mode 100644 index 000000000..450de5ab8 Binary files /dev/null and b/TextureAtlas/atlas0.webp differ diff --git a/TextureAtlas/atlas1.json b/TextureAtlas/atlas1.json new file mode 100644 index 000000000..a4027f8de --- /dev/null +++ b/TextureAtlas/atlas1.json @@ -0,0 +1,509 @@ +{"frames": { + +"Models/ArmorChain/SkirtBeltDecoKneel.png": +{ + "frame": {"x":1204,"y":935,"w":61,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":511,"y":772,"w":61,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/FootBootLeftHogtie.png": +{ + "frame": {"x":1204,"y":1241,"w":53,"h":128}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":729,"y":787,"w":53,"h":128}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/LegRightClosed.png": +{ + "frame": {"x":904,"y":1041,"w":159,"h":694}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":919,"w":159,"h":694}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/HandRightBoxtie.png": +{ + "frame": {"x":3,"y":1739,"w":139,"h":306}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":579,"y":411,"w":139,"h":306}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraCyberLock.png": +{ + "frame": {"x":2031,"y":2020,"w":14,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":567,"y":555,"w":14,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/TrackingModuleDisplay.png": +{ + "frame": {"x":1269,"y":1949,"w":15,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":569,"y":409,"w":15,"h":12}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/WristLeftFree.png": +{ + "frame": {"x":1204,"y":1123,"w":61,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":797,"y":749,"w":61,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/WristLeftFree.png": +{ + "frame": {"x":1204,"y":1182,"w":61,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":797,"y":749,"w":61,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/DisplayLongMittenLeftWristtie.png": +{ + "frame": {"x":1269,"y":2029,"w":14,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":739,"y":552,"w":14,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LockLongMittenRightYoked.png": +{ + "frame": {"x":1269,"y":1852,"w":15,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":495,"w":15,"h":16}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockThighLeftClosed.png": +{ + "frame": {"x":1204,"y":332,"w":32,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":656,"y":1045,"w":32,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockWristRightYoked.png": +{ + "frame": {"x":1269,"y":1816,"w":15,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":309,"y":408,"w":15,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapLongMittenRightFree.png": +{ + "frame": {"x":1204,"y":378,"w":61,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":260,"y":550,"w":61,"h":88}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperDisplayLongMittenLeftWristtie.png": +{ + "frame": {"x":1269,"y":2029,"w":14,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":739,"y":552,"w":14,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperLockLongMittenRightYoked.png": +{ + "frame": {"x":1269,"y":1852,"w":15,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":495,"w":15,"h":16}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftLockBandSpread.png": +{ + "frame": {"x":1269,"y":1872,"w":15,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":750,"y":1450,"w":15,"h":16}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightLockBandSpread.png": +{ + "frame": {"x":1269,"y":1892,"w":15,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":1450,"w":15,"h":16}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightLockBandBoxtie.png": +{ + "frame": {"x":1269,"y":1978,"w":14,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":604,"w":14,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockPlateKneel.png": +{ + "frame": {"x":1204,"y":1063,"w":61,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":422,"y":826,"w":61,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceCorsetHardware.png": +{ + "frame": {"x":1240,"y":202,"w":25,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":564,"y":631,"w":25,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/Earrings.png": +{ + "frame": {"x":2031,"y":1866,"w":14,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":689,"y":329,"w":14,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/EarringsBack.png": +{ + "frame": {"x":2031,"y":1907,"w":14,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":549,"y":335,"w":14,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/ElfEarringsBack.png": +{ + "frame": {"x":2031,"y":1907,"w":14,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":523,"y":323,"w":14,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/ElfEarringsFront.png": +{ + "frame": {"x":2031,"y":1947,"w":14,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":326,"w":14,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceDask/EyesSly.png": +{ + "frame": {"x":1525,"y":1373,"w":54,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":51,"y":173,"w":54,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/BlushExtreme.png": +{ + "frame": {"x":1067,"y":202,"w":169,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":49,"y":190,"w":169,"h":59}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Furniture/Bed.png": +{ + "frame": {"x":3,"y":3,"w":897,"h":1732}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":189,"y":4,"w":897,"h":1732}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/BedStraps.png": +{ + "frame": {"x":1269,"y":3,"w":774,"h":1034}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":247,"y":457,"w":774,"h":1034}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gasmask/Center.png": +{ + "frame": {"x":1204,"y":470,"w":61,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":98,"y":209,"w":61,"h":85}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/VentsInnerL.png": +{ + "frame": {"x":1204,"y":865,"w":61,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":593,"y":88,"w":61,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallRightClosed.png": +{ + "frame": {"x":904,"y":265,"w":296,"h":772}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":902,"w":296,"h":772}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandWristRightFree.png": +{ + "frame": {"x":1204,"y":265,"w":32,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":371,"y":608,"w":32,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/ForeGloveRightPawFront.png": +{ + "frame": {"x":1204,"y":999,"w":61,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":495,"w":61,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveLeftPawYoked.png": +{ + "frame": {"x":1204,"y":559,"w":61,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":860,"y":312,"w":61,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveRightPawYoked.png": +{ + "frame": {"x":1204,"y":637,"w":61,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":327,"y":320,"w":61,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/LegsKneel.png": +{ + "frame": {"x":146,"y":1739,"w":384,"h":305}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":312,"y":759,"w":384,"h":305}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/CoatKneel.png": +{ + "frame": {"x":1288,"y":1420,"w":637,"h":625}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":407,"w":637,"h":625}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowRightFront.png": +{ + "frame": {"x":1269,"y":2004,"w":14,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":614,"w":14,"h":21}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronMiniBowHogtie.png": +{ + "frame": {"x":1269,"y":1931,"w":15,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":497,"y":793,"w":15,"h":14}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronMiniBowKneel.png": +{ + "frame": {"x":1269,"y":1965,"w":15,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":747,"w":15,"h":9}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftWristtie.png": +{ + "frame": {"x":1929,"y":1866,"w":98,"h":179}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":669,"y":523,"w":98,"h":179}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/BootRightClosed.png": +{ + "frame": {"x":1929,"y":1420,"w":116,"h":442}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":1209,"w":116,"h":442}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/PawLeftYoked.png": +{ + "frame": {"x":1204,"y":714,"w":61,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":859,"y":313,"w":61,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ThighRightClosed.png": +{ + "frame": {"x":1067,"y":1041,"w":133,"h":328}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":980,"w":133,"h":328}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopArmHarnessUnderbust.png": +{ + "frame": {"x":1288,"y":1373,"w":233,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":583,"w":233,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf3KneelClosed.png": +{ + "frame": {"x":1204,"y":791,"w":61,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":515,"y":998,"w":61,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf3KneelClosedOver.png": +{ + "frame": {"x":1204,"y":791,"w":61,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":515,"y":998,"w":61,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/LeftFrogtieKneelClosed.png": +{ + "frame": {"x":1067,"y":3,"w":198,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":555,"y":822,"w":198,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtClosedCrotchStrap.png": +{ + "frame": {"x":862,"y":1739,"w":403,"h":304}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":402,"y":724,"w":403,"h":304}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtCrotchStrap.png": +{ + "frame": {"x":862,"y":1739,"w":403,"h":304}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":402,"y":724,"w":403,"h":304}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtHogtieCrotchStrap.png": +{ + "frame": {"x":862,"y":1739,"w":403,"h":304}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":402,"y":724,"w":403,"h":304}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeCollarButton.png": +{ + "frame": {"x":1269,"y":1912,"w":15,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":608,"y":408,"w":15,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/PostureCollarLoop.png": +{ + "frame": {"x":2031,"y":1987,"w":14,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":600,"y":399,"w":14,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLegRightHogtie.png": +{ + "frame": {"x":534,"y":1739,"w":142,"h":305}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":905,"w":142,"h":305}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/PetsuitTopBody.png": +{ + "frame": {"x":1269,"y":1041,"w":313,"h":328}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":384,"w":313,"h":328}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/DressSkirtKneel.png": +{ + "frame": {"x":1586,"y":1041,"w":459,"h":375}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":345,"y":626,"w":459,"h":375}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveLeftWristtie.png": +{ + "frame": {"x":680,"y":1739,"w":98,"h":305}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":429,"w":98,"h":305}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ForeGloveRightFront.png": +{ + "frame": {"x":904,"y":3,"w":159,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":426,"y":460,"w":159,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveLeftYoked.png": +{ + "frame": {"x":1067,"y":1373,"w":217,"h":362}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":734,"y":278,"w":217,"h":362}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolfgirl/Scar.png": +{ + "frame": {"x":1269,"y":1739,"w":15,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":180,"y":227,"w":15,"h":73}, + "sourceSize": {"w":347,"h":439} +}, +"Models/Yukata/SleeveRightBoxtie.png": +{ + "frame": {"x":782,"y":1739,"w":76,"h":305}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":426,"w":76,"h":305}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SleeveRightFront.png": +{ + "frame": {"x":782,"y":1739,"w":76,"h":305}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":426,"w":76,"h":305}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas1.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas1.webp b/TextureAtlas/atlas1.webp new file mode 100644 index 000000000..6aa346f3f Binary files /dev/null and b/TextureAtlas/atlas1.webp differ diff --git a/TextureAtlas/atlas10.json b/TextureAtlas/atlas10.json new file mode 100644 index 000000000..f514bb3d3 --- /dev/null +++ b/TextureAtlas/atlas10.json @@ -0,0 +1,173 @@ +{"frames": { + +"Models/Body/ArmLeftCrossed.png": +{ + "frame": {"x":307,"y":1404,"w":555,"h":639}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":555,"h":639}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmLeftFront.png": +{ + "frame": {"x":866,"y":1404,"w":555,"h":639}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":555,"h":639}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/Bubble.png": +{ + "frame": {"x":708,"y":3,"w":1232,"h":1269}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":41,"w":1232,"h":1269}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/NeckCorset.png": +{ + "frame": {"x":1911,"y":1284,"w":134,"h":113}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":357,"w":134,"h":113}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/BinderLeftBoxtie.png": +{ + "frame": {"x":1944,"y":540,"w":101,"h":201}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":516,"w":101,"h":201}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/BedHogtie.png": +{ + "frame": {"x":3,"y":3,"w":701,"h":1397}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":113,"y":35,"w":701,"h":1397}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLatex/NeckCorset.png": +{ + "frame": {"x":1911,"y":1284,"w":134,"h":113}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":357,"w":134,"h":113}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/HemUpper.png": +{ + "frame": {"x":1011,"y":1284,"w":600,"h":116}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":287,"y":941,"w":600,"h":116}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/BackStraight.png": +{ + "frame": {"x":3,"y":1404,"w":300,"h":640}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":113,"w":300,"h":640}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/VentR.png": +{ + "frame": {"x":1944,"y":3,"w":101,"h":314}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":501,"y":90,"w":101,"h":314}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/StrapsTorsoLowerCrossed.png": +{ + "frame": {"x":1747,"y":1787,"w":282,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":665,"w":282,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GloveLeftYoked.png": +{ + "frame": {"x":1944,"y":908,"w":101,"h":132}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":848,"y":277,"w":101,"h":132}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GloveLeftYoked.png": +{ + "frame": {"x":1944,"y":1044,"w":101,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":849,"y":278,"w":101,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/SleeveLeftUp.png": +{ + "frame": {"x":1944,"y":321,"w":101,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":669,"y":351,"w":101,"h":215}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Spats/SpatsSpread.png": +{ + "frame": {"x":1425,"y":1787,"w":318,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":738,"w":318,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/HandRightFront.png": +{ + "frame": {"x":1944,"y":1172,"w":101,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":462,"w":101,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/GloveRightYoked.png": +{ + "frame": {"x":1944,"y":745,"w":101,"h":159}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":299,"y":286,"w":101,"h":159}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessLowerKneel.png": +{ + "frame": {"x":1615,"y":1276,"w":292,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":743,"w":292,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoLowerBand.png": +{ + "frame": {"x":708,"y":1276,"w":299,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":802,"w":299,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SkirtKneel.png": +{ + "frame": {"x":1425,"y":1404,"w":619,"h":379}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":273,"y":713,"w":619,"h":379}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas10.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas10.webp b/TextureAtlas/atlas10.webp new file mode 100644 index 000000000..067d5d0b1 Binary files /dev/null and b/TextureAtlas/atlas10.webp differ diff --git a/TextureAtlas/atlas11.json b/TextureAtlas/atlas11.json new file mode 100644 index 000000000..0d5ef5ecf --- /dev/null +++ b/TextureAtlas/atlas11.json @@ -0,0 +1,245 @@ +{"frames": { + +"Models/Body/ForeArmRightCrossed.png": +{ + "frame": {"x":763,"y":503,"w":279,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":543,"w":279,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/BraUnderRim.png": +{ + "frame": {"x":1455,"y":2033,"w":38,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":557,"y":570,"w":38,"h":12}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/Legs.png": +{ + "frame": {"x":1046,"y":3,"w":987,"h":971}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":98,"y":760,"w":987,"h":971}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseSkirtLoneKneel.png": +{ + "frame": {"x":1502,"y":978,"w":541,"h":600}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":288,"y":390,"w":541,"h":600}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageCorset.png": +{ + "frame": {"x":1790,"y":1582,"w":255,"h":397}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":407,"w":255,"h":397}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceFang/MouthDazed.png": +{ + "frame": {"x":1361,"y":2033,"w":43,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":338,"w":43,"h":12}, + "sourceSize": {"w":706,"h":455} +}, +"Models/FaceFangless/MouthDazed.png": +{ + "frame": {"x":1408,"y":2033,"w":43,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":342,"w":43,"h":12}, + "sourceSize": {"w":706,"h":455} +}, +"Models/FaceKjus/Brows2Surprised.png": +{ + "frame": {"x":1308,"y":2033,"w":49,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":253,"w":49,"h":12}, + "sourceSize": {"w":813,"h":502} +}, +"Models/Furniture/DisplayFront.png": +{ + "frame": {"x":3,"y":3,"w":376,"h":1283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":403,"y":390,"w":376,"h":1283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/DisplayFrontHogtie.png": +{ + "frame": {"x":383,"y":3,"w":376,"h":1283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":403,"y":390,"w":376,"h":1283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/WaistbandClips.png": +{ + "frame": {"x":1292,"y":978,"w":206,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":673,"w":206,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Straight.png": +{ + "frame": {"x":1203,"y":1290,"w":295,"h":410}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":110,"w":295,"h":410}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair2_Left.png": +{ + "frame": {"x":909,"y":877,"w":133,"h":137}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":650,"y":82,"w":133,"h":137}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/Irish8CuffsFront.png": +{ + "frame": {"x":1790,"y":1983,"w":238,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":526,"w":238,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletLaceRightClosed.png": +{ + "frame": {"x":1435,"y":1091,"w":48,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":1387,"w":48,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandAnkleLeftKneelClosed.png": +{ + "frame": {"x":2032,"y":1983,"w":13,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":729,"y":949,"w":13,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockRightSpread.png": +{ + "frame": {"x":763,"y":693,"w":142,"h":593}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":1044,"w":142,"h":593}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowLeftYoked.png": +{ + "frame": {"x":1435,"y":1018,"w":63,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":770,"y":517,"w":63,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/LeotardChest.png": +{ + "frame": {"x":1203,"y":1704,"w":295,"h":241}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":426,"y":387,"w":295,"h":241}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/LegbinderKneelClosed.png": +{ + "frame": {"x":1502,"y":1582,"w":284,"h":463}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":400,"y":640,"w":284,"h":463}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SockLeftKneelClosed.png": +{ + "frame": {"x":909,"y":1018,"w":522,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":832,"w":522,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftStripeCrossed.png": +{ + "frame": {"x":1203,"y":2033,"w":101,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":613,"w":101,"h":12}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronRight.png": +{ + "frame": {"x":909,"y":693,"w":133,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":376,"w":133,"h":180}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressChestYoked.png": +{ + "frame": {"x":763,"y":3,"w":279,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":389,"w":279,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopChestTied.png": +{ + "frame": {"x":763,"y":266,"w":279,"h":233}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":397,"w":279,"h":233}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Tails/Fox4.png": +{ + "frame": {"x":3,"y":1290,"w":1039,"h":755}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":706,"w":1039,"h":755}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallRightClosed.png": +{ + "frame": {"x":1046,"y":1290,"w":153,"h":755}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":905,"w":153,"h":755}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/WebbingUnderbust.png": +{ + "frame": {"x":1046,"y":978,"w":242,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":610,"w":242,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtBeltKneel.png": +{ + "frame": {"x":1203,"y":1949,"w":295,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":735,"w":295,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas11.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas11.webp b/TextureAtlas/atlas11.webp new file mode 100644 index 000000000..3af5ee738 Binary files /dev/null and b/TextureAtlas/atlas11.webp differ diff --git a/TextureAtlas/atlas12.json b/TextureAtlas/atlas12.json new file mode 100644 index 000000000..9e95c9588 --- /dev/null +++ b/TextureAtlas/atlas12.json @@ -0,0 +1,165 @@ +{"frames": { + +"Models/ArmorPlate/BootRightClosed.png": +{ + "frame": {"x":1217,"y":3,"w":135,"h":409}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":1208,"w":135,"h":409}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/BubbleSquishy.png": +{ + "frame": {"x":3,"y":3,"w":1210,"h":1235}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":56,"w":1210,"h":1235}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/LegsBeltsHogtie.png": +{ + "frame": {"x":1356,"y":1790,"w":291,"h":255}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":914,"w":291,"h":255}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/Petsuit.png": +{ + "frame": {"x":1356,"y":1790,"w":291,"h":255}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":914,"w":291,"h":255}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmLeftFront.png": +{ + "frame": {"x":1217,"y":610,"w":121,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":656,"y":440,"w":121,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/ShoeRightClosed.png": +{ + "frame": {"x":1217,"y":416,"w":135,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":1439,"w":135,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/FrontStraight2.png": +{ + "frame": {"x":1802,"y":1462,"w":243,"h":260}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":103,"w":243,"h":260}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockRightClosed.png": +{ + "frame": {"x":1803,"y":873,"w":242,"h":585}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":1053,"w":242,"h":585}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressChestBoxtie.png": +{ + "frame": {"x":1356,"y":1242,"w":442,"h":544}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":388,"w":442,"h":544}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronLeft.png": +{ + "frame": {"x":1651,"y":1790,"w":147,"h":250}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":690,"y":372,"w":147,"h":250}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SockLeftKneelClosed.png": +{ + "frame": {"x":1217,"y":873,"w":582,"h":365}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":305,"y":723,"w":582,"h":365}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SockRightSpread.png": +{ + "frame": {"x":507,"y":1242,"w":166,"h":794}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":843,"w":166,"h":794}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmRightYoked.png": +{ + "frame": {"x":1802,"y":1726,"w":243,"h":241}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":390,"w":243,"h":241}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Tails/Fox2.png": +{ + "frame": {"x":1356,"y":154,"w":682,"h":715}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":275,"y":746,"w":682,"h":715}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLeftSpread.png": +{ + "frame": {"x":340,"y":1242,"w":163,"h":796}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":605,"y":895,"w":163,"h":796}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/PetsuitTopTapedHands.png": +{ + "frame": {"x":1802,"y":1971,"w":242,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":418,"w":242,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Weapon/NightWhipLightFree.png": +{ + "frame": {"x":677,"y":1242,"w":675,"h":790}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":274,"y":467,"w":675,"h":790}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/WitchHatBack.png": +{ + "frame": {"x":1356,"y":3,"w":684,"h":147}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":286,"y":160,"w":684,"h":147}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SkirtClosed.png": +{ + "frame": {"x":3,"y":1242,"w":333,"h":799}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":762,"w":333,"h":799}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas12.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas12.webp b/TextureAtlas/atlas12.webp new file mode 100644 index 000000000..744806725 Binary files /dev/null and b/TextureAtlas/atlas12.webp differ diff --git a/TextureAtlas/atlas13.json b/TextureAtlas/atlas13.json new file mode 100644 index 000000000..97c215d04 --- /dev/null +++ b/TextureAtlas/atlas13.json @@ -0,0 +1,213 @@ +{"frames": { + +"Models/ArmorPlate/BootLeftClosed.png": +{ + "frame": {"x":1884,"y":1521,"w":161,"h":444}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":1181,"w":161,"h":444}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoLowerPanties.png": +{ + "frame": {"x":700,"y":1658,"w":262,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":728,"w":262,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenLeftBoxtie.png": +{ + "frame": {"x":3,"y":3,"w":319,"h":1220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":392,"w":319,"h":1220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenRightBoxtie.png": +{ + "frame": {"x":326,"y":3,"w":316,"h":1220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":392,"w":316,"h":1220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockCollar.png": +{ + "frame": {"x":1818,"y":2024,"w":16,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":610,"y":403,"w":16,"h":21}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenLeftBoxtie.png": +{ + "frame": {"x":3,"y":3,"w":319,"h":1220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":392,"w":319,"h":1220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenRightBoxtie.png": +{ + "frame": {"x":646,"y":3,"w":316,"h":1220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":392,"w":316,"h":1220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenLeftBoxtie.png": +{ + "frame": {"x":3,"y":3,"w":319,"h":1220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":392,"w":319,"h":1220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenRightBoxtie.png": +{ + "frame": {"x":326,"y":3,"w":316,"h":1220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":392,"w":316,"h":1220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/Brows2Neutral.png": +{ + "frame": {"x":1640,"y":2024,"w":60,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":604,"y":239,"w":60,"h":21}, + "sourceSize": {"w":725,"h":424} +}, +"Models/EyesDai2/Brows2Surprised.png": +{ + "frame": {"x":1704,"y":2024,"w":51,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":611,"y":230,"w":51,"h":21}, + "sourceSize": {"w":813,"h":502} +}, +"Models/FaceDask/BrowsAngry.png": +{ + "frame": {"x":1759,"y":2024,"w":26,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":551,"y":259,"w":26,"h":21}, + "sourceSize": {"w":700,"h":400} +}, +"Models/GagMetal/OTNStrap.png": +{ + "frame": {"x":1487,"y":2024,"w":149,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":238,"w":149,"h":21}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Jacket/StrapsTorsoLowerExtra.png": +{ + "frame": {"x":700,"y":1854,"w":262,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":610,"w":262,"h":180}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Leotard.png": +{ + "frame": {"x":700,"y":1227,"w":262,"h":427}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":493,"w":262,"h":427}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/CoatYoked.png": +{ + "frame": {"x":966,"y":1065,"w":552,"h":955}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":395,"y":568,"w":552,"h":955}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/GlowLeftLegsKneelClosed.png": +{ + "frame": {"x":1522,"y":1065,"w":522,"h":452}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":321,"y":702,"w":522,"h":452}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowRightBoxtie.png": +{ + "frame": {"x":1789,"y":2024,"w":25,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":608,"w":25,"h":21}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuff2RightFree.png": +{ + "frame": {"x":2009,"y":1969,"w":35,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":629,"w":35,"h":76}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderRight.png": +{ + "frame": {"x":1884,"y":1969,"w":121,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":417,"w":121,"h":76}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Tails/Fox6.png": +{ + "frame": {"x":966,"y":3,"w":1068,"h":1058}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":114,"y":447,"w":1068,"h":1058}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/LegsClosed.png": +{ + "frame": {"x":1522,"y":1521,"w":358,"h":499}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":652,"w":358,"h":499}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/WebbingHardware.png": +{ + "frame": {"x":1838,"y":2024,"w":42,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":509,"y":480,"w":42,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Weapon/LatexWhipFree.png": +{ + "frame": {"x":3,"y":1227,"w":693,"h":809}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":270,"y":465,"w":693,"h":809}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yoke/SteelBar.png": +{ + "frame": {"x":966,"y":2024,"w":517,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":355,"y":401,"w":517,"h":21}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas13.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas13.webp b/TextureAtlas/atlas13.webp new file mode 100644 index 000000000..0f60abf04 Binary files /dev/null and b/TextureAtlas/atlas13.webp differ diff --git a/TextureAtlas/atlas14.json b/TextureAtlas/atlas14.json new file mode 100644 index 000000000..b2c10ccee --- /dev/null +++ b/TextureAtlas/atlas14.json @@ -0,0 +1,389 @@ +{"frames": { + +"Models/Blindfold/KittyEyes.png": +{ + "frame": {"x":3,"y":2017,"w":133,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":275,"w":133,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/LatexSphere.png": +{ + "frame": {"x":617,"y":3,"w":1210,"h":1210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":77,"w":1210,"h":1210}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenLeftBoxtie.png": +{ + "frame": {"x":1746,"y":1339,"w":75,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":503,"w":75,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayWristLeftFree.png": +{ + "frame": {"x":1470,"y":1903,"w":30,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":829,"y":744,"w":30,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenWristRightYoked.png": +{ + "frame": {"x":1470,"y":1943,"w":29,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":304,"y":396,"w":29,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenLeftBoxtie.png": +{ + "frame": {"x":1746,"y":1339,"w":75,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":503,"w":75,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenLeftBoxtie.png": +{ + "frame": {"x":323,"y":3,"w":290,"h":1220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":392,"w":290,"h":1220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenRightBoxtie.png": +{ + "frame": {"x":3,"y":3,"w":316,"h":1220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":392,"w":316,"h":1220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenLeftBoxtie.png": +{ + "frame": {"x":1746,"y":1339,"w":75,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":503,"w":75,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightDecoCleanFree.png": +{ + "frame": {"x":1470,"y":1633,"w":30,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":365,"y":608,"w":30,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightDecoFree.png": +{ + "frame": {"x":1470,"y":1697,"w":30,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":365,"y":608,"w":30,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmRightYoked.png": +{ + "frame": {"x":1831,"y":1120,"w":213,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":286,"y":356,"w":213,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseSkirtKneel.png": +{ + "frame": {"x":1504,"y":1397,"w":541,"h":599}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":288,"y":391,"w":541,"h":599}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/ShoeRightKneel.png": +{ + "frame": {"x":1746,"y":1217,"w":81,"h":118}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":319,"y":836,"w":81,"h":118}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/Skirt.png": +{ + "frame": {"x":1831,"y":3,"w":214,"h":316}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":781,"w":214,"h":316}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarFrontSpreadHeels.png": +{ + "frame": {"x":170,"y":1227,"w":62,"h":780}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":570,"y":872,"w":62,"h":780}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagCloth/Knot.png": +{ + "frame": {"x":548,"y":2005,"w":177,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":65,"y":231,"w":177,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLatex/LatexPlug.png": +{ + "frame": {"x":1470,"y":1819,"w":30,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":116,"y":238,"w":30,"h":38}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BallStrap.png": +{ + "frame": {"x":892,"y":2003,"w":149,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BigBallStrap.png": +{ + "frame": {"x":1045,"y":2003,"w":149,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallStrap.png": +{ + "frame": {"x":1198,"y":2003,"w":149,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BigBallStrap.png": +{ + "frame": {"x":1351,"y":2003,"w":149,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/SciFiPlug.png": +{ + "frame": {"x":1470,"y":1861,"w":30,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":116,"y":238,"w":30,"h":38}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/TwintailLeft.png": +{ + "frame": {"x":1382,"y":1397,"w":84,"h":602}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":141,"w":84,"h":602}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLeftSpread.png": +{ + "frame": {"x":3,"y":1227,"w":163,"h":786}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":605,"y":896,"w":163,"h":786}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hood/Hood.png": +{ + "frame": {"x":1831,"y":323,"w":214,"h":280}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":120,"w":214,"h":280}, + "sourceSize": {"w":752,"h":420} +}, +"Models/KittyPet/BlindfoldBrow.png": +{ + "frame": {"x":3,"y":2017,"w":133,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":275,"w":133,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareBelt.png": +{ + "frame": {"x":729,"y":2005,"w":159,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":692,"w":159,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SkirtOverKneel.png": +{ + "frame": {"x":1115,"y":1217,"w":358,"h":176}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":801,"w":358,"h":176}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeSockLeftSpread.png": +{ + "frame": {"x":250,"y":2008,"w":149,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":609,"y":973,"w":149,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeSockRightSpread.png": +{ + "frame": {"x":403,"y":2008,"w":141,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":974,"w":141,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightStripeUp.png": +{ + "frame": {"x":140,"y":2017,"w":106,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":311,"w":106,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightStripeYoked.png": +{ + "frame": {"x":1470,"y":1397,"w":30,"h":120}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":399,"y":495,"w":30,"h":120}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenLeftFree.png": +{ + "frame": {"x":1831,"y":765,"w":213,"h":351}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":512,"w":213,"h":351}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/LegLeftHogtie.png": +{ + "frame": {"x":636,"y":1397,"w":171,"h":604}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":962,"w":171,"h":604}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/ArmHarnessUnderbust.png": +{ + "frame": {"x":1756,"y":2000,"w":244,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":581,"w":244,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/CrotchropeStrap.png": +{ + "frame": {"x":1470,"y":1521,"w":30,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":809,"w":30,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh2Closed.png": +{ + "frame": {"x":1504,"y":2000,"w":248,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":1012,"w":248,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/ApronSkirtOverKneel.png": +{ + "frame": {"x":1831,"y":607,"w":214,"h":154}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":498,"y":752,"w":214,"h":154}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/ApronSkirtOverKneelCrotchStrap.png": +{ + "frame": {"x":1831,"y":607,"w":214,"h":154}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":498,"y":752,"w":214,"h":154}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/WristRightFree.png": +{ + "frame": {"x":1470,"y":1761,"w":30,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":359,"y":607,"w":30,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallLeftClosed.png": +{ + "frame": {"x":236,"y":1227,"w":169,"h":777}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":575,"y":906,"w":169,"h":777}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallLeftKneel.png": +{ + "frame": {"x":636,"y":1217,"w":475,"h":176}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":911,"w":475,"h":176}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLeftClosed.png": +{ + "frame": {"x":409,"y":1227,"w":223,"h":774}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":519,"y":902,"w":223,"h":774}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SearchlightLens.png": +{ + "frame": {"x":2004,"y":2000,"w":41,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":653,"y":430,"w":41,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/Skirt.png": +{ + "frame": {"x":811,"y":1397,"w":567,"h":602}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":319,"y":788,"w":567,"h":602}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/PantiesKneel.png": +{ + "frame": {"x":1477,"y":1217,"w":265,"h":176}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":673,"w":265,"h":176}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas14.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas14.webp b/TextureAtlas/atlas14.webp new file mode 100644 index 000000000..37170a789 Binary files /dev/null and b/TextureAtlas/atlas14.webp differ diff --git a/TextureAtlas/atlas15.json b/TextureAtlas/atlas15.json new file mode 100644 index 000000000..3376ee909 --- /dev/null +++ b/TextureAtlas/atlas15.json @@ -0,0 +1,445 @@ +{"frames": { + +"Models/Armbinder/StrapsRightBoxtie.png": +{ + "frame": {"x":2024,"y":230,"w":14,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":518,"w":14,"h":13}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShoulderPad.png": +{ + "frame": {"x":1554,"y":1132,"w":128,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":686,"y":390,"w":128,"h":127}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/LeftArm1Boxtie.png": +{ + "frame": {"x":1329,"y":1991,"w":71,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":491,"w":71,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/BallSuit.png": +{ + "frame": {"x":552,"y":1217,"w":771,"h":770}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":221,"y":387,"w":771,"h":770}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/LatexSphereCutaway.png": +{ + "frame": {"x":3,"y":3,"w":1210,"h":1210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":77,"w":1210,"h":1210}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/LegSockLeftClosed.png": +{ + "frame": {"x":1467,"y":1991,"w":151,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":907,"w":151,"h":14}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/LegSockLeftHogtie.png": +{ + "frame": {"x":1467,"y":1991,"w":151,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":907,"w":151,"h":14}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/DisplayLongMittenLeftBoxtie.png": +{ + "frame": {"x":2024,"y":272,"w":13,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":755,"y":526,"w":13,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/DisplayLongMittenLeftCrossed.png": +{ + "frame": {"x":1599,"y":2009,"w":13,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":757,"y":536,"w":13,"h":21}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/DisplayLongMittenLeftFront.png": +{ + "frame": {"x":2024,"y":247,"w":13,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":756,"y":536,"w":13,"h":21}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowRightBoxtie.png": +{ + "frame": {"x":2024,"y":189,"w":14,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":603,"w":14,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockWristLeftYoked.png": +{ + "frame": {"x":2024,"y":39,"w":16,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":919,"y":409,"w":16,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/ShinyBalletRightSpread.png": +{ + "frame": {"x":1217,"y":3,"w":108,"h":350}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":1348,"w":108,"h":350}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapLongMittenRightCrossed.png": +{ + "frame": {"x":2009,"y":1184,"w":34,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":747,"y":612,"w":34,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperDisplayLongMittenLeftBoxtie.png": +{ + "frame": {"x":2024,"y":272,"w":13,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":755,"y":526,"w":13,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperDisplayLongMittenLeftCrossed.png": +{ + "frame": {"x":1599,"y":2009,"w":13,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":757,"y":536,"w":13,"h":21}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperDisplayLongMittenLeftFree.png": +{ + "frame": {"x":2024,"y":165,"w":14,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":762,"y":520,"w":14,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperDisplayLongMittenLeftFront.png": +{ + "frame": {"x":2024,"y":247,"w":13,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":756,"y":536,"w":13,"h":21}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockBandFree.png": +{ + "frame": {"x":2024,"y":211,"w":14,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":778,"y":619,"w":14,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockBandWristtie.png": +{ + "frame": {"x":2024,"y":145,"w":16,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":727,"y":643,"w":16,"h":16}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightDecoCleanFront.png": +{ + "frame": {"x":2024,"y":73,"w":16,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":622,"w":16,"h":21}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightLockBandFront.png": +{ + "frame": {"x":2024,"y":123,"w":16,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":419,"y":619,"w":16,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BowCorsetBustRuffle.png": +{ + "frame": {"x":3,"y":1994,"w":249,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":485,"w":249,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletRightClosed.png": +{ + "frame": {"x":1945,"y":1263,"w":100,"h":325}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":510,"y":1359,"w":100,"h":325}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLeftClosed.png": +{ + "frame": {"x":159,"y":1217,"w":223,"h":772}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":520,"y":902,"w":223,"h":772}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/WristLeftFree.png": +{ + "frame": {"x":1404,"y":1991,"w":59,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":798,"y":747,"w":59,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/AnkleLeftClosed.png": +{ + "frame": {"x":1229,"y":1991,"w":96,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":579,"y":1427,"w":96,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareWristRightFront.png": +{ + "frame": {"x":2024,"y":98,"w":16,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":471,"y":543,"w":16,"h":21}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/Stripe.png": +{ + "frame": {"x":1329,"y":294,"w":353,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":422,"y":858,"w":353,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootRightSpread.png": +{ + "frame": {"x":1554,"y":357,"w":128,"h":398}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":1097,"w":128,"h":398}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/FootSockLeftHogtie.png": +{ + "frame": {"x":1622,"y":1846,"w":341,"h":199}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":714,"w":341,"h":199}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GloveRightCrossed.png": +{ + "frame": {"x":2024,"y":3,"w":16,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":685,"y":606,"w":16,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronLeft.png": +{ + "frame": {"x":1554,"y":972,"w":128,"h":156}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":384,"w":128,"h":156}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Cuffs.png": +{ + "frame": {"x":555,"y":1991,"w":194,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":532,"w":194,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopCuffs.png": +{ + "frame": {"x":753,"y":1991,"w":193,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":532,"w":193,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftYoked.png": +{ + "frame": {"x":1329,"y":1209,"w":221,"h":385}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":723,"y":380,"w":221,"h":385}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftYokedTight.png": +{ + "frame": {"x":1329,"y":1209,"w":221,"h":385}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":723,"y":380,"w":221,"h":385}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf1ClosedOver.png": +{ + "frame": {"x":1467,"y":2009,"w":128,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":544,"y":1416,"w":128,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh3ClosedOver.png": +{ + "frame": {"x":256,"y":1993,"w":295,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":926,"w":295,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/LegLeftKneel.png": +{ + "frame": {"x":1554,"y":1263,"w":387,"h":331}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":751,"w":387,"h":331}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/TorsoLower.png": +{ + "frame": {"x":1327,"y":1598,"w":291,"h":389}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":541,"w":291,"h":389}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/HemLeftYoked.png": +{ + "frame": {"x":1122,"y":1991,"w":103,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":521,"w":103,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Shades/GlassesLens.png": +{ + "frame": {"x":950,"y":1991,"w":168,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":264,"w":168,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallRightClosed.png": +{ + "frame": {"x":3,"y":1217,"w":152,"h":773}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":909,"w":152,"h":773}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallRightSpread.png": +{ + "frame": {"x":386,"y":1217,"w":162,"h":772}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":903,"w":162,"h":772}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/BottomClosed.png": +{ + "frame": {"x":1686,"y":488,"w":358,"h":692}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":652,"w":358,"h":692}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/BottomHogtie.png": +{ + "frame": {"x":1686,"y":488,"w":358,"h":692}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":652,"w":358,"h":692}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmRightBoxtie.png": +{ + "frame": {"x":1967,"y":1846,"w":78,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":493,"w":78,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/TopStrapWristtie.png": +{ + "frame": {"x":1686,"y":1184,"w":319,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":437,"w":319,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/WebbingSide.png": +{ + "frame": {"x":1554,"y":759,"w":128,"h":209}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":635,"y":413,"w":128,"h":209}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/SkirtKneel.png": +{ + "frame": {"x":1622,"y":1598,"w":423,"h":244}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":389,"y":687,"w":423,"h":244}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtRuffleOverKneelCrotchStrap.png": +{ + "frame": {"x":1686,"y":294,"w":359,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":786,"w":359,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/WitchHat.png": +{ + "frame": {"x":1329,"y":3,"w":691,"h":287}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":279,"y":18,"w":691,"h":287}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/Skirt.png": +{ + "frame": {"x":1217,"y":357,"w":333,"h":848}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":713,"w":333,"h":848}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas15.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas15.webp b/TextureAtlas/atlas15.webp new file mode 100644 index 000000000..ea18af80f Binary files /dev/null and b/TextureAtlas/atlas15.webp differ diff --git a/TextureAtlas/atlas16.json b/TextureAtlas/atlas16.json new file mode 100644 index 000000000..b942d92d1 --- /dev/null +++ b/TextureAtlas/atlas16.json @@ -0,0 +1,333 @@ +{"frames": { + +"Models/Bandit/KneeKneel.png": +{ + "frame": {"x":1012,"y":1935,"w":126,"h":110}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":382,"y":977,"w":126,"h":110}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/Cherry.png": +{ + "frame": {"x":611,"y":1935,"w":265,"h":110}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":514,"w":265,"h":110}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/BallSuitSeam.png": +{ + "frame": {"x":611,"y":1161,"w":771,"h":770}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":221,"y":387,"w":771,"h":770}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveLeftFront.png": +{ + "frame": {"x":1386,"y":1664,"w":245,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":523,"y":464,"w":245,"h":267}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/LegLeftSpread.png": +{ + "frame": {"x":1499,"y":3,"w":168,"h":551}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":601,"y":919,"w":168,"h":551}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LockLongMittenLeftFree.png": +{ + "frame": {"x":1581,"y":840,"w":86,"h":249}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":765,"y":523,"w":86,"h":249}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LockLongMittenLeftFree.png": +{ + "frame": {"x":1635,"y":1918,"w":13,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":838,"y":759,"w":13,"h":13}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/Arms.png": +{ + "frame": {"x":1182,"y":558,"w":395,"h":309}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":396,"y":413,"w":395,"h":309}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/LeftLegsKneel.png": +{ + "frame": {"x":1671,"y":580,"w":373,"h":287}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":368,"y":801,"w":373,"h":287}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesK4/Eyes2Heart.png": +{ + "frame": {"x":1499,"y":1112,"w":70,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":262,"w":70,"h":45}, + "sourceSize": {"w":753,"h":414} +}, +"Models/Gothic/Lines.png": +{ + "frame": {"x":1386,"y":1161,"w":657,"h":499}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":270,"y":671,"w":657,"h":499}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair4_Left.png": +{ + "frame": {"x":318,"y":3,"w":344,"h":1154}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":132,"w":344,"h":1154}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair5_Left.png": +{ + "frame": {"x":161,"y":3,"w":153,"h":1164}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":711,"y":171,"w":153,"h":1164}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair5_Right.png": +{ + "frame": {"x":3,"y":3,"w":154,"h":1165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":400,"y":171,"w":154,"h":1165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletSoleRightSpread.png": +{ + "frame": {"x":1941,"y":871,"w":104,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":1481,"w":104,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/LatexLower.png": +{ + "frame": {"x":1789,"y":1664,"w":256,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":656,"w":256,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/GlowLegsKneel.png": +{ + "frame": {"x":1671,"y":156,"w":373,"h":420}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":246,"y":712,"w":373,"h":420}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/GlowLegsKneelClosed.png": +{ + "frame": {"x":1671,"y":156,"w":373,"h":420}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":246,"y":712,"w":373,"h":420}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/GlowTorso.png": +{ + "frame": {"x":666,"y":3,"w":382,"h":551}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":392,"y":341,"w":382,"h":551}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Leash/LeashKneelPulled.png": +{ + "frame": {"x":666,"y":558,"w":512,"h":309}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":91,"y":129,"w":512,"h":309}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/ArmsHardware.png": +{ + "frame": {"x":1671,"y":3,"w":374,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":418,"y":534,"w":374,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LegsLacesHogtie.png": +{ + "frame": {"x":1635,"y":1664,"w":32,"h":132}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":703,"y":957,"w":32,"h":132}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronChestRufflesWristtie.png": +{ + "frame": {"x":1789,"y":1927,"w":256,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":396,"w":256,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronRightUp.png": +{ + "frame": {"x":1499,"y":871,"w":78,"h":237}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":324,"w":78,"h":237}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SockLeftClosed.png": +{ + "frame": {"x":3,"y":1172,"w":298,"h":868}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":769,"w":298,"h":868}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SockRightClosed.png": +{ + "frame": {"x":305,"y":1171,"w":302,"h":859}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":769,"w":302,"h":859}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/SockLeftHogtie.png": +{ + "frame": {"x":1671,"y":871,"w":266,"h":286}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":929,"w":266,"h":286}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveDecoRightFront.png": +{ + "frame": {"x":1052,"y":3,"w":132,"h":551}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":359,"y":618,"w":132,"h":551}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/HandLeftFree.png": +{ + "frame": {"x":1941,"y":1070,"w":103,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":815,"y":774,"w":103,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/AnkleLeftClosed.png": +{ + "frame": {"x":1671,"y":1664,"w":114,"h":381}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":1137,"w":114,"h":381}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/LegRightHogtie.png": +{ + "frame": {"x":1581,"y":1093,"w":86,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/RightHogtie.png": +{ + "frame": {"x":1581,"y":1093,"w":86,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/bac/SuccubusClawRightFree.png": +{ + "frame": {"x":1635,"y":1800,"w":32,"h":114}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":289,"y":526,"w":32,"h":114}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusWingBase.png": +{ + "frame": {"x":666,"y":871,"w":829,"h":286}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":219,"y":380,"w":829,"h":286}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/HandRightFree.png": +{ + "frame": {"x":1142,"y":1935,"w":113,"h":110}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":266,"y":546,"w":113,"h":110}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/BottomKneelClosed.png": +{ + "frame": {"x":1314,"y":1935,"w":353,"h":109}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":395,"y":734,"w":353,"h":109}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/FootSockLeftHogtie.png": +{ + "frame": {"x":1259,"y":1935,"w":51,"h":110}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":799,"w":51,"h":110}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveLeftCrossed.png": +{ + "frame": {"x":1581,"y":558,"w":86,"h":278}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":693,"y":425,"w":86,"h":278}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/ForeGloveLeftFront.png": +{ + "frame": {"x":880,"y":1935,"w":128,"h":110}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":550,"y":465,"w":128,"h":110}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoLower.png": +{ + "frame": {"x":1188,"y":3,"w":307,"h":548}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":390,"w":307,"h":548}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas16.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas16.webp b/TextureAtlas/atlas16.webp new file mode 100644 index 000000000..344b734a8 Binary files /dev/null and b/TextureAtlas/atlas16.webp differ diff --git a/TextureAtlas/atlas17.json b/TextureAtlas/atlas17.json new file mode 100644 index 000000000..dc93cd2b2 --- /dev/null +++ b/TextureAtlas/atlas17.json @@ -0,0 +1,333 @@ +{"frames": { + +"Models/ArmorPlate/PauldronsYoked.png": +{ + "frame": {"x":646,"y":1894,"w":390,"h":151}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":398,"w":390,"h":151}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmLeftUp.png": +{ + "frame": {"x":1335,"y":1093,"w":207,"h":395}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":626,"y":167,"w":207,"h":395}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmRightUp.png": +{ + "frame": {"x":1593,"y":1701,"w":145,"h":344}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":162,"w":145,"h":344}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/Arms.png": +{ + "frame": {"x":1546,"y":3,"w":497,"h":415}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":357,"y":392,"w":497,"h":415}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveRightCrossed.png": +{ + "frame": {"x":1742,"y":1876,"w":267,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":515,"w":267,"h":169}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/SockLeftKneelClosed.png": +{ + "frame": {"x":1546,"y":869,"w":495,"h":272}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":808,"w":495,"h":272}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cape/CapeYoked.png": +{ + "frame": {"x":626,"y":3,"w":569,"h":1094}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":363,"y":413,"w":569,"h":1094}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/CollarHardware.png": +{ + "frame": {"x":2013,"y":1942,"w":32,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":400,"w":32,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/CollarHardware.png": +{ + "frame": {"x":2013,"y":1942,"w":32,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":400,"w":32,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapLongMittenLeftCrossed.png": +{ + "frame": {"x":1742,"y":1797,"w":25,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":417,"y":594,"w":25,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/Skirt.png": +{ + "frame": {"x":3,"y":1128,"w":496,"h":763}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":755,"w":496,"h":763}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtClosed.png": +{ + "frame": {"x":3,"y":1128,"w":496,"h":763}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":755,"w":496,"h":763}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/CollarHardware.png": +{ + "frame": {"x":2013,"y":1942,"w":32,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":400,"w":32,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/CrystalShoeLeftClosed.png": +{ + "frame": {"x":2013,"y":1876,"w":32,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":579,"y":1497,"w":32,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceDask/EyesDazed.png": +{ + "frame": {"x":889,"y":1840,"w":147,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":54,"y":173,"w":147,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceFangless/MouthEmbarrassed.png": +{ + "frame": {"x":2013,"y":1993,"w":32,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":320,"w":32,"h":35}, + "sourceSize": {"w":754,"h":461} +}, +"Models/Hair2/Hair4_Right.png": +{ + "frame": {"x":1199,"y":3,"w":343,"h":1086}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":196,"y":132,"w":343,"h":1086}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/HairAura_RightB.png": +{ + "frame": {"x":1546,"y":1145,"w":221,"h":343}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":348,"y":398,"w":221,"h":343}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/HeadbandFrill.png": +{ + "frame": {"x":3,"y":1895,"w":288,"h":150}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":90,"w":288,"h":150}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherLeftSpread.png": +{ + "frame": {"x":1335,"y":1492,"w":125,"h":553}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":643,"y":1129,"w":125,"h":553}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallRightSpread.png": +{ + "frame": {"x":503,"y":1128,"w":169,"h":762}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":902,"w":169,"h":762}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveRightFree.png": +{ + "frame": {"x":295,"y":1895,"w":203,"h":150}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":287,"y":552,"w":203,"h":150}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockLeftKneelClosed.png": +{ + "frame": {"x":1546,"y":647,"w":497,"h":218}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":860,"w":497,"h":218}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockRightHogtie.png": +{ + "frame": {"x":502,"y":1895,"w":140,"h":150}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":1055,"w":140,"h":150}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockRightKneelClosed.png": +{ + "frame": {"x":1593,"y":1492,"w":174,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":323,"y":851,"w":174,"h":205}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockLeftKneelClosed.png": +{ + "frame": {"x":1546,"y":422,"w":497,"h":221}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":387,"y":860,"w":497,"h":221}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockRightHogtie.png": +{ + "frame": {"x":502,"y":1895,"w":140,"h":150}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":1055,"w":140,"h":150}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/CapeYoked.png": +{ + "frame": {"x":626,"y":3,"w":569,"h":1094}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":363,"y":413,"w":569,"h":1094}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/CoatSpread.png": +{ + "frame": {"x":3,"y":3,"w":619,"h":1121}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":333,"y":392,"w":619,"h":1121}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/Blouse.png": +{ + "frame": {"x":1771,"y":1582,"w":274,"h":290}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":494,"w":274,"h":290}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/HeadbandRibbonBack.png": +{ + "frame": {"x":1742,"y":1701,"w":25,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":261,"w":25,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SockLeftSpread.png": +{ + "frame": {"x":1040,"y":1101,"w":291,"h":931}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":707,"w":291,"h":931}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ThighRightSpread.png": +{ + "frame": {"x":889,"y":1509,"w":147,"h":327}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":979,"w":147,"h":327}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Nipples/VibePiercings.png": +{ + "frame": {"x":676,"y":1860,"w":205,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":569,"w":205,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/LegRightHogtie.png": +{ + "frame": {"x":889,"y":1101,"w":147,"h":404}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":802,"w":147,"h":404}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/TorsoUpper.png": +{ + "frame": {"x":1771,"y":1145,"w":274,"h":433}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":360,"w":274,"h":433}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/LeftSpread.png": +{ + "frame": {"x":1464,"y":1492,"w":125,"h":553}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":643,"y":1129,"w":125,"h":553}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusHornLight.png": +{ + "frame": {"x":626,"y":1101,"w":259,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":152,"w":259,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SockLeftClosed.png": +{ + "frame": {"x":676,"y":1128,"w":209,"h":728}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":896,"w":209,"h":728}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtSplitClosed.png": +{ + "frame": {"x":3,"y":1128,"w":496,"h":763}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":755,"w":496,"h":763}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas17.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas17.webp b/TextureAtlas/atlas17.webp new file mode 100644 index 000000000..388bfb0df Binary files /dev/null and b/TextureAtlas/atlas17.webp differ diff --git a/TextureAtlas/atlas18.json b/TextureAtlas/atlas18.json new file mode 100644 index 000000000..d4189feb9 --- /dev/null +++ b/TextureAtlas/atlas18.json @@ -0,0 +1,405 @@ +{"frames": { + +"Models/Body/HandLeftYoked.png": +{ + "frame": {"x":1076,"y":1068,"w":732,"h":318}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":732,"h":318}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cape/CapeSpread.png": +{ + "frame": {"x":589,"y":3,"w":483,"h":1057}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":400,"y":409,"w":483,"h":1057}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/HandLeftYoked.png": +{ + "frame": {"x":1076,"y":744,"w":733,"h":320}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":92,"w":733,"h":320}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/LegRightKneelClosed.png": +{ + "frame": {"x":1813,"y":745,"w":232,"h":300}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":759,"w":232,"h":300}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/FutureBand.png": +{ + "frame": {"x":256,"y":2011,"w":96,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":580,"y":390,"w":96,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LockLongMittenLeftYoked.png": +{ + "frame": {"x":775,"y":1088,"w":13,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":795,"y":489,"w":13,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenLeftUp.png": +{ + "frame": {"x":1951,"y":622,"w":94,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":739,"y":176,"w":94,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenRightUp.png": +{ + "frame": {"x":1951,"y":447,"w":94,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":182,"w":94,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenLeftUp.png": +{ + "frame": {"x":1951,"y":622,"w":94,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":739,"y":176,"w":94,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenRightUp.png": +{ + "frame": {"x":1951,"y":447,"w":94,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":182,"w":94,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperLockLongMittenLeftYoked.png": +{ + "frame": {"x":775,"y":1088,"w":13,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":795,"y":489,"w":13,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightDecoCleanSpread.png": +{ + "frame": {"x":1951,"y":705,"w":94,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":1052,"w":94,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceKjus/Eyes2Closed.png": +{ + "frame": {"x":743,"y":1064,"w":52,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":621,"y":284,"w":52,"h":20}, + "sourceSize": {"w":759,"h":425} +}, +"Models/FaceKjus/WhitesEyes2Closed.png": +{ + "frame": {"x":743,"y":1064,"w":52,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":621,"y":284,"w":52,"h":20}, + "sourceSize": {"w":759,"h":425} +}, +"Models/FaceKoi/MouthDistracted.png": +{ + "frame": {"x":1926,"y":2033,"w":35,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":118,"y":242,"w":35,"h":12}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/MouthPout.png": +{ + "frame": {"x":1965,"y":2033,"w":33,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":116,"y":243,"w":33,"h":12}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Festive/BinderLeftWristtie.png": +{ + "frame": {"x":1951,"y":3,"w":94,"h":227}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":518,"w":94,"h":227}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureBox/DoorNumeral.png": +{ + "frame": {"x":3,"y":1089,"w":768,"h":918}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":231,"y":675,"w":768,"h":918}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/BallTeeth_TeethDeep2Fang.png": +{ + "frame": {"x":1802,"y":2033,"w":38,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":111,"y":236,"w":38,"h":12}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BallTeeth_TeethDeepFang.png": +{ + "frame": {"x":1844,"y":2033,"w":37,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":112,"y":236,"w":37,"h":12}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallTeeth_TeethDeep2Fang.png": +{ + "frame": {"x":1802,"y":2033,"w":38,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":111,"y":236,"w":38,"h":12}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallTeeth_TeethDeepFang.png": +{ + "frame": {"x":1885,"y":2033,"w":37,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":112,"y":236,"w":37,"h":12}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Gothic/Buttons.png": +{ + "frame": {"x":589,"y":1064,"w":150,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":491,"y":685,"w":150,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/BraidCustom.png": +{ + "frame": {"x":799,"y":1064,"w":273,"h":270}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":117,"w":273,"h":270}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair4_LeftB.png": +{ + "frame": {"x":3,"y":3,"w":152,"h":1082}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":134,"w":152,"h":1082}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair4_RightB.png": +{ + "frame": {"x":159,"y":3,"w":150,"h":1082}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":387,"y":134,"w":150,"h":1082}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/WolfCuffsChainFront.png": +{ + "frame": {"x":145,"y":2011,"w":107,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":557,"w":107,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandAnkleRightSpread.png": +{ + "frame": {"x":720,"y":2011,"w":73,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":1423,"w":73,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowLeftBoxtie.png": +{ + "frame": {"x":636,"y":2011,"w":80,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":693,"y":586,"w":80,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandCollar.png": +{ + "frame": {"x":356,"y":2011,"w":96,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":580,"y":390,"w":96,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandThighLeftClosed.png": +{ + "frame": {"x":3,"y":2011,"w":138,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":1049,"w":138,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/StrapsArms.png": +{ + "frame": {"x":1245,"y":1996,"w":326,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":477,"w":326,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ShoulderRightUp.png": +{ + "frame": {"x":1076,"y":1390,"w":149,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":316,"w":149,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmRightUp.png": +{ + "frame": {"x":1076,"y":1640,"w":165,"h":405}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":156,"w":165,"h":405}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopShouldersTied.png": +{ + "frame": {"x":1813,"y":1049,"w":232,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":496,"y":422,"w":232,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopBelt.png": +{ + "frame": {"x":1575,"y":1996,"w":223,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":658,"w":223,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/Chest.png": +{ + "frame": {"x":797,"y":1777,"w":267,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":360,"w":267,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/TorsoUpper.png": +{ + "frame": {"x":797,"y":1338,"w":275,"h":435}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":360,"w":275,"h":435}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowLeftFree.png": +{ + "frame": {"x":456,"y":2011,"w":86,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":692,"y":601,"w":86,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Tails/Fox3.png": +{ + "frame": {"x":1076,"y":3,"w":871,"h":737}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":275,"y":724,"w":871,"h":737}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/AnklesHogtie.png": +{ + "frame": {"x":1812,"y":1247,"w":233,"h":389}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":955,"w":233,"h":389}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/AnklesHogtie.png": +{ + "frame": {"x":1812,"y":1640,"w":233,"h":389}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":955,"w":233,"h":389}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/HandLeftFree.png": +{ + "frame": {"x":1951,"y":538,"w":94,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":822,"y":785,"w":94,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SockRightClosed.png": +{ + "frame": {"x":313,"y":3,"w":272,"h":1075}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":538,"w":272,"h":1075}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/Necklace.png": +{ + "frame": {"x":1951,"y":349,"w":94,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":406,"w":94,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtClosed.png": +{ + "frame": {"x":1245,"y":1390,"w":563,"h":602}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":321,"y":788,"w":563,"h":602}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ChestRim.png": +{ + "frame": {"x":546,"y":2011,"w":86,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":390,"w":86,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimRightKneel.png": +{ + "frame": {"x":1951,"y":234,"w":94,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":435,"y":746,"w":94,"h":111}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimRightKneelClosed.png": +{ + "frame": {"x":1951,"y":234,"w":94,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":435,"y":746,"w":94,"h":111}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas18.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas18.webp b/TextureAtlas/atlas18.webp new file mode 100644 index 000000000..3c6f8dc87 Binary files /dev/null and b/TextureAtlas/atlas18.webp differ diff --git a/TextureAtlas/atlas19.json b/TextureAtlas/atlas19.json new file mode 100644 index 000000000..b8481e8c6 --- /dev/null +++ b/TextureAtlas/atlas19.json @@ -0,0 +1,517 @@ +{"frames": { + +"Models/Bra/Bra.png": +{ + "frame": {"x":1521,"y":173,"w":268,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":510,"w":268,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/BubbleSquishyBack.png": +{ + "frame": {"x":490,"y":3,"w":312,"h":986}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":139,"w":312,"h":986}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/LatexSphereCutawayBack.png": +{ + "frame": {"x":806,"y":3,"w":312,"h":986}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":139,"w":312,"h":986}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/Ears.png": +{ + "frame": {"x":1558,"y":725,"w":231,"h":151}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":15,"w":231,"h":151}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmRightBoxtie.png": +{ + "frame": {"x":1330,"y":1064,"w":59,"h":260}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":432,"w":59,"h":260}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/ShinyBalletLeftHogtie.png": +{ + "frame": {"x":1330,"y":1328,"w":59,"h":116}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":728,"y":785,"w":59,"h":116}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapLongMittenLeftYoked.png": +{ + "frame": {"x":1083,"y":993,"w":86,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":868,"y":284,"w":86,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BraMetal2.png": +{ + "frame": {"x":2007,"y":971,"w":37,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":556,"y":556,"w":37,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BraMetalRunic2.png": +{ + "frame": {"x":2007,"y":971,"w":37,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":556,"y":556,"w":37,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightKneel.png": +{ + "frame": {"x":490,"y":993,"w":156,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":834,"w":156,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightKneelClosed.png": +{ + "frame": {"x":490,"y":993,"w":156,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":834,"w":156,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceChestDeco.png": +{ + "frame": {"x":872,"y":993,"w":102,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":551,"w":102,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceDask/WhitesEyesDazed.png": +{ + "frame": {"x":1995,"y":2002,"w":50,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":54,"y":173,"w":50,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKjus/BrowsSad.png": +{ + "frame": {"x":1330,"y":1533,"w":50,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":524,"y":254,"w":50,"h":19}, + "sourceSize": {"w":806,"h":515} +}, +"Models/Festive/OrbHogtie.png": +{ + "frame": {"x":1326,"y":993,"w":63,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":256,"w":63,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarFrontClosed.png": +{ + "frame": {"x":3,"y":1064,"w":62,"h":745}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":872,"w":62,"h":745}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarFrontClosedHeels.png": +{ + "frame": {"x":69,"y":1064,"w":29,"h":741}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":577,"y":911,"w":29,"h":741}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarFrontSpread.png": +{ + "frame": {"x":3,"y":1064,"w":62,"h":745}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":570,"y":872,"w":62,"h":745}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagMetal/SciFiPanel.png": +{ + "frame": {"x":1173,"y":993,"w":76,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":97,"y":228,"w":76,"h":67}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair2/Hair5_FrontB.png": +{ + "frame": {"x":1558,"y":294,"w":231,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":116,"w":231,"h":216}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair6_Front.png": +{ + "frame": {"x":1793,"y":556,"w":252,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":485,"y":112,"w":252,"h":215}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hood/BunnyEars.png": +{ + "frame": {"x":329,"y":1806,"w":322,"h":239}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":17,"w":322,"h":239}, + "sourceSize": {"w":752,"h":479} +}, +"Models/KittyLatex/KittyLatexEarMuffLight1.png": +{ + "frame": {"x":1787,"y":1035,"w":258,"h":129}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":222,"w":258,"h":129}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyLatex/KittyLatexTail2.png": +{ + "frame": {"x":849,"y":1064,"w":310,"h":730}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":750,"w":310,"h":730}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/AnkleRightClosed.png": +{ + "frame": {"x":1984,"y":1556,"w":61,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":537,"y":1420,"w":61,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowLeftUp.png": +{ + "frame": {"x":650,"y":993,"w":107,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":723,"y":252,"w":107,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/WristRightYoked.png": +{ + "frame": {"x":1984,"y":1612,"w":61,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":394,"w":61,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowLeftUp.png": +{ + "frame": {"x":761,"y":993,"w":107,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":723,"y":252,"w":107,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/WristRightYoked.png": +{ + "frame": {"x":1984,"y":1663,"w":61,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":394,"w":61,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/Arms.png": +{ + "frame": {"x":1122,"y":3,"w":395,"h":287}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":397,"y":422,"w":395,"h":287}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/Collar.png": +{ + "frame": {"x":1787,"y":1263,"w":82,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":386,"w":82,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/CapeSpread.png": +{ + "frame": {"x":3,"y":3,"w":483,"h":1057}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":400,"y":409,"w":483,"h":1057}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/AnkleLeftKneel.png": +{ + "frame": {"x":1330,"y":1448,"w":59,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":705,"y":947,"w":59,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/LacesLegbinderClosed.png": +{ + "frame": {"x":1940,"y":1263,"w":100,"h":289}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":947,"w":100,"h":289}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SkirtKneel.png": +{ + "frame": {"x":1330,"y":1556,"w":453,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":350,"y":739,"w":453,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SockLeftHogtie.png": +{ + "frame": {"x":1393,"y":993,"w":161,"h":559}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":577,"y":952,"w":161,"h":559}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronBelt.png": +{ + "frame": {"x":1793,"y":971,"w":210,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":624,"w":210,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronBeltHogtie.png": +{ + "frame": {"x":1793,"y":971,"w":210,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":624,"w":210,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronBeltKneel.png": +{ + "frame": {"x":1793,"y":971,"w":210,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":624,"w":210,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootShoeLeftKneel.png": +{ + "frame": {"x":1558,"y":880,"w":231,"h":151}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":888,"w":231,"h":151}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletRightCrossed.png": +{ + "frame": {"x":1787,"y":1168,"w":258,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":590,"w":258,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PantyhoseSpread.png": +{ + "frame": {"x":1193,"y":1798,"w":324,"h":247}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":702,"w":324,"h":247}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/SockRightKneelClosed.png": +{ + "frame": {"x":1787,"y":1556,"w":193,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":317,"y":820,"w":193,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveRightFree.png": +{ + "frame": {"x":1558,"y":514,"w":231,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":267,"y":498,"w":231,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/GoldBaseKneel.png": +{ + "frame": {"x":1521,"y":1798,"w":317,"h":247}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":606,"w":317,"h":247}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/RibbonBackKneel.png": +{ + "frame": {"x":655,"y":1802,"w":534,"h":243}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":342,"y":623,"w":534,"h":243}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf2ClosedOver.png": +{ + "frame": {"x":1842,"y":2002,"w":149,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":531,"y":1333,"w":149,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/LeftFrogtieKneel.png": +{ + "frame": {"x":1842,"y":1798,"w":203,"h":200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":555,"y":822,"w":203,"h":200}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Suspension.png": +{ + "frame": {"x":102,"y":1064,"w":307,"h":738}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":0,"w":307,"h":738}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/Ribbon.png": +{ + "frame": {"x":1793,"y":775,"w":252,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":491,"y":418,"w":252,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/RibbonYoked.png": +{ + "frame": {"x":1793,"y":775,"w":252,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":491,"y":418,"w":252,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/LeftArm2Boxtie.png": +{ + "frame": {"x":1253,"y":993,"w":69,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":671,"y":639,"w":69,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Legs1Closed.png": +{ + "frame": {"x":3,"y":1813,"w":322,"h":232}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":834,"w":322,"h":232}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/bac/SuccubusClawRightYoked.png": +{ + "frame": {"x":978,"y":993,"w":101,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":298,"y":286,"w":101,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Tails/Kitty.png": +{ + "frame": {"x":1122,"y":294,"w":432,"h":695}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":746,"w":432,"h":695}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Tails/Kitty2.png": +{ + "frame": {"x":413,"y":1064,"w":432,"h":734}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":746,"w":432,"h":734}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallLeftKneelClosed.png": +{ + "frame": {"x":1521,"y":3,"w":522,"h":166}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":916,"w":522,"h":166}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/HeadgearUnit.png": +{ + "frame": {"x":1984,"y":1714,"w":44,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":726,"y":225,"w":44,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SockLeftSpread.png": +{ + "frame": {"x":1163,"y":1064,"w":163,"h":730}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":603,"y":897,"w":163,"h":730}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/Skirt.png": +{ + "frame": {"x":1558,"y":1295,"w":378,"h":257}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":403,"y":686,"w":378,"h":257}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseLeftYoked.png": +{ + "frame": {"x":1793,"y":173,"w":252,"h":379}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":405,"w":252,"h":379}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveLeftFront.png": +{ + "frame": {"x":1558,"y":1035,"w":225,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":548,"y":465,"w":225,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolfgirl/HairclipLower.png": +{ + "frame": {"x":1873,"y":1263,"w":63,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":171,"y":168,"w":63,"h":28}, + "sourceSize": {"w":347,"h":439} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas19.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas19.webp b/TextureAtlas/atlas19.webp new file mode 100644 index 000000000..e534b14ff Binary files /dev/null and b/TextureAtlas/atlas19.webp differ diff --git a/TextureAtlas/atlas2.json b/TextureAtlas/atlas2.json new file mode 100644 index 000000000..380789af1 --- /dev/null +++ b/TextureAtlas/atlas2.json @@ -0,0 +1,261 @@ +{"frames": { + +"Models/ArmorPlate/BootLeftHogtie.png": +{ + "frame": {"x":1971,"y":1499,"w":52,"h":166}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":972,"w":52,"h":166}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveLeftWristtie.png": +{ + "frame": {"x":1971,"y":856,"w":74,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":549,"w":74,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayWristRightYoked.png": +{ + "frame": {"x":2027,"y":1499,"w":18,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":307,"y":403,"w":18,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowLeftFront.png": +{ + "frame": {"x":2027,"y":1546,"w":18,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":757,"y":610,"w":18,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenLeftFree.png": +{ + "frame": {"x":1840,"y":1669,"w":205,"h":350}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":512,"w":205,"h":350}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftSpread.png": +{ + "frame": {"x":1971,"y":1250,"w":74,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":1417,"w":74,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightSpread.png": +{ + "frame": {"x":1971,"y":1307,"w":74,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":1417,"w":74,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/RidgeAngry.png": +{ + "frame": {"x":2027,"y":1652,"w":17,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":584,"y":267,"w":17,"h":13}, + "sourceSize": {"w":703,"h":355} +}, +"Models/Festive/BinderStrapLeftBoxtie.png": +{ + "frame": {"x":1971,"y":1414,"w":74,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":693,"y":578,"w":74,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/CageFront.png": +{ + "frame": {"x":3,"y":3,"w":916,"h":1670}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":166,"y":25,"w":916,"h":1670}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Straight_Overstrap.png": +{ + "frame": {"x":803,"y":1677,"w":226,"h":366}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":154,"w":226,"h":366}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/HardwareTop.png": +{ + "frame": {"x":1971,"y":1121,"w":74,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":555,"y":462,"w":74,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Kigu/Eyes2.png": +{ + "frame": {"x":1971,"y":1052,"w":74,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":611,"y":240,"w":74,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowRightFront.png": +{ + "frame": {"x":2027,"y":1585,"w":18,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":432,"y":609,"w":18,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/TailStripe.png": +{ + "frame": {"x":2027,"y":1620,"w":18,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":811,"y":946,"w":18,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandAnkleRightSpread.png": +{ + "frame": {"x":1971,"y":1458,"w":74,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":1434,"w":74,"h":17}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/LeotardCorset.png": +{ + "frame": {"x":1552,"y":1669,"w":284,"h":376}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":581,"w":284,"h":376}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenLeftWristtie.png": +{ + "frame": {"x":1971,"y":856,"w":74,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":549,"w":74,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Nipples/Rings.png": +{ + "frame": {"x":1840,"y":2023,"w":205,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":562,"w":205,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/LegsHogtie.png": +{ + "frame": {"x":1245,"y":1672,"w":303,"h":371}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":837,"w":303,"h":371}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/RibbonBack.png": +{ + "frame": {"x":265,"y":1677,"w":534,"h":367}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":342,"y":623,"w":534,"h":367}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/WristRightFront.png": +{ + "frame": {"x":1971,"y":1189,"w":74,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":539,"w":74,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/WristRightYoked.png": +{ + "frame": {"x":1971,"y":1364,"w":74,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":303,"y":391,"w":74,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Tails/Fox5.png": +{ + "frame": {"x":923,"y":3,"w":1111,"h":849}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":77,"y":622,"w":1111,"h":849}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallLeftSpread.png": +{ + "frame": {"x":923,"y":856,"w":173,"h":817}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":603,"y":895,"w":173,"h":817}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallRightSpread.png": +{ + "frame": {"x":1100,"y":856,"w":158,"h":812}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":899,"w":158,"h":812}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/BottomClosed.png": +{ + "frame": {"x":3,"y":1677,"w":258,"h":368}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":976,"w":258,"h":368}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/BottomHogtie.png": +{ + "frame": {"x":3,"y":1677,"w":258,"h":368}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":976,"w":258,"h":368}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Weapon/NightWhipFree.png": +{ + "frame": {"x":1262,"y":856,"w":705,"h":809}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":270,"y":465,"w":705,"h":809}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseLeftBoxtie.png": +{ + "frame": {"x":1033,"y":1677,"w":208,"h":366}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":418,"w":208,"h":366}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/FCollarBand.png": +{ + "frame": {"x":1971,"y":1479,"w":74,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":399,"w":74,"h":16}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas2.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas2.webp b/TextureAtlas/atlas2.webp new file mode 100644 index 000000000..c01c56208 Binary files /dev/null and b/TextureAtlas/atlas2.webp differ diff --git a/TextureAtlas/atlas20.json b/TextureAtlas/atlas20.json new file mode 100644 index 000000000..b5bff7cd3 --- /dev/null +++ b/TextureAtlas/atlas20.json @@ -0,0 +1,381 @@ +{"frames": { + +"Models/Body/ArmLeftFree.png": +{ + "frame": {"x":334,"y":728,"w":641,"h":715}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":641,"h":715}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/CuffsArms.png": +{ + "frame": {"x":1556,"y":1888,"w":348,"h":157}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":419,"y":1131,"w":348,"h":157}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/SockLeftClosed.png": +{ + "frame": {"x":1176,"y":720,"w":206,"h":700}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":918,"w":206,"h":700}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/SteelCollar.png": +{ + "frame": {"x":1367,"y":683,"w":97,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":577,"y":392,"w":97,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/SteelCollar.png": +{ + "frame": {"x":1367,"y":683,"w":97,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":577,"y":392,"w":97,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenThighLeftClosed.png": +{ + "frame": {"x":1986,"y":610,"w":59,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":641,"y":1032,"w":59,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/SteelCollar.png": +{ + "frame": {"x":1367,"y":683,"w":97,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":577,"y":392,"w":97,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/ShoeLeftHogtie.png": +{ + "frame": {"x":866,"y":3,"w":193,"h":713}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":796,"w":193,"h":713}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/Brows2Surprised.png": +{ + "frame": {"x":1258,"y":1424,"w":61,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":610,"y":234,"w":61,"h":19}, + "sourceSize": {"w":813,"h":502} +}, +"Models/FutureHarness/DisplayMid.png": +{ + "frame": {"x":1323,"y":1424,"w":47,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":731,"w":47,"h":19}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/HemLower.png": +{ + "frame": {"x":1386,"y":1191,"w":657,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":270,"y":1069,"w":657,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/HemLowerCrotchStrap.png": +{ + "frame": {"x":1386,"y":892,"w":657,"h":295}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":270,"y":860,"w":657,"h":295}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/LinesCrotchStrap.png": +{ + "frame": {"x":1386,"y":3,"w":657,"h":484}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":270,"y":671,"w":657,"h":484}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/BigBraidBack.png": +{ + "frame": {"x":498,"y":3,"w":364,"h":714}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":471,"y":133,"w":364,"h":714}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Ponytail.png": +{ + "frame": {"x":627,"y":1447,"w":164,"h":596}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":601,"y":93,"w":164,"h":596}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherLeftClosed.png": +{ + "frame": {"x":3,"y":3,"w":172,"h":724}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":520,"y":950,"w":172,"h":724}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherRightClosed.png": +{ + "frame": {"x":179,"y":3,"w":151,"h":724}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":950,"w":151,"h":724}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowLeftBoxtie.png": +{ + "frame": {"x":1176,"y":1424,"w":78,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":593,"w":78,"h":19}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandThighLeftClosed.png": +{ + "frame": {"x":1234,"y":2022,"w":141,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":1047,"w":141,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/ForeGloveRightCrossed.png": +{ + "frame": {"x":1468,"y":802,"w":270,"h":86}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":598,"w":270,"h":86}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockLeftSpread.png": +{ + "frame": {"x":479,"y":1447,"w":144,"h":597}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":626,"y":1037,"w":144,"h":597}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockLeftSpread.png": +{ + "frame": {"x":1386,"y":491,"w":111,"h":188}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":641,"y":1446,"w":111,"h":188}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockLeftSpread.png": +{ + "frame": {"x":941,"y":1447,"w":289,"h":592}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":1044,"w":289,"h":592}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockRightSpread.png": +{ + "frame": {"x":795,"y":1447,"w":142,"h":593}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":1044,"w":142,"h":593}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/ShouldersSpread.png": +{ + "frame": {"x":1556,"y":1356,"w":489,"h":262}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":415,"y":392,"w":489,"h":262}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/ShouldersUp.png": +{ + "frame": {"x":1556,"y":1622,"w":489,"h":262}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":415,"y":392,"w":489,"h":262}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/GlowLegsHogtie.png": +{ + "frame": {"x":3,"y":1459,"w":472,"h":586}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":376,"y":689,"w":472,"h":586}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/FootSockLeftHogtie.png": +{ + "frame": {"x":979,"y":720,"w":193,"h":713}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":796,"w":193,"h":713}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/ShoeLeftHogtie.png": +{ + "frame": {"x":1063,"y":3,"w":193,"h":713}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":796,"w":193,"h":713}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SockRightSpread.png": +{ + "frame": {"x":1386,"y":1356,"w":166,"h":689}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":948,"w":166,"h":689}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressSkirtHem.png": +{ + "frame": {"x":1468,"y":683,"w":577,"h":115}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":321,"y":910,"w":577,"h":115}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/BootLeftSpread.png": +{ + "frame": {"x":1260,"y":3,"w":122,"h":467}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":646,"y":1211,"w":122,"h":467}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/ZipperLeftFree.png": +{ + "frame": {"x":1986,"y":491,"w":59,"h":115}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":796,"y":669,"w":59,"h":115}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh2KneelClosed.png": +{ + "frame": {"x":1234,"y":1892,"w":148,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":875,"w":148,"h":126}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/HemLeft.png": +{ + "frame": {"x":1260,"y":683,"w":103,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":537,"w":103,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/HemLeftUp.png": +{ + "frame": {"x":1977,"y":802,"w":68,"h":86}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":350,"w":68,"h":86}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/RightLegs1Kneel.png": +{ + "frame": {"x":1908,"y":1888,"w":137,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":363,"y":785,"w":137,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/LegRightClosed.png": +{ + "frame": {"x":1234,"y":1447,"w":148,"h":441}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":802,"w":148,"h":441}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/LeftClosed.png": +{ + "frame": {"x":3,"y":731,"w":172,"h":724}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":520,"y":950,"w":172,"h":724}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/RightClosed.png": +{ + "frame": {"x":179,"y":731,"w":151,"h":724}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":950,"w":151,"h":724}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLeftKneel.png": +{ + "frame": {"x":1501,"y":491,"w":481,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":901,"w":481,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/AnklesKneelClosed.png": +{ + "frame": {"x":1742,"y":802,"w":231,"h":86}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":980,"w":231,"h":86}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/Searchlight.png": +{ + "frame": {"x":1386,"y":720,"w":78,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":645,"y":418,"w":78,"h":168}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SockRightSpread.png": +{ + "frame": {"x":334,"y":3,"w":160,"h":721}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":907,"w":160,"h":721}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/ShoulderRightUp.png": +{ + "frame": {"x":1260,"y":474,"w":122,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":298,"w":122,"h":205}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yoke/HeavySteel.png": +{ + "frame": {"x":1386,"y":1296,"w":655,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":299,"y":379,"w":655,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas20.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas20.webp b/TextureAtlas/atlas20.webp new file mode 100644 index 000000000..1b7176048 Binary files /dev/null and b/TextureAtlas/atlas20.webp differ diff --git a/TextureAtlas/atlas21.json b/TextureAtlas/atlas21.json new file mode 100644 index 000000000..f32ae3eda --- /dev/null +++ b/TextureAtlas/atlas21.json @@ -0,0 +1,477 @@ +{"frames": { + +"Models/Armbinder/BinderLeftWristtie.png": +{ + "frame": {"x":638,"y":552,"w":86,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":531,"w":86,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/ShirtHogtie.png": +{ + "frame": {"x":1331,"y":834,"w":278,"h":401}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":417,"w":278,"h":401}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShortsLeftSpread.png": +{ + "frame": {"x":1174,"y":1239,"w":167,"h":196}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":595,"y":750,"w":167,"h":196}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/WristRightFree.png": +{ + "frame": {"x":825,"y":1600,"w":33,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":355,"y":606,"w":33,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmLeftYoked.png": +{ + "frame": {"x":3,"y":3,"w":721,"h":545}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":721,"h":545}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/HandRightFree.png": +{ + "frame": {"x":347,"y":1471,"w":164,"h":573}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":164,"h":573}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ShoulderRightUp.png": +{ + "frame": {"x":1939,"y":719,"w":106,"h":105}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":401,"w":106,"h":105}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/InvertedRose.png": +{ + "frame": {"x":1400,"y":719,"w":266,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":514,"w":266,"h":111}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/Rose.png": +{ + "frame": {"x":1670,"y":719,"w":265,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":514,"w":265,"h":111}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/LeotardChest.png": +{ + "frame": {"x":1345,"y":1558,"w":264,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":518,"w":264,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmLeftWristtie.png": +{ + "frame": {"x":1493,"y":1670,"w":116,"h":353}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":407,"w":116,"h":353}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/HandRightFree.png": +{ + "frame": {"x":515,"y":1471,"w":165,"h":572}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":165,"h":572}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowRightFront.png": +{ + "frame": {"x":825,"y":1471,"w":33,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":586,"w":33,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenWristRightFree.png": +{ + "frame": {"x":753,"y":1439,"w":51,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":363,"y":599,"w":51,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseSkirt.png": +{ + "frame": {"x":1613,"y":1534,"w":432,"h":307}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":397,"y":638,"w":432,"h":307}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/ShoeRightSpread.png": +{ + "frame": {"x":1927,"y":1845,"w":118,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":490,"y":1498,"w":118,"h":144}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/Kitty.png": +{ + "frame": {"x":728,"y":1239,"w":264,"h":196}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":45,"w":264,"h":196}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/BrowsAngry.png": +{ + "frame": {"x":808,"y":1439,"w":50,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":252,"w":50,"h":28}, + "sourceSize": {"w":693,"h":407} +}, +"Models/FaceFang/MouthEmbarrassed.png": +{ + "frame": {"x":825,"y":1793,"w":33,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":316,"w":33,"h":35}, + "sourceSize": {"w":754,"h":461} +}, +"Models/FaceFang/MouthFrown.png": +{ + "frame": {"x":825,"y":1832,"w":33,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":589,"y":316,"w":33,"h":35}, + "sourceSize": {"w":754,"h":461} +}, +"Models/FaceFang/MouthNeutral.png": +{ + "frame": {"x":1447,"y":1670,"w":39,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":316,"w":39,"h":31}, + "sourceSize": {"w":763,"h":461} +}, +"Models/FaceFang2/MouthEmbarrassed.png": +{ + "frame": {"x":825,"y":1710,"w":33,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":316,"w":33,"h":38}, + "sourceSize": {"w":754,"h":461} +}, +"Models/FaceFang2/MouthFrown.png": +{ + "frame": {"x":825,"y":1752,"w":33,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":589,"y":316,"w":33,"h":37}, + "sourceSize": {"w":754,"h":461} +}, +"Models/FaceKjus/MouthFrown.png": +{ + "frame": {"x":825,"y":1871,"w":33,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":322,"w":33,"h":35}, + "sourceSize": {"w":754,"h":461} +}, +"Models/Furniture/BedStrapsHogtie.png": +{ + "frame": {"x":728,"y":621,"w":599,"h":614}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":172,"y":468,"w":599,"h":614}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/BedStrapsHogtieBoxtie.png": +{ + "frame": {"x":728,"y":3,"w":668,"h":614}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":172,"y":468,"w":668,"h":614}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagFrilly/FrillyHighlights.png": +{ + "frame": {"x":1189,"y":1439,"w":152,"h":262}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":71,"y":19,"w":152,"h":262}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/Plug.png": +{ + "frame": {"x":825,"y":1910,"w":33,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":116,"y":239,"w":33,"h":35}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Gothic/HemLowerKneel.png": +{ + "frame": {"x":3,"y":1044,"w":599,"h":183}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":296,"y":905,"w":599,"h":183}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/HemLowerKneelCrotchStrap.png": +{ + "frame": {"x":3,"y":1231,"w":598,"h":236}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":297,"y":825,"w":598,"h":236}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/LaceLower.png": +{ + "frame": {"x":3,"y":552,"w":631,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":283,"y":1029,"w":631,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/LaceLowerCrotchStrap.png": +{ + "frame": {"x":1400,"y":469,"w":642,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":277,"y":861,"w":642,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/LinesKneelCrotchStrap..png": +{ + "frame": {"x":3,"y":648,"w":602,"h":392}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":295,"y":669,"w":602,"h":392}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/Skirt.png": +{ + "frame": {"x":1400,"y":3,"w":642,"h":462}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":277,"y":671,"w":642,"h":462}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/LegironsRightClosed.png": +{ + "frame": {"x":605,"y":1439,"w":70,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":538,"y":1432,"w":70,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/LegironsRightSpread.png": +{ + "frame": {"x":679,"y":1439,"w":70,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":1432,"w":70,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/BeltsArmsBoxtie.png": +{ + "frame": {"x":1613,"y":1845,"w":310,"h":200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":518,"w":310,"h":200}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyLatex/KittyLatexTail.png": +{ + "frame": {"x":1613,"y":834,"w":432,"h":696}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":746,"w":432,"h":696}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/ShoulderCuffLeft.png": +{ + "frame": {"x":609,"y":648,"w":25,"h":86}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":691,"y":430,"w":25,"h":86}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowRightUp.png": +{ + "frame": {"x":1345,"y":1670,"w":98,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":269,"w":98,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandWristRightFree.png": +{ + "frame": {"x":825,"y":1985,"w":27,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":373,"y":608,"w":27,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Leash/LeashCrossed.png": +{ + "frame": {"x":606,"y":1096,"w":118,"h":339}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":436,"w":118,"h":339}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Leash/LeashKneel.png": +{ + "frame": {"x":684,"y":1471,"w":137,"h":571}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":577,"y":436,"w":137,"h":571}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BellCollar.png": +{ + "frame": {"x":825,"y":1659,"w":33,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":589,"y":400,"w":33,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BowCollar.png": +{ + "frame": {"x":1927,"y":1993,"w":117,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":548,"y":398,"w":117,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftStripeFree.png": +{ + "frame": {"x":1493,"y":2027,"w":100,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":695,"y":612,"w":100,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ApronKneel.png": +{ + "frame": {"x":1189,"y":1705,"w":300,"h":340}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":417,"y":549,"w":300,"h":340}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardRightBoxtie.png": +{ + "frame": {"x":609,"y":738,"w":25,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":603,"w":25,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/BandRightFree.png": +{ + "frame": {"x":825,"y":1537,"w":33,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":361,"y":606,"w":33,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SockLeftHogtie.png": +{ + "frame": {"x":1331,"y":621,"w":65,"h":209}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":669,"y":962,"w":65,"h":209}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightFront.png": +{ + "frame": {"x":609,"y":810,"w":115,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":420,"y":488,"w":115,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightFrontTight.png": +{ + "frame": {"x":609,"y":810,"w":115,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":420,"y":488,"w":115,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/HarnessLowerKneel.png": +{ + "frame": {"x":1345,"y":1239,"w":264,"h":315}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":526,"w":264,"h":315}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/BraSegu.png": +{ + "frame": {"x":825,"y":1949,"w":33,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":555,"y":554,"w":33,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/Collar.png": +{ + "frame": {"x":638,"y":769,"w":84,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":395,"w":84,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/LegsClosed.png": +{ + "frame": {"x":862,"y":1439,"w":323,"h":602}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":652,"w":323,"h":602}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveRightYoked.png": +{ + "frame": {"x":996,"y":1239,"w":174,"h":196}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":365,"y":424,"w":174,"h":196}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoLowerKneel.png": +{ + "frame": {"x":3,"y":1471,"w":340,"h":574}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":435,"y":390,"w":340,"h":574}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas21.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas21.webp b/TextureAtlas/atlas21.webp new file mode 100644 index 000000000..485d47985 Binary files /dev/null and b/TextureAtlas/atlas21.webp differ diff --git a/TextureAtlas/atlas22.json b/TextureAtlas/atlas22.json new file mode 100644 index 000000000..318b11c2a --- /dev/null +++ b/TextureAtlas/atlas22.json @@ -0,0 +1,461 @@ +{"frames": { + +"Models/Body/ForeArmLeftCrossed.png": +{ + "frame": {"x":1261,"y":760,"w":528,"h":637}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":528,"h":637}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ForeArmLeftFront.png": +{ + "frame": {"x":419,"y":1402,"w":529,"h":639}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":529,"h":639}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/LegLeftClosed.png": +{ + "frame": {"x":3,"y":3,"w":208,"h":699}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":919,"w":208,"h":699}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/ForeGloveLeftFront.png": +{ + "frame": {"x":952,"y":1401,"w":529,"h":639}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":529,"h":639}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/LegSockRightClosed.png": +{ + "frame": {"x":1014,"y":1383,"w":146,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":907,"w":146,"h":14}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/LegSockRightSpread.png": +{ + "frame": {"x":863,"y":1383,"w":147,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":907,"w":147,"h":14}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/SockRightClosed.png": +{ + "frame": {"x":3,"y":706,"w":167,"h":693}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":919,"w":167,"h":693}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockWristRightCrossed.png": +{ + "frame": {"x":1226,"y":1383,"w":30,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":661,"y":592,"w":30,"h":14}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockWristRightFree.png": +{ + "frame": {"x":829,"y":1383,"w":30,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":373,"y":602,"w":30,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceKjus/BrowsSurprised.png": +{ + "frame": {"x":1014,"y":1146,"w":46,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":524,"y":259,"w":46,"h":14}, + "sourceSize": {"w":738,"h":409} +}, +"Models/Furniture/OneBarBackClosed.png": +{ + "frame": {"x":849,"y":593,"w":347,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":418,"y":1576,"w":347,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarBackClosedHeels.png": +{ + "frame": {"x":849,"y":593,"w":347,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":418,"y":1611,"w":347,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarBackSpread.png": +{ + "frame": {"x":849,"y":593,"w":347,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":1576,"w":347,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarBackSpreadHeels.png": +{ + "frame": {"x":849,"y":593,"w":347,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":1611,"w":347,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureHarness/LockMid.png": +{ + "frame": {"x":786,"y":1383,"w":39,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":543,"y":733,"w":39,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/FrontLongBang.png": +{ + "frame": {"x":887,"y":694,"w":123,"h":467}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":129,"w":123,"h":467}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Hairband.png": +{ + "frame": {"x":1261,"y":567,"w":220,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":124,"w":220,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Messy.png": +{ + "frame": {"x":3,"y":1403,"w":412,"h":642}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":113,"w":412,"h":642}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair4_Front.png": +{ + "frame": {"x":1014,"y":694,"w":243,"h":236}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":114,"w":243,"h":236}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/BeltsChestCrossed.png": +{ + "frame": {"x":1485,"y":1401,"w":304,"h":410}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":383,"w":304,"h":410}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Kigu/Lock.png": +{ + "frame": {"x":1485,"y":1815,"w":255,"h":230}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":604,"y":199,"w":255,"h":230}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/BlindfoldStich.png": +{ + "frame": {"x":1846,"y":669,"w":199,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":514,"y":249,"w":199,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandAnkleLeftSpread.png": +{ + "frame": {"x":1064,"y":1146,"w":69,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":685,"y":1439,"w":69,"h":13}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandAnkleRightClosed.png": +{ + "frame": {"x":1164,"y":1383,"w":58,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":538,"y":1440,"w":58,"h":14}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Leash/Leash.png": +{ + "frame": {"x":1793,"y":1372,"w":83,"h":671}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":556,"y":436,"w":83,"h":671}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Leash/LeashPulled.png": +{ + "frame": {"x":1485,"y":160,"w":560,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":49,"y":435,"w":560,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SkirtOverKneelCrotchStrap.png": +{ + "frame": {"x":1793,"y":944,"w":252,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":540,"y":785,"w":252,"h":144}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SockLeftSpread.png": +{ + "frame": {"x":536,"y":699,"w":169,"h":691}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":603,"y":945,"w":169,"h":691}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SockRightClosed.png": +{ + "frame": {"x":390,"y":3,"w":149,"h":692}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":931,"w":149,"h":692}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressSkirt.png": +{ + "frame": {"x":1485,"y":265,"w":558,"h":324}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":326,"y":679,"w":558,"h":324}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PantyhoseKneel.png": +{ + "frame": {"x":1055,"y":333,"w":426,"h":230}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":403,"y":712,"w":426,"h":230}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PantyhoseKneelClosed.png": +{ + "frame": {"x":1055,"y":333,"w":426,"h":230}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":403,"y":712,"w":426,"h":230}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressSkirt.png": +{ + "frame": {"x":1055,"y":3,"w":426,"h":326}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":392,"y":661,"w":426,"h":326}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ThighRightHogtie.png": +{ + "frame": {"x":849,"y":3,"w":202,"h":586}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":980,"w":202,"h":586}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Nipples/VibePiercingsBullet.png": +{ + "frame": {"x":1055,"y":567,"w":202,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":576,"w":202,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/ForeGloveLeftCrossed.png": +{ + "frame": {"x":1846,"y":593,"w":199,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":546,"y":628,"w":199,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveRightBoxtie.png": +{ + "frame": {"x":887,"y":1165,"w":265,"h":214}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":500,"w":265,"h":214}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/PantiesHigh/Base.png": +{ + "frame": {"x":1014,"y":934,"w":243,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":467,"y":711,"w":243,"h":208}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SkirtOverKneel.png": +{ + "frame": {"x":1485,"y":593,"w":357,"h":163}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":801,"w":357,"h":163}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/ArmStrapCrossed.png": +{ + "frame": {"x":1200,"y":593,"w":57,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":602,"w":57,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/CuffsCrossed.png": +{ + "frame": {"x":1200,"y":593,"w":57,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":602,"w":57,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/LegLeftHogtie.png": +{ + "frame": {"x":1880,"y":1372,"w":165,"h":451}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":755,"w":165,"h":451}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/CollarTied.png": +{ + "frame": {"x":1793,"y":1233,"w":252,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":395,"w":252,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/RibbonTied.png": +{ + "frame": {"x":1793,"y":760,"w":252,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":430,"w":252,"h":180}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderRightUp.png": +{ + "frame": {"x":1744,"y":1815,"w":45,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":536,"y":291,"w":45,"h":126}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmFullRightBoxtie.png": +{ + "frame": {"x":1156,"y":1146,"w":97,"h":233}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":424,"w":97,"h":233}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/LegsHogtie.png": +{ + "frame": {"x":543,"y":3,"w":302,"h":687}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":657,"w":302,"h":687}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/RightLegsHogtie.png": +{ + "frame": {"x":174,"y":706,"w":358,"h":692}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":652,"w":358,"h":692}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/TopWristtie.png": +{ + "frame": {"x":1744,"y":1945,"w":38,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":660,"w":38,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/AnklesKneelClosed.png": +{ + "frame": {"x":1793,"y":1092,"w":252,"h":137}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":936,"w":252,"h":137}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmFullRightBoxtie.png": +{ + "frame": {"x":1156,"y":1146,"w":97,"h":233}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":424,"w":97,"h":233}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtRuffle.png": +{ + "frame": {"x":1485,"y":3,"w":560,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":1234,"w":560,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ChestBand.png": +{ + "frame": {"x":709,"y":1383,"w":73,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":400,"w":73,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveRightUp.png": +{ + "frame": {"x":1880,"y":1827,"w":146,"h":218}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":164,"w":146,"h":218}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegLeftClosed.png": +{ + "frame": {"x":215,"y":3,"w":171,"h":692}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":792,"w":171,"h":692}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegLeftSpread.png": +{ + "frame": {"x":709,"y":694,"w":174,"h":685}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":597,"y":792,"w":174,"h":685}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas22.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas22.webp b/TextureAtlas/atlas22.webp new file mode 100644 index 000000000..0ff24a4b5 Binary files /dev/null and b/TextureAtlas/atlas22.webp differ diff --git a/TextureAtlas/atlas23.json b/TextureAtlas/atlas23.json new file mode 100644 index 000000000..28aff3b3d --- /dev/null +++ b/TextureAtlas/atlas23.json @@ -0,0 +1,573 @@ +{"frames": { + +"Models/ArmorChain/ShirtChestHogtie.png": +{ + "frame": {"x":1593,"y":712,"w":278,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":417,"w":278,"h":208}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmRightFree.png": +{ + "frame": {"x":1194,"y":670,"w":308,"h":624}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":308,"h":624}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/ForeGloveLeftCrossed.png": +{ + "frame": {"x":847,"y":3,"w":528,"h":637}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":528,"h":637}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveLeftFree.png": +{ + "frame": {"x":1826,"y":1487,"w":219,"h":352}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":512,"w":219,"h":352}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cape/CapeHogtie.png": +{ + "frame": {"x":3,"y":1368,"w":263,"h":674}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":336,"y":415,"w":263,"h":674}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowLeftFront.png": +{ + "frame": {"x":1372,"y":1298,"w":58,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":602,"w":58,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayWristRightCrossed.png": +{ + "frame": {"x":1867,"y":365,"w":40,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":655,"y":591,"w":40,"h":16}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/LegsBeltsKneel.png": +{ + "frame": {"x":432,"y":3,"w":411,"h":663}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":308,"y":412,"w":411,"h":663}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/LegsBeltsKneelClosed.png": +{ + "frame": {"x":432,"y":3,"w":411,"h":663}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":308,"y":412,"w":411,"h":663}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockFront.png": +{ + "frame": {"x":2017,"y":323,"w":28,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":751,"y":601,"w":28,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/CrystalShoeRightClosed.png": +{ + "frame": {"x":1476,"y":1986,"w":25,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":1497,"w":25,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai2/BrowsNeutral.png": +{ + "frame": {"x":1280,"y":644,"w":41,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":245,"w":41,"h":22}, + "sourceSize": {"w":744,"h":461} +}, +"Models/EyesK2/Eyes2Angry.png": +{ + "frame": {"x":713,"y":1313,"w":70,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/Eyes2Dazed.png": +{ + "frame": {"x":787,"y":1313,"w":70,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/Eyes2Neutral.png": +{ + "frame": {"x":861,"y":1313,"w":70,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyes2Angry.png": +{ + "frame": {"x":935,"y":1313,"w":70,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyes2Dazed.png": +{ + "frame": {"x":1009,"y":1313,"w":70,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} +}, +"Models/FaceFang2/MouthDazed.png": +{ + "frame": {"x":1820,"y":365,"w":43,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":338,"w":43,"h":16}, + "sourceSize": {"w":706,"h":455} +}, +"Models/FaceKjus/Brows2Annoyed.png": +{ + "frame": {"x":1954,"y":365,"w":38,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":609,"y":261,"w":38,"h":16}, + "sourceSize": {"w":717,"h":405} +}, +"Models/FaceKoi/BlushMedium.png": +{ + "frame": {"x":1314,"y":1986,"w":158,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":56,"y":187,"w":158,"h":59}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/Brows2Annoyed.png": +{ + "frame": {"x":1716,"y":365,"w":48,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":142,"y":133,"w":48,"h":16}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/Brows2Sad.png": +{ + "frame": {"x":1768,"y":365,"w":48,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":140,"y":130,"w":48,"h":16}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagCloth/Cleave.png": +{ + "frame": {"x":688,"y":1999,"w":157,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":238,"w":157,"h":46}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/HarnessDisplay.png": +{ + "frame": {"x":1593,"y":365,"w":119,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":79,"y":247,"w":119,"h":16}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/Braid.png": +{ + "frame": {"x":1506,"y":1487,"w":316,"h":558}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":104,"w":316,"h":558}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair5_FrontC.png": +{ + "frame": {"x":1325,"y":644,"w":24,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":536,"y":173,"w":24,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/BeltsMid.png": +{ + "frame": {"x":270,"y":1999,"w":205,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":654,"w":205,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherLeftKneel.png": +{ + "frame": {"x":1506,"y":1206,"w":536,"h":277}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":384,"y":811,"w":536,"h":277}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowLeftFree.png": +{ + "frame": {"x":1141,"y":644,"w":82,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":599,"w":82,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/WristLeftFree.png": +{ + "frame": {"x":1309,"y":1298,"w":59,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":798,"y":747,"w":59,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/CapeHogtie.png": +{ + "frame": {"x":165,"y":3,"w":263,"h":674}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":336,"y":415,"w":263,"h":674}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareWristRightCrossed.png": +{ + "frame": {"x":1911,"y":365,"w":39,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":639,"y":598,"w":39,"h":16}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/ShoeLeftSpread.png": +{ + "frame": {"x":1379,"y":3,"w":123,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":633,"y":1455,"w":123,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeSockLeftClosed.png": +{ + "frame": {"x":847,"y":644,"w":143,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":584,"y":978,"w":143,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeSockLeftHogtie.png": +{ + "frame": {"x":994,"y":644,"w":143,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":584,"y":978,"w":143,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/Apron.png": +{ + "frame": {"x":1379,"y":365,"w":210,"h":301}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":651,"w":210,"h":301}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronHogtie.png": +{ + "frame": {"x":1227,"y":1356,"w":275,"h":280}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":360,"y":651,"w":275,"h":280}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressSkirtKneel.png": +{ + "frame": {"x":1506,"y":3,"w":539,"h":316}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":328,"y":679,"w":539,"h":316}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronLeftWristtie.png": +{ + "frame": {"x":1379,"y":199,"w":123,"h":162}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":391,"w":123,"h":162}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/SockLeftClosed.png": +{ + "frame": {"x":803,"y":1356,"w":263,"h":638}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":986,"w":263,"h":638}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/SockLeftSpread.png": +{ + "frame": {"x":1070,"y":1356,"w":153,"h":638}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":995,"w":153,"h":638}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/SockRightClosed.png": +{ + "frame": {"x":1045,"y":670,"w":145,"h":637}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":986,"w":145,"h":637}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/ForeLongMittenLeftCrossed.png": +{ + "frame": {"x":847,"y":3,"w":528,"h":637}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":528,"h":637}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/ForeLongMittenLeftFront.png": +{ + "frame": {"x":270,"y":1356,"w":529,"h":639}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":529,"h":639}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Nipples/Clamps.png": +{ + "frame": {"x":1101,"y":1998,"w":209,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":568,"w":209,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Thigh2Closed.png": +{ + "frame": {"x":1227,"y":1895,"w":275,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":974,"w":275,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/Cape.png": +{ + "frame": {"x":165,"y":681,"w":422,"h":671}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":409,"y":415,"w":422,"h":671}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Belt.png": +{ + "frame": {"x":479,"y":1999,"w":205,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":660,"w":205,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh2ClosedOver.png": +{ + "frame": {"x":849,"y":1998,"w":248,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":1010,"w":248,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/ToeClosed.png": +{ + "frame": {"x":1227,"y":644,"w":49,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":526,"y":1570,"w":49,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RopeOld/ChestUpper.png": +{ + "frame": {"x":1083,"y":1311,"w":222,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":479,"w":222,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/FaceFull.png": +{ + "frame": {"x":1826,"y":1843,"w":219,"h":200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":194,"w":219,"h":200}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnderClosedCrotchStrap.png": +{ + "frame": {"x":1227,"y":1640,"w":275,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":768,"w":275,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnderCrotchStrap.png": +{ + "frame": {"x":1227,"y":1640,"w":275,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":768,"w":275,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnderHogtieCrotchStrap.png": +{ + "frame": {"x":1227,"y":1640,"w":275,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":768,"w":275,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/PostureCollarHardware.png": +{ + "frame": {"x":1353,"y":644,"w":22,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":596,"y":411,"w":22,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/LeftKneelClosed.png": +{ + "frame": {"x":1506,"y":924,"w":536,"h":278}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":384,"y":811,"w":536,"h":278}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/bac/SuccubusClawRightFront.png": +{ + "frame": {"x":591,"y":1313,"w":118,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":511,"y":479,"w":118,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Tails/Fox.png": +{ + "frame": {"x":591,"y":670,"w":450,"h":639}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":507,"y":779,"w":450,"h":639}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/RightLegsKneelClosed.png": +{ + "frame": {"x":1593,"y":385,"w":451,"h":323}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":328,"y":652,"w":451,"h":323}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmLeftFree.png": +{ + "frame": {"x":1875,"y":712,"w":170,"h":200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":617,"w":170,"h":200}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveLeftCrossed.png": +{ + "frame": {"x":1506,"y":670,"w":83,"h":250}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":689,"y":440,"w":83,"h":250}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Vibe/Band.png": +{ + "frame": {"x":270,"y":1999,"w":205,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":654,"w":205,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Vibe/Remote.png": +{ + "frame": {"x":270,"y":1999,"w":205,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":654,"w":205,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Vibe/Wire.png": +{ + "frame": {"x":270,"y":1999,"w":205,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":654,"w":205,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/RimGloveLeftFree.png": +{ + "frame": {"x":1434,"y":1298,"w":68,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":789,"y":744,"w":68,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRightClosed.png": +{ + "frame": {"x":3,"y":688,"w":158,"h":676}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":805,"w":158,"h":676}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRightSpread.png": +{ + "frame": {"x":3,"y":3,"w":158,"h":681}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":803,"w":158,"h":681}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/RimGloveLeftFree.png": +{ + "frame": {"x":1434,"y":1298,"w":68,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":789,"y":744,"w":68,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yoke/HeavySteelLock.png": +{ + "frame": {"x":1506,"y":323,"w":507,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":371,"y":426,"w":507,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas23.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas23.webp b/TextureAtlas/atlas23.webp new file mode 100644 index 000000000..1e0b5bd3e Binary files /dev/null and b/TextureAtlas/atlas23.webp differ diff --git a/TextureAtlas/atlas24.json b/TextureAtlas/atlas24.json new file mode 100644 index 000000000..859fb321d --- /dev/null +++ b/TextureAtlas/atlas24.json @@ -0,0 +1,485 @@ +{"frames": { + +"Models/Bandit/ShoeRightClosed.png": +{ + "frame": {"x":1394,"y":3,"w":146,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":1433,"w":146,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/TorsoClosed.png": +{ + "frame": {"x":448,"y":3,"w":336,"h":591}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":359,"w":336,"h":591}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/TorsoClosedChastity.png": +{ + "frame": {"x":365,"y":1257,"w":336,"h":591}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":359,"w":336,"h":591}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/TorsoSpreadChastity.png": +{ + "frame": {"x":300,"y":606,"w":354,"h":591}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":359,"w":354,"h":591}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveRightFront.png": +{ + "frame": {"x":1883,"y":1773,"w":162,"h":270}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":461,"w":162,"h":270}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftLockClosed.png": +{ + "frame": {"x":2002,"y":652,"w":43,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":646,"y":1428,"w":43,"h":76}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtOverKneel.png": +{ + "frame": {"x":955,"y":3,"w":435,"h":293}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":390,"y":799,"w":435,"h":293}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/FuzzTop.png": +{ + "frame": {"x":1008,"y":592,"w":238,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":406,"w":238,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagMetal/OTNStrapRivets.png": +{ + "frame": {"x":815,"y":1174,"w":95,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":90,"y":242,"w":95,"h":13}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagTape/Cleave.png": +{ + "frame": {"x":510,"y":1201,"w":157,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":66,"y":225,"w":157,"h":52}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Gasmask/Nose.png": +{ + "frame": {"x":2002,"y":732,"w":43,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":106,"y":206,"w":43,"h":59}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair2/Hair5_FrontE.png": +{ + "frame": {"x":272,"y":1870,"w":134,"h":175}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":127,"w":134,"h":175}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/BowHeadband.png": +{ + "frame": {"x":3,"y":1870,"w":265,"h":175}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":81,"w":265,"h":175}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletLaceLeftClosed.png": +{ + "frame": {"x":2002,"y":453,"w":43,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":1391,"w":43,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowLeftWristtie.png": +{ + "frame": {"x":914,"y":1174,"w":45,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":688,"y":628,"w":45,"h":13}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockLeftClosed.png": +{ + "frame": {"x":815,"y":592,"w":189,"h":578}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":531,"y":1060,"w":189,"h":578}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockRightSpread.png": +{ + "frame": {"x":658,"y":598,"w":153,"h":589}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":1044,"w":153,"h":589}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockLeftClosed.png": +{ + "frame": {"x":1032,"y":1257,"w":187,"h":578}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":1060,"w":187,"h":578}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockLeftSpread.png": +{ + "frame": {"x":300,"y":3,"w":144,"h":599}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":626,"y":1037,"w":144,"h":599}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockLeftClosed.png": +{ + "frame": {"x":1223,"y":1257,"w":171,"h":576}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":1062,"w":171,"h":576}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LeftLegsBeltsKneelClosed.png": +{ + "frame": {"x":1544,"y":1773,"w":335,"h":272}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":824,"w":335,"h":272}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareThighLeftSpread.png": +{ + "frame": {"x":1942,"y":1713,"w":103,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":642,"y":1031,"w":103,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/StrapsLower.png": +{ + "frame": {"x":1008,"y":852,"w":226,"h":318}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":639,"w":226,"h":318}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SockRightHogtie.png": +{ + "frame": {"x":705,"y":1257,"w":141,"h":580}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":931,"w":141,"h":580}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronChestBelts.png": +{ + "frame": {"x":300,"y":1201,"w":206,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":485,"y":470,"w":206,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressSkirtKneel.png": +{ + "frame": {"x":1544,"y":453,"w":454,"h":340}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":364,"y":650,"w":454,"h":340}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/FootSockRightKneel.png": +{ + "frame": {"x":858,"y":1840,"w":409,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":856,"w":409,"h":205}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/KneeRightHogtie.png": +{ + "frame": {"x":850,"y":1257,"w":178,"h":579}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":485,"y":987,"w":178,"h":579}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SockLeftKneelClosed.png": +{ + "frame": {"x":1544,"y":300,"w":494,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":401,"y":935,"w":494,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SockRightSpread.png": +{ + "frame": {"x":1250,"y":592,"w":139,"h":359}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":1266,"w":139,"h":359}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ThighLeftHogtie.png": +{ + "frame": {"x":788,"y":3,"w":163,"h":585}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":981,"w":163,"h":585}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/InvertedRoseClosed.png": +{ + "frame": {"x":1768,"y":797,"w":275,"h":154}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":761,"w":275,"h":154}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/LeftLegsBeltsKneelClosed.png": +{ + "frame": {"x":1544,"y":1773,"w":335,"h":272}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":824,"w":335,"h":272}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/ChestPlate.png": +{ + "frame": {"x":1782,"y":1199,"w":263,"h":223}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":428,"w":263,"h":223}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftWristtie.png": +{ + "frame": {"x":1942,"y":1426,"w":103,"h":283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":495,"w":103,"h":283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftWristtieTight.png": +{ + "frame": {"x":1942,"y":1426,"w":103,"h":283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":495,"w":103,"h":283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightFree.png": +{ + "frame": {"x":1782,"y":1426,"w":156,"h":343}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":348,"y":491,"w":156,"h":343}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightFreeTight.png": +{ + "frame": {"x":1782,"y":1426,"w":156,"h":343}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":348,"y":491,"w":156,"h":343}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/FootRightClosed.png": +{ + "frame": {"x":1398,"y":1562,"w":138,"h":271}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":1342,"w":138,"h":271}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/Shirt.png": +{ + "frame": {"x":1271,"y":1837,"w":269,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":526,"w":269,"h":208}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/ShirtKneel.png": +{ + "frame": {"x":1271,"y":1837,"w":269,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":526,"w":269,"h":208}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeBackYoked.png": +{ + "frame": {"x":1393,"y":797,"w":371,"h":154}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":530,"w":371,"h":154}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/LegRightHogtie.png": +{ + "frame": {"x":1393,"y":389,"w":147,"h":404}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":802,"w":147,"h":404}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/BondageHarness.png": +{ + "frame": {"x":1544,"y":1257,"w":234,"h":512}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":112,"y":43,"w":234,"h":512}, + "sourceSize": {"w":481,"h":651} +}, +"Models/TallBallet/TallLegRightHogtie.png": +{ + "frame": {"x":1398,"y":1257,"w":142,"h":301}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":905,"w":142,"h":301}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/FeetClosed.png": +{ + "frame": {"x":3,"y":3,"w":293,"h":623}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":976,"w":293,"h":623}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/BottomClosed.png": +{ + "frame": {"x":3,"y":1257,"w":358,"h":609}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":735,"w":358,"h":609}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/BottomHogtie.png": +{ + "frame": {"x":3,"y":1257,"w":358,"h":609}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":735,"w":358,"h":609}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/FeetClosed.png": +{ + "frame": {"x":3,"y":630,"w":293,"h":623}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":976,"w":293,"h":623}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/RightLegsKneel.png": +{ + "frame": {"x":955,"y":300,"w":434,"h":288}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":345,"y":798,"w":434,"h":288}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/TopStrapCrossed.png": +{ + "frame": {"x":671,"y":1191,"w":304,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":439,"w":304,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmRightYoked.png": +{ + "frame": {"x":1782,"y":955,"w":263,"h":240}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":277,"y":393,"w":263,"h":240}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SkirtKneel.png": +{ + "frame": {"x":410,"y":1852,"w":444,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":332,"y":770,"w":444,"h":193}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SockLeftKneel.png": +{ + "frame": {"x":1250,"y":955,"w":528,"h":298}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":364,"y":785,"w":528,"h":298}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SockLeftKneelClosed.png": +{ + "frame": {"x":1544,"y":3,"w":494,"h":293}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":387,"y":786,"w":494,"h":293}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/Webbing.png": +{ + "frame": {"x":979,"y":1174,"w":267,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":426,"w":267,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/WebbingName.png": +{ + "frame": {"x":365,"y":1852,"w":40,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":593,"y":479,"w":40,"h":13}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtSplitOverKneel.png": +{ + "frame": {"x":955,"y":3,"w":435,"h":293}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":390,"y":799,"w":435,"h":293}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegPadsLeftHogtie.png": +{ + "frame": {"x":1394,"y":196,"w":146,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":580,"y":953,"w":146,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas24.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas24.webp b/TextureAtlas/atlas24.webp new file mode 100644 index 000000000..e8145b23e Binary files /dev/null and b/TextureAtlas/atlas24.webp differ diff --git a/TextureAtlas/atlas25.json b/TextureAtlas/atlas25.json new file mode 100644 index 000000000..a3fad311c --- /dev/null +++ b/TextureAtlas/atlas25.json @@ -0,0 +1,605 @@ +{"frames": { + +"Models/Bandit/Choker.png": +{ + "frame": {"x":1431,"y":1338,"w":78,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":390,"w":78,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Feet1Kneel.png": +{ + "frame": {"x":528,"y":1185,"w":59,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":949,"w":59,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoUpperCrop.png": +{ + "frame": {"x":591,"y":1129,"w":303,"h":245}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":382,"w":303,"h":245}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/China/DressSkirtKneelCrotchStrap.png": +{ + "frame": {"x":1333,"y":1378,"w":335,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":734,"w":335,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/Choker.png": +{ + "frame": {"x":1431,"y":1338,"w":78,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":390,"w":78,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenRightBoxtie.png": +{ + "frame": {"x":564,"y":164,"w":23,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":620,"w":23,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenRightFree.png": +{ + "frame": {"x":548,"y":834,"w":39,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":658,"w":39,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowLeftWristtie.png": +{ + "frame": {"x":558,"y":514,"w":29,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":710,"y":612,"w":29,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockAnkleLeftSpread.png": +{ + "frame": {"x":564,"y":286,"w":23,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":713,"y":1444,"w":23,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockAnkleRightSpread.png": +{ + "frame": {"x":564,"y":325,"w":23,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":511,"y":1444,"w":23,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowLeftYoked.png": +{ + "frame": {"x":558,"y":562,"w":29,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":801,"y":499,"w":29,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockThighLeftSpread.png": +{ + "frame": {"x":564,"y":364,"w":23,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":1014,"w":23,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowLeftWristtie.png": +{ + "frame": {"x":548,"y":726,"w":39,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":703,"y":605,"w":39,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenWristLeftYoked.png": +{ + "frame": {"x":558,"y":402,"w":29,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":910,"y":397,"w":29,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenRightBoxtie.png": +{ + "frame": {"x":564,"y":164,"w":23,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":620,"w":23,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenRightFree.png": +{ + "frame": {"x":548,"y":834,"w":39,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":658,"w":39,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightLockPlateFront.png": +{ + "frame": {"x":558,"y":460,"w":29,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":593,"w":29,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightClosed.png": +{ + "frame": {"x":1086,"y":1984,"w":105,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":1026,"w":105,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightDecoCleanKneel.png": +{ + "frame": {"x":1195,"y":1240,"w":135,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":369,"y":854,"w":135,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightDecoCleanKneelClosed.png": +{ + "frame": {"x":1195,"y":1240,"w":135,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":369,"y":854,"w":135,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightDecoSpread.png": +{ + "frame": {"x":1333,"y":1338,"w":94,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":1052,"w":94,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightDecoCleanFront.png": +{ + "frame": {"x":528,"y":1335,"w":59,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":544,"w":59,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightFree.png": +{ + "frame": {"x":528,"y":1264,"w":59,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":349,"y":602,"w":59,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseTorsoKneel.png": +{ + "frame": {"x":1147,"y":294,"w":541,"h":319}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":288,"y":390,"w":541,"h":319}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/CroppedBlouseTorsoKneel.png": +{ + "frame": {"x":3,"y":571,"w":541,"h":349}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":288,"y":390,"w":541,"h":349}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceChestDecoCrystal.png": +{ + "frame": {"x":564,"y":227,"w":23,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":560,"w":23,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtKneel.png": +{ + "frame": {"x":591,"y":267,"w":552,"h":352}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":273,"y":740,"w":552,"h":352}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtKneelCrotchStrap.png": +{ + "frame": {"x":591,"y":769,"w":529,"h":356}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":275,"y":737,"w":529,"h":356}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandRightBoxtie.png": +{ + "frame": {"x":548,"y":881,"w":39,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":494,"w":39,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceDask/Eyes2Angry.png": +{ + "frame": {"x":1593,"y":1338,"w":68,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":149,"y":170,"w":68,"h":36}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BallSideStrap.png": +{ + "frame": {"x":1124,"y":898,"w":206,"h":227}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":56,"y":31,"w":206,"h":227}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/PanelSideStrap.png": +{ + "frame": {"x":1124,"y":898,"w":206,"h":227}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":56,"y":31,"w":206,"h":227}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Gothic/LaceLowerKneel.png": +{ + "frame": {"x":3,"y":3,"w":584,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":305,"y":915,"w":584,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/LaceUpper.png": +{ + "frame": {"x":1156,"y":3,"w":553,"h":287}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":318,"y":721,"w":553,"h":287}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/LaceUpperCrotchStrap.png": +{ + "frame": {"x":3,"y":395,"w":551,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":821,"w":551,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair3_FrontA.png": +{ + "frame": {"x":3,"y":1612,"w":385,"h":433}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":97,"w":385,"h":433}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/BeltsStrap.png": +{ + "frame": {"x":1050,"y":1378,"w":53,"h":230}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":552,"y":690,"w":53,"h":230}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherLeftKneelClosed.png": +{ + "frame": {"x":1147,"y":617,"w":536,"h":277}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":384,"y":811,"w":536,"h":277}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandThighRightSpread.png": +{ + "frame": {"x":1195,"y":1186,"w":135,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":1031,"w":135,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardClosed.png": +{ + "frame": {"x":820,"y":1612,"w":262,"h":427}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":493,"w":262,"h":427}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/ShoulderCuffStripeRight.png": +{ + "frame": {"x":564,"y":99,"w":23,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":431,"w":23,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Leash/LeashHogtiePulled.png": +{ + "frame": {"x":392,"y":1612,"w":424,"h":432}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":596,"y":26,"w":424,"h":432}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandThighLeftSpread.png": +{ + "frame": {"x":1195,"y":1129,"w":135,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":1022,"w":135,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/LegLegbinderClosed.png": +{ + "frame": {"x":1086,"y":1631,"w":105,"h":349}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":1198,"w":105,"h":349}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SockLeftKneel.png": +{ + "frame": {"x":3,"y":924,"w":528,"h":253}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":832,"w":528,"h":253}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressSkirtHemKneel.png": +{ + "frame": {"x":591,"y":623,"w":534,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":334,"y":878,"w":534,"h":142}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressSkirtHogtie.png": +{ + "frame": {"x":1348,"y":1721,"w":408,"h":324}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":434,"y":679,"w":408,"h":324}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletLeftBoxtie.png": +{ + "frame": {"x":548,"y":786,"w":39,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":676,"w":39,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletRightUp.png": +{ + "frame": {"x":535,"y":925,"w":52,"h":140}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":542,"y":243,"w":52,"h":140}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/HeadbandRibbon.png": +{ + "frame": {"x":548,"y":599,"w":39,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":229,"w":39,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveLeftFree.png": +{ + "frame": {"x":1195,"y":1289,"w":134,"h":237}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":673,"y":405,"w":134,"h":237}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffRightUp.png": +{ + "frame": {"x":1348,"y":1530,"w":282,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":556,"y":320,"w":282,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardRightUp.png": +{ + "frame": {"x":1760,"y":1721,"w":285,"h":309}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":553,"y":198,"w":285,"h":309}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/SockLeftKneelClosed.png": +{ + "frame": {"x":591,"y":3,"w":561,"h":260}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":328,"y":820,"w":561,"h":260}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/HarnessLowerStrap.png": +{ + "frame": {"x":1692,"y":551,"w":353,"h":320}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":606,"w":353,"h":320}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopHarnessLower.png": +{ + "frame": {"x":528,"y":1378,"w":349,"h":230}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":696,"w":349,"h":230}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/HemRightYoked.png": +{ + "frame": {"x":1634,"y":1653,"w":34,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":435,"y":488,"w":34,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/BeltPadlockPin.png": +{ + "frame": {"x":1634,"y":1530,"w":34,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":553,"y":734,"w":34,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusTail.png": +{ + "frame": {"x":1672,"y":1378,"w":372,"h":339}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":673,"y":572,"w":372,"h":339}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallLegLeftKneel.png": +{ + "frame": {"x":1713,"y":3,"w":332,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":382,"y":817,"w":332,"h":267}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLegLeftKneel.png": +{ + "frame": {"x":1713,"y":274,"w":331,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":385,"y":816,"w":331,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/FeetHogtie.png": +{ + "frame": {"x":535,"y":1069,"w":52,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":800,"w":52,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/RightLegsClosed.png": +{ + "frame": {"x":1334,"y":898,"w":349,"h":436}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":820,"w":349,"h":436}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/LegsHogtie.png": +{ + "frame": {"x":1687,"y":875,"w":358,"h":499}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":652,"w":358,"h":499}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveLeftYoked.png": +{ + "frame": {"x":881,"y":1378,"w":165,"h":230}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":687,"y":411,"w":165,"h":230}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/WebbingSideUp.png": +{ + "frame": {"x":1107,"y":1378,"w":84,"h":249}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":635,"y":374,"w":84,"h":249}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtClosedCrotchStrap.png": +{ + "frame": {"x":3,"y":1181,"w":521,"h":427}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":349,"y":792,"w":521,"h":427}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtCrotchStrap.png": +{ + "frame": {"x":3,"y":1181,"w":521,"h":427}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":349,"y":792,"w":521,"h":427}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtSplitKneel.png": +{ + "frame": {"x":591,"y":267,"w":552,"h":352}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":273,"y":740,"w":552,"h":352}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/Panties.png": +{ + "frame": {"x":898,"y":1129,"w":293,"h":245}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":673,"w":293,"h":245}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandLeftKneel.png": +{ + "frame": {"x":1513,"y":1338,"w":76,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":762,"w":76,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandLeftKneelClosed.png": +{ + "frame": {"x":1513,"y":1338,"w":76,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":762,"w":76,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegPadsLeftSpread.png": +{ + "frame": {"x":1195,"y":1530,"w":149,"h":515}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":617,"y":960,"w":149,"h":515}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SkirtKneelCrotchStrap.png": +{ + "frame": {"x":3,"y":99,"w":557,"h":292}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":312,"y":713,"w":557,"h":292}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas25.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas25.webp b/TextureAtlas/atlas25.webp new file mode 100644 index 000000000..67c27f9a0 Binary files /dev/null and b/TextureAtlas/atlas25.webp differ diff --git a/TextureAtlas/atlas26.json b/TextureAtlas/atlas26.json new file mode 100644 index 000000000..d9808e044 --- /dev/null +++ b/TextureAtlas/atlas26.json @@ -0,0 +1,605 @@ +{"frames": { + +"Models/ArmorChain/SkirtKneel.png": +{ + "frame": {"x":1359,"y":328,"w":418,"h":219}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":362,"y":748,"w":418,"h":219}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/SkirtKneelCrotchStrap.png": +{ + "frame": {"x":1359,"y":328,"w":418,"h":219}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":362,"y":748,"w":418,"h":219}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/ForeGloveRightCrossed.png": +{ + "frame": {"x":1359,"y":3,"w":279,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":543,"w":279,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveRightYoked.png": +{ + "frame": {"x":3,"y":1704,"w":171,"h":341}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":300,"y":288,"w":171,"h":341}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmRightYoked.png": +{ + "frame": {"x":1245,"y":1502,"w":213,"h":241}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":311,"y":389,"w":213,"h":241}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/LegLeftClosed.png": +{ + "frame": {"x":116,"y":3,"w":163,"h":559}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":919,"w":163,"h":559}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoBand.png": +{ + "frame": {"x":858,"y":1101,"w":200,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":656,"w":200,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/NeckCorsetRim.png": +{ + "frame": {"x":1374,"y":1097,"w":131,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":424,"w":131,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ThighLinkSpreadHigh.png": +{ + "frame": {"x":1371,"y":2018,"w":81,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":564,"y":1005,"w":81,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayWristRightFree.png": +{ + "frame": {"x":200,"y":1119,"w":40,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":368,"y":601,"w":40,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/GlowBalletRightSpread.png": +{ + "frame": {"x":2003,"y":1635,"w":42,"h":212}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":1431,"w":42,"h":212}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/ShinyBalletLeftClosed.png": +{ + "frame": {"x":710,"y":1691,"w":112,"h":354}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":1331,"w":112,"h":354}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/ShinyBalletLeftSpread.png": +{ + "frame": {"x":710,"y":1691,"w":112,"h":354}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":668,"y":1344,"w":112,"h":354}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/ShinyBalletRightClosed.png": +{ + "frame": {"x":593,"y":1691,"w":113,"h":354}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":1328,"w":113,"h":354}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftDecoCleanYoked.png": +{ + "frame": {"x":457,"y":1106,"w":61,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":873,"y":403,"w":61,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftDecoYoked.png": +{ + "frame": {"x":522,"y":1106,"w":61,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":873,"y":403,"w":61,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightDecoFront.png": +{ + "frame": {"x":1224,"y":1097,"w":146,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":392,"y":541,"w":146,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseBustBoxtieChesttied.png": +{ + "frame": {"x":1359,"y":193,"w":274,"h":131}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":497,"w":274,"h":131}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/BrowsNeutral.png": +{ + "frame": {"x":374,"y":1119,"w":44,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":250,"w":44,"h":19}, + "sourceSize": {"w":744,"h":461} +}, +"Models/EyesDai2/Brows2Sad.png": +{ + "frame": {"x":309,"y":1119,"w":61,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":244,"w":61,"h":19}, + "sourceSize": {"w":726,"h":532} +}, +"Models/EyesK3/Eyes2Dazed.png": +{ + "frame": {"x":587,"y":1106,"w":56,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":271,"w":56,"h":33}, + "sourceSize": {"w":781,"h":560} +}, +"Models/FaceDask/Brows2Annoyed.png": +{ + "frame": {"x":422,"y":1119,"w":31,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":254,"w":31,"h":19}, + "sourceSize": {"w":700,"h":400} +}, +"Models/FaceDask/Brows2Neutral.png": +{ + "frame": {"x":244,"y":1119,"w":30,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":612,"y":232,"w":30,"h":20}, + "sourceSize": {"w":700,"h":400} +}, +"Models/FaceDask/Brows2Surprised.png": +{ + "frame": {"x":1189,"y":2025,"w":32,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":244,"w":32,"h":18}, + "sourceSize": {"w":700,"h":400} +}, +"Models/FaceDask/BrowsSad.png": +{ + "frame": {"x":278,"y":1119,"w":27,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":537,"y":243,"w":27,"h":20}, + "sourceSize": {"w":700,"h":400} +}, +"Models/FaceKjus/BrowsAngry.png": +{ + "frame": {"x":1956,"y":1635,"w":43,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":529,"y":262,"w":43,"h":18}, + "sourceSize": {"w":693,"h":407} +}, +"Models/FaceKjus/MouthPout.png": +{ + "frame": {"x":1090,"y":2025,"w":23,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":594,"y":333,"w":23,"h":19}, + "sourceSize": {"w":750,"h":458} +}, +"Models/FaceKoi/BrowsNeutral.png": +{ + "frame": {"x":1143,"y":2025,"w":42,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":60,"y":150,"w":42,"h":18}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Festive/FuzzTopUp.png": +{ + "frame": {"x":1245,"y":1245,"w":213,"h":253}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":409,"w":213,"h":253}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagCloth/CleaveThick.png": +{ + "frame": {"x":1062,"y":1099,"w":158,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":69,"y":236,"w":158,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLatex/NeckCorsetRim.png": +{ + "frame": {"x":1374,"y":1097,"w":131,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":424,"w":131,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/HemLowerBackCrotchStrap.png": +{ + "frame": {"x":1983,"y":1851,"w":62,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":576,"y":911,"w":62,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Curly.png": +{ + "frame": {"x":1642,"y":1245,"w":310,"h":408}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":112,"w":310,"h":408}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/HimeBack.png": +{ + "frame": {"x":594,"y":3,"w":315,"h":546}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":104,"w":315,"h":546}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/FlatBalletLeftSpread.png": +{ + "frame": {"x":178,"y":1704,"w":105,"h":341}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":1335,"w":105,"h":341}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/LatexBand.png": +{ + "frame": {"x":858,"y":1101,"w":200,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":656,"w":200,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowRightBoxtie.png": +{ + "frame": {"x":1117,"y":2025,"w":22,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":609,"w":22,"h":19}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/HeadHarness.png": +{ + "frame": {"x":1956,"y":1245,"w":89,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":109,"w":89,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockRightClosed.png": +{ + "frame": {"x":3,"y":577,"w":140,"h":564}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":1053,"w":140,"h":564}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockRightClosed.png": +{ + "frame": {"x":3,"y":1145,"w":245,"h":555}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":1062,"w":245,"h":555}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/Arms.png": +{ + "frame": {"x":1642,"y":866,"w":402,"h":375}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":403,"w":402,"h":375}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LegsBeltsHogtie.png": +{ + "frame": {"x":287,"y":1696,"w":302,"h":349}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":858,"w":302,"h":349}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandThighRightSpread.png": +{ + "frame": {"x":1509,"y":1097,"w":129,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":1033,"w":129,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/Arms.png": +{ + "frame": {"x":1642,"y":3,"w":403,"h":321}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":396,"y":400,"w":403,"h":321}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeKneelCrotchStrap.png": +{ + "frame": {"x":1069,"y":1143,"w":389,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":393,"y":818,"w":389,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/Dress.png": +{ + "frame": {"x":561,"y":1143,"w":504,"h":544}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":382,"y":388,"w":504,"h":544}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressChestFree.png": +{ + "frame": {"x":614,"y":553,"w":442,"h":544}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":388,"w":442,"h":544}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressChestUp.png": +{ + "frame": {"x":913,"y":3,"w":442,"h":544}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":388,"w":442,"h":544}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressChestYoked.png": +{ + "frame": {"x":1196,"y":551,"w":442,"h":542}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":390,"w":442,"h":542}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ThighLeftClosed.png": +{ + "frame": {"x":1090,"y":1691,"w":151,"h":330}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":981,"w":151,"h":330}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/LegsBeltsHogtie.png": +{ + "frame": {"x":287,"y":1696,"w":302,"h":349}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":858,"w":302,"h":349}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/Petsuit.png": +{ + "frame": {"x":287,"y":1696,"w":302,"h":349}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":858,"w":302,"h":349}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveDecoLeftFront.png": +{ + "frame": {"x":3,"y":3,"w":109,"h":570}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":723,"y":572,"w":109,"h":570}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightYoked.png": +{ + "frame": {"x":826,"y":1691,"w":260,"h":353}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":243,"y":372,"w":260,"h":353}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightYokedTight.png": +{ + "frame": {"x":826,"y":1691,"w":260,"h":353}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":243,"y":372,"w":260,"h":353}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ZombieChestTalisman.png": +{ + "frame": {"x":456,"y":555,"w":154,"h":547}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":496,"y":479,"w":154,"h":547}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh1Closed.png": +{ + "frame": {"x":647,"y":1101,"w":207,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":1097,"w":207,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirt.png": +{ + "frame": {"x":1642,"y":551,"w":403,"h":311}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":402,"y":724,"w":403,"h":311}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtClosed.png": +{ + "frame": {"x":1642,"y":551,"w":403,"h":311}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":402,"y":724,"w":403,"h":311}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtHogtie.png": +{ + "frame": {"x":1642,"y":551,"w":403,"h":311}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":402,"y":724,"w":403,"h":311}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusClawRightFront.png": +{ + "frame": {"x":147,"y":1119,"w":49,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":488,"w":49,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveRightBoxtie.png": +{ + "frame": {"x":1371,"y":1747,"w":87,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":424,"w":87,"h":267}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveRightFree.png": +{ + "frame": {"x":1956,"y":1531,"w":89,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":423,"w":89,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtRuffleClosedCrotchStrap.png": +{ + "frame": {"x":1462,"y":1657,"w":517,"h":387}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":351,"y":830,"w":517,"h":387}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtRuffleCrotchStrap.png": +{ + "frame": {"x":1462,"y":1657,"w":517,"h":387}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":351,"y":830,"w":517,"h":387}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveRightBoxtie.png": +{ + "frame": {"x":1781,"y":328,"w":255,"h":219}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":497,"w":255,"h":219}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegPadsRightSpread.png": +{ + "frame": {"x":1060,"y":551,"w":132,"h":544}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":937,"w":132,"h":544}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoLowerClosed.png": +{ + "frame": {"x":147,"y":566,"w":305,"h":549}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":390,"w":305,"h":549}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoLowerRim.png": +{ + "frame": {"x":283,"y":3,"w":307,"h":548}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":390,"w":307,"h":548}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoLowerRimClosed.png": +{ + "frame": {"x":252,"y":1143,"w":305,"h":549}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":390,"w":305,"h":549}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SleeveLeftBoxtie.png": +{ + "frame": {"x":1245,"y":1747,"w":122,"h":298}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":653,"y":433,"w":122,"h":298}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SleeveLeftFree.png": +{ + "frame": {"x":1462,"y":1143,"w":176,"h":510}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":416,"w":176,"h":510}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SleeveLeftFront.png": +{ + "frame": {"x":1245,"y":1747,"w":122,"h":298}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":653,"y":433,"w":122,"h":298}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SleeveLeftUp.png": +{ + "frame": {"x":1069,"y":1245,"w":172,"h":442}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":659,"y":163,"w":172,"h":442}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas26.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas26.webp b/TextureAtlas/atlas26.webp new file mode 100644 index 000000000..1b2837ce5 Binary files /dev/null and b/TextureAtlas/atlas26.webp differ diff --git a/TextureAtlas/atlas27.json b/TextureAtlas/atlas27.json new file mode 100644 index 000000000..727a306bc --- /dev/null +++ b/TextureAtlas/atlas27.json @@ -0,0 +1,445 @@ +{"frames": { + +"Models/ArmorChain/SkirtBeltRivets.png": +{ + "frame": {"x":1340,"y":511,"w":136,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":787,"w":136,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/RightArm2Boxtie.png": +{ + "frame": {"x":1440,"y":410,"w":36,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":606,"w":36,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmRightYoked.png": +{ + "frame": {"x":3,"y":1093,"w":308,"h":539}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":308,"h":539}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/CalfLeftHogtie.png": +{ + "frame": {"x":1480,"y":276,"w":89,"h":257}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":651,"y":942,"w":89,"h":257}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/HandLeftFront.png": +{ + "frame": {"x":1573,"y":3,"w":470,"h":501}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":470,"h":501}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/LegSockRightHogtie.png": +{ + "frame": {"x":1757,"y":2030,"w":142,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":907,"w":142,"h":14}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cape/CapeKneel.png": +{ + "frame": {"x":527,"y":1088,"w":330,"h":533}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":409,"w":330,"h":533}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/HandLeftFront.png": +{ + "frame": {"x":1573,"y":508,"w":470,"h":501}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":470,"h":501}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/LegRightClosed.png": +{ + "frame": {"x":591,"y":541,"w":153,"h":533}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":919,"w":153,"h":533}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/CyberPlug.png": +{ + "frame": {"x":1642,"y":1518,"w":35,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":911,"w":35,"h":13}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenCollar.png": +{ + "frame": {"x":1440,"y":468,"w":36,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":599,"y":394,"w":36,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/BeltDeco.png": +{ + "frame": {"x":748,"y":1052,"w":221,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":699,"w":221,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/BeltDecoClean.png": +{ + "frame": {"x":973,"y":1052,"w":221,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":699,"w":221,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageCollarCrystal.png": +{ + "frame": {"x":861,"y":1597,"w":27,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":597,"y":421,"w":27,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai2/BrowsAngry.png": +{ + "frame": {"x":1764,"y":1810,"w":46,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":543,"y":254,"w":46,"h":26}, + "sourceSize": {"w":693,"h":407} +}, +"Models/FaceDask/WhitesEyes2Angry.png": +{ + "frame": {"x":1198,"y":1048,"w":68,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":149,"y":170,"w":68,"h":36}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceFang/MouthPout.png": +{ + "frame": {"x":1573,"y":1518,"w":31,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":336,"w":31,"h":16}, + "sourceSize": {"w":750,"h":458} +}, +"Models/FaceFang2/MouthPout.png": +{ + "frame": {"x":1573,"y":1518,"w":31,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":336,"w":31,"h":16}, + "sourceSize": {"w":750,"h":458} +}, +"Models/FaceFangless/MouthPout.png": +{ + "frame": {"x":1608,"y":1518,"w":30,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":594,"y":340,"w":30,"h":16}, + "sourceSize": {"w":750,"h":458} +}, +"Models/FaceKjus/Brows2Sad.png": +{ + "frame": {"x":1903,"y":2030,"w":67,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":610,"y":245,"w":67,"h":13}, + "sourceSize": {"w":726,"h":532} +}, +"Models/FaceKjus/BrowsAnnoyed.png": +{ + "frame": {"x":1974,"y":2030,"w":39,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":268,"w":39,"h":13}, + "sourceSize": {"w":765,"h":427} +}, +"Models/Festive/ButtonsTop.png": +{ + "frame": {"x":1393,"y":1597,"w":237,"h":239}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":408,"w":237,"h":239}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/BlondeFront.png": +{ + "frame": {"x":618,"y":1625,"w":277,"h":419}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":99,"w":277,"h":419}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair3_Back.png": +{ + "frame": {"x":861,"y":1088,"w":446,"h":505}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":124,"w":446,"h":505}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/StrapsChestWristtie.png": +{ + "frame": {"x":3,"y":1636,"w":309,"h":408}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":385,"w":309,"h":408}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandWristRightYoked.png": +{ + "frame": {"x":1270,"y":1048,"w":60,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":401,"w":60,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/EarmuffersL.png": +{ + "frame": {"x":1440,"y":276,"w":36,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":687,"y":273,"w":36,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandAnkleLeftKneel.png": +{ + "frame": {"x":1440,"y":343,"w":36,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":716,"y":958,"w":36,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockRightKneel.png": +{ + "frame": {"x":1634,"y":1597,"w":181,"h":209}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":851,"w":181,"h":209}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/CapeKneel.png": +{ + "frame": {"x":527,"y":1088,"w":330,"h":533}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":409,"w":330,"h":533}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LegsHogtie.png": +{ + "frame": {"x":899,"y":1597,"w":337,"h":448}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":758,"w":337,"h":448}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/StrapsLowerClean.png": +{ + "frame": {"x":1819,"y":1518,"w":226,"h":318}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":639,"w":226,"h":318}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeSockRightClosed.png": +{ + "frame": {"x":1634,"y":1810,"w":126,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":965,"w":126,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletLeftYoked.png": +{ + "frame": {"x":1440,"y":3,"w":129,"h":269}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":826,"y":275,"w":129,"h":269}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/CapeKneel.png": +{ + "frame": {"x":1141,"y":541,"w":428,"h":503}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":415,"w":428,"h":503}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveDecoLeftFree.png": +{ + "frame": {"x":449,"y":3,"w":73,"h":536}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":783,"y":704,"w":73,"h":536}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftFree.png": +{ + "frame": {"x":315,"y":1093,"w":208,"h":538}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":480,"w":208,"h":538}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftFreeTight.png": +{ + "frame": {"x":315,"y":1093,"w":208,"h":538}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":480,"w":208,"h":538}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/FrogThigh2KneelClosed.png": +{ + "frame": {"x":1757,"y":1840,"w":288,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":365,"y":861,"w":288,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/HandLeftFront.png": +{ + "frame": {"x":1573,"y":1013,"w":470,"h":501}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":470,"h":501}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeBackUp.png": +{ + "frame": {"x":1393,"y":1840,"w":360,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":353,"w":360,"h":205}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/SwimsuitClosed.png": +{ + "frame": {"x":832,"y":3,"w":300,"h":504}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":415,"w":300,"h":504}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/SwimsuitSpread.png": +{ + "frame": {"x":1136,"y":3,"w":300,"h":504}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":415,"w":300,"h":504}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Tails/Wolf.png": +{ + "frame": {"x":526,"y":3,"w":302,"h":534}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":595,"y":412,"w":302,"h":534}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallLeftHogtie.png": +{ + "frame": {"x":1240,"y":1597,"w":149,"h":448}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":636,"y":770,"w":149,"h":448}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/DressChestYoked.png": +{ + "frame": {"x":3,"y":548,"w":440,"h":541}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":391,"w":440,"h":541}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/PantyhoseClosed.png": +{ + "frame": {"x":316,"y":1635,"w":298,"h":410}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":538,"w":298,"h":410}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/DressChestYoked.png": +{ + "frame": {"x":3,"y":3,"w":442,"h":541}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":391,"w":442,"h":541}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseLeftUp.png": +{ + "frame": {"x":1334,"y":1048,"w":235,"h":486}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":298,"w":235,"h":486}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegPadsRightClosed.png": +{ + "frame": {"x":447,"y":548,"w":140,"h":536}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":942,"w":140,"h":536}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yoke/HeavySteelHardware.png": +{ + "frame": {"x":832,"y":511,"w":504,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":374,"y":409,"w":504,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yoke/HeavySteelPins.png": +{ + "frame": {"x":1311,"y":1538,"w":504,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":374,"y":379,"w":504,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SkirtCrotchStrap.png": +{ + "frame": {"x":748,"y":541,"w":389,"h":507}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":409,"y":713,"w":389,"h":507}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SkirtHogtieCrotchStrap.png": +{ + "frame": {"x":748,"y":541,"w":389,"h":507}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":409,"y":713,"w":389,"h":507}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas27.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas27.webp b/TextureAtlas/atlas27.webp new file mode 100644 index 000000000..7f3f9f163 Binary files /dev/null and b/TextureAtlas/atlas27.webp differ diff --git a/TextureAtlas/atlas28.json b/TextureAtlas/atlas28.json new file mode 100644 index 000000000..aa1f0a282 --- /dev/null +++ b/TextureAtlas/atlas28.json @@ -0,0 +1,733 @@ +{"frames": { + +"Models/ArmorPlate/BootLeftKneel.png": +{ + "frame": {"x":1658,"y":1522,"w":387,"h":160}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":925,"w":387,"h":160}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/SockLeftKneel.png": +{ + "frame": {"x":3,"y":555,"w":506,"h":276}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":808,"w":506,"h":276}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/AnkleRightClosed.png": +{ + "frame": {"x":1939,"y":1059,"w":75,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":540,"y":1424,"w":75,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayThighLeftSpread.png": +{ + "frame": {"x":977,"y":773,"w":45,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":686,"y":1004,"w":45,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/GlowBalletLeftHogtie.png": +{ + "frame": {"x":975,"y":1165,"w":47,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":798,"w":47,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BraPins.png": +{ + "frame": {"x":975,"y":929,"w":47,"h":159}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":562,"y":441,"w":47,"h":159}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockBoxtie.png": +{ + "frame": {"x":1500,"y":847,"w":42,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":744,"y":574,"w":42,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockPlateFront.png": +{ + "frame": {"x":2019,"y":640,"w":26,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":753,"y":602,"w":26,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockPlateWristtie.png": +{ + "frame": {"x":2019,"y":694,"w":26,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":721,"y":612,"w":26,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockUp.png": +{ + "frame": {"x":1500,"y":765,"w":42,"h":78}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":708,"y":216,"w":42,"h":78}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockWristtie.png": +{ + "frame": {"x":2018,"y":1052,"w":27,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":720,"y":611,"w":27,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightDecoCleanYoked.png": +{ + "frame": {"x":1485,"y":1402,"w":57,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":395,"y":525,"w":57,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockBandKneel.png": +{ + "frame": {"x":464,"y":1346,"w":45,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":426,"y":849,"w":45,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightDecoCleanCrossed.png": +{ + "frame": {"x":2019,"y":800,"w":26,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":669,"y":601,"w":26,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageSkirtCrotchStrap.png": +{ + "frame": {"x":1658,"y":1686,"w":384,"h":359}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":404,"y":747,"w":384,"h":359}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageSkirtKneel.png": +{ + "frame": {"x":3,"y":1125,"w":457,"h":269}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":747,"w":457,"h":269}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageSkirtKneelCrotchStrap.png": +{ + "frame": {"x":1026,"y":996,"w":457,"h":269}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":747,"w":457,"h":269}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtClosedCrotchStrap.png": +{ + "frame": {"x":513,"y":889,"w":458,"h":467}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":383,"y":754,"w":458,"h":467}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtCrotchStrap.png": +{ + "frame": {"x":513,"y":889,"w":458,"h":467}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":383,"y":754,"w":458,"h":467}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/ElfFloppyBack.png": +{ + "frame": {"x":350,"y":1531,"w":107,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":293,"w":107,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/Chest.png": +{ + "frame": {"x":3,"y":1813,"w":267,"h":232}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":396,"w":267,"h":232}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/CrystalShoeLeftSpread.png": +{ + "frame": {"x":2018,"y":986,"w":27,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":1497,"w":27,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai2/Brows2Annoyed.png": +{ + "frame": {"x":464,"y":1311,"w":45,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":601,"y":236,"w":45,"h":31}, + "sourceSize": {"w":717,"h":405} +}, +"Models/EyesK3/WhitesEyes2Dazed.png": +{ + "frame": {"x":1485,"y":1485,"w":56,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":271,"w":56,"h":33}, + "sourceSize": {"w":781,"h":560} +}, +"Models/Festive/BinderRightBoxtie.png": +{ + "frame": {"x":2018,"y":841,"w":27,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":615,"w":27,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/ButtonsUnderbustOver.png": +{ + "frame": {"x":1997,"y":1339,"w":48,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":554,"y":518,"w":48,"h":106}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureHarness/LockLower.png": +{ + "frame": {"x":1026,"y":1522,"w":161,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":811,"w":161,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagMetal/BallSideStrap.png": +{ + "frame": {"x":464,"y":1378,"w":44,"h":200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":199,"y":46,"w":44,"h":200}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Gothic/HemUpperKneel.png": +{ + "frame": {"x":3,"y":99,"w":515,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":336,"y":839,"w":515,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/HemUpperKneelCrotchStrap..png": +{ + "frame": {"x":3,"y":211,"w":514,"h":115}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":336,"y":823,"w":514,"h":115}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/LaceUpperKneel.png": +{ + "frame": {"x":513,"y":1360,"w":449,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":369,"y":799,"w":449,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/LaceUpperKneelCrotchStrap..png": +{ + "frame": {"x":512,"y":1464,"w":449,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":369,"y":802,"w":449,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Ponytail2.png": +{ + "frame": {"x":1253,"y":1813,"w":197,"h":232}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":607,"y":83,"w":197,"h":232}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair2_FrontB.png": +{ + "frame": {"x":350,"y":1844,"w":157,"h":201}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":553,"y":132,"w":157,"h":201}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/HardwareUnderbust.png": +{ + "frame": {"x":977,"y":832,"w":45,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":549,"y":619,"w":45,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletLaceLeftSpread.png": +{ + "frame": {"x":466,"y":835,"w":43,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":668,"y":1389,"w":43,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletLaceRightSpread.png": +{ + "frame": {"x":466,"y":1033,"w":43,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":1389,"w":43,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLeftKneel.png": +{ + "frame": {"x":1546,"y":454,"w":479,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":906,"w":479,"h":182}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLeftKneelClosed.png": +{ + "frame": {"x":513,"y":703,"w":460,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":906,"w":460,"h":182}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/CrotchBeltExtra.png": +{ + "frame": {"x":1500,"y":642,"w":42,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":554,"y":797,"w":42,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandAnkleLeftKneel.png": +{ + "frame": {"x":977,"y":703,"w":45,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":711,"y":956,"w":45,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowLeftWristtie.png": +{ + "frame": {"x":464,"y":1273,"w":45,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":689,"y":615,"w":45,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/ShoulderCuffRight.png": +{ + "frame": {"x":2018,"y":916,"w":27,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":431,"w":27,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandAnkleLeftClosed.png": +{ + "frame": {"x":1191,"y":1522,"w":70,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":1441,"w":70,"h":17}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveLeftFront.png": +{ + "frame": {"x":1454,"y":1813,"w":200,"h":229}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":567,"y":484,"w":200,"h":229}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockLeftKneel.png": +{ + "frame": {"x":3,"y":330,"w":508,"h":221}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":860,"w":508,"h":221}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockLeftKneel.png.png": +{ + "frame": {"x":1034,"y":266,"w":508,"h":221}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":860,"w":508,"h":221}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockLeftKneel.png": +{ + "frame": {"x":515,"y":474,"w":507,"h":225}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":389,"y":860,"w":507,"h":225}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareCollar.png": +{ + "frame": {"x":1997,"y":1449,"w":48,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":575,"y":384,"w":48,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/StrapsChest.png": +{ + "frame": {"x":765,"y":1813,"w":240,"h":232}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":410,"w":240,"h":232}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/ArmsLaces.png": +{ + "frame": {"x":1500,"y":491,"w":42,"h":147}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":729,"y":507,"w":42,"h":147}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/LacesLegbinderKneelClosed.png": +{ + "frame": {"x":512,"y":1813,"w":249,"h":232}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":347,"y":841,"w":249,"h":232}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BeltsHardware.png": +{ + "frame": {"x":1939,"y":1115,"w":106,"h":122}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":540,"y":710,"w":106,"h":122}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressSkirtStripe.png": +{ + "frame": {"x":3,"y":3,"w":520,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":345,"y":882,"w":520,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressSkirtStripeKneel.png": +{ + "frame": {"x":1546,"y":321,"w":481,"h":129}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":365,"y":835,"w":481,"h":129}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletLeftWristtie.png": +{ + "frame": {"x":977,"y":882,"w":45,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":664,"w":45,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GloveLeftFree.png": +{ + "frame": {"x":1939,"y":1241,"w":106,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":813,"y":771,"w":106,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ApronBack.png": +{ + "frame": {"x":975,"y":1092,"w":47,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":645,"w":47,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/SockLeftKneel.png": +{ + "frame": {"x":1047,"y":3,"w":509,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":828,"w":509,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Pointy/AnthenaL.png": +{ + "frame": {"x":1939,"y":1339,"w":54,"h":179}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":382,"y":56,"w":54,"h":179}, + "sourceSize": {"w":855,"h":1076} +}, +"Models/Pointy/HornR.png": +{ + "frame": {"x":274,"y":1813,"w":72,"h":185}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":202,"y":149,"w":72,"h":185}, + "sourceSize": {"w":855,"h":1076} +}, +"Models/Ribbon/Calf2Closed.png": +{ + "frame": {"x":1009,"y":1813,"w":240,"h":232}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":507,"y":1225,"w":240,"h":232}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Calf3Hogtie.png": +{ + "frame": {"x":2019,"y":748,"w":26,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":1107,"w":26,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/LegsKneel.png": +{ + "frame": {"x":512,"y":1540,"w":448,"h":269}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":316,"y":817,"w":448,"h":269}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/PantsKneel.png": +{ + "frame": {"x":3,"y":835,"w":459,"h":286}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":327,"y":710,"w":459,"h":286}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/PantsSpread.png": +{ + "frame": {"x":3,"y":1398,"w":343,"h":411}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":434,"y":710,"w":343,"h":411}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ShoeLeftSpread.png": +{ + "frame": {"x":350,"y":1398,"w":110,"h":129}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":641,"y":1507,"w":110,"h":129}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightWristtie.png": +{ + "frame": {"x":1487,"y":1001,"w":55,"h":276}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":491,"w":55,"h":276}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightWristtieTight.png": +{ + "frame": {"x":1487,"y":1001,"w":55,"h":276}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":491,"w":55,"h":276}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf3Hogtie.png": +{ + "frame": {"x":2019,"y":748,"w":26,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":1107,"w":26,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf3HogtieOver.png": +{ + "frame": {"x":2019,"y":748,"w":26,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":1107,"w":26,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/MaidSkirtKneel.png": +{ + "frame": {"x":1546,"y":830,"w":468,"h":225}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":339,"y":731,"w":468,"h":225}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/MaidSkirtKneelCrotchStrap.png": +{ + "frame": {"x":1546,"y":830,"w":468,"h":225}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":339,"y":731,"w":468,"h":225}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtKneel.png": +{ + "frame": {"x":527,"y":3,"w":516,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":316,"y":725,"w":516,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtKneelCrotchStrap.png": +{ + "frame": {"x":1026,"y":1269,"w":455,"h":249}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":365,"y":725,"w":455,"h":249}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderLeftUp.png": +{ + "frame": {"x":1485,"y":1281,"w":57,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":670,"y":297,"w":57,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeTied.png": +{ + "frame": {"x":1265,"y":1522,"w":389,"h":287}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":418,"y":410,"w":389,"h":287}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/HandLeftFront.png": +{ + "frame": {"x":1026,"y":491,"w":470,"h":501}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":470,"h":501}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Spats/SpatsClosed.png": +{ + "frame": {"x":964,"y":1544,"w":297,"h":265}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":738,"w":297,"h":265}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/BraRadial.png": +{ + "frame": {"x":464,"y":1231,"w":45,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":553,"y":552,"w":45,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimWristRightYoked.png": +{ + "frame": {"x":274,"y":2002,"w":70,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":305,"y":393,"w":70,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/WristRightCrossed.png": +{ + "frame": {"x":1500,"y":928,"w":42,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":631,"y":596,"w":42,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLeftKneelClosed.png": +{ + "frame": {"x":1546,"y":640,"w":469,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":902,"w":469,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeLeftHogtie.png": +{ + "frame": {"x":966,"y":1367,"w":56,"h":173}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":964,"w":56,"h":173}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/ApprenticeHatPuff.png": +{ + "frame": {"x":975,"y":1301,"w":47,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":774,"y":36,"w":47,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtKneel.png": +{ + "frame": {"x":1560,"y":3,"w":483,"h":314}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":302,"y":775,"w":483,"h":314}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtKneelCrotchStrap.png": +{ + "frame": {"x":521,"y":266,"w":509,"h":204}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":333,"y":774,"w":509,"h":204}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveRightFront.png": +{ + "frame": {"x":350,"y":1582,"w":158,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":426,"y":460,"w":158,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoUpperBeltBuckle.png": +{ + "frame": {"x":975,"y":1234,"w":47,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":628,"w":47,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SkirtClosedCrotchStrap.png": +{ + "frame": {"x":1546,"y":1059,"w":389,"h":459}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":409,"y":761,"w":389,"h":459}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas28.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas28.webp b/TextureAtlas/atlas28.webp new file mode 100644 index 000000000..77d067160 Binary files /dev/null and b/TextureAtlas/atlas28.webp differ diff --git a/TextureAtlas/atlas29.json b/TextureAtlas/atlas29.json new file mode 100644 index 000000000..2de99668b --- /dev/null +++ b/TextureAtlas/atlas29.json @@ -0,0 +1,733 @@ +{"frames": { + +"Models/ArmorChain/Shirt.png": +{ + "frame": {"x":1017,"y":506,"w":278,"h":418}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":400,"w":278,"h":418}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/ShirtUp.png": +{ + "frame": {"x":1333,"y":3,"w":278,"h":418}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":400,"w":278,"h":418}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/SkirtBeltKneel.png": +{ + "frame": {"x":1069,"y":928,"w":289,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":754,"w":289,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/BootLeftSpread.png": +{ + "frame": {"x":484,"y":506,"w":132,"h":436}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":635,"y":1191,"w":132,"h":436}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShoeRightSpread.png": +{ + "frame": {"x":1916,"y":1716,"w":129,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":1448,"w":129,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmLeftBoxtie.png": +{ + "frame": {"x":1362,"y":924,"w":109,"h":280}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":662,"y":404,"w":109,"h":280}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/LegSockLeftSpread.png": +{ + "frame": {"x":1151,"y":1399,"w":159,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":602,"y":904,"w":159,"h":17}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmLeftUp.png": +{ + "frame": {"x":1151,"y":1000,"w":207,"h":395}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":626,"y":167,"w":207,"h":395}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/China/DressSkirtCrotchStrap.png": +{ + "frame": {"x":1716,"y":952,"w":329,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":734,"w":329,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/FutureRim.png": +{ + "frame": {"x":1920,"y":915,"w":47,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":397,"w":47,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Corsets/BuckleCorset.png": +{ + "frame": {"x":1362,"y":1208,"w":260,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":637,"w":260,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenLeftFree.png": +{ + "frame": {"x":1626,"y":1352,"w":86,"h":139}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":593,"w":86,"h":139}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/ShinyBalletLeftKneelClosed.png": +{ + "frame": {"x":3,"y":1920,"w":293,"h":125}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":667,"y":928,"w":293,"h":125}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberLink/AnkleLinkSpread.png": +{ + "frame": {"x":182,"y":1445,"w":129,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":558,"y":1446,"w":129,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberLink/ThighLinkSpread.png": +{ + "frame": {"x":315,"y":1445,"w":128,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":538,"y":1036,"w":128,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenLeftFree.png": +{ + "frame": {"x":1626,"y":1352,"w":86,"h":139}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":593,"w":86,"h":139}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/LeftLegsBeltsKneelClosed.png": +{ + "frame": {"x":1615,"y":3,"w":428,"h":393}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":308,"y":697,"w":428,"h":393}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftKneel.png": +{ + "frame": {"x":1629,"y":806,"w":174,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":848,"w":174,"h":142}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftKneelClosed.png": +{ + "frame": {"x":1629,"y":806,"w":174,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":848,"w":174,"h":142}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BandKneel.png": +{ + "frame": {"x":1112,"y":425,"w":278,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":748,"w":278,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BandKneelCrotchStrap.png": +{ + "frame": {"x":1112,"y":425,"w":278,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":748,"w":278,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmLeftFree.png": +{ + "frame": {"x":534,"y":3,"w":209,"h":449}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":413,"w":209,"h":449}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/ShoeLeftSpread.png": +{ + "frame": {"x":1916,"y":1915,"w":111,"h":130}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":641,"y":1507,"w":111,"h":130}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/ShoeRightClosed.png": +{ + "frame": {"x":1493,"y":1399,"w":119,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":1547,"w":119,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandRightUp.png": +{ + "frame": {"x":1944,"y":1495,"w":101,"h":86}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":349,"w":101,"h":86}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/Collar.png": +{ + "frame": {"x":447,"y":1443,"w":86,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":584,"y":393,"w":86,"h":25}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/BrowsSurprised.png": +{ + "frame": {"x":663,"y":1443,"w":39,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":526,"y":247,"w":39,"h":25}, + "sourceSize": {"w":738,"h":409} +}, +"Models/EyesDai2/BrowsSurprised.png": +{ + "frame": {"x":747,"y":426,"w":36,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":241,"w":36,"h":26}, + "sourceSize": {"w":738,"h":409} +}, +"Models/FaceFang/MouthSmile.png": +{ + "frame": {"x":1971,"y":915,"w":44,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":316,"w":44,"h":33}, + "sourceSize": {"w":700,"h":436} +}, +"Models/FaceKoi/EyesClosed.png": +{ + "frame": {"x":1866,"y":915,"w":50,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyesClosed.png": +{ + "frame": {"x":1866,"y":915,"w":50,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyesClosed.png": +{ + "frame": {"x":1866,"y":915,"w":50,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/EyesClosed.png": +{ + "frame": {"x":1866,"y":915,"w":50,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyesClosed.png": +{ + "frame": {"x":1866,"y":915,"w":50,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Festive/Fluff.png": +{ + "frame": {"x":1394,"y":425,"w":231,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":497,"y":152,"w":231,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/StrapBotClosed.png": +{ + "frame": {"x":1475,"y":952,"w":237,"h":252}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":467,"y":666,"w":237,"h":252}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/BlondeFrontM.png": +{ + "frame": {"x":747,"y":3,"w":277,"h":419}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":99,"w":277,"h":419}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherRightKneel.png": +{ + "frame": {"x":1960,"y":1384,"w":85,"h":105}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":311,"y":834,"w":85,"h":105}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/StrapsArmsWristtie.png": +{ + "frame": {"x":1807,"y":915,"w":55,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":686,"y":597,"w":55,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowLeftUp.png": +{ + "frame": {"x":683,"y":456,"w":100,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":261,"w":100,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/LegsHogtie.png": +{ + "frame": {"x":1028,"y":3,"w":301,"h":418}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":790,"w":301,"h":418}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandWristLeftYoked.png": +{ + "frame": {"x":604,"y":1443,"w":55,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":879,"y":402,"w":55,"h":25}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareThighLeftClosed.png": +{ + "frame": {"x":398,"y":961,"w":105,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":589,"y":1051,"w":105,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/LegLegbinderKneelClosed.png": +{ + "frame": {"x":464,"y":1472,"w":355,"h":436}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":411,"y":640,"w":355,"h":436}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeOverKneel.png": +{ + "frame": {"x":787,"y":426,"w":321,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":866,"w":321,"h":76}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightYoked.png": +{ + "frame": {"x":1475,"y":506,"w":150,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":311,"y":389,"w":150,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/BootLeftKneel.png": +{ + "frame": {"x":1629,"y":400,"w":416,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":509,"y":891,"w":416,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressDecoBack.png": +{ + "frame": {"x":2019,"y":915,"w":26,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":721,"y":815,"w":26,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardLeftFront.png": +{ + "frame": {"x":1626,"y":1208,"w":86,"h":140}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":666,"y":529,"w":86,"h":140}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SkirtKneel.png": +{ + "frame": {"x":1629,"y":598,"w":415,"h":204}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":364,"y":738,"w":415,"h":204}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/Cherry.png": +{ + "frame": {"x":1245,"y":1897,"w":275,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":768,"w":275,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Thigh3KneelClosed.png": +{ + "frame": {"x":1350,"y":1716,"w":170,"h":157}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":826,"w":170,"h":157}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopThigh3Closed.png": +{ + "frame": {"x":773,"y":936,"w":292,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":918,"w":292,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/PauldronsTied.png": +{ + "frame": {"x":1716,"y":1297,"w":329,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":421,"w":329,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SkirtOverKneelCrotchStrap.png": +{ + "frame": {"x":1807,"y":806,"w":238,"h":105}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":538,"y":801,"w":238,"h":105}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf2Closed.png": +{ + "frame": {"x":1104,"y":1425,"w":210,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":1327,"w":210,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/CuffsFront.png": +{ + "frame": {"x":365,"y":458,"w":190,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":536,"w":190,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RopeOld/ArmsBoxtie.png": +{ + "frame": {"x":638,"y":1912,"w":307,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":502,"w":307,"h":133}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RopeOld/ChestLower.png": +{ + "frame": {"x":169,"y":961,"w":225,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":600,"w":225,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/AnkleLeftKneelClosed.png": +{ + "frame": {"x":300,"y":1917,"w":334,"h":128}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":410,"y":953,"w":334,"h":128}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/HandRightYoked.png": +{ + "frame": {"x":1944,"y":1585,"w":92,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":299,"y":287,"w":92,"h":127}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/LegRightClosed.png": +{ + "frame": {"x":138,"y":1472,"w":151,"h":442}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":802,"w":151,"h":442}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/CollarStripe.png": +{ + "frame": {"x":1716,"y":1384,"w":240,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":510,"y":412,"w":240,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/LegLeftClosed.png": +{ + "frame": {"x":3,"y":506,"w":162,"h":490}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":580,"y":755,"w":162,"h":490}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/LegLeftHogtie.png": +{ + "frame": {"x":365,"y":3,"w":165,"h":451}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":755,"w":165,"h":451}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/LegLeftKneelClosed.png": +{ + "frame": {"x":1524,"y":1716,"w":388,"h":329}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":387,"y":751,"w":388,"h":329}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/RPArmbinder Back.png": +{ + "frame": {"x":169,"y":506,"w":311,"h":451}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":63,"y":75,"w":311,"h":451}, + "sourceSize": {"w":500,"h":600} +}, +"Models/SteelCuffs/RimThighRightClosed.png": +{ + "frame": {"x":559,"y":456,"w":120,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":995,"w":120,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ThighLeftClosed.png": +{ + "frame": {"x":1318,"y":1399,"w":171,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":566,"y":977,"w":171,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusWingLight.png": +{ + "frame": {"x":706,"y":1425,"w":394,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":425,"y":379,"w":394,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/SwimsuitKneel.png": +{ + "frame": {"x":353,"y":1000,"w":346,"h":439}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":418,"y":415,"w":346,"h":439}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/AnklesKneelClosed.png": +{ + "frame": {"x":1716,"y":1146,"w":329,"h":147}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":936,"w":329,"h":147}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/LegsKneelClosed.png": +{ + "frame": {"x":620,"y":506,"w":393,"h":426}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":386,"y":652,"w":393,"h":426}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/RightLegsKneelClosed.png": +{ + "frame": {"x":823,"y":1472,"w":362,"h":421}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":652,"w":362,"h":421}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmLeftBoxtie.png": +{ + "frame": {"x":1626,"y":1495,"w":314,"h":217}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":465,"w":314,"h":217}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/RightLegsClosed.png": +{ + "frame": {"x":3,"y":3,"w":358,"h":499}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":652,"w":358,"h":499}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ForeArmLeftFront.png": +{ + "frame": {"x":1475,"y":761,"w":150,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":616,"y":535,"w":150,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SockLeftHogtie.png": +{ + "frame": {"x":3,"y":1000,"w":175,"h":468}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":569,"y":737,"w":175,"h":468}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveRightYoked.png": +{ + "frame": {"x":1350,"y":1472,"w":272,"h":240}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":291,"y":393,"w":272,"h":240}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeLeftClosed.png": +{ + "frame": {"x":182,"y":1000,"w":167,"h":441}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":1193,"w":167,"h":441}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeLeftClosedRopesAnkle.png": +{ + "frame": {"x":293,"y":1472,"w":167,"h":441}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":1193,"w":167,"h":441}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeLeftSpread.png": +{ + "frame": {"x":3,"y":1472,"w":131,"h":444}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":637,"y":1200,"w":131,"h":444}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeRightSpread.png": +{ + "frame": {"x":1189,"y":1472,"w":157,"h":421}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":1224,"w":157,"h":421}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtSplit.png": +{ + "frame": {"x":703,"y":1000,"w":444,"h":421}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":393,"y":772,"w":444,"h":421}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/BandAnkleLeftClosed.png": +{ + "frame": {"x":537,"y":1443,"w":63,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":597,"y":1441,"w":63,"h":25}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/BandAnkleRightClosed.png": +{ + "frame": {"x":537,"y":1443,"w":63,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":544,"y":1438,"w":63,"h":25}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/BandAnkleRightSpread.png": +{ + "frame": {"x":537,"y":1443,"w":63,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":497,"y":1434,"w":63,"h":25}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/BeltHardwareMid.png": +{ + "frame": {"x":507,"y":946,"w":262,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":689,"w":262,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegLeftHogtie.png": +{ + "frame": {"x":1299,"y":506,"w":172,"h":414}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":577,"y":792,"w":172,"h":414}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoLowerBandKneel.png": +{ + "frame": {"x":949,"y":1897,"w":292,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":762,"w":292,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas29.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas29.webp b/TextureAtlas/atlas29.webp new file mode 100644 index 000000000..e7ffa9b1b Binary files /dev/null and b/TextureAtlas/atlas29.webp differ diff --git a/TextureAtlas/atlas3.json b/TextureAtlas/atlas3.json new file mode 100644 index 000000000..84647f6e1 --- /dev/null +++ b/TextureAtlas/atlas3.json @@ -0,0 +1,173 @@ +{"frames": { + +"Models/ArmorPlate/BootRightSpread.png": +{ + "frame": {"x":1825,"y":1637,"w":153,"h":408}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":1219,"w":153,"h":408}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenThighLeftSpread.png": +{ + "frame": {"x":1982,"y":1963,"w":63,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":997,"w":63,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/Harness.png": +{ + "frame": {"x":1825,"y":1137,"w":220,"h":275}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":113,"w":220,"h":275}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmLeftBoxtie.png": +{ + "frame": {"x":1696,"y":1638,"w":125,"h":249}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":651,"y":442,"w":125,"h":249}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceKoi/MouthNeutral.png": +{ + "frame": {"x":1982,"y":2038,"w":38,"h":7}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":116,"y":245,"w":38,"h":7}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Festive/StrapOverbust.png": +{ + "frame": {"x":1982,"y":1758,"w":63,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":543,"y":518,"w":63,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureBox/Back.png": +{ + "frame": {"x":3,"y":3,"w":907,"h":1631}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":163,"y":35,"w":907,"h":1631}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureBox/Rim.png": +{ + "frame": {"x":914,"y":3,"w":907,"h":1631}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":163,"y":35,"w":907,"h":1631}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/FootLeftHogtie.png": +{ + "frame": {"x":1982,"y":1637,"w":63,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":729,"y":789,"w":63,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/KneeRightSpread.png": +{ + "frame": {"x":1696,"y":1891,"w":115,"h":154}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":1150,"w":115,"h":154}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ShoeLeftHogtie.png": +{ + "frame": {"x":1825,"y":3,"w":220,"h":772}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":794,"w":220,"h":772}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveLeftFree.png": +{ + "frame": {"x":1825,"y":779,"w":220,"h":354}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":509,"w":220,"h":354}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/PantsClosed.png": +{ + "frame": {"x":324,"y":1638,"w":309,"h":407}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":710,"w":309,"h":407}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Harness.png": +{ + "frame": {"x":1825,"y":1416,"w":220,"h":217}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":414,"w":220,"h":217}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/LegsClosed.png": +{ + "frame": {"x":637,"y":1638,"w":349,"h":406}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":652,"w":349,"h":406}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/LegsHogtie.png": +{ + "frame": {"x":990,"y":1638,"w":349,"h":406}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":652,"w":349,"h":406}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/RightLegsClosed.png": +{ + "frame": {"x":1343,"y":1638,"w":349,"h":406}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":652,"w":349,"h":406}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/RightLegsHogtie.png": +{ + "frame": {"x":1343,"y":1638,"w":349,"h":406}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":652,"w":349,"h":406}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SearchlightPouch.png": +{ + "frame": {"x":1982,"y":1869,"w":63,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":656,"y":496,"w":63,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessLower.png": +{ + "frame": {"x":3,"y":1638,"w":317,"h":407}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":547,"w":317,"h":407}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas3.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas3.webp b/TextureAtlas/atlas3.webp new file mode 100644 index 000000000..1683f768a Binary files /dev/null and b/TextureAtlas/atlas3.webp differ diff --git a/TextureAtlas/atlas30.json b/TextureAtlas/atlas30.json new file mode 100644 index 000000000..56263c8c9 --- /dev/null +++ b/TextureAtlas/atlas30.json @@ -0,0 +1,693 @@ +{"frames": { + +"Models/Body/HandRightFront.png": +{ + "frame": {"x":1780,"y":3,"w":265,"h":335}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":354,"y":244,"w":265,"h":335}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/LeotardClosed.png": +{ + "frame": {"x":420,"y":1035,"w":270,"h":395}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":518,"w":270,"h":395}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cape/ShouldersYoked.png": +{ + "frame": {"x":900,"y":3,"w":440,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":413,"y":386,"w":440,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProtoLining.png": +{ + "frame": {"x":1037,"y":1515,"w":270,"h":226}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":413,"w":270,"h":226}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/ProtoPlug.png": +{ + "frame": {"x":2008,"y":2024,"w":37,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":558,"y":906,"w":37,"h":17}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/China/Highlights.png": +{ + "frame": {"x":1311,"y":1591,"w":107,"h":132}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":394,"w":107,"h":132}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenRightFree.png": +{ + "frame": {"x":983,"y":1681,"w":48,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":341,"y":602,"w":48,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowLongMittenRightFront.png": +{ + "frame": {"x":335,"y":1347,"w":67,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":413,"y":496,"w":67,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockThighRightSpread.png": +{ + "frame": {"x":872,"y":301,"w":23,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":1016,"w":23,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockWristLeftFree.png": +{ + "frame": {"x":872,"y":371,"w":23,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":833,"y":750,"w":23,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenThighRightSpread.png": +{ + "frame": {"x":1250,"y":1434,"w":57,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":998,"w":57,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenRightFree.png": +{ + "frame": {"x":983,"y":1681,"w":48,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":341,"y":602,"w":48,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenRightFront.png": +{ + "frame": {"x":335,"y":1347,"w":67,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":413,"y":496,"w":67,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/LegsHogtie.png": +{ + "frame": {"x":1422,"y":1591,"w":297,"h":313}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":907,"w":297,"h":313}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BeltPin.png": +{ + "frame": {"x":872,"y":339,"w":23,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":558,"y":790,"w":23,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftDecoCleanClosed.png": +{ + "frame": {"x":693,"y":1477,"w":68,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":605,"y":1449,"w":68,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftDecoClosed.png": +{ + "frame": {"x":765,"y":1477,"w":68,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":605,"y":1449,"w":68,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftLockSpread.png": +{ + "frame": {"x":661,"y":1455,"w":28,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":738,"y":1422,"w":28,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightDecoCleanClosed.png": +{ + "frame": {"x":837,"y":1477,"w":57,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":532,"y":1444,"w":57,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightBoxtie.png": +{ + "frame": {"x":392,"y":1145,"w":24,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":610,"w":24,"h":17}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightDecoCleanClosed.png": +{ + "frame": {"x":1575,"y":2014,"w":94,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":1055,"w":94,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseSkirtLone.png": +{ + "frame": {"x":1344,"y":3,"w":432,"h":307}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":397,"y":638,"w":432,"h":307}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseTorso.png": +{ + "frame": {"x":3,"y":1060,"w":385,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":559,"w":385,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtSplitBelt.png": +{ + "frame": {"x":701,"y":1681,"w":278,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":765,"w":278,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtSplitKneel.png": +{ + "frame": {"x":445,"y":301,"w":423,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":360,"y":761,"w":423,"h":216}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/SkirtKneelCrotchStrap.png": +{ + "frame": {"x":1723,"y":1417,"w":322,"h":260}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":318,"y":749,"w":322,"h":260}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/BrowsAnnoyed.png": +{ + "frame": {"x":1673,"y":2014,"w":46,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":531,"y":247,"w":46,"h":24}, + "sourceSize": {"w":765,"h":427} +}, +"Models/FaceDask/BrowsSurprised.png": +{ + "frame": {"x":661,"y":1434,"w":29,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":543,"y":254,"w":29,"h":17}, + "sourceSize": {"w":700,"h":400} +}, +"Models/GagLatex/Harness.png": +{ + "frame": {"x":835,"y":1024,"w":60,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":101,"y":9,"w":60,"h":208}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BigBallStrapSegmented.png": +{ + "frame": {"x":1422,"y":2014,"w":149,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":233,"w":149,"h":31}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/BackShort.png": +{ + "frame": {"x":701,"y":1745,"w":364,"h":300}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":113,"w":364,"h":300}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/HatBack.png": +{ + "frame": {"x":661,"y":1515,"w":372,"h":162}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":144,"w":372,"h":162}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/BeltsChestBoxtie.png": +{ + "frame": {"x":1740,"y":656,"w":305,"h":408}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":385,"w":305,"h":408}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandAnkleLeftKneelClosed.png": +{ + "frame": {"x":392,"y":1166,"w":22,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":945,"w":22,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ThighRightSpread.png": +{ + "frame": {"x":1108,"y":1434,"w":138,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":1018,"w":138,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowRightCrossed.png": +{ + "frame": {"x":392,"y":1060,"w":24,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":439,"y":577,"w":24,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/LegsKneelClosed.png": +{ + "frame": {"x":1069,"y":1745,"w":349,"h":300}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":762,"w":349,"h":300}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/ShouldersYoked.png": +{ + "frame": {"x":455,"y":144,"w":440,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":413,"y":386,"w":440,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/LegLegbinderHogtie.png": +{ + "frame": {"x":835,"y":807,"w":60,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":675,"y":970,"w":60,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/ShoeLeftClosed.png": +{ + "frame": {"x":1904,"y":1883,"w":141,"h":137}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":529,"y":1493,"w":141,"h":137}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SkirtCrotchStrap.png": +{ + "frame": {"x":3,"y":1236,"w":328,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":742,"w":328,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeCrotchStrap.png": +{ + "frame": {"x":1725,"y":1068,"w":320,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":832,"w":320,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeKneel.png": +{ + "frame": {"x":3,"y":596,"w":415,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":371,"y":855,"w":415,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressSkirtHemHogtie.png": +{ + "frame": {"x":899,"y":632,"w":411,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":922,"w":411,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletLeftFree.png": +{ + "frame": {"x":694,"y":1236,"w":201,"h":237}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":733,"y":643,"w":201,"h":237}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveLeftStripeFree.png": +{ + "frame": {"x":1904,"y":2024,"w":100,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":695,"y":612,"w":100,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronStrapYoked.png": +{ + "frame": {"x":335,"y":1236,"w":81,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":450,"w":81,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/SockRightKneel.png": +{ + "frame": {"x":899,"y":380,"w":418,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":313,"y":816,"w":418,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SkirtKneelCrotchStrap.png": +{ + "frame": {"x":3,"y":395,"w":415,"h":197}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":364,"y":738,"w":415,"h":197}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SkirtOverKneelCrotchStrap.png": +{ + "frame": {"x":1321,"y":566,"w":415,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":364,"y":739,"w":415,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/InvertedRoseKneel.png": +{ + "frame": {"x":1422,"y":1908,"w":297,"h":102}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":754,"w":297,"h":102}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/Arms.png": +{ + "frame": {"x":420,"y":718,"w":411,"h":313}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":386,"y":404,"w":411,"h":313}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Calf2Hogtie.png": +{ + "frame": {"x":872,"y":470,"w":22,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":704,"y":1023,"w":22,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopLegsKneel.png": +{ + "frame": {"x":3,"y":3,"w":448,"h":269}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":316,"y":817,"w":448,"h":269}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/BaseKneel.png": +{ + "frame": {"x":1725,"y":1146,"w":319,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":439,"y":587,"w":319,"h":267}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/GoldBaseClosed.png": +{ + "frame": {"x":1757,"y":342,"w":288,"h":310}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":606,"w":288,"h":310}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/RibbonBackHogtie.png": +{ + "frame": {"x":3,"y":1434,"w":327,"h":243}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":549,"y":623,"w":327,"h":243}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SkirtKneel.png": +{ + "frame": {"x":1329,"y":314,"w":424,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":377,"y":716,"w":424,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SkirtKneelCrotchStrap.png": +{ + "frame": {"x":899,"y":740,"w":410,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":390,"y":716,"w":410,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightBoxtie.png": +{ + "frame": {"x":841,"y":527,"w":54,"h":276}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":491,"w":54,"h":276}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightBoxtieTight.png": +{ + "frame": {"x":841,"y":527,"w":54,"h":276}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":491,"w":54,"h":276}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf2Hogtie.png": +{ + "frame": {"x":872,"y":470,"w":22,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":704,"y":1023,"w":22,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf2HogtieOver.png": +{ + "frame": {"x":872,"y":470,"w":22,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":704,"y":1023,"w":22,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh3KneelClosedOver.png": +{ + "frame": {"x":1723,"y":1883,"w":177,"h":162}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":510,"y":823,"w":177,"h":162}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/HemRightTied.png": +{ + "frame": {"x":392,"y":1103,"w":24,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":548,"w":24,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Arms2.png": +{ + "frame": {"x":1723,"y":1681,"w":322,"h":198}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":556,"w":322,"h":198}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtOverKneelCrotchStrap.png": +{ + "frame": {"x":899,"y":160,"w":426,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":758,"w":426,"h":216}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnderKneelCrotchStrap.png": +{ + "frame": {"x":899,"y":1434,"w":205,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":769,"w":205,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeStripeYoked.png": +{ + "frame": {"x":3,"y":276,"w":438,"h":115}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":401,"y":425,"w":438,"h":115}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeYoked.png": +{ + "frame": {"x":455,"y":3,"w":441,"h":137}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":404,"w":441,"h":137}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/TorsoLowerKneel.png": +{ + "frame": {"x":3,"y":1681,"w":338,"h":364}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":416,"y":537,"w":338,"h":364}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmRightBoxtie.png": +{ + "frame": {"x":872,"y":402,"w":22,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":613,"w":22,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/LegsKneelClosed.png": +{ + "frame": {"x":3,"y":687,"w":413,"h":369}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":652,"w":413,"h":369}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/DressSkirt.png": +{ + "frame": {"x":1313,"y":772,"w":408,"h":392}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":406,"y":626,"w":408,"h":392}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/DressChestBoxtie.png": +{ + "frame": {"x":899,"y":934,"w":408,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":391,"w":408,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/DressChestFree.png": +{ + "frame": {"x":1311,"y":1168,"w":408,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":391,"w":408,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/DressChestWristtie.png": +{ + "frame": {"x":899,"y":1184,"w":408,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":391,"w":408,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/ForeArmRightFront.png": +{ + "frame": {"x":694,"y":1035,"w":121,"h":197}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":422,"y":522,"w":121,"h":197}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeLeftKneel.png": +{ + "frame": {"x":1311,"y":1418,"w":408,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":921,"w":408,"h":169}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/SkirtKneelCrotchStrap.png": +{ + "frame": {"x":422,"y":521,"w":415,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":379,"y":696,"w":415,"h":193}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseRightBoxtie.png": +{ + "frame": {"x":345,"y":1681,"w":163,"h":364}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":420,"w":163,"h":364}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseRightFree.png": +{ + "frame": {"x":345,"y":1681,"w":163,"h":364}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":420,"w":163,"h":364}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseRightWristtie.png": +{ + "frame": {"x":345,"y":1681,"w":163,"h":364}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":420,"w":163,"h":364}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SkirtOverKneelCrotchStrap.png": +{ + "frame": {"x":334,"y":1434,"w":323,"h":243}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":546,"y":762,"w":323,"h":243}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SleeveRightUp.png": +{ + "frame": {"x":512,"y":1681,"w":185,"h":361}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":409,"y":160,"w":185,"h":361}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas30.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas30.webp b/TextureAtlas/atlas30.webp new file mode 100644 index 000000000..678d189ee Binary files /dev/null and b/TextureAtlas/atlas30.webp differ diff --git a/TextureAtlas/atlas31.json b/TextureAtlas/atlas31.json new file mode 100644 index 000000000..54e24b2d2 --- /dev/null +++ b/TextureAtlas/atlas31.json @@ -0,0 +1,653 @@ +{"frames": { + +"Models/Bunny/HighLeotard.png": +{ + "frame": {"x":307,"y":1237,"w":266,"h":397}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":518,"w":266,"h":397}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/HighLeotardClosed.png": +{ + "frame": {"x":618,"y":819,"w":266,"h":395}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":518,"w":266,"h":395}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/Leotard.png": +{ + "frame": {"x":612,"y":3,"w":269,"h":397}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":518,"w":269,"h":397}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/HandRightYoked.png": +{ + "frame": {"x":1486,"y":1471,"w":183,"h":326}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":183,"h":326}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/Proto.png": +{ + "frame": {"x":311,"y":415,"w":316,"h":400}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":523,"w":316,"h":400}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowLongMittenLeftWristtie.png": +{ + "frame": {"x":1598,"y":1974,"w":71,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":716,"y":525,"w":71,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayAnkleRightClosed.png": +{ + "frame": {"x":888,"y":1556,"w":34,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":537,"y":1433,"w":34,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockBelt.png": +{ + "frame": {"x":2023,"y":1894,"w":22,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":557,"y":703,"w":22,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockThighRightKneel.png": +{ + "frame": {"x":2023,"y":1858,"w":22,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":385,"y":830,"w":22,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockThighRightKneelClosed.png": +{ + "frame": {"x":2023,"y":1858,"w":22,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":385,"y":830,"w":22,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberLink/GlowAnkleLinkSpread.png": +{ + "frame": {"x":1891,"y":1170,"w":150,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":547,"y":1436,"w":150,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenLeftWristtie.png": +{ + "frame": {"x":1598,"y":1974,"w":71,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":716,"y":525,"w":71,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockBandBoxtie.png": +{ + "frame": {"x":1250,"y":747,"w":26,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":759,"y":606,"w":26,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightDecoCrossed.png": +{ + "frame": {"x":1250,"y":706,"w":26,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":669,"y":601,"w":26,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceChestCups.png": +{ + "frame": {"x":979,"y":706,"w":267,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":534,"w":267,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtSplit.png": +{ + "frame": {"x":1280,"y":222,"w":400,"h":385}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":408,"y":785,"w":400,"h":385}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtSplitClosed.png": +{ + "frame": {"x":1280,"y":222,"w":400,"h":385}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":408,"y":785,"w":400,"h":385}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/Brows2Sad.png": +{ + "frame": {"x":781,"y":1612,"w":79,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":248,"w":79,"h":17}, + "sourceSize": {"w":726,"h":532} +}, +"Models/FaceDask/Brows2Sad.png": +{ + "frame": {"x":1041,"y":2026,"w":33,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":235,"w":33,"h":17}, + "sourceSize": {"w":700,"h":400} +}, +"Models/FaceDask/BrowsAnnoyed.png": +{ + "frame": {"x":1078,"y":2026,"w":31,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":545,"y":261,"w":31,"h":17}, + "sourceSize": {"w":700,"h":400} +}, +"Models/FaceDask/BrowsNeutral.png": +{ + "frame": {"x":747,"y":1612,"w":30,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":241,"w":30,"h":18}, + "sourceSize": {"w":700,"h":400} +}, +"Models/FaceKjus/BrowsNeutral.png": +{ + "frame": {"x":843,"y":2026,"w":49,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":529,"y":250,"w":49,"h":17}, + "sourceSize": {"w":744,"h":461} +}, +"Models/FaceKjus/EyesClosed.png": +{ + "frame": {"x":896,"y":2026,"w":48,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":294,"w":48,"h":17}, + "sourceSize": {"w":852,"h":524} +}, +"Models/FaceKjus/WhitesEyesClosed.png": +{ + "frame": {"x":896,"y":2026,"w":48,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":294,"w":48,"h":17}, + "sourceSize": {"w":852,"h":524} +}, +"Models/Festive/ButtonsMid.png": +{ + "frame": {"x":2023,"y":1808,"w":22,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":653,"w":22,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Bow.png": +{ + "frame": {"x":1683,"y":809,"w":362,"h":357}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":97,"w":362,"h":357}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/BowFrills.png": +{ + "frame": {"x":1280,"y":807,"w":399,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":103,"w":399,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/CurlyPonytail.png": +{ + "frame": {"x":747,"y":1218,"w":137,"h":390}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":657,"y":102,"w":137,"h":390}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/FrontStraight.png": +{ + "frame": {"x":3,"y":827,"w":300,"h":408}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":112,"w":300,"h":408}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/FrontStraight_Overstrap.png": +{ + "frame": {"x":3,"y":1239,"w":300,"h":408}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":112,"w":300,"h":408}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/StraightBangs.png": +{ + "frame": {"x":313,"y":3,"w":295,"h":399}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":110,"w":295,"h":399}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair2_FrontC.png": +{ + "frame": {"x":1598,"y":1801,"w":71,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":157,"w":71,"h":169}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/BeltsChestWristtie.png": +{ + "frame": {"x":307,"y":827,"w":307,"h":406}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":387,"w":307,"h":406}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/StrapsChestBoxtie.png": +{ + "frame": {"x":3,"y":3,"w":306,"h":408}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":385,"w":306,"h":408}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/StrapsChestCrossed.png": +{ + "frame": {"x":3,"y":415,"w":304,"h":408}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":385,"w":304,"h":408}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockAnkleLeftClosed.png": +{ + "frame": {"x":2023,"y":1929,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":594,"y":1446,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockAnkleRightClosed.png": +{ + "frame": {"x":2023,"y":1959,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":569,"y":1445,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockAnkleRightSpread.png": +{ + "frame": {"x":2023,"y":1989,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":529,"y":1441,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowLeftBoxtie.png": +{ + "frame": {"x":2023,"y":2019,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":747,"y":601,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowLeftFront.png": +{ + "frame": {"x":948,"y":2026,"w":46,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":726,"y":622,"w":46,"h":17}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandWristRightYoked.png": +{ + "frame": {"x":864,"y":1612,"w":58,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":316,"y":409,"w":58,"h":17}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/ArmsBelts.png": +{ + "frame": {"x":1280,"y":3,"w":404,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":392,"y":501,"w":404,"h":215}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareWristRightFree.png": +{ + "frame": {"x":1113,"y":2023,"w":27,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":376,"y":635,"w":27,"h":17}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LeftLegsKneelClosed.png": +{ + "frame": {"x":1673,"y":1757,"w":346,"h":288}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":391,"y":810,"w":346,"h":288}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LegsHogtie.png": +{ + "frame": {"x":979,"y":399,"w":297,"h":303}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":915,"w":297,"h":303}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/CorsetStrapsUp.png": +{ + "frame": {"x":1256,"y":1633,"w":226,"h":158}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":402,"w":226,"h":158}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/Skirt.png": +{ + "frame": {"x":1673,"y":1219,"w":372,"h":204}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":415,"y":741,"w":372,"h":204}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SkirtKneelCrotchStrap.png": +{ + "frame": {"x":1280,"y":611,"w":400,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":392,"y":737,"w":400,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootRightClosed.png": +{ + "frame": {"x":472,"y":1638,"w":196,"h":397}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":1100,"w":196,"h":397}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmLeftFree.png": +{ + "frame": {"x":1080,"y":1633,"w":172,"h":386}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":686,"y":416,"w":172,"h":386}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmLeftUp.png": +{ + "frame": {"x":3,"y":1651,"w":170,"h":394}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":167,"w":170,"h":394}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffLeftCrossed.png": +{ + "frame": {"x":998,"y":2026,"w":39,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":649,"y":697,"w":39,"h":17}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/Stripes.png": +{ + "frame": {"x":926,"y":1471,"w":276,"h":158}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":761,"w":276,"h":158}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/StripesClosed.png": +{ + "frame": {"x":1206,"y":1471,"w":276,"h":158}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":761,"w":276,"h":158}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/ArmsBelts.png": +{ + "frame": {"x":1280,"y":3,"w":404,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":392,"y":501,"w":404,"h":215}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopHarness.png": +{ + "frame": {"x":1688,"y":3,"w":356,"h":350}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":394,"w":356,"h":350}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopThigh1Closed.png": +{ + "frame": {"x":1682,"y":1170,"w":205,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":1094,"w":205,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/ArmHarnessUnder.png": +{ + "frame": {"x":1684,"y":357,"w":360,"h":218}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":411,"w":360,"h":218}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/FrogThigh3Kneel.png": +{ + "frame": {"x":1684,"y":579,"w":358,"h":226}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":372,"y":842,"w":358,"h":226}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ArmLeftUp.png": +{ + "frame": {"x":631,"y":404,"w":170,"h":393}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":167,"w":170,"h":393}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/LegLeftKneelClosed.png": +{ + "frame": {"x":888,"y":1137,"w":388,"h":330}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":387,"y":751,"w":388,"h":330}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/SleeveRight.png": +{ + "frame": {"x":888,"y":1471,"w":34,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":433,"w":34,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/MaidSkirt.png": +{ + "frame": {"x":1280,"y":954,"w":398,"h":261}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/MaidSkirtClosed.png": +{ + "frame": {"x":1280,"y":954,"w":398,"h":261}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/MaidSkirtClosedCrotchStrap.png": +{ + "frame": {"x":1280,"y":954,"w":398,"h":261}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/MaidSkirtCrotchStrap.png": +{ + "frame": {"x":1280,"y":954,"w":398,"h":261}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/MaidSkirtHogtie.png": +{ + "frame": {"x":1280,"y":954,"w":398,"h":261}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/MaidSkirtHogtieCrotchStrap.png": +{ + "frame": {"x":1280,"y":954,"w":398,"h":261}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ArmLeftUp.png": +{ + "frame": {"x":805,"y":404,"w":170,"h":393}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":167,"w":170,"h":393}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/LegLeftKneel.png": +{ + "frame": {"x":888,"y":801,"w":388,"h":332}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":387,"y":751,"w":388,"h":332}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/TorsoLower.png": +{ + "frame": {"x":177,"y":1651,"w":291,"h":393}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":537,"w":291,"h":393}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/AnklesHogtie.png": +{ + "frame": {"x":843,"y":1633,"w":233,"h":389}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":955,"w":233,"h":389}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/LegsKneel.png": +{ + "frame": {"x":1673,"y":1427,"w":371,"h":326}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":408,"y":760,"w":371,"h":326}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/DressChestWristtie.png": +{ + "frame": {"x":1256,"y":1801,"w":338,"h":244}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":391,"w":338,"h":244}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/DressSkirtHogtie.png": +{ + "frame": {"x":885,"y":3,"w":391,"h":392}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":626,"w":391,"h":392}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveLeftFree.png": +{ + "frame": {"x":672,"y":1638,"w":167,"h":396}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":692,"y":412,"w":167,"h":396}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveLeftUp.png": +{ + "frame": {"x":577,"y":1237,"w":166,"h":397}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":665,"y":169,"w":166,"h":397}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/CollarHardware.png": +{ + "frame": {"x":2023,"y":1757,"w":22,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":402,"w":22,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/FCollarHardware.png": +{ + "frame": {"x":2023,"y":1757,"w":22,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":602,"y":407,"w":22,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegPadsLeftKneel.png": +{ + "frame": {"x":1280,"y":1219,"w":389,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":827,"w":389,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas31.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas31.webp b/TextureAtlas/atlas31.webp new file mode 100644 index 000000000..f79eb5637 Binary files /dev/null and b/TextureAtlas/atlas31.webp differ diff --git a/TextureAtlas/atlas32.json b/TextureAtlas/atlas32.json new file mode 100644 index 000000000..013a02c4c --- /dev/null +++ b/TextureAtlas/atlas32.json @@ -0,0 +1,581 @@ +{"frames": { + +"Models/ArmorPlate/BootLeftKneelClosed.png": +{ + "frame": {"x":3,"y":853,"w":387,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":932,"w":387,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/BreastplateHogtie.png": +{ + "frame": {"x":1163,"y":1183,"w":267,"h":209}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":466,"w":267,"h":209}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShoeLeftHogtie.png": +{ + "frame": {"x":1989,"y":410,"w":56,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":731,"y":793,"w":56,"h":144}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Arms2.png": +{ + "frame": {"x":1720,"y":1680,"w":222,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":602,"w":222,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveLeftUp.png": +{ + "frame": {"x":890,"y":1546,"w":168,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":167,"w":168,"h":267}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/SockRightKneelClosed.png": +{ + "frame": {"x":1243,"y":1793,"w":226,"h":252}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":323,"y":816,"w":226,"h":252}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmLeftBoxtie.png": +{ + "frame": {"x":1495,"y":1396,"w":109,"h":280}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":662,"y":404,"w":109,"h":280}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmRightCrossed.png": +{ + "frame": {"x":403,"y":1817,"w":96,"h":228}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":432,"w":96,"h":228}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmRightFront.png": +{ + "frame": {"x":503,"y":1817,"w":96,"h":228}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":432,"w":96,"h":228}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/LegLeftKneelClosed.png": +{ + "frame": {"x":395,"y":578,"w":388,"h":281}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":386,"y":801,"w":388,"h":281}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProtoLiningRim.png": +{ + "frame": {"x":969,"y":1817,"w":270,"h":226}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":413,"w":270,"h":226}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/China/DressSkirtKneel.png": +{ + "frame": {"x":1194,"y":345,"w":389,"h":226}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":734,"w":389,"h":226}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Corsets/HeavyCorset.png": +{ + "frame": {"x":1608,"y":1183,"w":285,"h":350}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":508,"w":285,"h":350}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/ArmsBelts.png": +{ + "frame": {"x":3,"y":3,"w":396,"h":310}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":396,"y":412,"w":396,"h":310}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/DisplayArms.png": +{ + "frame": {"x":390,"y":1140,"w":383,"h":121}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":405,"y":465,"w":383,"h":121}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/StrapsArms.png": +{ + "frame": {"x":3,"y":3,"w":396,"h":310}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":396,"y":412,"w":396,"h":310}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/CroppedBlouseTorso.png": +{ + "frame": {"x":3,"y":1010,"w":383,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":559,"w":383,"h":180}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceCorsetStripes.png": +{ + "frame": {"x":3,"y":1817,"w":265,"h":228}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":607,"w":265,"h":228}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageSkirt.png": +{ + "frame": {"x":787,"y":797,"w":384,"h":365}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":404,"y":747,"w":384,"h":365}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesK3/Eyes2Neutral.png": +{ + "frame": {"x":1898,"y":1072,"w":64,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":616,"y":260,"w":64,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/Hair2/Hair3_FrontB.png": +{ + "frame": {"x":1188,"y":575,"w":385,"h":330}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":97,"w":385,"h":330}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/ChestWristtie.png": +{ + "frame": {"x":1561,"y":925,"w":333,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":375,"w":333,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/ShouldersKneel.png": +{ + "frame": {"x":772,"y":1396,"w":366,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":407,"w":366,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LeftLegsKneel.png": +{ + "frame": {"x":796,"y":478,"w":388,"h":315}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":769,"w":388,"h":315}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LeftLegsKneelClosed.png": +{ + "frame": {"x":3,"y":317,"w":388,"h":315}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":769,"w":388,"h":315}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/ArmsBelts.png": +{ + "frame": {"x":800,"y":293,"w":390,"h":181}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":401,"y":539,"w":390,"h":181}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/LegRightLegbinderClosed.png": +{ + "frame": {"x":1966,"y":806,"w":79,"h":310}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":504,"y":1213,"w":79,"h":310}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftStripeYoked.png": +{ + "frame": {"x":1990,"y":283,"w":55,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":781,"y":503,"w":55,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressSkirtStripeHogtie.png": +{ + "frame": {"x":1197,"y":3,"w":393,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":439,"y":890,"w":393,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/Pouches.png": +{ + "frame": {"x":272,"y":1817,"w":127,"h":228}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":626,"y":647,"w":127,"h":228}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/BootLeftKneelClosed.png": +{ + "frame": {"x":1587,"y":571,"w":386,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":891,"w":386,"h":193}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressSkirtHogtie.png": +{ + "frame": {"x":3,"y":1194,"w":382,"h":326}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":661,"w":382,"h":326}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuff2RightUp.png": +{ + "frame": {"x":1720,"y":1754,"w":307,"h":291}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":531,"y":216,"w":307,"h":291}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffRightFront.png": +{ + "frame": {"x":1898,"y":925,"w":64,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":557,"w":64,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenLeftUp.png": +{ + "frame": {"x":890,"y":1546,"w":168,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":167,"w":168,"h":267}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SockLeftKneel.png": +{ + "frame": {"x":1577,"y":768,"w":385,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":510,"y":931,"w":385,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/LeftLegsKneel.png": +{ + "frame": {"x":3,"y":1524,"w":378,"h":289}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":816,"w":378,"h":289}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/LeftLegsKneelClosed.png": +{ + "frame": {"x":389,"y":1265,"w":379,"h":277}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":816,"w":379,"h":277}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/HarnessLower.png": +{ + "frame": {"x":1142,"y":1396,"w":349,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":696,"w":349,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopHarnessMid.png": +{ + "frame": {"x":1608,"y":1537,"w":353,"h":139}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":604,"w":353,"h":139}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightWristtieRopesUpper.png": +{ + "frame": {"x":1990,"y":3,"w":55,"h":276}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":491,"w":55,"h":276}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/HarnessLowerStrap.png": +{ + "frame": {"x":1977,"y":706,"w":68,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":540,"y":825,"w":68,"h":96}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ArmLeftFront.png": +{ + "frame": {"x":771,"y":1817,"w":95,"h":227}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":432,"w":95,"h":227}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/CollarUp.png": +{ + "frame": {"x":603,"y":1817,"w":164,"h":227}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":548,"y":303,"w":164,"h":227}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Mouth.png": +{ + "frame": {"x":1897,"y":1437,"w":148,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":72,"y":190,"w":148,"h":94}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Skirts/StripedSkirtOverKneel.png": +{ + "frame": {"x":3,"y":636,"w":388,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":771,"w":388,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeStripeTied.png": +{ + "frame": {"x":394,"y":863,"w":384,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":422,"w":384,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ArmLeftFront.png": +{ + "frame": {"x":870,"y":1817,"w":95,"h":227}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":432,"w":95,"h":227}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Spats/SpatsKneel.png": +{ + "frame": {"x":1593,"y":333,"w":392,"h":234}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":383,"y":738,"w":392,"h":234}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Spats/SpatsKneelClosed.png": +{ + "frame": {"x":1197,"y":91,"w":392,"h":250}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":383,"y":738,"w":392,"h":250}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/Chest.png": +{ + "frame": {"x":1176,"y":1546,"w":315,"h":243}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ChestBoxtie.png": +{ + "frame": {"x":1176,"y":1546,"w":315,"h":243}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ChestCrossed.png": +{ + "frame": {"x":1176,"y":1546,"w":315,"h":243}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ChestWristtie.png": +{ + "frame": {"x":1176,"y":1546,"w":315,"h":243}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/LegsKneel.png": +{ + "frame": {"x":1594,"y":3,"w":392,"h":326}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":387,"y":760,"w":392,"h":326}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/PetsuitTopArms.png": +{ + "frame": {"x":1175,"y":909,"w":382,"h":270}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":439,"w":382,"h":270}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/TopFullCrossed.png": +{ + "frame": {"x":385,"y":1546,"w":307,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":384,"w":307,"h":267}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/PetsuitTopArms.png": +{ + "frame": {"x":777,"y":1166,"w":382,"h":226}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":483,"w":382,"h":226}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/PetsuitTopArms.png": +{ + "frame": {"x":777,"y":1166,"w":382,"h":226}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":483,"w":382,"h":226}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/TopFullCrossed.png": +{ + "frame": {"x":385,"y":1546,"w":307,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":384,"w":307,"h":267}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmLeftBoxtie.png": +{ + "frame": {"x":1062,"y":1546,"w":110,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":669,"y":425,"w":110,"h":267}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ShoulderRightUp.png": +{ + "frame": {"x":696,"y":1546,"w":190,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":285,"w":190,"h":267}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveRightUp.png": +{ + "frame": {"x":696,"y":1546,"w":190,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":285,"w":190,"h":267}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SockRightHogtie.png": +{ + "frame": {"x":1898,"y":1120,"w":147,"h":313}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":896,"w":147,"h":313}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/FootShoeLeftHogtie.png": +{ + "frame": {"x":1989,"y":558,"w":56,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":731,"y":793,"w":56,"h":144}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtOverKneel.png": +{ + "frame": {"x":403,"y":3,"w":393,"h":288}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":386,"y":801,"w":393,"h":288}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveLeftFree.png": +{ + "frame": {"x":1495,"y":1680,"w":221,"h":365}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":499,"w":221,"h":365}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveLeftUp.png": +{ + "frame": {"x":1434,"y":1183,"w":170,"h":209}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":167,"w":170,"h":209}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegLeftKneel.png": +{ + "frame": {"x":800,"y":3,"w":393,"h":286}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":386,"y":799,"w":393,"h":286}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegLeftKneelClosed.png": +{ + "frame": {"x":403,"y":295,"w":389,"h":279}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":386,"y":799,"w":389,"h":279}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoUpperBeltStrap.png": +{ + "frame": {"x":1965,"y":1535,"w":80,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":550,"y":418,"w":80,"h":215}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas32.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas32.webp b/TextureAtlas/atlas32.webp new file mode 100644 index 000000000..2e165f24b Binary files /dev/null and b/TextureAtlas/atlas32.webp differ diff --git a/TextureAtlas/atlas33.json b/TextureAtlas/atlas33.json new file mode 100644 index 000000000..8d7caa5f7 --- /dev/null +++ b/TextureAtlas/atlas33.json @@ -0,0 +1,861 @@ +{"frames": { + +"Models/Belts/Feet2Closed.png": +{ + "frame": {"x":864,"y":699,"w":136,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":526,"y":1468,"w":136,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/RightLegs2Kneel.png": +{ + "frame": {"x":1032,"y":1505,"w":260,"h":344}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":260,"y":750,"w":260,"h":344}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/RightLegs2KneelClosed.png": +{ + "frame": {"x":1032,"y":1505,"w":260,"h":344}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":260,"y":750,"w":260,"h":344}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmLeftWristtie.png": +{ + "frame": {"x":318,"y":756,"w":119,"h":353}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":662,"y":407,"w":119,"h":353}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/FootSockLeftHogtie.png": +{ + "frame": {"x":1976,"y":1251,"w":53,"h":120}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":728,"y":792,"w":53,"h":120}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveLeftYoked.png": +{ + "frame": {"x":296,"y":1155,"w":204,"h":357}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":744,"y":279,"w":204,"h":357}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmLeftHogtie.png": +{ + "frame": {"x":505,"y":373,"w":119,"h":350}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":660,"y":411,"w":119,"h":350}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmRightUp.png": +{ + "frame": {"x":1048,"y":1155,"w":145,"h":344}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":162,"w":145,"h":344}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProtoLiningMidRim.png": +{ + "frame": {"x":1197,"y":1451,"w":230,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":616,"w":230,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/China/DressSkirtClosedCrotchStrap.png": +{ + "frame": {"x":954,"y":1855,"w":314,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":734,"w":314,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/China/DressSkirtOverKneel.png": +{ + "frame": {"x":1744,"y":1842,"w":301,"h":159}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":801,"w":301,"h":159}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Corsets/HeavyCorsetKneel.png": +{ + "frame": {"x":544,"y":756,"w":290,"h":349}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":508,"w":290,"h":349}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/AnkleLeftKneel.png": +{ + "frame": {"x":1675,"y":402,"w":60,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":705,"y":961,"w":60,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/SteelCollarRunes.png": +{ + "frame": {"x":767,"y":726,"w":93,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":396,"w":93,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/AnkleLeftKneel.png": +{ + "frame": {"x":1739,"y":402,"w":60,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":705,"y":961,"w":60,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/SteelCollarRunes.png": +{ + "frame": {"x":767,"y":726,"w":93,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":396,"w":93,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenAnkleLeftKneel.png": +{ + "frame": {"x":494,"y":1875,"w":67,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":1012,"w":67,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/ShinyBalletLeftKneel.png": +{ + "frame": {"x":1431,"y":1375,"w":309,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":651,"y":927,"w":309,"h":126}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberLink/GlowThighLinkSpread.png": +{ + "frame": {"x":899,"y":1106,"w":150,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":1026,"w":150,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenLeftYoked.png": +{ + "frame": {"x":1803,"y":402,"w":60,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":871,"y":388,"w":60,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/LockBraLines.png": +{ + "frame": {"x":1957,"y":457,"w":88,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":432,"w":88,"h":210}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/SteelCollarRunes.png": +{ + "frame": {"x":767,"y":726,"w":93,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":396,"w":93,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmLeftUp.png": +{ + "frame": {"x":1469,"y":3,"w":202,"h":338}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":637,"y":166,"w":202,"h":338}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmRightUp.png": +{ + "frame": {"x":672,"y":1155,"w":177,"h":349}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":156,"w":177,"h":349}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseCollarBoxtie.png": +{ + "frame": {"x":1376,"y":692,"w":266,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":425,"w":266,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BowCorset.png": +{ + "frame": {"x":1469,"y":1505,"w":271,"h":255}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":567,"w":271,"h":255}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageCollar.png": +{ + "frame": {"x":1539,"y":1043,"w":103,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":407,"w":103,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageSkirtOverKneel.png": +{ + "frame": {"x":1620,"y":473,"w":333,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":801,"w":333,"h":215}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai2/BrowsAnnoyed.png": +{ + "frame": {"x":505,"y":727,"w":38,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":246,"w":38,"h":25}, + "sourceSize": {"w":765,"h":427} +}, +"Models/FaceDask/Brows2Angry.png": +{ + "frame": {"x":565,"y":1875,"w":25,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":612,"y":252,"w":25,"h":23}, + "sourceSize": {"w":700,"h":400} +}, +"Models/FaceKoi/BlushLow.png": +{ + "frame": {"x":1219,"y":695,"w":153,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":56,"y":187,"w":153,"h":57}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Festive/ButtonsUnderbust.png": +{ + "frame": {"x":1646,"y":1251,"w":226,"h":120}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":589,"w":226,"h":120}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Ahoge.png": +{ + "frame": {"x":1930,"y":402,"w":115,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":99,"w":115,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/StraightBangs_Overstrap.png": +{ + "frame": {"x":408,"y":1516,"w":216,"h":355}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":154,"w":216,"h":355}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/HairAura_LeftB.png": +{ + "frame": {"x":3,"y":1541,"w":189,"h":366}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":403,"w":189,"h":366}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletLeftClosed.png": +{ + "frame": {"x":837,"y":351,"w":114,"h":344}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":569,"y":1336,"w":114,"h":344}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletLeftSpread.png": +{ + "frame": {"x":923,"y":1505,"w":105,"h":346}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":1332,"w":105,"h":346}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletRightSpread.png": +{ + "frame": {"x":955,"y":349,"w":104,"h":342}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":1334,"w":104,"h":342}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/FlatBalletLeftClosed.png": +{ + "frame": {"x":1063,"y":349,"w":104,"h":342}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":1337,"w":104,"h":342}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/FlatBalletRightSpread.png": +{ + "frame": {"x":1110,"y":3,"w":104,"h":342}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":1334,"w":104,"h":342}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/ShinyBalletLeftClosed.png": +{ + "frame": {"x":1171,"y":349,"w":104,"h":342}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":1337,"w":104,"h":342}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/ShinyBalletLeftSpread.png": +{ + "frame": {"x":1197,"y":1106,"w":105,"h":341}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":1335,"w":105,"h":341}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/ShinyBalletRightSpread.png": +{ + "frame": {"x":1218,"y":3,"w":104,"h":342}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":1334,"w":104,"h":342}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/BeltsArmsCrossed.png": +{ + "frame": {"x":282,"y":1902,"w":311,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":581,"w":311,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/StrapsArmsBoxtie.png": +{ + "frame": {"x":1646,"y":929,"w":307,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":575,"w":307,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/AnkleLeftKneel.png": +{ + "frame": {"x":1867,"y":402,"w":59,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":706,"y":956,"w":59,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandThighRightKneelClosed.png": +{ + "frame": {"x":777,"y":1109,"w":118,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":381,"y":841,"w":118,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockAnkleLeftSpread.png": +{ + "frame": {"x":611,"y":727,"w":22,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":692,"y":1443,"w":22,"h":25}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/CollarStripe.png": +{ + "frame": {"x":408,"y":1875,"w":82,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":395,"w":82,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandThighLeftSpread.png": +{ + "frame": {"x":1053,"y":1106,"w":140,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":621,"y":1027,"w":140,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveLeftYoked.png": +{ + "frame": {"x":1296,"y":1505,"w":169,"h":340}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":770,"y":297,"w":169,"h":340}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/LeotardHogtie.png": +{ + "frame": {"x":628,"y":1511,"w":291,"h":351}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":565,"w":291,"h":351}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowRightUp.png": +{ + "frame": {"x":1306,"y":1402,"w":121,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":270,"w":121,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/StrapsHardware.png": +{ + "frame": {"x":318,"y":1113,"w":175,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":764,"w":175,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeSockRightHogtie.png": +{ + "frame": {"x":637,"y":726,"w":126,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":965,"w":126,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronChestBeltsUp.png": +{ + "frame": {"x":1004,"y":695,"w":211,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":465,"w":211,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronCrossHogtie.png": +{ + "frame": {"x":2014,"y":2005,"w":31,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":805,"w":31,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronCrossKneel.png": +{ + "frame": {"x":547,"y":727,"w":30,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":756,"w":30,"h":25}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootRightKneel.png": +{ + "frame": {"x":1957,"y":671,"w":88,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":309,"y":842,"w":88,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ForeArmRightCrossed.png": +{ + "frame": {"x":1469,"y":1764,"w":271,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":602,"w":271,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmRightWristtie.png": +{ + "frame": {"x":1876,"y":1251,"w":96,"h":120}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":424,"w":96,"h":120}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/Dress.png": +{ + "frame": {"x":1272,"y":1853,"w":292,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":582,"w":292,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenLeftYoked.png": +{ + "frame": {"x":628,"y":373,"w":205,"h":349}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":744,"y":287,"w":205,"h":349}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Necklace/RubyHardware.png": +{ + "frame": {"x":581,"y":727,"w":26,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":432,"w":26,"h":25}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SockLeftClosed.png": +{ + "frame": {"x":139,"y":390,"w":161,"h":374}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":1261,"w":161,"h":374}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SockLeftSpread.png": +{ + "frame": {"x":296,"y":3,"w":131,"h":374}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":640,"y":1253,"w":131,"h":374}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SockRightClosed.png": +{ + "frame": {"x":1326,"y":3,"w":139,"h":339}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":1276,"w":139,"h":339}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ThighLeftSpread.png": +{ + "frame": {"x":504,"y":1155,"w":164,"h":352}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":606,"y":973,"w":164,"h":352}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveLeftYoked.png": +{ + "frame": {"x":196,"y":1541,"w":208,"h":357}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":743,"y":278,"w":208,"h":357}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveRightYoked.png": +{ + "frame": {"x":921,"y":3,"w":185,"h":342}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":299,"y":287,"w":185,"h":342}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Arm2Up.png": +{ + "frame": {"x":1675,"y":3,"w":370,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":240,"w":370,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/HarnessMidFlattened.png": +{ + "frame": {"x":597,"y":1875,"w":353,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":572,"w":353,"h":170}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/RightThigh2KneelClosed.png": +{ + "frame": {"x":1892,"y":2005,"w":118,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":372,"y":859,"w":118,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/RightThigh3KneelClosed.png": +{ + "frame": {"x":1741,"y":2005,"w":147,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":400,"y":812,"w":147,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopArmsWristtie.png": +{ + "frame": {"x":1646,"y":692,"w":307,"h":233}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":484,"w":307,"h":233}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ShoeLeftHogtie.png": +{ + "frame": {"x":1620,"y":345,"w":51,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":731,"y":798,"w":51,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftWristtieRopesUpper.png": +{ + "frame": {"x":1539,"y":756,"w":103,"h":283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":495,"w":103,"h":283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/RightThigh3KneelClosedOver.png": +{ + "frame": {"x":497,"y":1113,"w":152,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":399,"y":812,"w":152,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/AnkleRightClosed.png": +{ + "frame": {"x":441,"y":756,"w":99,"h":353}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":502,"y":1146,"w":99,"h":353}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ArmRightFront.png": +{ + "frame": {"x":1306,"y":1099,"w":121,"h":299}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":648,"y":404,"w":121,"h":299}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ArmRightUp.png": +{ + "frame": {"x":790,"y":3,"w":127,"h":344}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":162,"w":127,"h":344}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ChestCrossed.png": +{ + "frame": {"x":1198,"y":756,"w":337,"h":339}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":360,"w":337,"h":339}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/Collar.png": +{ + "frame": {"x":3,"y":1911,"w":275,"h":134}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":395,"w":275,"h":134}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Legs2Closed.png": +{ + "frame": {"x":1646,"y":991,"w":306,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":908,"w":306,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/ApronSkirtKneel.png": +{ + "frame": {"x":1744,"y":1660,"w":301,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":411,"y":735,"w":301,"h":178}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/ApronSkirtKneelCrotchStrap.png": +{ + "frame": {"x":1744,"y":1660,"w":301,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":411,"y":735,"w":301,"h":178}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/Cape.png": +{ + "frame": {"x":1675,"y":111,"w":369,"h":287}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":410,"w":369,"h":287}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeUp.png": +{ + "frame": {"x":1744,"y":1375,"w":301,"h":281}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":262,"w":301,"h":281}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/AnkleRightClosed.png": +{ + "frame": {"x":3,"y":776,"w":99,"h":382}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":501,"y":1131,"w":99,"h":382}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ArmRightUp.png": +{ + "frame": {"x":643,"y":3,"w":143,"h":344}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":162,"w":143,"h":344}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ChestCrossed.png": +{ + "frame": {"x":1279,"y":349,"w":337,"h":339}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":360,"w":337,"h":339}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/PostureCollar.png": +{ + "frame": {"x":1956,"y":1154,"w":86,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":356,"w":86,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusClawLeftFront.png": +{ + "frame": {"x":653,"y":1109,"w":120,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":531,"y":487,"w":120,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusHornRight.png": +{ + "frame": {"x":1957,"y":944,"w":88,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":84,"w":88,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallRightKneel.png": +{ + "frame": {"x":1956,"y":1065,"w":89,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":309,"y":850,"w":89,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/RightLegsKneel.png": +{ + "frame": {"x":1431,"y":1099,"w":211,"h":272}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":314,"y":798,"w":211,"h":272}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/LegsKneelClosed.png": +{ + "frame": {"x":838,"y":756,"w":356,"h":346}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":328,"y":652,"w":356,"h":346}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveRightWristtie.png": +{ + "frame": {"x":1957,"y":821,"w":88,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":422,"w":88,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseBust.png": +{ + "frame": {"x":3,"y":1162,"w":289,"h":375}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":409,"w":289,"h":375}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseBustUp.png": +{ + "frame": {"x":3,"y":3,"w":289,"h":383}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":401,"w":289,"h":383}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseLeftFree.png": +{ + "frame": {"x":106,"y":776,"w":208,"h":375}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":409,"w":208,"h":375}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseLeftFront.png": +{ + "frame": {"x":1568,"y":1851,"w":169,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":418,"w":169,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseLeftWristtie.png": +{ + "frame": {"x":431,"y":3,"w":208,"h":366}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":418,"w":208,"h":366}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseRightYoked.png": +{ + "frame": {"x":304,"y":381,"w":197,"h":371}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":397,"y":413,"w":197,"h":371}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveRightYoked.png": +{ + "frame": {"x":853,"y":1155,"w":191,"h":346}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":299,"y":286,"w":191,"h":346}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SleeveRightFree.png": +{ + "frame": {"x":3,"y":390,"w":132,"h":382}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":357,"y":442,"w":132,"h":382}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas33.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas33.webp b/TextureAtlas/atlas33.webp new file mode 100644 index 000000000..72641b5c9 Binary files /dev/null and b/TextureAtlas/atlas33.webp differ diff --git a/TextureAtlas/atlas34.json b/TextureAtlas/atlas34.json new file mode 100644 index 000000000..bb2a85567 --- /dev/null +++ b/TextureAtlas/atlas34.json @@ -0,0 +1,869 @@ +{"frames": { + +"Models/ArmorChain/ShirtChestUp.png": +{ + "frame": {"x":1767,"y":1457,"w":278,"h":225}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":400,"w":278,"h":225}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/Skirt.png": +{ + "frame": {"x":695,"y":1517,"w":336,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":434,"y":739,"w":336,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/Skirt2KneelCrotchStrap.png": +{ + "frame": {"x":1124,"y":896,"w":346,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":352,"y":796,"w":346,"h":169}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/SkirtCrotchStrap.png": +{ + "frame": {"x":695,"y":1517,"w":336,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":434,"y":739,"w":336,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/SkirtHogtie.png": +{ + "frame": {"x":1035,"y":1517,"w":336,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":434,"y":739,"w":336,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/SkirtHogtieCrotchStrap.png": +{ + "frame": {"x":1035,"y":1517,"w":336,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":434,"y":739,"w":336,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/Breastplate.png": +{ + "frame": {"x":1767,"y":1207,"w":278,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":420,"w":278,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShortsKneel.png": +{ + "frame": {"x":763,"y":3,"w":375,"h":220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":400,"y":751,"w":375,"h":220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShortsKneelClosed.png": +{ + "frame": {"x":763,"y":3,"w":375,"h":220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":400,"y":751,"w":375,"h":220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/FootRightKneel.png": +{ + "frame": {"x":1047,"y":1292,"w":73,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":850,"w":73,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/EarsInner.png": +{ + "frame": {"x":738,"y":1926,"w":216,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":41,"w":216,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cape/ShouldersHogtieFree.png": +{ + "frame": {"x":1514,"y":296,"w":368,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":396,"w":368,"h":182}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cape/ShouldersKneel.png": +{ + "frame": {"x":1514,"y":296,"w":368,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":396,"w":368,"h":182}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cape/ShouldersSpread.png": +{ + "frame": {"x":1514,"y":296,"w":368,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":396,"w":368,"h":182}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cape/ShouldersUp.png": +{ + "frame": {"x":1135,"y":397,"w":368,"h":179}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":399,"w":368,"h":179}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ButtKneel.png": +{ + "frame": {"x":1308,"y":1707,"w":147,"h":214}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":627,"y":750,"w":147,"h":214}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/FootRightKneel.png": +{ + "frame": {"x":1693,"y":1669,"w":70,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":323,"y":856,"w":70,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/SleevelessTorsoUpperHogtie.png": +{ + "frame": {"x":1431,"y":1214,"w":267,"h":299}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":395,"w":267,"h":299}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Corsets/ChestHeavyCorset.png": +{ + "frame": {"x":466,"y":1926,"w":268,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":507,"w":268,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowLongMittenLeftFree.png": +{ + "frame": {"x":1889,"y":3,"w":156,"h":320}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":733,"y":485,"w":156,"h":320}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/AnkleRightClosed.png": +{ + "frame": {"x":1987,"y":1910,"w":58,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":1428,"w":58,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowLeftFront.png": +{ + "frame": {"x":1987,"y":1844,"w":58,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":713,"y":594,"w":58,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenAnkleLeftKneelClosed.png": +{ + "frame": {"x":1702,"y":1396,"w":61,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":974,"w":61,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowRightUp.png": +{ + "frame": {"x":1987,"y":1972,"w":50,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":511,"y":243,"w":50,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/GlowBalletLeftClosed.png": +{ + "frame": {"x":1834,"y":652,"w":41,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":642,"y":1418,"w":41,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/GlowBalletLeftSpread.png": +{ + "frame": {"x":1834,"y":652,"w":41,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":1431,"w":41,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/GlowBalletRightClosed.png": +{ + "frame": {"x":1834,"y":869,"w":41,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":580,"y":1415,"w":41,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/LeftLegsKneelClosed.png": +{ + "frame": {"x":1517,"y":3,"w":368,"h":289}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":368,"y":801,"w":368,"h":289}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/LegsKneel.png": +{ + "frame": {"x":1459,"y":1707,"w":230,"h":311}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":308,"y":761,"w":230,"h":311}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftLockBandKneel.png": +{ + "frame": {"x":1124,"y":1069,"w":343,"h":141}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":426,"y":849,"w":343,"h":141}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmRightCrossed.png": +{ + "frame": {"x":1484,"y":652,"w":346,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":438,"w":346,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseForeArmRightCrossed.png": +{ + "frame": {"x":1484,"y":869,"w":346,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":473,"w":346,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceChestDecoHardware.png": +{ + "frame": {"x":1086,"y":915,"w":34,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":557,"y":557,"w":34,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageSkirtOverKneelCrotchStrap.png": +{ + "frame": {"x":621,"y":1707,"w":263,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":801,"w":263,"h":215}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesK2/EyesClosed.png": +{ + "frame": {"x":1702,"y":1437,"w":61,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":518,"y":269,"w":61,"h":37}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyesClosed.png": +{ + "frame": {"x":1702,"y":1437,"w":61,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":518,"y":269,"w":61,"h":37}, + "sourceSize": {"w":781,"h":560} +}, +"Models/FaceFang/MouthSurprised.png": +{ + "frame": {"x":2013,"y":1725,"w":31,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":316,"w":31,"h":45}, + "sourceSize": {"w":754,"h":450} +}, +"Models/FaceFangless/MouthFrown.png": +{ + "frame": {"x":2013,"y":1686,"w":32,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":320,"w":32,"h":35}, + "sourceSize": {"w":754,"h":461} +}, +"Models/FaceKjus/Eyes2Heart.png": +{ + "frame": {"x":1702,"y":1306,"w":61,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":615,"y":264,"w":61,"h":41}, + "sourceSize": {"w":753,"h":414} +}, +"Models/FaceKjus/Eyes2Surprised.png": +{ + "frame": {"x":1702,"y":1214,"w":61,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":617,"y":263,"w":61,"h":42}, + "sourceSize": {"w":791,"h":501} +}, +"Models/FaceKjus/EyesAngry.png": +{ + "frame": {"x":1702,"y":1478,"w":61,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":523,"y":280,"w":61,"h":34}, + "sourceSize": {"w":725,"h":425} +}, +"Models/FaceKjus/WhitesEyes2Heart.png": +{ + "frame": {"x":1702,"y":1351,"w":61,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":615,"y":264,"w":61,"h":41}, + "sourceSize": {"w":753,"h":414} +}, +"Models/FaceKjus/WhitesEyes2Surprised.png": +{ + "frame": {"x":1702,"y":1260,"w":61,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":617,"y":263,"w":61,"h":42}, + "sourceSize": {"w":791,"h":501} +}, +"Models/Hair/BackFlat.png": +{ + "frame": {"x":713,"y":962,"w":345,"h":277}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":97,"w":345,"h":277}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/BackShortCurlyUnderlight.png": +{ + "frame": {"x":1124,"y":1214,"w":303,"h":299}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":115,"w":303,"h":299}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/Hat.png": +{ + "frame": {"x":1142,"y":3,"w":371,"h":145}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":425,"y":144,"w":371,"h":145}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletSoleLeftClosed.png": +{ + "frame": {"x":1047,"y":1707,"w":105,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":1465,"w":105,"h":215}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletSoleRightKneel.png": +{ + "frame": {"x":1767,"y":1086,"w":95,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":309,"y":839,"w":95,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/StrapsChestExtra.png": +{ + "frame": {"x":1238,"y":1925,"w":217,"h":120}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":401,"w":217,"h":120}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockWristRightCrossed.png": +{ + "frame": {"x":3,"y":1678,"w":22,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":665,"y":622,"w":22,"h":25}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ThighLeftClosed.png": +{ + "frame": {"x":1886,"y":327,"w":159,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":1026,"w":159,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChestTied.png": +{ + "frame": {"x":350,"y":1707,"w":267,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":413,"w":267,"h":215}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandCollar.png": +{ + "frame": {"x":29,"y":1678,"w":82,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":396,"w":82,"h":24}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandWristLeftYoked.png": +{ + "frame": {"x":1599,"y":2022,"w":56,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":873,"y":400,"w":56,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/ShouldersHogtieFree.png": +{ + "frame": {"x":763,"y":227,"w":368,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":396,"w":368,"h":182}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LeftLegsBeltsKneel.png": +{ + "frame": {"x":3,"y":3,"w":377,"h":271}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":824,"w":377,"h":271}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandAnkleLeftClosed.png": +{ + "frame": {"x":1459,"y":2022,"w":67,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":597,"y":1445,"w":67,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandAnkleLeftSpread.png": +{ + "frame": {"x":1530,"y":2022,"w":65,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":686,"y":1436,"w":65,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowLeftFront.png": +{ + "frame": {"x":1987,"y":1774,"w":58,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":713,"y":602,"w":58,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LeftLegsKneel.png": +{ + "frame": {"x":3,"y":1034,"w":346,"h":287}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":391,"y":810,"w":346,"h":287}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/FootSockRightKneel.png": +{ + "frame": {"x":1047,"y":1403,"w":73,"h":105}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":321,"y":849,"w":73,"h":105}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SkirtClosed.png": +{ + "frame": {"x":741,"y":612,"w":356,"h":204}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":415,"y":741,"w":356,"h":204}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SockRightKneelClosed.png": +{ + "frame": {"x":150,"y":1678,"w":196,"h":244}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":321,"y":816,"w":196,"h":244}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftFree.png": +{ + "frame": {"x":1879,"y":922,"w":165,"h":281}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":692,"y":521,"w":165,"h":281}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightBoxtie.png": +{ + "frame": {"x":1062,"y":1105,"w":58,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":599,"w":58,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/DressChestWristtie.png": +{ + "frame": {"x":3,"y":1417,"w":343,"h":257}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":388,"w":343,"h":257}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronLeftStrapsYoked.png": +{ + "frame": {"x":1062,"y":1199,"w":58,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":718,"y":499,"w":58,"h":89}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ApronHogtie.png": +{ + "frame": {"x":353,"y":1168,"w":345,"h":261}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":378,"y":549,"w":345,"h":261}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressDeco.png": +{ + "frame": {"x":1693,"y":1517,"w":70,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":715,"y":806,"w":70,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GloveRightFree.png": +{ + "frame": {"x":1127,"y":1926,"w":107,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":267,"y":537,"w":107,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ShoulderRightUp.png": +{ + "frame": {"x":888,"y":1707,"w":155,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":346,"w":155,"h":215}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/ForeLongMittenRightCrossed.png": +{ + "frame": {"x":1375,"y":1517,"w":314,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":543,"w":314,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LockLeftFront.png": +{ + "frame": {"x":1086,"y":947,"w":33,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":627,"y":561,"w":33,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/BeltLines.png": +{ + "frame": {"x":958,"y":1926,"w":165,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":649,"w":165,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SockRightKneel.png": +{ + "frame": {"x":1047,"y":1403,"w":73,"h":105}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":321,"y":849,"w":73,"h":105}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ThighLeftKneel.png": +{ + "frame": {"x":702,"y":1243,"w":341,"h":270}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":386,"y":818,"w":341,"h":270}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ThighLeftKneelClosed.png": +{ + "frame": {"x":350,"y":1433,"w":341,"h":270}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":386,"y":818,"w":341,"h":270}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/LeftLegsBeltsKneel.png": +{ + "frame": {"x":3,"y":3,"w":377,"h":271}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":824,"w":377,"h":271}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/HarnessMid.png": +{ + "frame": {"x":729,"y":820,"w":353,"h":138}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":604,"w":353,"h":138}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopArmsUp.png": +{ + "frame": {"x":384,"y":236,"w":366,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":240,"w":366,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopHarnessMidFlattened.png": +{ + "frame": {"x":3,"y":861,"w":353,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":573,"w":353,"h":169}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/PauldronsYoked.png": +{ + "frame": {"x":3,"y":1325,"w":344,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":407,"w":344,"h":88}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Arm2Up.png": +{ + "frame": {"x":3,"y":555,"w":365,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":237,"w":365,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeStripe.png": +{ + "frame": {"x":3,"y":278,"w":365,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":422,"w":365,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/BraPadlockPin.png": +{ + "frame": {"x":1086,"y":880,"w":34,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":558,"y":556,"w":34,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ThighLeftSpread.png": +{ + "frame": {"x":1879,"y":838,"w":166,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":604,"y":971,"w":166,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/BottomKneelClosed.png": +{ + "frame": {"x":3,"y":666,"w":353,"h":191}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":395,"y":652,"w":353,"h":191}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/RightLegsKneelClosed.png": +{ + "frame": {"x":1124,"y":580,"w":356,"h":312}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":328,"y":652,"w":356,"h":312}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/PetsuitTopBody.png": +{ + "frame": {"x":1693,"y":1774,"w":290,"h":271}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":441,"w":290,"h":271}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/PetsuitTopTapedHands.png": +{ + "frame": {"x":1767,"y":1686,"w":242,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":408,"w":242,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/DressChestFree.png": +{ + "frame": {"x":360,"y":918,"w":349,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":391,"w":349,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/PantyhoseKneelClosed.png": +{ + "frame": {"x":754,"y":413,"w":366,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":408,"y":742,"w":366,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveLeftWristtie.png": +{ + "frame": {"x":1879,"y":520,"w":166,"h":314}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":619,"y":425,"w":166,"h":314}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SockRightKneelClosed.png": +{ + "frame": {"x":372,"y":643,"w":353,"h":271}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":324,"y":792,"w":353,"h":271}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveRightUp.png": +{ + "frame": {"x":3,"y":1707,"w":143,"h":337}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":163,"w":143,"h":337}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeLeftKneelClosed.png": +{ + "frame": {"x":1507,"y":482,"w":368,"h":166}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":924,"w":368,"h":166}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeLeftKneelClosedRopesAnkle.png": +{ + "frame": {"x":1507,"y":482,"w":368,"h":166}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":924,"w":368,"h":166}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/SkirtCrotchStrap.png": +{ + "frame": {"x":1142,"y":152,"w":368,"h":241}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":411,"y":698,"w":368,"h":241}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtOverKneelCrotchStrap.png": +{ + "frame": {"x":372,"y":435,"w":365,"h":204}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":774,"w":365,"h":204}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/CollarTag.png": +{ + "frame": {"x":1086,"y":820,"w":34,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":575,"y":437,"w":34,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/FCollarTag.png": +{ + "frame": {"x":1086,"y":820,"w":34,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":441,"w":34,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessHardwareLower.png": +{ + "frame": {"x":150,"y":1926,"w":312,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":439,"y":797,"w":312,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessHardwareLowerClosed.png": +{ + "frame": {"x":150,"y":1926,"w":312,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":439,"y":797,"w":312,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ButtKneel.png": +{ + "frame": {"x":1156,"y":1707,"w":148,"h":214}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":627,"y":750,"w":148,"h":214}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegPadsLeftKneelClosed.png": +{ + "frame": {"x":384,"y":3,"w":375,"h":229}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":827,"w":375,"h":229}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ShoeLeftHogtie.png": +{ + "frame": {"x":1062,"y":979,"w":58,"h":122}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":791,"w":58,"h":122}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoLowerBandClosed.png": +{ + "frame": {"x":1471,"y":1086,"w":292,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":802,"w":292,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas34.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas34.webp b/TextureAtlas/atlas34.webp new file mode 100644 index 000000000..f9ba35b2a Binary files /dev/null and b/TextureAtlas/atlas34.webp differ diff --git a/TextureAtlas/atlas35.json b/TextureAtlas/atlas35.json new file mode 100644 index 000000000..56eb1d743 --- /dev/null +++ b/TextureAtlas/atlas35.json @@ -0,0 +1,741 @@ +{"frames": { + +"Models/ArmorChain/PantiesChain.png": +{ + "frame": {"x":1850,"y":1926,"w":195,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":801,"w":195,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/PauldronsFree.png": +{ + "frame": {"x":1377,"y":538,"w":337,"h":164}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":383,"w":337,"h":164}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/PauldronsHogtie.png": +{ + "frame": {"x":693,"y":255,"w":339,"h":167}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":387,"w":339,"h":167}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/PouchClosed.png": +{ + "frame": {"x":1874,"y":983,"w":171,"h":173}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":413,"y":939,"w":171,"h":173}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShoulderPadHogtie.png": +{ + "frame": {"x":1930,"y":1528,"w":112,"h":132}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":685,"y":409,"w":112,"h":132}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/RightArm1Boxtie.png": +{ + "frame": {"x":935,"y":1697,"w":40,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":486,"w":40,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/RightArm1Wristtie.png": +{ + "frame": {"x":935,"y":1697,"w":40,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":486,"w":40,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cape/ShouldersHogtie.png": +{ + "frame": {"x":3,"y":3,"w":341,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":396,"w":341,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmLeftYoked.png": +{ + "frame": {"x":1354,"y":983,"w":273,"h":255}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":381,"w":273,"h":255}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoLowerSpread.png": +{ + "frame": {"x":1727,"y":3,"w":318,"h":253}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":670,"w":318,"h":253}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoUpperHogtie.png": +{ + "frame": {"x":1291,"y":1750,"w":303,"h":293}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":395,"w":303,"h":293}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraCups.png": +{ + "frame": {"x":1725,"y":260,"w":319,"h":233}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":406,"w":319,"h":233}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayCollar.png": +{ + "frame": {"x":1694,"y":742,"w":26,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":605,"y":398,"w":26,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowLeftBoxtie.png": +{ + "frame": {"x":2015,"y":1460,"w":28,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":749,"y":579,"w":28,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenLeftYoked.png": +{ + "frame": {"x":1309,"y":1415,"w":202,"h":331}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":751,"y":312,"w":202,"h":331}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftLockPlateSpread.png": +{ + "frame": {"x":1694,"y":864,"w":25,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":740,"y":1422,"w":25,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightLockPlateSpread.png": +{ + "frame": {"x":1694,"y":917,"w":25,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":1422,"w":25,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightLockSpread.png": +{ + "frame": {"x":2015,"y":1400,"w":28,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":1422,"w":28,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockBandUp.png": +{ + "frame": {"x":2015,"y":1248,"w":30,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":713,"y":227,"w":30,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightLockBandUp.png": +{ + "frame": {"x":2015,"y":1287,"w":30,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":243,"w":30,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmLeftWristtie.png": +{ + "frame": {"x":1171,"y":1750,"w":116,"h":294}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":441,"w":116,"h":294}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmLeftYoked.png": +{ + "frame": {"x":299,"y":1750,"w":257,"h":294}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":710,"y":353,"w":257,"h":294}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseSkirtOverKneel.png": +{ + "frame": {"x":1038,"y":3,"w":341,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":801,"w":341,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/Circlet.png": +{ + "frame": {"x":1515,"y":1664,"w":224,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":501,"y":161,"w":224,"h":82}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceKjus/MouthEmbarrassed.png": +{ + "frame": {"x":2015,"y":1326,"w":30,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":589,"y":322,"w":30,"h":35}, + "sourceSize": {"w":754,"h":461} +}, +"Models/Festive/StrapTopTied.png": +{ + "frame": {"x":1631,"y":983,"w":239,"h":255}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":408,"w":239,"h":255}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/BackShortCurly.png": +{ + "frame": {"x":1743,"y":1664,"w":302,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":487,"y":114,"w":302,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/ThumbcuffsFront.png": +{ + "frame": {"x":2015,"y":1365,"w":30,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":509,"w":30,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/HardwareStrap.png": +{ + "frame": {"x":2005,"y":900,"w":40,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":552,"y":693,"w":40,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletLeftKneel.png": +{ + "frame": {"x":1723,"y":833,"w":278,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":652,"y":906,"w":278,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletRightKneel.png": +{ + "frame": {"x":1743,"y":1926,"w":103,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":309,"y":839,"w":103,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/FlatBalletLeftKneel.png": +{ + "frame": {"x":1723,"y":833,"w":278,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":652,"y":906,"w":278,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/FlatBalletRightKneel.png": +{ + "frame": {"x":1743,"y":1926,"w":103,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":309,"y":839,"w":103,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/ShinyBalletRightKneel.png": +{ + "frame": {"x":1743,"y":1926,"w":103,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":309,"y":839,"w":103,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLegLeftKneel.png": +{ + "frame": {"x":1357,"y":706,"w":333,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":384,"y":815,"w":333,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLegLeftKneelClosed.png": +{ + "frame": {"x":1017,"y":965,"w":333,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":384,"y":815,"w":333,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/ChestBoleroCrossed.png": +{ + "frame": {"x":1336,"y":1242,"w":309,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":375,"w":309,"h":169}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/ChestBoleroWristtie.png": +{ + "frame": {"x":1015,"y":1242,"w":317,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":375,"w":317,"h":169}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Kigu/MaskGag.png": +{ + "frame": {"x":1649,"y":1242,"w":221,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":118,"w":221,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyLatex/KittyLatexEarLight.png": +{ + "frame": {"x":338,"y":1625,"w":201,"h":121}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":498,"y":64,"w":201,"h":121}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/FootLeftHogtiePaws.png": +{ + "frame": {"x":935,"y":1625,"w":40,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":733,"y":807,"w":40,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/FootLeftHogtiePaws.png": +{ + "frame": {"x":935,"y":1625,"w":40,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":733,"y":807,"w":40,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/FootLeftHogtiePaws.png": +{ + "frame": {"x":935,"y":1625,"w":40,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":733,"y":807,"w":40,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/FootLeftHogtiePaws.png": +{ + "frame": {"x":935,"y":1625,"w":40,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":733,"y":807,"w":40,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/ShouldersHogtie.png": +{ + "frame": {"x":348,"y":3,"w":341,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":396,"w":341,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowRightFront.png": +{ + "frame": {"x":1694,"y":807,"w":25,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":598,"w":25,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LeftLegsBeltsKneel.png": +{ + "frame": {"x":341,"y":1128,"w":333,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":393,"y":812,"w":333,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LeftLegsBeltsKneelClosed.png": +{ + "frame": {"x":3,"y":1223,"w":333,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":393,"y":812,"w":333,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LegsBeltsHogtie.png": +{ + "frame": {"x":3,"y":1750,"w":292,"h":295}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":920,"w":292,"h":295}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LegsKneel.png": +{ + "frame": {"x":560,"y":1750,"w":240,"h":294}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":307,"y":785,"w":240,"h":294}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LegsKneelClosed.png": +{ + "frame": {"x":560,"y":1750,"w":240,"h":294}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":307,"y":785,"w":240,"h":294}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeClosed.png": +{ + "frame": {"x":1382,"y":253,"w":339,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":422,"y":858,"w":339,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeSockLeftKneelClosed.png": +{ + "frame": {"x":748,"y":1625,"w":183,"h":121}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":857,"w":183,"h":121}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLeftKneelClosed.png": +{ + "frame": {"x":342,"y":611,"w":335,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":427,"y":990,"w":335,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/Headband.png": +{ + "frame": {"x":1649,"y":1528,"w":277,"h":132}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":103,"w":277,"h":132}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveLeftBoxtie.png": +{ + "frame": {"x":1515,"y":1415,"w":130,"h":245}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":667,"y":400,"w":130,"h":245}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuff2LeftFree.png": +{ + "frame": {"x":1694,"y":706,"w":26,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":676,"w":26,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardLeftCrossed.png": +{ + "frame": {"x":1874,"y":1160,"w":171,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":624,"w":171,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Necklace/MetalDisc.png": +{ + "frame": {"x":1694,"y":777,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":584,"y":435,"w":26,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/Skirt.png": +{ + "frame": {"x":678,"y":1201,"w":333,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":434,"y":738,"w":333,"h":210}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SkirtCrotchStrap.png": +{ + "frame": {"x":340,"y":1414,"w":333,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":434,"y":738,"w":333,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveLeftFront.png": +{ + "frame": {"x":693,"y":3,"w":341,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":465,"w":341,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Thigh1KneelClosed.png": +{ + "frame": {"x":1724,"y":737,"w":321,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":412,"y":924,"w":321,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SkirtCrotchStrap.png": +{ + "frame": {"x":1382,"y":316,"w":338,"h":218}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":713,"w":338,"h":218}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/FrogThigh1Kneel.png": +{ + "frame": {"x":3,"y":421,"w":335,"h":244}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":317,"y":842,"w":335,"h":244}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/FrogThigh3KneelClosed.png": +{ + "frame": {"x":1038,"y":196,"w":340,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":399,"y":812,"w":340,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ChestWristtie.png": +{ + "frame": {"x":1019,"y":693,"w":334,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":360,"w":334,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/FootLeftClosed.png": +{ + "frame": {"x":1874,"y":1248,"w":137,"h":276}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":1342,"w":137,"h":276}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Arms1.png": +{ + "frame": {"x":1036,"y":395,"w":337,"h":294}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":415,"w":337,"h":294}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Eyes.png": +{ + "frame": {"x":543,"y":1625,"w":201,"h":121}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":42,"y":133,"w":201,"h":121}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Skirts/MaidSkirtOverKneel.png": +{ + "frame": {"x":344,"y":266,"w":336,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":471,"y":749,"w":336,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/MaidSkirtOverKneelCrotchStrap.png": +{ + "frame": {"x":344,"y":266,"w":336,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":471,"y":749,"w":336,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/AnkleLeftKneelClosed.png": +{ + "frame": {"x":341,"y":996,"w":334,"h":128}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":410,"y":953,"w":334,"h":128}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ChestWristtie.png": +{ + "frame": {"x":679,"y":929,"w":334,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":360,"w":334,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/LegRightKneel.png": +{ + "frame": {"x":804,"y":1750,"w":223,"h":294}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":768,"w":223,"h":294}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLegLeftKneelClosed.png": +{ + "frame": {"x":3,"y":669,"w":334,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":384,"y":815,"w":334,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmLeftWristtie.png": +{ + "frame": {"x":681,"y":652,"w":334,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":487,"w":334,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmRightWristtie.png": +{ + "frame": {"x":341,"y":719,"w":334,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":487,"w":334,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/TopFullWristtie.png": +{ + "frame": {"x":979,"y":1415,"w":326,"h":331}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":384,"w":326,"h":331}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/TopFullWristtie.png": +{ + "frame": {"x":979,"y":1415,"w":326,"h":331}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":384,"w":326,"h":331}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/TopWristtie.png": +{ + "frame": {"x":3,"y":946,"w":334,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":487,"w":334,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/PantyhoseHogtie.png": +{ + "frame": {"x":677,"y":1415,"w":298,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":742,"w":298,"h":206}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ShoeLeftClosed.png": +{ + "frame": {"x":1598,"y":1750,"w":141,"h":269}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":1365,"w":141,"h":269}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SkirtBandKneel.png": +{ + "frame": {"x":3,"y":266,"w":337,"h":151}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":439,"y":724,"w":337,"h":151}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/Dress.png": +{ + "frame": {"x":1383,"y":3,"w":340,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":569,"w":340,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveRightFront.png": +{ + "frame": {"x":1031,"y":1750,"w":136,"h":294}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":423,"w":136,"h":294}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/SkirtOverKneel.png": +{ + "frame": {"x":342,"y":477,"w":335,"h":130}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":801,"w":335,"h":130}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/BandAnkleLeftKneel.png": +{ + "frame": {"x":2005,"y":833,"w":40,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":716,"y":958,"w":40,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/ShirtChest.png": +{ + "frame": {"x":3,"y":1509,"w":331,"h":237}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":392,"w":331,"h":237}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/ShirtChestTied.png": +{ + "frame": {"x":1724,"y":497,"w":321,"h":236}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":393,"w":321,"h":236}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SkirtOverKneel.png": +{ + "frame": {"x":684,"y":426,"w":335,"h":222}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":750,"w":335,"h":222}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas35.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas35.webp b/TextureAtlas/atlas35.webp new file mode 100644 index 000000000..2b067d089 Binary files /dev/null and b/TextureAtlas/atlas35.webp differ diff --git a/TextureAtlas/atlas36.json b/TextureAtlas/atlas36.json new file mode 100644 index 000000000..3616fd2a9 --- /dev/null +++ b/TextureAtlas/atlas36.json @@ -0,0 +1,925 @@ +{"frames": { + +"Models/Belts/Feet2KneelClosed.png": +{ + "frame": {"x":1994,"y":1415,"w":51,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":984,"w":51,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/LeftArm2Wristtie.png": +{ + "frame": {"x":1988,"y":1878,"w":57,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":682,"y":596,"w":57,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/RightLegs1Kneel.png": +{ + "frame": {"x":1833,"y":1742,"w":143,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":393,"y":803,"w":143,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/RightLegs1KneelClosed.png": +{ + "frame": {"x":1833,"y":1742,"w":143,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":393,"y":803,"w":143,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/HandRightYoked.png": +{ + "frame": {"x":705,"y":1343,"w":187,"h":325}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":187,"h":325}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/LegRightKneel.png": +{ + "frame": {"x":3,"y":343,"w":310,"h":335}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":244,"y":760,"w":310,"h":335}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/LegRightKneelClosed.png": +{ + "frame": {"x":275,"y":3,"w":310,"h":335}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":244,"y":760,"w":310,"h":335}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/HighLeotardKneel.png": +{ + "frame": {"x":3,"y":3,"w":268,"h":336}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":518,"w":268,"h":336}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/LeotardKneel.png": +{ + "frame": {"x":3,"y":3,"w":268,"h":336}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":518,"w":268,"h":336}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/HandRightFront.png": +{ + "frame": {"x":3,"y":682,"w":234,"h":335}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":354,"y":244,"w":234,"h":335}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraLining.png": +{ + "frame": {"x":1411,"y":1812,"w":289,"h":233}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":406,"w":289,"h":233}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/CyberDisplay.png": +{ + "frame": {"x":1997,"y":627,"w":48,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":550,"y":841,"w":48,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ThighLinkSpread.png": +{ + "frame": {"x":1001,"y":1971,"w":80,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":566,"y":1057,"w":80,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowLongMittenRightBoxtie.png": +{ + "frame": {"x":1994,"y":1172,"w":51,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":484,"w":51,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenAnkleLeftClosed.png": +{ + "frame": {"x":1988,"y":1812,"w":57,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":606,"y":1433,"w":57,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowLeftUp.png": +{ + "frame": {"x":1994,"y":1337,"w":51,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":709,"y":252,"w":51,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenRightYoked.png": +{ + "frame": {"x":241,"y":1354,"w":172,"h":327}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":292,"y":311,"w":172,"h":327}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenRightBoxtie.png": +{ + "frame": {"x":1994,"y":1172,"w":51,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":484,"w":51,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BraLines.png": +{ + "frame": {"x":1708,"y":322,"w":285,"h":236}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":435,"y":406,"w":285,"h":236}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftDecoCleanSpread.png": +{ + "frame": {"x":841,"y":2014,"w":68,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":683,"y":1439,"w":68,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightDecoClosed.png": +{ + "frame": {"x":655,"y":2014,"w":94,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":1055,"w":94,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightDecoKneel.png": +{ + "frame": {"x":1833,"y":1441,"w":133,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":369,"y":854,"w":133,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightDecoKneelClosed.png": +{ + "frame": {"x":1833,"y":1441,"w":133,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":369,"y":854,"w":133,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockKneel.png": +{ + "frame": {"x":1980,"y":1742,"w":64,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":420,"y":826,"w":64,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceCorset.png": +{ + "frame": {"x":1287,"y":976,"w":267,"h":316}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":519,"w":267,"h":316}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/ShoeLeftClosed.png": +{ + "frame": {"x":1558,"y":1298,"w":146,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":1526,"w":146,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtOverKneelCrotchStrap.png": +{ + "frame": {"x":1185,"y":3,"w":327,"h":320}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":773,"w":327,"h":320}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/SkirtBandKneel.png": +{ + "frame": {"x":1595,"y":914,"w":109,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":630,"y":742,"w":109,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai2/Brows2Neutral.png": +{ + "frame": {"x":1997,"y":691,"w":48,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":604,"y":237,"w":48,"h":24}, + "sourceSize": {"w":725,"h":424} +}, +"Models/EyesK3/EyesClosed.png": +{ + "frame": {"x":1997,"y":660,"w":48,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":285,"w":48,"h":27}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/EyesDazed.png": +{ + "frame": {"x":1998,"y":180,"w":47,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":278,"w":47,"h":35}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/EyesHeart.png": +{ + "frame": {"x":1997,"y":388,"w":48,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":529,"y":271,"w":48,"h":46}, + "sourceSize": {"w":725,"h":425} +}, +"Models/EyesK3/EyesNeutral.png": +{ + "frame": {"x":1998,"y":3,"w":47,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":269,"w":47,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/EyesSurprised.png": +{ + "frame": {"x":1997,"y":438,"w":48,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":267,"w":48,"h":46}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/WhitesEyesClosed.png": +{ + "frame": {"x":1997,"y":660,"w":48,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":285,"w":48,"h":27}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/WhitesEyesDazed.png": +{ + "frame": {"x":1998,"y":219,"w":47,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":278,"w":47,"h":35}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/WhitesEyesHeart.png": +{ + "frame": {"x":1997,"y":538,"w":48,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":529,"y":271,"w":48,"h":45}, + "sourceSize": {"w":725,"h":425} +}, +"Models/EyesK3/WhitesEyesNeutral.png": +{ + "frame": {"x":1998,"y":51,"w":47,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":269,"w":47,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/WhitesEyesSurprised.png": +{ + "frame": {"x":1997,"y":488,"w":48,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":267,"w":48,"h":46}, + "sourceSize": {"w":781,"h":560} +}, +"Models/FaceDask/EyesClosed.png": +{ + "frame": {"x":1558,"y":1403,"w":146,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":55,"y":185,"w":146,"h":27}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FutureHarness/MetalLower.png": +{ + "frame": {"x":913,"y":2001,"w":173,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":485,"y":799,"w":173,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/GhostBallStrap.png": +{ + "frame": {"x":502,"y":2015,"w":149,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":67,"y":234,"w":149,"h":30}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/MuzzleStrap.png": +{ + "frame": {"x":1997,"y":587,"w":48,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":179,"y":214,"w":48,"h":36}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/BackShortMessyUnderlight.png": +{ + "frame": {"x":3,"y":1699,"w":296,"h":334}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":93,"w":296,"h":334}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/BraidCustomBraid.png": +{ + "frame": {"x":880,"y":1672,"w":117,"h":325}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":662,"y":337,"w":117,"h":325}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Vents.png": +{ + "frame": {"x":618,"y":670,"w":217,"h":324}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":501,"y":87,"w":217,"h":324}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/BeltsUnderbust.png": +{ + "frame": {"x":1997,"y":328,"w":48,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":548,"y":611,"w":48,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletLeftHogtie.png": +{ + "frame": {"x":241,"y":682,"w":87,"h":334}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":761,"w":87,"h":334}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/FlatBalletLeftHogtie.png": +{ + "frame": {"x":241,"y":682,"w":87,"h":334}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":761,"w":87,"h":334}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherLegRightKneel.png": +{ + "frame": {"x":1402,"y":1296,"w":152,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":313,"y":830,"w":152,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/ShinyBalletLeftHogtie.png": +{ + "frame": {"x":241,"y":682,"w":87,"h":334}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":761,"w":87,"h":334}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/BinderTorsoLower.png": +{ + "frame": {"x":1116,"y":1313,"w":282,"h":317}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":593,"w":282,"h":317}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/CrotchlessBinderTorsoLower.png": +{ + "frame": {"x":241,"y":1020,"w":282,"h":330}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":593,"w":282,"h":330}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/StrapsTorsoLowerBoxtie.png": +{ + "frame": {"x":1088,"y":655,"w":282,"h":317}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":606,"w":282,"h":317}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/StrapsTorsoLowerWristtie.png": +{ + "frame": {"x":1037,"y":330,"w":282,"h":321}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":602,"w":282,"h":321}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/StrapsUnderbust.png": +{ + "frame": {"x":1143,"y":1861,"w":243,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":605,"w":243,"h":106}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/TorsoLower.png": +{ + "frame": {"x":332,"y":679,"w":282,"h":330}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":593,"w":282,"h":330}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/TorsoLowerCrossed.png": +{ + "frame": {"x":1708,"y":1169,"w":282,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":655,"w":282,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowRightYoked.png": +{ + "frame": {"x":1994,"y":1255,"w":51,"h":78}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":401,"y":523,"w":51,"h":78}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveRightYoked.png": +{ + "frame": {"x":769,"y":337,"w":138,"h":324}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":311,"y":306,"w":138,"h":324}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/FootLeftHogtie.png": +{ + "frame": {"x":1988,"y":1934,"w":56,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":731,"y":795,"w":56,"h":111}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/FootLeftHogtie.png": +{ + "frame": {"x":1988,"y":1934,"w":56,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":731,"y":795,"w":56,"h":111}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/FootLeftHogtie.png": +{ + "frame": {"x":1988,"y":1934,"w":56,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":731,"y":795,"w":56,"h":111}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowLeftFront.png": +{ + "frame": {"x":1998,"y":294,"w":47,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":722,"y":614,"w":47,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowLeftWristtie.png": +{ + "frame": {"x":1997,"y":753,"w":47,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":687,"y":620,"w":47,"h":24}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/StrapsLowerClosed.png": +{ + "frame": {"x":1057,"y":991,"w":226,"h":318}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":639,"w":226,"h":318}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LegsHardwareHogtie.png": +{ + "frame": {"x":1997,"y":1057,"w":46,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":692,"y":1010,"w":46,"h":111}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/LegbinderClosed.png": +{ + "frame": {"x":611,"y":337,"w":154,"h":329}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":589,"y":909,"w":154,"h":329}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/RightLegbinderClosed.png": +{ + "frame": {"x":1001,"y":1648,"w":138,"h":319}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":911,"w":138,"h":319}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeClosedCrotchStrap.png": +{ + "frame": {"x":1090,"y":1971,"w":317,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":832,"w":317,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLeftClosed.png": +{ + "frame": {"x":911,"y":330,"w":122,"h":322}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":569,"y":1175,"w":122,"h":322}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SockRightKneelClosed.png": +{ + "frame": {"x":883,"y":3,"w":298,"h":323}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":305,"y":764,"w":298,"h":323}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmRightBoxtie.png": +{ + "frame": {"x":1595,"y":647,"w":109,"h":263}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":424,"w":109,"h":263}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/SockRightHogtie.png": +{ + "frame": {"x":1558,"y":1434,"w":145,"h":290}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":929,"w":145,"h":290}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopChestUp.png": +{ + "frame": {"x":1704,"y":1812,"w":280,"h":233}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":397,"w":280,"h":233}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/CherryKneel.png": +{ + "frame": {"x":1708,"y":991,"w":285,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":768,"w":285,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/Lace.png": +{ + "frame": {"x":1708,"y":884,"w":285,"h":103}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":783,"w":285,"h":103}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Bow.png": +{ + "frame": {"x":1558,"y":968,"w":146,"h":161}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":504,"y":479,"w":146,"h":161}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopBowBoxtie.png": +{ + "frame": {"x":1558,"y":1133,"w":146,"h":161}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":504,"y":479,"w":146,"h":161}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/BaseClosed.png": +{ + "frame": {"x":317,"y":342,"w":290,"h":333}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":587,"w":290,"h":333}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/BaseSpread.png": +{ + "frame": {"x":589,"y":3,"w":290,"h":330}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":587,"w":290,"h":330}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/FrillClosed.png": +{ + "frame": {"x":1708,"y":749,"w":285,"h":131}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":755,"w":285,"h":131}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/FrillSpread.png": +{ + "frame": {"x":1708,"y":749,"w":285,"h":131}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":755,"w":285,"h":131}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/PlateClosed.png": +{ + "frame": {"x":808,"y":998,"w":245,"h":322}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":595,"w":245,"h":322}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/PlateSpread.png": +{ + "frame": {"x":839,"y":665,"w":245,"h":322}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":595,"w":245,"h":322}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/HandRightFront.png": +{ + "frame": {"x":3,"y":1021,"w":234,"h":335}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":354,"y":244,"w":234,"h":335}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/TorsoLowerKneel.png": +{ + "frame": {"x":1698,"y":3,"w":296,"h":315}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":541,"w":296,"h":315}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/ShirtChest.png": +{ + "frame": {"x":303,"y":1685,"w":285,"h":326}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":303,"w":285,"h":326}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/ShirtChestTied.png": +{ + "frame": {"x":417,"y":1354,"w":284,"h":326}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":303,"w":284,"h":326}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/ShirtChestUp.png": +{ + "frame": {"x":527,"y":1013,"w":277,"h":326}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":303,"w":277,"h":326}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/ShirtChestYoked.png": +{ + "frame": {"x":592,"y":1684,"w":284,"h":326}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":303,"w":284,"h":326}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnderKneel.png": +{ + "frame": {"x":1708,"y":562,"w":285,"h":183}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":370,"y":788,"w":285,"h":183}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeCollarInner.png": +{ + "frame": {"x":753,"y":2014,"w":84,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":373,"w":84,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ArmLeftWristtie.png": +{ + "frame": {"x":896,"y":1324,"w":102,"h":320}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":424,"w":102,"h":320}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/HandRightFront.png": +{ + "frame": {"x":3,"y":1360,"w":234,"h":335}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":354,"y":244,"w":234,"h":335}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/LegRightKneel.png": +{ + "frame": {"x":1402,"y":1554,"w":152,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":313,"y":830,"w":152,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/BeltPadlock.png": +{ + "frame": {"x":1997,"y":781,"w":46,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":547,"y":734,"w":46,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusClawRightFree.png": +{ + "frame": {"x":1997,"y":934,"w":46,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":286,"y":523,"w":46,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/StrappyLower.png": +{ + "frame": {"x":1143,"y":1634,"w":255,"h":223}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":696,"w":255,"h":223}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallLegLeftHogtie.png": +{ + "frame": {"x":1516,"y":3,"w":178,"h":316}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":577,"y":902,"w":178,"h":316}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/TopCrossed.png": +{ + "frame": {"x":1708,"y":1080,"w":285,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":605,"w":285,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmRightWristtie.png": +{ + "frame": {"x":1998,"y":140,"w":47,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":493,"w":47,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmLeftWristtie.png": +{ + "frame": {"x":1002,"y":1324,"w":110,"h":319}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":675,"y":425,"w":110,"h":319}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmRightFront.png": +{ + "frame": {"x":1323,"y":327,"w":160,"h":317}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":416,"y":404,"w":160,"h":317}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/Hairpin.png": +{ + "frame": {"x":1998,"y":258,"w":47,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":630,"y":202,"w":47,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ShoeLeftSpread.png": +{ + "frame": {"x":1707,"y":1441,"w":122,"h":281}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":638,"y":1369,"w":122,"h":281}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SockRightKneel.png": +{ + "frame": {"x":1833,"y":1490,"w":212,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":316,"y":816,"w":212,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BandGloveRightYoked.png": +{ + "frame": {"x":1997,"y":719,"w":47,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":317,"y":403,"w":47,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessMidKneel.png": +{ + "frame": {"x":1558,"y":1728,"w":271,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":685,"w":271,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/BandGloveRightYoked.png": +{ + "frame": {"x":1997,"y":719,"w":47,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":317,"y":403,"w":47,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRightKneel.png": +{ + "frame": {"x":1374,"y":648,"w":217,"h":316}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":312,"y":746,"w":217,"h":316}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRightKneelClosed.png": +{ + "frame": {"x":1487,"y":327,"w":217,"h":316}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":312,"y":746,"w":217,"h":316}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoUpperBand.png": +{ + "frame": {"x":303,"y":2015,"w":195,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":659,"w":195,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolfgirl/MascaraR.png": +{ + "frame": {"x":1998,"y":99,"w":47,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":69,"y":257,"w":47,"h":37}, + "sourceSize": {"w":347,"h":439} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas36.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas36.webp b/TextureAtlas/atlas36.webp new file mode 100644 index 000000000..a4cf4da2b Binary files /dev/null and b/TextureAtlas/atlas36.webp differ diff --git a/TextureAtlas/atlas37.json b/TextureAtlas/atlas37.json new file mode 100644 index 000000000..630db6222 --- /dev/null +++ b/TextureAtlas/atlas37.json @@ -0,0 +1,1029 @@ +{"frames": { + +"Models/Bandit/ShortsSpread.png": +{ + "frame": {"x":3,"y":516,"w":324,"h":257}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":750,"w":324,"h":257}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/Head.png": +{ + "frame": {"x":3,"y":1208,"w":312,"h":312}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":85,"w":312,"h":312}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/FootLeftKneel.png": +{ + "frame": {"x":1764,"y":1954,"w":173,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":722,"y":932,"w":173,"h":89}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoLowerClosed.png": +{ + "frame": {"x":1296,"y":1096,"w":314,"h":253}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":670,"w":314,"h":253}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoLowerLowRiseClosed.png": +{ + "frame": {"x":977,"y":1182,"w":314,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":718,"w":314,"h":205}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoLowerLowRiseSpread.png": +{ + "frame": {"x":1322,"y":508,"w":318,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":718,"w":318,"h":205}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoUpper.png": +{ + "frame": {"x":634,"y":1479,"w":304,"h":303}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":382,"w":304,"h":303}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProto.png": +{ + "frame": {"x":319,"y":1299,"w":311,"h":263}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":411,"y":404,"w":311,"h":263}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProtoLiningMidZipRim.png": +{ + "frame": {"x":1173,"y":1685,"w":230,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":616,"w":230,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowLeftFront.png": +{ + "frame": {"x":1987,"y":791,"w":58,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":602,"w":58,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsForeLongMittenLeftFront.png": +{ + "frame": {"x":1980,"y":1368,"w":65,"h":137}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":692,"y":582,"w":65,"h":137}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowLeftFront.png": +{ + "frame": {"x":602,"y":1566,"w":28,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":751,"y":604,"w":28,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayThighRightClosed.png": +{ + "frame": {"x":2005,"y":3,"w":40,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":1028,"w":40,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowRightBoxtie.png": +{ + "frame": {"x":602,"y":1733,"w":28,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":602,"w":28,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowRightYoked.png": +{ + "frame": {"x":1629,"y":821,"w":32,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":401,"y":509,"w":32,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockThighRightClosed.png": +{ + "frame": {"x":602,"y":1616,"w":28,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":487,"y":1033,"w":28,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowRightYoked.png": +{ + "frame": {"x":1994,"y":730,"w":51,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":496,"w":51,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapLongMittenLeftFree.png": +{ + "frame": {"x":1983,"y":1292,"w":62,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":861,"y":798,"w":62,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsForeLongMittenLeftFront.png": +{ + "frame": {"x":1980,"y":1368,"w":65,"h":137}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":692,"y":582,"w":65,"h":137}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/LockBeltShackle.png": +{ + "frame": {"x":1983,"y":1205,"w":62,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":780,"w":62,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightLockPlateClosed.png": +{ + "frame": {"x":1629,"y":749,"w":32,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":514,"y":1424,"w":32,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockPlateBoxtie.png": +{ + "frame": {"x":2005,"y":488,"w":39,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":745,"y":577,"w":39,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockPlateUp.png": +{ + "frame": {"x":2005,"y":62,"w":40,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":709,"y":255,"w":40,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightLockPlateUp.png": +{ + "frame": {"x":2005,"y":103,"w":40,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":271,"w":40,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightLockPlateCrossed.png": +{ + "frame": {"x":2005,"y":181,"w":40,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":656,"y":601,"w":40,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseNeckBoxtie.png": +{ + "frame": {"x":1308,"y":717,"w":317,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":431,"w":317,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseSkirtUnder.png": +{ + "frame": {"x":1295,"y":1457,"w":298,"h":224}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":368,"y":719,"w":298,"h":224}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/CrystalShoeRightSpread.png": +{ + "frame": {"x":1628,"y":1078,"w":31,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":1497,"w":31,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/SkirtKneel.png": +{ + "frame": {"x":331,"y":508,"w":324,"h":262}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":316,"y":749,"w":324,"h":262}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesK2/Eyes2Heart.png": +{ + "frame": {"x":1559,"y":1739,"w":70,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":612,"y":267,"w":70,"h":41}, + "sourceSize": {"w":753,"h":414} +}, +"Models/FaceFang2/MouthNeutral.png": +{ + "frame": {"x":2005,"y":144,"w":40,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":584,"y":316,"w":40,"h":33}, + "sourceSize": {"w":763,"h":461} +}, +"Models/FaceFangless/MouthNeutral.png": +{ + "frame": {"x":2005,"y":217,"w":40,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":320,"w":40,"h":30}, + "sourceSize": {"w":763,"h":461} +}, +"Models/FaceKjus/Eyes2Dazed.png": +{ + "frame": {"x":1597,"y":1495,"w":61,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":618,"y":272,"w":61,"h":32}, + "sourceSize": {"w":753,"h":414} +}, +"Models/FaceKjus/WhitesEyesAngry.png": +{ + "frame": {"x":1597,"y":1457,"w":61,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":523,"y":280,"w":61,"h":34}, + "sourceSize": {"w":725,"h":425} +}, +"Models/Festive/ButtonsTopTied.png": +{ + "frame": {"x":1713,"y":1719,"w":224,"h":231}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":416,"w":224,"h":231}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/StrapBot.png": +{ + "frame": {"x":1392,"y":1786,"w":237,"h":250}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":467,"y":666,"w":237,"h":250}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/StrapTopUp.png": +{ + "frame": {"x":942,"y":1479,"w":227,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":407,"w":227,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/BigBall.png": +{ + "frame": {"x":1373,"y":1739,"w":58,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":103,"y":234,"w":58,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BigBall2Fang.png": +{ + "frame": {"x":1435,"y":1739,"w":58,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":103,"y":234,"w":58,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BigBallFang.png": +{ + "frame": {"x":1497,"y":1739,"w":58,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":103,"y":234,"w":58,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/Rim.png": +{ + "frame": {"x":602,"y":1665,"w":28,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":110,"y":153,"w":28,"h":31}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Gasmask/Plugs.png": +{ + "frame": {"x":942,"y":1739,"w":139,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":71,"y":240,"w":139,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair2/HairAura.png": +{ + "frame": {"x":326,"y":998,"w":313,"h":297}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":109,"w":313,"h":297}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/ArmsCrossed.png": +{ + "frame": {"x":1663,"y":1090,"w":316,"h":212}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":512,"w":316,"h":212}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/ChestBoxtie.png": +{ + "frame": {"x":1008,"y":148,"w":326,"h":310}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":375,"w":326,"h":310}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/ChestCrossed.png": +{ + "frame": {"x":1677,"y":3,"w":324,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":375,"w":324,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandWristRightCrossed.png": +{ + "frame": {"x":1628,"y":854,"w":32,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":661,"y":614,"w":32,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/CollarDeco.png": +{ + "frame": {"x":2005,"y":316,"w":39,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":526,"w":39,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Ears2InnerR.png": +{ + "frame": {"x":1985,"y":1037,"w":60,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":498,"y":109,"w":60,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChestCollarStripes.png": +{ + "frame": {"x":1980,"y":1509,"w":65,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":431,"w":65,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChestCollarStripesUp.png": +{ + "frame": {"x":1980,"y":1509,"w":65,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":431,"w":65,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowRightYoked.png": +{ + "frame": {"x":1614,"y":1230,"w":44,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":405,"y":524,"w":44,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/LeotardChest.png": +{ + "frame": {"x":1665,"y":820,"w":316,"h":266}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":401,"w":316,"h":266}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandBelt.png": +{ + "frame": {"x":1407,"y":1685,"w":222,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":471,"y":680,"w":222,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowLeftUp.png": +{ + "frame": {"x":1198,"y":1739,"w":108,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":722,"y":265,"w":108,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandWristRightFront.png": +{ + "frame": {"x":1310,"y":1739,"w":59,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":545,"w":59,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowRightYoked.png": +{ + "frame": {"x":1614,"y":1145,"w":44,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":402,"y":523,"w":44,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareThighLeftKneel.png": +{ + "frame": {"x":1994,"y":666,"w":51,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":877,"w":51,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareThighLeftKneelClosed.png": +{ + "frame": {"x":1994,"y":666,"w":51,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":877,"w":51,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/ApronKneel.png": +{ + "frame": {"x":3,"y":777,"w":323,"h":159}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":395,"y":741,"w":323,"h":159}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLeftKneel.png": +{ + "frame": {"x":673,"y":3,"w":331,"h":159}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":950,"w":331,"h":159}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLegLeftKneelClosed.png": +{ + "frame": {"x":1941,"y":1719,"w":104,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":381,"y":910,"w":104,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GloveRightBoxtie.png": +{ + "frame": {"x":2005,"y":360,"w":39,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":677,"w":39,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GloveRightYoked.png": +{ + "frame": {"x":1941,"y":1912,"w":100,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":294,"y":285,"w":100,"h":133}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronLeftStraps.png": +{ + "frame": {"x":1614,"y":1311,"w":44,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":505,"w":44,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmLeftFront.png": +{ + "frame": {"x":1173,"y":1391,"w":118,"h":290}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":685,"y":426,"w":118,"h":290}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/BootLeftHogtie.png": +{ + "frame": {"x":1633,"y":1685,"w":76,"h":265}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":674,"y":898,"w":76,"h":265}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressChestBoxtie.png": +{ + "frame": {"x":306,"y":1786,"w":290,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":389,"w":290,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressChestFree.png": +{ + "frame": {"x":600,"y":1786,"w":289,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":389,"w":289,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressChestUp.png": +{ + "frame": {"x":893,"y":1786,"w":276,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":389,"w":276,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressChestWristtie.png": +{ + "frame": {"x":3,"y":1786,"w":299,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":389,"w":299,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardLeftWristtie.png": +{ + "frame": {"x":2005,"y":284,"w":40,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":685,"y":663,"w":40,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardRightYoked.png": +{ + "frame": {"x":1628,"y":915,"w":31,"h":159}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":300,"y":393,"w":31,"h":159}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LockRightFront.png": +{ + "frame": {"x":1629,"y":717,"w":33,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":557,"w":33,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SkirtOverKneel.png": +{ + "frame": {"x":1008,"y":3,"w":331,"h":141}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":801,"w":331,"h":141}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ThighRightKneel.png": +{ + "frame": {"x":1173,"y":1786,"w":215,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":308,"y":805,"w":215,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ThighRightKneelClosed.png": +{ + "frame": {"x":1173,"y":1786,"w":215,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":308,"y":805,"w":215,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveRightWristtie.png": +{ + "frame": {"x":1629,"y":787,"w":32,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":500,"w":32,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/LacesKneel.png": +{ + "frame": {"x":1666,"y":735,"w":317,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":773,"w":317,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Arm1Boxtie.png": +{ + "frame": {"x":977,"y":1060,"w":315,"h":118}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":515,"w":315,"h":118}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Arm1Up.png": +{ + "frame": {"x":979,"y":925,"w":316,"h":131}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":316,"w":316,"h":131}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Arm2Wristtie.png": +{ + "frame": {"x":673,"y":166,"w":326,"h":181}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":484,"w":326,"h":181}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/ArmStrapCrossed.png": +{ + "frame": {"x":1983,"y":1113,"w":62,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":553,"y":602,"w":62,"h":88}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopArmStrapCrossed.png": +{ + "frame": {"x":1985,"y":945,"w":60,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":554,"y":602,"w":60,"h":88}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/GoldKneel.png": +{ + "frame": {"x":1308,"y":844,"w":316,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":605,"w":316,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/PauldronsFree.png": +{ + "frame": {"x":3,"y":940,"w":319,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":407,"w":319,"h":88}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ShoeRightClosed.png": +{ + "frame": {"x":1633,"y":1954,"w":127,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":1528,"w":127,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/ForeArm1Wristtie.png": +{ + "frame": {"x":1628,"y":885,"w":32,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":688,"w":32,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ChestBoxtie.png": +{ + "frame": {"x":3,"y":244,"w":324,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":360,"w":324,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/SleeveLeftYoked.png": +{ + "frame": {"x":1597,"y":1531,"w":112,"h":150}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":717,"y":410,"w":112,"h":150}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/LeftArm2Wristtie.png": +{ + "frame": {"x":1613,"y":1387,"w":44,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":639,"w":44,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderRightYoked.png": +{ + "frame": {"x":1085,"y":1739,"w":109,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":416,"w":109,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ChestBoxtie.png": +{ + "frame": {"x":666,"y":351,"w":324,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":360,"w":324,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/RpArmbinder Secure.png": +{ + "frame": {"x":643,"y":1206,"w":311,"h":269}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":84,"y":300,"w":311,"h":269}, + "sourceSize": {"w":450,"h":675} +}, +"Models/SteelCuffs/RimAnkleLeftKneel.png": +{ + "frame": {"x":1980,"y":1610,"w":65,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":698,"y":924,"w":65,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallLegLeftKneelClosed.png": +{ + "frame": {"x":1343,"y":3,"w":330,"h":262}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":382,"y":819,"w":330,"h":262}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmFullLeftBoxtie.png": +{ + "frame": {"x":1662,"y":1306,"w":314,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":415,"w":314,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmLeftBoxtie.png": +{ + "frame": {"x":1677,"y":261,"w":324,"h":235}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":475,"w":324,"h":235}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmRightBoxtie.png": +{ + "frame": {"x":1338,"y":269,"w":324,"h":235}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":475,"w":324,"h":235}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/BottomKneel.png": +{ + "frame": {"x":659,"y":623,"w":324,"h":203}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":652,"w":324,"h":203}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/HandRightBoxtie.png": +{ + "frame": {"x":2005,"y":403,"w":39,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":679,"w":39,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/TopBoxtie.png": +{ + "frame": {"x":1713,"y":1505,"w":263,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":500,"w":263,"h":210}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/TopCrossed.png": +{ + "frame": {"x":331,"y":774,"w":323,"h":220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":470,"w":323,"h":220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/TopFullBoxtie.png": +{ + "frame": {"x":338,"y":231,"w":324,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":384,"w":324,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmLeftBoxtie.png": +{ + "frame": {"x":1295,"y":1353,"w":314,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":584,"w":314,"h":96}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmStrapLeftBoxtie.png": +{ + "frame": {"x":3,"y":1032,"w":313,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":438,"w":313,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/FeetKneel.png": +{ + "frame": {"x":1994,"y":601,"w":51,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":789,"y":922,"w":51,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/LegsKneel.png": +{ + "frame": {"x":3,"y":1524,"w":311,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":808,"w":311,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmFullLeftBoxtie.png": +{ + "frame": {"x":1662,"y":1306,"w":314,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":415,"w":314,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmStrapLeftBoxtie.png": +{ + "frame": {"x":3,"y":1032,"w":313,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":438,"w":313,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/HandRightBoxtie.png": +{ + "frame": {"x":2005,"y":403,"w":39,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":679,"w":39,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/TopBoxtie.png": +{ + "frame": {"x":994,"y":462,"w":324,"h":211}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":475,"w":324,"h":211}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/TopCrossed.png": +{ + "frame": {"x":331,"y":774,"w":323,"h":220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":470,"w":323,"h":220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/TopFullBoxtie.png": +{ + "frame": {"x":338,"y":231,"w":324,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":384,"w":324,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/DressChestBoxtie.png": +{ + "frame": {"x":987,"y":677,"w":317,"h":244}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":391,"w":317,"h":244}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/PantyhoseSpread.png": +{ + "frame": {"x":658,"y":995,"w":315,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":742,"w":315,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/Skirt.png": +{ + "frame": {"x":338,"y":3,"w":331,"h":224}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":439,"y":766,"w":331,"h":224}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/ForeArmLeftCrossed.png": +{ + "frame": {"x":958,"y":1391,"w":205,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":558,"y":629,"w":205,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ArmbandYoked.png": +{ + "frame": {"x":1985,"y":849,"w":60,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":403,"y":499,"w":60,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BraYoked.png": +{ + "frame": {"x":318,"y":1566,"w":280,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":412,"w":280,"h":216}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/GloveRightBoxtie.png": +{ + "frame": {"x":2005,"y":446,"w":39,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":678,"w":39,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/ApprenticeHat.png": +{ + "frame": {"x":1666,"y":500,"w":324,"h":231}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":497,"y":18,"w":324,"h":231}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/AnkleLeftKneelClosed.png": +{ + "frame": {"x":1994,"y":529,"w":51,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":942,"w":51,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessLowerClosed.png": +{ + "frame": {"x":658,"y":830,"w":317,"h":161}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":797,"w":317,"h":161}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/Module.png": +{ + "frame": {"x":602,"y":1700,"w":28,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":631,"y":402,"w":28,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveRightWristtie.png": +{ + "frame": {"x":2005,"y":251,"w":40,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":498,"w":40,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/ShirtChestYoked.png": +{ + "frame": {"x":3,"y":3,"w":331,"h":237}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":392,"w":331,"h":237}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas37.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas37.webp b/TextureAtlas/atlas37.webp new file mode 100644 index 000000000..f7e2c7b39 Binary files /dev/null and b/TextureAtlas/atlas37.webp differ diff --git a/TextureAtlas/atlas38.json b/TextureAtlas/atlas38.json new file mode 100644 index 000000000..845034611 --- /dev/null +++ b/TextureAtlas/atlas38.json @@ -0,0 +1,797 @@ +{"frames": { + +"Models/Bandit/ShortsClosed.png": +{ + "frame": {"x":1566,"y":1844,"w":298,"h":201}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":751,"w":298,"h":201}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Legs2KneelClosed.png": +{ + "frame": {"x":1722,"y":746,"w":117,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":397,"y":928,"w":117,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmRightWristtie.png": +{ + "frame": {"x":1910,"y":926,"w":134,"h":204}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":430,"w":134,"h":204}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/HandRightBoxtie.png": +{ + "frame": {"x":78,"y":322,"w":138,"h":313}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":579,"y":411,"w":138,"h":313}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/LegLeftHogtie.png": +{ + "frame": {"x":1555,"y":3,"w":163,"h":288}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":919,"w":163,"h":288}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/SockLeftHogtie.png": +{ + "frame": {"x":1265,"y":597,"w":170,"h":289}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":569,"y":918,"w":170,"h":289}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmLeftCrossed.png": +{ + "frame": {"x":1075,"y":1266,"w":107,"h":293}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":662,"y":404,"w":107,"h":293}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmLeftFront.png": +{ + "frame": {"x":898,"y":309,"w":107,"h":299}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":662,"y":404,"w":107,"h":299}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/LegLeftHogtie.png": +{ + "frame": {"x":1407,"y":1266,"w":163,"h":288}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":919,"w":163,"h":288}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/LegRightHogtie.png": +{ + "frame": {"x":1284,"y":297,"w":145,"h":289}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":918,"w":145,"h":289}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/SleevelessTorsoUpper.png": +{ + "frame": {"x":501,"y":317,"w":268,"h":303}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":382,"w":268,"h":303}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BeltStrap.png": +{ + "frame": {"x":1439,"y":587,"w":170,"h":218}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":557,"y":705,"w":170,"h":218}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/AnkleLinkSpread.png": +{ + "frame": {"x":1306,"y":1203,"w":151,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":546,"y":1438,"w":151,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenLeftFree.png": +{ + "frame": {"x":296,"y":954,"w":160,"h":309}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":496,"w":160,"h":309}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/ForeLongMittenRightFront.png": +{ + "frame": {"x":1613,"y":676,"w":105,"h":161}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":560,"w":105,"h":161}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenLeftUp.png": +{ + "frame": {"x":1700,"y":1583,"w":169,"h":257}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":165,"w":169,"h":257}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowRightFront.png": +{ + "frame": {"x":1910,"y":874,"w":27,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":595,"w":27,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenLeftUp.png": +{ + "frame": {"x":1700,"y":1583,"w":169,"h":257}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":165,"w":169,"h":257}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenLeftUp.png": +{ + "frame": {"x":1700,"y":1583,"w":169,"h":257}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":165,"w":169,"h":257}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/DisplayLegsHogtie.png": +{ + "frame": {"x":3,"y":958,"w":289,"h":313}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":907,"w":289,"h":313}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/LegsKneelClosed.png": +{ + "frame": {"x":1321,"y":3,"w":230,"h":288}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":308,"y":784,"w":230,"h":288}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftDecoSpread.png": +{ + "frame": {"x":1439,"y":1031,"w":68,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":683,"y":1439,"w":68,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightDecoCleanSpread.png": +{ + "frame": {"x":1511,"y":1031,"w":68,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":1439,"w":68,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/CollarDeco.png": +{ + "frame": {"x":991,"y":1225,"w":90,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":583,"y":389,"w":90,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightLockBandCrossed.png": +{ + "frame": {"x":1583,"y":1031,"w":25,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":651,"y":603,"w":25,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmLeftCrossed.png": +{ + "frame": {"x":1700,"y":1066,"w":206,"h":255}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":569,"y":441,"w":206,"h":255}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BowCorsetLong.png": +{ + "frame": {"x":788,"y":928,"w":276,"h":293}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":566,"w":276,"h":293}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageBra.png": +{ + "frame": {"x":1291,"y":1859,"w":271,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":443,"w":271,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/ShoeRightSpread.png": +{ + "frame": {"x":864,"y":1870,"w":111,"h":175}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":491,"y":1467,"w":111,"h":175}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/SkirtCrotchStrap.png": +{ + "frame": {"x":3,"y":3,"w":218,"h":315}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":432,"y":781,"w":218,"h":315}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceKjus/MouthNeutral.png": +{ + "frame": {"x":1910,"y":841,"w":39,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":322,"w":39,"h":29}, + "sourceSize": {"w":763,"h":461} +}, +"Models/FutureHarness/MetalMid.png": +{ + "frame": {"x":894,"y":1225,"w":93,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":519,"y":713,"w":93,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/LargeBallHarness.png": +{ + "frame": {"x":1547,"y":1558,"w":149,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":282}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/BackShortMessy.png": +{ + "frame": {"x":295,"y":1275,"w":293,"h":309}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":485,"y":93,"w":293,"h":309}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Bob.png": +{ + "frame": {"x":822,"y":1266,"w":249,"h":293}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":94,"w":249,"h":293}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/BraidCustomBack.png": +{ + "frame": {"x":470,"y":637,"w":290,"h":303}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":104,"w":290,"h":303}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/FrontStraight2_Front.png": +{ + "frame": {"x":1613,"y":504,"w":105,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":497,"y":109,"w":105,"h":168}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/HairAura_Left.png": +{ + "frame": {"x":704,"y":3,"w":192,"h":302}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":603,"y":109,"w":192,"h":302}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletSoleLeftSpread.png": +{ + "frame": {"x":1613,"y":295,"w":105,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":1473,"w":105,"h":205}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/FlatBalletRightClosed.png": +{ + "frame": {"x":3,"y":322,"w":71,"h":314}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":1365,"w":71,"h":314}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/ShinyBalletRightClosed.png": +{ + "frame": {"x":3,"y":640,"w":71,"h":314}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":1365,"w":71,"h":314}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLegLeftHogtie.png": +{ + "frame": {"x":549,"y":1588,"w":169,"h":309}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":575,"y":902,"w":169,"h":309}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLegRightKneelClosed.png": +{ + "frame": {"x":1700,"y":1325,"w":206,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":314,"y":811,"w":206,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/ArmsBoxtie.png": +{ + "frame": {"x":1722,"y":570,"w":310,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":513,"w":310,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/ArmsWristtie.png": +{ + "frame": {"x":1722,"y":3,"w":311,"h":236}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":513,"w":311,"h":236}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/ChestBoleroBoxtie.png": +{ + "frame": {"x":225,"y":3,"w":309,"h":310}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":375,"w":309,"h":310}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/LatexUpper.png": +{ + "frame": {"x":592,"y":1266,"w":226,"h":300}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":394,"w":226,"h":300}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowRightUp.png": +{ + "frame": {"x":1461,"y":1203,"w":101,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":259,"w":101,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandThighRightKneel.png": +{ + "frame": {"x":1574,"y":1462,"w":118,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":381,"y":791,"w":118,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LegsKneel.png": +{ + "frame": {"x":900,"y":3,"w":296,"h":296}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":769,"w":296,"h":296}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LegsKneelClosed.png": +{ + "frame": {"x":722,"y":1570,"w":296,"h":296}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":769,"w":296,"h":296}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/LegbinderHogtie.png": +{ + "frame": {"x":538,"y":3,"w":162,"h":303}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":580,"y":909,"w":162,"h":303}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/RightLegbinderHogtie.png": +{ + "frame": {"x":631,"y":944,"w":153,"h":300}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":911,"w":153,"h":300}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/BlouseBust.png": +{ + "frame": {"x":1289,"y":1066,"w":273,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":494,"w":273,"h":133}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftCrossed.png": +{ + "frame": {"x":740,"y":1870,"w":120,"h":175}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":687,"y":538,"w":120,"h":175}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightCrossed.png": +{ + "frame": {"x":1099,"y":599,"w":162,"h":291}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":392,"w":162,"h":291}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLeftHogtie.png": +{ + "frame": {"x":764,"y":624,"w":144,"h":300}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":606,"y":899,"w":144,"h":300}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootShoeLeftClosed.png": +{ + "frame": {"x":1910,"y":1330,"w":111,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":1452,"w":111,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletLeftFront.png": +{ + "frame": {"x":1868,"y":1844,"w":177,"h":200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":551,"y":464,"w":177,"h":200}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveLeftUp.png": +{ + "frame": {"x":1108,"y":303,"w":172,"h":290}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":651,"y":282,"w":172,"h":290}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveRightFront.png": +{ + "frame": {"x":1566,"y":1066,"w":130,"h":196}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":420,"w":130,"h":196}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmRightFront.png": +{ + "frame": {"x":1022,"y":1563,"w":127,"h":293}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":422,"y":424,"w":127,"h":293}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/BootRightKneel.png": +{ + "frame": {"x":323,"y":1903,"w":79,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":813,"w":79,"h":142}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ForeArmLeftFront.png": +{ + "frame": {"x":1306,"y":890,"w":129,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":626,"y":544,"w":129,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GloveLeftFree.png": +{ + "frame": {"x":1843,"y":746,"w":107,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":813,"y":773,"w":107,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardLeftUp.png": +{ + "frame": {"x":1433,"y":295,"w":176,"h":288}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":662,"y":219,"w":176,"h":288}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardRightFront.png": +{ + "frame": {"x":237,"y":1903,"w":82,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":412,"y":530,"w":82,"h":142}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LeatherLeftYoked.png": +{ + "frame": {"x":143,"y":1903,"w":90,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":859,"y":287,"w":90,"h":142}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SkirtBandCrotchStrap.png": +{ + "frame": {"x":1954,"y":746,"w":91,"h":176}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":759,"w":91,"h":176}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveLeftUp.png": +{ + "frame": {"x":1439,"y":809,"w":170,"h":218}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":168,"w":170,"h":218}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Thigh3Closed.png": +{ + "frame": {"x":1613,"y":841,"w":293,"h":221}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":918,"w":293,"h":221}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopRightThigh1KneelClosed.png": +{ + "frame": {"x":788,"y":1225,"w":102,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":335,"y":911,"w":102,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopThigh2KneelClosed.png": +{ + "frame": {"x":3,"y":1903,"w":136,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":874,"w":136,"h":142}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/GoldBaseSpread.png": +{ + "frame": {"x":3,"y":1275,"w":288,"h":310}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":606,"w":288,"h":310}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/GoldClosed.png": +{ + "frame": {"x":189,"y":639,"w":277,"h":311}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":605,"w":277,"h":311}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/GoldSpread.png": +{ + "frame": {"x":220,"y":322,"w":277,"h":311}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":605,"w":277,"h":311}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SkirtClosedCrotchStrap.png": +{ + "frame": {"x":1722,"y":243,"w":311,"h":218}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":713,"w":311,"h":218}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/LegRightKneel.png": +{ + "frame": {"x":1153,"y":1563,"w":219,"h":292}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":319,"y":768,"w":219,"h":292}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/LegRightKneelClosed.png": +{ + "frame": {"x":1068,"y":908,"w":217,"h":291}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":323,"y":768,"w":217,"h":291}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ArmRightFront.png": +{ + "frame": {"x":773,"y":309,"w":121,"h":299}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":648,"y":404,"w":121,"h":299}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/LegRightKneelClosed.png": +{ + "frame": {"x":1186,"y":1266,"w":217,"h":291}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":323,"y":768,"w":217,"h":291}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/LeftHogtie.png": +{ + "frame": {"x":406,"y":1903,"w":50,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":797,"w":50,"h":142}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/LegLeftHogtie.png": +{ + "frame": {"x":1376,"y":1561,"w":167,"h":291}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":576,"y":920,"w":167,"h":291}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLegLeftHogtie.png": +{ + "frame": {"x":460,"y":954,"w":167,"h":308}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":575,"y":901,"w":167,"h":308}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/AnklesClosed.png": +{ + "frame": {"x":912,"y":612,"w":183,"h":292}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":1216,"w":183,"h":292}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmFullLeftWristtie.png": +{ + "frame": {"x":1200,"y":3,"w":117,"h":290}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":665,"y":384,"w":117,"h":290}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/PetsuitTopBody.png": +{ + "frame": {"x":460,"y":1903,"w":276,"h":141}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":571,"w":276,"h":141}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/AnklesClosed.png": +{ + "frame": {"x":1873,"y":1583,"w":172,"h":232}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":1276,"w":172,"h":232}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmFullLeftWristtie.png": +{ + "frame": {"x":1200,"y":3,"w":117,"h":290}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":665,"y":384,"w":117,"h":290}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/BottomKneel.png": +{ + "frame": {"x":1722,"y":465,"w":311,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":734,"w":311,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ForeArmRightFront.png": +{ + "frame": {"x":1910,"y":1134,"w":134,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":416,"y":529,"w":134,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveLeftFront.png": +{ + "frame": {"x":1009,"y":303,"w":95,"h":292}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":422,"w":95,"h":292}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseRightFront.png": +{ + "frame": {"x":1574,"y":1266,"w":122,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":420,"w":122,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessMid.png": +{ + "frame": {"x":979,"y":1870,"w":308,"h":174}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":685,"w":308,"h":174}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoUpper.png": +{ + "frame": {"x":3,"y":1589,"w":269,"h":310}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":390,"w":269,"h":310}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoUpper2.png": +{ + "frame": {"x":276,"y":1589,"w":269,"h":310}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":390,"w":269,"h":310}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoUpperRim.png": +{ + "frame": {"x":1085,"y":1203,"w":217,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":641,"w":217,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SleeveLeftWristtie.png": +{ + "frame": {"x":78,"y":639,"w":107,"h":312}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":675,"y":443,"w":107,"h":312}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas38.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas38.webp b/TextureAtlas/atlas38.webp new file mode 100644 index 000000000..0b9454384 Binary files /dev/null and b/TextureAtlas/atlas38.webp differ diff --git a/TextureAtlas/atlas39.json b/TextureAtlas/atlas39.json new file mode 100644 index 000000000..6e14f1a3e --- /dev/null +++ b/TextureAtlas/atlas39.json @@ -0,0 +1,1077 @@ +{"frames": { + +"Models/ArmorChain/PantiesKneel.png": +{ + "frame": {"x":316,"y":271,"w":303,"h":103}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":753,"w":303,"h":103}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/ShirtChestFree.png": +{ + "frame": {"x":890,"y":1236,"w":282,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":412,"w":282,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/Skirt2Hogtie.png": +{ + "frame": {"x":616,"y":431,"w":299,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":740,"w":299,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/Skirt2HogtieCrotchStrap.png": +{ + "frame": {"x":307,"y":626,"w":299,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":740,"w":299,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/Skirt2Kneel.png": +{ + "frame": {"x":1206,"y":826,"w":292,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":352,"y":796,"w":292,"h":170}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShortsLeftKneel.png": +{ + "frame": {"x":1557,"y":236,"w":303,"h":219}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":752,"w":303,"h":219}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShortsLeftKneelClosed.png": +{ + "frame": {"x":625,"y":208,"w":303,"h":219}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":752,"w":303,"h":219}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Feet2Kneel.png": +{ + "frame": {"x":800,"y":1624,"w":80,"h":140}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":564,"y":939,"w":80,"h":140}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/Nipples.png": +{ + "frame": {"x":1821,"y":1853,"w":224,"h":151}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":556,"w":224,"h":151}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/EarsFront.png": +{ + "frame": {"x":919,"y":480,"w":297,"h":243}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":14,"w":297,"h":243}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoLower.png": +{ + "frame": {"x":3,"y":1171,"w":290,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":670,"w":290,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoLowerHogtie.png": +{ + "frame": {"x":304,"y":1144,"w":290,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":657,"w":290,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoLowerLowRise.png": +{ + "frame": {"x":899,"y":1026,"w":290,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":718,"w":290,"h":206}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/China/DressSkirtClosed.png": +{ + "frame": {"x":3,"y":3,"w":309,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":734,"w":309,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowRightBoxtie.png": +{ + "frame": {"x":1416,"y":1775,"w":28,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":604,"w":28,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenRightFront.png": +{ + "frame": {"x":1416,"y":1805,"w":27,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":510,"w":27,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/DisplayLongMittenLeftFree.png": +{ + "frame": {"x":1727,"y":1656,"w":90,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":762,"y":520,"w":90,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowLongMittenLeftFront.png": +{ + "frame": {"x":706,"y":1937,"w":83,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":724,"y":500,"w":83,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowLongMittenRightYoked.png": +{ + "frame": {"x":275,"y":1669,"w":220,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":273,"y":376,"w":220,"h":180}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenRightYoked.png": +{ + "frame": {"x":3,"y":1631,"w":145,"h":218}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":319,"y":420,"w":145,"h":218}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayThighRightKneel.png": +{ + "frame": {"x":1501,"y":1041,"w":31,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":381,"y":824,"w":31,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayThighRightKneelClosed.png": +{ + "frame": {"x":1501,"y":1089,"w":31,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":381,"y":824,"w":31,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenAnkleRightClosed.png": +{ + "frame": {"x":1114,"y":1854,"w":49,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":532,"y":1426,"w":49,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenRightYoked.png": +{ + "frame": {"x":3,"y":1631,"w":145,"h":218}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":319,"y":420,"w":145,"h":218}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ForeMittenRightFront.png": +{ + "frame": {"x":1727,"y":1914,"w":90,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":462,"w":90,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenRightFront.png": +{ + "frame": {"x":1416,"y":1805,"w":27,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":510,"w":27,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenLeftFront.png": +{ + "frame": {"x":706,"y":1937,"w":83,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":724,"y":500,"w":83,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/LockBeltLines.png": +{ + "frame": {"x":1462,"y":1454,"w":71,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":537,"y":769,"w":71,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/CollarDecoClean.png": +{ + "frame": {"x":1821,"y":2008,"w":90,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":583,"y":389,"w":90,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightDecoFront.png": +{ + "frame": {"x":1915,"y":2008,"w":83,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":622,"w":83,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseCollar.png": +{ + "frame": {"x":583,"y":1548,"w":273,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":409,"w":273,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseNeck.png": +{ + "frame": {"x":1252,"y":65,"w":305,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":412,"w":305,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BowCorsetLongRuffle.png": +{ + "frame": {"x":1537,"y":1224,"w":287,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":761,"w":287,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BowCorsetRuffle.png": +{ + "frame": {"x":1537,"y":1563,"w":280,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":746,"w":280,"h":89}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/ShoeLeftKneel.png": +{ + "frame": {"x":1874,"y":91,"w":170,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":729,"y":909,"w":170,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/Fox.png": +{ + "frame": {"x":3,"y":652,"w":298,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":3,"w":298,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/Wolf.png": +{ + "frame": {"x":1452,"y":1664,"w":271,"h":185}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":27,"w":271,"h":185}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Expressions/Tears_Light.png": +{ + "frame": {"x":1828,"y":1336,"w":217,"h":241}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":120,"w":217,"h":241}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesK2/Eyes2Closed.png": +{ + "frame": {"x":629,"y":2005,"w":71,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":265,"w":71,"h":40}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyes2Closed.png": +{ + "frame": {"x":629,"y":2005,"w":71,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":265,"w":71,"h":40}, + "sourceSize": {"w":781,"h":560} +}, +"Models/FaceFang2/MouthSurprised.png": +{ + "frame": {"x":1502,"y":943,"w":31,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":316,"w":31,"h":45}, + "sourceSize": {"w":754,"h":450} +}, +"Models/FaceFangless/MouthSurprised.png": +{ + "frame": {"x":1502,"y":992,"w":31,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":320,"w":31,"h":45}, + "sourceSize": {"w":754,"h":450} +}, +"Models/FaceKjus/Brows2Neutral.png": +{ + "frame": {"x":1632,"y":2020,"w":81,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":575,"y":243,"w":81,"h":24}, + "sourceSize": {"w":725,"h":424} +}, +"Models/FaceKjus/MouthSurprised.png": +{ + "frame": {"x":1501,"y":1137,"w":31,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":322,"w":31,"h":44}, + "sourceSize": {"w":754,"h":450} +}, +"Models/GagLeather/MuzzleSideStrap.png": +{ + "frame": {"x":1114,"y":1669,"w":50,"h":181}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":191,"y":46,"w":50,"h":181}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/PanelStrap.png": +{ + "frame": {"x":1864,"y":432,"w":181,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":39,"y":71,"w":181,"h":206}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/BraidCustom_Overstrap.png": +{ + "frame": {"x":1236,"y":424,"w":297,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":135,"w":297,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/HairAura_Front.png": +{ + "frame": {"x":499,"y":1669,"w":203,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":111,"w":203,"h":180}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/Irish8AnkleLeftClosed.png": +{ + "frame": {"x":1727,"y":2016,"w":87,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":593,"y":1431,"w":87,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/BeltsStrapClosed.png": +{ + "frame": {"x":1484,"y":1220,"w":49,"h":230}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":552,"y":690,"w":49,"h":230}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/Headband.png": +{ + "frame": {"x":598,"y":1180,"w":288,"h":154}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":90,"w":288,"h":154}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/BeltsTorsoLowerCrossed.png": +{ + "frame": {"x":1537,"y":1340,"w":282,"h":219}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":665,"w":282,"h":219}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Kigu/Mask.png": +{ + "frame": {"x":800,"y":1768,"w":221,"h":277}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":118,"w":221,"h":277}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowLeftFree.png": +{ + "frame": {"x":1836,"y":459,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":750,"y":612,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowLeftFront.png": +{ + "frame": {"x":1836,"y":489,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":748,"y":628,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowLeftUp.png": +{ + "frame": {"x":1836,"y":519,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":800,"y":281,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowLeftWristtie.png": +{ + "frame": {"x":1836,"y":549,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":705,"y":633,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowLeftYoked.png": +{ + "frame": {"x":1836,"y":579,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":805,"y":524,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowRightUp.png": +{ + "frame": {"x":1836,"y":609,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":286,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/CollarDecoSymbol.png": +{ + "frame": {"x":1416,"y":1745,"w":31,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":566,"y":534,"w":31,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/HeadHarnessRing.png": +{ + "frame": {"x":1501,"y":1185,"w":31,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":579,"y":257,"w":31,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChestCollarLeftTied.png": +{ + "frame": {"x":1025,"y":1922,"w":137,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":579,"y":409,"w":137,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/Leotard.png": +{ + "frame": {"x":610,"y":708,"w":296,"h":272}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":565,"w":296,"h":272}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LegsBeltsKneel.png": +{ + "frame": {"x":1834,"y":642,"w":210,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":305,"y":812,"w":210,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LegsBeltsKneelClosed.png": +{ + "frame": {"x":1834,"y":642,"w":210,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":305,"y":812,"w":210,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Leash/LeashCollarHardware.png": +{ + "frame": {"x":1502,"y":826,"w":31,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":384,"w":31,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandThighRightClosed.png": +{ + "frame": {"x":588,"y":1624,"w":113,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":1043,"w":113,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ThighLeftKneelClosed.png": +{ + "frame": {"x":513,"y":1853,"w":189,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":847,"w":189,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronKneel.png": +{ + "frame": {"x":1833,"y":900,"w":212,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":651,"w":212,"h":208}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftUp.png": +{ + "frame": {"x":1870,"y":207,"w":175,"h":221}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":165,"w":175,"h":221}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLegLeftHogtie.png": +{ + "frame": {"x":513,"y":2005,"w":112,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":566,"y":1189,"w":112,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLegRightHogtie.png": +{ + "frame": {"x":705,"y":1624,"w":91,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":1182,"w":91,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/Corset.png": +{ + "frame": {"x":1168,"y":1853,"w":232,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":589,"w":232,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/CorsetOrig.png": +{ + "frame": {"x":276,"y":1853,"w":233,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":589,"w":233,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/FootBootLeftHogtie.png": +{ + "frame": {"x":1025,"y":1768,"w":85,"h":150}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":719,"y":769,"w":85,"h":150}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PantyhoseClosed.png": +{ + "frame": {"x":310,"y":378,"w":302,"h":244}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":702,"w":302,"h":244}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PantyhoseHogtie.png": +{ + "frame": {"x":310,"y":378,"w":302,"h":244}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":702,"w":302,"h":244}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveLeftFront.png": +{ + "frame": {"x":152,"y":1631,"w":119,"h":218}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":688,"y":419,"w":119,"h":218}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ApronChest.png": +{ + "frame": {"x":3,"y":1429,"w":282,"h":198}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":403,"w":282,"h":198}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ApronChestBoxtie.png": +{ + "frame": {"x":598,"y":1338,"w":282,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":403,"w":282,"h":206}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ApronChestCrossed.png": +{ + "frame": {"x":1206,"y":1000,"w":291,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":403,"w":291,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ApronChestFront.png": +{ + "frame": {"x":1176,"y":1331,"w":282,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":403,"w":282,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressKneel.png": +{ + "frame": {"x":604,"y":984,"w":291,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":582,"w":291,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/Top.png": +{ + "frame": {"x":884,"y":1669,"w":226,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":573,"w":226,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopShoulders.png": +{ + "frame": {"x":910,"y":727,"w":292,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":406,"w":292,"h":206}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveLeftCrossed.png": +{ + "frame": {"x":1404,"y":1853,"w":224,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":547,"y":508,"w":224,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/BaseKneel.png": +{ + "frame": {"x":932,"y":374,"w":300,"h":102}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":754,"w":300,"h":102}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/LinesKneel.png": +{ + "frame": {"x":3,"y":280,"w":303,"h":102}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":753,"w":303,"h":102}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/StripesKneel.png": +{ + "frame": {"x":1537,"y":459,"w":295,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":755,"w":295,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/LegsBeltsKneel.png": +{ + "frame": {"x":1834,"y":642,"w":210,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":305,"y":812,"w":210,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/LegsBeltsKneelClosed.png": +{ + "frame": {"x":1834,"y":642,"w":210,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":305,"y":812,"w":210,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/LegsKneel.png": +{ + "frame": {"x":1821,"y":1581,"w":224,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":303,"y":800,"w":224,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/LegsKneelClosed.png": +{ + "frame": {"x":1821,"y":1581,"w":224,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":303,"y":800,"w":224,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/ArmHarness.png": +{ + "frame": {"x":1832,"y":1112,"w":213,"h":220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":409,"w":213,"h":220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Harness.png": +{ + "frame": {"x":304,"y":903,"w":296,"h":237}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":394,"w":296,"h":237}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopArmsBoxtie.png": +{ + "frame": {"x":940,"y":81,"w":305,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":484,"w":305,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/FrillKneel.png": +{ + "frame": {"x":628,"y":106,"w":305,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":755,"w":305,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SkirtKneel_LeftLegCrotchStrap.png": +{ + "frame": {"x":1874,"y":3,"w":171,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":544,"y":810,"w":171,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ZombieTalisman.png": +{ + "frame": {"x":1632,"y":1853,"w":91,"h":163}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":554,"y":91,"w":91,"h":163}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Arm1Boxtie.png": +{ + "frame": {"x":316,"y":206,"w":305,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":575,"w":305,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Arm1OverBoxtie.png": +{ + "frame": {"x":1561,"y":174,"w":305,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":575,"w":305,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Arm1Up.png": +{ + "frame": {"x":316,"y":3,"w":308,"h":199}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":237,"w":308,"h":199}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Arm2Boxtie.png": +{ + "frame": {"x":1252,"y":3,"w":308,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":484,"w":308,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Arm2Wristtie.png": +{ + "frame": {"x":1249,"y":218,"w":304,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":484,"w":304,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf1Closed.png": +{ + "frame": {"x":465,"y":1624,"w":119,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":544,"y":1411,"w":119,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/LeftFrogtieHogtie.png": +{ + "frame": {"x":1537,"y":562,"w":295,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":930,"w":295,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh3Closed.png": +{ + "frame": {"x":1537,"y":562,"w":295,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":930,"w":295,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RopeOld/ArmsWristtie.png": +{ + "frame": {"x":1220,"y":679,"w":293,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":495,"w":293,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Shades/Glasses.png": +{ + "frame": {"x":289,"y":1624,"w":172,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":519,"y":263,"w":172,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Legs2Kneel.png": +{ + "frame": {"x":3,"y":503,"w":300,"h":145}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":409,"y":887,"w":300,"h":145}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Legs2KneelClosed.png": +{ + "frame": {"x":3,"y":503,"w":300,"h":145}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":409,"y":887,"w":300,"h":145}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeStripeUp.png": +{ + "frame": {"x":3,"y":894,"w":297,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":268,"w":297,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/ChestStrappyFree.png": +{ + "frame": {"x":884,"y":1453,"w":280,"h":212}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":415,"w":280,"h":212}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/ChestStrappyYoked.png": +{ + "frame": {"x":1168,"y":1529,"w":280,"h":212}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":415,"w":280,"h":212}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/PetsuitTopTapedHands.png": +{ + "frame": {"x":1168,"y":1745,"w":244,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":408,"w":244,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/HandRightFree.png": +{ + "frame": {"x":1452,"y":1553,"w":81,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":276,"y":546,"w":81,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/TopBoxtie.png": +{ + "frame": {"x":628,"y":3,"w":308,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":587,"w":308,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ChestFull.png": +{ + "frame": {"x":297,"y":1416,"w":282,"h":204}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":384,"w":282,"h":204}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/TopStrapBoxtie.png": +{ + "frame": {"x":940,"y":3,"w":308,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":438,"w":308,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/ForeArmRightCrossed.png": +{ + "frame": {"x":3,"y":386,"w":301,"h":113}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":597,"w":301,"h":113}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/GloveRightBoxtie.png": +{ + "frame": {"x":2002,"y":2008,"w":41,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":677,"w":41,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveRightBoxtie.png": +{ + "frame": {"x":706,"y":1669,"w":90,"h":264}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":423,"w":90,"h":264}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BandGloveRightFree.png": +{ + "frame": {"x":1502,"y":893,"w":31,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":359,"y":613,"w":31,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtBelt.png": +{ + "frame": {"x":910,"y":937,"w":292,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":735,"w":292,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtBeltClosed.png": +{ + "frame": {"x":1537,"y":862,"w":292,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":735,"w":292,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessBandLower.png": +{ + "frame": {"x":1236,"y":285,"w":300,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":809,"w":300,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessBandLowerClosed.png": +{ + "frame": {"x":932,"y":234,"w":300,"h":136}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":809,"w":300,"h":136}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessHardwareLowerKneel.png": +{ + "frame": {"x":1193,"y":1211,"w":287,"h":116}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":745,"w":287,"h":116}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessHardwareMid.png": +{ + "frame": {"x":1564,"y":3,"w":306,"h":167}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":688,"w":306,"h":167}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/PantiesClosed.png": +{ + "frame": {"x":1537,"y":614,"w":293,"h":244}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":673,"w":293,"h":244}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/BandGloveRightFree.png": +{ + "frame": {"x":1502,"y":893,"w":31,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":359,"y":613,"w":31,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveRightCrossed.png": +{ + "frame": {"x":3,"y":1853,"w":269,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":432,"y":491,"w":269,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/ShirtChestUp.png": +{ + "frame": {"x":1537,"y":951,"w":291,"h":269}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":361,"w":291,"h":269}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas39.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas39.webp b/TextureAtlas/atlas39.webp new file mode 100644 index 000000000..08c9ceb93 Binary files /dev/null and b/TextureAtlas/atlas39.webp differ diff --git a/TextureAtlas/atlas4.json b/TextureAtlas/atlas4.json new file mode 100644 index 000000000..251c98e3f --- /dev/null +++ b/TextureAtlas/atlas4.json @@ -0,0 +1,229 @@ +{"frames": { + +"Models/Chastity/ProtoLock.png": +{ + "frame": {"x":1693,"y":1394,"w":20,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":558,"y":820,"w":20,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/China/DressSkirt.png": +{ + "frame": {"x":1717,"y":887,"w":328,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":734,"w":328,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/DisplayLongMittenRightYoked.png": +{ + "frame": {"x":1693,"y":1565,"w":19,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":493,"w":19,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowRightBoxtie.png": +{ + "frame": {"x":1693,"y":1464,"w":20,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":597,"w":20,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayWristLeftYoked.png": +{ + "frame": {"x":1693,"y":1520,"w":19,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":918,"y":404,"w":19,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockAnkleRightClosed.png": +{ + "frame": {"x":1693,"y":1278,"w":20,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":543,"y":1440,"w":20,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowLeftWristtie.png": +{ + "frame": {"x":1693,"y":1429,"w":20,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":714,"y":619,"w":20,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowRightFront.png": +{ + "frame": {"x":1693,"y":1317,"w":20,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":426,"y":602,"w":20,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperDisplayLongMittenRightYoked.png": +{ + "frame": {"x":1693,"y":1565,"w":19,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":493,"w":19,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/CageBack.png": +{ + "frame": {"x":3,"y":3,"w":912,"h":1591}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":167,"y":96,"w":912,"h":1591}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/SarcoFront.png": +{ + "frame": {"x":919,"y":3,"w":617,"h":1586}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":360,"y":60,"w":617,"h":1586}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/SkirtCrotchStrap.png": +{ + "frame": {"x":547,"y":1598,"w":640,"h":446}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":279,"y":671,"w":640,"h":446}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/TwintailRight.png": +{ + "frame": {"x":1927,"y":1362,"w":118,"h":615}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":662,"y":131,"w":118,"h":615}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/LeftLegsKneel.png": +{ + "frame": {"x":1540,"y":350,"w":505,"h":339}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":746,"w":505,"h":339}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/GlowArms.png": +{ + "frame": {"x":3,"y":1598,"w":540,"h":447}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":320,"y":337,"w":540,"h":447}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/GlowLeftLegsKneel.png": +{ + "frame": {"x":1191,"y":1593,"w":522,"h":452}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":321,"y":702,"w":522,"h":452}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandAnkleLeftKneelClosed.png": +{ + "frame": {"x":1693,"y":1226,"w":20,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":727,"y":949,"w":20,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareAnkleLeftKneel.png": +{ + "frame": {"x":1693,"y":1497,"w":20,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":709,"y":950,"w":20,"h":19}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareAnkleLeftKneelClosed.png": +{ + "frame": {"x":1693,"y":1497,"w":20,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":709,"y":950,"w":20,"h":19}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SkirtClosedCrotchStrap.png": +{ + "frame": {"x":1717,"y":1164,"w":328,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":742,"w":328,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SockLeftClosed.png": +{ + "frame": {"x":1717,"y":1362,"w":206,"h":683}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":532,"y":940,"w":206,"h":683}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SockLeftKneel.png": +{ + "frame": {"x":1540,"y":3,"w":505,"h":343}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":387,"y":747,"w":505,"h":343}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenRightYoked.png": +{ + "frame": {"x":1540,"y":887,"w":173,"h":335}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":298,"y":294,"w":173,"h":335}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowRightUp.png": +{ + "frame": {"x":1927,"y":1981,"w":107,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":267,"w":107,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ArmbandFree.png": +{ + "frame": {"x":1693,"y":1356,"w":20,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":506,"w":20,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtRuffleKneelCrotchStrap.png": +{ + "frame": {"x":1540,"y":693,"w":505,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":335,"y":786,"w":505,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRightHogtie.png": +{ + "frame": {"x":1540,"y":1226,"w":149,"h":363}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":844,"w":149,"h":363}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas4.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas4.webp b/TextureAtlas/atlas4.webp new file mode 100644 index 000000000..0e38368a0 Binary files /dev/null and b/TextureAtlas/atlas4.webp differ diff --git a/TextureAtlas/atlas40.json b/TextureAtlas/atlas40.json new file mode 100644 index 000000000..f652eaf34 --- /dev/null +++ b/TextureAtlas/atlas40.json @@ -0,0 +1,917 @@ +{"frames": { + +"Models/ArmorChain/Skirt2.png": +{ + "frame": {"x":1694,"y":1371,"w":228,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":798,"w":228,"h":205}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmRightBoxtie.png": +{ + "frame": {"x":385,"y":1162,"w":126,"h":281}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":411,"w":126,"h":281}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/Chest.png": +{ + "frame": {"x":1780,"y":684,"w":265,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":514,"w":265,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/Head.png": +{ + "frame": {"x":716,"y":1714,"w":218,"h":274}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":120,"w":218,"h":274}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/HeadBigGag.png": +{ + "frame": {"x":620,"y":287,"w":218,"h":279}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":120,"w":218,"h":279}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/HeadGag.png": +{ + "frame": {"x":979,"y":3,"w":218,"h":277}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":120,"w":218,"h":277}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/HeadNoEar.png": +{ + "frame": {"x":837,"y":1419,"w":216,"h":274}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":120,"w":216,"h":274}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/HeadNoEarBigGag.png": +{ + "frame": {"x":759,"y":3,"w":216,"h":279}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":120,"w":216,"h":279}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/HeadNoEarGag.png": +{ + "frame": {"x":983,"y":284,"w":216,"h":277}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":120,"w":216,"h":277}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/LegRightHogtie.png": +{ + "frame": {"x":3,"y":3,"w":160,"h":288}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":918,"w":160,"h":288}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/BraRim.png": +{ + "frame": {"x":1009,"y":1973,"w":238,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":510,"w":238,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/ForeGloveRightFront.png": +{ + "frame": {"x":1123,"y":842,"w":169,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":417,"y":461,"w":169,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveRightUp.png": +{ + "frame": {"x":1203,"y":283,"w":144,"h":266}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":162,"w":144,"h":266}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/SockRightHogtie.png": +{ + "frame": {"x":3,"y":295,"w":153,"h":288}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":919,"w":153,"h":288}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmRightFree.png": +{ + "frame": {"x":869,"y":1131,"w":187,"h":274}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":337,"y":432,"w":187,"h":274}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/FootLeftHogtie.png": +{ + "frame": {"x":1780,"y":1580,"w":119,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":799,"w":119,"h":144}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/FootRightClosed.png": +{ + "frame": {"x":1351,"y":272,"w":144,"h":166}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":1448,"w":144,"h":166}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoLowerLeotard.png": +{ + "frame": {"x":1780,"y":800,"w":240,"h":245}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":670,"w":240,"h":245}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProtoLiningMid.png": +{ + "frame": {"x":1251,"y":1951,"w":270,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":572,"w":270,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/China/Dress.png": +{ + "frame": {"x":1676,"y":1233,"w":246,"h":134}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":603,"w":246,"h":134}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenLeftFree.png": +{ + "frame": {"x":913,"y":852,"w":138,"h":274}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":512,"w":138,"h":274}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenRightCrossed.png": +{ + "frame": {"x":1607,"y":487,"w":85,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":592,"w":85,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayLinkCollar.png": +{ + "frame": {"x":1957,"y":1205,"w":79,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":584,"y":398,"w":79,"h":24}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenLeftFree.png": +{ + "frame": {"x":913,"y":852,"w":138,"h":274}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":512,"w":138,"h":274}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenRightCrossed.png": +{ + "frame": {"x":1607,"y":487,"w":85,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":592,"w":85,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoCleanFree.png": +{ + "frame": {"x":595,"y":2010,"w":81,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":605,"w":81,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoFree.png": +{ + "frame": {"x":680,"y":2010,"w":81,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":605,"w":81,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmRightFree.png": +{ + "frame": {"x":1126,"y":565,"w":221,"h":266}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":329,"y":443,"w":221,"h":266}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmRightFront.png": +{ + "frame": {"x":463,"y":289,"w":153,"h":280}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":409,"y":440,"w":153,"h":280}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseBustBoxtie.png": +{ + "frame": {"x":1708,"y":1905,"w":274,"h":140}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":489,"w":274,"h":140}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandLeftYoked.png": +{ + "frame": {"x":1499,"y":472,"w":104,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":729,"y":461,"w":104,"h":106}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceDask/Eyes2Sly.png": +{ + "frame": {"x":1696,"y":743,"w":70,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":168,"w":70,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagFrilly/FrillyStraps.png": +{ + "frame": {"x":1503,"y":1659,"w":153,"h":263}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":70,"y":18,"w":153,"h":263}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagFrilly/FrillyStrapsOld.png": +{ + "frame": {"x":1537,"y":1371,"w":153,"h":263}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":70,"y":18,"w":153,"h":263}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BallHarness.png": +{ + "frame": {"x":515,"y":1152,"w":149,"h":279}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":279}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BallHarnessLarge.png": +{ + "frame": {"x":606,"y":3,"w":149,"h":280}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":280}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/PanelHarness.png": +{ + "frame": {"x":842,"y":286,"w":137,"h":278}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":39,"y":9,"w":137,"h":278}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallHarness.png": +{ + "frame": {"x":639,"y":857,"w":149,"h":279}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":279}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallHarnessLarge.png": +{ + "frame": {"x":453,"y":3,"w":149,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":282}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallHarnessSegmented.png": +{ + "frame": {"x":589,"y":573,"w":149,"h":280}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":280}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallHarnessSegmentedLarge.png": +{ + "frame": {"x":283,"y":1740,"w":149,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":282}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Gasmask/Valves.png": +{ + "frame": {"x":765,"y":1992,"w":124,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":77,"y":236,"w":124,"h":53}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/Braid_Overstrap.png": +{ + "frame": {"x":742,"y":570,"w":274,"h":278}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":104,"w":274,"h":278}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/DrillLeft.png": +{ + "frame": {"x":1926,"y":1233,"w":119,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":698,"y":133,"w":119,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/DrillRight.png": +{ + "frame": {"x":1926,"y":1483,"w":119,"h":241}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":411,"y":142,"w":119,"h":241}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Fuzzy.png": +{ + "frame": {"x":175,"y":876,"w":249,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":114,"w":249,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair2_Right.png": +{ + "frame": {"x":1694,"y":1104,"w":128,"h":125}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":86,"w":128,"h":125}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherLegLeftHogtie.png": +{ + "frame": {"x":3,"y":878,"w":168,"h":286}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":575,"y":924,"w":168,"h":286}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/BeltsTorsoLower.png": +{ + "frame": {"x":3,"y":1742,"w":276,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":602,"w":276,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/BeltsTorsoLowerBoxtie.png": +{ + "frame": {"x":105,"y":1168,"w":276,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":602,"w":276,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/BeltsTorsoLowerWristtie.png": +{ + "frame": {"x":105,"y":1454,"w":276,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":602,"w":276,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Kigu/Brows.png": +{ + "frame": {"x":1826,"y":1205,"w":127,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":529,"y":243,"w":127,"h":24}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowLeftFree.png": +{ + "frame": {"x":508,"y":2010,"w":83,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":591,"w":83,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowLeftBoxtie.png": +{ + "frame": {"x":1694,"y":1580,"w":82,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":693,"y":576,"w":82,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ThighLeftKneel.png": +{ + "frame": {"x":1525,"y":1926,"w":179,"h":118}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":844,"w":179,"h":118}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChestCollarUp.png": +{ + "frame": {"x":1696,"y":487,"w":80,"h":132}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":511,"y":400,"w":80,"h":132}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Tail.png": +{ + "frame": {"x":1323,"y":1659,"w":176,"h":263}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":720,"w":176,"h":263}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/AnkleLeftKneel.png": +{ + "frame": {"x":1986,"y":1905,"w":59,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":706,"y":956,"w":59,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandThighLeftKneelClosed.png": +{ + "frame": {"x":1351,"y":442,"w":144,"h":136}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":490,"y":858,"w":144,"h":136}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/ForeGloveRightFront.png": +{ + "frame": {"x":1613,"y":3,"w":163,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":426,"y":477,"w":163,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveRightFront.png": +{ + "frame": {"x":1613,"y":245,"w":163,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":426,"y":477,"w":163,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/StrapsLowerCleanClosed.png": +{ + "frame": {"x":385,"y":1447,"w":226,"h":280}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":639,"w":226,"h":280}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/LegLacesLegbinderClosed.png": +{ + "frame": {"x":3,"y":587,"w":72,"h":287}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":551,"y":1226,"w":72,"h":287}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/Apron.png": +{ + "frame": {"x":1351,"y":582,"w":261,"h":249}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":741,"w":261,"h":249}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronStripe.png": +{ + "frame": {"x":430,"y":576,"w":155,"h":280}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":652,"w":155,"h":280}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronStripeHogtie.png": +{ + "frame": {"x":1331,"y":1104,"w":245,"h":263}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":384,"y":651,"w":245,"h":263}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftYoked.png": +{ + "frame": {"x":1296,"y":835,"w":199,"h":265}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":732,"y":381,"w":199,"h":265}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootShoeLeftKneelClosed.png": +{ + "frame": {"x":1826,"y":1049,"w":219,"h":152}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":728,"y":907,"w":219,"h":152}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootShoeLeftSpread.png": +{ + "frame": {"x":1061,"y":1682,"w":127,"h":265}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":633,"y":1460,"w":127,"h":265}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootShoeRightSpread.png": +{ + "frame": {"x":1192,"y":1682,"w":127,"h":265}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":1460,"w":127,"h":265}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletRightYoked.png": +{ + "frame": {"x":1660,"y":1638,"w":116,"h":263}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":289,"y":283,"w":116,"h":263}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmLeftWristtie.png": +{ + "frame": {"x":792,"y":852,"w":117,"h":275}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":674,"y":432,"w":117,"h":275}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmRightFree.png": +{ + "frame": {"x":262,"y":290,"w":197,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":352,"y":424,"w":197,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuff2LeftUp.png": +{ + "frame": {"x":79,"y":587,"w":144,"h":285}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":222,"w":144,"h":285}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/ForeLongMittenRightFront.png": +{ + "frame": {"x":1311,"y":1391,"w":222,"h":264}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":417,"y":465,"w":222,"h":264}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenLeftCrossed.png": +{ + "frame": {"x":1499,"y":835,"w":113,"h":181}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":656,"y":518,"w":113,"h":181}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenRightUp.png": +{ + "frame": {"x":1203,"y":283,"w":144,"h":266}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":162,"w":144,"h":266}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/CollarTag.png": +{ + "frame": {"x":436,"y":2011,"w":68,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":392,"w":68,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/KneeRightKneel.png": +{ + "frame": {"x":1616,"y":787,"w":160,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":308,"y":806,"w":160,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/KneeRightKneelClosed.png": +{ + "frame": {"x":1616,"y":787,"w":160,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":308,"y":806,"w":160,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopBand.png": +{ + "frame": {"x":1499,"y":374,"w":110,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":574,"w":110,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Nipples/Weights.png": +{ + "frame": {"x":1613,"y":1049,"w":209,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":567,"w":209,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Pointy/HornL.png": +{ + "frame": {"x":1616,"y":582,"w":76,"h":201}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":132,"w":76,"h":201}, + "sourceSize": {"w":855,"h":1076} +}, +"Models/Ribbon/CrotchStrap.png": +{ + "frame": {"x":1696,"y":623,"w":80,"h":116}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":541,"y":800,"w":80,"h":116}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopCalf3KneelClosed.png": +{ + "frame": {"x":1986,"y":1976,"w":54,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":998,"w":54,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/ChestBase.png": +{ + "frame": {"x":1780,"y":3,"w":265,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":404,"w":265,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/ChestBaseTied.png": +{ + "frame": {"x":1780,"y":263,"w":265,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":404,"w":265,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftBoxtie.png": +{ + "frame": {"x":160,"y":295,"w":98,"h":283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftBoxtieRopesUpper.png": +{ + "frame": {"x":167,"y":3,"w":98,"h":283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftBoxtieTight.png": +{ + "frame": {"x":160,"y":295,"w":98,"h":283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftFront.png": +{ + "frame": {"x":3,"y":1168,"w":98,"h":283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveLeftFrontTight.png": +{ + "frame": {"x":3,"y":1455,"w":98,"h":283}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightBoxtieRopesUpper.png": +{ + "frame": {"x":436,"y":1731,"w":54,"h":276}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":491,"w":54,"h":276}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ArmLeftBoxtie.png": +{ + "frame": {"x":1215,"y":1391,"w":92,"h":265}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":423,"w":92,"h":265}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ArmLeftCrossed.png": +{ + "frame": {"x":494,"y":1731,"w":218,"h":275}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":552,"y":424,"w":218,"h":275}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Feet1Closed.png": +{ + "frame": {"x":227,"y":582,"w":199,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":501,"y":1196,"w":199,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ArmLeftBoxtie.png": +{ + "frame": {"x":1580,"y":1104,"w":92,"h":263}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":423,"w":92,"h":263}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ArmLeftCrossed.png": +{ + "frame": {"x":615,"y":1435,"w":218,"h":275}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":552,"y":424,"w":218,"h":275}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/Chest.png": +{ + "frame": {"x":1060,"y":1119,"w":267,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":360,"w":267,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/FootLeftClosed.png": +{ + "frame": {"x":1201,"y":3,"w":137,"h":276}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":1342,"w":137,"h":276}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/FootRightClosed.png": +{ + "frame": {"x":668,"y":1140,"w":197,"h":275}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":1342,"w":197,"h":275}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/ReverseBinderHardware.png": +{ + "frame": {"x":1780,"y":523,"w":265,"h":157}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":398,"w":265,"h":157}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowLeftUp.png": +{ + "frame": {"x":1499,"y":1020,"w":110,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":283,"w":110,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmLeftWristtie.png": +{ + "frame": {"x":1055,"y":842,"w":64,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":487,"w":64,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmLeftWristtie.png": +{ + "frame": {"x":1020,"y":565,"w":102,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":487,"w":102,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmLeftYoked.png": +{ + "frame": {"x":1342,"y":3,"w":267,"h":265}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":691,"y":376,"w":267,"h":265}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/HatCap.png": +{ + "frame": {"x":893,"y":1992,"w":112,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":490,"y":61,"w":112,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ShoeRightSpread.png": +{ + "frame": {"x":938,"y":1697,"w":119,"h":272}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":1379,"w":119,"h":272}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveLeftBoxtie.png": +{ + "frame": {"x":1057,"y":1409,"w":154,"h":269}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":625,"y":425,"w":154,"h":269}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveLeftUp.png": +{ + "frame": {"x":428,"y":868,"w":207,"h":280}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":617,"y":277,"w":207,"h":280}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveRightFree.png": +{ + "frame": {"x":269,"y":3,"w":180,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":371,"y":423,"w":180,"h":282}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseLiner.png": +{ + "frame": {"x":1780,"y":1728,"w":260,"h":173}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":611,"w":260,"h":173}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/ShoeRightSpread.png": +{ + "frame": {"x":1499,"y":272,"w":110,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":498,"y":1537,"w":110,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas40.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas40.webp b/TextureAtlas/atlas40.webp new file mode 100644 index 000000000..ecfbb8e16 Binary files /dev/null and b/TextureAtlas/atlas40.webp differ diff --git a/TextureAtlas/atlas41.json b/TextureAtlas/atlas41.json new file mode 100644 index 000000000..f75eca050 --- /dev/null +++ b/TextureAtlas/atlas41.json @@ -0,0 +1,1021 @@ +{"frames": { + +"Models/ArmorChain/Panties.png": +{ + "frame": {"x":3,"y":3,"w":279,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":755,"w":279,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/PantiesClosed.png": +{ + "frame": {"x":286,"y":3,"w":279,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":755,"w":279,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/ShirtChest.png": +{ + "frame": {"x":3,"y":628,"w":275,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":418,"w":275,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/BreastplateHogtie.png": +{ + "frame": {"x":282,"y":710,"w":272,"h":217}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":414,"w":272,"h":217}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/PouchKneel.png": +{ + "frame": {"x":1273,"y":1563,"w":95,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":359,"y":872,"w":95,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Legs1Closed.png": +{ + "frame": {"x":284,"y":172,"w":277,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":964,"w":277,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/BraUnder.png": +{ + "frame": {"x":1649,"y":1399,"w":220,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":570,"w":220,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/Belt.png": +{ + "frame": {"x":550,"y":1504,"w":268,"h":105}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":705,"w":268,"h":105}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BeltLining.png": +{ + "frame": {"x":826,"y":1453,"w":268,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":705,"w":268,"h":106}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraCyber.png": +{ + "frame": {"x":555,"y":1009,"w":271,"h":236}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":410,"w":271,"h":236}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProtoCups.png": +{ + "frame": {"x":3,"y":172,"w":277,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":543,"w":277,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProtoLiningMidZip.png": +{ + "frame": {"x":553,"y":1249,"w":270,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":572,"w":270,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProtoLiningZip.png": +{ + "frame": {"x":3,"y":1407,"w":270,"h":226}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":413,"w":270,"h":226}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProtoLiningZipRim.png": +{ + "frame": {"x":1394,"y":708,"w":270,"h":226}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":413,"w":270,"h":226}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/CyberPanties.png": +{ + "frame": {"x":839,"y":678,"w":273,"h":179}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":744,"w":273,"h":179}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/CyberPantiesClosed.png": +{ + "frame": {"x":561,"y":693,"w":273,"h":173}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":744,"w":273,"h":173}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/ProtoLining.png": +{ + "frame": {"x":1700,"y":3,"w":278,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":762,"w":278,"h":89}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/China/Bra.png": +{ + "frame": {"x":1104,"y":1099,"w":269,"h":235}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":390,"w":269,"h":235}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/FutureDisplay.png": +{ + "frame": {"x":1886,"y":1471,"w":43,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":399,"w":43,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/AnkleLeftKneelClosed.png": +{ + "frame": {"x":1873,"y":1399,"w":54,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":709,"y":938,"w":54,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ThighLeftKneelClosed.png": +{ + "frame": {"x":1124,"y":471,"w":274,"h":167}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":375,"y":840,"w":274,"h":167}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/LeftLegsBeltsKneel.png": +{ + "frame": {"x":838,"y":861,"w":272,"h":221}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":853,"w":272,"h":221}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BeltBase.png": +{ + "frame": {"x":1372,"y":1471,"w":253,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":722,"w":253,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BeltBaseNoLock.png": +{ + "frame": {"x":1629,"y":1471,"w":253,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":722,"w":253,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BraMetal1.png": +{ + "frame": {"x":565,"y":172,"w":277,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":569,"w":277,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BraMetalRunic1.png": +{ + "frame": {"x":846,"y":172,"w":277,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":569,"w":277,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightFront.png": +{ + "frame": {"x":1958,"y":800,"w":87,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":586,"w":87,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseBust.png": +{ + "frame": {"x":1681,"y":456,"w":274,"h":115}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":514,"w":274,"h":115}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseBustChesttied.png": +{ + "frame": {"x":1402,"y":590,"w":274,"h":114}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":514,"w":274,"h":114}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseBustUp.png": +{ + "frame": {"x":845,"y":406,"w":275,"h":115}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":514,"w":275,"h":115}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseBustUpChesttied.png": +{ + "frame": {"x":1680,"y":694,"w":274,"h":114}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":514,"w":274,"h":114}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BowCorsetBust.png": +{ + "frame": {"x":3,"y":1257,"w":271,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":500,"w":271,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceChest.png": +{ + "frame": {"x":1377,"y":1180,"w":269,"h":116}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":512,"w":269,"h":116}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceCrotchPanelTrim.png": +{ + "frame": {"x":1377,"y":1300,"w":268,"h":167}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":754,"w":268,"h":167}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MonocleLensLeft.png": +{ + "frame": {"x":1982,"y":3,"w":63,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":609,"y":268,"w":63,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceKjus/BlushLow.png": +{ + "frame": {"x":549,"y":1613,"w":154,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":295,"w":154,"h":52}, + "sourceSize": {"w":744,"h":433} +}, +"Models/FaceKjus/BlushMedium.png": +{ + "frame": {"x":707,"y":1613,"w":154,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":295,"w":154,"h":52}, + "sourceSize": {"w":744,"h":433} +}, +"Models/Festive/StrapUnderbust.png": +{ + "frame": {"x":788,"y":1892,"w":227,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":518,"w":227,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/BlondeBangs.png": +{ + "frame": {"x":769,"y":1669,"w":226,"h":219}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":105,"w":226,"h":219}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/BlondeBangsM.png": +{ + "frame": {"x":999,"y":1669,"w":226,"h":219}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":105,"w":226,"h":219}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair6_FrontB.png": +{ + "frame": {"x":1682,"y":1890,"w":78,"h":155}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":541,"y":124,"w":78,"h":155}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/Irish8AnkleLeftKneelClosed.png": +{ + "frame": {"x":865,"y":1613,"w":43,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":718,"y":949,"w":43,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/LegironsLeftKneelClosed.png": +{ + "frame": {"x":865,"y":1613,"w":43,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":718,"y":949,"w":43,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/ShinyBalletLeftKneel.png": +{ + "frame": {"x":1135,"y":170,"w":278,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":652,"y":906,"w":278,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hood/WolfEars.png": +{ + "frame": {"x":830,"y":1086,"w":270,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":32,"w":270,"h":186}, + "sourceSize": {"w":752,"h":479} +}, +"Models/KittyLatex/KittyLatexEar.png": +{ + "frame": {"x":1114,"y":897,"w":270,"h":198}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":44,"w":270,"h":198}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyLatex/KittyLatexEarMuff.png": +{ + "frame": {"x":3,"y":377,"w":275,"h":247}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":110,"w":275,"h":247}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandAnkleLeftClosed.png": +{ + "frame": {"x":1886,"y":1791,"w":141,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":1211,"w":141,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandThighLeftClosed.png": +{ + "frame": {"x":1886,"y":1502,"w":159,"h":181}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":1034,"w":159,"h":181}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowRightYoked.png": +{ + "frame": {"x":1858,"y":1872,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":409,"y":529,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockThighLeftClosed.png": +{ + "frame": {"x":1858,"y":1902,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":593,"y":1058,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockThighLeftSpread.png": +{ + "frame": {"x":1858,"y":1932,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":649,"y":1063,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockThighRightClosed.png": +{ + "frame": {"x":1858,"y":1962,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":546,"y":1064,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockThighRightKneel.png": +{ + "frame": {"x":1858,"y":1992,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":854,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockThighRightKneelClosed.png": +{ + "frame": {"x":1858,"y":1992,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":854,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ThighLeftKneelClosed.png": +{ + "frame": {"x":3,"y":1894,"w":179,"h":151}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":844,"w":179,"h":151}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Band.png": +{ + "frame": {"x":369,"y":1893,"w":173,"h":152}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":543,"y":126,"w":173,"h":152}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Ears2R.png": +{ + "frame": {"x":1959,"y":604,"w":86,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":491,"y":100,"w":86,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChest.png": +{ + "frame": {"x":1229,"y":1669,"w":267,"h":217}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":411,"w":267,"h":217}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ThighLeftKneelClosed.png": +{ + "frame": {"x":186,"y":1894,"w":179,"h":151}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":844,"w":179,"h":151}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/ForeGloveLeftPawFront.png": +{ + "frame": {"x":1406,"y":1890,"w":139,"h":155}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":500,"w":139,"h":155}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveRightCrossed.png": +{ + "frame": {"x":1668,"y":812,"w":270,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":594,"w":270,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Leash/LeashHogtie.png": +{ + "frame": {"x":1668,"y":906,"w":269,"h":247}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":343,"y":436,"w":269,"h":247}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/WristLeftFree.png": +{ + "frame": {"x":1982,"y":66,"w":63,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":797,"y":748,"w":63,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLegLeftClosed.png": +{ + "frame": {"x":1942,"y":877,"w":103,"h":191}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":573,"y":1090,"w":103,"h":191}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/HeadbandFrill.png": +{ + "frame": {"x":1681,"y":575,"w":274,"h":115}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":118,"w":274,"h":115}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ApronChestYoked.png": +{ + "frame": {"x":284,"y":250,"w":276,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":381,"w":276,"h":216}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/FlowerLeaves.png": +{ + "frame": {"x":646,"y":1893,"w":138,"h":151}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":642,"w":138,"h":151}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/Headband.png": +{ + "frame": {"x":274,"y":1669,"w":225,"h":220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":510,"y":114,"w":225,"h":220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/HeadbandFrill.png": +{ + "frame": {"x":912,"y":1563,"w":215,"h":102}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":102,"w":215,"h":102}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronLeftCrossed.png": +{ + "frame": {"x":1549,"y":1890,"w":129,"h":155}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":690,"y":394,"w":129,"h":155}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexLeftYoked.png": +{ + "frame": {"x":1934,"y":1265,"w":111,"h":233}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":843,"y":285,"w":111,"h":233}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenRightFree.png": +{ + "frame": {"x":1019,"y":1892,"w":212,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":276,"y":551,"w":212,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ShoeLeftKneel.png": +{ + "frame": {"x":1131,"y":1563,"w":138,"h":102}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":764,"y":920,"w":138,"h":102}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ShoeLeftKneelClosed.png": +{ + "frame": {"x":1131,"y":1563,"w":138,"h":102}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":764,"y":920,"w":138,"h":102}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SkirtBandKneel.png": +{ + "frame": {"x":1235,"y":1890,"w":167,"h":155}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":367,"y":759,"w":167,"h":155}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopChest.png": +{ + "frame": {"x":282,"y":470,"w":275,"h":236}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":394,"w":275,"h":236}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/ForeGloveRightCrossed.png": +{ + "frame": {"x":279,"y":931,"w":272,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":602,"w":272,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveRightCrossed.png": +{ + "frame": {"x":3,"y":839,"w":272,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":491,"w":272,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/Base.png": +{ + "frame": {"x":1417,"y":230,"w":277,"h":163}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":756,"w":277,"h":163}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/BaseClosed.png": +{ + "frame": {"x":1698,"y":289,"w":277,"h":163}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":756,"w":277,"h":163}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/CherryClosed.png": +{ + "frame": {"x":1124,"y":320,"w":275,"h":147}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":768,"w":275,"h":147}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/InvertedRose.png": +{ + "frame": {"x":845,"y":247,"w":275,"h":155}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":761,"w":275,"h":155}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/Lines.png": +{ + "frame": {"x":569,"y":3,"w":279,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":755,"w":279,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/LinesClosed.png": +{ + "frame": {"x":852,"y":3,"w":279,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":755,"w":279,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Calf2KneelClosed.png": +{ + "frame": {"x":1135,"y":3,"w":279,"h":163}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":374,"y":885,"w":279,"h":163}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/Bra.png": +{ + "frame": {"x":827,"y":1276,"w":269,"h":173}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":479,"w":269,"h":173}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/Chest.png": +{ + "frame": {"x":553,"y":1347,"w":269,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":479,"w":269,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ArmRightCrossed.png": +{ + "frame": {"x":3,"y":1637,"w":267,"h":253}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":430,"w":267,"h":253}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/CollarYoked.png": +{ + "frame": {"x":558,"y":870,"w":272,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":395,"w":272,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/HemRightUp.png": +{ + "frame": {"x":1958,"y":695,"w":87,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":323,"w":87,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/SleeveRightTied.png": +{ + "frame": {"x":1981,"y":129,"w":64,"h":138}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":440,"w":64,"h":138}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/SleeveRightUp.png": +{ + "frame": {"x":1771,"y":1872,"w":83,"h":173}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":303,"w":83,"h":173}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/CrotchStrap.png": +{ + "frame": {"x":1979,"y":391,"w":66,"h":102}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":541,"y":818,"w":66,"h":102}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnder.png": +{ + "frame": {"x":1117,"y":642,"w":273,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":768,"w":273,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnderClosed.png": +{ + "frame": {"x":1117,"y":642,"w":273,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":768,"w":273,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnderHogtie.png": +{ + "frame": {"x":1117,"y":642,"w":273,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":768,"w":273,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/Bra.png": +{ + "frame": {"x":1418,"y":3,"w":278,"h":223}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":405,"w":278,"h":223}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowLeftBoxtie.png": +{ + "frame": {"x":822,"y":1563,"w":86,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":687,"y":583,"w":86,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/ChestStrappyBoxtie.png": +{ + "frame": {"x":278,"y":1242,"w":271,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":420,"w":271,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/ChestStrappyUp.png": +{ + "frame": {"x":3,"y":1037,"w":271,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":411,"w":271,"h":216}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/ChestStrappyWristtie.png": +{ + "frame": {"x":278,"y":1242,"w":271,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":420,"w":271,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/SwimsuitChestFree.png": +{ + "frame": {"x":1500,"y":1669,"w":267,"h":217}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":411,"w":267,"h":217}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/SwimsuitChestYoked.png": +{ + "frame": {"x":1500,"y":1669,"w":267,"h":217}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":411,"w":267,"h":217}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/Chest.png": +{ + "frame": {"x":1100,"y":1338,"w":268,"h":141}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":486,"w":268,"h":141}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmLeftUp.png": +{ + "frame": {"x":503,"y":1669,"w":168,"h":220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":164,"w":168,"h":220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/HeadgearBack.png": +{ + "frame": {"x":675,"y":1669,"w":90,"h":220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":121,"w":90,"h":220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ShoeLeftHogtie.png": +{ + "frame": {"x":1981,"y":271,"w":64,"h":116}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":718,"y":787,"w":64,"h":116}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SkirtBand.png": +{ + "frame": {"x":565,"y":247,"w":276,"h":236}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":724,"w":276,"h":236}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveRightCrossed.png": +{ + "frame": {"x":1941,"y":1072,"w":104,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":435,"y":424,"w":104,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/WebbingSideTied.png": +{ + "frame": {"x":1771,"y":1669,"w":111,"h":199}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":635,"y":423,"w":111,"h":199}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/WebbingSideWristtie.png": +{ + "frame": {"x":1771,"y":1669,"w":111,"h":199}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":635,"y":423,"w":111,"h":199}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/GloveLeftYoked.png": +{ + "frame": {"x":546,"y":1893,"w":96,"h":152}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":851,"y":280,"w":96,"h":152}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveRightWristtie.png": +{ + "frame": {"x":1959,"y":497,"w":86,"h":103}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":423,"w":86,"h":103}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/Bra.png": +{ + "frame": {"x":279,"y":1018,"w":271,"h":220}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":408,"w":271,"h":220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/Bustier.png": +{ + "frame": {"x":561,"y":487,"w":274,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":482,"w":274,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BustierChest.png": +{ + "frame": {"x":839,"y":525,"w":274,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":482,"w":274,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/BeltMid.png": +{ + "frame": {"x":1098,"y":1483,"w":266,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":685,"w":266,"h":76}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessBandLowerKneel.png": +{ + "frame": {"x":3,"y":275,"w":276,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":757,"w":276,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessHardwareMidKneel.png": +{ + "frame": {"x":277,"y":1592,"w":268,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":689,"w":268,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/Chest.png": +{ + "frame": {"x":1388,"y":938,"w":269,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":390,"w":269,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/Chest2.png": +{ + "frame": {"x":1661,"y":1157,"w":269,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":390,"w":269,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ShoeLeftKneelClosed.png": +{ + "frame": {"x":1886,"y":1687,"w":159,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":742,"y":921,"w":159,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoUpperCups.png": +{ + "frame": {"x":277,"y":1453,"w":269,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":494,"w":269,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/Waist.png": +{ + "frame": {"x":1403,"y":397,"w":274,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":620,"w":274,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/WaistPattern.png": +{ + "frame": {"x":1700,"y":96,"w":277,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":620,"w":277,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas41.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas41.webp b/TextureAtlas/atlas41.webp new file mode 100644 index 000000000..e6d168de7 Binary files /dev/null and b/TextureAtlas/atlas41.webp differ diff --git a/TextureAtlas/atlas42.json b/TextureAtlas/atlas42.json new file mode 100644 index 000000000..f9f36524f --- /dev/null +++ b/TextureAtlas/atlas42.json @@ -0,0 +1,1125 @@ +{"frames": { + +"Models/ArmorChain/Skirt2CrotchStrap.png": +{ + "frame": {"x":926,"y":1569,"w":228,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":804,"w":228,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/Breastplate.png": +{ + "frame": {"x":1629,"y":388,"w":266,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":467,"w":266,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/GauntletRightFront.png": +{ + "frame": {"x":1012,"y":1866,"w":167,"h":179}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":461,"w":167,"h":179}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/PouchSpread.png": +{ + "frame": {"x":822,"y":1866,"w":186,"h":179}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":403,"y":938,"w":186,"h":179}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShoeLeftKneel.png": +{ + "frame": {"x":513,"y":1762,"w":192,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":705,"y":923,"w":192,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShortsLeftClosed.png": +{ + "frame": {"x":1241,"y":1865,"w":157,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":771,"w":157,"h":178}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Belt.png": +{ + "frame": {"x":3,"y":538,"w":265,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":735,"w":265,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Legs1KneelClosed.png": +{ + "frame": {"x":1870,"y":1258,"w":175,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":839,"w":175,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/InnerLines.png": +{ + "frame": {"x":3,"y":1191,"w":260,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":541,"w":260,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/StrapsTied.png": +{ + "frame": {"x":1267,"y":1760,"w":212,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":423,"w":212,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/Stripes.png": +{ + "frame": {"x":544,"y":372,"w":265,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":524,"w":265,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveLeftCrossed.png": +{ + "frame": {"x":1402,"y":1864,"w":217,"h":181}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":552,"y":518,"w":217,"h":181}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveRightBoxtie.png": +{ + "frame": {"x":3,"y":1665,"w":253,"h":199}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":517,"w":253,"h":199}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/Chest.png": +{ + "frame": {"x":3,"y":260,"w":267,"h":114}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":513,"w":267,"h":114}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ChestHogtie.png": +{ + "frame": {"x":274,"y":253,"w":267,"h":115}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":513,"w":267,"h":115}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ForeArmLeftCrossed.png": +{ + "frame": {"x":1850,"y":1757,"w":195,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":549,"y":629,"w":195,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ForeArmRightCrossed.png": +{ + "frame": {"x":1087,"y":358,"w":267,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":603,"w":267,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/SleevelessTop.png": +{ + "frame": {"x":1087,"y":232,"w":267,"h":122}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":564,"w":267,"h":122}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/SleevelessTopChest.png": +{ + "frame": {"x":545,"y":3,"w":267,"h":245}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":382,"w":267,"h":245}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/SleevelessTopV.png": +{ + "frame": {"x":545,"y":252,"w":267,"h":116}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":570,"w":267,"h":116}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/SleevelessTopVChest.png": +{ + "frame": {"x":816,"y":3,"w":267,"h":245}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":382,"w":267,"h":245}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraChain.png": +{ + "frame": {"x":1607,"y":964,"w":259,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":401,"w":259,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraCyberLining.png": +{ + "frame": {"x":816,"y":252,"w":267,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":515,"w":267,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/CyberLining.png": +{ + "frame": {"x":3,"y":849,"w":262,"h":145}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":758,"w":262,"h":145}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/CyberPantiesLining.png": +{ + "frame": {"x":1078,"y":708,"w":263,"h":160}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":755,"w":263,"h":160}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/CyberPantiesLiningClosed.png": +{ + "frame": {"x":810,"y":724,"w":263,"h":160}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":755,"w":263,"h":160}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/TrackingModule.png": +{ + "frame": {"x":1830,"y":1469,"w":27,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":567,"y":402,"w":27,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowRightBoxtie.png": +{ + "frame": {"x":1898,"y":1831,"w":28,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":604,"w":28,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/ForeLongMittenRightCrossed.png": +{ + "frame": {"x":1629,"y":220,"w":267,"h":164}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":521,"w":267,"h":164}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenLeftFront.png": +{ + "frame": {"x":1315,"y":1569,"w":132,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":637,"y":534,"w":132,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowRightFront.png": +{ + "frame": {"x":1585,"y":1206,"w":27,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":588,"w":27,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenLeftFront.png": +{ + "frame": {"x":1315,"y":1569,"w":132,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":637,"y":534,"w":132,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ForeLongMittenRightCrossed.png": +{ + "frame": {"x":1629,"y":220,"w":267,"h":164}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":521,"w":267,"h":164}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenLeftFront.png": +{ + "frame": {"x":1315,"y":1569,"w":132,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":637,"y":534,"w":132,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BeltLines.png": +{ + "frame": {"x":271,"y":610,"w":264,"h":201}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":722,"w":264,"h":201}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BeltMetal1.png": +{ + "frame": {"x":1613,"y":762,"w":262,"h":113}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":738,"w":262,"h":113}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BeltMetalRunic1.png": +{ + "frame": {"x":1345,"y":825,"w":262,"h":113}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":738,"w":262,"h":113}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockFree.png": +{ + "frame": {"x":1585,"y":1268,"w":27,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":766,"y":588,"w":27,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightLockFront.png": +{ + "frame": {"x":1411,"y":1509,"w":35,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":416,"y":592,"w":35,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/Band.png": +{ + "frame": {"x":544,"y":469,"w":265,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":749,"w":265,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BandCrotchStrap.png": +{ + "frame": {"x":273,"y":535,"w":265,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":749,"w":265,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseForeArmLeftCrossed.png": +{ + "frame": {"x":103,"y":1868,"w":229,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":535,"w":229,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceChestStripes.png": +{ + "frame": {"x":3,"y":1394,"w":256,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":513,"w":256,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceCrotchPanel.png": +{ + "frame": {"x":531,"y":1076,"w":257,"h":158}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":760,"w":257,"h":158}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceCrotchPanelLace.png": +{ + "frame": {"x":538,"y":904,"w":261,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":756,"w":261,"h":168}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/SkirtSplitOverKneel.png": +{ + "frame": {"x":542,"y":544,"w":264,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":519,"y":799,"w":264,"h":206}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/Bra.png": +{ + "frame": {"x":1358,"y":230,"w":267,"h":128}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":518,"w":267,"h":128}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/Panties.png": +{ + "frame": {"x":788,"y":1394,"w":254,"h":171}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":746,"w":254,"h":171}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/FuzzTopTied.png": +{ + "frame": {"x":1623,"y":1502,"w":223,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":408,"w":223,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/StrapMid.png": +{ + "frame": {"x":1900,"y":231,"w":145,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":543,"y":634,"w":145,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagCloth/OTN.png": +{ + "frame": {"x":709,"y":1761,"w":192,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":63,"y":204,"w":192,"h":101}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLatex/MuteLogo.png": +{ + "frame": {"x":1830,"y":1412,"w":36,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":111,"y":225,"w":36,"h":53}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLatex/NeckCorsetGagRim2.png": +{ + "frame": {"x":1900,"y":316,"w":145,"h":78}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":538,"y":306,"w":145,"h":78}, + "sourceSize": {"w":763,"h":476} +}, +"Models/GagLatex/SideStrap.png": +{ + "frame": {"x":653,"y":1578,"w":37,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":206,"y":46,"w":37,"h":180}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagTape/Full.png": +{ + "frame": {"x":1870,"y":1410,"w":175,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":54,"y":205,"w":175,"h":88}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/FrontSwept.png": +{ + "frame": {"x":694,"y":1578,"w":228,"h":179}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":113,"w":228,"h":179}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/BowHeadbandFrill.png": +{ + "frame": {"x":1346,"y":647,"w":263,"h":174}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":82,"w":263,"h":174}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/HatTop.png": +{ + "frame": {"x":1623,"y":1412,"w":203,"h":86}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":76,"w":203,"h":86}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletLeftKneelClosed.png": +{ + "frame": {"x":539,"y":754,"w":263,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":667,"y":906,"w":263,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/FlatBalletLeftKneelClosed.png": +{ + "frame": {"x":539,"y":754,"w":263,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":667,"y":906,"w":263,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/ShinyBalletLeftKneelClosed.png": +{ + "frame": {"x":271,"y":815,"w":263,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":667,"y":906,"w":263,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/LatexChest.png": +{ + "frame": {"x":274,"y":3,"w":267,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":382,"w":267,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyLatex/KittyLatexEarMuffLight2.png": +{ + "frame": {"x":803,"y":1075,"w":259,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":222,"w":259,"h":178}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandAnkleRightClosed.png": +{ + "frame": {"x":1850,"y":1502,"w":195,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":538,"y":1211,"w":195,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandThighRightClosed.png": +{ + "frame": {"x":267,"y":1072,"w":260,"h":181}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":1034,"w":260,"h":181}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowRightFront.png": +{ + "frame": {"x":1585,"y":1330,"w":27,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":603,"w":27,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ThighRightClosed.png": +{ + "frame": {"x":3,"y":998,"w":260,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":1026,"w":260,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChestStripes.png": +{ + "frame": {"x":1078,"y":633,"w":264,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":556,"w":264,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChestUp.png": +{ + "frame": {"x":1087,"y":3,"w":267,"h":225}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":403,"w":267,"h":225}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveRightBoxtie.png": +{ + "frame": {"x":263,"y":1449,"w":254,"h":105}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":612,"w":254,"h":105}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveRightUp.png": +{ + "frame": {"x":1900,"y":3,"w":145,"h":224}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":161,"w":145,"h":224}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockLeftClosed.png": +{ + "frame": {"x":1789,"y":1864,"w":140,"h":181}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":531,"y":1447,"w":140,"h":181}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/Leotard.png": +{ + "frame": {"x":1342,"y":942,"w":261,"h":237}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":720,"w":261,"h":237}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/LeotardClosed.png": +{ + "frame": {"x":1077,"y":872,"w":261,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":719,"w":261,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronChest.png": +{ + "frame": {"x":1066,"y":1114,"w":256,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":494,"w":256,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronChestRufflesBoxtie.png": +{ + "frame": {"x":531,"y":1238,"w":257,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":399,"w":257,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronChestRufflesCrossed.png": +{ + "frame": {"x":267,"y":1257,"w":257,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":399,"w":257,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronChestRufflesFree.png": +{ + "frame": {"x":531,"y":1238,"w":257,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":399,"w":257,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronChestRufflesFront.png": +{ + "frame": {"x":3,"y":1289,"w":257,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":399,"w":257,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronChestRufflesYoked.png": +{ + "frame": {"x":260,"y":1762,"w":249,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":399,"w":249,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletRightFree.png": +{ + "frame": {"x":593,"y":1867,"w":225,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":262,"y":528,"w":225,"h":178}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveRightBoxtie.png": +{ + "frame": {"x":1933,"y":1831,"w":112,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":422,"w":112,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ForeArmLeftCrossed.png": +{ + "frame": {"x":1411,"y":1410,"w":208,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":549,"y":617,"w":208,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ForeArmRightCrossed.png": +{ + "frame": {"x":1611,"y":879,"w":262,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":432,"y":603,"w":262,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GloveLeftFront.png": +{ + "frame": {"x":1666,"y":1760,"w":123,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":461,"w":123,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GloveRightFront.png": +{ + "frame": {"x":905,"y":1761,"w":122,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":460,"w":122,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffLeftUp.png": +{ + "frame": {"x":1870,"y":1067,"w":175,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":320,"w":175,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronStrapBoxtie.png": +{ + "frame": {"x":1793,"y":1760,"w":53,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":698,"y":463,"w":53,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronStrapFront.png": +{ + "frame": {"x":1793,"y":1760,"w":53,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":698,"y":463,"w":53,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LeatherRightCrossed.png": +{ + "frame": {"x":1206,"y":1471,"w":91,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":647,"y":603,"w":91,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenRightBoxtie.png": +{ + "frame": {"x":1052,"y":1267,"w":255,"h":200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":517,"w":255,"h":200}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/PantiesHigh/StripesClosed.png": +{ + "frame": {"x":1623,"y":1206,"w":243,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":467,"y":717,"w":243,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Pointy/AnthenaR.png": +{ + "frame": {"x":1183,"y":1865,"w":54,"h":179}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":244,"y":67,"w":54,"h":179}, + "sourceSize": {"w":855,"h":1076} +}, +"Models/Pointy/Tail.png": +{ + "frame": {"x":1451,"y":1509,"w":143,"h":247}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":533,"w":143,"h":247}, + "sourceSize": {"w":855,"h":1076} +}, +"Models/Ribbon/Crotch.png": +{ + "frame": {"x":269,"y":965,"w":261,"h":103}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":737,"w":261,"h":103}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopCrotch.png": +{ + "frame": {"x":806,"y":888,"w":261,"h":183}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":737,"w":261,"h":183}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ZombieHat.png": +{ + "frame": {"x":336,"y":1867,"w":253,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":1,"w":253,"h":178}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Crotchrope.png": +{ + "frame": {"x":264,"y":1362,"w":256,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":740,"w":256,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/CrotchropeKneel.png": +{ + "frame": {"x":528,"y":1343,"w":256,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":740,"w":256,"h":89}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/ForeArm2Wristtie.png": +{ + "frame": {"x":1850,"y":1831,"w":44,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":633,"w":44,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/HarnessLower.png": +{ + "frame": {"x":3,"y":604,"w":264,"h":241}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":600,"w":264,"h":241}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/RibbonUp.png": +{ + "frame": {"x":1879,"y":803,"w":165,"h":260}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":350,"w":165,"h":260}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Crotch.png": +{ + "frame": {"x":3,"y":378,"w":266,"h":156}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":682,"w":266,"h":156}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/ApronSkirt.png": +{ + "frame": {"x":1358,"y":441,"w":266,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/ApronSkirtClosed.png": +{ + "frame": {"x":1358,"y":441,"w":266,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/ApronSkirtClosedCrotchStrap.png": +{ + "frame": {"x":1358,"y":441,"w":266,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/ApronSkirtCrotchStrap.png": +{ + "frame": {"x":1358,"y":441,"w":266,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/ApronSkirtHogtie.png": +{ + "frame": {"x":1358,"y":441,"w":266,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/ApronSkirtHogtieCrotchStrap.png": +{ + "frame": {"x":1358,"y":441,"w":266,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderLeft.png": +{ + "frame": {"x":1150,"y":1760,"w":113,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":411,"w":113,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ArmRightCrossed.png": +{ + "frame": {"x":3,"y":3,"w":267,"h":253}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":430,"w":267,"h":253}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/ReverseBinderStraps.png": +{ + "frame": {"x":1087,"y":443,"w":266,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":452,"w":266,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimThighLeftKneelClosed.png": +{ + "frame": {"x":517,"y":1578,"w":132,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":826,"w":132,"h":180}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/StrappyLowerClosed.png": +{ + "frame": {"x":1326,"y":1183,"w":255,"h":223}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":696,"w":255,"h":223}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/SwimsuitChestBoxtie.png": +{ + "frame": {"x":1629,"y":3,"w":267,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/SwimsuitChestFront.png": +{ + "frame": {"x":1629,"y":3,"w":267,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/SwimsuitChestUp.png": +{ + "frame": {"x":1629,"y":3,"w":267,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/SwimsuitChestWristtie.png": +{ + "frame": {"x":1629,"y":3,"w":267,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/VBikini.png": +{ + "frame": {"x":3,"y":1461,"w":253,"h":200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":718,"w":253,"h":200}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/VBikiniClosed.png": +{ + "frame": {"x":260,"y":1558,"w":253,"h":200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":718,"w":253,"h":200}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ChestPetsuit.png": +{ + "frame": {"x":1628,"y":599,"w":266,"h":159}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":469,"w":266,"h":159}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/FeetKneel.png": +{ + "frame": {"x":1046,"y":1471,"w":156,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":728,"y":903,"w":156,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/TopWristtie.png": +{ + "frame": {"x":1358,"y":3,"w":267,"h":223}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":487,"w":267,"h":223}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ChestPetsuit.png": +{ + "frame": {"x":274,"y":372,"w":266,"h":159}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":469,"w":266,"h":159}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/Dress.png": +{ + "frame": {"x":810,"y":544,"w":264,"h":176}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":564,"w":264,"h":176}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/Hat.png": +{ + "frame": {"x":1898,"y":660,"w":147,"h":139}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":60,"w":147,"h":139}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ShoeRightClosed.png": +{ + "frame": {"x":1899,"y":398,"w":143,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":1366,"w":143,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveRightFront.png": +{ + "frame": {"x":1311,"y":1410,"w":96,"h":155}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":424,"w":96,"h":155}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/WebbingWristtie.png": +{ + "frame": {"x":1358,"y":362,"w":267,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":426,"w":267,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/GloveLeftFree.png": +{ + "frame": {"x":1031,"y":1760,"w":115,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":802,"y":761,"w":115,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/SkirtOverKneelCrotchStrap.png": +{ + "frame": {"x":813,"y":452,"w":265,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":801,"w":265,"h":88}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/Corset.png": +{ + "frame": {"x":524,"y":1436,"w":254,"h":138}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":645,"w":254,"h":138}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ForeGloveRightCrossed.png": +{ + "frame": {"x":816,"y":368,"w":267,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":603,"w":267,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveLeftBoxtie.png": +{ + "frame": {"x":3,"y":1868,"w":96,"h":177}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":507,"w":96,"h":177}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegPadsRightKneel.png": +{ + "frame": {"x":1623,"y":1864,"w":162,"h":181}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":332,"y":813,"w":162,"h":181}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegPadsRightKneelClosed.png": +{ + "frame": {"x":1623,"y":1864,"w":162,"h":181}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":332,"y":813,"w":162,"h":181}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ShoeLeftClosed.png": +{ + "frame": {"x":1158,"y":1569,"w":153,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":520,"y":1456,"w":153,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ShoeLeftKneel.png": +{ + "frame": {"x":1483,"y":1760,"w":179,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":722,"y":921,"w":179,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/WaistBand.png": +{ + "frame": {"x":792,"y":1257,"w":256,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":659,"w":256,"h":133}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas42.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas42.webp b/TextureAtlas/atlas42.webp new file mode 100644 index 000000000..1c914622f Binary files /dev/null and b/TextureAtlas/atlas42.webp differ diff --git a/TextureAtlas/atlas43.json b/TextureAtlas/atlas43.json new file mode 100644 index 000000000..8c0becaaf --- /dev/null +++ b/TextureAtlas/atlas43.json @@ -0,0 +1,1221 @@ +{"frames": { + +"Models/Armbinder/GwenBoxtie.png": +{ + "frame": {"x":1455,"y":986,"w":223,"h":113}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":421,"w":223,"h":113}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Armbinder/GwenWristtie.png": +{ + "frame": {"x":1455,"y":986,"w":223,"h":113}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":421,"w":223,"h":113}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Armbinder/StrapsLeftWristtie.png": +{ + "frame": {"x":1595,"y":483,"w":83,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":531,"w":83,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShoeLeftClosed.png": +{ + "frame": {"x":1682,"y":242,"w":139,"h":200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":1432,"w":139,"h":200}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/WristRightYoked.png": +{ + "frame": {"x":1183,"y":2010,"w":52,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":392,"w":52,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Arms1.png": +{ + "frame": {"x":1454,"y":1479,"w":222,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":487,"y":455,"w":222,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Feet1KneelClosed.png": +{ + "frame": {"x":1324,"y":1704,"w":36,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":705,"y":954,"w":36,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Legs1Kneel.png": +{ + "frame": {"x":1187,"y":1470,"w":174,"h":128}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":501,"y":839,"w":174,"h":128}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/HandLeftFree.png": +{ + "frame": {"x":1682,"y":815,"w":139,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":806,"y":779,"w":139,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/Straps.png": +{ + "frame": {"x":1825,"y":428,"w":220,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":415,"w":220,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveRightFree.png": +{ + "frame": {"x":1825,"y":3,"w":220,"h":167}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":268,"y":537,"w":220,"h":167}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/SockRightKneel.png": +{ + "frame": {"x":757,"y":1034,"w":221,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":816,"w":221,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/FootLeftClosed.png": +{ + "frame": {"x":1682,"y":1146,"w":138,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":1472,"w":138,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/Future.png": +{ + "frame": {"x":1215,"y":1704,"w":105,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":370,"w":105,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Corsets/StrapsHeavyCorset.png": +{ + "frame": {"x":1455,"y":1214,"w":222,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":498,"y":407,"w":222,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenLeftCrossed.png": +{ + "frame": {"x":1824,"y":1678,"w":221,"h":171}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":550,"y":543,"w":221,"h":171}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenRightUp.png": +{ + "frame": {"x":936,"y":1772,"w":143,"h":235}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":164,"w":143,"h":235}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenLeftCrossed.png": +{ + "frame": {"x":1680,"y":1432,"w":140,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":622,"y":586,"w":140,"h":126}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ThighRightKneel.png": +{ + "frame": {"x":1682,"y":1072,"w":139,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":375,"y":817,"w":139,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ThighRightKneelClosed.png": +{ + "frame": {"x":1682,"y":1072,"w":139,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":375,"y":817,"w":139,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/WristLeftFree.png": +{ + "frame": {"x":1627,"y":1853,"w":64,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":797,"y":745,"w":64,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenLeftCrossed.png": +{ + "frame": {"x":1824,"y":1678,"w":221,"h":171}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":550,"y":543,"w":221,"h":171}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenRightUp.png": +{ + "frame": {"x":936,"y":1772,"w":143,"h":235}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":164,"w":143,"h":235}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapLongMittenRightYoked.png": +{ + "frame": {"x":1365,"y":1019,"w":86,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":291,"y":284,"w":86,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ForeLongMittenLeftFront.png": +{ + "frame": {"x":675,"y":263,"w":185,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":470,"w":185,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ForeLongMittenRightFront.png": +{ + "frame": {"x":226,"y":533,"w":161,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":462,"w":161,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenLeftCrossed.png": +{ + "frame": {"x":1824,"y":1678,"w":221,"h":171}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":550,"y":543,"w":221,"h":171}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenRightUp.png": +{ + "frame": {"x":936,"y":1772,"w":143,"h":235}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":164,"w":143,"h":235}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenLeftFree.png": +{ + "frame": {"x":1503,"y":731,"w":88,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":819,"y":778,"w":88,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenLeftCrossed.png": +{ + "frame": {"x":1680,"y":1432,"w":140,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":622,"y":586,"w":140,"h":126}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenLeftFree.png": +{ + "frame": {"x":1740,"y":1936,"w":80,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":733,"y":485,"w":80,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightDecoClosed.png": +{ + "frame": {"x":1002,"y":2011,"w":57,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":532,"y":1444,"w":57,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightLockCrossed.png": +{ + "frame": {"x":1123,"y":2010,"w":56,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":641,"y":600,"w":56,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/Gold.png": +{ + "frame": {"x":1825,"y":1103,"w":217,"h":164}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":504,"y":207,"w":217,"h":164}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmRightBoxtie.png": +{ + "frame": {"x":1227,"y":3,"w":37,"h":243}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":440,"w":37,"h":243}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseForeArmLeftFront.png": +{ + "frame": {"x":1144,"y":759,"w":187,"h":239}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":480,"w":187,"h":239}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BowCorsetBow.png": +{ + "frame": {"x":661,"y":1299,"w":197,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":533,"w":197,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageBraStripes.png": +{ + "frame": {"x":1825,"y":743,"w":217,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":443,"w":217,"h":182}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/ElfLongFront.png": +{ + "frame": {"x":1682,"y":990,"w":139,"h":78}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":259,"w":139,"h":78}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/ShoeLeftClosed.png": +{ + "frame": {"x":1682,"y":446,"w":139,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":1450,"w":139,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/SkirtBackKneel.png": +{ + "frame": {"x":1401,"y":1772,"w":116,"h":198}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":773,"w":116,"h":198}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Expressions/Fear.png": +{ + "frame": {"x":717,"y":1796,"w":215,"h":241}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":120,"w":215,"h":241}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/Brows2Annoyed.png": +{ + "frame": {"x":1239,"y":2010,"w":51,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":603,"y":234,"w":51,"h":35}, + "sourceSize": {"w":717,"h":405} +}, +"Models/EyesK3/EyesAngry.png": +{ + "frame": {"x":1294,"y":2010,"w":51,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":278,"w":51,"h":35}, + "sourceSize": {"w":781,"h":560} +}, +"Models/FaceFang2/MouthSmile.png": +{ + "frame": {"x":1349,"y":2010,"w":44,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":316,"w":44,"h":35}, + "sourceSize": {"w":700,"h":436} +}, +"Models/Festive/ButtonsTopUp.png": +{ + "frame": {"x":1137,"y":1019,"w":224,"h":239}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":408,"w":224,"h":239}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Fuzzy_Overstrap.png": +{ + "frame": {"x":3,"y":800,"w":229,"h":260}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":136,"w":229,"h":260}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair6_Left.png": +{ + "frame": {"x":613,"y":780,"w":108,"h":250}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":107,"w":108,"h":250}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair6_Right.png": +{ + "frame": {"x":725,"y":780,"w":108,"h":250}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":435,"y":107,"w":108,"h":250}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/BeltsTopBoxtie.png": +{ + "frame": {"x":1825,"y":174,"w":220,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":487,"y":409,"w":220,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/BeltsTopFree.png": +{ + "frame": {"x":1825,"y":174,"w":220,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":487,"y":409,"w":220,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/BeltsTopWristtie.png": +{ + "frame": {"x":1825,"y":301,"w":220,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":487,"y":409,"w":220,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/HeadbandBand.png": +{ + "frame": {"x":1595,"y":682,"w":83,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":650,"y":113,"w":83,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/HeadbandBow.png": +{ + "frame": {"x":1960,"y":1957,"w":85,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":218,"w":85,"h":88}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletSoleLeftHogtie.png": +{ + "frame": {"x":3,"y":535,"w":73,"h":261}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":716,"y":761,"w":73,"h":261}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherLegRightHogtie.png": +{ + "frame": {"x":1365,"y":1088,"w":86,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherLegRightKneelClosed.png": +{ + "frame": {"x":982,"y":1019,"w":151,"h":240}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":314,"y":830,"w":151,"h":240}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherRightHogtie.png": +{ + "frame": {"x":1365,"y":1088,"w":86,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLegRightKneel.png": +{ + "frame": {"x":209,"y":3,"w":207,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":313,"y":811,"w":207,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallRightHogtie.png": +{ + "frame": {"x":1365,"y":1088,"w":86,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallRightKneel.png": +{ + "frame": {"x":1595,"y":809,"w":83,"h":105}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":311,"y":834,"w":83,"h":105}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/CrotchBelts.png": +{ + "frame": {"x":1681,"y":1299,"w":138,"h":129}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":794,"w":138,"h":129}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Ears2L.png": +{ + "frame": {"x":1960,"y":1853,"w":85,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":643,"y":102,"w":85,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardStripes.png": +{ + "frame": {"x":464,"y":1567,"w":200,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":556,"w":200,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandWristLeftFront.png": +{ + "frame": {"x":936,"y":2011,"w":62,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":627,"y":551,"w":62,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ThighRightClosed.png": +{ + "frame": {"x":1401,"y":1974,"w":109,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":1026,"w":109,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveLeftFree.png": +{ + "frame": {"x":1065,"y":255,"w":210,"h":243}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":610,"w":210,"h":243}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockLeftHogtie.png": +{ + "frame": {"x":1083,"y":1772,"w":156,"h":234}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":576,"y":972,"w":156,"h":234}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockRightClosed.png": +{ + "frame": {"x":1682,"y":640,"w":139,"h":171}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":1445,"w":139,"h":171}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockLeftHogtie.png": +{ + "frame": {"x":1083,"y":1772,"w":156,"h":234}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":576,"y":972,"w":156,"h":234}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockLeftKneel.png": +{ + "frame": {"x":1521,"y":1678,"w":170,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":726,"y":928,"w":170,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/AnkleRightSpread.png": +{ + "frame": {"x":1364,"y":1626,"w":73,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":491,"y":1422,"w":73,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareThighRightKneel.png": +{ + "frame": {"x":1335,"y":986,"w":116,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":373,"y":850,"w":116,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ThighRightKneel.png": +{ + "frame": {"x":1069,"y":1706,"w":142,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":371,"y":831,"w":142,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/ShoeRightKneel.png": +{ + "frame": {"x":1365,"y":1397,"w":85,"h":116}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":845,"w":85,"h":116}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SockRightKneel.png": +{ + "frame": {"x":817,"y":518,"w":204,"h":249}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":313,"y":816,"w":204,"h":249}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/Belts.png": +{ + "frame": {"x":487,"y":1819,"w":226,"h":226}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":649,"w":226,"h":226}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLegRightSpread.png": +{ + "frame": {"x":1824,"y":1853,"w":132,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":1097,"w":132,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronLeftUp.png": +{ + "frame": {"x":420,"y":3,"w":185,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":696,"y":343,"w":185,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveLeftCrossed.png": +{ + "frame": {"x":1221,"y":502,"w":140,"h":239}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":667,"y":400,"w":140,"h":239}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveLeftWristtie.png": +{ + "frame": {"x":1108,"y":3,"w":115,"h":243}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":671,"y":423,"w":115,"h":243}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveLeftYoked.png": +{ + "frame": {"x":715,"y":3,"w":177,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":391,"w":177,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveRightCrossed.png": +{ + "frame": {"x":1268,"y":3,"w":162,"h":242}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":392,"w":162,"h":242}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveRightUp.png": +{ + "frame": {"x":80,"y":535,"w":142,"h":260}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":292,"w":142,"h":260}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SockRightKneel.png": +{ + "frame": {"x":439,"y":1313,"w":218,"h":250}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":311,"y":816,"w":218,"h":250}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ApronChestUp.png": +{ + "frame": {"x":564,"y":525,"w":249,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":358,"w":249,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmLeftBoxtie.png": +{ + "frame": {"x":3,"y":269,"w":131,"h":262}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":675,"y":427,"w":131,"h":262}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmLeftCrossed.png": +{ + "frame": {"x":3,"y":269,"w":131,"h":262}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":675,"y":427,"w":131,"h":262}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmLeftYoked.png": +{ + "frame": {"x":294,"y":1056,"w":249,"h":253}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":384,"w":249,"h":253}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmRightCrossed.png": +{ + "frame": {"x":138,"y":269,"w":117,"h":260}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":432,"y":424,"w":117,"h":260}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuff2RightFront.png": +{ + "frame": {"x":1503,"y":907,"w":88,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":419,"y":639,"w":88,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/BandRightYoked.png": +{ + "frame": {"x":1063,"y":2011,"w":56,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":313,"y":393,"w":56,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexLeftFront.png": +{ + "frame": {"x":1187,"y":1262,"w":174,"h":204}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":468,"w":174,"h":204}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/PawRightYoked.png": +{ + "frame": {"x":1627,"y":1777,"w":64,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":323,"y":320,"w":64,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/KneeLeftSpread.png": +{ + "frame": {"x":1695,"y":1760,"w":125,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":645,"y":1152,"w":125,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopBandChest.png": +{ + "frame": {"x":1462,"y":244,"w":216,"h":235}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":394,"w":216,"h":235}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopBandRimChest.png": +{ + "frame": {"x":1605,"y":3,"w":216,"h":235}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":394,"w":216,"h":235}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/ForeGloveLeftFront.png": +{ + "frame": {"x":896,"y":3,"w":208,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":548,"y":465,"w":208,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/ForeGloveRightFront.png": +{ + "frame": {"x":503,"y":265,"w":168,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":461,"w":168,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveRightFront.png": +{ + "frame": {"x":391,"y":528,"w":169,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":461,"w":169,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/PantiesHigh/Stripes.png": +{ + "frame": {"x":3,"y":1845,"w":240,"h":200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":719,"w":240,"h":200}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopCalf2Closed.png": +{ + "frame": {"x":1825,"y":929,"w":217,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":531,"y":1231,"w":217,"h":170}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopCalf2KneelClosed.png": +{ + "frame": {"x":1365,"y":491,"w":226,"h":236}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":427,"y":812,"w":226,"h":236}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopThigh3KneelClosed.png": +{ + "frame": {"x":668,"y":1551,"w":242,"h":241}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":826,"w":242,"h":241}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/ChestFabric.png": +{ + "frame": {"x":1434,"y":3,"w":167,"h":237}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":413,"w":167,"h":237}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/ChestFabricTied.png": +{ + "frame": {"x":1335,"y":745,"w":164,"h":237}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":413,"w":164,"h":237}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/ChestGold.png": +{ + "frame": {"x":103,"y":1064,"w":187,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":405,"w":187,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/ChestGoldBase.png": +{ + "frame": {"x":169,"y":1585,"w":188,"h":255}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":405,"w":188,"h":255}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/ChestGoldBaseTied.png": +{ + "frame": {"x":252,"y":1324,"w":183,"h":255}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":405,"w":183,"h":255}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/ChestGoldTied.png": +{ + "frame": {"x":236,"y":796,"w":183,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":405,"w":183,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/PlateKneel.png": +{ + "frame": {"x":3,"y":1325,"w":245,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":595,"w":245,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveRightUp.png": +{ + "frame": {"x":3,"y":3,"w":202,"h":262}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":387,"y":159,"w":202,"h":262}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RopeOld/ShoulderStraps.png": +{ + "frame": {"x":1455,"y":1103,"w":223,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":409,"w":223,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ArmRightBoxtie.png": +{ + "frame": {"x":3,"y":1585,"w":79,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":429,"w":79,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Legs1Kneel.png": +{ + "frame": {"x":1521,"y":1936,"w":215,"h":109}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":565,"y":861,"w":215,"h":109}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Legs1KneelClosed.png": +{ + "frame": {"x":1521,"y":1936,"w":215,"h":109}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":565,"y":861,"w":215,"h":109}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderLeftYoked.png": +{ + "frame": {"x":1682,"y":904,"w":139,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":666,"y":406,"w":139,"h":82}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ArmRightBoxtie.png": +{ + "frame": {"x":86,"y":1585,"w":79,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":429,"w":79,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/FaceFull.png": +{ + "frame": {"x":1825,"y":540,"w":217,"h":199}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":194,"w":217,"h":199}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/LegRightKneelClosed.png": +{ + "frame": {"x":914,"y":1528,"w":151,"h":240}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":314,"y":830,"w":151,"h":240}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/RightKneel.png": +{ + "frame": {"x":1365,"y":1517,"w":85,"h":105}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":311,"y":834,"w":85,"h":105}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/Belt.png": +{ + "frame": {"x":247,"y":1844,"w":236,"h":201}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":670,"w":236,"h":201}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimBelt.png": +{ + "frame": {"x":1824,"y":1271,"w":221,"h":201}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":670,"w":221,"h":201}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowRightBoxtie.png": +{ + "frame": {"x":1365,"y":1153,"w":86,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":591,"w":86,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ThighRightKneel.png": +{ + "frame": {"x":1364,"y":1678,"w":153,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":811,"w":153,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SockLeftKneelClosed.png": +{ + "frame": {"x":1595,"y":918,"w":80,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":812,"y":917,"w":80,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallLegRightKneel.png": +{ + "frame": {"x":1025,"y":511,"w":192,"h":244}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":312,"y":819,"w":192,"h":244}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallLegRightKneelClosed.png": +{ + "frame": {"x":1279,"y":249,"w":179,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":323,"y":821,"w":179,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLegRightKneel.png": +{ + "frame": {"x":547,"y":1045,"w":206,"h":250}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":313,"y":819,"w":206,"h":250}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLegRightKneelClosed.png": +{ + "frame": {"x":936,"y":771,"w":204,"h":244}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":818,"w":204,"h":244}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallRightHogtie.png": +{ + "frame": {"x":1365,"y":1088,"w":86,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/HandRightFront.png": +{ + "frame": {"x":1503,"y":819,"w":88,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":467,"w":88,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmLeftCrossed.png": +{ + "frame": {"x":361,"y":1583,"w":99,"h":255}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":425,"w":99,"h":255}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmLeftFront.png": +{ + "frame": {"x":609,"y":3,"w":102,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":671,"y":425,"w":102,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmRightFree.png": +{ + "frame": {"x":862,"y":1284,"w":199,"h":240}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":358,"y":465,"w":199,"h":240}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmRightUp.png": +{ + "frame": {"x":1243,"y":1772,"w":154,"h":234}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":161,"w":154,"h":234}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/HeadgearEars.png": +{ + "frame": {"x":1454,"y":1562,"w":237,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":497,"y":48,"w":237,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveLeftBoxtie.png": +{ + "frame": {"x":3,"y":1064,"w":96,"h":257}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":427,"w":96,"h":257}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveLeftYoked.png": +{ + "frame": {"x":259,"y":266,"w":240,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":380,"w":240,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/SleeveRightCrossed.png": +{ + "frame": {"x":1065,"y":1263,"w":118,"h":240}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":424,"w":118,"h":240}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Visors/DollmakerFull.png": +{ + "frame": {"x":423,"y":788,"w":186,"h":253}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":142,"w":186,"h":253}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/GloveLeftYoked.png": +{ + "frame": {"x":1521,"y":1777,"w":102,"h":154}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":849,"y":278,"w":102,"h":154}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeRightKneel.png": +{ + "frame": {"x":1365,"y":1246,"w":85,"h":147}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":311,"y":855,"w":85,"h":147}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/ShoeLeftClosed.png": +{ + "frame": {"x":1454,"y":1353,"w":222,"h":122}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":1507,"w":222,"h":122}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/ShoeLeftKneel.png": +{ + "frame": {"x":1187,"y":1602,"w":173,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":720,"y":927,"w":173,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/FCollar.png": +{ + "frame": {"x":1365,"y":1202,"w":86,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":390,"w":86,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ForeGloveLeftFront.png": +{ + "frame": {"x":864,"y":258,"w":197,"h":249}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":548,"y":465,"w":197,"h":249}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveLeftCrossed.png": +{ + "frame": {"x":1824,"y":1476,"w":221,"h":198}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":552,"y":503,"w":221,"h":198}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveLeftWristtie.png": +{ + "frame": {"x":837,"y":771,"w":95,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":506,"w":95,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegPadsRightHogtie.png": +{ + "frame": {"x":1695,"y":1562,"w":125,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":942,"w":125,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ShoeRightSpread.png": +{ + "frame": {"x":1069,"y":1507,"w":114,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":1456,"w":114,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas43.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas43.webp b/TextureAtlas/atlas43.webp new file mode 100644 index 000000000..ea4432ca8 Binary files /dev/null and b/TextureAtlas/atlas43.webp differ diff --git a/TextureAtlas/atlas44.json b/TextureAtlas/atlas44.json new file mode 100644 index 000000000..69164987b --- /dev/null +++ b/TextureAtlas/atlas44.json @@ -0,0 +1,1861 @@ +{"frames": { + +"Models/Armbinder/CrossBoxtie.png": +{ + "frame": {"x":1525,"y":206,"w":243,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":471,"y":410,"w":243,"h":126}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Armbinder/CrossWristtie.png": +{ + "frame": {"x":256,"y":433,"w":245,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":410,"w":245,"h":127}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Armbinder/SecureBoxtie.png": +{ + "frame": {"x":1519,"y":487,"w":242,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":410,"w":242,"h":126}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Armbinder/SecureWristtie.png": +{ + "frame": {"x":1519,"y":487,"w":242,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":410,"w":242,"h":126}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Armbinder/WolfHarness.png": +{ + "frame": {"x":1780,"y":3,"w":246,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":412,"w":246,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/SkirtBeltDeco.png": +{ + "frame": {"x":169,"y":1817,"w":153,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":543,"y":772,"w":153,"h":168}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/BootRightKneel.png": +{ + "frame": {"x":937,"y":1073,"w":73,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":321,"y":853,"w":73,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/GauntletLeftCrossed.png": +{ + "frame": {"x":561,"y":1926,"w":116,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":507,"y":631,"w":116,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShoeLeftSpread.png": +{ + "frame": {"x":3,"y":1331,"w":132,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":636,"y":1440,"w":132,"h":206}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Blindfold/Cloth.png": +{ + "frame": {"x":708,"y":1029,"w":225,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":48,"y":152,"w":225,"h":79}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Body/FootLeftHogtie.png": +{ + "frame": {"x":1253,"y":828,"w":235,"h":145}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":621,"y":799,"w":235,"h":145}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ForeArmRightFront.png": +{ + "frame": {"x":1921,"y":1597,"w":124,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":417,"y":543,"w":124,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ShoulderLeftUp.png": +{ + "frame": {"x":1229,"y":1821,"w":160,"h":164}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":626,"y":398,"w":160,"h":164}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/GloveLeftBoxtie.png": +{ + "frame": {"x":730,"y":1580,"w":90,"h":164}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":519,"w":90,"h":164}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ShoulderLeftUp.png": +{ + "frame": {"x":3,"y":1817,"w":162,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":626,"y":394,"w":162,"h":168}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Corsets/CrossHeavyCorset.png": +{ + "frame": {"x":256,"y":433,"w":245,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":410,"w":245,"h":127}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/AnkleLeftKneelClosed.png": +{ + "frame": {"x":1665,"y":1519,"w":38,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/Belt.png": +{ + "frame": {"x":1014,"y":997,"w":228,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":672,"w":228,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/Collar.png": +{ + "frame": {"x":539,"y":1989,"w":89,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":583,"y":374,"w":89,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowLeftWristtie.png": +{ + "frame": {"x":1186,"y":1989,"w":65,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":671,"y":599,"w":65,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ThighLeftKneel.png": +{ + "frame": {"x":824,"y":1541,"w":185,"h":114}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":848,"w":185,"h":114}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ThighRightClosed.png": +{ + "frame": {"x":681,"y":1926,"w":109,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":1032,"w":109,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/WristRightFront.png": +{ + "frame": {"x":816,"y":1989,"w":67,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":541,"w":67,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/AnkleLeftKneelClosed.png": +{ + "frame": {"x":1665,"y":1578,"w":38,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/AnkleLinkSpread.png": +{ + "frame": {"x":326,"y":1926,"w":151,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":546,"y":1438,"w":151,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/Belt.png": +{ + "frame": {"x":476,"y":966,"w":228,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":672,"w":228,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/Collar.png": +{ + "frame": {"x":632,"y":1989,"w":89,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":583,"y":374,"w":89,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowLeftWristtie.png": +{ + "frame": {"x":1255,"y":1989,"w":65,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":671,"y":599,"w":65,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ThighRightClosed.png": +{ + "frame": {"x":794,"y":1926,"w":109,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":1032,"w":109,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/WristRightFront.png": +{ + "frame": {"x":887,"y":1989,"w":67,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":541,"w":67,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowLongMittenLeftYoked.png": +{ + "frame": {"x":3,"y":1660,"w":207,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":762,"y":383,"w":207,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenLeftYoked.png": +{ + "frame": {"x":1393,"y":1821,"w":172,"h":223}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":751,"y":420,"w":172,"h":223}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenRightFront.png": +{ + "frame": {"x":906,"y":1748,"w":108,"h":161}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":560,"w":108,"h":161}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsForeLongMittenRightCrossed.png": +{ + "frame": {"x":924,"y":1261,"w":85,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":600,"w":85,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenLeftWristtie.png": +{ + "frame": {"x":2010,"y":617,"w":35,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":638,"w":35,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/Belt.png": +{ + "frame": {"x":485,"y":890,"w":231,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":674,"w":231,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowLeftFree.png": +{ + "frame": {"x":2018,"y":341,"w":27,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":759,"y":589,"w":27,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowLeftUp.png": +{ + "frame": {"x":883,"y":1289,"w":37,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":260,"w":37,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowLeftYoked.png": +{ + "frame": {"x":481,"y":1660,"w":36,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":798,"y":492,"w":36,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowRightUp.png": +{ + "frame": {"x":2010,"y":683,"w":35,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":251,"w":35,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayWristLeftFront.png": +{ + "frame": {"x":1925,"y":1332,"w":25,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":667,"y":539,"w":25,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayWristRightFront.png": +{ + "frame": {"x":1930,"y":1244,"w":25,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":471,"y":536,"w":25,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockAnkleLeftClosed.png": +{ + "frame": {"x":1454,"y":1301,"w":25,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":623,"y":1447,"w":25,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowLeftUp.png": +{ + "frame": {"x":2018,"y":435,"w":27,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":718,"y":267,"w":27,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowRightUp.png": +{ + "frame": {"x":1930,"y":1288,"w":25,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":526,"y":258,"w":25,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenBelt.png": +{ + "frame": {"x":824,"y":1469,"w":55,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":542,"y":687,"w":55,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowLeftFront.png": +{ + "frame": {"x":1665,"y":1453,"w":38,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":743,"y":595,"w":38,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowRightBoxtie.png": +{ + "frame": {"x":2018,"y":390,"w":27,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":591,"w":27,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ThighRightClosed.png": +{ + "frame": {"x":1918,"y":1787,"w":127,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":1002,"w":127,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/WristRightCrossed.png": +{ + "frame": {"x":958,"y":1989,"w":55,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":651,"y":593,"w":55,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/GlowBalletLeftKneel.png": +{ + "frame": {"x":1491,"y":1163,"w":216,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":932,"w":216,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/GlowBalletLeftKneelClosed.png": +{ + "frame": {"x":1013,"y":1524,"w":209,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":732,"y":942,"w":209,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/ShinyBalletRightKneel.png": +{ + "frame": {"x":326,"y":1817,"w":76,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":321,"y":852,"w":76,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenLeftYoked.png": +{ + "frame": {"x":1393,"y":1821,"w":172,"h":223}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":751,"y":420,"w":172,"h":223}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenRightFront.png": +{ + "frame": {"x":906,"y":1748,"w":108,"h":161}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":560,"w":108,"h":161}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowLongMittenLeftFree.png": +{ + "frame": {"x":930,"y":1177,"w":80,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":809,"y":725,"w":80,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenRightFront.png": +{ + "frame": {"x":906,"y":1748,"w":108,"h":161}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":560,"w":108,"h":161}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenRightYoked.png": +{ + "frame": {"x":1960,"y":1228,"w":85,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":292,"y":311,"w":85,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsForeLongMittenRightCrossed.png": +{ + "frame": {"x":924,"y":1261,"w":85,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":600,"w":85,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenLeftWristtie.png": +{ + "frame": {"x":2010,"y":617,"w":35,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":638,"w":35,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/DisplayLeftLegsKneel.png": +{ + "frame": {"x":1255,"y":1660,"w":183,"h":157}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":504,"y":776,"w":183,"h":157}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/DisplayLeftLegsKneelClosed.png": +{ + "frame": {"x":1255,"y":1660,"w":183,"h":157}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":504,"y":776,"w":183,"h":157}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/LockBraHighlight.png": +{ + "frame": {"x":481,"y":1817,"w":76,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":545,"y":456,"w":76,"h":168}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/LockBraPlate.png": +{ + "frame": {"x":583,"y":1350,"w":79,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":536,"y":434,"w":79,"h":208}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftKneel.png": +{ + "frame": {"x":1186,"y":1828,"w":38,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftKneelClosed.png": +{ + "frame": {"x":1186,"y":1828,"w":38,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftLockBandClosed.png": +{ + "frame": {"x":1460,"y":1111,"w":27,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":661,"y":1458,"w":27,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftLockKneel.png": +{ + "frame": {"x":1986,"y":742,"w":59,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":719,"y":946,"w":59,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLinkSpread.png": +{ + "frame": {"x":326,"y":1926,"w":151,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":546,"y":1438,"w":151,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightLockBandClosed.png": +{ + "frame": {"x":1460,"y":1151,"w":27,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":514,"y":1454,"w":27,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightLockClosed.png": +{ + "frame": {"x":972,"y":814,"w":38,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":1422,"w":38,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/Belt.png": +{ + "frame": {"x":704,"y":1112,"w":222,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":669,"w":222,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/BeltLockPlate.png": +{ + "frame": {"x":406,"y":1660,"w":71,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":683,"w":71,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/CollarLockPlate.png": +{ + "frame": {"x":1324,"y":1989,"w":42,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":598,"y":380,"w":42,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightDecoCleanUp.png": +{ + "frame": {"x":907,"y":1926,"w":107,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":260,"w":107,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftLockPlateFree.png": +{ + "frame": {"x":481,"y":1710,"w":36,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":826,"y":743,"w":36,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/GoldClean.png": +{ + "frame": {"x":228,"y":1163,"w":217,"h":164}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":504,"y":207,"w":217,"h":164}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageCollarTie.png": +{ + "frame": {"x":1483,"y":1354,"w":213,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":496,"y":415,"w":213,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MonocleRight.png": +{ + "frame": {"x":406,"y":1737,"w":71,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":269,"w":71,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/FoxInner.png": +{ + "frame": {"x":824,"y":1659,"w":190,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":501,"y":89,"w":190,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/WolfInner.png": +{ + "frame": {"x":1728,"y":1104,"w":228,"h":136}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":499,"y":60,"w":228,"h":136}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandRightFree.png": +{ + "frame": {"x":1186,"y":1943,"w":38,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":493,"w":38,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesK3/WhitesEyesAngry.png": +{ + "frame": {"x":1569,"y":1887,"w":51,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":278,"w":51,"h":35}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/EyesAngry.png": +{ + "frame": {"x":952,"y":967,"w":58,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":58,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyesAngry.png": +{ + "frame": {"x":952,"y":1020,"w":58,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":58,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/FaceKjus/BlushExtreme.png": +{ + "frame": {"x":48,"y":1593,"w":168,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":529,"y":288,"w":168,"h":63}, + "sourceSize": {"w":858,"h":486} +}, +"Models/Festive/ButtonsBot.png": +{ + "frame": {"x":1014,"y":789,"w":235,"h":204}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":693,"w":235,"h":204}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/FluffHogtie.png": +{ + "frame": {"x":1502,"y":617,"w":238,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":143,"w":238,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/FuzzBot.png": +{ + "frame": {"x":494,"y":661,"w":235,"h":225}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":681,"w":235,"h":225}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/FuzzBotClosed.png": +{ + "frame": {"x":246,"y":699,"w":235,"h":225}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":681,"w":235,"h":225}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/FuzzUnderbust.png": +{ + "frame": {"x":1232,"y":1368,"w":213,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":523,"w":213,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/HardwareUnderbust.png": +{ + "frame": {"x":666,"y":1289,"w":213,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":610,"w":213,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/Hat.png": +{ + "frame": {"x":3,"y":3,"w":253,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":496,"y":98,"w":253,"h":170}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/HatHogtie.png": +{ + "frame": {"x":505,"y":509,"w":239,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":88,"w":239,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Fiddle/FiddleBody.png": +{ + "frame": {"x":1013,"y":1279,"w":215,"h":103}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":523,"w":215,"h":103}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Fiddle/FiddleLines.png": +{ + "frame": {"x":1235,"y":1258,"w":215,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":521,"w":215,"h":106}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureHarness/StrapsChest.png": +{ + "frame": {"x":1492,"y":1013,"w":232,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":404,"w":232,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureHarness/StrapsMid.png": +{ + "frame": {"x":1528,"y":3,"w":248,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":665,"w":248,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagFrilly/Duster.png": +{ + "frame": {"x":769,"y":1817,"w":133,"h":103}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":213,"w":133,"h":103}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BigBall.png": +{ + "frame": {"x":521,"y":1484,"w":58,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":103,"y":233,"w":58,"h":44}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BigBall2Fang.png": +{ + "frame": {"x":521,"y":1532,"w":58,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":103,"y":233,"w":58,"h":44}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagTape/Wrap.png": +{ + "frame": {"x":730,"y":1748,"w":172,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":54,"y":214,"w":172,"h":65}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/FrontStraight2_Overstrap.png": +{ + "frame": {"x":1738,"y":833,"w":236,"h":157}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":112,"w":236,"h":157}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/MaidFrill.png": +{ + "frame": {"x":237,"y":1066,"w":221,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":97,"w":221,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/MaidHairband.png": +{ + "frame": {"x":1014,"y":1076,"w":221,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":500,"y":119,"w":221,"h":96}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/VentsFront.png": +{ + "frame": {"x":348,"y":1484,"w":169,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":121,"w":169,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair5_Front.png": +{ + "frame": {"x":771,"y":3,"w":249,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":116,"w":249,"h":216}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/HandCuffsFront.png": +{ + "frame": {"x":748,"y":616,"w":238,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":526,"w":238,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/HingedCuffsFront.png": +{ + "frame": {"x":748,"y":537,"w":238,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":526,"w":238,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/BeltsOverbust.png": +{ + "frame": {"x":824,"y":1354,"w":55,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":556,"y":505,"w":55,"h":111}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/BeltsTopUp.png": +{ + "frame": {"x":1525,"y":336,"w":242,"h":147}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":409,"w":242,"h":147}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/BeltsTopYoked.png": +{ + "frame": {"x":1778,"y":153,"w":244,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":409,"w":244,"h":133}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hood/KittyEars.png": +{ + "frame": {"x":509,"y":334,"w":245,"h":171}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":487,"y":51,"w":245,"h":171}, + "sourceSize": {"w":752,"h":479} +}, +"Models/KittyLatex/KittyLatexTailLight.png": +{ + "frame": {"x":406,"y":1807,"w":71,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":896,"y":1290,"w":71,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/AnkleLeftClosed.png": +{ + "frame": {"x":406,"y":1868,"w":71,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":1424,"w":71,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockThighRightSpread.png": +{ + "frame": {"x":990,"y":537,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":545,"y":1062,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockWristLeftFront.png": +{ + "frame": {"x":990,"y":567,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":665,"y":561,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockWristLeftYoked.png": +{ + "frame": {"x":990,"y":597,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":903,"y":415,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockWristRightFree.png": +{ + "frame": {"x":990,"y":627,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":381,"y":640,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockWristRightFront.png": +{ + "frame": {"x":990,"y":657,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":562,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockWristRightYoked.png": +{ + "frame": {"x":449,"y":1163,"w":22,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":318,"y":419,"w":22,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/BlindfoldRim.png": +{ + "frame": {"x":561,"y":1817,"w":204,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":512,"y":241,"w":204,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/BlindfoldStrap.png": +{ + "frame": {"x":48,"y":1541,"w":195,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":518,"y":261,"w":195,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowRightFront.png": +{ + "frame": {"x":2018,"y":290,"w":27,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":603,"w":27,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/ForeGloveLeftFront.png": +{ + "frame": {"x":3,"y":177,"w":249,"h":229}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":484,"w":249,"h":229}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveLeftCrossed.png": +{ + "frame": {"x":1014,"y":1176,"w":217,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":551,"y":614,"w":217,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveLeftWristtie.png": +{ + "frame": {"x":1654,"y":1798,"w":49,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":627,"w":49,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/LeftLegsPawsKneel.png": +{ + "frame": {"x":725,"y":1989,"w":87,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":789,"y":951,"w":87,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandWristRightFree.png": +{ + "frame": {"x":972,"y":895,"w":38,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":362,"y":603,"w":38,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/Belt.png": +{ + "frame": {"x":3,"y":1007,"w":230,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":671,"w":230,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BowBellCollar.png": +{ + "frame": {"x":1460,"y":1224,"w":27,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":595,"y":399,"w":27,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/Laces.png": +{ + "frame": {"x":3,"y":1541,"w":41,"h":115}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":541,"y":649,"w":41,"h":115}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/Corset.png": +{ + "frame": {"x":260,"y":133,"w":250,"h":159}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":612,"w":250,"h":159}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/CorsetStraps.png": +{ + "frame": {"x":251,"y":564,"w":239,"h":131}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":406,"w":239,"h":131}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/CorsetStrapsBoxtie.png": +{ + "frame": {"x":720,"y":900,"w":228,"h":125}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":412,"w":228,"h":125}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeOverKneelCrotchStrap.png": +{ + "frame": {"x":1498,"y":713,"w":237,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":545,"y":832,"w":237,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronChestRufflesUp.png": +{ + "frame": {"x":1253,"y":977,"w":235,"h":130}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":364,"w":235,"h":130}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftFront.png": +{ + "frame": {"x":1925,"y":1395,"w":120,"h":198}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":687,"y":519,"w":120,"h":198}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLegLeftKneel.png": +{ + "frame": {"x":139,"y":1350,"w":103,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":369,"y":928,"w":103,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ForeArmLeftCrossed.png": +{ + "frame": {"x":475,"y":1192,"w":216,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":548,"y":628,"w":216,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletLeftCrossed.png": +{ + "frame": {"x":758,"y":417,"w":240,"h":116}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":590,"w":240,"h":116}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletLeftUp.png": +{ + "frame": {"x":1978,"y":1080,"w":67,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":233,"w":67,"h":144}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveRightYoked.png": +{ + "frame": {"x":1018,"y":1828,"w":164,"h":217}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":390,"y":423,"w":164,"h":217}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ForeArmRightFront.png": +{ + "frame": {"x":883,"y":1348,"w":126,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":422,"y":530,"w":126,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardLeftYoked.png": +{ + "frame": {"x":1654,"y":1637,"w":49,"h":157}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":897,"y":381,"w":49,"h":157}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardRightCrossed.png": +{ + "frame": {"x":704,"y":1181,"w":216,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":593,"w":216,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronLeftBoxtie.png": +{ + "frame": {"x":1918,"y":1878,"w":120,"h":167}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":390,"w":120,"h":167}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronLeftFront.png": +{ + "frame": {"x":1918,"y":1878,"w":120,"h":167}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":393,"w":120,"h":167}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexRightFree.png": +{ + "frame": {"x":1707,"y":1550,"w":210,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":276,"y":552,"w":210,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LeatherLeftFront.png": +{ + "frame": {"x":1449,"y":1453,"w":212,"h":125}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":469,"w":212,"h":125}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LockLeftYoked.png": +{ + "frame": {"x":1449,"y":1379,"w":25,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":878,"y":387,"w":25,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LockRightFree.png": +{ + "frame": {"x":1460,"y":1190,"w":27,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":371,"y":607,"w":27,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LockRightYoked.png": +{ + "frame": {"x":1454,"y":1341,"w":25,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":341,"y":392,"w":25,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenLeftBoxtie.png": +{ + "frame": {"x":730,"y":1580,"w":90,"h":164}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":519,"w":90,"h":164}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenLeftFront.png": +{ + "frame": {"x":246,"y":1350,"w":98,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":670,"y":527,"w":98,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenRightFront.png": +{ + "frame": {"x":1978,"y":870,"w":67,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":509,"w":67,"h":206}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/PawRightFree.png": +{ + "frame": {"x":1980,"y":795,"w":65,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":299,"y":556,"w":65,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/Belt.png": +{ + "frame": {"x":256,"y":296,"w":249,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":640,"w":249,"h":133}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/Collar.png": +{ + "frame": {"x":220,"y":1593,"w":113,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":371,"w":113,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SkirtBandOverKneel.png": +{ + "frame": {"x":1569,"y":1817,"w":80,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":848,"w":80,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopBandChestTied.png": +{ + "frame": {"x":1707,"y":1754,"w":207,"h":231}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":397,"w":207,"h":231}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopBandRimChestTied.png": +{ + "frame": {"x":1018,"y":1593,"w":207,"h":231}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":397,"w":207,"h":231}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Nipples/ClampsBullet.png": +{ + "frame": {"x":1707,"y":1703,"w":208,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":568,"w":208,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/PantiesHigh/BaseClosed.png": +{ + "frame": {"x":1772,"y":290,"w":242,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":467,"y":711,"w":242,"h":208}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/PantiesHigh/Lines.png": +{ + "frame": {"x":1276,"y":131,"w":245,"h":211}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":709,"w":245,"h":211}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/PantiesHigh/LinesClosed.png": +{ + "frame": {"x":1024,"y":190,"w":245,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":709,"w":245,"h":210}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Belt.png": +{ + "frame": {"x":1491,"y":1242,"w":216,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":658,"w":216,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Calf1Closed.png": +{ + "frame": {"x":521,"y":1580,"w":205,"h":233}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":542,"y":1225,"w":205,"h":233}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Calf3Closed.png": +{ + "frame": {"x":1016,"y":404,"w":240,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":507,"y":1225,"w":240,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopArmHarness.png": +{ + "frame": {"x":1708,"y":1329,"w":213,"h":217}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":409,"w":213,"h":217}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopCalf3Closed.png": +{ + "frame": {"x":1765,"y":502,"w":241,"h":185}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":507,"y":1231,"w":241,"h":185}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopCrotchStrap.png": +{ + "frame": {"x":2010,"y":522,"w":35,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":564,"y":829,"w":35,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopRightThigh2KneelClosed.png": +{ + "frame": {"x":314,"y":1989,"w":126,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":364,"y":859,"w":126,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopRightThigh3KneelClosed.png": +{ + "frame": {"x":1013,"y":1386,"w":212,"h":134}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":335,"y":812,"w":212,"h":134}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopThigh2Closed.png": +{ + "frame": {"x":1276,"y":3,"w":248,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":1012,"w":248,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/ChestFrill.png": +{ + "frame": {"x":3,"y":1086,"w":221,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":446,"w":221,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/FabricKneel.png": +{ + "frame": {"x":517,"y":3,"w":250,"h":185}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":657,"w":250,"h":185}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/RibbonBelt.png": +{ + "frame": {"x":242,"y":928,"w":230,"h":134}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":623,"w":230,"h":134}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ZombieHatBand.png": +{ + "frame": {"x":260,"y":3,"w":253,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":53,"w":253,"h":126}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/AnklesKneel.png": +{ + "frame": {"x":1186,"y":1887,"w":38,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/AnklesKneelOver.png": +{ + "frame": {"x":1186,"y":1887,"w":38,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/ArmHarness.png": +{ + "frame": {"x":733,"y":685,"w":235,"h":211}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":411,"w":235,"h":211}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf1KneelClosed.png": +{ + "frame": {"x":1186,"y":1887,"w":38,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf1KneelClosedOver.png": +{ + "frame": {"x":1186,"y":1887,"w":38,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/FrogThigh1KneelClosed.png": +{ + "frame": {"x":3,"y":495,"w":244,"h":160}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":332,"y":908,"w":244,"h":160}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/FrogThigh2Kneel.png": +{ + "frame": {"x":767,"y":223,"w":245,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":351,"y":892,"w":245,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh1ClosedOver.png": +{ + "frame": {"x":1707,"y":1989,"w":206,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":1092,"w":206,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh2KneelClosedOver.png": +{ + "frame": {"x":449,"y":1350,"w":130,"h":130}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":871,"w":130,"h":130}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh3KneelClosed.png": +{ + "frame": {"x":214,"y":1660,"w":188,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":499,"y":832,"w":188,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/FaceEyes.png": +{ + "frame": {"x":1239,"y":1111,"w":217,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":194,"w":217,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/CollarStripeUp.png": +{ + "frame": {"x":666,"y":1354,"w":154,"h":222}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":548,"y":303,"w":154,"h":222}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/CollarStripeYoked.png": +{ + "frame": {"x":1738,"y":994,"w":236,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":510,"y":413,"w":236,"h":106}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/HemRight.png": +{ + "frame": {"x":2018,"y":479,"w":27,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":490,"w":27,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Feet1KneelClosed.png": +{ + "frame": {"x":1024,"y":3,"w":248,"h":183}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":894,"w":248,"h":183}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/FaceEyes.png": +{ + "frame": {"x":3,"y":1183,"w":217,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":194,"w":217,"h":144}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/HandRightFree.png": +{ + "frame": {"x":1569,"y":1926,"w":134,"h":113}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":268,"y":544,"w":134,"h":113}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/Belt.png": +{ + "frame": {"x":3,"y":787,"w":235,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":700,"w":235,"h":216}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/BeltSegu.png": +{ + "frame": {"x":972,"y":687,"w":38,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":553,"y":732,"w":38,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/AnkleRightSpread.png": +{ + "frame": {"x":444,"y":1989,"w":91,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":1431,"w":91,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowRightBoxtie.png": +{ + "frame": {"x":247,"y":1541,"w":95,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":589,"w":95,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowRightFront.png": +{ + "frame": {"x":449,"y":1281,"w":213,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":424,"y":595,"w":213,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimThighLeftSpread.png": +{ + "frame": {"x":159,"y":1989,"w":151,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":994,"w":151,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimThighRightSpread.png": +{ + "frame": {"x":3,"y":1989,"w":152,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":995,"w":152,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Swimsuit/Strappy.png": +{ + "frame": {"x":3,"y":659,"w":239,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":614,"w":239,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmRightCrossed.png": +{ + "frame": {"x":1744,"y":691,"w":238,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":605,"w":238,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/FeetClosed.png": +{ + "frame": {"x":1229,"y":1520,"w":209,"h":136}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":1483,"w":209,"h":136}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/PetsuitTopHands.png": +{ + "frame": {"x":1260,"y":591,"w":238,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":413,"w":238,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmRightCrossed.png": +{ + "frame": {"x":1744,"y":691,"w":238,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":605,"w":238,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/HandRightBoxtie.png": +{ + "frame": {"x":481,"y":1754,"w":36,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":679,"w":36,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/PetsuitTopHands.png": +{ + "frame": {"x":1260,"y":591,"w":238,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":413,"w":238,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmRightCrossed.png": +{ + "frame": {"x":1744,"y":691,"w":238,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":605,"w":238,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/PetsuitTopHands.png": +{ + "frame": {"x":1260,"y":591,"w":238,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":413,"w":238,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ForeArmLeftCrossed.png": +{ + "frame": {"x":1260,"y":490,"w":238,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":619,"w":238,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ForeArmRightCrossed.png": +{ + "frame": {"x":1528,"y":105,"w":246,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":427,"y":593,"w":246,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/Headgear.png": +{ + "frame": {"x":476,"y":1045,"w":224,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":97,"w":224,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/HeadgearEarsInner.png": +{ + "frame": {"x":1711,"y":1244,"w":215,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":507,"y":70,"w":215,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ShoeLeftKneel.png": +{ + "frame": {"x":514,"y":192,"w":249,"h":138}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":653,"y":917,"w":249,"h":138}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ShoeLeftKneelClosed.png": +{ + "frame": {"x":1257,"y":688,"w":237,"h":136}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":665,"y":919,"w":237,"h":136}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/WebbingUp.png": +{ + "frame": {"x":3,"y":410,"w":249,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":426,"w":249,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/GloveRightYoked.png": +{ + "frame": {"x":348,"y":1331,"w":97,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":300,"y":288,"w":97,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Visors/DollmakerFullRim.png": +{ + "frame": {"x":1442,"y":1582,"w":208,"h":231}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":497,"y":183,"w":208,"h":231}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/Belt.png": +{ + "frame": {"x":1489,"y":1295,"w":215,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":665,"w":215,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/AnkleRightClosed.png": +{ + "frame": {"x":1959,"y":1331,"w":85,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":1416,"w":85,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/AnkleRightSpread.png": +{ + "frame": {"x":1959,"y":1331,"w":85,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":1412,"w":85,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/BandAnkleLeftKneelClosed.png": +{ + "frame": {"x":1460,"y":1254,"w":25,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":723,"y":950,"w":25,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/BeltBandMid.png": +{ + "frame": {"x":1739,"y":780,"w":237,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":695,"w":237,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessBandUpper.png": +{ + "frame": {"x":1273,"y":346,"w":242,"h":140}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":414,"w":242,"h":140}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/HarnessUpper.png": +{ + "frame": {"x":1780,"y":3,"w":246,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":412,"w":246,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveRightFree.png": +{ + "frame": {"x":1498,"y":801,"w":236,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":267,"y":496,"w":236,"h":208}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolfgirl/EarLeft.png": +{ + "frame": {"x":1016,"y":615,"w":237,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":11,"w":237,"h":170}, + "sourceSize": {"w":347,"h":439} +}, +"Models/Wolfgirl/EarRight.png": +{ + "frame": {"x":1016,"y":615,"w":237,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":11,"w":237,"h":170}, + "sourceSize": {"w":347,"h":439} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas44.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas44.webp b/TextureAtlas/atlas44.webp new file mode 100644 index 000000000..664771693 Binary files /dev/null and b/TextureAtlas/atlas44.webp differ diff --git a/TextureAtlas/atlas45.json b/TextureAtlas/atlas45.json new file mode 100644 index 000000000..a2b1d5739 --- /dev/null +++ b/TextureAtlas/atlas45.json @@ -0,0 +1,2869 @@ +{"frames": { + +"Models/Armbinder/BinderLeftBoxtie.png": +{ + "frame": {"x":859,"y":1806,"w":92,"h":167}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":526,"w":92,"h":167}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Armbinder/StrapsLeftBoxtie.png": +{ + "frame": {"x":338,"y":1352,"w":66,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":704,"y":526,"w":66,"h":24}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/SkirtBeltRivetsKneel.png": +{ + "frame": {"x":546,"y":908,"w":137,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":471,"y":779,"w":137,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/GauntletLeftFree.png": +{ + "frame": {"x":700,"y":1149,"w":153,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":764,"y":698,"w":153,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/GauntletLeftFront.png": +{ + "frame": {"x":757,"y":1586,"w":158,"h":167}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":550,"y":464,"w":158,"h":167}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/GauntletLeftYoked.png": +{ + "frame": {"x":384,"y":230,"w":98,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":850,"y":280,"w":98,"h":193}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/GauntletRightCrossed.png": +{ + "frame": {"x":1859,"y":790,"w":95,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":609,"y":601,"w":95,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/GauntletRightFree.png": +{ + "frame": {"x":926,"y":950,"w":178,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":269,"y":537,"w":178,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/GauntletRightYoked.png": +{ + "frame": {"x":162,"y":1817,"w":96,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":300,"y":289,"w":96,"h":205}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShoeLeftKneelClosed.png": +{ + "frame": {"x":1426,"y":220,"w":168,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":729,"y":929,"w":168,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Feet1Closed.png": +{ + "frame": {"x":1085,"y":1753,"w":141,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":1359,"w":141,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/LeftArm2Boxtie.png": +{ + "frame": {"x":1859,"y":712,"w":95,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":675,"y":576,"w":95,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Legs2Kneel.png": +{ + "frame": {"x":1936,"y":1529,"w":109,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":397,"y":928,"w":109,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Blindfold/LeatherBase.png": +{ + "frame": {"x":882,"y":875,"w":201,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":254,"w":201,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Blindfold/LeatherRim.png": +{ + "frame": {"x":1089,"y":1305,"w":201,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":254,"w":201,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Blindfold/Tape.png": +{ + "frame": {"x":1598,"y":1295,"w":200,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":44,"y":147,"w":200,"h":81}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Body/ButtKneel.png": +{ + "frame": {"x":3,"y":1170,"w":149,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":627,"y":750,"w":149,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/Eyes.png": +{ + "frame": {"x":1087,"y":862,"w":160,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/FootRightHogtie.png": +{ + "frame": {"x":3,"y":1387,"w":148,"h":212}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":654,"y":801,"w":148,"h":212}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/StrapsUp.png": +{ + "frame": {"x":1582,"y":858,"w":193,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":485,"y":412,"w":193,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/Collar.png": +{ + "frame": {"x":476,"y":668,"w":111,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":569,"y":382,"w":111,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/FootSockRightKneel.png": +{ + "frame": {"x":1779,"y":741,"w":76,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":324,"y":851,"w":76,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cape/CoatHogtieFree.png": +{ + "frame": {"x":400,"y":3,"w":177,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":615,"y":418,"w":177,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ArmRightHogtie.png": +{ + "frame": {"x":1521,"y":1196,"w":49,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":433,"w":49,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ButtHogtie.png": +{ + "frame": {"x":771,"y":950,"w":151,"h":158}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":625,"y":749,"w":151,"h":158}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/FootLeftSpread.png": +{ + "frame": {"x":1096,"y":1806,"w":132,"h":160}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":1467,"w":132,"h":160}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/FootRightSpread.png": +{ + "frame": {"x":1587,"y":1585,"w":109,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":496,"y":1482,"w":109,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ForeArmRightFront.png": +{ + "frame": {"x":693,"y":3,"w":124,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":417,"y":543,"w":124,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraLock.png": +{ + "frame": {"x":1779,"y":1732,"w":118,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":556,"y":565,"w":118,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/DragonCollar.png": +{ + "frame": {"x":1970,"y":1903,"w":75,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":389,"w":75,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Corsets/BuckleCorsetBuckles.png": +{ + "frame": {"x":1785,"y":1171,"w":128,"h":118}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":664,"w":128,"h":118}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ThighLeftKneelClosed.png": +{ + "frame": {"x":1232,"y":1806,"w":184,"h":147}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":848,"w":184,"h":147}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/WristRightYoked.png": +{ + "frame": {"x":591,"y":662,"w":64,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":310,"y":394,"w":64,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ThighLeftKneel.png": +{ + "frame": {"x":1320,"y":741,"w":185,"h":114}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":848,"w":185,"h":114}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ThighLeftKneelClosed.png": +{ + "frame": {"x":1420,"y":1806,"w":184,"h":147}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":848,"w":184,"h":147}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ThighLinkSpread.png": +{ + "frame": {"x":411,"y":1556,"w":80,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":1035,"w":80,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/WristRightYoked.png": +{ + "frame": {"x":1121,"y":1535,"w":64,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":310,"y":394,"w":64,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenLeftYoked.png": +{ + "frame": {"x":763,"y":712,"w":195,"h":159}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":736,"y":388,"w":195,"h":159}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenRightUp.png": +{ + "frame": {"x":1469,"y":1092,"w":110,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":357,"w":110,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenRightYoked.png": +{ + "frame": {"x":1201,"y":1380,"w":172,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":312,"y":393,"w":172,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/ForeLongMittenLeftFront.png": +{ + "frame": {"x":1493,"y":1380,"w":122,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":637,"y":578,"w":122,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowForeLongMittenLeftFront.png": +{ + "frame": {"x":1377,"y":1380,"w":112,"h":145}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":515,"w":112,"h":145}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowLongMittenLeftBoxtie.png": +{ + "frame": {"x":1959,"y":451,"w":84,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":493,"w":84,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowLongMittenLeftCrossed.png": +{ + "frame": {"x":1614,"y":438,"w":82,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":502,"w":82,"h":106}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowLongMittenRightCrossed.png": +{ + "frame": {"x":1598,"y":654,"w":52,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":413,"y":496,"w":52,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenLeftWristtie.png": +{ + "frame": {"x":328,"y":1381,"w":79,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":550,"w":79,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenRightCrossed.png": +{ + "frame": {"x":834,"y":1380,"w":122,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":520,"w":122,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenLeftBoxtie.png": +{ + "frame": {"x":1959,"y":1950,"w":83,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":683,"y":586,"w":83,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/Collar.png": +{ + "frame": {"x":852,"y":418,"w":93,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":380,"w":93,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayBelt.png": +{ + "frame": {"x":1654,"y":654,"w":42,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":548,"y":694,"w":42,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowLeftUp.png": +{ + "frame": {"x":1477,"y":140,"w":117,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":709,"y":262,"w":117,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowRightUp.png": +{ + "frame": {"x":1901,"y":1732,"w":114,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":250,"w":114,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockThighLeftKneel.png": +{ + "frame": {"x":661,"y":1555,"w":35,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":583,"y":876,"w":35,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockThighLeftKneelClosed.png": +{ + "frame": {"x":661,"y":1555,"w":35,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":583,"y":876,"w":35,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ThighLeftKneel.png": +{ + "frame": {"x":1700,"y":3,"w":165,"h":121}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":484,"y":840,"w":165,"h":121}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberHeels/GlowBalletRightKneel.png": +{ + "frame": {"x":1568,"y":1527,"w":55,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":335,"y":870,"w":55,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenLeftWristtie.png": +{ + "frame": {"x":328,"y":1381,"w":79,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":550,"w":79,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenRightCrossed.png": +{ + "frame": {"x":834,"y":1380,"w":122,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":520,"w":122,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapForeLongMittenLeftFront.png": +{ + "frame": {"x":1869,"y":451,"w":84,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":570,"y":457,"w":84,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowForeLongMittenLeftFront.png": +{ + "frame": {"x":1377,"y":1380,"w":112,"h":145}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":515,"w":112,"h":145}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenLeftWristtie.png": +{ + "frame": {"x":328,"y":1381,"w":79,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":550,"w":79,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenRightCrossed.png": +{ + "frame": {"x":834,"y":1380,"w":122,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":520,"w":122,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenRightFree.png": +{ + "frame": {"x":962,"y":712,"w":189,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":299,"y":557,"w":189,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenLeftYoked.png": +{ + "frame": {"x":1869,"y":178,"w":84,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":869,"y":312,"w":84,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenLeftBoxtie.png": +{ + "frame": {"x":1959,"y":1950,"w":83,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":683,"y":586,"w":83,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenRightUp.png": +{ + "frame": {"x":1469,"y":1092,"w":110,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":357,"w":110,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenLeftBoxtie.png": +{ + "frame": {"x":1959,"y":451,"w":84,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":493,"w":84,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenLeftCrossed.png": +{ + "frame": {"x":1614,"y":438,"w":82,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":502,"w":82,"h":106}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenRightCrossed.png": +{ + "frame": {"x":1598,"y":654,"w":52,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":413,"y":496,"w":52,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenRightYoked.png": +{ + "frame": {"x":1426,"y":503,"w":84,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":409,"y":460,"w":84,"h":96}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/LockBraShackle.png": +{ + "frame": {"x":332,"y":472,"w":76,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":544,"y":444,"w":76,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/CollarLockBand.png": +{ + "frame": {"x":1992,"y":1607,"w":43,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":597,"y":405,"w":43,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftBoxtie.png": +{ + "frame": {"x":1959,"y":1038,"w":84,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":693,"y":570,"w":84,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoBoxtie.png": +{ + "frame": {"x":1614,"y":548,"w":82,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":596,"w":82,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftFree.png": +{ + "frame": {"x":1957,"y":153,"w":87,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":582,"w":87,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftYoked.png": +{ + "frame": {"x":1970,"y":1806,"w":75,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":760,"y":513,"w":75,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightDecoUp.png": +{ + "frame": {"x":1868,"y":1108,"w":107,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":260,"w":107,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightUp.png": +{ + "frame": {"x":1627,"y":1505,"w":113,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":260,"w":113,"h":76}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftDecoCleanClosed.png": +{ + "frame": {"x":1859,"y":979,"w":94,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":1057,"w":94,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftDecoCleanKneel.png": +{ + "frame": {"x":936,"y":64,"w":164,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":864,"w":164,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftDecoCleanKneelClosed.png": +{ + "frame": {"x":936,"y":64,"w":164,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":864,"w":164,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftDecoClosed.png": +{ + "frame": {"x":1859,"y":1013,"w":94,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":1057,"w":94,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftDecoKneel.png": +{ + "frame": {"x":1700,"y":473,"w":164,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":864,"w":164,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftDecoKneelClosed.png": +{ + "frame": {"x":1700,"y":473,"w":164,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":864,"w":164,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockBandClosed.png": +{ + "frame": {"x":912,"y":1549,"w":66,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":625,"y":1083,"w":66,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockBandSpread.png": +{ + "frame": {"x":406,"y":671,"w":66,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":663,"y":1072,"w":66,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockKneel.png": +{ + "frame": {"x":936,"y":3,"w":95,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":838,"w":95,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockKneelClosed.png": +{ + "frame": {"x":936,"y":3,"w":95,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":838,"w":95,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLinkSpread.png": +{ + "frame": {"x":691,"y":1119,"w":80,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":566,"y":1057,"w":80,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockBandClosed.png": +{ + "frame": {"x":982,"y":1549,"w":66,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":487,"y":1082,"w":66,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockBandSpread.png": +{ + "frame": {"x":1052,"y":1549,"w":65,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":1082,"w":65,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightDecoCleanYoked.png": +{ + "frame": {"x":774,"y":1554,"w":61,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":310,"y":406,"w":61,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightDecoYoked.png": +{ + "frame": {"x":510,"y":1120,"w":61,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":310,"y":406,"w":61,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightFront.png": +{ + "frame": {"x":1071,"y":1148,"w":176,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":369,"y":431,"w":176,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/Metallic.png": +{ + "frame": {"x":993,"y":472,"w":205,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":507,"y":215,"w":205,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/Muzzle.png": +{ + "frame": {"x":1877,"y":1636,"w":136,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":540,"y":302,"w":136,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/MuzzleCollar.png": +{ + "frame": {"x":495,"y":1556,"w":80,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":378,"w":80,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseForeArmRightFront.png": +{ + "frame": {"x":338,"y":1151,"w":154,"h":197}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":409,"y":523,"w":154,"h":197}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseShoulderRightUp.png": +{ + "frame": {"x":955,"y":1806,"w":137,"h":160}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":345,"w":137,"h":160}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/Glasses.png": +{ + "frame": {"x":1346,"y":428,"w":164,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":264,"w":164,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/GlassesLens.png": +{ + "frame": {"x":1320,"y":153,"w":153,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":519,"y":268,"w":153,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageCorsetStripes.png": +{ + "frame": {"x":201,"y":712,"w":191,"h":198}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":605,"w":191,"h":198}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/ElfLongBack.png": +{ + "frame": {"x":964,"y":1308,"w":121,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":439,"y":269,"w":121,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/KittyInner.png": +{ + "frame": {"x":1093,"y":1970,"w":193,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":89,"w":193,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/ShoeLeftKneel.png": +{ + "frame": {"x":1426,"y":319,"w":184,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":719,"y":920,"w":184,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/ShoeLeftSpread.png": +{ + "frame": {"x":581,"y":3,"w":108,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":642,"y":1452,"w":108,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/ShoeRightKneel.png": +{ + "frame": {"x":1346,"y":316,"w":76,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":320,"y":849,"w":76,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/SkirtBand.png": +{ + "frame": {"x":540,"y":1326,"w":108,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":639,"y":781,"w":108,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai2/BrowsSad.png": +{ + "frame": {"x":579,"y":1555,"w":37,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":247,"w":37,"h":28}, + "sourceSize": {"w":806,"h":515} +}, +"Models/EyesK2/WhitesEyes2Heart.png": +{ + "frame": {"x":384,"y":427,"w":70,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":612,"y":267,"w":70,"h":41}, + "sourceSize": {"w":753,"h":414} +}, +"Models/EyesK2/WhitesEyes2Neutral.png": +{ + "frame": {"x":537,"y":1763,"w":70,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/Eyes2Heart.png": +{ + "frame": {"x":1189,"y":1535,"w":64,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":262,"w":64,"h":46}, + "sourceSize": {"w":753,"h":414} +}, +"Models/EyesK4/Eyes2Closed.png": +{ + "frame": {"x":477,"y":1352,"w":59,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":275,"w":59,"h":24}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/Eyes2Neutral.png": +{ + "frame": {"x":1243,"y":1100,"w":70,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":264,"w":70,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/Eyes2Sly.png": +{ + "frame": {"x":681,"y":1761,"w":68,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":265,"w":68,"h":41}, + "sourceSize": {"w":759,"h":425} +}, +"Models/EyesK4/EyesClosed.png": +{ + "frame": {"x":1779,"y":946,"w":53,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":526,"y":283,"w":53,"h":23}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/EyesHeart.png": +{ + "frame": {"x":1718,"y":741,"w":57,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":520,"y":266,"w":57,"h":50}, + "sourceSize": {"w":725,"h":425} +}, +"Models/EyesK4/WhitesEyes2Closed.png": +{ + "frame": {"x":477,"y":1352,"w":59,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":275,"w":59,"h":24}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyes2Sly.png": +{ + "frame": {"x":753,"y":1761,"w":68,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":265,"w":68,"h":41}, + "sourceSize": {"w":759,"h":425} +}, +"Models/EyesK4/WhitesEyesClosed.png": +{ + "frame": {"x":1779,"y":946,"w":53,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":526,"y":283,"w":53,"h":23}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyesHeart.png": +{ + "frame": {"x":1718,"y":795,"w":57,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":520,"y":266,"w":57,"h":50}, + "sourceSize": {"w":725,"h":425} +}, +"Models/EyesKertasu/EyesWhitesAngry.png": +{ + "frame": {"x":1087,"y":862,"w":160,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesKertasu/EyesWhitesClosed.png": +{ + "frame": {"x":1087,"y":862,"w":160,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesKertasu/EyesWhitesDazed.png": +{ + "frame": {"x":1087,"y":862,"w":160,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesKertasu/EyesWhitesNeutral.png": +{ + "frame": {"x":1087,"y":862,"w":160,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesKertasu/EyesWhitesSurprised.png": +{ + "frame": {"x":1087,"y":862,"w":160,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceDask/Eyes2Closed.png": +{ + "frame": {"x":408,"y":1352,"w":65,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":152,"y":182,"w":65,"h":24}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/Eyes2Dazed.png": +{ + "frame": {"x":458,"y":427,"w":70,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":168,"w":70,"h":41}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/EyesNeutral.png": +{ + "frame": {"x":921,"y":1754,"w":160,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":52,"y":168,"w":160,"h":48}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyes2Closed.png": +{ + "frame": {"x":408,"y":1352,"w":65,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":152,"y":182,"w":65,"h":24}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyesClosed.png": +{ + "frame": {"x":1936,"y":1607,"w":52,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":55,"y":189,"w":52,"h":23}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceFangless/MouthSmile.png": +{ + "frame": {"x":746,"y":193,"w":44,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":320,"w":44,"h":33}, + "sourceSize": {"w":700,"h":436} +}, +"Models/FaceKjus/Brows2Angry.png": +{ + "frame": {"x":1320,"y":713,"w":49,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":606,"y":249,"w":49,"h":24}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceKjus/Eyes2Angry.png": +{ + "frame": {"x":611,"y":1763,"w":66,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":618,"y":265,"w":66,"h":39}, + "sourceSize": {"w":753,"h":414} +}, +"Models/FaceKoi/BlushHigh.png": +{ + "frame": {"x":1070,"y":316,"w":164,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":49,"y":188,"w":164,"h":58}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/Brows2Angry.png": +{ + "frame": {"x":636,"y":876,"w":46,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":142,"y":124,"w":46,"h":24}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/BrowsSad.png": +{ + "frame": {"x":620,"y":1555,"w":37,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":61,"y":137,"w":37,"h":28}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/Eyes2Closed.png": +{ + "frame": {"x":775,"y":1112,"w":65,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyes2Closed.png": +{ + "frame": {"x":844,"y":1112,"w":65,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyes2Closed.png": +{ + "frame": {"x":913,"y":1112,"w":65,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyes2Closed.png": +{ + "frame": {"x":913,"y":1112,"w":65,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Fiddle/BackFiddleBody.png": +{ + "frame": {"x":1917,"y":1417,"w":113,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":364,"w":113,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Fiddle/BackFiddleLines.png": +{ + "frame": {"x":1202,"y":3,"w":114,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":573,"y":363,"w":114,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagFrilly/FrillyHardware.png": +{ + "frame": {"x":1023,"y":1585,"w":131,"h":164}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":75,"y":102,"w":131,"h":164}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagFrilly/FrillyPanel.png": +{ + "frame": {"x":510,"y":950,"w":76,"h":166}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":96,"y":106,"w":76,"h":166}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLatex/NeckCorsetRim2.png": +{ + "frame": {"x":1202,"y":131,"w":114,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":562,"y":358,"w":114,"h":85}, + "sourceSize": {"w":763,"h":476} +}, +"Models/GagLatex/OTN.png": +{ + "frame": {"x":1290,"y":1957,"w":160,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLatex/OTNFlat.png": +{ + "frame": {"x":1454,"y":1957,"w":160,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/FabricMuzzle.png": +{ + "frame": {"x":1618,"y":1957,"w":160,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/Panel.png": +{ + "frame": {"x":185,"y":950,"w":137,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":39,"y":74,"w":137,"h":207}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BigBallFang.png": +{ + "frame": {"x":1521,"y":1148,"w":58,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":103,"y":233,"w":58,"h":44}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/HarnessMask.png": +{ + "frame": {"x":1514,"y":427,"w":96,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":89,"y":208,"w":96,"h":79}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/HarnessRim.png": +{ + "frame": {"x":611,"y":196,"w":131,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":75,"y":243,"w":131,"h":30}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagTape/Face.png": +{ + "frame": {"x":789,"y":472,"w":200,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":44,"y":147,"w":200,"h":146}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagTape/Stuffing.png": +{ + "frame": {"x":1444,"y":1529,"w":120,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":103,"y":225,"w":120,"h":52}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Gasmask/Mask.png": +{ + "frame": {"x":1695,"y":974,"w":160,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":64,"y":210,"w":160,"h":93}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/BobFront.png": +{ + "frame": {"x":3,"y":950,"w":178,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":515,"y":103,"w":178,"h":216}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/VentsInnerR.png": +{ + "frame": {"x":1868,"y":527,"w":69,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":529,"y":94,"w":69,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair4_FrontB.png": +{ + "frame": {"x":248,"y":239,"w":132,"h":229}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":120,"w":132,"h":229}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair5_FrontD.png": +{ + "frame": {"x":486,"y":230,"w":69,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":140,"w":69,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/HairAura_Right.png": +{ + "frame": {"x":1469,"y":603,"w":125,"h":134}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":270,"w":125,"h":134}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/Irish8AnkleRightClosed.png": +{ + "frame": {"x":700,"y":1555,"w":70,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":538,"y":1432,"w":70,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/LegironsLeftClosed.png": +{ + "frame": {"x":520,"y":197,"w":87,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":593,"y":1431,"w":87,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/LegironsLeftSpread.png": +{ + "frame": {"x":520,"y":197,"w":87,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":1431,"w":87,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/WolfCuffsFront.png": +{ + "frame": {"x":882,"y":1977,"w":207,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":526,"w":207,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/Ribbon.png": +{ + "frame": {"x":647,"y":419,"w":201,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":515,"y":112,"w":201,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/TopHatSmallBow.png": +{ + "frame": {"x":488,"y":910,"w":54,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":650,"y":123,"w":54,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletSoleLeftKneelClosed.png": +{ + "frame": {"x":1700,"y":240,"w":165,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":765,"y":906,"w":165,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletSoleRightClosed.png": +{ + "frame": {"x":919,"y":1585,"w":100,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":510,"y":1519,"w":100,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherLeftHogtie.png": +{ + "frame": {"x":1533,"y":1585,"w":50,"h":145}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":797,"w":50,"h":145}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLeftHogtie.png": +{ + "frame": {"x":1608,"y":1806,"w":50,"h":147}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":797,"w":50,"h":147}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/BeltsArmsWristtie.png": +{ + "frame": {"x":1019,"y":191,"w":55,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":686,"y":597,"w":55,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Kigu/EyesWhites.png": +{ + "frame": {"x":1087,"y":862,"w":160,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandAnkleLeftSpread.png": +{ + "frame": {"x":789,"y":622,"w":70,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":684,"y":1433,"w":70,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandThighLeftKneel.png": +{ + "frame": {"x":1700,"y":128,"w":165,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":851,"w":165,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandThighLeftKneelClosed.png": +{ + "frame": {"x":1265,"y":950,"w":157,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":851,"w":157,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandThighLeftSpread.png": +{ + "frame": {"x":1230,"y":1740,"w":141,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":1021,"w":141,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Blindfold.png": +{ + "frame": {"x":1393,"y":1295,"w":201,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":245,"w":201,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/BlindfoldSmall.png": +{ + "frame": {"x":1868,"y":375,"w":177,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":249,"w":177,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Collar.png": +{ + "frame": {"x":365,"y":1773,"w":82,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":393,"w":82,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChestCollar.png": +{ + "frame": {"x":1260,"y":378,"w":82,"h":121}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":511,"y":411,"w":82,"h":121}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChestCollarStripesLeftTied.png": +{ + "frame": {"x":1802,"y":1529,"w":130,"h":103}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":583,"y":426,"w":130,"h":103}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandThighLeftKneel.png": +{ + "frame": {"x":590,"y":950,"w":177,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":791,"w":177,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandThighRightSpread.png": +{ + "frame": {"x":201,"y":914,"w":136,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":1039,"w":136,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandWristLeftFree.png": +{ + "frame": {"x":982,"y":1107,"w":52,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":803,"y":759,"w":52,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/Collar.png": +{ + "frame": {"x":451,"y":1773,"w":82,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":393,"w":82,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ThighLeftKneel.png": +{ + "frame": {"x":496,"y":1151,"w":200,"h":171}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":458,"y":791,"w":200,"h":171}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveLeftUp.png": +{ + "frame": {"x":155,"y":1387,"w":169,"h":209}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":167,"w":169,"h":209}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockLeftPawsKneel.png": +{ + "frame": {"x":1959,"y":911,"w":84,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":788,"y":949,"w":84,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/SockLeftPawsKneelClosed.png": +{ + "frame": {"x":1957,"y":64,"w":88,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":774,"y":918,"w":88,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockLeftKneel.png": +{ + "frame": {"x":1700,"y":1071,"w":164,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":732,"y":928,"w":164,"h":96}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockLeftPawsKneel.png": +{ + "frame": {"x":1959,"y":911,"w":84,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":788,"y":949,"w":84,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockLeftPawsKneelClosed.png": +{ + "frame": {"x":1957,"y":64,"w":88,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":774,"y":918,"w":88,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockRightSpread.png": +{ + "frame": {"x":396,"y":712,"w":120,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":496,"y":1439,"w":120,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockLeftPawsKneel.png": +{ + "frame": {"x":1959,"y":911,"w":84,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":788,"y":949,"w":84,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockLeftPawsKneelClosed.png": +{ + "frame": {"x":1957,"y":64,"w":88,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":774,"y":918,"w":88,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockRightKneel.png": +{ + "frame": {"x":3,"y":1603,"w":182,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":851,"w":182,"h":210}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/SockRightKneelClosed.png": +{ + "frame": {"x":156,"y":1170,"w":178,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":323,"y":851,"w":178,"h":207}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockLeftKneelClosed.png": +{ + "frame": {"x":1574,"y":1204,"w":153,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":731,"y":903,"w":153,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockLeftPawsKneel.png": +{ + "frame": {"x":1959,"y":911,"w":84,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":788,"y":949,"w":84,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/SockLeftPawsKneelClosed.png": +{ + "frame": {"x":1957,"y":64,"w":88,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":774,"y":918,"w":88,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/LeftLegsPawsKneelClosed.png": +{ + "frame": {"x":825,"y":1757,"w":92,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":774,"y":920,"w":92,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/CoatHogtieFree.png": +{ + "frame": {"x":400,"y":3,"w":177,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":615,"y":418,"w":177,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowLeftBoxtie.png": +{ + "frame": {"x":794,"y":193,"w":79,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":693,"y":585,"w":79,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowLeftFree.png": +{ + "frame": {"x":341,"y":914,"w":82,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":594,"w":82,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowLeftBoxtie.png": +{ + "frame": {"x":1869,"y":1047,"w":84,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":690,"y":573,"w":84,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowLeftFree.png": +{ + "frame": {"x":1959,"y":3,"w":85,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":582,"w":85,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowRightUp.png": +{ + "frame": {"x":1651,"y":1732,"w":124,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":252,"w":124,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareAnkleRightClosed.png": +{ + "frame": {"x":1373,"y":713,"w":43,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":548,"y":1440,"w":43,"h":24}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareAnkleRightSpread.png": +{ + "frame": {"x":1420,"y":713,"w":42,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":502,"y":1436,"w":42,"h":24}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowLeftBoxtie.png": +{ + "frame": {"x":575,"y":1120,"w":54,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":592,"w":54,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowLeftFree.png": +{ + "frame": {"x":633,"y":1119,"w":54,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":709,"y":601,"w":54,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareThighRightKneelClosed.png": +{ + "frame": {"x":400,"y":197,"w":116,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":373,"y":850,"w":116,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareWristLeftFree.png": +{ + "frame": {"x":1093,"y":1107,"w":46,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":806,"y":757,"w":46,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareWristLeftFront.png": +{ + "frame": {"x":1038,"y":1107,"w":51,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":631,"y":552,"w":51,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ThighLeftSpread.png": +{ + "frame": {"x":863,"y":622,"w":142,"h":86}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":618,"y":1004,"w":142,"h":86}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/WristRightFront.png": +{ + "frame": {"x":1129,"y":3,"w":69,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":541,"w":69,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/RightLacesLegbinderKneelClosed.png": +{ + "frame": {"x":3,"y":479,"w":178,"h":232}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":347,"y":832,"w":178,"h":232}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/ShoeLeftKneel.png": +{ + "frame": {"x":1619,"y":1380,"w":179,"h":121}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":722,"y":923,"w":179,"h":121}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/ShoeRightSpread.png": +{ + "frame": {"x":1077,"y":1380,"w":120,"h":151}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":1493,"w":120,"h":151}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeSockLeftKneel.png": +{ + "frame": {"x":1859,"y":600,"w":184,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":857,"w":184,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeSockRightKneel.png": +{ + "frame": {"x":1859,"y":849,"w":95,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":840,"w":95,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeSockRightKneelClosed.png": +{ + "frame": {"x":1859,"y":893,"w":95,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":840,"w":95,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronPatternKneel.png": +{ + "frame": {"x":1941,"y":538,"w":104,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":772,"w":104,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronStripeKneel.png": +{ + "frame": {"x":621,"y":472,"w":164,"h":185}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":652,"w":164,"h":185}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftBoxtie.png": +{ + "frame": {"x":1957,"y":216,"w":87,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":598,"w":87,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftStripeBoxtie.png": +{ + "frame": {"x":1957,"y":119,"w":88,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":598,"w":88,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftStripeUp.png": +{ + "frame": {"x":1859,"y":937,"w":95,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":720,"y":306,"w":95,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightFront.png": +{ + "frame": {"x":630,"y":1806,"w":84,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":425,"y":543,"w":84,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightUp.png": +{ + "frame": {"x":3,"y":3,"w":149,"h":234}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":156,"w":149,"h":234}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLegLeftSpread.png": +{ + "frame": {"x":517,"y":1806,"w":109,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":644,"y":1111,"w":109,"h":178}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLegRightClosed.png": +{ + "frame": {"x":821,"y":3,"w":111,"h":184}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":1089,"w":111,"h":184}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLegRightKneel.png": +{ + "frame": {"x":559,"y":230,"w":84,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":306,"y":913,"w":84,"h":187}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLegRightKneelClosed.png": +{ + "frame": {"x":533,"y":472,"w":84,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":320,"y":905,"w":84,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ForeArmLeftFront.png": +{ + "frame": {"x":577,"y":1380,"w":134,"h":171}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":545,"w":134,"h":171}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ForeArmRightFront.png": +{ + "frame": {"x":511,"y":1587,"w":114,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":425,"y":543,"w":114,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GauntletRightFront.png": +{ + "frame": {"x":189,"y":1600,"w":172,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":439,"y":461,"w":172,"h":202}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GloveRightFront.png": +{ + "frame": {"x":1078,"y":204,"w":120,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":490,"y":462,"w":120,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronLeftYoked.png": +{ + "frame": {"x":185,"y":477,"w":143,"h":231}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":352,"w":143,"h":231}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronRightStrapsYoked.png": +{ + "frame": {"x":1106,"y":64,"w":92,"h":136}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":389,"y":444,"w":92,"h":136}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronRightYoked.png": +{ + "frame": {"x":326,"y":950,"w":180,"h":197}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":389,"y":360,"w":180,"h":197}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SideArmor.png": +{ + "frame": {"x":857,"y":1148,"w":108,"h":156}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":680,"w":108,"h":156}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/FootSockLeftHogtie.png": +{ + "frame": {"x":1252,"y":1585,"w":50,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":785,"w":50,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuff2LeftFront.png": +{ + "frame": {"x":1959,"y":779,"w":84,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":662,"y":635,"w":84,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardLeftFree.png": +{ + "frame": {"x":365,"y":1587,"w":142,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":632,"w":142,"h":182}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardRightFree.png": +{ + "frame": {"x":1375,"y":1737,"w":150,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":332,"y":648,"w":150,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/HeadbandRibbon.png": +{ + "frame": {"x":1202,"y":472,"w":54,"h":138}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":196,"w":54,"h":138}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronLeftYoked.png": +{ + "frame": {"x":1108,"y":950,"w":153,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":378,"w":153,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronStrapUp.png": +{ + "frame": {"x":1469,"y":950,"w":109,"h":138}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":410,"w":109,"h":138}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/BandLeftFree.png": +{ + "frame": {"x":877,"y":191,"w":51,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":804,"y":760,"w":51,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/BandLeftYoked.png": +{ + "frame": {"x":427,"y":910,"w":57,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":875,"y":385,"w":57,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/BandRightFront.png": +{ + "frame": {"x":980,"y":191,"w":35,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":543,"w":35,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexLeftFree.png": +{ + "frame": {"x":411,"y":1380,"w":162,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":749,"y":682,"w":162,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexRightFront.png": +{ + "frame": {"x":3,"y":1817,"w":155,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":466,"w":155,"h":205}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexRightYoked.png": +{ + "frame": {"x":156,"y":3,"w":95,"h":232}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":298,"y":298,"w":95,"h":232}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LeatherLeftFree.png": +{ + "frame": {"x":1583,"y":1091,"w":113,"h":109}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":800,"y":754,"w":113,"h":109}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LeatherRightFront.png": +{ + "frame": {"x":1700,"y":342,"w":164,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":465,"w":164,"h":127}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LeatherRightYoked.png": +{ + "frame": {"x":1662,"y":1806,"w":90,"h":141}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":298,"y":294,"w":90,"h":141}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenRightCrossed.png": +{ + "frame": {"x":718,"y":1806,"w":137,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":433,"y":515,"w":137,"h":169}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/PawLeftFront.png": +{ + "frame": {"x":1418,"y":859,"w":160,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":483,"y":500,"w":160,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Necklace/MetalChain.png": +{ + "frame": {"x":1238,"y":316,"w":104,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":575,"y":397,"w":104,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Necklace/RubyChain.png": +{ + "frame": {"x":1143,"y":1100,"w":96,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":579,"y":404,"w":96,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Necklace/RubyGem.png": +{ + "frame": {"x":932,"y":191,"w":44,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":566,"y":454,"w":44,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Necklace/SigilChain.png": +{ + "frame": {"x":1294,"y":1298,"w":95,"h":78}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":579,"y":393,"w":95,"h":78}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/KneeLeftClosed.png": +{ + "frame": {"x":636,"y":712,"w":123,"h":160}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":1151,"w":123,"h":160}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/KneeRightClosed.png": +{ + "frame": {"x":969,"y":1148,"w":98,"h":156}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":496,"y":1152,"w":98,"h":156}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SkirtBand.png": +{ + "frame": {"x":647,"y":230,"w":96,"h":185}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":759,"w":96,"h":185}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SkirtBandKneelCrotchStrap.png": +{ + "frame": {"x":1426,"y":3,"w":168,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":367,"y":759,"w":168,"h":133}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopBandRim.png": +{ + "frame": {"x":1210,"y":614,"w":110,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":574,"w":110,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopBandRimChestUp.png": +{ + "frame": {"x":3,"y":715,"w":194,"h":231}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":397,"w":194,"h":231}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveLeftBoxtie.png": +{ + "frame": {"x":262,"y":1806,"w":93,"h":183}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":502,"w":93,"h":183}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveLeftWristtie.png": +{ + "frame": {"x":3,"y":241,"w":96,"h":234}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":675,"y":509,"w":96,"h":234}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveRightUp.png": +{ + "frame": {"x":255,"y":3,"w":141,"h":223}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":163,"w":141,"h":223}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Pony/CollarTag.png": +{ + "frame": {"x":1979,"y":1099,"w":66,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":600,"y":394,"w":66,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Pony/CollarTagHogtie.png": +{ + "frame": {"x":1654,"y":709,"w":42,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":406,"w":42,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Calf1KneelClosed.png": +{ + "frame": {"x":1426,"y":950,"w":38,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":703,"y":954,"w":38,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Calf3KneelClosed.png": +{ + "frame": {"x":1614,"y":318,"w":82,"h":116}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":951,"w":82,"h":116}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Thigh2KneelClosed.png": +{ + "frame": {"x":1251,"y":1148,"w":136,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":874,"w":136,"h":146}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopCalf1KneelClosed.png": +{ + "frame": {"x":1426,"y":1004,"w":38,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":703,"y":954,"w":38,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ShoeLeftClosed.png": +{ + "frame": {"x":1509,"y":741,"w":205,"h":113}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":1517,"w":205,"h":113}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ShoeLeftKneel.png": +{ + "frame": {"x":1251,"y":859,"w":163,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":932,"w":163,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ShoeLeftKneelClosed.png": +{ + "frame": {"x":1251,"y":859,"w":163,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":932,"w":163,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ZombieTalismanBent.png": +{ + "frame": {"x":715,"y":1380,"w":115,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":606,"y":139,"w":115,"h":170}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/AnklesClosedOver.png": +{ + "frame": {"x":608,"y":1988,"w":148,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":514,"y":1517,"w":148,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf2KneelClosed.png": +{ + "frame": {"x":1379,"y":220,"w":43,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":610,"y":981,"w":43,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf2KneelClosedOver.png": +{ + "frame": {"x":1379,"y":220,"w":43,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":610,"y":981,"w":43,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf3Closed.png": +{ + "frame": {"x":659,"y":661,"w":200,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":1235,"w":200,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf3ClosedOver.png": +{ + "frame": {"x":760,"y":1318,"w":200,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":1234,"w":200,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/RightThigh2KneelClosedOver.png": +{ + "frame": {"x":1917,"y":1171,"w":128,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":365,"y":860,"w":128,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/RightThigh3KneelClosed.png": +{ + "frame": {"x":262,"y":1993,"w":140,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":399,"y":812,"w":140,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ArmRightWristtie.png": +{ + "frame": {"x":1779,"y":845,"w":76,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":429,"w":76,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/FaceMouth.png": +{ + "frame": {"x":1202,"y":220,"w":173,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":302,"w":173,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/HandRightBoxtie.png": +{ + "frame": {"x":1700,"y":1585,"w":38,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":671,"w":38,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/HandRightFree.png": +{ + "frame": {"x":1582,"y":974,"w":109,"h":113}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":268,"y":544,"w":109,"h":113}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/CollarStripeTied.png": +{ + "frame": {"x":1009,"y":619,"w":197,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":510,"y":430,"w":197,"h":89}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/SleeveLeft.png": +{ + "frame": {"x":1869,"y":1806,"w":97,"h":140}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":704,"y":410,"w":97,"h":140}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/SleeveLeftTied.png": +{ + "frame": {"x":1405,"y":1585,"w":124,"h":147}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":431,"w":124,"h":147}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/RightLegs1KneelClosed.png": +{ + "frame": {"x":1306,"y":1585,"w":95,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":405,"y":785,"w":95,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/RightLegs2Kneel.png": +{ + "frame": {"x":1756,"y":1806,"w":109,"h":140}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":370,"y":814,"w":109,"h":140}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/RightLegs2KneelClosed.png": +{ + "frame": {"x":1756,"y":1806,"w":109,"h":140}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":370,"y":814,"w":109,"h":140}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnderOverKneel.png": +{ + "frame": {"x":960,"y":1380,"w":113,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":542,"y":802,"w":113,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeCollar.png": +{ + "frame": {"x":406,"y":1992,"w":97,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":576,"y":384,"w":97,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeCollarRim.png": +{ + "frame": {"x":507,"y":1992,"w":97,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":576,"y":384,"w":97,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderLeftTied.png": +{ + "frame": {"x":1802,"y":1293,"w":111,"h":116}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":413,"w":111,"h":116}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/FaceMouth.png": +{ + "frame": {"x":1700,"y":1636,"w":173,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":302,"w":173,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/PostureCollarRim.png": +{ + "frame": {"x":1869,"y":280,"w":84,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":357,"w":84,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/ReverseBinderLeft.png": +{ + "frame": {"x":1158,"y":1585,"w":90,"h":151}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":689,"y":470,"w":90,"h":151}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/ReverseBinderRight.png": +{ + "frame": {"x":1391,"y":1148,"w":126,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":376,"w":126,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/AnkleLeftClosed.png": +{ + "frame": {"x":1959,"y":976,"w":84,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":1423,"w":84,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/AnkleLeftSpread.png": +{ + "frame": {"x":1035,"y":3,"w":90,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":668,"y":1429,"w":90,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowLeftBoxtie.png": +{ + "frame": {"x":1356,"y":1532,"w":84,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":691,"y":581,"w":84,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowLeftFront.png": +{ + "frame": {"x":1869,"y":3,"w":85,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":688,"y":595,"w":85,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowRightUp.png": +{ + "frame": {"x":760,"y":1979,"w":118,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":266,"w":118,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowRightYoked.png": +{ + "frame": {"x":1959,"y":250,"w":84,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":395,"y":504,"w":84,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimCollar.png": +{ + "frame": {"x":1598,"y":592,"w":98,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":374,"w":98,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowLeftFree.png": +{ + "frame": {"x":1257,"y":1532,"w":95,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":691,"y":592,"w":95,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimThighLeftClosed.png": +{ + "frame": {"x":1317,"y":1097,"w":148,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":579,"y":998,"w":148,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimThighRightKneel.png": +{ + "frame": {"x":1106,"y":378,"w":150,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":367,"y":812,"w":150,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimThighRightKneelClosed.png": +{ + "frame": {"x":1106,"y":378,"w":150,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":367,"y":812,"w":150,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ThighLeftKneel.png": +{ + "frame": {"x":1700,"y":600,"w":155,"h":137}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":825,"w":155,"h":137}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ThighLeftKneelClosed.png": +{ + "frame": {"x":359,"y":1806,"w":154,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":514,"y":825,"w":154,"h":182}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ThighRightKneelClosed.png": +{ + "frame": {"x":949,"y":378,"w":153,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":811,"w":153,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/bac/SuccubusClawLeftYoked.png": +{ + "frame": {"x":1320,"y":3,"w":102,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":848,"y":280,"w":102,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/FootSockRightKneel.png": +{ + "frame": {"x":903,"y":378,"w":42,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":309,"y":918,"w":42,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SockLeftClosed.png": +{ + "frame": {"x":1529,"y":1736,"w":118,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":1571,"w":118,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusClawLeftFree.png": +{ + "frame": {"x":332,"y":671,"w":70,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":838,"y":832,"w":70,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusClawLeftYoked.png": +{ + "frame": {"x":1320,"y":78,"w":102,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":846,"y":274,"w":102,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLeftHogtie.png": +{ + "frame": {"x":1744,"y":1505,"w":54,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":792,"w":54,"h":127}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/Collar.png": +{ + "frame": {"x":1782,"y":1950,"w":173,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":357,"w":173,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/HandLeftFront.png": +{ + "frame": {"x":1802,"y":1413,"w":111,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":565,"y":461,"w":111,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/HandRightYoked.png": +{ + "frame": {"x":1598,"y":3,"w":98,"h":122}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":296,"y":297,"w":98,"h":122}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/StrapCover.png": +{ + "frame": {"x":532,"y":424,"w":111,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":894,"w":111,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/HandLeftFree.png": +{ + "frame": {"x":1521,"y":510,"w":89,"h":78}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":822,"y":785,"w":89,"h":78}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/HandRightYoked.png": +{ + "frame": {"x":1598,"y":229,"w":98,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":296,"y":308,"w":98,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/RightLegsKneel.png": +{ + "frame": {"x":1260,"y":503,"w":161,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":368,"y":816,"w":161,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/HandRightYoked.png": +{ + "frame": {"x":1598,"y":129,"w":98,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":296,"y":297,"w":98,"h":96}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/StrapCover.png": +{ + "frame": {"x":532,"y":424,"w":111,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":894,"w":111,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmRightCrossed.png": +{ + "frame": {"x":520,"y":712,"w":112,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":427,"y":520,"w":112,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/HatGloriousInsignia.png": +{ + "frame": {"x":1426,"y":1058,"w":36,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":507,"y":97,"w":36,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ShoeRightKneel.png": +{ + "frame": {"x":1869,"y":57,"w":84,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":314,"y":850,"w":84,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveLeftFree.png": +{ + "frame": {"x":103,"y":241,"w":141,"h":232}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":654,"y":411,"w":141,"h":232}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/ForeArmLeftFront.png": +{ + "frame": {"x":629,"y":1587,"w":124,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":627,"y":547,"w":124,"h":170}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/GloveRightFree.png": +{ + "frame": {"x":1917,"y":1213,"w":126,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":268,"y":539,"w":126,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/Collar.png": +{ + "frame": {"x":1970,"y":1903,"w":75,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":389,"w":75,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/ShoeLeftHogtie.png": +{ + "frame": {"x":1731,"y":1171,"w":50,"h":120}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":732,"y":794,"w":50,"h":120}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/ShoeLeftKneelClosed.png": +{ + "frame": {"x":1324,"y":614,"w":141,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":752,"y":930,"w":141,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/AnkleLeftClosed.png": +{ + "frame": {"x":1959,"y":845,"w":84,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":1417,"w":84,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/AnkleLeftSpread.png": +{ + "frame": {"x":1959,"y":712,"w":84,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":1411,"w":84,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/Collar.png": +{ + "frame": {"x":1917,"y":1341,"w":126,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":565,"y":366,"w":126,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ForeGloveLeftCrossed.png": +{ + "frame": {"x":687,"y":876,"w":191,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":552,"y":629,"w":191,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimLeftClosed.png": +{ + "frame": {"x":903,"y":230,"w":163,"h":144}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":792,"w":163,"h":144}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimLeftHogtie.png": +{ + "frame": {"x":1155,"y":712,"w":161,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":792,"w":161,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimLeftKneel.png": +{ + "frame": {"x":652,"y":1326,"w":104,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":645,"y":755,"w":104,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimLeftKneelClosed.png": +{ + "frame": {"x":652,"y":1326,"w":104,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":645,"y":755,"w":104,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ShoeLeftSpread.png": +{ + "frame": {"x":412,"y":472,"w":117,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":635,"y":1451,"w":117,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ShoeRightClosed.png": +{ + "frame": {"x":747,"y":230,"w":152,"h":184}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":1451,"w":152,"h":184}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolfgirl/HairclipUpper.png": +{ + "frame": {"x":839,"y":1549,"w":69,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":159,"y":133,"w":69,"h":32}, + "sourceSize": {"w":347,"h":439} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas45.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas45.webp b/TextureAtlas/atlas45.webp new file mode 100644 index 000000000..8aae1442f Binary files /dev/null and b/TextureAtlas/atlas45.webp differ diff --git a/TextureAtlas/atlas46.json b/TextureAtlas/atlas46.json new file mode 100644 index 000000000..a905a092b --- /dev/null +++ b/TextureAtlas/atlas46.json @@ -0,0 +1,4549 @@ +{"frames": { + +"Models/ArmorChain/PantiesChainClosed.png": +{ + "frame": {"x":633,"y":100,"w":195,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":801,"w":195,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorChain/PantiesChainKneel.png": +{ + "frame": {"x":633,"y":100,"w":195,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":801,"w":195,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ArmorPlate/GauntletRightBoxtie.png": +{ + "frame": {"x":2010,"y":3,"w":35,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":676,"w":35,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ChokerHogtie.png": +{ + "frame": {"x":249,"y":1887,"w":80,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":396,"w":80,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/KneeClosed.png": +{ + "frame": {"x":930,"y":1347,"w":104,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":575,"y":1158,"w":104,"h":88}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/KneeSpread.png": +{ + "frame": {"x":1598,"y":1347,"w":108,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":641,"y":1163,"w":108,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/ShoeRightKneel.png": +{ + "frame": {"x":969,"y":1118,"w":72,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":321,"y":856,"w":72,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/WristRightFront.png": +{ + "frame": {"x":1271,"y":2004,"w":55,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":541,"w":55,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Legs2Closed.png": +{ + "frame": {"x":200,"y":210,"w":190,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":491,"y":1150,"w":190,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Blindfold/Basic.png": +{ + "frame": {"x":213,"y":134,"w":194,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":47,"y":152,"w":194,"h":72}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Blindfold/BasicRim.png": +{ + "frame": {"x":843,"y":92,"w":198,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":45,"y":148,"w":198,"h":79}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Catsuit/ArmRightWristtie.png": +{ + "frame": {"x":409,"y":1788,"w":49,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":432,"w":49,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/FootLeftKneelClosed.png": +{ + "frame": {"x":195,"y":402,"w":159,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":726,"y":903,"w":159,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/HandLeftFree.png": +{ + "frame": {"x":1932,"y":501,"w":113,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":805,"y":778,"w":113,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ShoulderRightUp.png": +{ + "frame": {"x":1484,"y":1467,"w":107,"h":109}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":397,"w":107,"h":109}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BeltLock.png": +{ + "frame": {"x":411,"y":205,"w":192,"h":134}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":705,"w":192,"h":134}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraCyberDisplay.png": +{ + "frame": {"x":628,"y":1884,"w":43,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":554,"y":553,"w":43,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProtoDisplay.png": +{ + "frame": {"x":1920,"y":1184,"w":123,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":509,"y":562,"w":123,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/Quake.png": +{ + "frame": {"x":1784,"y":1697,"w":90,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":394,"w":90,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/QuakeHogtie.png": +{ + "frame": {"x":748,"y":843,"w":80,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":394,"w":80,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/Simple.png": +{ + "frame": {"x":821,"y":1302,"w":105,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":370,"w":105,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Corsets/BuckleCorsetHardware.png": +{ + "frame": {"x":3,"y":1230,"w":104,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":524,"y":667,"w":104,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/AnkleLeftClosed.png": +{ + "frame": {"x":1185,"y":956,"w":71,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":1430,"w":71,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/AnkleLeftSpread.png": +{ + "frame": {"x":1417,"y":1697,"w":67,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":684,"y":1423,"w":67,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/AnkleRightSpread.png": +{ + "frame": {"x":1488,"y":1697,"w":67,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":1422,"w":67,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowLeftFree.png": +{ + "frame": {"x":289,"y":1580,"w":82,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":582,"w":82,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowLeftUp.png": +{ + "frame": {"x":587,"y":1048,"w":114,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":717,"y":249,"w":114,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowLeftYoked.png": +{ + "frame": {"x":759,"y":653,"w":69,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":764,"y":509,"w":69,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowRightUp.png": +{ + "frame": {"x":1045,"y":1245,"w":111,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":252,"w":111,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowRightYoked.png": +{ + "frame": {"x":1726,"y":255,"w":55,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":520,"w":55,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ThighLeftClosed.png": +{ + "frame": {"x":1045,"y":529,"w":143,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":575,"y":1031,"w":143,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ThighLeftSpread.png": +{ + "frame": {"x":603,"y":838,"w":141,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":619,"y":1004,"w":141,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ThighRightKneel.png": +{ + "frame": {"x":1045,"y":594,"w":143,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":368,"y":831,"w":143,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ThighRightKneelClosed.png": +{ + "frame": {"x":1045,"y":594,"w":143,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":368,"y":831,"w":143,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ThighRightSpread.png": +{ + "frame": {"x":1402,"y":792,"w":134,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":1020,"w":134,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/WristLeftFront.png": +{ + "frame": {"x":1813,"y":1853,"w":65,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":623,"y":543,"w":65,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/WristLeftYoked.png": +{ + "frame": {"x":1192,"y":529,"w":64,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":871,"y":386,"w":64,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/WristRightCrossed.png": +{ + "frame": {"x":2003,"y":1742,"w":42,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":650,"y":602,"w":42,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/WristRightFree.png": +{ + "frame": {"x":109,"y":1393,"w":54,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":355,"y":602,"w":54,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/AnkleRightClosed.png": +{ + "frame": {"x":1572,"y":1798,"w":75,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":540,"y":1424,"w":75,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowLeftFree.png": +{ + "frame": {"x":375,"y":1580,"w":82,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":582,"w":82,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowLeftUp.png": +{ + "frame": {"x":469,"y":1076,"w":114,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":717,"y":249,"w":114,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowLeftYoked.png": +{ + "frame": {"x":759,"y":748,"w":69,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":764,"y":509,"w":69,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowRightUp.png": +{ + "frame": {"x":1045,"y":1319,"w":111,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":252,"w":111,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowRightYoked.png": +{ + "frame": {"x":1726,"y":350,"w":55,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":520,"w":55,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ThighLeftClosed.png": +{ + "frame": {"x":1260,"y":592,"w":143,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":575,"y":1031,"w":143,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ThighLeftSpread.png": +{ + "frame": {"x":1553,"y":661,"w":141,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":619,"y":1004,"w":141,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ThighRightKneel.png": +{ + "frame": {"x":832,"y":584,"w":143,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":368,"y":831,"w":143,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ThighRightKneelClosed.png": +{ + "frame": {"x":832,"y":584,"w":143,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":368,"y":831,"w":143,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ThighRightSpread.png": +{ + "frame": {"x":1260,"y":852,"w":134,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":1020,"w":134,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/WristLeftFront.png": +{ + "frame": {"x":1774,"y":1739,"w":66,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":623,"y":542,"w":66,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/WristLeftYoked.png": +{ + "frame": {"x":1192,"y":582,"w":64,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":871,"y":386,"w":64,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/WristRightFree.png": +{ + "frame": {"x":167,"y":1393,"w":54,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":355,"y":602,"w":54,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffForeLongMittenLeftFront.png": +{ + "frame": {"x":629,"y":1727,"w":76,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":623,"y":537,"w":76,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffForeLongMittenRightFront.png": +{ + "frame": {"x":1297,"y":1788,"w":75,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":524,"w":75,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenLeftFront.png": +{ + "frame": {"x":1330,"y":1987,"w":72,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":510,"w":72,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenLeftUp.png": +{ + "frame": {"x":1371,"y":1285,"w":110,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":690,"y":360,"w":110,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/ForeLongMittenLeftCrossed.png": +{ + "frame": {"x":633,"y":3,"w":206,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":553,"y":621,"w":206,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowForeLongMittenRightFront.png": +{ + "frame": {"x":73,"y":1615,"w":56,"h":78}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":502,"w":56,"h":78}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/GlowLongMittenRightFree.png": +{ + "frame": {"x":734,"y":1557,"w":82,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":314,"y":630,"w":82,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LongMittenRightFree.png": +{ + "frame": {"x":276,"y":918,"w":116,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":372,"y":613,"w":116,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsForeLongMittenLeftCrossed.png": +{ + "frame": {"x":1406,"y":714,"w":140,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":622,"y":638,"w":140,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsForeLongMittenRightFront.png": +{ + "frame": {"x":443,"y":1343,"w":72,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":637,"w":72,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenLeftYoked.png": +{ + "frame": {"x":1895,"y":1457,"w":106,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":781,"y":526,"w":106,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenRightYoked.png": +{ + "frame": {"x":1485,"y":1333,"w":109,"h":130}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":342,"y":490,"w":109,"h":130}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/AnkleLeftClosed.png": +{ + "frame": {"x":1705,"y":1641,"w":75,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":1431,"w":75,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/AnkleLeftKneel.png": +{ + "frame": {"x":887,"y":1873,"w":72,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":955,"w":72,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/AnkleLeftSpread.png": +{ + "frame": {"x":1548,"y":1920,"w":72,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":1426,"w":72,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/AnkleRightSpread.png": +{ + "frame": {"x":1563,"y":1854,"w":72,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":1428,"w":72,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayAnkleLeftClosed.png": +{ + "frame": {"x":2002,"y":1841,"w":43,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":1440,"w":43,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayThighLeftClosed.png": +{ + "frame": {"x":997,"y":237,"w":44,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":649,"y":1040,"w":44,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayThighLeftKneel.png": +{ + "frame": {"x":1197,"y":478,"w":59,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":867,"w":59,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayThighLeftKneelClosed.png": +{ + "frame": {"x":1496,"y":1749,"w":59,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":867,"w":59,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayThighRightSpread.png": +{ + "frame": {"x":1437,"y":1473,"w":43,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":476,"y":1006,"w":43,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowLeftBoxtie.png": +{ + "frame": {"x":1295,"y":1855,"w":89,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":686,"y":568,"w":89,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowLeftFree.png": +{ + "frame": {"x":203,"y":1578,"w":82,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":579,"w":82,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowLeftWristtie.png": +{ + "frame": {"x":1335,"y":1641,"w":60,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":682,"y":604,"w":60,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowLeftYoked.png": +{ + "frame": {"x":169,"y":1144,"w":90,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":744,"y":494,"w":90,"h":82}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowRightYoked.png": +{ + "frame": {"x":395,"y":1145,"w":70,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":505,"w":70,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LinkCollar.png": +{ + "frame": {"x":263,"y":1186,"w":93,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":380,"w":93,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenAnkleLeftSpread.png": +{ + "frame": {"x":1450,"y":1920,"w":53,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":698,"y":1430,"w":53,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenAnkleRightSpread.png": +{ + "frame": {"x":1211,"y":1641,"w":54,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":496,"y":1430,"w":54,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowLeftBoxtie.png": +{ + "frame": {"x":1455,"y":1784,"w":37,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":742,"y":570,"w":37,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowLeftFree.png": +{ + "frame": {"x":1698,"y":1916,"w":37,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":752,"y":581,"w":37,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowLeftYoked.png": +{ + "frame": {"x":469,"y":1152,"w":46,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":791,"y":486,"w":46,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenThighRightClosed.png": +{ + "frame": {"x":986,"y":542,"w":55,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":1020,"w":55,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenThighRightKneel.png": +{ + "frame": {"x":1204,"y":284,"w":52,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":375,"y":814,"w":52,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenThighRightKneelClosed.png": +{ + "frame": {"x":1204,"y":284,"w":52,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":375,"y":814,"w":52,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenWristLeftFree.png": +{ + "frame": {"x":1718,"y":1979,"w":41,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":822,"y":728,"w":41,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenWristLeftFront.png": +{ + "frame": {"x":1780,"y":1914,"w":37,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":659,"y":532,"w":37,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenWristRightCrossed.png": +{ + "frame": {"x":288,"y":1749,"w":54,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":648,"y":588,"w":54,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenWristRightFront.png": +{ + "frame": {"x":525,"y":1289,"w":37,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":467,"y":530,"w":37,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ThighLeftClosed.png": +{ + "frame": {"x":1785,"y":632,"w":143,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":577,"y":1011,"w":143,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ThighLeftSpread.png": +{ + "frame": {"x":1426,"y":163,"w":156,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":607,"y":977,"w":156,"h":88}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ThighRightSpread.png": +{ + "frame": {"x":832,"y":498,"w":150,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":981,"w":150,"h":82}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/WristLeftFront.png": +{ + "frame": {"x":1305,"y":1921,"w":70,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":538,"w":70,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/WristLeftYoked.png": +{ + "frame": {"x":1639,"y":1853,"w":65,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":870,"y":385,"w":65,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/WristRightFree.png": +{ + "frame": {"x":1085,"y":1718,"w":60,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":347,"y":602,"w":60,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/WristRightFront.png": +{ + "frame": {"x":972,"y":949,"w":69,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":535,"w":69,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/WristRightYoked.png": +{ + "frame": {"x":1717,"y":507,"w":64,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":310,"y":390,"w":64,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberLink/GlowThighLinkSpreadHigh.png": +{ + "frame": {"x":229,"y":1344,"w":54,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":980,"w":54,"h":76}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ArmLongMittenRightFree.png": +{ + "frame": {"x":276,"y":918,"w":116,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":372,"y":613,"w":116,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapForeLongMittenRightFront.png": +{ + "frame": {"x":822,"y":1971,"w":75,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":449,"w":75,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapLongMittenRightBoxtie.png": +{ + "frame": {"x":1559,"y":1697,"w":49,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":677,"w":49,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffForeLongMittenLeftFront.png": +{ + "frame": {"x":629,"y":1727,"w":76,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":623,"y":537,"w":76,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffForeLongMittenRightFront.png": +{ + "frame": {"x":1297,"y":1788,"w":75,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":524,"w":75,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenLeftFree.png": +{ + "frame": {"x":1184,"y":1788,"w":56,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":803,"y":738,"w":56,"h":67}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenRightYoked.png": +{ + "frame": {"x":1708,"y":1853,"w":60,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":312,"y":393,"w":60,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ForeLongMittenLeftCrossed.png": +{ + "frame": {"x":633,"y":3,"w":206,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":553,"y":621,"w":206,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/ForeMittenLeftFront.png": +{ + "frame": {"x":268,"y":1240,"w":100,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":470,"w":100,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowForeLongMittenRightFront.png": +{ + "frame": {"x":73,"y":1615,"w":56,"h":78}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":502,"w":56,"h":78}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowLongMittenLeftYoked.png": +{ + "frame": {"x":3,"y":1615,"w":66,"h":78}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":903,"y":383,"w":66,"h":78}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowLongMittenRightFree.png": +{ + "frame": {"x":734,"y":1557,"w":82,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":314,"y":630,"w":82,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/GlowLongMittenRightYoked.png": +{ + "frame": {"x":986,"y":1788,"w":66,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":273,"y":376,"w":66,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenRightFree.png": +{ + "frame": {"x":289,"y":1920,"w":68,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":299,"y":557,"w":68,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsForeLongMittenLeftCrossed.png": +{ + "frame": {"x":1406,"y":714,"w":140,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":622,"y":638,"w":140,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsForeLongMittenRightFront.png": +{ + "frame": {"x":443,"y":1343,"w":72,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":637,"w":72,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenLeftYoked.png": +{ + "frame": {"x":1895,"y":1457,"w":106,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":781,"y":526,"w":106,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenRightYoked.png": +{ + "frame": {"x":1485,"y":1333,"w":109,"h":130}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":342,"y":490,"w":109,"h":130}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenLeftCrossed.png": +{ + "frame": {"x":1698,"y":736,"w":83,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":693,"y":510,"w":83,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenLeftFree.png": +{ + "frame": {"x":1698,"y":672,"w":83,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":496,"w":83,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenLeftFront.png": +{ + "frame": {"x":1330,"y":1987,"w":72,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":510,"w":72,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenLeftUp.png": +{ + "frame": {"x":1371,"y":1285,"w":110,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":690,"y":360,"w":110,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenLeftYoked.png": +{ + "frame": {"x":734,"y":1471,"w":82,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":736,"y":465,"w":82,"h":82}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenRightYoked.png": +{ + "frame": {"x":1204,"y":357,"w":52,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":432,"y":473,"w":52,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperGlowLongMittenLeftYoked.png": +{ + "frame": {"x":77,"y":1697,"w":82,"h":86}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":762,"y":450,"w":82,"h":86}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/DisplayLegsKneel.png": +{ + "frame": {"x":358,"y":435,"w":158,"h":138}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":371,"y":761,"w":158,"h":138}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberPetsuit/DisplayLegsKneelClosed.png": +{ + "frame": {"x":358,"y":435,"w":158,"h":138}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":371,"y":761,"w":158,"h":138}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BeltMetal2.png": +{ + "frame": {"x":684,"y":1884,"w":49,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":556,"y":829,"w":49,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BeltMetalRunic2.png": +{ + "frame": {"x":717,"y":1788,"w":49,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":556,"y":829,"w":49,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BraBase2.png": +{ + "frame": {"x":520,"y":524,"w":83,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":557,"y":440,"w":83,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BraStraps.png": +{ + "frame": {"x":196,"y":269,"w":188,"h":129}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":501,"y":407,"w":188,"h":129}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BraStrapsRunic.png": +{ + "frame": {"x":3,"y":356,"w":188,"h":129}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":501,"y":407,"w":188,"h":129}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/LockBeltHighlight.png": +{ + "frame": {"x":1269,"y":1749,"w":56,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":541,"y":816,"w":56,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/LockBeltPlate.png": +{ + "frame": {"x":1127,"y":1943,"w":68,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":538,"y":770,"w":68,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftClosed.png": +{ + "frame": {"x":1160,"y":1352,"w":93,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":1416,"w":93,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftLockPlateKneel.png": +{ + "frame": {"x":2005,"y":1505,"w":38,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":720,"y":951,"w":38,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightClosed.png": +{ + "frame": {"x":766,"y":583,"w":62,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":1415,"w":62,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightDecoSpread.png": +{ + "frame": {"x":3,"y":1580,"w":68,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":1439,"w":68,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/BeltLock.png": +{ + "frame": {"x":816,"y":1882,"w":67,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":693,"w":67,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/BeltLockBand.png": +{ + "frame": {"x":1269,"y":1749,"w":56,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":538,"y":730,"w":56,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/Collar.png": +{ + "frame": {"x":923,"y":1551,"w":93,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":362,"w":93,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/CollarLock.png": +{ + "frame": {"x":997,"y":175,"w":44,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":597,"y":380,"w":44,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoCleanBoxtie.png": +{ + "frame": {"x":492,"y":2015,"w":82,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":596,"w":82,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoCleanUp.png": +{ + "frame": {"x":1784,"y":1571,"w":106,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":721,"y":244,"w":106,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoCleanWristtie.png": +{ + "frame": {"x":1386,"y":1749,"w":51,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":629,"w":51,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoCleanYoked.png": +{ + "frame": {"x":977,"y":1955,"w":72,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":764,"y":523,"w":72,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoFront.png": +{ + "frame": {"x":734,"y":1632,"w":80,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":683,"y":603,"w":80,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoUp.png": +{ + "frame": {"x":1894,"y":1612,"w":106,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":721,"y":244,"w":106,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoWristtie.png": +{ + "frame": {"x":648,"y":1676,"w":80,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":652,"y":613,"w":80,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoYoked.png": +{ + "frame": {"x":1034,"y":1871,"w":72,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":764,"y":523,"w":72,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftFront.png": +{ + "frame": {"x":860,"y":1719,"w":89,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":586,"w":89,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftUp.png": +{ + "frame": {"x":705,"y":1138,"w":112,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":716,"y":244,"w":112,"h":76}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftWristtie.png": +{ + "frame": {"x":500,"y":1556,"w":90,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":648,"y":596,"w":90,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightDecoYoked.png": +{ + "frame": {"x":963,"y":1872,"w":67,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":391,"y":525,"w":67,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightLockUp.png": +{ + "frame": {"x":133,"y":1615,"w":41,"h":78}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":232,"w":41,"h":78}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightYoked.png": +{ + "frame": {"x":574,"y":1625,"w":70,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":393,"y":515,"w":70,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftClosed.png": +{ + "frame": {"x":1260,"y":384,"w":148,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":567,"y":1027,"w":148,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftDecoCleanSpread.png": +{ + "frame": {"x":295,"y":1424,"w":91,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":675,"y":1034,"w":91,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftDecoSpread.png": +{ + "frame": {"x":390,"y":1424,"w":91,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":675,"y":1034,"w":91,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockBandKneel.png": +{ + "frame": {"x":1441,"y":1749,"w":51,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":855,"w":51,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockBandKneelClosed.png": +{ + "frame": {"x":1441,"y":1749,"w":51,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":855,"w":51,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockClosed.png": +{ + "frame": {"x":395,"y":1046,"w":70,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":622,"y":1033,"w":70,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockPlateClosed.png": +{ + "frame": {"x":1191,"y":687,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":623,"y":1034,"w":65,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockPlateKneel.png": +{ + "frame": {"x":525,"y":1238,"w":55,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":520,"y":839,"w":55,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockPlateKneelClosed.png": +{ + "frame": {"x":525,"y":1238,"w":55,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":520,"y":839,"w":55,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockPlateSpread.png": +{ + "frame": {"x":972,"y":879,"w":69,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":654,"y":1023,"w":69,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockSpread.png": +{ + "frame": {"x":372,"y":1240,"w":79,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":653,"y":1023,"w":79,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftSpread.png": +{ + "frame": {"x":161,"y":628,"w":153,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":1011,"w":153,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockClosed.png": +{ + "frame": {"x":1710,"y":1347,"w":70,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":1033,"w":70,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockPlateClosed.png": +{ + "frame": {"x":1191,"y":754,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":490,"y":1034,"w":65,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockPlateSpread.png": +{ + "frame": {"x":500,"y":1719,"w":67,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":1031,"w":67,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockSpread.png": +{ + "frame": {"x":1182,"y":1112,"w":73,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":1031,"w":73,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightSpread.png": +{ + "frame": {"x":3,"y":690,"w":153,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":1029,"w":153,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftDecoCleanFree.png": +{ + "frame": {"x":75,"y":1580,"w":60,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":800,"y":766,"w":60,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftDecoFree.png": +{ + "frame": {"x":139,"y":1580,"w":60,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":800,"y":766,"w":60,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftFree.png": +{ + "frame": {"x":396,"y":984,"w":69,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":792,"y":748,"w":69,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftFront.png": +{ + "frame": {"x":1379,"y":1921,"w":67,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":621,"y":537,"w":67,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftLockFree.png": +{ + "frame": {"x":1507,"y":1920,"w":37,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":826,"y":724,"w":37,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightYoked.png": +{ + "frame": {"x":1192,"y":635,"w":64,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":308,"y":388,"w":64,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/Ball.png": +{ + "frame": {"x":1371,"y":1580,"w":62,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":576,"y":330,"w":62,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/MuzzleGold.png": +{ + "frame": {"x":469,"y":988,"w":114,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":572,"y":281,"w":114,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/MuzzleGoldClean.png": +{ + "frame": {"x":123,"y":1018,"w":114,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":572,"y":281,"w":114,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/MuzzleRim.png": +{ + "frame": {"x":1785,"y":246,"w":156,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":280,"w":156,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmRightWristtie.png": +{ + "frame": {"x":227,"y":1240,"w":37,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":437,"w":37,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseCollarUp.png": +{ + "frame": {"x":423,"y":3,"w":206,"h":109}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":341,"w":206,"h":109}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageCollarHardware.png": +{ + "frame": {"x":1037,"y":1469,"w":100,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":573,"y":408,"w":100,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MonocleLeft.png": +{ + "frame": {"x":743,"y":1979,"w":75,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":605,"y":264,"w":75,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MonocleLensRight.png": +{ + "frame": {"x":1717,"y":445,"w":64,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":519,"y":273,"w":64,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/ShoeLeftKneelClosed.png": +{ + "frame": {"x":603,"y":932,"w":136,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":763,"y":909,"w":136,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/ElfBack.png": +{ + "frame": {"x":1894,"y":1546,"w":106,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":274,"w":106,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/ElfFloppyFront.png": +{ + "frame": {"x":160,"y":706,"w":152,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":655,"y":266,"w":152,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/ElfFront.png": +{ + "frame": {"x":1141,"y":1486,"w":99,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":271,"w":99,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandLeftBoxtie.png": +{ + "frame": {"x":1182,"y":1009,"w":73,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":701,"y":487,"w":73,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandLeftUp.png": +{ + "frame": {"x":1257,"y":1276,"w":110,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":684,"y":350,"w":110,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandLeftWristtie.png": +{ + "frame": {"x":3,"y":1697,"w":70,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":499,"w":70,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandRightWristtie.png": +{ + "frame": {"x":584,"y":1217,"w":38,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":495,"w":38,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandRightYoked.png": +{ + "frame": {"x":830,"y":1788,"w":78,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":421,"y":466,"w":78,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/CircletGem.png": +{ + "frame": {"x":2002,"y":1893,"w":43,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":169,"w":43,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/ShoeLeftHogtie.png": +{ + "frame": {"x":991,"y":400,"w":50,"h":138}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":729,"y":794,"w":50,"h":138}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/BrowsSad.png": +{ + "frame": {"x":580,"y":1885,"w":44,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":254,"w":44,"h":26}, + "sourceSize": {"w":806,"h":515} +}, +"Models/EyesDai2/Brows2Angry.png": +{ + "frame": {"x":1329,"y":1749,"w":53,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":249,"w":53,"h":31}, + "sourceSize": {"w":703,"h":355} +}, +"Models/EyesK2/EyesAngry.png": +{ + "frame": {"x":978,"y":783,"w":63,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":269,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/EyesDazed.png": +{ + "frame": {"x":978,"y":831,"w":63,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":269,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/EyesHeart.png": +{ + "frame": {"x":1982,"y":106,"w":63,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":269,"w":63,"h":49}, + "sourceSize": {"w":725,"h":425} +}, +"Models/EyesK2/EyesSurprised.png": +{ + "frame": {"x":1982,"y":159,"w":63,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":265,"w":63,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyesHeart.png": +{ + "frame": {"x":1982,"y":212,"w":63,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":269,"w":63,"h":49}, + "sourceSize": {"w":725,"h":425} +}, +"Models/EyesK2/WhitesEyesSurprised.png": +{ + "frame": {"x":978,"y":681,"w":63,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":265,"w":63,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/Eyes2Closed.png": +{ + "frame": {"x":578,"y":2012,"w":52,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":273,"w":52,"h":32}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/Eyes2Surprised.png": +{ + "frame": {"x":519,"y":1152,"w":64,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":616,"y":258,"w":64,"h":46}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/WhitesEyes2Closed.png": +{ + "frame": {"x":578,"y":2012,"w":52,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":273,"w":52,"h":32}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/WhitesEyes2Surprised.png": +{ + "frame": {"x":559,"y":1423,"w":64,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":616,"y":258,"w":64,"h":46}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/Eyes2Surprised.png": +{ + "frame": {"x":1353,"y":1532,"w":70,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":264,"w":70,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/EyesDazed.png": +{ + "frame": {"x":1944,"y":1749,"w":54,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":54,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/EyesNeutral.png": +{ + "frame": {"x":1942,"y":1857,"w":56,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/EyesSly.png": +{ + "frame": {"x":771,"y":411,"w":57,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":270,"w":57,"h":45}, + "sourceSize": {"w":852,"h":524} +}, +"Models/EyesK4/EyesSurprised.png": +{ + "frame": {"x":1882,"y":1900,"w":56,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyes2Heart.png": +{ + "frame": {"x":485,"y":1424,"w":70,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":262,"w":70,"h":45}, + "sourceSize": {"w":753,"h":414} +}, +"Models/EyesK4/WhitesEyesNeutral.png": +{ + "frame": {"x":1942,"y":1910,"w":56,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyesSly.png": +{ + "frame": {"x":771,"y":460,"w":57,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":270,"w":57,"h":45}, + "sourceSize": {"w":852,"h":524} +}, +"Models/EyesK4/WhitesEyesSurprised.png": +{ + "frame": {"x":1882,"y":1953,"w":56,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesKertasu/EyesWhitesBase.png": +{ + "frame": {"x":607,"y":410,"w":160,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceDask/Eyes2Neutral.png": +{ + "frame": {"x":273,"y":1697,"w":70,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":160,"w":70,"h":48}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/EyesAngry.png": +{ + "frame": {"x":180,"y":1106,"w":53,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":52,"y":180,"w":53,"h":34}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/EyesHeart.png": +{ + "frame": {"x":552,"y":395,"w":51,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":53,"y":167,"w":51,"h":47}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyes2Dazed.png": +{ + "frame": {"x":732,"y":1683,"w":70,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":168,"w":70,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyes2Neutral.png": +{ + "frame": {"x":1269,"y":1697,"w":70,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":160,"w":70,"h":48}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyes2Surprised.png": +{ + "frame": {"x":1343,"y":1697,"w":70,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":160,"w":70,"h":48}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyesAngry.png": +{ + "frame": {"x":237,"y":1106,"w":53,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":52,"y":180,"w":53,"h":34}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyesHeart.png": +{ + "frame": {"x":552,"y":343,"w":51,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":53,"y":168,"w":51,"h":48}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyesNeutral.png": +{ + "frame": {"x":678,"y":1260,"w":52,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":52,"y":168,"w":52,"h":48}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyesSly.png": +{ + "frame": {"x":172,"y":1346,"w":53,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":51,"y":173,"w":53,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyesSurprised.png": +{ + "frame": {"x":678,"y":1312,"w":52,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":52,"y":168,"w":52,"h":48}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceFang/MouthDistracted.png": +{ + "frame": {"x":997,"y":294,"w":44,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":583,"y":316,"w":44,"h":49}, + "sourceSize": {"w":745,"h":474} +}, +"Models/FaceFang2/MouthDistracted.png": +{ + "frame": {"x":997,"y":347,"w":44,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":583,"y":316,"w":44,"h":49}, + "sourceSize": {"w":745,"h":474} +}, +"Models/FaceFangless/MouthDistracted.png": +{ + "frame": {"x":2002,"y":1788,"w":43,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":320,"w":43,"h":49}, + "sourceSize": {"w":745,"h":474} +}, +"Models/FaceKjus/BlushHigh.png": +{ + "frame": {"x":1260,"y":105,"w":162,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":529,"y":289,"w":162,"h":61}, + "sourceSize": {"w":858,"h":486} +}, +"Models/FaceKjus/Eyes2Neutral.png": +{ + "frame": {"x":1832,"y":2006,"w":65,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":265,"w":65,"h":39}, + "sourceSize": {"w":807,"h":551} +}, +"Models/FaceKjus/Eyes2Sly.png": +{ + "frame": {"x":1681,"y":1764,"w":58,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":619,"y":273,"w":58,"h":30}, + "sourceSize": {"w":759,"h":425} +}, +"Models/FaceKjus/WhitesEyes2Angry.png": +{ + "frame": {"x":225,"y":1424,"w":66,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":618,"y":265,"w":66,"h":39}, + "sourceSize": {"w":753,"h":414} +}, +"Models/FaceKjus/WhitesEyes2Dazed.png": +{ + "frame": {"x":519,"y":1202,"w":61,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":618,"y":272,"w":61,"h":32}, + "sourceSize": {"w":753,"h":414} +}, +"Models/FaceKjus/WhitesEyes2Sly.png": +{ + "frame": {"x":1901,"y":2015,"w":58,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":619,"y":273,"w":58,"h":30}, + "sourceSize": {"w":759,"h":425} +}, +"Models/FaceKoi/BrowsSurprised.png": +{ + "frame": {"x":209,"y":2021,"w":41,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":60,"y":144,"w":41,"h":23}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/EyesHeart.png": +{ + "frame": {"x":1559,"y":1752,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyesHeart.png": +{ + "frame": {"x":1559,"y":1752,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/Eyes2Closed.png": +{ + "frame": {"x":219,"y":1749,"w":65,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/EyesHeart.png": +{ + "frame": {"x":1559,"y":1752,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Festive/BinderFluffLeftBoxtie.png": +{ + "frame": {"x":1730,"y":1798,"w":70,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":518,"w":70,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/BinderFluffLeftWristtie.png": +{ + "frame": {"x":1301,"y":1580,"w":66,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":519,"w":66,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/FuzzMid.png": +{ + "frame": {"x":1437,"y":1580,"w":54,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":544,"y":647,"w":54,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/FuzzUnderbustOver.png": +{ + "frame": {"x":361,"y":1917,"w":66,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":549,"y":523,"w":66,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/HatBackHogtie.png": +{ + "frame": {"x":178,"y":1641,"w":91,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":432,"y":220,"w":91,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Festive/Orb.png": +{ + "frame": {"x":674,"y":1561,"w":53,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":260,"w":53,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Fiddle/FiddleLock.png": +{ + "frame": {"x":1832,"y":1944,"w":46,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":583,"w":46,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarTopClosed.png": +{ + "frame": {"x":2002,"y":1980,"w":43,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":558,"y":894,"w":43,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarTopClosedHeels.png": +{ + "frame": {"x":2002,"y":1980,"w":43,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":558,"y":894,"w":43,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarTopSpread.png": +{ + "frame": {"x":1894,"y":1749,"w":46,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":894,"w":46,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarTopSpreadHeels.png": +{ + "frame": {"x":1894,"y":1749,"w":46,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":894,"w":46,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureHarness/DisplayChest.png": +{ + "frame": {"x":2003,"y":1689,"w":42,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":559,"y":488,"w":42,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureHarness/MetalChest.png": +{ + "frame": {"x":1149,"y":1718,"w":56,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":553,"y":481,"w":56,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagCloth/OTM.png": +{ + "frame": {"x":843,"y":3,"w":205,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":54,"y":209,"w":205,"h":85}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLatex/NeckCorset2.png": +{ + "frame": {"x":276,"y":1012,"w":115,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":562,"y":354,"w":115,"h":90}, + "sourceSize": {"w":784,"h":486} +}, +"Models/GagLatex/NeckCorsetGag2.png": +{ + "frame": {"x":1411,"y":452,"w":147,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":537,"y":306,"w":147,"h":89}, + "sourceSize": {"w":784,"h":486} +}, +"Models/GagLeather/CrystalBall.png": +{ + "frame": {"x":110,"y":1346,"w":58,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":103,"y":234,"w":58,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/CrystalGagNecklaceBall.png": +{ + "frame": {"x":627,"y":1411,"w":46,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":566,"y":438,"w":46,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/GagNecklace.png": +{ + "frame": {"x":1395,"y":1113,"w":129,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":551,"y":392,"w":129,"h":82}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/GagNecklaceBall.png": +{ + "frame": {"x":1844,"y":1739,"w":46,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":566,"y":438,"w":46,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/Muzzle.png": +{ + "frame": {"x":1045,"y":379,"w":150,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":65,"y":207,"w":150,"h":87}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/HarnessMaskDisplay.png": +{ + "frame": {"x":594,"y":1561,"w":76,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":96,"y":225,"w":76,"h":60}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/OTN.png": +{ + "frame": {"x":607,"y":318,"w":160,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/OTNRivets.png": +{ + "frame": {"x":979,"y":617,"w":62,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":98,"y":216,"w":62,"h":60}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/SciFiMuzzle.png": +{ + "frame": {"x":607,"y":318,"w":160,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/SciFiMuzzle2.png": +{ + "frame": {"x":388,"y":343,"w":160,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/FrontSweptSide.png": +{ + "frame": {"x":2004,"y":1552,"w":41,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":508,"y":258,"w":41,"h":133}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair3_FrontD.png": +{ + "frame": {"x":1199,"y":2004,"w":68,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":553,"y":145,"w":68,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/LegironsLeftKneel.png": +{ + "frame": {"x":1130,"y":1788,"w":50,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":710,"y":954,"w":50,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Harness/HardwareMid.png": +{ + "frame": {"x":1536,"y":1631,"w":72,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":537,"y":648,"w":72,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hat/TopHatSmall.png": +{ + "frame": {"x":289,"y":1473,"w":99,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":635,"y":68,"w":99,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletSoleLeftKneel.png": +{ + "frame": {"x":1260,"y":3,"w":188,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":742,"y":906,"w":188,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hood/Blindfold.png": +{ + "frame": {"x":1452,"y":3,"w":188,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":248,"w":188,"h":73}, + "sourceSize": {"w":752,"h":479} +}, +"Models/Hood/Gag.png": +{ + "frame": {"x":1260,"y":170,"w":156,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":311,"w":156,"h":82}, + "sourceSize": {"w":752,"h":479} +}, +"Models/Hood/HoodCollar.png": +{ + "frame": {"x":734,"y":1218,"w":83,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":350,"w":83,"h":55}, + "sourceSize": {"w":752,"h":420} +}, +"Models/Jacket/Crotch.png": +{ + "frame": {"x":1785,"y":374,"w":143,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":796,"w":143,"h":127}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/StrapsArmsCrossed.png": +{ + "frame": {"x":1052,"y":3,"w":204,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":555,"y":586,"w":204,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Kigu/Eyes.png": +{ + "frame": {"x":1056,"y":1788,"w":70,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":249,"w":70,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyLatex/KittyLatexTail2Light.png": +{ + "frame": {"x":426,"y":1719,"w":70,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":760,"y":1328,"w":70,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/AnkleLeftKneelClosed.png": +{ + "frame": {"x":1495,"y":1580,"w":37,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":718,"y":940,"w":37,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowLeftFront.png": +{ + "frame": {"x":163,"y":1749,"w":52,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":720,"y":614,"w":52,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowLeftYoked.png": +{ + "frame": {"x":901,"y":1957,"w":72,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":765,"y":511,"w":72,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandWristLeftYoked.png": +{ + "frame": {"x":121,"y":1106,"w":55,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":873,"y":397,"w":55,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowLeftFree.png": +{ + "frame": {"x":743,"y":962,"w":84,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":588,"w":84,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowLeftFront.png": +{ + "frame": {"x":1399,"y":1641,"w":56,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":716,"y":604,"w":56,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowLeftWristtie.png": +{ + "frame": {"x":1427,"y":1532,"w":53,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":682,"y":612,"w":53,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowLeftYoked.png": +{ + "frame": {"x":249,"y":1788,"w":76,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":763,"y":504,"w":76,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowRightUp.png": +{ + "frame": {"x":519,"y":1347,"w":104,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":250,"w":104,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowRightYoked.png": +{ + "frame": {"x":772,"y":317,"w":56,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":400,"y":518,"w":56,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ThighLeftSpread.png": +{ + "frame": {"x":1407,"y":620,"w":142,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":619,"y":1007,"w":142,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ThighRightKneel.png": +{ + "frame": {"x":1533,"y":958,"w":132,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":378,"y":829,"w":132,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ThighRightKneelClosed.png": +{ + "frame": {"x":1045,"y":1064,"w":133,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":378,"y":829,"w":133,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/WristLeftFront.png": +{ + "frame": {"x":709,"y":1727,"w":70,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":542,"w":70,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/WristRightFree.png": +{ + "frame": {"x":1244,"y":1788,"w":49,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":362,"y":608,"w":49,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/WristRightFront.png": +{ + "frame": {"x":273,"y":1641,"w":67,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":545,"w":67,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Ears1InnerL.png": +{ + "frame": {"x":1209,"y":1717,"w":56,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":651,"y":117,"w":56,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Ears1InnerR.png": +{ + "frame": {"x":1388,"y":1854,"w":56,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":119,"w":56,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Ears1L.png": +{ + "frame": {"x":1209,"y":1717,"w":56,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":651,"y":117,"w":56,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Ears1R.png": +{ + "frame": {"x":415,"y":1641,"w":79,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":497,"y":113,"w":79,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Ears2InnerL.png": +{ + "frame": {"x":1182,"y":1864,"w":68,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":650,"y":110,"w":68,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/Gag.png": +{ + "frame": {"x":1045,"y":142,"w":161,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":301,"w":161,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/GagCollar.png": +{ + "frame": {"x":520,"y":446,"w":83,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":344,"w":83,"h":74}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/GagMouth.png": +{ + "frame": {"x":832,"y":175,"w":161,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":301,"w":161,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/GagMouthSeamless.png": +{ + "frame": {"x":607,"y":221,"w":161,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":301,"w":161,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/GagSeamless.png": +{ + "frame": {"x":832,"y":272,"w":161,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":301,"w":161,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChestCollarLeft.png": +{ + "frame": {"x":1785,"y":505,"w":143,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":409,"w":143,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/LeotardChestCollarStripesLeft.png": +{ + "frame": {"x":1045,"y":1130,"w":132,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":583,"y":418,"w":132,"h":111}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/AnkleLeftClosed.png": +{ + "frame": {"x":1185,"y":901,"w":71,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":1424,"w":71,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/AnkleLeftKneelClosed.png": +{ + "frame": {"x":1772,"y":1853,"w":37,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":718,"y":940,"w":37,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/AnkleRightClosed.png": +{ + "frame": {"x":1269,"y":1641,"w":62,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":537,"y":1420,"w":62,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/AnkleRightSpread.png": +{ + "frame": {"x":1612,"y":1710,"w":76,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":491,"y":1418,"w":76,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowLeftUp.png": +{ + "frame": {"x":923,"y":1517,"w":97,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":731,"y":269,"w":97,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowLeftYoked.png": +{ + "frame": {"x":1110,"y":1867,"w":68,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":770,"y":515,"w":68,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandThighRightKneel.png": +{ + "frame": {"x":3,"y":1049,"w":114,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":380,"y":791,"w":114,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandThighRightKneelClosed.png": +{ + "frame": {"x":3,"y":1049,"w":114,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":380,"y":791,"w":114,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandWristRightFront.png": +{ + "frame": {"x":680,"y":2011,"w":59,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":555,"w":59,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowLeftBoxtie.png": +{ + "frame": {"x":734,"y":1277,"w":83,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":692,"y":576,"w":83,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowLeftFree.png": +{ + "frame": {"x":743,"y":1017,"w":84,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":588,"w":84,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowLeftFront.png": +{ + "frame": {"x":1459,"y":1641,"w":56,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":716,"y":604,"w":56,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowLeftYoked.png": +{ + "frame": {"x":329,"y":1788,"w":76,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":763,"y":504,"w":76,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowRightUp.png": +{ + "frame": {"x":821,"y":1370,"w":104,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":250,"w":104,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowRightYoked.png": +{ + "frame": {"x":770,"y":1788,"w":56,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":400,"y":518,"w":56,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ThighLeftClosed.png": +{ + "frame": {"x":603,"y":765,"w":142,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":1026,"w":142,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ThighLeftSpread.png": +{ + "frame": {"x":1260,"y":657,"w":142,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":619,"y":1007,"w":142,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ThighRightKneel.png": +{ + "frame": {"x":1536,"y":892,"w":133,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":378,"y":829,"w":133,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ThighRightKneelClosed.png": +{ + "frame": {"x":1533,"y":1024,"w":132,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":378,"y":829,"w":132,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ThighRightSpread.png": +{ + "frame": {"x":1045,"y":771,"w":138,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":1018,"w":138,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/WristLeftFront.png": +{ + "frame": {"x":1227,"y":1580,"w":70,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":542,"w":70,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/WristRightFree.png": +{ + "frame": {"x":1199,"y":1937,"w":49,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":362,"y":608,"w":49,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/WristRightFront.png": +{ + "frame": {"x":344,"y":1641,"w":67,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":545,"w":67,"h":52}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/FootRightKneel.png": +{ + "frame": {"x":605,"y":1915,"w":75,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":858,"w":75,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/ForeGloveLeftCrossed.png": +{ + "frame": {"x":423,"y":116,"w":194,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":550,"y":613,"w":194,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveLeftBoxtie.png": +{ + "frame": {"x":584,"y":1260,"w":90,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":599,"w":90,"h":82}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPaws/GloveRightPawFree.png": +{ + "frame": {"x":1053,"y":1950,"w":70,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":300,"y":554,"w":70,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/FootRightKneel.png": +{ + "frame": {"x":1705,"y":1544,"w":75,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":858,"w":75,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetPawsShort/SockLeftKneelClosed.png": +{ + "frame": {"x":3,"y":869,"w":149,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":736,"y":903,"w":149,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocks/FootRightKneel.png": +{ + "frame": {"x":1705,"y":1544,"w":75,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":858,"w":75,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetSocksShort/FootRightKneel.png": +{ + "frame": {"x":1705,"y":1544,"w":75,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":858,"w":75,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/ArmsPaws.png": +{ + "frame": {"x":1644,"y":3,"w":180,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":438,"w":180,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/FootLeftHogtie.png": +{ + "frame": {"x":3,"y":1467,"w":92,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":690,"y":799,"w":92,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/FootLeftHogtiePaws.png": +{ + "frame": {"x":1254,"y":1855,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":735,"y":809,"w":37,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/FootRightKneel.png": +{ + "frame": {"x":969,"y":1016,"w":72,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":324,"y":857,"w":72,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Leash/LeashCollar.png": +{ + "frame": {"x":648,"y":1625,"w":82,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":379,"w":82,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/AnkleLeftKneelClosed.png": +{ + "frame": {"x":1628,"y":1984,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":714,"y":940,"w":41,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/AnkleLeftSpread.png": +{ + "frame": {"x":1612,"y":1657,"w":78,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":684,"y":1423,"w":78,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/AnkleRightClosed.png": +{ + "frame": {"x":1651,"y":1798,"w":75,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":536,"y":1425,"w":75,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandAnkleLeftKneel.png": +{ + "frame": {"x":1673,"y":1984,"w":41,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":714,"y":964,"w":41,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandAnkleRightClosed.png": +{ + "frame": {"x":429,"y":2016,"w":59,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":538,"y":1438,"w":59,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandAnkleRightSpread.png": +{ + "frame": {"x":289,"y":2019,"w":70,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":1433,"w":70,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowRightUp.png": +{ + "frame": {"x":3,"y":1347,"w":103,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":266,"w":103,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowRightYoked.png": +{ + "frame": {"x":1166,"y":1641,"w":41,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":406,"y":525,"w":41,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandThighLeftKneel.png": +{ + "frame": {"x":1574,"y":255,"w":148,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":860,"w":148,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandThighLeftKneelClosed.png": +{ + "frame": {"x":158,"y":782,"w":149,"h":132}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":860,"w":149,"h":132}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandThighRightKneel.png": +{ + "frame": {"x":626,"y":1226,"w":104,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":391,"y":846,"w":104,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandThighRightKneelClosed.png": +{ + "frame": {"x":929,"y":1439,"w":104,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":391,"y":846,"w":104,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandWristLeftFree.png": +{ + "frame": {"x":1536,"y":1580,"w":55,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":801,"y":756,"w":55,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandWristLeftFront.png": +{ + "frame": {"x":978,"y":734,"w":63,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":626,"y":545,"w":63,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandWristRightYoked.png": +{ + "frame": {"x":1612,"y":1764,"w":65,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":309,"y":402,"w":65,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/Collar.png": +{ + "frame": {"x":1894,"y":1675,"w":105,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":364,"w":105,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowLeftUp.png": +{ + "frame": {"x":1259,"y":1197,"w":121,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":251,"w":121,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowLeftWristtie.png": +{ + "frame": {"x":1942,"y":1963,"w":56,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":610,"w":56,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowLeftYoked.png": +{ + "frame": {"x":737,"y":1884,"w":75,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":763,"y":507,"w":75,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowRightYoked.png": +{ + "frame": {"x":772,"y":221,"w":56,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":520,"w":56,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareAnkleLeftClosed.png": +{ + "frame": {"x":333,"y":1887,"w":63,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":610,"y":1444,"w":63,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareAnkleLeftSpread.png": +{ + "frame": {"x":363,"y":2016,"w":62,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":698,"y":1435,"w":62,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowLeftUp.png": +{ + "frame": {"x":1505,"y":1278,"w":117,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":714,"y":263,"w":117,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowLeftYoked.png": +{ + "frame": {"x":1187,"y":821,"w":69,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":766,"y":515,"w":69,"h":76}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareThighRightClosed.png": +{ + "frame": {"x":734,"y":1334,"w":83,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":487,"y":1047,"w":83,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareThighRightSpread.png": +{ + "frame": {"x":1612,"y":1615,"w":89,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":1037,"w":89,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ThighLeftClosed.png": +{ + "frame": {"x":1411,"y":545,"w":147,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":572,"y":1029,"w":147,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ThighLeftKneel.png": +{ + "frame": {"x":3,"y":235,"w":189,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":847,"w":189,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ThighRightClosed.png": +{ + "frame": {"x":1505,"y":1203,"w":117,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":1030,"w":117,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ThighRightKneelClosed.png": +{ + "frame": {"x":1785,"y":723,"w":141,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":371,"y":831,"w":141,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ThighRightSpread.png": +{ + "frame": {"x":1398,"y":867,"w":134,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":1020,"w":134,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/WristLeftFront.png": +{ + "frame": {"x":1406,"y":1987,"w":68,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":623,"y":540,"w":68,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/WristRightFree.png": +{ + "frame": {"x":677,"y":1364,"w":53,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":355,"y":601,"w":53,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LeftLegsHardwareKneel.png": +{ + "frame": {"x":821,"y":1140,"w":111,"h":86}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":567,"y":970,"w":111,"h":86}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LeftLegsHardwareKneelClosed.png": +{ + "frame": {"x":821,"y":1140,"w":111,"h":86}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":567,"y":970,"w":111,"h":86}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LeftLegsLacesKneel.png": +{ + "frame": {"x":1828,"y":3,"w":178,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":536,"y":945,"w":178,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LeftLegsLacesKneelClosed.png": +{ + "frame": {"x":1828,"y":3,"w":178,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":536,"y":945,"w":178,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/Bow.png": +{ + "frame": {"x":1045,"y":991,"w":133,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":547,"y":393,"w":133,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/ShoeLeftKneelClosed.png": +{ + "frame": {"x":1566,"y":425,"w":147,"h":121}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":754,"y":923,"w":147,"h":121}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/ShoeRightClosed.png": +{ + "frame": {"x":831,"y":1002,"w":134,"h":134}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":456,"y":1490,"w":134,"h":134}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronCross.png": +{ + "frame": {"x":2010,"y":47,"w":35,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":821,"w":35,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronPattern.png": +{ + "frame": {"x":1626,"y":1277,"w":117,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":852,"w":117,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronPatternHogtie.png": +{ + "frame": {"x":500,"y":1473,"w":90,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":407,"y":822,"w":90,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmLeftStripeWristtie.png": +{ + "frame": {"x":1000,"y":1685,"w":68,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":683,"y":620,"w":68,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightFree.png": +{ + "frame": {"x":3,"y":489,"w":155,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":351,"y":603,"w":155,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ChestArmor.png": +{ + "frame": {"x":320,"y":577,"w":153,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":508,"y":453,"w":153,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/FootSockRightKneel.png": +{ + "frame": {"x":1932,"y":393,"w":113,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":318,"y":852,"w":113,"h":104}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GloveLeftFront.png": +{ + "frame": {"x":1785,"y":868,"w":134,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":465,"w":134,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GloveRightFree.png": +{ + "frame": {"x":1930,"y":776,"w":115,"h":122}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":267,"y":537,"w":115,"h":122}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronLeftHardware.png": +{ + "frame": {"x":1027,"y":1719,"w":54,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":670,"y":466,"w":54,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronLeftHardwareYoked.png": +{ + "frame": {"x":1448,"y":1854,"w":54,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":687,"y":467,"w":54,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronLeftStrapsUp.png": +{ + "frame": {"x":1688,"y":798,"w":93,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":666,"y":375,"w":93,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/PauldronRightStrapsUp.png": +{ + "frame": {"x":469,"y":803,"w":130,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":364,"w":130,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveRightFree.png": +{ + "frame": {"x":936,"y":1217,"w":105,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":423,"w":105,"h":126}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SleeveRightWristtie.png": +{ + "frame": {"x":1663,"y":1148,"w":117,"h":125}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":421,"w":117,"h":125}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/Flower.png": +{ + "frame": {"x":1260,"y":751,"w":138,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":658,"w":138,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/FootBootLeftHogtie.png": +{ + "frame": {"x":1923,"y":902,"w":122,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":715,"y":765,"w":122,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GloveRightBoxtie.png": +{ + "frame": {"x":587,"y":1175,"w":36,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":678,"w":36,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GloveRightYoked.png": +{ + "frame": {"x":1945,"y":265,"w":100,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":298,"y":286,"w":100,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuff2LeftYoked.png": +{ + "frame": {"x":1694,"y":1706,"w":76,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":833,"y":480,"w":76,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuff2RightCrossed.png": +{ + "frame": {"x":1395,"y":1079,"w":131,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":497,"y":667,"w":131,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuff2RightYoked.png": +{ + "frame": {"x":748,"y":909,"w":80,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":320,"y":489,"w":80,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffLeftFront.png": +{ + "frame": {"x":1763,"y":1977,"w":65,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":628,"y":553,"w":65,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffRightFree.png": +{ + "frame": {"x":1252,"y":1937,"w":49,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":357,"y":604,"w":49,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronLeftUp.png": +{ + "frame": {"x":106,"y":1920,"w":99,"h":118}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":705,"y":452,"w":99,"h":118}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronStrap.png": +{ + "frame": {"x":502,"y":1917,"w":54,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":463,"w":54,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronStrapCrossed.png": +{ + "frame": {"x":502,"y":1917,"w":54,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":463,"w":54,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronStrapWristtie.png": +{ + "frame": {"x":502,"y":1917,"w":54,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":463,"w":54,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexRightCrossed.png": +{ + "frame": {"x":1785,"y":789,"w":140,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":593,"w":140,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LeatherRightFree.png": +{ + "frame": {"x":477,"y":601,"w":125,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":276,"y":551,"w":125,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/PawRightFront.png": +{ + "frame": {"x":1623,"y":144,"w":158,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":520,"y":487,"w":158,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Necklace/RubyRing.png": +{ + "frame": {"x":1199,"y":429,"w":57,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":559,"y":452,"w":57,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Necklace/SigilDisc.png": +{ + "frame": {"x":2002,"y":1937,"w":43,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":458,"w":43,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/KneeLeftKneel.png": +{ + "frame": {"x":1045,"y":239,"w":155,"h":136}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":384,"y":952,"w":155,"h":136}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/KneeLeftKneelClosed.png": +{ + "frame": {"x":1045,"y":239,"w":155,"h":136}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":384,"y":952,"w":155,"h":136}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ShoeLeftClosed.png": +{ + "frame": {"x":474,"y":722,"w":125,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":1558,"w":125,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ShoeLeftSpread.png": +{ + "frame": {"x":1598,"y":1438,"w":108,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":643,"y":1563,"w":108,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ShoeRightClosed.png": +{ + "frame": {"x":1030,"y":1513,"w":97,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":1561,"w":97,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ShoeRightKneel.png": +{ + "frame": {"x":1506,"y":1854,"w":53,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":313,"y":882,"w":53,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ShoeRightSpread.png": +{ + "frame": {"x":1669,"y":1061,"w":112,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":1563,"w":112,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Pointy/Ahoge.png": +{ + "frame": {"x":1550,"y":755,"w":134,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":196,"y":35,"w":134,"h":133}, + "sourceSize": {"w":855,"h":1076} +}, +"Models/Pony/Collar.png": +{ + "frame": {"x":916,"y":1685,"w":80,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":394,"w":80,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/BowCrotch.png": +{ + "frame": {"x":1920,"y":1243,"w":122,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":791,"w":122,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/BowFront.png": +{ + "frame": {"x":1785,"y":979,"w":132,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":515,"y":540,"w":132,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/FeetClosed.png": +{ + "frame": {"x":1574,"y":356,"w":148,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":1513,"w":148,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/RightThigh1KneelClosed.png": +{ + "frame": {"x":820,"y":1446,"w":102,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":335,"y":911,"w":102,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Thigh1Closed.png": +{ + "frame": {"x":213,"y":3,"w":206,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":1012,"w":206,"h":127}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/ToeClosed.png": +{ + "frame": {"x":467,"y":1887,"w":53,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":519,"y":1571,"w":53,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopBowCrotch.png": +{ + "frame": {"x":1784,"y":1245,"w":122,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":791,"w":122,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopBowWristtie.png": +{ + "frame": {"x":1259,"y":1065,"w":132,"h":128}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":515,"y":540,"w":132,"h":128}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopCalf1Closed.png": +{ + "frame": {"x":3,"y":3,"w":206,"h":139}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":542,"y":1318,"w":206,"h":139}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopFeetClosed.png": +{ + "frame": {"x":1414,"y":383,"w":148,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":513,"y":1513,"w":148,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopThigh1KneelClosed.png": +{ + "frame": {"x":1260,"y":927,"w":133,"h":134}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":412,"y":882,"w":133,"h":134}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopToeClosed.png": +{ + "frame": {"x":524,"y":1885,"w":52,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":520,"y":1571,"w":52,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ShoeRightKneel.png": +{ + "frame": {"x":1710,"y":1446,"w":70,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":323,"y":856,"w":70,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/AnklesClosed.png": +{ + "frame": {"x":1045,"y":470,"w":148,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":514,"y":1519,"w":148,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/ArmStrapHarnessCrossed.png": +{ + "frame": {"x":462,"y":1788,"w":41,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":559,"y":572,"w":41,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/RightFrogtieKneel.png": +{ + "frame": {"x":705,"y":1072,"w":114,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":816,"w":114,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/RightFrogtieKneelClosed.png": +{ + "frame": {"x":705,"y":1072,"w":114,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":816,"w":114,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/RightThigh1KneelClosed.png": +{ + "frame": {"x":1784,"y":1384,"w":107,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":332,"y":908,"w":107,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/RightThigh1KneelClosedOver.png": +{ + "frame": {"x":1784,"y":1439,"w":107,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":332,"y":908,"w":107,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/RightThigh2KneelClosed.png": +{ + "frame": {"x":1921,"y":1041,"w":124,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":365,"y":861,"w":124,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh1KneelClosed.png": +{ + "frame": {"x":156,"y":918,"w":116,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":402,"y":922,"w":116,"h":96}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh1KneelClosedOver.png": +{ + "frame": {"x":627,"y":1461,"w":103,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":415,"y":922,"w":103,"h":96}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/FootLeftHogtie.png": +{ + "frame": {"x":111,"y":1230,"w":54,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":727,"y":802,"w":54,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/FootLeftKneelClosed.png": +{ + "frame": {"x":3,"y":597,"w":154,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":729,"y":902,"w":154,"h":89}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/FootRightKneel.png": +{ + "frame": {"x":1709,"y":568,"w":72,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":325,"y":854,"w":72,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/HandLeftYoked.png": +{ + "frame": {"x":57,"y":1788,"w":92,"h":128}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":857,"y":278,"w":92,"h":128}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/Bust.png": +{ + "frame": {"x":571,"y":1719,"w":54,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":566,"y":458,"w":54,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/BustStripe.png": +{ + "frame": {"x":627,"y":1346,"w":46,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":567,"y":462,"w":46,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/HemLeftTied.png": +{ + "frame": {"x":926,"y":1473,"w":100,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":556,"w":100,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/SleeveRightYoked.png": +{ + "frame": {"x":663,"y":1788,"w":50,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":434,"w":50,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderRightTied.png": +{ + "frame": {"x":1910,"y":1382,"w":121,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":417,"w":121,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ArmRightWristtie.png": +{ + "frame": {"x":209,"y":1920,"w":76,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":429,"w":76,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/FootLeftHogtie.png": +{ + "frame": {"x":169,"y":1230,"w":54,"h":112}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":727,"y":802,"w":54,"h":112}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/FootLeftKneelClosed.png": +{ + "frame": {"x":318,"y":693,"w":152,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":730,"y":902,"w":152,"h":83}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/FootRightKneel.png": +{ + "frame": {"x":1709,"y":568,"w":72,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":325,"y":854,"w":72,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/HandLeftFree.png": +{ + "frame": {"x":1932,"y":654,"w":112,"h":118}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":806,"y":743,"w":112,"h":118}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/HandLeftYoked.png": +{ + "frame": {"x":153,"y":1788,"w":92,"h":128}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":857,"y":278,"w":92,"h":128}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/HandRightBoxtie.png": +{ + "frame": {"x":2005,"y":1457,"w":38,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":671,"w":38,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/HandRightYoked.png": +{ + "frame": {"x":820,"y":1588,"w":92,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":299,"y":287,"w":92,"h":127}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/BeltRadial.png": +{ + "frame": {"x":3,"y":1788,"w":50,"h":130}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":546,"y":729,"w":50,"h":130}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/BraPadlock.png": +{ + "frame": {"x":1210,"y":142,"w":46,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":552,"y":556,"w":46,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/AnkleLeftKneel.png": +{ + "frame": {"x":498,"y":1625,"w":72,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":693,"y":914,"w":72,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/AnkleLeftKneelClosed.png": +{ + "frame": {"x":806,"y":1719,"w":50,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":715,"y":939,"w":50,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/AnkleRightClosed.png": +{ + "frame": {"x":1873,"y":1789,"w":65,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":1423,"w":65,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowLeftUp.png": +{ + "frame": {"x":1384,"y":1199,"w":117,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":282,"w":117,"h":82}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowLeftWristtie.png": +{ + "frame": {"x":1882,"y":1846,"w":56,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":619,"w":56,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowLeftYoked.png": +{ + "frame": {"x":294,"y":1106,"w":97,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":742,"y":498,"w":97,"h":76}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowRightFront.png": +{ + "frame": {"x":1146,"y":1424,"w":100,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":603,"w":100,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimAnkleLeftClosed.png": +{ + "frame": {"x":1496,"y":1800,"w":72,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":595,"y":1430,"w":72,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimAnkleLeftKneelClosed.png": +{ + "frame": {"x":1210,"y":217,"w":46,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":717,"y":940,"w":46,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowLeftFront.png": +{ + "frame": {"x":1072,"y":1661,"w":90,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":591,"w":90,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowLeftWristtie.png": +{ + "frame": {"x":916,"y":1620,"w":92,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":641,"y":607,"w":92,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowLeftYoked.png": +{ + "frame": {"x":1160,"y":1275,"w":93,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":744,"y":499,"w":93,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowRightYoked.png": +{ + "frame": {"x":734,"y":1376,"w":82,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":396,"y":506,"w":82,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimThighLeftKneel.png": +{ + "frame": {"x":1397,"y":942,"w":132,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":826,"w":132,"h":133}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimWristLeftFree.png": +{ + "frame": {"x":1804,"y":1798,"w":65,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":799,"y":755,"w":65,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimWristLeftFront.png": +{ + "frame": {"x":1181,"y":1213,"w":73,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":618,"y":540,"w":73,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimWristRightCrossed.png": +{ + "frame": {"x":1739,"y":1915,"w":37,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":635,"y":597,"w":37,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimWristRightFree.png": +{ + "frame": {"x":287,"y":1347,"w":49,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":346,"y":597,"w":49,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimWristRightFront.png": +{ + "frame": {"x":1353,"y":1473,"w":72,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":471,"y":540,"w":72,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ThighRightClosed.png": +{ + "frame": {"x":469,"y":915,"w":130,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":973,"w":130,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ThighRightSpread.png": +{ + "frame": {"x":1452,"y":80,"w":167,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":973,"w":167,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/WristLeftFront.png": +{ + "frame": {"x":1549,"y":1985,"w":75,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":617,"y":539,"w":75,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/WristLeftYoked.png": +{ + "frame": {"x":627,"y":1175,"w":73,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":864,"y":389,"w":73,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/bac/SuccubusClawLeftFront.png": +{ + "frame": {"x":1784,"y":1634,"w":106,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":463,"w":106,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/FootSockLeftHogtie.png": +{ + "frame": {"x":953,"y":1719,"w":70,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":785,"w":70,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SockLeftKneel.png": +{ + "frame": {"x":1376,"y":1788,"w":75,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":831,"y":959,"w":75,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SockLeftSpread.png": +{ + "frame": {"x":3,"y":1393,"w":102,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":640,"y":1572,"w":102,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SockRightClosed.png": +{ + "frame": {"x":1932,"y":590,"w":113,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":1566,"w":113,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SockRightSpread.png": +{ + "frame": {"x":1038,"y":1393,"w":104,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":1571,"w":104,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusClawRightYoked.png": +{ + "frame": {"x":340,"y":1343,"w":99,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":304,"y":282,"w":99,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusHornLeft.png": +{ + "frame": {"x":1371,"y":1351,"w":109,"h":118}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":639,"y":85,"w":109,"h":118}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusTailLight.png": +{ + "frame": {"x":1257,"y":1365,"w":108,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":899,"y":571,"w":108,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallRightKneel.png": +{ + "frame": {"x":99,"y":1467,"w":91,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":302,"y":828,"w":91,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmFullRightWristtie.png": +{ + "frame": {"x":912,"y":1788,"w":70,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":429,"w":70,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmLeftCrossed.png": +{ + "frame": {"x":1644,"y":79,"w":172,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":629,"w":172,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/HandLeftFree.png": +{ + "frame": {"x":392,"y":1473,"w":104,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":812,"y":768,"w":104,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/HandLeftYoked.png": +{ + "frame": {"x":3,"y":1922,"w":99,"h":121}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":853,"y":287,"w":99,"h":121}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/AnklesClosed.png": +{ + "frame": {"x":1530,"y":1090,"w":129,"h":109}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":1376,"w":129,"h":109}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmLeftCrossed.png": +{ + "frame": {"x":1644,"y":79,"w":172,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":629,"w":172,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmStrapLeftWristtie.png": +{ + "frame": {"x":821,"y":1230,"w":105,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":438,"w":105,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmStrapRightBoxtie.png": +{ + "frame": {"x":347,"y":1719,"w":75,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":442,"w":75,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmStrapRightWristtie.png": +{ + "frame": {"x":1478,"y":1986,"w":67,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":442,"w":67,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/HandLeftFront.png": +{ + "frame": {"x":1784,"y":1485,"w":106,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":565,"y":471,"w":106,"h":82}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/HandLeftYoked.png": +{ + "frame": {"x":1250,"y":1467,"w":99,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":853,"y":298,"w":99,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmFullRightWristtie.png": +{ + "frame": {"x":912,"y":1788,"w":70,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":429,"w":70,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmLeftCrossed.png": +{ + "frame": {"x":1644,"y":79,"w":172,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":629,"w":172,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmStrapLeftWristtie.png": +{ + "frame": {"x":821,"y":1230,"w":105,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":438,"w":105,"h":68}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmStrapRightBoxtie.png": +{ + "frame": {"x":347,"y":1719,"w":75,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":442,"w":75,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmStrapRightWristtie.png": +{ + "frame": {"x":1478,"y":1986,"w":67,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":442,"w":67,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/FeetKneel.png": +{ + "frame": {"x":1624,"y":1919,"w":70,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":770,"y":922,"w":70,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/HandLeftFront.png": +{ + "frame": {"x":1595,"y":1519,"w":106,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":565,"y":461,"w":106,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/HandLeftYoked.png": +{ + "frame": {"x":820,"y":1488,"w":99,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":853,"y":287,"w":99,"h":96}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/HandRightFree.png": +{ + "frame": {"x":194,"y":1467,"w":91,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":266,"y":546,"w":91,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/BeltPouch.png": +{ + "frame": {"x":1131,"y":1555,"w":92,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":611,"y":589,"w":92,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/BeltPouchRim.png": +{ + "frame": {"x":1020,"y":1585,"w":92,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":611,"y":589,"w":92,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/FootSockRightKneel.png": +{ + "frame": {"x":431,"y":1917,"w":67,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":326,"y":857,"w":67,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/HatRim.png": +{ + "frame": {"x":1260,"y":449,"w":147,"h":139}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":60,"w":147,"h":139}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/WebbingUnderbustHardware.png": +{ + "frame": {"x":634,"y":2011,"w":42,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":543,"y":614,"w":42,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/ForeGloveRightFront.png": +{ + "frame": {"x":3,"y":754,"w":151,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":463,"w":151,"h":111}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Visors/Dollmaker.png": +{ + "frame": {"x":3,"y":146,"w":193,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":506,"y":250,"w":193,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BandGloveLeftYoked.png": +{ + "frame": {"x":1821,"y":1910,"w":57,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":877,"y":389,"w":57,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ForeGloveLeftFront.png": +{ + "frame": {"x":832,"y":869,"w":136,"h":129}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":548,"y":465,"w":136,"h":129}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ForeGloveRightFront.png": +{ + "frame": {"x":1673,"y":925,"w":108,"h":132}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":460,"w":108,"h":132}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/GloveLeftFree.png": +{ + "frame": {"x":1785,"y":1118,"w":131,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":787,"y":741,"w":131,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/GloveRightFree.png": +{ + "frame": {"x":1045,"y":852,"w":136,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":267,"y":537,"w":136,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/NecklaceCharm.png": +{ + "frame": {"x":560,"y":1915,"w":41,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":407,"w":41,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/RimForeGloveRightFront.png": +{ + "frame": {"x":396,"y":918,"w":69,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":528,"w":69,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/RimGloveRightFree.png": +{ + "frame": {"x":766,"y":509,"w":62,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":338,"y":599,"w":62,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/RimGloveRightYoked.png": +{ + "frame": {"x":1942,"y":1802,"w":56,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":314,"y":392,"w":56,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/ShoeLeftSpread.png": +{ + "frame": {"x":3,"y":953,"w":116,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":635,"y":1544,"w":116,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/ShoeRightClosed.png": +{ + "frame": {"x":1921,"y":1096,"w":123,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":1535,"w":123,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/ShoeRightKneel.png": +{ + "frame": {"x":507,"y":1788,"w":72,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":857,"w":72,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtRuffleKneel.png": +{ + "frame": {"x":832,"y":369,"w":155,"h":125}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":954,"w":155,"h":125}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtRuffleOverKneel.png": +{ + "frame": {"x":607,"y":498,"w":155,"h":125}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":587,"y":954,"w":155,"h":125}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/AnkleLeftKneel.png": +{ + "frame": {"x":583,"y":1788,"w":76,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":695,"y":946,"w":76,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/BandAnkleLeftSpread.png": +{ + "frame": {"x":400,"y":1887,"w":63,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":687,"y":1435,"w":63,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/CollarBand.png": +{ + "frame": {"x":587,"y":1124,"w":114,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":382,"w":114,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/BandGloveLeftYoked.png": +{ + "frame": {"x":1821,"y":1910,"w":57,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":877,"y":389,"w":57,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandLeftClosed.png": +{ + "frame": {"x":1420,"y":255,"w":150,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":802,"w":150,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandLeftHogtie.png": +{ + "frame": {"x":1260,"y":256,"w":150,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":802,"w":150,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandLeftSpread.png": +{ + "frame": {"x":1045,"y":659,"w":142,"h":108}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":605,"y":802,"w":142,"h":108}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandRightClosed.png": +{ + "frame": {"x":832,"y":649,"w":142,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":819,"w":142,"h":106}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandRightHogtie.png": +{ + "frame": {"x":832,"y":759,"w":142,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":819,"w":142,"h":106}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandRightKneel.png": +{ + "frame": {"x":3,"y":1145,"w":79,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":770,"w":79,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandRightKneelClosed.png": +{ + "frame": {"x":86,"y":1145,"w":79,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":770,"w":79,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandRightSpread.png": +{ + "frame": {"x":1562,"y":550,"w":143,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":819,"w":143,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimLeftSpread.png": +{ + "frame": {"x":162,"y":489,"w":154,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":597,"y":792,"w":154,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimRightClosed.png": +{ + "frame": {"x":606,"y":627,"w":149,"h":134}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":805,"w":149,"h":134}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimRightHogtie.png": +{ + "frame": {"x":316,"y":780,"w":149,"h":134}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":805,"w":149,"h":134}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimRightSpread.png": +{ + "frame": {"x":1820,"y":106,"w":158,"h":136}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":803,"w":158,"h":136}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/RimForeGloveRightFront.png": +{ + "frame": {"x":396,"y":918,"w":69,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":528,"w":69,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/RimGloveRightFree.png": +{ + "frame": {"x":766,"y":509,"w":62,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":338,"y":599,"w":62,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/RimGloveRightYoked.png": +{ + "frame": {"x":1942,"y":1802,"w":56,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":314,"y":392,"w":56,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ShoeRightKneel.png": +{ + "frame": {"x":455,"y":1240,"w":66,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":324,"y":853,"w":66,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas46.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas46.webp b/TextureAtlas/atlas46.webp new file mode 100644 index 000000000..ea14f9c44 Binary files /dev/null and b/TextureAtlas/atlas46.webp differ diff --git a/TextureAtlas/atlas47.json b/TextureAtlas/atlas47.json new file mode 100644 index 000000000..d19776597 --- /dev/null +++ b/TextureAtlas/atlas47.json @@ -0,0 +1,1509 @@ +{"frames": { + +"Models/Bandit/WristLeftFree.png": +{ + "frame": {"x":971,"y":3,"w":49,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":808,"y":765,"w":49,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/WristLeftFront.png": +{ + "frame": {"x":794,"y":46,"w":58,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":622,"y":543,"w":58,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/WristLeftYoked.png": +{ + "frame": {"x":541,"y":3,"w":49,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":879,"y":393,"w":49,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bubble/Gag.png": +{ + "frame": {"x":487,"y":3,"w":50,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":234,"w":50,"h":38}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Chastity/ProtoDisplay.png": +{ + "frame": {"x":739,"y":376,"w":65,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":812,"w":65,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/AnkleLeftClosed.png": +{ + "frame": {"x":206,"y":423,"w":71,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":1430,"w":71,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/AnkleLeftSpread.png": +{ + "frame": {"x":457,"y":375,"w":67,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":684,"y":1423,"w":67,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/AnkleRightSpread.png": +{ + "frame": {"x":528,"y":375,"w":67,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":1422,"w":67,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/WristRightCrossed.png": +{ + "frame": {"x":120,"y":124,"w":42,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":650,"y":602,"w":42,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenLeftWristtie.png": +{ + "frame": {"x":3,"y":124,"w":56,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":533,"w":56,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayAnkleLeftSpread.png": +{ + "frame": {"x":71,"y":312,"w":41,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":704,"y":1437,"w":41,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayAnkleRightSpread.png": +{ + "frame": {"x":3,"y":411,"w":41,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":1437,"w":41,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowRightYoked.png": +{ + "frame": {"x":166,"y":127,"w":41,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":396,"y":502,"w":41,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberLink/ThighLinkSpreadHigh.png": +{ + "frame": {"x":320,"y":88,"w":44,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":573,"y":1012,"w":44,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenLeftWristtie.png": +{ + "frame": {"x":3,"y":124,"w":56,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":533,"w":56,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftLockPlateClosed.png": +{ + "frame": {"x":214,"y":3,"w":38,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":649,"y":1431,"w":38,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoCleanFront.png": +{ + "frame": {"x":432,"y":3,"w":51,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":612,"w":51,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftDecoCleanFront.png": +{ + "frame": {"x":666,"y":46,"w":60,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":628,"y":549,"w":60,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftDecoFront.png": +{ + "frame": {"x":730,"y":46,"w":60,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":628,"y":549,"w":60,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftYoked.png": +{ + "frame": {"x":599,"y":375,"w":66,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":870,"y":388,"w":66,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightCrossed.png": +{ + "frame": {"x":703,"y":182,"w":51,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":644,"y":601,"w":51,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandRightFront.png": +{ + "frame": {"x":552,"y":46,"w":44,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":494,"w":44,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/Brows2Angry.png": +{ + "frame": {"x":727,"y":3,"w":59,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":241,"w":59,"h":39}, + "sourceSize": {"w":703,"h":355} +}, +"Models/EyesK2/Eyes2Sly.png": +{ + "frame": {"x":961,"y":183,"w":60,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":621,"y":261,"w":60,"h":44}, + "sourceSize": {"w":759,"h":425} +}, +"Models/EyesK2/Eyes2Surprised.png": +{ + "frame": {"x":525,"y":90,"w":69,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":262,"w":69,"h":42}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/EyesNeutral.png": +{ + "frame": {"x":539,"y":229,"w":62,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":269,"w":62,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/EyesSly.png": +{ + "frame": {"x":813,"y":90,"w":65,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":515,"y":272,"w":65,"h":42}, + "sourceSize": {"w":852,"h":524} +}, +"Models/EyesK2/WhitesEyes2Sly.png": +{ + "frame": {"x":935,"y":231,"w":60,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":621,"y":261,"w":60,"h":44}, + "sourceSize": {"w":759,"h":425} +}, +"Models/EyesK2/WhitesEyes2Surprised.png": +{ + "frame": {"x":598,"y":90,"w":69,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":262,"w":69,"h":42}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyesAngry.png": +{ + "frame": {"x":271,"y":225,"w":63,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":269,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyesDazed.png": +{ + "frame": {"x":338,"y":225,"w":63,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":269,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyesNeutral.png": +{ + "frame": {"x":605,"y":229,"w":62,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":269,"w":62,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyesSly.png": +{ + "frame": {"x":882,"y":90,"w":65,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":515,"y":272,"w":65,"h":42}, + "sourceSize": {"w":852,"h":524} +}, +"Models/EyesK3/Eyes2Angry.png": +{ + "frame": {"x":405,"y":226,"w":63,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":617,"y":260,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/Eyes2Sly.png": +{ + "frame": {"x":215,"y":224,"w":52,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":263,"w":52,"h":44}, + "sourceSize": {"w":759,"h":425} +}, +"Models/EyesK3/EyesSly.png": +{ + "frame": {"x":182,"y":272,"w":52,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":272,"w":52,"h":44}, + "sourceSize": {"w":852,"h":524} +}, +"Models/EyesK3/WhitesEyes2Angry.png": +{ + "frame": {"x":472,"y":228,"w":63,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":617,"y":260,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/WhitesEyes2Heart.png": +{ + "frame": {"x":424,"y":276,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":262,"w":64,"h":45}, + "sourceSize": {"w":753,"h":414} +}, +"Models/EyesK3/WhitesEyes2Neutral.png": +{ + "frame": {"x":147,"y":224,"w":64,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":616,"y":260,"w":64,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/WhitesEyes2Sly.png": +{ + "frame": {"x":238,"y":273,"w":52,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":263,"w":52,"h":44}, + "sourceSize": {"w":852,"h":524} +}, +"Models/EyesK3/WhitesEyesSly.png": +{ + "frame": {"x":294,"y":273,"w":52,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":272,"w":52,"h":44}, + "sourceSize": {"w":759,"h":425} +}, +"Models/EyesK4/Eyes2Angry.png": +{ + "frame": {"x":671,"y":90,"w":67,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":615,"y":266,"w":67,"h":42}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/Eyes2Dazed.png": +{ + "frame": {"x":3,"y":216,"w":68,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":264,"w":68,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyes2Angry.png": +{ + "frame": {"x":742,"y":90,"w":67,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":615,"y":266,"w":67,"h":42}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyes2Dazed.png": +{ + "frame": {"x":75,"y":216,"w":68,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":264,"w":68,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyes2Neutral.png": +{ + "frame": {"x":813,"y":182,"w":70,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":264,"w":70,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyes2Surprised.png": +{ + "frame": {"x":887,"y":182,"w":70,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":264,"w":70,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyesDazed.png": +{ + "frame": {"x":967,"y":378,"w":54,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":54,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/FaceDask/Eyes2Heart.png": +{ + "frame": {"x":111,"y":369,"w":69,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":160,"w":69,"h":47}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/Eyes2Surprised.png": +{ + "frame": {"x":184,"y":370,"w":70,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":160,"w":70,"h":47}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/EyesSurprised.png": +{ + "frame": {"x":758,"y":182,"w":51,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":52,"y":168,"w":51,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyes2Heart.png": +{ + "frame": {"x":429,"y":427,"w":69,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":160,"w":69,"h":49}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyes2Sly.png": +{ + "frame": {"x":478,"y":45,"w":70,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":168,"w":70,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKjus/EyesDazed.png": +{ + "frame": {"x":790,"y":3,"w":59,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":275,"w":59,"h":39}, + "sourceSize": {"w":725,"h":425} +}, +"Models/FaceKjus/EyesNeutral.png": +{ + "frame": {"x":968,"y":279,"w":52,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":269,"w":52,"h":45}, + "sourceSize": {"w":745,"h":461} +}, +"Models/FaceKjus/EyesSly.png": +{ + "frame": {"x":3,"y":3,"w":51,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":283,"w":51,"h":30}, + "sourceSize": {"w":852,"h":524} +}, +"Models/FaceKjus/EyesSurprised.png": +{ + "frame": {"x":589,"y":182,"w":53,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":270,"w":53,"h":43}, + "sourceSize": {"w":791,"h":501} +}, +"Models/FaceKjus/MouthDistracted.png": +{ + "frame": {"x":63,"y":364,"w":44,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":322,"w":44,"h":49}, + "sourceSize": {"w":745,"h":474} +}, +"Models/FaceKjus/MouthSmile.png": +{ + "frame": {"x":166,"y":3,"w":44,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":584,"y":322,"w":44,"h":30}, + "sourceSize": {"w":700,"h":436} +}, +"Models/FaceKjus/WhitesEyes2Neutral.png": +{ + "frame": {"x":594,"y":3,"w":65,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":265,"w":65,"h":39}, + "sourceSize": {"w":807,"h":551} +}, +"Models/FaceKjus/WhitesEyesDazed.png": +{ + "frame": {"x":853,"y":3,"w":59,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":275,"w":59,"h":39}, + "sourceSize": {"w":725,"h":425} +}, +"Models/FaceKjus/WhitesEyesHeart.png": +{ + "frame": {"x":63,"y":124,"w":53,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":526,"y":271,"w":53,"h":42}, + "sourceSize": {"w":725,"h":425} +}, +"Models/FaceKjus/WhitesEyesNeutral.png": +{ + "frame": {"x":770,"y":327,"w":52,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":269,"w":52,"h":45}, + "sourceSize": {"w":745,"h":461} +}, +"Models/FaceKjus/WhitesEyesSly.png": +{ + "frame": {"x":58,"y":3,"w":51,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":283,"w":51,"h":30}, + "sourceSize": {"w":852,"h":524} +}, +"Models/FaceKjus/WhitesEyesSurprised.png": +{ + "frame": {"x":646,"y":182,"w":53,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":270,"w":53,"h":43}, + "sourceSize": {"w":791,"h":501} +}, +"Models/FaceKoi/Eyes2Angry.png": +{ + "frame": {"x":184,"y":321,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/Eyes2Dazed.png": +{ + "frame": {"x":671,"y":229,"w":62,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/Eyes2Heart.png": +{ + "frame": {"x":492,"y":277,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/Eyes2Neutral.png": +{ + "frame": {"x":560,"y":277,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/Eyes2Sly.png": +{ + "frame": {"x":250,"y":321,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/Eyes2Surprised.png": +{ + "frame": {"x":628,"y":277,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/EyesAngry.png": +{ + "frame": {"x":266,"y":132,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/EyesDazed.png": +{ + "frame": {"x":916,"y":46,"w":52,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/EyesNeutral.png": +{ + "frame": {"x":165,"y":178,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/EyesSly.png": +{ + "frame": {"x":595,"y":136,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/EyesSurprised.png": +{ + "frame": {"x":218,"y":178,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyes2Angry.png": +{ + "frame": {"x":316,"y":323,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyes2Dazed.png": +{ + "frame": {"x":737,"y":229,"w":62,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyes2Heart.png": +{ + "frame": {"x":492,"y":277,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyes2Neutral.png": +{ + "frame": {"x":696,"y":277,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyes2Sly.png": +{ + "frame": {"x":382,"y":325,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyes2Surprised.png": +{ + "frame": {"x":764,"y":278,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyesAngry.png": +{ + "frame": {"x":649,"y":136,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyesDazed.png": +{ + "frame": {"x":3,"y":80,"w":52,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyesNeutral.png": +{ + "frame": {"x":271,"y":179,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyesSly.png": +{ + "frame": {"x":703,"y":136,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyesSurprised.png": +{ + "frame": {"x":324,"y":179,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyes2Angry.png": +{ + "frame": {"x":448,"y":326,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyes2Dazed.png": +{ + "frame": {"x":803,"y":230,"w":62,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyes2Heart.png": +{ + "frame": {"x":832,"y":278,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyes2Neutral.png": +{ + "frame": {"x":900,"y":279,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyes2Sly.png": +{ + "frame": {"x":514,"y":326,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyes2Surprised.png": +{ + "frame": {"x":832,"y":278,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyesAngry.png": +{ + "frame": {"x":757,"y":136,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyesDazed.png": +{ + "frame": {"x":59,"y":80,"w":52,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyesHeart.png": +{ + "frame": {"x":377,"y":179,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyesNeutral.png": +{ + "frame": {"x":430,"y":180,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyesSly.png": +{ + "frame": {"x":811,"y":136,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyesSurprised.png": +{ + "frame": {"x":377,"y":179,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/Eyes2Angry.png": +{ + "frame": {"x":580,"y":326,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/Eyes2Dazed.png": +{ + "frame": {"x":869,"y":230,"w":62,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/Eyes2Heart.png": +{ + "frame": {"x":492,"y":277,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/Eyes2Neutral.png": +{ + "frame": {"x":3,"y":312,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/Eyes2Sly.png": +{ + "frame": {"x":646,"y":326,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/Eyes2Surprised.png": +{ + "frame": {"x":116,"y":320,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/EyesAngry.png": +{ + "frame": {"x":865,"y":136,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/EyesDazed.png": +{ + "frame": {"x":115,"y":80,"w":52,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/EyesNeutral.png": +{ + "frame": {"x":483,"y":182,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/EyesSly.png": +{ + "frame": {"x":919,"y":136,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/EyesSurprised.png": +{ + "frame": {"x":536,"y":182,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyes2Angry.png": +{ + "frame": {"x":448,"y":326,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyes2Dazed.png": +{ + "frame": {"x":803,"y":230,"w":62,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyes2Heart.png": +{ + "frame": {"x":832,"y":278,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyes2Neutral.png": +{ + "frame": {"x":900,"y":279,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyes2Sly.png": +{ + "frame": {"x":514,"y":326,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyes2Surprised.png": +{ + "frame": {"x":832,"y":278,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyesAngry.png": +{ + "frame": {"x":757,"y":136,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyesDazed.png": +{ + "frame": {"x":59,"y":80,"w":52,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyesHeart.png": +{ + "frame": {"x":377,"y":179,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyesNeutral.png": +{ + "frame": {"x":430,"y":180,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyesSly.png": +{ + "frame": {"x":811,"y":136,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyesSurprised.png": +{ + "frame": {"x":377,"y":179,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Festive/BinderStrapLeftWristtie.png": +{ + "frame": {"x":397,"y":375,"w":56,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":690,"y":578,"w":56,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/Ball.png": +{ + "frame": {"x":916,"y":3,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/Ball2Fang.png": +{ + "frame": {"x":916,"y":3,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/Ball_Teeth.png": +{ + "frame": {"x":211,"y":132,"w":51,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":233,"w":51,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/Ball_Teeth2Fang.png": +{ + "frame": {"x":320,"y":133,"w":51,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":233,"w":51,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/Ball_TeethDeep.png": +{ + "frame": {"x":3,"y":37,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/Ball_TeethDeep2Fang.png": +{ + "frame": {"x":58,"y":37,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/Ball_TeethDeepFang.png": +{ + "frame": {"x":113,"y":37,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/Ball_TeethFang.png": +{ + "frame": {"x":375,"y":133,"w":51,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":233,"w":51,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BallFang.png": +{ + "frame": {"x":916,"y":3,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/GhostBall.png": +{ + "frame": {"x":3,"y":170,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":233,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/GhostBall2Fang.png": +{ + "frame": {"x":57,"y":170,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":233,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/GhostBallFang.png": +{ + "frame": {"x":111,"y":170,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":233,"w":50,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/Ball.png": +{ + "frame": {"x":213,"y":45,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/Ball2Fang.png": +{ + "frame": {"x":213,"y":45,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/Ball_Teeth.png": +{ + "frame": {"x":430,"y":134,"w":51,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":233,"w":51,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/Ball_Teeth2Fang.png": +{ + "frame": {"x":485,"y":136,"w":51,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":233,"w":51,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/Ball_TeethDeep.png": +{ + "frame": {"x":268,"y":45,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/Ball_TeethDeep2Fang.png": +{ + "frame": {"x":323,"y":45,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/Ball_TeethDeepFang.png": +{ + "frame": {"x":378,"y":45,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/Ball_TeethFang.png": +{ + "frame": {"x":540,"y":136,"w":51,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":233,"w":51,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallFang.png": +{ + "frame": {"x":213,"y":45,"w":51,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Kigu/Mouth.png": +{ + "frame": {"x":171,"y":80,"w":37,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":322,"w":37,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/AnkleLeftSpread.png": +{ + "frame": {"x":281,"y":425,"w":70,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":684,"y":1421,"w":70,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandWristLeftFree.png": +{ + "frame": {"x":65,"y":264,"w":56,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":801,"y":754,"w":56,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandWristLeftFront.png": +{ + "frame": {"x":826,"y":327,"w":64,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":627,"y":546,"w":64,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandWristRightFront.png": +{ + "frame": {"x":600,"y":46,"w":62,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":551,"w":62,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/ElbowLeftCrossed.png": +{ + "frame": {"x":888,"y":378,"w":75,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":607,"w":75,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/WristLeftYoked.png": +{ + "frame": {"x":894,"y":328,"w":59,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":872,"y":390,"w":59,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/WristRightCrossed.png": +{ + "frame": {"x":318,"y":3,"w":53,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":649,"y":608,"w":53,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/AnkleLeftSpread.png": +{ + "frame": {"x":355,"y":426,"w":70,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":684,"y":1421,"w":70,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowLeftCrossed.png": +{ + "frame": {"x":48,"y":420,"w":75,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":607,"w":75,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/ElbowLeftWristtie.png": +{ + "frame": {"x":125,"y":272,"w":53,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":682,"y":612,"w":53,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/WristLeftYoked.png": +{ + "frame": {"x":957,"y":328,"w":59,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":872,"y":390,"w":59,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/WristRightCrossed.png": +{ + "frame": {"x":375,"y":3,"w":53,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":649,"y":608,"w":53,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandWristRightCrossed.png": +{ + "frame": {"x":426,"y":88,"w":41,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":640,"y":597,"w":41,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareWristLeftYoked.png": +{ + "frame": {"x":212,"y":88,"w":50,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":871,"y":389,"w":50,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/WristLeftYoked.png": +{ + "frame": {"x":669,"y":376,"w":66,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":869,"y":387,"w":66,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/WristRightCrossed.png": +{ + "frame": {"x":632,"y":428,"w":60,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":635,"y":594,"w":60,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/WristRightYoked.png": +{ + "frame": {"x":258,"y":372,"w":69,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":307,"y":394,"w":69,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffLeftFree.png": +{ + "frame": {"x":973,"y":136,"w":37,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":791,"y":760,"w":37,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffLeftYoked.png": +{ + "frame": {"x":3,"y":361,"w":56,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":871,"y":392,"w":56,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuffRightYoked.png": +{ + "frame": {"x":3,"y":264,"w":58,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":318,"y":407,"w":58,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/BandLeftFront.png": +{ + "frame": {"x":663,"y":3,"w":60,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":623,"y":547,"w":60,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexRightBoxtie.png": +{ + "frame": {"x":168,"y":37,"w":41,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":678,"w":41,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LeatherRightBoxtie.png": +{ + "frame": {"x":433,"y":45,"w":41,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":678,"w":41,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Arm1OverWristtie.png": +{ + "frame": {"x":856,"y":46,"w":56,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":686,"y":580,"w":56,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimAnkleLeftSpread.png": +{ + "frame": {"x":127,"y":421,"w":75,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":1436,"w":75,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimAnkleRightClosed.png": +{ + "frame": {"x":331,"y":374,"w":62,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":536,"y":1428,"w":62,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimAnkleRightSpread.png": +{ + "frame": {"x":808,"y":377,"w":76,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":490,"y":1437,"w":76,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimWristLeftYoked.png": +{ + "frame": {"x":350,"y":274,"w":70,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":866,"y":390,"w":70,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/WristLeftFree.png": +{ + "frame": {"x":256,"y":3,"w":58,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":797,"y":765,"w":58,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/bac/SuccubusClawLeftFree.png": +{ + "frame": {"x":951,"y":90,"w":59,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":839,"y":824,"w":59,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SearchlightBase.png": +{ + "frame": {"x":266,"y":88,"w":50,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":658,"y":489,"w":50,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/ForeGloveRightCrossed.png": +{ + "frame": {"x":712,"y":327,"w":54,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":647,"y":601,"w":54,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BandForeGloveLeftFront.png": +{ + "frame": {"x":113,"y":3,"w":49,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":628,"y":554,"w":49,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BandForeGloveRightFront.png": +{ + "frame": {"x":471,"y":89,"w":50,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":542,"w":50,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BandGloveLeftFree.png": +{ + "frame": {"x":368,"y":88,"w":54,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":796,"y":752,"w":54,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BeltCharm.png": +{ + "frame": {"x":502,"y":427,"w":60,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":671,"w":60,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/RimForeGloveLeftFront.png": +{ + "frame": {"x":566,"y":427,"w":62,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":541,"w":62,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/BandForeGloveLeftFront.png": +{ + "frame": {"x":113,"y":3,"w":49,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":628,"y":554,"w":49,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/BandForeGloveRightFront.png": +{ + "frame": {"x":471,"y":89,"w":50,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":486,"y":542,"w":50,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/BandGloveLeftFree.png": +{ + "frame": {"x":368,"y":88,"w":54,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":796,"y":752,"w":54,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/RimForeGloveLeftFront.png": +{ + "frame": {"x":566,"y":427,"w":62,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":541,"w":62,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolfgirl/MascaraL.png": +{ + "frame": {"x":972,"y":46,"w":41,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":179,"y":249,"w":41,"h":40}, + "sourceSize": {"w":347,"h":439} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas47.webp", + "format": "RGBA8888", + "size": {"w":1024,"h":481}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas47.webp b/TextureAtlas/atlas47.webp new file mode 100644 index 000000000..50c018027 Binary files /dev/null and b/TextureAtlas/atlas47.webp differ diff --git a/TextureAtlas/atlas5.json b/TextureAtlas/atlas5.json new file mode 100644 index 000000000..baa7bf47a --- /dev/null +++ b/TextureAtlas/atlas5.json @@ -0,0 +1,373 @@ +{"frames": { + +"Models/Armbinder/BinderRightBoxtie.png": +{ + "frame": {"x":2021,"y":922,"w":24,"h":166}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":518,"w":24,"h":166}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmRightCrossed.png": +{ + "frame": {"x":1235,"y":922,"w":308,"h":638}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":308,"h":638}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/ArmRightFront.png": +{ + "frame": {"x":1547,"y":922,"w":308,"h":638}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":308,"h":638}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/ForeArmLeftFront.png": +{ + "frame": {"x":1509,"y":279,"w":536,"h":639}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":216,"y":91,"w":536,"h":639}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BeltStrapLining.png": +{ + "frame": {"x":1881,"y":1846,"w":164,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":557,"y":737,"w":164,"h":186}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Crystal/EncaseUnder.png": +{ + "frame": {"x":3,"y":3,"w":403,"h":1573}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":407,"y":81,"w":403,"h":1573}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowRightFront.png": +{ + "frame": {"x":2021,"y":1332,"w":24,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":599,"w":24,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowRightFront.png": +{ + "frame": {"x":2021,"y":1384,"w":24,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":599,"w":24,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenRightCrossed.png": +{ + "frame": {"x":2021,"y":1436,"w":24,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":510,"w":24,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenRightCrossed.png": +{ + "frame": {"x":2021,"y":1436,"w":24,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":510,"w":24,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockPlateFree.png": +{ + "frame": {"x":2021,"y":1278,"w":24,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":768,"y":590,"w":24,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceKoi/BrowsAngry.png": +{ + "frame": {"x":1347,"y":2036,"w":45,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":56,"y":148,"w":45,"h":8}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/MouthEmbarrassed.png": +{ + "frame": {"x":1429,"y":2036,"w":37,"h":7}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":118,"y":244,"w":37,"h":7}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/MouthFrown.png": +{ + "frame": {"x":1269,"y":2036,"w":30,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":121,"y":247,"w":30,"h":9}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/MouthSmile.png": +{ + "frame": {"x":1396,"y":2036,"w":29,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":121,"y":244,"w":29,"h":8}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FutureBox/Display.png": +{ + "frame": {"x":2021,"y":1092,"w":24,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":187,"y":749,"w":24,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureBox/Door.png": +{ + "frame": {"x":410,"y":3,"w":821,"h":1557}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":207,"y":69,"w":821,"h":1557}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureBox/DoorWindow.png": +{ + "frame": {"x":3,"y":1580,"w":294,"h":465}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":98,"w":294,"h":465}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/BallTeeth_Teeth.png": +{ + "frame": {"x":1909,"y":2036,"w":23,"h":5}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":119,"y":235,"w":23,"h":5}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BallTeeth_Teeth2Fang.png": +{ + "frame": {"x":1470,"y":2036,"w":25,"h":6}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":118,"y":235,"w":25,"h":6}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BallTeeth_TeethDeep.png": +{ + "frame": {"x":1191,"y":2036,"w":35,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":114,"y":236,"w":35,"h":9}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/BallTeeth_TeethFang.png": +{ + "frame": {"x":1881,"y":2036,"w":24,"h":6}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":119,"y":235,"w":24,"h":6}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallTeeth_Teeth.png": +{ + "frame": {"x":1936,"y":2036,"w":23,"h":5}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":119,"y":235,"w":23,"h":5}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallTeeth_Teeth2Fang.png": +{ + "frame": {"x":1470,"y":2036,"w":25,"h":6}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":118,"y":235,"w":25,"h":6}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallTeeth_TeethDeep.png": +{ + "frame": {"x":1230,"y":2036,"w":35,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":114,"y":236,"w":35,"h":9}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallTeeth_TeethFang.png": +{ + "frame": {"x":1881,"y":2036,"w":24,"h":6}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":119,"y":235,"w":24,"h":6}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Kigu/MouthSmile.png": +{ + "frame": {"x":1396,"y":2036,"w":29,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":121,"y":244,"w":29,"h":8}, + "sourceSize": {"w":321,"h":332} +}, +"Models/KittyPawCuffs/ElbowRightCrossed.png": +{ + "frame": {"x":2021,"y":1484,"w":24,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":439,"y":577,"w":24,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockAnkleLeftKneelClosed.png": +{ + "frame": {"x":1303,"y":2036,"w":19,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":722,"y":992,"w":19,"h":9}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Leash/LeashFree.png": +{ + "frame": {"x":598,"y":1564,"w":310,"h":479}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":436,"w":310,"h":479}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightStripeCrossed.png": +{ + "frame": {"x":1326,"y":2036,"w":17,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":592,"w":17,"h":9}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ArmRightStripeFront.png": +{ + "frame": {"x":1326,"y":2036,"w":17,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":592,"w":17,"h":9}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SockLeftHogtie.png": +{ + "frame": {"x":1235,"y":279,"w":270,"h":498}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":714,"w":270,"h":498}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/BootRightSpread.png": +{ + "frame": {"x":301,"y":1580,"w":135,"h":464}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":1215,"w":135,"h":464}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/SockRightSpread.png": +{ + "frame": {"x":1859,"y":922,"w":158,"h":638}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":994,"w":158,"h":638}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/Bow.png": +{ + "frame": {"x":410,"y":1564,"w":21,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":810,"w":21,"h":12}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/Arm1Wristtie.png": +{ + "frame": {"x":1235,"y":781,"w":270,"h":136}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":581,"w":270,"h":136}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ZombieChestTalismanKneel.png": +{ + "frame": {"x":912,"y":1564,"w":275,"h":474}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":375,"y":479,"w":275,"h":474}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/LeftKneel.png": +{ + "frame": {"x":1509,"y":1564,"w":536,"h":278}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":384,"y":811,"w":536,"h":278}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusWingBack.png": +{ + "frame": {"x":1235,"y":3,"w":803,"h":272}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":235,"y":359,"w":803,"h":272}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/ArmRightBoxtie.png": +{ + "frame": {"x":2021,"y":1197,"w":24,"h":77}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":613,"w":24,"h":77}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/PantyhoseKneel.png": +{ + "frame": {"x":1509,"y":1846,"w":368,"h":199}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":407,"y":742,"w":368,"h":199}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ArmbandBoxtie.png": +{ + "frame": {"x":2021,"y":1527,"w":19,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":510,"w":19,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseRightUp.png": +{ + "frame": {"x":440,"y":1564,"w":154,"h":481}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":303,"w":154,"h":481}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoLowerRimKneel.png": +{ + "frame": {"x":1191,"y":1564,"w":314,"h":468}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":435,"y":390,"w":314,"h":468}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas5.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas5.webp b/TextureAtlas/atlas5.webp new file mode 100644 index 000000000..4886ce594 Binary files /dev/null and b/TextureAtlas/atlas5.webp differ diff --git a/TextureAtlas/atlas6.json b/TextureAtlas/atlas6.json new file mode 100644 index 000000000..340e05548 --- /dev/null +++ b/TextureAtlas/atlas6.json @@ -0,0 +1,213 @@ +{"frames": { + +"Models/Belts/LeftArm1Wristtie.png": +{ + "frame": {"x":1084,"y":910,"w":77,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":695,"y":496,"w":77,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Crystal/EncaseOver.png": +{ + "frame": {"x":672,"y":3,"w":408,"h":1543}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":404,"y":82,"w":408,"h":1543}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowLeftBoxtie.png": +{ + "frame": {"x":1084,"y":1053,"w":77,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":573,"w":77,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowLeftBoxtie.png": +{ + "frame": {"x":1084,"y":1112,"w":77,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":573,"w":77,"h":55}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenThighLeftKneel.png": +{ + "frame": {"x":1084,"y":984,"w":77,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":861,"w":77,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenThighLeftKneelClosed.png": +{ + "frame": {"x":1084,"y":984,"w":77,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":861,"w":77,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineGag/MuzzleHarness.png": +{ + "frame": {"x":1890,"y":1868,"w":144,"h":177}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":523,"y":124,"w":144,"h":177}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseNeckUp.png": +{ + "frame": {"x":1549,"y":1868,"w":337,"h":177}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":387,"w":337,"h":177}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandLeftFree.png": +{ + "frame": {"x":1084,"y":807,"w":77,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":487,"w":77,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/LatexCubeBack.png": +{ + "frame": {"x":1165,"y":3,"w":880,"h":1521}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":195,"y":46,"w":880,"h":1521}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/MuzzleHarness.png": +{ + "frame": {"x":1084,"y":580,"w":77,"h":223}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":91,"y":10,"w":77,"h":223}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair2/BlondeBack.png": +{ + "frame": {"x":3,"y":1557,"w":383,"h":488}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":103,"w":383,"h":488}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/BlondeBackM.png": +{ + "frame": {"x":390,"y":1557,"w":383,"h":488}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":103,"w":383,"h":488}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/AnkleRightSpread.png": +{ + "frame": {"x":1084,"y":1474,"w":76,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":491,"y":1418,"w":76,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetsuit/LeftLegsKneelClosed.png": +{ + "frame": {"x":1549,"y":1528,"w":495,"h":336}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":746,"w":495,"h":336}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Leash/LeashFront.png": +{ + "frame": {"x":1084,"y":304,"w":77,"h":272}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":550,"y":436,"w":77,"h":272}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/SockRightHogtie.png": +{ + "frame": {"x":1009,"y":1550,"w":152,"h":494}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":442,"y":714,"w":152,"h":494}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Nipples/RingsBullet.png": +{ + "frame": {"x":1084,"y":1528,"w":194,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":563,"w":194,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Petsuit/Petsuit.psd": +{ + "frame": {"x":3,"y":3,"w":665,"h":1550}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":244,"y":99,"w":665,"h":1550}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/ShoeRightSpread.png": +{ + "frame": {"x":1165,"y":1909,"w":113,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":497,"y":1508,"w":113,"h":133}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/AnkleLeftClosed.png": +{ + "frame": {"x":1165,"y":1550,"w":113,"h":355}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":579,"y":1145,"w":113,"h":355}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/RightLegsHogtie.png": +{ + "frame": {"x":777,"y":1550,"w":228,"h":494}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":657,"w":228,"h":494}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/SleeveLeftFront.png": +{ + "frame": {"x":1084,"y":3,"w":77,"h":297}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":696,"y":425,"w":77,"h":297}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SleeveLeftYoked.png": +{ + "frame": {"x":1282,"y":1528,"w":263,"h":516}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":376,"w":263,"h":516}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SleeveRightWristtie.png": +{ + "frame": {"x":1084,"y":1171,"w":76,"h":299}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":432,"w":76,"h":299}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas6.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas7.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas6.webp b/TextureAtlas/atlas6.webp new file mode 100644 index 000000000..6df0f5280 Binary files /dev/null and b/TextureAtlas/atlas6.webp differ diff --git a/TextureAtlas/atlas7.json b/TextureAtlas/atlas7.json new file mode 100644 index 000000000..5335f8fe1 --- /dev/null +++ b/TextureAtlas/atlas7.json @@ -0,0 +1,237 @@ +{"frames": { + +"Models/ArmorChain/SkirtBelt.png": +{ + "frame": {"x":1694,"y":1988,"w":279,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":763,"w":279,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/Cyber.png": +{ + "frame": {"x":295,"y":1524,"w":312,"h":518}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":406,"w":312,"h":518}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/SkirtBack.png": +{ + "frame": {"x":1694,"y":1668,"w":350,"h":316}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":781,"w":350,"h":316}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/LatexCube.png": +{ + "frame": {"x":3,"y":3,"w":875,"h":1517}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":198,"y":48,"w":875,"h":1517}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/SarcoBack.png": +{ + "frame": {"x":882,"y":3,"w":453,"h":1512}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":392,"y":99,"w":453,"h":1512}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/SarcoWebs.png": +{ + "frame": {"x":1339,"y":3,"w":451,"h":1509}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":101,"w":451,"h":1509}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureHarness/StrapsLower.png": +{ + "frame": {"x":1794,"y":416,"w":251,"h":179}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":725,"w":251,"h":179}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureHarness/StrapsLowerSpread.png": +{ + "frame": {"x":1794,"y":222,"w":251,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":725,"w":251,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Gothic/LaceLowerKneelCrotchStrap..png": +{ + "frame": {"x":1451,"y":1516,"w":593,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":296,"y":847,"w":593,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/BraidBack.png": +{ + "frame": {"x":1943,"y":1378,"w":102,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":278,"w":102,"h":126}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/Curly_Overstrap.png": +{ + "frame": {"x":1451,"y":1668,"w":239,"h":376}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":143,"w":239,"h":376}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair2_Front.png": +{ + "frame": {"x":1794,"y":3,"w":251,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":121,"w":251,"h":215}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/LeatherRightSpread.png": +{ + "frame": {"x":3,"y":1524,"w":142,"h":521}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":467,"y":1143,"w":142,"h":521}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/BootLeftClosed.png": +{ + "frame": {"x":1794,"y":1054,"w":145,"h":458}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":551,"y":1206,"w":145,"h":458}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/FabricClosed.png": +{ + "frame": {"x":1794,"y":855,"w":250,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":657,"w":250,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/FabricSpread.png": +{ + "frame": {"x":1794,"y":855,"w":250,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":657,"w":250,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveDecoRightFree.png": +{ + "frame": {"x":850,"y":1524,"w":97,"h":518}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":379,"y":608,"w":97,"h":518}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveDecoRightYoked.png": +{ + "frame": {"x":1348,"y":1516,"w":99,"h":529}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":283,"y":384,"w":99,"h":529}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ArmLeftWristtie.png": +{ + "frame": {"x":1943,"y":1054,"w":102,"h":320}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":424,"w":102,"h":320}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/RightSpread.png": +{ + "frame": {"x":149,"y":1524,"w":142,"h":521}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":467,"y":1143,"w":142,"h":521}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ChestStrap.png": +{ + "frame": {"x":1794,"y":751,"w":251,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":442,"w":251,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ChestStrap.png": +{ + "frame": {"x":1794,"y":751,"w":251,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":442,"w":251,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ChestStrap.png": +{ + "frame": {"x":1794,"y":751,"w":251,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":479,"y":442,"w":251,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/RimGloveLeftYoked.png": +{ + "frame": {"x":1977,"y":1988,"w":67,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":873,"y":373,"w":67,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/RimGloveLeftYoked.png": +{ + "frame": {"x":1977,"y":1988,"w":67,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":873,"y":373,"w":67,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/Shirt.png": +{ + "frame": {"x":1794,"y":599,"w":251,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":602,"w":251,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SkirtHogtie.png": +{ + "frame": {"x":951,"y":1519,"w":393,"h":524}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":413,"y":713,"w":393,"h":524}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SleeveRightYoked.png": +{ + "frame": {"x":611,"y":1524,"w":235,"h":518}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":254,"y":378,"w":235,"h":518}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas7.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas8.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas7.webp b/TextureAtlas/atlas7.webp new file mode 100644 index 000000000..561331fe3 Binary files /dev/null and b/TextureAtlas/atlas7.webp differ diff --git a/TextureAtlas/atlas8.json b/TextureAtlas/atlas8.json new file mode 100644 index 000000000..0e8f14f22 --- /dev/null +++ b/TextureAtlas/atlas8.json @@ -0,0 +1,229 @@ +{"frames": { + +"Models/Armbinder/StrapsRightWristtie.png": +{ + "frame": {"x":381,"y":2034,"w":16,"h":11}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":515,"w":16,"h":11}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/LegLeftSpread.png": +{ + "frame": {"x":1114,"y":1336,"w":166,"h":708}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":602,"y":919,"w":166,"h":708}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/LegRightSpread.png": +{ + "frame": {"x":1453,"y":1336,"w":181,"h":706}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":443,"y":919,"w":181,"h":706}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/SockLeftSpread.png": +{ + "frame": {"x":1284,"y":1336,"w":165,"h":707}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":602,"y":918,"w":165,"h":707}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bunny/SockRightSpread.png": +{ + "frame": {"x":1638,"y":1336,"w":162,"h":706}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":919,"w":162,"h":706}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceKjus/MouthDazed.png": +{ + "frame": {"x":307,"y":2034,"w":39,"h":11}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":342,"w":39,"h":11}, + "sourceSize": {"w":706,"h":455} +}, +"Models/FaceKoi/Brows2Neutral.png": +{ + "frame": {"x":255,"y":2034,"w":48,"h":11}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":142,"y":139,"w":48,"h":11}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/MouthSurprised.png": +{ + "frame": {"x":350,"y":2034,"w":27,"h":11}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":121,"y":243,"w":27,"h":11}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Furniture/Barrel.png": +{ + "frame": {"x":1114,"y":3,"w":921,"h":1329}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":159,"y":136,"w":921,"h":1329}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/Whiskers.png": +{ + "frame": {"x":979,"y":2010,"w":127,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":76,"y":222,"w":127,"h":35}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair/VentL.png": +{ + "frame": {"x":1936,"y":1628,"w":109,"h":324}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":609,"y":87,"w":109,"h":324}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/CuffsLockFront.png": +{ + "frame": {"x":630,"y":1551,"w":480,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":417,"y":375,"w":480,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockAnkleLeftKneel.png": +{ + "frame": {"x":401,"y":2034,"w":16,"h":11}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":739,"y":1014,"w":16,"h":11}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LegsBeltsKneel.png": +{ + "frame": {"x":1804,"y":1336,"w":241,"h":288}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":309,"y":788,"w":241,"h":288}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherPetsuit/LegsBeltsKneelClosed.png": +{ + "frame": {"x":1804,"y":1336,"w":241,"h":288}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":309,"y":788,"w":241,"h":288}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/ApronMiniBow.png": +{ + "frame": {"x":421,"y":2034,"w":16,"h":11}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":546,"y":806,"w":16,"h":11}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootShoeRightClosed.png": +{ + "frame": {"x":255,"y":1514,"w":202,"h":516}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":1175,"w":202,"h":516}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/KneeLeftHogtie.png": +{ + "frame": {"x":1804,"y":1628,"w":128,"h":417}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":1149,"w":128,"h":417}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/Skirt.png": +{ + "frame": {"x":630,"y":1793,"w":345,"h":252}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":710,"w":345,"h":252}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SkirtClosed.png": +{ + "frame": {"x":630,"y":1793,"w":345,"h":252}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":710,"w":345,"h":252}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Robes/SleeveDecoLeftYoked.png": +{ + "frame": {"x":3,"y":1514,"w":99,"h":530}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":861,"y":383,"w":99,"h":530}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/LegLeftClosed.png": +{ + "frame": {"x":461,"y":1551,"w":165,"h":490}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":577,"y":755,"w":165,"h":490}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/BallMittens.png": +{ + "frame": {"x":3,"y":3,"w":1107,"h":1507}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":100,"y":37,"w":1107,"h":1507}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/HandRightFront.png": +{ + "frame": {"x":1936,"y":1956,"w":95,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":462,"w":95,"h":89}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/WebbingSideYoked.png": +{ + "frame": {"x":979,"y":1793,"w":131,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":635,"y":409,"w":131,"h":213}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegPadsLeftClosed.png": +{ + "frame": {"x":106,"y":1514,"w":145,"h":528}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":580,"y":953,"w":145,"h":528}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yoke/Steel.png": +{ + "frame": {"x":461,"y":1514,"w":647,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":303,"y":392,"w":647,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas8.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas9.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas8.webp b/TextureAtlas/atlas8.webp new file mode 100644 index 000000000..c864b4cf0 Binary files /dev/null and b/TextureAtlas/atlas8.webp differ diff --git a/TextureAtlas/atlas9.json b/TextureAtlas/atlas9.json new file mode 100644 index 000000000..451369392 --- /dev/null +++ b/TextureAtlas/atlas9.json @@ -0,0 +1,525 @@ +{"frames": { + +"Models/Body/Torso.png": +{ + "frame": {"x":602,"y":1479,"w":319,"h":564}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":359,"w":319,"h":564}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Body/TorsoChastity.png": +{ + "frame": {"x":925,"y":1479,"w":319,"h":564}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":359,"w":319,"h":564}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/LegRightKneel.png": +{ + "frame": {"x":775,"y":1171,"w":239,"h":304}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":759,"w":239,"h":304}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/LegRightSpread.png": +{ + "frame": {"x":447,"y":1479,"w":151,"h":566}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":919,"w":151,"h":566}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/BraProtoLock.png": +{ + "frame": {"x":2024,"y":748,"w":17,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":573,"w":17,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/CyberLock.png": +{ + "frame": {"x":909,"y":970,"w":11,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":570,"y":851,"w":11,"h":17}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/FutureLock.png": +{ + "frame": {"x":909,"y":847,"w":12,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":603,"y":404,"w":12,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffForeLongMittenRightCrossed.png": +{ + "frame": {"x":2024,"y":1059,"w":16,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":682,"y":598,"w":16,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenRightBoxtie.png": +{ + "frame": {"x":2024,"y":38,"w":21,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":508,"w":21,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/DisplayLongMittenLeftYoked.png": +{ + "frame": {"x":2024,"y":813,"w":17,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":793,"y":486,"w":17,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LockLongMittenLeftWristtie.png": +{ + "frame": {"x":909,"y":869,"w":12,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":740,"y":552,"w":12,"h":14}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowLeftBoxtie.png": +{ + "frame": {"x":2024,"y":711,"w":17,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":755,"y":586,"w":17,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowLeftFree.png": +{ + "frame": {"x":2024,"y":1102,"w":16,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":766,"y":596,"w":16,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockWristLeftFront.png": +{ + "frame": {"x":2024,"y":72,"w":21,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":670,"y":543,"w":21,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockWristRightFront.png": +{ + "frame": {"x":2024,"y":106,"w":21,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":541,"w":21,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffForeLongMittenRightCrossed.png": +{ + "frame": {"x":2024,"y":1059,"w":16,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":682,"y":598,"w":16,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/DisplayLongMittenLeftFree.png": +{ + "frame": {"x":2024,"y":377,"w":19,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":833,"y":756,"w":19,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenRightBoxtie.png": +{ + "frame": {"x":2024,"y":38,"w":21,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":508,"w":21,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperDisplayLongMittenLeftYoked.png": +{ + "frame": {"x":2024,"y":813,"w":17,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":793,"y":486,"w":17,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperLockLongMittenLeftWristtie.png": +{ + "frame": {"x":909,"y":869,"w":12,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":740,"y":552,"w":12,"h":14}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BraBase1.png": +{ + "frame": {"x":1765,"y":1873,"w":280,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":498,"w":280,"h":142}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftDecoCleanKneel.png": +{ + "frame": {"x":2024,"y":918,"w":16,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":737,"y":946,"w":16,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftDecoKneel.png": +{ + "frame": {"x":2024,"y":965,"w":16,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":737,"y":946,"w":16,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftLockBandFront.png": +{ + "frame": {"x":2024,"y":880,"w":17,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":758,"y":633,"w":17,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightDecoBoxtie.png": +{ + "frame": {"x":2024,"y":278,"w":21,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":611,"w":21,"h":16}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightDecoCleanBoxtie.png": +{ + "frame": {"x":2024,"y":298,"w":21,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":611,"w":21,"h":16}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightLockBoxtie.png": +{ + "frame": {"x":2024,"y":670,"w":17,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":601,"w":17,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftLockBandFree.png": +{ + "frame": {"x":2024,"y":226,"w":21,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":833,"y":732,"w":21,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceCorsetCrystal.png": +{ + "frame": {"x":2024,"y":418,"w":17,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":568,"y":634,"w":17,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceKjus/EyesHeart.png": +{ + "frame": {"x":1991,"y":1432,"w":53,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":526,"y":271,"w":53,"h":42}, + "sourceSize": {"w":725,"h":425} +}, +"Models/Festive/StrapTop.png": +{ + "frame": {"x":1793,"y":1171,"w":252,"h":257}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":406,"w":252,"h":257}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureBox/BackFade.png": +{ + "frame": {"x":3,"y":3,"w":768,"h":1472}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":231,"y":121,"w":768,"h":1472}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureBox/Lock.png": +{ + "frame": {"x":2024,"y":348,"w":19,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":189,"y":782,"w":19,"h":25}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureHarness/DisplayLower.png": +{ + "frame": {"x":1765,"y":2019,"w":163,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":489,"y":807,"w":163,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureHarness/LockChest.png": +{ + "frame": {"x":2024,"y":3,"w":21,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":570,"y":497,"w":21,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagMetal/Display.png": +{ + "frame": {"x":2024,"y":140,"w":21,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":114,"y":156,"w":21,"h":25}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Hair2/Hair3_FrontC.png": +{ + "frame": {"x":1167,"y":1171,"w":309,"h":303}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":114,"w":309,"h":303}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair2/Hair3_FrontE.png": +{ + "frame": {"x":1480,"y":1171,"w":309,"h":303}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":478,"y":114,"w":309,"h":303}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLegRightHogtie.png": +{ + "frame": {"x":1018,"y":1171,"w":145,"h":304}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":905,"w":145,"h":304}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/BandElbowRightCrossed.png": +{ + "frame": {"x":2024,"y":169,"w":21,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":585,"w":21,"h":25}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowRightBoxtie.png": +{ + "frame": {"x":909,"y":944,"w":11,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":611,"w":11,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPawCuffs/LockElbowRightFront.png": +{ + "frame": {"x":2024,"y":318,"w":19,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":429,"y":624,"w":19,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/BlindfoldSmallStrap.png": +{ + "frame": {"x":1793,"y":1432,"w":194,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":518,"y":267,"w":194,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/EarmuffersR.png": +{ + "frame": {"x":2024,"y":1012,"w":16,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":300,"w":16,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPet/ShoulderCuffStripeLeft.png": +{ + "frame": {"x":2024,"y":587,"w":17,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":436,"w":17,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowRightCrossed.png": +{ + "frame": {"x":2024,"y":399,"w":19,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":590,"w":19,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandElbowRightFront.png": +{ + "frame": {"x":2024,"y":899,"w":17,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":618,"w":17,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandThighRightClosed.png": +{ + "frame": {"x":1932,"y":2019,"w":104,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":1046,"w":104,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyPetCuffs/BandWristRightCrossed.png": +{ + "frame": {"x":2024,"y":1138,"w":16,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":667,"y":617,"w":16,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowLeftWristtie.png": +{ + "frame": {"x":909,"y":917,"w":11,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":624,"w":11,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareWristRightYoked.png": +{ + "frame": {"x":909,"y":887,"w":11,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":336,"y":408,"w":11,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/BootLeftSpread.png": +{ + "frame": {"x":775,"y":847,"w":130,"h":320}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":648,"y":1177,"w":130,"h":320}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightHeavy/GloveRightCrossed.png": +{ + "frame": {"x":2024,"y":782,"w":17,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":612,"w":17,"h":27}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/Apron.png": +{ + "frame": {"x":1765,"y":1478,"w":280,"h":391}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":438,"y":549,"w":280,"h":391}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuff2LeftWristtie.png": +{ + "frame": {"x":2024,"y":198,"w":21,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":696,"y":686,"w":21,"h":24}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardCuff2RightBoxtie.png": +{ + "frame": {"x":2024,"y":859,"w":17,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":682,"y":667,"w":17,"h":17}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderLeftButtonUp.png": +{ + "frame": {"x":909,"y":991,"w":11,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":708,"y":302,"w":11,"h":12}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Tails/Fox7.png": +{ + "frame": {"x":925,"y":3,"w":1095,"h":1164}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":87,"y":341,"w":1095,"h":1164}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Uniform/HatGloriousInsigniaHS.png": +{ + "frame": {"x":2024,"y":837,"w":17,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":518,"y":106,"w":17,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/UniformShirt/DressChestUp.png": +{ + "frame": {"x":3,"y":1479,"w":440,"h":566}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":366,"w":440,"h":566}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ArmbandWristtie.png": +{ + "frame": {"x":2024,"y":253,"w":21,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":467,"y":510,"w":21,"h":21}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeRightClosed.png": +{ + "frame": {"x":775,"y":3,"w":146,"h":418}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":1206,"w":146,"h":418}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeRightClosedRopesAnkle.png": +{ + "frame": {"x":775,"y":425,"w":146,"h":418}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":1206,"w":146,"h":418}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/SkirtRuffleClosed.png": +{ + "frame": {"x":1248,"y":1478,"w":513,"h":567}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":347,"y":821,"w":513,"h":567}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas9.webp", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "0.5", + "related_multi_packs": [ "atlas0.json", "atlas1.json", "atlas2.json", "atlas3.json", "atlas4.json", "atlas5.json", "atlas6.json", "atlas7.json", "atlas8.json", "atlas10.json", "atlas11.json", "atlas12.json", "atlas13.json", "atlas14.json", "atlas15.json", "atlas16.json", "atlas17.json", "atlas18.json", "atlas19.json", "atlas20.json", "atlas21.json", "atlas22.json", "atlas23.json", "atlas24.json", "atlas25.json", "atlas26.json", "atlas27.json", "atlas28.json", "atlas29.json", "atlas30.json", "atlas31.json", "atlas32.json", "atlas33.json", "atlas34.json", "atlas35.json", "atlas36.json", "atlas37.json", "atlas38.json", "atlas39.json", "atlas40.json", "atlas41.json", "atlas42.json", "atlas43.json", "atlas44.json", "atlas45.json", "atlas46.json", "atlas47.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:30f98187c69fc163f23f56d20175ee7d:30ffa1a19090dd089a66f3c586995261:8682407d1c09b2fa075a0ee317a91aa2$" +} +} diff --git a/TextureAtlas/atlas9.webp b/TextureAtlas/atlas9.webp new file mode 100644 index 000000000..a9ccf771c Binary files /dev/null and b/TextureAtlas/atlas9.webp differ diff --git a/TextureAtlas/displace0.json b/TextureAtlas/displace0.json new file mode 100644 index 000000000..6bb100f8e --- /dev/null +++ b/TextureAtlas/displace0.json @@ -0,0 +1,437 @@ +{"frames": { + +"DisplacementMaps/AnkleCuffLeftClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/AnkleCuffLeftKneel.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/AnkleCuffLeftKneelClosed.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/AnkleCuffLeftSpread.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/AnkleCuffRightClosed.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/AnkleCuffRightSpread.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BalletCuffsHogtie.png": +{ + "frame": {"x":733,"y":1985,"w":3,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":3,"h":2} +}, +"DisplacementMaps/BalletErase.png": +{ + "frame": {"x":745,"y":1984,"w":1,"h":1}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":1,"h":1}, + "sourceSize": {"w":1,"h":1} +}, +"DisplacementMaps/BalletHogtie.png": +{ + "frame": {"x":733,"y":1985,"w":3,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":3,"h":2} +}, +"DisplacementMaps/BalletRightErase.png": +{ + "frame": {"x":745,"y":1984,"w":1,"h":1}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":1,"h":1}, + "sourceSize": {"w":1,"h":1} +}, +"DisplacementMaps/CorsetSquish.png": +{ + "frame": {"x":3,"y":1765,"w":620,"h":220}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":220}, + "sourceSize": {"w":620,"h":220} +}, +"DisplacementMaps/CuffLeftCrossed.png": +{ + "frame": {"x":706,"y":1989,"w":8,"h":3}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":8,"h":3}, + "sourceSize": {"w":8,"h":3} +}, +"DisplacementMaps/CuffLeftFront.png": +{ + "frame": {"x":773,"y":1967,"w":14,"h":6}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":14,"h":6}, + "sourceSize": {"w":14,"h":6} +}, +"DisplacementMaps/CuffRightCrossed.png": +{ + "frame": {"x":791,"y":1967,"w":11,"h":8}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":11,"h":8}, + "sourceSize": {"w":11,"h":8} +}, +"DisplacementMaps/CuffRightFront.png": +{ + "frame": {"x":773,"y":1977,"w":10,"h":7}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":10,"h":7}, + "sourceSize": {"w":10,"h":7} +}, +"DisplacementMaps/ElbowCuffLeftUp.png": +{ + "frame": {"x":627,"y":1765,"w":531,"h":198}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":531,"h":198}, + "sourceSize": {"w":531,"h":198} +}, +"DisplacementMaps/EraseCorset.png": +{ + "frame": {"x":750,"y":1984,"w":1,"h":1}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":1,"h":1}, + "sourceSize": {"w":1,"h":1} +}, +"DisplacementMaps/FrogThigh1SquishKneel.png": +{ + "frame": {"x":1875,"y":1679,"w":168,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":158,"y":465,"w":168,"h":79}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/FrogThigh2SquishKneel.png": +{ + "frame": {"x":1875,"y":1480,"w":124,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":175,"y":445,"w":124,"h":97}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/FrogThigh2SquishKneelClosed.png": +{ + "frame": {"x":1875,"y":1581,"w":142,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":185,"y":430,"w":142,"h":94}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Heels2Closed.png": +{ + "frame": {"x":718,"y":1985,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/Heels2Hogtie.png": +{ + "frame": {"x":733,"y":1985,"w":3,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":3,"h":2} +}, +"DisplacementMaps/HeelsClosed.png": +{ + "frame": {"x":718,"y":1985,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/HeelsErase.png": +{ + "frame": {"x":745,"y":1984,"w":1,"h":1}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":1,"h":1}, + "sourceSize": {"w":1,"h":1} +}, +"DisplacementMaps/HeelsEraseSpread.png": +{ + "frame": {"x":745,"y":1984,"w":1,"h":1}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":1,"h":1}, + "sourceSize": {"w":1,"h":1} +}, +"DisplacementMaps/HeelsHogtie.png": +{ + "frame": {"x":733,"y":1985,"w":3,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":2}, + "sourceSize": {"w":3,"h":2} +}, +"DisplacementMaps/MittLCrossed.png": +{ + "frame": {"x":726,"y":1985,"w":3,"h":3}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":3,"h":3} +}, +"DisplacementMaps/MittRCrossed.png": +{ + "frame": {"x":726,"y":1985,"w":3,"h":3}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":3,"h":3} +}, +"DisplacementMaps/MittRFront.png": +{ + "frame": {"x":627,"y":1967,"w":67,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":243,"y":230,"w":67,"h":60}, + "sourceSize": {"w":620,"h":339} +}, +"DisplacementMaps/MittsCrossed.png": +{ + "frame": {"x":726,"y":1985,"w":3,"h":3}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":3,"h":3} +}, +"DisplacementMaps/MittsYoked.png": +{ + "frame": {"x":1162,"y":1765,"w":494,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":62,"y":62,"w":494,"h":202}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Null.png": +{ + "frame": {"x":755,"y":1982,"w":1,"h":1}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":1,"h":1}, + "sourceSize": {"w":1,"h":1} +}, +"DisplacementMaps/SockLSquish_ShortHogtie.png": +{ + "frame": {"x":718,"y":1967,"w":15,"h":14}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":15,"h":14}, + "sourceSize": {"w":15,"h":14} +}, +"DisplacementMaps/SockRSquish_ShortHogtie.png": +{ + "frame": {"x":698,"y":1967,"w":16,"h":18}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":16,"h":18}, + "sourceSize": {"w":16,"h":18} +}, +"DisplacementMaps/SockRSquish_ShortKneel.png": +{ + "frame": {"x":755,"y":1967,"w":14,"h":11}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":14,"h":11}, + "sourceSize": {"w":14,"h":11} +}, +"DisplacementMaps/SockRSquish_ShortKneelClosed.png": +{ + "frame": {"x":737,"y":1967,"w":14,"h":13}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":14,"h":13}, + "sourceSize": {"w":14,"h":13} +}, +"DisplacementMaps/TapeAnklesSquishHogtie.png": +{ + "frame": {"x":740,"y":1984,"w":1,"h":2}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":1,"h":2}, + "sourceSize": {"w":1,"h":2} +}, +"DisplacementMaps/TapeFullLeft.png": +{ + "frame": {"x":698,"y":1989,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/TapeFullRight.png": +{ + "frame": {"x":698,"y":1989,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/TapeHeavyLeft.png": +{ + "frame": {"x":698,"y":1989,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/TapeHeavyRight.png": +{ + "frame": {"x":698,"y":1989,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/TapeLightLeft.png": +{ + "frame": {"x":698,"y":1989,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/TapeLightRight.png": +{ + "frame": {"x":698,"y":1989,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/TapeMedLeft.png": +{ + "frame": {"x":698,"y":1989,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/TapeMedRight.png": +{ + "frame": {"x":698,"y":1989,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/TapeTopLeft.png": +{ + "frame": {"x":698,"y":1989,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/TapeTopRight.png": +{ + "frame": {"x":698,"y":1989,"w":4,"h":4}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4}, + "sourceSize": {"w":4,"h":4} +}, +"DisplacementMaps/Template_ClosedL.png": +{ + "frame": {"x":1875,"y":3,"w":166,"h":470}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":237,"y":362,"w":166,"h":470}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Template_ClosedR.png": +{ + "frame": {"x":1875,"y":477,"w":131,"h":466}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":192,"y":361,"w":131,"h":466}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Template_HogtieL.png": +{ + "frame": {"x":1875,"y":1304,"w":133,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":181,"y":444,"w":133,"h":172}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Template_HogtieR.png": +{ + "frame": {"x":1875,"y":1127,"w":140,"h":173}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":246,"y":439,"w":140,"h":173}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Template_Kneel.png": +{ + "frame": {"x":1660,"y":1765,"w":339,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":133,"y":365,"w":339,"h":205}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Template_KneelR.png": +{ + "frame": {"x":1875,"y":947,"w":164,"h":176}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":125,"y":373,"w":164,"h":176}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace0.webp", + "format": "RGBA8888", + "size": {"w":2046,"h":2030}, + "scale": "0.25", + "related_multi_packs": [ "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace0.webp b/TextureAtlas/displace0.webp new file mode 100644 index 000000000..0927e6272 Binary files /dev/null and b/TextureAtlas/displace0.webp differ diff --git a/TextureAtlas/displace1.json b/TextureAtlas/displace1.json new file mode 100644 index 000000000..a87c77957 --- /dev/null +++ b/TextureAtlas/displace1.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/AnklesSquishClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/AnklesSquishKneel.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BalletCuffsClosed.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BalletCuffsSpread.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BalletEraseSpread.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BalletRightEraseClosed.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace1.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace1.webp b/TextureAtlas/displace1.webp new file mode 100644 index 000000000..b63a728e3 Binary files /dev/null and b/TextureAtlas/displace1.webp differ diff --git a/TextureAtlas/displace10.json b/TextureAtlas/displace10.json new file mode 100644 index 000000000..f4578733a --- /dev/null +++ b/TextureAtlas/displace10.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/SockLSquish_LongKneelClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_LongSpread.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_MidClosed.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_MidHogtie.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_MidKneel.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_MidKneelClosed.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace10.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace10.webp b/TextureAtlas/displace10.webp new file mode 100644 index 000000000..aef2a04b4 Binary files /dev/null and b/TextureAtlas/displace10.webp differ diff --git a/TextureAtlas/displace11.json b/TextureAtlas/displace11.json new file mode 100644 index 000000000..a72ca4ccd --- /dev/null +++ b/TextureAtlas/displace11.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/SockLSquish_MidSpread.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_ShortClosed.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_ShortKneel.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_ShortKneelClosed.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_ShortSpread.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockRSquish_LongClosed.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace11.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace11.webp b/TextureAtlas/displace11.webp new file mode 100644 index 000000000..a8bac0dd3 Binary files /dev/null and b/TextureAtlas/displace11.webp differ diff --git a/TextureAtlas/displace12.json b/TextureAtlas/displace12.json new file mode 100644 index 000000000..b0187f300 --- /dev/null +++ b/TextureAtlas/displace12.json @@ -0,0 +1,69 @@ +{"frames": { + +"DisplacementMaps/SockRSquish_LongHogtie.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockRSquish_LongKneel.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockRSquish_LongKneelClosed.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockRSquish_LongSpread.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockRSquish_MidClosed.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockRSquish_MidHogtie.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockRSquish_MidKneel.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace12.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace12.webp b/TextureAtlas/displace12.webp new file mode 100644 index 000000000..a7edf73fb Binary files /dev/null and b/TextureAtlas/displace12.webp differ diff --git a/TextureAtlas/displace13.json b/TextureAtlas/displace13.json new file mode 100644 index 000000000..fb18b2452 --- /dev/null +++ b/TextureAtlas/displace13.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/SockRSquish_MidKneelClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockRSquish_MidSpread.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockRSquish_ShortClosed.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockRSquish_ShortSpread.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeAnklesSquishClosed.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeArmsBoxtie.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace13.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace13.webp b/TextureAtlas/displace13.webp new file mode 100644 index 000000000..d7efe8cec Binary files /dev/null and b/TextureAtlas/displace13.webp differ diff --git a/TextureAtlas/displace14.json b/TextureAtlas/displace14.json new file mode 100644 index 000000000..c7c68b81b --- /dev/null +++ b/TextureAtlas/displace14.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/TapeClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeFullRightCrossed.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeFullRightWristtie.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeMedLeftBoxtie.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeMedLeftCrossed.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeMedLeftWristtie.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace14.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace14.webp b/TextureAtlas/displace14.webp new file mode 100644 index 000000000..01077f845 Binary files /dev/null and b/TextureAtlas/displace14.webp differ diff --git a/TextureAtlas/displace15.json b/TextureAtlas/displace15.json new file mode 100644 index 000000000..85d7878de --- /dev/null +++ b/TextureAtlas/displace15.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/TapeTopLeftBoxtie.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeTopLeftCrossed.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeTopLeftWristtie.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeTopRightBoxtie.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeTopRightCrossed.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TapeTopRightWristtie.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace15.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace15.webp b/TextureAtlas/displace15.webp new file mode 100644 index 000000000..f54b7d060 Binary files /dev/null and b/TextureAtlas/displace15.webp differ diff --git a/TextureAtlas/displace16.json b/TextureAtlas/displace16.json new file mode 100644 index 000000000..b53a76b91 --- /dev/null +++ b/TextureAtlas/displace16.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/Thigh1SquishClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Thigh1SquishHogtie.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Thigh1SquishKneelClosed.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Thigh2SquishClosed.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Thigh2SquishHogtie.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Thigh2SquishKneelClosed.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace16.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace16.webp b/TextureAtlas/displace16.webp new file mode 100644 index 000000000..ef6ab5c92 Binary files /dev/null and b/TextureAtlas/displace16.webp differ diff --git a/TextureAtlas/displace17.json b/TextureAtlas/displace17.json new file mode 100644 index 000000000..bc51ba472 --- /dev/null +++ b/TextureAtlas/displace17.json @@ -0,0 +1,69 @@ +{"frames": { + +"DisplacementMaps/Thigh3SquishClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Thigh3SquishHogtie.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Thigh3SquishKneelClosed.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/ThighCuffsLeftClosed.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/ThighCuffsLeftKneel.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/ThighCuffsLeftKneelClosed.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/ThighCuffsRightKneel.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace17.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace17.webp b/TextureAtlas/displace17.webp new file mode 100644 index 000000000..b66395a9d Binary files /dev/null and b/TextureAtlas/displace17.webp differ diff --git a/TextureAtlas/displace18.json b/TextureAtlas/displace18.json new file mode 100644 index 000000000..693082348 --- /dev/null +++ b/TextureAtlas/displace18.json @@ -0,0 +1,117 @@ +{"frames": { + +"DisplacementMaps/BalletClosed.png": +{ + "frame": {"x":627,"y":3,"w":426,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":426,"h":877}, + "sourceSize": {"w":426,"h":877} +}, +"DisplacementMaps/BedStrapsHogtie.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":613}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":613}, + "sourceSize": {"w":620,"h":613} +}, +"DisplacementMaps/BubbleHead.png": +{ + "frame": {"x":1057,"y":872,"w":620,"h":657}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":657}, + "sourceSize": {"w":620,"h":657} +}, +"DisplacementMaps/BustHuge.png": +{ + "frame": {"x":1057,"y":1533,"w":620,"h":457}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":457}, + "sourceSize": {"w":620,"h":457} +}, +"DisplacementMaps/ElbowCuffLeftYoked.png": +{ + "frame": {"x":3,"y":1501,"w":537,"h":455}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":537,"h":455}, + "sourceSize": {"w":537,"h":455} +}, +"DisplacementMaps/ElbowCuffRightWristtie.png": +{ + "frame": {"x":1681,"y":1540,"w":351,"h":465}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":351,"h":465}, + "sourceSize": {"w":351,"h":465} +}, +"DisplacementMaps/FrogThigh1SquishKneelClosed.png": +{ + "frame": {"x":3,"y":1960,"w":122,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":166,"y":454,"w":122,"h":80}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SlimeLeftClosed.png": +{ + "frame": {"x":1478,"y":3,"w":436,"h":853}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":436,"h":853}, + "sourceSize": {"w":436,"h":853} +}, +"DisplacementMaps/SlimeRightClosed.png": +{ + "frame": {"x":1057,"y":3,"w":417,"h":865}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":417,"h":865}, + "sourceSize": {"w":417,"h":865} +}, +"DisplacementMaps/TapeFullLeftWristtie.png": +{ + "frame": {"x":544,"y":1731,"w":471,"h":314}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":471,"h":314}, + "sourceSize": {"w":471,"h":314} +}, +"DisplacementMaps/Template_Closed.png": +{ + "frame": {"x":1681,"y":860,"w":240,"h":676}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":181,"y":165,"w":240,"h":676}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Xray.png": +{ + "frame": {"x":627,"y":884,"w":426,"h":843}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":426,"h":843}, + "sourceSize": {"w":426,"h":843} +}, +"DisplacementMaps/Yoke.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace18.webp", + "format": "RGBA8888", + "size": {"w":2035,"h":2048}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace18.webp b/TextureAtlas/displace18.webp new file mode 100644 index 000000000..18244351a Binary files /dev/null and b/TextureAtlas/displace18.webp differ diff --git a/TextureAtlas/displace19.json b/TextureAtlas/displace19.json new file mode 100644 index 000000000..8ef5fbae0 --- /dev/null +++ b/TextureAtlas/displace19.json @@ -0,0 +1,173 @@ +{"frames": { + +"DisplacementMaps/ArmHarnessSquish.png": +{ + "frame": {"x":994,"y":1786,"w":410,"h":225}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":410,"h":225}, + "sourceSize": {"w":410,"h":225} +}, +"DisplacementMaps/BalletCuffsKneel.png": +{ + "frame": {"x":471,"y":1190,"w":519,"h":609}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":519,"h":609}, + "sourceSize": {"w":519,"h":609} +}, +"DisplacementMaps/BalletKneel.png": +{ + "frame": {"x":1465,"y":739,"w":519,"h":609}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":519,"h":609}, + "sourceSize": {"w":519,"h":609} +}, +"DisplacementMaps/BeltFeet1SquishClosed.png": +{ + "frame": {"x":627,"y":3,"w":412,"h":744}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":412,"h":744}, + "sourceSize": {"w":412,"h":744} +}, +"DisplacementMaps/BeltLegs2SquishHogtie.png": +{ + "frame": {"x":1667,"y":3,"w":282,"h":627}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":282,"h":627}, + "sourceSize": {"w":282,"h":627} +}, +"DisplacementMaps/Fiddle.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":558}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":558}, + "sourceSize": {"w":620,"h":558} +}, +"DisplacementMaps/ForeArm2SquishWristtie.png": +{ + "frame": {"x":994,"y":1400,"w":620,"h":382}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":382}, + "sourceSize": {"w":620,"h":382} +}, +"DisplacementMaps/FrogThigh3SquishKneel.png": +{ + "frame": {"x":3,"y":1901,"w":179,"h":114}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":186,"y":420,"w":179,"h":114}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/FrogThigh3SquishKneelClosed.png": +{ + "frame": {"x":1667,"y":634,"w":171,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":199,"y":405,"w":171,"h":99}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/GuardLeftFree.png": +{ + "frame": {"x":471,"y":751,"w":620,"h":435}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":435}, + "sourceSize": {"w":620,"h":435} +}, +"DisplacementMaps/GuardLeftFront.png": +{ + "frame": {"x":1043,"y":3,"w":620,"h":435}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":435}, + "sourceSize": {"w":620,"h":435} +}, +"DisplacementMaps/LegbinderSquishHogtie.png": +{ + "frame": {"x":3,"y":565,"w":464,"h":700}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":464,"h":700}, + "sourceSize": {"w":464,"h":700} +}, +"DisplacementMaps/MittRYoked.png": +{ + "frame": {"x":732,"y":1803,"w":185,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":82,"y":100,"w":185,"h":182}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/MittsFree.png": +{ + "frame": {"x":1043,"y":442,"w":620,"h":293}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":198,"w":620,"h":293}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SlimeThighsHogtie.png": +{ + "frame": {"x":3,"y":565,"w":464,"h":700}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":464,"h":700}, + "sourceSize": {"w":464,"h":700} +}, +"DisplacementMaps/Template_Free.png": +{ + "frame": {"x":1095,"y":739,"w":366,"h":657}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":114,"y":181,"w":366,"h":657}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Template_KneelClosedR.png": +{ + "frame": {"x":1408,"y":1786,"w":174,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":132,"y":366,"w":174,"h":186}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/ThighCuffsRightClosed.png": +{ + "frame": {"x":3,"y":1269,"w":314,"h":628}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":314,"h":628}, + "sourceSize": {"w":314,"h":628} +}, +"DisplacementMaps/ThighCuffsRightSpread.png": +{ + "frame": {"x":1618,"y":1352,"w":273,"h":615}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":273,"h":615}, + "sourceSize": {"w":273,"h":615} +}, +"DisplacementMaps/XrayFace.png": +{ + "frame": {"x":321,"y":1803,"w":407,"h":207}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":407,"h":207}, + "sourceSize": {"w":407,"h":207} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace19.webp", + "format": "RGBA8888", + "size": {"w":1987,"h":2018}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace19.webp b/TextureAtlas/displace19.webp new file mode 100644 index 000000000..d45666bbb Binary files /dev/null and b/TextureAtlas/displace19.webp differ diff --git a/TextureAtlas/displace2.json b/TextureAtlas/displace2.json new file mode 100644 index 000000000..45b1da0b2 --- /dev/null +++ b/TextureAtlas/displace2.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/BalletRightEraseKneel.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BalletSpread.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BallSuit.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BedStrapsHogtieBoxtie.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Belt.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BeltFeet1SquishKneelClosed.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace2.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace2.webp b/TextureAtlas/displace2.webp new file mode 100644 index 000000000..c6eeaca75 Binary files /dev/null and b/TextureAtlas/displace2.webp differ diff --git a/TextureAtlas/displace20.json b/TextureAtlas/displace20.json new file mode 100644 index 000000000..f61dc7000 --- /dev/null +++ b/TextureAtlas/displace20.json @@ -0,0 +1,173 @@ +{"frames": { + +"DisplacementMaps/BalletCuffsKneelClosed.png": +{ + "frame": {"x":1502,"y":1229,"w":511,"h":590}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":511,"h":590}, + "sourceSize": {"w":511,"h":590} +}, +"DisplacementMaps/ButtSleeves.png": +{ + "frame": {"x":1592,"y":616,"w":433,"h":548}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":433,"h":548}, + "sourceSize": {"w":433,"h":548} +}, +"DisplacementMaps/CorsetSquishTight.png": +{ + "frame": {"x":976,"y":1229,"w":522,"h":477}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":522,"h":477}, + "sourceSize": {"w":522,"h":477} +}, +"DisplacementMaps/CuffLeftFree.png": +{ + "frame": {"x":526,"y":616,"w":539,"h":559}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":539,"h":559}, + "sourceSize": {"w":539,"h":559} +}, +"DisplacementMaps/CuffLeftYoked.png": +{ + "frame": {"x":1073,"y":3,"w":570,"h":291}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":570,"h":291}, + "sourceSize": {"w":570,"h":291} +}, +"DisplacementMaps/ElbowCuffRightUp.png": +{ + "frame": {"x":1612,"y":298,"w":390,"h":310}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":390,"h":310}, + "sourceSize": {"w":390,"h":310} +}, +"DisplacementMaps/EraseSkirtSplit.png": +{ + "frame": {"x":526,"y":1179,"w":446,"h":605}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":446,"h":605}, + "sourceSize": {"w":446,"h":605} +}, +"DisplacementMaps/GuardLeftYoked.png": +{ + "frame": {"x":1073,"y":298,"w":535,"h":314}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":535,"h":314}, + "sourceSize": {"w":535,"h":314} +}, +"DisplacementMaps/LegbinderSquishKneelClosed.png": +{ + "frame": {"x":550,"y":3,"w":519,"h":609}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":519,"h":609}, + "sourceSize": {"w":519,"h":609} +}, +"DisplacementMaps/MittLFree.png": +{ + "frame": {"x":307,"y":1820,"w":172,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":358,"y":327,"w":172,"h":178}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/MittLYoked.png": +{ + "frame": {"x":1693,"y":1823,"w":183,"h":166}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":351,"y":71,"w":183,"h":166}, + "sourceSize": {"w":582,"h":291} +}, +"DisplacementMaps/MittsFront.png": +{ + "frame": {"x":1483,"y":1823,"w":206,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":190,"y":167,"w":206,"h":149}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/PetsuitSquish.png": +{ + "frame": {"x":3,"y":602,"w":519,"h":609}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":519,"h":609}, + "sourceSize": {"w":519,"h":609} +}, +"DisplacementMaps/SlimeThighsKneelClosed.png": +{ + "frame": {"x":1069,"y":616,"w":519,"h":609}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":519,"h":609}, + "sourceSize": {"w":519,"h":609} +}, +"DisplacementMaps/SovietHatErase.png": +{ + "frame": {"x":490,"y":1788,"w":369,"h":127}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":369,"h":127}, + "sourceSize": {"w":369,"h":127} +}, +"DisplacementMaps/TapeAnklesSquishKneel.png": +{ + "frame": {"x":3,"y":1215,"w":483,"h":601}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":483,"h":601}, + "sourceSize": {"w":483,"h":601} +}, +"DisplacementMaps/TapeFullLeftCrossed.png": +{ + "frame": {"x":976,"y":1710,"w":503,"h":318}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":503,"h":318}, + "sourceSize": {"w":503,"h":318} +}, +"DisplacementMaps/Template_KneelClosedL.png": +{ + "frame": {"x":1647,"y":3,"w":307,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":170,"y":370,"w":307,"h":193}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Template_KneelL.png": +{ + "frame": {"x":3,"y":1820,"w":300,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":169,"y":377,"w":300,"h":182}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/ThighCuffsLeftSpread.png": +{ + "frame": {"x":3,"y":3,"w":543,"h":595}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":543,"h":595}, + "sourceSize": {"w":543,"h":595} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace20.webp", + "format": "RGBA8888", + "size": {"w":2028,"h":2031}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace20.webp b/TextureAtlas/displace20.webp new file mode 100644 index 000000000..1591437ed Binary files /dev/null and b/TextureAtlas/displace20.webp differ diff --git a/TextureAtlas/displace21.json b/TextureAtlas/displace21.json new file mode 100644 index 000000000..737a52daa --- /dev/null +++ b/TextureAtlas/displace21.json @@ -0,0 +1,165 @@ +{"frames": { + +"DisplacementMaps/Arm1SquishBoxtie.png": +{ + "frame": {"x":3,"y":1160,"w":510,"h":447}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":510,"h":447}, + "sourceSize": {"w":510,"h":447} +}, +"DisplacementMaps/Arm2SquishBoxtie.png": +{ + "frame": {"x":1037,"y":3,"w":508,"h":342}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":508,"h":342}, + "sourceSize": {"w":508,"h":342} +}, +"DisplacementMaps/Arm2SquishWristtie.png": +{ + "frame": {"x":1549,"y":3,"w":492,"h":335}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":492,"h":335}, + "sourceSize": {"w":492,"h":335} +}, +"DisplacementMaps/BalletKneelClosed.png": +{ + "frame": {"x":522,"y":3,"w":511,"h":590}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":511,"h":590}, + "sourceSize": {"w":511,"h":590} +}, +"DisplacementMaps/BeltLegs1SquishHogtie.png": +{ + "frame": {"x":979,"y":597,"w":262,"h":564}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":262,"h":564}, + "sourceSize": {"w":262,"h":564} +}, +"DisplacementMaps/BinderLeftWristtie.png": +{ + "frame": {"x":967,"y":1165,"w":505,"h":400}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":505,"h":400}, + "sourceSize": {"w":505,"h":400} +}, +"DisplacementMaps/CuffsSquishFront.png": +{ + "frame": {"x":515,"y":1703,"w":433,"h":341}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":433,"h":341}, + "sourceSize": {"w":433,"h":341} +}, +"DisplacementMaps/EraseCorsetEncase.png": +{ + "frame": {"x":1245,"y":349,"w":483,"h":560}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":483,"h":560}, + "sourceSize": {"w":483,"h":560} +}, +"DisplacementMaps/EraseCorsetKneel.png": +{ + "frame": {"x":1476,"y":913,"w":483,"h":560}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":483,"h":560}, + "sourceSize": {"w":483,"h":560} +}, +"DisplacementMaps/EraseCorsetKneelEncase.png": +{ + "frame": {"x":1245,"y":349,"w":483,"h":560}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":483,"h":560}, + "sourceSize": {"w":483,"h":560} +}, +"DisplacementMaps/HeelsKneel.png": +{ + "frame": {"x":3,"y":3,"w":515,"h":567}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":515,"h":567}, + "sourceSize": {"w":515,"h":567} +}, +"DisplacementMaps/JacketArmsWristtie.png": +{ + "frame": {"x":1476,"y":1477,"w":483,"h":464}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":483,"h":464}, + "sourceSize": {"w":483,"h":464} +}, +"DisplacementMaps/JacketCrossed.png": +{ + "frame": {"x":967,"y":1569,"w":476,"h":462}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":476,"h":462}, + "sourceSize": {"w":476,"h":462} +}, +"DisplacementMaps/Leg1SquishClosed.png": +{ + "frame": {"x":464,"y":597,"w":511,"h":382}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":511,"h":382}, + "sourceSize": {"w":511,"h":382} +}, +"DisplacementMaps/MittRFree.png": +{ + "frame": {"x":464,"y":983,"w":180,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":61,"y":227,"w":180,"h":168}, + "sourceSize": {"w":241,"h":395} +}, +"DisplacementMaps/TapeAnklesSquishKneelClosed.png": +{ + "frame": {"x":3,"y":574,"w":457,"h":582}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":457,"h":582}, + "sourceSize": {"w":457,"h":582} +}, +"DisplacementMaps/TapeLightLeftBoxtie.png": +{ + "frame": {"x":3,"y":1611,"w":508,"h":413}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":508,"h":413}, + "sourceSize": {"w":508,"h":413} +}, +"DisplacementMaps/ThighCuffsRightKneelClosed.png": +{ + "frame": {"x":1732,"y":342,"w":297,"h":513}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":297,"h":513}, + "sourceSize": {"w":297,"h":513} +}, +"DisplacementMaps/XrayPanties.png": +{ + "frame": {"x":517,"y":1155,"w":446,"h":544}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":446,"h":544}, + "sourceSize": {"w":446,"h":544} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace21.webp", + "format": "RGBA8888", + "size": {"w":2044,"h":2047}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace21.webp b/TextureAtlas/displace21.webp new file mode 100644 index 000000000..2c8532e14 Binary files /dev/null and b/TextureAtlas/displace21.webp differ diff --git a/TextureAtlas/displace22.json b/TextureAtlas/displace22.json new file mode 100644 index 000000000..a654ae163 --- /dev/null +++ b/TextureAtlas/displace22.json @@ -0,0 +1,189 @@ +{"frames": { + +"DisplacementMaps/ArmStrapCrossed.png": +{ + "frame": {"x":512,"y":389,"w":381,"h":452}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":381,"h":452}, + "sourceSize": {"w":381,"h":452} +}, +"DisplacementMaps/BeltLegs1SquishKneelClosed.png": +{ + "frame": {"x":3,"y":857,"w":257,"h":477}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":257,"h":477}, + "sourceSize": {"w":257,"h":477} +}, +"DisplacementMaps/BinderRightWristtie.png": +{ + "frame": {"x":3,"y":460,"w":505,"h":393}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":505,"h":393}, + "sourceSize": {"w":505,"h":393} +}, +"DisplacementMaps/CuffRightYoked.png": +{ + "frame": {"x":1426,"y":1730,"w":264,"h":268}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":264,"h":268}, + "sourceSize": {"w":264,"h":268} +}, +"DisplacementMaps/ElbowCuffLeftBoxtie.png": +{ + "frame": {"x":469,"y":3,"w":498,"h":382}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":498,"h":382}, + "sourceSize": {"w":498,"h":382} +}, +"DisplacementMaps/ElbowCuffLeftCrossed.png": +{ + "frame": {"x":1395,"y":449,"w":487,"h":385}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":487,"h":385}, + "sourceSize": {"w":487,"h":385} +}, +"DisplacementMaps/ElbowCuffLeftFront.png": +{ + "frame": {"x":897,"y":449,"w":494,"h":385}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":494,"h":385}, + "sourceSize": {"w":494,"h":385} +}, +"DisplacementMaps/ElbowCuffLeftWristtie.png": +{ + "frame": {"x":931,"y":1300,"w":491,"h":442}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":491,"h":442}, + "sourceSize": {"w":491,"h":442} +}, +"DisplacementMaps/ElbowCuffRightYoked.png": +{ + "frame": {"x":264,"y":1167,"w":378,"h":450}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":378,"h":450}, + "sourceSize": {"w":378,"h":450} +}, +"DisplacementMaps/ForeArm1SquishWristtie.png": +{ + "frame": {"x":1469,"y":3,"w":487,"h":437}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":487,"h":437}, + "sourceSize": {"w":487,"h":437} +}, +"DisplacementMaps/GuardRightYoked.png": +{ + "frame": {"x":3,"y":1338,"w":229,"h":339}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":229,"h":339}, + "sourceSize": {"w":229,"h":339} +}, +"DisplacementMaps/HideBoxtieHand.png": +{ + "frame": {"x":236,"y":1621,"w":395,"h":392}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":395,"h":392}, + "sourceSize": {"w":395,"h":392} +}, +"DisplacementMaps/MittLFront.png": +{ + "frame": {"x":1694,"y":1730,"w":236,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":45,"w":236,"h":251}, + "sourceSize": {"w":400,"h":348} +}, +"DisplacementMaps/TapeFullLeftBoxtie.png": +{ + "frame": {"x":512,"y":845,"w":498,"h":318}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":498,"h":318}, + "sourceSize": {"w":498,"h":318} +}, +"DisplacementMaps/TapeHeavyLeftBoxtie.png": +{ + "frame": {"x":1325,"y":838,"w":488,"h":438}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":488,"h":438}, + "sourceSize": {"w":488,"h":438} +}, +"DisplacementMaps/TapeHeavyLeftCrossed.png": +{ + "frame": {"x":971,"y":3,"w":494,"h":442}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":494,"h":442}, + "sourceSize": {"w":494,"h":442} +}, +"DisplacementMaps/TapeHeavyRightBoxtie.png": +{ + "frame": {"x":635,"y":1638,"w":280,"h":395}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":280,"h":395}, + "sourceSize": {"w":280,"h":395} +}, +"DisplacementMaps/TapeHeavyRightWristtie.png": +{ + "frame": {"x":646,"y":1167,"w":281,"h":467}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":281,"h":467}, + "sourceSize": {"w":281,"h":467} +}, +"DisplacementMaps/TapeLightLeftWristtie.png": +{ + "frame": {"x":3,"y":3,"w":462,"h":453}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":462,"h":453}, + "sourceSize": {"w":462,"h":453} +}, +"DisplacementMaps/TapeMedRightWristtie.png": +{ + "frame": {"x":1014,"y":838,"w":307,"h":458}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":307,"h":458}, + "sourceSize": {"w":307,"h":458} +}, +"DisplacementMaps/Template_Hogtie.png": +{ + "frame": {"x":264,"y":857,"w":240,"h":257}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":181,"y":358,"w":240,"h":257}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/TightBelt.png": +{ + "frame": {"x":1426,"y":1280,"w":460,"h":446}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":460,"h":446}, + "sourceSize": {"w":460,"h":446} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace22.webp", + "format": "RGBA8888", + "size": {"w":1959,"h":2036}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace22.webp b/TextureAtlas/displace22.webp new file mode 100644 index 000000000..9ea10a1f1 Binary files /dev/null and b/TextureAtlas/displace22.webp differ diff --git a/TextureAtlas/displace23.json b/TextureAtlas/displace23.json new file mode 100644 index 000000000..0a4eb8445 --- /dev/null +++ b/TextureAtlas/displace23.json @@ -0,0 +1,157 @@ +{"frames": { + +"DisplacementMaps/Arm1SquishWristtie.png": +{ + "frame": {"x":975,"y":407,"w":482,"h":357}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":482,"h":357}, + "sourceSize": {"w":482,"h":357} +}, +"DisplacementMaps/BinderLeftBoxtie.png": +{ + "frame": {"x":953,"y":3,"w":482,"h":400}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":482,"h":400}, + "sourceSize": {"w":482,"h":400} +}, +"DisplacementMaps/BinderRightBoxtie.png": +{ + "frame": {"x":493,"y":861,"w":482,"h":400}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":482,"h":400}, + "sourceSize": {"w":482,"h":400} +}, +"DisplacementMaps/Breastplate.png": +{ + "frame": {"x":1463,"y":1620,"w":449,"h":376}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":449,"h":376}, + "sourceSize": {"w":449,"h":376} +}, +"DisplacementMaps/CuffsSquishCrossed.png": +{ + "frame": {"x":3,"y":1319,"w":345,"h":433}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":345,"h":433}, + "sourceSize": {"w":345,"h":433} +}, +"DisplacementMaps/ElbowCuffLeftFree.png": +{ + "frame": {"x":463,"y":3,"w":486,"h":405}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":486,"h":405}, + "sourceSize": {"w":486,"h":405} +}, +"DisplacementMaps/ElbowCuffRightCrossed.png": +{ + "frame": {"x":3,"y":869,"w":352,"h":446}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":352,"h":446}, + "sourceSize": {"w":352,"h":446} +}, +"DisplacementMaps/JacketArmsBoxtie.png": +{ + "frame": {"x":1439,"y":3,"w":467,"h":399}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":467,"h":399}, + "sourceSize": {"w":467,"h":399} +}, +"DisplacementMaps/JacketArmsCrossed.png": +{ + "frame": {"x":979,"y":1215,"w":480,"h":409}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":480,"h":409}, + "sourceSize": {"w":480,"h":409} +}, +"DisplacementMaps/JacketBoxtie.png": +{ + "frame": {"x":1421,"y":768,"w":478,"h":409}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":478,"h":409}, + "sourceSize": {"w":478,"h":409} +}, +"DisplacementMaps/JacketWristtie.png": +{ + "frame": {"x":3,"y":3,"w":456,"h":446}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":456,"h":446}, + "sourceSize": {"w":456,"h":446} +}, +"DisplacementMaps/LightMaidRightArmErase.png": +{ + "frame": {"x":359,"y":1265,"w":445,"h":439}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":445,"h":439}, + "sourceSize": {"w":445,"h":439} +}, +"DisplacementMaps/ReversePrayer.png": +{ + "frame": {"x":3,"y":453,"w":486,"h":412}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":486,"h":412}, + "sourceSize": {"w":486,"h":412} +}, +"DisplacementMaps/TapeFullRightBoxtie.png": +{ + "frame": {"x":1461,"y":406,"w":281,"h":351}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":281,"h":351}, + "sourceSize": {"w":281,"h":351} +}, +"DisplacementMaps/TapeHeavyLeftWristtie.png": +{ + "frame": {"x":1463,"y":1181,"w":458,"h":435}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":458,"h":435}, + "sourceSize": {"w":458,"h":435} +}, +"DisplacementMaps/TapeHeavyRightCrossed.png": +{ + "frame": {"x":979,"y":768,"w":438,"h":443}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":438,"h":443}, + "sourceSize": {"w":438,"h":443} +}, +"DisplacementMaps/TapeLightLeftCrossed.png": +{ + "frame": {"x":493,"y":412,"w":478,"h":445}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":478,"h":445}, + "sourceSize": {"w":478,"h":445} +}, +"DisplacementMaps/XrayBra.png": +{ + "frame": {"x":808,"y":1628,"w":431,"h":379}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":431,"h":379}, + "sourceSize": {"w":431,"h":379} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace23.webp", + "format": "RGBA8888", + "size": {"w":1924,"h":2010}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace23.webp b/TextureAtlas/displace23.webp new file mode 100644 index 000000000..a390b902b Binary files /dev/null and b/TextureAtlas/displace23.webp differ diff --git a/TextureAtlas/displace24.json b/TextureAtlas/displace24.json new file mode 100644 index 000000000..3117cbd6e --- /dev/null +++ b/TextureAtlas/displace24.json @@ -0,0 +1,125 @@ +{"frames": { + +"DisplacementMaps/CrotchropeSquished.png": +{ + "frame": {"x":3,"y":3,"w":449,"h":432}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":449,"h":432}, + "sourceSize": {"w":449,"h":432} +}, +"DisplacementMaps/CuffRightFree.png": +{ + "frame": {"x":676,"y":435,"w":286,"h":427}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":286,"h":427}, + "sourceSize": {"w":286,"h":427} +}, +"DisplacementMaps/ElbowCuffRightBoxtie.png": +{ + "frame": {"x":797,"y":3,"w":371,"h":424}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":371,"h":424}, + "sourceSize": {"w":371,"h":424} +}, +"DisplacementMaps/ElbowCuffRightFree.png": +{ + "frame": {"x":3,"y":439,"w":384,"h":430}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":384,"h":430}, + "sourceSize": {"w":384,"h":430} +}, +"DisplacementMaps/ElbowCuffRightFront.png": +{ + "frame": {"x":456,"y":3,"w":337,"h":428}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":337,"h":428}, + "sourceSize": {"w":337,"h":428} +}, +"DisplacementMaps/GuardRightFree.png": +{ + "frame": {"x":1172,"y":3,"w":301,"h":415}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":301,"h":415}, + "sourceSize": {"w":301,"h":415} +}, +"DisplacementMaps/GuardRightFront.png": +{ + "frame": {"x":676,"y":866,"w":287,"h":362}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":287,"h":362}, + "sourceSize": {"w":287,"h":362} +}, +"DisplacementMaps/LaceChest.png": +{ + "frame": {"x":967,"y":858,"w":429,"h":373}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":429,"h":373}, + "sourceSize": {"w":429,"h":373} +}, +"DisplacementMaps/TapeLightRightBoxtie.png": +{ + "frame": {"x":1400,"y":839,"w":272,"h":393}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":272,"h":393}, + "sourceSize": {"w":272,"h":393} +}, +"DisplacementMaps/TapeLightRightCrossed.png": +{ + "frame": {"x":1477,"y":3,"w":278,"h":413}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":278,"h":413}, + "sourceSize": {"w":278,"h":413} +}, +"DisplacementMaps/TapeLightRightWristtie.png": +{ + "frame": {"x":391,"y":439,"w":281,"h":429}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":281,"h":429}, + "sourceSize": {"w":281,"h":429} +}, +"DisplacementMaps/TapeMedRightBoxtie.png": +{ + "frame": {"x":966,"y":431,"w":317,"h":423}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":317,"h":423}, + "sourceSize": {"w":317,"h":423} +}, +"DisplacementMaps/TapeMedRightCrossed.png": +{ + "frame": {"x":1287,"y":422,"w":302,"h":413}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":302,"h":413}, + "sourceSize": {"w":302,"h":413} +}, +"DisplacementMaps/TightUpperSquish.png": +{ + "frame": {"x":3,"y":873,"w":403,"h":359}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":403,"h":359}, + "sourceSize": {"w":403,"h":359} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace24.webp", + "format": "RGBA8888", + "size": {"w":1758,"h":1235}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace24.webp b/TextureAtlas/displace24.webp new file mode 100644 index 000000000..9da57bfae Binary files /dev/null and b/TextureAtlas/displace24.webp differ diff --git a/TextureAtlas/displace3.json b/TextureAtlas/displace3.json new file mode 100644 index 000000000..668e0a4db --- /dev/null +++ b/TextureAtlas/displace3.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/BeltFeet2SquishClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BeltFeet2SquishKneelClosed.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BeltLegs1SquishClosed.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BeltLegs2SquishClosed.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BeltLegs2SquishKneelClosed.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BeltSquish.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace3.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace3.webp b/TextureAtlas/displace3.webp new file mode 100644 index 000000000..1d3c26022 Binary files /dev/null and b/TextureAtlas/displace3.webp differ diff --git a/TextureAtlas/displace4.json b/TextureAtlas/displace4.json new file mode 100644 index 000000000..f81c2a249 --- /dev/null +++ b/TextureAtlas/displace4.json @@ -0,0 +1,77 @@ +{"frames": { + +"DisplacementMaps/BootsClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BootsHogtie.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BootsKneel.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BootsKneelClosed.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BootsShortClosed.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BootsShortHogtie.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BootsShortKneel.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BootsShortKneelClosed.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace4.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace4.webp b/TextureAtlas/displace4.webp new file mode 100644 index 000000000..b5b8b49ba Binary files /dev/null and b/TextureAtlas/displace4.webp differ diff --git a/TextureAtlas/displace5.json b/TextureAtlas/displace5.json new file mode 100644 index 000000000..8f4144377 --- /dev/null +++ b/TextureAtlas/displace5.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/BootsShortSpread.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/BootsSpread.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Bubble.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Bubble2.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Calf1SquishClosed.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Calf1SquishKneelClosed.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace5.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace6.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace5.webp b/TextureAtlas/displace5.webp new file mode 100644 index 000000000..b20ed1025 Binary files /dev/null and b/TextureAtlas/displace5.webp differ diff --git a/TextureAtlas/displace6.json b/TextureAtlas/displace6.json new file mode 100644 index 000000000..668d5bd93 --- /dev/null +++ b/TextureAtlas/displace6.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/Calf2SquishClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Calf2SquishHogtie.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Calf2SquishKneelClosed.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Calf3SquishClosed.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Calf3SquishHogtie.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Calf3SquishKneelClosed.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace6.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace7.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace6.webp b/TextureAtlas/displace6.webp new file mode 100644 index 000000000..3cb8ff602 Binary files /dev/null and b/TextureAtlas/displace6.webp differ diff --git a/TextureAtlas/displace7.json b/TextureAtlas/displace7.json new file mode 100644 index 000000000..8554d62f2 --- /dev/null +++ b/TextureAtlas/displace7.json @@ -0,0 +1,61 @@ +{"frames": { + +"DisplacementMaps/CrystalErase.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/FutureBox.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/HarnessSquish.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Heels2Kneel.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Heels2KneelClosed.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Heels2Spread.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace7.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace8.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace7.webp b/TextureAtlas/displace7.webp new file mode 100644 index 000000000..58ed6b6bd Binary files /dev/null and b/TextureAtlas/displace7.webp differ diff --git a/TextureAtlas/displace8.json b/TextureAtlas/displace8.json new file mode 100644 index 000000000..7f8d1c6cb --- /dev/null +++ b/TextureAtlas/displace8.json @@ -0,0 +1,69 @@ +{"frames": { + +"DisplacementMaps/HeelsEraseClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/HeelsKneelClosed.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/HeelsRightErase.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/HeelsRightErase2.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/HeelsRightErase2Closed.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/HeelsRightEraseClosed.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/HeelsSpread.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace8.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace9.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace8.webp b/TextureAtlas/displace8.webp new file mode 100644 index 000000000..a6fd1dda9 Binary files /dev/null and b/TextureAtlas/displace8.webp differ diff --git a/TextureAtlas/displace9.json b/TextureAtlas/displace9.json new file mode 100644 index 000000000..1f8ad3743 --- /dev/null +++ b/TextureAtlas/displace9.json @@ -0,0 +1,69 @@ +{"frames": { + +"DisplacementMaps/LegbinderSquishClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/Sarco.png": +{ + "frame": {"x":3,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SlimeCorsetErase.png": +{ + "frame": {"x":627,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SlimeThighsClosed.png": +{ + "frame": {"x":3,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_LongClosed.png": +{ + "frame": {"x":1251,"y":3,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_LongHogtie.png": +{ + "frame": {"x":627,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}, +"DisplacementMaps/SockLSquish_LongKneel.png": +{ + "frame": {"x":1251,"y":884,"w":620,"h":877}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":620,"h":877}, + "sourceSize": {"w":620,"h":877} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "displace9.webp", + "format": "RGBA8888", + "size": {"w":1874,"h":1764}, + "scale": "0.25", + "related_multi_packs": [ "displace0.json", "displace1.json", "displace2.json", "displace3.json", "displace4.json", "displace5.json", "displace6.json", "displace7.json", "displace8.json", "displace10.json", "displace11.json", "displace12.json", "displace13.json", "displace14.json", "displace15.json", "displace16.json", "displace17.json", "displace18.json", "displace19.json", "displace20.json", "displace21.json", "displace22.json", "displace23.json", "displace24.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:e8080ca31b63ef791246ea5ac6739043:1482d83a5ac2196d10e8c8a53055230a:44b3d303d8b4a8e896115ea1e938285b$" +} +} diff --git a/TextureAtlas/displace9.webp b/TextureAtlas/displace9.webp new file mode 100644 index 000000000..b6c7ee554 Binary files /dev/null and b/TextureAtlas/displace9.webp differ diff --git a/TextureAtlas/game0.json b/TextureAtlas/game0.json new file mode 100644 index 000000000..7a1bf56a1 --- /dev/null +++ b/TextureAtlas/game0.json @@ -0,0 +1,1078 @@ +{"frames": { + +"Game/Aura/Missiles2.png": +{ + "frame": {"x":1729,"y":1976,"w":18,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":73,"w":18,"h":38}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Muscle.png": +{ + "frame": {"x":1539,"y":1421,"w":136,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":46,"w":136,"h":40}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Null.png": +{ + "frame": {"x":2041,"y":979,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Bullets/DragonIceBolt.png": +{ + "frame": {"x":1655,"y":1976,"w":72,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":17,"w":72,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Earthquake.png": +{ + "frame": {"x":1747,"y":1,"w":300,"h":332}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":28,"w":300,"h":332}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/EarthquakeHit.png": +{ + "frame": {"x":1747,"y":335,"w":300,"h":332}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":28,"w":300,"h":332}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/ElectrifyHit.png": +{ + "frame": {"x":1940,"y":1976,"w":68,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":68,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ExplosiveBarrelHit.png": +{ + "frame": {"x":622,"y":1001,"w":360,"h":360}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":360,"h":360}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/GlueBomb.png": +{ + "frame": {"x":538,"y":1737,"w":82,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":76,"y":63,"w":82,"h":76}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Hairpin.png": +{ + "frame": {"x":1100,"y":2040,"w":39,"h":7}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":34,"w":39,"h":7}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HealHit.png": +{ + "frame": {"x":1747,"y":971,"w":292,"h":303}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":26,"w":292,"h":303}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/HeartArrow.png": +{ + "frame": {"x":887,"y":2031,"w":63,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":30,"w":63,"h":13}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Icebolt.png": +{ + "frame": {"x":1655,"y":1976,"w":72,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":17,"w":72,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexWallVertHit.png": +{ + "frame": {"x":984,"y":1075,"w":8,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":32,"y":0,"w":8,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LiquidMetalBurst.png": +{ + "frame": {"x":538,"y":1895,"w":76,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":70,"y":70,"w":76,"h":76}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/NurseSyringe.png": +{ + "frame": {"x":1680,"y":2018,"w":67,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":23,"w":67,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/PlayerRubberSniper.png": +{ + "frame": {"x":327,"y":2041,"w":54,"h":6}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":33,"w":54,"h":6}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/PoisonDagger.png": +{ + "frame": {"x":1477,"y":1203,"w":62,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":25,"w":62,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RubberNukeExplosionHit.png": +{ + "frame": {"x":622,"y":1363,"w":360,"h":360}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":360,"h":360}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/RubberSniper.png": +{ + "frame": {"x":327,"y":2041,"w":54,"h":6}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":33,"w":54,"h":6}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SagittaBolt.png": +{ + "frame": {"x":1127,"y":1203,"w":70,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":26,"w":70,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SarcoEngulf.png": +{ + "frame": {"x":1541,"y":1203,"w":202,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":0,"w":202,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Sleet.png": +{ + "frame": {"x":622,"y":1725,"w":310,"h":304}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":26,"w":310,"h":304}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/SnareHit.png": +{ + "frame": {"x":2041,"y":979,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WardenCageDrop.png": +{ + "frame": {"x":1749,"y":1976,"w":189,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":64,"w":189,"h":68}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/WitchElectricOrbHit.png": +{ + "frame": {"x":1940,"y":1976,"w":68,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":68,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ColorPicker.png": +{ + "frame": {"x":1747,"y":669,"w":300,"h":300}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":300,"h":300}, + "sourceSize": {"w":302,"h":300} +}, +"Game/Conditions/ArmorBuff.png": +{ + "frame": {"x":934,"y":1924,"w":46,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":46,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Aware.png": +{ + "frame": {"x":1485,"y":1769,"w":10,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":31,"y":7,"w":10,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/acid.png": +{ + "frame": {"x":1485,"y":1740,"w":11,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":43,"w":11,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DialogBackground.png": +{ + "frame": {"x":1,"y":1,"w":996,"h":998}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":996,"h":998}, + "sourceSize": {"w":1000,"h":1000} +}, +"Game/EffectTiles/Lantern.png": +{ + "frame": {"x":952,"y":1997,"w":29,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":19,"w":29,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/TorchUnlit.png": +{ + "frame": {"x":984,"y":1149,"w":13,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":31,"y":32,"w":13,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Angel.png": +{ + "frame": {"x":2010,"y":1882,"w":36,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":3,"w":36,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/SamuraiZombie.png": +{ + "frame": {"x":2010,"y":1537,"w":37,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":1,"w":37,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/WitchEarth.png": +{ + "frame": {"x":2002,"y":1276,"w":44,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":0,"w":44,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Selly.png": +{ + "frame": {"x":2002,"y":1345,"w":44,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":0,"w":44,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Selly.png": +{ + "frame": {"x":1677,"y":1421,"w":66,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":18,"w":66,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/FactoryDoll.png": +{ + "frame": {"x":2010,"y":1605,"w":37,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":3,"w":37,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/FreeDoll.png": +{ + "frame": {"x":2010,"y":1673,"w":37,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":4,"w":37,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/LatexCubeHidden.png": +{ + "frame": {"x":2041,"y":979,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/LatexCubeSmallHidden.png": +{ + "frame": {"x":2041,"y":979,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/NakedElemental.png": +{ + "frame": {"x":2010,"y":1951,"w":37,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":3,"w":37,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/PetChastity.png": +{ + "frame": {"x":2010,"y":1741,"w":37,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":5,"w":37,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SamuraiZombie.png": +{ + "frame": {"x":2010,"y":1537,"w":37,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":1,"w":37,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SarcoMinion.png": +{ + "frame": {"x":2010,"y":2018,"w":37,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":19,"w":37,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/FastZombie.png": +{ + "frame": {"x":952,"y":1822,"w":29,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":1,"w":29,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/FastZombie.png": +{ + "frame": {"x":952,"y":1889,"w":29,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":1,"w":29,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/MageZombie.png": +{ + "frame": {"x":952,"y":1889,"w":29,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":1,"w":29,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/NawashiZombie.png": +{ + "frame": {"x":952,"y":1889,"w":29,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":1,"w":29,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Zombie.png": +{ + "frame": {"x":952,"y":1889,"w":29,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":1,"w":29,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/NawashiZombie.png": +{ + "frame": {"x":1619,"y":2018,"w":59,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":31,"w":59,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Zombie.png": +{ + "frame": {"x":952,"y":1822,"w":29,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":1,"w":29,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Angel.png": +{ + "frame": {"x":2010,"y":1882,"w":36,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":1,"w":36,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Doors/CyberDoorVert.png": +{ + "frame": {"x":1498,"y":1390,"w":39,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":0,"w":39,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Dummy0.png": +{ + "frame": {"x":2010,"y":1463,"w":34,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":34,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Dummy1.png": +{ + "frame": {"x":2010,"y":1809,"w":34,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":1,"w":34,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/HookHigh.png": +{ + "frame": {"x":973,"y":1725,"w":8,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":31,"y":4,"w":8,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Invis.png": +{ + "frame": {"x":2041,"y":979,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/StairsDown.png": +{ + "frame": {"x":2041,"y":979,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/StairsUp.png": +{ + "frame": {"x":2041,"y":979,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":72,"h":72} +}, +"Game/GameLogo.png": +{ + "frame": {"x":983,"y":1740,"w":500,"h":298}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":28,"w":500,"h":298}, + "sourceSize": {"w":512,"h":368} +}, +"Game/Items/ChainSword.png": +{ + "frame": {"x":1199,"y":1203,"w":70,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":26,"w":70,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Dragonslaver.png": +{ + "frame": {"x":1343,"y":1203,"w":65,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":26,"w":65,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Flamberge.png": +{ + "frame": {"x":1485,"y":2018,"w":67,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":22,"w":67,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Foil.png": +{ + "frame": {"x":689,"y":2031,"w":64,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":29,"w":64,"h":15}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/FrostSword.png": +{ + "frame": {"x":618,"y":2031,"w":69,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":29,"w":69,"h":15}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemVulvaPiercings.png": +{ + "frame": {"x":934,"y":1997,"w":14,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":48,"y":43,"w":14,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Knife.png": +{ + "frame": {"x":1141,"y":2040,"w":39,"h":7}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":33,"w":39,"h":7}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/MagicHammer.png": +{ + "frame": {"x":1554,"y":2018,"w":63,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":22,"w":63,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/MagicSword.png": +{ + "frame": {"x":1271,"y":1203,"w":70,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":26,"w":70,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Pike.png": +{ + "frame": {"x":815,"y":2031,"w":70,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":30,"w":70,"h":13}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Rapier.png": +{ + "frame": {"x":1410,"y":1203,"w":65,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":27,"w":65,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/ArmbinderHarness.png": +{ + "frame": {"x":1,"y":1001,"w":619,"h":536}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":71,"y":68,"w":619,"h":536}, + "sourceSize": {"w":717,"h":717} +}, +"Game/Items/Restraint/Handcuffs.png": +{ + "frame": {"x":158,"y":1995,"w":167,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":39,"w":167,"h":47}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Irish8Cuffs.png": +{ + "frame": {"x":327,"y":1995,"w":167,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":39,"w":167,"h":44}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Legirons.png": +{ + "frame": {"x":1485,"y":1976,"w":168,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":42,"w":168,"h":32}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/NippleClamps.png": +{ + "frame": {"x":1498,"y":1300,"w":32,"h":88}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":42,"y":11,"w":32,"h":88}, + "sourceSize": {"w":120,"h":120} +}, +"Game/Items/Restraint/NippleWeights.png": +{ + "frame": {"x":934,"y":1725,"w":37,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":13,"w":37,"h":95}, + "sourceSize": {"w":120,"h":120} +}, +"Game/Items/Restraint/Posture.png": +{ + "frame": {"x":538,"y":1973,"w":78,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":13,"w":78,"h":74}, + "sourceSize": {"w":94,"h":94} +}, +"Game/Items/Restraint/ReversePrayer.png": +{ + "frame": {"x":999,"y":1,"w":746,"h":1200}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":746,"h":1200}, + "sourceSize": {"w":1000,"h":1200} +}, +"Game/Items/Restraint/Sunglasses2.png": +{ + "frame": {"x":1,"y":1995,"w":155,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":71,"w":155,"h":51}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Scroll.png": +{ + "frame": {"x":2002,"y":1414,"w":45,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":11,"w":45,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Spear.png": +{ + "frame": {"x":983,"y":2040,"w":70,"h":7}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":33,"w":70,"h":7}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Sword.png": +{ + "frame": {"x":1127,"y":1203,"w":70,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":26,"w":70,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/MagicBookNew.png": +{ + "frame": {"x":1,"y":1539,"w":535,"h":454}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":56,"y":37,"w":535,"h":454}, + "sourceSize": {"w":640,"h":520} +}, +"Game/Outfits/JailUniform.png": +{ + "frame": {"x":158,"y":1995,"w":167,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":61,"w":167,"h":47}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Outfits/Wolfgirl.png": +{ + "frame": {"x":538,"y":1539,"w":82,"h":196}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":60,"y":0,"w":82,"h":196}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Particles/SealSigil.png": +{ + "frame": {"x":1745,"y":1276,"w":255,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":34,"w":255,"h":186}, + "sourceSize": {"w":256,"h":256} +}, +"Game/Particles/Shockwave.png": +{ + "frame": {"x":1498,"y":1464,"w":510,"h":510}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":510,"h":510}, + "sourceSize": {"w":512,"h":512} +}, +"Game/Particles/ShockwaveShield.png": +{ + "frame": {"x":984,"y":1226,"w":512,"h":512}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":512,"h":512}, + "sourceSize": {"w":512,"h":512} +}, +"Game/Poses/BlushLow.png": +{ + "frame": {"x":383,"y":2041,"w":29,"h":6}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":20,"w":29,"h":6}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Brows2Annoyed.png": +{ + "frame": {"x":186,"y":2044,"w":15,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":17,"w":15,"h":3}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Brows2Sad.png": +{ + "frame": {"x":1485,"y":1903,"w":10,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":13,"w":10,"h":8}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/BrowsAngry.png": +{ + "frame": {"x":1485,"y":1891,"w":11,"h":10}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":12,"w":11,"h":10}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/BrowsAnnoyed.png": +{ + "frame": {"x":203,"y":2044,"w":14,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":17,"w":14,"h":3}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/BrowsSad.png": +{ + "frame": {"x":1485,"y":1913,"w":10,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":13,"w":10,"h":8}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Eyes2Angry.png": +{ + "frame": {"x":973,"y":1755,"w":8,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":13,"w":8,"h":16}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Eyes2Closed.png": +{ + "frame": {"x":478,"y":2041,"w":12,"h":4}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":25,"w":12,"h":4}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Eyes2Dazed.png": +{ + "frame": {"x":1485,"y":1923,"w":10,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":21,"w":10,"h":8}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Eyes2Sly.png": +{ + "frame": {"x":1485,"y":1933,"w":11,"h":7}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":21,"w":11,"h":7}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/EyesAngry.png": +{ + "frame": {"x":1485,"y":1856,"w":9,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":12,"w":9,"h":17}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/EyesClosed.png": +{ + "frame": {"x":463,"y":2041,"w":13,"h":5}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":25,"w":13,"h":5}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/EyesDazed.png": +{ + "frame": {"x":1485,"y":1923,"w":10,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":21,"w":10,"h":8}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/EyesNeutral.png": +{ + "frame": {"x":1485,"y":1839,"w":11,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":14,"w":11,"h":15}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/EyesSly.png": +{ + "frame": {"x":1485,"y":1933,"w":11,"h":7}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":21,"w":11,"h":7}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/MouthDazed.png": +{ + "frame": {"x":414,"y":2041,"w":23,"h":6}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":29,"w":23,"h":6}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/MouthEmbarrassed.png": +{ + "frame": {"x":439,"y":2041,"w":22,"h":6}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":29,"w":22,"h":6}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/MouthFrown.png": +{ + "frame": {"x":1207,"y":2040,"w":20,"h":7}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":29,"w":20,"h":7}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/MouthNeutral.png": +{ + "frame": {"x":158,"y":2044,"w":26,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":30,"w":26,"h":3}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/MouthSmile.png": +{ + "frame": {"x":1182,"y":2040,"w":23,"h":7}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":28,"w":23,"h":7}, + "sourceSize": {"w":46,"h":45} +}, +"Game/ShopBasic/JailUniform.png": +{ + "frame": {"x":158,"y":1995,"w":167,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":61,"w":167,"h":47}, + "sourceSize": {"w":200,"h":200} +}, +"Game/ShopBasic/Wolfgirl.png": +{ + "frame": {"x":538,"y":1539,"w":82,"h":196}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":60,"y":0,"w":82,"h":196}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Spells/AllyDefensive.png": +{ + "frame": {"x":496,"y":1995,"w":40,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":13,"w":40,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ApprenticeEarth.png": +{ + "frame": {"x":934,"y":1879,"w":16,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":17,"w":16,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/EarthformArc.png": +{ + "frame": {"x":1498,"y":1226,"w":40,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":0,"w":40,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Frustration.png": +{ + "frame": {"x":2010,"y":1741,"w":37,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":5,"w":37,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Icebolt.png": +{ + "frame": {"x":1655,"y":1976,"w":72,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":17,"w":72,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Knife.png": +{ + "frame": {"x":1055,"y":2040,"w":43,"h":7}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":33,"w":43,"h":7}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LatexWallVert.png": +{ + "frame": {"x":984,"y":1001,"w":10,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":31,"y":0,"w":10,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/PsychicLink.png": +{ + "frame": {"x":755,"y":2031,"w":58,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":28,"w":58,"h":16}, + "sourceSize": {"w":72,"h":72} +}, +"Game/SprintWarning.png": +{ + "frame": {"x":996,"y":1203,"w":129,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":1,"w":129,"h":17}, + "sourceSize": {"w":145,"h":20} +}, +"Game/UI/BoxTiny.png": +{ + "frame": {"x":2041,"y":971,"w":6,"h":6}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":6,"h":6}, + "sourceSize": {"w":6,"h":6} +}, +"Game/UI/Buttons/RemoveGuestConfirm.png": +{ + "frame": {"x":538,"y":1815,"w":78,"h":78}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":78,"h":78}, + "sourceSize": {"w":78,"h":78} +}, +"Game/UI/escapegrace.png": +{ + "frame": {"x":984,"y":1190,"w":10,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":1,"w":10,"h":34}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/MapMod/None.png": +{ + "frame": {"x":2041,"y":979,"w":3,"h":3}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/RallyWill.png": +{ + "frame": {"x":1485,"y":1875,"w":10,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":10,"h":14}, + "sourceSize": {"w":14,"h":14} +}, +"Game/UI/SideRoom/Unknown.png": +{ + "frame": {"x":1485,"y":1821,"w":11,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":11,"h":16}, + "sourceSize": {"w":16,"h":16} +}, +"Game/UI/UsePotionAncient.png": +{ + "frame": {"x":1485,"y":1799,"w":11,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":4,"w":11,"h":20}, + "sourceSize": {"w":44,"h":26} +}, +"Game/WarningHighlightSpecialBasic.png": +{ + "frame": {"x":934,"y":1822,"w":14,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":8,"w":14,"h":55}, + "sourceSize": {"w":72,"h":72} +}}, +"animations": { + "Game/Aura/Airbender": ["Game/Aura/Airbender0.png","Game/Aura/Airbender1.png","Game/Aura/Airbender2.png"], + "Game/Aura/Missiles": ["Game/Aura/Missiles0.png","Game/Aura/Missiles1.png","Game/Aura/Missiles2.png","Game/Aura/Missiles3.png","Game/Aura/Missiles4.png"], + "Game/Buffs/Vibe": ["Game/Buffs/Vibe0.png","Game/Buffs/Vibe1.png","Game/Buffs/Vibe2.png","Game/Buffs/Vibe3.png","Game/Buffs/Vibe4.png","Game/Buffs/Vibe5.png"], + "Game/Buffs/boundSlow": ["Game/Buffs/boundSlow1.png","Game/Buffs/boundSlow2.png","Game/Buffs/boundSlow3.png","Game/Buffs/boundSlow4.png"], + "Game/Bullets/EffectEnemyCM": ["Game/Bullets/EffectEnemyCM2.png","Game/Bullets/EffectEnemyCM3.png"], + "Game/EffectTiles/Inferno": ["Game/EffectTiles/Inferno_0.png","Game/EffectTiles/Inferno_1.png","Game/EffectTiles/Inferno_2.png","Game/EffectTiles/Inferno_3.png"], + "Game/Enemies/CuffedGirl": ["Game/Enemies/CuffedGirl2.png","Game/Enemies/CuffedGirl3.png"], + "Game/Enemies/CustomSprite/Myrtrice": ["Game/Enemies/CustomSprite/Myrtrice2.png","Game/Enemies/CustomSprite/Myrtrice3.png"], + "Game/Enemies/CustomSpriteBound/Myrtrice": ["Game/Enemies/CustomSpriteBound/Myrtrice2.png","Game/Enemies/CustomSpriteBound/Myrtrice3.png"], + "Game/Enemies/DollmakerBoss": ["Game/Enemies/DollmakerBoss1.png","Game/Enemies/DollmakerBoss2.png","Game/Enemies/DollmakerBoss3.png"], + "Game/Enemies/Fuuka": ["Game/Enemies/Fuuka1.png","Game/Enemies/Fuuka2.png"], + "Game/Enemies/TheWarden": ["Game/Enemies/TheWarden1.png","Game/Enemies/TheWarden2.png"], + "Game/FloorGeneric/Dummy": ["Game/FloorGeneric/Dummy0.png","Game/FloorGeneric/Dummy1.png","Game/FloorGeneric/Dummy2.png"], + "Game/Items/Restraint/NippleClamps": ["Game/Items/Restraint/NippleClamps2.png","Game/Items/Restraint/NippleClamps3.png"], + "Game/Locks/Cyber": ["Game/Locks/Cyber2.png","Game/Locks/Cyber3.png"], + "Game/Spell": ["Game/Spell1.png","Game/Spell2.png","Game/Spell3.png","Game/Spell4.png","Game/Spell5.png"], + "Game/Spells/Leap": ["Game/Spells/Leap2.png","Game/Spells/Leap3.png"], + "Game/Spells/Quickness": ["Game/Spells/Quickness2.png","Game/Spells/Quickness3.png","Game/Spells/Quickness4.png","Game/Spells/Quickness5.png"], + "Game/Spells/SpellChoiceUp": ["Game/Spells/SpellChoiceUp1.png","Game/Spells/SpellChoiceUp2.png","Game/Spells/SpellChoiceUp3.png"], + "Game/Spells/SummonUp": ["Game/Spells/SummonUp1.png","Game/Spells/SummonUp2.png"], + "Game/UI/CollectionFilter/Rank": ["Game/UI/CollectionFilter/Rank0.png","Game/UI/CollectionFilter/Rank1.png","Game/UI/CollectionFilter/Rank2.png","Game/UI/CollectionFilter/Rank3.png","Game/UI/CollectionFilter/Rank4.png","Game/UI/CollectionFilter/Rank5.png"], + "Game/UI/Rank/Rank": ["Game/UI/Rank/Rank0.png","Game/UI/Rank/Rank1.png","Game/UI/Rank/Rank2.png","Game/UI/Rank/Rank3.png","Game/UI/Rank/Rank4.png","Game/UI/Rank/Rank5.png"], + "Game/UI/XRay": ["Game/UI/XRay0.png","Game/UI/XRay1.png","Game/UI/XRay2.png"] +}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "game0.png", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "1", + "related_multi_packs": [ "game1.json", "game2.json", "game3.json", "game4.json", "game5.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:93331e914a1bc9da57f494945b1cabd8:29d6d373e93b4cfb07f84e92c1fd5a73:54a7432a0665349a58c0c74f51e75c65$" +} +} diff --git a/TextureAtlas/game0.png b/TextureAtlas/game0.png new file mode 100644 index 000000000..92f21cb63 Binary files /dev/null and b/TextureAtlas/game0.png differ diff --git a/TextureAtlas/game1.json b/TextureAtlas/game1.json new file mode 100644 index 000000000..2fd44d078 --- /dev/null +++ b/TextureAtlas/game1.json @@ -0,0 +1,2285 @@ +{"frames": { + +"Game/Aura/Armored.png": +{ + "frame": {"x":1101,"y":1788,"w":144,"h":110}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":34,"w":144,"h":110}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/AuraX.png": +{ + "frame": {"x":950,"y":651,"w":126,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":126,"h":126}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Fast.png": +{ + "frame": {"x":1373,"y":1775,"w":137,"h":122}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":16,"w":137,"h":122}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Flaming.png": +{ + "frame": {"x":669,"y":1915,"w":144,"h":132}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":144,"h":132}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Glow.png": +{ + "frame": {"x":1843,"y":546,"w":72,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":37,"y":36,"w":72,"h":73}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Missiles3.png": +{ + "frame": {"x":1866,"y":696,"w":18,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":54,"w":18,"h":57}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Missiles4.png": +{ + "frame": {"x":1183,"y":208,"w":18,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":35,"w":18,"h":76}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Buffs/BuffDots.png": +{ + "frame": {"x":1886,"y":727,"w":28,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":8,"w":28,"h":26}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Bullets/ArcaneStrikeHit.png": +{ + "frame": {"x":513,"y":807,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ArrowBolt.png": +{ + "frame": {"x":1843,"y":621,"w":44,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":27,"w":44,"h":15}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowBoltHeavy.png": +{ + "frame": {"x":1843,"y":621,"w":44,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":27,"w":44,"h":15}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowBoltPistol.png": +{ + "frame": {"x":1843,"y":621,"w":44,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":27,"w":44,"h":15}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowFire.png": +{ + "frame": {"x":1477,"y":1693,"w":60,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":82,"y":96,"w":60,"h":23}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ArrowFireHit.png": +{ + "frame": {"x":541,"y":1078,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BigBoulder.png": +{ + "frame": {"x":338,"y":1920,"w":159,"h":118}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":49,"w":159,"h":118}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BigBoulderLaunch.png": +{ + "frame": {"x":1541,"y":559,"w":72,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":12,"w":72,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BoulderHit.png": +{ + "frame": {"x":874,"y":651,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ChainBolt.png": +{ + "frame": {"x":1467,"y":563,"w":72,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":10,"w":72,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrushingFate.png": +{ + "frame": {"x":513,"y":1,"w":359,"h":359}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":359,"h":359}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/CrushingFateHit.png": +{ + "frame": {"x":513,"y":362,"w":359,"h":359}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":359,"h":359}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/CrystalPuff.png": +{ + "frame": {"x":1347,"y":640,"w":156,"h":158}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":25,"w":156,"h":158}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/CrystalShockBolt.png": +{ + "frame": {"x":513,"y":723,"w":135,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":70,"w":135,"h":73}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/CrystalSlash.png": +{ + "frame": {"x":1247,"y":1,"w":155,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":23,"w":155,"h":169}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/CrystalSlashHit.png": +{ + "frame": {"x":1247,"y":172,"w":155,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":23,"w":155,"h":169}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/CursingCircle.png": +{ + "frame": {"x":1505,"y":639,"w":359,"h":359}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":359,"h":359}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/Dagger.png": +{ + "frame": {"x":1208,"y":1693,"w":67,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":24,"w":67,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/DarkShroudHit.png": +{ + "frame": {"x":1078,"y":1475,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/DragonVine.png": +{ + "frame": {"x":1665,"y":486,"w":63,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":25,"w":63,"h":19}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EffectEnemyCM1H.png": +{ + "frame": {"x":1296,"y":1475,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EffectEnemyCM1Hit.png": +{ + "frame": {"x":1803,"y":1,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EnchantRope.png": +{ + "frame": {"x":1144,"y":1115,"w":168,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":17,"w":168,"h":178}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/EnemyEnchantRope.png": +{ + "frame": {"x":1313,"y":1295,"w":168,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":17,"w":168,"h":178}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/EnemyEnchantRope2.png": +{ + "frame": {"x":1483,"y":1295,"w":168,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":17,"w":168,"h":178}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/EnemyFlash.png": +{ + "frame": {"x":1541,"y":1096,"w":83,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":67,"y":69,"w":83,"h":79}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EnemyLatexLegbinderBolt.png": +{ + "frame": {"x":1991,"y":1175,"w":56,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":2,"w":56,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EntangleHit.png": +{ + "frame": {"x":751,"y":1296,"w":177,"h":174}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":19,"w":177,"h":174}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FeatherCloudHit.png": +{ + "frame": {"x":1337,"y":1100,"w":202,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":19,"w":202,"h":193}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Fireball.png": +{ + "frame": {"x":815,"y":1915,"w":150,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":47,"w":150,"h":123}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Fireblast.png": +{ + "frame": {"x":1897,"y":1175,"w":92,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":54,"y":77,"w":92,"h":63}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Flash.png": +{ + "frame": {"x":1541,"y":1096,"w":83,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":67,"y":69,"w":83,"h":79}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FlashFreezeHit.png": +{ + "frame": {"x":874,"y":447,"w":202,"h":202}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":202,"h":202}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/FreedomHit.png": +{ + "frame": {"x":1077,"y":807,"w":311,"h":291}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":40,"w":311,"h":291}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/Heal.png": +{ + "frame": {"x":874,"y":1,"w":74,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":143,"y":143,"w":74,"h":74}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/HeavySlash.png": +{ + "frame": {"x":1246,"y":343,"w":155,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":23,"w":155,"h":169}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/HeavySlashHit.png": +{ + "frame": {"x":1247,"y":172,"w":155,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":23,"w":155,"h":169}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Icicle.png": +{ + "frame": {"x":1345,"y":1693,"w":65,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":26,"w":65,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IgnitionHit.png": +{ + "frame": {"x":541,"y":1078,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/LatexLegbinderBolt.png": +{ + "frame": {"x":1991,"y":1175,"w":56,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":2,"w":56,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexWallHorizHit.png": +{ + "frame": {"x":1614,"y":507,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":13,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LockBullet.png": +{ + "frame": {"x":1244,"y":612,"w":60,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":24,"w":60,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MiniCable.png": +{ + "frame": {"x":1877,"y":2027,"w":62,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":25,"w":62,"h":19}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RaincloudHit.png": +{ + "frame": {"x":1713,"y":1258,"w":216,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":216,"h":215}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RibbonBurst.png": +{ + "frame": {"x":759,"y":1115,"w":197,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":22,"w":197,"h":178}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Ring.png": +{ + "frame": {"x":1541,"y":1096,"w":83,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":67,"y":69,"w":83,"h":79}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RobotBolt.png": +{ + "frame": {"x":1428,"y":609,"w":58,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":22,"w":58,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RopeBolt.png": +{ + "frame": {"x":508,"y":1807,"w":57,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":31,"w":57,"h":9}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RuneTrap_ChainHit.png": +{ + "frame": {"x":1877,"y":1774,"w":167,"h":191}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":37,"y":25,"w":167,"h":191}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_VacCube.png": +{ + "frame": {"x":874,"y":77,"w":74,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":71,"y":71,"w":74,"h":74}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SarcoEngulfHit.png": +{ + "frame": {"x":874,"y":229,"w":202,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":0,"w":202,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ShadowBolt.png": +{ + "frame": {"x":1140,"y":1693,"w":66,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":24,"w":66,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowSlash.png": +{ + "frame": {"x":1931,"y":1384,"w":103,"h":83}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":66,"w":103,"h":83}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ShatterStrikeHit.png": +{ + "frame": {"x":1866,"y":755,"w":174,"h":188}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":20,"w":174,"h":188}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ShroudHit.png": +{ + "frame": {"x":1078,"y":1475,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SleetHit.png": +{ + "frame": {"x":763,"y":789,"w":312,"h":324}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":20,"w":312,"h":324}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/SlimeBall.png": +{ + "frame": {"x":1640,"y":1258,"w":71,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":21,"w":71,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SlimeWallVertHit.png": +{ + "frame": {"x":1183,"y":286,"w":18,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":0,"w":18,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SmokeBombHit.png": +{ + "frame": {"x":1078,"y":1475,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SoulCrystalBind.png": +{ + "frame": {"x":1803,"y":219,"w":181,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":12,"w":181,"h":178}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SoulCrystalBind_2.png": +{ + "frame": {"x":1803,"y":219,"w":181,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":12,"w":181,"h":178}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SummonSkeleton.png": +{ + "frame": {"x":955,"y":1796,"w":144,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":70,"w":144,"h":111}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ThunderstormHit.png": +{ + "frame": {"x":1713,"y":1258,"w":216,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":216,"h":215}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TidalBall.png": +{ + "frame": {"x":1877,"y":1967,"w":135,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":80,"w":135,"h":58}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TomeArcaneHit.png": +{ + "frame": {"x":513,"y":807,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapCableWeakHit.png": +{ + "frame": {"x":1730,"y":486,"w":111,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":51,"y":22,"w":111,"h":143}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapCharmWeak.png": +{ + "frame": {"x":1129,"y":1295,"w":182,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":27,"w":182,"h":178}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapCharmWeakHit.png": +{ + "frame": {"x":1897,"y":1000,"w":147,"h":173}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":35,"y":29,"w":147,"h":173}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapLeatherWeakHit.png": +{ + "frame": {"x":950,"y":1,"w":126,"h":167}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":38,"y":14,"w":126,"h":167}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapMagicChainsWeakHit.png": +{ + "frame": {"x":1877,"y":1774,"w":167,"h":191}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":37,"y":25,"w":167,"h":191}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapObsidian.png": +{ + "frame": {"x":958,"y":1115,"w":184,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":12,"w":184,"h":178}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapObsidianHit.png": +{ + "frame": {"x":958,"y":1115,"w":184,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":12,"w":184,"h":178}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TremorHit.png": +{ + "frame": {"x":930,"y":1295,"w":197,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":197,"h":178}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/VineSlimeBall.png": +{ + "frame": {"x":1640,"y":1258,"w":71,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":21,"w":71,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WardenCageDropHit.png": +{ + "frame": {"x":967,"y":1909,"w":184,"h":137}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":0,"w":184,"h":137}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/WitchBoulderHit.png": +{ + "frame": {"x":874,"y":651,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchChainBolt.png": +{ + "frame": {"x":1467,"y":563,"w":72,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":10,"w":72,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchIcebolt.png": +{ + "frame": {"x":1345,"y":1693,"w":65,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":26,"w":65,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchRope.png": +{ + "frame": {"x":508,"y":1807,"w":57,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":31,"w":57,"h":9}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchSlimeBall.png": +{ + "frame": {"x":1640,"y":1258,"w":71,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":21,"w":71,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ZombieOrb.png": +{ + "frame": {"x":1367,"y":609,"w":59,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":22,"w":59,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Blind.png": +{ + "frame": {"x":1221,"y":1100,"w":31,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":31,"h":12}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/BoundLevel.png": +{ + "frame": {"x":1312,"y":1100,"w":23,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":49,"y":59,"w":23,"h":12}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Freeze.png": +{ + "frame": {"x":1917,"y":547,"w":67,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":67,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/vp.png": +{ + "frame": {"x":1487,"y":800,"w":14,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":8,"w":14,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/cold.png": +{ + "frame": {"x":1164,"y":613,"w":15,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":47,"w":15,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/LatexThin.png": +{ + "frame": {"x":1986,"y":642,"w":61,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":17,"w":61,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/PressurePlate.png": +{ + "frame": {"x":1115,"y":1100,"w":34,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":45,"w":34,"h":13}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/PressurePlateHold.png": +{ + "frame": {"x":1254,"y":1100,"w":26,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":45,"w":26,"h":13}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/PressurePlateOneUse.png": +{ + "frame": {"x":1115,"y":1100,"w":34,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":45,"w":34,"h":13}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/WireHoriz.png": +{ + "frame": {"x":1181,"y":616,"w":61,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":25,"w":61,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/WireVert.png": +{ + "frame": {"x":1181,"y":494,"w":22,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":6,"w":22,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeElectric.png": +{ + "frame": {"x":1866,"y":945,"w":68,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":10,"w":68,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Bat.png": +{ + "frame": {"x":1538,"y":486,"w":58,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":15,"w":58,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/SummonedZombie.png": +{ + "frame": {"x":1205,"y":502,"w":39,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":1,"w":39,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/WitchRope.png": +{ + "frame": {"x":1653,"y":1295,"w":58,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":0,"w":58,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BowyerQuest.png": +{ + "frame": {"x":1205,"y":294,"w":39,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":39,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Bunny_Favourite.png": +{ + "frame": {"x":731,"y":804,"w":30,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":0,"w":30,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Myrtrice2.png": +{ + "frame": {"x":1986,"y":568,"w":60,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":0,"w":60,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Nara.png": +{ + "frame": {"x":1986,"y":426,"w":32,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":3,"w":32,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Rai.png": +{ + "frame": {"x":1205,"y":220,"w":38,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":0,"w":38,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Melissa.png": +{ + "frame": {"x":2020,"y":379,"w":27,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":8,"w":27,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DemonEye.png": +{ + "frame": {"x":1917,"y":399,"w":67,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":67,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonQueenIce.png": +{ + "frame": {"x":1403,"y":399,"w":133,"h":111}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":16,"w":133,"h":111}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Enemies/DragonQueenPoison.png": +{ + "frame": {"x":1931,"y":1256,"w":114,"h":126}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":3,"w":114,"h":126}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Enemies/LesserSkeleton.png": +{ + "frame": {"x":2021,"y":197,"w":26,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":8,"w":26,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidKnightHeavy.png": +{ + "frame": {"x":731,"y":874,"w":30,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":1,"w":30,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidKnightHeavy_Equip.png": +{ + "frame": {"x":1205,"y":433,"w":39,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":1,"w":39,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidKnightLight.png": +{ + "frame": {"x":731,"y":943,"w":30,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":1,"w":30,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Monolith.png": +{ + "frame": {"x":1314,"y":1233,"w":21,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":7,"w":21,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SmallSlimeLeaper.png": +{ + "frame": {"x":1688,"y":507,"w":40,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":10,"w":40,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/StaticSphere.png": +{ + "frame": {"x":1936,"y":945,"w":68,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":10,"w":68,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SummonedZombie.png": +{ + "frame": {"x":1205,"y":502,"w":39,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":1,"w":39,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchRope.png": +{ + "frame": {"x":1653,"y":1364,"w":58,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":0,"w":58,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchShibari.png": +{ + "frame": {"x":1203,"y":364,"w":41,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":41,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Angel.png": +{ + "frame": {"x":1986,"y":288,"w":32,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":1,"w":32,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/BanditHunter.png": +{ + "frame": {"x":1558,"y":607,"w":53,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":27,"w":53,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/CyborgGuardian.png": +{ + "frame": {"x":1205,"y":149,"w":40,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":1,"w":40,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Dollmaker.png": +{ + "frame": {"x":731,"y":1012,"w":30,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":1,"w":30,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/DollmakerBoss.png": +{ + "frame": {"x":1986,"y":494,"w":61,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":0,"w":61,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/LesserSkeleton.png": +{ + "frame": {"x":1181,"y":556,"w":22,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":8,"w":22,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/MageZombie.png": +{ + "frame": {"x":1514,"y":1640,"w":22,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":11,"w":22,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/MaidKnightLight.png": +{ + "frame": {"x":1986,"y":219,"w":33,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":1,"w":33,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Nawashi.png": +{ + "frame": {"x":2006,"y":945,"w":41,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":8,"w":41,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Ninja.png": +{ + "frame": {"x":1078,"y":1693,"w":60,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":35,"w":60,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Nurse.png": +{ + "frame": {"x":2021,"y":71,"w":26,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":5,"w":26,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Skeleton.png": +{ + "frame": {"x":2020,"y":434,"w":22,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":8,"w":22,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/AngelTied.png": +{ + "frame": {"x":1986,"y":357,"w":32,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":1,"w":32,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Bars.png": +{ + "frame": {"x":1181,"y":428,"w":18,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":8,"w":18,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/CrackLeft.png": +{ + "frame": {"x":1888,"y":680,"w":26,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":18,"w":26,"h":45}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/CrackVert.png": +{ + "frame": {"x":1460,"y":512,"w":72,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":14,"w":72,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/DisplayStand.png": +{ + "frame": {"x":2029,"y":1721,"w":17,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":29,"w":17,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Doors/CyberDoorVertCont.png": +{ + "frame": {"x":1205,"y":1,"w":39,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":0,"w":39,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Doors/CyberDoorVertOpen.png": +{ + "frame": {"x":1205,"y":75,"w":39,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":0,"w":39,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Doors/CyberDoorVertOpenCont.png": +{ + "frame": {"x":1205,"y":75,"w":39,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":0,"w":39,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Perk.png": +{ + "frame": {"x":1487,"y":828,"w":16,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":8,"w":16,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/SarcophagusGone.png": +{ + "frame": {"x":709,"y":789,"w":52,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":36,"w":52,"h":13}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ShadowBase.png": +{ + "frame": {"x":650,"y":789,"w":57,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":52,"w":57,"h":12}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/SpiralStairsDown.png": +{ + "frame": {"x":1541,"y":1254,"w":72,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":32,"w":72,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/GFX/Talisman.png": +{ + "frame": {"x":1,"y":1818,"w":478,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":22,"w":478,"h":100}, + "sourceSize": {"w":512,"h":144} +}, +"Game/HideFalse.png": +{ + "frame": {"x":1185,"y":1100,"w":34,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":26,"w":34,"h":12}, + "sourceSize": {"w":56,"h":56} +}, +"Game/HideTrue.png": +{ + "frame": {"x":1077,"y":1100,"w":36,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":25,"w":36,"h":13}, + "sourceSize": {"w":56,"h":56} +}, +"Game/InvDrop.png": +{ + "frame": {"x":1246,"y":514,"w":108,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":108,"h":50}, + "sourceSize": {"w":116,"h":56} +}, +"Game/InvFilter.png": +{ + "frame": {"x":950,"y":170,"w":112,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":112,"h":56}, + "sourceSize": {"w":116,"h":56} +}, +"Game/InvHide.png": +{ + "frame": {"x":1505,"y":1718,"w":112,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":112,"h":54}, + "sourceSize": {"w":116,"h":56} +}, +"Game/InvItemSort.png": +{ + "frame": {"x":1512,"y":1862,"w":76,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":76,"h":33}, + "sourceSize": {"w":76,"h":76} +}, +"Game/InvSort.png": +{ + "frame": {"x":1356,"y":514,"w":102,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":8,"w":102,"h":48}, + "sourceSize": {"w":116,"h":56} +}, +"Game/Items/AncientPowerSourceSpent.png": +{ + "frame": {"x":1705,"y":555,"w":22,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":7,"w":22,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Arbiter.png": +{ + "frame": {"x":2014,"y":1967,"w":31,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":2,"w":31,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/BondageBuster.png": +{ + "frame": {"x":1412,"y":1693,"w":63,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":27,"w":63,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/DildoBat.png": +{ + "frame": {"x":1314,"y":1174,"w":21,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":9,"w":21,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/DildoBatPlus.png": +{ + "frame": {"x":1314,"y":1114,"w":21,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":6,"w":21,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Dirk.png": +{ + "frame": {"x":1205,"y":1775,"w":57,"h":11}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":31,"w":57,"h":11}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/ElfCrystal.png": +{ + "frame": {"x":1889,"y":621,"w":22,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":7,"w":22,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemHead.png": +{ + "frame": {"x":1897,"y":1240,"w":36,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":36,"y":46,"w":36,"h":14}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemMouth.png": +{ + "frame": {"x":1935,"y":1240,"w":30,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":39,"y":47,"w":30,"h":14}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Katana.png": +{ + "frame": {"x":1941,"y":2027,"w":68,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":28,"w":68,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/LeashItem.png": +{ + "frame": {"x":2021,"y":1,"w":24,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":2,"w":24,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Persuader.png": +{ + "frame": {"x":1306,"y":612,"w":59,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":29,"w":59,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/BindingDress.png": +{ + "frame": {"x":1078,"y":613,"w":84,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":60,"y":3,"w":84,"h":192}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/BitGagHarness.png": +{ + "frame": {"x":1390,"y":800,"w":95,"h":158}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":53,"y":0,"w":95,"h":158}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Bracers.png": +{ + "frame": {"x":700,"y":1724,"w":179,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":61,"w":179,"h":79}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Breastplate.png": +{ + "frame": {"x":499,"y":1915,"w":168,"h":131}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":38,"w":168,"h":131}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Catsuits.png": +{ + "frame": {"x":1078,"y":418,"w":101,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":66,"y":21,"w":101,"h":193}, + "sourceSize": {"w":244,"h":244} +}, +"Game/Items/Restraint/ChainBikini.png": +{ + "frame": {"x":826,"y":1805,"w":127,"h":104}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":33,"y":41,"w":127,"h":104}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/ChainTunic.png": +{ + "frame": {"x":1917,"y":1475,"w":127,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":33,"y":6,"w":127,"h":189}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/ChastityBras.png": +{ + "frame": {"x":1164,"y":640,"w":181,"h":161}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":3,"w":181,"h":161}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/ClothGag.png": +{ + "frame": {"x":1205,"y":570,"w":134,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":36,"y":48,"w":134,"h":40}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/ClothGagOver.png": +{ + "frame": {"x":1916,"y":691,"w":121,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":46,"y":39,"w":121,"h":61}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Collars.png": +{ + "frame": {"x":881,"y":1724,"w":154,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":49,"y":50,"w":154,"h":70}, + "sourceSize": {"w":244,"h":244} +}, +"Game/Items/Restraint/CyberLink.png": +{ + "frame": {"x":541,"y":1025,"w":141,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":80,"w":141,"h":42}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/CyberMittens.png": +{ + "frame": {"x":1390,"y":960,"w":113,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":113,"h":123}, + "sourceSize": {"w":135,"h":144} +}, +"Game/Items/Restraint/DivineBelt.png": +{ + "frame": {"x":1405,"y":1899,"w":195,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":55,"y":80,"w":195,"h":148}, + "sourceSize": {"w":310,"h":310} +}, +"Game/Items/Restraint/DivineBelt2.png": +{ + "frame": {"x":1405,"y":1899,"w":195,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":55,"y":80,"w":195,"h":148}, + "sourceSize": {"w":310,"h":310} +}, +"Game/Items/Restraint/DivineBra.png": +{ + "frame": {"x":541,"y":1296,"w":208,"h":175}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":44,"y":52,"w":208,"h":175}, + "sourceSize": {"w":310,"h":310} +}, +"Game/Items/Restraint/DivineBra2.png": +{ + "frame": {"x":541,"y":1296,"w":208,"h":175}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":44,"y":52,"w":208,"h":175}, + "sourceSize": {"w":310,"h":310} +}, +"Game/Items/Restraint/ElvenPanties.png": +{ + "frame": {"x":1,"y":1475,"w":505,"h":341}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":106,"y":136,"w":505,"h":341}, + "sourceSize": {"w":697,"h":697} +}, +"Game/Items/Restraint/EssenceNecklace.png": +{ + "frame": {"x":1247,"y":1788,"w":124,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":53,"w":124,"h":106}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/FlatGags.png": +{ + "frame": {"x":1078,"y":208,"w":103,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":49,"y":21,"w":103,"h":208}, + "sourceSize": {"w":244,"h":244} +}, +"Game/Items/Restraint/Gauntlets.png": +{ + "frame": {"x":1,"y":1920,"w":171,"h":125}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":34,"w":171,"h":125}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/HighCollars.png": +{ + "frame": {"x":1153,"y":1900,"w":250,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":30,"y":52,"w":250,"h":142}, + "sourceSize": {"w":310,"h":310} +}, +"Game/Items/Restraint/HingedCuffs.png": +{ + "frame": {"x":1205,"y":1720,"w":167,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":39,"w":167,"h":53}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/LatexOTNGag.png": +{ + "frame": {"x":1538,"y":399,"w":153,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":73,"w":153,"h":85}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Leashes.png": +{ + "frame": {"x":2021,"y":1,"w":24,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":2,"w":24,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/MagicArmbands.png": +{ + "frame": {"x":650,"y":723,"w":152,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":61,"w":152,"h":64}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Maid.png": +{ + "frame": {"x":481,"y":1818,"w":183,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":49,"w":183,"h":95}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Mittens.png": +{ + "frame": {"x":1505,"y":1000,"w":133,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":52,"y":48,"w":133,"h":94}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/PanelGags.png": +{ + "frame": {"x":1078,"y":208,"w":103,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":49,"y":21,"w":103,"h":208}, + "sourceSize": {"w":244,"h":244} +}, +"Game/Items/Restraint/Petsuits.png": +{ + "frame": {"x":1619,"y":1475,"w":296,"h":297}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":296,"h":297}, + "sourceSize": {"w":297,"h":297} +}, +"Game/Items/Restraint/RedLatexOTNGag.png": +{ + "frame": {"x":1693,"y":399,"w":153,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":73,"w":153,"h":85}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/RobeOfChastity.png": +{ + "frame": {"x":1078,"y":1,"w":116,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":20,"w":116,"h":205}, + "sourceSize": {"w":250,"h":250} +}, +"Game/Items/Restraint/SarielPanties.png": +{ + "frame": {"x":666,"y":1817,"w":158,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":29,"w":158,"h":96}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/ScarfGag.png": +{ + "frame": {"x":1374,"y":1718,"w":129,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":39,"y":52,"w":129,"h":52}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/SteelSkirt.png": +{ + "frame": {"x":174,"y":1920,"w":162,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":37,"w":162,"h":127}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Stuffing.png": +{ + "frame": {"x":1541,"y":1177,"w":84,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":51,"y":63,"w":84,"h":75}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Sunglasses.png": +{ + "frame": {"x":804,"y":723,"w":144,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":68,"w":144,"h":62}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Swimsuit.png": +{ + "frame": {"x":1514,"y":1475,"w":99,"h":163}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":51,"y":16,"w":99,"h":163}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Thumbcuffs.png": +{ + "frame": {"x":1917,"y":1666,"w":110,"h":106}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":44,"w":110,"h":106}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/WolfCuffs.png": +{ + "frame": {"x":1341,"y":566,"w":124,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":37,"y":33,"w":124,"h":41}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Scissors.png": +{ + "frame": {"x":1488,"y":607,"w":68,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":20,"w":68,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/ScrollArms.png": +{ + "frame": {"x":684,"y":1025,"w":45,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":11,"w":45,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/SlimeSword.png": +{ + "frame": {"x":1598,"y":486,"w":65,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":27,"w":65,"h":19}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffChain.png": +{ + "frame": {"x":2020,"y":322,"w":27,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":8,"w":27,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffFlame.png": +{ + "frame": {"x":1866,"y":638,"w":20,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":7,"w":20,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffFrostbite.png": +{ + "frame": {"x":2021,"y":135,"w":26,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":3,"w":26,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffGlue.png": +{ + "frame": {"x":2029,"y":1666,"w":18,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":28,"y":10,"w":18,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffStorm.png": +{ + "frame": {"x":2021,"y":257,"w":23,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":0,"w":23,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Sunglasses.png": +{ + "frame": {"x":804,"y":723,"w":144,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":68,"w":144,"h":62}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/VibeRemote.png": +{ + "frame": {"x":1615,"y":1254,"w":23,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":19,"w":23,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Light.png": +{ + "frame": {"x":1602,"y":1774,"w":273,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":26,"w":273,"h":273}, + "sourceSize": {"w":324,"h":324} +}, +"Game/Lighting.png": +{ + "frame": {"x":1602,"y":1774,"w":273,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":26,"w":273,"h":273}, + "sourceSize": {"w":324,"h":324} +}, +"Game/MagicBook.png": +{ + "frame": {"x":1,"y":1025,"w":538,"h":448}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":47,"y":25,"w":538,"h":448}, + "sourceSize": {"w":640,"h":483} +}, +"Game/Outfits/BlueSuit.png": +{ + "frame": {"x":1078,"y":418,"w":101,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":45,"y":2,"w":101,"h":193}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Outfits/Bountyhunter.png": +{ + "frame": {"x":1078,"y":418,"w":101,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":45,"y":2,"w":101,"h":193}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Outfits/Default.png": +{ + "frame": {"x":508,"y":1724,"w":190,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":41,"w":190,"h":81}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Outfits/Elven.png": +{ + "frame": {"x":1037,"y":1724,"w":166,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":56,"w":166,"h":62}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Outfits/Maid.png": +{ + "frame": {"x":481,"y":1818,"w":183,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":49,"w":183,"h":95}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Outfits/OutfitDefault.png": +{ + "frame": {"x":508,"y":1724,"w":190,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":41,"w":190,"h":81}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Particles/PinkGlow.png": +{ + "frame": {"x":1640,"y":1000,"w":255,"h":256}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":255,"h":256}, + "sourceSize": {"w":256,"h":256} +}, +"Game/Particles/ShockwaveDesire.png": +{ + "frame": {"x":1,"y":1,"w":510,"h":510}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":510,"h":510}, + "sourceSize": {"w":512,"h":512} +}, +"Game/Particles/ShockwaveEnemy.png": +{ + "frame": {"x":1,"y":513,"w":510,"h":510}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":510,"h":510}, + "sourceSize": {"w":512,"h":512} +}, +"Game/Particles/Slash.png": +{ + "frame": {"x":1405,"y":1,"w":396,"h":396}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":61,"y":56,"w":396,"h":396}, + "sourceSize": {"w":512,"h":512} +}, +"Game/Particles/VibeHeart.png": +{ + "frame": {"x":1413,"y":1085,"w":20,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":20,"h":12}, + "sourceSize": {"w":20,"h":20} +}, +"Game/Poses/BlushHigh.png": +{ + "frame": {"x":1264,"y":1775,"w":38,"h":11}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":19,"w":38,"h":11}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/BlushMedium.png": +{ + "frame": {"x":567,"y":1807,"w":35,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":20,"w":35,"h":9}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/BlushNeutral.png": +{ + "frame": {"x":1151,"y":1100,"w":32,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":17,"w":32,"h":13}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Brows2Angry.png": +{ + "frame": {"x":711,"y":1805,"w":13,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":13,"w":13,"h":9}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Brows2Neutral.png": +{ + "frame": {"x":679,"y":1807,"w":14,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":28,"y":12,"w":14,"h":8}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Brows2Surprised.png": +{ + "frame": {"x":645,"y":1807,"w":15,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":10,"w":15,"h":8}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/BrowsNeutral.png": +{ + "frame": {"x":695,"y":1807,"w":14,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":12,"w":14,"h":8}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/BrowsSurprised.png": +{ + "frame": {"x":629,"y":1807,"w":14,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":9,"w":14,"h":9}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Closed.png": +{ + "frame": {"x":1487,"y":852,"w":13,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":10,"w":13,"h":25}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Eyes2Heart.png": +{ + "frame": {"x":1435,"y":1085,"w":13,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":28,"y":15,"w":13,"h":13}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Eyes2Neutral.png": +{ + "frame": {"x":1064,"y":170,"w":12,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":14,"w":12,"h":15}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/EyesHeart.png": +{ + "frame": {"x":1435,"y":1085,"w":13,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":15,"w":13,"h":13}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/MouthDistracted.png": +{ + "frame": {"x":604,"y":1807,"w":23,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":28,"w":23,"h":8}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/MouthPout.png": +{ + "frame": {"x":1304,"y":1775,"w":19,"h":11}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":26,"w":19,"h":11}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/MouthSurprised.png": +{ + "frame": {"x":662,"y":1807,"w":15,"h":8}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":28,"w":15,"h":8}, + "sourceSize": {"w":46,"h":45} +}, +"Game/ShopBasic/BlueSuit.png": +{ + "frame": {"x":1078,"y":418,"w":101,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":45,"y":2,"w":101,"h":193}, + "sourceSize": {"w":200,"h":200} +}, +"Game/ShopBasic/Bountyhunter.png": +{ + "frame": {"x":1078,"y":418,"w":101,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":45,"y":2,"w":101,"h":193}, + "sourceSize": {"w":200,"h":200} +}, +"Game/ShopBasic/Default.png": +{ + "frame": {"x":508,"y":1724,"w":190,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":41,"w":190,"h":81}, + "sourceSize": {"w":200,"h":200} +}, +"Game/ShopBasic/Elven.png": +{ + "frame": {"x":1037,"y":1724,"w":166,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":56,"w":166,"h":62}, + "sourceSize": {"w":200,"h":200} +}, +"Game/ShopBasic/Maid.png": +{ + "frame": {"x":481,"y":1818,"w":183,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":49,"w":183,"h":95}, + "sourceSize": {"w":200,"h":200} +}, +"Game/ShopBasic/MaidUniform.png": +{ + "frame": {"x":481,"y":1818,"w":183,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":49,"w":183,"h":95}, + "sourceSize": {"w":200,"h":200} +}, +"Game/ShopBasic/OutfitDefault.png": +{ + "frame": {"x":508,"y":1724,"w":190,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":41,"w":190,"h":81}, + "sourceSize": {"w":200,"h":200} +}, +"Game/ShopBasic/PotionCollar.png": +{ + "frame": {"x":1153,"y":1900,"w":250,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":30,"y":52,"w":250,"h":142}, + "sourceSize": {"w":310,"h":310} +}, +"Game/SimpleLogo.png": +{ + "frame": {"x":508,"y":1475,"w":568,"h":247}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":67,"y":43,"w":568,"h":247}, + "sourceSize": {"w":700,"h":300} +}, +"Game/Spells/ArrowFireSpell.png": +{ + "frame": {"x":1477,"y":1693,"w":60,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":24,"w":60,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/CanUpcast.png": +{ + "frame": {"x":1390,"y":1085,"w":21,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":21,"h":13}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ChainBolt.png": +{ + "frame": {"x":1467,"y":563,"w":72,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":10,"w":72,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Dagger.png": +{ + "frame": {"x":1277,"y":1693,"w":66,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":28,"w":66,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/DisplayStand.png": +{ + "frame": {"x":2029,"y":1721,"w":17,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":29,"w":17,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Freeze.png": +{ + "frame": {"x":1917,"y":619,"w":67,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":67,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LeashSkill.png": +{ + "frame": {"x":2021,"y":1,"w":24,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":2,"w":24,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/RopeBoltLaunch.png": +{ + "frame": {"x":508,"y":1807,"w":57,"h":9}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":31,"w":57,"h":9}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SlimeBall.png": +{ + "frame": {"x":1640,"y":1258,"w":71,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":21,"w":71,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SlimeWallVert.png": +{ + "frame": {"x":1183,"y":286,"w":18,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":0,"w":18,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/StaticSphere.png": +{ + "frame": {"x":1936,"y":945,"w":68,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":10,"w":68,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Strength.png": +{ + "frame": {"x":1653,"y":1433,"w":56,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":13,"w":56,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/WindBlast.png": +{ + "frame": {"x":1848,"y":399,"w":67,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":0,"w":67,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/AutoWait/Slow.png": +{ + "frame": {"x":1487,"y":906,"w":13,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":19,"w":13,"h":21}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/CollectionFilter/EscapeRisk.png": +{ + "frame": {"x":1183,"y":360,"w":18,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":3,"w":18,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Exit.png": +{ + "frame": {"x":1512,"y":1774,"w":86,"h":86}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":86,"h":86}, + "sourceSize": {"w":86,"h":86} +}, +"Game/UI/Facility/TrainingDojo.png": +{ + "frame": {"x":1917,"y":473,"w":67,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":67,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/MiniMap/Orb.png": +{ + "frame": {"x":1705,"y":614,"w":23,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":23,"h":23}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/NoSprint.png": +{ + "frame": {"x":1487,"y":929,"w":13,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":19,"w":13,"h":21}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Recycler/Toys.png": +{ + "frame": {"x":1615,"y":557,"w":88,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":5,"w":88,"h":80}, + "sourceSize": {"w":94,"h":94} +}, +"Game/UI/Recycler/Wolf.png": +{ + "frame": {"x":1534,"y":512,"w":78,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":19,"w":78,"h":45}, + "sourceSize": {"w":94,"h":94} +}, +"Game/UI/restraint_key.png": +{ + "frame": {"x":1282,"y":1100,"w":28,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":11,"w":28,"h":12}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/restraint_key_2.png": +{ + "frame": {"x":1282,"y":1100,"w":28,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":11,"w":28,"h":12}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/SideRoom/Caldera.png": +{ + "frame": {"x":1967,"y":1240,"w":16,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":16,"h":14}, + "sourceSize": {"w":16,"h":16} +}, +"Game/UI/TickPerk.png": +{ + "frame": {"x":1487,"y":879,"w":13,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":5,"w":13,"h":25}, + "sourceSize": {"w":14,"h":34} +}, +"Game/UI/Tighten.png": +{ + "frame": {"x":1848,"y":473,"w":67,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":2,"w":67,"h":71}, + "sourceSize": {"w":76,"h":76} +}, +"Game/WarningHighlight.png": +{ + "frame": {"x":874,"y":153,"w":74,"h":74}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":74,"h":74}, + "sourceSize": {"w":74,"h":74} +}, +"Game/WarningHighlightBasic.png": +{ + "frame": {"x":1539,"y":1640,"w":74,"h":74}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":74,"h":74}, + "sourceSize": {"w":74,"h":74} +}, +"Game/WarningHighlightSpecial.png": +{ + "frame": {"x":874,"y":153,"w":74,"h":74}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":74,"h":74}, + "sourceSize": {"w":74,"h":74} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "game1.png", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "1", + "related_multi_packs": [ "game0.json", "game2.json", "game3.json", "game4.json", "game5.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:93331e914a1bc9da57f494945b1cabd8:29d6d373e93b4cfb07f84e92c1fd5a73:54a7432a0665349a58c0c74f51e75c65$" +} +} diff --git a/TextureAtlas/game1.png b/TextureAtlas/game1.png new file mode 100644 index 000000000..be3aeee53 Binary files /dev/null and b/TextureAtlas/game1.png differ diff --git a/TextureAtlas/game2.json b/TextureAtlas/game2.json new file mode 100644 index 000000000..a8eeb7c0b --- /dev/null +++ b/TextureAtlas/game2.json @@ -0,0 +1,3781 @@ +{"frames": { + +"Game/Aura.png": +{ + "frame": {"x":1976,"y":659,"w":71,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":71,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Aura/Airbender0.png": +{ + "frame": {"x":1927,"y":690,"w":18,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":92,"w":18,"h":18}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Airbender1.png": +{ + "frame": {"x":1967,"y":1636,"w":19,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":92,"w":19,"h":19}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Airbender2.png": +{ + "frame": {"x":1038,"y":260,"w":19,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":75,"w":19,"h":36}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/AuraSeal.png": +{ + "frame": {"x":982,"y":1297,"w":123,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":9,"w":123,"h":123}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/BondageBuster.png": +{ + "frame": {"x":1404,"y":219,"w":73,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":36,"y":35,"w":73,"h":74}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Chastity.png": +{ + "frame": {"x":2021,"y":1187,"w":26,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":115,"y":108,"w":26,"h":33}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Conduction.png": +{ + "frame": {"x":1038,"y":225,"w":21,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":98,"w":21,"h":33}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Disrobe.png": +{ + "frame": {"x":1812,"y":1278,"w":136,"h":139}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":1,"w":136,"h":139}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/DoublePlugged.png": +{ + "frame": {"x":794,"y":1426,"w":30,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":57,"y":127,"w":30,"h":17}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Drenched.png": +{ + "frame": {"x":1107,"y":1297,"w":123,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":15,"w":123,"h":119}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Glued.png": +{ + "frame": {"x":1232,"y":1296,"w":111,"h":114}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":13,"w":111,"h":114}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/HealingAura.png": +{ + "frame": {"x":1064,"y":1662,"w":112,"h":113}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":15,"w":112,"h":113}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Missiles0.png": +{ + "frame": {"x":1927,"y":690,"w":18,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":92,"w":18,"h":18}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Missiles1.png": +{ + "frame": {"x":1983,"y":830,"w":18,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":92,"w":18,"h":19}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Plugged.png": +{ + "frame": {"x":702,"y":623,"w":14,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":65,"y":127,"w":14,"h":17}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Toy.png": +{ + "frame": {"x":1669,"y":860,"w":20,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":116,"w":20,"h":26}, + "sourceSize": {"w":144,"h":144} +}, +"Game/AutoStruggleOff.png": +{ + "frame": {"x":1037,"y":513,"w":17,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":17,"w":17,"h":34}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Buffs/BuffDotsSide.png": +{ + "frame": {"x":2021,"y":1256,"w":26,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":9,"w":26,"h":28}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Bullets/AllyCrackle.png": +{ + "frame": {"x":1037,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AllyCrackleHit.png": +{ + "frame": {"x":1037,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AllyFireboltHit.png": +{ + "frame": {"x":1111,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AllyHolyBolt.png": +{ + "frame": {"x":1185,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArcaneBlastHit.png": +{ + "frame": {"x":1259,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArmbinderBoltHit.png": +{ + "frame": {"x":2003,"y":1018,"w":43,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowBoltPistolHit.png": +{ + "frame": {"x":2003,"y":1018,"w":43,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowLongbow.png": +{ + "frame": {"x":418,"y":1426,"w":54,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":26,"w":54,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowNormal.png": +{ + "frame": {"x":418,"y":1426,"w":54,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":26,"w":54,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowNormalHit.png": +{ + "frame": {"x":2003,"y":1018,"w":43,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowRecurve.png": +{ + "frame": {"x":418,"y":1426,"w":54,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":26,"w":54,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowVine.png": +{ + "frame": {"x":1520,"y":549,"w":61,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":20,"w":61,"h":31}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AwakenStrikeHit.png": +{ + "frame": {"x":1333,"y":582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BearTrapHit.png": +{ + "frame": {"x":840,"y":2018,"w":52,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":30,"w":52,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BearTrapStrike.png": +{ + "frame": {"x":840,"y":2018,"w":52,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":82,"y":102,"w":52,"h":28}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BearTrapStrikeHit.png": +{ + "frame": {"x":1198,"y":919,"w":133,"h":128}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":44,"w":133,"h":128}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BeltStrike.png": +{ + "frame": {"x":1285,"y":1049,"w":46,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":22,"w":46,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BeltStrikeHit.png": +{ + "frame": {"x":1285,"y":1049,"w":46,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":22,"w":46,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BigThunderstorm.png": +{ + "frame": {"x":713,"y":1445,"w":349,"h":339}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":15,"w":349,"h":339}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/BigThunderstormHit.png": +{ + "frame": {"x":720,"y":333,"w":315,"h":324}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":20,"w":315,"h":324}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/BlasterBlast.png": +{ + "frame": {"x":1407,"y":582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BlindfoldBoltHit.png": +{ + "frame": {"x":2003,"y":1018,"w":43,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Blink.png": +{ + "frame": {"x":1481,"y":582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BlinkHit.png": +{ + "frame": {"x":1554,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BombHit.png": +{ + "frame": {"x":362,"y":873,"w":216,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":216,"h":207}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BombItemHit.png": +{ + "frame": {"x":362,"y":873,"w":216,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":216,"h":207}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BondageBust.png": +{ + "frame": {"x":1407,"y":582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BondageBustHit.png": +{ + "frame": {"x":1628,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BoundByFate.png": +{ + "frame": {"x":1806,"y":1063,"w":213,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BubbleBurst.png": +{ + "frame": {"x":1501,"y":913,"w":149,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":33,"y":33,"w":149,"h":149}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BubbleBurstLatex.png": +{ + "frame": {"x":1661,"y":1280,"w":149,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":33,"y":33,"w":149,"h":149}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BubbleexpHit.png": +{ + "frame": {"x":1702,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/C4ItemHit.png": +{ + "frame": {"x":362,"y":873,"w":216,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":216,"h":207}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/CelestialBoltHit.png": +{ + "frame": {"x":1977,"y":1731,"w":70,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":70,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ChainBoltHit.png": +{ + "frame": {"x":1555,"y":582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ClericBeam.png": +{ + "frame": {"x":1629,"y":581,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ClericBeamHit.png": +{ + "frame": {"x":1776,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Corona.png": +{ + "frame": {"x":1407,"y":582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CoronaHit.png": +{ + "frame": {"x":1628,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrystalBolt.png": +{ + "frame": {"x":1184,"y":1995,"w":68,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":11,"w":68,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrystalBoltHit.png": +{ + "frame": {"x":1850,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrystalBoltManyHit.png": +{ + "frame": {"x":1924,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrystalBoltSingle.png": +{ + "frame": {"x":1184,"y":1995,"w":68,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":11,"w":68,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrystalBoltSingleHit.png": +{ + "frame": {"x":1850,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrystalShockHit.png": +{ + "frame": {"x":1850,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CuffsBolt.png": +{ + "frame": {"x":1632,"y":1954,"w":51,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":19,"w":51,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CuffsBoltHit.png": +{ + "frame": {"x":2003,"y":1018,"w":43,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CursedArrow.png": +{ + "frame": {"x":474,"y":1426,"w":54,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":26,"w":54,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CursingCircle2.png": +{ + "frame": {"x":1,"y":1,"w":359,"h":359}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":359,"h":359}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/CursingCircle2Hit.png": +{ + "frame": {"x":1,"y":362,"w":359,"h":359}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":359,"h":359}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/CursingCircleHit.png": +{ + "frame": {"x":1,"y":723,"w":359,"h":359}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":359,"h":359}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/DragonFlowerSpores.png": +{ + "frame": {"x":1739,"y":1732,"w":215,"h":214}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":215,"h":214}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/DryadBlast.png": +{ + "frame": {"x":1476,"y":295,"w":69,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":19,"w":69,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/DynamiteItemHit.png": +{ + "frame": {"x":362,"y":873,"w":216,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":216,"h":207}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EffectEnemyCM2.png": +{ + "frame": {"x":1,"y":1808,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EffectEnemyCM2Hit.png": +{ + "frame": {"x":219,"y":1808,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EffectEnemyCM3.png": +{ + "frame": {"x":437,"y":1800,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EffectEnemyCM3Hit.png": +{ + "frame": {"x":655,"y":1800,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EffectEnemyLock1H.png": +{ + "frame": {"x":873,"y":1786,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EffectEnemyLock1Hit.png": +{ + "frame": {"x":362,"y":1,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ElfArrow.png": +{ + "frame": {"x":530,"y":1426,"w":54,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":26,"w":54,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EncaseBoltDrone.png": +{ + "frame": {"x":1043,"y":1422,"w":41,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":27,"w":41,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EncaseBoltDroneHit.png": +{ + "frame": {"x":1178,"y":1662,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EncaseBoltHit.png": +{ + "frame": {"x":1178,"y":1662,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyBlast.png": +{ + "frame": {"x":1252,"y":1662,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyCorona.png": +{ + "frame": {"x":1407,"y":582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyCoronaHit.png": +{ + "frame": {"x":1628,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyFlashBombHit.png": +{ + "frame": {"x":362,"y":219,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EnemyWinterblastHit.png": +{ + "frame": {"x":1693,"y":843,"w":72,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FireballHit.png": +{ + "frame": {"x":1,"y":1084,"w":357,"h":360}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":357,"h":360}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/FireblastHit.png": +{ + "frame": {"x":362,"y":437,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Firebolt.png": +{ + "frame": {"x":1113,"y":1995,"w":69,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":11,"w":69,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FireboltHit.png": +{ + "frame": {"x":1111,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Firecracker.png": +{ + "frame": {"x":1479,"y":219,"w":73,"h":74}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":72,"y":71,"w":73,"h":74}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FirecrackerHit.png": +{ + "frame": {"x":362,"y":655,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FireexpHit.png": +{ + "frame": {"x":1111,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FissureTrail.png": +{ + "frame": {"x":1992,"y":1636,"w":55,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":0,"w":55,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FlameRune.png": +{ + "frame": {"x":1326,"y":1662,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FlameRuneHit.png": +{ + "frame": {"x":1400,"y":1662,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FlameRuneStrikeHit.png": +{ + "frame": {"x":580,"y":703,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FlashbangHit.png": +{ + "frame": {"x":362,"y":219,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FlashBombHit.png": +{ + "frame": {"x":362,"y":219,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FocusedFlash.png": +{ + "frame": {"x":720,"y":1,"w":316,"h":330}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":20,"w":316,"h":330}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/FocusedFlashHit.png": +{ + "frame": {"x":360,"y":1084,"w":358,"h":340}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":11,"w":358,"h":340}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/FreezeRune.png": +{ + "frame": {"x":1474,"y":1662,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FreezeRuneHit.png": +{ + "frame": {"x":1548,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FuukaOrb.png": +{ + "frame": {"x":847,"y":659,"w":69,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":16,"w":69,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FuukaOrbMulti.png": +{ + "frame": {"x":847,"y":659,"w":69,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":16,"w":69,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/GagBoltHit.png": +{ + "frame": {"x":2003,"y":1018,"w":43,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Glue.png": +{ + "frame": {"x":580,"y":1,"w":136,"h":177}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":43,"y":20,"w":136,"h":177}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/GravityPullEarth.png": +{ + "frame": {"x":1452,"y":696,"w":215,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":215,"h":215}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/HarnessBolt.png": +{ + "frame": {"x":1767,"y":1988,"w":71,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":8,"w":71,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HarnessBoltHit.png": +{ + "frame": {"x":2003,"y":1018,"w":43,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HeatBolt.png": +{ + "frame": {"x":1113,"y":1995,"w":69,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":11,"w":69,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HeatBolt_2.png": +{ + "frame": {"x":1113,"y":1995,"w":69,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":11,"w":69,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HeatBoltHit.png": +{ + "frame": {"x":1111,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HexLatexExplosion.png": +{ + "frame": {"x":1840,"y":1,"w":206,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":0,"w":206,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/HexWrapping.png": +{ + "frame": {"x":1691,"y":293,"w":66,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":25,"w":66,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HexWrappingHit.png": +{ + "frame": {"x":1622,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Incinerate.png": +{ + "frame": {"x":720,"y":1079,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/IncinerateHit.png": +{ + "frame": {"x":798,"y":701,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/KnifeHit.png": +{ + "frame": {"x":1881,"y":622,"w":21,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":28,"y":17,"w":21,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexBubbleexpHit.png": +{ + "frame": {"x":1702,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexWallHoriz.png": +{ + "frame": {"x":1696,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexWallVert.png": +{ + "frame": {"x":1696,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Leap.png": +{ + "frame": {"x":1693,"y":695,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LeapHit.png": +{ + "frame": {"x":1693,"y":769,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LeatherCuffsBoltHit.png": +{ + "frame": {"x":2003,"y":1018,"w":43,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LegbinderBoltHit.png": +{ + "frame": {"x":2003,"y":1018,"w":43,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LightningBolt.png": +{ + "frame": {"x":1037,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LightningBoltHit.png": +{ + "frame": {"x":1037,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LightningRune.png": +{ + "frame": {"x":1652,"y":913,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LightningRuneHit.png": +{ + "frame": {"x":1714,"y":1547,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LockBulletHit.png": +{ + "frame": {"x":1714,"y":1431,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LustBombHit.png": +{ + "frame": {"x":1016,"y":701,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/MagicBelt.png": +{ + "frame": {"x":253,"y":2026,"w":57,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":27,"w":57,"h":18}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MagicChain.png": +{ + "frame": {"x":894,"y":2004,"w":72,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":10,"w":72,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MagicChainHit.png": +{ + "frame": {"x":1770,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MagicRope.png": +{ + "frame": {"x":553,"y":2018,"w":57,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":22,"w":57,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManyMithrilBolts.png": +{ + "frame": {"x":1844,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManyMithrilBoltsHit.png": +{ + "frame": {"x":1918,"y":1657,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManyObsidianBolts.png": +{ + "frame": {"x":1956,"y":1805,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManyObsidianBoltsHit.png": +{ + "frame": {"x":1924,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManyOrbsHit.png": +{ + "frame": {"x":1924,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManySlimesHit.png": +{ + "frame": {"x":1696,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MinerBombHit.png": +{ + "frame": {"x":362,"y":873,"w":216,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":216,"h":207}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/MiniCableHit.png": +{ + "frame": {"x":1809,"y":622,"w":70,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":70,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Minigun.png": +{ + "frame": {"x":1328,"y":550,"w":65,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":23,"w":65,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MiniSlime.png": +{ + "frame": {"x":843,"y":1058,"w":30,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":28,"w":30,"h":18}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MiniSlimeHit.png": +{ + "frame": {"x":1696,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MithrilBolt.png": +{ + "frame": {"x":1571,"y":1954,"w":59,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":20,"w":59,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MonolithBeam.png": +{ + "frame": {"x":1924,"y":219,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MonolithBeamHit.png": +{ + "frame": {"x":1956,"y":1805,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MummyBolt.png": +{ + "frame": {"x":773,"y":659,"w":72,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":17,"w":72,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/NatureMoteBolt.png": +{ + "frame": {"x":1476,"y":295,"w":69,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":19,"w":69,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/NurseBolaHit.png": +{ + "frame": {"x":1254,"y":1995,"w":68,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":10,"w":68,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ObserverBeam.png": +{ + "frame": {"x":918,"y":659,"w":72,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":17,"w":72,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ObsidianBolt.png": +{ + "frame": {"x":1790,"y":1948,"w":61,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":23,"w":61,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/OneBarMissileHit.png": +{ + "frame": {"x":1694,"y":1989,"w":71,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":8,"w":71,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/PoisonBreathHit.png": +{ + "frame": {"x":1812,"y":1421,"w":203,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":3,"w":203,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/PoisonDaggerHit.png": +{ + "frame": {"x":1881,"y":622,"w":21,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":28,"y":17,"w":21,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/PoisonDragonBlast.png": +{ + "frame": {"x":1476,"y":295,"w":69,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":19,"w":69,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Raincloud.png": +{ + "frame": {"x":938,"y":1079,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RestrainingBolt.png": +{ + "frame": {"x":360,"y":1426,"w":56,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":26,"w":56,"h":18}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Ribbons.png": +{ + "frame": {"x":1652,"y":1035,"w":44,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":22,"w":44,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RibbonsHit.png": +{ + "frame": {"x":1652,"y":1035,"w":44,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":22,"w":44,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RingHit.png": +{ + "frame": {"x":1059,"y":332,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RubberMissile.png": +{ + "frame": {"x":1083,"y":1055,"w":55,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":25,"w":55,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RubberMissileExplosionHit.png": +{ + "frame": {"x":1277,"y":332,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RubberNuke.png": +{ + "frame": {"x":1056,"y":550,"w":69,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":20,"w":69,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RuneTrap_VacCubeHit.png": +{ + "frame": {"x":1404,"y":1,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SarcoHex.png": +{ + "frame": {"x":1064,"y":1444,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SarcoHexHit.png": +{ + "frame": {"x":1156,"y":1078,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SealingBolt.png": +{ + "frame": {"x":1840,"y":1988,"w":69,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":69,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowScythe.png": +{ + "frame": {"x":580,"y":362,"w":125,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":23,"w":125,"h":168}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ShadowScytheHit.png": +{ + "frame": {"x":1333,"y":915,"w":166,"h":145}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":49,"w":166,"h":145}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ShadowShroud.png": +{ + "frame": {"x":720,"y":1297,"w":129,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":39,"y":43,"w":129,"h":127}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ShadowShroudHit.png": +{ + "frame": {"x":1770,"y":688,"w":131,"h":129}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":38,"y":42,"w":131,"h":129}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Shield.png": +{ + "frame": {"x":1474,"y":1662,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShieldHit.png": +{ + "frame": {"x":1548,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SingleBelt.png": +{ + "frame": {"x":1285,"y":1049,"w":46,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":22,"w":46,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SleepDart.png": +{ + "frame": {"x":1865,"y":1035,"w":43,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":23,"w":43,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SlimeEruption.png": +{ + "frame": {"x":359,"y":1446,"w":352,"h":352}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":5,"w":352,"h":352}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/SlimeWallHoriz.png": +{ + "frame": {"x":1696,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SlimeWallHorizHit.png": +{ + "frame": {"x":1398,"y":1991,"w":72,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":9,"w":72,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SlimeWallVert.png": +{ + "frame": {"x":1696,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SnowballHit.png": +{ + "frame": {"x":1693,"y":843,"w":72,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Spores.png": +{ + "frame": {"x":1713,"y":331,"w":214,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":214,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SporesHappy.png": +{ + "frame": {"x":1091,"y":1777,"w":214,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":214,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SporesSickHity.png": +{ + "frame": {"x":1091,"y":1777,"w":214,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":214,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/StraitjacketBoltHit.png": +{ + "frame": {"x":2003,"y":1018,"w":43,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonCaptureDrones.png": +{ + "frame": {"x":1590,"y":1064,"w":214,"h":214}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":214,"h":214}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SummonCrystals.png": +{ + "frame": {"x":1241,"y":1736,"w":64,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":35,"w":64,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonDrones.png": +{ + "frame": {"x":1767,"y":819,"w":214,"h":214}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":214,"h":214}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Thunderstorm.png": +{ + "frame": {"x":1498,"y":1441,"w":214,"h":215}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":214,"h":215}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ThunderstormOld.png": +{ + "frame": {"x":1064,"y":1,"w":338,"h":329}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":15,"w":338,"h":329}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/TickleCloudHit.png": +{ + "frame": {"x":1559,"y":656,"w":65,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":27,"w":65,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/TomeBondageHit.png": +{ + "frame": {"x":1234,"y":697,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapCableWeak.png": +{ + "frame": {"x":580,"y":921,"w":158,"h":156}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":33,"y":22,"w":158,"h":156}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapLatexHit.png": +{ + "frame": {"x":1495,"y":331,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapSleepDart.png": +{ + "frame": {"x":1865,"y":1035,"w":43,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":23,"w":43,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/VolcanicStrikeHit.png": +{ + "frame": {"x":1,"y":1446,"w":356,"h":360}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":356,"h":360}, + "sourceSize": {"w":360,"h":360} +}, +"Game/Bullets/Wall.png": +{ + "frame": {"x":1037,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchChainBoltHit.png": +{ + "frame": {"x":1555,"y":582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchElectricBurst.png": +{ + "frame": {"x":1622,"y":1,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/WitchElectricBurstHit.png": +{ + "frame": {"x":1622,"y":1,"w":216,"h":216}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/WitchSlimeBallHit.png": +{ + "frame": {"x":1696,"y":1658,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ZombieOrbIce.png": +{ + "frame": {"x":495,"y":2018,"w":56,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":22,"w":56,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ZoneOfExcitement.png": +{ + "frame": {"x":1282,"y":1444,"w":214,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":214,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ZoneOfExcitementHit.png": +{ + "frame": {"x":1374,"y":1078,"w":214,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":214,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ZoneOfPurity.png": +{ + "frame": {"x":1307,"y":1736,"w":214,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":214,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ZoneOfPurityHit.png": +{ + "frame": {"x":1523,"y":1736,"w":214,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":214,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Color.png": +{ + "frame": {"x":1956,"y":1375,"w":21,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":21,"h":21}, + "sourceSize": {"w":23,"h":23} +}, +"Game/Conditions/Bind.png": +{ + "frame": {"x":2017,"y":1612,"w":28,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/BlockBuff.png": +{ + "frame": {"x":1983,"y":851,"w":18,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":52,"y":1,"w":18,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/DamageAmp.png": +{ + "frame": {"x":1922,"y":1636,"w":21,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":49,"y":4,"w":21,"h":19}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Dialogue.png": +{ + "frame": {"x":1788,"y":1454,"w":21,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":25,"w":21,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Disarm.png": +{ + "frame": {"x":918,"y":1426,"w":25,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":22,"w":25,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/EvasionBuff.png": +{ + "frame": {"x":971,"y":1426,"w":24,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":2,"w":24,"h":16}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Shop.png": +{ + "frame": {"x":1038,"y":113,"w":21,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":2,"w":21,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Silence.png": +{ + "frame": {"x":856,"y":1426,"w":29,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":9,"w":29,"h":16}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Sneak.png": +{ + "frame": {"x":905,"y":1058,"w":28,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":0,"w":28,"h":18}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Tired.png": +{ + "frame": {"x":1992,"y":1707,"w":44,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":4,"w":44,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/VulnerableBlocked.png": +{ + "frame": {"x":1669,"y":756,"w":22,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":46,"y":9,"w":22,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Cut.png": +{ + "frame": {"x":2021,"y":1286,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":17,"w":26,"h":26}, + "sourceSize": {"w":60,"h":60} +}, +"Game/DamageTypes/chain.png": +{ + "frame": {"x":1788,"y":1476,"w":20,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":51,"w":20,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/charm.png": +{ + "frame": {"x":1983,"y":806,"w":18,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":49,"w":18,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/frost.png": +{ + "frame": {"x":702,"y":604,"w":15,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":52,"w":15,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/ice.png": +{ + "frame": {"x":702,"y":604,"w":15,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":52,"w":15,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Down.png": +{ + "frame": {"x":371,"y":2026,"w":60,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":11,"w":60,"h":17}, + "sourceSize": {"w":86,"h":36} +}, +"Game/EffectTiles/BoobyTrap.png": +{ + "frame": {"x":1814,"y":1035,"w":49,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":31,"w":49,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/BoobyTrapMagic.png": +{ + "frame": {"x":1759,"y":293,"w":66,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":25,"w":66,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/EdgeOrb.png": +{ + "frame": {"x":2021,"y":1314,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":35,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/EdgeOrbDead.png": +{ + "frame": {"x":2021,"y":1342,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":35,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Gunpowder.png": +{ + "frame": {"x":1977,"y":1948,"w":59,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":29,"w":59,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/IllusOrbDead.png": +{ + "frame": {"x":1903,"y":690,"w":22,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":29,"w":22,"h":16}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/MotionLampLight.png": +{ + "frame": {"x":1703,"y":588,"w":51,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":17,"w":51,"h":31}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/PressurePlateActive.png": +{ + "frame": {"x":679,"y":1426,"w":38,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":43,"w":38,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Radiance.png": +{ + "frame": {"x":1756,"y":588,"w":51,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":33,"w":51,"h":31}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Runes.png": +{ + "frame": {"x":968,"y":2004,"w":72,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":22,"w":72,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/RunesTrap.png": +{ + "frame": {"x":1759,"y":293,"w":66,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":25,"w":66,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/SealSigil.png": +{ + "frame": {"x":1421,"y":656,"w":68,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":24,"w":68,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/SpikeTrap.png": +{ + "frame": {"x":1814,"y":1035,"w":49,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":31,"w":49,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/TeleportPlate.png": +{ + "frame": {"x":992,"y":659,"w":68,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":17,"w":68,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/TeleportPlateMana.png": +{ + "frame": {"x":1133,"y":658,"w":68,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":17,"w":68,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AnimBlindfold.png": +{ + "frame": {"x":669,"y":2018,"w":55,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":22,"w":55,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AnimYoke.png": +{ + "frame": {"x":1507,"y":1954,"w":62,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":17,"w":62,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Apprentice.png": +{ + "frame": {"x":2003,"y":875,"w":43,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":0,"w":43,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ApprenticeQuest.png": +{ + "frame": {"x":2003,"y":875,"w":43,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":0,"w":43,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BanditHunter.png": +{ + "frame": {"x":2017,"y":1426,"w":30,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":30,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Barricade.png": +{ + "frame": {"x":1996,"y":430,"w":51,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":1,"w":51,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeMetal.png": +{ + "frame": {"x":1546,"y":1989,"w":72,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":12,"w":72,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeShadow.png": +{ + "frame": {"x":1911,"y":1988,"w":68,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":6,"w":68,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeShadowMetal.png": +{ + "frame": {"x":1620,"y":1989,"w":72,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":12,"w":72,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeWater.png": +{ + "frame": {"x":1472,"y":1990,"w":72,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":9,"w":72,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Apprentice.png": +{ + "frame": {"x":2003,"y":875,"w":43,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":0,"w":43,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/ApprenticeQuest.png": +{ + "frame": {"x":2003,"y":875,"w":43,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":0,"w":43,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/BanditHunter.png": +{ + "frame": {"x":2017,"y":1426,"w":30,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":30,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/FastZombie.png": +{ + "frame": {"x":1981,"y":1278,"w":38,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":1,"w":38,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Guard.png": +{ + "frame": {"x":1963,"y":556,"w":28,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":3,"w":28,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/HighWizard.png": +{ + "frame": {"x":1956,"y":1879,"w":71,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":71,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Nurse.png": +{ + "frame": {"x":1963,"y":362,"w":31,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":5,"w":31,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/WitchFlame.png": +{ + "frame": {"x":1993,"y":574,"w":54,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":0,"w":54,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/WitchIce.png": +{ + "frame": {"x":1998,"y":219,"w":48,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":0,"w":48,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ChaoticCrystal.png": +{ + "frame": {"x":1652,"y":987,"w":44,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":12,"w":44,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CuffedGirl3.png": +{ + "frame": {"x":1993,"y":502,"w":52,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":0,"w":52,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Cuffs.png": +{ + "frame": {"x":1632,"y":1954,"w":51,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":18,"w":51,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Myrtrice.png": +{ + "frame": {"x":1996,"y":357,"w":51,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":1,"w":51,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Rook.png": +{ + "frame": {"x":1983,"y":944,"w":64,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":0,"w":64,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Viola.png": +{ + "frame": {"x":1726,"y":913,"w":39,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":0,"w":39,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DirtPile.png": +{ + "frame": {"x":1903,"y":784,"w":47,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":28,"w":47,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonQueenCrystal.png": +{ + "frame": {"x":923,"y":919,"w":137,"h":136}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":137,"h":136}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Enemies/DragonQueenShadow.png": +{ + "frame": {"x":851,"y":1297,"w":129,"h":127}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":10,"w":129,"h":127}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Enemies/DragonVineFlower.png": +{ + "frame": {"x":1998,"y":288,"w":48,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":3,"w":48,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonVinePlant.png": +{ + "frame": {"x":1998,"y":288,"w":48,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":3,"w":48,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EarthMote.png": +{ + "frame": {"x":1747,"y":549,"w":60,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":20,"w":60,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/FastZombie.png": +{ + "frame": {"x":1981,"y":1278,"w":38,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":1,"w":38,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ForceField.png": +{ + "frame": {"x":1981,"y":1988,"w":66,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":9,"w":66,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/FuukaPillar.png": +{ + "frame": {"x":2017,"y":1551,"w":30,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":30,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Gag.png": +{ + "frame": {"x":726,"y":2018,"w":55,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":22,"w":55,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Guard.png": +{ + "frame": {"x":1963,"y":556,"w":28,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":3,"w":28,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/HighWizard.png": +{ + "frame": {"x":1956,"y":1879,"w":71,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":71,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Jailer.png": +{ + "frame": {"x":1963,"y":556,"w":28,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":3,"w":28,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Nurse.png": +{ + "frame": {"x":1963,"y":362,"w":31,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":5,"w":31,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/PetDisplay.png": +{ + "frame": {"x":1770,"y":621,"w":37,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":5,"w":37,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Pixie.png": +{ + "frame": {"x":1897,"y":1636,"w":23,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":17,"w":23,"h":19}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/PlayerGag.png": +{ + "frame": {"x":783,"y":2018,"w":55,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":22,"w":55,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Rat.png": +{ + "frame": {"x":794,"y":1058,"w":47,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":32,"w":47,"h":19}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SummonedDrone.png": +{ + "frame": {"x":1038,"y":298,"w":19,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":22,"w":19,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/TapeBot.png": +{ + "frame": {"x":1626,"y":656,"w":65,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":21,"w":65,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchEarth.png": +{ + "frame": {"x":2003,"y":806,"w":44,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":0,"w":44,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchIce.png": +{ + "frame": {"x":1905,"y":621,"w":48,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":0,"w":48,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Apprentice2.png": +{ + "frame": {"x":702,"y":659,"w":69,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":20,"w":69,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Conjurer.png": +{ + "frame": {"x":1980,"y":1346,"w":39,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":0,"w":39,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Dressmaker.png": +{ + "frame": {"x":2017,"y":1488,"w":29,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":7,"w":29,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/GreaterSkeleton.png": +{ + "frame": {"x":1929,"y":330,"w":32,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":2,"w":32,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/CherubFire.png": +{ + "frame": {"x":1871,"y":549,"w":54,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":28,"w":54,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/ElementalRope.png": +{ + "frame": {"x":1905,"y":588,"w":47,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":4,"w":47,"h":31}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/LesserSkeleton.png": +{ + "frame": {"x":1669,"y":782,"w":22,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":8,"w":22,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Necromancer.png": +{ + "frame": {"x":2021,"y":1370,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Skeleton.png": +{ + "frame": {"x":1669,"y":782,"w":22,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":8,"w":22,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/TemplateHead.png": +{ + "frame": {"x":1381,"y":1062,"w":13,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":28,"y":18,"w":13,"h":14}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Witch.png": +{ + "frame": {"x":2021,"y":1398,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/WitchShock.png": +{ + "frame": {"x":2021,"y":1398,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/WolfGuard.png": +{ + "frame": {"x":2021,"y":1222,"w":26,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":7,"w":26,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/HeavySkeleton.png": +{ + "frame": {"x":1929,"y":396,"w":32,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":2,"w":32,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/HighWizard.png": +{ + "frame": {"x":1178,"y":1736,"w":61,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":20,"w":61,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/HolyConstruct.png": +{ + "frame": {"x":1871,"y":549,"w":54,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":28,"w":54,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/JungleDryad.png": +{ + "frame": {"x":1127,"y":550,"w":69,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":31,"w":69,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/MaidforceHead.png": +{ + "frame": {"x":1895,"y":293,"w":66,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":32,"w":66,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/MaidKnightHeavy.png": +{ + "frame": {"x":1963,"y":293,"w":31,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":1,"w":31,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Charger.png": +{ + "frame": {"x":1929,"y":462,"w":32,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":0,"w":32,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChargerCrystal.png": +{ + "frame": {"x":1929,"y":525,"w":32,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":0,"w":32,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestShadow.png": +{ + "frame": {"x":1324,"y":1993,"w":72,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":14,"w":72,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/CommercePortal.png": +{ + "frame": {"x":1698,"y":987,"w":67,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":3,"w":67,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/DownOff.png": +{ + "frame": {"x":1788,"y":1595,"w":20,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":27,"w":20,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/DownSwitch.png": +{ + "frame": {"x":1669,"y":696,"w":20,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":27,"w":20,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/LeftOff.png": +{ + "frame": {"x":1788,"y":1595,"w":20,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":38,"w":20,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/LeftSwitch.png": +{ + "frame": {"x":1810,"y":1636,"w":28,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":38,"w":28,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/RightOff.png": +{ + "frame": {"x":1788,"y":1595,"w":20,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":38,"w":20,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/RightSwitch.png": +{ + "frame": {"x":1840,"y":1636,"w":28,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":38,"w":28,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/UpOff.png": +{ + "frame": {"x":1788,"y":1595,"w":20,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":27,"w":20,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/UpSwitch.png": +{ + "frame": {"x":1669,"y":726,"w":20,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":19,"w":20,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/CrackHoriz.png": +{ + "frame": {"x":1767,"y":1035,"w":45,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":0,"w":45,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/CrystalBase.png": +{ + "frame": {"x":887,"y":1426,"w":29,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":55,"w":29,"h":16}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/DimensionRift.png": +{ + "frame": {"x":1583,"y":549,"w":53,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":40,"w":53,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/EmptyPipe.png": +{ + "frame": {"x":2021,"y":1062,"w":26,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":31,"w":26,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/HookLow.png": +{ + "frame": {"x":875,"y":1058,"w":28,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":48,"w":28,"h":19}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/IceBase.png": +{ + "frame": {"x":1191,"y":1055,"w":38,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":44,"w":38,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/LatexDisplayStand.png": +{ + "frame": {"x":1037,"y":370,"w":17,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":34,"w":17,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/LatexPipe.png": +{ + "frame": {"x":2021,"y":1105,"w":26,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":31,"w":26,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Orb.png": +{ + "frame": {"x":1956,"y":1398,"w":21,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":9,"w":21,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Pizza.png": +{ + "frame": {"x":1042,"y":2004,"w":69,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":28,"w":69,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Rubble.png": +{ + "frame": {"x":1333,"y":1062,"w":14,"h":14}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":34,"w":14,"h":14}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Sarcophagus.png": +{ + "frame": {"x":1231,"y":1049,"w":52,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":23,"w":52,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Scrap.png": +{ + "frame": {"x":1956,"y":1351,"w":21,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":23,"w":21,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Signal/AutoLock.png": +{ + "frame": {"x":1788,"y":1617,"w":20,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":29,"w":20,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/SummitTeleporter.png": +{ + "frame": {"x":1827,"y":293,"w":66,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":25,"w":66,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/VineBase.png": +{ + "frame": {"x":1910,"y":1035,"w":44,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":48,"w":44,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/Light.png": +{ + "frame": {"x":2021,"y":1314,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":35,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/HideFull.png": +{ + "frame": {"x":1086,"y":1422,"w":36,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":18,"w":36,"h":20}, + "sourceSize": {"w":56,"h":56} +}, +"Game/InventoryAction/Cut.png": +{ + "frame": {"x":2021,"y":1286,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":23,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Sell.png": +{ + "frame": {"x":586,"y":1426,"w":47,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":28,"w":47,"h":18}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/SellBulk.png": +{ + "frame": {"x":1307,"y":1954,"w":64,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":21,"w":64,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InvHidden.png": +{ + "frame": {"x":1714,"y":1636,"w":36,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":1,"w":36,"h":20}, + "sourceSize": {"w":76,"h":76} +}, +"Game/InvItemSortLeft.png": +{ + "frame": {"x":1037,"y":443,"w":18,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":21,"w":18,"h":33}, + "sourceSize": {"w":76,"h":76} +}, +"Game/InvItemSortRight.png": +{ + "frame": {"x":1037,"y":478,"w":18,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":21,"w":18,"h":33}, + "sourceSize": {"w":76,"h":76} +}, +"Game/InvVisible.png": +{ + "frame": {"x":1086,"y":1422,"w":36,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":1,"w":36,"h":20}, + "sourceSize": {"w":76,"h":76} +}, +"Game/Items/Axe.png": +{ + "frame": {"x":935,"y":1057,"w":50,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":29,"w":50,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Blaster.png": +{ + "frame": {"x":740,"y":1058,"w":52,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":26,"w":52,"h":19}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/BoltCutters.png": +{ + "frame": {"x":193,"y":2026,"w":58,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":26,"w":58,"h":18}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Claymore.png": +{ + "frame": {"x":1203,"y":658,"w":72,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":18,"w":72,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/CrossbowHeavy.png": +{ + "frame": {"x":1062,"y":658,"w":69,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":15,"w":69,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/CrossbowPistol.png": +{ + "frame": {"x":64,"y":2026,"w":67,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":29,"w":67,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/CuffKeys.png": +{ + "frame": {"x":1038,"y":1057,"w":43,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":27,"w":43,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/DarkKatana.png": +{ + "frame": {"x":1351,"y":656,"w":68,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":6,"w":68,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/EnchantedGrinder.png": +{ + "frame": {"x":1459,"y":550,"w":59,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":21,"w":59,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Feather.png": +{ + "frame": {"x":1176,"y":1418,"w":51,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":27,"w":51,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Flashlight.png": +{ + "frame": {"x":1738,"y":1954,"w":50,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":20,"w":50,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Gold.png": +{ + "frame": {"x":586,"y":1426,"w":47,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":28,"w":47,"h":18}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemButt.png": +{ + "frame": {"x":1956,"y":652,"w":18,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":45,"y":39,"w":18,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemLegs.png": +{ + "frame": {"x":1038,"y":43,"w":24,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":42,"y":38,"w":24,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemNeckRestraints.png": +{ + "frame": {"x":1037,"y":336,"w":20,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":44,"y":38,"w":20,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemNipples.png": +{ + "frame": {"x":1956,"y":622,"w":19,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":47,"y":40,"w":19,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemVulva.png": +{ + "frame": {"x":1038,"y":152,"w":22,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":43,"y":38,"w":22,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Hammer.png": +{ + "frame": {"x":1124,"y":1418,"w":50,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":22,"w":50,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/IceBreaker.png": +{ + "frame": {"x":1853,"y":1948,"w":60,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":11,"w":60,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/IceCube.png": +{ + "frame": {"x":1693,"y":549,"w":52,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":24,"w":52,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Knives.png": +{ + "frame": {"x":1229,"y":1418,"w":50,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":26,"w":50,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Lore.png": +{ + "frame": {"x":1945,"y":1636,"w":20,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":52,"w":20,"h":19}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/MagicSpear.png": +{ + "frame": {"x":1404,"y":295,"w":70,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":19,"w":70,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Maul.png": +{ + "frame": {"x":1264,"y":550,"w":62,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":21,"w":62,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/MistressKey.png": +{ + "frame": {"x":133,"y":2026,"w":58,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":24,"w":58,"h":19}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/PotionWill.png": +{ + "frame": {"x":1963,"y":489,"w":28,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":4,"w":28,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/RedKey.png": +{ + "frame": {"x":1956,"y":1035,"w":45,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":26,"w":45,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/BallGags.png": +{ + "frame": {"x":726,"y":2018,"w":55,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":22,"w":55,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Belts.png": +{ + "frame": {"x":312,"y":2026,"w":57,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":27,"w":57,"h":18}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Blindfolds.png": +{ + "frame": {"x":669,"y":2018,"w":55,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":22,"w":55,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Bustier.png": +{ + "frame": {"x":740,"y":921,"w":181,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":33,"w":181,"h":135}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Gags.png": +{ + "frame": {"x":726,"y":2018,"w":55,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":22,"w":55,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Ice.png": +{ + "frame": {"x":1693,"y":549,"w":52,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":24,"w":52,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/LeatherBoots.png": +{ + "frame": {"x":580,"y":180,"w":128,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":13,"w":128,"h":180}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/LeatherGloves.png": +{ + "frame": {"x":1506,"y":1296,"w":153,"h":141}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":32,"w":153,"h":141}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/MagicBelts.png": +{ + "frame": {"x":253,"y":2026,"w":57,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":27,"w":57,"h":18}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/PlugGags.png": +{ + "frame": {"x":1373,"y":1954,"w":65,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":23,"w":65,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/SteelBoots.png": +{ + "frame": {"x":580,"y":532,"w":120,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":37,"y":20,"w":120,"h":169}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/WiredVibe.png": +{ + "frame": {"x":1345,"y":1296,"w":159,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":3,"w":159,"h":143}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Yokes.png": +{ + "frame": {"x":1507,"y":1954,"w":62,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":17,"w":62,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/SlimeClaymore.png": +{ + "frame": {"x":1277,"y":658,"w":72,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":18,"w":72,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffElectric.png": +{ + "frame": {"x":1963,"y":426,"w":31,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":2,"w":31,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StormBreaker.png": +{ + "frame": {"x":1198,"y":550,"w":64,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":20,"w":64,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Sweeper.png": +{ + "frame": {"x":1,"y":2026,"w":61,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":26,"w":61,"h":19}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Lock.png": +{ + "frame": {"x":1977,"y":640,"w":13,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":29,"y":0,"w":13,"h":17}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Particles/Heart.png": +{ + "frame": {"x":1349,"y":1062,"w":14,"h":14}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, + "sourceSize": {"w":14,"h":14} +}, +"Game/Particles/ShockCollarHit.png": +{ + "frame": {"x":1714,"y":1505,"w":63,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":16,"w":63,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Poses/BlushExtreme.png": +{ + "frame": {"x":719,"y":1426,"w":38,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":16,"w":38,"h":17}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Eyes2Surprised.png": +{ + "frame": {"x":702,"y":642,"w":15,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":13,"w":15,"h":15}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/EyesSurprised.png": +{ + "frame": {"x":702,"y":642,"w":15,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":13,"w":15,"h":15}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Hogtie.png": +{ + "frame": {"x":997,"y":1422,"w":44,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":14,"w":44,"h":21}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/KneelClosed.png": +{ + "frame": {"x":1788,"y":1431,"w":21,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":10,"w":21,"h":21}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Spread.png": +{ + "frame": {"x":1955,"y":683,"w":17,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":10,"w":17,"h":25}, + "sourceSize": {"w":46,"h":45} +}, +"Game/ShopBasic/RedKey.png": +{ + "frame": {"x":1038,"y":1057,"w":43,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":27,"w":43,"h":20}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShrineAura.png": +{ + "frame": {"x":1956,"y":1375,"w":21,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":20,"w":21,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AllyFireboltHit.png": +{ + "frame": {"x":1111,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ApprenticeFire.png": +{ + "frame": {"x":2021,"y":1148,"w":25,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":17,"w":25,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ApprenticeWater.png": +{ + "frame": {"x":1038,"y":187,"w":20,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":19,"w":20,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ArrowVineSpell.png": +{ + "frame": {"x":1520,"y":549,"w":61,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":20,"w":61,"h":31}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Awaken.png": +{ + "frame": {"x":1333,"y":582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Blink.png": +{ + "frame": {"x":1440,"y":1954,"w":65,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":17,"w":65,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Corona.png": +{ + "frame": {"x":1407,"y":582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/EarthMote.png": +{ + "frame": {"x":1809,"y":549,"w":60,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":20,"w":60,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Fissure.png": +{ + "frame": {"x":1992,"y":1636,"w":55,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":0,"w":55,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FlashFreeze.png": +{ + "frame": {"x":1976,"y":733,"w":71,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":71,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FloatingWeapon.png": +{ + "frame": {"x":1620,"y":293,"w":69,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":19,"w":69,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Gust.png": +{ + "frame": {"x":1547,"y":295,"w":71,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":19,"w":71,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Ignite.png": +{ + "frame": {"x":1111,"y":584,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Leap.png": +{ + "frame": {"x":1481,"y":582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/MakeEssenceMote.png": +{ + "frame": {"x":1638,"y":549,"w":53,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":21,"w":53,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ShadowBlade.png": +{ + "frame": {"x":1491,"y":656,"w":66,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":13,"w":66,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SlimeEruption.png": +{ + "frame": {"x":1903,"y":710,"w":71,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":71,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SlimeWall.png": +{ + "frame": {"x":1398,"y":1991,"w":72,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":9,"w":72,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SlimeWallHoriz.png": +{ + "frame": {"x":1398,"y":1991,"w":72,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":9,"w":72,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SpellChoiceUp2.png": +{ + "frame": {"x":1281,"y":1412,"w":62,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":20,"w":62,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SteelRainBurst.png": +{ + "frame": {"x":1703,"y":621,"w":65,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":65,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonAMGag.png": +{ + "frame": {"x":612,"y":2018,"w":55,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":22,"w":55,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonBlindfold.png": +{ + "frame": {"x":669,"y":2018,"w":55,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":22,"w":55,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonCuffs.png": +{ + "frame": {"x":1685,"y":1954,"w":51,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":19,"w":51,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonGag.png": +{ + "frame": {"x":783,"y":2018,"w":55,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":22,"w":55,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonYoke.png": +{ + "frame": {"x":1507,"y":1954,"w":62,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":17,"w":62,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ZeroResistance.png": +{ + "frame": {"x":1038,"y":1,"w":23,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":16,"w":23,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/AutoWait/VeryFast.png": +{ + "frame": {"x":1140,"y":1055,"w":49,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":19,"w":49,"h":21}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/BoxSmall.png": +{ + "frame": {"x":1669,"y":888,"w":22,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":22,"h":22}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/Buttons/Ransom.png": +{ + "frame": {"x":987,"y":1057,"w":49,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":31,"w":49,"h":20}, + "sourceSize": {"w":80,"h":80} +}, +"Game/UI/CheckSmall.png": +{ + "frame": {"x":1788,"y":1639,"w":19,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":8,"w":19,"h":16}, + "sourceSize": {"w":30,"h":30} +}, +"Game/UI/CollectionFilter/Rank0.png": +{ + "frame": {"x":1809,"y":588,"w":46,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":46,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Rank4.png": +{ + "frame": {"x":1395,"y":550,"w":62,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":19,"w":62,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Demote.png": +{ + "frame": {"x":1857,"y":588,"w":46,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":24,"w":46,"h":32}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/Disperse.png": +{ + "frame": {"x":1752,"y":1636,"w":34,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":7,"w":34,"h":20}, + "sourceSize": {"w":34,"h":33} +}, +"Game/UI/escaped.png": +{ + "frame": {"x":1038,"y":78,"w":24,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":2,"w":24,"h":33}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/evasion.png": +{ + "frame": {"x":1870,"y":1636,"w":25,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":25,"h":19}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/Hands.png": +{ + "frame": {"x":826,"y":1426,"w":28,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":8,"w":28,"h":17}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/Heart.png": +{ + "frame": {"x":1349,"y":1062,"w":14,"h":14}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, + "sourceSize": {"w":14,"h":14} +}, +"Game/UI/HeartExtreme.png": +{ + "frame": {"x":1365,"y":1062,"w":14,"h":14}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, + "sourceSize": {"w":14,"h":14} +}, +"Game/UI/key.png": +{ + "frame": {"x":759,"y":1426,"w":33,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":9,"w":33,"h":17}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/Log/Action.png": +{ + "frame": {"x":1037,"y":409,"w":19,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":14,"w":19,"h":32}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/MiniMap/ChargerCrystal.png": +{ + "frame": {"x":1669,"y":808,"w":22,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":22,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/ChargerEmpty.png": +{ + "frame": {"x":1669,"y":834,"w":22,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":22,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/Chest.png": +{ + "frame": {"x":1956,"y":1328,"w":22,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":22,"h":21}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/Key.png": +{ + "frame": {"x":945,"y":1426,"w":24,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":24,"h":17}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/Stairs.png": +{ + "frame": {"x":1956,"y":1278,"w":23,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":23,"h":23}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/StairsDown.png": +{ + "frame": {"x":1956,"y":1303,"w":23,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":23,"h":23}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/Tablet.png": +{ + "frame": {"x":1952,"y":784,"w":22,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":22,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/Move.png": +{ + "frame": {"x":1881,"y":654,"w":22,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":2,"w":22,"h":27}, + "sourceSize": {"w":34,"h":33} +}, +"Game/UI/Rank/Rank0.png": +{ + "frame": {"x":1809,"y":588,"w":46,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":46,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Rename.png": +{ + "frame": {"x":1915,"y":1948,"w":60,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":17,"w":60,"h":38}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/Select.png": +{ + "frame": {"x":1037,"y":409,"w":19,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":0,"w":19,"h":32}, + "sourceSize": {"w":34,"h":33} +}, +"Game/UI/SideRoom/BanditFort.png": +{ + "frame": {"x":702,"y":532,"w":16,"h":16}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, + "sourceSize": {"w":16,"h":16} +}, +"Game/UI/SideRoom/DemonTransition.png": +{ + "frame": {"x":702,"y":550,"w":16,"h":16}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, + "sourceSize": {"w":16,"h":16} +}, +"Game/UI/SideRoom/ElevatorEgyptian.png": +{ + "frame": {"x":702,"y":568,"w":16,"h":16}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, + "sourceSize": {"w":16,"h":16} +}, +"Game/UI/SideRoom/ElevatorEgyptian2.png": +{ + "frame": {"x":702,"y":568,"w":16,"h":16}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, + "sourceSize": {"w":16,"h":16} +}, +"Game/UI/SideRoom/ElevatorRoom.png": +{ + "frame": {"x":702,"y":586,"w":16,"h":16}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16}, + "sourceSize": {"w":16,"h":16} +}, +"Game/UI/SideRoom/GoldVault.png": +{ + "frame": {"x":1977,"y":622,"w":14,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":14,"h":16}, + "sourceSize": {"w":16,"h":16} +}, +"Game/UI/Tick.png": +{ + "frame": {"x":1037,"y":549,"w":17,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":17,"h":33}, + "sourceSize": {"w":18,"h":41} +}, +"Game/UI/UsePotionFrigid.png": +{ + "frame": {"x":1788,"y":1499,"w":19,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":19,"h":22}, + "sourceSize": {"w":44,"h":26} +}, +"Game/UI/UsePotionMana.png": +{ + "frame": {"x":1788,"y":1523,"w":19,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":19,"h":22}, + "sourceSize": {"w":44,"h":26} +}, +"Game/UI/UsePotionStamina.png": +{ + "frame": {"x":1788,"y":1547,"w":19,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":19,"h":22}, + "sourceSize": {"w":44,"h":26} +}, +"Game/UI/UsePotionWill.png": +{ + "frame": {"x":1788,"y":1571,"w":19,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":19,"h":22}, + "sourceSize": {"w":44,"h":26} +}, +"Game/UI/vision.png": +{ + "frame": {"x":826,"y":1426,"w":28,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":8,"w":28,"h":17}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/Wait.png": +{ + "frame": {"x":1038,"y":1,"w":23,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":10,"w":23,"h":40}, + "sourceSize": {"w":60,"h":60} +}, +"Game/Up.png": +{ + "frame": {"x":433,"y":2026,"w":60,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":8,"w":60,"h":17}, + "sourceSize": {"w":86,"h":36} +}, +"Game/Vision.png": +{ + "frame": {"x":1062,"y":919,"w":134,"h":134}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":5,"w":134,"h":134}, + "sourceSize": {"w":144,"h":144} +}, +"Game/WarningMove.png": +{ + "frame": {"x":635,"y":1426,"w":42,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":27,"w":42,"h":18}, + "sourceSize": {"w":72,"h":72} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "game2.png", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "1", + "related_multi_packs": [ "game0.json", "game1.json", "game3.json", "game4.json", "game5.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:93331e914a1bc9da57f494945b1cabd8:29d6d373e93b4cfb07f84e92c1fd5a73:54a7432a0665349a58c0c74f51e75c65$" +} +} diff --git a/TextureAtlas/game2.png b/TextureAtlas/game2.png new file mode 100644 index 000000000..fca45dde5 Binary files /dev/null and b/TextureAtlas/game2.png differ diff --git a/TextureAtlas/game3.json b/TextureAtlas/game3.json new file mode 100644 index 000000000..624f5fca4 --- /dev/null +++ b/TextureAtlas/game3.json @@ -0,0 +1,3181 @@ +{"frames": { + +"Game/AutoStruggle.png": +{ + "frame": {"x":1,"y":2013,"w":54,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":17,"w":54,"h":34}, + "sourceSize": {"w":56,"h":56} +}, +"Game/BackpackOpen.png": +{ + "frame": {"x":1996,"y":642,"w":50,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":10,"w":50,"h":66}, + "sourceSize": {"w":56,"h":86} +}, +"Game/Bullets/AllyFirebolt.png": +{ + "frame": {"x":644,"y":1664,"w":41,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":20,"w":41,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArcaneBlast.png": +{ + "frame": {"x":1612,"y":1118,"w":60,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":9,"w":60,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AreaElectrify.png": +{ + "frame": {"x":1425,"y":1633,"w":164,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":20,"w":164,"h":182}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ArmbinderBolt.png": +{ + "frame": {"x":1578,"y":772,"w":40,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":19,"w":40,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BigBoulderHit.png": +{ + "frame": {"x":639,"y":1048,"w":191,"h":212}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":4,"w":191,"h":212}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BladeDanceBullet.png": +{ + "frame": {"x":1770,"y":809,"w":168,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BoulderKicked.png": +{ + "frame": {"x":318,"y":2009,"w":59,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":17,"w":59,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BoundByFateHit.png": +{ + "frame": {"x":1,"y":1,"w":213,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BubbleBurstHit.png": +{ + "frame": {"x":637,"y":631,"w":204,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":4,"w":204,"h":205}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BubbleBurstLatexHit.png": +{ + "frame": {"x":644,"y":213,"w":205,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":5,"w":205,"h":206}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BubbleBurstSlime.png": +{ + "frame": {"x":1777,"y":1880,"w":149,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":33,"y":33,"w":149,"h":149}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BubbleBurstSlimeHit.png": +{ + "frame": {"x":432,"y":1061,"w":205,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":5,"w":205,"h":206}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/CrackleTrailHit.png": +{ + "frame": {"x":1499,"y":1817,"w":69,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":7,"w":69,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrystalPuffHit.png": +{ + "frame": {"x":57,"y":2013,"w":54,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":19,"w":54,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrystalShockBoltHit.png": +{ + "frame": {"x":216,"y":1273,"w":211,"h":212}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":211,"h":212}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/CursedArrowHit.png": +{ + "frame": {"x":1641,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/DarkShroud.png": +{ + "frame": {"x":216,"y":425,"w":214,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":214,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/DragonFlowerSporesHit.png": +{ + "frame": {"x":1,"y":1721,"w":210,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":210,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/DragonIceBoltHit.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Earthfield.png": +{ + "frame": {"x":857,"y":1,"w":196,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":8,"w":196,"h":208}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EarthfieldHit.png": +{ + "frame": {"x":637,"y":838,"w":196,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":8,"w":196,"h":208}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Earthrune.png": +{ + "frame": {"x":857,"y":1,"w":196,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":8,"w":196,"h":208}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EarthruneHit.png": +{ + "frame": {"x":637,"y":838,"w":196,"h":208}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":8,"w":196,"h":208}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Electrify.png": +{ + "frame": {"x":1499,"y":1817,"w":69,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":7,"w":69,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EncaseBolt.png": +{ + "frame": {"x":1131,"y":1228,"w":33,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":25,"w":33,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyEnchantRope2Hit.png": +{ + "frame": {"x":1624,"y":1,"w":168,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":17,"w":168,"h":178}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/EnemyEnchantRopeHit.png": +{ + "frame": {"x":1774,"y":181,"w":168,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":17,"w":168,"h":178}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/EnemyFlashHit.png": +{ + "frame": {"x":427,"y":215,"w":215,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":6,"w":215,"h":205}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EnemyLatexGagBolt.png": +{ + "frame": {"x":1476,"y":772,"w":55,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":19,"w":55,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySteelRainPlug.png": +{ + "frame": {"x":832,"y":1230,"w":48,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":22,"w":48,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Entangle.png": +{ + "frame": {"x":1242,"y":1045,"w":183,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":19,"w":183,"h":180}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FeatherCloud.png": +{ + "frame": {"x":1205,"y":1445,"w":183,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":19,"w":183,"h":190}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Feathers.png": +{ + "frame": {"x":1390,"y":1445,"w":183,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":19,"w":183,"h":186}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FeathersHit.png": +{ + "frame": {"x":1427,"y":1045,"w":183,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":16,"w":183,"h":180}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FlashBomb.png": +{ + "frame": {"x":1567,"y":1227,"w":28,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":88,"y":96,"w":28,"h":26}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FlashHit.png": +{ + "frame": {"x":427,"y":215,"w":215,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":6,"w":215,"h":205}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FreezeRuneStrikeHit.png": +{ + "frame": {"x":1760,"y":1252,"w":170,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":23,"w":170,"h":170}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/GlueBombHit.png": +{ + "frame": {"x":644,"y":1465,"w":185,"h":197}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":8,"w":185,"h":197}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/GravityPull.png": +{ + "frame": {"x":1,"y":216,"w":213,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/GravityPullEarthHit.png": +{ + "frame": {"x":1,"y":431,"w":213,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/GravityPullHit.png": +{ + "frame": {"x":1,"y":646,"w":213,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/GreaterFlash.png": +{ + "frame": {"x":1028,"y":1256,"w":187,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":25,"w":187,"h":187}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/GreaterFlashHit.png": +{ + "frame": {"x":641,"y":1699,"w":215,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":6,"w":215,"h":205}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Hailstorm.png": +{ + "frame": {"x":216,"y":1487,"w":212,"h":211}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":212,"h":211}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/HailstormHit.png": +{ + "frame": {"x":429,"y":1273,"w":212,"h":211}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":212,"h":211}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/HexLatexExplosionHit.png": +{ + "frame": {"x":1591,"y":1627,"w":164,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":15,"w":164,"h":180}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/HighBolt.png": +{ + "frame": {"x":553,"y":1987,"w":70,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":6,"w":70,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceboltHit.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceBreath.png": +{ + "frame": {"x":852,"y":416,"w":182,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":4,"w":182,"h":205}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/IceBreathChannel.png": +{ + "frame": {"x":1,"y":861,"w":213,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/IceBreathChannelHit.png": +{ + "frame": {"x":1,"y":861,"w":213,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/IceDragonBreath.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceDragonBreathHit.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceDragonBreathPrepareHit.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceDragonBreathTrailHit.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceexpHit.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceOrbHit.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Icerune.png": +{ + "frame": {"x":1036,"y":416,"w":182,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":4,"w":182,"h":205}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/IceSlow.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceSlowHit.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceSlowTrail.png": +{ + "frame": {"x":918,"y":1979,"w":72,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceSlowTrailHit.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IcicleHit.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/KineticLanceHit.png": +{ + "frame": {"x":1846,"y":979,"w":150,"h":169}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":43,"y":23,"w":150,"h":169}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Knife.png": +{ + "frame": {"x":208,"y":2013,"w":43,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":24,"w":43,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexGagBolt.png": +{ + "frame": {"x":1476,"y":772,"w":55,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":19,"w":55,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LightningBoltTrailHit.png": +{ + "frame": {"x":625,"y":1987,"w":70,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":70,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LiquidMetalBurstHit.png": +{ + "frame": {"x":1432,"y":1,"w":190,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":17,"w":190,"h":186}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/MagicMissileChannel.png": +{ + "frame": {"x":1,"y":1076,"w":213,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/MagicMissileChannelHit.png": +{ + "frame": {"x":1,"y":1076,"w":213,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ManyShadowHands.png": +{ + "frame": {"x":1,"y":1939,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManyShadowHandsHit.png": +{ + "frame": {"x":75,"y":1939,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManySlimes.png": +{ + "frame": {"x":1940,"y":855,"w":70,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":70,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/NurseBola.png": +{ + "frame": {"x":1930,"y":1622,"w":64,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":0,"w":64,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ObserverBeamHit.png": +{ + "frame": {"x":149,"y":1939,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/PoisonBreath.png": +{ + "frame": {"x":831,"y":1465,"w":185,"h":197}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":8,"w":185,"h":197}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Rainstorm.png": +{ + "frame": {"x":213,"y":1721,"w":212,"h":212}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":212,"h":212}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/RainstormHit.png": +{ + "frame": {"x":427,"y":1,"w":212,"h":212}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":212,"h":212}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/RedSlime.png": +{ + "frame": {"x":816,"y":1664,"w":46,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":23,"w":46,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RibbonBurstHit.png": +{ + "frame": {"x":1217,"y":1256,"w":183,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":13,"w":183,"h":187}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RopeEngulf.png": +{ + "frame": {"x":843,"y":628,"w":195,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":2,"w":195,"h":194}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RopeEngulfHit.png": +{ + "frame": {"x":1760,"y":386,"w":160,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RopeEngulfWeak.png": +{ + "frame": {"x":1027,"y":824,"w":195,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":2,"w":195,"h":194}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RopeEngulfWeakHit.png": +{ + "frame": {"x":1760,"y":386,"w":160,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RopeRuneStrikeHit.png": +{ + "frame": {"x":1760,"y":386,"w":160,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RopeStrike.png": +{ + "frame": {"x":1402,"y":1256,"w":183,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":13,"w":183,"h":186}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RopeStrikeHit.png": +{ + "frame": {"x":1760,"y":386,"w":160,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RubberSlime.png": +{ + "frame": {"x":641,"y":1,"w":214,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":214,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_BeltHit.png": +{ + "frame": {"x":1596,"y":809,"w":172,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":21,"w":172,"h":180}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_BubbleHit.png": +{ + "frame": {"x":637,"y":631,"w":204,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":4,"w":204,"h":205}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_LatexBallHit.png": +{ + "frame": {"x":1675,"y":991,"w":169,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":22,"w":169,"h":170}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_LatexHit.png": +{ + "frame": {"x":216,"y":637,"w":214,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":4,"w":214,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_LatexSphereHit.png": +{ + "frame": {"x":1675,"y":991,"w":169,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":22,"w":169,"h":170}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_LeatherHit.png": +{ + "frame": {"x":1603,"y":585,"w":172,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":21,"w":172,"h":180}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_RibbonHit.png": +{ + "frame": {"x":1217,"y":1256,"w":183,"h":187}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":13,"w":183,"h":187}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_RopeHit.png": +{ + "frame": {"x":1760,"y":386,"w":160,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_RubberHit.png": +{ + "frame": {"x":216,"y":849,"w":214,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":214,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_SlimeBubbleHit.png": +{ + "frame": {"x":646,"y":421,"w":204,"h":205}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":4,"w":204,"h":205}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_SlimeHit.png": +{ + "frame": {"x":858,"y":1694,"w":190,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":17,"w":190,"h":186}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_VineHit.png": +{ + "frame": {"x":841,"y":1260,"w":185,"h":197}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":8,"w":185,"h":197}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SagittaHit.png": +{ + "frame": {"x":1770,"y":809,"w":168,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ShadowDance.png": +{ + "frame": {"x":223,"y":1935,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowGraspHit.png": +{ + "frame": {"x":1049,"y":211,"w":185,"h":201}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":185,"h":201}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ShadowShroudGirlHit.png": +{ + "frame": {"x":1731,"y":1954,"w":44,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":4,"w":44,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShockHit.png": +{ + "frame": {"x":770,"y":1980,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShockStrikeHit.png": +{ + "frame": {"x":770,"y":1980,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Shroud.png": +{ + "frame": {"x":216,"y":425,"w":214,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":214,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SleepGas.png": +{ + "frame": {"x":831,"y":1465,"w":185,"h":197}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":8,"w":185,"h":197}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SleepGasHit.png": +{ + "frame": {"x":1224,"y":819,"w":185,"h":197}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":8,"w":185,"h":197}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Slime.png": +{ + "frame": {"x":216,"y":849,"w":214,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":214,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SlimeBallHit.png": +{ + "frame": {"x":1922,"y":509,"w":72,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SlimeBallTrail.png": +{ + "frame": {"x":297,"y":1935,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SlimeEruptionHit.png": +{ + "frame": {"x":297,"y":1935,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SlimePuddle.png": +{ + "frame": {"x":882,"y":1230,"w":46,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":23,"w":46,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SmokeBomb.png": +{ + "frame": {"x":1996,"y":1769,"w":29,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":95,"y":92,"w":29,"h":28}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SpikeTrap.png": +{ + "frame": {"x":1050,"y":1046,"w":190,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":24,"w":190,"h":180}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SpikeTrapHit.png": +{ + "frame": {"x":835,"y":838,"w":190,"h":201}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":3,"w":190,"h":201}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SporesHappyHit.png": +{ + "frame": {"x":432,"y":631,"w":203,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":3,"w":203,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SporesHit.png": +{ + "frame": {"x":1,"y":1721,"w":210,"h":216}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":210,"h":216}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SporesSickHit.png": +{ + "frame": {"x":831,"y":1465,"w":185,"h":197}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":8,"w":185,"h":197}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/StaticSphereStrikeHit.png": +{ + "frame": {"x":770,"y":1980,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SteelRainPlug.png": +{ + "frame": {"x":832,"y":1230,"w":48,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":22,"w":48,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonSkeletons.png": +{ + "frame": {"x":1238,"y":1694,"w":185,"h":184}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":23,"w":185,"h":184}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SummonZombies.png": +{ + "frame": {"x":1243,"y":1,"w":187,"h":193}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":14,"w":187,"h":193}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Taunt.png": +{ + "frame": {"x":1,"y":1291,"w":213,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TauntHit.png": +{ + "frame": {"x":1,"y":1506,"w":213,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TidalBallHit.png": +{ + "frame": {"x":216,"y":1061,"w":214,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":214,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapCrystal.png": +{ + "frame": {"x":1040,"y":623,"w":192,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":12,"w":192,"h":194}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapCrystalHit.png": +{ + "frame": {"x":1424,"y":196,"w":186,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":8,"w":186,"h":190}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapLatex.png": +{ + "frame": {"x":832,"y":1048,"w":216,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":36,"w":216,"h":180}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapLatexBallHit.png": +{ + "frame": {"x":644,"y":213,"w":205,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":5,"w":205,"h":206}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapLatexBubbleHit.png": +{ + "frame": {"x":644,"y":213,"w":205,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":5,"w":205,"h":206}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapLeatherWeak.png": +{ + "frame": {"x":1777,"y":582,"w":172,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":21,"w":172,"h":180}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapLustCloud.png": +{ + "frame": {"x":851,"y":213,"w":196,"h":201}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":6,"w":196,"h":201}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapLustCloudHit.png": +{ + "frame": {"x":432,"y":631,"w":203,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":3,"w":203,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapMagicChainsWeak.png": +{ + "frame": {"x":216,"y":1,"w":209,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":6,"w":209,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapMummyWeak.png": +{ + "frame": {"x":1234,"y":611,"w":182,"h":196}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":8,"w":182,"h":196}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapMummyWeakHit.png": +{ + "frame": {"x":1220,"y":414,"w":188,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":15,"w":188,"h":195}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapRibbons.png": +{ + "frame": {"x":1587,"y":1255,"w":171,"h":171}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":28,"y":18,"w":171,"h":171}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapRibbonsHit.png": +{ + "frame": {"x":1598,"y":388,"w":160,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":16,"w":160,"h":195}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapRopeHoly.png": +{ + "frame": {"x":1055,"y":1,"w":186,"h":196}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":14,"w":186,"h":196}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapRopeHolyHit.png": +{ + "frame": {"x":1236,"y":199,"w":186,"h":196}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":14,"w":186,"h":196}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapRopeStrong.png": +{ + "frame": {"x":1741,"y":1428,"w":171,"h":171}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":28,"y":18,"w":171,"h":171}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapRopeStrongHit.png": +{ + "frame": {"x":1612,"y":189,"w":160,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":16,"w":160,"h":195}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapRopeWeak.png": +{ + "frame": {"x":1757,"y":1627,"w":171,"h":170}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":28,"y":18,"w":171,"h":170}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapRopeWeakHit.png": +{ + "frame": {"x":1760,"y":386,"w":160,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapSCloud.png": +{ + "frame": {"x":643,"y":1262,"w":196,"h":201}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":6,"w":196,"h":201}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapSCloudHit.png": +{ + "frame": {"x":432,"y":846,"w":203,"h":213}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":3,"w":203,"h":213}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapShackleWeak.png": +{ + "frame": {"x":216,"y":213,"w":209,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":6,"w":209,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapShackleWeakHit.png": +{ + "frame": {"x":1018,"y":1459,"w":185,"h":191}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":25,"w":185,"h":191}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapShadowLatex.png": +{ + "frame": {"x":427,"y":1700,"w":212,"h":211}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":212,"h":211}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/TrapShadowLatexHit.png": +{ + "frame": {"x":430,"y":1486,"w":212,"h":211}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":212,"h":211}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/TrapSlimeWeak.png": +{ + "frame": {"x":216,"y":849,"w":214,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":214,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapSlimeWeakHit.png": +{ + "frame": {"x":858,"y":1694,"w":190,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":17,"w":190,"h":186}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/VineSlimeBallHit.png": +{ + "frame": {"x":1922,"y":509,"w":72,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WaterRune.png": +{ + "frame": {"x":216,"y":1061,"w":214,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":214,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/WaterRuneHit.png": +{ + "frame": {"x":432,"y":422,"w":212,"h":207}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":7,"w":212,"h":207}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/WitchElectrifyHit.png": +{ + "frame": {"x":1066,"y":1979,"w":71,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":71,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchSlime.png": +{ + "frame": {"x":216,"y":849,"w":214,"h":210}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":214,"h":210}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/WolfCrackleTrailHit.png": +{ + "frame": {"x":1499,"y":1817,"w":69,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":7,"w":69,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ZoneOfFrost.png": +{ + "frame": {"x":1418,"y":590,"w":183,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":15,"w":183,"h":180}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Bullets/ZoneOfFrostHit.png": +{ + "frame": {"x":1410,"y":397,"w":186,"h":191}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":12,"w":186,"h":191}, + "sourceSize": {"w":212,"h":212} +}, +"Game/Class/Fighter.png": +{ + "frame": {"x":1967,"y":1,"w":49,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":0,"w":49,"h":60}, + "sourceSize": {"w":71,"h":60} +}, +"Game/Class/Peasant.png": +{ + "frame": {"x":1862,"y":764,"w":59,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":59,"h":42}, + "sourceSize": {"w":71,"h":60} +}, +"Game/Conditions/ShieldBuff.png": +{ + "frame": {"x":1774,"y":361,"w":25,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":0,"w":25,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/ShieldDebuff.png": +{ + "frame": {"x":1230,"y":1228,"w":33,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":0,"w":33,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Slow.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Slow_3.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Stun.png": +{ + "frame": {"x":371,"y":1935,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Vulnerable.png": +{ + "frame": {"x":1741,"y":1601,"w":24,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":45,"y":9,"w":24,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/crush.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/drain.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/electric.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/fire.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/glue.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/grope.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/happygas.png": +{ + "frame": {"x":1401,"y":1018,"w":25,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":47,"w":25,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/magic.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/melee.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/pain.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/pierce.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/poison.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/slash.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/souldrain.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/stun.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/tickle.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/unarmed.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/unflinching.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/unstoppable.png": +{ + "frame": {"x":1000,"y":1882,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/FateBoundGround.png": +{ + "frame": {"x":445,"y":1935,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Ice.png": +{ + "frame": {"x":519,"y":1913,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Latex.png": +{ + "frame": {"x":593,"y":1913,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/LatexBlue.png": +{ + "frame": {"x":667,"y":1906,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/LatexGreen.png": +{ + "frame": {"x":741,"y":1906,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/LiquidMetal.png": +{ + "frame": {"x":815,"y":1906,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/NoTeleportPlate.png": +{ + "frame": {"x":1940,"y":929,"w":70,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":14,"w":70,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Sleet.png": +{ + "frame": {"x":889,"y":1905,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Sparks.png": +{ + "frame": {"x":1570,"y":1817,"w":69,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":7,"w":69,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/TauntGround.png": +{ + "frame": {"x":963,"y":1905,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Water.png": +{ + "frame": {"x":1037,"y":1905,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/WaterFrozen.png": +{ + "frame": {"x":1111,"y":1882,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AlchemistPet.png": +{ + "frame": {"x":2012,"y":978,"w":34,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AnimHarness.png": +{ + "frame": {"x":1988,"y":1398,"w":59,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":0,"w":59,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ApprenticeSlime.png": +{ + "frame": {"x":1996,"y":573,"w":50,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":0,"w":50,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BanditGuard.png": +{ + "frame": {"x":2006,"y":1250,"w":41,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":2,"w":41,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BanditMerchant.png": +{ + "frame": {"x":1988,"y":1471,"w":59,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":1,"w":59,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeBlastDoor.png": +{ + "frame": {"x":1139,"y":1956,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/AlchemistPet.png": +{ + "frame": {"x":2012,"y":978,"w":34,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/ApprenticeSlime.png": +{ + "frame": {"x":1996,"y":573,"w":50,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":0,"w":50,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/BanditGuard.png": +{ + "frame": {"x":2006,"y":1250,"w":41,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":2,"w":41,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/BanditMerchant.png": +{ + "frame": {"x":1988,"y":1471,"w":59,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":1,"w":59,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Dragon.png": +{ + "frame": {"x":1997,"y":1610,"w":50,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/DragonheartQuest.png": +{ + "frame": {"x":1997,"y":1610,"w":50,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/MageZombie.png": +{ + "frame": {"x":844,"y":1980,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/MeleeCleric.png": +{ + "frame": {"x":1997,"y":1543,"w":50,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":2,"w":50,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/WitchWater.png": +{ + "frame": {"x":1951,"y":582,"w":43,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":0,"w":43,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/WolfgirlPet.png": +{ + "frame": {"x":2012,"y":1044,"w":34,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CuffedGirl.png": +{ + "frame": {"x":2002,"y":1938,"w":44,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":7,"w":44,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Melissa.png": +{ + "frame": {"x":2018,"y":176,"w":29,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":8,"w":29,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Myrtrice3.png": +{ + "frame": {"x":1996,"y":434,"w":50,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":3,"w":50,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Rai2.png": +{ + "frame": {"x":1612,"y":1044,"w":60,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":0,"w":60,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Alisa.png": +{ + "frame": {"x":2012,"y":1110,"w":34,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":6,"w":34,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Cyborg.png": +{ + "frame": {"x":1996,"y":505,"w":51,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":4,"w":51,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CyborgBerserker.png": +{ + "frame": {"x":1996,"y":710,"w":50,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":4,"w":50,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DollDoor.png": +{ + "frame": {"x":1185,"y":1882,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonheartQuest.png": +{ + "frame": {"x":1997,"y":1610,"w":50,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EpicenterCursed.png": +{ + "frame": {"x":1213,"y":1956,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EpicenterCursed2.png": +{ + "frame": {"x":1259,"y":1880,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ForcefieldBot.png": +{ + "frame": {"x":497,"y":2009,"w":54,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":21,"w":54,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/HeavySkeleton.png": +{ + "frame": {"x":1949,"y":789,"w":44,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":2,"w":44,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/KeeperFire.png": +{ + "frame": {"x":2002,"y":1873,"w":45,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":5,"w":45,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/LatexCube.png": +{ + "frame": {"x":1287,"y":1954,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/LiquidMetalCube.png": +{ + "frame": {"x":1333,"y":1880,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MageZombie.png": +{ + "frame": {"x":844,"y":1980,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MeleeCleric.png": +{ + "frame": {"x":1997,"y":1543,"w":50,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":2,"w":50,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MikoGhost.png": +{ + "frame": {"x":2012,"y":845,"w":35,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":2,"w":35,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Mimic.png": +{ + "frame": {"x":1620,"y":767,"w":55,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":16,"w":55,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MimicLatex.png": +{ + "frame": {"x":1210,"y":1637,"w":71,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":16,"w":71,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/PrisonerBandit.png": +{ + "frame": {"x":1985,"y":324,"w":37,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":23,"w":37,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ShrineMaiden.png": +{ + "frame": {"x":844,"y":1980,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ShrineMaiden_2.png": +{ + "frame": {"x":844,"y":1980,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SlimeMoldSpawner.png": +{ + "frame": {"x":697,"y":1980,"w":71,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":71,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SteelDoor.png": +{ + "frame": {"x":1361,"y":1954,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/StoneDoor.png": +{ + "frame": {"x":1407,"y":1880,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchWater.png": +{ + "frame": {"x":1951,"y":651,"w":43,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":0,"w":43,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WolfDrone.png": +{ + "frame": {"x":936,"y":1882,"w":31,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":17,"w":31,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WolfInstructor.png": +{ + "frame": {"x":2012,"y":912,"w":35,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":35,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WolfShieldDrone.png": +{ + "frame": {"x":1435,"y":1954,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/BanditPet.png": +{ + "frame": {"x":1985,"y":324,"w":37,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":23,"w":37,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Cyborg.png": +{ + "frame": {"x":2011,"y":1799,"w":36,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":4,"w":36,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/CyborgBerserker.png": +{ + "frame": {"x":2006,"y":1317,"w":40,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":4,"w":40,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Demon.png": +{ + "frame": {"x":379,"y":2009,"w":57,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":34,"w":57,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ElementalLeather.png": +{ + "frame": {"x":253,"y":2009,"w":63,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":32,"w":63,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Alchemist.png": +{ + "frame": {"x":773,"y":1664,"w":41,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":7,"w":41,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Alkahestor.png": +{ + "frame": {"x":687,"y":1664,"w":41,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":7,"w":41,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/AllyDoll.png": +{ + "frame": {"x":941,"y":1664,"w":37,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":37,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Apprentice2.png": +{ + "frame": {"x":165,"y":2013,"w":41,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":2,"w":41,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/ApprenticeSlime.png": +{ + "frame": {"x":1533,"y":772,"w":43,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":1,"w":43,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Bandit.png": +{ + "frame": {"x":1236,"y":1018,"w":38,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":38,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/BanditChief.png": +{ + "frame": {"x":1276,"y":1018,"w":30,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":30,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/BanditGrappler.png": +{ + "frame": {"x":864,"y":1664,"w":38,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":38,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Elemental.png": +{ + "frame": {"x":1967,"y":137,"w":53,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":7,"w":53,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/ElementalFire.png": +{ + "frame": {"x":1059,"y":1228,"w":36,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":7,"w":36,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/ElementalLatex.png": +{ + "frame": {"x":1373,"y":1018,"w":26,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":7,"w":26,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/ElementalLeather.png": +{ + "frame": {"x":904,"y":1664,"w":35,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":5,"w":35,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/ElementalWater.png": +{ + "frame": {"x":1967,"y":137,"w":53,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":7,"w":53,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/EncasedDoll.png": +{ + "frame": {"x":980,"y":1664,"w":37,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":37,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Maid.png": +{ + "frame": {"x":1265,"y":1227,"w":34,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":5,"w":34,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/MaidforceHead.png": +{ + "frame": {"x":1930,"y":1769,"w":32,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":5,"w":32,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/MaidforceStalker.png": +{ + "frame": {"x":1301,"y":1227,"w":34,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":5,"w":34,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Miner.png": +{ + "frame": {"x":1373,"y":1227,"w":33,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":5,"w":33,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/MummyCursed.png": +{ + "frame": {"x":1443,"y":1227,"w":30,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":30,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Nawashi.png": +{ + "frame": {"x":1027,"y":1020,"w":41,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":8,"w":41,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Ninja.png": +{ + "frame": {"x":1408,"y":1227,"w":33,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":6,"w":33,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/NinjaStalker.png": +{ + "frame": {"x":1337,"y":1227,"w":34,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":6,"w":34,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/SlimeEnthusiast.png": +{ + "frame": {"x":730,"y":1664,"w":41,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":7,"w":41,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/WitchChain.png": +{ + "frame": {"x":1731,"y":2020,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/WitchEarth.png": +{ + "frame": {"x":1597,"y":1227,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/WitchFlame.png": +{ + "frame": {"x":1928,"y":2021,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/WitchIce.png": +{ + "frame": {"x":1956,"y":2021,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/WitchWater.png": +{ + "frame": {"x":1984,"y":2021,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/WolfOperative.png": +{ + "frame": {"x":1536,"y":1227,"w":29,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":29,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Librarian.png": +{ + "frame": {"x":2018,"y":1,"w":29,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":7,"w":29,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WitchApprentice.png": +{ + "frame": {"x":1951,"y":720,"w":42,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":42,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Bed.png": +{ + "frame": {"x":1922,"y":361,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/ChastityVert.png": +{ + "frame": {"x":1922,"y":435,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/DollVert.png": +{ + "frame": {"x":1944,"y":176,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/LatexVert.png": +{ + "frame": {"x":1944,"y":250,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/MetalVert.png": +{ + "frame": {"x":1967,"y":63,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/PlugVert.png": +{ + "frame": {"x":1481,"y":1880,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/TapeVert.png": +{ + "frame": {"x":1509,"y":1954,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Chest.png": +{ + "frame": {"x":1620,"y":767,"w":55,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestBlue.png": +{ + "frame": {"x":1677,"y":767,"w":55,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestDark.png": +{ + "frame": {"x":1734,"y":767,"w":55,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/CollapsedStairs.png": +{ + "frame": {"x":1555,"y":1880,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/Conveyor.png": +{ + "frame": {"x":1583,"y":1954,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/Down.png": +{ + "frame": {"x":1629,"y":1880,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/DownLeft.png": +{ + "frame": {"x":1657,"y":1954,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/DownOn.png": +{ + "frame": {"x":1166,"y":1228,"w":30,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":25,"w":30,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/DownRight.png": +{ + "frame": {"x":1703,"y":1880,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/Left.png": +{ + "frame": {"x":1457,"y":994,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/LeftDown.png": +{ + "frame": {"x":1531,"y":994,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/LeftOn.png": +{ + "frame": {"x":1411,"y":994,"w":27,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":37,"w":27,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/LeftRightDown.png": +{ + "frame": {"x":1612,"y":1176,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/LeftRightUp.png": +{ + "frame": {"x":1789,"y":1799,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/LeftUp.png": +{ + "frame": {"x":1863,"y":1799,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/Right.png": +{ + "frame": {"x":1686,"y":1176,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/RightDown.png": +{ + "frame": {"x":1760,"y":1176,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/RightOn.png": +{ + "frame": {"x":1428,"y":1018,"w":27,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":37,"w":27,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/RightUp.png": +{ + "frame": {"x":1928,"y":1873,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/SafetyDown.png": +{ + "frame": {"x":1928,"y":1947,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/SafetyLeft.png": +{ + "frame": {"x":1923,"y":1572,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/SafetyUp.png": +{ + "frame": {"x":1834,"y":1176,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/Up.png": +{ + "frame": {"x":1908,"y":1176,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/UpDownLeft.png": +{ + "frame": {"x":1914,"y":1424,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/UpDownRight.png": +{ + "frame": {"x":1914,"y":1498,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/UpOn.png": +{ + "frame": {"x":1198,"y":1228,"w":30,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":21,"w":30,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Crack.png": +{ + "frame": {"x":1996,"y":361,"w":50,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":0,"w":50,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/DollSupply.png": +{ + "frame": {"x":1932,"y":1250,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Spores.png": +{ + "frame": {"x":1932,"y":1324,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/StairsDown.png": +{ + "frame": {"x":1930,"y":1695,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/TableCookies.png": +{ + "frame": {"x":1791,"y":764,"w":69,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":28,"w":69,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Water.png": +{ + "frame": {"x":1937,"y":1799,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Hotbar.png": +{ + "frame": {"x":1605,"y":991,"w":68,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":15,"w":68,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/RemoveOffhand.png": +{ + "frame": {"x":1355,"y":1637,"w":68,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":8,"w":68,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Brownies.png": +{ + "frame": {"x":2012,"y":2003,"w":34,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":13,"w":34,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemBoots.png": +{ + "frame": {"x":1097,"y":1228,"w":32,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":38,"y":43,"w":32,"h":25}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemBreast.png": +{ + "frame": {"x":1964,"y":1769,"w":30,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":39,"y":39,"w":30,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemDevices.png": +{ + "frame": {"x":1923,"y":764,"w":24,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":42,"y":41,"w":24,"h":26}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemNeck.png": +{ + "frame": {"x":969,"y":1882,"w":29,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":46,"w":29,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemPelvis.png": +{ + "frame": {"x":1308,"y":1018,"w":33,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":37,"y":44,"w":33,"h":22}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Gunpowder.png": +{ + "frame": {"x":1944,"y":324,"w":39,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":31,"w":39,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/PotionInvisibility.png": +{ + "frame": {"x":1995,"y":778,"w":52,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":4,"w":52,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/AutoTape.png": +{ + "frame": {"x":930,"y":1230,"w":41,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Charms.png": +{ + "frame": {"x":973,"y":1230,"w":41,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Corsets.png": +{ + "frame": {"x":1794,"y":1,"w":171,"h":173}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":23,"w":171,"h":173}, + "sourceSize": {"w":244,"h":244} +}, +"Game/Items/Restraint/Harnesses.png": +{ + "frame": {"x":1988,"y":1398,"w":59,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":0,"w":59,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/MysticDuctTape.png": +{ + "frame": {"x":1016,"y":1230,"w":41,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/SteelArmor.png": +{ + "frame": {"x":1575,"y":1444,"w":164,"h":181}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":10,"w":164,"h":181}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Items/Restraint/Tape.png": +{ + "frame": {"x":1070,"y":1020,"w":41,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Vibes.png": +{ + "frame": {"x":1197,"y":1020,"w":37,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":23,"w":37,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/VinylTape.png": +{ + "frame": {"x":1113,"y":1020,"w":41,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffIncineration.png": +{ + "frame": {"x":2018,"y":237,"w":28,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":3,"w":28,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Outfits/Dragon.png": +{ + "frame": {"x":1050,"y":1694,"w":186,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":7,"w":186,"h":186}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Particles/HeartPink.png": +{ + "frame": {"x":427,"y":1913,"w":20,"h":20}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":20,"h":20}, + "sourceSize": {"w":20,"h":20} +}, +"Game/Particles/HeartPurple.png": +{ + "frame": {"x":449,"y":1913,"w":20,"h":20}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":20,"h":20}, + "sourceSize": {"w":20,"h":20} +}, +"Game/Poses/Kneel.png": +{ + "frame": {"x":1030,"y":1882,"w":25,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":10,"w":25,"h":21}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Ranged.png": +{ + "frame": {"x":2004,"y":1676,"w":43,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":11,"w":43,"h":65}, + "sourceSize": {"w":50,"h":86} +}, +"Game/ShopBasic/3Bola.png": +{ + "frame": {"x":1283,"y":1637,"w":70,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":9,"w":70,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShopBasic/Dragon.png": +{ + "frame": {"x":1050,"y":1694,"w":186,"h":186}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":7,"w":186,"h":186}, + "sourceSize": {"w":200,"h":200} +}, +"Game/Spells/ApprenticeAir.png": +{ + "frame": {"x":1475,"y":1227,"w":29,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":23,"w":29,"h":27}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ArcaneBlast.png": +{ + "frame": {"x":1612,"y":1118,"w":60,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":9,"w":60,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/BoulderKick.png": +{ + "frame": {"x":318,"y":2009,"w":59,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":17,"w":59,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ChaoticOverflow.png": +{ + "frame": {"x":1425,"y":1817,"w":72,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Coalesce.png": +{ + "frame": {"x":1922,"y":509,"w":72,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Electrify.png": +{ + "frame": {"x":1499,"y":1817,"w":69,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":7,"w":69,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Empower.png": +{ + "frame": {"x":1019,"y":1652,"w":63,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":17,"w":63,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/EmpowerFail.png": +{ + "frame": {"x":1084,"y":1652,"w":63,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":17,"w":63,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FirstWind.png": +{ + "frame": {"x":438,"y":2009,"w":57,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":17,"w":57,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Quickness.png": +{ + "frame": {"x":1156,"y":1020,"w":39,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":24,"w":39,"h":23}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Shatter.png": +{ + "frame": {"x":1715,"y":1809,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Snowball.png": +{ + "frame": {"x":992,"y":1979,"w":72,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SteelRainPlug.png": +{ + "frame": {"x":832,"y":1230,"w":48,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":22,"w":48,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonHarness.png": +{ + "frame": {"x":1988,"y":1398,"w":59,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":0,"w":59,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/TrueSight.png": +{ + "frame": {"x":1418,"y":772,"w":56,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":17,"w":56,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Aim.png": +{ + "frame": {"x":1767,"y":1601,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/AutoWait/Fast.png": +{ + "frame": {"x":858,"y":1882,"w":37,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":19,"w":37,"h":21}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/AutoWait/Normal.png": +{ + "frame": {"x":1057,"y":1882,"w":25,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":19,"w":25,"h":21}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/button_game.png": +{ + "frame": {"x":1506,"y":1227,"w":28,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":14,"w":28,"h":27}, + "sourceSize": {"w":42,"h":56} +}, +"Game/UI/Facility_Servants.png": +{ + "frame": {"x":2022,"y":137,"w":24,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":47,"y":4,"w":24,"h":27}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/GrabClosed.png": +{ + "frame": {"x":1793,"y":1601,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/GrabOpen.png": +{ + "frame": {"x":1819,"y":1601,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/jail.png": +{ + "frame": {"x":1506,"y":1227,"w":28,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":4,"w":28,"h":27}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/MiniMap/Bars.png": +{ + "frame": {"x":1845,"y":1601,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/Bed.png": +{ + "frame": {"x":1871,"y":1601,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/DoorClosed.png": +{ + "frame": {"x":1897,"y":1601,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/DoorOpen.png": +{ + "frame": {"x":1625,"y":1226,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/Ghost.png": +{ + "frame": {"x":1651,"y":1226,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/Grate.png": +{ + "frame": {"x":1677,"y":1226,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/Shrine.png": +{ + "frame": {"x":1703,"y":1226,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/ShrineMana.png": +{ + "frame": {"x":1729,"y":1226,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/ShrineManaQuest.png": +{ + "frame": {"x":1755,"y":1226,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/MiniMap/ShrineQuest.png": +{ + "frame": {"x":1781,"y":1226,"w":24,"h":24}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "sourceSize": {"w":24,"h":24} +}, +"Game/UI/Rank/Rank5.png": +{ + "frame": {"x":1982,"y":1176,"w":64,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":64,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Recycler/Tape.png": +{ + "frame": {"x":1070,"y":1020,"w":41,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Resource/Rune.png": +{ + "frame": {"x":113,"y":2013,"w":50,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":27,"w":50,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/restraint_nokey.png": +{ + "frame": {"x":1343,"y":1018,"w":28,"h":25}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":28,"h":25}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/Sleep.png": +{ + "frame": {"x":1862,"y":764,"w":59,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":59,"h":42}, + "sourceSize": {"w":71,"h":60} +}, +"Game/UI/speed.png": +{ + "frame": {"x":1084,"y":1882,"w":25,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":25,"h":21}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/Sprint.png": +{ + "frame": {"x":897,"y":1882,"w":37,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":19,"w":37,"h":21}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/UsePotionUnavailable.png": +{ + "frame": {"x":471,"y":1913,"w":20,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":4,"w":20,"h":20}, + "sourceSize": {"w":44,"h":26} +}, +"Game/UI/WaitJail.png": +{ + "frame": {"x":1149,"y":1652,"w":59,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":10,"w":59,"h":40}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Wrench.png": +{ + "frame": {"x":1807,"y":1226,"w":24,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":24,"h":24}, + "sourceSize": {"w":26,"h":26} +}, +"Game/VisionNeg.png": +{ + "frame": {"x":1411,"y":809,"w":183,"h":183}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":17,"w":183,"h":183}, + "sourceSize": {"w":216,"h":216} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "game3.png", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "1", + "related_multi_packs": [ "game0.json", "game1.json", "game2.json", "game4.json", "game5.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:93331e914a1bc9da57f494945b1cabd8:29d6d373e93b4cfb07f84e92c1fd5a73:54a7432a0665349a58c0c74f51e75c65$" +} +} diff --git a/TextureAtlas/game3.png b/TextureAtlas/game3.png new file mode 100644 index 000000000..e89c88a32 Binary files /dev/null and b/TextureAtlas/game3.png differ diff --git a/TextureAtlas/game4.json b/TextureAtlas/game4.json new file mode 100644 index 000000000..3c0bde232 --- /dev/null +++ b/TextureAtlas/game4.json @@ -0,0 +1,7325 @@ +{"frames": { + +"Game/Aura/Aura.png": +{ + "frame": {"x":1,"y":1880,"w":142,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/DistractionShield.png": +{ + "frame": {"x":1,"y":1150,"w":144,"h":144}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/EnergyShield.png": +{ + "frame": {"x":1,"y":1296,"w":144,"h":144}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Heart.png": +{ + "frame": {"x":147,"y":1726,"w":143,"h":141}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":143,"h":141}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/LatexBubble.png": +{ + "frame": {"x":1,"y":1442,"w":144,"h":144}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/NoWP.png": +{ + "frame": {"x":1,"y":1588,"w":144,"h":144}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/PsychicLink.png": +{ + "frame": {"x":145,"y":1880,"w":142,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Reload.png": +{ + "frame": {"x":147,"y":1150,"w":142,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Select.png": +{ + "frame": {"x":152,"y":851,"w":142,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/Slimed.png": +{ + "frame": {"x":152,"y":995,"w":142,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Aura/WaterBubble.png": +{ + "frame": {"x":1,"y":1734,"w":144,"h":144}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, + "sourceSize": {"w":144,"h":144} +}, +"Game/Bullets/AllyWindBlast.png": +{ + "frame": {"x":1969,"y":1753,"w":67,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":67,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BanditBolaHit.png": +{ + "frame": {"x":1543,"y":769,"w":65,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":11,"w":65,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BanditBoltaHit.png": +{ + "frame": {"x":1899,"y":1366,"w":65,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":11,"w":65,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BlindfoldBolt.png": +{ + "frame": {"x":379,"y":2017,"w":42,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":20,"w":42,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Bomb.png": +{ + "frame": {"x":1628,"y":814,"w":46,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":84,"y":76,"w":46,"h":64}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/BombItem.png": +{ + "frame": {"x":1628,"y":814,"w":46,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":84,"y":76,"w":46,"h":64}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ColdFeet.png": +{ + "frame": {"x":1903,"y":1412,"w":69,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":69,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ColdFeetHit.png": +{ + "frame": {"x":732,"y":1067,"w":69,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":69,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Crackle.png": +{ + "frame": {"x":734,"y":1797,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrackleHit.png": +{ + "frame": {"x":808,"y":1797,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/DragonSlashHit.png": +{ + "frame": {"x":1833,"y":786,"w":64,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":1,"w":64,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/DragonVineHit.png": +{ + "frame": {"x":1833,"y":856,"w":64,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":64,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/DryadBlastHit.png": +{ + "frame": {"x":438,"y":1798,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ElfArrowHit.png": +{ + "frame": {"x":438,"y":1798,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyFlashBomb.png": +{ + "frame": {"x":289,"y":2017,"w":43,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":82,"y":96,"w":43,"h":29}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EnemyMiscastHit.png": +{ + "frame": {"x":1721,"y":841,"w":68,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":68,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySteelRainBurst.png": +{ + "frame": {"x":1649,"y":693,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySteelRainBurstHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySummonLatexArmbinder.png": +{ + "frame": {"x":1723,"y":402,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySummonLatexArmbinderHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySummonLatexGag.png": +{ + "frame": {"x":1902,"y":149,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySummonLatexGagHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySummonLatexLegbinder.png": +{ + "frame": {"x":1974,"y":218,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySummonLatexLegbinderHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySummonLatexRestraint.png": +{ + "frame": {"x":1901,"y":221,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySummonLatexRestraintHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyWindBlast.png": +{ + "frame": {"x":1969,"y":1753,"w":67,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":67,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Fissure.png": +{ + "frame": {"x":882,"y":1797,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FissureHit.png": +{ + "frame": {"x":882,"y":1797,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FissureTrailHit.png": +{ + "frame": {"x":882,"y":1797,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FlameStrikeHit.png": +{ + "frame": {"x":1,"y":1,"w":168,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FuukaOrbHit.png": +{ + "frame": {"x":1899,"y":1156,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FuukaOrbMultiHit.png": +{ + "frame": {"x":1899,"y":1156,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/GreaterShield.png": +{ + "frame": {"x":1617,"y":1494,"w":55,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":3,"w":55,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/GreaterShieldHit.png": +{ + "frame": {"x":1991,"y":1479,"w":55,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":3,"w":55,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Gust.png": +{ + "frame": {"x":1969,"y":1753,"w":67,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":67,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HexOrb.png": +{ + "frame": {"x":1554,"y":815,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HexOrbHit.png": +{ + "frame": {"x":1554,"y":887,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceLance.png": +{ + "frame": {"x":1549,"y":1111,"w":66,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":2,"w":66,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceLanceHit.png": +{ + "frame": {"x":1554,"y":959,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceOrb.png": +{ + "frame": {"x":1904,"y":1820,"w":63,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":63,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/KineticLance.png": +{ + "frame": {"x":1561,"y":1999,"w":66,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":73,"y":84,"w":66,"h":48}, + "sourceSize": {"w":216,"h":217} +}, +"Game/Bullets/LegbinderBolt.png": +{ + "frame": {"x":1617,"y":1215,"w":56,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":2,"w":56,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LightningRuneStrike.png": +{ + "frame": {"x":1610,"y":765,"w":64,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":13,"w":64,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LightningRuneStrikeHit.png": +{ + "frame": {"x":808,"y":1797,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LustBomb.png": +{ + "frame": {"x":334,"y":2017,"w":43,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":82,"y":96,"w":43,"h":29}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/MagicBeltHit.png": +{ + "frame": {"x":1696,"y":74,"w":71,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":71,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MinerBomb.png": +{ + "frame": {"x":1628,"y":814,"w":46,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":84,"y":76,"w":46,"h":64}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/MirrorImage.png": +{ + "frame": {"x":289,"y":2017,"w":43,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":82,"y":96,"w":43,"h":29}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/MithrilBoltHit.png": +{ + "frame": {"x":1769,"y":220,"w":69,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":3,"w":69,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MummyBoltHit.png": +{ + "frame": {"x":438,"y":1798,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/NatureMoteBoltHit.png": +{ + "frame": {"x":438,"y":1798,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ObsidianBoltHit.png": +{ + "frame": {"x":1899,"y":1086,"w":69,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":3,"w":69,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/OrbHealHit.png": +{ + "frame": {"x":1,"y":171,"w":168,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/PlayerBolaHit.png": +{ + "frame": {"x":1543,"y":769,"w":65,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":11,"w":65,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/PoisonDragonBlastHit.png": +{ + "frame": {"x":438,"y":1798,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RestrainingDeviceHit.png": +{ + "frame": {"x":1831,"y":1414,"w":70,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":70,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RopeBoltLaunchMany.png": +{ + "frame": {"x":1903,"y":1680,"w":64,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":64,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RopeBoltLaunchManyHit.png": +{ + "frame": {"x":1903,"y":1750,"w":64,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":64,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RubberBullets.png": +{ + "frame": {"x":1767,"y":1999,"w":65,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":12,"w":65,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RubberMissileHit.png": +{ + "frame": {"x":1981,"y":147,"w":66,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":1,"w":66,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RubberNukeHit.png": +{ + "frame": {"x":1981,"y":147,"w":66,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":1,"w":66,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SealingBoltHit.png": +{ + "frame": {"x":512,"y":1798,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowGrasp.png": +{ + "frame": {"x":1,"y":341,"w":168,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/ShadowGraspMulti.png": +{ + "frame": {"x":1973,"y":290,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowGraspMultiHit.png": +{ + "frame": {"x":1718,"y":1270,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowSlashHit.png": +{ + "frame": {"x":1,"y":511,"w":168,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/Shatter.png": +{ + "frame": {"x":1,"y":681,"w":168,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SlimeHit.png": +{ + "frame": {"x":660,"y":1067,"w":70,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SmokePuff.png": +{ + "frame": {"x":1721,"y":693,"w":68,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":68,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SmokePuffHit.png": +{ + "frame": {"x":1831,"y":1277,"w":66,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":66,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Snare.png": +{ + "frame": {"x":1769,"y":1,"w":63,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":2,"w":63,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SteamPuffHit.png": +{ + "frame": {"x":1549,"y":1391,"w":66,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":66,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SteelRainBurst.png": +{ + "frame": {"x":1649,"y":693,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SteelRainBurstHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/StraitjacketBolt.png": +{ + "frame": {"x":1542,"y":297,"w":69,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":10,"w":69,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Summon.png": +{ + "frame": {"x":1901,"y":293,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonAMGag.png": +{ + "frame": {"x":1973,"y":362,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonAMGagHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonArmbinder.png": +{ + "frame": {"x":1900,"y":365,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonArmbinderHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonBlindfold.png": +{ + "frame": {"x":1972,"y":434,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonBlindfoldHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonCrystalsHit.png": +{ + "frame": {"x":1769,"y":1,"w":63,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":2,"w":63,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonCuffs.png": +{ + "frame": {"x":1900,"y":437,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonCuffsHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonGag.png": +{ + "frame": {"x":1972,"y":506,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonGagHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonHarness.png": +{ + "frame": {"x":1624,"y":75,"w":70,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":70,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonHarnessHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonHit.png": +{ + "frame": {"x":1901,"y":293,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonLatexArmbinder.png": +{ + "frame": {"x":1723,"y":402,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonLatexArmbinderHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonLatexGag.png": +{ + "frame": {"x":1902,"y":149,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonLatexGagHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonLatexLegbinder.png": +{ + "frame": {"x":1974,"y":218,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonLatexLegbinderHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonLeatherCuffs.png": +{ + "frame": {"x":1900,"y":509,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonLeatherCuffsHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonLegbinder.png": +{ + "frame": {"x":1972,"y":578,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonLegbinderHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonStraitjacket.png": +{ + "frame": {"x":1900,"y":581,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonStraitjacketHit.png": +{ + "frame": {"x":1721,"y":546,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/TrapLatexBall.png": +{ + "frame": {"x":1,"y":1002,"w":149,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":33,"y":36,"w":149,"h":146}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapLatexBubble.png": +{ + "frame": {"x":1,"y":851,"w":149,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":33,"y":33,"w":149,"h":149}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/WindBlast.png": +{ + "frame": {"x":1969,"y":1753,"w":67,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":67,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchElectricOrb.png": +{ + "frame": {"x":1969,"y":1822,"w":67,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":67,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WolfCrackleHit.png": +{ + "frame": {"x":808,"y":1797,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ZombieOrbMini.png": +{ + "frame": {"x":581,"y":815,"w":28,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":22,"w":28,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ChangeSpell.png": +{ + "frame": {"x":1769,"y":1963,"w":36,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":36,"h":34}, + "sourceSize": {"w":38,"h":38} +}, +"Game/Conditions/ArmorDebuff.png": +{ + "frame": {"x":1503,"y":550,"w":72,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Heart.png": +{ + "frame": {"x":1549,"y":1596,"w":32,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":6,"w":32,"h":31}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Teleporting.png": +{ + "frame": {"x":444,"y":1068,"w":70,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Chill.png": +{ + "frame": {"x":1831,"y":1346,"w":66,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":3,"w":66,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Cracked.png": +{ + "frame": {"x":1721,"y":913,"w":68,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":68,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/CrackedFrozen.png": +{ + "frame": {"x":1721,"y":985,"w":68,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":68,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Ember.png": +{ + "frame": {"x":1835,"y":1820,"w":67,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":4,"w":67,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Glue.png": +{ + "frame": {"x":1719,"y":1200,"w":69,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":3,"w":69,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Ignition.png": +{ + "frame": {"x":1835,"y":1820,"w":67,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":4,"w":67,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Inferno.png": +{ + "frame": {"x":516,"y":1068,"w":70,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Inferno_0.png": +{ + "frame": {"x":516,"y":1068,"w":70,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Inferno_1.png": +{ + "frame": {"x":516,"y":1068,"w":70,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Inferno_2.png": +{ + "frame": {"x":516,"y":1068,"w":70,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Inferno_3.png": +{ + "frame": {"x":516,"y":1068,"w":70,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/MotionLamp.png": +{ + "frame": {"x":1898,"y":1958,"w":50,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":18,"w":50,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Portals/CommercePortal.png": +{ + "frame": {"x":1831,"y":997,"w":66,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":66,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Portals/CommercePortalReturn.png": +{ + "frame": {"x":1549,"y":1181,"w":66,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":66,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Portals/DarkPortal.png": +{ + "frame": {"x":1831,"y":1067,"w":66,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":66,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Portals/Portal.png": +{ + "frame": {"x":1549,"y":1251,"w":66,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":66,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Slime.png": +{ + "frame": {"x":734,"y":1656,"w":70,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":5,"w":70,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/SlimeBurning.png": +{ + "frame": {"x":1972,"y":650,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/SlimeFrozen.png": +{ + "frame": {"x":806,"y":1656,"w":70,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":5,"w":70,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Soap.png": +{ + "frame": {"x":1649,"y":619,"w":69,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":69,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/SpikeTrapActive.png": +{ + "frame": {"x":693,"y":2017,"w":32,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":24,"w":32,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/WireSparks.png": +{ + "frame": {"x":587,"y":1656,"w":71,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":5,"w":71,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Adventurer_Dom_Fighter.png": +{ + "frame": {"x":1787,"y":1480,"w":66,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":7,"w":66,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AirMote.png": +{ + "frame": {"x":1624,"y":222,"w":70,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":70,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AngelHostile.png": +{ + "frame": {"x":1828,"y":1612,"w":69,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":3,"w":69,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AnimStraitjacket.png": +{ + "frame": {"x":1542,"y":297,"w":69,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":10,"w":69,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Apprentice2.png": +{ + "frame": {"x":1617,"y":1356,"w":56,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":0,"w":56,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeFire.png": +{ + "frame": {"x":1720,"y":1128,"w":69,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":69,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeIce.png": +{ + "frame": {"x":1831,"y":149,"w":69,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":69,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeMagic.png": +{ + "frame": {"x":588,"y":1068,"w":70,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":2,"w":70,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeRobot.png": +{ + "frame": {"x":1416,"y":1999,"w":72,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":13,"w":72,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/AngelHostile.png": +{ + "frame": {"x":1828,"y":1612,"w":69,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":3,"w":69,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Apprentice2.png": +{ + "frame": {"x":1617,"y":1356,"w":56,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":0,"w":56,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/BlindZombie.png": +{ + "frame": {"x":1791,"y":871,"w":38,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":2,"w":38,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Deputy.png": +{ + "frame": {"x":1676,"y":1093,"w":42,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":42,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/DragonCrystal.png": +{ + "frame": {"x":1769,"y":1823,"w":64,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":3,"w":64,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/ElementalFire.png": +{ + "frame": {"x":1675,"y":1290,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":7,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/ElementalRope.png": +{ + "frame": {"x":1833,"y":577,"w":65,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":4,"w":65,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/ElementalWater.png": +{ + "frame": {"x":1899,"y":1013,"w":69,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":69,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Elf.png": +{ + "frame": {"x":1788,"y":1333,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":7,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Fuuka1.png": +{ + "frame": {"x":1791,"y":938,"w":38,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":2,"w":38,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/MaidforceHead.png": +{ + "frame": {"x":1676,"y":765,"w":43,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":3,"w":43,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/MaidforceMafia.png": +{ + "frame": {"x":1429,"y":69,"w":47,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":0,"w":47,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/MaidforcePara.png": +{ + "frame": {"x":1676,"y":1158,"w":41,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":3,"w":41,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/NawashiZombie.png": +{ + "frame": {"x":1429,"y":138,"w":47,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":1,"w":47,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/SlimeEnthusiast.png": +{ + "frame": {"x":660,"y":1656,"w":72,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":72,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/WitchMagnet.png": +{ + "frame": {"x":1830,"y":1542,"w":69,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":69,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/WitchMetal.png": +{ + "frame": {"x":1969,"y":1224,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/WitchSlime.png": +{ + "frame": {"x":292,"y":1799,"w":71,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":71,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Wolfgirl.png": +{ + "frame": {"x":1676,"y":831,"w":43,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":6,"w":43,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BlindZombie.png": +{ + "frame": {"x":1791,"y":871,"w":38,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":2,"w":38,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CaptureBot.png": +{ + "frame": {"x":1845,"y":1958,"w":51,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":23,"w":51,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Chef.png": +{ + "frame": {"x":1793,"y":535,"w":38,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":1,"w":38,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CorruptedAdventurer.png": +{ + "frame": {"x":1904,"y":1890,"w":68,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":68,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Alisa.png": +{ + "frame": {"x":1676,"y":1029,"w":43,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":6,"w":43,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Rook.png": +{ + "frame": {"x":1617,"y":1286,"w":56,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":3,"w":56,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Myrtrice.png": +{ + "frame": {"x":1617,"y":1564,"w":71,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":9,"w":71,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Myrtrice2.png": +{ + "frame": {"x":1617,"y":1564,"w":71,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":9,"w":71,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Rai.png": +{ + "frame": {"x":1720,"y":619,"w":69,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":69,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Rai2.png": +{ + "frame": {"x":1720,"y":619,"w":69,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":69,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CyborgGuardian.png": +{ + "frame": {"x":1840,"y":220,"w":59,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":59,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DemonMoon.png": +{ + "frame": {"x":1834,"y":291,"w":65,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":3,"w":65,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DemonStar.png": +{ + "frame": {"x":1982,"y":1,"w":64,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":1,"w":64,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DemonVoid.png": +{ + "frame": {"x":1624,"y":1,"w":70,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":70,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Deputy.png": +{ + "frame": {"x":1676,"y":1093,"w":42,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":42,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Dollmaker.png": +{ + "frame": {"x":1429,"y":206,"w":47,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":1,"w":47,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DollmakerBoss1.png": +{ + "frame": {"x":1899,"y":1226,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":1,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DollmakerBoss3b.png": +{ + "frame": {"x":1769,"y":73,"w":62,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":1,"w":62,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Dollsmith.png": +{ + "frame": {"x":1676,"y":897,"w":43,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":1,"w":43,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DollsmithDoll.png": +{ + "frame": {"x":1791,"y":671,"w":40,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":3,"w":40,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DoorLock.png": +{ + "frame": {"x":1831,"y":926,"w":66,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":66,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonCrystal.png": +{ + "frame": {"x":1769,"y":1823,"w":64,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":3,"w":64,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonGirlCrystal.png": +{ + "frame": {"x":1718,"y":1480,"w":67,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":7,"w":67,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonGirlPoison.png": +{ + "frame": {"x":1899,"y":1611,"w":69,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":69,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ElementalFire.png": +{ + "frame": {"x":1675,"y":1290,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":7,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ElementalRope.png": +{ + "frame": {"x":1833,"y":647,"w":65,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":4,"w":65,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ElementalWater.png": +{ + "frame": {"x":1899,"y":1013,"w":69,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":69,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Elf.png": +{ + "frame": {"x":1788,"y":1333,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":7,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EncasedFactoryDoll.png": +{ + "frame": {"x":1791,"y":1138,"w":38,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":38,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/FaithfulZombie.png": +{ + "frame": {"x":1793,"y":603,"w":38,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":1,"w":38,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Fuuka1.png": +{ + "frame": {"x":1791,"y":1005,"w":38,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":2,"w":38,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/GlueTechnician.png": +{ + "frame": {"x":1675,"y":1353,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Golem.png": +{ + "frame": {"x":1718,"y":1340,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":3,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/GreedyGhast.png": +{ + "frame": {"x":1429,"y":338,"w":47,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":5,"w":47,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/HolyConstruct.png": +{ + "frame": {"x":1769,"y":1893,"w":64,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":64,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/IceWall.png": +{ + "frame": {"x":1651,"y":475,"w":69,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":69,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidforceHead.png": +{ + "frame": {"x":1676,"y":765,"w":43,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":3,"w":43,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidforceMafia.png": +{ + "frame": {"x":1429,"y":69,"w":47,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":0,"w":47,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidforcePara.png": +{ + "frame": {"x":1676,"y":1158,"w":41,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":3,"w":41,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidforceQuest.png": +{ + "frame": {"x":1429,"y":69,"w":47,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":0,"w":47,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/NawashiZombie.png": +{ + "frame": {"x":1429,"y":138,"w":47,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":1,"w":47,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/PinkGlueTechnician.png": +{ + "frame": {"x":1788,"y":1396,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/RopeElemental.png": +{ + "frame": {"x":1833,"y":577,"w":65,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":4,"w":65,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SarcoKraken.png": +{ + "frame": {"x":1613,"y":297,"w":68,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":14,"w":68,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ShadowWarrior.png": +{ + "frame": {"x":1833,"y":717,"w":65,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":4,"w":65,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Sleuth.png": +{ + "frame": {"x":1791,"y":805,"w":40,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":2,"w":40,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SlimeAdv.png": +{ + "frame": {"x":1429,"y":272,"w":47,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":47,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SlimeEnthusiast.png": +{ + "frame": {"x":660,"y":1656,"w":72,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":72,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SlimeMoldLeaper.png": +{ + "frame": {"x":1478,"y":75,"w":63,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":1,"w":63,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/StormCrystal.png": +{ + "frame": {"x":1722,"y":475,"w":69,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":2,"w":69,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/TheWarden2.png": +{ + "frame": {"x":1790,"y":1203,"w":39,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":4,"w":39,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Wall.png": +{ + "frame": {"x":586,"y":1798,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WallDoor.png": +{ + "frame": {"x":1831,"y":926,"w":66,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":66,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WardenFighter.png": +{ + "frame": {"x":1855,"y":1480,"w":66,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":7,"w":66,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchAqua.png": +{ + "frame": {"x":1835,"y":1889,"w":67,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":67,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchMagnet.png": +{ + "frame": {"x":1901,"y":1542,"w":69,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":69,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchMetal.png": +{ + "frame": {"x":1969,"y":1294,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchSlime.png": +{ + "frame": {"x":365,"y":1799,"w":71,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":71,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Wolfgirl.png": +{ + "frame": {"x":1676,"y":963,"w":43,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":6,"w":43,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WolfOperative.png": +{ + "frame": {"x":1791,"y":1072,"w":38,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":6,"w":38,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ElementalEarth.png": +{ + "frame": {"x":1683,"y":295,"w":68,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":7,"w":68,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/EncasedFactoryDoll.png": +{ + "frame": {"x":1795,"y":401,"w":37,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":7,"w":37,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Apprentice.png": +{ + "frame": {"x":1807,"y":1963,"w":36,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":0,"w":36,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/BanditHunter.png": +{ + "frame": {"x":829,"y":2017,"w":30,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":30,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/BanditPet.png": +{ + "frame": {"x":453,"y":815,"w":34,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":34,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Cleric.png": +{ + "frame": {"x":423,"y":2017,"w":38,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":2,"w":38,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Conjurer.png": +{ + "frame": {"x":727,"y":2017,"w":32,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":9,"w":32,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/GreaterSkeleton.png": +{ + "frame": {"x":761,"y":2017,"w":32,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":2,"w":32,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Guard.png": +{ + "frame": {"x":521,"y":815,"w":28,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":3,"w":28,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/GuardHeavy.png": +{ + "frame": {"x":1017,"y":2017,"w":27,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":5,"w":27,"h":28}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/HeavySkeleton.png": +{ + "frame": {"x":795,"y":2017,"w":32,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":2,"w":32,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Jailer.png": +{ + "frame": {"x":551,"y":815,"w":28,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":3,"w":28,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/MaidforceMafia.png": +{ + "frame": {"x":541,"y":2017,"w":37,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":3,"w":37,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/MaidforcePara.png": +{ + "frame": {"x":171,"y":815,"w":41,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":3,"w":41,"h":31}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/MeleeCleric.png": +{ + "frame": {"x":340,"y":815,"w":38,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":2,"w":38,"h":31}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Mummy.png": +{ + "frame": {"x":463,"y":2017,"w":38,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":5,"w":38,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/SlimeAdv.png": +{ + "frame": {"x":416,"y":815,"w":35,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":35,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/WitchSlime.png": +{ + "frame": {"x":580,"y":2017,"w":35,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":35,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/SlimeAdv.png": +{ + "frame": {"x":1795,"y":468,"w":37,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":7,"w":37,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Witch.png": +{ + "frame": {"x":1675,"y":1416,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WitchChain.png": +{ + "frame": {"x":1675,"y":1479,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/ChastityHoriz.png": +{ + "frame": {"x":291,"y":1657,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/DollHoriz.png": +{ + "frame": {"x":660,"y":1798,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/LatexHoriz.png": +{ + "frame": {"x":296,"y":1070,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/MetalHoriz.png": +{ + "frame": {"x":365,"y":1656,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/PlugHoriz.png": +{ + "frame": {"x":370,"y":1070,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/BondageMachine/TapeHoriz.png": +{ + "frame": {"x":439,"y":1656,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Cage.png": +{ + "frame": {"x":1790,"y":1268,"w":39,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":6,"w":39,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestGold.png": +{ + "frame": {"x":1429,"y":773,"w":55,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestPearl.png": +{ + "frame": {"x":1486,"y":773,"w":55,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ClamBed.png": +{ + "frame": {"x":1982,"y":74,"w":64,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":64,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/CommercePortalReturn.png": +{ + "frame": {"x":1766,"y":1752,"w":67,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":3,"w":67,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/SafetyRight.png": +{ + "frame": {"x":1046,"y":1999,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/UpLeft.png": +{ + "frame": {"x":1120,"y":1999,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/UpRight.png": +{ + "frame": {"x":1194,"y":1999,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/CrackNone.png": +{ + "frame": {"x":1628,"y":880,"w":46,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":7,"w":46,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/DisplayEgyptian.png": +{ + "frame": {"x":1901,"y":1996,"w":65,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":21,"w":65,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/DollDropoff.png": +{ + "frame": {"x":1974,"y":1890,"w":68,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":68,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/DollDropoffD.png": +{ + "frame": {"x":1899,"y":1296,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":3,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/DollDropoffL.png": +{ + "frame": {"x":1923,"y":1480,"w":66,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":6,"w":66,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/DollDropoffR.png": +{ + "frame": {"x":1972,"y":1549,"w":66,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":6,"w":66,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/DollTerminal.png": +{ + "frame": {"x":1577,"y":546,"w":70,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Doors/CyberDoor.png": +{ + "frame": {"x":1834,"y":362,"w":64,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":2,"w":64,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Doors/CyberDoorOpen.png": +{ + "frame": {"x":1834,"y":434,"w":64,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":2,"w":64,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Elevator.png": +{ + "frame": {"x":1577,"y":619,"w":70,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ElevatorDisabled.png": +{ + "frame": {"x":1577,"y":692,"w":70,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/FutureBox.png": +{ + "frame": {"x":1480,"y":1,"w":60,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":0,"w":60,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/HappyGas.png": +{ + "frame": {"x":1834,"y":1681,"w":67,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":67,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/LightRays.png": +{ + "frame": {"x":1900,"y":653,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Portal.png": +{ + "frame": {"x":1970,"y":1611,"w":67,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":3,"w":67,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/StairsUp.png": +{ + "frame": {"x":1342,"y":1999,"w":72,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Table.png": +{ + "frame": {"x":1620,"y":357,"w":66,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":28,"w":66,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/TablePizza.png": +{ + "frame": {"x":1478,"y":357,"w":69,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":28,"w":69,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/TablePlate.png": +{ + "frame": {"x":1549,"y":357,"w":69,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":28,"w":69,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/WaterFoam.png": +{ + "frame": {"x":289,"y":1869,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/Barrel.png": +{ + "frame": {"x":289,"y":1943,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/Bars.png": +{ + "frame": {"x":291,"y":1139,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/BarsVert.png": +{ + "frame": {"x":291,"y":1213,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/BarsVertCont.png": +{ + "frame": {"x":291,"y":1287,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/Brickwork.png": +{ + "frame": {"x":291,"y":1361,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/DollDropoff.png": +{ + "frame": {"x":291,"y":1435,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/Doodad.png": +{ + "frame": {"x":291,"y":1509,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/Door.png": +{ + "frame": {"x":291,"y":1583,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/DoorOpen.png": +{ + "frame": {"x":292,"y":1725,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/DoorVert.png": +{ + "frame": {"x":363,"y":1869,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/DoorVertCont.png": +{ + "frame": {"x":363,"y":1943,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/DoorVertOpen.png": +{ + "frame": {"x":437,"y":1869,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/DoorVertOpenCont.png": +{ + "frame": {"x":437,"y":1943,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/Floor.png": +{ + "frame": {"x":171,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/Grate.png": +{ + "frame": {"x":171,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/GrateHoriz.png": +{ + "frame": {"x":171,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/GrateVert.png": +{ + "frame": {"x":171,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/MimicBlock.png": +{ + "frame": {"x":171,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/OrbEmpty.png": +{ + "frame": {"x":171,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/RubbleLooted.png": +{ + "frame": {"x":171,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/Shrine.png": +{ + "frame": {"x":171,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/ShrineBroken.png": +{ + "frame": {"x":171,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/ShrineC.png": +{ + "frame": {"x":171,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/ShrineEmpty.png": +{ + "frame": {"x":171,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/StairsDown.png": +{ + "frame": {"x":245,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/StairsUp.png": +{ + "frame": {"x":245,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/Trap.png": +{ + "frame": {"x":245,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/Wall.png": +{ + "frame": {"x":245,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/WallR.png": +{ + "frame": {"x":245,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/WallRVert.png": +{ + "frame": {"x":245,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_bel/WallVert.png": +{ + "frame": {"x":245,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/Barrel.png": +{ + "frame": {"x":245,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/Bars.png": +{ + "frame": {"x":245,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/BarsOld.png": +{ + "frame": {"x":245,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/BarsVert.png": +{ + "frame": {"x":245,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/BarsVertCont.png": +{ + "frame": {"x":296,"y":848,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/Brickwork.png": +{ + "frame": {"x":296,"y":922,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/Doodad.png": +{ + "frame": {"x":296,"y":996,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/Door.png": +{ + "frame": {"x":365,"y":1138,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/DoorOpen.png": +{ + "frame": {"x":365,"y":1212,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/DoorVert.png": +{ + "frame": {"x":365,"y":1286,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/DoorVertCont.png": +{ + "frame": {"x":365,"y":1360,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/DoorVertOpen.png": +{ + "frame": {"x":365,"y":1434,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/DoorVertOpenCont.png": +{ + "frame": {"x":365,"y":1508,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/Floor.png": +{ + "frame": {"x":365,"y":1582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/Grate.png": +{ + "frame": {"x":366,"y":1724,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/GrateHoriz.png": +{ + "frame": {"x":511,"y":1869,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/GrateVert.png": +{ + "frame": {"x":511,"y":1943,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/MimicBlock.png": +{ + "frame": {"x":319,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/OrbEmpty.png": +{ + "frame": {"x":319,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/RubbleLooted.png": +{ + "frame": {"x":319,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/Shrine.png": +{ + "frame": {"x":319,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/ShrineBroken.png": +{ + "frame": {"x":319,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/ShrineC.png": +{ + "frame": {"x":319,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/ShrineEmpty.png": +{ + "frame": {"x":319,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/StairsDown.png": +{ + "frame": {"x":319,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/StairsUp.png": +{ + "frame": {"x":319,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/Trap.png": +{ + "frame": {"x":319,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/Wall.png": +{ + "frame": {"x":319,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/WallR.png": +{ + "frame": {"x":370,"y":848,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/WallRVert.png": +{ + "frame": {"x":370,"y":922,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cat/WallVert.png": +{ + "frame": {"x":370,"y":996,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/Barrel.png": +{ + "frame": {"x":439,"y":1138,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/Bars.png": +{ + "frame": {"x":439,"y":1212,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/BarsOld.png": +{ + "frame": {"x":439,"y":1286,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/BarsVert.png": +{ + "frame": {"x":439,"y":1360,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/BarsVertCont.png": +{ + "frame": {"x":439,"y":1434,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/Brickwork.png": +{ + "frame": {"x":439,"y":1508,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/Doodad.png": +{ + "frame": {"x":439,"y":1582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/Door.png": +{ + "frame": {"x":440,"y":1724,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/DoorOpen.png": +{ + "frame": {"x":585,"y":1869,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/DoorVert.png": +{ + "frame": {"x":585,"y":1943,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/DoorVertCont.png": +{ + "frame": {"x":393,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/DoorVertOpen.png": +{ + "frame": {"x":393,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/DoorVertOpenCont.png": +{ + "frame": {"x":393,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/Floor.png": +{ + "frame": {"x":393,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/Grate.png": +{ + "frame": {"x":393,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/GrateHoriz.png": +{ + "frame": {"x":393,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/GrateVert.png": +{ + "frame": {"x":393,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/MimicBlock.png": +{ + "frame": {"x":393,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/OrbEmpty.png": +{ + "frame": {"x":393,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/RubbleLooted.png": +{ + "frame": {"x":393,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/Shrine.png": +{ + "frame": {"x":393,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/ShrineBroken.png": +{ + "frame": {"x":444,"y":846,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/ShrineC.png": +{ + "frame": {"x":444,"y":920,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/ShrineEmpty.png": +{ + "frame": {"x":444,"y":994,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/StairsDown.png": +{ + "frame": {"x":513,"y":1138,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/StairsUp.png": +{ + "frame": {"x":513,"y":1212,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/Trap.png": +{ + "frame": {"x":513,"y":1286,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/Wall.png": +{ + "frame": {"x":513,"y":1360,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/WallR.png": +{ + "frame": {"x":513,"y":1434,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/WallRVert.png": +{ + "frame": {"x":513,"y":1508,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cav/WallVert.png": +{ + "frame": {"x":513,"y":1582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/Barrel.png": +{ + "frame": {"x":439,"y":1138,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/Bars.png": +{ + "frame": {"x":514,"y":1724,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/BarsOld.png": +{ + "frame": {"x":659,"y":1869,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/BarsVert.png": +{ + "frame": {"x":659,"y":1943,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/BarsVertCont.png": +{ + "frame": {"x":587,"y":1138,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/Brickwork.png": +{ + "frame": {"x":587,"y":1212,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/Doodad.png": +{ + "frame": {"x":587,"y":1286,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/Door.png": +{ + "frame": {"x":587,"y":1360,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/DoorOpen.png": +{ + "frame": {"x":587,"y":1434,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/DoorVert.png": +{ + "frame": {"x":587,"y":1508,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/DoorVertCont.png": +{ + "frame": {"x":587,"y":1582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/DoorVertOpen.png": +{ + "frame": {"x":588,"y":1724,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/DoorVertOpenCont.png": +{ + "frame": {"x":662,"y":1723,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/Floor.png": +{ + "frame": {"x":393,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/Grate.png": +{ + "frame": {"x":733,"y":1869,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/GrateHoriz.png": +{ + "frame": {"x":733,"y":1943,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/GrateVert.png": +{ + "frame": {"x":807,"y":1869,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/MimicBlock.png": +{ + "frame": {"x":807,"y":1943,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/OrbEmpty.png": +{ + "frame": {"x":467,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/RubbleLooted.png": +{ + "frame": {"x":467,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/Shrine.png": +{ + "frame": {"x":467,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/ShrineBroken.png": +{ + "frame": {"x":467,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/ShrineC.png": +{ + "frame": {"x":467,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/ShrineEmpty.png": +{ + "frame": {"x":467,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/StairsDown.png": +{ + "frame": {"x":513,"y":1138,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/StairsUp.png": +{ + "frame": {"x":513,"y":1212,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/Trap.png": +{ + "frame": {"x":513,"y":1286,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/Wall.png": +{ + "frame": {"x":467,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/WallR.png": +{ + "frame": {"x":467,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/WallRVert.png": +{ + "frame": {"x":467,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cry/WallVert.png": +{ + "frame": {"x":467,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/Barrel.png": +{ + "frame": {"x":467,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/Bars.png": +{ + "frame": {"x":518,"y":846,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/BarsVert.png": +{ + "frame": {"x":518,"y":846,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/BarsVertCont.png": +{ + "frame": {"x":518,"y":846,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/Brickwork.png": +{ + "frame": {"x":518,"y":920,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/Doodad.png": +{ + "frame": {"x":518,"y":994,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/Door.png": +{ + "frame": {"x":541,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/DoorOpen.png": +{ + "frame": {"x":541,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/DoorVert.png": +{ + "frame": {"x":541,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/DoorVertCont.png": +{ + "frame": {"x":541,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/DoorVertOpen.png": +{ + "frame": {"x":541,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/DoorVertOpenCont.png": +{ + "frame": {"x":541,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/Floor.png": +{ + "frame": {"x":518,"y":920,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/Grate.png": +{ + "frame": {"x":541,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/GrateHoriz.png": +{ + "frame": {"x":541,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/GrateVert.png": +{ + "frame": {"x":541,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/MimicBlock.png": +{ + "frame": {"x":541,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/OrbEmpty.png": +{ + "frame": {"x":541,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/RubbleLooted.png": +{ + "frame": {"x":592,"y":845,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/Shrine.png": +{ + "frame": {"x":592,"y":919,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/ShrineBroken.png": +{ + "frame": {"x":592,"y":993,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/ShrineC.png": +{ + "frame": {"x":661,"y":1138,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/ShrineEmpty.png": +{ + "frame": {"x":661,"y":1212,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/Trap.png": +{ + "frame": {"x":661,"y":1286,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/Wall.png": +{ + "frame": {"x":661,"y":1360,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/WallR.png": +{ + "frame": {"x":661,"y":1434,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/WallRVert.png": +{ + "frame": {"x":661,"y":1508,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/WallVert.png": +{ + "frame": {"x":661,"y":1582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/Barrel.png": +{ + "frame": {"x":736,"y":1723,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/Bars.png": +{ + "frame": {"x":881,"y":1869,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/BarsVert.png": +{ + "frame": {"x":881,"y":1943,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/BarsVertCont.png": +{ + "frame": {"x":615,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/Brickwork.png": +{ + "frame": {"x":615,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/Doodad.png": +{ + "frame": {"x":615,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/Door.png": +{ + "frame": {"x":615,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/DoorOpen.png": +{ + "frame": {"x":615,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/DoorVert.png": +{ + "frame": {"x":615,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/DoorVertCont.png": +{ + "frame": {"x":615,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/DoorVertOpen.png": +{ + "frame": {"x":615,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/DoorVertOpenCont.png": +{ + "frame": {"x":615,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/Floor.png": +{ + "frame": {"x":615,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/Grate.png": +{ + "frame": {"x":615,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/GrateHoriz.png": +{ + "frame": {"x":666,"y":845,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/GrateVert.png": +{ + "frame": {"x":666,"y":919,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/MimicBlock.png": +{ + "frame": {"x":666,"y":993,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/OrbEmpty.png": +{ + "frame": {"x":735,"y":1138,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/RubbleLooted.png": +{ + "frame": {"x":735,"y":1212,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/Shrine.png": +{ + "frame": {"x":735,"y":1286,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/ShrineBroken.png": +{ + "frame": {"x":735,"y":1360,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/ShrineC.png": +{ + "frame": {"x":735,"y":1434,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/ShrineEmpty.png": +{ + "frame": {"x":735,"y":1508,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/Trap.png": +{ + "frame": {"x":735,"y":1582,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/Wall.png": +{ + "frame": {"x":810,"y":1723,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/WallR.png": +{ + "frame": {"x":955,"y":1869,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/WallRVert.png": +{ + "frame": {"x":955,"y":1943,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_DemonTransition/WallVert.png": +{ + "frame": {"x":689,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/Barrel.png": +{ + "frame": {"x":689,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/Bars.png": +{ + "frame": {"x":689,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/BarsVert.png": +{ + "frame": {"x":689,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/BarsVertCont.png": +{ + "frame": {"x":689,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/Brickwork.png": +{ + "frame": {"x":689,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/Doodad.png": +{ + "frame": {"x":689,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/Door.png": +{ + "frame": {"x":689,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/DoorOpen.png": +{ + "frame": {"x":689,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/DoorVert.png": +{ + "frame": {"x":689,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/DoorVertCont.png": +{ + "frame": {"x":689,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/DoorVertOpen.png": +{ + "frame": {"x":740,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/DoorVertOpenCont.png": +{ + "frame": {"x":740,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/Floor.png": +{ + "frame": {"x":740,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/Grate.png": +{ + "frame": {"x":803,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/GrateHoriz.png": +{ + "frame": {"x":809,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/GrateVert.png": +{ + "frame": {"x":809,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/MimicBlock.png": +{ + "frame": {"x":319,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/OrbEmpty.png": +{ + "frame": {"x":809,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/RubbleLooted.png": +{ + "frame": {"x":740,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/Shrine.png": +{ + "frame": {"x":809,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/ShrineBroken.png": +{ + "frame": {"x":809,"y":1407,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/ShrineC.png": +{ + "frame": {"x":809,"y":1481,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/ShrineEmpty.png": +{ + "frame": {"x":809,"y":1555,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/StairsDown.png": +{ + "frame": {"x":878,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/StairsUp.png": +{ + "frame": {"x":884,"y":1703,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/Trap.png": +{ + "frame": {"x":956,"y":1777,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/Wall.png": +{ + "frame": {"x":1029,"y":1851,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/WallR.png": +{ + "frame": {"x":1029,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/WallRVert.png": +{ + "frame": {"x":763,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_grv/WallVert.png": +{ + "frame": {"x":763,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/Barrel.png": +{ + "frame": {"x":763,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/Bars.png": +{ + "frame": {"x":763,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/BarsVert.png": +{ + "frame": {"x":763,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/BarsVertCont.png": +{ + "frame": {"x":763,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/Brickwork.png": +{ + "frame": {"x":763,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/Doodad.png": +{ + "frame": {"x":763,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/Door.png": +{ + "frame": {"x":763,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/DoorOpen.png": +{ + "frame": {"x":763,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/DoorVert.png": +{ + "frame": {"x":763,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/DoorVertCont.png": +{ + "frame": {"x":814,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/DoorVertOpen.png": +{ + "frame": {"x":814,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/DoorVertOpenCont.png": +{ + "frame": {"x":814,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/Floor.png": +{ + "frame": {"x":877,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/Grate.png": +{ + "frame": {"x":883,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/GrateHoriz.png": +{ + "frame": {"x":883,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/GrateVert.png": +{ + "frame": {"x":883,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/MimicBlock.png": +{ + "frame": {"x":877,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/OrbEmpty.png": +{ + "frame": {"x":883,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/RubbleLooted.png": +{ + "frame": {"x":883,"y":1407,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/Shrine.png": +{ + "frame": {"x":883,"y":1481,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/ShrineBroken.png": +{ + "frame": {"x":883,"y":1555,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/ShrineC.png": +{ + "frame": {"x":952,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/ShrineEmpty.png": +{ + "frame": {"x":958,"y":1703,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/Trap.png": +{ + "frame": {"x":1030,"y":1777,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/Wall.png": +{ + "frame": {"x":1103,"y":1851,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/WallR.png": +{ + "frame": {"x":1103,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/WallRVert.png": +{ + "frame": {"x":837,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jng/WallVert.png": +{ + "frame": {"x":837,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/Barrel.png": +{ + "frame": {"x":837,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/Bars.png": +{ + "frame": {"x":837,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/BarsVert.png": +{ + "frame": {"x":837,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/BarsVertCont.png": +{ + "frame": {"x":837,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/Brickwork.png": +{ + "frame": {"x":837,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/Doodad.png": +{ + "frame": {"x":837,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/Door.png": +{ + "frame": {"x":763,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/DoorOpen.png": +{ + "frame": {"x":837,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/DoorVert.png": +{ + "frame": {"x":837,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/DoorVertCont.png": +{ + "frame": {"x":837,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/DoorVertOpen.png": +{ + "frame": {"x":837,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/DoorVertOpenCont.png": +{ + "frame": {"x":837,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/Floor.png": +{ + "frame": {"x":888,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/Grate.png": +{ + "frame": {"x":883,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/GrateHoriz.png": +{ + "frame": {"x":883,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/GrateVert.png": +{ + "frame": {"x":883,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/MimicBlock.png": +{ + "frame": {"x":888,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/OrbEmpty.png": +{ + "frame": {"x":888,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/RubbleLooted.png": +{ + "frame": {"x":888,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/Shrine.png": +{ + "frame": {"x":951,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/ShrineBroken.png": +{ + "frame": {"x":957,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/ShrineC.png": +{ + "frame": {"x":957,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/ShrineEmpty.png": +{ + "frame": {"x":957,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/StairsDown.png": +{ + "frame": {"x":957,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/StairsUp.png": +{ + "frame": {"x":957,"y":1407,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/Trap.png": +{ + "frame": {"x":957,"y":1481,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/Wall.png": +{ + "frame": {"x":957,"y":1555,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/WallR.png": +{ + "frame": {"x":1026,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/WallRVert.png": +{ + "frame": {"x":1032,"y":1703,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_jngWild/WallVert.png": +{ + "frame": {"x":1104,"y":1777,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/Barrel.png": +{ + "frame": {"x":1177,"y":1851,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/Bars.png": +{ + "frame": {"x":1177,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/BarsVert.png": +{ + "frame": {"x":1177,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/BarsVertCont.png": +{ + "frame": {"x":1177,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/Brickwork.png": +{ + "frame": {"x":911,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/Doodad.png": +{ + "frame": {"x":911,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/Door.png": +{ + "frame": {"x":911,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/DoorOpen.png": +{ + "frame": {"x":911,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/DoorVert.png": +{ + "frame": {"x":911,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/DoorVertCont.png": +{ + "frame": {"x":911,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/DoorVertOpen.png": +{ + "frame": {"x":911,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/DoorVertOpenCont.png": +{ + "frame": {"x":911,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/Floor.png": +{ + "frame": {"x":911,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/Grate.png": +{ + "frame": {"x":911,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/GrateHoriz.png": +{ + "frame": {"x":911,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/GrateVert.png": +{ + "frame": {"x":911,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/MimicBlock.png": +{ + "frame": {"x":911,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/OrbEmpty.png": +{ + "frame": {"x":911,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/RubbleLooted.png": +{ + "frame": {"x":911,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/Shrine.png": +{ + "frame": {"x":911,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/ShrineBroken.png": +{ + "frame": {"x":911,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/ShrineC.png": +{ + "frame": {"x":962,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/ShrineEmpty.png": +{ + "frame": {"x":962,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/StairsDown.png": +{ + "frame": {"x":962,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/StairsUp.png": +{ + "frame": {"x":1025,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/Tile.png": +{ + "frame": {"x":1031,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/Trap.png": +{ + "frame": {"x":1031,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/Wall.png": +{ + "frame": {"x":1031,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/WallR.png": +{ + "frame": {"x":1031,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/WallRVert.png": +{ + "frame": {"x":1031,"y":1407,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_lib/WallVert.png": +{ + "frame": {"x":1031,"y":1481,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/Barrel.png": +{ + "frame": {"x":1031,"y":1555,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/Bars.png": +{ + "frame": {"x":1100,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/BarsOld.png": +{ + "frame": {"x":1106,"y":1703,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/BarsVert.png": +{ + "frame": {"x":1178,"y":1777,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/BarsVertCont.png": +{ + "frame": {"x":1251,"y":1851,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/Brickwork.png": +{ + "frame": {"x":1251,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/Doodad.png": +{ + "frame": {"x":985,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/Door.png": +{ + "frame": {"x":985,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/DoorOpen.png": +{ + "frame": {"x":985,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/DoorVert.png": +{ + "frame": {"x":985,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/DoorVertCont.png": +{ + "frame": {"x":985,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/DoorVertOpen.png": +{ + "frame": {"x":985,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/DoorVertOpenCont.png": +{ + "frame": {"x":985,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/Floor.png": +{ + "frame": {"x":985,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/Grate.png": +{ + "frame": {"x":985,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/GrateHoriz.png": +{ + "frame": {"x":985,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/GrateVert.png": +{ + "frame": {"x":985,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/MimicBlock.png": +{ + "frame": {"x":1036,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/OrbEmpty.png": +{ + "frame": {"x":1036,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/RubbleLooted.png": +{ + "frame": {"x":1036,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/Shrine.png": +{ + "frame": {"x":1099,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/ShrineBroken.png": +{ + "frame": {"x":1105,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/ShrineC.png": +{ + "frame": {"x":1105,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/ShrineEmpty.png": +{ + "frame": {"x":1105,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/StairsDown.png": +{ + "frame": {"x":245,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/StairsUp.png": +{ + "frame": {"x":245,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/Trap.png": +{ + "frame": {"x":1105,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/Wall.png": +{ + "frame": {"x":1105,"y":1407,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_ore/WallVert.png": +{ + "frame": {"x":1105,"y":1481,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/Barrel.png": +{ + "frame": {"x":289,"y":1943,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/Bars.png": +{ + "frame": {"x":1105,"y":1555,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/BarsVert.png": +{ + "frame": {"x":1174,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/BarsVertCont.png": +{ + "frame": {"x":1180,"y":1703,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/Brickwork.png": +{ + "frame": {"x":911,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/Doodad.png": +{ + "frame": {"x":1252,"y":1777,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/Door.png": +{ + "frame": {"x":1325,"y":1851,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/DoorOpen.png": +{ + "frame": {"x":1325,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/DoorVert.png": +{ + "frame": {"x":1059,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/DoorVertCont.png": +{ + "frame": {"x":1059,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/DoorVertOpen.png": +{ + "frame": {"x":1059,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/DoorVertOpenCont.png": +{ + "frame": {"x":1059,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/Floor.png": +{ + "frame": {"x":911,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/Grate.png": +{ + "frame": {"x":1059,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/GrateHoriz.png": +{ + "frame": {"x":1059,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/GrateVert.png": +{ + "frame": {"x":1059,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/MimicBlock.png": +{ + "frame": {"x":911,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/OrbEmpty.png": +{ + "frame": {"x":911,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/RubbleLooted.png": +{ + "frame": {"x":911,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/Shrine.png": +{ + "frame": {"x":911,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/ShrineBroken.png": +{ + "frame": {"x":911,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/ShrineC.png": +{ + "frame": {"x":962,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/ShrineEmpty.png": +{ + "frame": {"x":962,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/Tile.png": +{ + "frame": {"x":1031,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/Trap.png": +{ + "frame": {"x":1031,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/Wall.png": +{ + "frame": {"x":1059,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/WallR.png": +{ + "frame": {"x":1059,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/WallRVert.png": +{ + "frame": {"x":1059,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shoppe/WallVert.png": +{ + "frame": {"x":1059,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/Barrel.png": +{ + "frame": {"x":1110,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/Bars.png": +{ + "frame": {"x":1110,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/BarsOld.png": +{ + "frame": {"x":1110,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/BarsVert.png": +{ + "frame": {"x":1173,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/BarsVertCont.png": +{ + "frame": {"x":1179,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/Brickwork.png": +{ + "frame": {"x":1179,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/Doodad.png": +{ + "frame": {"x":1179,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/Door.png": +{ + "frame": {"x":1179,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/DoorOpen.png": +{ + "frame": {"x":1179,"y":1407,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/DoorVert.png": +{ + "frame": {"x":1179,"y":1481,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/DoorVertCont.png": +{ + "frame": {"x":1179,"y":1555,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/DoorVertOpen.png": +{ + "frame": {"x":1248,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/DoorVertOpenCont.png": +{ + "frame": {"x":1254,"y":1703,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/Floor.png": +{ + "frame": {"x":1326,"y":1777,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/Grate.png": +{ + "frame": {"x":883,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/GrateHoriz.png": +{ + "frame": {"x":883,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/GrateVert.png": +{ + "frame": {"x":883,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/MimicBlock.png": +{ + "frame": {"x":1326,"y":1777,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/OrbEmpty.png": +{ + "frame": {"x":1399,"y":1851,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/RubbleLooted.png": +{ + "frame": {"x":1399,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/Shrine.png": +{ + "frame": {"x":1133,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/ShrineBroken.png": +{ + "frame": {"x":1133,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/ShrineC.png": +{ + "frame": {"x":1133,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/ShrineEmpty.png": +{ + "frame": {"x":1133,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/Trap.png": +{ + "frame": {"x":1133,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/Wall.png": +{ + "frame": {"x":1133,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/WallR.png": +{ + "frame": {"x":1133,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/WallRVert.png": +{ + "frame": {"x":1133,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_shrine/WallVert.png": +{ + "frame": {"x":1133,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/Barrel.png": +{ + "frame": {"x":1133,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/Bars.png": +{ + "frame": {"x":1133,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/BarsOld.png": +{ + "frame": {"x":1184,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/BarsVert.png": +{ + "frame": {"x":1184,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/BarsVertCont.png": +{ + "frame": {"x":1184,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/Brickwork.png": +{ + "frame": {"x":1247,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/Doodad.png": +{ + "frame": {"x":1253,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/Door.png": +{ + "frame": {"x":1253,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/DoorOpen.png": +{ + "frame": {"x":1253,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/DoorVert.png": +{ + "frame": {"x":1253,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/DoorVertCont.png": +{ + "frame": {"x":1253,"y":1407,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/DoorVertOpen.png": +{ + "frame": {"x":1253,"y":1481,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/DoorVertOpenCont.png": +{ + "frame": {"x":1253,"y":1555,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/Empty.png": +{ + "frame": {"x":1322,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/Floor.png": +{ + "frame": {"x":1328,"y":1703,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/Grate.png": +{ + "frame": {"x":1400,"y":1777,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/GrateHoriz.png": +{ + "frame": {"x":1473,"y":1851,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/GrateVert.png": +{ + "frame": {"x":1473,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/MimicBlock.png": +{ + "frame": {"x":1207,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/OrbEmpty.png": +{ + "frame": {"x":1207,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/RubbleLooted.png": +{ + "frame": {"x":1207,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/Shrine.png": +{ + "frame": {"x":1207,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/ShrineBroken.png": +{ + "frame": {"x":1207,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/ShrineC.png": +{ + "frame": {"x":1207,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/ShrineEmpty.png": +{ + "frame": {"x":1322,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/StairsDown.png": +{ + "frame": {"x":1207,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/StairsUp.png": +{ + "frame": {"x":1207,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/Trap.png": +{ + "frame": {"x":1207,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/Wall.png": +{ + "frame": {"x":1207,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/WallR.png": +{ + "frame": {"x":1207,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/WallRVert.png": +{ + "frame": {"x":1258,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmb/WallVert.png": +{ + "frame": {"x":1258,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/Barrel.png": +{ + "frame": {"x":1258,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/Bars.png": +{ + "frame": {"x":1110,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/BarsOld.png": +{ + "frame": {"x":1110,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/BarsVert.png": +{ + "frame": {"x":1321,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/BarsVertCont.png": +{ + "frame": {"x":1327,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/Brickwork.png": +{ + "frame": {"x":1327,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/Doodad.png": +{ + "frame": {"x":1327,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/Door.png": +{ + "frame": {"x":1179,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/DoorOpen.png": +{ + "frame": {"x":1179,"y":1407,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/DoorVert.png": +{ + "frame": {"x":1179,"y":1481,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/DoorVertCont.png": +{ + "frame": {"x":1179,"y":1555,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/DoorVertOpen.png": +{ + "frame": {"x":1248,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/DoorVertOpenCont.png": +{ + "frame": {"x":1254,"y":1703,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/Floor.png": +{ + "frame": {"x":1327,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/Grate.png": +{ + "frame": {"x":1327,"y":1407,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/GrateHoriz.png": +{ + "frame": {"x":1327,"y":1481,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/GrateVert.png": +{ + "frame": {"x":1327,"y":1555,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/MimicBlock.png": +{ + "frame": {"x":1396,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/OrbEmpty.png": +{ + "frame": {"x":1402,"y":1703,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/RubbleLooted.png": +{ + "frame": {"x":1396,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/Shrine.png": +{ + "frame": {"x":1474,"y":1777,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/ShrineBroken.png": +{ + "frame": {"x":1547,"y":1851,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/ShrineC.png": +{ + "frame": {"x":1547,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/ShrineEmpty.png": +{ + "frame": {"x":1281,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/StairsDown.png": +{ + "frame": {"x":1281,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/StairsUp.png": +{ + "frame": {"x":1281,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/Trap.png": +{ + "frame": {"x":1281,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/Wall.png": +{ + "frame": {"x":1281,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/WallR.png": +{ + "frame": {"x":1281,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/WallRVert.png": +{ + "frame": {"x":1281,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_tmp/WallVert.png": +{ + "frame": {"x":1281,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/Barrel.png": +{ + "frame": {"x":1281,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/Bars.png": +{ + "frame": {"x":1281,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/BarsVert.png": +{ + "frame": {"x":1281,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/BarsVertCont.png": +{ + "frame": {"x":1332,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/Brickwork.png": +{ + "frame": {"x":1332,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/DollDropoff.png": +{ + "frame": {"x":1332,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/Doodad.png": +{ + "frame": {"x":1395,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/Door.png": +{ + "frame": {"x":1401,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/DoorOpen.png": +{ + "frame": {"x":1401,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/DoorVert.png": +{ + "frame": {"x":1401,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/DoorVertCont.png": +{ + "frame": {"x":1401,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/DoorVertOpen.png": +{ + "frame": {"x":1401,"y":1407,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/DoorVertOpenCont.png": +{ + "frame": {"x":1401,"y":1481,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/Floor.png": +{ + "frame": {"x":1332,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/Grate.png": +{ + "frame": {"x":1401,"y":1555,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/GrateHoriz.png": +{ + "frame": {"x":1470,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/GrateVert.png": +{ + "frame": {"x":1476,"y":1703,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/MimicBlock.png": +{ + "frame": {"x":1548,"y":1777,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/OrbEmpty.png": +{ + "frame": {"x":1621,"y":1851,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/RubbleLooted.png": +{ + "frame": {"x":1621,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/Shrine.png": +{ + "frame": {"x":1355,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/ShrineBroken.png": +{ + "frame": {"x":1355,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/ShrineC.png": +{ + "frame": {"x":1355,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/ShrineEmpty.png": +{ + "frame": {"x":1355,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/Trap.png": +{ + "frame": {"x":1355,"y":297,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/Wall.png": +{ + "frame": {"x":1355,"y":371,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/WallR.png": +{ + "frame": {"x":1355,"y":445,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/WallRVert.png": +{ + "frame": {"x":1355,"y":519,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_vault/WallVert.png": +{ + "frame": {"x":1355,"y":593,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/HideMost.png": +{ + "frame": {"x":503,"y":2017,"w":36,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":8,"w":36,"h":30}, + "sourceSize": {"w":56,"h":56} +}, +"Game/InventoryAction/CommandWord.png": +{ + "frame": {"x":1997,"y":1957,"w":43,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":16,"w":43,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Disassemble.png": +{ + "frame": {"x":1721,"y":1057,"w":68,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Drop.png": +{ + "frame": {"x":617,"y":2017,"w":36,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":21,"w":36,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Favorite.png": +{ + "frame": {"x":925,"y":2017,"w":29,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":21,"w":29,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Recycle.png": +{ + "frame": {"x":1549,"y":1460,"w":66,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":66,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/RecycleBulk.png": +{ + "frame": {"x":1721,"y":1057,"w":68,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/RecycleExcess.png": +{ + "frame": {"x":1970,"y":1153,"w":68,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/SellExcess.png": +{ + "frame": {"x":1688,"y":357,"w":64,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":15,"w":64,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Unfavorite.png": +{ + "frame": {"x":956,"y":2017,"w":29,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":21,"w":29,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InvItemDrop.png": +{ + "frame": {"x":617,"y":2017,"w":36,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":0,"w":36,"h":29}, + "sourceSize": {"w":76,"h":76} +}, +"Game/Items/BlueKey.png": +{ + "frame": {"x":1355,"y":667,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Ectoplasm.png": +{ + "frame": {"x":1355,"y":741,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/EnchKnife.png": +{ + "frame": {"x":1406,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemArms.png": +{ + "frame": {"x":655,"y":2017,"w":36,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":36,"y":40,"w":36,"h":29}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemNeckAccessories.png": +{ + "frame": {"x":987,"y":2017,"w":28,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":39,"w":28,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Keyring.png": +{ + "frame": {"x":1406,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/MagicAxe.png": +{ + "frame": {"x":1699,"y":1999,"w":66,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":7,"w":66,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/PotionStamina.png": +{ + "frame": {"x":1791,"y":738,"w":40,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":4,"w":40,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/liquidMetal.png": +{ + "frame": {"x":214,"y":815,"w":40,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":20,"w":40,"h":31}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/ShadowLatex.png": +{ + "frame": {"x":256,"y":815,"w":40,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":20,"w":40,"h":31}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Slime.png": +{ + "frame": {"x":298,"y":815,"w":40,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":20,"w":40,"h":31}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Straitjackets.png": +{ + "frame": {"x":1542,"y":297,"w":69,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":10,"w":69,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Slimethrower.png": +{ + "frame": {"x":1490,"y":1999,"w":69,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":11,"w":69,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/SmokeBomb.png": +{ + "frame": {"x":1503,"y":623,"w":72,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Snuffer.png": +{ + "frame": {"x":1950,"y":1958,"w":45,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":23,"w":45,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShopBasic/3Flash.png": +{ + "frame": {"x":1549,"y":1528,"w":66,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":4,"w":66,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShopBasic/3Flashbang.png": +{ + "frame": {"x":1831,"y":1137,"w":66,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":66,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShopBasic/BlueKey.png": +{ + "frame": {"x":1406,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShrineAuraQuest.png": +{ + "frame": {"x":861,"y":2017,"w":30,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":15,"w":30,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/SpellRange.png": +{ + "frame": {"x":1469,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/SpellReady.png": +{ + "frame": {"x":1972,"y":722,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AirMote.png": +{ + "frame": {"x":1649,"y":546,"w":70,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":70,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AllyCancelHold.png": +{ + "frame": {"x":1754,"y":357,"w":65,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":15,"w":65,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AllyDeselectAll.png": +{ + "frame": {"x":1900,"y":725,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AllyHold.png": +{ + "frame": {"x":1966,"y":1366,"w":65,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":15,"w":65,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ArcaneBarrier.png": +{ + "frame": {"x":1475,"y":1111,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/BanishPortal.png": +{ + "frame": {"x":1834,"y":1998,"w":65,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":65,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Bomb.png": +{ + "frame": {"x":1628,"y":814,"w":46,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":2,"w":46,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ColdFeet.png": +{ + "frame": {"x":732,"y":1067,"w":69,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":69,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/CommandDisenchant.png": +{ + "frame": {"x":1718,"y":1410,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/CommandOrgasm.png": +{ + "frame": {"x":1475,"y":1185,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/CommandWord.png": +{ + "frame": {"x":1997,"y":1957,"w":43,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":16,"w":43,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Crackle.png": +{ + "frame": {"x":734,"y":1797,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/DistractionShield.png": +{ + "frame": {"x":1475,"y":1259,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Earthform.png": +{ + "frame": {"x":1475,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/EarthformLine.png": +{ + "frame": {"x":1475,"y":1407,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/EarthformMound.png": +{ + "frame": {"x":1475,"y":1333,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/EarthformRing.png": +{ + "frame": {"x":1475,"y":1481,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Earthquake.png": +{ + "frame": {"x":1969,"y":1682,"w":67,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":67,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Evasion.png": +{ + "frame": {"x":1617,"y":1425,"w":56,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":5,"w":56,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FeatherCloud.png": +{ + "frame": {"x":1721,"y":767,"w":68,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":68,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Fireball.png": +{ + "frame": {"x":1475,"y":1555,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FlameBlade.png": +{ + "frame": {"x":1544,"y":1629,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FocusedFlash.png": +{ + "frame": {"x":1550,"y":1703,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Golem.png": +{ + "frame": {"x":1618,"y":1628,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/GreaterFlash.png": +{ + "frame": {"x":1577,"y":402,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/GreaterInvisibility.png": +{ + "frame": {"x":1622,"y":1777,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/GreaterShield.png": +{ + "frame": {"x":1617,"y":1494,"w":55,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":3,"w":55,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/IceLance.png": +{ + "frame": {"x":1549,"y":1111,"w":66,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":2,"w":66,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/IceOrb.png": +{ + "frame": {"x":1904,"y":1820,"w":63,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":63,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Icicles.png": +{ + "frame": {"x":1696,"y":146,"w":71,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":71,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Ignition.png": +{ + "frame": {"x":1478,"y":146,"w":62,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":62,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Incinerate.png": +{ + "frame": {"x":1651,"y":402,"w":70,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":70,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Invisibility.png": +{ + "frame": {"x":1695,"y":1851,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/KineticLance.png": +{ + "frame": {"x":1561,"y":1999,"w":66,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":11,"w":66,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LatexWall.png": +{ + "frame": {"x":1268,"y":1999,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":13,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LatexWallHoriz.png": +{ + "frame": {"x":1268,"y":1999,"w":72,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":13,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Leap2.png": +{ + "frame": {"x":1695,"y":1925,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Leap3.png": +{ + "frame": {"x":1834,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LeatherBurst.png": +{ + "frame": {"x":1974,"y":1410,"w":68,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":4,"w":68,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LightningBolt.png": +{ + "frame": {"x":1675,"y":1224,"w":41,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":6,"w":41,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LightningRune.png": +{ + "frame": {"x":1610,"y":765,"w":64,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":13,"w":64,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LiquidMetalBurst.png": +{ + "frame": {"x":1577,"y":474,"w":72,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Lockdown.png": +{ + "frame": {"x":1831,"y":926,"w":66,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":66,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Rainstorm.png": +{ + "frame": {"x":1543,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/RaiseDefenses.png": +{ + "frame": {"x":1549,"y":1321,"w":66,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":4,"w":66,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/RecoverObject2.png": +{ + "frame": {"x":1478,"y":288,"w":62,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":4,"w":62,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Ring.png": +{ + "frame": {"x":1543,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/RingOfSlime.png": +{ + "frame": {"x":1908,"y":1,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/RopeBoltLaunchMany.png": +{ + "frame": {"x":1629,"y":1999,"w":68,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":13,"w":68,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ShadowWarrior.png": +{ + "frame": {"x":1833,"y":717,"w":65,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":4,"w":65,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Shock.png": +{ + "frame": {"x":513,"y":1656,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Shroud.png": +{ + "frame": {"x":1503,"y":696,"w":72,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SlimeSplash.png": +{ + "frame": {"x":1753,"y":290,"w":70,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":5,"w":70,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SpellChoiceUp1.png": +{ + "frame": {"x":893,"y":2017,"w":30,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":20,"w":30,"h":30}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SpellFail.png": +{ + "frame": {"x":1835,"y":1752,"w":66,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":66,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/StormCrystal.png": +{ + "frame": {"x":1722,"y":475,"w":69,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":2,"w":69,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonLatexArmbinder.png": +{ + "frame": {"x":1723,"y":402,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonLatexGag.png": +{ + "frame": {"x":1902,"y":149,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonLatexLegbinder.png": +{ + "frame": {"x":1974,"y":218,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonStraitjacket.png": +{ + "frame": {"x":1542,"y":297,"w":69,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":10,"w":69,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonUp1.png": +{ + "frame": {"x":1617,"y":1075,"w":57,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":3,"w":57,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonUp2.png": +{ + "frame": {"x":1617,"y":1145,"w":57,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":3,"w":57,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Thunderstorm.png": +{ + "frame": {"x":1429,"y":1,"w":48,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":4,"w":48,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/TransportationPortal.png": +{ + "frame": {"x":1968,"y":1996,"w":65,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":1,"w":65,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Wall.png": +{ + "frame": {"x":586,"y":1798,"w":72,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ZoneOfPurity.png": +{ + "frame": {"x":1478,"y":218,"w":62,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":2,"w":62,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/TargetAction.png": +{ + "frame": {"x":1833,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/TargetAttack.png": +{ + "frame": {"x":1617,"y":148,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/TargetMove.png": +{ + "frame": {"x":1542,"y":149,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/TargetPass.png": +{ + "frame": {"x":1542,"y":223,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/TargetSpell.png": +{ + "frame": {"x":1907,"y":75,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/TargetSub.png": +{ + "frame": {"x":1429,"y":403,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/TargetTalk.png": +{ + "frame": {"x":1429,"y":477,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/accuracy.png": +{ + "frame": {"x":380,"y":815,"w":34,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":3,"w":34,"h":31}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/AutoBindCopy.png": +{ + "frame": {"x":1624,"y":1698,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/AutoBindPaste.png": +{ + "frame": {"x":1688,"y":1628,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/AutoBindPasteAll.png": +{ + "frame": {"x":1694,"y":1698,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/AutoBindPasteAllOver.png": +{ + "frame": {"x":1696,"y":218,"w":71,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":71,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Buttons/Summon.png": +{ + "frame": {"x":1429,"y":551,"w":72,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":4,"w":72,"h":72}, + "sourceSize": {"w":80,"h":80} +}, +"Game/UI/CollectionFilter/Escaped.png": +{ + "frame": {"x":1628,"y":946,"w":46,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":5,"w":46,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionTab/AutoBind.png": +{ + "frame": {"x":1769,"y":146,"w":60,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":0,"w":60,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/DollmakerTarget.png": +{ + "frame": {"x":147,"y":1294,"w":142,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, + "sourceSize": {"w":144,"h":144} +}, +"Game/UI/Dress.png": +{ + "frame": {"x":1970,"y":1082,"w":69,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":69,"h":69}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/Facility/AlchemyLab.png": +{ + "frame": {"x":1834,"y":506,"w":64,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":64,"h":69}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Facility/Gear.png": +{ + "frame": {"x":1549,"y":1460,"w":66,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":66,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Facility_Prisoners.png": +{ + "frame": {"x":489,"y":815,"w":30,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":44,"y":4,"w":30,"h":29}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/HelpGag.png": +{ + "frame": {"x":1583,"y":1596,"w":32,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":15,"w":32,"h":31}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/HighValueTarget.png": +{ + "frame": {"x":147,"y":1438,"w":142,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, + "sourceSize": {"w":144,"h":144} +}, +"Game/UI/ItemAura.png": +{ + "frame": {"x":1429,"y":625,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/ItemAuraBG.png": +{ + "frame": {"x":1696,"y":1,"w":71,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":71,"h":71}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/MapMod/Bandit.png": +{ + "frame": {"x":1972,"y":794,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/MapMod/Dragon.png": +{ + "frame": {"x":1899,"y":797,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/MapMod/Mold.png": +{ + "frame": {"x":1696,"y":1768,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/MapMod/Plant.png": +{ + "frame": {"x":1971,"y":866,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/MapMod/Robot.png": +{ + "frame": {"x":1899,"y":869,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/MapMod/Slime.png": +{ + "frame": {"x":1971,"y":938,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/MapMod/Witch.png": +{ + "frame": {"x":1899,"y":941,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/MapMod/Wolf.png": +{ + "frame": {"x":1971,"y":1010,"w":70,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/NavMap/basic.png": +{ + "frame": {"x":1690,"y":1542,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/NavMap/boss.png": +{ + "frame": {"x":1758,"y":1612,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/NavMap/shop.png": +{ + "frame": {"x":1760,"y":1542,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Plus.png": +{ + "frame": {"x":611,"y":815,"w":28,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":28,"h":28}, + "sourceSize": {"w":30,"h":30} +}, +"Game/UI/Rank/Rank3.png": +{ + "frame": {"x":1628,"y":1012,"w":46,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":5,"w":46,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/StageTarget.png": +{ + "frame": {"x":147,"y":1582,"w":142,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, + "sourceSize": {"w":144,"h":144} +}, +"Game/UI/Star.png": +{ + "frame": {"x":641,"y":815,"w":28,"h":28}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":28,"h":28}, + "sourceSize": {"w":28,"h":28} +}, +"Game/UI/StarOff.png": +{ + "frame": {"x":671,"y":815,"w":28,"h":28}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":28,"h":28}, + "sourceSize": {"w":28,"h":28} +}, +"Game/WarningBacking.png": +{ + "frame": {"x":1429,"y":699,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/WarningBackingHighlight.png": +{ + "frame": {"x":1480,"y":815,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/WarningColor.png": +{ + "frame": {"x":1480,"y":889,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/WarningColorBasic.png": +{ + "frame": {"x":1480,"y":963,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/WarningColorSpecial.png": +{ + "frame": {"x":1543,"y":1037,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/WarningColorSpecialBasic.png": +{ + "frame": {"x":1503,"y":402,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/WarningColorSpell.png": +{ + "frame": {"x":1503,"y":476,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/WarningHighlightAlly.png": +{ + "frame": {"x":1764,"y":1682,"w":68,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":68,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/WeakBinding.png": +{ + "frame": {"x":1831,"y":1207,"w":66,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":1,"w":66,"h":68}, + "sourceSize": {"w":72,"h":72} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "game4.png", + "format": "RGBA8888", + "size": {"w":2048,"h":2048}, + "scale": "1", + "related_multi_packs": [ "game0.json", "game1.json", "game2.json", "game3.json", "game5.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:93331e914a1bc9da57f494945b1cabd8:29d6d373e93b4cfb07f84e92c1fd5a73:54a7432a0665349a58c0c74f51e75c65$" +} +} diff --git a/TextureAtlas/game4.png b/TextureAtlas/game4.png new file mode 100644 index 000000000..4ac76e0e8 Binary files /dev/null and b/TextureAtlas/game4.png differ diff --git a/TextureAtlas/game5.json b/TextureAtlas/game5.json new file mode 100644 index 000000000..bf910d47d --- /dev/null +++ b/TextureAtlas/game5.json @@ -0,0 +1,10509 @@ +{"frames": { + +"Game/Backpack.png": +{ + "frame": {"x":1152,"y":456,"w":47,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":28,"w":47,"h":48}, + "sourceSize": {"w":56,"h":86} +}, +"Game/Buckle.png": +{ + "frame": {"x":337,"y":207,"w":45,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":5,"w":45,"h":46}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Buffs/armor.png": +{ + "frame": {"x":724,"y":164,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/BlankBuff.png": +{ + "frame": {"x":772,"y":165,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boost.png": +{ + "frame": {"x":820,"y":165,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boostmixed.png": +{ + "frame": {"x":868,"y":165,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundArms.png": +{ + "frame": {"x":916,"y":165,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundBlind.png": +{ + "frame": {"x":1007,"y":167,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundGag.png": +{ + "frame": {"x":1055,"y":167,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundGagFull.png": +{ + "frame": {"x":1103,"y":168,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundHands.png": +{ + "frame": {"x":1151,"y":168,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundHandsPartial.png": +{ + "frame": {"x":1199,"y":168,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundImmobile.png": +{ + "frame": {"x":1247,"y":169,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundSlow1.png": +{ + "frame": {"x":1295,"y":169,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundSlow2.png": +{ + "frame": {"x":1343,"y":169,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundSlow3.png": +{ + "frame": {"x":1391,"y":169,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundSlow4.png": +{ + "frame": {"x":1439,"y":169,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/boundStun.png": +{ + "frame": {"x":1487,"y":169,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buff.png": +{ + "frame": {"x":1535,"y":170,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffAkashicConflux.png": +{ + "frame": {"x":1583,"y":170,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffAnalyze.png": +{ + "frame": {"x":1631,"y":170,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffArcaneEnergy.png": +{ + "frame": {"x":1679,"y":170,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffAvatarAir.png": +{ + "frame": {"x":1727,"y":170,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffAvatarEarth.png": +{ + "frame": {"x":1775,"y":170,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffAvatarFire.png": +{ + "frame": {"x":1823,"y":170,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffAvatarWater.png": +{ + "frame": {"x":1871,"y":170,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffBattleRhythm.png": +{ + "frame": {"x":1919,"y":170,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffBattleTrance.png": +{ + "frame": {"x":1967,"y":170,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffBoundByFate.png": +{ + "frame": {"x":1,"y":204,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffBurning.png": +{ + "frame": {"x":49,"y":205,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffCamo.png": +{ + "frame": {"x":97,"y":205,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffChaoticOverflow.png": +{ + "frame": {"x":145,"y":206,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffChilled.png": +{ + "frame": {"x":193,"y":206,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffChillWalk.png": +{ + "frame": {"x":241,"y":206,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffConduction.png": +{ + "frame": {"x":289,"y":206,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffCorrupted.png": +{ + "frame": {"x":384,"y":209,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffCorruptionStat.png": +{ + "frame": {"x":432,"y":209,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffCursed.png": +{ + "frame": {"x":480,"y":210,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffCursedDistract.png": +{ + "frame": {"x":575,"y":212,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffCursingCircle.png": +{ + "frame": {"x":623,"y":212,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffCutting.png": +{ + "frame": {"x":671,"y":212,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffd_OrgasmResist.png": +{ + "frame": {"x":719,"y":212,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffd_SlimeMimic.png": +{ + "frame": {"x":767,"y":213,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffDildoBatBuff.png": +{ + "frame": {"x":815,"y":213,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffDisenchantSelf.png": +{ + "frame": {"x":863,"y":213,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffDistractionCast.png": +{ + "frame": {"x":911,"y":213,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffDistractionShield.png": +{ + "frame": {"x":959,"y":213,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffDrenched.png": +{ + "frame": {"x":1007,"y":215,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffe_OrgasmResist.png": +{ + "frame": {"x":1055,"y":215,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffEmpower.png": +{ + "frame": {"x":1103,"y":216,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffForcedSubmission.png": +{ + "frame": {"x":1151,"y":216,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffFuukaOrb.png": +{ + "frame": {"x":1199,"y":216,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffGreaterInvisibility.png": +{ + "frame": {"x":1247,"y":217,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffHaunted.png": +{ + "frame": {"x":1295,"y":217,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffHighValueFound.png": +{ + "frame": {"x":1343,"y":217,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffIgnite.png": +{ + "frame": {"x":1391,"y":217,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffInnerPowerArcaneStore.png": +{ + "frame": {"x":1439,"y":217,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffInvisibility.png": +{ + "frame": {"x":1487,"y":217,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffLatexBubble.png": +{ + "frame": {"x":1535,"y":218,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffLatexIntegrationStat.png": +{ + "frame": {"x":1583,"y":218,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffLeatherBurst.png": +{ + "frame": {"x":1631,"y":218,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffLightningRod.png": +{ + "frame": {"x":1679,"y":218,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffManaBurst.png": +{ + "frame": {"x":911,"y":213,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffManaRegenSuspend.png": +{ + "frame": {"x":1727,"y":218,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffNovicePet.png": +{ + "frame": {"x":1775,"y":218,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffNovicePetBad.png": +{ + "frame": {"x":1823,"y":218,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffNovicePetVeryBad.png": +{ + "frame": {"x":1871,"y":218,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffNoWP.png": +{ + "frame": {"x":1919,"y":218,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffPoisonDagger.png": +{ + "frame": {"x":1967,"y":218,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffRaiseDefenses.png": +{ + "frame": {"x":1,"y":252,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffRogueEscape.png": +{ + "frame": {"x":49,"y":253,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffSagittaAssault.png": +{ + "frame": {"x":97,"y":253,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffScrollArms.png": +{ + "frame": {"x":145,"y":254,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffScrollLegs.png": +{ + "frame": {"x":193,"y":254,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffScrollVerbal.png": +{ + "frame": {"x":241,"y":254,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffShadowSeal.png": +{ + "frame": {"x":289,"y":254,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffShockCollarCD.png": +{ + "frame": {"x":384,"y":257,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffSlimed.png": +{ + "frame": {"x":432,"y":257,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffSlimeMimic.png": +{ + "frame": {"x":480,"y":258,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffSlippery.png": +{ + "frame": {"x":575,"y":260,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffSpellDamageResist.png": +{ + "frame": {"x":623,"y":260,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffSpellDamageUp.png": +{ + "frame": {"x":671,"y":260,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffStoneSkin.png": +{ + "frame": {"x":719,"y":260,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffTablet.png": +{ + "frame": {"x":767,"y":261,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffTabletConjure.png": +{ + "frame": {"x":815,"y":261,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffTabletElements.png": +{ + "frame": {"x":1823,"y":170,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffTabletIllusion.png": +{ + "frame": {"x":863,"y":261,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffTabletLatex.png": +{ + "frame": {"x":911,"y":261,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffTabletLeather.png": +{ + "frame": {"x":959,"y":261,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffTabletMetal.png": +{ + "frame": {"x":1007,"y":263,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffTabletRope.png": +{ + "frame": {"x":1055,"y":263,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffTabletWill.png": +{ + "frame": {"x":1103,"y":264,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffTaunted.png": +{ + "frame": {"x":1151,"y":264,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffTraineeWP.png": +{ + "frame": {"x":1199,"y":264,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffUnsteady.png": +{ + "frame": {"x":1247,"y":265,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/buff/buffWaterBubble.png": +{ + "frame": {"x":1295,"y":265,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Blind.png": +{ + "frame": {"x":1343,"y":265,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Blocked.png": +{ + "frame": {"x":1405,"y":613,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":54,"h":54}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Buffs/curse/Blue.png": +{ + "frame": {"x":1391,"y":265,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Curse.png": +{ + "frame": {"x":1439,"y":265,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Disc.png": +{ + "frame": {"x":1487,"y":265,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Divine.png": +{ + "frame": {"x":1535,"y":266,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Dollmaker.png": +{ + "frame": {"x":1583,"y":266,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Fuuka.png": +{ + "frame": {"x":1631,"y":266,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Gold.png": +{ + "frame": {"x":1679,"y":266,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/HiSec.png": +{ + "frame": {"x":1727,"y":266,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Purple.png": +{ + "frame": {"x":1775,"y":266,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Red.png": +{ + "frame": {"x":1823,"y":266,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Red_Hi.png": +{ + "frame": {"x":1871,"y":266,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Red_Med.png": +{ + "frame": {"x":1919,"y":266,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/Rubber.png": +{ + "frame": {"x":1967,"y":266,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/StarCurse.png": +{ + "frame": {"x":1,"y":300,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/curse/White.png": +{ + "frame": {"x":49,"y":301,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/damageresist.png": +{ + "frame": {"x":97,"y":301,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/debuff.png": +{ + "frame": {"x":145,"y":302,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/Denied.png": +{ + "frame": {"x":193,"y":302,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmg.png": +{ + "frame": {"x":241,"y":302,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgacid.png": +{ + "frame": {"x":289,"y":302,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgarcane.png": +{ + "frame": {"x":384,"y":305,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgchain.png": +{ + "frame": {"x":432,"y":305,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgcharm.png": +{ + "frame": {"x":480,"y":306,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgcold.png": +{ + "frame": {"x":528,"y":308,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgcrush.png": +{ + "frame": {"x":576,"y":308,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgelectric.png": +{ + "frame": {"x":624,"y":308,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgfire.png": +{ + "frame": {"x":672,"y":308,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgglue.png": +{ + "frame": {"x":720,"y":309,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmggrope.png": +{ + "frame": {"x":768,"y":309,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmghappygas.png": +{ + "frame": {"x":816,"y":309,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgholy.png": +{ + "frame": {"x":864,"y":309,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgice.png": +{ + "frame": {"x":912,"y":309,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgmagic.png": +{ + "frame": {"x":1007,"y":311,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgmelee.png": +{ + "frame": {"x":1055,"y":311,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgpain.png": +{ + "frame": {"x":1103,"y":312,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgpierce.png": +{ + "frame": {"x":1151,"y":312,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmg.png": +{ + "frame": {"x":1199,"y":312,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgacid.png": +{ + "frame": {"x":1247,"y":313,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgarcane.png": +{ + "frame": {"x":1295,"y":313,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgbind.png": +{ + "frame": {"x":1343,"y":313,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgchain.png": +{ + "frame": {"x":1391,"y":313,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgcharm.png": +{ + "frame": {"x":1439,"y":313,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgcold.png": +{ + "frame": {"x":1487,"y":313,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgcrush.png": +{ + "frame": {"x":1535,"y":314,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgelectric.png": +{ + "frame": {"x":1583,"y":314,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgfire.png": +{ + "frame": {"x":1631,"y":314,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgglue.png": +{ + "frame": {"x":1679,"y":314,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmggrope.png": +{ + "frame": {"x":1727,"y":314,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmghappygas.png": +{ + "frame": {"x":1775,"y":314,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgice.png": +{ + "frame": {"x":1823,"y":314,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgmagic.png": +{ + "frame": {"x":1871,"y":314,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgmelee.png": +{ + "frame": {"x":1919,"y":314,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgpain.png": +{ + "frame": {"x":1967,"y":314,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgpierce.png": +{ + "frame": {"x":1,"y":348,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgplush.png": +{ + "frame": {"x":49,"y":349,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgpoison.png": +{ + "frame": {"x":97,"y":349,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgslash.png": +{ + "frame": {"x":145,"y":350,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgsoap.png": +{ + "frame": {"x":193,"y":350,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgsoul.png": +{ + "frame": {"x":241,"y":350,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgspell.png": +{ + "frame": {"x":671,"y":260,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgstun.png": +{ + "frame": {"x":289,"y":350,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgtickle.png": +{ + "frame": {"x":337,"y":353,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgPlus/dmgunarmed.png": +{ + "frame": {"x":385,"y":353,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgplush.png": +{ + "frame": {"x":433,"y":354,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgpoison.png": +{ + "frame": {"x":519,"y":356,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgslash.png": +{ + "frame": {"x":567,"y":356,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgsoap.png": +{ + "frame": {"x":615,"y":356,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgsoul.png": +{ + "frame": {"x":663,"y":356,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgstun.png": +{ + "frame": {"x":711,"y":357,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgtickle.png": +{ + "frame": {"x":759,"y":357,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/dmgunarmed.png": +{ + "frame": {"x":807,"y":357,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/Edged.png": +{ + "frame": {"x":855,"y":357,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/Help.png": +{ + "frame": {"x":903,"y":357,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/HelpCorner.png": +{ + "frame": {"x":951,"y":358,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/HelpCrack.png": +{ + "frame": {"x":999,"y":359,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/HelpHook.png": +{ + "frame": {"x":1047,"y":359,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/HelpSharp.png": +{ + "frame": {"x":1095,"y":360,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/HelpSticky.png": +{ + "frame": {"x":1143,"y":360,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/info.png": +{ + "frame": {"x":1191,"y":360,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoAccuracy.png": +{ + "frame": {"x":1239,"y":361,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoAccuracyBuff.png": +{ + "frame": {"x":1287,"y":361,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoAccuracyDebuff.png": +{ + "frame": {"x":1335,"y":361,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoBlock.png": +{ + "frame": {"x":1383,"y":361,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoDamageMelee.png": +{ + "frame": {"x":1431,"y":361,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoEvasion.png": +{ + "frame": {"x":1479,"y":361,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoJailFree.png": +{ + "frame": {"x":1527,"y":362,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoJailPrisoner.png": +{ + "frame": {"x":1575,"y":362,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoJailSubmissive.png": +{ + "frame": {"x":1623,"y":362,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoKey.png": +{ + "frame": {"x":1671,"y":362,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoMiscast.png": +{ + "frame": {"x":1719,"y":362,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoMiscastDebuff.png": +{ + "frame": {"x":1767,"y":362,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/infoNoKey.png": +{ + "frame": {"x":1815,"y":362,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/invisible.png": +{ + "frame": {"x":1487,"y":217,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/kinkbuff.png": +{ + "frame": {"x":1863,"y":362,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perk.png": +{ + "frame": {"x":1911,"y":362,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perkBerserkerRage.png": +{ + "frame": {"x":1959,"y":362,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perkBoundPower.png": +{ + "frame": {"x":1,"y":396,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perkBurningDesire.png": +{ + "frame": {"x":49,"y":397,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perkFrigidPersonality.png": +{ + "frame": {"x":97,"y":397,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perkGroundedInReality.png": +{ + "frame": {"x":145,"y":398,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perkImmovableObject.png": +{ + "frame": {"x":193,"y":398,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perkLeastResistance.png": +{ + "frame": {"x":241,"y":398,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perkLikeTheWind.png": +{ + "frame": {"x":289,"y":398,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perkPacifist.png": +{ + "frame": {"x":337,"y":401,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perkPathOfLeastResistance.png": +{ + "frame": {"x":385,"y":401,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/perk/perkUnstableMagic.png": +{ + "frame": {"x":433,"y":402,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/Plugged.png": +{ + "frame": {"x":481,"y":404,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/PluggedFull.png": +{ + "frame": {"x":529,"y":404,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/quickness.png": +{ + "frame": {"x":577,"y":404,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/restraintblock.png": +{ + "frame": {"x":625,"y":404,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/restriction.png": +{ + "frame": {"x":673,"y":405,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/Satisfied.png": +{ + "frame": {"x":721,"y":405,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/shadow.png": +{ + "frame": {"x":769,"y":405,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/shield.png": +{ + "frame": {"x":817,"y":405,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/spellarmor.png": +{ + "frame": {"x":865,"y":405,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/status/freeArms.png": +{ + "frame": {"x":913,"y":406,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/status/freeEyes.png": +{ + "frame": {"x":961,"y":407,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/status/freeHands.png": +{ + "frame": {"x":1009,"y":407,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/status/freeLegs.png": +{ + "frame": {"x":1057,"y":408,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/status/freeMouth.png": +{ + "frame": {"x":1105,"y":408,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/training/Heels.png": +{ + "frame": {"x":1153,"y":408,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/Vibe0.png": +{ + "frame": {"x":1201,"y":409,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/Vibe1.png": +{ + "frame": {"x":1249,"y":409,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/Vibe2.png": +{ + "frame": {"x":1297,"y":409,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/Vibe3.png": +{ + "frame": {"x":1345,"y":409,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/Vibe4.png": +{ + "frame": {"x":1393,"y":409,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/Vibe5.png": +{ + "frame": {"x":1441,"y":409,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/visibility.png": +{ + "frame": {"x":1489,"y":410,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/weaponTag/bow.png": +{ + "frame": {"x":1537,"y":410,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/weaponTag/clumsy.png": +{ + "frame": {"x":1585,"y":410,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/weaponTag/heavy.png": +{ + "frame": {"x":1633,"y":410,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/weaponTag/illum.png": +{ + "frame": {"x":1681,"y":410,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/weaponTag/light.png": +{ + "frame": {"x":1729,"y":410,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/weaponTag/magic.png": +{ + "frame": {"x":1777,"y":410,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/weaponTag/massive.png": +{ + "frame": {"x":1825,"y":410,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/weaponTag/noHands.png": +{ + "frame": {"x":1873,"y":410,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/weaponTag/offhand.png": +{ + "frame": {"x":1921,"y":410,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/weaponTag/shield.png": +{ + "frame": {"x":724,"y":164,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Buffs/weaponTag/stamPenType_Staff.png": +{ + "frame": {"x":1,"y":444,"w":46,"h":46}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, + "sourceSize": {"w":46,"h":46} +}, +"Game/Bullets/AllyCrackleTrail.png": +{ + "frame": {"x":995,"y":1024,"w":69,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":6,"w":69,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AllyCrackleTrailHit.png": +{ + "frame": {"x":995,"y":1024,"w":69,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":6,"w":69,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AllyHolyBoltHit.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AllyShadowStrike.png": +{ + "frame": {"x":222,"y":446,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AllyShadowStrikeHit.png": +{ + "frame": {"x":623,"y":836,"w":58,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AllyWindBlastHit.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AMGagBolt.png": +{ + "frame": {"x":1476,"y":39,"w":41,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":17,"w":41,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AMGagBoltHit.png": +{ + "frame": {"x":1630,"y":1227,"w":65,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":4,"w":65,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AmpuleBlue.png": +{ + "frame": {"x":1103,"y":558,"w":55,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":11,"w":55,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AmpuleBlueHit.png": +{ + "frame": {"x":1496,"y":1160,"w":66,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":66,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AmpuleGreen.png": +{ + "frame": {"x":287,"y":159,"w":48,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":11,"w":48,"h":45}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AmpuleGreenHit.png": +{ + "frame": {"x":1755,"y":1163,"w":66,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":66,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AmpuleRed.png": +{ + "frame": {"x":1741,"y":508,"w":54,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":11,"w":54,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AmpuleRedHit.png": +{ + "frame": {"x":1,"y":1202,"w":66,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":66,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AmpuleYellow.png": +{ + "frame": {"x":575,"y":164,"w":49,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":11,"w":49,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AmpuleYellowHit.png": +{ + "frame": {"x":69,"y":1202,"w":66,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":66,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/AreaElectrifyHit.png": +{ + "frame": {"x":995,"y":1024,"w":69,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":6,"w":69,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowBoltHeavyHit.png": +{ + "frame": {"x":880,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowBoltHit.png": +{ + "frame": {"x":987,"y":1088,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowLongbowHit.png": +{ + "frame": {"x":880,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowRecurveHit.png": +{ + "frame": {"x":987,"y":1088,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArrowVineHit.png": +{ + "frame": {"x":1189,"y":726,"w":44,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BanditBola.png": +{ + "frame": {"x":1102,"y":456,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":48,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BearTrap.png": +{ + "frame": {"x":1653,"y":80,"w":52,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":16,"w":52,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BigBoulderLaunchHit.png": +{ + "frame": {"x":59,"y":887,"w":51,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BindBeltHit.png": +{ + "frame": {"x":739,"y":1149,"w":48,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":5,"w":48,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BindChainHit.png": +{ + "frame": {"x":391,"y":774,"w":56,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":7,"w":56,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BindFabricHit.png": +{ + "frame": {"x":742,"y":608,"w":44,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":11,"w":44,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BindRopeHit.png": +{ + "frame": {"x":1976,"y":740,"w":65,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":7,"w":65,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BindVineHit.png": +{ + "frame": {"x":1189,"y":726,"w":44,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BindWrappingHit.png": +{ + "frame": {"x":788,"y":608,"w":44,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":11,"w":44,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BlasterBlastHit.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BondageBustBeam.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BondageBustBeamHit.png": +{ + "frame": {"x":1054,"y":1090,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BondageBustBeamTrail.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BondageBustBeamTrailHit.png": +{ + "frame": {"x":1054,"y":1090,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Boulder.png": +{ + "frame": {"x":184,"y":948,"w":58,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":6,"w":58,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BoulderKickedHit.png": +{ + "frame": {"x":59,"y":887,"w":51,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BoulderLaunch.png": +{ + "frame": {"x":184,"y":948,"w":58,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":6,"w":58,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/BoulderLaunchHit.png": +{ + "frame": {"x":59,"y":887,"w":51,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Bubbleexp.png": +{ + "frame": {"x":1574,"y":124,"w":44,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":14,"w":44,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/C4Item.png": +{ + "frame": {"x":426,"y":552,"w":47,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":85,"y":78,"w":47,"h":51}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/CelestialBolt.png": +{ + "frame": {"x":91,"y":495,"w":53,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":12,"w":53,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ClericBeamBeam.png": +{ + "frame": {"x":1121,"y":1090,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ClericBeamBeamHit.png": +{ + "frame": {"x":1188,"y":1091,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ClericBeamBeamTrail.png": +{ + "frame": {"x":1121,"y":1090,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ClericBeamBeamTrailHit.png": +{ + "frame": {"x":1188,"y":1091,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CoronaBeam.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CoronaBeamHit.png": +{ + "frame": {"x":1054,"y":1090,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CoronaBeamTrail.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CoronaBeamTrailHit.png": +{ + "frame": {"x":1054,"y":1090,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrackleTrail.png": +{ + "frame": {"x":92,"y":768,"w":58,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":9,"w":58,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrystalBoltMany.png": +{ + "frame": {"x":1255,"y":1091,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/CrystalShock.png": +{ + "frame": {"x":1473,"y":80,"w":40,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":15,"w":40,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/DaggerHit.png": +{ + "frame": {"x":222,"y":446,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/DistractionBurstBullet.png": +{ + "frame": {"x":412,"y":716,"w":56,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":56,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/DragonSlash.png": +{ + "frame": {"x":146,"y":495,"w":52,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":13,"w":52,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/DynamiteItem.png": +{ + "frame": {"x":606,"y":501,"w":30,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":93,"y":79,"w":30,"h":51}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EarthformLine.png": +{ + "frame": {"x":59,"y":887,"w":51,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EarthformLineHit.png": +{ + "frame": {"x":59,"y":887,"w":51,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EarthformLineTrail.png": +{ + "frame": {"x":59,"y":887,"w":51,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EarthformLineTrailHit.png": +{ + "frame": {"x":59,"y":887,"w":51,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ElasticGripHit.png": +{ + "frame": {"x":1561,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ElectricEffect.png": +{ + "frame": {"x":92,"y":768,"w":58,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":9,"w":58,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyBlastHit.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyCoronaBeam.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyCoronaBeamHit.png": +{ + "frame": {"x":1054,"y":1090,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyCoronaBeamTrail.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyCoronaBeamTrailHit.png": +{ + "frame": {"x":1054,"y":1090,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyLatexArmbinderBolt.png": +{ + "frame": {"x":405,"y":75,"w":35,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyLatexArmbinderBoltHit.png": +{ + "frame": {"x":691,"y":453,"w":49,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyLatexGagBoltHit.png": +{ + "frame": {"x":691,"y":453,"w":49,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyLatexLegbinderBoltHit.png": +{ + "frame": {"x":691,"y":453,"w":49,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyLatexRestraintBolt.png": +{ + "frame": {"x":1975,"y":80,"w":47,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":16,"w":47,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyLatexRestraintBoltHit.png": +{ + "frame": {"x":691,"y":453,"w":49,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemySteelRainPlugHit.png": +{ + "frame": {"x":465,"y":117,"w":46,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":14,"w":46,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyWindBlastHit.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EnemyWinterblast.png": +{ + "frame": {"x":1697,"y":1162,"w":56,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":5,"w":56,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Fireexp.png": +{ + "frame": {"x":87,"y":546,"w":51,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":11,"w":51,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FlameRuneStrike.png": +{ + "frame": {"x":232,"y":115,"w":42,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":87,"y":87,"w":42,"h":42}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FlameStrike.png": +{ + "frame": {"x":683,"y":836,"w":58,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":78,"y":79,"w":58,"h":58}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/FreezeHit.png": +{ + "frame": {"x":303,"y":1143,"w":63,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":63,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FreezeRuneStrike.png": +{ + "frame": {"x":470,"y":717,"w":56,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":80,"y":80,"w":56,"h":56}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/GagBolt.png": +{ + "frame": {"x":41,"y":73,"w":37,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":17,"w":37,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/GlueHit.png": +{ + "frame": {"x":1985,"y":1244,"w":62,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":2,"w":62,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/GustHit.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HairpinHit.png": +{ + "frame": {"x":276,"y":446,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Heal2Hit.png": +{ + "frame": {"x":213,"y":768,"w":58,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":58,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HeartArrowHit.png": +{ + "frame": {"x":1288,"y":613,"w":58,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":10,"w":58,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HeelShadowStrike.png": +{ + "frame": {"x":623,"y":836,"w":58,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HeelShadowStrikeHit.png": +{ + "frame": {"x":222,"y":446,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/HighBoltHit.png": +{ + "frame": {"x":1940,"y":510,"w":46,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":9,"w":46,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceBreathHit.png": +{ + "frame": {"x":645,"y":1019,"w":38,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":4,"w":38,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceDragonBreathPrepare.png": +{ + "frame": {"x":1190,"y":559,"w":55,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":12,"w":55,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceDragonBreathTrail.png": +{ + "frame": {"x":303,"y":1143,"w":63,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":63,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Iceexp.png": +{ + "frame": {"x":1190,"y":559,"w":55,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":12,"w":55,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceruneHit.png": +{ + "frame": {"x":645,"y":1019,"w":38,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":4,"w":38,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceSlowPrepare.png": +{ + "frame": {"x":1190,"y":559,"w":55,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":12,"w":55,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IceSlowPrepareHit.png": +{ + "frame": {"x":303,"y":1143,"w":63,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":63,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Icicles.png": +{ + "frame": {"x":1190,"y":559,"w":55,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":12,"w":55,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/IciclesHit.png": +{ + "frame": {"x":1190,"y":559,"w":55,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":12,"w":55,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexArmbinderBolt.png": +{ + "frame": {"x":405,"y":75,"w":35,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexArmbinderBoltHit.png": +{ + "frame": {"x":691,"y":453,"w":49,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexBubble.png": +{ + "frame": {"x":1707,"y":80,"w":54,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":16,"w":54,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexBubbleexp.png": +{ + "frame": {"x":1574,"y":124,"w":44,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":14,"w":44,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexBubbleHit.png": +{ + "frame": {"x":691,"y":453,"w":49,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexBubbleTrail.png": +{ + "frame": {"x":1975,"y":80,"w":47,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":16,"w":47,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexGagBoltHit.png": +{ + "frame": {"x":691,"y":453,"w":49,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexLegbinderBoltHit.png": +{ + "frame": {"x":691,"y":453,"w":49,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexSpray.png": +{ + "frame": {"x":1589,"y":80,"w":62,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":13,"w":62,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LatexSprayHit.png": +{ + "frame": {"x":744,"y":36,"w":38,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":18,"w":38,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LeatherCuffsBolt.png": +{ + "frame": {"x":1077,"y":1287,"w":64,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":2,"w":64,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/LightningBoltTrail.png": +{ + "frame": {"x":995,"y":1024,"w":69,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":6,"w":69,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MagicMissile.png": +{ + "frame": {"x":368,"y":1144,"w":63,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":4,"w":63,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MagicMissile2.png": +{ + "frame": {"x":1636,"y":458,"w":47,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":47,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MagicMissile2Hit.png": +{ + "frame": {"x":433,"y":1144,"w":63,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":4,"w":63,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MagicMissileHit.png": +{ + "frame": {"x":433,"y":1144,"w":63,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":4,"w":63,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MagicRopeHit.png": +{ + "frame": {"x":1214,"y":38,"w":54,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":16,"w":54,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManyCables.png": +{ + "frame": {"x":1443,"y":1,"w":36,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":18,"w":36,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManyCablesHit.png": +{ + "frame": {"x":1481,"y":1,"w":36,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":18,"w":36,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManyChains.png": +{ + "frame": {"x":1768,"y":848,"w":60,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":7,"w":60,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManyChainsHit.png": +{ + "frame": {"x":1196,"y":843,"w":52,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":6,"w":52,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ManyOrbs.png": +{ + "frame": {"x":1255,"y":1091,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MinigunHit.png": +{ + "frame": {"x":479,"y":452,"w":51,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":10,"w":51,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MonolithBeamBeam.png": +{ + "frame": {"x":1255,"y":1091,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MonolithBeamBeamHit.png": +{ + "frame": {"x":1322,"y":1092,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MonolithBeamBeamTrail.png": +{ + "frame": {"x":1255,"y":1091,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/MonolithBeamBeamTrailHit.png": +{ + "frame": {"x":1322,"y":1092,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/NurseSyringeHit.png": +{ + "frame": {"x":528,"y":717,"w":52,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":52,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ObserverBeamBeam.png": +{ + "frame": {"x":1389,"y":1093,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ObserverBeamBeamHit.png": +{ + "frame": {"x":1496,"y":1095,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ObserverBeamBeamTrail.png": +{ + "frame": {"x":1389,"y":1093,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ObserverBeamBeamTrailHit.png": +{ + "frame": {"x":1496,"y":1095,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/OneBarMissile.png": +{ + "frame": {"x":426,"y":500,"w":50,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":11,"w":50,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/OrgasmStrikeHit.png": +{ + "frame": {"x":1198,"y":1027,"w":67,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":67,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/PlayerBola.png": +{ + "frame": {"x":1102,"y":456,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":48,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/PlayerRubberSniperHit.png": +{ + "frame": {"x":1563,"y":1095,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RecoverObjectHit.png": +{ + "frame": {"x":1940,"y":510,"w":46,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":9,"w":46,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RedSlimeHit.png": +{ + "frame": {"x":1617,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RestrainingBoltHit.png": +{ + "frame": {"x":433,"y":1144,"w":63,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":4,"w":63,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RestrainingDevice.png": +{ + "frame": {"x":1673,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RobotBoltHit.png": +{ + "frame": {"x":1729,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RopeBoltHit.png": +{ + "frame": {"x":1321,"y":39,"w":54,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":16,"w":54,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RopeBoltLaunch.png": +{ + "frame": {"x":1235,"y":726,"w":44,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RopeBoltLaunchHit.png": +{ + "frame": {"x":1235,"y":726,"w":44,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RopeBoltLaunchSingle.png": +{ + "frame": {"x":1235,"y":726,"w":44,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RopeBoltLaunchSingleHit.png": +{ + "frame": {"x":1235,"y":726,"w":44,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RopeRuneStrike.png": +{ + "frame": {"x":1785,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RubberBolt.png": +{ + "frame": {"x":612,"y":36,"w":44,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":18,"w":44,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RubberBoltHit.png": +{ + "frame": {"x":1255,"y":1091,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RubberBulletsHit.png": +{ + "frame": {"x":532,"y":452,"w":51,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":10,"w":51,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RubberSlimeHit.png": +{ + "frame": {"x":1630,"y":1096,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RubberSniperHit.png": +{ + "frame": {"x":1563,"y":1095,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/RuneTrap_Belt.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_Bubble.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_Chain.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_Latex.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_LatexBall.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_LatexSphere.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_Leather.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_Ribbon.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_Rope.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_Rubber.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_Slime.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_SlimeBubble.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/RuneTrap_Vine.png": +{ + "frame": {"x":1841,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/SagittaBoltHit.png": +{ + "frame": {"x":723,"y":554,"w":62,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":62,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowBoltHit.png": +{ + "frame": {"x":222,"y":446,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowBubble.png": +{ + "frame": {"x":528,"y":211,"w":45,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":12,"w":45,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowBubbleHit.png": +{ + "frame": {"x":140,"y":546,"w":51,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":11,"w":51,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowDanceHit.png": +{ + "frame": {"x":834,"y":838,"w":58,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowOrb.png": +{ + "frame": {"x":1649,"y":907,"w":52,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":7,"w":52,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowOrbHit.png": +{ + "frame": {"x":623,"y":836,"w":58,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowShroudGirl.png": +{ + "frame": {"x":499,"y":1081,"w":42,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":5,"w":42,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowSlashTrail.png": +{ + "frame": {"x":222,"y":446,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowSlashTrailHit.png": +{ + "frame": {"x":623,"y":836,"w":58,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowStrike.png": +{ + "frame": {"x":222,"y":446,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowStrikeHit.png": +{ + "frame": {"x":623,"y":836,"w":58,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Shock.png": +{ + "frame": {"x":1066,"y":1026,"w":69,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":7,"w":69,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SingleBeltHit.png": +{ + "frame": {"x":1235,"y":726,"w":44,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SingleRibbon.png": +{ + "frame": {"x":377,"y":833,"w":60,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":4,"w":60,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SingleRibbonHit.png": +{ + "frame": {"x":1281,"y":726,"w":44,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SleepDartHit.png": +{ + "frame": {"x":528,"y":717,"w":52,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":52,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SlimePuddleHit.png": +{ + "frame": {"x":1755,"y":1098,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SlimeSplash.png": +{ + "frame": {"x":1755,"y":1098,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SlimeSplashHit.png": +{ + "frame": {"x":1561,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Slimethrower.png": +{ + "frame": {"x":1755,"y":1098,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Slimethrower2.png": +{ + "frame": {"x":50,"y":1137,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Slimethrower2Hit.png": +{ + "frame": {"x":50,"y":1137,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SlimethrowerHit.png": +{ + "frame": {"x":50,"y":1137,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SnareHitHit.png": +{ + "frame": {"x":1034,"y":1221,"w":59,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":6,"w":59,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Snowball.png": +{ + "frame": {"x":1697,"y":1162,"w":56,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":5,"w":56,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SteamPuff.png": +{ + "frame": {"x":1570,"y":1031,"w":63,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":5,"w":63,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SteelRainPlugHit.png": +{ + "frame": {"x":465,"y":117,"w":46,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":14,"w":46,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonLatexElemental.png": +{ + "frame": {"x":1337,"y":965,"w":65,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":8,"w":65,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonRedSlime.png": +{ + "frame": {"x":1617,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/SummonSingleRedSlime.png": +{ + "frame": {"x":1617,"y":615,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/TickleCloud.png": +{ + "frame": {"x":1630,"y":1161,"w":65,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":65,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/TrapSleepDartHit.png": +{ + "frame": {"x":528,"y":717,"w":52,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":52,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/TrueSteelHit.png": +{ + "frame": {"x":330,"y":449,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Vineexp.png": +{ + "frame": {"x":1,"y":1335,"w":63,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":2,"w":63,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/VineexpHit.png": +{ + "frame": {"x":66,"y":1335,"w":63,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":63,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WaterBall.png": +{ + "frame": {"x":41,"y":114,"w":47,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":16,"w":47,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WaterBallHit.png": +{ + "frame": {"x":1789,"y":788,"w":67,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":6,"w":67,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WindBlastHit.png": +{ + "frame": {"x":813,"y":1086,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchBoulder.png": +{ + "frame": {"x":184,"y":948,"w":58,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":6,"w":58,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchElectrify.png": +{ + "frame": {"x":1740,"y":729,"w":66,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":9,"w":66,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchIceboltHit.png": +{ + "frame": {"x":169,"y":1140,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchRopeHit.png": +{ + "frame": {"x":1321,"y":39,"w":54,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":16,"w":54,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchSlimeBallTrail.png": +{ + "frame": {"x":1755,"y":1098,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchSlimeHit.png": +{ + "frame": {"x":1755,"y":1098,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchWaterBall.png": +{ + "frame": {"x":41,"y":114,"w":47,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":16,"w":47,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WitchWaterBallHit.png": +{ + "frame": {"x":1789,"y":788,"w":67,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":6,"w":67,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WolfCrackle.png": +{ + "frame": {"x":92,"y":768,"w":58,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":9,"w":58,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/WolfCrackleTrail.png": +{ + "frame": {"x":92,"y":768,"w":58,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":9,"w":58,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ZombieOrbHit.png": +{ + "frame": {"x":137,"y":1205,"w":66,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":2,"w":66,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ZombieOrbIceHit.png": +{ + "frame": {"x":1699,"y":1033,"w":58,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":6,"w":58,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ZombieOrbMiniHit.png": +{ + "frame": {"x":137,"y":1205,"w":66,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":2,"w":66,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Class/Mage.png": +{ + "frame": {"x":1834,"y":909,"w":51,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":0,"w":51,"h":60}, + "sourceSize": {"w":71,"h":60} +}, +"Game/Class/Rogue.png": +{ + "frame": {"x":522,"y":956,"w":54,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":0,"w":54,"h":60}, + "sourceSize": {"w":71,"h":60} +}, +"Game/Conditions/Buff.png": +{ + "frame": {"x":790,"y":1,"w":31,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":31,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Debuff.png": +{ + "frame": {"x":365,"y":1,"w":30,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":40,"w":30,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Peace.png": +{ + "frame": {"x":161,"y":1,"w":32,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":5,"w":32,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Angry.png": +{ + "frame": {"x":1693,"y":1,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Annoyed.png": +{ + "frame": {"x":1726,"y":1,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Aware.png": +{ + "frame": {"x":1759,"y":1,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Blind.png": +{ + "frame": {"x":1792,"y":1,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Confused.png": +{ + "frame": {"x":1825,"y":1,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Embarrassed.png": +{ + "frame": {"x":1858,"y":1,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Fire.png": +{ + "frame": {"x":1891,"y":1,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Freeze.png": +{ + "frame": {"x":1924,"y":1,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/GiveUp.png": +{ + "frame": {"x":1957,"y":1,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Happy.png": +{ + "frame": {"x":1990,"y":1,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Idle.png": +{ + "frame": {"x":1,"y":34,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Jail.png": +{ + "frame": {"x":34,"y":34,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Laugh.png": +{ + "frame": {"x":67,"y":35,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Lose.png": +{ + "frame": {"x":100,"y":35,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Play.png": +{ + "frame": {"x":133,"y":35,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/PlayDone.png": +{ + "frame": {"x":166,"y":35,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Search.png": +{ + "frame": {"x":199,"y":35,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Sense.png": +{ + "frame": {"x":232,"y":35,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Shoot.png": +{ + "frame": {"x":265,"y":35,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Status.png": +{ + "frame": {"x":298,"y":35,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Struggle.png": +{ + "frame": {"x":331,"y":35,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Conditions/Thought/Thought.png": +{ + "frame": {"x":364,"y":35,"w":31,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/CurseInfo.png": +{ + "frame": {"x":1281,"y":507,"w":35,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":3,"w":35,"h":50}, + "sourceSize": {"w":56,"h":56} +}, +"Game/CurseUnlock.png": +{ + "frame": {"x":785,"y":663,"w":35,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":1,"w":35,"h":54}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Cursor.png": +{ + "frame": {"x":285,"y":599,"w":31,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":31,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Acid.png": +{ + "frame": {"x":755,"y":502,"w":50,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":50,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Belts.png": +{ + "frame": {"x":228,"y":599,"w":55,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":9,"w":55,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Bubble.png": +{ + "frame": {"x":807,"y":502,"w":50,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":11,"w":50,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Chains.png": +{ + "frame": {"x":1250,"y":784,"w":51,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/DistractionMote.png": +{ + "frame": {"x":1605,"y":39,"w":39,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":5,"w":39,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/DistractionMoteContact.png": +{ + "frame": {"x":1646,"y":39,"w":39,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":5,"w":39,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Fabric.png": +{ + "frame": {"x":426,"y":605,"w":47,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":13,"w":47,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/FabricGreen.png": +{ + "frame": {"x":743,"y":836,"w":56,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":8,"w":56,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Fireflies.png": +{ + "frame": {"x":138,"y":115,"w":45,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":16,"w":45,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/IllusOrb.png": +{ + "frame": {"x":711,"y":76,"w":58,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":29,"w":58,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/LanternUnlit.png": +{ + "frame": {"x":1868,"y":458,"w":28,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":20,"w":28,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/LatexThinBlue.png": +{ + "frame": {"x":1106,"y":122,"w":61,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":17,"w":61,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/LatexThinGreen.png": +{ + "frame": {"x":1169,"y":122,"w":61,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":17,"w":61,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Magicflies.png": +{ + "frame": {"x":185,"y":115,"w":45,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":16,"w":45,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/ManaEmpty.png": +{ + "frame": {"x":1819,"y":80,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":15,"w":50,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/ManaFull.png": +{ + "frame": {"x":1871,"y":80,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":15,"w":50,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/ManaPartial.png": +{ + "frame": {"x":1923,"y":80,"w":50,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":15,"w":50,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/OrbLantern.png": +{ + "frame": {"x":1089,"y":38,"w":32,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":30,"w":32,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Ropes.png": +{ + "frame": {"x":1983,"y":626,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":8,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Rubble.png": +{ + "frame": {"x":943,"y":1287,"w":65,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":4,"w":65,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/RubbleNoMend.png": +{ + "frame": {"x":943,"y":1287,"w":65,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":4,"w":65,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Sack.png": +{ + "frame": {"x":505,"y":1,"w":35,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":35,"w":35,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Smoke.png": +{ + "frame": {"x":261,"y":1341,"w":61,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":4,"w":61,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/SpikeTrapSeen.png": +{ + "frame": {"x":195,"y":1,"w":32,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":22,"w":32,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/StarryTrail.png": +{ + "frame": {"x":428,"y":162,"w":37,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":10,"w":37,"h":45}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Steam.png": +{ + "frame": {"x":1570,"y":1031,"w":63,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":5,"w":63,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Torch.png": +{ + "frame": {"x":847,"y":555,"w":28,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":19,"w":28,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/TorchOrb.png": +{ + "frame": {"x":942,"y":120,"w":32,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":29,"w":32,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/TorchOrbNoPanel.png": +{ + "frame": {"x":976,"y":120,"w":32,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":29,"w":32,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Vines.png": +{ + "frame": {"x":1037,"y":782,"w":54,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":6,"w":54,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/Wire.png": +{ + "frame": {"x":1887,"y":911,"w":61,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":6,"w":61,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/WireEnd.png": +{ + "frame": {"x":1201,"y":457,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":48,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EffectTiles/WireSparksAct.png": +{ + "frame": {"x":1490,"y":845,"w":63,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":12,"w":63,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AcidBarrel.png": +{ + "frame": {"x":760,"y":896,"w":39,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":9,"w":39,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Adventurer_Brat_Fighter.png": +{ + "frame": {"x":244,"y":951,"w":58,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":7,"w":58,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Adventurer_Sub_Fighter.png": +{ + "frame": {"x":1950,"y":920,"w":62,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":7,"w":62,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Adventurer_Switch_Fighter.png": +{ + "frame": {"x":1931,"y":1109,"w":53,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":7,"w":53,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Alchemist.png": +{ + "frame": {"x":106,"y":1010,"w":49,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":49,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Alkahestor.png": +{ + "frame": {"x":958,"y":1355,"w":53,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":0,"w":53,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Ally.png": +{ + "frame": {"x":1459,"y":1293,"w":60,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":4,"w":60,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AllyDoll.png": +{ + "frame": {"x":789,"y":1151,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AmpuleBlueHit.png": +{ + "frame": {"x":205,"y":1205,"w":66,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":66,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AnimArmbinder.png": +{ + "frame": {"x":442,"y":75,"w":35,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AnimatedArmor.png": +{ + "frame": {"x":213,"y":887,"w":36,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":3,"w":36,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AnimChastity.png": +{ + "frame": {"x":251,"y":890,"w":45,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AnimLegbinder.png": +{ + "frame": {"x":1685,"y":671,"w":69,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":9,"w":69,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AntiqueQuest.png": +{ + "frame": {"x":1699,"y":970,"w":58,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":5,"w":58,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AquaSlime.png": +{ + "frame": {"x":889,"y":504,"w":50,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":11,"w":50,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ArmorerQuest.png": +{ + "frame": {"x":1697,"y":1228,"w":56,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":5,"w":56,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Bandit.png": +{ + "frame": {"x":963,"y":961,"w":41,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":7,"w":41,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BanditChief.png": +{ + "frame": {"x":1049,"y":962,"w":36,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":7,"w":36,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BanditGrappler.png": +{ + "frame": {"x":622,"y":957,"w":51,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":7,"w":51,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BanditPet.png": +{ + "frame": {"x":1162,"y":964,"w":34,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":34,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BanditQuest.png": +{ + "frame": {"x":1049,"y":962,"w":36,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":7,"w":36,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeAir.png": +{ + "frame": {"x":1332,"y":1290,"w":62,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":1,"w":62,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeConcrete.png": +{ + "frame": {"x":58,"y":948,"w":62,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":6,"w":62,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeEarth.png": +{ + "frame": {"x":901,"y":1355,"w":55,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":3,"w":55,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeHighSecurityDoor.png": +{ + "frame": {"x":246,"y":546,"w":50,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":13,"w":50,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeLight.png": +{ + "frame": {"x":246,"y":546,"w":50,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":13,"w":50,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeSecurityDoor.png": +{ + "frame": {"x":246,"y":546,"w":50,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":13,"w":50,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BarricadeVine.png": +{ + "frame": {"x":1588,"y":906,"w":59,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":59,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BigSlime.png": +{ + "frame": {"x":1950,"y":859,"w":57,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":11,"w":57,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Alchemist.png": +{ + "frame": {"x":106,"y":1010,"w":49,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":49,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Alkahestor.png": +{ + "frame": {"x":958,"y":1355,"w":53,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":0,"w":53,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/AllyDoll.png": +{ + "frame": {"x":789,"y":1151,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Bandit.png": +{ + "frame": {"x":963,"y":961,"w":41,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":7,"w":41,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/BanditChief.png": +{ + "frame": {"x":1049,"y":962,"w":36,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":7,"w":36,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/BanditGrappler.png": +{ + "frame": {"x":622,"y":957,"w":51,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":7,"w":51,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/BanditPet.png": +{ + "frame": {"x":1162,"y":964,"w":34,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":34,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/BanditQuest.png": +{ + "frame": {"x":1049,"y":962,"w":36,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":7,"w":36,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Cleric.png": +{ + "frame": {"x":1873,"y":1231,"w":56,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":2,"w":56,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Conjurer.png": +{ + "frame": {"x":565,"y":1344,"w":55,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":0,"w":55,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/DragonIce.png": +{ + "frame": {"x":1986,"y":1178,"w":60,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":3,"w":60,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/DragonLeader.png": +{ + "frame": {"x":737,"y":1214,"w":50,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/DragonPoison.png": +{ + "frame": {"x":1156,"y":1222,"w":57,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":3,"w":57,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/DragonShadow.png": +{ + "frame": {"x":906,"y":1219,"w":62,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":3,"w":62,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/DragonShield.png": +{ + "frame": {"x":1874,"y":1165,"w":55,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":3,"w":55,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Dressmaker.png": +{ + "frame": {"x":289,"y":1013,"w":47,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":47,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Dryad.png": +{ + "frame": {"x":1823,"y":1229,"w":48,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":3,"w":48,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/ElementalAir.png": +{ + "frame": {"x":201,"y":1271,"w":62,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":62,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/ElementalEarth.png": +{ + "frame": {"x":1268,"y":964,"w":67,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":7,"w":67,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/ElementalIce.png": +{ + "frame": {"x":1818,"y":971,"w":56,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":7,"w":56,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/ElementalLatex.png": +{ + "frame": {"x":1,"y":1268,"w":65,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":65,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/ElementalLeather.png": +{ + "frame": {"x":1697,"y":1097,"w":56,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":5,"w":56,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/ElfRanger.png": +{ + "frame": {"x":1468,"y":967,"w":39,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":7,"w":39,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/EncasedDoll.png": +{ + "frame": {"x":828,"y":1151,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Fungal.png": +{ + "frame": {"x":1822,"y":1098,"w":50,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":7,"w":50,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/GuardHeavy.png": +{ + "frame": {"x":1441,"y":1159,"w":53,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":53,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/JungleDryad.png": +{ + "frame": {"x":689,"y":1280,"w":48,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":3,"w":48,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Librarian.png": +{ + "frame": {"x":1573,"y":968,"w":61,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":8,"w":61,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Maidforce.png": +{ + "frame": {"x":336,"y":1079,"w":44,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":5,"w":44,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/MaidforceStalker.png": +{ + "frame": {"x":1995,"y":1049,"w":38,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":38,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Miner.png": +{ + "frame": {"x":627,"y":1082,"w":37,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":5,"w":37,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Mummy.png": +{ + "frame": {"x":954,"y":1023,"w":39,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":39,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Nawashi.png": +{ + "frame": {"x":1121,"y":903,"w":42,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":7,"w":42,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Necromancer.png": +{ + "frame": {"x":304,"y":951,"w":37,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":7,"w":37,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Ninja.png": +{ + "frame": {"x":244,"y":1013,"w":43,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":6,"w":43,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/NinjaStalker.png": +{ + "frame": {"x":1975,"y":982,"w":36,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":6,"w":36,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Skeleton.png": +{ + "frame": {"x":801,"y":837,"w":31,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":8,"w":31,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/TalismanZombie.png": +{ + "frame": {"x":576,"y":1277,"w":55,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":2,"w":55,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/WitchChain.png": +{ + "frame": {"x":131,"y":1338,"w":63,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":0,"w":63,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/WitchShock.png": +{ + "frame": {"x":447,"y":1343,"w":57,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":57,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BlacksmithQuest.png": +{ + "frame": {"x":1564,"y":1226,"w":64,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":5,"w":64,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Book.png": +{ + "frame": {"x":392,"y":893,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookArcane.png": +{ + "frame": {"x":438,"y":894,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookBelt.png": +{ + "frame": {"x":484,"y":894,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookBondage.png": +{ + "frame": {"x":112,"y":887,"w":50,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":6,"w":50,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookCelestial.png": +{ + "frame": {"x":530,"y":895,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookChain.png": +{ + "frame": {"x":576,"y":895,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookElectric.png": +{ + "frame": {"x":622,"y":896,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookForbidden.png": +{ + "frame": {"x":668,"y":896,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookIce.png": +{ + "frame": {"x":714,"y":896,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookNature.png": +{ + "frame": {"x":801,"y":898,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookRope.png": +{ + "frame": {"x":847,"y":898,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookSlime.png": +{ + "frame": {"x":893,"y":900,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BookTickle.png": +{ + "frame": {"x":939,"y":900,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BotMissile.png": +{ + "frame": {"x":1763,"y":80,"w":54,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":17,"w":54,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Bramble.png": +{ + "frame": {"x":1684,"y":508,"w":55,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":6,"w":55,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ChainBeing.png": +{ + "frame": {"x":1332,"y":1224,"w":54,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":5,"w":54,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ChainWall.png": +{ + "frame": {"x":158,"y":827,"w":61,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":6,"w":61,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ChaoticCrystalActive.png": +{ + "frame": {"x":945,"y":1153,"w":69,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":5,"w":69,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Cleric.png": +{ + "frame": {"x":1873,"y":1231,"w":56,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":2,"w":56,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ClericHigh.png": +{ + "frame": {"x":517,"y":1277,"w":57,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":2,"w":57,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Conjurer.png": +{ + "frame": {"x":565,"y":1344,"w":55,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":0,"w":55,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ConjurerTickler.png": +{ + "frame": {"x":565,"y":1344,"w":55,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":0,"w":55,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CuffedGirl2.png": +{ + "frame": {"x":498,"y":1145,"w":63,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":7,"w":63,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Hilda.png": +{ + "frame": {"x":296,"y":1076,"w":38,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":6,"w":38,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Parov.png": +{ + "frame": {"x":1406,"y":123,"w":54,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":12,"w":54,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSprite/Viola.png": +{ + "frame": {"x":622,"y":1344,"w":55,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":2,"w":55,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Hilda.png": +{ + "frame": {"x":1160,"y":558,"w":28,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":6,"w":28,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Myrtrice3.png": +{ + "frame": {"x":1986,"y":1113,"w":50,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":5,"w":50,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Nara.png": +{ + "frame": {"x":552,"y":553,"w":33,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":11,"w":33,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CyborgEnforcer.png": +{ + "frame": {"x":693,"y":1146,"w":44,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":7,"w":44,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Decoy.png": +{ + "frame": {"x":1521,"y":1293,"w":60,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":4,"w":60,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Demon.png": +{ + "frame": {"x":324,"y":1342,"w":60,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":3,"w":60,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DollmakerBoss2.png": +{ + "frame": {"x":1016,"y":1155,"w":69,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":69,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DollmakerBoss3.png": +{ + "frame": {"x":1095,"y":1221,"w":59,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":1,"w":59,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DollmakerMechanic.png": +{ + "frame": {"x":1823,"y":1163,"w":49,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":49,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DollmakerTarget.png": +{ + "frame": {"x":828,"y":1151,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DollTransport.png": +{ + "frame": {"x":318,"y":602,"w":55,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":8,"w":55,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Dragon.png": +{ + "frame": {"x":854,"y":1216,"w":50,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonFlower.png": +{ + "frame": {"x":1797,"y":508,"w":54,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":10,"w":54,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonGirlIce.png": +{ + "frame": {"x":1635,"y":1032,"w":62,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":5,"w":62,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonGirlShadow.png": +{ + "frame": {"x":583,"y":1082,"w":42,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":5,"w":42,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonIce.png": +{ + "frame": {"x":1986,"y":1178,"w":60,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":3,"w":60,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonLeader.png": +{ + "frame": {"x":737,"y":1214,"w":50,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonLeaderDuelist.png": +{ + "frame": {"x":737,"y":1214,"w":50,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonPoison.png": +{ + "frame": {"x":1156,"y":1222,"w":57,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":3,"w":57,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonShadow.png": +{ + "frame": {"x":906,"y":1219,"w":62,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":3,"w":62,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DragonShield.png": +{ + "frame": {"x":1874,"y":1165,"w":55,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":3,"w":55,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Dressmaker.png": +{ + "frame": {"x":289,"y":1013,"w":47,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":47,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DressmakerQuest.png": +{ + "frame": {"x":289,"y":1013,"w":47,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":47,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Drone.png": +{ + "frame": {"x":650,"y":1,"w":33,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":8,"w":33,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DroneGuardian.png": +{ + "frame": {"x":1451,"y":457,"w":33,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":8,"w":33,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DroneNode.png": +{ + "frame": {"x":1209,"y":903,"w":41,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":6,"w":41,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Dryad.png": +{ + "frame": {"x":1823,"y":1229,"w":48,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":3,"w":48,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EarthenMonolith.png": +{ + "frame": {"x":1334,"y":903,"w":37,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":8,"w":37,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ElementalAir.png": +{ + "frame": {"x":201,"y":1271,"w":62,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":62,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ElementalEarth.png": +{ + "frame": {"x":1268,"y":964,"w":67,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":7,"w":67,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ElementalIce.png": +{ + "frame": {"x":1818,"y":971,"w":56,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":7,"w":56,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ElementalLatex.png": +{ + "frame": {"x":68,"y":1268,"w":65,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":65,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ElementalLeather.png": +{ + "frame": {"x":1697,"y":1097,"w":56,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":5,"w":56,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ElementalRubber.png": +{ + "frame": {"x":1371,"y":1158,"w":68,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":68,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ElfRanger.png": +{ + "frame": {"x":1468,"y":967,"w":39,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":7,"w":39,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EncasedDoll.png": +{ + "frame": {"x":828,"y":1151,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EncasedDollMetal.png": +{ + "frame": {"x":1,"y":1072,"w":47,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":47,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EncasedFactoryDollMetal.png": +{ + "frame": {"x":1467,"y":1030,"w":35,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":35,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EnforcerBot.png": +{ + "frame": {"x":328,"y":549,"w":48,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":8,"w":48,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EnforcerBotGuardian.png": +{ + "frame": {"x":1566,"y":508,"w":57,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":8,"w":57,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ExplosiveBarrel.png": +{ + "frame": {"x":1551,"y":728,"w":39,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":9,"w":39,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/FastSlime.png": +{ + "frame": {"x":787,"y":554,"w":58,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":58,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Feathers.png": +{ + "frame": {"x":1247,"y":559,"w":55,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":6,"w":55,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/FireElemental.png": +{ + "frame": {"x":31,"y":767,"w":59,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":5,"w":59,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Frog.png": +{ + "frame": {"x":1462,"y":123,"w":54,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":12,"w":54,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Fungal.png": +{ + "frame": {"x":117,"y":1137,"w":50,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":7,"w":50,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Fuuka2.png": +{ + "frame": {"x":1755,"y":1229,"w":66,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":66,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/GagGeist.png": +{ + "frame": {"x":1335,"y":1028,"w":64,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":6,"w":64,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/GasBarrel.png": +{ + "frame": {"x":1252,"y":903,"w":39,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":9,"w":39,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Ghost.png": +{ + "frame": {"x":1165,"y":903,"w":42,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":6,"w":42,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/GhostAdventurer.png": +{ + "frame": {"x":1619,"y":845,"w":28,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":8,"w":28,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/GhostDark.png": +{ + "frame": {"x":164,"y":887,"w":47,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":6,"w":47,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/GiantMushroom.png": +{ + "frame": {"x":987,"y":781,"w":48,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":8,"w":48,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/GreaterSkeleton.png": +{ + "frame": {"x":906,"y":1151,"w":37,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":2,"w":37,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/GuardHeavy.png": +{ + "frame": {"x":1441,"y":1159,"w":53,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":53,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/HolyOrb.png": +{ + "frame": {"x":1214,"y":669,"w":55,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":5,"w":55,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/HugHorror.png": +{ + "frame": {"x":1401,"y":1029,"w":64,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":6,"w":64,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/JungleDryad.png": +{ + "frame": {"x":689,"y":1280,"w":48,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":3,"w":48,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/KeeperEarth.png": +{ + "frame": {"x":1645,"y":1295,"w":58,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":2,"w":58,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/LabAssistant.png": +{ + "frame": {"x":880,"y":1023,"w":35,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":7,"w":35,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/LatexCubeMetal.png": +{ + "frame": {"x":1687,"y":39,"w":39,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":13,"w":39,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/LatexCubeSmall.png": +{ + "frame": {"x":1728,"y":39,"w":39,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":13,"w":39,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/LatexSprayer.png": +{ + "frame": {"x":1921,"y":673,"w":60,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":5,"w":60,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/LatexStorageTank.png": +{ + "frame": {"x":1293,"y":903,"w":39,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":9,"w":39,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/LearnedRope.png": +{ + "frame": {"x":327,"y":73,"w":38,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":12,"w":38,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Librarian.png": +{ + "frame": {"x":1573,"y":968,"w":61,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":8,"w":61,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Lock.png": +{ + "frame": {"x":1250,"y":843,"w":52,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":5,"w":52,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/LockMaster.png": +{ + "frame": {"x":890,"y":454,"w":53,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":10,"w":53,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Magician_Sparkle.png": +{ + "frame": {"x":1,"y":1136,"w":47,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":5,"w":47,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Maidforce.png": +{ + "frame": {"x":336,"y":1079,"w":44,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":5,"w":44,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidforceMini.png": +{ + "frame": {"x":1876,"y":973,"w":54,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":6,"w":54,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidforceStalker.png": +{ + "frame": {"x":1995,"y":1049,"w":38,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":38,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidforceStalkerImage.png": +{ + "frame": {"x":1995,"y":1049,"w":38,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":38,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidKnightLight_Aim.png": +{ + "frame": {"x":791,"y":1350,"w":53,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":53,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MaidKnightLight_Equip.png": +{ + "frame": {"x":386,"y":1342,"w":59,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":59,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Miner.png": +{ + "frame": {"x":627,"y":1082,"w":37,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":5,"w":37,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MonsterRope.png": +{ + "frame": {"x":433,"y":450,"w":44,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":12,"w":44,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Mummy.png": +{ + "frame": {"x":954,"y":1023,"w":39,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":39,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MummyCursed.png": +{ + "frame": {"x":765,"y":1021,"w":36,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":0,"w":36,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MummyElevator.png": +{ + "frame": {"x":765,"y":1021,"w":36,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":0,"w":36,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Mushy.png": +{ + "frame": {"x":1507,"y":786,"w":48,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":8,"w":48,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MushyHappy.png": +{ + "frame": {"x":1808,"y":729,"w":66,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":8,"w":66,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/MushySick.png": +{ + "frame": {"x":1557,"y":786,"w":48,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":8,"w":48,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/NatureSpirit.png": +{ + "frame": {"x":1303,"y":784,"w":51,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":5,"w":51,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Nawashi.png": +{ + "frame": {"x":1121,"y":903,"w":42,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":7,"w":42,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Necromancer.png": +{ + "frame": {"x":304,"y":951,"w":37,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":7,"w":37,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Ninja.png": +{ + "frame": {"x":244,"y":1013,"w":43,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":6,"w":43,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/NinjaStalker.png": +{ + "frame": {"x":1975,"y":982,"w":36,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":6,"w":36,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Observer.png": +{ + "frame": {"x":1232,"y":122,"w":58,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":58,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/OldDrone.png": +{ + "frame": {"x":228,"y":159,"w":57,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":11,"w":57,"h":45}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/OldDroneNode.png": +{ + "frame": {"x":1876,"y":1036,"w":53,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":5,"w":53,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/OldTapeDrone.png": +{ + "frame": {"x":1035,"y":841,"w":57,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":57,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/OneBar.png": +{ + "frame": {"x":1657,"y":787,"w":46,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":3,"w":46,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/OrbGuardian.png": +{ + "frame": {"x":1759,"y":971,"w":57,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":10,"w":57,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/OrbOfLight.png": +{ + "frame": {"x":1157,"y":38,"w":55,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":5,"w":55,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Pet.png": +{ + "frame": {"x":1573,"y":671,"w":37,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":5,"w":37,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/PinkAlchemist.png": +{ + "frame": {"x":157,"y":1010,"w":49,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":49,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/PinkAlkahestor.png": +{ + "frame": {"x":1013,"y":1355,"w":53,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":0,"w":53,"h":68}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/PinkLabAssistant.png": +{ + "frame": {"x":917,"y":1023,"w":35,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":7,"w":35,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Poltergeist.png": +{ + "frame": {"x":1504,"y":1031,"w":64,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":6,"w":64,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/RedSlime.png": +{ + "frame": {"x":784,"y":36,"w":38,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":18,"w":38,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Ribbons.png": +{ + "frame": {"x":1932,"y":563,"w":51,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":51,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/RopeKraken.png": +{ + "frame": {"x":341,"y":1209,"w":65,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":4,"w":65,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/RopeMinion.png": +{ + "frame": {"x":1031,"y":901,"w":43,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":43,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/RopeSnake.png": +{ + "frame": {"x":1909,"y":508,"w":29,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":9,"w":29,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/RubberBarrel.png": +{ + "frame": {"x":1592,"y":728,"w":39,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":9,"w":39,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/RubberSilo.png": +{ + "frame": {"x":1518,"y":123,"w":54,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":17,"w":54,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/RubberTurret.png": +{ + "frame": {"x":166,"y":446,"w":54,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":14,"w":54,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Scarves.png": +{ + "frame": {"x":57,"y":709,"w":46,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":7,"w":46,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ShadowGhast.png": +{ + "frame": {"x":563,"y":1146,"w":63,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":5,"w":63,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ShadowHand.png": +{ + "frame": {"x":877,"y":556,"w":58,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":13,"w":58,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ShadyQuest.png": +{ + "frame": {"x":1975,"y":982,"w":36,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":6,"w":36,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ShopkeeperRescue.png": +{ + "frame": {"x":1125,"y":964,"w":35,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":9,"w":35,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ShopkeeperStart.png": +{ + "frame": {"x":1137,"y":1026,"w":59,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":9,"w":59,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Skeleton.png": +{ + "frame": {"x":801,"y":837,"w":31,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":8,"w":31,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SkeletonArcher.png": +{ + "frame": {"x":894,"y":839,"w":32,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":8,"w":32,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Slime.png": +{ + "frame": {"x":31,"y":826,"w":59,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":7,"w":59,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SlimeKraken.png": +{ + "frame": {"x":408,"y":1209,"w":65,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":6,"w":65,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SlimeMold.png": +{ + "frame": {"x":168,"y":159,"w":58,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":13,"w":58,"h":45}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SmallSlime.png": +{ + "frame": {"x":1292,"y":123,"w":55,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":16,"w":55,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SoulCrystal.png": +{ + "frame": {"x":532,"y":606,"w":53,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":8,"w":53,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SoulCrystalActive.png": +{ + "frame": {"x":1087,"y":1155,"w":69,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":2,"w":69,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Statue.png": +{ + "frame": {"x":1931,"y":617,"w":50,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":50,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/StatueDart.png": +{ + "frame": {"x":1931,"y":617,"w":50,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":7,"w":50,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/StatueGag.png": +{ + "frame": {"x":694,"y":663,"w":50,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":50,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SummonedCaptureDrone.png": +{ + "frame": {"x":1988,"y":468,"w":59,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":9,"w":59,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/SummonedSkeleton.png": +{ + "frame": {"x":801,"y":837,"w":31,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":8,"w":31,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/TalismanZombie.png": +{ + "frame": {"x":576,"y":1277,"w":55,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":2,"w":55,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/TapeDrone.png": +{ + "frame": {"x":1858,"y":788,"w":28,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":28,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/TheWarden1.png": +{ + "frame": {"x":947,"y":1087,"w":38,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":4,"w":38,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/TickleHand.png": +{ + "frame": {"x":937,"y":557,"w":58,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":13,"w":58,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/TickleHandSlave.png": +{ + "frame": {"x":937,"y":557,"w":58,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":13,"w":58,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/TickleTerror.png": +{ + "frame": {"x":1156,"y":613,"w":67,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":7,"w":67,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/TimeGhost.png": +{ + "frame": {"x":1449,"y":905,"w":34,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":8,"w":34,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Toad.png": +{ + "frame": {"x":1304,"y":559,"w":55,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":4,"w":55,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/UnforseenRope.png": +{ + "frame": {"x":514,"y":75,"w":65,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":13,"w":65,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/VinePlant.png": +{ + "frame": {"x":34,"y":494,"w":55,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":14,"w":55,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/VineSpitter.png": +{ + "frame": {"x":1555,"y":845,"w":62,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":6,"w":62,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WardenArcher.png": +{ + "frame": {"x":578,"y":956,"w":42,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":7,"w":42,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WardenMage.png": +{ + "frame": {"x":1,"y":947,"w":55,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":55,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Water.png": +{ + "frame": {"x":402,"y":117,"w":61,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":16,"w":61,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WaterMote.png": +{ + "frame": {"x":984,"y":723,"w":51,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":14,"w":51,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchApprentice.png": +{ + "frame": {"x":846,"y":1353,"w":53,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":0,"w":53,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchChain.png": +{ + "frame": {"x":196,"y":1338,"w":63,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":0,"w":63,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchFlame.png": +{ + "frame": {"x":679,"y":1347,"w":54,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":0,"w":54,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WitchShock.png": +{ + "frame": {"x":506,"y":1344,"w":57,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":57,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WolfApprentice.png": +{ + "frame": {"x":1274,"y":1223,"w":56,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":56,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WolfExecutive.png": +{ + "frame": {"x":2013,"y":983,"w":34,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WolfgirlPet.png": +{ + "frame": {"x":208,"y":1010,"w":34,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WolfGuard.png": +{ + "frame": {"x":742,"y":1084,"w":69,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":7,"w":69,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WolfServer.png": +{ + "frame": {"x":1823,"y":1034,"w":51,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":5,"w":51,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WolfTapeDrones.png": +{ + "frame": {"x":585,"y":452,"w":51,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":12,"w":51,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Adventurer_Brat.png": +{ + "frame": {"x":475,"y":553,"w":39,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":9,"w":39,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Adventurer_Dom.png": +{ + "frame": {"x":822,"y":664,"w":35,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":9,"w":35,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Adventurer_Sub.png": +{ + "frame": {"x":69,"y":599,"w":34,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":7,"w":34,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Adventurer_Switch.png": +{ + "frame": {"x":1418,"y":559,"w":41,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":7,"w":41,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Alchemist.png": +{ + "frame": {"x":997,"y":666,"w":41,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":7,"w":41,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/AlchemistPet.png": +{ + "frame": {"x":1373,"y":726,"w":43,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":4,"w":43,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Alkahestor.png": +{ + "frame": {"x":1518,"y":614,"w":41,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":7,"w":41,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/AllyDoll.png": +{ + "frame": {"x":867,"y":1151,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Apprentice.png": +{ + "frame": {"x":1633,"y":728,"w":36,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":10,"w":36,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ApprenticeSlime.png": +{ + "frame": {"x":513,"y":118,"w":62,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":27,"w":62,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Bandit.png": +{ + "frame": {"x":1003,"y":611,"w":38,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":38,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/BanditChief.png": +{ + "frame": {"x":698,"y":502,"w":55,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":19,"w":55,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/BanditGrappler.png": +{ + "frame": {"x":1090,"y":724,"w":48,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":7,"w":48,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ChainBeing.png": +{ + "frame": {"x":1983,"y":682,"w":62,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":5,"w":62,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Cleric.png": +{ + "frame": {"x":685,"y":1019,"w":38,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":2,"w":38,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ClericHigh.png": +{ + "frame": {"x":725,"y":1019,"w":38,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":2,"w":38,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ConjurerTickler.png": +{ + "frame": {"x":581,"y":76,"w":65,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":18,"w":65,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/CorruptedAdventurer.png": +{ + "frame": {"x":1373,"y":904,"w":36,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":8,"w":36,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/CuffedGirl.png": +{ + "frame": {"x":1456,"y":1094,"w":38,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":7,"w":38,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/CuffedGirl2.png": +{ + "frame": {"x":1874,"y":1100,"w":55,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":7,"w":55,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/CyborgEnforcer.png": +{ + "frame": {"x":1158,"y":1156,"w":69,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":7,"w":69,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Deputy.png": +{ + "frame": {"x":1121,"y":612,"w":33,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":14,"w":33,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Dragon.png": +{ + "frame": {"x":693,"y":608,"w":47,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":5,"w":47,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/DragonCrystal.png": +{ + "frame": {"x":1890,"y":1307,"w":64,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":64,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/DragonIce.png": +{ + "frame": {"x":338,"y":1016,"w":47,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":5,"w":47,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/DragonLeader.png": +{ + "frame": {"x":1931,"y":1174,"w":53,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":5,"w":53,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/DragonPoison.png": +{ + "frame": {"x":1356,"y":784,"w":49,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":9,"w":49,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/DragonShadow.png": +{ + "frame": {"x":49,"y":445,"w":57,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":25,"w":57,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/DragonShield.png": +{ + "frame": {"x":1270,"y":38,"w":49,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":28,"w":49,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Dryad.png": +{ + "frame": {"x":1488,"y":670,"w":41,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":3,"w":41,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Elemental.png": +{ + "frame": {"x":170,"y":599,"w":56,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":56,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ElementalAir.png": +{ + "frame": {"x":1,"y":708,"w":54,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":54,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ElementalFire.png": +{ + "frame": {"x":31,"y":598,"w":36,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":7,"w":36,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ElementalIce.png": +{ + "frame": {"x":1327,"y":726,"w":44,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":7,"w":44,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ElementalLatex.png": +{ + "frame": {"x":587,"y":554,"w":33,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":17,"w":33,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ElementalRope.png": +{ + "frame": {"x":1140,"y":726,"w":47,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":11,"w":47,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ElementalRubber.png": +{ + "frame": {"x":622,"y":554,"w":33,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":17,"w":33,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ElementalWater.png": +{ + "frame": {"x":1215,"y":1222,"w":57,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":57,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Elf.png": +{ + "frame": {"x":1485,"y":906,"w":34,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":0,"w":34,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/ElfRanger.png": +{ + "frame": {"x":428,"y":36,"w":38,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":27,"w":38,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/EncasedDoll.png": +{ + "frame": {"x":273,"y":654,"w":37,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/EncasedFactoryDollMetal.png": +{ + "frame": {"x":705,"y":1082,"w":35,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":35,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/FactoryDoll.png": +{ + "frame": {"x":828,"y":1151,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Fuuka.png": +{ + "frame": {"x":1708,"y":729,"w":30,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":2,"w":30,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/GlueTechnician.png": +{ + "frame": {"x":1407,"y":785,"w":49,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":7,"w":49,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Guard.png": +{ + "frame": {"x":1,"y":766,"w":28,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":3,"w":28,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/GuardHeavy.png": +{ + "frame": {"x":1304,"y":843,"w":42,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":5,"w":42,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/AlchemistPet.png": +{ + "frame": {"x":990,"y":1,"w":28,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":28,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Angel.png": +{ + "frame": {"x":1123,"y":38,"w":32,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":3,"w":32,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/ConjurerTickler.png": +{ + "frame": {"x":658,"y":36,"w":41,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":1,"w":41,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Dragon.png": +{ + "frame": {"x":384,"y":449,"w":47,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":3,"w":47,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/DragonCrystal.png": +{ + "frame": {"x":626,"y":164,"w":47,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":3,"w":47,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/DragonIce.png": +{ + "frame": {"x":675,"y":164,"w":47,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":4,"w":47,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/DragonLeader.png": +{ + "frame": {"x":792,"y":453,"w":47,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":3,"w":47,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/DragonPoison.png": +{ + "frame": {"x":742,"y":453,"w":48,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":3,"w":48,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/DragonShadow.png": +{ + "frame": {"x":841,"y":453,"w":47,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":3,"w":47,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/DragonShield.png": +{ + "frame": {"x":1377,"y":39,"w":49,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":3,"w":49,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Dressmaker.png": +{ + "frame": {"x":397,"y":35,"w":29,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":8,"w":29,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Dryad.png": +{ + "frame": {"x":964,"y":165,"w":41,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":3,"w":41,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/ElementalAir.png": +{ + "frame": {"x":895,"y":780,"w":33,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":3,"w":33,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/ElementalEarth.png": +{ + "frame": {"x":503,"y":163,"w":30,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":7,"w":30,"h":45}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/ElementalIce.png": +{ + "frame": {"x":964,"y":611,"w":37,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":7,"w":37,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Elf.png": +{ + "frame": {"x":1515,"y":80,"w":34,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":7,"w":34,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/ElfRanger.png": +{ + "frame": {"x":1551,"y":80,"w":36,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":7,"w":36,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/HighWizard.png": +{ + "frame": {"x":429,"y":1,"w":36,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":0,"w":36,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/JungleDryad.png": +{ + "frame": {"x":964,"y":165,"w":41,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":3,"w":41,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/SamuraiZombie.png": +{ + "frame": {"x":89,"y":1,"w":34,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":1,"w":34,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/TalismanZombie.png": +{ + "frame": {"x":1557,"y":1,"w":30,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":2,"w":30,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/WolfExecutive.png": +{ + "frame": {"x":1020,"y":1,"w":28,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":28,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/Wolfgirl.png": +{ + "frame": {"x":823,"y":1,"w":28,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":28,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Head/WolfgirlPet.png": +{ + "frame": {"x":990,"y":1,"w":28,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":28,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Jailer.png": +{ + "frame": {"x":1,"y":825,"w":28,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":3,"w":28,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/LabAssistant.png": +{ + "frame": {"x":231,"y":710,"w":59,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":59,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Maid.png": +{ + "frame": {"x":859,"y":721,"w":34,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":5,"w":34,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/MaidforceMafia.png": +{ + "frame": {"x":1,"y":1009,"w":51,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":3,"w":51,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/MaidforceMini.png": +{ + "frame": {"x":463,"y":955,"w":57,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":6,"w":57,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/MaidforcePara.png": +{ + "frame": {"x":1508,"y":728,"w":41,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":3,"w":41,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/MaidforceStalker.png": +{ + "frame": {"x":859,"y":665,"w":34,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":5,"w":34,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/MeleeCleric.png": +{ + "frame": {"x":2009,"y":859,"w":38,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":2,"w":38,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Miner.png": +{ + "frame": {"x":516,"y":553,"w":34,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":5,"w":34,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Mummy.png": +{ + "frame": {"x":543,"y":1081,"w":38,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":5,"w":38,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/MummyCursed.png": +{ + "frame": {"x":1087,"y":964,"w":36,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":9,"w":36,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Necromancer.png": +{ + "frame": {"x":633,"y":1277,"w":54,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":3,"w":54,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/NinjaStalker.png": +{ + "frame": {"x":1043,"y":612,"w":38,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":6,"w":38,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/SamuraiZombie.png": +{ + "frame": {"x":1348,"y":843,"w":36,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":7,"w":36,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/SlimeEnthusiast.png": +{ + "frame": {"x":292,"y":713,"w":59,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":59,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/TalismanZombie.png": +{ + "frame": {"x":1876,"y":729,"w":30,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":2,"w":30,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/TapedDoll.png": +{ + "frame": {"x":746,"y":663,"w":37,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/TheWarden.png": +{ + "frame": {"x":1140,"y":784,"w":53,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":10,"w":53,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WardenArcher.png": +{ + "frame": {"x":1411,"y":905,"w":36,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":7,"w":36,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WardenFighter.png": +{ + "frame": {"x":439,"y":834,"w":60,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":7,"w":60,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WardenMage.png": +{ + "frame": {"x":919,"y":961,"w":42,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":7,"w":42,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WitchEarth.png": +{ + "frame": {"x":1932,"y":982,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WitchFlame.png": +{ + "frame": {"x":387,"y":1017,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WitchIce.png": +{ + "frame": {"x":430,"y":1017,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WitchRope.png": +{ + "frame": {"x":1932,"y":982,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WitchShock.png": +{ + "frame": {"x":473,"y":1017,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WitchSlime.png": +{ + "frame": {"x":516,"y":1018,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WitchWater.png": +{ + "frame": {"x":559,"y":1018,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WolfExecutive.png": +{ + "frame": {"x":1418,"y":727,"w":43,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":43,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/Wolfgirl.png": +{ + "frame": {"x":834,"y":609,"w":41,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":6,"w":41,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WolfgirlPet.png": +{ + "frame": {"x":1463,"y":727,"w":43,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":4,"w":43,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WolfGuard.png": +{ + "frame": {"x":1891,"y":561,"w":39,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":7,"w":39,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/WolfOperative.png": +{ + "frame": {"x":921,"y":611,"w":41,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":6,"w":41,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FastMove.png": +{ + "frame": {"x":587,"y":607,"w":51,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":1,"w":51,"h":53}, + "sourceSize": {"w":56,"h":56} +}, +"Game/FastMoveOff.png": +{ + "frame": {"x":701,"y":36,"w":41,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":16,"w":41,"h":38}, + "sourceSize": {"w":56,"h":56} +}, +"Game/FloorGeneric/ChargerSpent.png": +{ + "frame": {"x":2014,"y":920,"w":32,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":0,"w":32,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestBlueOpen.png": +{ + "frame": {"x":479,"y":775,"w":55,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestDarkOpen.png": +{ + "frame": {"x":573,"y":776,"w":55,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestGoldOpen.png": +{ + "frame": {"x":630,"y":777,"w":55,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestOpen.png": +{ + "frame": {"x":687,"y":777,"w":55,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestPearlOpen.png": +{ + "frame": {"x":744,"y":777,"w":55,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Chests/Kitty.png": +{ + "frame": {"x":1348,"y":613,"w":55,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":8,"w":55,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Chests/KittyOpen.png": +{ + "frame": {"x":442,"y":1080,"w":55,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":0,"w":55,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Chests/Robot.png": +{ + "frame": {"x":118,"y":73,"w":55,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Chests/RobotOpen.png": +{ + "frame": {"x":105,"y":599,"w":63,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":9,"w":63,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestShadowOpen.png": +{ + "frame": {"x":801,"y":778,"w":55,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestSilver.png": +{ + "frame": {"x":175,"y":73,"w":55,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/ChestSilverOpen.png": +{ + "frame": {"x":930,"y":781,"w":55,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/CrackRight.png": +{ + "frame": {"x":396,"y":498,"w":28,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":44,"y":14,"w":28,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/DollStand.png": +{ + "frame": {"x":125,"y":1,"w":34,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":20,"w":34,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Dummy2.png": +{ + "frame": {"x":895,"y":666,"w":34,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":18,"w":34,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Fireflies.png": +{ + "frame": {"x":138,"y":115,"w":45,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":16,"w":45,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Ghost.png": +{ + "frame": {"x":1619,"y":845,"w":28,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":8,"w":28,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/GhostImportant.png": +{ + "frame": {"x":828,"y":959,"w":44,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":44,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Lantern.png": +{ + "frame": {"x":1898,"y":458,"w":28,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":19,"w":28,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Leyline.png": +{ + "frame": {"x":945,"y":455,"w":53,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":6,"w":53,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/LightRaysDoll.png": +{ + "frame": {"x":970,"y":1221,"w":62,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":1,"w":62,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Magicflies.png": +{ + "frame": {"x":185,"y":115,"w":45,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":16,"w":45,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Signal/Button.png": +{ + "frame": {"x":2015,"y":219,"w":28,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":19,"w":28,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/SpiralStairsUp.png": +{ + "frame": {"x":236,"y":1140,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Tablet.png": +{ + "frame": {"x":1195,"y":784,"w":53,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":7,"w":53,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/TabletCursed.png": +{ + "frame": {"x":1853,"y":508,"w":54,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":13,"w":54,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/TabletDetermination.png": +{ + "frame": {"x":1673,"y":561,"w":53,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":12,"w":53,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/TabletDetermination_2.png": +{ + "frame": {"x":1439,"y":1225,"w":53,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":0,"w":53,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/TabletHeart.png": +{ + "frame": {"x":1728,"y":561,"w":53,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":12,"w":53,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/TabletSpent.png": +{ + "frame": {"x":32,"y":545,"w":53,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":13,"w":53,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/TiedCourier.png": +{ + "frame": {"x":803,"y":1021,"w":37,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":7,"w":37,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Torch.png": +{ + "frame": {"x":859,"y":502,"w":28,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":19,"w":28,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/TorchOrb.png": +{ + "frame": {"x":547,"y":36,"w":32,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":30,"w":32,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Viewscreen.png": +{ + "frame": {"x":1428,"y":39,"w":46,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":29,"w":46,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Floors/Floor_cst/Giant Bubble.png": +{ + "frame": {"x":941,"y":505,"w":50,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":1,"w":50,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/HideStruggle.png": +{ + "frame": {"x":467,"y":1,"w":36,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":5,"w":36,"h":33}, + "sourceSize": {"w":56,"h":56} +}, +"Game/InventoryAction/Attach.png": +{ + "frame": {"x":265,"y":1274,"w":62,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":3,"w":62,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Bondage.png": +{ + "frame": {"x":602,"y":1019,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":4,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Cookie.png": +{ + "frame": {"x":229,"y":1,"w":32,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":20,"w":32,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/CurseInfo.png": +{ + "frame": {"x":1281,"y":507,"w":35,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":11,"w":35,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/CurseStruggle.png": +{ + "frame": {"x":1140,"y":843,"w":54,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":7,"w":54,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/CurseUnlock.png": +{ + "frame": {"x":785,"y":663,"w":35,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":7,"w":35,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Equip.png": +{ + "frame": {"x":337,"y":207,"w":45,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":13,"w":45,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Lock.png": +{ + "frame": {"x":105,"y":710,"w":62,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":8,"w":62,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Macaron.png": +{ + "frame": {"x":263,"y":1,"w":32,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":20,"w":32,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Offhand.png": +{ + "frame": {"x":1382,"y":669,"w":51,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":8,"w":51,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Pick.png": +{ + "frame": {"x":853,"y":120,"w":45,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":13,"w":45,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Quickslot.png": +{ + "frame": {"x":297,"y":1,"w":32,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":20,"w":32,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Recolor.png": +{ + "frame": {"x":1564,"y":1160,"w":64,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":3,"w":64,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Remove.png": +{ + "frame": {"x":337,"y":207,"w":45,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":13,"w":45,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Struggle.png": +{ + "frame": {"x":1140,"y":843,"w":54,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":7,"w":54,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Unequip.png": +{ + "frame": {"x":337,"y":255,"w":45,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":13,"w":45,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/InventoryAction/Use.png": +{ + "frame": {"x":638,"y":502,"w":58,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":15,"w":58,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/AncientPowerSource.png": +{ + "frame": {"x":1607,"y":786,"w":48,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":7,"w":48,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/ArcaneCrystal.png": +{ + "frame": {"x":1957,"y":799,"w":66,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":6,"w":66,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/ArcaneTome.png": +{ + "frame": {"x":392,"y":893,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/BagOfGoodies.png": +{ + "frame": {"x":639,"y":119,"w":53,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":16,"w":53,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Bola.png": +{ + "frame": {"x":1102,"y":456,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":48,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Bomb.png": +{ + "frame": {"x":57,"y":653,"w":46,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":13,"w":46,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/BondageTome.png": +{ + "frame": {"x":54,"y":1010,"w":50,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":5,"w":50,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Bow.png": +{ + "frame": {"x":1000,"y":455,"w":49,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":12,"w":49,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/BowRecurve.png": +{ + "frame": {"x":375,"y":602,"w":49,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":9,"w":49,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/C4.png": +{ + "frame": {"x":426,"y":552,"w":47,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":14,"w":47,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Cookie.png": +{ + "frame": {"x":229,"y":1,"w":32,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":20,"w":32,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/CookieJailer.png": +{ + "frame": {"x":882,"y":1,"w":34,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":19,"w":34,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Crop.png": +{ + "frame": {"x":638,"y":453,"w":51,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":12,"w":51,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Crossbow.png": +{ + "frame": {"x":648,"y":76,"w":61,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":15,"w":61,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/DiscPick.png": +{ + "frame": {"x":1084,"y":78,"w":42,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":16,"w":42,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/DivineTear.png": +{ + "frame": {"x":1251,"y":457,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":48,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/DollID.png": +{ + "frame": {"x":478,"y":501,"w":62,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":13,"w":62,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Donut.png": +{ + "frame": {"x":331,"y":1,"w":32,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":20,"w":32,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Dreamcatcher.png": +{ + "frame": {"x":1093,"y":782,"w":45,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":9,"w":45,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Duster.png": +{ + "frame": {"x":384,"y":162,"w":42,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":10,"w":42,"h":45}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Dynamite.png": +{ + "frame": {"x":606,"y":501,"w":30,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":10,"w":30,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/EarthRune.png": +{ + "frame": {"x":1146,"y":506,"w":46,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":46,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/EscortDrone.png": +{ + "frame": {"x":250,"y":495,"w":39,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":3,"w":39,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Flail.png": +{ + "frame": {"x":1318,"y":507,"w":34,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":12,"w":34,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Flashbang.png": +{ + "frame": {"x":1301,"y":457,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":13,"w":48,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/FlashBomb.png": +{ + "frame": {"x":900,"y":120,"w":40,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":13,"w":40,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/FourSeasons.png": +{ + "frame": {"x":895,"y":722,"w":33,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":9,"w":33,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/GoldenTicket.png": +{ + "frame": {"x":993,"y":505,"w":50,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":11,"w":50,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemFeet.png": +{ + "frame": {"x":397,"y":1,"w":30,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":39,"y":38,"w":30,"h":32}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemHands.png": +{ + "frame": {"x":1258,"y":1,"w":33,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":38,"y":37,"w":33,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Group/ItemTorso.png": +{ + "frame": {"x":1050,"y":1,"w":28,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":40,"y":37,"w":28,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Heart.png": +{ + "frame": {"x":1649,"y":846,"w":53,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":5,"w":53,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/IceRune.png": +{ + "frame": {"x":1194,"y":507,"w":46,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":12,"w":46,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/KeyCard.png": +{ + "frame": {"x":542,"y":501,"w":62,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":13,"w":62,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/LeylineMap.png": +{ + "frame": {"x":329,"y":498,"w":30,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":16,"w":30,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Longbow.png": +{ + "frame": {"x":1388,"y":1224,"w":49,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":4,"w":49,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/MagicFlail.png": +{ + "frame": {"x":1094,"y":841,"w":44,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":4,"w":44,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/MagicRope.png": +{ + "frame": {"x":536,"y":775,"w":35,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":7,"w":35,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/ManaOrb.png": +{ + "frame": {"x":285,"y":73,"w":40,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":16,"w":40,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/MessengerOfLove.png": +{ + "frame": {"x":607,"y":1211,"w":63,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":3,"w":63,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/MoiraiScissors.png": +{ + "frame": {"x":1361,"y":559,"w":55,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":9,"w":55,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Pick.png": +{ + "frame": {"x":1039,"y":78,"w":43,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":17,"w":43,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Pickaxe.png": +{ + "frame": {"x":694,"y":119,"w":52,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":15,"w":52,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/PotionFrigid.png": +{ + "frame": {"x":1765,"y":1296,"w":54,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":4,"w":54,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/PotionMana.png": +{ + "frame": {"x":1931,"y":1240,"w":52,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":4,"w":52,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint.png": +{ + "frame": {"x":853,"y":1,"w":27,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":36,"w":27,"h":34}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Ancient.png": +{ + "frame": {"x":984,"y":37,"w":33,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":17,"w":33,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Armbinders.png": +{ + "frame": {"x":442,"y":75,"w":35,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Boxbinders.png": +{ + "frame": {"x":1769,"y":39,"w":38,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":17,"w":38,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Chastity.png": +{ + "frame": {"x":251,"y":890,"w":45,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/ChastityBelts.png": +{ + "frame": {"x":251,"y":890,"w":45,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Cuffs.png": +{ + "frame": {"x":251,"y":830,"w":61,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":5,"w":61,"h":58}, + "sourceSize": {"w":73,"h":72} +}, +"Game/Items/Restraint/Cyber.png": +{ + "frame": {"x":1823,"y":671,"w":64,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":18,"w":64,"h":56}, + "sourceSize": {"w":94,"h":94} +}, +"Game/Items/Restraint/Glue.png": +{ + "frame": {"x":1,"y":652,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/HolyRope.png": +{ + "frame": {"x":858,"y":779,"w":35,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":7,"w":35,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Latex.png": +{ + "frame": {"x":1019,"y":37,"w":33,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":17,"w":33,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/LeatherCuffs.png": +{ + "frame": {"x":273,"y":1208,"w":66,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":66,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Legbinders.png": +{ + "frame": {"x":1685,"y":671,"w":69,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":9,"w":69,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Metal.png": +{ + "frame": {"x":251,"y":830,"w":61,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":5,"w":61,"h":58}, + "sourceSize": {"w":73,"h":72} +}, +"Game/Items/Restraint/MithrilRope.png": +{ + "frame": {"x":1671,"y":729,"w":35,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":6,"w":35,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Modules.png": +{ + "frame": {"x":754,"y":719,"w":52,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":9,"w":52,"h":56}, + "sourceSize": {"w":94,"h":94} +}, +"Game/Items/Restraint/NippleClamps2.png": +{ + "frame": {"x":449,"y":775,"w":28,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":44,"y":31,"w":28,"h":57}, + "sourceSize": {"w":120,"h":120} +}, +"Game/Items/Restraint/NippleClamps3.png": +{ + "frame": {"x":581,"y":36,"w":29,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":45,"y":41,"w":29,"h":37}, + "sourceSize": {"w":120,"h":120} +}, +"Game/Items/Restraint/Obsidian.png": +{ + "frame": {"x":1054,"y":38,"w":33,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":17,"w":33,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Plugs.png": +{ + "frame": {"x":1928,"y":458,"w":28,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":11,"w":28,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Ribbons.png": +{ + "frame": {"x":742,"y":608,"w":44,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":11,"w":44,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/RopeSnake.png": +{ + "frame": {"x":1,"y":543,"w":29,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":10,"w":29,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Rubber.png": +{ + "frame": {"x":1019,"y":37,"w":33,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":17,"w":33,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/SteelPlugs.png": +{ + "frame": {"x":1958,"y":460,"w":28,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":11,"w":28,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/StrongMagicRopes.png": +{ + "frame": {"x":536,"y":775,"w":35,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":7,"w":35,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/SupremeBelt.png": +{ + "frame": {"x":298,"y":890,"w":45,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/Ties.png": +{ + "frame": {"x":1,"y":543,"w":29,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":10,"w":29,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Restraint/WeakMagicRopes.png": +{ + "frame": {"x":1752,"y":788,"w":35,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":7,"w":35,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Rock.png": +{ + "frame": {"x":80,"y":73,"w":36,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":15,"w":36,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Rope.png": +{ + "frame": {"x":200,"y":495,"w":48,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":13,"w":48,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/RopeRune.png": +{ + "frame": {"x":337,"y":160,"w":45,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":16,"w":45,"h":45}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/SackOfSacks.png": +{ + "frame": {"x":748,"y":119,"w":53,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":16,"w":53,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/ScrollLegs.png": +{ + "frame": {"x":528,"y":259,"w":45,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":11,"w":45,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/ScrollPurity.png": +{ + "frame": {"x":337,"y":303,"w":45,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":11,"w":45,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Scrolls.png": +{ + "frame": {"x":456,"y":1276,"w":59,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":59,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/ScrollVerbal.png": +{ + "frame": {"x":960,"y":309,"w":45,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":11,"w":45,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Shield.png": +{ + "frame": {"x":824,"y":37,"w":38,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":17,"w":38,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/ShieldMagic.png": +{ + "frame": {"x":864,"y":37,"w":38,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":17,"w":38,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/ShieldReinforced.png": +{ + "frame": {"x":904,"y":37,"w":38,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":17,"w":38,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/ShieldTower.png": +{ + "frame": {"x":1010,"y":121,"w":32,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":10,"w":32,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffBind.png": +{ + "frame": {"x":1531,"y":671,"w":40,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":8,"w":40,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffDoll.png": +{ + "frame": {"x":666,"y":1082,"w":37,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":1,"w":37,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffPermafrost.png": +{ + "frame": {"x":221,"y":827,"w":28,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":5,"w":28,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffTape.png": +{ + "frame": {"x":1172,"y":79,"w":41,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":15,"w":41,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/TheEncaser.png": +{ + "frame": {"x":877,"y":610,"w":42,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":8,"w":42,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Torch.png": +{ + "frame": {"x":859,"y":502,"w":28,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":8,"w":28,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/Unarmed.png": +{ + "frame": {"x":424,"y":660,"w":45,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":8,"w":45,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/UniversalSolvent.png": +{ + "frame": {"x":842,"y":1023,"w":36,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":5,"w":36,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/VibeWand.png": +{ + "frame": {"x":468,"y":36,"w":38,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":19,"w":38,"h":37}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/WaterRune.png": +{ + "frame": {"x":1435,"y":670,"w":51,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Layers.png": +{ + "frame": {"x":1620,"y":124,"w":44,"h":44}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":44,"h":44}, + "sourceSize": {"w":44,"h":44} +}, +"Game/LockJam.png": +{ + "frame": {"x":501,"y":834,"w":59,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":59,"h":58}, + "sourceSize": {"w":60,"h":60} +}, +"Game/Locks/Blind.png": +{ + "frame": {"x":1728,"y":458,"w":33,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":33,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Blocked.png": +{ + "frame": {"x":1405,"y":613,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":54,"h":54}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Blue.png": +{ + "frame": {"x":2007,"y":418,"w":35,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":4,"w":35,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Crystal.png": +{ + "frame": {"x":640,"y":608,"w":51,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":51,"h":53}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Curse.png": +{ + "frame": {"x":638,"y":719,"w":56,"h":56}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":56,"h":56}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Cyber.png": +{ + "frame": {"x":2007,"y":368,"w":36,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":4,"w":36,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Cyber2.png": +{ + "frame": {"x":2015,"y":268,"w":32,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":4,"w":32,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Cyber3.png": +{ + "frame": {"x":1969,"y":410,"w":36,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":4,"w":36,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Disc.png": +{ + "frame": {"x":1242,"y":507,"w":37,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":4,"w":37,"h":50}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Divine.png": +{ + "frame": {"x":1,"y":596,"w":28,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":1,"w":28,"h":53}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Divine2.png": +{ + "frame": {"x":1,"y":596,"w":28,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":1,"w":28,"h":53}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Dollmaker.png": +{ + "frame": {"x":696,"y":719,"w":56,"h":56}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":56,"h":56}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/ExCrystal.png": +{ + "frame": {"x":1354,"y":507,"w":34,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":4,"w":34,"h":50}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Fuuka.png": +{ + "frame": {"x":41,"y":158,"w":42,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":4,"w":42,"h":44}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Gold.png": +{ + "frame": {"x":508,"y":36,"w":37,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":9,"w":37,"h":37}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Grey.png": +{ + "frame": {"x":1763,"y":458,"w":33,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":33,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/HiSec.png": +{ + "frame": {"x":1985,"y":572,"w":37,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":4,"w":37,"h":52}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Purple.png": +{ + "frame": {"x":1798,"y":458,"w":33,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":33,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Red.png": +{ + "frame": {"x":1426,"y":507,"w":33,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":33,"h":50}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Red_Hi.png": +{ + "frame": {"x":1461,"y":508,"w":33,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":33,"h":50}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Red_Med.png": +{ + "frame": {"x":1496,"y":508,"w":33,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":33,"h":50}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Rubber.png": +{ + "frame": {"x":1833,"y":458,"w":33,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":33,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/StarCurse.png": +{ + "frame": {"x":1045,"y":506,"w":50,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":50,"h":50}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/White.png": +{ + "frame": {"x":1763,"y":458,"w":33,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":33,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Particles/mmm.png": +{ + "frame": {"x":364,"y":116,"w":36,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":2,"w":36,"h":42}, + "sourceSize": {"w":50,"h":50} +}, +"Game/Particles/nnn.png": +{ + "frame": {"x":479,"y":75,"w":33,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":3,"w":33,"h":40}, + "sourceSize": {"w":50,"h":50} +}, +"Game/Poses/Boxtie.png": +{ + "frame": {"x":1215,"y":79,"w":41,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Crossed.png": +{ + "frame": {"x":1258,"y":79,"w":41,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/FearPose.png": +{ + "frame": {"x":1,"y":1,"w":27,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":8,"w":27,"h":31}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Free.png": +{ + "frame": {"x":1128,"y":79,"w":42,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":42,"h":41}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Front.png": +{ + "frame": {"x":1301,"y":80,"w":41,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/NoFearPose.png": +{ + "frame": {"x":30,"y":1,"w":27,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":8,"w":27,"h":31}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/SetPose.png": +{ + "frame": {"x":1344,"y":80,"w":41,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":6,"w":41,"h":41}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Poses/Up.png": +{ + "frame": {"x":1387,"y":80,"w":41,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Wristtie.png": +{ + "frame": {"x":1430,"y":80,"w":41,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, + "sourceSize": {"w":46,"h":45} +}, +"Game/Poses/Yoked.png": +{ + "frame": {"x":1344,"y":80,"w":41,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, + "sourceSize": {"w":46,"h":45} +}, +"Game/ShopBasic/2C4.png": +{ + "frame": {"x":930,"y":723,"w":52,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShopBasic/2Dynamite.png": +{ + "frame": {"x":639,"y":663,"w":53,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":6,"w":53,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShopBasic/3Bomb.png": +{ + "frame": {"x":50,"y":1073,"w":61,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":61,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShopBasic/3Smoke.png": +{ + "frame": {"x":1821,"y":1298,"w":67,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":67,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShopBasic/DivineBelt.png": +{ + "frame": {"x":298,"y":890,"w":45,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShopBasic/DivineBelt2.png": +{ + "frame": {"x":298,"y":890,"w":45,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShopBasic/Lockpick.png": +{ + "frame": {"x":1519,"y":39,"w":41,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":18,"w":41,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/ShopBasic/SlimeWalkers.png": +{ + "frame": {"x":1349,"y":123,"w":55,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":16,"w":55,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spell1.png": +{ + "frame": {"x":1,"y":492,"w":31,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":28,"y":4,"w":31,"h":49}, + "sourceSize": {"w":86,"h":56} +}, +"Game/Spell2.png": +{ + "frame": {"x":1531,"y":508,"w":33,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":4,"w":33,"h":50}, + "sourceSize": {"w":86,"h":56} +}, +"Game/Spell3.png": +{ + "frame": {"x":1390,"y":507,"w":34,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":3,"w":34,"h":50}, + "sourceSize": {"w":86,"h":56} +}, +"Game/Spell4.png": +{ + "frame": {"x":291,"y":495,"w":36,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":4,"w":36,"h":49}, + "sourceSize": {"w":86,"h":56} +}, +"Game/Spell5.png": +{ + "frame": {"x":361,"y":498,"w":33,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":27,"y":5,"w":33,"h":49}, + "sourceSize": {"w":86,"h":56} +}, +"Game/Spells/AkashicConflux.png": +{ + "frame": {"x":1198,"y":964,"w":68,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":68,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Ally.png": +{ + "frame": {"x":1583,"y":1294,"w":60,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":4,"w":60,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AllyAggressive.png": +{ + "frame": {"x":1325,"y":1,"w":38,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":18,"w":38,"h":36}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AllyAttention.png": +{ + "frame": {"x":329,"y":1275,"w":62,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":7,"w":62,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AllyDeselect.png": +{ + "frame": {"x":1759,"y":1034,"w":62,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":7,"w":62,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AllyDisperse.png": +{ + "frame": {"x":475,"y":1210,"w":64,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":4,"w":64,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AllyMove.png": +{ + "frame": {"x":1458,"y":785,"w":47,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":5,"w":47,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AllyOnMe.png": +{ + "frame": {"x":1636,"y":969,"w":61,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":5,"w":61,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AllyToggle.png": +{ + "frame": {"x":1897,"y":615,"w":32,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":8,"w":32,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Analyze.png": +{ + "frame": {"x":392,"y":893,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Animate.png": +{ + "frame": {"x":1349,"y":123,"w":55,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":16,"w":55,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AnimateLarge.png": +{ + "frame": {"x":31,"y":826,"w":59,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":7,"w":59,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/AnimatePuppet.png": +{ + "frame": {"x":789,"y":1151,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ApprenticeIce.png": +{ + "frame": {"x":542,"y":1,"w":34,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":20,"w":34,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ApprenticeLightning.png": +{ + "frame": {"x":1080,"y":1,"w":28,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":20,"w":28,"h":35}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ApprenticeMagic.png": +{ + "frame": {"x":285,"y":73,"w":40,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":17,"w":40,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/BattleRhythm.png": +{ + "frame": {"x":276,"y":115,"w":42,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":15,"w":42,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/BattleTrance.png": +{ + "frame": {"x":672,"y":1211,"w":63,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":4,"w":63,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/BigBoulderLaunch.png": +{ + "frame": {"x":113,"y":1073,"w":59,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":3,"w":59,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/BladeDance.png": +{ + "frame": {"x":577,"y":119,"w":60,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":15,"w":60,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Bondage.png": +{ + "frame": {"x":602,"y":1019,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":4,"w":41,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/BoulderLaunch.png": +{ + "frame": {"x":80,"y":73,"w":36,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":15,"w":36,"h":39}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/BreakFree.png": +{ + "frame": {"x":1521,"y":906,"w":65,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":4,"w":65,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Camo.png": +{ + "frame": {"x":1651,"y":671,"w":32,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":10,"w":32,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ChainStrike.png": +{ + "frame": {"x":823,"y":77,"w":57,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":14,"w":57,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Charge.png": +{ + "frame": {"x":1097,"y":506,"w":47,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":13,"w":47,"h":50}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Chastity.png": +{ + "frame": {"x":345,"y":893,"w":45,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/CommandBind.png": +{ + "frame": {"x":1274,"y":1289,"w":56,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":2,"w":56,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/CommandCapture.png": +{ + "frame": {"x":475,"y":606,"w":55,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":9,"w":55,"h":53}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/CommandRelease.png": +{ + "frame": {"x":337,"y":207,"w":45,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":13,"w":45,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/CommandSlime.png": +{ + "frame": {"x":928,"y":840,"w":58,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":58,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/CommandVibrate.png": +{ + "frame": {"x":2015,"y":318,"w":30,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":12,"w":30,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/CommandWordGreater.png": +{ + "frame": {"x":1045,"y":558,"w":56,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":1,"w":56,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Decoy.png": +{ + "frame": {"x":1521,"y":1293,"w":60,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":4,"w":60,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/DesperateStruggle.png": +{ + "frame": {"x":92,"y":827,"w":64,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":5,"w":64,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/DistractionBurst.png": +{ + "frame": {"x":412,"y":716,"w":56,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":56,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/DistractionCast.png": +{ + "frame": {"x":353,"y":713,"w":57,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":5,"w":57,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ElasticGrip.png": +{ + "frame": {"x":931,"y":666,"w":64,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":13,"w":64,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/EmpowerCancel.png": +{ + "frame": {"x":1351,"y":457,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":13,"w":48,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/EnchantRope.png": +{ + "frame": {"x":174,"y":1076,"w":59,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":5,"w":59,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/EnemySense.png": +{ + "frame": {"x":105,"y":654,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Engulf.png": +{ + "frame": {"x":1703,"y":908,"w":63,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":1,"w":63,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Enrage.png": +{ + "frame": {"x":1396,"y":1291,"w":61,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":1,"w":61,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/EvasiveManeuvers.png": +{ + "frame": {"x":1271,"y":669,"w":54,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":5,"w":54,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Fireblast.png": +{ + "frame": {"x":628,"y":1146,"w":63,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":63,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Firebolt.png": +{ + "frame": {"x":193,"y":546,"w":51,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":11,"w":51,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Firecracker.png": +{ + "frame": {"x":1830,"y":848,"w":56,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":3,"w":56,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FireElemental.png": +{ + "frame": {"x":152,"y":768,"w":59,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":5,"w":59,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FirstWindHigher.png": +{ + "frame": {"x":1625,"y":508,"w":57,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":17,"w":57,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FlameRune.png": +{ + "frame": {"x":232,"y":115,"w":42,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":15,"w":42,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Flash.png": +{ + "frame": {"x":1051,"y":456,"w":49,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":49,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FlashBomb.png": +{ + "frame": {"x":900,"y":120,"w":40,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":13,"w":40,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FleetFooted.png": +{ + "frame": {"x":1889,"y":671,"w":30,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":8,"w":30,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FreezeRune.png": +{ + "frame": {"x":470,"y":717,"w":56,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":56,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Hailstorm.png": +{ + "frame": {"x":303,"y":1143,"w":63,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":63,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Heal.png": +{ + "frame": {"x":235,"y":1076,"w":59,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":5,"w":59,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Heal2.png": +{ + "frame": {"x":213,"y":768,"w":58,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":58,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/HolyOrb.png": +{ + "frame": {"x":1214,"y":669,"w":55,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":5,"w":55,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/IceBreath.png": +{ + "frame": {"x":645,"y":1019,"w":38,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":4,"w":38,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/IronBlood.png": +{ + "frame": {"x":298,"y":546,"w":28,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":10,"w":28,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LeatherWhip.png": +{ + "frame": {"x":382,"y":1080,"w":58,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":7,"w":58,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Light.png": +{ + "frame": {"x":1209,"y":1288,"w":63,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":63,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LimitSurge.png": +{ + "frame": {"x":169,"y":710,"w":60,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":5,"w":60,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LiquidMetal.png": +{ + "frame": {"x":1783,"y":561,"w":52,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ManaRecharge.png": +{ + "frame": {"x":1908,"y":731,"w":66,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":4,"w":66,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/NatureSpirit.png": +{ + "frame": {"x":1303,"y":784,"w":51,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":5,"w":51,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/NegateRune.png": +{ + "frame": {"x":161,"y":654,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Offhand.png": +{ + "frame": {"x":1382,"y":669,"w":51,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":8,"w":51,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/OrgasmResist.png": +{ + "frame": {"x":685,"y":1,"w":33,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":18,"w":33,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Petsuit.png": +{ + "frame": {"x":1612,"y":671,"w":37,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":5,"w":37,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ProblemSolving.png": +{ + "frame": {"x":988,"y":840,"w":45,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":6,"w":45,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Quickness2.png": +{ + "frame": {"x":217,"y":654,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Quickness3.png": +{ + "frame": {"x":312,"y":657,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Quickness4.png": +{ + "frame": {"x":368,"y":657,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Quickness5.png": +{ + "frame": {"x":471,"y":661,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/RecoverObject.png": +{ + "frame": {"x":378,"y":549,"w":46,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":9,"w":46,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/RopeStrike.png": +{ + "frame": {"x":1235,"y":726,"w":44,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Ropework.png": +{ + "frame": {"x":1225,"y":613,"w":61,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":13,"w":61,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Sagitta.png": +{ + "frame": {"x":723,"y":554,"w":62,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":62,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ShadowDance.png": +{ + "frame": {"x":727,"y":957,"w":49,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":1,"w":49,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ShadowSlash.png": +{ + "frame": {"x":623,"y":836,"w":58,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Shield.png": +{ + "frame": {"x":1267,"y":1027,"w":66,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":7,"w":66,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ShockCollar.png": +{ + "frame": {"x":535,"y":163,"w":38,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":13,"w":38,"h":46}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Sleet.png": +{ + "frame": {"x":1956,"y":1311,"w":64,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":3,"w":64,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Slime.png": +{ + "frame": {"x":1755,"y":1098,"w":65,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SlimeToLatex.png": +{ + "frame": {"x":1837,"y":561,"w":52,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Snare.png": +{ + "frame": {"x":527,"y":661,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Sonar.png": +{ + "frame": {"x":1931,"y":1045,"w":62,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":5,"w":62,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Sowing.png": +{ + "frame": {"x":1037,"y":782,"w":54,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":6,"w":54,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SpellChoiceUp3.png": +{ + "frame": {"x":1404,"y":966,"w":62,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":4,"w":62,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SpellFailPartial.png": +{ + "frame": {"x":739,"y":1282,"w":66,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":66,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Spread.png": +{ + "frame": {"x":1756,"y":671,"w":65,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":10,"w":65,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/StoneSkin.png": +{ + "frame": {"x":1705,"y":1296,"w":58,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":4,"w":58,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonArmbinder.png": +{ + "frame": {"x":442,"y":75,"w":35,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonLeatherCuffs.png": +{ + "frame": {"x":273,"y":1208,"w":66,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":66,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/SummonLegbinder.png": +{ + "frame": {"x":1685,"y":671,"w":69,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":9,"w":69,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Swap.png": +{ + "frame": {"x":1044,"y":121,"w":60,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":14,"w":60,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/TelekineticSlash.png": +{ + "frame": {"x":273,"y":771,"w":57,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":7,"w":57,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/TickleCloud.png": +{ + "frame": {"x":1630,"y":1161,"w":65,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":65,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/TidalBall.png": +{ + "frame": {"x":1888,"y":790,"w":67,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":8,"w":67,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ToolsOfTheTrade.png": +{ + "frame": {"x":1010,"y":1287,"w":65,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":4,"w":65,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Tremor.png": +{ + "frame": {"x":1768,"y":909,"w":64,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":64,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/TrueSteel.png": +{ + "frame": {"x":330,"y":449,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/UnconventionalWarfare.png": +{ + "frame": {"x":265,"y":1274,"w":62,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":3,"w":62,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Volcanism.png": +{ + "frame": {"x":1423,"y":844,"w":65,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":8,"w":65,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/WaterBall.png": +{ + "frame": {"x":41,"y":114,"w":47,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":16,"w":47,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/WaterMote.png": +{ + "frame": {"x":1037,"y":724,"w":51,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":14,"w":51,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ZoneOfExcitement.png": +{ + "frame": {"x":735,"y":1350,"w":54,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":5,"w":54,"h":67}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/ZoneOfFrost.png": +{ + "frame": {"x":1143,"y":1288,"w":64,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":4,"w":64,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Sprint.png": +{ + "frame": {"x":937,"y":77,"w":52,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":15,"w":52,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Struggle.png": +{ + "frame": {"x":582,"y":718,"w":54,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":54,"h":56}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Target.png": +{ + "frame": {"x":789,"y":1216,"w":63,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":4,"w":63,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/AutoPass/Allies.png": +{ + "frame": {"x":778,"y":959,"w":48,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":48,"h":60}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/AutoPass/HelplessAllies.png": +{ + "frame": {"x":808,"y":720,"w":49,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":1,"w":49,"h":56}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/AutoPass/HelplessEnemies.png": +{ + "frame": {"x":1105,"y":667,"w":48,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":48,"h":55}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/AutoPass/Neutral.png": +{ + "frame": {"x":874,"y":961,"w":43,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":43,"h":60}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/AutoPass/Shop.png": +{ + "frame": {"x":343,"y":954,"w":58,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":58,"h":60}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/AutoPass/Special.png": +{ + "frame": {"x":675,"y":957,"w":50,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":50,"h":60}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/AutoPass/Summons.png": +{ + "frame": {"x":481,"y":354,"w":36,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":7,"w":36,"h":47}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/AutoPath/StepDuringCombat.png": +{ + "frame": {"x":1666,"y":124,"w":44,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":44,"h":44}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/AutoPath/SuppressBeforeCombat.png": +{ + "frame": {"x":1712,"y":124,"w":44,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":44,"h":44}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/AutoPath/SuppressDuringCombat.png": +{ + "frame": {"x":1758,"y":124,"w":44,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":44,"h":44}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/AutoStruggle.png": +{ + "frame": {"x":1705,"y":788,"w":45,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":0,"w":45,"h":57}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/BoxLarge.png": +{ + "frame": {"x":320,"y":115,"w":42,"h":42}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":42,"h":42}, + "sourceSize": {"w":42,"h":42} +}, +"Game/UI/BulletTransparency.png": +{ + "frame": {"x":108,"y":446,"w":56,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":5,"w":56,"h":47}, + "sourceSize": {"w":56,"h":56} +}, +"Game/UI/button_inventory.png": +{ + "frame": {"x":129,"y":159,"w":37,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":5,"w":37,"h":44}, + "sourceSize": {"w":50,"h":56} +}, +"Game/UI/button_logbook.png": +{ + "frame": {"x":1293,"y":1,"w":30,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":11,"w":30,"h":35}, + "sourceSize": {"w":42,"h":56} +}, +"Game/UI/button_menu.png": +{ + "frame": {"x":85,"y":159,"w":42,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":6,"w":42,"h":44}, + "sourceSize": {"w":42,"h":56} +}, +"Game/UI/button_reputation.png": +{ + "frame": {"x":2015,"y":170,"w":32,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":4,"w":32,"h":47}, + "sourceSize": {"w":42,"h":56} +}, +"Game/UI/button_spells.png": +{ + "frame": {"x":285,"y":73,"w":40,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":40,"h":40}, + "sourceSize": {"w":50,"h":56} +}, +"Game/UI/Buttons/Mark.png": +{ + "frame": {"x":1110,"y":1,"w":35,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":20,"w":35,"h":35}, + "sourceSize": {"w":80,"h":80} +}, +"Game/UI/Buttons/MarkAll.png": +{ + "frame": {"x":1229,"y":1156,"w":69,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":8,"w":69,"h":64}, + "sourceSize": {"w":80,"h":80} +}, +"Game/UI/Buttons/Release.png": +{ + "frame": {"x":1461,"y":560,"w":54,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":14,"w":54,"h":52}, + "sourceSize": {"w":80,"h":80} +}, +"Game/UI/Buttons/RemoveGuest.png": +{ + "frame": {"x":332,"y":771,"w":57,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":57,"h":57}, + "sourceSize": {"w":78,"h":78} +}, +"Game/UI/Buttons/Unmark.png": +{ + "frame": {"x":1147,"y":1,"w":35,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":20,"w":35,"h":35}, + "sourceSize": {"w":80,"h":80} +}, +"Game/UI/Buttons/UnmarkAll.png": +{ + "frame": {"x":1300,"y":1157,"w":69,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":8,"w":69,"h":64}, + "sourceSize": {"w":80,"h":80} +}, +"Game/UI/Checked.png": +{ + "frame": {"x":1110,"y":1,"w":35,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":35,"h":35}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/circleborder.png": +{ + "frame": {"x":541,"y":1211,"w":64,"h":64}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64}, + "sourceSize": {"w":64,"h":64} +}, +"Game/UI/clouduploadicon.png": +{ + "frame": {"x":232,"y":73,"w":51,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":11,"w":51,"h":40}, + "sourceSize": {"w":64,"h":64} +}, +"Game/UI/CollectionFilter/Available.png": +{ + "frame": {"x":1517,"y":560,"w":42,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":9,"w":42,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Bound.png": +{ + "frame": {"x":314,"y":830,"w":61,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":8,"w":61,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Free.png": +{ + "frame": {"x":1509,"y":968,"w":62,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":8,"w":62,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Imprisoned.png": +{ + "frame": {"x":1561,"y":561,"w":54,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":10,"w":54,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Negative.png": +{ + "frame": {"x":1,"y":157,"w":38,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":14,"w":38,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Positive.png": +{ + "frame": {"x":882,"y":77,"w":53,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":14,"w":53,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Rank1.png": +{ + "frame": {"x":90,"y":115,"w":46,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":16,"w":46,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Rank2.png": +{ + "frame": {"x":997,"y":557,"w":46,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":10,"w":46,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Rank3.png": +{ + "frame": {"x":991,"y":77,"w":46,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":15,"w":46,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Rank5.png": +{ + "frame": {"x":1704,"y":847,"w":62,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":3,"w":62,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Safe.png": +{ + "frame": {"x":1401,"y":457,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":13,"w":48,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Unavailable.png": +{ + "frame": {"x":562,"y":835,"w":59,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":6,"w":59,"h":58}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionTab/FacilityQuick.png": +{ + "frame": {"x":1327,"y":669,"w":53,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":8,"w":53,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionTab/Release.png": +{ + "frame": {"x":1461,"y":560,"w":54,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":10,"w":54,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Conjured.png": +{ + "frame": {"x":918,"y":1,"w":34,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":34,"h":34}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/Crosshair.png": +{ + "frame": {"x":807,"y":1282,"w":66,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":66,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Crossout.png": +{ + "frame": {"x":332,"y":771,"w":57,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":57,"h":57}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/CrouchOff.png": +{ + "frame": {"x":1006,"y":962,"w":41,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":0,"w":41,"h":60}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/CrouchOn.png": +{ + "frame": {"x":1685,"y":458,"w":41,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":41,"h":48}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Cycle.png": +{ + "frame": {"x":803,"y":120,"w":48,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":13,"w":48,"h":43}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Door.png": +{ + "frame": {"x":1083,"y":612,"w":36,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":3,"w":36,"h":53}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/DoorClose.png": +{ + "frame": {"x":1083,"y":612,"w":36,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":3,"w":36,"h":53}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Edged.png": +{ + "frame": {"x":1888,"y":850,"w":60,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":60,"h":59}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Expand.png": +{ + "frame": {"x":1809,"y":39,"w":38,"h":39}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":38,"h":39}, + "sourceSize": {"w":38,"h":39} +}, +"Game/UI/Facility/CuddleLounge.png": +{ + "frame": {"x":1494,"y":1226,"w":68,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":4,"w":68,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Facility/MaidQuarters.png": +{ + "frame": {"x":1988,"y":519,"w":54,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":7,"w":54,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Facility/Management.png": +{ + "frame": {"x":1988,"y":519,"w":54,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":7,"w":54,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Facility/Recycler.png": +{ + "frame": {"x":1,"y":886,"w":56,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":56,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Facility/RescueTeam.png": +{ + "frame": {"x":393,"y":1275,"w":61,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":4,"w":61,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Facility/Warden.png": +{ + "frame": {"x":1617,"y":561,"w":54,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":10,"w":54,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Facility_X.png": +{ + "frame": {"x":954,"y":1,"w":34,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":41,"y":1,"w":34,"h":34}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/Floppy.png": +{ + "frame": {"x":1804,"y":124,"w":44,"h":44}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":44,"h":44}, + "sourceSize": {"w":44,"h":44} +}, +"Game/UI/greyColor.png": +{ + "frame": {"x":1564,"y":1160,"w":64,"h":64}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64}, + "sourceSize": {"w":64,"h":64} +}, +"Game/UI/Help.png": +{ + "frame": {"x":1,"y":113,"w":38,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":38,"h":42}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Imprison.png": +{ + "frame": {"x":1401,"y":457,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":15,"w":48,"h":48}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/Inspect.png": +{ + "frame": {"x":562,"y":835,"w":59,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":59,"h":58}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Interact.png": +{ + "frame": {"x":467,"y":162,"w":34,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":13,"y":5,"w":34,"h":45}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Labels.png": +{ + "frame": {"x":1849,"y":39,"w":38,"h":39}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":38,"h":39}, + "sourceSize": {"w":38,"h":39} +}, +"Game/UI/LabelsChest.png": +{ + "frame": {"x":1889,"y":39,"w":38,"h":39}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":38,"h":39}, + "sourceSize": {"w":38,"h":39} +}, +"Game/UI/LabelsOther.png": +{ + "frame": {"x":1929,"y":39,"w":38,"h":39}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":38,"h":39}, + "sourceSize": {"w":38,"h":39} +}, +"Game/UI/LabelsShrine.png": +{ + "frame": {"x":1969,"y":39,"w":38,"h":39}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":38,"h":39}, + "sourceSize": {"w":38,"h":39} +}, +"Game/UI/LetGo.png": +{ + "frame": {"x":122,"y":948,"w":60,"h":60}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":60,"h":60}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Load.png": +{ + "frame": {"x":367,"y":74,"w":36,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":36,"h":40}, + "sourceSize": {"w":44,"h":44} +}, +"Game/UI/Log/Ambient.png": +{ + "frame": {"x":1,"y":113,"w":38,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":38,"h":42}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Log/Combat.png": +{ + "frame": {"x":59,"y":1,"w":28,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":14,"w":28,"h":31}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Log/Dialogue.png": +{ + "frame": {"x":1386,"y":844,"w":35,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":2,"w":35,"h":58}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Log/Items.png": +{ + "frame": {"x":1562,"y":39,"w":41,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":11,"w":41,"h":39}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Log/Kills.png": +{ + "frame": {"x":985,"y":900,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":1,"w":44,"h":59}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Log/Self.png": +{ + "frame": {"x":2009,"y":39,"w":38,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":12,"w":38,"h":39}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Log/Struggle.png": +{ + "frame": {"x":1705,"y":788,"w":45,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":0,"w":45,"h":57}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/LogDown.png": +{ + "frame": {"x":1589,"y":1,"w":33,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":2,"w":33,"h":36}, + "sourceSize": {"w":41,"h":41} +}, +"Game/UI/LogUp.png": +{ + "frame": {"x":1624,"y":1,"w":33,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":3,"w":33,"h":36}, + "sourceSize": {"w":41,"h":41} +}, +"Game/UI/miscast.png": +{ + "frame": {"x":1659,"y":1,"w":32,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":32,"h":36}, + "sourceSize": {"w":36,"h":36} +}, +"Game/UI/NoPass.png": +{ + "frame": {"x":985,"y":900,"w":44,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":1,"w":44,"h":59}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/Pass.png": +{ + "frame": {"x":1076,"y":901,"w":43,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":1,"w":43,"h":59}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/PathDisplay.png": +{ + "frame": {"x":720,"y":1,"w":33,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":19,"w":33,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Play.png": +{ + "frame": {"x":2009,"y":39,"w":38,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":12,"w":38,"h":39}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/PlayerFacing.png": +{ + "frame": {"x":771,"y":76,"w":50,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":15,"w":50,"h":41}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Promote.png": +{ + "frame": {"x":997,"y":557,"w":46,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":10,"w":46,"h":52}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/Rank/Rank1.png": +{ + "frame": {"x":90,"y":115,"w":46,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":16,"w":46,"h":42}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Rank/Rank2.png": +{ + "frame": {"x":997,"y":557,"w":46,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":10,"w":46,"h":52}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Rank/Rank4.png": +{ + "frame": {"x":135,"y":1271,"w":64,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":1,"w":64,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Recall.png": +{ + "frame": {"x":755,"y":1,"w":33,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33}, + "sourceSize": {"w":34,"h":33} +}, +"Game/UI/Recycler/Armor.png": +{ + "frame": {"x":1155,"y":669,"w":57,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":57,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Recycler/Chastity.png": +{ + "frame": {"x":251,"y":890,"w":45,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Recycler/Cyber.png": +{ + "frame": {"x":1823,"y":671,"w":64,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":18,"w":64,"h":56}, + "sourceSize": {"w":94,"h":94} +}, +"Game/UI/Recycler/Dress.png": +{ + "frame": {"x":742,"y":608,"w":44,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":20,"w":44,"h":53}, + "sourceSize": {"w":94,"h":94} +}, +"Game/UI/Recycler/Latex.png": +{ + "frame": {"x":1019,"y":37,"w":33,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":17,"w":33,"h":38}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Recycler/Leather.png": +{ + "frame": {"x":442,"y":75,"w":35,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Recycler/Leather2.png": +{ + "frame": {"x":442,"y":75,"w":35,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Recycler/Metal.png": +{ + "frame": {"x":251,"y":830,"w":61,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":5,"w":61,"h":58}, + "sourceSize": {"w":73,"h":72} +}, +"Game/UI/Recycler/Metal2.png": +{ + "frame": {"x":251,"y":830,"w":61,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":5,"w":61,"h":58}, + "sourceSize": {"w":73,"h":72} +}, +"Game/UI/Recycler/Module.png": +{ + "frame": {"x":754,"y":719,"w":52,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":19,"w":52,"h":56}, + "sourceSize": {"w":94,"h":94} +}, +"Game/UI/Recycler/Rope.png": +{ + "frame": {"x":1,"y":543,"w":29,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":10,"w":29,"h":51}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Reset.png": +{ + "frame": {"x":1519,"y":1,"w":36,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":36,"h":36}, + "sourceSize": {"w":44,"h":44} +}, +"Game/UI/Resource/Latex.png": +{ + "frame": {"x":1850,"y":124,"w":44,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":14,"w":44,"h":44}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Resource/Leather.png": +{ + "frame": {"x":1040,"y":667,"w":63,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":63,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Resource/Metal.png": +{ + "frame": {"x":583,"y":662,"w":54,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Resource/Rope.png": +{ + "frame": {"x":1461,"y":614,"w":55,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":9,"w":55,"h":54}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Restore.png": +{ + "frame": {"x":1896,"y":124,"w":44,"h":44}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":44,"h":44}, + "sourceSize": {"w":44,"h":44} +}, +"Game/UI/Restrain.png": +{ + "frame": {"x":251,"y":830,"w":61,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":10,"w":61,"h":58}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/RestrainBack.png": +{ + "frame": {"x":314,"y":830,"w":61,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":10,"w":61,"h":58}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/RestrainFree.png": +{ + "frame": {"x":1509,"y":968,"w":62,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":10,"w":62,"h":61}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/Revert.png": +{ + "frame": {"x":803,"y":120,"w":48,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":48,"h":43}, + "sourceSize": {"w":48,"h":48} +}, +"Game/UI/Safe.png": +{ + "frame": {"x":1942,"y":124,"w":44,"h":44}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":44,"h":44}, + "sourceSize": {"w":44,"h":44} +}, +"Game/UI/savedColor_copy.png": +{ + "frame": {"x":1184,"y":1,"w":35,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":5,"w":35,"h":35}, + "sourceSize": {"w":44,"h":44} +}, +"Game/UI/savedColor_paste.png": +{ + "frame": {"x":1221,"y":1,"w":35,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":4,"w":35,"h":35}, + "sourceSize": {"w":44,"h":44} +}, +"Game/UI/SetPalette.png": +{ + "frame": {"x":1988,"y":124,"w":44,"h":44}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":44,"h":44}, + "sourceSize": {"w":44,"h":44} +}, +"Game/UI/Shrink.png": +{ + "frame": {"x":1,"y":72,"w":38,"h":39}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":38,"h":39}, + "sourceSize": {"w":38,"h":39} +}, +"Game/UI/SleepVibe.png": +{ + "frame": {"x":657,"y":554,"w":64,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":6,"w":64,"h":52}, + "sourceSize": {"w":71,"h":60} +}, +"Game/UI/Status.png": +{ + "frame": {"x":403,"y":955,"w":58,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":58,"h":60}, + "sourceSize": {"w":60,"h":60} +}, +"Game/UI/UsePotionInject.png": +{ + "frame": {"x":944,"y":37,"w":38,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":3,"w":38,"h":38}, + "sourceSize": {"w":44,"h":44} +}, +"Game/UI/X.png": +{ + "frame": {"x":578,"y":1,"w":34,"h":33}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":34,"h":33}, + "sourceSize": {"w":34,"h":33} +}, +"Game/UI/Xgold.png": +{ + "frame": {"x":614,"y":1,"w":34,"h":33}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":34,"h":33}, + "sourceSize": {"w":34,"h":33} +}, +"Game/UI/XRay0.png": +{ + "frame": {"x":1486,"y":458,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":48,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/UI/XRay1.png": +{ + "frame": {"x":1536,"y":458,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":48,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/UI/XRay2.png": +{ + "frame": {"x":1586,"y":458,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":48,"h":48}, + "sourceSize": {"w":56,"h":56} +}, +"Game/UI/ZoomIn.png": +{ + "frame": {"x":1365,"y":1,"w":37,"h":36}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":37,"h":36}, + "sourceSize": {"w":37,"h":36} +}, +"Game/UI/ZoomOut.png": +{ + "frame": {"x":1404,"y":1,"w":37,"h":36}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":37,"h":36}, + "sourceSize": {"w":37,"h":36} +}, +"Game/UseTool.png": +{ + "frame": {"x":853,"y":120,"w":45,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":5,"w":45,"h":43}, + "sourceSize": {"w":56,"h":56} +}, +"Game/WarningAlly.png": +{ + "frame": {"x":875,"y":1285,"w":66,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":2,"w":66,"h":66}, + "sourceSize": {"w":72,"h":72} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "game5.png", + "format": "RGBA8888", + "size": {"w":2048,"h":1424}, + "scale": "1", + "related_multi_packs": [ "game0.json", "game1.json", "game2.json", "game3.json", "game4.json" ], + "smartupdate": "$TexturePacker:SmartUpdate:93331e914a1bc9da57f494945b1cabd8:29d6d373e93b4cfb07f84e92c1fd5a73:54a7432a0665349a58c0c74f51e75c65$" +} +} diff --git a/TextureAtlas/game5.png b/TextureAtlas/game5.png new file mode 100644 index 000000000..0b128ec0d Binary files /dev/null and b/TextureAtlas/game5.png differ diff --git a/index.html b/index.html index 8c72057a3..cf21d2223 100644 --- a/index.html +++ b/index.html @@ -1,11 +1,8 @@ - - - - + @@ -14,218 +11,27 @@ Kinky Dungeon - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + +
+ +
diff --git a/jsconfig.json b/jsconfig.json index b84376dfd..70902cead 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,10 +1,10 @@ { "compilerOptions": { "module": "commonjs", - "target": "ES2018", - "lib": ["es2018", "dom"], + "target": "ES2020", + "lib": ["es2020", "dom"], "checkJs": true }, - "include": ["Scripts/**/*", "Screens/**/*", "Assets/**/*", "Backgrounds/**/*.js", "Game/**/*"], + "include": ["Scripts/**/*", "Screens/**/*", "Assets/**/*", "Backgrounds/**/*.js", "Game/**/*", "Data/**/*"], "exclude": ["Scripts/lib/**/*.js"] } diff --git a/out/saveworker.js b/out/saveworker.js new file mode 100644 index 000000000..2cc54c8b7 --- /dev/null +++ b/out/saveworker.js @@ -0,0 +1,7 @@ +// eslint-disable-next-line strict +importScripts('../Scripts/lib/LZString.js'); + +onmessage = (e) => { + console.log("Compressing save in worker thread..."); + postMessage(LZString.compressToBase64(e.data)); +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fdf51d4aa..719c55607 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,839 @@ "version": "1.0.0", "license": "All Rights Reserved", "devDependencies": { - "http-server": "^14.1.1" + "http-server": "^14.1.1", + "pixi-filters": "5.2.0", + "pixi.js": "^7.2.1", + "pixi.js-legacy": "^7.2.1", + "typescript": "^5.4.5" } }, + "node_modules/@pixi/accessibility": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-7.4.2.tgz", + "integrity": "sha512-R6VEolm8uyy1FB1F2qaLKxVbzXAFTZCF2ka8fl9lsz7We6ZfO4QpXv9ur7DvzratjCQUQVCKo0/V7xL5q1EV/g==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/events": "7.4.2" + } + }, + "node_modules/@pixi/app": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/app/-/app-7.4.2.tgz", + "integrity": "sha512-ugkH3kOgjT8P1mTMY29yCOgEh+KuVMAn8uBxeY0aMqaUgIMysfpnFv+Aepp2CtvI9ygr22NC+OiKl+u+eEaQHw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/assets": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/assets/-/assets-7.4.2.tgz", + "integrity": "sha512-anxho59H9egZwoaEdM5aLvYyxoz6NCy3CaQIvNHD1bbGg8L16Ih0e26QSBR5fu53jl8OjT6M7s+p6n7uu4+fGA==", + "dev": true, + "dependencies": { + "@types/css-font-loading-module": "^0.0.12" + }, + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/canvas-display": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-display/-/canvas-display-7.4.2.tgz", + "integrity": "sha512-cKplWdhy+ReYRQK9ideLlKoBdTI9cB10382jWkLDiBeguM9cWSIOrmY5Bd84V0/5FOTLc/AFl4LL1wws27MVKg==", + "dev": true, + "peerDependencies": { + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/canvas-extract": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-extract/-/canvas-extract-7.4.2.tgz", + "integrity": "sha512-4rbH4sLPcPEz+OjehFUluFHN8mup9zwzedJLYc7KtqScg/npYKtVmDSaI/0cZBr9vmael+ZuCg/hjaDYTJhubg==", + "dev": true, + "peerDependencies": { + "@pixi/canvas-renderer": "7.4.2", + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/extract": "7.4.2" + } + }, + "node_modules/@pixi/canvas-graphics": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-graphics/-/canvas-graphics-7.4.2.tgz", + "integrity": "sha512-1ANBcV5IietfQuABT2PUxTs4TsQP4kmpwUnkRLpZgvM5NL0UBMUZCqBhcBnbfAyV7zvpPm3i+eWhIwn6Xz/2Tg==", + "dev": true, + "peerDependencies": { + "@pixi/canvas-display": "7.4.2", + "@pixi/canvas-renderer": "7.4.2", + "@pixi/core": "7.4.2", + "@pixi/graphics": "7.4.2" + } + }, + "node_modules/@pixi/canvas-mesh": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-mesh/-/canvas-mesh-7.4.2.tgz", + "integrity": "sha512-CdxlV6a6H3wULwwFtURIycQT7oCtvFGDMotz3glyAj625EEx+mwSLo1mAVzs8Hl9pmetFmNKj4Z1gy890VSemw==", + "dev": true, + "peerDependencies": { + "@pixi/canvas-display": "7.4.2", + "@pixi/canvas-renderer": "7.4.2", + "@pixi/core": "7.4.2", + "@pixi/mesh": "7.4.2", + "@pixi/mesh-extras": "7.4.2" + } + }, + "node_modules/@pixi/canvas-particle-container": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-particle-container/-/canvas-particle-container-7.4.2.tgz", + "integrity": "sha512-775rF/d7atlZTq5oODr6K3qDZ+awWkDe0QQ4BvGqPAXaWXB5doGs3j5KpTEoFD/JnbX7Q7o8ZTVGla6qsBnT6A==", + "dev": true, + "peerDependencies": { + "@pixi/particle-container": "7.4.2" + } + }, + "node_modules/@pixi/canvas-prepare": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-prepare/-/canvas-prepare-7.4.2.tgz", + "integrity": "sha512-BB50HZb8ttPMkef+9BXfzeT1HS/AUkXRS0uwhwpq4L75D7XwIlIfwS0lCv2bw2KflavA8wT0qWuwlQTgHSalcA==", + "dev": true, + "peerDependencies": { + "@pixi/canvas-renderer": "7.4.2", + "@pixi/core": "7.4.2", + "@pixi/prepare": "7.4.2" + } + }, + "node_modules/@pixi/canvas-renderer": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-renderer/-/canvas-renderer-7.4.2.tgz", + "integrity": "sha512-5qBrr4hJ3hQYMJwxIkKCnvMxL9m7aL26h4zbacK0KH7SQ0i+RCcZS2NzvPa451FtnhquIUjwuuWQyjPFdM5R7g==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/canvas-sprite": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-sprite/-/canvas-sprite-7.4.2.tgz", + "integrity": "sha512-XM6O6liAm2okHlSpUd0+muQAqLzY6EdQtfuqVP628FjHQkLJ/nb6Rg7qqtt3a3T4eyxzMBkqkzqBNBXomgf1SA==", + "dev": true, + "peerDependencies": { + "@pixi/canvas-display": "7.4.2", + "@pixi/canvas-renderer": "7.4.2", + "@pixi/core": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/canvas-sprite-tiling": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-sprite-tiling/-/canvas-sprite-tiling-7.4.2.tgz", + "integrity": "sha512-3/YEohGAiiVHnkOkL1wyjGBJlndXsLPG4XFn3Lpc84Cm5kbR/C6RvNvDcRckQod+jWmqQ8n4x4SjhoFBjdP+dQ==", + "dev": true, + "peerDependencies": { + "@pixi/canvas-renderer": "7.4.2", + "@pixi/canvas-sprite": "7.4.2", + "@pixi/core": "7.4.2", + "@pixi/sprite-tiling": "7.4.2" + } + }, + "node_modules/@pixi/canvas-text": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-text/-/canvas-text-7.4.2.tgz", + "integrity": "sha512-EOzYNaNcD4QWwL7LQ3v2WM4LQNXeS0aJbNOwJ1+9xiNjY53iF0w5XgSGcfGef4itym6nrwTBft1QwKyTE23zhQ==", + "dev": true, + "peerDependencies": { + "@pixi/canvas-sprite": "7.4.2", + "@pixi/sprite": "7.4.2", + "@pixi/text": "7.4.2" + } + }, + "node_modules/@pixi/color": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/color/-/color-7.4.2.tgz", + "integrity": "sha512-av1LOvhHsiaW8+T4n/FgnOKHby55/w7VcA1HzPIHRBtEcsmxvSCDanT1HU2LslNhrxLPzyVx18nlmalOyt5OBg==", + "dev": true, + "dependencies": { + "@pixi/colord": "^2.9.6" + } + }, + "node_modules/@pixi/colord": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz", + "integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==", + "dev": true + }, + "node_modules/@pixi/compressed-textures": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/compressed-textures/-/compressed-textures-7.4.2.tgz", + "integrity": "sha512-VJrt7el6O4ZJSWkeOGXwrhJaiLg1UBhHB3fj42VR4YloYkAxpfd9K6s6IcbcVz7n9L48APKBMgHyaB2pX2Ck/A==", + "dev": true, + "peerDependencies": { + "@pixi/assets": "7.4.2", + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/constants": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-7.4.2.tgz", + "integrity": "sha512-N9vn6Wpz5WIQg7ugUg2+SdqD2u2+NM0QthE8YzLJ4tLH2Iz+/TrnPKUJzeyIqbg3sxJG5ZpGGPiacqIBpy1KyA==", + "dev": true + }, + "node_modules/@pixi/core": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/core/-/core-7.4.2.tgz", + "integrity": "sha512-UbMtgSEnyCOFPzbE6ThB9qopXxbZ5GCof2ArB4FXOC5Xi/83MOIIYg5kf5M8689C5HJMhg2SrJu3xLKppF+CMg==", + "dev": true, + "dependencies": { + "@pixi/color": "7.4.2", + "@pixi/constants": "7.4.2", + "@pixi/extensions": "7.4.2", + "@pixi/math": "7.4.2", + "@pixi/runner": "7.4.2", + "@pixi/settings": "7.4.2", + "@pixi/ticker": "7.4.2", + "@pixi/utils": "7.4.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/pixijs" + } + }, + "node_modules/@pixi/display": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/display/-/display-7.4.2.tgz", + "integrity": "sha512-DaD0J7gIlNlzO0Fdlby/0OH+tB5LtCY6rgFeCBKVDnzmn8wKW3zYZRenWBSFJ0Psx6vLqXYkSIM/rcokaKviIw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/events": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/events/-/events-7.4.2.tgz", + "integrity": "sha512-Jw/w57heZjzZShIXL0bxOvKB+XgGIevyezhGtfF2ZSzQoSBWo+Fj1uE0QwKd0RIaXegZw/DhSmiMJSbNmcjifA==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/extensions": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-7.4.2.tgz", + "integrity": "sha512-Hmx2+O0yZ8XIvgomHM9GZEGcy9S9Dd8flmtOK5Aa3fXs/8v7xD08+ANQpN9ZqWU2Xs+C6UBlpqlt2BWALvKKKA==", + "dev": true + }, + "node_modules/@pixi/extract": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-7.4.2.tgz", + "integrity": "sha512-JOX27TRWjVEjauGBbF8PU7/g6LYXnivehdgqS5QlVDv1CNHTOrz/j3MdKcVWOhyZPbH5c9sh7lxyRxvd9AIuTQ==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-adjustment": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-adjustment/-/filter-adjustment-5.1.1.tgz", + "integrity": "sha512-AUHe03rmqXwV1ylAHq62t19AolPWOOYomCcL+Qycb1tf+LbM8FWpGXC6wmU1PkUrhgNc958uM9TrA9nRpplViA==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-advanced-bloom": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-advanced-bloom/-/filter-advanced-bloom-5.1.1.tgz", + "integrity": "sha512-C5AWmkWKvoYvJ+600qS7rC81E1X1clvrQLw4QE4IiFec5j1b07KhKE78w/BSRYMrBVa0cQ/ju0J1f7XoQYJfdQ==", + "dev": true, + "dependencies": { + "@pixi/filter-kawase-blur": "5.1.1" + }, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-alpha": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-7.4.2.tgz", + "integrity": "sha512-9OsKJ+yvY2wIcQXwswj5HQBiwNGymwmqdxfp7mo+nZSBoDmxUqvMZzE9UNJ3eUlswuNvNRO8zNOsQvwdz7WFww==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-ascii": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-ascii/-/filter-ascii-5.1.1.tgz", + "integrity": "sha512-uGfpd7aYZuiEzkBH8asL/2j7L/7k/jCZRURjAU9c0unWlkagwIjvUwoPMsdzPNMh2DNQzCG1FPWseSbRFjUNow==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-bevel": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-bevel/-/filter-bevel-5.1.1.tgz", + "integrity": "sha512-UGik6YEW+fnzVu1DV8ctbxS7eClJQzqaM2sPYI0MopaEE2mW35yjAcg9py9Kwx27BX8FniVRqtJOyKEw1A3mBA==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-bloom": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-bloom/-/filter-bloom-5.1.1.tgz", + "integrity": "sha512-4/i+tMxAQdgezahxsVCqzkAyBAH4TxtuY/zo1wuCJybEqkKFIzOJ76Y4R/lJevEHS9CGpCTrvjRpup0Hze8k0Q==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X", + "@pixi/filter-alpha": "^7.0.0-X", + "@pixi/filter-blur": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-blur": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-7.4.2.tgz", + "integrity": "sha512-gOXBbIUx6CRZP1fmsis2wLzzSsofrqmIHhbf1gIkZMIQaLsc9T7brj+PaLTTiOiyJgnvGN5j20RZnkERWWKV0Q==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-bulge-pinch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-bulge-pinch/-/filter-bulge-pinch-5.1.1.tgz", + "integrity": "sha512-80I3g813td7Fnzi7IJSiR3z8gZlKblk6WN+5z6WnscQROcNEpck6lgWS/Lf/IdeHB/FtUKJCbx7RzxkUhiRTvA==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-color-gradient": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-gradient/-/filter-color-gradient-5.2.0.tgz", + "integrity": "sha512-po3JBEKgfowqhAh2D75Ii1bhNl1gA8Agt+ESIMnSbrTVIkemno8zOVlVmP7xaf8+PKYnX7JWH5buTnnDfA7Hnw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-color-map": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-map/-/filter-color-map-5.1.1.tgz", + "integrity": "sha512-WvDKvweXkg/t9t40thFlN1d/kUrWXGsxpRpFPNmkrZF6hNxdRjqgfg4wxUOev7uZwHIjcZtTfoLRKhJjF+1uqw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-color-matrix": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-7.4.2.tgz", + "integrity": "sha512-ykZiR59Gvj80UKs9qm7jeUTKvn+wWk6HBVJOmJbK9jFK5juakDWp7BbH26U78Q61EWj97kI1FdfcbMkuQ7rqkA==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-color-overlay": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-overlay/-/filter-color-overlay-5.1.1.tgz", + "integrity": "sha512-u8xuWsUePQ1NFBqpxDAFEujW4kImFIIvlp4D2xbRZqJ0RRbeeKEW31Sk4cxl1yFJKWIq0XLyT/TAepT9iIlEXg==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-color-replace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-replace/-/filter-color-replace-5.1.1.tgz", + "integrity": "sha512-t+FEEnuqvlU1cKMSe8939tIGCNJsqpyc7o5BzIunMxsZsHjMQWzZtWQKls+FSdSlFyk2TWYSXWAxtj2VBzBZBg==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-convolution": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-convolution/-/filter-convolution-5.1.1.tgz", + "integrity": "sha512-68NNa7lXBFlRgP/ac/L/0bKk/9QvU8urh7CEeOnR9WJxjymglbAa0nM69TBlhg++Fus3t7Mz/jc/GIfPJ/VL6Q==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-cross-hatch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-cross-hatch/-/filter-cross-hatch-5.1.1.tgz", + "integrity": "sha512-g1hPHZYmGBpZtGojOtUOBWH6tqhtQGDo5xAp3o3gwmn2QnY087ZiYWFHF5ml+nTL62fEJ78uIpODscz4Y04e8w==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-crt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-crt/-/filter-crt-5.1.1.tgz", + "integrity": "sha512-w+rRbR7eTsPf18QPB68Wiyx8laC+v7fYb3hRVhnq/j6yRUJKQgg4HK5KLP9jfUJ9FJvxy4bzLSDQulvxbOMJZg==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-displacement": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-7.4.2.tgz", + "integrity": "sha512-QS/eWp/ivsxef3xapNeGwpPX7vrqQQeo99Fux4k5zsvplnNEsf91t6QYJLG776AbZEu/qh8VYRBA5raIVY/REw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-dot": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-dot/-/filter-dot-5.1.1.tgz", + "integrity": "sha512-w3g6bumHzZgv9ktzegEWQS7OWuHH0QG76sbg/hZBy5K01dyuGAe1uUUnzVN5hZuFTD6q77T2UPlifhNI5j4ixg==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-drop-shadow": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@pixi/filter-drop-shadow/-/filter-drop-shadow-5.2.0.tgz", + "integrity": "sha512-cYS2KDER7cwCu0V4VNSxTHGvzmNcEXdC9j3031YBOkUAE3+p17LMS/TAt6XeMfJV7KaPuusvXy2NFgGkv3RDbw==", + "dev": true, + "dependencies": { + "@pixi/filter-kawase-blur": "5.1.1" + }, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-emboss": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-emboss/-/filter-emboss-5.1.1.tgz", + "integrity": "sha512-AoAFVzrMcCXldU+27hvJ95tcKNOVLnanlq1z838l2SzYGgso+ICbLauUz+o2PL/znudUJE6oky+I6WJzeavDsQ==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-fxaa": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-7.4.2.tgz", + "integrity": "sha512-U/ptJgDsfs/r8y2a6gCaiPfDu2IFAxpQ4wtfmBpz6vRhqeE4kI8yNIUx5dZbui57zlsJaW0BNacOQxHU0vLkyQ==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-glitch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-glitch/-/filter-glitch-5.1.1.tgz", + "integrity": "sha512-pl6jOQlzQGg6NwqCwlgioYhlwue2OSRBGByDzh6Y6Y/qxMBuzQi7W56GunhQW79Kpvj9ynDLAGxomvZsrX88qg==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-glow": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-glow/-/filter-glow-5.1.1.tgz", + "integrity": "sha512-CXB5wKkrLkNhflsBgMv8FcGxp1SBkvyZ67kjf3znd4pJLly632OJ5bjegzAvA5/HKz1ohaFWBjsszYeScJB4nw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-godray": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-godray/-/filter-godray-5.1.1.tgz", + "integrity": "sha512-JCvNiKBF/01VyaBYzeusULg+h6kmBaYg0NruHwe/FaJMWCRIPOUBHMQIUavJR0JGE5s6bEIR8kRtdpf3RHiwqw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-grayscale": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-grayscale/-/filter-grayscale-5.1.1.tgz", + "integrity": "sha512-tRyggOhTdAQlQpgH/IzjCbORICua/Gm0JkKGOcdDQOHqt4bTVvAehQ59e2+A6A1yA8pevu2L/C25qQhsPgNW9w==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-hsl-adjustment": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@pixi/filter-hsl-adjustment/-/filter-hsl-adjustment-5.2.0.tgz", + "integrity": "sha512-BjmiKIJQuWNqMUjVUpqkM+HaInQzl7dCvYWj8wx9lSAwjzdOCRVVLbRLdO2TwGdwGIHjR3AylMxY1HZK3P4cLA==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-kawase-blur": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-kawase-blur/-/filter-kawase-blur-5.1.1.tgz", + "integrity": "sha512-nPnJ1ChBFP+4pgFCwC0RJgHAJCetiHcQU3INH7zCdq88cFABmVmhN+wCKRNg4H7lF1EJjaXgFDkTrTreOD/bnw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-motion-blur": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-motion-blur/-/filter-motion-blur-5.1.1.tgz", + "integrity": "sha512-I94s3pW2GutjCyXiKQ/dI4Vl9JKne+Q8QgGRn1mrk0Uwg6DDO/OQI3jqv01S+SCTU3LZqhR/p8AQyxeDmOhr2w==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-multi-color-replace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-multi-color-replace/-/filter-multi-color-replace-5.1.1.tgz", + "integrity": "sha512-P1shsJXEOpJGe9FdCUgCMi/nius86lBfb6cDIFM4oXdZfzuBUfWjZfUm7uofOvK7IWSrlXYrYoqp75H0XrLZ8A==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-noise": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-7.4.2.tgz", + "integrity": "sha512-Vy9ViBFhZEGh6xKkd3kFWErolZTwv1Y5Qb1bV7qPIYbvBECYsqzlR4uCrrjBV6KKm0PufpG/+NKC5vICZaqKzg==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-old-film": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-old-film/-/filter-old-film-5.1.1.tgz", + "integrity": "sha512-Jgq3eLbcQW48o+YxLe8+T4vsQrvBnKrZAHS3cu3yc2aBLaiVIj8EfYP3vpOPjkQlZ7JVRZNdELpYA6KCR+abXw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-outline": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@pixi/filter-outline/-/filter-outline-5.2.0.tgz", + "integrity": "sha512-xKfAouhZNKl6A0RvxT5i+2/ean7r16dE/QswwIkbWvr2hhHlp4p9U6XsqdgUERCDxK+IZibMAumbWs4DGxOUeQ==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-pixelate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-pixelate/-/filter-pixelate-5.1.1.tgz", + "integrity": "sha512-qTs0Sv10aIbMFW//BPlhcFh1ByyKiVmvXfytYTTXNLrlK5DU3H3x8Pgy5Vy4lacS9VtOO69/CQ1QObBFCHnEBQ==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-radial-blur": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-radial-blur/-/filter-radial-blur-5.1.1.tgz", + "integrity": "sha512-q6RreUM+RO25HZaxc6ceEOSi6chadv8vrCOvupNLSY+1lvXue0KyFK6vxMcMInNdqRGYWSyJ+ql3RyHMTr93aw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-reflection": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-reflection/-/filter-reflection-5.1.1.tgz", + "integrity": "sha512-ksmfrRfBqXZ+rEFuA0l2tf4k+yzTU8VcNMuhW7U+ggkWOP2OEHga+oOlJg6TnHjOEbxudCpag5Us6e9aCeKpEw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-rgb-split": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-rgb-split/-/filter-rgb-split-5.1.1.tgz", + "integrity": "sha512-DEeAYoPU2lbUTeNYK8e6q89jqtLeUYSkEdFK/a9IyxYkvJP2CPk+nVXIe48v3wORUf5DdP20k6yQzqoPZyP3ww==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-shockwave": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-shockwave/-/filter-shockwave-5.1.1.tgz", + "integrity": "sha512-ovzOdAC2LCyWdxJC5PW97wSzHTNfjmKq4c/61cIO4sZp+9DB6n3b/6Rrad2jU346UATtM6K2XkmPY5p7SrRRXA==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-simple-lightmap": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-simple-lightmap/-/filter-simple-lightmap-5.1.1.tgz", + "integrity": "sha512-S3cHUgbVvUgeef93f3trdL50+162Nyqa7DBYufkGw0dPjPecXyjTH47GJzxDqQPooRwHWWUG9W5EYC+XEwlV9w==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-tilt-shift": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@pixi/filter-tilt-shift/-/filter-tilt-shift-5.2.0.tgz", + "integrity": "sha512-bCQE/BTGsqu8EhRMyiGg+9/FXsPBYxjfODbGTWWQNsXtbFVqZXvg1vEjUZQXvuso1v/Fh/BtZ3u+t2kFfWpBXA==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-twist": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-twist/-/filter-twist-5.1.1.tgz", + "integrity": "sha512-ZUxLmSHu7ZcP1OYmO9EsKgWDV/Ophf622N7YVei4opBrj/gBMuQZNvFIfnsm4l8yhqAwwzndSTVLNehq1A2ONw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-zoom-blur": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-zoom-blur/-/filter-zoom-blur-5.1.1.tgz", + "integrity": "sha512-0n10xOqACC2vm9Lpsq37Y/edDvp/B7xsBdkuWxeCI7Ta7J22fsJ8IHG1iUyxgdZGa+SCPcKiFoTrYEUu5PLCpA==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/graphics": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-7.4.2.tgz", + "integrity": "sha512-jH4/Tum2RqWzHGzvlwEr7HIVduoLO57Ze705N2zQPkUD57TInn5911aGUeoua7f/wK8cTLGzgB9BzSo2kTdcHw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/math": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/math/-/math-7.4.2.tgz", + "integrity": "sha512-7jHmCQoYk6e0rfSKjdNFOPl0wCcdgoraxgteXJTTHv3r0bMNx2pHD9FJ0VvocEUG7XHfj55O3+u7yItOAx0JaQ==", + "dev": true + }, + "node_modules/@pixi/mesh": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-7.4.2.tgz", + "integrity": "sha512-mEkKyQvvMrYXC3pahvH5WBIKtrtB63WixRr91ANFI7zXD+ESG6Ap6XtxMCJmXDQPwBDNk7SWVMiCflYuchG7kA==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/mesh-extras": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-7.4.2.tgz", + "integrity": "sha512-vNR/7wjxjs7sv9fGoKkHyU91ZAD+7EnMHBS5F3CVISlOIFxLi96NNZCB81oUIdky/90pHw40johd/4izR5zTyw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/mesh": "7.4.2" + } + }, + "node_modules/@pixi/mixin-cache-as-bitmap": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-7.4.2.tgz", + "integrity": "sha512-6dgthi2ruUT/lervSrFDQ7vXkEsHo6CxdgV7W/wNdW1dqgQlKfDvO6FhjXzyIMRLSooUf5FoeluVtfsjkUIYrw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/mixin-get-child-by-name": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-7.4.2.tgz", + "integrity": "sha512-0Cfw8JpQhsixprxiYph4Lj+B5n83Kk4ftNMXgM5xtZz+tVLz5s91qR0MqcdzwTGTJ7utVygiGmS4/3EfR/duRQ==", + "dev": true, + "peerDependencies": { + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/mixin-get-global-position": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-7.4.2.tgz", + "integrity": "sha512-LcsahbVdX4DFS2IcGfNp4KaXuu7SjAwUp/flZSGIfstyKOKb5FWFgihtqcc9ZT4coyri3gs2JbILZub/zPZj1w==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/particle-container": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/particle-container/-/particle-container-7.4.2.tgz", + "integrity": "sha512-B78Qq86kt0lEa5WtB2YFIm3+PjhKfw9La9R++GBSgABl+g13s2UaZ6BIPxvY3JxWMdxPm4iPrQPFX1QWRN68mw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/prepare": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-7.4.2.tgz", + "integrity": "sha512-PugyMzReCHXUzc3so9PPJj2OdHwibpUNWyqG4mWY2UUkb6c8NAGK1AnAPiscOvLilJcv/XQSFoNhX+N1jrvJEg==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/graphics": "7.4.2", + "@pixi/text": "7.4.2" + } + }, + "node_modules/@pixi/runner": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-7.4.2.tgz", + "integrity": "sha512-LPBpwym4vdyyDY5ucF4INQccaGyxztERyLTY1YN6aqJyyMmnc7iqXlIKt+a0euMBtNoLoxy6MWMvIuZj0JfFPA==", + "dev": true + }, + "node_modules/@pixi/settings": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-7.4.2.tgz", + "integrity": "sha512-pMN+L6aWgvUbwhFIL/BTHKe2ShYGPZ8h9wlVBnFHMtUcJcFLMF1B3lzuvCayZRepOphs6RY0TqvnDvVb585JhQ==", + "dev": true, + "dependencies": { + "@pixi/constants": "7.4.2", + "@types/css-font-loading-module": "^0.0.12", + "ismobilejs": "^1.1.0" + } + }, + "node_modules/@pixi/sprite": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-7.4.2.tgz", + "integrity": "sha512-Ccf/OVQsB+HQV0Fyf5lwD+jk1jeU7uSIqEjbxenNNssmEdB7S5qlkTBV2EJTHT83+T6Z9OMOHsreJZerydpjeg==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/sprite-animated": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-7.4.2.tgz", + "integrity": "sha512-QPT6yxCUGOBN+98H3pyIZ1ZO6Y7BN1o0Q2IMZEsD1rNfZJrTYS3Q8VlCG5t2YlFlcB8j5iBo24bZb6FUxLOmsQ==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/sprite-tiling": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-7.4.2.tgz", + "integrity": "sha512-Z8PP6ewy3nuDYL+NeEdltHAhuucVgia33uzAitvH3OqqRSx6a6YRBFbNLUM9Sx+fBO2Lk3PpV1g6QZX+NE5LOg==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/spritesheet": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-7.4.2.tgz", + "integrity": "sha512-YIvHdpXW+AYp8vD0NkjJmrdnVHTZKidCnx6k8ATSuuvCT6O5Tuh2N/Ul2oDj4/QaePy0lVhyhAbZpJW00Jr7mQ==", + "dev": true, + "peerDependencies": { + "@pixi/assets": "7.4.2", + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/text": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/text/-/text-7.4.2.tgz", + "integrity": "sha512-rZZWpJNsIQ8WoCWrcVg8Gi6L/PDakB941clo6dO3XjoII2ucoOUcnpe5HIkudxi2xPvS/8Bfq990gFEx50TP5A==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/text-bitmap": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-7.4.2.tgz", + "integrity": "sha512-lPBMJ83JnpFVL+6ckQ8KO8QmwdPm0z9Zs/M0NgFKH2F+BcjelRNnk80NI3O0qBDYSEDQIE+cFbKoZ213kf7zwA==", + "dev": true, + "peerDependencies": { + "@pixi/assets": "7.4.2", + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/mesh": "7.4.2", + "@pixi/text": "7.4.2" + } + }, + "node_modules/@pixi/text-html": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/text-html/-/text-html-7.4.2.tgz", + "integrity": "sha512-duOu8oDYeDNuyPozj2DAsQ5VZBbRiwIXy78Gn7H2pCiEAefw/Uv5jJYwdgneKME0e1tOxz1eOUGKPcI6IJnZjw==", + "dev": true, + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/sprite": "7.4.2", + "@pixi/text": "7.4.2" + } + }, + "node_modules/@pixi/ticker": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-7.4.2.tgz", + "integrity": "sha512-cAvxCh/KI6IW4m3tp2b+GQIf+DoSj9NNmPJmsOeEJ7LzvruG8Ps7SKI6CdjQob5WbceL1apBTDbqZ/f77hFDiQ==", + "dev": true, + "dependencies": { + "@pixi/extensions": "7.4.2", + "@pixi/settings": "7.4.2", + "@pixi/utils": "7.4.2" + } + }, + "node_modules/@pixi/utils": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-7.4.2.tgz", + "integrity": "sha512-aU/itcyMC4TxFbmdngmak6ey4kC5c16Y5ntIYob9QnjNAfD/7GTsYIBnP6FqEAyO1eq0MjkAALxdONuay1BG3g==", + "dev": true, + "dependencies": { + "@pixi/color": "7.4.2", + "@pixi/constants": "7.4.2", + "@pixi/settings": "7.4.2", + "@types/earcut": "^2.1.0", + "earcut": "^2.2.4", + "eventemitter3": "^4.0.0", + "url": "^0.11.0" + } + }, + "node_modules/@types/css-font-loading-module": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.12.tgz", + "integrity": "sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==", + "dev": true + }, + "node_modules/@types/earcut": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", + "integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==", + "dev": true + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -49,13 +879,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -113,6 +949,50 @@ "ms": "^2.1.1" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -120,9 +1000,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -140,35 +1020,43 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">= 0.4.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { @@ -180,6 +1068,30 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -192,6 +1104,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -266,6 +1190,12 @@ "node": ">=0.10.0" } }, + "node_modules/ismobilejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz", + "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==", + "dev": true + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -285,10 +1215,13 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/mkdirp": { "version": "0.5.6", @@ -309,9 +1242,9 @@ "dev": true }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -326,6 +1259,114 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/pixi-filters": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/pixi-filters/-/pixi-filters-5.2.0.tgz", + "integrity": "sha512-keEjYsyAObmqWxr9zbV5XLZ4IQAL6SNKyh9V/xHDXeqx8jwC/xtEuJC6YsvGZ6REfWlvB3HgFCbmpkY2Ip0riA==", + "dev": true, + "dependencies": { + "@pixi/filter-adjustment": "5.1.1", + "@pixi/filter-advanced-bloom": "5.1.1", + "@pixi/filter-ascii": "5.1.1", + "@pixi/filter-bevel": "5.1.1", + "@pixi/filter-bloom": "5.1.1", + "@pixi/filter-bulge-pinch": "5.1.1", + "@pixi/filter-color-gradient": "5.2.0", + "@pixi/filter-color-map": "5.1.1", + "@pixi/filter-color-overlay": "5.1.1", + "@pixi/filter-color-replace": "5.1.1", + "@pixi/filter-convolution": "5.1.1", + "@pixi/filter-cross-hatch": "5.1.1", + "@pixi/filter-crt": "5.1.1", + "@pixi/filter-dot": "5.1.1", + "@pixi/filter-drop-shadow": "5.2.0", + "@pixi/filter-emboss": "5.1.1", + "@pixi/filter-glitch": "5.1.1", + "@pixi/filter-glow": "5.1.1", + "@pixi/filter-godray": "5.1.1", + "@pixi/filter-grayscale": "5.1.1", + "@pixi/filter-hsl-adjustment": "5.2.0", + "@pixi/filter-kawase-blur": "5.1.1", + "@pixi/filter-motion-blur": "5.1.1", + "@pixi/filter-multi-color-replace": "5.1.1", + "@pixi/filter-old-film": "5.1.1", + "@pixi/filter-outline": "5.2.0", + "@pixi/filter-pixelate": "5.1.1", + "@pixi/filter-radial-blur": "5.1.1", + "@pixi/filter-reflection": "5.1.1", + "@pixi/filter-rgb-split": "5.1.1", + "@pixi/filter-shockwave": "5.1.1", + "@pixi/filter-simple-lightmap": "5.1.1", + "@pixi/filter-tilt-shift": "5.2.0", + "@pixi/filter-twist": "5.1.1", + "@pixi/filter-zoom-blur": "5.1.1" + } + }, + "node_modules/pixi.js": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-7.4.2.tgz", + "integrity": "sha512-TifqgHGNofO7UCEbdZJOpUu7dUnpu4YZ0o76kfCqxDa4RS8ITc9zjECCbtalmuNXkVhSEZmBKQvE7qhHMqw/xg==", + "dev": true, + "dependencies": { + "@pixi/accessibility": "7.4.2", + "@pixi/app": "7.4.2", + "@pixi/assets": "7.4.2", + "@pixi/compressed-textures": "7.4.2", + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/events": "7.4.2", + "@pixi/extensions": "7.4.2", + "@pixi/extract": "7.4.2", + "@pixi/filter-alpha": "7.4.2", + "@pixi/filter-blur": "7.4.2", + "@pixi/filter-color-matrix": "7.4.2", + "@pixi/filter-displacement": "7.4.2", + "@pixi/filter-fxaa": "7.4.2", + "@pixi/filter-noise": "7.4.2", + "@pixi/graphics": "7.4.2", + "@pixi/mesh": "7.4.2", + "@pixi/mesh-extras": "7.4.2", + "@pixi/mixin-cache-as-bitmap": "7.4.2", + "@pixi/mixin-get-child-by-name": "7.4.2", + "@pixi/mixin-get-global-position": "7.4.2", + "@pixi/particle-container": "7.4.2", + "@pixi/prepare": "7.4.2", + "@pixi/sprite": "7.4.2", + "@pixi/sprite-animated": "7.4.2", + "@pixi/sprite-tiling": "7.4.2", + "@pixi/spritesheet": "7.4.2", + "@pixi/text": "7.4.2", + "@pixi/text-bitmap": "7.4.2", + "@pixi/text-html": "7.4.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/pixijs" + } + }, + "node_modules/pixi.js-legacy": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/pixi.js-legacy/-/pixi.js-legacy-7.4.2.tgz", + "integrity": "sha512-azGsuJvLHk/VJwt45AjlathtTNdUjLDSoaGt8JBNjzG/05cxVswFLL7GsSe83eNSe0eEuIrxiNIt3vBRNyU3AA==", + "dev": true, + "dependencies": { + "@pixi/canvas-display": "7.4.2", + "@pixi/canvas-extract": "7.4.2", + "@pixi/canvas-graphics": "7.4.2", + "@pixi/canvas-mesh": "7.4.2", + "@pixi/canvas-particle-container": "7.4.2", + "@pixi/canvas-prepare": "7.4.2", + "@pixi/canvas-renderer": "7.4.2", + "@pixi/canvas-sprite": "7.4.2", + "@pixi/canvas-sprite-tiling": "7.4.2", + "@pixi/canvas-text": "7.4.2", + "pixi.js": "7.4.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/pixijs" + } + }, "node_modules/portfinder": { "version": "1.0.32", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", @@ -340,13 +1381,19 @@ "node": ">= 0.12.0" } }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -379,15 +1426,36 @@ "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -405,6 +1473,19 @@ "node": ">=8" } }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/union": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", @@ -417,6 +1498,16 @@ "node": ">= 0.8.0" } }, + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, "node_modules/url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", @@ -437,6 +1528,627 @@ } }, "dependencies": { + "@pixi/accessibility": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-7.4.2.tgz", + "integrity": "sha512-R6VEolm8uyy1FB1F2qaLKxVbzXAFTZCF2ka8fl9lsz7We6ZfO4QpXv9ur7DvzratjCQUQVCKo0/V7xL5q1EV/g==", + "dev": true, + "requires": {} + }, + "@pixi/app": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/app/-/app-7.4.2.tgz", + "integrity": "sha512-ugkH3kOgjT8P1mTMY29yCOgEh+KuVMAn8uBxeY0aMqaUgIMysfpnFv+Aepp2CtvI9ygr22NC+OiKl+u+eEaQHw==", + "dev": true, + "requires": {} + }, + "@pixi/assets": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/assets/-/assets-7.4.2.tgz", + "integrity": "sha512-anxho59H9egZwoaEdM5aLvYyxoz6NCy3CaQIvNHD1bbGg8L16Ih0e26QSBR5fu53jl8OjT6M7s+p6n7uu4+fGA==", + "dev": true, + "requires": { + "@types/css-font-loading-module": "^0.0.12" + } + }, + "@pixi/canvas-display": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-display/-/canvas-display-7.4.2.tgz", + "integrity": "sha512-cKplWdhy+ReYRQK9ideLlKoBdTI9cB10382jWkLDiBeguM9cWSIOrmY5Bd84V0/5FOTLc/AFl4LL1wws27MVKg==", + "dev": true, + "requires": {} + }, + "@pixi/canvas-extract": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-extract/-/canvas-extract-7.4.2.tgz", + "integrity": "sha512-4rbH4sLPcPEz+OjehFUluFHN8mup9zwzedJLYc7KtqScg/npYKtVmDSaI/0cZBr9vmael+ZuCg/hjaDYTJhubg==", + "dev": true, + "requires": {} + }, + "@pixi/canvas-graphics": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-graphics/-/canvas-graphics-7.4.2.tgz", + "integrity": "sha512-1ANBcV5IietfQuABT2PUxTs4TsQP4kmpwUnkRLpZgvM5NL0UBMUZCqBhcBnbfAyV7zvpPm3i+eWhIwn6Xz/2Tg==", + "dev": true, + "requires": {} + }, + "@pixi/canvas-mesh": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-mesh/-/canvas-mesh-7.4.2.tgz", + "integrity": "sha512-CdxlV6a6H3wULwwFtURIycQT7oCtvFGDMotz3glyAj625EEx+mwSLo1mAVzs8Hl9pmetFmNKj4Z1gy890VSemw==", + "dev": true, + "requires": {} + }, + "@pixi/canvas-particle-container": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-particle-container/-/canvas-particle-container-7.4.2.tgz", + "integrity": "sha512-775rF/d7atlZTq5oODr6K3qDZ+awWkDe0QQ4BvGqPAXaWXB5doGs3j5KpTEoFD/JnbX7Q7o8ZTVGla6qsBnT6A==", + "dev": true, + "requires": {} + }, + "@pixi/canvas-prepare": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-prepare/-/canvas-prepare-7.4.2.tgz", + "integrity": "sha512-BB50HZb8ttPMkef+9BXfzeT1HS/AUkXRS0uwhwpq4L75D7XwIlIfwS0lCv2bw2KflavA8wT0qWuwlQTgHSalcA==", + "dev": true, + "requires": {} + }, + "@pixi/canvas-renderer": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-renderer/-/canvas-renderer-7.4.2.tgz", + "integrity": "sha512-5qBrr4hJ3hQYMJwxIkKCnvMxL9m7aL26h4zbacK0KH7SQ0i+RCcZS2NzvPa451FtnhquIUjwuuWQyjPFdM5R7g==", + "dev": true, + "requires": {} + }, + "@pixi/canvas-sprite": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-sprite/-/canvas-sprite-7.4.2.tgz", + "integrity": "sha512-XM6O6liAm2okHlSpUd0+muQAqLzY6EdQtfuqVP628FjHQkLJ/nb6Rg7qqtt3a3T4eyxzMBkqkzqBNBXomgf1SA==", + "dev": true, + "requires": {} + }, + "@pixi/canvas-sprite-tiling": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-sprite-tiling/-/canvas-sprite-tiling-7.4.2.tgz", + "integrity": "sha512-3/YEohGAiiVHnkOkL1wyjGBJlndXsLPG4XFn3Lpc84Cm5kbR/C6RvNvDcRckQod+jWmqQ8n4x4SjhoFBjdP+dQ==", + "dev": true, + "requires": {} + }, + "@pixi/canvas-text": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/canvas-text/-/canvas-text-7.4.2.tgz", + "integrity": "sha512-EOzYNaNcD4QWwL7LQ3v2WM4LQNXeS0aJbNOwJ1+9xiNjY53iF0w5XgSGcfGef4itym6nrwTBft1QwKyTE23zhQ==", + "dev": true, + "requires": {} + }, + "@pixi/color": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/color/-/color-7.4.2.tgz", + "integrity": "sha512-av1LOvhHsiaW8+T4n/FgnOKHby55/w7VcA1HzPIHRBtEcsmxvSCDanT1HU2LslNhrxLPzyVx18nlmalOyt5OBg==", + "dev": true, + "requires": { + "@pixi/colord": "^2.9.6" + } + }, + "@pixi/colord": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz", + "integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==", + "dev": true + }, + "@pixi/compressed-textures": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/compressed-textures/-/compressed-textures-7.4.2.tgz", + "integrity": "sha512-VJrt7el6O4ZJSWkeOGXwrhJaiLg1UBhHB3fj42VR4YloYkAxpfd9K6s6IcbcVz7n9L48APKBMgHyaB2pX2Ck/A==", + "dev": true, + "requires": {} + }, + "@pixi/constants": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-7.4.2.tgz", + "integrity": "sha512-N9vn6Wpz5WIQg7ugUg2+SdqD2u2+NM0QthE8YzLJ4tLH2Iz+/TrnPKUJzeyIqbg3sxJG5ZpGGPiacqIBpy1KyA==", + "dev": true + }, + "@pixi/core": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/core/-/core-7.4.2.tgz", + "integrity": "sha512-UbMtgSEnyCOFPzbE6ThB9qopXxbZ5GCof2ArB4FXOC5Xi/83MOIIYg5kf5M8689C5HJMhg2SrJu3xLKppF+CMg==", + "dev": true, + "requires": { + "@pixi/color": "7.4.2", + "@pixi/constants": "7.4.2", + "@pixi/extensions": "7.4.2", + "@pixi/math": "7.4.2", + "@pixi/runner": "7.4.2", + "@pixi/settings": "7.4.2", + "@pixi/ticker": "7.4.2", + "@pixi/utils": "7.4.2" + } + }, + "@pixi/display": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/display/-/display-7.4.2.tgz", + "integrity": "sha512-DaD0J7gIlNlzO0Fdlby/0OH+tB5LtCY6rgFeCBKVDnzmn8wKW3zYZRenWBSFJ0Psx6vLqXYkSIM/rcokaKviIw==", + "dev": true, + "requires": {} + }, + "@pixi/events": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/events/-/events-7.4.2.tgz", + "integrity": "sha512-Jw/w57heZjzZShIXL0bxOvKB+XgGIevyezhGtfF2ZSzQoSBWo+Fj1uE0QwKd0RIaXegZw/DhSmiMJSbNmcjifA==", + "dev": true, + "requires": {} + }, + "@pixi/extensions": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-7.4.2.tgz", + "integrity": "sha512-Hmx2+O0yZ8XIvgomHM9GZEGcy9S9Dd8flmtOK5Aa3fXs/8v7xD08+ANQpN9ZqWU2Xs+C6UBlpqlt2BWALvKKKA==", + "dev": true + }, + "@pixi/extract": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-7.4.2.tgz", + "integrity": "sha512-JOX27TRWjVEjauGBbF8PU7/g6LYXnivehdgqS5QlVDv1CNHTOrz/j3MdKcVWOhyZPbH5c9sh7lxyRxvd9AIuTQ==", + "dev": true, + "requires": {} + }, + "@pixi/filter-adjustment": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-adjustment/-/filter-adjustment-5.1.1.tgz", + "integrity": "sha512-AUHe03rmqXwV1ylAHq62t19AolPWOOYomCcL+Qycb1tf+LbM8FWpGXC6wmU1PkUrhgNc958uM9TrA9nRpplViA==", + "dev": true, + "requires": {} + }, + "@pixi/filter-advanced-bloom": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-advanced-bloom/-/filter-advanced-bloom-5.1.1.tgz", + "integrity": "sha512-C5AWmkWKvoYvJ+600qS7rC81E1X1clvrQLw4QE4IiFec5j1b07KhKE78w/BSRYMrBVa0cQ/ju0J1f7XoQYJfdQ==", + "dev": true, + "requires": { + "@pixi/filter-kawase-blur": "5.1.1" + } + }, + "@pixi/filter-alpha": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-7.4.2.tgz", + "integrity": "sha512-9OsKJ+yvY2wIcQXwswj5HQBiwNGymwmqdxfp7mo+nZSBoDmxUqvMZzE9UNJ3eUlswuNvNRO8zNOsQvwdz7WFww==", + "dev": true, + "requires": {} + }, + "@pixi/filter-ascii": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-ascii/-/filter-ascii-5.1.1.tgz", + "integrity": "sha512-uGfpd7aYZuiEzkBH8asL/2j7L/7k/jCZRURjAU9c0unWlkagwIjvUwoPMsdzPNMh2DNQzCG1FPWseSbRFjUNow==", + "dev": true, + "requires": {} + }, + "@pixi/filter-bevel": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-bevel/-/filter-bevel-5.1.1.tgz", + "integrity": "sha512-UGik6YEW+fnzVu1DV8ctbxS7eClJQzqaM2sPYI0MopaEE2mW35yjAcg9py9Kwx27BX8FniVRqtJOyKEw1A3mBA==", + "dev": true, + "requires": {} + }, + "@pixi/filter-bloom": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-bloom/-/filter-bloom-5.1.1.tgz", + "integrity": "sha512-4/i+tMxAQdgezahxsVCqzkAyBAH4TxtuY/zo1wuCJybEqkKFIzOJ76Y4R/lJevEHS9CGpCTrvjRpup0Hze8k0Q==", + "dev": true, + "requires": {} + }, + "@pixi/filter-blur": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-7.4.2.tgz", + "integrity": "sha512-gOXBbIUx6CRZP1fmsis2wLzzSsofrqmIHhbf1gIkZMIQaLsc9T7brj+PaLTTiOiyJgnvGN5j20RZnkERWWKV0Q==", + "dev": true, + "requires": {} + }, + "@pixi/filter-bulge-pinch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-bulge-pinch/-/filter-bulge-pinch-5.1.1.tgz", + "integrity": "sha512-80I3g813td7Fnzi7IJSiR3z8gZlKblk6WN+5z6WnscQROcNEpck6lgWS/Lf/IdeHB/FtUKJCbx7RzxkUhiRTvA==", + "dev": true, + "requires": {} + }, + "@pixi/filter-color-gradient": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-gradient/-/filter-color-gradient-5.2.0.tgz", + "integrity": "sha512-po3JBEKgfowqhAh2D75Ii1bhNl1gA8Agt+ESIMnSbrTVIkemno8zOVlVmP7xaf8+PKYnX7JWH5buTnnDfA7Hnw==", + "dev": true, + "requires": {} + }, + "@pixi/filter-color-map": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-map/-/filter-color-map-5.1.1.tgz", + "integrity": "sha512-WvDKvweXkg/t9t40thFlN1d/kUrWXGsxpRpFPNmkrZF6hNxdRjqgfg4wxUOev7uZwHIjcZtTfoLRKhJjF+1uqw==", + "dev": true, + "requires": {} + }, + "@pixi/filter-color-matrix": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-7.4.2.tgz", + "integrity": "sha512-ykZiR59Gvj80UKs9qm7jeUTKvn+wWk6HBVJOmJbK9jFK5juakDWp7BbH26U78Q61EWj97kI1FdfcbMkuQ7rqkA==", + "dev": true, + "requires": {} + }, + "@pixi/filter-color-overlay": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-overlay/-/filter-color-overlay-5.1.1.tgz", + "integrity": "sha512-u8xuWsUePQ1NFBqpxDAFEujW4kImFIIvlp4D2xbRZqJ0RRbeeKEW31Sk4cxl1yFJKWIq0XLyT/TAepT9iIlEXg==", + "dev": true, + "requires": {} + }, + "@pixi/filter-color-replace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-replace/-/filter-color-replace-5.1.1.tgz", + "integrity": "sha512-t+FEEnuqvlU1cKMSe8939tIGCNJsqpyc7o5BzIunMxsZsHjMQWzZtWQKls+FSdSlFyk2TWYSXWAxtj2VBzBZBg==", + "dev": true, + "requires": {} + }, + "@pixi/filter-convolution": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-convolution/-/filter-convolution-5.1.1.tgz", + "integrity": "sha512-68NNa7lXBFlRgP/ac/L/0bKk/9QvU8urh7CEeOnR9WJxjymglbAa0nM69TBlhg++Fus3t7Mz/jc/GIfPJ/VL6Q==", + "dev": true, + "requires": {} + }, + "@pixi/filter-cross-hatch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-cross-hatch/-/filter-cross-hatch-5.1.1.tgz", + "integrity": "sha512-g1hPHZYmGBpZtGojOtUOBWH6tqhtQGDo5xAp3o3gwmn2QnY087ZiYWFHF5ml+nTL62fEJ78uIpODscz4Y04e8w==", + "dev": true, + "requires": {} + }, + "@pixi/filter-crt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-crt/-/filter-crt-5.1.1.tgz", + "integrity": "sha512-w+rRbR7eTsPf18QPB68Wiyx8laC+v7fYb3hRVhnq/j6yRUJKQgg4HK5KLP9jfUJ9FJvxy4bzLSDQulvxbOMJZg==", + "dev": true, + "requires": {} + }, + "@pixi/filter-displacement": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-7.4.2.tgz", + "integrity": "sha512-QS/eWp/ivsxef3xapNeGwpPX7vrqQQeo99Fux4k5zsvplnNEsf91t6QYJLG776AbZEu/qh8VYRBA5raIVY/REw==", + "dev": true, + "requires": {} + }, + "@pixi/filter-dot": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-dot/-/filter-dot-5.1.1.tgz", + "integrity": "sha512-w3g6bumHzZgv9ktzegEWQS7OWuHH0QG76sbg/hZBy5K01dyuGAe1uUUnzVN5hZuFTD6q77T2UPlifhNI5j4ixg==", + "dev": true, + "requires": {} + }, + "@pixi/filter-drop-shadow": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@pixi/filter-drop-shadow/-/filter-drop-shadow-5.2.0.tgz", + "integrity": "sha512-cYS2KDER7cwCu0V4VNSxTHGvzmNcEXdC9j3031YBOkUAE3+p17LMS/TAt6XeMfJV7KaPuusvXy2NFgGkv3RDbw==", + "dev": true, + "requires": { + "@pixi/filter-kawase-blur": "5.1.1" + } + }, + "@pixi/filter-emboss": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-emboss/-/filter-emboss-5.1.1.tgz", + "integrity": "sha512-AoAFVzrMcCXldU+27hvJ95tcKNOVLnanlq1z838l2SzYGgso+ICbLauUz+o2PL/znudUJE6oky+I6WJzeavDsQ==", + "dev": true, + "requires": {} + }, + "@pixi/filter-fxaa": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-7.4.2.tgz", + "integrity": "sha512-U/ptJgDsfs/r8y2a6gCaiPfDu2IFAxpQ4wtfmBpz6vRhqeE4kI8yNIUx5dZbui57zlsJaW0BNacOQxHU0vLkyQ==", + "dev": true, + "requires": {} + }, + "@pixi/filter-glitch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-glitch/-/filter-glitch-5.1.1.tgz", + "integrity": "sha512-pl6jOQlzQGg6NwqCwlgioYhlwue2OSRBGByDzh6Y6Y/qxMBuzQi7W56GunhQW79Kpvj9ynDLAGxomvZsrX88qg==", + "dev": true, + "requires": {} + }, + "@pixi/filter-glow": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-glow/-/filter-glow-5.1.1.tgz", + "integrity": "sha512-CXB5wKkrLkNhflsBgMv8FcGxp1SBkvyZ67kjf3znd4pJLly632OJ5bjegzAvA5/HKz1ohaFWBjsszYeScJB4nw==", + "dev": true, + "requires": {} + }, + "@pixi/filter-godray": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-godray/-/filter-godray-5.1.1.tgz", + "integrity": "sha512-JCvNiKBF/01VyaBYzeusULg+h6kmBaYg0NruHwe/FaJMWCRIPOUBHMQIUavJR0JGE5s6bEIR8kRtdpf3RHiwqw==", + "dev": true, + "requires": {} + }, + "@pixi/filter-grayscale": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-grayscale/-/filter-grayscale-5.1.1.tgz", + "integrity": "sha512-tRyggOhTdAQlQpgH/IzjCbORICua/Gm0JkKGOcdDQOHqt4bTVvAehQ59e2+A6A1yA8pevu2L/C25qQhsPgNW9w==", + "dev": true, + "requires": {} + }, + "@pixi/filter-hsl-adjustment": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@pixi/filter-hsl-adjustment/-/filter-hsl-adjustment-5.2.0.tgz", + "integrity": "sha512-BjmiKIJQuWNqMUjVUpqkM+HaInQzl7dCvYWj8wx9lSAwjzdOCRVVLbRLdO2TwGdwGIHjR3AylMxY1HZK3P4cLA==", + "dev": true, + "requires": {} + }, + "@pixi/filter-kawase-blur": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-kawase-blur/-/filter-kawase-blur-5.1.1.tgz", + "integrity": "sha512-nPnJ1ChBFP+4pgFCwC0RJgHAJCetiHcQU3INH7zCdq88cFABmVmhN+wCKRNg4H7lF1EJjaXgFDkTrTreOD/bnw==", + "dev": true, + "requires": {} + }, + "@pixi/filter-motion-blur": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-motion-blur/-/filter-motion-blur-5.1.1.tgz", + "integrity": "sha512-I94s3pW2GutjCyXiKQ/dI4Vl9JKne+Q8QgGRn1mrk0Uwg6DDO/OQI3jqv01S+SCTU3LZqhR/p8AQyxeDmOhr2w==", + "dev": true, + "requires": {} + }, + "@pixi/filter-multi-color-replace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-multi-color-replace/-/filter-multi-color-replace-5.1.1.tgz", + "integrity": "sha512-P1shsJXEOpJGe9FdCUgCMi/nius86lBfb6cDIFM4oXdZfzuBUfWjZfUm7uofOvK7IWSrlXYrYoqp75H0XrLZ8A==", + "dev": true, + "requires": {} + }, + "@pixi/filter-noise": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-7.4.2.tgz", + "integrity": "sha512-Vy9ViBFhZEGh6xKkd3kFWErolZTwv1Y5Qb1bV7qPIYbvBECYsqzlR4uCrrjBV6KKm0PufpG/+NKC5vICZaqKzg==", + "dev": true, + "requires": {} + }, + "@pixi/filter-old-film": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-old-film/-/filter-old-film-5.1.1.tgz", + "integrity": "sha512-Jgq3eLbcQW48o+YxLe8+T4vsQrvBnKrZAHS3cu3yc2aBLaiVIj8EfYP3vpOPjkQlZ7JVRZNdELpYA6KCR+abXw==", + "dev": true, + "requires": {} + }, + "@pixi/filter-outline": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@pixi/filter-outline/-/filter-outline-5.2.0.tgz", + "integrity": "sha512-xKfAouhZNKl6A0RvxT5i+2/ean7r16dE/QswwIkbWvr2hhHlp4p9U6XsqdgUERCDxK+IZibMAumbWs4DGxOUeQ==", + "dev": true, + "requires": {} + }, + "@pixi/filter-pixelate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-pixelate/-/filter-pixelate-5.1.1.tgz", + "integrity": "sha512-qTs0Sv10aIbMFW//BPlhcFh1ByyKiVmvXfytYTTXNLrlK5DU3H3x8Pgy5Vy4lacS9VtOO69/CQ1QObBFCHnEBQ==", + "dev": true, + "requires": {} + }, + "@pixi/filter-radial-blur": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-radial-blur/-/filter-radial-blur-5.1.1.tgz", + "integrity": "sha512-q6RreUM+RO25HZaxc6ceEOSi6chadv8vrCOvupNLSY+1lvXue0KyFK6vxMcMInNdqRGYWSyJ+ql3RyHMTr93aw==", + "dev": true, + "requires": {} + }, + "@pixi/filter-reflection": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-reflection/-/filter-reflection-5.1.1.tgz", + "integrity": "sha512-ksmfrRfBqXZ+rEFuA0l2tf4k+yzTU8VcNMuhW7U+ggkWOP2OEHga+oOlJg6TnHjOEbxudCpag5Us6e9aCeKpEw==", + "dev": true, + "requires": {} + }, + "@pixi/filter-rgb-split": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-rgb-split/-/filter-rgb-split-5.1.1.tgz", + "integrity": "sha512-DEeAYoPU2lbUTeNYK8e6q89jqtLeUYSkEdFK/a9IyxYkvJP2CPk+nVXIe48v3wORUf5DdP20k6yQzqoPZyP3ww==", + "dev": true, + "requires": {} + }, + "@pixi/filter-shockwave": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-shockwave/-/filter-shockwave-5.1.1.tgz", + "integrity": "sha512-ovzOdAC2LCyWdxJC5PW97wSzHTNfjmKq4c/61cIO4sZp+9DB6n3b/6Rrad2jU346UATtM6K2XkmPY5p7SrRRXA==", + "dev": true, + "requires": {} + }, + "@pixi/filter-simple-lightmap": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-simple-lightmap/-/filter-simple-lightmap-5.1.1.tgz", + "integrity": "sha512-S3cHUgbVvUgeef93f3trdL50+162Nyqa7DBYufkGw0dPjPecXyjTH47GJzxDqQPooRwHWWUG9W5EYC+XEwlV9w==", + "dev": true, + "requires": {} + }, + "@pixi/filter-tilt-shift": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@pixi/filter-tilt-shift/-/filter-tilt-shift-5.2.0.tgz", + "integrity": "sha512-bCQE/BTGsqu8EhRMyiGg+9/FXsPBYxjfODbGTWWQNsXtbFVqZXvg1vEjUZQXvuso1v/Fh/BtZ3u+t2kFfWpBXA==", + "dev": true, + "requires": {} + }, + "@pixi/filter-twist": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-twist/-/filter-twist-5.1.1.tgz", + "integrity": "sha512-ZUxLmSHu7ZcP1OYmO9EsKgWDV/Ophf622N7YVei4opBrj/gBMuQZNvFIfnsm4l8yhqAwwzndSTVLNehq1A2ONw==", + "dev": true, + "requires": {} + }, + "@pixi/filter-zoom-blur": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-zoom-blur/-/filter-zoom-blur-5.1.1.tgz", + "integrity": "sha512-0n10xOqACC2vm9Lpsq37Y/edDvp/B7xsBdkuWxeCI7Ta7J22fsJ8IHG1iUyxgdZGa+SCPcKiFoTrYEUu5PLCpA==", + "dev": true, + "requires": {} + }, + "@pixi/graphics": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-7.4.2.tgz", + "integrity": "sha512-jH4/Tum2RqWzHGzvlwEr7HIVduoLO57Ze705N2zQPkUD57TInn5911aGUeoua7f/wK8cTLGzgB9BzSo2kTdcHw==", + "dev": true, + "requires": {} + }, + "@pixi/math": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/math/-/math-7.4.2.tgz", + "integrity": "sha512-7jHmCQoYk6e0rfSKjdNFOPl0wCcdgoraxgteXJTTHv3r0bMNx2pHD9FJ0VvocEUG7XHfj55O3+u7yItOAx0JaQ==", + "dev": true + }, + "@pixi/mesh": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-7.4.2.tgz", + "integrity": "sha512-mEkKyQvvMrYXC3pahvH5WBIKtrtB63WixRr91ANFI7zXD+ESG6Ap6XtxMCJmXDQPwBDNk7SWVMiCflYuchG7kA==", + "dev": true, + "requires": {} + }, + "@pixi/mesh-extras": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-7.4.2.tgz", + "integrity": "sha512-vNR/7wjxjs7sv9fGoKkHyU91ZAD+7EnMHBS5F3CVISlOIFxLi96NNZCB81oUIdky/90pHw40johd/4izR5zTyw==", + "dev": true, + "requires": {} + }, + "@pixi/mixin-cache-as-bitmap": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-7.4.2.tgz", + "integrity": "sha512-6dgthi2ruUT/lervSrFDQ7vXkEsHo6CxdgV7W/wNdW1dqgQlKfDvO6FhjXzyIMRLSooUf5FoeluVtfsjkUIYrw==", + "dev": true, + "requires": {} + }, + "@pixi/mixin-get-child-by-name": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-7.4.2.tgz", + "integrity": "sha512-0Cfw8JpQhsixprxiYph4Lj+B5n83Kk4ftNMXgM5xtZz+tVLz5s91qR0MqcdzwTGTJ7utVygiGmS4/3EfR/duRQ==", + "dev": true, + "requires": {} + }, + "@pixi/mixin-get-global-position": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-7.4.2.tgz", + "integrity": "sha512-LcsahbVdX4DFS2IcGfNp4KaXuu7SjAwUp/flZSGIfstyKOKb5FWFgihtqcc9ZT4coyri3gs2JbILZub/zPZj1w==", + "dev": true, + "requires": {} + }, + "@pixi/particle-container": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/particle-container/-/particle-container-7.4.2.tgz", + "integrity": "sha512-B78Qq86kt0lEa5WtB2YFIm3+PjhKfw9La9R++GBSgABl+g13s2UaZ6BIPxvY3JxWMdxPm4iPrQPFX1QWRN68mw==", + "dev": true, + "requires": {} + }, + "@pixi/prepare": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-7.4.2.tgz", + "integrity": "sha512-PugyMzReCHXUzc3so9PPJj2OdHwibpUNWyqG4mWY2UUkb6c8NAGK1AnAPiscOvLilJcv/XQSFoNhX+N1jrvJEg==", + "dev": true, + "requires": {} + }, + "@pixi/runner": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-7.4.2.tgz", + "integrity": "sha512-LPBpwym4vdyyDY5ucF4INQccaGyxztERyLTY1YN6aqJyyMmnc7iqXlIKt+a0euMBtNoLoxy6MWMvIuZj0JfFPA==", + "dev": true + }, + "@pixi/settings": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-7.4.2.tgz", + "integrity": "sha512-pMN+L6aWgvUbwhFIL/BTHKe2ShYGPZ8h9wlVBnFHMtUcJcFLMF1B3lzuvCayZRepOphs6RY0TqvnDvVb585JhQ==", + "dev": true, + "requires": { + "@pixi/constants": "7.4.2", + "@types/css-font-loading-module": "^0.0.12", + "ismobilejs": "^1.1.0" + } + }, + "@pixi/sprite": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-7.4.2.tgz", + "integrity": "sha512-Ccf/OVQsB+HQV0Fyf5lwD+jk1jeU7uSIqEjbxenNNssmEdB7S5qlkTBV2EJTHT83+T6Z9OMOHsreJZerydpjeg==", + "dev": true, + "requires": {} + }, + "@pixi/sprite-animated": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-7.4.2.tgz", + "integrity": "sha512-QPT6yxCUGOBN+98H3pyIZ1ZO6Y7BN1o0Q2IMZEsD1rNfZJrTYS3Q8VlCG5t2YlFlcB8j5iBo24bZb6FUxLOmsQ==", + "dev": true, + "requires": {} + }, + "@pixi/sprite-tiling": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-7.4.2.tgz", + "integrity": "sha512-Z8PP6ewy3nuDYL+NeEdltHAhuucVgia33uzAitvH3OqqRSx6a6YRBFbNLUM9Sx+fBO2Lk3PpV1g6QZX+NE5LOg==", + "dev": true, + "requires": {} + }, + "@pixi/spritesheet": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-7.4.2.tgz", + "integrity": "sha512-YIvHdpXW+AYp8vD0NkjJmrdnVHTZKidCnx6k8ATSuuvCT6O5Tuh2N/Ul2oDj4/QaePy0lVhyhAbZpJW00Jr7mQ==", + "dev": true, + "requires": {} + }, + "@pixi/text": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/text/-/text-7.4.2.tgz", + "integrity": "sha512-rZZWpJNsIQ8WoCWrcVg8Gi6L/PDakB941clo6dO3XjoII2ucoOUcnpe5HIkudxi2xPvS/8Bfq990gFEx50TP5A==", + "dev": true, + "requires": {} + }, + "@pixi/text-bitmap": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-7.4.2.tgz", + "integrity": "sha512-lPBMJ83JnpFVL+6ckQ8KO8QmwdPm0z9Zs/M0NgFKH2F+BcjelRNnk80NI3O0qBDYSEDQIE+cFbKoZ213kf7zwA==", + "dev": true, + "requires": {} + }, + "@pixi/text-html": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/text-html/-/text-html-7.4.2.tgz", + "integrity": "sha512-duOu8oDYeDNuyPozj2DAsQ5VZBbRiwIXy78Gn7H2pCiEAefw/Uv5jJYwdgneKME0e1tOxz1eOUGKPcI6IJnZjw==", + "dev": true, + "requires": {} + }, + "@pixi/ticker": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-7.4.2.tgz", + "integrity": "sha512-cAvxCh/KI6IW4m3tp2b+GQIf+DoSj9NNmPJmsOeEJ7LzvruG8Ps7SKI6CdjQob5WbceL1apBTDbqZ/f77hFDiQ==", + "dev": true, + "requires": { + "@pixi/extensions": "7.4.2", + "@pixi/settings": "7.4.2", + "@pixi/utils": "7.4.2" + } + }, + "@pixi/utils": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-7.4.2.tgz", + "integrity": "sha512-aU/itcyMC4TxFbmdngmak6ey4kC5c16Y5ntIYob9QnjNAfD/7GTsYIBnP6FqEAyO1eq0MjkAALxdONuay1BG3g==", + "dev": true, + "requires": { + "@pixi/color": "7.4.2", + "@pixi/constants": "7.4.2", + "@pixi/settings": "7.4.2", + "@types/earcut": "^2.1.0", + "earcut": "^2.2.4", + "eventemitter3": "^4.0.0", + "url": "^0.11.0" + } + }, + "@types/css-font-loading-module": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.12.tgz", + "integrity": "sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==", + "dev": true + }, + "@types/earcut": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", + "integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -465,13 +2177,16 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "chalk": { @@ -514,6 +2229,38 @@ "ms": "^2.1.1" } }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "dev": true + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -521,35 +2268,37 @@ "dev": true }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "get-intrinsic": "^1.1.3" } }, "has-flag": { @@ -558,12 +2307,36 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -620,6 +2393,12 @@ "safer-buffer": ">= 2.1.2 < 3.0.0" } }, + "ismobilejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz", + "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==", + "dev": true + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -633,9 +2412,9 @@ "dev": true }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "mkdirp": { @@ -654,9 +2433,9 @@ "dev": true }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true }, "opener": { @@ -665,6 +2444,106 @@ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, + "pixi-filters": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/pixi-filters/-/pixi-filters-5.2.0.tgz", + "integrity": "sha512-keEjYsyAObmqWxr9zbV5XLZ4IQAL6SNKyh9V/xHDXeqx8jwC/xtEuJC6YsvGZ6REfWlvB3HgFCbmpkY2Ip0riA==", + "dev": true, + "requires": { + "@pixi/filter-adjustment": "5.1.1", + "@pixi/filter-advanced-bloom": "5.1.1", + "@pixi/filter-ascii": "5.1.1", + "@pixi/filter-bevel": "5.1.1", + "@pixi/filter-bloom": "5.1.1", + "@pixi/filter-bulge-pinch": "5.1.1", + "@pixi/filter-color-gradient": "5.2.0", + "@pixi/filter-color-map": "5.1.1", + "@pixi/filter-color-overlay": "5.1.1", + "@pixi/filter-color-replace": "5.1.1", + "@pixi/filter-convolution": "5.1.1", + "@pixi/filter-cross-hatch": "5.1.1", + "@pixi/filter-crt": "5.1.1", + "@pixi/filter-dot": "5.1.1", + "@pixi/filter-drop-shadow": "5.2.0", + "@pixi/filter-emboss": "5.1.1", + "@pixi/filter-glitch": "5.1.1", + "@pixi/filter-glow": "5.1.1", + "@pixi/filter-godray": "5.1.1", + "@pixi/filter-grayscale": "5.1.1", + "@pixi/filter-hsl-adjustment": "5.2.0", + "@pixi/filter-kawase-blur": "5.1.1", + "@pixi/filter-motion-blur": "5.1.1", + "@pixi/filter-multi-color-replace": "5.1.1", + "@pixi/filter-old-film": "5.1.1", + "@pixi/filter-outline": "5.2.0", + "@pixi/filter-pixelate": "5.1.1", + "@pixi/filter-radial-blur": "5.1.1", + "@pixi/filter-reflection": "5.1.1", + "@pixi/filter-rgb-split": "5.1.1", + "@pixi/filter-shockwave": "5.1.1", + "@pixi/filter-simple-lightmap": "5.1.1", + "@pixi/filter-tilt-shift": "5.2.0", + "@pixi/filter-twist": "5.1.1", + "@pixi/filter-zoom-blur": "5.1.1" + } + }, + "pixi.js": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-7.4.2.tgz", + "integrity": "sha512-TifqgHGNofO7UCEbdZJOpUu7dUnpu4YZ0o76kfCqxDa4RS8ITc9zjECCbtalmuNXkVhSEZmBKQvE7qhHMqw/xg==", + "dev": true, + "requires": { + "@pixi/accessibility": "7.4.2", + "@pixi/app": "7.4.2", + "@pixi/assets": "7.4.2", + "@pixi/compressed-textures": "7.4.2", + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/events": "7.4.2", + "@pixi/extensions": "7.4.2", + "@pixi/extract": "7.4.2", + "@pixi/filter-alpha": "7.4.2", + "@pixi/filter-blur": "7.4.2", + "@pixi/filter-color-matrix": "7.4.2", + "@pixi/filter-displacement": "7.4.2", + "@pixi/filter-fxaa": "7.4.2", + "@pixi/filter-noise": "7.4.2", + "@pixi/graphics": "7.4.2", + "@pixi/mesh": "7.4.2", + "@pixi/mesh-extras": "7.4.2", + "@pixi/mixin-cache-as-bitmap": "7.4.2", + "@pixi/mixin-get-child-by-name": "7.4.2", + "@pixi/mixin-get-global-position": "7.4.2", + "@pixi/particle-container": "7.4.2", + "@pixi/prepare": "7.4.2", + "@pixi/sprite": "7.4.2", + "@pixi/sprite-animated": "7.4.2", + "@pixi/sprite-tiling": "7.4.2", + "@pixi/spritesheet": "7.4.2", + "@pixi/text": "7.4.2", + "@pixi/text-bitmap": "7.4.2", + "@pixi/text-html": "7.4.2" + } + }, + "pixi.js-legacy": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/pixi.js-legacy/-/pixi.js-legacy-7.4.2.tgz", + "integrity": "sha512-azGsuJvLHk/VJwt45AjlathtTNdUjLDSoaGt8JBNjzG/05cxVswFLL7GsSe83eNSe0eEuIrxiNIt3vBRNyU3AA==", + "dev": true, + "requires": { + "@pixi/canvas-display": "7.4.2", + "@pixi/canvas-extract": "7.4.2", + "@pixi/canvas-graphics": "7.4.2", + "@pixi/canvas-mesh": "7.4.2", + "@pixi/canvas-particle-container": "7.4.2", + "@pixi/canvas-prepare": "7.4.2", + "@pixi/canvas-renderer": "7.4.2", + "@pixi/canvas-sprite": "7.4.2", + "@pixi/canvas-sprite-tiling": "7.4.2", + "@pixi/canvas-text": "7.4.2", + "pixi.js": "7.4.2" + } + }, "portfinder": { "version": "1.0.32", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", @@ -676,13 +2555,19 @@ "mkdirp": "^0.5.6" } }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, "requires-port": { @@ -709,15 +2594,30 @@ "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", "dev": true }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "supports-color": { @@ -729,6 +2629,12 @@ "has-flag": "^4.0.0" } }, + "typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true + }, "union": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", @@ -738,6 +2644,16 @@ "qs": "^6.4.0" } }, + "url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dev": true, + "requires": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, "url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", diff --git a/package.json b/package.json index 772113d8a..8d472699a 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,21 @@ { "name": "kinkiest-dungeon", "version": "1.0.0", - "description": "This is the official git repo for Kinky Dungeon. What you will find here is a stripped-down version of the original Bondage Club repo preserving only the components needed to make Kinky Dungeon work.\r As a plus, the code for the game itself is almost identical, meaning that this game will run if pasted into the official BC", + "description": "This is the official git repo for Kinky Dungeon.", "main": "index.html", "scripts": { + "build": "tsc", "serve": "http-server" }, "author": "Ada18980", "license": "All Rights Reserved", "private": true, "devDependencies": { - "http-server": "^14.1.1" + "@typescript/lib-dom": "npm:@types/web@^0.0.151", + "http-server": "^14.1.1", + "pixi-filters": "5.2.0", + "pixi.js": "^7.2.1", + "pixi.js-legacy": "^7.2.1", + "typescript": "^5.6.0" } } diff --git a/style.css b/style.css index 9ca058103..cb0a0e92b 100644 --- a/style.css +++ b/style.css @@ -34,15 +34,6 @@ textarea { display: none; /*hide original SELECT element:*/ } -.select-selected { - background-color: white; - color: black; - background-image: url('../Icons/Dropdown.png'); - background-repeat: no-repeat, repeat; - background-position: right .7em top 50%, 0 0; - background-size: .65em auto, 100%; -} - /*style the items (options), including the selected item:*/ .select-items div,.select-selected { color: black; @@ -74,160 +65,3 @@ input[type=text]:invalid { background-color: #fbb; box-shadow: 0 0 3px 2px #c22; } - -/* Range Inputs - WebKit */ - -input[type=range] { - -webkit-appearance: none; - width: 100%; - background-color: transparent; - cursor: pointer; - /* Increases the hitbox of the slider to make it easier to select */ - padding: 1% 0; - margin: -1% 0; -} - -input[type=range]:focus { - outline: none; -} - -input[type=range].Vertical { - transform: rotate(270deg); -} - -input[type=range]::-webkit-slider-runnable-track { - width: 100%; - height: 25%; - cursor: pointer; - background-color: #fff; - border-radius: 3px; - border: 1px solid rgba(128, 128, 128, 0.25); -} - -input[type=range]::-webkit-slider-thumb { - border: 1px solid rgba(0, 0, 0, 0.5); - box-shadow: 1px 1px 8px -2px rgba(0, 0, 0, 0.5); - height: 1em; - width: 1em; - border-radius: 50%; - cursor: pointer; - -webkit-appearance: none; - margin-top: -0.4em; - background-color: #ccc; -} - -input[type=range][data-thumb]::-webkit-slider-thumb { - background-color: transparent; - box-shadow: none; - background-position: center; - background-size: cover; - border: 0; - font-size: 1.5em; - border-radius: 0; -} - -input[type=range][data-thumb].Vertical::-webkit-slider-thumb { - transform: rotate(90deg); -} - -input[type=range][data-thumb=lock]::-webkit-slider-thumb { - background-image: url("../Assets/Female3DCG/ItemMisc/Preview/MetalPadlock.png"); - width: 0.5em; -} - -input[type=range][data-thumb=blindfold]::-webkit-slider-thumb { - background-image: url("../Assets/Female3DCG/ItemHead/Preview/StuddedBlindfold.png"); -} - -input[type=range][data-thumb=lightbulb]::-webkit-slider-thumb { - background-image: url("../Icons/Lightbulb.png"); - width: 0.6em; -} - -input[type=range][data-thumb=player]::-webkit-slider-thumb { - background-image: url("../Icons/Player.png"); - width: 0.8em; -} - -input[type=range][data-thumb=rope]::-webkit-slider-thumb { - background-image: url("../Icons/Rope.png"); - width: 0.8em; -} - -/* Range Inputs - Firefox */ - -input[type=range]::-moz-range-track { - width: 100%; - height: 25%; - cursor: pointer; - background-color: #fff; - border: 1px solid rgba(128, 128, 128, 0.25); - border-radius: 3px; -} - -input[type=range]::-moz-range-thumb { - border: 1px solid rgba(0, 0, 0, 0.5); - box-shadow: 1px 1px 8px -2px rgba(0, 0, 0, 0.5); - height: 1em; - width: 1em; - border-radius: 50%; - background-color: #ccc; - cursor: pointer; -} - -input[type=range][data-thumb]::-moz-range-thumb { - background-color: transparent; - box-shadow: none; - background-position: center; - background-size: cover; - border: 0; - font-size: 1.5em; - border-radius: 0; -} - -input[type=range][data-thumb].Vertical::-moz-range-thumb { - transform: rotate(90deg); -} - -input[type=range][data-thumb=lock]::-moz-range-thumb { - background-image: url("../Assets/Female3DCG/ItemMisc/Preview/MetalPadlock.png"); - width: 0.5em; -} - -input[type=range][data-thumb=blindfold]::-moz-range-thumb { - background-image: url("../Assets/Female3DCG/ItemHead/Preview/StuddedBlindfold.png"); -} - -input[type=range][data-thumb=lightbulb]::-moz-range-thumb { - background-image: url("../Icons/Lightbulb.png"); - width: 0.6em; -} - -input[type=range][data-thumb=player]::-moz-range-thumb { - background-image: url("../Icons/Player.png"); - width: 0.8em; -} - -input[type=range][data-thumb=rope]::-moz-range-thumb { - background-image: url("../Icons/Rope.png"); - width: 0.8em; -} - -/* Custom fonts */ -@font-face { - font-family: 'Calligraffitti'; - src: url('../Fonts/Calligraffitti/Calligraffitti-Regular.ttf'); -} - -@font-face { - font-family: 'Saira Stencil One'; - src: url('../Fonts/Saira Stencil One/SairaStencilOne-Regular.ttf'); -} -@font-face { - font-family: 'Pacifico'; - src: url('../Fonts/Pacifico/Pacifico-Regular.ttf'); -} -@font-face { - font-family: 'Satisfy'; - src: url('../Fonts/Satisfy/Satisfy-Regular.ttf'); -} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..d2ef9f665 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,257 @@ +{ + "files": [ + // Library .d.ts files + "Scripts/lib/LZString.d.ts", + + // BC and KD .d.ts files + "Scripts/Typedef.d.ts", + "Game/src/base/KDTypeDefs.ts", + "Data/ModelTypes.ts", + + // Core js (or ts) files. + // We have to use a `files` declaration because order is important here + // (both due to BC design, and the fact KD monkey-patches parts of BC) + "Scripts/Patch.ts", + "Scripts/Common.ts", + "Scripts/Mouse.ts", + "Scripts/Drawing.ts", + "Scripts/Character.ts", + "Scripts/CharacterName.ts", + "Scripts/Text.ts", + "Scripts/Inventory.ts", + "Scripts/Element.ts", + "Scripts/Translation.ts", + "Scripts/Appearance.ts", + "Game/src/base/KDModUtils.ts", + "Game/src/base/KDShaders.ts", + "Game/src/player/KDAutoStruggle.ts", + "Game/src/player/KDClasses.ts", + "Game/src/base/KDParticles.ts", + "Game/src/restraint/KDLocks.ts", + "Game/src/item/KDModifier.ts", + "Game/src/item/KDHex.ts", + "Game/src/item/KDEnchant.ts", + "Game/src/enemy/KDAIList.ts", + "Game/src/enemy/KDLoadoutList.ts", + "Game/src/restraint/KDApplyVariants.ts", + "Game/src/item/KDInventoryActions.ts", + "Game/src/player/KinkyDungeonStats.ts", + "Game/src/player/KDTraining.ts", + "Game/src/map/KinkyDungeonEditorTiles.ts", + "Game/src/map/KinkyDungeonEditor.ts", + "Game/src/map/KinkyDungeonEditorGen.ts", + "Game/src/base/KinkyDungeonErrors.ts", + "Game/src/base/KinkyDungeon.ts", + "Game/src/base/KDRender.ts", + "Game/src/base/KinkyDungeonGame.ts", + "Game/src/player/KinkyDungeonVibe.ts", + "Game/src/effect/KinkyDungeonBuffsList.ts", + "Game/src/map/KinkyDungeonAlt.ts", + "Game/src/map/Lair/DragonLair.ts", + "Game/src/enemy/KDCreationScripts.ts", + "Game/src/map/KDLairs.ts", + "Game/src/map/KDLairEntrances.ts", + "Game/src/map/KDRegiments.ts", + "Game/src/base/KinkyDungeonBones.ts", + "Game/src/map/KinkyDungeonMapMods.ts", + "Game/src/map/KDSideRooms.ts", + "Game/src/map/KinkyDungeonBoss.ts", + "Game/src/map/KDMinimapLabels.ts", + "Game/src/player/KinkyDungeonPerks.ts", + "Game/src/map/KinkyDungeonParams.ts", + "Game/src/base/KinkyDungeonVision.ts", + "Game/src/faction/KinkyDungeonQuest.ts", + "Game/src/item/KinkyDungeonLoot.ts", + "Game/src/enemy/KinkyDungeonEnemies.ts", + "Game/src/enemy/KinkyDungeonPersonality.ts", + "Game/src/enemy/KinkyDungeonEnemiesList.ts", + "Game/src/enemy/KinkyDungeonEnemyEventList.ts", + "Game/src/enemy/KinkyDungeonEnemyTeaseAttacks.ts", + "Game/src/map/KinkyDungeonEscapeList.ts", + "Game/src/item/KDCurse.ts", + "Game/src/restraint/KinkyDungeonRestraints.ts", + "Game/src/restraint/KDTethers.ts", + "Game/src/magic/KDAoEList.ts", + "Game/src/fight/KinkyDungeonFight.ts", + "Game/src/fight/KinkyDungeonWeaponList.ts", + "Game/src/base/KinkyDungeonInput.ts", + "Game/src/base/KinkyDungeonHUD.ts", + "Game/src/base/KinkyDungeonDraw.ts", + "Game/src/restraint/KinkyDungeonFurniture.ts", + "Game/src/magic/KinkyDungeonMagic.ts", + "Game/src/magic/KinkyDungeonMagicCode.ts", + "Game/src/magic/KinkyDungeonMagicList.ts", + "Game/src/magic/KinkyDungeonPlayerEffects.ts", + "Game/src/map/KinkyDungeonShrine.ts", + "Game/src/map/KinkyDungeonObject.ts", + "Game/src/item/KinkyDungeonItem.ts", + "Game/src/player/KinkyDungeonDress.ts", + "Game/src/map/KDMap.ts", + "Game/src/player/KDExpressions.ts", + "Game/src/enemy/KDPersistence.ts", + "Game/src/enemy/KDPersistentSpawnAI.ts", + "Game/src/enemy/KDPersistentWanderAI.ts", + "Game/src/enemy/KDPersistentScriptList.ts", + "Game/src/map/KinkyDungeonEffectTiles.ts", + "Game/src/player/KinkyDungeonDressList.ts", + "Game/src/item/KinkyDungeonConsumables.ts", + "Game/src/item/KinkyDungeonConsumablesList.ts", + "Game/src/item/KinkyDungeonInventory.ts", + "Game/src/dialogue/KinkyDungeonLore.ts", + "Game/src/dialogue/KinkyDungeonLoreList.ts", + "Game/src/faction/KinkyDungeonReputation.ts", + "Game/src/map/KinkyDungeonTraps.ts", + "Game/src/map/KinkyDungeonTiles.ts", + "Game/src/map/KinkyDungeonTilesList.ts", + "Game/src/enemy/KinkyDungeonPathfinding.ts", + "Game/src/effect/KinkyDungeonBuffs.ts", + "Game/src/effect/KinkyDungeonEvents.ts", + "Game/src/enemy/KinkyDungeonSpawns.ts", + "Game/src/prison/KinkyDungeonJail.ts", + "Game/src/prison/KDPrison.ts", + "Game/src/prison/KDPrisonList.ts", + "Game/src/prison/prisontypes/DollStorage.ts", + "Game/src/prison/prisontypes/HighSec.ts", + "Game/src/map/KinkyDungeonSetpiece.ts", + "Game/src/dialogue/KinkyDungeonDialogue.ts", + "Game/src/dialogue/KinkyDungeonDialogueTriggers.ts", + "Game/src/dialogue/KinkyDungeonDialogueList.ts", + "Game/src/dialogue/KDSkillCheck.ts", + "Game/src/faction/KinkyDungeonFactions.ts", + "Game/src/faction/KinkyDungeonFactionsList.ts", + "Game/src/player/KinkyDungeonNeeds.ts", + "Game/src/prison/KinkyDungeonJailList.ts", + "Game/src/KinkyDungeonTests.ts", + "Game/src/item/KinkyDungeonLootList.ts", + "Game/src/base/KinkyDungeonMusic.ts", + "Game/src/enemy/KinkyDungeonNames.ts", + "Game/src/player/KDDelayedActions.ts", + "Game/src/enemy/KDCommander.ts", + "Game/src/map/KDJourney.ts", + "Game/src/map/KDContainers.ts", + "Game/src/restraint/KinkyDungeonRestraintsList.ts", + "Game/src/collection/KinkyDungeonCollection.ts", + "Game/src/collection/KDCollectionWander.ts", + "Game/src/collection/KDCollectionWanderList.ts", + "Game/src/base/KDCustomCancel.ts", + "Game/src/collection/KDManagement.ts", + "Game/src/collection/KDWarden.ts", + "Game/src/collection/KDRecycler.ts", + "Game/src/collection/KDRecyclerList.ts", + "Game/src/collection/KDCuddleLounge.ts", + "Game/src/collection/KDFacilities.ts", + "Game/src/collection/KDFacilitiesList.ts", + "Game/src/collection/NPCRestrain.ts", + "Game/src/collection/NPCAutoBind.ts", + "Game/src/collection/KDFacilityQuick.ts", + "Game/src/collection/NPCRelease.ts", + "Game/src/collection/NPCRestrainList.ts", + "Game/src/collection/NPCRestrainGenericList.ts", + "Scripts/KDMods.ts", + "Scripts/Main.ts", + "Data/Filters.ts", + "Data/Preload.ts", + "Data/Utils.ts", + "Data/Defs.ts", + "Data/Poses.ts", + "Data/Models.ts", + "Data/ModelListHair.ts", + "Data/ModelListHair2.ts", + "Data/ModelListBase.ts", + "Data/ModelListFace.ts", + "Data/ModelList_Bra.ts", + "Data/ModelList_Panties.ts", + "Data/ModelList_Cosplay.ts", + "Data/ModelList_Pants.ts", + "Data/ModelList.ts", + "Data/ModelList_Kigu.ts", + "Data/ModelList_Leotards.ts", + "Data/ModelList_Opera.ts", + "Data/ModelList_Sailor.ts", + "Data/ModelList_Dress.ts", + "Data/ModelList_Cloak.ts", + "Data/ModelList_Hood.ts", + "Data/ModelList_Yukata.ts", + "Data/ModelList_Mittens.ts", + "Data/ModelList_Elf.ts", + "Data/ModelList_Restraints.ts", + "Data/ModelList_Rope.ts", + "Data/ModelList_Ribbon.ts", + "Data/ModelList_Cuffs.ts", + "Data/ModelList_Pony.ts", + "Data/ModelList_Corset.ts", + "Data/ModelList_Skirt.ts", + "Data/ModelList_Wolf.ts", + "Data/ModelList_LeatherCuffs.ts", + "Data/ModelList_KittyPetCuffs.ts", + "Data/ModelList_KittyPawCuffs.ts", + "Data/ModelList_DivineCuffs.ts", + "Data/ModelList_DivineCuffsClean.ts", + "Data/ModelList_SteelCuffs.ts", + "Data/ModelList_CyberCuffs.ts", + "Data/ModelList_CrystalCuffs.ts", + "Data/ModelList_KittyPet.ts", + "Data/ModelList_KittyPetsuit.ts", + "Data/ModelList_Slime.ts", + "Data/ModelList_Rubber.ts", + "Data/ModelList_TapeMed.ts", + "Data/ModelList_TapeHeavy.ts", + "Data/ModelList_TapeLight.ts", + "Data/ModelList_Chastity.ts", + "Data/ModelList_Armbinders.ts", + "Data/ModelList_Heavy.ts", + "Data/ModelList_Blindfolds.ts", + "Data/ModelList_Heels.ts", + "Data/ModelList_CyberHeels.ts", + "Data/ModelList_Handcuffs.ts", + "Data/ModelList_Harness.ts", + "Data/ModelList_Ninja.ts", + "Data/ModelList_Gags.ts", + "Data/ModelList_DivineGag.ts", + "Data/ModelList_Belts.ts", + "Data/ModelList_Shadow.ts", + "Data/ModelList_Furniture.ts", + "Data/ModelList_Collars.ts", + "Data/ModelList_Visors.ts", + "Data/ModelList_Petsuit.ts", + "Data/ModelList_Toys.ts", + "Data/ModelList_SMoonlight.ts", + "Data/ModelList_PureWind.ts", + "Data/ModelList_Bubble.ts", + "Data/ModelList_RobeOfChastity.ts", + "Data/ModelList_Spats.ts", + "Data/ModelList_Gothic.ts", + "Data/ModelList_MaidKnightLight.ts", + "Data/ModelList_MaidKnightHeavy.ts", + "Data/ModelList_Uniform.ts", + "Data/ModelStylesList.ts", + "Data/ModelStylesFace.ts", + "Data/ModelStylesHair.ts", + "Data/ModelStylesBody.ts", + "Data/ModelStylesCosplay.ts", + "Data/ModelDresses.ts", + "Game/src/player/KDWardrobe.ts", + "Game/src/restraint/KDGenRestraintUniform.ts", + "Game/src/restraint/KDBindTypeTagLookupList.ts", + "Game/src/enemy/KDPathConditions.ts", + "Game/src/enemy/KDLeashCondition.ts", + "Game/src/map/KDShop.ts" + ], + "compilerOptions": { + "target": "es2020", + "sourceMap": true, + "inlineSources": true, + "outFile": "./out/main.js", + "allowJs": true, + "checkJs": true, + "removeComments": true, + "typeRoots": [ + "./node_modules/@types", + "./node_modules/@pixi", + ], + + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "lib": ["DOM", "ES2020"], + } +}